[bornagain] 01/04: Imported Upstream version 1.7.0

Mika Pflüger mikapfl-guest at moszumanska.debian.org
Mon Nov 21 10:21:46 UTC 2016


This is an automated email from the git hooks/post-receive script.

mikapfl-guest pushed a commit to branch debian
in repository bornagain.

commit 3829ef5a88b685d654d7200fad95eaa09c2423c6
Author: Mika Pflüger <mika at mikapflueger.de>
Date:   Fri Nov 18 18:01:09 2016 +0100

    Imported Upstream version 1.7.0
---
 .appveyor.yml                                      |     29 +
 .github/ISSUE_TEMPLATE.md                          |      9 +
 .travis.yml                                        |     28 +
 .travis/linux/Dockerfile                           |      4 +
 .travis/linux/build.sh                             |      3 +
 .travis/linux/install.sh                           |      3 +
 .travis/linux/test.sh                              |      2 +
 .travis/osx/build.sh                               |      5 +
 .travis/osx/install.sh                             |      3 +
 .travis/osx/test.sh                                |      5 +
 CHANGELOG                                          |    783 +
 CMakeLists.txt                                     |    102 +
 COPYING                                            |    674 +
 Core/Aggregate/FTDecayFunctions.cpp                |    210 +
 Core/Aggregate/FTDecayFunctions.h                  |    196 +
 Core/Aggregate/FTDistributions1D.cpp               |    120 +
 Core/Aggregate/FTDistributions1D.h                 |    134 +
 Core/Aggregate/FTDistributions2D.cpp               |    134 +
 Core/Aggregate/FTDistributions2D.h                 |    158 +
 Core/Aggregate/FormFactorWrapper.cpp               |     24 +
 Core/Aggregate/FormFactorWrapper.h                 |     36 +
 Core/Aggregate/IInterferenceFunction.h             |     45 +
 Core/Aggregate/ILayout.h                           |     97 +
 Core/Aggregate/InterferenceFunction1DLattice.cpp   |     94 +
 Core/Aggregate/InterferenceFunction1DLattice.h     |     56 +
 Core/Aggregate/InterferenceFunction2DLattice.cpp   |    224 +
 Core/Aggregate/InterferenceFunction2DLattice.h     |     89 +
 .../InterferenceFunction2DParaCrystal.cpp          |    260 +
 Core/Aggregate/InterferenceFunction2DParaCrystal.h |     96 +
 Core/Aggregate/InterferenceFunctionNone.cpp        |     25 +
 Core/Aggregate/InterferenceFunctionNone.h          |     36 +
 .../InterferenceFunctionRadialParaCrystal.cpp      |    123 +
 .../InterferenceFunctionRadialParaCrystal.h        |     66 +
 Core/Aggregate/ParticleLayout.cpp                  |    211 +
 Core/Aggregate/ParticleLayout.h                    |     79 +
 Core/Basics/BornAgainNamespace.h                   |    212 +
 Core/Basics/Complex.h                              |     29 +
 Core/Basics/Exceptions.cpp                         |    116 +
 Core/Basics/Exceptions.h                           |    133 +
 Core/Basics/ICloneable.h                           |     37 +
 Core/Basics/INamed.h                               |     39 +
 Core/Basics/INoncopyable.h                         |     37 +
 Core/Basics/IShareable.h                           |     31 +
 Core/Basics/ISingleton.h                           |     61 +
 Core/Basics/Macros.h                               |     59 +
 Core/Basics/MathConstants.h                        |     52 +
 Core/Binning/Bin.cpp                               |     43 +
 Core/Binning/Bin.h                                 |     69 +
 Core/Binning/ConstKBinAxis.cpp                     |     97 +
 Core/Binning/ConstKBinAxis.h                       |     50 +
 Core/Binning/CustomBinAxis.cpp                     |     93 +
 Core/Binning/CustomBinAxis.h                       |     57 +
 Core/Binning/FixedBinAxis.cpp                      |    118 +
 Core/Binning/FixedBinAxis.h                        |     70 +
 Core/Binning/IAxis.cpp                             |     58 +
 Core/Binning/IAxis.h                               |    104 +
 Core/Binning/IPixelMap.h                           |     36 +
 Core/Binning/SimulationElement.cpp                 |    159 +
 Core/Binning/SimulationElement.h                   |    118 +
 Core/Binning/VariableBinAxis.cpp                   |    182 +
 Core/Binning/VariableBinAxis.h                     |     70 +
 Core/CMakeLists.txt                                |    259 +
 Core/Computation/ComputationOutcome.h              |     47 +
 Core/Computation/DecoratedLayerComputation.cpp     |     62 +
 Core/Computation/DecoratedLayerComputation.h       |     55 +
 Core/Computation/InnerCounter.cpp                  |     27 +
 Core/Computation/InnerCounter.h                    |     35 +
 Core/Computation/MainComputation.cpp               |    163 +
 Core/Computation/MainComputation.h                 |     75 +
 Core/Computation/ProgressHandler.cpp               |     50 +
 Core/Computation/ProgressHandler.h                 |     59 +
 Core/Computation/RoughMultiLayerComputation.cpp    |    172 +
 Core/Computation/RoughMultiLayerComputation.h      |     56 +
 Core/Computation/SpecularComputation.cpp           |     51 +
 Core/Computation/SpecularComputation.h             |     49 +
 .../FormFactorDecoratorDebyeWaller.cpp             |     62 +
 .../FormFactorDecoratorDebyeWaller.h               |     50 +
 .../FormFactorDecoratorFactor.cpp                  |     34 +
 .../FormFactorDecoratorFactor.h                    |     43 +
 .../FormFactorDecoratorMaterial.cpp                |     85 +
 .../FormFactorDecoratorMaterial.h                  |     59 +
 .../FormFactorDecoratorPositionFactor.cpp          |     45 +
 .../FormFactorDecoratorPositionFactor.h            |     46 +
 .../FormFactorDecoratorRotation.cpp                |     62 +
 .../FormFactorDecoratorRotation.h                  |     48 +
 Core/DecoratedFormFactor/IFormFactorDecorator.h    |     50 +
 Core/Export/ExportToPython.cpp                     |    881 +
 Core/Export/ExportToPython.h                       |     70 +
 Core/Export/PythonFormatting.cpp                   |    232 +
 Core/Export/PythonFormatting.h                     |     52 +
 Core/Export/SampleLabelHandler.cpp                 |    189 +
 Core/Export/SampleLabelHandler.h                   |    185 +
 Core/Fitting/AdjustMinimizerStrategy.cpp           |     76 +
 Core/Fitting/AdjustMinimizerStrategy.h             |     52 +
 Core/Fitting/FitObject.cpp                         |    150 +
 Core/Fitting/FitObject.h                           |     89 +
 Core/Fitting/FitParameterLinked.cpp                |     80 +
 Core/Fitting/FitParameterLinked.h                  |     54 +
 Core/Fitting/FitStrategyAdjustParameters.cpp       |     77 +
 Core/Fitting/FitStrategyAdjustParameters.h         |    160 +
 Core/Fitting/FitSuite.cpp                          |    192 +
 Core/Fitting/FitSuite.h                            |    161 +
 Core/Fitting/FitSuiteFunctions.cpp                 |    149 +
 Core/Fitting/FitSuiteFunctions.h                   |     92 +
 Core/Fitting/FitSuiteImpl.cpp                      |    173 +
 Core/Fitting/FitSuiteImpl.h                        |    123 +
 Core/Fitting/FitSuiteObjects.cpp                   |    168 +
 Core/Fitting/FitSuiteObjects.h                     |     96 +
 Core/Fitting/FitSuitePrintObserver.cpp             |     83 +
 Core/Fitting/FitSuitePrintObserver.h               |     45 +
 Core/Fitting/FitSuiteStrategies.cpp                |     65 +
 Core/Fitting/FitSuiteStrategies.h                  |     54 +
 Core/Fitting/IFitObserver.cpp                      |     61 +
 Core/Fitting/IFitObserver.h                        |     45 +
 Core/Fitting/IFitStrategy.cpp                      |     65 +
 Core/Fitting/IFitStrategy.h                        |     69 +
 Core/Fitting/IObserver.cpp                         |     27 +
 Core/Fitting/IObserver.h                           |     59 +
 Core/HardParticle/FormFactorAnisoPyramid.cpp       |     89 +
 Core/HardParticle/FormFactorAnisoPyramid.h         |     50 +
 Core/HardParticle/FormFactorBox.cpp                |     39 +
 Core/HardParticle/FormFactorBox.h                  |     48 +
 Core/HardParticle/FormFactorCone.cpp               |     73 +
 Core/HardParticle/FormFactorCone.h                 |     59 +
 Core/HardParticle/FormFactorCone6.cpp              |     90 +
 Core/HardParticle/FormFactorCone6.h                |     47 +
 Core/HardParticle/FormFactorCuboctahedron.cpp      |    101 +
 Core/HardParticle/FormFactorCuboctahedron.h        |     50 +
 Core/HardParticle/FormFactorCylinder.cpp           |     42 +
 Core/HardParticle/FormFactorCylinder.h             |     45 +
 Core/HardParticle/FormFactorDodecahedron.cpp       |     75 +
 Core/HardParticle/FormFactorDodecahedron.h         |     45 +
 .../HardParticle/FormFactorEllipsoidalCylinder.cpp |     51 +
 Core/HardParticle/FormFactorEllipsoidalCylinder.h  |     47 +
 Core/HardParticle/FormFactorFullSphere.cpp         |     49 +
 Core/HardParticle/FormFactorFullSphere.h           |     43 +
 Core/HardParticle/FormFactorFullSpheroid.cpp       |     58 +
 Core/HardParticle/FormFactorFullSpheroid.h         |     53 +
 Core/HardParticle/FormFactorHemiEllipsoid.cpp      |     70 +
 Core/HardParticle/FormFactorHemiEllipsoid.h        |     57 +
 Core/HardParticle/FormFactorIcosahedron.cpp        |     77 +
 Core/HardParticle/FormFactorIcosahedron.h          |     43 +
 Core/HardParticle/FormFactorLongBoxGauss.cpp       |     38 +
 Core/HardParticle/FormFactorLongBoxGauss.h         |     50 +
 Core/HardParticle/FormFactorLongBoxLorentz.cpp     |     38 +
 Core/HardParticle/FormFactorLongBoxLorentz.h       |     51 +
 Core/HardParticle/FormFactorLongRipple1Gauss.cpp   |     84 +
 Core/HardParticle/FormFactorLongRipple1Gauss.h     |     60 +
 Core/HardParticle/FormFactorLongRipple1Lorentz.cpp |     84 +
 Core/HardParticle/FormFactorLongRipple1Lorentz.h   |     60 +
 Core/HardParticle/FormFactorLongRipple2Gauss.cpp   |    103 +
 Core/HardParticle/FormFactorLongRipple2Gauss.h     |     58 +
 Core/HardParticle/FormFactorLongRipple2Lorentz.cpp |    106 +
 Core/HardParticle/FormFactorLongRipple2Lorentz.h   |     52 +
 Core/HardParticle/FormFactorPolyhedron.cpp         |    646 +
 Core/HardParticle/FormFactorPolyhedron.h           |    164 +
 Core/HardParticle/FormFactorPrism3.cpp             |     41 +
 Core/HardParticle/FormFactorPrism3.h               |     41 +
 Core/HardParticle/FormFactorPrism6.cpp             |     43 +
 Core/HardParticle/FormFactorPrism6.h               |     41 +
 Core/HardParticle/FormFactorPyramid.cpp            |     82 +
 Core/HardParticle/FormFactorPyramid.h              |     48 +
 Core/HardParticle/FormFactorRipple1.cpp            |     84 +
 Core/HardParticle/FormFactorRipple1.h              |     62 +
 Core/HardParticle/FormFactorRipple2.cpp            |     97 +
 Core/HardParticle/FormFactorRipple2.h              |     56 +
 Core/HardParticle/FormFactorTetrahedron.cpp        |     85 +
 Core/HardParticle/FormFactorTetrahedron.h          |     47 +
 Core/HardParticle/FormFactorTriangle.cpp           |     40 +
 Core/HardParticle/FormFactorTriangle.h             |     39 +
 Core/HardParticle/FormFactorTrivial.cpp            |     24 +
 Core/HardParticle/FormFactorTrivial.h              |     38 +
 Core/HardParticle/FormFactorTruncatedCube.cpp      |     92 +
 Core/HardParticle/FormFactorTruncatedCube.h        |     45 +
 Core/HardParticle/FormFactorTruncatedSphere.cpp    |     72 +
 Core/HardParticle/FormFactorTruncatedSphere.h      |     54 +
 Core/HardParticle/FormFactorTruncatedSpheroid.cpp  |     75 +
 Core/HardParticle/FormFactorTruncatedSpheroid.h    |     57 +
 Core/InputOutput/IntensityDataIOFactory.cpp        |     46 +
 Core/InputOutput/IntensityDataIOFactory.h          |     63 +
 Core/InputOutput/OutputDataIOHelper.cpp            |    223 +
 Core/InputOutput/OutputDataIOHelper.h              |     76 +
 Core/InputOutput/OutputDataReadFactory.cpp         |     42 +
 Core/InputOutput/OutputDataReadFactory.h           |     35 +
 Core/InputOutput/OutputDataReadStrategy.cpp        |    101 +
 Core/InputOutput/OutputDataReadStrategy.h          |     73 +
 Core/InputOutput/OutputDataReader.cpp              |     68 +
 Core/InputOutput/OutputDataReader.h                |     45 +
 Core/InputOutput/OutputDataWriteFactory.cpp        |     50 +
 Core/InputOutput/OutputDataWriteFactory.h          |     35 +
 Core/InputOutput/OutputDataWriteStrategy.cpp       |    113 +
 Core/InputOutput/OutputDataWriteStrategy.h         |     74 +
 Core/InputOutput/OutputDataWriter.cpp              |     63 +
 Core/InputOutput/OutputDataWriter.h                |     43 +
 Core/InputOutput/TiffHandler.cpp                   |    210 +
 Core/InputOutput/TiffHandler.h                     |     58 +
 Core/InputOutput/boost_streams.h                   |     35 +
 Core/Instrument/Beam.cpp                           |    113 +
 Core/Instrument/Beam.h                             |     81 +
 Core/Instrument/ChiSquaredModule.cpp               |     45 +
 Core/Instrument/ChiSquaredModule.h                 |     38 +
 Core/Instrument/ConvolutionDetectorResolution.cpp  |    235 +
 Core/Instrument/ConvolutionDetectorResolution.h    |     73 +
 Core/Instrument/Convolve.cpp                       |    365 +
 Core/Instrument/Convolve.h                         |    126 +
 Core/Instrument/CumulativeValue.cpp                |     51 +
 Core/Instrument/CumulativeValue.h                  |     51 +
 Core/Instrument/DetectionProperties.cpp            |     74 +
 Core/Instrument/DetectionProperties.h              |     51 +
 Core/Instrument/DetectorFunctions.cpp              |     95 +
 Core/Instrument/DetectorFunctions.h                |     59 +
 Core/Instrument/DetectorMask.cpp                   |    152 +
 Core/Instrument/DetectorMask.h                     |     74 +
 Core/Instrument/FitElement.cpp                     |     70 +
 Core/Instrument/FitElement.h                       |     54 +
 Core/Instrument/Histogram1D.cpp                    |    105 +
 Core/Instrument/Histogram1D.h                      |     77 +
 Core/Instrument/Histogram2D.cpp                    |    191 +
 Core/Instrument/Histogram2D.h                      |    120 +
 Core/Instrument/IChiSquaredModule.cpp              |     65 +
 Core/Instrument/IChiSquaredModule.h                |     72 +
 Core/Instrument/IDetector2D.cpp                    |    374 +
 Core/Instrument/IDetector2D.h                      |    195 +
 Core/Instrument/IDetectorResolution.h              |     41 +
 Core/Instrument/IHistogram.cpp                     |    391 +
 Core/Instrument/IHistogram.h                       |    224 +
 Core/Instrument/IIntensityFunction.cpp             |     27 +
 Core/Instrument/IIntensityFunction.h               |     61 +
 Core/Instrument/IIntensityNormalizer.cpp           |     56 +
 Core/Instrument/IIntensityNormalizer.h             |     94 +
 Core/Instrument/IResolutionFunction2D.h            |     34 +
 Core/Instrument/ISquaredFunction.h                 |    185 +
 Core/Instrument/Instrument.cpp                     |    191 +
 Core/Instrument/Instrument.h                       |    121 +
 Core/Instrument/IntensityDataFunctions.cpp         |    159 +
 Core/Instrument/IntensityDataFunctions.h           |     63 +
 Core/Instrument/IsGISAXSDetector.cpp               |     70 +
 Core/Instrument/IsGISAXSDetector.h                 |     47 +
 Core/Instrument/LLData.cpp                         |     24 +
 Core/Instrument/LLData.h                           |    337 +
 Core/Instrument/NumpyUtils.cpp                     |     49 +
 Core/Instrument/NumpyUtils.h                       |     32 +
 Core/Instrument/OutputData.cpp                     |     84 +
 Core/Instrument/OutputData.h                       |    693 +
 Core/Instrument/OutputDataIterator.h               |    202 +
 Core/Instrument/RectangularDetector.cpp            |    414 +
 Core/Instrument/RectangularDetector.h              |    146 +
 Core/Instrument/RegionOfInterest.cpp               |    155 +
 Core/Instrument/RegionOfInterest.h                 |     94 +
 Core/Instrument/ResolutionFunction2DGaussian.cpp   |     34 +
 Core/Instrument/ResolutionFunction2DGaussian.h     |     46 +
 Core/Instrument/SimulationArea.cpp                 |     89 +
 Core/Instrument/SimulationArea.h                   |     72 +
 Core/Instrument/SimulationAreaIterator.cpp         |     74 +
 Core/Instrument/SimulationAreaIterator.h           |     62 +
 Core/Instrument/SphericalDetector.cpp              |    191 +
 Core/Instrument/SphericalDetector.h                |     99 +
 Core/Lattice/ISelectionRule.h                      |     68 +
 Core/Lattice/Lattice.cpp                           |    209 +
 Core/Lattice/Lattice.h                             |     93 +
 Core/Lattice/Lattice1DParameters.h                 |     35 +
 Core/Lattice/Lattice2DParameters.cpp               |     21 +
 Core/Lattice/Lattice2DParameters.h                 |     37 +
 Core/Mask/Ellipse.cpp                              |     56 +
 Core/Mask/Ellipse.h                                |     47 +
 Core/Mask/IShape2D.h                               |     51 +
 Core/Mask/InfinitePlane.h                          |     37 +
 Core/Mask/Line.cpp                                 |    104 +
 Core/Mask/Line.h                                   |     76 +
 Core/Mask/Polygon.cpp                              |    133 +
 Core/Mask/Polygon.h                                |     59 +
 Core/Mask/Rectangle.cpp                            |     62 +
 Core/Mask/Rectangle.h                              |     47 +
 Core/Material/HomogeneousMagneticMaterial.cpp      |     85 +
 Core/Material/HomogeneousMagneticMaterial.h        |     83 +
 Core/Material/HomogeneousMaterial.h                |     68 +
 Core/Material/IMaterial.cpp                        |     67 +
 Core/Material/IMaterial.h                          |     72 +
 Core/Material/Materials.cpp                        |     33 +
 Core/Material/Materials.h                          |     29 +
 Core/Multilayer/DWBADiffuseReflection.cpp          |    113 +
 Core/Multilayer/DWBADiffuseReflection.h            |     66 +
 .../Multilayer/DecouplingApproximationStrategy.cpp |     79 +
 Core/Multilayer/DecouplingApproximationStrategy.h  |     54 +
 Core/Multilayer/FormFactorDWBA.cpp                 |     81 +
 Core/Multilayer/FormFactorDWBA.h                   |     60 +
 Core/Multilayer/FormFactorDWBAPol.cpp              |    209 +
 Core/Multilayer/FormFactorDWBAPol.h                |     64 +
 Core/Multilayer/IInterferenceFunctionStrategy.cpp  |    135 +
 Core/Multilayer/IInterferenceFunctionStrategy.h    |    114 +
 Core/Multilayer/ILayerRTCoefficients.h             |     64 +
 Core/Multilayer/IMultiLayerBuilder.cpp             |     28 +
 Core/Multilayer/IMultiLayerBuilder.h               |     47 +
 Core/Multilayer/IRoughness.h                       |     32 +
 Core/Multilayer/ISpecularInfoMap.h                 |     46 +
 Core/Multilayer/Layer.cpp                          |    153 +
 Core/Multilayer/Layer.h                            |     85 +
 Core/Multilayer/LayerInterface.cpp                 |     76 +
 Core/Multilayer/LayerInterface.h                   |     77 +
 Core/Multilayer/LayerRoughness.cpp                 |     84 +
 Core/Multilayer/LayerRoughness.h                   |     74 +
 Core/Multilayer/LayerSpecularInfo.cpp              |     47 +
 Core/Multilayer/LayerSpecularInfo.h                |     53 +
 Core/Multilayer/LayerStrategyBuilder.cpp           |    126 +
 Core/Multilayer/LayerStrategyBuilder.h             |     59 +
 Core/Multilayer/MatrixRTCoefficients.cpp           |    242 +
 Core/Multilayer/MatrixRTCoefficients.h             |    187 +
 Core/Multilayer/MatrixSpecularInfoMap.cpp          |     59 +
 Core/Multilayer/MatrixSpecularInfoMap.h            |     51 +
 Core/Multilayer/MultiLayer.cpp                     |    333 +
 Core/Multilayer/MultiLayer.h                       |    154 +
 Core/Multilayer/SSCApproximationStrategy.cpp       |    154 +
 Core/Multilayer/SSCApproximationStrategy.h         |     82 +
 Core/Multilayer/ScalarRTCoefficients.h             |    151 +
 Core/Multilayer/ScalarSpecularInfoMap.cpp          |     46 +
 Core/Multilayer/ScalarSpecularInfoMap.h            |     53 +
 Core/Multilayer/SpecularMagnetic.cpp               |    144 +
 Core/Multilayer/SpecularMagnetic.h                 |     47 +
 Core/Multilayer/SpecularMatrix.cpp                 |    139 +
 Core/Multilayer/SpecularMatrix.h                   |     39 +
 Core/Parametrization/DistributionHandler.cpp       |     86 +
 Core/Parametrization/DistributionHandler.h         |     57 +
 Core/Parametrization/Distributions.cpp             |    403 +
 Core/Parametrization/Distributions.h               |    293 +
 Core/Parametrization/IParameter.h                  |     67 +
 Core/Parametrization/IParameterized.cpp            |    102 +
 Core/Parametrization/IParameterized.h              |     70 +
 Core/Parametrization/ParameterDistribution.cpp     |    130 +
 Core/Parametrization/ParameterDistribution.h       |     80 +
 Core/Parametrization/ParameterPattern.cpp          |     28 +
 Core/Parametrization/ParameterPattern.h            |     40 +
 Core/Parametrization/ParameterPool.cpp             |    223 +
 Core/Parametrization/ParameterPool.h               |     95 +
 Core/Parametrization/ParameterSample.h             |     29 +
 Core/Parametrization/RealParameter.cpp             |     75 +
 Core/Parametrization/RealParameter.h               |     69 +
 Core/Parametrization/SimulationOptions.cpp         |     76 +
 Core/Parametrization/SimulationOptions.h           |     74 +
 Core/Parametrization/ThreadInfo.h                  |     42 +
 Core/Parametrization/Unit.cpp                      |     24 +
 Core/Parametrization/Unit.h                        |     31 +
 Core/Parametrization/Units.h                       |     52 +
 Core/Particle/Crystal.cpp                          |     88 +
 Core/Particle/Crystal.h                            |     63 +
 Core/Particle/FormFactorCrystal.cpp                |     92 +
 Core/Particle/FormFactorCrystal.h                  |     55 +
 Core/Particle/FormFactorWeighted.cpp               |     73 +
 Core/Particle/FormFactorWeighted.h                 |     57 +
 Core/Particle/IAbstractParticle.h                  |     54 +
 Core/Particle/IClusteredParticles.h                |     51 +
 Core/Particle/IParticle.cpp                        |     87 +
 Core/Particle/IParticle.h                          |     84 +
 Core/Particle/MesoCrystal.cpp                      |    116 +
 Core/Particle/MesoCrystal.h                        |     64 +
 Core/Particle/Particle.cpp                         |    158 +
 Core/Particle/Particle.h                           |     69 +
 Core/Particle/ParticleComposition.cpp              |    171 +
 Core/Particle/ParticleComposition.h                |     74 +
 Core/Particle/ParticleCoreShell.cpp                |    129 +
 Core/Particle/ParticleCoreShell.h                  |     64 +
 Core/Particle/ParticleDistribution.cpp             |    131 +
 Core/Particle/ParticleDistribution.h               |     67 +
 Core/Particle/TRange.h                             |     53 +
 Core/Scattering/ICompositeSample.cpp               |     92 +
 Core/Scattering/ICompositeSample.h                 |     67 +
 Core/Scattering/IFormFactor.cpp                    |     33 +
 Core/Scattering/IFormFactor.h                      |     68 +
 Core/Scattering/IFormFactorBorn.cpp                |     34 +
 Core/Scattering/IFormFactorBorn.h                  |     74 +
 Core/Scattering/ISample.cpp                        |     47 +
 Core/Scattering/ISample.h                          |     84 +
 Core/Scattering/ISampleIteratorStrategy.cpp        |    109 +
 Core/Scattering/ISampleIteratorStrategy.h          |     61 +
 Core/Scattering/ISampleVisitor.cpp                 |    475 +
 Core/Scattering/ISampleVisitor.h                   |    221 +
 Core/Scattering/Rotations.cpp                      |    117 +
 Core/Scattering/Rotations.h                        |    126 +
 Core/Scattering/SampleTreeIterator.cpp             |     33 +
 Core/Scattering/SampleTreeIterator.h               |    142 +
 Core/Scattering/StringUsageMap.h                   |     58 +
 Core/Simulation/GISASSimulation.cpp                |    149 +
 Core/Simulation/GISASSimulation.h                  |    108 +
 Core/Simulation/OffSpecSimulation.cpp              |    186 +
 Core/Simulation/OffSpecSimulation.h                |     86 +
 Core/Simulation/Simulation.cpp                     |    352 +
 Core/Simulation/Simulation.h                       |    134 +
 Core/Simulation/SpecularSimulation.cpp             |    264 +
 Core/Simulation/SpecularSimulation.h               |    124 +
 Core/SoftParticle/FormFactorGauss.cpp              |     49 +
 Core/SoftParticle/FormFactorGauss.h                |     48 +
 Core/SoftParticle/FormFactorLorentz.cpp            |     64 +
 Core/SoftParticle/FormFactorLorentz.h              |     47 +
 .../FormFactorSphereGaussianRadius.cpp             |     45 +
 Core/SoftParticle/FormFactorSphereGaussianRadius.h |     48 +
 .../FormFactorSphereLogNormalRadius.cpp            |     51 +
 .../SoftParticle/FormFactorSphereLogNormalRadius.h |     51 +
 .../SoftParticle/FormFactorSphereUniformRadius.cpp |     60 +
 Core/SoftParticle/FormFactorSphereUniformRadius.h  |     43 +
 Core/StandardSamples/BoxCompositionBuilder.cpp     |    143 +
 Core/StandardSamples/BoxCompositionBuilder.h       |    101 +
 Core/StandardSamples/CoreShellParticleBuilder.cpp  |    100 +
 Core/StandardSamples/CoreShellParticleBuilder.h    |     46 +
 Core/StandardSamples/CustomMorphologyBuilder.cpp   |    111 +
 Core/StandardSamples/CustomMorphologyBuilder.h     |     34 +
 Core/StandardSamples/CylindersAndPrismsBuilder.cpp |     74 +
 Core/StandardSamples/CylindersAndPrismsBuilder.h   |     45 +
 Core/StandardSamples/CylindersBuilder.cpp          |    143 +
 Core/StandardSamples/CylindersBuilder.h            |     77 +
 Core/StandardSamples/IFactory.h                    |     85 +
 Core/StandardSamples/LatticeBuilder.cpp            |     74 +
 Core/StandardSamples/LatticeBuilder.h              |     44 +
 .../LayersWithAbsorptionBuilder.cpp                |     62 +
 Core/StandardSamples/LayersWithAbsorptionBuilder.h |     36 +
 Core/StandardSamples/MagneticParticlesBuilder.cpp  |    108 +
 Core/StandardSamples/MagneticParticlesBuilder.h    |     59 +
 Core/StandardSamples/MesoCrystalBuilder.cpp        |    175 +
 Core/StandardSamples/MesoCrystalBuilder.h          |     60 +
 .../MultiLayerWithRoughnessBuilder.cpp             |     71 +
 .../MultiLayerWithRoughnessBuilder.h               |     45 +
 Core/StandardSamples/MultipleLayoutBuilder.cpp     |     75 +
 Core/StandardSamples/MultipleLayoutBuilder.h       |     45 +
 Core/StandardSamples/ParaCrystalBuilder.cpp        |    260 +
 Core/StandardSamples/ParaCrystalBuilder.h          |    107 +
 .../StandardSamples/ParticleCompositionBuilder.cpp |     69 +
 Core/StandardSamples/ParticleCompositionBuilder.h  |     32 +
 .../ParticleDistributionsBuilder.cpp               |    150 +
 .../StandardSamples/ParticleDistributionsBuilder.h |     60 +
 Core/StandardSamples/ParticleInTheAirBuilder.cpp   |     45 +
 Core/StandardSamples/ParticleInTheAirBuilder.h     |     35 +
 Core/StandardSamples/RipplesBuilder.cpp            |    129 +
 Core/StandardSamples/RipplesBuilder.h              |     67 +
 Core/StandardSamples/RotatedPyramidsBuilder.cpp    |     69 +
 Core/StandardSamples/RotatedPyramidsBuilder.h      |     40 +
 Core/StandardSamples/SampleBuilderFactory.cpp      |    240 +
 Core/StandardSamples/SampleBuilderFactory.h        |     35 +
 Core/StandardSamples/SimulationFactory.cpp         |    109 +
 Core/StandardSamples/SimulationFactory.h           |     34 +
 .../SizeDistributionModelsBuilder.cpp              |    211 +
 .../SizeDistributionModelsBuilder.h                |     64 +
 Core/StandardSamples/StandardSimulations.cpp       |    318 +
 Core/StandardSamples/StandardSimulations.h         |     50 +
 Core/StandardSamples/TransformationsBuilder.cpp    |     58 +
 Core/StandardSamples/TransformationsBuilder.h      |     31 +
 Core/StandardSamples/TwoDimLatticeBuilder.cpp      |    180 +
 Core/StandardSamples/TwoDimLatticeBuilder.h        |     64 +
 Core/Tools/FileSystem.cpp                          |     77 +
 Core/Tools/FileSystem.h                            |     47 +
 Core/Tools/IntegratorComplex.h                     |     95 +
 Core/Tools/IntegratorMCMiser.h                     |    120 +
 Core/Tools/IntegratorReal.h                        |    102 +
 Core/Tools/MathFunctions.cpp                       |    384 +
 Core/Tools/MathFunctions.h                         |    106 +
 Core/Tools/Numeric.cpp                             |     45 +
 Core/Tools/Numeric.h                               |     32 +
 Core/Tools/Precomputed.cpp                         |     33 +
 Core/Tools/Precomputed.h                           |     35 +
 Core/Tools/SafePointerVector.h                     |     92 +
 Core/Tools/Utils.cpp                               |     67 +
 Core/Tools/Utils.h                                 |     41 +
 Core/Tools/fp_exception_glibc_extension.c          |    334 +
 Core/Tools/fp_exception_glibc_extension.h          |     64 +
 Core/Tools/w32pragma.h                             |    101 +
 Core/Vector/BasicVector3D.cpp                      |    136 +
 Core/Vector/BasicVector3D.h                        |    316 +
 Core/Vector/EigenCore.h                            |     31 +
 Core/Vector/Transform3D.cpp                        |    220 +
 Core/Vector/Transform3D.h                          |    107 +
 Core/Vector/Vectors3D.h                            |     25 +
 Core/Vector/WavevectorInfo.h                       |     46 +
 Core/includeIncludes/FormFactors.h                 |     28 +
 Core/includeIncludes/HardParticles.h               |     44 +
 Core/includeIncludes/InterferenceFunctions.h       |     25 +
 Core/includeIncludes/SoftParticles.h               |     26 +
 Doc/Doxygen/Doxyfile                               |   2280 +
 Doc/Doxygen/Doxyfile.dirgraphs                     |   2276 +
 Doc/Doxygen/Doxyfile.in                            |   2280 +
 Doc/Doxygen/Doxyfile.long                          |   2284 +
 Doc/Doxygen/defgroups.dox                          |     74 +
 Doc/Doxygen/layout.xml                             |    201 +
 Doc/Doxygen/mainpage.dox                           |     27 +
 Doc/Doxygen/userapi.dox                            |     51 +
 Doc/man/CMakeLists.txt                             |     15 +
 Doc/man/bornagain.pod                              |     51 +
 Doc/pdf2html/README                                |      9 +
 Doc/pdf2html/base.min.css                          |    207 +
 Doc/pdf2html/bullet.gif                            |    Bin 0 -> 62 bytes
 Doc/pdf2html/compatibility.min.js                  |      7 +
 Doc/pdf2html/fancy.css                             |     83 +
 Doc/pdf2html/manifest                              |    140 +
 Doc/pdf2html/minus.gif                             |    Bin 0 -> 87 bytes
 Doc/pdf2html/mktree.css                            |     23 +
 Doc/pdf2html/mktree.js                             |    168 +
 Doc/pdf2html/pdf2htmlEX-64x64.png                  |    Bin 0 -> 3422 bytes
 Doc/pdf2html/pdf2htmlEX.js                         |    970 +
 Doc/pdf2html/plus.gif                              |    Bin 0 -> 89 bytes
 Examples/Demos/FitCylindersPrisms_movie.py         |    235 +
 Examples/Demos/animation.mpg                       |    Bin 0 -> 275186 bytes
 Examples/Demos/animation2.mpg                      |    Bin 0 -> 312378 bytes
 Examples/Demos/animation3.mpg                      |    Bin 0 -> 122506 bytes
 Examples/Demos/fit_movie.mpg                       |    Bin 0 -> 489272 bytes
 Examples/Demos/refdata_fitcylinderprisms.int.gz    |    Bin 0 -> 82203 bytes
 Examples/Demos/simul_demo_cyl_SSCA.py              |     69 +
 Examples/Demos/simul_demo_cylsphere.py             |     61 +
 Examples/Demos/simul_demo_lattice1.py              |     75 +
 Examples/Demos/simul_demo_lattice2.py              |     80 +
 Examples/Demos/simul_demo_movie.py                 |    103 +
 Examples/Demos/simul_demo_movie2.py                |    105 +
 Examples/Demos/simul_demo_movie3.py                |    106 +
 Examples/README                                    |      9 +
 Examples/cpp/CylindersAndPrisms/CMakeLists.txt     |     32 +
 .../cpp/CylindersAndPrisms/CylindersAndPrisms.cpp  |     67 +
 Examples/cpp/CylindersAndPrisms/README             |     43 +
 Examples/cpp/README                                |     12 +
 Examples/cpp/modules/FindBornAgain.cmake           |     57 +
 Examples/python/README                             |      9 +
 Examples/python/fitting/README                     |     58 +
 .../SampleParametersIntro.py                       |    124 +
 .../FitCylindersPrisms.py                          |     79 +
 .../FitCylindersPrisms_detailed.py                 |    182 +
 .../refdata_fitcylinderprisms.int.gz               |    Bin 0 -> 82203 bytes
 .../FitSpheresInHexLattice.py                      |    112 +
 .../FitSpheresInHexLattice_builder.py              |    131 +
 .../ex04_FitScaleAndShift/FitScaleAndShift.py      |    132 +
 .../fitting/ex05_FitWithMasks/FitWithMasks.py      |    157 +
 .../FitStrategyAdjustMinimizer.py                  |    128 +
 .../fitting/ex07_FitAlongSlices/FitAlongSlices.py  |    213 +
 .../SimultaneousFitOfTwoDatasets.py                |    182 +
 .../fitting/ex10_FitGALAXIData/FitGALAXIData.py    |    102 +
 .../fitting/ex10_FitGALAXIData/SampleBuilder.py    |     96 +
 .../fitting/ex10_FitGALAXIData/galaxi_data.tif.gz  |    Bin 0 -> 709272 bytes
 .../ex01_BasicParticles/AllFormFactorsAvailable.py |    122 +
 .../ex01_BasicParticles/CylindersAndPrisms.py      |     67 +
 .../ex01_BasicParticles/CylindersInBA.py           |     59 +
 .../ex01_BasicParticles/CylindersInDWBA.py         |     61 +
 .../CylindersWithSizeDistribution.py               |     75 +
 .../ex01_BasicParticles/RotatedPyramids.py         |     63 +
 .../TwoTypesOfCylindersWithSizeDistribution.py     |     89 +
 .../ex02_LayeredStructures/BuriedParticles.py      |     66 +
 .../ex02_LayeredStructures/CorrelatedRoughness.py  |     74 +
 .../ex03_InterferenceFunctions/ApproximationDA.py  |     78 +
 .../ex03_InterferenceFunctions/ApproximationLMA.py |     87 +
 .../ApproximationSSCA.py                           |     80 +
 .../CosineRipplesAtRectLattice.py                  |     71 +
 .../Interference1DLattice.py                       |     72 +
 .../Interference1DRadialParaCrystal.py             |     69 +
 .../Interference2DCenteredSquareLattice.py         |     74 +
 .../Interference2DLatticeSumOfRotated.py           |     89 +
 .../Interference2DParaCrystal.py                   |     72 +
 .../Interference2DRotatedSquareLattice.py          |     71 +
 .../Interference2DSquareLattice.py                 |     68 +
 .../RectangularGrating.py                          |     78 +
 .../SpheresAtHexLattice.py                         |     65 +
 .../ex03_InterferenceFunctions/TriangularRipple.py |     72 +
 .../ex04_ComplexShapes/CoreShellNanoparticles.py   |     67 +
 .../ex04_ComplexShapes/CustomFormFactor.py         |    102 +
 .../HexagonalLatticesWithBasis.py                  |     71 +
 .../ex04_ComplexShapes/LargeParticlesFormFactor.py |    132 +
 .../ex05_BeamAndDetector/BeamDivergence.py         |     69 +
 .../DetectorResolutionFunction.py                  |     65 +
 .../ex05_BeamAndDetector/OffSpecularSimulation.py  |     78 +
 .../ex05_BeamAndDetector/RectangularDetector.py    |    164 +
 .../ex05_BeamAndDetector/SpecularSimulation.py     |    109 +
 .../AccessingSimulationResults.py                  |    194 +
 .../ex06_Miscellaneous/AxesInDifferentUnits.py     |    126 +
 Examples/python/utils/__init__.py                  |      1 +
 Examples/python/utils/plot_intensity_data.py       |     31 +
 Examples/python/utils/plot_intensity_data_diff.py  |     36 +
 Examples/python/utils/show2d.py                    |     76 +
 Examples/python/utils/show2d_root.py               |     67 +
 Fit/CMakeLists.txt                                 |    176 +
 Fit/Kernel/FitKernel.cpp                           |    103 +
 Fit/Kernel/FitKernel.h                             |     74 +
 Fit/Kernel/FitKernelImpl.cpp                       |    113 +
 Fit/Kernel/FitKernelImpl.h                         |     69 +
 Fit/Kernel/FitOptions.h                            |     70 +
 Fit/Kernel/IMinimizer.cpp                          |     62 +
 Fit/Kernel/IMinimizer.h                            |     70 +
 Fit/Kernel/KernelTypes.h                           |     31 +
 Fit/Kernel/MinimizerCatalogue.cpp                  |     82 +
 Fit/Kernel/MinimizerCatalogue.h                    |     56 +
 Fit/Kernel/MinimizerConstants.h                    |     70 +
 Fit/Kernel/MinimizerFactory.cpp                    |     84 +
 Fit/Kernel/MinimizerFactory.h                      |     56 +
 Fit/Kernel/MinimizerInfo.cpp                       |    172 +
 Fit/Kernel/MinimizerInfo.h                         |     76 +
 Fit/Kernel/MinimizerOptions.cpp                    |     68 +
 Fit/Kernel/MinimizerOptions.h                      |     38 +
 Fit/Kernel/MinimizerResultsHelper.cpp              |    123 +
 Fit/Kernel/MinimizerResultsHelper.h                |     68 +
 Fit/Kernel/MinimizerUtils.cpp                      |    106 +
 Fit/Kernel/MinimizerUtils.h                        |     40 +
 Fit/Kernel/MultiOption.cpp                         |     65 +
 Fit/Kernel/MultiOption.h                           |     89 +
 Fit/Kernel/ObjectiveFunction.cpp                   |     67 +
 Fit/Kernel/ObjectiveFunction.h                     |     51 +
 Fit/Kernel/OptionContainer.cpp                     |     70 +
 Fit/Kernel/OptionContainer.h                       |     98 +
 Fit/Kernel/TestMinimizer.cpp                       |     48 +
 Fit/Kernel/TestMinimizer.h                         |     48 +
 Fit/Parameters/AttLimits.cpp                       |    132 +
 Fit/Parameters/AttLimits.h                         |     68 +
 Fit/Parameters/Attributes.h                        |     60 +
 Fit/Parameters/FitParameter.cpp                    |    132 +
 Fit/Parameters/FitParameter.h                      |     76 +
 Fit/Parameters/FitParameterSet.cpp                 |    278 +
 Fit/Parameters/FitParameterSet.h                   |     93 +
 Fit/Parameters/IFitParameter.h                     |     36 +
 Fit/Parameters/RealLimits.cpp                      |     54 +
 Fit/Parameters/RealLimits.h                        |    112 +
 Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.cpp |    106 +
 Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.h   |     60 +
 Fit/RootAdapter/GSLMultiMinimizer.cpp              |     72 +
 Fit/RootAdapter/GSLMultiMinimizer.h                |     54 +
 Fit/RootAdapter/GeneticMinimizer.cpp               |    154 +
 Fit/RootAdapter/GeneticMinimizer.h                 |     73 +
 Fit/RootAdapter/Minuit2Minimizer.cpp               |    171 +
 Fit/RootAdapter/Minuit2Minimizer.h                 |     87 +
 Fit/RootAdapter/RootMinimizerAdapter.cpp           |    231 +
 Fit/RootAdapter/RootMinimizerAdapter.h             |    127 +
 Fit/RootAdapter/RootMinimizerFunctions.h           |     76 +
 Fit/RootAdapter/RootObjectiveFuncAdapter.cpp       |    127 +
 Fit/RootAdapter/RootObjectiveFuncAdapter.h         |     59 +
 Fit/RootAdapter/SimAnMinimizer.cpp                 |    147 +
 Fit/RootAdapter/SimAnMinimizer.h                   |     83 +
 Fit/Utils/Logger.cpp                               |     99 +
 Fit/Utils/Logger.h                                 |     77 +
 Fit/Utils/StringUtils.cpp                          |     94 +
 Fit/Utils/StringUtils.h                            |     47 +
 Fit/Utils/TimeInterval.cpp                         |     60 +
 Fit/Utils/TimeInterval.h                           |     40 +
 GUI/CMakeLists.txt                                 |     27 +
 GUI/coregui/CMakeLists.txt                         |    195 +
 GUI/coregui/Models/AngleProperty.cpp               |    148 +
 GUI/coregui/Models/AngleProperty.h                 |     64 +
 GUI/coregui/Models/ApplicationModels.cpp           |    321 +
 GUI/coregui/Models/ApplicationModels.h             |     86 +
 GUI/coregui/Models/AxesItems.cpp                   |     62 +
 GUI/coregui/Models/AxesItems.h                     |     49 +
 GUI/coregui/Models/BeamAngleItems.cpp              |    109 +
 GUI/coregui/Models/BeamAngleItems.h                |     47 +
 GUI/coregui/Models/BeamDistributionItem.cpp        |    123 +
 GUI/coregui/Models/BeamDistributionItem.h          |     43 +
 GUI/coregui/Models/BeamItem.cpp                    |    114 +
 GUI/coregui/Models/BeamItem.h                      |     47 +
 GUI/coregui/Models/BeamWavelengthItem.cpp          |     22 +
 GUI/coregui/Models/BeamWavelengthItem.h            |     30 +
 GUI/coregui/Models/ColorProperty.h                 |     60 +
 GUI/coregui/Models/ComboProperty.cpp               |     86 +
 GUI/coregui/Models/ComboProperty.h                 |    134 +
 GUI/coregui/Models/DetectorItems.cpp               |     53 +
 GUI/coregui/Models/DetectorItems.h                 |     37 +
 GUI/coregui/Models/DistributionItem.cpp            |    227 +
 GUI/coregui/Models/DistributionItem.h              |    117 +
 GUI/coregui/Models/DocumentModel.cpp               |     30 +
 GUI/coregui/Models/DocumentModel.h                 |     38 +
 GUI/coregui/Models/DomainFittingBuilder.cpp        |     73 +
 GUI/coregui/Models/DomainFittingBuilder.h          |     33 +
 GUI/coregui/Models/DomainObjectBuilder.cpp         |    147 +
 GUI/coregui/Models/DomainObjectBuilder.h           |     43 +
 GUI/coregui/Models/DomainSimulationBuilder.cpp     |     54 +
 GUI/coregui/Models/DomainSimulationBuilder.h       |     37 +
 GUI/coregui/Models/FTDecayFunctionItems.cpp        |    140 +
 GUI/coregui/Models/FTDecayFunctionItems.h          |    112 +
 GUI/coregui/Models/FTDistributionItems.cpp         |    215 +
 GUI/coregui/Models/FTDistributionItems.h           |    148 +
 GUI/coregui/Models/FilterPropertyProxy.cpp         |     46 +
 GUI/coregui/Models/FilterPropertyProxy.h           |     45 +
 GUI/coregui/Models/FitParameterHelper.cpp          |    132 +
 GUI/coregui/Models/FitParameterHelper.h            |     50 +
 GUI/coregui/Models/FitParameterItems.cpp           |    272 +
 GUI/coregui/Models/FitParameterItems.h             |     78 +
 GUI/coregui/Models/FitParameterProxyModel.cpp      |    416 +
 GUI/coregui/Models/FitParameterProxyModel.h        |     96 +
 GUI/coregui/Models/FitSuiteItem.cpp                |     61 +
 GUI/coregui/Models/FitSuiteItem.h                  |     41 +
 GUI/coregui/Models/FormFactorItems.cpp             |    480 +
 GUI/coregui/Models/FormFactorItems.h               |    254 +
 GUI/coregui/Models/GUIExamplesFactory.cpp          |     83 +
 GUI/coregui/Models/GUIExamplesFactory.h            |     42 +
 GUI/coregui/Models/GUIObjectBuilder.cpp            |    689 +
 GUI/coregui/Models/GUIObjectBuilder.h              |    116 +
 GUI/coregui/Models/GroupItem.cpp                   |     53 +
 GUI/coregui/Models/GroupItem.h                     |     35 +
 GUI/coregui/Models/GroupProperty.cpp               |    131 +
 GUI/coregui/Models/GroupProperty.h                 |     65 +
 GUI/coregui/Models/GroupPropertyRegistry.cpp       |    157 +
 GUI/coregui/Models/GroupPropertyRegistry.h         |     44 +
 GUI/coregui/Models/IconProvider.cpp                |     40 +
 GUI/coregui/Models/IconProvider.h                  |     38 +
 GUI/coregui/Models/InstrumentItem.cpp              |     50 +
 GUI/coregui/Models/InstrumentItem.h                |     35 +
 GUI/coregui/Models/InstrumentModel.cpp             |     38 +
 GUI/coregui/Models/InstrumentModel.h               |     37 +
 GUI/coregui/Models/IntensityDataItem.cpp           |    379 +
 GUI/coregui/Models/IntensityDataItem.h             |    121 +
 GUI/coregui/Models/InterferenceFunctionItems.cpp   |    115 +
 GUI/coregui/Models/InterferenceFunctionItems.h     |     76 +
 GUI/coregui/Models/ItemFactory.cpp                 |    254 +
 GUI/coregui/Models/ItemFactory.h                   |     48 +
 GUI/coregui/Models/JobItem.cpp                     |    327 +
 GUI/coregui/Models/JobItem.h                       |    107 +
 GUI/coregui/Models/JobItemFunctions.cpp            |     60 +
 GUI/coregui/Models/JobItemFunctions.h              |     39 +
 GUI/coregui/Models/JobItemHelper.cpp               |    288 +
 GUI/coregui/Models/JobItemHelper.h                 |     82 +
 GUI/coregui/Models/JobModel.cpp                    |    210 +
 GUI/coregui/Models/JobModel.h                      |     71 +
 GUI/coregui/Models/JobModelFunctions.cpp           |    170 +
 GUI/coregui/Models/JobModelFunctions.h             |     37 +
 GUI/coregui/Models/JobQueueData.cpp                |    291 +
 GUI/coregui/Models/JobQueueData.h                  |     74 +
 GUI/coregui/Models/JobWorker.cpp                   |     94 +
 GUI/coregui/Models/JobWorker.h                     |     68 +
 GUI/coregui/Models/LatticeTypeItems.cpp            |     50 +
 GUI/coregui/Models/LatticeTypeItems.h              |     51 +
 GUI/coregui/Models/LayerItem.cpp                   |     37 +
 GUI/coregui/Models/LayerItem.h                     |     35 +
 GUI/coregui/Models/LayerRoughnessItems.cpp         |     36 +
 GUI/coregui/Models/LayerRoughnessItems.h           |     44 +
 GUI/coregui/Models/LinkInstrumentItem.cpp          |     34 +
 GUI/coregui/Models/LinkInstrumentItem.h            |     37 +
 GUI/coregui/Models/MagneticFieldItem.cpp           |     36 +
 GUI/coregui/Models/MagneticFieldItem.h             |     38 +
 GUI/coregui/Models/MaskItems.cpp                   |    202 +
 GUI/coregui/Models/MaskItems.h                     |    119 +
 GUI/coregui/Models/MaskModel.cpp                   |     23 +
 GUI/coregui/Models/MaskModel.h                     |     31 +
 GUI/coregui/Models/MaterialItem.cpp                |     64 +
 GUI/coregui/Models/MaterialItem.h                  |     39 +
 GUI/coregui/Models/MaterialModel.cpp               |    106 +
 GUI/coregui/Models/MaterialModel.h                 |     46 +
 GUI/coregui/Models/MinimizerItem.cpp               |    213 +
 GUI/coregui/Models/MinimizerItem.h                 |    126 +
 GUI/coregui/Models/MinimizerItemCatalogue.cpp      |     46 +
 GUI/coregui/Models/MinimizerItemCatalogue.h        |     36 +
 GUI/coregui/Models/ModelMapper.cpp                 |    352 +
 GUI/coregui/Models/ModelMapper.h                   |    124 +
 GUI/coregui/Models/ModelPath.cpp                   |    270 +
 GUI/coregui/Models/ModelPath.h                     |     74 +
 GUI/coregui/Models/MultiLayerItem.cpp              |     54 +
 GUI/coregui/Models/MultiLayerItem.h                |     35 +
 GUI/coregui/Models/ParameterTranslators.cpp        |    108 +
 GUI/coregui/Models/ParameterTranslators.h          |     61 +
 GUI/coregui/Models/ParameterTreeBuilder.cpp        |    117 +
 GUI/coregui/Models/ParameterTreeBuilder.h          |     39 +
 GUI/coregui/Models/ParameterTreeItems.cpp          |     95 +
 GUI/coregui/Models/ParameterTreeItems.h            |     58 +
 GUI/coregui/Models/ParameterTuningModel.cpp        |     78 +
 GUI/coregui/Models/ParameterTuningModel.h          |     56 +
 GUI/coregui/Models/ParticleCompositionItem.cpp     |     90 +
 GUI/coregui/Models/ParticleCompositionItem.h       |     34 +
 GUI/coregui/Models/ParticleCoreShellItem.cpp       |     73 +
 GUI/coregui/Models/ParticleCoreShellItem.h         |     37 +
 GUI/coregui/Models/ParticleDistributionItem.cpp    |    151 +
 GUI/coregui/Models/ParticleDistributionItem.h      |     47 +
 GUI/coregui/Models/ParticleItem.cpp                |     92 +
 GUI/coregui/Models/ParticleItem.h                  |     38 +
 GUI/coregui/Models/ParticleLayoutItem.cpp          |     59 +
 GUI/coregui/Models/ParticleLayoutItem.h            |     34 +
 GUI/coregui/Models/PropertyAttribute.cpp           |    196 +
 GUI/coregui/Models/PropertyAttribute.h             |     95 +
 GUI/coregui/Models/PropertyItem.cpp                |     23 +
 GUI/coregui/Models/PropertyItem.h                  |     30 +
 GUI/coregui/Models/RealDataItem.cpp                |    150 +
 GUI/coregui/Models/RealDataItem.h                  |     51 +
 GUI/coregui/Models/RealDataModel.cpp               |     56 +
 GUI/coregui/Models/RealDataModel.h                 |     40 +
 GUI/coregui/Models/RectangularDetectorItem.cpp     |    264 +
 GUI/coregui/Models/RectangularDetectorItem.h       |     58 +
 GUI/coregui/Models/RefractiveIndexItem.cpp         |     71 +
 GUI/coregui/Models/RefractiveIndexItem.h           |     39 +
 GUI/coregui/Models/ResolutionFunctionItems.cpp     |     58 +
 GUI/coregui/Models/ResolutionFunctionItems.h       |     55 +
 GUI/coregui/Models/RotationItems.cpp               |     88 +
 GUI/coregui/Models/RotationItems.h                 |     70 +
 GUI/coregui/Models/SampleModel.cpp                 |     64 +
 GUI/coregui/Models/SampleModel.h                   |     43 +
 GUI/coregui/Models/SampleValidator.cpp             |    158 +
 GUI/coregui/Models/SampleValidator.h               |     52 +
 GUI/coregui/Models/ScientificDoubleProperty.h      |     46 +
 GUI/coregui/Models/SessionGraphicsItem.cpp         |     30 +
 GUI/coregui/Models/SessionGraphicsItem.h           |     33 +
 GUI/coregui/Models/SessionItem.cpp                 |    808 +
 GUI/coregui/Models/SessionItem.h                   |    159 +
 GUI/coregui/Models/SessionModel.cpp                |    533 +
 GUI/coregui/Models/SessionModel.h                  |    165 +
 GUI/coregui/Models/SessionModelAssistant.cpp       |     58 +
 GUI/coregui/Models/SessionModelAssistant.h         |     71 +
 GUI/coregui/Models/SessionModelDelegate.cpp        |     90 +
 GUI/coregui/Models/SessionModelDelegate.h          |     51 +
 GUI/coregui/Models/SessionXML.cpp                  |    379 +
 GUI/coregui/Models/SessionXML.h                    |     88 +
 GUI/coregui/Models/SimulationOptionsItem.cpp       |    152 +
 GUI/coregui/Models/SimulationOptionsItem.h         |     52 +
 GUI/coregui/Models/SphericalDetectorItem.cpp       |     81 +
 GUI/coregui/Models/SphericalDetectorItem.h         |     38 +
 GUI/coregui/Models/TestItem.cpp                    |     33 +
 GUI/coregui/Models/TestItem.h                      |     35 +
 GUI/coregui/Models/TransformFromDomain.cpp         |    791 +
 GUI/coregui/Models/TransformFromDomain.h           |     99 +
 GUI/coregui/Models/TransformToDomain.cpp           |    448 +
 GUI/coregui/Models/TransformToDomain.h             |     62 +
 GUI/coregui/Models/TransformationItem.cpp          |     26 +
 GUI/coregui/Models/TransformationItem.h            |     33 +
 GUI/coregui/Models/VectorItem.cpp                  |     53 +
 GUI/coregui/Models/VectorItem.h                    |     38 +
 GUI/coregui/Models/item_constants.h                |    236 +
 .../Views/AccordionWidget/AccordionWidget.cpp      |    434 +
 .../Views/AccordionWidget/AccordionWidget.h        |    398 +
 .../Views/AccordionWidget/ClickableFrame.cpp       |    133 +
 GUI/coregui/Views/AccordionWidget/ClickableFrame.h |    176 +
 GUI/coregui/Views/AccordionWidget/ContentPane.cpp  |    233 +
 GUI/coregui/Views/AccordionWidget/ContentPane.h    |    335 +
 .../Views/AccordionWidget/accordionwidgeticons.qrc |      6 +
 GUI/coregui/Views/AccordionWidget/caret-bottom.png |    Bin 0 -> 129 bytes
 GUI/coregui/Views/AccordionWidget/caret-right.png  |    Bin 0 -> 130 bytes
 GUI/coregui/Views/CommonWidgets/InfoPanel.cpp      |    136 +
 GUI/coregui/Views/CommonWidgets/InfoPanel.h        |     60 +
 .../Views/CommonWidgets/InfoPanelToolBar.cpp       |     64 +
 GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.h |     50 +
 .../Views/CommonWidgets/ItemComboToolBar.cpp       |     90 +
 GUI/coregui/Views/CommonWidgets/ItemComboToolBar.h |     56 +
 .../Views/CommonWidgets/ItemComboWidget.cpp        |    129 +
 GUI/coregui/Views/CommonWidgets/ItemComboWidget.h  |     70 +
 .../Views/CommonWidgets/ItemSelectorWidget.cpp     |    130 +
 .../Views/CommonWidgets/ItemSelectorWidget.h       |     68 +
 .../Views/CommonWidgets/ItemStackPresenter.h       |    113 +
 .../Views/CommonWidgets/ItemStackWidget.cpp        |    128 +
 GUI/coregui/Views/CommonWidgets/ItemStackWidget.h  |     68 +
 .../Views/CommonWidgets/SessionItemWidget.cpp      |     29 +
 .../Views/CommonWidgets/SessionItemWidget.h        |     38 +
 GUI/coregui/Views/CommonWidgets/StatusLabel.cpp    |     72 +
 GUI/coregui/Views/CommonWidgets/StatusLabel.h      |     54 +
 GUI/coregui/Views/CommonWidgets/UpdateTimer.cpp    |     82 +
 GUI/coregui/Views/CommonWidgets/UpdateTimer.h      |     66 +
 GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp  |    122 +
 GUI/coregui/Views/FitWidgets/FitActivityPanel.h    |     63 +
 .../Views/FitWidgets/FitComparisonWidget.cpp       |    273 +
 GUI/coregui/Views/FitWidgets/FitComparisonWidget.h |     88 +
 GUI/coregui/Views/FitWidgets/FitFlowWidget.cpp     |     84 +
 GUI/coregui/Views/FitWidgets/FitFlowWidget.h       |     48 +
 .../Views/FitWidgets/FitParameterWidget.cpp        |    446 +
 GUI/coregui/Views/FitWidgets/FitParameterWidget.h  |    103 +
 GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp   |     40 +
 GUI/coregui/Views/FitWidgets/FitProgressInfo.h     |     49 +
 GUI/coregui/Views/FitWidgets/FitResultsWidget.cpp  |     24 +
 GUI/coregui/Views/FitWidgets/FitResultsWidget.h    |     33 +
 GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp    |    262 +
 GUI/coregui/Views/FitWidgets/FitSuiteWidget.h      |     93 +
 GUI/coregui/Views/FitWidgets/FittingWorker.cpp     |     51 +
 GUI/coregui/Views/FitWidgets/FittingWorker.h       |     54 +
 GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp    |    129 +
 GUI/coregui/Views/FitWidgets/GUIFitObserver.h      |     68 +
 GUI/coregui/Views/FitWidgets/HistogramPlot.cpp     |     84 +
 GUI/coregui/Views/FitWidgets/HistogramPlot.h       |     46 +
 .../Views/FitWidgets/MinimizerSettingsWidget.cpp   |     58 +
 .../Views/FitWidgets/MinimizerSettingsWidget.h     |     48 +
 .../Views/FitWidgets/RunFitControlWidget.cpp       |    249 +
 GUI/coregui/Views/FitWidgets/RunFitControlWidget.h |     78 +
 GUI/coregui/Views/FitWidgets/RunFitManager.cpp     |     96 +
 GUI/coregui/Views/FitWidgets/RunFitManager.h       |     65 +
 GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp    |     61 +
 GUI/coregui/Views/FitWidgets/TestFitWidgets.h      |     48 +
 GUI/coregui/Views/FitWidgets/plot_constants.h      |     29 +
 GUI/coregui/Views/ImportDataView.cpp               |     87 +
 GUI/coregui/Views/ImportDataView.h                 |     52 +
 .../ImportDataWidgets/ImportDataAssistant.cpp      |    217 +
 .../Views/ImportDataWidgets/ImportDataAssistant.h  |     55 +
 .../Views/ImportDataWidgets/ImportDataToolBar.cpp  |    226 +
 .../Views/ImportDataWidgets/ImportDataToolBar.h    |     60 +
 .../ImportDataWidgets/LinkInstrumentManager.cpp    |    370 +
 .../ImportDataWidgets/LinkInstrumentManager.h      |     86 +
 .../ImportDataWidgets/RealDataEditorWidget.cpp     |     60 +
 .../Views/ImportDataWidgets/RealDataEditorWidget.h |     50 +
 .../Views/ImportDataWidgets/RealDataMaskWidget.cpp |     83 +
 .../Views/ImportDataWidgets/RealDataMaskWidget.h   |     53 +
 .../ImportDataWidgets/RealDataPropertiesWidget.cpp |    213 +
 .../ImportDataWidgets/RealDataPropertiesWidget.h   |     68 +
 .../ImportDataWidgets/RealDataSelectorWidget.cpp   |     69 +
 .../ImportDataWidgets/RealDataSelectorWidget.h     |     62 +
 .../Views/InfoWidgets/DistributionDialog.cpp       |     60 +
 GUI/coregui/Views/InfoWidgets/DistributionDialog.h |     40 +
 .../Views/InfoWidgets/DistributionEditor.cpp       |    108 +
 GUI/coregui/Views/InfoWidgets/DistributionEditor.h |     54 +
 .../Views/InfoWidgets/DistributionWidget.cpp       |    290 +
 GUI/coregui/Views/InfoWidgets/DistributionWidget.h |     68 +
 GUI/coregui/Views/InfoWidgets/GroupInfoBox.cpp     |    106 +
 GUI/coregui/Views/InfoWidgets/GroupInfoBox.h       |     47 +
 GUI/coregui/Views/InfoWidgets/InfoToolBar.cpp      |     63 +
 GUI/coregui/Views/InfoWidgets/InfoToolBar.h        |     49 +
 GUI/coregui/Views/InfoWidgets/InfoWidget.cpp       |    158 +
 GUI/coregui/Views/InfoWidgets/InfoWidget.h         |     65 +
 .../Views/InfoWidgets/OverlayLabelController.cpp   |     75 +
 .../Views/InfoWidgets/OverlayLabelController.h     |     53 +
 .../Views/InfoWidgets/OverlayLabelWidget.cpp       |     50 +
 GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.h |     47 +
 .../Views/InfoWidgets/ProjectLoadWarningDialog.cpp |    304 +
 .../Views/InfoWidgets/ProjectLoadWarningDialog.h   |     58 +
 GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp   |    290 +
 GUI/coregui/Views/InfoWidgets/PySampleWidget.h     |     74 +
 .../Views/InfoWidgets/PythonSyntaxHighlighter.cpp  |    254 +
 .../Views/InfoWidgets/PythonSyntaxHighlighter.h    |     95 +
 .../Views/InfoWidgets/WarningSignWidget.cpp        |     51 +
 GUI/coregui/Views/InfoWidgets/WarningSignWidget.h  |     45 +
 GUI/coregui/Views/InstrumentView.cpp               |    279 +
 GUI/coregui/Views/InstrumentView.h                 |     71 +
 .../Views/InstrumentWidgets/BeamEditorWidget.cpp   |    118 +
 .../Views/InstrumentWidgets/BeamEditorWidget.h     |     51 +
 .../Views/InstrumentWidgets/ComboWidget.cpp        |     93 +
 GUI/coregui/Views/InstrumentWidgets/ComboWidget.h  |     51 +
 .../Views/InstrumentWidgets/ComponentInfoBox.cpp   |     59 +
 .../Views/InstrumentWidgets/ComponentInfoBox.h     |     54 +
 .../InstrumentWidgets/DetectorEditorWidget.cpp     |    140 +
 .../Views/InstrumentWidgets/DetectorEditorWidget.h |     58 +
 .../InstrumentWidgets/DetectorMaskDelegate.cpp     |    184 +
 .../Views/InstrumentWidgets/DetectorMaskDelegate.h |     60 +
 .../InstrumentWidgets/ExtendedDetectorDialog.cpp   |    103 +
 .../InstrumentWidgets/ExtendedDetectorDialog.h     |     51 +
 .../InstrumentComponentsWidget.cpp                 |     59 +
 .../InstrumentWidgets/InstrumentComponentsWidget.h |     49 +
 .../InstrumentWidgets/InstrumentEditorWidget.cpp   |    187 +
 .../InstrumentWidgets/InstrumentEditorWidget.h     |     63 +
 .../InstrumentWidgets/InstrumentSelectorWidget.cpp |    101 +
 .../InstrumentWidgets/InstrumentSelectorWidget.h   |     57 +
 .../RectangularDetectorWidget.cpp                  |    225 +
 .../InstrumentWidgets/RectangularDetectorWidget.h  |     67 +
 .../InstrumentWidgets/SphericalDetectorWidget.cpp  |    100 +
 .../InstrumentWidgets/SphericalDetectorWidget.h    |     51 +
 .../Views/InstrumentWidgets/columnresizer.cpp      |    291 +
 .../Views/InstrumentWidgets/columnresizer.h        |     67 +
 .../Views/IntensityDataWidgets/ColorMap.cpp        |    520 +
 GUI/coregui/Views/IntensityDataWidgets/ColorMap.h  |    125 +
 .../Views/IntensityDataWidgets/ColorMapBin.h       |     54 +
 .../Views/IntensityDataWidgets/ColorMapCanvas.cpp  |    105 +
 .../Views/IntensityDataWidgets/ColorMapCanvas.h    |     61 +
 .../IntensityDataWidgets/ColorMapCanvasEvent.cpp   |     87 +
 .../IntensityDataWidgets/ColorMapCanvasEvent.h     |     52 +
 .../Views/IntensityDataWidgets/ColorMapEvent.cpp   |     90 +
 .../Views/IntensityDataWidgets/ColorMapEvent.h     |     52 +
 .../Views/IntensityDataWidgets/ColorMapHelper.cpp  |     76 +
 .../Views/IntensityDataWidgets/ColorMapHelper.h    |     47 +
 .../Views/IntensityDataWidgets/ColorMapLabel.cpp   |     97 +
 .../Views/IntensityDataWidgets/ColorMapLabel.h     |     59 +
 .../Views/IntensityDataWidgets/ColorMapPlot.cpp    |    670 +
 .../Views/IntensityDataWidgets/ColorMapPlot.h      |    145 +
 .../IntensityDataWidgets/HorizontalSlicePlot.cpp   |    205 +
 .../IntensityDataWidgets/HorizontalSlicePlot.h     |     63 +
 .../IntensityDataPropertyWidget.cpp                |    113 +
 .../IntensityDataPropertyWidget.h                  |     54 +
 .../IntensityDataWidgets/IntensityDataWidget.cpp   |     89 +
 .../IntensityDataWidgets/IntensityDataWidget.h     |     57 +
 .../ObsoleteIntensityDataPlotWidget.cpp            |    302 +
 .../ObsoleteIntensityDataPlotWidget.h              |     85 +
 .../ObsoleteIntensityDataWidget.cpp                |    119 +
 .../ObsoleteIntensityDataWidget.h                  |     59 +
 .../ObsoleteIntensityDataWidgetActions.cpp         |     62 +
 .../ObsoleteIntensityDataWidgetActions.h           |     49 +
 .../IntensityDataWidgets/SavePlotAssistant.cpp     |    160 +
 .../Views/IntensityDataWidgets/SavePlotAssistant.h |     56 +
 .../IntensityDataWidgets/VerticalSlicePlot.cpp     |    201 +
 .../Views/IntensityDataWidgets/VerticalSlicePlot.h |     65 +
 GUI/coregui/Views/JobView.cpp                      |    153 +
 GUI/coregui/Views/JobView.h                        |     68 +
 .../Views/JobWidgets/JobActivityStatusBar.cpp      |     84 +
 .../Views/JobWidgets/JobActivityStatusBar.h        |     53 +
 .../Views/JobWidgets/JobListViewDelegate.cpp       |    174 +
 GUI/coregui/Views/JobWidgets/JobListViewDelegate.h |     54 +
 GUI/coregui/Views/JobWidgets/JobListWidget.cpp     |    217 +
 GUI/coregui/Views/JobWidgets/JobListWidget.h       |     65 +
 GUI/coregui/Views/JobWidgets/JobMessagePanel.cpp   |     62 +
 GUI/coregui/Views/JobWidgets/JobMessagePanel.h     |     42 +
 .../Views/JobWidgets/JobOutputDataWidget.cpp       |     85 +
 GUI/coregui/Views/JobWidgets/JobOutputDataWidget.h |     47 +
 .../Views/JobWidgets/JobProgressAssistant.cpp      |     45 +
 .../Views/JobWidgets/JobProgressAssistant.h        |     40 +
 .../Views/JobWidgets/JobPropertiesWidget.cpp       |     99 +
 GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h |     57 +
 .../Views/JobWidgets/JobRealTimeToolBar.cpp        |     33 +
 GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.h  |     39 +
 GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp |     96 +
 GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h   |     52 +
 .../Views/JobWidgets/JobResultsPresenter.cpp       |     45 +
 GUI/coregui/Views/JobWidgets/JobResultsPresenter.h |     41 +
 .../Views/JobWidgets/JobSelectorActions.cpp        |    133 +
 GUI/coregui/Views/JobWidgets/JobSelectorActions.h  |     59 +
 GUI/coregui/Views/JobWidgets/JobSelectorWidget.cpp |     89 +
 GUI/coregui/Views/JobWidgets/JobSelectorWidget.h   |     69 +
 GUI/coregui/Views/JobWidgets/JobViewActivities.cpp |     57 +
 GUI/coregui/Views/JobWidgets/JobViewActivities.h   |     42 +
 GUI/coregui/Views/JobWidgets/JobViewDocks.cpp      |    253 +
 GUI/coregui/Views/JobWidgets/JobViewDocks.h        |     94 +
 GUI/coregui/Views/JobWidgets/JobViewFlags.h        |     49 +
 .../Views/JobWidgets/ParameterTuningDelegate.cpp   |    298 +
 .../Views/JobWidgets/ParameterTuningDelegate.h     |     93 +
 .../Views/JobWidgets/ParameterTuningWidget.cpp     |    318 +
 .../Views/JobWidgets/ParameterTuningWidget.h       |     82 +
 .../Views/JobWidgets/SliderSettingsWidget.cpp      |     99 +
 .../Views/JobWidgets/SliderSettingsWidget.h        |     49 +
 .../Views/MaskWidgets/ColorMapSceneAdaptor.cpp     |     82 +
 .../Views/MaskWidgets/ColorMapSceneAdaptor.h       |     48 +
 GUI/coregui/Views/MaskWidgets/EllipseView.cpp      |    168 +
 GUI/coregui/Views/MaskWidgets/EllipseView.h        |     52 +
 GUI/coregui/Views/MaskWidgets/IMaskView.cpp        |    158 +
 GUI/coregui/Views/MaskWidgets/IMaskView.h          |     78 +
 GUI/coregui/Views/MaskWidgets/ISceneAdaptor.h      |     64 +
 .../Views/MaskWidgets/IntensityDataView.cpp        |     41 +
 GUI/coregui/Views/MaskWidgets/IntensityDataView.h  |     44 +
 GUI/coregui/Views/MaskWidgets/LineViews.cpp        |    159 +
 GUI/coregui/Views/MaskWidgets/LineViews.h          |     69 +
 GUI/coregui/Views/MaskWidgets/MaskAllView.cpp      |     53 +
 GUI/coregui/Views/MaskWidgets/MaskAllView.h        |     40 +
 .../Views/MaskWidgets/MaskContainerView.cpp        |     39 +
 GUI/coregui/Views/MaskWidgets/MaskContainerView.h  |     44 +
 .../Views/MaskWidgets/MaskDrawingContext.cpp       |    143 +
 GUI/coregui/Views/MaskWidgets/MaskDrawingContext.h |     64 +
 GUI/coregui/Views/MaskWidgets/MaskEditor.cpp       |    161 +
 GUI/coregui/Views/MaskWidgets/MaskEditor.h         |     67 +
 .../Views/MaskWidgets/MaskEditorActions.cpp        |    218 +
 GUI/coregui/Views/MaskWidgets/MaskEditorActions.h  |     85 +
 GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.cpp |    130 +
 GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.h   |     66 +
 GUI/coregui/Views/MaskWidgets/MaskEditorFlags.h    |     65 +
 GUI/coregui/Views/MaskWidgets/MaskEditorHelper.cpp |     62 +
 GUI/coregui/Views/MaskWidgets/MaskEditorHelper.h   |     57 +
 .../Views/MaskWidgets/MaskEditorPropertyPanel.cpp  |    191 +
 .../Views/MaskWidgets/MaskEditorPropertyPanel.h    |     73 +
 .../Views/MaskWidgets/MaskEditorToolBar.cpp        |    238 +
 GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.h  |     67 +
 .../Views/MaskWidgets/MaskGraphicsProxy.cpp        |     95 +
 GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.h  |     59 +
 .../Views/MaskWidgets/MaskGraphicsScene.cpp        |    740 +
 GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h  |    125 +
 GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp |    167 +
 GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h   |     62 +
 .../Views/MaskWidgets/MaskResultsPresenter.cpp     |    128 +
 .../Views/MaskWidgets/MaskResultsPresenter.h       |     58 +
 .../Views/MaskWidgets/MaskUnitsConverter.cpp       |    145 +
 GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.h |     57 +
 GUI/coregui/Views/MaskWidgets/MaskViewFactory.cpp  |     84 +
 GUI/coregui/Views/MaskWidgets/MaskViewFactory.h    |     36 +
 GUI/coregui/Views/MaskWidgets/MaskWidgets.qrc      |     20 +
 GUI/coregui/Views/MaskWidgets/PolygonPointView.cpp |     79 +
 GUI/coregui/Views/MaskWidgets/PolygonPointView.h   |     54 +
 GUI/coregui/Views/MaskWidgets/PolygonView.cpp      |    208 +
 GUI/coregui/Views/MaskWidgets/PolygonView.h        |     59 +
 .../Views/MaskWidgets/RectangleBaseView.cpp        |    126 +
 GUI/coregui/Views/MaskWidgets/RectangleBaseView.h  |     67 +
 GUI/coregui/Views/MaskWidgets/RectangleView.cpp    |    133 +
 GUI/coregui/Views/MaskWidgets/RectangleView.h      |     52 +
 .../Views/MaskWidgets/RegionOfInterestView.cpp     |     30 +
 .../Views/MaskWidgets/RegionOfInterestView.h       |     37 +
 .../Views/MaskWidgets/SizeHandleElement.cpp        |    178 +
 GUI/coregui/Views/MaskWidgets/SizeHandleElement.h  |     77 +
 .../Views/MaskWidgets/images/maskeditor_arrow.svg  |    542 +
 .../MaskWidgets/images/maskeditor_bringtofront.svg |    227 +
 .../MaskWidgets/images/maskeditor_details.svg      |    116 +
 .../MaskWidgets/images/maskeditor_ellipse.svg      |    495 +
 .../Views/MaskWidgets/images/maskeditor_hand.svg   |    562 +
 .../images/maskeditor_horizontalline.svg           |    102 +
 .../MaskWidgets/images/maskeditor_lightbulb.svg    |    376 +
 .../MaskWidgets/images/maskeditor_maskall.svg      |    606 +
 .../MaskWidgets/images/maskeditor_maskfalse.svg    |    237 +
 .../MaskWidgets/images/maskeditor_masktrue.svg     |    186 +
 .../MaskWidgets/images/maskeditor_polygon.svg      |    501 +
 .../MaskWidgets/images/maskeditor_rectangle.svg    |    554 +
 .../MaskWidgets/images/maskeditor_refresh.svg      |    341 +
 .../Views/MaskWidgets/images/maskeditor_roi.svg    |    554 +
 .../MaskWidgets/images/maskeditor_sendtoback.svg   |    227 +
 .../MaskWidgets/images/maskeditor_toolpanel.svg    |    157 +
 .../MaskWidgets/images/maskeditor_verticalline.svg |    101 +
 .../Views/MaterialEditor/MaterialEditor.cpp        |    159 +
 GUI/coregui/Views/MaterialEditor/MaterialEditor.h  |     71 +
 .../Views/MaterialEditor/MaterialEditorDialog.cpp  |    134 +
 .../Views/MaterialEditor/MaterialEditorDialog.h    |     54 +
 .../Views/MaterialEditor/MaterialEditorToolBar.cpp |    117 +
 .../Views/MaterialEditor/MaterialEditorToolBar.h   |     56 +
 .../Views/MaterialEditor/MaterialProperty.cpp      |     57 +
 .../Views/MaterialEditor/MaterialProperty.h        |     58 +
 GUI/coregui/Views/MaterialEditor/MaterialSvc.cpp   |    129 +
 GUI/coregui/Views/MaterialEditor/MaterialSvc.h     |     61 +
 GUI/coregui/Views/MaterialEditor/MaterialUtils.cpp |     71 +
 GUI/coregui/Views/MaterialEditor/MaterialUtils.h   |     40 +
 .../Views/PropertyEditor/ComponentBoxEditor.cpp    |    105 +
 .../Views/PropertyEditor/ComponentBoxEditor.h      |     44 +
 .../Views/PropertyEditor/ComponentEditor.cpp       |    259 +
 GUI/coregui/Views/PropertyEditor/ComponentEditor.h |     67 +
 .../Views/PropertyEditor/ComponentEditorFlags.h    |     45 +
 .../PropertyEditor/ComponentEditorPrivate.cpp      |    269 +
 .../Views/PropertyEditor/ComponentEditorPrivate.h  |     83 +
 .../Views/PropertyEditor/PropertyBrowserUtils.cpp  |    370 +
 .../Views/PropertyEditor/PropertyBrowserUtils.h    |    167 +
 .../PropertyEditor/PropertyVariantFactory.cpp      |    426 +
 .../Views/PropertyEditor/PropertyVariantFactory.h  |     90 +
 .../PropertyEditor/PropertyVariantManager.cpp      |    251 +
 .../Views/PropertyEditor/PropertyVariantManager.h  |     66 +
 .../Views/SampleDesigner/ConnectableView.cpp       |    194 +
 GUI/coregui/Views/SampleDesigner/ConnectableView.h |     94 +
 .../Views/SampleDesigner/DesignerHelper.cpp        |    270 +
 GUI/coregui/Views/SampleDesigner/DesignerHelper.h  |    123 +
 .../Views/SampleDesigner/DesignerMimeData.cpp      |    114 +
 .../Views/SampleDesigner/DesignerMimeData.h        |     50 +
 GUI/coregui/Views/SampleDesigner/DesignerScene.cpp |    557 +
 GUI/coregui/Views/SampleDesigner/DesignerScene.h   |    120 +
 GUI/coregui/Views/SampleDesigner/DesignerView.cpp  |    142 +
 GUI/coregui/Views/SampleDesigner/DesignerView.h    |     67 +
 GUI/coregui/Views/SampleDesigner/ILayerView.cpp    |    244 +
 GUI/coregui/Views/SampleDesigner/ILayerView.h      |     73 +
 GUI/coregui/Views/SampleDesigner/IView.cpp         |    102 +
 GUI/coregui/Views/SampleDesigner/IView.h           |     69 +
 .../SampleDesigner/InterferenceFunctionViews.cpp   |     60 +
 .../SampleDesigner/InterferenceFunctionViews.h     |     72 +
 GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp  |     57 +
 GUI/coregui/Views/SampleDesigner/ItemTreeView.h    |     37 +
 GUI/coregui/Views/SampleDesigner/LayerView.cpp     |     77 +
 GUI/coregui/Views/SampleDesigner/LayerView.h       |     39 +
 .../Views/SampleDesigner/MultiLayerView.cpp        |    289 +
 GUI/coregui/Views/SampleDesigner/MultiLayerView.h  |     70 +
 GUI/coregui/Views/SampleDesigner/NodeEditor.cpp    |    143 +
 GUI/coregui/Views/SampleDesigner/NodeEditor.h      |     65 +
 .../Views/SampleDesigner/NodeEditorConnection.cpp  |    142 +
 .../Views/SampleDesigner/NodeEditorConnection.h    |     70 +
 .../Views/SampleDesigner/NodeEditorPort.cpp        |    129 +
 GUI/coregui/Views/SampleDesigner/NodeEditorPort.h  |    100 +
 .../SampleDesigner/ParticleCompositionView.cpp     |     45 +
 .../Views/SampleDesigner/ParticleCompositionView.h |     40 +
 .../Views/SampleDesigner/ParticleCoreShellView.cpp |     54 +
 .../Views/SampleDesigner/ParticleCoreShellView.h   |     40 +
 .../SampleDesigner/ParticleDistributionView.cpp    |     42 +
 .../SampleDesigner/ParticleDistributionView.h      |     40 +
 .../Views/SampleDesigner/ParticleLayoutView.cpp    |     59 +
 .../Views/SampleDesigner/ParticleLayoutView.h      |     35 +
 GUI/coregui/Views/SampleDesigner/ParticleView.cpp  |    110 +
 GUI/coregui/Views/SampleDesigner/ParticleView.h    |     52 +
 .../Views/SampleDesigner/SampleDesigner.cpp        |     61 +
 GUI/coregui/Views/SampleDesigner/SampleDesigner.h  |     74 +
 .../Views/SampleDesigner/SampleDesigner.qrc        |     13 +
 .../Views/SampleDesigner/SamplePropertyWidget.cpp  |     88 +
 .../Views/SampleDesigner/SamplePropertyWidget.h    |     53 +
 GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp |    150 +
 GUI/coregui/Views/SampleDesigner/SampleToolBar.h   |     63 +
 .../Views/SampleDesigner/SampleViewAligner.cpp     |    199 +
 .../Views/SampleDesigner/SampleViewAligner.h       |     56 +
 .../Views/SampleDesigner/SampleViewFactory.cpp     |    101 +
 .../Views/SampleDesigner/SampleViewFactory.h       |     39 +
 .../Views/SampleDesigner/SampleWidgetBox.cpp       |     50 +
 GUI/coregui/Views/SampleDesigner/SampleWidgetBox.h |     37 +
 .../Views/SampleDesigner/TransformationView.cpp    |     30 +
 .../Views/SampleDesigner/TransformationView.h      |     35 +
 .../Views/SampleDesigner/images/toolbar_align.png  |    Bin 0 -> 318 bytes
 .../Views/SampleDesigner/images/toolbar_center.png |    Bin 0 -> 1684 bytes
 .../Views/SampleDesigner/images/toolbar_hand.png   |    Bin 0 -> 613 bytes
 .../images/toolbar_materialeditor.png              |    Bin 0 -> 596 bytes
 .../SampleDesigner/images/toolbar_pointer.png      |    Bin 0 -> 596 bytes
 .../SampleDesigner/images/toolbar_recycle.png      |    Bin 0 -> 670 bytes
 .../SampleDesigner/images/toolbar_recycle_dark.png |    Bin 0 -> 713 bytes
 .../Views/SampleDesigner/images/toolbar_redo.png   |    Bin 0 -> 646 bytes
 .../Views/SampleDesigner/images/toolbar_unddo.png  |    Bin 0 -> 666 bytes
 GUI/coregui/Views/SampleView.cpp                   |    333 +
 GUI/coregui/Views/SampleView.h                     |    106 +
 GUI/coregui/Views/SampleViewComponents.cpp         |     39 +
 GUI/coregui/Views/SampleViewComponents.h           |     51 +
 GUI/coregui/Views/SessionModelView.cpp             |    129 +
 GUI/coregui/Views/SessionModelView.h               |     72 +
 GUI/coregui/Views/SimulationView.cpp               |     50 +
 GUI/coregui/Views/SimulationView.h                 |     47 +
 .../Views/SimulationWidgets/PythonScriptWidget.cpp |    181 +
 .../Views/SimulationWidgets/PythonScriptWidget.h   |     62 +
 .../SimulationDataSelectorWidget.cpp               |    171 +
 .../SimulationDataSelectorWidget.h                 |     59 +
 .../SimulationWidgets/SimulationOptionsWidget.cpp  |     50 +
 .../SimulationWidgets/SimulationOptionsWidget.h    |     44 +
 .../SimulationWidgets/SimulationSetupAssistant.cpp |    101 +
 .../SimulationWidgets/SimulationSetupAssistant.h   |     49 +
 .../SimulationWidgets/SimulationSetupWidget.cpp    |    141 +
 .../SimulationWidgets/SimulationSetupWidget.h      |     59 +
 GUI/coregui/Views/TestComponentView.cpp            |    120 +
 GUI/coregui/Views/TestComponentView.h              |     49 +
 GUI/coregui/Views/TestView.cpp                     |    197 +
 GUI/coregui/Views/TestView.h                       |     43 +
 GUI/coregui/Views/WelcomeView.cpp                  |    304 +
 GUI/coregui/Views/WelcomeView.h                    |     59 +
 GUI/coregui/Views/widgetbox/deviceprofile_p.h      |    152 +
 GUI/coregui/Views/widgetbox/formwindowbase_p.h     |    197 +
 GUI/coregui/Views/widgetbox/images/Lattice1D.png   |    Bin 0 -> 1186 bytes
 GUI/coregui/Views/widgetbox/images/Lattice2D.png   |    Bin 0 -> 1839 bytes
 GUI/coregui/Views/widgetbox/images/Layer.png       |    Bin 0 -> 2046 bytes
 GUI/coregui/Views/widgetbox/images/MultiLayer.png  |    Bin 0 -> 850 bytes
 .../Views/widgetbox/images/ParaCrystal1D.png       |    Bin 0 -> 1406 bytes
 .../Views/widgetbox/images/ParaCrystal2D.png       |    Bin 0 -> 1603 bytes
 .../Views/widgetbox/images/ParticleComposition.png |    Bin 0 -> 1211 bytes
 .../Views/widgetbox/images/ParticleCoreShell.png   |    Bin 0 -> 2242 bytes
 .../Views/widgetbox/images/ParticleLayout.png      |    Bin 0 -> 980 bytes
 .../Views/widgetbox/images/SizeDistribution.png    |    Bin 0 -> 1707 bytes
 .../Views/widgetbox/images/Transformation.png      |    Bin 0 -> 33896 bytes
 .../Views/widgetbox/images/ff_AnisoPyramid_32.png  |    Bin 0 -> 2310 bytes
 GUI/coregui/Views/widgetbox/images/ff_Box_32.png   |    Bin 0 -> 2343 bytes
 GUI/coregui/Views/widgetbox/images/ff_Cone6_32.png |    Bin 0 -> 2129 bytes
 GUI/coregui/Views/widgetbox/images/ff_Cone_32.png  |    Bin 0 -> 2095 bytes
 .../Views/widgetbox/images/ff_Cuboctahedron_32.png |    Bin 0 -> 2415 bytes
 .../Views/widgetbox/images/ff_Cylinder_32.png      |    Bin 0 -> 2072 bytes
 .../Views/widgetbox/images/ff_Dodecahedron_32.png  |    Bin 0 -> 1804 bytes
 .../widgetbox/images/ff_EllipsoidalCylinder_32.png |    Bin 0 -> 2118 bytes
 .../Views/widgetbox/images/ff_FullSphere_32.png    |    Bin 0 -> 2273 bytes
 .../Views/widgetbox/images/ff_FullSpheroid_32.png  |    Bin 0 -> 1981 bytes
 .../Views/widgetbox/images/ff_HemiEllipsoid_32.png |    Bin 0 -> 2134 bytes
 .../Views/widgetbox/images/ff_Icosahedron_32.png   |    Bin 0 -> 1658 bytes
 .../Views/widgetbox/images/ff_Prism3_32.png        |    Bin 0 -> 2156 bytes
 .../Views/widgetbox/images/ff_Prism6_32.png        |    Bin 0 -> 2167 bytes
 .../Views/widgetbox/images/ff_Pyramid_32.png       |    Bin 0 -> 2334 bytes
 .../Views/widgetbox/images/ff_Ripple1_32.png       |    Bin 0 -> 1961 bytes
 .../Views/widgetbox/images/ff_Ripple2_32.png       |    Bin 0 -> 1955 bytes
 .../Views/widgetbox/images/ff_Tetrahedron_32.png   |    Bin 0 -> 2126 bytes
 .../Views/widgetbox/images/ff_TruncatedCube_32.png |    Bin 0 -> 2101 bytes
 .../widgetbox/images/ff_TruncatedSphere_32.png     |    Bin 0 -> 2090 bytes
 .../widgetbox/images/ff_TruncatedSpheroid_32.png   |    Bin 0 -> 1838 bytes
 .../Views/widgetbox/images/sample_layers2.png      |    Bin 0 -> 786 bytes
 .../Views/widgetbox/images/sample_layers3.png      |    Bin 0 -> 586 bytes
 .../Views/widgetbox/images/toolbar_redo.png        |    Bin 0 -> 11245 bytes
 GUI/coregui/Views/widgetbox/qdesigner_dnditem_p.h  |    147 +
 .../Views/widgetbox/qdesigner_formbuilder_p.h      |    176 +
 GUI/coregui/Views/widgetbox/qdesigner_utils_p.h    |    521 +
 .../Views/widgetbox/qdesigner_widgetbox_p.h        |    101 +
 GUI/coregui/Views/widgetbox/qsimpleresource_p.h    |    154 +
 GUI/coregui/Views/widgetbox/shared_enums_p.h       |     99 +
 GUI/coregui/Views/widgetbox/shared_global_p.h      |     76 +
 GUI/coregui/Views/widgetbox/sheet_delegate_p.h     |     87 +
 GUI/coregui/Views/widgetbox/spacer_widget_p.h      |    119 +
 GUI/coregui/Views/widgetbox/ui4_p.h                |   3627 +
 GUI/coregui/Views/widgetbox/widgetbox.cpp          |    313 +
 GUI/coregui/Views/widgetbox/widgetbox.h            |    109 +
 GUI/coregui/Views/widgetbox/widgetbox.qrc          |     38 +
 GUI/coregui/Views/widgetbox/widgetbox.xml          |    362 +
 GUI/coregui/Views/widgetbox/widgetbox_dnditem.cpp  |    254 +
 GUI/coregui/Views/widgetbox/widgetbox_dnditem.h    |     69 +
 GUI/coregui/Views/widgetbox/widgetbox_global.h     |     57 +
 .../Views/widgetbox/widgetboxcategorylistview.cpp  |    561 +
 .../Views/widgetbox/widgetboxcategorylistview.h    |    122 +
 .../Views/widgetbox/widgetboxtreewidget.cpp        |   1060 +
 GUI/coregui/Views/widgetbox/widgetboxtreewidget.h  |    151 +
 GUI/coregui/coregui.qrc                            |     50 +
 GUI/coregui/images/BornAgain.ico                   |    Bin 0 -> 370070 bytes
 GUI/coregui/images/BornAgain_48x48.png             |    Bin 0 -> 3587 bytes
 GUI/coregui/images/BornAgain_64x64.png             |    Bin 0 -> 5237 bytes
 GUI/coregui/images/about_icon.png                  |    Bin 0 -> 14461 bytes
 GUI/coregui/images/closebutton.png                 |    Bin 0 -> 288 bytes
 GUI/coregui/images/collapse_arrow.png              |    Bin 0 -> 482 bytes
 GUI/coregui/images/darkarrowdown.png               |    Bin 0 -> 333 bytes
 GUI/coregui/images/darkarrowup.png                 |    Bin 0 -> 386 bytes
 GUI/coregui/images/darkclose.png                   |    Bin 0 -> 398 bytes
 GUI/coregui/images/darkclosebutton.png             |    Bin 0 -> 348 bytes
 GUI/coregui/images/expand_arrow.png                |    Bin 0 -> 426 bytes
 GUI/coregui/images/filenew.png                     |    Bin 0 -> 977 bytes
 GUI/coregui/images/gisas_instrument.png            |    Bin 0 -> 13558 bytes
 GUI/coregui/images/gisas_instrument_bw.png         |    Bin 0 -> 7800 bytes
 GUI/coregui/images/magnifier.png                   |    Bin 0 -> 439 bytes
 GUI/coregui/images/main_importview.svg             |    222 +
 GUI/coregui/images/main_instrumentview.svg         |    353 +
 GUI/coregui/images/main_jobview.svg                |    338 +
 GUI/coregui/images/main_sampleview.svg             |    207 +
 GUI/coregui/images/main_sessionmodel.svg           |    323 +
 GUI/coregui/images/main_simulationview.svg         |    149 +
 GUI/coregui/images/main_welcomeview.svg            |    203 +
 GUI/coregui/images/mode_script.png                 |    Bin 0 -> 1703 bytes
 GUI/coregui/images/reset.png                       |    Bin 0 -> 515 bytes
 GUI/coregui/images/splashscreen.png                |    Bin 0 -> 188122 bytes
 GUI/coregui/images/statusbar_dockmenu.svg          |    191 +
 GUI/coregui/images/statusbar_joblist.svg           |    155 +
 GUI/coregui/images/toolbar16light_cloneitem.svg    |    458 +
 GUI/coregui/images/toolbar16light_newitem.svg      |    460 +
 GUI/coregui/images/toolbar16light_projections.svg  |    173 +
 .../images/toolbar16light_propertypanel.svg        |    153 +
 GUI/coregui/images/toolbar16light_recycle.svg      |    184 +
 GUI/coregui/images/toolbar16light_refresh.svg      |    341 +
 GUI/coregui/images/toolbar16light_run.svg          |    212 +
 GUI/coregui/images/toolbar16light_save.svg         |    482 +
 GUI/coregui/images/toolbar32dark_cloneitem.svg     |    583 +
 GUI/coregui/images/toolbar32dark_newitem.svg       |    584 +
 GUI/coregui/images/toolbar32dark_remove.svg        |    580 +
 .../images/toolbar_expand_collapse_tree.svg        |    310 +
 GUI/coregui/images/toolbar_newitem.png             |    Bin 0 -> 613 bytes
 GUI/coregui/images/toolbar_newitem_dark.png        |    Bin 0 -> 708 bytes
 GUI/coregui/images/treeview-branch-closed.png      |    Bin 0 -> 334 bytes
 GUI/coregui/images/treeview-branch-end.png         |    Bin 0 -> 182 bytes
 GUI/coregui/images/treeview-branch-more.png        |    Bin 0 -> 136 bytes
 GUI/coregui/images/treeview-branch-open.png        |    Bin 0 -> 346 bytes
 GUI/coregui/images/treeview-vline.png              |    Bin 0 -> 124 bytes
 GUI/coregui/images/warning at 2x.png                  |    Bin 0 -> 719 bytes
 GUI/coregui/images/warning_64x64.png               |    Bin 0 -> 5636 bytes
 GUI/coregui/mainwindow/AppSvc.cpp                  |     60 +
 GUI/coregui/mainwindow/AppSvc.h                    |     44 +
 GUI/coregui/mainwindow/SplashScreen.cpp            |     64 +
 GUI/coregui/mainwindow/SplashScreen.h              |     41 +
 GUI/coregui/mainwindow/StyledToolBar.cpp           |     44 +
 GUI/coregui/mainwindow/StyledToolBar.h             |     35 +
 GUI/coregui/mainwindow/UpdateNotifier.cpp          |     93 +
 GUI/coregui/mainwindow/UpdateNotifier.h            |     45 +
 GUI/coregui/mainwindow/aboutapplicationdialog.cpp  |    115 +
 GUI/coregui/mainwindow/aboutapplicationdialog.h    |     35 +
 GUI/coregui/mainwindow/actionmanager.cpp           |    206 +
 GUI/coregui/mainwindow/actionmanager.h             |     71 +
 GUI/coregui/mainwindow/mainwindow.cpp              |    322 +
 GUI/coregui/mainwindow/mainwindow.h                |    111 +
 GUI/coregui/mainwindow/mainwindow_constants.h      |     84 +
 GUI/coregui/mainwindow/newprojectdialog.cpp        |    209 +
 GUI/coregui/mainwindow/newprojectdialog.h          |     65 +
 GUI/coregui/mainwindow/projectdocument.cpp         |    283 +
 GUI/coregui/mainwindow/projectdocument.h           |    115 +
 GUI/coregui/mainwindow/projectmanager.cpp          |    362 +
 GUI/coregui/mainwindow/projectmanager.h            |     85 +
 GUI/coregui/mainwindow/tooltipdatabase.cpp         |    148 +
 GUI/coregui/mainwindow/tooltipdatabase.h           |     60 +
 GUI/coregui/mainwindow/tooltips.xml                |    592 +
 GUI/coregui/utils/CustomEventFilters.cpp           |     98 +
 GUI/coregui/utils/CustomEventFilters.h             |     68 +
 GUI/coregui/utils/FancyLabel.cpp                   |     70 +
 GUI/coregui/utils/FancyLabel.h                     |     46 +
 GUI/coregui/utils/GUIHelpers.cpp                   |    240 +
 GUI/coregui/utils/GUIHelpers.h                     |     93 +
 GUI/coregui/utils/GUIMessage.cpp                   |     45 +
 GUI/coregui/utils/GUIMessage.h                     |     41 +
 GUI/coregui/utils/IMessageService.h                |     31 +
 GUI/coregui/utils/ItemIDFactory.cpp                |     62 +
 GUI/coregui/utils/ItemIDFactory.h                  |     50 +
 GUI/coregui/utils/MessageContainer.cpp             |     74 +
 GUI/coregui/utils/MessageContainer.h               |     51 +
 GUI/coregui/utils/WarningMessageService.cpp        |    115 +
 GUI/coregui/utils/WarningMessageService.h          |     60 +
 GUI/coregui/utils/hostosinfo.h                     |    124 +
 GUI/coregui/utils/qstringutils.cpp                 |     41 +
 GUI/coregui/utils/qstringutils.h                   |     30 +
 GUI/crashhandler/CMakeLists.txt                    |     37 +
 GUI/crashhandler/crashhandler.cpp                  |     16 +
 GUI/crashhandler/crashhandler.h                    |     14 +
 GUI/crashhandler/crashhandlerdialog.cpp            |     66 +
 GUI/crashhandler/crashhandlerdialog.h              |     39 +
 GUI/crashhandler/main.cpp                          |     66 +
 GUI/crashhandler/qtcreatorcrashhandler.qbs         |     22 +
 GUI/crashhandler/utils.cpp                         |     43 +
 GUI/crashhandler/utils.h                           |     41 +
 GUI/main/BornAgain.icns                            |    Bin 0 -> 271769 bytes
 GUI/main/BornAgain.ico                             |    Bin 0 -> 370070 bytes
 GUI/main/CMakeLists.txt                            |    133 +
 GUI/main/appoptions.cpp                            |     93 +
 GUI/main/appoptions.h                              |     73 +
 GUI/main/bornagain.rc                              |      1 +
 GUI/main/crashhandlersetup.cpp                     |    151 +
 GUI/main/crashhandlersetup.h                       |     36 +
 GUI/main/main.cpp                                  |     76 +
 GUI/main/stacktracesetup.cpp                       |    202 +
 GUI/main/stacktracesetup.h                         |     11 +
 INSTALL                                            |     42 +
 README.md                                          |     15 +
 Tests/Functional/CMakeLists.txt                    |     28 +
 Tests/Functional/Core/BatchSimulation.cpp          |     49 +
 Tests/Functional/Core/CMakeLists.txt               |     97 +
 Tests/Functional/Core/CoreStandardTest.cpp         |     32 +
 Tests/Functional/Core/CoreTest.cpp                 |     69 +
 Tests/Functional/Core/CoreTest.h                   |     44 +
 Tests/Functional/Core/PolDWBAMagCylinders2.cpp     |     65 +
 .../Functional/Fit/AdjustMinimizerStrategyTest.cpp |     55 +
 Tests/Functional/Fit/AdjustMinimizerStrategyTest.h |     35 +
 Tests/Functional/Fit/CMakeLists.txt                |     42 +
 Tests/Functional/Fit/FitParameterPlan.cpp          |     40 +
 Tests/Functional/Fit/FitParameterPlan.h            |     41 +
 Tests/Functional/Fit/FitTest.cpp                   |     39 +
 Tests/Functional/Fit/IMinimizerTest.cpp            |    130 +
 Tests/Functional/Fit/IMinimizerTest.h              |     58 +
 Tests/Functional/Fit/MinimizerTests.cpp            |     91 +
 Tests/Functional/Fit/MinimizerTests.h              |     76 +
 Tests/Functional/Fit/ObjectiveFunctionPlan.cpp     |     57 +
 Tests/Functional/Fit/ObjectiveFunctionPlan.h       |     67 +
 Tests/Functional/Fit/ObjectiveTestFunctions.cpp    |     68 +
 Tests/Functional/Fit/ObjectiveTestFunctions.h      |     36 +
 Tests/Functional/Fit/README                        |     10 +
 Tests/Functional/Fit/RectDetectorFitTest.cpp       |     58 +
 Tests/Functional/Fit/RectDetectorFitTest.h         |     37 +
 Tests/Functional/Fit/StandaloneFitPlan.cpp         |     75 +
 Tests/Functional/Fit/StandaloneFitPlan.h           |     52 +
 Tests/Functional/Fit/StandaloneFitTest.cpp         |     68 +
 Tests/Functional/Fit/StandaloneFitTest.h           |     50 +
 Tests/Functional/Fit/StandardFitsFactory.cpp       |     94 +
 Tests/Functional/Fit/StandardFitsFactory.h         |     39 +
 Tests/Functional/GUI/CMakeLists.txt                |     79 +
 Tests/Functional/GUI/GUIStandardTest.cpp           |     33 +
 Tests/Functional/GUI/GUITest.cpp                   |     80 +
 Tests/Functional/GUI/GUITest.h                     |     48 +
 .../GUI/GUITranslationTest/CMakeLists.txt          |     29 +
 .../GUI/GUITranslationTest/GUITranslationTest.cpp  |    188 +
 .../GUI/GUITranslationTest/GUITranslationTest.h    |     60 +
 Tests/Functional/GUI/GUITranslationTest/main.cpp   |     44 +
 Tests/Functional/PyCore/export/CMakeLists.txt      |     74 +
 .../PyCore/export/PyExportStandardTest.cpp         |     33 +
 Tests/Functional/PyCore/export/PyExportTest.cpp    |     74 +
 Tests/Functional/PyCore/export/PyExportTest.h      |     44 +
 Tests/Functional/PyCore/legacy/CMakeLists.txt      |     20 +
 Tests/Functional/PyCore/legacy/README              |      7 +
 Tests/Functional/PyCore/legacy/histogram2d.py      |     76 +
 Tests/Functional/PyCore/legacy/intensitydata.py    |     66 +
 Tests/Functional/PyCore/legacy/intensitydata_io.py |    149 +
 .../PyCore/legacy/intensitydata_io_tiff.py         |     64 +
 Tests/Functional/PyCore/legacy/mesocrystal1.py     |    179 +
 Tests/Functional/PyCore/legacy/polmagcylinders1.py |     72 +
 Tests/Functional/PyCore/legacy/polmagcylinders2.py |     92 +
 Tests/Functional/PyCore/legacy/ripple1.py          |     73 +
 Tests/Functional/PyCore/legacy/ripple2_asym.py     |     73 +
 Tests/Functional/PyCore/legacy/ripple2_sym.py      |     73 +
 .../PyCore/legacy/transform_BoxComposition.py      |    241 +
 .../PyCore/legacy/transform_CoreShellBox.py        |    214 +
 Tests/Functional/PyCore/legacy/transform_box.py    |     79 +
 Tests/Functional/PyCore/legacy/transform_cube.py   |    173 +
 Tests/Functional/PyCore/legacy/utils.py            |     73 +
 Tests/Functional/PyCore/persistence/CMakeLists.txt |     78 +
 .../PyCore/persistence/PyPersistenceTest.cpp       |    206 +
 .../PyCore/persistence/PyPersistenceTest.h         |     60 +
 .../PyCore/persistence/RunPyPersistenceTest.cpp    |     32 +
 Tests/Functional/PyFit/CMakeLists.txt              |     22 +
 Tests/Functional/PyFit/README                      |      8 +
 Tests/Functional/PyFit/fitsuite_api.py             |     73 +
 Tests/Functional/PyFit/fitting_utils.py            |     89 +
 Tests/Functional/PyFit/testfit_GSLLMA.py           |     22 +
 Tests/Functional/PyFit/testfit_GSLMultiMin.py      |     28 +
 Tests/Functional/PyFit/testfit_GSLSimAn.py         |     23 +
 Tests/Functional/PyFit/testfit_Genetic.py          |     33 +
 Tests/Functional/PyFit/testfit_Minuit2.py          |     28 +
 Tests/Functional/PyFit/testfit_UsingBuilder.py     |    156 +
 Tests/Functional/README                            |     13 +
 Tests/Functional/TestMachinery/CMakeLists.txt      |     59 +
 Tests/Functional/TestMachinery/IFunctionalTest.h   |     42 +
 Tests/Functional/TestMachinery/IReferencedTest.cpp |     65 +
 Tests/Functional/TestMachinery/IReferencedTest.h   |     45 +
 Tests/Functional/TestMachinery/IRegistry.h         |     60 +
 Tests/Functional/TestMachinery/IStandardTest.cpp   |    106 +
 Tests/Functional/TestMachinery/IStandardTest.h     |     80 +
 Tests/Functional/TestMachinery/SimulationInfo.cpp  |     36 +
 Tests/Functional/TestMachinery/SimulationInfo.h    |     45 +
 .../TestMachinery/StandardSimulationsRegistry.cpp  |    389 +
 .../TestMachinery/StandardSimulationsRegistry.h    |     42 +
 Tests/Functional/TestMachinery/SubtestRegistry.cpp |     98 +
 Tests/Functional/TestMachinery/SubtestRegistry.h   |     48 +
 Tests/PerformanceTests/README                      |     18 +
 Tests/PerformanceTests/test_performance.py         |    306 +
 .../IsGISAXS/FormFactors/isgi_aniso_pyramid_BA.ima |    100 +
 .../IsGISAXS/FormFactors/isgi_box_BA.ima           |    100 +
 .../IsGISAXS/FormFactors/isgi_box_BA.inp           |     74 +
 .../IsGISAXS/FormFactors/isgi_cone6_BA.ima         |    100 +
 .../IsGISAXS/FormFactors/isgi_cone6_BA.inp         |     74 +
 .../IsGISAXS/FormFactors/isgi_cone_BA.ima          |    100 +
 .../IsGISAXS/FormFactors/isgi_cone_BA.inp          |     74 +
 .../IsGISAXS/FormFactors/isgi_cuboctahedron_BA.ima |    100 +
 .../IsGISAXS/FormFactors/isgi_cylinder_BA.ima      |    100 +
 .../IsGISAXS/FormFactors/isgi_cylinder_BA.inp      |     74 +
 .../IsGISAXS/FormFactors/isgi_ellipsoid_BA.ima     |    100 +
 .../IsGISAXS/FormFactors/isgi_ellipsoid_BA.inp     |     74 +
 .../IsGISAXS/FormFactors/isgi_full_sphere_BA.ima   |    100 +
 .../IsGISAXS/FormFactors/isgi_full_sphere_BA.inp   |     74 +
 .../IsGISAXS/FormFactors/isgi_full_spheroid_BA.ima |    100 +
 .../FormFactors/isgi_hemi_ellipsoid_BA.ima         |    100 +
 .../FormFactors/isgi_parallelepiped_BA.ima         |    100 +
 .../FormFactors/isgi_parallelepiped_BA.inp         |     74 +
 .../IsGISAXS/FormFactors/isgi_prism3_BA.ima        |    100 +
 .../IsGISAXS/FormFactors/isgi_prism3_BA.inp        |     74 +
 .../IsGISAXS/FormFactors/isgi_prism6_BA.ima        |    100 +
 .../IsGISAXS/FormFactors/isgi_prism6_BA.inp        |     74 +
 .../IsGISAXS/FormFactors/isgi_pyramid_BA.ima       |    100 +
 .../IsGISAXS/FormFactors/isgi_pyramid_BA.inp       |     74 +
 .../IsGISAXS/FormFactors/isgi_sphere_BA.ima        |    100 +
 .../IsGISAXS/FormFactors/isgi_sphere_BA.inp        |     74 +
 .../IsGISAXS/FormFactors/isgi_spheroid_BA.ima      |    100 +
 .../IsGISAXS/FormFactors/isgi_tetrahedron_BA.ima   |    100 +
 .../IsGISAXS/FormFactors/isgi_tetrahedron_BA.inp   |     74 +
 Tests/ReferenceData/IsGISAXS/README                |     27 +
 .../ex-1/isgi_2-types-of-islands-ewald.ima.gz      |    Bin 0 -> 65205 bytes
 .../ex-1/isgi_2-types-of-islands-ewald.inp         |     82 +
 .../IsGISAXS/ex-1/isgi_2-types-of-islands.inp      |     82 +
 .../IsGISAXS/ex-10/isgi_para1dcyl.ima.gz           |    Bin 0 -> 71081 bytes
 .../IsGISAXS/ex-10/isgi_para1dcyl.inp              |     74 +
 .../IsGISAXS/ex-11/core_shell_qxqy.inp             |     74 +
 .../IsGISAXS/ex-11/isgi_core_shell_qxqy.ima.gz     |    Bin 0 -> 71282 bytes
 .../IsGISAXS/ex-12/isgi_fitconstraints.dat         |    819 +
 .../IsGISAXS/ex-12/isgi_fitconstraints.fit         |    129 +
 .../IsGISAXS/ex-12/isgi_fitconstraints.ima         |    100 +
 .../IsGISAXS/ex-12/isgi_fitconstraints.inp         |     82 +
 .../IsGISAXS/ex-12/isgi_fitconstraints.ki2         |   1319 +
 .../IsGISAXS/ex-12/isgi_fitconstraints.mat         |     31 +
 .../IsGISAXS/ex-12/isgi_fitconstraints.out         |    319 +
 .../ex-12/isgi_fitconstraints_optimal.ima.gz       |    Bin 0 -> 70513 bytes
 .../IsGISAXS/ex-12/isgi_fitconstraints_optimal.inp |     82 +
 Tests/ReferenceData/IsGISAXS/ex-13/README          |     17 +
 .../IsGISAXS/ex-13/isgi_simulated_annealing.dat    |    819 +
 .../IsGISAXS/ex-13/isgi_simulated_annealing.fit    |    108 +
 .../IsGISAXS/ex-13/isgi_simulated_annealing.inp    |     74 +
 .../IsGISAXS/ex-13/isgi_simulated_annealing.ki2    |    869 +
 .../IsGISAXS/ex-13/isgi_simulated_annealing.out    |    298 +
 Tests/ReferenceData/IsGISAXS/ex-15/SSCA-25.out     |  22583 ++++
 Tests/ReferenceData/IsGISAXS/ex-15/SSCA.inp        |     74 +
 Tests/ReferenceData/IsGISAXS/ex-15/isgi_SSCA.ima   |    150 +
 .../IsGISAXS/ex-2/isgi_bimodal.ima.gz              |    Bin 0 -> 70649 bytes
 Tests/ReferenceData/IsGISAXS/ex-2/isgi_bimodal.inp |     82 +
 .../IsGISAXS/ex-3/isgi_cylinder_BA.ima.gz          |    Bin 0 -> 71489 bytes
 .../IsGISAXS/ex-3/isgi_cylinder_BA.inp             |     74 +
 .../IsGISAXS/ex-3/isgi_cylinder_BA_qxqy.inp        |     74 +
 .../IsGISAXS/ex-3/isgi_cylinder_BA_size.ima.gz     |    Bin 0 -> 70741 bytes
 .../IsGISAXS/ex-3/isgi_cylinder_BA_size.inp        |     74 +
 .../IsGISAXS/ex-3/isgi_cylinder_DWBA.ima.gz        |    Bin 0 -> 70603 bytes
 .../IsGISAXS/ex-3/isgi_cylinder_DWBA.inp           |     74 +
 Tests/ReferenceData/IsGISAXS/ex-4/1DDL.inp         |     74 +
 Tests/ReferenceData/IsGISAXS/ex-4/2DDLh.inp        |     74 +
 Tests/ReferenceData/IsGISAXS/ex-4/isgi_1DDL.ima.gz |    Bin 0 -> 70803 bytes
 .../ReferenceData/IsGISAXS/ex-4/isgi_2DDLh.ima.gz  |    Bin 0 -> 71152 bytes
 Tests/ReferenceData/IsGISAXS/ex-5/README           |     19 +
 .../IsGISAXS/ex-5/isgi_fitexample.dat              |    819 +
 .../IsGISAXS/ex-5/isgi_fitexample.fit              |    108 +
 .../IsGISAXS/ex-5/isgi_fitexample.ima.gz           |    Bin 0 -> 70806 bytes
 .../IsGISAXS/ex-5/isgi_fitexample.inp              |     74 +
 .../IsGISAXS/ex-5/isgi_fitexample.out              |    298 +
 .../IsGISAXS/ex-6/isgi_centered.ima.gz             |    Bin 0 -> 71831 bytes
 .../IsGISAXS/ex-6/isgi_lattice.ima.gz              |    Bin 0 -> 71635 bytes
 .../IsGISAXS/ex-6/isgi_rotated.ima.gz              |    Bin 0 -> 71119 bytes
 .../IsGISAXS/ex-6/isgi_variants.ima.gz             |    Bin 0 -> 71216 bytes
 Tests/ReferenceData/IsGISAXS/ex-6/lattice.inp      |     74 +
 .../IsGISAXS/ex-6/lattice_centred.inp              |     74 +
 .../IsGISAXS/ex-6/lattice_rotated.inp              |     74 +
 .../IsGISAXS/ex-6/lattice_variants.inp             |     74 +
 .../IsGISAXS/ex-7/isgi_morphology.ima.gz           |    Bin 0 -> 34049 bytes
 Tests/ReferenceData/IsGISAXS/ex-7/morphology.inp   |     74 +
 Tests/ReferenceData/IsGISAXS/ex-7/morphology.mor   |     17 +
 .../IsGISAXS/ex-8/isgi_2DDL_lattice.ima.gz         |    Bin 0 -> 71263 bytes
 .../IsGISAXS/ex-8/isgi_2DDL_lattice2.ima.gz        |    Bin 0 -> 71790 bytes
 Tests/ReferenceData/IsGISAXS/ex-8/paracrystal.inp  |     74 +
 .../IsGISAXS/ex-8/paracrystal_cut.inp              |     74 +
 .../IsGISAXS/ex-9/isgi_pyramid_Z0.ima.gz           |    Bin 0 -> 68944 bytes
 .../IsGISAXS/ex-9/isgi_pyramid_Z0.inp              |     74 +
 .../IsGISAXS/ex-9/isgi_pyramid_Z45.ima.gz          |    Bin 0 -> 69147 bytes
 .../IsGISAXS/ex-9/isgi_pyramid_Z45.inp             |     74 +
 .../AllFormFactorsAvailable.AnisoPyramid.int.gz    |    Bin 0 -> 76327 bytes
 .../PyPersist/AllFormFactorsAvailable.Box.int.gz   |    Bin 0 -> 77605 bytes
 .../PyPersist/AllFormFactorsAvailable.Cone.int.gz  |    Bin 0 -> 76817 bytes
 .../PyPersist/AllFormFactorsAvailable.Cone6.int.gz |    Bin 0 -> 76413 bytes
 .../AllFormFactorsAvailable.Cuboctahedron.int.gz   |    Bin 0 -> 77338 bytes
 .../AllFormFactorsAvailable.Cylinder.int.gz        |    Bin 0 -> 77567 bytes
 .../AllFormFactorsAvailable.Dodecahedron.int.gz    |    Bin 0 -> 77096 bytes
 ...FormFactorsAvailable.EllipsoidalCylinder.int.gz |    Bin 0 -> 77807 bytes
 .../AllFormFactorsAvailable.FullSphere.int.gz      |    Bin 0 -> 76382 bytes
 .../AllFormFactorsAvailable.FullSpheroid.int.gz    |    Bin 0 -> 76202 bytes
 .../AllFormFactorsAvailable.HemiEllipsoid.int.gz   |    Bin 0 -> 75459 bytes
 .../AllFormFactorsAvailable.Icosahedron.int.gz     |    Bin 0 -> 76925 bytes
 .../AllFormFactorsAvailable.Prism3.int.gz          |    Bin 0 -> 77295 bytes
 .../AllFormFactorsAvailable.Prism6.int.gz          |    Bin 0 -> 77365 bytes
 .../AllFormFactorsAvailable.Pyramid.int.gz         |    Bin 0 -> 76171 bytes
 .../AllFormFactorsAvailable.Ripple1.int.gz         |    Bin 0 -> 77254 bytes
 .../AllFormFactorsAvailable.Ripple2.int.gz         |    Bin 0 -> 82372 bytes
 .../AllFormFactorsAvailable.Tetrahedron.int.gz     |    Bin 0 -> 76108 bytes
 .../AllFormFactorsAvailable.TruncatedCube.int.gz   |    Bin 0 -> 77705 bytes
 .../AllFormFactorsAvailable.TruncatedSphere.int.gz |    Bin 0 -> 75411 bytes
 ...llFormFactorsAvailable.TruncatedSpheroid.int.gz |    Bin 0 -> 75595 bytes
 .../PyPersist/ApproximationDA.ref.int.gz           |    Bin 0 -> 317745 bytes
 .../PyPersist/ApproximationLMA.ref.int.gz          |    Bin 0 -> 317913 bytes
 .../PyPersist/ApproximationSSCA.ref.int.gz         |    Bin 0 -> 318064 bytes
 .../PyPersist/AxesInDifferentUnits.bin.int.gz      |    Bin 0 -> 8050372 bytes
 .../PyPersist/AxesInDifferentUnits.deg.int.gz      |    Bin 0 -> 8050399 bytes
 .../PyPersist/AxesInDifferentUnits.mm.int.gz       |    Bin 0 -> 8050380 bytes
 .../PyPersist/AxesInDifferentUnits.nm-1.int.gz     |    Bin 0 -> 8050409 bytes
 .../PyPersist/BeamDivergence.ref.int.gz            |    Bin 0 -> 80308 bytes
 .../PyPersist/BuriedParticles.ref.int.gz           |    Bin 0 -> 315186 bytes
 .../PyPersist/CoreShellNanoparticles.ref.int.gz    |    Bin 0 -> 314666 bytes
 .../PyPersist/CorrelatedRoughness.ref.int.gz       |    Bin 0 -> 306158 bytes
 .../CosineRipplesAtRectLattice.ref.int.gz          |    Bin 0 -> 75832 bytes
 .../PyPersist/CustomFormFactor.ref.int.gz          |    Bin 0 -> 78128 bytes
 .../PyPersist/CylindersAndPrisms.ref.int.gz        |    Bin 0 -> 76181 bytes
 .../PyPersist/CylindersInBA.ref.int.gz             |    Bin 0 -> 316223 bytes
 .../PyPersist/CylindersInDWBA.ref.int.gz           |    Bin 0 -> 314428 bytes
 .../CylindersWithSizeDistribution.ref.int.gz       |    Bin 0 -> 319534 bytes
 .../DetectorResolutionFunction.ref.int.gz          |    Bin 0 -> 80316 bytes
 .../HexagonalLatticesWithBasis.ref.int.gz          |    Bin 0 -> 323346 bytes
 .../PyPersist/Interference1DLattice.ref.int.gz     |    Bin 0 -> 311039 bytes
 .../Interference1DRadialParaCrystal.ref.int.gz     |    Bin 0 -> 314538 bytes
 .../Interference2DCenteredSquareLattice.ref.int.gz |    Bin 0 -> 325280 bytes
 .../Interference2DLatticeSumOfRotated.ref.int.gz   |    Bin 0 -> 82082 bytes
 .../PyPersist/Interference2DParaCrystal.ref.int.gz |    Bin 0 -> 47498 bytes
 .../Interference2DRotatedSquareLattice.ref.int.gz  |    Bin 0 -> 322282 bytes
 .../Interference2DSquareLattice.ref.int.gz         |    Bin 0 -> 317800 bytes
 .../LargeParticlesFormFactor.LargeAn.int.gz        |    Bin 0 -> 323967 bytes
 .../LargeParticlesFormFactor.LargeMC.int.gz        |    Bin 0 -> 323556 bytes
 .../LargeParticlesFormFactor.SmallAn.int.gz        |    Bin 0 -> 319806 bytes
 .../LargeParticlesFormFactor.SmallMC.int.gz        |    Bin 0 -> 325750 bytes
 .../PyPersist/OffSpecularSimulation.ref.int.gz     |    Bin 0 -> 333800 bytes
 .../RectangularDetector.difference.int.gz          |    Bin 0 -> 8145674 bytes
 .../RectangularDetector.rectangular.int.gz         |    Bin 0 -> 8353627 bytes
 .../PyPersist/RectangularDetector.spherical.int.gz |    Bin 0 -> 8352519 bytes
 .../PyPersist/RectangularGrating.ref.int.gz        |    Bin 0 -> 323802 bytes
 .../PyPersist/RotatedPyramids.ref.int.gz           |    Bin 0 -> 309760 bytes
 .../PyPersist/SampleParametersIntro.0.int.gz       |    Bin 0 -> 76077 bytes
 .../PyPersist/SampleParametersIntro.1.int.gz       |    Bin 0 -> 76399 bytes
 .../PyPersist/SampleParametersIntro.2.int.gz       |    Bin 0 -> 77374 bytes
 .../PyPersist/SampleParametersIntro.3.int.gz       |    Bin 0 -> 76616 bytes
 .../PyPersist/SpecularSimulation.ref.yaml          |  12164 ++
 .../PyPersist/SpheresAtHexLattice.ref.int.gz       |    Bin 0 -> 320259 bytes
 .../PyPersist/TriangularRipple.ref.int.gz          |    Bin 0 -> 1254463 bytes
 ...TypesOfCylindersWithSizeDistribution.ref.int.gz |    Bin 0 -> 319711 bytes
 .../Special/polmagcylinders2_reference_00.int.gz   |    Bin 0 -> 76541 bytes
 .../Special/polmagcylinders2_reference_01.int.gz   |    Bin 0 -> 76525 bytes
 .../Special/polmagcylinders2_reference_10.int.gz   |    Bin 0 -> 76525 bytes
 .../Special/polmagcylinders2_reference_11.int.gz   |    Bin 0 -> 76541 bytes
 .../StandardSuite/ApproximationDA.int.gz           |    Bin 0 -> 3215 bytes
 .../StandardSuite/ApproximationLMA.int.gz          |    Bin 0 -> 3207 bytes
 .../StandardSuite/ApproximationSSCA.int.gz         |    Bin 0 -> 3205 bytes
 ...asic2DParaCrystal_FTDistribution2DCauchy.int.gz |    Bin 0 -> 5758 bytes
 .../Basic2DParaCrystal_FTDistribution2DCone.int.gz |    Bin 0 -> 5800 bytes
 .../Basic2DParaCrystal_FTDistribution2DGate.int.gz |    Bin 0 -> 5803 bytes
 ...Basic2DParaCrystal_FTDistribution2DGauss.int.gz |    Bin 0 -> 5796 bytes
 ...Basic2DParaCrystal_FTDistribution2DVoigt.int.gz |    Bin 0 -> 5771 bytes
 .../StandardSuite/BeamDivergence.int.gz            |    Bin 0 -> 3172 bytes
 .../StandardSuite/BoxCompositionRotateX.int.gz     |    Bin 0 -> 3278 bytes
 .../StandardSuite/BoxCompositionRotateY.int.gz     |    Bin 0 -> 3244 bytes
 .../StandardSuite/BoxCompositionRotateZ.int.gz     |    Bin 0 -> 3402 bytes
 .../StandardSuite/BoxCompositionRotateZandY.int.gz |    Bin 0 -> 3414 bytes
 .../StandardSuite/BoxStackComposition.int.gz       |    Bin 0 -> 3264 bytes
 .../StandardSuite/CenteredSquareLattice.int.gz     |    Bin 0 -> 5777 bytes
 .../StandardSuite/CoreShellBoxRotateZandY.int.gz   |    Bin 0 -> 3409 bytes
 .../StandardSuite/CoreShellParticle.int.gz         |    Bin 0 -> 3234 bytes
 .../StandardSuite/CosineRipple.int.gz              |    Bin 0 -> 3211 bytes
 .../StandardSuite/CustomMorphology.int.gz          |    Bin 0 -> 5309 bytes
 .../StandardSuite/CylindersAndPrisms.int.gz        |    Bin 0 -> 3197 bytes
 .../StandardSuite/CylindersInSSCA.int.gz           |    Bin 0 -> 3172 bytes
 .../CylindersWithSizeDistribution.int.gz           |    Bin 0 -> 3208 bytes
 .../StandardSuite/DetectorResolution.int.gz        |    Bin 0 -> 3461 bytes
 .../FormFactorsAbs_AnisoPyramid.int.gz             |    Bin 0 -> 5623 bytes
 .../StandardSuite/FormFactorsAbs_Box.int.gz        |    Bin 0 -> 5753 bytes
 .../StandardSuite/FormFactorsAbs_Cone.int.gz       |    Bin 0 -> 5632 bytes
 .../StandardSuite/FormFactorsAbs_Cone6.int.gz      |    Bin 0 -> 5627 bytes
 .../FormFactorsAbs_Cuboctahedron.int.gz            |    Bin 0 -> 5671 bytes
 .../StandardSuite/FormFactorsAbs_Cylinder.int.gz   |    Bin 0 -> 5732 bytes
 .../FormFactorsAbs_Dodecahedron.int.gz             |    Bin 0 -> 5672 bytes
 .../FormFactorsAbs_EllipsoidalCylinder.int.gz      |    Bin 0 -> 5758 bytes
 .../StandardSuite/FormFactorsAbs_FullSphere.int.gz |    Bin 0 -> 3331 bytes
 .../FormFactorsAbs_FullSpheroid.int.gz             |    Bin 0 -> 3340 bytes
 .../FormFactorsAbs_HemiEllipsoid.int.gz            |    Bin 0 -> 5694 bytes
 .../FormFactorsAbs_Icosahedron.int.gz              |    Bin 0 -> 5640 bytes
 .../StandardSuite/FormFactorsAbs_Prism3.int.gz     |    Bin 0 -> 5709 bytes
 .../StandardSuite/FormFactorsAbs_Prism6.int.gz     |    Bin 0 -> 5721 bytes
 .../StandardSuite/FormFactorsAbs_Pyramid.int.gz    |    Bin 0 -> 5612 bytes
 .../StandardSuite/FormFactorsAbs_Ripple1.int.gz    |    Bin 0 -> 5767 bytes
 .../StandardSuite/FormFactorsAbs_Ripple2.int.gz    |    Bin 0 -> 5739 bytes
 .../FormFactorsAbs_Tetrahedron.int.gz              |    Bin 0 -> 5604 bytes
 .../FormFactorsAbs_TruncatedCube.int.gz            |    Bin 0 -> 5710 bytes
 .../FormFactorsAbs_TruncatedSphere.int.gz          |    Bin 0 -> 5672 bytes
 .../FormFactorsAbs_TruncatedSpheroid.int.gz        |    Bin 0 -> 5674 bytes
 .../StandardSuite/FormFactors_AnisoPyramid.int.gz  |    Bin 0 -> 3153 bytes
 .../StandardSuite/FormFactors_Box.int.gz           |    Bin 0 -> 3279 bytes
 .../StandardSuite/FormFactors_Cone.int.gz          |    Bin 0 -> 3139 bytes
 .../StandardSuite/FormFactors_Cone6.int.gz         |    Bin 0 -> 3149 bytes
 .../StandardSuite/FormFactors_Cuboctahedron.int.gz |    Bin 0 -> 3221 bytes
 .../StandardSuite/FormFactors_Cylinder.int.gz      |    Bin 0 -> 3233 bytes
 .../StandardSuite/FormFactors_Dodecahedron.int.gz  |    Bin 0 -> 3255 bytes
 .../FormFactors_EllipsoidalCylinder.int.gz         |    Bin 0 -> 3413 bytes
 .../StandardSuite/FormFactors_FullSphere.int.gz    |    Bin 0 -> 3169 bytes
 .../StandardSuite/FormFactors_FullSpheroid.int.gz  |    Bin 0 -> 3166 bytes
 .../StandardSuite/FormFactors_HemiEllipsoid.int.gz |    Bin 0 -> 3195 bytes
 .../StandardSuite/FormFactors_Icosahedron.int.gz   |    Bin 0 -> 3255 bytes
 .../StandardSuite/FormFactors_Prism3.int.gz        |    Bin 0 -> 3217 bytes
 .../StandardSuite/FormFactors_Prism6.int.gz        |    Bin 0 -> 3267 bytes
 .../StandardSuite/FormFactors_Pyramid.int.gz       |    Bin 0 -> 3143 bytes
 .../StandardSuite/FormFactors_Ripple1.int.gz       |    Bin 0 -> 3210 bytes
 .../StandardSuite/FormFactors_Ripple2.int.gz       |    Bin 0 -> 3234 bytes
 .../StandardSuite/FormFactors_Tetrahedron.int.gz   |    Bin 0 -> 3127 bytes
 .../StandardSuite/FormFactors_TruncatedCube.int.gz |    Bin 0 -> 3277 bytes
 .../FormFactors_TruncatedSphere.int.gz             |    Bin 0 -> 3173 bytes
 .../FormFactors_TruncatedSpheroid.int.gz           |    Bin 0 -> 3175 bytes
 .../StandardSuite/HexParaCrystal.int.gz            |    Bin 0 -> 4688 bytes
 .../StandardSuite/LargeCylindersMonteCarlo.int.gz  |    Bin 0 -> 5732 bytes
 Tests/ReferenceData/StandardSuite/Lattice1D.int.gz |    Bin 0 -> 5754 bytes
 .../StandardSuite/MagneticParticleZeroField.int.gz |    Bin 0 -> 3247 bytes
 .../ReferenceData/StandardSuite/MesoCrystal.int.gz |    Bin 0 -> 4145 bytes
 .../StandardSuite/MultiLayerWithRoughness.int.gz   |    Bin 0 -> 3181 bytes
 .../StandardSuite/MultipleLayout.int.gz            |    Bin 0 -> 3193 bytes
 .../StandardSuite/ParticleComposition.int.gz       |    Bin 0 -> 5707 bytes
 .../StandardSuite/RadialParaCrystal.int.gz         |    Bin 0 -> 3230 bytes
 .../StandardSuite/RectDetWithRoi.int.gz            |    Bin 0 -> 3135 bytes
 .../StandardSuite/RectDetectorGeneric.int.gz       |    Bin 0 -> 10568 bytes
 .../RectDetectorPerpToDirectBeam.int.gz            |    Bin 0 -> 5488 bytes
 .../RectDetectorPerpToReflectedBeam.int.gz         |    Bin 0 -> 5695 bytes
 .../RectDetectorPerpToReflectedBeamDpos.int.gz     |    Bin 0 -> 5499 bytes
 .../StandardSuite/RectDetectorPerpToSample.int.gz  |    Bin 0 -> 5615 bytes
 .../StandardSuite/RectParaCrystal.int.gz           |    Bin 0 -> 3232 bytes
 .../StandardSuite/RotatedPyramids.int.gz           |    Bin 0 -> 3161 bytes
 .../StandardSuite/RotatedSquareLattice.int.gz      |    Bin 0 -> 5742 bytes
 .../StandardSuite/SimulationWithMasks.int.gz       |    Bin 0 -> 4051 bytes
 .../StandardSuite/SphericalDetWithRoi.int.gz       |    Bin 0 -> 2644 bytes
 .../StandardSuite/SquareLattice.int.gz             |    Bin 0 -> 3252 bytes
 .../StandardSuite/TransformBox.int.gz              |    Bin 0 -> 3422 bytes
 .../StandardSuite/TriangularRipple.int.gz          |    Bin 0 -> 3254 bytes
 .../TwoTypesCylindersDistribution.int.gz           |    Bin 0 -> 3183 bytes
 .../legacy/customformfactor_reference.int.gz       |    Bin 0 -> 80175 bytes
 .../legacy/ffba_anisopyramid_reference.int.gz      |    Bin 0 -> 70252 bytes
 .../ReferenceData/legacy/ffba_box_reference.int.gz |    Bin 0 -> 72828 bytes
 .../legacy/ffba_cone6_reference.int.gz             |    Bin 0 -> 70124 bytes
 .../legacy/ffba_cone_reference.int.gz              |    Bin 0 -> 70405 bytes
 .../legacy/ffba_cuboctahedron_reference.int.gz     |    Bin 0 -> 72504 bytes
 .../legacy/ffba_cylinder_reference.int.gz          |    Bin 0 -> 72696 bytes
 .../legacy/ffba_ellipscylinder_reference.int.gz    |    Bin 0 -> 72813 bytes
 .../legacy/ffba_fullsphere_reference.int.gz        |    Bin 0 -> 71807 bytes
 .../legacy/ffba_fullspheroid_reference.int.gz      |    Bin 0 -> 71189 bytes
 .../legacy/ffba_hemiellipsoid_reference.int.gz     |    Bin 0 -> 68829 bytes
 .../legacy/ffba_prism3_reference.int.gz            |    Bin 0 -> 71677 bytes
 .../legacy/ffba_prism6_reference.int.gz            |    Bin 0 -> 72676 bytes
 .../legacy/ffba_pyramid_reference.int.gz           |    Bin 0 -> 69870 bytes
 .../legacy/ffba_sphere_reference.int.gz            |    Bin 0 -> 69815 bytes
 .../legacy/ffba_spheroid_reference.int.gz          |    Bin 0 -> 69815 bytes
 .../legacy/ffba_tetrahedron_reference.int.gz       |    Bin 0 -> 69498 bytes
 .../legacy/ffba_truncatedcube_reference.int.gz     |    Bin 0 -> 82608 bytes
 .../legacy/isgisaxs03_reference_BA.int.gz          |    Bin 0 -> 72646 bytes
 .../legacy/isgisaxs03_reference_BA_size.int.gz     |    Bin 0 -> 71959 bytes
 .../legacy/isgisaxs03_reference_DWBA.int.gz        |    Bin 0 -> 71652 bytes
 .../legacy/mesocrystal01_reference.int.gz          |    Bin 0 -> 21724 bytes
 .../legacy/montecarlo_integration.int.gz           |    Bin 0 -> 15040 bytes
 .../legacy/polmagcylinders1_reference.int.gz       |    Bin 0 -> 81530 bytes
 .../legacy/resolutionfunction_reference.int.gz     |    Bin 0 -> 20159 bytes
 .../ReferenceData/legacy/ripple1_reference.int.gz  |    Bin 0 -> 74876 bytes
 .../legacy/ripple2_asym_reference.int.gz           |    Bin 0 -> 79711 bytes
 .../legacy/ripple2_sym_reference.int.gz            |    Bin 0 -> 75112 bytes
 .../legacy/roughness01_reference.int.gz            |    Bin 0 -> 74535 bytes
 Tests/UnitTests/Core/0/CVectorTest.h               |     49 +
 Tests/UnitTests/Core/0/ConstKBinAxisTest.h         |     99 +
 Tests/UnitTests/Core/0/CustomBinAxisTest.h         |     37 +
 Tests/UnitTests/Core/0/FixedBinAxisTest.h          |    180 +
 Tests/UnitTests/Core/0/Histogram1DTest.h           |    252 +
 Tests/UnitTests/Core/0/Histogram2DTest.h           |    440 +
 Tests/UnitTests/Core/0/KVectorTest.h               |    131 +
 Tests/UnitTests/Core/0/LabelMapTest.h              |    156 +
 Tests/UnitTests/Core/0/VariableBinAxisTest.h       |    258 +
 Tests/UnitTests/Core/0/main.cpp                    |     32 +
 Tests/UnitTests/Core/0/testlist.h                  |     11 +
 Tests/UnitTests/Core/1/FormFactorBasicTest.h       |    457 +
 Tests/UnitTests/Core/1/LayerRoughnessTest.h        |     76 +
 Tests/UnitTests/Core/1/LayerTest.h                 |     88 +
 Tests/UnitTests/Core/1/MultiLayerTest.h            |    579 +
 Tests/UnitTests/Core/1/ParticleCompositionTest.h   |    110 +
 Tests/UnitTests/Core/1/ParticleCoreShellTest.h     |    114 +
 Tests/UnitTests/Core/1/ParticleLayoutTest.h        |    239 +
 Tests/UnitTests/Core/1/ParticleTest.h              |    135 +
 Tests/UnitTests/Core/1/main.cpp                    |     32 +
 Tests/UnitTests/Core/1/testlist.h                  |     10 +
 Tests/UnitTests/Core/2/MatrixRTCoefficientsTest.h  |     83 +
 Tests/UnitTests/Core/2/ScalarRTCoefficientsTest.h  |    136 +
 Tests/UnitTests/Core/2/SpecularMatrixTest.h        |     33 +
 Tests/UnitTests/Core/2/SpecularSimulationTest.h    |    124 +
 Tests/UnitTests/Core/2/main.cpp                    |     32 +
 Tests/UnitTests/Core/2/testlist.h                  |      8 +
 Tests/UnitTests/Core/3/DetectorMaskTest.h          |    169 +
 Tests/UnitTests/Core/3/PolygonTest.h               |    140 +
 Tests/UnitTests/Core/3/PrecomputedTest.h           |     29 +
 Tests/UnitTests/Core/3/RectangularDetectorTest.h   |    266 +
 Tests/UnitTests/Core/3/RegionOfInterestTest.h      |    117 +
 Tests/UnitTests/Core/3/SimulationAreaTest.h        |    203 +
 Tests/UnitTests/Core/3/SpecialFunctionsTest.h      |     97 +
 Tests/UnitTests/Core/3/SphericalDetectorTest.h     |    370 +
 Tests/UnitTests/Core/3/main.cpp                    |     32 +
 Tests/UnitTests/Core/3/testlist.h                  |     10 +
 Tests/UnitTests/Core/4/BeamTest.h                  |     62 +
 Tests/UnitTests/Core/4/ChiSquaredModuleTest.h      |    116 +
 Tests/UnitTests/Core/4/CumulativeValueTest.h       |     90 +
 Tests/UnitTests/Core/4/GISASSimulationTest.h       |     91 +
 .../Core/4/HomogeneousMagneticMaterialTest.h       |    125 +
 Tests/UnitTests/Core/4/HomogeneousMaterialTest.h   |    108 +
 Tests/UnitTests/Core/4/InstrumentTest.h            |     58 +
 Tests/UnitTests/Core/4/RelDiffTest.h               |     29 +
 Tests/UnitTests/Core/4/Shape2DTest.h               |    108 +
 Tests/UnitTests/Core/4/TRangeTest.h                |     95 +
 Tests/UnitTests/Core/4/ThreadInfoTest.h            |     39 +
 Tests/UnitTests/Core/4/main.cpp                    |     32 +
 Tests/UnitTests/Core/4/testlist.h                  |     13 +
 Tests/UnitTests/Core/5/DistributionHandlerTest.h   |     47 +
 Tests/UnitTests/Core/5/DistributionsTest.h         |    404 +
 Tests/UnitTests/Core/5/FTDistributionsTest.h       |    294 +
 Tests/UnitTests/Core/5/IParameterizedTest.h        |     82 +
 Tests/UnitTests/Core/5/ParameterDistributionTest.h |    145 +
 Tests/UnitTests/Core/5/ParameterPoolTest.h         |    125 +
 Tests/UnitTests/Core/5/RealParameterWrapperTest.h  |    102 +
 Tests/UnitTests/Core/5/main.cpp                    |     32 +
 Tests/UnitTests/Core/5/testlist.h                  |      9 +
 .../UnitTests/Core/6/IntensityDataFunctionsTest.h  |    195 +
 Tests/UnitTests/Core/6/LLDataTest.h                |    394 +
 Tests/UnitTests/Core/6/OutputDataIteratorTest.h    |     64 +
 Tests/UnitTests/Core/6/OutputDataTest.h            |    471 +
 Tests/UnitTests/Core/6/main.cpp                    |     32 +
 Tests/UnitTests/Core/6/testlist.h                  |      6 +
 Tests/UnitTests/Core/CMakeLists.txt                |     31 +
 Tests/UnitTests/Core/LayerTest.h                   |     82 +
 .../Core/Numeric0/FormFactorSpecializationTest.h   |    123 +
 Tests/UnitTests/Core/Numeric0/main.cpp             |     32 +
 Tests/UnitTests/Core/Numeric0/testlist.h           |      3 +
 .../Core/Numeric1/FormFactorSymmetryTest.h         |    102 +
 Tests/UnitTests/Core/Numeric1/main.cpp             |     32 +
 Tests/UnitTests/Core/Numeric1/testlist.h           |      3 +
 Tests/UnitTests/Core/main.cpp                      |     32 +
 Tests/UnitTests/Fit/0/AttLimitsTest.h              |     82 +
 Tests/UnitTests/Fit/0/FitObjectTest.h              |    103 +
 Tests/UnitTests/Fit/0/FitParameterLinkedTest.h     |    107 +
 Tests/UnitTests/Fit/0/FitParameterSetTest.h        |    129 +
 Tests/UnitTests/Fit/0/FitParameterTest.h           |    124 +
 Tests/UnitTests/Fit/0/FitSuiteTest.h               |     51 +
 Tests/UnitTests/Fit/0/MinimizerOptionsTest.h       |     49 +
 Tests/UnitTests/Fit/0/MultiOptionTest.h            |    105 +
 Tests/UnitTests/Fit/0/OptionContainerTest.h        |    133 +
 Tests/UnitTests/Fit/0/RealLimitsTest.h             |    174 +
 Tests/UnitTests/Fit/0/StringUtilsTest.h            |     23 +
 Tests/UnitTests/Fit/0/main.cpp                     |     32 +
 Tests/UnitTests/Fit/0/testlist.h                   |     14 +
 Tests/UnitTests/Fit/CMakeLists.txt                 |     22 +
 Tests/UnitTests/GUI/CMakeLists.txt                 |     33 +
 Tests/UnitTests/GUI/GUICoreObjectCorrespondence.h  |     31 +
 Tests/UnitTests/GUI/TestComboProperty.h            |     58 +
 Tests/UnitTests/GUI/TestFTDistributionItems.h      |     34 +
 Tests/UnitTests/GUI/TestFitParameterModel.h        |    244 +
 Tests/UnitTests/GUI/TestFormFactorItems.h          |     36 +
 Tests/UnitTests/GUI/TestGUI.cpp                    |     66 +
 .../GUI/TestGUICoreObjectCorrespondence.cpp        |    182 +
 .../GUI/TestGUICoreObjectCorrespondence.h          |     41 +
 Tests/UnitTests/GUI/TestGUIHelpers.h               |     35 +
 Tests/UnitTests/GUI/TestLayerRoughnessItems.h      |     46 +
 Tests/UnitTests/GUI/TestMapperCases.h              |    124 +
 Tests/UnitTests/GUI/TestMapperForItem.h            |    347 +
 Tests/UnitTests/GUI/TestMaterialModel.h            |     71 +
 Tests/UnitTests/GUI/TestParaCrystalItems.h         |     68 +
 Tests/UnitTests/GUI/TestParameterizedItem.h        |     74 +
 Tests/UnitTests/GUI/TestParticleDistributionItem.h |     56 +
 Tests/UnitTests/GUI/TestParticleItem.h             |    128 +
 Tests/UnitTests/GUI/TestSessionItem.h              |    232 +
 Tests/UnitTests/GUI/TestSessionModel.h             |    177 +
 Tests/UnitTests/GUI/verify_throw_macro.h           |     33 +
 Tests/UnitTests/utilities/qLoopedTest.h            |     73 +
 ThirdParty/Core/CMakeLists.txt                     |      1 +
 ThirdParty/Core/Faddeeva/CMakeLists.txt            |     23 +
 ThirdParty/Core/Faddeeva/Faddeeva.cc               |   2517 +
 ThirdParty/Core/Faddeeva/Faddeeva.hh               |     62 +
 ThirdParty/Fit/CMakeLists.txt                      |      1 +
 ThirdParty/Fit/RootMinimizers/CMakeLists.txt       |     41 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/BinData.h    |    548 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/BinPoint.h   |    180 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/Chi2FCN.h    |    196 +
 .../Fit/RootMinimizers/inc/Fit/DataOptions.h       |     65 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/DataRange.h  |    218 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/DataVector.h |    395 +
 .../Fit/RootMinimizers/inc/Fit/DataVectorfwd.h     |     38 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/FcnAdapter.h |     70 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/FitConfig.h  |    246 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/FitResult.h  |    376 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/FitUtil.h    |    134 +
 .../Fit/RootMinimizers/inc/Fit/FitUtilParallel.h   |     72 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/Fitter.h     |    550 +
 .../Fit/RootMinimizers/inc/Fit/LogLikelihoodFCN.h  |    201 +
 .../Fit/RootMinimizers/inc/Fit/ParameterSettings.h |    213 +
 .../RootMinimizers/inc/Fit/PoissonLikelihoodFCN.h  |    199 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/SparseData.h |     76 +
 ThirdParty/Fit/RootMinimizers/inc/Fit/UnBinData.h  |    361 +
 .../Fit/RootMinimizers/inc/Math/BasicMinimizer.h   |    207 +
 ThirdParty/Fit/RootMinimizers/inc/Math/Derivator.h |    247 +
 ThirdParty/Fit/RootMinimizers/inc/Math/Error.h     |    121 +
 .../RootMinimizers/inc/Math/FitMethodFunction.h    |    147 +
 ThirdParty/Fit/RootMinimizers/inc/Math/Functor.h   |    805 +
 .../RootMinimizers/inc/Math/GSLFunctionAdapter.h   |     97 +
 .../RootMinimizers/inc/Math/GSLFunctionWrapper.h   |    150 +
 .../Fit/RootMinimizers/inc/Math/GSLMinimizer.h     |    186 +
 .../Fit/RootMinimizers/inc/Math/GSLMinimizer1D.h   |    224 +
 .../RootMinimizers/inc/Math/GSLRandomFunctions.h   |    212 +
 .../Fit/RootMinimizers/inc/Math/GSLRndmEngines.h   |    471 +
 .../Fit/RootMinimizers/inc/Math/GSLSimAnnealing.h  |    257 +
 .../Fit/RootMinimizers/inc/Math/GenAlgoOptions.h   |    159 +
 .../Fit/RootMinimizers/inc/Math/GeneticMinimizer.h |    112 +
 ThirdParty/Fit/RootMinimizers/inc/Math/IFunction.h |    417 +
 .../Fit/RootMinimizers/inc/Math/IFunctionfwd.h     |     39 +
 .../Fit/RootMinimizers/inc/Math/IMinimizer1D.h     |    118 +
 ThirdParty/Fit/RootMinimizers/inc/Math/IOptions.h  |    119 +
 .../Fit/RootMinimizers/inc/Math/IParamFunction.h   |    403 +
 .../RootMinimizers/inc/Math/IParamFunctionfwd.h    |     41 +
 .../inc/Math/MinimTransformFunction.h              |    157 +
 .../inc/Math/MinimTransformVariable.h              |    159 +
 ThirdParty/Fit/RootMinimizers/inc/Math/Minimizer.h |    505 +
 .../Fit/RootMinimizers/inc/Math/MinimizerOptions.h |    172 +
 .../inc/Math/MinimizerVariableTransformation.h     |     93 +
 .../RootMinimizers/inc/Math/MultiNumGradFunction.h |    145 +
 .../inc/Math/OneDimFunctionAdapter.h               |    283 +
 .../inc/Math/PatchedGSLNLSMinimizer.h              |    269 +
 .../inc/Math/PatchedGSLSimAnMinimizer.h            |    128 +
 .../Fit/RootMinimizers/inc/Math/RandomFunctions.h  |    303 +
 .../Fit/RootMinimizers/inc/Math/TRandomEngine.h    |     74 +
 ThirdParty/Fit/RootMinimizers/inc/Math/Util.h      |     77 +
 .../Fit/RootMinimizers/inc/Math/WrappedFunction.h  |    239 +
 .../RootMinimizers/inc/Math/WrappedParamFunction.h |    306 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABObj.h  |    176 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABProd.h |     63 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABSum.h  |     70 +
 .../Fit/RootMinimizers/inc/Minuit2/ABTypes.h       |    126 +
 .../inc/Minuit2/AnalyticalGradientCalculator.h     |     49 +
 .../inc/Minuit2/BasicFunctionGradient.h            |     85 +
 .../inc/Minuit2/BasicFunctionMinimum.h             |    156 +
 .../RootMinimizers/inc/Minuit2/BasicMinimumError.h |    122 +
 .../inc/Minuit2/BasicMinimumParameters.h           |     75 +
 .../RootMinimizers/inc/Minuit2/BasicMinimumSeed.h  |     75 +
 .../RootMinimizers/inc/Minuit2/BasicMinimumState.h |     98 +
 .../RootMinimizers/inc/Minuit2/CombinedMinimizer.h |     53 +
 .../inc/Minuit2/CombinedMinimumBuilder.h           |     63 +
 .../Fit/RootMinimizers/inc/Minuit2/ContoursError.h |     85 +
 .../inc/Minuit2/DavidonErrorUpdator.h              |     44 +
 .../Fit/RootMinimizers/inc/Minuit2/FCNAdapter.h    |     71 +
 .../Fit/RootMinimizers/inc/Minuit2/FCNBase.h       |    122 +
 .../RootMinimizers/inc/Minuit2/FCNGradAdapter.h    |     88 +
 .../RootMinimizers/inc/Minuit2/FCNGradientBase.h   |     48 +
 .../Fit/RootMinimizers/inc/Minuit2/FumiliBuilder.h |    143 +
 .../Fit/RootMinimizers/inc/Minuit2/FumiliChi2FCN.h |    182 +
 .../inc/Minuit2/FumiliErrorUpdator.h               |    111 +
 .../RootMinimizers/inc/Minuit2/FumiliFCNAdapter.h  |    173 +
 .../Fit/RootMinimizers/inc/Minuit2/FumiliFCNBase.h |    170 +
 .../inc/Minuit2/FumiliGradientCalculator.h         |     58 +
 .../inc/Minuit2/FumiliMaximumLikelihoodFCN.h       |    183 +
 .../RootMinimizers/inc/Minuit2/FumiliMinimizer.h   |    154 +
 .../inc/Minuit2/FumiliStandardChi2FCN.h            |    215 +
 .../Minuit2/FumiliStandardMaximumLikelihoodFCN.h   |    158 +
 .../RootMinimizers/inc/Minuit2/FunctionGradient.h  |     63 +
 .../RootMinimizers/inc/Minuit2/FunctionMinimizer.h |     60 +
 .../RootMinimizers/inc/Minuit2/FunctionMinimum.h   |    114 +
 .../RootMinimizers/inc/Minuit2/GenericFunction.h   |     63 +
 .../inc/Minuit2/GradientCalculator.h               |     41 +
 .../inc/Minuit2/HessianGradientCalculator.h        |     69 +
 .../inc/Minuit2/InitialGradientCalculator.h        |     63 +
 .../Fit/RootMinimizers/inc/Minuit2/LASymMatrix.h   |    349 +
 .../Fit/RootMinimizers/inc/Minuit2/LAVector.h      |    303 +
 .../Fit/RootMinimizers/inc/Minuit2/LaInverse.h     |     63 +
 .../RootMinimizers/inc/Minuit2/LaOuterProduct.h    |     59 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaProd.h |     50 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaSum.h  |     65 +
 .../Fit/RootMinimizers/inc/Minuit2/MPIProcess.h    |    145 +
 .../Fit/RootMinimizers/inc/Minuit2/MatrixInverse.h |     68 +
 .../RootMinimizers/inc/Minuit2/MinimumBuilder.h    |     70 +
 .../Fit/RootMinimizers/inc/Minuit2/MinimumError.h  |     82 +
 .../inc/Minuit2/MinimumErrorUpdator.h              |     38 +
 .../RootMinimizers/inc/Minuit2/MinimumParameters.h |     60 +
 .../Fit/RootMinimizers/inc/Minuit2/MinimumSeed.h   |     66 +
 .../inc/Minuit2/MinimumSeedGenerator.h             |     45 +
 .../Fit/RootMinimizers/inc/Minuit2/MinimumState.h  |     82 +
 .../Fit/RootMinimizers/inc/Minuit2/MinosError.h    |     83 +
 .../RootMinimizers/inc/Minuit2/Minuit2Minimizer.h  |    330 +
 .../RootMinimizers/inc/Minuit2/MinuitParameter.h   |    187 +
 .../Fit/RootMinimizers/inc/Minuit2/MnApplication.h |    141 +
 .../Fit/RootMinimizers/inc/Minuit2/MnConfig.h      |     21 +
 .../Fit/RootMinimizers/inc/Minuit2/MnContours.h    |     73 +
 .../inc/Minuit2/MnCovarianceSqueeze.h              |     49 +
 .../Fit/RootMinimizers/inc/Minuit2/MnCross.h       |     82 +
 .../Fit/RootMinimizers/inc/Minuit2/MnEigen.h       |     46 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFcn.h  |     66 +
 .../RootMinimizers/inc/Minuit2/MnFumiliMinimize.h  |     88 +
 .../RootMinimizers/inc/Minuit2/MnFunctionCross.h   |     53 +
 .../inc/Minuit2/MnGlobalCorrelationCoeff.h         |     51 +
 .../Fit/RootMinimizers/inc/Minuit2/MnHesse.h       |     99 +
 .../Fit/RootMinimizers/inc/Minuit2/MnLineSearch.h  |     71 +
 .../inc/Minuit2/MnMachinePrecision.h               |     65 +
 .../Fit/RootMinimizers/inc/Minuit2/MnMatrix.h      |     48 +
 .../Fit/RootMinimizers/inc/Minuit2/MnMigrad.h      |     93 +
 .../Fit/RootMinimizers/inc/Minuit2/MnMinimize.h    |     92 +
 .../Fit/RootMinimizers/inc/Minuit2/MnMinos.h       |     79 +
 .../Fit/RootMinimizers/inc/Minuit2/MnParabola.h    |    173 +
 .../RootMinimizers/inc/Minuit2/MnParabolaFactory.h |     43 +
 .../RootMinimizers/inc/Minuit2/MnParabolaPoint.h   |     89 +
 .../RootMinimizers/inc/Minuit2/MnParameterScan.h   |     57 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPlot.h |     55 +
 .../Fit/RootMinimizers/inc/Minuit2/MnPosDef.h      |     44 +
 .../Fit/RootMinimizers/inc/Minuit2/MnPrint.h       |    174 +
 .../inc/Minuit2/MnRefCountedPointer.h              |    100 +
 .../inc/Minuit2/MnReferenceCounter.h               |     63 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnScan.h |     75 +
 .../RootMinimizers/inc/Minuit2/MnSeedGenerator.h   |     44 +
 .../Fit/RootMinimizers/inc/Minuit2/MnSimplex.h     |     76 +
 .../Fit/RootMinimizers/inc/Minuit2/MnStrategy.h    |     90 +
 ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnTiny.h |     39 +
 .../Fit/RootMinimizers/inc/Minuit2/MnTraceObject.h |     49 +
 .../RootMinimizers/inc/Minuit2/MnUserCovariance.h  |    101 +
 .../Fit/RootMinimizers/inc/Minuit2/MnUserFcn.h     |     46 +
 .../inc/Minuit2/MnUserParameterState.h             |    196 +
 .../RootMinimizers/inc/Minuit2/MnUserParameters.h  |    124 +
 .../inc/Minuit2/MnUserTransformation.h             |    211 +
 .../RootMinimizers/inc/Minuit2/MnVectorTransform.h |     43 +
 .../inc/Minuit2/ModularFunctionMinimizer.h         |    100 +
 .../inc/Minuit2/NegativeG2LineSearch.h             |     50 +
 .../inc/Minuit2/Numerical2PGradientCalculator.h    |     81 +
 .../inc/Minuit2/ParametricFunction.h               |    199 +
 .../Fit/RootMinimizers/inc/Minuit2/ScanBuilder.h   |     46 +
 .../Fit/RootMinimizers/inc/Minuit2/ScanMinimizer.h |     53 +
 .../RootMinimizers/inc/Minuit2/SimplexBuilder.h    |     48 +
 .../RootMinimizers/inc/Minuit2/SimplexMinimizer.h  |     53 +
 .../RootMinimizers/inc/Minuit2/SimplexParameters.h |     64 +
 .../inc/Minuit2/SimplexSeedGenerator.h             |     48 +
 .../inc/Minuit2/SinParameterTransformation.h       |     46 +
 .../inc/Minuit2/SqrtLowParameterTransformation.h   |     56 +
 .../inc/Minuit2/SqrtUpParameterTransformation.h    |     60 +
 .../RootMinimizers/inc/Minuit2/StackAllocator.h    |    236 +
 .../inc/Minuit2/VariableMetricBuilder.h            |     57 +
 .../inc/Minuit2/VariableMetricEDMEstimator.h       |     39 +
 .../inc/Minuit2/VariableMetricMinimizer.h          |     53 +
 .../inc/Minuit2/VectorOuterProduct.h               |     48 +
 .../Fit/RootMinimizers/inc/TMVA/GeneticAlgorithm.h |    115 +
 .../Fit/RootMinimizers/inc/TMVA/GeneticGenes.h     |     71 +
 .../RootMinimizers/inc/TMVA/GeneticPopulation.h    |    119 +
 .../Fit/RootMinimizers/inc/TMVA/GeneticRange.h     |     82 +
 .../Fit/RootMinimizers/inc/TMVA/IFitterTarget.h    |     68 +
 ThirdParty/Fit/RootMinimizers/inc/TMVA/Interval.h  |    104 +
 ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom.h   |     68 +
 ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom2.h  |     53 +
 ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom3.h  |     53 +
 ThirdParty/Fit/RootMinimizers/inc/TMVA/TUUID.h     |     22 +
 ThirdParty/Fit/RootMinimizers/inc/TMVA/Types.h     |    240 +
 .../Fit/RootMinimizers/src/Math/BasicMinimizer.cxx |    365 +
 .../Fit/RootMinimizers/src/Math/Derivator.cxx      |    161 +
 .../src/Math/GSL1DMinimizerWrapper.h               |     76 +
 .../Fit/RootMinimizers/src/Math/GSLDerivator.cxx   |    128 +
 .../Fit/RootMinimizers/src/Math/GSLDerivator.h     |    176 +
 .../RootMinimizers/src/Math/GSLFunctionWrapper.h   |    150 +
 .../Fit/RootMinimizers/src/Math/GSLMinimizer.cxx   |    298 +
 .../Fit/RootMinimizers/src/Math/GSLMinimizer1D.cxx |    223 +
 .../Fit/RootMinimizers/src/Math/GSLMultiFit.h      |    223 +
 .../src/Math/GSLMultiFitFunctionAdapter.h          |    131 +
 .../src/Math/GSLMultiFitFunctionWrapper.h          |    100 +
 .../src/Math/GSLMultiMinFunctionAdapter.h          |     99 +
 .../src/Math/GSLMultiMinFunctionWrapper.h          |    163 +
 .../RootMinimizers/src/Math/GSLMultiMinimizer.h    |    214 +
 .../Fit/RootMinimizers/src/Math/GSLRndmEngines.cxx |    414 +
 .../Fit/RootMinimizers/src/Math/GSLRngWrapper.h    |    144 +
 .../RootMinimizers/src/Math/GSLSimAnnealing.cxx    |    240 +
 .../Fit/RootMinimizers/src/Math/GenAlgoOptions.cxx |     81 +
 .../RootMinimizers/src/Math/GeneticMinimizer.cxx   |    380 +
 .../src/Math/MinimTransformFunction.cxx            |    161 +
 .../RootMinimizers/src/Math/MinimizerOptions.cxx   |    230 +
 .../src/Math/MinimizerVariableTransformation.cxx   |    110 +
 .../src/Math/MultiNumGradFunction.cxx              |     63 +
 .../src/Math/PatchedGSLNLSMinimizer.cxx            |    404 +
 .../src/Math/PatchedGSLSimAnMinimizer.cxx          |    132 +
 .../RootMinimizers/src/Math/RandomFunctions.cxx    |    365 +
 .../src/Minuit2/AnalyticalGradientCalculator.cxx   |     56 +
 .../src/Minuit2/BasicMinimumError.cxx              |     42 +
 .../src/Minuit2/CombinedMinimumBuilder.cxx         |     61 +
 .../src/Minuit2/DavidonErrorUpdator.cxx            |    181 +
 .../RootMinimizers/src/Minuit2/FumiliBuilder.cxx   |    433 +
 .../src/Minuit2/FumiliErrorUpdator.cxx             |    114 +
 .../src/Minuit2/FumiliGradientCalculator.cxx       |    130 +
 .../RootMinimizers/src/Minuit2/FumiliMinimizer.cxx |    104 +
 .../src/Minuit2/FumiliStandardChi2FCN.cxx          |    125 +
 .../Minuit2/FumiliStandardMaximumLikelihoodFCN.cxx |    175 +
 .../src/Minuit2/HessianGradientCalculator.cxx      |    149 +
 .../src/Minuit2/InitialGradientCalculator.cxx      |    120 +
 .../RootMinimizers/src/Minuit2/LaEigenValues.cxx   |     45 +
 .../RootMinimizers/src/Minuit2/LaInnerProduct.cxx  |     26 +
 .../Fit/RootMinimizers/src/Minuit2/LaInverse.cxx   |     42 +
 .../RootMinimizers/src/Minuit2/LaOuterProduct.cxx  |     57 +
 .../RootMinimizers/src/Minuit2/LaSumOfElements.cxx |     34 +
 .../src/Minuit2/LaVtMVSimilarity.cxx               |     33 +
 .../Fit/RootMinimizers/src/Minuit2/MPIProcess.cxx  |    334 +
 .../RootMinimizers/src/Minuit2/MinimumBuilder.cxx  |     30 +
 .../src/Minuit2/Minuit2Minimizer.cxx               |   1136 +
 .../RootMinimizers/src/Minuit2/MnApplication.cxx   |    190 +
 .../Fit/RootMinimizers/src/Minuit2/MnContours.cxx  |    219 +
 .../src/Minuit2/MnCovarianceSqueeze.cxx            |    112 +
 .../Fit/RootMinimizers/src/Minuit2/MnEigen.cxx     |     37 +
 .../Fit/RootMinimizers/src/Minuit2/MnFcn.cxx       |     39 +
 .../src/Minuit2/MnFumiliMinimize.cxx               |     38 +
 .../RootMinimizers/src/Minuit2/MnFunctionCross.cxx |    503 +
 .../src/Minuit2/MnGlobalCorrelationCoeff.cxx       |     47 +
 .../Fit/RootMinimizers/src/Minuit2/MnHesse.cxx     |    446 +
 .../RootMinimizers/src/Minuit2/MnLineSearch.cxx    |    864 +
 .../src/Minuit2/MnMachinePrecision.cxx             |     53 +
 .../Fit/RootMinimizers/src/Minuit2/MnMinos.cxx     |    294 +
 .../src/Minuit2/MnParabolaFactory.cxx              |     77 +
 .../RootMinimizers/src/Minuit2/MnParameterScan.cxx |     69 +
 .../Fit/RootMinimizers/src/Minuit2/MnPlot.cxx      |     58 +
 .../Fit/RootMinimizers/src/Minuit2/MnPosDef.cxx    |    107 +
 .../Fit/RootMinimizers/src/Minuit2/MnPrint.cxx     |    377 +
 .../Fit/RootMinimizers/src/Minuit2/MnScan.cxx      |     34 +
 .../RootMinimizers/src/Minuit2/MnSeedGenerator.cxx |    201 +
 .../Fit/RootMinimizers/src/Minuit2/MnStrategy.cxx  |     69 +
 .../Fit/RootMinimizers/src/Minuit2/MnTiny.cxx      |     27 +
 .../RootMinimizers/src/Minuit2/MnTraceObject.cxx   |     49 +
 .../Fit/RootMinimizers/src/Minuit2/MnUserFcn.cxx   |     47 +
 .../src/Minuit2/MnUserParameterState.cxx           |    441 +
 .../src/Minuit2/MnUserParameters.cxx               |    188 +
 .../src/Minuit2/MnUserTransformation.cxx           |    457 +
 .../src/Minuit2/ModularFunctionMinimizer.cxx       |    174 +
 .../src/Minuit2/NegativeG2LineSearch.cxx           |    136 +
 .../src/Minuit2/Numerical2PGradientCalculator.cxx  |    254 +
 .../src/Minuit2/ParametricFunction.cxx             |     51 +
 .../Fit/RootMinimizers/src/Minuit2/ScanBuilder.cxx |     49 +
 .../RootMinimizers/src/Minuit2/SimplexBuilder.cxx  |    227 +
 .../src/Minuit2/SimplexParameters.cxx              |     48 +
 .../src/Minuit2/SimplexSeedGenerator.cxx           |     54 +
 .../src/Minuit2/SinParameterTransformation.cxx     |     59 +
 .../src/Minuit2/SqrtLowParameterTransformation.cxx |     50 +
 .../src/Minuit2/SqrtUpParameterTransformation.cxx  |     51 +
 .../src/Minuit2/VariableMetricBuilder.cxx          |    445 +
 .../src/Minuit2/VariableMetricEDMEstimator.cxx     |     34 +
 .../Fit/RootMinimizers/src/Minuit2/mnbins.cxx      |     96 +
 .../Fit/RootMinimizers/src/Minuit2/mndasum.cxx     |    100 +
 .../Fit/RootMinimizers/src/Minuit2/mndaxpy.cxx     |    104 +
 .../Fit/RootMinimizers/src/Minuit2/mnddot.cxx      |    108 +
 .../Fit/RootMinimizers/src/Minuit2/mndscal.cxx     |     91 +
 .../Fit/RootMinimizers/src/Minuit2/mndspmv.cxx     |    322 +
 .../Fit/RootMinimizers/src/Minuit2/mndspr.cxx      |    247 +
 .../Fit/RootMinimizers/src/Minuit2/mnlsame.cxx     |     70 +
 .../Fit/RootMinimizers/src/Minuit2/mnteigen.cxx    |    311 +
 .../Fit/RootMinimizers/src/Minuit2/mntplot.cxx     |    201 +
 .../Fit/RootMinimizers/src/Minuit2/mnvert.cxx      |     76 +
 .../Fit/RootMinimizers/src/Minuit2/mnxerbla.cxx    |     73 +
 .../RootMinimizers/src/TMVA/GeneticAlgorithm.cxx   |    264 +
 .../Fit/RootMinimizers/src/TMVA/GeneticGenes.cxx   |     47 +
 .../RootMinimizers/src/TMVA/GeneticPopulation.cxx  |    328 +
 .../Fit/RootMinimizers/src/TMVA/GeneticRange.cxx   |    117 +
 .../Fit/RootMinimizers/src/TMVA/IFitterTarget.cxx  |     44 +
 .../Fit/RootMinimizers/src/TMVA/Interval.cxx       |    182 +
 ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom.cxx |    632 +
 .../Fit/RootMinimizers/src/TMVA/TRandom2.cxx       |    163 +
 .../Fit/RootMinimizers/src/TMVA/TRandom3.cxx       |    249 +
 ThirdParty/Fit/RootMinimizers/src/TMVA/TUUID.cxx   |     26 +
 ThirdParty/Fit/RootMinimizers/src/TMVA/Types.cxx   |    135 +
 ThirdParty/GUI/CMakeLists.txt                      |     15 +
 ThirdParty/GUI/qcustomplot/CMakeLists.txt          |     30 +
 ThirdParty/GUI/qcustomplot/GPL.txt                 |    674 +
 ThirdParty/GUI/qcustomplot/changelog.txt           |    432 +
 ThirdParty/GUI/qcustomplot/qcustomplot.cpp         |  23553 ++++
 ThirdParty/GUI/qcustomplot/qcustomplot.h           |   3768 +
 ThirdParty/GUI/qt-manhattan-style/CMakeLists.txt   |     86 +
 ThirdParty/GUI/qt-manhattan-style/README.md        |      5 +
 ThirdParty/GUI/qt-manhattan-style/coreconstants.h  |    235 +
 .../GUI/qt-manhattan-style/doubletabwidget.cpp     |    535 +
 .../GUI/qt-manhattan-style/doubletabwidget.h       |    106 +
 .../GUI/qt-manhattan-style/doubletabwidget.ui      |     26 +
 .../extensions/simpleprogressbar.cpp               |    144 +
 .../extensions/simpleprogressbar.h                 |     46 +
 .../qt-manhattan-style/extensions/tabwidget.cpp    |    413 +
 .../GUI/qt-manhattan-style/extensions/tabwidget.h  |     61 +
 .../extensions/threelevelsitempicker.cpp           |    383 +
 .../extensions/threelevelsitempicker.h             |     84 +
 .../GUI/qt-manhattan-style/fancyactionbar.cpp      |    372 +
 ThirdParty/GUI/qt-manhattan-style/fancyactionbar.h |     92 +
 .../GUI/qt-manhattan-style/fancylineedit.cpp       |    372 +
 ThirdParty/GUI/qt-manhattan-style/fancylineedit.h  |    129 +
 .../GUI/qt-manhattan-style/fancymainwindow.cpp     |    342 +
 .../GUI/qt-manhattan-style/fancymainwindow.h       |    106 +
 .../GUI/qt-manhattan-style/fancytabwidget.cpp      |    566 +
 ThirdParty/GUI/qt-manhattan-style/fancytabwidget.h |    190 +
 .../GUI/qt-manhattan-style/historycompleter.cpp    |    222 +
 .../GUI/qt-manhattan-style/historycompleter.h      |     71 +
 .../GUI/qt-manhattan-style/manhattanstyle.cpp      |   1034 +
 ThirdParty/GUI/qt-manhattan-style/manhattanstyle.h |     95 +
 ThirdParty/GUI/qt-manhattan-style/minisplitter.cpp |     89 +
 ThirdParty/GUI/qt-manhattan-style/minisplitter.h   |     56 +
 ThirdParty/GUI/qt-manhattan-style/progressbar.cpp  |    301 +
 ThirdParty/GUI/qt-manhattan-style/progressbar.h    |     89 +
 .../qt-manhattan-style_global.hpp                  |     12 +
 ThirdParty/GUI/qt-manhattan-style/qtcassert.cpp    |     39 +
 ThirdParty/GUI/qt-manhattan-style/qtcassert.h      |     49 +
 .../GUI/qt-manhattan-style/qtcolorbutton.cpp       |    268 +
 ThirdParty/GUI/qt-manhattan-style/qtcolorbutton.h  |     78 +
 .../GUI/qt-manhattan-style/qtcolorbutton_p.h       |     27 +
 .../qt-manhattan-style/resources/leftselection.png |    Bin 0 -> 489 bytes
 .../qt-manhattan-style/resources/midselection.png  |    Bin 0 -> 172 bytes
 .../qt-manhattan-style/resources/progressbar.png   |    Bin 0 -> 420 bytes
 .../GUI/qt-manhattan-style/resources/resources.qrc |     24 +
 .../resources/rightselection.png                   |    Bin 0 -> 441 bytes
 .../resources/scrollbar-vertical-background.png    |    Bin 0 -> 208 bytes
 .../scrollbar-vertical-down-highlight.png          |    Bin 0 -> 249 bytes
 .../resources/scrollbar-vertical-down.png          |    Bin 0 -> 249 bytes
 .../scrollbar-vertical-slider-highlight.png        |    Bin 0 -> 182 bytes
 .../resources/scrollbar-vertical-slider.png        |    Bin 0 -> 182 bytes
 .../resources/scrollbar-vertical-up-highlight.png  |    Bin 0 -> 198 bytes
 .../resources/scrollbar-vertical-up.png            |    Bin 0 -> 198 bytes
 .../resources/targetpanel_bottom.png               |    Bin 0 -> 186 bytes
 .../resources/targetpanel_gradient.png             |    Bin 0 -> 3798 bytes
 .../resources/threelevelsitempicker-listwidget.qss |     48 +
 ThirdParty/GUI/qt-manhattan-style/stringutils.cpp  |    160 +
 ThirdParty/GUI/qt-manhattan-style/stringutils.h    |     85 +
 .../GUI/qt-manhattan-style/styleanimator.cpp       |    154 +
 ThirdParty/GUI/qt-manhattan-style/styleanimator.h  |    101 +
 ThirdParty/GUI/qt-manhattan-style/styledbar.cpp    |     95 +
 ThirdParty/GUI/qt-manhattan-style/styledbar.h      |     65 +
 ThirdParty/GUI/qt-manhattan-style/stylehelper.cpp  |    519 +
 ThirdParty/GUI/qt-manhattan-style/stylehelper.h    |    103 +
 ThirdParty/GUI/qtpropertybrowser/CMakeLists.txt    |     53 +
 .../qtpropertybrowser/QtAbstractEditorFactoryBase  |      1 +
 .../qtpropertybrowser/QtAbstractPropertyBrowser    |      1 +
 .../qtpropertybrowser/QtAbstractPropertyManager    |      1 +
 .../GUI/qtpropertybrowser/QtBoolPropertyManager    |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtBrowserItem     |      1 +
 .../GUI/qtpropertybrowser/QtButtonPropertyBrowser  |      1 +
 .../GUI/qtpropertybrowser/QtCharEditorFactory      |      1 +
 .../GUI/qtpropertybrowser/QtCharPropertyManager    |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtCheckBoxFactory |      1 +
 .../GUI/qtpropertybrowser/QtColorEditorFactory     |      1 +
 .../GUI/qtpropertybrowser/QtColorPropertyManager   |      1 +
 .../GUI/qtpropertybrowser/QtCursorEditorFactory    |      1 +
 .../GUI/qtpropertybrowser/QtCursorPropertyManager  |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtDateEditFactory |      1 +
 .../GUI/qtpropertybrowser/QtDatePropertyManager    |      1 +
 .../GUI/qtpropertybrowser/QtDateTimeEditFactory    |      1 +
 .../qtpropertybrowser/QtDateTimePropertyManager    |      1 +
 .../GUI/qtpropertybrowser/QtDoublePropertyManager  |      1 +
 .../GUI/qtpropertybrowser/QtDoubleSpinBoxFactory   |      1 +
 .../GUI/qtpropertybrowser/QtEnumEditorFactory      |      1 +
 .../GUI/qtpropertybrowser/QtEnumPropertyManager    |      1 +
 .../GUI/qtpropertybrowser/QtFlagPropertyManager    |      1 +
 .../GUI/qtpropertybrowser/QtFontEditorFactory      |      1 +
 .../GUI/qtpropertybrowser/QtFontPropertyManager    |      1 +
 .../qtpropertybrowser/QtGroupBoxPropertyBrowser    |      1 +
 .../GUI/qtpropertybrowser/QtGroupPropertyManager   |      1 +
 .../GUI/qtpropertybrowser/QtIntPropertyManager     |      1 +
 .../qtpropertybrowser/QtKeySequenceEditorFactory   |      1 +
 .../qtpropertybrowser/QtKeySequencePropertyManager |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtLineEditFactory |      1 +
 .../GUI/qtpropertybrowser/QtLocalePropertyManager  |      1 +
 .../GUI/qtpropertybrowser/QtPointFPropertyManager  |      1 +
 .../GUI/qtpropertybrowser/QtPointPropertyManager   |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtProperty        |      1 +
 .../GUI/qtpropertybrowser/QtRectFPropertyManager   |      1 +
 .../GUI/qtpropertybrowser/QtRectPropertyManager    |      1 +
 .../GUI/qtpropertybrowser/QtScrollBarFactory       |      1 +
 .../GUI/qtpropertybrowser/QtSizeFPropertyManager   |      1 +
 .../qtpropertybrowser/QtSizePolicyPropertyManager  |      1 +
 .../GUI/qtpropertybrowser/QtSizePropertyManager    |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtSliderFactory   |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtSpinBoxFactory  |      1 +
 .../GUI/qtpropertybrowser/QtStringPropertyManager  |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtTimeEditFactory |      1 +
 .../GUI/qtpropertybrowser/QtTimePropertyManager    |      1 +
 .../GUI/qtpropertybrowser/QtTreePropertyBrowser    |      1 +
 .../GUI/qtpropertybrowser/QtVariantEditorFactory   |      1 +
 ThirdParty/GUI/qtpropertybrowser/QtVariantProperty |      1 +
 .../GUI/qtpropertybrowser/QtVariantPropertyManager |      1 +
 .../GUI/qtpropertybrowser/images/cursor-arrow.png  |    Bin 0 -> 171 bytes
 .../GUI/qtpropertybrowser/images/cursor-busy.png   |    Bin 0 -> 201 bytes
 .../qtpropertybrowser/images/cursor-closedhand.png |    Bin 0 -> 147 bytes
 .../GUI/qtpropertybrowser/images/cursor-cross.png  |    Bin 0 -> 130 bytes
 .../qtpropertybrowser/images/cursor-forbidden.png  |    Bin 0 -> 199 bytes
 .../GUI/qtpropertybrowser/images/cursor-hand.png   |    Bin 0 -> 159 bytes
 .../GUI/qtpropertybrowser/images/cursor-hsplit.png |    Bin 0 -> 155 bytes
 .../GUI/qtpropertybrowser/images/cursor-ibeam.png  |    Bin 0 -> 124 bytes
 .../qtpropertybrowser/images/cursor-openhand.png   |    Bin 0 -> 160 bytes
 .../qtpropertybrowser/images/cursor-sizeall.png    |    Bin 0 -> 174 bytes
 .../GUI/qtpropertybrowser/images/cursor-sizeb.png  |    Bin 0 -> 161 bytes
 .../GUI/qtpropertybrowser/images/cursor-sizef.png  |    Bin 0 -> 161 bytes
 .../GUI/qtpropertybrowser/images/cursor-sizeh.png  |    Bin 0 -> 145 bytes
 .../GUI/qtpropertybrowser/images/cursor-sizev.png  |    Bin 0 -> 141 bytes
 .../qtpropertybrowser/images/cursor-uparrow.png    |    Bin 0 -> 132 bytes
 .../GUI/qtpropertybrowser/images/cursor-vsplit.png |    Bin 0 -> 161 bytes
 .../GUI/qtpropertybrowser/images/cursor-wait.png   |    Bin 0 -> 172 bytes
 .../qtpropertybrowser/images/cursor-whatsthis.png  |    Bin 0 -> 191 bytes
 .../qtpropertybrowser/qtbuttonpropertybrowser.cpp  |    616 +
 .../qtpropertybrowser/qtbuttonpropertybrowser.h    |     74 +
 .../GUI/qtpropertybrowser/qteditorfactory.cpp      |   2553 +
 ThirdParty/GUI/qtpropertybrowser/qteditorfactory.h |    389 +
 .../qtgroupboxpropertybrowser.cpp                  |    521 +
 .../qtpropertybrowser/qtgroupboxpropertybrowser.h  |     66 +
 .../GUI/qtpropertybrowser/qtpropertybrowser.cpp    |   1951 +
 .../GUI/qtpropertybrowser/qtpropertybrowser.h      |    301 +
 .../GUI/qtpropertybrowser/qtpropertybrowser.qrc    |     23 +
 .../qtpropertybrowser/qtpropertybrowserutils.cpp   |    296 +
 .../qtpropertybrowser/qtpropertybrowserutils_p.h   |    124 +
 .../GUI/qtpropertybrowser/qtpropertymanager.cpp    |   6452 +
 .../GUI/qtpropertybrowser/qtpropertymanager.h      |    738 +
 .../qtpropertybrowser/qttreepropertybrowser.cpp    |   1034 +
 .../GUI/qtpropertybrowser/qttreepropertybrowser.h  |    126 +
 .../GUI/qtpropertybrowser/qtvariantproperty.cpp    |   2259 +
 .../GUI/qtpropertybrowser/qtvariantproperty.h      |    178 +
 ThirdParty/common/CMakeLists.txt                   |      1 +
 ThirdParty/common/gtest/00_PATCHES                 |      3 +
 ThirdParty/common/gtest/CMakeLists.txt             |     13 +
 ThirdParty/common/gtest/gtest-1.7.0/CHANGES        |    157 +
 ThirdParty/common/gtest/gtest-1.7.0/CMakeLists.txt |    254 +
 ThirdParty/common/gtest/gtest-1.7.0/CONTRIBUTORS   |     37 +
 ThirdParty/common/gtest/gtest-1.7.0/LICENSE        |     28 +
 ThirdParty/common/gtest/gtest-1.7.0/Makefile.am    |    306 +
 ThirdParty/common/gtest/gtest-1.7.0/Makefile.in    |   1360 +
 ThirdParty/common/gtest/gtest-1.7.0/README         |    435 +
 ThirdParty/common/gtest/gtest-1.7.0/aclocal.m4     |   1198 +
 .../gtest/gtest-1.7.0/build-aux/config.guess       |   1530 +
 .../common/gtest/gtest-1.7.0/build-aux/config.h.in |     69 +
 .../common/gtest/gtest-1.7.0/build-aux/config.sub  |   1773 +
 .../common/gtest/gtest-1.7.0/build-aux/depcomp     |    688 +
 .../common/gtest/gtest-1.7.0/build-aux/install-sh  |    527 +
 .../common/gtest/gtest-1.7.0/build-aux/ltmain.sh   |   9661 ++
 .../common/gtest/gtest-1.7.0/build-aux/missing     |    331 +
 .../gtest/gtest-1.7.0/cmake/internal_utils.cmake   |    227 +
 .../common/gtest/gtest-1.7.0/codegear/gtest.cbproj |    138 +
 .../gtest/gtest-1.7.0/codegear/gtest.groupproj     |     54 +
 .../common/gtest/gtest-1.7.0/codegear/gtest_all.cc |     38 +
 .../gtest/gtest-1.7.0/codegear/gtest_link.cc       |     40 +
 .../gtest/gtest-1.7.0/codegear/gtest_main.cbproj   |     82 +
 .../gtest-1.7.0/codegear/gtest_unittest.cbproj     |     88 +
 ThirdParty/common/gtest/gtest-1.7.0/configure      |  18222 +++
 ThirdParty/common/gtest/gtest-1.7.0/configure.ac   |     68 +
 .../gtest/gtest-1.7.0/fused-src/gtest/gtest-all.cc |   9592 ++
 .../gtest/gtest-1.7.0/fused-src/gtest/gtest.h      |  20061 +++
 .../gtest-1.7.0/fused-src/gtest/gtest_main.cc      |     38 +
 .../gtest-1.7.0/include/gtest/gtest-death-test.h   |    294 +
 .../gtest-1.7.0/include/gtest/gtest-message.h      |    250 +
 .../gtest-1.7.0/include/gtest/gtest-param-test.h   |   1421 +
 .../include/gtest/gtest-param-test.h.pump          |    487 +
 .../gtest-1.7.0/include/gtest/gtest-printers.h     |    855 +
 .../gtest/gtest-1.7.0/include/gtest/gtest-spi.h    |    232 +
 .../gtest-1.7.0/include/gtest/gtest-test-part.h    |    179 +
 .../gtest-1.7.0/include/gtest/gtest-typed-test.h   |    259 +
 .../common/gtest/gtest-1.7.0/include/gtest/gtest.h |   2291 +
 .../gtest-1.7.0/include/gtest/gtest_pred_impl.h    |    358 +
 .../gtest/gtest-1.7.0/include/gtest/gtest_prod.h   |     58 +
 .../gtest/internal/gtest-death-test-internal.h     |    319 +
 .../include/gtest/internal/gtest-filepath.h        |    206 +
 .../include/gtest/internal/gtest-internal.h        |   1158 +
 .../include/gtest/internal/gtest-linked_ptr.h      |    233 +
 .../gtest/internal/gtest-param-util-generated.h    |   5143 +
 .../internal/gtest-param-util-generated.h.pump     |    301 +
 .../include/gtest/internal/gtest-param-util.h      |    619 +
 .../include/gtest/internal/gtest-port.h            |   1947 +
 .../include/gtest/internal/gtest-string.h          |    167 +
 .../include/gtest/internal/gtest-tuple.h           |   1012 +
 .../include/gtest/internal/gtest-tuple.h.pump      |    339 +
 .../include/gtest/internal/gtest-type-util.h       |   3331 +
 .../include/gtest/internal/gtest-type-util.h.pump  |    297 +
 .../common/gtest/gtest-1.7.0/m4/acx_pthread.m4     |    363 +
 ThirdParty/common/gtest/gtest-1.7.0/m4/gtest.m4    |     74 +
 ThirdParty/common/gtest/gtest-1.7.0/m4/libtool.m4  |   8001 ++
 .../common/gtest/gtest-1.7.0/m4/ltoptions.m4       |    384 +
 ThirdParty/common/gtest/gtest-1.7.0/m4/ltsugar.m4  |    123 +
 .../common/gtest/gtest-1.7.0/m4/ltversion.m4       |     23 +
 .../common/gtest/gtest-1.7.0/m4/lt~obsolete.m4     |     98 +
 ThirdParty/common/gtest/gtest-1.7.0/make/Makefile  |     82 +
 .../common/gtest/gtest-1.7.0/msvc/gtest-md.sln     |     45 +
 .../common/gtest/gtest-1.7.0/msvc/gtest-md.vcproj  |    126 +
 ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest.sln |     45 +
 .../common/gtest/gtest-1.7.0/msvc/gtest.vcproj     |    126 +
 .../gtest/gtest-1.7.0/msvc/gtest_main-md.vcproj    |    129 +
 .../gtest/gtest-1.7.0/msvc/gtest_main.vcproj       |    129 +
 .../gtest-1.7.0/msvc/gtest_prod_test-md.vcproj     |    164 +
 .../gtest/gtest-1.7.0/msvc/gtest_prod_test.vcproj  |    164 +
 .../gtest-1.7.0/msvc/gtest_unittest-md.vcproj      |    147 +
 .../gtest/gtest-1.7.0/msvc/gtest_unittest.vcproj   |    147 +
 .../gtest/gtest-1.7.0/samples/prime_tables.h       |    123 +
 .../common/gtest/gtest-1.7.0/samples/sample1.cc    |     68 +
 .../common/gtest/gtest-1.7.0/samples/sample1.h     |     43 +
 .../gtest/gtest-1.7.0/samples/sample10_unittest.cc |    144 +
 .../gtest/gtest-1.7.0/samples/sample1_unittest.cc  |    153 +
 .../common/gtest/gtest-1.7.0/samples/sample2.cc    |     56 +
 .../common/gtest/gtest-1.7.0/samples/sample2.h     |     85 +
 .../gtest/gtest-1.7.0/samples/sample2_unittest.cc  |    109 +
 .../common/gtest/gtest-1.7.0/samples/sample3-inl.h |    172 +
 .../gtest/gtest-1.7.0/samples/sample3_unittest.cc  |    151 +
 .../common/gtest/gtest-1.7.0/samples/sample4.cc    |     46 +
 .../common/gtest/gtest-1.7.0/samples/sample4.h     |     53 +
 .../gtest/gtest-1.7.0/samples/sample4_unittest.cc  |     45 +
 .../gtest/gtest-1.7.0/samples/sample5_unittest.cc  |    199 +
 .../gtest/gtest-1.7.0/samples/sample6_unittest.cc  |    224 +
 .../gtest/gtest-1.7.0/samples/sample7_unittest.cc  |    130 +
 .../gtest/gtest-1.7.0/samples/sample8_unittest.cc  |    173 +
 .../gtest/gtest-1.7.0/samples/sample9_unittest.cc  |    160 +
 .../gtest/gtest-1.7.0/scripts/fuse_gtest_files.py  |    250 +
 .../gtest-1.7.0/scripts/gen_gtest_pred_impl.py     |    730 +
 .../gtest/gtest-1.7.0/scripts/gtest-config.in      |    274 +
 .../common/gtest/gtest-1.7.0/scripts/pump.py       |    855 +
 .../common/gtest/gtest-1.7.0/scripts/test/Makefile |     59 +
 .../common/gtest/gtest-1.7.0/src/gtest-all.cc      |     48 +
 .../gtest/gtest-1.7.0/src/gtest-death-test.cc      |   1344 +
 .../common/gtest/gtest-1.7.0/src/gtest-filepath.cc |    382 +
 .../gtest/gtest-1.7.0/src/gtest-internal-inl.h     |   1218 +
 .../common/gtest/gtest-1.7.0/src/gtest-port.cc     |    805 +
 .../common/gtest/gtest-1.7.0/src/gtest-printers.cc |    363 +
 .../gtest/gtest-1.7.0/src/gtest-test-part.cc       |    110 +
 .../gtest/gtest-1.7.0/src/gtest-typed-test.cc      |    110 +
 ThirdParty/common/gtest/gtest-1.7.0/src/gtest.cc   |   5020 +
 .../common/gtest/gtest-1.7.0/src/gtest.orig.cc     |   5015 +
 .../common/gtest/gtest-1.7.0/src/gtest_main.cc     |     38 +
 .../gtest-1.7.0/test/gtest-death-test_ex_test.cc   |     93 +
 .../gtest-1.7.0/test/gtest-death-test_test.cc      |   1367 +
 .../gtest/gtest-1.7.0/test/gtest-filepath_test.cc  |    680 +
 .../gtest-1.7.0/test/gtest-linked_ptr_test.cc      |    154 +
 .../gtest/gtest-1.7.0/test/gtest-listener_test.cc  |    310 +
 .../gtest/gtest-1.7.0/test/gtest-message_test.cc   |    159 +
 .../gtest/gtest-1.7.0/test/gtest-options_test.cc   |    215 +
 .../gtest-1.7.0/test/gtest-param-test2_test.cc     |     65 +
 .../gtest-1.7.0/test/gtest-param-test_test.cc      |    904 +
 .../gtest/gtest-1.7.0/test/gtest-param-test_test.h |     57 +
 .../gtest/gtest-1.7.0/test/gtest-port_test.cc      |   1253 +
 .../gtest/gtest-1.7.0/test/gtest-printers_test.cc  |   1566 +
 .../gtest/gtest-1.7.0/test/gtest-test-part_test.cc |    208 +
 .../gtest/gtest-1.7.0/test/gtest-tuple_test.cc     |    320 +
 .../gtest-1.7.0/test/gtest-typed-test2_test.cc     |     45 +
 .../gtest-1.7.0/test/gtest-typed-test_test.cc      |    360 +
 .../gtest/gtest-1.7.0/test/gtest-typed-test_test.h |     66 +
 .../gtest-1.7.0/test/gtest-unittest-api_test.cc    |    341 +
 .../gtest/gtest-1.7.0/test/gtest_all_test.cc       |     47 +
 .../test/gtest_break_on_failure_unittest.py        |    212 +
 .../test/gtest_break_on_failure_unittest_.cc       |     88 +
 .../test/gtest_catch_exceptions_test.py            |    237 +
 .../test/gtest_catch_exceptions_test_.cc           |    311 +
 .../gtest/gtest-1.7.0/test/gtest_color_test.py     |    130 +
 .../gtest/gtest-1.7.0/test/gtest_color_test_.cc    |     71 +
 .../gtest/gtest-1.7.0/test/gtest_env_var_test.py   |    103 +
 .../gtest/gtest-1.7.0/test/gtest_env_var_test_.cc  |    126 +
 .../gtest-1.7.0/test/gtest_environment_test.cc     |    192 +
 .../gtest-1.7.0/test/gtest_filter_unittest.py      |    633 +
 .../gtest-1.7.0/test/gtest_filter_unittest_.cc     |    140 +
 .../gtest/gtest-1.7.0/test/gtest_help_test.py      |    172 +
 .../gtest/gtest-1.7.0/test/gtest_help_test_.cc     |     46 +
 .../gtest-1.7.0/test/gtest_list_tests_unittest.py  |    207 +
 .../gtest-1.7.0/test/gtest_list_tests_unittest_.cc |    157 +
 .../gtest/gtest-1.7.0/test/gtest_main_unittest.cc  |     45 +
 .../gtest-1.7.0/test/gtest_no_test_unittest.cc     |     56 +
 .../gtest/gtest-1.7.0/test/gtest_output_test.py    |    335 +
 .../gtest/gtest-1.7.0/test/gtest_output_test_.cc   |   1034 +
 .../test/gtest_output_test_golden_lin.txt          |    720 +
 .../gtest-1.7.0/test/gtest_pred_impl_unittest.cc   |   2427 +
 .../gtest-1.7.0/test/gtest_premature_exit_test.cc  |    141 +
 .../gtest/gtest-1.7.0/test/gtest_prod_test.cc      |     57 +
 .../gtest/gtest-1.7.0/test/gtest_repeat_test.cc    |    253 +
 .../gtest/gtest-1.7.0/test/gtest_shuffle_test.py   |    325 +
 .../gtest/gtest-1.7.0/test/gtest_shuffle_test_.cc  |    103 +
 .../gtest-1.7.0/test/gtest_sole_header_test.cc     |     57 +
 .../gtest/gtest-1.7.0/test/gtest_stress_test.cc    |    256 +
 .../gtest/gtest-1.7.0/test/gtest_test_utils.py     |    320 +
 .../test/gtest_throw_on_failure_ex_test.cc         |     92 +
 .../test/gtest_throw_on_failure_test.py            |    171 +
 .../test/gtest_throw_on_failure_test_.cc           |     72 +
 .../gtest-1.7.0/test/gtest_uninitialized_test.py   |     70 +
 .../gtest-1.7.0/test/gtest_uninitialized_test_.cc  |     43 +
 .../gtest/gtest-1.7.0/test/gtest_unittest.cc       |   7415 ++
 .../gtest-1.7.0/test/gtest_xml_outfile1_test_.cc   |     49 +
 .../gtest-1.7.0/test/gtest_xml_outfile2_test_.cc   |     49 +
 .../gtest-1.7.0/test/gtest_xml_outfiles_test.py    |    132 +
 .../gtest-1.7.0/test/gtest_xml_output_unittest.py  |    307 +
 .../gtest-1.7.0/test/gtest_xml_output_unittest_.cc |    181 +
 .../gtest/gtest-1.7.0/test/gtest_xml_test_utils.py |    194 +
 .../common/gtest/gtest-1.7.0/test/production.cc    |     36 +
 .../common/gtest/gtest-1.7.0/test/production.h     |     55 +
 .../gtest-1.7.0/xcode/Config/DebugProject.xcconfig |     30 +
 .../xcode/Config/FrameworkTarget.xcconfig          |     17 +
 .../gtest-1.7.0/xcode/Config/General.xcconfig      |     41 +
 .../xcode/Config/ReleaseProject.xcconfig           |     32 +
 .../xcode/Config/StaticLibraryTarget.xcconfig      |     18 +
 .../gtest-1.7.0/xcode/Config/TestTarget.xcconfig   |      8 +
 .../gtest/gtest-1.7.0/xcode/Resources/Info.plist   |     30 +
 .../xcode/Samples/FrameworkSample/Info.plist       |     28 +
 .../WidgetFramework.xcodeproj/project.pbxproj      |    457 +
 .../xcode/Samples/FrameworkSample/runtests.sh      |     62 +
 .../xcode/Samples/FrameworkSample/widget.cc        |     63 +
 .../xcode/Samples/FrameworkSample/widget.h         |     59 +
 .../xcode/Samples/FrameworkSample/widget_test.cc   |     68 +
 .../gtest/gtest-1.7.0/xcode/Scripts/runtests.sh    |     65 +
 .../gtest-1.7.0/xcode/Scripts/versiongenerate.py   |    100 +
 .../xcode/gtest.xcodeproj/project.pbxproj          |   1135 +
 VERSION.cmake                                      |      3 +
 Wrap/WinDllMacros.h                                |     34 +
 Wrap/python/README                                 |     10 +
 Wrap/python/__init__.py.in                         |     13 +
 Wrap/python/bornagain_python_install.py            |    297 +
 Wrap/python/plot_utils.py                          |    214 +
 Wrap/swig/DoxyfileSwig.in                          |   1194 +
 Wrap/swig/directors.i                              |     15 +
 Wrap/swig/doxy2swig.py                             |    379 +
 Wrap/swig/extendCore.i                             |     70 +
 Wrap/swig/extendFit.i                              |     43 +
 Wrap/swig/ignores.i                                |     69 +
 Wrap/swig/libBornAgainCore.i                       |    428 +
 Wrap/swig/libBornAgainFit.i                        |     89 +
 Wrap/swig/numpy.i                                  |   3161 +
 Wrap/swig/shared_pointers.i                        |      3 +
 Wrap/swig/tweaks.py                                |     44 +
 Wrap/swig/warnings.i                               |      8 +
 auto/README                                        |     20 +
 auto/Wrap/doxygen_core.i                           |  14866 +++
 auto/Wrap/doxygen_fit.i                            |   1691 +
 auto/Wrap/libBornAgainCore.py                      |  24639 ++++
 auto/Wrap/libBornAgainCore_wrap.cpp                | 117124 ++++++++++++++++++
 auto/Wrap/libBornAgainCore_wrap.h                  |    415 +
 auto/Wrap/libBornAgainFit.py                       |   2548 +
 auto/Wrap/libBornAgainFit_wrap.cpp                 |  23487 ++++
 auto/Wrap/libBornAgainFit_wrap.h                   |     18 +
 cmake/bornagain/CMakeLists.txt                     |     23 +
 cmake/bornagain/modules/BornAgainCPack.cmake       |     83 +
 .../bornagain/modules/BornAgainConfiguration.cmake |    157 +
 cmake/bornagain/modules/CPackApple.cmake           |      7 +
 cmake/bornagain/modules/CPackDebian.cmake          |     47 +
 cmake/bornagain/modules/CPackWindows.cmake         |     52 +
 cmake/bornagain/modules/CheckCode.cmake            |     12 +
 cmake/bornagain/modules/CheckCompiler.cmake        |     84 +
 cmake/bornagain/modules/FixAppleBundle.cmake.in    |      6 +
 cmake/bornagain/modules/GeneratePythonDocs.cmake   |     21 +
 cmake/bornagain/modules/NSIS.InstallOptions.ini.in |     46 +
 cmake/bornagain/modules/NSIS.template.in           |   1230 +
 cmake/bornagain/modules/PyExamplesLineLength.cmake |     14 +
 .../modules/SearchInstalledSoftware.cmake          |     79 +
 cmake/bornagain/modules/SearchQt.cmake             |     17 +
 cmake/bornagain/modules/SetUpLinux.cmake           |     25 +
 cmake/bornagain/modules/SetUpMacOS.cmake           |    113 +
 cmake/bornagain/modules/SetUpWindows.cmake         |     13 +
 cmake/bornagain/modules/SetupCoverage.cmake        |     19 +
 cmake/bornagain/scripts/BAVersion.h.in             |     45 +
 cmake/bornagain/scripts/CTestCustom.cmake.in       |      2 +
 cmake/bornagain/scripts/FindBornAgain.cmake.in     |     44 +
 cmake/bornagain/scripts/GoogletestFooter.cpp       |     27 +
 cmake/bornagain/scripts/GoogletestHeader.cpp       |      8 +
 cmake/bornagain/scripts/MacOSXBundleInfo.plist.in  |     36 +
 cmake/bornagain/scripts/auto_README.in             |     20 +
 cmake/bornagain/scripts/fix_apple_bundle.py        |    421 +
 cmake/bornagain/scripts/postinst.in                |     11 +
 cmake/bornagain/scripts/prerm.in                   |     11 +
 cmake/bornagain/scripts/qt.conf                    |      4 +
 cmake/bornagain/scripts/thisbornagain.csh.in       |    141 +
 cmake/bornagain/scripts/thisbornagain.sh.in        |    114 +
 cmake/generic/modules/AddGTest.cmake               |     36 +
 cmake/generic/modules/CheckCoverage.cmake          |     87 +
 cmake/generic/modules/DebugOptimization.cmake      |     30 +
 cmake/generic/modules/FindBoost.cmake              |   1825 +
 cmake/generic/modules/FindEigen3.cmake             |     81 +
 cmake/generic/modules/FindFFTW.cmake               |     68 +
 cmake/generic/modules/FindGSL.cmake                |    239 +
 cmake/generic/modules/FindNumpy.cmake              |     48 +
 cmake/generic/modules/FindPyYaml.cmake             |     19 +
 cmake/generic/modules/FindPythonLibsNew.cmake      |    233 +
 cmake/generic/modules/FindTIFF.cmake               |     75 +
 cmake/generic/modules/FindYamlCpp05.cmake          |    100 +
 cmake/generic/modules/GetFilenameComponent.cmake   |     17 +
 cmake/generic/modules/GlobDirectories.cmake        |     10 +
 cmake/generic/modules/PreventInSourceBuilds.cmake  |     20 +
 cmake/generic/modules/UseLATEX.cmake               |   1393 +
 dev-tools/README                                   |      9 +
 dev-tools/ad-hoc/JWu/bornplot2.py                  |    167 +
 dev-tools/ad-hoc/JWu/par_changed.py                |     35 +
 dev-tools/ad-hoc/JWu/partial_history.txt           |     44 +
 dev-tools/ad-hoc/JWu/perf-log-old2yaml.py          |    127 +
 dev-tools/analyze/cl_lines_of_code.py              |    344 +
 dev-tools/analyze/count-line-length.py             |     53 +
 dev-tools/analyze/lines_of_code.png                |    Bin 0 -> 23382 bytes
 dev-tools/analyze/lines_of_code.py                 |    354 +
 dev-tools/check-examples/check_examples.py         |    159 +
 dev-tools/code-tools/print-includes.py             |     34 +
 dev-tools/code-tools/update-gtestlist.py           |     31 +
 dev-tools/deploy/mavericks-dev/Vagrantfile         |     31 +
 dev-tools/deploy/mavericks-dev/build_bornagain.sh  |     22 +
 dev-tools/deploy/ubuntu-dev/Vagrantfile            |     74 +
 dev-tools/deploy/ubuntu-dev/build_bornagain.sh     |      8 +
 dev-tools/deploy/ubuntu-dev/ubuntu_provision.sh    |      5 +
 dev-tools/edit/ed-files-vanilla.py                 |     36 +
 dev-tools/edit/update-filename.py                  |     64 +
 dev-tools/edit/update-minimizers.py                |     72 +
 dev-tools/edit/update-sourcecode-header.py         |    141 +
 dev-tools/log/perf_history.txt                     |    562 +
 dev-tools/math/fftest/Makefile                     |     15 +
 dev-tools/math/fftest/ff_diff.py                   |     44 +
 dev-tools/math/fftest/limit-run                    |     26 +
 dev-tools/math/fftest/polyh_test.cpp               |    255 +
 dev-tools/math/fftest/runff.cpp                    |    403 +
 dev-tools/math/fftest/triangle_runs                |      5 +
 dev-tools/math/polyhedron/setup_dodecahedron.py    |     79 +
 dev-tools/math/polyhedron/setup_icosahedron.py     |     67 +
 dev-tools/openmpi/batest/CMakeLists.txt            |     44 +
 dev-tools/openmpi/batest/batest.cpp                |     38 +
 .../openmpi/batest/modules/FindBornAgain.cmake     |     44 +
 dev-tools/openmpi/batest/modules/FindEigen3.cmake  |     81 +
 dev-tools/openmpi/batest/modules/FindROOT.cmake    |    170 +
 dev-tools/openmpi/helloworld/CMakeLists.txt        |     20 +
 dev-tools/openmpi/helloworld/helloworld.cpp        |     28 +
 .../pytests/001_150_P109_cut_phitheta.txt.gz       |    Bin 0 -> 121144 bytes
 dev-tools/openmpi/pytests/job1.cmd                 |     30 +
 dev-tools/openmpi/pytests/ompi_isgisaxs01.py       |    106 +
 dev-tools/openmpi/pytests/ompi_isgisaxs01_cpp.py   |     85 +
 dev-tools/openmpi/pytests/ompi_meso.py             |    230 +
 dev-tools/openmpi/pytests/ompi_meso_cpp.py         |    208 +
 dev-tools/openmpi/pytests/result.png               |    Bin 0 -> 83035 bytes
 dev-tools/openmpi/pytests/result.txt               |    182 +
 dev-tools/openmpi/pytests/round1_sim3_ompi.py      |    230 +
 dev-tools/openmpi/supermuc.sh                      |     17 +
 dev-tools/plot-ff/plotff.py                        |    138 +
 dev-tools/plot-ff/plotpardep.py                    |    172 +
 dev-tools/plot-ff/plotpardeppyramid.py             |    179 +
 dev-tools/profiling/README                         |     63 +
 dev-tools/profiling/run_gperftools.sh              |     53 +
 dev-tools/profiling/run_valgrind.sh                |     37 +
 dev-tools/release/make_release.py                  |     29 +
 dev-tools/release/utils/__init__.py                |      0
 dev-tools/release/utils/check_release.py           |     59 +
 dev-tools/release/utils/common.py                  |     74 +
 dev-tools/release/utils/finalize_release.py        |     88 +
 dev-tools/release/utils/prepare_release.py         |     89 +
 unused/ComponentParameter.cpp                      |     16 +
 unused/ComponentParameter.h                        |     43 +
 unused/MatrixSpecularInfoMapTest.h                 |     84 +
 unused/OMPISimulation.cpp                          |     94 +
 unused/OMPISimulation.h                            |     31 +
 unused/ScalarSpecularInfoMapTest.h                 |     86 +
 unused/ScanningMinimizer.cpp                       |    108 +
 unused/ScanningMinimizer.h                         |     64 +
 2593 files changed, 666205 insertions(+)

diff --git a/.appveyor.yml b/.appveyor.yml
new file mode 100644
index 0000000..2af0246
--- /dev/null
+++ b/.appveyor.yml
@@ -0,0 +1,29 @@
+image: Visual Studio 2015
+
+matrix:
+  fast_finish: true
+
+platform:
+- x64
+
+# http://www.appveyor.com/docs/installed-software
+environment:
+  QTDIR: "C:\\Qt\\5.7\\msvc2015_64"
+  PATH: "C:\\Qt\\5.7\\msvc2015_64\\bin;C:\\opt\\local_x64\\lib;C:\\Miniconda-x64;C:\\Miniconda-x64\\Scripts;C:\\Miniconda-x64\\Library\\bin;%PATH%"
+build:
+  parallel: true
+
+before_build:
+- python -m pip install numpy
+- python -m pip install pyyaml
+- C:\cygwin\bin\wget -q http://apps.jcns.fz-juelich.de/redmine/attachments/download/279/local_x64.zip -O %temp%\local_x64.zip
+- 7z x %temp%\local_x64.zip -oC:\opt > null
+
+build_script:
+- mkdir build
+- cd build
+- cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_INCLUDE_PATH=C:/opt/local_x64/include -DCMAKE_LIBRARY_PATH=C:/opt/local_x64/lib ..
+- cmake --build . --config Release
+
+test_script:
+- ctest
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..9a83b21
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,9 @@
+<!-- TEMPLATE FOR BUG REPORTS -->
+
+### Expected behavior
+
+### Actual behavior
+
+### Steps to reproduce the behavior
+
+### Platforms affected
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..d03299a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,28 @@
+language: cpp
+sudo: required
+
+#services:
+#- docker
+
+ 
+#env:
+#- BUILD_TYPE=Release
+
+matrix:
+  include:
+    - os: linux
+      services: docker
+      env: BUILD_TYPE=Release
+    - os: osx
+      osx_image: xcode7.3
+      env: BUILD_TYPE=Release
+
+before_install:
+- chmod +x .travis/*/*.sh
+
+install:
+- .travis/${TRAVIS_OS_NAME}/install.sh
+
+script:
+- .travis/${TRAVIS_OS_NAME}/build.sh
+- .travis/${TRAVIS_OS_NAME}/test.sh
diff --git a/.travis/linux/Dockerfile b/.travis/linux/Dockerfile
new file mode 100644
index 0000000..5bcc5c7
--- /dev/null
+++ b/.travis/linux/Dockerfile
@@ -0,0 +1,4 @@
+FROM scgmlz/bornagain-dev:xenial
+
+ADD . /source
+WORKDIR /source
diff --git a/.travis/linux/build.sh b/.travis/linux/build.sh
new file mode 100644
index 0000000..3180498
--- /dev/null
+++ b/.travis/linux/build.sh
@@ -0,0 +1,3 @@
+docker exec dd bash -c "mkdir build"
+docker exec dd bash -c "cd build && cmake -D CMAKE_BUILD_TYPE=$BUILD_TYPE .."
+docker exec dd bash -c "cd build && make -j9"
diff --git a/.travis/linux/install.sh b/.travis/linux/install.sh
new file mode 100644
index 0000000..4e8a6c3
--- /dev/null
+++ b/.travis/linux/install.sh
@@ -0,0 +1,3 @@
+docker build -t bornagain/wily -f `dirname $0`/Dockerfile .
+docker run -d --name dd -it bornagain/wily
+docker ps -a
diff --git a/.travis/linux/test.sh b/.travis/linux/test.sh
new file mode 100644
index 0000000..f0b484b
--- /dev/null
+++ b/.travis/linux/test.sh
@@ -0,0 +1,2 @@
+docker exec dd bash -c "cd build; make check" && exit 0
+docker exec dd bash -c "cat build/Testing/Temporary/*.log" && exit 1
diff --git a/.travis/osx/build.sh b/.travis/osx/build.sh
new file mode 100644
index 0000000..3484e7e
--- /dev/null
+++ b/.travis/osx/build.sh
@@ -0,0 +1,5 @@
+export PATH=/usr/local/opt/qt5/bin/:$PATH
+mkdir build
+cd build
+cmake -DCMAKE_PREFIX_PATH=/usr/local -DCMAKE_BUILD_TYPE=$BUILD_TYPE ..
+make -j4
diff --git a/.travis/osx/install.sh b/.travis/osx/install.sh
new file mode 100644
index 0000000..1809761
--- /dev/null
+++ b/.travis/osx/install.sh
@@ -0,0 +1,3 @@
+brew update
+brew install git fftw gsl python homebrew/python/matplotlib numpy boost-python qt5 eigen libyaml yaml-cpp
+pip install pyyaml
diff --git a/.travis/osx/test.sh b/.travis/osx/test.sh
new file mode 100644
index 0000000..ad53717
--- /dev/null
+++ b/.travis/osx/test.sh
@@ -0,0 +1,5 @@
+#cd build
+#make check && exit 0
+#cat ./Testing/Temporary/*.log
+#exit 1
+exit 0
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..17a09c4
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,783 @@
+BornAgain-1.7.0, released 2016.11.14
+  > API changes
+    1) The one-argument constructors of FormFactorGauss and FormFactorLorentz now accept a length instead of a volume
+    2) GUI project back-compatibility broken
+  > Summary:
+    1) We moved the source repository from our own server to GitHub,
+         https://github.com/scgmlz/BornAgain.
+       This makes it easy for external contributors to propose changes in form of pull requests.
+       Appveyor and Travis continuous integration server automatize tests.
+       Python usage examples are now also covered by tests.
+    2) GUI support for fitting real data extended: masking, region of interest, linking dataset to defined instrument.
+       Control parameters for different fit engines unified.
+    3) Behind the scenes: many directories, files, classes renamed or reorganized.
+
+  * Bug #1498: Fitting in GUI: values for all fitting parameters are reported as the same
+  * Bug #1499: GUI Segmentation fault if layer is too thick
+  * Bug #1511: Roughness simulations give incorrect scattering contribution below the sample horizon
+  * Bug #1512: GUI crashes when simulating for a lognormal distribution of wavelength with scale parameter zero
+  * Bug #1515: GUI: error in determination of size of imported tiff file causes crash of fitting
+  * Bug #1516: Consider include of ms-win-runtime library into Windows installer
+  * Bug #1520: GUI: global progress bar seems to be not updating
+  * Bug #1558: Memory leakges in Python on Simulation::getIntensityData call
+  * Bug #1559: Restore intensitydata.py functional test
+  * Bug #1571: PyCoreTest overlooks complete obstruction of simulation
+  * Bug #1576: bornagain/__init__.py must not require matplotlib
+  * Bug #1583: PyPersist tests fail if build directory path contains a '.'
+  * Bug #1600: PyPersistenceTest throws an exception from regex
+  * Bug #1603: GUI: Cancel job is not working anymore after the refactoring of ProgressHandler, GUI real-time performance is heavily affected too
+  * Bug #1613: detector.setPerpendicularToReflectedBeam moves detector in the case of the beam divergence
+  * Bug #1621: Broken parameter name translation for certain names in GUI fitting job
+  * Bug #1630: Monte Carlo and multithreading options are not propagated to GUI fitting
+  * Feature #1120: Calculate the specular peak intensity: |R|^2 at the specular pixel
+  * Feature #1238: nicer layout for newsletter at bornagainproject.org (reopened: v1.6.0 round mail still had black bars)
+  * Feature #1475: DOI for BornAgain
+  * Feature #1513: Provide more informational throw message from RealParameterWrapper.
+  * Feature #1543: decouple FitKernel from FitSuite
+  * Feature #1560: Provide simulation running from Python with text version of progress bar
+  * Feature #1561: merge FTDistribution.. and FTDecayFunction..
+  * Feature #1563: Investigate time-of-life of SampleBuilder in Python context
+  * Feature #1564: split "Pi.h" from Units.h
+  * Feature #1573: facilitate plotting from Python scripts exported by PyCore tests.
+  * Feature #1620: Extend numpy support
+  * Documentation #991: Revise and reintegrate chapter on particle distributions
+  * Documentation #1351: Drupal: update installation instructions, tutorials for coming release
+  * Documentation #1412: avoid horizontal scrolling in code examples
+  * Documentation #1517: Add the case with missed msvc2015 runtime library on Windows systems to the troubleshooting section
+  * Documentation #1589: Clone drupal website
+  * Documentation #1590: Update to drupal 8
+  * Refactoring #1419: move test code out of core
+  * Refactoring #1428: Compactify code that handles parameters (use abstract mechanism instead of treating each single parameter explicitly)
+  * Refactoring #1440: cover Python examples by functional tests
+  * Refactoring #1466: Refactor core Minimizer family to match the GUI presentation
+  * Refactoring #1477: Provide more detailed info on Exception thrown from Polyhedron based form factors
+  * Refactoring #1487: GUI: introduce ROI (region of interest) in MaskEditor
+  * Refactoring #1488: GUI: provide integration of ImportDataView and InstrumentView
+  * Refactoring #1497: Agree on new Core directory structure and class renaming to Rename certain classes and methods.
+  * Refactoring #1514: Remove code duplication in Distributions.h and .cpp
+  * Refactoring #1524: "FitSuite" currently used in two different meanings
+  * Refactoring #1526: replace "FunctionalTest" by more specific terms in several test machinery classes
+  * Refactoring #1527: simplify containsMagneticMaterial, printSampleTree, genPyScript
+  * Refactoring #1542: Make ParameterPool and RealParameter independent of IParameterized
+  * Refactoring #1546: disambiguate getRadius()
+  * Refactoring #1550: in .h file header comments, replace »Declares« by »Defines«
+  * Refactoring #1556: FormFactorInfo: remove unused m_pos_x, m_pos_y
+  * Refactoring #1565: to associate units with parameters, use string instead of inheritance
+  * Refactoring #1588: FitSuiteParameters inhibits Python iterator
+  * Refactoring #1593: Remove soft particle constructors that have a volume argument instead of the usual length
+  * Refactoring #1594: Review and possibly refactor IFormFactor class hierarchy
+  * Refactoring #1605: Revise public API of fitting classes
+  * Configuration #1255: MacOS: provide vagrant build configurations for Mavericks
+  * Configuration #1344: MacOS: install buildslave to macmini
+  * Configuration #1447: Migrate to GitHub
+  * Configuration #1483: Fix shuwdown of Windows10 build slave
+  * Configuration #1501: version tag must start with 'v' (change release script or instructions)
+  * Configuration #1502: rebase all branches after release (change release script or instructions)
+  * Configuration #1577: Qt qcreator navigation/recognition is broken for all unit tests
+  * Configuration #1595: Fix Windows builds
+
+BornAgain-1.6.2, released 2016.07.15
+  > Hotfix:
+  * Bug #1558: Memory leakages in Python on Simulation::getIntensityData call
+
+BornAgain-1.6.1, released 2016.07.15
+  > Hotfix:
+  * Bug #1499: GUI Segmentation fault if layer is too thick
+  * Bug #1512: GUI crashes when simulating for a lognormal distribution of wavelength with scale parameter zero
+
+BornAgain-1.6.0, released 2016.06.30
+  > Summary:
+    1) Python3 support
+    2) GUI: beta version of fitting
+    3) Core: new roughness calculation that is more stable for large roughness
+    4) Core: new formfactors dodecahedron and icosahedron
+    5) Windows: switched to 64-bits
+
+  * Bug #1084: MultiLayer samples with roughness (and without particles) report wrong progress to the GUI's progress bar
+  * Bug #1113: GUI: python script view is not updating while selecting different multilayers
+  * Bug #1274: GUI: rotated ellipse in MaskEditor is wrongly propagated to domain
+  * Bug #1294: provide substantial unit tests for factor computations
+  * Bug #1338: Crash while saving certain project file
+  * Bug #1343: GUI: online update notifier is not working
+  * Bug #1358: for complex vector3D, functions mag() and mag2() should return a real, not a complex number
+  * Bug #1367: Fix python bindings to make fitting example FitAlongSlices working
+  * Bug #1370: Fix numerous "features" introduced by latest major GUI refactoring
+  * Bug #1396: GUI: Provide limits for all properties
+  * Bug #1401: correct inaccurate numerics near removable singularity in form factors Tetrahedron and Prism3
+  * Bug #1404: compilation broken for libgsl2
+  * Bug #1405: Implementation error in MultiLayerRoughnessDWBASimulation
+  * Bug #1413: polyhedra won't react to ex-post parameter variation
+  * Bug #1429: Unit tests files are not shown in Qt Creator IDE
+  * Bug #1449: Apply detector resolution function can give negative results
+  * Bug #1455: RuntimeError if CrossCorrLength=0
+  * Bug #1458: Compilation under Mac OS is broken
+  * Bug #1465: Repair MacOS cmake machinery
+  * Bug #1470: Revise all README's in BornAgain source directory.
+  * Feature #335: Check Python 3 compatibility
+  * Feature #1075: Cone6 form factor -> analytic
+  * Feature #1126: GUI: improve performance of IntensityDataWidget while dragging colorbar
+  * Feature #1138: GUI: provide uniform style for double numbers in GUI-generated Python script
+  * Feature #1180: GUI: refactor material editor to make select/cancel behavior less confusing
+  * Feature #1238: nicer layout for newsletter at bornagainproject.org
+  * Feature #1245: Investigate alternative Python API generation (for c++11)
+  * Feature #1281: GUI: provide widget for fit parameters settings
+  * Feature #1305: GUI: Make real time simulation aware of current zoom level to speed up the performance
+  * Feature #1342: GUI: add Monte-Carlo integration option in the simulation
+  * Feature #1365: Replace old ./App based performance test machinery with new one
+  * Feature #1387: GUI: finalize FitWidget
+  * Feature #1388: GUI: refactor RealTimeActivity
+  * Feature #1408: GUI: refactor/beautify/finalize FitWidget
+  * Feature #1409: accelerate Ripple1
+  * Feature #1427: Implement new roughness calculation that is more stable for large roughness
+  * Documentation #1262: Fix IsGISAXS references in form factor section
+  * Documentation #1269: Update documentation for new phi angle definition
+  * Documentation #1280: draw tetrahedron as seen from -x
+  * Documentation #1351: Drupal: update installation instructions, tutorials for coming release 1.6
+  * Documentation #1400: blender: paint dodecahedron and icosahedron
+  * Refactoring #1217: Cleanup App directory from all obsolete code
+  * Refactoring #1258: GUI: move XML related methods outside of the SessionModel
+  * Refactoring #1295: remove 'inc/ and 'src/' directory level
+  * Refactoring #1296: update internal information about performance tests
+  * Refactoring #1333: MSC switches hopefully obsolete
+  * Refactoring #1334: Core: remove ProgramOptions from the simulation
+  * Refactoring #1352: GUI: refactor SessionModel and ParameterizedItem
+  * Refactoring #1353: GUI: refactor AwesomePropertyEditor to rely on new GUI model
+  * Refactoring #1424: reduce verbosity of googletest output
+  * Refactoring #1472: Introduce additional template parameter for IFactory to be able to use QString as a key
+  * Testing #1345: Vagrant: Provide Win10 Vagrant box running on build server
+  * Testing #1346: Winbuild: Provide GSL/Cmake based compilation uder MSVC 2015
+  * Testing #1347: Winbuild: Provide compilation of BornAgain in MSVC 2015 Comunity edition (64bits, Python2 and 3)
+  * Configuration #1350: Buildbot: provide set of configurations for buildbot-based BornAgain's builds
+
+BornAgain-1.5.1, released 2016.02.18
+Hotfix:
+  * Bug #1341: GUI crashes if simulating with 1D lattice interference function
+  * Bug #1338: Crash while saving certain project file
+
+BornAgain-1.5.0, released 2016.02.15
+  > API changes
+    1) FTDecayFunctions introduced to use together with lattices (setDecayFunction)
+       FTDistributions are used, as before, with paracrystals.
+  > Summary:
+    1) Core: interference function calculates particle densities automatically
+    2) GUI: 1D interference function, Rectangular detector, Mask editor
+    3) GUI: Selection of axes (degrees, radians,number of bins, Q-space) for intensity data
+    3) Documentation: new tutorials on web site (rectangular detector, fitting, data treatment, rectangular grating)
+    4) Various bugfixes
+  * Bug #1276: Fix thread concurrency while repoorting progress update in DWBASimulattion
+  * Bug #1297: Reading ASCII intensity files not culture invariant
+  * Bug #1298: Mac os x: BornAgain.app crashes (cannot load the QtNetwork library)
+  * Bug #1302: Script updates following API change
+  * Bug #1303: Functional test montecarlo_integration.py fails
+  * Feature #1035: Revise IFormFactor::getRadius and IFormFactor::getHeight
+  * Feature #1045: Use interference funtion's properties to set total particle surface density
+  * Feature #1148: MacOS: provide generation of dmg installer using Qt5.5
+  * Feature #1149: MacOS: provide Maverick compilation using MacMini and vagrant
+  * Feature #1184: Implement transformation to q-space for intensity image
+  * Feature #1211: Switch to C++-11 for the whole project
+  * Feature #1213: Implement choice of detector in GUI
+  * Feature #1230: GUI mask editor: implement mask editor basic functionality
+  * Feature #1231: GUI mask editor: integrate mask editor into InstrumentView
+  * Feature #1232: GUI mask editor: provide transform from C++ domain to GUI domain
+  * Feature #1233: GUI mask editor: provide transform from C++ domain to python domain
+  * Feature #1234: GUI mask editor: provide functional tests for all 3 domains
+  * Feature #1235: GUI mask editor: integrate IntensityData widget into GraphicsScene
+  * Feature #1246: Investigate refactoring of ParameterizedItem structure
+  * Feature #1259: Add 1D lattice interference function to GUI
+  * Feature #1260: Windows: installer should create PYTHONPATH environment variable in system scope and not in user scope
+  * Feature #1266: GUI: Implement collapsable Accordion widget
+  * Feature #1267: GUI: implement update online notification widget
+  * Feature #1272: GUI: provide run of the fitting in GUI thread
+  * Feature #1275: Provide rectangle detector examples and functional tests
+  * Feature #1283: Provide functional test for all formfactors, when they are rotated and in the presence of absorption
+  * Documentation #1261: Drupal: update installation instructions, tutorials for coming release 1.5
+  * Documentation #1262: Fix IsGISAXS references in form factor section
+  * Documentation #1269: Update documentation for new phi angle definition
+  * Refactoring #1061: describe or remove morphology mode
+  * Refactoring #1236: Clean up remote git branches
+  * Refactoring #1237: GUI: generate distributed parameter names from GUI sample model instead of core model
+  * Refactoring #1264: Refactor ParameterizedItem's different naming schemes
+  * Refactoring #1265: Refactor RectangularDetector API to correspond with the tutorial
+  * Refactoring #1268: Change phi angle convention
+  * Refactoring #1270: Clarify and refactor different naming properties of ParameterizedItem
+  * Refactoring #1271: Investigate necessity of having a separate list for subitems and refactor accordingly
+  * Refactoring #1278: Deprecated declarations by compiling on new systems
+
+BornAgain-1.4.0, released 2015.10.30
+  > No API changes
+  > Summary:
+    1) Improved usability of IntensityData objects (slicing, histogram filling, ...)
+    2) GUI: export of simulation results into tiff or ascii file
+    3) Core: rectangular detector added (not yet in GUI)
+    4) Documentation: extra fitting examples on website
+    5) Various bugfixes
+  > Details of Sprint #29 (see http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/issues)
+  * Bug #1083: Trivial MultiLayer samples (no roughness, no particles) cause simulation crash.
+  * Bug #1130: Validate form factor of truncated sphere for absorption case
+  * Bug #1136: Numerical instability at phi_f=0 on MacOS for Pyramid based form factors
+  * Bug #1152: In Real Time Activity view, negative positions cannot be achieved
+  * Bug #1157: Qt dependency is not mentioned in INSTALL
+  * Bug #1158: many checks fail (1.3.0)
+  * Bug #1167: GUI crash when showing projection
+  * Bug #1170: GUI: InstrumentView alignment problem in detector parameters
+  * Bug #1171: GUI: make thickness disabled for air and substrate layers
+  * Bug #1173: Revise ParticleDistribution base class
+  * Bug #1174: GUI: color of layer does not change if color of material has been changed
+  * Bug #1198: GUI: fix simulation for particle distributions and negative z coordinate
+  * Bug #1212: Windows: modify installer to prepend BornAgain location to system PATH instead of appending to it
+  * Bug #1215: Repair wrong usage of double_epsilon in Core
+  * Bug #1216: GUI: normalization of intensity
+  * Bug #1223: FormFactorTruncatedCube instability under MacOS
+  * Feature #922: Add slicing to IntensityDataFunctions
+  * Feature #948: Implement new IntensityData object with improved usability
+  * Feature #1055: Implement Genetic minimizer to get rid from ROOT dependency
+  * Feature #1081: GUI: provide export of simulation results into tiff file
+  * Feature #1095: Implement rectangular (real space) detector
+  * Feature #1099: Repair fitting with masks
+  * Feature #1179: GUI: provide export of simulation results into text file (*.int)
+  * Feature #1186: Implement tiff import/export in kernel
+  * Documentation #1176: Drupal: update installation instructions, tutorials for coming release 1.4
+  * Documentation #1181: Drupal: provide fitting example along slices
+  * Documentation #1182: Drupal: provide fitting example with simultaneous fit of two datasets
+  * Refactoring #619: Masked simulation doesn't use all threads all the time
+  * Refactoring #1064: Get rid of "pylab" in Python scripts
+
+BornAgain-1.3.0, released 2015.07.30
+  > API Changes:
+    1) Removed 'depth' from ParticleLayout::addParticle: new interface provides for abundance, position and possible rotation
+  > Summary:
+    1) Documentation: description of using positions/rotations for particles
+    2) Documentation: description of building complex shapes by assembling elementary shapes together
+    3) New functional test machinery, covering more test cases in a more consistent way
+    4) Windows installer: for GUI use, python installation is no longer required
+    5) GUI: added position/rotation to ParticleComposition and ParticleCoreShell and enabled adding ParticleComposition to another ParticleComposition
+    6) Various bugfixes
+  > Details of Sprint #28 (see http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/issues)
+  * Bug #1092: BornAgain crashes when connecting ParticleCoreShell to ParticleDistribution
+  * Bug #1101: Fix Python script generation (since refactorings in last release)
+  * Bug #1106: Fix GUI example
+  * Bug #1108: GUI Crash when inserting Distributed Particle in 'Rotated pyramids' example
+  * Bug #1112: Validate domain/GUI/domain convertion of samples with two types of distributed particles
+  * Bug #1114: New functional test PySuite/RectParaCrystal is failing
+  * Bug #1115: New functional test ParticlesInSCCA is failing
+  * Bug #1117: Implement GUI/PyScript functional tests for 2D para crystal and various FTDistributions function
+  * Bug #1118: Implement partial loading from BornAgain-1.2 project files to current 1.3
+  * Bug #1127: Crash after dragging MultiLayer into MultiLayer
+  * Bug #1147: GUI: project open failure for the project file of 1.1 version containing core shell particle
+  * Feature #887: Windows: provide compilation of BornAgain using MSVC2013
+  * Feature #888: Windows: consider include of python27.dll into the installer
+  * Feature #925: Review collection of functional tests
+  * Feature #1020: Refactor GUI (and possibly core) version of Transformation to enable a distribution of position/rotation (2)
+  * Feature #1105: Provide captcha for Drupal site
+  * Feature #1107: Rename 'Transformation' in GUI when only a rotation is meant
+  * Feature #1111: Implement DetectorResolution in python script generator
+  * Feature #1140: Write intensity output file (.int) as matrix having the same dimensions as the intensity array
+  * Documentation #1098: Add two existing Python examples to Drupal
+  * Documentation #1100: Create fitting tutorial for drupal site
+  * Documentation #1132: Drupal: describe particle positioning
+  * Documentation #1133: Drupal: describe particle rotation
+  * Documentation #1134: Drupal: describe complex shapes via particle composition
+  * Documentation #1137: Drupal: update installation instructions, tutorials for coming release 1.3
+  * Refactoring #1121: Remove position/rotation from ParticleDistribution
+  * Testing #1013: Check consistency of depth and abundance between GUI and core
+  * Testing #1016: Implement all form factors GUI functional test
+  * Testing #1122: Provide functional tests to validate particles rotation and positioning
+
+BornAgain-1.2.0, released 2015.06.10
+  > API Changes:
+    1) Rename: 'Simulation' --> 'GISASSimulation' for consistency with other types of simulations
+    2) Removed 'ParticleInfo' completely from public API: position information is now encoded in the Particle's themselves
+  > Summary:
+    1) Documentation: scalar scattering theory in manual
+    2) Support for polarized neutron scattering with polarization/analysis along different axes (not restricted to z-axis)
+    3) New features in Graphical User Interface
+       a) GUI real time view is now saved in projects
+       b) Beam divergence can be exported to Python script
+       c) InstrumentView allows to change beam divergency with the help of fancy distribution viewer
+       d) JobView allows to normalize all selected jobs to the specific min, max to simplify intensity map comparison
+    4) Various bug fixes
+  > Details of Sprint #27 (see http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/issues)
+  * Bug #1047: Release script: move MAC dmg package into 'old' directory
+  * Bug #1048: Update release script for new user manual
+  * Bug #1050: GUI: Variation of lattice orientation in real time view does not work for example 'Hexagonal lattice with basis'
+  * Bug #1057: GUI: run job that was 'Submit only' does not produce a plot
+  * Bug #1066: Model lost after unsuccessful load
+  * Bug #1067: Keyboard shortcuts not always working
+  * Bug #1069: Crash when entering parameter out of range in sample view
+  * Bug #1077: Fix min, max handling for z-axis of ColorMap plot
+  * Bug #1079: Fix appearance of tab with job details on JobView
+  * Bug #1085: Fix crash of GUI while trying to save the project under the name containing special characters
+  * Bug #1091: BORNAGAIN_APP flag does not automatically build 'App'
+  * Bug #1093: showstoppers for release of manual v1.x
+  * Bug #1097: update reference data for functional test 65: montecarlo_integration.py
+  * Feature #957: Investigate automatic generation of meaningful docstring for PythonAPI
+  * Feature #959: GUI: implement saving of RealTimeView content in JobModel
+  * Feature #979: Add standard GNU options -v --version to command bornagain
+  * Feature #996: GUI: implement export to Python in the case of beam divergence
+  * Feature #1015: Implement polarized neutron scattering with beam density matrix and analyser spin filter
+  * Feature #1040: Change angle units from radians to degrees while exporting from PyGenVisitor
+  * Feature #1051: Implement warning sign widget in real time view
+  * Feature #1056: Make default build to not to use system's ROOT
+  * Feature #1062: Add item in drupal's troubleshooting section explaining possible interference between BornAgain and Mantid on MacOS
+  * Feature #1063: Add item in drupal troubleshooting section explaining conflict with previous BornAgain installation
+  * Documentation #915: Provide poster for Galaxi control room
+  * Documentation #990: Proof-read chapter on scalar scattering theory
+  * Documentation #1058: Describe how to install BornAgain on mac to user home folder
+  * Documentation #1059: Provide poster for our building
+  * Refactoring #1046: Replace unnecessary shared_ptr's with scoped_ptr's
+  * Refactoring #1074: Replace complex OutputData structures at low level with vector of required input/output
+
+BornAgain-1.1.0, released 2015.04.15
+  > Summary:
+    1) New form factor of truncated cube
+    2) New features in Graphical User Interface
+       a) Beam divergence, detector resolution function
+       b) ParticleComposition (particle composed from other particles)
+       c) ParticleDistribution (particle with size distribution)
+       d) Export of GUI simulation into a Python script for novice users
+    3) Changes in PythonAPI:
+       a) LatticeBasis now is called a ParticleComposition
+       b) Transform3D object is removed in the favor of RotationX, RotationY, RotationZ and RotationEuler objects
+  > Details of Sprint #26 (see http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/issues)
+  * Bug #951: Unit tests failing with boost-1.57
+  * Bug #968: Merge forked bibliography files
+  * Bug #969: Let user manual version be same as software version
+  * Bug #974: rename BORNAGAIN_MAN
+  * Bug #997: GUI: progress bar shows wrong progress in the case of beam divergence
+  * Bug #998: GUI: beam wavelength with wide gaussian distribution cause crash
+  * Bug #999: GUI: Mouse wheel events on InstrumentView affects values in combo widgets
+  * Bug #1001: GUI: Applying LogNormal distribution to inclination angle causes simulation job failure
+  * Bug #1011: GUI crashes at wrong formfactor parameters
+  * Bug #1037: Doubling of unit cell in hexagonal lattice yields wrong results
+  * Bug #1038: GUI: python script generation fails for the distributed particle
+  * Bug #1041: GUI: depth of particles cannot be negative
+  * Bug #1043: Check R,T coefficients provided by SpecularSimulation class
+  * Feature #827: Forbid in-source build
+  * Feature #834: Integrate python script generation in GUI
+  * Feature #883: Provide the Simulation with possibility to post process IntensityData with the detector resolution function
+  * Feature #895: GUI: implement Python script viewer in SampleView
+  * Feature #924: GUI: update list of saved projects
+  * Feature #937: Revise content and behaviour of GUI's widgetbox for standard samples
+  * Feature #941: GUI: implement detector resolution function
+  * Feature #943: Implement beam divergence in GUI
+  * Feature #972: Setup and describe GUI-version as the default program, add Qt5 dependences to online installation instructions, and use the distributions' native Qt5
+  * Feature #973: GUI invocation: 'BornAgain' -> 'bornagain' (Unix commands must be all lowercase)
+  * Feature #977: Implement GUI version of LatticeBasis
+  * Feature #1006: Make icon for Particle Collection in GUI
+  * Feature #1007: Implement support for Particle Collection in python script generation
+  * Feature #1008: Provide GUI functional test for ParticleComposition
+  * Feature #1010: GUI: provide possibility to fix min, max intensity values while tuning parameters in RealTimeView
+  * Feature #1017: Provide basic working GUI version of ParticleDistribution with single parameter distribution
+  * Feature #1018: Refactor GUI (and possibly core) version of Transformation to enable a distribution of position/rotation
+  * Feature #1036: Implement FormFactorTruncatedCube in GUI
+  * Documentation #394: Write man page(s)
+  * Documentation #659: Extend introduction of User manual
+  * Documentation #942: Write release 1.0.0 news letter for extended mailing list
+  * Documentation #944: Drupal: add small gallery on Welcome page
+  * Documentation #946: Drupal: write how to get help and how to request a new feature in FAQ section
+  * Documentation #949: Drupal: implement tracking of BornAgain downloads number in Google Analytics
+  * Documentation #952: Mention python gdal module in the description of the load tiff data example
+  * Documentation #956: FormFactorTetrahedron: difference in equations in .cpp file and the manual
+  * Documentation #965: convert user manual to xelatex
+  * Documentation #978: Make index for User Manual
+  * Refactoring #950: Refactor JobQueueModel to rely on standard SessionModel
+  * Refactoring #960: GUI: refactor SampleDesigner to use UniversalPropertyEditor
+  * Testing #555: Implement ParticleCoreShell unit test
+  * Testing #1000: Implement ParameterDistribution and DistributionHandler unit tests
+  * Testing #1003: Implement LatticeBasis unit test
+  * Support #577: Implement form factor of truncated cubes
+
+BornAgain-1.0.0, released 2015.01.29
+  > Summary:
+    1) Graphical User Interface officially included into the Release
+    2) Refactoring and extension in the collection of user Python examples
+    3) New website www.bornagainproject.org is online
+    4) R,T coefficients exposed to Python within new SpecularSimulation class
+    5) Minor changes in PythonAPI (particles with size distribution, LatticeBasis construction, InterferenceFunction1DParacrystal)
+  > Details of Sprint #25 (see http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/issues)
+  * Bug #788: Fix release script to process CHANGELOG correctly
+  * Bug #872: PyScript functional tests fail on iffds
+  * Bug #873: Replace IntensityDataIOFactory::writeIntensityData format from .txt to .int in all App cases
+  * Bug #874: Fix undefined reference
+  * Bug #876: Fix small release script issues
+  * Bug #935: It is not possible to change phi_f in InstrumentView
+  * Feature #544: Provide example with user's form factor extension from python
+  * Feature #737: Provide example demonstrating Monte-Carlo integration for big particles
+  * Feature #783: Design BornAgain main application icon
+  * Feature #787: Revise build instruction for Mac
+  * Feature #841: Implement 'About BornAgain' widget in Menu/Help
+  * Feature #851: GUI: disable qDebug() outputs for Release build
+  * Feature #854: Provide splash screen for starting GUI
+  * Feature #855: Check implementation of radial averaging for paracrystal
+  * Feature #866: Revise list of python examples going into release 1.0.0
+  * Feature #871: Revise deployment instruction for Mac
+  * Feature #885: Provide web statistics
+  * Feature #894: GUI: create collapsible group box
+  * Feature #898: Create setup.py for moving BornAgain libraries into users Python
+  * Feature #908: Create 3 user examples demonstrating DA, LMA and SCCA difference
+  * Feature #909: Expose MultiLayer's R,T coefficients into Python
+  * Feature #910: Implement automatic check of python examples from users examples directory
+  * Feature #911: Revise usage of PositionParticleInfo
+  * Feature #912: Create example of hexagonal lattice with basis
+  * Documentation #197: Unified header comment for all source files
+  * Documentation #781: Provide short description of GUI functionality
+  * Documentation #848: Create BornAgain documentation prototype using Sphinx
+  * Documentation #849: Replace old weblink with bornagainproject.org in user manual
+  * Documentation #860: Update installation section with how to compile graphical user interface
+  * Documentation #864: Provide Drupal site with minimum set of pages
+  * Documentation #865: Switch bornagainproject.org to new website
+  * Documentation #867: Update User Manual with examples description corresponding to release-1.0.0 list
+  * Documentation #877: Provide draft webpage
+  * Documentation #891: Check and fix examples
+  * Documentation #893: Check feasibility of custom form factor example in Python
+  * Documentation #901: Fill in Sphinx functionality overview section
+  * Documentation #902: Fill functionality overview section in Drupal
+  * Documentation #905: Clean up doxygen documentation
+  * Refactoring #242: use GSL for random number sampling
+  * Refactoring #258: Make enumerator look the same everywhere
+  * Refactoring #568: Refactor ParticleBuilder
+  * Refactoring #830: Check pass by value for Eigen matrices of fixed size
+  * Refactoring #889: Remove Stochastic parameters in favour of IDistribution classes
+  * Refactoring #913: Remove FormFactorDWBAConstZ
+  * Testing #795: Test dmg package
+
+BornAgain-0.9.9, released 2014.10.29
+  > Summary:
+    1) Further GUI development: QuickSimulationView, exception catching, property limits
+    2) Few bugfixes, support for multiple layout objects per layer, python script generation, minor refactoring in UserAPI.
+    3) User Manual: new appendix with python examples
+  > Details:
+  * Bug #776: GUI: InterferenceFunction2DParaCrystal rotation angle activation
+  * Bug #780: Windows: pixmap of item being dragged is not displayed on DesignerScene
+  * Bug #791: LLDataTest.DataAssignment Unittest failure
+  * Bug #821: Remove interference function approximations from GUI
+  * Bug #826: cmake fails under Debian/testing; problem with Python
+  * Bug #829: CMake is not able to find right Python version when there is a Python2 and Python3 on the system
+  * Bug #833: Duplicate transformation in Real Time Activity view
+  * Bug #835: In Real Time Activity view, setting wavelength to zero causes a crash
+  * Bug #843: Fix nightly build (python script generation functional tests failing)
+  * Feature #393: Create Mac installer
+  * Feature #677: Provide validation of GUI sample for corectness and corresponding info widget
+  * Feature #680: Provide ParameterizedItem's property with tooltips.
+  * Feature #768: Integrate QuickSimulationView into JobView
+  * Feature #769: Remove SimulationDataModel
+  * Feature #778: Windows installer: implement add/remove BornAgain desktop icon
+  * Feature #784: Revise workspace behaviour in DesignerScene
+  * Feature #803: Implement correct handling of simulation failure in JobItem
+  * Feature #805: Implement simple crash handler widget to report bugs
+  * Feature #814: Implement exceptions catching in the Core to report exception from a thread to main thread
+  * Feature #819: Move DA, LMA, SSCA to ParticleLayout and propagate to GUI
+  * Feature #820: Implement reset of JobItem's sample and instrument models to the original.
+  * Feature #822: Revise submit job logic
+  * Feature #823: Allow multiple ILayout objects per layer
+  * Feature #825: Update default behaviour of OutputDataWidget
+  * Feature #828: Trivial form factor for demonstration purposes
+  * Feature #837: Provide all item's properties with correct limits
+  * Feature #838: Merge python script generation branch of Abhishek
+  * Feature #845: API: remove Lattice2DIFParameters from InterferenceFunction2DLattice constructor and implement static creators for square and hexagonal lattice IF's
+  * Feature #856: Modify Python Example005 Disorder2 to match description in User Manual
+  * Feature #857: Include GUI into Linux 'make install' command
+  * Documentation #429: Write Appendix which lists all implemented examples from Examples section
+  * Documentation #846: Adapt manual to new constructor for InterferenceFunction2DLattice
+  * Refactoring #786: Remove unnecessary calls to getOutCoefficients
+  * Refactoring #818: Review SimulationParameters
+
+BornAgain-0.9.8, released 2014.08.28
+  > Summary:
+    1) Further GUI development toward first beta scheduled for October, 2014.
+       Implemented rotation of particles in GUI, real time simulation window.
+    2) Few bugfixes, minor refactoring in UserAPI.
+  > Details:
+  * Bug #741: ScalarSpecularInfoMapTest failing under Debian 32 bits
+  * Bug #764: Memory leackage in mesocrystal simulation.
+  * Bug #765: Genetic minimizer crashes for certain ROOT configurations
+  * Bug #779: Transformations on core/shell are not being used
+  * Feature #465: Organize BornAgain mail list with subscription
+  * Feature #604: Implement QStandartItemModel hierarchy
+  * Feature #682: Provide PlotWidget with x,y-axis in both, radians and degrees.
+  * Feature #702: Implement position particle info equivalent in GUI
+  * Feature #703: Implement rotation of particles in GUI
+  * Feature #704: Implement Lattice2D interference function in GUI
+  * Feature #736: Compile GUI under Windows with Qt5.3 and provide installer.
+  * Feature #738: Perform new round of profiling and memory leackage investigation
+  * Feature #746: Refactor GUI's OutputDataWidget to disantagle projections/property editor/plot widget.
+  * Feature #747: Finalize QuickSimulationView.
+  * Feature #748: Refactor IAxis family
+  * Feature #763: Provide icon set for recent widgets
+  * Feature #766: Propagate latest API changes (IAxis, IntensityDataIOFactory) into user manual.
+
+BornAgain-0.9.7, released 2014.07.31
+  > Summary:
+    1) Further GUI development toward first beta scheduled for October, 2014.
+    2) Redesign of RT coefficient calculations to reduce numerical instabilities in very thick layers.
+    3) Improvements in Monte-Carlo integration to cope with highly oscillatory form factors of super large particles.
+    4) Experimental support for running BornAgain on high performance computing clusters under OpenMPI environment.
+  > Details:
+  * Bug #578: Initialization problem in LLData class
+  * Bug #706: Layer cannot be dropped from widgetbox to designer scene
+  * Bug #709: Take care of thick layers
+  * Feature #523: Expose to python MSG::SetLevel
+  * Feature #600: Provide compilation of BornAgain at lrz cluster
+  * Feature #604: Implement QStandartItemModel hierarchy
+  * Feature #663: Improve MaterialEditor logic
+  * Feature #675: Provide widgetbox with tooltips.
+  * Feature #679: Revise location of auto generated BAVersion and similar files
+  * Feature #681: Provide Paracrystal1D with possibility to set different probability distributions.
+  * Feature #687: Provide unit test machinery for GUI.
+  * Feature #688: Include GUI in nightly build
+  * Feature #694: Provide select all functionality for SampleView
+  * Feature #695: Provide panning functionality for SampleView
+  * Feature #696: Implement check for unsaved project and corresponding save/discard widget
+  * Feature #699: Implement ParameterModel and corresponding view delegates for real time SimulationView
+  * Feature #700: Implement core shell particles in GUI
+  * Feature #701: Implement layer roughness in GUI
+  * Feature #705: Implement Monte Carlo integration also for polarized simulations
+  * Feature #710: Provide toy OpenMPI application to run at LRZ
+  * Feature #713: Provide simplified OpenMPI support in runSimulation
+  * Feature #729: Integrate Mahadi's QuickSimulation widget into run simulation evironment.
+  * Documentation #691: Provide simple cartoons for concepts that are otherwise difficult to understand
+  * Refactoring #581: Check naming of the coherence length
+  * Testing #674: Provide functional test machinery for GUI.
+
+BornAgain-0.9.6, released 2014.06.04
+  > Summary: Diverse GUI items (OutputData Widget, basic simulation functionality) + big form factor issue
+  * Feature #597: Attach Instrument view to session model
+  * Feature #598: Implement OutputData widget
+  * Feature #599: Extend OutputData widget with projections
+  * Feature #603: Rafactor GUI version of MaterialManager
+  * Feature #610: Generate QStandardItem objects from the domain objects
+  * Feature #613: Complete correspondence between domain and GUI model objects
+  * Feature #622: Implement JobQueueModel and View
+  * Feature #629: Complete connection between SessionModel and JobQueueModel
+  * Feature #635: Integrate Mahadi's OutputDataWidget into JobQueueView
+  * Feature #646: Implement serialization of subitems of ParameterizedItem
+  * Feature #647: Implement serialization of MaterialManager
+  * Feature #648: Provide serialization of ParticleItem
+  * Feature #653: Implement ParticleView representing ParticleItem
+  * Feature #654: Complete IsGISAXS01 sample generation from GUI
+  * Feature #655: Implement parameterized items for 1D and 2D paracrystals
+  * Feature #657: Provide solution for form factor of big particles
+  * Feature #673: Provide editing of ParameterizedItem's name in property editor.
+  * Feature #678: Provide automatic switch to JobView after the job is completed.
+  * Feature #684: Test remote compilation via distcc
+
+BornAgain-0.9.5, released 2014.04.11
+  > Summary: Refactoring in user API, working on GUI toward first beta.
+  * Bug #605: Fitting examples under Windows doesn't update graphics in realtime
+  * Feature #595: Implement saving of general GUI settings
+  * Feature #596: Investigate serialization of QStandardItemModel
+  * Feature #608: Basic QStandardItemModel structure
+  * Feature #609: Generate domain objects from GUI model objects
+  * Feature #611: Attach drag&drop view to the underlying QStandardItemModel
+  * Feature #612: Attach Property Editor View to the underlying QStandardItemModel
+  * Feature #615: Implement add/remove/move in TreeView
+  * Feature #616: Implement new FormFactor pictograms in widgetbox
+  * Feature #623: Implement basics of JobQueueItem and JobQueueModel
+  * Feature #624: Implement JobQueueView with tree representation of queue's properties and corresponding OutputData widget
+  * Feature #625: Implement basic logic for add/remove/cancel/unddo for JobQueueView
+  * Feature #626: Implement ProgressBar in Coregui and JobQueueModel
+  * Feature #627: Implement serialization of JobQueueModel
+  * Feature #628: Implement call back from Simulation to the ProgressBar of JobQueueView
+  * Feature #641: Drag items to root in treeview
+  * Feature #642: Implement normalization of IntensityData in Python
+  * Feature #645: Implement formfactory property as combobox in property editor
+  * Documentation #584: Write small explanation about core shell form factor in FormFactor's Appendix
+  * Documentation #589: Reduce size in Mb of user manual
+  * Documentation #590: Write Appendix section about interference functions available
+  * Documentation #591: Write Doxygen section about interference functions available
+  * Refactoring #266: Refactor MaterialManager
+  * Refactoring #594: Revise ParticleDecoration appearance/naming in UserAPI
+
+BornAgain-0.9.4, released 2014.02.07
+  > Summary: Off specular simulation, beam divergence, support for MacOS Maverick, new form factors
+  * Bug #220: Gui: provide GUI compilation under Qt5/linux
+  * Bug #461: Provide compilation on latest MacOS Maverick
+  * Bug #545: PolarizedDWBAZeroMag functional test fails under windows
+  * Bug #567: Restore PythonAPI generation under Maverick
+  * Bug #576: Fix functional tests under Maverick
+  * Bug #582: Silent sigmentation fault in InterferenceFunction2DLattice
+  * Feature #304: Provide compilation of HipGISAXS and run test simulation on GPU
+  * Feature #318: Implement beam divergence and wavelength distribution
+  * Feature #400: Move QtVariantManager into directory "externals" as static library
+  * Feature #446: Repair broken Genetic minimizer after we get rid from ROOT dependency
+  * Feature #482: Implement/review Full spheroid formfactor
+  * Feature #484: Implement/review Ellipsoid formfactor
+  * Feature #485: Implement/review Anisotropic hemi-spheroid formfactor
+  * Feature #486: Implement/review Spheroid formfactor
+  * Feature #491: Provide https access to git repository
+  * Feature #521: Implement polarized DWBA with cylindrical particles functional test
+  * Feature #526: Implement the ripple 1 (gaussian) formfactor
+  * Feature #543: Review release script
+  * Feature #553: Provide interface to perform off-specular scattering simulations
+  * Feature #569: Provide complex Bessel functions in C++ by wrapping existing fortran code
+  * Feature #571: Replace real Bessel with complex one where needed
+  * Documentation #546: Complete Appendix with all form factors listed
+  * Documentation #549: Doxygen API: review form factors description
+  * Documentation #565: Provide simulation and fit examples for spheres with size distribution
+  * Documentation #566: Provide ripple2 example
+  * Testing #445: Implement BornAgainFit unit test infrastructure
+  * Testing #537: Create MultiLayer unit test
+  * Testing #551: Implement tests for AttLimits, FitParameter, FitParameterLinked
+  * Testing #554: Implement ParticleDecoration unit test
+  * Testing #556: Implement HomogeneousMaterial and HomogeneousMagneticMaterials unit tests
+  * Testing #557: Implement OutputData<Eigen::Matrix2d> unit test
+  * Testing #559: Implement SpecularMatrix unit test
+  * Testing #560: Implement ScalarRTCoefficients unit test
+  * Testing #561: Implement MathFunctions unit test
+  * Testing #562: Implement MatrixRTCoefficients unit test
+  * Testing #563: Revise Beam unit test
+  * Testing #564: Implement ScalarSpecularInfoMap and MatrixSpecularInfoMap test
+  * Testing #573: Implement DWBASimulation unit test
+
+BornAgain-0.9.3, released 2013.12.20
+  > Summary: new form factors, user requests, refactoring
+  * Bug #469: Review form factor calculation for big particle dimensions
+  * Bug #499: Simulated formfactors sphere (for H=2R) and fullsphere are squeezed
+  * Bug #505: Investigate and possibly fix transformations for polarized mesocrystals
+  * Bug #508: Pacman assymetry in peaks of meso crystal simulation
+  * Bug #509: OutputData<T>.setAllTo(value) crashes (nullpointer) after clear()
+  * Bug #512: Particles' magnetic materials are not transformed
+  * Bug #516: Simulation of mesocrystal differs when doing 4 vs 8 threads
+  * Feature #288: Provide correct implementation of tilted cylinder (and cone) formfactor for complex wavenumbers
+  * Feature #410: Review and improve on mesocrystal form factors
+  * Feature #430: Examples: prepare example with core shell nanoparticles
+  * Feature #435: Request: provide JFM with the python script simulating the sample_jfm1
+  * Feature #454: Change behavior of setParameterValue
+  * Feature #477: Implement/review Cone formfactor
+  * Feature #478: Implement/review Tethraedron formfactor
+  * Feature #479: Implement/review Prism6 formfactor
+  * Feature #480: Implement/review Cone6 formfactor
+  * Feature #481: Implement/review Cybooctaedron formfactor
+  * Feature #483: Implement/review Anisotropic pyramid formfactor
+  * Feature #494: Implement all IsGISAXS distribution functions
+  * Feature #506: Refactor all tests to use new SimulationRegistry
+  * Feature #527: Implement the ripple 2 (triangular) formfactor
+  * Feature #540: Provide consistent propagation and composition of transformations
+  * Documentation #426: Examples: prepare C++ standalone example in Examples section
+  * Documentation #432: Examples: prepare example with correlated roughness interface
+  * Documentation #471: Write down formalism for polarized DWBA on embedded particles
+  * Documentation #475: Create prototype of latex (pdf) page representing form factor
+  * Documentation #489: Python docstrings
+  * Documentation #501: API reference for manual
+  * Refactoring #232: rename "min" and "max" in TRange, ...
+  * Refactoring #302: Return global static constants in the namespace back
+  * Refactoring #303: Drop shared_ptr usage for BasicVector3D
+  * Refactoring #416: CHeck and fix //TODO's and //FIXME's
+  * Refactoring #436: Refactor ISample, IParameterized and ParameterPool for better access to global ISample's parameter pool
+  * Refactoring #507: Wrap SampleBuilder in the shared pointer
+  * Refactoring #522: Clean up in App and FunctionalTests
+  * Testing #127: Add LLData Unit tests
+  * Testing #413: Repair MesoCrystal functional test
+  * Testing #414: Implement functional test: polarized DWBA with zero magnetic field
+  * Testing #421: Repair Performance test
+  * Testing #524: Produce a functional test for the layer with roughness
+  * Testing #529: Create TRange unit test
+  * Testing #530: Create AxisBin unit test
+  * Testing #535: Modify Particle unit test
+  * Testing #536: Create FTDistributions unit test
+  * Support #511: Provide example with 2 parameter fit of spheres in a hex lattice
+
+BornAgain-0.9.2, released 2013.10.14
+  > Summary: build issues, fitting interface, user manual, conferences
+  * Bug #447: Our minimum required cmake version 2.8.0 doesn't contain PARSE_MACRO
+  * Bug #462: Provide compilation on Jülich MacOS server
+  * Bug #463: Provide compilation under Jülich CentOS 5.10
+  * Bug #468: Make use of python interpreter to guess libpython location
+  * Bug #470: fitting example failure
+  * Bug #473: Simulation fails at zero abundance in particle_decoration.addParticle
+  * Bug #497: Access to axis of IntensityData in Python leads to the segmentation fault
+  * Feature #396: Create deb package
+  * Feature #417: implement automatic propagation of BornAgain version number into cmake
+  * Feature #419: Write deployment script which will automatize the release
+  * Feature #431: Build: provide thisbornagain.sh to set system PATHs to the installation directory
+  * Feature #437: Provide OutputData with ExportToNumpy function for PythonAPI
+  * Feature #438: Adjust existing python examples to conform PEP8 style
+  * Feature #444: Prepare talk for ILL
+  * Feature #450: Provide python function to retrieve polarized output data
+  * Feature #493: Set PYTHONPATH under windows at the end of installation
+  * Documentation #372: Review fitting section
+  * Documentation #398: default installation from tgz; direct only experts to git snapshot
+  * Documentation #404: Prepare poster for GISAXS2013 Workshop in Hamburg
+  * Documentation #423: Prepare demo for GISASXS 2013
+  * Documentation #439: Explain sample parameters paradigm in simulation examples section
+  * Documentation #440: Create svg plot representing minimization flow
+  * Documentation #441: Prepare talk for Koordinierungstreffen
+  * Documentation #448: Examples: prepare FitCylindersAndPrism_detailed example
+  * Documentation #449: Review manual's simulation python example section to conform changes in the script itself
+  * Documentation #455: Add demos into Examples/python section
+  * Documentation #456: Prepare talk "Data Analysis in HEP" for ILL
+  * Documentation #458: Prepare talk about Python bindings for ILL
+  * Documentation #459: Review installation section
+  * Refactoring #443: Refactor IMinimizer for better control of minimizer option
+  * Support #460: Create git repository for user related info
+
+BornAgain-0.9.1, released 2013.09.27
+  > Summary: Windows build, polarized neutrons and magnetic domains
+  * Bug #403: Debian unittest failure
+  * Feature #14: Choose platform-independent build system
+  * Feature #314: Windows compilation part 2
+  * Feature #360: Compile BornAgainCore and corresponding functional tests
+  * Feature #361: Compile BornAgainFit and corresponding minimizer libraries and functional tests
+  * Feature #362: Compile PythonAPI and run python functional tests
+  * Feature #363: Compile App using cmake-mingw and cmake-msvc
+  * Feature #364: Switch to cmake build system in windows build
+  * Feature #365: Switch to Microsoft VC2012 in windows build
+  * Feature #366: Create windows installer package
+  * Feature #367: Provide treatment of detector resolution for polarized neutrons
+  * Feature #368: Provide correct normalization of polarized neutron intensity
+  * Feature #388: Test polarization simulation with IsGISAXS03 example
+  * Feature #389: Make common interface for reflection/transmission coefficients and their maps
+  * Feature #390: Make implementations of interference functions transparent to whether coefficients are matrix- or scalar-valued
+  * Feature #391: Compile GUI for windows using cmake-mingw and cmake-msvc
+  * Feature #392: Use scalar reflection/transmission coefficients in absence of magnetization in layers (also when the particles might be magnetized)
+  * Feature #399: Provide diffuse calculation for polarized mesocrystals
+  * Feature #402: Use cmake in eclipse build
+  * Feature #411: Provide help functions for analysis of polarized OutputData structures
+  * Documentation #406: Review Software Architecture section
+  * Documentation #407: Review Installation section
+  * Documentation #408: Update wiki page to conform with the UserManual
+  * Refactoring #370: Remove unnecessary code duplication introduced during implementation of polarization
+  * Support #371: Simulate S. Disch's sample
+
+BornAgain-0.9, released 2013.08.23
+  * FunctionalTests: fitting from python works two times faster than fitting from C++
+  * Compile Error on Ubuntu 12.04
+  * Strange warning in boost::python api generation
+  * crash on addInterferenceFunction() without any error message
+  * Fix zero eigenvalue case for specular magnetic case
+  * Move ROOT minimization into ThirdParty and so get rid from ROOT dependency
+  * Change conventions (feedback from GISS Workshop)
+  * Ease installation for users
+  * Implement batch mode for the Simulation (suggestion of Gunthard Benecke)
+  * Develop enough neutron polarization support to simulate samples from S. Disch and A. Klapper
+  * Remove Decorator pattern from user interface
+  * Move specular calculation to the SpecularMatrix class (for scalar)
+  * Add polarization state to Beam
+  * Add magnetic materials
+  * Develop MatrixSpecular for magnetic materials
+  * Use magnetic calculation when a magnetic material is present
+  * Add DWBA for magnetic particles
+  * Develop roughness calculation for matrix formalism
+  * Add new cmake build configuration to TeamCity
+  * Write description of isgisaxs01 example for User Manual using latex
+  * Populate examples directory with several well commented python scripts
+  * Write how to install in manual and wiki
+  * Adapt local python script for plotting data
+  * Write simple fitting example and corresponding section in the documentation
+  * Provide import of ProgramOptions (nthreads, level of logging) into libBornAgainCore
+  * Replace Particle's index of refraction with material
+  * Move all IsGISAXS geometries to Core/StandardSample directory
+  * cmake build in Ubuntu and corresponding how to in the documentation
+
+BornAgain-0.8.2, released 2013.07.30
+  * Particle interface changed to accept HomogeneousMaterial
+
+BornAgain-0.8.1, released 2013.07.26
+  * CMake based build system
+  * PythonAPI automatic code generation redesign
+  * User Manual v0.1
+  * libBornAgainFit
+  * FunctionalTest collection
+
+BornAgain-0.7.0, released 2013.04.10
+  * First public release
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..770a203
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,102 @@
+###########################################################################
+# top-level CMakeLists.txt for building BornAgain
+############################################################################
+
+cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
+
+set(CMAKE_MODULE_PATH
+    ${CMAKE_SOURCE_DIR}/cmake/generic/modules
+    ${CMAKE_SOURCE_DIR}/cmake/bornagain/modules)
+set(TEMPLATE_DIR ${CMAKE_SOURCE_DIR}/cmake/bornagain/scripts)
+
+include(PreventInSourceBuilds)
+
+project(BornAgain)
+
+include(CTest) # equivalent to "enable_testing() ???
+add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) # => 'make check' is an alias for 'ctest'
+
+include(VERSION.cmake)
+
+# --- Declare project-wide user flags, and set default values ---
+option(BORNAGAIN_PYTHON "Build with python support" ON)
+option(BORNAGAIN_USE_PYTHON3 "Build against python 3.5 instead of 2.7" OFF)
+option(BORNAGAIN_GENERATE_BINDINGS "Generate python bindings during build (requires swig)" OFF)
+option(BORNAGAIN_GENERATE_PYTHON_DOCS "Generate python documentation from the doxygen comments" OFF)
+option(BORNAGAIN_GUI "Build a graphical user interface" ON)
+option(BORNAGAIN_USERMANUAL "Build the User Manual" OFF)
+option(BORNAGAIN_MANPAGE "Build Unix man page" OFF)
+option(BUILD_DEBIAN "Build a debian package" OFF)
+option(BORNAGAIN_APPLE_BUNDLE "Create a Mac OS X bundle" OFF)
+option(BORNAGAIN_OPENMPI "Build with OpenMPI support" OFF)
+option(BORNAGAIN_RELEASE "Special option for making release" OFF)
+option(BORNAGAIN_CRASHHANDLER "Additional machinery to send crash reports" OFF)
+option(BORNAGAIN_TIFF_SUPPORT "Tiff files read/write support" ON)
+option(AUTOGENERATE "Regenerate directory auto (Py docs, Py wrappers, man page)" OFF)
+option(ZERO_TOLERANCE "Terminate compilation on warnings" OFF)
+option(UNITTESTS "Don't skip unit tests" ON)
+option(BORNAGAIN_COVERAGE "Build with test coverage information" OFF)
+option(BORNAGAIN_DEBUG_OPTIMIZATION "Build with debug optimization (gcc only)" OFF)
+
+if(AUTOGENERATE)
+    set(BORNAGAIN_MANPAGE ON)
+    set(BORNAGAIN_GENERATE_PYTHON_DOCS ON)
+    set(BORNAGAIN_GENERATE_BINDINGS ON)
+endif()
+
+#--- Include CMake macros and functions ---
+include(GetFilenameComponent) # overwrite CMake command
+include(SearchInstalledSoftware)
+include(CheckCompiler)
+if(ZERO_TOLERANCE)
+    if(BORNAGAIN_USE_PYTHON3)
+        message(FATAL_ERROR "Python3 currently incompatible with ZERO_TOLERANCE")
+    endif()
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wfatal-errors")
+endif()
+include(BornAgainConfiguration)
+include(GeneratePythonDocs)
+include(PyExamplesLineLength)
+include(CheckCode)
+
+# debug optimization
+if(BORNAGAIN_DEBUG_OPTIMIZATION)
+  include(DebugOptimization)
+endif()
+
+# code coverage analysis
+if(BORNAGAIN_COVERAGE)
+  include(CheckCoverage)
+  include(SetupCoverage)
+endif()
+
+#--- Recurse into the given subdirectories ---
+if(BORNAGAIN_USERMANUAL)
+    add_subdirectory(Doc/UserManual)
+endif()
+if(BORNAGAIN_MANPAGE)
+    add_subdirectory(Doc/man)
+endif()
+add_subdirectory(ThirdParty/common)
+add_subdirectory(ThirdParty/Fit)
+add_subdirectory(Fit)
+add_subdirectory(ThirdParty/Core)
+add_subdirectory(Core)
+if(UNITTESTS)
+    add_subdirectory(Tests/UnitTests/Core)
+    add_subdirectory(Tests/UnitTests/Fit)
+endif()
+if(BORNAGAIN_GUI)
+    include(SearchQt)
+    add_subdirectory(ThirdParty/GUI)
+    add_subdirectory(GUI)
+    if(UNITTESTS)
+        add_subdirectory(Tests/UnitTests/GUI)
+    endif()
+endif()
+add_subdirectory(Tests/Functional) # functional tests (ctest)
+
+add_subdirectory(cmake/bornagain) # trick to print an after-install message
+
+#--- Make package targets ---
+include(BornAgainCPack)
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Core/Aggregate/FTDecayFunctions.cpp b/Core/Aggregate/FTDecayFunctions.cpp
new file mode 100644
index 0000000..6bd5048
--- /dev/null
+++ b/Core/Aggregate/FTDecayFunctions.cpp
@@ -0,0 +1,210 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FTDecayFunctions.cpp
+//! @brief     Implements class FTDistribution2DCauchy.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FTDecayFunctions.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "ParameterPool.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+//===============1D======================
+
+
+void IFTDecayFunction1D::print(std::ostream &ostr) const
+{
+    ostr << getName() << " " << *getParameterPool();
+}
+
+void IFTDecayFunction1D::init_parameters()
+{
+    registerParameter(BornAgain::Omega, &m_omega);
+}
+
+FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double omega)
+: IFTDecayFunction1D(omega)
+{
+    setName(BornAgain::FTDecayFunction1DCauchyType);
+    init_parameters();
+}
+
+double FTDecayFunction1DCauchy::evaluate(double q) const
+{
+    double sum_sq = q*q*m_omega*m_omega;
+    return m_omega*2.0/(1.0 + sum_sq);
+}
+
+FTDecayFunction1DGauss::FTDecayFunction1DGauss(double omega)
+: IFTDecayFunction1D(omega)
+{
+    setName(BornAgain::FTDecayFunction1DGaussType);
+    init_parameters();
+}
+
+double FTDecayFunction1DGauss::evaluate(double q) const
+{
+    double sum_sq = q*q*m_omega*m_omega;
+    return m_omega*std::sqrt(M_TWOPI)*std::exp(-sum_sq/2.0);
+}
+
+FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double omega)
+    : IFTDecayFunction1D(omega)
+{
+    setName(BornAgain::FTDecayFunction1DTriangleType);
+    init_parameters();
+}
+
+double FTDecayFunction1DTriangle::evaluate(double q) const
+{
+    double sincqw2 = MathFunctions::sinc(q*m_omega/2.0);
+    return m_omega*sincqw2*sincqw2;
+}
+
+FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double omega, double eta)
+: IFTDecayFunction1D(omega)
+, m_eta(eta)
+{
+    setName(BornAgain::FTDecayFunction1DVoigtType);
+    init_parameters();
+}
+
+double FTDecayFunction1DVoigt::evaluate(double q) const
+{
+    double sum_sq = q*q*m_omega*m_omega;
+    return m_eta*m_omega*std::sqrt(M_TWOPI)*std::exp(-sum_sq/2.0)
+            + (1.0 - m_eta)*m_omega*2.0/(1.0 + sum_sq);
+}
+
+void FTDecayFunction1DVoigt::init_parameters()
+{
+    IFTDecayFunction1D::init_parameters();
+    registerParameter(BornAgain::Eta, &m_eta);
+}
+
+/* Commented out decay functions: see header for rationale
+FTDecayFunction1DGate::FTDecayFunction1DGate(double omega)
+    : IFTDecayFunction1D(omega)
+{
+    setName(BornAgain::FTDecayFunction1DGateType);
+    init_parameters();
+}
+
+double FTDecayFunction1DGate::evaluate(double q) const
+{
+    return 2.0*m_omega*MathFunctions::Sinc(q*m_omega);
+}
+
+FTDecayFunction1DCosine::FTDecayFunction1DCosine(double omega)
+    : IFTDecayFunction1D(omega)
+{
+    setName(BornAgain::FTDecayFunction1DCosineType);
+    init_parameters();
+}
+
+double FTDecayFunction1DCosine::evaluate(double q) const
+{
+    double qw = std::abs(q*m_omega);
+    if (std::abs(qw/M_PI-1.0) < std::numeric_limits<double>::epsilon()) {
+        return m_omega/2.0;
+    }
+    else {
+        return m_omega*MathFunctions::Sinc(qw)/(1.0-qw*qw/M_PI/M_PI);
+    }
+}
+*/
+
+//==============2D====================
+
+IFTDecayFunction2D::IFTDecayFunction2D(
+    double decay_length_x, double decay_length_y, double gamma, double delta)
+    : m_omega_x(decay_length_x)
+    , m_omega_y(decay_length_y)
+    , m_gamma(gamma)
+    , m_delta(delta)
+{}
+
+void IFTDecayFunction2D::transformToStarBasis(double qX, double qY, double alpha,
+                                              double a, double b, double &qa, double &qb) const
+{
+    double prefactor = 1.0/M_TWOPI; // divide by sin(m_delta)
+                                     // for unnormalized X*,Y* basis
+    qa = a*prefactor*( std::sin(m_gamma+m_delta)*qX - std::sin(m_gamma)*qY );
+    qb = b*prefactor*( -std::sin(alpha-m_gamma-m_delta)*qX + std::sin(alpha-m_gamma)*qY );
+}
+
+void IFTDecayFunction2D::print(std::ostream &ostr) const
+{
+    ostr << getName() << " " << *getParameterPool();
+}
+
+void IFTDecayFunction2D::init_parameters()
+{
+    registerParameter(BornAgain::DecayLengthX, &m_omega_x).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::DecayLengthY, &m_omega_y).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Gamma, &m_gamma).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
+    registerParameter(BornAgain::Delta, &m_delta).setUnit("rad").setLimited(0, M_PI);
+}
+
+FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(
+    double decay_length_x, double decay_length_y, double gamma, double delta)
+    : IFTDecayFunction2D(decay_length_x, decay_length_y, gamma, delta)
+{
+    setName(BornAgain::FTDecayFunction2DCauchyType);
+    init_parameters();
+}
+
+double FTDecayFunction2DCauchy::evaluate(double qx, double qy) const
+{
+    double sum_sq = qx*qx*m_omega_x*m_omega_x + qy*qy*m_omega_y*m_omega_y;
+    return M_TWOPI*m_omega_x*m_omega_y*std::pow(1.0 + sum_sq, -1.5);
+}
+
+FTDecayFunction2DGauss::FTDecayFunction2DGauss(
+    double decay_length_x, double decay_length_y, double gamma, double delta)
+    : IFTDecayFunction2D(decay_length_x, decay_length_y, gamma, delta)
+{
+    setName(BornAgain::FTDecayFunction2DGaussType);
+    init_parameters();
+}
+
+double FTDecayFunction2DGauss::evaluate(double qx, double qy) const
+{
+    double sum_sq = qx*qx*m_omega_x*m_omega_x + qy*qy*m_omega_y*m_omega_y;
+    return M_TWOPI*m_omega_x*m_omega_y*std::exp(-sum_sq/2.0);
+}
+
+FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(
+    double decay_length_x, double decay_length_y, double eta, double gamma, double delta)
+    : IFTDecayFunction2D(decay_length_x, decay_length_y, gamma, delta), m_eta(eta)
+{
+    setName(BornAgain::FTDecayFunction2DVoigtType);
+    init_parameters();
+}
+
+double FTDecayFunction2DVoigt::evaluate(double qx, double qy) const
+{
+    double sum_sq = qx*qx*m_omega_x*m_omega_x + qy*qy*m_omega_y*m_omega_y;
+    return M_TWOPI*m_omega_x*m_omega_y*(m_eta*std::exp(-sum_sq/2.0)
+                                           + (1.0-m_eta)*std::pow(1.0 + sum_sq, -1.5));
+}
+
+void FTDecayFunction2DVoigt::init_parameters()
+{
+    registerParameter(BornAgain::DecayLengthX, &m_omega_x).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::DecayLengthY, &m_omega_y).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Eta, &m_eta);
+    registerParameter(BornAgain::Gamma, &m_gamma).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
+    registerParameter(BornAgain::Delta, &m_delta).setUnit("rad").setLimited(0, M_PI);
+}
diff --git a/Core/Aggregate/FTDecayFunctions.h b/Core/Aggregate/FTDecayFunctions.h
new file mode 100644
index 0000000..651c304
--- /dev/null
+++ b/Core/Aggregate/FTDecayFunctions.h
@@ -0,0 +1,196 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FTDecayFunctions.h
+//! @brief     Defines classes IFTDecayFunction1D, IFTDecayFunction2D,
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FTDECAYFUNCTIONS_H
+#define FTDECAYFUNCTIONS_H
+
+#include "IParameterized.h"
+#include "MathConstants.h"
+
+
+//! Interface for a one-dimensional decay function,
+//!   with evaluate(q) returning the Fourier transform,
+//!   normalized to \f$\int dq\; {\rm evaluate}(q) = 1\f$.
+//! @ingroup distribution_internal
+class BA_CORE_API_ IFTDecayFunction1D : public IParameterized
+{
+public:
+    IFTDecayFunction1D(double omega) : m_omega(omega) {}
+    virtual IFTDecayFunction1D* clone() const=0;
+    virtual double evaluate(double q) const=0;
+    void setOmega(double omega) { m_omega = omega; }
+    double getOmega() const { return m_omega; }
+    friend std::ostream& operator<<(std::ostream& ostr, const IFTDecayFunction1D& m) {
+        m.print(ostr); return ostr; }
+
+protected:
+    virtual void print(std::ostream& ostr) const;
+    virtual void init_parameters();
+    double m_omega;
+};
+
+
+//! One-dimensional Cauchy decay function in reciprocal space;
+//! corresponds to exp(-|x|/omega) in real space.
+//! @ingroup decayFT
+class BA_CORE_API_ FTDecayFunction1DCauchy : public IFTDecayFunction1D
+{
+public:
+    FTDecayFunction1DCauchy(double omega);
+    virtual FTDecayFunction1DCauchy* clone() const {
+        return new FTDecayFunction1DCauchy(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! One-dimensional Gauss decay function in reciprocal space;
+//! corresponds to exp[-x^2/(2*omega^2)] in real space.
+//! @ingroup decayFT
+class BA_CORE_API_ FTDecayFunction1DGauss : public IFTDecayFunction1D
+{
+public:
+    FTDecayFunction1DGauss(double omega);
+    virtual FTDecayFunction1DGauss* clone() const {
+        return new FTDecayFunction1DGauss(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! One-dimensional triangle decay function in reciprocal space;
+//! corresponds to 1-|x|/omega if |x|<omega (and 0 otherwise) in real space.
+//! @ingroup decayFT
+class BA_CORE_API_ FTDecayFunction1DTriangle : public IFTDecayFunction1D
+{
+public:
+    FTDecayFunction1DTriangle(double omega);
+    virtual FTDecayFunction1DTriangle* clone() const {
+        return new FTDecayFunction1DTriangle(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! One-dimensional pseudo-Voigt decay function in reciprocal space;
+//! corresponds to eta*Gauss + (1-eta)*Cauchy.
+//! @ingroup decayFT
+class BA_CORE_API_ FTDecayFunction1DVoigt : public IFTDecayFunction1D
+{
+public:
+    FTDecayFunction1DVoigt(double omega, double eta);
+    virtual FTDecayFunction1DVoigt* clone() const {
+        return new FTDecayFunction1DVoigt(m_omega, m_eta); }
+    double evaluate(double q) const final;
+    double getEta() const { return m_eta;}
+protected:
+    virtual void init_parameters();
+    double m_eta;
+};
+
+
+//! Interface for two-dimensional decay function in reciprocal space.
+//! @ingroup decayFT_internal
+class BA_CORE_API_ IFTDecayFunction2D : public IParameterized
+{
+public:
+    IFTDecayFunction2D(double decay_length_x, double decay_length_y,
+                       double gamma=0, double delta=M_PI_2);
+    virtual IFTDecayFunction2D* clone() const=0;
+
+    //! set angle between first lattice vector and X-axis of distribution (both in direct space)
+    void setGamma(double gamma) { m_gamma = gamma; }
+
+    //! get angle between first lattice vector and X-axis of distribution (both in direct space)
+    double getGamma() const { return m_gamma; }
+
+    //! get angle between X- and Y-axis of distribution (in direct space)
+    double getDelta() const { return m_delta; }
+
+    //! get coherence length in X-direction
+    double getDecayLengthX() const { return m_omega_x; }
+
+    //! get coherence length in Y-direction
+    double getDecayLengthY() const { return m_omega_y; }
+
+    //! evaluate Fourier transformed decay function for q in X,Y coordinates
+    virtual double evaluate(double qx, double qy) const=0;
+
+    //! transform back to a*, b* basis:
+    void transformToStarBasis(double qX, double qY,
+            double alpha, double a, double b, double& qa, double& qb) const;
+
+    friend std::ostream& operator<<(std::ostream& ostr, const IFTDecayFunction2D& m)
+    { m.print(ostr); return ostr; }
+
+protected:
+    virtual void print(std::ostream& ostr) const;
+    virtual void init_parameters();
+    double m_omega_x;
+    double m_omega_y;
+    double m_gamma;
+    double m_delta;
+};
+
+
+//! Two-dimensional Cauchy decay function in reciprocal space;
+//! corresponds to exp(-r) in real space,
+//! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
+//! @ingroup decayFT
+class BA_CORE_API_ FTDecayFunction2DCauchy : public IFTDecayFunction2D
+{
+public:
+    FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y,
+                            double gamma=0, double delta=M_PI_2);
+    virtual FTDecayFunction2DCauchy* clone() const {
+        return new FTDecayFunction2DCauchy(m_omega_x, m_omega_y, m_gamma, m_delta); }
+
+    double evaluate(double qx, double qy) const final;
+};
+
+
+//! Two-dimensional Gauss decay function in reciprocal space;
+//! corresponds to exp(-r^2/2) in real space,
+//! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
+//! @ingroup decayFT
+class BA_CORE_API_ FTDecayFunction2DGauss : public IFTDecayFunction2D
+{
+public:
+    FTDecayFunction2DGauss(double decay_length_x, double decay_length_y,
+                           double gamma=0, double delta=M_PI_2);
+    virtual FTDecayFunction2DGauss* clone() const {
+        return new FTDecayFunction2DGauss(m_omega_x, m_omega_y, m_gamma, m_delta); }
+
+    double evaluate(double qx, double qy) const final;
+};
+
+//! Two-dimensional pseudo-Voigt decay function in reciprocal space;
+//! corresponds to eta*Gauss + (1-eta)*Cauchy.
+//! @ingroup decayFT
+class BA_CORE_API_ FTDecayFunction2DVoigt : public IFTDecayFunction2D
+{
+public:
+    FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta,
+                           double gamma=0, double delta=M_PI_2);
+    virtual FTDecayFunction2DVoigt* clone() const {
+        return new FTDecayFunction2DVoigt(m_omega_x, m_omega_y, m_eta, m_gamma, m_delta); }
+
+    double evaluate(double qx, double qy) const final;
+
+    virtual double getEta() const { return m_eta; }
+
+protected:
+    virtual void init_parameters();
+    double m_eta;
+};
+
+#endif // FTDECAYFUNCTIONS_H
diff --git a/Core/Aggregate/FTDistributions1D.cpp b/Core/Aggregate/FTDistributions1D.cpp
new file mode 100644
index 0000000..745b35f
--- /dev/null
+++ b/Core/Aggregate/FTDistributions1D.cpp
@@ -0,0 +1,120 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FTDistributions1D.cpp
+//! @brief     Implements interface class IFTDistribution2D and children thereof.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FTDistributions1D.h"
+#include "BornAgainNamespace.h"
+#include "IntegratorReal.h"
+#include "MathFunctions.h"
+#include "ParameterPool.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+void IFTDistribution1D::print(std::ostream& ostr) const
+{
+    ostr << getName() << " " << *getParameterPool();
+}
+
+void IFTDistribution1D::init_parameters()
+{
+    registerParameter(BornAgain::Omega, &m_omega);
+}
+
+
+FTDistribution1DCauchy::FTDistribution1DCauchy(double omega)
+: IFTDistribution1D(omega)
+{
+    setName(BornAgain::FTDistribution1DCauchyType);
+    init_parameters();
+}
+
+double FTDistribution1DCauchy::evaluate(double q) const
+{
+    double sum_sq = q*q*m_omega*m_omega;
+    return 1.0/(1.0 + sum_sq);
+}
+
+FTDistribution1DGauss::FTDistribution1DGauss(double omega)
+: IFTDistribution1D(omega)
+{
+    setName(BornAgain::FTDistribution1DGaussType);
+    init_parameters();
+}
+
+double FTDistribution1DGauss::evaluate(double q) const
+{
+    double sum_sq = q*q*m_omega*m_omega;
+    return std::exp(-sum_sq/2.0);
+}
+
+FTDistribution1DGate::FTDistribution1DGate(double omega)
+    : IFTDistribution1D(omega)
+{
+    setName(BornAgain::FTDistribution1DGateType);
+    init_parameters();
+}
+
+double FTDistribution1DGate::evaluate(double q) const
+{
+    return MathFunctions::sinc(q*m_omega);
+}
+
+FTDistribution1DTriangle::FTDistribution1DTriangle(double omega)
+    : IFTDistribution1D(omega)
+{
+    setName(BornAgain::FTDistribution1DTriangleType);
+    init_parameters();
+}
+
+double FTDistribution1DTriangle::evaluate(double q) const
+{
+    double sincqw2 = MathFunctions::sinc(q*m_omega/2.0);
+    return sincqw2*sincqw2;
+}
+
+FTDistribution1DCosine::FTDistribution1DCosine(double omega)
+    : IFTDistribution1D(omega)
+{
+    setName(BornAgain::FTDistribution1DCosineType);
+    init_parameters();
+}
+
+double FTDistribution1DCosine::evaluate(double q) const
+{
+    double qw = std::abs(q*m_omega);
+    if (std::abs(qw/M_PI-1.0) < std::numeric_limits<double>::epsilon())
+        return 0.5;
+    return MathFunctions::sinc(qw)/(1.0-qw*qw/M_PI/M_PI);
+}
+
+FTDistribution1DVoigt::FTDistribution1DVoigt(double omega, double eta)
+    : IFTDistribution1D(omega)
+    , m_eta(eta)
+{
+    setName(BornAgain::FTDistribution1DVoigtType);
+    init_parameters();
+}
+
+double FTDistribution1DVoigt::evaluate(double q) const
+{
+    double sum_sq = q*q*m_omega*m_omega;
+    return m_eta*std::exp(-sum_sq/2.0) + (1.0 - m_eta)*1.0/(1.0 + sum_sq);
+}
+
+void FTDistribution1DVoigt::init_parameters()
+{
+    IFTDistribution1D::init_parameters();
+    registerParameter(BornAgain::Eta, &m_eta);
+}
diff --git a/Core/Aggregate/FTDistributions1D.h b/Core/Aggregate/FTDistributions1D.h
new file mode 100644
index 0000000..469b36b
--- /dev/null
+++ b/Core/Aggregate/FTDistributions1D.h
@@ -0,0 +1,134 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FTDistributions1D.h
+//! @brief     Defines interface class IFTDistribution1D, and children thereof
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FTDISTRIBUTIONS1D_H
+#define FTDISTRIBUTIONS1D_H
+
+#include "IParameterized.h"
+
+//! Interface for a one-dimensional distribution, with normalization adjusted so that
+//! the Fourier transform evaluate(q) is a decay function that starts at evaluate(0)=1.
+//! @ingroup distribution_internal
+
+class BA_CORE_API_ IFTDistribution1D : public IParameterized
+{
+public:
+    IFTDistribution1D(double omega) : m_omega(omega) {}
+
+    virtual IFTDistribution1D* clone() const=0;
+
+    //! Returns Fourier transform of this distribution;
+    //! is a decay function starting at evaluate(0)=1.
+    virtual double evaluate(double q) const=0;
+
+    void setOmega(double omega) { m_omega = omega; }
+    double getOmega() const { return m_omega; }
+
+    friend std::ostream& operator<<(std::ostream& ostr, const IFTDistribution1D& m) {
+        m.print(ostr); return ostr; }
+
+protected:
+    virtual void print(std::ostream& ostr) const;
+    virtual void init_parameters();
+    double m_omega;
+};
+
+
+//! Exponential IFTDistribution1D exp(-|omega*x|);
+//! its Fourier transform evaluate(q) is a Cauchy-Lorentzian starting at evaluate(0)=1.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution1DCauchy : public IFTDistribution1D
+{
+public:
+    FTDistribution1DCauchy(double omega);
+    FTDistribution1DCauchy* clone() const final { return new FTDistribution1DCauchy(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! Gaussian IFTDistribution1D;
+//! its Fourier transform evaluate(q) is a Gaussian starting at evaluate(0)=1.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution1DGauss : public IFTDistribution1D
+{
+public:
+    FTDistribution1DGauss(double omega);
+    FTDistribution1DGauss* clone() const final { return new FTDistribution1DGauss(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! Square gate IFTDistribution1D;
+//! its Fourier transform evaluate(q) is a sinc function starting at evaluate(0)=1.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution1DGate : public IFTDistribution1D
+{
+public:
+    FTDistribution1DGate(double omega);
+    FTDistribution1DGate* clone() const final { return new FTDistribution1DGate(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! Triangle IFTDistribution1D [1-|x|/omega if |x|<omega, and 0 otherwise];
+//! its Fourier transform evaluate(q) is a squared sinc function starting at evaluate(0)=1.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution1DTriangle : public IFTDistribution1D
+{
+public:
+    FTDistribution1DTriangle(double omega);
+    virtual ~FTDistribution1DTriangle() {}
+    FTDistribution1DTriangle* clone() const final { return new FTDistribution1DTriangle(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! IFTDistribution1D consisting of one cosine wave
+//! [1+cos(pi*x/omega) if |x|<omega, and 0 otherwise];
+//! its Fourier transform evaluate(q) starts at evaluate(0)=1.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution1DCosine : public IFTDistribution1D
+{
+public:
+    FTDistribution1DCosine(double omega);
+    FTDistribution1DCosine* clone() const final { return new FTDistribution1DCosine(m_omega); }
+    double evaluate(double q) const final;
+};
+
+
+//! IFTDistribution1D that provides a Fourier transform evaluate(q) in form
+//! of a pseudo-Voigt decay function eta*Gauss + (1-eta)*Cauchy, with both components
+//! starting at 1 for q=0.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution1DVoigt : public IFTDistribution1D
+{
+public:
+    FTDistribution1DVoigt(double omega, double eta);
+    FTDistribution1DVoigt* clone() const final {
+        return new FTDistribution1DVoigt(m_omega, m_eta); }
+    double evaluate(double q) const final;
+    double getEta() const { return m_eta;}
+protected:
+    virtual void init_parameters();
+    double m_eta;
+};
+
+#endif // FTDISTRIBUTIONS1D_H
diff --git a/Core/Aggregate/FTDistributions2D.cpp b/Core/Aggregate/FTDistributions2D.cpp
new file mode 100644
index 0000000..e005fa1
--- /dev/null
+++ b/Core/Aggregate/FTDistributions2D.cpp
@@ -0,0 +1,134 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FTDistributions2D.cpp
+//! @brief     Implements interface class IFTDistribution2D and children thereof.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FTDistributions2D.h"
+#include "BornAgainNamespace.h"
+#include "IntegratorReal.h"
+#include "MathFunctions.h"
+#include "ParameterPool.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+IFTDistribution2D::IFTDistribution2D(
+    double coherence_length_x, double coherence_length_y, double gamma, double delta)
+    : m_coherence_length_x(coherence_length_x)
+    , m_coherence_length_y(coherence_length_y)
+    , m_gamma(gamma)
+    , m_delta(delta)
+{}
+
+void IFTDistribution2D::init_parameters()
+{
+    registerParameter(BornAgain::CoherenceLengthX, &m_coherence_length_x).
+        setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::CoherenceLengthY, &m_coherence_length_y).
+        setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Gamma, &m_gamma).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
+    registerParameter(BornAgain::Delta, &m_delta).setUnit("rad").setLimited(0, M_PI);
+}
+
+void IFTDistribution2D::print(std::ostream& ostr) const
+{
+    ostr << getName() << " " << *getParameterPool();
+}
+
+
+FTDistribution2DCauchy::FTDistribution2DCauchy(
+    double coherence_length_x, double coherence_length_y, double gamma, double delta)
+    : IFTDistribution2D(coherence_length_x, coherence_length_y, gamma, delta)
+{
+    setName(BornAgain::FTDistribution2DCauchyType);
+    init_parameters();
+}
+
+double FTDistribution2DCauchy::evaluate(double qx, double qy) const
+{
+    return std::pow(1.0 + sumsq(qx,qy), -1.5);
+}
+
+
+FTDistribution2DGauss::FTDistribution2DGauss(
+    double coherence_length_x, double coherence_length_y, double gamma, double delta)
+    : IFTDistribution2D(coherence_length_x, coherence_length_y, gamma, delta)
+{
+    setName(BornAgain::FTDistribution2DGaussType);
+    init_parameters();
+}
+
+double FTDistribution2DGauss::evaluate(double qx, double qy) const
+{
+    return std::exp(-sumsq(qx,qy)/2);
+}
+
+
+FTDistribution2DGate::FTDistribution2DGate(
+    double coherence_length_x, double coherence_length_y, double gamma, double delta)
+    : IFTDistribution2D(coherence_length_x, coherence_length_y, gamma, delta)
+{
+    setName(BornAgain::FTDistribution2DGateType);
+    init_parameters();
+}
+
+double FTDistribution2DGate::evaluate(double qx, double qy) const
+{
+    double scaled_q = std::sqrt(sumsq(qx,qy));
+    return MathFunctions::Bessel_J1c(scaled_q)*2.0;
+}
+
+
+FTDistribution2DCone::FTDistribution2DCone(
+    double coherence_length_x, double coherence_length_y, double gamma, double delta)
+    : IFTDistribution2D(coherence_length_x, coherence_length_y, gamma, delta)
+{
+    setName(BornAgain::FTDistribution2DConeType);
+    init_parameters();
+}
+
+double FTDistribution2DCone::evaluate(double qx, double qy) const
+{
+    double scaled_q = std::sqrt(sumsq(qx,qy));
+    if (scaled_q<std::numeric_limits<double>::epsilon())
+        return 1.0 - 3.0*scaled_q*scaled_q/40.0;
+    auto integrator = make_integrator_real(this, &FTDistribution2DCone::coneIntegrand2);
+    double integral = integrator->integrate(0.0, scaled_q);
+    return 6.0*(MathFunctions::Bessel_J1c(scaled_q) - integral/scaled_q/scaled_q/scaled_q);
+}
+
+double FTDistribution2DCone::coneIntegrand2(double value) const
+{
+    return value*value*MathFunctions::Bessel_J0(value);
+}
+
+
+FTDistribution2DVoigt::FTDistribution2DVoigt(
+    double coherence_length_x, double coherence_length_y, double eta, double gamma, double delta)
+    : IFTDistribution2D(coherence_length_x, coherence_length_y, gamma, delta), m_eta(eta)
+{
+    setName(BornAgain::FTDistribution2DVoigtType);
+    registerParameter(BornAgain::CoherenceLengthX, &m_coherence_length_x).
+        setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::CoherenceLengthY, &m_coherence_length_y).
+        setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Eta, &m_eta);
+    registerParameter("Gamma", &m_gamma).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
+    registerParameter("Delta", &m_delta).setUnit("rad").setLimited(0, M_PI);
+}
+
+double FTDistribution2DVoigt::evaluate(double qx, double qy) const
+{
+    double sum_sq = sumsq(qx,qy);
+    return m_eta*std::exp(-sum_sq/2) + (1.0 - m_eta)*std::pow(1.0 + sum_sq, -1.5);
+}
diff --git a/Core/Aggregate/FTDistributions2D.h b/Core/Aggregate/FTDistributions2D.h
new file mode 100644
index 0000000..bac6bb5
--- /dev/null
+++ b/Core/Aggregate/FTDistributions2D.h
@@ -0,0 +1,158 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FTDistributions2D.h
+//! @brief     Defines interface class IFTDistribution2D, and children thereof.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FTDISTRIBUTIONS2D_H
+#define FTDISTRIBUTIONS2D_H
+
+#include "IParameterized.h"
+#include "MathConstants.h"
+
+
+//! Interface for two-dimensional distributions in Fourier space.
+//! @ingroup distribution_internal
+
+class BA_CORE_API_ IFTDistribution2D : public IParameterized
+{
+public:
+    IFTDistribution2D(double coherence_length_x, double coherence_length_y,
+                      double gamma=0, double delta=M_PI_2);
+    virtual IFTDistribution2D* clone() const=0;
+
+    void setGamma(double gamma) { m_gamma = gamma; }
+    double getGamma() const { return m_gamma; }
+
+    double getDelta() const { return m_delta; }
+
+    double getCoherenceLengthX() const { return m_coherence_length_x; }
+    double getCoherenceLengthY() const { return m_coherence_length_y; }
+
+    //! evaluate Fourier transformed distribution for q in X,Y coordinates
+    //! the original distribution (in real space) is assumed to be normalized:
+    //! total integral is equal to 1
+    virtual double evaluate(double qx, double qy) const=0;
+
+    friend std::ostream& operator<<(std::ostream& ostr, const IFTDistribution2D& m) {
+        m.print(ostr); return ostr; }
+
+protected:
+    double sumsq( double qx, double qy) const {
+        return qx*qx*m_coherence_length_x*m_coherence_length_x +
+            qy*qy*m_coherence_length_y*m_coherence_length_y; }
+
+    virtual void print(std::ostream& ostr) const;
+    void init_parameters();
+
+    double m_coherence_length_x; //!< Coherence length in X-direction.
+    double m_coherence_length_y; //!< Coherence length in Y-direction.
+    //! Angle in direct space between first lattice vector and X-axis of distribution.
+    double m_gamma;
+    //! Angle in direct space between X- and Y-axis of distribution.
+    double m_delta;
+};
+
+
+//! Two-dimensional Cauchy distribution in Fourier space;
+//! corresponds to a normalized exp(-r) in real space,
+//! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution2DCauchy : public IFTDistribution2D
+{
+public:
+    FTDistribution2DCauchy(double coherence_length_x, double coherence_length_y,
+                           double gamma=0, double delta=M_PI_2);
+    FTDistribution2DCauchy* clone() const final {
+        return new FTDistribution2DCauchy(
+            m_coherence_length_x, m_coherence_length_y, m_gamma, m_delta); }
+    double evaluate(double qx, double qy) const final;
+};
+
+
+//! Two-dimensional Gauss distribution in Fourier space;
+//! corresponds to normalized exp(-r^2/2) in real space
+//! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution2DGauss : public IFTDistribution2D
+{
+public:
+    FTDistribution2DGauss(double coherence_length_x, double coherence_length_y,
+                          double gamma=0, double delta=M_PI_2);
+    FTDistribution2DGauss* clone() const final {
+        return new FTDistribution2DGauss(
+            m_coherence_length_x, m_coherence_length_y, m_gamma, m_delta); }
+    double evaluate(double qx, double qy) const final;
+};
+
+
+//! Two-dimensional gate distribution in Fourier space;
+//! corresponds to normalized constant if r<1 (and 0 otherwise) in real space,
+//! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution2DGate : public IFTDistribution2D
+{
+public:
+    FTDistribution2DGate(double coherence_length_x, double coherence_length_y,
+                         double gamma=0, double delta=M_PI_2);
+    FTDistribution2DGate* clone() const final {
+        return new FTDistribution2DGate(
+            m_coherence_length_x, m_coherence_length_y, m_gamma, m_delta); }
+    double evaluate(double qx, double qy) const final;
+};
+
+
+//! Two-dimensional cone distribution in Fourier space;
+//! corresponds to 1-r if r<1 (and 0 otherwise) in real space
+//! with \f$r=\sqrt{(\frac{x}{\omega_x})^2 + (\frac{y}{\omega_y})^2}\f$.
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution2DCone : public IFTDistribution2D
+{
+public:
+    FTDistribution2DCone(double coherence_length_x, double coherence_length_y,
+                         double gamma=0, double delta=M_PI_2);
+    FTDistribution2DCone* clone() const final {
+        return new FTDistribution2DCone(
+            m_coherence_length_x, m_coherence_length_y, m_gamma, m_delta); }
+    double evaluate(double qx, double qy) const final;
+
+private:
+    //! second part of the integrand:
+    //! \f$u^2\cdot J_0(u)\f$
+    double coneIntegrand2(double value) const;
+};
+
+
+//! Two-dimensional Voigt distribution in Fourier space;
+//! corresponds to eta*Gauss + (1-eta)*Cauchy
+//! @ingroup distributionFT
+
+class BA_CORE_API_ FTDistribution2DVoigt : public IFTDistribution2D
+{
+public:
+    FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y,
+                          double eta, double gamma=0, double delta=M_PI_2);
+    FTDistribution2DVoigt* clone() const final {
+        return new FTDistribution2DVoigt(
+            m_coherence_length_x, m_coherence_length_y, m_eta, m_gamma, m_delta); }
+    double evaluate(double qx, double qy) const final;
+    double getEta() const { return m_eta;}
+
+protected:
+    double m_eta;
+};
+
+#endif // FTDISTRIBUTIONS2D_H
diff --git a/Core/Aggregate/FormFactorWrapper.cpp b/Core/Aggregate/FormFactorWrapper.cpp
new file mode 100644
index 0000000..d6b5ef4
--- /dev/null
+++ b/Core/Aggregate/FormFactorWrapper.cpp
@@ -0,0 +1,24 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FormFactorWrapper.cpp
+//! @brief     Implements class FormFactorWrapper.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorWrapper.h"
+#include "IFormFactor.h"
+
+FormFactorWrapper::~FormFactorWrapper() { delete mp_ff; }
+
+FormFactorWrapper* FormFactorWrapper::clone() const
+{
+    return new FormFactorWrapper(mp_ff->clone(), m_abundance);
+}
diff --git a/Core/Aggregate/FormFactorWrapper.h b/Core/Aggregate/FormFactorWrapper.h
new file mode 100644
index 0000000..7913ddf
--- /dev/null
+++ b/Core/Aggregate/FormFactorWrapper.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/FormFactorWrapper.h
+//! @brief     Defines class FormFactorWrapper.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORWRAPPER_H
+#define FORMFACTORWRAPPER_H
+
+#include "ICloneable.h"
+class IFormFactor;
+
+//! Information about particle form factor and abundance.
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ FormFactorWrapper : public ICloneable
+{
+public:
+    FormFactorWrapper(IFormFactor* ff, double abundance)
+        : mp_ff(ff), m_abundance(abundance) {}
+    virtual ~FormFactorWrapper();
+    virtual FormFactorWrapper* clone() const;
+    IFormFactor* mp_ff;
+    double m_abundance;
+};
+
+#endif // FORMFACTORWRAPPER_H
diff --git a/Core/Aggregate/IInterferenceFunction.h b/Core/Aggregate/IInterferenceFunction.h
new file mode 100644
index 0000000..b7168aa
--- /dev/null
+++ b/Core/Aggregate/IInterferenceFunction.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/IInterferenceFunction.h
+//! @brief     Defines and implements the interface class IInterferenceFunction.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IINTERFERENCEFUNCTION_H
+#define IINTERFERENCEFUNCTION_H
+
+#include "ISample.h"
+#include "Vectors3D.h"
+
+//! Pure virtual base class of interference functions.
+//! @ingroup distribution_internal
+
+class BA_CORE_API_ IInterferenceFunction : public ISample
+{
+public:
+    virtual ~IInterferenceFunction() {}
+
+    virtual IInterferenceFunction* clone() const=0;
+    virtual void accept(ISampleVisitor* visitor) const =0;
+
+    //! Evaluates the interference function for a given wavevector transfer (only the real
+    //! x and y components are relevant)
+    virtual double evaluate(const kvector_t q) const=0;
+
+    //! Retrieves the size-distance coupling constant (default 0.0)
+    virtual double getKappa() const { return 0.0; }
+
+    //! If defined by this interference function's parameters, returns the particle density (per
+    //!  area). Otherwise, returns zero or a user-defined value
+    virtual double getParticleDensity() const { return 0.0; }
+};
+
+#endif // IINTERFERENCEFUNCTION_H
diff --git a/Core/Aggregate/ILayout.h b/Core/Aggregate/ILayout.h
new file mode 100644
index 0000000..79c24cb
--- /dev/null
+++ b/Core/Aggregate/ILayout.h
@@ -0,0 +1,97 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/ILayout.h
+//! @brief     Defines and implements interface class ILayout.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ILAYOUT_H
+#define ILAYOUT_H
+
+#include "ICompositeSample.h"
+#include "SafePointerVector.h"
+
+class IAbstractParticle;
+class IInterferenceFunction;
+class ILayout;
+
+//! Pure virtual interface class to equip a sample layer with scattering properties.
+//! Currently only inherited by ParticleLayout; in the future also by domain structure.
+//! @ingroup samples_internal
+
+// TODO: CONSIDER REFACTORING:
+//   reference to particles could be removed in ILayout,
+//   at the cost of a big refactoring of LayerStrategyBuilder.
+
+class BA_CORE_API_ ILayout : public ICompositeSample
+{
+public:
+    enum EInterferenceApproximation { DA, SSCA };
+
+    ILayout() : me_approx(DA) {}
+    virtual ~ILayout() {}
+
+    virtual ILayout* clone() const =0;
+
+    //! calls the ISampleVisitor's visit method
+    virtual void accept(ISampleVisitor* visitor) const=0;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual ILayout* cloneInvertB() const =0;
+
+    //! Returns number of particles
+    virtual size_t getNumberOfParticles() const =0;
+
+    //! Returns information about particle with index
+    virtual const IAbstractParticle* getParticle(size_t index) const =0;
+
+    //! Returns information on all particles (type and abundance)
+    //! and generates new particles if an IAbstractParticle denotes a collection
+    virtual SafePointerVector<const IParticle> getParticles() const =0;
+
+    /// Get abundance fraction of particle with index
+    virtual double getAbundanceOfParticle(size_t index) const =0;
+
+    /// Get total abundance of all particles
+    double getTotalAbundance() const; // implemented below
+
+    //! Returns interference function
+    virtual const IInterferenceFunction* getInterferenceFunction() const =0;
+    virtual IInterferenceFunction* cloneInterferenceFunction() const =0;
+
+    //! Returns surface density of all particles
+    virtual double getTotalParticleSurfaceDensity() const =0;
+
+    //! Sets surface density of all particles
+    virtual void setTotalParticleSurfaceDensity(double particle_density) =0;
+
+    //! Gets the used approximation for particles and interference functions
+    EInterferenceApproximation getApproximation() const { return me_approx; }
+
+    //! Sets the used approximation for particles and interference functions
+    void setApproximation(EInterferenceApproximation approximation) {
+        me_approx = approximation; }
+
+private:
+    ///< Approximation used for combining particles and interference functions
+    EInterferenceApproximation me_approx;
+};
+
+
+inline double ILayout::getTotalAbundance() const
+{
+    double total_abundance = 0.0;
+    for (size_t i=0; i<getNumberOfParticles(); ++i)
+        total_abundance += getAbundanceOfParticle(i);
+    return total_abundance;
+}
+
+#endif // ILAYOUT_H
diff --git a/Core/Aggregate/InterferenceFunction1DLattice.cpp b/Core/Aggregate/InterferenceFunction1DLattice.cpp
new file mode 100644
index 0000000..6381a0a
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunction1DLattice.cpp
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunction1DLattice.cpp
+//! @brief     Implements class InterferenceFunction1DLattice.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "InterferenceFunction1DLattice.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "FTDecayFunctions.h"
+#include "ISampleVisitor.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+//! @param length: Lattice length
+//! @param xi: rotation of lattice with respect to x-axis
+InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, double xi)
+    : InterferenceFunction1DLattice(Lattice1DParameters(length, xi))
+{}
+
+InterferenceFunction1DLattice::InterferenceFunction1DLattice(
+    const Lattice1DParameters& lattice_params)
+    : m_lattice_params(lattice_params), mp_pdf(nullptr), m_na(0)
+{
+    setName(BornAgain::InterferenceFunction1DLatticeType);
+    init_parameters();
+}
+
+InterferenceFunction1DLattice::~InterferenceFunction1DLattice()
+{
+    delete mp_pdf;
+}
+
+InterferenceFunction1DLattice* InterferenceFunction1DLattice::clone() const
+{
+    InterferenceFunction1DLattice* result = new InterferenceFunction1DLattice(m_lattice_params);
+    if (mp_pdf)
+        result->setDecayFunction(*mp_pdf);
+    return result;
+}
+
+void InterferenceFunction1DLattice::setDecayFunction(const IFTDecayFunction1D& pdf)
+{
+    if (mp_pdf != &pdf) {
+        delete mp_pdf;
+        mp_pdf = pdf.clone();
+    }
+    double omega = mp_pdf->getOmega();
+    double qa_max = (m_lattice_params.m_length / M_TWOPI) * nmax / omega;
+    m_na = (int)(std::abs(qa_max) + 0.5);
+}
+
+double InterferenceFunction1DLattice::evaluate(const kvector_t q) const
+{
+    if (!mp_pdf)
+        throw Exceptions::NullPointerException("InterferenceFunction1DLattice::evaluate"
+                                   " -> Error! No probability distribution function defined.");
+    double result = 0.0;
+    double qxr = q.x();
+    double qyr = q.y();
+    double qx_frac;
+    double xi = m_lattice_params.m_xi;
+    double a = m_lattice_params.m_length;
+    double a_rec = M_TWOPI / a;
+
+    // rotate the q vector to xi angle
+    // so that qx_prime is along the a axis of lattice
+    double qx_prime = qxr * std::cos(xi) + qyr * std::sin(xi);
+
+    // calculate reciprocal vector fraction
+    int qa_int = (int)(qx_prime / a_rec);
+    qx_frac = qx_prime - qa_int * a_rec;
+
+    for (int i = -m_na - 1; i < m_na + 2; ++i) {
+        double qx = qx_frac + i * a_rec;
+        result += mp_pdf->evaluate(qx);
+    }
+    return result/a;
+}
+
+void InterferenceFunction1DLattice::init_parameters()
+{
+    registerParameter(BornAgain::Length, &m_lattice_params.m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Xi, &m_lattice_params.m_xi).setUnit("rad");
+}
diff --git a/Core/Aggregate/InterferenceFunction1DLattice.h b/Core/Aggregate/InterferenceFunction1DLattice.h
new file mode 100644
index 0000000..67f1ffb
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunction1DLattice.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunction1DLattice.h
+//! @brief     Defines class InterferenceFunction1DLattice.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTION1DLATTICE_H
+#define INTERFERENCEFUNCTION1DLATTICE_H
+
+#include "IInterferenceFunction.h"
+#include "Lattice1DParameters.h"
+
+class IFTDecayFunction1D;
+
+//! Interference function of 1D lattice.
+//! @ingroup interference
+
+class BA_CORE_API_ InterferenceFunction1DLattice : public IInterferenceFunction
+{
+public:
+    InterferenceFunction1DLattice(double length, double xi);
+    ~InterferenceFunction1DLattice() final;
+
+    InterferenceFunction1DLattice* clone() const final;
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    void setDecayFunction(const IFTDecayFunction1D& pdf);
+
+    Lattice1DParameters getLatticeParameters() const { return m_lattice_params; }
+
+    const IFTDecayFunction1D* getDecayFunction() const { return mp_pdf; }
+
+    double evaluate(const kvector_t q) const final;
+
+private:
+    InterferenceFunction1DLattice(const Lattice1DParameters& lattice_params);
+    void init_parameters();
+
+    Lattice1DParameters m_lattice_params;
+    IFTDecayFunction1D* mp_pdf;
+    int m_na; //!< determines the number of reciprocal lattice points to use
+
+    static const int nmax = 20; //!< maximum value for qx*Lambdax and qy*lambday
+};
+
+#endif // INTERFERENCEFUNCTION1DLATTICE_H
diff --git a/Core/Aggregate/InterferenceFunction2DLattice.cpp b/Core/Aggregate/InterferenceFunction2DLattice.cpp
new file mode 100644
index 0000000..90cc015
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunction2DLattice.cpp
@@ -0,0 +1,224 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunction2DLattice.cpp
+//! @brief     Implements class InterferenceFunction2DLattice.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "InterferenceFunction2DLattice.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "Macros.h"
+#include "ISampleVisitor.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+GCC_DIAG_OFF(unused-parameter)
+#include <boost/math/special_functions/round.hpp>
+GCC_DIAG_ON(unused-parameter)
+
+using namespace BornAgain;
+
+//! @param length_1 Lattice length 1
+//! @param length_2 Lattice length 2
+//! @param angle angle between lattice vectors
+//! @param xi rotation of lattice with respect to x-axis
+InterferenceFunction2DLattice::InterferenceFunction2DLattice(
+    double length_1, double length_2, double angle, double xi)
+    : mp_pdf(0), m_na(0), m_nb(0)
+{
+    m_lattice_params.m_length_1 = length_1;
+    m_lattice_params.m_length_2 = length_2;
+    m_lattice_params.m_angle = angle;
+    m_lattice_params.m_xi = xi;
+    setName(InterferenceFunction2DLatticeType);
+    init_parameters();
+    initialize_rec_vectors();
+}
+
+InterferenceFunction2DLattice::~InterferenceFunction2DLattice()
+{
+    delete mp_pdf;
+}
+
+InterferenceFunction2DLattice* InterferenceFunction2DLattice::clone() const
+{
+    InterferenceFunction2DLattice* result = new InterferenceFunction2DLattice(m_lattice_params);
+    if (mp_pdf)
+        result->setDecayFunction(*mp_pdf);
+    return result;
+}
+
+InterferenceFunction2DLattice* InterferenceFunction2DLattice::createSquare(
+    double lattice_length, double xi)
+{
+    Lattice2DParameters lattice_params;
+    lattice_params.m_length_1 = lattice_length;
+    lattice_params.m_length_2 = lattice_length;
+    lattice_params.m_angle = M_PI / 2.0;
+    lattice_params.m_xi = xi;
+    return new InterferenceFunction2DLattice(lattice_params);
+}
+
+InterferenceFunction2DLattice* InterferenceFunction2DLattice::createHexagonal(
+    double lattice_length, double xi)
+{
+    Lattice2DParameters lattice_params;
+    lattice_params.m_length_1 = lattice_length;
+    lattice_params.m_length_2 = lattice_length;
+    lattice_params.m_angle = M_TWOPI / 3.0;
+    lattice_params.m_xi = xi;
+    return new InterferenceFunction2DLattice(lattice_params);
+}
+
+void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D &pdf)
+{
+    if (mp_pdf != &pdf)
+        delete mp_pdf;
+    mp_pdf = pdf.clone();
+    initialize_calc_factors();
+}
+
+double InterferenceFunction2DLattice::evaluate(const kvector_t q) const
+{
+    if (!mp_pdf)
+        throw Exceptions::NullPointerException("InterferenceFunction2DLattice::evaluate"
+                                   " -> Error! No probability distribution function defined.");
+    double result = 0.0;
+    double qxr = q.x();
+    double qyr = q.y();
+    double qx_frac, qy_frac;
+    calculateReciprocalVectorFraction(qxr, qyr, qx_frac, qy_frac);
+
+    for (int i = -m_na - 1; i < m_na + 2; ++i) {
+        for (int j = -m_nb - 1; j < m_nb + 2; ++j) {
+            double qx = qx_frac + i * m_asx + j * m_bsx;
+            double qy = qy_frac + i * m_asy + j * m_bsy;
+            result += interferenceAtOneRecLatticePoint(qx, qy);
+        }
+    }
+    return result;
+}
+
+std::string InterferenceFunction2DLattice::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string  new_path = IParameterized::addParametersToExternalPool(
+            path, external_pool, copy_number);
+
+    // add parameters of the probability density function
+    if (mp_pdf)
+        mp_pdf->addParametersToExternalPool(new_path, external_pool, -1);
+    return new_path;
+}
+
+double InterferenceFunction2DLattice::getParticleDensity() const
+{
+    double area = m_lattice_params.getUnitCellArea();
+    if (area == 0.0)
+        return 0.0;
+    return 1.0/area;
+}
+
+void InterferenceFunction2DLattice::onChange()
+{
+    initialize_rec_vectors();
+    initialize_calc_factors();
+}
+
+double InterferenceFunction2DLattice::interferenceAtOneRecLatticePoint(double qx, double qy) const
+{
+    if (!mp_pdf)
+        throw Exceptions::NullPointerException(
+            "InterferenceFunction2DLattice::interferenceAtOneRecLatticePoint"
+            " -> Error! No probability distribution function defined.");
+    double qp1, qp2;
+    double gamma = m_lattice_params.m_xi + mp_pdf->getGamma();
+    double delta = mp_pdf->getDelta();
+    transformToPrincipalAxes(qx, qy, gamma, delta, qp1, qp2);
+    return mp_pdf->evaluate(qp1, qp2);
+}
+
+void InterferenceFunction2DLattice::transformToPrincipalAxes(
+    double qx, double qy, double gamma, double delta, double &q_pa_1, double &q_pa_2) const
+{
+    q_pa_1 = qx * std::cos(gamma) + qy * std::sin(gamma);
+    q_pa_2 = qx * std::cos(gamma + delta) + qy * std::sin(gamma + delta);
+}
+
+void InterferenceFunction2DLattice::calculateReciprocalVectorFraction(
+    double qx, double qy, double &qx_frac, double &qy_frac) const
+{
+    double a = m_lattice_params.m_length_1;
+    double b = m_lattice_params.m_length_2;
+    double xi = m_lattice_params.m_xi;
+    double xialpha = xi + m_lattice_params.m_angle;
+    int qa_int = boost::math::iround(a * (qx * std::cos(xi) + qy * std::sin(xi)) / M_TWOPI);
+    int qb_int
+        = boost::math::iround(b * (qx * std::cos(xialpha) + qy * std::sin(xialpha)) / M_TWOPI);
+    qx_frac = qx - qa_int * m_asx - qb_int * m_bsx;
+    qy_frac = qy - qa_int * m_asy - qb_int * m_bsy;
+}
+
+InterferenceFunction2DLattice::InterferenceFunction2DLattice(
+    const Lattice2DParameters &lattice_params)
+    : m_lattice_params(lattice_params), mp_pdf(0), m_na(0), m_nb(0)
+{
+    setName(InterferenceFunction2DLatticeType);
+    init_parameters();
+    initialize_rec_vectors();
+}
+
+void InterferenceFunction2DLattice::init_parameters()
+{
+    registerParameter(LatticeLength1, &m_lattice_params.m_length_1).setUnit("nm").setPositive();
+    registerParameter(LatticeLength2, &m_lattice_params.m_length_2).setUnit("nm").setPositive();
+    registerParameter(Alpha, &m_lattice_params.m_angle).setUnit("rad");
+    registerParameter(Xi,    &m_lattice_params.m_xi   ).setUnit("rad");
+}
+
+void InterferenceFunction2DLattice::initialize_rec_vectors()
+{
+    if (m_lattice_params.m_length_1 == 0 || m_lattice_params.m_length_2 == 0)
+        throw Exceptions::DivisionByZeroException(
+            "InterferenceFunction2DLattice::"
+            "initialize_rec_vectors() -> Error! Zero parameters"
+            " m_lattice_params.m_length1 or m_lattice_params.m_length_2");
+    double sinalpha = std::sin(m_lattice_params.m_angle);
+    double ainv = M_TWOPI / m_lattice_params.m_length_1 / sinalpha;
+    double binv = M_TWOPI / m_lattice_params.m_length_2 / sinalpha;
+    double xi = m_lattice_params.m_xi;
+    double xialpha = xi + m_lattice_params.m_angle;
+    m_asx = +ainv * std::sin(xialpha);
+    m_asy = -ainv * std::cos(xialpha);
+    m_bsx = -binv * std::sin(xi);
+    m_bsy = +binv * std::cos(xi);
+}
+
+void InterferenceFunction2DLattice::initialize_calc_factors()
+{
+    if (!mp_pdf)
+        throw Exceptions::NullPointerException(
+            "InterferenceFunction2DLattice::initialize_calc_factors"
+            " -> Error! No probability distribution function defined.");
+
+    double coherence_length_x = mp_pdf->getDecayLengthX();
+    double coherence_length_y = mp_pdf->getDecayLengthY();
+
+    // number of reciprocal lattice points to use
+    double qa_max(0.0), qb_max(0.0);
+    mp_pdf->transformToStarBasis(nmax / coherence_length_x, nmax / coherence_length_y,
+                                 m_lattice_params.m_angle, m_lattice_params.m_length_1,
+                                 m_lattice_params.m_length_2, qa_max, qb_max);
+    m_na = boost::math::iround(std::abs(qa_max));
+    m_nb = boost::math::iround(std::abs(qb_max));
+}
diff --git a/Core/Aggregate/InterferenceFunction2DLattice.h b/Core/Aggregate/InterferenceFunction2DLattice.h
new file mode 100644
index 0000000..4cacb4c
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunction2DLattice.h
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunction2DLattice.h
+//! @brief     Defines class InterferenceFunction2DLattice.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTION2DLATTICE_H
+#define INTERFERENCEFUNCTION2DLATTICE_H
+
+#include "IInterferenceFunction.h"
+#include "FTDecayFunctions.h"
+#include "Lattice2DParameters.h"
+
+//! Interference function of 2D lattice.
+//! @ingroup interference
+
+class BA_CORE_API_ InterferenceFunction2DLattice : public IInterferenceFunction
+{
+public:
+    InterferenceFunction2DLattice(double length_1, double length_2, double angle, double xi=0.0);
+    ~InterferenceFunction2DLattice() final;
+
+    InterferenceFunction2DLattice* clone() const final;
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    static InterferenceFunction2DLattice* createSquare(double lattice_length, double xi = 0.0);
+    static InterferenceFunction2DLattice* createHexagonal(double lattice_length, double xi = 0.0);
+
+    void setDecayFunction(const IFTDecayFunction2D& pdf);
+
+    const IFTDecayFunction2D* getDecayFunction() const { return mp_pdf; }
+
+    double evaluate(const kvector_t q) const final;
+
+    Lattice2DParameters getLatticeParameters() const { return m_lattice_params; }
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const final;
+
+    //! Returns the particle density associated with this 2d lattice
+    double getParticleDensity() const final;
+
+protected:
+    void onChange() override final;
+
+private:
+    //! Returns interference from a single reciprocal lattice vector
+    double interferenceAtOneRecLatticePoint(double qx, double qy) const;
+
+    //! Returns reciprocal coordinates in the principal axis system
+    void transformToPrincipalAxes(double qx, double qy, double gamma,
+                                  double delta, double& q_pa_1, double& q_pa_2) const;
+
+    //! Returns qx,qy coordinates of q - qint, where qint is a reciprocal lattice vector
+    //! bounding the reciprocal unit cell to which q belongs
+    void calculateReciprocalVectorFraction(double qx, double qy,
+                                           double& qx_frac, double& qy_frac) const;
+
+    Lattice2DParameters m_lattice_params;
+    IFTDecayFunction2D* mp_pdf;
+    static const int nmax = 20; //!< maximum value for qx*Lambdax and qy*lambday
+
+    InterferenceFunction2DLattice(const Lattice2DParameters& lattice_params);
+
+    void init_parameters();
+
+    //! Initializes the x,y coordinates of the a*,b* reciprocal bases
+    void initialize_rec_vectors();
+
+    //! Initializes factors needed in each calculation
+    void initialize_calc_factors();
+
+    double m_asx, m_asy; //!< x,y coordinates of a*
+    double m_bsx, m_bsy; //!< x,y coordinates of b*
+    int m_na, m_nb; //!< determines the number of reciprocal lattice points to use
+};
+
+#endif // INTERFERENCEFUNCTION2DLATTICE_H
diff --git a/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp b/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
new file mode 100644
index 0000000..371df2b
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
@@ -0,0 +1,260 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
+//! @brief     Implements class InterferenceFunction2DParaCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "InterferenceFunction2DParaCrystal.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "ISampleVisitor.h"
+#include "IntegratorReal.h"
+#include "ParameterPool.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+using namespace BornAgain;
+
+//! @param length_1 Length of first lattice basis vector.
+//! @param length_2 Length of second lattice basis vector.
+//! @param alpha_lattice Angle between the lattice basis vectors.
+//! @param xi Angle between first basis vector and the x-axis of incoming beam.
+//! @param damping_length Damping length for removing delta function singularity at q=0.
+InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(
+        double length_1, double length_2, double alpha_lattice, double xi, double damping_length)
+    : m_integrate_xi(false)
+    , m_damping_length(damping_length)
+    , m_use_damping_length(true)
+{
+    m_lattice_params.m_length_1 = length_1;
+    m_lattice_params.m_length_2 = length_2;
+    m_lattice_params.m_angle = alpha_lattice;
+    m_lattice_params.m_xi = xi;
+    m_pdfs[0] = 0;
+    m_pdfs[1] = 0;
+    m_domain_sizes[0] = 0.0;
+    m_domain_sizes[1] = 0.0;
+    setName(InterferenceFunction2DParaCrystalType);
+    if (m_damping_length==0.0)
+        m_use_damping_length = false;
+    init_parameters();
+    mP_integrator = make_integrator_real(
+        this, &InterferenceFunction2DParaCrystal::interferenceForXi);
+}
+
+InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal()
+{
+    for (size_t i=0; i<2; ++i)
+        delete m_pdfs[i];
+}
+
+InterferenceFunction2DParaCrystal* InterferenceFunction2DParaCrystal::clone() const
+{
+    InterferenceFunction2DParaCrystal* result = new InterferenceFunction2DParaCrystal(
+        m_lattice_params.m_length_1, m_lattice_params.m_length_2, m_lattice_params.m_angle,
+        m_lattice_params.m_xi, m_damping_length);
+    result->setDomainSizes(m_domain_sizes[0], m_domain_sizes[1]);
+    if (m_pdfs[0] && m_pdfs[1])
+        result->setProbabilityDistributions(*m_pdfs[0], *m_pdfs[1]);
+    result->setIntegrationOverXi(m_integrate_xi);
+    return result;
+}
+
+std::string InterferenceFunction2DParaCrystal::to_str(int indent) const
+{
+    std::stringstream ss;
+    ss << std::string(4*indent, '.') << " " << getName() << " " << *getParameterPool() << "\n";
+    std::vector<const IFTDistribution2D*> pdfs = getProbabilityDistributions();
+    ss << std::string(4*(indent+1), '.') << " pdfs: " << *pdfs[0] << " " << *pdfs[1] << "\n";
+    for( const ISample* child: getChildren() )
+        ss << child->to_str(indent+1);
+    return ss.str();
+}
+
+//! Sets the probability distributions (Fourier transformed) for the two lattice directions.
+//! @param pdf_1: probability distribution in first lattice direction
+//! @param pdf_2: probability distribution in second lattice direction
+void InterferenceFunction2DParaCrystal::setProbabilityDistributions(
+        const IFTDistribution2D& pdf_1, const IFTDistribution2D& pdf_2)
+{
+    for (size_t i=0; i<2; ++i)
+        delete m_pdfs[i];
+    m_pdfs[0] = pdf_1.clone();
+    m_pdfs[1] = pdf_2.clone();
+}
+
+double InterferenceFunction2DParaCrystal::evaluate(const kvector_t q) const
+{
+    m_qx = q.x();
+    m_qy = q.y();
+    if (!m_integrate_xi)
+        return interferenceForXi(m_lattice_params.m_xi);
+    return mP_integrator->integrate(0.0, M_TWOPI)/M_TWOPI;
+}
+
+std::string InterferenceFunction2DParaCrystal::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string  new_path = IParameterized::addParametersToExternalPool(
+            path, external_pool, copy_number);
+
+    // add parameters of the probability density functions
+    if (m_pdfs[0])
+        m_pdfs[0]->addParametersToExternalPool(new_path, external_pool, 0);
+    if (m_pdfs[1])
+        m_pdfs[1]->addParametersToExternalPool(new_path, external_pool, 1);
+    return new_path;
+}
+
+double InterferenceFunction2DParaCrystal::getParticleDensity() const
+{
+    double area = m_lattice_params.getUnitCellArea();
+    if (area == 0.0)
+        return 0.0;
+    return 1.0/area;
+}
+
+InterferenceFunction2DParaCrystal* InterferenceFunction2DParaCrystal::createSquare(
+    double peak_distance, double damping_length, double domain_size_1, double domain_size_2)
+{
+    InterferenceFunction2DParaCrystal* p_new =
+            new InterferenceFunction2DParaCrystal(peak_distance, peak_distance,
+                    M_PI_2, 0.0, damping_length);
+    p_new->setDomainSizes(domain_size_1, domain_size_2);
+    p_new->setIntegrationOverXi(true);
+    return p_new;
+}
+
+InterferenceFunction2DParaCrystal* InterferenceFunction2DParaCrystal::createHexagonal(
+    double peak_distance, double damping_length, double domain_size_1, double domain_size_2)
+{
+    auto p_new = new InterferenceFunction2DParaCrystal(
+        peak_distance, peak_distance, M_TWOPI/3.0, 0.0, damping_length);
+    p_new->setDomainSizes(domain_size_1, domain_size_2);
+    p_new->setIntegrationOverXi(true);
+    return p_new;
+}
+
+//! Sets the sizes of coherence domains.
+//! @param size_1: size in first lattice direction
+//! @param size_2: size in second lattice direction
+void InterferenceFunction2DParaCrystal::setDomainSizes(double size_1, double size_2)
+{
+    m_domain_sizes[0] = size_1;
+    m_domain_sizes[1] = size_2;
+}
+
+void InterferenceFunction2DParaCrystal::transformToPrincipalAxes(
+        double qx, double qy, double gamma, double delta, double& q_pa_1, double& q_pa_2) const
+{
+    q_pa_1 = qx*std::cos(gamma) + qy*std::sin(gamma);
+    q_pa_2 = qx*std::cos(gamma+delta) + qy*std::sin(gamma+delta);
+}
+
+void InterferenceFunction2DParaCrystal::init_parameters()
+{
+    registerParameter(LatticeLength1, &m_lattice_params.m_length_1).setUnit("nm");
+    registerParameter(LatticeLength2, &m_lattice_params.m_length_2).setUnit("nm");
+    registerParameter(LatticeAngle, &m_lattice_params.m_angle).setUnit("rad");
+    registerParameter(Xi, &m_lattice_params.m_xi).setUnit("rad");
+    registerParameter(DampingLength, &m_damping_length).setUnit("nm").setNonnegative();
+    registerParameter(DomainSize1, &m_domain_sizes[0]).setUnit("nm").setNonnegative();
+    registerParameter(DomainSize2, &m_domain_sizes[1]).setUnit("nm").setNonnegative();
+}
+
+//! Returns interference function for fixed angle xi.
+double InterferenceFunction2DParaCrystal::interferenceForXi(double xi) const
+{
+    double result = interference1D(m_qx, m_qy, xi, 0)*
+        interference1D(m_qx, m_qy, xi + m_lattice_params.m_angle, 1);
+    return result;
+}
+
+//! Returns interference function for fixed xi in the dimension determined by the given index.
+double InterferenceFunction2DParaCrystal::interference1D(
+    double qx, double qy, double xi, size_t index) const
+{
+    if (index > 1)
+        throw Exceptions::OutOfBoundsException("InterferenceFunction2DParaCrystal::"
+                "interference1D() -> Error! Index of interference function "
+                "probability must be < 2");
+    if (!m_pdfs[0] || !m_pdfs[1])
+        throw Exceptions::NullPointerException("InterferenceFunction2DParaCrystal::"
+                "interference1D() -> Error! Probability distributions for "
+                "interference funtion not properly initialized");
+    double result;
+    double length = index ? m_lattice_params.m_length_2 : m_lattice_params.m_length_1;
+    int n = (int)std::abs(m_domain_sizes[index]/length);
+    double nd = (double)n;
+    complex_t fp = FTPDF(qx, qy, xi, index);
+    if (n<1) {
+        result = ((1.0 + fp)/(1.0 - fp)).real();
+    } else {
+        if (std::norm(1.0-fp) < std::numeric_limits<double>::epsilon() )
+            result = nd;
+        // for (1-fp)*nd small, take the series expansion to second order in nd*(1-fp)
+        else if (std::abs(1.0-fp)*nd < 2e-4) {
+            complex_t intermediate = (nd-1.0)/2.0 + (nd*nd-1.0)*(fp-1.0)/6.0
+                    + (nd*nd*nd-2.0*nd*nd-nd+2.0)*(fp-1.0)*(fp-1.0)/24.0;
+            result = 1.0 + 2.0*intermediate.real();
+        } else {
+            complex_t tmp;
+            if (std::abs(fp)==0.0
+             || std::log(std::abs(fp))*nd < std::log(std::numeric_limits<double>::min()))
+                tmp = 0.0;
+            else
+                tmp = std::pow(fp,n);
+            complex_t intermediate = fp/(1.0-fp) - fp*(1.0-tmp)/nd/(1.0-fp)/(1.0-fp);
+            result = 1.0 + 2.0*intermediate.real();
+        }
+    }
+    return result;
+}
+
+complex_t InterferenceFunction2DParaCrystal::FTPDF(
+    double qx, double qy, double xi, size_t index) const
+{
+    double length = (index ? m_lattice_params.m_length_2 : m_lattice_params.m_length_1);
+    double qa = qx*length*std::cos(xi) + qy*length*std::sin(xi);
+    complex_t phase = exp_I(qa);
+    // transform q to principal axes:
+    double qp1, qp2;
+    double gamma = xi + m_pdfs[index]->getGamma();
+    double delta = m_pdfs[index]->getDelta();
+    transformToPrincipalAxes(qx, qy, gamma, delta, qp1, qp2);
+    double amplitude = m_pdfs[index]->evaluate(qp1, qp2);
+    complex_t result = phase*amplitude;
+    if (m_use_damping_length)
+        result *= std::exp(-length/m_damping_length);
+    return result;
+}
+
+std::vector<double> InterferenceFunction2DParaCrystal::getDomainSizes() const
+{
+    std::vector<double> result;
+    result.resize(2);
+    result[0] = m_domain_sizes[0];
+    result[1] = m_domain_sizes[1];
+    return result;
+}
+
+std::vector<const IFTDistribution2D*>
+InterferenceFunction2DParaCrystal::getProbabilityDistributions() const
+{
+    std::vector<const IFTDistribution2D*>  result;
+    result.resize(2);
+    result[0] = m_pdfs[0];
+    result[1] = m_pdfs[1];
+    return result;
+}
diff --git a/Core/Aggregate/InterferenceFunction2DParaCrystal.h b/Core/Aggregate/InterferenceFunction2DParaCrystal.h
new file mode 100644
index 0000000..197f9ad
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunction2DParaCrystal.h
@@ -0,0 +1,96 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunction2DParaCrystal.h
+//! @brief     Defines class InterferenceFunction2DParaCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTION2DPARACRYSTAL_H
+#define INTERFERENCEFUNCTION2DPARACRYSTAL_H
+
+#include "IInterferenceFunction.h"
+#include "Complex.h"
+#include "FTDistributions2D.h"
+#include "Lattice2DParameters.h"
+#include <memory>
+
+template <class T> class IntegratorReal;
+class IFTDistribution2D;
+
+//! Interference function of 2D paracrystal.
+//! @ingroup interference
+
+class BA_CORE_API_ InterferenceFunction2DParaCrystal : public IInterferenceFunction
+{
+public:
+    InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha_lattice,
+                                      double xi = 0.0, double damping_length = 0.0);
+
+    ~InterferenceFunction2DParaCrystal() final;
+
+    InterferenceFunction2DParaCrystal* clone() const final;
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    std::string to_str(int indent=0) const final;
+
+    static InterferenceFunction2DParaCrystal* createSquare(double peak_distance,
+                                                           double damping_length = 0.0,
+                                                           double domain_size_1 = 0.0,
+                                                           double domain_size_2 = 0.0);
+    static InterferenceFunction2DParaCrystal* createHexagonal(double peak_distance,
+                                                              double damping_length = 0.0,
+                                                              double domain_size_1 = 0.0,
+                                                              double domain_size_2 = 0.0);
+
+    void setDomainSizes(double size_1, double size_2);
+
+    void setProbabilityDistributions(const IFTDistribution2D& pdf_1,
+                                     const IFTDistribution2D& pdf_2);
+
+    double evaluate(const kvector_t q) const final;
+
+    std::vector<double> getDomainSizes() const;
+    std::vector<const IFTDistribution2D*> getProbabilityDistributions() const;
+
+    void setIntegrationOverXi(bool integrate_xi) { m_integrate_xi = integrate_xi; }
+    bool getIntegrationOverXi() const { return m_integrate_xi; }
+    double getDampingLength() const { return m_damping_length; }
+
+    Lattice2DParameters getLatticeParameters() const { return m_lattice_params; }
+
+    std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const final;
+
+    double getParticleDensity() const final;
+
+private:
+    void init_parameters();
+    double interferenceForXi(double xi) const;
+    double interference1D(double qx, double qy, double xi, size_t index) const;
+    complex_t FTPDF(double qx, double qy, double xi, size_t index) const;
+    void transformToPrincipalAxes(double qx, double qy, double gamma, double delta, double& q_pa_1,
+                                  double& q_pa_2) const;
+
+    Lattice2DParameters m_lattice_params; //!< Lattice parameters
+    bool m_integrate_xi; //!< Integrate over the orientation xi
+    IFTDistribution2D* m_pdfs[2];
+    double m_damping_length; //!< Damping length for removing delta function singularity at q=0.
+    bool m_use_damping_length; //!< Flag that determines if the damping length should be used.
+    double m_domain_sizes[2]; //!< Coherence domain sizes
+    mutable double m_qx;
+    mutable double m_qy;
+#ifndef SWIG
+    std::unique_ptr<IntegratorReal<InterferenceFunction2DParaCrystal>> mP_integrator;
+#endif
+};
+
+#endif // INTERFERENCEFUNCTION2DPARACRYSTAL_H
diff --git a/Core/Aggregate/InterferenceFunctionNone.cpp b/Core/Aggregate/InterferenceFunctionNone.cpp
new file mode 100644
index 0000000..16ebc19
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunctionNone.cpp
@@ -0,0 +1,25 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunctionNone.cpp
+//! @brief     Implements class InterferenceFunctionNone.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "InterferenceFunctionNone.h"
+#include "BornAgainNamespace.h"
+#include "ISampleVisitor.h"
+#include "RealParameter.h"
+
+
+InterferenceFunctionNone::InterferenceFunctionNone()
+{
+    setName(BornAgain::InterferenceFunctionNoneType);
+}
diff --git a/Core/Aggregate/InterferenceFunctionNone.h b/Core/Aggregate/InterferenceFunctionNone.h
new file mode 100644
index 0000000..6f0821b
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunctionNone.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunctionNone.h
+//! @brief     Defines class InterferenceFunctionNone.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTIONNONE_H
+#define INTERFERENCEFUNCTIONNONE_H
+
+#include "IInterferenceFunction.h"
+
+//! Default interference function (i.e. absence of any interference).
+//! @ingroup interference
+
+class BA_CORE_API_ InterferenceFunctionNone : public IInterferenceFunction
+{
+public:
+    InterferenceFunctionNone();
+
+    InterferenceFunctionNone* clone() const final { return new InterferenceFunctionNone(); }
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    double evaluate(const kvector_t) const final { return 1; }
+};
+
+#endif // INTERFERENCEFUNCTIONNONE_H
diff --git a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
new file mode 100644
index 0000000..aeaae8e
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
@@ -0,0 +1,123 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
+//! @brief     Implements class InterferenceFunctionRadialParaCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "ISampleVisitor.h"
+#include "ParameterPool.h"
+#include "RealParameter.h"
+#include <limits>
+
+using namespace BornAgain;
+
+InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(
+        double peak_distance, double damping_length)
+    : m_peak_distance(peak_distance)
+    , m_damping_length(damping_length)
+    , m_use_damping_length(true)
+    , m_kappa(0.0)
+    , m_domain_size(0.0)
+{
+    setName(InterferenceFunctionRadialParaCrystalType);
+    if (m_damping_length==0.0)
+        m_use_damping_length = false;
+    init_parameters();
+}
+
+void InterferenceFunctionRadialParaCrystal::init_parameters()
+{
+    registerParameter(PeakDistance, &m_peak_distance).setUnit("nm").setNonnegative();
+    registerParameter(DampingLength, &m_damping_length).setUnit("nm").setNonnegative();
+    registerParameter(SizeSpaceCoupling, &m_kappa).setNonnegative();
+    registerParameter(DomainSize, &m_domain_size).setUnit("nm").setNonnegative();
+}
+
+InterferenceFunctionRadialParaCrystal* InterferenceFunctionRadialParaCrystal::clone() const {
+    InterferenceFunctionRadialParaCrystal* result =
+        new InterferenceFunctionRadialParaCrystal(
+            m_peak_distance, m_damping_length);
+    result->setDomainSize(getDomainSize());
+    result->setKappa(m_kappa);
+    if (mP_pdf)
+        result->setProbabilityDistribution(*mP_pdf);
+    return result;
+}
+
+std::string InterferenceFunctionRadialParaCrystal::to_str(int indent) const
+{
+    std::stringstream ss;
+    ss << std::string(4*indent, '.') << " " << getName() << " " << *getParameterPool() << "\n";
+    ss << std::string(4*(indent+1), '.') << " pdf: " << *getProbabilityDistribution() << "\n";
+    for( const ISample* child: getChildren() )
+        ss << child->to_str(indent+1);
+    return ss.str();
+}
+
+double InterferenceFunctionRadialParaCrystal::evaluate(const kvector_t q) const
+{
+    if (!mP_pdf)
+        throw Exceptions::NullPointerException("InterferenceFunctionRadialParaCrystal::"
+                "evaluate() -> Error! Probability distribution for "
+                "interference funtion not properly initialized");
+    double result=0.0;
+    double qxr = q.x();
+    double qyr = q.y();
+    double qpar = std::sqrt(qxr*qxr + qyr*qyr);
+    int n = (int)std::abs(m_domain_size/m_peak_distance);
+    double nd = (double)n;
+    complex_t fp = FTPDF(qpar);
+    if (n<1) {
+        result = ((1.0 + fp)/(1.0 - fp)).real();
+    } else {
+        if (std::norm(1.0-fp) < std::numeric_limits<double>::epsilon() ) {
+            result = nd;
+        }
+        // for (1-fp)*nd small, take the series expansion to second order in nd*(1-fp)
+        else if (std::abs(1.0-fp)*nd < 2e-4) {
+            complex_t intermediate = (nd-1.0)/2.0 + (nd*nd-1.0)*(fp-1.0)/6.0
+                    + (nd*nd*nd-2.0*nd*nd-nd+2.0)*(fp-1.0)*(fp-1.0)/24.0;
+            result = 1.0 + 2.0*intermediate.real();
+        }
+        else {
+            complex_t tmp;
+            if (std::abs(fp)==0.0
+             || std::log(std::abs(fp))*nd < std::log(std::numeric_limits<double>::min())) {
+                            tmp = 0.0;
+            } else {
+                tmp = std::pow(fp,n);
+            }
+            complex_t intermediate = fp/(1.0-fp) - fp*(1.0-tmp)/nd/(1.0-fp)/(1.0-fp);
+            result = 1.0 + 2.0*intermediate.real();
+        }
+    }
+    return result;
+}
+
+complex_t InterferenceFunctionRadialParaCrystal::FTPDF(double qpar) const
+{
+    complex_t phase = exp_I(qpar*m_peak_distance);
+    double amplitude = mP_pdf->evaluate(qpar);
+    complex_t result = phase*amplitude;
+    if (m_use_damping_length)
+        result *= std::exp(-m_peak_distance/m_damping_length);
+    return result;
+}
+
+void InterferenceFunctionRadialParaCrystal::setProbabilityDistribution(const IFTDistribution1D &pdf)
+{
+    if (mP_pdf.get() != &pdf)
+        mP_pdf.reset(pdf.clone());
+}
diff --git a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.h b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.h
new file mode 100644
index 0000000..2cb3af4
--- /dev/null
+++ b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.h
@@ -0,0 +1,66 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/InterferenceFunctionRadialParaCrystal.h
+//! @brief     Defines class InterferenceFunctionRadialParaCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTIONRADIALPARACRYSTAL_H
+#define INTERFERENCEFUNCTIONRADIALPARACRYSTAL_H
+
+#include "IInterferenceFunction.h"
+#include "Complex.h"
+#include "FTDistributions1D.h"
+#include <memory>
+
+//! Interference function of radial paracrystal.
+//! @ingroup interference
+
+class BA_CORE_API_ InterferenceFunctionRadialParaCrystal : public IInterferenceFunction
+{
+public:
+    InterferenceFunctionRadialParaCrystal(double peak_distance, double damping_length=0.0);
+    InterferenceFunctionRadialParaCrystal* clone() const final;
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    std::string to_str(int indent=0) const final;
+
+    void setKappa(double kappa) { m_kappa = kappa; }
+    double getKappa() const final { return m_kappa; }
+
+    void setDomainSize(double size) { m_domain_size = size; }
+    double getDomainSize() const { return m_domain_size; }
+
+    double evaluate(const kvector_t q) const final;
+    //TODO: replace these with strategy pattern for different algorithms
+    complex_t FTPDF(double qpar) const;
+
+    void setProbabilityDistribution(const IFTDistribution1D& pdf);
+    const IFTDistribution1D* getProbabilityDistribution() const { return mP_pdf.get(); }
+
+    double getPeakDistance() const { return m_peak_distance; }
+
+    double getDampingLength() const { return m_damping_length; }
+
+private:
+    void init_parameters();
+
+    double m_peak_distance; //!< the distance to the first neighbor peak
+    double m_damping_length; //!< damping length of paracrystal
+    //! Fourier transformed probability distribution of the nearest particle
+    std::unique_ptr<IFTDistribution1D> mP_pdf;
+    bool m_use_damping_length;
+    double m_kappa; //!< Size-spacing coupling parameter
+    double m_domain_size; //!< Size of coherence domain
+};
+
+#endif // INTERFERENCEFUNCTIONRADIALPARACRYSTAL_H
diff --git a/Core/Aggregate/ParticleLayout.cpp b/Core/Aggregate/ParticleLayout.cpp
new file mode 100644
index 0000000..be5b1b1
--- /dev/null
+++ b/Core/Aggregate/ParticleLayout.cpp
@@ -0,0 +1,211 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/ParticleLayout.cpp
+//! @brief     Implements class ParticleLayout.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleLayout.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "IInterferenceFunction.h"
+#include "InterferenceFunctionNone.h"
+#include "ISampleVisitor.h"
+#include "Particle.h"
+#include "ParticleDistribution.h"
+#include "RealParameter.h"
+#include <iomanip>
+
+ParticleLayout::ParticleLayout()
+    : mP_interference_function {nullptr}
+    , m_total_particle_density {1.0}
+{
+    setName(BornAgain::ParticleLayoutType);
+}
+
+ParticleLayout::~ParticleLayout() {} // needs member class definitions => don't move to .h
+
+ParticleLayout::ParticleLayout(const IAbstractParticle& particle)
+    : mP_interference_function {nullptr}
+    , m_total_particle_density {1.0}
+{
+    setName(BornAgain::ParticleLayoutType);
+    addParticle(particle);
+}
+
+ParticleLayout::ParticleLayout(const IAbstractParticle& particle, double abundance)
+    : mP_interference_function {nullptr}
+    , m_total_particle_density {1.0}
+{
+    setName(BornAgain::ParticleLayoutType);
+    addParticle(particle, abundance);
+}
+
+ParticleLayout* ParticleLayout::clone() const
+{
+    ParticleLayout* p_new = new ParticleLayout();
+
+    for (size_t i = 0; i < m_particles.size(); ++i)
+        p_new->addAndRegisterAbstractParticle(m_particles[i]->clone());
+
+    if (mP_interference_function)
+        p_new->setAndRegisterInterferenceFunction(mP_interference_function->clone());
+
+    p_new->setTotalParticleSurfaceDensity(getTotalParticleSurfaceDensity());
+    p_new->setApproximation(getApproximation());
+
+    return p_new;
+}
+
+//! Returns a clone with inverted magnetic fields.
+ParticleLayout* ParticleLayout::cloneInvertB() const
+{
+    ParticleLayout* p_new = new ParticleLayout();
+
+    for (size_t i = 0; i < m_particles.size(); ++i)
+        p_new->addAndRegisterAbstractParticle(m_particles[i]->cloneInvertB());
+
+    if (mP_interference_function)
+        p_new->setAndRegisterInterferenceFunction(mP_interference_function->clone());
+
+    p_new->setTotalParticleSurfaceDensity(getTotalParticleSurfaceDensity());
+    p_new->setApproximation(getApproximation());
+
+    return p_new;
+}
+
+//! Adds generic particle to the layout.
+void ParticleLayout::addParticle(const IAbstractParticle& particle)
+{
+    addAndRegisterAbstractParticle(particle.clone());
+}
+
+//! Adds generic particle to the layout with only abundance defined.
+//! @param particle to be added
+//! @param abundance Particle abundance
+void ParticleLayout::addParticle(const IAbstractParticle& particle, double abundance)
+{
+    std::unique_ptr<IAbstractParticle> P_particle_clone { particle.clone() };
+    P_particle_clone->setAbundance(abundance);
+    addAndRegisterAbstractParticle(P_particle_clone.release());
+}
+
+//! Adds particle to the layout with abundance and position defined.
+//! @param particle to be added
+//! @param abundance Particle abundance
+//! @param position Particle position
+void ParticleLayout::addParticle(const IParticle& particle, double abundance,
+                                 const kvector_t position)
+{
+    std::unique_ptr<IParticle> P_particle_clone { particle.clone() };
+    P_particle_clone->setAbundance(abundance);
+    if (position != kvector_t(0,0,0))
+        P_particle_clone->applyTranslation(position);
+    addAndRegisterAbstractParticle(P_particle_clone.release());
+}
+
+//! Adds particle to the layout with abundance, position and the rotation defined.
+//! @param particle to be added
+//! @param abundance Particle abundance
+//! @param position Particle position
+//! @param rotation Particle rotation
+void ParticleLayout::addParticle(const IParticle& particle, double abundance,
+                                 const kvector_t position, const IRotation& rotation)
+{
+    std::unique_ptr<IParticle> P_particle_clone { particle.clone() };
+    P_particle_clone->setAbundance(abundance);
+    if (!rotation.isIdentity())
+        P_particle_clone->applyRotation(rotation);
+    if(position != kvector_t(0,0,0))
+        P_particle_clone->applyTranslation(position);
+    addAndRegisterAbstractParticle(P_particle_clone.release());
+}
+
+//! Returns particle info
+const IAbstractParticle* ParticleLayout::getParticle(size_t index) const
+{
+    if (index>=m_particles.size())
+        throw Exceptions::OutOfBoundsException(
+            "ParticleLayout::getParticle() -> Error! Not so many particles in this decoration.");
+    return m_particles[index];
+}
+
+//! Returns information on all particles (type and abundance)
+//! and generates new particles if an IAbstractParticle denotes a collection
+SafePointerVector<const IParticle> ParticleLayout::getParticles() const
+{
+    SafePointerVector<const IParticle> particle_vector;
+    for (auto particle: m_particles) {
+        if (const auto* p_part_distr = dynamic_cast<const ParticleDistribution*>(particle)) {
+            std::vector<const IParticle*> generated_particles;
+            p_part_distr->generateParticles(generated_particles);
+            for (const IParticle* particle: generated_particles)
+                particle_vector.push_back(particle);
+        } else if (const auto* p_iparticle = dynamic_cast<const IParticle*>(particle)) {
+            particle_vector.push_back(p_iparticle->clone());
+        }
+    }
+    return particle_vector;
+}
+
+//! Returns the abundance fraction of particle at given index.
+double ParticleLayout::getAbundanceOfParticle(size_t index) const
+{
+    return m_particles[index]->getAbundance();
+}
+
+//! Returns a clone, or an InterferenceFunctionNone.
+IInterferenceFunction* ParticleLayout::cloneInterferenceFunction() const
+{
+    if( const IInterferenceFunction* p_iff = mP_interference_function.get() )
+        return p_iff->clone();
+    else
+        return new InterferenceFunctionNone();
+}
+
+//! Adds interference functions
+void ParticleLayout::addInterferenceFunction(const IInterferenceFunction& interference_function)
+{
+    setAndRegisterInterferenceFunction(interference_function.clone());
+}
+
+double ParticleLayout::getTotalParticleSurfaceDensity() const
+{
+    double iff_density =
+        mP_interference_function ? mP_interference_function->getParticleDensity() : 0.0;
+    return iff_density > 0.0 ? iff_density : m_total_particle_density;
+}
+
+//! Adds particle information with simultaneous registration in parent class.
+void ParticleLayout::addAndRegisterAbstractParticle(IAbstractParticle* child)
+{
+    m_particles.push_back(child);
+    registerChild(child);
+}
+
+//! Sets interference function with simultaneous registration in parent class
+void ParticleLayout::setAndRegisterInterferenceFunction(IInterferenceFunction* child)
+{
+    if (mP_interference_function)
+        deregisterChild(mP_interference_function.get());
+    mP_interference_function.reset(child);
+    registerChild(child);
+}
+
+void ParticleLayout::print(std::ostream& ostr) const
+{
+    ILayout::print(ostr);
+    ostr << "-->ParticleLayout<" << this << ">{\n";
+    for( size_t i=0; i<m_particles.size(); ++i )
+        ostr << "      - particle " << std::left << std::setw(2) << i << " { "
+             << *(m_particles[i]) << "}\n";
+    ostr << "}";
+}
diff --git a/Core/Aggregate/ParticleLayout.h b/Core/Aggregate/ParticleLayout.h
new file mode 100644
index 0000000..cc9d3f7
--- /dev/null
+++ b/Core/Aggregate/ParticleLayout.h
@@ -0,0 +1,79 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Aggregate/ParticleLayout.h
+//! @brief     Defines class ParticleLayout.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLELAYOUT_H
+#define PARTICLELAYOUT_H
+
+#include "ILayout.h"
+#include "Vectors3D.h"
+#include <memory>
+
+class IAbstractParticle;
+class IInterferenceFunction;
+class IParticle;
+
+//! Decorator class that adds particles to ISample objects.
+//! @ingroup samples
+
+class BA_CORE_API_ ParticleLayout : public ILayout
+{
+public:
+    ParticleLayout();
+    ParticleLayout(const IAbstractParticle& particle);
+    ParticleLayout(const IAbstractParticle& particle, double abundance);
+    ~ParticleLayout() final;
+
+    ParticleLayout* clone() const final;
+    ParticleLayout* cloneInvertB() const final;
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    void addParticle(const IAbstractParticle& particle);
+    void addParticle(const IAbstractParticle& particle, double abundance); // TODO delete this
+    void addParticle(const IParticle& particle, double abundance, const kvector_t position);
+    void addParticle(const IParticle& particle, double abundance,
+                     const kvector_t position, const IRotation& rotation);
+
+    size_t getNumberOfParticles() const final { return m_particles.size(); }
+
+    const IAbstractParticle* getParticle(size_t index) const final;
+
+    SafePointerVector<const IParticle> getParticles() const final;
+
+    double getAbundanceOfParticle(size_t index) const;
+
+    const IInterferenceFunction* getInterferenceFunction() const final {
+        return mP_interference_function.get(); }
+    IInterferenceFunction* cloneInterferenceFunction() const final;
+    void addInterferenceFunction(const IInterferenceFunction& interference_function);
+    // TODO add -> set (there can be at most 1 interference function)
+
+    double getTotalParticleSurfaceDensity() const final;
+    void setTotalParticleSurfaceDensity(double particle_density) final {
+        m_total_particle_density = particle_density; }
+
+private:
+    void addAndRegisterAbstractParticle(IAbstractParticle* child);
+
+    void setAndRegisterInterferenceFunction(IInterferenceFunction* child);
+
+    void print(std::ostream& ostr) const;
+
+    SafePointerVector<IAbstractParticle> m_particles; //!< Vector of particle types
+    std::unique_ptr<IInterferenceFunction> mP_interference_function;
+    double m_total_particle_density;
+};
+
+#endif // PARTICLELAYOUT_H
diff --git a/Core/Basics/BornAgainNamespace.h b/Core/Basics/BornAgainNamespace.h
new file mode 100644
index 0000000..4fdc11c
--- /dev/null
+++ b/Core/Basics/BornAgainNamespace.h
@@ -0,0 +1,212 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/BornAgainNamespace.h
+//! @brief     Defines BornAgain namespace
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BORNAGAINNAMESPACE_H
+#define BORNAGAINNAMESPACE_H
+
+#include <string>
+
+namespace BornAgain
+{
+// Axis constants
+const std::string PHI_AXIS_NAME = "phi_f";
+const std::string ALPHA_AXIS_NAME = "alpha_f";
+const std::string U_AXIS_NAME = "u";
+const std::string V_AXIS_NAME = "v";
+const size_t X_AXIS_INDEX = 0;
+const size_t Y_AXIS_INDEX = 1;
+
+// Simulation types
+const std::string GISASSimulationType = "GISASSimulation";
+const std::string OffSpecSimulationType = "OffSpecSimulation";
+
+// Instrument related constants
+const std::string InstrumentType = "Instrument";
+const std::string ResolutionFunction2D = "ResolutionFunction2D";
+const std::string DetectorType = "Detector";
+const std::string SphericalDetectorType = "SphericalDetector";
+const std::string RectangularDetectorType = "RectangularDetector";
+const std::string IsGISAXSDetectorType = "IsGISAXSDetector";
+const std::string BeamType = "Beam";
+
+// ISample object types
+const std::string MultiLayerType = "MultiLayer";
+const std::string LayerType = "Layer";
+const std::string LayerInterfaceType = "LayerInterface";
+const std::string ParticleLayoutType = "ParticleLayout";
+const std::string ParticleType = "Particle";
+const std::string ParticleCoreShellType = "ParticleCoreShell";
+const std::string ParticleDistributionType = "ParticleDistribution";
+const std::string ParticleCompositionType = "ParticleComposition";
+const std::string TransformationType = "Rotation";
+
+const std::string LayerBasicRoughnessType = "LayerBasicRoughness";
+const std::string LayerZeroRoughnessType = "LayerZeroRoughness";
+
+const std::string InterferenceFunctionNoneType = "InterferenceNone";
+const std::string InterferenceFunctionRadialParaCrystalType = "InterferenceRadialParaCrystal";
+const std::string InterferenceFunction2DParaCrystalType = "Interference2DParaCrystal";
+const std::string InterferenceFunction1DLatticeType = "Interference1DLattice";
+const std::string InterferenceFunction2DLatticeType = "Interference2DLattice";
+
+const std::string CrystalType = "Crystal";
+const std::string MesoCrystalType = "MesoCrystal";
+
+const std::string FFAnisoPyramidType = "AnisoPyramid";
+const std::string FFBoxType = "Box";
+const std::string FFConeType = "Cone";
+const std::string FFCone6Type = "Cone6";
+const std::string FFCuboctahedronType = "Cuboctahedron";
+const std::string FFCylinderType = "Cylinder";
+const std::string FFDodecahedronType = "Dodecahedron";
+const std::string FFEllipsoidalCylinderType = "EllipsoidalCylinder";
+const std::string FFFullSphereType = "FullSphere";
+const std::string FFFullSpheroidType = "FullSpheroid";
+const std::string FFGaussType = "FormFactorGauss";
+const std::string FFHemiEllipsoidType = "HemiEllipsoid";
+const std::string FFLongBoxGaussType = "FormFactorLongBoxGauss";
+const std::string FFIcosahedronType = "Icosahedron";
+const std::string FFLongBoxLorentzType = "FormFactorLongBoxLorentz";
+const std::string FFLorentzType = "FormFactorLorentz";
+const std::string FFPrism3Type = "Prism3";
+const std::string FFPrism6Type = "Prism6";
+const std::string FFPyramidType = "Pyramid";
+const std::string FFRipple1Type = "Ripple1";
+const std::string FFRipple2Type = "Ripple2";
+const std::string FFLongRipple1GaussType = "LongRipple1Gauss";
+const std::string FFLongRipple1LorentzType = "LongRipple1Lorentz";
+const std::string FFLongRipple2GaussType = "LongRipple2Gauss";
+const std::string FFLongRipple2LorentzType = "LongRipple2Lorentz";
+const std::string FFTetrahedronType = "Tetrahedron";
+const std::string FFTruncatedCubeType = "TruncatedCube";
+const std::string FFTruncatedSphereType = "TruncatedSphere";
+const std::string FFTruncatedSpheroidType = "TruncatedSpheroid";
+
+const std::string FormFactorCrystalType = "FormFactorCrystal";
+const std::string FormFactorSphereGaussianRadiusType = "FormFactorSphereGaussianRadius";
+const std::string FormFactorSphereLogNormalRadiusType = "FormFactorSphereLogNormalRadius";
+const std::string FormFactorSphereUniformRadiusType = "FormFactorSphereUniformRadius";
+const std::string FormFactorTrivialType = "FormFactorTrivial";
+const std::string FormFactorDWBAType = "FormFactorDWBA";
+const std::string FormFactorPolarizedDWBAType = "FormFactorDWBAPol";
+
+const std::string FormFactorDecoratorFactorType = "FormFactorDecoratorFactor";
+const std::string FormFactorDecoratorPositionFactorType = "FormFactorDecoratorPositionFactor";
+const std::string FormFactorDecoratorRotationType = "FormFactorDecoratorRotation";
+const std::string FormFactorDecoratorDebyeWallerType = "FormFactorDecoratorDebyeWaller";
+const std::string FormFactorDecoratorMaterialType = "FormFactorDecoratorMaterial";
+const std::string FormFactorWeightedType = "FormFactorWeighted";
+
+const std::string XRotationType = "XRotation";
+const std::string YRotationType = "YRotation";
+const std::string ZRotationType = "ZRotation";
+const std::string EulerRotationType = "EulerRotation";
+
+const std::string DistributionNoneType = "DistributionNone";
+const std::string DistributionGateType = "DistributionGate";
+const std::string DistributionLorentzType = "DistributionLorentz";
+const std::string DistributionGaussianType = "DistributionGaussian";
+const std::string DistributionLogNormalType = "DistributionLogNormal";
+const std::string DistributionCosineType = "DistributionCosine";
+
+const std::string FTDistribution1DCauchyType = "FTDistribution1DCauchy";
+const std::string FTDistribution1DGaussType = "FTDistribution1DGauss";
+const std::string FTDistribution1DGateType = "FTDistribution1DGate";
+const std::string FTDistribution1DTriangleType = "FTDistribution1DTriangle";
+const std::string FTDistribution1DCosineType = "FTDistribution1DCosine";
+const std::string FTDistribution1DVoigtType = "FTDistribution1DVoigt";
+
+const std::string FTDistribution2DCauchyType = "FTDistribution2DCauchy";
+const std::string FTDistribution2DGaussType = "FTDistribution2DGauss";
+const std::string FTDistribution2DGateType = "FTDistribution2DGate";
+const std::string FTDistribution2DConeType = "FTDistribution2DCone";
+const std::string FTDistribution2DVoigtType = "FTDistribution2DVoigt";
+
+const std::string FTDecayFunction1DCauchyType = "FTDecayFunction1DCauchy";
+const std::string FTDecayFunction1DGaussType = "FTDecayFunction1DGauss";
+const std::string FTDecayFunction1DTriangleType = "FTDecayFunction1DTriangle";
+const std::string FTDecayFunction1DVoigtType = "FTDecayFunction1DVoigt";
+
+const std::string FTDecayFunction2DCauchyType = "FTDecayFunction2DCauchy";
+const std::string FTDecayFunction2DGaussType = "FTDecayFunction2DGauss";
+const std::string FTDecayFunction2DVoigtType = "FTDecayFunction2DVoigt";
+
+// Parameter names (dimensions, angles, ...)
+const std::string Abundance = "Abundance";
+const std::string PositionX = "PositionX";
+const std::string PositionY = "PositionY";
+const std::string PositionZ = "PositionZ";
+const std::string Radius = "Radius";
+const std::string RadiusX = "RadiusX";
+const std::string RadiusY = "RadiusY";
+const std::string MeanRadius = "MeanRadius";
+const std::string SigmaRadius = "SigmaRadius";
+const std::string FullWidth = "FullWidth";
+const std::string Edge = "Edge";
+const std::string BaseEdge = "BaseEdge";
+const std::string Length = "Length";
+const std::string RemovedLength = "RemovedLength";
+const std::string Width = "Width";
+const std::string Height = "Height";
+const std::string HeightRatio = "HeightRatio";
+const std::string HeightFlattening = "HeightFlattening";
+const std::string Intensity = "Intensity";
+const std::string Wavelength = "Wavelength";
+const std::string Angle = "Angle";
+const std::string Alpha = "Alpha";
+const std::string Beta = "Beta";
+const std::string Gamma = "Gamma";
+const std::string Delta = "Delta";
+const std::string Phi = "Phi";
+const std::string Xi = "Xi";
+const std::string Minimum = "Min";
+const std::string Maximum = "Max";
+const std::string Mean = "Mean";
+const std::string StdDeviation = "StdDev";
+const std::string HWHM = "HWHM";
+const std::string Median = "Median";
+const std::string ScaleParameter = "ScaleParameter";
+const std::string Sigma = "Sigma";
+const std::string Eta = "Eta";
+const std::string Omega = "Omega";
+const std::string DecayLength = "DecayLength";
+const std::string DecayLengthX = "DecayLengthX";
+const std::string DecayLengthY = "DecayLengthY";
+const std::string CoherenceLengthX = "CoherenceLengthX";
+const std::string CoherenceLengthY = "CoherenceLengthY";
+const std::string SigmaX = "SigmaX";
+const std::string SigmaY = "SigmaY";
+const std::string HeightDWFactor = "HeightDWFactor";
+const std::string RadiusDWFactor = "RadiusDWFactor";
+const std::string AsymmetryLength = "AsymmetryLength";
+const std::string LatticeLength = "LatticeLength";
+const std::string LatticeLength1 = "LatticeLength1";
+const std::string LatticeLength2 = "LatticeLength2";
+const std::string LatticeAngle = "Alpha";
+const std::string DampingLength = "DampingLength";
+const std::string DomainSize = "DomainSize";
+const std::string DomainSize1 = "DomainSize1";
+const std::string DomainSize2 = "DomainSize2";
+const std::string PeakDistance = "PeakDistance";
+const std::string SizeSpaceCoupling = "SizeSpaceCoupling";
+const std::string Thickness = "Thickness";
+const std::string Hurst = "Hurst";
+const std::string CorrelationLength = "CorrelationLength";
+const std::string CrossCorrelationLength = "CrossCorrelationLength";
+const std::string Inclination = "InclinationAngle";
+const std::string Azimuth = "AzimuthalAngle";
+}
+
+#endif // BORNAGAINNAMESPACE_H
diff --git a/Core/Basics/Complex.h b/Core/Basics/Complex.h
new file mode 100644
index 0000000..7f74601
--- /dev/null
+++ b/Core/Basics/Complex.h
@@ -0,0 +1,29 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/Complex.h
+//! @brief     Defines complex_t, and a few elementary functions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPLEX_H
+#define COMPLEX_H
+
+#include <complex>
+
+typedef std::complex<double> complex_t;
+
+//! Returns product I*z, where I is the imaginary unit.
+inline complex_t mul_I( complex_t z ) { return complex_t( -z.imag(), z.real() ); }
+
+//! Returns exp(I*z), where I is the imaginary unit.
+inline complex_t exp_I( complex_t z ) { return std::exp( complex_t( -z.imag(), z.real() ) ); }
+
+#endif // COMPLEX_H
diff --git a/Core/Basics/Exceptions.cpp b/Core/Basics/Exceptions.cpp
new file mode 100644
index 0000000..029efbc
--- /dev/null
+++ b/Core/Basics/Exceptions.cpp
@@ -0,0 +1,116 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/Exceptions.cpp
+//! @brief     Implements class Exceptions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Exceptions.h"
+#include <iostream>
+
+namespace Exceptions {
+
+void LogExceptionMessage(const std::string& message)
+{
+    std::cerr << message << std::endl;
+}
+
+NotImplementedException::NotImplementedException(const std::string& message)
+    : std::logic_error(message)
+{
+     LogExceptionMessage(message);
+}
+
+NullPointerException::NullPointerException(const std::string& message)
+    : std::logic_error(message)
+{
+     LogExceptionMessage(message);
+}
+
+OutOfBoundsException::OutOfBoundsException(const std::string& message)
+    : std::logic_error(message)
+{
+     LogExceptionMessage(message);
+}
+
+ClassInitializationException::ClassInitializationException(const std::string& message)
+    : std::runtime_error(message)
+{
+     LogExceptionMessage(message);
+}
+
+SelfReferenceException::SelfReferenceException(const std::string& message)
+    : std::logic_error(message)
+{
+     LogExceptionMessage(message);
+}
+
+DeadReferenceException::DeadReferenceException(const std::string& message)
+    : std::runtime_error(message)
+{
+     LogExceptionMessage(message);
+}
+
+UnknownClassRegistrationException::UnknownClassRegistrationException(const std::string& message)
+    : std::runtime_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+ExistingClassRegistrationException::ExistingClassRegistrationException(const std::string& message)
+    : std::runtime_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+LogicErrorException::LogicErrorException(const std::string& message)
+    : std::logic_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+RuntimeErrorException::RuntimeErrorException(const std::string& message)
+    : std::runtime_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+DivisionByZeroException::DivisionByZeroException(const std::string& message)
+    : std::runtime_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+DomainErrorException::DomainErrorException(const std::string& message)
+    : std::domain_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+FileNotIsOpenException::FileNotIsOpenException(const std::string& message)
+    : std::runtime_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+FileIsBadException::FileIsBadException(const std::string& message)
+    : std::runtime_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+FormatErrorException::FormatErrorException(const std::string& message)
+    : std::runtime_error(message)
+{
+    LogExceptionMessage(message);
+}
+
+} // namespace Exceptions
diff --git a/Core/Basics/Exceptions.h b/Core/Basics/Exceptions.h
new file mode 100644
index 0000000..307c8ef
--- /dev/null
+++ b/Core/Basics/Exceptions.h
@@ -0,0 +1,133 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/Exceptions.h
+//! @brief     Defines many exception classes in namespace Exceptions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef EXCEPTIONS_H
+#define EXCEPTIONS_H
+
+#include "WinDllMacros.h"
+#include <stdexcept>
+#include <string>
+
+#ifdef _WIN32
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4275)
+#endif
+#endif
+
+namespace Exceptions {
+
+class BA_CORE_API_ NotImplementedException : public std::logic_error
+{
+public:
+    NotImplementedException(const std::string& message);
+};
+
+class BA_CORE_API_ NullPointerException : public std::logic_error
+{
+public:
+    NullPointerException(const std::string& message);
+};
+
+class BA_CORE_API_ OutOfBoundsException : public std::logic_error
+{
+public:
+    OutOfBoundsException(const std::string& message);
+};
+
+class BA_CORE_API_ ClassInitializationException : public std::runtime_error
+{
+public:
+    ClassInitializationException(const std::string& message);
+};
+
+class BA_CORE_API_ SelfReferenceException : public std::logic_error
+{
+public:
+    SelfReferenceException(const std::string& message);
+};
+
+class BA_CORE_API_ DeadReferenceException : public std::runtime_error
+{
+public:
+    DeadReferenceException(const std::string& message);
+};
+
+class BA_CORE_API_ UnknownClassRegistrationException : public std::runtime_error
+{
+public:
+    UnknownClassRegistrationException(const std::string& message);
+};
+
+class BA_CORE_API_ ExistingClassRegistrationException : public std::runtime_error
+{
+public:
+    ExistingClassRegistrationException(const std::string& message);
+};
+
+class BA_CORE_API_ LogicErrorException : public std::logic_error
+{
+public:
+    LogicErrorException(const std::string& message);
+};
+
+class BA_CORE_API_ RuntimeErrorException : public std::runtime_error
+{
+public:
+    RuntimeErrorException(const std::string& message);
+};
+
+class BA_CORE_API_ DivisionByZeroException : public std::runtime_error
+{
+public:
+    DivisionByZeroException(const std::string& message);
+};
+
+class BA_CORE_API_ DomainErrorException : public std::domain_error
+{
+public:
+    DomainErrorException(const std::string& message);
+};
+
+class BA_CORE_API_ FileNotIsOpenException : public std::runtime_error
+{
+public:
+    FileNotIsOpenException(const std::string& message);
+};
+
+
+class BA_CORE_API_ FileIsBadException : public std::runtime_error
+{
+public:
+    FileIsBadException(const std::string& message);
+};
+
+class BA_CORE_API_ FormatErrorException : public std::runtime_error
+{
+public:
+    FormatErrorException(const std::string& message);
+};
+
+void LogExceptionMessage(const std::string& message);
+
+} // namespace Exceptions;
+
+#ifdef _WIN32
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#endif
+
+#endif // EXCEPTIONS_H
diff --git a/Core/Basics/ICloneable.h b/Core/Basics/ICloneable.h
new file mode 100644
index 0000000..615842a
--- /dev/null
+++ b/Core/Basics/ICloneable.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/ICloneable.h
+//! @brief     Defines the standard mix-in ICloneable.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ICLONEABLE_H
+#define ICLONEABLE_H
+
+#include "INoncopyable.h"
+#include "WinDllMacros.h"
+
+//! Mix-in for objects that must not be copied, except by cloning.
+//!
+//! The base class INoncopyable disables the copy constructor and the operator=
+//! in all its child classes.
+//! Child classes of ICloneable should provide clone().
+
+//! @ingroup tools_internal
+
+class BA_CORE_API_ ICloneable : public INoncopyable
+{
+public:
+    virtual ICloneable* clone() const=0;
+    virtual void transferToCPP() {} //!< Used for Python overriding of clone
+};
+
+#endif // ICLONEABLE_H
diff --git a/Core/Basics/INamed.h b/Core/Basics/INamed.h
new file mode 100644
index 0000000..5860d9e
--- /dev/null
+++ b/Core/Basics/INamed.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/INamed.h
+//! @brief     Defines and implements the standard mix-in INamed.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INAMED_H
+#define INAMED_H
+
+#include <string>
+#include "WinDllMacros.h"
+
+//! @class INamed
+//! @ingroup tools_internal
+//! @brief Interface for named objects.
+
+class BA_CORE_API_ INamed
+{
+public:
+    INamed() : m_name() {}
+    INamed(const std::string& name) : m_name(name) {}
+    virtual ~INamed() {}
+    std::string getName() const { return m_name; }
+protected:
+    void setName(const std::string& name) { m_name = name; }
+private:
+    std::string m_name;
+};
+
+#endif // INAMED_H
diff --git a/Core/Basics/INoncopyable.h b/Core/Basics/INoncopyable.h
new file mode 100644
index 0000000..b31d7a8
--- /dev/null
+++ b/Core/Basics/INoncopyable.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/INoncopyable.h
+//! @brief     Defines the standard mix-in INoncopyable.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INONCOPYABLE_H
+#define INONCOPYABLE_H
+
+#include "WinDllMacros.h"
+
+//! Mix-in for objects that must not be copied.
+//!
+//! This virtual base class disables the copy constructor and the operator=
+//! in all its child classes.
+
+//! @ingroup tools_internal
+
+class BA_CORE_API_ INoncopyable
+{
+public:
+    INoncopyable() {}
+    virtual ~INoncopyable() {}
+    INoncopyable(const INoncopyable&) = delete;
+    INoncopyable& operator=(const INoncopyable&) = delete;
+};
+
+#endif // INONCOPYABLE_H
diff --git a/Core/Basics/IShareable.h b/Core/Basics/IShareable.h
new file mode 100644
index 0000000..560ad55
--- /dev/null
+++ b/Core/Basics/IShareable.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/IShareable.h
+//! @brief     Defines the class ISharable (used for SWIG smart pointers)
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISHAREABLE_H
+#define ISHAREABLE_H
+
+//! @class IShareable
+//! @ingroup tools_internal
+//! @brief Dummy interface used to construct INamedShared and IParameterizedShared
+class BA_CORE_API_ IShareable
+{
+private:
+    //! Default constructor, made private since this class should never by instantiated
+    IShareable() {}
+};
+
+#endif // ISHAREABLE_H
+
+
diff --git a/Core/Basics/ISingleton.h b/Core/Basics/ISingleton.h
new file mode 100644
index 0000000..2fbc186
--- /dev/null
+++ b/Core/Basics/ISingleton.h
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/ISingleton.h
+//! @brief     Defines the standard mix-in ISingleton.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISINGLETON_H
+#define ISINGLETON_H
+
+#include <iostream>
+#include <mutex>
+#include <stdexcept>
+
+//! Base class for singletons.
+//! @ingroup tools_internal
+
+template <class T>
+class ISingleton
+{
+public:
+    static T& instance() {
+        static std::mutex single_mutex;
+        std::unique_lock<std::mutex> single_lock( single_mutex );
+        if( !m_instance) {
+            if( m_destroyed )
+                // In BornAgain, an ISingleton is deleted when and only when the application
+                // terminates. Therefore there is no point in re-creating a deleted ISingleton.
+                // To be 110% sure, we explicitly forbid re-creation.
+                throw std::runtime_error("Invalid attempt to re-create a deleted ISingleton");
+            static T theInstance;
+            m_instance = &theInstance;
+        }
+        return *m_instance; }
+
+protected:
+    ISingleton(){}
+    virtual ~ISingleton() {
+        m_instance = nullptr;
+        m_destroyed = true; }
+
+private:
+    ISingleton(const ISingleton&) = delete;
+    ISingleton& operator=(const ISingleton&) = delete;
+    static T* m_instance;
+    static bool m_destroyed; //!< to detect re-creation
+};
+
+// for templated classes, initializations go into the .h file:
+template<class T> T* ISingleton<T>::m_instance = nullptr;
+template<class T> bool ISingleton<T>::m_destroyed = false;
+
+#endif // ISINGLETON_H
diff --git a/Core/Basics/Macros.h b/Core/Basics/Macros.h
new file mode 100644
index 0000000..f69359c
--- /dev/null
+++ b/Core/Basics/Macros.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/Macros.h
+//! @brief     Workarounds concerning diagnostic warnings.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MACROS_H
+#define MACROS_H
+
+/*
+Macros below serve for temporary switching off specific warnings.
+It should be used to get rid from warnings coming from the third party library (like boost).
+
+Usage:
+GCC_DIAG_OFF(unused-parameter);
+GCC_DIAG_ON(unused-parameter);
+
+For the gcc 4.6 macros have same behavior as
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic pop
+
+Be aware, that macros has different behavior for gcc<4.2, 4.2<=gcc<4.6; gcc>=4.6
+See origin and explanations at
+http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html
+and then
+http://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Diagnostic-Pragmas.html
+*/
+
+#if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402
+    #define GCC_DIAG_STR(s) #s
+    #define GCC_DIAG_JOINSTR(x,y) GCC_DIAG_STR(x ## y)
+    # define GCC_DIAG_DO_PRAGMA(x) _Pragma (#x)
+    # define GCC_DIAG_PRAGMA(x) GCC_DIAG_DO_PRAGMA(GCC diagnostic x)
+    # if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406
+        #  define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(push) \
+            GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x))
+        #  define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(pop)
+    # else
+        #  define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x))
+        #  define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(warning GCC_DIAG_JOINSTR(-W,x))
+    # endif
+#else
+    # define GCC_DIAG_OFF(x)
+    # define GCC_DIAG_ON(x)
+#endif
+
+#endif // MACROS_H
+
+
diff --git a/Core/Basics/MathConstants.h b/Core/Basics/MathConstants.h
new file mode 100644
index 0000000..866d19e
--- /dev/null
+++ b/Core/Basics/MathConstants.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Basics/MathConstants.h
+//! @brief     Defines M_PI and some more mathematical constants.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATHCONSTANTS_H
+#define MATHCONSTANTS_H
+
+// undefine macros that may or may not be defined, depending on compiler settings
+#undef M_E
+#undef M_LOG2E
+#undef M_LOG10E
+#undef M_LN2
+#undef M_LN10
+#undef M_PI
+#undef M_PI_2
+#undef M_PI_4
+#undef M_1_PI
+#undef M_2_PI
+#undef M_2_SQRTPI
+#undef M_SQRT2
+#undef M_SQRT1_2
+
+// and define them using these potentially inactivated lines from math.h
+#define M_E            2.7182818284590452354   /* e */
+#define M_LOG2E        1.4426950408889634074   /* log_2 e */
+#define M_LOG10E       0.43429448190325182765  /* log_10 e */
+#define M_LN2          0.69314718055994530942  /* log_e 2 */
+#define M_LN10         2.30258509299404568402  /* log_e 10 */
+#define M_PI           3.14159265358979323846  /* pi */
+#define M_PI_2         1.57079632679489661923  /* pi/2 */
+#define M_PI_4         0.78539816339744830962  /* pi/4 */
+#define M_1_PI         0.31830988618379067154  /* 1/pi */
+#define M_2_PI         0.63661977236758134308  /* 2/pi */
+#define M_2_SQRTPI     1.12837916709551257390  /* 2/sqrt(pi) */
+#define M_SQRT2        1.41421356237309504880  /* sqrt(2) */
+#define M_SQRT1_2      0.70710678118654752440  /* 1/sqrt(2) */
+
+// additionally, we find convenient:
+#define M_TWOPI        6.28318530717958647693
+
+#endif // MATHCONSTANTS_H
diff --git a/Core/Binning/Bin.cpp b/Core/Binning/Bin.cpp
new file mode 100644
index 0000000..f7749ab
--- /dev/null
+++ b/Core/Binning/Bin.cpp
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/Bin.cpp
+//! @brief     Implements structs Bin1D, Bin1DCVector
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Bin.h"
+
+bool BinContains(const Bin1D &bin, double value)
+{
+    if (bin.getBinSize()==0.0) return false;
+    double coordinate = (value - bin.m_lower)/bin.getBinSize();
+    if (coordinate < 0.0) return false;
+    if (coordinate >= 1.0) return false;
+    return true;
+}
+
+//! creation on Bin1DKVector from alpha and phi bins
+Bin1DKVector::Bin1DKVector(double wavelength, const Bin1D& alpha_bin, const Bin1D& phi_bin)
+    : m_q_lower(), m_q_upper()
+{
+    m_q_lower = vecOfLambdaAlphaPhi(wavelength, alpha_bin.m_lower, phi_bin.m_lower);
+    m_q_upper = vecOfLambdaAlphaPhi(wavelength, alpha_bin.m_upper, phi_bin.m_upper);
+}
+
+//! creation on Bin1DCVector from alpha and phi bins
+Bin1DCVector::Bin1DCVector(double wavelength, const Bin1D& alpha_bin, const Bin1D& phi_bin)
+    : m_q_lower(), m_q_upper()
+{
+    m_q_lower = vecOfLambdaAlphaPhi(
+        wavelength, alpha_bin.m_lower, phi_bin.m_lower).complex();
+    m_q_upper = vecOfLambdaAlphaPhi(
+        wavelength, alpha_bin.m_upper, phi_bin.m_upper).complex();
+}
diff --git a/Core/Binning/Bin.h b/Core/Binning/Bin.h
new file mode 100644
index 0000000..6ead87c
--- /dev/null
+++ b/Core/Binning/Bin.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/Bin.h
+//! @brief     Defines structs Bin1D, Bin1DCVector
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BIN_H
+#define BIN_H
+
+#include "Vectors3D.h"
+
+struct BA_CORE_API_ Bin1D
+{
+    Bin1D() : m_lower(0), m_upper(0) {}
+    Bin1D(double lower, double upper) : m_lower(lower), m_upper(upper) {}
+    double m_lower;  //!< lower bound of the bin
+    double m_upper;  //!< upper bound of the bin
+    double getMidPoint() const { return (m_lower + m_upper)/2.0; }
+    double getBinSize() const { return m_upper - m_lower; }
+};
+
+//! Checks if value is contained in bin:
+//! value in [m_lower, m_upper)
+bool BinContains(const Bin1D& bin, double value);
+
+//! @class Bin1DKVector
+//! @ingroup tools_internal
+//! @brief An one-dimensional range of kvector_t's
+
+struct BA_CORE_API_ Bin1DKVector
+{
+    Bin1DKVector() : m_q_lower(), m_q_upper() {}
+    Bin1DKVector(const kvector_t lower, const kvector_t upper)
+        : m_q_lower(lower), m_q_upper(upper) {}
+    Bin1DKVector(double wavelength, const Bin1D& alpha_bin, const Bin1D& phi_bin);
+
+    kvector_t getMidPoint() const { return (m_q_lower + m_q_upper)/2.0; }
+    kvector_t getDelta() const { return m_q_upper - m_q_lower; }
+    kvector_t m_q_lower;  //!< lower bound of the bin
+    kvector_t m_q_upper;  //!< upper bound of the bin
+};
+
+//! @class Bin1DCVector
+//! @ingroup tools_internal
+//! @brief An one-dimensional range of cvector_t's
+
+class BA_CORE_API_ Bin1DCVector
+{
+public:
+    Bin1DCVector() : m_q_lower(), m_q_upper() {}
+    Bin1DCVector(const cvector_t lower, const cvector_t upper)
+        : m_q_lower(lower), m_q_upper(upper) {}
+    Bin1DCVector(double wavelength, const Bin1D& alpha_bin, const Bin1D& phi_bin);
+    cvector_t getMidPoint() const { return (m_q_lower + m_q_upper)/2.0; }
+    cvector_t getDelta() const { return m_q_upper - m_q_lower; }
+    cvector_t m_q_lower;  //!< lower bound of the bin
+    cvector_t m_q_upper;  //!< upper bound of the bin
+};
+
+#endif // BIN_H
diff --git a/Core/Binning/ConstKBinAxis.cpp b/Core/Binning/ConstKBinAxis.cpp
new file mode 100644
index 0000000..157a5ac
--- /dev/null
+++ b/Core/Binning/ConstKBinAxis.cpp
@@ -0,0 +1,97 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/ConstKBinAxis.cpp
+//! @brief     Implement class ConstKBinAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ConstKBinAxis.h"
+#include "Exceptions.h" // TODO mv to .cpp
+#include "Numeric.h"
+#include <iomanip>
+
+ConstKBinAxis::ConstKBinAxis(const std::string &name, size_t nbins)
+    : VariableBinAxis(name, nbins)
+    , m_start(0)
+    , m_end(0)
+{
+}
+
+ConstKBinAxis::ConstKBinAxis(const std::string &name, size_t nbins, double start, double end)
+    : VariableBinAxis(name, nbins)
+    , m_start(start)
+    , m_end(end)
+{
+    if(m_start >= m_end)
+        throw Exceptions::LogicErrorException(
+            "ConstKBinAxis::ConstKBinAxis() -> Error. start >= end is not allowed.");
+
+    double start_sin = std::sin(m_start);
+    double end_sin = std::sin(m_end);
+    double step = (end_sin-start_sin)/(m_nbins);
+
+    std::vector<double> bin_boundaries;
+    bin_boundaries.resize(m_nbins + 1, 0.0);
+    for(size_t i=0; i<bin_boundaries.size(); ++i) {
+        bin_boundaries[i] = std::asin(start_sin + step*i);
+    }
+    setBinBoundaries(bin_boundaries);
+}
+
+ConstKBinAxis* ConstKBinAxis::clone() const
+{
+    return new ConstKBinAxis(getName(), m_nbins, m_start, m_end);
+}
+
+ConstKBinAxis* ConstKBinAxis::createClippedAxis(double left, double right) const
+{
+    if(left >= right)
+        throw Exceptions::LogicErrorException(
+            "ConstKBinAxis::createClippedAxis() -> Error. 'left'' should be smaller than 'right'");
+
+    if(left < getMin()) left = getBin(0).getMidPoint();
+    if(right >= getMax()) right = getBin(size()-1).getMidPoint();
+
+    size_t nbin1 = findClosestIndex(left);
+    size_t nbin2 = findClosestIndex(right);
+
+    size_t new_nbins = nbin2-nbin1+1;
+    std::vector<double> new_boundaries;
+    std::vector<double> old_boundaries = getBinBoundaries();
+    for(size_t i=0; i<new_nbins+1; ++i) {
+        new_boundaries.push_back(old_boundaries[nbin1 + i]);
+    }
+
+    ConstKBinAxis* result = new ConstKBinAxis(getName(), new_nbins);
+    result->m_start = new_boundaries.front();
+    result->m_end = new_boundaries.back();
+    result->setBinBoundaries(new_boundaries);
+    return result;
+}
+
+bool ConstKBinAxis::equals(const IAxis& other) const
+{
+    if (!IAxis::equals(other)) return false;
+    if (const ConstKBinAxis* otherAxis = dynamic_cast<const ConstKBinAxis*>(&other)) {
+        if (size() != otherAxis->size()) return false;
+        if ( !Numeric::areAlmostEqual(m_start, otherAxis->m_start)) return false;
+        if ( !Numeric::areAlmostEqual(m_end, otherAxis->m_end)) return false;
+        return true;
+    }
+    return false;
+}
+
+void ConstKBinAxis::print(std::ostream& ostr) const
+{
+    ostr << "ConstKBinAxis(\"" << m_name << "\", " << size() << ", "
+         << std::setprecision(std::numeric_limits<double>::digits10+2)
+         << m_start << ", " << m_end << ")";
+}
diff --git a/Core/Binning/ConstKBinAxis.h b/Core/Binning/ConstKBinAxis.h
new file mode 100644
index 0000000..677635a
--- /dev/null
+++ b/Core/Binning/ConstKBinAxis.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/ConstKBinAxis.h
+//! @brief     Defines class ConstKBinAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CONSTKBINAXIS_H
+#define CONSTKBINAXIS_H
+
+#include "VariableBinAxis.h"
+
+//! @class ConstKBinAxis
+//! @ingroup tools
+//! @brief Axis with fixed bin size in sin(angle) space.
+
+class BA_CORE_API_ ConstKBinAxis : public VariableBinAxis
+{
+public:
+    //! @brief ConstKBinAxis constructor
+    //! @param name Axis name
+    //! @param nbins number of bins
+    //! @param start low edge of first bin
+    //! @param end upper edge of last bin
+    ConstKBinAxis(const std::string& name, size_t nbins, double start, double end);
+    virtual ~ConstKBinAxis() {}
+
+    ConstKBinAxis* clone() const;
+
+    ConstKBinAxis* createClippedAxis(double left, double right) const;
+
+protected:
+    ConstKBinAxis(const std::string& name, size_t nbins);
+
+    void print(std::ostream& ostr) const;
+    bool equals(const IAxis& other) const;
+
+    double m_start;
+    double m_end;
+};
+
+#endif // CONSTKBINAXIS_H
diff --git a/Core/Binning/CustomBinAxis.cpp b/Core/Binning/CustomBinAxis.cpp
new file mode 100644
index 0000000..1e2a750
--- /dev/null
+++ b/Core/Binning/CustomBinAxis.cpp
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/CustomBinAxis.cpp
+//! @brief     Implement class CustomBinAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "CustomBinAxis.h"
+#include "Exceptions.h" // TODO mv to .cpp
+#include "Numeric.h"
+#include <iomanip>
+#include <limits>
+
+CustomBinAxis::CustomBinAxis(const std::string &name, size_t nbins, double start, double end)
+    : VariableBinAxis(name, nbins)
+    , m_start(start)
+    , m_end(end)
+{
+    if(m_start >= m_end)
+        throw Exceptions::LogicErrorException("CustomBinAxis::CustomBinAxis() -> Error."
+                                              " start >= end is not allowed.");
+
+    double start_sin = std::sin(start);
+    double end_sin = std::sin(end);
+    double step = (end_sin - start_sin)/(m_nbins-1);  // m_nbins-1 is intentionally
+
+    m_bin_centers.resize(m_nbins, 0.0);
+    for(size_t i=0; i<m_bin_centers.size(); ++i) {
+        m_bin_centers[i] = std::asin(start_sin + i*step);
+    }
+
+    std::vector<double> bin_boundaries;
+    bin_boundaries.resize(m_nbins + 1, 0.0);
+    for(size_t i=0; i<bin_boundaries.size(); ++i) {
+        bin_boundaries[i] = std::asin(start_sin -step/2. + step*i);
+    }
+    setBinBoundaries(bin_boundaries);
+}
+
+
+CustomBinAxis *CustomBinAxis::clone() const
+{
+    return new CustomBinAxis(getName(), m_nbins, m_start, m_end);
+}
+
+Bin1D CustomBinAxis::getBin(size_t index) const
+{
+    if(index >= m_nbins)
+        throw Exceptions::OutOfBoundsException("CustomBinAxis::getBin() -> Error. Wrong index.");
+
+    Bin1D result(m_bin_centers[index], m_bin_centers[index]);
+    return result;
+}
+
+std::vector<double> CustomBinAxis::getBinCenters() const
+{
+    return m_bin_centers;
+}
+
+CustomBinAxis *CustomBinAxis::createClippedAxis(double /* left */, double /* right */) const
+{
+    throw Exceptions::NotImplementedException("VariableBinAxis::CustomBinAxis() -> Error."
+                                              " Not implemented.");
+}
+
+
+void CustomBinAxis::print(std::ostream &ostr) const
+{
+    ostr << "CustomBinAxis(\"" << m_name << "\", " << size() << ", "
+         << std::setprecision(std::numeric_limits<double>::digits10+2)
+         << m_start << ", " << m_end << ")";
+}
+
+
+bool CustomBinAxis::equals(const IAxis &other) const
+{
+    if (!IAxis::equals(other)) return false;
+    if (const CustomBinAxis *otherAxis = dynamic_cast<const CustomBinAxis *>(&other)) {
+        if (size() != otherAxis->size()) return false;
+        if ( !Numeric::areAlmostEqual(m_start, otherAxis->m_start)) return false;
+        if ( !Numeric::areAlmostEqual(m_end, otherAxis->m_end)) return false;
+        return true;
+    }
+    return false;
+}
diff --git a/Core/Binning/CustomBinAxis.h b/Core/Binning/CustomBinAxis.h
new file mode 100644
index 0000000..dc4b673
--- /dev/null
+++ b/Core/Binning/CustomBinAxis.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/CustomBinAxis.h
+//! @brief     Defines class CustomBinAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CUSTOMBINAXIS_H
+#define CUSTOMBINAXIS_H
+
+
+#include "VariableBinAxis.h"
+
+//! @class CustomBinAxis
+//! @ingroup tools
+//! @brief Axis with fixed bin size in sin(angle) space used for numerical
+//! comparison with IsGisaxs. The main feature of the axis is that it produces
+//! zero bin sizes.
+
+class BA_CORE_API_ CustomBinAxis : public VariableBinAxis
+{
+public:
+    //! @brief CustomBinAxis constructor
+    //! @param name Axis name
+    //! @param nbins number of bins
+    //! @param start center of first bin (IsGisaxs convention)
+    //! @param end center of last bin (IsGisaxs convention)
+    CustomBinAxis(const std::string &name, size_t nbins, double start, double end);
+    virtual ~CustomBinAxis() {}
+
+    CustomBinAxis *clone() const;
+
+    Bin1D getBin(size_t index) const;
+
+    std::vector<double > getBinCenters() const;
+
+    CustomBinAxis *createClippedAxis(double left, double right) const;
+
+protected:
+    void print(std::ostream& ostr) const;
+    bool equals(const IAxis& other) const;
+
+    double m_start;
+    double m_end;
+    std::vector<double> m_bin_centers;
+};
+
+
+#endif // CUSTOMBINAXIS_H
diff --git a/Core/Binning/FixedBinAxis.cpp b/Core/Binning/FixedBinAxis.cpp
new file mode 100644
index 0000000..f235831
--- /dev/null
+++ b/Core/Binning/FixedBinAxis.cpp
@@ -0,0 +1,118 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/FixedBinAxis.cpp
+//! @brief     Implement class FixedBinAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FixedBinAxis.h"
+#include "Exceptions.h" // TODO mv to .cpp
+#include "Numeric.h"
+#include <iomanip>
+#include <limits>
+
+FixedBinAxis::FixedBinAxis(const std::string &name, size_t nbins, double start, double end)
+    : IAxis(name), m_nbins(nbins), m_start(start), m_end(end)
+{
+}
+
+FixedBinAxis *FixedBinAxis::clone() const
+{
+    FixedBinAxis *result = new FixedBinAxis(getName(), m_nbins, m_start, m_end);
+    return result;
+}
+
+double FixedBinAxis::operator[](size_t index) const
+{
+    if(index >= m_nbins)
+        throw Exceptions::OutOfBoundsException("FixedBinAxis::operator[] -> Error. Wrong index.");
+
+    double step = (m_end - m_start)/m_nbins;
+    return m_start + (index + 0.5)*step;
+}
+
+Bin1D FixedBinAxis::getBin(size_t index) const
+{
+    if(index >= m_nbins)
+        throw Exceptions::OutOfBoundsException("FixedBinAxis::getBin() -> Error. Wrong index.");
+
+    double step = (m_end - m_start)/m_nbins;
+    Bin1D result( m_start + step*index, m_start + step*(index+1) );
+    return result;
+}
+
+size_t FixedBinAxis::findClosestIndex(double value) const
+{
+    if( value < getMin()) {
+        return 0;
+    } else if(value >= getMax()) {
+        return m_nbins-1;
+    }
+
+    double step = (m_end - m_start)/m_nbins;
+    return int( (value-m_start)/step);
+}
+
+std::vector<double> FixedBinAxis::getBinCenters() const
+{
+    std::vector<double> result;
+    result.resize(size(), 0.0);
+    for(size_t i=0; i<size(); ++i) {
+        result[i] = getBin(i).getMidPoint();
+    }
+    return result;
+}
+
+std::vector<double> FixedBinAxis::getBinBoundaries() const
+{
+    std::vector<double> result;
+    result.resize(size()+1, 0.0);
+    for(size_t i=0; i<size(); ++i) {
+        result[i] = getBin(i).m_lower;
+    }
+    result[size()] = getBin(size()-1).m_upper;
+    return result;
+}
+
+FixedBinAxis *FixedBinAxis::createClippedAxis(double left, double right) const
+{
+    if(left >= right)
+        throw Exceptions::LogicErrorException("FixedBinAxis::createClippedAxis() -> Error. "
+                                  "'left' should be smaller than 'right'");
+
+    if(left < getMin()) left = getBin(0).getMidPoint();
+    if(right >= getMax()) right = getBin(size()-1).getMidPoint();
+
+    size_t nbin1 = findClosestIndex(left);
+    size_t nbin2 = findClosestIndex(right);
+
+    return new FixedBinAxis(
+        getName(), nbin2-nbin1+1, getBin(nbin1).m_lower, getBin(nbin2).m_upper );
+}
+
+void FixedBinAxis::print(std::ostream& ostr) const
+{
+    ostr << "FixedBinAxis(\"" << m_name << "\", " << size() << ", "
+         << std::setprecision(std::numeric_limits<double>::digits10+2) << getMin() << ", "
+         << getMax() << ")";
+}
+
+bool FixedBinAxis::equals(const IAxis& other) const
+{
+    if (!IAxis::equals(other)) return false;
+    if (const FixedBinAxis *otherAxis = dynamic_cast<const FixedBinAxis *>(&other)) {
+        if (size() != otherAxis->size()) return false;
+        if ( !Numeric::areAlmostEqual(m_start, otherAxis->m_start)) return false;
+        if ( !Numeric::areAlmostEqual(m_end, otherAxis->m_end)) return false;
+        return true;
+    }
+    return false;
+}
diff --git a/Core/Binning/FixedBinAxis.h b/Core/Binning/FixedBinAxis.h
new file mode 100644
index 0000000..82e4652
--- /dev/null
+++ b/Core/Binning/FixedBinAxis.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/FixedBinAxis.h
+//! @brief     Defines class FixedBinAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FIXEDBINAXIS_H
+#define FIXEDBINAXIS_H
+
+
+#include "IAxis.h"
+
+//! @class FixedBinAxis
+//! @ingroup tools
+//! @brief Axis with fixed bin size.
+
+class BA_CORE_API_ FixedBinAxis : public IAxis
+{
+public:
+    //! @brief FixedBinAxis constructor
+    //! @param name Axis name
+    //! @param nbins number of bins
+    //! @param start low edge of first bin
+    //! @param end upper edge of last bin
+    FixedBinAxis(const std::string &name, size_t nbins, double start, double end);
+    virtual ~FixedBinAxis() {}
+
+    FixedBinAxis *clone() const;
+
+    size_t size() const { return m_nbins; }
+
+    double operator[](size_t index) const;
+
+    Bin1D getBin(size_t index) const;
+
+    double getMin() const { return m_start; }
+    double getMax() const { return m_end; }
+
+    double getBinCenter(size_t index) const { return (*this)[index]; }
+
+    size_t findClosestIndex(double value) const;
+
+    std::vector<double > getBinCenters() const;
+
+    std::vector<double > getBinBoundaries() const;
+
+    FixedBinAxis *createClippedAxis(double left, double right) const;
+
+protected:
+    void print(std::ostream& ostr) const;
+    virtual bool equals(const IAxis& other) const;
+
+private:
+    size_t m_nbins;
+    double m_start;
+    double m_end;
+};
+
+
+
+#endif // FIXEDBINAXIS_H
diff --git a/Core/Binning/IAxis.cpp b/Core/Binning/IAxis.cpp
new file mode 100644
index 0000000..ae2fec4
--- /dev/null
+++ b/Core/Binning/IAxis.cpp
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/IAxis.cpp
+//! @brief     Implements class IAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IAxis.h"
+#include "Exceptions.h"
+
+IAxis* IAxis::createDoubleBinSize() const
+{
+    throw Exceptions::NotImplementedException(
+                "IAxis::createDoubleBinSize() -> Error. Not implemented.");
+}
+
+size_t IAxis::findIndex(double value) const
+{
+    for (size_t index=0; index<size(); ++index) {
+        if (BinContains(getBin(index), value)) return index;
+    }
+    return size();
+}
+
+bool IAxis::equals(const IAxis& other) const
+{
+    return getName()==other.getName();
+}
+
+std::vector<double> IAxis::getBinCenters() const
+{
+    throw Exceptions::NotImplementedException("IAxis::getBinCenters() -> Error. Not implemented.");
+}
+
+std::vector<double> IAxis::getBinBoundaries() const
+{
+    throw Exceptions::NotImplementedException(
+        "IAxis::getBinBoundaries() -> Error. Not implemented.");
+}
+
+IAxis* IAxis::createClippedAxis(double /* left */, double /* right */) const
+{
+    throw Exceptions::NotImplementedException(
+        "IAxis::createClippedAxis() -> Error. Not implemented.");
+}
+
+bool IAxis::contains(double value) const
+{
+    return value >= getMin() && value < getMax();
+}
diff --git a/Core/Binning/IAxis.h b/Core/Binning/IAxis.h
new file mode 100644
index 0000000..f48545e
--- /dev/null
+++ b/Core/Binning/IAxis.h
@@ -0,0 +1,104 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/IAxis.h
+//! @brief     Defines class IAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IAXIS_H
+#define IAXIS_H
+
+#include "Bin.h"
+#include <vector>
+
+//! @class IAxis
+//! @ingroup tools_internal
+//! @brief Interface for one-dimensional axes
+
+class BA_CORE_API_ IAxis
+{
+public:
+    //! constructors
+    IAxis(const std::string& name) : m_name(name) {}
+
+    //! clone function
+    virtual IAxis* clone() const=0;
+
+    //! Creates a new axis with half the number of bins
+    virtual IAxis* createDoubleBinSize() const;
+
+    //! destructor
+    virtual ~IAxis() {}
+
+    //! retrieve the number of bins
+    virtual size_t size() const=0;
+
+    //! retrieve the label of the axis
+    std::string getName() const { return m_name; }
+
+    //! Sets the axis label
+    void setName(std::string name) { m_name = name; }
+
+    //! indexed accessor retrieves a sample
+    virtual double operator[](size_t index) const=0;
+
+    //! retrieve a 1d bin for the given index
+    virtual Bin1D getBin(size_t index) const=0;
+
+    //! Returns value of first point of axis
+    virtual double getMin() const=0;
+
+    //! Returns value of last point of axis
+    virtual double getMax() const=0;
+
+    virtual double getBinCenter(size_t index) const=0;
+
+    //! find bin index which is best match for given value
+    virtual size_t findClosestIndex(double value) const=0;
+
+    //! find index of bin that contains the given value
+    //! returns size() when value is not found
+    size_t findIndex(double value) const;
+
+    //! test for equality
+    bool operator==(const IAxis& right) const { return equals(right); }
+    bool operator!=(const IAxis& right) const { return !(*this==right); }
+
+    friend std::ostream& operator<<(std::ostream& ostr, const IAxis& m) {
+        m.print(ostr); return ostr; }
+
+    virtual std::vector<double> getBinCenters() const;
+
+    virtual std::vector<double> getBinBoundaries() const;
+
+    //! Creates a new clipped axis
+    virtual IAxis* createClippedAxis(double left, double right) const;
+
+    //! Returns true if axis contains given point
+    virtual bool contains(double value) const;
+
+protected:
+    virtual void print(std::ostream& ostr) const=0;
+    virtual bool equals(const IAxis& other) const; // overloaded in child classes
+    std::string m_name;  //!< axis label
+
+private:
+    IAxis(const IAxis&);
+    IAxis& operator=(const IAxis&);
+};
+
+//! global helper function for comparison of axes
+inline bool HaveSameNameAndShape(const IAxis& left, const IAxis& right)
+{
+    return left == right;
+}
+
+#endif // IAXIS_H
diff --git a/Core/Binning/IPixelMap.h b/Core/Binning/IPixelMap.h
new file mode 100644
index 0000000..7906be1
--- /dev/null
+++ b/Core/Binning/IPixelMap.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/IPixelMap.h
+//! @brief     Defines interface IPixelMap.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IPIXELMAP_H
+#define IPIXELMAP_H
+
+#include "Vectors3D.h"
+
+//! Interface for a function that maps [0,1]x[0,1] to the kvectors in a pixel.
+//! @ingroup simulation
+
+class IPixelMap
+{
+public:
+    virtual ~IPixelMap() {}
+
+    virtual IPixelMap* clone() const=0;
+    virtual IPixelMap* createZeroSizeMap(double x, double y) const=0;
+    virtual kvector_t getK(double x, double y, double wavelength) const=0;
+    virtual double getIntegrationFactor(double x, double y) const=0;
+    virtual double getSolidAngle() const=0;
+};
+
+#endif // IPIXELMAP_H
diff --git a/Core/Binning/SimulationElement.cpp b/Core/Binning/SimulationElement.cpp
new file mode 100644
index 0000000..a00c4dd
--- /dev/null
+++ b/Core/Binning/SimulationElement.cpp
@@ -0,0 +1,159 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/SimulationElement.cpp
+//! @brief     Implements class SimulationElement.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationElement.h"
+#include "IPixelMap.h"
+#include "MathConstants.h"
+#include <vector>
+
+SimulationElement::SimulationElement(double wavelength, double alpha_i, double phi_i,
+                                     std::unique_ptr<IPixelMap> pixelmap)
+    : m_wavelength(wavelength)
+    , m_alpha_i(alpha_i)
+    , m_phi_i(phi_i)
+    , m_intensity(0.0)
+    , mP_pixel_map(std::move(pixelmap))
+    , m_contains_specular(false)
+{
+    initPolarization();
+}
+
+SimulationElement::SimulationElement(const SimulationElement &other)
+    : m_wavelength(other.m_wavelength), m_alpha_i(other.m_alpha_i), m_phi_i(other.m_phi_i)
+    , m_intensity(other.m_intensity), m_contains_specular(other.m_contains_specular)
+{
+    mP_pixel_map.reset(other.mP_pixel_map->clone());
+    m_polarization = other.m_polarization;
+    m_analyzer_operator = other.m_analyzer_operator;
+}
+
+SimulationElement::SimulationElement(SimulationElement &&other) noexcept
+    : m_wavelength(other.m_wavelength)
+    , m_alpha_i(other.m_alpha_i)
+    , m_phi_i(other.m_phi_i)
+    , m_intensity(other.m_intensity)
+    , m_polarization(std::move(other.m_polarization))
+    , m_analyzer_operator(std::move(other.m_analyzer_operator))
+    , mP_pixel_map(std::move(other.mP_pixel_map))
+    , m_contains_specular(other.m_contains_specular)
+{
+
+}
+
+
+SimulationElement::~SimulationElement() {}
+
+SimulationElement& SimulationElement::operator=(const SimulationElement &other)
+{
+    if (this != &other) {
+        SimulationElement tmp(other);
+        tmp.swapContent(*this);
+    }
+    return *this;
+}
+
+SimulationElement::SimulationElement(const SimulationElement &other, double x, double y)
+    : m_wavelength(other.m_wavelength), m_alpha_i(other.m_alpha_i), m_phi_i(other.m_phi_i)
+    , m_intensity(other.m_intensity), m_contains_specular(other.m_contains_specular)
+{
+    mP_pixel_map.reset(other.mP_pixel_map->createZeroSizeMap(x, y));
+    m_polarization = other.m_polarization;
+    m_analyzer_operator = other.m_analyzer_operator;
+}
+
+kvector_t SimulationElement::getKI() const
+{
+    return vecOfLambdaAlphaPhi(m_wavelength, m_alpha_i, m_phi_i);
+}
+
+kvector_t SimulationElement::getMeanKF() const
+{
+    return mP_pixel_map->getK(0.5, 0.5, m_wavelength);
+}
+
+kvector_t SimulationElement::getMeanQ() const
+{
+    return getKI() - getMeanKF();
+}
+
+kvector_t SimulationElement::getQ(double x, double y) const
+{
+    return getKI() - mP_pixel_map->getK(x, y, m_wavelength);
+}
+
+void SimulationElement::swapContent(SimulationElement &other)
+{
+    std::swap(m_wavelength, other.m_wavelength);
+    std::swap(m_alpha_i, other.m_alpha_i);
+    std::swap(m_phi_i, other.m_phi_i);
+    std::swap(m_intensity, other.m_intensity);
+    std::swap(m_polarization, other.m_polarization);
+    std::swap(m_analyzer_operator, other.m_analyzer_operator);
+    std::swap(mP_pixel_map, other.mP_pixel_map);
+    std::swap(m_contains_specular, other.m_contains_specular);
+}
+
+void SimulationElement::initPolarization()
+{
+    m_polarization = Eigen::Matrix2cd::Identity();
+    m_analyzer_operator = Eigen::Matrix2cd::Identity();
+}
+
+double SimulationElement::getAlpha(double x, double y) const
+{
+    return M_PI_2 - getK(x,y).theta();
+}
+
+double SimulationElement::getPhi(double x, double y) const
+{
+    return getK(x,y).phi();
+}
+
+bool SimulationElement::containsSpecularWavevector() const
+{
+    return m_contains_specular;
+}
+
+void SimulationElement::setSpecular(bool contains_specular)
+{
+    m_contains_specular = contains_specular;
+}
+
+kvector_t SimulationElement::getK(double x, double y) const {
+    return mP_pixel_map->getK(x, y, m_wavelength);
+}
+
+double SimulationElement::getIntegrationFactor(double x, double y) const {
+    return mP_pixel_map->getIntegrationFactor(x, y);
+}
+
+double SimulationElement::getSolidAngle() const {
+    return mP_pixel_map->getSolidAngle();
+}
+
+void addElementsWithWeight(std::vector<SimulationElement>::const_iterator first,
+                           std::vector<SimulationElement>::const_iterator last,
+                           std::vector<SimulationElement>::iterator result, double weight)
+{
+    for (std::vector<SimulationElement>::const_iterator it = first; it != last; ++it, ++result)
+        result->addIntensity(it->getIntensity() * weight);
+}
+
+void setAllElementIntensities(std::vector<SimulationElement>::iterator first,
+                              std::vector<SimulationElement>::iterator last, double intensity)
+{
+    for (std::vector<SimulationElement>::iterator it = first; it != last; ++it)
+        it->setIntensity(intensity);
+}
diff --git a/Core/Binning/SimulationElement.h b/Core/Binning/SimulationElement.h
new file mode 100644
index 0000000..1bda15a
--- /dev/null
+++ b/Core/Binning/SimulationElement.h
@@ -0,0 +1,118 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/SimulationElement.h
+//! @brief     Defines class SimulationElement.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONELEMENT_H
+#define SIMULATIONELEMENT_H
+
+#include "Complex.h"
+#include "EigenCore.h"
+#include "Vectors3D.h"
+#include "IPixelMap.h"
+#include <memory>
+#include <vector>
+
+class IPixelMap;
+
+//! Data stucture containing both input and output of a single detector cell.
+//! @ingroup simulation
+
+class BA_CORE_API_ SimulationElement
+{
+public:
+    SimulationElement(double wavelength, double alpha_i, double phi_i,
+                      std::unique_ptr<IPixelMap> pixelmap);
+    SimulationElement(const SimulationElement &other);
+    SimulationElement &operator=(const SimulationElement &other);
+
+    //! Construct SimulationElement from other element and restrict k_f to specific value in
+    //! the original detector pixel
+    SimulationElement(const SimulationElement &other, double x, double y);
+
+    SimulationElement(SimulationElement &&other) noexcept;
+
+    ~SimulationElement();
+
+#ifndef SWIG
+    //! Sets the polarization density matrix (in spin basis along z-axis)
+    void setPolarization(const Eigen::Matrix2cd& polarization) { m_polarization = polarization; }
+
+    //! Gets the polarization density matrix (in spin basis along z-axis)
+    Eigen::Matrix2cd getPolarization() const { return m_polarization; }
+
+    //! Sets the polarization analyzer operator (in spin basis along z-axis)
+    void setAnalyzerOperator(const Eigen::Matrix2cd& polarization_operator) {
+        m_analyzer_operator = polarization_operator; }
+
+    //! Gets the polarization analyzer operator (in spin basis along z-axis)
+    Eigen::Matrix2cd getAnalyzerOperator() const { return m_analyzer_operator; }
+#endif
+
+    double getWavelength() const { return m_wavelength; }
+    double getAlphaI() const { return m_alpha_i; }
+    double getPhiI() const { return m_phi_i; }
+    double getAlphaMean() const { return getAlpha(0.5, 0.5); }
+    double getPhiMean() const { return getPhi(0.5, 0.5); }
+    void setIntensity(double intensity) { m_intensity = intensity; }
+    void addIntensity(double intensity) { m_intensity += intensity; }
+    double getIntensity() const { return m_intensity; }
+    kvector_t getKI() const;
+    kvector_t getMeanKF() const;
+    kvector_t getMeanQ() const;
+    kvector_t getQ(double x, double y) const;
+
+    kvector_t getK(double x, double y) const;
+
+    double getIntegrationFactor(double x, double y) const;
+
+    double getSolidAngle() const;
+
+    double getAlpha(double x, double y) const;
+    double getPhi(double x, double y) const;
+
+    //! check if element contains given wavevector
+    bool containsSpecularWavevector() const;
+
+    //! indicate that this element contains the specular wavevector
+    void setSpecular(bool contains_specular);
+
+private:
+    //! swap function
+    void swapContent(SimulationElement &other);
+
+    //! initialize polarization matrices
+    void initPolarization();
+
+    double m_wavelength, m_alpha_i, m_phi_i;             //!< wavelength and angles of beam
+    double m_intensity;  //!< simulated intensity for detector cell
+#ifndef SWIG
+    Eigen::Matrix2cd m_polarization;      //!< polarization density matrix
+    Eigen::Matrix2cd m_analyzer_operator; //!< polarization analyzer operator
+#endif
+    std::unique_ptr<IPixelMap> mP_pixel_map;
+    bool m_contains_specular;
+};
+
+
+//! Add element vector to element vector with weight
+void addElementsWithWeight(std::vector<SimulationElement>::const_iterator first,
+                           std::vector<SimulationElement>::const_iterator last,
+                           std::vector<SimulationElement>::iterator result,
+                           double weight);
+
+//! Set all element intensities to given value
+void setAllElementIntensities(std::vector<SimulationElement>::iterator first,
+                              std::vector<SimulationElement>::iterator last, double intensity);
+
+#endif // SIMULATIONELEMENT_H
diff --git a/Core/Binning/VariableBinAxis.cpp b/Core/Binning/VariableBinAxis.cpp
new file mode 100644
index 0000000..de5442a
--- /dev/null
+++ b/Core/Binning/VariableBinAxis.cpp
@@ -0,0 +1,182 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/VariableBinAxis.cpp
+//! @brief     Implements VariableBinAxis class.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Exceptions.h" // TODO mv to .cpp
+#include "VariableBinAxis.h"
+#include "Numeric.h"
+#include <algorithm>
+#include <iomanip>
+
+VariableBinAxis::VariableBinAxis(
+    const std::string &name, size_t nbins, const std::vector<double> &bin_boundaries)
+    : IAxis(name)
+    , m_nbins(nbins)
+{
+    if(m_nbins != bin_boundaries.size()-1)
+        throw Exceptions::LogicErrorException("VariableBinAxis::VariableBinAxis() -> Error! "
+            "The size of bin_boundaries should be of size [nbins+1].");
+
+    setBinBoundaries(bin_boundaries);
+}
+
+
+VariableBinAxis::VariableBinAxis(const std::string &name, int nbins)
+    : IAxis(name)
+    , m_nbins(nbins)
+{
+}
+
+
+VariableBinAxis* VariableBinAxis::clone() const
+{
+    VariableBinAxis* result = new VariableBinAxis(getName(), m_nbins, m_bin_boundaries);
+    return result;
+}
+
+
+double VariableBinAxis::operator[](size_t index) const
+{
+    return getBin(index).getMidPoint();
+}
+
+
+Bin1D VariableBinAxis::getBin(size_t index) const
+{
+    if(index >= m_nbins)
+        throw Exceptions::OutOfBoundsException("VariableBinAxis::getBin() -> Error. Wrong index.");
+
+    Bin1D result(m_bin_boundaries[index], m_bin_boundaries[index+1]);
+    return result;
+}
+
+
+double VariableBinAxis::getMin() const
+{
+    return m_bin_boundaries.front();
+}
+
+
+double VariableBinAxis::getMax() const
+{
+    return m_bin_boundaries.back();
+}
+
+double VariableBinAxis::getBinCenter(size_t index) const
+{
+    return getBin(index).getMidPoint();
+}
+
+
+size_t VariableBinAxis::findClosestIndex(double value) const
+{
+    if(m_bin_boundaries.size()<2)
+        throw Exceptions::ClassInitializationException(
+            "VariableBinAxis::findClosestIndex() -> Error! "
+            "VariableBinAxis not  correctly initialized" );
+    if( value < getMin()) {
+        return 0;
+    } else if(value >= getMax()) {
+        return m_nbins-1;
+    }
+
+    std::vector<double>::const_iterator top_limit =
+        std::lower_bound(m_bin_boundaries.begin(), m_bin_boundaries.end(), value);
+    if( *top_limit != value ) --top_limit;
+    size_t nbin = top_limit - m_bin_boundaries.begin();
+    return nbin;
+}
+
+std::vector<double> VariableBinAxis::getBinCenters() const
+{
+    std::vector<double> result;
+    result.resize(size(), 0.0);
+    for(size_t i=0; i<size(); ++i) {
+        result[i] = getBin(i).getMidPoint();
+    }
+    return result;
+}
+
+VariableBinAxis* VariableBinAxis::createClippedAxis(double left, double right) const
+{
+
+    if(left >= right)
+        throw Exceptions::LogicErrorException("VariableBinAxis::createClippedAxis() -> Error. "
+                                  "'left'' should be smaller than 'right'" );
+
+    if(left < getMin()) left = getBin(0).getMidPoint();
+    if(right >= getMax()) right = getBin(size()-1).getMidPoint();
+
+    size_t nbin1 = findClosestIndex(left);
+    size_t nbin2 = findClosestIndex(right);
+
+    size_t new_nbins = nbin2-nbin1+1;
+    std::vector<double> new_boundaries;
+    for(size_t i=0; i<new_nbins+1; ++i) {
+        new_boundaries.push_back(m_bin_boundaries[nbin1 + i]);
+    }
+
+    return new VariableBinAxis(getName(), new_nbins, new_boundaries);
+}
+
+
+void VariableBinAxis::print(std::ostream& ostr) const
+{
+    ostr << "VariableBinAxis(\"" << m_name << "\", " << size() << ", [";
+    for(size_t i=0; i<m_bin_boundaries.size(); ++i) {
+        ostr << std::setprecision(std::numeric_limits<double>::digits10+2) << m_bin_boundaries[i];
+        if(i!=m_bin_boundaries.size()-1) ostr << ", ";
+    }
+    ostr << "])";
+}
+
+
+bool VariableBinAxis::equals(const IAxis& other) const
+{
+    if (!IAxis::equals(other)) return false;
+    if (const VariableBinAxis* p_other_cast = dynamic_cast<const VariableBinAxis*>(&other)) {
+        if (size() != p_other_cast->size()) return false;
+        for(size_t i=0; i<m_bin_boundaries.size(); ++i) {
+            if( !Numeric::areAlmostEqual(m_bin_boundaries[i], p_other_cast->m_bin_boundaries[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+    return false;
+}
+
+
+void VariableBinAxis::setBinBoundaries(const std::vector<double>& bin_boundaries)
+{
+    // checking that values are sorted
+    std::vector<double> vec_sorted = bin_boundaries;
+    std::sort( vec_sorted.begin(), vec_sorted.end());
+    for(size_t i=0; i<bin_boundaries.size(); ++i) {
+        if(vec_sorted[i] != bin_boundaries[i])
+            throw Exceptions::LogicErrorException(
+                "VariableBinAxis::VariableBinAxis() -> Error. "
+                "Array with bin edges is not sorted." );
+    }
+
+    std::vector<double> vec = bin_boundaries;
+    vec.erase(std::unique(vec.begin(), vec.end()),vec.end());
+
+    if(vec.size() != bin_boundaries.size())
+       throw Exceptions::LogicErrorException(
+           "VariableBinAxis::VariableBinAxis() -> Error. "
+           "Array with bin edges contains repeating values." );
+
+    m_bin_boundaries = bin_boundaries;
+}
diff --git a/Core/Binning/VariableBinAxis.h b/Core/Binning/VariableBinAxis.h
new file mode 100644
index 0000000..36116c1
--- /dev/null
+++ b/Core/Binning/VariableBinAxis.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Binning/VariableBinAxis.h
+//! @brief     Defines class VariableBinAxis.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef VARIABLEBINAXIS_H
+#define VARIABLEBINAXIS_H
+
+#include "IAxis.h"
+
+//! @class VariableBinAxis
+//! @ingroup tools
+//! @brief Axis with variable bin size.
+
+class BA_CORE_API_ VariableBinAxis : public IAxis
+{
+public:
+    //! @brief VariableBinAxis constructor
+    //! @param name Axis name
+    //! @param nbins number of bins
+    //! @param bin_boundaries Array of size nbins+1 containing low-edges for each
+    //! bin and upper edge of last bin.
+    VariableBinAxis(const std::string& name, size_t nbins,
+                    const std::vector<double>& bin_boundaries);
+    virtual ~VariableBinAxis() {}
+
+    VariableBinAxis* clone() const;
+
+    size_t size() const { return m_nbins; }
+
+    double operator[](size_t index) const;
+
+    Bin1D getBin(size_t index) const;
+
+    double getMin() const;
+    double getMax() const;
+
+    double getBinCenter(size_t index) const;
+
+    size_t findClosestIndex(double value) const;
+
+    std::vector<double> getBinCenters() const;
+    std::vector<double> getBinBoundaries() const { return m_bin_boundaries; }
+
+    VariableBinAxis* createClippedAxis(double left, double right) const;
+
+protected:
+    VariableBinAxis(const std::string& name, int nbins = 0);
+    void setBinBoundaries(const std::vector<double> &bin_boundaries);
+
+    void print(std::ostream& ostr) const;
+    virtual bool equals(const IAxis& other) const;
+    size_t m_nbins;
+
+private:
+    std::vector<double> m_bin_boundaries;  //!< vector containing the bin limits
+};
+
+
+#endif // VARIABLEBINAXIS_H
diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt
new file mode 100644
index 0000000..b0d0373
--- /dev/null
+++ b/Core/CMakeLists.txt
@@ -0,0 +1,259 @@
+############################################################################
+# CMakeLists.txt file for building libBornAgainCore library
+############################################################################
+
+set(library_name BornAgainCore)
+
+if(POLICY CMP0042)
+    cmake_policy(SET CMP0042 NEW)
+endif()
+
+# --- source and include files ---------
+include(GlobDirectories)
+GLOB_DIRECTORIES(CORE_SUBDIRS)
+
+set(CORE_SOURCE_DIRS "")
+foreach(subdir ${CORE_SUBDIRS})
+    list(APPEND CORE_SOURCE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/${subdir}")
+endforeach()
+
+# export for use in functional tests:
+set(CORE_SOURCE_DIRS ${CORE_SOURCE_DIRS} ${EIGEN3_INCLUDE_DIR} PARENT_SCOPE)
+
+set(include_dirs
+    ${BUILD_INC_DIR}
+    ${CMAKE_SOURCE_DIR}/Wrap
+    ${CORE_SOURCE_DIRS}
+    ${BornAgainFit_INCLUDE_DIRS}
+    )
+
+include_directories(${include_dirs})
+
+file(GLOB source_files "*/*.cpp")
+file(GLOB include_files "*/*.h")
+
+if(BORNAGAIN_PYTHON)
+
+    set(WRAP_DIR ${CMAKE_SOURCE_DIR}/Wrap)
+    set(AUTO_DIR ${CMAKE_SOURCE_DIR}/auto/Wrap)
+    file(MAKE_DIRECTORY ${AUTO_DIR})
+    include_directories(${AUTO_DIR})
+
+    if(BORNAGAIN_GENERATE_BINDINGS)
+
+        set(TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/Wrap)
+        file(MAKE_DIRECTORY ${TMP_DIR})
+
+        GeneratePythonDocs(${AUTO_DIR}/doxygen_core.i ${WRAP_DIR}/swig)
+
+        set(swig_dependencies
+            ${WRAP_DIR}/swig/libBornAgainCore.i
+            ${WRAP_DIR}/swig/directors.i
+            ${WRAP_DIR}/swig/extendCore.i
+            ${WRAP_DIR}/swig/ignores.i
+            ${WRAP_DIR}/swig/shared_pointers.i
+            ${WRAP_DIR}/swig/warnings.i
+            )
+        foreach(FNAM ${swig_dependencies})
+            if(NOT EXISTS ${FNAM})
+                message(FATAL_ERROR "Could NOT find SWIG input ${FNAM}")
+            endif()
+        endforeach()
+        set(swig_dependencies ${swig_dependencies} ${AUTO_DIR}/doxygen_core.i)
+
+        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/libBornAgainCore_wrap.cpp;-outdir;${TMP_DIR}")
+        foreach(dir ${include_dirs})
+            list(APPEND SWIG_FLAGS "-I${dir}")
+        endforeach(dir)
+
+        add_custom_command (
+            OUTPUT ${AUTO_DIR}/libBornAgainCore.py
+            COMMAND ${PYTHON_EXECUTABLE} ${WRAP_DIR}/swig/tweaks.py
+                   ${TMP_DIR}/libBornAgainCore.py
+                   ${AUTO_DIR}/libBornAgainCore.py
+            DEPENDS ${TMP_DIR}/libBornAgainCore.py
+            )
+        add_custom_command (
+            OUTPUT ${TMP_DIR}/libBornAgainCore.py
+                   ${AUTO_DIR}/libBornAgainCore_wrap.h
+                   ${AUTO_DIR}/libBornAgainCore_wrap.cpp
+            COMMAND ${SWIG_EXECUTABLE} ${SWIG_FLAGS} ${WRAP_DIR}/swig/libBornAgainCore.i
+            DEPENDS ${swig_dependencies} ${include_files}
+            )
+
+    endif(BORNAGAIN_GENERATE_BINDINGS)
+
+    add_custom_target (
+        ${library_name}_python
+        COMMAND ${CMAKE_COMMAND} -E copy
+            ${AUTO_DIR}/libBornAgainCore.py ${CMAKE_BINARY_DIR}/lib/libBornAgainCore.py
+        DEPENDS ${AUTO_DIR}/libBornAgainCore.py
+        )
+
+    list(APPEND source_files "${AUTO_DIR}/libBornAgainCore_wrap.cpp")
+
+    configure_file(${WRAP_DIR}/python/plot_utils.py
+                   ${CMAKE_BINARY_DIR}/lib/bornagain/plot_utils.py COPYONLY)
+
+    set(BA_MODULES_IMPORT_PATH "..")
+    if(BORNAGAIN_APPLE_BUNDLE)
+        set(BA_MODULES_IMPORT_PATH
+            lib/BornAgain-${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR})
+    endif()
+    configure_file("${WRAP_DIR}/python/__init__.py.in"
+                   "${CMAKE_BINARY_DIR}/lib/bornagain/__init__.py" @ONLY)
+endif()
+
+
+if(WIN32)
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBA_CORE_BUILD_DLL")
+endif()
+
+
+# --- making library ---------
+add_library(${library_name} SHARED ${include_files} ${source_files})
+
+set_Target_properties(${library_name} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
+set(${library_name}_LIBRARY_TYPE SHARED)
+
+
+if(BORNAGAIN_PYTHON)
+    add_dependencies(${library_name} ${library_name}_python)
+endif()
+
+# exposing library name and list of include directories outside
+set(${library_name}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+
+
+# --- external dependencies ---------
+
+target_link_libraries(${library_name} ${BornAgainFit_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
+
+if(BORNAGAIN_TIFF_SUPPORT)
+    add_definitions(-DBORNAGAIN_TIFF_SUPPORT)
+    include_directories(${TIFF_INCLUDE_DIR})
+    target_link_libraries(${library_name} ${TIFF_LIBRARIES})
+endif()
+
+include_directories(${EIGEN3_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${FFTW_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR} ${Faddeeva_INCLUDE_DIR})
+target_link_libraries(${library_name} ${Boost_LIBRARIES} ${FFTW_LIBRARY} ${GSL_LIBRARIES}
+    ${Faddeeva_LIBRARY})
+
+if(BORNAGAIN_OPENMPI)
+    add_definitions(-DBORNAGAIN_OPENMPI)
+    include_directories(${MPI_INCLUDE_PATH})
+    target_link_libraries(${library_name} ${MPI_LIBRARIES})
+endif()
+
+if(BORNAGAIN_PYTHON)
+    add_definitions(-DBORNAGAIN_PYTHON)
+    include_directories(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR})
+    target_link_libraries(${library_name} ${PYTHON_LIBRARIES})
+endif()
+
+if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
+    set(link_flags "-Wl,-rpath, at loader_path/../../Frameworks")
+    set_target_properties(${library_name}
+        PROPERTIES
+        LINK_FLAGS ${link_flags}
+        )
+endif()
+
+
+# --- installation ---------
+
+install (DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/ DESTINATION ${destination_examples} COMPONENT Examples FILES_MATCHING PATTERN "*.py" )
+install (DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/ DESTINATION ${destination_examples} COMPONENT Examples FILES_MATCHING PATTERN "README")
+install (DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/ DESTINATION ${destination_examples} COMPONENT Examples FILES_MATCHING PATTERN "*.gz")
+install (DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/ DESTINATION ${destination_examples} COMPONENT Examples FILES_MATCHING PATTERN "*.png")
+install (DIRECTORY ${CMAKE_SOURCE_DIR}/Examples/cpp DESTINATION ${destination_examples} COMPONENT Examples)
+install (TARGETS ${library_name} DESTINATION ${destination_lib} COMPONENT Libraries)
+install (FILES ${CMAKE_BINARY_DIR}/lib/lib${library_name}.py DESTINATION ${destination_lib} COMPONENT Libraries) # required by swig
+install (FILES ${include_files} DESTINATION ${destination_include} COMPONENT Headers)
+install (FILES ${CMAKE_SOURCE_DIR}/Wrap/WinDllMacros.h DESTINATION ${destination_include} COMPONENT Headers)
+
+if(WIN32)
+    # python in windows required .pyd extention for the library name
+    if(BORNAGAIN_PYTHON)
+        ADD_CUSTOM_COMMAND(
+            TARGET ${library_name}
+            POST_BUILD
+            COMMAND ${CMAKE_COMMAND} -E copy
+            ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
+            ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}".pyd"
+            )
+        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}.pyd DESTINATION ${destination_lib} COMPONENT Libraries)
+        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}.pyd DESTINATION ${destination_bin} COMPONENT Libraries)
+        # for functional tests
+        # install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}.dll DESTINATION ${destination_lib} COMPONENT Libraries)
+        ADD_CUSTOM_COMMAND(
+            TARGET ${library_name}
+            POST_BUILD
+            COMMAND ${CMAKE_COMMAND} -E copy
+            ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
+            ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}${libsuffix}
+            )
+
+    endif()
+
+    # system libraries
+    FOREACH(Boost_lib ${Boost_LIBRARIES})
+        get_filename_component(UTF_BASE_NAME ${Boost_lib} NAME_WE)
+        get_filename_component(UTF_PATH ${Boost_lib} PATH)
+        message(STATUS "Boost dll: ${UTF_PATH}/${UTF_BASE_NAME}.dll")
+        install(FILES ${UTF_PATH}/${UTF_BASE_NAME}.dll
+            DESTINATION ${destination_lib} COMPONENT Libraries)
+    ENDFOREACH()
+
+    get_filename_component(UTF_BASE_NAME ${PYTHON_LIBRARIES} NAME_WE)
+    get_filename_component(UTF_PATH ${PYTHON_EXECUTABLE} PATH)
+    message(STATUS "Python dll: ${UTF_PATH}/${UTF_BASE_NAME}.dll")
+    install(FILES ${UTF_PATH}/${UTF_BASE_NAME}.dll
+        DESTINATION ${destination_lib} COMPONENT Libraries)
+
+    install(FILES
+        ${CMAKE_LIBRARY_PATH}/libfftw3-3.dll
+        ${CMAKE_LIBRARY_PATH}/libtiff.dll
+        DESTINATION ${destination_lib} COMPONENT Libraries)
+
+else()
+    # Install thisbornagain.sh.
+    install(FILES
+                ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.sh
+                ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.csh
+        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
+        GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ
+        DESTINATION ${destination_libexec})
+
+    if(NOT BORNAGAIN_APPLE_BUNDLE AND NOT BUILD_DEBIAN)
+        # Create bin directory for links.
+        install(CODE "
+            FILE(MAKE_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
+            "
+            COMPONENT Runtime)
+        # Make links.
+        install(CODE "
+        execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink
+        \"../${destination_libexec}/thisbornagain.sh\" \"thisbornagain.sh\"
+        WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
+        " COMPONENT Runtime)
+        install(CODE "
+        execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink
+        \"../${destination_libexec}/thisbornagain.csh\" \"thisbornagain.csh\"
+        WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
+        " COMPONENT Runtime)
+    else()
+
+        install(FILES ${WRAP_DIR}/python/bornagain_python_install.py
+            DESTINATION ${destination_libexec})
+    endif()
+
+endif()
+
+# Install bornagain/__init__.py and utilites
+install(FILES "${CMAKE_BINARY_DIR}/lib/bornagain/__init__.py"
+        DESTINATION ${destination_libexec}/bornagain/ COMPONENT Libraries)
+install(FILES "${CMAKE_BINARY_DIR}/lib/bornagain/plot_utils.py"
+        DESTINATION ${destination_libexec}/bornagain/ COMPONENT Libraries)
diff --git a/Core/Computation/ComputationOutcome.h b/Core/Computation/ComputationOutcome.h
new file mode 100644
index 0000000..e16206f
--- /dev/null
+++ b/Core/Computation/ComputationOutcome.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/ComputationOutcome.h
+//! @brief     Defines and implements interface class ComputationOutcome.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPUTATIONOUTCOME_H
+#define COMPUTATIONOUTCOME_H
+
+#include "WinDllMacros.h" // TODO can probably be removed here
+#include <string>
+
+//! Completion status (flag and text) of a numeric computation.
+//! Pure virtual base class for our model evaluation routines.
+//! Currently, the only child is Computations, which is the base for some more classes.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ ComputationOutcome
+{
+public:
+    ComputationOutcome() : m_status(IDLE) {}
+
+    bool isCompleted() const { return m_status == COMPLETED; }
+    std::string getRunMessage() const { return m_run_message; }
+
+    void setRunning()   { m_status = RUNNING; }
+    void setCompleted() { m_status = COMPLETED; }
+    void setFailed()    { m_status = FAILED; }
+    void setRunMessage(const std::string& message) { m_run_message = message; }
+
+private:
+    enum ESimulationStatus { IDLE, RUNNING, COMPLETED, FAILED };
+
+    ESimulationStatus m_status;
+    std::string m_run_message;
+};
+
+#endif // COMPUTATIONOUTCOME_H
diff --git a/Core/Computation/DecoratedLayerComputation.cpp b/Core/Computation/DecoratedLayerComputation.cpp
new file mode 100644
index 0000000..79610ed
--- /dev/null
+++ b/Core/Computation/DecoratedLayerComputation.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/DecoratedLayerComputation.cpp
+//! @brief     Implements class DecoratedLayerComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "DecoratedLayerComputation.h"
+#include "Exceptions.h"
+#include "IInterferenceFunctionStrategy.h"
+#include "Layer.h"
+#include "LayerSpecularInfo.h"
+#include "LayerStrategyBuilder.h"
+#include "Logger.h"
+#include "MultiLayer.h"
+#include "ProgressHandler.h"
+#include "SimulationElement.h"
+
+DecoratedLayerComputation::DecoratedLayerComputation(const Layer* p_layer, size_t layout_index)
+    : mp_layer(p_layer), m_layout_index(layout_index)
+{}
+
+void DecoratedLayerComputation::setSpecularInfo(const LayerSpecularInfo& specular_info)
+{
+    if (&specular_info != mP_specular_info.get())
+        mP_specular_info.reset(specular_info.clone());
+}
+
+//! Computes scattering intensity for given range of simulation elements.
+void DecoratedLayerComputation::eval(
+    const SimulationOptions& options,
+    ProgressHandler* progress,
+    bool polarized,
+    const std::vector<SimulationElement>::iterator& begin_it,
+    const std::vector<SimulationElement>::iterator& end_it) const
+{
+    const std::unique_ptr<const IInterferenceFunctionStrategy> p_strategy {
+        LayerStrategyBuilder(*mp_layer, polarized, options, m_layout_index, mP_specular_info.get()).
+            createStrategy() };
+    double total_surface_density = mp_layer->getTotalParticleSurfaceDensity(m_layout_index);
+
+    InnerCounter counter;
+    for (std::vector<SimulationElement>::iterator it = begin_it; it != end_it; ++it) {
+        if (!progress->alive())
+            return;
+        double alpha_f = it->getAlphaMean();
+        size_t n_layers = mp_layer->getNumberOfLayers();
+        if (n_layers > 1 && alpha_f < 0)
+            continue;
+        // each ffdwba: one call to getOutCoeffs
+        it->setIntensity(p_strategy->evaluate(*it) * total_surface_density);
+        counter.stepProgress(progress);
+    }
+}
diff --git a/Core/Computation/DecoratedLayerComputation.h b/Core/Computation/DecoratedLayerComputation.h
new file mode 100644
index 0000000..e1832d5
--- /dev/null
+++ b/Core/Computation/DecoratedLayerComputation.h
@@ -0,0 +1,55 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/DecoratedLayerComputation.h
+//! @brief     Defines class DecoratedLayerComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DECORATEDLAYERCOMPUTATION_H
+#define DECORATEDLAYERCOMPUTATION_H
+
+#include "InnerCounter.h"
+#include <vector>
+#include <memory>
+
+using std::size_t;
+
+class Layer;
+class LayerSpecularInfo;
+class MultiLayer;
+class ProgressHandler;
+class SimulationElement;
+class SimulationOptions;
+
+//! Computes the scattering contribution from one layer with particles in/on it.
+//! Controlled by MainComputation.
+//! @ingroup algorithms_internal
+
+class DecoratedLayerComputation
+{
+public:
+    DecoratedLayerComputation(const Layer* p_layer, size_t layout_index=0);
+
+    void setSpecularInfo(const LayerSpecularInfo& specular_info);
+
+    void eval(const SimulationOptions& options,
+              ProgressHandler* progress,
+              bool polarized,
+              const std::vector<SimulationElement>::iterator& begin_it,
+              const std::vector<SimulationElement>::iterator& end_it) const;
+
+private:
+    const Layer* mp_layer;
+    std::unique_ptr<LayerSpecularInfo> mP_specular_info;
+    size_t m_layout_index;
+};
+
+#endif // DECORATEDLAYERCOMPUTATION_H
diff --git a/Core/Computation/InnerCounter.cpp b/Core/Computation/InnerCounter.cpp
new file mode 100644
index 0000000..01f43c3
--- /dev/null
+++ b/Core/Computation/InnerCounter.cpp
@@ -0,0 +1,27 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/InnerCounter.cpp
+//! @brief     Implements class InnerCounter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ProgressHandler.h"
+#include "InnerCounter.h"
+
+//! Increments progress count; at regular intervals updates main progress handler.
+void InnerCounter::stepProgress(ProgressHandler* progress)
+{
+    ++m_count;
+    if( m_count==bundle ) {
+        progress->incrementDone(bundle);
+        m_count = 0;
+    }
+}
diff --git a/Core/Computation/InnerCounter.h b/Core/Computation/InnerCounter.h
new file mode 100644
index 0000000..5ce336d
--- /dev/null
+++ b/Core/Computation/InnerCounter.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/InnerCounter.h
+//! @brief     Defines class InnerCounter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INNERCOUNTER_H
+#define INNERCOUNTER_H
+
+#include "INoncopyable.h"
+
+class ProgressHandler;
+
+//! Base class for threaded computation; keeps count of progress.
+
+class InnerCounter: public INoncopyable
+{
+public:
+    InnerCounter() : m_count(0) {}
+    void stepProgress(ProgressHandler* progress);
+private:
+    const int bundle = 100;
+    int m_count;
+};
+
+#endif // INNERCOUNTER_H
diff --git a/Core/Computation/MainComputation.cpp b/Core/Computation/MainComputation.cpp
new file mode 100644
index 0000000..fcb45f5
--- /dev/null
+++ b/Core/Computation/MainComputation.cpp
@@ -0,0 +1,163 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/MainComputation.cpp
+//! @brief     Implements class MainComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MainComputation.h"
+#include "BornAgainNamespace.h"
+#include "DecoratedLayerComputation.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "LayerSpecularInfo.h"
+#include "Logger.h"
+#include "MatrixSpecularInfoMap.h"
+#include "MultiLayer.h"
+#include "RoughMultiLayerComputation.h"
+#include "SpecularComputation.h"
+#include "ScalarSpecularInfoMap.h"
+#include "ProgressHandler.h"
+#include "SimulationElement.h"
+#include "SpecularMagnetic.h"
+#include "SpecularMatrix.h"
+
+#include <algorithm>
+#include <iterator>
+#include <iostream>
+
+MainComputation::MainComputation(
+    const MultiLayer* p_multi_layer,
+    const SimulationOptions& options,
+    ProgressHandler& progress,
+    const std::vector<SimulationElement>::iterator& begin_it,
+    const std::vector<SimulationElement>::iterator& end_it)
+    : m_sim_options(options)
+    , m_progress(&progress)
+    , mp_roughness_computation(nullptr)
+{
+    mp_multi_layer = p_multi_layer->clone();
+
+    msglog(MSG::DEBUG2) << "MainComputation::init()";
+    m_begin_it = begin_it;
+    m_end_it = end_it;
+
+    size_t nLayers = mp_multi_layer->getNumberOfLayers();
+    m_layer_computation.resize( nLayers );
+    for (size_t i=0; i<nLayers; ++i) {
+        const Layer* layer = mp_multi_layer->getLayer(i);
+        for (size_t j=0; j<layer->getNumberOfLayouts(); ++j)
+            m_layer_computation[i].push_back( new DecoratedLayerComputation(layer, j) );
+    }
+    // scattering from rough surfaces in DWBA
+    if (mp_multi_layer->hasRoughness())
+        mp_roughness_computation = new RoughMultiLayerComputation(mp_multi_layer);
+    mp_specular_computation = new SpecularComputation();
+}
+
+MainComputation::~MainComputation()
+{
+    delete mp_multi_layer;
+    delete mp_roughness_computation;
+    delete mp_specular_computation;
+    for (auto& layer_comp: m_layer_computation)
+        for (DecoratedLayerComputation* comp: layer_comp)
+            delete comp;
+}
+
+void MainComputation::run()
+{
+    m_outcome.setRunning();
+    try {
+        runProtected();
+        m_outcome.setCompleted();
+    } catch(const std::exception &ex) {
+        m_outcome.setRunMessage(std::string(ex.what()));
+        m_outcome.setFailed();
+    }
+}
+
+// The normalization of the calculated scattering intensities is:
+// For nanoparticles: rho * (scattering cross-section/scattering particle)
+// For roughness: (scattering cross-section of area S)/S
+// For specular peak: |R|^2 * sin(alpha_i) / solid_angle
+// This allows them to be added and normalized together to the beam afterwards
+void MainComputation::runProtected()
+{
+    msglog(MSG::DEBUG2) << "MainComputation::runProtected()";
+
+    if (mp_multi_layer->requiresMatrixRTCoefficients())
+        collectRTCoefficientsMatrix();
+    else
+        collectRTCoefficientsScalar();
+
+    // run through layers and run layer simulations
+    std::vector<SimulationElement> layer_elements;
+    std::copy(m_begin_it, m_end_it, std::back_inserter(layer_elements));
+    bool polarized = mp_multi_layer->containsMagneticMaterial();
+    for (auto& layer_comp: m_layer_computation) {
+        for (const DecoratedLayerComputation* comp: layer_comp) {
+            if (!m_progress->alive())
+                return;
+            comp->eval(m_sim_options, m_progress, polarized,
+                       layer_elements.begin(), layer_elements.end());
+            addElementsWithWeight(layer_elements.begin(), layer_elements.end(), m_begin_it, 1.0);
+        }
+    }
+
+    if (!mp_multi_layer->requiresMatrixRTCoefficients() && mp_roughness_computation) {
+        msglog(MSG::DEBUG2) << "MainComputation::run() -> roughness";
+        if (!m_progress->alive())
+            return;
+        mp_roughness_computation->eval(
+            m_progress, layer_elements.begin(), layer_elements.end());
+        addElementsWithWeight(layer_elements.begin(), layer_elements.end(), m_begin_it, 1.0);
+    }
+
+    if (m_sim_options.includeSpecular())
+        mp_specular_computation->eval(m_progress, polarized, m_begin_it, m_end_it);
+}
+
+void MainComputation::collectRTCoefficientsScalar()
+{
+    // run through layers and construct T,R functions
+    for(size_t i=0; i<mp_multi_layer->getNumberOfLayers(); ++i) {
+        msglog(MSG::DEBUG2) << "MainComputation::run() -> Layer " << i;
+        LayerSpecularInfo layer_coeff_map;
+        layer_coeff_map.addRTCoefficients(new ScalarSpecularInfoMap(mp_multi_layer, i));
+
+        // layer DWBA simulation
+        for(DecoratedLayerComputation* comp: m_layer_computation[i])
+            comp->setSpecularInfo(layer_coeff_map);
+
+        // layer roughness DWBA
+        if (mp_roughness_computation)
+            mp_roughness_computation->setSpecularInfo(i, layer_coeff_map);
+
+        if (i==0)
+            mp_specular_computation->setSpecularInfo(layer_coeff_map);
+    }
+}
+
+void MainComputation::collectRTCoefficientsMatrix()
+{
+    // run through layers and construct T,R functions
+    for(size_t i=0; i<mp_multi_layer->getNumberOfLayers(); ++i) {
+        msglog(MSG::DEBUG2) << "MainComputation::runMagnetic() -> Layer " << i;
+        LayerSpecularInfo layer_coeff_map;
+        layer_coeff_map.addRTCoefficients(new MatrixSpecularInfoMap(mp_multi_layer, i));
+
+        // layer DWBA simulation
+        for(DecoratedLayerComputation* comp: m_layer_computation[i])
+            comp->setSpecularInfo(layer_coeff_map);
+    }
+}
diff --git a/Core/Computation/MainComputation.h b/Core/Computation/MainComputation.h
new file mode 100644
index 0000000..e043a6e
--- /dev/null
+++ b/Core/Computation/MainComputation.h
@@ -0,0 +1,75 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/MainComputation.h
+//! @brief     Defines class MainComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MAINCOMPUTATION_H
+#define MAINCOMPUTATION_H
+
+#include "ComputationOutcome.h"
+#include "Complex.h"
+#include "INoncopyable.h"
+#include "SimulationOptions.h"
+#include <vector>
+
+class MultiLayer;
+class DecoratedLayerComputation;
+class RoughMultiLayerComputation;
+class SpecularComputation;
+class ProgressHandler;
+class SimulationElement;
+
+//! Performs a single-threaded DWBA computation with given sample and simulation parameters,
+//! for a given span of detector bins.
+//!
+//! Controlled by the multi-threading machinery in Simulation::runSingleSimulation().
+//!
+//! @ingroup algorithms_internal
+
+class MainComputation final : public INoncopyable
+{
+public:
+    MainComputation(
+        const MultiLayer* p_multi_layer,
+        const SimulationOptions& options,
+        ProgressHandler& progress,
+        const std::vector<SimulationElement>::iterator& begin_it,
+        const std::vector<SimulationElement>::iterator& end_it);
+    ~MainComputation();
+
+    void run();
+
+    bool isCompleted() const { return m_outcome.isCompleted(); }
+    std::string getRunMessage() const { return m_outcome.getRunMessage(); }
+
+private:
+    void runProtected();
+
+    //! calculates intensity map for samples with magnetization
+    void collectRTCoefficientsScalar();
+    void collectRTCoefficientsMatrix();
+
+    MultiLayer* mp_multi_layer;
+    SimulationOptions m_sim_options;
+    ProgressHandler* m_progress;
+    //! these iterators define the span of detector bins this simulation will work on
+    std::vector<SimulationElement>::iterator m_begin_it, m_end_it;
+
+    RoughMultiLayerComputation* mp_roughness_computation;
+    SpecularComputation *mp_specular_computation;
+    std::vector<std::vector<DecoratedLayerComputation*>> m_layer_computation;
+
+    ComputationOutcome m_outcome;
+};
+
+#endif // MAINCOMPUTATION_H
diff --git a/Core/Computation/ProgressHandler.cpp b/Core/Computation/ProgressHandler.cpp
new file mode 100644
index 0000000..c805b58
--- /dev/null
+++ b/Core/Computation/ProgressHandler.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/ProgressHandler.cpp
+//! @brief     Implements class ProgressHandler.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ProgressHandler.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "MultiLayer.h"
+#include <mutex>
+#include <stdexcept>
+#include <iostream> // DEBUG
+
+void ProgressHandler::subscribe(ProgressHandler::Callback_t inform)
+{
+    if (m_inform)
+        throw std::runtime_error("Invalid call of ProgressHandler::subscribe: "
+                                 "currently, no more than one subscriber is allowed");
+    m_inform = inform;
+}
+
+//! Increments number of completed computation steps (ticks).
+//! Performs callback (method m_inform) to inform the subscriber about
+//! the state of the computation and to obtain as return value a flag
+//! that indicates whether to continue the computation.
+void ProgressHandler::incrementDone(size_t ticks_done)
+{
+    static std::mutex single_mutex;
+    std::unique_lock<std::mutex> single_lock( single_mutex );
+
+    m_completed_nticks += ticks_done;
+    if (m_completed_nticks > m_expected_nticks)
+        m_expected_nticks = m_completed_nticks+1;
+
+    int percentage_done = (int) (100.*m_completed_nticks/m_expected_nticks);
+    // fractional part is discarded, which is fine here:
+    // the value 100 is only returned if everything is done
+
+    m_continuation_flag = ( !m_inform || m_inform(percentage_done) ) && m_continuation_flag;
+}
diff --git a/Core/Computation/ProgressHandler.h b/Core/Computation/ProgressHandler.h
new file mode 100644
index 0000000..a8f9ea8
--- /dev/null
+++ b/Core/Computation/ProgressHandler.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/ProgressHandler.h
+//! @brief     Defines class ProgressHandler.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROGRESSHANDLER_H
+#define PROGRESSHANDLER_H
+
+#include "INoncopyable.h"
+#include "WinDllMacros.h"
+#include <functional>
+
+class MultiLayer;
+
+//! Maintains information about progress of a computation.
+//! Owner is the computation, which periodically calls the thread-safe function incrementDone(..).
+//! An application (GUI or script) may subscribe(..) to be informed about progress.
+//! It is then periodically called back by inform(..).
+//! The return value of inform(..) can be used to request termination of the computation.
+//!
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ ProgressHandler
+{
+public:
+    typedef std::function<bool(size_t)> Callback_t;
+
+    ProgressHandler()
+        : m_inform(nullptr), m_expected_nticks(0), m_completed_nticks(0), m_continuation_flag(true)
+    {}
+    ProgressHandler(const ProgressHandler& other)
+        : m_inform(other.m_inform) // not clear whether we want multiple copies of this
+        , m_expected_nticks(other.m_expected_nticks)
+        , m_completed_nticks(other.m_completed_nticks) {}
+    void subscribe(ProgressHandler::Callback_t callback);
+    void reset() { m_completed_nticks = 0; m_continuation_flag = true; }
+    void setExpectedNTicks(size_t n) { m_expected_nticks = n; }
+    void incrementDone(size_t ticks_done);
+    bool alive() { return m_continuation_flag; }
+
+private:
+    Callback_t m_inform;
+    size_t m_expected_nticks;
+    size_t m_completed_nticks;
+    bool m_continuation_flag;
+    bool defaultMonitorExec(int);
+};
+
+#endif // PROGRESSHANDLER_H
diff --git a/Core/Computation/RoughMultiLayerComputation.cpp b/Core/Computation/RoughMultiLayerComputation.cpp
new file mode 100644
index 0000000..d1405fa
--- /dev/null
+++ b/Core/Computation/RoughMultiLayerComputation.cpp
@@ -0,0 +1,172 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/RoughMultiLayerComputation.cpp
+//! @brief     Implements class RoughMultiLayerComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RoughMultiLayerComputation.h"
+#include "ILayerRTCoefficients.h"
+#include "Faddeeva.hh"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "LayerSpecularInfo.h"
+#include "MultiLayer.h"
+#include "MathConstants.h"
+#include "ProgressHandler.h"
+#include "SimulationElement.h"
+
+// Diffuse scattering from rough interfaces is modelled after
+// Phys. Rev. B, vol. 51 (4), p. 2311 (1995)
+
+namespace {
+    complex_t h_plus(complex_t z)
+    {
+        return 0.5*Faddeeva::erfcx(-mul_I(z)/std::sqrt(2.0));
+    }
+    complex_t h_min(complex_t z)
+    {
+        return 0.5*Faddeeva::erfcx(mul_I(z)/std::sqrt(2.0));
+    }
+}
+
+RoughMultiLayerComputation::RoughMultiLayerComputation(const MultiLayer *p_multi_layer)
+    : mp_multi_layer(p_multi_layer)
+{
+    mp_specular_info_vector.resize(p_multi_layer->getNumberOfLayers(), 0);
+}
+
+RoughMultiLayerComputation::~RoughMultiLayerComputation()
+{
+    for(size_t i=0; i<mp_specular_info_vector.size(); ++i)
+        delete mp_specular_info_vector[i];
+}
+
+//! Calls evaluate on range of simulation elements; returns true if computation shall continue
+void RoughMultiLayerComputation::eval(
+    ProgressHandler* progress,
+    const std::vector<SimulationElement>::iterator& begin_it,
+    const std::vector<SimulationElement>::iterator& end_it)
+{
+    InnerCounter counter;
+    for (std::vector<SimulationElement>::iterator it = begin_it; it != end_it; ++it) {
+        if (!progress->alive())
+            return;
+        it->setIntensity(evaluate(*it));
+        counter.stepProgress(progress);
+    }
+}
+
+double RoughMultiLayerComputation::evaluate(const SimulationElement& sim_element)
+{
+    if (sim_element.getAlphaMean()<0.0)
+        return 0.0;
+    kvector_t q = sim_element.getMeanQ();
+    double wavelength = sim_element.getWavelength();
+    double autocorr(0.0);
+    complex_t crosscorr(0.0, 0.0);
+
+    std::vector<complex_t > rterm( mp_multi_layer->getNumberOfLayers()-1 );
+    std::vector<complex_t > sterm( mp_multi_layer->getNumberOfLayers()-1 );
+
+    for (size_t i=0; i<mp_multi_layer->getNumberOfLayers()-1; i++){
+        rterm[i] = get_refractive_term(i);
+        sterm[i] = get_sum8terms(i, sim_element);
+    }
+
+    for (size_t i=0; i<mp_multi_layer->getNumberOfLayers()-1; i++) {
+        const LayerRoughness *rough =
+            mp_multi_layer->getLayerBottomInterface(i)->getRoughness();
+        if(rough)
+            autocorr += std::norm( rterm[i] ) * std::norm( sterm[i] ) * rough->getSpectralFun(q);
+    }
+
+    // cross correlation between layers
+    if (mp_multi_layer->getCrossCorrLength() != 0.0) {
+        for(size_t j=0; j<mp_multi_layer->getNumberOfLayers()-1; j++){
+            for(size_t k=0; k<mp_multi_layer->getNumberOfLayers()-1; k++) {
+                if(j==k) continue;
+                crosscorr += rterm[j]*sterm[j]*
+                    mp_multi_layer->getCrossCorrSpectralFun(q,j,k)*
+                    std::conj(rterm[k])*std::conj(sterm[k]);
+            }
+        }
+    }
+
+    //! @TODO clarify complex vs double
+    return (autocorr+crosscorr.real())*M_PI/4./wavelength/wavelength;
+}
+
+complex_t RoughMultiLayerComputation::get_refractive_term(size_t ilayer) const
+{
+    return mp_multi_layer->getLayer(ilayer  )->getRefractiveIndex2() -
+           mp_multi_layer->getLayer(ilayer+1)->getRefractiveIndex2();
+}
+
+complex_t RoughMultiLayerComputation::get_sum8terms(
+    size_t ilayer, const SimulationElement& sim_element)
+{
+    const std::unique_ptr<const ILayerRTCoefficients> P_in_plus(
+        mp_specular_info_vector[ilayer]->getInCoefficients(sim_element));
+    const std::unique_ptr<const ILayerRTCoefficients> P_out_plus(
+        mp_specular_info_vector[ilayer]->getOutCoefficients(sim_element));
+
+    const std::unique_ptr<const ILayerRTCoefficients> P_in_minus(
+        mp_specular_info_vector[ilayer + 1]->getInCoefficients(sim_element));
+    const std::unique_ptr<const ILayerRTCoefficients> P_out_minus(
+        mp_specular_info_vector[ilayer + 1]->getOutCoefficients(sim_element));
+
+    complex_t kiz_plus = P_in_plus->getScalarKz();
+    complex_t kfz_plus = P_out_plus->getScalarKz();
+    complex_t qz1_plus = - kiz_plus - kfz_plus;
+    complex_t qz2_plus = - kiz_plus + kfz_plus;
+    complex_t qz3_plus = - qz2_plus;
+    complex_t qz4_plus = - qz1_plus;
+    double thickness = mp_multi_layer->getLayerThickness(ilayer);
+    complex_t T_in_plus  = P_in_plus ->getScalarT()*exp_I( kiz_plus*thickness);
+    complex_t R_in_plus  = P_in_plus ->getScalarR()*exp_I(-kiz_plus*thickness);
+    complex_t T_out_plus = P_out_plus->getScalarT()*exp_I( kfz_plus*thickness);
+    complex_t R_out_plus = P_out_plus->getScalarR()*exp_I(-kfz_plus*thickness);
+
+    complex_t kiz_minus = P_in_minus->getScalarKz();
+    complex_t kfz_minus = P_out_minus->getScalarKz();
+    complex_t qz1_minus = - kiz_minus - kfz_minus;
+    complex_t qz2_minus = - kiz_minus + kfz_minus;
+    complex_t qz3_minus = - qz2_minus;
+    complex_t qz4_minus = - qz1_minus;
+
+    double sigma(0.0);
+    if (const LayerRoughness* roughness
+        = mp_multi_layer->getLayerBottomInterface(ilayer)->getRoughness())
+        sigma = roughness->getSigma();
+    complex_t term1 = T_in_plus * T_out_plus * h_plus(qz1_plus*sigma);
+    complex_t term2 = T_in_plus * R_out_plus * h_plus(qz2_plus*sigma);
+    complex_t term3 = R_in_plus * T_out_plus * h_plus(qz3_plus*sigma);
+    complex_t term4 = R_in_plus * R_out_plus * h_plus(qz4_plus*sigma);
+    complex_t term5 = P_in_minus->getScalarT() * P_out_minus->getScalarT()
+                      * h_min(qz1_minus*sigma);
+    complex_t term6 = P_in_minus->getScalarT() * P_out_minus->getScalarR()
+                      * h_min(qz2_minus*sigma);
+    complex_t term7 = P_in_minus->getScalarR() * P_out_minus->getScalarT()
+                      * h_min(qz3_minus*sigma);
+    complex_t term8 = P_in_minus->getScalarR() * P_out_minus->getScalarR()
+                      * h_min(qz4_minus*sigma);
+
+    return term1 + term2 + term3 + term4 + term5 + term6 + term7 + term8;
+}
+
+void RoughMultiLayerComputation::setSpecularInfo(size_t i_layer,
+        const LayerSpecularInfo& specular_info)
+{
+    delete mp_specular_info_vector[i_layer];
+    mp_specular_info_vector[i_layer] = specular_info.clone();
+}
diff --git a/Core/Computation/RoughMultiLayerComputation.h b/Core/Computation/RoughMultiLayerComputation.h
new file mode 100644
index 0000000..974ee3b
--- /dev/null
+++ b/Core/Computation/RoughMultiLayerComputation.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/RoughMultiLayerComputation.h
+//! @brief     Defines class RoughMultiLayerComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ROUGHMULTILAYERCOMPUTATION_H
+#define ROUGHMULTILAYERCOMPUTATION_H
+
+#include "Complex.h"
+#include "InnerCounter.h"
+#include <vector>
+
+class LayerSpecularInfo;
+class MultiLayer;
+class ProgressHandler;
+class SimulationElement;
+
+//! Computes the diffuse reflection from the rough interfaces of a multilayer.
+//! Controlled by MainComputation.
+//! @ingroup algorithms_internal
+
+class RoughMultiLayerComputation
+{
+public:
+    RoughMultiLayerComputation(const MultiLayer* p_multi_layer);
+    ~RoughMultiLayerComputation();
+
+    void eval(ProgressHandler* progress,
+              const std::vector<SimulationElement>::iterator& begin_it,
+              const std::vector<SimulationElement>::iterator& end_it);
+
+    //! Sets magnetic reflection/transmission info for specific layer
+    void setSpecularInfo(size_t i_layer, const LayerSpecularInfo& specular_info);
+
+    // evaluate
+    double evaluate(const SimulationElement& sim_element);
+
+private:
+    complex_t get_refractive_term(size_t ilayer) const;
+    complex_t get_sum8terms(size_t ilayer, const SimulationElement& sim_element);
+
+    const MultiLayer* mp_multi_layer;
+    std::vector<LayerSpecularInfo*> mp_specular_info_vector;
+};
+
+#endif // ROUGHMULTILAYERCOMPUTATION_H
diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp
new file mode 100644
index 0000000..92dfacd
--- /dev/null
+++ b/Core/Computation/SpecularComputation.cpp
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/SpecularComputation.cpp
+//! @brief     Implements class SpecularComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SpecularComputation.h"
+#include "SimulationElement.h"
+#include "LayerSpecularInfo.h"
+#include "ILayerRTCoefficients.h"
+
+SpecularComputation::SpecularComputation()
+{}
+
+void SpecularComputation::eval(
+        ProgressHandler* /*unused*/,
+        bool polarized,
+        const std::vector<SimulationElement>::iterator& begin_it,
+        const std::vector<SimulationElement>::iterator& end_it)
+{
+    if (polarized) return;
+    for (std::vector<SimulationElement>::iterator it = begin_it; it != end_it; ++it) {
+        if (it->containsSpecularWavevector()) {
+            complex_t R = mP_specular_info->getInCoefficients(*it)->getScalarR();
+            double sin_alpha_i = std::abs(std::sin(it->getAlphaI()));
+            if (sin_alpha_i==0.0)
+                sin_alpha_i = 1.0;
+            double solid_angle = it->getSolidAngle();
+            if (solid_angle<=0.0)
+                continue;
+            double intensity = std::norm(R)*sin_alpha_i/solid_angle;
+            it->setIntensity(intensity);
+        }
+    }
+    return;
+}
+
+void SpecularComputation::setSpecularInfo(const LayerSpecularInfo &specular_info)
+{
+    if (mP_specular_info.get() != &specular_info)
+        mP_specular_info.reset(specular_info.clone());
+}
diff --git a/Core/Computation/SpecularComputation.h b/Core/Computation/SpecularComputation.h
new file mode 100644
index 0000000..286918d
--- /dev/null
+++ b/Core/Computation/SpecularComputation.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Computation/SpecularComputation.h
+//! @brief     Defines class SpecularComputation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPECULARCOMPUTATION_H
+#define SPECULARCOMPUTATION_H
+
+#include "INoncopyable.h"
+#include <vector>
+#include <memory>
+
+class MultiLayer;
+class LayerSpecularInfo;
+class ProgressHandler;
+class SimulationElement;
+class SimulationOptions;
+
+//! Computes the specular scattering.
+//! Controlled by MainComputation.
+//! @ingroup algorithms_internal
+
+class SpecularComputation final : public INoncopyable
+{
+public:
+    SpecularComputation();
+
+    void eval(ProgressHandler* progress,
+              bool polarized,
+              const std::vector<SimulationElement>::iterator& begin_it,
+              const std::vector<SimulationElement>::iterator& end_it);
+    void setSpecularInfo(const LayerSpecularInfo& specular_info);
+
+private:
+    std::unique_ptr<LayerSpecularInfo> mP_specular_info;
+};
+
+
+#endif // SPECULARCOMPUTATION_H
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.cpp b/Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.cpp
new file mode 100644
index 0000000..9e08c98
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.cpp
+//! @brief     Implements class FormFactorDecoratorDebyeWaller.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDecoratorDebyeWaller.h"
+#include "BornAgainNamespace.h"
+#include "ISampleVisitor.h"
+#include "WavevectorInfo.h"
+#include "RealParameter.h"
+
+FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(
+    const IFormFactor& form_factor, double dw_h_factor, double dw_r_factor)
+    : IFormFactorDecorator(form_factor),
+      m_h_dw_factor(dw_h_factor), m_r_dw_factor(dw_r_factor)
+{
+    setName(BornAgain::FormFactorDecoratorDebyeWallerType);
+    registerParameter(BornAgain::HeightDWFactor, &m_h_dw_factor).setPositive();
+    registerParameter(BornAgain::RadiusDWFactor, &m_r_dw_factor).setPositive();
+}
+
+FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(
+    const IFormFactor & form_factor, double dw_factor)
+    : IFormFactorDecorator(form_factor),
+    m_h_dw_factor(dw_factor), m_r_dw_factor(dw_factor)
+{
+    setName(BornAgain::FormFactorDecoratorDebyeWallerType);
+    registerParameter(BornAgain::HeightDWFactor, &m_h_dw_factor).setPositive();
+    registerParameter(BornAgain::RadiusDWFactor, &m_r_dw_factor).setPositive();
+}
+
+complex_t FormFactorDecoratorDebyeWaller::evaluate(const WavevectorInfo& wavevectors) const
+{
+    double dw = getDWFactor(wavevectors);
+    return dw * mp_form_factor->evaluate(wavevectors);
+}
+
+Eigen::Matrix2cd FormFactorDecoratorDebyeWaller::evaluatePol(
+        const WavevectorInfo &wavevectors) const
+{
+    double dw = getDWFactor(wavevectors);
+    return dw * mp_form_factor->evaluatePol(wavevectors);
+}
+
+double FormFactorDecoratorDebyeWaller::getDWFactor(const WavevectorInfo& wavevectors) const
+{
+    cvector_t q = wavevectors.getQ();
+    double qr2 = std::norm(q.x()) + std::norm(q.y());
+    double qz2 = std::norm(q.z());
+    double dw = std::exp(-qz2 * m_h_dw_factor - qr2 * m_r_dw_factor);
+    return dw;
+}
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.h b/Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.h
new file mode 100644
index 0000000..6098742
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorDebyeWaller.h
+//! @brief     Defines and implements class FormFactorDecoratorDebyeWaller.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDECORATORDEBYEWALLER_H
+#define FORMFACTORDECORATORDEBYEWALLER_H
+
+#include "IFormFactorDecorator.h"
+
+//! Debye-Waller factors in radial and z directions.
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ FormFactorDecoratorDebyeWaller : public IFormFactorDecorator
+{
+public:
+    //! Anisotropic Debye-Waller factor.
+    FormFactorDecoratorDebyeWaller(const IFormFactor& form_factor, double dw_h_factor,
+                                   double dw_r_factor);
+
+    //! Isotropic Debye-Waller factor.
+    FormFactorDecoratorDebyeWaller(const IFormFactor& form_factor, double dw_factor);
+
+    FormFactorDecoratorDebyeWaller* clone() const override final {
+        return new FormFactorDecoratorDebyeWaller(*mp_form_factor, m_h_dw_factor, m_r_dw_factor); }
+
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override final;
+#ifndef SWIG
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override final;
+#endif
+
+private:
+    double m_h_dw_factor; //!< the Debye-Waller factor in the z-direction
+    double m_r_dw_factor; //!< the Debye-Waller factor in the radial direction
+    double getDWFactor(const WavevectorInfo& wavevectors) const;
+};
+
+#endif // FORMFACTORDECORATORDEBYEWALLER_H
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorFactor.cpp b/Core/DecoratedFormFactor/FormFactorDecoratorFactor.cpp
new file mode 100644
index 0000000..6300e15
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorFactor.cpp
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorFactor.cpp
+//! @brief     Implements class FormFactorDecoratorFactor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDecoratorFactor.h"
+#include "BornAgainNamespace.h"
+
+FormFactorDecoratorFactor::FormFactorDecoratorFactor(const IFormFactor& form_factor,
+                                                     const complex_t factor)
+    : IFormFactorDecorator(form_factor), m_factor(factor)
+{
+    setName(BornAgain::FormFactorDecoratorFactorType);
+}
+
+complex_t FormFactorDecoratorFactor::evaluate(const WavevectorInfo& wavevectors) const
+{
+    return m_factor * mp_form_factor->evaluate(wavevectors);
+}
+
+Eigen::Matrix2cd FormFactorDecoratorFactor::evaluatePol(const WavevectorInfo &wavevectors) const
+{
+    return m_factor * mp_form_factor->evaluatePol(wavevectors);
+}
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorFactor.h b/Core/DecoratedFormFactor/FormFactorDecoratorFactor.h
new file mode 100644
index 0000000..98a57d6
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorFactor.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorFactor.h
+//! @brief     Defines class FormFactorDecoratorFactor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDECORATORFACTOR_H
+#define FORMFACTORDECORATORFACTOR_H
+
+#include "IFormFactorDecorator.h"
+
+//! Decorates a formfactor with a constant factor.
+//!   Base class of FormFactorDecoratorMaterial.
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ FormFactorDecoratorFactor : public IFormFactorDecorator
+{
+public:
+    FormFactorDecoratorFactor(const IFormFactor& form_factor, const complex_t factor);
+    FormFactorDecoratorFactor* clone() const override {
+        return new FormFactorDecoratorFactor(*mp_form_factor, m_factor); }
+
+    void accept(ISampleVisitor* visitor) const override { visitor->visit(this); }
+
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override;
+#ifndef SWIG
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override;
+#endif
+
+protected:
+    complex_t m_factor;
+};
+
+#endif // FORMFACTORDECORATORFACTOR_H
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorMaterial.cpp b/Core/DecoratedFormFactor/FormFactorDecoratorMaterial.cpp
new file mode 100644
index 0000000..1c96f02
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorMaterial.cpp
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorMaterial.cpp
+//! @brief     Implements class FormFactorDecoratorMaterial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDecoratorMaterial.h"
+#include "BornAgainNamespace.h"
+#include "IMaterial.h"
+#include "ISampleVisitor.h"
+#include "MathConstants.h"
+#include "WavevectorInfo.h"
+
+FormFactorDecoratorMaterial::FormFactorDecoratorMaterial(const IFormFactor& form_factor)
+    : FormFactorDecoratorFactor(form_factor, 1.0),
+      mP_material{nullptr},
+      mP_ambient_material{nullptr}
+{
+    setName(BornAgain::FormFactorDecoratorMaterialType);
+}
+
+FormFactorDecoratorMaterial::~FormFactorDecoratorMaterial()
+{}
+
+FormFactorDecoratorMaterial* FormFactorDecoratorMaterial::clone() const
+{
+    FormFactorDecoratorMaterial* result = new FormFactorDecoratorMaterial(*mp_form_factor);
+    result->setMaterial(*mP_material);
+    result->setAmbientMaterial(*mP_ambient_material);
+    return result;
+}
+
+void FormFactorDecoratorMaterial::setMaterial(const IMaterial& material)
+{
+    if (mP_material.get() != &material)
+        mP_material.reset(material.clone());
+    m_factor = getRefractiveIndexFactor();
+}
+
+void FormFactorDecoratorMaterial::setAmbientMaterial(const IMaterial& material)
+{
+    if (mP_ambient_material.get() != &material)
+        mP_ambient_material.reset(material.clone());
+    m_factor = getRefractiveIndexFactor();
+}
+
+complex_t FormFactorDecoratorMaterial::getAmbientRefractiveIndex() const
+{
+    return mP_ambient_material ? mP_ambient_material->getRefractiveIndex() : 1.0;
+}
+
+Eigen::Matrix2cd FormFactorDecoratorMaterial::evaluatePol(const WavevectorInfo& wavevectors) const
+{
+    // the conjugated linear part of time reversal operator T
+    // (T=UK with K complex conjugate operator and U is linear)
+    Eigen::Matrix2cd time_reverse_conj = Eigen::Matrix2cd::Zero();
+    time_reverse_conj(0, 1) = 1.0;
+    time_reverse_conj(1, 0) = -1.0;
+    // the interaction and time reversal taken together:
+    double wavelength = wavevectors.getWavelength();
+    double k_mag2 = 4.0 * M_PI * M_PI / wavelength / wavelength;
+    Eigen::Matrix2cd V_eff = time_reverse_conj
+                             * (mP_material->getScatteringMatrix(k_mag2)
+                                - mP_ambient_material->getScatteringMatrix(k_mag2));
+    return mp_form_factor->evaluate(wavevectors) * V_eff;
+}
+
+complex_t FormFactorDecoratorMaterial::getRefractiveIndexFactor() const
+{
+    if (mP_material && mP_ambient_material) {
+        complex_t particle_index = mP_material->getRefractiveIndex();
+        complex_t ambient_index = mP_ambient_material->getRefractiveIndex();
+        return particle_index * particle_index - ambient_index * ambient_index;
+    } else
+        return 1.0;
+}
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorMaterial.h b/Core/DecoratedFormFactor/FormFactorDecoratorMaterial.h
new file mode 100644
index 0000000..845b40f
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorMaterial.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorMaterial.h
+//! @brief     Defines class FormFactorDecoratorMaterial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDECORATORMATERIAL_H
+#define FORMFACTORDECORATORMATERIAL_H
+
+#include "FormFactorDecoratorFactor.h"
+#include <memory>
+
+class IMaterial;
+
+//! Decorates a scalar formfactor with the correct factor for the material's
+//! refractive index and that of its surrounding material.
+//! @ingroup formfactors_decorations
+
+class BA_CORE_API_ FormFactorDecoratorMaterial : public FormFactorDecoratorFactor
+{
+public:
+    FormFactorDecoratorMaterial(const IFormFactor& form_factor);
+
+    ~FormFactorDecoratorMaterial() override final;
+
+    FormFactorDecoratorMaterial* clone() const override final;
+
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    //! Sets the material of the scatterer
+    void setMaterial(const IMaterial& material);
+
+    //! Sets the ambient material
+    void setAmbientMaterial(const IMaterial& material) override;
+
+    complex_t getAmbientRefractiveIndex() const;
+
+#ifndef SWIG
+    //! Returns scattering amplitude for matrix interactions
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override final;
+#endif
+
+private:
+    complex_t getRefractiveIndexFactor() const;
+
+    std::unique_ptr<IMaterial> mP_material;
+    std::unique_ptr<IMaterial> mP_ambient_material;
+};
+
+#endif // FORMFACTORDECORATORMATERIAL_H
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.cpp b/Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.cpp
new file mode 100644
index 0000000..184a26d
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.cpp
+//! @brief     Implements class FormFactorDecoratorPositionFactor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDecoratorPositionFactor.h"
+#include "BornAgainNamespace.h"
+#include "ISampleVisitor.h"
+#include "WavevectorInfo.h"
+
+FormFactorDecoratorPositionFactor::FormFactorDecoratorPositionFactor(
+    const IFormFactor& form_factor, const kvector_t& position)
+    : IFormFactorDecorator(form_factor), m_position(position)
+{
+    setName(BornAgain::FormFactorDecoratorPositionFactorType);
+}
+
+complex_t FormFactorDecoratorPositionFactor::evaluate(
+    const WavevectorInfo& wavevectors) const
+{
+    return getPositionFactor(wavevectors) * mp_form_factor->evaluate(wavevectors);
+}
+
+Eigen::Matrix2cd FormFactorDecoratorPositionFactor::evaluatePol(
+        const WavevectorInfo& wavevectors) const
+{
+    return getPositionFactor(wavevectors) * mp_form_factor->evaluatePol(wavevectors);
+}
+
+complex_t FormFactorDecoratorPositionFactor::getPositionFactor(
+    const WavevectorInfo& wavevectors) const
+{
+    cvector_t q = wavevectors.getQ();
+    return exp_I( m_position.dot(q) );
+}
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.h b/Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.h
new file mode 100644
index 0000000..455cc27
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorPositionFactor.h
+//! @brief     Defines class FormFactorDecoratorPositionFactor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDECORATORPOSITIONFACTOR_H
+#define FORMFACTORDECORATORPOSITIONFACTOR_H
+
+#include "IFormFactorDecorator.h"
+#include "Vectors3D.h"
+
+//! Decorates a formfactor with a position dependent phase factor.
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ FormFactorDecoratorPositionFactor : public IFormFactorDecorator
+{
+public:
+    FormFactorDecoratorPositionFactor(const IFormFactor& form_factor, const kvector_t& position);
+
+    FormFactorDecoratorPositionFactor* clone() const override final {
+        return new FormFactorDecoratorPositionFactor(*mp_form_factor, m_position); }
+
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override final;
+#ifndef SWIG
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override final;
+#endif
+
+private:
+    complex_t getPositionFactor(const WavevectorInfo& wavevectors) const;
+
+    kvector_t m_position;
+};
+
+#endif // FORMFACTORDECORATORPOSITIONFACTOR_H
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorRotation.cpp b/Core/DecoratedFormFactor/FormFactorDecoratorRotation.cpp
new file mode 100644
index 0000000..768d7fe
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorRotation.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorRotation.cpp
+//! @brief     Implements class FormFactorDecoratorRotation
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDecoratorRotation.h"
+#include "BornAgainNamespace.h"
+#include "ISampleVisitor.h"
+#include "WavevectorInfo.h"
+#include <memory>
+
+FormFactorDecoratorRotation::FormFactorDecoratorRotation(
+    const IFormFactor& form_factor, const IRotation& rotation)
+    : IFormFactorDecorator(form_factor)
+{
+    setName(BornAgain::FormFactorDecoratorRotationType);
+    m_transform = rotation.getTransform3D();
+}
+
+FormFactorDecoratorRotation* FormFactorDecoratorRotation::clone() const
+{
+    return new FormFactorDecoratorRotation(*mp_form_factor, m_transform);
+}
+
+complex_t FormFactorDecoratorRotation::evaluate(const WavevectorInfo& wavevectors) const
+{
+    WavevectorInfo rotated_wavevectors = rotate_wavevectors(wavevectors);
+    return mp_form_factor->evaluate(rotated_wavevectors);
+}
+
+Eigen::Matrix2cd FormFactorDecoratorRotation::evaluatePol(const WavevectorInfo &wavevectors) const
+{
+    WavevectorInfo rotated_wavevectors = rotate_wavevectors(wavevectors);
+    return mp_form_factor->evaluatePol(rotated_wavevectors);
+}
+
+FormFactorDecoratorRotation::FormFactorDecoratorRotation(const IFormFactor &form_factor,
+                                                         const Transform3D &transform)
+    : IFormFactorDecorator(form_factor)
+{
+    setName(BornAgain::FormFactorDecoratorRotationType);
+    m_transform = transform;
+}
+
+WavevectorInfo FormFactorDecoratorRotation::rotate_wavevectors(
+        const WavevectorInfo& wavevectors) const
+{
+    cvector_t rotated_ki = m_transform.transformedInverse(wavevectors.getKi());
+    cvector_t rotated_kf = m_transform.transformedInverse(wavevectors.getKf());
+    double wavelength = wavevectors.getWavelength();
+    return WavevectorInfo(rotated_ki, rotated_kf, wavelength);
+}
diff --git a/Core/DecoratedFormFactor/FormFactorDecoratorRotation.h b/Core/DecoratedFormFactor/FormFactorDecoratorRotation.h
new file mode 100644
index 0000000..5c810be
--- /dev/null
+++ b/Core/DecoratedFormFactor/FormFactorDecoratorRotation.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/FormFactorDecoratorRotation.h
+//! @brief     Defines class FormFactorDecoratorRotation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDECORATORROTATION_H
+#define FORMFACTORDECORATORROTATION_H
+
+#include "IFormFactorDecorator.h"
+#include "Rotations.h"
+
+//! @class FormFactorDecoratorRotation
+//! @ingroup formfactors_internal
+//! @brief Equips a formfactor with a rotation.
+
+class BA_CORE_API_ FormFactorDecoratorRotation : public IFormFactorDecorator
+{
+public:
+    //! Constructor, setting form factor and rotation.
+    FormFactorDecoratorRotation(const IFormFactor &form_factor, const IRotation &rotation);
+
+    FormFactorDecoratorRotation *clone() const override final;
+
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override final;
+#ifndef SWIG
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override final;
+#endif
+
+private:
+    Transform3D m_transform;
+    //! Private constructor for cloning.
+    FormFactorDecoratorRotation(const IFormFactor &form_factor, const Transform3D &transform);
+    WavevectorInfo rotate_wavevectors(const WavevectorInfo& wavevectors) const;
+};
+
+#endif // FORMFACTORDECORATORROTATION_H
diff --git a/Core/DecoratedFormFactor/IFormFactorDecorator.h b/Core/DecoratedFormFactor/IFormFactorDecorator.h
new file mode 100644
index 0000000..954c6f4
--- /dev/null
+++ b/Core/DecoratedFormFactor/IFormFactorDecorator.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/DecoratedFormFactor/IFormFactorDecorator.h
+//! @brief     Defines and implements pure virtual interface class IFormFactorDecorator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IFORMFACTORDECORATOR_H
+#define IFORMFACTORDECORATOR_H
+
+#include "IFormFactor.h"
+
+//! Encapsulates another formfactor and adds extra functionality
+//! (a scalar factor, a Debye-Waller factor, a position-dependent phase factor, ...).
+//!
+//! This class is designed according to the Decorator Pattern.
+//! It inherits from IFormFactor _and_ has a member of type IFormFactor*.
+//!
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ IFormFactorDecorator : public IFormFactor
+{
+public:
+    IFormFactorDecorator(const IFormFactor& form_factor) : mp_form_factor(form_factor.clone()) {}
+    ~IFormFactorDecorator() override { delete mp_form_factor; }
+    IFormFactorDecorator* clone() const override=0;
+    void accept(ISampleVisitor* visitor) const override=0;
+
+    void setAmbientMaterial(const IMaterial &material) override {
+        mp_form_factor->setAmbientMaterial(material); }
+
+    double getVolume() const override {
+        return mp_form_factor->getVolume(); }
+
+    double getRadialExtension() const override {
+        return mp_form_factor->getRadialExtension(); }
+
+protected:
+    IFormFactor* mp_form_factor;
+};
+
+#endif // IFORMFACTORDECORATOR_H
diff --git a/Core/Export/ExportToPython.cpp b/Core/Export/ExportToPython.cpp
new file mode 100644
index 0000000..425d130
--- /dev/null
+++ b/Core/Export/ExportToPython.cpp
@@ -0,0 +1,881 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Export/ExportToPython.cpp
+//! @brief     Implements class ExportToPython.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ExportToPython.h"
+#include "Beam.h"
+#include "ConvolutionDetectorResolution.h"
+#include "Crystal.h"
+#include "Distributions.h"
+#include "GISASSimulation.h"
+#include "IFormFactor.h"
+#include "InterferenceFunctions.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "Materials.h"
+#include "MesoCrystal.h"
+#include "MultiLayer.h"
+#include "MainComputation.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleCoreShell.h"
+#include "ParticleDistribution.h"
+#include "ParticleLayout.h"
+#include "PythonFormatting.h"
+#include "RectangularDetector.h"
+#include "ResolutionFunction2DGaussian.h"
+#include "SampleLabelHandler.h"
+#include "SphericalDetector.h"
+#include "Utils.h"
+#include "RegionOfInterest.h"
+#include <iomanip>
+#include <set>
+#include <functional>
+
+class IFormFactor;
+class LayerRoughness;
+
+using namespace PythonFormatting;
+
+namespace {
+
+    const std::string preamble =
+        "import numpy\n"
+        "import bornagain as ba\n"
+        "from bornagain import deg, angstrom, nm, kvector_t\n\n";
+
+    const std::string defineSimulate =
+        "def simulate():\n"
+        "    # Run Simulation\n"
+        "    sample = getSample()\n"
+        "    simulation = getSimulation()\n"
+        "    simulation.setSample(sample)\n"
+        "    simulation.runSimulation()\n"
+        "    return simulation.getIntensityData()\n"
+        "\n\n";
+
+    const std::string mainProgram =
+        "if __name__ == '__main__': \n"
+        "    ba.simulateThenPlotOrSave(simulate, plot)\n";
+
+    std::function<std::string(double)> printFunc(const IDetector2D *detector);
+
+}
+
+ExportToPython::ExportToPython(const MultiLayer& multilayer)
+    : m_label(new SampleLabelHandler())
+{
+    for( auto x: multilayer.containedMaterials() )
+        m_label->insertMaterial(x);
+    for( auto x: multilayer.containedSubclass<Layer>() )
+        m_label->insertLayer(x);
+    for( auto x: multilayer.containedSubclass<LayerRoughness>() )
+        m_label->insertRoughness(x);
+    for( auto x: multilayer.containedSubclass<MultiLayer>() )
+        m_label->insertMultiLayer(x);
+    for( auto x: multilayer.containedSubclass<IFormFactor>() )
+        m_label->insertFormFactor(x);
+    for( auto x: multilayer.containedSubclass<IInterferenceFunction>() )
+        m_label->insertInterferenceFunction(x);
+    for( auto x: multilayer.containedSubclass<Particle>() )
+        m_label->insertParticle(x);
+    for( auto x: multilayer.containedSubclass<ParticleCoreShell>() )
+        m_label->insertParticleCoreShell(x);
+    for( auto x: multilayer.containedSubclass<ParticleComposition>() )
+        m_label->insertParticleComposition(x);
+    for( auto x: multilayer.containedSubclass<ParticleDistribution>() )
+        m_label->insertParticleDistribution(x);
+    for( auto x: multilayer.containedSubclass<ILayout>() )
+        m_label->insertLayout(x);
+    for( auto x: multilayer.containedSubclass<IRotation>() )
+        m_label->insertRotation(x);
+    if( multilayer.containedSubclass<MesoCrystal>().size() )
+        throw Exceptions::NotImplementedException(
+            "ExportToPython: class MesoCrystal not yet supported!");
+}
+
+ExportToPython::~ExportToPython()
+{
+    delete m_label;
+}
+
+//! Returns a Python script that sets up a simulation and runs it if invoked as main program.
+
+std::string ExportToPython::simulationToPythonLowlevel(const GISASSimulation* simulation)
+{
+    return preamble
+        + defineGetSample()
+        + defineGetSimulation(simulation)
+        + definePlot(simulation)
+        + defineSimulate
+        + mainProgram;
+}
+
+std::string ExportToPython::defineGetSimulation(const GISASSimulation* simulation) const
+{
+    std::ostringstream result;
+    result << "def getSimulation():\n";
+    //    result << indent() << "# Creating and returning GISAXS simulation\n";
+    result << indent() << "simulation = ba.GISASSimulation()\n";
+    result << defineDetector(simulation);
+    result << defineDetectorResolutionFunction(simulation);
+    result << defineBeam(simulation);
+    result << defineParameterDistributions(simulation);
+    result << defineMasks(simulation);
+    result << defineSimulationOptions(simulation);
+    result << indent() << "return simulation\n\n\n";
+    return result.str();
+}
+
+std::string ExportToPython::defineGetSample() const
+{
+    return "def getSample():\n"
+        + defineMaterials()
+        + defineLayers()
+        + defineFormFactors()
+        + defineParticles()
+        + defineCoreShellParticles()
+        + defineParticleCompositions()
+        + defineParticleDistributions()
+        + defineInterferenceFunctions()
+        + defineParticleLayouts()
+        + defineRoughnesses()
+        + addLayoutsToLayers()
+        + defineMultiLayers()
+        + "\n";
+}
+
+std::string ExportToPython::defineMaterials() const
+{
+    const auto themap = m_label->getMaterialMap();
+    if (themap->size() == 0)
+        return "# No Materials.\n\n";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << indent() << "# Defining Materials\n";
+    std::set<std::string> visitedMaterials;
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        if (visitedMaterials.find(it->second) != visitedMaterials.end())
+            continue;
+        visitedMaterials.insert(it->second);
+        const IMaterial* p_material = it->first;
+        complex_t ri = p_material->getRefractiveIndex();
+        double delta = 1.0 - std::real(ri);
+        double beta = std::imag(ri);
+        if (p_material->isScalarMaterial()) {
+            result << indent() << m_label->getLabelMaterial(p_material)
+                   << " = ba.HomogeneousMaterial(\"" << p_material->getName()
+                   << "\", " << printDouble(delta) << ", "
+                   << printDouble(beta) << ")\n";
+        } else {
+            const HomogeneousMagneticMaterial* p_mag_material
+                = dynamic_cast<const HomogeneousMagneticMaterial*>(p_material);
+            if (p_mag_material == 0)
+                throw Exceptions::RuntimeErrorException(
+                    "ExportToPython::defineMaterials: "
+                    "Non scalar material should be of type HomogeneousMagneticMaterial");
+            kvector_t magnetic_field = p_mag_material->getMagneticField();
+            result << indent() << "magnetic_field = kvector_t(" << magnetic_field.x() << ", "
+                   << magnetic_field.y() << ", " << magnetic_field.z() << ", "
+                   << ")\n";
+            result << indent() << m_label->getLabelMaterial(p_material)
+                   << " = ba.HomogeneousMagneticMaterial(\"" << p_material->getName();
+            result << "\", " << printDouble(delta) << ", "
+                   << printDouble(beta) << ", "
+                   << "magnetic_field)\n";
+        }
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineLayers() const
+{
+    const auto themap = m_label->getLayerMap();
+    if (themap->size() == 0)
+        return "# No Layers.\n\n";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Layers\n";
+    for (auto it=themap->begin(); it != themap->end(); ++it) {
+        const Layer* layer = it->first;
+        result << indent() << it->second << " = ba.Layer(" <<
+            m_label->getLabelMaterial(layer->getMaterial());
+        if (layer->getThickness() != 0)
+            result << ", " << layer->getThickness();
+        result << ")\n";
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineFormFactors() const
+{
+    const auto themap = m_label->getFormFactorMap();
+    if (themap->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Form Factors\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        const IFormFactor* p_ff = it->first;
+        result << indent() << it->second << " = ba.FormFactor" << p_ff->getName() << "("
+               << argumentList(p_ff) << ")\n";
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineParticles() const
+{
+    const auto themap = m_label->getParticleMap();
+    if (themap->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Particles\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        const Particle* p_particle = it->first;
+        std::string particle_name = it->second;
+        result << indent() << particle_name << " = ba.Particle("
+               << m_label->getLabelMaterial(p_particle->getMaterial()) << ", "
+               << m_label->getLabelFormFactor(p_particle->getFormFactor()) << ")\n";
+        setRotationInformation(p_particle, particle_name, result);
+        setPositionInformation(p_particle, particle_name, result);
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineCoreShellParticles() const
+{
+    const auto themap = m_label->getParticleCoreShellMap();
+    if (themap->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Core Shell Particles\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        const ParticleCoreShell* p_coreshell = it->first;
+        result << "\n" << indent() << it->second << " = ba.ParticleCoreShell("
+               << m_label->getLabelParticle(p_coreshell->getShellParticle()) << ", "
+               << m_label->getLabelParticle(p_coreshell->getCoreParticle()) << ")\n";
+        std::string core_shell_name = it->second;
+        setRotationInformation(p_coreshell, core_shell_name, result);
+        setPositionInformation(p_coreshell, core_shell_name, result);
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineParticleDistributions() const
+{
+    const auto themap = m_label->getParticleDistributionsMap();
+    if (themap->size() == 0)
+        return "";
+
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining particles with parameter following a distribution\n";
+
+    int index(1);
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        ParameterDistribution par_distr = it->first->getParameterDistribution();
+
+        // building distribution functions
+        std::stringstream s_distr;
+        s_distr << "distr_" << index;
+
+        result << indent() << s_distr.str()
+               << " = ba." << par_distr.getDistribution()->getName() << "("
+               << argumentList(par_distr.getDistribution()) << ")\n";
+
+        // building parameter distribution
+        std::stringstream s_par_distr;
+        s_par_distr << "par_distr_" << index;
+
+        result << indent() << s_par_distr.str() << " = ba.ParameterDistribution("
+               << "\"" << par_distr.getMainParameterName() << "\""
+               << ", " << s_distr.str() << ", " << par_distr.getNbrSamples() << ", "
+               << printDouble(par_distr.getSigmaFactor()) << ")\n";
+
+        // linked parameters
+        std::vector<std::string> linked_pars = par_distr.getLinkedParameterNames();
+        if(linked_pars.size()) {
+            result << indent() << s_par_distr.str();
+            for(size_t i=0; i<linked_pars.size(); ++i)
+                result << ".linkParameter(\"" << linked_pars[i] << "\")";
+            result << "\n";
+        }
+
+        result << indent() << it->second << " = ba.ParticleDistribution("
+               << m_label->getLabelParticle(it->first->getParticle())
+               << ", " << s_par_distr.str() << ")\n";
+        index++;
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineParticleCompositions() const
+{
+    const auto themap = m_label->getParticleCompositionMap();
+    if (themap->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining composition of particles at specific positions\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        const ParticleComposition* p_particle_composition = it->first;
+        std::string particle_composition_name = it->second;
+        result << indent() << particle_composition_name << " = ba.ParticleComposition()\n";
+        for (size_t i = 0; i < p_particle_composition->getNbrParticles(); ++i) {
+            result << indent() << particle_composition_name << ".addParticle("
+                   << m_label->getLabelParticle(p_particle_composition->getParticle(i))
+            << ")\n";
+        }
+        setRotationInformation(p_particle_composition, particle_composition_name, result);
+        setPositionInformation(p_particle_composition, particle_composition_name, result);
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineInterferenceFunctions() const
+{
+    const auto themap = m_label->getInterferenceFunctionMap();
+    if (themap->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Interference Functions\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        const IInterferenceFunction* interference = it->first;
+
+        if (dynamic_cast<const InterferenceFunctionNone*>(interference))
+            result << indent() << it->second << " = ba.InterferenceFunctionNone()\n";
+
+        else if (const auto* oneDLattice
+                 = dynamic_cast<const InterferenceFunction1DLattice*>(interference)) {
+            const Lattice1DParameters latticeParameters = oneDLattice->getLatticeParameters();
+            result << indent() << it->second << " = ba.InterferenceFunction1DLattice("
+                   << printNm(latticeParameters.m_length) << ", "
+                   << printDegrees(latticeParameters.m_xi) << ")\n";
+
+            const IFTDecayFunction1D* pdf = oneDLattice->getDecayFunction();
+
+            if (pdf->getOmega() != 0.0)
+                result << indent() << it->second << "_pdf  = ba." << pdf->getName()
+                       << "(" << argumentList(pdf) << ")\n"
+                       << indent() << it->second << ".setDecayFunction(" << it->second << "_pdf)\n";
+        }
+
+        else if (const auto* oneDParaCrystal
+                 = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(interference)) {
+            result << indent() << it->second << " = ba.InterferenceFunctionRadialParaCrystal("
+                   << printNm(oneDParaCrystal->getPeakDistance()) << ", "
+                   << printNm(oneDParaCrystal->getDampingLength()) << ")\n";
+
+            if (oneDParaCrystal->getKappa() != 0.0)
+                result << indent() << it->second << ".setKappa("
+                       << printDouble(oneDParaCrystal->getKappa()) << ")\n";
+
+            if (oneDParaCrystal->getDomainSize() != 0.0)
+                result << indent() << it->second << ".setDomainSize("
+                       << printDouble(oneDParaCrystal->getDomainSize()) << ")\n";
+
+            const IFTDistribution1D* pdf = oneDParaCrystal->getProbabilityDistribution();
+
+            if (pdf->getOmega() != 0.0)
+                result << indent() << it->second << "_pdf  = ba." << pdf->getName()
+                       << "(" << argumentList(pdf) << ")\n"
+                       << indent() << it->second << ".setProbabilityDistribution(" << it->second
+                       << "_pdf)\n";
+        }
+
+        else if (const auto* twoDLattice
+                 = dynamic_cast<const InterferenceFunction2DLattice*>(interference)) {
+            const Lattice2DParameters latticeParameters = twoDLattice->getLatticeParameters();
+            result << indent() << it->second << " = ba.InterferenceFunction2DLattice("
+                   << printNm(latticeParameters.m_length_1) << ", "
+                   << printNm(latticeParameters.m_length_2) << ", "
+                   << printDegrees(latticeParameters.m_angle) << ", "
+                   << printDegrees(latticeParameters.m_xi) << ")\n";
+
+            const IFTDecayFunction2D* pdf = twoDLattice->getDecayFunction();
+
+            result << indent() << it->second << "_pdf  = ba." << pdf->getName()
+                   << "(" << argumentList(pdf) << ")\n"
+                   << indent() << it->second << ".setDecayFunction(" << it->second << "_pdf)\n";
+        }
+
+        else if (const auto* twoDParaCrystal
+                 = dynamic_cast<const InterferenceFunction2DParaCrystal*>(interference)) {
+            std::vector<double> domainSize = twoDParaCrystal->getDomainSizes();
+            if (isSquare(twoDParaCrystal->getLatticeParameters().m_length_1,
+                                     twoDParaCrystal->getLatticeParameters().m_length_2,
+                                     twoDParaCrystal->getLatticeParameters().m_angle)) {
+                result << indent() << it->second
+                       << " = ba.InterferenceFunction2DParaCrystal.createSquare("
+                       << printNm(twoDParaCrystal->getLatticeParameters().m_length_1)
+                       << ", "
+                       << printNm(twoDParaCrystal->getDampingLength()) << ", "
+                       << printNm(domainSize[0]) << ", "
+                       << printNm(domainSize[1]) << ")\n";
+            }
+
+            else if (isHexagonal(twoDParaCrystal->getLatticeParameters().m_length_1,
+                                             twoDParaCrystal->getLatticeParameters().m_length_2,
+                                             twoDParaCrystal->getLatticeParameters().m_angle)) {
+                result << indent() << it->second
+                       << " = ba.InterferenceFunction2DParaCrystal.createHexagonal("
+                       << printNm(twoDParaCrystal->getLatticeParameters().m_length_1)
+                       << ", "
+                       << printNm(twoDParaCrystal->getDampingLength()) << ", "
+                       << printNm(domainSize[0]) << ", "
+                       << printNm(domainSize[1]) << ")\n";
+            }
+
+            else {
+                result << indent() << it->second << " = ba.InterferenceFunction2DParaCrystal("
+                       << printNm(twoDParaCrystal->getLatticeParameters().m_length_1)
+                       << ", "
+                       << printNm(twoDParaCrystal->getLatticeParameters().m_length_2)
+                       << ", "
+                       << printDegrees(twoDParaCrystal->getLatticeParameters().m_angle)
+                       << ", "
+                       << printDegrees(twoDParaCrystal->getLatticeParameters().m_xi)
+                       << ", "
+                       << printNm(twoDParaCrystal->getDampingLength()) << ")\n";
+
+                if (domainSize[0] != 0 || domainSize[1] != 0)
+                    result << indent() << it->second << ".setDomainSizes("
+                           << printNm(domainSize[0]) << ", "
+                           << printNm(domainSize[1]) << ")\n";
+
+                if (twoDParaCrystal->getIntegrationOverXi() == true)
+                    result << indent() << it->second << ".setIntegrationOverXi(True)\n";
+            }
+
+            std::vector<const IFTDistribution2D*> pdf_vector
+                = twoDParaCrystal->getProbabilityDistributions();
+            const IFTDistribution2D* pdf = pdf_vector[0];
+
+            result << indent() << it->second << "_pdf_1  = ba." << pdf->getName()
+                   << "(" << argumentList(pdf) << ")\n";
+
+            pdf = pdf_vector[1];
+
+            result << indent() << it->second << "_pdf_2  = ba." << pdf->getName()
+                   << "(" << argumentList(pdf) << ")\n";
+
+            result << indent() << it->second << ".setProbabilityDistributions(" << it->second
+                   << "_pdf_1, " << it->second << "_pdf_2)\n";
+        }
+
+        else
+            throw Exceptions::NotImplementedException(
+                "Bug: ExportToPython::defineInterferenceFunctions() called with unexpected "
+                "IInterferenceFunction " + interference->getName());
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineParticleLayouts() const
+{
+    const auto themap = m_label->getParticleLayoutMap();
+    if (themap->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Particle Layouts and adding Particles\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        const ILayout* iLayout = it->first;
+        if (const ParticleLayout* particleLayout = dynamic_cast<const ParticleLayout*>(iLayout)) {
+            result << indent() << it->second << " = ba.ParticleLayout()\n";
+            size_t numberOfParticles = particleLayout->getNumberOfParticles();
+            size_t particleIndex = 0;
+
+            while (particleIndex != numberOfParticles) {
+                const IAbstractParticle* p_particle = particleLayout->getParticle(particleIndex);
+                double abundance = particleLayout->getAbundanceOfParticle(particleIndex);
+                result << indent() << it->second << ".addParticle("
+                       << m_label->getLabelParticle(p_particle) << ", "
+                       << printDouble(abundance) << ")\n";
+                particleIndex++;
+            }
+
+            if( const IInterferenceFunction* p_iff = particleLayout->getInterferenceFunction() )
+                result << indent() << it->second << ".addInterferenceFunction("
+                       << m_label->getLabelInterferenceFunction(p_iff) << ")\n";
+
+            switch (particleLayout->getApproximation()) {
+            case ILayout::DA:
+                break;
+            case ILayout::SSCA:
+                result << indent() << it->second << ".setApproximation(ba.ILayout.SSCA)\n";
+                break;
+            }
+            result << indent() << it->second << ".setTotalParticleSurfaceDensity("
+                   << it->first->getTotalParticleSurfaceDensity() << ")\n";
+        }
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineRoughnesses() const
+{
+    const auto themap = m_label->getLayerRoughnessMap();
+    if (themap->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Roughness Parameters\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it)
+        result << indent() << it->second << " = ba.LayerRoughness("
+               <<  argumentList(it->first) << ")\n";
+    return result.str();
+}
+
+std::string ExportToPython::addLayoutsToLayers() const
+{
+    if (m_label->getParticleLayoutMap()->size() == 0)
+        return "";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Adding layouts to layers";
+    const auto layermap = m_label->getLayerMap();
+    for (auto it=layermap->begin(); it!=layermap->end(); ++it) {
+        const Layer* layer = it->first;
+        size_t numberOfLayouts = layer->getNumberOfLayouts();
+        for(size_t i = 0; i < numberOfLayouts; ++i)
+            result << "\n" << indent() << it->second << ".addLayout("
+                   << m_label->getLabelLayout(layer->getLayout(i)) << ")\n";
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineMultiLayers() const
+{
+    const auto themap = m_label->getMultiLayerMap();
+    if (themap->size() == 0)
+        return "# No MultiLayers.\n\n";
+    std::ostringstream result;
+    result << std::setprecision(12);
+    result << "\n" << indent() << "# Defining Multilayers\n";
+    for (auto it=themap->begin(); it!=themap->end(); ++it) {
+        result << indent() << it->second << " = ba.MultiLayer()\n";
+
+        size_t numberOfLayers = it->first->getNumberOfLayers();
+
+        if (numberOfLayers) {
+            result << indent() << it->second << ".addLayer("
+                   << m_label->getLabelLayer(it->first->getLayer(0)) << ")\n";
+
+            size_t layerIndex = 1;
+            while (layerIndex != numberOfLayers) {
+                const LayerInterface* layerInterface = it->first->getLayerInterface(layerIndex - 1);
+                if (m_label->getLayerRoughnessMap()->find(layerInterface->getRoughness())
+                    == m_label->getLayerRoughnessMap()->end())
+                    result << indent() << it->second << ".addLayer("
+                           << m_label->getLabelLayer(it->first->getLayer(layerIndex)) << ")\n";
+                else
+                    result << indent() << it->second << ".addLayerWithTopRoughness("
+                           << m_label->getLabelLayer(it->first->getLayer(layerIndex)) << ", "
+                           << m_label->getLabelRoughness(layerInterface->getRoughness()) << ")\n";
+                layerIndex++;
+            }
+        }
+        result << indent() << "return " << it->second << "\n";
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineDetector(const GISASSimulation* simulation) const
+{
+    const IDetector2D* iDetector = simulation->getInstrument().getDetector();
+
+    if (iDetector->getDimension() != 2)
+        throw Exceptions::RuntimeErrorException("ExportToPython::defineDetector: "
+                                                "detector must be two-dimensional for GISAS");
+
+    std::ostringstream result;
+    result << std::setprecision(12);
+
+    if(auto detector = dynamic_cast<const SphericalDetector*>(iDetector)) {
+        result << indent() << "simulation.setDetectorParameters(";
+        for(size_t index=0; index<detector->getDimension(); ++index) {
+            if (index != 0) result << ", ";
+            result << detector->getAxis(index).size() << ", "
+                   << printDegrees(detector->getAxis(index).getMin()) << ", "
+                   << printDegrees(detector->getAxis(index).getMax());
+        }
+        result << ")\n";
+
+    } else if(auto detector = dynamic_cast<const RectangularDetector*>(iDetector)) {
+        result << indent() << "\n";
+        result << indent() << "detector = ba.RectangularDetector("
+               << detector->getNbinsX() << ", "
+               << printDouble(detector->getWidth()) << ", "
+               << detector->getNbinsY() << ", "
+               << printDouble(detector->getHeight()) << ")\n";
+        if(detector->getDetectorArrangment() == RectangularDetector::GENERIC) {
+            result << indent() << "detector.setPosition("
+                   << printKvector(detector->getNormalVector()) << ", "
+                   << printDouble(detector->getU0()) << ", "
+                   << printDouble(detector->getV0());
+            if(!isDefaultDirection(detector->getDirectionVector()))
+                result << ", " << printKvector(detector->getDirectionVector());
+            result << ")\n";
+
+        } else if (detector->getDetectorArrangment()
+                   == RectangularDetector::PERPENDICULAR_TO_SAMPLE) {
+            result << indent() << "detector.setPerpendicularToSampleX("
+                   << printDouble(detector->getDistance()) << ", "
+                   << printDouble(detector->getU0()) << ", "
+                   << printDouble(detector->getV0()) << ")\n";
+
+        } else if (detector->getDetectorArrangment()
+                   == RectangularDetector::PERPENDICULAR_TO_DIRECT_BEAM) {
+            result << indent() << "detector.setPerpendicularToDirectBeam("
+                   << printDouble(detector->getDistance()) << ", "
+                   << printDouble(detector->getU0()) << ", "
+                   << printDouble(detector->getV0()) << ")\n";
+
+        } else if (detector->getDetectorArrangment()
+                   == RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM) {
+            result << indent() << "detector.setPerpendicularToReflectedBeam("
+                   << printDouble(detector->getDistance()) << ", "
+                   << printDouble(detector->getU0()) << ", "
+                   << printDouble(detector->getV0()) << ")\n";
+
+
+        } else if (detector->getDetectorArrangment()
+                   == RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM_DPOS) {
+            result << indent() << "detector.setPerpendicularToReflectedBeam("
+                   << printDouble(detector->getDistance()) << ")\n";
+            result << indent() << "detector.setDirectBeamPosition("
+                   << printDouble(detector->getDirectBeamU0()) << ", "
+                   << printDouble(detector->getDirectBeamV0()) << ")\n";
+
+        } else
+            throw Exceptions::RuntimeErrorException(
+                "ExportToPython::defineDetector: unknown alignment");
+
+        result << indent() << "simulation.setDetector(detector)\n";
+
+    } else
+        throw Exceptions::RuntimeErrorException("ExportToPython::defineDetector: unknown detector");
+
+    if(iDetector->regionOfInterest()) {
+        result << indent() << "simulation.setRegionOfInterest("
+               << printFunc(iDetector)(iDetector->regionOfInterest()->getXlow()) << ", "
+               << printFunc(iDetector)(iDetector->regionOfInterest()->getYlow()) << ", "
+               << printFunc(iDetector)(iDetector->regionOfInterest()->getXup()) << ", "
+               << printFunc(iDetector)(iDetector->regionOfInterest()->getYup()) << ")\n";
+    }
+    result << indent() << "\n";
+
+    return result.str();
+}
+
+std::string ExportToPython::defineDetectorResolutionFunction(
+    const GISASSimulation* simulation) const
+{
+    std::ostringstream result;
+    const IDetector2D* detector = simulation->getInstrument().getDetector();
+
+    if (const IDetectorResolution* p_resfunc = detector->getDetectorResolutionFunction()) {
+        if ( auto* p_convfunc = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) {
+            if (auto* resfunc = dynamic_cast<const ResolutionFunction2DGaussian*>(
+                    p_convfunc->getResolutionFunction2D())) {
+                result << indent() << "simulation.setDetectorResolutionFunction(";
+                result << "ba.ResolutionFunction2DGaussian(";
+                result << printFunc(detector)(resfunc->getSigmaX()) << ", ";
+                result << printFunc(detector)(resfunc->getSigmaY()) << "))\n";
+            } else {
+                throw Exceptions::RuntimeErrorException(
+                    "ExportToPython::defineDetectorResolutionFunction() -> Error. "
+                    "Unknown detector resolution function");
+            }
+        } else
+            throw Exceptions::RuntimeErrorException(
+                "ExportToPython::defineDetectorResolutionFunction() -> Error. "
+                "Not a ConvolutionDetectorResolution function");
+    }
+
+    return result.str();
+}
+
+std::string ExportToPython::defineBeam(const GISASSimulation* simulation) const
+{
+    std::ostringstream result;
+    result << std::setprecision(12);
+    // result << indent() << "# Defining Beam Parameters\n";
+    const Beam& beam = simulation->getInstrument().getBeam();
+    result << indent() << "simulation.setBeamParameters("
+           << printNm(beam.getWavelength()) << ", "
+           << printDegrees(beam.getAlpha()) << ", "
+           << printDegrees(beam.getPhi()) << ")\n";
+    double beam_intensity = beam.getIntensity();
+    if(beam_intensity > 0.0)
+        result << indent() << "simulation.setBeamIntensity("
+               << printScientificDouble(beam_intensity) << ")\n";
+    return result.str();
+}
+
+std::string ExportToPython::defineParameterDistributions(const GISASSimulation* simulation) const
+{
+    std::ostringstream result;
+    const std::vector<ParameterDistribution>& distributions =
+            simulation->getDistributionHandler().getDistributions();
+    if (distributions.size()==0) return "";
+    for (size_t i=0; i<distributions.size(); ++i) {
+        std::string main_par_name = distributions[i].getMainParameterName();
+        size_t nbr_samples = distributions[i].getNbrSamples();
+        double sigma_factor = distributions[i].getSigmaFactor();
+        const IDistribution1D* p_distr = distributions[i].getDistribution();
+        result << indent() << "distribution_" << i+1 << " = ba."
+               << std::setprecision(12) << p_distr->getName() << "("
+               << argumentList(p_distr) << ")\n"
+               << indent() << "simulation.addParameterDistribution(\"" << main_par_name << "\", "
+               << "distribution_" << i+1 << ", " << nbr_samples << ", "
+               << printDouble(sigma_factor) << ")\n";
+    }
+    return result.str();
+}
+
+std::string ExportToPython::defineMasks(const GISASSimulation* simulation) const
+{
+    std::ostringstream result;
+    result << std::setprecision(12);
+
+    const IDetector2D* detector = simulation->getInstrument().getDetector();
+    const DetectorMask* detectorMask = detector->getDetectorMask();
+    if(detectorMask && detectorMask->numberOfMasks()) {
+        result << "\n";
+        for(size_t i_mask=0; i_mask<detectorMask->numberOfMasks(); ++i_mask) {
+            bool mask_value(false);
+            const Geometry::IShape2D* shape = detectorMask->getMaskShape(i_mask, mask_value);
+            result << representShape2D(indent(), shape, mask_value, printFunc(detector));
+        }
+        result << "\n";
+    }
+
+    return result.str();
+}
+
+std::string ExportToPython::defineSimulationOptions(const GISASSimulation* simulation) const
+{
+    std::ostringstream result;
+    result << std::setprecision(12);
+
+    const SimulationOptions& options = simulation->getOptions();
+    if(options.getHardwareConcurrency() != options.getNumberOfThreads())
+        result << indent() << "simulation.getOptions().setNumberOfThreads("
+               << options.getNumberOfThreads() << ")\n";
+    if(options.isIntegrate())
+        result << indent() << "simulation.getOptions().setMonteCarloIntegration(True, "
+               << options.getMcPoints() << ")\n";
+    return result.str();
+}
+
+std::string ExportToPython::definePlot(const GISASSimulation* simulation) const
+{
+    std::ostringstream result;
+    result << std::setprecision(12) <<
+        "def plot(intensities):\n"
+        "    import matplotlib.colors\n"
+        "    from matplotlib import pyplot as plt\n"
+        "    im = plt.imshow(intensities.getArray(), "
+        "norm=matplotlib.colors.LogNorm(1, intensities.getMaximum()), extent=[";
+    const Instrument& instrument = simulation->getInstrument();
+    std::vector<std::string> entries;
+    for (size_t i=0; i<instrument.getDetectorDimension(); ++ i)
+        entries.push_back( printDegrees(instrument.getDetectorAxis(i).getMin()) + ", " +
+                           printDegrees(instrument.getDetectorAxis(i).getMax()) );
+    result << Utils::String::join( entries, ", " ) << "]) \n";
+    result <<
+        "    plt.colorbar(im)\n"
+        "    plt.show()\n\n\n";
+    return result.str();
+}
+
+std::string ExportToPython::indent() const
+{
+    return "    ";
+}
+
+void ExportToPython::setRotationInformation(
+    const IParticle* p_particle, std::string name, std::ostringstream& result) const
+{
+    if (p_particle->getRotation()) {
+        double alpha, beta, gamma;
+        p_particle->getRotation()->getTransform3D().calculateEulerAngles(&alpha, &beta, &gamma);
+        switch (p_particle->getRotation()->getTransform3D().getRotationType()) {
+        case Transform3D::EULER:
+            result << indent() << name << "_rotation = ba.RotationEuler("
+                   << printDegrees(alpha) << ", " << printDegrees(beta)
+                   << ", " << printDegrees(gamma) << ")\n";
+            break;
+        case Transform3D::XAXIS:
+            result << indent() << name << "_rotation = ba.RotationX("
+                   << printDegrees(beta) << ")\n";
+            break;
+        case Transform3D::YAXIS:
+            result << indent() << name << "_rotation = ba.RotationY("
+                   << printDegrees(gamma) << ")\n";
+            break;
+        case Transform3D::ZAXIS:
+            result << indent() << name << "_rotation = ba.RotationZ("
+                   << printDegrees(alpha) << ")\n";
+            break;
+        default:
+            break;
+        }
+        result << indent() << name << ".setRotation(" << name << "_rotation)\n";
+    }
+}
+
+void ExportToPython::setPositionInformation(
+    const IParticle* p_particle, std::string name, std::ostringstream& result) const
+{
+    kvector_t pos = p_particle->getPosition();
+    bool has_position_info = (pos != kvector_t());
+
+    if (has_position_info) {
+        result << indent() << name
+               << "_position = kvector_t("
+               << printNm(pos.x()) << ", "
+               << printNm(pos.y()) << ", "
+               << printNm(pos.z()) << ")\n";
+
+        result << indent()
+               << name << ".setPosition("
+               << name << "_position)\n";
+    }
+}
+
+//! Returns print function for given detector type.
+namespace {
+std::function<std::string (double)> printFunc(const IDetector2D *detector)
+{
+    std::function<std::string(double)> result;
+
+    if(detector->getDefaultAxesUnits() == IDetector2D::MM) {
+        result = PythonFormatting::printDouble;
+    } else if(detector->getDefaultAxesUnits() == IDetector2D::RADIANS) {
+        result = PythonFormatting::printDegrees;
+    } else {
+        throw Exceptions::RuntimeErrorException("ExportToPython::defineMasks() -> Error. Unknown "
+                                                "detector units.");
+    }
+
+    return result;
+}
+}
diff --git a/Core/Export/ExportToPython.h b/Core/Export/ExportToPython.h
new file mode 100644
index 0000000..bb6d51a
--- /dev/null
+++ b/Core/Export/ExportToPython.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Export/ExportToPython.h
+//! @brief     Defines class ExportToPython.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef EXPORTTOPYTHON_H
+#define EXPORTTOPYTHON_H
+
+#include "WinDllMacros.h"
+#include <string>
+
+class GISASSimulation;
+class IParticle;
+class MultiLayer;
+class SampleLabelHandler;
+
+//! Write a Python script that allows to run the current simulation.
+
+class BA_CORE_API_ ExportToPython
+{
+public:
+    ExportToPython(const MultiLayer& multilayer);
+    virtual ~ExportToPython();
+
+    std::string simulationToPythonLowlevel(const GISASSimulation* simulation);
+    std::string defineGetSample() const;
+
+private:
+    std::string definePreamble() const;
+    std::string defineGetSimulation(const GISASSimulation* simulation) const;
+    std::string defineMaterials() const;
+    std::string defineLayers() const;
+    std::string defineFormFactors() const;
+    std::string defineParticles() const;
+    std::string defineCoreShellParticles() const;
+    std::string defineParticleDistributions() const;
+    std::string defineParticleCompositions() const;
+    std::string defineInterferenceFunctions() const;
+    std::string defineParticleLayouts() const;
+    std::string defineRoughnesses() const;
+    std::string addLayoutsToLayers() const;
+    std::string defineMultiLayers() const;
+    std::string defineDetector(const GISASSimulation* simulation) const;
+    std::string defineDetectorResolutionFunction(const GISASSimulation* simulation) const;
+    std::string defineBeam(const GISASSimulation* simulation) const;
+    std::string defineParameterDistributions(const GISASSimulation* simulation) const;
+    std::string defineMasks(const GISASSimulation* simulation) const;
+    std::string defineSimulationOptions(const GISASSimulation* simulation) const;
+    std::string definePlot(const GISASSimulation* simulation) const;
+
+    std::string indent() const;
+    void setRotationInformation(const IParticle* particle, std::string particle_name,
+                                std::ostringstream& result) const;
+    void setPositionInformation(const IParticle* particle, std::string particle_name,
+                                std::ostringstream& result) const;
+
+    SampleLabelHandler* m_label;
+};
+
+#endif // EXPORTTOPYTHON_H
diff --git a/Core/Export/PythonFormatting.cpp b/Core/Export/PythonFormatting.cpp
new file mode 100644
index 0000000..5817f73
--- /dev/null
+++ b/Core/Export/PythonFormatting.cpp
@@ -0,0 +1,232 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Export/PythonFormatting.cpp
+//! @brief     Implements functions from PythonFormatting namespace.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "PythonFormatting.h"
+#include "Ellipse.h"
+#include "GISASSimulation.h"
+#include "IInterferenceFunction.h"
+#include "IShape2D.h"
+#include "InfinitePlane.h"
+#include "IParameterized.h"
+#include "IMultiLayerBuilder.h"
+#include "Line.h"
+#include "Macros.h"
+#include "MultiLayer.h"
+#include "Numeric.h"
+#include "ParameterPool.h"
+#include "Polygon.h"
+#include "ExportToPython.h"
+#include "RealParameter.h"
+#include "Rectangle.h"
+#include "MathConstants.h"
+#include "Utils.h"
+#include "Units.h"
+#include "IDetector2D.h"
+#include <iomanip>
+GCC_DIAG_OFF(missing-field-initializers)
+GCC_DIAG_OFF(unused-parameter)
+GCC_DIAG_ON(unused-parameter)
+GCC_DIAG_ON(missing-field-initializers)
+
+std::string PythonFormatting::simulationToPython(GISASSimulation* simulation)
+{
+    simulation->prepareSimulation();
+    std::unique_ptr<ISample> sample;
+    if(simulation->getSample())
+        sample.reset(simulation->getSample()->clone());
+    else
+        sample.reset(simulation->getSampleBuilder()->buildSample());
+    MultiLayer* multilayer = dynamic_cast<MultiLayer*>(sample.get());
+    ExportToPython visitor(*multilayer);
+    std::ostringstream result;
+    result << visitor.simulationToPythonLowlevel(simulation);
+    return result.str();
+}
+
+namespace PythonFormatting {
+
+//! Returns fixed Python code snippet that defines the function "runSimulation".
+
+std::string representShape2D(const std::string& indent, const Geometry::IShape2D* ishape,
+                             bool mask_value, std::function<std::string(double)> printValueFunc)
+{
+    std::ostringstream result;
+    result << std::setprecision(12);
+
+    if (const Geometry::Polygon* shape = dynamic_cast<const Geometry::Polygon*>(ishape)) {
+        std::vector<double> xpos, ypos;
+        shape->getPoints(xpos, ypos);
+        result << indent << "points = [";
+        for(size_t i=0; i<xpos.size(); ++i) {
+            result << "[" << printValueFunc(xpos[i]) << ", " <<
+                printValueFunc(ypos[i]) << "]";
+            if(i!= xpos.size()-1) result << ", ";
+        }
+        result << "]\n";
+        result << indent << "simulation.addMask(" <<
+            "ba.Polygon(points), " << printBool(mask_value) << ")\n";
+
+    } else if(dynamic_cast<const Geometry::InfinitePlane*>(ishape)) {
+        result << indent << "simulation.maskAll()\n";
+
+    } else if(const Geometry::Ellipse* shape = dynamic_cast<const Geometry::Ellipse*>(ishape)) {
+        result << indent << "simulation.addMask(";
+        result << "ba.Ellipse("
+               << printValueFunc(shape->getCenterX()) << ", "
+               << printValueFunc(shape->getCenterY()) << ", "
+               << printValueFunc(shape->getRadiusX()) << ", "
+               << printValueFunc(shape->getRadiusY());
+        if(shape->getTheta() != 0.0) result << ", " << printDegrees(shape->getTheta());
+        result << "), " << printBool(mask_value) << ")\n";
+    }
+
+    else if(const Geometry::Rectangle* shape = dynamic_cast<const Geometry::Rectangle*>(ishape)) {
+        result << indent << "simulation.addMask(";
+        result << "ba.Rectangle("
+               << printValueFunc(shape->getXlow()) << ", "
+               << printValueFunc(shape->getYlow()) << ", "
+               << printValueFunc(shape->getXup()) << ", "
+               << printValueFunc(shape->getYup()) << "), "
+               << printBool(mask_value) << ")\n";
+    }
+
+    else if(const Geometry::VerticalLine* shape =
+            dynamic_cast<const Geometry::VerticalLine*>(ishape)) {
+        result << indent << "simulation.addMask(";
+        result << "ba.VerticalLine("
+               << printValueFunc(shape->getXpos()) << "), "
+               << printBool(mask_value) << ")\n";
+    }
+
+    else if(const Geometry::HorizontalLine* shape =
+            dynamic_cast<const Geometry::HorizontalLine*>(ishape)) {
+        result << indent << "simulation.addMask(";
+        result << "ba.HorizontalLine("
+               << printValueFunc(shape->getYpos()) << "), "
+               << printBool(mask_value) << ")\n";
+
+    } else
+        throw Exceptions::RuntimeErrorException(
+            "representShape2D(const IShape2D*) -> Error. Unknown shape");
+
+    return result.str();
+}
+
+std::string printBool(double value)
+{
+    return value ? "True" : "False";
+}
+
+std::string printDouble(double input)
+{
+    std::ostringstream inter;
+    inter << std::setprecision(12);
+    if (std::abs(input) < std::numeric_limits<double>::epsilon()) {
+        inter << "0.0";
+        return inter.str();
+    }
+    inter << input;
+    if (inter.str().find('e') == std::string::npos && inter.str().find('.') == std::string::npos)
+        inter << ".0";
+    return inter.str();
+}
+
+std::string printNm(double input)
+{
+    std::ostringstream inter;
+    inter << std::setprecision(12);
+    inter << printDouble(input) << "*nm";
+    return inter.str();
+}
+
+// 1.000000e+07 -> 1.0e+07
+std::string printScientificDouble(double input)
+{
+    std::ostringstream inter;
+    inter << std::scientific;
+    inter << input;
+
+    std::string::size_type pos = inter.str().find('e');
+    if (pos == std::string::npos)
+        return inter.str();
+
+    std::string part1 = inter.str().substr(0, pos);
+    std::string part2 = inter.str().substr(pos, std::string::npos);
+
+    part1.erase(part1.find_last_not_of('0') + 1, std::string::npos);
+    if (part1.back() == '.') part1 += "0";
+
+    return part1+part2;
+}
+
+std::string printDegrees(double input)
+{
+    std::ostringstream inter;
+    inter << std::setprecision(11) << Units::rad2deg(input);
+    if (inter.str().find('e') == std::string::npos && inter.str().find('.') == std::string::npos)
+        inter << ".0";
+    inter << "*deg";
+    return inter.str();
+}
+
+bool isSquare(double length1, double length2, double angle)
+{
+    return length1==length2 && Numeric::areAlmostEqual(angle, M_PI_2);
+}
+
+bool isHexagonal(double length1, double length2, double angle)
+{
+    return length1==length2 && Numeric::areAlmostEqual(angle, M_TWOPI/3.0);
+}
+
+std::string printKvector(const kvector_t value)
+{
+    std::ostringstream result;
+    result << "kvector_t("
+           << printDouble(value.x()) << ", "
+           << printDouble(value.y()) << ", "
+           << printDouble(value.z()) << ")";
+    return result.str();
+}
+
+//! returns true if it is (0, -1, 0) vector
+bool isDefaultDirection(const kvector_t direction)
+{
+    return
+        Numeric::areAlmostEqual(direction.x(),  0.0) &&
+        Numeric::areAlmostEqual(direction.y(), -1.0) &&
+        Numeric::areAlmostEqual(direction.z(),  0.0);
+}
+
+//! Returns parameter value, followed by its unit multiplicator (like "* nm").
+
+std::string valueTimesUnit(const RealParameter* par)
+{
+    if (par->unit()=="rad")
+        return printDegrees(par->getValue());
+    return printDouble(par->getValue()) + ( par->unit()=="" ? "" : ("*"+par->unit()) );
+}
+
+//! Returns comma-separated list of parameter values, including unit multiplicator (like "* nm").
+
+std::string argumentList(const IParameterized* ip)
+{
+    std::vector<std::string> args;
+    for(const auto* par: ip->getParameterPool()->getParameters())
+        args.push_back( valueTimesUnit(par) );
+    return Utils::String::join( args, ", " );
+}
+
+} // namespace PythonFormatting
diff --git a/Core/Export/PythonFormatting.h b/Core/Export/PythonFormatting.h
new file mode 100644
index 0000000..716e12b
--- /dev/null
+++ b/Core/Export/PythonFormatting.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Export/PythonFormatting.h
+//! @brief     Defines PythonFormatting namespace.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PYTHONFORMATTING_H
+#define PYTHONFORMATTING_H
+
+#include "Vectors3D.h"
+#include <string>
+#include <functional>
+
+namespace Geometry {
+    class IShape2D;
+}
+class GISASSimulation;
+class IDistribution1D;
+class IParameterized;
+class RealParameter;
+
+namespace PythonFormatting {
+    BA_CORE_API_ std::string simulationToPython(GISASSimulation* simulation);
+
+    BA_CORE_API_ std::string representShape2D(const std::string& indent,
+                                              const Geometry::IShape2D* ishape,
+                                              bool mask_value,
+                                              std::function<std::string(double)> printValueFunc);
+    BA_CORE_API_ std::string printBool(double value);
+    BA_CORE_API_ std::string printDouble(double input);
+    BA_CORE_API_ std::string printNm(double input);
+    BA_CORE_API_ std::string printScientificDouble(double input);
+    BA_CORE_API_ std::string printDegrees(double input);
+
+    BA_CORE_API_ bool isSquare(double length1, double length2, double angle);
+    BA_CORE_API_ bool isHexagonal(double length1, double length2, double angle);
+    BA_CORE_API_ std::string printKvector(const kvector_t value);
+    BA_CORE_API_ bool isDefaultDirection(const kvector_t direction);
+    BA_CORE_API_ std::string valueTimesUnit(const RealParameter* par);
+    BA_CORE_API_ std::string argumentList(const IParameterized* ip);
+}
+
+#endif // PYTHONFORMATTING_H
diff --git a/Core/Export/SampleLabelHandler.cpp b/Core/Export/SampleLabelHandler.cpp
new file mode 100644
index 0000000..6d9338f
--- /dev/null
+++ b/Core/Export/SampleLabelHandler.cpp
@@ -0,0 +1,189 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Export/SampleLabelHandler.cpp
+//! @brief     Implement class SampleLabelHandler.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleLabelHandler.h"
+#include "HomogeneousMagneticMaterial.h"
+#include "IInterferenceFunction.h"
+#include "IMaterial.h"
+#include "LayerRoughness.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleCoreShell.h"
+#include "ParticleDistribution.h"
+
+std::string SampleLabelHandler::getLabelFormFactor(const IFormFactor* ff)
+{
+    return m_FormFactorLabel[ff];
+}
+
+std::string SampleLabelHandler::getLabelInterferenceFunction(const IInterferenceFunction* iff)
+{
+    return m_InterferenceFunctionLabel[iff];
+}
+
+std::string SampleLabelHandler::getLabelMaterial(const IMaterial* mat)
+{
+    return m_MaterialLabel[mat];
+}
+
+std::string SampleLabelHandler::getLabelLayer(const Layer* layer)
+{
+    return m_LayerLabel[layer];
+}
+
+std::string SampleLabelHandler::getLabelRoughness(const LayerRoughness* roughness)
+{
+    return m_LayerRoughnessLabel[roughness];
+}
+
+std::string SampleLabelHandler::getLabelMultiLayer(const MultiLayer* ml)
+{
+    return m_MultiLayerLabel[ml];
+}
+
+std::string SampleLabelHandler::getLabelParticle(const IAbstractParticle* absparticle)
+{
+    if (const auto core_shell_particle = dynamic_cast<const ParticleCoreShell*>(absparticle))
+        return m_ParticleCoreShellLabel[core_shell_particle];
+    if (const auto particle = dynamic_cast<const Particle*>(absparticle))
+        return m_ParticleLabel[particle];
+    if (const auto particle = dynamic_cast<const ParticleDistribution*>(absparticle))
+        return m_ParticleDistributionLabel[particle];
+    if (const auto lattice_basis = dynamic_cast<const ParticleComposition*>(absparticle))
+        return m_ParticleCompositionLabel[lattice_basis];
+    throw Exceptions::NotImplementedException(
+        "SampleLabelHandler::getLabel: called for unknown IParticle type");
+}
+
+std::string SampleLabelHandler::getLabelParticleCoreShell(const ParticleCoreShell* pcs)
+{
+    return m_ParticleCoreShellLabel[pcs];
+}
+
+std::string SampleLabelHandler::getLabelParticleDistribution(const ParticleDistribution* pd)
+{
+    return m_ParticleDistributionLabel[pd];
+}
+
+std::string SampleLabelHandler::getLabelLayout(const ILayout* layout)
+{
+    return m_ILayoutLabel[layout];
+}
+
+std::string SampleLabelHandler::getLabelParticleComposition(const ParticleComposition* pc)
+{
+    return m_ParticleCompositionLabel[pc];
+}
+
+std::string SampleLabelHandler::getLabelRotation(const IRotation* rot)
+{
+    return m_RotationsLabel[rot];
+}
+
+void SampleLabelHandler::insertMaterial(const IMaterial* mat)
+{
+    for (auto it=m_MaterialLabel.begin(); it!=m_MaterialLabel.end(); ++it) {
+        if( *(it->first) == *mat ) {
+            m_MaterialLabel.insert(std::make_pair(mat, it->second));
+            return;
+        }
+    }
+    // material not found => create new label
+    std::ostringstream label_stream;
+    label_stream << "material_" << m_MaterialLabel.size()+1;
+    m_MaterialLabel.insert(std::make_pair(mat, label_stream.str()));
+}
+
+void SampleLabelHandler::insertFormFactor(const IFormFactor* sample)
+{
+    std::ostringstream inter;
+    inter << "formFactor_" << m_FormFactorLabel.size()+1;
+    m_FormFactorLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertInterferenceFunction(const IInterferenceFunction* sample)
+{
+    std::ostringstream inter;
+    inter << "interference_" << m_InterferenceFunctionLabel.size()+1;
+    m_InterferenceFunctionLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertLayout(const ILayout* sample)
+{
+    std::ostringstream inter;
+    inter << "layout_" << m_ILayoutLabel.size()+1;
+    m_ILayoutLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertLayer(const Layer* sample)
+{
+    std::ostringstream inter;
+    inter << "layer_" << m_LayerLabel.size()+1;
+    m_LayerLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertRoughness(const LayerRoughness* sample)
+{
+    if(sample->getSigma() != 0 &&
+       sample->getHurstParameter() != 0 &&
+       sample->getLatteralCorrLength() != 0) {
+        std::ostringstream inter;
+        inter << "layerRoughness_" << m_LayerRoughnessLabel.size()+1;
+        m_LayerRoughnessLabel.insert(sample, inter.str());
+    }
+}
+
+void SampleLabelHandler::insertMultiLayer(const MultiLayer* sample)
+{
+    std::ostringstream inter;
+    inter << "multiLayer_" << m_MultiLayerLabel.size()+1;
+    m_MultiLayerLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertParticle(const Particle* sample)
+{
+    std::ostringstream inter;
+    inter << "particle_" << m_ParticleLabel.size()+1;
+    m_ParticleLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertParticleCoreShell(const ParticleCoreShell* sample)
+{
+    std::ostringstream inter;
+    inter << "particleCoreShell_" << m_ParticleCoreShellLabel.size()+1;
+    m_ParticleCoreShellLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertParticleDistribution(const ParticleDistribution* sample)
+{
+    std::ostringstream inter;
+    inter << "particleDistribution_" << m_ParticleDistributionLabel.size()+1;
+    m_ParticleDistributionLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertParticleComposition(const ParticleComposition* sample)
+{
+    std::ostringstream inter;
+    inter << "particleComposition_" << m_ParticleCompositionLabel.size()+1;
+    m_ParticleCompositionLabel.insert(sample, inter.str());
+}
+
+void SampleLabelHandler::insertRotation(const IRotation* sample)
+{
+    std::ostringstream inter;
+    inter << "rotation_" << m_RotationsLabel.size()+1;
+    m_RotationsLabel.insert(sample, inter.str());
+}
diff --git a/Core/Export/SampleLabelHandler.h b/Core/Export/SampleLabelHandler.h
new file mode 100644
index 0000000..0756825
--- /dev/null
+++ b/Core/Export/SampleLabelHandler.h
@@ -0,0 +1,185 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Export/SampleLabelHandler.h
+//! @brief     Defines SampleLabelHandler class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLELABELHANDLER_H
+#define SAMPLELABELHANDLER_H
+
+#include "Exceptions.h"
+#include <cassert>
+#include <list>
+#include <map>
+
+#include <iostream>
+
+class IAbstractParticle;
+class IFormFactor;
+class IInterferenceFunction;
+class ILayout;
+class IMaterial;
+class IRotation;
+class Layer;
+class LayerRoughness;
+class MultiLayer;
+class Particle;
+class ParticleComposition;
+class ParticleCoreShell;
+class ParticleDistribution;
+
+template<class Key>
+class LabelMap
+{
+public:
+    typedef std::pair<Key, std::string> entry_t;
+    typedef std::list<entry_t> list_t;
+    typedef typename list_t::iterator iterator;
+    typedef typename list_t::const_iterator const_iterator;
+    typedef std::map<Key, iterator> map_t;
+
+    LabelMap() {}
+    virtual ~LabelMap(){}
+
+    void clear() {
+        m_map.clear();
+        m_list.clear();
+    }
+
+    const_iterator begin() const { return m_list.begin(); }
+    const_iterator end() const { return m_list.end(); }
+    iterator begin() { return m_list.begin(); }
+    iterator end() { return m_list.end(); }
+
+    size_t size() {
+        assert(m_list.size() == m_map.size());
+        return m_list.size();
+    }
+
+    // if such key exists, pair will be deleted, and new pair appended to the end
+    void insert(const Key& key, const std::string& object) {
+        erase(key);
+        iterator it = m_list.insert(m_list.end(), std::make_pair(key, object));
+        m_map[key] = it;
+    }
+
+    const iterator find(const Key& key) const {
+        if(m_map.find(key) == m_map.end())
+            return m_list.end();
+        return m_map[key];
+    }
+
+    iterator find(const Key& key) {
+        if(m_map.find(key) == m_map.end())
+            return m_list.end();
+        return m_map[key];
+    }
+
+    void erase(const Key& key) {
+        if(m_map.find(key) == m_map.end())
+            return;
+        iterator it = m_map[key];
+        m_list.erase(it);
+        m_map.erase(key);
+    }
+
+    const std::string& value(const Key& key) {
+        typename map_t::const_iterator mit = m_map.find(key);
+        if(mit == m_map.end())
+            throw Exceptions::RuntimeErrorException("LabelMap::value() -> No such key");
+        const_iterator it = mit->second;
+        return it->second;
+    }
+
+    const std::string& operator[](const Key& key) { return value(key); }
+
+private:
+    map_t m_map;
+    list_t m_list;
+};
+
+//! @class SampleLabelHandler
+//! @ingroup tools_internal
+//! @brief The handler which construct labels for sample variables during python script generation
+
+class BA_CORE_API_ SampleLabelHandler
+{
+public:
+    typedef LabelMap<const IFormFactor*> formfactors_t;
+    typedef LabelMap<const IInterferenceFunction*> interferences_t;
+    typedef LabelMap<const ILayout*> layouts_t;
+    typedef std::map<const IMaterial*, std::string> materials_t;
+    typedef LabelMap<const IRotation*> rotations_t;
+    typedef LabelMap<const Layer*> layers_t;
+    typedef LabelMap<const LayerRoughness*> roughnesses_t;
+    typedef LabelMap<const MultiLayer*> multilayers_t;
+    typedef LabelMap<const Particle*> particles_t;
+    typedef LabelMap<const ParticleComposition*> particlecompositions_t;
+    typedef LabelMap<const ParticleCoreShell*> particlescoreshell_t;
+    typedef LabelMap<const ParticleDistribution*> particledistributions_t;
+
+    SampleLabelHandler() {}
+    formfactors_t* getFormFactorMap() { return &m_FormFactorLabel; }
+    interferences_t* getInterferenceFunctionMap() { return &m_InterferenceFunctionLabel; }
+    layers_t* getLayerMap() { return &m_LayerLabel; }
+    layouts_t* getParticleLayoutMap() { return &m_ILayoutLabel; }
+    materials_t* getMaterialMap() { return &m_MaterialLabel; }
+    multilayers_t* getMultiLayerMap() { return &m_MultiLayerLabel; }
+    particlecompositions_t* getParticleCompositionMap() { return &m_ParticleCompositionLabel; }
+    particledistributions_t* getParticleDistributionsMap() { return &m_ParticleDistributionLabel; }
+    particles_t* getParticleMap() { return &m_ParticleLabel; }
+    particlescoreshell_t* getParticleCoreShellMap() { return &m_ParticleCoreShellLabel; }
+    rotations_t* getRotationsMap() { return &m_RotationsLabel; }
+    roughnesses_t* getLayerRoughnessMap() { return &m_LayerRoughnessLabel; }
+
+    std::string getLabelParticle(const IAbstractParticle* sample);
+    std::string getLabelFormFactor(const IFormFactor* sample);
+    std::string getLabelInterferenceFunction(const IInterferenceFunction* sample);
+    std::string getLabelLayout(const ILayout* sample);
+    std::string getLabelMaterial(const IMaterial* sample);
+    std::string getLabelRotation(const IRotation* sample);
+    std::string getLabelLayer(const Layer* sample);
+    std::string getLabelRoughness(const LayerRoughness* sample);
+    std::string getLabelMultiLayer(const MultiLayer* sample);
+    std::string getLabelParticleComposition(const ParticleComposition* sample);
+    std::string getLabelParticleCoreShell(const ParticleCoreShell* sample);
+    std::string getLabelParticleDistribution(const ParticleDistribution* sample);
+
+    void insertMaterial(const IMaterial* sample);
+    void insertFormFactor(const IFormFactor* sample);
+    void insertInterferenceFunction(const IInterferenceFunction* sample);
+    void insertLayout(const ILayout* sample);
+    void insertRotation(const IRotation* sample);
+    void insertLayer(const Layer* sample);
+    void insertRoughness(const LayerRoughness* sample);
+    void insertMultiLayer(const MultiLayer* sample);
+    void insertParticle(const Particle* sample);
+    void insertParticleComposition(const ParticleComposition* sample);
+    void insertParticleCoreShell(const ParticleCoreShell* sample);
+    void insertParticleDistribution(const ParticleDistribution* sample);
+
+private:
+    formfactors_t m_FormFactorLabel;
+    interferences_t m_InterferenceFunctionLabel;
+    layers_t m_LayerLabel;
+    layouts_t m_ILayoutLabel;
+    materials_t m_MaterialLabel;
+    multilayers_t m_MultiLayerLabel;
+    particlecompositions_t m_ParticleCompositionLabel;
+    particledistributions_t m_ParticleDistributionLabel;
+    particles_t m_ParticleLabel;
+    particlescoreshell_t m_ParticleCoreShellLabel;
+    rotations_t m_RotationsLabel;
+    roughnesses_t m_LayerRoughnessLabel;
+};
+
+#endif // SAMPLELABELHANDLER_H
diff --git a/Core/Fitting/AdjustMinimizerStrategy.cpp b/Core/Fitting/AdjustMinimizerStrategy.cpp
new file mode 100644
index 0000000..530e8c4
--- /dev/null
+++ b/Core/Fitting/AdjustMinimizerStrategy.cpp
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/AdjustMinimizerStrategy.cpp
+//! @brief     Implements class AdjustMinimizerStrategy.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "AdjustMinimizerStrategy.h"
+#include "FitSuiteImpl.h"
+#include "IMinimizer.h"
+#include "MinimizerFactory.h"
+
+AdjustMinimizerStrategy::AdjustMinimizerStrategy()
+    : IFitStrategy("FitStrategy/AdjustMinimizer")
+{
+}
+
+AdjustMinimizerStrategy::AdjustMinimizerStrategy(const std::string &minimizerName,
+                                                       const std::string &algorithmName,
+                                                       const std::string &optionString)
+    : IFitStrategy("FitStrategy/AdjustMinimizer")
+    , m_minimizerName(minimizerName)
+    , m_algorithmName(algorithmName)
+    , m_optionString(optionString)
+{
+    setMinimizer(minimizerName, algorithmName, optionString);
+}
+
+
+AdjustMinimizerStrategy* AdjustMinimizerStrategy::clone() const
+{
+    AdjustMinimizerStrategy* result = new AdjustMinimizerStrategy(*this);
+    return result;
+}
+
+void AdjustMinimizerStrategy::setMinimizer(const std::string &minimizerName,
+                                              const std::string &algorithmName,
+                                              const std::string &optionString)
+{
+    m_minimizerName = minimizerName;
+    m_algorithmName = algorithmName;
+    m_optionString = optionString;
+}
+
+void AdjustMinimizerStrategy::execute()
+{
+    m_kernel->setMinimizer(
+        MinimizerFactory::createMinimizer(m_minimizerName, m_algorithmName, m_optionString));
+    m_kernel->minimize();
+}
+
+std::string AdjustMinimizerStrategy::toString() const
+{
+    std::ostringstream ostr;
+    ostr << "FitStrategy/AdjustMinimizer ("
+         << m_minimizerName << ", "
+         << m_algorithmName << ", "
+         << m_optionString << ")";
+    return ostr.str();
+}
+
+AdjustMinimizerStrategy::AdjustMinimizerStrategy(const AdjustMinimizerStrategy &other)
+    : IFitStrategy(other)
+{
+    m_minimizerName = other.m_minimizerName;
+    m_algorithmName = other.m_algorithmName;
+    m_optionString = other.m_optionString;
+}
diff --git a/Core/Fitting/AdjustMinimizerStrategy.h b/Core/Fitting/AdjustMinimizerStrategy.h
new file mode 100644
index 0000000..7060c3e
--- /dev/null
+++ b/Core/Fitting/AdjustMinimizerStrategy.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/AdjustMinimizerStrategy.h
+//! @brief     Defines class AdjustMinimizerStrategy
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ADJUSTMINIMIZERSTRATEGY_H
+#define ADJUSTMINIMIZERSTRATEGY_H
+
+#include "IFitStrategy.h"
+
+//! @class AdjustMinimizerStrategy
+//! @ingroup fitting
+//! @brief Strategy modifies mimimizer settings before running minimization round.
+
+class BA_CORE_API_ AdjustMinimizerStrategy : public IFitStrategy
+{
+public:
+    AdjustMinimizerStrategy();
+
+    AdjustMinimizerStrategy(const std::string& minimizerName,
+                               const std::string& algorithmName = std::string(),
+                               const std::string& optionString=std::string());
+
+    virtual AdjustMinimizerStrategy* clone() const;
+
+    void setMinimizer(const std::string& minimizerName,
+                      const std::string& algorithmName = std::string(),
+                      const std::string& optionString=std::string());
+
+    virtual void execute();
+
+protected:
+    virtual std::string toString() const;
+    AdjustMinimizerStrategy(const AdjustMinimizerStrategy &other);
+
+private:
+    std::string m_minimizerName;
+    std::string m_algorithmName;
+    std::string m_optionString;
+};
+
+#endif // ADJUSTMINIMIZERSTRATEGY_H
diff --git a/Core/Fitting/FitObject.cpp b/Core/Fitting/FitObject.cpp
new file mode 100644
index 0000000..a6a8d21
--- /dev/null
+++ b/Core/Fitting/FitObject.cpp
@@ -0,0 +1,150 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitObject.cpp
+//! @brief     Implements class FitObject.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitObject.h"
+#include "FitElement.h"
+#include "GISASSimulation.h"
+#include "IIntensityNormalizer.h"
+#include "SimulationArea.h"
+#include "BornAgainNamespace.h"
+#include "DetectorFunctions.h"
+
+FitObject::FitObject(const GISASSimulation& simulation, const OutputData<double >& real_data,
+    double weight)
+    : m_simulation(simulation.clone())
+    , m_weight(weight)
+    , m_fit_elements_count(0)
+
+{
+    setName("FitObject");
+    m_fit_elements_count =
+            m_simulation->getInstrument().getDetector()->numberOfSimulationElements();
+    init_dataset(real_data);
+}
+
+FitObject::~FitObject()
+{}
+
+const OutputData<double>& FitObject::realData() const
+{
+    return *m_real_data.get();
+}
+
+const OutputData<double>& FitObject::simulationData() const
+{
+    return *m_simulation_data.get();
+}
+
+const OutputData<double>& FitObject::chiSquaredMap() const
+{
+    return *m_chi2_data.get();
+}
+
+const GISASSimulation& FitObject::simulation() const
+{
+    return *m_simulation.get();
+}
+
+//! Adds parameters from local pool to external pool
+
+std::string FitObject::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path = IParameterized::addParametersToExternalPool(
+        path, external_pool, copy_number);
+
+    // add parameters of the simulation
+    if(m_simulation)
+        m_simulation->addParametersToExternalPool(new_path, external_pool, -1);
+
+    return new_path;
+}
+
+//! Initialize detector, if necessary, to match experimental data
+void FitObject::init_dataset(const OutputData<double>& real_data)
+{
+    process_realdata(real_data);
+
+    m_chi2_data.reset(m_simulation->getInstrument().createDetectorMap());
+//    bool put_masked_areas_to_zero(true);
+//    m_real_data = DetectorFunctions::createDataSet(m_simulation->getInstrument(), real_data,
+//                                                   put_masked_areas_to_zero);
+}
+
+//! Adapt real data to use with fitting.
+// If real_data and the detector have the same size, real_data will be croped to the ROI
+// If size of real_data and the detector is different, it is assumed that it is already cropped
+void FitObject::process_realdata(const OutputData<double> &real_data)
+{
+    const IDetector2D *detector = m_simulation->getInstrument().getDetector();
+    if(!DetectorFunctions::hasSameDimensions(*detector, real_data)){
+        std::unique_ptr<OutputData<double>> detectorMap(
+                    m_simulation->getInstrument().createDetectorMap());
+
+        if(detectorMap->hasSameDimensions(real_data)) {
+            detectorMap->setRawDataVector(real_data.getRawDataVector());
+            m_real_data.reset(detectorMap.release());
+        } else {
+
+        std::ostringstream message;
+        message << "FitObject::check_realdata() -> Error. Axes of the real data doesn't match "
+                << "the detector. Real data:" << DetectorFunctions::axesToString(real_data)
+                        << ", detector:" << DetectorFunctions::axesToString(*detector) << ".";
+        throw Exceptions::RuntimeErrorException(message.str());
+        }
+    } else {
+        bool put_masked_areas_to_zero(false);
+        m_real_data = DetectorFunctions::createDataSet(m_simulation->getInstrument(), real_data,
+                                                       put_masked_areas_to_zero);
+    }
+}
+
+size_t FitObject::numberOfFitElements() const
+{
+    return m_fit_elements_count;
+}
+
+//! Runs simulation and put results (the real and simulated intensities) into external vector.
+//! Masked channels will be excluded from the vector.
+
+void FitObject::prepareFitElements(std::vector<FitElement> &fit_elements, double weight,
+                                   IIntensityNormalizer* normalizer)
+{
+    m_simulation->runSimulation();
+    m_simulation_data.reset(m_simulation->getDetectorIntensity());
+
+    if(normalizer)
+        normalizer->apply(*m_simulation_data.get());
+
+    SimulationArea area(m_simulation->getInstrument().getDetector());
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        FitElement element(it.roiIndex(), (*m_simulation_data)[it.roiIndex()],
+                (*m_real_data)[it.roiIndex()], weight);
+        fit_elements.push_back(element);
+    }
+}
+
+//! Updates ChiSquared map from external vector and returns const reference to it. Used from
+//! Python in FitSuiteDrawObserver.
+
+void FitObject::transferToChi2Map(
+    std::vector<FitElement>::const_iterator first,
+    std::vector<FitElement>::const_iterator last) const
+{
+    m_chi2_data->setAllTo(0.0);
+    for(std::vector<FitElement>::const_iterator it=first; it!=last; ++it)
+        (*m_chi2_data)[it->getIndex()] = it->getSquaredDifference();
+}
diff --git a/Core/Fitting/FitObject.h b/Core/Fitting/FitObject.h
new file mode 100644
index 0000000..27b356c
--- /dev/null
+++ b/Core/Fitting/FitObject.h
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitObject.h
+//! @brief     Defines class FitObject.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITOBJECT_H
+#define FITOBJECT_H
+
+#include "IParameterized.h"
+#include "OutputData.h"
+#include <INoncopyable.h>
+#include <memory>
+
+class FitElement;
+class GISASSimulation;
+class IIntensityNormalizer;
+
+//! Holds simulation description and real data to run the fit.
+//! @ingroup fitting_internal
+
+class BA_CORE_API_ FitObject : public IParameterized, public INoncopyable
+{
+public:
+    //! FitObject constructor
+    //! @param simulation The simulation to run
+    //! @param real_data The real data
+    //! @param weight Weight of dataset in chi2 calculations
+    //! @param adjust_detector_to_data Detector axes will be adjusted to real data axes, if true
+    FitObject(const GISASSimulation& simulation, const OutputData<double>& real_data,
+              double weight = 1);
+
+    virtual ~FitObject();
+
+    //! Returns real (experimental) data.
+    const OutputData<double>& realData() const;
+
+    //! Returns simulated data.
+    const OutputData<double>& simulationData() const;
+
+    //! Returns chi2 map.
+    const OutputData<double>& chiSquaredMap() const;
+
+    //! Returns simulation
+    const GISASSimulation& simulation() const;
+
+    //! Returns weight of data set in chi2 calculations.
+    double weight() const { return m_weight; }
+
+    //! Returns the size of the data. It is equal to the number of non-masked detector channels
+    //! which will participate in chi2 calculations.
+    size_t numberOfFitElements() const;
+
+    void prepareFitElements(std::vector<FitElement>& fit_elements, double weight,
+                            IIntensityNormalizer* normalizer=0);
+
+    void transferToChi2Map(std::vector<FitElement>::const_iterator first,
+                           std::vector<FitElement>::const_iterator last) const;
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    virtual std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const;
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    virtual void init_parameters() {}
+
+private:
+    void init_dataset(const OutputData<double>& real_data);
+    void process_realdata(const OutputData<double>& real_data);
+
+    std::unique_ptr<GISASSimulation> m_simulation;
+    std::unique_ptr<OutputData<double>> m_real_data;
+    std::unique_ptr<OutputData<double>> m_simulation_data;
+    std::unique_ptr<OutputData<double>> m_chi2_data;
+    double m_weight;
+    size_t m_fit_elements_count;
+};
+
+#endif // FITOBJECT_H
diff --git a/Core/Fitting/FitParameterLinked.cpp b/Core/Fitting/FitParameterLinked.cpp
new file mode 100644
index 0000000..06ece23
--- /dev/null
+++ b/Core/Fitting/FitParameterLinked.cpp
@@ -0,0 +1,80 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitParameterLinked.cpp
+//! @brief     Implements class FitParameterLinked.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameterLinked.h"
+#include <stdexcept>
+#include "ParameterPool.h"
+#include "RealParameter.h"
+
+FitParameterLinked::FitParameterLinked(const std::string& name, double value,
+                                       const AttLimits& lim, double step)
+    : FitParameter(name, value, lim, step)
+{}
+
+FitParameterLinked::~FitParameterLinked()
+{
+    for (auto* par: m_pool_parameters)
+        delete par;
+}
+
+FitParameterLinked *FitParameterLinked::clone() const
+{
+    throw std::runtime_error("FitParameterLinked::clone() -> Not yet implemented;");
+}
+
+//! Sets given value for all bound parameters
+void FitParameterLinked::setValue(double value) {
+    FitParameter::setValue(value);
+    for(auto* par: m_pool_parameters)
+        par->setValue(value);
+}
+
+//! Adds real parameter to the collection
+void FitParameterLinked::addParameter(RealParameter* par)
+{
+    if( par->isNull() )
+        throw std::runtime_error(
+            "FitMultiParameter::addParameter() -> Attempt to add null parameter");
+    m_pool_parameters.push_back(par->clone());
+}
+
+//! Adds parameters from pool which match given wildcard
+void FitParameterLinked::addMatchedParametersFromPool(
+    const ParameterPool* pool, const std::string& wildcard)
+{
+    std::string wildcard_to_use = name();
+    if( !wildcard.empty())
+        wildcard_to_use = wildcard;
+    for (auto* par: pool->getMatchedParameters(wildcard_to_use))
+        m_pool_parameters.push_back(par->clone());
+    if( m_pool_parameters.empty() )
+        throw std::runtime_error(
+            "FitMultiParameter::addMatchedParametersFromPool() -> Error! "
+            "Failed to add anything from pool using wildcard '"+wildcard_to_use+"'");
+}
+
+void FitParameterLinked::print(std::ostream& ostr) const
+{
+    ostr << FitParameter::toString();
+    ostr << "FitParameterLinked '" << name() << "'" << " value:" << value()
+         << " collsize:" << m_pool_parameters.size();
+//    if(m_parametercoll.size() ) {
+//        ostr << " addresses: ";
+//        for(auto it=m_parametercoll.begin(); it!=m_parametercoll.end(); it++) {
+//            parameter_t par = (*it);
+//            ostr << par << " ";
+//        }
+//    }
+}
diff --git a/Core/Fitting/FitParameterLinked.h b/Core/Fitting/FitParameterLinked.h
new file mode 100644
index 0000000..f7ecc19
--- /dev/null
+++ b/Core/Fitting/FitParameterLinked.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitParameterLinked.h
+//! @brief     Defines class FitParameterLinked.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPARAMETERLINKED_H
+#define FITPARAMETERLINKED_H
+
+#include "FitParameter.h"
+#include <vector>
+
+class ParameterPool;
+class RealParameter;
+
+//! Fittable parameter, linked to other parameters from pools.
+//! @ingroup fitting_internal
+
+class BA_CORE_API_ FitParameterLinked : public FitParameter
+{
+ public:
+    FitParameterLinked() {}
+    FitParameterLinked(const std::string& name, double value,
+        const AttLimits& lim=AttLimits::limitless(), double step = 0.0);
+    ~FitParameterLinked() final;
+
+    FitParameterLinked *clone() const;
+
+    void setValue(double value) final;
+
+    void addParameter(RealParameter* par);
+
+    void addMatchedParametersFromPool(
+        const ParameterPool* pool, const std::string& wildcard = std::string());
+
+    friend std::ostream& operator<<(std::ostream& ostr, const FitParameterLinked& m) {
+        m.print(ostr); return ostr; }
+
+ private:
+    void print(std::ostream& ostr) const;
+
+    std::vector<RealParameter*> m_pool_parameters; //!< linked parameters from pools
+};
+
+#endif // FITPARAMETERLINKED_H
diff --git a/Core/Fitting/FitStrategyAdjustParameters.cpp b/Core/Fitting/FitStrategyAdjustParameters.cpp
new file mode 100644
index 0000000..6d67ef8
--- /dev/null
+++ b/Core/Fitting/FitStrategyAdjustParameters.cpp
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitStrategyAdjustParameters.cpp
+//! @brief     Implements class FitStrategyAdjustParameters.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitStrategyAdjustParameters.h"
+#include "FitSuiteImpl.h"
+#include "FitParameter.h"
+#include "FitParameterSet.h"
+#include "Logger.h"
+#include "Exceptions.h"
+
+FitStrategyAdjustParameters::FitStrategyAdjustParameters(const FitStrategyAdjustParameters &other)
+    : IFitStrategy(other)
+    , m_fix_all(other.m_fix_all)
+    , m_release_all(other.m_release_all)
+    , m_pars_to_fix(other.m_pars_to_fix)
+    , m_pars_to_release(other.m_pars_to_release)
+    , m_preserve_original_values(other.m_preserve_original_values)
+{
+}
+
+//! strategy which fixes/releases fit parameters and then call minimizer
+void FitStrategyAdjustParameters::execute()
+{
+    if( !m_kernel )
+        throw Exceptions::NullPointerException(
+            "FitSuiteStrategyAdjustParameters::execute() -> FitSuite doesn't exists");
+    FitParameterSet* fitParameters = m_kernel->fitParameters();
+
+    // fixing all parameters at they current values
+    if( m_fix_all ) {
+        for(auto par: *fitParameters)
+            par->limits().setFixed(true);
+    }
+
+    // releasing all parameters
+    if( m_release_all ) {
+        for(auto par: *fitParameters) {
+            msglog(MSG::DEBUG2) << "FitSuiteStrategyAdjustParameters::execute() -> releasing "
+                                << par->name();
+            par->limits().setFixed(false);
+        }
+    }
+
+    // fixing dedicated list of fit parameters
+    for(auto name: m_pars_to_fix) {
+        msglog(MSG::DEBUG2) << "FitSuiteStrategyAdjustParameters::execute() -> fixing " << name;
+        fitParameters->fitParameter(name)->limits().setFixed(true);
+    }
+
+    // releasing dedicated list of fit parameters
+    for(auto name: m_pars_to_release) {
+        msglog(MSG::DEBUG2) << "FitSuiteStrategyAdjustParameters::execute() -> releasing " << name;
+        fitParameters->fitParameter(name)->limits().setFixed(false);
+    }
+
+    // saving original param values
+    std::vector<double> original_param_values = fitParameters->values();
+
+    // calling minimization
+    m_kernel->minimize();
+
+    // returning parameters to original values as they were before minimization
+    if(m_preserve_original_values)
+        fitParameters->setValues(original_param_values);
+}
diff --git a/Core/Fitting/FitStrategyAdjustParameters.h b/Core/Fitting/FitStrategyAdjustParameters.h
new file mode 100644
index 0000000..25c9f78
--- /dev/null
+++ b/Core/Fitting/FitStrategyAdjustParameters.h
@@ -0,0 +1,160 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitStrategyAdjustParameters.h
+//! @brief     Defines classes FitStrategyAdjustParameters and related
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSTRATEGYADJUSTPARAMETERS_H
+#define FITSTRATEGYADJUSTPARAMETERS_H
+
+#include "IFitStrategy.h"
+#include <vector>
+
+//! @class FitStrategyAdjustParameters
+//! @ingroup fitting
+//! @brief Strategy which fixes/releases fit parameters and call minimizer
+
+class BA_CORE_API_ FitStrategyAdjustParameters : public IFitStrategy
+{
+public:
+    FitStrategyAdjustParameters(const std::string& name)
+        : IFitStrategy(name)
+    {
+        clear();
+    }
+
+    FitStrategyAdjustParameters()
+        : IFitStrategy("FitSuiteStrategyAdjustParameters")
+    {
+        clear();
+    }
+
+    virtual ~FitStrategyAdjustParameters(){}
+
+    virtual FitStrategyAdjustParameters* clone() const {
+        return new FitStrategyAdjustParameters(*this); }
+
+    virtual void execute();
+
+    virtual FitStrategyAdjustParameters& fix_all() {
+        m_fix_all = true; return *this;
+    }
+
+    virtual FitStrategyAdjustParameters& release_all() {
+        m_release_all = true; return *this;
+    }
+
+    virtual FitStrategyAdjustParameters& fix(std::string parname ) {
+        m_pars_to_fix.push_back(parname);
+        return *this;
+    }
+
+    virtual FitStrategyAdjustParameters& release(std::string parname ) {
+        m_pars_to_release.push_back(parname);
+        return *this;
+    }
+
+    virtual void setPreserveOriginalValues(bool preserve_values) {
+        m_preserve_original_values = preserve_values; }
+
+    virtual void clear() {
+        m_fix_all = false;
+        m_release_all = false;
+        m_preserve_original_values = false;
+        m_pars_to_fix.clear();
+        m_pars_to_release.clear();
+    }
+
+protected:
+    FitStrategyAdjustParameters(const FitStrategyAdjustParameters &other);
+
+    bool m_fix_all;
+    bool m_release_all;
+    std::vector<std::string> m_pars_to_fix;
+    std::vector<std::string> m_pars_to_release;
+    //! if it's true, strategy will set back values of parameters as they were
+    //! before minimization round
+    bool m_preserve_original_values;
+};
+
+
+//! @class FitStrategyFixParameters
+//! @ingroup fitting
+//! @brief Strategy which fixes certain fit parameters leaving other released
+
+class BA_CORE_API_ FitStrategyFixParameters : public FitStrategyAdjustParameters
+{
+public:
+    FitStrategyFixParameters()
+        : FitStrategyAdjustParameters("FixStrategyFixParameters")
+    {
+        m_fix_all = false;
+        m_release_all = true;
+    }
+
+    FitStrategyFixParameters(const std::vector<std::string> &pars)
+        : FitStrategyAdjustParameters("FixStrategyFixParameters")
+    {
+        m_fix_all = false;
+        m_release_all = true;
+        setFixed(pars);
+    }
+
+    virtual ~FitStrategyFixParameters(){}
+    virtual FitStrategyFixParameters *clone() const { return new FitStrategyFixParameters(*this); }
+
+    virtual void clear() {
+        FitStrategyAdjustParameters::clear();
+        m_release_all = true;
+    }
+
+    virtual void setFixed(const std::vector<std::string> &pars) { m_pars_to_fix = pars; }
+
+};
+
+
+//! @class FitStrategyReleaseParameters
+//! @ingroup fitting
+//! @brief Strategy which releases certain fit parameters leaving other fixed
+
+class BA_CORE_API_ FitStrategyReleaseParameters : public FitStrategyAdjustParameters
+{
+public:
+    FitStrategyReleaseParameters()
+        : FitStrategyAdjustParameters("FixStrategyReleaseParameters")
+    {
+        m_fix_all = true;
+        m_release_all = false;
+    }
+
+    FitStrategyReleaseParameters(const std::vector<std::string> &pars)
+        : FitStrategyAdjustParameters("FixStrategyReleaseParameters")
+    {
+        m_fix_all = true;
+        m_release_all = false;
+        setReleased(pars);
+    }
+
+
+    virtual ~FitStrategyReleaseParameters(){}
+    virtual FitStrategyReleaseParameters *clone() const {
+        return new FitStrategyReleaseParameters(*this); }
+
+    virtual void clear() {
+        FitStrategyAdjustParameters::clear();
+        m_fix_all = true;
+    }
+
+    virtual void setReleased(const std::vector<std::string> &pars) { m_pars_to_release = pars; }
+};
+
+#endif // FITSTRATEGYADJUSTPARAMETERS_H
diff --git a/Core/Fitting/FitSuite.cpp b/Core/Fitting/FitSuite.cpp
new file mode 100644
index 0000000..10fbaff
--- /dev/null
+++ b/Core/Fitting/FitSuite.cpp
@@ -0,0 +1,192 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuite.cpp
+//! @brief     Implements class FitSuite.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuite.h"
+#include "FitSuiteImpl.h"
+#include "FitKernel.h"
+#include "FitSuitePrintObserver.h"
+#include "IHistogram.h"
+#include "MinimizerFactory.h"
+#include <iostream>
+
+FitSuite::FitSuite()
+    : m_impl(new FitSuiteImpl(std::bind(&FitSuite::notifyObservers, this)))
+{}
+
+FitSuite::~FitSuite()
+{}
+
+void FitSuite::addSimulationAndRealData(const GISASSimulation& simulation,
+                                        const OutputData<double>& real_data, double weight)
+{
+    m_impl->addSimulationAndRealData(simulation, real_data, weight);
+}
+
+void FitSuite::addSimulationAndRealData(const GISASSimulation& simulation,
+                                        const IHistogram& real_data, double weight)
+{
+    const std::unique_ptr<OutputData<double>> data(real_data.createOutputData());
+    m_impl->addSimulationAndRealData(simulation, *data, weight);
+}
+
+void FitSuite::addSimulationAndRealData(const GISASSimulation& simulation,
+                              const std::vector<std::vector<double>>& real_data,
+                              double weight)
+{
+    std::unique_ptr<IHistogram> data(IHistogram::createFrom(real_data));
+    addSimulationAndRealData(simulation, *data.get(), weight);
+}
+
+
+FitParameterLinked *FitSuite::addFitParameter(const std::string& name, double value,
+                               const AttLimits& limits, double step)
+{
+    return m_impl->addFitParameter(name, value, limits, step);
+}
+
+void FitSuite::setMinimizer(const std::string& minimizer_name, const std::string& algorithm_name,
+                            const std::string& minimizer_options)
+{
+    IMinimizer* minimizer = MinimizerFactory::createMinimizer(minimizer_name, algorithm_name,
+                                                              minimizer_options);
+    m_impl->setMinimizer(minimizer);
+}
+
+void FitSuite::setChiSquaredModule(const IChiSquaredModule& chi2_module)
+{
+    m_impl->fitObjects()->setChiSquaredModule(chi2_module);
+}
+
+void FitSuite::addFitStrategy(const IFitStrategy& strategy)
+{
+    m_impl->addFitStrategy(strategy);
+}
+
+void FitSuite::setMinimizer(IMinimizer* minimizer)
+{
+    m_impl->setMinimizer(minimizer);
+}
+
+const IMinimizer *FitSuite::minimizer() const
+{
+    return m_impl->kernel()->minimizer();
+}
+
+void FitSuite::initPrint(int print_every_nth)
+{
+    std::shared_ptr<FitSuitePrintObserver> observer(new FitSuitePrintObserver(print_every_nth));
+    attachObserver(observer);
+}
+
+void FitSuite::runFit()
+{
+    m_impl->runFit();
+}
+
+int FitSuite::numberOfFitObjects() const
+{
+    return m_impl->fitObjects()->getNumberOfFitObjects();
+}
+
+IHistogram* FitSuite::getRealData(size_t i_item) const
+{
+    return IHistogram::createHistogram(m_impl->fitObjects()->getRealData(i_item));
+}
+
+IHistogram* FitSuite::getSimulationData(size_t i_item) const
+{
+    return IHistogram::createHistogram(m_impl->fitObjects()->getSimulationData(i_item));
+}
+
+IHistogram* FitSuite::getChiSquaredMap(size_t i_item) const
+{
+    return IHistogram::createHistogram(m_impl->fitObjects()->getChiSquaredMap(i_item));
+}
+
+const OutputData<double>* FitSuite::getRealOutputData(size_t i_item) const
+{
+    return &m_impl->fitObjects()->getRealData(i_item);
+}
+
+const OutputData<double>* FitSuite::getSimulationOutputData(size_t i_item) const
+{
+    return &m_impl->fitObjects()->getSimulationData(i_item);
+}
+
+const OutputData<double>* FitSuite::getChiSquaredOutputData(size_t i_item) const
+{
+    return &m_impl->fitObjects()->getChiSquaredMap(i_item);
+}
+
+
+FitSuiteObjects* FitSuite::fitObjects()
+{
+    return m_impl->fitObjects();
+}
+
+FitParameterSet* FitSuite::fitParameters()
+{
+    return m_impl->fitParameters();
+}
+
+FitSuiteStrategies* FitSuite::fitStrategies()
+{
+    return m_impl->fitStrategies();
+}
+
+bool FitSuite::isLastIteration() const
+{
+    return m_impl->isLastIteration();
+}
+
+size_t FitSuite::numberOfIterations() const
+{
+    return m_impl->numberOfIterations();
+}
+
+size_t FitSuite::currentStrategyIndex() const
+{
+    return m_impl->currentStrategyIndex();
+}
+
+void FitSuite::printResults() const
+{
+    std::cout <<reportResults() << std::endl;
+}
+
+std::string FitSuite::reportResults() const
+{
+    return m_impl->reportResults();
+}
+
+double FitSuite::getChi2() const
+{
+    return m_impl->fitObjects()->getChiSquaredValue();
+}
+
+void FitSuite::interruptFitting()
+{
+    m_impl->interruptFitting();
+}
+
+void FitSuite::resetInterrupt()
+{
+    m_impl->resetInterrupt();
+}
+
+bool FitSuite::isInterrupted()
+{
+    return m_impl->isInterrupted();
+}
diff --git a/Core/Fitting/FitSuite.h b/Core/Fitting/FitSuite.h
new file mode 100644
index 0000000..45ff605
--- /dev/null
+++ b/Core/Fitting/FitSuite.h
@@ -0,0 +1,161 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuite.h
+//! @brief     Defines class FitSuite.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITE_H
+#define FITSUITE_H
+
+#include "IObserver.h"
+#include "OutputData.h"
+#include "AttLimits.h"
+#include <vector>
+
+class GISASSimulation;
+class IHistogram;
+class IChiSquaredModule;
+class IFitStrategy;
+class FitSuiteObjects;
+class FitParameterSet;
+class FitSuiteStrategies;
+class FitOptions;
+class FitSuiteImpl;
+class IMinimizer;
+class FitParameterLinked;
+
+//! @class FitSuite
+//! @ingroup fitting
+//! @brief User interface class that wraps all fit methods.
+
+class BA_CORE_API_ FitSuite : public IObservable
+{
+public:
+    FitSuite();
+    FitSuite(const FitSuite&) = delete;
+    FitSuite& operator=(const FitSuite&) = delete;
+    ~FitSuite();
+
+    // ------------------------------------------------------------------------
+    // Fitting setup
+    // ------------------------------------------------------------------------
+
+    //! Assigns pair of (simulation, real data) for fitting. More than one pair can be added.
+    void addSimulationAndRealData(const GISASSimulation& simulation,
+                                  const OutputData<double>& real_data, double weight=1);
+
+    //! Assigns pair of (simulation, real data) for fitting. More than one pair can be added.
+    void addSimulationAndRealData(const GISASSimulation& simulation,
+                                  const IHistogram& real_data, double weight=1);
+
+    //! Assigns pair of (simulation, real data) for fitting. Numpy array is used to provide
+    //! intensities. Shape of array (nrows, ncols) should coinside with detector's axes
+    //! (n_alpha, n_phi).
+    void addSimulationAndRealData(const GISASSimulation& simulation,
+                                  const std::vector<std::vector<double>>& real_data,
+                                  double weight=1);
+
+    //! Adds fit parameter
+    //! @param name The name of fit parameter
+    //! @param value Parameter's starting value
+    //! @param limits Limits attribute
+    //! @param step Initial parameter's step (some minimizers don't use it)
+    FitParameterLinked* addFitParameter(const std::string& name, double value,
+                         const AttLimits& limits=AttLimits::limitless(), double step = 0.0);
+
+    //! Sets minimizer with given name and algorithm type
+    //! @param minimizer_name The name of the minimizer
+    //! @param algorithm_name Optional name of the minimizer's algorithm
+    //! @param minimizer_options Optional string with additional minimizer settings
+    void setMinimizer(const std::string& minimizer_name,
+                      const std::string& algorithm_name = std::string(),
+                      const std::string& minimizer_options=std::string());
+
+    //! Replaces default ChiSquaredModule with new one
+    void setChiSquaredModule(const IChiSquaredModule& chi2_module);
+
+    //! Adds fit strategy
+    void addFitStrategy(const IFitStrategy& strategy);
+
+    //! Sets minimizer
+    void setMinimizer(IMinimizer* minimizer);
+
+    //! Returns minimizer.
+    const IMinimizer *minimizer() const;
+
+    //! Initializes printing to standard output during the fitting.
+    //! Prints also the summary when completed.
+    //! @param print_every_nth Print every n'th iteration
+    void initPrint(int print_every_nth);
+
+    //! main method to run the fitting
+    void runFit();
+
+    // ------------------------------------------------------------------------
+    // Access to the data
+    // ------------------------------------------------------------------------
+
+    //! Returns number of fit objects, where fit object stands for (real, simulated) pair.
+    int numberOfFitObjects() const;
+
+    //! returns real data histogram
+    //! @param i_item The index of fit object
+    IHistogram* getRealData(size_t i_item = 0) const;
+
+    //! returns simulated data  histogram
+    //! @param i_item The index of fit object
+    IHistogram* getSimulationData(size_t i_item = 0) const;
+
+    //! returns chi2 histogram calculated for (real, simulated) data pair
+    //! @param i_item The index of fit object
+    IHistogram* getChiSquaredMap(size_t i_item = 0) const;
+
+    //! returns FitObject (pair of simulation/real data)
+    FitSuiteObjects* fitObjects();
+
+    //! Returns reference to fit parameters
+    FitParameterSet* fitParameters();
+
+    //! Returns reference to fit parameters
+    FitSuiteStrategies* fitStrategies();
+
+    //! if the last iteration is done (used by observers to print summary)
+    bool isLastIteration() const;
+
+    //! Returns current number of minimization function calls
+    size_t numberOfIterations() const;
+
+    //! Returns the number of current strategy
+    size_t currentStrategyIndex() const;
+
+    //! Prints results of the minimization to the standard output.
+    void printResults() const;
+
+    //! Reports results of minimization in the form of multi-line string.
+    std::string reportResults() const;
+
+    //! Returns minimum chi squared value found
+    double getChi2() const;
+
+    void interruptFitting();
+    void resetInterrupt();
+    bool isInterrupted();
+
+    const OutputData<double>* getRealOutputData(size_t i_item = 0) const;
+    const OutputData<double>* getSimulationOutputData(size_t i_item = 0) const;
+    const OutputData<double>* getChiSquaredOutputData(size_t i_item = 0) const;
+
+private:
+    std::unique_ptr<FitSuiteImpl> m_impl;
+};
+
+#endif // FITSUITE_H
diff --git a/Core/Fitting/FitSuiteFunctions.cpp b/Core/Fitting/FitSuiteFunctions.cpp
new file mode 100644
index 0000000..b70291e
--- /dev/null
+++ b/Core/Fitting/FitSuiteFunctions.cpp
@@ -0,0 +1,149 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteFunctions.cpp
+//! @brief     Implements classes FitSuiteChiSquaredFunction and FitSuiteGradientFunction.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuiteFunctions.h"
+#include "FitSuiteImpl.h"
+#include "Logger.h"
+#include <cassert>
+#include <stdexcept>
+
+//! evaluate chi squared value
+double FitSuiteChiSquaredFunction::evaluate(const std::vector<double> &pars)
+{
+    assert(m_kernel != nullptr);
+    if (m_kernel->isInterrupted())
+        throw std::runtime_error("Fitting was interrupted by the user.");
+
+    m_kernel->fitParameters()->setValues(pars);
+    m_kernel->fitObjects()->runSimulations();
+    double chi_squared = m_kernel->fitObjects()->getChiSquaredValue();
+    m_kernel->notifyObservers();
+    m_ncall++;
+    return chi_squared;
+}
+
+//! evaluate residual and derivative for given data element
+// (calculations are done for all dataset when index==0, when index!=0 already
+// calculated data just returned
+double FitSuiteGradientFunction::evaluate(
+    const std::vector<double> &pars, unsigned int index, std::vector<double>& gradients)
+{
+    assert(m_kernel != nullptr);
+    if (m_kernel->isInterrupted())
+        throw std::runtime_error("Fitting was interrupted by the user.");
+
+    bool parameters_changed(true);
+    if(m_ncalls_total != 0)
+        parameters_changed = m_kernel->fitParameters()->valuesDifferFrom(pars, 2.);
+
+    verify_arrays();
+    verify_minimizer_logic(parameters_changed, (int)index);
+
+    if(parameters_changed)
+        calculate_residuals(pars);
+
+    if(gradients.size()) {
+        if(index == 0 || parameters_changed ) {
+            calculate_gradients(pars);
+            m_ncalls_gradient++;
+        }
+        for(size_t i_par=0; i_par<m_npars; ++i_par)
+            gradients[i_par] = m_gradients[i_par][index];
+    }
+
+    m_ncalls_total++;
+    if(index == 0 ) {
+        m_kernel->notifyObservers();
+        m_ncall++;
+    }
+    return m_residuals[index];
+}
+
+void FitSuiteGradientFunction::verify_arrays()
+{
+    if( m_npars != m_kernel->fitParameters()->size() ||
+        m_ndatasize != m_kernel->fitObjects()->getSizeOfDataSet() ) {
+        m_npars = m_kernel->fitParameters()->size();
+        m_ndatasize = m_kernel->fitObjects()->getSizeOfDataSet();
+        m_residuals.clear();
+        m_residuals.resize(m_ndatasize, 0.0);
+        m_gradients.clear();
+        m_gradients.resize(m_npars);
+        for(size_t i_par=0; i_par<m_npars; ++i_par)
+            m_gradients[i_par].resize(m_ndatasize, 0.0);
+    }
+}
+
+void FitSuiteGradientFunction::verify_minimizer_logic(
+    bool parameters_have_changed, int current_index)
+{
+    int index_difference = current_index - m_prev_index;
+    if(index_difference != 1 && (current_index!=0 && int(m_prev_index)!= int(m_ndatasize-1) ) ) {
+        msglog(MSG::WARNING) << "FitSuiteGradientFunction::verify_minimizer_logic() -> Warning! "
+                             << "Non sequential access to elements.";
+        msglog(MSG::WARNING) << " current_index:" << current_index
+                             << " prev_index:" << m_prev_index;
+    }
+    if(parameters_have_changed && current_index != 0) {
+        msglog(MSG::WARNING) << "FitSuiteGradientFunction::verify_minimizer_logic() -> Warning! "
+                             << "Parameters have changed while current_index!=0";
+        msglog(MSG::WARNING) << " current_index:" << current_index
+                             << " prev_index:" << m_prev_index;
+    }
+    if(parameters_have_changed && current_index == m_prev_index) {
+        msglog(MSG::WARNING) << "FitSuiteGradientFunction::verify_minimizer_logic() -> Warning! "
+                             << "Parameters have changed while index remained the same";
+        msglog(MSG::WARNING) << " current_index:" << current_index <<
+            " prev_index:" << m_prev_index;
+    }
+    m_prev_index = current_index;
+}
+
+void FitSuiteGradientFunction::calculate_residuals(const std::vector<double> &pars)
+{
+    runSimulation(pars);
+    for(size_t i_data=0; i_data<m_ndatasize; ++i_data)
+        m_residuals[i_data] = m_kernel->fitObjects()->getResidualValue(i_data);
+}
+
+void FitSuiteGradientFunction::calculate_gradients(const std::vector<double> &pars)
+{
+    // FIXME get kEps from outside fit_suite->getMinimizer()->getPrecision();
+    const double kEps = 1.0E-9; // Good for Fumili
+    //const double kEps = 1.0E-5;
+    for(size_t i_par=0; i_par<m_npars; ++i_par ) {
+        std::vector<double > pars_deriv = pars; // values of parameters for derivative calculation
+        pars_deriv[i_par] += kEps;
+
+        runSimulation(pars_deriv);
+
+        std::vector<double> residuals2;
+        residuals2.resize(m_ndatasize);
+        for(size_t i_data=0; i_data<m_ndatasize; ++i_data)
+            residuals2[i_data] = m_kernel->fitObjects()->getResidualValue(i_data);
+        for(size_t i_data=0; i_data <m_ndatasize; ++i_data)
+            m_gradients[i_par][i_data] = (residuals2[i_data] - m_residuals[i_data])/kEps;
+    }
+    // returning back old parameters
+    m_kernel->fitParameters()->setValues(pars);
+    runSimulation(pars);
+
+}
+
+void FitSuiteGradientFunction::runSimulation(const std::vector<double> &pars){
+    assert(m_kernel);
+    m_kernel->fitParameters()->setValues(pars);
+    m_kernel->fitObjects()->runSimulations();
+}
diff --git a/Core/Fitting/FitSuiteFunctions.h b/Core/Fitting/FitSuiteFunctions.h
new file mode 100644
index 0000000..eb3d279
--- /dev/null
+++ b/Core/Fitting/FitSuiteFunctions.h
@@ -0,0 +1,92 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteFunctions.h
+//! @brief     Defines classes IFitSuiteFunction,
+//!              FitSuiteChiSquaredFunction, FitSuiteGradientFunction
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITEFUNCTIONS_H
+#define FITSUITEFUNCTIONS_H
+
+#include "WinDllMacros.h"
+#include <vector>
+#include <cstddef>
+
+class FitSuiteImpl;
+
+//! @class IFitSuiteFunction
+//! @ingroup fitting_internal
+//! @brief Fitting functions interface to be used by Minimizer.
+
+class BA_CORE_API_ IFitSuiteFunction
+{
+ public:
+    IFitSuiteFunction() : m_kernel(0), m_ncall(0) {}
+    virtual ~IFitSuiteFunction() {}
+    virtual void init(FitSuiteImpl* fit_suite) { m_kernel = fit_suite; }
+    virtual size_t getNCalls() const { return m_ncall; }
+ protected:
+    FitSuiteImpl* m_kernel;
+    size_t m_ncall;
+};
+
+
+//! @class FitSuiteChiSquaredFunction
+//! @ingroup fitting_internal
+//! @brief Chi squared fitting function for minimizer
+
+class BA_CORE_API_ FitSuiteChiSquaredFunction : public IFitSuiteFunction
+{
+ public:
+    FitSuiteChiSquaredFunction() {}
+    virtual ~FitSuiteChiSquaredFunction() {}
+    //! evaluate method for chi2 value called directly from the minimizer
+    double evaluate(const std::vector<double> &pars);
+};
+
+
+//! @class FitSuiteGradientFunction
+//! @ingroup fitting_internal
+//! @brief Gradient fitting function for minimizer
+
+class BA_CORE_API_ FitSuiteGradientFunction : public IFitSuiteFunction
+{
+ public:
+    FitSuiteGradientFunction()
+        : m_npars(0), m_ndatasize(0), m_prev_index(-1),
+          m_ncalls_total(0), m_ncalls_gradient(0) {}
+    virtual ~FitSuiteGradientFunction() {}
+
+    //! evaluate method for gradients and residuals called directly from the minimizer
+    double evaluate(const std::vector<double> &pars, unsigned int index,
+                    std::vector<double>& gradients);
+
+    virtual size_t getNCallsTotal() const { return m_ncalls_total; }
+    virtual size_t getNCallsGradient() const { return m_ncalls_gradient; }
+
+ private:
+    void verify_arrays();
+    void verify_minimizer_logic(bool parameters_have_changed, int current_index);
+    void calculate_residuals(const std::vector<double> &pars);
+    void calculate_gradients(const std::vector<double> &pars);
+    void runSimulation(const std::vector<double> &pars);
+
+    size_t m_npars;
+    size_t m_ndatasize;
+    int m_prev_index;
+    std::vector<double> m_residuals; // [m_ndatasize]
+    std::vector<std::vector<double>> m_gradients; // [m_npars][m_ndatasize]
+    size_t m_ncalls_total;
+    size_t m_ncalls_gradient;
+};
+
+#endif // FITSUITEFUNCTIONS_H
diff --git a/Core/Fitting/FitSuiteImpl.cpp b/Core/Fitting/FitSuiteImpl.cpp
new file mode 100644
index 0000000..7ef0786
--- /dev/null
+++ b/Core/Fitting/FitSuiteImpl.cpp
@@ -0,0 +1,173 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteImpl.cpp
+//! @brief     Implements class FitSuiteImpl.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuiteImpl.h"
+#include "RealLimits.h"
+#include "FitParameter.h"
+#include "FitParameterLinked.h"
+#include "Logger.h"
+#include "MinimizerFactory.h"
+#include "ParameterPool.h"
+#include "IMinimizer.h"
+#include "FitKernel.h"
+#include <stdexcept>
+
+FitSuiteImpl::FitSuiteImpl(const std::function<void()>& notifyObservers)
+    : m_is_last_iteration(false)
+    , m_is_interrupted(false)
+    , m_notifyObservers(notifyObservers)
+    , m_kernel(new FitKernel)
+{
+    m_function_chi2.init(this);
+    m_function_gradient.init(this);
+    m_fit_strategies.init(this);
+}
+
+FitSuiteImpl::~FitSuiteImpl()
+{
+    clear();
+}
+
+//! Clears all data.
+void FitSuiteImpl::clear()
+{
+    m_fit_objects.clear();
+    m_kernel->clear();
+    m_fit_strategies.clear();
+    m_is_last_iteration = false;
+    m_is_interrupted = false;
+}
+
+//! Adds pair of (simulation, real data) for consecutive simulation
+void FitSuiteImpl::addSimulationAndRealData(const GISASSimulation& simulation,
+                                         const OutputData<double>& real_data, double weight)
+{
+    m_fit_objects.add(simulation, real_data, weight);
+}
+
+//! Adds fit parameter, step is calculated from initial parameter value
+FitParameterLinked *FitSuiteImpl::addFitParameter(const std::string& name, double value,
+                                  const AttLimits& limits, double step)
+{
+    if(step <=0.0)
+        step = value * getOptions().stepFactor();
+
+    FitParameterLinked *result = new FitParameterLinked(name, value, limits, step);
+    m_kernel->fitParameters()->addFitParameter(result);
+    return result;
+}
+
+void FitSuiteImpl::addFitStrategy(const IFitStrategy& strategy)
+{
+    m_fit_strategies.addStrategy(strategy);
+}
+
+void FitSuiteImpl::setMinimizer(IMinimizer* minimizer)
+{
+    m_kernel->setMinimizer(minimizer);
+}
+
+void FitSuiteImpl::runFit()
+{
+    // check if all prerequisites are fullfilled before starting minimization
+    check_prerequisites();
+
+    m_is_last_iteration = false;
+
+    // link fit parameters with parameters defined in the simulation
+    link_fit_parameters();
+
+    // run minimization using strategies
+    m_fit_strategies.minimize();
+
+    // call observers to let them to get results
+    m_is_last_iteration = true;
+    notifyObservers();
+}
+
+void FitSuiteImpl::minimize()
+{
+    objective_function_t fun_chi2 =
+        [&] (const std::vector<double>& pars) {return m_function_chi2.evaluate(pars);};
+    m_kernel->setObjectiveFunction( fun_chi2);
+
+    gradient_function_t fun_gradient =
+        [&] (const std::vector<double>& pars, int index, std::vector<double> &gradients)
+        {
+            return m_function_gradient.evaluate(pars, index, gradients);
+        };
+    m_kernel->setGradientFunction(
+        fun_gradient, m_fit_objects.getSizeOfDataSet() );
+
+    m_fit_objects.setNfreeParameters((int)fitParameters()->freeFitParameterCount());
+
+    // minimize
+    try {
+//        m_minimizer->minimize();
+        m_kernel->minimize();
+    } catch (int) {}
+
+    m_fit_objects.runSimulations(); // we run simulation once again for best values found
+}
+
+FitParameterSet *FitSuiteImpl::fitParameters() {
+    return m_kernel->fitParameters();
+}
+
+// get current number of minimization function calls
+size_t FitSuiteImpl::numberOfIterations() const
+{
+    return m_kernel->functionCalls();
+}
+
+size_t FitSuiteImpl::currentStrategyIndex() const
+{
+    return m_fit_strategies.currentStrategyIndex();
+}
+
+std::string FitSuiteImpl::reportResults() const
+{
+    return m_kernel->reportResults();
+}
+
+const FitKernel *FitSuiteImpl::kernel() const
+{
+   return m_kernel.get();
+}
+
+bool FitSuiteImpl::check_prerequisites() const
+{
+    if( !m_fit_objects.getNumberOfFitObjects() ) throw Exceptions::LogicErrorException(
+        "FitSuite::check_prerequisites() -> Error! No simulation/data description defined");
+    if( m_fit_objects.getSizeOfDataSet() == 0) throw Exceptions::LogicErrorException(
+        "FitSuite::check_prerequisites() -> Error! No elements to fit. "
+        "Looks like whole detector is masked.");
+    return true;
+}
+
+//! link FitMultiParameters with simulation parameters
+void FitSuiteImpl::link_fit_parameters()
+{
+    const std::unique_ptr<ParameterPool> pool(m_fit_objects.createParameterTree());
+    for (auto par: *m_kernel->fitParameters()) {
+        FitParameterLinked* linkedPar = dynamic_cast<FitParameterLinked*>(par);
+        if( !linkedPar )
+            throw std::runtime_error(
+                "FitKernel::link_fit_parameters() -> Error! Can't cast to FitParameterLinked.");
+        linkedPar->addMatchedParametersFromPool(pool.get());
+    }
+    msglog(MSG::DEBUG2) << "FitSuite::link_fit_parameters() -> Parameter pool:";
+    msglog(MSG::DEBUG2) << *pool;
+}
diff --git a/Core/Fitting/FitSuiteImpl.h b/Core/Fitting/FitSuiteImpl.h
new file mode 100644
index 0000000..feacb6e
--- /dev/null
+++ b/Core/Fitting/FitSuiteImpl.h
@@ -0,0 +1,123 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteImpl.h
+//! @brief     Defines class FitSuiteImpl.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITEIMPL_H
+#define FITSUITEIMPL_H
+
+#include "FitOptions.h"
+#include "FitSuiteFunctions.h"
+#include "FitSuiteObjects.h"
+#include "FitParameterSet.h"
+#include "FitSuiteStrategies.h"
+#include <functional>
+#ifndef SWIG
+#include <atomic>
+#endif
+
+class AttLimits;
+class GISASSimulation;
+class IMinimizer;
+class FitKernel;
+class FitParameterLinked;
+
+//! Fitting kernel for FitSuite.
+//! @ingroup fitting_internal
+
+class BA_CORE_API_ FitSuiteImpl
+{
+ public:
+    FitSuiteImpl(const std::function<void()>& notifyObservers);
+    FitSuiteImpl& operator=(const FitSuiteImpl&) = delete;
+    FitSuiteImpl(const FitSuiteImpl&) = delete;
+    virtual ~FitSuiteImpl();
+
+    //! Resets most state variables, to get prepared for the next fit
+    void clear();
+
+    //! Adds pair of (simulation, real data) for consecutive simulation
+    void addSimulationAndRealData(const GISASSimulation& simulation,
+                                  const OutputData<double>& real_data,
+                                  double weight);
+
+    //! Adds fit parameter
+    FitParameterLinked* addFitParameter(const std::string& name, double value,
+                                        const AttLimits& limits, double step = 0.0);
+
+    //! Adds fit strategy
+    void addFitStrategy(const IFitStrategy& strategy);
+
+    //! Sets minimizer
+    void setMinimizer(IMinimizer* minimizer);
+
+    //! Runs a fit, which may consist of several minimization rounds
+    virtual void runFit();
+
+    //! Runs a single minimization round (called by FitSuiteStrategy)
+    void minimize();
+
+    //! Returns reference to the kit with data
+    FitSuiteObjects* fitObjects() { return &m_fit_objects; }
+    const FitSuiteObjects* fitObjects() const { return &m_fit_objects; }
+
+    //! Returns reference to fit parameters
+    FitParameterSet* fitParameters();
+
+    //! Returns reference to fit parameters
+    FitSuiteStrategies* fitStrategies() { return &m_fit_strategies; }
+
+    //! Returns true if the last iteration is done (used by observers to print summary)
+    bool isLastIteration() const { return m_is_last_iteration; }
+
+    //! Returns current number of minimization function calls
+    size_t numberOfIterations() const;
+
+    //! Returns the number of current strategy
+    size_t currentStrategyIndex() const;
+
+    //! Reports results of minimization in the form of multi-line string.
+    std::string reportResults() const;
+
+    //! Returns current fit options
+    FitOptions& getOptions() { return m_fit_options; }
+
+    //! Sets fit options
+    void setOptions(const FitOptions& fit_options) { m_fit_options = fit_options; }
+
+    void notifyObservers() { m_notifyObservers(); }
+
+    void interruptFitting() { m_is_interrupted = true; }
+    void resetInterrupt() { m_is_interrupted = false; }
+    bool isInterrupted() const { return m_is_interrupted; }
+
+    const FitKernel* kernel() const;
+
+private:
+    bool check_prerequisites() const;
+    void link_fit_parameters();
+
+    FitOptions m_fit_options;
+    FitSuiteObjects m_fit_objects;
+    FitSuiteStrategies m_fit_strategies;
+    FitSuiteChiSquaredFunction m_function_chi2;
+    FitSuiteGradientFunction m_function_gradient;
+    bool m_is_last_iteration;
+#ifndef SWIG
+    std::atomic<bool> m_is_interrupted;
+#endif
+    std::function<void()> m_notifyObservers;
+    std::unique_ptr<FitKernel> m_kernel;
+};
+
+#endif // FITSUITEIMPL_H
diff --git a/Core/Fitting/FitSuiteObjects.cpp b/Core/Fitting/FitSuiteObjects.cpp
new file mode 100644
index 0000000..502955d
--- /dev/null
+++ b/Core/Fitting/FitSuiteObjects.cpp
@@ -0,0 +1,168 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteObjects.cpp
+//! @brief     Implements class FitSuiteObjects.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuiteObjects.h"
+#include "ChiSquaredModule.h"
+
+FitSuiteObjects::FitSuiteObjects()
+  : m_total_weight(0)
+   ,m_nfree_parameters(0)
+  , m_chi_squared_value(0)
+  , m_chi2_module(new ChiSquaredModule())
+  , m_fit_elements_count(0)
+{
+    setName("FitSuiteObjects");
+    init_parameters();
+}
+
+FitSuiteObjects::~FitSuiteObjects()
+{
+}
+
+void FitSuiteObjects::add(
+    const GISASSimulation& simulation, const OutputData<double>& real_data, double weight)
+{
+    m_total_weight += weight;
+    FitObject *fitObject = new FitObject(simulation, real_data, weight);
+    m_fit_elements_count += fitObject->numberOfFitElements();
+    m_fit_objects.push_back(fitObject);
+}
+
+//! Returns total number of data points
+size_t FitSuiteObjects::getSizeOfDataSet() const
+{
+    return m_fit_elements_count;
+}
+
+void FitSuiteObjects::setChiSquaredModule(const IChiSquaredModule& chi2_module)
+{
+    m_chi2_module.reset(chi2_module.clone());
+}
+
+const OutputData<double> &FitSuiteObjects::getRealData(size_t i_item) const
+{
+    return m_fit_objects[check_index(i_item)]->realData();
+}
+
+const OutputData<double> &FitSuiteObjects::getSimulationData(size_t i_item) const
+{
+    return m_fit_objects[check_index(i_item)]->simulationData();
+}
+
+const OutputData<double> &FitSuiteObjects::getChiSquaredMap(size_t i_item) const
+{
+    check_index(i_item);
+
+    size_t istart(0);
+    for(size_t i=0; i<i_item; ++i)
+        istart += m_fit_objects[i]->numberOfFitElements();
+
+    std::vector<FitElement>::const_iterator start = m_fit_elements.begin() + istart;
+    std::vector<FitElement>::const_iterator end = start
+            + m_fit_objects[i_item]->numberOfFitElements();
+
+    m_fit_objects[i_item]->transferToChi2Map(start, end);
+
+    return m_fit_objects[i_item]->chiSquaredMap();
+}
+
+//! loop through all defined simulations and run them
+void FitSuiteObjects::runSimulations()
+{
+    if(getSizeOfDataSet() == 0) {
+        std::ostringstream message;
+        message << "FitSuiteObjects::runSimulations() -> Error. Zero size of dataset.";
+        throw Exceptions::LogicErrorException(message.str());
+    }
+
+    m_fit_elements.clear();
+    m_fit_elements.reserve(getSizeOfDataSet());
+
+    for(auto it = m_fit_objects.begin(); it!= m_fit_objects.end(); ++it)
+        (*it)->prepareFitElements(m_fit_elements, (*it)->weight()/m_total_weight,
+                                  m_chi2_module->getIntensityNormalizer());
+
+    if(m_fit_elements.size() != getSizeOfDataSet()) {
+        std::ostringstream message;
+        message << "FitSuiteObjects::runSimulations() -> Error. Dataset size mismatch. "
+                << " m_fit_elements.size():" << m_fit_elements.size()
+                << " getSizeOfDataset():" << getSizeOfDataSet() << std::endl;
+        throw Exceptions::LogicErrorException(message.str());
+    }
+
+    m_chi_squared_value = calculateChiSquaredValue();
+}
+
+double FitSuiteObjects::getResidualValue(size_t global_index)
+{
+    if(global_index >= m_fit_elements.size())
+        throw Exceptions::LogicErrorException(
+            "FitSuiteObjects::getResidualValue() -> Error. Index exceeds size of dataset.");
+    return m_fit_elements[global_index].getResidual();
+}
+
+//! Adds parameters from local pool to external pool
+std::string FitSuiteObjects::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    // top object in our chain, and its without parameters, lets not include its name in path
+    std::string new_path = IParameterized::addParametersToExternalPool(
+        path, external_pool, copy_number);
+    //std::string new_path = path;
+
+    int ncopy(0);
+    // if we have only one object, lets get rid from copy number
+    if(m_fit_objects.size()==1)
+        ncopy=-1;
+    for(auto it = m_fit_objects.begin(); it!= m_fit_objects.end(); ++it, ++ncopy)
+        (*it)->addParametersToExternalPool(new_path, external_pool, ncopy);
+
+    if(m_chi2_module) {
+        const IIntensityNormalizer* data_normalizer = m_chi2_module->getIntensityNormalizer();
+        if(data_normalizer)
+            data_normalizer->addParametersToExternalPool(new_path, external_pool, -1);
+    }
+
+    return new_path;
+}
+
+void FitSuiteObjects::clear()
+{
+    m_fit_objects.clear();
+    m_fit_elements.clear();
+}
+
+double FitSuiteObjects::calculateChiSquaredValue()
+{
+    m_chi2_module->processFitElements(m_fit_elements.begin(), m_fit_elements.end());
+
+    double result(0);
+    for (auto it = m_fit_elements.begin(); it != m_fit_elements.end(); ++it)
+        result += it->getSquaredDifference();
+
+    int fnorm = m_fit_elements.size() - m_nfree_parameters;
+    if (fnorm <= 0)
+        throw Exceptions::LogicErrorException(
+            "FitSuiteObjects::calculateChiSquaredValue() -> Error. Normalization is 0");
+    return result / fnorm;
+}
+
+size_t FitSuiteObjects::check_index(size_t index) const
+{
+    if( index >= m_fit_objects.size() )
+        throw Exceptions::OutOfBoundsException("FitSuiteKit::check() -> Index outside of range");
+    return index;
+}
diff --git a/Core/Fitting/FitSuiteObjects.h b/Core/Fitting/FitSuiteObjects.h
new file mode 100644
index 0000000..1fc9e43
--- /dev/null
+++ b/Core/Fitting/FitSuiteObjects.h
@@ -0,0 +1,96 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteObjects.h
+//! @brief     Defines class FitSuiteObjects.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITEOBJECTS_H
+#define FITSUITEOBJECTS_H
+
+#include "FitObject.h"
+
+class IChiSquaredModule;
+
+//! Holds vector of FitObject's (simulation and real data) to fit
+//! @ingroup fitting_internal
+
+class BA_CORE_API_ FitSuiteObjects : public IParameterized, public INoncopyable
+{
+ public:
+    typedef SafePointerVector<FitObject> FitObjects_t;
+
+    FitSuiteObjects();
+    virtual ~FitSuiteObjects();
+
+    //! Adds to kit pair of (simulation, real data) for consecutive simulation
+    void add(const GISASSimulation& simulation, const OutputData<double>& real_data,
+             double weight = 1.0);
+
+    //! Returns number of fit objects (simulation/real data pairs)
+    size_t getNumberOfFitObjects() const { return m_fit_objects.size(); }
+
+    //! Returns total number of data points (number of all non-masked channels in all fit objects)
+    size_t getSizeOfDataSet() const;
+
+    //! Replaces default ChiSquaredModule with new one
+    void setChiSquaredModule(const IChiSquaredModule &chi2_module);
+
+    //! Returns real data from corresponding FitObject
+    //! @param i_item Index of FitObject
+    const OutputData<double>& getRealData(size_t i_item = 0) const;
+
+    //! Returns simulated data from corresponding FitObject
+    //! @param i_item Index of FitObject
+    const OutputData<double>& getSimulationData(size_t i_item = 0) const;
+
+    //! Returns new chi-squared map from corresponding FitObject
+    //! @param i_item Index of FitObject
+    const OutputData<double>& getChiSquaredMap(size_t i_item = 0) const;
+
+    //! run all simulation defined in fit pairs
+    void runSimulations();
+
+    //! Returns chi2 calculated over whole dataset
+    double getChiSquaredValue() const { return m_chi_squared_value; }
+
+    //! Returns residuals for single data element
+    //! @param global_index index accross all element in FitElement vector
+    double getResidualValue(size_t global_index);
+
+    //! Adds parameters from local pool to external pool and call recursion over direct children
+    virtual std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number=-1) const;
+
+    void setNfreeParameters(int nfree_parameters) { m_nfree_parameters = nfree_parameters; }
+
+    //! clear all data
+    void clear();
+
+ protected:
+    //! Registers some class members for later access via parameter pool
+    void init_parameters() {}
+
+    double calculateChiSquaredValue();
+
+ private:
+    inline size_t check_index(size_t index) const;
+
+    FitObjects_t m_fit_objects;
+    double m_total_weight;
+    int m_nfree_parameters;
+    double m_chi_squared_value;
+    std::vector<FitElement> m_fit_elements;
+    std::unique_ptr<IChiSquaredModule> m_chi2_module;
+    size_t m_fit_elements_count;
+};
+
+#endif // FITSUITEOBJECTS_H
diff --git a/Core/Fitting/FitSuitePrintObserver.cpp b/Core/Fitting/FitSuitePrintObserver.cpp
new file mode 100644
index 0000000..b2d4956
--- /dev/null
+++ b/Core/Fitting/FitSuitePrintObserver.cpp
@@ -0,0 +1,83 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuitePrintObserver.cpp
+//! @brief     Implements class FitSuitePrintObserver.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuitePrintObserver.h"
+#include "FitSuite.h"
+#include "FitParameterSet.h"
+#include "FitSuiteStrategies.h"
+#include "MinimizerUtils.h"
+#include <iostream>
+#include <iomanip>
+
+FitSuitePrintObserver::FitSuitePrintObserver(int print_every_nth)
+    : IFitObserver(print_every_nth)
+    , m_fit_suite(0)
+{
+}
+
+void FitSuitePrintObserver::update(FitSuite* fit_suite)
+{
+    m_fit_suite = fit_suite;
+
+    if(fit_suite->numberOfIterations() == 0) {
+        m_run_time.start();
+        m_last_call_time.start();
+    }
+
+    if(m_strategy_has_changed) {
+        std::cout << MinimizerUtils::sectionString() << "\n";
+        std::cout << (*m_fit_suite->fitStrategies()->currentStrategy()) << std::endl;
+        std::cout << MinimizerUtils::sectionString() << "\n";
+    }
+
+    printIterationHeader();
+    printWallTime();
+    printParameters();
+
+    if(fit_suite->isLastIteration())
+        printFitResults();
+}
+
+void FitSuitePrintObserver::printIterationHeader()
+{
+    std::cout << "FitPrintObserver::update() -> Info."
+              << " NCall:" << m_fit_suite->numberOfIterations()
+              << " NStrategy:" << m_fit_suite->currentStrategyIndex()
+              << " Chi2:" << std::scientific << std::setprecision(8)
+              << m_fit_suite->getChi2() << std::endl;
+}
+
+void FitSuitePrintObserver::printWallTime()
+{
+    m_last_call_time.stop();
+    std::cout << "Wall time since last call:" << std::fixed << std::setprecision(2)
+              << m_last_call_time.runTime() << std::endl;
+    m_last_call_time.start();
+}
+
+void FitSuitePrintObserver::printParameters()
+{
+    std::cout << m_fit_suite->fitParameters()->parametersToString() << std::endl;
+}
+
+void FitSuitePrintObserver::printFitResults()
+{
+    std::cout << "This was the last iteration." << std::endl;
+    m_run_time.stop();
+    m_fit_suite->printResults();
+    std::cout << "Total time spend: " << std::fixed << std::setprecision(2)
+              << m_run_time.runTime() << " sec." <<std::endl;
+    std::cout << std::endl;
+}
diff --git a/Core/Fitting/FitSuitePrintObserver.h b/Core/Fitting/FitSuitePrintObserver.h
new file mode 100644
index 0000000..e17a79b
--- /dev/null
+++ b/Core/Fitting/FitSuitePrintObserver.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuitePrintObserver.h
+//! @brief     Defines class FitSuitePrintObserver.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITEPRINTOBSERVER_H
+#define FITSUITEPRINTOBSERVER_H
+
+#include "IFitObserver.h"
+#include "TimeInterval.h"
+
+//! @class FitSuitePrintObserver
+//! @ingroup fitting_internal
+//! @brief Prints fit progress at the end of each FitSuite's iteration
+
+class BA_CORE_API_ FitSuitePrintObserver : public IFitObserver
+{
+public:
+    FitSuitePrintObserver(int print_every_nth = 1);
+    virtual ~FitSuitePrintObserver() {}
+
+    void update(FitSuite* fit_suite);
+
+protected:
+    void printIterationHeader();
+    void printWallTime();
+    void printParameters();
+    void printFitResults();
+
+    FitSuite* m_fit_suite;
+    TimeInterval m_run_time;
+    TimeInterval m_last_call_time;
+};
+
+#endif // FITSUITEPRINTOBSERVER_H
diff --git a/Core/Fitting/FitSuiteStrategies.cpp b/Core/Fitting/FitSuiteStrategies.cpp
new file mode 100644
index 0000000..131b7da
--- /dev/null
+++ b/Core/Fitting/FitSuiteStrategies.cpp
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteStrategies.cpp
+//! @brief     Implements class FitSuiteStrategies.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuiteStrategies.h"
+#include "FitSuiteImpl.h"
+#include <stdexcept>
+
+FitSuiteStrategies::FitSuiteStrategies()
+    : m_kernel(nullptr), m_current_strategy_index(0)
+{
+}
+
+FitSuiteStrategies::~FitSuiteStrategies()
+{
+    clear();
+}
+
+void FitSuiteStrategies::clear()
+{
+    m_strategies.clear();
+    m_current_strategy_index = 0;
+}
+
+IFitStrategy *FitSuiteStrategies::currentStrategy()
+{
+    if(m_current_strategy_index >= m_strategies.size())
+        throw std::runtime_error("FitSuiteStrategies::currentStrategy() -> Error in index.");
+
+    return m_strategies[m_current_strategy_index];
+}
+
+void FitSuiteStrategies::addStrategy(const IFitStrategy &strategy)
+{
+    IFitStrategy *clone = strategy.clone();
+    clone->init(m_kernel);
+    m_strategies.push_back(clone);
+}
+
+void FitSuiteStrategies::minimize()
+{
+    m_current_strategy_index = 0;
+    if( m_strategies.empty() ) {
+         m_kernel->minimize();
+    } else {
+        for(auto it=m_strategies.begin(); it!=m_strategies.end(); ++it) {
+            //msglog(MSG::INFO) << "FitSuiteStrategies::minimize() -> Running strategy #"
+            // << m_current_strategy_index << " '" << (*it)->getName() << "'";
+            (*it)->execute();
+            ++m_current_strategy_index;
+        }
+        --m_current_strategy_index;
+    }
+}
diff --git a/Core/Fitting/FitSuiteStrategies.h b/Core/Fitting/FitSuiteStrategies.h
new file mode 100644
index 0000000..0b7db5f
--- /dev/null
+++ b/Core/Fitting/FitSuiteStrategies.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/FitSuiteStrategies.h
+//! @brief     Defines class FitSuiteStrategies.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITESTRATEGIES_H
+#define FITSUITESTRATEGIES_H
+
+#include "IFitStrategy.h"
+#include "SafePointerVector.h"
+
+//! @class FitSuiteStrategies
+//! @ingroup fitting_internal
+//! @brief Collection of strategies to fit
+
+class BA_CORE_API_ FitSuiteStrategies
+{
+public:
+    FitSuiteStrategies();
+    virtual ~FitSuiteStrategies();
+    FitSuiteStrategies(const FitSuiteStrategies &other) = delete;
+    FitSuiteStrategies& operator=(const FitSuiteStrategies &other) = delete;
+
+    void init(FitSuiteImpl* fit_suite) { m_kernel = fit_suite; }
+
+    void addStrategy(const IFitStrategy& strategy);
+
+    void minimize();
+
+    size_t currentStrategyIndex() const { return m_current_strategy_index; }
+
+    size_t size() const { return m_strategies.size(); }
+
+    void clear();
+
+    IFitStrategy* currentStrategy();
+
+private:
+    SafePointerVector<IFitStrategy> m_strategies;
+    FitSuiteImpl* m_kernel;
+    size_t m_current_strategy_index;
+};
+
+#endif // FITSUITESTRATEGIES_H
diff --git a/Core/Fitting/IFitObserver.cpp b/Core/Fitting/IFitObserver.cpp
new file mode 100644
index 0000000..58fd63d
--- /dev/null
+++ b/Core/Fitting/IFitObserver.cpp
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/IFitObserver.cpp
+//! @brief     Implements class IFitObserver.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IFitObserver.h"
+#include "FitSuite.h"
+#include "FitSuiteStrategies.h"
+
+
+IFitObserver::IFitObserver(int update_every_nth)
+    : m_update_every_nth(update_every_nth)
+    , m_current_strategy_index(-1)
+    , m_strategy_has_changed(false)
+{
+}
+
+void IFitObserver::notify(IObservable* subject)
+{
+    FitSuite* fit_suite = dynamic_cast<FitSuite*>(subject);
+    if( !fit_suite )
+        throw Exceptions::NullPointerException(
+            "IFitObserver::update() -> Error! Can't access FitSuite");
+
+    bool needs_update(false);
+
+    if(fit_suite->fitStrategies()->size() &&
+            m_current_strategy_index != (int)fit_suite->currentStrategyIndex()) {
+        needs_update = true;
+        m_current_strategy_index = fit_suite->currentStrategyIndex();
+        m_strategy_has_changed = true;
+    } else {
+        m_strategy_has_changed = false;
+    }
+
+    if( fit_suite->numberOfIterations() == 0 )
+        needs_update = true;  // first iteration
+    if( fit_suite->isLastIteration() )
+        needs_update = true; // last iteration
+    if( fit_suite->numberOfIterations() % m_update_every_nth == 0 )
+        needs_update = true; // every n'th iteration
+
+    if(needs_update)
+        update(fit_suite);
+}
+
+void IFitObserver::update(FitSuite*)
+{
+    throw Exceptions::NotImplementedException(
+        "IFitObserver::update(IObservable *subject) -> Error. Not implemented.");
+}
diff --git a/Core/Fitting/IFitObserver.h b/Core/Fitting/IFitObserver.h
new file mode 100644
index 0000000..a0f36d0
--- /dev/null
+++ b/Core/Fitting/IFitObserver.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/IFitObserver.h
+//! @brief     Defines class IFitObserver.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+//* ************************************************************************* //
+
+#ifndef IFITOBSERVER_H
+#define IFITOBSERVER_H
+
+#include "IObserver.h"
+class FitSuite;
+
+//! @class IFitObserver
+//! @ingroup fitting_internal
+//! @brief Base class for all fit observers. Calls update method in following cases:
+//! first iteration, every n-th iteration, last iteration and when fit strategy has changed.
+
+class BA_CORE_API_ IFitObserver : public IObserver
+{
+public:
+    IFitObserver(int update_every_nth);
+
+    //! The method used by Ovservable when he wants to be observed by this
+    virtual void notify(IObservable* subject);
+
+    //! Here Onserver will do actuall job when he thinks that it is a right moment
+    virtual void update(FitSuite* fit_suite);
+
+protected:
+    int m_update_every_nth;
+    int m_current_strategy_index;
+    bool m_strategy_has_changed;
+};
+
+
+#endif // IFITOBSERVER_H
diff --git a/Core/Fitting/IFitStrategy.cpp b/Core/Fitting/IFitStrategy.cpp
new file mode 100644
index 0000000..1ddb758
--- /dev/null
+++ b/Core/Fitting/IFitStrategy.cpp
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/IFitStrategy.cpp
+//! @brief     Implements classes IFitStrategy and FitStrategyDefault
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IFitStrategy.h"
+#include "FitSuiteImpl.h"
+#include <stdexcept>
+
+IFitStrategy::IFitStrategy(const std::string &name)
+    : INamed(name), m_kernel(nullptr)
+{
+}
+
+void IFitStrategy::init(FitSuiteImpl* fit_suite)
+{
+    m_kernel = fit_suite;
+}
+
+std::string IFitStrategy::toString() const
+{
+    return getName();
+}
+
+IFitStrategy::IFitStrategy(const IFitStrategy &other)
+    : INamed(other)
+{
+    m_kernel = other.m_kernel;
+}
+
+// ----------------------------------------------------------------------------
+
+FitStrategyDefault::FitStrategyDefault()
+    : IFitStrategy("DefaultFitStrategy")
+{
+}
+
+FitStrategyDefault *FitStrategyDefault::clone() const
+{
+    return new FitStrategyDefault(*this);
+}
+
+void FitStrategyDefault::execute()
+{
+    if( !m_kernel )
+        throw std::runtime_error("FitStrategyDefault::execute() -> FitSuite doesn't exists");
+
+    m_kernel->minimize();
+}
+
+FitStrategyDefault::FitStrategyDefault(const FitStrategyDefault &other)
+    : IFitStrategy(other)
+{
+
+}
diff --git a/Core/Fitting/IFitStrategy.h b/Core/Fitting/IFitStrategy.h
new file mode 100644
index 0000000..f22313c
--- /dev/null
+++ b/Core/Fitting/IFitStrategy.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/IFitStrategy.h
+//! @brief     Defines interface class IFitStrategy, and class FitStrategyDefault
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IFITSTRATEGY_H
+#define IFITSTRATEGY_H
+
+#include "INamed.h"
+
+class FitSuiteImpl;
+
+//! @class IFitStrategy
+//! @ingroup fitting_internal
+//! @brief Interface to concrete fit strategy.
+//!
+//!  Concrete implementation should manipulate with fit parameters/data and then call minimizer.
+
+class BA_CORE_API_ IFitStrategy : public INamed
+{
+public:
+    explicit IFitStrategy(const std::string& name);
+    IFitStrategy& operator=(const IFitStrategy &other) = delete;
+    virtual ~IFitStrategy() {}
+
+    virtual IFitStrategy* clone() const = 0;
+
+    virtual void init(FitSuiteImpl* fit_suite);
+    virtual void execute() = 0;
+
+    friend std::ostream &operator<<(std::ostream &ostr, const IFitStrategy &m)
+    {
+        ostr << m.toString(); return ostr;
+    }
+
+protected:
+    IFitStrategy(const IFitStrategy &other);
+
+    virtual std::string toString() const;
+    FitSuiteImpl* m_kernel;
+};
+
+
+//! @class FitStrategyDefault
+//! @ingroup fitting
+//! @brief Default fit strategy just let FitSuite to run it's minimization round
+
+class BA_CORE_API_ FitStrategyDefault : public IFitStrategy
+{
+public:
+    FitStrategyDefault();
+    virtual FitStrategyDefault* clone() const;
+    virtual void execute();
+
+protected:
+    FitStrategyDefault(const FitStrategyDefault &other);
+};
+
+#endif // IFITSTRATEGY_H
diff --git a/Core/Fitting/IObserver.cpp b/Core/Fitting/IObserver.cpp
new file mode 100644
index 0000000..0badebb
--- /dev/null
+++ b/Core/Fitting/IObserver.cpp
@@ -0,0 +1,27 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/IObserver.cpp
+//! @brief     Implements class IObserver, mostly by including IObserver.h.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IObserver.h"
+
+void IObservable::attachObserver(observer_t obj)
+{
+    m_observers.push_back(obj);
+}
+
+void IObservable::notifyObservers()
+{
+    for(auto it: m_observers)
+        it->notify(this);
+}
diff --git a/Core/Fitting/IObserver.h b/Core/Fitting/IObserver.h
new file mode 100644
index 0000000..fb47613
--- /dev/null
+++ b/Core/Fitting/IObserver.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Fitting/IObserver.h
+//! @brief     Defines classes IObserver and IObservable (Observer pattern).
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IOBSERVER_H
+#define IOBSERVER_H
+
+#include "WinDllMacros.h"
+#include <list>
+#include <memory>
+
+class IObservable;
+
+//! @class IObserver
+//! @ingroup tools_internal
+//! @brief Observer interface from %Observer pattern, for 1:n object dependencies.
+
+class BA_CORE_API_ IObserver {
+public:
+    virtual ~IObserver() {}
+
+    //! method which is used by observable subject to notify change in status
+    virtual void notify (IObservable* subject) = 0;
+};
+
+//! @class IObservable
+//! @ingroup tools_internal
+//! @brief Observable interface from %Observer pattern, for 1:n object dependencies.
+
+class BA_CORE_API_ IObservable {
+public:
+    // Shared pointer is used when passing these objects from python to c++
+    typedef std::shared_ptr<IObserver> observer_t;
+    typedef std::list<observer_t> observerlist_t;
+
+    virtual ~IObservable() {}
+
+    //! attach observer to the list of observers
+    virtual void attachObserver(observer_t obj);
+
+    //! notify observers about change in status
+    virtual void notifyObservers();
+
+private:
+    observerlist_t m_observers;
+};
+
+#endif // IOBSERVER_H
diff --git a/Core/HardParticle/FormFactorAnisoPyramid.cpp b/Core/HardParticle/FormFactorAnisoPyramid.cpp
new file mode 100644
index 0000000..2060650
--- /dev/null
+++ b/Core/HardParticle/FormFactorAnisoPyramid.cpp
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorAnisoPyramid.cpp
+//! @brief     Implements class FormFactorAnisoPyramid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorAnisoPyramid.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorAnisoPyramid::topology = {
+    {
+        { { 3, 2, 1, 0 }, true },
+        { { 0, 1, 5, 4 }, false },
+        { { 1, 2, 6, 5 }, false },
+        { { 2, 3, 7, 6 }, false },
+        { { 3, 0, 4, 7 }, false },
+        { { 4, 5, 6, 7 }, true }
+    }, false };
+
+//! @param length of one side of the rectangular base
+//! @param width  of other side of the rectangular base
+//! @param height of frustum
+//! @param alpha  dihedral angle in radians between base and facet
+FormFactorAnisoPyramid::FormFactorAnisoPyramid(
+    double length, double width, double height, double alpha)
+    : FormFactorPolyhedron()
+    , m_length(length)
+    , m_width(width)
+    , m_height(height)
+    , m_alpha(alpha)
+{
+    setName(BornAgain::FFAnisoPyramidType);
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Alpha, & m_alpha).setUnit("rad").setLimited(0., M_PI_2);
+    onChange();
+}
+
+void FormFactorAnisoPyramid::onChange()
+{
+    double cot_alpha = MathFunctions::cot(m_alpha);
+    if( !std::isfinite(cot_alpha) || cot_alpha<0 )
+        throw Exceptions::OutOfBoundsException("AnisoPyramid: angle alpha out of bounds");
+    double r = cot_alpha*2 * m_height / m_length;
+    double s = cot_alpha*2 * m_height / m_width;
+    if( r>1 || s>1 ) {
+        std::ostringstream ostr;
+        ostr << "FormFactorAnisoPyramid() -> Error in class initialization with parameters";
+        ostr << " length:" << m_length;
+        ostr << " width:" << m_width;
+        ostr << " height:" << m_height;
+        ostr << " alpha[rad]:" << m_alpha << "\n\n";
+        ostr << "Check for '2*height <= (length,width)*tan(alpha)' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    double D = m_length/2;
+    double d = m_length/2 * (1-r);
+    double W = m_width/2;
+    double w = m_width/2 * (1-s);
+
+    double zcom = m_height * ( .5 - (r+s)/3 + r*s/4 ) / ( 1 - (r+s)/2 + r*s/3 ); // center of mass
+
+    setPolyhedron( topology, -zcom, {
+        // base:
+        { -D, -W, -zcom },
+        {  D, -W, -zcom },
+        {  D,  W, -zcom },
+        { -D,  W, -zcom },
+        // top:
+        { -d, -w, m_height-zcom },
+        {  d, -w, m_height-zcom },
+        {  d,  w, m_height-zcom },
+        { -d,  w, m_height-zcom } } );
+}
diff --git a/Core/HardParticle/FormFactorAnisoPyramid.h b/Core/HardParticle/FormFactorAnisoPyramid.h
new file mode 100644
index 0000000..56a1f7c
--- /dev/null
+++ b/Core/HardParticle/FormFactorAnisoPyramid.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorAnisoPyramid.h
+//! @brief     Defines class FormFactorAnisoPyramid
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORANISOPYRAMID_H
+#define FORMFACTORANISOPYRAMID_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A frustum (truncated pyramid) with rectangular base.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorAnisoPyramid : public FormFactorPolyhedron
+{
+public:
+    FormFactorAnisoPyramid(double length, double width, double height, double alpha);
+
+    FormFactorAnisoPyramid* clone() const override final {
+        return new FormFactorAnisoPyramid(m_length, m_width, m_height, m_alpha); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getLength() const { return m_length; }
+    double getWidth()  const { return m_width; }
+    double getHeight() const { return m_height; }
+    double getAlpha()  const { return m_alpha; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+
+    double m_length;
+    double m_width;
+    double m_height;
+    double m_alpha;
+};
+
+#endif // FORMFACTORANISOPYRAMID_H
diff --git a/Core/HardParticle/FormFactorBox.cpp b/Core/HardParticle/FormFactorBox.cpp
new file mode 100644
index 0000000..4411964
--- /dev/null
+++ b/Core/HardParticle/FormFactorBox.cpp
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorBox.cpp
+//! @brief     Implements class FormFactorBox.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorBox.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "RealParameter.h"
+
+//! @param length of rectangular base
+//! @param width  of rectangular base
+//! @param height of prism
+FormFactorBox::FormFactorBox(double length, double width, double height)
+    : m_length(length), m_width(width), m_height(height)
+{
+    setName(BornAgain::FFBoxType);
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width,  &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+complex_t FormFactorBox::evaluate_for_q(const cvector_t q) const
+{
+    complex_t qzHdiv2 = m_height/2*q.z();
+    return m_height*m_length*m_width *
+        MathFunctions::sinc(m_length/2*q.x()) *  MathFunctions::sinc(m_width/2*q.y()) *
+        MathFunctions::sinc(qzHdiv2) * exp_I(qzHdiv2);
+}
diff --git a/Core/HardParticle/FormFactorBox.h b/Core/HardParticle/FormFactorBox.h
new file mode 100644
index 0000000..aa82a3e
--- /dev/null
+++ b/Core/HardParticle/FormFactorBox.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorBox.h
+//! @brief     Defines class FormFactorBox.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORBOX_H
+#define FORMFACTORBOX_H
+
+#include "IFormFactorBorn.h"
+
+//! A rectangular prism (parallelepiped).
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorBox : public IFormFactorBorn
+{
+public:
+    FormFactorBox( double length, double width, double height);
+
+    FormFactorBox* clone() const override final {
+        return new FormFactorBox(m_length, m_width, m_height); }
+
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getLength() const { return m_length; }
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+
+    double getRadialExtension() const override final { return m_length/2.0; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_length;
+    double m_width;
+    double m_height;
+};
+
+#endif // FORMFACTORBOX_H
diff --git a/Core/HardParticle/FormFactorCone.cpp b/Core/HardParticle/FormFactorCone.cpp
new file mode 100644
index 0000000..38fa7dc
--- /dev/null
+++ b/Core/HardParticle/FormFactorCone.cpp
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCone.cpp
+//! @brief     Implements class FormFactorCone.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorCone.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+//! @param radius of circular base
+//! @param height of frustum
+//! @param alpha  angle in radians between base and lateral surface
+FormFactorCone::FormFactorCone(double radius, double height, double alpha)
+    : m_radius(radius), m_height(height), m_alpha(alpha)
+{
+    setName(BornAgain::FFConeType);
+    m_cot_alpha = MathFunctions::cot(m_alpha);
+    if( !std::isfinite(m_cot_alpha) || m_cot_alpha<0 )
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
+    if(m_cot_alpha*m_height > m_radius) {
+        std::ostringstream ostr;
+        ostr << "FormFactorCone() -> Error in class initialization ";
+        ostr << "with parameters radius:" << m_radius;
+        ostr << " m_height:" << m_height;
+        ostr << " alpha[rad]:" << m_alpha << "\n\n";
+        ostr << "Check for 'height <= radius*tan(alpha)' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Alpha, & m_alpha).setUnit("rad").setLimited(0., M_PI_2);
+
+    mP_integrator = make_integrator_complex(this, &FormFactorCone::Integrand);
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorCone::Integrand(double Z) const
+{
+    double Rz = m_radius - Z*m_cot_alpha;
+    complex_t q_p = std::sqrt(m_q.x()*m_q.x()+m_q.y()*m_q.y()); // sqrt(x*x + y*y)
+    return Rz*Rz*MathFunctions::Bessel_J1c(q_p*Rz) * exp_I(m_q.z()*Z);
+}
+
+complex_t FormFactorCone::evaluate_for_q(const cvector_t q) const
+{
+    m_q = q;
+    if ( std::abs(m_q.mag()) < std::numeric_limits<double>::epsilon()) {
+        double R = m_radius;
+        double H = m_height;
+        double tga = std::tan(m_alpha);
+        double HdivRtga = H/tga/R; // TODO preclude division by zero WAITING fuller refactoring
+
+        return  M_PI/3.0*tga*R*R*R*
+                (1.0 - (1.0 - HdivRtga)*(1.0 - HdivRtga)*(1.0 - HdivRtga));
+    } else {
+        complex_t integral = mP_integrator->integrate(0., m_height);
+        return M_TWOPI*integral;
+    }
+}
diff --git a/Core/HardParticle/FormFactorCone.h b/Core/HardParticle/FormFactorCone.h
new file mode 100644
index 0000000..660f03a
--- /dev/null
+++ b/Core/HardParticle/FormFactorCone.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCone.h
+//! @brief     Defines class FormFactorCone
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORCONE_H
+#define FORMFACTORCONE_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+// Forward declaration to prevent IntegratorComplex.h to be parsed for Python API:
+template <class T> class IntegratorComplex;
+
+//! A conical frustum (cone truncated parallel to the base) with circular base.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorCone : public IFormFactorBorn
+{
+public:
+    FormFactorCone(double radius, double height,  double alpha);
+
+    FormFactorCone* clone() const override final {
+        return new FormFactorCone(m_radius, m_height, m_alpha); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getAlpha() const { return m_alpha; }
+    double getRadius() const { return m_radius; }
+
+    double getRadialExtension() const override final { return m_radius; }
+
+    complex_t evaluate_for_q (const cvector_t q) const override final;
+
+private:
+    complex_t Integrand(double Z) const;
+
+    double m_radius;
+    double m_height;
+    double m_alpha;
+    double m_cot_alpha;
+    mutable cvector_t m_q;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorCone>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORCONE_H
diff --git a/Core/HardParticle/FormFactorCone6.cpp b/Core/HardParticle/FormFactorCone6.cpp
new file mode 100644
index 0000000..84020d4
--- /dev/null
+++ b/Core/HardParticle/FormFactorCone6.cpp
@@ -0,0 +1,90 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCone6.cpp
+//! @brief     Implements class FormFactorCone6.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorCone6.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorCone6::topology = {
+    {
+        { {  5,  4,  3,  2,  1,  0 }, true },
+        { {  0,  1,  7,  6 }, false },
+        { {  1,  2,  8,  7 }, false },
+        { {  2,  3,  9,  8 }, false },
+        { {  3,  4, 10,  9 }, false },
+        { {  4,  5, 11, 10 }, false },
+        { {  5,  0,  6, 11 }, false },
+        { {  6,  7,  8,  9, 10, 11 }, true }
+    }, false };
+
+//! @param base_edge of hexagonal base
+//! @param height    of frustum
+//! @param alpha     dihedral angle in radians between base and facet
+FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)
+    : FormFactorPolyhedron()
+    , m_base_edge(base_edge)
+    , m_height(height)
+    , m_alpha(alpha)
+{
+    setName(BornAgain::FFCone6Type);
+    registerParameter(BornAgain::BaseEdge, &m_base_edge).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Alpha, & m_alpha).setUnit("rad").setLimited(0., M_PI_2);
+    onChange();
+}
+
+void FormFactorCone6::onChange()
+{
+    double cot_alpha = MathFunctions::cot(m_alpha);
+    if( !std::isfinite(cot_alpha) || cot_alpha<0 )
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
+    double r = cot_alpha*2/sqrt(3) * m_height / m_base_edge; // L(top)/L(base)
+    if ( r > 1 ) {
+        std::ostringstream ostr;
+        ostr << "Incompatible parameters in Cone6 ";
+        ostr << "(base_edge=" << m_base_edge;
+        ostr << ", height:" << m_height;
+        ostr << ", alpha[rad]:" << m_alpha << ")";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    double a = m_base_edge;
+    double as = a/2;
+    double ac = a*sqrt(3)/2;
+    double b = a * (1-r);
+    double bs = b/2;
+    double bc = b*sqrt(3)/2;
+
+    double zcom = m_height * ( .5 - 2*r/3 + r*r/4 ) / ( 1 - r + r*r/3 ); // center of mass
+
+    setPolyhedron( topology, -zcom, {
+        // base:
+        {  a,   0., -zcom },
+        {  as,  ac, -zcom },
+        { -as,  ac, -zcom },
+        { -a,   0., -zcom },
+        { -as, -ac, -zcom },
+        {  as, -ac, -zcom },
+        // top:
+        {  b,   0., m_height-zcom },
+        {  bs,  bc, m_height-zcom },
+        { -bs,  bc, m_height-zcom },
+        { -b,   0., m_height-zcom },
+        { -bs, -bc, m_height-zcom },
+        {  bs, -bc, m_height-zcom } } );
+}
diff --git a/Core/HardParticle/FormFactorCone6.h b/Core/HardParticle/FormFactorCone6.h
new file mode 100644
index 0000000..d5b0846
--- /dev/null
+++ b/Core/HardParticle/FormFactorCone6.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCone6.h
+//! @brief     Defines class FormFactorCone6
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORCONE6_H
+#define FORMFACTORCONE6_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A frustum (truncated pyramid) with regular hexagonal base.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorCone6 : public FormFactorPolyhedron
+{
+public:
+    FormFactorCone6(double base_edge, double height,  double alpha);
+
+    FormFactorCone6* clone() const override final {
+        return new FormFactorCone6(m_base_edge, m_height, m_alpha); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getBaseEdge() const { return m_base_edge; }
+    double getHeight() const { return m_height; }
+    double getAlpha() const { return m_alpha; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+    double m_base_edge;
+    double m_height;
+    double m_alpha;
+};
+
+#endif // FORMFACTORCONE6_H
diff --git a/Core/HardParticle/FormFactorCuboctahedron.cpp b/Core/HardParticle/FormFactorCuboctahedron.cpp
new file mode 100644
index 0000000..43b880b
--- /dev/null
+++ b/Core/HardParticle/FormFactorCuboctahedron.cpp
@@ -0,0 +1,101 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCuboctahedron.cpp
+//! @brief     Implements class FormFactorCuboctahedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorCuboctahedron.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorCuboctahedron::topology = {
+    {
+        { {  3,  2,  1,  0 }, true  },
+        { {  0,  1,  5,  4 }, false },
+        { {  1,  2,  6,  5 }, false },
+        { {  2,  3,  7,  6 }, false },
+        { {  3,  0,  4,  7 }, false },
+        { {  4,  5,  9,  8 }, false },
+        { {  5,  6, 10,  9 }, false },
+        { {  6,  7, 11, 10 }, false },
+        { {  7,  4,  8, 11 }, false },
+        { {  8,  9, 10, 11 }, true  }
+    }, false };
+
+//! @param length        of one side of the square base
+//! @param height        of bottom frustum
+//! @param height_ratio: ratio of heights of top to bottom frustum
+//! @param alpha:        dihedral angle in radians between base and facet
+FormFactorCuboctahedron::FormFactorCuboctahedron(
+    double length, double height, double height_ratio, double alpha)
+    : FormFactorPolyhedron()
+    , m_length(length)
+    , m_height(height)
+    , m_height_ratio(height_ratio)
+    , m_alpha(alpha)
+{
+    setName(BornAgain::FFCuboctahedronType);
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::HeightRatio, &m_height_ratio).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Alpha, & m_alpha).setUnit("rad").setLimited(0., M_PI_2);
+    onChange();
+}
+
+void FormFactorCuboctahedron::onChange()
+{
+    double cot_alpha = MathFunctions::cot(m_alpha);
+    if( !std::isfinite(cot_alpha) || cot_alpha<0 )
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
+    double x = m_height_ratio;
+    double r = cot_alpha*2 * m_height / m_length;
+    if ( std::max(1.,x)*r > 1 ) {
+        std::ostringstream ostr;
+        ostr << "FormFactorCuboctahedron() -> Error in class initialization with parameters";
+        ostr << " height:" << m_height;
+        ostr << " length:" << m_length;
+        ostr << " height_ratio:" << m_height_ratio;
+        ostr << " alpha[rad]:" << m_alpha << "\n\n";
+        ostr << "Check for '2.*height <= length*tan(alpha)*min(1.,1.0/height_ratio)' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    double a = m_length/2 * (1-r);
+    double b = m_length/2;
+    double c = m_length/2 * (1-r*x);
+
+    double dzcom = m_height *
+        ( (x*x-1)/2 - 2*r*(x*x*x-1)/3 + r*r*(x*x*x*x-1)/4 ) /
+        ( (x  +1)   -   r*(x*x  +1)   + r*r*(x*x*x  +1)/3 );
+    double za = -dzcom-m_height;
+    double zb = -dzcom;
+    double zc = -dzcom+x*m_height;
+
+    setPolyhedron( topology, za, {
+            // base:
+            { -a, -a, za },
+            {  a, -a, za },
+            {  a,  a, za },
+            { -a,  a, za },
+            // middle
+            { -b, -b, zb },
+            {  b, -b, zb },
+            {  b,  b, zb },
+            { -b,  b, zb },
+            // top
+            { -c, -c, zc },
+            {  c, -c, zc },
+            {  c,  c, zc },
+            { -c,  c, zc } } );
+}
diff --git a/Core/HardParticle/FormFactorCuboctahedron.h b/Core/HardParticle/FormFactorCuboctahedron.h
new file mode 100644
index 0000000..f5d6906
--- /dev/null
+++ b/Core/HardParticle/FormFactorCuboctahedron.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCuboctahedron.h
+//! @brief     Defines class FormFactorCuboctahedron
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORCUBOCTAHEDRON_H
+#define FORMFACTORCUBOCTAHEDRON_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A truncated bifrustum with quadratic base.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorCuboctahedron : public FormFactorPolyhedron
+{
+public:
+    FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha);
+
+    FormFactorCuboctahedron *clone() const override final {
+        return new FormFactorCuboctahedron(m_length, m_height, m_height_ratio, m_alpha); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getLength() const { return m_length; }
+    double getHeight() const { return m_height; }
+    double getHeightRatio() const { return m_height_ratio; }
+    double getAlpha() const { return m_alpha; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+
+    double m_length;
+    double m_height;
+    double m_height_ratio;
+    double m_alpha;
+};
+
+#endif // FORMFACTORCUBOCTAHEDRON_H
diff --git a/Core/HardParticle/FormFactorCylinder.cpp b/Core/HardParticle/FormFactorCylinder.cpp
new file mode 100644
index 0000000..5468c6c
--- /dev/null
+++ b/Core/HardParticle/FormFactorCylinder.cpp
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCylinder.cpp
+//! @brief     Implements class FormFactorCylinder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorCylinder.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+FormFactorCylinder::FormFactorCylinder(double radius, double height)
+    : m_radius(radius), m_height(height)
+{
+    setName(BornAgain::FFCylinderType);
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+complex_t FormFactorCylinder::evaluate_for_q(const cvector_t q) const
+{
+    double R = m_radius;
+    double H = m_height;
+
+    complex_t qzH_half = q.z() * H / 2.0;
+    complex_t z_part = H * MathFunctions::sinc(qzH_half) * exp_I(qzH_half);
+    complex_t qxy = std::sqrt(q.x() * q.x() + q.y() * q.y());
+    complex_t radial_part = M_TWOPI * R * R * MathFunctions::Bessel_J1c(qxy * R);
+    complex_t result = radial_part * z_part;
+
+    return result;
+}
diff --git a/Core/HardParticle/FormFactorCylinder.h b/Core/HardParticle/FormFactorCylinder.h
new file mode 100644
index 0000000..482e516
--- /dev/null
+++ b/Core/HardParticle/FormFactorCylinder.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorCylinder.h
+//! @brief     Defines class FormFactorCylinder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORCYLINDER_H
+#define FORMFACTORCYLINDER_H
+
+#include "IFormFactorBorn.h"
+
+//! A circular cylinder.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorCylinder : public IFormFactorBorn
+{
+public:
+    FormFactorCylinder(double radius, double height);
+
+    FormFactorCylinder* clone() const override final {
+        return new FormFactorCylinder(m_radius, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getRadius() const { return m_radius; }
+
+    double getRadialExtension() const override final { return m_radius; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_radius;
+    double m_height;
+};
+
+#endif // FORMFACTORCYLINDER_H
diff --git a/Core/HardParticle/FormFactorDodecahedron.cpp b/Core/HardParticle/FormFactorDodecahedron.cpp
new file mode 100644
index 0000000..06a5a18
--- /dev/null
+++ b/Core/HardParticle/FormFactorDodecahedron.cpp
@@ -0,0 +1,75 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorDodecahedron.cpp
+//! @brief     Implements class FormFactorDodecahedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDodecahedron.h"
+#include "BornAgainNamespace.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorDodecahedron::topology = {
+    {
+        // bottom:
+        { {  0,  4,  3,  2,  1 }, false },
+        // lower ring:
+        { {  0,  5, 12,  9,  4 }, false },
+        { {  4,  9, 11,  8,  3 }, false },
+        { {  3,  8, 10,  7,  2 }, false },
+        { {  2,  7, 14,  6,  1 }, false },
+        { {  1,  6, 13,  5,  0 }, false },
+        // upper ring:
+        { {  8, 11, 16, 15, 10 }, false },
+        { {  9, 12, 17, 16, 11 }, false },
+        { {  5, 13, 18, 17, 12 }, false },
+        { {  6, 14, 19, 18, 13 }, false },
+        { {  7, 10, 15, 19, 14 }, false },
+        // top:
+        { { 15, 16, 17, 18, 19 }, false }
+    }, true };
+
+
+FormFactorDodecahedron::FormFactorDodecahedron(double edge)
+    : FormFactorPolyhedron()
+    , m_edge(edge)
+{
+    setName(BornAgain::FFDodecahedronType);
+    registerParameter(BornAgain::Edge, &m_edge).setUnit("nm").setNonnegative();
+    onChange();
+}
+
+void FormFactorDodecahedron::onChange()
+{
+    double a = m_edge;
+    setPolyhedron( topology, -1.113516364411607*a, {
+        {  0.8506508083520399*a,                   0*a,  -1.113516364411607*a},
+        {  0.2628655560595668*a,  0.8090169943749473*a,  -1.113516364411607*a},
+        { -0.6881909602355868*a,                 0.5*a,  -1.113516364411607*a},
+        { -0.6881909602355868*a,                -0.5*a,  -1.113516364411607*a},
+        {  0.2628655560595668*a, -0.8090169943749473*a,  -1.113516364411607*a},
+        {   1.376381920471174*a,                   0*a, -0.2628655560595667*a},
+        {    0.42532540417602*a,   1.309016994374947*a, -0.2628655560595667*a},
+        {  -1.113516364411607*a,  0.8090169943749475*a, -0.2628655560595667*a},
+        {  -1.113516364411607*a, -0.8090169943749475*a, -0.2628655560595667*a},
+        {    0.42532540417602*a,  -1.309016994374947*a, -0.2628655560595667*a},
+        {  -1.376381920471174*a,                   0*a,  0.2628655560595667*a},
+        {   -0.42532540417602*a,  -1.309016994374947*a,  0.2628655560595667*a},
+        {   1.113516364411607*a, -0.8090169943749475*a,  0.2628655560595667*a},
+        {   1.113516364411607*a,  0.8090169943749475*a,  0.2628655560595667*a},
+        {   -0.42532540417602*a,   1.309016994374947*a,  0.2628655560595667*a},
+        { -0.8506508083520399*a,                   0*a,   1.113516364411607*a},
+        { -0.2628655560595668*a, -0.8090169943749473*a,   1.113516364411607*a},
+        {  0.6881909602355868*a,                -0.5*a,   1.113516364411607*a},
+        {  0.6881909602355868*a,                 0.5*a,   1.113516364411607*a},
+        { -0.2628655560595668*a,  0.8090169943749473*a,   1.113516364411607*a} } );
+    assert_platonic();
+}
diff --git a/Core/HardParticle/FormFactorDodecahedron.h b/Core/HardParticle/FormFactorDodecahedron.h
new file mode 100644
index 0000000..df88a12
--- /dev/null
+++ b/Core/HardParticle/FormFactorDodecahedron.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorDodecahedron.h
+//! @brief     Defines class FormFactorDodecahedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDODECAHEDRON_H
+#define FORMFACTORDODECAHEDRON_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A regular dodecahedron.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorDodecahedron : public FormFactorPolyhedron
+{
+public:
+    //! @brief Constructs a regular dodecahedron
+    //! @param edge length
+    FormFactorDodecahedron(double edge);
+
+    FormFactorDodecahedron *clone() const override final {
+        return new FormFactorDodecahedron(m_edge); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getEdge() const { return m_edge; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+    double m_edge;
+};
+
+#endif // FORMFACTORDODECAHEDRON_H
diff --git a/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
new file mode 100644
index 0000000..09164b6
--- /dev/null
+++ b/Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorEllipsoidalCylinder.cpp
+//! @brief     Implements class FormFactorEllipsoidalCylinder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorEllipsoidalCylinder.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+//! @param radius_x half length of one horizontal main axes
+//! @param radius_y half length of the other horizontal main axes
+//! @param height
+FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(
+    double radius_x, double radius_y, double height)
+    : m_radius_x(radius_x), m_radius_y(radius_y), m_height(height)
+{
+    setName(BornAgain::FFEllipsoidalCylinderType);
+    registerParameter(BornAgain::RadiusX, &m_radius_x).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::RadiusY, & m_radius_y).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+double FormFactorEllipsoidalCylinder::getRadialExtension() const
+{
+    return ( m_radius_x + m_radius_y ) / 2.0;
+}
+
+complex_t FormFactorEllipsoidalCylinder::evaluate_for_q(const cvector_t q) const
+{
+    complex_t qxRa = q.x()*m_radius_x;
+    complex_t qyRb = q.y()*m_radius_y;
+    complex_t qzHdiv2 = m_height/2*q.z();
+
+    complex_t Fz = exp_I(qzHdiv2) * MathFunctions::sinc(qzHdiv2);
+    complex_t gamma  = std::sqrt((qxRa)*(qxRa) + (qyRb)*(qyRb));
+    complex_t J1_gamma_div_gamma = MathFunctions::Bessel_J1c(gamma);
+
+    return M_TWOPI *m_radius_x*m_radius_y*m_height * Fz*J1_gamma_div_gamma;
+}
diff --git a/Core/HardParticle/FormFactorEllipsoidalCylinder.h b/Core/HardParticle/FormFactorEllipsoidalCylinder.h
new file mode 100644
index 0000000..7e24803
--- /dev/null
+++ b/Core/HardParticle/FormFactorEllipsoidalCylinder.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorEllipsoidalCylinder.h
+//! @brief     Defines class FormFactorEllipsoidalCylinder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORELLIPSOIDALCYLINDER_H
+#define FORMFACTORELLIPSOIDALCYLINDER_H
+
+#include "IFormFactorBorn.h"
+
+//! A cylinder with elliptical base.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorEllipsoidalCylinder : public IFormFactorBorn
+{
+public:
+    FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height);
+
+    FormFactorEllipsoidalCylinder* clone() const override final {
+        return new FormFactorEllipsoidalCylinder(m_radius_x, m_radius_y, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadiusX() const { return m_radius_x; }
+    double getRadiusY() const { return m_radius_y; }
+    double getHeight() const { return m_height; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_radius_x;
+    double m_radius_y;
+    double m_height;
+};
+
+#endif // FORMFACTORELLIPSOIDALCYLINDER_H
diff --git a/Core/HardParticle/FormFactorFullSphere.cpp b/Core/HardParticle/FormFactorFullSphere.cpp
new file mode 100644
index 0000000..1cc9ea2
--- /dev/null
+++ b/Core/HardParticle/FormFactorFullSphere.cpp
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorFullSphere.cpp
+//! @brief     Implements class FormFactorFullSphere.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorFullSphere.h"
+#include "BornAgainNamespace.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+FormFactorFullSphere::FormFactorFullSphere(double radius)
+    : m_radius(radius)
+{
+    setName(BornAgain::FFFullSphereType);
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+}
+
+complex_t FormFactorFullSphere::evaluate_for_q(const cvector_t q) const
+{
+    double R = m_radius;
+    complex_t q1 = sqrt( q.x()*q.x() + q.y()*q.y() + q.z()*q.z() ); // NO sesquilinear dot product!
+    complex_t qR = q1*R;
+
+    complex_t ret;
+    if (std::abs(qR) < 1e-4) { // relative error is O(qR^4) with small prefactor
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        diagnosis = { 0, 1 };
+#endif
+        ret = 4*M_PI/3*pow(R,3) * ( 1. - 0.1*pow(qR,2) );
+    }
+    else {
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        diagnosis = { 0, 0 };
+#endif
+        ret = 4*M_PI*pow(q1,-3)*(sin(qR) - qR*cos(qR));
+    }
+
+    return exp_I(q.z()*R) * ret;
+}
diff --git a/Core/HardParticle/FormFactorFullSphere.h b/Core/HardParticle/FormFactorFullSphere.h
new file mode 100644
index 0000000..b8484d9
--- /dev/null
+++ b/Core/HardParticle/FormFactorFullSphere.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorFullSphere.h
+//! @brief     Defines class FormFactorFullSphere.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORFULLSPHERE_H
+#define FORMFACTORFULLSPHERE_H
+
+#include "IFormFactorBorn.h"
+
+//! A full sphere.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorFullSphere : public IFormFactorBorn
+{
+public:
+    FormFactorFullSphere(double radius);
+
+    FormFactorFullSphere* clone() const override final {
+        return new FormFactorFullSphere(m_radius); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadius() const { return m_radius; }
+
+    double getRadialExtension() const override final { return m_radius; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_radius;
+};
+
+#endif // FORMFACTORFULLSPHERE_H
diff --git a/Core/HardParticle/FormFactorFullSpheroid.cpp b/Core/HardParticle/FormFactorFullSpheroid.cpp
new file mode 100644
index 0000000..26ca15e
--- /dev/null
+++ b/Core/HardParticle/FormFactorFullSpheroid.cpp
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorFullSpheroid.cpp
+//! @brief     Implements class FormFactorFullSpheroid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorFullSpheroid.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+//! @param radius of the two equal axes
+//! @param height total height of the spheroid, i.e. twice the radius of the third axis
+FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height )
+    : m_radius(radius), m_height(height)
+{
+    setName(BornAgain::FFFullSpheroidType);
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    mP_integrator = make_integrator_complex(this, &FormFactorFullSpheroid::Integrand);
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorFullSpheroid::Integrand(double Z) const
+{
+    double R = m_radius;
+    double H = m_height;
+
+    double Rz  = R*std::sqrt(1-4.0*Z*Z/(H*H));
+    complex_t qxy = std::sqrt(m_q.x()*m_q.x()+m_q.y()*m_q.y());
+    complex_t qrRz = qxy*Rz;
+    complex_t J1_qrRz_div_qrRz = MathFunctions::Bessel_J1c(qrRz);
+
+    return Rz*Rz* J1_qrRz_div_qrRz *std::cos(m_q.z()*Z);
+}
+
+complex_t FormFactorFullSpheroid::evaluate_for_q(const cvector_t q) const
+{
+    double H = m_height;
+    double R = m_radius;
+    m_q = q;
+
+    if (std::abs(m_q.mag()) <= std::numeric_limits<double>::epsilon())
+        return M_TWOPI*R*R*H/3.;
+    complex_t qzH_half = H/2*q.z();
+    return 4 * M_PI * mP_integrator->integrate(0.0, H/2.0) * exp_I(qzH_half);
+}
diff --git a/Core/HardParticle/FormFactorFullSpheroid.h b/Core/HardParticle/FormFactorFullSpheroid.h
new file mode 100644
index 0000000..45130d5
--- /dev/null
+++ b/Core/HardParticle/FormFactorFullSpheroid.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorFullSpheroid.h
+//! @brief     Defines class FormFactorFullSpheroid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORFULLSPHEROID_H
+#define FORMFACTORFULLSPHEROID_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+//! A full spheroid (an ellipsoid with two equal axes, hence with circular cross section)
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorFullSpheroid : public IFormFactorBorn
+{
+public:
+    FormFactorFullSpheroid(double radius, double height);
+
+    FormFactorFullSpheroid* clone() const override final {
+        return new FormFactorFullSpheroid(m_radius, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getRadius() const { return m_radius; }
+
+    double getRadialExtension() const override final { return m_radius; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    complex_t Integrand(double Z) const;
+
+    double m_radius;
+    double m_height;
+    mutable cvector_t m_q;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorFullSpheroid>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORFULLSPHEROID_H
diff --git a/Core/HardParticle/FormFactorHemiEllipsoid.cpp b/Core/HardParticle/FormFactorHemiEllipsoid.cpp
new file mode 100644
index 0000000..241b44e
--- /dev/null
+++ b/Core/HardParticle/FormFactorHemiEllipsoid.cpp
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorHemiEllipsoid.cpp
+//! @brief     Implements class FormFactorHemiEllipsoid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorHemiEllipsoid.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+//! @param radius_x half length of one horizontal main axes
+//! @param radius_y half length of the other horizontal main axes
+//! @param height of the hemi ellipsoid
+FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)
+    : m_radius_x(radius_x), m_radius_y(radius_y), m_height(height)
+{
+    setName(BornAgain::FFHemiEllipsoidType);
+    registerParameter(BornAgain::RadiusX, &m_radius_x).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::RadiusY, & m_radius_y).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    mP_integrator = make_integrator_complex(this, &FormFactorHemiEllipsoid::Integrand);
+}
+
+double FormFactorHemiEllipsoid::getRadialExtension() const
+{
+    return ( m_radius_x + m_radius_y ) / 2.0;
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorHemiEllipsoid::Integrand(double Z) const
+{
+    double R = m_radius_x;
+    double W = m_radius_y;
+    double H = m_height;
+
+    double Rz = R * std::sqrt(1.0 - Z*Z/(H*H));
+    double Wz = W * std::sqrt(1.0 - Z*Z/(H*H));
+
+    complex_t qxRz = m_q.x()*Rz;
+    complex_t qyWz = m_q.y()*Wz;
+
+    complex_t gamma = std::sqrt(qxRz*qxRz + qyWz*qyWz);
+    complex_t J1_gamma_div_gamma = MathFunctions::Bessel_J1c(gamma);
+
+    return Rz * Wz * J1_gamma_div_gamma * exp_I(m_q.z()*Z);
+}
+
+complex_t FormFactorHemiEllipsoid::evaluate_for_q(const cvector_t q) const
+{
+     m_q = q;
+     double R = m_radius_x;
+     double W = m_radius_y;
+     double H = m_height;
+
+     if (std::abs(m_q.mag()) <= std::numeric_limits<double>::epsilon())
+         return M_TWOPI*R*W*H/3.;
+     return M_TWOPI*mP_integrator->integrate(0.,H );
+}
diff --git a/Core/HardParticle/FormFactorHemiEllipsoid.h b/Core/HardParticle/FormFactorHemiEllipsoid.h
new file mode 100644
index 0000000..732b77e
--- /dev/null
+++ b/Core/HardParticle/FormFactorHemiEllipsoid.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorHemiEllipsoid.h
+//! @brief     Defines class FormFactorHemiEllipsoid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORHEMIELLIPSOID_H
+#define FORMFACTORHEMIELLIPSOID_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+//! An hemi ellipsoid,
+//!   obtained by truncating a full ellipsoid in the middle plane spanned by two principal axes.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorHemiEllipsoid : public IFormFactorBorn
+{
+public:
+    FormFactorHemiEllipsoid(double radius_x, double radius_y, double height);
+    virtual ~FormFactorHemiEllipsoid() {}
+
+    FormFactorHemiEllipsoid* clone() const override final {
+        return new FormFactorHemiEllipsoid(m_radius_x, m_radius_y, m_height); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getRadiusX() const { return m_radius_x; }
+    double getRadiusY() const { return m_radius_y; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q (const cvector_t q) const override final;
+
+private:
+    complex_t Integrand(double Z) const;
+
+    double m_radius_x;
+    double m_radius_y;
+    double m_height;
+    mutable cvector_t m_q;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorHemiEllipsoid>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORHEMIELLIPSOID_H
diff --git a/Core/HardParticle/FormFactorIcosahedron.cpp b/Core/HardParticle/FormFactorIcosahedron.cpp
new file mode 100644
index 0000000..235f8e6
--- /dev/null
+++ b/Core/HardParticle/FormFactorIcosahedron.cpp
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorIcosahedron.cpp
+//! @brief     Implements class FormFactorIcosahedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorIcosahedron.h"
+#include "BornAgainNamespace.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorIcosahedron::topology = {
+    {
+        // bottom:
+        { {  0,  2,  1 }, false },
+        // 1st row:
+        { {  0,  5,  2 }, false },
+        { {  2,  3,  1 }, false },
+        { {  1,  4,  0 }, false },
+        // 2nd row:
+        { {  0,  6,  5 }, false },
+        { {  2,  5,  8 }, false },
+        { {  2,  8,  3 }, false },
+        { {  1,  3,  7 }, false },
+        { {  1,  7,  4 }, false },
+        { {  0,  4,  6 }, false },
+        // 3rd row:
+        { {  3,  8,  9 }, false },
+        { {  5, 11,  8 }, false },
+        { {  5,  6, 11 }, false },
+        { {  4, 10,  6 }, false },
+        { {  4,  7, 10 }, false },
+        { {  3,  9,  7 }, false },
+        // 4th row:
+        { {  8, 11,  9 }, false },
+        { {  6, 10, 11 }, false },
+        { {  7,  9, 10 }, false },
+        // top:
+        { {  9, 11, 10 }, false }
+    }, true };
+
+
+FormFactorIcosahedron::FormFactorIcosahedron(double edge)
+    : FormFactorPolyhedron()
+    , m_edge(edge)
+{
+    setName(BornAgain::FFIcosahedronType);
+    registerParameter(BornAgain::Edge, &m_edge).setUnit("nm").setNonnegative();
+    onChange();
+}
+
+void FormFactorIcosahedron::onChange()
+{
+    double a = m_edge;
+    setPolyhedron( topology, -0.7557613140761708*a, {
+        {  0.5773502691896258*a,                   0*a, -0.7557613140761708*a},
+        {  -0.288675134594813*a,                 0.5*a, -0.7557613140761708*a},
+        {  -0.288675134594813*a,                -0.5*a, -0.7557613140761708*a},
+        { -0.9341723589627158*a,                   0*a, -0.1784110448865449*a},
+        {   0.467086179481358*a,  0.8090169943749475*a, -0.1784110448865449*a},
+        {   0.467086179481358*a, -0.8090169943749475*a, -0.1784110448865449*a},
+        {  0.9341723589627158*a,                   0*a,  0.1784110448865449*a},
+        {  -0.467086179481358*a,  0.8090169943749475*a,  0.1784110448865449*a},
+        {  -0.467086179481358*a, -0.8090169943749475*a,  0.1784110448865449*a},
+        { -0.5773502691896258*a,                   0*a,  0.7557613140761708*a},
+        {   0.288675134594813*a,                 0.5*a,  0.7557613140761708*a},
+        {   0.288675134594813*a,                -0.5*a,  0.7557613140761708*a} } );
+    assert_platonic();
+}
diff --git a/Core/HardParticle/FormFactorIcosahedron.h b/Core/HardParticle/FormFactorIcosahedron.h
new file mode 100644
index 0000000..2e3272b
--- /dev/null
+++ b/Core/HardParticle/FormFactorIcosahedron.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorIcosahedron.h
+//! @brief     Defines class FormFactorIcosahedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORICOSAHEDRON_H
+#define FORMFACTORICOSAHEDRON_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A regular icosahedron.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorIcosahedron : public FormFactorPolyhedron
+{
+public:
+    FormFactorIcosahedron(double edge);
+
+    FormFactorIcosahedron *clone() const override final {
+        return new FormFactorIcosahedron(m_edge); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getEdge() const { return m_edge; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+    double m_edge;
+};
+
+#endif // FORMFACTORICOSAHEDRON_H
diff --git a/Core/HardParticle/FormFactorLongBoxGauss.cpp b/Core/HardParticle/FormFactorLongBoxGauss.cpp
new file mode 100644
index 0000000..584eb56
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongBoxGauss.cpp
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongBoxGauss.cpp
+//! @brief     Implements class FormFactorLongBoxGauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorLongBoxGauss.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "RealParameter.h"
+
+FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)
+    : m_length(length), m_width(width), m_height(height)
+{
+    setName(BornAgain::FFLongBoxGaussType);
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+complex_t FormFactorLongBoxGauss::evaluate_for_q(const cvector_t q) const
+{
+    complex_t qxL2 = std::pow(m_length * q.x(), 2) / 2.0;
+    complex_t qyWdiv2 = m_width * q.y() / 2.0;
+    complex_t qzHdiv2 = m_height * q.z() / 2.0;
+
+    return m_height * m_length * m_width * exp_I(qzHdiv2) * std::exp(-qxL2)
+           * MathFunctions::sinc(qyWdiv2) * MathFunctions::sinc(qzHdiv2);
+}
diff --git a/Core/HardParticle/FormFactorLongBoxGauss.h b/Core/HardParticle/FormFactorLongBoxGauss.h
new file mode 100644
index 0000000..7756ed0
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongBoxGauss.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongBoxGauss.h
+//! @brief     Defines class FormFactorLongBoxGauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORLONGBOXGAUSS_H
+#define FORMFACTORLONGBOXGAUSS_H
+
+#include "IFormFactorBorn.h"
+
+//! The formfactor for a long rectangular box.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorLongBoxGauss : public IFormFactorBorn
+{
+public:
+    //! @brief Box constructor
+    //! @param length of Box's base
+    //! @param width of Box's base
+    //! @param height of Box
+    FormFactorLongBoxGauss( double length, double width, double height);
+
+    FormFactorLongBoxGauss *clone() const override final {
+        return new FormFactorLongBoxGauss(m_length, m_width, m_height); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getLength() const { return m_length; }
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+    double getRadialExtension() const override final{ return m_length/2.0; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_length;
+    double m_width;
+    double m_height;
+};
+
+#endif // FORMFACTORLONGBOXGAUSS_H
diff --git a/Core/HardParticle/FormFactorLongBoxLorentz.cpp b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
new file mode 100644
index 0000000..98a17dd
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongBoxLorentz.cpp
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongBoxLorentz.cpp
+//! @brief     Implements class FormFactorLongBoxLorentz.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorLongBoxLorentz.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "RealParameter.h"
+
+FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)
+    : m_length(length), m_width(width), m_height(height)
+{
+    setName(BornAgain::FFLongBoxLorentzType);
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+complex_t FormFactorLongBoxLorentz::evaluate_for_q(const cvector_t q) const
+{
+    complex_t qxL2 = 2.5*std::pow(m_length * q.x(), 2);
+    complex_t qyWdiv2 = m_width * q.y() / 2.0;
+    complex_t qzHdiv2 = m_height * q.z() / 2.0;
+
+    return m_height * m_length * m_width * std::exp(complex_t(0., 1.) * qzHdiv2) / (1.0 + qxL2)
+           * MathFunctions::sinc(qyWdiv2) * MathFunctions::sinc(qzHdiv2);
+}
diff --git a/Core/HardParticle/FormFactorLongBoxLorentz.h b/Core/HardParticle/FormFactorLongBoxLorentz.h
new file mode 100644
index 0000000..8cc5aa8
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongBoxLorentz.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongBoxLorentz.h
+//! @brief     Defines class FormFactorLongBoxLorentz.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORLONGBOXLORENTZ_H
+#define FORMFACTORLONGBOXLORENTZ_H
+
+#include "IFormFactorBorn.h"
+
+//! The formfactor for a long rectangular box.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorLongBoxLorentz : public IFormFactorBorn
+{
+public:
+    //! @brief Box constructor
+    //! @param length of Box's base
+    //! @param width of Box's base
+    //! @param height of Box
+    FormFactorLongBoxLorentz( double length, double width, double height);
+
+    FormFactorLongBoxLorentz* clone() const override final {
+        return new FormFactorLongBoxLorentz(m_length, m_width, m_height); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getLength() const { return m_length; }
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+
+    double getRadialExtension() const override final { return m_length/2.0; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_length;
+    double m_width;
+    double m_height;
+};
+
+#endif // FORMFACTORLONGBOXLORENTZ_H
diff --git a/Core/HardParticle/FormFactorLongRipple1Gauss.cpp b/Core/HardParticle/FormFactorLongRipple1Gauss.cpp
new file mode 100644
index 0000000..102118a
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple1Gauss.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple1Gauss.cpp
+//! @brief     Implements class FormFactorLongRipple1Gauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorLongRipple1Gauss.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "RealLimits.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+FormFactorLongRipple1Gauss::FormFactorLongRipple1Gauss(double length, double width, double height)
+    : m_length(length), m_width(width), m_height(height)
+{
+    setName(BornAgain::FFLongRipple1GaussType);
+    check_initialization();
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    mP_integrator = make_integrator_complex(this, &FormFactorLongRipple1Gauss::Integrand);
+}
+
+bool FormFactorLongRipple1Gauss::check_initialization() const
+{
+    bool result(true);
+    if(m_height <=0.0 || m_width<=0.0 || m_length<=0.0) {
+        std::ostringstream ostr;
+        ostr << "FormFactorLongRipple1Gauss() -> Error in class initialization with parameters ";
+        ostr << " height:" << m_height;
+        ostr << " width:" << m_width;
+        ostr << " length:" << m_length << "\n\n";
+        ostr << "Check for 'height>0.0 && width>0.0 && length>0.0' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    return result;
+}
+
+double FormFactorLongRipple1Gauss::getRadialExtension() const
+{
+    return ( m_width + m_length ) / 4.0;
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorLongRipple1Gauss::Integrand(double Z) const
+{
+    complex_t aa = std::acos(2.0*Z/m_height - 1.0);
+    return exp_I(m_q.z()*Z)*aa*MathFunctions::sinc(aa*m_q.y()*m_width/(M_TWOPI));
+}
+
+//! Complex formfactor.
+complex_t FormFactorLongRipple1Gauss::evaluate_for_q(const cvector_t q) const
+{
+    m_q = q;
+//    complex_t factor = m_length*MathFunctions::sinc(m_q.x()*m_length*0.5)*m_width/M_PI;
+    complex_t qxL2 = std::pow(m_length * q.x(), 2) / 2.0;
+    complex_t factor = m_length*std::exp(-qxL2)*m_width/M_PI;
+
+    complex_t aaa = m_q.y()*m_width/(M_TWOPI);
+    complex_t aaa2 = aaa*aaa;
+
+    // analytical expressions for some particular cases
+    if (0.0==m_q.y() && 0.0==m_q.z())
+        return factor*M_PI_2*m_height;
+    else if (0.0==m_q.z() && 1.0 == aaa2)
+        return factor*M_PI_4*m_height;
+    else if (0.0==m_q.z())
+        return factor*M_PI_2*m_height*MathFunctions::sinc(m_q.y()*m_width*0.5)/(1.0-aaa2);
+
+    // numerical integration otherwise
+    complex_t integral = mP_integrator->integrate(0, m_height);
+    return factor * integral;
+}
diff --git a/Core/HardParticle/FormFactorLongRipple1Gauss.h b/Core/HardParticle/FormFactorLongRipple1Gauss.h
new file mode 100644
index 0000000..020d70d
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple1Gauss.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple1Gauss.h
+//! @brief     Defines class FormFactorLongRipple1Gauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORLONGRIPPLE1GAUSS_H
+#define FORMFACTORLONGRIPPLE1GAUSS_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+//! The formfactor for a cosine ripple.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorLongRipple1Gauss : public IFormFactorBorn
+{
+public:
+    //! @brief Ripple1 constructor
+    //! @param length of Ripple1
+    //! @param width of cosine cross section
+    //! @param height of cosine cross section
+    FormFactorLongRipple1Gauss(double length, double width, double height);
+
+    FormFactorLongRipple1Gauss* clone() const override final {
+        return new FormFactorLongRipple1Gauss(m_length, m_width, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+    double getLength() const { return m_length; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    complex_t Integrand(double Z) const;
+    bool check_initialization() const;
+
+    double m_length;
+    double m_width;
+    double m_height;
+    mutable cvector_t m_q;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorLongRipple1Gauss>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORLONGRIPPLE1GAUSS_H
diff --git a/Core/HardParticle/FormFactorLongRipple1Lorentz.cpp b/Core/HardParticle/FormFactorLongRipple1Lorentz.cpp
new file mode 100644
index 0000000..4ae4edb
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple1Lorentz.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple1Lorentz.cpp
+//! @brief     Implements class FormFactorLongRipple1Lorentz.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorLongRipple1Lorentz.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+FormFactorLongRipple1Lorentz::FormFactorLongRipple1Lorentz(
+    double length, double width, double height)
+    : m_length(length), m_width(width), m_height(height)
+{
+    setName(BornAgain::FFLongRipple1LorentzType);
+    check_initialization();
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    mP_integrator = make_integrator_complex(this, &FormFactorLongRipple1Lorentz::Integrand);
+}
+
+bool FormFactorLongRipple1Lorentz::check_initialization() const
+{
+    bool result(true);
+    if(m_height <=0.0 || m_width<=0.0 || m_length<=0.0) {
+        std::ostringstream ostr;
+        ostr << "FormFactorLongRipple1Lorentz() -> Error in class initialization with parameters ";
+        ostr << " height:" << m_height;
+        ostr << " width:" << m_width;
+        ostr << " length:" << m_length << "\n\n";
+        ostr << "Check for 'height>0.0 && width>0.0 && length>0.0' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    return result;
+}
+
+double FormFactorLongRipple1Lorentz::getRadialExtension() const
+{
+    return ( m_width + m_length ) / 4.0;
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorLongRipple1Lorentz::Integrand(double Z) const
+{
+    complex_t aa = std::acos(2.0*Z/m_height - 1.0);
+    return exp_I(m_q.z()*Z) * aa * MathFunctions::sinc(aa*m_q.y() * m_width/(M_TWOPI));
+}
+
+//! Complex formfactor.
+complex_t FormFactorLongRipple1Lorentz::evaluate_for_q(const cvector_t q) const
+{
+    m_q = q;
+
+    complex_t qxL2 = 2.5*std::pow(m_length * q.x(), 2);
+    complex_t factor = m_length/(1.0 + qxL2)*m_width/M_PI;
+
+    complex_t aaa = q.y()*m_width/(M_TWOPI);
+    complex_t aaa2 = aaa*aaa;
+
+    // analytical expressions for some particular cases
+    if (0.0==q.y() && 0.0==q.z())
+        return factor*M_PI_2*m_height;
+    else if (0.0==q.z() && 1.0 == aaa2)
+        return factor*M_PI_4*m_height;
+    else if (0.0==q.z())
+        return factor*M_PI_2*m_height*MathFunctions::sinc(q.y()*m_width*0.5)/(1.0-aaa2);
+
+    // numerical integration otherwise
+    complex_t integral = mP_integrator->integrate(0, m_height);
+    return factor*integral;
+}
diff --git a/Core/HardParticle/FormFactorLongRipple1Lorentz.h b/Core/HardParticle/FormFactorLongRipple1Lorentz.h
new file mode 100644
index 0000000..c4bdf0b
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple1Lorentz.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple1Lorentz.h
+//! @brief     Defines class FormFactorLongRipple1Lorentz.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORLONGRIPPLE1LORENTZ_H
+#define FORMFACTORLONGRIPPLE1LORENTZ_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+//! The formfactor for a cosine ripple.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorLongRipple1Lorentz : public IFormFactorBorn
+{
+public:
+    //! @brief FormFactorLongRipple1Lorentz constructor
+    //! @param length of Ripple1
+    //! @param width of cosine cross section
+    //! @param height of cosine cross section
+    FormFactorLongRipple1Lorentz(double length, double width, double height);
+
+    FormFactorLongRipple1Lorentz* clone() const override final {
+        return new FormFactorLongRipple1Lorentz(m_length, m_width, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadialExtension() const override final;
+
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+    double getLength() const { return m_length; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    complex_t Integrand(double Z) const;
+    bool check_initialization() const;
+
+    double m_length;
+    double m_width;
+    double m_height;
+    mutable cvector_t m_q;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorLongRipple1Lorentz>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORLONGRIPPLE1LORENTZ_H
diff --git a/Core/HardParticle/FormFactorLongRipple2Gauss.cpp b/Core/HardParticle/FormFactorLongRipple2Gauss.cpp
new file mode 100644
index 0000000..ba382a8
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple2Gauss.cpp
@@ -0,0 +1,103 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple2Gauss.cpp
+//! @brief     Implements class FormFactorLongRipple2Gauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorLongRipple2Gauss.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "RealParameter.h"
+
+FormFactorLongRipple2Gauss::FormFactorLongRipple2Gauss(
+    double length, double width, double height, double asymmetry)
+    : m_width(width)
+    , m_height(height)
+    , m_length(length)
+    , m_d(asymmetry)
+{
+    setName(BornAgain::FFLongRipple2GaussType);
+    check_initialization();
+    registerParameter(BornAgain::Width, &m_width      ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height    ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Length, &m_length    ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::AsymmetryLength, &m_d).setUnit("nm");
+}
+
+bool FormFactorLongRipple2Gauss::check_initialization() const
+{
+    bool result(true);
+    std::string message;
+    if(-1*m_width > 2.*m_d) {
+        result = false;
+        message = std::string("Check for '-1*width <= 2.*asymmetry' failed.");
+    }
+    if(m_width < 2.*m_d) {
+        result = false;
+        message = std::string("Check for 'width >= 2.*asymmetry' failed.");
+    }
+    if(m_height <=0) {
+        result = false;
+        message = std::string("Check for 'height > 0' failed.");
+    }
+
+    if(!result) {
+        std::ostringstream ostr;
+        ostr << "FormFactorLongRipple2Gauss() -> Error in class initialization with parameters ";
+        ostr << " width:" << m_width;
+        ostr << " height:" << m_height;
+        ostr << " length:" << m_length;
+        ostr << " asymmetry:" << m_d << "\n\n";
+        ostr << message;
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    return result;
+}
+
+double FormFactorLongRipple2Gauss::getRadialExtension() const
+{
+    return ( m_width + m_length ) / 4.0;
+}
+
+//! Complex formfactor.
+complex_t FormFactorLongRipple2Gauss::evaluate_for_q(const cvector_t q) const
+{
+    m_q = q;
+
+    complex_t qxL2 = std::pow(m_length * q.x(), 2) / 2.0;
+    complex_t factor = m_length * std::exp(-qxL2) * m_width;
+    complex_t result = 0;
+    complex_t iqzH = mul_I( q.z() * m_height );
+    complex_t iqyW = mul_I( q.y() * m_width );
+    complex_t aaa = 2.0 * (m_d * q.y() + m_height * q.z());
+
+    if (0.0 == q.y() && 0.0 == q.z())
+        result = m_height * 0.5;
+    else if (0.0 == q.y())
+        result = (1.0 - std::exp(iqzH) + iqzH) / (m_height * q.z() * q.z());
+    else if (1.0 == aaa / (q.y() * m_width))
+        result = m_height * std::exp(iqzH) * (1.0 - std::exp(-1.0 * iqyW) - iqyW)
+                 / (q.y() * q.y() * m_width * m_width);
+    else if (-1.0 == aaa / (q.y() * m_width))
+        result = m_height * std::exp(iqzH) * (1.0 - std::exp(-1.0 * iqyW) + iqyW)
+                 / (q.y() * q.y() * m_width * m_width);
+    else {
+        complex_t iHqzdqy = complex_t(0.0, 1.0) * (q.z() * m_height + q.y() * m_d);
+        complex_t Hqzdqy = q.z() * m_height + q.y() * m_d;
+        result = std::cos(q.y() * m_width * 0.5)
+                 + 2.0 * iHqzdqy * std::sin(q.y() * m_width * 0.5) / (m_width * q.y());
+        result = result * std::exp(-1.0 * iHqzdqy) - 1.0;
+        result = result * 4.0 * m_height * std::exp(iqzH)
+                 / (4.0 * Hqzdqy * Hqzdqy - q.y() * q.y() * m_width * m_width);
+    }
+    return factor * result;
+}
diff --git a/Core/HardParticle/FormFactorLongRipple2Gauss.h b/Core/HardParticle/FormFactorLongRipple2Gauss.h
new file mode 100644
index 0000000..13acd7b
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple2Gauss.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple2Gauss.h
+//! @brief     Defines class FormFactorLongRipple2Gauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORLONGRIPPLE2GAUSS_H
+#define FORMFACTORLONGRIPPLE2GAUSS_H
+
+#include "IFormFactorBorn.h"
+
+//! The formfactor for a triangular ripple.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorLongRipple2Gauss : public IFormFactorBorn
+{
+public:
+    //! @brief FormFactorLongRipple2Gauss constructor
+    //! @param length of Ripple2
+    //! @param width of triangular cross section
+    //! @param height of triangular cross section
+    //! @param asymmetry length of triangular cross section
+    FormFactorLongRipple2Gauss(double length, double width, double height, double asymmetry);
+
+
+    FormFactorLongRipple2Gauss* clone() const override final {
+        return new FormFactorLongRipple2Gauss(m_length, m_width, m_height, m_d); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+    double getLength() const { return m_length; }
+    double getAsymmetry() const { return m_d; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    bool check_initialization() const;
+
+    double m_width;
+    double m_height;
+    double m_length;
+    double m_d;
+    mutable cvector_t m_q;
+};
+
+#endif // FORMFACTORLONGRIPPLE2GAUSS_H
diff --git a/Core/HardParticle/FormFactorLongRipple2Lorentz.cpp b/Core/HardParticle/FormFactorLongRipple2Lorentz.cpp
new file mode 100644
index 0000000..1ffa17c
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple2Lorentz.cpp
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple2Lorentz.cpp
+//! @brief     Implements class FormFactorRipple2.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorLongRipple2Lorentz.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "RealParameter.h"
+
+//! @param length of Ripple2
+//! @param width of triangular cross section
+//! @param height of triangular cross section
+//! @param asymmetry length of triangular cross section
+FormFactorLongRipple2Lorentz::FormFactorLongRipple2Lorentz(
+    double length, double width, double height, double asymetry)
+    : m_length(length), m_width(width), m_height(height), m_d(asymetry)
+{
+    setName(BornAgain::FFLongRipple2LorentzType);
+    registerParameter(BornAgain::Width, &m_width      ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height    ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Length, &m_length    ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::AsymmetryLength, &m_d).setUnit("nm");
+}
+
+void FormFactorLongRipple2Lorentz::check_parameters() const
+{
+    bool ok = true;
+    std::string message;
+    if(-1*m_width > 2.*m_d) {
+        ok = false;
+        message = std::string("Check for '-1*width <= 2.*asymmetry' failed.");
+    }
+    if(m_width < 2.*m_d) {
+        ok = false;
+        message = std::string("Check for 'width >= 2.*asymmetry' failed.");
+    }
+    if(m_height <=0) {
+        ok = false;
+        message = std::string("Check for 'height > 0' failed.");
+    }
+
+    if(ok)
+        return;
+
+    std::ostringstream ostr;
+    ostr << "FormFactorLongRipple2Lorentz() -> Error in class initialization with parameters ";
+    ostr << " width:" << m_width;
+    ostr << " height:" << m_height;
+    ostr << " length:" << m_length;
+    ostr << " asymmetry:" << m_d << "\n\n";
+    ostr << message;
+    throw Exceptions::ClassInitializationException(ostr.str());
+}
+
+double FormFactorLongRipple2Lorentz::getRadialExtension() const
+{
+    return ( m_width + m_length ) / 4.0;
+}
+
+//! Complex formfactor.
+complex_t FormFactorLongRipple2Lorentz::evaluate_for_q(const cvector_t q) const
+{
+    check_parameters();
+
+    m_q = q;
+
+    complex_t qxL2 = 2.5*std::pow(m_length * q.x(), 2);
+    complex_t factor = m_length / (1.0 + qxL2) * m_width;
+
+    complex_t result = 0;
+    complex_t iqzH = mul_I( q.z() * m_height );
+    complex_t iqyW = mul_I( q.y() * m_width );
+    complex_t aaa = 2.0 * (m_d * q.y() + m_height * q.z());
+
+    if (0.0 == q.y() && 0.0 == q.z())
+        result = m_height * 0.5;
+    else if (0.0 == q.y())
+        result = (1.0 - std::exp(iqzH) + iqzH) / (m_height * q.z() * q.z());
+    else if (1.0 == aaa / (q.y() * m_width))
+        result = m_height * std::exp(iqzH) * (1.0 - std::exp(-1.0 * iqyW) - iqyW)
+                 / (q.y() * q.y() * m_width * m_width);
+    else if (-1.0 == aaa / (q.y() * m_width))
+        result = m_height * std::exp(iqzH) * (1.0 - std::exp(-1.0 * iqyW) + iqyW)
+                 / (q.y() * q.y() * m_width * m_width);
+    else {
+        complex_t iHqzdqy = complex_t(0.0, 1.0) * (q.z() * m_height + q.y() * m_d);
+        complex_t Hqzdqy = q.z() * m_height + q.y() * m_d;
+        result = std::cos(q.y() * m_width * 0.5)
+                 + 2.0 * iHqzdqy * std::sin(q.y() * m_width * 0.5) / (m_width * q.y());
+        result = result * std::exp(-1.0 * iHqzdqy) - 1.0;
+        result = result * 4.0 * m_height * std::exp(iqzH)
+                 / (4.0 * Hqzdqy * Hqzdqy - q.y() * q.y() * m_width * m_width);
+    }
+    return factor * result;
+}
diff --git a/Core/HardParticle/FormFactorLongRipple2Lorentz.h b/Core/HardParticle/FormFactorLongRipple2Lorentz.h
new file mode 100644
index 0000000..0581098
--- /dev/null
+++ b/Core/HardParticle/FormFactorLongRipple2Lorentz.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorLongRipple2Lorentz.h
+//! @brief     Defines class FormFactorLongRipple2Lorentz.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORLONGRIPPLE2LORENTZ_H
+#define FORMFACTORLONGRIPPLE2LORENTZ_H
+
+#include "IFormFactorBorn.h"
+
+//! The formfactor for a triangular ripple.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorLongRipple2Lorentz : public IFormFactorBorn
+{
+public:
+    FormFactorLongRipple2Lorentz(double length, double width, double height, double asymmetry);
+
+    FormFactorLongRipple2Lorentz *clone() const override final {
+        return new FormFactorLongRipple2Lorentz(m_length, m_width, m_height, m_d); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+    double getLength() const { return m_length; }
+    double getAsymmetry() const { return m_d; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    void check_parameters() const;
+
+    double m_length;
+    double m_width;
+    double m_height;
+    double m_d;
+    mutable cvector_t m_q;
+};
+
+#endif // FORMFACTORLONGRIPPLE2LORENTZ_H
diff --git a/Core/HardParticle/FormFactorPolyhedron.cpp b/Core/HardParticle/FormFactorPolyhedron.cpp
new file mode 100644
index 0000000..67a7d43
--- /dev/null
+++ b/Core/HardParticle/FormFactorPolyhedron.cpp
@@ -0,0 +1,646 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPolyhedron.cpp
+//! @brief     Implements class FormFactorPolyhedron, FormFactorPrism, and auxiliary classes.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+//! The mathematics implemented here is described in full detail in a paper
+//! by Joachim Wuttke, entitled
+//! "Form factor (Fourier shape transform) of polygon and polyhedron."
+
+#include "FormFactorPolyhedron.h"
+#include "MathFunctions.h"
+#include "Precomputed.h"
+#include "RealParameter.h"
+#include <iomanip>
+#include <stdexcept> // need overlooked by g++ 5.4
+
+static const complex_t I(0.,1.);
+static const double eps(2e-16);
+
+double PolyhedralFace::qpa_limit_series = 3e-2;
+int PolyhedralFace::n_limit_series = 20;
+
+double FormFactorPolyhedron::q_limit_series = 1e-2;
+int FormFactorPolyhedron::n_limit_series = 20;
+
+//**************************************************************************************************
+//  PolyhedralEdge implementation
+//**************************************************************************************************
+
+PolyhedralEdge::PolyhedralEdge( const kvector_t _Vlow, const kvector_t _Vhig )
+    : m_E((_Vhig-_Vlow)/2)
+    , m_R((_Vhig+_Vlow)/2)
+{
+    if( m_E.mag2()==0 )
+        throw std::invalid_argument("At least one edge has zero length");
+};
+
+//! Returns sum_l=0^M/2 u^2l v^(M-2l) / (2l+1)!(M-2l)! - vperp^M/M!
+
+complex_t PolyhedralEdge::contrib(int M, const cvector_t qpa, complex_t qrperp) const
+{
+    complex_t u = qE(qpa);
+    complex_t v2 = m_R.dot(qpa);
+    complex_t v1 = qrperp;
+    complex_t v = v2 + v1;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    if( diagnosis.debmsg>=5 )
+        std::cout<<std::scientific<<std::showpos<<std::setprecision(16)<<"contrib: u="<<u<<
+            " v1="<<v1<<" v2="<<v2<<"\n";
+#endif
+    static auto& precomputed = Precomputed::instance();
+    if( v==0. ) { // only 2l=M contributes
+        if( M&1 ) // M is odd
+            return 0.;
+        else
+            return precomputed.reciprocal_factorial[M] * ( pow(u, M)/(M+1.) - pow(v1, M) );
+    }
+    complex_t ret = 0;
+    // the l=0 term, minus (qperp.R)^M, which cancels under the sum over E*contrib()
+    if        ( v1==0. ) {
+        ret = precomputed.reciprocal_factorial[M] * pow(v2, M);
+    } else if ( v2==0. ) {
+        ; // leave ret=0
+    } else {
+        // binomial expansion
+        for( int mm=1; mm<=M; ++mm ) {
+            complex_t term =
+                precomputed.reciprocal_factorial[mm] *
+                precomputed.reciprocal_factorial[M-mm] *
+                pow(v2, mm) * pow(v1, M-mm);
+            ret += term;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            if( diagnosis.debmsg>=6 )
+                std::cout<<"contrib mm="<<mm<<" t="<<term<<" s="<<ret<<"\n";
+#endif
+        }
+    }
+    if( u==0. )
+        return ret;
+    for( int l=1; l<=M/2; ++l ) {
+        complex_t term =
+            precomputed.reciprocal_factorial[M-2*l] *
+            precomputed.reciprocal_factorial[2*l+1] *
+            pow(u, 2*l) * pow(v, M-2*l);
+        ret += term;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=6 )
+            std::cout<<"contrib l="<<l<<" t="<<term<<" s="<<ret<<"\n";
+#endif
+    }
+    return ret;
+}
+
+//**************************************************************************************************
+//  PolyhedralFace implementation
+//**************************************************************************************************
+
+//! Static method, returns diameter of circle that contains all vertices.
+
+double PolyhedralFace::diameter( const std::vector<kvector_t>& V )
+{
+    double diameterFace = 0;
+    for ( size_t j=0; j<V.size(); ++j )
+        for ( size_t jj=j+1; jj<V.size(); ++jj )
+            diameterFace = std::max( diameterFace, (V[j]-V[jj]).mag() );
+    return diameterFace;
+}
+
+#ifdef POLYHEDRAL_DIAGNOSTIC
+void PolyhedralFace::setLimits( double _qpa, int _n ) { qpa_limit_series=_qpa; n_limit_series=_n; }
+#endif
+
+//! Sets internal variables for given vertex chain.
+
+//! @param V oriented vertex list
+//! @param _sym_S2 true if face has a perpedicular two-fold symmetry axis
+
+PolyhedralFace::PolyhedralFace( const std::vector<kvector_t>& V, bool _sym_S2 )
+    : sym_S2( _sym_S2 )
+{
+    size_t NV = V.size();
+    if( !NV )
+        throw std::logic_error("Face with no edges");
+    if( NV<3 )
+        throw std::logic_error("Face with less than three edges");
+
+    // compute radius in 2d and 3d
+    m_radius_2d = diameter( V )/2;
+    m_radius_3d = 0;
+    for( const kvector_t v: V )
+        m_radius_3d = std::max( m_radius_3d, v.mag() );
+
+    // Initialize list of 'edges'.
+    // Do not create an edge if two vertices are too close to each other.
+    // TODO This is implemented in a somewhat sloppy way: we just skip an edge if it would
+    //      be too short. This leaves tiny open edges. In a clean implementation, we
+    //      rather should merge adjacent vertices before generating edges.
+    for ( size_t j=0; j<NV; ++j ) {
+        size_t jj = (j+1)%NV;
+        if( (V[j]-V[jj]).mag() < 1e-14*m_radius_2d )
+            continue; // distance too short -> skip this edge
+        edges.push_back( PolyhedralEdge(V[j], V[jj]) );
+    }
+    size_t NE = edges.size();
+    if( NE<3 )
+        throw std::invalid_argument("Face has less than three non-vanishing edges");
+
+    // compute n_k, rperp
+    m_normal = kvector_t();
+    for( size_t j=0; j<NE; ++j ){
+        size_t jj = (j+1)%NE;
+        kvector_t ee = edges[j].E().cross( edges[jj].E() );
+        if( ee.mag2()==0 ) {
+            throw std::logic_error("Two adjacent edges are parallel");
+        }
+        m_normal += ee.unit();
+    }
+    m_normal /= NE;
+    m_rperp = 0;
+    for( size_t j=0; j<NV; ++j )
+        m_rperp += V[j].dot(m_normal);
+    m_rperp /= NV;
+    // assert that the vertices lay in a plane
+    for ( size_t j=1; j<NV; ++j )
+        if( std::abs(V[j].dot(m_normal) - m_rperp) > 1e-14*m_radius_3d )
+            throw std::logic_error("Face is not planar");
+    // compute m_area
+    m_area = 0;
+    for ( size_t j=0; j<NV; ++j ) {
+        size_t jj = (j+1)%NV;
+        m_area += m_normal.dot( V[j].cross( V[jj] ) ) / 2;
+    }
+    // only now deal with inversion symmetry
+    if( sym_S2 ) {
+        if( NE&1 )
+            throw std::logic_error("Odd #edges violates symmetry S2");
+        NE /= 2;
+        for( size_t j=0; j<NE; ++j ){
+            if( ((edges[j].R()-m_rperp*m_normal)+
+                 (edges[j+NE].R()-m_rperp*m_normal)).mag() > 1e-12*m_radius_2d )
+                throw std::logic_error("Edge centers violate symmetry S2");
+            if( (edges[j].E()+edges[j+NE].E()).mag() > 1e-12*m_radius_2d )
+                throw std::logic_error("Edge vectors violate symmetry S2");
+        }
+        // keep only half of the egdes
+        edges.erase( edges.begin()+NE, edges.end() );
+    }
+}
+
+//! Sets qperp and qpa according to argument q and to this polygon's normal.
+
+void PolyhedralFace::decompose_q( const cvector_t q, complex_t& qperp, cvector_t& qpa ) const
+{
+    qperp = m_normal.dot(q);
+    qpa = q - qperp*m_normal;
+    // improve numeric accuracy:
+    qpa -= m_normal.dot(qpa)*m_normal;
+    if( qpa.mag()<eps*std::abs(qperp) )
+        qpa = cvector_t(0.,0.,0.);
+}
+
+//! Returns core contribution to f_n
+
+complex_t PolyhedralFace::ff_n_core( int m, const cvector_t qpa, complex_t qperp ) const
+{
+    cvector_t prevec = 2.*m_normal.cross( qpa ); // complex conjugation will take place in .dot
+    complex_t ret = 0;
+    complex_t vfacsum = 0;
+    complex_t qrperp = qperp * m_rperp;
+    for( size_t i=0; i<edges.size(); ++i ) {
+        const PolyhedralEdge& e = edges[i];
+        complex_t vfac;
+        if( sym_S2 || i<edges.size()-1 ) {
+            vfac = prevec.dot(e.E());
+            vfacsum += vfac;
+        } else {
+            vfac = - vfacsum; // to improve numeric accuracy: qcE_J = - sum_{j=0}^{J-1} qcE_j
+        }
+        complex_t tmp = e.contrib(m+1, qpa, qrperp);
+        ret += vfac * tmp;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=4 )
+            std::cout<<std::scientific<<std::showpos<<std::setprecision(16)<<"DBX ff_n_core "<<m<<
+                " "<<vfac<<" "<<tmp<<" term="<<vfac*tmp<<" sum="<<ret<<"\n";
+#endif
+    }
+    return ret;
+}
+
+//! Returns contribution qn*f_n [of order q^(n+1)] from this face to the polyhedral form factor.
+
+complex_t PolyhedralFace::ff_n( int n, const cvector_t q ) const
+{
+    complex_t qn = q.dot(m_normal); // conj(q)*normal (dot is antilinear in 'this' argument)
+    if ( std::abs(qn)<eps*q.mag() )
+        return 0.;
+    complex_t qperp;
+    cvector_t qpa;
+    decompose_q( q, qperp, qpa );
+    double qpa_mag2 = qpa.mag2();
+    static auto& precomputed = Precomputed::instance();
+    if ( qpa_mag2==0. ) {
+        return qn * pow(qperp*m_rperp, n) * m_area / precomputed.factorial[n];
+    } else if ( sym_S2 ) {
+        return qn * ( ff_n_core( n, qpa, qperp ) + ff_n_core( n, -qpa, qperp ) ) / qpa_mag2;
+    } else {
+        complex_t tmp = ff_n_core( n, qpa, qperp );
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=3 )
+            std::cout<<"DBX ff_n "<<n<<" "<<qn<<" "<<tmp<<" "<<qpa_mag2<<"\n";
+#endif
+        return qn * tmp / qpa_mag2;
+    }
+}
+
+//! Returns sum of n>=1 terms of qpa expansion of 2d form factor
+
+complex_t PolyhedralFace::expansion(
+    complex_t fac_even, complex_t fac_odd, cvector_t qpa, double abslevel ) const
+{
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    diagnosis.nExpandedFaces += 1;
+#endif
+    complex_t sum = 0;
+    complex_t n_fac = I;
+    int count_return_condition = 0;
+    for( int n=1; n<n_limit_series; ++n ) {
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        diagnosis.maxOrder = std::max( diagnosis.maxOrder, n );
+#endif
+        complex_t term = n_fac * ( n&1 ? fac_odd : fac_even ) * ff_n_core(n, qpa, 0) / qpa.mag2();
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<std::setprecision(16)<<"    sum="<<sum<<" +term="<<term<<"\n";
+#endif
+        sum += term;
+        if( std::abs(term)<=eps*std::abs(sum) || std::abs(sum)<eps*abslevel )
+            ++count_return_condition;
+        else
+            count_return_condition = 0;
+        if( count_return_condition>2 )
+            return sum; // regular exit
+        n_fac = mul_I(n_fac);
+    }
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    if( !diagnosis.request_convergence )
+        return sum;
+#endif
+    throw std::runtime_error("Series f(q_pa) not converged");
+}
+
+//! Returns core contribution to analytic 2d form factor.
+
+complex_t PolyhedralFace::edge_sum_ff( cvector_t q, cvector_t qpa, bool sym_Ci ) const
+{
+    cvector_t prevec = m_normal.cross( qpa ); // complex conjugation will take place in .dot
+    complex_t sum = 0;
+    complex_t vfacsum = 0;
+    for( size_t i=0; i<edges.size(); ++i ) {
+        const PolyhedralEdge& e = edges[i];
+        complex_t qE = e.qE(qpa);
+        complex_t qR = e.qR(qpa);
+        complex_t Rfac = sym_S2 ? sin(qR) : ( sym_Ci ? cos(e.qR(q)) : exp_I(qR) );
+        complex_t vfac;
+        if( sym_S2 || i<edges.size()-1 ) {
+            vfac = prevec.dot(e.E());
+            vfacsum += vfac;
+        } else {
+            vfac = - vfacsum; // to improve numeric accuracy: qcE_J = - sum_{j=0}^{J-1} qcE_j
+        }
+        complex_t term = vfac * MathFunctions::sinc(qE) * Rfac;
+        sum += term;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<std::scientific<<std::showpos<<std::setprecision(16)<<"    sum="<<sum<<
+                " term="<<term<<" vf="<<vfac<<" qE="<<qE<<" qR="<<qR<<
+                " sinc="<<MathFunctions::sinc(qE)<<" Rfac="<<Rfac<<"\n";
+#endif
+    }
+    return sum;
+}
+
+//! Returns the contribution ff(q) of this face to the polyhedral form factor.
+
+complex_t PolyhedralFace::ff( const cvector_t q, const bool sym_Ci ) const
+{
+    complex_t qperp;
+    cvector_t qpa;
+    decompose_q( q, qperp, qpa );
+    double qpa_red = m_radius_2d * qpa.mag();
+    complex_t qr_perp = qperp*m_rperp;
+    complex_t ff0 = (sym_Ci ? 2.*I*sin(qr_perp) : exp_I(qr_perp)) * m_area;
+    if ( qpa_red==0 ) {
+        return ff0;
+    } else if ( qpa_red < qpa_limit_series && !sym_S2 ) {
+        // summation of power series
+        complex_t fac_even;
+        complex_t fac_odd;
+        if( sym_Ci ) {
+            fac_even = 2. * mul_I( sin(qr_perp) );
+            fac_odd = 2. * cos(qr_perp);
+        } else {
+            fac_even = exp_I(qr_perp);
+            fac_odd = fac_even;
+        }
+        return ff0 + expansion( fac_even, fac_odd, qpa, std::abs(ff0) );
+    } else {
+        // direct evaluation of analytic formula
+        complex_t prefac;
+        if( sym_S2 )
+            prefac = sym_Ci ? -8.*sin(qr_perp) : 4.*mul_I( exp_I(qr_perp) );
+        else
+            prefac = sym_Ci ? 4. : 2.*exp_I(qr_perp);
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<"       qrperp="<<qr_perp<<" => prefac="<<prefac<<"\n";
+#endif
+        return prefac * edge_sum_ff( q, qpa, sym_Ci ) / mul_I( qpa.mag2() );
+    }
+}
+
+//! Returns the two-dimensional form factor of this face, for use in a prism.
+
+complex_t PolyhedralFace::ff_2D( const cvector_t qpa ) const
+{
+    if ( std::abs(qpa.dot(m_normal))>eps*qpa.mag() )
+        throw std::logic_error("ff_2D called with perpendicular q component");
+    double qpa_red = m_radius_2d * qpa.mag();
+    if ( qpa_red==0 ) {
+        return m_area;
+    } else if ( qpa_red < qpa_limit_series && !sym_S2 ) {
+        // summation of power series
+        return m_area + expansion( 1., 1., qpa, std::abs(m_area) );
+    } else {
+        // direct evaluation of analytic formula
+        complex_t ff = edge_sum_ff( qpa, qpa, false );
+        complex_t ret = (sym_S2 ? 4. : 2./I ) * ff / qpa.mag2();
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( diagnosis.debmsg>=2 )
+            std::cout<<std::setprecision(16)<<"    ret="<<ret<<" ff="<<ff<<"\n";
+#endif
+        return ret;
+    }
+}
+
+//! Throws if deviation from inversion symmetry is detected. Does not check vertices.
+
+void PolyhedralFace::assert_Ci( const PolyhedralFace& other ) const
+{
+    if( std::abs(m_rperp-other.m_rperp)>1e-15*(m_rperp+other.m_rperp) )
+        throw std::logic_error("Faces with different distance from origin violate symmetry Ci");
+    if( std::abs(m_area-other.m_area)>1e-15*(m_area+other.m_area) )
+        throw std::logic_error("Faces with different areas violate symmetry Ci");
+    if( (m_normal+other.m_normal).mag()>1e-14 )
+        throw std::logic_error("Faces do not have opposite orientation, violating symmetry Ci");
+}
+
+//**************************************************************************************************
+//  FormFactorPolyhedron implementation
+//**************************************************************************************************
+
+#ifdef POLYHEDRAL_DIAGNOSTIC
+void FormFactorPolyhedron::setLimits( double _q, int _n ) { q_limit_series=_q; n_limit_series=_n; }
+#endif
+
+//! Called by child classes to set faces and other internal variables.
+
+void FormFactorPolyhedron::setPolyhedron(
+    const PolyhedralTopology& topology, double z_origin, const std::vector<kvector_t>& vertices )
+{
+    try {
+        m_z_origin = z_origin;
+        m_sym_Ci = topology.symmetry_Ci;
+
+        double diameter = 0;
+        for ( size_t j=0; j<vertices.size(); ++j )
+            for ( size_t jj=j+1; jj<vertices.size(); ++jj )
+                diameter = std::max( diameter, (vertices[j]-vertices[jj]).mag() );
+
+        m_faces.clear();
+        for( const PolygonalTopology& tf: topology.faces ) {
+            std::vector<kvector_t> corners; // of one face
+            for( int i: tf.vertexIndices )
+                corners.push_back( vertices[i] );
+            if( PolyhedralFace::diameter( corners )<= 1e-14*diameter )
+                continue; // skip ridiculously small face
+            m_faces.push_back( PolyhedralFace( corners, tf.symmetry_S2 ) );
+        }
+        if( m_faces.size() < 4 )
+            throw std::logic_error("Less than four non-vanishing faces" );
+
+        m_radius = 0;
+        m_volume = 0;
+        for( const PolyhedralFace& Gk: m_faces ) {
+            m_radius = std::max( m_radius, Gk.radius3d() );
+            m_volume += Gk.pyramidalVolume();
+        }
+        if( m_sym_Ci ) {
+            if( m_faces.size()&1 )
+                throw std::logic_error("Odd #faces violates symmetry Ci");
+            size_t N = m_faces.size()/2;
+            // for this tests, m_faces must be in a specific order
+            for( size_t k=0; k<N; ++k )
+                m_faces[k].assert_Ci( m_faces[2*N-1-k] );
+            // keep only half of the faces
+            m_faces.erase( m_faces.begin()+N, m_faces.end() );
+        }
+    } catch (std::invalid_argument& e) {
+        throw std::invalid_argument( "Invalid parameterization of "+getName()+": "+e.what());
+    } catch (std::logic_error& e) {
+        throw std::logic_error( "Bug in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error( "Unexpected exception in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    }
+}
+
+//! Returns the form factor F(q) of this polyhedron, respecting the offset z_origin.
+
+complex_t FormFactorPolyhedron::evaluate_for_q( const cvector_t q ) const
+{
+    try {
+        return exp_I(-m_z_origin*q.z()) * evaluate_centered(q);
+    } catch (std::logic_error& e) {
+        throw std::logic_error( "Bug in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::runtime_error& e) {
+        throw std::runtime_error( "Numeric computation failed in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error( "Unexpected exception in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    }
+}
+
+//! Returns the form factor F(q) of this polyhedron, with origin at z=0.
+
+complex_t FormFactorPolyhedron::evaluate_centered( const cvector_t q ) const
+{
+    double q_red = m_radius * q.mag();
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    diagnosis.maxOrder = 0;
+    diagnosis.nExpandedFaces = 0;
+#endif
+    if( q_red==0 ) {
+        return m_volume;
+    } else if ( q_red < q_limit_series ) {
+        // summation of power series
+        complex_t sum = 0;
+        complex_t n_fac = ( m_sym_Ci ? -2 : -1 ) / q.mag2();
+        int count_return_condition = 0;
+        for( int n=2; n<n_limit_series; ++n ) {
+            if( m_sym_Ci && n&1 )
+                continue;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            diagnosis.maxOrder = std::max( diagnosis.maxOrder, n );
+#endif
+            complex_t term = 0;
+            for( const PolyhedralFace& Gk: m_faces ) {
+                complex_t tmp = Gk.ff_n( n+1, q );
+                term += tmp;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+                if( diagnosis.debmsg>=2 )
+                    std::cout<<"Gkffn sum="<<term<<" incr="<<tmp<<"\n";
+#endif
+            }
+            term *= n_fac;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            if( diagnosis.debmsg>=1 )
+                std::cout<<std::scientific<<std::showpos<<std::setprecision(16)<<
+                    "  SUM="<<m_volume+sum<<" +TERM="<<term<<"\n";
+#endif
+            sum += term;
+            if( std::abs(term)<=eps*std::abs(sum) || std::abs(sum)<eps*m_volume )
+                ++count_return_condition;
+            else
+                count_return_condition = 0;
+            if( count_return_condition>2 )
+                return m_volume + sum; // regular exit
+            n_fac = m_sym_Ci ? -n_fac : mul_I(n_fac);
+        }
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        if( !diagnosis.request_convergence ) {
+            std::cout<<"series F(q) not converged\n";
+            return m_volume+sum;
+        }
+#endif
+        throw std::runtime_error("Series F(q) not converged");
+    } else {
+        // direct evaluation of analytic formula (coefficients may involve series)
+        complex_t sum = 0;
+        for( const PolyhedralFace& Gk: m_faces ) {
+            complex_t qn = Gk.normalProjectionConj( q ); // conj(q)*normal
+            if ( std::abs(qn)<eps*q.mag() )
+                continue;
+            complex_t ff = Gk.ff(q, m_sym_Ci );
+            sum += qn * ff;
+#ifdef POLYHEDRAL_DIAGNOSTIC
+            if( diagnosis.debmsg>=1 )
+                std::cout<<std::scientific<<std::showpos<<std::setprecision(16)<<"  SUM="<<sum<<
+                    " TERM="<<qn*ff<<" qn="<<qn.real()<<" ff="<<ff<<"\n";
+#endif
+        }
+        return sum / (I * q.mag2());
+    }
+}
+
+//! Assertions for Platonic solid.
+
+void FormFactorPolyhedron::assert_platonic() const
+{
+    // just one test; one could do much more ...
+    double pyramidal_volume = 0;
+    for( const auto& Gk: m_faces )
+        pyramidal_volume += Gk.pyramidalVolume();
+    pyramidal_volume /= m_faces.size();
+    for( const auto& Gk: m_faces )
+        if (std::abs(Gk.pyramidalVolume()-pyramidal_volume) > 160*eps*pyramidal_volume) {
+            std::cerr<<std::setprecision(16)<<"Bug: pyr_volume(this face)="<<
+                Gk.pyramidalVolume()<<" vs pyr_volume(avge)="<<pyramidal_volume<<"\n";
+            throw std::runtime_error("Deviant pyramidal volume in "+getName());
+        }
+}
+
+
+//**************************************************************************************************
+//  FormFactorPolygonalPrism implementation
+//**************************************************************************************************
+
+void FormFactorPolygonalPrism::setPrism( bool symmetry_Ci, const std::vector<kvector_t>& vertices )
+{
+    try {
+        m_base = std::unique_ptr<PolyhedralFace>( new PolyhedralFace( vertices, symmetry_Ci ) );
+    } catch (std::invalid_argument& e) {
+        throw std::invalid_argument( "Invalid parameterization of "+getName()+": "+e.what());
+    } catch (std::logic_error& e) {
+        throw std::logic_error( "Bug in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error( "Unexpected exception in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    }
+}
+
+//! Returns the volume of this prism.
+double FormFactorPolygonalPrism::getVolume() const { return m_height * m_base->area(); }
+
+//! Returns the form factor F(q) of this polyhedron, respecting the offset height/2.
+
+complex_t FormFactorPolygonalPrism::evaluate_for_q( const cvector_t q ) const
+{
+    try {
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        diagnosis.maxOrder = 0;
+        diagnosis.nExpandedFaces = 0;
+#endif
+        const cvector_t qxy( q.x(), q.y(), 0. );
+        return m_height * exp_I(m_height/2*q.z()) * MathFunctions::sinc(m_height/2*q.z()) *
+            m_base->ff_2D( qxy );
+    } catch (std::logic_error& e) {
+        throw std::logic_error( "Bug in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::runtime_error& e) {
+        throw std::runtime_error( "Numeric computation failed in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error( "Unexpected exception in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    }
+}
+
+
+//**************************************************************************************************
+//  FormFactorPolygonalSurface implementation
+//**************************************************************************************************
+
+complex_t FormFactorPolygonalSurface::evaluate_for_q( const cvector_t q ) const
+{
+    try {
+#ifdef POLYHEDRAL_DIAGNOSTIC
+        diagnosis.maxOrder = 0;
+        diagnosis.nExpandedFaces = 0;
+#endif
+        return m_base->ff( q, false );
+    } catch (std::logic_error& e) {
+        throw std::logic_error( "Bug in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::runtime_error& e) {
+        throw std::runtime_error( "Numeric computation failed in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    } catch (std::exception& e) {
+        throw std::runtime_error( "Unexpected exception in "+getName()+": "+e.what()+
+            " [please report to the maintainers]");
+    }
+}
diff --git a/Core/HardParticle/FormFactorPolyhedron.h b/Core/HardParticle/FormFactorPolyhedron.h
new file mode 100644
index 0000000..a24b138
--- /dev/null
+++ b/Core/HardParticle/FormFactorPolyhedron.h
@@ -0,0 +1,164 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPolyhedron.h
+//! @brief     Defines class FormFactorPolyhedron, FormFactorPrism, and auxiliary classes.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORPOLYHEDRON_H
+#define FORMFACTORPOLYHEDRON_H
+
+#include "IFormFactorBorn.h"
+#include <memory>
+
+//! For internal use in PolyhedralFace.
+class PolygonalTopology {
+public:
+    std::vector<int> vertexIndices;
+    bool symmetry_S2;
+};
+
+//! For internal use in FormFactorPolyhedron.
+class PolyhedralTopology {
+public:
+    std::vector<PolygonalTopology> faces;
+    bool symmetry_Ci;
+};
+
+//! One edge of a polygon, for form factor computation.
+
+class PolyhedralEdge {
+public:
+    PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig);
+
+    kvector_t E() const { return m_E; }
+    kvector_t R() const { return m_R; }
+    complex_t qE( cvector_t q ) const { return m_E.dot(q); }
+    complex_t qR( cvector_t q ) const { return m_R.dot(q); }
+
+    complex_t contrib(int m, const cvector_t qpa, complex_t qrperp) const;
+
+private:
+    kvector_t m_E; //!< vector pointing from mid of edge to upper vertex
+    kvector_t m_R; //!< position vector of edge midpoint
+};
+
+
+//! A polygon, for form factor computation.
+
+class PolyhedralFace {
+public:
+    static double diameter(const std::vector<kvector_t>& V);
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    static void setLimits(double _qpa, int _n);
+#endif
+
+    PolyhedralFace( const std::vector<kvector_t>& _V=std::vector<kvector_t>(), bool _sym_S2=false );
+
+    double area() const { return m_area; }
+    kvector_t center() const { return m_center; }
+    double pyramidalVolume() const { return m_rperp*m_area/3; }
+    double radius3d() const { return m_radius_3d; }
+    //! Returns conj(q)*normal [BasicVector3D::dot is antilinear in 'this' argument]
+    complex_t normalProjectionConj( cvector_t q) const { return q.dot(m_normal); }
+    complex_t ff_n(int m, const cvector_t q) const;
+    complex_t ff(const cvector_t q, const bool sym_Ci) const;
+    complex_t ff_2D(const cvector_t qpa) const;
+    void assert_Ci(const PolyhedralFace& other) const;
+
+private:
+    static double qpa_limit_series; //!< determines when use power series
+    static int n_limit_series;
+
+    bool sym_S2; //!< if true, then edges obtainable by inversion are not provided
+    std::vector<PolyhedralEdge> edges;
+    double m_area;
+    kvector_t m_normal; //!< normal vector of this polygon's plane
+    double m_rperp; //!< distance of this polygon's plane from the origin, along 'm_normal'
+    double m_radius_2d; //!< radius of enclosing cylinder
+    double m_radius_3d; //!< radius of enclosing sphere
+    kvector_t m_center; //!< center of mass
+
+    void decompose_q(const cvector_t q, complex_t& qperp, cvector_t& qpa) const;
+    complex_t ff_n_core(int m, const cvector_t qpa, complex_t qperp) const;
+    complex_t edge_sum_ff(cvector_t q, cvector_t qpa, bool sym_Ci) const;
+    complex_t expansion(
+        complex_t fac_even, complex_t fac_odd, cvector_t qpa, double abslevel ) const;
+};
+
+
+//! A polyhedron, for form factor computation.
+
+class FormFactorPolyhedron : public IFormFactorBorn {
+public:
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    static void setLimits( double _q, int _n );
+#endif
+
+    FormFactorPolyhedron() {}
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+    complex_t evaluate_centered(const cvector_t q) const;
+
+    double getVolume() const override final { return m_volume; }
+    double getRadialExtension() const override final { return m_radius; }
+    void assert_platonic() const;
+
+protected:
+    double m_z_origin;
+    bool m_sym_Ci; //!< if true, then faces obtainable by inversion are not provided
+
+    void setPolyhedron(const PolyhedralTopology& topology, double z_origin,
+                       const std::vector<kvector_t>& vertices);
+
+private:
+    static double q_limit_series; //!< determines when to use power series
+    static int n_limit_series;
+
+    std::vector<PolyhedralFace> m_faces;
+    double m_radius;
+    double m_volume;
+};
+
+
+//! A prism with a polygonal base, for form factor computation.
+
+class BA_CORE_API_ FormFactorPolygonalPrism : public IFormFactorBorn {
+public:
+    FormFactorPolygonalPrism(const double height) : m_height(height) {}
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+    double getVolume() const override final;
+    double getHeight() const { return m_height; }
+    double getRadialExtension() const override final { return std::sqrt(m_base->area()); }
+
+protected:
+    std::unique_ptr<PolyhedralFace> m_base;
+    double m_height;
+    void setPrism( bool symmetry_Ci, const std::vector<kvector_t>& vertices );
+};
+
+
+//! A polygonal surface, for testing form factor computations.
+
+class FormFactorPolygonalSurface : public IFormFactorBorn {
+public:
+    FormFactorPolygonalSurface() {}
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+    double getVolume() const override { return 0; }
+    double getRadialExtension() const override final { return std::sqrt(m_base->area()); }
+
+protected:
+    std::unique_ptr<PolyhedralFace> m_base;
+};
+
+#endif // FORMFACTORPOLYHEDRON_H
diff --git a/Core/HardParticle/FormFactorPrism3.cpp b/Core/HardParticle/FormFactorPrism3.cpp
new file mode 100644
index 0000000..7229ccd
--- /dev/null
+++ b/Core/HardParticle/FormFactorPrism3.cpp
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPrism3.cpp
+//! @brief     Implements class FormFactorPrism3.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorPrism3.h"
+#include "BornAgainNamespace.h"
+#include "RealParameter.h"
+#include <iostream>
+
+FormFactorPrism3::FormFactorPrism3(const double base_edge, const double height)
+    : FormFactorPolygonalPrism( height ), m_base_edge( base_edge )
+{
+    setName(BornAgain::FFPrism3Type);
+    registerParameter(BornAgain::BaseEdge, &m_base_edge).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    onChange();
+}
+
+void FormFactorPrism3::onChange()
+{
+    double a = m_base_edge;
+    double as = a/2;
+    double ac = a/sqrt(3)/2;
+    double ah = a/sqrt(3);
+    std::vector<kvector_t> V {
+        { -ac,  as, 0. },
+        { -ac, -as, 0. },
+        {  ah,  0., 0. } };
+    setPrism( false, V );
+}
diff --git a/Core/HardParticle/FormFactorPrism3.h b/Core/HardParticle/FormFactorPrism3.h
new file mode 100644
index 0000000..b119ce6
--- /dev/null
+++ b/Core/HardParticle/FormFactorPrism3.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPrism3.h
+//! @brief     Defines class FormFactorPrism3.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORPRISM3_H
+#define FORMFACTORPRISM3_H
+#include "FormFactorPolyhedron.h"
+
+//! A prism based on an equilateral triangle.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorPrism3 : public FormFactorPolygonalPrism
+{
+public:
+    FormFactorPrism3(const double base_edge, const double height);
+
+    FormFactorPrism3 *clone() const override final {
+        return new FormFactorPrism3(m_base_edge, m_height); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getBaseEdge() const { return m_base_edge; }
+
+protected:
+    void onChange() override final;
+
+private:
+    double m_base_edge;
+};
+
+#endif // FORMFACTORPRISM3_H
diff --git a/Core/HardParticle/FormFactorPrism6.cpp b/Core/HardParticle/FormFactorPrism6.cpp
new file mode 100644
index 0000000..d8e41ae
--- /dev/null
+++ b/Core/HardParticle/FormFactorPrism6.cpp
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPrism6.cpp
+//! @brief     Implements class FormFactorPrism6.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorPrism6.h"
+#include "BornAgainNamespace.h"
+#include "RealParameter.h"
+
+FormFactorPrism6::FormFactorPrism6(const double base_edge, const double height)
+    : FormFactorPolygonalPrism( height )
+    , m_base_edge(base_edge)
+{
+    setName(BornAgain::FFPrism6Type);
+    registerParameter(BornAgain::BaseEdge, &m_base_edge).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    onChange();
+}
+
+void FormFactorPrism6::onChange()
+{
+    double a = m_base_edge;
+    double as = a*sqrt(3)/2;
+    double ac = a/2;
+    std::vector<kvector_t> V {
+        {  a,   0., 0. },
+        {  ac,  as, 0. },
+        { -ac,  as, 0. },
+        { -a,   0., 0. },
+        { -ac, -as, 0. },
+        {  ac, -as, 0. } };
+    setPrism( true, V );
+}
diff --git a/Core/HardParticle/FormFactorPrism6.h b/Core/HardParticle/FormFactorPrism6.h
new file mode 100644
index 0000000..b46071a
--- /dev/null
+++ b/Core/HardParticle/FormFactorPrism6.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPrism6.h
+//! @brief     Defines class FormFactorPrism6.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORPRISM6_H
+#define FORMFACTORPRISM6_H
+#include "FormFactorPolyhedron.h"
+
+//! A prism based on a regular hexagonal.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorPrism6 : public FormFactorPolygonalPrism
+{
+public:
+    FormFactorPrism6(const double base_edge, const double height);
+
+    FormFactorPrism6 *clone() const override final {
+        return new FormFactorPrism6(m_base_edge, m_height); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getBaseEdge() const { return m_base_edge; }
+
+protected:
+    void onChange() override final;
+
+private:
+    double m_base_edge;
+};
+
+#endif // FORMFACTORPRISM6_H
diff --git a/Core/HardParticle/FormFactorPyramid.cpp b/Core/HardParticle/FormFactorPyramid.cpp
new file mode 100644
index 0000000..cd32601
--- /dev/null
+++ b/Core/HardParticle/FormFactorPyramid.cpp
@@ -0,0 +1,82 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPyramid.cpp
+//! @brief     Implements class FormFactorPyramid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorPyramid.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorPyramid::topology = {
+    {
+        { { 3, 2, 1, 0 }, true  }, // TODO -> true
+        { { 0, 1, 5, 4 }, false },
+        { { 1, 2, 6, 5 }, false },
+        { { 2, 3, 7, 6 }, false },
+        { { 3, 0, 4, 7 }, false },
+        { { 4, 5, 6, 7 }, true  }  // TODO -> true
+    }, false };
+
+//! @param base_edge of one side of the square base
+//! @param height    of the frustum
+//! @param alpha:    dihedral angle in radians between base and facet
+
+FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)
+    : FormFactorPolyhedron()
+    , m_base_edge(base_edge)
+    , m_height(height)
+    , m_alpha(alpha)
+{
+    setName(BornAgain::FFPyramidType);
+    registerParameter(BornAgain::BaseEdge, &m_base_edge).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Alpha, & m_alpha).setUnit("rad").setLimited(0., M_PI_2);
+    onChange();
+}
+
+void FormFactorPyramid::onChange()
+{
+    double cot_alpha = MathFunctions::cot(m_alpha);
+    if( !std::isfinite(cot_alpha) || cot_alpha<0 )
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
+    double r = cot_alpha*2 * m_height / m_base_edge; // L(top)/L(base)
+    if ( r > 1 ) {
+        std::ostringstream ostr;
+        ostr << "FormFactorPyramid() -> Error in class initialization with parameters";
+        ostr << " base_edge:" << m_base_edge;
+        ostr << " height:" << m_height;
+        ostr << " alpha[rad]:" << m_alpha << "\n\n";
+        ostr << "Check for 'height <= base_edge*tan(alpha)' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    double a = m_base_edge/2;
+    double b = a * (1-r);
+
+    double zcom = m_height * ( .5 - 2*r/3 + r*r/4 ) / ( 1 - r + r*r/3 ); // center of mass
+
+    setPolyhedron( topology, -zcom, {
+            // base:
+            { -a, -a, -zcom },
+            {  a, -a, -zcom },
+            {  a,  a, -zcom },
+            { -a,  a, -zcom },
+            // top:
+            { -b, -b, m_height-zcom },
+            {  b, -b, m_height-zcom },
+            {  b,  b, m_height-zcom },
+            { -b,  b, m_height-zcom } } );
+}
diff --git a/Core/HardParticle/FormFactorPyramid.h b/Core/HardParticle/FormFactorPyramid.h
new file mode 100644
index 0000000..9ece0f1
--- /dev/null
+++ b/Core/HardParticle/FormFactorPyramid.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorPyramid.h
+//! @brief     Defines class FormFactorPyramid
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORPYRAMID_H
+#define FORMFACTORPYRAMID_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A frustum with a quadratic base.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorPyramid : public FormFactorPolyhedron
+{
+public:
+    FormFactorPyramid(double base_edge, double height, double alpha);
+
+    FormFactorPyramid* clone() const override final {
+        return new FormFactorPyramid(m_base_edge, m_height, m_alpha); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getBaseEdge() const { return m_base_edge; }
+    double getAlpha() const { return m_alpha; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+
+    double m_base_edge;
+    double m_height;
+    double m_alpha;
+};
+
+#endif // FORMFACTORPYRAMID_H
diff --git a/Core/HardParticle/FormFactorRipple1.cpp b/Core/HardParticle/FormFactorRipple1.cpp
new file mode 100644
index 0000000..09e7008
--- /dev/null
+++ b/Core/HardParticle/FormFactorRipple1.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorRipple1.cpp
+//! @brief     Implements class FormFactorRipple1.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorRipple1.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "RealLimits.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+static complex_t I(0.,1.);
+
+FormFactorRipple1::FormFactorRipple1(double length, double width, double height)
+    : m_length(length), m_width(width), m_height(height)
+{
+    setName(BornAgain::FFRipple1Type);
+    check_initialization();
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    mP_integrator = make_integrator_complex(this, &FormFactorRipple1::Integrand);
+}
+
+bool FormFactorRipple1::check_initialization() const
+{
+    bool result(true);
+    if(m_height <=0.0 || m_width<=0.0 || m_length<=0.0) {
+        std::ostringstream ostr;
+        ostr << "FormFactorRipple1() -> Error in class initialization with parameters ";
+        ostr << " height:" << m_height;
+        ostr << " width:" << m_width;
+        ostr << " length:" << m_length << "\n\n";
+        ostr << "Check for 'height>0.0 && width>0.0 && length>0.0' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    return result;
+}
+
+double FormFactorRipple1::getRadialExtension() const
+{
+    return ( m_width + m_length ) / 4.0;
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorRipple1::Integrand(double u) const
+{
+    return sin(u) * exp(m_az*std::cos(u)) * ( m_ay==0. ? u : sin(m_ay*u)/m_ay );
+}
+
+//! Complex formfactor.
+complex_t FormFactorRipple1::evaluate_for_q(const cvector_t q) const
+{
+    complex_t factor = m_length*MathFunctions::sinc(q.x()*m_length*0.5)*m_width/M_PI;
+
+    // analytical expressions for some particular cases
+    if ( q.z()==0. ) {
+        if( q.y()==0. )
+            return factor*M_PI_2*m_height;
+        complex_t aaa = q.y()*m_width/(M_TWOPI);
+        complex_t aaa2 = aaa*aaa;
+        if ( aaa2==1. )
+            return factor*M_PI_4*m_height;
+        return factor*M_PI_2*m_height*MathFunctions::sinc(q.y()*m_width*0.5)/(1.0-aaa2);
+    }
+
+    // numerical integration otherwise
+    m_ay = q.y() * m_width / M_TWOPI;
+    m_az = I * q.z() * (m_height/2);
+    complex_t integral = mP_integrator->integrate(0, M_PI);
+    return factor * integral * exp(m_az) * (m_height/2);
+}
diff --git a/Core/HardParticle/FormFactorRipple1.h b/Core/HardParticle/FormFactorRipple1.h
new file mode 100644
index 0000000..bcfc54d
--- /dev/null
+++ b/Core/HardParticle/FormFactorRipple1.h
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorRipple1.h
+//! @brief     Defines class FormFactorRipple1.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORRIPPLE1_H
+#define FORMFACTORRIPPLE1_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+//! The formfactor for a cosine ripple.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorRipple1 : public IFormFactorBorn
+{
+public:
+    //! @brief Ripple1 constructor
+    //! @param length of Ripple1
+    //! @param width of cosine cross section
+    //! @param height of cosine cross section
+    FormFactorRipple1(double length, double width, double height);
+
+    FormFactorRipple1* clone() const override final {
+        return new FormFactorRipple1(m_length, m_width, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getLength() const { return m_length; }
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    complex_t Integrand(double u) const;
+    bool check_initialization() const;
+
+    double m_length;
+    double m_width;
+    double m_height;
+
+    mutable complex_t m_ay;
+    mutable complex_t m_az;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorRipple1>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORRIPPLE1_H
diff --git a/Core/HardParticle/FormFactorRipple2.cpp b/Core/HardParticle/FormFactorRipple2.cpp
new file mode 100644
index 0000000..72a9e61
--- /dev/null
+++ b/Core/HardParticle/FormFactorRipple2.cpp
@@ -0,0 +1,97 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorRipple2.cpp
+//! @brief     Implements class FormFactorRipple2.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorRipple2.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "RealParameter.h"
+
+FormFactorRipple2::FormFactorRipple2(double length, double width, double height, double asymetry)
+    : m_length(length), m_width(width), m_height(height), m_d(asymetry)
+{
+    setName(BornAgain::FFRipple2Type);
+    check_initialization();
+    registerParameter(BornAgain::Length, &m_length    ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Width, &m_width      ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height    ).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::AsymmetryLength, &m_d).setUnit("nm");
+}
+
+double FormFactorRipple2::getRadialExtension() const
+{
+    return ( m_width + m_length ) / 4.0;
+}
+
+//! Complex formfactor.
+complex_t FormFactorRipple2::evaluate_for_q(const cvector_t q) const
+{
+    complex_t factor = m_length * MathFunctions::sinc(q.x() * m_length * 0.5) * m_width;
+    complex_t result = 0;
+    complex_t iqzH = mul_I( q.z() * m_height );
+    complex_t iqyW = mul_I( q.y() * m_width );
+    complex_t aaa = 2.0 * (m_d * q.y() + m_height * q.z());
+
+    if (0.0 == q.y() && 0.0 == q.z())
+        result = m_height * 0.5;
+    else if (0.0 == q.y())
+        result = (1.0 - std::exp(iqzH) + iqzH) / (m_height * q.z() * q.z());
+    else if (1.0 == aaa / (q.y() * m_width))
+        result = m_height * std::exp(iqzH) * (1.0 - std::exp(-1.0 * iqyW) - iqyW)
+                 / (q.y() * q.y() * m_width * m_width);
+    else if (-1.0 == aaa / (q.y() * m_width))
+        result = m_height * std::exp(iqzH) * (1.0 - std::exp(-1.0 * iqyW) + iqyW)
+                 / (q.y() * q.y() * m_width * m_width);
+    else {
+        complex_t iHqzdqy = complex_t(0.0, 1.0) * (q.z() * m_height + q.y() * m_d);
+        complex_t Hqzdqy = q.z() * m_height + q.y() * m_d;
+        result = std::cos(q.y() * m_width * 0.5)
+                 + 2.0 * iHqzdqy * std::sin(q.y() * m_width * 0.5) / (m_width * q.y());
+        result = result * std::exp(-1.0 * iHqzdqy) - 1.0;
+        result = result * 4.0 * m_height * std::exp(iqzH)
+                 / (4.0 * Hqzdqy * Hqzdqy - q.y() * q.y() * m_width * m_width);
+    }
+    return factor * result;
+}
+
+bool FormFactorRipple2::check_initialization() const
+{
+    bool result(true);
+    std::string message;
+    if(-1*m_width > 2.*m_d) {
+        result = false;
+        message = std::string("Check for '-1*width <= 2.*asymmetry' failed.");
+    }
+    if(m_width < 2.*m_d) {
+        result = false;
+        message = std::string("Check for 'width >= 2.*asymmetry' failed.");
+    }
+    if(m_height <=0) {
+        result = false;
+        message = std::string("Check for 'height > 0' failed.");
+    }
+
+    if(!result) {
+        std::ostringstream ostr;
+        ostr << "FormFactorRipple2() -> Error in class initialization with parameters ";
+        ostr << " width:" << m_width;
+        ostr << " height:" << m_height;
+        ostr << " length:" << m_length;
+        ostr << " asymmetry:" << m_d << "\n\n";
+        ostr << message;
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    return result;
+}
diff --git a/Core/HardParticle/FormFactorRipple2.h b/Core/HardParticle/FormFactorRipple2.h
new file mode 100644
index 0000000..98314f1
--- /dev/null
+++ b/Core/HardParticle/FormFactorRipple2.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorRipple2.h
+//! @brief     Defines class FormFactorRipple2.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORRIPPLE2_H
+#define FORMFACTORRIPPLE2_H
+
+#include "IFormFactorBorn.h"
+
+//! The formfactor for a triangular ripple.
+//! @ingroup legacyGrating
+
+class BA_CORE_API_ FormFactorRipple2 : public IFormFactorBorn
+{
+public:
+    //! @brief Ripple2 constructor
+    //! @param length of Ripple2
+    //! @param width of triangular cross section
+    //! @param height of triangular cross section
+    //! @param asymmetry length of triangular cross section
+    FormFactorRipple2(double length, double width, double height, double asymmetry);
+
+    FormFactorRipple2 *clone() const override final {
+        return new FormFactorRipple2(m_length, m_width, m_height, m_d); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getWidth() const { return m_width; }
+    double getLength() const { return m_length; }
+    double getAsymmetry() const { return m_d; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    bool check_initialization() const;
+    double m_length;
+    double m_width;
+    double m_height;
+    double m_d;
+    mutable cvector_t m_q;
+};
+
+#endif // FORMFACTORRIPPLE2_H
diff --git a/Core/HardParticle/FormFactorTetrahedron.cpp b/Core/HardParticle/FormFactorTetrahedron.cpp
new file mode 100644
index 0000000..b46dfef
--- /dev/null
+++ b/Core/HardParticle/FormFactorTetrahedron.cpp
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTetrahedron.cpp
+//! @brief     Implements class FormFactorTetrahedron.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorTetrahedron.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorTetrahedron::topology = {
+    {
+        { { 2, 1, 0 }, false },
+        { { 0, 1, 4, 3 }, false },
+        { { 1, 2, 5, 4 }, false },
+        { { 2, 0, 3, 5 }, false },
+        { { 3, 4, 5 }, false }
+    }, false };
+
+
+//! @param base_edge of a side of the base
+//! @param height    of the frustum
+//! @param alpha:    dihedral angle in radians between base and facet
+
+FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)
+    : FormFactorPolyhedron()
+    , m_base_edge(base_edge)
+    , m_height(height)
+    , m_alpha(alpha)
+{
+    setName(BornAgain::FFTetrahedronType);
+    registerParameter(BornAgain::BaseEdge, &m_base_edge).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Alpha, &m_alpha).setUnit("rad").setLimited(0., M_PI_2);
+    onChange();
+}
+
+void FormFactorTetrahedron::onChange()
+{
+    double cot_alpha = MathFunctions::cot(m_alpha);
+    if( !std::isfinite(cot_alpha) || cot_alpha<0 )
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
+    double r = cot_alpha * 2*std::sqrt(3.) * m_height / m_base_edge; // L(top)/L(base)
+    if ( r > 1 ) {
+        std::ostringstream ostr;
+        ostr << "Incompatible parameters in Tetrahedron: ";
+        ostr << "(base_edge=" << m_base_edge;
+        ostr << ", height:" << m_height;
+        ostr << ", alpha[rad]:" << m_alpha << ")";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    double a = m_base_edge;
+    double as = a/2;
+    double ac = a/sqrt(3)/2;
+    double ah = a/sqrt(3);
+    double b = a * (1-r);
+    double bs = b/2;
+    double bc = b/sqrt(3)/2;
+    double bh = b/sqrt(3);
+
+    double zcom = m_height * ( .5 - 2*r/3 + r*r/4 ) / ( 1 - r + r*r/3 ); // center of mass
+
+    setPolyhedron( topology, -zcom, {
+            // base:
+            { -ac,  as, -zcom },
+            { -ac, -as, -zcom },
+            {  ah,  0., -zcom },
+            // top:
+            { -bc,  bs, m_height-zcom },
+            { -bc, -bs, m_height-zcom },
+            {  bh,  0., m_height-zcom } } );
+}
diff --git a/Core/HardParticle/FormFactorTetrahedron.h b/Core/HardParticle/FormFactorTetrahedron.h
new file mode 100644
index 0000000..51215d6
--- /dev/null
+++ b/Core/HardParticle/FormFactorTetrahedron.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTetrahedron.h
+//! @brief     Defines class FormFactorTetrahedron
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORTETRAHEDRON_H
+#define FORMFACTORTETRAHEDRON_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A frustum with equilateral trigonal base.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorTetrahedron : public FormFactorPolyhedron
+{
+public:
+    FormFactorTetrahedron(double base_edge, double height, double alpha);
+
+    FormFactorTetrahedron *clone() const override final {
+        return new FormFactorTetrahedron(m_base_edge, m_height, m_alpha); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getBaseEdge() const { return m_base_edge; }
+    double getHeight() const { return m_height; }
+    double getAlpha() const { return m_alpha; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+    double m_base_edge;
+    double m_height;
+    double m_alpha;
+};
+
+#endif // FORMFACTORTETRAHEDRON_H
diff --git a/Core/HardParticle/FormFactorTriangle.cpp b/Core/HardParticle/FormFactorTriangle.cpp
new file mode 100644
index 0000000..690bc3d
--- /dev/null
+++ b/Core/HardParticle/FormFactorTriangle.cpp
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTriangle.cpp
+//! @brief     Implements class FormFactorTriangle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorTriangle.h"
+#include "BornAgainNamespace.h"
+#include "RealLimits.h"
+#include "RealParameter.h"
+
+FormFactorTriangle::FormFactorTriangle(const double base_edge)
+    : m_base_edge( base_edge )
+{
+    setName("Triangle");
+    registerParameter(BornAgain::BaseEdge, &m_base_edge).setUnit("nm").setNonnegative();
+    onChange();
+}
+
+void FormFactorTriangle::onChange()
+{
+    double a = m_base_edge;
+    double as = a/2;
+    double ac = a/sqrt(3)/2;
+    double ah = a/sqrt(3);
+    kvector_t V[3] = {
+        { -ac,  as, 0. },
+        { -ac, -as, 0. },
+        {  ah,  0., 0. } };
+    m_base = std::unique_ptr<PolyhedralFace>( new PolyhedralFace( { V[0], V[1], V[2] }, false ) );
+}
diff --git a/Core/HardParticle/FormFactorTriangle.h b/Core/HardParticle/FormFactorTriangle.h
new file mode 100644
index 0000000..a84ce2d
--- /dev/null
+++ b/Core/HardParticle/FormFactorTriangle.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTriangle.h
+//! @brief     Defines class FormFactorTriangle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORTRIANGLE_H
+#define FORMFACTORTRIANGLE_H
+#include "FormFactorPolyhedron.h"
+
+//! A planar equilateral triangle, for testing form factor computations.
+
+class BA_CORE_API_ FormFactorTriangle : public FormFactorPolygonalSurface
+{
+public:
+    FormFactorTriangle(const double base_edge);
+
+    FormFactorTriangle* clone() const override final { return new FormFactorTriangle(m_base_edge); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getBaseEdge() const { return m_base_edge; }
+
+protected:
+    void onChange() override final;
+
+private:
+    double m_base_edge;
+};
+
+#endif // FORMFACTORTRIANGLE_H
diff --git a/Core/HardParticle/FormFactorTrivial.cpp b/Core/HardParticle/FormFactorTrivial.cpp
new file mode 100644
index 0000000..9728119
--- /dev/null
+++ b/Core/HardParticle/FormFactorTrivial.cpp
@@ -0,0 +1,24 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTrivial.cpp
+//! @brief     Implements class FormFactorTrivial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorTrivial.h"
+#include "BornAgainNamespace.h"
+#include "RealParameter.h"
+
+
+FormFactorTrivial::FormFactorTrivial()
+{
+    setName(BornAgain::FormFactorTrivialType);
+}
diff --git a/Core/HardParticle/FormFactorTrivial.h b/Core/HardParticle/FormFactorTrivial.h
new file mode 100644
index 0000000..8a31f79
--- /dev/null
+++ b/Core/HardParticle/FormFactorTrivial.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTrivial.h
+//! @brief     Defines class FormFactorTrivial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORTRIVIAL_H
+#define FORMFACTORTRIVIAL_H
+
+#include "IFormFactorBorn.h"
+
+//! A dot, with trivial formfactor F(q)=1.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorTrivial : public IFormFactorBorn
+{
+public:
+    FormFactorTrivial();
+
+    FormFactorTrivial* clone() const override final { return new FormFactorTrivial(); }
+
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadialExtension() const override final { return 0; }
+
+    complex_t evaluate_for_q(const cvector_t) const override final { return 1; }
+};
+
+#endif // FORMFACTORTRIVIAL_H
diff --git a/Core/HardParticle/FormFactorTruncatedCube.cpp b/Core/HardParticle/FormFactorTruncatedCube.cpp
new file mode 100644
index 0000000..fb1b943
--- /dev/null
+++ b/Core/HardParticle/FormFactorTruncatedCube.cpp
@@ -0,0 +1,92 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTruncatedCube.cpp
+//! @brief     Implements class FormFactorTruncatedCube.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorTruncatedCube.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "RealParameter.h"
+
+const PolyhedralTopology FormFactorTruncatedCube::topology = {
+    {
+        { {  0, 1, 7, 6,  9,10, 4, 3 }, true },
+        { {  0, 2, 1 }, false },
+        { {  3, 4, 5 }, false },
+        { {  9,11,10 }, false },
+        { {  6, 7, 8 }, false },
+        { {  0, 3, 5,17, 15,12,14, 2 }, true },
+        { {  4,10,11,23, 22,16,17, 5 }, true },
+        { {  1, 2,14,13, 19,20, 8, 7 }, true },
+        { {  6, 8,20,18, 21,23,11, 9 }, true },
+        { { 15,17,16 }, false },
+        { { 12,13,14 }, false },
+        { { 18,20,19 }, false },
+        { { 21,22,23 }, false },
+        { { 12,15,16,22, 21,18,19,13 }, true }
+    }, true };
+
+//! @param length         of the full cube
+//! @param removed_length as removed from each edge of the cube
+
+FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)
+    : FormFactorPolyhedron()
+    , m_length(length)
+    , m_removed_length(removed_length)
+{
+    setName(BornAgain::FFTruncatedCubeType);
+    registerParameter(BornAgain::Length, &m_length).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::RemovedLength, &m_removed_length).setUnit("nm").setNonnegative();
+    onChange();
+}
+
+void FormFactorTruncatedCube::onChange()
+{
+    if(m_removed_length > 0.5*m_length) {
+        std::ostringstream ostr;
+        ostr << "::FormFactorTruncatedCube() -> Error in class initialization ";
+        ostr << "with parameters 'length':" << m_length;
+        ostr << " 'removed_length':" << m_removed_length << "\n\n";
+        ostr << "Check for removed_length <= 0.5*length failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+
+    double a = m_length/2;
+    double b = m_removed_length;
+
+    setPolyhedron( topology, -a, {
+        { -a+b, -a  , -a   },
+        { -a  , -a+b, -a   },
+        { -a  , -a  , -a+b },
+        {  a-b, -a  , -a   },
+        {  a  , -a+b, -a   },
+        {  a  , -a  , -a+b },
+        { -a+b,  a  , -a   },
+        { -a  ,  a-b, -a   },
+        { -a  ,  a  , -a+b },
+        {  a-b,  a  , -a   },
+        {  a  ,  a-b, -a   },
+        {  a  ,  a  , -a+b },
+        { -a+b, -a  ,  a   },
+        { -a  , -a+b,  a   },
+        { -a  , -a  ,  a-b },
+        {  a-b, -a  ,  a   },
+        {  a  , -a+b,  a   },
+        {  a  , -a  ,  a-b },
+        { -a+b,  a  ,  a   },
+        { -a  ,  a-b,  a   },
+        { -a  ,  a  ,  a-b },
+        {  a-b,  a  ,  a   },
+        {  a  ,  a-b,  a   },
+        {  a  ,  a  ,  a-b } } );
+}
diff --git a/Core/HardParticle/FormFactorTruncatedCube.h b/Core/HardParticle/FormFactorTruncatedCube.h
new file mode 100644
index 0000000..a5048da
--- /dev/null
+++ b/Core/HardParticle/FormFactorTruncatedCube.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTruncatedCube.h
+//! @brief     Defines class FormFactorTruncatedCube.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORTRUNCATEDCUBE_H
+#define FORMFACTORTRUNCATEDCUBE_H
+
+#include "FormFactorPolyhedron.h"
+
+//! A cube, with tetrahedral truncation of all edges.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorTruncatedCube : public FormFactorPolyhedron
+{
+public:
+    FormFactorTruncatedCube(double length, double removed_length);
+
+    FormFactorTruncatedCube*clone() const override final {
+        return new FormFactorTruncatedCube(m_length, m_removed_length); }
+    void accept(ISampleVisitor*visitor) const override final { visitor->visit(this); }
+
+    double getLength() const { return m_length; }
+    double getRemovedLength() const { return m_removed_length; }
+
+protected:
+    void onChange() override final;
+
+private:
+    static const PolyhedralTopology topology;
+    double m_length;
+    double m_removed_length;
+};
+
+#endif // FORMFACTORTRUNCATEDCUBE_H
diff --git a/Core/HardParticle/FormFactorTruncatedSphere.cpp b/Core/HardParticle/FormFactorTruncatedSphere.cpp
new file mode 100644
index 0000000..9937f79
--- /dev/null
+++ b/Core/HardParticle/FormFactorTruncatedSphere.cpp
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTruncatedSphere.cpp
+//! @brief     Implements class FormFactorTruncatedSphere.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorTruncatedSphere.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "RealLimits.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+using namespace BornAgain;
+
+FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height)
+    : m_radius(radius), m_height(height)
+{
+    setName(FFTruncatedSphereType);
+    check_initialization();
+    registerParameter(Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(Height, &m_height).setUnit("nm").setNonnegative();
+    mP_integrator = make_integrator_complex(this, &FormFactorTruncatedSphere::Integrand);
+}
+
+bool FormFactorTruncatedSphere::check_initialization() const
+{
+    bool result(true);
+    if(m_height > 2.*m_radius) {
+        std::ostringstream ostr;
+        ostr << "::FormFactorTruncatedSphere() -> Error in class initialization ";
+        ostr << "with parameters 'radius':" << m_radius << " 'height':" << m_height << "\n\n";
+        ostr << "Check for height <= 2.*radius failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    return result;
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorTruncatedSphere::Integrand(double Z) const
+{
+    double Rz = std::sqrt(m_radius*m_radius-Z*Z );
+    complex_t qx = m_q.x();
+    complex_t qy = m_q.y();
+    complex_t q_p = std::sqrt(qx*qx + qy*qy); // NOT the modulus!
+    return Rz*Rz*MathFunctions::Bessel_J1c(q_p*Rz) * exp_I(m_q.z()*Z);
+}
+
+//! Complex formfactor.
+complex_t FormFactorTruncatedSphere::evaluate_for_q(const cvector_t q) const
+{
+    m_q = q;
+    if ( std::abs(q.mag()) < std::numeric_limits<double>::epsilon()) {
+        double HdivR = m_height/m_radius;
+        return M_PI/3.*m_radius*m_radius*m_radius
+                *(3.*HdivR -1. - (HdivR - 1.)*(HdivR - 1.)*(HdivR - 1.));
+    }
+    // else
+    complex_t integral = mP_integrator->integrate(m_radius-m_height, m_radius);
+    return M_TWOPI * integral * exp_I(q.z()*(m_height-m_radius));
+}
diff --git a/Core/HardParticle/FormFactorTruncatedSphere.h b/Core/HardParticle/FormFactorTruncatedSphere.h
new file mode 100644
index 0000000..658fe2e
--- /dev/null
+++ b/Core/HardParticle/FormFactorTruncatedSphere.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTruncatedSphere.h
+//! @brief     Defines class FormFactorTruncatedSphere.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORTRUNCATEDSPHERE_H
+#define FORMFACTORTRUNCATEDSPHERE_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+//! A truncated Sphere.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorTruncatedSphere : public IFormFactorBorn
+{
+public:
+    FormFactorTruncatedSphere(double radius, double height);
+
+    FormFactorTruncatedSphere *clone() const override final {
+        return new FormFactorTruncatedSphere(m_radius, m_height); }
+    void accept(ISampleVisitor *visitor) const override final { visitor->visit(this); }
+
+    double getHeight() const { return m_height; }
+    double getRadius() const { return m_radius; }
+
+    double getRadialExtension() const override final { return m_radius; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    bool check_initialization() const;
+    complex_t Integrand(double Z) const;
+
+    double m_radius;
+    double m_height;
+    mutable cvector_t m_q;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorTruncatedSphere>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORTRUNCATEDSPHERE_H
diff --git a/Core/HardParticle/FormFactorTruncatedSpheroid.cpp b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
new file mode 100644
index 0000000..3a83ff4
--- /dev/null
+++ b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
@@ -0,0 +1,75 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTruncatedSpheroid.cpp
+//! @brief     Implements class FormFactorTruncatedSpheroid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorTruncatedSpheroid.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(
+    double radius, double height, double height_flattening)
+    : m_radius(radius), m_height(height), m_height_flattening(height_flattening)
+{
+    setName(BornAgain::FFTruncatedSpheroidType);
+    check_initialization();
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::HeightFlattening, &m_height_flattening).setNonnegative();
+    mP_integrator = make_integrator_complex(this, &FormFactorTruncatedSpheroid::Integrand);
+}
+
+bool FormFactorTruncatedSpheroid::check_initialization() const
+{
+    bool result(true);
+    if(m_height > 2.*m_radius*m_height_flattening) {
+        std::ostringstream ostr;
+        ostr << "::FormFactorTruncatedSphere() -> Error in class initialization with parameters ";
+        ostr << " radius:" << m_radius;
+        ostr << " height:" << m_height;
+        ostr << " height_flattening:" << m_height_flattening << "\n\n";
+        ostr << "Check for 'height <= 2.*radius*height_flattening' failed.";
+        throw Exceptions::ClassInitializationException(ostr.str());
+    }
+    return result;
+}
+
+//! Integrand for complex formfactor.
+complex_t FormFactorTruncatedSpheroid::Integrand(double Z) const
+{
+    double R = m_radius;
+    double fp = m_height_flattening;
+
+    double Rz  = std::sqrt(R*R-Z*Z/(fp*fp));
+    complex_t qrRz = std::sqrt(m_q.x()*m_q.x()+m_q.y()*m_q.y())*Rz;
+    complex_t J1_qrRz_div_qrRz = MathFunctions::Bessel_J1c(qrRz);
+
+    return Rz * Rz * J1_qrRz_div_qrRz * std::exp(complex_t(0.0,1.0)*m_q.z()*Z);
+}
+
+complex_t FormFactorTruncatedSpheroid::evaluate_for_q(const cvector_t q) const
+{
+    double H = m_height;
+    double R = m_radius;
+    double fp = m_height_flattening;
+    m_q = q;
+
+    if (std::abs(m_q.mag()) <= std::numeric_limits<double>::epsilon())
+        return M_PI*R*H*H/fp*(1.-H/(3.*fp*R));
+    complex_t z_part    =  std::exp(complex_t(0.0, 1.0)*m_q.z()*(H-fp*R));
+    return M_TWOPI * z_part *mP_integrator->integrate(fp*R-H,fp*R );
+}
diff --git a/Core/HardParticle/FormFactorTruncatedSpheroid.h b/Core/HardParticle/FormFactorTruncatedSpheroid.h
new file mode 100644
index 0000000..bf03b07
--- /dev/null
+++ b/Core/HardParticle/FormFactorTruncatedSpheroid.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/HardParticle/FormFactorTruncatedSpheroid.h
+//! @brief     Defines class FormFactorTruncatedSpheroid.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORTRUNCATEDSPHEROID_H
+#define FORMFACTORTRUNCATEDSPHEROID_H
+
+#include "IFormFactorBorn.h"
+#include "IntegratorComplex.h"
+
+//! A truncated spheroid.
+//! An ellipsoid with two equal axis, truncated by a plane perpendicular to the third axis.
+//! @ingroup hardParticle
+
+class BA_CORE_API_ FormFactorTruncatedSpheroid : public IFormFactorBorn
+{
+public:
+    FormFactorTruncatedSpheroid(double radius, double height, double height_flattening);
+
+    FormFactorTruncatedSpheroid* clone() const override final {
+        return new FormFactorTruncatedSpheroid(m_radius, m_height, m_height_flattening); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadius() const { return m_radius; }
+    double getHeight() const { return m_height; }
+    double getHeightFlattening() const { return m_height_flattening; }
+
+    double getRadialExtension() const override final { return m_radius; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    bool check_initialization() const;
+    complex_t Integrand(double Z) const;
+
+    double m_radius;
+    double m_height;
+    double m_height_flattening;
+    mutable cvector_t m_q;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorComplex<FormFactorTruncatedSpheroid>> mP_integrator;
+#endif
+};
+
+#endif // FORMFACTORTRUNCATEDSPHEROID_H
diff --git a/Core/InputOutput/IntensityDataIOFactory.cpp b/Core/InputOutput/IntensityDataIOFactory.cpp
new file mode 100644
index 0000000..1e845e8
--- /dev/null
+++ b/Core/InputOutput/IntensityDataIOFactory.cpp
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/IntensityDataIOFactory.cpp
+//! @brief     Implements class OutputDataIOFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IntensityDataIOFactory.h"
+#include "IHistogram.h"
+#include "OutputDataReadFactory.h"
+#include "OutputDataWriteFactory.h"
+
+OutputData<double>* IntensityDataIOFactory::readOutputData(const std::string& file_name)
+{
+    auto* reader = OutputDataReadFactory::getReader(file_name);
+    auto* result = reader->getOutputData();
+    delete reader;
+    return result;
+}
+
+IHistogram* IntensityDataIOFactory::readIntensityData(const std::string& file_name)
+{
+    return IHistogram::createHistogram(*(readOutputData(file_name)));
+}
+
+void IntensityDataIOFactory::writeOutputData(
+    const OutputData<double>& data, const std::string& file_name)
+{
+    auto *writer = OutputDataWriteFactory::getWriter(file_name);
+    writer->writeOutputData(data);
+    delete writer;
+}
+
+void IntensityDataIOFactory::writeIntensityData(
+    const IHistogram& histogram, const std::string& file_name)
+{
+    writeOutputData(*(histogram.createOutputData()), file_name);
+}
diff --git a/Core/InputOutput/IntensityDataIOFactory.h b/Core/InputOutput/IntensityDataIOFactory.h
new file mode 100644
index 0000000..0de20ee
--- /dev/null
+++ b/Core/InputOutput/IntensityDataIOFactory.h
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/IntensityDataIOFactory.h
+//! @brief     Defines class IntensityDataIOFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTENSITYDATAIOFACTORY_H
+#define INTENSITYDATAIOFACTORY_H
+
+#include "WinDllMacros.h"
+#include <string>
+
+template <class T> class OutputData;
+class IHistogram;
+
+//! @class IntensityDataIOFactory
+//! @ingroup input_output
+//! @brief Provides users with possibility to read and write IntensityData from/to files
+//! in different format. Type of the file will be deduced from file name.
+//! *.txt - ASCII file with 2D array [nrow][ncol], layout as in numpy.
+//! *.int - BornAgain internal ASCII format.
+//! *.tif - 32-bits tiff file.
+//! If file name ends woth "*.gz" or "*.bz2" the file will be zipped on the fly using
+//! appropriate algorithm.
+
+/*! Usage:
+\code{.py}
+# reading from ASCII file or g-zipped ASCII file
+histogram = IntensityDataIOFactory.readIntensityData("filename.txt")
+histogram = IntensityDataIOFactory.readIntensityData("filename.txt.gz")
+
+# writing to 32-bits tiff file or b-zipped tiff file
+IntensityDataIOFactory.writeIntensityData(histogram, "filename.tif")
+IntensityDataIOFactory.writeIntensityData(histogram, "filename.tif.bz2")
+\endcode
+*/
+
+class BA_CORE_API_ IntensityDataIOFactory
+{
+public:
+    //! Reads file and returns newly created OutputData object
+    static OutputData<double>* readOutputData(const std::string& file_name);
+
+    //! Reads file and returns newly created Histogram object
+    static IHistogram* readIntensityData(const std::string& file_name);
+
+    //! Writes OutputData in file
+    static void writeOutputData(const OutputData<double>& data, const std::string& file_name);
+
+    //! Writes histogram in file
+    static void writeIntensityData(const IHistogram &histogram, const std::string& file_name);
+};
+
+#endif // INTENSITYDATAIOFACTORY_H
diff --git a/Core/InputOutput/OutputDataIOHelper.cpp b/Core/InputOutput/OutputDataIOHelper.cpp
new file mode 100644
index 0000000..b365143
--- /dev/null
+++ b/Core/InputOutput/OutputDataIOHelper.cpp
@@ -0,0 +1,223 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataIOHelper.cpp
+//! @brief     Implements class OutputDataIOHelper.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OutputDataIOHelper.h"
+#include "ConstKBinAxis.h"
+#include "CustomBinAxis.h"
+#include "FileSystem.h"
+#include "OutputData.h"
+#include "Utils.h"
+#include <iterator>
+#include <iostream>
+
+bool OutputDataIOHelper::isCompressed(const std::string& name)
+{
+    return isGZipped(name) || isBZipped(name);
+}
+
+//! Does name contain *.gz extension?
+
+bool OutputDataIOHelper::isGZipped(const std::string& name)
+{
+    return FileSystem::GetFileExtension(name) == GzipExtention;
+}
+
+bool OutputDataIOHelper::isBZipped(const std::string& name)
+{
+    return FileSystem::GetFileExtension(name) == BzipExtention;
+}
+
+
+//! Returns file main extension (without .gz).
+
+std::string OutputDataIOHelper::GetFileMainExtension(const std::string& name)
+{
+    std::string stripped_name(name);
+    if(isGZipped(name)) {
+        stripped_name = name.substr(0, name.size()-GzipExtention.size());
+    }
+    else if(isBZipped(name)) {
+        stripped_name = name.substr(0, name.size()-BzipExtention.size());
+    }
+    return FileSystem::GetFileExtension(stripped_name);
+}
+
+bool OutputDataIOHelper::isBinaryFile(const std::string& file_name)
+{
+    // all compressed files are always binary.
+    if(isCompressed(file_name)) return true;
+    // uncompressed "int" or "txt" files are ascii
+    if(isIntFile(file_name)) return false;
+    if(isTxtFile(file_name)) return false;
+    // the rest (e.g. tif) is also binary
+    return true;
+}
+
+bool OutputDataIOHelper::isIntFile(const std::string& file_name)
+{
+    return GetFileMainExtension(file_name) == IntExtention;
+}
+
+bool OutputDataIOHelper::isTxtFile(const std::string& file_name)
+{
+    return GetFileMainExtension(file_name) == TxtExtention;
+}
+
+bool OutputDataIOHelper::isTiffFile(const std::string& file_name)
+{
+    return GetFileMainExtension(file_name) == TiffExtention;
+}
+
+//! Returns true if string representation of the axis contains one of
+//! FixedBinAxis, ConstKBinAxis or CustomBinAxis to parse it later in
+//! similar way.
+bool OutputDataIOHelper::isSimilarToFixedBinAxisType(const std::string& line)
+{
+    return line.find(FixedBinAxisType) != std::string::npos ||
+        line.find(ConstKBinAxisType) != std::string::npos ||
+        line.find(CustomBinAxisType) != std::string::npos;
+}
+
+bool OutputDataIOHelper::isVariableBinAxisType(const std::string& line)
+{
+    return line.find(VariableBinAxisType) != std::string::npos;
+}
+
+
+//! Creates axis of certain type from input stream
+IAxis *OutputDataIOHelper::createAxis(std::istream& input_stream)
+{
+    std::string line;
+    std::getline(input_stream, line);
+
+    if(isSimilarToFixedBinAxisType(line))
+    {
+        return createFixedBinAxis(line);
+    }
+    else if(isVariableBinAxisType(line))
+    {
+        return createVariableBinAxis(line);
+    }
+    else {
+        throw Exceptions::LogicErrorException("OutputDataIOHelper::createAxis() -> Error. "
+                                              "Unknown axis '"+line+"'");
+    }
+}
+
+//! Create one of FixedBinAxis from string representation
+//! FixedBinAxis("axis0", 10, -1, 1)
+//! ConstKBinAxis("axis0", 10, -1, 1)
+//! CustomBinAxis("axis0", 10, -1, 1)
+IAxis *OutputDataIOHelper::createFixedBinAxis(std::string line)
+{
+    std::vector<std::string> to_replace = {",", "\"", "(", ")"};
+    Utils::String::replaceItemsFromString(line, to_replace, " ");
+
+    std::string type, name;
+    size_t nbins(0);
+
+    std::istringstream iss(line);
+    if( !(iss >> type >> name >> nbins) )
+        throw Exceptions::FormatErrorException(
+            "OutputDataIOHelper::createFixedBinAxis() -> Error. Can't parse the string.");
+
+    std::vector<double> boundaries;
+    readLineOfDoubles(boundaries, iss);
+
+    if(boundaries.size() != 2)
+        throw Exceptions::FormatErrorException(
+            "OutputDataIOHelper::createFixedBinAxis() -> Error. Can't parse the string at p2.");
+
+    if(type == FixedBinAxisType) {
+        return new FixedBinAxis(name, nbins, boundaries[0], boundaries[1]);
+    }
+    else if(type == ConstKBinAxisType) {
+        return new ConstKBinAxis(name, nbins, boundaries[0], boundaries[1]);
+    }
+    else if(type == CustomBinAxisType) {
+        return new CustomBinAxis(name, nbins, boundaries[0], boundaries[1]);
+    }
+    else {
+        throw Exceptions::LogicErrorException(
+            "OutputDataIOHelper::createOneOfFixedBinAxis() -> Error. Unexpected place.");
+    }
+}
+
+
+//! Create VariableBinAxis from string representation
+//! VariableBinAxis("axis0", 4, [-1, -0.5, 0.5, 1, 2])
+IAxis *OutputDataIOHelper::createVariableBinAxis(std::string line)
+{
+    std::vector<std::string> to_replace = {",", "\"", "(", ")", "[", "]"};
+    Utils::String::replaceItemsFromString(line, to_replace, " ");
+
+    std::string type, name;
+    size_t nbins(0);
+
+    std::istringstream iss(line);
+    if( !(iss >> type >> name >> nbins) )
+        throw Exceptions::FormatErrorException(
+            "OutputDataIOHelper::createVariableBinAxis() -> Error. Can't parse the string.");
+    std::vector<double> boundaries;
+    readLineOfDoubles(boundaries, iss);
+    if(boundaries.size() != nbins+1)
+        throw Exceptions::FormatErrorException(
+            "OutputDataIOHelper::createVariableBinAxis() -> Error. Can't parse the string at p2.");
+    return new VariableBinAxis(name, nbins, boundaries);
+}
+
+//! Fills output data raw buffer from input stream
+void OutputDataIOHelper::fillOutputData(OutputData<double>* data, std::istream& input_stream)
+{
+    std::string line;
+    data->setAllTo(0.0);
+    OutputData<double>::iterator it = data->begin();
+    while( std::getline(input_stream, line) ) {
+        if(line.empty() || line[0] == '#') break;
+
+        std::istringstream iss(line);
+        std::vector<double> buffer;
+        readLineOfDoubles(buffer, iss);
+        for (auto value : buffer) {
+            *it = value;
+            ++it;
+        }
+    }
+    if(it!= data->end())
+        throw Exceptions::FormatErrorException(
+            "OutputDataIOHelper::fillOutputData() -> Error while parsing data.");
+}
+
+//! Parse double values from string to vector of double
+
+std::vector<double> OutputDataIOHelper::parse_doubles(const std::string& str)
+{
+    std::vector<double> result;
+    std::istringstream iss(str);
+    OutputDataIOHelper::readLineOfDoubles(result, iss);
+    if( result.empty() ) {
+        std::cout << "Utils::String::parse_doubles -> "
+            "Warning! No parsed values in 1d vector of doubles." << std::endl;
+        std::cout << "Line '" << str << "'" << std::endl;
+    }
+    return result;
+}
+
+void OutputDataIOHelper::readLineOfDoubles(std::vector<double>& buffer, std::istringstream& iss)
+{
+    iss.imbue(std::locale::classic());
+    std::copy(std::istream_iterator<double>(iss),
+              std::istream_iterator<double>(), back_inserter(buffer));
+}
diff --git a/Core/InputOutput/OutputDataIOHelper.h b/Core/InputOutput/OutputDataIOHelper.h
new file mode 100644
index 0000000..e4b4649
--- /dev/null
+++ b/Core/InputOutput/OutputDataIOHelper.h
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataIOHelper.h
+//! @brief     Defines class OutputDataIOFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAIOHELPER_H
+#define OUTPUTDATAIOHELPER_H
+
+#include "WinDllMacros.h"
+#include <string>
+#include <vector>
+
+class IAxis;
+template <class T> class OutputData;
+
+namespace OutputDataIOHelper {
+
+const std::string FixedBinAxisType = "FixedBinAxis";
+const std::string VariableBinAxisType = "VariableBinAxis";
+const std::string ConstKBinAxisType = "ConstKBinAxis";
+const std::string CustomBinAxisType = "CustomBinAxis";
+const std::string GzipExtention = ".gz";
+const std::string BzipExtention = ".bz2";
+const std::string IntExtention = ".int";
+const std::string TxtExtention = ".txt";
+const std::string TiffExtention = ".tif";
+
+//! Returns true if name contains *.gz extension
+BA_CORE_API_ bool isCompressed(const std::string& name);
+
+//! Returns true if name contains *.gz extension
+BA_CORE_API_ bool isGZipped(const std::string& name);
+
+//! Returns true if name contains *.bz2 extension
+BA_CORE_API_ bool isBZipped(const std::string& name);
+
+//! Returns file extension after stripping '.gz' if any
+BA_CORE_API_ std::string GetFileMainExtension(const std::string& name);
+
+//! returns true if file name corresponds to a binary file
+BA_CORE_API_ bool isBinaryFile(const std::string& file_name);
+
+//! returns true if file name corresponds to BornAgain native format (compressed or not)
+BA_CORE_API_ bool isIntFile(const std::string& file_name);
+
+//! returns true if file name corresponds to simple numpy-style ASCII file
+BA_CORE_API_ bool isTxtFile(const std::string& file_name);
+
+//! returns true if file name corresponds to tiff file (can be also compressed)
+BA_CORE_API_ bool isTiffFile(const std::string& file_name);
+
+BA_CORE_API_ bool isSimilarToFixedBinAxisType(const std::string& line);
+BA_CORE_API_ bool isVariableBinAxisType(const std::string& line);
+
+BA_CORE_API_ IAxis *createAxis(std::istream& input_stream);
+BA_CORE_API_ IAxis *createFixedBinAxis(std::string line);
+BA_CORE_API_ IAxis *createVariableBinAxis(std::string line);
+
+BA_CORE_API_ void fillOutputData(OutputData<double>* data, std::istream& input_stream);
+
+std::vector<double> parse_doubles(const std::string& str);
+
+void readLineOfDoubles(std::vector<double>& buffer, std::istringstream& iss);
+}
+
+#endif // OUTPUTDATAIOHELPER_H
diff --git a/Core/InputOutput/OutputDataReadFactory.cpp b/Core/InputOutput/OutputDataReadFactory.cpp
new file mode 100644
index 0000000..f60e828
--- /dev/null
+++ b/Core/InputOutput/OutputDataReadFactory.cpp
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataReadFactory.cpp
+//! @brief     Implements class OutputDataReadFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OutputDataReadFactory.h"
+#include "Exceptions.h"
+#include "OutputDataIOHelper.h"
+
+OutputDataReader* OutputDataReadFactory::getReader(const std::string &file_name)
+{
+    OutputDataReader* result = new OutputDataReader(file_name);
+    result->setStrategy(getReadStrategy(file_name));
+    return result;
+}
+
+IOutputDataReadStrategy* OutputDataReadFactory::getReadStrategy(const std::string &file_name)
+{
+    IOutputDataReadStrategy* result(nullptr);
+    if(OutputDataIOHelper::isIntFile(file_name))
+        result = new OutputDataReadINTStrategy();
+    else if(OutputDataIOHelper::isTxtFile(file_name))
+        result = new OutputDataReadNumpyTXTStrategy();
+#ifdef BORNAGAIN_TIFF_SUPPORT
+    else if(OutputDataIOHelper::isTiffFile(file_name))
+       result = new OutputDataReadTiffStrategy();
+#endif // BORNAGAIN_TIFF_SUPPORT
+    else
+        throw Exceptions::LogicErrorException("OutputDataReadFactory::getReader() -> Error. "
+                "Don't know how to read file '" + file_name+std::string("'"));
+    return result;
+}
diff --git a/Core/InputOutput/OutputDataReadFactory.h b/Core/InputOutput/OutputDataReadFactory.h
new file mode 100644
index 0000000..d0701ba
--- /dev/null
+++ b/Core/InputOutput/OutputDataReadFactory.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataReadFactory.h
+//! @brief     Defines class OutputDataReadFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAREADFACTORY_H
+#define OUTPUTDATAREADFACTORY_H
+
+#include "OutputDataReader.h"
+
+
+//! @class OutputDataReadFactory
+//! @ingroup input_output_internal
+//! @brief Creates reader appropariate for given type of files
+
+class BA_CORE_API_ OutputDataReadFactory
+{
+public:
+    static OutputDataReader* getReader(const std::string& file_name);
+
+private:
+    static IOutputDataReadStrategy *getReadStrategy(const std::string& file_name);
+};
+
+#endif // OUTPUTDATAREADFACTORY_H
diff --git a/Core/InputOutput/OutputDataReadStrategy.cpp b/Core/InputOutput/OutputDataReadStrategy.cpp
new file mode 100644
index 0000000..8c2081c
--- /dev/null
+++ b/Core/InputOutput/OutputDataReadStrategy.cpp
@@ -0,0 +1,101 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataReadStrategy.cpp
+//! @brief     Implements class OutputDataReadStrategy.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OutputDataReadStrategy.h"
+#include "OutputData.h"
+#include "OutputDataIOHelper.h"
+#include "TiffHandler.h"
+#include <stdexcept> // need overlooked by g++ 5.4
+
+OutputData<double>* OutputDataReadINTStrategy::readOutputData(std::istream& input_stream)
+{
+    OutputData<double>* result = new OutputData<double>;
+    std::string line;
+
+    while( std::getline(input_stream, line) ) {
+        if (line.find("reproducibility") != std::string::npos) {
+            std::string line;
+            std::getline(input_stream, line);
+            result->setVariability( std::stod( line ) );
+        }
+
+        if (line.find("axis") != std::string::npos) {
+            IAxis* axis = OutputDataIOHelper::createAxis(input_stream);
+            result->addAxis(*axis);
+            delete axis;
+        }
+
+        if (line.find("data") != std::string::npos) {
+            OutputDataIOHelper::fillOutputData(result, input_stream);
+        }
+    }
+    return result;
+}
+
+
+OutputData<double>* OutputDataReadNumpyTXTStrategy::readOutputData(std::istream& input_stream)
+{
+    std::string line;
+    std::vector<std::vector<double>> data;
+
+    while( std::getline(input_stream, line) ) {
+        if(line.empty() || line[0] == '#')
+            continue;
+        std::vector<double> data_in_row = OutputDataIOHelper::parse_doubles(line);
+        data.push_back(data_in_row);
+    }
+    // validating
+    size_t nrows = data.size();
+    size_t ncols(0);
+    if(nrows) ncols = data[0].size();
+    for(size_t row=0; row<nrows; row++) {
+        if(data[row].size() != ncols)
+            throw std::runtime_error("OutputDataReadNumpyTXTStrategy::readOutputData() -> Error. "
+                                     "Number of elements is different from row to row.");
+    }
+    OutputData<double>* result = new OutputData<double>;
+    result->addAxis("x", ncols, 0.0, double(ncols));
+    result->addAxis("y", nrows, 0.0, double(nrows));
+    std::vector<int> axes_indices(2);
+    for(size_t row=0; row<nrows; row++) {
+        for(size_t col=0; col<ncols; col++) {
+            axes_indices[0] = col;
+            axes_indices[1] = nrows - 1 - row;
+            size_t global_index = result->toGlobalIndex(axes_indices);
+            (*result)[global_index] = data[row][col];
+        }
+    }
+    return result;
+}
+
+
+#ifdef BORNAGAIN_TIFF_SUPPORT
+
+OutputDataReadTiffStrategy::OutputDataReadTiffStrategy()
+    : m_d(new TiffHandler)
+{}
+
+OutputDataReadTiffStrategy::~OutputDataReadTiffStrategy()
+{
+    delete m_d;
+}
+
+OutputData<double>* OutputDataReadTiffStrategy::readOutputData(std::istream& input_stream)
+{
+    m_d->read(input_stream);
+    return m_d->getOutputData()->clone();
+}
+
+#endif // BORNAGAIN_TIFF_SUPPORT
diff --git a/Core/InputOutput/OutputDataReadStrategy.h b/Core/InputOutput/OutputDataReadStrategy.h
new file mode 100644
index 0000000..75fdf1c
--- /dev/null
+++ b/Core/InputOutput/OutputDataReadStrategy.h
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataReadStrategy.h
+//! @brief     Defines IOutputDataReadStrategy and related classes.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAREADSTRATEGY_H
+#define OUTPUTDATAREADSTRATEGY_H
+
+#include "WinDllMacros.h"
+#include <istream>
+
+template <class T> class OutputData;
+
+//! @class IOutputDataReadStrategy
+//! @ingroup input_output_internal
+//! @brief Interface for reading strategy of OutputData from file
+class BA_CORE_API_ IOutputDataReadStrategy
+{
+public:
+    virtual ~IOutputDataReadStrategy(){}
+    virtual OutputData<double>* readOutputData(std::istream& input_stream) = 0;
+};
+
+
+//! @class OutputDataReadINTStrategy
+//! @ingroup input_output_internal
+//! @brief Strategy to read BornAgain native IntensityData from ASCII file
+class OutputDataReadINTStrategy : public IOutputDataReadStrategy
+{
+public:
+    OutputData<double>* readOutputData(std::istream& input_stream);
+};
+
+//! @class OutputDataReadNumpyTXTStrategy
+//! @ingroup input_output_internal
+//! @brief Strategy to read OutputData from simple ASCII file with the layout as in numpy.savetxt
+class OutputDataReadNumpyTXTStrategy : public IOutputDataReadStrategy
+{
+public:
+    OutputData<double>* readOutputData(std::istream& input_stream);
+};
+
+
+#ifdef BORNAGAIN_TIFF_SUPPORT
+
+class TiffHandler;
+
+//! @class OutputDataReadTiffStrategy
+//! @ingroup input_output_internal
+//! @brief Reads tiff files
+
+class BA_CORE_API_ OutputDataReadTiffStrategy : public IOutputDataReadStrategy
+{
+public:
+    OutputDataReadTiffStrategy();
+    virtual ~OutputDataReadTiffStrategy();
+    virtual OutputData<double>* readOutputData(std::istream& input_stream);
+private:
+    TiffHandler *m_d;
+};
+#endif // BORNAGAIN_TIFF_SUPPORT
+
+#endif // OUTPUTDATAREADSTRATEGY_H
diff --git a/Core/InputOutput/OutputDataReader.cpp b/Core/InputOutput/OutputDataReader.cpp
new file mode 100644
index 0000000..10e25a0
--- /dev/null
+++ b/Core/InputOutput/OutputDataReader.cpp
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataReader.cpp
+//! @brief     Implements class OutputDataReader.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OutputDataReader.h"
+#include "OutputData.h"
+#include "OutputDataIOHelper.h"
+#include "boost_streams.h"
+#include <fstream>
+
+OutputDataReader::OutputDataReader(const std::string& file_name)
+    : m_file_name(file_name)
+{}
+
+OutputData<double>* OutputDataReader::getOutputData()
+{
+    if(!m_read_strategy)
+        throw Exceptions::NullPointerException(
+            "OutputDataReader::getOutputData() -> Error! No read strategy defined");
+
+    std::ifstream fin;
+    std::ios_base::openmode openmode = std::ios::in;
+    if (OutputDataIOHelper::isBinaryFile(m_file_name))
+        openmode = std::ios::in | std::ios_base::binary;
+
+    fin.open(m_file_name.c_str(), openmode );
+    if(!fin.is_open())
+        throw Exceptions::FileNotIsOpenException(
+            "OutputDataReader::getOutputData() -> Error. Can't open file '"
+            + m_file_name + "' for reading.");
+    if (!fin.good())
+        throw Exceptions::FileIsBadException(
+            "OutputDataReader::getOutputData() -> Error! "
+            "File is not good, probably it is a directory.");
+    OutputData<double>* result = getFromFilteredStream(fin);
+    fin.close();
+    return result;
+}
+
+void OutputDataReader::setStrategy(IOutputDataReadStrategy* read_strategy)
+{
+    m_read_strategy.reset(read_strategy);
+}
+
+OutputData<double>* OutputDataReader::getFromFilteredStream(std::istream& input_stream)
+{
+    boost::iostreams::filtering_streambuf<boost::iostreams::input> input_filtered;
+    if (OutputDataIOHelper::isGZipped(m_file_name))
+        input_filtered.push(boost::iostreams::gzip_decompressor());
+    else if (OutputDataIOHelper::isBZipped(m_file_name))
+        input_filtered.push(boost::iostreams::bzip2_decompressor());
+    input_filtered.push(input_stream);
+    // we use stringstream since it provides random access which is important for tiff files
+    std::stringstream strstream;
+    boost::iostreams::copy(input_filtered, strstream);
+    return m_read_strategy->readOutputData(strstream);
+}
diff --git a/Core/InputOutput/OutputDataReader.h b/Core/InputOutput/OutputDataReader.h
new file mode 100644
index 0000000..3705ff6
--- /dev/null
+++ b/Core/InputOutput/OutputDataReader.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataReader.h
+//! @brief     Defines class OutputDataReader.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAREADER_H
+#define OUTPUTDATAREADER_H
+
+#include "OutputDataReadStrategy.h"
+#include <memory>
+
+template <class T> class OutputData;
+
+//! @class OutputDataReader
+//! @ingroup input_output_internal
+//! @brief Reads OutputData from file using different reading strategies.
+
+class BA_CORE_API_ OutputDataReader
+{
+public:
+    OutputDataReader(const std::string& file_name);
+
+    //! read output data from file (file name was set already from OutputDataIOFactory)
+    OutputData<double>* getOutputData();
+
+    //! Sets concrete reading strategy
+    void setStrategy(IOutputDataReadStrategy* read_strategy);
+
+private:
+    OutputData<double>* getFromFilteredStream(std::istream& input_stream);
+    std::string m_file_name;
+    std::unique_ptr<IOutputDataReadStrategy> m_read_strategy;
+};
+
+#endif // OUTPUTDATAREADER_H
diff --git a/Core/InputOutput/OutputDataWriteFactory.cpp b/Core/InputOutput/OutputDataWriteFactory.cpp
new file mode 100644
index 0000000..8670446
--- /dev/null
+++ b/Core/InputOutput/OutputDataWriteFactory.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataWriteFactory.cpp
+//! @brief     Implements class OutputDataWriteFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+#include "OutputDataWriteFactory.h"
+#include "Exceptions.h"
+#include "OutputDataIOHelper.h"
+
+OutputDataWriter *OutputDataWriteFactory::getWriter(const std::string &file_name)
+{
+    OutputDataWriter *result = new OutputDataWriter(file_name);
+    result->setStrategy(getWriteStrategy(file_name));
+    return result;
+}
+
+
+IOutputDataWriteStrategy *OutputDataWriteFactory::getWriteStrategy(const std::string &file_name)
+{
+    IOutputDataWriteStrategy *result(0);
+    if(OutputDataIOHelper::isIntFile(file_name)) {
+        result = new OutputDataWriteINTStrategy();
+    }
+
+    else if(OutputDataIOHelper::isTxtFile(file_name)) {
+        result = new OutputDataWriteNumpyTXTStrategy();
+    }
+
+#ifdef BORNAGAIN_TIFF_SUPPORT
+    else if(OutputDataIOHelper::isTiffFile(file_name)) {
+        result = new OutputDataWriteTiffStrategy();
+    }
+#endif // BORNAGAIN_TIFF_SUPPORT
+
+    else {
+        throw Exceptions::LogicErrorException("OutputDataWriteFactory::getWriter() -> Error. "
+                "Don't know how to write file '" + file_name+std::string("'"));
+    }
+
+    return result;
+}
diff --git a/Core/InputOutput/OutputDataWriteFactory.h b/Core/InputOutput/OutputDataWriteFactory.h
new file mode 100644
index 0000000..ca9ad01
--- /dev/null
+++ b/Core/InputOutput/OutputDataWriteFactory.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataWriteFactory.h
+//! @brief     Defines class OutputDataWriteFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAWRITEFACTORY_H
+#define OUTPUTDATAWRITEFACTORY_H
+
+#include "OutputDataWriter.h"
+
+
+//! @class OutputDataWriteFactory
+//! @ingroup input_output_internal
+//! @brief Creates writer appropariate for given type of files
+
+class BA_CORE_API_ OutputDataWriteFactory
+{
+public:
+    static OutputDataWriter* getWriter(const std::string& file_name);
+
+private:
+    static IOutputDataWriteStrategy *getWriteStrategy(const std::string& file_name);
+};
+
+#endif // OUTPUTDATAWRITEFACTORY_H
diff --git a/Core/InputOutput/OutputDataWriteStrategy.cpp b/Core/InputOutput/OutputDataWriteStrategy.cpp
new file mode 100644
index 0000000..cc69157
--- /dev/null
+++ b/Core/InputOutput/OutputDataWriteStrategy.cpp
@@ -0,0 +1,113 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataWriteStrategy.cpp
+//! @brief     Implements class OutputDataWriteStrategy.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OutputDataWriteStrategy.h"
+#include "BornAgainNamespace.h"
+#include "OutputData.h" // needed by some compilers
+#include "TiffHandler.h"
+#include <cmath>
+#include <iomanip>
+
+static const int precision { 12 };
+
+double IgnoreDenormalized(double value)
+{
+    if (std::fpclassify(value)==FP_SUBNORMAL)
+        return 0.0;
+    return value;
+}
+
+void WriteOutputDataDoubles(const OutputData<double>& data, std::ostream& output_stream,
+                            size_t n_columns)
+{
+    OutputData<double>::const_iterator it = data.begin();
+    output_stream.imbue(std::locale::classic());
+    output_stream << std::scientific << std::setprecision(precision);
+    size_t ncol(0);
+    while(it != data.end()) {
+        ncol++;
+        double z_value = *it++;
+        output_stream << IgnoreDenormalized(z_value) << "    ";
+        if(ncol == n_columns) {
+            output_stream << std::endl;
+            ncol = 0;
+        }
+    }
+}
+
+void OutputDataWriteINTStrategy::writeOutputData(const OutputData<double>& data,
+                                               std::ostream& output_stream)
+{
+    output_stream << "# BornAgain Intensity Data\n\n";
+
+    output_stream << "# reproducibility\n" << data.getVariability() << "\n";
+
+    for(size_t i=0; i<data.getRank(); ++i) {
+        const IAxis &axis = data.getAxis(i);
+        output_stream << std::endl;
+        output_stream << "# axis-" << i << "\n";
+        output_stream << (axis) << "\n";
+    }
+    size_t n_columns = data.getAxis(data.getRank()-1).size();
+
+    output_stream << "\n# data\n";
+    WriteOutputDataDoubles(data, output_stream, n_columns);
+    output_stream << std::endl;
+}
+
+// ----------------------------------------------------------------------------
+
+void OutputDataWriteNumpyTXTStrategy::writeOutputData(const OutputData<double>& data,
+                                                      std::ostream& output_stream)
+{
+    if(data.getRank() != 2)
+        throw Exceptions::LogicErrorException(
+            "OutputDataWriteNumpyTXTStrategy::writeOutputData -> Error. "
+            "Only 2-dim arrays supported");
+
+    output_stream << "# BornAgain Intensity Data" << std::endl;
+    output_stream << "# Simple 2D array suitable for numpy, matlab etc." << std::endl;
+
+    size_t nrows = data.getAxis(BornAgain::Y_AXIS_INDEX).size();
+    size_t ncols = data.getAxis(BornAgain::X_AXIS_INDEX).size();
+
+    output_stream << "# [nrows=" << nrows
+                  << ", ncols=" << ncols << "]" << std::endl;
+
+    WriteOutputDataDoubles(data,output_stream, ncols);
+}
+
+// ----------------------------------------------------------------------------
+
+
+#ifdef BORNAGAIN_TIFF_SUPPORT
+
+OutputDataWriteTiffStrategy::OutputDataWriteTiffStrategy()
+    : m_d(new TiffHandler)
+{
+}
+
+OutputDataWriteTiffStrategy::~OutputDataWriteTiffStrategy()
+{
+    delete m_d;
+}
+
+void OutputDataWriteTiffStrategy::writeOutputData(const OutputData<double>& data,
+                                                  std::ostream& output_stream)
+{
+    m_d->write(data, output_stream);
+}
+
+#endif
diff --git a/Core/InputOutput/OutputDataWriteStrategy.h b/Core/InputOutput/OutputDataWriteStrategy.h
new file mode 100644
index 0000000..83b089b
--- /dev/null
+++ b/Core/InputOutput/OutputDataWriteStrategy.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataWriteStrategy.h
+//! @brief     Defines classes IOutputDataWriteStrategy and OutputDataWriteStreamIMA.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAWRITESTRATEGY_H
+#define OUTPUTDATAWRITESTRATEGY_H
+
+#include "WinDllMacros.h"
+#include <istream>
+
+template <class T> class OutputData;
+
+//! @class IOutputDataWriteStrategy
+//! @ingroup input_output_internal
+//! @brief Strategy interface to write OututData in file
+
+class BA_CORE_API_ IOutputDataWriteStrategy
+{
+public:
+    IOutputDataWriteStrategy() {}
+    virtual ~IOutputDataWriteStrategy(){}
+
+    virtual void writeOutputData(const OutputData<double>& data, std::ostream& output_stream) = 0;
+};
+
+//! @class OutputDataWriteINTStrategy
+//! @ingroup input_output_internal
+//! @brief Strategy to write OutputData to special BornAgain ASCII format
+class OutputDataWriteINTStrategy : public IOutputDataWriteStrategy
+{
+public:
+    virtual void writeOutputData(const OutputData<double>& data, std::ostream& output_stream);
+};
+
+//! @class OutputDataWriteNumpyTXTStrategy
+//! @ingroup input_output_internal
+//! @brief Strategy to write OutputData to simple ASCII file with the layout as in numpy.savetxt
+class OutputDataWriteNumpyTXTStrategy : public IOutputDataWriteStrategy
+{
+public:
+    virtual void writeOutputData(const OutputData<double>& data, std::ostream& output_stream);
+};
+
+#ifdef BORNAGAIN_TIFF_SUPPORT
+
+class TiffHandler;
+
+//! @class OutputDataWriteTiffStrategy
+//! @ingroup input_output_internal
+//! @brief Strategy to write OutputData to tiff files
+class OutputDataWriteTiffStrategy : public IOutputDataWriteStrategy
+{
+public:
+    OutputDataWriteTiffStrategy();
+    virtual ~OutputDataWriteTiffStrategy();
+    virtual void writeOutputData(const OutputData<double>& data, std::ostream& output_stream);
+private:
+    TiffHandler* m_d;
+};
+
+#endif // BORNAGAIN_TIFF_SUPPORT
+
+#endif // OUTPUTDATAWRITESTRATEGY_H
diff --git a/Core/InputOutput/OutputDataWriter.cpp b/Core/InputOutput/OutputDataWriter.cpp
new file mode 100644
index 0000000..004d9c5
--- /dev/null
+++ b/Core/InputOutput/OutputDataWriter.cpp
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataWriter.cpp
+//! @brief     Implements class OutputDataWriter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OutputDataWriter.h"
+#include "OutputData.h"
+#include "OutputDataIOHelper.h"
+#include "boost_streams.h"
+#include <fstream>
+
+OutputDataWriter::OutputDataWriter(const std::string& file_name)
+    : m_file_name(file_name)
+{
+}
+
+void OutputDataWriter::writeOutputData(const OutputData<double>& data)
+{
+    if(!m_write_strategy)
+        throw Exceptions::NullPointerException("OutputDataWriter::getOutputData() ->"
+                                               " Error! No read strategy defined");
+    std::ofstream fout;
+    std::ios_base::openmode openmode = std::ios::out;
+    if(OutputDataIOHelper::isBinaryFile(m_file_name))
+        openmode = std::ios::out | std::ios_base::binary;
+
+    fout.open(m_file_name.c_str(), openmode );
+    if(!fout.is_open())
+        throw Exceptions::FileNotIsOpenException("OutputDataWriter::writeOutputData() -> Error. "
+                                                 "Can't open file '"+m_file_name+"' for writing.");
+    if (!fout.good())
+        throw Exceptions::FileIsBadException("OutputDataReader::writeOutputData() -> Error! "
+                                             "File is not good, probably it is a directory.");
+    std::stringstream ss;
+    m_write_strategy->writeOutputData(data, ss);
+
+    boost::iostreams::filtering_streambuf<boost::iostreams::input> input_filtered;
+    if(OutputDataIOHelper::isGZipped(m_file_name))
+        input_filtered.push(boost::iostreams::gzip_compressor());
+    else if(OutputDataIOHelper::isBZipped(m_file_name))
+        input_filtered.push(boost::iostreams::bzip2_compressor());
+    input_filtered.push(ss);
+
+    boost::iostreams::copy(input_filtered, fout);
+
+    fout.close();
+}
+
+
+void OutputDataWriter::setStrategy(IOutputDataWriteStrategy* write_strategy)
+{
+    m_write_strategy.reset(write_strategy);
+}
diff --git a/Core/InputOutput/OutputDataWriter.h b/Core/InputOutput/OutputDataWriter.h
new file mode 100644
index 0000000..f9d74ea
--- /dev/null
+++ b/Core/InputOutput/OutputDataWriter.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/OutputDataWriter.h
+//! @brief     Defines class OutputDataWriter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAWRITER_H
+#define OUTPUTDATAWRITER_H
+
+#include "OutputDataWriteStrategy.h"
+#include <memory>
+
+template <class T> class OutputData;
+
+//! @class OutputDataWriter
+//! @ingroup input_output_internal
+//! @brief Write OutputData to file using different witing strategies
+class BA_CORE_API_ OutputDataWriter
+{
+public:
+    OutputDataWriter(const std::string& file_name);
+
+    //! write output data to file
+    void writeOutputData(const OutputData<double>& data);
+
+    //! Sets concrete writing strategy
+    void setStrategy(IOutputDataWriteStrategy* write_strategy);
+
+private:
+    std::string m_file_name;
+    std::unique_ptr<IOutputDataWriteStrategy> m_write_strategy;
+};
+
+#endif // OUTPUTDATAWRITER_H
diff --git a/Core/InputOutput/TiffHandler.cpp b/Core/InputOutput/TiffHandler.cpp
new file mode 100644
index 0000000..91b835f
--- /dev/null
+++ b/Core/InputOutput/TiffHandler.cpp
@@ -0,0 +1,210 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/TiffHandler.cpp
+//! @brief     Implements class TiffReadStrategy.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifdef BORNAGAIN_TIFF_SUPPORT
+
+#include "TiffHandler.h"
+#include "BornAgainNamespace.h"
+#include "Utils.h"
+
+namespace {
+size_t supported_bitPerSample = 32;
+size_t supported_samplesPerPixel = 1;
+size_t size_of_int = 4;
+}
+
+TiffHandler::TiffHandler()
+    : m_tiff(0)
+    , m_width(0)
+    , m_height(0)
+{
+}
+
+TiffHandler::~TiffHandler()
+{
+    close();
+}
+
+void TiffHandler::read(std::istream &input_stream)
+{
+    m_tiff = TIFFStreamOpen("MemTIFF", &input_stream);
+    if(!m_tiff) {
+        throw Exceptions::FormatErrorException("TiffHandler::read() -> Can't open the file.");
+    }
+    read_header();
+    read_data();
+    close();
+}
+
+const OutputData<double> *TiffHandler::getOutputData() const
+{
+    return m_data.get();
+}
+
+void TiffHandler::write(const OutputData<double> &data, std::ostream &output_stream)
+{
+    m_tiff = TIFFStreamOpen("MemTIFF", &output_stream);
+    m_data.reset(data.clone());
+    m_width = m_data->getAxis(BornAgain::X_AXIS_INDEX).size();
+    m_height = m_data->getAxis(BornAgain::Y_AXIS_INDEX).size();
+    write_header();
+    write_data();
+    close();
+}
+
+void TiffHandler::read_header()
+{
+    assert(m_tiff);
+    uint32 width(0);
+    uint32 height(0);
+    uint16 photometric(0);
+    if (!TIFFGetField(m_tiff, TIFFTAG_IMAGEWIDTH, &width)
+        || !TIFFGetField(m_tiff, TIFFTAG_IMAGELENGTH, &height)
+        || !TIFFGetField(m_tiff, TIFFTAG_PHOTOMETRIC, &photometric)) {
+        throw Exceptions::FormatErrorException("TiffHandler::read_header() -> Error. "
+                                               "Can't read width/height/photometric info.");
+    }
+
+    m_width = (size_t) width;
+    m_height = (size_t) height;
+
+    uint16 orientationTag(0);
+    TIFFGetField(m_tiff, TIFFTAG_ORIENTATION, &orientationTag);
+
+    // BitsPerSample defaults to 1 according to the TIFF spec.
+    uint16 bitPerSample(0);
+    if (!TIFFGetField(m_tiff, TIFFTAG_BITSPERSAMPLE, &bitPerSample))
+        bitPerSample = 1;
+    uint16 samplesPerPixel(0); // they may be e.g. grayscale with 2 samples per pixel
+    if (!TIFFGetField(m_tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel))
+        samplesPerPixel = 1;
+
+    if(bitPerSample!= supported_bitPerSample ||
+            samplesPerPixel != supported_samplesPerPixel) {
+        std::ostringstream message;
+        message << "TiffHandler::read_header() -> Error. "
+                << "Can't read tiff image with following parameters:" << std::endl
+                << "    TIFFTAG_PHOTOMETRIC: " << photometric << std::endl
+                << "    TIFFTAG_BITSPERSAMPLE: " << bitPerSample << std::endl
+                << "    TIFFTAG_SAMPLESPERPIXEL: " << samplesPerPixel << std::endl;
+        throw Exceptions::FormatErrorException(message.str());
+    }
+
+}
+
+void TiffHandler::read_data()
+{
+    assert(m_tiff);
+
+    tmsize_t buf_size = TIFFScanlineSize(m_tiff);
+    tmsize_t expected_size = size_of_int*m_width;
+    if(buf_size != expected_size)
+        throw Exceptions::FormatErrorException(
+            "TiffHandler::read_data() -> Error. Wrong scanline size.");
+    tdata_t buf = _TIFFmalloc(buf_size);
+    if(!buf)
+        throw Exceptions::FormatErrorException(
+            "TiffHandler::read_data() -> Error. Can't allocate buffer.");
+
+    create_output_data();
+
+    std::vector<int> line_buf;
+    line_buf.resize(m_width, 0);
+    std::vector<int> axes_indices(2);
+    for (uint32 row = 0; row < (uint32) m_height; row++) {
+        if(TIFFReadScanline(m_tiff, buf, row) < 0)
+            throw Exceptions::FormatErrorException(
+                "TiffHandler::read_data() -> Error. Error in scanline.");
+        memcpy(&line_buf[0], buf, buf_size);
+        for(size_t col=0; col<line_buf.size(); ++col) {
+//            std::cout << "row:" << row << " col:" << col << " " << line_buf[col] << std::endl;
+            axes_indices[0] = col;
+            axes_indices[1] = m_height - 1 - row;
+            size_t global_index = m_data->toGlobalIndex(axes_indices);
+            (*m_data)[global_index] = (double)line_buf[col];
+        }
+    }
+    _TIFFfree(buf);
+}
+
+void TiffHandler::write_header()
+{
+    assert(m_tiff);
+    TIFFSetField(m_tiff, TIFFTAG_ARTIST, "BornAgain.IOFactory");
+    TIFFSetField(m_tiff, TIFFTAG_DATETIME, Utils::System::getCurrentDateAndTime().c_str());
+    TIFFSetField(m_tiff, TIFFTAG_IMAGEDESCRIPTION,
+           "Image converted from BornAgain intensity file.");
+    TIFFSetField(m_tiff, TIFFTAG_SOFTWARE, "BornAgain");
+
+    uint32 width = m_width;
+    uint32 height = m_height;
+    TIFFSetField(m_tiff, TIFFTAG_IMAGEWIDTH, width);
+    TIFFSetField(m_tiff, TIFFTAG_IMAGELENGTH, height);
+
+    uint16 bitPerSample(supported_bitPerSample);
+    uint16 samplesPerPixel(supported_samplesPerPixel);
+    TIFFSetField(m_tiff, TIFFTAG_BITSPERSAMPLE, bitPerSample);
+    TIFFSetField(m_tiff, TIFFTAG_SAMPLESPERPIXEL, samplesPerPixel);
+
+    TIFFSetField(m_tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
+}
+
+void TiffHandler::write_data()
+{
+    tmsize_t buf_size = size_of_int*m_width;;
+    tdata_t buf = _TIFFmalloc(buf_size);
+    if(!buf)
+        throw Exceptions::FormatErrorException(
+            "TiffHandler::write_data() -> Error. Can't allocate buffer.");
+
+    std::vector<int> line_buf;
+    line_buf.resize(m_width, 0);
+    std::vector<int> axes_indices(2);
+    for (uint32 row = 0; row < (uint32) m_height; row++) {
+        for(size_t col=0; col<line_buf.size(); ++col) {
+            axes_indices[0] = col;
+            axes_indices[1] = m_height - 1 - row;
+            size_t global_index = m_data->toGlobalIndex(axes_indices);
+            line_buf[col] = static_cast<int>((*m_data)[global_index]);
+        }
+        memcpy(buf, &line_buf[0], buf_size);
+
+        if(TIFFWriteScanline(m_tiff, buf, row) < 0)
+            throw Exceptions::FormatErrorException(
+                "TiffHandler::write_data() -> Error. Error in TIFFWriteScanline.");
+    }
+    _TIFFfree(buf);
+    TIFFFlush(m_tiff);
+}
+
+void TiffHandler::close()
+{
+    if(m_tiff) {
+        TIFFClose(m_tiff);
+        m_tiff = 0;
+        m_width = 0;
+        m_height = 0;
+    }
+}
+
+void TiffHandler::create_output_data()
+{
+    assert(m_tiff);
+    m_data.reset(new OutputData<double>);
+    m_data->addAxis("x", m_width, 0.0, double(m_width));
+    m_data->addAxis("y", m_height, 0.0, double(m_height));
+}
+
+#endif // BORNAGAIN_TIFF_SUPPORT
diff --git a/Core/InputOutput/TiffHandler.h b/Core/InputOutput/TiffHandler.h
new file mode 100644
index 0000000..5ce4a6b
--- /dev/null
+++ b/Core/InputOutput/TiffHandler.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/TiffHandler.h
+//! @brief     Defines class TiffHandler.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TIFFHANDLER_H
+#define TIFFHANDLER_H
+
+#ifdef BORNAGAIN_TIFF_SUPPORT
+
+#include "OutputData.h"
+#include <tiffio.h>
+#include <tiffio.hxx>
+#include <memory>
+
+//! @class TiffHandler
+//! @ingroup input_output_internal
+//! @brief Reads/write tiff files, should be used through TiffReadStrategy
+
+class BA_CORE_API_ TiffHandler
+{
+public:
+    TiffHandler();
+    ~TiffHandler();
+
+    void read(std::istream& input_stream);
+
+    const OutputData<double>* getOutputData() const;
+
+    void write(const OutputData<double>& data, std::ostream& output_stream);
+
+private:
+    void read_header();
+    void read_data();
+    void write_header();
+    void write_data();
+    void close();
+    void create_output_data();
+
+    TIFF* m_tiff;
+    size_t m_width;
+    size_t m_height;
+    std::unique_ptr<OutputData<double>> m_data;
+};
+
+#endif // BORNAGAIN_TIFF_SUPPORT
+
+#endif // TIFFHANDLER_H
diff --git a/Core/InputOutput/boost_streams.h b/Core/InputOutput/boost_streams.h
new file mode 100644
index 0000000..5251e4a
--- /dev/null
+++ b/Core/InputOutput/boost_streams.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/InputOutput/boost_streams.h
+//! @brief     Contains boost streams related headers
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BOOST_STREAMS_H
+#define BOOST_STREAMS_H
+
+#include "Macros.h"
+GCC_DIAG_OFF(unused-parameter)
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/copy.hpp>
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4244)
+#endif
+#include <boost/iostreams/filter/gzip.hpp>
+#include <boost/iostreams/filter/bzip2.hpp>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+GCC_DIAG_ON(unused-parameter)
+
+#endif // BOOST_STREAMS_H
+
diff --git a/Core/Instrument/Beam.cpp b/Core/Instrument/Beam.cpp
new file mode 100644
index 0000000..b247418
--- /dev/null
+++ b/Core/Instrument/Beam.cpp
@@ -0,0 +1,113 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Beam.cpp
+//! @brief     Implements class Beam.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Beam.h"
+#include "BornAgainNamespace.h"
+#include "Complex.h"
+#include "Exceptions.h"
+#include "RealParameter.h"
+#include "MathConstants.h"
+
+Beam::Beam() : m_wavelength(1.0), m_alpha(0.0), m_phi(0.0), m_intensity(0.0)
+{
+    setName(BornAgain::BeamType);
+    init_parameters();
+    initPolarization();
+}
+
+Beam::Beam(const Beam& other)
+    : IParameterized(), m_wavelength(other.m_wavelength), m_alpha(other.m_alpha),
+      m_phi(other.m_phi), m_intensity(other.m_intensity), m_polarization(other.m_polarization)
+{
+    setName(other.getName());
+    init_parameters();
+}
+
+void Beam::init_parameters()
+{
+    registerParameter(BornAgain::Intensity, &m_intensity).setNonnegative();
+    registerParameter(BornAgain::Wavelength, &m_wavelength).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Inclination, &m_alpha).setUnit("rad").setLimited(0, M_PI_2);
+    registerParameter(BornAgain::Azimuth,   &m_phi  ).setUnit("rad").setLimited(-M_PI_2, M_PI_2);
+}
+
+Beam &Beam::operator=(const Beam &other)
+{
+    if (this != &other) {
+        Beam tmp(other);
+        tmp.swapContent(*this);
+    }
+    return *this;
+}
+
+kvector_t Beam::getCentralK() const
+{
+    return vecOfLambdaAlphaPhi(m_wavelength, -m_alpha, m_phi);
+}
+
+void Beam::setCentralK(double wavelength, double alpha_i, double phi_i)
+{
+    if (wavelength <= 0.0)
+        throw Exceptions::ClassInitializationException(
+            "Beam::setCentralK() -> Error. Wavelength can't be negative or zero.");
+    if (alpha_i < 0.0)
+        throw Exceptions::ClassInitializationException(
+            "Beam::setCentralK() -> Error. Inclination angle alpha_i can't be negative.");
+    m_wavelength = wavelength;
+    m_alpha = alpha_i;
+    m_phi = phi_i;
+}
+
+void Beam::setPolarization(const kvector_t bloch_vector)
+{
+    if (bloch_vector.mag() > 1.0)
+        throw Exceptions::ClassInitializationException(
+            "Beam::setPolarization: "
+            "The given Bloch vector cannot represent a real physical ensemble");
+    m_polarization = calculatePolarization(bloch_vector);
+}
+
+Eigen::Matrix2cd Beam::calculatePolarization(const kvector_t bloch_vector) const
+{
+    Eigen::Matrix2cd result;
+    double x = bloch_vector.x();
+    double y = bloch_vector.y();
+    double z = bloch_vector.z();
+    result(0, 0) = (1.0 + z) / 2.0;
+    result(0, 1) = complex_t(x, -y) / 2.0;
+    result(1, 0) = complex_t(x,  y) / 2.0;
+    result(1, 1) = (1.0 - z) / 2.0;
+    return result;
+}
+
+void Beam::swapContent(Beam& other)
+{
+    std::swap(m_wavelength, other.m_wavelength);
+    std::swap(m_alpha, other.m_alpha);
+    std::swap(m_phi, other.m_phi);
+    std::swap(m_intensity, other.m_intensity);
+    std::swap(m_polarization, other.m_polarization);
+}
+
+void Beam::initPolarization()
+{
+    kvector_t zero;
+    setPolarization(zero);
+}
+
+void Beam::print(std::ostream& ostr) const
+{
+    ostr << "Beam: '" << getName() << "' " << getParameterPool();
+}
diff --git a/Core/Instrument/Beam.h b/Core/Instrument/Beam.h
new file mode 100644
index 0000000..dcd52fb
--- /dev/null
+++ b/Core/Instrument/Beam.h
@@ -0,0 +1,81 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Beam.h
+//! @brief     Defines class Beam.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BEAM_H
+#define BEAM_H
+
+#include "IParameterized.h"
+#include "EigenCore.h"
+#include "Vectors3D.h"
+
+//! Ideal collimated beam defined by wavelength, direction and intensity.
+//! @ingroup simulation
+
+class BA_CORE_API_ Beam : public IParameterized
+{
+public:
+    Beam();
+    Beam(const Beam& other);
+    Beam& operator=(const Beam& other);
+
+    virtual ~Beam() {}
+
+    //! Returns the wavevector
+    kvector_t getCentralK() const;
+
+    //! Sets the wavevector in terms of wavelength and incoming angles
+    void setCentralK(double wavelength, double alpha_i, double phi_i);
+
+    //! Returns the beam intensity in neutrons/sec
+    double getIntensity() const { return m_intensity; }
+
+    //! Sets the beam intensity in neutrons/sec
+    void setIntensity(double intensity) { m_intensity = intensity; }
+
+    //! Sets the polarization density matrix according to the given Bloch vector
+    void setPolarization(const kvector_t bloch_vector);
+
+#ifndef SWIG
+    //! Returns the polarization density matrix (in spin basis along z-axis)
+    Eigen::Matrix2cd getPolarization() const  { return m_polarization; }
+#endif
+
+    double getWavelength() const { return m_wavelength; }
+    double getAlpha() const { return m_alpha; }
+    double getPhi() const { return m_phi; }
+
+protected:
+    virtual void print(std::ostream& ostr) const;
+
+private:
+    void init_parameters();
+
+    void swapContent(Beam& other);
+
+    //! Initializes polarization (for constructors).
+    void initPolarization();
+
+#ifndef SWIG
+    Eigen::Matrix2cd calculatePolarization(const kvector_t bloch_vector) const;
+#endif
+
+    double m_wavelength, m_alpha, m_phi; //!< wavelength and angles of beam
+    double m_intensity;                  //!< beam intensity (neutrons/sec)
+#ifndef SWIG
+    Eigen::Matrix2cd m_polarization;     //!< polarization density matrix
+#endif
+};
+
+#endif // BEAM_H
diff --git a/Core/Instrument/ChiSquaredModule.cpp b/Core/Instrument/ChiSquaredModule.cpp
new file mode 100644
index 0000000..6636d90
--- /dev/null
+++ b/Core/Instrument/ChiSquaredModule.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/ChiSquaredModule.cpp
+//! @brief     Implements class ChiSquaredModule.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ChiSquaredModule.h"
+#include <cassert>
+
+void ChiSquaredModule::processFitElements(std::vector<FitElement>::iterator first,
+                                          std::vector<FitElement>::iterator last)
+{
+    assert(mp_squared_function);
+
+    for (std::vector<FitElement>::iterator it = first; it != last; ++it) {
+        double value_simu = it->getSimulValue();
+        double value_real = it->getRealValue();
+        double weight = it->getWeight();
+
+        if(mp_intensity_function) {
+            value_simu = mp_intensity_function->evaluate(value_simu);
+            value_real = mp_intensity_function->evaluate(value_real);
+        }
+
+        double squared_difference =
+            mp_squared_function->calculateSquaredDifference(
+                value_real, value_simu)*weight;
+
+        it->setSquaredDifference(squared_difference);
+
+        double squared_error = mp_squared_function->calculateSquaredError(value_real, value_simu);
+        double residual = std::sqrt(weight)*(value_simu - value_real)/std::sqrt(squared_error);
+
+        it->setResidual(residual);
+    }
+}
diff --git a/Core/Instrument/ChiSquaredModule.h b/Core/Instrument/ChiSquaredModule.h
new file mode 100644
index 0000000..e34633c
--- /dev/null
+++ b/Core/Instrument/ChiSquaredModule.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/ChiSquaredModule.h
+//! @brief     Defines class ChiSquaredModule.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CHISQUAREDMODULE_H
+#define CHISQUAREDMODULE_H
+
+#include "IChiSquaredModule.h"
+
+//! Calculation of chi2 between two data sets.
+//! @ingroup fitting
+
+class BA_CORE_API_ ChiSquaredModule : public IChiSquaredModule
+{
+public:
+    ChiSquaredModule() {}
+    ChiSquaredModule(const ChiSquaredModule& other)
+        : IChiSquaredModule(other) {}
+    virtual ~ChiSquaredModule() {}
+
+    virtual ChiSquaredModule *clone() const { return new ChiSquaredModule(*this); }
+
+    virtual void processFitElements(std::vector<FitElement>::iterator first,
+                                    std::vector<FitElement>::iterator last);
+};
+
+#endif // CHISQUAREDMODULE_H
diff --git a/Core/Instrument/ConvolutionDetectorResolution.cpp b/Core/Instrument/ConvolutionDetectorResolution.cpp
new file mode 100644
index 0000000..48c890d
--- /dev/null
+++ b/Core/Instrument/ConvolutionDetectorResolution.cpp
@@ -0,0 +1,235 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/ConvolutionDetectorResolution.cpp
+//! @brief     Implements class ConvolutionDetectorResolution.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ConvolutionDetectorResolution.h"
+#include "Convolve.h"
+
+
+ConvolutionDetectorResolution::ConvolutionDetectorResolution(
+        cumulative_DF_1d res_function_1d)
+: m_dimension(1)
+, m_res_function_1d(res_function_1d)
+, mp_res_function_2d(0)
+{
+    setName("ConvolutionDetectorResolution");
+}
+
+ConvolutionDetectorResolution::ConvolutionDetectorResolution(
+        IResolutionFunction2D *p_res_function_2d)
+: m_dimension(2)
+, m_res_function_1d(0)
+, mp_res_function_2d(p_res_function_2d)
+{
+    setName("ConvolutionDetectorResolution");
+}
+
+ConvolutionDetectorResolution::ConvolutionDetectorResolution(
+        const IResolutionFunction2D &p_res_function_2d)
+: m_dimension(2)
+, m_res_function_1d(0)
+, mp_res_function_2d(p_res_function_2d.clone())
+{
+    setName("ConvolutionDetectorResolution");
+}
+
+
+ConvolutionDetectorResolution::~ConvolutionDetectorResolution()
+{
+    delete mp_res_function_2d;
+}
+
+ConvolutionDetectorResolution::ConvolutionDetectorResolution(
+    const ConvolutionDetectorResolution& other) : IDetectorResolution()
+//    : IDetectorResolution(other)
+{
+    m_dimension = other.m_dimension;
+    m_res_function_1d=other.m_res_function_1d;
+    mp_res_function_2d = other.mp_res_function_2d->clone();
+    setName(other.getName());
+
+}
+
+//! clone object
+ConvolutionDetectorResolution *ConvolutionDetectorResolution::clone() const
+{
+    return new ConvolutionDetectorResolution(*this);
+}
+
+void ConvolutionDetectorResolution::applyDetectorResolution(
+        OutputData<double>* p_intensity_map) const
+{
+    if (p_intensity_map->getRank() != m_dimension) {
+        throw Exceptions::RuntimeErrorException(
+            "ConvolutionDetectorResolution::applyDetectorResolution() -> Error! "
+            "Intensity map must have same dimension as detector resolution function." );
+    }
+    switch (m_dimension) {
+    case 1:
+        apply1dConvolution(p_intensity_map);
+        break;
+    case 2:
+        apply2dConvolution(p_intensity_map);
+        break;
+    default:
+        throw Exceptions::LogicErrorException(
+            "ConvolutionDetectorResolution::applyDetectorResolution() -> Error! "
+            "Class ConvolutionDetectorResolution must be initialized with dimension 1 or 2." );
+    }
+}
+
+std::string ConvolutionDetectorResolution::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path =
+        IParameterized::addParametersToExternalPool(path, external_pool, copy_number);
+
+    // add parameters of the 2D resolution function
+    if (mp_res_function_2d)
+        mp_res_function_2d->addParametersToExternalPool(new_path, external_pool, -1);
+
+    return new_path;
+}
+
+void ConvolutionDetectorResolution::init_parameters()
+{
+}
+
+void ConvolutionDetectorResolution::apply1dConvolution(OutputData<double>* p_intensity_map) const
+{
+    if (m_res_function_1d==0)
+        throw Exceptions::LogicErrorException(
+            "ConvolutionDetectorResolution::apply1dConvolution() -> Error! "
+            "No 1d resolution function present for convolution of 1d data." );
+    if (p_intensity_map->getRank() != 1)
+        throw Exceptions::LogicErrorException(
+            "ConvolutionDetectorResolution::apply1dConvolution() -> Error! "
+            "Number of axes for intensity map does not correspond to the dimension of the map." );
+    const IAxis &axis = p_intensity_map->getAxis(0);
+    // Construct source vector from original intensity map
+    std::vector<double> source_vector = p_intensity_map->getRawDataVector();
+    size_t data_size = source_vector.size();
+    if (data_size < 2)
+        return; // No convolution for sets of zero or one element
+    // Construct kernel vector from resolution function
+    if (axis.size() != data_size)
+        throw Exceptions::LogicErrorException(
+            "ConvolutionDetectorResolution::apply1dConvolution() -> Error! "
+            "Size of axis for intensity map does not correspond to size of data in the map." );
+    double step_size = std::abs(axis[0]-axis[axis.size()-1])/(data_size-1);
+    double mid_value = axis[axis.size()/2]; // because Convolve expects zero at midpoint
+    std::vector<double> kernel;
+    for (size_t index=0; index<data_size; ++index) {
+        kernel.push_back(getIntegratedPDF1d(axis[index] - mid_value, step_size));
+    }
+    // Calculate convolution
+    std::vector<double> result;
+    MathFunctions::Convolve cv;
+    cv.fftconvolve(source_vector, kernel, result);
+    // Truncate negative values that can arise because of finite precision of Fourier Transform
+    std::for_each(result.begin(), result.end(), [](double &val){ val = std::max(0.0, val); });
+    // Populate intensity map with results
+    p_intensity_map->setRawDataVector(result);
+}
+
+void ConvolutionDetectorResolution::apply2dConvolution(OutputData<double>* p_intensity_map) const
+{
+    if (mp_res_function_2d==0)
+        throw Exceptions::LogicErrorException(
+            "ConvolutionDetectorResolution::apply2dConvolution() -> Error! "
+            "No 2d resolution function present for convolution of 2d data." );
+    if (p_intensity_map->getRank() != 2)
+        throw Exceptions::LogicErrorException(
+            "ConvolutionDetectorResolution::apply2dConvolution() -> Error! "
+            "Number of axes for intensity map does not correspond to the dimension of the map." );
+    const IAxis &axis_1 = p_intensity_map->getAxis(0);
+    const IAxis &axis_2 = p_intensity_map->getAxis(1);
+    size_t axis_size_1 = axis_1.size();
+    size_t axis_size_2 = axis_2.size();
+    if (axis_size_1 < 2 || axis_size_2 < 2)
+        return; // No 2d convolution for 1d data
+    // Construct source vector array from original intensity map
+    std::vector<double> raw_source_vector = p_intensity_map->getRawDataVector();
+    std::vector<std::vector<double> > source;
+    size_t raw_data_size = raw_source_vector.size();
+    if (raw_data_size != axis_size_1*axis_size_2)
+        throw Exceptions::LogicErrorException(
+            "ConvolutionDetectorResolution::apply2dConvolution() -> Error! "
+            "Intensity map data size does not match the product of its axes' sizes" );
+    for (auto it=raw_source_vector.begin(); it != raw_source_vector.end();it+=axis_size_2) {
+        std::vector<double> row_vector(it, it+axis_size_2);
+        source.push_back(row_vector);
+    }
+    // Construct kernel vector from resolution function
+    std::vector<std::vector<double> > kernel;
+    kernel.resize(axis_size_1);
+    double mid_value_1 = axis_1[axis_size_1/2]; // because Convolve expects zero at midpoint
+    double mid_value_2 = axis_2[axis_size_2/2]; // because Convolve expects zero at midpoint
+    double step_size_1 = std::abs(axis_1[0]-axis_1[axis_size_1-1])/(axis_size_1-1);
+    double step_size_2 = std::abs(axis_2[0]-axis_2[axis_size_2-1])/(axis_size_2-1);
+    for (size_t index_1=0; index_1<axis_size_1; ++index_1) {
+        double value_1 = axis_1[index_1]-mid_value_1;
+        std::vector<double> row_vector;
+        row_vector.resize(axis_size_2, 0.0);
+        for (size_t index_2=0; index_2<axis_size_2;++index_2) {
+            double value_2 = axis_2[index_2]-mid_value_2;
+            double z_value = getIntegratedPDF2d(value_1, step_size_1, value_2, step_size_2);
+            row_vector[index_2] = z_value;
+        }
+        kernel[index_1] = row_vector;
+    }
+    // Calculate convolution
+    std::vector<std::vector<double> > result;
+    MathFunctions::Convolve cv;
+    cv.fftconvolve(source, kernel, result);
+    // Populate intensity map with results
+    std::vector<double> result_vector;
+    for (size_t index_1=0; index_1<axis_size_1; ++index_1) {
+        for (size_t index_2=0; index_2<axis_size_2;++index_2) {
+            double value = result[index_1][index_2];
+            result_vector.push_back(value);
+        }
+    }
+    // Truncate negative values that can arise because of finite precision of Fourier Transform
+    std::for_each(result_vector.begin(), result_vector.end(),
+                  [](double &val){ val = std::max(0.0, val); });
+    for(auto it=p_intensity_map->begin(); it!=p_intensity_map->end(); ++it)
+        (*it) = result_vector[it.getIndex()];
+}
+
+double ConvolutionDetectorResolution::getIntegratedPDF1d(double x, double step) const
+{
+    double halfstep = step/2.0;
+    double xmin = x - halfstep;
+    double xmax = x + halfstep;
+    assert(m_res_function_1d != nullptr);
+    return m_res_function_1d(xmax) - m_res_function_1d(xmin);
+}
+
+double ConvolutionDetectorResolution::getIntegratedPDF2d(
+    double x, double step_x, double y, double step_y) const
+{
+    double halfstepx = step_x/2.0;
+    double halfstepy = step_y/2.0;
+    double xmin = x - halfstepx;
+    double xmax = x + halfstepx;
+    double ymin = y - halfstepy;
+    double ymax = y + halfstepy;
+    double result = mp_res_function_2d->evaluateCDF(xmax, ymax) -
+        mp_res_function_2d->evaluateCDF(xmax, ymin) -
+        mp_res_function_2d->evaluateCDF(xmin, ymax) +
+        mp_res_function_2d->evaluateCDF(xmin, ymin);
+    return result;
+}
diff --git a/Core/Instrument/ConvolutionDetectorResolution.h b/Core/Instrument/ConvolutionDetectorResolution.h
new file mode 100644
index 0000000..3ad6a1c
--- /dev/null
+++ b/Core/Instrument/ConvolutionDetectorResolution.h
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/ConvolutionDetectorResolution.h
+//! @brief     Defines class ConvolutionDetectorResolution.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CONVOLUTIONDETECTORRESOLUTION_H
+#define CONVOLUTIONDETECTORRESOLUTION_H
+
+#include "IDetectorResolution.h"
+#include "IResolutionFunction2D.h"
+
+//! Convolutes the intensity in 1 or 2 dimensions with a resolution function.
+//! @ingroup simulation
+
+//! Limitation: this class assumes that the data points are evenly distributed on each axis
+
+class BA_CORE_API_ ConvolutionDetectorResolution : public IDetectorResolution
+{
+public:
+    typedef double (*cumulative_DF_1d)(double);
+
+    //! Constructor taking a 1 dimensional resolution function as argument.
+    ConvolutionDetectorResolution(cumulative_DF_1d res_function_1d);
+
+    //! Constructor taking a 2 dimensional resolution function as argument.
+    ConvolutionDetectorResolution(IResolutionFunction2D *p_res_function_2d);
+    ConvolutionDetectorResolution(const IResolutionFunction2D &p_res_function_2d);
+
+    virtual ~ConvolutionDetectorResolution();
+
+    //! Convolve given intensities with the encapsulated resolution.
+    virtual void applyDetectorResolution(OutputData<double> *p_intensity_map) const;
+
+    //! Adds parameters from local pool to external pool and recursively call children.
+    virtual std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool *external_pool, int copy_number = -1) const;
+
+    virtual ConvolutionDetectorResolution *clone() const;
+
+    const IResolutionFunction2D *getResolutionFunction2D() const;
+
+protected:
+    ConvolutionDetectorResolution(const ConvolutionDetectorResolution& other);
+
+    virtual void init_parameters();
+
+private:
+    void apply1dConvolution(OutputData<double> *p_intensity_map) const;
+    void apply2dConvolution(OutputData<double> *p_intensity_map) const;
+    double getIntegratedPDF1d(double x, double step) const;
+    double getIntegratedPDF2d(double x, double step_x, double y, double step_y) const;
+
+    size_t m_dimension;
+    cumulative_DF_1d m_res_function_1d;
+    IResolutionFunction2D *mp_res_function_2d;
+};
+
+inline const IResolutionFunction2D *ConvolutionDetectorResolution::getResolutionFunction2D() const
+{
+    return mp_res_function_2d;
+}
+
+#endif // CONVOLUTIONDETECTORRESOLUTION_H
diff --git a/Core/Instrument/Convolve.cpp b/Core/Instrument/Convolve.cpp
new file mode 100644
index 0000000..80a2013
--- /dev/null
+++ b/Core/Instrument/Convolve.cpp
@@ -0,0 +1,365 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Convolve.cpp
+//! @brief     Implements class Convolve.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Convolve.h"
+#include "Exceptions.h"
+#include <iostream>
+#include <sstream>
+#include <stdexcept> // need overlooked by g++ 5.4
+
+MathFunctions::Convolve::Convolve() : m_mode(FFTW_UNDEFINED)
+{
+    // storing favorite fftw3 prime factors
+    const size_t FFTW_FACTORS[] = {13,11,7,5,3,2};
+    m_implemented_factors.assign(
+        FFTW_FACTORS, FFTW_FACTORS + sizeof(FFTW_FACTORS)/sizeof(FFTW_FACTORS[0]));
+}
+
+MathFunctions::Convolve::Workspace::Workspace() :
+    h_src(0), w_src(0), h_kernel(0), w_kernel(0), w_fftw(0), h_fftw(0),
+    in_src(0), out_src(0), in_kernel(0), out_kernel(0), dst_fft(0), h_dst(0), w_dst(0),
+    //dst(0),
+    h_offset(0), w_offset(0),
+    p_forw_src(nullptr), p_forw_kernel(nullptr), p_back(nullptr)
+{
+}
+
+MathFunctions::Convolve::Workspace::~Workspace()
+{
+    clear();
+}
+
+void MathFunctions::Convolve::Workspace::clear()
+{
+    h_src=0;
+    w_src=0;
+    h_kernel=0;
+    w_kernel = 0;
+    if(in_src) delete[] in_src;
+    in_src = 0;
+
+    if(out_src) fftw_free((fftw_complex*)out_src);
+    out_src = 0;
+
+    if(in_kernel) delete[] in_kernel;
+    in_kernel=0;
+
+    if(out_kernel) fftw_free((fftw_complex*)out_kernel);
+    out_kernel=0;
+
+    if(dst_fft) delete[] dst_fft;
+    dst_fft=0;
+
+    //if(dst) delete[] dst;
+    //dst=0;
+
+    h_offset = 0;
+    w_offset = 0;
+
+    if(p_forw_src != nullptr) fftw_destroy_plan(p_forw_src);
+    if(p_forw_kernel != nullptr) fftw_destroy_plan(p_forw_kernel);
+    if(p_back != nullptr)  fftw_destroy_plan(p_back);
+
+    // this returns fftw3 into completely initial state but is dramatically slow
+    //fftw_cleanup();
+}
+
+
+/* ************************************************************************* */
+// convolution in 2d
+/* ************************************************************************* */
+void MathFunctions::Convolve::fftconvolve(
+    const double2d_t& source, const double2d_t& kernel, double2d_t& result)
+{
+    // set default convolution mode, if not defined
+    if(m_mode == FFTW_UNDEFINED)
+        setMode(FFTW_LINEAR_SAME);
+
+    int h_src = (int)source.size();
+    int w_src = (int)(source.size() ? source[0].size() : 0);
+    int h_kernel = (int)kernel.size();
+    int w_kernel = (kernel.size() ? (int)kernel[0].size() : 0);
+
+    // initialisation
+    init(h_src, w_src, h_kernel, w_kernel);
+    // Compute the circular convolution
+    fftw_circular_convolution(source, kernel);
+
+    // results
+    result.clear();
+    result.resize(ws.h_dst);
+    for(int i=0; i<ws.h_dst; i++) {
+        result[i].resize(ws.w_dst,0);
+        for(int j=0; j<ws.w_dst; j++) {
+            //result[i][j]=ws.dst[i*ws.w_dst+j];
+            if(m_mode == FFTW_CIRCULAR_SAME_SHIFTED) {
+                result[i][j] = ws.dst_fft[
+                    ((i+int(ws.h_kernel/2.0))%ws.h_fftw)*ws.w_fftw+
+                    (j+int(ws.w_kernel/2.0))%ws.w_fftw];
+            } else {
+                result[i][j] = ws.dst_fft[(i+ws.h_offset)*ws.w_fftw+j+ws.w_offset];
+            }
+        }
+    }
+
+}
+
+
+/* ************************************************************************* */
+// convolution in 1d
+/* ************************************************************************* */
+void MathFunctions::Convolve::fftconvolve(
+    const double1d_t& source, const double1d_t& kernel, double1d_t& result)
+{
+    // we simply create 2d arrays with length of first dimension equal to 1, and call 2d convolution
+    double2d_t source2d, kernel2d;
+    source2d.push_back(source);
+    kernel2d.push_back(kernel);
+
+    double2d_t result2d;
+    fftconvolve(source2d, kernel2d, result2d);
+    if(result2d.size() != 1)
+        throw Exceptions::RuntimeErrorException(
+            "MathFunctions::Convolve::fftconvolve -> Panic in 1d");
+    result = result2d[0];
+}
+
+
+/* ************************************************************************* */
+// initialise input and output arrays for fast Fourier transformation
+/* ************************************************************************* */
+void MathFunctions::Convolve::init(int h_src, int w_src, int h_kernel, int w_kernel)
+{
+    if(!h_src || !w_src || !h_kernel || !w_kernel) {
+        std::ostringstream os;
+        os << "MathFunctions::Convolve::init() -> Panic! Wrong dimensions " <<
+            h_src << " " << w_src << " " << h_kernel << " " << w_kernel << std::endl;
+        throw Exceptions::RuntimeErrorException(os.str());
+    }
+
+    ws.clear();
+    ws.h_src = h_src;
+    ws.w_src = w_src;
+    ws.h_kernel = h_kernel;
+    ws.w_kernel = w_kernel;
+    switch(m_mode)
+    {
+    case FFTW_LINEAR_FULL:
+        // Full Linear convolution
+        ws.h_fftw = find_closest_factor(h_src + h_kernel - 1);
+        ws.w_fftw = find_closest_factor(w_src + w_kernel - 1);
+        ws.h_dst = h_src + h_kernel-1;
+        ws.w_dst = w_src + w_kernel-1;
+        // Here we just keep the first [0:h_dst-1 ; 0:w_dst-1] real part elements of out_src
+        ws.h_offset = 0;
+        ws.w_offset = 0;
+        break;
+    case FFTW_LINEAR_SAME_UNPADDED:
+        // Same Linear convolution
+        ws.h_fftw = h_src + int(h_kernel/2.0);
+        ws.w_fftw = w_src + int(w_kernel/2.0);
+        ws.h_dst = h_src;
+        ws.w_dst = w_src;
+        // Here we just keep the first [h_filt/2:h_filt/2+h_dst-1 ; w_filt/2:w_filt/2+w_dst-1]
+        // real part elements of out_src
+        ws.h_offset = int(ws.h_kernel/2.0);
+        ws.w_offset = int(ws.w_kernel/2.0);
+        break;
+    case FFTW_LINEAR_SAME:
+        // Same Linear convolution
+        ws.h_fftw = find_closest_factor(h_src + int(h_kernel/2.0));
+        ws.w_fftw = find_closest_factor(w_src + int(w_kernel/2.0));
+        ws.h_dst = h_src;
+        ws.w_dst = w_src;
+        // Here we just keep the first [h_filt/2:h_filt/2+h_dst-1 ; w_filt/2:w_filt/2+w_dst-1]
+        // real part elements of out_src
+        ws.h_offset = int(ws.h_kernel/2.0);
+        ws.w_offset = int(ws.w_kernel/2.0);
+        break;
+    case FFTW_LINEAR_VALID:
+        // Valid Linear convolution
+        if(ws.h_kernel > ws.h_src || ws.w_kernel > ws.w_src)
+        {
+            ws.h_fftw = 0;
+            ws.w_fftw = 0;
+            ws.h_dst = 0;
+            ws.w_dst = 0;
+            std::cout << "The 'valid' convolution results in an empty matrix" << std::endl;
+            throw std::runtime_error("The 'valid' convolution results in an empty matrix");
+        } else {
+            ws.h_fftw = find_closest_factor(h_src);
+            ws.w_fftw = find_closest_factor(w_src);
+            ws.h_dst = h_src - h_kernel+1;
+            ws.w_dst = w_src - w_kernel+1;
+        }
+        // Here we just take [h_dst x w_dst] elements starting at [h_kernel-1;w_kernel-1]
+        ws.h_offset = ws.h_kernel - 1;
+        ws.w_offset = ws.w_kernel - 1;
+        break;
+    case FFTW_CIRCULAR_SAME:
+        // Circular convolution, modulo N
+        // We don't padd with zeros because if we do, we need to padd with at least h_kernel/2;
+        // w_kernel/2 elements plus the wrapp around, which in facts leads to too much
+        // computations compared to the gain obtained with the optimal size
+        ws.h_fftw = h_src;
+        ws.w_fftw = w_src;
+        ws.h_dst = h_src;
+        ws.w_dst = w_src;
+        // We copy the first [0:h_dst-1 ; 0:w_dst-1] real part elements of out_src
+        ws.h_offset = 0;
+        ws.w_offset = 0;
+        break;
+    case FFTW_CIRCULAR_SAME_SHIFTED:
+        // Circular convolution, modulo N, shifted by M/2
+        // We don't padd with zeros because if we do, we need to padd with at least h_kernel/2;
+        // w_kernel/2 elements plus the wrapp around, which in facts leads to too much
+        // computations compared to the gain obtained with the optimal size
+        ws.h_fftw = h_src;
+        ws.w_fftw = w_src;
+        ws.h_dst = h_src;
+        ws.w_dst = w_src;
+        // We copy the [h_kernel/2:h_kernel/2+h_dst-1 ; w_kernel/2:w_kernel/2+w_dst-1]
+        // real part elements of out_src
+        ws.h_offset = 0;
+        ws.w_offset = 0;
+        break;
+    default:
+        std::cout << "Unrecognized convolution mode, possible modes are " <<
+            "FFTW_LINEAR_FULL, FFTW_LINEAR_SAME, FFTW_LINEAR_SAME_UNPADDED, FFTW_LINEAR_VALID, " <<
+            "FFTW_CIRCULAR_SAME, FFTW_CIRCULAR_SHIFTED " << std::endl;
+        break;
+    }
+
+    ws.in_src = new double[ws.h_fftw * ws.w_fftw];
+    ws.out_src = (double*) fftw_malloc(sizeof(fftw_complex) * ws.h_fftw * (ws.w_fftw/2+1));
+    ws.in_kernel = new double[ws.h_fftw * ws.w_fftw];
+    ws.out_kernel = (double*) fftw_malloc(sizeof(fftw_complex) * ws.h_fftw * (ws.w_fftw/2+1));
+
+    ws.dst_fft = new double[ws.h_fftw * ws.w_fftw];
+    //ws.dst = new double[ws.h_dst * ws.w_dst];
+
+    // Initialization of the plans
+    ws.p_forw_src = fftw_plan_dft_r2c_2d(ws.h_fftw, ws.w_fftw, ws.in_src,
+                                         (fftw_complex*)ws.out_src, FFTW_ESTIMATE);
+    if( ws.p_forw_src == nullptr )
+        throw Exceptions::RuntimeErrorException(
+            "MathFunctions::Convolve::init() -> Error! Can't initialise p_forw_src plan.");
+
+    ws.p_forw_kernel = fftw_plan_dft_r2c_2d(ws.h_fftw, ws.w_fftw, ws.in_kernel,
+                                            (fftw_complex*)ws.out_kernel, FFTW_ESTIMATE);
+    if( ws.p_forw_kernel == nullptr )
+        throw Exceptions::RuntimeErrorException(
+            "MathFunctions::Convolve::init() -> Error! Can't initialise p_forw_kernel plan.");
+
+    // The backward FFT takes ws.out_kernel as input
+    ws.p_back = fftw_plan_dft_c2r_2d(
+        ws.h_fftw, ws.w_fftw, (fftw_complex*)ws.out_kernel, ws.dst_fft, FFTW_ESTIMATE);
+    if( ws.p_back == nullptr )
+        throw Exceptions::RuntimeErrorException(
+            "MathFunctions::Convolve::init() -> Error! Can't initialise p_back plan.");
+}
+
+
+/* ************************************************************************* */
+// initialise input and output arrays for fast Fourier transformation
+/* ************************************************************************* */
+
+void MathFunctions::Convolve::fftw_circular_convolution(
+    const double2d_t& src, const double2d_t& kernel)
+{
+    if(ws.h_fftw <= 0 || ws.w_fftw <= 0)
+        throw Exceptions::RuntimeErrorException(
+            "MathFunctions::Convolve::fftw_convolve() -> Panic! Initialisation is missed.");
+
+    double * ptr, *ptr_end, *ptr2;
+
+    // Reset the content of ws.in_src
+    for(ptr = ws.in_src, ptr_end = ws.in_src + ws.h_fftw*ws.w_fftw ; ptr != ptr_end ; ++ptr)
+        *ptr = 0.0;
+    for(ptr = ws.in_kernel, ptr_end = ws.in_kernel + ws.h_fftw*ws.w_fftw ; ptr != ptr_end ; ++ptr)
+        *ptr = 0.0;
+
+    // Then we build our periodic signals
+    //ptr = src;
+    for(int i = 0 ; i < ws.h_src ; ++i)
+        for(int j = 0 ; j < ws.w_src ; ++j, ++ptr)
+            ws.in_src[(i%ws.h_fftw)*ws.w_fftw+(j%ws.w_fftw)] += src[i][j];
+
+    //ptr = kernel;
+    for(int i = 0 ; i < ws.h_kernel ; ++i)
+        for(int j = 0 ; j < ws.w_kernel ; ++j, ++ptr)
+            ws.in_kernel[(i%ws.h_fftw)*ws.w_fftw+(j%ws.w_fftw)] += kernel[i][j];
+
+    // And we compute their packed FFT
+    fftw_execute(ws.p_forw_src);
+    fftw_execute(ws.p_forw_kernel);
+
+    // Compute the element-wise product on the packed terms
+    // Let's put the element wise products in ws.in_kernel
+    double re_s, im_s, re_k, im_k;
+    for(ptr = ws.out_src,
+            ptr2 = ws.out_kernel,
+            ptr_end = ws.out_src+2*ws.h_fftw * (ws.w_fftw/2+1); ptr != ptr_end ; ++ptr, ++ptr2)
+    {
+        re_s = *ptr;
+        im_s = *(++ptr);
+        re_k = *ptr2;
+        im_k = *(++ptr2);
+        *(ptr2-1) = re_s * re_k - im_s * im_k;
+        *ptr2 = re_s * im_k + im_s * re_k;
+    }
+
+    // Compute the backward FFT
+    // Carefull, The backward FFT does not preserve the output
+    fftw_execute(ws.p_back);
+    // Scale the transform
+    for(ptr = ws.dst_fft, ptr_end = ws.dst_fft + ws.w_fftw*ws.h_fftw ; ptr != ptr_end ; ++ptr)
+        *ptr /= double(ws.h_fftw*ws.w_fftw);
+
+}
+
+
+/* ************************************************************************* */
+// find a number closest to the given one, which  can be factorised according
+// to fftw3 favorite factorisation
+/* ************************************************************************* */
+
+int MathFunctions::Convolve::find_closest_factor(int n)
+{
+    if(is_optimal(n) ) {
+        return n;
+    } else {
+        int j = n+1;
+        while( !is_optimal(j) ) ++j;
+        return j;
+    }
+}
+
+
+/* ************************************************************************* */
+// if a number can be factorised using only favorite fftw3 factors
+/* ************************************************************************* */
+bool MathFunctions::Convolve::is_optimal(int n)
+{
+    if(n==1)
+        return false;
+    int ntest = n;
+    for(size_t i=0; i<m_implemented_factors.size(); i++){
+        while( (ntest%m_implemented_factors[i]) == 0 ) {
+            ntest = ntest/m_implemented_factors[i];
+        }
+    }
+    return ntest==1;
+}
diff --git a/Core/Instrument/Convolve.h b/Core/Instrument/Convolve.h
new file mode 100644
index 0000000..a844725
--- /dev/null
+++ b/Core/Instrument/Convolve.h
@@ -0,0 +1,126 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Convolve.h
+//! @brief     Defines class MathFunctions::Convolve.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CONVOLVE_H
+#define CONVOLVE_H
+
+#include "WinDllMacros.h"
+#include <fftw3.h>
+#include <vector>
+
+namespace MathFunctions
+{
+
+//! @class Convolve
+//! @ingroup tools_internal
+//! @brief Convolution of two real vectors (in 1D or 2D) using Fast Fourier Transform.
+//!
+//! Usage:
+//! std::vector<double> signal, kernel, result;
+//! Convolve cv;
+//! cv.fftconvolve(signal, kernel, result)
+//!
+//! Given code rely on code from Jeremy Fix page
+//! http://jeremy.fix.free.fr/spip.php?article15
+//! see also
+//! "Efficient convolution using the Fast Fourier Transform, Application in C++"
+//! by Jeremy Fix, May 30, 2011
+//!
+class BA_CORE_API_ Convolve
+{
+public:
+    //! definition of 1d vector of double
+    typedef std::vector<double > double1d_t;
+
+    //! definition of 2d vector of double
+    typedef std::vector<double1d_t > double2d_t;
+
+    Convolve();
+
+    //! convolution  modes
+    //! use LINEAR_SAME or CIRCULAR_SAME_SHIFTED for maximum performance
+    enum EConvolutionMode { FFTW_LINEAR_FULL, FFTW_LINEAR_SAME_UNPADDED,
+                            FFTW_LINEAR_SAME, FFTW_LINEAR_VALID,
+                            FFTW_CIRCULAR_SAME, FFTW_CIRCULAR_SAME_SHIFTED,
+                            FFTW_UNDEFINED };
+
+    //! convolution in 1D
+    void fftconvolve(const double1d_t& source, const double1d_t& kernel, double1d_t& result);
+
+    //! convolution in 2D
+    void fftconvolve(const double2d_t& source, const double2d_t& kernel, double2d_t& result);
+
+    //! prepare arrays for 2D convolution of given vectors
+    void init(int h_src, int w_src, int h_kernel, int w_kernel);
+
+    //! Sets convolution mode
+    void setMode(EConvolutionMode mode) { m_mode = mode; }
+
+private:
+    //! compute circual convolution of source and kernel using fast Fourier transformation
+    void fftw_circular_convolution(const double2d_t& source, const double2d_t& kernel);
+
+    //! find closest number X>n that can be factorised according to fftw3 favorite factorisation
+    int find_closest_factor(int n);
+
+    //! if a number can be factorised using only favorite fftw3 factors
+    bool is_optimal(int n);
+
+    //! Workspace for Fourier convolution.
+
+    //! Workspace contains input (source and kernel), intermediate and output
+    //! arrays to run convolution via fft; 'source' it is our signal, 'kernel'
+    //! it is our resolution function.
+    //! Sizes of input arrays are adjusted; output arrays are alocated via
+    //! fftw3 allocation for maximum performance.
+    class Workspace
+    {
+    public:
+        Workspace();
+        ~Workspace();
+        void clear();
+        friend class Convolve;
+    private:
+        int h_src, w_src;                 // size of original 'source' array in 2 dimensions
+        int h_kernel, w_kernel;           // size of original 'kernel' array in 2 dimensions
+        // size of adjusted source and kernel arrays (in_src, out_src, in_kernel, out_kernel)
+        int w_fftw, h_fftw;
+        //! adjusted input 'source' array
+        double *in_src;
+        //! result of Fourier transformation of source
+        double *out_src;
+        //! adjusted input 'kernel' array
+        double *in_kernel;
+        //! result of Fourier transformation of kernel
+        double *out_kernel;
+        //! result of product of FFT(source) and FFT(kernel)
+        double *dst_fft;
+        int h_dst, w_dst;                 // size of resulting array
+        int h_offset, w_offset;           // offsets to copy result into output arrays
+        fftw_plan p_forw_src;
+        fftw_plan p_forw_kernel;
+        fftw_plan p_back;
+    };
+
+    //! input and output data for fftw3
+    Workspace ws;
+    //! convolution mode
+    EConvolutionMode m_mode;
+    std::vector<size_t > m_implemented_factors; // favorite factorization terms of fftw3
+};
+
+}  // namespace MathFunctions
+
+#endif // CONVOLVE_H
diff --git a/Core/Instrument/CumulativeValue.cpp b/Core/Instrument/CumulativeValue.cpp
new file mode 100644
index 0000000..e3b916e
--- /dev/null
+++ b/Core/Instrument/CumulativeValue.cpp
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/CumulativeValue.cpp
+//! @brief     Implements class CumulativeValue.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "CumulativeValue.h"
+#include <cmath>
+
+double CumulativeValue::getRMS() const
+{
+    return std::sqrt(m_rms2);
+}
+
+void CumulativeValue::add(double value, double weight)
+{
+    m_n_entries++;
+    m_sum += value;
+    m_rms2 = (m_sum_of_weights/(m_sum_of_weights+weight))*
+            (m_rms2+(weight/(m_sum_of_weights+weight))*(value-m_average)*(value-m_average));
+    m_average = m_average+(value-m_average)*weight/(m_sum_of_weights+weight);
+    m_sum_of_weights += weight;
+}
+
+void CumulativeValue::clear()
+{
+    m_n_entries = 0;
+    m_sum = 0.0;
+    m_average = 0.0;
+    m_rms2 = 0.0;
+    m_sum_of_weights = 0.0;
+}
+
+bool operator<(const CumulativeValue& lhs, const CumulativeValue& rhs)
+{
+    return lhs.getContent()< rhs.getContent();
+}
+
+bool operator>(const CumulativeValue& lhs, const CumulativeValue& rhs)
+{
+    return rhs<lhs;
+}
diff --git a/Core/Instrument/CumulativeValue.h b/Core/Instrument/CumulativeValue.h
new file mode 100644
index 0000000..9664d74
--- /dev/null
+++ b/Core/Instrument/CumulativeValue.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/CumulativeValue.h
+//! @brief     Defines class CumulativeValue.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CUMULATIVEVALUE_H
+#define CUMULATIVEVALUE_H
+
+#include "WinDllMacros.h"
+
+//! @class CumulativeValue
+//! @ingroup tools
+//! @brief The cumulative value with average and rms on-the-flight calculations.
+
+class BA_CORE_API_ CumulativeValue
+{
+public:
+    CumulativeValue() { clear(); }
+
+    void clear();
+    void setContent(double value) { m_sum = value; }
+    void add(double value, double weight=1.0);
+
+    int getNumberOfEntries() const { return m_n_entries; }
+    double getContent() const { return m_sum; }
+    double getAverage() const { return m_average; }
+    double getRMS() const;
+
+private:
+    int m_n_entries;
+    double m_sum;
+    double m_average;
+    double m_rms2; //sum[ (x-x_aver)^2]/nentries
+    double m_sum_of_weights;
+};
+
+BA_CORE_API_ bool operator< (const CumulativeValue& lhs, const CumulativeValue& rhs);
+BA_CORE_API_ bool operator> (const CumulativeValue& lhs, const CumulativeValue& rhs);
+
+
+#endif // CUMULATIVEVALUE_H
diff --git a/Core/Instrument/DetectionProperties.cpp b/Core/Instrument/DetectionProperties.cpp
new file mode 100644
index 0000000..23e3c54
--- /dev/null
+++ b/Core/Instrument/DetectionProperties.cpp
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/DetectionProperties.cpp
+//! @brief     Implements class DetectionProperties.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "DetectionProperties.h"
+#include "Exceptions.h"
+#include "Complex.h"
+
+DetectionProperties::DetectionProperties()
+{
+    initPolarizationOperator();
+}
+
+void DetectionProperties::setAnalyzerProperties(const kvector_t direction, double efficiency,
+                                               double total_transmission)
+{
+    if (!checkAnalyzerProperties(direction, efficiency, total_transmission))
+        throw Exceptions::ClassInitializationException("IDetector2D::setAnalyzerProperties: the "
+                                                       "given properties are not physical");
+
+    m_analyzer_operator = calculateAnalyzerOperator(direction, efficiency, total_transmission);
+}
+
+Eigen::Matrix2cd DetectionProperties::analyzerOperator() const
+{
+    return m_analyzer_operator;
+}
+
+void DetectionProperties::initPolarizationOperator()
+{
+    m_analyzer_operator = Eigen::Matrix2cd::Identity();
+}
+
+bool DetectionProperties::checkAnalyzerProperties(
+    const kvector_t direction, double efficiency, double total_transmission) const
+{
+    if (direction.mag() == 0.0)
+        return false;
+    double aplus = total_transmission * (1.0 + efficiency);
+    double amin = total_transmission * (1.0 - efficiency);
+    if (aplus < 0.0 || aplus > 1.0)
+        return false;
+    if (amin < 0.0 || amin > 1.0)
+        return false;
+    return true;
+}
+
+Eigen::Matrix2cd DetectionProperties::calculateAnalyzerOperator(
+    const kvector_t direction, double efficiency, double total_transmission) const
+{
+    Eigen::Matrix2cd result;
+    double x = direction.x()/direction.mag();
+    double y = direction.y()/direction.mag();
+    double z = direction.z()/direction.mag();
+    double sum = total_transmission * 2.0;
+    double diff = total_transmission * efficiency * 2.0;
+    complex_t im(0.0, 1.0);
+    result(0, 0) = (sum + diff*z) / 2.0;
+    result(0, 1) = diff*(x - im * y) / 2.0;
+    result(1, 0) = diff*(x + im * y) / 2.0;
+    result(1, 1) = (sum - diff*z) / 2.0;
+    return result;
+}
diff --git a/Core/Instrument/DetectionProperties.h b/Core/Instrument/DetectionProperties.h
new file mode 100644
index 0000000..93037d0
--- /dev/null
+++ b/Core/Instrument/DetectionProperties.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/DetectionProperties.h
+//! @brief     Defines class DetectionProperties.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DETECTIONPROPERTIES_H
+#define DETECTIONPROPERTIES_H
+
+#include "WinDllMacros.h"
+#include "EigenCore.h"
+#include "Vectors3D.h"
+
+//! Detector properties (efficiency, transmission).
+//! @ingroup simulation
+
+class BA_CORE_API_ DetectionProperties {
+public:
+    DetectionProperties();
+
+    //! Sets the polarization analyzer characteristics of the detector
+    void setAnalyzerProperties(const kvector_t direction, double efficiency,
+                               double total_transmission);
+
+    //! Gets the polarization density matrix (in spin basis along z-axis)
+    Eigen::Matrix2cd analyzerOperator() const;
+
+private:
+    //! Initialize polarization
+    void initPolarizationOperator();
+
+    Eigen::Matrix2cd calculateAnalyzerOperator(
+        const kvector_t direction, double efficiency, double total_transmission = 1.0) const;
+
+    //! Verify if the given analyzer properties are physical
+    bool checkAnalyzerProperties(const kvector_t direction, double efficiency,
+                                 double total_transmission) const;
+
+    Eigen::Matrix2cd m_analyzer_operator; //!< polarization analyzer operator
+};
+
+#endif
diff --git a/Core/Instrument/DetectorFunctions.cpp b/Core/Instrument/DetectorFunctions.cpp
new file mode 100644
index 0000000..297d047
--- /dev/null
+++ b/Core/Instrument/DetectorFunctions.cpp
@@ -0,0 +1,95 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/DetectorFunctions.cpp
+//! @brief     Implements namespace DetectorFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "DetectorFunctions.h"
+#include "OutputData.h"
+#include "IDetector2D.h"
+#include "Instrument.h"
+#include "SimulationArea.h"
+#include <sstream>
+
+bool DetectorFunctions::hasSameDimensions(const IDetector2D &detector,
+                                          const OutputData<double> &data)
+{
+    if (data.getRank() != detector.getDimension())
+        return false;
+
+    for (size_t i = 0; i < detector.getDimension(); ++i)
+        if(data.getAxis(i).size() != detector.getAxis(i).size())
+            return false;
+
+    return true;
+}
+
+std::string DetectorFunctions::axesToString(const IDetector2D &detector)
+{
+    std::ostringstream result;
+
+    result << "(";
+    for (size_t i = 0; i < detector.getDimension(); ++i) {
+        result << detector.getAxis(i).size();
+        if(i!=detector.getDimension()-1)
+            result << ",";
+    }
+    result << ")";
+
+    return result.str();
+}
+
+std::string DetectorFunctions::axesToString(const OutputData<double> &data)
+{
+    std::ostringstream result;
+
+    result << "(";
+    for (size_t i = 0; i < data.getRank(); ++i) {
+        result << data.getAxis(i).size();
+        if(i!=data.getRank()-1)
+            result << ",";
+    }
+    result << ")";
+
+    return result.str();
+}
+
+std::unique_ptr<OutputData<double>> DetectorFunctions::createDataSet(const Instrument &instrument,
+    const OutputData<double> &data, bool put_masked_areas_to_zero, IDetector2D::EAxesUnits units)
+{
+    if(!DetectorFunctions::hasSameDimensions(*instrument.getDetector(), data)){
+        std::ostringstream message;
+        message << "DetectorFunctions::createDataSet -> Error. Axes of the real data doesn't match "
+                << "the detector. Real data:" << DetectorFunctions::axesToString(data)
+                        << ", detector:"
+                        << DetectorFunctions::axesToString(*instrument.getDetector()) << ".";
+        throw Exceptions::RuntimeErrorException(message.str());
+    }
+
+    std::unique_ptr<OutputData<double>> result(instrument.createDetectorMap(units));
+
+    if(put_masked_areas_to_zero) {
+
+        SimulationArea area(instrument.getDetector());
+        for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+            (*result)[it.roiIndex()] = data[it.detectorIndex()];
+        }
+
+    } else {
+        SimulationRoiArea area(instrument.getDetector());
+        for(SimulationRoiArea::iterator it = area.begin(); it!=area.end(); ++it) {
+            (*result)[it.roiIndex()] = data[it.detectorIndex()];
+        }
+    }
+
+    return result;
+}
diff --git a/Core/Instrument/DetectorFunctions.h b/Core/Instrument/DetectorFunctions.h
new file mode 100644
index 0000000..edef715
--- /dev/null
+++ b/Core/Instrument/DetectorFunctions.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/DetectorFunctions.h
+//! @brief     Defines namespace DetectorFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DETECTORFUNCTIONS_H
+#define DETECTORFUNCTIONS_H
+
+#include "WinDllMacros.h"
+#include "IDetector2D.h"
+#include <string>
+#include <memory>
+template<class T> class OutputData;
+class IDetector2D;
+class Instrument;
+
+
+//! Contains set of detector-related convenience functions.
+//! @ingroup simulation
+
+namespace DetectorFunctions {
+
+//! Returns true if the data has same axes size (nx,ny) with the detector.
+BA_CORE_API_ bool hasSameDimensions(const IDetector2D& detector, const OutputData<double>& data);
+
+// TODO replace two functions below with the template function after change of
+// OutputData::getAxis signature
+
+//! Returns string representation of axes dimension in the form "(nx,ny)"
+BA_CORE_API_ std::string axesToString(const IDetector2D& detector);
+
+//! Returns string representation of axes dimension in the form "(nx,ny)"
+BA_CORE_API_ std::string axesToString(const OutputData<double>& data);
+
+//! Creates real data containing original user data clipped to the ROI area of the detector.
+//! If put_masked_areas_to_zero==true:
+//!     resulting data will have 0.0 in all masked areas
+//! If put_masked_areas_to_zero==false:
+//!     resulting data will be only cropped, masked areas will still contain intensities
+//! TODO: what users will like more (this appears on FitSuitePlotObserver)?
+
+BA_CORE_API_ std::unique_ptr<OutputData<double>> createDataSet(const Instrument& instrument,
+    const OutputData<double> &data, bool put_masked_areas_to_zero=true,
+    IDetector2D::EAxesUnits units=IDetector2D::DEFAULT);
+
+}
+
+#endif
+
diff --git a/Core/Instrument/DetectorMask.cpp b/Core/Instrument/DetectorMask.cpp
new file mode 100644
index 0000000..a5cd51c
--- /dev/null
+++ b/Core/Instrument/DetectorMask.cpp
@@ -0,0 +1,152 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/DetectorMask.cpp
+//! @brief     Implements class DetectorMask.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "BornAgainNamespace.h"
+#include "IDetector2D.h"
+#include "Histogram2D.h"
+#include "RegionOfInterest.h"
+
+DetectorMask::DetectorMask()
+    : m_number_of_masked_channels(0)
+{
+}
+
+DetectorMask::DetectorMask(const DetectorMask& other)
+    : m_shapes(other.m_shapes)
+    , m_mask_of_shape(other.m_mask_of_shape)
+    , m_number_of_masked_channels(other.m_number_of_masked_channels)
+{
+    m_mask_data.copyFrom(other.m_mask_data);
+}
+
+DetectorMask& DetectorMask::operator=(const DetectorMask& other)
+{
+    if (this != &other) {
+        m_shapes = other.m_shapes;
+        m_mask_of_shape = other.m_mask_of_shape;
+        m_mask_data.copyFrom(other.m_mask_data);
+        m_number_of_masked_channels = other.m_number_of_masked_channels;
+//        DetectorMask tmp(other);
+//        tmp.swapContent(*this);
+    }
+    return *this;
+}
+
+void DetectorMask::addMask(const Geometry::IShape2D& shape, bool mask_value)
+{
+    m_shapes.push_back(shape.clone());
+    m_mask_of_shape.push_back(mask_value);
+    m_mask_data.clear();
+    m_number_of_masked_channels = 0;
+}
+
+void DetectorMask::initMaskData(const IDetector2D& detector)
+{
+    if(detector.getDimension() != 2)
+        throw Exceptions::RuntimeErrorException("DetectorMask::initMaskData() -> Error. Attempt "
+                                                "to add masks to uninitialized detector.");
+
+    assert(m_shapes.size() == m_mask_of_shape.size());
+    m_mask_data.clear();
+
+    for (size_t dim=0; dim<detector.getDimension(); ++dim) {
+        const IAxis &axis = detector.getAxis(dim);
+// TODO consider masked area of the same size as detector in ROI
+//        if(detector.regionOfInterest()) {
+//            m_mask_data.addAxis(*detector.regionOfInterest()->clipAxisToRoi(dim, axis).get());
+//        } else {
+            m_mask_data.addAxis(axis);
+//        }
+    }
+
+    process_masks();
+}
+
+void DetectorMask::initMaskData(const OutputData<double>& data)
+{
+    assert(m_shapes.size() == m_mask_of_shape.size());
+    m_mask_data.clear();
+
+    for (size_t dim=0; dim<data.getRank(); ++dim)
+        m_mask_data.addAxis(data.getAxis(dim));
+
+    process_masks();
+}
+
+bool DetectorMask::isMasked(size_t index) const
+{
+    if(!m_mask_data.isInitialized())
+        return false;
+
+    if(index >= m_mask_data.getAllocatedSize())
+        throw Exceptions::RuntimeErrorException("DetectorMask::isMasked() -> Error. "
+                                              "Index is out of range "+std::to_string(index));
+    return m_mask_data[index];
+}
+
+Histogram2D* DetectorMask::createHistogram() const
+{
+    OutputData<double> data;
+    data.copyShapeFrom(m_mask_data);
+    for(size_t i=0; i<m_mask_data.getAllocatedSize(); ++i)
+        data[i] = static_cast<double>(m_mask_data[i]);
+    return dynamic_cast<Histogram2D*>(IHistogram::createHistogram(data));
+}
+
+void DetectorMask::removeMasks()
+{
+    m_shapes.clear();
+    m_mask_of_shape.clear();
+    m_mask_data.clear();
+}
+
+size_t DetectorMask::numberOfMasks() const
+{
+    return m_shapes.size();
+}
+
+const Geometry::IShape2D* DetectorMask::getMaskShape(size_t mask_index, bool& mask_value) const
+{
+    if(mask_index >= numberOfMasks())
+        return nullptr;
+    mask_value = m_mask_of_shape[mask_index];
+    return m_shapes[mask_index];
+}
+
+void DetectorMask::process_masks()
+{
+    m_mask_data.setAllTo(false);
+    if(!m_shapes.size())
+        return;
+
+    m_number_of_masked_channels = 0;
+    for(size_t index=0; index<m_mask_data.getAllocatedSize(); ++index) {
+        Bin1D binx = m_mask_data.getAxisBin(index, BornAgain::X_AXIS_INDEX);
+        Bin1D biny = m_mask_data.getAxisBin(index, BornAgain::Y_AXIS_INDEX);
+        // setting mask to the data starting from last shape added
+        bool is_masked(false);
+        for(size_t i_shape=m_shapes.size(); i_shape>0; --i_shape) {
+            const Geometry::IShape2D* shape = m_shapes[i_shape-1];
+            if(shape->contains(binx, biny)) {
+                if(m_mask_of_shape[i_shape-1])
+                    is_masked = true;
+                m_mask_data[index] = m_mask_of_shape[i_shape-1];
+                break; // index is covered by the shape, stop looking further
+            }
+        }
+        if(is_masked)
+            ++m_number_of_masked_channels;
+    }
+}
diff --git a/Core/Instrument/DetectorMask.h b/Core/Instrument/DetectorMask.h
new file mode 100644
index 0000000..8e4f280
--- /dev/null
+++ b/Core/Instrument/DetectorMask.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/DetectorMask.h
+//! @brief     Defines class DetectorMask.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DETECTORMASK_H
+#define DETECTORMASK_H
+
+#include "IShape2D.h"
+#include "OutputData.h"
+
+class IDetector2D;
+template <class T> class OutputData;
+class Histogram2D;
+
+//! Collection of detector masks.
+//! @ingroup simulation
+
+class BA_CORE_API_ DetectorMask
+{
+public:
+    DetectorMask();
+    DetectorMask(const DetectorMask& other);
+    DetectorMask& operator=(const DetectorMask& other);
+
+    //! Add mask to the stack of detector masks.
+    //! The value "true" means that the area will be excluded from the analysis.
+    //! @param shape The shape of mask.
+    //! @param mask_value The value of mask
+    void addMask(const Geometry::IShape2D& shape, bool mask_value);
+
+    //! Init the map of masks for the given detector plane
+    void initMaskData(const IDetector2D& detector);
+
+    void initMaskData(const OutputData<double>& data);
+
+    bool isMasked(size_t index) const;
+
+    const OutputData<bool>* getMaskData() const { return &m_mask_data; }
+
+    Histogram2D* createHistogram() const;
+
+    //! remove all masks and return object to initial state
+    void removeMasks();
+
+    //! returns true if has masks
+    bool hasMasks() const { return numberOfMasks()>0; }
+
+    int numberOfMaskedChannels() const { return m_number_of_masked_channels; }
+
+    size_t numberOfMasks() const;
+
+    const Geometry::IShape2D* getMaskShape(size_t mask_index, bool& mask_value) const;
+
+private:
+    void process_masks();
+
+    SafePointerVector<Geometry::IShape2D> m_shapes;
+    std::vector<bool> m_mask_of_shape;
+    OutputData<bool> m_mask_data;
+    int m_number_of_masked_channels;
+};
+
+#endif // DETECTORMASK_H
diff --git a/Core/Instrument/FitElement.cpp b/Core/Instrument/FitElement.cpp
new file mode 100644
index 0000000..4fcfbd6
--- /dev/null
+++ b/Core/Instrument/FitElement.cpp
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/FitElement.cpp
+//! @brief     Implements class FitElement.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitElement.h"
+#include <algorithm>
+
+FitElement::FitElement()
+    : m_index(0)
+    , m_simul_value(0.0)
+    , m_real_value(0.0)
+    , m_weight(1.0)
+    , m_squared_difference(0.0)
+    , m_residual(0.0)
+{
+}
+
+FitElement::FitElement(size_t index, double simul_value, double real_value, double weight)
+    : m_index(index)
+    , m_simul_value(simul_value)
+    , m_real_value(real_value)
+    , m_weight(weight)
+    , m_squared_difference(0.0)
+    , m_residual(0.0)
+{
+}
+
+
+FitElement::FitElement(const FitElement &other)
+    : m_index(other.m_index)
+    , m_simul_value(other.m_simul_value)
+    , m_real_value(other.m_real_value)
+    , m_weight(other.m_weight)
+    , m_squared_difference(other.m_squared_difference)
+    , m_residual(other.m_residual)
+{
+
+}
+
+FitElement &FitElement::operator=(const FitElement &other)
+{
+    if (this != &other) {
+        FitElement tmp(other);
+        tmp.swapContent(*this);
+    }
+    return *this;
+}
+
+
+void FitElement::swapContent(FitElement &other)
+{
+    std::swap(this->m_index, other.m_index);
+    std::swap(this->m_simul_value, other.m_simul_value);
+    std::swap(this->m_real_value, other.m_real_value);
+    std::swap(this->m_weight, other.m_weight);
+    std::swap(this->m_squared_difference, other.m_squared_difference);
+    std::swap(this->m_residual, other.m_residual);
+}
+
diff --git a/Core/Instrument/FitElement.h b/Core/Instrument/FitElement.h
new file mode 100644
index 0000000..c0591c8
--- /dev/null
+++ b/Core/Instrument/FitElement.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/FitElement.h
+//! @brief     Defines class FitElement.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITELEMENT_H
+#define FITELEMENT_H
+
+#include "WinDllMacros.h"
+#include <cstddef>
+
+//! @class FitElement
+//! @ingroup fitting_internal
+//! @brief Measured ("real") and simulated scattering intensity value for one detector cell.
+//! Used for chi2/residual calculations.
+
+class BA_CORE_API_ FitElement
+{
+public:
+    FitElement();
+    FitElement(size_t index, double simul_value, double real_value, double weight = 1.0);
+    FitElement(const FitElement &other);
+    FitElement &operator=(const FitElement &other);
+
+    size_t getIndex() const {  return m_index; }
+    double getSimulValue() const { return m_simul_value; }
+    double getRealValue() const { return m_real_value; }
+    double getWeight() const { return m_weight; }
+    double getSquaredDifference() const { return m_squared_difference; }
+    void setSquaredDifference(double value) { m_squared_difference = value; }
+    double getResidual() const { return m_residual; }
+    void setResidual(double value) { m_residual = value; }
+
+private:
+    void swapContent(FitElement &other);
+    size_t m_index;
+    double m_simul_value;
+    double m_real_value;
+    double m_weight;
+    double m_squared_difference;
+    double m_residual;
+};
+
+#endif // FITELEMENT_H
diff --git a/Core/Instrument/Histogram1D.cpp b/Core/Instrument/Histogram1D.cpp
new file mode 100644
index 0000000..c3d46d3
--- /dev/null
+++ b/Core/Instrument/Histogram1D.cpp
@@ -0,0 +1,105 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Histogram1D.cpp
+//! @brief     Implements class Histogram1D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Histogram1D.h"
+#include "NumpyUtils.h"
+#include "VariableBinAxis.h"
+#include <memory>
+
+Histogram1D::Histogram1D(int nbinsx, double xlow, double xup)
+{
+    m_data.addAxis(FixedBinAxis("x-axis", nbinsx, xlow, xup));
+}
+
+Histogram1D::Histogram1D(int nbinsx, const std::vector<double>& xbins)
+{
+    m_data.addAxis(VariableBinAxis("x-axis", nbinsx, xbins));
+}
+
+Histogram1D::Histogram1D(const IAxis& axis)
+    : IHistogram(axis)
+{}
+
+Histogram1D::Histogram1D(const OutputData<double>& data)
+{
+    init_from_data(data);
+}
+
+Histogram1D* Histogram1D::clone() const
+{
+    return new Histogram1D(*this);
+}
+
+int Histogram1D::fill(double x, double weight)
+{
+    const IAxis& axis = getXaxis();
+    if(x < axis.getMin() || x>=axis.getMax())
+        return -1;
+    size_t index = axis.findClosestIndex(x);
+    m_data[index].add(weight);
+    return (int)index;
+}
+
+std::vector<double> Histogram1D::getBinCenters() const
+{
+    return getXaxis().getBinCenters();
+}
+
+std::vector<double> Histogram1D::getBinValues() const
+{
+    return IHistogram::getDataVector(IHistogram::DataType::INTEGRAL);
+}
+
+std::vector<double> Histogram1D::getBinErrors() const
+{
+    return IHistogram::getDataVector(IHistogram::DataType::STANDARD_ERROR);
+}
+
+#ifdef BORNAGAIN_PYTHON
+
+PyObject* Histogram1D::getBinCentersNumpy() const
+{
+    return Utils::createNumpyArray(getBinCenters());
+}
+
+PyObject* Histogram1D::getBinValuesNumpy() const
+{
+    return Utils::createNumpyArray(getBinValues());
+}
+
+PyObject* Histogram1D::getBinErrorsNumpy() const
+{
+    return Utils::createNumpyArray(getBinErrors());
+}
+
+#endif // BORNAGAIN_PYTHON
+
+Histogram1D* Histogram1D::crop(double xmin, double xmax)
+{
+    const std::unique_ptr<IAxis > xaxis(getXaxis().createClippedAxis(xmin, xmax));
+    Histogram1D* result = new Histogram1D(*xaxis);
+    OutputData<CumulativeValue>::const_iterator it_origin = m_data.begin();
+    OutputData<CumulativeValue>::iterator it_result = result->m_data.begin();
+    while (it_origin != m_data.end())
+    {
+        double x = m_data.getAxisValue(it_origin.getIndex(), 0);
+        if(result->getXaxis().contains(x)) {
+            *it_result = *it_origin;
+            ++it_result;
+        }
+        ++it_origin;
+    }
+    return result;
+}
diff --git a/Core/Instrument/Histogram1D.h b/Core/Instrument/Histogram1D.h
new file mode 100644
index 0000000..73e3781
--- /dev/null
+++ b/Core/Instrument/Histogram1D.h
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Histogram1D.h
+//! @brief     Defines class Histogram1D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HISTOGRAM1D_H
+#define HISTOGRAM1D_H
+
+#include "IHistogram.h"
+
+////! @class Histogram1D
+////! @ingroup tools
+////! @brief One dimensional histogram
+
+class BA_CORE_API_ Histogram1D : public IHistogram
+{
+public:
+    //! @brief Constructor for fix bin size histograms.
+    //! @param nbinsx number of bins
+    //! @param xlow low edge of the first bin
+    //! @param xup upper edge of the last bin
+    Histogram1D(int nbinsx, double xlow, double xup);
+
+    //! @brief Constructor for variable bin size histograms.
+    //! @param nbinsx number of bins
+    //! @param xbins Array of size nbins+1 containing low-edges for each
+    //! bin and upper edge of last bin.
+    Histogram1D(int nbinsx, const std::vector<double> &xbins);
+
+    //! Constructor for 1D histogram with custom axis
+    Histogram1D(const IAxis &axis);
+
+    //! Constructor for 1D histograms from basic OutputData object
+    Histogram1D(const OutputData<double> &data);
+
+    //! Returns clone of other histogram
+    Histogram1D *clone() const;
+
+    //! Returns the number of histogram dimensions
+    size_t getRank() const { return 1;}
+
+    //! Increment bin with abscissa x with a weight.
+    int fill(double x, double weight = 1.0);
+
+    //! returns vector of histogram bin centers
+    std::vector<double> getBinCenters() const;
+
+    //! returns vector of bin content (the value accumulated by bins)
+    std::vector<double> getBinValues() const;
+
+    //! returns vector of bin errors
+    std::vector<double> getBinErrors() const;
+
+#ifdef BORNAGAIN_PYTHON
+    PyObject *getBinCentersNumpy() const;
+    PyObject *getBinValuesNumpy() const;
+    PyObject *getBinErrorsNumpy() const;
+#endif
+
+
+    //! Create new histogram by applying crop on axis.
+    Histogram1D *crop(double xmin, double xmax);
+
+};
+
+
+#endif // HISTOGRAM1D_H
diff --git a/Core/Instrument/Histogram2D.cpp b/Core/Instrument/Histogram2D.cpp
new file mode 100644
index 0000000..4010104
--- /dev/null
+++ b/Core/Instrument/Histogram2D.cpp
@@ -0,0 +1,191 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Histogram2D.cpp
+//! @brief     Implements class Histogram2D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Histogram2D.h"
+#include "Histogram1D.h"
+#include "VariableBinAxis.h"
+#include "BornAgainNamespace.h"
+#include "Utils.h"
+#include <memory>
+
+
+Histogram2D::Histogram2D(int nbinsx, double xlow, double xup, int nbinsy, double ylow, double yup)
+{
+    m_data.addAxis(FixedBinAxis("x-axis", nbinsx, xlow, xup));
+    m_data.addAxis(FixedBinAxis("y-axis", nbinsy, ylow, yup));
+}
+
+Histogram2D::Histogram2D(
+    int nbinsx, const std::vector<double>& xbins, int nbinsy, const std::vector<double>& ybins)
+{
+    m_data.addAxis(VariableBinAxis("x-axis", nbinsx, xbins));
+    m_data.addAxis(VariableBinAxis("y-axis", nbinsy, ybins));
+}
+
+Histogram2D::Histogram2D(const IAxis &axis_x, const IAxis &axis_y)
+    : IHistogram(axis_x, axis_y)
+{}
+
+Histogram2D::Histogram2D(const OutputData<double>& data)
+{
+    init_from_data(data);
+}
+
+Histogram2D::Histogram2D(const std::vector<std::vector<double>>& data)
+{
+    auto shape = Utils::getShape(data);
+    const size_t nrows = shape.first;
+    const size_t ncols = shape.second;
+
+    if(nrows == 0 || ncols == 0)
+        throw Exceptions::LogicErrorException("Histogram2D::Histogram2D() -> Error. "
+                                              "Not a two-dimensional numpy array");
+
+    m_data.addAxis(FixedBinAxis("x-axis", ncols, 0.0, static_cast<double>(ncols)));
+    m_data.addAxis(FixedBinAxis("y-axis", nrows, 0.0, static_cast<double>(nrows)));
+
+    this->setContent(data);
+}
+
+Histogram2D* Histogram2D::clone() const
+{
+    return new Histogram2D(*this);
+}
+
+int Histogram2D::fill(double x, double y, double weight)
+{
+    if(x < getXaxis().getMin() || x >= getXaxis().getMax()) return -1;
+    if(y < getYaxis().getMin() || y >= getYaxis().getMax()) return -1;
+    size_t index = m_data.findGlobalIndex( {x,y} );
+    m_data[index].add(weight);
+    return (int)index;
+}
+
+Histogram1D* Histogram2D::projectionX()
+{
+    return create_projectionX(0, getXaxis().size()-1);
+}
+
+Histogram1D* Histogram2D::projectionX(double yvalue)
+{
+    int ybin_selected = getYaxis().findClosestIndex(yvalue);
+    return create_projectionX(ybin_selected, ybin_selected);
+}
+
+Histogram1D* Histogram2D::projectionX(double ylow, double yup)
+{
+    int ybinlow = getYaxis().findClosestIndex(ylow);
+    int ybinup = getYaxis().findClosestIndex(yup);
+    return create_projectionX(ybinlow, ybinup);
+}
+
+Histogram1D* Histogram2D::projectionY()
+{
+    return create_projectionY(0, getXaxis().size()-1);
+}
+
+Histogram1D* Histogram2D::projectionY(double xvalue)
+{
+    int xbin_selected = getXaxis().findClosestIndex(xvalue);
+    return create_projectionY(xbin_selected, xbin_selected);
+}
+
+Histogram1D* Histogram2D::projectionY(double xlow, double xup)
+{
+    int xbinlow = getXaxis().findClosestIndex(xlow);
+    int xbinup = getXaxis().findClosestIndex(xup);
+    return create_projectionY(xbinlow, xbinup);
+}
+
+Histogram2D* Histogram2D::crop(double xmin, double ymin, double xmax, double ymax)
+{
+    const std::unique_ptr<IAxis > xaxis(getXaxis().createClippedAxis(xmin, xmax));
+    const std::unique_ptr<IAxis > yaxis(getYaxis().createClippedAxis(ymin, ymax));
+
+    Histogram2D* result = new Histogram2D(*xaxis, *yaxis);
+    OutputData<CumulativeValue>::const_iterator it_origin = m_data.begin();
+    OutputData<CumulativeValue>::iterator it_result = result->m_data.begin();
+    while (it_origin != m_data.end())
+    {
+        double x = m_data.getAxisValue(it_origin.getIndex(), 0);
+        double y = m_data.getAxisValue(it_origin.getIndex(), 1);
+        if(result->getXaxis().contains(x) && result->getYaxis().contains(y)) {
+            *it_result = *it_origin;
+            ++it_result;
+        }
+        ++it_origin;
+    }
+    return result;
+}
+
+void Histogram2D::setContent(const std::vector<std::vector<double> > &data)
+{
+    reset();
+    addContent(data);
+}
+
+void Histogram2D::addContent(const std::vector<std::vector<double> > &data)
+{
+    auto shape = Utils::getShape(data);
+    const size_t nrows = shape.first;
+    const size_t ncols = shape.second;
+
+    if(nrows != m_data.getAxis(BornAgain::Y_AXIS_INDEX).size()
+            || ncols != m_data.getAxis(BornAgain::X_AXIS_INDEX).size()) {
+        std::ostringstream ostr;
+        ostr << "Histogram2D::addContent() -> Shape of input array [" << nrows
+             << ", " << ncols << "] doesn't mach histogram axes. "
+             << "X-axis size: " << m_data.getAxis(BornAgain::X_AXIS_INDEX).size()
+             << "Y-axis size: " << m_data.getAxis(BornAgain::Y_AXIS_INDEX).size();
+        throw Exceptions::LogicErrorException(ostr.str());
+    }
+
+    for(size_t row=0; row<nrows; ++row) {
+        for(size_t col=0; col<ncols; ++col) {
+            size_t globalbin = nrows - row - 1 + col*nrows;
+            m_data[globalbin].add(data[row][col]);
+        }
+    }
+}
+
+Histogram1D* Histogram2D::create_projectionX(int ybinlow, int ybinup)
+{
+    Histogram1D* result = new Histogram1D(this->getXaxis());
+
+    for(size_t index=0; index<getTotalNumberOfBins(); ++index) {
+
+        int ybin = getYaxisIndex(index);
+
+        if(ybin >= ybinlow && ybin <= ybinup) {
+            result->fill(getXaxisValue(index), getBinContent(index));
+        }
+    }
+    return result;
+}
+
+Histogram1D* Histogram2D::create_projectionY(int xbinlow, int xbinup)
+{
+    Histogram1D* result = new Histogram1D(this->getYaxis());
+
+    for(size_t index=0; index<getTotalNumberOfBins(); ++index) {
+
+        int xbin = getXaxisIndex(index);
+
+        if(xbin >= xbinlow && xbin <= xbinup) {
+            result->fill(getYaxisValue(index), getBinContent(index));
+        }
+    }
+    return result;
+}
diff --git a/Core/Instrument/Histogram2D.h b/Core/Instrument/Histogram2D.h
new file mode 100644
index 0000000..5e18ab0
--- /dev/null
+++ b/Core/Instrument/Histogram2D.h
@@ -0,0 +1,120 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Histogram2D.h
+//! @brief     Defines class Histogram2D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HISTOGRAM2D_H
+#define HISTOGRAM2D_H
+
+#include "IHistogram.h"
+
+#ifdef BORNAGAIN_PYTHON
+#ifndef PyObject_HEAD
+struct _object;
+typedef _object PyObject;
+#endif
+#endif
+
+//! Two dimensional histogram.
+//! @ingroup tools
+
+class BA_CORE_API_ Histogram2D : public IHistogram
+{
+public:
+    //! @brief Constructor for fix bin size histograms.
+    //! @param nbinsx number of bins on X-axis
+    //! @param xlow low edge of the first bin of X-axis
+    //! @param xup upper edge of the last bin of X-axis
+    //! @param nbinsy number of bins on Y axis
+    //! @param ylow low edge of the first bin of Y-axis
+    //! @param yup upper edge of the last bin of Y-axis
+    Histogram2D(int nbinsx, double xlow, double xup, int nbinsy, double ylow, double yup);
+
+    //! @brief Constructor for variable bin size histograms.
+    //! @param nbinsx number of bins on X-axis
+    //! @param xbins Array of size nbins+1 containing low-edges for each
+    //! bin and upper edge of last bin.
+    //! @param nbinsy number of bins on Y-axis
+    //! @param ybins Array of size nbins+1 containing low-edges for each
+    //! bin and upper edge of last bin.
+    Histogram2D(int nbinsx, const std::vector<double>& xbins,
+                int nbinsy, const std::vector<double>& ybins);
+
+    //! Constructor for 2D histogram with custom axes
+    Histogram2D(const IAxis& axis_x, const IAxis& axis_y);
+
+    //! Constructor for 2D histograms from basic OutputData object
+    Histogram2D(const OutputData<double>& data);
+
+    //! Constructor for 2D histograms from numpy array (thanks to swig)
+    Histogram2D(const std::vector<std::vector<double>>& data);
+
+    //! Returns clone of other histogram
+    Histogram2D* clone() const;
+
+    //! Returns the number of histogram dimensions
+    size_t getRank() const { return 2;}
+
+    //! Increment bin with abscissa x and ordinate y with a weight.
+    int fill(double x, double y, double weight = 1.0);
+
+    //! Project a 2D histogram into 1D histogram along X. The projection is made
+    //! from all bins along y-axis.
+    Histogram1D* projectionX();
+
+    //! @brief Project a 2D histogram into 1D histogram along X. The projection is made
+    //! from the y-bin closest to given ordinate yvalue.
+    //! @param yvalue the value on y-axis at which projection is taken
+    Histogram1D* projectionX(double yvalue);
+
+    //! @brief Project a 2D histogram into 1D histogram along X. The projection is made from
+    //! all y-bins corresponding to ordinate between ylow and yup.
+    //! @param ylow lower edje on y-axis
+    //! @param yup upper edje on y-axis
+    Histogram1D* projectionX(double ylow, double yup);
+
+    //! Project a 2D histogram into 1D histogram along Y. The projection is made
+    //! from all bins along x-axis.
+    Histogram1D* projectionY();
+
+    //! @brief Project a 2D histogram into 1D histogram along Y. The projection is made
+    //! from the x-bin closest to given abscissa xvalue.
+    //! @param xvalue the value on x-axis at which projection is taken
+    Histogram1D* projectionY(double xvalue);
+
+    //! @brief Project a 2D histogram into 1D histogram along Y. The projection is made from
+    //! all x-bins corresponding to abscissa between xlow and xup.
+    //! @param xlow lower edje on x-axis
+    //! @param xup upper edje on x-axis
+    Histogram1D* projectionY(double xlow, double xup);
+
+    //! Create new histogram by applying rectangular clip.
+    Histogram2D* crop(double xmin, double ymin, double xmax, double ymax);
+
+    //! Sets the values in histograms channels from numpy array,
+    void setContent(const std::vector<std::vector<double>>& data);
+
+    //! Add to values in histograms channels from numpy array,
+    void addContent(const std::vector<std::vector<double>>& data);
+
+protected:
+    //! Creates projection along X. The projections is made by collecting the data in the range
+    //! between [ybinlow, ybinup].
+    Histogram1D* create_projectionX(int ybinlow, int ybinup);
+
+    //! Creates projection along Y. The projections is made by collecting the data in the range
+    //! between [xbinlow, xbinup].
+    Histogram1D* create_projectionY(int xbinlow, int xbinup);
+};
+
+#endif // HISTOGRAM2D_H
diff --git a/Core/Instrument/IChiSquaredModule.cpp b/Core/Instrument/IChiSquaredModule.cpp
new file mode 100644
index 0000000..ad76595
--- /dev/null
+++ b/Core/Instrument/IChiSquaredModule.cpp
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IChiSquaredModule.cpp
+//! @brief     Implements class IChiSquaredModule.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IChiSquaredModule.h"
+
+IChiSquaredModule::IChiSquaredModule()
+    : mp_squared_function(0)
+    , mp_data_normalizer(0)
+    , mp_intensity_function(0)
+{
+    mp_squared_function = new SquaredFunctionDefault();
+}
+
+IChiSquaredModule::IChiSquaredModule(const IChiSquaredModule& other)
+    : ICloneable()
+    , mp_squared_function(0)
+    , mp_data_normalizer(0)
+    , mp_intensity_function(0)
+{
+    if(other.mp_squared_function) mp_squared_function = other.mp_squared_function->clone();
+    if(other.mp_data_normalizer) mp_data_normalizer = other.mp_data_normalizer->clone();
+    if(other.mp_intensity_function) mp_intensity_function = other.mp_intensity_function->clone();
+}
+
+IChiSquaredModule::~IChiSquaredModule()
+{
+    delete mp_squared_function;
+    delete mp_data_normalizer;
+    delete mp_intensity_function;
+}
+
+void IChiSquaredModule::setChiSquaredFunction(ISquaredFunction *squared_function)
+{
+    delete mp_squared_function;
+    mp_squared_function = squared_function;
+}
+
+void IChiSquaredModule::setChiSquaredFunction(const ISquaredFunction& squared_function)
+{
+    setChiSquaredFunction(squared_function.clone());
+}
+
+void IChiSquaredModule::setIntensityNormalizer(const IIntensityNormalizer& data_normalizer)
+{
+    delete mp_data_normalizer;
+    mp_data_normalizer = data_normalizer.clone();
+}
+
+void IChiSquaredModule::setIntensityFunction(const IIntensityFunction& intensity_function)
+{
+    delete mp_intensity_function;
+    mp_intensity_function = intensity_function.clone();
+}
diff --git a/Core/Instrument/IChiSquaredModule.h b/Core/Instrument/IChiSquaredModule.h
new file mode 100644
index 0000000..16714b3
--- /dev/null
+++ b/Core/Instrument/IChiSquaredModule.h
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IChiSquaredModule.h
+//! @brief     Defines class IChiSquaredModule.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ICHISQUAREDMODULE_H
+#define ICHISQUAREDMODULE_H
+
+#include "FitElement.h"
+#include "IIntensityFunction.h"
+#include "IIntensityNormalizer.h"
+#include "ISquaredFunction.h"
+#include "ICloneable.h"
+
+//! Interface for ChiSquaredModule for chi2 calculations.
+//! @ingroup fitting_internal
+//! Until BornAgain-1.1, there was another child, ChiSquaredFrequency.
+
+class BA_CORE_API_ IChiSquaredModule : public ICloneable
+{
+public:
+    IChiSquaredModule();
+    virtual ~IChiSquaredModule();
+
+    //! clone method
+    virtual IChiSquaredModule* clone() const = 0;
+
+    //! Returns squared function
+    const ISquaredFunction* getSquaredFunction() const { return mp_squared_function; }
+
+    //! Sets squared function // TODO: merge these two functions (SWIG warning 509)
+    void setChiSquaredFunction(ISquaredFunction* squared_function);
+    void setChiSquaredFunction(const ISquaredFunction& squared_function);
+
+    //! Returns data normalizer.
+    virtual const IIntensityNormalizer* getIntensityNormalizer() const {
+        return mp_data_normalizer; }
+
+    //! Returns data normalizer, non-const version needed to set internals.
+    virtual IIntensityNormalizer* getIntensityNormalizer() {  return mp_data_normalizer; }
+
+    //! Sets data normalizer
+    virtual void setIntensityNormalizer(const IIntensityNormalizer& data_normalizer);
+
+    //! Returns data rescaler.
+    virtual const IIntensityFunction* getIntensityFunction() const { return mp_intensity_function; }
+
+    //! Sets data rescaler.
+    virtual void setIntensityFunction(const IIntensityFunction& intensity_function);
+
+    virtual void processFitElements(std::vector<FitElement>::iterator,
+                                    std::vector<FitElement>::iterator){}
+
+protected:
+    IChiSquaredModule(const IChiSquaredModule& other);
+
+    ISquaredFunction* mp_squared_function;
+    IIntensityNormalizer* mp_data_normalizer;
+    IIntensityFunction* mp_intensity_function;
+};
+
+#endif // ICHISQUAREDMODULE_H
diff --git a/Core/Instrument/IDetector2D.cpp b/Core/Instrument/IDetector2D.cpp
new file mode 100644
index 0000000..3c3cb9d
--- /dev/null
+++ b/Core/Instrument/IDetector2D.cpp
@@ -0,0 +1,374 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IDetector2D.cpp
+//! @brief     Implements shared functionality of interface IDetector2D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IDetector2D.h"
+#include "Beam.h"
+#include "IDetectorResolution.h"
+#include "InfinitePlane.h"
+#include "Logger.h"
+#include "SimulationElement.h"
+#include "SimulationArea.h"
+#include "BornAgainNamespace.h"
+#include "Units.h"
+#include "RegionOfInterest.h"
+#include "Exceptions.h"
+
+IDetector2D::IDetector2D()
+    : m_axes()
+{
+    init_parameters();
+}
+
+IDetector2D::IDetector2D(const IDetector2D &other)
+    : IParameterized()
+    , m_axes(other.m_axes)
+    , m_detector_mask(other.m_detector_mask)
+    , m_detection_properties(other.m_detection_properties)
+{
+    setName(other.getName());
+    if (other.mP_detector_resolution)
+        mP_detector_resolution.reset(other.mP_detector_resolution->clone());
+    if(other.regionOfInterest())
+        m_region_of_interest.reset(other.regionOfInterest()->clone());
+    init_parameters();
+}
+
+IDetector2D::~IDetector2D() {}
+
+const IAxis &IDetector2D::getAxis(size_t index) const
+{
+    if (isCorrectAxisIndex(index))
+        return *m_axes[index];
+    throw Exceptions::OutOfBoundsException("Not so many axes in this detector.");
+}
+
+void IDetector2D::setDetectorParameters(size_t n_x, double x_min, double x_max,
+                                        size_t n_y, double y_min, double y_max)
+{
+    clear();
+    const std::unique_ptr<IAxis> P_axis0(createAxis(0, n_x, x_min, x_max));
+    const std::unique_ptr<IAxis> P_axis1(createAxis(1, n_y, y_min, y_max));
+    addAxis(*P_axis0);
+    addAxis(*P_axis1);
+}
+
+void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
+{
+    clear();
+    addAxis(axis0);
+    addAxis(axis1);
+}
+
+void IDetector2D::applyDetectorResolution(OutputData<double> *p_intensity_map) const
+{
+    if (!p_intensity_map)
+        throw Exceptions::NullPointerException("IDetector2D::applyDetectorResolution() -> "
+                                   "Error! Null pointer to intensity map");
+    if (mP_detector_resolution)
+        mP_detector_resolution->applyDetectorResolution(p_intensity_map);
+    else
+        msglog(MSG::WARNING) << "IDetector2D::applyDetectorResolution() -> "
+                                "No detector resolution function found";
+}
+
+void IDetector2D::setAnalyzerProperties(const kvector_t direction, double efficiency,
+                                        double total_transmission)
+{
+    m_detection_properties.setAnalyzerProperties(direction, efficiency, total_transmission);
+}
+
+std::string IDetector2D::addParametersToExternalPool(
+    const std::string& path, ParameterPool *external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path
+        = IParameterized::addParametersToExternalPool(path, external_pool, copy_number);
+
+    // add parameters of the resolution function
+    if (mP_detector_resolution)
+        mP_detector_resolution->addParametersToExternalPool(new_path, external_pool, -1);
+    return new_path;
+}
+
+OutputData<double> *IDetector2D::createDetectorIntensity(
+        const std::vector<SimulationElement> &elements,
+        const Beam &beam, IDetector2D::EAxesUnits units_type) const
+{
+    std::unique_ptr<OutputData<double>> detectorMap(createDetectorMap(beam, units_type));
+    if(!detectorMap)
+        throw Exceptions::RuntimeErrorException("Instrument::getDetectorIntensity() -> Error."
+                                    "Can't create detector map.");
+
+    setDataToDetectorMap(*detectorMap.get(), elements);
+    applyDetectorResolution(detectorMap.get());
+
+    return detectorMap.release();
+}
+
+OutputData<double>* IDetector2D::createDetectorMap(const Beam& beam, EAxesUnits units) const
+{
+    std::unique_ptr<OutputData<double>> result(new OutputData<double>);
+    result->addAxis(*constructAxis(BornAgain::X_AXIS_INDEX, beam, units));
+    result->addAxis(*constructAxis(BornAgain::Y_AXIS_INDEX, beam, units));
+    result->setAllTo(0.);
+    return result.release();
+}
+
+void IDetector2D::initOutputData(OutputData<double> &data) const {
+  data.clear();
+  for (size_t i = 0; i < getDimension(); ++i)
+      data.addAxis(getAxis(i));
+  data.setAllTo(0.);
+}
+
+std::vector<IDetector2D::EAxesUnits> IDetector2D::getValidAxesUnits() const
+{
+    std::vector<EAxesUnits> result = {NBINS};
+    return result;
+}
+
+const RegionOfInterest *IDetector2D::regionOfInterest() const
+{
+    return m_region_of_interest.get();
+}
+
+void IDetector2D::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
+{
+    m_region_of_interest.reset(new RegionOfInterest(*this, xlow, ylow, xup, yup));
+    m_detector_mask.initMaskData(*this);
+}
+
+void IDetector2D::resetRegionOfInterest()
+{
+    m_region_of_interest.reset();
+    m_detector_mask.initMaskData(*this);
+}
+
+void IDetector2D::removeMasks()
+{
+    m_detector_mask.removeMasks();
+}
+
+void IDetector2D::addMask(const Geometry::IShape2D &shape, bool mask_value)
+{
+    m_detector_mask.addMask(shape, mask_value);
+    m_detector_mask.initMaskData(*this);
+}
+
+void IDetector2D::maskAll()
+{
+    if(m_axes.size() != 2) return;
+    m_detector_mask.removeMasks();
+    addMask(Geometry::InfinitePlane(), true);
+}
+
+const DetectorMask *IDetector2D::getDetectorMask() const
+{
+    return &m_detector_mask;
+}
+
+size_t IDetector2D::numberOfMaskedChannels() const
+{
+    if (getDetectorMask()) {
+        return getDetectorMask()->numberOfMaskedChannels();
+    } else {
+        return 0;
+    }
+}
+
+bool IDetector2D::isMasked(size_t index) const
+{
+    return m_detector_mask.isMasked(index);
+}
+
+bool IDetector2D::hasMasks() const
+{
+    return m_detector_mask.hasMasks();
+}
+
+std::vector<SimulationElement> IDetector2D::createSimulationElements(const Beam &beam)
+{
+    std::vector<SimulationElement> result;
+
+    double wavelength = beam.getWavelength();
+    double alpha_i = - beam.getAlpha();  // Defined to be always positive in Beam
+    double phi_i = beam.getPhi();
+    Eigen::Matrix2cd beam_polarization = beam.getPolarization();
+    Eigen::Matrix2cd analyzer_operator = m_detection_properties.analyzerOperator();
+
+    if (!hasMasks())
+        m_detector_mask.initMaskData(*this);
+    size_t spec_index = getIndexOfSpecular(beam);
+
+    SimulationArea area(this);
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        SimulationElement sim_element(wavelength, alpha_i, phi_i, std::unique_ptr<IPixelMap>(
+                                          createPixelMap(it.detectorIndex())));
+        sim_element.setPolarization(beam_polarization);
+        sim_element.setAnalyzerOperator(analyzer_operator);
+        if (it.index()==spec_index) {
+            sim_element.setSpecular(true);
+        }
+        result.push_back(std::move(sim_element));
+    }
+
+    return result;
+}
+
+SimulationElement IDetector2D::getSimulationElement(size_t index, const Beam &beam) const
+{
+    double wavelength = beam.getWavelength();
+    double alpha_i = - beam.getAlpha();  // Defined to be always positive in Beam
+    double phi_i = beam.getPhi();
+    return SimulationElement(wavelength, alpha_i, phi_i,
+                             std::unique_ptr<IPixelMap>(createPixelMap(index)));
+}
+
+size_t IDetector2D::getAxisBinIndex(size_t index, size_t selected_axis) const
+{
+    size_t remainder(index);
+    for (size_t i=0; i<getDimension(); ++i)
+    {
+        size_t i_axis = getDimension()-1-i;
+        int result = remainder % m_axes[i_axis]->size();
+        if(selected_axis == i_axis ) return result;
+        remainder /= m_axes[i_axis]->size();
+    }
+    throw Exceptions::LogicErrorException("IDetector2D::getAxisBinIndex() -> "
+                                          "Error! No axis with given number");
+}
+
+size_t IDetector2D::numberOfSimulationElements() const
+{
+    size_t result(0);
+    SimulationArea area(this);
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it)
+        ++result;
+    return result;
+}
+
+std::unique_ptr<IAxis> IDetector2D::constructAxis(size_t axis_index, const Beam &beam,
+                                                  IDetector2D::EAxesUnits units) const
+{
+    double amin(0), amax(0);
+    calculateAxisRange(axis_index, beam, units, amin, amax);
+
+    std::unique_ptr<IAxis> result(new FixedBinAxis(getAxisName(axis_index),
+                                                   getAxis(axis_index).size(), amin, amax));
+
+    if(m_region_of_interest) {
+        return m_region_of_interest->clipAxisToRoi(axis_index, *result.get());
+    } else {
+        return result;
+    }
+}
+
+void IDetector2D::calculateAxisRange(size_t axis_index, const Beam &beam,
+        IDetector2D::EAxesUnits units, double &amin, double &amax) const
+{
+    amin = 0.0; amax=0.0;
+
+    if(units == DEFAULT) {
+        amin = getAxis(axis_index).getMin();
+        amax = getAxis(axis_index).getMax();
+
+    }else if(units == NBINS) {
+        amin = 0.0;
+        amax = static_cast<double>(getAxis(axis_index).size());
+
+    } else if(units == QYQZ && axis_index == BornAgain::X_AXIS_INDEX) {
+        const IAxis &aX = getAxis(BornAgain::X_AXIS_INDEX);
+        SimulationElement el_left_bottom
+            = getSimulationElement(getGlobalIndex(0, 0), beam);
+        SimulationElement el_right_bottom
+            = getSimulationElement(getGlobalIndex(aX.size()-1, 0), beam);
+        amin = el_left_bottom.getQ(0.0, 0.0).y();
+        amax = el_right_bottom.getQ(1.0, 0.0).y();
+
+    } else if(units == QYQZ && axis_index == BornAgain::Y_AXIS_INDEX) {
+        const IAxis &aX = getAxis(BornAgain::X_AXIS_INDEX);
+        const IAxis &aY = getAxis(BornAgain::Y_AXIS_INDEX);
+        SimulationElement el_center_bottom
+            = getSimulationElement(getGlobalIndex(aX.size()/2, 0), beam);
+        SimulationElement el_center_top
+            = getSimulationElement(getGlobalIndex(aX.size()/2, aY.size()-1), beam);
+        amin = -el_center_bottom.getQ(0.5, 0.0).z();
+        amax = -el_center_top.getQ(0.5, 1.0).z();
+
+    } else {
+        throw Exceptions::RuntimeErrorException("IDetector2D::calculateAxisRange() -> Error. "
+                                                "Unknown units " +std::to_string(units));
+    }
+}
+
+size_t IDetector2D::getGlobalIndex(size_t x, size_t y) const
+{
+    if (getDimension()!=2) return getTotalSize();
+    return x*m_axes[1]->size()+y;
+}
+
+size_t IDetector2D::getTotalSize() const
+{
+    if (getDimension()==0) return 0;
+    size_t result = 1;
+    for (size_t i_axis=0; i_axis<getDimension(); ++i_axis)
+    {
+        result *= m_axes[i_axis]->size();
+    }
+    return result;
+}
+
+void IDetector2D::setDataToDetectorMap(OutputData<double> &detectorMap,
+                                       const std::vector<SimulationElement> &elements) const
+{
+    if(elements.empty())
+        return;
+    SimulationArea area(this);
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it)
+        detectorMap[it.roiIndex()] = elements[it.elementIndex()].getIntensity();
+
+}
+
+void IDetector2D::addAxis(const IAxis& axis)
+{
+    m_axes.push_back(axis.clone());
+}
+
+size_t IDetector2D::getDimension() const
+{
+    return m_axes.size();
+}
+
+void IDetector2D::clear()
+{
+    m_axes.clear();
+}
+
+void IDetector2D::setDetectorResolution(IDetectorResolution* p_detector_resolution)
+{
+    if (mP_detector_resolution.get()!=p_detector_resolution) {
+        mP_detector_resolution.reset(p_detector_resolution);
+    }
+}
+
+const IDetectorResolution* IDetector2D::getDetectorResolutionFunction() const
+{
+    return mP_detector_resolution.get();
+}
+
+bool IDetector2D::isCorrectAxisIndex(size_t index) const
+{
+    return index < getDimension();
+}
diff --git a/Core/Instrument/IDetector2D.h b/Core/Instrument/IDetector2D.h
new file mode 100644
index 0000000..323d338
--- /dev/null
+++ b/Core/Instrument/IDetector2D.h
@@ -0,0 +1,195 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IDetector2D.h
+//! @brief     Defines interface IDetector2D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IDETECTOR2D_H
+#define IDETECTOR2D_H
+
+#include "IParameterized.h"
+#include "Beam.h"
+#include "DetectorMask.h"
+#include "SafePointerVector.h"
+#include "DetectionProperties.h"
+#include <memory>
+
+template<class T> class OutputData;
+class Beam;
+class IAxis;
+class IDetectorResolution;
+class IPixelMap;
+class SimulationElement;
+class DetectionProperties;
+class RegionOfInterest;
+namespace Geometry {
+    class IShape2D;
+}
+
+//! @class IDetector
+//! @ingroup simulation
+//! @brief The detector interface.
+
+class BA_CORE_API_ IDetector2D : public ICloneable, public IParameterized
+{
+public:
+    enum EAxesUnits {DEFAULT, NBINS, RADIANS, DEGREES, MM, QYQZ};
+
+    IDetector2D();
+
+    virtual IDetector2D* clone() const=0;
+
+    virtual ~IDetector2D();
+
+    //! Inits detector with the beam settings
+    virtual void init(const Beam&) {}
+
+    void addAxis(const IAxis& axis);
+
+    const IAxis& getAxis(size_t index) const;
+
+    size_t getDimension() const;
+
+    void clear();
+
+    //! Sets detector parameters using angle ranges
+    void setDetectorParameters(size_t n_x, double x_min, double x_max,
+                               size_t n_y, double y_min, double y_max);
+
+    //! Sets detector parameters using axes
+    void setDetectorAxes(const IAxis& axis0, const IAxis& axis1);
+
+    //! Sets the detector resolution
+    void setDetectorResolution(IDetectorResolution* p_detector_resolution);
+
+    //! Applies the detector resolution to the given intensity maps
+    void applyDetectorResolution(OutputData<double>* p_intensity_map) const;
+
+    const IDetectorResolution* getDetectorResolutionFunction() const;
+
+    //! Sets the polarization analyzer characteristics of the detector
+    void setAnalyzerProperties(const kvector_t direction, double efficiency,
+                               double total_transmission);
+
+    //! removes all masks from the detector
+    void removeMasks();
+
+    //! Adds mask of given shape to the stack of detector masks. The mask value 'true' means
+    //! that the channel will be excluded from the simulation. The mask which is added last
+    //! has priority.
+    //! @param shape The shape of mask (Rectangle, Polygon, Line, Ellipse)
+    //! @param mask_value The value of mask
+    void addMask(const Geometry::IShape2D& shape, bool mask_value = true);
+
+    //! Put the mask for all detector channels (i.e. exclude whole detector from the analysis)
+    void maskAll();
+
+    const DetectorMask* getDetectorMask() const;
+
+    size_t numberOfMaskedChannels() const;
+
+    bool isMasked(size_t index) const;
+
+    //! return true if has masks
+    bool hasMasks() const;
+
+#ifndef SWIG
+    //! Create a vector of SimulationElement objects according to the detector and its mask
+    std::vector<SimulationElement> createSimulationElements(const Beam& beam);
+
+    //! Creates single simulation element.
+    SimulationElement getSimulationElement(size_t index, const Beam& beam) const;
+#endif
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    virtual std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const;
+
+    //! Returns new intensity map with detector resolution applied and axes in requested units
+    OutputData<double>* createDetectorIntensity(const std::vector<SimulationElement> &elements,
+            const Beam& beam, IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const;
+
+    //! Returns empty detector map in given axes units.
+    virtual OutputData<double>* createDetectorMap(const Beam& beam, EAxesUnits units) const;
+
+    //! Inits axes of OutputData to match the detector and sets values to zero.
+    virtual void initOutputData(OutputData<double> &data) const;
+
+    //! returns vector of valid axes units
+    virtual std::vector<EAxesUnits> getValidAxesUnits() const;
+
+    //! return default axes units
+    virtual EAxesUnits getDefaultAxesUnits() const { return DEFAULT; }
+
+    //! Returns region of  interest if exists.
+    const RegionOfInterest* regionOfInterest() const;
+
+    //! Sets rectangular region of interest with lower left and upper right corners defined.
+    void setRegionOfInterest(double xlow, double ylow, double xup, double yup);
+
+    //! Resets region of interest making whole detector plane available for the simulation.
+    void resetRegionOfInterest();
+
+    //! Returns total number of pixels
+    size_t getTotalSize() const;
+
+    //! Calculate axis index for given global index
+    size_t getAxisBinIndex(size_t index, size_t selected_axis) const;
+
+    //! Returns number of simulation elements.
+    size_t numberOfSimulationElements() const;
+
+protected:
+    IDetector2D(const IDetector2D& other);
+
+    //! Create an IPixelMap for the given OutputData object and index
+    virtual IPixelMap* createPixelMap(size_t index) const=0;
+
+    //! Registers some class members for later access via parameter pool.
+    virtual void init_parameters() {}
+
+    //! Generates an axis with correct name and default binning for given index
+    virtual IAxis* createAxis(size_t index, size_t n_bins, double min, double max) const=0;
+
+    //! Constructs axis with min,max corresponding to selected units
+    std::unique_ptr<IAxis> constructAxis(size_t axis_index, const Beam& beam,
+                                         EAxesUnits units) const;
+
+    //! Calculates axis range from original detector axes in given units (mm, rad, etc)
+    virtual void calculateAxisRange(size_t axis_index, const Beam& beam, EAxesUnits units,
+                                    double &amin, double &amax) const;
+
+    //! Returns the name for the axis with given index
+    virtual std::string getAxisName(size_t index) const=0;
+
+    bool isCorrectAxisIndex(size_t index) const;
+
+    //! Calculate global index from two axis indices
+    size_t getGlobalIndex(size_t x, size_t y) const;
+
+    //! Returns index of pixel that contains the specular wavevector.
+    //! If no pixel contains this specular wavevector, the number of pixels is
+    //! returned. This corresponds to an overflow index.
+    virtual size_t getIndexOfSpecular(const Beam& beam) const=0;
+
+    SafePointerVector<IAxis> m_axes;
+    std::unique_ptr<IDetectorResolution> mP_detector_resolution;
+    DetectorMask m_detector_mask;
+
+private:
+    void setDataToDetectorMap(OutputData<double> &detectorMap,
+                              const std::vector<SimulationElement> &elements) const;
+    std::unique_ptr<RegionOfInterest> m_region_of_interest;
+    DetectionProperties m_detection_properties;
+};
+
+#endif // IDETECTOR2D_H
diff --git a/Core/Instrument/IDetectorResolution.h b/Core/Instrument/IDetectorResolution.h
new file mode 100644
index 0000000..8af4aeb
--- /dev/null
+++ b/Core/Instrument/IDetectorResolution.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IDetectorResolution.h
+//! @brief     Defines class IDetectorResolution.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IDETECTORRESOLUTION_H
+#define IDETECTORRESOLUTION_H
+
+#include "IParameterized.h"
+#include "OutputData.h"
+#include "ICloneable.h"
+
+//! @class IDetectorResolution
+//! @ingroup algorithms_internal
+//! @brief Interface for detector resolution algorithms
+
+class BA_CORE_API_ IDetectorResolution : public ICloneable, public IParameterized
+{
+public:
+    virtual ~IDetectorResolution() {}
+    //! Apply the resolution function to the intensity data
+    virtual void applyDetectorResolution(OutputData<double> *p_intensity_map) const=0;
+#ifndef SWIG
+    //! Applies the detector resolution to the matrix-valued intensity data
+    void applyDetectorResolutionPol(
+            OutputData<Eigen::Matrix2d> *p_matrix_intensity) const;
+#endif
+    virtual IDetectorResolution *clone() const = 0;
+};
+
+#endif // IDETECTORRESOLUTION_H
diff --git a/Core/Instrument/IHistogram.cpp b/Core/Instrument/IHistogram.cpp
new file mode 100644
index 0000000..1245e88
--- /dev/null
+++ b/Core/Instrument/IHistogram.cpp
@@ -0,0 +1,391 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IHistogram.cpp
+//! @brief     Implements class IntensityDataObject.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Histogram1D.h"
+#include "Histogram2D.h"
+#include "IntensityDataIOFactory.h"
+#include "Numeric.h"
+#include <memory>
+
+IHistogram::IHistogram()
+{
+}
+
+IHistogram::IHistogram(const IHistogram& other)
+{
+    m_data.copyFrom(other.m_data);
+}
+
+IHistogram::IHistogram(const IAxis& axis_x)
+{
+    m_data.addAxis(axis_x);
+}
+
+IHistogram::IHistogram(const IAxis& axis_x, const IAxis& axis_y)
+{
+    m_data.addAxis(axis_x);
+    m_data.addAxis(axis_y);
+}
+
+size_t IHistogram::getTotalNumberOfBins() const
+{
+    return m_data.getAllocatedSize();
+}
+
+const IAxis& IHistogram::getXaxis() const
+{
+    check_x_axis();
+    return m_data.getAxis(0);
+}
+
+const IAxis& IHistogram::getYaxis() const
+{
+    check_y_axis();
+    return m_data.getAxis(1);
+}
+
+double IHistogram::getXmin() const
+{
+    return getXaxis().getMin();
+}
+
+double IHistogram::getXmax() const
+{
+    return getXaxis().getMax();
+}
+
+size_t IHistogram::getNbinsX() const
+{
+    return getXaxis().size();
+}
+
+double IHistogram::getYmin() const
+{
+    return getYaxis().getMin();
+}
+
+double IHistogram::getYmax() const
+{
+    return getYaxis().getMax();
+}
+
+size_t IHistogram::getNbinsY() const
+{
+    return getYaxis().size();
+}
+
+size_t IHistogram::getGlobalBin(size_t binx, size_t biny) const
+{
+    std::vector<int > axes_indices;
+    axes_indices.push_back(binx);
+    if(getRank() == 2) axes_indices.push_back(biny);
+    return m_data.toGlobalIndex(axes_indices);
+}
+
+size_t IHistogram::findGlobalBin(double x, double y) const
+{
+    std::vector<double> coordinates;
+    coordinates.push_back(x);
+    if(getRank() == 2) coordinates.push_back(y);
+    return m_data.findGlobalIndex(coordinates);
+}
+
+int IHistogram::getXaxisIndex(size_t i) const
+{
+    return m_data.getAxisBinIndex(i, 0);
+}
+
+int IHistogram::getYaxisIndex(size_t i) const
+{
+    return m_data.getAxisBinIndex(i, 1);
+}
+
+double IHistogram::getXaxisValue(size_t i)
+{
+    check_x_axis();
+    return m_data.getAxisValue(i, 0);
+}
+
+double IHistogram::getYaxisValue(size_t i)
+{
+    check_y_axis();
+    return m_data.getAxisValue(i, 1);
+}
+
+double IHistogram::getBinContent(size_t i) const
+{
+    return m_data[i].getContent();
+}
+
+double IHistogram::getBinContent(size_t binx, size_t biny) const
+{
+    return getBinContent(getGlobalBin(binx, biny));
+}
+
+void IHistogram::setBinContent(size_t i, double value)
+{
+    m_data[i].setContent(value);
+}
+
+void IHistogram::addBinContent(size_t i, double value)
+{
+    m_data[i].add(value);
+}
+
+double IHistogram::getBinError(size_t i) const
+{
+    return m_data[i].getRMS();
+}
+
+double IHistogram::getBinError(size_t binx, size_t biny) const
+{
+    return getBinError(getGlobalBin(binx, biny));
+}
+
+double IHistogram::getBinAverage(size_t i) const
+{
+    return m_data[i].getAverage();
+}
+
+double IHistogram::getBinAverage(size_t binx, size_t biny) const
+{
+    return getBinAverage(getGlobalBin(binx, biny));
+}
+
+int IHistogram::getBinNumberOfEntries(size_t i) const
+{
+    return m_data[i].getNumberOfEntries();
+}
+
+int IHistogram::getBinNumberOfEntries(size_t binx, size_t biny) const
+{
+    return getBinNumberOfEntries(getGlobalBin(binx, biny));
+}
+
+double IHistogram::getMaximum() const
+{
+    OutputData<CumulativeValue>::const_iterator it =
+         std::max_element(m_data.begin(), m_data.end());
+    return it->getContent();
+}
+
+size_t IHistogram::getMaximumBinIndex() const
+{
+    OutputData<CumulativeValue>::const_iterator it =
+         std::max_element(m_data.begin(), m_data.end());
+    return std::distance(m_data.begin(), it);
+}
+
+double IHistogram::getMinimum() const
+{
+    OutputData<CumulativeValue>::const_iterator it =
+         std::min_element(m_data.begin(), m_data.end());
+    return it->getContent();
+}
+
+size_t IHistogram::getMinimumBinIndex() const
+{
+    return std::distance(m_data.begin(), std::min_element(m_data.begin(), m_data.end()) );
+}
+
+void IHistogram::scale(double value)
+{
+    for(size_t index=0; index<getTotalNumberOfBins(); ++index) {
+        m_data[index].setContent(value*m_data[index].getContent());
+    }
+}
+
+double IHistogram::integral() const
+{
+    double result(0.0);
+    for(size_t index=0; index<getTotalNumberOfBins(); ++index) {
+        result += m_data[index].getContent();
+    }
+    return result;
+}
+
+#ifdef BORNAGAIN_PYTHON
+PyObject* IHistogram::getArray(DataType dataType) const
+{
+    const std::unique_ptr<OutputData<double>> data(createOutputData(dataType));
+    return data->getArray();
+}
+#endif // BORNAGAIN_PYTHON
+
+void IHistogram::reset()
+{
+    m_data.setAllTo(CumulativeValue());
+}
+
+IHistogram* IHistogram::createHistogram(const OutputData<double>& source)
+{
+    if(source.getRank() == 1) {
+        return new Histogram1D(source);
+    } else if(source.getRank() == 2) {
+        return new Histogram2D(source);
+    } else {
+        std::ostringstream message;
+        message << "IHistogram::createHistogram(const OutputData<double>& source) -> Error. ";
+        message << "The rank of source " << source.getRank() << " ";
+        message << "is not suitable for creation neither 1-dim nor 2-dim histograms.";
+        throw Exceptions::LogicErrorException(message.str());
+    }
+}
+
+IHistogram* IHistogram::createFrom(const std::string& filename)
+{
+    return IntensityDataIOFactory::readIntensityData(filename);
+}
+
+IHistogram* IHistogram::createFrom(const std::vector<std::vector<double>>& data)
+{
+    return new Histogram2D(data);
+}
+
+void IHistogram::check_x_axis() const
+{
+    if(getRank() <1) {
+        std::ostringstream message;
+        message << "IHistogram::check_x_axis() -> Error. X-xis does not exist. ";
+        message << "Rank of histogram " << getRank() << "." << std::endl;
+        throw Exceptions::LogicErrorException(message.str());
+    }
+}
+
+void IHistogram::check_y_axis() const
+{
+    if(getRank() <2) {
+        std::ostringstream message;
+        message << "IHistogram::check_y_axis() -> Error. Y-axis does not exist. ";
+        message << "Rank of histogram " << getRank() << "." << std::endl;
+        throw Exceptions::LogicErrorException(message.str());
+    }
+}
+
+void IHistogram::init_from_data(const OutputData<double>& source)
+{
+    if(getRank() != source.getRank()) {
+        std::ostringstream message;
+        message << "IHistogram::IHistogram(const OutputData<double>& data) -> Error. ";
+        message << "The dimension of this histogram " << getRank() << " ";
+        message << "is differ from the dimension of source " << m_data.getRank() << std::endl;
+        throw Exceptions::LogicErrorException(message.str());
+    }
+
+    m_data.copyShapeFrom(source);
+    for(size_t i=0; i<source.getAllocatedSize(); ++i) {
+        m_data[i].add(source[i]);
+    }
+}
+
+//! returns data of requested type for globalbin number
+double IHistogram::getBinData(size_t i, IHistogram::DataType dataType) const
+{
+    if(dataType == DataType::INTEGRAL) {
+        return getBinContent(i);
+    } else if(dataType == DataType::AVERAGE) {
+        return getBinAverage(i);
+    } else if(dataType == DataType::STANDARD_ERROR) {
+        return getBinError(i);
+    } else if(dataType == DataType::NENTRIES) {
+        return getBinNumberOfEntries(i);
+    } else
+        throw Exceptions::LogicErrorException(
+            "IHistogram::getBinData() -> Error. Unknown data type.");
+}
+
+//! returns vector of values of requested DataType
+std::vector<double> IHistogram::getDataVector(IHistogram::DataType dataType) const
+{
+    std::vector<double> result;
+    result.resize(getTotalNumberOfBins(), 0.0);
+    for(size_t index=0; index<getTotalNumberOfBins(); ++index) {
+        result[index] = getBinData(index, dataType);
+    }
+    return result;
+}
+
+//! Copy content (but not the axes) from other histogram. Dimensions should be the same.
+void IHistogram::copyContentFrom(const IHistogram& other)
+{
+    if(!hasSameDimensions(other))
+        throw Exceptions::LogicErrorException(
+            "IHistogram::copyContentFrom() -> Error. Can't copy the data of different shape.");
+    reset();
+    for(size_t i=0; i<getTotalNumberOfBins(); ++i) {
+        m_data[i] = other.m_data[i];
+    }
+
+}
+
+//! creates new OutputData with histogram's shape and put there values corresponding to DataType
+OutputData<double>* IHistogram::createOutputData(IHistogram::DataType dataType) const
+{
+    OutputData<double>* result = new OutputData<double>;
+    result->copyShapeFrom(m_data);
+    for(size_t i=0; i<getTotalNumberOfBins(); ++i) {
+        (*result)[i] = getBinData(i, dataType);
+    }
+    return result;
+}
+
+bool IHistogram::hasSameShape(const IHistogram& other) const
+{
+    return m_data.hasSameShape(other.m_data);
+}
+
+bool IHistogram::hasSameDimensions(const IHistogram& other) const
+{
+    return m_data.hasSameDimensions(other.m_data);
+}
+
+const IHistogram& IHistogram::operator+=(const IHistogram& right)
+{
+    if(!hasSameDimensions(right))
+        throw Exceptions::LogicErrorException(
+            "IHistogram::operator+=() -> Error. Histograms have different dimension");
+    for(size_t i=0; i<getTotalNumberOfBins(); ++i)
+        addBinContent(i, right.getBinContent(i));
+    return *this;
+}
+
+// TODO merge with IntensityDataFunctions::createRelativeDifferenceData
+IHistogram* IHistogram::relativeDifferenceHistogram(const IHistogram& rhs)
+{
+    if(!hasSameDimensions(rhs))
+        throw Exceptions::LogicErrorException(
+            "IHistogram::relativeDifferenceHistogram() -> Error. "
+            "Histograms have different dimensions");
+
+    IHistogram* result = this->clone();
+    result->reset();
+
+    for(size_t i=0; i<getTotalNumberOfBins(); ++i) {
+        double diff = Numeric::get_relative_difference(getBinContent(i), rhs.getBinContent(i));
+        result->setBinContent(i, diff);
+    }
+    return result;
+}
+
+void IHistogram::save(const std::string& filename)
+{
+    IntensityDataIOFactory::writeIntensityData(*this, filename);
+}
+
+void IHistogram::load(const std::string& filename)
+{
+    const std::unique_ptr<IHistogram> hist(IntensityDataIOFactory::readIntensityData(filename));
+    copyContentFrom(*hist);
+}
diff --git a/Core/Instrument/IHistogram.h b/Core/Instrument/IHistogram.h
new file mode 100644
index 0000000..5e4eca9
--- /dev/null
+++ b/Core/Instrument/IHistogram.h
@@ -0,0 +1,224 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IHistogram.h
+//! @brief     Defines class IHistogram.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IHISTOGRAM_H
+#define IHISTOGRAM_H
+
+#include "CumulativeValue.h"
+#include "OutputData.h"
+
+#ifdef BORNAGAIN_PYTHON
+#ifndef PyObject_HEAD
+struct _object;
+typedef _object PyObject;
+#endif
+#endif
+
+class Histogram1D;
+
+//! Base class for 1D and 2D histograms holding values of double type.
+//! @ingroup tools
+
+class BA_CORE_API_ IHistogram
+{
+public:
+    enum DataType {
+        INTEGRAL,
+        AVERAGE,
+        STANDARD_ERROR,
+        NENTRIES
+    };
+
+    IHistogram();
+    IHistogram(const IHistogram& other);
+    virtual ~IHistogram(){}
+
+    IHistogram(const IAxis& axis_x);
+    IHistogram(const IAxis& axis_x, const IAxis& axis_y);
+
+    virtual IHistogram* clone() const = 0;
+
+    //! Returns number of histogram dimensions.
+    virtual size_t getRank() const = 0;
+
+    //! Returns total number of histogram bins. For 2D histograms the result will be the product
+    //! of bin numbers along X and Y axes.
+    size_t getTotalNumberOfBins() const;
+
+    //! returns x-axis
+    const IAxis& getXaxis() const;
+
+    //! returns y-axis for 2D histograms
+    const IAxis& getYaxis() const;
+
+    //! Returns x-axis min (lower edge of first bin).
+    double getXmin() const;
+
+    //! Returns x-axis max (upper edge of last bin).
+    double getXmax() const;
+
+    //! Returns number of bins on x-axis
+    size_t getNbinsX() const;
+
+    //! Returns y-axis min (lower edge of first bin) for 2D histograms.
+    double getYmin() const;
+
+    //! Returns y-axis max (upper edge of last bin) for 2D histograms.
+    double getYmax() const;
+
+    //! Returns number of bins on y-axis
+    size_t getNbinsY() const;
+
+    //! @brief Returns global bin index for given axes indices. For 1D histogram the global bin
+    //! index coinside with x-axis index.
+    //! @param binx x-axis bin index
+    //! @param biny y-axis bin index (for 2D histograms)
+    //! @return The global bin index
+    size_t getGlobalBin(size_t binx, size_t biny = 0) const;
+
+    //! @brief Returns closest global bin index for given axes coordinates. For 1D
+    //! @param x Value on x-axis
+    //! @param y Value on y-axis (for 2D histograms)
+    //! @return Closest global bin index
+    size_t findGlobalBin(double x, double y) const;
+
+    //! Returns x-axis bin index for given globalbin. For 1D histograms returned value conicide
+    //! with globalbin value.
+    int getXaxisIndex(size_t i) const;
+
+    //! Returns y-axis bin index for given globalbin (for 2D histograms).
+    int getYaxisIndex(size_t i) const;
+
+    //! @brief Returns the value on x-axis corresponding to the global bin index.
+    //! @param globalbin The global bin index
+    //! @return The center of corresponding bin of the axis
+    double getXaxisValue(size_t i);
+
+    //! @brief Returns the value on y-axis corresponding to the 2D histogram global bin index.
+    //! @param globalbin The global bin index
+    //! @return The center of corresponding bin of the axis
+    double getYaxisValue(size_t i);
+
+    //! @brief Returns content (accumulated value) of the bin with given index.
+    //! @param globalbin The global bin index
+    //! @return The value accumulated by the bin (integral)
+    double getBinContent(size_t i) const;
+
+    const OutputData<CumulativeValue>& getData() const { return m_data; }
+    OutputData<CumulativeValue>& getData() { return m_data; }
+
+    //! @brief Returns content (accumulated value) of the 2D histogram bin with given indices.
+    //! @param binx x-axis bin index
+    //! @param biny y-axis bin index
+    //! @return The value accumulated by the bin (integral)
+    double getBinContent(size_t binx, size_t biny) const;
+
+    //! Sets content of the bin corresponding to the globalbin number
+    void setBinContent(size_t i, double value);
+
+    //! Add the value to the bin
+    void addBinContent(size_t i, double value);
+
+    //! Returns error of the bin with given index.
+    double getBinError(size_t i) const;
+
+    //! Returns error of the bin with given indices (for 2D histograms).
+    double getBinError(size_t binx, size_t biny) const;
+
+    //! Returns average value in the bin with given index.
+    double getBinAverage(size_t i) const;
+
+    //! Returns average value of the bin with given indices (for 2D histograms).
+    double getBinAverage(size_t binx, size_t biny) const;
+
+    //! Returns number of entries in the bin with given index.
+    int getBinNumberOfEntries(size_t i) const;
+
+    //! Returns number of entries in the bin with given indices (for 2D histograms).
+    int getBinNumberOfEntries(size_t binx, size_t biny) const;
+
+    //! Returns histogram maximum value (maximum of getBinContent() over all bins)
+    double getMaximum() const;
+
+    //! Returns globalbin index with maximum content
+    size_t getMaximumBinIndex() const;
+
+    //! Returns histogram minimum value (minimum of getBinContent() over all bins)
+    double getMinimum() const;
+
+    //! Returns globalbin index with minimum content
+    size_t getMinimumBinIndex() const;
+
+    //! Multiply this histogram (every bin content value) by a constant
+    void scale(double value);
+
+    //! Returns integral of bins content (computed as a sum of all bin content).
+    double integral() const;
+
+//    double& operator[](size_t index);
+//    const double& operator[](size_t index) const;
+
+
+#ifdef BORNAGAIN_PYTHON
+    //! Returns numpy array with bin content (accumulated values)
+    PyObject* getArray(DataType dataType = DataType::INTEGRAL) const;
+#endif
+
+    //! Reset histogram content (axes remains)
+    void reset();
+
+    static IHistogram* createHistogram(const OutputData<double>& source);
+
+    //! create new histogram from file content
+    static IHistogram* createFrom(const std::string& filename);
+
+    //! create new histogram from numpy array
+    static IHistogram* createFrom(const std::vector<std::vector<double>>& data);
+
+    //! creates new OutputData with histogram's shape and values corresponding to DataType
+    OutputData<double>* createOutputData(DataType dataType = DataType::INTEGRAL) const;
+
+    //! Returns true if objects a) have same dimensions b) bin boundaries of axes coincide
+    bool hasSameShape(const IHistogram& other) const;
+
+    //! Returns true if object have same rank and number of axes bins
+    bool hasSameDimensions(const IHistogram& other) const;
+
+    //! addition-assignment operator for two histograms
+    const IHistogram& operator+=(const IHistogram& right);
+
+    //! returns histogram representing relative difference of two histograms.
+    IHistogram* relativeDifferenceHistogram(const IHistogram& rhs);
+
+    //! Saves histogram in file
+    //! Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz)
+    void save(const std::string& filename);
+
+    //! Loads histogram from file, the shape of array in file should match
+    //! Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz)
+    //! Only bin content will be loaded, histogram axes remain the same.
+    void load(const std::string& filename);
+
+protected:
+    void check_x_axis() const;
+    void check_y_axis() const;
+    void init_from_data(const OutputData<double>& source);
+    double getBinData(size_t i, DataType dataType) const;
+    std::vector<double> getDataVector(DataType dataType) const;
+    void copyContentFrom(const IHistogram& other);
+    OutputData<CumulativeValue> m_data;
+};
+
+#endif // IHISTOGRAM_H
diff --git a/Core/Instrument/IIntensityFunction.cpp b/Core/Instrument/IIntensityFunction.cpp
new file mode 100644
index 0000000..2b59113
--- /dev/null
+++ b/Core/Instrument/IIntensityFunction.cpp
@@ -0,0 +1,27 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IIntensityFunction.cpp
+//! @brief     Implements the classes IntensityFunctionLog, IntensityFunctionSqrt
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IIntensityFunction.h"
+#include <cmath>
+
+double IntensityFunctionLog::evaluate(double value) const
+{
+    return value > 0 ? std::log(value) : 0;
+}
+
+double IntensityFunctionSqrt::evaluate(double value) const
+{
+    return value > 0 ? std::sqrt(value) : 0;
+}
diff --git a/Core/Instrument/IIntensityFunction.h b/Core/Instrument/IIntensityFunction.h
new file mode 100644
index 0000000..164c9a2
--- /dev/null
+++ b/Core/Instrument/IIntensityFunction.h
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IIntensityFunction.h
+//! @brief     Defines and implements the interface class IIntensityFunction
+//!            and its child classes IntensityFunctionLog, IntensityFunctionSqrt
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IINTENSITYFUNCTION_H
+#define IINTENSITYFUNCTION_H
+
+#include "WinDllMacros.h"
+
+//! @class IIntensityFunction
+//! @ingroup algorithms_internal
+//! @brief Interface for applying arbitrary function to the measured intensity
+
+class BA_CORE_API_ IIntensityFunction
+{
+public:
+    virtual ~IIntensityFunction() {}
+    virtual IIntensityFunction *clone() const=0;
+
+    virtual double evaluate(double value) const=0;
+};
+
+
+//! @class IntensityFunctionLog
+//! @ingroup algorithms_internal
+//! @brief Algorithm for applying log function to the measured intensity
+
+class BA_CORE_API_ IntensityFunctionLog : public IIntensityFunction
+{
+public:
+    virtual ~IntensityFunctionLog() {}
+    virtual IntensityFunctionLog *clone() const { return new IntensityFunctionLog(); }
+    virtual double evaluate(double value) const;
+};
+
+
+//! @class IntensityFunctionSqrt
+//! @ingroup algorithms_internal
+//! @brief Algorithm for applying sqrt function to the measured intensity
+
+class BA_CORE_API_ IntensityFunctionSqrt : public IIntensityFunction
+{
+public:
+    virtual ~IntensityFunctionSqrt() {}
+    virtual IntensityFunctionSqrt *clone() const { return new IntensityFunctionSqrt(); }
+    virtual double evaluate(double value) const;
+};
+
+#endif // IINTENSITYFUNCTION_H
diff --git a/Core/Instrument/IIntensityNormalizer.cpp b/Core/Instrument/IIntensityNormalizer.cpp
new file mode 100644
index 0000000..9c2be9c
--- /dev/null
+++ b/Core/Instrument/IIntensityNormalizer.cpp
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IIntensityNormalizer.cpp
+//! @brief     Implements class IntensityNormalizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IIntensityNormalizer.h"
+
+void IntensityNormalizer::init_parameters()
+{
+    registerParameter("scale", &m_scale);
+    registerParameter("shift", &m_shift);
+}
+
+IntensityNormalizer* IntensityNormalizer::clone() const
+{
+    IntensityNormalizer* result = new IntensityNormalizer(m_scale, m_shift);
+    result->setMaximumIntensity(m_max_intensity);
+    result->setName(getName());
+    return result;
+}
+
+OutputData<double>* IntensityNormalizer::createNormalizedData(
+        const OutputData<double>& data) const
+{
+    OutputData<double >* normalized_data = data.clone();
+    apply(*normalized_data);
+    return normalized_data;
+}
+
+void IntensityNormalizer::apply(OutputData<double>& data) const
+{
+    double factor = m_max_intensity;
+    if(factor == 0) {
+        // using self maximum amplitude for normalization
+        OutputData<double>::const_iterator it = std::max_element(data.begin(), data.end());
+        factor = *it;
+    }
+    if(factor == 0)
+        throw Exceptions::DivisionByZeroException(
+                "IntensityNormalizer::apply() -> "
+                "Error! Maximum intensity is 0.");
+
+    for(auto& value : data) {
+        value = m_scale*(value/factor) + m_shift;
+    }
+}
diff --git a/Core/Instrument/IIntensityNormalizer.h b/Core/Instrument/IIntensityNormalizer.h
new file mode 100644
index 0000000..3afa9dd
--- /dev/null
+++ b/Core/Instrument/IIntensityNormalizer.h
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IIntensityNormalizer.h
+//! @brief     Defines classes IOutputDataNormalizer,
+//!              OutputDataNormalizer, OutputDataSimpleNormalizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IINTENSITYNORMALIZER_H
+#define IINTENSITYNORMALIZER_H
+
+#include "IParameterized.h"
+#include "OutputData.h"
+
+
+//! Interface to OutputData normalizers.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ IIntensityNormalizer : public IParameterized
+{
+public:
+    virtual ~IIntensityNormalizer() {}
+
+    virtual IIntensityNormalizer* clone() const=0;
+
+    virtual OutputData<double>* createNormalizedData(
+            const OutputData<double>& data) const=0;
+
+    virtual void apply(OutputData<double>& data) const=0;
+
+    virtual void setMaximumIntensity(double) =0;
+};
+
+
+//! Standard OutputData normalizer, with configurable max_intensity.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ IntensityNormalizer : public IIntensityNormalizer
+{
+public:
+    IntensityNormalizer(double scale=1.0, double shift=0.0)
+        : m_scale(scale), m_shift(shift), m_max_intensity(0.0)
+    {
+        setName("Normalizer");
+        init_parameters();
+    }
+
+    virtual ~IntensityNormalizer() {}
+
+    virtual IntensityNormalizer* clone() const;
+
+    virtual OutputData<double>* createNormalizedData(const OutputData<double >& data) const;
+
+    void apply(OutputData<double>& data) const final;
+
+    virtual void setMaximumIntensity(double max_intensity) {
+        m_max_intensity = max_intensity; }
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    void init_parameters();
+
+    double m_scale;
+    double m_shift;
+    double m_max_intensity;
+};
+
+
+//! Simplified OutputData normalizer, with max_intensity=1.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ IntensityScaleAndShiftNormalizer : public IntensityNormalizer
+{
+public:
+    IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)
+        : IntensityNormalizer(scale, shift) { m_max_intensity = 1.0; }
+
+    ~IntensityScaleAndShiftNormalizer() final {}
+
+    void setMaximumIntensity(double) final {}
+
+    IntensityScaleAndShiftNormalizer* clone() const final {
+        return new IntensityScaleAndShiftNormalizer(m_scale, m_shift); }
+};
+
+#endif // IINTENSITYNORMALIZER_H
diff --git a/Core/Instrument/IResolutionFunction2D.h b/Core/Instrument/IResolutionFunction2D.h
new file mode 100644
index 0000000..d3047da
--- /dev/null
+++ b/Core/Instrument/IResolutionFunction2D.h
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IResolutionFunction2D.h
+//! @brief     Defines interface class IResolutionFunction2D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IRESOLUTIONFUNCTION2D_H
+#define IRESOLUTIONFUNCTION2D_H
+
+#include "IParameterized.h"
+
+//! @class IResolutionFunction2D
+//! @ingroup algorithms_internal
+//! @brief Interface providing two-dimensional resolution function.
+
+class BA_CORE_API_ IResolutionFunction2D : public IParameterized
+{
+public:
+    virtual ~IResolutionFunction2D() {}
+
+    virtual double evaluateCDF(double x, double y) const=0;
+    virtual IResolutionFunction2D *clone() const = 0;
+};
+
+#endif // IRESOLUTIONFUNCTION2D_H
diff --git a/Core/Instrument/ISquaredFunction.h b/Core/Instrument/ISquaredFunction.h
new file mode 100644
index 0000000..7352fa1
--- /dev/null
+++ b/Core/Instrument/ISquaredFunction.h
@@ -0,0 +1,185 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/ISquaredFunction.h
+//! @brief     Defines classes ISquaredFunction, SquaredFunctionDefault, ...
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISQUAREDFUNCTION_H
+#define ISQUAREDFUNCTION_H
+
+#include "Numeric.h" // TODO rm this from .h
+
+//! @class ISquaredFunction
+//! @ingroup fitting_internal
+//! @brief Interface providing measures for deviation between two values.
+//!
+//! Used By ChiSquaredModule for chi2 calculations
+
+class BA_CORE_API_ ISquaredFunction
+{
+public:
+    ISquaredFunction(){}
+    virtual ~ISquaredFunction() {}
+    virtual ISquaredFunction* clone() const=0;
+    virtual double calculateSquaredDifference(
+                double real_value, double simulated_value) const=0;
+    virtual double calculateSquaredError(
+                double real_value, double simulated_value = 0.0) const = 0;
+
+private:
+    ISquaredFunction(const ISquaredFunction& );
+    ISquaredFunction& operator=(const ISquaredFunction& );
+};
+
+
+//! @class SquaredFunctionDefault
+//! @ingroup fitting
+//! @brief Squared difference between two values.
+//!
+//! value = (a-b)*(a-b)/norm, where
+//! norm = max(b, 1.0)
+//! a - simulated values, b - real_values
+
+class BA_CORE_API_ SquaredFunctionDefault : public ISquaredFunction
+{
+public:
+    SquaredFunctionDefault() {}
+    virtual ~SquaredFunctionDefault() {}
+    virtual SquaredFunctionDefault* clone() const { return new SquaredFunctionDefault(); }
+
+    virtual double calculateSquaredDifference(double real_value, double simulated_value) const
+    {
+        if (Numeric::areAlmostEqual(real_value, simulated_value))
+            return 0.;
+        double diff_squared = (simulated_value-real_value)*(simulated_value-real_value);
+        double normalization = calculateSquaredError(real_value);
+        return diff_squared/normalization;
+    }
+
+    virtual double calculateSquaredError(double real_value, double simulated_value = 0) const
+    {
+        (void) simulated_value;
+        return std::max(real_value,1.0);
+    }
+};
+
+
+//! @class SquaredFunctionSimError
+//! @ingroup fitting
+//! @brief Squared difference between two values.
+//!
+//! value = (a-b)*(a-b)/norm, where
+//! norm = max(a, 1.0)
+//! a - simulated values, b - real_values
+
+class BA_CORE_API_ SquaredFunctionSimError : public ISquaredFunction
+{
+public:
+    SquaredFunctionSimError() {}
+    virtual ~SquaredFunctionSimError() {}
+    virtual SquaredFunctionSimError *clone() const { return new SquaredFunctionSimError(); }
+    virtual double calculateSquaredDifference(double real_value, double simulated_value) const {
+        if (Numeric::areAlmostEqual(real_value, simulated_value))
+            return 0.0;
+        double diff_squared = (simulated_value-real_value)*(simulated_value-real_value);
+        double normalization = calculateSquaredError(real_value, simulated_value);
+        return diff_squared/normalization;
+    }
+    virtual double calculateSquaredError(double /* real_value */, double simulated_value) const {
+        return std::max(simulated_value,1.0);
+    }
+};
+
+
+//! @class SquaredFunctionMeanSquaredError
+//! @ingroup fitting
+//! @brief Squared difference between two values normalized by mean squared error
+//!
+//! value = (a-b)*(a-b)/norm, where
+//! norm = sqrt(sigma1*sigma1 + sigma2*sigma2), sigma1=max(a, 1.0), sigma2=max(b,1.0)
+
+class BA_CORE_API_ SquaredFunctionMeanSquaredError : public ISquaredFunction
+{
+public:
+    SquaredFunctionMeanSquaredError() {}
+    virtual ~SquaredFunctionMeanSquaredError() {}
+    virtual SquaredFunctionMeanSquaredError *clone() const {
+        return new SquaredFunctionMeanSquaredError(); }
+    virtual double calculateSquaredDifference(double real_value, double simulated_value) const {
+        if (Numeric::areAlmostEqual(real_value, simulated_value)) return 0.0;
+        double diff_squared = (simulated_value-real_value)*(simulated_value-real_value);
+        double normalization = calculateSquaredError(real_value, simulated_value);
+        return diff_squared/normalization;
+    }
+    virtual double calculateSquaredError(double real_value, double simulated_value) const {
+        (void) simulated_value;
+        double sigma1 = std::max(real_value,1.0);
+        double sigma2 = std::max(simulated_value,1.0);
+        return std::sqrt(sigma1*sigma1 + sigma2*sigma2);
+    }
+};
+
+
+//! @class SquaredFunctionSystematicError
+//! @ingroup fitting
+//! @brief Squared difference between two values normalized by systematic error
+//!
+//! value = (a-b)*(a-b)/norm, where
+//! norm = max(error, 1.0), error = b + (epsilon*b)**2
+
+class BA_CORE_API_ SquaredFunctionSystematicError : public ISquaredFunction
+{
+public:
+    SquaredFunctionSystematicError(double epsilon = 0.08) : m_epsilon(epsilon){}
+    virtual ~SquaredFunctionSystematicError() {}
+    virtual SquaredFunctionSystematicError *clone() const {
+        return new SquaredFunctionSystematicError(m_epsilon); }
+    virtual double calculateSquaredDifference(double real_value, double simulated_value) const {
+        double diff_squared = (simulated_value-real_value)*(simulated_value-real_value);
+        double normalization = calculateSquaredError(real_value, simulated_value);
+        return diff_squared/normalization;
+    }
+    virtual double calculateSquaredError(double real_value, double /* simulated_value */) const {
+        return std::max(std::abs(real_value) + (m_epsilon*real_value)*(m_epsilon*real_value),1.0);
+    }
+private:
+    double m_epsilon;
+};
+
+
+//! @class SquaredFunctionGaussianError
+//! @ingroup fitting
+//! @brief Squared difference between two values with gaussian error
+//!
+//! value = (a-b)*(a-b)/norm, where
+//! norm = sigma*sigma, sigma - is set by user
+
+class BA_CORE_API_ SquaredFunctionGaussianError : public ISquaredFunction
+{
+public:
+    SquaredFunctionGaussianError(double sigma = 0.01) : m_sigma(sigma){}
+    virtual ~SquaredFunctionGaussianError() {}
+    virtual SquaredFunctionGaussianError *clone() const {
+        return new SquaredFunctionGaussianError(m_sigma); }
+    virtual double calculateSquaredDifference(double real_value, double simulated_value) const {
+        double diff_squared = (simulated_value-real_value)*(simulated_value-real_value);
+        double sigma_squared = m_sigma*m_sigma;
+        return diff_squared/sigma_squared;
+    }
+    virtual double calculateSquaredError(double, double) const {
+        return m_sigma*m_sigma;
+    }
+private:
+    double m_sigma;
+};
+
+#endif // ISQUAREDFUNCTION_H
diff --git a/Core/Instrument/Instrument.cpp b/Core/Instrument/Instrument.cpp
new file mode 100644
index 0000000..b7d64d4
--- /dev/null
+++ b/Core/Instrument/Instrument.cpp
@@ -0,0 +1,191 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Instrument.cpp
+//! @brief     Implements class Instrument.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Instrument.h"
+#include "Beam.h"
+#include "ConvolutionDetectorResolution.h"
+#include "IDetector2D.h"
+#include "IResolutionFunction2D.h"
+#include "SimulationElement.h"
+#include "SphericalDetector.h"
+
+Instrument::Instrument()
+    : IParameterized("Instrument")
+{
+    mP_detector.reset(new SphericalDetector());
+    init_parameters();
+}
+
+Instrument::Instrument(const Instrument &other) : IParameterized(), m_beam(other.m_beam)
+{
+    mP_detector.reset(other.mP_detector->clone());
+    setName(other.getName());
+    init_parameters();
+}
+
+Instrument::~Instrument() {}
+
+Instrument &Instrument::operator=(const Instrument &other)
+{
+    if (this != &other) {
+        m_beam = other.m_beam;
+        mP_detector.reset(other.mP_detector->clone());
+        init_parameters();
+    }
+    return *this;
+}
+
+void Instrument::setDetector(const IDetector2D& detector)
+{
+    mP_detector.reset(detector.clone());
+    initDetector();
+}
+
+void Instrument::setDetectorParameters(size_t n_x, double x_min, double x_max,
+                                       size_t n_y, double y_min, double y_max)
+{
+    mP_detector->setDetectorParameters(n_x, x_min, x_max, n_y, y_min, y_max);
+}
+
+void Instrument::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
+{
+    mP_detector->setDetectorAxes(axis0, axis1);
+}
+
+std::string Instrument::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path = IParameterized::addParametersToExternalPool(
+        path, external_pool, copy_number);
+
+    // add parameters of the beam
+    m_beam.addParametersToExternalPool(new_path, external_pool, -1);
+
+    // add parameters of the detector
+    mP_detector->addParametersToExternalPool(new_path, external_pool, -1);
+
+    return new_path;
+}
+
+void Instrument::initDetector()
+{
+    if(!mP_detector)
+        throw Exceptions::RuntimeErrorException(
+            "Instrument::initDetector() -> Error. Detector is not initialized.");
+    getDetector()->init(getBeam());
+}
+
+
+std::vector<SimulationElement> Instrument::createSimulationElements()
+{
+    return mP_detector->createSimulationElements(m_beam);
+}
+
+void Instrument::setDetectorResolutionFunction(IResolutionFunction2D* p_resolution_function)
+{
+    if (p_resolution_function) {
+        mP_detector->setDetectorResolution(
+            new ConvolutionDetectorResolution(p_resolution_function));
+    } else {
+        mP_detector->setDetectorResolution(0);
+    }
+}
+
+void Instrument::setDetectorResolutionFunction(const IResolutionFunction2D& p_resolution_function)
+{
+    mP_detector->setDetectorResolution(new ConvolutionDetectorResolution(p_resolution_function));
+}
+
+void Instrument::applyDetectorResolution(OutputData<double>* p_intensity_map) const
+{
+    mP_detector->applyDetectorResolution(p_intensity_map);
+}
+
+OutputData<double> *Instrument::createDetectorIntensity(
+        const std::vector<SimulationElement> &elements, IDetector2D::EAxesUnits units) const
+{
+    return mP_detector->createDetectorIntensity(elements, m_beam, units);
+}
+
+OutputData<double> *Instrument::createDetectorMap(IDetector2D::EAxesUnits units) const
+{
+    return mP_detector->createDetectorMap(m_beam, units);
+}
+
+void Instrument::print(std::ostream& ostr) const
+{
+    ostr << "Instrument: '" << getName() << "' " << getParameterPool() << std::endl;
+    ostr << "    " << m_beam << std::endl;
+    ostr << "    " << *mP_detector << std::endl;
+}
+
+void Instrument::setBeamParameters(double wavelength, double alpha_i, double phi_i)
+{
+    m_beam.setCentralK(wavelength, alpha_i, phi_i);
+    if(mP_detector) initDetector();
+}
+
+const DetectorMask *Instrument::getDetectorMask() const
+{
+    return getDetector()->getDetectorMask();
+}
+
+void Instrument::setBeam(const Beam &beam)
+{
+    m_beam = beam;
+    if(mP_detector) initDetector();
+}
+
+void Instrument::setBeamIntensity(double intensity)
+{
+    m_beam.setIntensity(intensity);
+}
+
+void Instrument::setBeamPolarization(const kvector_t bloch_vector)
+{
+    m_beam.setPolarization(bloch_vector);
+}
+
+double Instrument::getBeamIntensity() const
+{
+    return m_beam.getIntensity();
+}
+
+const IDetector2D* Instrument::getDetector() const
+{
+    return mP_detector.get();
+}
+
+IDetector2D* Instrument::getDetector()
+{
+    return mP_detector.get();
+}
+
+const IAxis& Instrument::getDetectorAxis(size_t index) const
+{
+    return mP_detector->getAxis(index);
+}
+
+size_t Instrument::getDetectorDimension() const
+{
+    return mP_detector->getDimension();
+}
+
+void Instrument::setAnalyzerProperties(const kvector_t direction, double efficiency,
+                                       double total_transmission)
+{
+    mP_detector->setAnalyzerProperties(direction, efficiency, total_transmission);
+}
diff --git a/Core/Instrument/Instrument.h b/Core/Instrument/Instrument.h
new file mode 100644
index 0000000..8414ed7
--- /dev/null
+++ b/Core/Instrument/Instrument.h
@@ -0,0 +1,121 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/Instrument.h
+//! @brief     Defines class Instrument.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INSTRUMENT_H
+#define INSTRUMENT_H
+
+#include "IParameterized.h"
+#include "Beam.h"
+#include "IDetector2D.h"
+#include <memory>
+
+template<class T> class OutputData;
+class IAxis;
+class IResolutionFunction2D;
+class SimulationElement;
+
+//! @class Instrument
+//! @ingroup simulation_internal
+//! @brief Assembles beam, detector and their relative positions wrt the sample.
+
+class BA_CORE_API_ Instrument : public IParameterized
+{
+public:
+    Instrument();
+    Instrument(const Instrument& other);
+    Instrument& operator=(const Instrument& other);
+
+    virtual ~Instrument();
+
+    Beam& getBeam() { return m_beam; }
+    const Beam& getBeam() const { return m_beam; }
+    void setBeam(const Beam& beam);
+
+    //! Sets the beam wavelength and incoming angles
+    void setBeamParameters(double wavelength, double alpha_i, double phi_i);
+
+    //! Sets the beam's intensity
+    void setBeamIntensity(double intensity);
+
+    //! Sets the beam's polarization according to the given Bloch vector
+    void setBeamPolarization(const kvector_t bloch_vector);
+
+    //! Returns the beam's intensity
+    double getBeamIntensity() const;
+
+    //! Returns the detector data
+    const IDetector2D* getDetector() const;
+    IDetector2D* getDetector();
+
+    const DetectorMask *getDetectorMask() const;
+
+    //! Returns a detector axis
+    const IAxis& getDetectorAxis(size_t index) const;
+
+    //! Returns the detector's dimension
+    size_t getDetectorDimension() const;
+
+    //! Sets the detector (axes can be overwritten later)
+    void setDetector(const IDetector2D& detector);
+
+    //! Sets detector parameters using angle ranges
+    void setDetectorParameters(size_t n_x, double x_min, double x_max,
+                               size_t n_y, double y_min, double y_max);
+
+    //! Sets detector parameters using axes
+    void setDetectorAxes(const IAxis& axis0, const IAxis& axis1);
+
+    //! Sets detector resolution function
+    void setDetectorResolutionFunction(IResolutionFunction2D* p_resolution_function);
+    void setDetectorResolutionFunction(const IResolutionFunction2D& p_resolution_function);
+
+    //! Sets the polarization analyzer characteristics of the detector
+    void setAnalyzerProperties(const kvector_t direction, double efficiency,
+                               double total_transmission);
+
+    //! apply the detector resolution to the given intensity map
+    void applyDetectorResolution(OutputData<double>* p_intensity_map) const;
+
+    //! Returns new intensity map with detector resolution applied and axes in requested units
+    OutputData<double>* createDetectorIntensity(const std::vector<SimulationElement> &elements,
+            IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const;
+
+    //! Returns empty detector map in given axes units.
+    virtual OutputData<double>* createDetectorMap(
+            IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const;
+
+#ifndef SWIG
+    //! Create a vector of SimulationElement objects according to the beam, detector and its mask
+    std::vector<SimulationElement> createSimulationElements();
+#endif
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    virtual std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const;
+
+    //! init detector with beam settings
+    void initDetector();
+
+protected:
+    virtual void print(std::ostream& ostr) const;
+
+    //! Registers some class members for later access via parameter pool
+    virtual void init_parameters() {}
+
+    std::unique_ptr<IDetector2D> mP_detector;
+    Beam m_beam; // TODO -> pointer
+};
+
+#endif // INSTRUMENT_H
diff --git a/Core/Instrument/IntensityDataFunctions.cpp b/Core/Instrument/IntensityDataFunctions.cpp
new file mode 100644
index 0000000..22d7c89
--- /dev/null
+++ b/Core/Instrument/IntensityDataFunctions.cpp
@@ -0,0 +1,159 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IntensityDataFunctions.cpp
+//! @brief     Implement class IntensityDataFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IntensityDataFunctions.h"
+#include "ConvolutionDetectorResolution.h"
+#include "IHistogram.h"
+#include "Numeric.h"
+#include "BornAgainNamespace.h"
+#include <memory>
+
+//! Returns relative difference between two data sets sum(dat[i] - ref[i])/ref[i]).
+double IntensityDataFunctions::getRelativeDifference(
+        const OutputData<double>& dat, const OutputData<double>& ref)
+{
+    double diff = 0.0;
+    for(size_t i=0; i<dat.getAllocatedSize(); ++i)
+        diff += Numeric::get_relative_difference(dat[i], ref[i]);
+    diff /= dat.getAllocatedSize();
+
+    if (std::isnan(diff))
+        throw Exceptions::RuntimeErrorException("diff=NaN!");
+    return diff;
+}
+
+double IntensityDataFunctions::getRelativeDifference(
+    const IHistogram &dat, const IHistogram &ref)
+{
+    return getRelativeDifference(
+        *std::unique_ptr<OutputData<double>>(dat.getData().meanValues()),
+        *std::unique_ptr<OutputData<double>>(ref.getData().meanValues()) );
+}
+
+// TODO merge with IHistogram::relativeDifferenceHistogram(
+OutputData<double>*
+IntensityDataFunctions::createRelativeDifferenceData(const OutputData<double>& data,
+                                                     const OutputData<double>& reference)
+{
+    if(!data.hasSameDimensions(reference))
+        throw Exceptions::RuntimeErrorException(
+            "IntensityDataFunctions::createRelativeDifferenceData() -> "
+            "Error. Different dimensions of data and reference.");
+    OutputData<double> *result = reference.clone();
+    for(size_t i=0; i<result->getAllocatedSize(); ++i)
+        (*result)[i] = Numeric::get_relative_difference(data[i], reference[i]);
+    return result;
+}
+
+
+OutputData<double>* IntensityDataFunctions::createClippedDataSet(
+        const OutputData<double>& origin, double x1, double y1, double x2, double y2)
+{
+    if (origin.getRank() != 2)
+        throw Exceptions::LogicErrorException(
+            "IntensityDataFunctions::createClippedData()"
+            " -> Error! Works only on two-dimensional data");
+
+    OutputData<double > *result = new OutputData<double >;
+    for(size_t i_axis=0; i_axis<origin.getRank(); i_axis++) {
+        const IAxis &axis = origin.getAxis(i_axis);
+        //TODO: replace this with exception safe code
+        IAxis *new_axis;
+        if(i_axis == 0)
+            new_axis = axis.createClippedAxis(x1, x2);
+        else
+            new_axis = axis.createClippedAxis(y1, y2);
+        result->addAxis(*new_axis);
+        delete new_axis;
+    }
+    result->setAllTo(0.0);
+
+    OutputData<double>::const_iterator it_origin = origin.begin();
+    OutputData<double>::iterator it_result = result->begin();
+    while (it_origin != origin.end())
+    {
+        double x = origin.getAxisValue(it_origin.getIndex(), 0);
+        double y = origin.getAxisValue(it_origin.getIndex(), 1);
+        if(result->getAxis(0).contains(x) && result->getAxis(1).contains(y)) {
+            *it_result = *it_origin;
+            ++it_result;
+        }
+
+        ++it_origin;
+    }
+
+    return result;
+}
+
+OutputData<double>* IntensityDataFunctions::applyDetectorResolution(
+    const OutputData<double>& origin, const IResolutionFunction2D& resolution_function)
+{
+    if (origin.getRank() != 2)
+        throw Exceptions::LogicErrorException(
+            "IntensityDataFunctions::applyDetectorResolution()"
+            " -> Error! Works only on two-dimensional data");
+    OutputData<double > *result = origin.clone();
+    const std::unique_ptr<ConvolutionDetectorResolution> P_resolution(
+        new ConvolutionDetectorResolution(resolution_function));
+    P_resolution->applyDetectorResolution(result);
+    return result;
+}
+
+// For axis FixedBinAxis("axis", 8, -5.0, 3.0) the coordinate x=-4.5 (center of bin #0) will
+// be converted into 0.5 (which is a bin center expressed in bin fraction coordinates).
+// The coordinate -5.0 (outside of axis definition) will be converted to -0.5
+// (center of non-existing bin #-1).
+// Used for Mask convertion.
+
+double IntensityDataFunctions::coordinateToBinf(double coordinate, const IAxis& axis)
+{
+    int index = axis.findClosestIndex(coordinate);
+    Bin1D bin = axis.getBin(index);
+    double f = (coordinate - bin.m_lower)/bin.getBinSize();
+    return static_cast<double>(index) + f;
+}
+
+double IntensityDataFunctions::coordinateFromBinf(double value, const IAxis& axis)
+{
+    int index = static_cast<int>(value);
+
+    double result(0);
+    if(index < 0) {
+        Bin1D bin = axis.getBin(0);
+        result = bin.m_lower + value*bin.getBinSize();
+    } else if(index >= (int)axis.size()) {
+        Bin1D bin = axis.getBin(axis.size()-1);
+        result = bin.m_upper + (value-axis.size())*bin.getBinSize();
+    } else {
+        Bin1D bin = axis.getBin(index);
+        result = bin.m_lower + (value - static_cast<double>(index))*bin.getBinSize();
+    }
+
+    return result;
+}
+
+void IntensityDataFunctions::coordinateToBinf(double &x, double &y, const OutputData<double>& data)
+{
+    x = coordinateToBinf(x, data.getAxis(BornAgain::X_AXIS_INDEX));
+    y = coordinateToBinf(y, data.getAxis(BornAgain::Y_AXIS_INDEX));
+}
+
+void IntensityDataFunctions::coordinateFromBinf(double &x, double &y,
+                                                const OutputData<double>& data)
+{
+    x = coordinateFromBinf(x, data.getAxis(BornAgain::X_AXIS_INDEX));
+    y = coordinateFromBinf(y, data.getAxis(BornAgain::Y_AXIS_INDEX));
+}
+
diff --git a/Core/Instrument/IntensityDataFunctions.h b/Core/Instrument/IntensityDataFunctions.h
new file mode 100644
index 0000000..ef9b07f
--- /dev/null
+++ b/Core/Instrument/IntensityDataFunctions.h
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IntensityDataFunctions.h
+//! @brief     Defines class IntensityDataFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTENSITYDATAFUNCTIONS_H
+#define INTENSITYDATAFUNCTIONS_H
+
+#include "OutputData.h"
+class IResolutionFunction2D;
+class IHistogram;
+
+//! @class IntensityDataFunctions
+//! @ingroup tools
+//! @brief Class holding collection of static methods to work with intensity data.
+
+namespace IntensityDataFunctions {
+BA_CORE_API_ double getRelativeDifference(const OutputData<double> &dat,
+                             const OutputData<double> &ref);
+
+BA_CORE_API_ double getRelativeDifference(const IHistogram &dat, const IHistogram &ref);
+
+BA_CORE_API_ OutputData<double> *
+createRelativeDifferenceData(const OutputData<double> &data,
+                             const OutputData<double> &reference);
+
+//! Returns new IntensityData objects which axes clipped to represent the
+//! specified rectangle
+BA_CORE_API_ OutputData<double> *createClippedDataSet(const OutputData<double> &origin,
+                                         double x1, double y1, double x2,
+                                         double y2);
+
+//! Applies detector resolution function and returns new IntensityData object
+BA_CORE_API_ OutputData<double> *
+applyDetectorResolution(const OutputData<double> &origin,
+                        const IResolutionFunction2D &resolution_function);
+
+//! Transforms coordinate on axis into the bin-fraction-coordinate.
+BA_CORE_API_ double coordinateToBinf(double coordinate, const IAxis &axis);
+
+//! Transforms bin-fraction-coordinate into axis coordinate.
+BA_CORE_API_ double coordinateFromBinf(double value, const IAxis &axis);
+
+//! Transform x,y coordinate from OutputData axes coordinates to
+//! bin-fraction-coordinates
+BA_CORE_API_ void coordinateToBinf(double &x, double &y, const OutputData<double> &data);
+
+//! Transform x,y coordinate from bin-fraction-coordinates to OutputData's axes
+//! coordinates
+BA_CORE_API_ void coordinateFromBinf(double &x, double &y, const OutputData<double> &data);
+};
+
+#endif // INTENSITYDATAFUNCTIONS_H
diff --git a/Core/Instrument/IsGISAXSDetector.cpp b/Core/Instrument/IsGISAXSDetector.cpp
new file mode 100644
index 0000000..5b98155
--- /dev/null
+++ b/Core/Instrument/IsGISAXSDetector.cpp
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IsGISAXSDetector.cpp
+//! @brief     Implements class IsGISAXSDetector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IsGISAXSDetector.h"
+#include "BornAgainNamespace.h"
+#include "CustomBinAxis.h"
+
+
+IsGISAXSDetector::IsGISAXSDetector()
+{
+    setName(BornAgain::IsGISAXSDetectorType);
+    init_parameters();
+}
+
+IsGISAXSDetector::IsGISAXSDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha,
+                                   double alpha_min, double alpha_max)
+{
+    setName(BornAgain::IsGISAXSDetectorType);
+    init_parameters();
+    setDetectorParameters(n_phi, phi_min, phi_max, n_alpha, alpha_min, alpha_max);
+}
+
+IsGISAXSDetector::IsGISAXSDetector(const IsGISAXSDetector &other)
+    : SphericalDetector(other)
+{
+    setName(BornAgain::IsGISAXSDetectorType);
+    init_parameters();
+}
+
+IsGISAXSDetector *IsGISAXSDetector::clone() const
+{
+    return new IsGISAXSDetector(*this);
+}
+
+void IsGISAXSDetector::print(std::ostream &ostr) const
+{
+    ostr << "IsGISAXSDetector: '" << getName() << "' " << getParameterPool();
+    for (size_t i = 0; i < m_axes.size(); ++i) {
+        ostr << "    IAxis:" << *m_axes[i] << std::endl;
+    }
+}
+
+IAxis *IsGISAXSDetector::createAxis(size_t index, size_t n_bins, double min, double max) const
+{
+    if (max <= min) {
+        throw Exceptions::LogicErrorException(
+            "IsGISAXSDetector::createAxis() -> Error! max <= min");
+    }
+    if (n_bins == 0) {
+        throw Exceptions::LogicErrorException(
+            "IsGISAXSDetector::createAxis() -> Error! Number n_bins can't be zero.");
+    }    return new CustomBinAxis(getAxisName(index), n_bins, min, max);
+}
+
+size_t IsGISAXSDetector::getIndexOfSpecular(const Beam&) const
+{
+    return getTotalSize();
+}
diff --git a/Core/Instrument/IsGISAXSDetector.h b/Core/Instrument/IsGISAXSDetector.h
new file mode 100644
index 0000000..ad55b95
--- /dev/null
+++ b/Core/Instrument/IsGISAXSDetector.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/IsGISAXSDetector.h
+//! @brief     Defines class IsGISAXSDetector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISGISAXSDETECTOR_H
+#define ISGISAXSDETECTOR_H
+
+#include "SphericalDetector.h"
+
+//! @class IsGISAXSDetector
+//! @ingroup simulation
+//! @brief A spherical detector used for validation with IsGISAXS results.
+
+class BA_CORE_API_ IsGISAXSDetector : public SphericalDetector
+{
+public:
+    IsGISAXSDetector();
+    IsGISAXSDetector(size_t n_phi, double phi_min, double phi_max,
+                     size_t n_alpha, double alpha_min, double alpha_max);
+    IsGISAXSDetector(const IsGISAXSDetector &other);
+
+    IsGISAXSDetector* clone() const override;
+
+protected:
+    void print(std::ostream &ostr) const override;
+
+    //! Generates an axis with correct name and default binning for given index
+    IAxis* createAxis(size_t index, size_t n_bins, double min, double max) const override;
+
+    //! Returns index of pixel that contains the specular wavevector.
+    //! If no pixel contains this specular wavevector, the number of pixels is
+    //! returned. This corresponds to an overflow index.
+    size_t getIndexOfSpecular(const Beam& beam) const override;
+};
+
+#endif // ISGISAXSDETECTOR_H
diff --git a/Core/Instrument/LLData.cpp b/Core/Instrument/LLData.cpp
new file mode 100644
index 0000000..37c8cb2
--- /dev/null
+++ b/Core/Instrument/LLData.cpp
@@ -0,0 +1,24 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/LLData.cpp
+//! @brief     Implements template specializations for LLData.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "LLData.h"
+
+template <>
+Eigen::Matrix2d LLData<Eigen::Matrix2d>::getZeroElement() const
+{
+    Eigen::Matrix2d result = Eigen::Matrix2d::Zero();
+    return result;
+}
+
diff --git a/Core/Instrument/LLData.h b/Core/Instrument/LLData.h
new file mode 100644
index 0000000..73119f7
--- /dev/null
+++ b/Core/Instrument/LLData.h
@@ -0,0 +1,337 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/LLData.h
+//! @brief     Defines class LLData.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LLDATA_H
+#define LLDATA_H
+
+#include "EigenCore.h"
+#include "Exceptions.h"
+#include <limits>
+
+//! @class LLData
+//! @ingroup tools_internal
+//! @brief Template class to store data of any type in multi-dimensional space (low-level)
+
+template <class T> class LLData
+{
+public:
+    // construction, destruction and assignment
+    LLData(size_t rank, const int* dimensions);
+    LLData(const LLData<T>& right);
+    LLData<T>& operator=(const LLData<T>& right);
+    ~LLData();
+
+    LLData<double> meanValues() const;
+
+    // accessors
+    T& operator[](size_t i);
+    const T& operator[](size_t i) const;
+    T& atCoordinate(int* coordinate);
+    const T& atCoordinate(int* coordinate) const;
+
+    // arithmetic operations
+    LLData<T>& operator+=(const LLData<T>& right);
+    LLData<T>& operator-=(const LLData<T>& right);
+    LLData<T>& operator*=(const LLData<T>& right);
+    LLData<T>& operator/=(const LLData<T>& right);
+
+    // initialization, scaling
+    void setAll(const T& value);
+    void scaleAll(const T& factor);
+
+    // retrieve basic info
+    size_t getTotalSize() const;
+    inline size_t getRank() const { return m_rank; }
+    const int* getDimensions() const { return m_dims; }
+    T getTotalSum() const;
+
+private:
+    void allocate(size_t rank, const int* dimensions);
+    void clear();
+    int checkPositiveDimension(int dimension) const;
+    size_t convertCoordinate(int* coordinate) const;
+    void swapContents(LLData<T>& other);
+    T getZeroElement() const;
+
+    size_t m_rank;
+    int* m_dims;
+    T* m_data_array;
+};
+
+#ifndef SWIG
+template <>
+BA_CORE_API_ Eigen::Matrix2d LLData<Eigen::Matrix2d>::getZeroElement() const;
+#endif
+
+// Global helper functions for arithmetic
+template <class T> LLData<T> operator+(const LLData<T>& left, const LLData<T>& right);
+template <class T> LLData<T> operator-(const LLData<T>& left, const LLData<T>& right);
+template <class T> LLData<T> operator*(const LLData<T>& left, const LLData<T>& right);
+template <class T> LLData<T> operator/(const LLData<T>& left, const LLData<T>& right);
+
+// Global helper functions for comparison
+template <class T> bool HaveSameDimensions(const LLData<T>& left, const LLData<T>& right);
+
+
+template<class T>
+inline LLData<T>::LLData(size_t rank, const int* dimensions)
+    : m_rank(0)
+    , m_dims(0)
+    , m_data_array(0)
+{
+    allocate(rank, dimensions);
+}
+
+template<class T>
+LLData<T>::LLData(const LLData<T>& right)
+    : m_rank(0)
+    , m_dims(0)
+    , m_data_array(0)
+{
+    allocate(right.getRank(), right.getDimensions());
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        m_data_array[i] = right[i];
+    }
+}
+
+template<class T>
+LLData<T>::~LLData()
+{
+    clear();
+}
+
+template<class T> LLData<T>& LLData<T>::operator=(const LLData<T>& right)
+{
+    if( this !=& right) {
+        LLData<T> copy(right);
+        swapContents(copy);
+    }
+    return *this;
+}
+
+template<class T>
+inline T& LLData<T>::operator[](size_t i)
+{
+    return m_data_array[i];
+}
+
+template<class T>
+inline const T& LLData<T>::operator[](size_t i) const
+{
+    return m_data_array[i];
+}
+
+template<class T>
+inline T& LLData<T>::atCoordinate(int* coordinate)
+{
+    return m_data_array[convertCoordinate(coordinate)];
+}
+
+template<class T>
+inline const T& LLData<T>::atCoordinate(int* coordinate) const
+{
+    return m_data_array[convertCoordinate(coordinate)];
+}
+
+template<class T> LLData<T>& LLData<T>::operator+=(const LLData<T>& right)
+{
+    if (!HaveSameDimensions(*this, right))
+        throw Exceptions::RuntimeErrorException(
+            "Operation += on LLData requires both operands to have the same dimensions");
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        m_data_array[i] += right[i];
+    }
+    return *this;
+}
+
+template<class T> LLData<T>& LLData<T>::operator-=(const LLData& right)
+{
+    if (!HaveSameDimensions(*this, right))
+        throw Exceptions::RuntimeErrorException(
+            "Operation -= on LLData requires both operands to have the same dimensions");
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        m_data_array[i] -= right[i];
+    }
+    return *this;
+}
+
+template<class T> LLData<T>& LLData<T>::operator*=(const LLData& right)
+{
+    if (!HaveSameDimensions(*this, right))
+        throw Exceptions::RuntimeErrorException(
+            "Operation *= on LLData requires both operands to have the same dimensions");
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        m_data_array[i] *= right[i];
+    }
+    return *this;
+}
+
+template<class T> LLData<T>& LLData<T>::operator/=(const LLData& right)
+{
+    if (!HaveSameDimensions(*this, right))
+        throw Exceptions::RuntimeErrorException(
+            "Operation /= on LLData requires both operands to have the same dimensions");
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        double ratio;
+        if( std::abs(m_data_array[i]-right[i]) <=
+            std::numeric_limits<double>::epsilon()*std::abs(right[i])) {
+            ratio = 1.0;
+        } else if (std::abs(right[i]) <= std::numeric_limits<double>::min()) {
+            ratio = double(m_data_array[i])/std::numeric_limits<double>::min();
+        } else {
+            ratio = double(m_data_array[i]/right[i]);
+        }
+        m_data_array[i] = (T)ratio;
+    }
+    return *this;
+}
+
+template<class T> void LLData<T>::setAll(const T& value)
+{
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        m_data_array[i] = value;
+    }
+}
+
+template<class T> void LLData<T>::scaleAll(const T& factor)
+{
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        m_data_array[i] *= factor;
+    }
+}
+
+template<class T> inline size_t LLData<T>::getTotalSize() const
+{
+    size_t result = 1;
+    for (size_t i=0; i<m_rank; ++i) {
+        result *= m_dims[i];
+    }
+    return result;
+}
+
+template<class T> T LLData<T>::getTotalSum() const
+{
+    T result = getZeroElement();
+    for (size_t i=0; i<getTotalSize(); ++i) {
+        result += m_data_array[i];
+    }
+    return result;
+}
+
+template<class T> void LLData<T>::allocate(size_t rank, const int* dimensions)
+{
+    clear();
+    m_rank = rank;
+    if (m_rank) {
+        m_dims = new int[m_rank];
+        for (size_t i=0; i<m_rank; ++i) {
+            m_dims[i] = checkPositiveDimension(dimensions[i]);
+        }
+        m_data_array = new T[getTotalSize()];
+    }
+    else {
+        m_data_array = new T[1];
+    }
+}
+
+template<class T> void LLData<T>::clear()
+{
+    if (m_rank>0) {
+        m_rank = 0;
+        delete[] m_data_array;
+        delete[] m_dims;
+        m_data_array = 0;
+        m_dims = 0;
+    } else {
+        delete[] m_data_array;
+    }
+}
+
+template<class T> inline int LLData<T>::checkPositiveDimension(int dimension) const
+{
+    if (dimension<1) {
+        throw Exceptions::OutOfBoundsException("Dimension must be bigger than zero.");
+    }
+    return dimension;
+}
+
+template<class T> inline size_t LLData<T>::convertCoordinate(int* coordinate) const
+{
+    size_t offset = 1;
+    size_t result = 0;
+    for (size_t i = m_rank; i>0; --i) {
+        result += offset*coordinate[i-1];
+        offset *= m_dims[i-1];
+    }
+    return result;
+}
+
+template<class T> void LLData<T>::swapContents(LLData<T>& other)
+{
+    std::swap(this->m_rank, other.m_rank);
+    std::swap(this->m_dims, other.m_dims);
+    std::swap(this->m_data_array, other.m_data_array);
+}
+
+template<class T> T LLData<T>::getZeroElement() const
+{
+    T result = 0;
+    return result;
+}
+
+template<class T> LLData<T> operator+(const LLData<T>& left, const LLData<T>& right)
+{
+    LLData<T> *p_result = new LLData<T>(left);
+    (*p_result) += right;
+    return *p_result;
+}
+
+template<class T> LLData<T> operator-(const LLData<T>& left, const LLData<T>& right)
+{
+    LLData<T> *p_result = new LLData<T>(left);
+    (*p_result) -= right;
+    return *p_result;
+}
+
+template<class T> LLData<T> operator*(const LLData<T>& left, const LLData<T>& right)
+{
+    LLData<T> *p_result = new LLData<T>(left);
+    (*p_result) *= right;
+    return *p_result;
+}
+
+template<class T> LLData<T> operator/(const LLData<T>& left, const LLData<T>& right)
+{
+    LLData<T> *p_result = new LLData<T>(left);
+    *p_result /= right;
+    return *p_result;
+}
+
+template<class T> bool HaveSameDimensions(const LLData<T>& left, const LLData<T>& right)
+{
+    if (left.getRank() != right.getRank()) {
+        return false;
+    }
+    const int* ldims = left.getDimensions();
+    const int* rdims = right.getDimensions();
+    for (size_t i=0; i<left.getRank(); ++i) {
+        if (ldims[i] != rdims[i]) {
+            return false;
+        }
+    }
+    return true;
+}
+
+#endif // LLDATA_H
diff --git a/Core/Instrument/NumpyUtils.cpp b/Core/Instrument/NumpyUtils.cpp
new file mode 100644
index 0000000..cf5bfea
--- /dev/null
+++ b/Core/Instrument/NumpyUtils.cpp
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/NumpyUtils.cpp
+//! @brief     Implements various functions to interact from numpy on Python side
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifdef BORNAGAIN_PYTHON
+
+#include "NumpyUtils.h"
+#include "Exceptions.h"
+
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#define PY_ARRAY_UNIQUE_SYMBOL BORNAGAIN_PYTHONAPI_ARRAY
+#define NO_IMPORT_ARRAY
+#include <numpy/arrayobject.h>
+
+PyObject* Utils::createNumpyArray(const std::vector<double>& data)
+{
+    const size_t ndim(1);
+    npy_int ndim_numpy = ndim;
+    npy_intp *ndimsizes_numpy = new npy_intp[ndim];
+    ndimsizes_numpy[0] = data.size();
+
+    // creating standalone numpy array
+    PyObject *pyarray = PyArray_SimpleNew(ndim_numpy, ndimsizes_numpy, NPY_DOUBLE);
+    delete [] ndimsizes_numpy;
+    if(pyarray == nullptr )
+        throw Exceptions::RuntimeErrorException("ExportOutputData() -> Panic in PyArray_SimpleNew");
+    Py_INCREF(pyarray);
+
+    // getting pointer to data buffer of numpy array
+    double *array_buffer = (double *)PyArray_DATA((PyArrayObject*)pyarray);
+
+    for(size_t index=0; index<data.size(); ++index)
+        *array_buffer++ = data[index];
+
+    return pyarray;
+}
+
+#endif // BORNAGAIN_PYTHON
diff --git a/Core/Instrument/NumpyUtils.h b/Core/Instrument/NumpyUtils.h
new file mode 100644
index 0000000..fe7ab47
--- /dev/null
+++ b/Core/Instrument/NumpyUtils.h
@@ -0,0 +1,32 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/NumpyUtils.h
+//! @brief     Defines various functions to interact from numpy on Python side
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef NUMPYUTILS_H
+#define NUMPYUTILS_H
+
+#ifdef BORNAGAIN_PYTHON
+
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#include <Python.h>
+#include <vector>
+
+namespace Utils
+{
+    PyObject* createNumpyArray(const std::vector<double>& data);
+}
+
+#endif // BORNAGAIN_PYTHON
+
+#endif // NUMPYUTILS_H
diff --git a/Core/Instrument/OutputData.cpp b/Core/Instrument/OutputData.cpp
new file mode 100644
index 0000000..7537277
--- /dev/null
+++ b/Core/Instrument/OutputData.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/OutputData.cpp
+//! @brief     Implements template specializations of class OutputData.cpp.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifdef BORNAGAIN_PYTHON
+
+#include "CumulativeValue.h"
+#include "OutputData.h"
+
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#include <Python.h>
+#define PY_ARRAY_UNIQUE_SYMBOL BORNAGAIN_PYTHONAPI_ARRAY
+#define NO_IMPORT_ARRAY
+#include <numpy/arrayobject.h>
+#include <iostream>
+
+template<>
+PyObject* OutputData<double>::getArray() const
+{
+    std::vector<size_t > dimensions;
+    for (size_t i=0; i<getRank(); i++)
+        dimensions.push_back(getAxis(i).size());
+
+    // for rot90 of 2-dim arrays to conform with numpy
+    if (dimensions.size() == 2)
+        std::swap(dimensions[0], dimensions[1]);
+
+    // creating ndarray objects describing size of dimensions
+    npy_int ndim_numpy= (int)dimensions.size();
+    npy_intp* ndimsizes_numpy = new npy_intp[dimensions.size()];
+    for (size_t i=0; i<dimensions.size(); i++)
+        ndimsizes_numpy[i] = dimensions[i];
+
+    // creating standalone numpy array
+    PyObject* pyarray = PyArray_SimpleNew(ndim_numpy, ndimsizes_numpy, NPY_DOUBLE);
+    delete [] ndimsizes_numpy;
+    if (pyarray == nullptr)
+        throw Exceptions::RuntimeErrorException("ExportOutputData() -> Panic in PyArray_SimpleNew");
+    Py_INCREF(pyarray);
+
+    // getting pointer to data buffer of numpy array
+    double* array_buffer = (double *)PyArray_DATA((PyArrayObject*)pyarray);
+
+    // filling numpy array with output_data
+    if (getRank() == 2) {
+        for (size_t index=0; index<getAllocatedSize(); ++index) {
+            std::vector<int> axes_indices = getAxesBinIndices(index);
+            size_t offset = axes_indices[0] +
+                m_value_axes[0]->size()*(m_value_axes[1]->size() - 1 - axes_indices[1]);
+            array_buffer[offset] = (*this)[index];
+        }
+
+    } else {
+        for (size_t index=0; index<getAllocatedSize(); ++index)
+            *array_buffer++ = (*this)[index];
+    }
+
+    return pyarray;
+}
+
+template<>
+double OutputData<double>::getValue(size_t index) const
+{
+    return (*this)[index];
+}
+
+template<>
+double OutputData<CumulativeValue>::getValue(size_t index) const
+{
+    return (*this)[index].getContent();
+}
+
+#endif
diff --git a/Core/Instrument/OutputData.h b/Core/Instrument/OutputData.h
new file mode 100644
index 0000000..d34ada8
--- /dev/null
+++ b/Core/Instrument/OutputData.h
@@ -0,0 +1,693 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/OutputData.h
+//! @brief     Defines and implements template class OutputData.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATA_H
+#define OUTPUTDATA_H
+
+#include "FixedBinAxis.h"
+#include "LLData.h"
+#include "OutputDataIterator.h"
+#include "SafePointerVector.h"
+#include "ThreadInfo.h"
+#include <sstream>
+#include <cassert>
+
+#ifdef BORNAGAIN_PYTHON
+#ifndef PyObject_HEAD
+struct _object;
+typedef _object PyObject;
+#endif
+#endif
+
+using std::size_t;
+
+//! Template class to store data of any type in multi-dimensional space.
+//! @ingroup tools
+
+//! Used with data type double to hold simulation results.
+//! Used with data type CumulativeValue in IHistogram classes.
+//! Used with data type bool to hold a detector mask (-> class DetectorMask)
+
+template <class T>
+class OutputData
+{
+public:
+    OutputData();
+    OutputData(const OutputData&) = delete;
+    const OutputData& operator=(const OutputData&) = delete;
+    ~OutputData();
+    OutputData* clone() const;
+
+    void copyFrom(const OutputData<T>& x);
+    template <class U> void copyShapeFrom(const OutputData<U>& other);
+    OutputData<double>* meanValues() const;
+
+    void addAxis(const IAxis& new_axis);
+    void addAxis(const std::string& name, size_t size, double start, double end);
+
+    //! returns axis with given serial number
+    const IAxis& getAxis(size_t serial_number) const;
+
+    //! returns axis with given name
+    const IAxis& getAxis(const std::string& axis_name) const;
+
+    // ---------------------------------
+    // retrieve basic info
+    // ---------------------------------
+
+    //! Returns number of dimensions.
+    size_t getRank() const { return m_value_axes.size(); }
+
+   //! Returns total size of data buffer (product of bin number in every dimension).
+    size_t getAllocatedSize() const {
+        if (mp_ll_data)
+            return mp_ll_data->getTotalSize();
+        return 0;
+    }
+
+    //! Returns all sizes of its axes
+    std::vector<size_t> getAllSizes() const;
+
+    //! Returns copy of raw data vector
+    std::vector<T> getRawDataVector() const;
+
+    //! fill raw array with data
+    void fillRawDataArray(T* destination) const;
+
+    //! Returns sum of all values in the data structure
+    T totalSum() const;
+
+    // ---------------------------------
+    // external iterators (with their possible masking)
+    // ---------------------------------
+
+    friend class OutputDataIterator<T, OutputData<T>>;
+    friend class OutputDataIterator<const T, const OutputData<T>>;
+
+    //! Read/write iterator type
+    typedef OutputDataIterator<T, OutputData<T>> iterator;
+
+    //! Read-only iterator type
+    typedef OutputDataIterator<const T, const OutputData<T>> const_iterator;
+
+    //! Returns  read/write iterator that points to the first element
+    iterator begin();
+
+    //! Returns  read-only iterator that points to the first element
+    const_iterator begin() const;
+
+    //! Returns  read/write iterator that points to the one past last element
+    iterator end() { return iterator(this, getAllocatedSize()); }
+
+    //! Returns  read-only iterator that points to the one past last element
+    const_iterator end() const {
+        return const_iterator(this, getAllocatedSize());
+    }
+
+    void setVariability(double variability) { m_variability = variability; }
+    double getVariability() const { return m_variability; }
+
+    // ---------------------------------
+    // coordinate and index functions
+    // ---------------------------------
+
+    //! Returns vector of axes indices for given global index
+    //! @param global_index The global index of this data structure.
+    //! @return Vector of bin indices for all axes defined
+    std::vector<int> getAxesBinIndices(size_t global_index) const;
+
+    //! Returns axis bin index for given global index
+    //! @param global_index The global index of this data structure.
+    //! @param i_selected_axis Serial number of selected axis.
+    //! @return Corresponding bin index for selected axis
+    int getAxisBinIndex(size_t global_index, size_t i_selected_axis) const;
+
+    //! Returns axis bin index for given global index
+    //! @param global_index The global index of this data structure.
+    //! @param axis_name The name of selected axis.
+    //! @return Corresponding bin index for selected axis
+    int getAxisBinIndex(size_t global_index, const std::string &axis_name) const;
+
+    //! Returns global index for specified indices of axes
+    //! @param axes_indices Vector of axes indices for all specified axes in this dataset
+    //! @return Corresponding global index
+    size_t toGlobalIndex(const std::vector<int> &axes_indices) const;
+
+    //! Returns global index for specified axes values
+    //! @param coordinates Vector of axes coordinates for all specified axes in this dataset
+    //! @return Closest global index
+    size_t findGlobalIndex(const std::vector<double> &coordinates) const;
+
+    //! Returns the value of selected axis for given global_index.
+    //! @param global_index The global index of this data structure.
+    //! @param i_selected_axis Serial number of selected axis.
+    //! @return corresponding bin center of selected axis
+    double getAxisValue(size_t global_index, size_t i_selected_axis) const;
+
+    //! Returns the value of selected axis for given global_index.
+    //! @param global_index The global index of this data structure.
+    //! @param axis_name The name of selected axis.
+    //! @return corresponding bin center of selected axis
+    double getAxisValue(size_t global_index, const std::string& axis_name) const;
+
+    //! Returns values on all defined axes for given globalbin number
+    //! @param global_index The global index of this data structure.
+    //! @return Vector of corresponding bin centers
+    std::vector<double > getAxesValues(size_t global_index) const;
+
+    //! Returns bin of selected axis for given global_index.
+    //! @param global_index The global index of this data structure.
+    //! @param i_selected_axis Serial number of selected axis.
+    //! @return Corresponding Bin1D object
+    Bin1D getAxisBin(size_t global_index, size_t i_selected_axis) const;
+
+    //! Returns bin of selected axis for given global_index.
+    //! @param global_index The global index of this data structure.
+    //! @param axis_name The name of selected axis.
+    //! @return Corresponding Bin1D object
+    Bin1D getAxisBin(size_t global_index, const std::string& axis_name) const;
+
+    // ---------
+    // modifiers
+    // ---------
+
+    //! Sets object into initial state (no dimensions, data)
+    void clear();
+
+    //! Sets content of output data to specific value
+    void setAllTo(const T& value);
+
+    //! multiply every item of this output data by value
+    void scaleAll(const T& factor);
+
+    //! Adds 'rank' axes with indicated sizes
+    void setAxisSizes(size_t rank, int* n_dims);
+
+    //! Sets new values to raw data vector
+    void setRawDataVector(const std::vector<T>& data_vector);
+
+    //! Sets new values to raw data array
+    void setRawDataArray(const T* source);
+
+    //! addition-assignment operator for two output data
+    const OutputData<T>& operator+=(const OutputData<T>& right);
+
+    //! substraction-assignment operator for two output data
+    const OutputData<T>& operator-=(const OutputData<T>& right);
+
+    //! division-assignment operator for two output data
+    const OutputData<T>& operator/=(const OutputData<T>& right);
+
+    //! multiplication-assignment operator for two output data
+    const OutputData<T>& operator*=(const OutputData<T>& right);
+
+    //! Returns value or summed value, depending on T
+    double getValue(size_t index) const;
+
+    //! indexed accessor
+    T& operator[](size_t index) {
+        assert(mp_ll_data);
+        return (*mp_ll_data)[index];
+    }
+
+    //! indexed accessor (const)
+    const T& operator[](size_t index) const {
+        assert(mp_ll_data);
+        return (*mp_ll_data)[index];
+    }
+
+    // --------
+    // helpers
+    // --------
+
+    //! Returns true if object have same dimensions and number of axes bins
+    template <class U> bool hasSameDimensions(const OutputData<U>& right) const;
+
+    //! Returns true if objects a) have same dimensions b) bin boundaries of axes coincide
+    template <class U> bool hasSameShape(const OutputData<U>& right) const;
+
+    //! returns data as Python numpy array
+#ifdef BORNAGAIN_PYTHON
+    PyObject* getArray() const;
+#endif
+
+    //! returns true if object is correctly initialized
+    bool isInitialized() const;
+
+    //! memory allocation for current dimensions configuration
+    void allocate();
+
+private:
+    //! returns serial number of axis with given name
+    size_t getAxisIndex(const std::string& axis_name) const;
+
+    //! checks if given axis name exists
+    bool axisNameExists(const std::string& axis_name) const;
+
+    SafePointerVector<IAxis> m_value_axes;
+    LLData<T>* mp_ll_data;
+    double m_variability;
+};
+
+/* ***************************************************************************/
+// Implementation
+/* ***************************************************************************/
+
+template <class T>
+OutputData<T>::OutputData()
+    : m_value_axes()
+    , mp_ll_data(nullptr)
+    , m_variability(2e-10)
+{
+    allocate();
+}
+
+template <class T> OutputData<T>::~OutputData() {
+    clear();
+    delete mp_ll_data;
+}
+
+template <class T>
+OutputData<T>* OutputData<T>::clone() const
+{
+    OutputData<T>* ret = new OutputData<T>();
+    ret->m_value_axes = m_value_axes;
+    (*ret->mp_ll_data) = *mp_ll_data;
+    ret->setVariability(m_variability);
+    return ret;
+}
+
+template <class T>
+void OutputData<T>::copyFrom(const OutputData<T>& other)
+{
+    clear();
+    m_value_axes = other.m_value_axes;
+    delete mp_ll_data;
+    mp_ll_data = 0;
+    if(other.mp_ll_data)
+        mp_ll_data = new LLData<T>(*other.mp_ll_data);
+    m_variability = other.getVariability();
+}
+
+template <class T>
+template <class U>
+void OutputData<T>::copyShapeFrom(const OutputData<U>& other)
+{
+    clear();
+    size_t rank = other.getRank();
+    for (size_t i=0; i<rank; ++i)
+        addAxis(other.getAxis(i));
+    m_variability = other.getVariability();
+}
+
+template <class T>
+OutputData<double>* OutputData<T>::meanValues() const
+{
+    auto ret = new OutputData<double>();
+    ret->copyShapeFrom(*this);
+    ret->allocate();
+    ret->setVariability(m_variability);
+    for (size_t i=0; i<mp_ll_data->getTotalSize(); ++i)
+        (*ret)[i] = getValue(i);
+    ret->setVariability(m_variability);
+    return ret;
+}
+
+template <class T>
+void OutputData<T>::addAxis(const IAxis& new_axis)
+{
+    if( axisNameExists(new_axis.getName()) )
+        throw Exceptions::LogicErrorException(
+            "OutputData<T>::addAxis(const IAxis& new_axis) -> "
+            "Error! Attempt to add axis with already existing name '" +
+            new_axis.getName() + "'");
+    if (new_axis.size()>0) {
+        m_value_axes.push_back(new_axis.clone());
+        allocate();
+    }
+}
+
+template <class T>
+void OutputData<T>::addAxis(const std::string& name, size_t size, double start, double end)
+{
+    if( axisNameExists(name) )
+        throw Exceptions::LogicErrorException(
+            "OutputData<T>::addAxis(std::string name) -> "
+            "Error! Attempt to add axis with already existing name '" +
+            name+"'");
+    FixedBinAxis new_axis(name, size, start, end);
+    addAxis(new_axis);
+}
+
+template <class T>
+const IAxis& OutputData<T>::getAxis(size_t serial_number) const
+{
+    return *m_value_axes[serial_number];
+}
+
+template <class T>
+const IAxis& OutputData<T>::getAxis(const std::string& axis_name) const
+{
+    return getAxis(getAxisIndex(axis_name));
+}
+
+template<class T>
+inline std::vector<size_t> OutputData<T>::getAllSizes() const
+{
+    assert(mp_ll_data);
+    std::vector<size_t> result;
+    for (size_t i=0; i<getRank(); ++i) {
+        int dim = mp_ll_data->getDimensions()[i];
+        result.push_back(dim);
+    }
+    return result;
+}
+
+template <class T>
+inline std::vector<T> OutputData<T>::getRawDataVector() const
+{
+    assert(mp_ll_data);
+    std::vector<T> result;
+    for (size_t i=0; i<getAllocatedSize(); ++i)
+        result.push_back((*mp_ll_data)[i]);
+    return result;
+}
+
+template <class T>
+void OutputData<T>::fillRawDataArray(T* destination) const
+{
+    assert(mp_ll_data);
+    for (size_t i=0; i<getAllocatedSize(); ++i)
+        destination[i] = (*mp_ll_data)[i];
+    return;
+}
+
+template <class T>
+typename OutputData<T>::iterator OutputData<T>::begin()
+{
+    typename OutputData<T>::iterator result(this);
+    return result;
+}
+
+template <class T>
+typename OutputData<T>::const_iterator OutputData<T>::begin() const
+{
+    typename OutputData<T>::const_iterator result(this);
+    return result;
+}
+
+template<class T>
+std::vector<int> OutputData<T>::getAxesBinIndices(size_t global_index) const
+{
+    assert(mp_ll_data);
+    size_t remainder = global_index;
+    std::vector<int> result;
+    result.resize(mp_ll_data->getRank());
+    for (size_t i=0; i<mp_ll_data->getRank(); ++i) {
+        result[mp_ll_data->getRank()-1-i] =
+            (int)(remainder % m_value_axes[mp_ll_data->getRank()-1-i]->size());
+        remainder /= m_value_axes[mp_ll_data->getRank()-1-i]->size();
+    }
+    return result;
+}
+
+template<class T>
+int OutputData<T>::getAxisBinIndex(size_t global_index, size_t i_selected_axis) const
+{
+    assert(mp_ll_data);
+    size_t remainder(global_index);
+    for (size_t i=0; i<mp_ll_data->getRank(); ++i) {
+        size_t i_axis = mp_ll_data->getRank()-1-i;
+        int result = (int)(remainder % m_value_axes[i_axis]->size());
+        if(i_selected_axis == i_axis ) return result;
+        remainder /= m_value_axes[i_axis]->size();
+    }
+    throw Exceptions::LogicErrorException("OutputData<T>::getAxisBinIndex() -> "
+                                          "Error! No axis with given number");
+}
+
+
+template<class T>
+int OutputData<T>::getAxisBinIndex(size_t global_index, const std::string &axis_name) const
+{
+    return getAxisBinIndex(global_index, getAxisIndex(axis_name));
+}
+
+template <class T>
+size_t OutputData<T>::toGlobalIndex(const std::vector<int> &axes_indices) const
+{
+    assert(mp_ll_data);
+    if (axes_indices.size() != mp_ll_data->getRank())
+        throw Exceptions::LogicErrorException(
+            "size_t OutputData<T>::toGlobalIndex() -> "
+            "Error! Number of coordinates must match rank of data structure");
+    size_t result = 0;
+    int step_size = 1;
+    for (size_t i=mp_ll_data->getRank(); i>0; --i) {
+        if(axes_indices[i-1] < 0 || axes_indices[i-1] >= (int)m_value_axes[i-1]->size()) {
+            std::ostringstream message;
+            message << "size_t OutputData<T>::toGlobalIndex() -> Error. Index ";
+            message << axes_indices[i-1] << " is out of range. Axis ";
+            message << m_value_axes[i-1]->getName();
+            message << " size " << m_value_axes[i-1]->size() << ".\n";
+            throw Exceptions::LogicErrorException(message.str());
+        }
+        result += axes_indices[i-1]*step_size;
+        step_size *= m_value_axes[i-1]->size();
+    }
+    return result;
+}
+
+template <class T>
+size_t OutputData<T>::findGlobalIndex(const std::vector<double> &coordinates) const
+{
+    assert(mp_ll_data);
+    if (coordinates.size() != mp_ll_data->getRank())
+        throw Exceptions::LogicErrorException(
+            "OutputData<T>::findClosestIndex() -> "
+            "Error! Number of coordinates must match rank of data structure");
+    std::vector<int> axes_indexes;
+    axes_indexes.resize(mp_ll_data->getRank());
+    for(size_t i = 0; i<mp_ll_data->getRank(); ++i)
+        axes_indexes[i] = m_value_axes[i]->findClosestIndex(coordinates[i]);
+    return toGlobalIndex(axes_indexes);
+}
+
+template <class T>
+double OutputData<T>::getAxisValue(size_t global_index, size_t i_selected_axis) const
+{
+    int axis_index = getAxisBinIndex(global_index, i_selected_axis);
+    return (*m_value_axes[i_selected_axis])[axis_index];
+}
+
+template <class T>
+double OutputData<T>::getAxisValue(size_t global_index, const std::string& axis_name) const
+{
+    return getAxisValue(global_index, getAxisIndex(axis_name));
+}
+
+template <class T>
+std::vector<double> OutputData<T>::getAxesValues(size_t global_index) const
+{
+    std::vector<int> indices = getAxesBinIndices(global_index);
+    std::vector<double > result;
+    for(size_t i_axis=0; i_axis<indices.size(); ++i_axis)
+        result.push_back((*m_value_axes[i_axis])[indices[i_axis]]);
+    return result;
+}
+
+template <class T>
+Bin1D OutputData<T>::getAxisBin(size_t global_index, size_t i_selected_axis) const
+{
+    int axis_index = getAxisBinIndex(global_index, i_selected_axis);
+    return m_value_axes[i_selected_axis]->getBin(axis_index);
+}
+
+template <class T>
+Bin1D OutputData<T>::getAxisBin(size_t global_index, const std::string& axis_name) const
+{
+    return getAxisBin(global_index, getAxisIndex(axis_name));
+}
+
+template<class T>
+inline T OutputData<T>::totalSum() const
+{
+    assert(mp_ll_data);
+    return mp_ll_data->getTotalSum();
+}
+
+template <class T>
+void OutputData<T>::clear()
+{
+    m_value_axes.clear();
+    allocate();
+}
+
+template <class T>
+void OutputData<T>::setAllTo(const T& value)
+{
+    if(!mp_ll_data)
+        throw Exceptions::ClassInitializationException(
+            "OutputData::setAllTo() -> Error! Low-level data object was not yet initialized.");
+    mp_ll_data->setAll(value);
+}
+
+template <class T>
+void OutputData<T>::scaleAll(const T& factor)
+{
+    if(!mp_ll_data)
+        throw Exceptions::ClassInitializationException(
+            "OutputData::scaleAll() -> Error! Low-level data object was not yet initialized.");
+    mp_ll_data->scaleAll(factor);
+}
+
+template <class T>
+void OutputData<T>::setAxisSizes(size_t rank, int* n_dims)
+{
+    clear();
+    std::string basename("axis");
+    for (size_t i=0; i<rank; ++i) {
+        std::ostringstream name;
+        name << basename << i;
+        addAxis(name.str(), n_dims[i], 0.0, (double)(n_dims[i]-1));
+    }
+}
+
+template<class T>
+const OutputData<T>& OutputData<T>::operator+=(const OutputData<T>& right)
+{
+    assert(mp_ll_data);
+    *this->mp_ll_data += *right.mp_ll_data;
+    return *this;
+}
+
+template<class T>
+const OutputData<T>& OutputData<T>::operator-=(const OutputData<T>& right)
+{
+    assert(mp_ll_data);
+    *this->mp_ll_data -= *right.mp_ll_data;
+    return *this;
+}
+
+template<class T>
+const OutputData<T>& OutputData<T>::operator*=(const OutputData<T>& right)
+{
+    assert(mp_ll_data);
+    *this->mp_ll_data *= *right.mp_ll_data;
+    return *this;
+}
+
+template<class T>
+bool OutputData<T>::isInitialized() const
+{
+    if(!mp_ll_data) return false;
+    if(getRank() != mp_ll_data->getRank()) return false;
+    if(!getRank()) return false;
+    return true;
+}
+
+template<class T>
+const OutputData<T>& OutputData<T>::operator/=(const OutputData<T>& right)
+{
+    assert(mp_ll_data);
+    *this->mp_ll_data /= *right.mp_ll_data;
+    return *this;
+}
+
+template <class T>
+void OutputData<T>::allocate()
+{
+    delete mp_ll_data;
+    size_t rank = m_value_axes.size();
+    int* dims =  new int[rank];
+    for (size_t i=0; i<rank; ++i) {
+        dims[i] = (int)getAxis(i).size();
+    }
+    mp_ll_data = new LLData<T>(rank, dims);
+    T default_value = T();
+    mp_ll_data->setAll(default_value);
+    delete[] dims;
+}
+
+template<class T>
+inline void OutputData<T>::setRawDataVector(const std::vector<T>& data_vector)
+{
+    if (data_vector.size() != getAllocatedSize())
+        throw Exceptions::RuntimeErrorException(
+            "OutputData<T>::setRawDataVector() -> Error! "
+            "setRawDataVector can only be called with a data vector of the correct size." );
+    for (size_t i=0; i<getAllocatedSize(); ++i)
+        (*mp_ll_data)[i] = data_vector[i];
+}
+
+template<class T>
+inline void OutputData<T>::setRawDataArray(const T* source)
+{
+    for (size_t i=0; i<getAllocatedSize(); ++i)
+        (*mp_ll_data)[i] = source[i];
+}
+
+//! Returns true if object have same dimensions
+template<class T>
+template<class U>
+inline bool OutputData<T>::hasSameDimensions(const OutputData<U>& right) const
+{
+    if (!isInitialized()) return false;
+    if (!right.isInitialized()) return false;
+    if (getRank() != right.getRank()) return false;
+    for (size_t i_axis=0; i_axis<getRank(); ++i_axis)
+        if (getAxis(i_axis).size() != right.getAxis(i_axis).size()) return false;
+    return true;
+}
+
+//! Returns true if object have same dimensions and shape of axis
+template<class T>
+template<class U>
+bool OutputData<T>::hasSameShape(const OutputData<U>& right) const
+{
+    if (!hasSameDimensions(right)) return false;
+
+    for (size_t i=0; i<m_value_axes.size(); ++i)
+        if (!HaveSameNameAndShape(getAxis(i), right.getAxis(i))) return false;
+    return true;
+}
+
+//! returns data as Python numpy array
+#ifdef BORNAGAIN_PYTHON
+template<>
+PyObject* OutputData<double>::getArray() const;
+#endif
+
+// return index of axis
+template <class T>
+size_t OutputData<T>::getAxisIndex(const std::string &axis_name) const
+{
+    for (size_t i = 0; i < m_value_axes.size(); ++i)
+        if (m_value_axes[i]->getName() == axis_name) return i;
+    throw Exceptions::LogicErrorException(
+        "OutputData<T>::getAxisIndex() -> "
+        "Error! Axis with given name not found '"+axis_name+std::string("'"));
+}
+
+template <class T>
+bool OutputData<T>::axisNameExists(const std::string &axis_name) const
+{
+    for (size_t i = 0; i < m_value_axes.size(); ++i)
+        if (m_value_axes[i]->getName() == axis_name) return true;
+    return false;
+}
+
+
+#endif // OUTPUTDATA_H
diff --git a/Core/Instrument/OutputDataIterator.h b/Core/Instrument/OutputDataIterator.h
new file mode 100644
index 0000000..4e90e23
--- /dev/null
+++ b/Core/Instrument/OutputDataIterator.h
@@ -0,0 +1,202 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/OutputDataIterator.h
+//! @brief     Defines and implements template class OutputDataIterator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OUTPUTDATAITERATOR_H
+#define OUTPUTDATAITERATOR_H
+
+#include <cstddef>
+#include <iterator>
+#include <utility>
+
+//! @class OutputDataIterator
+//! @ingroup tools_internal
+//! @brief Iterator for underlying OutputData container
+
+template <class TValue, class TContainer> class OutputDataIterator {
+public:
+    //! Empty constructor to comply with stl forward iterators
+    OutputDataIterator();
+
+    //! constructor
+    OutputDataIterator(TContainer *p_output_data, size_t start_at_index = 0);
+
+    //! templated copy construction
+    template <class TValue2, class TContainer2>
+    OutputDataIterator(const OutputDataIterator<TValue2, TContainer2> &other);
+
+    //! non-templated copy construction
+    OutputDataIterator(const OutputDataIterator<TValue, TContainer> &other);
+
+    //! templated copy assignment
+    template <class TValue2, class TContainer2>
+    OutputDataIterator<TValue, TContainer> &
+    operator=(const OutputDataIterator<TValue2, TContainer2> &right);
+
+    //! non-templated copy asssignment
+    OutputDataIterator<TValue, TContainer> &
+    operator=(const OutputDataIterator<TValue, TContainer> &right);
+
+    ~OutputDataIterator();
+
+    //! prefix increment
+    OutputDataIterator<TValue, TContainer> &operator++();
+
+    //! postfix increment
+    OutputDataIterator<TValue, TContainer> operator++(int);
+
+    //! retrieve current element
+    TValue &operator*() const;
+
+    //! pointer access
+    TValue *operator->() const;
+
+    //! Returns current index
+    size_t getIndex() const { return m_current_index; }
+
+    //! Returns container pointer
+    TContainer *getContainer() const { return mp_output_data; }
+
+    //! Swaps iterators
+    void swap(OutputDataIterator<TValue, TContainer> &other);
+
+    // typedefs for std::iterator_traits
+    typedef std::forward_iterator_tag iterator_category;
+    typedef TValue value_type;
+    typedef ptrdiff_t difference_type;
+    typedef TValue *pointer_type;
+    typedef TValue &reference_type;
+    //#ifdef _MSC_VER
+    typedef TValue *pointer;
+    typedef TValue &reference;
+    //#endif
+
+private:
+    size_t m_current_index;
+    TContainer *mp_output_data;
+};
+
+//! make Swappable
+template <class TValue, class TContainer>
+void swap(OutputDataIterator<TValue, TContainer> &left,
+          OutputDataIterator<TValue, TContainer> &right) {
+    left.swap(right);
+}
+
+//! test for equality
+template <class TValue1, class TContainer1, class TValue2, class TContainer2>
+bool operator==(const OutputDataIterator<TValue1, TContainer1> &left,
+                const OutputDataIterator<TValue2, TContainer2> &right);
+
+//! test for inequality
+template <class TValue1, class TContainer1, class TValue2, class TContainer2>
+bool operator!=(const OutputDataIterator<TValue1, TContainer1> &left,
+                const OutputDataIterator<TValue2, TContainer2> &right);
+
+template <class TValue, class TContainer>
+OutputDataIterator<TValue, TContainer>::OutputDataIterator()
+    : m_current_index(0), mp_output_data(0) {}
+
+template <class TValue, class TContainer>
+OutputDataIterator<TValue, TContainer>::OutputDataIterator(
+    TContainer *p_output_data, size_t start_at_index)
+    : m_current_index(start_at_index), mp_output_data(p_output_data) {}
+
+template <class TValue, class TContainer>
+template <class TValue2, class TContainer2>
+OutputDataIterator<TValue, TContainer>::OutputDataIterator(
+    const OutputDataIterator<TValue2, TContainer2> &other)
+    : m_current_index(0), mp_output_data(0) {
+    mp_output_data = static_cast<TContainer *>(other.getContainer());
+    m_current_index = other.getIndex();
+}
+
+template <class TValue, class TContainer>
+OutputDataIterator<TValue, TContainer>::OutputDataIterator(
+    const OutputDataIterator<TValue, TContainer> &other)
+    : m_current_index(0), mp_output_data(0) {
+    mp_output_data = other.getContainer();
+    m_current_index = other.getIndex();
+}
+
+template <class TValue, class TContainer>
+template <class TValue2, class TContainer2>
+OutputDataIterator<TValue, TContainer> &OutputDataIterator<TValue, TContainer>::
+operator=(const OutputDataIterator<TValue2, TContainer2> &right) {
+    OutputDataIterator<TValue, TContainer> copy(right);
+    swap(copy);
+    return *this;
+}
+
+template <class TValue, class TContainer>
+OutputDataIterator<TValue, TContainer> &OutputDataIterator<TValue, TContainer>::
+operator=(const OutputDataIterator<TValue, TContainer> &right) {
+    OutputDataIterator<TValue, TContainer> copy(right);
+    swap(copy);
+    return *this;
+}
+
+template <class TValue, class TContainer>
+OutputDataIterator<TValue, TContainer>::~OutputDataIterator() {}
+
+template <class TValue, class TContainer>
+OutputDataIterator<TValue, TContainer> &OutputDataIterator<TValue, TContainer>::
+operator++() {
+    if (m_current_index < mp_output_data->getAllocatedSize()) {
+        ++m_current_index;
+    }
+    return *this;
+}
+
+template <class TValue, class TContainer>
+OutputDataIterator<TValue, TContainer> OutputDataIterator<TValue, TContainer>::
+operator++(int /**/) {
+    OutputDataIterator<TValue, TContainer> result(*this);
+    this->operator++();
+    return result;
+}
+
+template <class TValue, class TContainer>
+TValue &OutputDataIterator<TValue, TContainer>::operator*() const {
+    return (*mp_output_data)[m_current_index];
+}
+
+template <class TValue, class TContainer>
+TValue *OutputDataIterator<TValue, TContainer>::operator->() const {
+    return &((*mp_output_data)[m_current_index]);
+}
+
+template <class TValue, class TContainer>
+void OutputDataIterator<TValue, TContainer>::swap(
+    OutputDataIterator<TValue, TContainer> &other) {
+    std::swap(this->m_current_index, other.m_current_index);
+    std::swap(this->mp_output_data, other.mp_output_data);
+}
+
+//! test for equality
+template <class TValue1, class TContainer1, class TValue2, class TContainer2>
+bool operator==(const OutputDataIterator<TValue1, TContainer1> &left,
+                const OutputDataIterator<TValue2, TContainer2> &right) {
+    return left.getContainer() == right.getContainer() &&
+           left.getIndex() == right.getIndex();
+}
+
+//! test for inequality
+template <class TValue1, class TContainer1, class TValue2, class TContainer2>
+bool operator!=(const OutputDataIterator<TValue1, TContainer1> &left,
+                const OutputDataIterator<TValue2, TContainer2> &right) {
+    return !(left == right);
+}
+
+#endif // OUTPUTDATAITERATOR_H
diff --git a/Core/Instrument/RectangularDetector.cpp b/Core/Instrument/RectangularDetector.cpp
new file mode 100644
index 0000000..1886a60
--- /dev/null
+++ b/Core/Instrument/RectangularDetector.cpp
@@ -0,0 +1,414 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/RectangularDetector.cpp
+//! @brief     Implements class RectangularDetector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RectangularDetector.h"
+#include "Beam.h"
+#include "BornAgainNamespace.h"
+#include "IDetectorResolution.h"
+#include "SimulationElement.h"
+#include "MathConstants.h"
+#include "Units.h"
+
+RectangularDetector::RectangularDetector(int nxbins, double width, int nybins, double height)
+    : m_u0(0.0)
+    , m_v0(0.0)
+    , m_direction(kvector_t(0.0, -1.0, 0.0))
+    , m_distance(0.0)
+    , m_dbeam_u0(0.0)
+    , m_dbeam_v0(0.0)
+    , m_detector_arrangement(GENERIC)
+{
+    setDetectorParameters(nxbins, 0.0, width, nybins, 0.0, height);
+    setName(BornAgain::RectangularDetectorType);
+    init_parameters();
+}
+
+RectangularDetector::RectangularDetector(const RectangularDetector& other)
+    : IDetector2D(other)
+    , m_normal_to_detector(other.m_normal_to_detector)
+    , m_u0(other.m_u0)
+    , m_v0(other.m_v0)
+    , m_direction(other.m_direction)
+    , m_distance(other.m_distance)
+    , m_dbeam_u0(other.m_dbeam_u0)
+    , m_dbeam_v0(other.m_dbeam_v0)
+    , m_detector_arrangement(other.m_detector_arrangement)
+    , m_u_unit(other.m_u_unit)
+    , m_v_unit(other.m_v_unit)
+{
+    setName(BornAgain::RectangularDetectorType);
+    init_parameters();
+}
+
+RectangularDetector::~RectangularDetector() {}
+
+RectangularDetector *RectangularDetector::clone() const
+{
+    return new RectangularDetector(*this);
+}
+
+void RectangularDetector::init(const Beam& beam)
+{
+    double alpha_i = beam.getAlpha();
+    kvector_t central_k = beam.getCentralK();
+    initNormalVector(central_k);
+    initUandV(alpha_i);
+}
+
+void RectangularDetector::setPosition(const kvector_t normal_to_detector,
+                                      double u0, double v0, const kvector_t direction)
+{
+    m_detector_arrangement = GENERIC;
+    m_normal_to_detector = normal_to_detector;
+    m_u0 = u0;
+    m_v0 = v0;
+    m_direction = direction;
+}
+
+void RectangularDetector::setPerpendicularToSampleX(double distance, double u0, double v0)
+{
+    m_detector_arrangement = PERPENDICULAR_TO_SAMPLE;
+    setDistanceAndOffset(distance, u0, v0);
+}
+
+void RectangularDetector::setPerpendicularToDirectBeam(double distance, double u0, double v0)
+{
+    m_detector_arrangement = PERPENDICULAR_TO_DIRECT_BEAM;
+    setDistanceAndOffset(distance, u0, v0);
+}
+
+void RectangularDetector::setPerpendicularToReflectedBeam(double distance, double u0, double v0)
+{
+    m_detector_arrangement = PERPENDICULAR_TO_REFLECTED_BEAM;
+    setDistanceAndOffset(distance, u0, v0);
+}
+
+void RectangularDetector::setDirectBeamPosition(double u0, double v0)
+{
+    m_detector_arrangement = PERPENDICULAR_TO_REFLECTED_BEAM_DPOS;
+    m_dbeam_u0 = u0;
+    m_dbeam_v0 = v0;
+}
+
+IPixelMap *RectangularDetector::createPixelMap(size_t index) const
+{
+    const IAxis& u_axis = getAxis(BornAgain::X_AXIS_INDEX);
+    const IAxis& v_axis = getAxis(BornAgain::Y_AXIS_INDEX);
+    size_t u_index = getAxisBinIndex(index, BornAgain::X_AXIS_INDEX);
+    size_t v_index = getAxisBinIndex(index, BornAgain::Y_AXIS_INDEX);
+
+    Bin1D u_bin = u_axis.getBin(u_index);
+    Bin1D v_bin = v_axis.getBin(v_index);
+    kvector_t corner_position( m_normal_to_detector
+            + (u_bin.m_lower - m_u0)*m_u_unit + (v_bin.m_lower - m_v0)*m_v_unit );
+    kvector_t width = u_bin.getBinSize()*m_u_unit;
+    kvector_t height = v_bin.getBinSize()*m_v_unit;
+    return new RectPixelMap(corner_position, width, height);
+}
+
+std::string RectangularDetector::addParametersToExternalPool(
+    const std::string& path, ParameterPool *external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path
+        = IParameterized::addParametersToExternalPool(path, external_pool, copy_number);
+
+    // add parameters of the resolution function
+    if (mP_detector_resolution)
+        mP_detector_resolution->addParametersToExternalPool(new_path, external_pool, -1);
+    return new_path;
+}
+
+double RectangularDetector::getWidth() const
+{
+    const IAxis& axis = getAxis(BornAgain::X_AXIS_INDEX);
+    return axis.getMax() - axis.getMin();
+}
+
+double RectangularDetector::getHeight() const
+{
+    const IAxis& axis = getAxis(BornAgain::Y_AXIS_INDEX);
+    return axis.getMax() - axis.getMin();
+}
+
+size_t RectangularDetector::getNbinsX() const
+{
+    return getAxis(BornAgain::X_AXIS_INDEX).size();
+}
+
+size_t RectangularDetector::getNbinsY() const
+{
+    return getAxis(BornAgain::Y_AXIS_INDEX).size();
+}
+
+kvector_t RectangularDetector::getNormalVector() const
+{
+    return m_normal_to_detector;
+}
+
+double RectangularDetector::getU0() const
+{
+    return m_u0;
+}
+
+double RectangularDetector::getV0() const
+{
+    return m_v0;
+}
+
+kvector_t RectangularDetector::getDirectionVector() const
+{
+    return m_direction;
+}
+
+double RectangularDetector::getDistance() const
+{
+    return m_distance;
+}
+
+double RectangularDetector::getDirectBeamU0() const
+{
+    return m_dbeam_u0;
+}
+
+double RectangularDetector::getDirectBeamV0() const
+{
+    return m_dbeam_v0;
+}
+
+RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrangment() const
+{
+    return m_detector_arrangement;
+}
+
+std::vector<IDetector2D::EAxesUnits> RectangularDetector::getValidAxesUnits() const
+{
+    std::vector<IDetector2D::EAxesUnits> result = IDetector2D::getValidAxesUnits();
+    std::vector<IDetector2D::EAxesUnits> addon =
+        { IDetector2D::RADIANS, IDetector2D::DEGREES, IDetector2D::MM, IDetector2D::QYQZ };
+    result.insert(result.end(), addon.begin(), addon.end());
+    return result;
+}
+
+IDetector2D::EAxesUnits RectangularDetector::getDefaultAxesUnits() const
+{
+    return IDetector2D::MM;
+}
+
+void RectangularDetector::print(std::ostream& ostr) const
+{
+    ostr << "RectangularDetector: '" << getName() << "' " << getParameterPool();
+    for (size_t i = 0; i < m_axes.size(); ++i)
+        ostr << "    IAxis:" << *m_axes[i] << std::endl;
+}
+
+IAxis *RectangularDetector::createAxis(size_t index, size_t n_bins, double min, double max) const
+{
+    if (max <= min)
+        throw Exceptions::LogicErrorException(
+            "RectangularDetector::createAxis() -> Error! max <= min");
+    if (n_bins == 0)
+        throw Exceptions::LogicErrorException(
+            "RectangularDetector::createAxis() -> Error! Number n_bins can't be zero.");
+    return new FixedBinAxis(getAxisName(index), n_bins, min, max);
+}
+
+void RectangularDetector::calculateAxisRange(size_t axis_index, const Beam &beam,
+    IDetector2D::EAxesUnits units, double &amin, double &amax) const
+{
+    amin = 0.0; amax=0.0;
+    if(units == MM) {
+        amin = getAxis(axis_index).getMin();
+        amax = getAxis(axis_index).getMax();
+    }else if(units == RADIANS || units == DEGREES) {
+        double scale(1.0);
+        if (units == DEGREES)
+            scale = 1. / Units::degree;
+
+        if(axis_index == BornAgain::X_AXIS_INDEX) {
+            const IAxis &aX = getAxis(BornAgain::X_AXIS_INDEX);
+            SimulationElement el_left_bottom
+                = getSimulationElement(getGlobalIndex(0, 0), beam);
+            SimulationElement el_right_bottom
+                = getSimulationElement(getGlobalIndex(aX.size()-1, 0), beam);
+            amin = scale * el_left_bottom.getPhi(0.0, 0.0);
+            amax = scale * el_right_bottom.getPhi(1.0, 0.0);
+        } else if(axis_index == BornAgain::Y_AXIS_INDEX) {
+            const IAxis &aX = getAxis(BornAgain::X_AXIS_INDEX);
+            const IAxis &aY = getAxis(BornAgain::Y_AXIS_INDEX);
+            SimulationElement el_center_bottom
+                = getSimulationElement(getGlobalIndex(aX.size()/2, 0), beam);
+            SimulationElement el_center_top
+                = getSimulationElement(getGlobalIndex(aX.size()/2, aY.size()-1), beam);
+            amin = scale * el_center_bottom.getAlpha(0.5, 0.0);
+            amax = scale * el_center_top.getAlpha(0.5, 1.0);
+        }
+
+    } else {
+        IDetector2D::calculateAxisRange(axis_index, beam, units, amin, amax);
+    }
+
+}
+
+std::string RectangularDetector::getAxisName(size_t index) const
+{
+    switch (index) {
+    case 0:
+        return BornAgain::U_AXIS_NAME;
+    case 1:
+        return BornAgain::V_AXIS_NAME;
+    default:
+        throw Exceptions::LogicErrorException(
+            "RectangularDetector::getAxisName(size_t index) -> Error! index > 1");
+    }
+}
+
+size_t RectangularDetector::getIndexOfSpecular(const Beam& beam) const
+{
+    if (getDimension()!=2) return getTotalSize();
+    double alpha = beam.getAlpha();
+    double phi = beam.getPhi();
+    kvector_t k_spec = vecOfLambdaAlphaPhi(beam.getWavelength(), alpha, phi);
+    kvector_t normal_unit = m_normal_to_detector.unit();
+    double kd = k_spec.dot(normal_unit);
+    if (kd<=0.0) return getTotalSize();
+    kvector_t k_orth = (k_spec/kd - normal_unit)*m_distance;
+    double u = k_orth.dot(m_u_unit) + m_u0;
+    double v = k_orth.dot(m_v_unit) + m_v0;
+    const IAxis& u_axis = getAxis(BornAgain::X_AXIS_INDEX);
+    const IAxis& v_axis = getAxis(BornAgain::Y_AXIS_INDEX);
+    size_t u_index = u_axis.findIndex(u);
+    size_t v_index = v_axis.findIndex(v);
+    if (u_index < u_axis.size() && v_index < v_axis.size()) {
+        return getGlobalIndex(u_index, v_index);
+    }
+    return getTotalSize();
+}
+
+void RectangularDetector::setDistanceAndOffset(double distance, double u0, double v0)
+{
+    if(distance <= 0.0) {
+        std::ostringstream message;
+        message << "RectangularDetector::setPerpendicularToSample() -> Error. "
+                << "Distance to sample can't be negative or zero";
+        throw Exceptions::LogicErrorException(message.str());
+    }
+    m_distance = distance;
+    m_u0 = u0;
+    m_v0 = v0;
+}
+
+void RectangularDetector::initNormalVector(const kvector_t central_k)
+{
+    kvector_t central_k_unit = central_k.unit();
+
+    if (m_detector_arrangement == GENERIC) {
+        // do nothing
+    }
+
+    else if(m_detector_arrangement == PERPENDICULAR_TO_SAMPLE) {
+        m_normal_to_detector = kvector_t(m_distance, 0.0, 0.0);
+    }
+
+    else if(m_detector_arrangement == PERPENDICULAR_TO_DIRECT_BEAM) {
+        m_normal_to_detector = m_distance*central_k_unit;
+    }
+
+    else if(m_detector_arrangement == PERPENDICULAR_TO_REFLECTED_BEAM) {
+        m_normal_to_detector = m_distance*central_k_unit;
+        m_normal_to_detector.setZ(-m_normal_to_detector.z());
+    }
+
+    else if(m_detector_arrangement == PERPENDICULAR_TO_REFLECTED_BEAM_DPOS) {
+        m_normal_to_detector = m_distance*central_k_unit;
+        m_normal_to_detector.setZ(-m_normal_to_detector.z());
+    }
+
+    else {
+        throw Exceptions::LogicErrorException(
+            "RectangularDetector::init() -> Unknown detector arrangement");
+    }
+}
+
+void RectangularDetector::initUandV(double alpha_i)
+{
+    double d2 = m_normal_to_detector.dot(m_normal_to_detector);
+    kvector_t u_direction =
+            d2 * m_direction - m_direction.dot(m_normal_to_detector) * m_normal_to_detector;
+    m_u_unit = u_direction.unit();
+    m_v_unit = m_u_unit.cross(m_normal_to_detector).unit();
+
+    if(m_detector_arrangement == PERPENDICULAR_TO_REFLECTED_BEAM_DPOS) {
+        kvector_t z(0.0, 0.0, 1.0);
+        kvector_t normal_unit = m_normal_to_detector.unit();
+        kvector_t zp = z - z.dot(normal_unit)*normal_unit;
+        double uz = zp.dot(m_u_unit)/zp.mag();
+        double vz = zp.dot(m_v_unit)/zp.mag();
+        m_u0 = m_dbeam_u0 + m_distance*std::tan(2*alpha_i)*uz;
+        m_v0 = m_dbeam_v0 + m_distance*std::tan(2*alpha_i)*vz;
+    }
+}
+
+RectPixelMap::RectPixelMap(kvector_t corner_pos, kvector_t width, kvector_t height)
+    : m_corner_pos(corner_pos), m_width(width), m_height(height)
+{
+    m_normal = m_width.cross(m_height);
+    m_solid_angle = calculateSolidAngle();
+}
+
+RectPixelMap *RectPixelMap::clone() const
+{
+    return new RectPixelMap(m_corner_pos, m_width, m_height);
+}
+
+RectPixelMap *RectPixelMap::createZeroSizeMap(double x, double y) const
+{
+    kvector_t position = m_corner_pos + x*m_width + y*m_height;
+    kvector_t null_vector;
+    return new RectPixelMap(position, null_vector, null_vector);
+}
+
+kvector_t RectPixelMap::getK(double x, double y, double wavelength) const
+{
+    kvector_t direction = m_corner_pos + x*m_width + y*m_height;
+    double length = PI2/wavelength;
+    return normalizeLength(direction, length);
+}
+
+double RectPixelMap::getIntegrationFactor(double x, double y) const
+{
+    if (m_solid_angle==0.0) return 1.0;
+    kvector_t position = m_corner_pos + x*m_width + y*m_height;
+    double length = position.mag();
+    return std::abs(position.dot(m_normal))/std::pow(length, 3)/m_solid_angle;
+}
+
+double RectPixelMap::getSolidAngle() const
+{
+    if (m_solid_angle<=0.0) return 1.0;
+    return m_solid_angle;
+}
+
+kvector_t RectPixelMap::normalizeLength(const kvector_t direction, double length) const
+{
+    return direction.unit()*length;
+}
+
+double RectPixelMap::calculateSolidAngle() const
+{
+    kvector_t position = m_corner_pos + 0.5*m_width + 0.5*m_height;
+    double length = position.mag();
+    return std::abs(position.dot(m_normal))/std::pow(length, 3);
+}
diff --git a/Core/Instrument/RectangularDetector.h b/Core/Instrument/RectangularDetector.h
new file mode 100644
index 0000000..10ce698
--- /dev/null
+++ b/Core/Instrument/RectangularDetector.h
@@ -0,0 +1,146 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/RectangularDetector.h
+//! @brief     Defines class RectangularDetector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RECTANGULARDETECTOR_H
+#define RECTANGULARDETECTOR_H
+
+#include "IDetector2D.h"
+#include "IPixelMap.h"
+
+//! @class RectangularDetector
+//! @ingroup simulation
+//! @brief A rectangular plane detector with axes and resolution function.
+
+class BA_CORE_API_ RectangularDetector : public IDetector2D
+{
+public:
+    enum EDetectorArrangement {
+        GENERIC,
+        PERPENDICULAR_TO_SAMPLE,
+        PERPENDICULAR_TO_DIRECT_BEAM,
+        PERPENDICULAR_TO_REFLECTED_BEAM,
+        PERPENDICULAR_TO_REFLECTED_BEAM_DPOS
+    };
+
+    //! Rectangular detector constructor
+    //! @param nxbins Number of bins (pixels) in x-direction
+    //! @param width Width of the detector in mm along x-direction
+    //! @param nybins Number of bins (pixels) in y-direction
+    //! @param height Height of the detector in mm along y-direction
+    RectangularDetector(int nxbins, double width, int nybins, double height);
+
+    RectangularDetector(const RectangularDetector& other);
+
+    RectangularDetector* clone() const override;
+
+    ~RectangularDetector();
+
+    void init(const Beam& beam) override;
+
+    void setPosition(const kvector_t normal_to_detector, double u0, double v0,
+                     const kvector_t direction = kvector_t(0.0, -1.0, 0.0));
+
+    void setPerpendicularToSampleX(double distance, double u0, double v0);
+
+    void setPerpendicularToDirectBeam(double distance, double u0, double v0);
+    void setPerpendicularToReflectedBeam(double distance, double u0 = 0.0, double v0 = 0.0);
+    void setDirectBeamPosition(double u0, double v0);
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const override;
+
+    double getWidth() const;
+    double getHeight() const;
+    size_t getNbinsX() const;
+    size_t getNbinsY() const;
+    kvector_t getNormalVector() const;
+    double getU0() const;
+    double getV0() const;
+    kvector_t getDirectionVector() const;
+    double getDistance() const;
+    double getDirectBeamU0() const;
+    double getDirectBeamV0() const;
+    EDetectorArrangement getDetectorArrangment() const;
+
+    //! returns vector of valid axes units
+    std::vector<EAxesUnits> getValidAxesUnits() const override;
+
+    //! return default axes units
+    EAxesUnits getDefaultAxesUnits() const override;
+
+protected:
+    //! Create an IPixelMap for the given OutputData object and index
+    IPixelMap* createPixelMap(size_t index) const override;
+
+    void print(std::ostream& ostr) const override;
+
+    //! Registers some class members for later access via parameter pool.
+    void init_parameters() override {}
+
+    //! Generates an axis with correct name and default binning for given index
+    IAxis* createAxis(size_t index, size_t n_bins, double min, double max) const override;
+
+    //! Calculates axis range from original detector axes in given units (mm, rad, etc)
+    virtual void calculateAxisRange(size_t axis_index, const Beam& beam, EAxesUnits units,
+                                    double &amin, double &amax) const override;
+
+    //! Returns the name for the axis with given index
+    std::string getAxisName(size_t index) const override;
+
+    //! Returns index of pixel that contains the specular wavevector.
+    //! If no pixel contains this specular wavevector, the number of pixels is
+    //! returned. This corresponds to an overflow index.
+    size_t getIndexOfSpecular(const Beam& beam) const override;
+
+    //! swap function
+    void swapContent(RectangularDetector& other);
+private:
+    void setDistanceAndOffset(double distance, double u0, double v0);
+    void initNormalVector(const kvector_t central_k);
+    void initUandV(double alpha_i);
+
+    kvector_t m_normal_to_detector;
+    double m_u0, m_v0; //!< position of normal vector hitting point in detector coordinates
+    kvector_t m_direction; //!< direction vector of detector coordinate system
+    double m_distance; //!< distance from sample origin to the detector plane
+    double m_dbeam_u0, m_dbeam_v0; //!< position of direct beam in detector coordinates
+    EDetectorArrangement m_detector_arrangement;
+    kvector_t m_u_unit;
+    kvector_t m_v_unit;
+};
+
+class RectPixelMap : public IPixelMap
+{
+public:
+    RectPixelMap(kvector_t corner_pos, kvector_t width, kvector_t height);
+    virtual ~RectPixelMap() {}
+
+    RectPixelMap* clone() const override;
+    RectPixelMap* createZeroSizeMap(double x, double y) const override;
+    kvector_t getK(double x, double y, double wavelength) const override;
+    double getIntegrationFactor(double x, double y) const override;
+    double getSolidAngle() const override;
+private:
+    kvector_t normalizeLength(const kvector_t direction, double length) const;
+    double calculateSolidAngle() const;
+    kvector_t m_corner_pos;
+    kvector_t m_width;
+    kvector_t m_height;
+    double m_solid_angle;
+    kvector_t m_normal;
+};
+
+#endif // RECTANGULARDETECTOR_H
diff --git a/Core/Instrument/RegionOfInterest.cpp b/Core/Instrument/RegionOfInterest.cpp
new file mode 100644
index 0000000..8e09de3
--- /dev/null
+++ b/Core/Instrument/RegionOfInterest.cpp
@@ -0,0 +1,155 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/RegionOfInterest.cpp
+//! @brief     Implements class RegionOfInterest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RegionOfInterest.h"
+#include "Rectangle.h"
+#include "IDetector2D.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+
+RegionOfInterest::RegionOfInterest(const IDetector2D &detector,
+                                   double xlow, double ylow, double xup, double yup)
+    : RegionOfInterest(xlow, ylow, xup, yup)
+{
+    initFrom(detector.getAxis(BornAgain::X_AXIS_INDEX), detector.getAxis(BornAgain::Y_AXIS_INDEX));
+}
+
+RegionOfInterest::RegionOfInterest(const OutputData<double> &data,
+                                   double xlow, double ylow, double xup, double yup)
+    : RegionOfInterest(xlow, ylow, xup, yup)
+{
+    if(data.getRank() != 2)
+        throw Exceptions::RuntimeErrorException("RegionOfInterest::RegionOfInterest() -> Error. "
+                                                "Data is not two-dimensional.");
+
+    initFrom(data.getAxis(BornAgain::X_AXIS_INDEX), data.getAxis(BornAgain::Y_AXIS_INDEX));
+}
+
+RegionOfInterest::RegionOfInterest(double xlow, double ylow, double xup, double yup)
+    : m_rectangle(new Geometry::Rectangle(xlow, ylow, xup, yup))
+    , m_ax1(0)
+    , m_ay1(0)
+    , m_ax2(0)
+    , m_ay2(0)
+    , m_glob_index0(0)
+{
+
+}
+
+RegionOfInterest *RegionOfInterest::clone() const
+{
+    return new RegionOfInterest(*this);
+}
+
+RegionOfInterest::~RegionOfInterest()
+{
+
+}
+
+RegionOfInterest::RegionOfInterest(const RegionOfInterest &other)
+    : m_rectangle(other.m_rectangle->clone())
+    , m_ax1(other.m_ax1)
+    , m_ay1(other.m_ay1)
+    , m_ax2(other.m_ax2)
+    , m_ay2(other.m_ay2)
+    , m_glob_index0(other.m_glob_index0)
+    , m_detector_dims(other.m_detector_dims)
+    , m_roi_dims(other.m_roi_dims)
+{
+
+}
+
+double RegionOfInterest::getXlow() const
+{
+    return m_rectangle->getXlow();
+}
+
+double RegionOfInterest::getYlow() const
+{
+    return m_rectangle->getYlow();
+}
+
+double RegionOfInterest::getXup() const
+{
+    return m_rectangle->getXup();
+}
+
+double RegionOfInterest::getYup() const
+{
+    return m_rectangle->getYup();
+}
+
+size_t RegionOfInterest::detectorIndex(size_t roiIndex) const
+{
+    return m_glob_index0 + ycoord(roiIndex, m_roi_dims)
+            + xcoord(roiIndex, m_roi_dims)*m_detector_dims[1];
+}
+
+size_t RegionOfInterest::roiIndex(size_t globalIndex) const
+{
+    size_t ny = ycoord(globalIndex, m_detector_dims);
+    if(ny < m_ay1 || ny > m_ay2)
+        throw Exceptions::RuntimeErrorException("RegionOfInterest::roiIndex() -> Error.");
+
+    size_t nx = xcoord(globalIndex, m_detector_dims);
+    if(nx < m_ax1 || nx > m_ax2)
+        throw Exceptions::RuntimeErrorException("RegionOfInterest::roiIndex() -> Error.");
+
+    return ny - m_ay1 + (nx - m_ax1)*m_roi_dims[1];
+}
+
+size_t RegionOfInterest::roiSize() const
+{
+    return m_roi_dims[0]*m_roi_dims[1];
+}
+
+size_t RegionOfInterest::detectorSize() const
+{
+    return m_detector_dims[0]*m_detector_dims[1];
+}
+
+bool RegionOfInterest::isInROI(size_t detectorIndex) const
+{
+    size_t ny = ycoord(detectorIndex, m_detector_dims);
+    if(ny<m_ay1 || ny>m_ay2) return false;
+    size_t nx = xcoord(detectorIndex, m_detector_dims);
+    if(nx<m_ax1 || nx>m_ax2) return false;
+    return true;
+}
+
+std::unique_ptr<IAxis> RegionOfInterest::clipAxisToRoi(size_t axis_index, const IAxis &axis) const
+{
+    size_t nbin1 = (axis_index == BornAgain::X_AXIS_INDEX ? m_ax1 : m_ay1);
+    size_t nbin2 = (axis_index == BornAgain::X_AXIS_INDEX ? m_ax2 : m_ay2);
+    return std::unique_ptr<IAxis>(new FixedBinAxis(axis.getName(), nbin2-nbin1+1,
+                                    axis.getBin(nbin1).m_lower, axis.getBin(nbin2).m_upper));
+}
+
+void RegionOfInterest::initFrom(const IAxis &x_axis, const IAxis &y_axis)
+{
+    m_detector_dims.push_back(x_axis.size());
+    m_detector_dims.push_back(y_axis.size());
+
+    m_ax1 = x_axis.findClosestIndex(getXlow());
+    m_ax2 = x_axis.findClosestIndex(getXup());
+    m_ay1 = y_axis.findClosestIndex(getYlow());
+    m_ay2 = y_axis.findClosestIndex(getYup());
+
+    m_roi_dims.push_back(m_ax2-m_ax1+1);
+    m_roi_dims.push_back(m_ay2-m_ay1+1);
+
+    m_glob_index0 = m_ay1 + m_ax1*m_detector_dims[1];
+}
+
diff --git a/Core/Instrument/RegionOfInterest.h b/Core/Instrument/RegionOfInterest.h
new file mode 100644
index 0000000..6fdac41
--- /dev/null
+++ b/Core/Instrument/RegionOfInterest.h
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/RegionOfInterest.h
+//! @brief     Defines class RegionOfInterest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REGIONOFINTEREST_H
+#define REGIONOFINTEREST_H
+
+#include "ICloneable.h"
+#include <memory>
+#include <vector>
+
+namespace Geometry { class Rectangle; }
+class IDetector2D;
+class IAxis;
+template<class T> class OutputData;
+
+//! Defines rectangular area for the detector which will be simulated/fitted.
+//! @ingroup simulation
+
+class BA_CORE_API_ RegionOfInterest : public ICloneable
+{
+public:
+    RegionOfInterest(const IDetector2D& detector,
+                     double xlow, double ylow, double xup, double yup);
+    RegionOfInterest(const OutputData<double> &data,
+                     double xlow, double ylow, double xup, double yup);
+
+    RegionOfInterest& operator=(const RegionOfInterest &other) = delete;
+    RegionOfInterest *clone() const;
+    ~RegionOfInterest();
+
+    double getXlow() const;
+    double getYlow() const;
+    double getXup()  const;
+    double getYup()  const;
+
+    //! Converts roi index to the detector index.
+    size_t detectorIndex(size_t roiIndex) const;
+
+    //! Converts global detector index to ROI index.
+    size_t roiIndex(size_t detectorIndex) const;
+
+    //! Number of detector bins in ROI area
+    size_t roiSize() const;
+
+    //! Number of detector bins.
+    size_t detectorSize() const;
+
+    bool isInROI(size_t detectorIndex) const;
+
+    std::unique_ptr<IAxis> clipAxisToRoi(size_t axis_index, const IAxis &axis) const;
+
+private:
+    RegionOfInterest(double xlow, double ylow, double xup, double yup);
+    RegionOfInterest(const RegionOfInterest &other);
+
+    size_t xcoord(size_t index, const std::vector<size_t> &dims) const;
+    size_t ycoord(size_t index, const std::vector<size_t> &dims) const;
+
+    void initFrom(const IAxis &x_axis, const IAxis &y_axis);
+
+    std::unique_ptr<Geometry::Rectangle> m_rectangle;
+    //!< Number of bins on detector axes corresponding to roi-rectanle.
+    size_t m_ax1, m_ay1, m_ax2, m_ay2;
+    //!< Detector global index corresponding to the lower left corner of ROI
+    size_t m_glob_index0;
+    std::vector<size_t> m_detector_dims;
+    std::vector<size_t> m_roi_dims;
+};
+
+inline
+size_t RegionOfInterest::xcoord(size_t index, const std::vector<size_t> &dims) const
+{
+    return index/dims[1] % dims[0];
+}
+
+inline
+size_t RegionOfInterest::ycoord(size_t index, const std::vector<size_t> &dims) const
+{
+    return index % dims[1];
+}
+
+#endif
diff --git a/Core/Instrument/ResolutionFunction2DGaussian.cpp b/Core/Instrument/ResolutionFunction2DGaussian.cpp
new file mode 100644
index 0000000..6cd1479
--- /dev/null
+++ b/Core/Instrument/ResolutionFunction2DGaussian.cpp
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/ResolutionFunction2DGaussian.cpp
+//! @brief     Implements class ResolutionFunction2DGaussian.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ResolutionFunction2DGaussian.h"
+#include "BornAgainNamespace.h"
+#include "MathFunctions.h"
+#include "RealParameter.h"
+
+ResolutionFunction2DGaussian::ResolutionFunction2DGaussian(double sigma_x, double sigma_y)
+    : m_sigma_x(sigma_x), m_sigma_y(sigma_y)
+{
+    setName(BornAgain::ResolutionFunction2D);
+    // TODO clarify dimension [if detector->getDefaultAxesUnits()==RADIANS then degrees??]
+    registerParameter(BornAgain::SigmaX, &m_sigma_x).setNonnegative();
+    registerParameter(BornAgain::SigmaY, &m_sigma_y).setNonnegative();
+}
+
+double ResolutionFunction2DGaussian::evaluateCDF(double x, double y) const
+{
+    return MathFunctions::IntegratedGaussian(x, 0.0, m_sigma_x)
+                * MathFunctions::IntegratedGaussian(y, 0.0, m_sigma_y);
+}
diff --git a/Core/Instrument/ResolutionFunction2DGaussian.h b/Core/Instrument/ResolutionFunction2DGaussian.h
new file mode 100644
index 0000000..f636b38
--- /dev/null
+++ b/Core/Instrument/ResolutionFunction2DGaussian.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/ResolutionFunction2DGaussian.h
+//! @brief     Defines class ResolutionFunction2DGaussian.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RESOLUTIONFUNCTION2DGAUSSIAN_H
+#define RESOLUTIONFUNCTION2DGAUSSIAN_H
+
+#include "IResolutionFunction2D.h"
+
+//! @class ResolutionFunction2DGaussian
+//! @ingroup algorithms_internal
+//! @brief Simple gaussian two-dimensional resolution function.
+
+class BA_CORE_API_ ResolutionFunction2DGaussian : public IResolutionFunction2D
+{
+public:
+    ResolutionFunction2DGaussian(double sigma_x, double sigma_y);
+
+    virtual double evaluateCDF(double x, double y) const;
+
+    ResolutionFunction2DGaussian *clone() const {
+        return new ResolutionFunction2DGaussian(m_sigma_x, m_sigma_y); }
+
+    double getSigmaX() const { return m_sigma_x; }
+    double getSigmaY() const { return m_sigma_y; }
+
+private:
+//    ResolutionFunction2DGaussian(const ResolutionFunction2DGaussian& other);
+    ResolutionFunction2DGaussian& operator=(const ResolutionFunction2DGaussian& );
+
+    double m_sigma_x;
+    double m_sigma_y;
+};
+
+#endif // RESOLUTIONFUNCTION2DGAUSSIAN_H
diff --git a/Core/Instrument/SimulationArea.cpp b/Core/Instrument/SimulationArea.cpp
new file mode 100644
index 0000000..32a8007
--- /dev/null
+++ b/Core/Instrument/SimulationArea.cpp
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/SimulationArea.cpp
+//! @brief     Implements class SimulationArea.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationArea.h"
+#include "IDetector2D.h"
+#include "Exceptions.h"
+#include "Rectangle.h"
+#include "IntensityDataFunctions.h"
+#include "BornAgainNamespace.h"
+#include "RegionOfInterest.h"
+#include <sstream>
+
+SimulationArea::SimulationArea(const IDetector2D *detector)
+    : m_detector(detector)
+    , m_max_index(0)
+{
+    if(detector == nullptr)
+        throw Exceptions::RuntimeErrorException("SimulationArea::SimulationArea -> Error. "
+                                                "Detector nullptr.");
+
+    if (m_detector->getDimension()!=2)
+        throw Exceptions::RuntimeErrorException(
+            "SimulationArea::SimulationArea: detector is not two-dimensional");
+
+    if(m_detector->regionOfInterest())
+        m_max_index = m_detector->regionOfInterest()->roiSize();
+    else
+        m_max_index = m_detector->getTotalSize();
+}
+
+SimulationAreaIterator SimulationArea::begin()
+{
+    return SimulationAreaIterator(this, 0);
+}
+
+SimulationAreaIterator SimulationArea::end()
+{
+    return SimulationAreaIterator(this, totalSize());
+}
+
+bool SimulationArea::isMasked(size_t index) const
+{
+    if(index >= totalSize()) {
+        std::ostringstream message;
+        message << "SimulationArea::isActive() -> Error. Index " << index << " is out of range, "
+             << "totalSize=" << totalSize();
+        throw Exceptions::RuntimeErrorException(message.str());
+    }
+
+    return m_detector->getDetectorMask()->isMasked(detectorIndex(index));
+}
+
+size_t SimulationArea::roiIndex(size_t index) const
+{
+    return index;
+}
+
+size_t SimulationArea::detectorIndex(size_t index) const
+{
+    if(!m_detector->regionOfInterest())
+        return index;
+
+    return m_detector->regionOfInterest()->detectorIndex(index);
+}
+
+// --------------------------------------------------------------------------------------
+
+SimulationRoiArea::SimulationRoiArea(const IDetector2D *detector)
+    : SimulationArea(detector)
+{
+
+}
+
+bool SimulationRoiArea::isMasked(size_t) const
+{
+    return false;
+}
diff --git a/Core/Instrument/SimulationArea.h b/Core/Instrument/SimulationArea.h
new file mode 100644
index 0000000..32bcf8a
--- /dev/null
+++ b/Core/Instrument/SimulationArea.h
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/SimulationArea.h
+//! @brief     Defines class SimulationArea.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONAREA_H
+#define SIMULATIONAREA_H
+
+#include "WinDllMacros.h"
+#include "SimulationAreaIterator.h"
+class IDetector2D;
+
+//! Holds iteration logic over active detector channels in the presence of masked areas
+//! and RegionOfInterest defined.
+//! @ingroup simulation
+
+class BA_CORE_API_ SimulationArea
+{
+public:
+    using iterator = SimulationAreaIterator;
+    explicit SimulationArea(const IDetector2D *detector);
+    virtual ~SimulationArea(){}
+
+    SimulationAreaIterator begin();
+    SimulationAreaIterator end();
+
+    //! returns trus if given iterator index correspond to masked detector channel
+    virtual bool isMasked(size_t index) const;
+
+    size_t totalSize() const;
+
+    //! Return index in ROI map from iterator index
+    size_t roiIndex(size_t index) const;
+
+    //! Return detector index from iterator index
+    size_t detectorIndex(size_t index) const;
+
+protected:
+    const IDetector2D *m_detector;
+    size_t m_max_index;
+};
+
+inline size_t SimulationArea::totalSize() const
+{
+    return m_max_index;
+}
+
+
+//! Holds iteration logic over active detector channels in the presence of ROI. On the contrary
+//! to SimulationArea class, iterates also over masked areas.
+//! @ingroup simulation
+
+class BA_CORE_API_ SimulationRoiArea : public SimulationArea
+{
+public:
+    explicit SimulationRoiArea(const IDetector2D *detector);
+
+    virtual bool isMasked(size_t) const;
+
+};
+
+#endif
diff --git a/Core/Instrument/SimulationAreaIterator.cpp b/Core/Instrument/SimulationAreaIterator.cpp
new file mode 100644
index 0000000..0f67121
--- /dev/null
+++ b/Core/Instrument/SimulationAreaIterator.cpp
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/SimulationAreaIterator.cpp
+//! @brief     Implements class SimulationAreaIterator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationAreaIterator.h"
+#include "SimulationArea.h"
+#include "IDetector2D.h"
+
+SimulationAreaIterator::SimulationAreaIterator(const SimulationArea *area, size_t start_at_index)
+    : m_area(area)
+    , m_index(start_at_index)
+    , m_element_index(0)
+{
+    if(m_index > m_area->totalSize())
+        throw Exceptions::RuntimeErrorException("SimulationAreaIterator::SimulationAreaIterator() "
+                                                "-> Error. Invalid initial index");
+
+    if(m_index != m_area->totalSize() && m_area->isMasked(m_index))
+        m_index = nextIndex(m_index);
+}
+
+int SimulationAreaIterator::roiIndex() const
+{
+    return m_area->roiIndex(m_index);
+}
+
+int SimulationAreaIterator::detectorIndex() const
+{
+    return m_area->detectorIndex(m_index);
+}
+
+SimulationAreaIterator &SimulationAreaIterator::operator++()
+{
+    size_t index = nextIndex(m_index);
+    if(index != m_index) {
+        ++m_element_index;
+        m_index = index;
+    }
+    return *this;
+}
+
+SimulationAreaIterator SimulationAreaIterator::operator++(int)
+{
+    SimulationAreaIterator result(*this);
+    this->operator++();
+    return result;
+}
+
+size_t SimulationAreaIterator::nextIndex(size_t currentIndex)
+{
+    size_t result = ++currentIndex;
+    if(result < m_area->totalSize()) {
+        while(m_area->isMasked(result)) {
+            ++result;
+            if(result == m_area->totalSize())
+                break;
+        }
+    } else {
+        return m_area->totalSize();
+    }
+    return result;
+}
+
diff --git a/Core/Instrument/SimulationAreaIterator.h b/Core/Instrument/SimulationAreaIterator.h
new file mode 100644
index 0000000..61f9f31
--- /dev/null
+++ b/Core/Instrument/SimulationAreaIterator.h
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/SimulationAreaIterator.h
+//! @brief     Defines class SimulationAreaIterator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONAREAITERATOR_H
+#define SIMULATIONAREAITERATOR_H
+
+#include "WinDllMacros.h"
+#include <cstdlib>
+class SimulationArea;
+
+//! An iterator for SimulationArea.
+//! @ingroup simulation
+
+class BA_CORE_API_ SimulationAreaIterator
+{
+public:
+    explicit SimulationAreaIterator(const SimulationArea *area, size_t start_at_index);
+
+    size_t index() const { return m_index; }
+    size_t elementIndex() const { return m_element_index;}
+    int roiIndex() const;
+    int detectorIndex() const;
+
+    bool operator==(const SimulationAreaIterator &other) const;
+    bool operator!=(const SimulationAreaIterator &other) const;
+
+    //! prefix increment
+    SimulationAreaIterator& operator++();
+
+    //! postfix increment
+    SimulationAreaIterator operator++(int);
+
+private:
+    size_t nextIndex(size_t currentIndex);
+    const SimulationArea *m_area;
+    size_t m_index;  //!< global index in detector plane defined by its axes
+    size_t m_element_index; //!< sequential number for SimulationElementVector
+};
+
+inline bool SimulationAreaIterator::operator==(const SimulationAreaIterator &other) const
+{
+  return m_area == other.m_area && m_index == other.m_index;
+}
+
+inline bool SimulationAreaIterator::operator!=(const SimulationAreaIterator &right) const
+{
+    return !(*this == right);
+}
+
+#endif
diff --git a/Core/Instrument/SphericalDetector.cpp b/Core/Instrument/SphericalDetector.cpp
new file mode 100644
index 0000000..656fbe4
--- /dev/null
+++ b/Core/Instrument/SphericalDetector.cpp
@@ -0,0 +1,191 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/SphericalDetector.cpp
+//! @brief     Implements class SphericalDetector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SphericalDetector.h"
+#include "BornAgainNamespace.h"
+#include "IDetectorResolution.h"
+#include "IPixelMap.h"
+#include "SimulationElement.h"
+#include "Units.h"
+#include "MathConstants.h"
+
+SphericalDetector::SphericalDetector()
+{
+    setName(BornAgain::SphericalDetectorType);
+    init_parameters();
+}
+
+SphericalDetector::SphericalDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha,
+                                     double alpha_min, double alpha_max)
+{
+    setName(BornAgain::SphericalDetectorType);
+    init_parameters();
+    setDetectorParameters(n_phi, phi_min, phi_max, n_alpha, alpha_min, alpha_max);
+}
+
+SphericalDetector::SphericalDetector(const SphericalDetector& other)
+    : IDetector2D(other)
+{
+    setName(BornAgain::SphericalDetectorType);
+    init_parameters();
+}
+
+SphericalDetector* SphericalDetector::clone() const
+{
+    return new SphericalDetector(*this);
+}
+
+std::string SphericalDetector::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path
+        = IParameterized::addParametersToExternalPool(path, external_pool, copy_number);
+
+    // add parameters of the resolution function
+    if (mP_detector_resolution)
+        mP_detector_resolution->addParametersToExternalPool(new_path, external_pool, -1);
+    return new_path;
+}
+
+std::vector<IDetector2D::EAxesUnits> SphericalDetector::getValidAxesUnits() const
+{
+    std::vector<IDetector2D::EAxesUnits> result = IDetector2D::getValidAxesUnits();
+    std::vector<IDetector2D::EAxesUnits> addon =
+        { IDetector2D::RADIANS, IDetector2D::DEGREES, IDetector2D::QYQZ };
+    result.insert(result.end(), addon.begin(), addon.end());
+    return result;
+}
+
+IDetector2D::EAxesUnits SphericalDetector::getDefaultAxesUnits() const
+{
+    return IDetector2D::RADIANS;
+}
+
+IPixelMap* SphericalDetector::createPixelMap(size_t index) const
+{
+    const IAxis& phi_axis = getAxis(BornAgain::X_AXIS_INDEX);
+    const IAxis& alpha_axis = getAxis(BornAgain::Y_AXIS_INDEX);
+    size_t phi_index = getAxisBinIndex(index, BornAgain::X_AXIS_INDEX);
+    size_t alpha_index = getAxisBinIndex(index, BornAgain::Y_AXIS_INDEX);
+
+    Bin1D alpha_bin = alpha_axis.getBin(alpha_index);
+    Bin1D phi_bin = phi_axis.getBin(phi_index);
+    return new AngularPixelMap(alpha_bin, phi_bin);
+}
+
+void SphericalDetector::print(std::ostream& ostr) const
+{
+    ostr << "SphericalDetector: '" << getName() << "' " << getParameterPool();
+    for (size_t i = 0; i < m_axes.size(); ++i)
+        ostr << "    IAxis:" << *m_axes[i] << std::endl;
+}
+
+IAxis* SphericalDetector::createAxis(size_t index, size_t n_bins, double min, double max) const
+{
+    if (max <= min)
+        throw Exceptions::LogicErrorException(
+            "SphericalDetector::createAxis() -> Error! max <= min");
+    if (n_bins == 0)
+        throw Exceptions::LogicErrorException(
+            "SphericalDetector::createAxis() -> Error! Number n_bins can't be zero.");
+    return new FixedBinAxis(getAxisName(index), n_bins, min, max);
+}
+
+void SphericalDetector::calculateAxisRange(size_t axis_index, const Beam &beam,
+        IDetector2D::EAxesUnits units, double &amin, double &amax) const
+{
+    amin = 0.0; amax=0.0;
+    if(units == DEGREES) {
+        amin = getAxis(axis_index).getMin()/Units::degree;
+        amax = getAxis(axis_index).getMax()/Units::degree;
+    }else if(units == RADIANS) {
+        amin = getAxis(axis_index).getMin();
+        amax = getAxis(axis_index).getMax();
+    } else {
+        IDetector2D::calculateAxisRange(axis_index, beam, units, amin, amax);
+    }
+}
+
+std::string SphericalDetector::getAxisName(size_t index) const
+{
+    switch (index) {
+    case 0:
+        return BornAgain::PHI_AXIS_NAME;
+    case 1:
+        return BornAgain::ALPHA_AXIS_NAME;
+    default:
+        throw Exceptions::LogicErrorException(
+            "SphericalDetector::getAxisName(size_t index) -> Error! index > 1");
+    }
+}
+
+size_t SphericalDetector::getIndexOfSpecular(const Beam& beam) const
+{
+    if (getDimension()!=2) return getTotalSize();
+    double alpha = beam.getAlpha();
+    double phi = beam.getPhi();
+    const IAxis& phi_axis = getAxis(BornAgain::X_AXIS_INDEX);
+    const IAxis& alpha_axis = getAxis(BornAgain::Y_AXIS_INDEX);
+    size_t phi_index = phi_axis.findIndex(phi);
+    size_t alpha_index = alpha_axis.findIndex(alpha);
+    if (phi_index < phi_axis.size() && alpha_index < alpha_axis.size()) {
+        return getGlobalIndex(phi_index, alpha_index);
+    }
+    return getTotalSize();
+}
+
+AngularPixelMap::AngularPixelMap(Bin1D alpha_bin, Bin1D phi_bin)
+    : m_alpha(alpha_bin.m_lower), m_phi(phi_bin.m_lower),
+      m_dalpha(alpha_bin.getBinSize()), m_dphi(phi_bin.getBinSize())
+{
+    m_solid_angle = std::abs(m_dphi*(std::sin(m_alpha+m_dalpha) - std::sin(m_alpha)));
+}
+
+AngularPixelMap* AngularPixelMap::clone() const
+{
+    Bin1D alpha_bin(m_alpha, m_alpha+m_dalpha);
+    Bin1D phi_bin(m_phi, m_phi+m_dphi);
+    return new AngularPixelMap(alpha_bin, phi_bin);
+}
+
+AngularPixelMap* AngularPixelMap::createZeroSizeMap(double x, double y) const
+{
+    double phi = m_phi + x*m_dphi;
+    double alpha = m_alpha + y*m_dalpha;
+    Bin1D alpha_bin(alpha, alpha);
+    Bin1D phi_bin(phi, phi);
+    return new AngularPixelMap(alpha_bin, phi_bin);
+}
+
+kvector_t AngularPixelMap::getK(double x, double y, double wavelength) const
+{
+    double phi = m_phi + x*m_dphi;
+    double alpha = m_alpha + y*m_dalpha;
+    return vecOfLambdaAlphaPhi(wavelength, alpha, phi);
+}
+
+double AngularPixelMap::getIntegrationFactor(double /* x */, double y) const
+{
+    if (m_dalpha==0.0) return 1.0;
+    double alpha = m_alpha + y*m_dalpha;
+    return std::cos(alpha)*m_dalpha/(std::sin(m_alpha+m_dalpha)-std::sin(m_alpha));
+}
+
+double AngularPixelMap::getSolidAngle() const
+{
+    if (m_solid_angle<=0.0) return 1.0;
+    return m_solid_angle;
+}
diff --git a/Core/Instrument/SphericalDetector.h b/Core/Instrument/SphericalDetector.h
new file mode 100644
index 0000000..81a6e58
--- /dev/null
+++ b/Core/Instrument/SphericalDetector.h
@@ -0,0 +1,99 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Instrument/SphericalDetector.h
+//! @brief     Defines class SphericalDetector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPHERICALDETECTOR_H
+#define SPHERICALDETECTOR_H
+
+#include "IDetector2D.h"
+#include "IPixelMap.h"
+
+//! A spherical detector with axes and resolution function.
+//! SphericalDetector
+//! @ingroup simulation
+
+class BA_CORE_API_ SphericalDetector : public IDetector2D
+{
+public:
+    SphericalDetector();
+
+    //! Spherical detector constructor using angle ranges
+    //! @param n_phi number of phi-axis bins
+    //! @param phi_min low edge of first phi-bin
+    //! @param phi_max upper edge of last phi-bin
+    //! @param n_alpha number of alpha-axis bins
+    //! @param alpha_min low edge of first alpha-bin
+    //! @param alpha_max upper edge of last alpha-bin
+    SphericalDetector(size_t n_phi, double phi_min, double phi_max,
+                      size_t n_alpha, double alpha_min, double alpha_max);
+
+    SphericalDetector(const SphericalDetector &other);
+
+    SphericalDetector* clone() const override;
+
+    ~SphericalDetector() override {}
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const override;
+
+    //! returns vector of valid axes units
+    std::vector<EAxesUnits> getValidAxesUnits() const override;
+
+    //! return default axes units
+    EAxesUnits getDefaultAxesUnits() const override;
+
+protected:
+    //! Create an IPixelMap for the given OutputData object and index
+    IPixelMap* createPixelMap(size_t index) const override;
+
+    void print(std::ostream& ostr) const override;
+
+    //! Registers some class members for later access via parameter pool.
+    void init_parameters() override {}
+
+    //! Generates an axis with correct name and default binning for given index
+    IAxis* createAxis(size_t index, size_t n_bins, double min, double max) const override;
+
+    //! Calculates axis range from original detector axes in given units (mm, rad, etc)
+    virtual void calculateAxisRange(size_t axis_index, const Beam& beam, EAxesUnits units,
+                                    double &amin, double &amax) const override;
+
+    //! Returns the name for the axis with given index
+    std::string getAxisName(size_t index) const override;
+
+    //! Returns index of pixel that contains the specular wavevector.
+    //! If no pixel contains this specular wavevector, the number of pixels is
+    //! returned. This corresponds to an overflow index.
+    size_t getIndexOfSpecular(const Beam& beam) const override;
+};
+
+class AngularPixelMap : public IPixelMap
+{
+public:
+    AngularPixelMap(Bin1D alpha_bin, Bin1D phi_bin);
+    virtual ~AngularPixelMap() {}
+
+    AngularPixelMap* clone() const override;
+    AngularPixelMap* createZeroSizeMap(double x, double y) const override;
+    kvector_t getK(double x, double y, double wavelength) const override;
+    double getIntegrationFactor(double x, double y) const override;
+    double getSolidAngle() const override;
+private:
+    double m_alpha, m_phi;
+    double m_dalpha, m_dphi;
+    double m_solid_angle;
+};
+
+#endif // SPHERICALDETECTOR_H
diff --git a/Core/Lattice/ISelectionRule.h b/Core/Lattice/ISelectionRule.h
new file mode 100644
index 0000000..e63aea2
--- /dev/null
+++ b/Core/Lattice/ISelectionRule.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Lattice/ISelectionRule.h
+//! @brief     Defines classes ISelectionRule, SimpleSelectionRule
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISELECTIONRULE_H
+#define ISELECTIONRULE_H
+
+#include "Vectors3D.h"
+
+//! @class ISelectionRule
+//! @ingroup samples_internal
+//! @brief Pure virtual base class for selection rules.
+
+class BA_CORE_API_ ISelectionRule
+{
+public:
+    virtual ~ISelectionRule() {}
+
+    virtual ISelectionRule* clone() const=0;
+
+    virtual bool coordinateSelected(const ivector_t& coordinate) const=0;
+};
+
+//! @class SimpleSelectionRule
+//! @ingroup samples_internal
+//! @brief Selection rule (v*q)%modulus!=0, defined by vector v(a,b,c) and modulus.
+
+class SimpleSelectionRule : public ISelectionRule
+{
+public:
+    SimpleSelectionRule(int a, int b, int c, int modulus);
+    virtual ~SimpleSelectionRule() {}
+
+    virtual SimpleSelectionRule* clone() const;
+
+    virtual bool coordinateSelected(const ivector_t& coordinate) const;
+private:
+    int m_a, m_b, m_c;
+    int m_mod;
+};
+
+inline SimpleSelectionRule::SimpleSelectionRule(
+    int a, int b, int c, int modulus)
+    : m_a(a), m_b(b), m_c(c), m_mod(modulus) {}
+
+inline SimpleSelectionRule* SimpleSelectionRule::clone() const
+{
+    return new SimpleSelectionRule(m_a, m_b, m_c, m_mod);
+}
+
+inline bool SimpleSelectionRule::coordinateSelected(
+        const ivector_t& coordinate) const
+{
+    return (m_a*coordinate[0]+m_b*coordinate[1]+m_c*coordinate[2])%m_mod == 0;
+}
+
+#endif // ISELECTIONRULE_H
diff --git a/Core/Lattice/Lattice.cpp b/Core/Lattice/Lattice.cpp
new file mode 100644
index 0000000..f434dbc
--- /dev/null
+++ b/Core/Lattice/Lattice.cpp
@@ -0,0 +1,209 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Lattice/Lattice.cpp
+//! @brief     Implements class Lattice.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Lattice.h"
+#include "ISelectionRule.h"
+#include "MathConstants.h"
+#include "Transform3D.h"
+#include <gsl/gsl_linalg.h>
+
+Lattice::Lattice(const kvector_t a1, const kvector_t a2, const kvector_t a3)
+: mp_selection_rule(0)
+, m_a1(a1)
+, m_a2(a2)
+, m_a3(a3)
+, m_cache_ok(false)
+{
+    initialize();
+}
+
+Lattice::Lattice(const Lattice& lattice)
+: mp_selection_rule(0)
+, m_a1(lattice.m_a1)
+, m_a2(lattice.m_a2)
+, m_a3(lattice.m_a3)
+, m_cache_ok(false)
+{
+    initialize();
+    if( lattice.mp_selection_rule ) setSelectionRule(*lattice.mp_selection_rule);
+}
+
+Lattice::~Lattice()
+{
+    delete mp_selection_rule;
+}
+
+Lattice Lattice::createTransformedLattice(const Transform3D& transform) const
+{
+    kvector_t a1 = transform.transformed(m_a1);
+    kvector_t a2 = transform.transformed(m_a2);
+    kvector_t a3 = transform.transformed(m_a3);
+    Lattice result = Lattice(a1, a2, a3);
+    if (mp_selection_rule) result.setSelectionRule(*mp_selection_rule);
+    return result;
+}
+
+void Lattice::initialize() const
+{
+    computeReciprocalVectors();
+    m_cache_ok = true;
+}
+
+double Lattice::getVolume() const
+{
+    return std::abs(m_a1.dot( m_a2.cross(m_a3)));
+}
+
+void Lattice::getReciprocalLatticeBasis(kvector_t b1, kvector_t b2,
+        kvector_t b3) const
+{
+    if (!m_cache_ok) {
+        initialize();
+    }
+    b1 = m_b1;
+    b2 = m_b2;
+    b3 = m_b3;
+    return;
+}
+
+ivector_t Lattice::getNearestLatticeVectorCoordinates(const kvector_t vector_in) const
+{
+    double a1_coord = vector_in.dot(m_b1)/M_TWOPI;
+    double a2_coord = vector_in.dot(m_b2)/M_TWOPI;
+    double a3_coord = vector_in.dot(m_b3)/M_TWOPI;
+    int c1 = (int)std::floor(a1_coord + 0.5);
+    int c2 = (int)std::floor(a2_coord + 0.5);
+    int c3 = (int)std::floor(a3_coord + 0.5);
+    return ivector_t(c1, c2, c3);
+}
+
+ivector_t Lattice::getNearestReciprocalLatticeVectorCoordinates(const kvector_t vector_in) const
+{
+    double b1_coord = vector_in.dot(m_a1)/M_TWOPI;
+    double b2_coord = vector_in.dot(m_a2)/M_TWOPI;
+    double b3_coord = vector_in.dot(m_a3)/M_TWOPI;
+    int c1 = (int)std::floor(b1_coord + 0.5);
+    int c2 = (int)std::floor(b2_coord + 0.5);
+    int c3 = (int)std::floor(b3_coord + 0.5);
+    return ivector_t(c1, c2, c3);
+}
+
+std::vector<kvector_t> Lattice::reciprocalLatticeVectorsWithinRadius(
+        const kvector_t input_vector, double radius) const
+{
+    if (!m_cache_ok)
+        initialize();
+    ivector_t nearest_coords = getNearestReciprocalLatticeVectorCoordinates(input_vector);
+    return vectorsWithinRadius(
+        input_vector, nearest_coords, radius, m_b1, m_b2, m_b3, m_a1, m_a2, m_a3);
+}
+
+Lattice Lattice::createFCCLattice(double a)
+{
+    double b = a/2.0;
+    kvector_t a1(0.0, b, b);
+    kvector_t a2(b, 0.0, b);
+    kvector_t a3(b, b, 0.0);
+    return Lattice(a1, a2, a3);
+}
+
+Lattice Lattice::createTrigonalLattice(double a, double c)
+{
+    kvector_t a1(a, 0.0, 0.0);
+    kvector_t a2(-a/2.0, std::sqrt(3.0)*a/2.0, 0);
+    kvector_t a3(0.0, 0.0, c);
+    return Lattice(a1, a2, a3);
+}
+
+void Lattice::computeReciprocalVectors() const
+{
+    kvector_t a23 = m_a2.cross(m_a3);
+    kvector_t a31 = m_a3.cross(m_a1);
+    kvector_t a12 = m_a1.cross(m_a2);
+    m_b1 = M_TWOPI/m_a1.dot(a23)*a23;
+    m_b2 = M_TWOPI/m_a2.dot(a31)*a31;
+    m_b3 = M_TWOPI/m_a3.dot(a12)*a12;
+}
+
+std::vector<kvector_t> Lattice::vectorsWithinRadius(
+    const kvector_t input_vector, const ivector_t& nearest_coords, double radius,
+    const kvector_t v1, const kvector_t v2, const kvector_t v3,
+    const kvector_t rec1, const kvector_t rec2, const kvector_t rec3) const
+{
+    int max_X = (int)std::floor( rec1.mag()*radius/M_TWOPI );
+    int max_Y = (int)std::floor( rec2.mag()*radius/M_TWOPI );
+    int max_Z = (int)std::floor( rec3.mag()*radius/M_TWOPI );
+
+    std::vector<kvector_t> ret;
+    for (int index_X = -max_X; index_X <= max_X; ++index_X) {
+        for (int index_Y = -max_Y; index_Y <= max_Y; ++index_Y) {
+            for (int index_Z = -max_Z; index_Z <= max_Z; ++index_Z) {
+                ivector_t coords(index_X + nearest_coords[0],
+                                 index_Y + nearest_coords[1], index_Z + nearest_coords[2]);
+                if (mp_selection_rule && !mp_selection_rule->coordinateSelected(coords))
+                    continue;
+                kvector_t latticePoint = coords[0]*v1 + coords[1]*v2 + coords[2]*v3;
+                if ((latticePoint - input_vector).mag() <= radius)
+                    ret.push_back(latticePoint);
+            }
+        }
+    }
+    return ret;
+}
+
+void Lattice::computeInverseVectors(const kvector_t v1, const kvector_t v2,
+        const kvector_t v3, kvector_t o1, kvector_t o2, kvector_t o3)
+{
+    gsl_matrix* p_basisMatrix = gsl_matrix_alloc(3, 3);
+    gsl_matrix* p_inverseMatrix = gsl_matrix_alloc(3, 3);
+    gsl_permutation* p_perm = gsl_permutation_alloc (3);
+    int s;
+
+    gsl_matrix_set(p_basisMatrix, 0, 0, v1.x());
+    gsl_matrix_set(p_basisMatrix, 0, 1, v2.x());
+    gsl_matrix_set(p_basisMatrix, 0, 2, v3.x());
+
+    gsl_matrix_set(p_basisMatrix, 1, 0, v1.y());
+    gsl_matrix_set(p_basisMatrix, 1, 1, v2.y());
+    gsl_matrix_set(p_basisMatrix, 1, 2, v3.y());
+
+    gsl_matrix_set(p_basisMatrix, 2, 0, v1.z());
+    gsl_matrix_set(p_basisMatrix, 2, 1, v2.z());
+    gsl_matrix_set(p_basisMatrix, 2, 2, v3.z());
+
+    gsl_linalg_LU_decomp(p_basisMatrix, p_perm, &s);
+    gsl_linalg_LU_invert(p_basisMatrix, p_perm, p_inverseMatrix);
+
+    o1.setX(gsl_matrix_get(p_inverseMatrix, 0, 0));
+    o1.setY(gsl_matrix_get(p_inverseMatrix, 1, 0));
+    o1.setZ(gsl_matrix_get(p_inverseMatrix, 2, 0));
+
+    o2.setX(gsl_matrix_get(p_inverseMatrix, 0, 1));
+    o2.setY(gsl_matrix_get(p_inverseMatrix, 1, 1));
+    o2.setZ(gsl_matrix_get(p_inverseMatrix, 2, 1));
+
+    o3.setX(gsl_matrix_get(p_inverseMatrix, 0, 2));
+    o3.setY(gsl_matrix_get(p_inverseMatrix, 1, 2));
+    o3.setZ(gsl_matrix_get(p_inverseMatrix, 2, 2));
+
+    gsl_permutation_free(p_perm);
+    gsl_matrix_free(p_basisMatrix);
+    gsl_matrix_free(p_inverseMatrix);
+}
+
+void Lattice::setSelectionRule(const ISelectionRule& p_selection_rule) {
+    delete mp_selection_rule;
+    mp_selection_rule = p_selection_rule.clone();
+}
diff --git a/Core/Lattice/Lattice.h b/Core/Lattice/Lattice.h
new file mode 100644
index 0000000..493e726
--- /dev/null
+++ b/Core/Lattice/Lattice.h
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Lattice/Lattice.h
+//! @brief     Defines class Lattice.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LATTICE_H
+#define LATTICE_H
+
+#include "Vectors3D.h"
+#include <vector>
+
+class ISelectionRule;
+class Transform3D;
+
+//! A lattice with three basis vectors.
+//! @ingroup samples
+
+class BA_CORE_API_ Lattice
+{
+public:
+    Lattice() =delete;
+    Lattice(const kvector_t a1, const kvector_t a2, const kvector_t a3);
+    Lattice(const Lattice& lattice);
+    ~Lattice();
+
+    //! Create transformed lattice
+    Lattice createTransformedLattice(const Transform3D& transform) const;
+
+    //! Initializes cached data
+    void initialize() const;
+
+    //! Returns basis vector a
+    kvector_t getBasisVectorA() const { return m_a1; }
+
+    //! Returns basis vector b
+    kvector_t getBasisVectorB() const { return m_a2; }
+
+    //! Returns basis vector c
+    kvector_t getBasisVectorC() const { return m_a3; }
+
+    //! Returns the volume of the unit cell
+    double getVolume() const;
+
+    //! Returns the reciprocal basis vectors
+    void getReciprocalLatticeBasis(kvector_t b1, kvector_t b2, kvector_t b3) const;
+
+    //! Returns the nearest lattice point from a given vector
+    ivector_t getNearestLatticeVectorCoordinates(const kvector_t vector_in) const;
+
+    //! Returns the nearest reciprocal lattice point from a given vector
+    ivector_t getNearestReciprocalLatticeVectorCoordinates(const kvector_t vector_in) const;
+
+    //! Computes a list of reciprocal lattice vectors within a specified distance of a given vector
+    std::vector<kvector_t> reciprocalLatticeVectorsWithinRadius(
+        const kvector_t input_vector, double radius) const;
+
+    //! Sets a selection rule for the reciprocal vectors
+    void setSelectionRule(const ISelectionRule& p_selection_rule);
+
+    static Lattice createFCCLattice(double a);
+
+    static Lattice createTrigonalLattice(double a, double c);
+
+private:
+    Lattice& operator=(const Lattice& lattice);
+
+    std::vector<kvector_t> vectorsWithinRadius(
+        const kvector_t input_vector, const ivector_t& nearest_coords, double radius,
+        const kvector_t v1, const kvector_t v2, const kvector_t v3,
+        const kvector_t rec1, const kvector_t rec2, const kvector_t rec3) const;
+
+    void computeReciprocalVectors() const;
+    static void computeInverseVectors(
+        const kvector_t v1, const kvector_t v2, const kvector_t v3,
+        kvector_t o1, kvector_t o2, kvector_t o3);
+    ISelectionRule *mp_selection_rule;
+    kvector_t m_a1, m_a2, m_a3; //!< Basis vectors in real space
+    mutable kvector_t m_b1, m_b2, m_b3; //!< Cache of basis vectors in reciprocal space
+    //! Boolean indicating if the reciprocal vectors are already initialized in the cache
+    mutable bool m_cache_ok;
+};
+
+#endif // LATTICE_H
diff --git a/Core/Lattice/Lattice1DParameters.h b/Core/Lattice/Lattice1DParameters.h
new file mode 100644
index 0000000..c6e9e00
--- /dev/null
+++ b/Core/Lattice/Lattice1DParameters.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Lattice/Lattice1DParameters.h
+//! @brief     Defines class Lattice1DParameters.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LATTICE1DPARAMETERS_H
+#define LATTICE1DPARAMETERS_H
+
+
+//! Basic parameters of a one-dimensional lattice.
+//! @ingroup samples
+
+class BA_CORE_API_ Lattice1DParameters
+{
+public:
+    Lattice1DParameters() : m_length(0), m_xi(0) {}
+    //! @param length: Lattice constant.
+    //! @param xi: TODO: seems unused; explain or remove
+    Lattice1DParameters(double length, double xi) : m_length(length), m_xi(xi) {}
+
+    double m_length;
+    double m_xi;
+};
+
+#endif // LATTICE1DPARAMETERS_H
diff --git a/Core/Lattice/Lattice2DParameters.cpp b/Core/Lattice/Lattice2DParameters.cpp
new file mode 100644
index 0000000..5fcab23
--- /dev/null
+++ b/Core/Lattice/Lattice2DParameters.cpp
@@ -0,0 +1,21 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Lattice/Lattice2DParameters.cpp
+//! @brief     Implements class Lattice2DParameters.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Lattice2DParameters.h"
+
+double Lattice2DParameters::getUnitCellArea() const
+{
+    return std::abs(m_length_1*m_length_2*std::sin(m_angle));
+}
diff --git a/Core/Lattice/Lattice2DParameters.h b/Core/Lattice/Lattice2DParameters.h
new file mode 100644
index 0000000..5f459a4
--- /dev/null
+++ b/Core/Lattice/Lattice2DParameters.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Lattice/Lattice2DParameters.h
+//! @brief     Defines class Lattice2DParameters.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LATTICE2DPARAMETERS_H
+#define LATTICE2DPARAMETERS_H
+
+#include <cmath>
+
+//! @class Lattice2DParameters
+//! @ingroup samples
+//! @brief Additional parameters for 2D lattice
+
+class Lattice2DParameters
+{
+public:
+    Lattice2DParameters() : m_length_1(0), m_length_2(0), m_angle(0), m_xi(0) {}
+
+    double getUnitCellArea() const;
+
+    double m_length_1, m_length_2;
+    double m_angle;
+    double m_xi;
+};
+
+#endif // LATTICE2DPARAMETERS_H
diff --git a/Core/Mask/Ellipse.cpp b/Core/Mask/Ellipse.cpp
new file mode 100644
index 0000000..3a6d1c6
--- /dev/null
+++ b/Core/Mask/Ellipse.cpp
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Ellipse.cpp
+//! @brief     Implements class Ellipse.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Ellipse.h"
+#include "Bin.h"
+#include "Exceptions.h"
+
+namespace Geometry {
+
+//! @param xcenter x-coordinate of Ellipse's center
+//! @param ycenter y-coordinate of Ellipse's center
+//! @param xradius Radius along x-axis
+//! @param yradius Radius along y-axis
+//! @param theta Angle of Ellipse rotation in radians
+Ellipse::Ellipse(double xcenter, double ycenter, double xradius, double yradius, double theta)
+    : IShape2D("Ellipse")
+    , m_xc(xcenter)
+    , m_yc(ycenter)
+    , m_xr(xradius)
+    , m_yr(yradius)
+    , m_theta(theta)
+{
+    if(xradius <= 0.0 || yradius <= 0.0)
+        throw Exceptions::LogicErrorException(
+            "Ellipse::Ellipse(double xcenter, double ycenter, double xradius, double yradius) "
+            "-> Error. Radius can't be negative\n");
+}
+
+bool Ellipse::contains(double x, double y) const
+{
+    double u = std::cos(m_theta)*(x-m_xc) + std::sin(m_theta)*(y-m_yc);
+    double v = -std::sin(m_theta)*(x-m_xc) + std::cos(m_theta)*(y-m_yc);
+    double d = (u/m_xr)*(u/m_xr) + (v/m_yr)*(v/m_yr);
+    return d<=1;
+}
+
+//! Returns true if area defined by two bins is inside or on border of ellipse;
+//! more precisely, if mid point of two bins satisfy this condition.
+bool Ellipse::contains(const Bin1D &binx, const Bin1D &biny) const
+{
+    return contains(binx.getMidPoint(), biny.getMidPoint());
+}
+
+} // namespace Geometry
diff --git a/Core/Mask/Ellipse.h b/Core/Mask/Ellipse.h
new file mode 100644
index 0000000..b47cbf3
--- /dev/null
+++ b/Core/Mask/Ellipse.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Ellipse.h
+//! @brief     Defines class Rectangle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ELLIPSE_H
+#define ELLIPSE_H
+
+#include "IShape2D.h"
+
+namespace Geometry {
+
+//! @class Ellipse
+//! @ingroup tools
+//! @brief Ellipse shape
+
+class  BA_CORE_API_ Ellipse : public IShape2D {
+public:
+    Ellipse(double xcenter, double ycenter, double xradius, double yradius, double theta = 0.0);
+    Ellipse *clone() const { return new Ellipse(m_xc, m_yc, m_xr, m_yr, m_theta); }
+
+    bool contains(double x, double y) const;
+    bool contains(const Bin1D &binx, const Bin1D &biny) const;
+
+    double getCenterX() const { return m_xc; }
+    double getCenterY() const { return m_yc; }
+    double getRadiusX() const { return m_xr; }
+    double getRadiusY() const { return m_yr; }
+    double getTheta()   const { return m_theta; }
+
+private:
+    double m_xc, m_yc, m_xr, m_yr, m_theta;
+};
+
+} // namespace Geometry
+
+#endif // ELLIPSE_H
diff --git a/Core/Mask/IShape2D.h b/Core/Mask/IShape2D.h
new file mode 100644
index 0000000..16a551c
--- /dev/null
+++ b/Core/Mask/IShape2D.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/IShape2D.h
+//! @brief     Defines basic class for all 2D shapes.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISHAPE2D_H
+#define ISHAPE2D_H
+
+#include "ICloneable.h"
+#include "INamed.h"
+#include <iostream>
+
+struct Bin1D;
+
+namespace Geometry {
+
+//! Basic class for all shapes in 2D.
+//! @ingroup tools
+
+class BA_CORE_API_ IShape2D : public ICloneable, public INamed {
+public:
+    IShape2D(const std::string& name) : INamed(name) {}
+    virtual IShape2D *clone() const = 0;
+
+    //! Returns true if point with given coordinates is inside or on border of the shape.
+    virtual bool contains(double x, double y) const = 0;
+
+    //! Returns true if area defined by two bins is inside or on border of polygon
+    //! (more precisely, if mid point of two bins satisfy this condition).
+    virtual bool contains(const Bin1D &binx, const Bin1D &biny) const = 0;
+
+    friend std::ostream &operator<<(std::ostream &ostr, const IShape2D &shape) {
+        shape.print(ostr); return ostr; }
+
+protected:
+    virtual void print(std::ostream &ostr) const { ostr << getName(); }
+};
+
+} // namespace Geometry
+
+#endif // ISHAPE2D_H
diff --git a/Core/Mask/InfinitePlane.h b/Core/Mask/InfinitePlane.h
new file mode 100644
index 0000000..653aa50
--- /dev/null
+++ b/Core/Mask/InfinitePlane.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/InfinitePlane.h
+//! @brief     Defines class InfinitePlane.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INFINITEPLANE_H
+#define INFINITEPLANE_H
+
+#include "IShape2D.h"
+
+namespace Geometry {
+
+//! The infinite plane is used for masking everything once and forever.
+//! @ingroup tools
+
+class BA_CORE_API_ InfinitePlane : public IShape2D {
+public:
+    InfinitePlane() : IShape2D("InfinitePlane") {}
+    InfinitePlane *clone() const { return new InfinitePlane(); }
+
+    bool contains(double, double) const { return true; }
+    bool contains(const Bin1D&, const Bin1D&) const { return true; }
+};
+
+} // namespace Geometry
+
+#endif // INFINITEPLANE_H
diff --git a/Core/Mask/Line.cpp b/Core/Mask/Line.cpp
new file mode 100644
index 0000000..5ca4ae9
--- /dev/null
+++ b/Core/Mask/Line.cpp
@@ -0,0 +1,104 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Line.cpp
+//! @brief     Implements class Line.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Line.h"
+#include "Bin.h"
+#include "Macros.h"
+#include "Numeric.h"
+#include <limits>
+GCC_DIAG_OFF(unused-parameter)
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point_xy.hpp>
+GCC_DIAG_ON(unused-parameter)
+
+using namespace boost::geometry;
+typedef model::d2::point_xy<double> point_t;
+typedef model::box<point_t> box_t;
+typedef model::linestring<point_t> line_t;
+
+namespace Geometry {
+
+Line::Line(double x1, double y1, double x2, double y2)
+    : IShape2D("Line"), m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2)
+{}
+
+bool Line::contains(double x, double y) const
+{
+    point_t p(x, y);
+    line_t line;
+    line.push_back(point_t(m_x1, m_y1));
+    line.push_back(point_t(m_x2, m_y2));
+
+    double d = distance(p, line);
+
+    return d<std::numeric_limits<double>::epsilon();
+}
+
+// Calculates if line crosses the box made out of our bins.
+// Ugly implementation, see discussion at http://stackoverflow.com/questions/21408977
+bool Line::contains(const Bin1D& binx, const Bin1D& biny) const
+{
+    std::vector<point_t> box_points;
+    box_points.push_back(point_t(binx.m_lower, biny.m_lower));
+    box_points.push_back(point_t(binx.m_lower, biny.m_upper));
+    box_points.push_back(point_t(binx.m_upper, biny.m_upper));
+    box_points.push_back(point_t(binx.m_upper, biny.m_lower));
+    box_points.push_back(point_t(binx.m_lower, biny.m_lower));
+
+    std::vector<point_t> line_points;
+    line_points.push_back(point_t(m_x1, m_y1));
+    line_points.push_back(point_t(m_x2, m_y2));
+
+    return intersects(line_t(box_points.begin(),box_points.end()),
+                      line_t(line_points.begin(),line_points.end()));
+}
+
+
+// ------------------------------------------------------------------------- //
+
+//! @param x The value at which it crosses x-axes
+VerticalLine::VerticalLine(double x)
+    : IShape2D("VerticalLine"), m_x(x)
+{}
+
+bool VerticalLine::contains(double x, double /*y*/) const
+{
+    return Numeric::areAlmostEqual(x, m_x);
+}
+
+bool VerticalLine::contains(const Bin1D& binx, const Bin1D& /*biny*/) const
+{
+    return m_x>=binx.m_lower && m_x <= binx.m_upper;
+}
+
+
+// ------------------------------------------------------------------------- //
+
+//! @param y The value at which it crosses y-axes
+HorizontalLine::HorizontalLine(double y)
+    : IShape2D("HorizontalLine"), m_y(y)
+{}
+
+bool HorizontalLine::contains(double /*x*/, double y) const
+{
+    return Numeric::areAlmostEqual(y, m_y);
+}
+
+bool HorizontalLine::contains(const Bin1D& /*binx*/, const Bin1D& biny) const
+{
+    return m_y>=biny.m_lower && m_y <= biny.m_upper;
+}
+
+} // namespace Geometry
diff --git a/Core/Mask/Line.h b/Core/Mask/Line.h
new file mode 100644
index 0000000..c3c88b2
--- /dev/null
+++ b/Core/Mask/Line.h
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Line.h
+//! @brief     Defines class Line.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LINE_H
+#define LINE_H
+
+#include "IShape2D.h"
+
+namespace Geometry {
+
+//! A line segment.
+//! @ingroup mask
+
+class  BA_CORE_API_ Line : public IShape2D {
+public:
+    Line(double x1, double y1, double x2, double y2);
+    Line *clone() const { return new Line(m_x1, m_y1, m_x2, m_y2); }
+
+    bool contains(double x, double y) const;
+    bool contains(const Bin1D &binx, const Bin1D &biny) const;
+
+private:
+    double m_x1, m_y1, m_x2, m_y2;
+};
+
+
+//! An infinite vertical line.
+//! @ingroup mask
+
+class BA_CORE_API_ VerticalLine : public IShape2D {
+public:
+    VerticalLine(double x);
+    VerticalLine *clone() const { return new VerticalLine(m_x); }
+
+    bool contains(double x, double y) const;
+    bool contains(const Bin1D &binx, const Bin1D &biny) const;
+
+    double getXpos() const { return m_x; }
+
+private:
+    double m_x;
+};
+
+
+//! An infinite horizontal line.
+//! @ingroup mask
+
+class BA_CORE_API_ HorizontalLine : public IShape2D {
+public:
+    HorizontalLine(double y);
+    HorizontalLine *clone() const { return new HorizontalLine(m_y); }
+
+    bool contains(double x, double y) const;
+    bool contains(const Bin1D &binx, const Bin1D &biny) const;
+
+    double getYpos() const { return m_y; }
+
+private:
+    double m_y;
+};
+
+} // namespace Geometry
+
+#endif // LINE_H
diff --git a/Core/Mask/Polygon.cpp b/Core/Mask/Polygon.cpp
new file mode 100644
index 0000000..cbb2858
--- /dev/null
+++ b/Core/Mask/Polygon.cpp
@@ -0,0 +1,133 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Polygon.cpp
+//! @brief     Implements class Polygon.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Polygon.h"
+#include "Bin.h"
+#include "Exceptions.h"
+#include "Macros.h"
+GCC_DIAG_OFF(unused-parameter)
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point_xy.hpp>
+GCC_DIAG_ON(unused-parameter)
+
+using namespace boost::geometry;
+
+namespace Geometry {
+
+//! The private data for polygons to hide boost dependency from the header
+class PolygonPrivate {
+public:
+    typedef model::d2::point_xy<double> point_t;
+    typedef model::polygon<point_t> polygon_t;
+    polygon_t polygon;
+    void init_from(const std::vector<double>& x, const std::vector<double>& y);
+    void get_points(std::vector<double>& xpos, std::vector<double>& ypos);
+};
+
+
+void PolygonPrivate::init_from(const std::vector<double>& x, const std::vector<double>& y)
+{
+    if(x.size() != y.size())
+        throw Exceptions::LogicErrorException(
+            "Polygon::Polygon(const std::vector<double>& x, const std::vector<double>& y) "
+            "Error. Sizes of arrays must conincide.");
+    std::vector<point_t> points;
+    for(size_t i=0; i<x.size(); ++i)
+        points.push_back(point_t(x[i], y[i]));
+    assign_points(polygon, points);
+    correct(polygon);
+}
+
+void PolygonPrivate::get_points(std::vector<double>& xpos, std::vector<double>& ypos)
+{
+    xpos.clear();
+    ypos.clear();
+    for(auto it = polygon.outer().begin(); it != polygon.outer().end(); ++it ) {
+         // for vectors of x and y, extract the x/y from the point
+         xpos.push_back( boost::geometry::get<0>( *it ) );
+         ypos.push_back( boost::geometry::get<1>( *it ) );
+    }
+}
+
+
+//! @param x Vector of x-coordinates of polygon points.
+//! @param y Vector of y-coordinates of polygon points.
+
+// IMPORTANT Input parameters are not "const reference" to be able to work from python
+// (auto convertion of python list to vector<double>).
+Polygon::Polygon(const std::vector<double>& x, const std::vector<double>& y)
+    : IShape2D("Polygon"), m_d(new PolygonPrivate)
+{
+    m_d->init_from(x, y);
+}
+
+// IMPORTANT Input parameter is not "const reference" to be able to work from python
+// (auto convertion of python list to vector<vector<double>>).
+    //! Polygon defined by two  dimensional array with (x,y) coordinates of polygon points.
+    //! The size of second dimension should be 2. If polygon is unclosed (the last point
+    //! doesn't repeat the first one), it will be closed automatically.
+    //! @param points Two dimensional vector of (x,y) coordinates of polygon points.
+Polygon::Polygon(const std::vector<std::vector<double>>& points)
+    : IShape2D("Polygon"), m_d(new PolygonPrivate)
+{
+    std::vector<double> x;
+    std::vector<double> y;
+    for(size_t i=0; i<points.size(); ++i) {
+        if(points[i].size() != 2)
+            throw Exceptions::LogicErrorException(
+                "Polygon(const std::vector<std::vector<double> >& points) -> Error. "
+                " Should be two-dimensional array with second dimension of 2 size.");
+        x.push_back(points[i][0]);
+        y.push_back(points[i][1]);
+    }
+    m_d->init_from(x, y);
+}
+
+Polygon::Polygon(const PolygonPrivate* d)
+    : IShape2D("Polygon"), m_d(new PolygonPrivate(*d))
+{}
+
+Polygon::~Polygon()
+{
+    delete m_d;
+}
+
+bool Polygon::contains(double x, double y) const
+{
+//    return within(PolygonPrivate::point_t(x, y), m_d->polygon); // not including borders
+    return covered_by(PolygonPrivate::point_t(x, y), m_d->polygon); // including borders
+}
+
+bool Polygon::contains(const Bin1D &binx, const Bin1D &biny) const
+{
+    return contains(binx.getMidPoint(), biny.getMidPoint());
+}
+
+double Polygon::getArea() const
+{
+    return area(m_d->polygon);
+}
+
+void Polygon::getPoints(std::vector<double>& xpos, std::vector<double>& ypos) const
+{
+    m_d->get_points(xpos, ypos);
+}
+
+void Polygon::print(std::ostream &ostr) const
+{
+    ostr << wkt<PolygonPrivate::polygon_t>(m_d->polygon);
+}
+
+} // namespace Geometry
diff --git a/Core/Mask/Polygon.h b/Core/Mask/Polygon.h
new file mode 100644
index 0000000..c307b51
--- /dev/null
+++ b/Core/Mask/Polygon.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Polygon.h
+//! @brief     Defines class Polygon.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef POLYGON_H
+#define POLYGON_H
+
+#include "IShape2D.h"
+#include <vector>
+
+namespace Geometry {
+
+class PolygonPrivate;
+
+//! A polygon in 2D space.
+//! @ingroup mask
+
+//! Polygon defined by two arrays with x and y coordinates of points.
+//! Sizes of arrays should coincide.  If polygon is unclosed (the last point
+//! doesn't repeat the first one), it will be closed automatically.
+
+class BA_CORE_API_ Polygon : public IShape2D {
+public:
+    Polygon(const std::vector<double>& x, const std::vector<double>& y);
+    Polygon(const std::vector<std::vector<double>>& points);
+    Polygon(const PolygonPrivate* d);
+
+    virtual ~Polygon();
+
+    virtual Polygon* clone() const { return new Polygon(m_d); }
+
+    virtual bool contains(double x, double y) const;
+    virtual bool contains(const Bin1D &binx, const Bin1D &biny) const;
+
+    double getArea() const;
+
+    void getPoints(std::vector<double>& xpos, std::vector<double>& ypos) const;
+
+protected:
+    virtual void print(std::ostream& ostr) const;
+
+private:
+    PolygonPrivate* m_d;
+};
+
+} // namespace Geometry
+
+#endif // POLYGON_H
diff --git a/Core/Mask/Rectangle.cpp b/Core/Mask/Rectangle.cpp
new file mode 100644
index 0000000..eae9315
--- /dev/null
+++ b/Core/Mask/Rectangle.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Rectangle.cpp
+//! @brief     Implements class Rectangle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Rectangle.h"
+#include "Bin.h"
+#include "Exceptions.h"
+
+namespace Geometry {
+
+//! @param xlow x-coordinate of lower left corner
+//! @param ylow y-coordinate of lower left corner
+//! @param xup x-coordinate of upper right corner
+//! @param yup y-coordinate of upper right corner
+Rectangle::Rectangle(double xlow, double ylow, double xup, double yup)
+    : IShape2D("Rectangle")
+{
+    if(xup <= xlow) {
+        std::ostringstream message;
+        message << "Rectangle(double xlow, double ylow, double xup, double yup) -> Error. ";
+        message << " xup <= xlow" << std::endl;
+        throw Exceptions::LogicErrorException(message.str());
+    }
+    if(yup <= ylow) {
+        std::ostringstream message;
+        message << "Rectangle(double xlow, double ylow, double xup, double yup) -> Error. ";
+        message << " yup <= ylow" << std::endl;
+        throw Exceptions::LogicErrorException(message.str());
+    }
+    m_xlow = xlow;
+    m_ylow = ylow;
+    m_xup = xup;
+    m_yup = yup;
+}
+
+bool Rectangle::contains(double x, double y) const
+{
+    return x <= m_xup && x >= m_xlow && y <= m_yup && y >= m_ylow;
+}
+
+bool Rectangle::contains(const Bin1D &binx, const Bin1D &biny) const
+{
+    return contains(binx.getMidPoint(), biny.getMidPoint());
+}
+
+double Rectangle::getArea() const
+{
+    return (m_xup-m_xlow)*(m_yup-m_ylow);
+}
+
+} // namespace Geometry
diff --git a/Core/Mask/Rectangle.h b/Core/Mask/Rectangle.h
new file mode 100644
index 0000000..123bf6b
--- /dev/null
+++ b/Core/Mask/Rectangle.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Mask/Rectangle.h
+//! @brief     Defines class Rectangle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RECTANGLE_H
+#define RECTANGLE_H
+
+#include "IShape2D.h"
+
+namespace Geometry {
+
+//! The rectangle shape having its axis aligned to the (non-rotated) coordinate system.
+//! @ingroup mask
+
+class BA_CORE_API_ Rectangle : public IShape2D {
+public:
+    Rectangle(double xlow, double ylow, double xup, double yup);
+    Rectangle* clone() const { return new Rectangle(m_xlow, m_ylow, m_xup, m_yup); }
+
+    bool contains(double x, double y) const;
+    bool contains(const Bin1D &binx, const Bin1D &biny) const;
+
+    double getArea() const;
+
+    double getXlow() const { return m_xlow; }
+    double getYlow() const { return m_ylow; }
+    double getXup()  const { return m_xup; }
+    double getYup()  const { return m_yup; }
+
+private:
+    double m_xlow, m_ylow, m_xup, m_yup;
+};
+
+} // namespace Geometry
+
+#endif // RECTANGLE_H
diff --git a/Core/Material/HomogeneousMagneticMaterial.cpp b/Core/Material/HomogeneousMagneticMaterial.cpp
new file mode 100644
index 0000000..74575ef
--- /dev/null
+++ b/Core/Material/HomogeneousMagneticMaterial.cpp
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Material/HomogeneousMagneticMaterial.cpp
+//! @brief     Implements class HomogeneousMagneticMaterial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "HomogeneousMagneticMaterial.h"
+#include "Transform3D.h"
+
+const double HomogeneousMagneticMaterial::m_magnetic_prefactor = -2.91042993836710484e-3;
+
+HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(
+        const std::string& name, const complex_t refractive_index,
+        const kvector_t magnetic_field)
+: HomogeneousMaterial(name, refractive_index)
+, m_magnetic_field(magnetic_field)
+{
+    initializePrivateMemebers();
+}
+
+HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(
+        const std::string& name, double refractive_index_delta,
+        double refractive_index_beta, const kvector_t magnetic_field)
+    : HomogeneousMaterial(name, refractive_index_delta, refractive_index_beta)
+    , m_magnetic_field(magnetic_field)
+{
+    initializePrivateMemebers();
+}
+
+HomogeneousMagneticMaterial* HomogeneousMagneticMaterial::clone() const
+{
+    return new HomogeneousMagneticMaterial(getName(), getRefractiveIndex(), getMagneticField());
+}
+
+Eigen::Matrix2cd HomogeneousMagneticMaterial::getScatteringMatrix(
+        double k_mag2) const
+{
+    Eigen::Matrix2cd result;
+    double factor = m_magnetic_prefactor/k_mag2;
+    complex_t unit_factor = m_refractive_index*m_refractive_index;
+    result = unit_factor*m_unit_matrix
+            + factor*m_pauli_operator[0]*m_magnetic_field[0]
+            + factor*m_pauli_operator[1]*m_magnetic_field[1]
+            + factor*m_pauli_operator[2]*m_magnetic_field[2];
+    return result;
+}
+
+const IMaterial* HomogeneousMagneticMaterial::createTransformedMaterial(
+        const Transform3D& transform) const
+{
+    kvector_t mag_field_transformed = transform.transformed(m_magnetic_field);
+    return new HomogeneousMagneticMaterial(getName(), getRefractiveIndex(),
+            mag_field_transformed);
+}
+
+void HomogeneousMagneticMaterial::initializePrivateMemebers()
+{
+    m_unit_matrix.setIdentity();
+    m_pauli_operator.clear();
+    Eigen::Matrix2cd sigma;
+    sigma(0,0) = 0.0;
+    sigma(0,1) = 1.0;
+    sigma(1,0) = 1.0;
+    sigma(1,1) = 0.0;
+    m_pauli_operator.push_back(sigma);
+    sigma(0,0) = 0.0;
+    sigma(0,1) = complex_t(0.0, -1.0);
+    sigma(1,0) = complex_t(0.0, 1.0);
+    sigma(1,1) = 0.0;
+    m_pauli_operator.push_back(sigma);
+    sigma(0,0) = 1.0;
+    sigma(0,1) = 0.0;
+    sigma(1,0) = 0.0;
+    sigma(1,1) = -1.0;
+    m_pauli_operator.push_back(sigma);
+}
diff --git a/Core/Material/HomogeneousMagneticMaterial.h b/Core/Material/HomogeneousMagneticMaterial.h
new file mode 100644
index 0000000..6ccbb9a
--- /dev/null
+++ b/Core/Material/HomogeneousMagneticMaterial.h
@@ -0,0 +1,83 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Material/HomogeneousMagneticMaterial.h
+//! @brief     Defines class HomogeneousMagneticMaterial
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HOMOGENEOUSMAGNETICMATERIAL_H
+#define HOMOGENEOUSMAGNETICMATERIAL_H
+
+#include "HomogeneousMaterial.h"
+
+//! A homogeneous material with magnetization.
+//! @ingroup materials
+
+class BA_CORE_API_ HomogeneousMagneticMaterial : public HomogeneousMaterial
+{
+public:
+#ifndef SWIG
+    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+#endif
+    //! Constructs a material with _name_, _refractive_index_ and
+    //! _magnetic_field_
+    HomogeneousMagneticMaterial(const std::string &name, const complex_t refractive_index,
+                                const kvector_t magnetic_field);
+
+    //! Constructs a material with _name_, refractive_index parameters and
+    //! _magnetic_field_
+    HomogeneousMagneticMaterial(const std::string &name, double refractive_index_delta,
+                                double refractive_index_beta, const kvector_t magnetic_field);
+
+    //! Clone
+    virtual HomogeneousMagneticMaterial *clone() const;
+
+    //! Get the magnetic field (in Tesla)
+    kvector_t getMagneticField() const { return m_magnetic_field; }
+
+    //! Set the magnetic field (in Tesla)
+    void setMagneticField(const kvector_t magnetic_field) { m_magnetic_field = magnetic_field; }
+
+    //! Indicates that the material is not scalar. This means that different
+    //! polarization states will be diffracted differently
+    virtual bool isScalarMaterial() const { return false; }
+
+#ifndef SWIG
+    //! Get the scattering matrix (~potential V) from the material.
+    //! This matrix appears in the full three-dimensional Schroedinger equation.
+    virtual Eigen::Matrix2cd getScatteringMatrix(double k_mag2) const;
+#endif
+
+    //! Create a new material that is transformed with respect to this one
+    virtual const IMaterial* createTransformedMaterial(
+        const Transform3D& transform) const;
+
+protected:
+    virtual void print(std::ostream &ostr) const {
+        ostr << "HomMagMat:" << getName() << "<" << this << ">{ "
+             << "R=" << m_refractive_index << ", B=" << m_magnetic_field << "}";  }
+
+    kvector_t m_magnetic_field; //!< magnetic field in Tesla
+private:
+    //! Function to initialize some private members
+    void initializePrivateMemebers();
+    //! This prefactor contains planck's constant, the neutron mass and
+    //! its magnetic moment (units nm^-2 T^-1)
+    static const double m_magnetic_prefactor;
+
+//! The unit matrix
+#ifndef SWIG
+    Eigen::Matrix2cd m_unit_matrix;
+    std::vector<Eigen::Matrix2cd, Eigen::aligned_allocator<Eigen::Matrix2cd> > m_pauli_operator;
+#endif
+};
+
+#endif // HOMOGENEOUSMAGNETICMATERIAL_H
diff --git a/Core/Material/HomogeneousMaterial.h b/Core/Material/HomogeneousMaterial.h
new file mode 100644
index 0000000..8b18e16
--- /dev/null
+++ b/Core/Material/HomogeneousMaterial.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Material/HomogeneousMaterial.h
+//! @brief     Defines and implements class HomogeneousMaterial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HOMOGENEOUSMATERIAL_H
+#define HOMOGENEOUSMATERIAL_H
+
+#include "IMaterial.h"
+#include <vector>
+
+//! @class HomogeneousMaterial
+//! @ingroup materials
+//! @brief An homogeneous material with a refractive index.
+
+class BA_CORE_API_ HomogeneousMaterial : public IMaterial
+{
+public:
+    //! Constructs a material with _name_ and _refractive_index_.
+    HomogeneousMaterial(const std::string &name, const complex_t refractive_index)
+        : IMaterial(name), m_refractive_index(refractive_index)
+    {}
+
+    //! Constructs a material with _name_ and refractive_index parameters
+    //! delta and beta (n = 1 - delta + i*beta).
+    HomogeneousMaterial(const std::string &name, double refractive_index_delta,
+                        double refractive_index_beta)
+        : IMaterial(name)
+        , m_refractive_index(complex_t(1.0 - refractive_index_delta, refractive_index_beta)) {}
+    virtual ~HomogeneousMaterial() {}
+
+    virtual HomogeneousMaterial* clone() const {
+        return new HomogeneousMaterial(getName(), getRefractiveIndex()); }
+
+    virtual complex_t getRefractiveIndex() const { return m_refractive_index; }
+    void setRefractiveIndex(const complex_t refractive_index) {
+        m_refractive_index = refractive_index; }
+
+#ifndef SWIG
+    //! Get the scattering matrix (~potential V) from the material.
+    //! This matrix appears in the full three-dimensional Schroedinger equation.
+    virtual Eigen::Matrix2cd getScatteringMatrix(double) const {
+        return m_refractive_index * m_refractive_index * Eigen::Matrix2cd::Identity(); }
+#endif
+
+    //! Create a new material that is transformed with respect to this one
+    virtual const IMaterial* createTransformedMaterial(const Transform3D&) const {
+        return new HomogeneousMaterial(getName(), getRefractiveIndex()); }
+
+protected:
+    virtual void print(std::ostream &ostr) const {
+        ostr << "HomMat:" << getName() << "<" << this << ">{ "
+             << "R=" << m_refractive_index << "}"; }
+
+    complex_t m_refractive_index; //!< complex index of refraction
+};
+
+#endif // HOMOGENEOUSMATERIAL_H
diff --git a/Core/Material/IMaterial.cpp b/Core/Material/IMaterial.cpp
new file mode 100644
index 0000000..f54958c
--- /dev/null
+++ b/Core/Material/IMaterial.cpp
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Material/IMaterial.cpp
+//! @brief     Implements class IMaterial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IMaterial.h"
+#include "Exceptions.h"
+#include "HomogeneousMagneticMaterial.h"
+
+IMaterial *IMaterial::clone() const
+{
+    throw Exceptions::NotImplementedException(
+        "IMaterial is an interface and should not be cloned!");
+}
+
+/*
+const IMaterial *IMaterial::createTransformedMaterial(const IRotation&) const
+{
+    throw Exceptions::NotImplementedException(
+        "IMaterial is an interface and should not be created!");
+}
+*/
+
+Eigen::Matrix2cd IMaterial::getScatteringMatrix(double k_mag2) const
+{
+    (void)k_mag2;
+    return Eigen::Matrix2cd::Identity();
+}
+
+#ifndef SWIG
+Eigen::Matrix2cd IMaterial::getSpecularScatteringMatrix(const kvector_t k) const
+{
+    Eigen::Matrix2cd result;
+    double k_mag2 = k.mag2();
+    double xy_proj2 = k.magxy2() / k_mag2;
+    result = getScatteringMatrix(k_mag2) - xy_proj2 * Eigen::Matrix2cd::Identity();
+    return result;
+}
+#endif // SWIG
+
+//! Returns true if *this agrees with other in all parameters.
+bool IMaterial::operator==(const IMaterial& other) const
+{
+    if( getName()!=other.getName() )
+        return false;
+    if( getRefractiveIndex().real() != other.getRefractiveIndex().real() )
+        return false;
+    if( getRefractiveIndex().imag() != other.getRefractiveIndex().imag() )
+        return false;
+    if( isScalarMaterial() != other.isScalarMaterial() )
+        return false;
+    auto p_this  = dynamic_cast<const HomogeneousMagneticMaterial*>(this);
+    auto p_other = dynamic_cast<const HomogeneousMagneticMaterial*>(&other);
+    if (p_this && p_other && p_this->getMagneticField() != p_other->getMagneticField() )
+        return false;
+    return true;
+}
diff --git a/Core/Material/IMaterial.h b/Core/Material/IMaterial.h
new file mode 100644
index 0000000..51416b0
--- /dev/null
+++ b/Core/Material/IMaterial.h
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Material/IMaterial.h
+//! @brief     Defines interface class IMaterial.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMATERIAL_H
+#define IMATERIAL_H
+
+#include "INamed.h"
+#include "Complex.h"
+#include "Vectors3D.h"
+#include "EigenCore.h"
+
+class Transform3D;
+
+//! Interface to a named material.
+//! @ingroup materials_internal
+
+class BA_CORE_API_ IMaterial : public INamed
+{
+public:
+    explicit IMaterial(const std::string& name) : INamed(name) {}
+    virtual ~IMaterial() {}
+    virtual IMaterial* clone() const;
+
+    //! Indicates whether the interaction with the material is scalar.
+    //! This means that different polarization states will be diffracted equally
+    virtual bool isScalarMaterial() const { return true; }
+
+    bool isMagneticMaterial() const { return !isScalarMaterial(); }
+
+    friend std::ostream& operator<<(std::ostream& ostr, const IMaterial& m)
+    {
+        m.print(ostr);
+        return ostr;
+    }
+
+    virtual complex_t getRefractiveIndex() const { return 1.0; }
+
+#ifndef SWIG
+    //! Get the effective scattering matrix from the refractive index
+    //! and a given wavevector used for the specular calculation.
+    //! This matrix appears in the one-dimensional Schroedinger equation in the z-direction
+    Eigen::Matrix2cd getSpecularScatteringMatrix(const kvector_t k) const;
+
+    //! Get the scattering matrix (~potential V) from the material.
+    //! This matrix appears in the full three-dimensional Schroedinger equation.
+    virtual Eigen::Matrix2cd getScatteringMatrix(double k_mag2) const;
+#endif
+
+    //! Create a new material that is transformed with respect to this one
+    virtual const IMaterial* createTransformedMaterial(
+        const Transform3D& transform) const =0;
+
+    bool operator==(const IMaterial& other) const;
+
+protected:
+    virtual void print(std::ostream& ostr) const {
+        ostr << "IMat:" << getName() << "<" << this << ">"; }
+};
+
+#endif // IMATERIAL_H
diff --git a/Core/Material/Materials.cpp b/Core/Material/Materials.cpp
new file mode 100644
index 0000000..5a6107a
--- /dev/null
+++ b/Core/Material/Materials.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Material/Materials.cpp
+//! @brief     Implement utils for handling materials in namespace Materials
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Materials.h"
+
+IMaterial* Materials::createInvertedMaterial(const IMaterial* orig_material)
+{
+    if (!orig_material)
+        return nullptr;
+
+    const HomogeneousMagneticMaterial* magn_material =
+            dynamic_cast<const HomogeneousMagneticMaterial*>(orig_material);
+
+    if (!magn_material)
+        return orig_material->clone();
+
+    std::string new_name = orig_material->getName() + "_inv";
+    return new HomogeneousMagneticMaterial(new_name,
+                                           magn_material->getRefractiveIndex(),
+                                          -magn_material->getMagneticField());
+}
diff --git a/Core/Material/Materials.h b/Core/Material/Materials.h
new file mode 100644
index 0000000..402421e
--- /dev/null
+++ b/Core/Material/Materials.h
@@ -0,0 +1,29 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Material/Materials.h
+//! @brief     Defines namespace Materials
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALS_H
+#define MATERIALS_H
+
+#include "HomogeneousMagneticMaterial.h"
+
+// TODO: replace this by a member function of IMaterial
+
+namespace Materials {
+
+IMaterial* createInvertedMaterial(const IMaterial *material);
+
+}
+
+#endif // MATERIALS_H
diff --git a/Core/Multilayer/DWBADiffuseReflection.cpp b/Core/Multilayer/DWBADiffuseReflection.cpp
new file mode 100644
index 0000000..b5d100b
--- /dev/null
+++ b/Core/Multilayer/DWBADiffuseReflection.cpp
@@ -0,0 +1,113 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/DWBADiffuseReflection.cpp
+//! @brief     Implements class DWBADiffuseReflection.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "DWBADiffuseReflection.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "MultiLayer.h"
+#include "MathConstants.h"
+
+DWBADiffuseReflection::DWBADiffuseReflection()
+    : m_sample(0)
+    , m_diffuse_autocorr(0)
+    , m_diffuse_crosscorr(0)
+    , m_qz1(0), m_qz2(0), m_qz3(0), m_qz4(0)
+{
+}
+
+void DWBADiffuseReflection::execute(
+    const MultiLayer& sample, const kvector_t ki, const kvector_t kf)
+{
+    setSample(sample);
+    setKvectors(ki, kf);
+    diffuse_autocorr();
+    if( m_sample->getCrossCorrLength() != 0)
+        diffuse_crosscorr();
+    else
+        m_diffuse_crosscorr = 0;
+}
+
+void DWBADiffuseReflection::setKvectors(const kvector_t ki, const kvector_t kf)
+{
+    m_ki = ki;
+    m_kf = kf;
+    m_q = kf - ki;
+    m_qz1 = std::pow(ki.z() + kf.z(), 2);
+    m_qz2 = std::pow(ki.z() - kf.z(), 2);
+    m_qz3 = std::pow(-ki.z() + kf.z(), 2);
+    m_qz4 = std::pow(-ki.z() - kf.z(), 2);
+    SpecularMatrix::execute(*m_sample, ki, m_fcoeff_i);
+    SpecularMatrix::execute(*m_sample, kf, m_fcoeff_f);
+}
+
+void DWBADiffuseReflection::diffuse_autocorr()
+{
+    double autocorr(0);
+    for(size_t i=0; i<m_sample->getNumberOfLayers()-1; i++)
+        autocorr += std::norm( get_refractive_term(i)) * std::norm(get_sum4terms(i) ) *
+            m_sample->getLayerBottomInterface(i)->getRoughness()->getSpectralFun(m_q);
+    m_diffuse_autocorr = autocorr*m_ki.mag2()/16./M_PI;
+}
+
+void DWBADiffuseReflection::diffuse_crosscorr()
+{
+    complex_t crosscorr(0);
+
+    std::vector<complex_t > rterm;
+    rterm.resize(m_sample->getNumberOfLayers());
+    std::vector<complex_t > sterm;
+    sterm.resize(m_sample->getNumberOfLayers());
+
+    for(size_t j=0; j<m_sample->getNumberOfLayers()-1; j++){
+        rterm[j] = get_refractive_term(j);
+        sterm[j] = get_sum4terms(j);
+    }
+
+    for(size_t j=0; j<m_sample->getNumberOfLayers()-1; j++){
+        for(size_t k=0; k<m_sample->getNumberOfLayers()-1; k++) {
+            if(j==k) continue;
+            crosscorr += rterm[j]*sterm[j]*rterm[k]*m_sample->getCrossCorrSpectralFun(m_q,j,k)*
+                std::conj(sterm[k]);
+        }
+    }
+    m_diffuse_crosscorr = crosscorr.real()*m_ki.mag2()/16./M_PI;
+}
+
+complex_t DWBADiffuseReflection::get_refractive_term(size_t ilayer) const
+{
+    return m_sample->getLayer(ilayer  )->getRefractiveIndex2() -
+           m_sample->getLayer(ilayer+1)->getRefractiveIndex2();
+}
+
+complex_t DWBADiffuseReflection::get_sum4terms(size_t ilayer)
+{
+    double sigma2 = -0.5*std::pow(m_sample->getLayerBottomInterface(ilayer)->
+                                  getRoughness()->getSigma(), 2);
+    complex_t term1 = m_fcoeff_i[ilayer+1].getScalarT()
+            * m_fcoeff_f[ilayer+1].getScalarT()
+            * std::exp( sigma2*m_qz1 );
+    complex_t term2 = m_fcoeff_i[ilayer+1].getScalarT()
+            * m_fcoeff_f[ilayer+1].getScalarR()
+            * std::exp( sigma2*m_qz2 );
+    complex_t term3 = m_fcoeff_i[ilayer+1].getScalarR()
+            * m_fcoeff_f[ilayer+1].getScalarT()
+            * std::exp( sigma2*m_qz3 );
+    complex_t term4 = m_fcoeff_i[ilayer+1].getScalarR()
+            * m_fcoeff_f[ilayer+1].getScalarR()
+            * std::exp( sigma2*m_qz4 );
+
+    return term1 + term2 + term3 + term4;
+}
diff --git a/Core/Multilayer/DWBADiffuseReflection.h b/Core/Multilayer/DWBADiffuseReflection.h
new file mode 100644
index 0000000..5b3e872
--- /dev/null
+++ b/Core/Multilayer/DWBADiffuseReflection.h
@@ -0,0 +1,66 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/DWBADiffuseReflection.h
+//! @brief     Defines class DWBADiffuseReflection.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DWBADIFFUSEREFLECTION_H
+#define DWBADIFFUSEREFLECTION_H
+
+#include "SpecularMatrix.h"
+
+class MultiLayer;
+
+//! Calculation of diffuse (aka off-specular) reflection from multilayers.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ DWBADiffuseReflection
+{
+public:
+    DWBADiffuseReflection();
+
+    void execute(const MultiLayer& sample,
+                 const kvector_t ki, const kvector_t kf);
+
+    void setSample(const MultiLayer& sample) {m_sample =& sample; }
+
+    double getDiffuseAutocorr() const { return m_diffuse_autocorr; }
+
+    double getDiffuseCrosscorr() const { return m_diffuse_crosscorr; }
+
+    void setKvectors(const kvector_t ki, const kvector_t kf);
+
+private:
+    void diffuse_autocorr();
+
+    void diffuse_crosscorr();
+
+    complex_t get_refractive_term(size_t ilayer) const;
+
+    complex_t get_sum4terms(size_t ilayer);
+
+    const MultiLayer* m_sample;
+    SpecularMatrix::MultiLayerCoeff_t m_fcoeff_i;
+    SpecularMatrix::MultiLayerCoeff_t m_fcoeff_f;
+    double m_diffuse_autocorr;
+    double m_diffuse_crosscorr;
+
+    kvector_t m_ki;
+    kvector_t m_kf;
+    kvector_t m_q;
+    double m_qz1;
+    double m_qz2;
+    double m_qz3;
+    double m_qz4;
+};
+
+#endif // DWBADIFFUSEREFLECTION_H
diff --git a/Core/Multilayer/DecouplingApproximationStrategy.cpp b/Core/Multilayer/DecouplingApproximationStrategy.cpp
new file mode 100644
index 0000000..32c1d6a
--- /dev/null
+++ b/Core/Multilayer/DecouplingApproximationStrategy.cpp
@@ -0,0 +1,79 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/DecouplingApproximationStrategy.cpp
+//! @brief     Implements classes DecouplingApproximationStrategy1,
+//!              DecouplingApproximationStrategy2.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "DecouplingApproximationStrategy.h"
+#include "Exceptions.h"
+#include "FormFactorWrapper.h"
+#include "IInterferenceFunction.h"
+#include "MathFunctions.h"
+#include "RealParameter.h"
+#include "SimulationElement.h"
+
+//! Returns the total incoherent and coherent scattering intensity for given kf and
+//! for one layer (implied by the given particle form factors).
+//! For each IParticle in the layer layout, the precomputed form factor must be provided.
+double DecouplingApproximationStrategy1::evaluateForList(
+    const SimulationElement& sim_element) const
+{
+    double intensity = 0.0;
+    complex_t amplitude = complex_t(0.0, 0.0);
+    if (m_total_abundance <= 0.0)
+        return 0.0;
+    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
+        complex_t ff = m_precomputed_ff1[i];
+        if (std::isnan(ff.real()))
+            throw Exceptions::RuntimeErrorException(
+                "DecouplingApproximationStrategy::evaluateForList() -> Error! Amplitude is NaN");
+        double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance;
+        amplitude += fraction * ff;
+        intensity += fraction * std::norm(ff);
+    }
+    double amplitude_norm = std::norm(amplitude);
+    double itf_function = mP_iff->evaluate(sim_element.getMeanQ());
+    return m_total_abundance * (intensity + amplitude_norm * (itf_function - 1.0));
+}
+
+//! Returns the total incoherent and coherent scattering intensity for given kf and
+//! for one layer (implied by the given particle form factors).
+//! For each IParticle in the layer layout, the precomputed form factor must be provided.
+//! This is the polarized variant of evaluateForList. Each form factor must be
+//! precomputed for polarized beam and detector.
+double DecouplingApproximationStrategy2::evaluateForList(
+    const SimulationElement& sim_element) const
+{
+    Eigen::Matrix2cd mean_intensity = Eigen::Matrix2cd::Zero();
+    Eigen::Matrix2cd mean_amplitude = Eigen::Matrix2cd::Zero();
+
+    if (m_total_abundance <= 0.0)
+        return 0.0;
+    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
+        Eigen::Matrix2cd ff = m_precomputed_ff2[i];
+        if (!ff.allFinite())
+            throw Exceptions::RuntimeErrorException(
+                "DecouplingApproximationStrategy::evaluateForList() -> "
+                "Error! Form factor contains NaN or infinite");
+        double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance;
+        mean_amplitude += fraction * ff;
+        mean_intensity += fraction * (ff * sim_element.getPolarization() * ff.adjoint());
+    }
+    Eigen::Matrix2cd amplitude_matrix = sim_element.getAnalyzerOperator() * mean_amplitude
+            * sim_element.getPolarization() * mean_amplitude.adjoint();
+    Eigen::Matrix2cd intensity_matrix = sim_element.getAnalyzerOperator() * mean_intensity;
+    double amplitude_trace = std::abs(amplitude_matrix.trace());
+    double intensity_trace = std::abs(intensity_matrix.trace());
+    double itf_function = mP_iff->evaluate(sim_element.getMeanQ());
+    return m_total_abundance * (intensity_trace + amplitude_trace * (itf_function - 1.0));
+}
diff --git a/Core/Multilayer/DecouplingApproximationStrategy.h b/Core/Multilayer/DecouplingApproximationStrategy.h
new file mode 100644
index 0000000..742c4c7
--- /dev/null
+++ b/Core/Multilayer/DecouplingApproximationStrategy.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/DecouplingApproximationStrategy.h
+//! @brief     Defines classes DecouplingApproximationStrategy1 and
+//!              DecouplingApproximationStrategy2
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DECOUPLINGAPPROXIMATIONSTRATEGY_H
+#define DECOUPLINGAPPROXIMATIONSTRATEGY_H
+
+#include "IInterferenceFunctionStrategy.h"
+
+class SimulationElement;
+
+//! Strategy class to compute the total scalar scattering from a decorated layer
+//! in decoupling approximation.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ DecouplingApproximationStrategy1 final
+    : public IInterferenceFunctionStrategy1
+{
+public:
+    DecouplingApproximationStrategy1(SimulationOptions sim_params)
+        : IInterferenceFunctionStrategy(sim_params) {}
+
+private:
+    double evaluateForList(const SimulationElement& sim_element) const final;
+};
+
+//! Strategy class to compute the total polarized scattering from a decorated layer
+//! in decoupling approximation.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ DecouplingApproximationStrategy2 final
+    : public IInterferenceFunctionStrategy2
+{
+public:
+    DecouplingApproximationStrategy2(SimulationOptions sim_params)
+        : IInterferenceFunctionStrategy(sim_params) {}
+
+private:
+    double evaluateForList(const SimulationElement& sim_element) const final;
+};
+
+#endif // DECOUPLINGAPPROXIMATIONSTRATEGY_H
diff --git a/Core/Multilayer/FormFactorDWBA.cpp b/Core/Multilayer/FormFactorDWBA.cpp
new file mode 100644
index 0000000..f0ca004
--- /dev/null
+++ b/Core/Multilayer/FormFactorDWBA.cpp
@@ -0,0 +1,81 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/FormFactorDWBA.cpp
+//! @brief     Implements class FormFactorDWBA.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDWBA.h"
+#include "BornAgainNamespace.h"
+#include "ILayerRTCoefficients.h"
+#include "WavevectorInfo.h"
+
+FormFactorDWBA::FormFactorDWBA(const IFormFactor& form_factor)
+    : mp_form_factor(form_factor.clone())
+    , mp_in_coeffs(0)
+    , mp_out_coeffs(0)
+{
+    setName(BornAgain::FormFactorDWBAType);
+}
+
+FormFactorDWBA::~FormFactorDWBA()
+{}
+
+FormFactorDWBA* FormFactorDWBA::clone() const
+{
+    FormFactorDWBA* result = new FormFactorDWBA(*mp_form_factor);
+    result->setSpecularInfo(mp_in_coeffs, mp_out_coeffs);
+    return result;
+}
+
+complex_t FormFactorDWBA::evaluate(const WavevectorInfo& wavevectors) const
+{
+    // Retrieve the two different incoming wavevectors in the layer
+    cvector_t k_i_T = wavevectors.getKi();
+    k_i_T.setZ(-mp_in_coeffs->getScalarKz());
+    cvector_t k_i_R = k_i_T;
+    k_i_R.setZ(-k_i_T.z());
+
+    // Retrieve the two different outgoing wavevector bins in the layer
+    cvector_t k_f_T = wavevectors.getKf();
+    k_f_T.setZ(mp_out_coeffs->getScalarKz());
+    cvector_t k_f_R = k_f_T;
+    k_f_R.setZ(-k_f_T.z());
+
+    // Construct the four different scattering contributions wavevector infos
+    double wavelength = wavevectors.getWavelength();
+    WavevectorInfo k_TT(k_i_T, k_f_T, wavelength);
+    WavevectorInfo k_RT(k_i_R, k_f_T, wavelength);
+    WavevectorInfo k_TR(k_i_T, k_f_R, wavelength);
+    WavevectorInfo k_RR(k_i_R, k_f_R, wavelength);
+
+    // Get the four R,T coefficients
+    complex_t T_in = mp_in_coeffs->getScalarT();
+    complex_t R_in = mp_in_coeffs->getScalarR();
+    complex_t T_out = mp_out_coeffs->getScalarT();
+    complex_t R_out = mp_out_coeffs->getScalarR();
+
+    // The four different scattering contributions; S stands for scattering
+    // off the particle, R for reflection off the layer interface
+    complex_t term_S   = T_in * mp_form_factor->evaluate(k_TT) * T_out;
+    complex_t term_RS  = R_in * mp_form_factor->evaluate(k_RT) * T_out;
+    complex_t term_SR  = T_in * mp_form_factor->evaluate(k_TR) * R_out;
+    complex_t term_RSR = R_in * mp_form_factor->evaluate(k_RR) * R_out;
+
+    return term_S + term_RS + term_SR + term_RSR;
+}
+
+void FormFactorDWBA::setSpecularInfo(const ILayerRTCoefficients* p_in_coeffs,
+                                     const ILayerRTCoefficients* p_out_coeffs)
+{
+    mp_in_coeffs = p_in_coeffs;
+    mp_out_coeffs = p_out_coeffs;
+}
diff --git a/Core/Multilayer/FormFactorDWBA.h b/Core/Multilayer/FormFactorDWBA.h
new file mode 100644
index 0000000..d08a3d3
--- /dev/null
+++ b/Core/Multilayer/FormFactorDWBA.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/FormFactorDWBA.h
+//! @brief     Defines class FormFactorDWBA.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDWBA_H
+#define FORMFACTORDWBA_H
+
+#include "IFormFactor.h"
+
+class ILayerRTCoefficients;
+
+//! Evaluates the coherent sum of the four DWBA terms in a scalar IFormFactor.
+//! @ingroup formfactors_internal
+
+class FormFactorDWBA final : public IFormFactor
+{
+public:
+    FormFactorDWBA(const IFormFactor& form_factor);
+    ~FormFactorDWBA() override;
+
+    FormFactorDWBA* clone() const override;
+
+    void accept(ISampleVisitor* visitor) const override { visitor->visit(this); }
+
+    //! Calculates and returns a form factor calculation in DWBA
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override;
+
+    //! Returns the total volume of the particle of this form factor's shape
+    double getVolume() const override { return mp_form_factor->getVolume(); }
+
+    //! Returns the (approximate in some cases) radial size of the particle of this
+    //! form factor's shape. This is used for SSCA calculations
+    double getRadialExtension() const override { return mp_form_factor->getRadialExtension(); }
+
+    //! Sets reflection/transmission info for scalar DWBA simulation
+    void setSpecularInfo (const ILayerRTCoefficients* p_in_coeffs,
+                          const ILayerRTCoefficients* p_out_coeffs) override;
+
+    friend class TestPolarizedDWBATerms;
+
+private:
+    //! The form factor for BA
+    IFormFactor* mp_form_factor;
+
+    const ILayerRTCoefficients* mp_in_coeffs;  //!< not owned by this
+    const ILayerRTCoefficients* mp_out_coeffs; //!< not owned by this
+};
+
+#endif // FORMFACTORDWBA_H
diff --git a/Core/Multilayer/FormFactorDWBAPol.cpp b/Core/Multilayer/FormFactorDWBAPol.cpp
new file mode 100644
index 0000000..64d99fa
--- /dev/null
+++ b/Core/Multilayer/FormFactorDWBAPol.cpp
@@ -0,0 +1,209 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/FormFactorDWBAPol.cpp
+//! @brief     Defines class FormFactorDWBAPol.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorDWBAPol.h"
+#include "BornAgainNamespace.h"
+#include "ILayerRTCoefficients.h"
+#include "WavevectorInfo.h"
+
+
+namespace {
+std::complex<double> myprod(const Eigen::Vector2cd &vec1, const Eigen::Matrix2cd &ff,
+                            const Eigen::Vector2cd &vec2){
+   return vec1.transpose() * ff * vec2;
+}
+}
+
+FormFactorDWBAPol::FormFactorDWBAPol(const IFormFactor &form_factor)
+    : mp_form_factor(form_factor.clone())
+    , mp_in_coeffs(0)
+    , mp_out_coeffs(0)
+{
+    setName(BornAgain::FormFactorPolarizedDWBAType);
+}
+
+FormFactorDWBAPol::~FormFactorDWBAPol()
+{}
+
+FormFactorDWBAPol* FormFactorDWBAPol::clone() const
+{
+    FormFactorDWBAPol* p_result = new FormFactorDWBAPol(*mp_form_factor);
+    p_result->setSpecularInfo(mp_in_coeffs, mp_out_coeffs);
+    return p_result;
+}
+
+complex_t FormFactorDWBAPol::evaluate(const WavevectorInfo&) const
+{
+    throw Exceptions::NotImplementedException(
+        "FormFactorDWBAPol::evaluate: should never be called for matrix interactions");
+}
+
+Eigen::Matrix2cd FormFactorDWBAPol::evaluatePol(const WavevectorInfo& wavevectors) const
+{
+    // the required wavevectors inside the layer for
+    // different eigenmodes and in- and outgoing wavevector;
+    complex_t kix = wavevectors.getKi().x();
+    complex_t kiy = wavevectors.getKi().y();
+    cvector_t ki_1R(kix, kiy, mp_in_coeffs->getKz()(0));
+    cvector_t ki_1T(kix, kiy, -mp_in_coeffs->getKz()(0));
+    cvector_t ki_2R(kix, kiy, mp_in_coeffs->getKz()(1));
+    cvector_t ki_2T(kix, kiy, -mp_in_coeffs->getKz()(1));
+
+    cvector_t kf_1R = wavevectors.getKf();
+    kf_1R.setZ(-(complex_t)mp_out_coeffs->getKz()(0));
+    cvector_t kf_1T = kf_1R;
+    kf_1T.setZ((complex_t)mp_out_coeffs->getKz()(0));
+    cvector_t kf_2R = kf_1R;
+    kf_2R.setZ(-(complex_t)mp_out_coeffs->getKz()(1));
+    cvector_t kf_2T = kf_1R;
+    kf_2T.setZ((complex_t)mp_out_coeffs->getKz()(1));
+    // now each of the 16 matrix terms of the polarized DWBA is calculated:
+    // NOTE: when the underlying reflection/transmission coefficients are
+    // scalar, the eigenmodes have identical eigenvalues and spin polarization
+    // is used as a basis; in this case however the matrices get mixed:
+    //     real m_M11 = calculated m_M12
+    //     real m_M12 = calculated m_M11
+    //     real m_M21 = calculated m_M22
+    //     real m_M22 = calculated m_M21
+    // since both eigenvalues are identical, this does not influence the result.
+    Eigen::Matrix2cd ff_BA;
+
+    double wavelength = wavevectors.getWavelength();
+
+    // The following matrices each contain the four polarization conditions
+    // (p->p, p->m, m->p, m->m)
+    // The first two indices indicate a scattering from the 1/2 eigenstate into
+    // the 1/2 eigenstate, while the capital indices indicate a reflection
+    // before and/or after the scattering event (first index is in-state,
+    // second is out-state; this also applies to the internal matrix indices)
+    Eigen::Matrix2cd
+        M11_S, M11_RS, M11_SR, M11_RSR,
+        M12_S, M12_RS, M12_SR, M12_RSR,
+        M21_S, M21_RS, M21_SR, M21_RSR,
+        M22_S, M22_RS, M22_SR, M22_RSR;
+
+    // eigenmode 1 -> eigenmode 1: direct scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_1T, wavelength));
+    M11_S(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T1plus());
+    M11_S(0,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T1plus());
+    M11_S(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA,  mp_in_coeffs->T1min());
+    M11_S(1,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T1min());
+    // eigenmode 1 -> eigenmode 1: reflection and then scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_1T, wavelength));
+    M11_RS(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R1plus());
+    M11_RS(0,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R1plus());
+    M11_RS(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R1min());
+    M11_RS(1,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R1min());
+    // eigenmode 1 -> eigenmode 1: scattering and then reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_1R, wavelength));
+    M11_SR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T1plus());
+    M11_SR(0,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T1plus());
+    M11_SR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T1min());
+    M11_SR(1,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T1min());
+    // eigenmode 1 -> eigenmode 1: reflection, scattering and again reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_1R, wavelength));
+    M11_RSR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R1plus());
+    M11_RSR(0,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R1plus());
+    M11_RSR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R1min());
+    M11_RSR(1,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R1min());
+
+    // eigenmode 1 -> eigenmode 2: direct scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_2T, wavelength));
+    M12_S(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T1plus());
+    M12_S(0,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T1plus());
+    M12_S(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T1min());
+    M12_S(1,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T1min());
+    // eigenmode 1 -> eigenmode 2: reflection and then scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_2T, wavelength));
+    M12_RS(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R1plus());
+    M12_RS(0,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R1plus());
+    M12_RS(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R1min());
+    M12_RS(1,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R1min());
+    // eigenmode 1 -> eigenmode 2: scattering and then reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_2R, wavelength));
+    M12_SR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T1plus());
+    M12_SR(0,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T1plus());
+    M12_SR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T1min());
+    M12_SR(1,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T1min());
+    // eigenmode 1 -> eigenmode 2: reflection, scattering and again reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_2R, wavelength));
+    M12_RSR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R1plus());
+    M12_RSR(0,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R1plus());
+    M12_RSR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R1min());
+    M12_RSR(1,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R1min());
+
+    // eigenmode 2 -> eigenmode 1: direct scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_1T, wavelength));
+    M21_S(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T2plus());
+    M21_S(0,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T2plus());
+    M21_S(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T2min());
+    M21_S(1,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T2min());
+    // eigenmode 2 -> eigenmode 1: reflection and then scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_1T, wavelength));
+    M21_RS(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R2plus());
+    M21_RS(0,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R2plus());
+    M21_RS(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R2min());
+    M21_RS(1,1) =  myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R2min());
+    // eigenmode 2 -> eigenmode 1: scattering and then reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_1R, wavelength));
+    M21_SR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T2plus());
+    M21_SR(0,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T2plus());
+    M21_SR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T2min());
+    M21_SR(1,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T2min());
+    // eigenmode 2 -> eigenmode 1: reflection, scattering and again reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_1R, wavelength));
+    M21_RSR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R2plus());
+    M21_RSR(0,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R2plus());
+    M21_RSR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R2min());
+    M21_RSR(1,1) =  myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R2min());
+
+    // eigenmode 2 -> eigenmode 2: direct scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_2T, wavelength));
+    M22_S(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T2plus());
+    M22_S(0,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T2plus());
+    M22_S(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T2min());
+    M22_S(1,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T2min());
+    // eigenmode 2 -> eigenmode 2: reflection and then scattering
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_2T, wavelength));
+    M22_RS(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R2plus());
+    M22_RS(0,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R2plus());
+    M22_RS(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R2min());
+    M22_RS(1,1) =  myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R2min());
+    // eigenmode 2 -> eigenmode 2: scattering and then reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_2R, wavelength));
+    M22_SR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T2plus());
+    M22_SR(0,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T2plus());
+    M22_SR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T2min());
+    M22_SR(1,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T2min());
+    // eigenmode 2 -> eigenmode 2: reflection, scattering and again reflection
+    ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_2R, wavelength));
+    M22_RSR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R2plus());
+    M22_RSR(0,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R2plus());
+    M22_RSR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R2min());
+    M22_RSR(1,1) =  myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R2min());
+
+    return
+        M11_S + M11_RS + M11_SR + M11_RSR +
+        M12_S + M12_RS + M12_SR + M12_RSR +
+        M21_S + M21_RS + M21_SR + M21_RSR +
+        M22_S + M22_RS + M22_SR + M22_RSR;
+}
+
+void FormFactorDWBAPol::setSpecularInfo(const ILayerRTCoefficients* p_in_coeffs,
+                                        const ILayerRTCoefficients* p_out_coeffs)
+{
+    mp_in_coeffs = p_in_coeffs;
+    mp_out_coeffs = p_out_coeffs;
+}
diff --git a/Core/Multilayer/FormFactorDWBAPol.h b/Core/Multilayer/FormFactorDWBAPol.h
new file mode 100644
index 0000000..285e56d
--- /dev/null
+++ b/Core/Multilayer/FormFactorDWBAPol.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/FormFactorDWBAPol.h
+//! @brief     Defines class FormFactorDWBAPol.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORDWBAPOL_H
+#define FORMFACTORDWBAPOL_H
+
+#include "IFormFactor.h"
+
+class ILayerRTCoefficients;
+
+//! Evaluates the coherent sum of the 16 matrix DWBA terms in a polarized IFormFactor.
+
+//! @ingroup formfactors_internal
+
+class FormFactorDWBAPol final : public IFormFactor
+{
+public:
+    FormFactorDWBAPol(const IFormFactor& form_factor);
+    ~FormFactorDWBAPol() override;
+
+    FormFactorDWBAPol* clone() const override;
+
+    void accept(ISampleVisitor* visitor) const override { visitor->visit(this); }
+
+    //! Throws not-implemented exception
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override;
+
+    //! Calculates and returns a polarized form factor calculation in DWBA
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override;
+
+    //! Returns the total volume of the particle of this form factor's shape
+    double getVolume() const override { return mp_form_factor->getVolume(); }
+
+    //! Returns the (approximate in some cases) radial size of the particle of this
+    //! form factor's shape. This is used for SSCA calculations
+    double getRadialExtension() const override { return mp_form_factor->getRadialExtension(); }
+
+    //! Sets reflection/transmission info for scalar DWBA simulation
+    void setSpecularInfo(const ILayerRTCoefficients* p_in_coeffs,
+                         const ILayerRTCoefficients* p_out_coeffs) override;
+
+    friend class TestPolarizedDWBATerms;
+
+private:
+    //! The form factor for BA
+    IFormFactor* mp_form_factor;
+
+    const ILayerRTCoefficients* mp_in_coeffs;  //!< not owned by this
+    const ILayerRTCoefficients* mp_out_coeffs; //!< not owned by this
+};
+
+#endif // FORMFACTORDWBAPOL_H
diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.cpp b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
new file mode 100644
index 0000000..b05f0b1
--- /dev/null
+++ b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
@@ -0,0 +1,135 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/IInterferenceFunctionStrategy.cpp
+//! @brief     Implements default behaviour of IInterferenceFunctionStrategy,
+//!              IInterferenceFunctionStrategy1, IInterferenceFunctionStrategy2
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IInterferenceFunctionStrategy.h"
+#include "FormFactorWrapper.h"
+#include "IFormFactor.h"
+#include "IInterferenceFunction.h"
+#include "IntegratorMCMiser.h"
+#include "LayerSpecularInfo.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include "ScalarRTCoefficients.h"
+#include "SimulationElement.h"
+#include "WavevectorInfo.h"
+
+IInterferenceFunctionStrategy::IInterferenceFunctionStrategy()
+{}
+
+IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions& sim_params)
+    : mP_iff {nullptr}
+    , m_options {sim_params}
+    , mP_integrator {make_integrator_miser(
+        this, &IInterferenceFunctionStrategy::evaluate_for_fixed_angles, 2)}
+{}
+
+IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy()
+{} // needs class definitions => don't move to .h
+
+//! Initializes the object with form factors and interference functions
+void IInterferenceFunctionStrategy::init(
+    const SafePointerVector<FormFactorWrapper>& weighted_formfactors,
+    const IInterferenceFunction& iff,
+    const LayerSpecularInfo& specular_info)
+{
+    if (weighted_formfactors.size()==0)
+        throw Exceptions::ClassInitializationException("Bug: Decorated layer has no formfactors.");
+    m_formfactor_wrappers = weighted_formfactors;
+    mP_iff.reset(iff.clone());
+
+    m_total_abundance = 0;
+    for (const auto ffw: m_formfactor_wrappers)
+        m_total_abundance += ffw->m_abundance;
+
+    if (&specular_info != mP_specular_info.get())
+        mP_specular_info.reset(specular_info.clone());
+
+    strategy_specific_post_init();
+}
+
+double IInterferenceFunctionStrategy::evaluate(const SimulationElement& sim_element) const
+{
+    if (m_options.isIntegrate() && (sim_element.getSolidAngle() > 0.0))
+        return MCIntegratedEvaluate(sim_element);
+    precomputeParticleFormfactors(sim_element);
+    return evaluateForList(sim_element);
+}
+
+//! Performs a Monte Carlo integration over the bin for the evaluation of the intensity.
+double IInterferenceFunctionStrategy::MCIntegratedEvaluate(
+    const SimulationElement& sim_element) const
+{
+    double min_array[] = {0.0, 0.0};
+    double max_array[] = {1.0, 1.0};
+    return mP_integrator->integrate(
+        min_array, max_array, (void*)&sim_element, m_options.getMcPoints());
+}
+
+double IInterferenceFunctionStrategy::evaluate_for_fixed_angles(
+    double* fractions, size_t, void* params) const
+{
+    double par0 = fractions[0];
+    double par1 = fractions[1];
+
+    SimulationElement* pars = static_cast<SimulationElement*>(params);
+
+    SimulationElement sim_element(*pars, par0, par1);
+    precomputeParticleFormfactors(sim_element);
+    return pars->getIntegrationFactor(par0, par1) * evaluateForList(sim_element);
+}
+
+
+//! Precomputes scalar form factors.
+void IInterferenceFunctionStrategy1::precomputeParticleFormfactors(
+    const SimulationElement& sim_element) const
+{
+    m_precomputed_ff1.clear();
+
+    double wavelength = sim_element.getWavelength();
+    double wavevector_scattering_factor = M_PI/wavelength/wavelength;
+    WavevectorInfo wavevectors(sim_element.getKI(), sim_element.getMeanKF(), wavelength);
+
+    const std::unique_ptr<const ILayerRTCoefficients> P_in_coeffs(
+        mP_specular_info->getInCoefficients(sim_element));
+    const std::unique_ptr<const ILayerRTCoefficients> P_out_coeffs(
+        mP_specular_info->getOutCoefficients(sim_element));
+    for (auto ffw: m_formfactor_wrappers) {
+        ffw->mp_ff->setSpecularInfo(P_in_coeffs.get(), P_out_coeffs.get());
+        complex_t ff_mat = ffw->mp_ff->evaluate(wavevectors);
+        m_precomputed_ff1.push_back(wavevector_scattering_factor*ff_mat);
+    }
+}
+
+//! Precomputes matrix form factors.
+void IInterferenceFunctionStrategy2::precomputeParticleFormfactors(
+    const SimulationElement& sim_element) const
+{
+    m_precomputed_ff2.clear();
+
+    double wavelength = sim_element.getWavelength();
+    double wavevector_scattering_factor = M_PI/wavelength/wavelength;
+    WavevectorInfo wavevectors(sim_element.getKI(), sim_element.getMeanKF(), wavelength);
+
+    const std::unique_ptr<const ILayerRTCoefficients> P_in_coeffs(
+        mP_specular_info->getInCoefficients(sim_element));
+    const std::unique_ptr<const ILayerRTCoefficients> P_out_coeffs(
+        mP_specular_info->getOutCoefficients(sim_element));
+    for (auto ffw: m_formfactor_wrappers) {
+        ffw->mp_ff->setSpecularInfo(P_in_coeffs.get(), P_out_coeffs.get());
+        Eigen::Matrix2cd ff_mat = ffw->mp_ff->evaluatePol(wavevectors);
+        m_precomputed_ff2.push_back(wavevector_scattering_factor*ff_mat);
+    }
+}
diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.h b/Core/Multilayer/IInterferenceFunctionStrategy.h
new file mode 100644
index 0000000..330c0e1
--- /dev/null
+++ b/Core/Multilayer/IInterferenceFunctionStrategy.h
@@ -0,0 +1,114 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/IInterferenceFunctionStrategy.h
+//! @brief     Defines classes IInterferenceFunctionStrategy,
+//!              IInterferenceFunctionStrategy1, IInterferenceFunctionStrategy2
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IINTERFERENCEFUNCTIONSTRATEGY_H
+#define IINTERFERENCEFUNCTIONSTRATEGY_H
+
+#include "Complex.h"
+#include "SafePointerVector.h"
+#include "SimulationOptions.h"
+#include "Vectors3D.h"
+#include <Eigen/StdVector>
+#include <memory>
+#include <vector>
+
+template <class T> class IntegratorMCMiser;
+class Bin1DCVector;
+class FormFactorWrapper;
+class IInterferenceFunction;
+class LayerSpecularInfo;
+class SimulationElement;
+
+//! Pure virtual base class of all interference function strategy classes.
+//! Provides an 'evaluate' function that computes the total scattering intensity
+//! from a decorated layer, taking into account a specific inter-particle interference function.
+//! This function uses low-level functions precomputeParticleFormfactors, evaluateForList
+//! that are implemented differently in different inheriting classes.
+//! Multiple inheritance is used to support scalar and polarized scattering
+//! (through IInterferenceFunctionStrategy1, IInterferenceFunctionStrategy2)
+//! and to implement different approximation schemes
+//! (DecouplingApproximationStrategy1, SSCApproximationStrategy1, and their polarized
+//! counterparts).
+//!
+//! Instantiation of child classes takes place in LayerStrategyBuilder::createStrategy,
+//! which is called from DecoratedLayerComputation::eval.
+//!
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ IInterferenceFunctionStrategy
+{
+public:
+    IInterferenceFunctionStrategy();
+    IInterferenceFunctionStrategy(const SimulationOptions& sim_params);
+    virtual ~IInterferenceFunctionStrategy();
+
+    void init(const SafePointerVector<FormFactorWrapper>& weighted_formfactors,
+              const IInterferenceFunction& iff, const LayerSpecularInfo& specular_info);
+
+    //! Calculates the intensity for scalar particles/interactions
+    double evaluate(const SimulationElement& sim_element) const;
+
+protected:
+    virtual void strategy_specific_post_init() {}
+    virtual void precomputeParticleFormfactors(const SimulationElement& sim_element) const =0;
+
+    //! Evaluates the intensity for given list of evaluated form factors
+    virtual double evaluateForList(const SimulationElement& sim_element) const =0;
+
+    double m_total_abundance; //!< cached sum of particle abundances, computed by init()
+    SafePointerVector<FormFactorWrapper> m_formfactor_wrappers;
+    std::unique_ptr<IInterferenceFunction> mP_iff;
+    SimulationOptions m_options;
+    std::unique_ptr<LayerSpecularInfo> mP_specular_info; //!< R and T coefficients for DWBA
+
+private:
+    double MCIntegratedEvaluate(const SimulationElement& sim_element) const;
+    double evaluate_for_fixed_angles(double* fractions, size_t dim, void* params) const;
+
+#ifndef SWIG
+    std::unique_ptr<IntegratorMCMiser<IInterferenceFunctionStrategy>> mP_integrator;
+#endif
+};
+
+//! Pure virtual base class of all scalar interference function strategy classes.
+//! Provides the precomputation of particle form factors.
+
+class BA_CORE_API_ IInterferenceFunctionStrategy1 : public virtual IInterferenceFunctionStrategy
+{
+protected:
+    mutable std::vector<complex_t> m_precomputed_ff1; //!< cached form factor evaluations
+
+private:
+    void precomputeParticleFormfactors(const SimulationElement& sim_element) const final;
+};
+
+//! Pure virtual base class of all polarized interference function strategy classes.
+//! Provides the precomputation of particle form factors.
+
+class BA_CORE_API_ IInterferenceFunctionStrategy2 : public virtual IInterferenceFunctionStrategy
+{
+public:
+    typedef std::vector<Eigen::Matrix2cd, Eigen::aligned_allocator<Eigen::Matrix2cd>>
+        matrixFFVector_t;
+
+protected:
+    mutable matrixFFVector_t m_precomputed_ff2; //!< cached polarized form factors
+
+private:
+    void precomputeParticleFormfactors(const SimulationElement& sim_element) const final;
+};
+
+#endif // IINTERFERENCEFUNCTIONSTRATEGY_H
diff --git a/Core/Multilayer/ILayerRTCoefficients.h b/Core/Multilayer/ILayerRTCoefficients.h
new file mode 100644
index 0000000..380ace8
--- /dev/null
+++ b/Core/Multilayer/ILayerRTCoefficients.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/ILayerRTCoefficients.h
+//! @brief     Defines and implements class ILayerRTCoefficients.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ILAYERRTCOEFFICIENTS_H
+#define ILAYERRTCOEFFICIENTS_H
+
+#include "Complex.h"
+#include "EigenCore.h"
+#include "Exceptions.h"
+
+//! Interface to access reflection/transmission coefficients.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ ILayerRTCoefficients
+{
+public:
+    virtual ~ILayerRTCoefficients() {}
+
+    virtual ILayerRTCoefficients* clone() const=0;
+
+#ifndef SWIG
+    //! The following functions return the transmitted and reflected amplitudes
+    //! for different incoming beam polarizations and eigenmodes
+    virtual Eigen::Vector2cd T1plus() const=0;
+    virtual Eigen::Vector2cd R1plus() const=0;
+    virtual Eigen::Vector2cd T2plus() const=0;
+    virtual Eigen::Vector2cd R2plus() const=0;
+    virtual Eigen::Vector2cd T1min() const=0;
+    virtual Eigen::Vector2cd R1min() const=0;
+    virtual Eigen::Vector2cd T2min() const=0;
+    virtual Eigen::Vector2cd R2min() const=0;
+    //! Returns z-part of the two wavevector eigenmodes
+    virtual Eigen::Vector2cd getKz() const=0;
+    //! Scalar value getters; these throw errors by default as they should only
+    //! be used when the derived object is really scalar
+#endif
+    virtual complex_t getScalarT() const {
+        throw Exceptions::NotImplementedException("ILayerRTCoefficients::"
+                "getScalarT(): coefficients are not scalar.");
+    }
+    virtual complex_t getScalarR() const {
+        throw Exceptions::NotImplementedException("ILayerRTCoefficients::"
+                "getScalarR(): coefficients are not scalar.");
+    }
+    virtual complex_t getScalarKz() const {
+        throw Exceptions::NotImplementedException("ILayerRTCoefficients::"
+                "getScalarKz(): coefficients are not scalar.");
+    }
+};
+
+
+#endif // ILAYERRTCOEFFICIENTS_H
diff --git a/Core/Multilayer/IMultiLayerBuilder.cpp b/Core/Multilayer/IMultiLayerBuilder.cpp
new file mode 100644
index 0000000..d8c0727
--- /dev/null
+++ b/Core/Multilayer/IMultiLayerBuilder.cpp
@@ -0,0 +1,28 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/IMultiLayerBuilder.cpp
+//! @brief     Implements pure virtual base class IMultiLayerBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IMultiLayerBuilder.h"
+#include "FTDistributions2D.h"
+#include "IFormFactor.h"
+
+const IFormFactor* IMultiLayerBuilder::getFormFactor() const
+{
+    return dynamic_cast<const IFormFactor*>(m_subtest_item);
+}
+
+const IFTDistribution2D* IMultiLayerBuilder::getFTDistribution2D() const
+{
+    return dynamic_cast<const IFTDistribution2D*>(m_subtest_item);
+}
diff --git a/Core/Multilayer/IMultiLayerBuilder.h b/Core/Multilayer/IMultiLayerBuilder.h
new file mode 100644
index 0000000..616af53
--- /dev/null
+++ b/Core/Multilayer/IMultiLayerBuilder.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/IMultiLayerBuilder.h
+//! @brief     Defines pure virtual base class IMultiLayerBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMULTILAYERBUILDER_H
+#define IMULTILAYERBUILDER_H
+
+#include "IParameterized.h"
+
+class MultiLayer;
+class IFormFactor;
+class IFTDistribution2D;
+
+//! Interface to the class capable to build samples to simulate.
+//! @ingroup simulation_internal
+
+class BA_CORE_API_ IMultiLayerBuilder : public IParameterized
+{
+public:
+    IMultiLayerBuilder() : IParameterized("SampleBuilder") , m_subtest_item(0) {}
+    virtual ~IMultiLayerBuilder() {}
+
+    virtual MultiLayer* buildSample() const =0;
+
+    void set_subtest(const IParameterized* subtest_item) { m_subtest_item = subtest_item; }
+    const IParameterized* m_subtest_item;
+
+    const IFormFactor* getFormFactor() const;
+    const IFTDistribution2D* getFTDistribution2D() const;
+
+    // this method is extended in the Python wrappers (needed to solve ownership issues with
+    // the created sample in buildSample()
+    static bool isPythonBuilder() { return false; }
+};
+
+#endif // IMULTILAYERBUILDER_H
diff --git a/Core/Multilayer/IRoughness.h b/Core/Multilayer/IRoughness.h
new file mode 100644
index 0000000..3d16496
--- /dev/null
+++ b/Core/Multilayer/IRoughness.h
@@ -0,0 +1,32 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/IRoughness.h
+//! @brief     Defines and implements interface class IRoughness.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IROUGHNESS_H
+#define IROUGHNESS_H
+
+#include "ISample.h"
+
+//! Interface to equip an interface with a roughness.
+//! @ingroup samples_internal
+
+class BA_CORE_API_ IRoughness : public ISample
+{
+public:
+    IRoughness() {}
+    virtual ~IRoughness() {}
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+};
+
+#endif // IROUGHNESS_H
diff --git a/Core/Multilayer/ISpecularInfoMap.h b/Core/Multilayer/ISpecularInfoMap.h
new file mode 100644
index 0000000..a81f38d
--- /dev/null
+++ b/Core/Multilayer/ISpecularInfoMap.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/ISpecularInfoMap.h
+//! @brief     Defines and implements interface ISpecularInfoMap.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISPECULARINFOMAP_H
+#define ISPECULARINFOMAP_H
+
+#include "WinDllMacros.h"
+
+class ILayerRTCoefficients;
+class SimulationElement;
+
+//! Interface class providing access to the reflection and transmittion coefficients.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ ISpecularInfoMap
+{
+public:
+    ISpecularInfoMap() {}
+    ISpecularInfoMap(const ISpecularInfoMap& other) = delete;
+    virtual ~ISpecularInfoMap() {}
+    ISpecularInfoMap& operator=(const ISpecularInfoMap &other) = delete;
+
+    virtual ISpecularInfoMap* clone() const =0;
+
+    //! Retrieves the amplitude coefficients for the given angles
+    virtual const ILayerRTCoefficients* getOutCoefficients(
+        const SimulationElement& sim_element) const =0;
+
+    //! Retrieves the amplitude coefficients for the given angles
+    virtual const ILayerRTCoefficients* getInCoefficients(
+        const SimulationElement& sim_element) const =0;
+};
+
+#endif // ISPECULARINFOMAP_H
diff --git a/Core/Multilayer/Layer.cpp b/Core/Multilayer/Layer.cpp
new file mode 100644
index 0000000..470fea0
--- /dev/null
+++ b/Core/Multilayer/Layer.cpp
@@ -0,0 +1,153 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/Layer.cpp
+//! @brief     Implements class Layer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Layer.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "ILayout.h"
+#include "Materials.h"
+#include "ParameterPool.h"
+#include "RealParameter.h"
+
+Layer::Layer()
+    : mp_material(nullptr), m_thickness(0)
+{
+    initialize();
+}
+
+Layer::Layer(const IMaterial& material, double thickness)
+    : mp_material(nullptr), m_thickness(thickness)
+{
+    setMaterial(material);
+    initialize();
+}
+
+Layer::Layer(const Layer& other) : ICompositeSample()
+{
+    m_thickness = other.m_thickness;
+    mp_material = nullptr;
+    if (other.mp_material)
+        mp_material = other.mp_material->clone();
+    for (size_t i=0; i<other.getNumberOfLayouts();++i)
+        addLayoutPtr(other.getLayout(i)->clone());
+    setNumberOfLayers(other.getNumberOfLayers());
+    initialize();
+}
+
+Layer::~Layer()
+{
+    delete mp_material;
+}
+
+Layer* Layer::cloneInvertB() const
+{
+    Layer* p_clone = new Layer(
+        *Materials::createInvertedMaterial(this->mp_material), this->m_thickness);
+    for (size_t i=0; i<getNumberOfLayouts(); ++i)
+        p_clone->addLayoutPtr(getLayout(i)->cloneInvertB());
+    p_clone->setNumberOfLayers(getNumberOfLayers());
+    p_clone->init_parameters();
+    return p_clone;
+}
+
+std::string Layer::to_str(int indent) const
+{
+    std::stringstream ss;
+    ss << std::string(4*indent, '.') << " " << getName() << " "
+       << (getMaterial() ? getMaterial()->getName() : "0_MATERIAL") << " "
+       << getRefractiveIndex() << " " << *getParameterPool() << "\n";
+    for( const ISample* child: getChildren() )
+        ss << child->to_str(indent+1);
+    return ss.str();
+}
+
+//! Sets layer thickness in nanometers.
+void Layer::setThickness(double thickness)
+{
+    if (thickness < 0.)
+        throw Exceptions::DomainErrorException("Layer thickness cannot be negative");
+    m_thickness = thickness;
+}
+
+//! Sets _material_ of the layer.
+void Layer::setMaterial(const IMaterial& material)
+{
+    delete mp_material;
+    mp_material = material.clone();
+}
+
+complex_t Layer::getRefractiveIndex() const
+{
+    return mp_material ? mp_material->getRefractiveIndex() : 1.0;
+}
+
+complex_t Layer::getRefractiveIndex2() const
+{
+    return getRefractiveIndex()*getRefractiveIndex();
+}
+
+void Layer::addLayout(const ILayout& decoration)
+{
+    addLayoutPtr(decoration.clone());
+}
+
+const ILayout* Layer::getLayout(size_t i) const
+{
+    if (i>=m_layouts.size())
+        return nullptr;
+    return m_layouts[i];
+}
+
+double Layer::getTotalParticleSurfaceDensity(size_t layout_index) const
+{
+    if (getNumberOfLayouts()==0 || layout_index>=getNumberOfLayouts())
+        return 0.0;
+    return getLayout(layout_index)->getTotalParticleSurfaceDensity();
+}
+
+double Layer::getTotalAbundance() const
+{
+    double total_abundance = 0.0;
+    for (size_t i=0; i<getNumberOfLayouts(); ++i)
+        total_abundance += getLayout(i)->getTotalAbundance();
+    return total_abundance;
+}
+
+void Layer::init_parameters()
+{
+    getParameterPool()->clear(); // non-trivially needed
+    registerParameter(BornAgain::Thickness, &m_thickness).setUnit("nm").setNonnegative();
+}
+
+//! Prints description.
+void Layer::print(std::ostream& ostr) const
+{
+    ICompositeSample::print(ostr);
+    ostr << "-->Layer{" <<  *getMaterial() << "}";
+}
+
+void Layer::addLayoutPtr(ILayout* layout)
+{
+    if( !layout )
+        return;
+    m_layouts.push_back(layout);
+    registerChild(layout);
+}
+
+void Layer::initialize()
+{
+    setName(BornAgain::LayerType);
+    init_parameters();
+}
diff --git a/Core/Multilayer/Layer.h b/Core/Multilayer/Layer.h
new file mode 100644
index 0000000..99b584a
--- /dev/null
+++ b/Core/Multilayer/Layer.h
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/Layer.h
+//! @brief     Defines class Layer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYER_H
+#define LAYER_H
+
+#include "ICompositeSample.h"
+#include "Complex.h"
+#include "SafePointerVector.h"
+
+class ILayout;
+class IMaterial;
+
+//! A layer, with thickness (in nanometer) and material.
+//! @ingroup samples
+
+class BA_CORE_API_ Layer : public ICompositeSample
+{
+public:
+    Layer(); // TODO consider =delete;
+    Layer(const IMaterial& material, double thickness = 0);
+
+    ~Layer() final;
+
+    Layer* clone() const final { return new Layer(*this); }
+    Layer* cloneInvertB() const final;
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    std::string to_str(int indent=0) const final;
+
+    void setThickness(double thickness);
+    double getThickness() const { return m_thickness; }
+
+    void setMaterial(const IMaterial& material);
+    const IMaterial* getMaterial() const { return mp_material; }
+
+    complex_t getRefractiveIndex() const;
+    complex_t getRefractiveIndex2() const; //!< squared refractive index
+
+    void addLayout(const ILayout& decoration);
+    size_t getNumberOfLayouts() const { return m_layouts.size(); }
+    const ILayout* getLayout(size_t i) const;
+
+    //! Returns true if decoration is present
+    bool hasComputation() const { return m_layouts.size()>0; }
+
+    double getTotalParticleSurfaceDensity(size_t layout_index) const;
+
+    double getTotalAbundance() const;
+
+    void setNumberOfLayers(size_t n_layers) { mn_layers = n_layers; }
+    size_t getNumberOfLayers() const { return mn_layers; }
+
+private:
+    Layer(const Layer& other);
+
+    void init_parameters();
+
+    void print(std::ostream& ostr) const;
+
+    //! adds particle layout (separate pointer version due to python-bindings)
+    void addLayoutPtr(ILayout* layout);
+
+    IMaterial* mp_material;   //!< pointer to the material
+    double m_thickness;       //!< layer thickness in nanometers
+    SafePointerVector<class ILayout> m_layouts; //!< independent layouts in this layer
+    size_t mn_layers;
+
+    void initialize();
+};
+
+#endif // LAYER_H
diff --git a/Core/Multilayer/LayerInterface.cpp b/Core/Multilayer/LayerInterface.cpp
new file mode 100644
index 0000000..bb029de
--- /dev/null
+++ b/Core/Multilayer/LayerInterface.cpp
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerInterface.cpp
+//! @brief     Implements class LayerInterface.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "LayerInterface.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "LayerRoughness.h"
+#include "Logger.h"
+
+LayerInterface::LayerInterface()
+    : m_roughness(0)
+    , m_LayerTop(0)
+    , m_LayerBottom(0)
+{
+    setName(BornAgain::LayerInterfaceType);
+}
+
+LayerInterface::~LayerInterface()
+{
+    delete m_roughness;
+}
+
+LayerInterface* LayerInterface::clone() const
+{
+    throw Exceptions::NotImplementedException("LayerInterface::clone() -> Not allowed to clone.");
+}
+
+LayerInterface* LayerInterface::createSmoothInterface(
+    const Layer* p_layer_top, const Layer* p_layer_bottom)
+{
+    LayerInterface* lr = new LayerInterface();
+    lr->setLayerTop(p_layer_top);
+    lr->setLayerBottom(p_layer_bottom);
+    return lr;
+}
+
+LayerInterface* LayerInterface::createRoughInterface(
+    const Layer* p_layer_top, const Layer* p_layer_bottom, const LayerRoughness& roughness)
+{
+    LayerInterface* lr = new LayerInterface();
+    lr->setLayerTop(p_layer_top);
+    lr->setLayerBottom(p_layer_bottom);
+    lr->setRoughness(roughness);
+    return lr;
+}
+
+void LayerInterface::setRoughness(const LayerRoughness& roughness)
+{
+    if(m_roughness) {
+        msglog(MSG::WARNING) << "LayerInterface::setRoughness() -> "
+            "Info. Roughness already assigned to given interface, removing it ";
+        deregisterChild(m_roughness);
+        delete m_roughness;
+    }
+    //m_roughness = new LayerRoughness(roughness);
+    m_roughness = roughness.clone();
+    registerChild(m_roughness);
+}
+
+void LayerInterface::print(std::ostream& ostr) const
+{
+    ICompositeSample::print(ostr);
+    ostr << "-->LayerI'face{top=" << getLayerTop() << ", bottom=" << getLayerBottom() << "}";
+}
diff --git a/Core/Multilayer/LayerInterface.h b/Core/Multilayer/LayerInterface.h
new file mode 100644
index 0000000..4f25f3f
--- /dev/null
+++ b/Core/Multilayer/LayerInterface.h
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerInterface.h
+//! @brief     Defines class LayerInterface.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERINTERFACE_H
+#define LAYERINTERFACE_H
+
+#include "ICompositeSample.h"
+class LayerRoughness;
+
+//! Interface between two layers, possibly with roughness.
+//! @ingroup samples_internal
+
+class BA_CORE_API_ LayerInterface : public ICompositeSample
+{
+public:
+    virtual ~LayerInterface();
+
+    LayerInterface *clone() const;
+
+    virtual void accept(ISampleVisitor *visitor) const { visitor->visit(this); }
+
+    //! Creates smooth interface between two layers
+    static LayerInterface* createSmoothInterface(const Layer *p_layer_top,
+                                                 const Layer *p_layer_bottom);
+
+    //! Creates rough interface between two layers
+    static LayerInterface* createRoughInterface(const Layer *p_layer_top,
+                                                const Layer *p_layer_bottom,
+                                                const LayerRoughness& roughness);
+
+    //! Sets link to the layer above the interface.
+    void setLayerTop(const Layer* p_layer_top) { m_LayerTop = p_layer_top; }
+
+    //! Sets link to the layer below the interface.
+    void setLayerBottom(const Layer* p_layer_bottom) { m_LayerBottom = p_layer_bottom; }
+
+    //! Sets links to the layers above and below the interface.
+    void setLayersTopBottom(
+        const Layer* p_layer_top, const Layer* p_layer_bottom)
+    { setLayerTop(p_layer_top); setLayerBottom(p_layer_bottom); }
+
+    //! Sets roughness of the interface.
+    void setRoughness(const LayerRoughness& roughness);
+
+    //! Returns roughness of the interface.
+    const LayerRoughness *getRoughness() const { return m_roughness; }
+
+    //! Returns top layer.
+    const Layer *getLayerTop() const { return m_LayerTop; }
+
+    //! Returns bottom layer.
+    const Layer *getLayerBottom() const { return m_LayerBottom; }
+
+protected:
+    void print(std::ostream& ostr) const;
+
+private:
+    LayerInterface();
+
+    LayerRoughness *m_roughness;   //!< roughness of the interface
+    const Layer *m_LayerTop;       //!< pointer to the layer above interface
+    const Layer *m_LayerBottom;    //!< pointer to the layer below interface
+};
+
+#endif // LAYERINTERFACE_H
diff --git a/Core/Multilayer/LayerRoughness.cpp b/Core/Multilayer/LayerRoughness.cpp
new file mode 100644
index 0000000..58160be
--- /dev/null
+++ b/Core/Multilayer/LayerRoughness.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerRoughness.cpp
+//! @brief     Implements class LayerRoughness.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "LayerRoughness.h"
+#include "BornAgainNamespace.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+LayerRoughness::LayerRoughness()
+    : m_sigma(0)
+    , m_hurstParameter(0)
+    , m_latteralCorrLength(0)
+{
+    initialize();
+}
+
+LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength)
+    : m_sigma(sigma)
+    , m_hurstParameter(hurstParameter)
+    , m_latteralCorrLength(latteralCorrLength)
+{
+    initialize();
+}
+
+void LayerRoughness::initialize()
+{
+    setName(BornAgain::LayerBasicRoughnessType);
+    registerParameter(BornAgain::Sigma, &m_sigma);
+    registerParameter(BornAgain::Hurst, &m_hurstParameter);
+    registerParameter(BornAgain::CorrelationLength, &m_latteralCorrLength).
+        setUnit("nm").setNonnegative();
+}
+
+
+/* ************************************************************************* */
+//! Power spectral density of the surface roughness is a result of two-dimensional
+//! Fourier transform of the correlation function of the roughness profile.
+//!
+//! Based on the article
+//! D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995
+//! "X-ray reflection and transmission by rough surfaces"
+/* ************************************************************************* */
+double LayerRoughness::getSpectralFun(const kvector_t kvec) const
+{
+    double H = m_hurstParameter;
+    double clength2 = m_latteralCorrLength*m_latteralCorrLength;
+    double Qpar2 = kvec.x()*kvec.x() + kvec.y()*kvec.y();
+    return 4.0*M_PI*H * m_sigma*m_sigma * clength2 *
+        std::pow( (1.0 + Qpar2*clength2), (-1-H) );
+}
+
+//! Correlation function of the roughness profile
+
+double LayerRoughness::getCorrFun(const kvector_t k) const
+{
+    double H = m_hurstParameter;
+    double clength = m_latteralCorrLength;
+    double R = sqrt(k.x()*k.x() + k.y()*k.y());
+    return m_sigma*m_sigma*std::exp( -1.0*std::pow(R/clength, 2.*H) );
+}
+
+std::ostream &operator<<(std::ostream &ostr, LayerRoughness &m)
+{
+    m.print(ostr);
+    return ostr;
+}
+
+void LayerRoughness::print(std::ostream& ostr) const
+{
+    ISample::print(ostr);
+    ostr << "-->LayerRoughness{ sigma=" << m_sigma << "}";
+}
diff --git a/Core/Multilayer/LayerRoughness.h b/Core/Multilayer/LayerRoughness.h
new file mode 100644
index 0000000..a45af6d
--- /dev/null
+++ b/Core/Multilayer/LayerRoughness.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerRoughness.h
+//! @brief     Defines class LayerRoughness.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERROUGHNESS_H
+#define LAYERROUGHNESS_H
+
+#include "IRoughness.h"
+#include "Vectors3D.h"
+
+//! @class LayerRoughness
+//! @ingroup samples
+//! @brief A Roughness of interface between two layers.
+//!
+//! Based on the article
+//! D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995
+//! "X-ray reflection and transmission by rough surfaces"
+
+class BA_CORE_API_ LayerRoughness : public IRoughness
+{
+public:
+    LayerRoughness();
+    LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
+
+    LayerRoughness* clone() const {
+        return new LayerRoughness(m_sigma, m_hurstParameter, m_latteralCorrLength); }
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    //! Returns power spectral density of the surface roughness
+    double getSpectralFun(const kvector_t kvec) const;
+
+    double getCorrFun(const kvector_t k) const;
+
+    //! Sets rms of roughness
+    void setSigma(double sigma) { m_sigma = sigma; }
+    //! Returns rms of roughness
+    double getSigma() const { return m_sigma; }
+
+    //! Sets hurst parameter. It describes how jagged the surface is.
+    void setHurstParameter(double hurstParameter) { m_hurstParameter = hurstParameter; }
+    //! Returns hurst parameter
+    double getHurstParameter() const { return m_hurstParameter; }
+
+    //! Sets lateral correlation length
+    void setLatteralCorrLength(double latteralCorrLength) {
+        m_latteralCorrLength = latteralCorrLength; }
+    //! Returns latteral correlation length
+    double getLatteralCorrLength() const { return m_latteralCorrLength; }
+
+    //! Prints class
+    friend std::ostream& operator<<(std::ostream& ostr, /*const*/ LayerRoughness& m);
+
+protected:
+    void print(std::ostream& ostr) const;
+
+    double m_sigma;                //!< rms of roughness
+    double m_hurstParameter;   //!< Hurst parameter which describes how jagged the interface, 0<H<=1
+    double m_latteralCorrLength;   //!< latteral correlation length of the roughness
+private:
+    void initialize();
+};
+
+#endif // LAYERROUGHNESS_H
diff --git a/Core/Multilayer/LayerSpecularInfo.cpp b/Core/Multilayer/LayerSpecularInfo.cpp
new file mode 100644
index 0000000..d8f83b7
--- /dev/null
+++ b/Core/Multilayer/LayerSpecularInfo.cpp
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerSpecularInfo.cpp
+//! @brief     Implements class LayerSpecularInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "LayerSpecularInfo.h"
+#include "ILayerRTCoefficients.h"
+#include "ISpecularInfoMap.h"
+#include "SimulationElement.h"
+
+LayerSpecularInfo::LayerSpecularInfo() {}
+LayerSpecularInfo::~LayerSpecularInfo() {}
+
+LayerSpecularInfo* LayerSpecularInfo::clone() const
+{
+    LayerSpecularInfo *p_result = new LayerSpecularInfo;
+    p_result->mP_coeff_map.reset(this->mP_coeff_map->clone());
+    return p_result;
+}
+
+void LayerSpecularInfo::addRTCoefficients(ISpecularInfoMap* rt_coefficient_map)
+{
+    if (mP_coeff_map.get() != rt_coefficient_map)
+        mP_coeff_map.reset(rt_coefficient_map);
+}
+
+const ILayerRTCoefficients* LayerSpecularInfo::getOutCoefficients(
+    const SimulationElement& sim_element) const
+{
+    return mP_coeff_map->getOutCoefficients(sim_element);
+}
+
+const ILayerRTCoefficients* LayerSpecularInfo::getInCoefficients(
+    const SimulationElement& sim_element) const
+{
+    return mP_coeff_map->getInCoefficients(sim_element);
+}
diff --git a/Core/Multilayer/LayerSpecularInfo.h b/Core/Multilayer/LayerSpecularInfo.h
new file mode 100644
index 0000000..e9ce627
--- /dev/null
+++ b/Core/Multilayer/LayerSpecularInfo.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerSpecularInfo.h
+//! @brief     Defines class LayerSpecularInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERSPECULARINFO_H
+#define LAYERSPECULARINFO_H
+
+#include "ICloneable.h"
+#include <memory>
+
+class ISpecularInfoMap;
+class ILayerRTCoefficients;
+class SimulationElement;
+
+//! Holds the amplitude information of the radiation wavefunction in a specific layer
+//! for different incoming (outgoing) angles of the beam in the top layer
+//! (these amplitudes correspond to the specular part of the neutron wavefunction).
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ LayerSpecularInfo : public ICloneable
+{
+public:
+    LayerSpecularInfo();
+    ~LayerSpecularInfo() final;
+
+    LayerSpecularInfo* clone() const final;
+
+    //! Adds the amplitude coefficients for the (time-reversed) outgoing
+    //! wavevector with the given angles
+    void addRTCoefficients(ISpecularInfoMap* rt_coefficient_map);
+
+    //! Retrieves the amplitude coefficients for a (time-reversed) outgoing wavevector.
+    const ILayerRTCoefficients* getOutCoefficients(const SimulationElement& sim_element) const;
+
+    //! Retrieves the amplitude coefficients for an incoming wavevector.
+    const ILayerRTCoefficients* getInCoefficients(const SimulationElement& sim_element) const;
+
+private:
+    std::unique_ptr<ISpecularInfoMap> mP_coeff_map;
+};
+
+#endif // LAYERSPECULARINFO_H
diff --git a/Core/Multilayer/LayerStrategyBuilder.cpp b/Core/Multilayer/LayerStrategyBuilder.cpp
new file mode 100644
index 0000000..c93700c
--- /dev/null
+++ b/Core/Multilayer/LayerStrategyBuilder.cpp
@@ -0,0 +1,126 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerStrategyBuilder.cpp
+//! @brief     Implements class LayerStrategyBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "LayerStrategyBuilder.h"
+#include "Exceptions.h"
+#include "FormFactorWrapper.h"
+#include "FormFactorDWBA.h"
+#include "FormFactorDWBAPol.h"
+#include "ILayout.h"
+#include "IParticle.h"
+#include "InterferenceFunctionNone.h"
+#include "MultiLayer.h"
+#include "Layer.h"
+#include "LayerSpecularInfo.h"
+#include "DecouplingApproximationStrategy.h"
+#include "SSCApproximationStrategy.h"
+
+LayerStrategyBuilder::LayerStrategyBuilder(
+    const Layer& decorated_layer, bool polarized,
+    const SimulationOptions& sim_params, size_t layout_index,
+    const LayerSpecularInfo* specular_info)
+    : m_sim_params {sim_params}
+    , mP_specular_info {nullptr}
+    , m_layout_index {layout_index}
+    , m_polarized {polarized}
+{
+    mP_layer.reset(decorated_layer.clone());
+    assert(mP_layer->getNumberOfLayouts() > 0);
+    assert(specular_info);
+    mP_specular_info.reset(specular_info->clone());
+}
+
+LayerStrategyBuilder::~LayerStrategyBuilder()
+{} // needs class definitions => don't move to .h
+
+//! Returns a new strategy object that is able to calculate the scattering for fixed k_f.
+IInterferenceFunctionStrategy* LayerStrategyBuilder::createStrategy() const
+{
+    assert(mP_layer->getNumberOfLayouts()>0);
+    SafePointerVector<class FormFactorWrapper> ff_wrappers = collectFormFactorWrappers();
+    std::unique_ptr<class IInterferenceFunction> P_interference_function{
+        mP_layer->getLayout(m_layout_index)->cloneInterferenceFunction()};
+
+    IInterferenceFunctionStrategy* p_result = nullptr;
+    switch (mP_layer->getLayout(m_layout_index)->getApproximation())
+    {
+    case ILayout::DA:
+        if (m_polarized)
+            p_result = new DecouplingApproximationStrategy2(m_sim_params);
+        else
+            p_result = new DecouplingApproximationStrategy1(m_sim_params);
+        break;
+    case ILayout::SSCA:
+    {
+        double kappa = P_interference_function->getKappa();
+        if (kappa<=0.0)
+            throw Exceptions::ClassInitializationException(
+                "SSCA requires a nontrivial interference function "
+                "with a strictly positive coupling coefficient kappa");
+        if (m_polarized)
+            p_result = new SSCApproximationStrategy2(m_sim_params, kappa);
+        else
+            p_result = new SSCApproximationStrategy1(m_sim_params, kappa);
+        break;
+    }
+    default:
+        throw Exceptions::ClassInitializationException(
+            "Unknown interference function approximation");
+    }
+    if (!p_result)
+        throw Exceptions::ClassInitializationException(
+            "Could not create appropriate strategy");
+    p_result->init(ff_wrappers, *P_interference_function, *mP_specular_info);
+    return p_result;
+}
+
+//! Sets m_formfactor_wrappers, the list of weighted form factors.
+SafePointerVector<class FormFactorWrapper> LayerStrategyBuilder::collectFormFactorWrappers() const
+{
+    assert(mP_layer->getNumberOfLayouts()>0);
+    SafePointerVector<class FormFactorWrapper> result;
+    const ILayout* p_layout = mP_layer->getLayout(m_layout_index);
+    const IMaterial* p_layer_material = mP_layer->getMaterial();
+    double total_abundance = mP_layer->getTotalAbundance();
+    if (total_abundance<=0.0) // TODO: why this can happen? why not throw error?
+        total_abundance = 1.0;
+    for (const IParticle* particle: p_layout->getParticles()) {
+        FormFactorWrapper* p_weighted_ff;
+        p_weighted_ff = createFormFactorWrapper(particle, p_layer_material);
+        p_weighted_ff->m_abundance /= total_abundance;
+        result.push_back(p_weighted_ff);
+    }
+    return result;
+}
+
+//! Returns a new formfactor wrapper for a given particle in given ambient material.
+FormFactorWrapper* LayerStrategyBuilder::createFormFactorWrapper(
+    const IParticle* particle, const IMaterial* p_ambient_material) const
+{
+    const std::unique_ptr<IParticle> P_particle_clone{ particle->clone() };
+    P_particle_clone->setAmbientMaterial(*p_ambient_material);
+
+    const std::unique_ptr<IFormFactor> P_ff_particle{ P_particle_clone->createFormFactor() };
+    IFormFactor* p_ff_framework;
+    if (mP_layer->getNumberOfLayers()>1) {
+        if (m_polarized)
+            p_ff_framework = new FormFactorDWBAPol(*P_ff_particle);
+        else
+            p_ff_framework = new FormFactorDWBA(*P_ff_particle);
+    } else
+        p_ff_framework = P_ff_particle->clone();
+
+    return new FormFactorWrapper(p_ff_framework, particle->getAbundance());
+}
diff --git a/Core/Multilayer/LayerStrategyBuilder.h b/Core/Multilayer/LayerStrategyBuilder.h
new file mode 100644
index 0000000..4dfa12e
--- /dev/null
+++ b/Core/Multilayer/LayerStrategyBuilder.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/LayerStrategyBuilder.h
+//! @brief     Defines class LayerStrategyBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERSTRATEGYBUILDER_H
+#define LAYERSTRATEGYBUILDER_H
+
+#include "SafePointerVector.h"
+#include "SimulationOptions.h"
+#include <memory>
+
+class FormFactorWrapper;
+class IInterferenceFunctionStrategy;
+class IMaterial;
+class IParticle;
+class Layer;
+class LayerSpecularInfo;
+class MultiLayer;
+
+//! Methods to generate a simulation strategy for DecoratedLayerComputation.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ LayerStrategyBuilder
+{
+public:
+    LayerStrategyBuilder(
+        const Layer& decorated_layer, bool polarized,
+        const SimulationOptions& sim_params, size_t layout_index,
+        const LayerSpecularInfo* specular_info);
+
+    ~LayerStrategyBuilder();
+
+    IInterferenceFunctionStrategy* createStrategy() const;
+
+private:
+    SafePointerVector<class FormFactorWrapper> collectFormFactorWrappers() const;
+    FormFactorWrapper* createFormFactorWrapper(
+        const IParticle* particle, const IMaterial* p_ambient_material) const;
+
+    std::unique_ptr<class Layer> mP_layer;                     //!< decorated layer
+    std::unique_ptr<class MultiLayer> mP_sample;               //!< sample
+    SimulationOptions m_sim_params;                            //!< simulation parameters
+    std::unique_ptr<class LayerSpecularInfo> mP_specular_info; //!< R and T coefficients for DWBA
+    size_t m_layout_index;                      //!< index for the layout to be used in the layer
+    bool m_polarized;                           //!< polarized computation required?
+};
+
+#endif // LAYERSTRATEGYBUILDER_H
diff --git a/Core/Multilayer/MatrixRTCoefficients.cpp b/Core/Multilayer/MatrixRTCoefficients.cpp
new file mode 100644
index 0000000..08f11f7
--- /dev/null
+++ b/Core/Multilayer/MatrixRTCoefficients.cpp
@@ -0,0 +1,242 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/MatrixRTCoefficients.cpp
+//! @brief     Implements class MatrixRTCoefficients.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MatrixRTCoefficients.h"
+
+MatrixRTCoefficients *MatrixRTCoefficients::clone() const
+{
+    return new MatrixRTCoefficients(*this);
+}
+
+void MatrixRTCoefficients::calculateTRMatrices()
+{
+    if (m_b_mag == 0.0) {
+        calculateTRWithoutMagnetization();
+        return;
+    }
+
+    if (lambda(0)==0.0) {
+        complex_t ikt = mul_I( m_kt );
+        // Lambda1 component contained only in T1m (R1m=0)
+        // row 0:
+        T1m(0,0) = (1.0 - m_bz/m_b_mag)/2.0;
+        T1m(0,1) = - m_scatt_matrix(0,1)/2.0/m_b_mag;
+        // row 1:
+        T1m(1,0) = - m_scatt_matrix(1,0)/2.0/m_b_mag;
+        T1m(1,1) = (1.0 + m_bz/m_b_mag)/2.0;
+        // row 2:
+        T1m(2,0) = ikt*(1.0 - m_bz/m_b_mag)/2.0;
+        T1m(2,1) = -ikt*m_scatt_matrix(0,1)/2.0/m_b_mag;
+        T1m(2,2) = T1m(0,0);
+        T1m(2,3) = T1m(0,1);
+        // row 3:
+        T1m(3,0) = -ikt*m_scatt_matrix(1,0)/2.0/m_b_mag;
+        T1m(3,1) = ikt*(1.0 + m_bz/m_b_mag)/2.0;
+        T1m(3,2) = T1m(1,0);
+        T1m(3,3) = T1m(1,1);
+    }
+    else {
+        // T1m:
+        // row 0:
+        T1m(0,0) = (1.0 - m_bz/m_b_mag)/4.0;
+        T1m(0,1) = - m_scatt_matrix(0,1)/4.0/m_b_mag;
+        T1m(0,2) = lambda(0)*(m_bz/m_b_mag - 1.0)/4.0;
+        T1m(0,3) = m_scatt_matrix(0,1)*lambda(0)/4.0/m_b_mag;
+        // row 1:
+        T1m(1,0) = - m_scatt_matrix(1,0)/4.0/m_b_mag;
+        T1m(1,1) = (1.0 + m_bz/m_b_mag)/4.0;
+        T1m(1,2) = m_scatt_matrix(1,0)*lambda(0)/4.0/m_b_mag;
+        T1m(1,3) = - lambda(0)*(m_bz/m_b_mag + 1.0)/4.0;
+        // row 2:
+        T1m(2,0) = -(1.0 - m_bz/m_b_mag)/4.0/lambda(0);
+        T1m(2,1) = m_scatt_matrix(0,1)/4.0/m_b_mag/lambda(0);
+        T1m(2,2) = -(m_bz/m_b_mag - 1.0)/4.0;
+        T1m(2,3) = - m_scatt_matrix(0,1)/4.0/m_b_mag;
+        // row 3:
+        T1m(3,0) = m_scatt_matrix(1,0)/4.0/m_b_mag/lambda(0);
+        T1m(3,1) = -(1.0 + m_bz/m_b_mag)/4.0/lambda(0);
+        T1m(3,2) = - m_scatt_matrix(1,0)/4.0/m_b_mag;
+        T1m(3,3) = (m_bz/m_b_mag + 1.0)/4.0;
+
+        // R1m:
+        // row 0:
+        R1m(0,0) = T1m(0,0);
+        R1m(0,1) = T1m(0,1);
+        R1m(0,2) = -T1m(0,2);
+        R1m(0,3) = -T1m(0,3);
+        // row 1:
+        R1m(1,0) = T1m(1,0);
+        R1m(1,1) = T1m(1,1);
+        R1m(1,2) = -T1m(1,2);
+        R1m(1,3) = -T1m(1,3);
+        // row 2:
+        R1m(2,0) = -T1m(2,0);
+        R1m(2,1) = -T1m(2,1);
+        R1m(2,2) = T1m(2,2);
+        R1m(2,3) = T1m(2,3);
+        // row 3:
+        R1m(3,0) = -T1m(3,0);
+        R1m(3,1) = -T1m(3,1);
+        R1m(3,2) = T1m(3,2);
+        R1m(3,3) = T1m(3,3);
+    }
+
+    if (lambda(1)==0.0) {
+        complex_t ikt = mul_I(m_kt);
+        // Lambda2 component contained only in T2m (R2m=0)
+        // row 0:
+        T2m(0,0) = (1.0 + m_bz/m_b_mag)/2.0;
+        T2m(0,1) = m_scatt_matrix(0,1)/2.0/m_b_mag;
+        // row 1:
+        T2m(1,0) = m_scatt_matrix(1,0)/2.0/m_b_mag;
+        T2m(1,1) = (1.0 - m_bz/m_b_mag)/2.0;
+        // row 2:
+        T2m(2,0) = ikt*(1.0 + m_bz/m_b_mag)/2.0;
+        T2m(2,1) = ikt*m_scatt_matrix(0,1)/2.0/m_b_mag;
+        T2m(2,2) = T2m(0,0);
+        T2m(2,3) = T2m(0,1);
+        // row 3:
+        T2m(3,0) = ikt*m_scatt_matrix(1,0)/2.0/m_b_mag;
+        T2m(3,1) = ikt*(1.0 - m_bz/m_b_mag)/2.0;
+        T2m(3,2) = T2m(1,0);
+        T2m(3,3) = T2m(1,1);
+    }
+    else {
+        // T2m:
+        // row 0:
+        T2m(0,0) = (1.0 + m_bz/m_b_mag)/4.0;
+        T2m(0,1) = m_scatt_matrix(0,1)/4.0/m_b_mag;
+        T2m(0,2) = - lambda(1)*(m_bz/m_b_mag + 1.0)/4.0;
+        T2m(0,3) = - m_scatt_matrix(0,1)*lambda(1)/4.0/m_b_mag;
+        // row 1:
+        T2m(1,0) = m_scatt_matrix(1,0)/4.0/m_b_mag;
+        T2m(1,1) = (1.0 - m_bz/m_b_mag)/4.0;
+        T2m(1,2) = - m_scatt_matrix(1,0)*lambda(1)/4.0/m_b_mag;
+        T2m(1,3) = lambda(1)*(m_bz/m_b_mag - 1.0)/4.0;
+        // row 2:
+        T2m(2,0) = -(1.0 + m_bz/m_b_mag)/4.0/lambda(1);
+        T2m(2,1) = - m_scatt_matrix(0,1)/4.0/m_b_mag/lambda(1);
+        T2m(2,2) = (m_bz/m_b_mag + 1.0)/4.0;
+        T2m(2,3) = m_scatt_matrix(0,1)/4.0/m_b_mag;
+        // row 3:
+        T2m(3,0) = - m_scatt_matrix(1,0)/4.0/m_b_mag/lambda(1);
+        T2m(3,1) = -(1.0 - m_bz/m_b_mag)/4.0/lambda(1);
+        T2m(3,2) = m_scatt_matrix(1,0)/4.0/m_b_mag;
+        T2m(3,3) = (1.0 - m_bz/m_b_mag)/4.0;
+
+        // R2m:
+        // row 0:
+        R2m(0,0) = T2m(0,0);
+        R2m(0,1) = T2m(0,1);
+        R2m(0,2) = -T2m(0,2);
+        R2m(0,3) = -T2m(0,3);
+        // row 1:
+        R2m(1,0) = T2m(1,0);
+        R2m(1,1) = T2m(1,1);
+        R2m(1,2) = -T2m(1,2);
+        R2m(1,3) = -T2m(1,3);
+        // row 2:
+        R2m(2,0) = -T2m(2,0);
+        R2m(2,1) = -T2m(2,1);
+        R2m(2,2) = T2m(2,2);
+        R2m(2,3) = T2m(2,3);
+        // row 3:
+        R2m(3,0) = -T2m(3,0);
+        R2m(3,1) = -T2m(3,1);
+        R2m(3,2) = T2m(3,2);
+        R2m(3,3) = T2m(3,3);
+    }
+}
+
+void MatrixRTCoefficients::initializeBottomLayerPhiPsi()
+{
+    if (m_b_mag == 0.0) {
+        phi_psi_min << 0.0, -std::sqrt(m_a), 0.0, 1.0;
+        phi_psi_plus << -std::sqrt(m_a), 0.0, 1.0, 0.0;
+        return;
+    }
+    // First basis vector that has no upward going wave amplitude
+    phi_psi_min(0) = m_scatt_matrix(0,1) * ( lambda(0)-lambda(1) ) /
+            2.0/m_b_mag;
+    phi_psi_min(1) = ( m_bz  * (lambda(1) - lambda(0)) / m_b_mag -
+            lambda(1) - lambda(0) )/2.0;
+    phi_psi_min(2) = 0.0;
+    phi_psi_min(3) = 1.0;
+
+    // Second basis vector that has no upward going wave amplitude
+    phi_psi_plus(0) = - (m_scatt_matrix(0,0) + lambda(0) * lambda(1) ) /
+            ( lambda(0) + lambda(1) );
+    phi_psi_plus(1) = m_scatt_matrix(1,0) * ( lambda(0) - lambda(1) ) /
+            2.0/m_b_mag;
+    phi_psi_plus(2) = 1.0;
+    phi_psi_plus(3) = 0.0;
+}
+
+void MatrixRTCoefficients::initializeBottomLayerRT()
+{
+    // first treat case where both eigenmodes are the same (no B-field in layer)
+    if (m_b_mag == 0.0) {
+        phi_psi_min << 0.0, -std::sqrt(m_a), 0.0, 1.0;
+        phi_psi_plus << -std::sqrt(m_a), 0.0, 1.0, 0.0;
+        return;
+    }
+    // non-zero B-field
+    return;
+}
+
+void MatrixRTCoefficients::calculateTRWithoutMagnetization()
+{
+    T1m.setZero();
+    R1m.setZero();
+    T2m.setZero();
+    R2m.setZero();
+
+    if (m_a==0.0) {
+        // Spin down component contained only in T1 (R1=0)
+        T1m(1,1) = 1.0;
+        T1m(3,1) = mul_I(m_kt);
+        T1m(3,3) = 1.0;
+
+        // Spin up component contained only in T2 (R2=0)
+        T2m(0,0) = 1.0;
+        T2m(2,0) = mul_I(m_kt);
+        T2m(2,2) = 1.0;
+        return;
+    }
+
+    // T1m:
+    T1m(1,1) = 0.5;
+    T1m(1,3) = -std::sqrt(m_a)/2.0;
+    T1m(3,1) = -1.0/(2.0*std::sqrt(m_a));
+    T1m(3,3) = 0.5;
+
+    // R1m:
+    R1m(1,1) = 0.5;
+    R1m(1,3) = std::sqrt(m_a)/2.0;
+    R1m(3,1) = 1.0/(2.0*std::sqrt(m_a));
+    R1m(3,3) = 0.5;
+
+    // T2m:
+    T2m(0,0) = 0.5;
+    T2m(0,2) = -std::sqrt(m_a)/2.0;
+    T2m(2,0) = -1.0/(2.0*std::sqrt(m_a));
+    T2m(2,2) = 0.5;
+
+    // R2m:
+    R2m(0,0) = 0.5;
+    R2m(0,2) = std::sqrt(m_a)/2.0;
+    R2m(2,0) = 1.0/(2.0*std::sqrt(m_a));
+    R2m(2,2) = 0.5;
+}
diff --git a/Core/Multilayer/MatrixRTCoefficients.h b/Core/Multilayer/MatrixRTCoefficients.h
new file mode 100644
index 0000000..18af989
--- /dev/null
+++ b/Core/Multilayer/MatrixRTCoefficients.h
@@ -0,0 +1,187 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/MatrixRTCoefficients.h
+//! @brief     Defines class MatrixRTCoefficients.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATRIXRTCOEFFICIENTS_H
+#define MATRIXRTCOEFFICIENTS_H
+
+#include "ILayerRTCoefficients.h"
+
+
+//! @class MatrixRTCoefficients
+//! @ingroup algorithms_internal
+//! @brief Specular reflection and transmission coefficients in a layer in case
+//! of 2x2 matrix interactions between the layers and the scattered particle
+
+class BA_CORE_API_ MatrixRTCoefficients : public ILayerRTCoefficients
+{
+public:
+    MatrixRTCoefficients() : m_kt(0.0) {}
+    virtual ~MatrixRTCoefficients() {}
+
+    virtual MatrixRTCoefficients* clone() const;
+
+    //! The following functions return the transmitted and reflected amplitudes
+    //! for different incoming beam polarizations and eigenmodes
+    virtual Eigen::Vector2cd T1plus() const;
+    virtual Eigen::Vector2cd R1plus() const;
+    virtual Eigen::Vector2cd T2plus() const;
+    virtual Eigen::Vector2cd R2plus() const;
+    virtual Eigen::Vector2cd T1min() const;
+    virtual Eigen::Vector2cd R1min() const;
+    virtual Eigen::Vector2cd T2min() const;
+    virtual Eigen::Vector2cd R2min() const;
+    //! Returns z-part of the two wavevector eigenmodes
+    virtual Eigen::Vector2cd getKz() const;
+
+    friend class SpecularMagnetic;
+private:
+    void calculateTRMatrices();
+    void initializeBottomLayerPhiPsi();
+    void initializeBottomLayerRT();
+    void calculateTRWithoutMagnetization();
+    Eigen::Vector2cd kz; //!< z-part of the two wavevector eigenmodes
+    Eigen::Vector2cd lambda; // positive eigenvalues of transfer matrix
+    Eigen::Vector4cd phi_psi_plus; //!< boundary values for up-polarization
+    Eigen::Vector4cd phi_psi_min; //!< boundary values for down-polarization
+//    Eigen::Vector2cd t1_plus;  //!< boundary value for up-polarization
+//    Eigen::Vector2cd t2_plus;  //!< boundary value for up-polarization
+//    Eigen::Vector2cd r1_plus;  //!< boundary value for up-polarization
+//    Eigen::Vector2cd r2_plus;  //!< boundary value for up-polarization
+//    Eigen::Vector2cd t1_min;  //!< boundary value for down-polarization
+//    Eigen::Vector2cd t2_min;  //!< boundary value for down-polarization
+//    Eigen::Vector2cd r1_min;  //!< boundary value for down-polarization
+//    Eigen::Vector2cd r2_min;  //!< boundary value for down-polarization
+    Eigen::Matrix4cd T1m; //!< matrix selecting the transmitted part of
+                          //!< the first eigenmode
+    Eigen::Matrix4cd R1m; //!< matrix selecting the reflected part of
+                          //!< the first eigenmode
+    Eigen::Matrix4cd T2m; //!< matrix selecting the transmitted part of
+                          //!< the second eigenmode
+    Eigen::Matrix4cd R2m; //!< matrix selecting the reflected part of
+                          //!< the second eigenmode
+    Eigen::Matrix2cd m_scatt_matrix; //!< scattering matrix
+    complex_t m_a; //!< polarization independent part of scattering matrix
+    complex_t m_b_mag; //!< magnitude of magnetic interaction term
+    complex_t m_bz; //!< z-part of magnetic interaction term
+    double m_kt; //!< wavevector length times thickness of layer for use when
+                 //!< lambda=0
+};
+
+inline Eigen::Vector2cd MatrixRTCoefficients::T1plus() const
+{
+    Eigen::Vector2cd result;
+    result(0) = T1m.row(2).dot(phi_psi_plus);
+    result(1) = T1m.row(3).dot(phi_psi_plus);
+    if (lambda(0)==0.0 && result==Eigen::Vector2cd::Zero()) {
+        result(0) = 0.5;
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::R1plus() const
+{
+    Eigen::Vector2cd result;
+    result(0) = R1m.row(2).dot(phi_psi_plus);
+    result(1) = R1m.row(3).dot(phi_psi_plus);
+    if (lambda(0)==0.0) {
+        if (T1m.row(2).dot(phi_psi_plus)==0.0
+                && T1m.row(3).dot(phi_psi_plus)==0.0) {
+            result(0) = -0.5;
+        }
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::T2plus() const
+{
+    Eigen::Vector2cd result;
+    result(0) = T2m.row(2).dot(phi_psi_plus);
+    result(1) = T2m.row(3).dot(phi_psi_plus);
+    if (lambda(1)==0.0 && result==Eigen::Vector2cd::Zero()) {
+        result(0) = 0.5;
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::R2plus() const
+{
+    Eigen::Vector2cd result;
+    result(0) = R2m.row(2).dot(phi_psi_plus);
+    result(1) = R2m.row(3).dot(phi_psi_plus);
+    if (lambda(1)==0.0) {
+        if (T2m.row(2).dot(phi_psi_plus)==0.0
+                && T2m.row(3).dot(phi_psi_plus)==0.0) {
+            result(0) = -0.5;
+        }
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::T1min() const
+{
+    Eigen::Vector2cd result;
+    result(0) = T1m.row(2).dot(phi_psi_min);
+    result(1) = T1m.row(3).dot(phi_psi_min);
+    if (lambda(0)==0.0 && result==Eigen::Vector2cd::Zero()) {
+        result(1) = 0.5;
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::R1min() const
+{
+    Eigen::Vector2cd result;
+    result(0) = R1m.row(2).dot(phi_psi_min);
+    result(1) = R1m.row(3).dot(phi_psi_min);
+    if (lambda(0)==0.0) {
+        if (T1m.row(2).dot(phi_psi_min)==0.0
+                && T1m.row(3).dot(phi_psi_min)==0.0) {
+            result(1) = -0.5;
+        }
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::T2min() const
+{
+    Eigen::Vector2cd result;
+    result(0) = T2m.row(2).dot(phi_psi_min);
+    result(1) = T2m.row(3).dot(phi_psi_min);
+    if (lambda(1)==0.0 && result==Eigen::Vector2cd::Zero()) {
+        result(1) = 0.5;
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::R2min() const
+{
+    Eigen::Vector2cd result;
+    result(0) = R2m.row(2).dot(phi_psi_min);
+    result(1) = R2m.row(3).dot(phi_psi_min);
+    if (lambda(1)==0.0) {
+        if (T2m.row(2).dot(phi_psi_min)==0.0
+                && T2m.row(3).dot(phi_psi_min)==0.0) {
+            result(1) = -0.5;
+        }
+    }
+    return result;
+}
+
+inline Eigen::Vector2cd MatrixRTCoefficients::getKz() const
+{
+    return kz;
+}
+
+#endif // MATRIXRTCOEFFICIENTS_H
diff --git a/Core/Multilayer/MatrixSpecularInfoMap.cpp b/Core/Multilayer/MatrixSpecularInfoMap.cpp
new file mode 100644
index 0000000..f4f945c
--- /dev/null
+++ b/Core/Multilayer/MatrixSpecularInfoMap.cpp
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/MatrixSpecularInfoMap.cpp
+//! @brief     Implements class ScalarSpecularInfoMap.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MatrixSpecularInfoMap.h"
+#include "ILayerRTCoefficients.h"
+#include "MatrixRTCoefficients.h"
+#include "ISpecularInfoMap.h"
+#include "MultiLayer.h"
+#include "SimulationElement.h"
+#include "SpecularMagnetic.h"
+
+MatrixSpecularInfoMap::MatrixSpecularInfoMap(const MultiLayer* multilayer, int layer)
+    : m_layer(layer)
+{
+    if (multilayer) {
+        mP_multilayer.reset((multilayer->clone()));
+        mP_inverted_multilayer.reset(multilayer->cloneInvertB());
+    }
+}
+
+MatrixSpecularInfoMap* MatrixSpecularInfoMap::clone() const
+{
+    MatrixSpecularInfoMap* result = new MatrixSpecularInfoMap(nullptr, m_layer);
+    if (mP_multilayer)  {
+        result->mP_multilayer.reset(mP_multilayer->clone());
+        result->mP_inverted_multilayer.reset(mP_inverted_multilayer->clone());
+    }
+    return result;
+}
+
+// TODO factor out common private function as done in the Scalar.. case ?
+
+const ILayerRTCoefficients* MatrixSpecularInfoMap::getOutCoefficients(
+        const SimulationElement& sim_element) const
+{
+    SpecularMagnetic::MultiLayerCoeff_t coeffs;
+    SpecularMagnetic::execute(*mP_inverted_multilayer, -sim_element.getMeanKF(), coeffs);
+    return new MatrixRTCoefficients(coeffs[m_layer]);
+}
+
+const ILayerRTCoefficients* MatrixSpecularInfoMap::getInCoefficients(
+        const SimulationElement& sim_element) const
+{
+    SpecularMagnetic::MultiLayerCoeff_t coeffs;
+    SpecularMagnetic::execute(*mP_multilayer, sim_element.getKI(), coeffs);
+    return new MatrixRTCoefficients(coeffs[m_layer]);
+}
diff --git a/Core/Multilayer/MatrixSpecularInfoMap.h b/Core/Multilayer/MatrixSpecularInfoMap.h
new file mode 100644
index 0000000..7775cbc
--- /dev/null
+++ b/Core/Multilayer/MatrixSpecularInfoMap.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/MatrixSpecularInfoMap.h
+//! @brief     Defines class MatrixSpecularInfoMap.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATRIXSPECULARINFOMAP_H
+#define MATRIXSPECULARINFOMAP_H
+
+#include "ISpecularInfoMap.h"
+#include <memory>
+
+class ILayerRTCoefficients;
+class MultiLayer;
+class SimulationElement;
+
+//! Implementation of ISpecularInfoMap for matrix valued reflection/transmission coefficients.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ MatrixSpecularInfoMap : public ISpecularInfoMap
+{
+public:
+    MatrixSpecularInfoMap(const MultiLayer* multilayer, int layer);
+    ~MatrixSpecularInfoMap() final {}
+
+    MatrixSpecularInfoMap* clone() const final;
+
+    //! Retrieves the amplitude coefficients for the given angles
+    const ILayerRTCoefficients* getOutCoefficients(
+        const SimulationElement& sim_element) const final;
+
+    //! Retrieves the amplitude coefficients for the given angles
+    const ILayerRTCoefficients* getInCoefficients(
+        const SimulationElement& sim_element) const final;
+
+private:
+    std::unique_ptr<MultiLayer> mP_multilayer;
+    std::unique_ptr<MultiLayer> mP_inverted_multilayer;
+    const int m_layer;
+};
+
+#endif // MATRIXSPECULARINFOMAP_H
diff --git a/Core/Multilayer/MultiLayer.cpp b/Core/Multilayer/MultiLayer.cpp
new file mode 100644
index 0000000..e94c410
--- /dev/null
+++ b/Core/Multilayer/MultiLayer.cpp
@@ -0,0 +1,333 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/MultiLayer.cpp
+//! @brief     Implements class MultiLayer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MultiLayer.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "Materials.h"
+#include "ParameterPool.h"
+#include "RealParameter.h"
+#include <iomanip>
+
+MultiLayer::MultiLayer() : m_crossCorrLength(0)
+{
+    setName(BornAgain::MultiLayerType);
+    init_parameters();
+}
+
+MultiLayer::~MultiLayer()
+{
+    clear();
+}
+
+std::string MultiLayer::to_str(int indent) const
+{
+    return std::string(80, '-') + "\n" + ISample::to_str(indent);
+}
+
+void MultiLayer::init_parameters()
+{
+    getParameterPool()->clear(); // non-trivially needed
+    registerParameter(BornAgain::CrossCorrelationLength, &m_crossCorrLength).
+        setUnit("nm").setNonnegative();
+}
+
+void MultiLayer::clear() // TODO: understand need
+{
+    for (size_t i=0; i<m_layers.size(); i++)
+        delete m_layers[i];
+    m_layers.clear();
+
+    for (size_t i=0; i<m_interfaces.size(); i++)
+        delete m_interfaces[i];
+    m_interfaces.clear();
+
+    m_layers_z.clear();
+
+    getParameterPool()->clear(); // non-trivially needed
+}
+
+MultiLayer* MultiLayer::clone() const
+{
+    MultiLayer* newMultiLayer = new MultiLayer();
+
+    newMultiLayer->m_layers_z = m_layers_z;
+
+    std::vector<Layer*> layer_buffer;
+    for (size_t i=0; i<m_layers.size(); i++)
+        layer_buffer.push_back(m_layers[i]->clone() );
+
+    for (size_t i=0; i<m_interfaces.size(); i++) {
+        const Layer* topLayer = layer_buffer[i];
+        const Layer* bottomLayer = layer_buffer[i+1];
+
+        LayerInterface* newInterface(0);
+        if (m_interfaces[i]->getRoughness())
+            newInterface = LayerInterface::createRoughInterface(topLayer,
+                    bottomLayer, *m_interfaces[i]->getRoughness() );
+        else
+            newInterface = LayerInterface::createSmoothInterface(topLayer, bottomLayer );
+        newMultiLayer->addAndRegisterLayer( layer_buffer[i] );
+        newMultiLayer->addAndRegisterInterface( newInterface );
+    }
+
+    if (layer_buffer.size())
+        newMultiLayer->addAndRegisterLayer( layer_buffer.back() );
+
+    newMultiLayer->m_crossCorrLength = m_crossCorrLength;
+
+    newMultiLayer->init_parameters();
+
+    return newMultiLayer;
+}
+
+MultiLayer* MultiLayer::cloneInvertB() const
+{
+    MultiLayer* newMultiLayer = new MultiLayer();
+
+    newMultiLayer->m_layers_z = m_layers_z;
+
+    std::vector<Layer*> layer_buffer;
+    for (size_t i=0; i<m_layers.size(); i++)
+        layer_buffer.push_back(m_layers[i]->cloneInvertB());
+
+    for (size_t i=0; i<m_interfaces.size(); i++) {
+        const Layer* topLayer = layer_buffer[i];
+        const Layer* bottomLayer = layer_buffer[i+1];
+
+        LayerInterface* newInterface(0);
+        if (m_interfaces[i]->getRoughness())
+            newInterface = LayerInterface::createRoughInterface(
+                topLayer, bottomLayer, *m_interfaces[i]->getRoughness());
+        else
+            newInterface = LayerInterface::createSmoothInterface(topLayer, bottomLayer );
+        newMultiLayer->addAndRegisterLayer( layer_buffer[i] );
+        newMultiLayer->addAndRegisterInterface( newInterface );
+    }
+    if (layer_buffer.size())
+        newMultiLayer->addAndRegisterLayer( layer_buffer.back() );
+
+    newMultiLayer->m_crossCorrLength = m_crossCorrLength;
+
+    newMultiLayer->init_parameters();
+
+    return newMultiLayer;
+}
+
+//! Returns pointer to the top interface of the layer.
+//! nInterfaces = nLayers-1, first layer in multilayer doesn't have interface.
+const LayerInterface* MultiLayer::getLayerTopInterface(size_t i_layer) const
+{
+    return i_layer>0 ? m_interfaces[ check_interface_index(i_layer-1) ] : 0;
+}
+
+//! Returns pointer to the bottom interface of the layer.
+const LayerInterface* MultiLayer::getLayerBottomInterface(size_t i_layer) const
+{
+    return i_layer<m_interfaces.size() ? m_interfaces[ check_interface_index(i_layer) ] : 0;
+}
+
+//! Adds layer with top roughness
+
+void MultiLayer::addLayerWithTopRoughness(const Layer& layer, const LayerRoughness& roughness)
+{
+    Layer* p_new_layer = layer.clone();
+    if (getNumberOfLayers()) {
+        // not the top layer
+        const Layer* p_last_layer = m_layers.back();
+        LayerInterface* interface(0);
+        if (roughness.getSigma() != 0.0)
+            interface = LayerInterface::createRoughInterface(p_last_layer, p_new_layer, roughness);
+        else
+            interface = LayerInterface::createSmoothInterface(p_last_layer, p_new_layer);
+        addAndRegisterInterface(interface);
+        m_layers_z.push_back(m_layers_z.back() - layer.getThickness() );
+    } else {
+        // the top layer
+        if (p_new_layer->getThickness() != 0.0)
+            throw std::runtime_error(
+                "Invalid call to MultiLayer::addLayer(): the semi-infinite top layer "
+                "must have a pro forma thickness of 0");
+        m_layers_z.push_back(0.0);
+    }
+    addAndRegisterLayer(p_new_layer);
+}
+
+//! Adds layer with default (zero) roughness
+
+void MultiLayer::addLayer(const Layer& layer)
+{
+    LayerRoughness zero_roughness;
+    addLayerWithTopRoughness(layer, zero_roughness);
+}
+
+
+//! Fourier transform of the correlation function of roughnesses between the interfaces
+//! j,k - indexes of layers in multilayer whose bottom interfaces we are considering
+double MultiLayer::getCrossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const
+{
+    if (m_crossCorrLength == 0)
+        return 0.0;
+    double z_j = getLayerBottomZ(j);
+    double z_k = getLayerBottomZ(k);
+    const LayerRoughness* rough_j = getLayerBottomInterface(j)->getRoughness();
+    const LayerRoughness* rough_k = getLayerBottomInterface(k)->getRoughness();
+    if (!rough_j || !rough_k)
+        return 0.0;
+    double sigma_j = rough_j->getSigma();
+    double sigma_k = rough_k->getSigma();
+    if (sigma_j == 0 || sigma_k == 0)
+        return 0.0;
+    double corr = 0.5*( (sigma_k/sigma_j)*rough_j->getSpectralFun(kvec) +
+                        (sigma_j/sigma_k)*rough_k->getSpectralFun(kvec) ) *
+        std::exp( -1*std::abs(z_j-z_k)/m_crossCorrLength );
+    return corr;
+}
+
+// Currently unused, except in a trivial test.
+// TODO: integrate this into an onChange() mechanism.
+
+void MultiLayer::setLayerThickness(size_t i_layer, double thickness)
+{
+    if (thickness < 0.)
+        throw Exceptions::DomainErrorException("Layer thickness cannot be negative");
+
+    m_layers[ check_layer_index(i_layer) ]->setThickness(thickness);
+    // recalculating z-coordinates of layers
+    m_layers_z.clear();
+    m_layers_z.push_back(0.0);
+    for (size_t il=1; il<getNumberOfLayers(); il++)
+        m_layers_z.push_back(
+            m_layers_z.back() -
+            m_layers[ check_layer_index(il) ]->getThickness() );
+}
+
+int MultiLayer::getIndexOfLayer(const Layer* layer) const
+{
+    for (size_t i=0; i<getNumberOfLayers(); ++i)
+        if (layer == m_layers[i])
+            return i;
+    return -1;
+}
+
+bool MultiLayer::containsMagneticMaterial() const
+{
+    for (const IMaterial* mat: containedMaterials())
+        if (mat->isMagneticMaterial())
+            return true;
+    return false;
+}
+
+bool MultiLayer::hasRoughness() const
+{
+    for (const LayerInterface* face: m_interfaces)
+        if (face->getRoughness())
+            return true;
+    return false;
+}
+
+size_t MultiLayer::totalNofLayouts() const
+{
+    size_t ret = 0;
+    for (const Layer* layer: m_layers)
+        ret += layer->getNumberOfLayouts();
+    return ret;
+}
+
+void MultiLayer::print(std::ostream& ostr) const
+{
+    ostr << "MultiLayer:" << getName() << "<" << this << "> : {\n";
+    for (size_t i=0; i<getNumberOfLayers(); i++) {
+        ostr << " layer " << std::left << std::setw(2) << i << " { "
+             << *getLayer(i) << " }\n";
+        const LayerInterface* interface = getLayerBottomInterface(i);
+        if (interface)
+            ostr << " int.face {" << *interface << " }\n";
+        else
+            ostr << " int.face: NONE" << "\n";
+    }
+    ostr << "}";
+}
+
+void MultiLayer::addAndRegisterLayer(Layer* child)
+{
+    m_layers.push_back(child);
+    setNLayersInLayers();
+    registerChild(child);
+}
+
+void MultiLayer::addAndRegisterInterface(LayerInterface* child)
+{
+    m_interfaces.push_back(child);
+    registerChild(child);
+}
+
+void MultiLayer::setNLayersInLayers() const
+{
+    size_t n_layers = getNumberOfLayers();
+    for (size_t i=0; i<getNumberOfLayers(); ++i)
+        m_layers[i]->setNumberOfLayers(n_layers);
+}
+
+size_t MultiLayer::check_layer_index(size_t i_layer) const
+{
+    if (i_layer >= m_layers.size())
+        throw Exceptions::OutOfBoundsException("Layer index is out of bounds");
+    return i_layer;
+}
+
+size_t MultiLayer::check_interface_index(size_t i_interface) const
+{
+    if (i_interface >= m_interfaces.size())
+        throw Exceptions::OutOfBoundsException("Interface index is out of bounds");
+    return i_interface;
+}
+
+bool MultiLayer::requiresMatrixRTCoefficients() const
+{
+    for (auto layer: m_layers)
+        if (!(layer->getMaterial()->isScalarMaterial()))
+            return true;
+    return false;
+}
+
+size_t MultiLayer::zToLayerIndex(double z_value)
+{
+    if (z_value < m_layers_z.back()) return m_layers_z.size()-1;
+    std::vector<double>::reverse_iterator top_limit =
+        std::upper_bound(m_layers_z.rbegin(), m_layers_z.rend(), z_value);
+    size_t nbin = m_layers_z.rend() - top_limit;
+    return nbin;
+}
+
+double MultiLayer::getLayerBottomZ(size_t i_layer) const
+{
+    return m_layers_z[ check_layer_index(i_layer) ];
+}
+
+double MultiLayer::getLayerThickness(size_t i_layer) const
+{
+    return m_layers[ check_layer_index(i_layer) ]->getThickness();
+}
+
+void MultiLayer::setCrossCorrLength(double crossCorrLength)
+{
+    if (crossCorrLength<0.0)
+        throw Exceptions::LogicErrorException("Attempt to set crossCorrLength to negative value");
+    m_crossCorrLength = crossCorrLength;
+}
diff --git a/Core/Multilayer/MultiLayer.h b/Core/Multilayer/MultiLayer.h
new file mode 100644
index 0000000..3eb2e24
--- /dev/null
+++ b/Core/Multilayer/MultiLayer.h
@@ -0,0 +1,154 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/MultiLayer.h
+//! @brief     Defines class MultiLayer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MULTILAYER_H
+#define MULTILAYER_H
+
+#include "ICompositeSample.h"
+#include "Vectors3D.h"
+
+class Layer;
+class LayerInterface;
+class LayerRoughness;
+
+//! Our sample model: a stack of layers one below the other.
+//! @ingroup samples
+
+//! Example of system of 4 layers (3 interfaces):
+//!
+//!  ambience    layer #0        z=getLayerBottomZ(0)=0.0
+//!  ---------   interface #0
+//!  Fe, 20A     layer #1        z=getLayerBottomZ(1)=-20.0
+//!  ---------   interface #1
+//!  Cr, 40A     layer #2        z=getLayerBottomZ(2)=-60.0
+//!  ---------   interface #2
+//!  substrate   layer #3        z=getLayerBottomZ(3)=-60.0
+
+
+class BA_CORE_API_ MultiLayer : public ICompositeSample
+{
+public:
+    MultiLayer();
+    virtual ~MultiLayer();
+
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    virtual std::string to_str(int indent=0) const;
+
+    size_t getNumberOfLayers() const { return m_layers.size(); }
+    size_t getNumberOfInterfaces() const { return m_interfaces.size(); }
+
+    //! Adds object to multilayer, overrides from ISample
+    void addLayer(const Layer& p_child);
+
+    //! Adds layer with top roughness
+    void addLayerWithTopRoughness(const Layer& layer, const LayerRoughness& roughness);
+
+    //! Returns layer with given index
+    const Layer* getLayer(size_t i_layer) const { return m_layers[check_layer_index(i_layer)]; }
+
+    //! Returns layer with given index
+    const LayerInterface* getLayerInterface(size_t i_interface) const {
+        return m_interfaces[check_interface_index(i_interface)]; }
+
+    //! Returns z-coordinate of the layer's bottom
+    double getLayerBottomZ(size_t i_layer) const;
+
+    //! Returns thickness of layer
+    double getLayerThickness(size_t i_layer) const;
+
+    //! Returns top interface of layer
+    const LayerInterface* getLayerTopInterface(size_t i_layer) const;
+
+    //! Returns bottom interface of layer
+    const LayerInterface* getLayerBottomInterface(size_t i_layer) const;
+
+    //! Destructs allocated objects
+    void clear();
+
+    //! Returns alone of multilayer with clones of all layers and recreated
+    //! interfaces between layers
+    virtual MultiLayer* clone() const;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual MultiLayer* cloneInvertB() const;
+
+    //! Sets cross correlation length of roughnesses between interfaces
+    void setCrossCorrLength(double crossCorrLength);
+
+    //! Returns cross correlation length of roughnesses between interfaces
+    double getCrossCorrLength() const { return m_crossCorrLength; }
+
+    ///! correlation function of roughnesses between the interfaces
+    //double getCrossCorrFun(const kvector_t k, int j, int k) const;
+
+    //! Fourier transform of the correlation function of roughnesses between
+    //! the interfaces
+    double getCrossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const;
+
+    //! Sets thickness of layer.
+    void setLayerThickness(size_t i_layer, double thickness); // TODO: remove this function!
+
+    //! Prints class
+    friend std::ostream& operator << (std::ostream& ostr, const MultiLayer& m) {
+        m.print(ostr); return ostr; }
+
+    //! returns layer index
+    int getIndexOfLayer(const Layer* layer) const;
+
+    //! returns true if contains magnetic materials and matrix calculations are required
+    bool requiresMatrixRTCoefficients() const;
+
+    //! returns layer index corresponding to given global z coordinate
+    size_t zToLayerIndex(double z_value);
+
+    bool containsMagneticMaterial() const;
+
+    bool hasRoughness() const;
+
+    size_t totalNofLayouts() const;
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    virtual void init_parameters();
+    //! Prints class
+    void print(std::ostream& ostr) const;
+
+private:
+    //! Adds the layer with simultaneous registration in parent class
+    void addAndRegisterLayer(Layer* child);
+
+    //! Adds the interface with simultaneous registration in parent class
+    void addAndRegisterInterface(LayerInterface* child);
+
+    void setNLayersInLayers() const;
+
+    //! Checks index of layer w.r.t. vector length
+    size_t check_layer_index(size_t i_layer) const;
+
+    //! Checks index of interface w.r.t. vector length
+    size_t check_interface_index(size_t i_interface) const;
+
+    //! stack of layers [nlayers]
+    std::vector<Layer*> m_layers;
+    //! coordinate of layer's bottoms [nlayers]
+    std::vector<double> m_layers_z;
+    //! stack of layer interfaces [nlayers-1]
+    std::vector<LayerInterface*> m_interfaces;
+    //! cross correlation length (in z direction) between different layers
+    double m_crossCorrLength;
+};
+
+#endif // MULTILAYER_H
diff --git a/Core/Multilayer/SSCApproximationStrategy.cpp b/Core/Multilayer/SSCApproximationStrategy.cpp
new file mode 100644
index 0000000..55e0d49
--- /dev/null
+++ b/Core/Multilayer/SSCApproximationStrategy.cpp
@@ -0,0 +1,154 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/SSCApproximationStrategy.cpp
+//! @brief     Implements classes SSCApproximationStrategy,
+//!              SSCApproximationStrategy1, SSCApproximationStrategy2.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SSCApproximationStrategy.h"
+#include "Exceptions.h"
+#include "FormFactorWrapper.h"
+#include "IFormFactor.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "RealParameter.h"
+#include "SimulationElement.h"
+
+// ************************************************************************** //
+//  class SSCApproximationStrategy
+// ************************************************************************** //
+
+SSCApproximationStrategy::SSCApproximationStrategy(double kappa)
+    : m_mean_radius(0.0), m_kappa(kappa)
+{}
+
+void SSCApproximationStrategy::strategy_specific_post_init()
+{
+    // Set m_mean_radius to the weighted arithmetic average of the particle radii.
+    m_mean_radius = 0.0;
+    for (const auto ffw: m_formfactor_wrappers)
+        m_mean_radius += ffw->m_abundance * ffw->mp_ff->getRadialExtension();
+    if (m_total_abundance > 0.0)
+        m_mean_radius /= m_total_abundance;
+}
+
+complex_t SSCApproximationStrategy::getCharacteristicDistribution(double qp) const
+{
+    const InterferenceFunctionRadialParaCrystal *p_iff
+        = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(mP_iff.get());
+    if (p_iff == 0)
+        throw Exceptions::ClassInitializationException("Wrong interference function for SSCA");
+    return p_iff->FTPDF(qp);
+}
+
+complex_t SSCApproximationStrategy::getCharacteristicSizeCoupling(double qp, double kappa) const
+{
+    size_t n_frs = m_formfactor_wrappers.size();
+    complex_t result = complex_t(0.0, 0.0);
+    for (size_t i = 0; i < n_frs; ++i)
+        result += m_formfactor_wrappers[i]->m_abundance *
+            calculatePositionOffsetPhase(qp, kappa, i);
+    return result / m_total_abundance;
+}
+
+complex_t SSCApproximationStrategy::calculatePositionOffsetPhase(
+    double qp, double kappa, size_t index) const
+{
+    return exp_I(kappa * qp *
+                 (m_formfactor_wrappers[index]->mp_ff->getRadialExtension() - m_mean_radius));
+}
+
+// ************************************************************************** //
+//  class SSCApproximationStrategy1
+// ************************************************************************** //
+
+//! Returns the total scattering intensity for given kf and
+//! for one layer (implied by the given particle form factors).
+//! For each IParticle in the layer layout, the precomputed form factor must be provided.
+double SSCApproximationStrategy1::evaluateForList(const SimulationElement& sim_element) const
+{
+    double qp = sim_element.getMeanQ().magxy();
+    double diffuse_intensity = 0.0;
+    if (m_total_abundance <= 0.0)
+        return 0.0;
+    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
+        complex_t ff = m_precomputed_ff1[i];
+        double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance;
+        diffuse_intensity += fraction * std::norm(ff);
+    }
+    complex_t mean_ff_norm  = getMeanFormfactorNorm(qp);
+    complex_t p2kappa = getCharacteristicSizeCoupling(qp, 2.0 * m_kappa);
+    complex_t omega = getCharacteristicDistribution(qp);
+    double interference_intensity = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real();
+    return m_total_abundance * (diffuse_intensity + interference_intensity);
+}
+
+complex_t SSCApproximationStrategy1::getMeanFormfactorNorm(double qp) const
+{
+    complex_t ff_orig=0., ff_conj=0.; // original and conjugated mean formfactor
+    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
+        complex_t prefac = m_formfactor_wrappers[i]->m_abundance
+            * calculatePositionOffsetPhase(qp, m_kappa, i);
+        ff_orig += prefac * m_precomputed_ff1[i];
+        ff_conj += prefac * std::conj(m_precomputed_ff1[i]);
+    }
+    return ff_orig * ff_conj / m_total_abundance / m_total_abundance;
+}
+
+// ************************************************************************** //
+//  class SSCApproximationStrategy2
+// ************************************************************************** //
+
+//! Returns the total scattering intensity for given kf and
+//! for one layer (implied by the given particle form factors).
+//! For each IParticle in the layer layout, the precomputed form factor must be provided.
+//! This is the polarized variant of evaluateForList. Each form factor must be
+//! precomputed for polarized beam and detector.
+double SSCApproximationStrategy2::evaluateForList(const SimulationElement& sim_element) const
+{
+    double qp = sim_element.getMeanQ().magxy();
+    Eigen::Matrix2cd diffuse_matrix = Eigen::Matrix2cd::Zero();
+    if (m_total_abundance <= 0.0)
+        return 0.0;
+    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
+        Eigen::Matrix2cd ff = m_precomputed_ff2[i];
+        double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance;
+        diffuse_matrix += fraction * (ff * sim_element.getPolarization() * ff.adjoint());
+    }
+    Eigen::Matrix2cd mff_orig, mff_conj; // original and conjugated mean formfactor
+    getMeanFormfactors(qp, mff_orig, mff_conj);
+    complex_t p2kappa = getCharacteristicSizeCoupling(qp, 2.0 * m_kappa);
+    complex_t omega = getCharacteristicDistribution(qp);
+    Eigen::Matrix2cd interference_matrix
+        = (2.0 * omega / (1.0 - p2kappa * omega))
+        * sim_element.getAnalyzerOperator() * mff_orig
+        * sim_element.getPolarization() * mff_conj;
+    Eigen::Matrix2cd diffuse_matrix2 = sim_element.getAnalyzerOperator() * diffuse_matrix;
+    double interference_trace = std::abs(interference_matrix.trace());
+    double diffuse_trace = std::abs(diffuse_matrix2.trace());
+    return m_total_abundance * (diffuse_trace + interference_trace);
+}
+
+//! Computes ff_orig and ff_conj.
+void SSCApproximationStrategy2::getMeanFormfactors(
+    double qp, Eigen::Matrix2cd& ff_orig, Eigen::Matrix2cd& ff_conj) const
+{
+    ff_orig=Eigen::Matrix2cd::Zero();
+    ff_conj=Eigen::Matrix2cd::Zero();
+    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
+        complex_t prefac = m_formfactor_wrappers[i]->m_abundance
+            * calculatePositionOffsetPhase(qp, m_kappa, i);
+        ff_orig += prefac * m_precomputed_ff2[i];
+        ff_conj += prefac * m_precomputed_ff2[i].adjoint();
+    }
+    ff_orig /= m_total_abundance;
+    ff_conj /= m_total_abundance;
+}
diff --git a/Core/Multilayer/SSCApproximationStrategy.h b/Core/Multilayer/SSCApproximationStrategy.h
new file mode 100644
index 0000000..4a6845c
--- /dev/null
+++ b/Core/Multilayer/SSCApproximationStrategy.h
@@ -0,0 +1,82 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/SSCApproximationStrategy.h
+//! @brief     Defines classes SSCApproximationStrategy,
+//!              SSCApproximationStrategy1, SSCApproximationStrategy2.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SSCAPPROXIMATIONSTRATEGY_H
+#define SSCAPPROXIMATIONSTRATEGY_H
+
+#include "IInterferenceFunctionStrategy.h"
+
+class SimulationElement;
+
+//! Virtual base class for SSCApproximationStrategy1 and SSCApproximationStrategy2,
+//! which compute the total scalar/polarized scattering from a decorated layer
+//! in size-spacing correlation approximation.
+//! @ingroup algorithms_internal
+
+class SSCApproximationStrategy : public virtual IInterferenceFunctionStrategy
+{
+public:
+    SSCApproximationStrategy(double kappa);
+
+protected:
+    complex_t calculatePositionOffsetPhase(double qp, double kappa, size_t index) const;
+    complex_t getCharacteristicDistribution(double qp) const;
+    complex_t getCharacteristicSizeCoupling(double qp, double kappa) const;
+
+    double m_mean_radius;
+    double m_kappa;
+
+private:
+    void strategy_specific_post_init() final;
+};
+
+
+//! Strategy class to compute the total scalar scattering from a decorated layer
+//! in size-spacing correlation approximation.
+//! @ingroup algorithms_internal
+
+class SSCApproximationStrategy1 final
+    : public IInterferenceFunctionStrategy1
+    , public SSCApproximationStrategy
+{
+public:
+    SSCApproximationStrategy1(SimulationOptions sim_params, double kappa)
+        : IInterferenceFunctionStrategy(sim_params), SSCApproximationStrategy(kappa) {}
+
+private:
+    double evaluateForList(const SimulationElement& sim_element) const final;
+    complex_t getMeanFormfactorNorm(double qp) const;
+};
+
+
+//! Strategy class to compute the total polarized scattering from a decorated layer
+//! in size-spacing correlation approximation.
+//! @ingroup algorithms_internal
+
+class SSCApproximationStrategy2 final
+    : public IInterferenceFunctionStrategy2
+    , public SSCApproximationStrategy
+{
+public:
+    SSCApproximationStrategy2(SimulationOptions sim_params, double kappa)
+        : IInterferenceFunctionStrategy(sim_params), SSCApproximationStrategy(kappa) {}
+
+private:
+    double evaluateForList(const SimulationElement& sim_element) const final;
+    void getMeanFormfactors(double qp, Eigen::Matrix2cd& ff_orig, Eigen::Matrix2cd& ff_conj) const;
+};
+
+#endif // SSCAPPROXIMATIONSTRATEGY_H
diff --git a/Core/Multilayer/ScalarRTCoefficients.h b/Core/Multilayer/ScalarRTCoefficients.h
new file mode 100644
index 0000000..aa1a319
--- /dev/null
+++ b/Core/Multilayer/ScalarRTCoefficients.h
@@ -0,0 +1,151 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/ScalarRTCoefficients.h
+//! @brief     Defines class ScalarRTCoefficients.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SCALARRTCOEFFICIENTS_H
+#define SCALARRTCOEFFICIENTS_H
+
+#include "ILayerRTCoefficients.h"
+#include "Complex.h"
+#include "EigenCore.h"
+
+//! @class ScalarRTCoefficients
+//! @ingroup algorithms_internal
+//! @brief Specular reflection and transmission coefficients in a layer in case
+//! of scalar interactions between the layers and the scattered particle
+
+class BA_CORE_API_ ScalarRTCoefficients : public ILayerRTCoefficients
+{
+public:
+    ScalarRTCoefficients();
+    virtual ~ScalarRTCoefficients() {}
+
+    virtual ScalarRTCoefficients* clone() const;
+
+    // The following functions return the transmitted and reflected amplitudes
+    // for different incoming beam polarizations and eigenmodes
+    virtual Eigen::Vector2cd T1plus() const;
+    virtual Eigen::Vector2cd R1plus() const;
+    virtual Eigen::Vector2cd T2plus() const;
+    virtual Eigen::Vector2cd R2plus() const;
+    virtual Eigen::Vector2cd T1min() const;
+    virtual Eigen::Vector2cd R1min() const;
+    virtual Eigen::Vector2cd T2min() const;
+    virtual Eigen::Vector2cd R2min() const;
+    //! Returns z-part of the two wavevector eigenmodes
+    virtual Eigen::Vector2cd getKz() const;
+
+    // Scalar value getters; these throw errors by default as they should only
+    // be used when the derived object is really scalar
+    virtual complex_t getScalarT() const;
+    virtual complex_t getScalarR() const;
+    virtual complex_t getScalarKz() const {
+        return kz;
+    }
+
+    //! Relative unsigned vertical wavevector component +-k_z/K
+
+    //! In the manual called f_l.
+    //! Computed as sqrt(n^2 - (k_parallel/K)^2).
+    //! The real part is always positive, hence it is propagating upwards.
+
+    complex_t lambda;
+
+    //! Signed vertical wavevector component k_z
+    complex_t kz;
+
+    //! Transmission and reflection coefficient
+
+    //! In the manual called A^{-} = t_r(0) and A^{+} = t_r(1).
+    //! Values of the transmitted/reflected (=down/up propagating) wavefunction
+    //! at top boundary of the layer (resp. at the bottom of the top air/vacuum layer).
+
+    Eigen::Vector2cd t_r;
+
+private:
+    Eigen::Vector2cd m_plus;
+    Eigen::Vector2cd m_min;
+};
+
+inline ScalarRTCoefficients::ScalarRTCoefficients()
+    : lambda(0), kz(0)
+{
+    m_plus(0) = 1.0;
+    m_plus(1) = 0.0;
+    m_min(0) = 0.0;
+    m_min(1) = 1.0;
+    t_r << complex_t(1.0, 0.0), complex_t(0.0, 0.0);
+}
+
+inline ScalarRTCoefficients *ScalarRTCoefficients::clone() const
+{
+    return new ScalarRTCoefficients(*this);
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::T1plus() const
+{
+    return Eigen::Vector2cd::Zero();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::R1plus() const
+{
+    return Eigen::Vector2cd::Zero();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::T2plus() const
+{
+    return m_plus * getScalarT();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::R2plus() const
+{
+    return m_plus * getScalarR();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::T1min() const
+{
+    return m_min * getScalarT();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::R1min() const
+{
+    return m_min * getScalarR();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::T2min() const
+{
+    return Eigen::Vector2cd::Zero();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::R2min() const
+{
+    return Eigen::Vector2cd::Zero();
+}
+
+inline Eigen::Vector2cd ScalarRTCoefficients::getKz() const
+{
+    return (m_plus+m_min) * kz;
+}
+
+inline complex_t ScalarRTCoefficients::getScalarR() const
+{
+    return t_r(1);
+}
+
+inline complex_t ScalarRTCoefficients::getScalarT() const
+{
+    return t_r(0);
+}
+
+#endif // SCALARRTCOEFFICIENTS_H
diff --git a/Core/Multilayer/ScalarSpecularInfoMap.cpp b/Core/Multilayer/ScalarSpecularInfoMap.cpp
new file mode 100644
index 0000000..b4dc5e2
--- /dev/null
+++ b/Core/Multilayer/ScalarSpecularInfoMap.cpp
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/ScalarSpecularInfoMap.cpp
+//! @brief     Implements class ScalarSpecularInfoMap.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ScalarSpecularInfoMap.h"
+#include "ISpecularInfoMap.h"
+#include "MultiLayer.h"
+#include "ScalarRTCoefficients.h"
+#include "SimulationElement.h"
+#include "SpecularMatrix.h"
+
+ScalarSpecularInfoMap::ScalarSpecularInfoMap(const MultiLayer* multilayer, int layer)
+    : mp_multilayer(multilayer)
+    , m_layer(layer)
+{}
+
+const ILayerRTCoefficients* ScalarSpecularInfoMap::getOutCoefficients(
+        const SimulationElement& sim_element) const
+{
+    return getCoefficients(-sim_element.getMeanKF());
+}
+
+const ILayerRTCoefficients* ScalarSpecularInfoMap::getInCoefficients(
+        const SimulationElement& sim_element) const
+{
+    return getCoefficients(sim_element.getKI());
+}
+
+const ScalarRTCoefficients* ScalarSpecularInfoMap::getCoefficients(kvector_t kvec) const
+{
+    SpecularMatrix::MultiLayerCoeff_t coeffs;
+    SpecularMatrix::execute(*mp_multilayer, kvec, coeffs);
+    auto layer_coeffs = coeffs[m_layer];
+    return new ScalarRTCoefficients(layer_coeffs);
+}
diff --git a/Core/Multilayer/ScalarSpecularInfoMap.h b/Core/Multilayer/ScalarSpecularInfoMap.h
new file mode 100644
index 0000000..36cd9cf
--- /dev/null
+++ b/Core/Multilayer/ScalarSpecularInfoMap.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/ScalarSpecularInfoMap.h
+//! @brief     Defines class ScalarSpecularInfoMap.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SCALARSPECULARINFOMAP_H
+#define SCALARSPECULARINFOMAP_H
+
+#include "ISpecularInfoMap.h"
+#include "Vectors3D.h"
+
+class MultiLayer;
+class ILayerRTCoefficients;
+class ScalarRTCoefficients;
+class SimulationElement;
+
+//! Implementation of ISpecularInfoMap for scalar valued reflection/transmission coefficients.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ ScalarSpecularInfoMap : public ISpecularInfoMap
+{
+public:
+    ScalarSpecularInfoMap(const MultiLayer* multilayer, int layer);
+    ~ScalarSpecularInfoMap() final {}
+
+    ScalarSpecularInfoMap* clone() const final {
+        return new ScalarSpecularInfoMap(mp_multilayer, m_layer); }
+
+    //! Retrieves the amplitude coefficients for the given angles
+    const ILayerRTCoefficients* getOutCoefficients (
+        const SimulationElement& sim_element) const final;
+
+    //! Retrieves the amplitude coefficients for the given angles
+    const ILayerRTCoefficients* getInCoefficients(
+        const SimulationElement& sim_element) const final;
+
+private:
+    const MultiLayer* mp_multilayer;
+    const int m_layer;
+    const ScalarRTCoefficients* getCoefficients(kvector_t kvec) const;
+};
+
+#endif // SCALARSPECULARINFOMAP_H
diff --git a/Core/Multilayer/SpecularMagnetic.cpp b/Core/Multilayer/SpecularMagnetic.cpp
new file mode 100644
index 0000000..2cc979c
--- /dev/null
+++ b/Core/Multilayer/SpecularMagnetic.cpp
@@ -0,0 +1,144 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/SpecularMagnetic.cpp
+//! @brief     Implements class SpecularMagnetic.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SpecularMagnetic.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "Materials.h"
+#include "MultiLayer.h"
+#include <Eigen/LU>
+
+static complex_t I(0.,1.);
+
+void SpecularMagnetic::execute(
+    const MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff)
+{
+    coeff.clear();
+    coeff.resize(sample.getNumberOfLayers());
+
+    calculateEigenvalues(sample, k, coeff);
+
+    calculateTransferAndBoundary(sample, k, coeff);
+}
+
+void SpecularMagnetic::calculateEigenvalues(
+    const MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff)
+{
+    double mag_k = k.mag();
+    double sign_kz = k.z() > 0.0 ? -1.0 : 1.0;
+    for(size_t i=0; i<coeff.size(); ++i) {
+        coeff[i].m_scatt_matrix = sample.getLayer(i)->getMaterial()->
+                getSpecularScatteringMatrix(k);
+        coeff[i].m_kt = mag_k*sample.getLayer(i)->getThickness();
+        coeff[i].m_a = coeff[i].m_scatt_matrix.trace()/2.0;
+        coeff[i].m_b_mag = sqrt(coeff[i].m_a*coeff[i].m_a -
+                (complex_t)coeff[i].m_scatt_matrix.determinant());
+        coeff[i].m_bz = ( coeff[i].m_scatt_matrix(0,0) -
+                coeff[i].m_scatt_matrix(1,1) )/2.0;
+        complex_t rad0 = coeff[i].m_a - coeff[i].m_b_mag;
+        complex_t rad1 = coeff[i].m_a + coeff[i].m_b_mag;
+        // use small absorptive component for layers with i>0 if radicand becomes very small:
+        if (i>0) {
+            if (std::abs(rad0)<1e-40) rad0 = I*1e-40;
+            if (std::abs(rad1)<1e-40) rad1 = I*1e-40;
+        }
+        coeff[i].lambda(0) = sqrt(rad0);
+        coeff[i].lambda(1) = sqrt(rad1);
+        coeff[i].kz = mag_k * coeff[i].lambda * sign_kz;
+    }
+}
+
+// todo: avoid overflows (see SpecularMatrix.cpp)
+void SpecularMagnetic::calculateTransferAndBoundary(
+    const MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff)
+{
+    (void)k;
+    size_t N = coeff.size();
+    if (coeff[0].lambda == Eigen::Vector2cd::Zero() && N>1) {
+        setForNoTransmission(coeff);
+        return;
+    }
+
+    // First, initialize bottom layer values to have no reflection
+    coeff[N-1].initializeBottomLayerPhiPsi();
+
+    coeff[0].calculateTRMatrices();
+    for (int i=(int)N-2; i>0; --i) {
+        double t = sample.getLayer(i)->getThickness();
+        coeff[i].calculateTRMatrices();
+        Eigen::Matrix4cd l =
+               coeff[i].R1m * getImExponential((complex_t)(coeff[i].kz(0)*t)) +
+               coeff[i].T1m * getImExponential((complex_t)(-coeff[i].kz(0)*t)) +
+               coeff[i].R2m * getImExponential((complex_t)(coeff[i].kz(1)*t)) +
+               coeff[i].T2m * getImExponential((complex_t)(-coeff[i].kz(1)*t));
+        coeff[i].phi_psi_plus = l * coeff[i+1].phi_psi_plus;
+        coeff[i].phi_psi_min = l * coeff[i+1].phi_psi_min;
+    }
+    // If more than one layer, impose normalization and correct correspondence
+    // for spin-z polarization in top layer
+    if (N>1) {
+        // First layer boundary is also top layer boundary:
+        coeff[0].phi_psi_plus = coeff[1].phi_psi_plus;
+        coeff[0].phi_psi_min = coeff[1].phi_psi_min;
+        // Normalize all boundary values such that top layer has unit wave
+        // amplitude for both spin up and down (and does not contain a
+        // transmitted wave amplitude for the opposite polarization)
+        Eigen::Vector2cd T0basisA = coeff[0].T1plus() + coeff[0].T2plus();
+        Eigen::Vector2cd T0basisB = coeff[0].T1min() + coeff[0].T2min();
+        complex_t cpA, cpB, cmA, cmB;
+        cpA = T0basisB(1);
+        cpB = -T0basisA(1);
+        cmA = T0basisB(0);
+        cmB = -T0basisA(0);
+        Eigen::Vector4cd phipsitemp = cpA * coeff[0].phi_psi_plus +
+                cpB * coeff[0].phi_psi_min;
+        coeff[0].phi_psi_min = cmA * coeff[0].phi_psi_plus +
+                cmB * coeff[0].phi_psi_min;
+        coeff[0].phi_psi_plus = phipsitemp;
+        Eigen::Vector2cd T0plusV = coeff[0].T1plus() + coeff[0].T2plus();
+        Eigen::Vector2cd T0minV = coeff[0].T1min() + coeff[0].T2min();
+        complex_t T0plus = T0plusV(0);
+        complex_t T0min = T0minV(1);
+        coeff[0].phi_psi_min = coeff[0].phi_psi_min / T0min;
+        coeff[0].phi_psi_plus = coeff[0].phi_psi_plus / T0plus;
+        for (size_t i=1; i<N; ++i) {
+            phipsitemp = ( cpA * coeff[i].phi_psi_plus +
+                    cpB * coeff[i].phi_psi_min ) / T0plus;
+            coeff[i].phi_psi_min = ( cmA * coeff[i].phi_psi_plus +
+                    cmB * coeff[i].phi_psi_min ) / T0min;
+            coeff[i].phi_psi_plus = phipsitemp;
+        }
+    }
+}
+
+void SpecularMagnetic::setForNoTransmission(MultiLayerCoeff_t& coeff)
+{
+    size_t N = coeff.size();
+    for (size_t i=0; i<N; ++i) {
+        coeff[i].phi_psi_plus.setZero();
+        coeff[i].phi_psi_min.setZero();
+        coeff[i].T1m = Eigen::Matrix4cd::Identity()/4.0;
+        coeff[i].R1m = coeff[i].T1m;
+        coeff[i].T2m = coeff[i].T1m;
+        coeff[i].R2m = coeff[i].T1m;
+    }
+}
+
+complex_t SpecularMagnetic::getImExponential(complex_t exponent)
+{
+    if (exponent.imag() > -std::log(std::numeric_limits<double>::min()) )
+        return 0.0;
+    return std::exp(I*exponent);
+}
diff --git a/Core/Multilayer/SpecularMagnetic.h b/Core/Multilayer/SpecularMagnetic.h
new file mode 100644
index 0000000..87bea20
--- /dev/null
+++ b/Core/Multilayer/SpecularMagnetic.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/SpecularMagnetic.h
+//! @brief     Defines class SpecularMagnetic.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPECULARMAGNETIC_H
+#define SPECULARMAGNETIC_H
+
+#include "MatrixRTCoefficients.h"
+#include "Vectors3D.h"
+#include <vector>
+
+//! Implements the matrix formalism for the calculation of wave amplitudes of
+//! the coherent wave solution in a multilayer with magnetization.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ SpecularMagnetic
+{
+public:
+    //! Layer coefficients describing refraction and reflection/transmission.
+    typedef std::vector<MatrixRTCoefficients> MultiLayerCoeff_t;
+
+    //! Computes refraction angle reflection/transmission coefficients
+    //! for given multilayer and wavevector k
+    static void execute(
+        const class MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff);
+
+private:
+    static void calculateEigenvalues(
+        const class MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff);
+    static void calculateTransferAndBoundary(
+        const MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff);
+    static void setForNoTransmission(MultiLayerCoeff_t& coeff);
+    static complex_t getImExponential(complex_t exponent);
+};
+
+#endif // SPECULARMAGNETIC_H
diff --git a/Core/Multilayer/SpecularMatrix.cpp b/Core/Multilayer/SpecularMatrix.cpp
new file mode 100644
index 0000000..9309096
--- /dev/null
+++ b/Core/Multilayer/SpecularMatrix.cpp
@@ -0,0 +1,139 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/SpecularMatrix.cpp
+//! @brief     Implements class SpecularMatrix.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SpecularMatrix.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "MathFunctions.h"
+#include "MultiLayer.h"
+#include "MathConstants.h"
+
+namespace {
+    const complex_t imag_unit = complex_t(0.0, 1.0);
+}
+
+void setZeroBelow(SpecularMatrix::MultiLayerCoeff_t& coeff, size_t current_layer);
+
+bool calculateUpFromLayer(SpecularMatrix::MultiLayerCoeff_t& coeff, const MultiLayer& sample,
+                          const kvector_t k, size_t layer_index);
+
+// Computes refraction angles and transmission/reflection coefficients
+// for given coherent wave propagation in a multilayer.
+// k : length: wavenumber in vacuum, direction: defined in layer 0
+// roughness is modelled by tanh profile (see e.g. Phys. Rev. B, vol. 47 (8), p. 4385 (1993) )
+
+void SpecularMatrix::execute(const MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff)
+{
+    size_t N = sample.getNumberOfLayers();
+    assert(N>0);
+    assert(N-1 == sample.getNumberOfInterfaces());
+    coeff.clear();
+    coeff.resize(N);
+
+    // Calculate refraction angle, expressed as lambda or k_z, for each layer.
+    double sign_kz_out = k.z() > 0.0 ? -1.0 : 1.0;
+    complex_t r2ref = sample.getLayer(0)->getRefractiveIndex2() * k.sin2Theta();
+    for(size_t i=0; i<N; ++i) {
+        complex_t rad = sample.getLayer(i)->getRefractiveIndex2() - r2ref;
+        // use small absorptive component for layers with i>0 if radicand becomes very small:
+        if (i>0 && std::abs(rad)<1e-40) rad = imag_unit*1e-40;
+        coeff[i].lambda = sqrt(rad);
+        coeff[i].kz = sign_kz_out * k.mag()*coeff[i].lambda;
+    }
+    // In the bottom layer, there is no upward travelling wave.
+    coeff[N-1].t_r(0) = 1.0;
+    coeff[N-1].t_r(1) = 0.0;
+
+    // If only one layer present, there's nothing left to calculate
+    if( N==1) return;
+
+    // If lambda in layer 0 is zero, R0 = -T0 and all other R, T coefficients become zero
+    if (coeff[0].lambda == 0.0) {
+        coeff[0].t_r(0) = 1.0;
+        coeff[0].t_r(1) = -1.0;
+        setZeroBelow(coeff, 0);
+        return;
+    }
+    // Calculate transmission/refraction coefficients t_r for each layer,
+    // from bottom to top.
+    size_t start_layer_index = N-2;
+    while (!calculateUpFromLayer(coeff, sample, k, start_layer_index)) {
+        setZeroBelow(coeff, start_layer_index);
+        coeff[start_layer_index].t_r(0) = 1.0;
+        coeff[start_layer_index].t_r(1) = 0.0;
+        --start_layer_index;
+    }
+
+    // Normalize to incoming downward travelling amplitude = 1.
+    complex_t T0 = coeff[0].getScalarT();
+    // This trick is used to avoid overflows in the intermediate steps of
+    // complex division:
+    double tmax = std::max(std::abs(T0.real()), std::abs(T0.imag()));
+    for (size_t i=0; i<N; ++i) {
+        coeff[i].t_r(0) /= tmax;
+        coeff[i].t_r(1) /= tmax;
+    }
+    // Now the real normalization to T_0 proceeds
+    T0 = coeff[0].getScalarT();
+    for (size_t i=0; i<N; ++i) {
+        coeff[i].t_r = coeff[i].t_r/T0;
+    }
+}
+
+void setZeroBelow(SpecularMatrix::MultiLayerCoeff_t& coeff, size_t current_layer)
+{
+    size_t N = coeff.size();
+    for (size_t i=current_layer+1; i<N; ++i) {
+        coeff[i].t_r.setZero();
+    }
+}
+
+bool calculateUpFromLayer(SpecularMatrix::MultiLayerCoeff_t& coeff, const MultiLayer& sample,
+                          const kvector_t k, size_t layer_index)
+{
+    for (int i=layer_index; i>=0; --i) {
+        complex_t roughness_factor = 1;
+        if (sample.getLayerInterface(i)->getRoughness()) {
+            double sigma = sample.getLayerBottomInterface(i)->getRoughness()->getSigma();
+            if(sigma > 0.0) {
+                // since there is a roughness, compute one diagonal matrix element p00;
+                // the other element is p11 = 1/p00.
+                double sigeff = std::pow(M_PI_2, 1.5)*sigma*k.mag();
+                roughness_factor = sqrt(
+                            MathFunctions::tanhc(sigeff*coeff[i+1].lambda) /
+                            MathFunctions::tanhc(sigeff*coeff[i  ].lambda) );
+            }
+        }
+        complex_t lambda = coeff[i].lambda;
+
+        complex_t lambda_rough = coeff[i  ].lambda / roughness_factor;
+        complex_t lambda_below = coeff[i+1].lambda * roughness_factor;
+        complex_t ikd = imag_unit * k.mag() * sample.getLayer(i)->getThickness();
+        coeff[i].t_r(0) = (
+                    (lambda_rough+lambda_below)*coeff[i+1].t_r(0) +
+                    (lambda_rough-lambda_below)*coeff[i+1].t_r(1) )/2.0/lambda *
+                    std::exp(-ikd*lambda);
+        coeff[i].t_r(1) = (
+                    (lambda_rough-lambda_below)*coeff[i+1].t_r(0) +
+                    (lambda_rough+lambda_below)*coeff[i+1].t_r(1) )/2.0/lambda *
+                    std::exp( ikd*lambda);
+        // If T overflowed, return false, so the calculation can restart from a layer higher
+        if (std::isinf(std::abs(coeff[i].getScalarT()))) {
+            return false;
+        }
+    }
+    return true;
+}
diff --git a/Core/Multilayer/SpecularMatrix.h b/Core/Multilayer/SpecularMatrix.h
new file mode 100644
index 0000000..75ae0ad
--- /dev/null
+++ b/Core/Multilayer/SpecularMatrix.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Multilayer/SpecularMatrix.h
+//! @brief     Defines class SpecularMatrix.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPECULARMATRIX_H
+#define SPECULARMATRIX_H
+
+#include "ScalarRTCoefficients.h"
+#include "Vectors3D.h"
+#include <vector>
+
+//! Implements method 'execute' to compute refraction angles and transmission/reflection
+//! coefficients for coherent wave propagation in a multilayer.
+//! @ingroup algorithms_internal
+
+class BA_CORE_API_ SpecularMatrix
+{
+public:
+    //! Layer coefficients describing refraction and transmission/reflection.
+    typedef std::vector<ScalarRTCoefficients> MultiLayerCoeff_t;
+
+    //! Computes refraction angles and transmission/reflection coefficients
+    //! for given coherent wave propagation in a multilayer.
+    static void execute(
+        const class MultiLayer& sample, const kvector_t k, MultiLayerCoeff_t& coeff);
+};
+
+#endif // SPECULARMATRIX_H
diff --git a/Core/Parametrization/DistributionHandler.cpp b/Core/Parametrization/DistributionHandler.cpp
new file mode 100644
index 0000000..0834daa
--- /dev/null
+++ b/Core/Parametrization/DistributionHandler.cpp
@@ -0,0 +1,86 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/DistributionHandler.cpp
+//! @brief     Implements class DistributionHandler.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "DistributionHandler.h"
+#include "Exceptions.h"
+#include "ParameterPool.h"
+#include "ParameterSample.h"
+
+DistributionHandler::DistributionHandler()
+: m_nbr_combinations(1)
+{
+    setName("DistributionHandler");
+}
+
+DistributionHandler::~DistributionHandler()
+{
+}
+
+void DistributionHandler::addParameterDistribution(
+    const std::string& param_name, const IDistribution1D& distribution,
+    size_t nbr_samples, double sigma_factor, const RealLimits& limits)
+{
+    if (nbr_samples > 0) {
+        ParameterDistribution par_distr(
+            param_name, distribution, nbr_samples, sigma_factor, limits);
+        addParameterDistribution(par_distr);
+    }
+}
+
+void DistributionHandler::addParameterDistribution(const ParameterDistribution& par_distr)
+{
+    if(par_distr.getNbrSamples() > 0) {
+        m_distributions.push_back(par_distr);
+        m_nbr_combinations *= par_distr.getNbrSamples();
+        m_cached_samples.push_back(par_distr.generateSamples());
+    }
+}
+
+size_t DistributionHandler::getTotalNumberOfSamples() const
+{
+    return m_nbr_combinations;
+}
+
+double DistributionHandler::setParameterValues(ParameterPool* p_parameter_pool, size_t index)
+{
+    if (index >= m_nbr_combinations)
+        throw Exceptions::RuntimeErrorException(
+                "DistributionWeighter::setParameterValues: "
+                "index must be smaller than the total number of parameter combinations");
+    size_t n_distr = m_distributions.size();
+    double weight = 1.0;
+    if (n_distr == 0) return weight;
+    for (size_t param_index=n_distr-1; ; --param_index) {
+        size_t remainder = index % m_distributions[param_index].getNbrSamples();
+        index /= m_distributions[param_index].getNbrSamples();
+        int changed = p_parameter_pool->setMatchedParametersValue(
+                m_distributions[param_index].getMainParameterName(),
+                m_cached_samples[param_index][remainder].value);
+        if (changed != 1) {
+            throw Exceptions::RuntimeErrorException(
+                    "DistributionWeighter::setParameterValues: "
+                    "parameter name matches nothing or more than "
+                    "one parameter");
+        }
+        weight *= m_cached_samples[param_index][remainder].weight;
+        if (param_index==0) break;
+    }
+    return weight;
+}
+
+const DistributionHandler::Distributions_t& DistributionHandler::getDistributions() const
+{
+    return m_distributions;
+}
diff --git a/Core/Parametrization/DistributionHandler.h b/Core/Parametrization/DistributionHandler.h
new file mode 100644
index 0000000..4704d8f
--- /dev/null
+++ b/Core/Parametrization/DistributionHandler.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/DistributionHandler.h
+//! @brief     Defines class DistributionHandler.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DISTRIBUTIONHANDLER_H
+#define DISTRIBUTIONHANDLER_H
+
+#include "ParameterDistribution.h"
+#include <vector>
+
+//! Provides the functionality to average over parameter distributions with weights.
+
+//! @ingroup algorithms_internal
+class BA_CORE_API_ DistributionHandler : public IParameterized
+{
+public:
+    typedef std::vector<ParameterDistribution> Distributions_t;
+    DistributionHandler();
+    virtual ~DistributionHandler();
+
+    //! add a sampled parameter distribution
+    void addParameterDistribution(const std::string &param_name,
+            const IDistribution1D &distribution, size_t nbr_samples,
+            double sigma_factor=0.0,
+            const RealLimits &limits=RealLimits());
+
+    void addParameterDistribution(const ParameterDistribution &par_distr);
+
+    //! get the total number of parameter value combinations (product
+    //! of the individual sizes of each parameter distribution
+    size_t getTotalNumberOfSamples() const;
+
+    //! set the parameter values of the simulation object to a specific
+    //! combination of values, determined by the index (which must be smaller
+    //! than the total number of combinations) and returns the weight
+    //! associated with this combination of parameter values
+    double setParameterValues(ParameterPool *p_parameter_pool, size_t index);
+
+    const Distributions_t& getDistributions() const;
+private:
+    size_t m_nbr_combinations;
+    Distributions_t m_distributions;
+    std::vector<std::vector<ParameterSample> > m_cached_samples;
+};
+
+#endif // DISTRIBUTIONHANDLER_H
diff --git a/Core/Parametrization/Distributions.cpp b/Core/Parametrization/Distributions.cpp
new file mode 100644
index 0000000..79e23f5
--- /dev/null
+++ b/Core/Parametrization/Distributions.cpp
@@ -0,0 +1,403 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/Distributions.cpp
+//! @brief     Implements classes representing distributions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Distributions.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathConstants.h"
+#include <cmath>
+#include <sstream>
+
+using namespace BornAgain;
+
+IDistribution1D* IDistribution1D::clone() const
+{
+    throw Exceptions::NotImplementedException("IDistribution1D cannot be cloned");
+}
+
+std::vector<ParameterSample> IDistribution1D::generateSamples(
+    size_t nbr_samples, double sigma_factor, const RealLimits &limits) const
+{
+    if (nbr_samples == 0)
+        throw Exceptions::OutOfBoundsException("IDistribution1D::generateSamples: number "
+                                   "of generated samples must be bigger than zero");
+    if (isDelta()) {
+        std::vector<ParameterSample> result = { getMeanSample() };
+        return result;
+    }
+    std::vector<double> sample_values = generateValueList( nbr_samples, sigma_factor, limits);
+    return generateSamplesFromValues(sample_values);
+}
+
+std::vector<ParameterSample> IDistribution1D::generateSamples(
+    size_t nbr_samples, double xmin, double xmax) const
+{
+    if (nbr_samples == 0)
+        throw Exceptions::OutOfBoundsException("IDistribution1D::generateSamples: number "
+                                   "of generated samples must be bigger than zero");
+    if (isDelta()) {
+        std::vector<ParameterSample> result = { getMeanSample() };
+        return result;
+    }
+    std::vector<double> sample_values = generateValues(nbr_samples, xmin, xmax);
+    return generateSamplesFromValues(sample_values);
+}
+
+//! Interface
+std::vector<double> IDistribution1D::generateValues(
+    size_t nbr_samples, double xmin, double xmax) const
+{
+    std::vector<double> result;
+    if (nbr_samples < 2 || xmin == xmax) {
+        result.push_back(getMean());
+    } else {
+        result.resize(nbr_samples);
+        for (size_t i=0; i<nbr_samples; ++i) {
+            result[i] = xmin + i*(xmax-xmin)/(nbr_samples-1.0);
+        }
+    }
+    return result;
+}
+
+ParameterSample IDistribution1D::getMeanSample() const
+{
+    ParameterSample result;
+    result.value = getMean();
+    result.weight = 1.0;
+    return result;
+}
+
+void IDistribution1D::SignalBadInitialization(std::string distribution_name)
+{
+    throw Exceptions::ClassInitializationException(
+        distribution_name +": not correctly initialized");
+}
+
+void IDistribution1D::adjustMinMaxForLimits(
+    double &xmin, double &xmax, const RealLimits &limits) const
+{
+    if(limits.hasLowerLimit() && xmin < limits.getLowerLimit()) xmin = limits.getLowerLimit();
+    if(limits.hasUpperLimit() && xmax > limits.getUpperLimit()) xmax = limits.getUpperLimit();
+    if(xmin > xmax) {
+        std::ostringstream ostr;
+        ostr << "IDistribution1D::adjustMinMaxForLimits() -> Error. Can't' adjust ";
+        ostr << "xmin:" << xmin << " xmax:" << xmax << " for given limits " << limits << std::endl;
+        throw Exceptions::DomainErrorException(ostr.str());
+    }
+}
+
+std::vector<ParameterSample> IDistribution1D::generateSamplesFromValues(
+    const std::vector<double> &sample_values) const
+{
+    std::vector<ParameterSample> result;
+    result.resize(sample_values.size());
+    double norm_factor = 0.0;
+    for (size_t i=0; i<sample_values.size(); ++i) {
+        double pdf = probabilityDensity(sample_values[i]);
+        result[i].value = sample_values[i];
+        result[i].weight = pdf;
+        norm_factor += pdf;
+    }
+    if (norm_factor <= 0.0)
+        throw Exceptions::RuntimeErrorException("IDistribution1D::generateSamples: "
+                                    "total probability must be bigger than zero");
+    for (size_t i=0; i<sample_values.size(); ++i) {
+        result[i].weight /= norm_factor;
+    }
+    return result;
+}
+
+// ---------------------------------------------------------------------------------------------- //
+
+DistributionGate::DistributionGate() : m_min(0.0), m_max(1.0)
+{
+    setName(DistributionGateType);
+    checkInitialization();
+    init_parameters();
+}
+
+DistributionGate::DistributionGate(double min, double max) : m_min(min), m_max(max)
+{
+    setName(DistributionGateType);
+    checkInitialization();
+    init_parameters();
+}
+
+double DistributionGate::probabilityDensity(double x) const
+{
+    if (x < m_min || x > m_max) return 0.0;
+    if (m_min == m_max) return 1.0;
+    return 1.0/(m_max-m_min);
+}
+
+std::vector<double> DistributionGate::generateValueList(size_t nbr_samples,
+        double sigma_factor, const RealLimits &limits) const
+{
+    (void)sigma_factor;
+    (void)limits;
+    return generateValues(nbr_samples, m_min, m_max);
+}
+
+void DistributionGate::init_parameters()
+{
+    registerParameter(Minimum, &m_min);
+    registerParameter(Maximum, &m_max);
+}
+
+bool DistributionGate::isDelta() const
+{
+    return m_max == m_min;
+}
+
+bool DistributionGate::checkInitialization() const
+{
+    bool result = true;
+    if (m_max < m_min) result = false;
+    if (!result) SignalBadInitialization(DistributionGateType);
+    return result;
+}
+
+// ---------------------------------------------------------------------------------------------- //
+
+DistributionLorentz::DistributionLorentz() : m_mean(0.0), m_hwhm(1.0)
+{
+    setName(DistributionLorentzType);
+    checkInitialization();
+    init_parameters();
+}
+
+DistributionLorentz::DistributionLorentz(double mean, double hwhm) : m_mean(mean), m_hwhm(hwhm)
+{
+    setName(DistributionLorentzType);
+    checkInitialization();
+    init_parameters();
+}
+
+double DistributionLorentz::probabilityDensity(double x) const
+{
+    if (m_hwhm == 0.0) return x==m_mean ? 1.0 : 0.0;
+    return m_hwhm/(m_hwhm*m_hwhm + (x-m_mean)*(x-m_mean))/M_PI;
+}
+
+std::vector<double> DistributionLorentz::generateValueList(size_t nbr_samples,
+        double sigma_factor, const RealLimits &limits) const
+{
+    if (sigma_factor <= 0.0) sigma_factor = 2.0;
+    double xmin = m_mean - sigma_factor*m_hwhm;
+    double xmax = m_mean + sigma_factor*m_hwhm;
+    adjustMinMaxForLimits(xmin, xmax, limits);
+    return generateValues(nbr_samples, xmin, xmax);
+}
+
+void DistributionLorentz::init_parameters()
+{
+    registerParameter(Mean, &m_mean);
+    registerParameter(HWHM, &m_hwhm);
+}
+
+bool DistributionLorentz::isDelta() const
+{
+    return m_hwhm == 0.0;
+}
+
+bool DistributionLorentz::checkInitialization() const
+{
+    bool result = true;
+    if (m_hwhm < 0.0) result = false;
+    if (!result) SignalBadInitialization(DistributionLorentzType);
+    return result;
+}
+
+// ---------------------------------------------------------------------------------------------- //
+
+DistributionGaussian::DistributionGaussian()
+    : m_mean(0.0)
+    , m_std_dev(1.0)
+{
+    setName(DistributionGaussianType);
+    checkInitialization();
+    init_parameters();
+}
+
+DistributionGaussian::DistributionGaussian(double mean, double std_dev)
+    : m_mean(mean)
+    , m_std_dev(std_dev)
+{
+    setName(DistributionGaussianType);
+    checkInitialization();
+    init_parameters();
+}
+
+double DistributionGaussian::probabilityDensity(double x) const
+{
+    if (m_std_dev == 0.0) return x==m_mean ? 1.0 : 0.0;
+    double exponential = std::exp(-(x-m_mean)*(x-m_mean)
+            /(2.0*m_std_dev*m_std_dev));
+    return exponential/m_std_dev/std::sqrt(M_TWOPI);
+}
+
+std::vector<double> DistributionGaussian::generateValueList(size_t nbr_samples,
+        double sigma_factor, const RealLimits &limits) const
+{
+    if (sigma_factor <= 0.0) sigma_factor = 2.0;
+    double xmin = m_mean - sigma_factor*m_std_dev;
+    double xmax = m_mean + sigma_factor*m_std_dev;
+    adjustMinMaxForLimits(xmin, xmax, limits);
+    return generateValues(nbr_samples, xmin, xmax);
+}
+
+void DistributionGaussian::init_parameters()
+{
+    registerParameter(Mean, &m_mean);
+    registerParameter(StdDeviation, &m_std_dev);
+}
+
+bool DistributionGaussian::isDelta() const
+{
+    return m_std_dev == 0.0;
+}
+
+bool DistributionGaussian::checkInitialization() const
+{
+    bool result = true;
+    if (m_std_dev < 0.0) result = false;
+    if (!result) SignalBadInitialization(DistributionGaussianType);
+    return result;
+}
+
+// ---------------------------------------------------------------------------------------------- //
+
+DistributionLogNormal::DistributionLogNormal(double scale_param)
+    : m_median(1.0)
+    , m_scale_param(scale_param)
+{
+    setName(DistributionLogNormalType);
+    checkInitialization();
+    init_parameters();
+}
+
+DistributionLogNormal::DistributionLogNormal(double median, double scale_param)
+    : m_median(median)
+    , m_scale_param(scale_param)
+{
+    setName(DistributionLogNormalType);
+    checkInitialization();
+    init_parameters();
+}
+
+double DistributionLogNormal::probabilityDensity(double x) const
+{
+    if (m_scale_param==0.0) return x==m_median ? 1.0 : 0.0;
+    double t = std::log(x/m_median)/m_scale_param;
+    return std::exp(-t*t/2.0)/(x*m_scale_param*std::sqrt(M_TWOPI));
+}
+
+double DistributionLogNormal::getMean() const
+{
+    double exponent = m_scale_param*m_scale_param/2.0;
+    return m_median*std::exp(exponent);
+}
+
+std::vector<double> DistributionLogNormal::generateValueList(size_t nbr_samples,
+        double sigma_factor, const RealLimits &limits) const
+{
+    if(nbr_samples < 2) {
+        std::vector<double> result;
+        result.push_back(m_median);
+        return result;
+    } else {
+        if (sigma_factor <= 0.0) sigma_factor = 2.0;
+        double xmin = m_median*std::exp(-sigma_factor*m_scale_param);
+        double xmax = m_median*std::exp(sigma_factor*m_scale_param);
+        adjustMinMaxForLimits(xmin, xmax, limits);
+        return generateValues(nbr_samples, xmin, xmax);
+    }
+}
+
+void DistributionLogNormal::init_parameters()
+{
+    registerParameter(Median, &m_median);
+    registerParameter(ScaleParameter, &m_scale_param);
+}
+
+bool DistributionLogNormal::isDelta() const
+{
+    return m_scale_param == 0.0;
+}
+
+bool DistributionLogNormal::checkInitialization() const
+{
+    bool result = true;
+    if (m_scale_param < 0.0) result = false;
+    if (m_median <= 0.0) result = false;
+    if (!result) SignalBadInitialization(DistributionLogNormalType);
+    return result;
+}
+
+// ---------------------------------------------------------------------------------------------- //
+
+DistributionCosine::DistributionCosine()
+    : m_mean(0.0)
+    , m_sigma(1.0)
+{
+    setName(DistributionCosineType);
+    checkInitialization();
+    init_parameters();
+}
+
+DistributionCosine::DistributionCosine(double mean, double sigma)
+    : m_mean(mean)
+    , m_sigma(sigma)
+{
+    setName(DistributionCosineType);
+    checkInitialization();
+    init_parameters();
+}
+
+double DistributionCosine::probabilityDensity(double x) const
+{
+    if (m_sigma == 0.0) return x==m_mean ? 1.0 : 0.0;
+    if (std::abs(x-m_mean)>M_PI*m_sigma) return 0.0;
+    return (1.0 + std::cos((x-m_mean)/m_sigma))/(m_sigma*M_TWOPI);
+}
+
+std::vector<double> DistributionCosine::generateValueList(size_t nbr_samples,
+        double sigma_factor, const RealLimits &limits) const
+{
+    if (sigma_factor <= 0.0 || sigma_factor > 2.0) sigma_factor = 2.0;
+    double xmin = m_mean - sigma_factor*m_sigma*M_PI_2;
+    double xmax = m_mean + sigma_factor*m_sigma*M_PI_2;
+    adjustMinMaxForLimits(xmin, xmax, limits);
+    return generateValues(nbr_samples, xmin, xmax);
+}
+
+void DistributionCosine::init_parameters()
+{
+    registerParameter(Mean, &m_mean);
+    registerParameter(Sigma, &m_sigma);
+}
+
+bool DistributionCosine::isDelta() const
+{
+    return m_sigma == 0.0;
+}
+
+bool DistributionCosine::checkInitialization() const
+{
+    bool result = true;
+    if (m_sigma < 0.0) result = false;
+    if (!result) SignalBadInitialization(DistributionCosineType);
+    return result;
+}
diff --git a/Core/Parametrization/Distributions.h b/Core/Parametrization/Distributions.h
new file mode 100644
index 0000000..a91b96a
--- /dev/null
+++ b/Core/Parametrization/Distributions.h
@@ -0,0 +1,293 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/Distributions.h
+//! @brief     Defines classes representing distributions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DISTRIBUTIONS_H
+#define DISTRIBUTIONS_H
+
+#include "IParameterized.h"
+#include "RealLimits.h"
+#include "ParameterSample.h"
+#include <vector>
+
+//! Interface for 1 dimensional distributions.
+//! @ingroup distribution_internal
+
+class BA_CORE_API_ IDistribution1D : public IParameterized
+{
+public:
+    IDistribution1D() {}
+    virtual ~IDistribution1D() {}
+
+    virtual IDistribution1D* clone() const;
+
+    //! get the probability density for value x
+    virtual double probabilityDensity(double x) const=0;
+
+    //! get the mean of the distribution
+    virtual double getMean() const=0;
+
+    //! generate list of sampled values with their weight
+    //! xmin, xmax for sample generations are deduced from sigma_factor and possible limits
+    std::vector<ParameterSample> generateSamples(
+        size_t nbr_samples, double sigma_factor=0.0, const RealLimits& limits = RealLimits()) const;
+
+    //! generate list of sampled values with their weight within given xmin, xmax
+    std::vector<ParameterSample> generateSamples(
+        size_t nbr_samples, double xmin, double xmax) const;
+
+    //! generate list of sample values
+    //! @param nbr_samples number of values to generate
+    //! @param sigma_factor parameter to derive min,max range for sample values
+    //! @param limits
+    //! @return vector of generated values
+    virtual std::vector<double> generateValueList(size_t nbr_samples,
+            double sigma_factor, const RealLimits& limits = RealLimits()) const=0;
+
+    //! generate list of sample values
+    //! @param nbr_samples number of values to generate
+    //! @param xmin, xmax start and end value of the generated samples
+    //! @return vector of generated values
+    virtual std::vector<double> generateValues(size_t nbr_samples, double xmin, double xmax) const;
+
+    //! generate a single sample containing the mean value and weight 1
+    ParameterSample getMeanSample() const;
+
+    //! signals that the distribution is in the limit case of a delta distribution
+    virtual bool isDelta() const=0;
+
+protected:
+    //! this function is called during bad initialization of a subclass
+    static void SignalBadInitialization(std::string distribution_name);
+
+    //! modifies xmin and xmax if they are outside of limits
+    void adjustMinMaxForLimits(double& xmin, double& xmax, const RealLimits& limits) const;
+
+    //! generate list of sampled values with their weight from value list
+    std::vector<ParameterSample> generateSamplesFromValues(
+        const std::vector<double>& sample_values) const;
+};
+
+
+//! Uniform distribution function with half width hwhm.
+//! @ingroup paramDistribution
+class BA_CORE_API_ DistributionGate : public IDistribution1D
+{
+public:
+    DistributionGate();
+    DistributionGate(double min, double max);
+    virtual ~DistributionGate() {}
+
+    //! clone method
+    virtual DistributionGate* clone() const { return new DistributionGate(m_min, m_max); }
+
+    //! get the probability density for value x
+    virtual double probabilityDensity(double x) const;
+
+    //! get the mean of the distribution
+    virtual double getMean() const { return (m_min+m_max)/2.0; }
+
+    //! Returns the minimum value of the distribution
+    double getMin() const { return m_min; }
+
+    //! Returns the maximum value of the distribution
+    double getMax() const { return m_max; }
+
+    //! Returns list of sample values
+    virtual std::vector<double> generateValueList(
+        size_t nbr_samples, double sigma_factor, const RealLimits& limits = RealLimits()) const;
+
+    //! signals that the distribution is in the limit case of a delta distribution
+    virtual bool isDelta() const;
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    void init_parameters();
+
+private:
+    //! check initialization
+    bool checkInitialization() const;
+    double m_min;
+    double m_max;
+};
+
+
+//! Lorentz distribution with half width hwhm.
+//! @ingroup paramDistribution
+
+class BA_CORE_API_ DistributionLorentz : public IDistribution1D
+{
+public:
+    DistributionLorentz();
+    DistributionLorentz(double mean, double hwhm);
+    virtual ~DistributionLorentz() {}
+
+    virtual DistributionLorentz* clone() const { return new DistributionLorentz(m_mean, m_hwhm); }
+
+    //! get the probability density for value x
+    virtual double probabilityDensity(double x) const;
+
+    //! Returns the mean of the distribution
+    virtual double getMean() const { return m_mean; }
+
+    //! Returns the half width at half maximum
+    double getHWHM() const { return m_hwhm; }
+
+    //! generate list of sample values
+    virtual std::vector<double> generateValueList(
+        size_t nbr_samples, double sigma_factor, const RealLimits& limits = RealLimits()) const;
+
+    //! signals that the distribution is in the limit case of a delta distribution
+    virtual bool isDelta() const;
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    void init_parameters();
+
+private:
+    //! check initialization
+    bool checkInitialization() const;
+    double m_mean;
+    double m_hwhm;
+};
+
+
+//! Gaussian distribution with standard deviation std_dev.
+//! @ingroup paramDistribution
+
+class BA_CORE_API_ DistributionGaussian: public IDistribution1D
+{
+public:
+    DistributionGaussian();
+    DistributionGaussian(double mean, double std_dev);
+    virtual ~DistributionGaussian() {}
+
+    //! clone method
+    virtual DistributionGaussian* clone() const {
+        return new DistributionGaussian(m_mean, m_std_dev); }
+
+    //! get the probability density for value x
+    virtual double probabilityDensity(double x) const;
+
+    //! Returns the mean of the distribution
+    virtual double getMean() const { return m_mean; }
+
+    //! Returns the standard deviation
+    double getStdDev() const { return m_std_dev; }
+
+    //! generate list of sample values
+    virtual std::vector<double> generateValueList(size_t nbr_samples,
+            double sigma_factor, const RealLimits& limits = RealLimits()) const;
+
+    //! signals that the distribution is in the limit case of a delta distribution
+    virtual bool isDelta() const;
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    void init_parameters();
+
+private:
+    //! check initialization
+    bool checkInitialization() const;
+    double m_mean;
+    double m_std_dev;
+};
+
+
+//! Log-normal distribution.
+//! @ingroup paramDistribution
+
+class BA_CORE_API_ DistributionLogNormal: public IDistribution1D
+{
+public:
+    DistributionLogNormal(double scale_param);
+    DistributionLogNormal(double median, double scale_param);
+    virtual ~DistributionLogNormal() {}
+
+    //! clone method
+    virtual DistributionLogNormal* clone() const {
+        return new DistributionLogNormal(m_median, m_scale_param); }
+
+    //! get the probability density for value x
+    virtual double probabilityDensity(double x) const;
+
+    //! get the mean of the distribution
+    virtual double getMean() const;
+
+    //! Returns the median of the distribution
+    double getMedian() const { return m_median; }
+
+    //! Returns the scale parameter of the distribution
+    double getScalePar() const { return m_scale_param; }
+
+    //! generate list of sample values
+    virtual std::vector<double> generateValueList(
+        size_t nbr_samples, double sigma_factor, const RealLimits& limits = RealLimits()) const;
+
+    //! signals that the distribution is in the limit case of a delta distribution
+    virtual bool isDelta() const;
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    void init_parameters();
+
+private:
+    //! check initialization
+    bool checkInitialization() const;
+    double m_median;
+    double m_scale_param;
+};
+
+
+//! Cosine distribution.
+//! @ingroup paramDistribution
+
+class BA_CORE_API_ DistributionCosine: public IDistribution1D
+{
+public:
+    DistributionCosine();
+    DistributionCosine(double mean, double sigma);
+    virtual ~DistributionCosine() {}
+
+    //! clone method
+    virtual DistributionCosine* clone() const { return new DistributionCosine(m_mean, m_sigma); }
+
+    //! get the probability density for value x
+    virtual double probabilityDensity(double x) const;
+
+    //! Returns the mean of the distribution
+    virtual double getMean() const { return m_mean; }
+
+    //! Returns the sigma parameter of the distribution
+    double getSigma() const { return m_sigma; }
+
+    //! generate list of sample values
+    virtual std::vector<double> generateValueList(
+        size_t nbr_samples, double sigma_factor, const RealLimits& limits = RealLimits()) const;
+
+    //! signals that the distribution is in the limit case of a delta distribution
+    virtual bool isDelta() const;
+
+protected:
+    //! Registers some class members for later access via parameter pool
+    void init_parameters();
+
+private:
+    //! check initialization
+    bool checkInitialization() const;
+    double m_mean;
+    double m_sigma;
+};
+
+#endif // DISTRIBUTIONS_H
diff --git a/Core/Parametrization/IParameter.h b/Core/Parametrization/IParameter.h
new file mode 100644
index 0000000..0f5eabe
--- /dev/null
+++ b/Core/Parametrization/IParameter.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/IParameter.h
+//! @brief     Defines and implements pure virtual base class IParameter<T>.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IPARAMETER_H
+#define IPARAMETER_H
+
+#include "INoncopyable.h"
+#include "INamed.h"
+#include <functional>
+#include <stdexcept>
+#include <string>
+
+//! Pure virtual base class for parameter wrapper classes RealParameter, ComponentParameter.
+//! Holds a pointer to the wrapped parameter, a name, and a callback function to be called
+//! when the parameter is changed.
+//! This class is templated on the data type of the wrapped parameter.
+//! @class IParameter
+//! @ingroup tools_internal
+
+template<class T>
+class BA_CORE_API_ IParameter : public INamed, public INoncopyable {
+public:
+    IParameter() =delete;
+    IParameter(const std::string& name, volatile T* data, const std::string& parent_name,
+               const std::function<void()>& onChange)
+        : INamed(name), m_data(data), m_parent_name(parent_name), m_onChange(onChange) {
+            if(!m_data)
+                throw std::runtime_error(
+                    "Bug: attempt to construct an IParameter with null data pointer"); }
+
+    virtual IParameter* clone( const std::string& new_name="" ) const =0;
+
+    //! Returns true if wrapped parameter was not initialized with proper real value
+    virtual bool isNull() const { return m_data ? false : true; }
+
+    volatile T& getData() const { return *m_data; }
+    void setData(volatile T& data) { m_data = &data; m_onChange(); }
+
+    //! Prints the parameter's address to an output stream
+    friend std::ostream& operator<<(std::ostream& ostr, const IParameter& p) {
+        ostr << p.m_data; return ostr; }
+
+    bool operator==(const IParameter &other) const { return m_data == other.m_data; }
+    bool operator!=(const IParameter &other) const { return !(*this == other); }
+
+protected:
+    volatile T* m_data;
+    std::string m_parent_name;
+    std::function<void()> m_onChange;
+
+    //! For use in error messages
+    std::string fullName() { return m_parent_name + "/" + getName(); }
+};
+
+#endif // IPARAMETER_H
diff --git a/Core/Parametrization/IParameterized.cpp b/Core/Parametrization/IParameterized.cpp
new file mode 100644
index 0000000..0ff473e
--- /dev/null
+++ b/Core/Parametrization/IParameterized.cpp
@@ -0,0 +1,102 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/IParameterized.cpp
+//! @brief     Implements class IParameterized.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IParameterized.h"
+#include "RealLimits.h"
+#include "ParameterPool.h"
+#include "RealParameter.h"
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <stdexcept>
+
+IParameterized::IParameterized(const std::string& name)
+    : INamed(name)
+{
+    m_pool = new ParameterPool( name, std::bind(&IParameterized::onChange, this) );
+}
+
+IParameterized::IParameterized(const IParameterized& other)
+    : IParameterized(other.getName())
+{
+    if( other.getParameterPool()->size() )
+        throw std::runtime_error( "BUG: not prepared to copy parameters of " + getName() );
+}
+
+IParameterized::~IParameterized()
+{
+    delete m_pool;
+}
+
+ParameterPool* IParameterized::createParameterTree()
+{
+    auto P_new_pool = new ParameterPool(getName(), std::bind(&IParameterized::onChange, this) );
+    addParametersToExternalPool("/", P_new_pool);
+    return P_new_pool;
+}
+
+//! Copies local parameters to external_pool, under name "path/<name>copy_number/"
+
+std::string IParameterized::addParametersToExternalPool(
+    const std::string& _path, ParameterPool* external_pool, int copy_number) const
+{
+    std::string path = _path;
+    if( path[path.length()-1] != '/' )
+        path += "/";
+    path += getName();
+    if(copy_number >=0)
+        path += std::to_string(copy_number);
+    path += "/";
+
+    m_pool->copyToExternalPool(path, external_pool);
+
+    return path;
+}
+
+void IParameterized::printParameters()
+{
+    std::unique_ptr<ParameterPool> P_pool( createParameterTree() );
+    std::cout << *P_pool << std::endl;
+}
+
+RealParameter& IParameterized::registerParameter(const std::string& name, double* data)
+{
+    return m_pool->addParameter(
+        new RealParameter( name, data, m_pool->getName(), [&]()->void{ onChange(); } ));
+}
+
+void IParameterized::setParameterValue(const std::string& name, double value)
+{
+    if(name.find('*') == std::string::npos && name.find('/') == std::string::npos) {
+        m_pool->setParameterValue(name, value);
+    } else {
+        std::unique_ptr<ParameterPool> P_pool { createParameterTree() };
+        if(name.find('*') != std::string::npos)
+            P_pool->setMatchedParametersValue(name, value);
+        else
+            P_pool->setParameterValue(name, value);
+    }
+    onChange();
+}
+
+//! Returns parameter with given 'name'.
+RealParameter* IParameterized::getParameter(const std::string& name) const {
+    return m_pool->getParameter(name);
+}
+
+void IParameterized::print(std::ostream& ostr) const
+{
+    ostr << "IParameterized:" << getName() << " " << *m_pool;
+}
diff --git a/Core/Parametrization/IParameterized.h b/Core/Parametrization/IParameterized.h
new file mode 100644
index 0000000..4f06154
--- /dev/null
+++ b/Core/Parametrization/IParameterized.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/IParameterized.h
+//! @brief     Defines class IParameterized.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IPARAMETERIZED_H
+#define IPARAMETERIZED_H
+
+#include "INamed.h"
+
+class RealLimits;
+class ParameterPool;
+class RealParameter;
+
+//! Manages a local parameter pool, and a tree of child pools.
+//! @ingroup tools_internal
+
+class BA_CORE_API_ IParameterized : public INamed
+{
+public:
+    IParameterized(const std::string& name="");
+    IParameterized(const IParameterized& other);
+    ~IParameterized() override;
+
+    IParameterized operator=(const IParameterized& other) = delete;
+
+    //! Returns pointer to the parameter pool.
+    ParameterPool* getParameterPool() const { return m_pool; }
+
+    //! Creates new parameter pool, with all local parameters and those of its children.
+    ParameterPool* createParameterTree();
+
+    void printParameters();
+
+    RealParameter& registerParameter(const std::string& name, double* parpointer);
+
+    void setParameterValue(const std::string& name, double value);
+
+    RealParameter* getParameter(const std::string& name) const;
+
+    friend std::ostream& operator<<(std::ostream& ostr, const IParameterized& m) {
+        m.print(ostr); return ostr; }
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    virtual std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number=-1) const;
+
+protected:
+    //! Action to be taken in inherited class when a parameter has changed.
+    virtual void onChange() {}
+
+    //! Prints a representation of this IParameterized object to the given output stream.
+    //! default implementation prints "IParameterized:" and the parameter pool
+    virtual void print(std::ostream& ostr) const;
+
+private:
+    ParameterPool* m_pool; //!< parameter pool (kind of pointer-to-implementation)
+};
+
+#endif // IPARAMETERIZED_H
diff --git a/Core/Parametrization/ParameterDistribution.cpp b/Core/Parametrization/ParameterDistribution.cpp
new file mode 100644
index 0000000..04f5060
--- /dev/null
+++ b/Core/Parametrization/ParameterDistribution.cpp
@@ -0,0 +1,130 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ParameterDistribution.cpp
+//! @brief     Implements class ParameterDistribution.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterDistribution.h"
+#include "Distributions.h"
+#include "Exceptions.h"
+
+ParameterDistribution::ParameterDistribution(const std::string &par_name,
+    const IDistribution1D &distribution, size_t nbr_samples,
+    double sigma_factor, const RealLimits &limits)
+    : IParameterized("ParameterDistribution")
+    , m_name(par_name)
+    , m_nbr_samples(nbr_samples)
+    , m_sigma_factor(sigma_factor)
+    , m_limits(limits)
+    , m_xmin(1.0)
+    , m_xmax(-1.0)
+{
+    mP_distribution.reset(distribution.clone());
+    if (m_sigma_factor < 0.0) {
+        throw Exceptions::RuntimeErrorException(
+                "ParameterDistribution::ParameterDistribution() -> Error."
+                "sigma factor cannot be negative");
+    }
+    if(nbr_samples == 0) {
+        throw Exceptions::RuntimeErrorException(
+                    "ParameterDistribution::ParameterDistribution() -> Error."
+                    "Number of samples can't be zero.");
+    }
+}
+
+ParameterDistribution::ParameterDistribution(const std::string &par_name,
+    const IDistribution1D &distribution, size_t nbr_samples,
+    double xmin, double xmax)
+    : IParameterized("ParameterDistribution")
+    , m_name(par_name)
+    , m_nbr_samples(nbr_samples)
+    , m_sigma_factor(0.0)
+    , m_xmin(xmin)
+    , m_xmax(xmax)
+{
+    mP_distribution.reset(distribution.clone());
+    if (m_sigma_factor < 0.0) {
+        throw Exceptions::RuntimeErrorException(
+                "ParameterDistribution::ParameterDistribution() -> Error."
+                "sigma factor cannot be negative");
+    }
+    if(nbr_samples == 0) {
+        throw Exceptions::RuntimeErrorException(
+                    "ParameterDistribution::ParameterDistribution() -> Error."
+                    "Number of samples can't be zero.");
+    }
+    if(xmin >=xmax) {
+        throw Exceptions::RuntimeErrorException(
+                    "ParameterDistribution::ParameterDistribution() -> Error."
+                    "xmin>=xmax");
+    }
+}
+
+
+ParameterDistribution::ParameterDistribution(const ParameterDistribution& other)
+: IParameterized("ParameterDistribution")
+    , m_name(other.m_name)
+    , m_nbr_samples(other.m_nbr_samples)
+    , m_sigma_factor(other.m_sigma_factor)
+    , m_linked_par_names(other.m_linked_par_names)
+    , m_limits(other.m_limits)
+    , m_xmin(other.m_xmin)
+    , m_xmax(other.m_xmax)
+{
+    mP_distribution.reset(other.mP_distribution->clone());
+}
+
+ParameterDistribution::~ParameterDistribution()
+{
+}
+
+ParameterDistribution& ParameterDistribution::operator=(
+        const ParameterDistribution& other)
+{
+    if (this != &other) {
+        this->m_name = other.m_name;
+        m_nbr_samples = other.m_nbr_samples;
+        m_sigma_factor = other.m_sigma_factor;
+        mP_distribution.reset(other.mP_distribution->clone());
+        m_linked_par_names = other.m_linked_par_names;
+        m_limits = other.m_limits;
+        m_xmin = other.m_xmin;
+        m_xmax = other.m_xmax;
+    }
+    return *this;
+}
+
+ParameterDistribution &ParameterDistribution::linkParameter(std::string par_name)
+{
+    m_linked_par_names.push_back(par_name);
+    return *this;
+}
+
+size_t ParameterDistribution::getNbrSamples() const
+{
+    if (mP_distribution && mP_distribution->isDelta())
+        return 1;
+    return m_nbr_samples;
+}
+
+std::vector<ParameterSample> ParameterDistribution::generateSamples() const
+{
+    if(m_xmin < m_xmax)
+        return mP_distribution->generateSamples(m_nbr_samples, m_xmin, m_xmax);
+    else
+        return mP_distribution->generateSamples(m_nbr_samples, m_sigma_factor, m_limits);
+}
+
+const IDistribution1D* ParameterDistribution::getDistribution() const
+{
+    return mP_distribution.get();
+}
diff --git a/Core/Parametrization/ParameterDistribution.h b/Core/Parametrization/ParameterDistribution.h
new file mode 100644
index 0000000..a821f99
--- /dev/null
+++ b/Core/Parametrization/ParameterDistribution.h
@@ -0,0 +1,80 @@
+//* ************************************************************************* //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ParameterDistribution.h
+//! @brief     Defines class ParameterDistribution.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+//* ************************************************************************* //
+
+#ifndef PARAMETERDISTRIBUTION_H
+#define PARAMETERDISTRIBUTION_H
+
+#include "IParameterized.h"
+#include "RealLimits.h"
+#include "ParameterSample.h"
+#include <memory>
+#include <vector>
+
+class IDistribution1D;
+
+class BA_CORE_API_ ParameterDistribution : public IParameterized
+{
+public:
+    ParameterDistribution(const std::string& par_name,
+                          const IDistribution1D& distribution,
+                          size_t nbr_samples, double sigma_factor=0.0,
+                          const RealLimits& limits = RealLimits());
+
+    ParameterDistribution(const std::string& par_name,
+                          const IDistribution1D& distribution,
+                          size_t nbr_samples, double xmin, double xmax);
+
+    ParameterDistribution(const ParameterDistribution& other);
+    virtual ~ParameterDistribution();
+
+    //! Overload assignment operator
+    ParameterDistribution& operator=(const ParameterDistribution& other);
+
+    ParameterDistribution& linkParameter(std::string par_name);
+
+    //! get the main parameter's name
+    std::string getMainParameterName() const { return m_name; }
+
+    //! get number of samples for this distribution
+    size_t getNbrSamples() const;
+
+    //! get the sigma factor
+    double getSigmaFactor() const { return m_sigma_factor; }
+
+    const IDistribution1D* getDistribution() const;
+
+    //! generate list of sampled values with their weight
+    std::vector<ParameterSample> generateSamples() const;
+
+    //! get list of linked parameter names
+    std::vector<std::string> getLinkedParameterNames() const { return m_linked_par_names; }
+
+    RealLimits getLimits() const { return m_limits; }
+
+    double getMinValue() const { return m_xmin; }
+    double getMaxValue() const { return m_xmax; }
+
+private:
+    std::string m_name;
+    std::unique_ptr<IDistribution1D> mP_distribution;
+    size_t m_nbr_samples;
+    double m_sigma_factor;
+    std::vector<std::string> m_linked_par_names;
+    RealLimits m_limits;
+    double m_xmin;
+    double m_xmax;
+};
+
+#endif // PARAMETERDISTRIBUTION_H
diff --git a/Core/Parametrization/ParameterPattern.cpp b/Core/Parametrization/ParameterPattern.cpp
new file mode 100644
index 0000000..fb28e81
--- /dev/null
+++ b/Core/Parametrization/ParameterPattern.cpp
@@ -0,0 +1,28 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ParameterPattern.cpp
+//! @brief     Implements class ParameterPattern
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterPattern.h"
+
+ParameterPattern& ParameterPattern::beginsWith(std::string start_type)
+{
+    m_pattern = start_type;
+    return *this;
+}
+
+ParameterPattern& ParameterPattern::add(std::string object_type)
+{
+    m_pattern = m_pattern + "/" + object_type;
+    return *this;
+}
diff --git a/Core/Parametrization/ParameterPattern.h b/Core/Parametrization/ParameterPattern.h
new file mode 100644
index 0000000..7e66775
--- /dev/null
+++ b/Core/Parametrization/ParameterPattern.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ParameterPattern.h
+//! @brief     Defines class ParameterPattern
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERPATTERN_H
+#define PARAMETERPATTERN_H
+
+#include "WinDllMacros.h"
+#include <string>
+
+//! @class ParameterPattern
+//! @ingroup tools_internal
+//! @brief Helper class for constructing parameter patterns.
+
+class BA_CORE_API_ ParameterPattern
+{
+public:
+    ParameterPattern() {}
+    ParameterPattern(std::string root_object) : m_pattern ( "/" + root_object ) {}
+
+    ParameterPattern& beginsWith(std::string start_type);
+    ParameterPattern& add(std::string object_type);
+
+    std::string toStdString() const { return m_pattern; }
+private:
+    std::string m_pattern;
+};
+
+#endif // PARAMETERPATTERN_H
diff --git a/Core/Parametrization/ParameterPool.cpp b/Core/Parametrization/ParameterPool.cpp
new file mode 100644
index 0000000..952a997
--- /dev/null
+++ b/Core/Parametrization/ParameterPool.cpp
@@ -0,0 +1,223 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ParameterPool.cpp
+//! @brief     Implements standard mix-in ParameterPool.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterPool.h"
+#include "RealLimits.h"
+#include "RealParameter.h"
+#include <stdexcept>
+#include "StringUtils.h"
+#include <algorithm>
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+//! Constructs an empty parameter pool.
+
+ParameterPool::ParameterPool(const std::string& name, const std::function<void()>& onChange)
+    : m_name(name)
+    , m_onChange(onChange)
+{}
+
+ParameterPool::~ParameterPool()
+{
+    clear();
+}
+
+//! Returns a literal clone.
+
+ParameterPool* ParameterPool::clone() const
+{
+    ParameterPool* new_pool = new ParameterPool(m_name, m_onChange);
+    new_pool->m_params = m_params;
+    return new_pool;
+}
+
+//! Returns a clone with _prefix_ prepended to every parameter key.
+
+ParameterPool* ParameterPool::cloneWithPrefix(const std::string& prefix) const
+{
+    ParameterPool* new_pool = new ParameterPool(m_name, m_onChange);
+    copyToExternalPool( prefix, new_pool );
+    return new_pool;
+}
+
+//! Clears the parameter map.
+
+void ParameterPool::clear()
+{
+    for(auto* par: m_params)
+        delete par;
+    m_params.clear();
+}
+
+//! Adds parameter to the pool, and returns reference to the input pointer.
+
+//! Returning the input pointer allows us to concatenate function calls like
+//! pool->addParameter( new RealParameter(...) ).setLimits(-1,+1).setFixed().setUnit("nm")
+
+RealParameter& ParameterPool::addParameter(RealParameter* newPar)
+{
+    for (const auto* par: m_params )
+        if( par->getName()==newPar->getName() )
+            throw std::runtime_error(
+                "Bug in ParameterPool::addParameter(): "
+                "Parameter '"+newPar->getName()+"' is already registered");
+    m_params.push_back(newPar);
+    return *newPar;
+}
+
+//! Copies parameters of given pool to _other_ pool, prepeding _prefix_ to the parameter names.
+
+void ParameterPool::copyToExternalPool(const std::string& prefix, ParameterPool* other_pool) const
+{
+    for (const auto* par: m_params) {
+        RealParameter* new_par = par->clone( prefix + par->getName() );
+        other_pool->addParameter( new_par );
+    }
+}
+
+//! Returns parameter with given _name_.
+
+const RealParameter* ParameterPool::getParameter(const std::string& name) const
+{
+    for (const auto* par: m_params )
+        if( par->getName()==name )
+            return par;
+    throw std::runtime_error(
+        "ParameterPool::getParameter() -> Warning. No parameter with name '"+name+"'");
+}
+
+//! Returns parameter with given _name_.
+
+RealParameter* ParameterPool::getParameter(const std::string& name)
+{
+    for (auto* par: m_params )
+        if( par->getName()==name )
+            return par;
+    throw std::runtime_error(
+        "ParameterPool::getParameter() -> Warning. No parameter with name '"+name+"'");
+}
+
+//! Returns vector of parameters that match the _pattern_ (wildcards '*' allowed).
+
+std::vector<RealParameter*> ParameterPool::getMatchedParameters(const std::string& pattern) const
+{
+    std::vector<RealParameter*> selected_parameters;
+    // loop over all parameters in the pool
+    for (auto* par: m_params)
+        if( Utils::String::matchesPattern( par->getName(), pattern ) )
+            selected_parameters.push_back(par);
+    if( selected_parameters.empty() )
+        report_find_matched_parameters_error(pattern);
+    return selected_parameters;
+}
+
+//! Sets parameter value.
+
+void ParameterPool::setParameterValue(const std::string& name, double value)
+{
+    RealParameter* par = getParameter(name);
+    if( par->isNull() )
+        throw std::runtime_error(
+            "ParameterPool::setParameterValue() -> Error! Unitialized parameter '"+name+"'.");
+    try {
+        par->setValue(value);
+    } catch(std::runtime_error) {
+        report_set_value_error(name, value);
+    }
+}
+
+//! Sets parameter value.
+
+int ParameterPool::setMatchedParametersValue(const std::string& pattern, double value)
+{
+    int npars(0);
+    for (auto* par: m_params) {
+        if( Utils::String::matchesPattern( par->getName(), pattern ) ) {
+            try {
+                par->setValue(value);
+                npars++;
+            } catch(std::runtime_error) {
+                report_set_value_error(par->getName(), value);
+            }
+        }
+    }
+    if(npars == 0)
+        report_find_matched_parameters_error(pattern);
+    return npars;
+}
+
+std::vector<std::string> ParameterPool::getParameterNames() const
+{
+    std::vector<std::string> result;
+    for (const auto* par: m_params)
+        result.push_back(par->getName());
+    return result;
+}
+
+void ParameterPool::print(std::ostream& ostr) const
+{
+    const size_t number_of_pars_in_line(12);
+    if( m_params.size() ) {
+        if(m_params.size() < number_of_pars_in_line) { // print in one line
+            ostr << "POOL_" << m_params.size();
+            ostr << "(";
+            for (const auto* par: m_params)
+                ostr << "'" << par->getName() << "'" << ":" << par->getValue() << " " ;
+            ostr << ")";
+        } else { // print in several lines
+            for (const auto* par: m_params)
+                ostr << "'" << par->getName() << "'" << ":" << par->getValue() << "\n";
+        }
+    } else {
+        ostr << "POOL_0";
+    }
+}
+
+std::string ParameterPool::get_error_message(const std::string& criteria) const
+{
+    std::ostringstream ostr;
+    ostr << "No parameters satisfying  criteria '" << criteria
+       << "' have been found. Existing keys are:\n";
+    for (const auto* par: m_params)
+        ostr << "'" << par->getName() << "'\n";
+    return ostr.str();
+}
+
+//! reports error while finding parameters matching given name.
+void ParameterPool::report_find_matched_parameters_error(const std::string& pattern) const
+{
+    std::ostringstream ostr;
+    ostr << "ParameterPool::find_matched_parameters_error() -> Error! ";
+    ostr << "No parameters matching  pattern '" << pattern
+       << "' have been found. Existing keys are:" << std::endl;
+    for (const auto* par: m_params)
+        ostr << "'" << par->getName() << "'\n";
+    throw std::runtime_error(ostr.str());
+}
+
+//! Reports error while setting parname to given value.
+void ParameterPool::report_set_value_error(const std::string& parname, double value) const
+{
+    std::ostringstream ostr;
+    ostr << "ParameterPool::set_value_error() -> Attempt to set value " << value;
+    ostr << " for parameter '" << parname << "' failed. Out of bounds?";
+    try {
+        ostr << " Parameter limits " << getParameter(parname)->getLimits() << ".\n";
+    } catch (...) {
+        throw std::runtime_error("Bug de luxe in ParameterPool: cannot even report the error");
+    }
+    throw std::runtime_error(ostr.str());
+}
diff --git a/Core/Parametrization/ParameterPool.h b/Core/Parametrization/ParameterPool.h
new file mode 100644
index 0000000..71c8be4
--- /dev/null
+++ b/Core/Parametrization/ParameterPool.h
@@ -0,0 +1,95 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ParameterPool.h
+//! @brief     Defines class ParameterPool.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERPOOL_H
+#define PARAMETERPOOL_H
+
+#include "WinDllMacros.h"
+#include <functional>
+#include <ostream>
+#include <string>
+#include <vector>
+
+class RealLimits;
+class RealParameter;
+
+//! Holds a map of pointers to parameters.
+//! @ingroup tools_internal
+
+//! Used in IParameterized, which has a member ParameterPool* m_pool.
+//! So this is pimpl (pointer to implementation) idiom, with ParameterPool providing the
+//! implementation of all the nontrivial functionality of IParameterized.
+//!
+//! Parameter names must be unique since we use them as map keys.
+
+class BA_CORE_API_ ParameterPool
+{
+public:
+    explicit ParameterPool(const std::string& name, const std::function<void()>& onChange);
+    ParameterPool(const ParameterPool&) = delete;
+    ParameterPool& operator=(const ParameterPool&) = delete;
+    virtual ~ParameterPool();
+
+    ParameterPool* clone() const;
+    ParameterPool* cloneWithPrefix(const std::string& prefix) const;
+
+    void copyToExternalPool(const std::string& prefix, ParameterPool* external_pool) const;
+
+    void clear();
+
+    std::string getName() const { return m_name; }
+
+    //! Returns number of parameters in the pool.
+    size_t size() const { return m_params.size(); }
+
+    RealParameter& addParameter(RealParameter* par);
+
+    RealParameter* getParameter(const std::string& name);
+
+    const RealParameter* getParameter(const std::string& name) const;
+
+    //! Returns full vector of parameters.
+    const std::vector<RealParameter*> getParameters() const { return m_params; }
+
+    std::vector<RealParameter*> getMatchedParameters(const std::string& wildcards) const;
+
+    void setParameterValue(const std::string& name, double value);
+
+    int setMatchedParametersValue(const std::string& wildcards, double value);
+
+    std::vector<std::string> getParameterNames() const;
+
+    friend std::ostream& operator<<(std::ostream& ostr, const ParameterPool& obj) {
+        obj.print(ostr); return ostr; }
+
+protected:
+    //! Called from RealParameter, calls back to owning IParameterized.
+    void onChange() const { m_onChange(); }
+
+private:
+    virtual void print(std::ostream& ostr) const;
+
+    std::string get_error_message(const std::string& criteria) const;
+    void report_find_matched_parameters_error(const std::string& pattern) const;
+    void report_set_value_error(const std::string& parname, double value) const;
+
+    std::string m_name; //!< The name of this pool, should be that of the owning IParameterized.
+    std::vector<RealParameter*> m_params;     //!< The parameters in this pool.
+    std::function<void()> m_onChange; //!< To be called whenever a parameter has changed.
+
+    friend RealParameter; //!< allow call of onChange().
+};
+
+#endif // PARAMETERPOOL_H
diff --git a/Core/Parametrization/ParameterSample.h b/Core/Parametrization/ParameterSample.h
new file mode 100644
index 0000000..5357fba
--- /dev/null
+++ b/Core/Parametrization/ParameterSample.h
@@ -0,0 +1,29 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ParameterSample.h
+//! @brief     Defines class ParameterSample.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERSAMPLE_H
+#define PARAMETERSAMPLE_H
+
+//! @class ParameterSample
+//! @ingroup algorithms_internal
+//! @brief Represents a sampled parameter value with its weight
+class ParameterSample
+{
+public:
+	double value;
+	double weight;
+};
+
+#endif // PARAMETERSAMPLE_H
diff --git a/Core/Parametrization/RealParameter.cpp b/Core/Parametrization/RealParameter.cpp
new file mode 100644
index 0000000..125e1ff
--- /dev/null
+++ b/Core/Parametrization/RealParameter.cpp
@@ -0,0 +1,75 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/RealParameter.cpp
+//! @brief     Implements class RealParameter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RealParameter.h"
+#include <sstream>
+
+RealParameter::RealParameter(
+    const std::string& name, volatile double* par,
+    const std::string& parent_name, const std::function<void()>& onChange,
+    const RealLimits& limits, const Attributes& attr)
+    : IParameter<double>(name, par, parent_name, onChange)
+    , m_limits(limits)
+    , m_attr(attr)
+{
+    if(!m_limits.isInRange(getValue())) {
+        std::ostringstream message;
+        message << "Cannot initialize parameter " << fullName() << " with value " << getValue()
+                << ": out of bounds [" << limits << "]\n";
+        throw std::runtime_error(message.str());
+    }
+}
+
+RealParameter* RealParameter::clone(const std::string& new_name) const
+{
+    auto* ret = new RealParameter(
+        new_name!="" ? new_name : getName(), m_data, m_parent_name, m_onChange, m_limits );
+    ret->setUnit(unit());
+    return ret;
+}
+
+void RealParameter::setValue(double value)
+{
+    if(value == *m_data)
+        return; // nothing to do
+    if(!m_limits.isInRange(value)) {
+        std::ostringstream message;
+        message << "Cannot set parameter " << fullName() << " to value " << value
+                << ": out of bounds [" << m_limits << "]\n";
+        throw std::runtime_error(message.str());
+    }
+    if(m_attr.isFixed())
+        throw std::runtime_error("Parameter "+fullName()+" is fixed");
+    *m_data = value;
+    m_onChange();
+}
+
+RealParameter& RealParameter::setLimited(double lower, double upper)
+{
+    setLimits( RealLimits::limited(lower, upper) );
+    return *this;
+}
+
+RealParameter& RealParameter::setPositive()
+{
+    setLimits( RealLimits::positive() );
+    return *this;
+}
+
+RealParameter& RealParameter::setNonnegative()
+{
+    setLimits( RealLimits::nonnegative() );
+    return *this;
+}
diff --git a/Core/Parametrization/RealParameter.h b/Core/Parametrization/RealParameter.h
new file mode 100644
index 0000000..a58e76a
--- /dev/null
+++ b/Core/Parametrization/RealParameter.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/RealParameter.h
+//! @brief     Defines class RealParameter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALPARAMETER_H
+#define REALPARAMETER_H
+
+#include "IParameter.h"
+#include "Attributes.h"
+#include "RealLimits.h"
+#include "Unit.h"
+#include <string>
+
+class ParameterPool;
+
+//! Wraps a parameter of type double.
+//! In addition to name and on-change callback held by the parent class IParameter,
+//! this class holds Limits, Attributes (currently only fixed or not), and a Unit.
+//! @ingroup tools_internal
+
+class BA_CORE_API_ RealParameter : public IParameter<double> {
+public:
+    RealParameter(
+        const std::string& name, volatile double* par,
+        const std::string& parent_name, const std::function<void()>& onChange,
+        const RealLimits& limits=RealLimits::limitless(),
+        const Attributes& attr=Attributes::free());
+
+    RealParameter* clone( const std::string& new_name="" ) const;
+
+    //! Sets value of wrapped parameter and emit signal
+    void setValue(double value);
+
+    //! Returns value of wrapped parameter
+    double getValue() const { return *m_data; }
+
+    RealParameter& setLimits(const RealLimits& limits) { m_limits = limits; return *this; }
+    RealLimits getLimits() const { return m_limits; }
+
+    RealParameter& setLimited(double lower, double upper);
+    RealParameter& setPositive();
+    RealParameter& setNonnegative();
+
+    bool operator==(const RealParameter& other) const {
+        return m_limits == other.m_limits &&
+        m_attr == other.m_attr &&
+        *static_cast<const IParameter*>(this)==*static_cast<const IParameter*>(&other); }
+
+    RealParameter& setUnit(const std::string& name) { m_unit.setUnit(name); return *this; }
+    std::string unit() const { return m_unit.getName(); }
+
+protected:
+    RealLimits m_limits;
+    Attributes m_attr;
+    Unit m_unit;
+};
+
+#endif // REALPARAMETER_H
diff --git a/Core/Parametrization/SimulationOptions.cpp b/Core/Parametrization/SimulationOptions.cpp
new file mode 100644
index 0000000..0136e17
--- /dev/null
+++ b/Core/Parametrization/SimulationOptions.cpp
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/SimulationOptions.cpp
+//! @brief     Implements class SimulationOptions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationOptions.h"
+#include <thread>
+
+SimulationOptions::SimulationOptions()
+    : m_mc_integration(false)
+    , m_include_specular(false)
+    , m_mc_points(1)
+{
+    m_thread_info.n_threads = getHardwareConcurrency();
+}
+
+bool SimulationOptions::isIntegrate() const
+{
+    return m_mc_integration && m_mc_points>1;
+}
+
+void SimulationOptions::setMonteCarloIntegration(bool flag, size_t mc_points)
+{
+    m_mc_integration = flag;
+    m_mc_points = mc_points;
+}
+
+void SimulationOptions::setNumberOfThreads(int nthreads)
+{
+    if(nthreads == 0)
+        m_thread_info.n_threads = (int)std::thread::hardware_concurrency();
+    else if(nthreads > 0)
+        m_thread_info.n_threads = nthreads;
+    else
+        m_thread_info.n_threads = 1;
+}
+
+int SimulationOptions::getNumberOfThreads() const
+{
+    return m_thread_info.n_threads;
+}
+
+void SimulationOptions::setNumberOfBatches(int nbatches)
+{
+    m_thread_info.n_batches = nbatches;
+}
+
+int SimulationOptions::getNumberOfBatches() const
+{
+    return m_thread_info.n_batches;
+}
+
+int SimulationOptions::getCurrentBatch() const
+{
+    return m_thread_info.current_batch;
+}
+
+int SimulationOptions::getHardwareConcurrency() const
+{
+    return (int)std::thread::hardware_concurrency();
+}
+
+double SimulationOptions::getDefaultVariability() const
+{
+    return isIntegrate() ? 0.5 : 2e-10;
+}
diff --git a/Core/Parametrization/SimulationOptions.h b/Core/Parametrization/SimulationOptions.h
new file mode 100644
index 0000000..ee48c3e
--- /dev/null
+++ b/Core/Parametrization/SimulationOptions.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/SimulationOptions.h
+//! @brief     Defines class SimulationOptions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONOPTIONS_H
+#define SIMULATIONOPTIONS_H
+
+#include "ThreadInfo.h"
+#include <cstddef>
+
+using std::size_t;
+
+//! @class SimulationOptions
+//! @ingroup simulation
+//! @brief Collect the different options for simulation
+//! @ref SimulationOptions
+
+class BA_CORE_API_ SimulationOptions
+{
+public:
+    SimulationOptions();
+
+    bool isIntegrate() const;
+    size_t getMcPoints() const { return m_mc_points; }
+
+    //! @brief Enables/disables MonetCarlo integration
+    //! @param flag If true, MonteCarlo integration will be used, otherwise analytical calculations
+    //! @param mc_points Number of points for MonteCarlo integrator
+    void setMonteCarloIntegration(bool flag = true, size_t mc_points=50);
+
+    //! @brief Sets number of threads to use during the simulation (0 - take the default value from
+    //! the hardware)
+    void setNumberOfThreads(int nthreads);
+
+    int getNumberOfThreads() const;
+
+    //! @brief Sets number of batches to split
+    void setNumberOfBatches(int nbatches);
+
+    int getNumberOfBatches() const;
+
+    int getCurrentBatch() const;
+
+    //! @brief Sets the batch and thread information to be used
+    void setThreadInfo(const ThreadInfo& thread_info) { m_thread_info = thread_info; }
+
+    int getHardwareConcurrency() const;
+
+    double getDefaultVariability() const;
+
+    void setIncludeSpecular(bool include_specular) { m_include_specular = include_specular; }
+
+    bool includeSpecular() const { return m_include_specular; }
+
+private:
+    bool m_mc_integration;
+    bool m_include_specular;
+    size_t m_mc_points;
+    ThreadInfo m_thread_info;
+};
+
+
+#endif // SIMULATIONOPTIONS_H
diff --git a/Core/Parametrization/ThreadInfo.h b/Core/Parametrization/ThreadInfo.h
new file mode 100644
index 0000000..7ad9595
--- /dev/null
+++ b/Core/Parametrization/ThreadInfo.h
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/ThreadInfo.h
+//! @brief     Defines struct ThreadInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef THREADINFO_H
+#define THREADINFO_H
+
+#include "WinDllMacros.h"
+
+//! @class ThreadInfo
+//! @ingroup simulation
+//! @brief Information to run simulation with dedicated number of threads
+
+struct BA_CORE_API_ ThreadInfo
+{
+    ThreadInfo();
+    int n_threads;
+    int current_thread;
+    int n_batches;
+    int current_batch;
+};
+
+inline ThreadInfo::ThreadInfo()
+    : n_threads(0)
+    , current_thread(0)
+    , n_batches(1)
+    , current_batch(0)
+{
+}
+
+#endif // THREADINFO_H
diff --git a/Core/Parametrization/Unit.cpp b/Core/Parametrization/Unit.cpp
new file mode 100644
index 0000000..1fb744d
--- /dev/null
+++ b/Core/Parametrization/Unit.cpp
@@ -0,0 +1,24 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/Unit.cpp
+//! @brief     Implements class Unit.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Unit.h"
+#include <stdexcept>
+
+void Unit::setUnit(const std::string& name)
+{
+    if (! (name=="" || name=="nm" || name=="rad" ) )
+        throw std::runtime_error("Bug: call to Unit::Unit with unexpected name "+name);
+    setName(name);
+}
diff --git a/Core/Parametrization/Unit.h b/Core/Parametrization/Unit.h
new file mode 100644
index 0000000..3d4e1bc
--- /dev/null
+++ b/Core/Parametrization/Unit.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/Unit.h
+//! @brief     Defines class Unit.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef UNIT_H
+#define UNIT_H
+
+#include "INamed.h"
+#include <string>
+
+//! A physical unit.
+
+class Unit : public INamed
+{
+public:
+    Unit(const std::string& name="") { setUnit(name); }
+    void setUnit(const std::string& name);
+};
+
+#endif // UNIT_H
diff --git a/Core/Parametrization/Units.h b/Core/Parametrization/Units.h
new file mode 100644
index 0000000..fb0e962
--- /dev/null
+++ b/Core/Parametrization/Units.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Parametrization/Units.h
+//! @brief     Defines some unit conversion factors and other constants in namespace Units.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef UNITS_H
+#define UNITS_H
+
+namespace Units {  // BornAgain namespace
+
+// Length
+static const double nanometer   = 1.;
+static const double angstrom    = 1.e-1*nanometer;
+static const double micrometer  = 1.e+3*nanometer;
+static const double millimeter  = 1.e+6*nanometer;
+static const double meter       = 1.e+9*nanometer;
+
+// Symbols for length
+static const double nm  = nanometer;
+
+// Angle
+static const double radian      = 1.;
+static const double milliradian = 1.e-3*radian;
+static const double degree = (3.14159265358979323846264338327950288/180.0)*radian;
+static const double steradian = 1.;
+
+inline double rad2deg(double angle) {return angle/degree; }
+inline double deg2rad(double angle) {return angle*degree; }
+
+// Symbols for (solid) angle
+static const double rad  = radian;
+static const double mrad = milliradian;
+static const double sr   = steradian;
+static const double deg  = degree;
+
+// Magnetic field
+static const double tesla = 1.;
+static const double gauss = 1e-4;
+
+}
+
+#endif // UNITS_H
diff --git a/Core/Particle/Crystal.cpp b/Core/Particle/Crystal.cpp
new file mode 100644
index 0000000..b7ce2ee
--- /dev/null
+++ b/Core/Particle/Crystal.cpp
@@ -0,0 +1,88 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/Crystal.cpp
+//! @brief     Implements class Crystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Crystal.h"
+#include "BornAgainNamespace.h"
+#include "FormFactorCrystal.h"
+#include "FormFactorDecoratorDebyeWaller.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+
+Crystal::Crystal(const ParticleComposition& lattice_basis, const Lattice& lattice)
+    : m_lattice(lattice), m_dw_factor(0.0)
+{
+    setName(BornAgain::CrystalType);
+    mp_lattice_basis = lattice_basis.clone();
+    registerChild(mp_lattice_basis);
+}
+
+Crystal::~Crystal()
+{
+    delete mp_lattice_basis;
+}
+
+Crystal* Crystal::clone() const
+{
+    Crystal* p_new = new Crystal(*mp_lattice_basis, m_lattice);
+    p_new->setDWFactor(m_dw_factor);
+    return p_new;
+}
+
+Crystal* Crystal::cloneInvertB() const
+{
+    Crystal* p_new = new Crystal(mp_lattice_basis->cloneInvertB(), m_lattice);
+    p_new->setDWFactor(m_dw_factor);
+    return p_new;
+}
+
+void Crystal::setAmbientMaterial(const IMaterial& material)
+{
+    mp_lattice_basis->setAmbientMaterial(material);
+}
+
+const IMaterial* Crystal::getAmbientMaterial() const
+{
+    return mp_lattice_basis->getAmbientMaterial();
+}
+
+IFormFactor* Crystal::createTotalFormFactor(const IFormFactor& meso_crystal_form_factor,
+                                            const IRotation* p_rotation,
+                                            const kvector_t& translation) const
+{
+    Lattice transformed_lattice = getTransformedLattice(p_rotation);
+    const std::unique_ptr<IFormFactor> P_basis_ff(
+        mp_lattice_basis->createTransformedFormFactor(p_rotation, translation));
+    const std::unique_ptr<FormFactorCrystal> P_ff_crystal(
+        new FormFactorCrystal(transformed_lattice, *P_basis_ff, meso_crystal_form_factor));
+    if (m_dw_factor > 0.0)
+        return new FormFactorDecoratorDebyeWaller(*P_ff_crystal, m_dw_factor);
+    return P_ff_crystal->clone();
+}
+
+Lattice Crystal::getTransformedLattice(const IRotation* p_rotation) const
+{
+    if (p_rotation)
+        return m_lattice.createTransformedLattice(p_rotation->getTransform3D());
+    else
+        return m_lattice;
+}
+
+Crystal::Crystal(ParticleComposition* p_lattice_basis, const Lattice& lattice)
+    : m_lattice(lattice), m_dw_factor(0.0)
+{
+    setName(BornAgain::CrystalType);
+    mp_lattice_basis = p_lattice_basis;
+    registerChild(mp_lattice_basis);
+}
diff --git a/Core/Particle/Crystal.h b/Core/Particle/Crystal.h
new file mode 100644
index 0000000..9bd43bf
--- /dev/null
+++ b/Core/Particle/Crystal.h
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/Crystal.h
+//! @brief     Defines class Crystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CRYSTAL_H
+#define CRYSTAL_H
+
+#include "IClusteredParticles.h"
+#include "Lattice.h"
+#include "Vectors3D.h"
+
+class Particle;
+class ParticleComposition;
+
+//! A crystal structure with a ParticleComposition as a basis.
+//!   Used in MesoCrystal, where it is given an outer shape.
+//! @ingroup samples
+
+class BA_CORE_API_ Crystal : public IClusteredParticles
+{
+public:
+    Crystal(const ParticleComposition& lattice_basis, const Lattice& lattice);
+    virtual ~Crystal();
+
+    Crystal* clone() const final;
+    Crystal* cloneInvertB() const final;
+
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
+
+    void setAmbientMaterial(const IMaterial& material) final;
+    const IMaterial* getAmbientMaterial() const final;
+
+    virtual IFormFactor* createTotalFormFactor(
+        const IFormFactor& meso_crystal_form_factor,
+        const IRotation* p_rotation, const kvector_t& translation) const;
+
+    Lattice getTransformedLattice(const IRotation* p_rotation) const;
+
+    const ParticleComposition* getLatticeBasis() const { return mp_lattice_basis; }
+
+    void setDWFactor(double dw_factor) { m_dw_factor = dw_factor; }
+
+private:
+    //! Private constructor
+    Crystal(ParticleComposition* p_lattice_basis, const Lattice& lattice);
+
+    Lattice m_lattice;
+    ParticleComposition* mp_lattice_basis;
+    double m_dw_factor;
+};
+
+#endif // CRYSTAL_H
diff --git a/Core/Particle/FormFactorCrystal.cpp b/Core/Particle/FormFactorCrystal.cpp
new file mode 100644
index 0000000..afda619
--- /dev/null
+++ b/Core/Particle/FormFactorCrystal.cpp
@@ -0,0 +1,92 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/FormFactorCrystal.cpp
+//! @brief     Implements class FormFactorCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorCrystal.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathConstants.h"
+#include "WavevectorInfo.h"
+
+FormFactorCrystal::FormFactorCrystal(const Lattice& lattice, const IFormFactor& basis_form_factor,
+                                     const IFormFactor& meso_form_factor)
+    : m_lattice(lattice),
+      mp_basis_form_factor(basis_form_factor.clone()),
+      mp_meso_form_factor(meso_form_factor.clone())
+{
+    setName(BornAgain::FormFactorCrystalType);
+    calculateLargestReciprocalDistance();
+}
+
+FormFactorCrystal::~FormFactorCrystal()
+{
+    delete mp_basis_form_factor;
+    delete mp_meso_form_factor;
+}
+
+complex_t FormFactorCrystal::evaluate(const WavevectorInfo& wavevectors) const
+{
+    // retrieve reciprocal lattice vectors within reasonable radius
+    cvector_t q = wavevectors.getQ();
+    double radius = 2.1 * m_max_rec_length;
+    std::vector<kvector_t> rec_vectors =
+        m_lattice.reciprocalLatticeVectorsWithinRadius(q.real(), radius);
+
+    // perform convolution on these lattice vectors
+    complex_t result(0.0, 0.0);
+    for (const auto& rec: rec_vectors) {
+        WavevectorInfo basis_wavevectors(kvector_t(), -rec, wavevectors.getWavelength());
+        complex_t basis_factor = mp_basis_form_factor->evaluate(basis_wavevectors);
+        WavevectorInfo meso_wavevectors(cvector_t(), rec.complex()-q, wavevectors.getWavelength());
+        complex_t meso_factor = mp_meso_form_factor->evaluate(meso_wavevectors);
+        result += basis_factor * meso_factor;
+    }
+    // the transformed delta train gets a factor of (2pi)^3/V, but the (2pi)^3
+    // is canceled by the convolution of Fourier transforms :
+    double volume = m_lattice.getVolume();
+    return result / volume;
+}
+
+Eigen::Matrix2cd FormFactorCrystal::evaluatePol(const WavevectorInfo& wavevectors) const
+{
+    // retrieve reciprocal lattice vectors within reasonable radius
+    cvector_t q = wavevectors.getQ();
+    double radius = 2.1 * m_max_rec_length;
+    std::vector<kvector_t> rec_vectors =
+        m_lattice.reciprocalLatticeVectorsWithinRadius(q.real(), radius);
+
+    // perform convolution on these lattice vectors
+    Eigen::Matrix2cd result = Eigen::Matrix2cd::Zero();
+    for (const auto& rec: rec_vectors) {
+        WavevectorInfo basis_wavevectors(kvector_t(), -rec, wavevectors.getWavelength());
+        Eigen::Matrix2cd basis_factor = mp_basis_form_factor->evaluatePol(basis_wavevectors);
+        WavevectorInfo meso_wavevectors(cvector_t(), rec.complex()-q, wavevectors.getWavelength());
+        complex_t meso_factor = mp_meso_form_factor->evaluate(meso_wavevectors);
+        result += basis_factor * meso_factor;
+    }
+    // the transformed delta train gets a factor of (2pi)^3/V, but the (2pi)^3
+    // is canceled by the convolution of Fourier transforms :
+    double volume = m_lattice.getVolume();
+    return result / volume;
+}
+
+void FormFactorCrystal::calculateLargestReciprocalDistance()
+{
+    kvector_t a1 = m_lattice.getBasisVectorA();
+    kvector_t a2 = m_lattice.getBasisVectorB();
+    kvector_t a3 = m_lattice.getBasisVectorC();
+
+    m_max_rec_length = std::max(M_PI / a1.mag(), M_PI / a2.mag());
+    m_max_rec_length = std::max(m_max_rec_length, M_PI / a3.mag());
+}
diff --git a/Core/Particle/FormFactorCrystal.h b/Core/Particle/FormFactorCrystal.h
new file mode 100644
index 0000000..2141530
--- /dev/null
+++ b/Core/Particle/FormFactorCrystal.h
@@ -0,0 +1,55 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/FormFactorCrystal.h
+//! @brief     Defines class FormFactorCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORCRYSTAL_H
+#define FORMFACTORCRYSTAL_H
+
+#include "IFormFactorBorn.h"
+#include "Lattice.h"
+
+//! The formfactor of a MesoCrystal.
+//! @ingroup formfactors
+
+class BA_CORE_API_ FormFactorCrystal : public IFormFactor
+{
+public:
+    FormFactorCrystal(const Lattice& lattice, const IFormFactor& basis_form_factor,
+                      const IFormFactor& meso_form_factor);
+    ~FormFactorCrystal() override final;
+
+    FormFactorCrystal* clone() const override final {
+        return new FormFactorCrystal(m_lattice, *mp_basis_form_factor, *mp_meso_form_factor); }
+
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getVolume() const override final { return mp_meso_form_factor->getVolume(); }
+    double getRadialExtension() const override final {
+        return mp_meso_form_factor->getRadialExtension(); }
+
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override final;
+#ifndef SWIG
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override final;
+#endif
+
+private:
+    void calculateLargestReciprocalDistance();
+
+    Lattice m_lattice;
+    IFormFactor* mp_basis_form_factor;
+    IFormFactor* mp_meso_form_factor; //!< The outer shape of this mesocrystal
+    double m_max_rec_length;
+};
+
+#endif // FORMFACTORCRYSTAL_H
diff --git a/Core/Particle/FormFactorWeighted.cpp b/Core/Particle/FormFactorWeighted.cpp
new file mode 100644
index 0000000..65653af
--- /dev/null
+++ b/Core/Particle/FormFactorWeighted.cpp
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/FormFactorWeighted.cpp
+//! @brief     Implements class FormFactorWeighted.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorWeighted.h"
+#include "BornAgainNamespace.h"
+
+
+FormFactorWeighted::FormFactorWeighted()
+{
+    setName(BornAgain::FormFactorWeightedType);
+}
+
+FormFactorWeighted::~FormFactorWeighted()
+{
+    for (size_t index=0; index<m_form_factors.size(); ++index)
+        delete m_form_factors[index];
+}
+
+FormFactorWeighted* FormFactorWeighted::clone() const
+{
+    FormFactorWeighted *result = new FormFactorWeighted();
+    for (size_t index=0; index<m_form_factors.size(); ++index)
+        result->addFormFactor(*m_form_factors[index], m_weights[index]);
+    return result;
+}
+
+double FormFactorWeighted::getRadialExtension() const
+{
+    double result { 0.0 };
+    for (size_t index=0; index<m_form_factors.size(); ++index)
+        result += m_weights[index] * m_form_factors[index]->getRadialExtension();
+    return result;
+}
+
+void FormFactorWeighted::addFormFactor(const IFormFactor& form_factor, double weight)
+{
+    m_form_factors.push_back(form_factor.clone());
+    m_weights.push_back(weight);
+}
+
+void FormFactorWeighted::setAmbientMaterial(const IMaterial& material)
+{
+    for (size_t index=0; index<m_form_factors.size(); ++index)
+        m_form_factors[index]->setAmbientMaterial(material);
+}
+
+complex_t FormFactorWeighted::evaluate(const WavevectorInfo& wavevectors) const
+{
+    complex_t result(0.0, 0.0);
+    for (size_t index=0; index<m_form_factors.size(); ++index)
+        result += m_weights[index] * m_form_factors[index]->evaluate(wavevectors);
+    return result;
+}
+
+Eigen::Matrix2cd FormFactorWeighted::evaluatePol(const WavevectorInfo& wavevectors) const
+{
+    Eigen::Matrix2cd result = Eigen::Matrix2cd::Zero();
+    for (size_t index=0; index<m_form_factors.size(); ++index)
+        result += m_weights[index] * m_form_factors[index]->evaluatePol(wavevectors);
+    return result;
+}
diff --git a/Core/Particle/FormFactorWeighted.h b/Core/Particle/FormFactorWeighted.h
new file mode 100644
index 0000000..4aa02e2
--- /dev/null
+++ b/Core/Particle/FormFactorWeighted.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/FormFactorWeighted.h
+//! @brief     Defines class FormFactorWeighted.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORWEIGHTED_H
+#define FORMFACTORWEIGHTED_H
+
+#include "IFormFactor.h"
+
+//! Coherent sum of different scalar IFormFactor's with different weights.
+//!
+//! Used by ParticleComposition and ParticleCoreShell.
+//! If same particles are at different positions, then consider
+//! FormFactorDecoratorMultiPositionFactor (restore from commit 0500a26de76).
+
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ FormFactorWeighted : public IFormFactor
+{
+public:
+    FormFactorWeighted();
+    ~FormFactorWeighted() override final;
+
+    FormFactorWeighted* clone() const override final;
+
+    void accept(ISampleVisitor* visitor) const override  final { visitor->visit(this); }
+
+    double getRadialExtension() const override final;
+
+    void addFormFactor(const IFormFactor& form_factor, double weight=1.0);
+
+    void setAmbientMaterial(const IMaterial& material) override final;
+
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override final;
+
+#ifndef SWIG
+    //! Calculates and returns a polarized form factor calculation in DWBA
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override final;
+#endif
+
+protected:
+    std::vector<IFormFactor*> m_form_factors;
+    std::vector<double> m_weights;
+};
+
+#endif // FORMFACTORWEIGHTED_H
diff --git a/Core/Particle/IAbstractParticle.h b/Core/Particle/IAbstractParticle.h
new file mode 100644
index 0000000..783017c
--- /dev/null
+++ b/Core/Particle/IAbstractParticle.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/IAbstractParticle.h
+//! @brief     Defines interface IAParticle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IABSTRACTPARTICLE_H
+#define IABSTRACTPARTICLE_H
+
+#include "ICompositeSample.h"
+#include "Vectors3D.h"
+#include <memory>
+
+class IMaterial;
+
+//! Interface for a generic particle.
+//!
+//! Inherited by IParticle and ParticleDistribution.
+
+//! @ingroup samples
+
+class BA_CORE_API_ IAbstractParticle : public ICompositeSample
+{
+public:
+    IAbstractParticle() : m_abundance(1.0) {}
+    virtual ~IAbstractParticle() {}
+
+    virtual IAbstractParticle* clone() const =0;
+    virtual IAbstractParticle* cloneInvertB() const =0;
+
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    //! Sets the refractive index of the ambient material (which influences its scattering power)
+    virtual void setAmbientMaterial(const IMaterial&) =0;
+
+    double getAbundance() const { return m_abundance; }
+    void setAbundance(double abundance) { m_abundance = abundance; }
+
+    virtual const IMaterial* getAmbientMaterial() const =0;
+
+protected:
+    double m_abundance;
+};
+
+#endif // IABSTRACTPARTICLE_H
diff --git a/Core/Particle/IClusteredParticles.h b/Core/Particle/IClusteredParticles.h
new file mode 100644
index 0000000..63a6e43
--- /dev/null
+++ b/Core/Particle/IClusteredParticles.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/IClusteredParticles.h
+//! @brief     Defines class IClusteredParticles.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ICLUSTEREDPARTICLES_H
+#define ICLUSTEREDPARTICLES_H
+
+#include "ICompositeSample.h"
+#include "Vectors3D.h"
+
+class IFormFactor;
+class IRotation;
+
+//! An ordered assembly of particles. Currently, the only child class is Crystal.
+//! @ingroup samples_internal
+
+class BA_CORE_API_ IClusteredParticles : public ICompositeSample
+{
+public:
+    IClusteredParticles() {}
+
+    virtual IClusteredParticles* clone() const =0;
+    virtual IClusteredParticles* cloneInvertB() const =0;
+
+    //! calls the ISampleVisitor's visit method
+    virtual void accept(ISampleVisitor* visitor) const =0;
+
+    virtual void setAmbientMaterial(const IMaterial& material) =0;
+    virtual const IMaterial* getAmbientMaterial() const =0;
+
+    //! Creates a total form factor for the mesocrystal with a specific shape and content
+    //! The bulk content of the mesocrystal is encapsulated by the IClusteredParticles object itself
+    virtual IFormFactor* createTotalFormFactor(
+        const IFormFactor&, const IRotation*, const kvector_t& /*translation*/) const =0;
+
+    //! Composes transformation with existing one
+    virtual void applyRotation(const IRotation&) =delete;
+};
+
+#endif // ICLUSTEREDPARTICLES_H
diff --git a/Core/Particle/IParticle.cpp b/Core/Particle/IParticle.cpp
new file mode 100644
index 0000000..4a3ec69
--- /dev/null
+++ b/Core/Particle/IParticle.cpp
@@ -0,0 +1,87 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/IParticle.cpp
+//! @brief     Implements interface IParticle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IParticle.h"
+#include "BornAgainNamespace.h"
+#include "FormFactorDecoratorPositionFactor.h"
+#include "RealParameter.h"
+
+IFormFactor* IParticle::createFormFactor() const
+{
+    return createTransformedFormFactor(nullptr, kvector_t());
+}
+
+void IParticle::setRotation(const IRotation& rotation)
+{
+    if (mP_rotation)
+        deregisterChild(mP_rotation.get());
+    mP_rotation.reset(rotation.clone());
+    registerChild(mP_rotation.get());
+}
+
+void IParticle::applyRotation(const IRotation& rotation)
+{
+    if (mP_rotation) {
+        deregisterChild(mP_rotation.get());
+        mP_rotation.reset(CreateProduct(rotation, *mP_rotation));
+    } else {
+        mP_rotation.reset(rotation.clone());
+    }
+    m_position = rotation.getTransform3D().transformed(m_position);
+    registerChild(mP_rotation.get());
+}
+
+void IParticle::applyTranslation(kvector_t displacement)
+{
+    m_position += displacement;
+}
+
+IRotation* IParticle::createComposedRotation(const IRotation* p_rotation) const
+{
+    if (p_rotation) {
+        if (mP_rotation)
+            return CreateProduct(*p_rotation, *mP_rotation);
+        else
+            return p_rotation->clone();
+    } else {
+        if (mP_rotation)
+            return mP_rotation->clone();
+        else
+            return nullptr;
+    }
+}
+
+kvector_t IParticle::getComposedTranslation(
+    const IRotation* p_rotation, kvector_t translation) const
+{
+    if (p_rotation) {
+        Transform3D transform = p_rotation->getTransform3D();
+        return translation + transform.transformed(m_position);
+    } else {
+        return translation + m_position;
+    }
+}
+
+void IParticle::registerPosition()
+{
+    registerParameter(BornAgain::PositionX, &m_position[0]).setUnit("nm");
+    registerParameter(BornAgain::PositionY, &m_position[1]).setUnit("nm");
+    registerParameter(BornAgain::PositionZ, &m_position[2]).setUnit("nm");
+}
+
+const IRotation* IParticle::getRotation() const
+{
+    return mP_rotation.get();
+}
diff --git a/Core/Particle/IParticle.h b/Core/Particle/IParticle.h
new file mode 100644
index 0000000..b75c371
--- /dev/null
+++ b/Core/Particle/IParticle.h
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/IParticle.h
+//! @brief     Defines interface IParticle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IPARTICLE_H
+#define IPARTICLE_H
+
+#include "IAbstractParticle.h"
+#include "Rotations.h"
+#include "Vectors3D.h"
+#include <memory>
+
+
+//! Pure virtual base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal.
+//! Provides position/rotation and form factor. Abundance is inherited from IAbstractParticle.
+//!
+//! @ingroup samples
+
+class BA_CORE_API_ IParticle : public IAbstractParticle
+{
+public:
+    virtual ~IParticle() {}
+    virtual IParticle* clone() const =0;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual IParticle* cloneInvertB() const =0;
+
+    //! calls the ISampleVisitor's visit method
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    //! Create a form factor for this particle
+    IFormFactor* createFormFactor() const;
+
+    //! Create a form factor for this particle with an extra transformation
+    virtual IFormFactor* createTransformedFormFactor(
+        const IRotation* p_rotation, kvector_t translation) const =0;
+
+    //! Returns particle position.
+    kvector_t getPosition() const { return m_position; }
+
+    //! Sets particle position.
+    void setPosition(kvector_t position) { m_position = position; }
+
+    //! Sets particle position.
+    void setPosition(double x, double y, double z) { m_position = kvector_t(x, y, z); }
+
+    //! Returns rotation object
+    const IRotation* getRotation() const;
+
+    //! Sets transformation.
+    void setRotation(const IRotation& rotation);
+
+    //! Applies transformation by composing it with the existing one
+    void applyRotation(const IRotation& rotation);
+
+    //! Applies extra translation by adding it to the current one
+    void applyTranslation(kvector_t displacement);
+
+protected:
+    //! Creates a composed IRotation object
+    IRotation* createComposedRotation(const IRotation* p_rotation) const;
+
+    //! Gets a composed translation vector
+    kvector_t getComposedTranslation(const IRotation* p_rotation, kvector_t translation) const;
+
+    //! Registers the three components of its position
+    void registerPosition();
+
+    kvector_t m_position;
+    std::unique_ptr<IRotation> mP_rotation;
+};
+
+#endif // IPARTICLE_H
diff --git a/Core/Particle/MesoCrystal.cpp b/Core/Particle/MesoCrystal.cpp
new file mode 100644
index 0000000..e837391
--- /dev/null
+++ b/Core/Particle/MesoCrystal.cpp
@@ -0,0 +1,116 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/MesoCrystal.cpp
+//! @brief     Implements class MesoCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MesoCrystal.h"
+#include "BornAgainNamespace.h"
+#include "FormFactorDecoratorPositionFactor.h"
+#include "FormFactorDecoratorRotation.h"
+#include "IClusteredParticles.h"
+
+MesoCrystal::MesoCrystal(IClusteredParticles* p_particle_structure, IFormFactor* p_form_factor)
+    : mp_particle_structure(p_particle_structure), mp_meso_form_factor(p_form_factor)
+{
+    initialize();
+}
+
+MesoCrystal::MesoCrystal(const IClusteredParticles& particle_structure, IFormFactor& form_factor)
+    : mp_particle_structure(particle_structure.clone()), mp_meso_form_factor(form_factor.clone())
+{
+    initialize();
+}
+
+MesoCrystal::~MesoCrystal()
+{
+    delete mp_meso_form_factor;
+    delete mp_particle_structure;
+}
+
+MesoCrystal* MesoCrystal::clone() const
+{
+    MesoCrystal* p_result
+        = new MesoCrystal(mp_particle_structure->clone(), mp_meso_form_factor->clone());
+    p_result->setAbundance(m_abundance);
+    if (mP_rotation)
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+    return p_result;
+}
+
+MesoCrystal* MesoCrystal::cloneInvertB() const
+{
+    MesoCrystal* p_result
+        = new MesoCrystal(mp_particle_structure->cloneInvertB(), mp_meso_form_factor->clone());
+    p_result->setAbundance(m_abundance);
+    if (mP_rotation)
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+    return p_result;
+}
+
+void MesoCrystal::accept(ISampleVisitor* visitor) const
+{
+    visitor->visit(this);
+}
+
+void MesoCrystal::setAmbientMaterial(const IMaterial& material)
+{
+    mp_particle_structure->setAmbientMaterial(material);
+}
+
+const IMaterial* MesoCrystal::getAmbientMaterial() const
+{
+    return mp_particle_structure ? mp_particle_structure->getAmbientMaterial() : nullptr;
+}
+
+IFormFactor* MesoCrystal::createTransformedFormFactor(
+    const IRotation* p_rotation, kvector_t translation) const
+{
+    if (!mp_particle_structure || !mp_meso_form_factor)
+        return 0;
+    std::unique_ptr<IRotation> P_total_rotation(createComposedRotation(p_rotation));
+    kvector_t total_position = getComposedTranslation(p_rotation, translation);
+    std::unique_ptr<IFormFactor> P_transformed_meso(createTransformationDecoratedFormFactor(
+        *mp_meso_form_factor, P_total_rotation.get(), total_position));
+    IFormFactor* p_result = mp_particle_structure->createTotalFormFactor(
+        *P_transformed_meso, P_total_rotation.get(), total_position);
+    return p_result;
+}
+
+IFormFactor* MesoCrystal::createTransformationDecoratedFormFactor(
+    const IFormFactor& bare_ff, const IRotation* p_rotation, kvector_t translation) const
+{
+    IFormFactor* p_intermediate;
+    if (p_rotation) {
+        p_intermediate = new FormFactorDecoratorRotation(bare_ff, *p_rotation);
+    } else {
+        p_intermediate = bare_ff.clone();
+    }
+    IFormFactor* p_result;
+    if (translation != kvector_t()) {
+        p_result = new FormFactorDecoratorPositionFactor(*p_intermediate, translation);
+        delete p_intermediate;
+    } else {
+        p_result = p_intermediate;
+    }
+    return p_result;
+}
+
+void MesoCrystal::initialize()
+{
+    setName(BornAgain::MesoCrystalType);
+    registerPosition();
+    registerChild(mp_particle_structure);
+    registerChild(mp_meso_form_factor);
+}
diff --git a/Core/Particle/MesoCrystal.h b/Core/Particle/MesoCrystal.h
new file mode 100644
index 0000000..1239157
--- /dev/null
+++ b/Core/Particle/MesoCrystal.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/MesoCrystal.h
+//! @brief     Defines class MesoCrystal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MESOCRYSTAL_H
+#define MESOCRYSTAL_H
+
+#include "IParticle.h"
+
+class IClusteredParticles;
+class IMaterial;
+
+//! @class MesoCrystal
+//! @ingroup samples
+//! @brief A particle with an internal structure of smaller particles
+
+class BA_CORE_API_ MesoCrystal : public IParticle
+{
+public:
+    MesoCrystal(IClusteredParticles* p_particle_structure, IFormFactor* p_form_factor);
+    MesoCrystal(const IClusteredParticles& particle_structure, IFormFactor& form_factor);
+
+    virtual ~MesoCrystal();
+    virtual MesoCrystal* clone() const;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual MesoCrystal* cloneInvertB() const;
+
+    //! Calls the ISampleVisitor's visit method
+    virtual void accept(ISampleVisitor* visitor) const;
+
+    virtual void setAmbientMaterial(const IMaterial& material);
+    virtual const IMaterial* getAmbientMaterial() const;
+
+    //! Create a form factor for this particle with an extra scattering factor
+    virtual IFormFactor* createTransformedFormFactor(
+        const IRotation* p_rotation, kvector_t translation) const;
+
+    //! @brief get the internal structure, which is in principle unbounded in
+    //! space (e.g. an infinite crystal)
+    const IClusteredParticles* getClusteredParticles() const { return mp_particle_structure; }
+
+private:
+    //! Creates a form factor decorated with the IParticle's position/rotation
+    IFormFactor* createTransformationDecoratedFormFactor(
+        const IFormFactor& bare_ff, const IRotation* p_rotation, kvector_t translation) const;
+
+    IClusteredParticles* mp_particle_structure; //!< Currently, always of type Crystal
+    IFormFactor* mp_meso_form_factor; //!< Outer shape of this mesocrystal
+    void initialize();
+};
+
+#endif // MESOCRYSTAL_H
diff --git a/Core/Particle/Particle.cpp b/Core/Particle/Particle.cpp
new file mode 100644
index 0000000..b1ccf84
--- /dev/null
+++ b/Core/Particle/Particle.cpp
@@ -0,0 +1,158 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/Particle.cpp
+//! @brief     Implements class Particle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Particle.h"
+#include "BornAgainNamespace.h"
+#include "FormFactorDecoratorPositionFactor.h"
+#include "Materials.h"
+
+Particle::Particle()
+{
+    initialize();
+}
+
+Particle::Particle(const IMaterial& p_material)
+    : mP_material(p_material.clone())
+{
+    initialize();
+}
+
+Particle::Particle(const IMaterial& p_material, const IFormFactor& form_factor)
+    : mP_material(p_material.clone())
+    , mP_form_factor(form_factor.clone())
+{
+    initialize();
+    registerChild(mP_form_factor.get());
+}
+
+Particle::Particle(const IMaterial& p_material, const IFormFactor& form_factor,
+                   const IRotation& rotation)
+    : mP_material(p_material.clone())
+    , mP_form_factor(form_factor.clone())
+{
+    initialize();
+    setRotation(rotation);
+    registerChild(mP_form_factor.get());
+}
+
+Particle* Particle::clone() const
+{
+    Particle* p_result = new Particle();
+    p_result->setAbundance(m_abundance);
+    if (mP_form_factor)
+        p_result->setFormFactor(*mP_form_factor);
+    if (mP_material)
+        p_result->setMaterial(*mP_material);
+    if (mP_ambient_material)
+        p_result->setAmbientMaterial(*mP_ambient_material);
+    if (mP_rotation)
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+
+    return p_result;
+}
+
+Particle* Particle::cloneInvertB() const
+{
+    Particle* p_result = new Particle();
+    p_result->setAbundance(m_abundance);
+    if (mP_form_factor)
+        p_result->setFormFactor(*mP_form_factor);
+    if (mP_material)
+        p_result->mP_material.reset(Materials::createInvertedMaterial(mP_material.get()));
+    if (mP_ambient_material)
+        p_result->mP_ambient_material.reset(
+            Materials::createInvertedMaterial(mP_ambient_material.get()));
+    if (mP_rotation)
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+
+    return p_result;
+}
+
+std::string Particle::to_str(int indent) const
+{
+    std::stringstream ss;
+    ss << std::string(4*indent, '.') << " " << getName() << " "
+       << (getMaterial() ? getMaterial()->getName() : "0_MATERIAL") << " "
+       << getRefractiveIndex() << "\n";
+    for( const ISample* child: getChildren() )
+        ss << child->to_str(indent+1);
+    return ss.str();
+}
+
+void Particle::setAmbientMaterial(const IMaterial& material)
+{
+    if(mP_ambient_material.get() != &material)
+        mP_ambient_material.reset(material.clone());
+}
+
+IFormFactor* Particle::createTransformedFormFactor(const IRotation* p_rotation,
+                                                   kvector_t translation) const
+{
+    if (!mP_form_factor)
+        return nullptr;
+    const std::unique_ptr<IRotation> P_total_rotation(createComposedRotation(p_rotation));
+    kvector_t total_position = getComposedTranslation(p_rotation, translation);
+    std::unique_ptr<IFormFactor> P_temp_ff1;
+    if (P_total_rotation)
+        P_temp_ff1.reset(new FormFactorDecoratorRotation(*mP_form_factor, *P_total_rotation));
+    else
+        P_temp_ff1.reset(mP_form_factor->clone());
+    std::unique_ptr<IFormFactor> P_temp_ff2;
+    if (total_position != kvector_t())
+        P_temp_ff2.reset(new FormFactorDecoratorPositionFactor(*P_temp_ff1, total_position));
+    else
+        P_temp_ff2.swap(P_temp_ff1);
+    FormFactorDecoratorMaterial* p_ff = new FormFactorDecoratorMaterial(*P_temp_ff2);
+    if (mP_material) {
+        if (mP_rotation) {
+            const std::unique_ptr<const IMaterial> P_transformed_material(
+                mP_material->createTransformedMaterial(P_total_rotation->getTransform3D()));
+            p_ff->setMaterial(*P_transformed_material);
+        } else
+            p_ff->setMaterial(*mP_material);
+    }
+    if (mP_ambient_material)
+        p_ff->setAmbientMaterial(*mP_ambient_material);
+    return p_ff;
+}
+
+void Particle::setMaterial(const IMaterial& material)
+{
+    if(mP_material.get() != &material)
+        mP_material.reset(material.clone());
+}
+
+complex_t Particle::getRefractiveIndex() const
+{
+    return mP_material ? mP_material->getRefractiveIndex() : 0.0;
+}
+
+void Particle::setFormFactor(const IFormFactor& form_factor)
+{
+    if (&form_factor != mP_form_factor.get()) {
+        if (mP_form_factor)
+            deregisterChild(mP_form_factor.get());
+        mP_form_factor.reset(form_factor.clone());
+        registerChild(mP_form_factor.get());
+    }
+}
+
+void Particle::initialize()
+{
+    setName(BornAgain::ParticleType);
+    registerPosition();
+}
diff --git a/Core/Particle/Particle.h b/Core/Particle/Particle.h
new file mode 100644
index 0000000..d6c271c
--- /dev/null
+++ b/Core/Particle/Particle.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/Particle.h
+//! @brief     Defines class Particle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLE_H
+#define PARTICLE_H
+
+#include "IParticle.h"
+#include "IMaterial.h"
+#include "FormFactorDecoratorMaterial.h"
+#include "FormFactorDecoratorRotation.h"
+
+//! @class Particle
+//! @ingroup samples
+//! @brief A particle with a form factor and refractive index
+
+class BA_CORE_API_ Particle : public IParticle
+{
+public:
+    Particle();
+    Particle(const IMaterial& p_material);
+    Particle(const IMaterial& p_material, const IFormFactor& form_factor);
+    Particle(const IMaterial& p_material, const IFormFactor& form_factor,
+             const IRotation& rotation);
+
+    virtual Particle* clone() const;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual Particle* cloneInvertB() const;
+
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    virtual std::string to_str(int indent=0) const;
+
+    void setAmbientMaterial(const IMaterial& material) final;
+    const IMaterial* getAmbientMaterial() const final { return mP_ambient_material.get(); }
+
+    //! Create a form factor for this particle with an extra scattering factor
+    virtual IFormFactor* createTransformedFormFactor(
+        const IRotation* p_rotation, kvector_t translation) const;
+
+    void setMaterial(const IMaterial& material);
+    const IMaterial* getMaterial() const { return mP_material.get(); }
+
+    complex_t getRefractiveIndex() const;
+
+    void setFormFactor(const IFormFactor& form_factor);
+    const IFormFactor* getFormFactor() const { return mP_form_factor.get(); }
+
+protected:
+    std::unique_ptr<IMaterial> mP_material;
+    std::unique_ptr<IMaterial> mP_ambient_material;
+    std::unique_ptr<IFormFactor> mP_form_factor;
+private:
+    void initialize();
+};
+
+#endif // PARTICLE_H
diff --git a/Core/Particle/ParticleComposition.cpp b/Core/Particle/ParticleComposition.cpp
new file mode 100644
index 0000000..e7b4917
--- /dev/null
+++ b/Core/Particle/ParticleComposition.cpp
@@ -0,0 +1,171 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/ParticleComposition.cpp
+//! @brief     Implements class ParticleComposition.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleComposition.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "FormFactorWeighted.h"
+#include "Materials.h"
+#include "ParticleDistribution.h"
+
+ParticleComposition::ParticleComposition()
+{
+    initialize();
+}
+
+ParticleComposition::ParticleComposition(const IParticle& particle)
+{
+    initialize();
+    addParticle( particle, kvector_t(0.0, 0.0, 0.0) );
+}
+
+ParticleComposition::ParticleComposition(const IParticle &particle, kvector_t position)
+{
+    initialize();
+    addParticle(particle, position);
+}
+
+ParticleComposition::ParticleComposition(const IParticle& particle,
+        std::vector<kvector_t> positions)
+{
+    initialize();
+    addParticles(particle, positions);
+}
+
+ParticleComposition::~ParticleComposition()
+{
+    for (size_t index=0; index<m_particles.size(); ++index)
+        delete m_particles[index];
+}
+
+ParticleComposition* ParticleComposition::clone() const
+{
+    ParticleComposition* p_result = new ParticleComposition();
+    p_result->setAbundance(m_abundance);
+    for (size_t index=0; index<m_particles.size(); ++index)
+        p_result->addParticle(*m_particles[index]);
+    p_result->setAmbientMaterial(*getAmbientMaterial());
+    if (mP_rotation)
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+    return p_result;
+}
+
+ParticleComposition* ParticleComposition::cloneInvertB() const
+{
+    ParticleComposition* p_result = new ParticleComposition();
+    p_result->setAbundance(m_abundance);
+    for (size_t index=0; index<m_particles.size(); ++index)
+        p_result->addParticlePointer(m_particles[index]->cloneInvertB());
+
+    if(getAmbientMaterial())
+        p_result->setAmbientMaterial(*Materials::createInvertedMaterial(getAmbientMaterial()));
+    if (mP_rotation)
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+    return p_result;
+}
+
+void ParticleComposition::addParticle(const IParticle &particle)
+{
+    checkParticleType(particle);
+    IParticle* np = particle.clone();
+    registerChild(np);
+    m_particles.push_back(np);
+}
+
+void ParticleComposition::addParticle(const IParticle& particle, kvector_t position)
+{
+    checkParticleType(particle);
+    IParticle* np = particle.clone();
+    np->applyTranslation(position);
+    registerChild(np);
+    m_particles.push_back(np);
+}
+
+// Please note, that positions is not const reference here. This is intentionally to
+// python lists to std::vector
+void ParticleComposition::addParticles(const IParticle& particle,
+        std::vector<kvector_t > positions)
+{
+    for (size_t i=0; i<positions.size(); ++i)
+        addParticle(particle, positions[i]);
+}
+
+void ParticleComposition::setAmbientMaterial(const IMaterial& material)
+{
+    for (size_t index=0; index<m_particles.size(); ++index)
+        m_particles[index]->setAmbientMaterial(material);
+}
+
+const IMaterial* ParticleComposition::getAmbientMaterial() const
+{
+    if (m_particles.size()==0) return 0;
+    return m_particles[0]->getAmbientMaterial();
+}
+
+IFormFactor*
+ParticleComposition::createTransformedFormFactor(const IRotation* p_rotation,
+                                                 kvector_t translation) const
+{
+    if (m_particles.size() == 0)
+        return 0;
+    const std::unique_ptr<IRotation> P_total_rotation(createComposedRotation(p_rotation));
+    kvector_t total_position = getComposedTranslation(p_rotation, translation);
+    FormFactorWeighted* p_result = new FormFactorWeighted();
+    for (size_t index = 0; index < m_particles.size(); ++index) {
+        const std::unique_ptr<IFormFactor> P_particle_ff(
+            m_particles[index]->createTransformedFormFactor(P_total_rotation.get(),
+                                                            total_position));
+        p_result->addFormFactor(*P_particle_ff);
+    }
+    return p_result;
+}
+
+const IParticle* ParticleComposition::getParticle(size_t index) const
+{
+    return m_particles[check_index(index)];
+}
+
+kvector_t ParticleComposition::getParticlePosition(size_t index) const
+{
+    return m_particles[check_index(index)]->getPosition();
+}
+
+size_t ParticleComposition::check_index(size_t index) const
+{
+    return index < m_particles.size() ? index : throw Exceptions::OutOfBoundsException(
+        "ParticleComposition::check_index() -> Index is out of bounds");
+}
+
+void ParticleComposition::checkParticleType(const IParticle &p_particle)
+{
+    const ParticleDistribution* p_distr = dynamic_cast<const ParticleDistribution*>(&p_particle);
+    if (p_distr)
+        throw Exceptions::ClassInitializationException("ParticleComposition::checkParticleType: "
+                                                       "cannot add ParticleDistribution!");
+}
+
+void ParticleComposition::addParticlePointer(IParticle* p_particle)
+{
+    registerChild(p_particle);
+    m_particles.push_back(p_particle);
+}
+
+void ParticleComposition::initialize()
+{
+    setName(BornAgain::ParticleCompositionType);
+    registerPosition();
+}
diff --git a/Core/Particle/ParticleComposition.h b/Core/Particle/ParticleComposition.h
new file mode 100644
index 0000000..bad4c97
--- /dev/null
+++ b/Core/Particle/ParticleComposition.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/ParticleComposition.h
+//! @brief     Defines class ParticleComposition.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLECOMPOSITION_H
+#define PARTICLECOMPOSITION_H
+
+#include "IParticle.h"
+
+class IMaterial;
+
+//! A composition of particles at fixed positions
+//! @ingroup samples
+
+class BA_CORE_API_ ParticleComposition : public IParticle
+{
+public:
+    ParticleComposition();
+    explicit ParticleComposition(const IParticle& particle);
+    ParticleComposition(const IParticle& particle, kvector_t position);
+    ParticleComposition(const IParticle& particle, std::vector<kvector_t > positions);
+
+    virtual ~ParticleComposition();
+    virtual ParticleComposition* clone() const;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual ParticleComposition* cloneInvertB() const;
+
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    void addParticle(const IParticle& particle);
+    void addParticle(const IParticle& particle, kvector_t  position);
+    void addParticles(const IParticle& particle, std::vector<kvector_t > positions);
+
+    virtual void setAmbientMaterial(const IMaterial& material);
+    virtual const IMaterial* getAmbientMaterial() const;
+
+    //! Create a form factor for this particle with an extra scattering factor
+    virtual IFormFactor* createTransformedFormFactor(const IRotation* p_rotation,
+                                                     kvector_t translation) const;
+
+    //! Returns number of different particles
+    size_t getNbrParticles() const { return m_particles.size(); }
+
+    //! Returns particle with given index
+    const IParticle* getParticle(size_t index) const;
+
+    kvector_t getParticlePosition(size_t index) const;
+
+private:
+    size_t check_index(size_t index) const;
+
+    //! Returns true if particle's type is suitable for adding
+    void checkParticleType(const IParticle& p_particle);
+
+    //! For internal use in cloneInvertB():
+    void addParticlePointer(IParticle* p_particle);
+
+    std::vector<IParticle*> m_particles;
+    void initialize();
+};
+
+#endif // PARTICLECOMPOSITION_H
diff --git a/Core/Particle/ParticleCoreShell.cpp b/Core/Particle/ParticleCoreShell.cpp
new file mode 100644
index 0000000..48c7d8c
--- /dev/null
+++ b/Core/Particle/ParticleCoreShell.cpp
@@ -0,0 +1,129 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/ParticleCoreShell.cpp
+//! @brief     Implements class ParticleCoreShell.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleCoreShell.h"
+#include "BornAgainNamespace.h"
+#include "FormFactorWeighted.h"
+#include "Materials.h"
+#include "Particle.h"
+
+ParticleCoreShell::ParticleCoreShell(
+    const Particle& shell, const Particle& core, kvector_t relative_core_position)
+    : mp_shell { nullptr }, mp_core { nullptr }
+{
+    setName(BornAgain::ParticleCoreShellType);
+    registerPosition();
+    addAndRegisterCore(core, relative_core_position);
+    addAndRegisterShell(shell);
+}
+
+ParticleCoreShell::~ParticleCoreShell()
+{
+    delete mp_shell;
+    delete mp_core;
+}
+
+ParticleCoreShell* ParticleCoreShell::clone() const
+{
+    ParticleCoreShell* p_result =
+            new ParticleCoreShell(*mp_shell, *mp_core, kvector_t(0.0, 0.0, 0.0));
+    p_result->setAbundance(m_abundance);
+    p_result->setAmbientMaterial(*getAmbientMaterial());
+    if (mP_rotation.get())
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+    return p_result;
+}
+
+ParticleCoreShell* ParticleCoreShell::cloneInvertB() const
+{
+    ParticleCoreShell* p_result = new ParticleCoreShell();
+    p_result->setAbundance(m_abundance);
+    p_result->mp_shell = this->mp_shell->cloneInvertB();
+    p_result->mp_core = this->mp_core->cloneInvertB();
+    p_result->setAmbientMaterial( *Materials::createInvertedMaterial(getAmbientMaterial()) );
+    if (mP_rotation.get()) {
+        p_result->setRotation(*mP_rotation);
+    }
+    p_result->setPosition(m_position);
+    return p_result;
+}
+
+void ParticleCoreShell::setAmbientMaterial(const IMaterial& material)
+{
+    mp_shell->setAmbientMaterial(material);
+}
+
+const IMaterial* ParticleCoreShell::getAmbientMaterial() const
+{
+    if (!mp_shell) return 0;
+    return mp_shell->getAmbientMaterial();
+}
+
+IFormFactor* ParticleCoreShell::createTransformedFormFactor(const IRotation* p_rotation,
+                                                            kvector_t translation) const
+{
+    if (!mp_core || !mp_shell)
+        return nullptr;
+    std::unique_ptr<FormFactorWeighted> P_result{ new FormFactorWeighted() };
+    std::unique_ptr<IRotation> P_total_rotation { createComposedRotation(p_rotation) };
+    kvector_t total_position = getComposedTranslation(p_rotation, translation);
+
+    // shell form factor
+    std::unique_ptr<IFormFactor> P_ff_shell{ mp_shell->createTransformedFormFactor(
+        P_total_rotation.get(), total_position) };
+    if (!P_ff_shell)
+        return nullptr;
+    P_result->addFormFactor(*P_ff_shell, 1.0);
+
+    // core form factor
+    std::unique_ptr<Particle> P_core_clone { mp_core->clone() };
+    P_core_clone->setAmbientMaterial(*mp_shell->getMaterial());
+    std::unique_ptr<IFormFactor> P_ff_core{ P_core_clone->createTransformedFormFactor(
+        P_total_rotation.get(), total_position) };
+    if (!P_ff_core)
+        return nullptr;
+    P_result->addFormFactor(*P_ff_core, 1.0);
+
+    return P_result.release();
+}
+
+void ParticleCoreShell::addAndRegisterCore(const Particle &core, kvector_t relative_core_position)
+{
+    if(mp_core) {
+        deregisterChild(mp_core);
+        delete mp_core;
+    }
+    mp_core = core.clone();
+    mp_core->applyTranslation(relative_core_position);
+    registerChild(mp_core);
+}
+
+
+void ParticleCoreShell::addAndRegisterShell(const Particle &shell)
+{
+    if(mp_shell) {
+        deregisterChild(mp_shell);
+        delete mp_shell;
+    }
+    mp_shell = shell.clone();
+    registerChild(mp_shell);
+}
+
+ParticleCoreShell::ParticleCoreShell()
+    : mp_shell { nullptr }, mp_core { nullptr }
+{
+    setName(BornAgain::ParticleCoreShellType);
+}
diff --git a/Core/Particle/ParticleCoreShell.h b/Core/Particle/ParticleCoreShell.h
new file mode 100644
index 0000000..d815b73
--- /dev/null
+++ b/Core/Particle/ParticleCoreShell.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/ParticleCoreShell.h
+//! @brief     Defines ParticleCoreShell.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLECORESHELL_H
+#define PARTICLECORESHELL_H
+
+#include "IParticle.h"
+
+class IMaterial;
+class Particle;
+
+//! A particle with a core/shell geometry.
+//! @ingroup samples
+
+class BA_CORE_API_ ParticleCoreShell : public IParticle
+{
+public:
+    ParticleCoreShell(const Particle& shell, const Particle& core,
+            kvector_t relative_core_position=kvector_t(0.0, 0.0, 0.0));
+    virtual ~ParticleCoreShell();
+    virtual ParticleCoreShell* clone() const;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual ParticleCoreShell* cloneInvertB() const;
+
+    //! Calls the ISampleVisitor's visit method
+    virtual void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    //! Sets the refractive index of the ambient material (which influences its scattering power)
+    virtual void setAmbientMaterial(const IMaterial& material);
+    virtual const IMaterial* getAmbientMaterial() const;
+
+    //! Create a form factor for this particle with an extra scattering factor
+    virtual IFormFactor* createTransformedFormFactor(const IRotation* p_rotation,
+                                                     kvector_t translation) const;
+
+    //! Returns the core particle
+    const Particle* getCoreParticle() const { return mp_core; }
+
+    //! Returns the shell particle
+    const Particle* getShellParticle() const { return mp_shell; }
+
+protected:
+    void addAndRegisterCore(const Particle &core, kvector_t relative_core_position);
+    void addAndRegisterShell(const Particle &shell);
+
+    ParticleCoreShell();
+    Particle* mp_shell;
+    Particle* mp_core;
+};
+
+#endif // PARTICLECORESHELL_H
diff --git a/Core/Particle/ParticleDistribution.cpp b/Core/Particle/ParticleDistribution.cpp
new file mode 100644
index 0000000..fdfef3b
--- /dev/null
+++ b/Core/Particle/ParticleDistribution.cpp
@@ -0,0 +1,131 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/ParticleDistribution.cpp
+//! @brief     Implements class ParticleDistribution.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleDistribution.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "IParticle.h"
+#include "ParameterPool.h"
+#include "ParameterSample.h"
+#include "RealParameter.h"
+#include <map>
+
+ParticleDistribution::ParticleDistribution(const IParticle& prototype,
+                                           const ParameterDistribution& par_distr)
+    : m_par_distribution(par_distr)
+{
+    setName(BornAgain::ParticleDistributionType);
+    mP_particle.reset(prototype.clone());
+    registerChild(mP_particle.get());
+}
+
+ParticleDistribution* ParticleDistribution::clone() const
+{
+    ParticleDistribution* p_result
+        = new ParticleDistribution(*mP_particle, m_par_distribution);
+    p_result->setAbundance(m_abundance);
+    return p_result;
+}
+
+ParticleDistribution* ParticleDistribution::cloneInvertB() const
+{
+    throw Exceptions::NotImplementedException("ParticleDistribution::"
+                                              "cloneInvertB: should never be called");
+}
+
+void ParticleDistribution::accept(ISampleVisitor* visitor) const
+{
+    visitor->visit(this);
+}
+
+std::string ParticleDistribution::to_str(int indent) const
+{
+    std::stringstream ss;
+    ss << std::string(4*indent, '.') << " " << getName() << "\n";
+    for( const ISample* child: getChildren() )
+        ss << child->to_str(indent+1);
+    return ss.str();
+}
+void ParticleDistribution::setAmbientMaterial(const IMaterial& material)
+{
+    mP_particle->setAmbientMaterial(material);
+}
+
+const IMaterial* ParticleDistribution::getAmbientMaterial() const
+{
+    return mP_particle->getAmbientMaterial();
+}
+
+void ParticleDistribution::generateParticles(
+        std::vector<const IParticle*>& particle_vector) const
+{
+    std::unique_ptr<ParameterPool> P_pool(createDistributedParameterPool());
+    std::string main_par_name = m_par_distribution.getMainParameterName();
+    std::vector<RealParameter*> main_par_matches
+        = P_pool->getMatchedParameters(main_par_name);
+    if (main_par_matches.size() != 1)
+        throw Exceptions::RuntimeErrorException(
+            "ParticleDistribution::generateParticles: "
+            "main parameter name matches nothing or more than one parameter");
+    RealParameter* main_par = main_par_matches[0];
+    double main_par_value = main_par->getValue();
+    std::vector<ParameterSample> main_par_samples = m_par_distribution.generateSamples();
+    std::vector<std::string> linked_par_names = m_par_distribution.getLinkedParameterNames();
+    std::map<std::string, double> linked_par_ratio_map;
+    for (size_t i = 0; i < linked_par_names.size(); ++i) {
+        std::vector<RealParameter*> linked_par_matches
+            = P_pool->getMatchedParameters(linked_par_names[i]);
+        if (linked_par_matches.size() != 1)
+            throw Exceptions::RuntimeErrorException(
+                "ParticleDistribution::generateParticles: "
+                "linked parameter name matches nothing or more than one parameter");
+        RealParameter* linked_par = linked_par_matches[0];
+        double linked_par_value = linked_par->getValue();
+        double linked_ratio = main_par_value == 0 ? 1.0 : linked_par_value / main_par_value;
+        linked_par_ratio_map[linked_par_names[i]] = linked_ratio;
+    }
+    for (size_t i = 0; i < main_par_samples.size(); ++i) {
+        ParameterSample main_sample = main_par_samples[i];
+        double particle_abundance = getAbundance() * main_sample.weight;
+        IParticle* p_particle_clone = mP_particle->clone();
+        std::unique_ptr<ParameterPool> P_new_pool(p_particle_clone->createParameterTree());
+        int changed = P_new_pool->setMatchedParametersValue(main_par_name, main_sample.value);
+        if (changed != 1)
+            throw Exceptions::RuntimeErrorException(
+                "ParticleDistribution::generateParticles: "
+                "main parameter name matches nothing or more than one parameter");
+        for (std::map<std::string, double>::const_iterator it = linked_par_ratio_map.begin();
+             it != linked_par_ratio_map.end(); ++it) {
+            double new_linked_value = main_sample.value * it->second;
+            changed = P_new_pool->setMatchedParametersValue(it->first, new_linked_value);
+            if (changed != 1)
+                throw Exceptions::RuntimeErrorException(
+                    "ParticleDistribution::generateParticles: "
+                    "linked parameter name matches nothing or more than one parameter");
+        }
+        p_particle_clone->setAbundance(particle_abundance);
+        particle_vector.push_back(p_particle_clone);
+    }
+}
+
+ParameterPool* ParticleDistribution::createDistributedParameterPool() const
+{
+    return mP_particle->createParameterTree();
+}
+
+const IParticle* ParticleDistribution::getParticle() const
+{
+    return mP_particle.get();
+}
diff --git a/Core/Particle/ParticleDistribution.h b/Core/Particle/ParticleDistribution.h
new file mode 100644
index 0000000..d89fe31
--- /dev/null
+++ b/Core/Particle/ParticleDistribution.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/ParticleDistribution.h
+//! @brief     Defines class ParticleDistribution.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLEDISTRIBUTION_H
+#define PARTICLEDISTRIBUTION_H
+
+#include "IAbstractParticle.h"
+#include "ParameterDistribution.h"
+
+class IParticle;
+
+//! A particle type that is a parametric distribution of IParticle's.
+//! @ingroup samples
+
+class BA_CORE_API_ ParticleDistribution : public IAbstractParticle
+{
+public:
+    ParticleDistribution(const IParticle& prototype, const ParameterDistribution& par_distr);
+
+    virtual ParticleDistribution* clone() const;
+
+    //! Returns a clone with inverted magnetic fields
+    virtual ParticleDistribution* cloneInvertB() const;
+
+    //! calls the ISampleVisitor's visit method
+    virtual void accept(ISampleVisitor* visitor) const;
+
+    //! Returns textual representation of* this and its descendants.
+    virtual std::string to_str(int indent=0) const;
+
+    //! Sets the refractive index of the ambient material (which influences its
+    //! scattering power)
+    virtual void setAmbientMaterial(const IMaterial& material);
+
+    //! Returns particle's material.
+    virtual const IMaterial* getAmbientMaterial() const;
+
+    //! Initializes list of new particles generated according to a distribution
+    virtual void generateParticles(std::vector<const IParticle* >& particle_vector) const;
+
+    //! Returns the distributed parameter data
+    ParameterDistribution getParameterDistribution() const { return m_par_distribution; }
+
+    //! Returns the parameter pool that can be used for parameter distributions
+    ParameterPool* createDistributedParameterPool() const;
+
+    //! Returns particle.
+    const IParticle* getParticle() const;
+
+private:
+    std::unique_ptr<IParticle> mP_particle;
+    ParameterDistribution m_par_distribution;
+};
+
+#endif // PARTICLEDISTRIBUTION_H
diff --git a/Core/Particle/TRange.h b/Core/Particle/TRange.h
new file mode 100644
index 0000000..31a2f1d
--- /dev/null
+++ b/Core/Particle/TRange.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Particle/TRange.h
+//! @brief     Defines and implements template classes TRange and TSampledRange.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TRANGE_H
+#define TRANGE_H
+
+//! @class TRange
+//! @ingroup tools_internal
+//! @brief An interval [lowerBound..upperBound[.
+
+template <class T> class TRange
+{
+public:
+    TRange(T lowerBound, T upperBound) : m_lower_bound(lowerBound), m_upper_bound(upperBound) {}
+    virtual ~TRange(){}
+
+    T getLowerBound() const { return m_lower_bound; }
+    T getUpperBound() const { return m_upper_bound; }
+    T getDifference() const { return m_upper_bound-m_lower_bound; }
+
+    bool inRange(T value) const { return value >= m_lower_bound && value < m_upper_bound; }
+private:
+    T m_lower_bound, m_upper_bound;
+};
+
+//! An interval [lowerBound..upperBound[, and a number of samples.
+
+template <class T> class TSampledRange : public TRange<T>
+{
+public:
+    TSampledRange(size_t n_samples, T lowerBound, T upperBound)
+        : TRange<T>(lowerBound, upperBound), m_n_samples(n_samples) {}
+
+    size_t getNSamples() const { return m_n_samples; }
+private:
+    size_t m_n_samples;
+};
+
+#endif // TRANGE_H
+
+
diff --git a/Core/Scattering/ICompositeSample.cpp b/Core/Scattering/ICompositeSample.cpp
new file mode 100644
index 0000000..1b3835b
--- /dev/null
+++ b/Core/Scattering/ICompositeSample.cpp
@@ -0,0 +1,92 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ICompositeSample.cpp
+//! @brief     Implements class ICompositeSample.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ICompositeSample.h"
+#include "Exceptions.h"
+#include "StringUsageMap.h"
+#include <algorithm>
+
+ICompositeSample::~ICompositeSample() {}
+
+//! Registers child in the container
+
+void ICompositeSample::registerChild(ISample* sample)
+{
+    if(!sample)
+        throw Exceptions::NullPointerException(
+            "ICompositeSample::registerChild -> Error. Null pointer.");
+    m_samples.push_back(sample);
+}
+
+//! remove registered child from the container
+
+void ICompositeSample::deregisterChild(ISample* sample)
+{
+    auto it = std::find(m_samples.begin(), m_samples.end(), sample);
+    if (it != m_samples.end())
+        m_samples.erase(it);
+}
+
+ISample* ICompositeSample::operator[](size_t index)
+{
+    if (childIndexInRange(index))
+        return m_samples[index];
+    return nullptr;
+}
+
+const ISample* ICompositeSample::operator[](size_t index) const
+{
+    if (childIndexInRange(index))
+        return m_samples[index];
+    return nullptr;
+}
+
+std::vector<const ISample*> ICompositeSample::getChildren() const
+{
+    std::vector<const ISample*> result;
+    for (size_t i=0; i<m_samples.size(); ++i)
+        result.push_back(m_samples[i]);
+    return result;
+}
+
+std::string ICompositeSample::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    std::string new_path
+        = IParameterized::addParametersToExternalPool(path, external_pool, copy_number);
+
+    // We need a mechanism to handle cases with multiple children with the same name.
+    // First run through all direct children and save their names
+    StringUsageMap strUsageMap;
+    for (size_t i = 0; i < m_samples.size(); ++i)
+        strUsageMap.add(new_path + m_samples[i]->getName()); // saving child names
+
+    // Now run through the direct children again and assign a copy number for
+    // all children with the same name
+    StringUsageMap strUsageMap2;
+    for (size_t i = 0; i < m_samples.size(); ++i) {
+        std::string child_name = new_path + m_samples[i]->getName();
+        strUsageMap2.add(child_name);
+        // Copy number starts from 0:
+        int ncopy = strUsageMap2[child_name] - 1;
+
+        // If the child is the only one with that name, we do not want any copy number:
+        if (strUsageMap[child_name] == 1)
+            ncopy = -1;
+
+        m_samples[i]->addParametersToExternalPool(new_path, external_pool, ncopy);
+    }
+    return new_path;
+}
diff --git a/Core/Scattering/ICompositeSample.h b/Core/Scattering/ICompositeSample.h
new file mode 100644
index 0000000..f52cd30
--- /dev/null
+++ b/Core/Scattering/ICompositeSample.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ICompositeSample.h
+//! @brief     Defines interface class ICompositeSample.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ICOMPOSITESAMPLE_H
+#define ICOMPOSITESAMPLE_H
+
+#include "ISample.h"
+
+//! Pure virtual base class for tree-like composite samples.
+//!
+//! Inherited by IAbstractParticle, IClusteredParticle, ILayout, ILayer, IMultiLayer.
+//!
+//! @ingroup samples_internal
+
+class BA_CORE_API_ ICompositeSample : public ISample
+{
+public:
+    ICompositeSample() {}
+    virtual ~ICompositeSample();
+
+    virtual ICompositeSample* clone() const =0;
+
+    virtual void accept(ISampleVisitor* visitor) const =0;
+
+    //! Registers child in the container.
+    void registerChild(ISample* sample);
+
+    //! Removes registered child from the container
+    void deregisterChild(ISample* sample);
+
+    //! Returns child pointer by index (with range checking)
+    ISample* operator[](size_t index);
+
+    //! Returns child pointer by index (with range checking)
+    const ISample* operator[](size_t index) const;
+
+    //! Returns a vector of children (const).
+    std::vector<const ISample*> getChildren() const final;
+
+    //! Returns number of children.
+    size_t size() const final { return m_samples.size(); }
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    virtual std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const;
+
+private:
+    //! Check child index
+    bool childIndexInRange(size_t index) const { return index<m_samples.size(); }
+
+    //! List of registered children.
+    std::vector<ISample*> m_samples;
+};
+
+#endif // ICOMPOSITESAMPLE_H
diff --git a/Core/Scattering/IFormFactor.cpp b/Core/Scattering/IFormFactor.cpp
new file mode 100644
index 0000000..491ecf2
--- /dev/null
+++ b/Core/Scattering/IFormFactor.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/IFormFactor.cpp
+//! @brief     Implements interface class IFormFactor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IFormFactor.h"
+#include "Exceptions.h"
+#include "WavevectorInfo.h"
+
+IFormFactor::~IFormFactor() {}
+
+Eigen::Matrix2cd IFormFactor::evaluatePol(const WavevectorInfo&) const
+{
+    // Throws to prevent unanticipated behaviour
+    throw Exceptions::NotImplementedException(
+        "IFormFactor::evaluatePol: is not implemented by default");
+}
+
+double IFormFactor::getVolume() const
+{
+    WavevectorInfo zero_wavevectors;
+    return std::abs(evaluate(zero_wavevectors));
+}
diff --git a/Core/Scattering/IFormFactor.h b/Core/Scattering/IFormFactor.h
new file mode 100644
index 0000000..8530520
--- /dev/null
+++ b/Core/Scattering/IFormFactor.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/IFormFactor.h
+//! @brief     Defines and implements pure virtual interface IFormFactor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IFORMFACTOR_H
+#define IFORMFACTOR_H
+
+#include "ISample.h"
+#include "Complex.h"
+#include "EigenCore.h"
+
+class IMaterial;
+class ILayerRTCoefficients;
+class WavevectorInfo;
+
+//! Pure virtual base class for all form factors.
+//!
+//! The actual form factor is returned by the complex valued function IFormFactor::evaluate,
+//! which depends on the incoming and outgoing wave vectors ki and kf.
+//! If it only depends on the scattering vector q=ki-kf, then it is a IBornFormFactor.
+//!
+//! Other children besides IBornFormFactor are IFormFactorDecorator, FormFactorWeighted,
+//! FormFactorDWBA, FormFactorDWBAPol and FormFactorCrystal.
+
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ IFormFactor : public ISample
+{
+public:
+    IFormFactor() {}
+    ~IFormFactor() override;
+    IFormFactor* clone() const override=0;
+    void accept(ISampleVisitor* visitor) const override=0;
+
+    //! Passes the refractive index of the ambient material in which this particle is embedded.
+    virtual void setAmbientMaterial(const IMaterial&) {}
+
+    //! Returns scattering amplitude for complex wavevectors ki, kf.
+    virtual complex_t evaluate(const WavevectorInfo& wavevectors) const=0;
+
+#ifndef SWIG
+    //! Returns scattering amplitude for matrix interactions
+    virtual Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const;
+#endif
+
+    //! Returns the total volume of the particle of this form factor's shape
+    virtual double getVolume() const;
+
+    //! Returns the (approximate in some cases) radial size of the particle of this
+    //! form factor's shape. This is used for SSCA calculations
+    virtual double getRadialExtension() const=0;
+
+    //! Sets reflection/transmission info
+    virtual void setSpecularInfo(const ILayerRTCoefficients*, const ILayerRTCoefficients*) {}
+};
+
+#endif // IFORMFACTOR_H
diff --git a/Core/Scattering/IFormFactorBorn.cpp b/Core/Scattering/IFormFactorBorn.cpp
new file mode 100644
index 0000000..a42f030
--- /dev/null
+++ b/Core/Scattering/IFormFactorBorn.cpp
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/IFormFactorBorn.cpp
+//! @brief     Implements interface class IFormFactorBorn.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IFormFactorBorn.h"
+#include "Exceptions.h"
+#include "ISampleVisitor.h"
+#include "WavevectorInfo.h"
+
+complex_t IFormFactorBorn::evaluate(const WavevectorInfo& wavevectors) const
+{
+    return evaluate_for_q(wavevectors.getQ());
+}
+
+Eigen::Matrix2cd IFormFactorBorn::evaluatePol(const WavevectorInfo &wavevectors) const
+{
+    return evaluate_for_q_pol(wavevectors.getQ());
+}
+
+Eigen::Matrix2cd IFormFactorBorn::evaluate_for_q_pol(const cvector_t q) const
+{
+    return evaluate_for_q(q) * Eigen::Matrix2cd::Identity();
+}
diff --git a/Core/Scattering/IFormFactorBorn.h b/Core/Scattering/IFormFactorBorn.h
new file mode 100644
index 0000000..41ff178
--- /dev/null
+++ b/Core/Scattering/IFormFactorBorn.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/IFormFactorBorn.h
+//! @brief     Defines pure virtual interface class IFormFactorBorn.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IFORMFACTORBORN_H
+#define IFORMFACTORBORN_H
+
+#include "IFormFactor.h"
+#include "Vectors3D.h"
+
+//! Pure virtual base class for Born form factors.
+//!
+//! In contrast to the generic IFormFactor, a Born form factor does not depend
+//! on the incoming and outgoing wave vectors ki and kf, except through their
+//! difference, the scattering vector q=ki-kf.
+
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ IFormFactorBorn : public IFormFactor
+{
+public:
+    IFormFactorBorn() {}
+    ~IFormFactorBorn() override {}
+
+    IFormFactorBorn* clone() const override=0;
+
+    complex_t evaluate(const WavevectorInfo& wavevectors) const override;
+
+#ifndef SWIG
+    Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override;
+#endif
+
+    //! Returns scattering amplitude for complex scattering wavevector q=k_i-k_f.
+    //! This method is public only for convenience of plotting form factors in Python.
+    virtual complex_t evaluate_for_q(const cvector_t q) const=0;
+
+protected:
+#ifndef SWIG
+    //! Returns scattering amplitude for complex scattering wavevector q=k_i-k_f in case
+    //! of matrix interactions. Default implementation calls evaluate_for_q(q) and
+    //! multiplies with the unit matrix.
+    virtual Eigen::Matrix2cd  evaluate_for_q_pol(const cvector_t q) const;
+#endif
+};
+
+#ifdef POLYHEDRAL_DIAGNOSTIC
+//! Information about the latest form factor evaluation. Not thread-safe.
+//! Used only by external test program.
+class Diagnosis {
+public:
+    int maxOrder;
+    int nExpandedFaces;
+    int debmsg;
+    bool request_convergence;
+    bool operator!=( const Diagnosis& other ) const {
+        return maxOrder!=other.maxOrder || nExpandedFaces!=other.nExpandedFaces; }
+    friend std::ostream& operator<< (std::ostream& stream, const Diagnosis& diag) {
+        return stream<<" ["<<diag.nExpandedFaces<<":"<<diag.maxOrder<<"]";
+    }
+};
+#endif
+
+#endif // IFORMFACTORBORN_H
diff --git a/Core/Scattering/ISample.cpp b/Core/Scattering/ISample.cpp
new file mode 100644
index 0000000..fcb3420
--- /dev/null
+++ b/Core/Scattering/ISample.cpp
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ISample.cpp
+//! @brief     Implements class ISample.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ISample.h"
+#include "Exceptions.h"
+#include "ParameterPool.h"
+#include <sstream>
+
+ISample* ISample::cloneInvertB() const
+{
+    throw Exceptions::NotImplementedException(
+        "ISample::cloneInvertB() -> Error! Method is not implemented");
+}
+
+std::string ISample::to_str(int indent) const
+{
+    std::stringstream ss;
+    ss << std::string(4*indent, '.') << " " << getName() << " " << *getParameterPool() << "\n";
+    for( const ISample* child: getChildren() )
+        ss << child->to_str(indent+1);
+    return ss.str();
+}
+
+std::vector<const IMaterial*> ISample::containedMaterials() const
+{
+    std::vector<const IMaterial*> result;
+    if( const IMaterial* material = getMaterial() )
+        result.push_back( material );
+    if( const IMaterial* material = getAmbientMaterial() )
+        result.push_back( material );
+    for( const ISample* child: getChildren() )
+        for( const IMaterial* material: child->containedMaterials() )
+            result.push_back( material );
+    return result;
+}
diff --git a/Core/Scattering/ISample.h b/Core/Scattering/ISample.h
new file mode 100644
index 0000000..a40ce97
--- /dev/null
+++ b/Core/Scattering/ISample.h
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ISample.h
+//! @brief     Defines interface class ISample.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISAMPLE_H
+#define ISAMPLE_H
+
+#include "ICloneable.h"
+#include "IParameterized.h"
+#include "ISampleVisitor.h"
+#include <vector>
+
+class IMaterial;
+
+//! Pure virtual base class for sample components and properties related to scattering.
+//!
+//! Inherited by ICompositeSample, IFormFactor, IInterferenceFunction, IRoughness, IRotation.
+//! So it is much more basic and abstract than the name "ISample" suggests.
+//!
+//! Since ICompositeSample contains a vector of ISample's, we provide here some machinery
+//! for iterating through a tree (getMaterial, containedMaterials, containedSubclasses, ..).
+//! The functions getChildren and size, completely trivial here, become meaningful
+//! through their overloads in ICompositeSample.
+
+//! @ingroup samples_internal
+
+class BA_CORE_API_ ISample : public ICloneable, public IParameterized
+{
+public:
+    //! Returns a clone of this ISample object.
+    ISample* clone() const override=0;
+
+    //! Returns a clone with inverted magnetic fields.
+    virtual ISample* cloneInvertB() const;
+
+    //! Calls the ISampleVisitor's visit method.
+    virtual void accept(ISampleVisitor* p_visitor) const=0;
+
+    //! Returns textual representation of this and its descendants.
+    virtual std::string to_str(int indent=0) const;
+
+    //! Returns nullptr, unless overwritten to return a specific material.
+    virtual const IMaterial* getMaterial() const { return nullptr; }
+
+    //! Returns nullptr, unless overwritten to return a specific material.
+    virtual const IMaterial* getAmbientMaterial() const { return nullptr; }
+
+    //! Returns set of unique materials contained in this ISample.
+    std::vector<const IMaterial*> containedMaterials() const;
+
+    //! Returns a vector of children.
+    virtual std::vector<const ISample*> getChildren() const { return {}; }
+
+    //! Returns number of children.
+    virtual size_t size() const { return 0; }
+
+    template<class T> std::vector<const T*> containedSubclass() const;
+};
+
+//! Returns vector of children of type T.
+template<class T>
+std::vector<const T*> ISample::containedSubclass() const
+{
+    std::vector<const T*> result;
+    if( const T* t = dynamic_cast<const T*>(this) )
+        result.push_back( t );
+    for( const ISample* child: getChildren() )
+        for( const T* t: child->containedSubclass<T>() )
+            result.push_back( t );
+    return result;
+}
+
+#endif // ISAMPLE_H
diff --git a/Core/Scattering/ISampleIteratorStrategy.cpp b/Core/Scattering/ISampleIteratorStrategy.cpp
new file mode 100644
index 0000000..8fa586e
--- /dev/null
+++ b/Core/Scattering/ISampleIteratorStrategy.cpp
@@ -0,0 +1,109 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ISampleIteratorStrategy.cpp
+//! @brief     Implements strategies for the class SampleTreeIterator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ISampleIteratorStrategy.h"
+#include "Exceptions.h"
+#include "SampleTreeIterator.h"
+
+SampleIteratorPreorderStrategy::SampleIteratorPreorderStrategy()
+{
+}
+
+SampleIteratorPreorderStrategy *SampleIteratorPreorderStrategy::clone() const
+{
+    return new SampleIteratorPreorderStrategy();
+}
+
+SampleIteratorPreorderStrategy::~SampleIteratorPreorderStrategy()
+{
+}
+
+IteratorMemento SampleIteratorPreorderStrategy::first(const ISample *p_root)
+{
+    IteratorMemento iterator_stack;
+    iterator_stack.push_state( IteratorState(p_root) );
+    return iterator_stack;
+}
+
+void SampleIteratorPreorderStrategy::next(IteratorMemento &iterator_stack) const
+{
+    const ISample *p_sample = iterator_stack.getCurrent();
+    if( !p_sample ) {
+        throw Exceptions::NullPointerException("CompositeIteratorPreorderStrategy::next(): "
+                                   "Error! Null object in the tree of objects");
+    }
+    std::vector<const ISample*> children = p_sample->getChildren();
+    if (children.size()>0) {
+        iterator_stack.push_state( IteratorState(children) );
+        return;
+    }
+    iterator_stack.next();
+    while ( !iterator_stack.empty() && iterator_stack.get_state().isEnd() )
+    {
+        iterator_stack.pop_state();
+        if ( !iterator_stack.empty() ) iterator_stack.next();
+    }
+}
+
+bool SampleIteratorPreorderStrategy::isDone(IteratorMemento &iterator_stack) const
+{
+    return iterator_stack.empty();
+}
+
+
+SampleIteratorPostorderStrategy::SampleIteratorPostorderStrategy()
+{
+}
+
+SampleIteratorPostorderStrategy *SampleIteratorPostorderStrategy::clone() const
+{
+    return new SampleIteratorPostorderStrategy();
+}
+
+SampleIteratorPostorderStrategy::~SampleIteratorPostorderStrategy()
+{
+}
+
+IteratorMemento SampleIteratorPostorderStrategy::first(const ISample *p_root)
+{
+    IteratorMemento iterator_stack;
+    iterator_stack.push_state( IteratorState(p_root) );
+    std::vector<const ISample *> children = p_root->getChildren();
+    while (children.size()>0) {
+        iterator_stack.push_state( IteratorState(children) );
+        children = iterator_stack.getCurrent()->getChildren();
+    }
+    return iterator_stack;
+}
+
+void SampleIteratorPostorderStrategy::next(IteratorMemento &iterator_stack) const
+{
+    iterator_stack.next();
+    if ( iterator_stack.get_state().isEnd() )
+    {
+        iterator_stack.pop_state();
+        return;
+    }
+    std::vector<const ISample *> children = iterator_stack.getCurrent()->getChildren();
+    while (children.size()>0) {
+        iterator_stack.push_state( IteratorState(children) );
+        children = iterator_stack.getCurrent()->getChildren();
+    }
+}
+
+bool SampleIteratorPostorderStrategy::isDone(IteratorMemento &iterator_stack) const
+{
+    return iterator_stack.empty();
+}
diff --git a/Core/Scattering/ISampleIteratorStrategy.h b/Core/Scattering/ISampleIteratorStrategy.h
new file mode 100644
index 0000000..6a0db8d
--- /dev/null
+++ b/Core/Scattering/ISampleIteratorStrategy.h
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ISampleIteratorStrategy.h
+//! @brief     Defines strategies for the class SampleTreeIterator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISAMPLEITERATORSTRATEGY_H
+#define ISAMPLEITERATORSTRATEGY_H
+
+#include "ISample.h"
+
+class IteratorMemento;
+
+class BA_CORE_API_ ISampleIteratorStrategy
+{
+public:
+    virtual ~ISampleIteratorStrategy() {}
+
+    virtual ISampleIteratorStrategy* clone() const=0;
+
+    virtual IteratorMemento first(const ISample* p_root)=0;
+    virtual void next(IteratorMemento &iterator_stack) const=0;
+    virtual bool isDone(IteratorMemento &iterator_stack) const=0;
+};
+
+class BA_CORE_API_ SampleIteratorPreorderStrategy : public ISampleIteratorStrategy
+{
+public:
+    SampleIteratorPreorderStrategy();
+
+    virtual SampleIteratorPreorderStrategy* clone() const;
+
+    virtual ~SampleIteratorPreorderStrategy();
+    virtual IteratorMemento first(const ISample* p_root);
+    virtual void next(IteratorMemento &iterator_stack) const;
+    virtual bool isDone(IteratorMemento &iterator_stack) const;
+};
+
+class BA_CORE_API_ SampleIteratorPostorderStrategy : public ISampleIteratorStrategy
+{
+public:
+    SampleIteratorPostorderStrategy();
+
+    virtual SampleIteratorPostorderStrategy* clone() const;
+
+    virtual ~SampleIteratorPostorderStrategy();
+    virtual IteratorMemento first(const ISample* p_root);
+    virtual void next(IteratorMemento &iterator_stack) const;
+    virtual bool isDone(IteratorMemento &iterator_stack) const;
+};
+
+#endif // ISAMPLEITERATORSTRATEGY_H
diff --git a/Core/Scattering/ISampleVisitor.cpp b/Core/Scattering/ISampleVisitor.cpp
new file mode 100644
index 0000000..6891202
--- /dev/null
+++ b/Core/Scattering/ISampleVisitor.cpp
@@ -0,0 +1,475 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ISampleVisitor.cpp
+//! @brief     Implements class ISampleVisitor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ISampleIteratorStrategy.h"
+#include "Exceptions.h"
+#include "SampleTreeIterator.h"
+
+void VisitSampleTreePreorder(const ISample& sample, ISampleVisitor& visitor)
+{
+    SampleTreeIterator<SampleIteratorPreorderStrategy> it(&sample);
+    it.first();
+    while (!it.isDone()) {
+        visitor.setLevel(it.getLevel());
+        const ISample *child = it.getCurrent();
+        child->accept(&visitor);
+        it.next();
+    }
+}
+
+void VisitSampleTreePostorder(const ISample& sample, ISampleVisitor& visitor)
+{
+    SampleTreeIterator<SampleIteratorPostorderStrategy> it(&sample);
+    it.first();
+    while (!it.isDone()) {
+        visitor.setLevel(it.getLevel());
+        const ISample *child = it.getCurrent();
+        child->accept(&visitor);
+        it.next();
+    }
+}
+
+void ISampleVisitor::visit(const ISample*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const ISample*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const ICompositeSample*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const ICompositeSample*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IClusteredParticles*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IClusteredParticles*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const Crystal*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const Crystal*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const ILayout*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IDecoration*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const ParticleLayout*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const ParticleLayout*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const Layer*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const Layer*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const LayerInterface*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const LayerInterface*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const MultiLayer*)
+{
+    throw Exceptions::NotImplementedException(
+                "ISampleVisitor::visit(const MultiLayer*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IAbstractParticle*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IAbstractParticle*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IParticle*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IParticle*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const Particle*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const Particle*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const ParticleDistribution*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const ParticleDistribution*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const ParticleComposition*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const ParticleComposition*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const MesoCrystal*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const MesoCrystal*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const ParticleCoreShell*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const ParticleCoreShell*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IFormFactor*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IFormFactor*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDWBAPol*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDWBAPol*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorWeighted*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorWeighted*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IFormFactorBorn*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IFormFactorBorn*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorAnisoPyramid*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorAnisoPyramid*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorBox*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorBox*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorCone*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorCone*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorCone6*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorCone6*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorCuboctahedron*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorCuboctahedron*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorCrystal*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorCrystal*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorCylinder*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorCylinder*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDodecahedron*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDodecahedron*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorEllipsoidalCylinder*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorEllipsoid*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorFullSphere*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorFullSphere*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorFullSpheroid*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorFullSpheroid*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorGauss*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorGauss*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorHemiEllipsoid*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit const FormFactorHemiEllipsoid*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorIcosahedron*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorIcosahedron*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorLongBoxGauss*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorLongBoxGauss*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorLongBoxLorentz*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorLongBoxLorentz*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorLorentz*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorLorentz*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorPrism3*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorPrism3*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorPrism6*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorPrism6*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorPyramid*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorPyramid*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorRipple1*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorRipple1*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorRipple2*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorRipple2*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorSphereGaussianRadius*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorSphereGaussianRadius*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorSphereLogNormalRadius*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorSphereLogNormalRadius*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorTetrahedron*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorTetrahedron*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorTrivial*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorTrivial*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorTruncatedCube*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorTruncatedCube*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorTruncatedSphere*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorTruncatedSphere*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorTruncatedSpheroid*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorTruncatedSpheroid*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IFormFactorDecorator*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IFormFactorDecorator*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDWBA*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDWBA*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDecoratorDebyeWaller*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDecoratorDebyeWaller*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDecoratorFactor*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDecoratorFactor*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDecoratorMaterial*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDecoratorMaterial*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDecoratorPositionFactor*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDecoratorPositionFactor "
+        "*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const FormFactorDecoratorRotation*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const FormFactorDecoratorRotation "
+        "*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IInterferenceFunction*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IInterferenceFunction*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const InterferenceFunction1DLattice*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const InterferenceFunction1DLattice*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const InterferenceFunctionRadialParaCrystal*)
+{
+    throw Exceptions::NotImplementedException("ISampleVisitor::visit(const "
+                                  "InterferenceFunctionRadialParaCrystal*) -> Error. Not "
+                                  "implemented.");
+}
+
+void ISampleVisitor::visit(const InterferenceFunction2DLattice*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const InterferenceFunction2DLattice*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const InterferenceFunction2DParaCrystal*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const InterferenceFunction2DParaCrystal "
+        "*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const InterferenceFunctionNone*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const InterferenceFunctionNone*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IRoughness*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IRoughness*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const LayerRoughness*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const LayerRoughness*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const IRotation*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const IRotation*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const RotationX*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const RotationX*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const RotationY*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const RotationY*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const RotationZ*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const RotationZ*) -> Error. Not implemented.");
+}
+
+void ISampleVisitor::visit(const RotationEuler*)
+{
+    throw Exceptions::NotImplementedException(
+        "ISampleVisitor::visit(const RotationEuler*) -> Error. Not implemented.");
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+bool ISampleVisitor::visitEnter(const ICompositeSample*)
+{
+    m_level++;
+    return false;
+}
+
+bool ISampleVisitor::visitLeave(const ICompositeSample*)
+{
+    m_level--;
+    return false;
+}
diff --git a/Core/Scattering/ISampleVisitor.h b/Core/Scattering/ISampleVisitor.h
new file mode 100644
index 0000000..49474e7
--- /dev/null
+++ b/Core/Scattering/ISampleVisitor.h
@@ -0,0 +1,221 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/ISampleVisitor.h
+//! @brief     Defines interface class ISampleVisitor.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISAMPLEVISITOR_H
+#define ISAMPLEVISITOR_H
+
+#include "WinDllMacros.h"
+
+class ISample;
+// - the order according to the hierarchy as reported by IDE
+class ICompositeSample;
+// -
+class IClusteredParticles;
+class Crystal;
+// -
+class ILayout;
+class ParticleLayout;
+// -
+class Layer;
+// -
+class LayerInterface;
+// -
+class MultiLayer;
+// -
+class IAbstractParticle;
+class IParticle;
+class Particle;
+class ParticleDistribution;
+class ParticleComposition;
+class MesoCrystal;
+class ParticleCoreShell;
+// -
+class IFormFactor;
+// -
+class FormFactorDWBAPol;
+// -
+class FormFactorWeighted;
+// -
+class IFormFactorBorn;
+// -
+class FormFactorAnisoPyramid;
+class FormFactorBox;
+class FormFactorCone;
+class FormFactorCone6;
+class FormFactorCuboctahedron;
+class FormFactorCrystal;
+class FormFactorCylinder;
+class FormFactorDodecahedron;
+class FormFactorEllipsoidalCylinder;
+class FormFactorFullSphere;
+class FormFactorFullSpheroid;
+class FormFactorGauss;
+class FormFactorHemiEllipsoid;
+class FormFactorIcosahedron;
+class FormFactorLongBoxGauss;
+class FormFactorLongBoxLorentz;
+class FormFactorLorentz;
+class FormFactorPrism3;
+class FormFactorPrism6;
+class FormFactorPyramid;
+class FormFactorRipple1;
+class FormFactorRipple2;
+class FormFactorSphereGaussianRadius;
+class FormFactorSphereLogNormalRadius;
+class FormFactorTetrahedron;
+class FormFactorTrivial;
+class FormFactorTruncatedCube;
+class FormFactorTruncatedSphere;
+class FormFactorTruncatedSpheroid;
+// -
+class IFormFactorDecorator;
+// -
+class FormFactorDWBA;
+class FormFactorDecoratorDebyeWaller;
+class FormFactorDecoratorFactor;
+class FormFactorDecoratorMaterial;
+class FormFactorDecoratorPositionFactor;
+class FormFactorDecoratorRotation;
+// -
+class IInterferenceFunction;
+class InterferenceFunction1DLattice;
+class InterferenceFunctionRadialParaCrystal;
+class InterferenceFunction2DLattice;
+class InterferenceFunction2DParaCrystal;
+class InterferenceFunctionNone;
+// -
+class IRoughness;
+class LayerRoughness;
+// -
+class IRotation;
+class RotationX;
+class RotationY;
+class RotationZ;
+class RotationEuler;
+
+//! Visitor interface to visit ISample objects.
+//! @ingroup samples_internal
+
+//! From visitor pattern to achieve double dispatch.
+
+class BA_CORE_API_ ISampleVisitor
+{
+public:
+    ISampleVisitor() : m_level(0) {}
+    virtual ~ISampleVisitor(){}
+
+    // visiting methods (the order according to the hierarchy as reported by IDE)
+
+    virtual void visit(const ISample*);
+
+    virtual void visit(const ICompositeSample*);
+
+    virtual void visit(const IClusteredParticles*);
+    virtual void visit(const Crystal*);
+
+    virtual void visit(const ILayout*);
+    virtual void visit(const ParticleLayout*);
+
+    virtual void visit(const Layer*);
+
+    virtual void visit(const LayerInterface*);
+
+    virtual void visit(const MultiLayer*);
+
+    virtual void visit(const IAbstractParticle*);
+    virtual void visit(const IParticle*);
+    virtual void visit(const Particle*);
+    virtual void visit(const ParticleDistribution*);
+    virtual void visit(const ParticleComposition*);
+    virtual void visit(const MesoCrystal*);
+    virtual void visit(const ParticleCoreShell*);
+
+    virtual void visit(const IFormFactor*);
+    virtual void visit(const IFormFactorBorn*);
+    virtual void visit(const IFormFactorDecorator*);
+
+    virtual void visit(const FormFactorAnisoPyramid*);
+    virtual void visit(const FormFactorBox*);
+    virtual void visit(const FormFactorCone*);
+    virtual void visit(const FormFactorCone6*);
+    virtual void visit(const FormFactorCuboctahedron*);
+    virtual void visit(const FormFactorCrystal*);
+    virtual void visit(const FormFactorCylinder*);
+    virtual void visit(const FormFactorDodecahedron*);
+    virtual void visit(const FormFactorEllipsoidalCylinder*);
+    virtual void visit(const FormFactorFullSphere*);
+    virtual void visit(const FormFactorFullSpheroid*);
+    virtual void visit(const FormFactorGauss*);
+    virtual void visit(const FormFactorHemiEllipsoid*);
+    virtual void visit(const FormFactorIcosahedron*);
+    virtual void visit(const FormFactorLongBoxGauss*);
+    virtual void visit(const FormFactorLongBoxLorentz*);
+    virtual void visit(const FormFactorLorentz*);
+    virtual void visit(const FormFactorPrism3*);
+    virtual void visit(const FormFactorPrism6*);
+    virtual void visit(const FormFactorPyramid*);
+    virtual void visit(const FormFactorRipple1*);
+    virtual void visit(const FormFactorRipple2*);
+    virtual void visit(const FormFactorSphereGaussianRadius*);
+    virtual void visit(const FormFactorSphereLogNormalRadius*);
+    virtual void visit(const FormFactorTetrahedron*);
+    virtual void visit(const FormFactorTrivial*);
+    virtual void visit(const FormFactorTruncatedCube*);
+    virtual void visit(const FormFactorTruncatedSphere*);
+    virtual void visit(const FormFactorTruncatedSpheroid*);
+
+    virtual void visit(const FormFactorDWBA*);
+    virtual void visit(const FormFactorDWBAPol*);
+    virtual void visit(const FormFactorWeighted*);
+    virtual void visit(const FormFactorDecoratorDebyeWaller*);
+    virtual void visit(const FormFactorDecoratorFactor*);
+    virtual void visit(const FormFactorDecoratorMaterial*);
+    virtual void visit(const FormFactorDecoratorPositionFactor*);
+    virtual void visit(const FormFactorDecoratorRotation*);
+
+    virtual void visit(const IInterferenceFunction*);
+    virtual void visit(const InterferenceFunction1DLattice*);
+    virtual void visit(const InterferenceFunctionRadialParaCrystal*);
+    virtual void visit(const InterferenceFunction2DLattice*);
+    virtual void visit(const InterferenceFunction2DParaCrystal*);
+    virtual void visit(const InterferenceFunctionNone*);
+
+    virtual void visit(const IRoughness*);
+    virtual void visit(const LayerRoughness*);
+
+    virtual void visit(const IRotation*);
+    virtual void visit(const RotationX*);
+    virtual void visit(const RotationY*);
+    virtual void visit(const RotationZ*);
+    virtual void visit(const RotationEuler*);
+
+    // enter and leave methods
+    bool visitEnter(const ICompositeSample*);
+    bool visitLeave(const ICompositeSample*);
+
+    //! return current level of the visitor in the composite hierarchy
+    int getLevel() const { return m_level; }
+
+    //! set current level of the visitor in the composite hierarchy
+    void setLevel(int level) { m_level = level; }
+
+private:
+    int m_level;
+};
+
+BA_CORE_API_ void VisitSampleTreePreorder(const ISample& sample, ISampleVisitor& visitor);
+BA_CORE_API_ void VisitSampleTreePostorder(const ISample& sample, ISampleVisitor& visitor);
+
+#endif // ISAMPLEVISITOR_H
diff --git a/Core/Scattering/Rotations.cpp b/Core/Scattering/Rotations.cpp
new file mode 100644
index 0000000..ee78476
--- /dev/null
+++ b/Core/Scattering/Rotations.cpp
@@ -0,0 +1,117 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/Rotations.cpp
+//! @brief     Implements IRotation classes.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Rotations.h"
+#include "BornAgainNamespace.h"
+#include "ISampleVisitor.h"
+#include "RealParameter.h"
+
+IRotation* IRotation::createRotation(const Transform3D& transform)
+{
+    double alpha, beta, gamma;
+    transform.calculateEulerAngles(&alpha, &beta, &gamma);
+    Transform3D::ERotationType rot_type = transform.getRotationType();
+    switch (rot_type) {
+    case Transform3D::XAXIS:
+        if (alpha>0.0) beta = -beta;
+        return new RotationX(beta);
+    case Transform3D::YAXIS:
+        if (alpha>0.0 && alpha<3.14) beta = -beta;
+        return new RotationY(beta);
+    case Transform3D::ZAXIS:
+        return new RotationZ(alpha);
+    default:
+        return new RotationEuler(alpha, beta, gamma);
+    }
+}
+
+bool IRotation::isIdentity() const
+{
+    return getTransform3D().isIdentity();
+}
+
+//! Returns concatenated rotation (first right, then left).
+
+IRotation* CreateProduct(const IRotation& left, const IRotation& right)
+{
+    Transform3D tr_left = left.getTransform3D();
+    Transform3D tr_right = right.getTransform3D();
+    IRotation *p_result = IRotation::createRotation(tr_left*tr_right);
+    return p_result;
+}
+
+// --- RotationX --------------------------------------------------------------
+
+RotationX::RotationX(double angle)
+    : m_angle(angle)
+{
+    setName(BornAgain::XRotationType);
+    registerParameter(BornAgain::Angle, &m_angle).setUnit("rad");
+}
+
+Transform3D RotationX::getTransform3D() const
+{
+    return Transform3D::createRotateX(m_angle);
+}
+
+// --- RotationY --------------------------------------------------------------
+
+RotationY::RotationY(double angle)
+    : m_angle(angle)
+{
+    setName(BornAgain::YRotationType);
+    registerParameter(BornAgain::Angle, &m_angle).setUnit("rad");
+}
+
+Transform3D RotationY::getTransform3D() const
+{
+    return Transform3D::createRotateY(m_angle);
+}
+
+// --- RotationZ --------------------------------------------------------------
+
+RotationZ::RotationZ(double angle)
+    : m_angle(angle)
+{
+    setName(BornAgain::ZRotationType);
+    registerParameter(BornAgain::Angle, &m_angle).setUnit("rad");
+}
+
+Transform3D RotationZ::getTransform3D() const
+{
+    return Transform3D::createRotateZ(m_angle);
+}
+
+// --- RotationEuler ----------------------------------------------------------
+
+RotationEuler::RotationEuler(double alpha, double beta, double gamma)
+    : m_alpha(alpha), m_beta(beta), m_gamma(gamma)
+{
+    setName(BornAgain::EulerRotationType);
+    registerParameter(BornAgain::Alpha, &m_alpha).setUnit("rad");
+    registerParameter(BornAgain::Beta, &m_beta  ).setUnit("rad");
+    registerParameter(BornAgain::Gamma, &m_gamma).setUnit("rad");
+}
+
+IRotation* RotationEuler::createInverse() const
+{
+    Transform3D inverse_transform(getTransform3D().getInverse());
+    return createRotation(inverse_transform);
+}
+
+Transform3D RotationEuler::getTransform3D() const
+{
+    return Transform3D::createRotateEuler(m_alpha, m_beta, m_gamma);
+}
diff --git a/Core/Scattering/Rotations.h b/Core/Scattering/Rotations.h
new file mode 100644
index 0000000..f8f84c6
--- /dev/null
+++ b/Core/Scattering/Rotations.h
@@ -0,0 +1,126 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/Rotations.h
+//! @brief     Defines IRotation classes.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ROTATIONS_H
+#define ROTATIONS_H
+
+#include "ISample.h"
+#include "Transform3D.h"
+
+//! @class IRotation
+//! @ingroup samples
+//! @brief An interface for classes representing a rotation
+
+//! must be subclass of sample, because it can be registered as a child in ICompositeSample
+
+class BA_CORE_API_ IRotation : public ISample
+{
+public:
+    static IRotation* createRotation(const Transform3D& transform);
+    virtual ~IRotation() {}
+
+    virtual IRotation* clone() const=0;
+    IRotation* cloneInvertB() const final { return clone(); }
+
+    //! Returns a new IRotation object that is the current object's inverse
+    virtual IRotation* createInverse() const=0;
+
+    //! Calls the ISampleVisitor's visit method
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    //! Returns transformation.
+    virtual Transform3D getTransform3D() const=0;
+
+    //! Returns true if roation matrix is identity matrix (no rotations)
+    virtual bool isIdentity() const;
+};
+
+BA_CORE_API_ IRotation* CreateProduct(const IRotation& left, const IRotation& right);
+
+class BA_CORE_API_ RotationX : public IRotation
+{
+public:
+    RotationX(double angle);
+
+    RotationX* clone() const { return new RotationX(m_angle); }
+    RotationX* createInverse() const { return new RotationX(-m_angle); }
+
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    double getAngle() const { return m_angle; }
+
+    Transform3D getTransform3D() const;
+
+protected:
+    double m_angle;
+};
+
+class BA_CORE_API_ RotationY : public IRotation
+{
+public:
+    RotationY(double angle);
+
+    RotationY* clone() const { return new RotationY(m_angle); }
+    RotationY* createInverse() const { return new RotationY(-m_angle); }
+
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    double getAngle() const { return m_angle; }
+
+    Transform3D getTransform3D() const;
+
+protected:
+    double m_angle;
+};
+
+class BA_CORE_API_ RotationZ : public IRotation
+{
+public:
+    RotationZ(double angle = 0.0);
+
+    RotationZ* clone() const { return new RotationZ(m_angle); }
+    RotationZ* createInverse() const { return new RotationZ(-m_angle); }
+
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    double getAngle() const { return m_angle; }
+
+    Transform3D getTransform3D() const;
+
+protected:
+    double m_angle;
+};
+
+class BA_CORE_API_ RotationEuler : public IRotation
+{
+public:
+    RotationEuler(double alpha, double beta, double gamma);
+
+    RotationEuler* clone() const { return new RotationEuler(m_alpha, m_beta, m_gamma); }
+    IRotation* createInverse() const;
+
+    void accept(ISampleVisitor* visitor) const { visitor->visit(this); }
+
+    double getAlpha() const { return m_alpha; }
+    double getBeta() const { return m_beta; }
+    double getGamma() const { return m_gamma; }
+
+    Transform3D getTransform3D() const;
+
+protected:
+    double m_alpha, m_beta, m_gamma;
+};
+
+#endif // ROTATIONS_H
diff --git a/Core/Scattering/SampleTreeIterator.cpp b/Core/Scattering/SampleTreeIterator.cpp
new file mode 100644
index 0000000..501a38b
--- /dev/null
+++ b/Core/Scattering/SampleTreeIterator.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/SampleTreeIterator.cpp
+//! @brief     Implements class SampleTreeIterator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleTreeIterator.h"
+
+
+
+IteratorState::IteratorState(const ISample *single_element)
+    : m_position(0)
+{
+    m_samples.push_back(single_element);
+}
+
+IteratorState::IteratorState(std::vector<const ISample *> samples)
+    : m_samples(samples)
+    , m_position(0)
+{
+}
+
+
+
diff --git a/Core/Scattering/SampleTreeIterator.h b/Core/Scattering/SampleTreeIterator.h
new file mode 100644
index 0000000..9497d2a
--- /dev/null
+++ b/Core/Scattering/SampleTreeIterator.h
@@ -0,0 +1,142 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/SampleTreeIterator.h
+//! @brief     Defines and classes IteratorState, IteratorMemento and SampleTreeIterator.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLETREEITERATOR_H
+#define SAMPLETREEITERATOR_H
+
+#include "ICompositeSample.h"
+#include <ostream>
+#include <stack>
+
+//! @class IteratorState
+//! @ingroup samples_internal
+//! @brief Holds state of iterator at single level for SampleTreeIterator
+
+class IteratorState
+{
+public:
+    IteratorState(const ISample* single_element);
+    IteratorState(std::vector<const ISample*> samples);
+
+    virtual ~IteratorState() {}
+
+    const ISample* getCurrent() const { return m_samples[m_position]; }
+    bool isEnd() const { return m_position>=m_samples.size(); }
+    void next() { ++m_position; }
+
+    friend std::ostream& operator<<(
+        std::ostream& output_stream, IteratorState const& iterator_state)
+    {
+        return output_stream << "memento state " << iterator_state.m_position << " "
+                             << iterator_state.m_samples.size();
+    }
+
+private:
+    std::vector<const ISample*> m_samples;
+    size_t m_position;
+
+    IteratorState();
+};
+
+//! @class IteratorMemento
+//! @ingroup samples_internal
+//! @brief Holds all iterator states encountered for SampleTreeIterator
+
+class IteratorMemento
+{
+public:
+    IteratorMemento() {}
+    virtual ~IteratorMemento() {}
+
+    void push_state(const IteratorState& state) { m_state_stack.push(state); }
+    void pop_state() { m_state_stack.pop(); }
+    IteratorState& get_state() { return m_state_stack.top(); }
+    bool empty() const { return m_state_stack.empty(); }
+    void reset() { while(!m_state_stack.empty()) m_state_stack.pop(); }
+    const ISample* getCurrent() { return m_state_stack.top().getCurrent(); }
+    void next() { m_state_stack.top().next(); }
+    size_t size() const { return m_state_stack.size(); }
+protected:
+    std::stack<IteratorState > m_state_stack;
+};
+
+
+//! @class SampleTreeIterator
+//! @ingroup samples_internal
+//! @brief Iterator through ISample tree of objects inside ISample object.
+//!
+//! Usage example:
+//!    SampleTreeIterator<Strategy> it(&sample);
+//!    it.first();
+//!    while( !it.is_done() ) {
+//!        ISample *p_sample = it.get_current();
+//!        it.next();
+//!     }
+
+template <class Strategy>
+class BA_CORE_API_ SampleTreeIterator
+{
+public:
+    SampleTreeIterator(const ISample *root);
+    virtual ~SampleTreeIterator() {}
+
+    void first();
+    void next();
+    const ISample* getCurrent();
+    bool isDone() const;
+    size_t getLevel() const;
+protected:
+    Strategy m_strategy;
+    IteratorMemento m_memento_itor;
+    const ISample* mp_root;
+};
+
+template <class Strategy>
+inline SampleTreeIterator<Strategy>::SampleTreeIterator(const ISample *root)
+    : mp_root(root)
+{
+}
+
+template <class Strategy>
+inline void SampleTreeIterator<Strategy>::first()
+{
+    m_memento_itor = m_strategy.first(mp_root);
+}
+
+template <class Strategy>
+inline void SampleTreeIterator<Strategy>::next()
+{
+    m_strategy.next(m_memento_itor);
+}
+
+template <class Strategy>
+inline const ISample *SampleTreeIterator<Strategy>::getCurrent()
+{
+    return m_memento_itor.getCurrent();
+}
+
+template <class Strategy>
+inline bool SampleTreeIterator<Strategy>::isDone() const
+{
+    return m_memento_itor.size()==0;
+}
+
+template <class Strategy>
+inline size_t SampleTreeIterator<Strategy>::getLevel() const
+{
+    return m_memento_itor.size();
+}
+
+#endif // SAMPLETREEITERATOR_H
diff --git a/Core/Scattering/StringUsageMap.h b/Core/Scattering/StringUsageMap.h
new file mode 100644
index 0000000..9ede6d2
--- /dev/null
+++ b/Core/Scattering/StringUsageMap.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Scattering/StringUsageMap.h
+//! @brief     Defines and implements class StringUsageMap.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STRINGUSAGEMAP_H
+#define STRINGUSAGEMAP_H
+
+#include <map>
+#include <string>
+
+//! Counts how often a string is used.
+//! @ingroup tools_internal
+
+class BA_CORE_API_ StringUsageMap
+{
+public:
+    typedef std::map<std::string, int> nstringmap_t;
+    typedef nstringmap_t::iterator iterator_t;
+
+    StringUsageMap(){}
+    ~StringUsageMap(){}
+
+    //! Adds string to the map, or increments usage counter
+    void add(const std::string& name)
+    {
+        m_current_string = name;
+        iterator_t it = m_nstringmap.find(name);
+        if (it != m_nstringmap.end() )
+            it->second++;
+        else
+            m_nstringmap.insert(make_pair(name,1));
+    }
+
+    //! access to the map of strings
+    iterator_t begin() { return m_nstringmap.begin(); }
+    iterator_t end() { return m_nstringmap.end(); }
+    int& operator[](const std::string& name) { return m_nstringmap[name]; }
+
+    //! Returns current string
+    std::string get_current() const { return m_current_string; }
+
+private:
+    std::string m_current_string;
+    nstringmap_t m_nstringmap;
+};
+
+#endif // STRINGUSAGEMAP_H
diff --git a/Core/Simulation/GISASSimulation.cpp b/Core/Simulation/GISASSimulation.cpp
new file mode 100644
index 0000000..c5f9c31
--- /dev/null
+++ b/Core/Simulation/GISASSimulation.cpp
@@ -0,0 +1,149 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/GISASSimulation.cpp
+//! @brief     Implements class Simulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "GISASSimulation.h"
+#include "BornAgainNamespace.h"
+#include "Histogram2D.h"
+#include "IMultiLayerBuilder.h"
+#include "MultiLayer.h"
+#include "SimulationElement.h"
+
+GISASSimulation::GISASSimulation()
+{
+    initialize();
+}
+
+GISASSimulation::GISASSimulation(const MultiLayer& p_sample)
+    : Simulation(p_sample)
+{
+    initialize();
+}
+
+GISASSimulation::GISASSimulation(const std::shared_ptr<IMultiLayerBuilder> p_sample_builder)
+    : Simulation(p_sample_builder)
+{
+    initialize();
+}
+
+GISASSimulation::GISASSimulation(const GISASSimulation& other)
+    : Simulation(other)
+{
+    initialize();
+}
+
+void GISASSimulation::prepareSimulation()
+{
+    if (m_instrument.getDetectorDimension() != 2)
+        throw Exceptions::LogicErrorException("GISASSimulation::prepareSimulation() "
+                "-> Error. The detector was not properly configured.");
+    getInstrument().initDetector();
+    Simulation::prepareSimulation();
+}
+
+int GISASSimulation::numberOfSimulationElements() const
+{
+    return getInstrument().getDetector()->numberOfSimulationElements();
+}
+
+OutputData<double>* GISASSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type) const
+{
+    std::unique_ptr<OutputData<double>> result(
+        m_instrument.createDetectorIntensity(m_sim_elements, units_type));
+    result->setVariability( m_options.getDefaultVariability() );
+    return result.release();
+}
+
+Histogram2D* GISASSimulation::getIntensityData(IDetector2D::EAxesUnits units_type) const
+{
+    const std::unique_ptr<OutputData<double>> data(getDetectorIntensity(units_type));
+    return new Histogram2D(*data);
+}
+
+void GISASSimulation::setBeamParameters(double wavelength, double alpha_i, double phi_i)
+{
+    if (wavelength<=0.0)
+        throw Exceptions::ClassInitializationException(
+            "Simulation::setBeamParameters() -> Error. Incoming wavelength <= 0.");
+    m_instrument.setBeamParameters(wavelength, alpha_i, phi_i);
+}
+
+void GISASSimulation::setDetector(const IDetector2D& detector)
+{
+    m_instrument.setDetector(detector);
+}
+
+void GISASSimulation::setDetectorParameters(size_t n_phi, double phi_min, double phi_max,
+                                            size_t n_alpha, double alpha_min, double alpha_max)
+{
+    m_instrument.setDetectorParameters(n_phi, phi_min, phi_max, n_alpha, alpha_min, alpha_max);
+}
+
+std::string GISASSimulation::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path = IParameterized::addParametersToExternalPool(
+            path, external_pool, copy_number);
+
+    // add parameters of the instrument
+    m_instrument.addParametersToExternalPool(new_path, external_pool, -1);
+
+    new_path = addSimulationParametersToExternalPool(new_path, external_pool);
+
+    return new_path;
+}
+
+void GISASSimulation::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
+{
+    m_instrument.getDetector()->setRegionOfInterest(xlow, ylow, xup, yup);
+}
+
+void GISASSimulation::resetRegionOfInterest()
+{
+    m_instrument.getDetector()->resetRegionOfInterest();
+}
+
+void GISASSimulation::removeMasks()
+{
+    m_instrument.getDetector()->removeMasks();
+}
+
+void GISASSimulation::addMask(const Geometry::IShape2D& shape, bool mask_value)
+{
+    m_instrument.getDetector()->addMask(shape, mask_value);
+}
+
+void GISASSimulation::maskAll()
+{
+    m_instrument.getDetector()->maskAll();
+}
+
+void GISASSimulation::initSimulationElementVector()
+{
+    m_sim_elements = m_instrument.createSimulationElements();
+}
+
+void GISASSimulation::transferResultsToIntensityMap()
+{
+}
+
+void GISASSimulation::updateIntensityMap()
+{
+}
+
+void GISASSimulation::initialize()
+{
+    setName(BornAgain::GISASSimulationType);
+}
diff --git a/Core/Simulation/GISASSimulation.h b/Core/Simulation/GISASSimulation.h
new file mode 100644
index 0000000..6573f1d
--- /dev/null
+++ b/Core/Simulation/GISASSimulation.h
@@ -0,0 +1,108 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/GISASSimulation.h
+//! @brief     Defines class GISASSimulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GISASSIMULATION_H
+#define GISASSIMULATION_H
+
+#include "Simulation.h"
+
+class MultiLayer;
+class IMultiLayerBuilder;
+class IHistogram;
+class Histogram2D;
+
+//! Main class to run a Grazing-Incidence Small-Angle Scattering simulation.
+//! @ingroup simulation
+
+class BA_CORE_API_ GISASSimulation : public Simulation
+{
+public:
+    GISASSimulation();
+    GISASSimulation(const MultiLayer& p_sample);
+    GISASSimulation(const std::shared_ptr<IMultiLayerBuilder> p_sample_builder);
+
+    ~GISASSimulation() final {}
+
+    GISASSimulation* clone() const { return new GISASSimulation(*this); }
+
+    //! Put into a clean state for running a simulation
+    void prepareSimulation() final;
+
+    //! Gets the number of elements this simulation needs to calculate
+    int numberOfSimulationElements() const final;
+
+    //! Returns clone of the detector intensity map with detector resolution applied
+    OutputData<double>* getDetectorIntensity(
+            IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const;
+
+    //! Returns histogram representing intensity map in requested axes units
+    Histogram2D* getIntensityData(IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const;
+
+    //! Sets beam parameters from here (forwarded to Instrument)
+    void setBeamParameters(double wavelength, double alpha_i, double phi_i);
+
+    //! Sets the detector (axes can be overwritten later)
+    void setDetector(const IDetector2D& detector);
+
+    //! Sets spherical detector parameters using angle ranges
+    //! @param n_phi number of phi-axis bins
+    //! @param phi_min low edge of first phi-bin
+    //! @param phi_max upper edge of last phi-bin
+    //! @param n_alpha number of alpha-axis bins
+    //! @param alpha_min low edge of first alpha-bin
+    //! @param alpha_max upper edge of last alpha-bin
+    void setDetectorParameters(size_t n_phi, double phi_min, double phi_max,
+                               size_t n_alpha, double alpha_min, double alpha_max);
+
+    //! removes all masks from the detector
+    void removeMasks();
+
+    //! Adds mask of given shape to the stack of detector masks. The mask value 'true' means
+    //! that the channel will be excluded from the simulation. The mask which is added last
+    //! has priority.
+    //! @param shape The shape of mask (Rectangle, Polygon, Line, Ellipse)
+    //! @param mask_value The value of mask
+    void addMask(const Geometry::IShape2D& shape, bool mask_value = true);
+
+    //! Put the mask for all detector channels (i.e. exclude whole detector from the analysis)
+    void maskAll();
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const final;
+
+    //! Sets rectangular region of interest with lower left and upper right corners defined.
+    void setRegionOfInterest(double xlow, double ylow, double xup, double yup);
+
+    //! Resets region of interest making whole detector plane available for the simulation.
+    void resetRegionOfInterest();
+
+private:
+    GISASSimulation(const GISASSimulation& other);
+
+    //! Initializes the vector of Simulation elements
+    void initSimulationElementVector() final;
+
+    //! Creates the appropriate data structure (e.g. 2D intensity map) from the calculated
+    //! SimulationElement objects
+    void transferResultsToIntensityMap() final;
+
+    //! Default implementation only adds the detector axes
+    void updateIntensityMap() final;
+
+    void initialize();
+};
+
+#endif // GISASSIMULATION_H
diff --git a/Core/Simulation/OffSpecSimulation.cpp b/Core/Simulation/OffSpecSimulation.cpp
new file mode 100644
index 0000000..68a8cef
--- /dev/null
+++ b/Core/Simulation/OffSpecSimulation.cpp
@@ -0,0 +1,186 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/OffSpecSimulation.cpp
+//! @brief     Implements class OffSpecSimulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OffSpecSimulation.h"
+#include "BornAgainNamespace.h"
+#include "Histogram2D.h"
+#include "IMultiLayerBuilder.h"
+#include "MultiLayer.h"
+#include "SimulationElement.h"
+
+OffSpecSimulation::OffSpecSimulation()
+    : mp_alpha_i_axis(nullptr)
+{
+    initialize();
+}
+
+OffSpecSimulation::OffSpecSimulation(const MultiLayer& p_sample)
+    : Simulation(p_sample)
+    , mp_alpha_i_axis(nullptr)
+{
+    initialize();
+}
+
+OffSpecSimulation::OffSpecSimulation(const std::shared_ptr<IMultiLayerBuilder> p_sample_builder)
+    : Simulation(p_sample_builder)
+    , mp_alpha_i_axis(nullptr)
+{
+    initialize();
+}
+
+OffSpecSimulation::OffSpecSimulation(const OffSpecSimulation& other)
+    : Simulation(other)
+    , mp_alpha_i_axis(nullptr)
+{
+    if(other.mp_alpha_i_axis)
+        mp_alpha_i_axis = other.mp_alpha_i_axis->clone();
+    initialize();
+}
+
+void OffSpecSimulation::prepareSimulation()
+{
+    checkInitialization();
+    Simulation::prepareSimulation();
+}
+
+int OffSpecSimulation::numberOfSimulationElements() const
+{
+    checkInitialization();
+    return getInstrument().getDetector()->numberOfSimulationElements()*mp_alpha_i_axis->size();
+}
+
+Histogram2D* OffSpecSimulation::getIntensityData() const
+{
+    const std::unique_ptr<OutputData<double> > data(getDetectorIntensity());
+    return new Histogram2D(*data);
+}
+
+void OffSpecSimulation::setBeamParameters(double lambda, const IAxis& alpha_axis, double phi_i)
+{
+    delete mp_alpha_i_axis;
+    mp_alpha_i_axis = alpha_axis.clone();
+    if (alpha_axis.size()<1)
+        throw Exceptions::ClassInitializationException(
+                "OffSpecSimulation::prepareSimulation() "
+                "-> Error. Incoming alpha range size < 1.");
+    double alpha_start = alpha_axis[0];
+    m_instrument.setBeamParameters(lambda, alpha_start, phi_i);
+    updateIntensityMap();
+}
+
+void OffSpecSimulation::setDetectorParameters(size_t n_x, double x_min, double x_max,
+                                              size_t n_y, double y_min, double y_max)
+{
+    m_instrument.setDetectorParameters(n_x, x_min, x_max, n_y, y_min, y_max);
+    updateIntensityMap();
+}
+
+std::string OffSpecSimulation::addParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string new_path = IParameterized::addParametersToExternalPool(
+            path, external_pool, copy_number);
+
+    // add parameters of the instrument
+    m_instrument.addParametersToExternalPool(new_path, external_pool, -1);
+
+    new_path = addSimulationParametersToExternalPool(new_path, external_pool);
+
+    return new_path;
+}
+
+void OffSpecSimulation::initSimulationElementVector()
+{
+    m_sim_elements.clear();
+    Beam beam = m_instrument.getBeam();
+    double wavelength = beam.getWavelength();
+    double phi_i = beam.getPhi();
+    checkInitialization();
+
+    for (size_t iAlpha = 0; iAlpha < mp_alpha_i_axis->size(); ++iAlpha) {
+        // Incoming angle by convention defined as positive:
+        double alpha_i = mp_alpha_i_axis->getBin(iAlpha).getMidPoint();
+        beam.setCentralK(wavelength, alpha_i, phi_i);
+        m_instrument.setBeam(beam);
+        std::vector<SimulationElement> sim_elements_alpha_i =
+            m_instrument.createSimulationElements();
+        m_sim_elements.insert(m_sim_elements.end(), sim_elements_alpha_i.begin(),
+                              sim_elements_alpha_i.end());
+    }
+}
+
+void OffSpecSimulation::transferResultsToIntensityMap()
+{
+    checkInitialization();
+    const IAxis& phi_axis = m_instrument.getDetectorAxis(0);
+    size_t phi_f_size = phi_axis.size();
+    if (phi_f_size*m_intensity_map.getAllocatedSize()!=m_sim_elements.size())
+        throw Exceptions::RuntimeErrorException(
+            "OffSpecSimulation::transferResultsToIntensityMap: "
+            "intensity map size does not conform to number of calculated intensities");
+    for (size_t i=0; i<mp_alpha_i_axis->size(); ++i)
+        transferDetectorImage(i);
+}
+
+void OffSpecSimulation::updateIntensityMap()
+{
+    m_intensity_map.clear();
+    if (mp_alpha_i_axis)
+        m_intensity_map.addAxis(*mp_alpha_i_axis);
+    size_t detector_dimension = m_instrument.getDetectorDimension();
+    if (detector_dimension==2)
+        m_intensity_map.addAxis(m_instrument.getDetectorAxis(1));
+    m_intensity_map.setAllTo(0.);
+}
+
+void OffSpecSimulation::transferDetectorImage(int index)
+{
+    OutputData<double> detector_image;
+    size_t detector_dimension = m_instrument.getDetectorDimension();
+    for (size_t dim=0; dim<detector_dimension; ++dim)
+        detector_image.addAxis(m_instrument.getDetectorAxis(dim));
+    size_t detector_size = detector_image.getAllocatedSize();
+    for (size_t i=0; i<detector_size; ++i)
+        detector_image[i] = m_sim_elements[index*detector_size + i].getIntensity();
+    m_instrument.applyDetectorResolution(&detector_image);
+    size_t y_axis_size = m_instrument.getDetectorAxis(1).size();
+    for (size_t i=0; i<detector_size; ++i)
+        m_intensity_map[index*y_axis_size + i%y_axis_size] += detector_image[i];
+}
+
+void OffSpecSimulation::checkInitialization() const
+{
+    if (!mp_alpha_i_axis || mp_alpha_i_axis->size()<1)
+        throw Exceptions::ClassInitializationException(
+                "OffSpecSimulation::checkInitialization() "
+                "Incoming alpha range not configured.");
+    if (m_instrument.getDetectorDimension()!=2)
+        throw Exceptions::RuntimeErrorException(
+            "OffSpecSimulation::checkInitialization: detector is not two-dimensional");
+    const IAxis& phi_axis = m_instrument.getDetectorAxis(0);
+    if (phi_axis.getName()!=BornAgain::PHI_AXIS_NAME)
+        throw Exceptions::RuntimeErrorException(
+            "OffSpecSimulation::checkInitialization: phi-axis is not correct");
+    const IAxis& alpha_axis = m_instrument.getDetectorAxis(1);
+    if (alpha_axis.getName()!=BornAgain::ALPHA_AXIS_NAME)
+        throw Exceptions::RuntimeErrorException(
+            "OffSpecSimulation::checkInitialization: alpha-axis is not correct");
+}
+
+void OffSpecSimulation::initialize()
+{
+    setName(BornAgain::OffSpecSimulationType);
+}
diff --git a/Core/Simulation/OffSpecSimulation.h b/Core/Simulation/OffSpecSimulation.h
new file mode 100644
index 0000000..8aadebd
--- /dev/null
+++ b/Core/Simulation/OffSpecSimulation.h
@@ -0,0 +1,86 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/OffSpecSimulation.h
+//! @brief     Defines class OffSpecSimulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OFFSPECSIMULATION_H
+#define OFFSPECSIMULATION_H
+
+#include "Simulation.h"
+
+class Histogram2D;
+
+//! Main class to run an off-specular simulation.
+//! @ingroup simulation
+
+class BA_CORE_API_ OffSpecSimulation : public Simulation
+{
+public:
+    OffSpecSimulation();
+    OffSpecSimulation(const MultiLayer& p_sample);
+    OffSpecSimulation(const std::shared_ptr<class IMultiLayerBuilder> p_sample_builder);
+    ~OffSpecSimulation() final {}
+
+    OffSpecSimulation* clone() const { return new OffSpecSimulation(*this); }
+
+    //! Put into a clean state for running a simulation
+    void prepareSimulation() final;
+
+    //! Gets the number of elements this simulation needs to calculate
+    int numberOfSimulationElements() const final;
+
+    //! Returns clone of the detector intensity map
+    OutputData<double>* getDetectorIntensity(
+        IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const {
+        (void) units_type; return m_intensity_map.clone(); }
+
+    //! Returns clone of the detector intensity map in the form of 2D histogram.
+    Histogram2D* getIntensityData() const;
+
+    //! Sets beam parameters from here (forwarded to Instrument)
+    void setBeamParameters(double lambda, const IAxis& alpha_axis, double phi_i);
+
+    //! Sets detector parameters using angle ranges
+    void setDetectorParameters(size_t n_x, double x_min, double x_max,
+                               size_t n_y, double y_min, double y_max);
+
+    //! Adds parameters from local pool to external pool and recursively calls its direct children.
+    std::string addParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool, int copy_number = -1) const final;
+
+private:
+    OffSpecSimulation(const OffSpecSimulation& other);
+
+    //! Initializes the vector of Simulation elements
+    void initSimulationElementVector() final;
+
+    //! Creates the appropriate data structure (e.g. 2D intensity map) from the calculated
+    //! SimulationElement objects
+    void transferResultsToIntensityMap() final;
+
+    //! Default implementation only adds the detector axes
+    void updateIntensityMap() final;
+
+    //! Normalize, apply detector resolution and transfer detector image corresponding to
+    //! alpha_i = mp_alpha_i_axis->getBin(index)
+    void transferDetectorImage(int index);
+
+    //! Check correct number of axes
+    void checkInitialization() const;
+
+    void initialize();
+
+    IAxis* mp_alpha_i_axis;
+};
+
+#endif // OFFSPECSIMULATION_H
diff --git a/Core/Simulation/Simulation.cpp b/Core/Simulation/Simulation.cpp
new file mode 100644
index 0000000..834cffa
--- /dev/null
+++ b/Core/Simulation/Simulation.cpp
@@ -0,0 +1,352 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/Simulation.cpp
+//! @brief     Implements class Simulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Simulation.h"
+#include "IMultiLayerBuilder.h"
+#include "MultiLayer.h"
+#include "MainComputation.h"
+#include "Logger.h"
+#include "ParameterPool.h"
+#include "ParameterSample.h"
+#include "SimulationElement.h"
+#include "Utils.h"
+#include <gsl/gsl_errno.h>
+#include <thread>
+#include <iomanip>
+#include <iostream>
+
+Simulation::Simulation()
+{}
+
+Simulation::Simulation(const MultiLayer& p_sample)
+{
+    mP_sample.reset(p_sample.clone());
+}
+
+Simulation::Simulation(const std::shared_ptr<IMultiLayerBuilder> p_sample_builder)
+    : mP_sample_builder(p_sample_builder)
+{}
+
+Simulation::Simulation(const Simulation& other)
+    : ICloneable()
+    , IParameterized(other)
+    , mP_sample_builder(other.mP_sample_builder)
+    , m_options(other.m_options)
+    , m_distribution_handler(other.m_distribution_handler)
+    , m_progress(other.m_progress)
+    , m_instrument(other.m_instrument)
+    , m_intensity_map()
+{
+    if (other.mP_sample)
+        mP_sample.reset(other.mP_sample->clone());
+    m_intensity_map.copyFrom(other.m_intensity_map);
+}
+
+Simulation::~Simulation() {} // forward class declaration prevents move to .h
+
+//! Initializes a progress monitor that prints to stdout.
+void Simulation::setTerminalProgressMonitor()
+{
+    m_progress.subscribe( [] (int percentage_done) -> bool {
+            if (percentage_done<100)
+                std::cout << std::setprecision(2)
+                          << "\r... " << percentage_done << "%" << std::flush;
+            else // wipe out
+                std::cout << "\r... 100%\n";
+            return true;
+        } );
+}
+
+void Simulation::setDetectorResolutionFunction(const IResolutionFunction2D& resolution_function)
+{
+    m_instrument.setDetectorResolutionFunction(resolution_function);
+}
+
+void Simulation::removeDetectorResolutionFunction()
+{
+    m_instrument.setDetectorResolutionFunction(nullptr);
+}
+
+//! Sets the polarization analyzer characteristics of the detector
+void Simulation::setAnalyzerProperties(const kvector_t direction, double efficiency,
+                                       double total_transmission)
+{
+    m_instrument.setAnalyzerProperties(direction, efficiency, total_transmission);
+}
+
+void Simulation::setBeamIntensity(double intensity)
+{
+    m_instrument.setBeamIntensity(intensity);
+}
+
+double Simulation::getBeamIntensity() const
+{
+    return m_instrument.getBeamIntensity();
+}
+
+//! Sets the beam polarization according to the given Bloch vector
+void Simulation::setBeamPolarization(const kvector_t bloch_vector)
+{
+    m_instrument.setBeamPolarization(bloch_vector);
+}
+
+void Simulation::prepareSimulation()
+{
+    gsl_set_error_handler_off();
+}
+
+//! Run simulation with possible averaging over parameter distributions
+void Simulation::runSimulation()
+{
+    updateSample();
+    if (!mP_sample)
+        throw Exceptions::NullPointerException("Simulation::runSimulation() -> Error! No sample.");
+
+    prepareSimulation();
+
+    size_t param_combinations = m_distribution_handler.getTotalNumberOfSamples();
+
+    m_progress.reset();
+    int prefac = ( mP_sample->totalNofLayouts()>0 ? 1 : 0 )
+        + ( mP_sample->hasRoughness() ? 1 : 0 );
+    m_progress.setExpectedNTicks(prefac*param_combinations*numberOfSimulationElements());
+
+    // no averaging needed:
+    if (param_combinations == 1) {
+        std::unique_ptr<ParameterPool> P_param_pool(createParameterTree());
+        m_distribution_handler.setParameterValues(P_param_pool.get(), 0);
+        runSingleSimulation();
+        transferResultsToIntensityMap();
+        return;
+    }
+
+    // average over parameter distributions:
+    initSimulationElementVector();
+    std::vector<SimulationElement> total_intensity = m_sim_elements;
+    std::unique_ptr<ParameterPool> P_param_pool(createParameterTree());
+    for (size_t index = 0; index < param_combinations; ++index) {
+        double weight = m_distribution_handler.setParameterValues(P_param_pool.get(), index);
+        runSingleSimulation();
+        addElementsWithWeight(m_sim_elements.begin(), m_sim_elements.end(), total_intensity.begin(),
+                              weight);
+    }
+    m_sim_elements = total_intensity;
+    transferResultsToIntensityMap();
+}
+
+/* currently unused
+void Simulation::runOMPISimulation()
+{
+    OMPISimulation ompi;
+    ompi.runSimulation(this);
+}
+*/
+
+void Simulation::setInstrument(const Instrument& instrument)
+{
+    m_instrument = instrument;
+    updateIntensityMap();
+}
+
+//! The MultiLayer object will not be owned by the Simulation object
+void Simulation::setSample(const MultiLayer& sample)
+{
+    mP_sample.reset(sample.clone());
+}
+
+void Simulation::setSampleBuilder(const std::shared_ptr<class IMultiLayerBuilder> p_sample_builder)
+{
+    if (!p_sample_builder)
+        throw Exceptions::NullPointerException("Simulation::setSampleBuilder() -> "
+                                   "Error! Attempt to set null sample builder.");
+
+    mP_sample_builder = p_sample_builder;
+    mP_sample.reset(nullptr);
+}
+
+std::string Simulation::addSimulationParametersToExternalPool(
+    const std::string& path, ParameterPool* external_pool) const
+{
+    std::string new_path = path;
+
+    if (mP_sample_builder) {
+        new_path = mP_sample_builder->addParametersToExternalPool(new_path, external_pool, -1);
+    } else if (mP_sample) {
+        new_path = mP_sample->addParametersToExternalPool(new_path, external_pool, -1);
+    }
+
+    return new_path;
+}
+
+void Simulation::addParameterDistribution(const std::string& param_name,
+                                          const IDistribution1D& distribution, size_t nbr_samples,
+                                          double sigma_factor, const RealLimits& limits)
+{
+    m_distribution_handler.addParameterDistribution(
+        param_name, distribution, nbr_samples, sigma_factor, limits);
+}
+
+void Simulation::addParameterDistribution(const ParameterDistribution& par_distr)
+{
+    m_distribution_handler.addParameterDistribution(par_distr);
+}
+
+void Simulation::updateSample()
+{
+    if (!mP_sample_builder)
+        return;
+    if (mP_sample_builder->isPythonBuilder()) {
+        mP_sample.reset( mP_sample_builder->buildSample()->clone() );
+    } else {
+        mP_sample.reset( mP_sample_builder->buildSample() );
+    }
+}
+
+//! Runs a single simulation with fixed parameter values.
+//! If desired, the simulation is run in several threads.
+void Simulation::runSingleSimulation()
+{
+    updateSample();
+    initSimulationElementVector();
+
+    // restrict calculation to current batch
+    std::vector<SimulationElement>::iterator batch_start
+        = getBatchStart(m_options.getNumberOfBatches(), m_options.getCurrentBatch());
+
+    std::vector<SimulationElement>::iterator batch_end
+        = getBatchEnd(m_options.getNumberOfBatches(), m_options.getCurrentBatch());
+
+    if (m_options.getNumberOfThreads() == 1) {
+        // Single thread.
+        std::unique_ptr<MainComputation> P_dwba_simulation(
+            new MainComputation(mP_sample.get(), m_options, m_progress, batch_start, batch_end));
+        P_dwba_simulation->run(); // the work is done here
+        if (!P_dwba_simulation->isCompleted()) {
+            std::string message = P_dwba_simulation->getRunMessage();
+            throw Exceptions::RuntimeErrorException("Simulation::runSimulation() -> Simulation has "
+                                                    "terminated unexpectedly with following error "
+                                                    "message.\n" + message);
+        }
+    } else {
+        // Multithreading.
+
+        msglog(MSG::DEBUG) << "Simulation::runSimulation() -> Info. Number of threads "
+                           << m_options.getNumberOfThreads()
+                           << ", n_batches = " << m_options.getNumberOfBatches()
+                           << ", current_batch = " << m_options.getCurrentBatch();
+
+        std::vector<std::thread*> threads;
+        std::vector<MainComputation*> simulations;
+
+        // Initialize n simulations.
+        int total_batch_elements = batch_end - batch_start;
+        int element_thread_step = total_batch_elements / m_options.getNumberOfThreads();
+        if (total_batch_elements % m_options.getNumberOfThreads()) // there is a remainder
+            ++element_thread_step;
+
+        for (int i_thread = 0; i_thread < m_options.getNumberOfThreads(); ++i_thread) {
+            if (i_thread*element_thread_step >= total_batch_elements)
+                break;
+            // TODO: why a plain pointer here, and a unique pointer in the single-thread case?
+            std::vector<SimulationElement>::iterator begin_it = batch_start
+                                                                + i_thread * element_thread_step;
+            std::vector<SimulationElement>::iterator end_it;
+            int end_thread_index = (i_thread+1) * element_thread_step;
+            if (end_thread_index >= total_batch_elements)
+                end_it = batch_end;
+            else
+                end_it = batch_start + end_thread_index;
+            simulations.push_back(
+                new MainComputation(
+                    mP_sample.get(), m_options, m_progress, begin_it, end_it));
+        }
+
+        // Run simulations in n threads.
+        for (MainComputation* sim: simulations)
+            threads.push_back(new std::thread([sim]() {sim->run();}));
+
+        // Wait for threads to complete.
+        for (auto thread: threads) {
+            thread->join();
+            delete thread;
+        }
+
+        // Check successful completion.
+        std::vector<std::string> failure_messages;
+        for (auto sim: simulations) {
+            if (!sim->isCompleted())
+                failure_messages.push_back(sim->getRunMessage());
+            delete sim;
+        }
+        if (failure_messages.size())
+            throw Exceptions::RuntimeErrorException(
+                "Simulation::runSingleSimulation() -> "
+                "At least one simulation thread has terminated unexpectedly.\n"
+                "Messages: " + Utils::String::join(failure_messages, " --- "));
+    }
+    normalize(batch_start, batch_end);
+}
+
+//! Normalize the detector counts to beam intensity, to solid angle, and to exposure angle.
+void Simulation::normalize(std::vector<SimulationElement>::iterator begin_it,
+                           std::vector<SimulationElement>::iterator end_it) const
+{
+    double beam_intensity = getBeamIntensity();
+    if (beam_intensity==0.0)
+        return; // no normalization when beam intensity is zero
+    for(auto it=begin_it; it!=end_it; ++it) {
+        double sin_alpha_i = std::abs(std::sin(it->getAlphaI()));
+        if (sin_alpha_i==0.0) sin_alpha_i = 1.0;
+        double solid_angle = it->getSolidAngle();
+        it->setIntensity(it->getIntensity()*beam_intensity*solid_angle/sin_alpha_i);
+    }
+}
+
+std::vector<SimulationElement>::iterator Simulation::getBatchStart(int n_batches, int current_batch)
+{
+    imposeConsistencyOfBatchNumbers(n_batches, current_batch);
+    int total_size = m_sim_elements.size();
+    int size_per_batch = total_size/n_batches;
+    if (total_size%n_batches)
+        ++size_per_batch;
+    if (current_batch*size_per_batch >= total_size)
+        return m_sim_elements.end();
+    return m_sim_elements.begin() + current_batch*size_per_batch;
+}
+
+std::vector<SimulationElement>::iterator Simulation::getBatchEnd(int n_batches, int current_batch)
+{
+    imposeConsistencyOfBatchNumbers(n_batches, current_batch);
+    int total_size = m_sim_elements.size();
+    int size_per_batch = total_size/n_batches;
+    if (total_size%n_batches)
+        ++size_per_batch;
+    int end_index = (current_batch + 1)*size_per_batch;
+    if (end_index >= total_size)
+        return m_sim_elements.end();
+    return m_sim_elements.begin() + end_index;
+}
+
+void Simulation::imposeConsistencyOfBatchNumbers(int& n_batches, int& current_batch)
+{
+    if (n_batches < 2) {
+        n_batches = 1;
+        current_batch = 0;
+    }
+    if (current_batch >= n_batches)
+        throw Exceptions::ClassInitializationException(
+            "Simulation::imposeConsistencyOfBatchNumbers(): Batch number must be smaller than "
+            "number of batches.");
+}
diff --git a/Core/Simulation/Simulation.h b/Core/Simulation/Simulation.h
new file mode 100644
index 0000000..508a9d2
--- /dev/null
+++ b/Core/Simulation/Simulation.h
@@ -0,0 +1,134 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/Simulation.h
+//! @brief     Defines class Simulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATION_H
+#define SIMULATION_H
+
+#include "DistributionHandler.h"
+#include "IDetector2D.h"
+#include "Instrument.h"
+#include "ProgressHandler.h"
+#include "SimulationOptions.h"
+
+template<class T> class OutputData;
+class Computation;
+class MultiLayer;
+class IMultiLayerBuilder;
+
+//! Pure virtual base class of OffSpecularSimulation and GISASSimulation,
+//! holds common infrastructure to run a simulation.
+//! @ingroup simulation
+
+class BA_CORE_API_ Simulation : public ICloneable, public IParameterized
+{
+public:
+    Simulation();
+    Simulation(const MultiLayer& p_sample);
+    Simulation(const std::shared_ptr<IMultiLayerBuilder> p_sample_builder);
+    virtual ~Simulation();
+
+    virtual Simulation* clone() const =0;
+
+    //! Put into a clean state for running a simulation
+    virtual void prepareSimulation();
+
+    //! Run a simulation, possibly averaged over parameter distributions
+    void runSimulation();
+
+    void setInstrument(const Instrument& instrument);
+    const Instrument& getInstrument() const { return m_instrument; }
+    Instrument& getInstrument() { return m_instrument; }
+
+    void setBeamIntensity(double intensity);
+    double getBeamIntensity() const;
+
+    void setBeamPolarization(const kvector_t bloch_vector);
+
+    void setDetectorResolutionFunction(const IResolutionFunction2D& resolution_function);
+    void removeDetectorResolutionFunction();
+
+    void setAnalyzerProperties(const kvector_t direction, double efficiency,
+                               double total_transmission);
+
+    void setSample(const MultiLayer& sample);
+    MultiLayer* getSample() const { return mP_sample.get(); }
+
+    void setSampleBuilder(const std::shared_ptr<IMultiLayerBuilder> sample_builder);
+    std::shared_ptr<IMultiLayerBuilder> getSampleBuilder() const { return mP_sample_builder; }
+
+    virtual int numberOfSimulationElements() const=0;
+
+    //! Clone simulated intensity map
+    virtual OutputData<double>* getDetectorIntensity(
+        IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const=0;
+
+    //! Adds parameters defined in this class the to external pool.
+    std::string addSimulationParametersToExternalPool(
+        const std::string& path, ParameterPool* external_pool) const;
+
+    void addParameterDistribution(
+        const std::string& param_name, const IDistribution1D& distribution, size_t nbr_samples,
+        double sigma_factor=0.0, const RealLimits& limits = RealLimits());
+    void addParameterDistribution(const ParameterDistribution& par_distr);
+    const DistributionHandler& getDistributionHandler() const { return m_distribution_handler; }
+
+    void setOptions(const SimulationOptions& options) { m_options = options; }
+    const SimulationOptions& getOptions() const { return m_options; }
+    SimulationOptions& getOptions() { return m_options; }
+
+    void subscribe(ProgressHandler::Callback_t inform) { m_progress.subscribe(inform); }
+    void setTerminalProgressMonitor();
+
+protected:
+    Simulation(const Simulation& other);
+
+    virtual void initSimulationElementVector() =0;
+
+    //! Creates the appropriate data structure (e.g. 2D intensity map) from the calculated
+    //! SimulationElement objects
+    virtual void transferResultsToIntensityMap() =0;
+
+    //! Update the sample by calling the sample builder, if present
+    void updateSample();
+
+    void runSingleSimulation();
+
+    virtual void updateIntensityMap() =0;
+
+#ifndef SWIG
+    void normalize(std::vector<SimulationElement>::iterator begin_it,
+                   std::vector<SimulationElement>::iterator end_it) const;
+#endif
+
+    //! Returns the start iterator of simulation elements for the current batch
+    std::vector<SimulationElement>::iterator getBatchStart(int n_batches, int current_batch);
+
+    //! Returns the end iterator of simulation elements for the current batch
+    std::vector<SimulationElement>::iterator getBatchEnd(int n_batches, int current_batch);
+
+    std::unique_ptr<MultiLayer> mP_sample;
+    std::shared_ptr<IMultiLayerBuilder> mP_sample_builder;
+    SimulationOptions m_options;
+    DistributionHandler m_distribution_handler;
+    ProgressHandler m_progress;
+    std::vector<SimulationElement> m_sim_elements;
+    Instrument m_instrument;
+    OutputData<double> m_intensity_map;
+
+private:
+    void imposeConsistencyOfBatchNumbers(int& n_batches, int& current_batch);
+};
+
+#endif // SIMULATION_H
diff --git a/Core/Simulation/SpecularSimulation.cpp b/Core/Simulation/SpecularSimulation.cpp
new file mode 100644
index 0000000..a9312fd
--- /dev/null
+++ b/Core/Simulation/SpecularSimulation.cpp
@@ -0,0 +1,264 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/SpecularSimulation.cpp
+//! @brief     Implements class OffSpecSimulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SpecularSimulation.h"
+#include "IMultiLayerBuilder.h"
+#include "MultiLayer.h"
+#include "SpecularMatrix.h"
+#include <memory>
+
+SpecularSimulation::SpecularSimulation()
+    : IParameterized("SpecularSimulation"), mP_sample { nullptr }, m_alpha_i_axis(0), m_z_axis(0),
+      m_lambda(0.0)
+{
+    init_parameters();
+}
+
+SpecularSimulation::SpecularSimulation(const ISample &sample)
+    : IParameterized("SpecularSimulation"), mP_sample(sample.clone()), m_alpha_i_axis(0),
+      m_z_axis(0), m_lambda(0.0)
+{
+    init_parameters();
+}
+
+SpecularSimulation::SpecularSimulation(const std::shared_ptr<IMultiLayerBuilder> sample_builder)
+    : IParameterized("SpecularSimulation"), mP_sample { nullptr },
+      mP_sample_builder(sample_builder),
+      m_alpha_i_axis(0), m_z_axis(0), m_lambda(0.0)
+{
+    init_parameters();
+}
+
+SpecularSimulation::SpecularSimulation(const SpecularSimulation &other)
+    : ICloneable(), IParameterized(other), mP_sample { nullptr },
+      mP_sample_builder(other.mP_sample_builder),
+      m_alpha_i_axis(0), m_z_axis(0), m_lambda(other.m_lambda)
+{
+    if (other.mP_sample.get())
+        mP_sample.reset( other.mP_sample->clone() );
+    if (other.m_alpha_i_axis)
+        m_alpha_i_axis = other.m_alpha_i_axis->clone();
+    if (other.m_z_axis)
+        m_z_axis = other.m_z_axis->clone();
+    m_data.copyFrom(other.m_data);
+    m_ewave_intensity.copyFrom(other.m_ewave_intensity);
+    init_parameters();
+}
+
+SpecularSimulation::~SpecularSimulation()
+{
+    delete m_alpha_i_axis;
+    delete m_z_axis;
+}
+
+SpecularSimulation *SpecularSimulation::clone() const
+{
+    return new SpecularSimulation(*this);
+}
+
+void SpecularSimulation::setSample(const ISample &sample)
+{
+    mP_sample.reset( sample.clone() );
+}
+
+void SpecularSimulation::setSampleBuilder(std::shared_ptr<IMultiLayerBuilder> sample_builder)
+{
+    if (!sample_builder)
+        throw Exceptions::NullPointerException("SpecularSimulation::setSampleBuilder() -> "
+                                   "Error! Attempt to set null sample builder.");
+
+    mP_sample_builder = sample_builder;
+    mP_sample.reset(nullptr);
+}
+
+void SpecularSimulation::prepareSimulation()
+{
+    updateSample();
+
+    if (!m_alpha_i_axis || m_alpha_i_axis->size() < 1)
+        throw Exceptions::ClassInitializationException("SpecularSimulation::checkSimulation() "
+                                           "-> Error. Incoming alpha range not configured.");
+    if (m_lambda <= 0.0)
+        throw Exceptions::ClassInitializationException("SpecularSimulation::checkSimulation() "
+                                           "-> Error. Incoming wavelength <= 0.");
+    if (!mP_sample)
+        throw Exceptions::ClassInitializationException(
+            "SpecularSimulation::checkSimulation() -> Error. No sample set");
+
+    updateCoefficientDataAxes();
+}
+
+void SpecularSimulation::runSimulation()
+{
+    prepareSimulation();
+
+    MultiLayer *multilayer = dynamic_cast<MultiLayer*>(mP_sample.get());
+    if (!multilayer)
+        throw Exceptions::NullPointerException(
+            "SpecularSimulation::runSimulation() -> Error. Not a MultiLayer");
+
+    if (multilayer->requiresMatrixRTCoefficients()) {
+        collectRTCoefficientsMatrix(multilayer);
+    } else {
+        collectRTCoefficientsScalar(multilayer);
+        //        calculateEvanescentWaveIntensity();
+    }
+}
+
+void SpecularSimulation::setBeamParameters(double lambda, const IAxis &alpha_axis)
+{
+    delete m_alpha_i_axis;
+    m_alpha_i_axis = alpha_axis.clone();
+    m_lambda = lambda;
+}
+
+void SpecularSimulation::setBeamParameters(double lambda, int nbins, double alpha_i_min,
+                                           double alpha_i_max)
+{
+    FixedBinAxis axis("alpha_i", nbins, alpha_i_min, alpha_i_max);
+    setBeamParameters(lambda, axis);
+}
+
+void SpecularSimulation::setEvanescentWaveAxis(const IAxis &z_axis)
+{
+    delete m_z_axis;
+    m_z_axis = z_axis.clone();
+}
+
+void SpecularSimulation::setEvanescentWaveAxis(int nbins, double z_min, double z_max)
+{
+    FixedBinAxis axis("z_axis", nbins, z_min, z_max);
+    setEvanescentWaveAxis(axis);
+}
+
+const IAxis *SpecularSimulation::getAlphaAxis() const
+{
+    return m_alpha_i_axis;
+}
+
+std::vector<complex_t> SpecularSimulation::getScalarR(size_t i_layer) const
+{
+    checkCoefficients(i_layer);
+    std::vector<complex_t> result;
+    result.resize(m_data.getAllocatedSize());
+    for (size_t i = 0; i < m_data.getAllocatedSize(); ++i) {
+        result[i] = m_data[i][i_layer]->getScalarR();
+    }
+    return result;
+}
+
+std::vector<complex_t> SpecularSimulation::getScalarT(size_t i_layer) const
+{
+    checkCoefficients(i_layer);
+    std::vector<complex_t> result;
+    result.resize(m_data.getAllocatedSize());
+    for (size_t i = 0; i < m_data.getAllocatedSize(); ++i) {
+        result[i] = m_data[i][i_layer]->getScalarT();
+    }
+    return result;
+}
+
+std::vector<complex_t> SpecularSimulation::getScalarKz(size_t i_layer) const
+{
+    checkCoefficients(i_layer);
+    std::vector<complex_t> result;
+    result.resize(m_data.getAllocatedSize());
+    for (size_t i = 0; i < m_data.getAllocatedSize(); ++i) {
+        result[i] = m_data[i][i_layer]->getScalarKz();
+    }
+    return result;
+}
+
+SpecularSimulation::LayerRTCoefficients_t
+SpecularSimulation::getLayerRTCoefficients(size_t i_alpha, size_t i_layer) const
+{
+    if (i_alpha >= m_data.getAllocatedSize())
+        throw Exceptions::RuntimeErrorException(
+            "SpecularSimulation::getLayerRTCoefficients() -> Error. Wrong i_alpha.");
+
+    if (i_layer >= m_data[i_alpha].size())
+        throw Exceptions::RuntimeErrorException(
+            "SpecularSimulation::getLayerRTCoefficients() -> Error. Wrong layer index.");
+
+    return m_data[i_alpha][i_layer];
+}
+
+void SpecularSimulation::updateSample()
+{
+    if (!mP_sample_builder)
+        return;
+    if (mP_sample_builder->isPythonBuilder()) {
+        mP_sample.reset( mP_sample_builder->buildSample()->clone() );
+    } else {
+        mP_sample.reset( mP_sample_builder->buildSample() );
+    }
+}
+
+void SpecularSimulation::collectRTCoefficientsScalar(const MultiLayer *multilayer)
+{
+    OutputData<MultiLayerRTCoefficients_t>::iterator it = m_data.begin();
+    while (it != m_data.end()) {
+        double alpha_i = m_data.getAxisValue(it.getIndex(), 0);
+        kvector_t kvec = vecOfLambdaAlphaPhi(m_lambda, -alpha_i, 0.0);
+
+        SpecularMatrix::MultiLayerCoeff_t coeffs;
+        SpecularMatrix::execute(*multilayer, kvec, coeffs);
+
+        MultiLayerRTCoefficients_t ml_coeffs;
+        ml_coeffs.resize(coeffs.size());
+        for (size_t i_layer = 0; i_layer < coeffs.size(); ++i_layer) {
+            ml_coeffs[i_layer] = LayerRTCoefficients_t(new ScalarRTCoefficients(coeffs[i_layer]));
+        }
+
+        *it = ml_coeffs;
+        ++it;
+
+    } // alpha_i
+}
+
+void SpecularSimulation::collectRTCoefficientsMatrix(const MultiLayer * /*multilayer*/)
+{
+    throw Exceptions::NotImplementedException(
+        "SpecularSimulation::collectRTCoefficientsMatrix() -> Error. Not implemented.");
+}
+
+void SpecularSimulation::checkCoefficients(size_t i_layer) const
+{
+    if (m_data.getAllocatedSize() == 1 || m_data[0].size() == 0)
+        throw Exceptions::ClassInitializationException(
+            "SpecularSimulation::checkCoefficients() -> Error. "
+            "No coefficients found, check that (1) you have set beam parameters "
+            "(2) you have run your simulation.");
+
+    if (i_layer >= m_data[0].size()) {
+        std::ostringstream message;
+        message << "SpecularSimulation::checkCoefficients() -> Error. Requested layer index "
+                << i_layer << " is large than or equal to the total number of layers "
+                << m_data[0].size() << std::endl;
+        throw Exceptions::OutOfBoundsException(message.str());
+    }
+}
+
+void SpecularSimulation::updateCoefficientDataAxes()
+{
+    m_data.clear();
+    m_data.addAxis(*m_alpha_i_axis);
+
+    if (m_z_axis) {
+        m_ewave_intensity.clear();
+        m_ewave_intensity.addAxis(*m_alpha_i_axis);
+        m_ewave_intensity.addAxis(*m_z_axis);
+    }
+}
diff --git a/Core/Simulation/SpecularSimulation.h b/Core/Simulation/SpecularSimulation.h
new file mode 100644
index 0000000..2c519cc
--- /dev/null
+++ b/Core/Simulation/SpecularSimulation.h
@@ -0,0 +1,124 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Simulation/SpecularSimulation.h
+//! @brief     Defines class SpecularSimulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPECULARSIMULATION_H
+#define SPECULARSIMULATION_H
+
+#include "ICloneable.h"
+#include "ILayerRTCoefficients.h"
+#include "IParameterized.h"
+#include "OutputData.h"
+#include <memory>
+
+class IAxis;
+class ISample;
+class IMultiLayerBuilder;
+class MultiLayer;
+
+//! Main class to run a specular simulation.
+//! @ingroup simulation
+
+class BA_CORE_API_ SpecularSimulation : public ICloneable, public IParameterized
+{
+public:
+    typedef std::shared_ptr<const ILayerRTCoefficients> LayerRTCoefficients_t;
+    typedef std::vector<LayerRTCoefficients_t> MultiLayerRTCoefficients_t;
+
+    SpecularSimulation();
+    SpecularSimulation(const ISample& sample);
+    SpecularSimulation(const std::shared_ptr<IMultiLayerBuilder> sample_builder);
+    virtual ~SpecularSimulation();
+
+    SpecularSimulation* clone() const;
+
+    //! Run a simulation with the current parameter settings
+    void runSimulation();
+
+    //! Sets the sample to be tested
+    void setSample(const ISample& sample);
+
+    //! Returns the sample
+    ISample* getSample() const { return mP_sample.get(); }
+
+    //! Sets the sample builder
+    void setSampleBuilder(std::shared_ptr<IMultiLayerBuilder> sample_builder);
+
+    //! return sample builder
+    std::shared_ptr<IMultiLayerBuilder> getSampleBuilder() const { return mP_sample_builder; }
+
+    //! Sets beam parameters with alpha_i of the beam defined in the range
+    void setBeamParameters(double lambda, const IAxis& alpha_axis);
+    void setBeamParameters(double lambda, int nbins, double alpha_i_min, double alpha_i_max);
+
+    //! set axis for evanescent wave axis
+    void setEvanescentWaveAxis(const IAxis& z_axis);
+    void setEvanescentWaveAxis(int nbins, double z_min, double z_max);
+
+    //! returns alpha_i axis
+    const IAxis* getAlphaAxis() const;
+
+    //! returns vector of reflection coefficients for all alpha_i angles for given layer index
+    std::vector<complex_t> getScalarR(size_t i_layer) const;
+
+    //! returns vector of transmission coefficients for all alpha_i angles for given layer index
+    std::vector<complex_t> getScalarT(size_t i_layer) const;
+
+    //! returns vector of Kz coefficients for all alpha_i angles for given layer index
+    std::vector<complex_t> getScalarKz(size_t i_layer) const;
+
+    LayerRTCoefficients_t getLayerRTCoefficients(size_t i_alpha, size_t i_layer) const;
+
+    //! Put into a clean state for running a simulation
+    void prepareSimulation();
+
+//    OutputData<double>* getEvanescentWaveIntensity() const;
+
+protected:
+    SpecularSimulation(const SpecularSimulation& other);
+
+    //! Registers some class members for later access via parameter pool
+    void init_parameters() {}
+
+    //! Update the sample by calling the sample builder, if present
+    void updateSample();
+
+    //! calculates RT coefficients for multilayer without magnetic materials
+    void collectRTCoefficientsScalar(const MultiLayer* multilayer);
+
+    //! calculates RT coefficients for multilayer with magnetic materials
+    void collectRTCoefficientsMatrix(const MultiLayer* multilayer);
+
+    //! calculates the intensity of evanescent wave
+//    void calculateEvanescentWaveIntensity();
+
+    //! check if simulation was run already and has valid coefficients
+    void checkCoefficients(size_t i_layer) const;
+
+    //! update data axes
+    void updateCoefficientDataAxes();
+
+    std::unique_ptr<ISample> mP_sample;
+    std::shared_ptr<IMultiLayerBuilder> mP_sample_builder;
+    IAxis* m_alpha_i_axis;
+    IAxis* m_z_axis;
+    double m_lambda;
+
+#ifndef SWIG
+    OutputData<MultiLayerRTCoefficients_t> m_data;
+    OutputData<double> m_ewave_intensity;
+#endif
+};
+
+#endif // SPECULARSIMULATION_H
diff --git a/Core/SoftParticle/FormFactorGauss.cpp b/Core/SoftParticle/FormFactorGauss.cpp
new file mode 100644
index 0000000..78b8ce2
--- /dev/null
+++ b/Core/SoftParticle/FormFactorGauss.cpp
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorGauss.cpp
+//! @brief     Implements class FormFactorGauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorGauss.h"
+#include "BornAgainNamespace.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+FormFactorGauss::FormFactorGauss(double length)
+    : FormFactorGauss(length, length) {}
+
+FormFactorGauss::FormFactorGauss(double width, double height)
+{
+    m_width = width;
+    m_height = height;
+    setName(BornAgain::FFGaussType);
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+    m_max_ql = std::sqrt(-4 * M_PI * std::log(std::numeric_limits<double>::min()) / 3);}
+
+complex_t FormFactorGauss::evaluate_for_q(const cvector_t q) const
+{
+    complex_t qzHdiv2 = m_height * q.z() / 2.0;
+    double qzh = q.z().real() * m_height;
+    if (std::abs(qzh) > m_max_ql)
+        return 0.0;
+    double qxr = q.x().real() * m_width;
+    if (std::abs(qxr) > m_max_ql)
+        return 0.0;
+    double qyr = q.y().real() * m_width;
+    if (std::abs(qyr) > m_max_ql)
+        return 0.0;
+
+    return exp_I(qzHdiv2) * m_height * m_width * m_width *
+        std::exp(-(qxr*qxr + qyr*qyr + qzh*qzh) / 4.0 / M_PI);
+}
diff --git a/Core/SoftParticle/FormFactorGauss.h b/Core/SoftParticle/FormFactorGauss.h
new file mode 100644
index 0000000..7b2eaae
--- /dev/null
+++ b/Core/SoftParticle/FormFactorGauss.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorGauss.h
+//! @brief     Defines class FormFactorGauss.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORGAUSS_H
+#define FORMFACTORGAUSS_H
+
+#include "IFormFactorBorn.h"
+
+//! The formfactor of a gaussian.
+//! @ingroup softParticle
+
+class BA_CORE_API_ FormFactorGauss : public IFormFactorBorn
+{
+public:
+    FormFactorGauss(double length);
+    FormFactorGauss(double width, double height);
+
+    FormFactorGauss* clone() const override final {
+        return new FormFactorGauss(m_width, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getWidth() const { return m_width; }
+    double getHeight() const { return m_height; }
+
+    double getRadialExtension() const override final { return m_width; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_width;
+    double m_height;
+    double m_max_ql;
+    void initialize();
+};
+
+#endif // FORMFACTORGAUSS_H
diff --git a/Core/SoftParticle/FormFactorLorentz.cpp b/Core/SoftParticle/FormFactorLorentz.cpp
new file mode 100644
index 0000000..7eb3cbb
--- /dev/null
+++ b/Core/SoftParticle/FormFactorLorentz.cpp
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorLorentz.cpp
+//! @brief     Implements class FormFactorLorentz.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorLorentz.h"
+#include "BornAgainNamespace.h"
+#include "RealLimits.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+
+using namespace BornAgain;
+
+FormFactorLorentz::FormFactorLorentz(double width, double height)
+{
+    m_width = width;
+    m_height = height;
+    initialize();
+}
+
+FormFactorLorentz::FormFactorLorentz(double length)
+    : m_width { length }
+    , m_height { length }
+{
+    initialize();
+}
+
+
+double FormFactorLorentz::getRadialExtension() const
+{
+    return m_width / 2.0;
+}
+
+complex_t FormFactorLorentz::evaluate_for_q(const cvector_t q) const
+{
+    static const double sigma2 = 4.0*std::pow(M_PI, 2.0/3.0);
+    double R = m_width;
+    double H = m_height;
+
+    complex_t xnorm = R*R*q.x()*q.x()/sigma2;
+    complex_t ynorm = R*R*q.y()*q.y()/sigma2;
+    complex_t znorm = H*H*q.z()*q.z()/sigma2;
+
+    complex_t result = H*R*R/(1.0 + xnorm + ynorm + znorm);
+
+    return result;
+}
+
+void FormFactorLorentz::initialize()
+{
+    setName(BornAgain::FFLorentzType);
+    registerParameter(BornAgain::Width, &m_width).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
diff --git a/Core/SoftParticle/FormFactorLorentz.h b/Core/SoftParticle/FormFactorLorentz.h
new file mode 100644
index 0000000..ebc9490
--- /dev/null
+++ b/Core/SoftParticle/FormFactorLorentz.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorLorentz.h
+//! @brief     Defines class FormFactorLorentz.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORLORENTZ_H
+#define FORMFACTORLORENTZ_H
+
+#include "IFormFactorBorn.h"
+
+//! The formfactor of a lorentzian.
+//! @ingroup softParticle
+
+class BA_CORE_API_ FormFactorLorentz : public IFormFactorBorn
+{
+public:
+    FormFactorLorentz(double length);
+    FormFactorLorentz(double width, double height);
+
+    FormFactorLorentz* clone() const override final {
+        return new FormFactorLorentz(m_width, m_height); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getWidth() const { return m_width; }
+    double getHeight() const { return m_height; }
+
+    double getRadialExtension() const override final;
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_width;
+    double m_height;
+    void initialize();
+};
+
+#endif // FORMFACTORLORENTZ_H
diff --git a/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
new file mode 100644
index 0000000..3b54d77
--- /dev/null
+++ b/Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorSphereGaussianRadius.cpp
+//! @brief     Implements class FormFactorSphereGaussianRadius.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorSphereGaussianRadius.h"
+#include "BornAgainNamespace.h"
+#include "RealLimits.h"
+#include "RealParameter.h"
+
+using namespace BornAgain;
+
+FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)
+: m_mean(mean)
+, m_sigma(sigma)
+, m_mean_r3(0.0)
+{
+    setName(FormFactorSphereGaussianRadiusType);
+    m_mean_r3 = calculateMeanR3();
+    P_ff_sphere.reset(new FormFactorFullSphere(m_mean_r3));
+    registerParameter(BornAgain::MeanRadius, &m_mean).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::SigmaRadius, &m_sigma).setUnit("nm").setNonnegative();
+}
+
+complex_t FormFactorSphereGaussianRadius::evaluate_for_q(const cvector_t q) const
+{
+    double q2 = std::norm(q.x()) + std::norm(q.y()) + std::norm(q.z());
+    double dw = std::exp(-q2*m_sigma*m_sigma/2.0);
+    return dw*P_ff_sphere->evaluate_for_q(q);
+}
+
+double FormFactorSphereGaussianRadius::calculateMeanR3() const
+{
+    return std::pow(m_mean*(m_mean*m_mean+3.0*m_sigma*m_sigma),1.0/3.0);
+}
diff --git a/Core/SoftParticle/FormFactorSphereGaussianRadius.h b/Core/SoftParticle/FormFactorSphereGaussianRadius.h
new file mode 100644
index 0000000..86c9d7c
--- /dev/null
+++ b/Core/SoftParticle/FormFactorSphereGaussianRadius.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorSphereGaussianRadius.h
+//! @brief     Defines and implements class FormFactorSphereGaussianRadius.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORSPHEREGAUSSIANRADIUS_H
+#define FORMFACTORSPHEREGAUSSIANRADIUS_H
+
+#include "FormFactorFullSphere.h"
+#include <memory>
+
+//! A sphere with gaussian radius distribution.
+//! @ingroup softParticle
+
+class BA_CORE_API_ FormFactorSphereGaussianRadius : public IFormFactorBorn
+{
+public:
+    FormFactorSphereGaussianRadius(double mean, double sigma);
+
+    FormFactorSphereGaussianRadius* clone() const override final {
+        return new FormFactorSphereGaussianRadius(m_mean, m_sigma); }
+
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadialExtension() const override final { return m_mean; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double calculateMeanR3() const;
+
+    double m_mean; //!< This is the mean radius
+    double m_sigma;
+    double m_mean_r3; //!< This is the radius that gives the mean volume
+    std::unique_ptr<FormFactorFullSphere> P_ff_sphere;
+};
+
+#endif // FORMFACTORSPHEREGAUSSIANRADIUS_H
diff --git a/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
new file mode 100644
index 0000000..71529a0
--- /dev/null
+++ b/Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorSphereLogNormalRadius.cpp
+//! @brief     Implements class FormFactorSphereGaussianRadius.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorSphereLogNormalRadius.h"
+#include "BornAgainNamespace.h"
+#include "Distributions.h"
+#include "RealParameter.h"
+
+FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(
+        double mean, double scale_param, size_t n_samples)
+    : m_mean(mean)
+    , m_scale_param(scale_param)
+    , m_n_samples(n_samples)
+{
+    setName(BornAgain::FormFactorSphereLogNormalRadiusType);
+    mP_distribution.reset(new DistributionLogNormal(mean, scale_param));
+    registerParameter(BornAgain::MeanRadius, &m_mean).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::ScaleParameter, &m_scale_param);
+    if (!mP_distribution) return;
+    // Init vectors:
+    m_form_factors.clear();
+    m_probabilities.clear();
+    std::vector<ParameterSample> samples = mP_distribution->generateSamples(m_n_samples);
+    for (size_t i=0; i<samples.size(); ++i) {
+        double radius = samples[i].value;
+        m_form_factors.push_back(new FormFactorFullSphere(radius));
+        m_probabilities.push_back(samples[i].weight);
+    }
+}
+
+complex_t FormFactorSphereLogNormalRadius::evaluate_for_q(const cvector_t q) const
+{
+    if (m_form_factors.size()<1)
+        return 0.0;
+    complex_t result(0.0);
+    for (size_t i=0; i<m_form_factors.size(); ++i)
+        result += m_form_factors[i]->evaluate_for_q(q) * m_probabilities[i];
+    return result;
+}
diff --git a/Core/SoftParticle/FormFactorSphereLogNormalRadius.h b/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
new file mode 100644
index 0000000..23bcbce
--- /dev/null
+++ b/Core/SoftParticle/FormFactorSphereLogNormalRadius.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorSphereLogNormalRadius.h
+//! @brief     Defines and implements class FormFactorSphereLogNormalRadius.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORSPHERELOGNORMALRADIUS_H
+#define FORMFACTORSPHERELOGNORMALRADIUS_H
+
+#include "FormFactorFullSphere.h"
+#include "SafePointerVector.h"
+#include "Distributions.h"
+#include <memory>
+
+//! A sphere with log normal radius distribution.
+//! @ingroup softParticle
+
+class BA_CORE_API_ FormFactorSphereLogNormalRadius : public IFormFactorBorn
+{
+public:
+    FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples);
+
+    FormFactorSphereLogNormalRadius* clone() const override final {
+        return new FormFactorSphereLogNormalRadius(m_mean, m_scale_param, m_n_samples); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadialExtension() const override final { return m_mean; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    double m_mean;
+    double m_scale_param;
+    size_t m_n_samples;
+
+    std::unique_ptr<DistributionLogNormal> mP_distribution;
+
+    SafePointerVector<IFormFactorBorn> m_form_factors;
+    std::vector<double> m_probabilities;
+};
+
+#endif // FORMFACTORSPHERELOGNORMALRADIUS_H
diff --git a/Core/SoftParticle/FormFactorSphereUniformRadius.cpp b/Core/SoftParticle/FormFactorSphereUniformRadius.cpp
new file mode 100644
index 0000000..1f520db
--- /dev/null
+++ b/Core/SoftParticle/FormFactorSphereUniformRadius.cpp
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorSphereUniformRadius.cpp
+//! @brief     Implements class FormFactorSphereUniformRadius.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorSphereUniformRadius.h"
+#include "BornAgainNamespace.h"
+#include "Exceptions.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include <limits>
+
+FormFactorSphereUniformRadius::FormFactorSphereUniformRadius(double mean,
+        double full_width)
+    : m_mean(mean)
+    , m_full_width(full_width)
+{
+    if(!checkParameters())
+        throw Exceptions::ClassInitializationException(
+                "FormFactorSphereUniformRadius::FormFactorSphereUniformRadius:"
+                " mean radius must be bigger than the half width");
+    setName(BornAgain::FormFactorSphereUniformRadiusType);
+    registerParameter(BornAgain::MeanRadius, &m_mean).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::FullWidth, &m_full_width).setUnit("nm").setNonnegative();
+}
+
+complex_t FormFactorSphereUniformRadius::evaluate_for_q(const cvector_t q) const
+{
+    double R = m_mean;
+    double W = m_full_width;
+    double q2 = std::norm(q.x()) + std::norm(q.y()) + std::norm(q.z());
+    double q_r = std::sqrt(q2);
+    if (q_r*R < std::numeric_limits<double>::epsilon())
+        return (4.0*M_PI*R*R*R + M_PI*R*W*W)/3.0;
+    double qR = q_r*R;
+    double qW = q_r*W;
+    double nominator = 4*M_PI*( 4*std::sin(qR)*std::sin(qW/2.0)
+                                  - qW*std::cos(qW/2.0)*std::sin(qR)
+                                  - 2.0*qR*std::cos(qR)*std::sin(qW/2.0) );
+    return nominator/(q2*q2*W);
+}
+
+bool FormFactorSphereUniformRadius::checkParameters() const
+{
+    if (m_full_width<=0.0)
+        return false;
+    if (2.0*m_mean<m_full_width)
+        return false;
+    return true;
+}
diff --git a/Core/SoftParticle/FormFactorSphereUniformRadius.h b/Core/SoftParticle/FormFactorSphereUniformRadius.h
new file mode 100644
index 0000000..49adb5e
--- /dev/null
+++ b/Core/SoftParticle/FormFactorSphereUniformRadius.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/SoftParticle/FormFactorSphereUniformRadius.h
+//! @brief     Defines class FormFactorSphereUniformRadius.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORSPHEREUNIFORMRADIUS_H
+#define FORMFACTORSPHEREUNIFORMRADIUS_H
+
+#include "FormFactorFullSphere.h"
+
+//! Integrated full sphere form factor over a uniform distribution of radii.
+//! @ingroup softParticle
+
+class BA_CORE_API_ FormFactorSphereUniformRadius : public IFormFactorBorn
+{
+public:
+    FormFactorSphereUniformRadius(double mean, double full_width);
+
+    FormFactorSphereUniformRadius* clone() const override final {
+        return new FormFactorSphereUniformRadius(m_mean, m_full_width); }
+    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+
+    double getRadialExtension() const override final { return m_mean; }
+
+    complex_t evaluate_for_q(const cvector_t q) const override final;
+
+private:
+    bool checkParameters() const;
+    double m_mean; //!< This is the mean radius
+    double m_full_width; //!< This is the full width of the radius distribution
+};
+
+#endif // FORMFACTORSPHEREUNIFORMRADIUS_H
diff --git a/Core/StandardSamples/BoxCompositionBuilder.cpp b/Core/StandardSamples/BoxCompositionBuilder.cpp
new file mode 100644
index 0000000..6836e09
--- /dev/null
+++ b/Core/StandardSamples/BoxCompositionBuilder.cpp
@@ -0,0 +1,143 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/BoxCompositionBuilder.cpp
+//! @brief     Implements class BoxCompositionBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "BoxCompositionBuilder.h"
+#include "FormFactorBox.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+BoxCompositionBuilder::BoxCompositionBuilder()
+    : m_particleMaterial(new HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7))
+    , m_layer_thickness(100.0*Units::nanometer)
+    , m_length(50.0*Units::nanometer)
+    , m_width(20.0*Units::nanometer)
+    , m_height(10.0*Units::nanometer)
+{
+}
+
+BoxCompositionBuilder::~BoxCompositionBuilder()
+{
+    delete m_particleMaterial;
+}
+
+MultiLayer* BoxCompositionBuilder::createMultiLayer(const ParticleComposition &composition) const
+{
+    HomogeneousMaterial mAmbience("Air", 0.0, 0.0);
+    HomogeneousMaterial mMiddle("Teflon", 2.900e-6, 6.019e-9);
+    HomogeneousMaterial mSubstrate("Substrate", 3.212e-6, 3.244e-8);
+
+    ParticleLayout layout;
+    layout.addParticle(composition);
+
+    Layer air_layer(mAmbience);
+    Layer middle_layer(mMiddle, m_layer_thickness);
+    middle_layer.addLayout(layout);
+    Layer substrate(mSubstrate);
+
+    MultiLayer* multi_layer = new MultiLayer();
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(middle_layer);
+    multi_layer->addLayer(substrate);
+    return multi_layer;
+}
+
+// --- BoxCompositionRotateXBuilder ---
+
+MultiLayer* BoxCompositionRotateXBuilder::buildSample() const
+{
+    Particle box(*m_particleMaterial, FormFactorBox(m_length/2.0, m_width, m_height));
+    ParticleComposition composition;
+    composition.addParticle(box, kvector_t(0.0, 0.0, 0.0));
+    composition.addParticle(box, kvector_t(m_length/2.0, 0.0, 0.0));
+    composition.setRotation(RotationX(90.0*Units::degree));
+    composition.setPosition(kvector_t(0.0, 0.0, -m_layer_thickness/2.0));
+    return createMultiLayer(composition);
+}
+
+// --- BoxCompositionRotateYBuilder ---
+
+MultiLayer* BoxCompositionRotateYBuilder::buildSample() const
+{
+    Particle box(*m_particleMaterial, FormFactorBox(m_length/2.0, m_width, m_height));
+    ParticleComposition composition;
+    composition.addParticle(box, kvector_t(0.0, 0.0, 0.0));
+    composition.addParticle(box, kvector_t(m_length/2.0, 0.0, 0.0));
+    composition.setRotation(RotationY(90.0*Units::degree));
+    composition.setPosition(kvector_t(0.0, 0.0, -m_layer_thickness/2.0 + m_length/4.0));
+    return createMultiLayer(composition);
+}
+
+// --- BoxCompositionRotateZBuilder ---
+
+MultiLayer* BoxCompositionRotateZBuilder::buildSample() const
+{
+    Particle box(*m_particleMaterial, FormFactorBox(m_length/2.0, m_width, m_height));
+    ParticleComposition composition;
+    composition.addParticle(box, kvector_t(0.0, 0.0, 0.0));
+    composition.addParticle(box, kvector_t(m_length/2.0, 0.0, 0.0));
+    composition.setRotation(RotationZ(90.0*Units::degree));
+    composition.setPosition(kvector_t(0.0, 0.0, -m_layer_thickness/2.0  - m_height/2.0));
+    return createMultiLayer(composition);
+}
+
+// --- BoxCompositionRotateZandYBuilder ---
+
+MultiLayer* BoxCompositionRotateZandYBuilder::buildSample() const
+{
+    Particle box(*m_particleMaterial, FormFactorBox(m_length/2.0, m_width, m_height));
+    ParticleComposition composition;
+    composition.addParticle(box, kvector_t(0.0, 0.0, 0.0));
+    composition.addParticle(box, kvector_t(m_length/2.0, 0.0, 0.0));
+    composition.setRotation(RotationZ(90.0*Units::degree));
+    composition.applyRotation(RotationY(90.0*Units::degree));
+    composition.setPosition(kvector_t(0.0, 0.0, -m_layer_thickness/2.0 ));
+    return createMultiLayer(composition);
+}
+
+// --- BoxStackCompositionBuilder ---
+
+// Composition of two boxes which gives you the box (10,20,50) with reference point as usual.
+MultiLayer* BoxStackCompositionBuilder::buildSample() const
+{
+    ParticleComposition composition;
+
+    // box1 (20,50,5), rotatedZ
+    const double box1_length = 20;
+    const double box1_width = 50;
+    const double box1_height = 5;
+    Particle box1(*m_particleMaterial, FormFactorBox(box1_length, box1_width, box1_height));
+    box1.setRotation(RotationZ(90.*Units::degree));
+
+    // box2 (5,20,50), rotatedY
+    const double box2_length = 5.0;
+    const double box2_width = 20.0;
+    const double box2_height = 50.0;
+    Particle box2(*m_particleMaterial, FormFactorBox(box2_length, box2_width, box2_height));
+    box2.setRotation(RotationY(90.*Units::degree));
+    box2.setPosition(kvector_t(-box2_height/2.0, 0.0, box2_length/2.0));
+
+    composition.addParticle(box1, kvector_t(0.0, 0.0, 0.0));
+    composition.addParticle(box2, kvector_t(0.0, 0.0, box1_height));
+    composition.setRotation(RotationY(90.0*Units::degree));
+    composition.setPosition(kvector_t(0.0, 0.0, -m_layer_thickness/2.));
+
+    return createMultiLayer(composition);
+}
diff --git a/Core/StandardSamples/BoxCompositionBuilder.h b/Core/StandardSamples/BoxCompositionBuilder.h
new file mode 100644
index 0000000..d1c2299
--- /dev/null
+++ b/Core/StandardSamples/BoxCompositionBuilder.h
@@ -0,0 +1,101 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/BoxCompositionBuilder.h
+//! @brief     Defines classes of BoxCompositionBuilder family.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BOXCOMPOSITIONBUILDER_H
+#define BOXCOMPOSITIONBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+class HomogeneousMaterial;
+class MultiLayer;
+class ParticleComposition;
+
+//! @class BoxCompositionBuilder
+//! @ingroup standard_samples
+//! @brief Parent class to test all kind of compositions made out of boxes.
+//! Reproduces Python functional test transform_BoxComposition.py
+
+class BA_CORE_API_ BoxCompositionBuilder : public IMultiLayerBuilder
+{
+public:
+    BoxCompositionBuilder();
+    virtual ~BoxCompositionBuilder();
+
+protected:
+    MultiLayer* createMultiLayer(const ParticleComposition& composition) const;
+    const HomogeneousMaterial* m_particleMaterial;
+    const double m_layer_thickness;
+    const double m_length;
+    const double m_width;
+    const double m_height;
+};
+
+//! @class BoxCompositionRotateXBuilder
+//! @ingroup standard_samples
+//! @brief Two boxes in particle composition rotated in X by 90 degrees.
+
+class BA_CORE_API_ BoxCompositionRotateXBuilder : public BoxCompositionBuilder
+{
+public:
+    BoxCompositionRotateXBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+//! @class BoxCompositionRotateYBuilder
+//! @ingroup standard_samples
+//! @brief Two boxes in particle composition rotated in Y by 90 degrees.
+
+class BA_CORE_API_ BoxCompositionRotateYBuilder : public BoxCompositionBuilder
+{
+public:
+    BoxCompositionRotateYBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+//! @class BoxCompositionRotateZBuilder
+//! @ingroup standard_samples
+//! @brief Two boxes in particle composition rotated in Z by 90 degrees.
+
+class BA_CORE_API_ BoxCompositionRotateZBuilder : public BoxCompositionBuilder
+{
+public:
+    BoxCompositionRotateZBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+//! @class BoxCompositionRotateZandYBuilder
+//! @ingroup standard_samples
+//! @brief Two boxes in particle composition rotated in Z and Y by 90 degrees.
+
+class BA_CORE_API_ BoxCompositionRotateZandYBuilder : public BoxCompositionBuilder
+{
+public:
+    BoxCompositionRotateZandYBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+//! @class BoxStackCompositionBuilder
+//! @ingroup standard_samples
+//! @brief Two different boxes are first rotated and then composed, composition is then rotated.
+
+class BA_CORE_API_ BoxStackCompositionBuilder : public BoxCompositionBuilder
+{
+public:
+    BoxStackCompositionBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+#endif // BOXCOMPOSITIONBUILDER_H
diff --git a/Core/StandardSamples/CoreShellParticleBuilder.cpp b/Core/StandardSamples/CoreShellParticleBuilder.cpp
new file mode 100644
index 0000000..d986fd1
--- /dev/null
+++ b/Core/StandardSamples/CoreShellParticleBuilder.cpp
@@ -0,0 +1,100 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CoreShellParticleBuilder.cpp
+//! @brief     Implements class CoreShellParticleBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "CoreShellParticleBuilder.h"
+#include "FormFactorBox.h"
+#include "Layer.h"
+#include "Materials.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleCoreShell.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+// --- CoreShellParticleBuilder ---
+
+MultiLayer* CoreShellParticleBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+
+    complex_t n_particle_shell(1.0-1e-4, 2e-8);
+    complex_t n_particle_core(1.0-6e-5, 2e-8);
+
+    HomogeneousMaterial shell_material("Shell", n_particle_shell);
+    HomogeneousMaterial core_material("Core", n_particle_core);
+
+    Layer air_layer(air_material);
+
+    FormFactorBox ff_box1(16*Units::nanometer, 16*Units::nanometer, 8*Units::nanometer);
+    Particle shell_particle(shell_material, ff_box1);
+
+    FormFactorBox ff_box2(12*Units::nanometer, 12*Units::nanometer, 7*Units::nanometer);
+    Particle core_particle(core_material, ff_box2);
+
+    kvector_t core_position(0.0, 0.0, 0.0);
+    ParticleCoreShell particle(shell_particle, core_particle, core_position);
+    ParticleLayout particle_layout(particle);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    return multi_layer;
+}
+
+// --- CoreShellBoxRotateZandYBuilder ---
+
+MultiLayer* CoreShellBoxRotateZandYBuilder::buildSample() const
+{
+    const double layer_thickness(100.0*Units::nanometer);
+
+    HomogeneousMaterial mAmbience("Air", 0.0, 0.0);
+    HomogeneousMaterial mMiddle("Teflon", 2.900e-6, 6.019e-9);
+    HomogeneousMaterial mSubstrate("Substrate", 3.212e-6, 3.244e-8);
+    HomogeneousMaterial mCore("Ag", 1.245e-5, 5.419e-7);
+    HomogeneousMaterial mShell("AgO2", 8.600e-6, 3.442e-7);
+
+    // core shell particle
+    const double shell_length(50.0*Units::nanometer);
+    const double shell_width(20.0*Units::nanometer);
+    const double shell_height(10.0*Units::nanometer);
+    double core_length = shell_length/2.0;
+    double core_width = shell_width/2.0;
+    double core_height = shell_height/2.0;
+
+    Particle core(mCore, FormFactorBox(core_length, core_width, core_height));
+    Particle shell(mShell, FormFactorBox(shell_length, shell_width, shell_height));
+    ParticleCoreShell coreshell(shell, core, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0));
+    coreshell.setRotation(RotationZ(90.0*Units::degree));
+    coreshell.applyRotation(RotationY(90.0*Units::degree));
+    coreshell.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0));
+
+    ParticleLayout layout;
+    layout.addParticle(coreshell);
+
+    Layer air_layer(mAmbience);
+    Layer middle_layer(mMiddle, layer_thickness);
+    middle_layer.addLayout(layout);
+    Layer substrate(mSubstrate);
+
+    MultiLayer* multi_layer = new MultiLayer();
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(middle_layer);
+    multi_layer->addLayer(substrate);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/CoreShellParticleBuilder.h b/Core/StandardSamples/CoreShellParticleBuilder.h
new file mode 100644
index 0000000..68e49e4
--- /dev/null
+++ b/Core/StandardSamples/CoreShellParticleBuilder.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CoreShellParticleBuilder.h
+//! @brief     Defines class CoreShellParticleBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CORESHELLPARTICLEBUILDER_H
+#define CORESHELLPARTICLEBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class CoreShellParticleBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: Core Shell Nanoparticles (IsGISAXS example #11).
+
+class BA_CORE_API_ CoreShellParticleBuilder : public IMultiLayerBuilder
+{
+public:
+    CoreShellParticleBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+
+//! @class CoreShellBoxRotateZandYBuilder
+//! @ingroup standard_samples
+//! @brief Rotation and translation of core shell box particle in 3 layers system.
+
+class BA_CORE_API_ CoreShellBoxRotateZandYBuilder : public IMultiLayerBuilder
+{
+public:
+    CoreShellBoxRotateZandYBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+#endif // CORESHELLPARTICLEBUILDER_H
diff --git a/Core/StandardSamples/CustomMorphologyBuilder.cpp b/Core/StandardSamples/CustomMorphologyBuilder.cpp
new file mode 100644
index 0000000..5262006
--- /dev/null
+++ b/Core/StandardSamples/CustomMorphologyBuilder.cpp
@@ -0,0 +1,111 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CustomMorphologyBuilder.cpp
+//! @brief     Implements class CustomMorphologyBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "CustomMorphologyBuilder.h"
+#include "FormFactorBox.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+MultiLayer* CustomMorphologyBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+
+    ParticleLayout particle_layout;
+
+    // add particle number 1:
+    FormFactorBox ff1(2.0*Units::nanometer, 2.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos1(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
+    Particle p1(particle_material, ff1);
+    p1.setPosition(pos1);
+    particle_layout.addParticle(p1, 0.5);
+    // add particle number 2:
+    FormFactorBox ff2(2.0*Units::nanometer, 4.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos2(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    RotationZ m2(10*Units::degree);
+    Particle p2(particle_material, ff2, m2);
+    p2.setPosition(pos2);
+    particle_layout.addParticle(p2, 0.5);
+    // add particle number 3:
+    FormFactorBox ff3(2.0*Units::nanometer, 6.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos3(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    RotationZ m3(20*Units::degree);
+    Particle p3(particle_material, ff3, m3);
+    p3.setPosition(pos3);
+    particle_layout.addParticle(p3, 0.5);
+    // add particle number 4:
+    FormFactorBox ff4(2.0*Units::nanometer, 8.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos4(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    RotationZ m4(30*Units::degree);
+    Particle p4(particle_material, ff4, m4);
+    p4.setPosition(pos4);
+    particle_layout.addParticle(p4, 0.5);
+    // add particle number 5:
+    FormFactorBox ff5(2.0*Units::nanometer, 10.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos5(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    RotationZ m5(40*Units::degree);
+    Particle p5(particle_material, ff5, m5);
+    p5.setPosition(pos5);
+    particle_layout.addParticle(p5, 0.5);
+    // add particle number 6:
+    FormFactorBox ff6(2.0*Units::nanometer, 2.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos6(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
+    RotationZ m6(50*Units::degree);
+    Particle p6(particle_material, ff6, m6);
+    p6.setPosition(pos6);
+    particle_layout.addParticle(p6, 0.5);
+    // add particle number 7:
+    FormFactorBox ff7(2.0*Units::nanometer, 4.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos7(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    RotationZ m7(60*Units::degree);
+    Particle p7(particle_material, ff7, m7);
+    p7.setPosition(pos7);
+    particle_layout.addParticle(p7, 0.5);
+    // add particle number 8:
+    FormFactorBox ff8(2.0*Units::nanometer, 6.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos8(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    RotationZ m8(70*Units::degree);
+    Particle p8(particle_material, ff8, m8);
+    p8.setPosition(pos8);
+    particle_layout.addParticle(p8, 0.5);
+    // add particle number 9:
+    FormFactorBox ff9(2.0*Units::nanometer, 8.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos9(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    RotationZ m9(80*Units::degree);
+    Particle p9(particle_material, ff9, m9);
+    p9.setPosition(pos9);
+    particle_layout.addParticle(p9, 0.5);
+    // add particle number 10:
+    FormFactorBox ff10(2.0*Units::nanometer, 10.0*Units::nanometer, 1.0*Units::nanometer);
+    kvector_t pos10(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    RotationZ m10(90*Units::degree);
+    Particle p10(particle_material, ff10, m10);
+    p10.setPosition(pos10);
+    particle_layout.addParticle(p10, 0.5);
+
+    air_layer.addLayout(particle_layout);
+    multi_layer->addLayer(air_layer);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/CustomMorphologyBuilder.h b/Core/StandardSamples/CustomMorphologyBuilder.h
new file mode 100644
index 0000000..5b1d1b4
--- /dev/null
+++ b/Core/StandardSamples/CustomMorphologyBuilder.h
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CustomMorphologyBuilder.h
+//! @brief     Defines class CustomMorphologyBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CUSTOMMORPHOLOGYBUILDER_H
+#define CUSTOMMORPHOLOGYBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class CustomMorphologyBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: mixture of different particles (IsGISAXS example #7)
+
+class BA_CORE_API_ CustomMorphologyBuilder : public IMultiLayerBuilder
+{
+public:
+    CustomMorphologyBuilder() {}
+    MultiLayer* buildSample() const;
+};
+
+#endif // CUSTOMMORPHOLOGYBUILDER_H
diff --git a/Core/StandardSamples/CylindersAndPrismsBuilder.cpp b/Core/StandardSamples/CylindersAndPrismsBuilder.cpp
new file mode 100644
index 0000000..7efa731
--- /dev/null
+++ b/Core/StandardSamples/CylindersAndPrismsBuilder.cpp
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CylindersAndPrismsBuilder.cpp
+//! @brief     Implements class CylindersAndPrismsBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "CylindersAndPrismsBuilder.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorPrism3.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+CylindersAndPrismsBuilder::CylindersAndPrismsBuilder()
+    : m_cylinder_height(5*Units::nanometer)
+    , m_cylinder_radius(5*Units::nanometer)
+    , m_prism_height(5*Units::nanometer)
+    , m_prism_length(10*Units::nanometer)
+    , m_cylinder_weight(0.5)
+{
+    init_parameters();
+}
+
+void CylindersAndPrismsBuilder::init_parameters()
+{
+
+    registerParameter("cylinder_height", &m_cylinder_height).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_radius", &m_cylinder_radius).setUnit("nm").setNonnegative();
+    registerParameter("prism_height", &m_prism_height).setUnit("nm").setNonnegative();
+    registerParameter("prism_length", &m_prism_length).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_weight", &m_cylinder_weight).setNonnegative();
+}
+
+MultiLayer* CylindersAndPrismsBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0., 0.);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    ParticleLayout particle_layout;
+
+    FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
+    Particle cylinder(particle_material, ff_cylinder);
+
+    FormFactorPrism3 ff_prism3(m_prism_length, m_prism_height);
+    Particle prism3(particle_material, ff_prism3);
+
+    particle_layout.addParticle(cylinder, m_cylinder_weight);
+    particle_layout.addParticle(prism3, 1.0-m_cylinder_weight);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/CylindersAndPrismsBuilder.h b/Core/StandardSamples/CylindersAndPrismsBuilder.h
new file mode 100644
index 0000000..b01c862
--- /dev/null
+++ b/Core/StandardSamples/CylindersAndPrismsBuilder.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CylindersAndPrismsBuilder.h
+//! @brief     Defines class CylindersAndPrismsBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CYLINDERSANDPRISMSBUILDER_H
+#define CYLINDERSANDPRISMSBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class CylindersAndPrismsBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: mixture of cylinders and prisms without interference
+//! (IsGISAXS example #1)
+
+class BA_CORE_API_ CylindersAndPrismsBuilder : public IMultiLayerBuilder
+{
+public:
+    CylindersAndPrismsBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_cylinder_height;
+    double m_cylinder_radius;
+    double m_prism_height;
+    double m_prism_length;
+    double m_cylinder_weight;
+};
+
+#endif // CYLINDERSANDPRISMSBUILDER_H
diff --git a/Core/StandardSamples/CylindersBuilder.cpp b/Core/StandardSamples/CylindersBuilder.cpp
new file mode 100644
index 0000000..feebedf
--- /dev/null
+++ b/Core/StandardSamples/CylindersBuilder.cpp
@@ -0,0 +1,143 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CylindersBuilder.cpp
+//! @brief     Implements classes of CylindersBuilder family.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "CylindersBuilder.h"
+#include "BornAgainNamespace.h"
+#include "FormFactorCylinder.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+// -----------------------------------------------------------------------------
+// Cylinders in DWBA
+// -----------------------------------------------------------------------------
+CylindersInDWBABuilder::CylindersInDWBABuilder()
+    : m_height(5*Units::nanometer)
+    , m_radius(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+void CylindersInDWBABuilder::init_parameters()
+{
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* CylindersInDWBABuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    FormFactorCylinder ff_cylinder(m_radius, m_height);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+// -----------------------------------------------------------------------------
+// Cylinders in BA
+// -----------------------------------------------------------------------------
+CylindersInBABuilder::CylindersInBABuilder()
+    : m_height(5*Units::nanometer)
+    , m_radius(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+void CylindersInBABuilder::init_parameters()
+{
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* CylindersInBABuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+
+    FormFactorCylinder ff_cylinder(m_radius, m_height);
+    Particle cylinder(particle_material,ff_cylinder);
+
+    ParticleLayout particle_layout(cylinder);
+
+    air_layer.addLayout(particle_layout);
+    multi_layer->addLayer(air_layer);
+
+    return multi_layer;
+}
+
+// -----------------------------------------------------------------------------
+// Large cylinders in DWBA
+// -----------------------------------------------------------------------------
+LargeCylindersInDWBABuilder::LargeCylindersInDWBABuilder()
+    : m_height(1000*Units::nanometer)
+    , m_radius(500*Units::nanometer)
+{
+    init_parameters();
+}
+
+void LargeCylindersInDWBABuilder::init_parameters()
+{
+
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* LargeCylindersInDWBABuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    FormFactorCylinder ff_cylinder(m_radius, m_height);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/CylindersBuilder.h b/Core/StandardSamples/CylindersBuilder.h
new file mode 100644
index 0000000..6a90686
--- /dev/null
+++ b/Core/StandardSamples/CylindersBuilder.h
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/CylindersBuilder.h
+//! @brief     Defines classes of CylindersBuilder family.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CYLINDERSBUILDER_H
+#define CYLINDERSBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class CylindersInDWBABuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cylinder formfactor in DWBA (IsGISAXS example #3, part I)
+
+class BA_CORE_API_ CylindersInDWBABuilder : public IMultiLayerBuilder
+{
+public:
+    CylindersInDWBABuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_height;
+    double m_radius;
+};
+
+//! @class CylindersInBABuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cylinder formfactor in BA (IsGISAXS example #3, part II)
+
+class BA_CORE_API_ CylindersInBABuilder : public IMultiLayerBuilder
+{
+public:
+    CylindersInBABuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_height;
+    double m_radius;
+};
+
+//! @class LargeCylindersInDWBABuilder
+//! @ingroup standard_samples
+//! @brief Builds sample with large cylinders for MC integration tests
+
+class BA_CORE_API_ LargeCylindersInDWBABuilder : public IMultiLayerBuilder
+{
+public:
+    LargeCylindersInDWBABuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_height;
+    double m_radius;
+};
+
+#endif // CYLINDERSBUILDER_H
diff --git a/Core/StandardSamples/IFactory.h b/Core/StandardSamples/IFactory.h
new file mode 100644
index 0000000..5ef4e84
--- /dev/null
+++ b/Core/StandardSamples/IFactory.h
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/IFactory.h
+//! @brief     Defines interface class IFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IFACTORY_H
+#define IFACTORY_H
+
+#include "Exceptions.h"
+#include <functional>
+#include <map>
+#include <sstream>
+
+//! Base class for all factories.
+//! @ingroup tools_internal
+
+template<class Key, class AbstractProduct >
+class IFactory
+{
+public:
+    //! function which will be used to create object of AbstractProduct base type
+    typedef typename std::function<AbstractProduct*()> CreateItemCallback;
+
+    //! map for correspondance between object identifier and object creation function
+    typedef std::map<Key, CreateItemCallback> CallbackMap_t;
+
+    //! map for correspondance between object identifier and object description
+    typedef std::map<Key, std::string> DescriptionMap_t;
+    typedef typename DescriptionMap_t::iterator iterator;
+    typedef typename DescriptionMap_t::const_iterator const_iterator;
+
+    IFactory() {}
+
+    //! Creates object by calling creation function corresponded to given identifier
+    AbstractProduct* createItem(const Key& item_key) {
+        auto it = m_callbacks.find(item_key);
+        if( it == m_callbacks.end() ) {
+            std::ostringstream message;
+            message << "IFactory::createItem() -> Error. Unknown item key '"
+                    << item_key << "'";
+            throw Exceptions::RuntimeErrorException(message.str());
+        }
+        return (it->second)();
+    }
+
+    //! Registers object's creation function and store object description
+    bool registerItem(const Key& item_key, CreateItemCallback CreateFn,
+                      const std::string& itemDescription="") {
+        if (m_callbacks.find(item_key) != m_callbacks.end()) {
+            std::ostringstream message;
+            message << "IFactory::createItem() -> Error. Already registered item key '"
+                    << item_key << "'";
+            throw Exceptions::RuntimeErrorException(message.str());
+        }
+        if (itemDescription!="")
+            m_descriptions.insert(make_pair(item_key, itemDescription));
+        return m_callbacks.insert(make_pair(item_key, CreateFn)).second;
+    }
+
+    ~IFactory() {}
+
+    //! Returns number of registered objects
+    size_t getNumberOfRegistered() const { return m_callbacks.size(); }
+
+    const_iterator begin() const { return m_descriptions.begin(); }
+    const_iterator end() const { return m_descriptions.end(); }
+
+protected:
+    CallbackMap_t m_callbacks;     //!< map of correspondence of objectsId and creation functions
+    DescriptionMap_t m_descriptions;     //!< map of correspondence of objectsId and description
+};
+
+template<class T> T* create_new() { return new T(); }
+
+#endif // IFACTORY_H
diff --git a/Core/StandardSamples/LatticeBuilder.cpp b/Core/StandardSamples/LatticeBuilder.cpp
new file mode 100644
index 0000000..f2aeb77
--- /dev/null
+++ b/Core/StandardSamples/LatticeBuilder.cpp
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/LatticeBuilder.cpp
+//! @brief     Implements class Lattice1DBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "LatticeBuilder.h"
+#include "FTDecayFunctions.h"
+#include "FormFactorCylinder.h"
+#include "HomogeneousMaterial.h"
+#include "InterferenceFunction1DLattice.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+Lattice1DBuilder::Lattice1DBuilder()
+    : m_length(20.0*Units::nanometer)
+    , m_xi(10.0*Units::deg)
+    , m_corr_length(1000.0*Units::nanometer)
+    , m_cylinder_height(5*Units::nanometer)
+    , m_cylinder_radius(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+MultiLayer* Lattice1DBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    InterferenceFunction1DLattice interference_function(m_length, m_xi);
+    FTDecayFunction1DCauchy pdf(1000.0*Units::nanometer);
+    interference_function.setDecayFunction(pdf);
+
+    FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
+    Particle cylinder(particle_material, ff_cylinder);
+
+    ParticleLayout particle_layout(cylinder);
+    particle_layout.addInterferenceFunction(interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+void Lattice1DBuilder::init_parameters()
+{
+    registerParameter("lattice_length", &m_length).setUnit("nm").setNonnegative();
+    registerParameter("lattice_rotation", &m_xi).setUnit("rad");
+    registerParameter("corr_length", &m_corr_length).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_height", &m_cylinder_height).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_radius", &m_cylinder_radius).setUnit("nm").setNonnegative();
+}
diff --git a/Core/StandardSamples/LatticeBuilder.h b/Core/StandardSamples/LatticeBuilder.h
new file mode 100644
index 0000000..b170c80
--- /dev/null
+++ b/Core/StandardSamples/LatticeBuilder.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/LatticeBuilder.h
+//! @brief     Defines class Lattice1DBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LATTICEBUILDER_H
+#define LATTICEBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class Lattice1DBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cylinders with 1DDL structure factor
+
+class BA_CORE_API_ Lattice1DBuilder : public IMultiLayerBuilder
+{
+public:
+    Lattice1DBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_length;
+    double m_xi;
+    double m_corr_length;
+    double m_cylinder_height;
+    double m_cylinder_radius;
+};
+
+#endif // LATTICEBUILDER_H
diff --git a/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
new file mode 100644
index 0000000..25430bd
--- /dev/null
+++ b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
+//! @brief     Implements class LayersWithAbsorptionBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "LayersWithAbsorptionBuilder.h"
+#include "Exceptions.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+MultiLayer* LayersWithAbsorptionBuilder::buildSample() const
+{
+    const IFormFactor* form_factor = getFormFactor();
+    if(!form_factor)
+        throw Exceptions::NullPointerException(
+            "LayersWithAbsorptionBuilder::buildSample() -> Error. Form factor is not initialized.");
+
+    HomogeneousMaterial mAmbience("Air", 0.0, 0.0);
+    HomogeneousMaterial mMiddle("Teflon", 2.900e-6, 6.019e-9);
+    HomogeneousMaterial mSubstrate("Substrate", 3.212e-6, 3.244e-8);
+    HomogeneousMaterial mParticle("Ag", 1.245e-5, 5.419e-7);
+
+    const double middle_layer_thickness(60.0*Units::nanometer);
+
+    Particle particle(mParticle, *form_factor);
+    particle.setRotation(RotationZ(10.0*Units::degree));
+    particle.applyRotation(RotationY(10.0*Units::degree));
+    particle.applyRotation(RotationX(10.0*Units::degree));
+    particle.setPosition(kvector_t(0.0, 0.0, -middle_layer_thickness/2.0 ));
+
+    ParticleLayout layout;
+    layout.addParticle(particle);
+
+    Layer air_layer(mAmbience);
+    Layer middle_layer(mMiddle, middle_layer_thickness);
+    Layer substrate(mSubstrate);
+
+    middle_layer.addLayout(layout);
+
+    MultiLayer* multi_layer = new MultiLayer();
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(middle_layer);
+    multi_layer->addLayer(substrate);
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/LayersWithAbsorptionBuilder.h b/Core/StandardSamples/LayersWithAbsorptionBuilder.h
new file mode 100644
index 0000000..226d381
--- /dev/null
+++ b/Core/StandardSamples/LayersWithAbsorptionBuilder.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/LayersWithAbsorptionBuilder.h
+//! @brief     Defines class LayersWithAbsorptionBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERSWITHABSORPTIONBUILDER_H
+#define LAYERSWITHABSORPTIONBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! The LayersWithAbsorptionBuilder class generates a multilayer with 3 layers with
+//! absorption (refractive index has imaginary part).
+//! @ingroup standard_samples
+
+//! The middle layer is populated with particles.
+//! Requires IComponentService which generates form factors, used for bulk form factors testing.
+
+class BA_CORE_API_ LayersWithAbsorptionBuilder : public IMultiLayerBuilder
+{
+public:
+    LayersWithAbsorptionBuilder() {}
+    virtual ~LayersWithAbsorptionBuilder() {}
+    virtual MultiLayer* buildSample() const;
+};
+
+#endif // LAYERSWITHABSORPTIONBUILDER_H
diff --git a/Core/StandardSamples/MagneticParticlesBuilder.cpp b/Core/StandardSamples/MagneticParticlesBuilder.cpp
new file mode 100644
index 0000000..b63971a
--- /dev/null
+++ b/Core/StandardSamples/MagneticParticlesBuilder.cpp
@@ -0,0 +1,108 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MagneticParticlesBuilder.cpp
+//! @brief     Implements classes to build magnetic samples
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MagneticParticlesBuilder.h"
+#include "FormFactorCylinder.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "Materials.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+// ----------------------------------------------------------------------------
+// Magnetic cylinders and zero magnetic field
+// ----------------------------------------------------------------------------
+
+MagneticParticleZeroFieldBuilder::MagneticParticleZeroFieldBuilder()
+    :  m_cylinder_radius(5*Units::nanometer)
+    ,  m_cylinder_height(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+void MagneticParticleZeroFieldBuilder::init_parameters()
+{
+    registerParameter("cylinder_radius", &m_cylinder_radius).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_height", &m_cylinder_height).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* MagneticParticleZeroFieldBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    kvector_t magnetic_field(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial particle_material("MagParticle", 6e-4, 2e-8, magnetic_field);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+    return multi_layer;
+}
+
+// ----------------------------------------------------------------------------
+// Magnetic cylinders and non-zero magnetic field
+// ----------------------------------------------------------------------------
+MagneticCylindersBuilder::MagneticCylindersBuilder()
+    :  m_cylinder_radius(5*Units::nanometer)
+    ,  m_cylinder_height(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+void MagneticCylindersBuilder::init_parameters()
+{
+
+    registerParameter("cylinder_radius", &m_cylinder_radius).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_height", &m_cylinder_height).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* MagneticCylindersBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 15e-6, 0.0);
+    kvector_t magnetic_field(0.0, 1.0, 0.0);
+    HomogeneousMagneticMaterial particle_material("MagParticle2", 5e-6, 0.0, magnetic_field);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/MagneticParticlesBuilder.h b/Core/StandardSamples/MagneticParticlesBuilder.h
new file mode 100644
index 0000000..c1ad70d
--- /dev/null
+++ b/Core/StandardSamples/MagneticParticlesBuilder.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MagneticParticlesBuilder.h
+//! @brief     Defines class to build magnetic samples
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MAGNETICPARTICLESBUILDER_H
+#define MAGNETICPARTICLESBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class MagneticParticleZeroFieldBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cylinders with magnetic material and zero magnetic field.
+
+class BA_CORE_API_ MagneticParticleZeroFieldBuilder : public IMultiLayerBuilder
+{
+public:
+    MagneticParticleZeroFieldBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_cylinder_radius;
+    double m_cylinder_height;
+};
+
+//! @class MagneticCylindersBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cylinders with magnetic material and non-zero magnetic field.
+
+class BA_CORE_API_ MagneticCylindersBuilder : public IMultiLayerBuilder
+{
+public:
+    MagneticCylindersBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_cylinder_radius;
+    double m_cylinder_height;
+};
+
+#endif // MAGNETICPARTICLESBUILDER_H
diff --git a/Core/StandardSamples/MesoCrystalBuilder.cpp b/Core/StandardSamples/MesoCrystalBuilder.cpp
new file mode 100644
index 0000000..fbd4e9a
--- /dev/null
+++ b/Core/StandardSamples/MesoCrystalBuilder.cpp
@@ -0,0 +1,175 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MesoCrystalBuilder.cpp
+//! @brief     Implements class MesoCrystalBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MesoCrystalBuilder.h"
+#include "Crystal.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorDecoratorDebyeWaller.h"
+#include "FormFactorSphereGaussianRadius.h"
+#include "HomogeneousMaterial.h"
+#include "ISelectionRule.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "MesoCrystal.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleLayout.h"
+#include "MathConstants.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+MesoCrystalBuilder::MesoCrystalBuilder()
+    : m_lattice_length_a(6.2091e+00*Units::nanometer)
+    , m_lattice_length_c(6.5677e+00*Units::nanometer)
+    , m_nanoparticle_radius(4.6976e+00*Units::nanometer)
+    , m_sigma_nanoparticle_radius(3.6720e-01*Units::nanometer)
+    , m_meso_height(1.1221e+02*Units::nanometer)
+    , m_meso_radius(9.4567e+02*Units::nanometer)
+    , m_sigma_meso_height(1.3310e+00*Units::nanometer)
+    , m_sigma_meso_radius(1.3863e+00*Units::nanometer)
+    , m_sigma_lattice_length_a(1.1601e+00*Units::nanometer)
+    , m_surface_filling_ratio(1.7286e-01)
+    , m_roughness(12e+00*Units::nanometer)
+    , m_nphi_rotations(2)
+{
+    init_parameters();
+}
+
+void MesoCrystalBuilder::init_parameters()
+{
+    registerParameter("meso_radius", &m_meso_radius).setUnit("nm").setNonnegative();
+    registerParameter("surface_filling_ratio", &m_surface_filling_ratio).setNonnegative();
+    registerParameter("meso_height", &m_meso_height).setUnit("nm").setNonnegative();
+    registerParameter("sigma_meso_height", &m_sigma_meso_height).setUnit("nm").setNonnegative();
+    registerParameter("sigma_meso_radius", &m_sigma_meso_radius).setUnit("nm").setNonnegative();
+    registerParameter("lattice_length_a", &m_lattice_length_a).setUnit("nm").setNonnegative();
+    registerParameter("lattice_length_c", &m_lattice_length_c).setUnit("nm").setNonnegative();
+    registerParameter("nanoparticle_radius", &m_nanoparticle_radius).setUnit("nm").setNonnegative();
+    registerParameter("sigma_nanoparticle_radius", &m_sigma_nanoparticle_radius).
+        setUnit("nm").setNonnegative();
+    registerParameter("sigma_lattice_length_a", &m_sigma_lattice_length_a).
+        setUnit("nm").setNonnegative();
+    registerParameter("roughness", &m_roughness).setUnit("nm").setNonnegative();
+    registerParameter("nphi_rotations", &m_nphi_rotations).setNonnegative();
+}
+
+
+// create mesocrystal
+MultiLayer* MesoCrystalBuilder::buildSample() const
+{
+    // create mesocrystal
+    double surface_density = m_surface_filling_ratio/M_PI/m_meso_radius/m_meso_radius;
+//    complex_t n_particle(1.0-1.55e-5, 1.37e-6); // data from Artur
+    // data from http://henke.lbl.gov/optical_constants/getdb2.html
+    complex_t n_particle(1.0-2.84e-5, 4.7e-7);
+    complex_t avg_n_squared_meso = 0.7886*n_particle*n_particle + 0.2114;
+    complex_t n_avg = std::sqrt(m_surface_filling_ratio*avg_n_squared_meso + 1.0 -
+                                m_surface_filling_ratio);
+    complex_t n_particle_adapted = std::sqrt(n_avg*n_avg + n_particle*n_particle - 1.0);
+    FormFactorCylinder ff_cyl(m_meso_radius, m_meso_height);
+    FormFactorDecoratorDebyeWaller ff_meso(ff_cyl, m_sigma_meso_height*m_sigma_meso_height/2.0,
+                                           m_sigma_meso_radius*m_sigma_meso_radius/2.0);
+
+    // Create multilayer
+    MultiLayer* p_multi_layer = new MultiLayer();
+
+    complex_t n_air(1.0, 0.0);
+    complex_t n_substrate(1.0-7.57e-6, 1.73e-7);
+
+    HomogeneousMaterial air_material("Air", n_air);
+    HomogeneousMaterial average_layer_material("Averagelayer", n_avg);
+    HomogeneousMaterial substrate_material("Substrate", n_substrate);
+
+    Layer air_layer(air_material);
+    Layer avg_layer(average_layer_material, m_meso_height);
+    Layer substrate_layer(substrate_material);
+
+    ParticleLayout particle_layout;
+    size_t n_max_phi_rotation_steps = int(m_nphi_rotations);
+    size_t n_alpha_rotation_steps = 1;
+
+//    double alpha_step = 5.0*Units::degree/n_alpha_rotation_steps;
+//    double alpha_start = - (n_alpha_rotation_steps/2.0)*alpha_step;
+
+    double phi_step = M_TWOPI/3.0/n_max_phi_rotation_steps;
+    double phi_start = 0.0;
+    for (size_t i=0; i<n_max_phi_rotation_steps; ++i) {
+        for (size_t j=0; j<n_alpha_rotation_steps; ++j) {
+            RotationZ z_rotation(phi_start + i*phi_step);
+            const std::unique_ptr<MesoCrystal> P_meso(createMesoCrystal(
+                                    m_lattice_length_a, m_lattice_length_c,
+                                    n_particle_adapted, &ff_meso) );
+            P_meso->setPosition(0.0, 0.0, -m_meso_height);
+//            particle_layout.addParticle(*P_meso, z_rotation);
+            particle_layout.addParticle(*P_meso, 1.0, kvector_t(0.0, 0.0, 0.0), z_rotation);
+        }
+    }
+
+    particle_layout.setTotalParticleSurfaceDensity(surface_density);
+
+    avg_layer.addLayout(particle_layout);
+
+    LayerRoughness roughness(m_roughness, 0.3, 500.0*Units::nanometer);
+
+    p_multi_layer->addLayer(air_layer);
+    p_multi_layer->addLayer(avg_layer);
+    p_multi_layer->addLayerWithTopRoughness(substrate_layer, roughness);
+
+//    std::cout << "Average layer index: " << n_avg << std::endl;
+//    std::cout << "Adapted particle index: " << n_particle_adapted << std::endl;
+//    std::cout << "Substrate layer index: " << n_substrate << std::endl;
+
+    return p_multi_layer;
+}
+
+MesoCrystal* MesoCrystalBuilder::createMesoCrystal(
+    double stacking_radius_a, double stacking_radius_c, complex_t n_particle,
+    const IFormFactor* p_meso_form_factor) const
+{
+    const Lattice* p_lat = createLattice(stacking_radius_a, stacking_radius_c);
+    kvector_t bas_a = p_lat->getBasisVectorA();
+    kvector_t bas_b = p_lat->getBasisVectorB();
+    kvector_t bas_c = p_lat->getBasisVectorC();
+
+    HomogeneousMaterial particle_material("Particle", n_particle);
+
+    FormFactorSphereGaussianRadius ff_sphere(m_nanoparticle_radius, m_sigma_nanoparticle_radius);
+    Particle particle(particle_material, ff_sphere);
+    kvector_t position_0 = kvector_t(0.0, 0.0, 0.0);
+    kvector_t position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c);
+    kvector_t position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c);
+    std::vector<kvector_t> pos_vector;
+    pos_vector.push_back(position_0);
+    pos_vector.push_back(position_1);
+    pos_vector.push_back(position_2);
+    ParticleComposition basis(particle, pos_vector);
+
+    Crystal npc(basis, *p_lat);
+    delete p_lat;
+    double dw_factor = m_sigma_lattice_length_a*m_sigma_lattice_length_a/6.0;
+    npc.setDWFactor(dw_factor);
+    return new MesoCrystal(npc.clone(), p_meso_form_factor->clone());
+}
+
+const Lattice* MesoCrystalBuilder::createLattice(
+    double stacking_radius_a, double stacking_radius_c) const
+{
+    Lattice* p_result = new Lattice(Lattice::createTrigonalLattice(
+                                        stacking_radius_a*2.0, stacking_radius_c*2.0*2.3));
+    p_result->setSelectionRule(SimpleSelectionRule(-1, 1, 1, 3));
+    return p_result;
+}
diff --git a/Core/StandardSamples/MesoCrystalBuilder.h b/Core/StandardSamples/MesoCrystalBuilder.h
new file mode 100644
index 0000000..d7b12a4
--- /dev/null
+++ b/Core/StandardSamples/MesoCrystalBuilder.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MesoCrystalBuilder.h
+//! @brief     Defines class MesoCrystalBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MESOCRYSTALBUILDER_H
+#define MESOCRYSTALBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+#include "Complex.h"
+
+class IFormFactor;
+class ISample;
+class Lattice;
+class MesoCrystal;
+
+//! Builds sample: mesocrystals of cylindrical shape composed by spherical nanoparticles.
+//! @ingroup standard_samples
+
+class BA_CORE_API_ MesoCrystalBuilder : public IMultiLayerBuilder
+{
+public:
+    MesoCrystalBuilder();
+
+    virtual ~MesoCrystalBuilder(){}
+    virtual MultiLayer* buildSample() const;
+
+protected:
+    virtual void init_parameters();
+
+private:
+    MesoCrystal* createMesoCrystal(
+        double stacking_radius_a, double stacking_radius_c,
+        complex_t n_particle, const IFormFactor* p_meso_form_factor) const;
+    const Lattice* createLattice(double stacking_radius_a, double stacking_radius_c) const;
+    double m_lattice_length_a;
+    double m_lattice_length_c;
+    double m_nanoparticle_radius;
+    double m_sigma_nanoparticle_radius;
+    double m_meso_height;
+    double m_meso_radius;
+    double m_sigma_meso_height;
+    double m_sigma_meso_radius;
+    double m_sigma_lattice_length_a;
+    double m_surface_filling_ratio;
+    double m_roughness;
+    double m_nphi_rotations;
+};
+
+#endif // MESOCRYSTALBUILDER_H
diff --git a/Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp b/Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp
new file mode 100644
index 0000000..1362849
--- /dev/null
+++ b/Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp
+//! @brief     Implement class MultiLayerWithRoughnessBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MultiLayerWithRoughnessBuilder.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "LayerRoughness.h"
+#include "MultiLayer.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+MultiLayerWithRoughnessBuilder::MultiLayerWithRoughnessBuilder()
+    : m_thicknessA(2.5*Units::nanometer)
+    , m_thicknessB(5.0*Units::nanometer)
+    , m_sigma(1.0*Units::nanometer)
+    , m_hurst(0.3)
+    , m_latteralCorrLength(5.0*Units::nanometer)
+    , m_crossCorrLength(1e-4)
+{
+    init_parameters();
+}
+
+
+void MultiLayerWithRoughnessBuilder::init_parameters()
+{
+    registerParameter("thicknessA", &m_thicknessA).setUnit("nm").setNonnegative();
+    registerParameter("thicknessB", &m_thicknessB).setUnit("nm").setNonnegative();
+    registerParameter("sigma", &m_sigma).setUnit("nm").setNonnegative();
+    registerParameter("hurst", &m_hurst);
+    registerParameter("latteralCorrLength", &m_latteralCorrLength).setUnit("nm").setNonnegative();
+    registerParameter("crossCorrLength", &m_crossCorrLength).setUnit("nm").setNonnegative();
+}
+
+
+MultiLayer* MultiLayerWithRoughnessBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+    HomogeneousMaterial air_material("Air", 0., 0.);
+    HomogeneousMaterial substrate_material("Substrate", 15e-6, 0.0);
+    HomogeneousMaterial part_a_material("PartA", 5e-6, 0.0);
+    HomogeneousMaterial part_b_material("PartB", 10e-6, 0.0);
+
+    Layer air_layer(air_material, 0);
+    Layer partA_layer(part_a_material, m_thicknessA);
+    Layer partB_layer(part_b_material, m_thicknessB);
+    Layer substrate_layer(substrate_material, 0);
+
+    LayerRoughness roughness(m_sigma, m_hurst, m_latteralCorrLength);
+
+    multi_layer->addLayer(air_layer);
+    for (int i = 0; i<5; ++i) {
+        multi_layer->addLayerWithTopRoughness(partA_layer, roughness);
+        multi_layer->addLayerWithTopRoughness(partB_layer, roughness);
+    }
+
+    multi_layer->addLayerWithTopRoughness(substrate_layer, roughness);
+    multi_layer->setCrossCorrLength(m_crossCorrLength);
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/MultiLayerWithRoughnessBuilder.h b/Core/StandardSamples/MultiLayerWithRoughnessBuilder.h
new file mode 100644
index 0000000..d8bd49d
--- /dev/null
+++ b/Core/StandardSamples/MultiLayerWithRoughnessBuilder.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MultiLayerWithRoughnessBuilder.h
+//! @brief     Defines class MultiLayerWithRoughnessBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MULTILAYERWITHROUGHNESSBUILDER_H
+#define MULTILAYERWITHROUGHNESSBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class MultiLayerWithRoughnessBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: layers with correlated roughness
+
+class BA_CORE_API_ MultiLayerWithRoughnessBuilder : public IMultiLayerBuilder
+{
+public:
+    MultiLayerWithRoughnessBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_thicknessA;
+    double m_thicknessB;
+    double m_sigma;
+    double m_hurst;
+    double m_latteralCorrLength;
+    double m_crossCorrLength;
+};
+
+#endif // MULTILAYERWITHROUGHNESSBUILDER_H
diff --git a/Core/StandardSamples/MultipleLayoutBuilder.cpp b/Core/StandardSamples/MultipleLayoutBuilder.cpp
new file mode 100644
index 0000000..d04dc3a
--- /dev/null
+++ b/Core/StandardSamples/MultipleLayoutBuilder.cpp
@@ -0,0 +1,75 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MultipleLayoutBuilder.cpp
+//! @brief     Implements class MultipleLayoutBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MultipleLayoutBuilder.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorPrism3.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+MultipleLayoutBuilder::MultipleLayoutBuilder()
+    : m_cylinder_height(5*Units::nanometer)
+    , m_cylinder_radius(5*Units::nanometer)
+    , m_prism_height(5*Units::nanometer)
+    , m_prism_length(10*Units::nanometer)
+    , m_cylinder_weight(0.5)
+{
+    init_parameters();
+}
+
+void MultipleLayoutBuilder::init_parameters()
+{
+    registerParameter("cylinder_height", &m_cylinder_height).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_radius", &m_cylinder_radius).setUnit("nm").setNonnegative();
+    registerParameter("prism_height", &m_prism_height).setUnit("nm").setNonnegative();
+    registerParameter("prism_length", &m_prism_length).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_weight", &m_cylinder_weight).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* MultipleLayoutBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0., 0.);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    ParticleLayout particle_layout_1;
+    ParticleLayout particle_layout_2;
+
+    FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
+    Particle cylinder(particle_material, ff_cylinder);
+
+    FormFactorPrism3 ff_prism3(m_prism_length, m_prism_height);
+    Particle prism3(particle_material, ff_prism3);
+
+    particle_layout_1.addParticle(cylinder, m_cylinder_weight);
+    particle_layout_2.addParticle(prism3, 1.0-m_cylinder_weight);
+
+    air_layer.addLayout(particle_layout_1);
+    air_layer.addLayout(particle_layout_2);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/MultipleLayoutBuilder.h b/Core/StandardSamples/MultipleLayoutBuilder.h
new file mode 100644
index 0000000..02dc51d
--- /dev/null
+++ b/Core/StandardSamples/MultipleLayoutBuilder.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/MultipleLayoutBuilder.h
+//! @brief     Defines class MultipleLayoutBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MULTIPLELAYOUTBUILDER_H
+#define MULTIPLELAYOUTBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+class ISample;
+
+//! @class MultipleLayoutBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: mixture of cylinders and prisms without interference
+//! using multiple particle layouts
+
+class BA_CORE_API_ MultipleLayoutBuilder : public IMultiLayerBuilder
+{
+public:
+    MultipleLayoutBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_cylinder_height;
+    double m_cylinder_radius;
+    double m_prism_height;
+    double m_prism_length;
+    double m_cylinder_weight;
+};
+
+#endif // MULTIPLELAYOUTBUILDER_H
diff --git a/Core/StandardSamples/ParaCrystalBuilder.cpp b/Core/StandardSamples/ParaCrystalBuilder.cpp
new file mode 100644
index 0000000..c4e797c
--- /dev/null
+++ b/Core/StandardSamples/ParaCrystalBuilder.cpp
@@ -0,0 +1,260 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParaCrystalBuilder.cpp
+//! @brief     Implements class ParaCrystalBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParaCrystalBuilder.h"
+#include "FormFactorCylinder.h"
+#include "HomogeneousMaterial.h"
+#include "InterferenceFunction2DParaCrystal.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+RadialParaCrystalBuilder::RadialParaCrystalBuilder()
+    : m_corr_peak_distance(20.0*Units::nanometer)
+    , m_corr_width(7*Units::nanometer)
+    , m_corr_length(1e3*Units::nanometer)
+    , m_cylinder_height(5*Units::nanometer)
+    , m_cylinder_radius(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+MultiLayer* RadialParaCrystalBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    InterferenceFunctionRadialParaCrystal interference_function(m_corr_peak_distance,
+                                                                m_corr_length);
+    FTDistribution1DGauss pdf(m_corr_width);
+    interference_function.setProbabilityDistribution(pdf);
+    FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+    particle_layout.addInterferenceFunction(interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+void RadialParaCrystalBuilder::init_parameters()
+{
+    registerParameter("corr_peak_distance", &m_corr_peak_distance).setUnit("nm").setNonnegative();
+    registerParameter("corr_width", &m_corr_width).setUnit("nm").setNonnegative();
+    registerParameter("corr_length", &m_corr_length).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_height", &m_cylinder_height).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_radius", &m_cylinder_radius).setUnit("nm").setNonnegative();
+}
+
+// -----------------------------------------------------------------------------
+// Basic2DParaCrystalBuilder
+// -----------------------------------------------------------------------------
+
+Basic2DParaCrystalBuilder::Basic2DParaCrystalBuilder()
+    : m_pdf1(new FTDistribution2DCauchy(0.1*Units::nanometer, 0.2*Units::nanometer))
+    , m_pdf2(new FTDistribution2DCauchy(0.3*Units::nanometer, 0.4*Units::nanometer))
+{}
+
+Basic2DParaCrystalBuilder::~Basic2DParaCrystalBuilder()
+{
+}
+
+MultiLayer* Basic2DParaCrystalBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    InterferenceFunction2DParaCrystal interference_function(
+        10.0 * Units::nanometer, 20.0 * Units::nanometer, 30.0 * Units::degree,
+        45.0 * Units::degree, 1000.0 * Units::nanometer);
+
+    interference_function.setDomainSizes(20.0*Units::micrometer,
+            40.0*Units::micrometer);
+
+    if(const IFTDistribution2D* pdf2 = getFTDistribution2D())
+        interference_function.setProbabilityDistributions(*m_pdf1, *pdf2);
+    else
+        interference_function.setProbabilityDistributions(*m_pdf1, *m_pdf2);
+
+
+    FormFactorCylinder ff_cylinder(5.0*Units::nanometer, 5.0*Units::nanometer);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+    particle_layout.addInterferenceFunction(interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+
+
+// -----------------------------------------------------------------------------
+// HexParaCrystalBuilder
+// -----------------------------------------------------------------------------
+
+HexParaCrystalBuilder::HexParaCrystalBuilder()
+    : m_peak_distance(20.0*Units::nanometer)
+    , m_corr_length(0.0)
+    , m_domain_size_1(20.0*Units::micrometer)
+    , m_domain_size_2(20.0*Units::micrometer)
+    , m_cylinder_height(5*Units::nanometer)
+    , m_cylinder_radius(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+MultiLayer* HexParaCrystalBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    std::unique_ptr<InterferenceFunction2DParaCrystal> P_interference_function{
+        InterferenceFunction2DParaCrystal::createHexagonal(m_peak_distance, m_corr_length,
+                                                           m_domain_size_1, m_domain_size_2)};
+    FTDistribution2DCauchy pdf(1.0*Units::nanometer, 1.0*Units::nanometer);
+    P_interference_function->setProbabilityDistributions(pdf, pdf);
+
+    FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
+    Particle cylinder(particle_material,ff_cylinder);
+
+    ParticleLayout particle_layout(cylinder);
+    particle_layout.addInterferenceFunction(*P_interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+void HexParaCrystalBuilder::init_parameters()
+{
+
+    registerParameter("m_peak_distance", &m_peak_distance).setUnit("nm").setNonnegative();
+    registerParameter("m_corr_length", &m_corr_length).setUnit("nm").setNonnegative();
+    registerParameter("m_domain_size_1", &m_domain_size_1).setUnit("nm").setNonnegative();
+    registerParameter("m_domain_size_2", &m_domain_size_2).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_height", &m_cylinder_height).setUnit("nm").setNonnegative();
+    registerParameter("cylinder_radius", &m_cylinder_radius).setUnit("nm").setNonnegative();
+}
+
+// -----------------------------------------------------------------------------
+// RectParaCrystalBuilder
+// -----------------------------------------------------------------------------
+
+MultiLayer* RectParaCrystalBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    std::unique_ptr<InterferenceFunction2DParaCrystal> P_interference_function{
+        InterferenceFunction2DParaCrystal::createSquare(10 * Units::nanometer,
+                                                        0 * Units::nanometer)};
+
+    P_interference_function->setDomainSizes(20.0*Units::micrometer,
+            20.0*Units::micrometer);
+    FTDistribution2DCauchy pdf1(0.5*Units::nanometer, 2.0*Units::nanometer);
+    FTDistribution2DCauchy pdf2(0.5*Units::nanometer, 2.0*Units::nanometer);
+    P_interference_function->setProbabilityDistributions(pdf1, pdf2);
+
+    FormFactorCylinder ff_cylinder(5.0*Units::nanometer, 5.0*Units::nanometer);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+    particle_layout.addInterferenceFunction(*P_interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+// -----------------------------------------------------------------------------
+// IsGISAXS08BBuilder
+// -----------------------------------------------------------------------------
+
+MultiLayer* IsGISAXS08BBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    InterferenceFunction2DParaCrystal interference_function(
+        10.0 * Units::nanometer, 10.0 * Units::nanometer, M_PI / 2.0, 0.0, 0.0);
+    interference_function.setDomainSizes(20.0*Units::micrometer,
+            20.0*Units::micrometer);
+    FTDistribution2DCauchy pdf1(0.5*Units::nanometer, 0.5*Units::nanometer);
+    FTDistribution2DCauchy pdf2(0.5*Units::nanometer, 0.5*Units::nanometer);
+    interference_function.setProbabilityDistributions(pdf1, pdf2);
+
+    FormFactorCylinder ff_cylinder(5*Units::nanometer, 5*Units::nanometer);
+
+    Particle particle(particle_material, ff_cylinder);
+    ParticleLayout particle_layout(particle);
+    particle_layout.addInterferenceFunction(interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/ParaCrystalBuilder.h b/Core/StandardSamples/ParaCrystalBuilder.h
new file mode 100644
index 0000000..de85ce7
--- /dev/null
+++ b/Core/StandardSamples/ParaCrystalBuilder.h
@@ -0,0 +1,107 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParaCrystalBuilder.h
+//! @brief     Defines classes of ParaCrystalBuilder family.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARACRYSTALBUILDER_H
+#define PARACRYSTALBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+#include <memory>
+
+class IFTDistribution2D;
+class ISample;
+
+//! @class RadialParaCrystalBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cylinders with 1DDL structure factor (IsGISAXS example #4)
+
+class BA_CORE_API_ RadialParaCrystalBuilder : public IMultiLayerBuilder
+{
+public:
+    RadialParaCrystalBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_corr_peak_distance;
+    double m_corr_width;
+    double m_corr_length;
+    double m_cylinder_height;
+    double m_cylinder_radius;
+};
+
+//! @class Basic2DParaCrystalBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: basic two dimensional paracrystal with various probability
+//! distribution functions (PDF's). They are initialized via component service.
+
+class BA_CORE_API_ Basic2DParaCrystalBuilder : public IMultiLayerBuilder
+{
+public:
+    Basic2DParaCrystalBuilder();
+    virtual ~Basic2DParaCrystalBuilder();
+    virtual MultiLayer* buildSample() const;
+private:
+    std::unique_ptr<IFTDistribution2D> m_pdf1;
+    std::unique_ptr<IFTDistribution2D> m_pdf2;
+};
+
+//! @class HexParaCrystalBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cylinders with 2DDL structure factor (IsGISAXS example #4)
+
+class BA_CORE_API_ HexParaCrystalBuilder : public IMultiLayerBuilder
+{
+public:
+    HexParaCrystalBuilder();
+    virtual MultiLayer* buildSample() const;
+
+protected:
+    virtual void init_parameters();
+
+private:
+    double m_peak_distance;
+    double m_corr_length;
+    double m_domain_size_1;
+    double m_domain_size_2;
+    double m_cylinder_height;
+    double m_cylinder_radius;
+};
+
+//! @class RectParaCrystalBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample:  2D paracrystal lattice (IsGISAXS example #8)
+
+class BA_CORE_API_ RectParaCrystalBuilder : public IMultiLayerBuilder
+{
+public:
+    RectParaCrystalBuilder(){}
+    virtual MultiLayer* buildSample() const;
+};
+
+//! @class IsGISAXS08BBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample:  2D paracrystal lattice with isotropic pdfs (IsGISAXS example #8)
+//  TODO remove it completely (why? why not yet done?)
+
+class BA_CORE_API_ IsGISAXS08BBuilder : public IMultiLayerBuilder
+{
+public:
+    IsGISAXS08BBuilder(){}
+    virtual MultiLayer* buildSample() const;
+};
+
+#endif // PARACRYSTALBUILDER_H
diff --git a/Core/StandardSamples/ParticleCompositionBuilder.cpp b/Core/StandardSamples/ParticleCompositionBuilder.cpp
new file mode 100644
index 0000000..2bb72a0
--- /dev/null
+++ b/Core/StandardSamples/ParticleCompositionBuilder.cpp
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParticleCompositionBuilder.cpp
+//! @brief     Implements class ParticleCompositionBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleCompositionBuilder.h"
+#include "FormFactorFullSphere.h"
+#include "HomogeneousMaterial.h"
+#include "InterferenceFunction2DLattice.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+// --- ParticleCompositionBuilder ---
+
+MultiLayer* ParticleCompositionBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    double radius(10.0*Units::nanometer);
+    FormFactorFullSphere sphere_ff(radius);
+    Particle sphere(particle_material, sphere_ff);
+    ParticleLayout particle_layout;
+
+    kvector_t pos0(0.0, 0.0, 0.0);
+    kvector_t pos1(radius, radius/std::sqrt(3.0), std::sqrt(8.0/3.0)*radius);
+    std::vector<kvector_t> positions;
+    positions.push_back(pos0);
+    positions.push_back(pos1);
+
+    ParticleComposition basis;
+
+    basis.addParticles(sphere, positions);
+    particle_layout.addParticle(basis);
+
+    std::unique_ptr<InterferenceFunction2DLattice> P_interference{
+        InterferenceFunction2DLattice::createHexagonal(radius * 2.0)};
+    FTDecayFunction2DCauchy pdf(10*Units::nanometer, 10*Units::nanometer);
+    P_interference->setDecayFunction(pdf);
+
+    particle_layout.addInterferenceFunction(*P_interference);
+
+    air_layer.addLayout(particle_layout);
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/ParticleCompositionBuilder.h b/Core/StandardSamples/ParticleCompositionBuilder.h
new file mode 100644
index 0000000..e3cebf6
--- /dev/null
+++ b/Core/StandardSamples/ParticleCompositionBuilder.h
@@ -0,0 +1,32 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParticleCompositionBuilder.h
+//! @brief     Defines class ParticleCompositionBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLECOMPOSITIONBUILDER_H
+#define PARTICLECOMPOSITIONBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! @class ParticleCompositionBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: two layers of spheres at hex lattice
+
+class BA_CORE_API_ ParticleCompositionBuilder : public IMultiLayerBuilder
+{
+public:
+    ParticleCompositionBuilder(){}
+    MultiLayer *buildSample() const;
+};
+
+#endif // PARTICLECOMPOSITIONBUILDER_H
diff --git a/Core/StandardSamples/ParticleDistributionsBuilder.cpp b/Core/StandardSamples/ParticleDistributionsBuilder.cpp
new file mode 100644
index 0000000..21d1e42
--- /dev/null
+++ b/Core/StandardSamples/ParticleDistributionsBuilder.cpp
@@ -0,0 +1,150 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParticleDistributionsBuilder.cpp
+//! @brief     Implements classes of with different types of particle distributions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleDistributionsBuilder.h"
+#include "BornAgainNamespace.h"
+#include "Distributions.h"
+#include "FormFactorCylinder.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "ParameterPattern.h"
+#include "Particle.h"
+#include "ParticleDistribution.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+using namespace BornAgain;
+
+CylindersWithSizeDistributionBuilder::CylindersWithSizeDistributionBuilder()
+    : m_height(5*Units::nanometer)
+    , m_radius(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+
+void CylindersWithSizeDistributionBuilder::init_parameters()
+{
+    registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
+    registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
+}
+
+
+MultiLayer* CylindersWithSizeDistributionBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+
+    ParticleLayout particle_layout;
+    // preparing prototype of nano particle
+    double sigma = 0.2*m_radius;
+    FormFactorCylinder p_ff_cylinder( m_radius, m_height);
+    Particle nano_particle(particle_material, p_ff_cylinder);
+    // radius of nanoparticles will be sampled with gaussian probability
+    int n_samples(100);
+    // to get radius_min = average - 2.0*FWHM:
+    double n_sigma = 2.0*2.0*std::sqrt(2.0*std::log(2.0));
+    DistributionGaussian gauss(m_radius, sigma);
+    ParameterPattern pattern;
+    pattern.add(ParticleType).add(FFCylinderType).add(Radius);
+    ParameterDistribution par_distr(pattern.toStdString(), gauss, n_samples, n_sigma);
+    ParticleDistribution particle_collection(nano_particle, par_distr);
+    particle_layout.addParticle(particle_collection);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+
+    return multi_layer;
+}
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+
+TwoTypesCylindersDistributionBuilder::TwoTypesCylindersDistributionBuilder()
+    : m_radius1(5*Units::nanometer)
+    , m_radius2(10*Units::nanometer)
+    , m_height1(5*Units::nanometer)
+    , m_height2(10*Units::nanometer)
+    , m_sigma1_ratio(0.2)
+    , m_sigma2_ratio(0.02)
+{
+    init_parameters();
+}
+
+
+void TwoTypesCylindersDistributionBuilder::init_parameters()
+{
+    registerParameter("radius1", &m_radius1).setUnit("nm").setNonnegative();
+    registerParameter("radius2", &m_radius2).setUnit("nm").setNonnegative();
+    registerParameter("height1", &m_height1).setUnit("nm").setNonnegative();
+    registerParameter("height2", &m_height2).setUnit("nm").setNonnegative();
+    registerParameter("sigma1_ratio", &m_sigma1_ratio).setNonnegative();
+    registerParameter("sigma2_ratio", &m_sigma2_ratio).setNonnegative();
+}
+
+
+MultiLayer* TwoTypesCylindersDistributionBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+
+    ParticleLayout particle_layout;
+
+    // preparing nano particles prototypes for seeding layer's particle_layout
+    FormFactorCylinder p_ff_cylinder1(m_radius1, m_height1);
+    Particle cylinder1(particle_material, p_ff_cylinder1 );
+
+    FormFactorCylinder p_ff_cylinder2(m_radius2, m_height2);
+    Particle cylinder2(particle_material, p_ff_cylinder2 );
+
+    // radius of nanoparticles will be sampled with gaussian probability
+    int nbins=150;
+    double sigma1 = m_radius1*m_sigma1_ratio;
+    double sigma2 = m_radius2*m_sigma2_ratio;
+    // to have xmin=average-3*sigma
+    double n_sigma = 3.0;
+    DistributionGaussian gauss1(m_radius1, sigma1);
+    DistributionGaussian gauss2(m_radius2, sigma2);
+
+    // building distribution of nano particles
+    ParameterPattern pattern1;
+    pattern1.add(ParticleType).add(FFCylinderType).add(Radius);
+    ParameterDistribution par_distr1(pattern1.toStdString(), gauss1, nbins, n_sigma);
+    ParticleDistribution particle_collection1(cylinder1, par_distr1);
+    particle_layout.addParticle(particle_collection1, 0.95);
+    ParameterPattern pattern2;
+    pattern2.add(ParticleType).add(FFCylinderType).add(Radius);
+    ParameterDistribution par_distr2(pattern2.toStdString(), gauss2, nbins, n_sigma);
+    ParticleDistribution particle_collection2(cylinder2, par_distr2);
+    particle_layout.addParticle(particle_collection2, 0.05);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/ParticleDistributionsBuilder.h b/Core/StandardSamples/ParticleDistributionsBuilder.h
new file mode 100644
index 0000000..a79225f
--- /dev/null
+++ b/Core/StandardSamples/ParticleDistributionsBuilder.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParticleDistributionsBuilder.h
+//! @brief     Defines classes of with different types of particle distributions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLEDISTRIBUTIONSBUILDER_H
+#define PARTICLEDISTRIBUTIONSBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! Cylinders in BA with size distributions (IsGISAXS example #3, part II).
+//! @ingroup standard_samples
+
+class CylindersWithSizeDistributionBuilder : public IMultiLayerBuilder
+{
+public:
+    CylindersWithSizeDistributionBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_height;
+    double m_radius;
+};
+
+
+//! Builds mixture of cylinder particles with different size distribution (IsGISAXS example #2)
+//! @ingroup standard_samples
+
+class BA_CORE_API_ TwoTypesCylindersDistributionBuilder : public IMultiLayerBuilder
+{
+public:
+    TwoTypesCylindersDistributionBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_radius1;
+    double m_radius2;
+    double m_height1;
+    double m_height2;
+    double m_sigma1_ratio;
+    double m_sigma2_ratio;
+};
+
+#endif // PARTICLEDISTRIBUTIONSBUILDER_H
diff --git a/Core/StandardSamples/ParticleInTheAirBuilder.cpp b/Core/StandardSamples/ParticleInTheAirBuilder.cpp
new file mode 100644
index 0000000..36cc840
--- /dev/null
+++ b/Core/StandardSamples/ParticleInTheAirBuilder.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParticleInTheAirBuilder.cpp
+//! @brief     Implements class ParticleInTheAirBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleInTheAirBuilder.h"
+#include "Exceptions.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+
+MultiLayer* ParticleInTheAirBuilder::buildSample() const
+{
+    const IFormFactor* form_factor = getFormFactor();
+    if(!form_factor)
+        throw Exceptions::NullPointerException("ParticleInTheAirBuilder::buildSample() -> Error. "
+                                   "Form factor is not initialized.");
+    MultiLayer* result = new MultiLayer;
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+
+    Particle particle(particle_material, *form_factor);
+    ParticleLayout particle_layout(particle);
+    air_layer.addLayout(particle_layout);
+
+    result->addLayer(air_layer);
+
+    return result;
+}
diff --git a/Core/StandardSamples/ParticleInTheAirBuilder.h b/Core/StandardSamples/ParticleInTheAirBuilder.h
new file mode 100644
index 0000000..72062f0
--- /dev/null
+++ b/Core/StandardSamples/ParticleInTheAirBuilder.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/ParticleInTheAirBuilder.h
+//! @brief     Defines class ParticleInTheAirBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLEINTHEAIRBUILDER_H
+#define PARTICLEINTHEAIRBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! @class ParticleInTheAirBuilder
+//! @ingroup standard_samples
+//! @brief The ParticleInTheAirBuilder class generates a multilayer with single air layer
+//! populated with particles of certain types.
+//! Requires IComponentService which generates form factors, used for bulk form factors testing.
+
+class BA_CORE_API_ ParticleInTheAirBuilder : public IMultiLayerBuilder
+{
+public:
+    ParticleInTheAirBuilder() {}
+    virtual ~ParticleInTheAirBuilder() {}
+    virtual MultiLayer* buildSample() const;
+};
+
+#endif // PARTICLEINTHEAIRBUILDER_H
diff --git a/Core/StandardSamples/RipplesBuilder.cpp b/Core/StandardSamples/RipplesBuilder.cpp
new file mode 100644
index 0000000..3f4c669
--- /dev/null
+++ b/Core/StandardSamples/RipplesBuilder.cpp
@@ -0,0 +1,129 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/RipplesBuilder.cpp
+//! @brief     Implement classes to build various ripples.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RipplesBuilder.h"
+#include "FormFactorRipple1.h"
+#include "FormFactorRipple2.h"
+#include "HomogeneousMaterial.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+CosineRippleBuilder::CosineRippleBuilder()
+    : m_w(20.0*Units::nanometer)
+    , m_h(4.0*Units::nanometer)
+    , m_l(100.0*Units::nanometer)
+    , m_interf_distance(20.0*Units::nanometer)
+    , m_interf_width(4.0*Units::nanometer)
+{
+    init_parameters();
+}
+
+void CosineRippleBuilder::init_parameters()
+{
+    registerParameter("width", &m_w).setUnit("nm").setNonnegative();
+    registerParameter("height", &m_h).setUnit("nm").setNonnegative();
+    registerParameter("length", &m_l).setUnit("nm").setNonnegative();
+    registerParameter("interf_distance", &m_interf_distance).setUnit("nm").setNonnegative();
+    registerParameter("interf_width", &m_interf_width).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* CosineRippleBuilder::buildSample() const
+{
+    MultiLayer* p_multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    FormFactorRipple1 ff_ripple1(m_l, m_w, m_h);
+    Particle ripple(particle_material, ff_ripple1);
+
+    ParticleLayout particle_layout;
+    particle_layout.addParticle(ripple,1.0);
+    InterferenceFunctionRadialParaCrystal interference_function(m_interf_distance,
+                                                                1e7 * Units::nanometer);
+    FTDistribution1DGauss pdf(m_interf_width);
+    interference_function.setProbabilityDistribution(pdf);
+    particle_layout.addInterferenceFunction(interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    p_multi_layer->addLayer(air_layer);
+
+    Layer substrate_layer(substrate_material);
+    p_multi_layer->addLayer(substrate_layer);
+
+    return p_multi_layer;
+}
+
+// ----------------------------------------------------------------------------
+
+TriangularRippleBuilder::TriangularRippleBuilder()
+    : m_w(20.0*Units::nanometer)
+    , m_h(4.0*Units::nanometer)
+    , m_l(100.0*Units::nanometer)
+    , m_d(0.0*Units::nanometer)
+    , m_interf_distance(20.0*Units::nanometer)
+    , m_interf_width(4.0*Units::nanometer)
+{
+    init_parameters();
+}
+
+void TriangularRippleBuilder::init_parameters()
+{
+
+    registerParameter("width", &m_w).setUnit("nm").setNonnegative();
+    registerParameter("height", &m_h).setUnit("nm").setNonnegative();
+    registerParameter("length", &m_l).setUnit("nm").setNonnegative();
+    registerParameter  ("asymetry", &m_d);
+    registerParameter("interf_distance", &m_interf_distance).setUnit("nm").setNonnegative();
+    registerParameter("interf_width", &m_interf_width).setUnit("nm").setNonnegative();
+}
+
+MultiLayer* TriangularRippleBuilder::buildSample() const
+{
+    MultiLayer* p_multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    FormFactorRipple2 ff_ripple2(m_l, m_w, m_h, m_d);
+    Particle ripple(particle_material, ff_ripple2 );
+
+    ParticleLayout particle_layout;
+    particle_layout.addParticle(ripple,1.0);
+    InterferenceFunctionRadialParaCrystal interference_function(m_interf_distance,
+                                                                1e7 * Units::nanometer);
+    FTDistribution1DGauss pdf(m_interf_width);
+    interference_function.setProbabilityDistribution(pdf);
+    particle_layout.addInterferenceFunction(interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    p_multi_layer->addLayer(air_layer);
+
+    Layer substrate_layer(substrate_material);
+    p_multi_layer->addLayer(substrate_layer);
+
+    return p_multi_layer;
+}
diff --git a/Core/StandardSamples/RipplesBuilder.h b/Core/StandardSamples/RipplesBuilder.h
new file mode 100644
index 0000000..9586a68
--- /dev/null
+++ b/Core/StandardSamples/RipplesBuilder.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/RipplesBuilder.h
+//! @brief     Defines classes to build various ripples.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RIPPLESBUILDER_H
+#define RIPPLESBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! @class CosineRippleBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: cosine ripple within the 1D-paracrystal model
+
+class BA_CORE_API_ CosineRippleBuilder : public IMultiLayerBuilder
+{
+public:
+    CosineRippleBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_w; //width
+    double m_h; //heigth
+    double m_l; //length
+
+    double m_interf_distance;
+    double m_interf_width;
+};
+
+
+//! @class TriangularRippleBuilder
+//! @ingroup standard_samples
+//! @brief Builds sample: triangular ripple within the 1D-paracrystal model
+//! (from PRB 85, 235415, 2012)
+
+class BA_CORE_API_ TriangularRippleBuilder : public IMultiLayerBuilder
+{
+public:
+    TriangularRippleBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_w; //width
+    double m_h; //heigth
+    double m_l; //length
+    double m_d; //asymetry
+    double m_interf_distance;
+    double m_interf_width;
+};
+
+#endif // RIPPLESBUILDER_H
diff --git a/Core/StandardSamples/RotatedPyramidsBuilder.cpp b/Core/StandardSamples/RotatedPyramidsBuilder.cpp
new file mode 100644
index 0000000..7058d15
--- /dev/null
+++ b/Core/StandardSamples/RotatedPyramidsBuilder.cpp
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/RotatedPyramidsBuilder.cpp
+//! @brief     Implements classe RotatedPyramidsBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RotatedPyramidsBuilder.h"
+#include "FormFactorPyramid.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+RotatedPyramidsBuilder::RotatedPyramidsBuilder()
+    : m_length(10*Units::nanometer)
+    , m_height(5*Units::nanometer)
+    , m_alpha(Units::deg2rad(54.73 ))
+    , m_zangle(45.*Units::degree)
+{
+    init_parameters();
+}
+
+void RotatedPyramidsBuilder::init_parameters()
+{
+    registerParameter("length", &m_length).setUnit("nm").setNonnegative();
+    registerParameter("height", &m_height).setUnit("nm").setNonnegative();
+    registerParameter("alpha", &m_alpha  ).setUnit("rad");
+    registerParameter("zangle", &m_zangle).setUnit("rad");
+}
+
+MultiLayer* RotatedPyramidsBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    FormFactorPyramid ff_pyramid(m_length, m_height, m_alpha);
+
+    Particle pyramid(particle_material, ff_pyramid);
+
+    RotationZ z_rotation(m_zangle);
+
+    ParticleLayout particle_layout;
+    particle_layout.addParticle(pyramid, 1.0, kvector_t(0,0,0), z_rotation);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/RotatedPyramidsBuilder.h b/Core/StandardSamples/RotatedPyramidsBuilder.h
new file mode 100644
index 0000000..9e37f0d
--- /dev/null
+++ b/Core/StandardSamples/RotatedPyramidsBuilder.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/RotatedPyramidsBuilder.h
+//! @brief     Defines class RotatedPyramidsBuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ROTATEDPYRAMIDSBUILDER_H
+#define ROTATEDPYRAMIDSBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! Builds sample: Pyramids, rotated pyramids on top of substrate (IsGISAXS example #9)
+//! @ingroup standard_samples
+
+class BA_CORE_API_ RotatedPyramidsBuilder : public IMultiLayerBuilder
+{
+public:
+    RotatedPyramidsBuilder();
+    MultiLayer* buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_length;
+    double m_height;
+    double m_alpha;
+    double m_zangle;
+};
+
+#endif // ROTATEDPYRAMIDSBUILDER_H
diff --git a/Core/StandardSamples/SampleBuilderFactory.cpp b/Core/StandardSamples/SampleBuilderFactory.cpp
new file mode 100644
index 0000000..1d1d6df
--- /dev/null
+++ b/Core/StandardSamples/SampleBuilderFactory.cpp
@@ -0,0 +1,240 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/SampleBuilderFactory.cpp
+//! @brief     Implement class SampleBuilderFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleBuilderFactory.h"
+#include "BoxCompositionBuilder.h"
+#include "CoreShellParticleBuilder.h"
+#include "CustomMorphologyBuilder.h"
+#include "CylindersAndPrismsBuilder.h"
+#include "CylindersBuilder.h"
+#include "LatticeBuilder.h"
+#include "LayersWithAbsorptionBuilder.h"
+#include "MagneticParticlesBuilder.h"
+#include "MesoCrystalBuilder.h"
+#include "MultiLayerWithRoughnessBuilder.h"
+#include "MultipleLayoutBuilder.h"
+#include "ParaCrystalBuilder.h"
+#include "ParticleCompositionBuilder.h"
+#include "ParticleDistributionsBuilder.h"
+#include "ParticleInTheAirBuilder.h"
+#include "RealParameter.h"
+#include "RipplesBuilder.h"
+#include "RotatedPyramidsBuilder.h"
+#include "SizeDistributionModelsBuilder.h"
+#include "TransformationsBuilder.h"
+#include "TwoDimLatticeBuilder.h"
+
+SampleBuilderFactory::SampleBuilderFactory()
+{
+    registerItem(
+        "CylindersAndPrismsBuilder",
+        create_new<CylindersAndPrismsBuilder>,
+        "Mixture of cylinders and prisms without interference");
+
+    registerItem(
+        "TwoTypesCylindersDistributionBuilder",
+        create_new<TwoTypesCylindersDistributionBuilder>,
+        "Mixture of cylinder particles with two types size distribution ");
+
+    registerItem(
+        "CylindersInBABuilder",
+        create_new<CylindersInBABuilder>,
+        "Cylinder formfactor in BA");
+    registerItem(
+        "CylindersInDWBABuilder",
+        create_new<CylindersInDWBABuilder>,
+        "Cylinder formfactor in DWBA");
+    registerItem(
+        "LargeCylindersInDWBABuilder",
+        create_new<LargeCylindersInDWBABuilder>,
+        "Large cylinders in DWBA");
+
+    registerItem(
+        "CylindersWithSizeDistributionBuilder",
+        create_new<CylindersWithSizeDistributionBuilder>,
+        "Cylinder formfactor in BA with size distribution");
+
+    registerItem(
+        "RadialParaCrystalBuilder",
+        create_new<RadialParaCrystalBuilder>,
+        "Interference function of radial paracrystal");
+
+    registerItem(
+        "Basic2DParaCrystalBuilder",
+        create_new<Basic2DParaCrystalBuilder>,
+        "Interference function of 2D basic paracrystal with variety of FT distributions");
+
+    registerItem(
+        "HexParaCrystalBuilder",
+        create_new<HexParaCrystalBuilder>,
+        "Interference function of 2D hexagonal paracrystal");
+
+    registerItem(
+        "Lattice1DBuilder",
+        create_new<Lattice1DBuilder>,
+        "Interference function of 1D lattice");
+
+    registerItem(
+        "RectParaCrystalBuilder",
+        create_new<RectParaCrystalBuilder>,
+        "Interference function of 2D rectangular paracrystal");
+
+    registerItem(
+        "Basic2DLatticeBuilder",
+        create_new<Basic2DLatticeBuilder>,
+        "Square lattice with arbitrary parameters");
+
+    registerItem(
+        "SquareLatticeBuilder",
+        create_new<SquareLatticeBuilder>,
+        "Interference of square lattice with disordered");
+
+    registerItem(
+        "CenteredSquareLatticeBuilder",
+        create_new<CenteredSquareLatticeBuilder>,
+        "Interference of centered square lattice");
+
+    registerItem(
+        "RotatedSquareLatticeBuilder",
+        create_new<RotatedSquareLatticeBuilder>,
+        "2D lattice rotated");
+
+    registerItem(
+        "CustomMorphologyBuilder",
+        create_new<CustomMorphologyBuilder>,
+        "Mixture of different particles a la IsGISAXS morphology file");
+
+    registerItem(
+        "RotatedPyramidsBuilder",
+        create_new<RotatedPyramidsBuilder>,
+        "Rotated pyramids on top of substrate");
+
+    registerItem(
+        "CoreShellParticleBuilder",
+        create_new<CoreShellParticleBuilder>,
+        "Core shell nanoparticles");
+
+    registerItem(
+        "CoreShellBoxRotateZandYBuilder",
+        create_new<CoreShellBoxRotateZandYBuilder>,
+        "Rotation and translation of core shell box particle in 3 layers system.");
+
+    registerItem(
+        "SizeDistributionDAModelBuilder",
+        create_new<SizeDistributionDAModelBuilder>,
+        "Size distribution model: decoupling approximation");
+
+    registerItem(
+        "SizeDistributionLMAModelBuilder",
+        create_new<SizeDistributionLMAModelBuilder>,
+        "Size distribution model: local monodisperse approximation");
+
+    registerItem(
+        "SizeDistributionSSCAModelBuilder",
+        create_new<SizeDistributionSSCAModelBuilder>,
+        "Size distribution model: size space coupling approximation");
+
+    registerItem(
+        "CylindersInSSCABuilder",
+        create_new<CylindersInSSCABuilder>,
+        "Size spacing correlation approximation");
+
+    registerItem(
+        "MesoCrystalBuilder",
+        create_new<MesoCrystalBuilder>,
+        "Mesocrystals of cylindrical shape composed by spherical nanoparticles");
+
+    registerItem(
+        "MagneticParticleZeroFieldBuilder",
+        create_new<MagneticParticleZeroFieldBuilder>,
+        "Polarized DWBA with zero magnetic field");
+
+    registerItem(
+        "MagneticCylindersBuilder",
+        create_new<MagneticCylindersBuilder>,
+        "Polarized DWBA with non-zero magnetic field");
+
+    registerItem(
+        "MultiLayerWithRoughnessBuilder",
+        create_new<MultiLayerWithRoughnessBuilder>,
+        "Layer with correlated roughness");
+
+    registerItem(
+       "MultipleLayoutBuilder",
+       create_new<MultipleLayoutBuilder>,
+      "cylinder and prisms using multiple layouts");
+
+    registerItem(
+        "TriangularRippleBuilder",
+        create_new<TriangularRippleBuilder>,
+        "triangular ripple within the 1D-paracrystal model");
+
+    registerItem(
+        "CosineRippleBuilder",
+        create_new<CosineRippleBuilder>,
+        "cosine ripple within the 1D-paracrystal model");
+
+    registerItem(
+        "ParticleCompositionBuilder",
+        create_new<ParticleCompositionBuilder>,
+        "Composition of particles to represent two layers of spheres in hex lattice");
+
+    registerItem(
+        "BoxCompositionRotateXBuilder",
+        create_new<BoxCompositionRotateXBuilder>,
+        "Two boxes in particle composition rotated in X by 90 degrees");
+
+    registerItem(
+        "BoxCompositionRotateYBuilder",
+        create_new<BoxCompositionRotateYBuilder>,
+        "Two boxes in particle composition rotated in Y by 90 degrees");
+
+    registerItem(
+        "BoxCompositionRotateZBuilder",
+        create_new<BoxCompositionRotateZBuilder>,
+        "Two boxes in particle composition rotated in Z by 90 degrees");
+
+    registerItem(
+        "BoxCompositionRotateZandYBuilder",
+        create_new<BoxCompositionRotateZandYBuilder>,
+        "Two boxes in particle composition rotated in Z and Y by 90 degrees");
+
+    registerItem(
+        "BoxStackCompositionBuilder",
+        create_new<BoxStackCompositionBuilder>,
+        "Two different boxes are first rotated and then composed, composition is then rotated.");
+
+    registerItem(
+        "ParticleInTheAirBuilder",
+        create_new<ParticleInTheAirBuilder>,
+        "Particle in the air layer to test form factors");
+
+    registerItem(
+        "TransformBoxBuilder",
+        create_new<TransformBoxBuilder>,
+        "Rotated and translated box in 3 layer system");
+
+    registerItem(
+        "LayersWithAbsorptionBuilder",
+        create_new<LayersWithAbsorptionBuilder>,
+        "3 layer system with absorption");
+}
+
+//! Retrieves a SampleBuilder from the registry, does the build, and returns the result.
+
+MultiLayer* SampleBuilderFactory::createSample(const std::string& name)
+{
+    return createItem(name)->buildSample();
+}
diff --git a/Core/StandardSamples/SampleBuilderFactory.h b/Core/StandardSamples/SampleBuilderFactory.h
new file mode 100644
index 0000000..824a684
--- /dev/null
+++ b/Core/StandardSamples/SampleBuilderFactory.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/SampleBuilderFactory.h
+//! @brief     Defines class SampleBuilderFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEBUILDERFACTORY_H
+#define SAMPLEBUILDERFACTORY_H
+
+#include "IFactory.h"
+#include "IMultiLayerBuilder.h"
+
+class MultiLayer;
+
+//! @class SampleBuilderFactory
+//! @ingroup standard_samples
+//! @brief Factory to create standard pre-defined samples
+
+class BA_CORE_API_ SampleBuilderFactory : public IFactory<std::string, IMultiLayerBuilder>
+{
+public:
+    SampleBuilderFactory();
+    MultiLayer* createSample(const std::string& name);
+};
+
+#endif // SAMPLEBUILDERFACTORY_H
diff --git a/Core/StandardSamples/SimulationFactory.cpp b/Core/StandardSamples/SimulationFactory.cpp
new file mode 100644
index 0000000..c91e4b3
--- /dev/null
+++ b/Core/StandardSamples/SimulationFactory.cpp
@@ -0,0 +1,109 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/SimulationFactory.cpp
+//! @brief     Implement class SimulationFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationFactory.h"
+#include "GISASSimulation.h"
+#include "RealParameter.h"
+#include "StandardSimulations.h"
+
+SimulationFactory::SimulationFactory()
+{
+    registerItem("BasicGISAS",
+                 StandardSimulations::BasicGISAS,
+                 "Basic GISAS simulation with the detector phi[0,2], theta[0,2]");
+
+    registerItem("BasicGISAS00",
+                 StandardSimulations::BasicGISAS00,
+                 "Basic GISAS for polarization studies");
+
+    registerItem("MiniGISAS",
+                 StandardSimulations::MiniGISAS,
+                 "GISAS simulation with small 25x25 detector and phi[-2,2], theta[0,2]");
+
+    registerItem("MiniGISAS_v2",
+                 StandardSimulations::MiniGISAS_v2,
+                 "GISAS simulation with small 25x25 detector and phi[-1,1], theta[0,]");
+
+    registerItem("MiniGISASBeamDivergence",
+                 StandardSimulations::MiniGISASBeamDivergence,
+                 "GISAS simulation with small detector and beam divergence");
+
+    registerItem("MiniGISASDetectorResolution",
+                 StandardSimulations::MiniGISASDetectorResolution,
+                 "GISAS simulation with small detector and detector resolution");
+
+    registerItem("GISASWithMasks",
+                 StandardSimulations::GISASWithMasks,
+                 "GISAS simulation with small detector and various masks");
+
+    registerItem("MaxiGISAS",
+                 StandardSimulations::MaxiGISAS,
+                 "GISAS simulation with large detector to test performance");
+
+    registerItem("MaxiGISAS00",
+                 StandardSimulations::MaxiGISAS00,
+                 "GISAS simulation with large detector to test performance");
+
+    registerItem("IsGISAXSSimulation1",
+                 StandardSimulations::IsGISAXSSimulation1,
+                 "Typical IsGISAXS simulation with the detector theta[-1,1], phi[0,2]");
+
+    registerItem("IsGISAXSSimulation2",
+                 StandardSimulations::IsGISAXSSimulation2,
+                 "Typical IsGISAXS simulation with the detector theta[0,1], phi[0,2]");
+
+    // polarization
+
+    registerItem(
+        "polmagcylinders2", StandardSimulations::PolarizedDWBAMagCylinders2,
+        "Polarized DWBA with non-zero magnetic field");
+
+    // rectangular detectors
+
+    registerItem("RectDetectorGeneric",
+                 StandardSimulations::RectDetectorGeneric,
+                 "Rectangular detector with generic alignment");
+
+    registerItem("RectDetectorPerpToSample",
+                 StandardSimulations::RectDetectorPerpToSample,
+                 "Rectangular detector with generic alignment");
+
+    registerItem("RectDetectorPerpToDirectBeam",
+                 StandardSimulations::RectDetectorPerpToDirectBeam,
+                 "Rectangular detector with generic alignment");
+
+    registerItem("RectDetectorPerpToReflectedBeam",
+                 StandardSimulations::RectDetectorPerpToReflectedBeam,
+                 "Rectangular detector with generic alignment");
+
+    registerItem("RectDetectorPerpToReflectedBeamDpos",
+                 StandardSimulations::RectDetectorPerpToReflectedBeamDpos,
+                 "Rectangular detector with generic alignment");
+
+    // Monte-Carlo
+    registerItem("MiniGISASMonteCarlo",
+                 StandardSimulations::MiniGISASMonteCarlo,
+                 "GISAS simulation with small 25x25 detector and phi[-2,2], theta[0,2], "
+                 "in Monte-Carlo mode");
+
+    // region of interest
+
+    registerItem("SphericalDetWithRoi",
+                 StandardSimulations::SphericalDetWithRoi,
+                 "Spherical detector with ROI and mask");
+    registerItem("RectDetWithRoi",
+                 StandardSimulations::RectDetWithRoi,
+                 "Rectangular detector with ROI and mask");
+}
diff --git a/Core/StandardSamples/SimulationFactory.h b/Core/StandardSamples/SimulationFactory.h
new file mode 100644
index 0000000..be43159
--- /dev/null
+++ b/Core/StandardSamples/SimulationFactory.h
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/SimulationFactory.h
+//! @brief     Defines class SimulationFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONFACTORY_H
+#define SIMULATIONFACTORY_H
+
+#include "IFactory.h"
+#include "GISASSimulation.h"
+#include <string>
+
+//! @class SimulationFactory
+//! @ingroup standard_samples
+//! @brief Registry to create standard pre-defined simulations.
+//! Used in functional tests, performance measurements, etc.
+
+class BA_CORE_API_ SimulationFactory : public IFactory<std::string, GISASSimulation>
+{
+public:
+    SimulationFactory();
+};
+
+#endif // SIMULATIONFACTORY_H
diff --git a/Core/StandardSamples/SizeDistributionModelsBuilder.cpp b/Core/StandardSamples/SizeDistributionModelsBuilder.cpp
new file mode 100644
index 0000000..3a6bd1e
--- /dev/null
+++ b/Core/StandardSamples/SizeDistributionModelsBuilder.cpp
@@ -0,0 +1,211 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/SizeDistributionModelsBuilder.cpp
+//! @brief     Implements class ParticlesInSSCABuilder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SizeDistributionModelsBuilder.h"
+#include "BornAgainNamespace.h"
+#include "Distributions.h"
+#include "FormFactorCylinder.h"
+#include "HomogeneousMaterial.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "ParameterPattern.h"
+#include "Particle.h"
+#include "ParticleDistribution.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+using namespace BornAgain;
+
+MultiLayer* SizeDistributionDAModelBuilder::buildSample() const
+{
+        MultiLayer* multi_layer = new MultiLayer();
+
+        HomogeneousMaterial m_ambience("Air", 0.0, 0.0);
+        HomogeneousMaterial m_substrate("Substrate", 6e-6, 2e-8);
+        HomogeneousMaterial m_particle("Particle", 6e-4, 2e-8);
+
+        // cylindrical particle 1
+        double radius1(5*Units::nanometer);
+        double height1 = radius1;
+        FormFactorCylinder cylinder_ff1(radius1, height1);
+        Particle cylinder1(m_particle, cylinder_ff1);
+
+        // cylindrical particle 2
+        double radius2(8*Units::nanometer);
+        double height2(radius2);
+        FormFactorCylinder cylinder_ff2(radius2, height2);
+        Particle cylinder2(m_particle, cylinder_ff2);
+
+        // interference function
+        InterferenceFunctionRadialParaCrystal interference(
+            18.0 * Units::nanometer, 1e3 * Units::nanometer);
+        FTDistribution1DGauss pdf(3*Units::nanometer);
+        interference.setProbabilityDistribution(pdf);
+
+        // assembling the sample
+        ParticleLayout particle_layout;
+        particle_layout.addParticle(cylinder1, 0.8);
+        particle_layout.addParticle(cylinder2, 0.2);
+        particle_layout.addInterferenceFunction(interference);
+
+        Layer air_layer(m_ambience);
+        air_layer.addLayout(particle_layout);
+        Layer substrate_layer(m_substrate);
+
+        multi_layer->addLayer(air_layer);
+        multi_layer->addLayer(substrate_layer);
+        return multi_layer;
+}
+
+// ----------------------------------------------------------------------------
+
+MultiLayer* SizeDistributionLMAModelBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial m_ambience("Air", 0.0, 0.0);
+    HomogeneousMaterial m_substrate("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial m_particle("Particle", 6e-4, 2e-8);
+
+    // cylindrical particle 1
+    double radius1(5*Units::nanometer);
+    double height1 = radius1;
+    FormFactorCylinder cylinder_ff1(radius1, height1);
+    Particle cylinder1(m_particle, cylinder_ff1);
+
+    // cylindrical particle 2
+    double radius2(8*Units::nanometer);
+    double height2(radius2);
+    FormFactorCylinder cylinder_ff2(radius2, height2);
+    Particle cylinder2(m_particle, cylinder_ff2);
+
+    // interference function1
+    InterferenceFunctionRadialParaCrystal interference1(
+        16.8*Units::nanometer, 1e3*Units::nanometer);
+    FTDistribution1DGauss pdf(3 * Units::nanometer);
+    interference1.setProbabilityDistribution(pdf);
+
+    // interference function2
+    InterferenceFunctionRadialParaCrystal interference2(
+        22.8*Units::nanometer, 1e3*Units::nanometer);
+    interference2.setProbabilityDistribution(pdf);
+
+    // assembling the sample
+    ParticleLayout particle_layout1;
+    particle_layout1.addParticle(cylinder1, 0.8);
+    particle_layout1.addInterferenceFunction(interference1);
+
+    ParticleLayout particle_layout2;
+    particle_layout2.addParticle(cylinder2, 0.2);
+    particle_layout2.addInterferenceFunction(interference2);
+
+    Layer air_layer(m_ambience);
+    air_layer.addLayout(particle_layout1);
+    air_layer.addLayout(particle_layout2);
+    Layer substrate_layer(m_substrate);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+// ----------------------------------------------------------------------------
+
+MultiLayer* SizeDistributionSSCAModelBuilder::buildSample() const
+{
+    MultiLayer *multi_layer = new MultiLayer();
+
+    HomogeneousMaterial m_ambience("Air", 0.0, 0.0);
+    HomogeneousMaterial m_substrate("Substrate", 6e-6, 2e-8);
+    HomogeneousMaterial m_particle("Particle", 6e-4, 2e-8);
+
+    // cylindrical particle 1
+    double radius1(5*Units::nanometer);
+    double height1 = radius1;
+    FormFactorCylinder cylinder_ff1(radius1, height1);
+    Particle cylinder1(m_particle, cylinder_ff1);
+
+    // cylindrical particle 2
+    double radius2(8*Units::nanometer);
+    double height2(radius2);
+    FormFactorCylinder cylinder_ff2(radius2, height2);
+    Particle cylinder2(m_particle, cylinder_ff2);
+
+    // interference function
+    InterferenceFunctionRadialParaCrystal interference(
+        18.0*Units::nanometer, 1e3*Units::nanometer);
+    FTDistribution1DGauss pdf(3*Units::nanometer);
+    interference.setProbabilityDistribution(pdf);
+    interference.setKappa(1.0);
+
+    // assembling the sample
+    ParticleLayout particle_layout;
+    particle_layout.addParticle(cylinder1, 0.8);
+    particle_layout.addParticle(cylinder2, 0.2);
+    particle_layout.addInterferenceFunction(interference);
+    particle_layout.setApproximation(ILayout::SSCA);
+
+    Layer air_layer(m_ambience);
+    air_layer.addLayout(particle_layout);
+    Layer substrate_layer(m_substrate);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+// ----------------------------------------------------------------------------
+
+MultiLayer* CylindersInSSCABuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Layer air_layer(air_material);
+
+    InterferenceFunctionRadialParaCrystal interference_function(
+        15.0 * Units::nanometer, 1e3 * Units::nanometer);
+    FTDistribution1DGauss pdf(5*Units::nanometer);
+    interference_function.setProbabilityDistribution(pdf);
+    interference_function.setKappa(4.02698);
+    ParticleLayout particle_layout;
+
+    FormFactorCylinder ff_cylinder(5.0*Units::nanometer, 5.0*Units::nanometer);
+    Particle particle_prototype(particle_material, ff_cylinder);
+
+    DistributionGaussian gauss(5.0*Units::nanometer, 1.25*Units::nanometer);
+    ParameterPattern pattern_radius;
+    pattern_radius.add(ParticleType).add(FFCylinderType).add(Radius);
+    ParameterDistribution par_distr(pattern_radius.toStdString(), gauss, 30, 3.0);
+    ParameterPattern pattern_height;
+    pattern_height.add(ParticleType).add(FFCylinderType).add(Height);
+    par_distr.linkParameter(pattern_height.toStdString());
+    ParticleDistribution particle_collection(particle_prototype, par_distr);
+    particle_layout.addParticle(particle_collection);
+
+    particle_layout.addInterferenceFunction(interference_function);
+    particle_layout.setApproximation(ILayout::SSCA);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/SizeDistributionModelsBuilder.h b/Core/StandardSamples/SizeDistributionModelsBuilder.h
new file mode 100644
index 0000000..91d36cd
--- /dev/null
+++ b/Core/StandardSamples/SizeDistributionModelsBuilder.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/SizeDistributionModelsBuilder.h
+//! @brief     Defines various sample builder classes to test DA, LMA, SSCA approximations
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIZEDISTRIBUTIONMODELSBUILDER_H
+#define SIZEDISTRIBUTIONMODELSBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! Creates the sample demonstrating size distribution model in decoupling approximation.
+//! Equivalent of Examples/python/simulation/ex03_InterferenceFunctions/ApproximationDA.py
+//! @ingroup standard_samples
+
+class BA_CORE_API_ SizeDistributionDAModelBuilder : public IMultiLayerBuilder
+{
+public:
+    SizeDistributionDAModelBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+//! Creates the sample demonstrating size distribution model in local monodisperse approximation.
+//! Equivalent of Examples/python/simulation/ex03_InterferenceFunctions/ApproximationLMA.py
+//! @ingroup standard_samples
+
+class BA_CORE_API_ SizeDistributionLMAModelBuilder : public IMultiLayerBuilder
+{
+public:
+    SizeDistributionLMAModelBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+//! Creates the sample demonstrating size distribution model in size space coupling approximation.
+//! Equivalent of Examples/python/simulation/ex03_InterferenceFunctions/ApproximationSSCA.py
+//! @ingroup standard_samples
+
+class BA_CORE_API_ SizeDistributionSSCAModelBuilder : public IMultiLayerBuilder
+{
+public:
+    SizeDistributionSSCAModelBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+//! Builds sample: size spacing correlation approximation (IsGISAXS example #15).
+//! @ingroup standard_samples
+
+class BA_CORE_API_ CylindersInSSCABuilder : public IMultiLayerBuilder
+{
+public:
+    CylindersInSSCABuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+#endif // SIZEDISTRIBUTIONMODELSBUILDER_H
diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp
new file mode 100644
index 0000000..0dc44d8
--- /dev/null
+++ b/Core/StandardSamples/StandardSimulations.cpp
@@ -0,0 +1,318 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/StandardSimulations.cpp
+//! @brief     Implements functions for standard simulations.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "StandardSimulations.h"
+#include "BornAgainNamespace.h"
+#include "Distributions.h"
+#include "Ellipse.h"
+#include "GISASSimulation.h"
+#include "IsGISAXSDetector.h"
+#include "Line.h"
+#include "ParameterPattern.h"
+#include "Polygon.h"
+#include "RealParameter.h"
+#include "Rectangle.h"
+#include "RectangularDetector.h"
+#include "ResolutionFunction2DGaussian.h"
+#include "SampleBuilderFactory.h"
+#include "Units.h"
+
+using namespace BornAgain;
+
+namespace {
+const int rdet_nbinsx(40), rdet_nbinsy(30);
+const double rdet_width(20.0), rdet_height(18.0), rdet_distance(1000.0);
+}
+
+GISASSimulation* StandardSimulations::PolarizedDWBAMagCylinders2()
+{
+    SampleBuilderFactory factory;
+    std::shared_ptr<IMultiLayerBuilder> builder(factory.createItem("MagneticCylindersBuilder"));
+
+    GISASSimulation* result = new GISASSimulation();
+
+    result->setDetectorParameters(100, -1.0*Units::degree, 1.0*Units::degree,
+                                  100, 0.0*Units::degree, 2.0*Units::degree);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    result->setBeamIntensity(1e7);
+    result->setSampleBuilder( builder );
+    return result;
+}
+
+//! Basic GISAS simulation with the detector phi[0,2], theta[0,2].
+
+GISASSimulation* StandardSimulations::BasicGISAS()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setDetectorParameters(100, 0.0*Units::degree, 2.0*Units::degree,
+                                  100, 0.0*Units::degree, 2.0*Units::degree);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    return result;
+}
+
+//! Basic GISAS for polarization studies.
+
+GISASSimulation* StandardSimulations::BasicGISAS00()
+{
+    GISASSimulation* result = BasicGISAS();
+    kvector_t zplus(0.0, 0.0, 1.0);
+    result->setBeamPolarization(zplus);
+    result->setAnalyzerProperties(zplus, 1.0, 0.5);
+    return result;
+}
+
+//! GISAS simulation with small detector and phi[-2,2], theta[0,2].
+
+GISASSimulation* StandardSimulations::MiniGISAS()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setDetectorParameters(25, -2.0*Units::degree, 2.0*Units::degree,
+                                  25, 0.0*Units::degree, 2.0*Units::degree);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    return result;
+}
+
+//! GISAS simulation with small detector and phi[-1,1], theta[0,1].
+
+GISASSimulation* StandardSimulations::MiniGISAS_v2()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setDetectorParameters(25, -1.0*Units::degree, 1.0*Units::degree,
+                                  25, 0.0*Units::degree, 1.0*Units::degree);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    return result;
+}
+
+//! GISAS simulation with beam divergence applied.
+
+GISASSimulation* StandardSimulations::MiniGISASBeamDivergence()
+{
+    GISASSimulation* result = MiniGISAS();
+
+    DistributionLogNormal wavelength_distr(1.0*Units::angstrom, 0.1);
+    DistributionGaussian alpha_distr(0.2*Units::degree, 0.1*Units::degree);
+    DistributionGate phi_distr(-0.1*Units::degree, 0.1*Units::degree);
+
+    ParameterPattern pattern1;
+    pattern1.beginsWith("*").add(BeamType).add(Wavelength);
+    result->addParameterDistribution(pattern1.toStdString(), wavelength_distr, 5);
+    ParameterPattern pattern2;
+    pattern2.beginsWith("*").add(BeamType).add(Inclination);
+    result->addParameterDistribution(pattern2.toStdString(), alpha_distr, 4);
+    ParameterPattern pattern3;
+    pattern3.beginsWith("*").add(BeamType).add(Azimuth);
+    result->addParameterDistribution(pattern3.toStdString(), phi_distr, 3);
+
+    return result;
+}
+
+//! GISAS simulation with multiple masks on the detector plane.
+
+GISASSimulation* StandardSimulations::GISASWithMasks()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setDetectorParameters(50, -1.0*Units::degree, 1.0*Units::degree,
+                                     50, 0.0*Units::degree, 2.0*Units::degree);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    result->setBeamIntensity(1e+7);
+
+    result->maskAll();
+    // pacman
+    const double deg = Units::degree;
+    result->addMask(Geometry::Ellipse(0.0*deg, 1.0*deg, 0.5*deg, 0.5*deg), false);
+    result->addMask(Geometry::Ellipse(0.11*deg, 1.25*deg, 0.05*deg, 0.05*deg), true);
+
+    std::vector<std::vector<double> >  points = {
+        {0.0*deg, 1.0*deg}, {0.5*deg, 1.2*deg}, {0.5*deg, 0.8*deg}, {0.0*deg, 1.0*deg}
+    };
+    result->addMask(Geometry::Polygon(points), true);
+
+    result->addMask(Geometry::Rectangle(0.45*deg, 0.95*deg, 0.55*deg, 1.05*deg), false);
+    result->addMask(Geometry::Rectangle(0.61*deg, 0.95*deg, 0.71*deg, 1.05*deg), false);
+    result->addMask(Geometry::Rectangle(0.75*deg, 0.95*deg, 0.85*deg, 1.05*deg), false);
+
+    // more masks
+    result->addMask(Geometry::Ellipse(-0.5*deg, 1.5*deg, 0.3*deg, 0.1*deg, 45.*deg), false);
+    result->addMask(Geometry::VerticalLine(-0.6*deg), true);
+    result->addMask(Geometry::HorizontalLine(0.3*deg), false);
+
+    return result;
+}
+
+//! GISAS simulation with detector resolution.
+
+GISASSimulation* StandardSimulations::MiniGISASDetectorResolution()
+{
+    GISASSimulation* result = MiniGISAS();
+    ResolutionFunction2DGaussian resfunc(0.0025, 0.0025);
+    result->setDetectorResolutionFunction(resfunc);
+    return result;
+}
+
+//! GISAS simulation with large detector to test performance.
+
+GISASSimulation* StandardSimulations::MaxiGISAS()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setDetectorParameters(256, -2.0*Units::degree, 2.0*Units::degree,
+                                  256, 0.0*Units::degree, 2.0*Units::degree);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    return result;
+}
+
+//! Basic GISAS for polarization studies.
+
+GISASSimulation* StandardSimulations::MaxiGISAS00()
+{
+    GISASSimulation* result = MaxiGISAS();
+    kvector_t zplus(0.0, 0.0, 1.0);
+    result->setBeamPolarization(zplus);
+    result->setAnalyzerProperties(zplus, 1.0, 0.5);
+    return result;
+}
+
+//! Typical IsGISAXS simulation with the detector phi[-1,1], theta[0,2].
+
+GISASSimulation* StandardSimulations::IsGISAXSSimulation1()
+{
+    GISASSimulation* result = new GISASSimulation();
+    IsGISAXSDetector detector;
+    detector.setDetectorParameters(100,-1.0*Units::degree, 1.0*Units::degree,
+                                   100, 0.0*Units::degree, 2.0*Units::degree);
+    result->setDetector(detector);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    return result;
+}
+
+//! Typical IsGISAXS simulation with the detector phi[0,2], theta[0,2].
+
+GISASSimulation* StandardSimulations::IsGISAXSSimulation2()
+{
+    GISASSimulation* result = new GISASSimulation();
+    IsGISAXSDetector detector;
+    detector.setDetectorParameters(100, 0.0*Units::degree, 2.0*Units::degree,
+                                   100, 0.0*Units::degree, 2.0*Units::degree);
+    result->setDetector(detector);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    return result;
+}
+
+//! GISAS simulation with generic rectangular detector.
+
+GISASSimulation* StandardSimulations::RectDetectorGeneric()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+
+    RectangularDetector detector(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    detector.setPosition(kvector_t(rdet_distance, 10.0, 5.0), rdet_width/2.,
+                         1.0, kvector_t(0.1, -1.0, 0.2));
+
+    result->setDetector(detector);
+    return result;
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the sample.
+
+GISASSimulation* StandardSimulations::RectDetectorPerpToSample()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+
+    RectangularDetector detector(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    detector.setPerpendicularToSampleX(rdet_distance, rdet_width/2., 1.0);
+
+    result->setDetector(detector);
+    return result;
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the direct beam.
+
+GISASSimulation* StandardSimulations::RectDetectorPerpToDirectBeam()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+
+    RectangularDetector detector(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    detector.setPerpendicularToDirectBeam(rdet_distance, rdet_width/2., 1.0);
+
+    result->setDetector(detector);
+    return result;
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the reflected beam.
+
+GISASSimulation* StandardSimulations::RectDetectorPerpToReflectedBeam()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+
+    RectangularDetector detector(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    detector.setPerpendicularToReflectedBeam(rdet_distance, rdet_width/2., 1.0);
+
+    result->setDetector(detector);
+    return result;
+}
+
+//! GISAS simulation with the rectangular detector perpendicular to the reflected beam when
+//! the coordinates of direct beam are known.
+
+GISASSimulation* StandardSimulations::RectDetectorPerpToReflectedBeamDpos()
+{
+    GISASSimulation* result = new GISASSimulation();
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+
+    RectangularDetector detector(rdet_nbinsx, rdet_width, rdet_nbinsy, rdet_height);
+    detector.setPerpendicularToReflectedBeam(rdet_distance);
+    detector.setDirectBeamPosition(rdet_width/2., 1.0);
+
+    result->setDetector(detector);
+    return result;
+}
+
+//! GISAS simulation with Monte-Carlo integration switched ON.
+
+GISASSimulation* StandardSimulations::MiniGISASMonteCarlo()
+{
+    GISASSimulation* result = MiniGISAS();
+    result->getOptions().setMonteCarloIntegration(true, 100);
+    return result;
+}
+
+//! GISAS simulation with spherical detector, region of interest and mask.
+
+GISASSimulation *StandardSimulations::SphericalDetWithRoi() {
+  GISASSimulation *result = new GISASSimulation();
+  result->setDetectorParameters(40, -2.0 * Units::degree, 2.0 * Units::degree,
+                                30, 0.0 * Units::degree, 3.0 * Units::degree);
+  result->setBeamParameters(1.0 * Units::angstrom, 0.2 * Units::degree,
+                            0.0 * Units::degree);
+  result->addMask(Geometry::Rectangle(-0.5 * Units::degree, 0.3 * Units::degree,
+                                      -0.2 * Units::degree,
+                                      0.6 * Units::degree));
+  result->setRegionOfInterest(-1.5 * Units::degree, 0.25 * Units::degree,
+                              1.5 * Units::degree, 1.75 * Units::degree);
+  return result;
+}
+
+//! GISAS simulation with rectangular detector, region of interest and mask.
+
+GISASSimulation* StandardSimulations::RectDetWithRoi()
+{
+    GISASSimulation* result = RectDetectorPerpToDirectBeam();
+    result->addMask(Geometry::Rectangle(3.0, 4.0, 5.0, 7.0));
+    result->setRegionOfInterest(2.0, 3.0, 18.0, 15.0);
+    return result;
+}
diff --git a/Core/StandardSamples/StandardSimulations.h b/Core/StandardSamples/StandardSimulations.h
new file mode 100644
index 0000000..dd658b8
--- /dev/null
+++ b/Core/StandardSamples/StandardSimulations.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/StandardSimulations.h
+//! @brief     Defines namespace and functions for standard simulations.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STANDARDSIMULATIONS_H
+#define STANDARDSIMULATIONS_H
+
+class GISASSimulation;
+
+//! Standard pre-defined simulations.
+
+namespace StandardSimulations{
+
+// Special tests:
+GISASSimulation* PolarizedDWBAMagCylinders2();
+
+// CoreSuite tests:
+GISASSimulation* BasicGISAS();
+GISASSimulation* BasicGISAS00();
+GISASSimulation* MiniGISAS();
+GISASSimulation* MiniGISAS_v2();
+GISASSimulation* MiniGISASBeamDivergence();
+GISASSimulation* MiniGISASDetectorResolution();
+GISASSimulation* GISASWithMasks();
+GISASSimulation* MaxiGISAS();
+GISASSimulation* MaxiGISAS00();
+GISASSimulation* IsGISAXSSimulation1();
+GISASSimulation* IsGISAXSSimulation2();
+GISASSimulation* RectDetectorGeneric();
+GISASSimulation* RectDetectorPerpToSample();
+GISASSimulation* RectDetectorPerpToDirectBeam();
+GISASSimulation* RectDetectorPerpToReflectedBeam();
+GISASSimulation* RectDetectorPerpToReflectedBeamDpos();
+GISASSimulation* MiniGISASMonteCarlo();
+GISASSimulation* SphericalDetWithRoi();
+GISASSimulation* RectDetWithRoi();
+}
+
+#endif // STANDARDSIMULATIONS_H
diff --git a/Core/StandardSamples/TransformationsBuilder.cpp b/Core/StandardSamples/TransformationsBuilder.cpp
new file mode 100644
index 0000000..ae224f7
--- /dev/null
+++ b/Core/StandardSamples/TransformationsBuilder.cpp
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/TransformationsBuilder.cpp
+//! @brief     Implements classes to build samples with different transformations.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "TransformationsBuilder.h"
+#include "FormFactorBox.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+MultiLayer* TransformBoxBuilder::buildSample() const
+{
+    HomogeneousMaterial mAmbience("Air", 0.0, 0.0);
+    HomogeneousMaterial mMiddle("Teflon", 2.900e-6, 6.019e-9);
+    HomogeneousMaterial mSubstrate("Substrate", 3.212e-6, 3.244e-8);
+
+    HomogeneousMaterial mParticle("Ag", 1.245e-5, 5.419e-7);
+
+    double layer_thickness(100);
+    double length(50);
+    double width(20);
+    double height(10);
+
+    Particle box(mParticle, FormFactorBox(length, width, height));
+    box.setRotation(RotationZ(90.*Units::degree));
+    box.applyRotation(RotationY(90.*Units::degree));
+    box.setPosition(kvector_t(0, 0, -layer_thickness/2.));
+
+    ParticleLayout layout;
+    layout.addParticle(box);
+
+    Layer air_layer(mAmbience);
+    Layer middle_layer(mMiddle, layer_thickness);
+    middle_layer.addLayout(layout);
+    Layer substrate(mSubstrate);
+
+    MultiLayer* multi_layer = new MultiLayer();
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(middle_layer);
+    multi_layer->addLayer(substrate);
+
+    return multi_layer;
+}
diff --git a/Core/StandardSamples/TransformationsBuilder.h b/Core/StandardSamples/TransformationsBuilder.h
new file mode 100644
index 0000000..dee721a
--- /dev/null
+++ b/Core/StandardSamples/TransformationsBuilder.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/TransformationsBuilder.h
+//! @brief     Defines classes to build samples with different transformations.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TRANSFORMATIONSBUILDER_H
+#define TRANSFORMATIONSBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! Rotated box in 3 layers system.
+//! @ingroup standard_samples
+
+class BA_CORE_API_ TransformBoxBuilder : public IMultiLayerBuilder
+{
+public:
+    TransformBoxBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+#endif // TRANSFORMATIONSBUILDER_H
diff --git a/Core/StandardSamples/TwoDimLatticeBuilder.cpp b/Core/StandardSamples/TwoDimLatticeBuilder.cpp
new file mode 100644
index 0000000..3692a71
--- /dev/null
+++ b/Core/StandardSamples/TwoDimLatticeBuilder.cpp
@@ -0,0 +1,180 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/TwoDimLatticeBuilder.cpp
+//! @brief     Implements class IsGISAXS06Builder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "TwoDimLatticeBuilder.h"
+#include "FormFactorCylinder.h"
+#include "HomogeneousMaterial.h"
+#include "InterferenceFunction2DLattice.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleLayout.h"
+#include "RealParameter.h"
+#include "Units.h"
+
+MultiLayer *Basic2DLatticeBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    std::unique_ptr<InterferenceFunction2DLattice> P_interference_function(
+                new InterferenceFunction2DLattice(5.0*Units::nanometer, 10.0*Units::nanometer,
+                                                  30.0*Units::deg, 10.0*Units::deg));
+
+    FTDecayFunction2DCauchy pdf(300.0*Units::nanometer/2.0/M_PI,
+                                100.0*Units::nanometer/2.0/M_PI);
+    P_interference_function->setDecayFunction(pdf);
+
+    // particles
+    ParticleLayout particle_layout;
+    FormFactorCylinder ff_cyl(5.0*Units::nanometer, 5.0*Units::nanometer);
+    Particle particle(particle_material, ff_cyl);
+    particle_layout.addParticle(particle, 1.0);
+
+    particle_layout.addInterferenceFunction(*P_interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+
+// -----------------------------------------------------------------------------
+// lattice #1:
+// -----------------------------------------------------------------------------
+MultiLayer* SquareLatticeBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    std::unique_ptr<InterferenceFunction2DLattice> P_interference_function{
+        InterferenceFunction2DLattice::createSquare(10.0 * Units::nanometer) };
+    FTDecayFunction2DCauchy pdf(300.0*Units::nanometer/2.0/M_PI,
+                                100.0*Units::nanometer/2.0/M_PI);
+    P_interference_function->setDecayFunction(pdf);
+
+    // particles
+    ParticleLayout particle_layout;
+    FormFactorCylinder ff_cyl(5.0*Units::nanometer, 5.0*Units::nanometer);
+    Particle particle(particle_material, ff_cyl);
+    particle_layout.addParticle(particle, 1.0);
+
+    particle_layout.addInterferenceFunction(*P_interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+
+// -----------------------------------------------------------------------------
+// lattice #2: centered
+// -----------------------------------------------------------------------------
+MultiLayer* CenteredSquareLatticeBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    InterferenceFunction2DLattice interference_function(10.0*Units::nanometer,
+            10.0*Units::nanometer, M_PI/2.0);
+    FTDecayFunction2DCauchy pdf(300.0*Units::nanometer/2.0/M_PI,
+                                100.0*Units::nanometer/2.0/M_PI);
+    interference_function.setDecayFunction(pdf);
+
+    FormFactorCylinder ff_cyl(5.0*Units::nanometer, 5.0*Units::nanometer);
+    Particle cylinder(particle_material, ff_cyl);
+    std::vector<kvector_t > positions;
+    kvector_t position_1(0.0, 0.0, 0.0);
+    kvector_t position_2(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    positions.push_back(position_1);
+    positions.push_back(position_2);
+    ParticleComposition basis;
+    basis.addParticles(cylinder, positions);
+
+    ParticleLayout particle_layout;
+    particle_layout.addParticle(basis);
+    particle_layout.addInterferenceFunction(interference_function);
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
+
+// -----------------------------------------------------------------------------
+// lattice #3: rotated
+// -----------------------------------------------------------------------------
+MultiLayer* RotatedSquareLatticeBuilder::buildSample() const
+{
+    MultiLayer* multi_layer = new MultiLayer();
+
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+    HomogeneousMaterial air_material("Air", 0.0, 0.0);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    std::unique_ptr<InterferenceFunction2DLattice> P_interference_function{
+        InterferenceFunction2DLattice::createSquare(10.0 * Units::nanometer, 30.0 * Units::degree)};
+    FTDecayFunction2DCauchy pdf(300.0*Units::nanometer/2.0/M_PI,
+                               100.0*Units::nanometer/2.0/M_PI);
+    pdf.setGamma(30.0*Units::degree);
+    P_interference_function->setDecayFunction(pdf);
+
+    ParticleLayout particle_layout;
+    // particle
+    FormFactorCylinder ff_cyl(5.0*Units::nanometer, 5.0*Units::nanometer);
+    kvector_t position(0.0, 0.0, 0.0);
+    Particle p(particle_material, ff_cyl);
+    p.setPosition(position);
+    particle_layout.addParticle(p);
+    particle_layout.addInterferenceFunction(*P_interference_function);
+
+    air_layer.addLayout(particle_layout);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+
+    return multi_layer;
+}
+
diff --git a/Core/StandardSamples/TwoDimLatticeBuilder.h b/Core/StandardSamples/TwoDimLatticeBuilder.h
new file mode 100644
index 0000000..131bc56
--- /dev/null
+++ b/Core/StandardSamples/TwoDimLatticeBuilder.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/StandardSamples/TwoDimLatticeBuilder.h
+//! @brief     Defines class IsGISAXS06Builder.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TWODIMLATTICEBUILDER_H
+#define TWODIMLATTICEBUILDER_H
+
+#include "IMultiLayerBuilder.h"
+
+//! Builds sample: 2D lattice with arbitrary angle and different lattice length_1 and length_2.
+//! @ingroup standard_samples
+
+class BA_CORE_API_ Basic2DLatticeBuilder : public IMultiLayerBuilder
+{
+public:
+    Basic2DLatticeBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+
+//! Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
+//! @ingroup standard_samples
+
+class BA_CORE_API_ SquareLatticeBuilder : public IMultiLayerBuilder
+{
+public:
+    SquareLatticeBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+
+//! Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
+//! @ingroup standard_samples
+
+class BA_CORE_API_ CenteredSquareLatticeBuilder : public IMultiLayerBuilder
+{
+public:
+    CenteredSquareLatticeBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+
+//! Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
+//! @ingroup standard_samples
+
+class BA_CORE_API_ RotatedSquareLatticeBuilder : public IMultiLayerBuilder
+{
+public:
+    RotatedSquareLatticeBuilder(){}
+    MultiLayer* buildSample() const;
+};
+
+#endif // TWODIMLATTICEBUILDER_H
diff --git a/Core/Tools/FileSystem.cpp b/Core/Tools/FileSystem.cpp
new file mode 100644
index 0000000..39a9300
--- /dev/null
+++ b/Core/Tools/FileSystem.cpp
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/FileSystem.cpp
+//! @brief     Implements class FileSystem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FileSystem.h"
+#include "Exceptions.h"
+#include <boost/filesystem.hpp>
+#include <cassert>
+#include <boost/regex.hpp>
+#include <stdexcept>
+
+//! Returns file extension.
+
+std::string FileSystem::GetFileExtension(const std::string& name)
+{
+    return boost::filesystem::extension(name.c_str());
+}
+
+bool FileSystem::CreateDirectory(const std::string& dir_name)
+{
+    assert(dir_name!="");
+    return boost::filesystem::create_directory(dir_name);
+}
+
+    //! Returns filenames of files in directory
+std::vector<std::string> FileSystem::filesInDirectory(const std::string& dir_name)
+{
+    std::vector<std::string> ret;
+    if (!boost::filesystem::exists(dir_name))
+        throw std::runtime_error("FileSystem::filesInDirectory '" + dir_name + "' does not exist");
+    boost::filesystem::directory_iterator end_it; // default construction yields past-the-end
+    for ( boost::filesystem::directory_iterator it( dir_name );
+          it != boost::filesystem::directory_iterator(); ++it ) {
+        if( !boost::filesystem::is_regular_file( it->status() ) )
+            continue;
+        ret.push_back( it->path().filename().string() );
+    }
+    return ret;
+}
+
+std::string FileSystem::GetJoinPath(const std::string& spath1, const std::string& spath2)
+{
+    assert(spath1!="");
+    assert(spath2!="");
+    boost::filesystem::path path1(spath1);
+    boost::filesystem::path path2(spath2);
+    boost::filesystem::path full_path = path1 / path2;
+
+    return full_path.string();
+}
+
+//! Returns path without directory part ("Foo/Bar/Doz.int.gz" -> "Doz.int.gz")
+std::string FileSystem::filename(const std::string& path)
+{
+    return boost::filesystem::path(path).filename().string();
+}
+
+//! Returns file names that agree with a regex glob pattern.
+std::vector<std::string> FileSystem::reglob(const std::string& dir, const std::string& pattern)
+{
+    std::vector<std::string> ret;
+    for (const std::string& fname: filesInDirectory(dir))
+        if (boost::regex_match(fname, boost::regex(pattern)))
+            ret.push_back(fname);
+    return ret;
+}
diff --git a/Core/Tools/FileSystem.h b/Core/Tools/FileSystem.h
new file mode 100644
index 0000000..88d4d71
--- /dev/null
+++ b/Core/Tools/FileSystem.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/FileSystem.h
+//! @brief     Defines class FileSystem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FILESYSTEM_H
+#define FILESYSTEM_H
+
+#include "WinDllMacros.h"
+#include <string>
+#include <vector>
+
+//! Utilities to deal with file system.
+
+namespace FileSystem {
+
+    //! Returns file extension
+	BA_CORE_API_ std::string GetFileExtension(const std::string& name);
+
+    //! creates directory in current directory
+	BA_CORE_API_ bool CreateDirectory(const std::string& dir_name);
+
+    //! Returns filenames of files in directory
+	BA_CORE_API_ std::vector<std::string> filesInDirectory(const std::string &dir_name);
+
+    //! join paths together
+	BA_CORE_API_ std::string GetJoinPath(const std::string& spath1, const std::string& spath2);
+
+    //! Returns path without directory part ("Foo/Bar/Doz.int.gz" -> "Doz.int.gz")
+	BA_CORE_API_ std::string filename(const std::string& path);
+
+    //! Returns file names that agree with a regex glob pattern.
+	BA_CORE_API_ std::vector<std::string> reglob(const std::string& dir, const std::string& pattern);
+
+} // namespace FileSystem
+
+#endif // FILESYSTEM_H
diff --git a/Core/Tools/IntegratorComplex.h b/Core/Tools/IntegratorComplex.h
new file mode 100644
index 0000000..91558c6
--- /dev/null
+++ b/Core/Tools/IntegratorComplex.h
@@ -0,0 +1,95 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/IntegratorComplex.h
+//! @brief     Defines and implements class template IntegratorComplex.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTEGRATORCOMPLEX_H
+#define INTEGRATORCOMPLEX_H
+
+#include "IntegratorReal.h"
+
+//! Alias template for member function with signature complex_t f(double)
+template <class T>
+using complex_integrand = complex_t (T::*)(double) const;
+
+//! @class IntegratorComplex
+//! @ingroup tools_internal
+//! @brief Template class to integrate complex class member functions
+//!
+//! Wraps an two integrators from the GNU Scientific Library.
+//! Since this class holds a persistent workspace, we need at least one instance per thread.
+//! Standard usage for integration inside a class T:
+//! - Create a handle to an integrator:
+//!      'auto integrator = make_integrator_complex(this, mem_function)'
+//! - Call: 'integrator.integrate(lmin, lmax)'
+template <class T> class IntegratorComplex
+{
+public:
+    //! to integrate p_member_function, which must belong to p_object
+    IntegratorComplex(const T *p_object, complex_integrand<T> p_member_function);
+    ~IntegratorComplex() {}
+
+    //! perform the actual integration over the range [lmin, lmax]
+    complex_t integrate(double lmin, double lmax);
+
+private:
+    double real(double value) const;
+    double imag(double value) const;
+    const T *mp_object_pointer;
+    complex_integrand<T> mp_member_function;
+    P_integrator_real<IntegratorComplex<T>> mP_real_integrator;
+    P_integrator_real<IntegratorComplex<T>> mP_imag_integrator;
+};
+
+//! Alias template for handle to a real integrator
+template <class T>
+using P_integrator_complex = std::unique_ptr<IntegratorComplex<T>>;
+
+//! @fn make_integrator_complex
+//! @ingroup tools_internal
+//! @brief Template function to create an integrator object
+template <class T>
+P_integrator_complex<T> make_integrator_complex(const T *object, complex_integrand<T> mem_function)
+{
+    P_integrator_complex<T> P_integrator(new IntegratorComplex<T>(object, mem_function));
+    return P_integrator;
+}
+
+template<class T> IntegratorComplex<T>::IntegratorComplex(
+        const T *p_object, complex_integrand<T> p_member_function)
+    : mp_object_pointer { p_object }
+    , mp_member_function { p_member_function }
+{
+    mP_real_integrator = make_integrator_real(this, &IntegratorComplex<T>::real);
+    mP_imag_integrator = make_integrator_real(this, &IntegratorComplex<T>::imag);
+}
+
+template<class T> complex_t IntegratorComplex<T>::integrate(
+        double lmin, double lmax)
+{
+   double real = mP_real_integrator->integrate(lmin, lmax);
+   double imag = mP_imag_integrator->integrate(lmin, lmax);
+   return complex_t(real, imag);
+}
+
+template<class T> double IntegratorComplex<T>::real(double value) const
+{
+    return (mp_object_pointer->*mp_member_function)(value).real();
+}
+
+template<class T> double IntegratorComplex<T>::imag(double value) const
+{
+    return (mp_object_pointer->*mp_member_function)(value).imag();
+}
+
+#endif // INTEGRATORCOMPLEX_H
diff --git a/Core/Tools/IntegratorMCMiser.h b/Core/Tools/IntegratorMCMiser.h
new file mode 100644
index 0000000..57e77b8
--- /dev/null
+++ b/Core/Tools/IntegratorMCMiser.h
@@ -0,0 +1,120 @@
+
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/IntegratorMCMiser.h
+//! @brief     Defines and implements template class IntegratorMCMiser.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTEGRATORMCMISER_H
+#define INTEGRATORMCMISER_H
+
+#include <gsl/gsl_monte_miser.h>
+#include <memory>
+
+//! Alias template for member function with signature double f(double)
+template <class T>
+using miser_integrand = double (T::*)(double *, size_t, void*) const;
+
+//! @class MCMiserIntegrator
+//! @ingroup tools_internal
+//! @brief Template class to use Monte Carlo MISER integration of class member functions
+//!
+//! Wraps an integrator from GNU Scientific Library.
+//! Since this class holds a persistent workspace, we need at least one instance per thread.
+//! Standard usage for integration inside a class T:
+//! - Create a handle to an integrator:
+//!       'auto integrator = make_integrator_miser(this, mem_function, dimension)'
+//! - Call: 'integrator.integrate(lmin, lmax, data, nbr_points)'
+template <class T> class IntegratorMCMiser
+{
+public:
+    //! structure holding the object and possible extra parameters
+    struct CallBackHolder {
+        const T *m_object_pointer;
+        miser_integrand<T> m_member_function;
+        void *m_data;
+    };
+
+    //! to integrate p_member_function, which must belong to p_object
+    IntegratorMCMiser(const T *p_object, miser_integrand<T> p_member_function, size_t dim);
+    ~IntegratorMCMiser();
+
+    //! perform the actual integration over the ranges [min_array, max_array]
+    double integrate(double *min_array, double *max_array, void* params,
+                     size_t nbr_points);
+
+private:
+    //! static function that can be passed to gsl integrator
+    static double StaticCallBack(double *d_array, size_t dim, void *v) {
+        CallBackHolder *p_cb = static_cast<CallBackHolder *>(v);
+        auto mf = static_cast<miser_integrand<T>>(p_cb->m_member_function);
+        return (p_cb->m_object_pointer->*mf)(d_array, dim, p_cb->m_data);
+    }
+    const T *mp_object;
+    miser_integrand<T> m_member_function;
+    size_t m_dim; //!< dimension of the integration
+    gsl_monte_miser_state *m_gsl_workspace;
+    gsl_rng *m_random_gen;
+};
+
+//! Alias template for handle to a miser integrator
+template <class T>
+using P_integrator_miser = std::unique_ptr<IntegratorMCMiser<T>>;
+
+//! @fn make_integrator_miser
+//! @ingroup tools_internal
+//! @brief Template function to create an integrator object
+template <class T> P_integrator_miser<T>
+make_integrator_miser(const T *object, miser_integrand<T> mem_function, size_t dim)
+{
+    P_integrator_miser<T> P_integrator(new IntegratorMCMiser<T>(object, mem_function, dim));
+    return P_integrator;
+}
+
+template<class T> IntegratorMCMiser<T>::IntegratorMCMiser(
+        const T *p_object, miser_integrand<T> p_member_function, size_t dim)
+    : mp_object(p_object)
+    , m_member_function(p_member_function)
+    , m_dim(dim)
+    , m_gsl_workspace { nullptr }
+{
+    m_gsl_workspace = gsl_monte_miser_alloc(m_dim);
+
+    const gsl_rng_type * random_type;
+    gsl_rng_env_setup();
+    random_type = gsl_rng_default;
+    m_random_gen = gsl_rng_alloc(random_type);
+}
+
+template<class T> IntegratorMCMiser<T>::~IntegratorMCMiser()
+{
+    gsl_monte_miser_free(m_gsl_workspace);
+    gsl_rng_free(m_random_gen);
+}
+
+template<class T> double IntegratorMCMiser<T>::integrate(
+        double *min_array, double *max_array, void* params, size_t nbr_points)
+{
+    CallBackHolder cb = { mp_object, m_member_function, params };
+
+    gsl_monte_function f;
+    f.f = StaticCallBack;
+    f.dim = m_dim;
+    f.params = &cb;
+
+    double result, error;
+    gsl_monte_miser_integrate(&f, min_array, max_array, m_dim, nbr_points,
+                                    m_random_gen, m_gsl_workspace, &result, &error);
+    return result;
+}
+
+#endif // INTEGRATORMCMISER_H
diff --git a/Core/Tools/IntegratorReal.h b/Core/Tools/IntegratorReal.h
new file mode 100644
index 0000000..39c8bcd
--- /dev/null
+++ b/Core/Tools/IntegratorReal.h
@@ -0,0 +1,102 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/IntegratorReal.h
+//! @brief     Defines and implements class template IntegratorReal.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTEGRATORREAL_H
+#define INTEGRATORREAL_H
+
+#include <gsl/gsl_integration.h>
+#include <memory>
+
+//! Alias template for member function with signature double f(double)
+template <class T>
+using real_integrand = double (T::*)(double) const;
+
+//! @class IntegratorReal
+//! @ingroup tools_internal
+//! @brief Template class to integrate class member functions
+//!
+//! Wraps an integrator from the GNU Scientific Library.
+//! Since this class holds a persistent workspace, we need at least one instance per thread.
+//! Standard usage for integration inside a class T:
+//! - Create a handle to an integrator: 'auto integrator = make_integrator_real(this, mem_function)'
+//! - Call: 'integrator.integrate(lmin, lmax)'
+template <class T> class IntegratorReal
+{
+public:
+    //! structure holding the object and possible extra parameters
+    struct CallBackHolder {
+        const T *m_object_pointer;
+        real_integrand<T> m_member_function;
+    };
+
+    //! to integrate p_member_function, which must belong to p_object
+    IntegratorReal(const T *p_object, real_integrand<T> p_member_function);
+    ~IntegratorReal();
+
+    //! perform the actual integration over the range [lmin, lmax]
+    double integrate(double lmin, double lmax);
+
+private:
+    //! static function that can be passed to gsl integrator
+    static double StaticCallBack(double d, void *v) {
+        CallBackHolder *p_cb = static_cast<CallBackHolder *>(v);
+        auto mf = static_cast<real_integrand<T>>(p_cb->m_member_function);
+        return (p_cb->m_object_pointer->*mf)(d);
+    }
+    CallBackHolder m_cb;
+    gsl_integration_workspace *mp_gsl_workspace;
+};
+
+//! Alias template for handle to a real integrator
+template <class T>
+using P_integrator_real = std::unique_ptr<IntegratorReal<T>>;
+
+//! @fn make_integrator_real
+//! @ingroup tools_internal
+//! @brief Template function to create an integrator object
+template <class T>
+P_integrator_real<T> make_integrator_real(const T *object, real_integrand<T> mem_function)
+{
+    P_integrator_real<T> P_integrator(new IntegratorReal<T>(object, mem_function));
+    return P_integrator;
+}
+
+template<class T> IntegratorReal<T>::IntegratorReal(
+        const T *p_object, real_integrand<T> p_member_function)
+    : mp_gsl_workspace { nullptr }
+{
+	m_cb = CallBackHolder{ p_object, p_member_function };
+    mp_gsl_workspace = gsl_integration_workspace_alloc(200);
+}
+
+template<class T> IntegratorReal<T>::~IntegratorReal()
+{
+    gsl_integration_workspace_free(mp_gsl_workspace);
+}
+
+template<class T> double IntegratorReal<T>::integrate(
+        double lmin, double lmax)
+{
+    gsl_function f;
+    f.function = StaticCallBack;
+    f.params =&m_cb;
+
+    double result, error;
+    gsl_integration_qag(&f, lmin, lmax, 1e-10, 1e-8, 50, 1,
+                        mp_gsl_workspace, &result, &error);
+
+    return result;
+}
+#endif // INTEGRATORREAL_H
diff --git a/Core/Tools/MathFunctions.cpp b/Core/Tools/MathFunctions.cpp
new file mode 100644
index 0000000..799a527
--- /dev/null
+++ b/Core/Tools/MathFunctions.cpp
@@ -0,0 +1,384 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/MathFunctions.cpp
+//! @brief     Implements functions in namespace MathFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MathFunctions.h"
+#include "MathConstants.h"
+#include <gsl/gsl_sf_bessel.h>
+#include <gsl/gsl_sf_erf.h>
+#include <gsl/gsl_sf_expint.h>
+#include <gsl/gsl_sf_trig.h>
+#include <fftw3.h>
+#include <chrono>
+#include <cstring>
+#include <limits>
+#include <random>
+#include <stdexcept> // need overlooked by g++ 5.4
+
+// ************************************************************************** //
+//  Various functions
+// ************************************************************************** //
+
+double MathFunctions::StandardNormal(double x)
+{
+    return std::exp(-x * x / 2.0) / std::sqrt(M_TWOPI);
+}
+
+double MathFunctions::Gaussian(double x, double average, double std_dev)
+{
+    return StandardNormal((x - average) / std_dev) / std_dev;
+}
+
+double MathFunctions::IntegratedGaussian(double x, double average, double std_dev)
+{
+    double normalized_x = (x - average) / std_dev;
+    static double root2 = std::sqrt(2.0);
+    return (gsl_sf_erf(normalized_x / root2) + 1.0) / 2.0;
+}
+
+double MathFunctions::cot(double x)
+{
+    return tan(M_PI_2-x);
+}
+
+double MathFunctions::Si(double x)  // int_0^x du Sin(u)/u
+{
+    return gsl_sf_Si(x);
+}
+
+double MathFunctions::sinc(double x)  // Sin(x)/x
+{
+    return gsl_sf_sinc(x/M_PI);
+}
+
+complex_t MathFunctions::sinc(const complex_t z)  // Sin(x)/x
+{
+    // This is an exception from the rule that we must not test floating-point numbers for equality.
+    // For small non-zero arguments, sin(z) returns quite accurately z or z-z^3/6.
+    // There is no loss of precision in computing sin(z)/z.
+    // Therefore there is no need for an expensive test like abs(z)<eps.
+    if( z==complex_t(0.,0.) )
+        return 1.0;
+    return std::sin(z)/z;
+}
+
+complex_t MathFunctions::tanhc(const complex_t z)  // tanh(x)/x
+{
+    if(std::abs(z)<std::numeric_limits<double>::epsilon())
+        return 1.0;
+    return std::tanh(z)/z;
+}
+
+complex_t MathFunctions::Laue(const complex_t z, size_t N) // Exp(iNx/2)*Sin((N+1)x)/Sin(x)
+{
+    if (N==0)
+        return 1.0;
+    if(std::abs(z)<std::numeric_limits<double>::epsilon())
+        return N+1.0;
+    return exp_I(N/2.0*z)*std::sin(z*(N+1.0)/2.0)/std::sin(z/2.0);
+}
+
+// ************************************************************************** //
+//  Bessel functions
+// ************************************************************************** //
+
+namespace MathFunctions
+{
+//! Computes complex Bessel function J0(z), using power series and asymptotic expansion
+    BA_CORE_API_ complex_t Bessel_J0_PowSer(const complex_t z);
+
+//! Computes complex Bessel function J0(z), using power series and asymptotic expansion
+    BA_CORE_API_ complex_t Bessel_J1_PowSer(const complex_t z);
+}
+
+double MathFunctions::Bessel_J0(double x)
+{
+    return gsl_sf_bessel_J0(x);
+}
+
+double MathFunctions::Bessel_J1(double x)
+{
+    return gsl_sf_bessel_J1(x);
+}
+
+double MathFunctions::Bessel_J1c(double x)
+{
+    return x==0 ? 0.5 : gsl_sf_bessel_J1(x)/x;
+}
+
+complex_t MathFunctions::Bessel_J0(const complex_t z)
+{
+    if (std::imag(z)==0)
+        return gsl_sf_bessel_J0(std::real(z));
+    return Bessel_J0_PowSer(z);
+}
+
+complex_t MathFunctions::Bessel_J1(const complex_t z)
+{
+    if (std::imag(z)==0)
+        return gsl_sf_bessel_J1(std::real(z));
+    return Bessel_J1_PowSer(z);
+}
+
+complex_t MathFunctions::Bessel_J1c(const complex_t z)
+{
+    if (std::imag(z)==0) {
+        double xv = std::real(z);
+        return xv==0 ? 0.5 : gsl_sf_bessel_J1(xv)/xv;
+    }
+    return z==0. ? 0.5 : MathFunctions::Bessel_J1_PowSer(z)/z;
+}
+
+//! Computes the complex Bessel function J0(z), using power series and asymptotic expansion.
+//!
+//! Forked from unoptimized code at http://www.crbond.com/math.htm,
+//! who refers to "Computation of Special Functions", Zhang and Jin, John Wiley and Sons, 1996.
+
+complex_t MathFunctions::Bessel_J0_PowSer(const complex_t z)
+{
+    complex_t cj0;
+    static const complex_t cone(1.0, 0.0);
+    static const complex_t czero(0.0, 0.0);
+    static const double eps = 1e-15;
+    static double a[] = { -7.03125e-2,           0.112152099609375,     -0.5725014209747314,
+                          6.074042001273483,     -1.100171402692467e2,  3.038090510922384e3,
+                          -1.188384262567832e5,  6.252951493434797e6,   -4.259392165047669e8,
+                          3.646840080706556e10,  -3.833534661393944e12, 4.854014686852901e14,
+                          -7.286857349377656e16, 1.279721941975975e19 };
+    static double b[] = { 7.32421875e-2,         -0.2271080017089844,  1.727727502584457,
+                          -2.438052969955606e1,  5.513358961220206e2,  -1.825775547429318e4,
+                          8.328593040162893e5,   -5.006958953198893e7, 3.836255180230433e9,
+                          -3.649010818849833e11, 4.218971570284096e13, -5.827244631566907e15,
+                          9.476288099260110e17,  -1.792162323051699e20 };
+
+    double a0 = std::abs(z);
+    complex_t z1 = z;
+    if (a0 == 0.0)
+        return 1.0;
+    if (std::real(z) < 0.0)
+        z1 = -z;
+    if (a0 <= 12.0) {
+        // standard power series [http://dlmf.nist.gov/10.2 (10.2.2)]
+        complex_t z2 = 0.25 * z * z;
+        cj0 = 1.0;
+        complex_t cr = 1.0;
+        for (size_t k = 1; k <= 40; ++k) {
+            cr *= -z2 / (double)(k * k);
+            cj0 += cr;
+            if (std::abs(cr) < std::abs(cj0) * eps)
+                break;
+        }
+    } else {
+        // Hankel's asymptotic expansion [http://dlmf.nist.gov/10.17 (10.17.3)]
+        size_t kz;
+        if (a0 >= 50.0)
+            kz = 8; // can be changed to 10
+        else if (a0 >= 35.0)
+            kz = 10; //   "      "     "  12
+        else
+            kz = 12; //   "      "     "  14
+        complex_t ct1 = z1 - M_PI_4;
+        complex_t cp0 = 1.0;
+        complex_t cq0 = -0.125;
+        const complex_t z1m2 = 1. / (z1*z1); // faster than std::pow(z1, -2.0) ??
+        complex_t ptmp = z1m2;
+        for (size_t k = 0; k < kz; ++k) {
+            cp0 += a[k] * ptmp;
+            cq0 += b[k] * ptmp;
+            ptmp *= z1m2;
+        }
+        cj0 = std::sqrt(M_2_PI / z1) * (cp0 * std::cos(ct1) - cq0/z1 * std::sin(ct1));
+    }
+    return cj0;
+}
+
+//! Computes the complex Bessel function J1(z), using power series and asymptotic expansion.
+//!
+//! Forked from same source as for Bessel_J0_PowSer
+
+complex_t MathFunctions::Bessel_J1_PowSer(const complex_t z)
+{
+    complex_t cj1;
+    static const double eps = 1e-15;
+
+    static double a1[] = { 0.1171875,             -0.1441955566406250,  0.6765925884246826,
+                           -6.883914268109947,    1.215978918765359e2,  -3.302272294480852e3,
+                           1.276412726461746e5,   -6.656367718817688e6, 4.502786003050393e8,
+                           -3.833857520742790e10, 4.011838599133198e12, -5.060568503314727e14,
+                           7.572616461117958e16,  -1.326257285320556e19 };
+    static double b1[] = { -0.1025390625,         0.2775764465332031,    -1.993531733751297,
+                           2.724882731126854e1,   -6.038440767050702e2,  1.971837591223663e4,
+                           -8.902978767070678e5,  5.310411010968522e7,   -4.043620325107754e9,
+                           3.827011346598605e11,  -4.406481417852278e13, 6.065091351222699e15,
+                           -9.833883876590679e17, 1.855045211579828e20 };
+
+    double a0 = std::abs(z);
+    if (a0 == 0.0)
+        return 0.0;
+
+    complex_t z1 = z;
+    if (std::real(z) < 0.0)
+        z1 = -z;
+    if (a0 <= 12.0) {
+        // standard power series [http://dlmf.nist.gov/10.2 (10.2.2)]
+        const complex_t z2 = 0.25 * z * z;
+        cj1 = 1.0;
+        complex_t cr = 1.0; // powers will be computed recursively
+        for (int k = 1; k <= 40; ++k) {
+            cr *= -z2 / (double)(k * (k + 1));
+            cj1 += cr;
+            if (std::abs(cr) < std::abs(cj1) * eps)
+                break;
+        }
+        cj1 *= 0.5 * z1;
+    } else {
+        // Hankel's asymptotic expansion [http://dlmf.nist.gov/10.17 (10.17.3)]
+        size_t kz;
+        if (a0 >= 50.0)
+            kz = 8; // can be changed to 10
+        else if (a0 >= 35.0)
+            kz = 10; //   "      "     "  12
+        else
+            kz = 12; //   "      "     "  14
+        complex_t cp1 = 1.0;
+        complex_t cq1 = 0.375; // division by z1 postponed to final sum
+        const complex_t z1m2 = 1. / (z1*z1); // faster than std::pow(z1, -2.0) ??
+        complex_t ptmp = z1m2; // powers will be computed recursively
+        for (size_t k = 0; k < kz; ++k) {
+            cp1 += a1[k] * ptmp;
+            cq1 += b1[k] * ptmp; // division by z1 postponed to final sum
+            ptmp *= z1m2;
+        }
+        const complex_t ct2 = z1 - 0.75 * M_PI;
+        cj1 = std::sqrt(M_2_PI / z1) * (cp1 * std::cos(ct2) - cq1/z1 * std::sin(ct2));
+    }
+    if (std::real(z) < 0.0)
+        cj1 = -cj1;
+    return cj1;
+}
+
+// ************************************************************************** //
+//  Fourier transform and convolution
+// ************************************************************************** //
+
+//! @brief simple (and unoptimized) wrapper function
+//!   for the discrete fast Fourier transformation library (fftw3)
+
+std::vector<complex_t>
+MathFunctions::FastFourierTransform(const std::vector<complex_t> &data,
+                                    MathFunctions::EFFTDirection ftCase)
+{
+    double scale(1.);
+    size_t npx = data.size();
+
+    fftw_complex *ftData = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * npx);
+    fftw_complex *ftResult = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * npx);
+    memset(ftData, 0, sizeof(fftw_complex) * npx);
+    memset(ftResult, 0, sizeof(fftw_complex) * npx);
+
+    for (size_t i = 0; i < npx; i++) {
+        ftData[i][0] = data[i].real();
+        ftData[i][1] = data[i].imag();
+    }
+
+    fftw_plan plan;
+    switch (ftCase) {
+    case MathFunctions::FORWARD_FFT:
+        plan = fftw_plan_dft_1d((int)npx, ftData, ftResult, FFTW_FORWARD, FFTW_ESTIMATE);
+        break;
+    case MathFunctions::BACKWARD_FFT:
+        plan = fftw_plan_dft_1d((int)npx, ftData, ftResult, FFTW_BACKWARD, FFTW_ESTIMATE);
+        scale = 1. / double(npx);
+        break;
+    default:
+        throw std::runtime_error(
+            "MathFunctions::FastFourierTransform -> Panic! Unknown transform case.");
+    }
+
+    fftw_execute(plan);
+
+    // saving data for user
+    std::vector<complex_t> outData;
+    outData.resize(npx);
+    for (size_t i = 0; i < npx; i++)
+        outData[i] = scale * complex_t(ftResult[i][0], ftResult[i][1]);
+
+    fftw_destroy_plan(plan);
+    fftw_free(ftData);
+    fftw_free(ftResult);
+
+    return outData;
+}
+
+//! @brief simple (and unoptimized) wrapper function
+//!   for the discrete fast Fourier transformation library (fftw3);
+//!   transforms real to complex
+
+std::vector<complex_t> MathFunctions::FastFourierTransform(
+    const std::vector<double> &data, MathFunctions::EFFTDirection ftCase)
+{
+    std::vector<complex_t> cdata;
+    cdata.resize(data.size());
+    for (size_t i = 0; i < data.size(); i++)
+        cdata[i] = complex_t(data[i], 0);
+    return MathFunctions::FastFourierTransform(cdata, ftCase);
+}
+
+//! convolution of two real vectors of equal size
+
+std::vector<complex_t>
+MathFunctions::ConvolveFFT(const std::vector<double> &signal,
+                           const std::vector<double> &resfunc)
+{
+    if (signal.size() != resfunc.size())
+        throw std::runtime_error("MathFunctions::ConvolveFFT() -> This convolution works only for "
+                                 "two vectors of equal size. Use Convolve class instead.");
+    std::vector<complex_t> fft_signal
+        = MathFunctions::FastFourierTransform(signal, MathFunctions::FORWARD_FFT);
+    std::vector<complex_t> fft_resfunc
+        = MathFunctions::FastFourierTransform(resfunc, MathFunctions::FORWARD_FFT);
+
+    std::vector<complex_t> fft_prod;
+    fft_prod.resize(fft_signal.size());
+    for (size_t i = 0; i < fft_signal.size(); i++)
+        fft_prod[i] = fft_signal[i] * fft_resfunc[i];
+
+    std::vector<complex_t> result
+        = MathFunctions::FastFourierTransform(fft_prod, MathFunctions::BACKWARD_FFT);
+    return result;
+}
+
+
+// ************************************************************************** //
+//  Random number generators
+// ************************************************************************** //
+
+double MathFunctions::GenerateUniformRandom()
+{
+    int random_int = std::rand();
+    return (double)random_int / RAND_MAX;
+}
+
+double MathFunctions::GenerateNormalRandom(double average, double std_dev)
+{
+    return GenerateStandardNormalRandom()*std_dev + average;
+}
+
+double MathFunctions::GenerateStandardNormalRandom() // using c++11 standard library
+{
+    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
+    std::default_random_engine generator(seed);
+    std::normal_distribution<double> distribution(0.0, 1.0);
+    return distribution(generator);
+}
diff --git a/Core/Tools/MathFunctions.h b/Core/Tools/MathFunctions.h
new file mode 100644
index 0000000..112da62
--- /dev/null
+++ b/Core/Tools/MathFunctions.h
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/MathFunctions.h
+//! @brief     Defines functions in namespace MathFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATHFUNCTIONS_H
+#define MATHFUNCTIONS_H
+
+#include "WinDllMacros.h"
+#include "Complex.h"
+#include <vector>
+
+//! Various mathematical functions.
+
+namespace MathFunctions
+{
+
+// ************************************************************************** //
+//  Various functions
+// ************************************************************************** //
+
+    BA_CORE_API_ double StandardNormal(double x);
+    BA_CORE_API_ double Gaussian(double x, double average, double std_dev);
+    BA_CORE_API_ double IntegratedGaussian(double x, double average, double std_dev);
+
+//! cotangent function: \f$cot(x)\equiv1/tan(x)\f$
+    BA_CORE_API_ double cot(double x);
+
+//! Sine integral function: \f$Si(x)\equiv\int_0^x du \sin(u)/u\f$
+    BA_CORE_API_ double Si(double x);
+
+//! sinc function: \f$sinc(x)\equiv\sin(x)/x\f$
+    BA_CORE_API_ double sinc(double x);
+
+//! Complex sinc function: \f$sinc(x)\equiv\sin(x)/x\f$
+    BA_CORE_API_ complex_t sinc(const complex_t z);
+
+//! Complex tanhc function: \f$tanhc(x)\equiv\tanh(x)/x\f$
+    BA_CORE_API_ complex_t tanhc(const complex_t z);
+
+    BA_CORE_API_ complex_t Laue(const complex_t z, size_t N);
+
+
+// ************************************************************************** //
+//  Bessel functions
+// ************************************************************************** //
+
+//! Bessel function of the first kind and order 0
+    BA_CORE_API_ double Bessel_J0(double x);
+
+//! Bessel function of the first kind and order 1
+    BA_CORE_API_ double Bessel_J1(double x);
+
+//! Bessel function  Bessel_J1(x)/x
+    BA_CORE_API_ double Bessel_J1c(double x);
+
+//! Complex Bessel function of the first kind and order 0
+    BA_CORE_API_ complex_t Bessel_J0(const complex_t z);
+
+//! Complex Bessel function of the first kind and order 1
+    BA_CORE_API_ complex_t Bessel_J1(const complex_t z);
+
+//! Complex Bessel function  Bessel_J1(x)/x
+    BA_CORE_API_ complex_t Bessel_J1c(const complex_t z);
+
+
+// ************************************************************************** //
+//  Fourier transform and convolution
+// ************************************************************************** //
+
+    // TODO move elsewhere, and rm #include <vector>
+
+    enum EFFTDirection { FORWARD_FFT, BACKWARD_FFT };
+
+    // TODO: name these two functions differently (SWIG warning 509)
+    BA_CORE_API_ std::vector<complex_t >
+        FastFourierTransform(const std::vector<complex_t>& data, EFFTDirection tcase);
+    BA_CORE_API_ std::vector<complex_t >
+        FastFourierTransform(const std::vector<double>& data, EFFTDirection tcase);
+
+    BA_CORE_API_ std::vector<complex_t>
+        ConvolveFFT(const std::vector<double>& signal, const std::vector<double>& resfunc);
+
+
+// ************************************************************************** //
+//  Random number generators
+// ************************************************************************** //
+
+    BA_CORE_API_ double GenerateUniformRandom();
+    BA_CORE_API_ double GenerateStandardNormalRandom();
+    BA_CORE_API_ double GenerateNormalRandom(double average, double std_dev);
+
+} // Namespace MathFunctions
+
+
+#endif // MATHFUNCTIONS_H
diff --git a/Core/Tools/Numeric.cpp b/Core/Tools/Numeric.cpp
new file mode 100644
index 0000000..61af7f4
--- /dev/null
+++ b/Core/Tools/Numeric.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/Numeric.cpp
+//! @brief     Implements "almost equal" in namespace Numeric.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Numeric.h"
+#include <algorithm>
+#include <cmath>
+#include <limits>
+
+//! Floating-point epsilon, tolerances, almost-equal.
+
+namespace Numeric {
+
+//! Returns true if two doubles agree within epsilon*tolerance.
+bool areAlmostEqual(double a, double b, double tolerance)
+{
+    constexpr double eps = std::numeric_limits<double>::epsilon();
+    return std::abs(a-b) <= eps * std::max( tolerance*eps, std::max(1., tolerance)*std::abs(b) );
+}
+
+//! Returns the safe relative difference, which is |(a-b)/b| except in special cases.
+double get_relative_difference(double a, double b)
+{
+    constexpr double eps = std::numeric_limits<double>::epsilon();
+    // return 0.0 if relative error smaller than epsilon
+    if (std::abs(a-b) <= eps*std::abs(b))
+        return 0.0;
+    // for small numbers, divide by epsilon (to avoid catastrophic cancellation)
+    if (std::abs(b) <= eps)
+        return std::abs((a-b)/eps);
+    return std::abs((a-b)/b);
+}
+
+} // Numeric namespace
diff --git a/Core/Tools/Numeric.h b/Core/Tools/Numeric.h
new file mode 100644
index 0000000..9148be5
--- /dev/null
+++ b/Core/Tools/Numeric.h
@@ -0,0 +1,32 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/Numeric.h
+//! @brief     Defines constants and "almost equal" in namespace Numeric.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef NUMERIC_H
+#define NUMERIC_H
+
+#include "WinDllMacros.h"
+#include <limits>
+
+//! Floating-point epsilon, tolerances, almost-equal.
+
+namespace Numeric {
+
+bool BA_CORE_API_ areAlmostEqual(double a, double b, double tolerance_factor=1.0);
+
+double BA_CORE_API_ get_relative_difference(double a, double b);
+
+} // Numeric namespace
+
+#endif // NUMERIC_H
diff --git a/Core/Tools/Precomputed.cpp b/Core/Tools/Precomputed.cpp
new file mode 100644
index 0000000..2668158
--- /dev/null
+++ b/Core/Tools/Precomputed.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/Precomputed.cpp
+//! @brief     Implements class Precomputed, providing precomputed constants
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   J. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Precomputed.h"
+#include <cmath>
+
+//! Precompute things upon class instantiation.
+
+Precomputed::Precomputed()
+{
+    // Precompute the factorial: factorial[k] = k!
+    double fac = 1;
+    for( int k=1; std::isfinite(fac); ++k ){
+        factorial.push_back( fac );
+        fac *= k;
+    }
+    // Precompute the reciprocal factorial: reciprocal_factorial[k] = 1/k!
+    for( size_t k=0; k<factorial.size(); ++k ){
+        reciprocal_factorial.push_back( 1/factorial[k] );
+    }
+}
diff --git a/Core/Tools/Precomputed.h b/Core/Tools/Precomputed.h
new file mode 100644
index 0000000..7ae0872
--- /dev/null
+++ b/Core/Tools/Precomputed.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/Precomputed.h
+//! @brief     Defines classes Precomputed, providing precomputed constants
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   J. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PRECOMPUTED_H
+#define PRECOMPUTED_H
+
+#include "WinDllMacros.h"
+#include "ISingleton.h"
+#include <vector>
+
+//! This class contains precomputed constants.
+
+class BA_CORE_API_ Precomputed : public ISingleton<Precomputed>
+{
+    friend class ISingleton<Precomputed>;
+public:
+    std::vector<double> factorial; //!< factorial[k] = k! for k=0,1,...,170 (for IEEE double).
+    std::vector<double> reciprocal_factorial; //!< 1/k!
+private:
+    Precomputed(); //!< Constructor, precomputes everything.
+};
+
+#endif // PRECOMPUTED_H
diff --git a/Core/Tools/SafePointerVector.h b/Core/Tools/SafePointerVector.h
new file mode 100644
index 0000000..6c2d7b1
--- /dev/null
+++ b/Core/Tools/SafePointerVector.h
@@ -0,0 +1,92 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/SafePointerVector.h
+//! @brief     Defines and implements template class SafePointerVector.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAFEPOINTERVECTOR_H
+#define SAFEPOINTERVECTOR_H
+
+#include <algorithm>
+#include <vector>
+
+//! A vector of pointers, owned by *this, with methods to handle them safely.
+//! @ingroup tools_internal
+
+//! The objects pointed to must support the ICloneable interface.
+
+template <class T>
+class SafePointerVector
+{
+public:
+    typedef typename std::vector<T*>::iterator iterator;
+    typedef typename std::vector<T*>::const_iterator const_iterator;
+    SafePointerVector() {}
+    SafePointerVector(const SafePointerVector& other);
+    virtual ~SafePointerVector() { clear(); }
+
+    SafePointerVector& operator=(const SafePointerVector& right);
+    size_t size() const { return m_pointers.size(); }
+    bool empty() const { return m_pointers.empty(); }
+    void push_back(T* pointer) { m_pointers.push_back(pointer); }
+    T* operator[](size_t index) { return m_pointers[index]; }
+    const T *operator[](size_t index) const { return m_pointers[index]; }
+    iterator begin() { return m_pointers.begin(); }
+    const_iterator begin() const { return m_pointers.begin(); }
+    iterator end() { return m_pointers.end(); }
+    const_iterator end() const { return m_pointers.end(); }
+
+    bool deleteElement(T* pointer);
+
+    T* back() { return m_pointers.back(); }
+    const T* back() const { return m_pointers.back(); }
+    void clear();
+private:
+    std::vector<T*> m_pointers;
+};
+
+template<class T>
+SafePointerVector<T>::SafePointerVector(const SafePointerVector<T>& other)
+{
+    for (const_iterator it = other.begin(); it != other.end(); ++it)
+        m_pointers.push_back((*it)->clone());
+}
+
+template<class T>
+SafePointerVector<T>& SafePointerVector<T>::operator=(const SafePointerVector<T>& right)
+{
+    if (this ==& right) return *this;
+    clear();
+    for (const_iterator it = right.begin(); it != right.end(); ++it)
+        m_pointers.push_back((*it)->clone());
+    return *this;
+}
+
+template<class T>
+inline bool SafePointerVector<T>::deleteElement(T *pointer)
+{
+    iterator it = std::find(m_pointers.begin(), m_pointers.end(), pointer);
+    if (it == m_pointers.end())
+        return false;
+    m_pointers.erase(it);
+    delete pointer;
+    return true;
+}
+
+template<class T> void SafePointerVector<T>::clear()
+{
+    for (iterator it = begin(); it != end(); ++it)
+        delete (*it);
+    m_pointers.clear();
+}
+
+#endif // SAFEPOINTERVECTOR_H
diff --git a/Core/Tools/Utils.cpp b/Core/Tools/Utils.cpp
new file mode 100644
index 0000000..4ab294d
--- /dev/null
+++ b/Core/Tools/Utils.cpp
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/Utils.cpp
+//! @brief     Implements various stuff in namespace Utils.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Utils.h"
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <thread>
+#include <stdexcept>
+
+#ifdef DEBUG_FPE
+#ifdef Q_OS_MAC
+#endif
+#endif
+
+int Utils::System::getThreadHardwareConcurrency()
+{
+    return std::thread::hardware_concurrency();
+}
+
+std::string Utils::System::getCurrentDateAndTime()
+{
+    using boost::posix_time::ptime;
+    using boost::posix_time::second_clock;
+    using boost::gregorian::day_clock;
+
+    ptime todayUtc(day_clock::universal_day(), second_clock::universal_time().time_of_day());
+    return to_simple_string(todayUtc);
+}
+
+//! enables exception throw in the case of NaN, Inf
+void Utils::EnableFloatingPointExceptions()
+{
+#ifdef DEBUG_FPE
+#ifndef _WIN32
+    std::cout << "Utils::EnableFloatingPointExceptions() -> "
+        "Enabling floating point exception debugging\n";
+    feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
+//    feenableexcept(-1);
+#endif // _WIN32
+#else
+    std::cout << "Utils::EnableFloatingPointExceptions() -> "
+        "Can't enable floating point exceptions. Available in debug mode only.\n";
+#endif
+}
+
+std::pair<size_t, size_t> Utils::getShape(const std::vector<std::vector<double>>& data)
+{
+    size_t nrows = data.size();
+    size_t ncols(0);
+    if(nrows) ncols = data[0].size();
+    for(size_t row=0; row<nrows; row++)
+        if(data[row].size() != ncols)
+            throw std::runtime_error("Utils::getShape() -> Error. "
+                                     "Number of elements is different from row to row.");
+    return std::make_pair(nrows, ncols);
+}
diff --git a/Core/Tools/Utils.h b/Core/Tools/Utils.h
new file mode 100644
index 0000000..3fbe754
--- /dev/null
+++ b/Core/Tools/Utils.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/Utils.h
+//! @brief     Defines various stuff in namespace Utils.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef UTILS_H
+#define UTILS_H
+
+#include "WinDllMacros.h"
+#include "StringUtils.h"
+#include <string>
+#include <vector>
+
+namespace Utils {
+
+class BA_CORE_API_ System
+{
+public:
+    static int getThreadHardwareConcurrency();
+    static std::string getCurrentDateAndTime();
+};
+
+//! enables exception throw in the case of NaN, Inf
+BA_CORE_API_ void EnableFloatingPointExceptions();
+
+//! Returns shape nrows, ncols of 2D array (for numpy)
+BA_CORE_API_ std::pair<size_t, size_t> getShape(const std::vector<std::vector<double>>& data);
+
+} // namespace Utils
+
+#endif // UTILS_H
diff --git a/Core/Tools/fp_exception_glibc_extension.c b/Core/Tools/fp_exception_glibc_extension.c
new file mode 100644
index 0000000..b6c7573
--- /dev/null
+++ b/Core/Tools/fp_exception_glibc_extension.c
@@ -0,0 +1,334 @@
+/*   Title:  Floating-point exception handling example
+    Author:  David N. Williams
+      File:  fe-handlng-example.c
+   License:  Public Domain
+   Version:  0.5.0
+   Started:  21-Sep-09
+   Revised:  22-Sep-09
+   Revised:  30-Sep-09 (comment typo)
+   Revised:  18 Oct-12 (chnaged char* to const char * on line 228, by Richard Booth)
+
+This code is an example of alternate, nondefault handling of
+IEEE 754 floating-point exceptions in OS X and Linux, based on
+the GNU functions feenableexcept(), fedisableeexcept(), and
+fegetexcept() [in libm], plus POSIX sigaction().
+
+The GNU functions above are not implemented in OS X Leopard,
+gcc 4.x, but are present in Linux.  We implement them here for
+OS X, at least until the underlying mechanism is no longer
+supported by Apple.
+
+The mechanism is to use the POSIX functions fegetenv() and
+fesetenv(), which *are* present in OS X, to manipulate the ppc
+and intel floating-point control registers, after changing bits
+in fields corresponding to those registers in the fenv_t data
+type.
+
+Assembly language code to directly access the floating-point
+status and control registers for ppc and intel is also included.
+
+This example grew out of an update to legacy code for Apple
+ppc's.  The original legacy code is in Listing 7-1 in "PowerPC
+Numerics", 2004:
+
+http://lists.apple.com/archives/unix-porting/2003/May/msg00026.html
+
+Another version of the ppc legacy code is here:
+
+http://developer.apple.com/
+documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf
+
+Terry Lambert pointed out that our naive update of the legacy
+example to Mac OS X Leopard made egregious unsupported use of
+system context structures in the handler.  See his reply to
+
+http://lists.apple.com/archives/Darwin-dev/2009/Sep/msg00091.html
+
+The example in this file is more plain vanilla, and aims at
+alternate handling that does not return to the application, but
+rather aborts with a diagnostic message.
+
+To compile it under Mac OS X, execute:
+
+  cc -o fe-handling fe-handling-example.c
+
+To compile it under Linux, execute:
+
+  cc -DLINUX -lm -o fe-handling fe-handling-example.c
+*/
+
+#ifdef Q_OS_LINUX
+/* BEGIN quote
+http://graphviz.sourcearchive.com/documentation/2.16/gvrender__pango_8c-source.html
+*/
+/* _GNU_SOURCE is needed (supposedly) for the feenableexcept
+ * prototype to be defined in fenv.h on GNU systems.
+ * Presumably it will do no harm on other systems.
+ */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+/* We are not supposed to need __USE_GNU, but I can't see
+ * how to get the prototype for fedisableexcept from
+ * /usr/include/fenv.h without it.
+ */
+#ifndef __USE_GNU
+#define __USE_GNU
+#endif
+/* END quote */
+#endif // Q_OS_LINUX
+
+#include <fenv.h>
+
+#define DEFINED_PPC      (defined(__ppc__) || defined(__ppc64__))
+#define DEFINED_INTEL    (defined(__i386__) || defined(__x86_64__))
+
+#ifndef Q_OS_LINUX
+#if DEFINED_PPC
+
+#define FE_EXCEPT_SHIFT 22  // shift flags right to get masks
+#define FM_ALL_EXCEPT    FE_ALL_EXCEPT >> FE_EXCEPT_SHIFT
+
+/* GNU C Library:
+http://www.gnu.org/software/libc/manual/html_node/Control-Functions.html
+
+     - Function: int fegetexcept (int excepts)
+
+       The function returns a bitmask of all currently enabled
+       exceptions.  It returns -1 in case of failure.
+
+   The excepts argument appears in other functions in fenv.h,
+   and corresponds to the FE_xxx exception flag constants.  It
+   is unclear whether the bitmask is for the flags or the masks.
+   We return that for the flags, which corresponds to the
+   excepts argument in feenableexcept(excepts) and
+   fedisableexcept(excepts).  In GNU/Linux the argument is void,
+   and that's what we implement.  Linux "man fegetenv" appears
+   to suggest that it's the mask corresponding to bits in
+   excepts that is returned.
+*/
+int
+fegetexcept (void)
+{
+  static fenv_t fenv;
+
+  return ( fegetenv (&fenv) ? -1 :
+    (
+      ( fenv&  (FM_ALL_EXCEPT) ) << FE_EXCEPT_SHIFT )
+    );
+}
+
+int
+feenableexcept (unsigned int excepts)
+{
+  static fenv_t fenv;
+  unsigned int new_excepts = (excepts&  FE_ALL_EXCEPT) >> FE_EXCEPT_SHIFT,
+               old_excepts;  // all previous masks
+
+  if ( fegetenv (&fenv) ) return -1;
+  old_excepts = (fenv&  FM_ALL_EXCEPT) << FE_EXCEPT_SHIFT;
+
+  fenv = (fenv&  ~new_excepts) | new_excepts;
+  return ( fesetenv (&fenv) ? -1 : old_excepts );
+}
+
+int
+fedisableexcept (unsigned int excepts)
+{
+  static fenv_t fenv;
+  unsigned int still_on = ~( (excepts&  FE_ALL_EXCEPT) >> FE_EXCEPT_SHIFT ),
+               old_excepts;  // previous masks
+
+  if ( fegetenv (&fenv) ) return -1;
+  old_excepts = (fenv&  FM_ALL_EXCEPT) << FE_EXCEPT_SHIFT;
+
+  fenv& = still_on;
+  return ( fesetenv (&fenv) ? -1 : old_excepts );
+}
+
+#elif DEFINED_INTEL
+
+int
+fegetexcept (void)
+{
+  static fenv_t fenv;
+
+  return fegetenv (&fenv) ? -1 : (fenv.__control&  FE_ALL_EXCEPT);
+}
+
+int
+feenableexcept (unsigned int excepts)
+{
+  static fenv_t fenv;
+  unsigned int new_excepts = excepts&  FE_ALL_EXCEPT,
+               old_excepts;  // previous masks
+
+  if ( fegetenv (&fenv) ) return -1;
+  old_excepts = fenv.__control&  FE_ALL_EXCEPT;
+
+  // unmask
+  fenv.__control &= ~new_excepts;
+  fenv.__mxcsr   &= ~(new_excepts << 7);
+
+  return ( fesetenv (&fenv) ? -1 : old_excepts );
+}
+
+int
+fedisableexcept (unsigned int excepts)
+{
+  static fenv_t fenv;
+  unsigned int new_excepts = excepts&  FE_ALL_EXCEPT,
+               old_excepts;  // all previous masks
+
+  if ( fegetenv (&fenv) ) return -1;
+  old_excepts = fenv.__control&  FE_ALL_EXCEPT;
+
+  // mask
+  fenv.__control |= new_excepts;
+  fenv.__mxcsr   |= new_excepts << 7;
+
+  return ( fesetenv (&fenv) ? -1 : old_excepts );
+}
+
+#endif  // PPC or INTEL enabling
+#endif  // not Q_OS_LINUX
+
+#if DEFINED_PPC
+
+#define getfpscr(x)    asm volatile ("mffs %0" : "=f" (x));
+#define setfpscr(x)    asm volatile ("mtfsf 255,%0" : : "f" (x));
+
+typedef union {
+    struct {
+        unsigned long hi;
+        unsigned long lo;
+    } i;
+    double d;
+} hexdouble;
+
+#endif  // DEFINED_PPC
+
+#if DEFINED_INTEL
+
+// x87 fpu
+#define getx87cr(x)    asm ("fnstcw %0" : "=m" (x));
+#define setx87cr(x)    asm ("fldcw %0"  : "=m" (x));
+#define getx87sr(x)    asm ("fnstsw %0" : "=m" (x));
+
+// SIMD, gcc with Intel Core 2 Duo uses SSE2(4)
+#define getmxcsr(x)    asm ("stmxcsr %0" : "=m" (x));
+#define setmxcsr(x)    asm ("ldmxcsr %0" : "=m" (x));
+
+#endif  // DEFINED_INTEL
+
+#include <signal.h>
+#include <stdio.h>   // printf()
+#include <stdlib.h>  // abort(), exit()
+
+static const char *fe_code_name[] = {
+  "FPE_NOOP",
+  "FPE_FLTDIV", "FPE_FLTINV", "FPE_FLTOVF", "FPE_FLTUND",
+  "FPE_FLTRES", "FPE_FLTSUB", "FPE_INTDIV", "FPE_INTOVF"
+  "FPE_UNKNOWN"
+};
+
+/* SAMPLE ALTERNATE FP EXCEPTION HANDLER
+
+   The sample handler just reports information about the
+   exception that invoked it, and aborts.  It makes no attempt
+   to restore state and return to the application.
+
+   More sophisticated handling would have to confront at least
+   these issues:
+
+     * interface to the system context for restoring state
+     * imprecision of interrupts from hardware for the intel x87
+       fpu (but not the SIMD unit, nor the ppc)
+     * imprecision of interrupts from system software
+*/
+void
+fhdl ( int sig, siginfo_t *sip, ucontext_t *scp )
+{
+  (void)scp;
+  int fe_code = sip->si_code;
+  unsigned int excepts = fetestexcept (FE_ALL_EXCEPT);
+
+  switch (fe_code)
+  {
+#ifdef FPE_NOOP  // occurs in OS X
+    case FPE_NOOP:   fe_code = 0; break;
+#endif
+    case FPE_FLTDIV: fe_code = 1; break; // divideByZero
+    case FPE_FLTINV: fe_code = 2; break; // invalid
+    case FPE_FLTOVF: fe_code = 3; break; // overflow
+    case FPE_FLTUND: fe_code = 4; break; // underflow
+    case FPE_FLTRES: fe_code = 5; break; // inexact
+    case FPE_FLTSUB: fe_code = 6; break; // invalid
+    case FPE_INTDIV: fe_code = 7; break; // overflow
+    case FPE_INTOVF: fe_code = 8; break; // underflow
+            default: fe_code = 9;
+   }
+
+  if ( sig == SIGFPE )
+  {
+#if DEFINED_INTEL
+    unsigned short x87cr,x87sr;
+    unsigned int mxcsr;
+
+    getx87cr (x87cr);
+    getx87sr (x87sr);
+    getmxcsr (mxcsr);
+    printf ("X87CR:   0x%04X\n", x87cr);
+    printf ("X87SR:   0x%04X\n", x87sr);
+    printf ("MXCSR:   0x%08X\n", mxcsr);
+#endif
+
+#if DEFINED_PPC
+   hexdouble t;
+
+   getfpscr (t.d);
+   printf ("FPSCR:   0x%08X\n", t.i.lo);
+#endif
+
+    printf ("signal:  SIGFPE with code %s\n", fe_code_name[fe_code]);
+    printf ("invalid flag:    0x%04X\n", excepts&  FE_INVALID);
+    printf ("divByZero flag:  0x%04X\n", excepts&  FE_DIVBYZERO);
+  }
+  else printf ("Signal is not SIGFPE, it's %i.\n", sig);
+
+  abort();
+}
+
+
+/*
+int main (int argc, char **argv)
+{
+     double s;
+//     struct sigaction act;
+//
+//     //act.sa_sigaction = (void(*))fhdl;
+//     act.sa_sigaction = reinterpret_cast<void *>(fhdl);
+//     sigemptyset (&act.sa_mask);
+//     act.sa_flags = SA_SIGINFO;
+
+
+//  printf ("Old divByZero exception: 0x%08X\n", feenableexcept (FE_DIVBYZERO));
+//    printf ("Old invalid exception:   0x%08X\n", feenableexcept (FE_INVALID));
+//    printf ("New fp exception:        0x%08X\n", fegetexcept ());
+
+    feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
+
+    // set handler
+//     if (sigaction(SIGFPE, &act, (struct sigaction *)0) != 0)
+//     {
+//         perror("Yikes");
+//         exit(-1);
+//     }
+
+//  s = 1.0 / 0.0;  // FE_DIVBYZERO
+    s = 0.0 / 0.0;  // FE_INVALID
+    return 0;
+}
+
+*/
diff --git a/Core/Tools/fp_exception_glibc_extension.h b/Core/Tools/fp_exception_glibc_extension.h
new file mode 100644
index 0000000..51415d1
--- /dev/null
+++ b/Core/Tools/fp_exception_glibc_extension.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//                                                                         
+//! @file      Core/Tools/fp_exception_glibc_extension.h
+//! @brief     glibc floating point extension replacement for OS X.
+//
+//! License:   Public Domain
+//! @authors   David N. Williams
+//! @version   0.5.0
+//
+// ************************************************************************** //
+
+#ifndef FP_EXCEPTION_GLIBC_EXTENSION_H
+#define FP_EXCEPTION_GLIBC_EXTENSION_H
+
+//#include <fenv.h>
+#ifdef __cplusplus
+#endif
+
+  /* GNU C Library:
+     http://www.gnu.org/software/libc/manual/html_node/Control-Functions.html
+
+     - Function: int fegetexcept (int excepts)
+
+     The function returns a bitmask of all currently enabled
+     exceptions.  It returns -1 in case of failure.
+ 
+     The excepts argument appears in other functions in fenv.h,
+     and corresponds to the FE_xxx exception flag constants.  It
+     is unclear whether the bitmask is for the flags or the masks.
+     We return that for the flags, which corresponds to the
+     excepts argument in feenableexcept(excepts) and
+     fedisableexcept(excepts).  In GNU/Linux the argument is void,
+     and that's what we implement.  Linux "man fegetenv" appears
+     to suggest that it's the mask corresponding to bits in
+     excepts that is returned.
+  */
+  int fegetexcept (void) ;
+  int feenableexcept (unsigned int excepts) ;
+  int fedisableexcept (unsigned int excepts) ;
+
+  /* SAMPLE ALTERNATE FP EXCEPTION HANDLER
+
+     The sample handler just reports information about the
+     exception that invoked it, and aborts.  It makes no attempt
+     to restore state and return to the application.
+
+     More sophisticated handling would have to confront at least
+     these issues:
+
+     * interface to the system context for restoring state
+     * imprecision of interrupts from hardware for the intel x87
+     fpu (but not the SIMD unit, nor the ppc)
+     * imprecision of interrupts from system software
+     */
+  void fhdl ( int sig, siginfo_t *sip, ucontext_t *scp ) ;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // FP_EXCEPTION_GLIBC_EXTENSION_H
+
+
diff --git a/Core/Tools/w32pragma.h b/Core/Tools/w32pragma.h
new file mode 100644
index 0000000..d544e86
--- /dev/null
+++ b/Core/Tools/w32pragma.h
@@ -0,0 +1,101 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Tools/w32pragma.h
+//! @brief     Pragmas and defines for MSVC
+//
+// ************************************************************************** //
+
+/*************************************************************************
+ * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers.               *
+ * All rights reserved.                                                  *
+ *                                                                       *
+ * For the licensing terms see $ROOTSYS/LICENSE.                         *
+ * For the list of contributors see $ROOTSYS/README/CREDITS.             *
+ *************************************************************************/
+
+#ifndef ROOT_w32pragma
+#define ROOT_w32pragma
+
+/*************************************************************************
+ *                                                                       *
+ * w32pragma                                                             *
+ *                                                                       *
+ * Pragmas and defines for MSVC                                          *
+ *                                                                       *
+ *************************************************************************/
+
+#ifdef _WIN32
+
+/* Disable warning about truncated symboles (usually coming from stl) */
+#pragma warning (disable: 4786)
+/* Disable warning about inconsistent dll linkage (dllexport assumed) */
+#pragma warning (disable: 4273)
+/* "no suitable definition provided for explicit template instantiation"*/
+#pragma warning (disable: 4661)
+/* "deprecated, use ISO C++ conformant name" */
+#pragma warning (disable: 4996)
+/* "new behavior: elements default initialized" */
+#pragma warning (disable: 4351)
+/* local static not thread safe */
+#pragma warning (disable: 4640)
+/*forcing int to bool (performance warning) */
+#pragma warning (disable: 4800)
+/* truncation from double to float */
+#pragma warning (disable: 4305)
+/* signed unsigned mismatch */
+#pragma warning (disable: 4018)
+/* truncation of constant value */
+#pragma warning (disable: 4309)
+/* check op precedence for error */
+#pragma warning (disable: 4554)
+/* qualifier applied to reference type; ignored */
+#pragma warning (disable: 4181)
+/* /GS can not buffer overrun protect parameters and locals: function not optimized */
+#pragma warning (disable: 4748)
+/* function(): resolved overload was found by argument-dependent lookup */
+#pragma warning (disable: 4675)
+/* X needs to have dll-interface to be used by clients of class Y */
+#pragma warning (disable: 4251)
+/* decorated name length exceeded, name was truncated */
+#pragma warning (disable: 4503)
+
+/* function is hidden */
+#pragma warning (3: 4266)
+/* loop control variable is used outside the for-loop scope */
+#pragma warning (3: 4289)
+
+/* no override available for virtual member function from base */
+#pragma warning(disable: 4266)
+
+
+
+#define WIN32 1
+#define _WINDOWS 1
+#define WINVER 0x0400
+#define CRTAPI1 _cdecl 
+#define CRTAPI2 _cdecl
+#if defined(_M_IX86)
+#  define _X86_ 1
+#endif
+// #define _DLL  - used to be explicitly defined, 
+// but it's implicitely defined via /MD(d)
+#define G__REDIRECTIO 1
+#define G__SHAREDLIB 1
+#define G__UNIX 1
+#define G__ROOT 1
+#define G__WIN32 1
+
+#if (_MSC_VER >= 1310)
+#  define G__NEWSTDHEADER 1
+#endif
+
+#if (_MSC_VER >= 1400)
+#define _CRT_SECURE_NO_DEPRECATE 1
+#define _USE_ATTRIBUTES_FOR_SAL 0
+#endif
+
+#endif // _WIN32
+
+#endif // defined ROOT_w32pragma
diff --git a/Core/Vector/BasicVector3D.cpp b/Core/Vector/BasicVector3D.cpp
new file mode 100644
index 0000000..4a32066
--- /dev/null
+++ b/Core/Vector/BasicVector3D.cpp
@@ -0,0 +1,136 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/BasicVector3D.cpp
+//! @brief      Implements template class BasicVector3D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "BasicVector3D.h"
+#include "Exceptions.h"
+
+typedef std::complex<double> complex_t;
+
+// -----------------------------------------------------------------------------
+// Functions of this (with no further argument)
+// -----------------------------------------------------------------------------
+
+//! Returns complex conjugate vector
+template<>
+BasicVector3D<double> BasicVector3D<double>::conj() const
+{
+    return *this;
+}
+
+//! Returns complex conjugate vector
+template<>
+BasicVector3D<complex_t> BasicVector3D<complex_t >::conj() const
+{
+    return BasicVector3D<complex_t >(std::conj(v_[0]), std::conj(v_[1]), std::conj(v_[2]));
+}
+
+//! Returns azimuth angle.
+template<>
+double BasicVector3D<double>::phi() const
+{
+    return x() == 0.0 && y() == 0.0 ? 0.0 : std::atan2(-y(),x());
+}
+
+//! Returns polar angle.
+template<>
+double BasicVector3D<double>::theta() const
+{
+    return x() == 0.0 && y() == 0.0 && z() == 0.0 ? 0.0 : std::atan2(magxy(),z());
+}
+
+//! Returns cosine of polar angle.
+template<>
+double BasicVector3D<double>::cosTheta() const
+{
+    return mag() == 0 ? 1 : z()/mag();
+}
+
+//! Returns squared sine of polar angle.
+template<>
+double BasicVector3D<double>::sin2Theta() const
+{
+    return mag2() == 0 ? 0 : magxy2()/mag2();
+}
+
+//! Returns this, trivially converted to complex type.
+template<>
+BasicVector3D<complex_t> BasicVector3D<double>::complex() const
+{
+    return BasicVector3D<complex_t>( v_[0], v_[1], v_[2] );
+}
+
+//! Returns real parts.
+template<>
+BasicVector3D<double> BasicVector3D<complex_t>::real() const
+{
+    return BasicVector3D<double>( v_[0].real(), v_[1].real(), v_[2].real() );
+}
+
+template<>
+BasicVector3D<double> BasicVector3D<double>::real() const
+{
+    return *this;
+}
+
+//! Returns unit vector in direction of this. Throws for null vector.
+template<>
+BasicVector3D<double> BasicVector3D<double>::unit() const
+{
+    double len = mag();
+    if ( len==0.0 )
+        throw Exceptions::DivisionByZeroException("Cannot normalize zero vector");
+    return BasicVector3D<double>(x()/len, y()/len, z()/len);
+}
+
+template<>
+BasicVector3D<complex_t> BasicVector3D<complex_t>::unit() const
+{
+    double len = mag();
+    if ( len==0.0 )
+        throw Exceptions::DivisionByZeroException("Cannot normalize zero vector");
+    return BasicVector3D<complex_t>(x()/len, y()/len, z()/len);
+}
+
+// -----------------------------------------------------------------------------
+// Combine two vectors
+// -----------------------------------------------------------------------------
+
+//! Returns angle with respect to another vector.
+template<>
+double BasicVector3D<double>::angle(const BasicVector3D<double>& v) const
+{
+    double cosa = 0;
+    double ptot = mag()*v.mag();
+    if(ptot > 0) {
+        cosa = dot(v)/ptot;
+        if(cosa >  1) cosa =  1;
+        if(cosa < -1) cosa = -1;
+    }
+    return std::acos(cosa);
+}
+
+// -----------------------------------------------------------------------------
+// Quasi constructor
+// -----------------------------------------------------------------------------
+
+BasicVector3D<double> vecOfLambdaAlphaPhi(
+    const double _lambda, const double _alpha, const double _phi)
+{
+    double k = PI2/_lambda;
+    return BasicVector3D<double>(
+        k*std::cos(_alpha) * std::cos(_phi),
+        -k*std::cos(_alpha) * std::sin(_phi),
+        k*std::sin(_alpha) );
+}
diff --git a/Core/Vector/BasicVector3D.h b/Core/Vector/BasicVector3D.h
new file mode 100644
index 0000000..56f545f
--- /dev/null
+++ b/Core/Vector/BasicVector3D.h
@@ -0,0 +1,316 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/BasicVector3D.h
+//! @brief      Declares template class BasicVector3D.
+//!
+//! Forked from CLHEP/Geometry by E. Chernyaev <Evgueni.Tcherniaev at cern.ch>,
+//! then reworked beyond recongnition. Removed split of point and vector semantics.
+//! Transforms are relegated to a separate class Transform3D.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BASICVECTOR3D_H
+#define BASICVECTOR3D_H
+
+#include "WinDllMacros.h"
+#include <complex>
+
+static const double PI2 = 6.28318530717958647692528676655900577;
+
+//! Three-dimensional vector template, for use with integer, double, or complex components.
+//! @ingroup tools_internal
+
+template<class T>
+class BasicVector3D {
+private:
+    T v_[3];
+
+public:
+    // -------------------------------------------------------------------------
+    // Constructors and other set functions
+    // -------------------------------------------------------------------------
+
+    //! Default constructor.
+    BasicVector3D() { v_[0] = 0.0; v_[1] = 0.0; v_[2] = 0.0; }
+
+    //! Constructor from cartesian components.
+    BasicVector3D(const T x1, const T y1, const T z1) { v_[0] = x1; v_[1] = y1; v_[2] = z1; }
+
+    // -------------------------------------------------------------------------
+    // Component access
+    // -------------------------------------------------------------------------
+
+    //! Returns components by index.
+    T operator[](int i) const { return v_[i]; }
+
+    //! Sets components by index.
+    T& operator[](int i) { return v_[i]; }
+
+    //! Returns x-component in cartesian coordinate system.
+    T x() const { return v_[0]; }
+    //! Returns y-component in cartesian coordinate system.
+    T y() const { return v_[1]; }
+    //! Returns z-component in cartesian coordinate system.
+    T z() const { return v_[2]; }
+
+    //! Sets x-component in cartesian coordinate system.
+    void setX(const T&a) { v_[0] = a; }
+    //! Sets y-component in cartesian coordinate system.
+    void setY(const T&a) { v_[1] = a; }
+    //! Sets z-component in cartesian coordinate system.
+    void setZ(const T&a) { v_[2] = a; }
+
+    //! Sets components in cartesian coordinate system.
+    void setXYZ(const T&x1, const T&y1, const T&z1)
+    { v_[0] = x1; v_[1] = y1; v_[2] = z1; }
+
+    // -------------------------------------------------------------------------
+    // In-place operations
+    // -------------------------------------------------------------------------
+
+    //! Adds other vector to this, and returns result.
+    BasicVector3D<T>& operator+=(const BasicVector3D<T>& v) {
+        v_[0] += v.v_[0]; v_[1] += v.v_[1]; v_[2] += v.v_[2]; return *this; }
+
+    //! Subtracts other vector from this, and returns result.
+    BasicVector3D<T>& operator-=(const BasicVector3D<T>& v) {
+        v_[0] -= v.v_[0]; v_[1] -= v.v_[1]; v_[2] -= v.v_[2]; return *this; }
+
+
+    //! Multiplies this with a scalar, and returns result.
+#ifndef SWIG
+    template<class U>
+    auto operator*=(U a) -> BasicVector3D<decltype(this->x()*a)>& {
+        v_[0] *= a; v_[1] *= a; v_[2] *= a; return *this; }
+#endif // SWIG
+
+    //! Divides this by a scalar, and returns result.
+#ifndef SWIG
+    template<class U>
+    auto operator/=(U a) -> BasicVector3D<decltype(this->x()*a)>& {
+        v_[0] /= a; v_[1] /= a; v_[2] /= a; return *this; }
+#endif // SWIG
+
+    // -------------------------------------------------------------------------
+    // Functions of this (with no further argument)
+    // -------------------------------------------------------------------------
+
+    //! Returns complex conjugate vector
+    BasicVector3D<T> conj() const;
+
+    //! Returns squared magnitude squared of the vector.
+    double mag2() const { return std::norm(v_[0]) + std::norm(v_[1]) + std::norm(v_[2]); }
+
+    //! Returns magnitude of the vector.
+    double mag() const { return sqrt(mag2()); }
+
+    //! Returns squared distance from z axis.
+    double magxy2() const { return std::norm(v_[0]) + std::norm(v_[1]); }
+
+    //! Returns distance from z axis.
+    double magxy() const { return sqrt(magxy2()); }
+
+    //! Returns azimuth angle.
+    double phi() const;
+
+    //! Returns polar angle.
+    double theta() const;
+
+    //! Returns cosine of polar angle.
+    double cosTheta() const;
+
+    //! Returns squared sine of polar angle.
+    double sin2Theta() const;
+
+    //! Returns unit vector in direction of this. Throws for null vector.
+    BasicVector3D<T> unit() const;
+
+    //! Returns this, trivially converted to complex type.
+    BasicVector3D<std::complex<double>> complex() const;
+
+    //! Returns real parts.
+    BasicVector3D<double> real() const;
+
+    // -------------------------------------------------------------------------
+    // Functions of this and another vector
+    // -------------------------------------------------------------------------
+
+    //! Returns dot product of vectors (antilinear in the first [=self] argument).
+#ifndef SWIG
+    template<class U>
+    auto dot(const BasicVector3D<U>& v) const -> decltype(this->x()*v.x());
+#endif // SWIG
+
+    //! Returns cross product of vectors (linear in both arguments).
+#ifndef SWIG
+    template<class U>
+    auto cross(const BasicVector3D<U>& v) const -> BasicVector3D<decltype(this->x()*v.x())>;
+#endif // SWIG
+
+    //! Returns angle with respect to another vector.
+    double angle(const BasicVector3D<T>& v) const;
+
+    //! Returns projection of this onto other vector: (this*v)*v/|v|^2.
+    inline BasicVector3D<T> project(const BasicVector3D<T>& v) const {
+        return dot(v)*v/v.mag2(); }
+
+    // -------------------------------------------------------------------------
+    // Rotations
+    // -------------------------------------------------------------------------
+
+    //! Returns result of rotation around x-axis.
+    BasicVector3D<T> rotatedX(double a) const;
+    //! Returns result of rotation around y-axis.
+    BasicVector3D<T> rotatedY(double a) const;
+    //! Returns result of rotation around z-axis.
+    BasicVector3D<T> rotatedZ(double a) const {
+        return BasicVector3D<T>( cos(a)*x()+sin(a)*y(), -sin(a)*x()+cos(a)*y(), z() );
+    }
+    //! Returns result of rotation around the axis specified by another vector.
+    BasicVector3D<T> rotated(double a, const BasicVector3D<T>& v) const;
+};
+
+// =============================================================================
+// Non-member functions
+// =============================================================================
+
+//! Output to stream.
+//! @relates BasicVector3D
+template <class T>
+std::ostream&
+operator<<(std::ostream& os, const BasicVector3D<T>& a)
+{ return os << "(" << a.x() << "," << a.y() << "," << a.z() << ")"; }
+
+// -----------------------------------------------------------------------------
+// Unary operators
+// -----------------------------------------------------------------------------
+
+//! Unary plus.
+//! @relates BasicVector3D
+template <class T>
+inline BasicVector3D<T> operator+ (const BasicVector3D<T>& v)
+{ return v; }
+
+//! Unary minus.
+//! @relates BasicVector3D
+template <class T>
+inline BasicVector3D<T> operator- (const BasicVector3D<T>& v)
+{ return BasicVector3D<T>(-v.x(), -v.y(), -v.z()); }
+
+// -----------------------------------------------------------------------------
+// Binary operators
+// -----------------------------------------------------------------------------
+
+//! Addition of two vectors.
+//! @relates BasicVector3D
+template <class T>
+inline BasicVector3D<T> operator+(const BasicVector3D<T>& a, const BasicVector3D<T>& b)
+{ return BasicVector3D<T>(a.x()+b.x(), a.y()+b.y(), a.z()+b.z()); }
+
+//! Subtraction of two vectors.
+//! @relates BasicVector3D
+template <class T>
+inline BasicVector3D<T> operator-(const BasicVector3D<T>& a, const BasicVector3D<T>& b)
+{ return BasicVector3D<T>(a.x()-b.x(), a.y()-b.y(), a.z()-b.z()); }
+
+//! Multiplication vector by scalar.
+//! @relates BasicVector3D
+#ifndef SWIG
+template <class T, class U>
+inline auto operator* (const BasicVector3D<T>& v, const U a) -> BasicVector3D<decltype(v.x()*a)>
+{ return BasicVector3D<decltype(v.x()*a)>(v.x()*a, v.y()*a, v.z()*a); }
+#endif // SWIG
+
+//! Multiplication scalar by vector.
+//! @relates BasicVector3D
+#ifndef SWIG
+template <class T, class U>
+inline auto operator* (const U a, const BasicVector3D<T>& v) -> BasicVector3D<decltype(a*v.x())>
+{ return BasicVector3D<decltype(a*v.x())>(a*v.x(), a*v.y(), a*v.z()); }
+#endif // SWIG
+
+// vector*vector not supported
+//    (We do not provide the operator form a*b of the dot product:
+//     Though nice to write, and in some cases perfectly justified,
+//     in general it tends to make expressions more difficult to read.)
+
+//! Division vector by scalar.
+//! @relates BasicVector3D
+template <class T, class U>
+inline BasicVector3D<T> operator/ (const BasicVector3D<T>& v, U a)
+{ return BasicVector3D<T>(v.x()/a, v.y()/a, v.z()/a); }
+
+//! Comparison of two vectors for equality.
+//! @relates BasicVector3D
+template <class T>
+inline bool operator==(const BasicVector3D<T>& a, const BasicVector3D<T>& b)
+{ return (a.x()==b.x()&& a.y()==b.y()&& a.z()==b.z()); }
+
+//! Comparison of two vectors for inequality.
+//! @relates BasicVector3D
+template <class T>
+inline bool operator!=(const BasicVector3D<T>& a, const BasicVector3D<T>& b)
+{ return (a.x()!=b.x() || a.y()!=b.y() || a.z()!=b.z()); }
+
+// -----------------------------------------------------------------------------
+// Quasi constructor
+// -----------------------------------------------------------------------------
+
+//! Creates a vector<double> as a wavevector with given wavelength and angles.
+//! Specifically needed for grazing-incidence scattering.
+BA_CORE_API_ BasicVector3D<double> vecOfLambdaAlphaPhi(
+    const double _lambda, const double _alpha, const double _phi);
+
+
+// =============================================================================
+// ?? for API generation ??
+// =============================================================================
+
+//! Returns dot product of (complex) vectors (antilinear in the first [=self] argument).
+#ifndef SWIG
+template<class T> template<class U>
+inline auto BasicVector3D<T>::dot(const BasicVector3D<U> &v) const
+-> decltype(this->x()*v.x())
+{
+    BasicVector3D<T> left_star = this->conj();
+    return left_star.x()*v.x() + left_star.y()*v.y() + left_star.z()*v.z();
+}
+#endif // SWIG
+
+//! Returns cross product of (complex) vectors.
+#ifndef SWIG
+template<class T> template<class U>
+inline auto BasicVector3D<T>::cross(const BasicVector3D<U> &v) const
+-> BasicVector3D<decltype(this->x()*v.x())>
+{
+    return BasicVector3D<decltype(this->x()*v.x())>(y()*v.z()-v.y()*z(),
+                                                    z()*v.x()-v.z()*x(),
+                                                    x()*v.y()-v.x()*y());
+}
+#endif // SWIG
+
+template<> BA_CORE_API_ BasicVector3D<double> BasicVector3D<double>::conj() const;
+
+template<> BA_CORE_API_ BasicVector3D<std::complex<double>>
+    BasicVector3D<std::complex<double>>::conj() const;
+
+template<> BA_CORE_API_ double BasicVector3D<double>::phi() const;
+
+template<> BA_CORE_API_ double BasicVector3D<double>::theta() const;
+
+template<> BA_CORE_API_ BasicVector3D<std::complex<double>> BasicVector3D<double>::complex() const;
+
+template<> BA_CORE_API_ BasicVector3D<double> BasicVector3D<std::complex<double>>::real() const;
+
+template<> BA_CORE_API_ BasicVector3D<std::complex<double>>
+    BasicVector3D<std::complex<double>>::unit() const;
+
+#endif // BASICVECTOR3D_H
diff --git a/Core/Vector/EigenCore.h b/Core/Vector/EigenCore.h
new file mode 100644
index 0000000..7d0826f
--- /dev/null
+++ b/Core/Vector/EigenCore.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/EigenCore.h
+//! @brief     Include to deal with Eigen alignment centrally
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef EIGENCORE_H
+#define EIGENCORE_H
+
+// This include file is introduced to deal with Eigen alignment
+// see http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html
+
+#ifndef SWIG
+#ifndef _WIN32
+#endif
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#include <Eigen/Core>
+#pragma GCC diagnostic pop
+#endif
+
+#endif // EIGENCORE_H
diff --git a/Core/Vector/Transform3D.cpp b/Core/Vector/Transform3D.cpp
new file mode 100644
index 0000000..c8aaf0b
--- /dev/null
+++ b/Core/Vector/Transform3D.cpp
@@ -0,0 +1,220 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/Transform3D.cpp
+//! @brief      Implements template class Transform3D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Transform3D.h"
+#include <Eigen/LU>
+
+
+Transform3D::Transform3D()
+{
+    m_matrix.setIdentity();
+    m_inverse_matrix.setIdentity();
+}
+
+Transform3D::Transform3D(const Transform3D& other)
+: m_matrix(other.m_matrix)
+, m_inverse_matrix(other.m_inverse_matrix)
+{
+}
+
+Transform3D Transform3D::createIdentity()
+{
+    return Transform3D();
+}
+
+Transform3D Transform3D::createRotateX(double phi)
+{
+    double cosine = std::cos(phi);
+    double sine = std::sin(phi);
+    Eigen::Matrix3d matrix;
+    matrix.setIdentity();
+    matrix(1,1) = cosine;
+    matrix(1,2) = -sine;
+    matrix(2,1) = sine;
+    matrix(2,2) = cosine;
+    return Transform3D(matrix);
+}
+
+Transform3D Transform3D::createRotateY(double phi)
+{
+    double cosine = std::cos(phi);
+    double sine = std::sin(phi);
+    Eigen::Matrix3d matrix;
+    matrix.setIdentity();
+    matrix(0,0) = cosine;
+    matrix(0,2) = sine;
+    matrix(2,0) = -sine;
+    matrix(2,2) = cosine;
+    return Transform3D(matrix);
+}
+
+Transform3D Transform3D::createRotateZ(double phi)
+{
+    double cosine = std::cos(phi);
+    double sine = std::sin(phi);
+    Eigen::Matrix3d matrix;
+    matrix.setIdentity();
+    matrix(0,0) = cosine;
+    matrix(0,1) = -sine;
+    matrix(1,0) = sine;
+    matrix(1,1) = cosine;
+    return Transform3D(matrix);
+}
+
+Transform3D Transform3D::createRotateEuler(
+    double alpha, double beta, double gamma)
+{
+    Transform3D zrot = createRotateZ(alpha);
+    Transform3D xrot = createRotateX(beta);
+    Transform3D zrot2 = createRotateZ(gamma);
+    return zrot2*xrot*zrot;
+}
+
+void Transform3D::calculateEulerAngles(
+    double *p_alpha, double *p_beta, double *p_gamma) const
+{
+    // First check if second angle is zero or pi
+    if (m_matrix(2,0)==0.0 && m_matrix(2,1)==0.0) {
+        *p_alpha = std::atan2(-m_matrix(0,1), m_matrix(0,0));
+        *p_beta = std::acos(m_matrix(2,2));
+        *p_gamma = 0.0;
+    } else {
+        *p_alpha = std::atan2(m_matrix(2,0), m_matrix(2,1));
+        *p_beta = std::acos(m_matrix(2,2));
+        *p_gamma = std::atan2(m_matrix(0,2), -m_matrix(1,2));
+    }
+}
+
+Transform3D Transform3D::getInverse() const
+{
+    Transform3D result(m_inverse_matrix);
+    return result;
+}
+
+BasicVector3D<double> Transform3D::transformed(
+        const BasicVector3D<double>& v) const
+{
+    double x = m_matrix(0,0)*v.x() + m_matrix(0,1)*v.y() + m_matrix(0,2)*v.z();
+    double y = m_matrix(1,0)*v.x() + m_matrix(1,1)*v.y() + m_matrix(1,2)*v.z();
+    double z = m_matrix(2,0)*v.x() + m_matrix(2,1)*v.y() + m_matrix(2,2)*v.z();
+    return BasicVector3D<double>(x, y, z);
+}
+
+BasicVector3D<complex_t> Transform3D::transformed(
+        const BasicVector3D<complex_t>& v) const
+{
+    complex_t x = m_matrix(0,0)*v.x() + m_matrix(0,1)*v.y() + m_matrix(0,2)*v.z();
+    complex_t y = m_matrix(1,0)*v.x() + m_matrix(1,1)*v.y() + m_matrix(1,2)*v.z();
+    complex_t z = m_matrix(2,0)*v.x() + m_matrix(2,1)*v.y() + m_matrix(2,2)*v.z();
+    return BasicVector3D<complex_t>(x, y, z);
+}
+
+BasicVector3D<double> Transform3D::transformedInverse(
+        const BasicVector3D<double>& v) const
+{
+    double x = m_inverse_matrix(0,0)*v.x() + m_inverse_matrix(0,1)*v.y()
+            + m_inverse_matrix(0,2)*v.z();
+    double y = m_inverse_matrix(1,0)*v.x() + m_inverse_matrix(1,1)*v.y()
+            + m_inverse_matrix(1,2)*v.z();
+    double z = m_inverse_matrix(2,0)*v.x() + m_inverse_matrix(2,1)*v.y()
+            + m_inverse_matrix(2,2)*v.z();
+    return BasicVector3D<double>(x, y, z);
+}
+
+BasicVector3D<complex_t> Transform3D::transformedInverse(
+        const BasicVector3D<complex_t>& v) const
+{
+    complex_t x = m_inverse_matrix(0,0)*v.x() + m_inverse_matrix(0,1)*v.y()
+            + m_inverse_matrix(0,2)*v.z();
+    complex_t y = m_inverse_matrix(1,0)*v.x() + m_inverse_matrix(1,1)*v.y()
+            + m_inverse_matrix(1,2)*v.z();
+    complex_t z = m_inverse_matrix(2,0)*v.x() + m_inverse_matrix(2,1)*v.y()
+            + m_inverse_matrix(2,2)*v.z();
+    return BasicVector3D<complex_t>(x, y, z);
+}
+
+Transform3D* Transform3D::clone() const
+{
+    return new Transform3D(m_matrix);
+}
+
+Transform3D Transform3D::operator*(
+        const Transform3D& other) const
+{
+    Eigen::Matrix3d product_matrix = this->m_matrix * other.m_matrix;
+    return Transform3D(product_matrix);
+}
+
+bool Transform3D::operator==(const Transform3D &other) const
+{
+    return this->m_matrix == other.m_matrix;
+}
+
+Transform3D::ERotationType Transform3D::getRotationType()
+        const
+{
+    if (isXRotation()) return XAXIS;
+    if (isYRotation()) return YAXIS;
+    if (isZRotation()) return ZAXIS;
+    return EULER;
+}
+
+bool Transform3D::isIdentity() const
+{
+    double alpha, beta, gamma;
+    calculateEulerAngles(&alpha, &beta, &gamma);
+    return (alpha==0.0 && beta==0.0 && gamma==0.0);
+}
+
+void Transform3D::print(std::ostream& ostr) const
+{
+    ostr << "Transform3D: " << m_matrix;
+}
+
+Transform3D::Transform3D(const Eigen::Matrix3d& matrix)
+: m_matrix(matrix)
+{
+    m_inverse_matrix = m_matrix.inverse();
+}
+
+bool Transform3D::isXRotation() const
+{
+    if (m_matrix(0,0) != 1.0) return false;
+    if (m_matrix(0,1) != 0.0) return false;
+    if (m_matrix(0,2) != 0.0) return false;
+    if (m_matrix(1,0) != 0.0) return false;
+    if (m_matrix(2,0) != 0.0) return false;
+    return true;
+}
+
+bool Transform3D::isYRotation() const
+{
+    if (m_matrix(1,1) != 1.0) return false;
+    if (m_matrix(0,1) != 0.0) return false;
+    if (m_matrix(1,0) != 0.0) return false;
+    if (m_matrix(1,2) != 0.0) return false;
+    if (m_matrix(2,1) != 0.0) return false;
+    return true;
+}
+
+bool Transform3D::isZRotation() const
+{
+    if (m_matrix(2,2) != 1.0) return false;
+    if (m_matrix(0,2) != 0.0) return false;
+    if (m_matrix(1,2) != 0.0) return false;
+    if (m_matrix(2,0) != 0.0) return false;
+    if (m_matrix(2,1) != 0.0) return false;
+    return true;
+}
diff --git a/Core/Vector/Transform3D.h b/Core/Vector/Transform3D.h
new file mode 100644
index 0000000..f2408ac
--- /dev/null
+++ b/Core/Vector/Transform3D.h
@@ -0,0 +1,107 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/Transform3D.h
+//! @brief      Declares class Transform3D.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TRANSFORM3D_H
+#define TRANSFORM3D_H
+
+#include "BasicVector3D.h"
+#include "Complex.h"
+#include "EigenCore.h"
+
+//! @class Transform3D
+//! @ingroup tools_internal
+//! @brief Vector transformations in three dimensions.
+
+class BA_CORE_API_ Transform3D {
+public:
+    enum ERotationType { EULER, XAXIS, YAXIS, ZAXIS };
+
+    //! Constructs unit transformation
+    Transform3D();
+
+    //! Copy constructor
+    Transform3D(const Transform3D& other);
+
+    //! Destructor
+    ~Transform3D() {}
+
+    //! Clones the transformation
+    Transform3D *clone() const;
+
+    //! Creates identity transformation (default)
+    static Transform3D createIdentity();
+
+    //! Creates rotation around x-axis
+    static Transform3D createRotateX(double phi);
+
+    //! Creates rotation around y-axis
+    static Transform3D createRotateY(double phi);
+
+    //! Creates rotation around z-axis
+    static Transform3D createRotateZ(double phi);
+
+    //! Creates rotation defined by Euler angles
+    static Transform3D createRotateEuler(double alpha, double beta, double gamma);
+
+    //! Calculates the Euler angles corresponding to the rotation
+    void calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const;
+
+    //! Returns the inverse transformation.
+    Transform3D getInverse() const;
+
+    //! Return transformed vector _v_.
+    BasicVector3D<double> transformed(const BasicVector3D<double>& v) const;
+
+    //! Return transformed vector _v_.
+    BasicVector3D<complex_t>
+        transformed(const BasicVector3D<complex_t>& v) const;
+
+    //! Return transformed vector _v_.
+    BasicVector3D<double>
+        transformedInverse(const BasicVector3D<double>& v) const;
+
+    //! Return transformed vector _v_.
+    BasicVector3D<complex_t>
+        transformedInverse(const BasicVector3D<complex_t>& v) const;
+
+    //! Composes two transformations
+    Transform3D operator*(const Transform3D &other) const;
+
+    //! Provides equality operator
+    bool operator==(const Transform3D &other) const;
+
+    //! Retrieve the rotation type (general, around x, y or z-axis)
+    ERotationType getRotationType() const;
+
+    //! Determine if the transformation is trivial (identity)
+    bool isIdentity() const;
+
+    friend std::ostream& operator<<(std::ostream& ostr, const Transform3D& m)
+    { m.print(ostr); return ostr; }
+
+    void print(std::ostream& ostr) const;
+
+private:
+#ifndef SWIG
+    Transform3D(const Eigen::Matrix3d &matrix);
+    Eigen::Matrix3d m_matrix;
+    Eigen::Matrix3d m_inverse_matrix;
+#endif
+    bool isXRotation() const;
+    bool isYRotation() const;
+    bool isZRotation() const;
+};
+
+#endif // TRANSFORM3D_H
diff --git a/Core/Vector/Vectors3D.h b/Core/Vector/Vectors3D.h
new file mode 100644
index 0000000..1b6a0d7
--- /dev/null
+++ b/Core/Vector/Vectors3D.h
@@ -0,0 +1,25 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/Vectors3D.h
+//! @brief     Defines basic vectors in R^3 and C^3.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef VECTORS3D_H
+#define VECTORS3D_H
+
+#include "BasicVector3D.h"
+
+typedef BasicVector3D<int> ivector_t;
+typedef BasicVector3D<double> kvector_t;
+typedef BasicVector3D<std::complex<double>> cvector_t;
+
+#endif // VECTORS3D_H
diff --git a/Core/Vector/WavevectorInfo.h b/Core/Vector/WavevectorInfo.h
new file mode 100644
index 0000000..a9e6895
--- /dev/null
+++ b/Core/Vector/WavevectorInfo.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/Vector/WavevectorInfo.h
+//! @brief     Defines WavevectorInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef WAVEVECTORINFO_H
+#define WAVEVECTORINFO_H
+
+#include "Vectors3D.h"
+
+//! Holds all wavevector information relevant for calculating form factors.
+//! @ingroup formfactors_internal
+
+class BA_CORE_API_ WavevectorInfo
+{
+public:
+    WavevectorInfo() {}
+    WavevectorInfo(cvector_t ki, cvector_t kf, double wavelength)
+        : m_ki(ki), m_kf(kf), m_wavelength(wavelength) {}
+    WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)
+        : m_ki(ki.complex())
+        , m_kf(kf.complex())
+        , m_wavelength(wavelength) {}
+
+    cvector_t getKi() const { return m_ki; }
+    cvector_t getKf() const { return m_kf; }
+    cvector_t getQ() const { return m_ki - m_kf; }
+    double getWavelength() const { return m_wavelength; }
+
+private:
+    cvector_t m_ki;
+    cvector_t m_kf;
+    double m_wavelength;
+};
+
+#endif // WAVEVECTORINFO_H
diff --git a/Core/includeIncludes/FormFactors.h b/Core/includeIncludes/FormFactors.h
new file mode 100644
index 0000000..6e394dc
--- /dev/null
+++ b/Core/includeIncludes/FormFactors.h
@@ -0,0 +1,28 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/includeIncludes/FormFactors.h
+//! @brief     Includes form-factor related include files.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORS_H
+#define FORMFACTORS_H
+
+#include "FormFactorDecoratorDebyeWaller.h"
+#include "FormFactorDecoratorFactor.h"
+#include "FormFactorDecoratorMaterial.h"
+#include "FormFactorDecoratorPositionFactor.h"
+#include "FormFactorDecoratorRotation.h"
+#include "FormFactorWeighted.h"
+#include "HardParticles.h"
+#include "SoftParticles.h"
+
+#endif // FORMFACTORS_H
diff --git a/Core/includeIncludes/HardParticles.h b/Core/includeIncludes/HardParticles.h
new file mode 100644
index 0000000..587e58c
--- /dev/null
+++ b/Core/includeIncludes/HardParticles.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/includeIncludes/HardParticles.h
+//! @brief     Includes all particle-shape form-factor definitions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HARDPARTICLES_H
+#define HARDPARTICLES_H
+
+#include "FormFactorAnisoPyramid.h"
+#include "FormFactorBox.h"
+#include "FormFactorCone.h"
+#include "FormFactorCone6.h"
+#include "FormFactorCuboctahedron.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorDodecahedron.h"
+#include "FormFactorEllipsoidalCylinder.h"
+#include "FormFactorFullSphere.h"
+#include "FormFactorFullSpheroid.h"
+#include "FormFactorHemiEllipsoid.h"
+#include "FormFactorIcosahedron.h"
+#include "FormFactorLongBoxGauss.h"
+#include "FormFactorLongBoxLorentz.h"
+#include "FormFactorPrism3.h"
+#include "FormFactorPrism6.h"
+#include "FormFactorPyramid.h"
+#include "FormFactorRipple1.h"
+#include "FormFactorRipple2.h"
+#include "FormFactorTetrahedron.h"
+#include "FormFactorTrivial.h"
+#include "FormFactorTruncatedCube.h"
+#include "FormFactorTruncatedSphere.h"
+#include "FormFactorTruncatedSpheroid.h"
+
+#endif // HARDPARTICLES_H
diff --git a/Core/includeIncludes/InterferenceFunctions.h b/Core/includeIncludes/InterferenceFunctions.h
new file mode 100644
index 0000000..a01a20e
--- /dev/null
+++ b/Core/includeIncludes/InterferenceFunctions.h
@@ -0,0 +1,25 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/includeIncludes/InterferenceFunctions.h
+//! @brief     Includes all interference function definitions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTIONS_H
+#define INTERFERENCEFUNCTIONS_H
+
+#include "InterferenceFunction1DLattice.h"
+#include "InterferenceFunction2DLattice.h"
+#include "InterferenceFunction2DParaCrystal.h"
+#include "InterferenceFunctionNone.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+
+#endif // INTERFERENCEFUNCTIONS_H
diff --git a/Core/includeIncludes/SoftParticles.h b/Core/includeIncludes/SoftParticles.h
new file mode 100644
index 0000000..f92b41c
--- /dev/null
+++ b/Core/includeIncludes/SoftParticles.h
@@ -0,0 +1,26 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Core/includeIncludes/SoftParticles.h
+//! @brief     Includes all soft-particle form-factor definitions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SOFTPARTICLES_H
+#define SOFTPARTICLES_H
+
+#include "SoftParticles.h"
+#include "FormFactorGauss.h"
+#include "FormFactorLorentz.h"
+#include "FormFactorSphereGaussianRadius.h"
+#include "FormFactorSphereLogNormalRadius.h"
+#include "FormFactorSphereUniformRadius.h"
+
+#endif // SOFTPARTICLES_H
diff --git a/Doc/Doxygen/Doxyfile b/Doc/Doxygen/Doxyfile
new file mode 100644
index 0000000..51170bd
--- /dev/null
+++ b/Doc/Doxygen/Doxyfile
@@ -0,0 +1,2280 @@
+# Doxyfile 1.8.5
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "BornAgain"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 1.7.0
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Simulate and fit neutron and x-ray scattering at grazing incidence"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ../..
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
+# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
+# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
+# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
+# Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = NO
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = YES
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = layout.xml
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = ./ ../../Core ../../Fit
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.cpp *.h *.dox *.py
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */PythonAPI/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = NO
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html/std
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
+# defined cascading style sheet that is included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet file to the output directory. For an example
+# see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = YES
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = YES
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavours of web server based searching depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools. See
+# the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
+# replace them by respectively the title of the page, the current date and time,
+# only the current date, the version number of doxygen, the project name (see
+# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all refrences to function-like macros that are alone on a line, have an
+# all uppercase name, and do not end with a semicolon. Such function macros are
+# typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have an unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font n the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = NO
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = NO
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/Doc/Doxygen/Doxyfile.dirgraphs b/Doc/Doxygen/Doxyfile.dirgraphs
new file mode 100644
index 0000000..18d39d2
--- /dev/null
+++ b/Doc/Doxygen/Doxyfile.dirgraphs
@@ -0,0 +1,2276 @@
+# Doxyfile 1.8.5
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "BornAgain"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = "under development"
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Simulate and fit neutron and x-ray scattering at grazing incidence"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ../..
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
+# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
+# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
+# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
+# Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = NO
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = YES
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+ALIASES                += homepage="@par Homepage:\n"
+ALIASES                += license="@par License:\n"
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = YES
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = YES
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = YES
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = YES
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = YES
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = NO
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = NO
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = NO
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= NO
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = layout.xml
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = ./ ../../Core # ../../Fit ../../GUI #../../Tests
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.cpp *.h *.dox #*.py
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                = ../../Core/Basics ../../Core/Tools ../../Core/Vector # ../../Core/Binning ../../Core/Parametrization # ../../Core/Export ../../Core/Fitting ../../Core/StandardSamples
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */PythonAPI/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+# compare http://stackoverflow.com/questions/36739113
+
+EXCLUDE_SYMBOLS        = size_t
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = NO
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html/dirgraphs
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
+# defined cascading style sheet that is included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet file to the output directory. For an example
+# see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = YES
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavours of web server based searching depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools. See
+# the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
+# replace them by respectively the title of the page, the current date and time,
+# only the current date, the version number of doxygen, the project name (see
+# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all refrences to function-like macros that are alone on a line, have an
+# all uppercase name, and do not end with a semicolon. Such function macros are
+# typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have an unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            = /usr/bin/mscgen
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 7
+
+# When you want a differently looking font n the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = NO
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = YES
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = NO
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 10000
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/Doc/Doxygen/Doxyfile.in b/Doc/Doxygen/Doxyfile.in
new file mode 100644
index 0000000..944bd11
--- /dev/null
+++ b/Doc/Doxygen/Doxyfile.in
@@ -0,0 +1,2280 @@
+# Doxyfile 1.8.5
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "BornAgain"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = @BornAgain_VERSION_MAJOR at .@BornAgain_VERSION_MINOR at .@BornAgain_VERSION_PATCH@
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Simulate and fit neutron and x-ray scattering at grazing incidence"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ../..
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
+# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
+# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
+# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
+# Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = NO
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = YES
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = layout.xml
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = ./ ../../Core ../../Fit
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.cpp *.h *.dox *.py
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */PythonAPI/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = NO
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html/std
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
+# defined cascading style sheet that is included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet file to the output directory. For an example
+# see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = YES
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = YES
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavours of web server based searching depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools. See
+# the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
+# replace them by respectively the title of the page, the current date and time,
+# only the current date, the version number of doxygen, the project name (see
+# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all refrences to function-like macros that are alone on a line, have an
+# all uppercase name, and do not end with a semicolon. Such function macros are
+# typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have an unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font n the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = NO
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = NO
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/Doc/Doxygen/Doxyfile.long b/Doc/Doxygen/Doxyfile.long
new file mode 100644
index 0000000..7057e00
--- /dev/null
+++ b/Doc/Doxygen/Doxyfile.long
@@ -0,0 +1,2284 @@
+# Doxyfile 1.8.5
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "BornAgain"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 1.5.0
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Simulate and fit neutron and x-ray scattering at grazing incidence"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ../..
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
+# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
+# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
+# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
+# Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = NO
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = YES
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+ALIASES                += homepage="@par Homepage:\n"
+ALIASES                += license="@par License:\n"
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = YES
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = YES
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = layout.xml
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = ./ ../../Core ../../Fit #../../GUI ../../Tests
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.cpp *.h *.dox *.py
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */PythonAPI/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+# compare http://stackoverflow.com/questions/36739113
+
+EXCLUDE_SYMBOLS        = size_t
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = NO
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html/long
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
+# defined cascading style sheet that is included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet file to the output directory. For an example
+# see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = YES
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavours of web server based searching depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools. See
+# the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
+# replace them by respectively the title of the page, the current date and time,
+# only the current date, the version number of doxygen, the project name (see
+# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
+# validating XML parser to check the syntax of the XML files.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all refrences to function-like macros that are alone on a line, have an
+# all uppercase name, and do not end with a semicolon. Such function macros are
+# typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have an unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            = /usr/bin/mscgen
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 7
+
+# When you want a differently looking font n the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = YES
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 10000
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/Doc/Doxygen/defgroups.dox b/Doc/Doxygen/defgroups.dox
new file mode 100644
index 0000000..0a4f0a1
--- /dev/null
+++ b/Doc/Doxygen/defgroups.dox
@@ -0,0 +1,74 @@
+/*!
+
+\defgroup simulation Simulation description
+ at brief Classes to describe beam, detector and run the simulation.
+
+\defgroup mask Detector masks
+ at brief Classes to construct a two-dimensional mask.
+
+\defgroup samples Samples
+ at brief Classes to describe experimental sample.
+
+\defgroup materials Materials
+ at brief Classes to describe magnetic and non-magnetic materials.
+
+\defgroup formfactors Available formfactors
+ at brief Available form factors.
+ at image html Table_3Dshapes1.png "Schematic views of available form factors"
+
+\defgroup hardParticle Hard particles
+ at brief Three-dimenensional shapes, to model hard particles
+
+\defgroup softParticle Soft particles
+ at brief Particles with smooth scattering-length distributions.
+
+\defgroup legacyGrating Ripples
+ at brief Ripples, for modelling gratings
+
+\defgroup interference Interference functions
+ at brief Available interference functions.
+
+\defgroup fitting Fitting
+ at brief Classes to fit the data.
+
+\defgroup decayFT Fourier-space decay functions
+
+\defgroup distributionFT Fourier-space distribution functions
+
+\defgroup paramDistribution Parameter distributions
+
+\defgroup simulation_internal Simulation internals
+ at brief Simulation internal classes.
+
+\defgroup samples_internal Sample internals
+ at brief Sample internal classes.
+
+\defgroup materials_internal Material internals
+ at brief Materials internal classes.
+
+\defgroup formfactors_internal    Formfactor internals
+ at brief Form factor internal classes.
+
+\defgroup distribution_internal Distribution and decay function internals
+ at brief Distribution and decay function interface classes.
+
+\defgroup fitting_internal Fitting internals
+ at brief Fitting internal classes.
+
+\defgroup standard_samples
+ at brief Classes related to the functional testing using predefined scattering geometries.
+
+\defgroup tools Tools
+ at brief Different tools.
+
+\defgroup tools_internal
+ at brief Tools internal classes.
+
+\defgroup input_output Input and output
+ at brief Various routines for input/output.
+
+\defgroup input_output_internal
+ at brief Input/output internal classes.
+
+
+*/
diff --git a/Doc/Doxygen/layout.xml b/Doc/Doxygen/layout.xml
new file mode 100644
index 0000000..56a69c9
--- /dev/null
+++ b/Doc/Doxygen/layout.xml
@@ -0,0 +1,201 @@
+<doxygenlayout version="1.0">
+  <!-- Generated by doxygen 1.8.5 -->
+  <!-- Navigation index tabs for HTML output -->
+  <navindex>
+    <tab type="mainpage" visible="yes" title=""/>
+    <tab type="user" url="@ref userapi" title="User API"/>
+    <tab type="pages" visible="no" title="" intro=""/>
+    <tab type="modules" visible="no" title="" intro=""/>
+    <tab type="namespaces" visible="no" title="">
+      <tab type="namespacelist" visible="no" title="" intro=""/>
+      <tab type="namespacemembers" visible="no" title="" intro=""/>
+    </tab>
+    <tab type="classes" visible="yes" title="Full C++ API">
+      <tab type="classlist" visible="yes" title="" intro=""/>
+      <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
+      <tab type="hierarchy" visible="yes" title="" intro=""/>
+      <tab type="classmembers" visible="no" title="" intro=""/>
+    </tab>
+    <tab type="filelist" visible="yes" title="">
+    </tab>
+  </navindex>
+
+  <!-- Layout definition for a class page -->
+  <class>
+    <!-- briefdescription visible="yes"/ -->
+    <detaileddescription title="Description"/>
+    <includes visible="$SHOW_INCLUDE_FILES"/>
+    <inheritancegraph visible="$CLASS_GRAPH"/>
+    <collaborationgraph visible="$COLLABORATION_GRAPH"/>
+    <memberdecl>
+      <nestedclasses visible="yes" title=""/>
+      <publictypes title=""/>
+      <services title=""/>
+      <interfaces title=""/>
+      <publicslots title=""/>
+      <signals title=""/>
+      <publicmethods title=""/>
+      <publicstaticmethods title=""/>
+      <publicattributes title=""/>
+      <publicstaticattributes title=""/>
+      <protectedtypes title=""/>
+      <protectedslots title=""/>
+      <protectedmethods title=""/>
+      <protectedstaticmethods title=""/>
+      <protectedattributes title=""/>
+      <protectedstaticattributes title=""/>
+      <packagetypes title=""/>
+      <packagemethods title=""/>
+      <packagestaticmethods title=""/>
+      <packageattributes title=""/>
+      <packagestaticattributes title=""/>
+      <properties title=""/>
+      <events title=""/>
+      <privatetypes title=""/>
+      <privateslots title=""/>
+      <privatemethods title=""/>
+      <privatestaticmethods title=""/>
+      <privateattributes title=""/>
+      <privatestaticattributes title=""/>
+      <friends title=""/>
+      <related title="" subtitle=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <services title=""/>
+      <interfaces title=""/>
+      <constructors title=""/>
+      <functions title=""/>
+      <related title=""/>
+      <variables title=""/>
+      <properties title=""/>
+      <events title=""/>
+    </memberdef>
+    <allmemberslink visible="yes"/>
+    <usedfiles visible="$SHOW_USED_FILES"/>
+    <authorsection visible="yes"/>
+  </class>
+
+  <!-- Layout definition for a namespace page -->
+  <namespace>
+    <!-- briefdescription visible="yes"/ -->
+    <detaileddescription title="Description"/>
+    <memberdecl>
+      <nestednamespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
+      <classes visible="yes" title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </namespace>
+
+  <!-- Layout definition for a file page -->
+  <file>
+    <!-- briefdescription visible="yes"/ -->
+    <detaileddescription title="Description"/>
+    <includes visible="$SHOW_INCLUDE_FILES"/>
+    <includegraph visible="$INCLUDE_GRAPH"/>
+    <includedbygraph visible="$INCLUDED_BY_GRAPH"/>
+    <sourcelink visible="yes"/>
+    <memberdecl>
+      <classes visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <constantgroups visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <inlineclasses title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection/>
+  </file>
+
+  <!-- Layout definition for a group page -->
+  <group>
+    <!-- briefdescription visible="yes"/ -->
+    <detaileddescription title="Description"/>
+    <groupgraph visible="$GROUP_GRAPHS"/>
+    <memberdecl>
+      <nestedgroups visible="yes" title=""/>
+      <dirs visible="yes" title=""/>
+      <files visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <classes visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+      <membergroups visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <pagedocs/>
+      <inlineclasses title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </group>
+
+  <!-- Layout definition for a directory page -->
+  <directory>
+    <!-- briefdescription visible="yes"/ -->
+    <!-- detaileddescription title="Description"/ -->
+    <directorygraph visible="yes"/>
+    <memberdecl>
+      <dirs visible="yes"/>
+      <files visible="yes"/>
+    </memberdecl>
+    <memberdef>
+      <dirs title=""/>
+      <inlineclasses title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+  </directory>
+</doxygenlayout>
diff --git a/Doc/Doxygen/mainpage.dox b/Doc/Doxygen/mainpage.dox
new file mode 100644
index 0000000..ab16b5c
--- /dev/null
+++ b/Doc/Doxygen/mainpage.dox
@@ -0,0 +1,27 @@
+/*!
+\mainpage
+
+C++ API Reference of <a href="http://www.bornagainproject.org">BornAgain Project</a>, a software to simulate and fit grazing incidence small angle scattering.
+
+<ul>
+<li> Section <a href="userapi.html">User API</a> contains list of main classes to run the simulation.
+<li> Section <a href="annotated.html">Full C++ API</a> gives an access to the full list of classes belonging to the %BornAgain framework.
+<li> Section <a href="files.html">File List</a> lets you browse the C++ source code.
+
+</ul>
+
+
+<B> License: </B>
+<BR>
+GNU General Public License v3 or higher
+<BR>
+Copyright Forschungszentrum Jülich GmbH 2015-
+
+
+<B> Authors:  </B>
+<BR>
+Scientific Computing Group at MLZ Garching:
+<BR>
+J. Burle, C. Durniak, J. M. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+
+*/
diff --git a/Doc/Doxygen/userapi.dox b/Doc/Doxygen/userapi.dox
new file mode 100644
index 0000000..7e53736
--- /dev/null
+++ b/Doc/Doxygen/userapi.dox
@@ -0,0 +1,51 @@
+/*!
+\page userapi User API
+
+Here is a list of classes grouped in several categories to create the sample, describe scattering geometry, run the simulation and perform fitting.
+
+<ul>
+<li> \ref simulation "Simulation" <br>
+List of classes to describe beam, detector and run the simulation
+     <ul>
+     <li> \ref mask "Detector masks"
+     </ul>
+<li> \ref samples "Samples" <br>
+List of classes to describe scattering sample
+<li> \ref materials "Materials" <br>
+Classes to describe magnetic and non-magnetic materials
+<li> \ref formfactors "Form factors" <br>
+List of form factors available
+     <ul>
+     <li> \ref hardParticle "Hard particles"<br>Three-dimenensional particle shapes
+     <li> \ref softParticle "Soft particles"<br>Three-dimenensional particle models with smoothly decaying scattering-length distribution
+     <li> \ref legacyGrating "Ripples"<br>Ripples, for modelling gratings
+     </ul>
+<li> \ref distribution "Distribution, decay, and interference functions"<br>
+     <ul>
+     <li> \ref interference "Interference functions"
+     <li> \ref decayFT "Fourier-space decay functions"
+     <li> \ref distributionFT  "Fourier-space distribution functions"
+     <li> \ref paramDistribution "Parameter distributions"
+     </ul>
+<li> \ref tools "Tools" <br>
+Different tools mainly to deal with intensity data
+<li> \ref input_output "Input and output" <br>
+Various routines to write intensity data on disk and to import user data.
+<li> \ref fitting "Fitting" <br>
+Fitting routines
+</ul>
+<br>
+
+Here is a list of additional classes from internal API.
+<ul>
+<li> \ref simulation_internal "Simulation internals" <br>
+<li> \ref samples_internal "Samples internals" <br>
+<li> \ref materials_internal "Materials internals" <br>
+<li> \ref formfactors_internal "Form factors internals" <br>
+<li> \ref distribution_internal "Distribution function internals"
+<li> \ref tools_internal "Tools internals" <br>
+<li> \ref input_output_internal "Input/output internals" <br>
+<li> \ref fitting_internal "Fitting internals" <br>
+</ul>
+
+*/
diff --git a/Doc/man/CMakeLists.txt b/Doc/man/CMakeLists.txt
new file mode 100644
index 0000000..a13c40f
--- /dev/null
+++ b/Doc/man/CMakeLists.txt
@@ -0,0 +1,15 @@
+set(AUTO_DIR "${CMAKE_SOURCE_DIR}/auto/Doc/man")
+file(MAKE_DIRECTORY ${AUTO_DIR})
+
+add_custom_target(
+    man ALL
+    DEPENDS "${AUTO_DIR}/bornagain.1"
+)
+
+add_custom_command(
+    OUTPUT "${AUTO_DIR}/bornagain.1"
+    COMMAND ${POD2MAN} -s 1 -c "BornAgain manual" ${CMAKE_CURRENT_SOURCE_DIR}/bornagain.pod ${AUTO_DIR}/bornagain.1
+    DEPENDS bornagain.pod
+)
+
+install(FILES ${AUTO_DIR}/bornagain.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/man/man1)
diff --git a/Doc/man/bornagain.pod b/Doc/man/bornagain.pod
new file mode 100644
index 0000000..68dcca7
--- /dev/null
+++ b/Doc/man/bornagain.pod
@@ -0,0 +1,51 @@
+=pod
+
+=begin html
+
+<link rel="stylesheet" href="../podstyle.css" type="text/css" />
+
+=end html
+
+
+=head1 NAME
+
+BornAgain - simulate and fit small-angle scattering at grazing incidence.
+
+
+=head1 SYNOPSIS
+
+B<bornagain>
+
+
+=head1 DESCRIPTION
+
+BornAgain is a free and open-source software package to simulate and fit small-angle scattering at grazing incidence. It supports analysis of both X-ray (GISAXS) and neutron (GISANS) data.  Its name, BornAgain, indicates the central role of the distorted wave Born approximation  in the physical description of the scattering process.  The software provides a generic framework for modeling multilayer samples with smooth or rough interfaces and with various types of embedded nanoparticles.
+
+The command B<bornagain> launches a graphical user interface
+that allows to create sample models and to run simulations.
+
+For more information, see the User Manual, available as a PDF file at http://apps.jcns.fz-juelich.de/src/BornAgain/.
+
+=head1 RESOURCES
+
+Project web site: http://bornagainproject.org
+
+Download directory: http://apps.jcns.fz-juelich.de/src/BornAgain/
+
+=head1 BUGS
+
+Send bug reports to contact at bornagainproject.org,
+or fill the form at http://www.bornagainproject.org/contact.
+
+=head1 AUTHORS
+
+Celine Durniak, Marina Ganeva, Gennady Pospelov,
+Walter Van Herck, Joachim Wuttke
+
+
+=head1 COPYING
+
+Copyright (C) 2013- Forschungszentrum Juelich GmbH.
+
+Free use of this software is granted under the terms of the
+GNU General Public License (GPL), version 3 or higher.
diff --git a/Doc/pdf2html/README b/Doc/pdf2html/README
new file mode 100644
index 0000000..bf159c4
--- /dev/null
+++ b/Doc/pdf2html/README
@@ -0,0 +1,9 @@
+Convert the manual from PDF to HTML:
+
+Use patched pdf2htmlEX from https://github.com/jwuttke/pdf2htmlEX, branch mktree
+
+Run in this directory:
+pdf2htmlEX --zoom 1.4 --data-dir . /home/jwu/prj/ba/manual-arch/BornAgainManual-1.5.1.pdf
+
+Copy result:
+scp BornAgainManual-1.5.1.html apps at a:/www/apps/src/BornAgain/
\ No newline at end of file
diff --git a/Doc/pdf2html/base.min.css b/Doc/pdf2html/base.min.css
new file mode 100644
index 0000000..bfc8165
--- /dev/null
+++ b/Doc/pdf2html/base.min.css
@@ -0,0 +1,207 @@
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab filetype=css: */
+/*!
+ * Base CSS for pdf2htmlEX
+ * Copyright 2012,2013 Lu Wang <coolwanglu at gmail.com>
+ * https://github.com/coolwanglu/pdf2htmlEX/blob/master/share/LICENSE
+ */
+/* Part 1: Web Page Layout: Free to modify, except for a few of them which are required by pdf2htmlEX.js, see the comments */
+#sidebar { /* Sidebar */
+    position:absolute;
+    top:0;
+    left:0;
+    bottom:0;
+    width:300px;
+    padding:0;
+    margin:0px;
+    overflow:auto;
+}
+#page-container { /* PDF container */
+    position:absolute; /* required for calculating relative positions of pages in pdf2htmlEX.js */
+    top:0;
+    left:0px;
+    margin:0;
+    padding:0;
+    border:0; /* required for lazy page loading in pdf2htmlEX.js (page visibility test) */
+}
+ at media screen {
+    /* for sidebar */
+    #sidebar.opened + #page-container { left:300px; } /* same width as in #sidebar [-> above] */
+    #page-container {
+	/* `bottom' and `right' are required for lazy page loading in pdf2htmlEX.js (page visibility test)
+	 * alternatively you may set width and height
+	 */
+	bottom:0;
+	right:0;
+	overflow:auto;
+    }
+    .loading-indicator {
+	display:none;
+    }
+    .loading-indicator.active {
+	display:block;
+	position:absolute;
+	width:64px;
+	height:64px;
+	top:50%;
+	left:50%;
+	margin-top:-32px;
+	margin-left:-32px;
+    }
+    .loading-indicator img {
+	position:absolute;
+	top:0;
+	left:0;
+	bottom:0;
+	right:0;
+    }
+}
+ at media print {
+    @page { margin:0; }
+    html { margin:0; }
+    body {
+	margin:0;
+	-webkit-print-color-adjust:exact; /* enable printing background images for WebKit */
+    }
+    #sidebar { display:none; }
+    #page-container {
+	width:auto;
+	height:auto;
+	overflow:visible;
+	background-color:transparent;
+    }
+    .d { display:none; }
+}
+/* Part 2: Page Elements: Modify with caution
+ * The followings are base classes, some of which are meant to be override by PDF specific classes
+ * So do not increase the specificity (e.g. ".classname" -> "#page-container .classname")
+ */
+.pf { /* page */
+    position:relative;
+    background-color:white;
+    overflow: hidden;
+    margin:0;
+    border:0; /* required by pdf2htmlEX.js for page visibility test */
+}
+.pc { /* content of a page */
+    position:absolute;
+    border:0;
+    padding:0;
+    margin:0;
+    top:0;
+    left:0;
+    width:100%;
+    height:100%;
+    overflow:hidden;
+    display:block;
+    /* set transform-origin for scaling */
+    transform-origin:0% 0%;
+    -ms-transform-origin:0% 0%;
+    -webkit-transform-origin:0% 0%;
+}
+.pc.opened { /* used by pdf2htmlEX.js, to show/hide pages */
+    display:block;
+}
+.bf { /* images that occupies the whole page */
+    position:absolute;
+    border:0;
+    margin:0;
+    top:0;
+    bottom:0;
+    width:100%;
+    height:100%;
+    -ms-user-select:none;
+    -moz-user-select:none;
+    -webkit-user-select:none;
+    user-select:none;
+}
+.bi { /* images that cover only a part of the page */
+    position:absolute;
+    border:0;
+    margin:0;
+    -ms-user-select:none;
+    -moz-user-select:none;
+    -webkit-user-select:none;
+    user-select:none;
+}
+ at media print {
+    .pf {
+	margin:0;
+	box-shadow:none;
+	page-break-after:always;
+	page-break-inside:avoid;
+    }
+    @-moz-document url-prefix() {
+	/* fix page truncation for FireFox */
+	.pf {
+	    overflow:visible;
+	    border:1px solid #FFFFFF;
+	}
+	.pc {overflow:visible;}
+    }
+}
+.c { /* clip box */
+    position:absolute;
+    border:0;
+    padding:0;
+    margin:0;
+    overflow:hidden;
+    display:block;
+}
+.t { /* text line */
+    position:absolute;
+    white-space:pre;
+    font-size:1px;
+    transform-origin:0% 100%;
+    -ms-transform-origin:0% 100%;
+    -webkit-transform-origin:0% 100%;
+    unicode-bidi:bidi-override;/* For rtl languages, e.g. Hebrew, we don't want the default Unicode behaviour */
+    -moz-font-feature-settings:"liga" 0;/* We don't want Firefox to recognize ligatures */
+}
+.t:after { /* webkit #35443 */
+    content: '';
+}
+.t:before { /* Workaround Blink(up to 41)/Webkit bug of word-spacing with leading spaces (chromium #404444 and pdf2htmlEX #412) */
+    content: '';
+    display: inline-block;
+}
+.t span { /* text blocks within a line */
+    /* Blink(up to 41)/Webkit have bug with negative word-spacing and inline-block (pdf2htmlEX #416), so keep normal span inline. */
+    position:relative;
+    unicode-bidi:bidi-override; /* For rtl languages, e.g. Hebrew, we don't want the default Unicode behaviour */
+}
+._ { /* text shift */
+    /* Blink(up to 41)/Webkit have bug with inline element, continuous spaces and word-spacing. Workaround by inline-block. */
+    display: inline-block;
+    color: transparent;
+    z-index: -1;
+}
+/* selection background should not be opaque, for fallback mode */
+::selection{
+    background: rgba(127,255,255,0.4);
+}
+::-moz-selection{
+    background: rgba(127,255,255,0.4);
+}
+.pi { /* info for Javascript */
+    display:none;
+}
+.l { /* annotation links */
+}
+/* transparent color - WebKit */
+.d { /* css drawing */
+    position:absolute;
+    transform-origin:0% 100%;
+    -ms-transform-origin:0% 100%;
+    -webkit-transform-origin:0% 100%;
+}
+/* for the forms */
+.it {
+    border: none;
+    background-color: rgba(255, 255, 255, 0.0);
+}
+
+.ir:hover {
+    cursor: pointer;
+}
+
+/* Base CSS END */
diff --git a/Doc/pdf2html/bullet.gif b/Doc/pdf2html/bullet.gif
new file mode 100644
index 0000000..6305bae
Binary files /dev/null and b/Doc/pdf2html/bullet.gif differ
diff --git a/Doc/pdf2html/compatibility.min.js b/Doc/pdf2html/compatibility.min.js
new file mode 100644
index 0000000..e510098
--- /dev/null
+++ b/Doc/pdf2html/compatibility.min.js
@@ -0,0 +1,7 @@
+/*
+ Copyright 2012 Mozilla Foundation 
+ Copyright 2013 Lu Wang <coolwanglu at gmail.com>
+ Apachine License Version 2.0 
+*/
+(function(){function b(a,b,e,f){var c=(a.className||"").split(/\s+/g);""===c[0]&&c.shift();var d=c.indexOf(b);0>d&&e&&c.push(b);0<=d&&f&&c.splice(d,1);a.className=c.join(" ");return 0<=d}if(!("classList"in document.createElement("div"))){var e={add:function(a){b(this.element,a,!0,!1)},contains:function(a){return b(this.element,a,!1,!1)},remove:function(a){b(this.element,a,!1,!0)},toggle:function(a){b(this.element,a,!0,!0)}};Object.defineProperty(HTMLElement.prototype,"classList",{get:fun [...]
+var a=Object.create(e,{element:{value:this,writable:!1,enumerable:!0}});Object.defineProperty(this,"_classList",{value:a,writable:!1,enumerable:!1});return a},enumerable:!0})}})();
diff --git a/Doc/pdf2html/fancy.css b/Doc/pdf2html/fancy.css
new file mode 100644
index 0000000..d4caa5c
--- /dev/null
+++ b/Doc/pdf2html/fancy.css
@@ -0,0 +1,83 @@
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab filetype=css: */
+/*!
+ * Fancy styles for pdf2htmlEX
+ * Copyright 2012,2013 Lu Wang <coolwanglu at gmail.com>
+ * https://github.com/coolwanglu/pdf2htmlEX/blob/master/share/LICENSE
+ */
+ at keyframes fadein { from { opacity:0;} to { opacity:1;} }
+ at -webkit-keyframes fadein { from { opacity:0;} to { opacity:1;} }
+ at keyframes swing {
+    0%  { transform: rotate(0deg); }
+    10% { transform: rotate(0deg); }
+    90% { transform: rotate(720deg); }
+    100%{ transform: rotate(720deg); }
+}
+ at -webkit-keyframes swing {
+    0%  { -webkit-transform: rotate(0deg); }
+    10% { -webkit-transform: rotate(0deg); }
+    90% { -webkit-transform: rotate(720deg); }
+    100%{ -webkit-transform: rotate(720deg); }
+}
+ at media screen {
+    #sidebar {
+	background-color:#ddd;
+	font-family:Helvetica;
+	font-size:13px;
+	margin: 0em 0em;
+	padding-top: 2em;
+	padding-left: 2em;
+	/* modified from http://philbit.com/svgpatterns/#crossstripes */
+	#    background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0IiBoZWlnaHQ9IjQiPgo8cmVjdCB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjNDAzYzNmIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDBMNCA0Wk00IDBMMCA0WiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2U9IiMxZTI5MmQiPjwvcGF0aD4KPC9zdmc+");
+    }
+    #sidebar a,
+    #sidebar a:visited,
+    #sidebar a:hover,
+    #sidebar a:active {
+	line-height:1.2;
+	color:#000;
+	text-decoration:none;
+    }
+    #sidebar a:hover {
+	color:#00f;
+    }
+    #outline {
+	width:280px;
+	margin: 0px -20px;
+	/*text-overflow:ellipsis;
+	overflow:hidden;
+	display:block;
+	outline:0;
+	white-space:nowrap; */
+    }
+    #page-container {
+	background-color:#9e9e9e;
+	/* http://philbit.com/svgpatterns/#thinstripes */
+	background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSIjOWU5ZTllIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDVMNSAwWk02IDRMNCA2Wk0tMSAxTDEgLTFaIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMSI+PC9wYXRoPgo8L3N2Zz4=");
+	/*    -webkit-transition:left 500ms; */
+	/*    transition:left 500ms; */
+    }
+    .pf {
+	margin: 13px auto;
+	box-shadow: 1px 1px 3px 1px #333;
+	/* Needed by IE to make box-shadow works * https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow */
+	border-collapse: separate;
+    }
+    .pc.opened { /* used by pdf2htmlEX.js, to show/hide pages */
+	-webkit-animation: fadein 10ms;
+	animation: fadein 10ms;
+    }
+    .loading-indicator.active {
+	/*
+	 * use 0.01s instead of 0s,
+	 * since YUI Compressor will change 0s to 0,
+	 * which is not recognized by Firefox
+	 */
+	-webkit-animation: swing 0.15s ease-in-out 0.01s infinite alternate none;
+	animation: swing 0.15s ease-in-out 0.01s infinite alternate none;
+    }
+/*
+    .checked {
+	background: no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goQDSYgDiGofgAAAslJREFUOMvtlM9LFGEYx7/vvOPM6ywuuyPFihWFBUsdNnA6KLIh+QPx4KWExULdHQ/9A9EfUodYmATDYg/iRewQzklFWxcEBcGgEplDkDtI6sw4PzrIbrOuedBb9MALD7zv+3m+z4/3Bf7bZS2bzQIAcrmcMDExcTeXy10DAFVVAQDksgFUVZ1ljD3yfd+0LOuFpmnvVVW9GHhkZAQcxwkNDQ2FSCQyRMgJxnVdy7KstKZpn7nwha6urqqfTqfPBAJAuVymlNLXoigOhfd5nmeiKL5TVTV+lmIKwAOA7u5u6Lped2BsbOwjY6yf4zg [...]
+    } */
+}
+/* Fancy CSS END */
diff --git a/Doc/pdf2html/manifest b/Doc/pdf2html/manifest
new file mode 100644
index 0000000..8de95fb
--- /dev/null
+++ b/Doc/pdf2html/manifest
@@ -0,0 +1,140 @@
+# pdf2htmlEX manifest
+# Copyright (C) 2012,2013 Lu Wang <coolwanglu at gmail.com>
+#
+# Syntax
+# The first char of each line is the command
+# Empty lines are ignored
+#
+# # - comment
+# @ - embed or link to a file from data dir, depending on the values of --embed-*** options
+# $ - special use for pdf2htmlEX
+#
+# Special
+# If a line contains """ only, all text until next """ will be included
+# #TEST_IGNORE_BEGIN & #TEST_IGNORE_END are used for unittest
+
+#############
+# Declaration - Do not modify
+"""
+<!DOCTYPE html>
+<!-- Created by pdf2htmlEX (https://github.com/jwuttke/pdf2htmlex) -->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta charset="utf-8"/>
+<meta name="generator" content="pdf2htmlEX"/>
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
+<link rel="shortcut icon" href="../img/BornAgain_48x48.png" type="image/png" />
+<title>BornAgain Manual</title>
+"""
+
+#############
+# Styles
+# base CSS styles - Do not modify
+ at base.min.css
+
+# fancy CSS styles - Optional
+ at fancy.css
+
+# PDF specific CSS styles - Do not modify
+$css
+
+
+ at mktree.js
+ at mktree.css
+
+#############
+# UI stuffs, optional
+
+# compatibility.min.js, extracted from PDF.js
+# To support old browsers like IE9
+#TEST_IGNORE_BEGIN
+ at compatibility.min.js
+#TEST_IGNORE_END
+
+# entry point of pdf2htmlEX.Viewer
+# You can override default configuration by passing an object to the constructor of Viewer
+# Refer to DEFAULT_CONFIG in viewer.js for possible keys
+# E.g.
+# pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({
+#   'key_handler' : false
+# });
+#TEST_IGNORE_BEGIN
+ at pdf2htmlEX.js
+"""
+<script>
+try{
+  pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
+}catch(e){}
+</script>
+"""
+#TEST_IGNORE_END
+
+
+#############
+# Do not modify
+"""
+<title></title>
+</head>
+<body>
+"""
+
+#############
+# The sidebar
+# By default this is hidden, pdf2htmlEX.js will add the 'opened' class if it is not empty
+# You can add a class 'opened' here if you want it always opened or you don't use pdf2htmlEX.js
+# e.g.
+# <div id="sidebar" class="opened">
+
+#TEST_IGNORE_BEGIN
+"""
+<div id="sidebar">
+<a href="http://bornagainproject.org"> <img src="../img/BornAgain_64x64.png" alt="BornAgain" /><br/>
+<a href="http://bornagainproject.org">➔ <b>BornAgain home</b></a><br/>
+<a href="http://apps.jcns.fz-juelich.de/src/BornAgain">➔ <b>downloads</b></a><br/>
+<a href="http://bornagainproject.org/contact">➔ <b>contact</b></a><br/>
+<br/><br/>
+<b>User Manual online</b><br/>
+<div id="outline">
+"""
+$outline
+"""
+</div>
+</div>
+"""
+#TEST_IGNORE_END
+
+#############
+# The container of PDF pages
+# check base.css for an example and requirements of its CSS styles
+"""
+<div id="page-container">
+"""
+$pages
+"""
+</div>
+"""
+
+#############
+# The loading indicator
+# shown when loading a page via ajax
+# The default appearance should be invisible
+# The 'active' class will be added when it is used
+
+#TEST_IGNORE_BEGIN
+"""
+<div class="loading-indicator">
+"""
+ at pdf2htmlEX-64x64.png
+"""
+</div>
+"""
+#TEST_IGNORE_END
+
+#############
+# Do not modify
+"""
+</body>
+</html>
+"""
+
+# MANIFEST END
diff --git a/Doc/pdf2html/minus.gif b/Doc/pdf2html/minus.gif
new file mode 100644
index 0000000..154e45a
Binary files /dev/null and b/Doc/pdf2html/minus.gif differ
diff --git a/Doc/pdf2html/mktree.css b/Doc/pdf2html/mktree.css
new file mode 100644
index 0000000..f4374e3
--- /dev/null
+++ b/Doc/pdf2html/mktree.css
@@ -0,0 +1,23 @@
+/* Put this inside a @media qualifier so Netscape 4 ignores it */
+ at media screen {
+	/* Turn off list bullets */
+	ul.mktree  li { list-style: none; }
+	/* Control how "spaced out" the tree is */
+	ul.mktree, ul.mktree ul , ul.mktree li { margin-left:10px; padding:0px; text-indent: -20px}
+	/* Provide space for our own "bullet" inside the LI */
+	ul.mktree  li           .bullet { padding-left: 15px; }
+	/* Show "bullets" in the links, depending on the class of the LI that the link's in */
+	ul.mktree  li.liOpen    .bullet { cursor: pointer; background: url(../img/minus.gif)  center left no-repeat; }
+	ul.mktree  li.liClosed  .bullet { cursor: pointer; background: url(../img/plus.gif)   center left no-repeat; }
+	ul.mktree  li.liBullet  .bullet { cursor: default; background: url(../img/bullet.gif) center left no-repeat; }
+	/* Sublists are visible or not based on class of parent LI */
+	ul.mktree  li.liOpen    ul { display: block; }
+	ul.mktree  li.liClosed  ul { display: none; }
+
+	/* Format menu items differently depending on what level of the tree they are in */
+	/* Uncomment this if you want your fonts to decrease in size the deeper they are in the tree */
+/*
+	ul.mktree  li ul li { font-size: 90% }
+*/
+
+}
diff --git a/Doc/pdf2html/mktree.js b/Doc/pdf2html/mktree.js
new file mode 100644
index 0000000..857cd64
--- /dev/null
+++ b/Doc/pdf2html/mktree.js
@@ -0,0 +1,168 @@
+/**
+ * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
+ * 
+ * Dual licensed under the MIT and GPL licenses. 
+ * This basically means you can use this code however you want for
+ * free, but don't claim to have written it yourself!
+ * Donations always accepted: http://www.JavascriptToolbox.com/donate/
+ * 
+ * Please do not link to the .js files on javascripttoolbox.com from
+ * your site. Copy the files locally to your server instead.
+ * 
+ */
+/*
+This code is inspired by and extended from Stuart Langridge's aqlist code:
+		http://www.kryogenix.org/code/browser/aqlists/
+		Stuart Langridge, November 2002
+		sil at kryogenix.org
+		Inspired by Aaron's labels.js (http://youngpup.net/demos/labels/) 
+		and Dave Lindquist's menuDropDown.js (http://www.gazingus.org/dhtml/?id=109)
+*/
+
+// Automatically attach a listener to the window onload, to convert the trees
+addEvent(window,"load",convertTrees);
+
+// Utility function to add an event listener
+function addEvent(o,e,f){
+	if (o.addEventListener){ o.addEventListener(e,f,false); return true; }
+	else if (o.attachEvent){ return o.attachEvent("on"+e,f); }
+	else { return false; }
+}
+
+// utility function to set a global variable if it is not already set
+function setDefault(name,val) {
+	if (typeof(window[name])=="undefined" || window[name]==null) {
+		window[name]=val;
+	}
+}
+
+// Full expands a tree with a given ID
+function expandTree(treeId) {
+	var ul = document.getElementById(treeId);
+	if (ul == null) { return false; }
+	expandCollapseList(ul,nodeOpenClass);
+}
+
+// Fully collapses a tree with a given ID
+function collapseTree(treeId) {
+	var ul = document.getElementById(treeId);
+	if (ul == null) { return false; }
+	expandCollapseList(ul,nodeClosedClass);
+}
+
+// Expands enough nodes to expose an LI with a given ID
+function expandToItem(treeId,itemId) {
+	var ul = document.getElementById(treeId);
+	if (ul == null) { return false; }
+	var ret = expandCollapseList(ul,nodeOpenClass,itemId);
+	if (ret) {
+		var o = document.getElementById(itemId);
+		if (o.scrollIntoView) {
+			o.scrollIntoView(false);
+		}
+	}
+}
+
+// Performs 3 functions:
+// a) Expand all nodes
+// b) Collapse all nodes
+// c) Expand all nodes to reach a certain ID
+function expandCollapseList(ul,cName,itemId) {
+	if (!ul.childNodes || ul.childNodes.length==0) { return false; }
+	// Iterate LIs
+	for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
+		var item = ul.childNodes[itemi];
+		if (itemId!=null && item.id==itemId) { return true; }
+		if (item.nodeName == "LI") {
+			// Iterate things in this LI
+			var subLists = false;
+			for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
+				var sitem = item.childNodes[sitemi];
+				if (sitem.nodeName=="UL") {
+					subLists = true;
+					var ret = expandCollapseList(sitem,cName,itemId);
+					if (itemId!=null && ret) {
+						item.className=cName;
+						return true;
+					}
+				}
+			}
+			if (subLists && itemId==null) {
+				item.className = cName;
+			}
+		}
+	}
+}
+
+// Search the document for UL elements with the correct CLASS name, then process them
+function convertTrees() {
+	setDefault("treeClass","mktree");
+	setDefault("nodeClosedClass","liClosed");
+	setDefault("nodeOpenClass","liOpen");
+	setDefault("nodeBulletClass","liBullet");
+	setDefault("nodeLinkClass","bullet");
+	setDefault("preProcessTrees",true);
+	if (preProcessTrees) {
+		if (!document.createElement) { return; } // Without createElement, we can't do anything
+		var uls = document.getElementsByTagName("ul");
+		if (uls==null) { return; }
+		var uls_length = uls.length;
+		for (var uli=0;uli<uls_length;uli++) {
+			var ul=uls[uli];
+			if (ul.nodeName=="UL" && ul.className==treeClass) {
+				processList(ul);
+			}
+		}
+	}
+}
+
+function treeNodeOnclick() {
+	this.parentNode.className = (this.parentNode.className==nodeOpenClass) ? nodeClosedClass : nodeOpenClass;
+	return false;
+}
+function retFalse() {
+	return false;
+}
+// Process a UL tag and all its children, to convert to a tree
+function processList(ul) {
+	if (!ul.childNodes || ul.childNodes.length==0) { return; }
+	// Iterate LIs
+	var childNodesLength = ul.childNodes.length;
+	for (var itemi=0;itemi<childNodesLength;itemi++) {
+		var item = ul.childNodes[itemi];
+		if (item.nodeName == "LI") {
+			// Iterate things in this LI
+			var subLists = false;
+			var itemChildNodesLength = item.childNodes.length;
+			for (var sitemi=0;sitemi<itemChildNodesLength;sitemi++) {
+				var sitem = item.childNodes[sitemi];
+				if (sitem.nodeName=="UL") {
+					subLists = true;
+					processList(sitem);
+				}
+			}
+			var s= document.createElement("SPAN");
+			var t= '\u00A0'; //  
+			s.className = nodeLinkClass;
+			if (subLists) {
+				// This LI has UL's in it, so it's a +/- node
+				if (item.className==null || item.className=="") {
+					item.className = nodeClosedClass;
+				}
+				// If it's just text, make the text work as the link also
+				if (item.firstChild.nodeName=="#text") {
+					t = t+item.firstChild.nodeValue;
+					item.removeChild(item.firstChild);
+				}
+				s.onclick = treeNodeOnclick;
+			}
+			else {
+				// No sublists, so it's just a bullet node
+				item.className = nodeBulletClass;
+				s.onclick = retFalse;
+			}
+			s.appendChild(document.createTextNode(t));
+			item.insertBefore(s,item.firstChild);
+		}
+	}
+}
diff --git a/Doc/pdf2html/pdf2htmlEX-64x64.png b/Doc/pdf2html/pdf2htmlEX-64x64.png
new file mode 100644
index 0000000..e3276fa
Binary files /dev/null and b/Doc/pdf2html/pdf2htmlEX-64x64.png differ
diff --git a/Doc/pdf2html/pdf2htmlEX.js b/Doc/pdf2html/pdf2htmlEX.js
new file mode 100644
index 0000000..decc612
--- /dev/null
+++ b/Doc/pdf2html/pdf2htmlEX.js
@@ -0,0 +1,970 @@
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab filetype=javascript : */
+/**
+ * @license pdf2htmlEX.js: Core UI functions for pdf2htmlEX
+ * Copyright 2012,2013 Lu Wang <coolwanglu at gmail.com> and other contributors
+ * https://github.com/coolwanglu/pdf2htmlEX/blob/master/share/LICENSE
+ */
+
+/*
+ * Attention:
+ * This files is to be optimized by closure-compiler,
+ * so pay attention to the forms of property names:
+ *
+ * string/bracket form is safe, won't be optimized:
+ * var obj={ 'a':'b' }; obj['a'] = 'b';
+ * name/dot form will be optimized, the name is likely to be modified:
+ * var obj={ a:'b' }; obj.a = 'b';
+ *
+ * Either form can be used for internal objects,
+ * but must be consistent for each one respectively.
+ *
+ * string/bracket form must be used for external objects
+ * e.g. DEFAULT_CONFIG, object stored in page-data
+ * property names are part of the `protocol` in these cases.
+ *
+ */
+
+'use strict';
+
+var pdf2htmlEX = window['pdf2htmlEX'] = window['pdf2htmlEX'] || {};
+
+/**
+ * @const
+ * @struct
+ */
+var CSS_CLASS_NAMES = {
+  page_frame       : 'pf',
+  page_content_box : 'pc',
+  page_data        : 'pi',
+  background_image : 'bi',
+  link             : 'l',
+  input_radio      : 'ir',
+  __dummy__        : 'no comma'
+};
+
+/**
+ * configurations of Viewer
+ * @const
+ * @dict
+ */
+var DEFAULT_CONFIG = {
+  // id of the element to put the pages in
+  'container_id' : 'page-container',
+  // id of the element for sidebar (to open and close)
+  'sidebar_id' : 'sidebar',
+  // id of the element for outline
+  'outline_id' : 'outline',
+  // class for the loading indicator
+  'loading_indicator_cls' : 'loading-indicator',
+  // How many page shall we preload that are below the last visible page
+  'preload_pages' : 3,
+  // how many ms should we wait before actually rendering the pages and after a scroll event
+  'render_timeout' : 10,
+  // zoom ratio step for each zoom in/out event
+  'scale_step' : 0.9,
+  // register global key handler, allowing navigation by keyboard
+  'key_handler' : true,
+  // register hashchange handler, navigate to the location specified by the hash
+  'hashchange_handler' : true,
+  // register view history handler, allowing going back to the previous location
+  'view_history_handler' : true,
+
+  '__dummy__'        : 'no comma'
+};
+
+/** @const */
+var EPS = 1e-6;
+
+/************************************/
+/* utility function */
+/**
+ * @param{Array.<number>} ctm
+ */
+function invert(ctm) {
+  var det = ctm[0] * ctm[3] - ctm[1] * ctm[2];
+  return [ ctm[3] / det
+          ,-ctm[1] / det
+          ,-ctm[2] / det
+          ,ctm[0] / det
+          ,(ctm[2] * ctm[5] - ctm[3] * ctm[4]) / det
+          ,(ctm[1] * ctm[4] - ctm[0] * ctm[5]) / det
+        ];
+};
+/**
+ * @param{Array.<number>} ctm
+ * @param{Array.<number>} pos
+ */
+function transform(ctm, pos) {
+  return [ctm[0] * pos[0] + ctm[2] * pos[1] + ctm[4]
+         ,ctm[1] * pos[0] + ctm[3] * pos[1] + ctm[5]];
+};
+
+/**
+ * @param{Element} ele
+ */
+function get_page_number(ele) {
+  return parseInt(ele.getAttribute('data-page-no'), 16);
+};
+
+/**
+ * @param{NodeList} eles
+ */
+function disable_dragstart(eles) {
+  for (var i = 0, l = eles.length; i < l; ++i) {
+    eles[i].addEventListener('dragstart', function() {
+      return false;
+    }, false);
+  }
+};
+
+/**
+ * @param{...Object} var_args
+ */
+function clone_and_extend_objs(var_args) {
+  var result_obj = {};
+  for (var i = 0, l = arguments.length; i < l; ++i) {
+    var cur_obj = arguments[i];
+    for (var k in cur_obj) {
+      if (cur_obj.hasOwnProperty(k)) {
+        result_obj[k] = cur_obj[k];
+      }
+    }
+  }
+  return result_obj;
+};
+
+/**
+ * @constructor
+ * @param{Element} page The element for the page
+ */
+function Page(page) {
+  if (!page) return;
+
+  this.loaded = false;
+  this.shown = false;
+  this.page = page; // page frame element
+
+  this.num = get_page_number(page);
+
+  // page size
+  // Need to make rescale work when page_content_box is not loaded, yet
+  this.original_height = page.clientHeight;
+  this.original_width = page.clientWidth;
+
+  // content box
+  var content_box = page.getElementsByClassName(CSS_CLASS_NAMES.page_content_box)[0];
+
+  // if page is loaded
+  if (content_box) {
+    this.content_box = content_box;
+    /*
+     * scale ratios
+     *
+     * original_scale : the first one
+     * cur_scale : currently using
+     */
+    this.original_scale = this.cur_scale = this.original_height / content_box.clientHeight;
+    this.page_data = JSON.parse(page.getElementsByClassName(CSS_CLASS_NAMES.page_data)[0].getAttribute('data-data'));
+
+    this.ctm = this.page_data['ctm'];
+    this.ictm = invert(this.ctm);
+
+    this.loaded = true;
+  }
+};
+Page.prototype = {
+  /* hide & show are for contents, the page frame is still there */
+  hide : function(){
+    if (this.loaded && this.shown) {
+      this.content_box.classList.remove('opened');
+      this.shown = false;
+    }
+  },
+  show : function(){
+    if (this.loaded && !this.shown) {
+      this.content_box.classList.add('opened');
+      this.shown = true;
+    }
+  },
+  /**
+   * @param{number} ratio
+   */
+  rescale : function(ratio) {
+    if (ratio === 0) {
+      // reset scale
+      this.cur_scale = this.original_scale;
+    } else {
+      this.cur_scale = ratio;
+    }
+
+    // scale the content box
+    if (this.loaded) {
+      var cbs = this.content_box.style;
+      cbs.msTransform = cbs.webkitTransform = cbs.transform = 'scale('+this.cur_scale.toFixed(3)+')';
+    }
+
+    // stretch the page frame to hold the place
+    {
+      var ps = this.page.style;
+      ps.height = (this.original_height * this.cur_scale) + 'px';
+      ps.width = (this.original_width * this.cur_scale) + 'px';
+    }
+  },
+  /*
+   * return the coordinate of the top-left corner of container
+   * in our coordinate system
+   * assuming that p.parentNode === p.offsetParent
+   */
+  view_position : function () {
+    var p = this.page;
+    var c = p.parentNode;
+    return [c.scrollLeft - p.offsetLeft - p.clientLeft
+           ,c.scrollTop - p.offsetTop - p.clientTop];
+  },
+  height : function () {
+    return this.page.clientHeight;
+  },
+  width : function () {
+    return this.page.clientWidth;
+  }
+};
+
+/**
+ * @constructor
+ * @param{Object=} config
+ */
+function Viewer(config) {
+  this.config = clone_and_extend_objs(DEFAULT_CONFIG, (arguments.length > 0 ? config : {}));
+  this.pages_loading = [];
+  this.init_before_loading_content();
+
+  var self = this;
+  document.addEventListener('DOMContentLoaded', function(){
+    self.init_after_loading_content();
+  }, false);
+};
+
+Viewer.prototype = {
+  scale : 1,
+  /*
+   * index of the active page (the one with largest visible area)
+   * which estimates the page currently being viewed
+   */
+  cur_page_idx : 0,
+
+  /*
+   * index of the first visible page
+   * used when determining current view
+   */
+  first_page_idx : 0,
+
+  init_before_loading_content : function() {
+    /* hide all pages before loading, will reveal only visible ones later */
+    this.pre_hide_pages();
+  },
+
+  initialize_radio_button : function() {
+    var elements = document.getElementsByClassName(CSS_CLASS_NAMES.input_radio);
+
+    for(var i = 0; i < elements.length; i++) {
+      var r = elements[i];
+
+      r.addEventListener('click', function() {
+        this.classList.toggle("checked");
+      });
+    }
+  },
+
+  init_after_loading_content : function() {
+    this.sidebar = document.getElementById(this.config['sidebar_id']);
+    this.outline = document.getElementById(this.config['outline_id']);
+    this.container = document.getElementById(this.config['container_id']);
+    this.loading_indicator = document.getElementsByClassName(this.config['loading_indicator_cls'])[0];
+
+
+    {
+      // Open the outline if nonempty
+      var empty = true;
+      var nodes = this.outline.childNodes;
+      for (var i = 0, l = nodes.length; i < l; ++i) {
+        var cur_node = nodes[i];
+        if (cur_node.nodeName.toLowerCase() === 'ul') {
+          empty = false;
+          break;
+        }
+      }
+      if (!empty)
+        this.sidebar.classList.add('opened');
+    }
+
+    this.find_pages();
+    // do nothing if there's nothing
+    if(this.pages.length == 0) return;
+
+    // disable dragging of background images
+    disable_dragstart(document.getElementsByClassName(CSS_CLASS_NAMES.background_image));
+
+    if (this.config['key_handler'])
+      this.register_key_handler();
+
+    var self = this;
+
+    if (this.config['hashchange_handler']) {
+      window.addEventListener('hashchange', function(e) {
+        self.navigate_to_dest(document.location.hash.substring(1));
+      }, false);
+    }
+
+    if (this.config['view_history_handler']) {
+      window.addEventListener('popstate', function(e) {
+        if(e.state) self.navigate_to_dest(e.state);
+      }, false);
+    }
+
+    // register schedule rendering
+    // renew old schedules since scroll() may be called frequently
+    this.container.addEventListener('scroll', function() {
+      self.update_page_idx();
+      self.schedule_render(true);
+    }, false);
+
+    // handle links
+    [this.container, this.outline].forEach(function(ele) {
+      ele.addEventListener('click', self.link_handler.bind(self), false);
+    });
+
+    this.initialize_radio_button();
+    this.render();
+  },
+
+  /*
+   * set up this.pages and this.page_map
+   * pages is an array holding all the Page objects
+   * page-Map maps an original page number (in PDF) to the corresponding index in page
+   */
+  find_pages : function() {
+    var new_pages = [];
+    var new_page_map = {};
+    var nodes = this.container.childNodes;
+    for (var i = 0, l = nodes.length; i < l; ++i) {
+      var cur_node = nodes[i];
+      if ((cur_node.nodeType === Node.ELEMENT_NODE)
+          && cur_node.classList.contains(CSS_CLASS_NAMES.page_frame)) {
+        var p = new Page(cur_node);
+        new_pages.push(p);
+        new_page_map[p.num] = new_pages.length - 1;
+      }
+    }
+    this.pages = new_pages;
+    this.page_map = new_page_map;
+  },
+
+  /**
+   * @param{number} idx
+   * @param{number=} pages_to_preload
+   * @param{function(Page)=} callback
+   *
+   * TODO: remove callback -> promise ?
+   */
+  load_page : function(idx, pages_to_preload, callback) {
+    var pages = this.pages;
+    if (idx >= pages.length)
+      return;  // Page does not exist
+
+    var cur_page = pages[idx];
+    if (cur_page.loaded)
+      return;  // Page is loaded
+
+    if (this.pages_loading[idx])
+      return;  // Page is already loading
+
+    var cur_page_ele = cur_page.page;
+    var url = cur_page_ele.getAttribute('data-page-url');
+    if (url) {
+      this.pages_loading[idx] = true;       // set semaphore
+
+      // add a copy of the loading indicator if not already present
+      var new_loading_indicator = cur_page_ele.getElementsByClassName(this.config['loading_indicator_cls'])[0];
+      if (typeof new_loading_indicator === 'undefined'){
+        new_loading_indicator = this.loading_indicator.cloneNode(true);
+        new_loading_indicator.classList.add('active');
+        cur_page_ele.appendChild(new_loading_indicator);
+      }
+
+      // load data
+      {
+        var self = this;
+        var _idx = idx;
+        var xhr = new XMLHttpRequest();
+        xhr.open('GET', url, true);
+        xhr.onload = function(){
+          if (xhr.status === 200 || xhr.status === 0) {
+            // find the page element in the data
+            var div = document.createElement('div');
+            div.innerHTML = xhr.responseText;
+
+            var new_page = null;
+            var nodes = div.childNodes;
+            for (var i = 0, l = nodes.length; i < l; ++i) {
+              var cur_node = nodes[i];
+              if ((cur_node.nodeType === Node.ELEMENT_NODE)
+                  && cur_node.classList.contains(CSS_CLASS_NAMES.page_frame)) {
+                new_page = cur_node;
+                break;
+              }
+            }
+
+            // replace the old page with loaded data
+            // the loading indicator on this page should also be destroyed
+            var p = self.pages[_idx];
+            self.container.replaceChild(new_page, p.page);
+            p = new Page(new_page);
+            self.pages[_idx] = p;
+
+            p.hide();
+            p.rescale(self.scale);
+
+            // disable background image dragging
+            disable_dragstart(new_page.getElementsByClassName(CSS_CLASS_NAMES.background_image));
+
+            self.schedule_render(false);
+
+            if (callback){ callback(p); }
+          }
+
+          // Reset loading token
+          delete self.pages_loading[_idx];
+        };
+        xhr.send(null);
+      }
+    }
+    // Concurrent prefetch of the next pages
+    if (pages_to_preload === undefined)
+      pages_to_preload = this.config['preload_pages'];
+
+    if (--pages_to_preload > 0) {
+      var self = this;
+      setTimeout(function() {
+        self.load_page(idx+1, pages_to_preload);
+      },0);
+    }
+  },
+
+  /*
+   * Hide all pages that have no 'opened' class
+   * The 'opened' class will be added to visible pages by JavaScript
+   * We cannot add this in the default CSS because JavaScript may be disabled
+   */
+  pre_hide_pages : function() {
+    /* pages might have not been loaded yet, so add a CSS rule */
+    var s = '@media screen{.'+CSS_CLASS_NAMES.page_content_box+'{display:none;}}';
+    var n = document.createElement('style');
+    if (n.styleSheet) {
+      n.styleSheet.cssText = s;
+    } else {
+      n.appendChild(document.createTextNode(s));
+    }
+    document.head.appendChild(n);
+  },
+
+  /*
+   * show visible pages and hide invisible pages
+   */
+  render : function () {
+    var container = this.container;
+    /*
+     * show the pages that are 'nearly' visible -- it's right above or below the container
+     *
+     * all the y values are in the all-page element's coordinate system
+     */
+    var container_min_y = container.scrollTop;
+    var container_height = container.clientHeight;
+    var container_max_y = container_min_y + container_height;
+    var visible_min_y = container_min_y - container_height;
+    var visible_max_y = container_max_y + container_height;
+
+    var cur_page_fully_visible = false;
+    var cur_page_idx = this.cur_page_idx;
+    var max_visible_page_idx = cur_page_idx;
+    var max_visible_ratio = 0.0;
+
+    var pl = this.pages;
+    for (var i = 0, l = pl.length; i < l; ++i) {
+      var cur_page = pl[i];
+      var cur_page_ele = cur_page.page;
+      var page_min_y = cur_page_ele.offsetTop + cur_page_ele.clientTop;
+      var page_height = cur_page_ele.clientHeight;
+      var page_max_y = page_min_y + page_height;
+      if ((page_min_y <= visible_max_y) && (page_max_y >= visible_min_y))
+      {
+        // cur_page is 'nearly' visible, show it or load it
+        if (cur_page.loaded) {
+          cur_page.show();
+        } else {
+          this.load_page(i);
+        }
+      } else {
+        cur_page.hide();
+      }
+    }
+  },
+  /*
+   * update cur_page_idx and first_page_idx
+   * normally called upon scrolling
+   */
+  update_page_idx: function () {
+    var pages = this.pages;
+    var pages_len = pages.length;
+    // there is no chance that cur_page_idx or first_page_idx is modified
+    if (pages_len < 2) return;
+
+    var container = this.container;
+    var container_min_y = container.scrollTop;
+    var container_max_y = container_min_y + container.clientHeight;
+
+    // binary search for the first page
+    // whose bottom border is below the top border of the container
+    var first_idx = -1;
+    var last_idx = pages_len;
+    var rest_len = last_idx - first_idx;
+    // TODO: use current first_page_idx as a hint?
+    while(rest_len > 1) {
+      var idx = first_idx + Math.floor(rest_len / 2);
+      var cur_page_ele = pages[idx].page;
+      if (cur_page_ele.offsetTop + cur_page_ele.clientTop + cur_page_ele.clientHeight >= container_min_y) {
+        last_idx = idx;
+      } else {
+        first_idx = idx;
+      }
+      rest_len = last_idx - first_idx;
+    }
+
+    /*
+     * with malformed settings it is possible that no page is visible, e.g.
+     * - the container is to thin, which lies in the margin between two pages
+     * - all pages are completely above or below the container
+     * but we just assume that they won't happen.
+     */
+    this.first_page_idx = last_idx;
+
+    // find the page with largest visible area
+    var cur_page_idx = this.cur_page_idx;
+    var max_visible_page_idx = cur_page_idx;
+    var max_visible_ratio = 0.0;
+
+    for(var i = last_idx; i < pages_len; ++i) {
+      var cur_page_ele = pages[i].page;
+      var page_min_y = cur_page_ele.offsetTop + cur_page_ele.clientTop;
+      var page_height = cur_page_ele.clientHeight;
+      var page_max_y = page_min_y + page_height;
+      if (page_min_y > container_max_y) break;
+
+      // check the visible fraction of the page
+      var page_visible_ratio = ( Math.min(container_max_y, page_max_y)
+                                 - Math.max(container_min_y, page_min_y)
+                               ) / page_height;
+
+      // stay with the current page if it is still fully visible
+      if ((i === cur_page_idx) && (Math.abs(page_visible_ratio - 1.0) <= EPS)) {
+        max_visible_page_idx = cur_page_idx;
+        break;
+      }
+
+      if (page_visible_ratio > max_visible_ratio) {
+        max_visible_ratio = page_visible_ratio;
+        max_visible_page_idx = i;
+      }
+    }
+
+    this.cur_page_idx = max_visible_page_idx;
+  },
+
+  /**
+   * @param{boolean} renew renew the existing schedule instead of using the old one
+   */
+  schedule_render : function(renew) {
+    if (this.render_timer !== undefined) {
+      if (!renew) return;
+      clearTimeout(this.render_timer);
+    }
+
+    var self = this;
+    this.render_timer = setTimeout(function () {
+      /*
+       * render() may trigger load_page(), which may in turn trigger another render()
+       * so delete render_timer first
+       */
+      delete self.render_timer;
+      self.render();
+    }, this.config['render_timeout']);
+  },
+
+  /*
+   * Handling key events, zooming, scrolling etc.
+   */
+  register_key_handler: function () {
+    /*
+     * When user try to zoom in/out using ctrl + +/- or mouse wheel
+     * handle this and prevent the default behaviours
+     *
+     * Code credit to PDF.js
+     */
+    var self = this;
+
+    // Firefox specific event, so that we can prevent browser from zooming
+    window.addEventListener('DOMMouseScroll', function(e) {
+      if (e.ctrlKey) {
+        e.preventDefault();
+        var container = self.container;
+        var rect = container.getBoundingClientRect();
+        var fixed_point = [e.clientX - rect['left'] - container.clientLeft
+                          ,e.clientY - rect['top'] - container.clientTop];
+        self.rescale(Math.pow(self.config['scale_step'], e.detail), true, fixed_point);
+      }
+    }, false);
+
+    window.addEventListener('keydown', function(e) {
+      var handled = false;
+      /*
+      var cmd = (e.ctrlKey ? 1 : 0)
+                | (e.altKey ? 2 : 0)
+                | (e.shiftKey ? 4 : 0)
+                | (e.metaKey ? 8 : 0)
+                ;
+                */
+      var with_ctrl = e.ctrlKey || e.metaKey;
+      var with_alt = e.altKey;
+      switch (e.keyCode) {
+        case 61: // FF/Mac '='
+        case 107: // FF '+' and '='
+        case 187: // Chrome '+'
+          if (with_ctrl){
+            self.rescale(1.0 / self.config['scale_step'], true);
+            handled = true;
+          }
+          break;
+        case 173: // FF/Mac '-'
+        case 109: // FF '-'
+        case 189: // Chrome '-'
+          if (with_ctrl){
+            self.rescale(self.config['scale_step'], true);
+            handled = true;
+          }
+          break;
+        case 48: // '0'
+          if (with_ctrl){
+            self.rescale(0, false);
+            handled = true;
+          }
+          break;
+        case 33: // Page UP:
+          if (with_alt) { // alt-pageup    -> scroll one page up
+            self.scroll_to(self.cur_page_idx - 1);
+            handled = true;
+          } else if (!with_ctrl) { // pageup        -> scroll one screen up
+            self.container.scrollTop -= self.container.clientHeight;
+            handled = true;
+          }
+          break;
+        case 34: // Page DOWN
+          if (with_alt) { // alt-pagedown  -> scroll one page down
+            self.scroll_to(self.cur_page_idx + 1);
+            handled = true;
+          } else if (!with_ctrl) { // pagedown      -> scroll one screen down
+            self.container.scrollTop += self.container.clientHeight;
+            handled = true;
+          }
+          break;
+        case 35: // End
+          self.container.scrollTop = self.container.scrollHeight;
+          handled = true;
+          break;
+        case 36: // Home
+          self.container.scrollTop = 0;
+          handled = true;
+          break;
+      }
+      if (handled) {
+        e.preventDefault();
+        return;
+      }
+    }, false);
+  },
+
+  /**
+   * @param{number} ratio
+   * @param{boolean} is_relative
+   * @param{Array.<number>=} fixed_point preserve the position (relative to the top-left corner of the viewer) after rescaling
+   */
+  rescale : function (ratio, is_relative, fixed_point) {
+    var old_scale = this.scale;
+    var new_scale = old_scale;
+    // set new scale
+    if (ratio === 0) {
+      new_scale = 1;
+      is_relative = false;
+    } else if (is_relative)
+      new_scale *= ratio;
+    else
+      new_scale = ratio;
+
+    this.scale = new_scale;
+
+    if (!fixed_point)
+      fixed_point = [0,0];
+
+    // translate fixed_point to the coordinate system of all pages
+    var container = this.container;
+    fixed_point[0] += container.scrollLeft;
+    fixed_point[1] += container.scrollTop;
+
+    // find the visible page that contains the fixed point
+    // if the fixed point lies between two pages (including their borders), it's contained in the first one
+    var pl = this.pages;
+    var pl_len = pl.length;
+    for (var i = this.first_page_idx; i < pl_len; ++i) {
+      var p = pl[i].page;
+      if (p.offsetTop + p.clientTop >= fixed_point[1])
+        break;
+    }
+    var fixed_point_page_idx = i - 1;
+
+    // determine the new scroll position
+    // each-value consists of two parts, one inside the page, which is affected by rescaling,
+    // the other is outside, (e.g. borders and margins), which is not affected
+
+    // if the fixed_point is above the first page, use the first page as the reference
+    if (fixed_point_page_idx < 0)
+      fixed_point_page_idx = 0;
+
+    var fp_p = pl[fixed_point_page_idx].page;
+    var fp_p_width = fp_p.clientWidth;
+    var fp_p_height = fp_p.clientHeight;
+
+    var fp_x_ref = fp_p.offsetLeft + fp_p.clientLeft;
+    var fp_x_inside = fixed_point[0] - fp_x_ref;
+    if (fp_x_inside < 0)
+      fp_x_inside = 0;
+    else if (fp_x_inside > fp_p_width)
+      fp_x_inside = fp_p_width;
+
+    var fp_y_ref = fp_p.offsetTop + fp_p.clientTop;
+    var fp_y_inside = fixed_point[1] - fp_y_ref;
+    if (fp_y_inside < 0)
+      fp_y_inside = 0;
+    else if (fp_y_inside > fp_p_height)
+      fp_y_inside = fp_p_height;
+
+    // Rescale pages
+    for (var i = 0; i < pl_len; ++i)
+        pl[i].rescale(new_scale);
+
+    // Correct container scroll to keep view aligned while zooming
+    container.scrollLeft += fp_x_inside / old_scale * new_scale + fp_p.offsetLeft + fp_p.clientLeft - fp_x_inside - fp_x_ref;
+    container.scrollTop += fp_y_inside / old_scale * new_scale + fp_p.offsetTop + fp_p.clientTop - fp_y_inside - fp_y_ref;
+
+    // some pages' visibility may be toggled, wait for next render()
+    // renew old schedules since rescale() may be called frequently
+    this.schedule_render(true);
+  },
+
+  fit_width : function () {
+    var page_idx = this.cur_page_idx;
+    this.rescale(this.container.clientWidth / this.pages[page_idx].width(), true);
+    this.scroll_to(page_idx);
+  },
+
+  fit_height : function () {
+    var page_idx = this.cur_page_idx;
+    this.rescale(this.container.clientHeight / this.pages[page_idx].height(), true);
+    this.scroll_to(page_idx);
+  },
+  /**
+   * @param{Node} ele
+   */
+  get_containing_page : function(ele) {
+    /* get the page obj containing obj */
+    while(ele) {
+      if ((ele.nodeType === Node.ELEMENT_NODE)
+          && ele.classList.contains(CSS_CLASS_NAMES.page_frame)) {
+        /*
+         * Get original page number and map it to index of pages
+         * TODO: store the index on the dom element
+         */
+        var pn = get_page_number(/** @type{Element} */(ele));
+        var pm = this.page_map;
+        return (pn in pm) ? this.pages[pm[pn]] : null;
+      }
+      ele = ele.parentNode;
+    }
+    return null;
+  },
+
+  /**
+   * @param{Event} e
+   */
+  link_handler : function (e) {
+    var target = /** @type{Node} */(e.target);
+    var detail_str = /** @type{string} */ (target.getAttribute('data-dest-detail'));
+    if (!detail_str) return;
+
+    if (this.config['view_history_handler']) {
+      try {
+        var cur_hash = this.get_current_view_hash();
+        window.history.replaceState(cur_hash, '', '#' + cur_hash);
+        window.history.pushState(detail_str, '', '#' + detail_str);
+      } catch(ex) { }
+    }
+    this.navigate_to_dest(detail_str, this.get_containing_page(target));
+    e.preventDefault();
+  },
+
+  /**
+   * @param{string} detail_str may come from user provided hashtag, need sanitizing
+   * @param{Page=} src_page page containing the source event (e.g. link)
+   */
+  navigate_to_dest : function(detail_str, src_page) {
+    try {
+      var detail = JSON.parse(detail_str);
+    } catch(e) {
+      return;
+    }
+
+    if(!(detail instanceof Array)) return;
+
+    var target_page_no = detail[0];
+    var page_map = this.page_map;
+    if (!(target_page_no in page_map)) return;
+    var target_page_idx = page_map[target_page_no];
+    var target_page = this.pages[target_page_idx];
+
+    for (var i = 2, l = detail.length; i < l; ++i) {
+      var d = detail[i];
+      if(!((d === null) || (typeof d === 'number')))
+        return;
+    }
+
+    while(detail.length < 6)
+      detail.push(null);
+
+    // cur_page might be undefined, e.g. from Outline
+    var cur_page = src_page || this.pages[this.cur_page_idx];
+
+    var cur_pos = cur_page.view_position();
+    cur_pos = transform(cur_page.ictm, [cur_pos[0], cur_page.height()-cur_pos[1]]);
+
+    var zoom = this.scale;
+    var pos = [0,0];
+    var upside_down = true;
+    var ok = false;
+
+    // position specified in `detail` are in the raw coordinate system of the page (unscaled)
+    var scale = this.scale;
+    // TODO: fitb*
+    // TODO: BBox
+    switch(detail[1]) {
+      case 'XYZ':
+        pos = [ (detail[2] === null) ? cur_pos[0] : detail[2] * scale
+              , (detail[3] === null) ? cur_pos[1] : detail[3] * scale ];
+        zoom = detail[4];
+        if ((zoom === null) || (zoom === 0))
+          zoom = this.scale;
+        ok = true;
+        break;
+      case 'Fit':
+      case 'FitB':
+        pos = [0,0];
+        ok = true;
+        break;
+      case 'FitH':
+      case 'FitBH':
+        pos = [0, (detail[2] === null) ? cur_pos[1] : detail[2] * scale];
+        ok = true;
+        break;
+      case 'FitV':
+      case 'FitBV':
+        pos = [(detail[2] === null) ? cur_pos[0] : detail[2] * scale, 0];
+        ok = true;
+        break;
+      case 'FitR':
+        /* locate the top-left corner of the rectangle */
+        // TODO
+        pos = [detail[2] * scale, detail[5] * scale];
+        upside_down = false;
+        ok = true;
+        break;
+      default:
+        break;
+    }
+
+    if (!ok) return;
+
+    this.rescale(zoom, false);
+
+    var self = this;
+    /**
+     * page should have type Page
+     * @param{Page} page
+     */
+    var transform_and_scroll = function(page) {
+      pos = transform(page.ctm, pos);
+      if (upside_down) {
+        pos[1] = page.height() - pos[1];
+      }
+      self.scroll_to(target_page_idx, pos);
+    };
+
+    if (target_page.loaded) {
+      transform_and_scroll(target_page);
+    } else {
+      // TODO: scroll_to may finish before load_page
+
+      // Scroll to the exact position once loaded.
+      this.load_page(target_page_idx, undefined, transform_and_scroll);
+
+      // In the meantime page gets loaded, scroll approximately position for maximum responsiveness.
+      this.scroll_to(target_page_idx);
+    }
+  },
+
+  /**
+   * @param{number} page_idx
+   * @param{Array.<number>=} pos [x,y] where (0,0) is the top-left corner
+   */
+  scroll_to : function(page_idx, pos) {
+    var pl = this.pages;
+    if ((page_idx < 0) || (page_idx >= pl.length)) return;
+    var target_page = pl[page_idx];
+    var cur_target_pos = target_page.view_position();
+
+    if (pos === undefined)
+      pos = [0,0];
+
+    var container = this.container;
+    container.scrollLeft += pos[0] - cur_target_pos[0];
+    container.scrollTop += pos[1] - cur_target_pos[1];
+  },
+
+  /**
+   * generate the hash for the current view
+   */
+  get_current_view_hash : function() {
+    var detail = [];
+    var cur_page = this.pages[this.cur_page_idx];
+
+    detail.push(cur_page.num);
+    detail.push('XYZ');
+
+    var cur_pos = cur_page.view_position();
+    cur_pos = transform(cur_page.ictm, [cur_pos[0], cur_page.height()-cur_pos[1]]);
+    detail.push(cur_pos[0] / this.scale);
+    detail.push(cur_pos[1] / this.scale);
+
+    detail.push(this.scale);
+
+    return JSON.stringify(detail);
+  }
+};
+
+// export pdf2htmlEX.Viewer
+pdf2htmlEX['Viewer'] = Viewer;
diff --git a/Doc/pdf2html/plus.gif b/Doc/pdf2html/plus.gif
new file mode 100644
index 0000000..93d2ade
Binary files /dev/null and b/Doc/pdf2html/plus.gif differ
diff --git a/Examples/Demos/FitCylindersPrisms_movie.py b/Examples/Demos/FitCylindersPrisms_movie.py
new file mode 100644
index 0000000..1c0c9da
--- /dev/null
+++ b/Examples/Demos/FitCylindersPrisms_movie.py
@@ -0,0 +1,235 @@
+"""
+Fitting example
+(This is more detailed version of FitCylindersPrisms.py.
+We show how to generate "real" data and how to draw fit progress.
+Take a note, that performance here is determined by poor performance of matplotlib drawing routines.)
+
+In this example we use a simple geometry: cylinders and prisms in
+air layer, deposited on a substrate layer, with no interference.
+There are 4 fitting parameters:
+1) radius of cylinders
+2) height of cylinders
+3) length of prisms
+4) height of prisms
+
+Our reference data is 2D intensity map obtained from the simulation of
+the same geometry with fixed values cylinder_height = prism3_height
+ = cylinder_radius = prism3_length/2 = 1nm.
+
+Then we run our minimization consequently using default
+minimization engine, with starting values cylinder_height = prism3_height = 4nm,
+cylinder_radius = prism3_length/2 = 6nm as initial fit parameter values.
+"""
+
+
+import numpy
+import matplotlib
+import matplotlib.pyplot as plt
+import matplotlib.patches as patches
+from matplotlib.path import Path
+import math
+import random
+from bornagain import *
+
+fig = plt.figure(1)
+max_line_length = 30
+
+
+def get_sample(cylinder_height=1.0*nanometer,
+               cylinder_radius=1.0*nanometer,
+               prism_length=2.0*nanometer,
+               prism_height=1.0*nanometer):
+    """
+    Build the sample representing cylinders and pyramids on top of
+    substrate without interference.
+    """
+    # defining materials
+    m_air = HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = FormFactorCylinder(cylinder_radius, cylinder_height)
+    cylinder = Particle(m_particle, cylinder_ff)
+    prism_ff = FormFactorPrism3(prism_length, prism_height)
+    prism = Particle(m_particle, prism_ff)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder, 0.5)
+    particle_layout.addParticle(prism, 0.5)
+    interference = InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(m_substrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise to the simulated data.
+    This function has been used once to generate refdata_fitcylinderprisms.int
+    """
+    # creating sample with set of parameters we will later try to find during the fit
+    sample = get_sample(5.0*nanometer, 5.0*nanometer, 5.0*nanometer, 5.0*nanometer)
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 0.1
+    for i in range(0, real_data.getAllocatedSize()):
+        amplitude = real_data[i]
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 0.1:
+            noisy_amplitude = 0.1
+        real_data[i] = noisy_amplitude
+    IntensityDataIOFactory.writeIntensityData(real_data, 'refdata_fitcylinderprisms.int')
+
+
+
+def get_simulation():
+    """
+    Create GISAXS simulation with beam and detector defined
+    """
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*degree, 1.0*degree, 100, 0.0*degree, 2.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    return simulation
+
+
+class DrawObserver(IFitObserver):
+    """
+    class which draws fit progress every nth iteration.
+    It has to be attached to fit_suite via AttachObserver command
+    """
+    def __init__(self, draw_every_nth=1):
+        IFitObserver.__init__(self, draw_every_nth)
+        print "MySampleBuilder ctor"
+        self.cyl_points = []
+        self.prism_points = []
+        self.draw_codes = []
+
+    def update(self, fit_suite):
+        fig.clf()
+        # plotting real data
+        real_data = fit_suite.getFitObjects().getRealData().getArray()
+        simulated_data = fit_suite.getFitObjects().getSimulationData().getArray()
+        plt.subplot(2, 2, 1)
+        im = plt.imshow(real_data + 1, norm=matplotlib.colors.LogNorm(),extent=[-1.0, 1.0, 0, 2.0])
+        plt.colorbar(im)
+        plt.title('\"Real\" data')
+        # plotting real data
+        plt.subplot(2, 2, 2)
+        im = plt.imshow(simulated_data + 1, norm=matplotlib.colors.LogNorm(),extent=[-1.0, 1.0, 0, 2.0])
+        plt.colorbar(im)
+        plt.title('Simulated data')
+        # plotting parameter space
+        if fit_suite.getNumberOfIterations() == 0:
+            self.draw_codes.append(Path.MOVETO)
+        # elif fit_suite.getNCalls() < max_line_length:
+        else:
+            self.draw_codes.append(Path.LINETO)
+        fitpars = fit_suite.getFitParameters()
+        self.cyl_points.append((fitpars[0].getValue(), fitpars[1].getValue()))
+        self.prism_points.append((fitpars[2].getValue(), fitpars[3].getValue()))
+        # if fit_suite.getNCalls() >= max_line_length:
+        #     self.cyl_points.pop(0)
+        #     self.prism_points.pop(0)
+        # cylinder parameter space
+        path_cyl = Path(self.cyl_points, self.draw_codes)
+        ax = plt.subplot(2, 2, 3)
+        patch = patches.PathPatch(path_cyl, facecolor='none', lw=2)
+        ax.add_patch(patch)
+        ax.set_xlim(0, 10)
+        ax.set_ylim(0, 10)
+        # prism parameter space
+        path_prism = Path(self.prism_points, self.draw_codes)
+        ax = plt.subplot(2, 2, 4)
+        patch = patches.PathPatch(path_prism, facecolor='none', lw=2)
+        ax.add_patch(patch)
+        ax.set_xlim(0, 10)
+        ax.set_ylim(0, 10)
+        # # plotting difference map
+        # diff_map = (real_data - simulated_data)/numpy.sqrt(real_data + 1)
+        # pylab.subplot(2, 2, 3)
+        # im = pylab.imshow(diff_map, norm=matplotlib.colors.LogNorm(), extent=[-1.0, 1.0, 0, 2.0], vmin = 0.001, vmax = 1.0)
+        # pylab.colorbar(im)
+        # pylab.title('Difference map')
+        # # plotting parameters info
+        # pylab.subplot(2, 2, 4)
+        # pylab.title('Parameters')
+        # pylab.axis('off')
+        # pylab.text(0.01, 0.85, "Iteration  " + str(fit_suite.getNCalls()))
+        # pylab.text(0.01, 0.75, "Chi2       " + str(fit_suite.getFitObjects().getChiSquaredValue()))
+        # fitpars = fit_suite.getFitParameters()
+        # for i in range(0, fitpars.size()):
+        #     pylab.text(0.01, 0.55 - i*0.1, str(fitpars[i].getName()) + " " + str(fitpars[i].getValue())[0:5] )
+        fname = '_tmp%03d.png' % fit_suite.getNumberOfIterations()
+        print 'Saving frame', fname
+        fig.savefig(fname)
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+
+    # uncomment to regenerate "real" data
+    #create_real_data()
+
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    real_data = IntensityDataIOFactory.readIntensityData('refdata_fitcylinderprisms.int.gz')
+
+    fit_suite = FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    fit_suite.initPrint(10)
+
+    draw_observer = DrawObserver()
+    fit_suite.attachObserver(draw_observer)
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*Cylinder/Height", 2.*nanometer, Limits.limited(0.01, 10.0))
+    fit_suite.addFitParameter("*Cylinder/Radius", 2.*nanometer, Limits.limited(0.01, 10.0))
+    fit_suite.addFitParameter("*Prism3/Height", 2.*nanometer, Limits.limited(0.01, 10.0))
+    fit_suite.addFitParameter("*Prism3/Length", 2.*nanometer, Limits.limited(0.01, 10.0))
+
+    # # Now we create first fig strategy which will run first minimization round using Genetic minimizer.
+    # # Genetic minimizer is able to explore large parameter space without being trapped by some local minima.
+    # strategy1 = FitStrategyAdjustMinimizer()
+    # strategy1.setMinimizer(MinimizerFactory.createMinimizer("Genetic"))
+    # strategy1.getMinimizer().getOptions().setMaxIterations(0)
+    # fit_suite.addFitStrategy(strategy1)
+
+    # Second fit strategy will use another algorithm. It will use best parameters found from previous minimization round.
+    strategy2 = FitStrategyAdjustMinimizer("Minuit2", "Migrad")
+    fit_suite.addFitStrategy(strategy2)
+
+    # running fit
+    fit_suite.runFit()
+
+    print "Fitting completed."
+    fit_suite.printResults()
+    print "chi2:", fit_suite.getMinimizer().getMinValue()
+    fitpars = fit_suite.getFitParameters()
+    for i in range(0, fitpars.size()):
+        print fitpars[i].getName(), fitpars[i].getValue(), fitpars[i].getError()
+    os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10 -ovc lavc -lavcopts vcodec=wmv2 -oac copy -o fit_movie.mpg")
+    print 'Removing temporary files'
+    os.system("rm _tmp*")
+
+
+if __name__ == '__main__':
+    run_fitting()
+    # pylab.ioff()
+    # pylab.show()
diff --git a/Examples/Demos/animation.mpg b/Examples/Demos/animation.mpg
new file mode 100644
index 0000000..24a3e88
Binary files /dev/null and b/Examples/Demos/animation.mpg differ
diff --git a/Examples/Demos/animation2.mpg b/Examples/Demos/animation2.mpg
new file mode 100644
index 0000000..4dbed43
Binary files /dev/null and b/Examples/Demos/animation2.mpg differ
diff --git a/Examples/Demos/animation3.mpg b/Examples/Demos/animation3.mpg
new file mode 100644
index 0000000..0605fa5
Binary files /dev/null and b/Examples/Demos/animation3.mpg differ
diff --git a/Examples/Demos/fit_movie.mpg b/Examples/Demos/fit_movie.mpg
new file mode 100644
index 0000000..da9d2ac
Binary files /dev/null and b/Examples/Demos/fit_movie.mpg differ
diff --git a/Examples/Demos/refdata_fitcylinderprisms.int.gz b/Examples/Demos/refdata_fitcylinderprisms.int.gz
new file mode 100644
index 0000000..ab2560d
Binary files /dev/null and b/Examples/Demos/refdata_fitcylinderprisms.int.gz differ
diff --git a/Examples/Demos/simul_demo_cyl_SSCA.py b/Examples/Demos/simul_demo_cyl_SSCA.py
new file mode 100644
index 0000000..f36b07c
--- /dev/null
+++ b/Examples/Demos/simul_demo_cyl_SSCA.py
@@ -0,0 +1,69 @@
+'''
+Simulation demo: Size Space Coupling Approximation
+'''
+
+import numpy
+import matplotlib
+import math
+from bornagain import *
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAir = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle =HomogeneousMaterial("Particle", 6e-4, 2e-8)
+    mLayer = HomogeneousMaterial("Layer", 2e-5, 2e-8)
+
+    # collection of particles
+    cylinder_ff1 = FormFactorCylinder(2 * nanometer, 5 * nanometer)
+    cylinder_ff2 = FormFactorCylinder(3 * nanometer, 6 * nanometer)
+    cylinder_ff3 = FormFactorCylinder(4 * nanometer, 7 * nanometer)
+    cylinder1 = Particle(mParticle, cylinder_ff1)
+    cylinder2 = Particle(mParticle, cylinder_ff2)
+    cylinder3 = Particle(mParticle, cylinder_ff3)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder1)
+    particle_layout.addParticle(cylinder2)
+    particle_layout.addParticle(cylinder3)
+    interference = InterferenceFunctionRadialParaCrystal(5 * nanometer)
+    pdf = FTDistribution1DGauss(1 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    # set coupling between size and space
+    interference.setKappa(2)
+    particle_layout.addInterferenceFunction(interference)
+    # particle_layout.setApproximation(ILayout.SSCA)
+    particle_layout.setApproximation(ILayout.DA)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAir)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    roughness = LayerRoughness(10 * nanometer, 3, 20 * nanometer)
+    multi_layer.addLayerWithTopRoughness(substrate_layer, roughness)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -4.0 * degree, 4.0 * degree, 100, 0.0 * degree, 8.0 * degree)
+    simulation.setBeamParameters(1.0 * angstrom, 0.2 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # intensity data
+    return simulation.getIntensityData().getArray()
+
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    result = RunSimulation() + 1 # for log scale
+    im = plt.imshow(result, norm=matplotlib.colors.LogNorm(),
+                 extent=[-4.0, 4.0, 0, 8.0])
+    plt.colorbar(im)
+    plt.xlabel(r'$\phi_f$', fontsize=20)
+    plt.ylabel(r'$\alpha_f$', fontsize=20)
+    plt.show()
diff --git a/Examples/Demos/simul_demo_cylsphere.py b/Examples/Demos/simul_demo_cylsphere.py
new file mode 100644
index 0000000..cac7882
--- /dev/null
+++ b/Examples/Demos/simul_demo_cylsphere.py
@@ -0,0 +1,61 @@
+'''
+Simulation demo: Cylinder and/or sphere on substrate
+'''
+
+import numpy
+import matplotlib
+import math
+from bornagain import *
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAir = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = FormFactorCylinder(2 * nanometer, 5 * nanometer)
+    cylinder = Particle(mParticle, cylinder_ff)
+    sphere_ff = FormFactorFullSphere(4 * nanometer)
+    sphere = Particle(mParticle, sphere_ff)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder)
+    particle_layout.addParticle(sphere)
+    interference = InterferenceFunctionRadialParaCrystal(20 * nanometer)
+    pdf = FTDistribution1DGauss(2 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAir)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -4.0 * degree, 4.0 * degree, 100, 0.0 * degree, 8.0 * degree)
+    simulation.setBeamParameters(1.0 * angstrom, 0.2 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # intensity data
+    return simulation.getIntensityData().getArray()
+
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    result = RunSimulation() + 1 # for log scale
+    im = plt.imshow(result,
+                 norm=matplotlib.colors.LogNorm(),
+                 extent=[-4.0, 4.0, 0, 8.0])
+    plt.colorbar(im)
+    plt.xlabel(r'$\phi_f$', fontsize=20)
+    plt.ylabel(r'$\alpha_f$', fontsize=20)
+    plt.show()
diff --git a/Examples/Demos/simul_demo_lattice1.py b/Examples/Demos/simul_demo_lattice1.py
new file mode 100644
index 0000000..1954e4d
--- /dev/null
+++ b/Examples/Demos/simul_demo_lattice1.py
@@ -0,0 +1,75 @@
+'''
+Simulation demo: 2d lattice structure of particles
+'''
+
+import numpy
+import matplotlib
+import math
+from bornagain import *
+
+M_PI = numpy.pi
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0 )
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8 )
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8 )
+    
+    # particle
+    cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
+    cylinder = Particle(mParticle, cylinder_ff.clone())
+    position = kvector_t(0.0, 0.0, 0.0)
+    cylinder.setPosition(position)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    # interference function
+    interference = InterferenceFunction2DLattice.createSquare(10.0*nanometer)
+    pdf = FTDecayFunction2DCauchy(300.0*nanometer/2.0/M_PI, 100.0*nanometer/2.0/M_PI)
+    interference.setDecayFunction(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # top air layer
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout)
+
+    # substrate layer
+    substrate_layer = Layer(mSubstrate, 0)
+
+    # multilayer
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -2.0*degree, 2.0*degree, 100, 0.0*degree, 4.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+
+    # run simulation
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    return simulation.getIntensityData().getArray()
+
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    result = RunSimulation()
+    im = plt.imshow(result+1,
+                 norm=matplotlib.colors.LogNorm(),
+                 extent=[-2.0, 2.0, 0, 4.0])
+    plt.colorbar(im)
+    plt.xlabel(r'$\phi_f$', fontsize=20)
+    plt.ylabel(r'$\alpha_f$', fontsize=20)
+    plt.show()
+
+
+
+
+ 
+ 
diff --git a/Examples/Demos/simul_demo_lattice2.py b/Examples/Demos/simul_demo_lattice2.py
new file mode 100644
index 0000000..89a0019
--- /dev/null
+++ b/Examples/Demos/simul_demo_lattice2.py
@@ -0,0 +1,80 @@
+'''
+Simulation demo: Cylinder form factor without interference
+'''
+
+import numpy
+import matplotlib
+import math
+from bornagain import *
+
+M_PI = numpy.pi
+
+# ----------------------------------
+# describe sample and run simulation 
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0 )
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8 )
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8 )
+
+    # particle 1
+    cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
+    cylinder = Particle(mParticle, cylinder_ff)
+    position = kvector_t(0.0, 0.0, 0.0)
+    cylinder.setPosition(position)
+    particle_layout1 = ParticleLayout()
+    particle_layout1.addParticle(cylinder, 1.0)
+    # particle 2
+    position_2 = kvector_t(5.0*nanometer, 5.0*nanometer, 0.0)
+    cylinder.setPosition(position_2)
+    particle_layout2 = ParticleLayout()
+    particle_layout2.addParticle(cylinder, 1.0)
+
+    # interference function
+    interference = InterferenceFunction2DLattice.createSquare(10.0*nanometer)
+    pdf = FTDecayFunction2DCauchy(300.0*nanometer/2.0/M_PI, 100.0*nanometer/2.0/M_PI)
+    interference.setDecayFunction(pdf)
+    particle_layout1.addInterferenceFunction(interference)
+    particle_layout2.addInterferenceFunction(interference)
+
+    # top air layer
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout1)
+    air_layer.addLayout(particle_layout2)
+
+    # substrate layer
+    substrate_layer = Layer(mSubstrate, 0)
+
+    # multilayer
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -2.0*degree, 2.0*degree, 100, 0.0*degree, 4.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+
+    # run simulation
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    return simulation.getIntensityData().getArray()
+
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    result = RunSimulation()
+    im = plt.imshow(result+1,
+                 norm=matplotlib.colors.LogNorm(),
+                 extent=[-2.0, 2.0, 0, 4.0])
+    plt.colorbar(im)
+    plt.xlabel(r'$\phi_f$', fontsize=20)
+    plt.ylabel(r'$\alpha_f$', fontsize=20)
+    plt.show()
+
+
+ 
+ 
diff --git a/Examples/Demos/simul_demo_movie.py b/Examples/Demos/simul_demo_movie.py
new file mode 100644
index 0000000..a7c5f96
--- /dev/null
+++ b/Examples/Demos/simul_demo_movie.py
@@ -0,0 +1,103 @@
+'''
+Simulation demo: movie of growing particles on substrate
+'''
+
+import os, sys
+import numpy
+import matplotlib
+import math
+from bornagain import *
+
+Nframes = 50
+
+radius = 1
+height = 4
+distance = 5
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAir = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = FormFactorCylinder(radius, height)
+    cylinder = Particle(mParticle, cylinder_ff)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder)
+
+    # interference function
+    interference = InterferenceFunctionRadialParaCrystal(distance)
+    pdf = FTDistribution1DGauss(3 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAir)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -4.0 * degree, 4.0 * degree, 100, 0.0 * degree, 8.0 * degree)
+    simulation.setBeamParameters(1.0 * angstrom, 0.2 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # intensity data
+    return simulation.getIntensityData().getArray()
+	
+
+def SetParameters(i):
+    global radius
+    global height
+    global distance
+    radius = (1. + (3.0/Nframes)*i) * nanometer
+    height = (1. + (4.0/Nframes)*i) * nanometer
+    distance = (10. - (1.0/Nframes)*i) * nanometer
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    files = []
+    fig = plt.figure(figsize=(5,5))
+    ax = fig.add_subplot(111)
+    for i in range(Nframes):
+        SetParameters(i)
+        result = RunSimulation() + 1  # for log scale
+        ax.cla()
+        im = ax.imshow(result, vmax=1e3,
+                 norm=matplotlib.colors.LogNorm(),
+                 extent=[-4.0, 4.0, 0, 8.0])
+        plt.xlabel(r'$\phi_f$', fontsize=20)
+        plt.ylabel(r'$\alpha_f$', fontsize=20)
+        if i==0:
+            plt.colorbar(im)
+        fname = '_tmp%03d.png'%i
+        print 'Saving frame', fname
+        try:
+            fig.savefig(fname)
+        except IOError as e:
+            print "Frame cannot be saved. I/O error({0}): {1}".format(e.errno, e.strerror)
+            print "Copy these examples to the directory where you have a write permission and enough free space to save the movie."
+            sys.exit()
+        except:
+            print "Frame cannot be saved. Error:", sys.exc_info()[0]
+            sys.exit()
+        else:
+            files.append(fname)
+
+    try:
+        os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10 -ovc lavc -lavcopts vcodec=wmv2 -oac copy -o animation.mpg")
+        print 'Removing temporary files'
+        os.system("rm _tmp*")
+    except:
+        print "Movie cannot be saved. Error:", sys.exc_info()[0]
+        sys.exit()
+
diff --git a/Examples/Demos/simul_demo_movie2.py b/Examples/Demos/simul_demo_movie2.py
new file mode 100644
index 0000000..14cfaa4
--- /dev/null
+++ b/Examples/Demos/simul_demo_movie2.py
@@ -0,0 +1,105 @@
+'''
+Simulation demo: make movie
+'''
+
+import os, sys
+import numpy
+import matplotlib
+import math
+from bornagain import *
+
+radius = 1
+layer_thickness = 1
+Nframes = 100
+Ngrowframes = 30
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAir = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    semisphere_ff = FormFactorTruncatedSphere(radius, radius)
+    semisphere = Particle(mParticle, semisphere_ff)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(semisphere)
+
+    # interference function
+    interference = InterferenceFunctionRadialParaCrystal(6 * nanometer)
+    pdf = FTDistribution1DGauss(1 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAir)
+    air_layer.addLayout(particle_layout)
+    film_layer = Layer(mParticle, layer_thickness)
+    substrate_layer = Layer(mSubstrate)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(film_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -4.0 * degree, 4.0 * degree, 100, 0.0 * degree, 8.0 * degree)
+    simulation.setBeamParameters(1.0 * angstrom, 0.2 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # intensity data
+    return simulation.getIntensityData().getArray()
+
+
+def SetParameters(i):
+    global radius
+    global layer_thickness
+    if i<Ngrowframes:
+        radius = (1. + (3.0/Ngrowframes)*i) * nanometer
+        layer_thickness = 0.01 * nanometer
+    else:
+        radius = 4. * nanometer
+        layer_thickness = (0.01 + (0.5/(Nframes-Ngrowframes))*(i-Ngrowframes)) * nanometer
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    files = []
+    fig = plt.figure(figsize=(5,5))
+    ax = fig.add_subplot(111)
+    for i in range(Nframes):
+        SetParameters(i)
+        result = RunSimulation() + 1 # for log scale
+        ax.cla()
+        im = ax.imshow(result, vmax=1e3,
+                 norm=matplotlib.colors.LogNorm(),
+                 extent=[-4.0, 4.0, 0, 8.0])
+        plt.xlabel(r'$\phi_f$', fontsize=20)
+        plt.ylabel(r'$\alpha_f$', fontsize=20)
+        if i==0:
+            plt.colorbar(im)
+        fname = '_tmp%03d.png'%i
+        print 'Saving frame', fname
+        try:
+            fig.savefig(fname)
+        except IOError as e:
+            print "Frame cannot be saved. I/O error({0}): {1}".format(e.errno, e.strerror)
+            print "Copy these examples to the directory where you have a write permission and enough free space to save the movie."
+            sys.exit()
+        except:
+            print "Frame cannot be saved. Error:", sys.exc_info()[0]
+            sys.exit()
+        else:
+            files.append(fname)
+    try:
+        os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10 -ovc lavc -lavcopts vcodec=wmv2 -oac copy -o animation2.mpg")
+        print 'Removing temporary files'
+        os.system("rm _tmp*")
+    except:
+        print "Movie cannot be saved. Error:", sys.exc_info()[0]
+        sys.exit()
+
diff --git a/Examples/Demos/simul_demo_movie3.py b/Examples/Demos/simul_demo_movie3.py
new file mode 100644
index 0000000..72267f4
--- /dev/null
+++ b/Examples/Demos/simul_demo_movie3.py
@@ -0,0 +1,106 @@
+'''
+Simulation demo: Size Space Coupling Approximation
+'''
+
+import os, sys
+import numpy
+import matplotlib
+import math
+from bornagain import *
+
+Nframes = 50
+
+kappa = 0.
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAir = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+    mLayer = HomogeneousMaterial("Layer", 2e-5, 2e-8)
+
+    # collection of particles
+    cylinder_ff1 = FormFactorCylinder(2 * nanometer, 5 * nanometer)
+    cylinder_ff2 = FormFactorCylinder(3 * nanometer, 6 * nanometer)
+    cylinder_ff3 = FormFactorCylinder(4 * nanometer, 7 * nanometer)
+    cylinder1 = Particle(mParticle, cylinder_ff1)
+    cylinder2 = Particle(mParticle, cylinder_ff2)
+    cylinder3 = Particle(mParticle, cylinder_ff3)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder1)
+    particle_layout.addParticle(cylinder2)
+    particle_layout.addParticle(cylinder3)
+    interference = InterferenceFunctionRadialParaCrystal(6 * nanometer)
+    pdf = FTDistribution1DGauss(.5 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    # set coupling between size and space
+    interference.setKappa(kappa)
+    particle_layout.addInterferenceFunction(interference)
+    particle_layout.setApproximation(ILayout.SSCA)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAir)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    roughness = LayerRoughness(10 * nanometer, 3, 20 * nanometer)
+    multi_layer.addLayerWithTopRoughness(substrate_layer, roughness)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -4.0 * degree, 4.0 * degree, 100, 0.0 * degree, 8.0 * degree)
+    simulation.setBeamParameters(1.0 * angstrom, 0.2 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # intensity data
+    return simulation.getIntensityData().getArray()
+
+
+def SetParameters(i):
+    global kappa
+    kappa = 0.01 + (2.0/Nframes)*i
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    files = []
+    fig = plt.figure(figsize=(5,5))
+    ax = fig.add_subplot(111)
+    for i in range(Nframes):
+        SetParameters(i)
+        result = RunSimulation() + 1  # for log scale
+        ax.cla()
+        im = ax.imshow(result, vmax=1e3,
+                 norm=matplotlib.colors.LogNorm(),
+                 extent=[-4.0, 4.0, 0, 8.0])
+        plt.xlabel(r'$\phi_f$', fontsize=20)
+        plt.ylabel(r'$\alpha_f$', fontsize=20)
+        if i==0:
+            plt.colorbar(im)
+        fname = '_tmp%03d.png'%i
+        print 'Saving frame', fname
+        try:
+            fig.savefig(fname)
+        except IOError as e:
+            print "Frame cannot be saved. I/O error({0}): {1}".format(e.errno, e.strerror)
+            print "Copy these examples to the directory where you have a write permission and enough free space to save the movie."
+            sys.exit()
+        except:
+            print "Frame cannot be saved. Error:", sys.exc_info()[0]
+            sys.exit()
+        else:
+            files.append(fname)
+
+    try:
+        os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10 -ovc lavc -lavcopts vcodec=wmv2 -oac copy -o animation3.mpg")
+        print 'Removing temporary files'
+        os.system("rm _tmp*")
+    except:
+        print "Movie cannot be saved. Error:", sys.exc_info()[0]
+        sys.exit()
+
diff --git a/Examples/README b/Examples/README
new file mode 100644
index 0000000..842adb8
--- /dev/null
+++ b/Examples/README
@@ -0,0 +1,9 @@
+BornAgain usage examples.
+
+This directory contains three sets of examples aimed to demonstrate 
+to the user how to simulate and fit with BornAgain.
+
+Content:
+./python - A number of python examples ( <--- First thing to look at)
+./cpp    - Single example how to compile standalone C++ application
+./Demos  - A collection of scripts used in different demonstrations
diff --git a/Examples/cpp/CylindersAndPrisms/CMakeLists.txt b/Examples/cpp/CylindersAndPrisms/CMakeLists.txt
new file mode 100644
index 0000000..52799ca
--- /dev/null
+++ b/Examples/cpp/CylindersAndPrisms/CMakeLists.txt
@@ -0,0 +1,32 @@
+#  BornAgain: simulate and fit scattering at grazing incidence
+#
+#  @file      Examples/cpp/CylindersAndPrisms/CMakeLists.txt
+#  @brief     Demonstrates how to compile a main program that uses the BornAgain C++ API.
+#
+#  @homepage  http://www.bornagainproject.org
+#  @license   GNU General Public License v3 or higher (see COPYING)
+#  @copyright Forschungszentrum Jülich GmbH 2016
+#  @authors   Scientific Computing Group at MLZ Garching
+#  @authors   J. Burle, C. Durniak, J. M. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+
+cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
+
+project(CylindersAndPrisms)
+
+add_executable(CylindersAndPrisms CylindersAndPrisms.cpp)
+
+# path to the cmake modules
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/../modules)
+
+# find libraries
+find_package(BornAgain REQUIRED)
+find_package(Eigen3 REQUIRED)
+
+include_directories(
+    ${EIGEN3_INCLUDE_DIR}
+    ${BORNAGAIN_INCLUDE_DIR}
+)
+
+target_link_libraries(CylindersAndPrisms
+    ${BORNAGAIN_LIBRARIES}
+)
diff --git a/Examples/cpp/CylindersAndPrisms/CylindersAndPrisms.cpp b/Examples/cpp/CylindersAndPrisms/CylindersAndPrisms.cpp
new file mode 100644
index 0000000..c8a0127
--- /dev/null
+++ b/Examples/cpp/CylindersAndPrisms/CylindersAndPrisms.cpp
@@ -0,0 +1,67 @@
+// ********************************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Examples/cpp/CylindersAndPrisms/CylindersAndPrisms.cpp
+//! @brief     Demonstrates how to run a BornAgain simulation from a C++ main program.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   J. Burle, C. Durniak, J. M. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ********************************************************************************************** //
+
+#include "FormFactorCylinder.h"
+#include "FormFactorPrism3.h"
+#include "GISASSimulation.h"
+#include "Histogram2D.h"
+#include "IntensityDataIOFactory.h"
+#include "Layer.h"
+#include "Materials.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "ParticleLayout.h"
+#include "Simulation.h"
+#include "Units.h"
+
+int main()
+{
+    // Define the sample
+    HomogeneousMaterial air_material("Air", 0., 0.);
+    HomogeneousMaterial substrate_material("Substrate", 6e-6, 2e-8);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    ParticleLayout particle_layout;
+    HomogeneousMaterial particle_material("Particle", 6e-4, 2e-8);
+
+    Particle cylinder(particle_material,
+                      FormFactorCylinder(5*Units::nanometer, 5*Units::nanometer));
+    particle_layout.addParticle(cylinder, 0.5);
+
+    Particle prism(particle_material,
+                   FormFactorPrism3(10*Units::nanometer, 5*Units::nanometer));
+    particle_layout.addParticle(prism, 0.5);
+
+    air_layer.addLayout(particle_layout);
+
+    MultiLayer sample;
+    sample.addLayer(air_layer);
+    sample.addLayer(substrate_layer);
+
+    // Define the simulation
+    GISASSimulation simulation;
+    simulation.setDetectorParameters(400, -1.0*Units::degree, 1.0*Units::degree,
+                                     400,  0.0*Units::degree, 2.0*Units::degree);
+    simulation.setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    simulation.setSample(sample);
+
+    // Run the simulation, and store the result
+    simulation.runSimulation();
+    const Histogram2D* result = simulation.getIntensityData();
+    IntensityDataIOFactory::writeIntensityData(*result, "result.int");
+    return 0;
+}
diff --git a/Examples/cpp/CylindersAndPrisms/README b/Examples/cpp/CylindersAndPrisms/README
new file mode 100644
index 0000000..87e6971
--- /dev/null
+++ b/Examples/cpp/CylindersAndPrisms/README
@@ -0,0 +1,43 @@
+This example demonstrates how to use the BornAgain core C++ API.
+
+GISAS from mixture of uncorrelated cylinders and prisms is simulated,
+and the result is stored in a file result.int.
+
+How to compile and run the example.
+
+-------------------------------------------------------------------------------
+0) Update FindBornAgain.cmake
+-------------------------------------------------------------------------------
+Increment hard-coded BornAgain version in ../modules/FindBornAgain.cmake
+
+-------------------------------------------------------------------------------
+1) Install third party software
+-------------------------------------------------------------------------------
+Required:
+* compilers: as for compiling BornAgain
+* cmake, Eigen3: as for BornAgain
+
+-------------------------------------------------------------------------------
+2) Setup BornAgain library
+-------------------------------------------------------------------------------
+* install BornAgain library
+* add BornAgain libraries to path by running: source <BornAgain_install_dir>/bin/thisbornagain.sh
+
+-------------------------------------------------------------------------------
+3) Build given example with CMake
+-------------------------------------------------------------------------------
+mkdir <build_dir>
+cd <build_dir>
+cmake <this_source_dir>
+make
+
+-------------------------------------------------------------------------------
+4) Run the simulation
+-------------------------------------------------------------------------------
+cd <build_dir>
+./CylindersAndPrisms
+
+-------------------------------------------------------------------------------
+5) Inspect result
+-------------------------------------------------------------------------------
+<bornagain>/Examples/python/utils/plot_intensity_data.py result.int
\ No newline at end of file
diff --git a/Examples/cpp/README b/Examples/cpp/README
new file mode 100644
index 0000000..9ed918a
--- /dev/null
+++ b/Examples/cpp/README
@@ -0,0 +1,12 @@
+This folder demonstrates how to use the BornAgain C++ API.
+
+Using this API, one can write C++ programs that use libBornAgainCore
+to perform simulations, and libBornAgainFit to perform fits. This
+may be of interest when integrating BornAgain into a larger framework.
+
+In general, however, it is much more convenient to run BornAgain
+through its Python API.
+
+Currently, this directory contains only one example:
+
+CylindersAndPrisms/
\ No newline at end of file
diff --git a/Examples/cpp/modules/FindBornAgain.cmake b/Examples/cpp/modules/FindBornAgain.cmake
new file mode 100644
index 0000000..81253fd
--- /dev/null
+++ b/Examples/cpp/modules/FindBornAgain.cmake
@@ -0,0 +1,57 @@
+#  BornAgain: simulate and fit scattering at grazing incidence
+#
+#  @file      Examples/cpp/modules/FindBornAgain.cmake
+#  @brief     Finds BornAgain installation
+#
+#  Usage:     find_package(BornAgain REQUIRED)
+#
+#  Outcome:   defines
+#             - BORNAGAIN_INCLUDE_DIR  PATH to the include directory
+#             - BORNAGAIN_LIBRARIES    BornAgain libraries
+#
+#  @homepage  http://www.bornagainproject.org
+#  @license   GNU General Public License v3 or higher (see COPYING)
+#  @copyright Forschungszentrum Jülich GmbH 2016
+#  @authors   Scientific Computing Group at MLZ Garching
+#  @authors   J. Burle, C. Durniak, J. M. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+
+
+set(BORNAGAINSYS $ENV{BORNAGAINSYS})
+
+if(BORNAGAINSYS)
+    set(BORNAGAIN_LIBRARY_DIR ${BORNAGAINSYS}/lib/BornAgain-1.6)
+    set(BORNAGAIN_INCLUDE_DIR ${BORNAGAINSYS}/include/BornAgain-1.6)
+endif()
+
+find_library (BORNAGAIN_CORE _libBornAgainCore.so
+    PATHS ${BORNAGAIN_LIBRARY_DIR}
+    HINTS ${BORNAGAIN_LIBRARY_DIR}
+)
+
+find_library (BORNAGAIN_FIT _libBornAgainFit.so
+    PATHS ${BORNAGAIN_LIBRARY_DIR}
+    HINTS ${BORNAGAIN_LIBRARY_DIR}
+)
+set(BORNAGAIN_LIBRARIES ${BORNAGAIN_CORE} ${BORNAGAIN_FIT})
+
+find_path(BORNAGAIN_INCLUDE_DIR BAVersion.h
+    PATHS /usr/include /usr/local/include /opt/local/include ${BORNAGAIN_INCLUDE_DIR}
+    PATH_SUFFIXES BornAgain
+    HINTS ${BORNAGAIN_INCLUDE_DIR}
+)
+
+# 32-bits systems require special Eigen options
+execute_process(COMMAND uname -m OUTPUT_VARIABLE SYSCTL_OUTPUT)
+if(NOT ${SYSCTL_OUTPUT} MATCHES x86_64)
+    add_definitions(-DEIGEN_DONT_ALIGN_STATICALLY=1)
+endif()
+
+message(STATUS "BORNAGAIN_LIBRARIES   ${BORNAGAIN_LIBRARIES}")
+message(STATUS "BORNAGAIN_INCLUDE_DIR ${BORNAGAIN_INCLUDE_DIR}")
+mark_as_advanced(BORNAGAIN_LIBRARIES BORNAGAIN_INCLUDE_DIR)
+
+if(NOT BORNAGAIN_LIBRARIES OR NOT BORNAGAIN_INCLUDE_DIR)
+   if(BornAgain_FIND_REQUIRED)
+       message( FATAL_ERROR "FindBornAgain: can't find BornAgain header or library" )
+   endif()
+endif()
diff --git a/Examples/python/README b/Examples/python/README
new file mode 100644
index 0000000..26f92a3
--- /dev/null
+++ b/Examples/python/README
@@ -0,0 +1,9 @@
+BornAgain usage examples.
+
+This directory contains two sets of Python examples
+that demonstrate how to simulate and fit with BornAgain.
+
+Content:
+./simulation - simulation examples
+./fitting    - fitting examples
+./utils      - utilities to plot simulated detector images
\ No newline at end of file
diff --git a/Examples/python/fitting/README b/Examples/python/fitting/README
new file mode 100644
index 0000000..fed58c0
--- /dev/null
+++ b/Examples/python/fitting/README
@@ -0,0 +1,58 @@
+BornAgain fitting examples.
+
+In this directory one can find examples of complete applications
+used for fitting.
+
+--- ex01_SampleParametersIntro ---
+    This example shows how to create a sample with fixed parameters and then
+    change this parameters on the fly during runtime.
+    The example doesn't contain any fitting and serve as a gentle introduction
+    to other fitting examples.
+
+--- ex02_FitCylindersAndPrisms ---
+    The model "mixture of cylinders and prisms without interference"
+    will be used to fit real data.
+    FitCylindersAndPrisms.py shows minimal fitting example
+    FitCylindersAndPrisms_detailed.py is more detailed version + some graphical output
+
+--- ex03_FitSpheresInHexLattice ---
+    Two parameter fit of spheres in a hex lattice.
+    FitSpheresInHexLattice.py - demonstrate standard approach
+    FitSpheresInHexLattice_builder.py - shows advanced way using sample builder, which might be useful for complex
+    samples
+
+--- ex04_FitScaleAndShift ---
+    FitScaleAndShift.py - in this example we are trying to fit the data representing cylinders without interference
+    on top of substrate. Real data contains some "unknown" background and scale factors.
+    In four parameters fit we are looking for cylinder's height, radius and for background and scale factors.
+
+--- ex05_FitWithMasks ---
+    FitWithMasks.py - two parameter fit of cylinders without interference.
+    Real data contains various masks to simulate and fit only the area outside the masks.
+
+--- ex06_FitStrategies ---
+    FitStrategyAdjustMinimizer.py - in this example we are trying to find cylinder's height and radius using chain
+    of minimizers. During the first fit round Genetic minimizer will be used. It will roughly look for possible
+    minimas. After it is done, the second Minuit2 minimizer will continue to find the precise location of global
+    minima.
+
+--- ex07_FitAlongSlices ---
+    FitAlongSlices.py - here we demonstrate how to fit along slices.
+    The basic idea is to mask all detector except thin lines, one vertical and one horizontal, representing slices.
+    This will make simulation and fitting to go along slices only.
+
+--- ex08_SimultaneousFitOfTwoDatasets ---
+    SimultaneousFitOfTwoDatasets.py - simultaneous fit of two datasets.
+    Suppose that we have same sample measured for two different incident angles. We are going to fit both datasets
+    simultaneously to find unknown sample parameters.
+    To do this, we define one dataset ( a pair of real_data and simulation model) for the first incidence angle
+    and another pair of (real_data, simulation model) for the second incidence angle.
+    We add both pairs to the FitSuite and run fitting as usual.
+
+--- ex10_ImportUserData
+    This directory contains examples for importing raw X,Y detector data into BornAgain's
+    IntensityData object (phi_f, alpha_f space)
+    ImportMariaData.py - in this example we load ASCII data from Maria reflectometer
+    ImportGALAXIDate.py - in this example tiff data from small-angle X-ray diffractometer GALAXI are loaded. 
+                          To run this example you may need to install the python gdal module. 
+                          See https://pypi.python.org/pypi/GDAL/ for installation instruction.
diff --git a/Examples/python/fitting/ex01_SampleParametersIntro/SampleParametersIntro.py b/Examples/python/fitting/ex01_SampleParametersIntro/SampleParametersIntro.py
new file mode 100644
index 0000000..557cb7e
--- /dev/null
+++ b/Examples/python/fitting/ex01_SampleParametersIntro/SampleParametersIntro.py
@@ -0,0 +1,124 @@
+"""
+Working with sample parameters.
+
+This example shows how to create a sample with fixed parameters, and then change
+these parameters on the fly during runtime. The example doesn't contain any
+fitting; it serves as a gentle introduction to other fitting examples.
+"""
+
+from __future__ import print_function
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample():
+    """
+    Returns a sample with uncorrelated cylinders and prisms on a substrate.
+    Parameter set is fixed.
+    """
+    # defining materials
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    prism_ff = ba.FormFactorPrism3(5*nm, 5*nm)
+    prism = ba.Particle(m_particle, prism_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 0.5)
+    particle_layout.addParticle(prism, 0.5)
+    interference = ba.InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def simulate():
+    """
+    Runs simulations for the sample with different sample parameters.
+    """
+
+    sample = get_sample()
+    print("The tree structure of the sample")
+    print( sample.to_str() )
+
+    print("The sample contains following parameters ('name':value)")
+    sample.printParameters()
+
+    simulation = get_simulation()
+
+    results = {}
+
+    # simulation #1
+    # initial sample is used
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    results[0] = simulation.getIntensityData()
+
+    # simulation #2
+    # one sample parameter (cylinder height) is changed using exact parameter name
+    sample.setParameterValue(
+        "/MultiLayer/Layer0/ParticleLayout/Particle0/Cylinder/Height",
+        10.0*nm)
+
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    results[1] = simulation.getIntensityData()
+
+    # simulation #3
+    # all parameters matching criteria will be changed (cylinder height in this case)
+    sample.setParameterValue("*/Cylinder/Height", 100.0*nm)
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    results[2] = simulation.getIntensityData()
+
+    # simulation #4
+    # all parameters which are matching criteria will be changed
+    sample.setParameterValue("*/Cylinder/Height", 10.0*nm)
+    sample.setParameterValue("*/Prism3/*", 10.0*nm)
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    results[3] = simulation.getIntensityData()
+
+    return results
+
+
+def plot(results):
+    """
+    Draw results of several simulations on canvas
+    """
+    import matplotlib
+    from matplotlib import pyplot as plt
+    plt.figure(1)
+    for nplot, hist in results.items():
+        plt.subplot(2, 2, nplot+1)
+        plt.imshow(
+            hist.getArray(),
+            norm=matplotlib.colors.LogNorm(1, hist.getMaximum()),
+            extent=[hist.getXmin()/deg, hist.getXmax()/deg,
+                    hist.getYmin()/deg, hist.getYmax()/deg])
+    plt.show()
+
+
+if __name__ == '__main__':
+    ba.simulateThenPlotOrSave(simulate, plot)
diff --git a/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms.py b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms.py
new file mode 100644
index 0000000..1a5f981
--- /dev/null
+++ b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms.py
@@ -0,0 +1,79 @@
+"""
+Fitting example: 4 parameters fit with simple output
+"""
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample():
+    """
+    Returns a sample with uncorrelated cylinders and prisms on a substrate.
+    """
+    # defining materials
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(1.0*nm, 1.0*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    prism_ff = ba.FormFactorPrism3(1.0*nm, 1.0*nm)
+    prism = ba.Particle(m_particle, prism_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 0.5)
+    particle_layout.addParticle(prism, 0.5)
+    interference = ba.InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_fitting():
+    """
+    run fitting
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    real_data = ba.IntensityDataIOFactory.readIntensityData(
+        'refdata_fitcylinderprisms.int.gz')
+
+    fit_suite = ba.FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    fit_suite.initPrint(10)
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*Cylinder/Height", 4.*nm).setLowerLimited(0.01)
+    fit_suite.addFitParameter("*Cylinder/Radius", 6.*nm).setLowerLimited(0.01)
+    fit_suite.addFitParameter("*Prism3/Height", 4.*nm).setLowerLimited(0.01)
+    fit_suite.addFitParameter("*Prism3/BaseEdge", 12.*nm).setLowerLimited(0.01)
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for par in fit_suite.fitParameters():
+        print(par.name(), par.value(), par.error())
+
+if __name__ == '__main__':
+    run_fitting()
diff --git a/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms_detailed.py b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms_detailed.py
new file mode 100644
index 0000000..f2b1633
--- /dev/null
+++ b/Examples/python/fitting/ex02_FitCylindersAndPrisms/FitCylindersPrisms_detailed.py
@@ -0,0 +1,182 @@
+"""
+Fitting example: 4 parameters fit with simple output
+This is more detailed version of ba.FitCylindersPrisms.py.
+We show how to generate "real" data and how to draw fit progress.
+Please take a note, that performance here is determined
+by poor performance of matplotlib drawing routines.
+"""
+
+import math
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample(cylinder_height=1.0*nm, cylinder_radius=1.0*nm,
+               prism_length=2.0*nm, prism_height=1.0*nm):
+    """
+    Returns a sample with uncorrelated cylinders and prisms on a substrate.
+    """
+    # defining materials
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(cylinder_radius, cylinder_height)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    prism_ff = ba.FormFactorPrism3(prism_length, prism_height)
+    prism = ba.Particle(m_particle, prism_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 0.5)
+    particle_layout.addParticle(prism, 0.5)
+    interference = ba.InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise to the simulated data.
+    This function has been used once to generate refdata_fitcylinderprisms.int
+    located in same directory.
+    """
+    # creating sample with set of parameters we will later try to find during the fit
+    sample = get_sample(5.0*nm, 5.0*nm, 5.0*nm, 5.0*nm)
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 1.0
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 0.1:
+            noisy_amplitude = 0.1
+        real_data.setBinContent(i, noisy_amplitude)
+
+    # uncomment line to save generated data on disk
+    #IntensityDataIOFactory.writeIntensityData(
+    #  real_data, 'refdata_fitcylinderprisms.int')
+    return real_data
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+class DrawObserver(ba.IFitObserver):
+    """
+    Draws fit progress every nth iteration.
+    This class has to be attached to ba.FitSuite via attachObserver method.
+    ba.FitSuite kernel will call DrawObserver's update() method every n'th iteration.
+    It is up to the user what to do here.
+    """
+
+    def __init__(self, draw_every_nth=10):
+        import matplotlib
+        from matplotlib import pyplot as plt
+        global matplotlib, plt
+        ba.IFitObserver.__init__(self, draw_every_nth)
+        self.fig = plt.figure(figsize=(10.25, 7.69))
+        self.fig.canvas.draw()
+        plt.ion()
+
+    def plot(self, data, title, nplot, min=1, max=1e6):
+        plt.subplot(2, 2, nplot)
+        plt.subplots_adjust(wspace=0.2, hspace=0.2)
+        im = plt.imshow(
+            data.getArray(),
+            norm=matplotlib.colors.LogNorm(min, max),
+            extent=[data.getXmin()/deg, data.getXmax()/deg,
+                    data.getYmin()/deg, data.getYmax()/deg])
+        plt.colorbar(im)
+        plt.title(title)
+
+    def update(self, fit_suite):
+        self.fig.clf()
+        real_data = fit_suite.getRealData()
+        self.plot(real_data, "\"Real\" data",
+                  nplot=1, min=1.0, max=real_data.getMaximum())
+        self.plot(fit_suite.getSimulationData(), "Simulated data",
+                  nplot=2, min=1.0, max=real_data.getMaximum())
+        self.plot(fit_suite.getChiSquaredMap(), "Chi2 map",
+                  nplot=3, min=0.001, max=10.0)
+
+        plt.subplot(2, 2, 4)
+        plt.title('Parameters')
+        plt.axis('off')
+        plt.text(0.01, 0.85, "Iterations  " + '{:d}     {:s}'.
+                 format(fit_suite.numberOfIterations(),
+                        fit_suite.minimizer().minimizerName()))
+        plt.text(0.01, 0.75, "Chi2       " + '{:8.4f}'.format(fit_suite.getChi2()))
+        for index, fitPar in enumerate(fit_suite.fitParameters()):
+            plt.text(0.01, 0.55 - index*0.1,
+                     '{:30.30s}: {:6.3f}'.format(fitPar.name(), fitPar.value()))
+        plt.draw()
+        plt.pause(0.01)
+
+        if fit_suite.isLastIteration():
+            plt.ioff()
+
+
+def run_fitting():
+    """
+    Setup simulation and fit
+    """
+
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    real_data = create_real_data()
+
+    fit_suite = ba.FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+
+    # fit_suite.setMinimizer("Minuit2", "Migrad")  # ba.Default
+    # fit_suite.setMinimizer("Minuit2", "Fumili")
+    # fit_suite.setMinimizer("GSLLMA")
+
+    fit_suite.initPrint(10)
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*Cylinder/Height", 4.*nm).setLowerLimited(0.01)
+    fit_suite.addFitParameter("*Cylinder/Radius", 6.*nm).setLowerLimited(0.01)
+    fit_suite.addFitParameter("*Prism3/Height", 4.*nm).setLowerLimited(0.01)
+    fit_suite.addFitParameter("*Prism3/BaseEdge", 12.*nm).setLowerLimited(0.01)
+
+    draw_observer = DrawObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+
+    fit_suite.runFit()
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+    return fit_suite
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex02_FitCylindersAndPrisms/refdata_fitcylinderprisms.int.gz b/Examples/python/fitting/ex02_FitCylindersAndPrisms/refdata_fitcylinderprisms.int.gz
new file mode 100644
index 0000000..ab2560d
Binary files /dev/null and b/Examples/python/fitting/ex02_FitCylindersAndPrisms/refdata_fitcylinderprisms.int.gz differ
diff --git a/Examples/python/fitting/ex03_FitSpheresInHexLattice/FitSpheresInHexLattice.py b/Examples/python/fitting/ex03_FitSpheresInHexLattice/FitSpheresInHexLattice.py
new file mode 100644
index 0000000..86353d5
--- /dev/null
+++ b/Examples/python/fitting/ex03_FitSpheresInHexLattice/FitSpheresInHexLattice.py
@@ -0,0 +1,112 @@
+"""
+Two parameter fit of spheres in a hex lattice.
+"""
+
+from matplotlib import pyplot as plt
+import math
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample(radius=5*nm, lattice_constant=10*nm):
+    """
+    Returns a sample with cylinders and pyramids on a substrate,
+    forming a hexagonal lattice.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    sphere_ff = ba.FormFactorFullSphere(radius)
+    sphere = ba.Particle(m_particle, sphere_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(sphere)
+
+    interference = ba.InterferenceFunction2DLattice.createHexagonal(lattice_constant)
+    pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm)
+    interference.setDecayFunction(pdf)
+
+    particle_layout.addInterferenceFunction(interference)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise to the simulated data.
+    """
+    sample = get_sample(5.0*nm, 10.0*nm)
+
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 0.1
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 0.1:
+            noisy_amplitude = 0.1
+        real_data.setBinContent(i, noisy_amplitude)
+    return real_data
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+    sample = get_sample()
+    sample.printParameters()
+    simulation.setSample(sample)
+
+    real_data = create_real_data()
+
+    fit_suite = ba.FitSuite()
+    #fit_suite.setMinimizer("GSLLMA")
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    fit_suite.initPrint(10)
+
+    draw_observer = ba.DefaultFitObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+
+    # this fit parameter will change both length_1 and length_2 simultaneously
+    fit_suite.addFitParameter(
+        "*2DLattice/LatticeLength*", 8.*nm, ba.AttLimits.limited(4., 12.))
+    fit_suite.addFitParameter(
+        "*/FullSphere/Radius", 8.*nm, ba.AttLimits.limited(4., 12.))
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex03_FitSpheresInHexLattice/FitSpheresInHexLattice_builder.py b/Examples/python/fitting/ex03_FitSpheresInHexLattice/FitSpheresInHexLattice_builder.py
new file mode 100644
index 0000000..2c07afb
--- /dev/null
+++ b/Examples/python/fitting/ex03_FitSpheresInHexLattice/FitSpheresInHexLattice_builder.py
@@ -0,0 +1,131 @@
+"""
+Two parameter fit of spheres in a hex lattice.
+Sample builder approach is used.
+"""
+
+import math
+import random
+import ctypes
+import bornagain as ba
+from matplotlib import pyplot as plt
+from bornagain import deg, angstrom, nm
+
+
+class MySampleBuilder(ba.IMultiLayerBuilder):
+    """
+    Sample builder is used to build complex samples from set of parameters.
+    Given builder produces the sample representing spheres at hex lattice
+    using two parameters as an input:
+    radius - radius of spheres
+    lattice_constant - hexagonal lattice constant
+    """
+    def __init__(self):
+        ba.IMultiLayerBuilder.__init__(self)
+        self.sample = None
+        # parameters describing the sample
+        self.radius = ctypes.c_double(5.0*nm)
+        self.lattice_constant = ctypes.c_double(10.0*nm)
+        # register parameters
+        self.registerParameter("radius", ctypes.addressof(self.radius))
+        self.registerParameter("lattice_constant",
+                               ctypes.addressof(self.lattice_constant))
+
+    # constructs the sample for current values of parameters
+    def buildSample(self):
+        m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+        m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+        m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+        sphere_ff = ba.FormFactorFullSphere(self.radius.value)
+        sphere = ba.Particle(m_particle, sphere_ff)
+        particle_layout = ba.ParticleLayout()
+        particle_layout.addParticle(sphere)
+
+        interference = ba.InterferenceFunction2DLattice.createHexagonal(
+            self.lattice_constant.value)
+        pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm)
+        interference.setDecayFunction(pdf)
+
+        particle_layout.addInterferenceFunction(interference)
+
+        air_layer = ba.Layer(m_air)
+        air_layer.addLayout(particle_layout)
+        substrate_layer = ba.Layer(m_substrate, 0)
+        multi_layer = ba.MultiLayer()
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(substrate_layer)
+        return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+
+    return simulation
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise to the simulated data.
+    """
+    sample_builder = MySampleBuilder()
+    sample_builder.setParameterValue("radius", 5.0*nm)
+    sample_builder.setParameterValue("lattice_constant", 10.0*nm)
+
+    simulation = get_simulation()
+    simulation.setSampleBuilder(sample_builder)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 0.1
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 0.1:
+            noisy_amplitude = 0.1
+        real_data.setBinContent(i, noisy_amplitude)
+    return real_data
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+    simulation.setSampleBuilder(MySampleBuilder())
+    simulation.printParameters()
+
+    real_data = create_real_data()
+
+    fit_suite = ba.FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    fit_suite.initPrint(1)
+
+    draw_observer = ba.DefaultFitObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*radius", 8.*nm, ba.AttLimits.limited(4., 12.))
+    fit_suite.addFitParameter("*lattice_constant",
+                              8.*nm, ba.AttLimits.limited(4., 12.))
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex04_FitScaleAndShift/FitScaleAndShift.py b/Examples/python/fitting/ex04_FitScaleAndShift/FitScaleAndShift.py
new file mode 100644
index 0000000..30958e1
--- /dev/null
+++ b/Examples/python/fitting/ex04_FitScaleAndShift/FitScaleAndShift.py
@@ -0,0 +1,132 @@
+"""
+Fitting example: looking for background and scale factors.
+
+Real data contains some "unknown" background and scale factors.
+In the fit we are trying to find cylinder radius and height,
+scale and background factors.
+"""
+
+from __future__ import print_function
+from matplotlib import pyplot as plt
+import math
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample(radius=5*nm, height=10*nm):
+    """
+    Build the sample representing cylinders on top of substrate without interference.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    cylinder_ff = ba.FormFactorCylinder(radius, height)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    simulation.setBeamIntensity(1e12)
+    return simulation
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise, background and scale
+    to the simulated data.
+    Cylinder radius is set to 5nm, cylinder height to 10nm.
+    During the fit we will try to find cylinder height and radius and
+    scale, background factors.
+    """
+    sample = get_sample(5.0*nm, 10.0*nm)
+
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    scale = 2.0
+    background = 100
+    real_data.scale(scale)
+
+    # spoil simulated data with the noise, and add background to produce "real" data
+    noise_factor = 1.0
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 1.0:
+            noisy_amplitude = 1.0
+        real_data.setBinContent(i, noisy_amplitude + background)
+    return real_data
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+    sample = get_sample()
+
+    simulation.setSample(sample)
+
+    real_data = create_real_data()
+
+    fit_suite = ba.FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+
+    chiModule = ba.ChiSquaredModule()
+    chiModule.setIntensityNormalizer(ba.IntensityScaleAndShiftNormalizer())
+    fit_suite.setChiSquaredModule(chiModule)
+
+    fit_suite.initPrint(10)
+
+    draw_observer = ba.DefaultFitObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+
+    # print all defined parameters for sample and simulation
+    fit_suite.fitObjects().printParameters()
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*/Cylinder/Radius", 6.*nm,
+                              ba.AttLimits.limited(4., 8.))
+    fit_suite.addFitParameter("*/Cylinder/Height", 9.*nm,
+                              ba.AttLimits.limited(8., 12.))
+    fit_suite.addFitParameter("*/Normalizer/scale", 1.5,
+                              ba.AttLimits.limited(1.0, 3.0))
+    fit_suite.addFitParameter("*/Normalizer/shift", 50.,
+                              ba.AttLimits.limited(1, 500.))
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex05_FitWithMasks/FitWithMasks.py b/Examples/python/fitting/ex05_FitWithMasks/FitWithMasks.py
new file mode 100644
index 0000000..a169874
--- /dev/null
+++ b/Examples/python/fitting/ex05_FitWithMasks/FitWithMasks.py
@@ -0,0 +1,157 @@
+"""
+Fitting example: fit with masks
+"""
+
+from __future__ import print_function
+from matplotlib import pyplot as plt
+import math
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample(radius=5*nm, height=10*nm):
+    """
+    Build the sample representing cylinders on top of
+    substrate without interference.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    cylinder_ff = ba.FormFactorCylinder(radius, height)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise to the simulated data.
+    """
+    sample = get_sample(5.0*nm, 10.0*nm)
+
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 0.5
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 1.0:
+            noisy_amplitude = 1.0
+        real_data.setBinContent(i, noisy_amplitude)
+    return real_data
+
+
+def add_mask_to_simulation(simulation):
+    """
+    Here we demonstrate how to add masks to the simulation.
+    Only unmasked areas will be simulated and then used during the fit.
+
+    Masks can have different geometrical shapes (ba.Rectangle, ba.Ellipse, Line)
+    with the mask value either "True" (detector bin is excluded from the simulation)
+    or False (will be simulated).
+
+    Every subsequent mask override previously defined masks in this area.
+
+    In the code below we put masks in such way that simulated image will look like
+    a Pac-Man from ancient arcade game.
+    """
+    # mask all detector (put mask=True to all detector channels)
+    simulation.maskAll()
+
+    # set mask to simulate pacman's head
+    simulation.addMask(
+        ba.Ellipse(0.0*deg, 1.0*deg, 0.5*deg, 0.5*deg), False)
+
+    # set mask for pacman's eye
+    simulation.addMask(
+        ba.Ellipse(0.11*deg, 1.25*deg, 0.05*deg, 0.05*deg), True)
+
+    # set mask for pacman's mouth
+    points = [[0.0*deg, 1.0*deg], [0.5*deg, 1.2*deg],
+              [0.5*deg, 0.8*deg], [0.0*deg, 1.0*deg]]
+    simulation.addMask(ba.Polygon(points), True)
+
+    # giving pacman something to eat
+    simulation.addMask(
+        ba.Rectangle(0.45*deg, 0.95*deg, 0.55*deg, 1.05*deg), False)
+    simulation.addMask(
+        ba.Rectangle(0.61*deg, 0.95*deg, 0.71*deg, 1.05*deg), False)
+    simulation.addMask(
+        ba.Rectangle(0.75*deg, 0.95*deg, 0.85*deg, 1.05*deg), False)
+
+    # other mask's shapes are possible too
+    # simulation.removeMasks()
+    # # rotated ellipse:
+    # simulation.addMask(ba.Ellipse(0.11*deg, 1.25*deg,
+    #                    1.0*deg, 0.5*deg, 45.0*deg), True)
+    # simulation.addMask(Line(-1.0*deg, 0.0*deg, 1.0*deg, 2.0*deg), True)
+    # simulation.addMask(ba.HorizontalLine(1.0*deg), False)
+    # simulation.addMask(ba.VerticalLine(0.0*deg), False)
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+    sample = get_sample()
+    simulation.setSample(sample)
+
+    # the core method of this example which adds masks to the simulation
+    add_mask_to_simulation(simulation)
+
+    real_data = create_real_data()
+
+    fit_suite = ba.FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    fit_suite.initPrint(10)
+    draw_observer = ba.DefaultFitObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*/Cylinder/Radius", 6.*nm).setLimited(4., 8.)
+    fit_suite.addFitParameter("*/Cylinder/Height", 9.*nm).setLimited(8., 12.)
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    fit_suite.printResults()
+    print("chi2:", fit_suite.getChi2())
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex06_FitStrategies/FitStrategyAdjustMinimizer.py b/Examples/python/fitting/ex06_FitStrategies/FitStrategyAdjustMinimizer.py
new file mode 100644
index 0000000..61cebc2
--- /dev/null
+++ b/Examples/python/fitting/ex06_FitStrategies/FitStrategyAdjustMinimizer.py
@@ -0,0 +1,128 @@
+"""
+Two parameter fit of cylinders.
+In this example we are trying to find cylinder's height and radius
+using chain of minimizers.
+
+During the first fit round Genetic minimizer will be used.
+It will roughly look for possible local minimas.
+After it is done, the second Minuit2 minimizer will continue
+to find the precise location of best minima found on previous step.
+"""
+
+from __future__ import print_function
+from matplotlib import pyplot as plt
+import math
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample(radius=5*nm, height=5*nm):
+    """
+    Returns a sample with uncorrelated cylinders and pyramids on a substrate.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    cylinder_ff = ba.FormFactorCylinder(radius, height)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, 0.0*deg, 2.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise to the simulated data.
+    """
+    sample = get_sample(5.0*nm, 5.0*nm)
+
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 0.1
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 0.1:
+            noisy_amplitude = 0.1
+        real_data.setBinContent(i, noisy_amplitude)
+    return real_data
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+    sample = get_sample()
+    simulation.setSample(sample)
+
+    real_data = create_real_data()
+
+    fit_suite = ba.FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    fit_suite.initPrint(10)
+
+    draw_observer = ba.DefaultFitObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+
+    # setting fitting parameters with starting values
+    # Here we select starting values being quite far from true values
+    # to puzzle our minimizer's as much as possible
+    fit_suite.addFitParameter("*Height", 1.*nm).setLimited(0.01, 30.)\
+        .setStep(0.05*nm)
+    fit_suite.addFitParameter("*Radius", 20.*nm).setLimited(0.01, 30.)\
+        .setStep(0.05*nm)
+
+    # Now we create first fig strategy which will run first minimization round
+    # using the Genetic minimizer.
+    # The Genetic minimizer is able to explore large parameter space
+    # without being trapped by some local minima.
+    strategy1 = ba.AdjustMinimizerStrategy("Genetic", "", "MaxIterations=2")
+    fit_suite.addFitStrategy(strategy1)
+
+    # Second fit strategy will use another minimizer.
+    # It starts from best parameters found in previous minimization
+    # and then continues until fit converges.
+    strategy2 = ba.AdjustMinimizerStrategy("Minuit2", "Migrad")
+    fit_suite.addFitStrategy(strategy2)
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex07_FitAlongSlices/FitAlongSlices.py b/Examples/python/fitting/ex07_FitAlongSlices/FitAlongSlices.py
new file mode 100644
index 0000000..a17a7eb
--- /dev/null
+++ b/Examples/python/fitting/ex07_FitAlongSlices/FitAlongSlices.py
@@ -0,0 +1,213 @@
+"""
+Fitting example: fit along slices
+"""
+
+from __future__ import print_function
+import matplotlib
+from matplotlib import pyplot as plt
+import math
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+import numpy
+
+phi_slice_value = 0.0*deg  # position of vertical slice
+alpha_slice_value = 0.2*deg  # position of horizontal slice
+
+
+def get_sample(radius=5*nm, height=10*nm):
+    """
+    Returns a sample with uncorrelated cylinders on a substrate.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    cylinder_ff = ba.FormFactorCylinder(radius, height)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, -1.0*deg, 1.0*deg,
+                                     100, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def create_real_data():
+    """
+    Generating "real" data by adding noise to the simulated data.
+    """
+    sample = get_sample(5.0*nm, 10.0*nm)
+
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 1.0
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 1.0:
+            noisy_amplitude = 1.0
+        real_data.setBinContent(i, noisy_amplitude)
+    return real_data
+
+
+class DrawObserver(ba.IFitObserver):
+    """
+    Draws fit progress every nth iteration. Here we plot slices along real
+    and simulated images to see fit progress.
+    """
+
+    def __init__(self, draw_every_nth=10):
+        ba.IFitObserver.__init__(self, draw_every_nth)
+        self.fig = plt.figure(figsize=(10.25, 7.69))
+        self.fig.canvas.draw()
+        plt.ion()
+
+    def plot_real_data(self, data, nplot):
+        plt.subplot(2, 2, nplot)
+        plt.subplots_adjust(wspace=0.2, hspace=0.2)
+        im = plt.imshow(
+            data.getArray(),
+            norm=matplotlib.colors.LogNorm(1.0, data.getMaximum()),
+            extent=[data.getXmin()/deg, data.getXmax()/deg,
+                    data.getYmin()/deg, data.getYmax()/deg])
+        plt.colorbar(im)
+        plt.title("\"Real\" data")
+        plt.xlabel(r'$\phi_f$', fontsize=12)
+        plt.ylabel(r'$\alpha_f$', fontsize=12)
+        # line representing vertical slice
+        plt.plot([phi_slice_value / deg, phi_slice_value / deg],
+                 [data.getYmin() / deg, data.getYmax() / deg],
+                 color='gray', linestyle='-', linewidth=1)
+        # line representing horizontal slice
+        plt.plot([data.getXmin() / deg, data.getXmax() / deg],
+                 [alpha_slice_value / deg, alpha_slice_value / deg],
+                 color='gray', linestyle='-', linewidth=1)
+
+    def plot_slices(self, slices, title, nplot):
+        plt.subplot(2, 2, nplot)
+        plt.subplots_adjust(wspace=0.2, hspace=0.3)
+        for label, slice in slices:
+            plt.semilogy(slice.getBinCenters()/deg,
+                         slice.getBinValues(), label=label)
+            plt.xlim(slice.getXmin()/deg, slice.getXmax()/deg)
+            plt.ylim(1.0, slice.getMaximum()*10.0)
+        plt.legend(loc='upper right')
+        plt.title(title)
+
+    def display_fit_parameters(self, fit_suite, nplot):
+        plt.subplot(2, 2, nplot)
+        plt.title('Parameters')
+        plt.axis('off')
+        plt.text(0.01, 0.85, "Iteration  " + '{:d}     {:s}'.
+                 format(fit_suite.numberOfIterations(),
+                        fit_suite.minimizer().minimizerName()))
+        plt.text(0.01, 0.75, "Chi2       " + '{:8.4f}'.format(fit_suite.getChi2()))
+        for index, fitPar in enumerate(fit_suite.fitParameters()):
+            plt.text(0.01, 0.55 - index*0.1,
+                     '{:30.30s}: {:6.3f}'.format(fitPar.name(), fitPar.value()))
+
+        plt.draw()
+        plt.pause(0.01)
+
+    def update(self, fit_suite):
+        self.fig.clf()
+
+        real_data = fit_suite.getRealData()
+        simul_data = fit_suite.getSimulationData()
+
+        # These lines add to make cast explicit, see Bug #1367
+        real_data = ba.Histogram2D.dynamicCast(real_data)
+        simul_data = ba.Histogram2D.dynamicCast(simul_data)
+
+        # plot real data
+        self.plot_real_data(real_data, nplot=1)
+
+        # horizontal slices
+        slices =[
+            ("real", real_data.projectionX(alpha_slice_value)),
+            ("simul", simul_data.projectionX(alpha_slice_value))
+            ]
+        title = ( "Horizontal slice at alpha =" +
+                  '{:3.1f}'.format(alpha_slice_value/deg) )
+        self.plot_slices(slices, title, nplot=2)
+
+        # vertical slices
+        slices =[
+            ("real", real_data.projectionY(phi_slice_value)),
+            ("simul", simul_data.projectionY(phi_slice_value))
+            ]
+        title = "Vertical slice at phi =" + '{:3.1f}'.format(phi_slice_value/deg)
+        self.plot_slices(slices, title, nplot=3)
+
+        # display fit parameters
+        self.display_fit_parameters(fit_suite, nplot=4)
+
+        if fit_suite.isLastIteration():
+            plt.ioff()
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+
+    real_data = create_real_data()
+
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    # At this point we mask all the detector and then unmask two areas
+    # corresponding to the vertical and horizontal lines. This will make
+    # simulation/fitting to be performed along slices only.
+    simulation.maskAll()
+    simulation.addMask(ba.HorizontalLine(alpha_slice_value), False)
+    simulation.addMask(ba.VerticalLine(phi_slice_value), False)
+
+    fit_suite = ba.FitSuite()
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    fit_suite.initPrint(5)
+
+    draw_observer = DrawObserver(draw_every_nth=5)
+    fit_suite.attachObserver(draw_observer)
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*/Cylinder/Radius", 6.*nm).setLimited(4., 8.)
+    fit_suite.addFitParameter("*/Cylinder/Height", 9.*nm).setLimited(8., 12.)
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex08_SimultaneousFitOfTwoDatasets/SimultaneousFitOfTwoDatasets.py b/Examples/python/fitting/ex08_SimultaneousFitOfTwoDatasets/SimultaneousFitOfTwoDatasets.py
new file mode 100644
index 0000000..73c0d81
--- /dev/null
+++ b/Examples/python/fitting/ex08_SimultaneousFitOfTwoDatasets/SimultaneousFitOfTwoDatasets.py
@@ -0,0 +1,182 @@
+"""
+Fitting example: demonstrates how to fit two datasets simultaneously.
+"""
+
+from __future__ import print_function
+import matplotlib
+from matplotlib import pyplot as plt
+import matplotlib.gridspec as gridspec
+import math
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def get_sample(radius_a=4.0*nm, radius_b=4.0*nm, height=4.0*nm):
+    """
+    Returns a sample with uncorrelated cylinders and pyramids.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    formFactor = ba.FormFactorHemiEllipsoid(radius_a, radius_b, height)
+    hemiEllipsoid = ba.Particle(m_particle, formFactor)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(hemiEllipsoid)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation(incident_alpha=0.2):
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(50, -1.5*deg, 1.5*deg,
+                                     50, 0.0*deg, 2.0*deg)
+    simulation.setBeamParameters(1.0*angstrom, incident_alpha, 0.0*deg)
+    return simulation
+
+
+def create_real_data(incident_alpha):
+    """
+    Generating "real" data by adding noise to the simulated data.
+    """
+    sample = get_sample(
+        radius_a=5.0*nm, radius_b=6.0*nm, height=8.0*nm)
+
+    simulation = get_simulation(incident_alpha)
+    simulation.setSample(sample)
+
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+
+    # spoiling simulated data with the noise to produce "real" data
+    noise_factor = 1.0
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        if noisy_amplitude < 0.0:
+            noisy_amplitude = 0.0
+        real_data.setBinContent(i, noisy_amplitude)
+    return real_data
+
+
+class DrawObserver(ba.IFitObserver):
+    """
+    Draws fit progress every nth iteration. Real data, simulated data
+    and chi2 map will be shown for both datasets.
+    """
+    def __init__(self, draw_every_nth=10):
+        import matplotlib
+        from matplotlib import pyplot as plt
+        global matplotlib, plt
+
+        ba.IFitObserver.__init__(self, draw_every_nth)
+        self.fig = plt.figure(figsize=(12.8, 10.24))
+        self.fig.canvas.draw()
+        plt.ion()
+
+    def plot_colormap(self, data, title, min=1, max=1e6):
+        im = plt.imshow(
+            data.getArray(),
+            norm=matplotlib.colors.LogNorm(min, max),
+            extent=[data.getXmin()/deg, data.getXmax()/deg,
+                    data.getYmin()/deg, data.getYmax()/deg],
+            aspect='auto')
+        plt.colorbar(im)
+        plt.title(title)
+
+    def plot_datasets(self, fit_suite, canvas):
+        for i_dataset in range(0, fit_suite.numberOfFitObjects()):
+            real_data = fit_suite.getRealData(i_dataset)
+            simul_data = fit_suite.getSimulationData(i_dataset)
+            chi2_map = fit_suite.getChiSquaredMap(i_dataset)
+
+            plt.subplot(canvas[i_dataset*3])
+            self.plot_colormap(real_data, "\"Real\" data - #"+str(i_dataset+1),
+                               min=1.0, max=real_data.getMaximum())
+            plt.subplot(canvas[1+i_dataset*3])
+            self.plot_colormap(simul_data, "Simulated data - #"+str(i_dataset+1),
+                               min=1.0, max=real_data.getMaximum())
+            plt.subplot(canvas[2+i_dataset*3])
+            self.plot_colormap(chi2_map, "Chi2 map - #"+str(i_dataset+1),
+                               min=0.001, max=10.0)
+
+    def plot_fit_parameters(self, fit_suite, canvas):
+        # fit parameters
+        plt.subplot(canvas[6:])
+        plt.axis('off')
+        plt.text(0.01, 0.95, "Iterations  " + '{:d}     {:s}'.
+                 format(fit_suite.numberOfIterations(),
+                        fit_suite.minimizer().minimizerName()))
+        plt.text(0.01, 0.70, "Chi2       " + '{:8.4f}'.format(fit_suite.getChi2()))
+        for index, fitPar in enumerate(fit_suite.fitParameters()):
+            plt.text(0.01, 0.30 - index*0.3,
+                     '{:40.40s}: {:6.3f}'.format(fitPar.name(), fitPar.value()))
+
+    def update(self, fit_suite):
+        self.fig.clf()
+
+        # we divide figure to have 3x3 subplots, with two first rows occupying
+        # most of the space
+        canvas = matplotlib.gridspec.GridSpec(
+            3, 3, width_ratios=[1, 1, 1], height_ratios=[4, 4, 1])
+        canvas.update(left=0.05, right=0.95, hspace=0.4, wspace=0.2)
+
+        self.plot_datasets(fit_suite, canvas)
+        self.plot_fit_parameters(fit_suite, canvas)
+
+        plt.draw()
+        plt.pause(0.01)
+
+        if fit_suite.isLastIteration():
+            plt.ioff()
+
+
+def run_fitting():
+    """
+    main function to run fitting
+    """
+
+    incident_alpha_angles = [0.1*deg, 0.4*deg]
+    fit_suite = ba.FitSuite()
+    sample = get_sample()
+
+    for alpha in incident_alpha_angles:
+        real_data = create_real_data(incident_alpha=alpha)
+        simulation = get_simulation(incident_alpha=alpha)
+        simulation.setSample(sample)
+        fit_suite.addSimulationAndRealData(simulation, real_data)
+
+    fit_suite.initPrint(10)
+    draw_observer = DrawObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter("*/HemiEllipsoid/RadiusX", 4.*nm).setLimited(2., 10.)
+    fit_suite.addFitParameter("*/HemiEllipsoid/RadiusY", 6.*nm).setFixed()
+    fit_suite.addFitParameter("*/HemiEllipsoid/Height", 4.*nm).setLimited(2., 10.)
+
+    # running fit
+    fit_suite.runFit()
+
+    print("Fitting completed.")
+    print("chi2:", fit_suite.getChi2())
+    for fitPar in fit_suite.fitParameters():
+        print(fitPar.name(), fitPar.value(), fitPar.error())
+
+
+if __name__ == '__main__':
+    run_fitting()
+    plt.show()
diff --git a/Examples/python/fitting/ex10_FitGALAXIData/FitGALAXIData.py b/Examples/python/fitting/ex10_FitGALAXIData/FitGALAXIData.py
new file mode 100644
index 0000000..e9bc770
--- /dev/null
+++ b/Examples/python/fitting/ex10_FitGALAXIData/FitGALAXIData.py
@@ -0,0 +1,102 @@
+"""
+Real life example: experiment at GALAXY
+"""
+import matplotlib
+from matplotlib import pyplot as plt
+import numpy
+import bornagain as ba
+from SampleBuilder import MySampleBuilder
+
+wavelength = 1.34*ba.angstrom
+alpha_i = 0.463*ba.deg
+
+# detector setup as given from instrument responsible
+pilatus_npx, pilatus_npy = 981, 1043
+pilatus_pixel_size = 0.172  # in mm
+detector_distance = 1730.0  # in mm
+beam_xpos, beam_ypos = 597.1, 323.4  # in pixels
+
+
+def create_detector():
+    """
+    Returns a model of the GALAXY detector
+    """
+    u0 = beam_xpos*pilatus_pixel_size  # in mm
+    v0 = beam_ypos*pilatus_pixel_size  # in mm
+    detector = ba.RectangularDetector(pilatus_npx, pilatus_npx*pilatus_pixel_size,
+                                      pilatus_npy, pilatus_npy*pilatus_pixel_size)
+    detector.setPerpendicularToDirectBeam(detector_distance, u0, v0)
+    return detector
+
+
+def create_simulation():
+    """
+    Creates and returns GISAS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetector(create_detector())
+    simulation.setBeamParameters(wavelength, alpha_i, 0.0)
+    simulation.setBeamIntensity(1.2e7)
+    simulation.setRegionOfInterest(85.0, 70.0, 120.0, 92.)
+    # mask on reflected beam
+    simulation.addMask(ba.Rectangle(101.9, 82.1, 103.7, 85.2), True)
+    # detector resolution function
+    # simulation.setDetectorResolutionFunction(
+    #   ba.ResolutionFunction2DGaussian(0.5*pilatus_pixel_size,
+    #      0.5*pilatus_pixel_size))
+    # beam divergence
+    # alpha_distr = ba.DistributionGaussian(alpha_i, 0.02*ba.deg)
+    # simulation.addParameterDistribution("*/Beam/Alpha", alpha_distr, 5)
+    return simulation
+
+
+def load_real_data(filename="galaxi_data.tif.gz"):
+    """
+    Fill histogram representing our detector with intensity data from tif file.
+    Returns cropped version of it, which represent the area we are interested in.
+    """
+    hist = ba.IHistogram.createFrom(filename)
+    return hist
+
+
+def run_fitting():
+    simulation = create_simulation()
+    sample_builder = MySampleBuilder()
+    simulation.setSampleBuilder(sample_builder)
+
+    real_data = load_real_data()
+
+    fit_suite = ba.FitSuite()
+    draw_observer = ba.DefaultFitObserver(draw_every_nth=10)
+    fit_suite.attachObserver(draw_observer)
+    fit_suite.initPrint(10)
+    fit_suite.addSimulationAndRealData(simulation, real_data)
+    print("1.8")
+
+    # setting fitting parameters with starting values
+    fit_suite.addFitParameter(
+        "*radius", 5.0*ba.nm, ba.AttLimits.limited(4.0, 6.0),
+        0.1*ba.nm)
+    fit_suite.addFitParameter(
+        "*sigma", 0.55, ba.AttLimits.limited(0.2, 0.8), 0.01*ba.nm)
+    fit_suite.addFitParameter(
+        "*distance", 27.*ba.nm, ba.AttLimits.limited(20, 70),
+        0.1*ba.nm)
+
+    use_two_minimizers_strategy = False
+    if use_two_minimizers_strategy:
+        strategy1 = ba.AdjustMinimizerStrategy("Genetic")
+        fit_suite.addFitStrategy(strategy1)
+
+        # Second fit strategy will use another algorithm.
+        # It will use best parameters found from previous minimization round.
+        strategy2 = ba.AdjustMinimizerStrategy("Minuit2", "Migrad")
+        fit_suite.addFitStrategy(strategy2)
+
+    # running fit
+    fit_suite.runFit()
+
+    plt.show()
+
+if __name__ == '__main__':
+    run_fitting()
diff --git a/Examples/python/fitting/ex10_FitGALAXIData/SampleBuilder.py b/Examples/python/fitting/ex10_FitGALAXIData/SampleBuilder.py
new file mode 100644
index 0000000..3dbd9ca
--- /dev/null
+++ b/Examples/python/fitting/ex10_FitGALAXIData/SampleBuilder.py
@@ -0,0 +1,96 @@
+"""
+3 layers system (substrate, teflon, air).
+Air layer is populated with spheres with some size distribution.
+"""
+import bornagain as ba
+import ctypes
+
+
+class MySampleBuilder(ba.IMultiLayerBuilder):
+    """
+
+    """
+    def __init__(self):
+        ba.IMultiLayerBuilder.__init__(self)
+        self.sample = None
+
+        # parameters describing the sample
+        self.radius = ctypes.c_double(5.75*ba.nm)
+        self.sigma = ctypes.c_double(0.4)
+        self.distance = ctypes.c_double(53.6*ba.nm)
+        self.disorder = ctypes.c_double(10.5*ba.nm)
+        self.kappa = ctypes.c_double(17.5)
+        self.ptfe_thickness = ctypes.c_double(22.1*ba.nm)
+        self.hmdso_thickness = ctypes.c_double(18.5*ba.nm)
+
+        # register parameters
+        self.registerParameter("radius", ctypes.addressof(self.radius))
+        self.registerParameter("sigma", ctypes.addressof(self.sigma))
+        self.registerParameter("distance", ctypes.addressof(self.distance))
+        self.registerParameter("disorder", ctypes.addressof(self.disorder))
+        self.registerParameter("kappa", ctypes.addressof(self.kappa))
+        self.registerParameter("tptfe", ctypes.addressof(self.ptfe_thickness))
+        self.registerParameter("thmdso", ctypes.addressof(self.hmdso_thickness))
+
+    # constructs the sample for current values of parameters
+    def buildSample(self):
+        # defining materials
+        m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+        m_Si = ba.HomogeneousMaterial("Si", 5.78164736e-6, 1.02294578e-7)
+        m_Ag = ba.HomogeneousMaterial("Ag", 2.24749529E-5, 1.61528396E-6)
+        m_PTFE = ba.HomogeneousMaterial("PTFE", 5.20508729E-6, 1.96944292E-8)
+        m_HMDSO = ba.HomogeneousMaterial("HMDSO", 2.0888308E-6, 1.32605651E-8)
+
+        # collection of particles with size distribution
+        nparticles = 20
+        nfwhm = 2.0
+        sphere_ff = ba.FormFactorFullSphere(self.radius.value)
+        # sphere_ff = ba.FormFactorTruncatedSphere(
+        #    self.radius.value, self.radius.value*1.5)
+
+        sphere = ba.Particle(m_Ag, sphere_ff)
+        position = ba.kvector_t(0*ba.nm, 0*ba.nm,
+                                -1.0*self.hmdso_thickness.value)
+        sphere.setPosition(position)
+        ln_distr = ba.DistributionLogNormal(self.radius.value, self.sigma.value)
+        par_distr = ba.ParameterDistribution(
+            "/Particle/FullSphere/Radius", ln_distr, nparticles, nfwhm)
+        # par_distr = ba.ParameterDistribution(
+        #    "/Particle/TruncatedSphere/Radius", ln_distr, nparticles, nfwhm)
+        # par_distr.linkParameter("/Particle/TruncatedSphere/Height")
+        part_coll = ba.ParticleDistribution(sphere, par_distr)
+
+        # interference function
+        interference = ba.InterferenceFunctionRadialParaCrystal(
+            self.distance.value, 1e6*ba.nm)
+        interference.setKappa(self.kappa.value)
+        interference.setDomainSize(20000.0)
+        pdf = ba.FTDistribution1DGauss(self.disorder.value)
+        interference.setProbabilityDistribution(pdf)
+
+        # assembling particle layout
+        particle_layout = ba.ParticleLayout()
+        particle_layout.addParticle(part_coll, 1.0)
+        particle_layout.addInterferenceFunction(interference)
+        particle_layout.setApproximation(ba.ILayout.SSCA)
+        particle_layout.setTotalParticleSurfaceDensity(1)
+
+        # roughness
+        r_ptfe = ba.LayerRoughness(2.3*ba.nm, 0.3, 5.0*ba.nm)
+        r_hmdso = ba.LayerRoughness(1.1*ba.nm, 0.3, 5.0*ba.nm)
+
+        # layers
+        air_layer = ba.Layer(m_air)
+        hmdso_layer = ba.Layer(m_HMDSO, self.hmdso_thickness.value)
+        hmdso_layer.addLayout(particle_layout)
+        ptfe_layer = ba.Layer(m_PTFE, self.ptfe_thickness.value)
+        substrate_layer = ba.Layer(m_Si)
+
+        # assembling multilayer
+        multi_layer = ba.MultiLayer()
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
+        multi_layer.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+        multi_layer.addLayer(substrate_layer)
+
+        return multi_layer
diff --git a/Examples/python/fitting/ex10_FitGALAXIData/galaxi_data.tif.gz b/Examples/python/fitting/ex10_FitGALAXIData/galaxi_data.tif.gz
new file mode 100644
index 0000000..807360b
Binary files /dev/null and b/Examples/python/fitting/ex10_FitGALAXIData/galaxi_data.tif.gz differ
diff --git a/Examples/python/simulation/ex01_BasicParticles/AllFormFactorsAvailable.py b/Examples/python/simulation/ex01_BasicParticles/AllFormFactorsAvailable.py
new file mode 100644
index 0000000..8e632ef
--- /dev/null
+++ b/Examples/python/simulation/ex01_BasicParticles/AllFormFactorsAvailable.py
@@ -0,0 +1,122 @@
+"""
+All formfactors available in BornAgain in the Born Approximation
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+formfactors = [
+    ba.FormFactorAnisoPyramid(20.0, 16.0, 13.0, 60.0*deg),
+    ba.FormFactorBox(20.0, 16.0, 13.0),
+    ba.FormFactorCone(10.0, 13.0, 60.0*deg),
+    ba.FormFactorCone6(10.0, 13.0, 60.0*deg),
+    ba.FormFactorCuboctahedron(20.0, 13.0, 0.7, 60.0*deg),
+    ba.FormFactorCylinder(8.0, 16.0),
+    ba.FormFactorDodecahedron(5.0),
+    ba.FormFactorEllipsoidalCylinder(8.0, 13.0, 16.0),
+    ba.FormFactorFullSphere(8.0),
+    ba.FormFactorFullSpheroid(10.0, 13.0),
+    ba.FormFactorHemiEllipsoid(10.0, 6.0, 8.0),
+    ba.FormFactorIcosahedron(8.0),
+    ba.FormFactorPrism3(10.0, 13.0),
+    ba.FormFactorPrism6(5.0, 11.0),
+    ba.FormFactorPyramid(18.0, 13.0, 60.0*deg),
+    ba.FormFactorRipple1(27.0, 20.0, 14.0),
+    ba.FormFactorRipple2(36.0, 25.0, 14.0, 3.0),
+    ba.FormFactorTetrahedron(15.0, 6.0, 60.0*deg),
+    ba.FormFactorTruncatedSphere(5.0, 7.0),
+    ba.FormFactorTruncatedSpheroid(7.5, 9.0, 1.2),
+    ba.FormFactorTruncatedCube(15.0, 6.0)
+]
+
+
+def get_sample(formfactor):
+    """
+    Returns a one-layer sample that contains particles with given form factor.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    particle = ba.Particle(m_particle, formfactor)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(particle, 1.0)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns GISAXS simulation with standard beam and detector.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(
+        100, phi_min*deg, phi_max*deg, 100, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def simulate(ff):
+    """
+    Runs simulation for one form factor, and returns simulated intensity pattern
+    """
+    sample = get_sample(ff)
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+def plot(result, nframe, name):
+    """
+    Plots simulated detector image 'result' to position number 'nframe' on canvas.
+    """
+    plt.subplot(5, 5, nframe)
+    plt.subplots_adjust(wspace=0.3, hspace=0.3)
+
+    im = plt.imshow(
+        result.getArray(),
+        norm=matplotlib.colors.LogNorm(1.0, result.getMaximum()),
+        extent=[result.getXmin()/deg, result.getXmax()/deg,
+                result.getYmin()/deg, result.getYmax()/deg],
+        aspect='auto')
+    plt.tick_params(axis='both', which='major', labelsize=8)
+    plt.tick_params(axis='both', which='minor', labelsize=6)
+    plt.xticks(numpy.arange(phi_min, phi_max+0.0001, 1.0))
+    plt.text(-0.1, 2.17, name, horizontalalignment='center',
+             verticalalignment='center', fontsize=11)
+
+
+if __name__ == '__main__':
+    """
+    Runs one simulation for each form factor, and plots results on a single canvas.
+    """
+    arg = ba.getFilenameOrPlotflag()
+    if arg == "-p":
+        import matplotlib
+        from matplotlib import pyplot as plt
+        plt.figure(figsize=(12.80, 10.24))
+        for nplot in range(len(formfactors)):
+            ff = formfactors[nplot]
+            name = ff.__class__.__name__.replace("FormFactor","")
+            print("Generating intensity map for " + name)
+            intensities = simulate(ff)
+            plot(intensities, nplot+1, name)
+        plt.show()
+    else:
+        for ff in formfactors:
+            name = ff.__class__.__name__.replace("FormFactor","")
+            intensities = simulate(ff)
+            fname = "%s.%s.int" % (arg, name)
+            ba.IntensityDataIOFactory.writeIntensityData(intensities, fname)
+            print("Stored intensity map in " + fname)
diff --git a/Examples/python/simulation/ex01_BasicParticles/CylindersAndPrisms.py b/Examples/python/simulation/ex01_BasicParticles/CylindersAndPrisms.py
new file mode 100644
index 0000000..7a82467
--- /dev/null
+++ b/Examples/python/simulation/ex01_BasicParticles/CylindersAndPrisms.py
@@ -0,0 +1,67 @@
+"""
+Mixture of cylinders and prisms without interference
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with uncorrelated cylinders and prisms on a substrate.
+    """
+    # defining materials
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    prism_ff = ba.FormFactorPrism3(10*nm, 5*nm)
+    prism = ba.Particle(m_particle, prism_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 0.5)
+    particle_layout.addParticle(prism, 0.5)
+    interference = ba.InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    multi_layer.printParameters()
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, phi_min*deg, phi_max*deg,
+                                     100, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns resulting intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex01_BasicParticles/CylindersInBA.py b/Examples/python/simulation/ex01_BasicParticles/CylindersInBA.py
new file mode 100644
index 0000000..ede35b3
--- /dev/null
+++ b/Examples/python/simulation/ex01_BasicParticles/CylindersInBA.py
@@ -0,0 +1,59 @@
+"""
+Cylinder formfactor in Born approximation
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders in a homogeneous environment ("air"),
+    implying a simulation in plain Born approximation.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex01_BasicParticles/CylindersInDWBA.py b/Examples/python/simulation/ex01_BasicParticles/CylindersInDWBA.py
new file mode 100644
index 0000000..948257a
--- /dev/null
+++ b/Examples/python/simulation/ex01_BasicParticles/CylindersInDWBA.py
@@ -0,0 +1,61 @@
+"""
+Cylinder formfactor in DWBA
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py b/Examples/python/simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py
new file mode 100644
index 0000000..ec48599
--- /dev/null
+++ b/Examples/python/simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py
@@ -0,0 +1,75 @@
+"""
+Cylinders with size distribution
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Return a sample with cylinders on a substrate.
+    The cylinders have a Gaussian size distribution.
+    """
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # cylindrical particle
+    radius = 5*nm
+    height = radius
+    cylinder_ff = ba.FormFactorCylinder(radius, height)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+
+    # collection of particles with size distribution
+    nparticles = 100
+    nfwhm = 2.0
+    sigma = 0.2*radius
+
+    gauss_distr = ba.DistributionGaussian(radius, sigma)
+    par_distr = ba.ParameterDistribution(
+        "/Particle/Cylinder/Radius", gauss_distr, nparticles, nfwhm)
+    # by uncommenting the line below, the height of the cylinders
+    #   can be scaled proportionally to the radius:
+    # par_distr.linkParameter("/Particle/Cylinder/Height")
+    part_coll = ba.ParticleDistribution(cylinder, par_distr)
+
+    # assembling the sample
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(part_coll)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    print( sample.to_str() ) # print tree structure of sample
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex01_BasicParticles/RotatedPyramids.py b/Examples/python/simulation/ex01_BasicParticles/RotatedPyramids.py
new file mode 100644
index 0000000..90095d4
--- /dev/null
+++ b/Examples/python/simulation/ex01_BasicParticles/RotatedPyramids.py
@@ -0,0 +1,63 @@
+"""
+Rotated pyramids on top of substrate
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with rotated pyramids on top of a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    pyramid_ff = ba.FormFactorPyramid(10*nm, 5*nm, 54.73*deg)
+    pyramid = ba.Particle(m_particle, pyramid_ff)
+    transform = ba.RotationZ(45.*deg)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(
+        pyramid, 1.0, ba.kvector_t(0.0, 0.0, 0.0), transform)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex01_BasicParticles/TwoTypesOfCylindersWithSizeDistribution.py b/Examples/python/simulation/ex01_BasicParticles/TwoTypesOfCylindersWithSizeDistribution.py
new file mode 100644
index 0000000..41f0606
--- /dev/null
+++ b/Examples/python/simulation/ex01_BasicParticles/TwoTypesOfCylindersWithSizeDistribution.py
@@ -0,0 +1,89 @@
+"""
+Mixture cylinder particles with different size distribution
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders in a homogeneous medium ("air").
+    The cylinders are a 95:5 mixture of two different size distributions.
+    """
+    # defining materials
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    nparticles = 150
+    nfwhm = 3.0
+
+    # collection of particles #1
+    radius1 = 5.0*nm
+    height1 = radius1
+    sigma1 = radius1*0.2
+
+    cylinder_ff1 = ba.FormFactorCylinder(radius1, height1)
+    cylinder1 = ba.Particle(m_particle, cylinder_ff1)
+
+    gauss_distr1 = ba.DistributionGaussian(radius1, sigma1)
+
+    par_distr1 = ba.ParameterDistribution(
+        "/Particle/Cylinder/Radius", gauss_distr1, nparticles, nfwhm)
+    part_coll1 = ba.ParticleDistribution(cylinder1, par_distr1)
+
+    # collection of particles #2
+    radius2 = 10.0*nm
+    height2 = radius2
+    sigma2 = radius2*0.02
+
+    cylinder_ff2 = ba.FormFactorCylinder(radius2, height2)
+    cylinder2 = ba.Particle(m_particle, cylinder_ff2)
+
+    gauss_distr2 = ba.DistributionGaussian(radius2, sigma2)
+
+    par_distr2 = ba.ParameterDistribution(
+        "/Particle/Cylinder/Radius", gauss_distr2, nparticles, nfwhm)
+    part_coll2 = ba.ParticleDistribution(cylinder2, par_distr2)
+
+    # assembling the sample
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(part_coll1, 0.95)
+    particle_layout.addParticle(part_coll2, 0.05)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex02_LayeredStructures/BuriedParticles.py b/Examples/python/simulation/ex02_LayeredStructures/BuriedParticles.py
new file mode 100644
index 0000000..0feaf9d
--- /dev/null
+++ b/Examples/python/simulation/ex02_LayeredStructures/BuriedParticles.py
@@ -0,0 +1,66 @@
+"""
+Spherical particles embedded in the middle of the layer on top of substrate.
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with spherical particles in an layer between air and substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_interm_layer = ba.HomogeneousMaterial("IntermLayer", 3.45e-6, 5.24e-9)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 7.43e-6, 1.72e-7)
+    m_particle = ba.HomogeneousMaterial("Particle", 0.0, 0.0)
+
+    # collection of particles
+    ff_sphere = ba.FormFactorFullSphere(10.2*nm)
+    sphere = ba.Particle(m_particle, ff_sphere)
+    sphere.setPosition(0.0, 0.0, -25.2)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(sphere, 1.0)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    intermediate_layer = ba.Layer(m_interm_layer, 30.*nm)
+    intermediate_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(intermediate_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.5*angstrom, 0.15*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex02_LayeredStructures/CorrelatedRoughness.py b/Examples/python/simulation/ex02_LayeredStructures/CorrelatedRoughness.py
new file mode 100644
index 0000000..4445185
--- /dev/null
+++ b/Examples/python/simulation/ex02_LayeredStructures/CorrelatedRoughness.py
@@ -0,0 +1,74 @@
+"""
+MultiLayer with correlated roughness
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -0.5, 0.5
+alpha_min, alpha_max = 0.0, 1.0
+
+
+def get_sample():
+    """
+    Returns a sample with two layers on a substrate, with correlated roughnesses.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("ambience", 0.0, 0.0)
+    m_part_a = ba.HomogeneousMaterial("PartA", 5e-6, 0.0)
+    m_part_b = ba.HomogeneousMaterial("PartB", 10e-6, 0.0)
+    m_substrate = ba.HomogeneousMaterial("substrate", 15e-6, 0.0)
+
+    # defining layers
+    l_ambience = ba.Layer(m_ambience)
+    l_part_a = ba.Layer(m_part_a, 2.5*nm)
+    l_part_b = ba.Layer(m_part_b, 5.0*nm)
+    l_substrate = ba.Layer(m_substrate)
+
+    roughness = ba.LayerRoughness()
+    roughness.setSigma(1.0*nm)
+    roughness.setHurstParameter(0.3)
+    roughness.setLatteralCorrLength(5.0*nm)
+
+    my_sample = ba.MultiLayer()
+
+    # adding layers
+    my_sample.addLayer(l_ambience)
+
+    n_repetitions = 5
+    for i in range(n_repetitions):
+        my_sample.addLayerWithTopRoughness(l_part_a, roughness)
+        my_sample.addLayerWithTopRoughness(l_part_b, roughness)
+
+    my_sample.addLayerWithTopRoughness(l_substrate, roughness)
+    my_sample.setCrossCorrLength(1e-4)
+
+    return my_sample
+
+
+def get_simulation():
+    """
+    Characterizing the input beam and output detector
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    simulation.setBeamIntensity(5e11)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationDA.py b/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationDA.py
new file mode 100644
index 0000000..c169ae1
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationDA.py
@@ -0,0 +1,78 @@
+"""
+Cylinders of two different sizes in Decoupling Approximation
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders of two different sizes on a substrate.
+    The cylinder positions are modelled in Decoupling Approximation.
+    """
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # cylindrical particle 1
+    radius1 = 5*nm
+    height1 = radius1
+    cylinder_ff1 = ba.FormFactorCylinder(radius1, height1)
+    cylinder1 = ba.Particle(m_particle, cylinder_ff1)
+
+    # cylindrical particle 2
+    radius2 = 8*nm
+    height2 = radius2
+    cylinder_ff2 = ba.FormFactorCylinder(radius2, height2)
+    cylinder2 = ba.Particle(m_particle, cylinder_ff2)
+
+    # interference function
+    interference = ba.InterferenceFunctionRadialParaCrystal(
+        18.0*nm, 1e3*nm)
+    pdf = ba.FTDistribution1DGauss(3 * nm)
+    interference.setProbabilityDistribution(pdf)
+
+     # assembling the sample
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder1, 0.8)
+    particle_layout.addParticle(cylinder2, 0.2)
+    particle_layout.addInterferenceFunction(interference)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationLMA.py b/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationLMA.py
new file mode 100644
index 0000000..9a028eb
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationLMA.py
@@ -0,0 +1,87 @@
+"""
+Cylinders of two different sizes in Local Monodisperse Approximation
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders of two different sizes on a substrate.
+    The cylinder positions are modelled in Local Monodisperse Approximation.
+    """
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # cylindrical particle 1
+    radius1 = 5*nm
+    height1 = radius1
+    cylinder_ff1 = ba.FormFactorCylinder(radius1, height1)
+    cylinder1 = ba.Particle(m_particle, cylinder_ff1)
+
+    # cylindrical particle 2
+    radius2 = 8*nm
+    height2 = radius2
+    cylinder_ff2 = ba.FormFactorCylinder(radius2, height2)
+    cylinder2 = ba.Particle(m_particle, cylinder_ff2)
+
+    # interference function1
+    interference1 = ba.InterferenceFunctionRadialParaCrystal(
+        16.8*nm, 1e3*nm)
+    pdf = ba.FTDistribution1DGauss(3 * nm)
+    interference1.setProbabilityDistribution(pdf)
+
+    # interference function2
+    interference2 = ba.InterferenceFunctionRadialParaCrystal(
+        22.8*nm, 1e3*nm)
+    interference2.setProbabilityDistribution(pdf)
+
+     # assembling the sample
+    particle_layout1 = ba.ParticleLayout()
+    particle_layout1.addParticle(cylinder1, 0.8)
+    particle_layout1.addInterferenceFunction(interference1)
+
+    particle_layout2 = ba.ParticleLayout()
+    particle_layout2.addParticle(cylinder2, 0.2)
+    particle_layout2.addInterferenceFunction(interference2)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout1)
+    air_layer.addLayout(particle_layout2)
+    substrate_layer = ba.Layer(m_substrate)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationSSCA.py b/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationSSCA.py
new file mode 100644
index 0000000..e8deca8
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/ApproximationSSCA.py
@@ -0,0 +1,80 @@
+"""
+Cylinders of two different sizes in Size-Spacing Coupling Approximation
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders of two different sizes on a substrate.
+    The cylinder positions are modelled in Size-Spacing Coupling  Approximation.
+    """
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # cylindrical particle 1
+    radius1 = 5*nm
+    height1 = radius1
+    cylinder_ff1 = ba.FormFactorCylinder(radius1, height1)
+    cylinder1 = ba.Particle(m_particle, cylinder_ff1)
+
+    # cylindrical particle 2
+    radius2 = 8*nm
+    height2 = radius2
+    cylinder_ff2 = ba.FormFactorCylinder(radius2, height2)
+    cylinder2 = ba.Particle(m_particle, cylinder_ff2)
+
+    # interference function
+    interference = ba.InterferenceFunctionRadialParaCrystal(
+        18.0*nm, 1e3*nm)
+    pdf = ba.FTDistribution1DGauss(3 * nm)
+    interference.setProbabilityDistribution(pdf)
+    interference.setKappa(1.0)
+
+    # assembling the sample
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder1, 0.8)
+    particle_layout.addParticle(cylinder2, 0.2)
+    particle_layout.addInterferenceFunction(interference)
+    particle_layout.setApproximation(ba.ILayout.SSCA)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py
new file mode 100644
index 0000000..8175762
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py
@@ -0,0 +1,71 @@
+"""
+Cosine ripple on a 2D lattice
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.5, 1.5
+alpha_min, alpha_max = 0.0, 2.5
+
+
+def get_sample():
+    """
+    Returns a sample with cosine ripples on a substrate.
+    The structure is modelled as a 2D Lattice.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    ripple1_ff = ba.FormFactorRipple1(100*nm, 20*nm, 4*nm)
+    ripple = ba.Particle(m_particle, ripple1_ff)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(ripple, 1.0)
+
+    interference = ba.InterferenceFunction2DLattice(
+        200.0*nm, 50.0*nm, 90.0*deg, 0.0*deg)
+    pdf = ba.FTDecayFunction2DCauchy(
+        1000.*nm/2./numpy.pi, 100.*nm/2./numpy.pi)
+    interference.setDecayFunction(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assemble the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    return multi_layer
+
+
+def get_simulation():
+    """
+    characterizing the input beam and output detector
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, phi_min*deg, phi_max*deg,
+                                     100, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.6*angstrom, 0.3*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference1DLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference1DLattice.py
new file mode 100644
index 0000000..299cf7c
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference1DLattice.py
@@ -0,0 +1,72 @@
+"""
+Long boxes on a 1D lattice
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with a grating on a substrate.
+    The structure is modelled by infinitely long boxes forming a 1D lattice.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    lattice_length = 30.0*nm
+    lattice_rotation_angle = 0.0*deg
+    interference = ba.InterferenceFunction1DLattice(
+        lattice_length, lattice_rotation_angle)
+    pdf = ba.FTDecayFunction1DCauchy(20./2./numpy.pi*nm)
+    interference.setDecayFunction(pdf)
+
+    box_ff = ba.FormFactorBox(1000*nm, 10*nm, 15.0*nm)
+    box = ba.Particle(m_particle, box_ff)
+    transform = ba.RotationZ(25.0*deg)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(box, 1.0, ba.kvector_t(0.0, 0.0, 0.0), transform)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(24.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference1DRadialParaCrystal.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference1DRadialParaCrystal.py
new file mode 100644
index 0000000..fc455f3
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference1DRadialParaCrystal.py
@@ -0,0 +1,69 @@
+"""
+radial paracrystal
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders on a substrate that form a radial paracrystal.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+
+    interference = ba.InterferenceFunctionRadialParaCrystal(
+        20.0*nm, 1e3*nm)
+    pdf = ba.FTDistribution1DGauss(7 * nm)
+    interference.setProbabilityDistribution(pdf)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
new file mode 100644
index 0000000..3106bb1
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
@@ -0,0 +1,74 @@
+"""
+2D lattice with disorder, centered square lattice
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders on a substrate,
+    forming a 2D centered square lattice
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    interference = ba.InterferenceFunction2DLattice.createSquare(25.0*nm)
+    pdf = ba.FTDecayFunction2DCauchy(300.0*nm/2.0/numpy.pi,
+                                     100.0*nm/2.0/numpy.pi)
+    interference.setDecayFunction(pdf)
+
+    particle_layout = ba.ParticleLayout()
+    position1 = ba.kvector_t(0.0, 0.0, 0.0)
+    position2 = ba.kvector_t(12.5*nm, 12.5*nm, 0.0)
+    cylinder_ff = ba.FormFactorCylinder(3.*nm, 3.*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    basis = ba.ParticleComposition()
+    basis.addParticles(cylinder, [position1, position2])
+    particle_layout.addParticle(basis)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
new file mode 100644
index 0000000..d06829f
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
@@ -0,0 +1,89 @@
+# 2D lattice with different disorder (IsGISAXS example #6), sum of rotated lattices
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample(xi_value):
+    """
+    Returns a sample with cylinders on a substrate,
+    forming a 2D lattice with different disorder rotated lattice
+    """
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    air_layer = ba.Layer(m_ambience)
+    substrate_layer = ba.Layer(m_substrate)
+
+    p_interference_function = ba.InterferenceFunction2DLattice.createSquare(
+        25.0*nm, xi_value)
+    pdf = ba.FTDecayFunction2DCauchy(300.0*nm/2.0/numpy.pi,
+                                     100.0*nm/2.0/numpy.pi)
+    p_interference_function.setDecayFunction(pdf)
+
+    particle_layout = ba.ParticleLayout()
+    ff_cyl = ba.FormFactorCylinder(3.0*nm, 3.0*nm)
+    position = ba.kvector_t(0.0, 0.0, 0.0)
+    cylinder = ba.Particle(m_particle, ff_cyl.clone())
+    cylinder.setPosition(position)
+    particle_layout.addParticle(cylinder, 1.0)
+    particle_layout.addInterferenceFunction(p_interference_function)
+
+    air_layer.addLayout(particle_layout)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, phi_min*deg, phi_max*deg,
+                                     100, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs several simulations,
+    sums intensities from different rotated lattices,
+    and plots results
+    """
+
+    simulation = get_simulation()
+
+    OutputData_total = simulation.getIntensityData()
+    nbins = 3
+    xi_min = 0.0*deg
+    xi_max = 240.0*deg
+    total_weight = 0.0
+    xi_distr = ba.DistributionGate(xi_min, xi_max)
+    xi_samples = xi_distr.generateValueList(nbins, 0.0)
+    for i in range(len(xi_samples)):
+        xi_value = xi_samples[i]
+        probability = xi_distr.probabilityDensity(xi_value)
+        total_weight += probability
+        p_sample = get_sample(xi_value)
+        simulation.setSample(p_sample)
+        simulation.runSimulation()
+
+        single_output = simulation.getIntensityData()
+        single_output.scale(probability)
+        OutputData_total += single_output
+    OutputData_total.scale(1.0/total_weight)
+
+    return OutputData_total
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py
new file mode 100644
index 0000000..e304302
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py
@@ -0,0 +1,72 @@
+"""
+2D paracrystal
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+from bornagain import micrometer
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders on a substrate, forming a 2D paracrystal
+    """
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(4*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+
+    interference = ba.InterferenceFunction2DParaCrystal.createSquare(
+        10.0*nm, 0.0, 20.0*micrometer, 20.0*micrometer)
+    pdf = ba.FTDistribution2DCauchy(1.0*nm, 1.0*nm)
+    interference.setProbabilityDistributions(pdf, pdf)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    # coarse grid because this simulation takes rather long
+    simulation.setDetectorParameters(80, phi_min*deg, phi_max*deg,
+                                     80, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.setTerminalProgressMonitor()
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py
new file mode 100644
index 0000000..420c109
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py
@@ -0,0 +1,71 @@
+"""
+Cylinders on a rotated 2D lattice
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders on a substrate, forming a rotated 2D lattice
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    interference = ba.InterferenceFunction2DLattice.createSquare(
+        25.0*nm, 30.0*deg)
+    pdf = ba.FTDecayFunction2DCauchy(
+        300.0*nm/2.0/numpy.pi, 100.0*nm/2.0/numpy.pi)
+    pdf.setGamma(30.0*deg)
+    interference.setDecayFunction(pdf)
+
+    cylinder_ff = ba.FormFactorCylinder(3.*nm, 3.*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+
+    substrate_layer = ba.Layer(m_substrate)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py
new file mode 100644
index 0000000..069d98f
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py
@@ -0,0 +1,68 @@
+"""
+Cylinders on a 2D square lattice
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with cylinders on a substrate, forming a 2D square lattice.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    interference = ba.InterferenceFunction2DLattice.createSquare(25.0*nm)
+    pdf = ba.FTDecayFunction2DCauchy(300.0*nm/2.0/numpy.pi,
+                                     100.0*nm/2.0/numpy.pi)
+    interference.setDecayFunction(pdf)
+
+    cylinder_ff = ba.FormFactorCylinder(3.*nm, 3.*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/RectangularGrating.py b/Examples/python/simulation/ex03_InterferenceFunctions/RectangularGrating.py
new file mode 100644
index 0000000..b20db5e
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/RectangularGrating.py
@@ -0,0 +1,78 @@
+"""
+Simulation of grating using very long boxes and 1D lattice.
+Monte-carlo integration is used to get rid of
+large-particle form factor oscillations.
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample(lattice_rotation_angle):
+    """
+    Returns a sample with a grating on a substrate,
+    modelled by very long boxes forming a 1D lattice with Cauchy correlations.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    box_length, box_width, box_height = 10*nm, 10000*nm, 10*nm
+    lattice_length = 30*nm
+
+    # collection of particles
+    interference = ba.InterferenceFunction1DLattice(
+        lattice_length, lattice_rotation_angle)
+    pdf = ba.FTDecayFunction1DCauchy(1000.0)
+    interference.setDecayFunction(pdf)
+
+    box_ff = ba.FormFactorBox(box_length, box_width, box_height)
+    box = ba.Particle(m_particle, box_ff)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(
+        box, 1.0, ba.kvector_t(0.0, 0.0, 0.0), ba.RotationZ(lattice_rotation_angle))
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation(monte_carlo_integration=True):
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    simulation.getOptions().setMonteCarloIntegration(True, 100)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample(lattice_rotation_angle=45*deg)
+    simulation = get_simulation(monte_carlo_integration=True)
+    simulation.setSample(sample)
+    simulation.setTerminalProgressMonitor()
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py
new file mode 100644
index 0000000..b95478c
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py
@@ -0,0 +1,65 @@
+"""
+Spheres on a hexagonal lattice
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 1.0
+
+
+def get_sample():
+    """
+    Returns a sample with spherical particles on a substrate,
+    forming a hexagonal 2D lattice.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    sphere_ff = ba.FormFactorFullSphere(10.0*nm)
+    sphere = ba.Particle(m_particle, sphere_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(sphere)
+
+    interference = ba.InterferenceFunction2DLattice.createHexagonal(20.0*nm)
+    pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm)
+    interference.setDecayFunction(pdf)
+
+    particle_layout.addInterferenceFunction(interference)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/TriangularRipple.py b/Examples/python/simulation/ex03_InterferenceFunctions/TriangularRipple.py
new file mode 100644
index 0000000..3cf9bf3
--- /dev/null
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/TriangularRipple.py
@@ -0,0 +1,72 @@
+"""
+ Sample from the article D. Babonneau et. al., Phys. Rev. B 85, 235415, 2012 (Fig.3)
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.5, 1.5
+alpha_min, alpha_max = 0.0, 2.5
+
+
+def get_sample():
+    """
+    Returns a sample with a grating on a substrate, modelled by triangular ripples
+    forming a 1D Paracrystal.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    ripple2_ff = ba.FormFactorRipple2(
+        100*nm, 20*nm, 4*nm, -3.0*nm)
+    ripple = ba.Particle(m_particle, ripple2_ff)
+
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(ripple, 1.0)
+
+    interference = ba.InterferenceFunction2DLattice(
+        200.0*nm, 50.0*nm, 90.0*deg, 0.0*deg)
+    pdf = ba.FTDecayFunction2DGauss(
+        1000.*nm/2./numpy.pi, 100.*nm/2./numpy.pi)
+    interference.setDecayFunction(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    return multi_layer
+
+
+def get_simulation():
+    """
+    characterizing the input beam and output detector
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(400, phi_min*deg, phi_max*deg,
+                                     400, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.6*angstrom, 0.3*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex04_ComplexShapes/CoreShellNanoparticles.py b/Examples/python/simulation/ex04_ComplexShapes/CoreShellNanoparticles.py
new file mode 100644
index 0000000..6be85fa
--- /dev/null
+++ b/Examples/python/simulation/ex04_ComplexShapes/CoreShellNanoparticles.py
@@ -0,0 +1,67 @@
+"""
+Core shell nanoparticles
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with box-shaped core-shell particles on a substrate.
+    """
+    # defining materials
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0 )
+    m_shell = ba.HomogeneousMaterial("Shell", 1e-4, 2e-8 )
+    m_core = ba.HomogeneousMaterial("Core", 6e-5, 2e-8 )
+
+    # collection of particles
+    parallelepiped1_ff = ba.FormFactorBox(16*nm, 16*nm, 8*nm)
+    parallelepiped2_ff = ba.FormFactorBox(12*nm, 12*nm, 7*nm)
+    shell_particle = ba.Particle(m_shell, parallelepiped1_ff)
+    core_particle = ba.Particle(m_core, parallelepiped2_ff)
+    core_position = ba.kvector_t(0.0, 0.0, 0.0)
+
+    particle = ba.ParticleCoreShell(shell_particle, core_particle, core_position)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(particle)
+    interference = ba.InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex04_ComplexShapes/CustomFormFactor.py b/Examples/python/simulation/ex04_ComplexShapes/CustomFormFactor.py
new file mode 100644
index 0000000..92f9143
--- /dev/null
+++ b/Examples/python/simulation/ex04_ComplexShapes/CustomFormFactor.py
@@ -0,0 +1,102 @@
+"""
+Custom form factor in DWBA.
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+import cmath
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 2.0
+
+def sinc(x):
+    if abs(x) == 0:
+        return 1.
+    else:
+        return cmath.sin(x)/x
+
+
+class CustomFormFactor(ba.IFormFactorBorn):
+    """
+    A custom defined form factor.
+    The particle is a prism of height H,
+    with a base in form of a Greek cross ("plus" sign) with side length L.
+    """
+    def __init__(self, L, H):
+        ba.IFormFactorBorn.__init__(self)
+        # parameters describing the form factor
+        self.L = L
+        self.H = H
+
+    def clone(self):
+        """
+        IMPORTANT NOTE:
+        The clone method needs to call transferToCPP() on the cloned object
+        to transfer the ownership of the clone to the cpp code
+        """
+        cloned_ff = CustomFormFactor(self.L, self.H)
+        cloned_ff.transferToCPP()
+        return cloned_ff
+
+    def evaluate_for_q(self, q):
+        qzhH = 0.5*q.z()*self.H
+        qxhL = 0.5*q.x()*self.L
+        qyhL = 0.5*q.y()*self.L
+        return 0.5*self.H*self.L**2*cmath.exp(complex(0., 1.)*qzhH)*\
+               sinc(qzhH)*(sinc(0.5*qyhL)*(sinc(qxhL)-0.5*sinc(0.5*qxhL))+\
+               sinc(0.5*qxhL)*sinc(qyhL))
+
+
+def get_sample():
+    """
+    Returns a sample with particles, having a custom form factor, on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    ff = CustomFormFactor(20.0*nm, 15.0*nm)
+    particle = ba.Particle(m_particle, ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(particle, 1.0)
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    # assemble multilayer
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    IMPORTANT NOTE:
+    Multithreading should be deactivated by putting ThreadInfo.n_threads to -1
+    """
+    simulation = ba.GISASSimulation()
+    simulation.getOptions().setNumberOfThreads(-1)
+    simulation.setDetectorParameters(100, phi_min*deg, phi_max*deg,
+                                     100, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
new file mode 100644
index 0000000..b92b19f
--- /dev/null
+++ b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
@@ -0,0 +1,71 @@
+"""
+Spheres on two hexagonal close packed layers
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 1.0
+
+
+def get_sample():
+    """
+    Returns a sample with spheres on a substrate,
+    forming two hexagonal close packed layers.
+    """
+    m_air = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    radius = 10.0*nm
+    sphere_ff = ba.FormFactorFullSphere(radius)
+    sphere = ba.Particle(m_particle, sphere_ff)
+    particle_layout = ba.ParticleLayout()
+
+    pos0 = ba.kvector_t(0.0, 0.0, 0.0)
+    pos1 = ba.kvector_t(radius, radius, numpy.sqrt(3.0)*radius)
+    basis = ba.ParticleComposition()
+    basis.addParticles(sphere, [pos0, pos1])
+    particle_layout.addParticle(basis)
+
+    interference = ba.InterferenceFunction2DLattice.createHexagonal(radius*2.0)
+    pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm)
+    interference.setDecayFunction(pdf)
+
+    particle_layout.addInterferenceFunction(interference)
+
+    air_layer = ba.Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate, 0)
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex04_ComplexShapes/LargeParticlesFormFactor.py b/Examples/python/simulation/ex04_ComplexShapes/LargeParticlesFormFactor.py
new file mode 100644
index 0000000..2cdeec1
--- /dev/null
+++ b/Examples/python/simulation/ex04_ComplexShapes/LargeParticlesFormFactor.py
@@ -0,0 +1,132 @@
+"""
+Large cylinders in DWBA.
+
+This example demonstrates that for large particles (~1000nm) the formfactor
+oscillates rapidly within one detector bin and analytical calculations
+(performed for the bin center) give completely wrong intensity pattern.
+In this case Monte-Carlo integration over detector bin should be used.
+"""
+import numpy, sys
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+default_cylinder_radius = 10*nm
+default_cylinder_height = 20*nm
+
+
+def get_sample(cylinder_radius, cylinder_height):
+    """
+    Returns a sample with cylindrical particles on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(cylinder_radius, cylinder_height)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation(integration_flag):
+    """
+    Returns a GISAXS simulation with defined beam and detector.
+    If integration_flag=True, the simulation will integrate over detector bins.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(
+        200, phi_min*deg, phi_max*deg, 200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    simulation.getOptions().setMonteCarloIntegration(integration_flag, 50)
+
+    return simulation
+
+
+def simulate(condi):
+    """
+    Runs simulation and returns result.
+    """
+    scale = condi['scale']
+    integration_flag = condi['integration']
+    sample = get_sample(default_cylinder_radius*scale,
+                        default_cylinder_height*scale)
+    simulation = get_simulation(integration_flag)
+    simulation.setSample(sample)
+    simulation.setTerminalProgressMonitor()
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+def plot(result, nframe, title):
+    plt.subplot(2, 2, nframe+1)
+    plt.subplots_adjust(wspace=0.3, hspace=0.3)
+    im = plt.imshow(
+        result.getArray(),
+        norm=matplotlib.colors.LogNorm(1.0, result.getMaximum()),
+        extent=[result.getXmin()/deg, result.getXmax()/deg,
+                result.getYmin()/deg, result.getYmax()/deg],
+        aspect='auto')
+    cb = plt.colorbar(im)
+    cb.set_label(r'Intensity (arb. u.)', size=16)
+    plt.xlabel(r'$\phi_f (^{\circ})$', fontsize=16)
+    plt.ylabel(r'$\alpha_f (^{\circ})$', fontsize=16)
+    plt.text(0.0, 2.1, title, horizontalalignment='center',
+             verticalalignment='center',  fontsize=13)
+
+
+if __name__ == '__main__':
+    """
+    Runs one simulation for each condition, and plots results on a single canvas.
+    Conditions are small and large cylinders, with and without integration.
+    """
+    arg = ba.getFilenameOrPlotflag()
+
+    # conditions to define cylinders scale factor and Monte-Carlo integration flag
+    conditions = [
+        {'name': "SmallAn",
+         'title': "Small cylinders, analytical calculations", 'scale': 1,
+         'integration': False, 'max': 1e+08},
+        {'name': "SmallMC",
+         'title': "Small cylinders, Monte-Carlo integration", 'scale': 1,
+         'integration': True,  'max': 1e+08},
+        {'name': "LargeAn",
+         'title': "Large cylinders, analytical calculations", 'scale': 100,
+         'integration': False, 'max': 1e+12},
+        {'name': "LargeMC",
+         'title': "Large cylinders, Monte-Carlo integration", 'scale': 100,
+         'integration': True,  'max': 1e+12}
+    ]
+
+    if arg == "-p":
+        import matplotlib
+        from matplotlib import pyplot as plt
+        from matplotlib import rc
+        rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
+        rc('text', usetex=True)
+        plt.figure(figsize=(12.80, 10.24))
+        for nplot in range(len(conditions)):
+            condi = conditions[nplot]
+            title = condi['title']
+            print("Generating intensity map for " + title)
+            intensities = simulate(condi)
+            plot(intensities, nplot, title)
+        plt.show()
+    else:
+        for condi in conditions:
+            intensities = simulate(condi)
+            fname = "%s.%s.int" % (arg, condi['name'])
+            ba.IntensityDataIOFactory.writeIntensityData(intensities, fname)
+            print("Stored intensity map in " + fname)
diff --git a/Examples/python/simulation/ex05_BeamAndDetector/BeamDivergence.py b/Examples/python/simulation/ex05_BeamAndDetector/BeamDivergence.py
new file mode 100644
index 0000000..382883c
--- /dev/null
+++ b/Examples/python/simulation/ex05_BeamAndDetector/BeamDivergence.py
@@ -0,0 +1,69 @@
+"""
+Cylinder form factor in DWBA with beam divergence
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with uncorrelated cylinders on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam (+ divergence) and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, phi_min*deg, phi_max*deg,
+                                     100, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    wavelength_distr = ba.DistributionLogNormal(1.0*angstrom, 0.1)
+    alpha_distr = ba.DistributionGaussian(0.2*deg, 0.1*deg)
+    phi_distr = ba.DistributionGaussian(0.0*deg, 0.1*deg)
+    simulation.addParameterDistribution("*/Beam/Wavelength", wavelength_distr, 5)
+    simulation.addParameterDistribution("*/Beam/InclinationAngle", alpha_distr, 5)
+    simulation.addParameterDistribution("*/Beam/AzimuthalAngle", phi_distr, 5)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.printParameters()
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py b/Examples/python/simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py
new file mode 100644
index 0000000..00a56ec
--- /dev/null
+++ b/Examples/python/simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py
@@ -0,0 +1,65 @@
+"""
+Cylinder form factor in DWBA with detector resolution function applied
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_min, phi_max = 0.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with uncorrelated cylinders on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with detector resolution function defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(100, phi_min*deg, phi_max*deg,
+                                     100, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    simulation.setDetectorResolutionFunction(
+        ba.ResolutionFunction2DGaussian(0.0025, 0.0025))
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.printParameters()
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex05_BeamAndDetector/OffSpecularSimulation.py b/Examples/python/simulation/ex05_BeamAndDetector/OffSpecularSimulation.py
new file mode 100644
index 0000000..4f97b79
--- /dev/null
+++ b/Examples/python/simulation/ex05_BeamAndDetector/OffSpecularSimulation.py
@@ -0,0 +1,78 @@
+"""
+Long boxes at 1D lattice, ba.OffSpecular simulation
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+phi_f_min, phi_f_max = -1.0, 1.0
+alpha_f_min, alpha_f_max = 0.0, 10.0
+
+alpha_i_min, alpha_i_max = 0.0, 10.0  # incoming beam
+
+
+def get_sample():
+    """
+    Returns a sample with a grating on a substrate,
+    modelled by infinitely long boxes forming a 1D lattice.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    lattice_length = 100.0*nm
+    lattice_rotation_angle = 0.0*deg
+    interference = ba.InterferenceFunction1DLattice(
+        lattice_length, lattice_rotation_angle)
+    pdf = ba.FTDecayFunction1DCauchy(1e+6)
+    interference.setDecayFunction(pdf)
+
+    box_ff = ba.FormFactorBox(1000*nm, 20*nm, 10.0*nm)
+    box = ba.Particle(m_particle, box_ff)
+    transform = ba.RotationZ(90.0*deg)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(box, 1.0, ba.kvector_t(0.0, 0.0, 0.0), transform)
+    particle_layout.addInterferenceFunction(interference)
+
+    # assembling the sample
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns an off-specular simulation with beam and detector defined.
+    """
+    simulation = ba.OffSpecSimulation()
+    simulation.setDetectorParameters(20, phi_f_min*deg, phi_f_max*deg,
+                                     200, alpha_f_min*deg, alpha_f_max*deg)
+    # define the beam with alpha_i varied between alpha_i_min and alpha_i_max
+    alpha_i_axis = ba.FixedBinAxis(
+        "alpha_i", 200, alpha_i_min*deg, alpha_i_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, alpha_i_axis, 0.0*deg)
+    simulation.setBeamIntensity(1e9)
+    return simulation
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result)
diff --git a/Examples/python/simulation/ex05_BeamAndDetector/RectangularDetector.py b/Examples/python/simulation/ex05_BeamAndDetector/RectangularDetector.py
new file mode 100644
index 0000000..f49ffd4
--- /dev/null
+++ b/Examples/python/simulation/ex05_BeamAndDetector/RectangularDetector.py
@@ -0,0 +1,164 @@
+"""
+Simulation with rectangular detector. Pilatus3-1M detector is used as an example.
+Results will be compared against simulation with spherical detector.
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+detector_distance = 500.0  # in mm
+pilatus_pixel_size = 0.172  # in mm
+pilatus_npx, pilatus_npy = 981, 1043  # number of pixels
+
+
+def get_sample():
+    """
+    Returns a sample with cylindrical particles on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    edge = 40*nm
+    ff = ba.FormFactorBox(edge, edge, edge)
+    cylinder = ba.Particle(m_particle, ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_spherical_detector():
+    """
+    Returns a spherical detector roughly approximating our PILATUS detector
+    """
+    n_phi = pilatus_npx
+    n_alpha = pilatus_npy
+    width = pilatus_npx*pilatus_pixel_size
+    height = pilatus_npy*pilatus_pixel_size
+    phi_min = numpy.arctan(-width/2./detector_distance)
+    phi_max = numpy.arctan(width/2./detector_distance)
+    alpha_min = 0.0
+    alpha_max = numpy.arctan(height/detector_distance)
+    return ba.SphericalDetector(
+        n_phi, phi_min, phi_max, n_alpha, alpha_min, alpha_max)
+
+
+def get_rectangular_detector():
+    """
+    Returns a rectangular detector representing our PILATUS detector
+    """
+    width = pilatus_npx*pilatus_pixel_size
+    height = pilatus_npy*pilatus_pixel_size
+    detector = ba.RectangularDetector(pilatus_npx, width, pilatus_npy, height)
+    detector.setPerpendicularToSampleX(detector_distance, width/2., 0.0)
+    return detector
+
+
+def get_simulation():
+    """
+    Return a GISAXS simulation with defined beam
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setBeamParameters(10*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def plot(result):
+    """
+    Plots results of two simulations and their relative difference on one canvas
+    """
+    import matplotlib
+    from matplotlib import pyplot as plt
+    from matplotlib import rc
+    rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
+    rc('text', usetex=True)
+    fig = plt.figure(figsize=(13.6, 5.12))
+
+    result_sph  = result['spherical']
+    result_rect = result['rectangular']
+    result_diff = result['difference']
+
+    # showing  result of spherical detector simulation
+    plt.subplot(1, 3, 1)
+    im = plt.imshow(
+        result_sph.getArray(),
+        norm=matplotlib.colors.LogNorm(1.0, result_sph.getMaximum()),
+        extent=[result_sph.getXmin()/deg, result_sph.getXmax()/deg,
+                result_sph.getYmin()/deg, result_sph.getYmax()/deg],
+        aspect='auto')
+    cb = plt.colorbar(im, pad=0.025)
+    plt.xlabel(r'$\phi_f ^{\circ}$', fontsize=16)
+    plt.ylabel(r'$\alpha_f ^{\circ}$', fontsize=16)
+    plt.title("Spherical detector")
+
+    # showing  result of rectangular detector simulation
+    plt.subplot(1, 3, 2)
+    im = plt.imshow(
+        result_rect.getArray(),
+        norm=matplotlib.colors.LogNorm(1.0, result_rect.getMaximum()),
+        extent=[result_rect.getXmin(), result_rect.getXmax(),
+                result_rect.getYmin(), result_rect.getYmax()],
+        aspect='auto')
+    cb = plt.colorbar(im, pad = 0.025)
+    plt.xlabel('X, mm', fontsize=12)
+    plt.ylabel('Y, mm', fontsize=12)
+    plt.title("Rectangular detector")
+
+    # show relative difference between two plots (sph[i]-rect[i])/rect[i]
+    # for every detector pixel
+    plt.subplot(1, 3, 3)
+    im = plt.imshow(
+        result_diff.getArray(),
+        norm=matplotlib.colors.LogNorm(1e-06, 1.0),
+        extent=[result_diff.getXmin(), result_diff.getXmax(),
+                result_diff.getYmin(), result_diff.getYmax()],
+        aspect='auto')
+    cb = plt.colorbar(im, pad=0.025)
+    plt.xlabel('X, mm', fontsize=12)
+    plt.ylabel('Y, mm', fontsize=12)
+    plt.title("Relative difference")
+
+    plt.subplots_adjust(left=0.05, right=0.95, top=0.88, bottom=0.12)
+    plt.show()
+
+
+def run_simulation():
+    """
+    Run two simulations for two different detectors and plot results
+    """
+    result = {}
+
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+
+    # runs simulation for spherical detector
+    simulation.setDetector(get_spherical_detector())
+    simulation.runSimulation()
+    result['spherical'] = simulation.getIntensityData()
+
+    # runs simulation for rectangular detector
+    simulation.setDetector(get_rectangular_detector())
+    simulation.runSimulation()
+    result['rectangular'] = simulation.getIntensityData()
+
+    result['difference'] = result['spherical'].relativeDifferenceHistogram(
+        result['rectangular'])
+
+    return result
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result, plot)
diff --git a/Examples/python/simulation/ex05_BeamAndDetector/SpecularSimulation.py b/Examples/python/simulation/ex05_BeamAndDetector/SpecularSimulation.py
new file mode 100644
index 0000000..e34d4d6
--- /dev/null
+++ b/Examples/python/simulation/ex05_BeamAndDetector/SpecularSimulation.py
@@ -0,0 +1,109 @@
+"""
+R and T coefficients in multilayer, ba.Specular simulation.
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+alpha_i_min, alpha_i_max = 0.0, 2.0  # incoming beam
+
+
+def get_sample():
+    """
+    Returns a sample with two layers on a substrate, with correlated roughnesses.
+    """
+    m_ambience = ba.HomogeneousMaterial("ambience", 0.0, 0.0)
+    m_part_a = ba.HomogeneousMaterial("PartA", 5e-6, 0.0)
+    m_part_b = ba.HomogeneousMaterial("PartB", 10e-6, 0.0)
+    m_substrate = ba.HomogeneousMaterial("substrate", 15e-6, 0.0)
+
+    l_ambience = ba.Layer(m_ambience)
+    l_part_a = ba.Layer(m_part_a, 5.0*nm)
+    l_part_b = ba.Layer(m_part_b, 10.0*nm)
+    l_substrate = ba.Layer(m_substrate)
+
+    roughness = ba.LayerRoughness()
+    roughness.setSigma(1.0*nm)
+    roughness.setHurstParameter(0.3)
+    roughness.setLatteralCorrLength(500.0*nm)
+
+    my_sample = ba.MultiLayer()
+
+    # adding layers
+    my_sample.addLayer(l_ambience)
+
+    n_repetitions = 10
+    for i in range(n_repetitions):
+        my_sample.addLayerWithTopRoughness(l_part_a, roughness)
+        my_sample.addLayerWithTopRoughness(l_part_b, roughness)
+
+    my_sample.addLayerWithTopRoughness(l_substrate, roughness)
+    # my_sample.setCrossCorrLength(1e-4)
+
+    return my_sample
+
+
+def get_simulation():
+    """
+    Returns a specular simulation with beam and detector defined.
+    """
+    simulation = ba.SpecularSimulation()
+    simulation.setBeamParameters(
+        1.54*angstrom, 1000, alpha_i_min*deg, alpha_i_max*deg)
+    return simulation
+
+
+def simulate():
+    """
+    Runs simulation and returns it.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation
+
+
+def coefficientsRT(simulation):
+    """
+    Returns lists R[0:layer_index], L[0:layer_index]
+    """
+    R = [ [ abs(c) for c in simulation.getScalarR(i) ] for i in range(22) ]
+    T = [ [ abs(c) for c in simulation.getScalarT(i) ] for i in range(22) ]
+    return R, T
+
+
+def plot(simulation):
+    """
+    Plots results for several selected layers
+    """
+    import matplotlib
+    from matplotlib import pyplot as plt
+    fig = plt.figure(figsize=(12.80, 10.24))
+
+    alpha_angles = simulation.getAlphaAxis().getBinCenters()
+    R, T = coefficientsRT(simulation)
+
+    selected_layers = [0, 1, 20, 21]
+    nplot = 1
+    for layer_index in selected_layers:
+        plt.subplot(2, 2, nplot)
+        plt.ylim(ymax=50.0, ymin=1e-06)
+        plt.xlabel(r'$\alpha_f$ (rad)', fontsize=16)
+        plt.semilogy(alpha_angles, [ numpy.abs(coeff) for coeff in R[layer_index] ])
+        plt.semilogy(alpha_angles, [ numpy.abs(coeff) for coeff in T[layer_index] ])
+        plt.legend(['|R| layer #'+str(layer_index),
+                    '|T| layer #'+str(layer_index)],
+                   loc='upper right')
+        nplot = nplot + 1
+
+    plt.show()
+
+
+def save(filename, simulation):
+    R, T = coefficientsRT(simulation)
+    ba.yamlDump(filename, { "coeff_R": ba.FlowSeq(R), "coeff_T": ba.FlowSeq(T) })
+
+
+if __name__ == '__main__':
+    ba.simulateThenPlotOrSave(simulate, plot, save)
diff --git a/Examples/python/simulation/ex06_Miscellaneous/AccessingSimulationResults.py b/Examples/python/simulation/ex06_Miscellaneous/AccessingSimulationResults.py
new file mode 100644
index 0000000..cb3bc15
--- /dev/null
+++ b/Examples/python/simulation/ex06_Miscellaneous/AccessingSimulationResults.py
@@ -0,0 +1,194 @@
+"""
+Extended example for simulation results treatment (cropping, slicing, exporting)
+The standard "Cylinders in DWBA" sample is used to setup the simulation.
+"""
+import math
+import numpy
+import random
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+import matplotlib
+from matplotlib import pyplot as plt
+
+phi_min, phi_max = -2.0, 2.0
+alpha_min, alpha_max = 0.0, 2.0
+
+
+def get_sample():
+    """
+    Returns a sample with uncorrelated cylinders on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam and detector defined.
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setDetectorParameters(200, phi_min*deg, phi_max*deg,
+                                     200, alpha_min*deg, alpha_max*deg)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    return simulation
+
+
+def plot_as_colormap(hist, zmin=None, zmax=None):
+    """
+    Simple plot of intensity data as color map
+    """
+    if not zmin:
+        zmin = 1.0
+
+    if not zmax:
+        zmax = hist.getMaximum()
+
+    im = plt.imshow(
+        hist.getArray(),
+        norm=matplotlib.colors.LogNorm(zmin, zmax),
+        extent=[hist.getXmin()/deg, hist.getXmax()/deg,
+                hist.getYmin()/deg, hist.getYmax()/deg],
+        aspect='auto')
+    cb = plt.colorbar(im, pad=0.025)
+    plt.xlabel(r'$\phi_f ^{\circ}$', fontsize=16)
+    plt.ylabel(r'$\alpha_f ^{\circ}$', fontsize=16)
+
+
+def plot_cropped_map(hist):
+    """
+    Plot cropped version of intensity data
+    """
+    crop = hist.crop(-1.0*deg, 0.5*deg, 1.0*deg, 1.0*deg)
+    plot_as_colormap(crop)
+
+
+def get_noisy_image(hist):
+    """
+    Returns clone of input histogram filled with additional noise
+    """
+    result = hist.clone()
+    noise_factor = 2.0
+    for i in range(0, result.getTotalNumberOfBins()):
+        amplitude = result.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = random.gauss(amplitude, sigma)
+        result.setBinContent(i, noisy_amplitude)
+    return result
+
+
+def plot_relative_difference(hist):
+    """
+    Creates noisy histogram made of original histogram,
+    then creates and plots a relative difference histogram: (noisy-hist)/hist
+    """
+    noisy = get_noisy_image(hist)
+    diff = noisy.relativeDifferenceHistogram(hist)
+    plot_as_colormap(diff, zmin=1e-03, zmax=10)
+
+
+def plot_slices(hist):
+    """
+    Plot 1D slices along y-axis at certain x-axis values.
+    """
+    noisy = get_noisy_image(hist)
+
+    # projection along Y, slice at fixed x-value
+    proj1 = noisy.projectionY(0.0*deg)
+    plt.semilogy(proj1.getBinCenters()/deg,
+                 proj1.getBinValues(),
+                 label=r'$\phi=0.0^{\circ}$')
+
+    # projection along Y, slice at fixed x-value
+    proj2 = noisy.projectionY(0.5*deg)  # slice at fixed value
+    plt.semilogy(proj2.getBinCenters()/deg,
+                 proj2.getBinValues(),
+                 label=r'$\phi=0.5^{\circ}$')
+
+    # projection along Y for all X values between [xlow, xup], averaged
+    proj3 = noisy.projectionY(0.4*deg, 0.6*deg)
+    plt.semilogy(proj3.getBinCenters()/deg,
+                 proj3.getArray(ba.IHistogram.AVERAGE),
+                 label=r'$<\phi>=0.5^{\circ}$')
+
+    plt.xlim(proj1.getXmin()/deg, proj1.getXmax()/deg)
+    plt.ylim(1.0, proj1.getMaximum()*10.0)
+    plt.xlabel(r'$\alpha_f ^{\circ}$', fontsize=16)
+    plt.legend(loc='upper right')
+
+
+def save_to_file(result):
+    """
+    Saves intensity data into file
+    """
+    result.save("result.int")
+    result.save("result.tif")
+    result.save("result.txt")
+    result.save("result.int.gz")
+    result.save("result.tif.gz")
+    result.save("result.txt.gz")
+    result.save("result.int.bz2")
+    result.save("result.tif.bz2")
+    result.save("result.txt.bz2")
+
+
+def plot(result):
+    """
+    Runs different plotting functions one by one
+    to demonstrate trivial data presentation tasks.
+    """
+
+    fig = plt.figure(figsize=(12.80, 10.24))
+
+    plt.subplot(2, 2, 1)
+    plot_as_colormap(result)
+    plt.title("Intensity as colormap")
+
+    plt.subplot(2, 2, 2)
+    plot_cropped_map(result)
+    plt.title("Cropping")
+
+    plt.subplot(2, 2, 3)
+    plot_relative_difference(result)
+    plt.title("Relative difference")
+
+    plt.subplot(2, 2, 4)
+    plot_slices(result)
+    plt.title("Various slicing of 2D into 1D")
+
+    save_to_file(result)
+
+    plt.subplots_adjust(left=0.07, right=0.97, top=0.9, bottom=0.1, hspace=0.25)
+    plt.show()
+
+
+def run_simulation():
+    """
+    Runs simulation and returns intensity map.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+if __name__ == '__main__':
+    result = run_simulation()
+    ba.plot_intensity_data(result, plot)
diff --git a/Examples/python/simulation/ex06_Miscellaneous/AxesInDifferentUnits.py b/Examples/python/simulation/ex06_Miscellaneous/AxesInDifferentUnits.py
new file mode 100644
index 0000000..69638a6
--- /dev/null
+++ b/Examples/python/simulation/ex06_Miscellaneous/AxesInDifferentUnits.py
@@ -0,0 +1,126 @@
+"""
+In this example we demonstrate how to plot simulation results with
+axes in different units (nbins, mm, degs and QyQz).
+"""
+import numpy
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+detector_distance = 2000.0  # in mm
+pilatus_pixel_size = 0.172  # in mm
+pilatus_npx, pilatus_npy = 981, 1043  # number of pixels
+
+
+def get_sample():
+    """
+    Returns a sample with uncorrelated cylinders on a substrate.
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = ba.HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = ba.FormFactorCylinder(5*nm, 5*nm)
+    cylinder = ba.Particle(m_particle, cylinder_ff)
+    particle_layout = ba.ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(m_substrate)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_rectangular_detector():
+    """
+    Returns rectangular detector representing our PILATUS detector
+    """
+    width = pilatus_npx*pilatus_pixel_size
+    height = pilatus_npy*pilatus_pixel_size
+    detector = ba.RectangularDetector(pilatus_npx, width, pilatus_npy, height)
+    detector.setPerpendicularToSampleX(detector_distance, width/2., 0.0)
+    return detector
+
+
+def get_simulation():
+    """
+    Returns a GISAXS simulation with beam defined
+    """
+    simulation = ba.GISASSimulation()
+    simulation.setBeamParameters(1.0*angstrom, 0.2*deg, 0.0*deg)
+    simulation.setDetector(get_rectangular_detector())
+    return simulation
+
+
+def plot_as_colormap(hist, Title, xLabel, yLabel):
+    """
+    Simple plot of intensity data as color map
+    """
+    im = plt.imshow(
+        hist.getArray(),
+        norm=matplotlib.colors.LogNorm(1.0, hist.getMaximum()),
+        extent=[hist.getXmin(), hist.getXmax(),
+                hist.getYmin(), hist.getYmax()],
+        aspect='auto')
+    cb = plt.colorbar(im, pad=0.025)
+    plt.xlabel(xLabel, fontsize=16)
+    plt.ylabel(yLabel, fontsize=16)
+    plt.title(Title)
+
+
+def simulate():
+    """
+    Run simulation and returns results for different detectors.
+    """
+    sample = get_sample()
+    simulation = get_simulation()
+    simulation.setSample(sample)
+    simulation.runSimulation()
+
+    result = {}
+    result['mm'] = simulation.getIntensityData()
+    result['bin'] = simulation.getIntensityData(ba.IDetector2D.NBINS)
+    result['deg'] = simulation.getIntensityData(ba.IDetector2D.DEGREES)
+    result['nm-1'] = simulation.getIntensityData(ba.IDetector2D.QYQZ)
+
+    return result
+
+
+def plot(result):
+    """
+    Plots simulation results for different detectors.
+    """
+    import matplotlib
+    from matplotlib import pyplot as plt
+    global matplotlib, plt
+    fig = plt.figure(figsize=(12.80, 10.24))
+
+    plt.subplot(2, 2, 1)
+    # default units for rectangular detector are millimeters
+
+    plot_as_colormap(result['mm'], "In default units",
+                     r'$X_{mm}$', r'$Y_{mm}$')
+
+    plt.subplot(2, 2, 2)
+    plot_as_colormap(result['bin'], "In number of bins",
+                     r'$X_{nbins}$', r'$Y_{nbins}$')
+
+    plt.subplot(2, 2, 3)
+    plot_as_colormap(result['deg'], "In degs",
+                     r'$\phi_f ^{\circ}$', r'$\alpha_f ^{\circ}$')
+
+    plt.subplot(2, 2, 4)
+    plot_as_colormap(result['nm-1'], "Q-space",
+                     r'$Q_{y} [1/nm]$', r'$Q_{z} [1/nm]$')
+
+    plt.subplots_adjust(left=0.07, right=0.97, top=0.9, bottom=0.1, hspace=0.25)
+    plt.show()
+
+
+if __name__ == '__main__':
+    ba.simulateThenPlotOrSave(simulate, plot)
diff --git a/Examples/python/utils/__init__.py b/Examples/python/utils/__init__.py
new file mode 100644
index 0000000..b0c679d
--- /dev/null
+++ b/Examples/python/utils/__init__.py
@@ -0,0 +1 @@
+__author__ = ''
diff --git a/Examples/python/utils/plot_intensity_data.py b/Examples/python/utils/plot_intensity_data.py
new file mode 100755
index 0000000..dd6f838
--- /dev/null
+++ b/Examples/python/utils/plot_intensity_data.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+# Plots intensity data stored in BornAgain "*.int" or "*.int.gz" format
+# Usage: python plot_intensity_data.py intensity_file.int.gz
+
+import matplotlib, numpy, sys
+from matplotlib import pyplot as plt
+from matplotlib import rc
+rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
+rc('text', usetex=True)
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def plot_intensity_data(file_name):
+    result = ba.IntensityDataIOFactory.readIntensityData(file_name)
+    im = plt.imshow(result.getArray(),
+                    norm=matplotlib.colors.LogNorm(1.0, result.getMaximum()),
+                    extent=[result.getXmin()/deg, result.getXmax()/deg, result.getYmin()/deg, result.getYmax()/deg],
+                    aspect='auto')
+    cb = plt.colorbar(im)
+    cb.set_label(r'Intensity (arb. u.)', size=16)
+    plt.xlabel(r'$\phi_f (^{\circ})$', fontsize=16)
+    plt.ylabel(r'$\alpha_f (^{\circ})$', fontsize=16)
+    plt.show()
+
+
+if __name__ == '__main__':
+    if len(sys.argv)!=2:
+        exit("Usage: plot_intensity_data.py intensity_file.int.gz")
+
+    plot_intensity_data(sys.argv[1])
diff --git a/Examples/python/utils/plot_intensity_data_diff.py b/Examples/python/utils/plot_intensity_data_diff.py
new file mode 100755
index 0000000..ff781ca
--- /dev/null
+++ b/Examples/python/utils/plot_intensity_data_diff.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# Plots intensity data difference stored in BornAgain "*.int" or "*.int.gz" format
+# Usage: python plot_intensity_data.py intensity_reference.int.gz intensity_other.int.gz
+
+import matplotlib, numpy, sys
+from matplotlib import pyplot as plt
+from matplotlib import rc
+rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
+rc('text', usetex=True)
+import bornagain as ba
+from bornagain import deg, angstrom, nm
+
+
+def plot_intensity_data(ref, data):
+    im = plt.imshow(
+        data,
+        norm=matplotlib.colors.LogNorm(),
+        extent=[ref.getXmin()/deg, ref.getXmax()/deg, ref.getYmin()/deg, ref.getYmax()/deg],
+        aspect='auto')
+
+    cb = plt.colorbar(im)
+    cb.set_label(r'Intensity (arb. u.)', size=16)
+    plt.xlabel(r'$\phi_f (^{\circ})$', fontsize=16)
+    plt.ylabel(r'$\alpha_f (^{\circ})$', fontsize=16)
+    plt.show()
+
+
+if __name__ == '__main__':
+    if len(sys.argv)!=3:
+        exit("Usage: plot_intensity_data_diff.py reference.int.gz other.int.gz")
+
+    intensity_ref = ba.IntensityDataIOFactory.readIntensityData(sys.argv[1])
+    intensity_other = ba.IntensityDataIOFactory.readIntensityData(sys.argv[2])
+    data = 2*numpy.abs(intensity_ref.getArray() - intensity_other.getArray())/
+           (numpy.abs(intensity_ref.getArray())+numpy.abs(intensity_other.getArray()))
+    plot_intensity_data(intensity_ref, data)
diff --git a/Examples/python/utils/show2d.py b/Examples/python/utils/show2d.py
new file mode 100755
index 0000000..911cb2a
--- /dev/null
+++ b/Examples/python/utils/show2d.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+# Draws two dimensional numpy array using matplotlib
+# Usage: python show2d.py file_name
+
+from __future__ import print_function
+from pylab import *
+from matplotlib.colors import LogNorm
+import argparse
+import os
+
+
+# Define a nice colormap
+cdict = {'red':   ((0.0, 0.0, 0.0), (0.5, 0.0, 0.0), (1.0, 1.0, 1.0)),
+         'green': ((0.0, 0.0, 0.0), (0.5, 0.0, 0.0), (1.0, 1.0, 1.0)),
+         'blue':  ((0.0, 0.0, 0.0), (0.5, 1.0, 1.0), (1.0, 1.0, 1.0))}
+blue_cmap = matplotlib.colors.LinearSegmentedColormap('blue_map', cdict, 256)
+
+
+def PlotNumpyArray(a, zmin = 1, zmax = None):
+    # Make a plot of the data
+    #print( "plotting..." )
+    amax=a.flatten().max()
+    amean=np.sum(a)/a.size
+    aminplot=amean**2/amax
+    a=np.maximum(a, zmin)
+    dataarray=np.flipud(np.transpose(a))
+    plt.xlabel(r'$\phi_f$', fontsize=20)
+    plt.ylabel(r'$\alpha_f$', fontsize=20)
+    # Use one of the predefined colormaps or the above defined 'blue_cmap':
+    im=plt.imshow(dataarray, norm=LogNorm(), vmax=zmax, cmap=cm.jet) #, interpolation='none')
+    plt.gca().axes.get_xaxis().set_ticks([])
+    plt.gca().axes.get_yaxis().set_ticks([])
+    plt.colorbar(im)
+
+    # Show the plot
+    #print( "showing..." )
+    # Uncomment the next lines to generate a pdf from the plot
+    #extension = 'pdf'
+    #plt.savefig(file_no_prefix + '.%s' %extension, format=extension)
+    plt.show()
+
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    # Define the arguments to the script
+    parser = argparse.ArgumentParser(description='Plot 2D data table on log scale.')
+    parser.add_argument('-m', '--minz', dest='zmin', metavar='MINZ',
+        help='minimum z-value to display [default: 1]',
+        default='1')
+    parser.add_argument('-M', '--maxz', dest='zmax', metavar='MAXZ',
+        help='maximum z-value to display [default: maximum value of data set]',
+        default=None)
+    parser.add_argument('filename', metavar='filename',
+        help='filename of the data file')
+
+    # Parse the script's arguments
+    args = parser.parse_args()
+    zmin = float(args.zmin)
+    if (args.zmax):
+        zmax = float(args.zmax)
+    else:
+        zmax = None
+    filename = args.filename
+
+    # Load the file's data
+    print( "loading..." )
+    a=np.loadtxt(filename)
+    file_no_prefix = os.path.splitext(os.path.basename(filename))[0]
+    print('Filename: ', file_no_prefix)
+    print('Data shape: ', a.shape)
+    print('Minimum value of data: ', a.flatten().min())
+    print('Maximum value of data: ', a.flatten().max())
+
+    PlotNumpyArray(a, zmin, zmax)
diff --git a/Examples/python/utils/show2d_root.py b/Examples/python/utils/show2d_root.py
new file mode 100755
index 0000000..cb3d1db
--- /dev/null
+++ b/Examples/python/utils/show2d_root.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+# Draws two dimensional numpy array using ROOT
+# Usage: python show2d.py file_name
+
+from __future__ import print_function
+import argparse
+import os
+import numpy
+import ROOT
+from pylab import *
+
+
+def PlotNumpyArrayWithROOT(a, zmin = 1, zmax = None):
+    nx = a.shape[0]
+    ny = a.shape[1]
+    hist = ROOT.TH2D("hist","hist",nx,0,nx, ny, 0, ny)
+    for (x,y), value in numpy.ndenumerate(a):
+        hist.Fill(x,y,value)
+
+    c1 = ROOT.TCanvas("c1","numpy array", 1024,768)
+    c1.SetLogz()
+    hist.SetMinimum(zmin)
+    hist.Draw("CONT4Z")
+    c1.Update()
+    ROOT.gApplication.Run()
+    #Interrupt = False
+    #while not Interrupt:
+        #Interrupt = ROOT.gSystem.ProcessEvents()
+        #ROOT.gSystem.Sleep(10)
+
+
+#-------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    # Define the arguments to the script
+    parser = argparse.ArgumentParser(description='Plot 2D data table on log scale.')
+    parser.add_argument('-m', '--minz', dest='zmin', metavar='MINZ',
+        help='minimum z-value to display [default: 1]',
+        default='1')
+    parser.add_argument('-M', '--maxz', dest='zmax', metavar='MAXZ',
+        help='maximum z-value to display [default: maximum value of data set]',
+        default=None)
+    parser.add_argument('filename', metavar='filename',
+        help='filename of the data file')
+
+    # Parse the script's arguments
+    args = parser.parse_args()
+    zmin = float(args.zmin)
+    if (args.zmax):
+        zmax = float(args.zmax)
+    else:
+        zmax = None
+    filename = args.filename
+
+    # Load the file's data
+    print( "loading..." )
+    a=np.loadtxt(filename)
+    file_no_prefix = os.path.splitext(os.path.basename(filename))[0]
+    print('Filename: ', file_no_prefix)
+    print('Data shape: ', a.shape)
+    print('Minimum value of data: ', a.flatten().min())
+    print('Maximum value of data: ', a.flatten().max())
+
+    PlotNumpyArrayWithROOT(a, zmin, zmax)
+
+        
diff --git a/Fit/CMakeLists.txt b/Fit/CMakeLists.txt
new file mode 100644
index 0000000..dcec5e9
--- /dev/null
+++ b/Fit/CMakeLists.txt
@@ -0,0 +1,176 @@
+############################################################################
+# CMakeLists.txt file for building libBornAgainFit library
+############################################################################
+
+set(library_name BornAgainFit)
+
+if(POLICY CMP0042)
+    cmake_policy(SET CMP0042 NEW)
+endif()
+
+# --- source and include files ------
+set(FIT_SOURCE_DIRS
+    ${CMAKE_CURRENT_SOURCE_DIR}/Utils
+    ${CMAKE_CURRENT_SOURCE_DIR}/Kernel
+    ${CMAKE_CURRENT_SOURCE_DIR}/Parameters
+    ${CMAKE_CURRENT_SOURCE_DIR}/RootAdapter
+    )
+
+set(include_dirs ${BUILD_INC_DIR} ${CMAKE_SOURCE_DIR}/Wrap ${FIT_SOURCE_DIRS})
+
+file(GLOB source_files */*.cpp)
+file(GLOB include_files */*.h)
+
+if(BORNAGAIN_PYTHON)
+
+    set(AUTO_DIR ${CMAKE_SOURCE_DIR}/auto/Wrap)
+    file(MAKE_DIRECTORY ${AUTO_DIR})
+    include_directories(${AUTO_DIR})
+
+    set(swig_include_dirs ${CMAKE_SOURCE_DIR}/Wrap ${FIT_SOURCE_DIRS})
+    include_directories(${swig_include_dirs})
+
+    if(BORNAGAIN_GENERATE_BINDINGS)
+
+        set(WRAP_DIR ${CMAKE_SOURCE_DIR}/Wrap)
+        set(TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/Wrap)
+        file(MAKE_DIRECTORY ${TMP_DIR})
+
+        GeneratePythonDocs(${AUTO_DIR}/doxygen_fit.i ${WRAP_DIR}/swig)
+
+        set(swig_dependencies
+            ${WRAP_DIR}/swig/libBornAgainFit.i
+            ${WRAP_DIR}/swig/directors.i
+            ${WRAP_DIR}/swig/extendFit.i
+            ${WRAP_DIR}/swig/ignores.i
+            ${WRAP_DIR}/swig/shared_pointers.i
+            ${WRAP_DIR}/swig/warnings.i
+            )
+        foreach(FNAM ${swig_dependencies})
+            if(NOT EXISTS ${FNAM})
+                message(FATAL_ERROR "Could NOT find SWIG input ${FNAM}")
+            endif()
+        endforeach()
+        set(swig_dependencies ${swig_dependencies} ${AUTO_DIR}/doxygen_fit.i)
+
+        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/libBornAgainFit_wrap.cpp;-outdir;${TMP_DIR}")
+        foreach(dir ${swig_include_dirs})
+            list(APPEND SWIG_FLAGS "-I${dir}")
+        endforeach(dir)
+
+        add_custom_command (
+            OUTPUT ${AUTO_DIR}/libBornAgainFit.py
+            COMMAND ${PYTHON_EXECUTABLE} ${WRAP_DIR}/swig/tweaks.py
+                   ${TMP_DIR}/libBornAgainFit.py
+                   ${AUTO_DIR}/libBornAgainFit.py
+            DEPENDS ${TMP_DIR}/libBornAgainFit.py
+            )
+        add_custom_command (
+            OUTPUT ${TMP_DIR}/libBornAgainFit.py
+                   ${AUTO_DIR}/libBornAgainFit_wrap.h
+                   ${AUTO_DIR}/libBornAgainFit_wrap.cpp
+            COMMAND ${SWIG_EXECUTABLE} ${SWIG_FLAGS} ${WRAP_DIR}/swig/libBornAgainFit.i
+            DEPENDS ${swig_dependencies} ${include_files}
+            )
+
+    endif(BORNAGAIN_GENERATE_BINDINGS)
+
+    add_custom_target (
+        ${library_name}_python
+        COMMAND ${CMAKE_COMMAND} -E copy ${AUTO_DIR}/libBornAgainFit.py
+             ${CMAKE_BINARY_DIR}/lib/libBornAgainFit.py
+        DEPENDS ${AUTO_DIR}/libBornAgainFit.py
+        )
+
+    list(APPEND source_files "${AUTO_DIR}/libBornAgainFit_wrap.cpp")
+    #list(APPEND include_files "${AUTO_DIR}/libBornAgainFit_wrap.h")
+
+endif()
+
+# --- definitions ---------
+if(WIN32)
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBA_CORE_BUILD_DLL")
+endif()
+
+# --- making library ---------
+add_library(${library_name} SHARED ${include_files} ${source_files})
+set_Target_properties(${library_name} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
+set(${library_name}_LIBRARY_TYPE SHARED)
+
+if(BORNAGAIN_PYTHON)
+    add_dependencies(${library_name} ${library_name}_python)
+endif()
+
+# exposing library name and list of include directories outside
+set(${library_name}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+
+# --- dependencies ---------
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${RootMinimizers_INCLUDE_DIRS}
+    ${GSL_INCLUDE_DIR}
+    )
+
+target_link_libraries(
+    ${library_name}
+    ${Boost_LIBRARIES}
+    ${RootMinimizers_LIBRARY}
+    ${GSL_LIBRARIES}
+    )
+
+if(BORNAGAIN_PYTHON)
+    include_directories(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR})
+    target_link_libraries(${library_name} ${PYTHON_LIBRARIES})
+endif()
+
+# --- custom actions
+# python in windows required .pyd extention for the library name
+if(WIN32 AND BORNAGAIN_PYTHON)
+    ADD_CUSTOM_COMMAND(
+        TARGET ${library_name}
+        POST_BUILD
+        COMMAND ${CMAKE_COMMAND} -E copy
+        ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
+        ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}".pyd"
+        )
+    # for functional tests
+    ADD_CUSTOM_COMMAND(
+        TARGET ${library_name}
+        POST_BUILD
+        COMMAND ${CMAKE_COMMAND} -E copy
+        ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
+        ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}${libsuffix}
+        )
+
+endif()
+
+if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
+    #    set(link_flags "-Wl,-rpath, at loader_path/../..")
+    set(link_flags "-Wl,-rpath, at loader_path/../../Frameworks")
+    set_target_properties(${library_name} PROPERTIES LINK_FLAGS ${link_flags})
+endif()
+
+# -----------------------------------------------
+# installation
+# -----------------------------------------------
+install (TARGETS ${library_name} DESTINATION ${destination_lib} COMPONENT Libraries)
+install (FILES ${fitkernel_include_files} DESTINATION ${destination_include}  COMPONENT Headers)
+install (FILES ${CMAKE_BINARY_DIR}/lib/lib${library_name}.py DESTINATION ${destination_lib} COMPONENT Libraries) # required by SWIG
+install (FILES ${include_files} DESTINATION ${destination_include} COMPONENT Headers)
+
+if(WIN32)
+    if(BORNAGAIN_PYTHON)
+        ADD_CUSTOM_COMMAND(
+            TARGET ${library_name}
+            POST_BUILD
+            COMMAND ${CMAKE_COMMAND} -E copy
+            ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
+            ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}".pyd"
+            )
+
+        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}.pyd DESTINATION ${destination_lib} COMPONENT Libraries)
+        install(FILES ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}.pyd DESTINATION ${destination_bin} COMPONENT Libraries)
+    endif()
+endif()
diff --git a/Fit/Kernel/FitKernel.cpp b/Fit/Kernel/FitKernel.cpp
new file mode 100644
index 0000000..cce07d2
--- /dev/null
+++ b/Fit/Kernel/FitKernel.cpp
@@ -0,0 +1,103 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/FitKernel.cpp
+//! @brief     Implements class FitKernel.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitKernel.h"
+#include "FitKernelImpl.h"
+#include "MinimizerFactory.h"
+#include "FitParameter.h"
+
+namespace {
+const std::string default_minimizer = "Minuit2";
+const std::string default_algorithm = "Migrad";
+}
+
+FitKernel::FitKernel()
+    : m_impl(new FitKernelImpl)
+{
+    setMinimizer(default_minimizer, default_algorithm);
+}
+
+FitKernel::~FitKernel()
+{
+
+}
+
+void FitKernel::clear()
+{
+    m_impl->clear();
+}
+
+void FitKernel::setMinimizer(const std::string &minimizerName, const std::string &algorithmName)
+{
+    m_impl->setMinimizer(MinimizerFactory::createMinimizer(minimizerName, algorithmName));
+}
+
+void FitKernel::setMinimizer(IMinimizer *minimizer)
+{
+    if(!minimizer)
+        throw std::runtime_error("FitKernel::setMinimizer() -> Error. Nullptr minimizer");
+
+    m_impl->setMinimizer(minimizer);
+}
+
+const IMinimizer *FitKernel::minimizer() const
+{
+    return m_impl->minimizer();
+}
+
+void FitKernel::addFitParameter(const std::string& name, double value,
+                     const AttLimits& limits, double step)
+{
+    if(step <= 0.0)
+        throw std::runtime_error("FitKernel::addFitParameter() -> Error. Step can't be <= 0.0.");
+
+    m_impl->addFitParameter(new FitParameter(name, value, limits, step));
+}
+
+
+void FitKernel::setObjectiveFunction(objective_function_t func)
+{
+    m_impl->setObjectiveFunction(func);
+}
+
+void FitKernel::setGradientFunction(gradient_function_t func, int ndatasize)
+{
+    m_impl->setGradientFunction(func, ndatasize);
+}
+
+void FitKernel::minimize()
+{
+    m_impl->minimize();
+}
+
+std::string FitKernel::reportResults() const
+{
+    return m_impl->reportResults();
+}
+
+FitParameterSet *FitKernel::fitParameters()
+{
+    return const_cast<FitParameterSet *>(static_cast<const FitKernel*>(this)->fitParameters());
+}
+
+const FitParameterSet *FitKernel::fitParameters() const
+{
+    return m_impl->fitParameters();
+}
+
+int FitKernel::functionCalls() const
+{
+    return m_impl->functionCalls();
+}
diff --git a/Fit/Kernel/FitKernel.h b/Fit/Kernel/FitKernel.h
new file mode 100644
index 0000000..33c8616
--- /dev/null
+++ b/Fit/Kernel/FitKernel.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/FitKernel.h
+//! @brief     Defines class FitKernel.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITKERNEL_H
+#define FITKERNEL_H
+
+#include "WinDllMacros.h"
+#include "KernelTypes.h"
+#include <memory>
+#include <string>
+
+class FitKernelImpl;
+class AttLimits;
+class FitParameterSet;
+class IMinimizer;
+
+//! @class FitKernel
+//! @ingroup fitting_internal
+//! @brief Main class to setup and run the minimization.
+
+class BA_CORE_API_ FitKernel
+{
+public:
+    FitKernel();
+    ~FitKernel();
+
+    void clear();
+
+    //! Sets minimizer with given name and algorithm type
+    //! @param minimizerName The name of the minimizer
+    //! @param algorithmName Optional name of the minimizer's algorithm
+    void setMinimizer(const std::string& minimizerName,
+                      const std::string& algorithmName = std::string());
+
+    void setMinimizer(IMinimizer* minimizer);
+
+    //! Returns minimizer.
+    const IMinimizer *minimizer() const;
+
+    //! Adds fit parameter
+    void addFitParameter(const std::string& name, double value,
+                         const AttLimits& limits, double step);
+
+    void setObjectiveFunction(objective_function_t func);
+
+    void setGradientFunction(gradient_function_t func, int ndatasize);
+
+    void minimize();
+
+    //! Reports results of minimization in the form of multi-line string.
+    std::string reportResults() const;
+
+    FitParameterSet* fitParameters();
+    const FitParameterSet* fitParameters() const;
+
+    //! Number of objective function calls.
+    int functionCalls() const;
+private:
+    std::unique_ptr<FitKernelImpl> m_impl;
+};
+
+#endif // FITKERNEL_H
diff --git a/Fit/Kernel/FitKernelImpl.cpp b/Fit/Kernel/FitKernelImpl.cpp
new file mode 100644
index 0000000..49d0b32
--- /dev/null
+++ b/Fit/Kernel/FitKernelImpl.cpp
@@ -0,0 +1,113 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/FitKernelImpl.cpp
+//! @brief     Declares class FitKernelImpl.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitKernelImpl.h"
+#include "IMinimizer.h"
+#include "MinimizerUtils.h"
+#include <sstream>
+
+FitKernelImpl::FitKernelImpl()
+{
+
+}
+
+FitKernelImpl::~FitKernelImpl()
+{
+
+}
+
+void FitKernelImpl::clear()
+{
+    m_fit_parameters.clear();
+    m_minimizer.reset();
+}
+
+void FitKernelImpl::setMinimizer(IMinimizer *minimizer)
+{
+    m_minimizer.reset(minimizer);
+}
+
+void FitKernelImpl::addFitParameter(FitParameter *par)
+{
+    m_fit_parameters.addFitParameter(par);
+}
+
+void FitKernelImpl::setObjectiveFunction(objective_function_t func)
+{
+    m_objective_function.setObjectiveFunction(func);
+}
+
+void FitKernelImpl::setGradientFunction(gradient_function_t func, int ndatasize)
+{
+    m_objective_function.setGradientFunction(func, ndatasize);
+}
+
+void FitKernelImpl::minimize()
+{
+    if(!m_minimizer)
+        throw std::runtime_error("FitKernelImpl::minimize() -> Error. Minimizer is not defined.");
+
+    if(m_fit_parameters.size() == 0)
+        throw std::runtime_error("FitKernelImpl::minimize() -> Error. No fit parameters defined.");
+
+    m_time_interval.start();
+
+    objective_function_t func =
+        [&](const std::vector<double> &pars) { return m_objective_function.evaluate(pars); };
+    m_minimizer->setObjectiveFunction(func);
+
+    gradient_function_t gradient_func =
+        [&](const std::vector<double>& pars, int index, std::vector<double> &gradients)
+    {
+        return m_objective_function.evaluate_gradient(pars, index, gradients);
+    };
+    m_minimizer->setGradientFunction(gradient_func, m_objective_function.sizeOfData());
+
+    m_minimizer->setParameters(m_fit_parameters);
+
+    m_minimizer->minimize();
+
+    // set found values to the parameters
+    m_minimizer->propagateResults(m_fit_parameters);
+
+    m_time_interval.stop();
+}
+
+std::string FitKernelImpl::reportResults() const
+{
+    std::ostringstream result;
+    result << std::endl;
+    result << MinimizerUtils::sectionString("FitSuite::printResults");
+    result << "functionCalls: " << m_objective_function.functionCalls()
+           << " (" << m_time_interval.runTime() << " sec total)" << "\n";
+    result << m_minimizer->reportResults();
+    result << m_fit_parameters.reportResults();
+    return result.str();
+}
+
+FitParameterSet *FitKernelImpl::fitParameters()
+{
+    return &m_fit_parameters;
+}
+
+IMinimizer *FitKernelImpl::minimizer()
+{
+    return m_minimizer.get();
+}
+
+int FitKernelImpl::functionCalls() const
+{
+    return m_objective_function.functionCalls();
+}
diff --git a/Fit/Kernel/FitKernelImpl.h b/Fit/Kernel/FitKernelImpl.h
new file mode 100644
index 0000000..503aa50
--- /dev/null
+++ b/Fit/Kernel/FitKernelImpl.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/FitKernelImpl.h
+//! @brief     Defines class FitKernelImpl.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITKERNELIMPL_H
+#define FITKERNELIMPL_H
+
+#include "WinDllMacros.h"
+#include "KernelTypes.h"
+#include "FitParameterSet.h"
+#include "ObjectiveFunction.h"
+#include "TimeInterval.h"
+#include <memory>
+
+class IMinimizer;
+class FitParameter;
+
+//! @class FitKernelImpl
+//! @ingroup fitting_internal
+//! @brief The FitKernel implementation.
+
+class BA_CORE_API_ FitKernelImpl
+{
+public:
+    FitKernelImpl();
+    ~FitKernelImpl();
+
+    void clear();
+
+    //! Sets minimizer
+    void setMinimizer(IMinimizer* minimizer);
+
+    //! Adds fit parameter
+    void addFitParameter(FitParameter* par);
+
+    void setObjectiveFunction(objective_function_t func);
+
+    void setGradientFunction(gradient_function_t func, int ndatasize);
+
+    void minimize();
+
+    //! Reports results of minimization in the form of multi-line string.
+    std::string reportResults() const;
+
+    FitParameterSet* fitParameters();
+
+    IMinimizer *minimizer();
+
+    //! Number of objective function calls.
+    int functionCalls() const;
+private:
+    FitParameterSet m_fit_parameters;
+    std::unique_ptr<IMinimizer> m_minimizer;
+    ObjectiveFunction m_objective_function;
+    TimeInterval m_time_interval;
+};
+
+#endif // FITKERNELIMPL_H
diff --git a/Fit/Kernel/FitOptions.h b/Fit/Kernel/FitOptions.h
new file mode 100644
index 0000000..6a5ea43
--- /dev/null
+++ b/Fit/Kernel/FitOptions.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/FitOptions.h
+//! @brief     Defines class FitOptions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITOPTIONS_H
+#define FITOPTIONS_H
+
+#include "WinDllMacros.h"
+
+//! @class FitOptions
+//! @ingroup fitting
+//! @brief General fitting options.
+
+class BA_CORE_API_ FitOptions
+{
+ public:
+    FitOptions();
+    ~FitOptions(){}
+
+    double derivEpsilon() const;
+    void setDerivEpsilon(double deriv_epsilon);
+
+    double stepFactor() const;
+    void setStepFactor(double step_factor);
+
+ private:
+    double m_deriv_epsilon;  //! epsilon for derivative calculation
+    double m_step_factor; //! default relative parameter step
+};
+
+inline FitOptions::FitOptions()
+    : m_deriv_epsilon(1e-09)
+    , m_step_factor(0.01)
+{
+}
+
+inline double FitOptions::derivEpsilon() const
+{
+    return m_deriv_epsilon;
+}
+
+inline void FitOptions::setDerivEpsilon(double deriv_epsilon)
+{
+    m_deriv_epsilon = deriv_epsilon;
+}
+
+inline double FitOptions::stepFactor() const
+{
+    return m_step_factor;
+}
+
+inline void FitOptions::setStepFactor(double step_factor)
+{
+    m_step_factor = step_factor;
+}
+
+#endif // FITOPTIONS_H
+
+
diff --git a/Fit/Kernel/IMinimizer.cpp b/Fit/Kernel/IMinimizer.cpp
new file mode 100644
index 0000000..141d63f
--- /dev/null
+++ b/Fit/Kernel/IMinimizer.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/IMinimizer.cpp
+//! @brief     Implements class IMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IMinimizer.h"
+
+std::string IMinimizer::minimizerName() const
+{
+    return std::string();
+}
+
+std::string IMinimizer::algorithmName() const
+{
+    return std::string();
+}
+
+void IMinimizer::minimize()
+{
+    throw std::runtime_error("IMinimizer::minimize() -> Not implemented.");
+}
+
+void IMinimizer::clear()
+{
+    throw std::runtime_error("IMinimizer::clear() -> Not implemented.");
+}
+
+void IMinimizer::setParameters(const FitParameterSet & /*parameters*/)
+{
+    throw std::runtime_error("IMinimizer::setParameters() -> Not implemented.");
+}
+
+double IMinimizer::minValue() const
+{
+    throw std::runtime_error("IMinimizer::minValue() -> Not implemented.");
+}
+
+std::string IMinimizer::reportResults() const
+{
+    throw std::runtime_error("IMinimizer::reportResults() -> Not implemented.");
+}
+
+
+void IMinimizer::propagateResults(FitParameterSet &/*parameters*/)
+{
+    throw std::runtime_error("IMinimizer::propagateResults() -> Not implemented.");    
+}
+
+void IMinimizer::setOptions(const std::string &/*options*/)
+{
+    throw std::runtime_error("IMinimizer::setOptions() -> Not implemented.");
+}
diff --git a/Fit/Kernel/IMinimizer.h b/Fit/Kernel/IMinimizer.h
new file mode 100644
index 0000000..a59483c
--- /dev/null
+++ b/Fit/Kernel/IMinimizer.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/IMinimizer.h
+//! @brief     Defines class IMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMINIMIZER_H
+#define IMINIMIZER_H
+
+#include "WinDllMacros.h"
+#include "KernelTypes.h"
+#include <string>
+
+class FitParameterSet;
+
+//! @class IMinimizer
+//! @ingroup fitting_internal
+//! @brief Common interface for all kind minimizer's
+
+class BA_CORE_API_ IMinimizer
+{
+ public:
+    IMinimizer() { }
+    virtual ~IMinimizer() { }
+
+    IMinimizer(const IMinimizer &other) = delete;
+    IMinimizer & operator=(const IMinimizer &other) = delete;
+
+    //! return name of the minimizer
+    virtual std::string minimizerName() const;
+
+    //! return name of the minimization algorithm
+    virtual std::string algorithmName() const;
+
+    //! run minimization
+    virtual void minimize();
+
+    //! clear resources (parameters) for consecutives minimizations
+    virtual void clear();
+
+    //! Sets internal minimizer parameters using external parameter list
+    virtual void setParameters(const FitParameterSet& parameters);
+
+    virtual void setObjectiveFunction(objective_function_t ){}
+
+    virtual void setGradientFunction(gradient_function_t, int ){}
+
+    //! Returns minimum function value
+    virtual double minValue() const;
+
+    //! Prints fit results
+    virtual std::string reportResults() const;
+
+    //! Propagates results of minimization to fit parameter set
+    virtual void propagateResults(FitParameterSet& parameters);
+
+    //! Sets option string to the minimizer
+    virtual void setOptions(const std::string &options);
+};
+
+#endif // IMINIMIZER_H
diff --git a/Fit/Kernel/KernelTypes.h b/Fit/Kernel/KernelTypes.h
new file mode 100644
index 0000000..451955a
--- /dev/null
+++ b/Fit/Kernel/KernelTypes.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/KernelTypes.h
+//! @brief     Defines common types for fitting library.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef KERNELTYPES_H
+#define KERNELTYPES_H
+
+#include <functional>
+#include <vector>
+
+typedef std::function<double(const std::vector<double> &)> objective_function_t;
+
+typedef std::function<double(const std::vector<double> &, unsigned int,
+                             std::vector<double> &)> gradient_function_t;
+
+typedef std::function<double(const double*)> root_objective_t;
+
+typedef std::function<double(const double*, unsigned int, double*)> root_gradient_t;
+
+#endif // KERNELTYPES_H
diff --git a/Fit/Kernel/MinimizerCatalogue.cpp b/Fit/Kernel/MinimizerCatalogue.cpp
new file mode 100644
index 0000000..d92d05f
--- /dev/null
+++ b/Fit/Kernel/MinimizerCatalogue.cpp
@@ -0,0 +1,82 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerCatalogue.cpp
+//! @brief     Implements class MinimizerCatalogue.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerCatalogue.h"
+#include "MinimizerUtils.h"
+#include <sstream>
+#include <boost/format.hpp>
+
+MinimizerCatalogue::MinimizerCatalogue()
+{
+    addMinimizerInfo(MinimizerInfo::buildMinuit2Info());
+    addMinimizerInfo(MinimizerInfo::buildGSLMultiMinInfo());
+    addMinimizerInfo(MinimizerInfo::buildGSLLMAInfo());
+    addMinimizerInfo(MinimizerInfo::buildGSLSimAnInfo());
+    addMinimizerInfo(MinimizerInfo::buildGeneticInfo());
+    addMinimizerInfo(MinimizerInfo::buildTestMinimizerInfo());
+}
+
+//! Returns multiline string representing catalogue content.
+
+std::string MinimizerCatalogue::toString() const
+{
+    const int text_width = 80;
+    std::ostringstream result;
+
+    result << std::string(text_width, '-') << "\n";
+    result << boost::format("%-15s|%-65s\n") % "Minimizer" % " Algorithms";
+    result << std::string(text_width, '-') << "\n";
+
+    for(MinimizerInfo minimizer : m_minimizers) {
+        result << boost::format("%-15s| %-64s\n")
+                  % minimizer.name()
+                  % MinimizerUtils::toString(minimizer.algorithmNames(), std::string(" "));
+
+    }
+    return result.str();
+}
+
+//! Returns list of algorithms defined for the minimizer with a given name.
+
+std::vector<std::string> MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const
+{
+    return minimizerInfo(minimizerName).algorithmNames();
+}
+
+//! Returns list of algorithm's descriptions for the minimizer with a given name    .
+
+std::vector<std::string> MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const
+{
+    return minimizerInfo(minimizerName).algorithmDescriptions();
+}
+
+//! Returns info for minimizer with given name.
+
+MinimizerInfo MinimizerCatalogue::minimizerInfo(const std::string &minimizerName) const
+{
+    for(auto info : m_minimizers)
+        if(info.name() == minimizerName)
+            return info;
+
+    throw std::runtime_error("MinimizerCatalogue::minimizerInfo -> Error. "
+                             "No minimizer with the name '"+minimizerName+"'");
+}
+
+//! Adds minimizer info to the catalogue.
+
+void MinimizerCatalogue::addMinimizerInfo(const MinimizerInfo &info)
+{
+    m_minimizers.push_back(info);
+}
diff --git a/Fit/Kernel/MinimizerCatalogue.h b/Fit/Kernel/MinimizerCatalogue.h
new file mode 100644
index 0000000..f8f9c4f
--- /dev/null
+++ b/Fit/Kernel/MinimizerCatalogue.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerCatalogue.h
+//! @brief     Defines class MinimizerCatalogue.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERCATALOGUE_H
+#define MINIMIZERCATALOGUE_H
+
+#include "WinDllMacros.h"
+#include "MinimizerInfo.h"
+#include <map>
+
+//! @class MinimizerCatalogue
+//! @ingroup fitting_internal
+//! @brief The MinimizerCatalogue class contains information over all minimizers available.
+
+/*
+--------------------------------------------------------------------------------
+Minimizer      | Algorithms
+--------------------------------------------------------------------------------
+Minuit2        | Migrad Simplex Combined Scan Fumili
+GSLMultiMin    | SteepestDescent ConjugateFR ConjugatePR BFGS BFGS2
+GSLLMA         | Default
+GSLSimAn       | Default
+Genetic        | Default
+Test           | Default
+*/
+
+class BA_CORE_API_ MinimizerCatalogue {
+public:
+    MinimizerCatalogue();
+
+    std::string toString() const;
+
+    std::vector<std::string> algorithmNames(const std::string& minimizerName) const;
+
+    std::vector<std::string> algorithmDescriptions(const std::string& minimizerName) const;
+
+private:
+    MinimizerInfo minimizerInfo(const std::string &minimizerName) const;
+
+    void addMinimizerInfo(const MinimizerInfo &info);
+    std::vector<MinimizerInfo> m_minimizers;
+};
+
+#endif // MINIMIZERCATALOGUE_H
diff --git a/Fit/Kernel/MinimizerConstants.h b/Fit/Kernel/MinimizerConstants.h
new file mode 100644
index 0000000..1ad29ff
--- /dev/null
+++ b/Fit/Kernel/MinimizerConstants.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerConstants.h
+//! @brief     Defines class MinimizerConstants.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERCONSTANTS_H
+#define MINIMIZERCONSTANTS_H
+
+#include <string>
+
+namespace MinimizerNames {
+
+const std::string Minuit2 = "Minuit2";
+const std::string GSLMultiMin = "GSLMultiMin";
+const std::string GSLLMA = "GSLLMA";
+const std::string GSLSimAn = "GSLSimAn";
+const std::string Genetic = "Genetic";
+const std::string Test = "Test";
+
+} // namespace MinimizerNames
+
+namespace AlgorithmNames {
+
+const std::string Migrad = "Migrad";
+const std::string Simplex = "Simplex";
+const std::string Combined = "Combined";
+const std::string Scan = "Scan";
+const std::string Fumili = "Fumili";
+
+const std::string SteepestDescent = "SteepestDescent";
+const std::string ConjugateFR = "ConjugateFR";
+const std::string ConjugatePR = "ConjugatePR";
+const std::string BFGS = "BFGS";
+const std::string BFGS2 = "BFGS2";
+
+const std::string Default = "Default";
+
+} // namespace AlgorithmNames
+
+
+namespace OptionNames {
+const std::string Strategy = "Strategy";
+const std::string ErrorDef = "ErrorDef";
+const std::string Tolerance = "Tolerance";
+const std::string Precision = "Precision";
+const std::string PrintLevel = "PrintLevel";
+const std::string MaxFunctionCalls = "MaxFunctionCalls";
+const std::string MaxIterations = "MaxIterations";
+const std::string PopulationSize = "PopSize";
+const std::string RandomSeed = "RandomSeed";
+const std::string IterationTemp = "IterationsAtTemp";
+const std::string StepSize = "StepSize";
+const std::string BoltzmannK = "k";
+const std::string BoltzmannInitT = "t_init";
+const std::string BoltzmannMu = "mu";
+const std::string BoltzmannTmin = "t_min";
+
+} // namespace OptionsNames
+
+#endif // MINIMIZERCONSTANTS_H
diff --git a/Fit/Kernel/MinimizerFactory.cpp b/Fit/Kernel/MinimizerFactory.cpp
new file mode 100644
index 0000000..cfe4654
--- /dev/null
+++ b/Fit/Kernel/MinimizerFactory.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerFactory.cpp
+//! @brief     Implements class MinimizerFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerFactory.h"
+#include "TestMinimizer.h"
+#include "Minuit2Minimizer.h"
+#include "GSLLevenbergMarquardtMinimizer.h"
+#include "GSLMultiMinimizer.h"
+#include "SimAnMinimizer.h"
+#include "GeneticMinimizer.h"
+#include "MinimizerCatalogue.h"
+#include <sstream>
+#include <iostream>
+
+IMinimizer* MinimizerFactory::createMinimizer(const std::string& minimizerName,
+                                              const std::string& algorithmType,
+                                              const std::string& optionString)
+{
+    IMinimizer* result(0);
+
+    if(minimizerName == MinimizerNames::Minuit2) {
+        result = new Minuit2Minimizer(algorithmType);
+    }
+
+    else if(minimizerName == MinimizerNames::GSLLMA) {
+        result = new GSLLevenbergMarquardtMinimizer();
+    }
+
+    else if(minimizerName == MinimizerNames::GSLSimAn) {
+        result = new SimAnMinimizer();
+    }
+
+    else if(minimizerName == MinimizerNames::GSLMultiMin) {
+        result = new GSLMultiMinimizer(algorithmType);
+    }
+
+    else if(minimizerName == MinimizerNames::Genetic) {
+        result = new GeneticMinimizer();
+    }
+
+    if(!result) {
+        std::ostringstream ostr;
+        ostr << "MinimizerFactory::MinimizerFactory() -> Error! Can't create minimizer for given "
+                "collection name '" << minimizerName
+        << "' or algorithm '" << algorithmType << "'" << std::endl;
+        ostr << "Possible names are:" << std::endl;
+
+        ostr << catalogue().toString();
+        throw std::runtime_error(ostr.str());
+    }
+
+    if(!optionString.empty())
+        result->setOptions(optionString);
+
+    return result;
+}
+
+void MinimizerFactory::printCatalogue()
+{
+    std::cout << catalogueToString() << std::endl;
+}
+
+std::string MinimizerFactory::catalogueToString()
+{
+    return catalogue().toString();
+}
+
+const MinimizerCatalogue& MinimizerFactory::catalogue()
+{
+    static MinimizerCatalogue s_catalogue = MinimizerCatalogue();
+    return s_catalogue;
+}
diff --git a/Fit/Kernel/MinimizerFactory.h b/Fit/Kernel/MinimizerFactory.h
new file mode 100644
index 0000000..e681aba
--- /dev/null
+++ b/Fit/Kernel/MinimizerFactory.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerFactory.h
+//! @brief     Defines class MinimizerFactory.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERFACTORY_H
+#define MINIMIZERFACTORY_H
+
+#include "WinDllMacros.h"
+#include "MinimizerCatalogue.h"
+#include <string>
+class IMinimizer;
+
+//! @class MinimizerFactory
+//! @ingroup fitting
+//! @brief Factory to create minimizers
+
+/*!
+
+--------------------------------------------------------------------------------
+Minimizer      | Algorithms
+--------------------------------------------------------------------------------
+Minuit2        | Migrad Simplex Combined Scan Fumili
+GSLMultiMin    | SteepestDescent ConjugateFR ConjugatePR BFGS BFGS2
+GSLLMA         | Default
+GSLSimAn       | Default
+Genetic        | Default
+
+*/
+
+
+class BA_CORE_API_ MinimizerFactory
+{
+ public:
+    static IMinimizer* createMinimizer(const std::string& minimizerName,
+                                       const std::string& algorithmType = std::string(),
+                                       const std::string& optionString  = std::string());
+
+    static void printCatalogue();
+
+    static std::string catalogueToString();
+
+    static const MinimizerCatalogue& catalogue();
+};
+
+#endif // MINIMIZERFACTORY_H
diff --git a/Fit/Kernel/MinimizerInfo.cpp b/Fit/Kernel/MinimizerInfo.cpp
new file mode 100644
index 0000000..625d01e
--- /dev/null
+++ b/Fit/Kernel/MinimizerInfo.cpp
@@ -0,0 +1,172 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerInfo.cpp
+//! @brief     Implements class MinimizerInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerInfo.h"
+#include "MinimizerConstants.h"
+#include <sstream>
+#include <stdexcept>
+
+MinimizerInfo::MinimizerInfo(const std::string& minimizerType,
+                             const std::string& minimizerDescription)
+    : InfoItem(minimizerType, minimizerDescription)
+{
+}
+
+void MinimizerInfo::setAlgorithmName(const std::string &algorithmName)
+{
+    for(AlgorithmInfo algo : m_algorithms) {
+        if(algo.name() == algorithmName) {
+            m_current_algorithm = algorithmName;
+            return;
+        }
+    }
+
+    std::ostringstream msg;
+    msg << "MinimizerInfo::setAlgorithmName() -> Error. Algorithm name '" << algorithmName
+        <<"' is not in the list of defined algorithms (";
+    for(AlgorithmInfo algo : m_algorithms)
+        msg << algo.name() << " ";
+    msg << ")";
+    throw std::runtime_error(msg.str());
+}
+
+std::string MinimizerInfo::algorithmName() const
+{
+    return m_current_algorithm;
+}
+
+//! Return list of defined algorithm names.
+
+std::vector<std::string> MinimizerInfo::algorithmNames() const
+{
+    std::vector<std::string> result;
+    for(AlgorithmInfo algo : m_algorithms)
+        result.push_back(algo.name());
+    return result;
+}
+
+//! Returns list of string with description of all available algorithms.
+
+std::vector<std::string> MinimizerInfo::algorithmDescriptions() const
+{
+    std::vector<std::string> result;
+    for(AlgorithmInfo algo : m_algorithms)
+        result.push_back(algo.description());
+    return result;
+}
+
+//! Creates information for Minuit2Minimizer.
+
+MinimizerInfo MinimizerInfo::buildMinuit2Info(const std::string &defaultAlgo)
+{
+    MinimizerInfo result(MinimizerNames::Minuit2, "Minuit2 minimizer from ROOT library");
+
+    result.addAlgorithm(
+        AlgorithmNames::Migrad,
+        "Variable-metric method with inexact line search, best minimizer according to ROOT.");
+
+    result.addAlgorithm(AlgorithmNames::Simplex, "Simplex method of Nelder and Meadh, robust "
+                                                 "against big fluctuations in objective function.");
+
+    result.addAlgorithm(AlgorithmNames::Combined,
+                        "Combination of Migrad and Simplex (if Migrad fails).");
+
+    result.addAlgorithm(AlgorithmNames::Scan,
+                        "Simple objective function scan, one parameter at a time.");
+
+    result.addAlgorithm(AlgorithmNames::Fumili, "Gradient descent minimizer similar to "
+                                                "Levenberg-Margquardt, sometimes can be better "
+                                                "than all others.");
+
+    if (defaultAlgo.empty()) {
+        result.setAlgorithmName(AlgorithmNames::Migrad);
+    } else {
+        result.setAlgorithmName(defaultAlgo);
+    }
+
+    return result;
+}
+
+//! Creates information for GSLMultiMinMinimizer.
+
+MinimizerInfo MinimizerInfo::buildGSLMultiMinInfo(const std::string &defaultAlgo)
+{
+    MinimizerInfo result(MinimizerNames::GSLMultiMin, "MultiMin minimizer from GSL library");
+
+    result.addAlgorithm(AlgorithmNames::SteepestDescent, "Steepest descent");
+    result.addAlgorithm(AlgorithmNames::ConjugateFR, "Fletcher-Reeves conjugate gradient");
+    result.addAlgorithm(AlgorithmNames::ConjugatePR, "Polak-Ribiere conjugate gradient");
+    result.addAlgorithm(AlgorithmNames::BFGS, "BFGS conjugate gradient");
+    result.addAlgorithm(AlgorithmNames::BFGS2, "BFGS conjugate gradient (Version 2)");
+
+    if(defaultAlgo.empty()) {
+        result.setAlgorithmName(AlgorithmNames::ConjugateFR);
+    } else {
+        result.setAlgorithmName(defaultAlgo);
+    }
+
+    return result;
+}
+
+//! Creates information for GSL's Levenberg-Marquardt.
+
+MinimizerInfo MinimizerInfo::buildGSLLMAInfo()
+{
+    MinimizerInfo result(MinimizerNames::GSLLMA, "Levenberg-Marquardt from GSL library");
+    result.addAlgorithm(AlgorithmNames::Default, "Default algorithm");
+    return result;
+}
+
+//! Creates information for GSL's simmulated annealing algorithm.
+
+MinimizerInfo MinimizerInfo::buildGSLSimAnInfo()
+{
+    MinimizerInfo result(MinimizerNames::GSLSimAn,
+                         "Simmulated annealing minimizer from GSL library");
+    result.addAlgorithm(AlgorithmNames::Default, "Default algorithm");
+    return result;
+}
+
+//! Creates information for TMVA genetic minimizer
+
+MinimizerInfo MinimizerInfo::buildGeneticInfo()
+{
+    MinimizerInfo result(MinimizerNames::Genetic, "Genetic minimizer from TMVA library");
+    result.addAlgorithm(AlgorithmNames::Default, "Default algorithm");
+    return result;
+}
+
+//! Creates information for simple test minimizer
+
+MinimizerInfo MinimizerInfo::buildTestMinimizerInfo()
+{
+    MinimizerInfo result(MinimizerNames::Test, "One-shot minimizer to test whole chain");
+    result.addAlgorithm(AlgorithmNames::Default, "Default algorithm");
+    return result;
+}
+
+//! Adds minimizer algorithm to the list of defined algorithms.
+
+void MinimizerInfo::addAlgorithm(const AlgorithmInfo& algorithm)
+{
+    m_current_algorithm = algorithm.name();
+    m_algorithms.push_back(algorithm);
+}
+
+void MinimizerInfo::addAlgorithm(const std::string& algorithmName,
+                                 const std::string& algorithmDescription)
+{
+    addAlgorithm(AlgorithmInfo(algorithmName, algorithmDescription));
+}
diff --git a/Fit/Kernel/MinimizerInfo.h b/Fit/Kernel/MinimizerInfo.h
new file mode 100644
index 0000000..be18636
--- /dev/null
+++ b/Fit/Kernel/MinimizerInfo.h
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerInfo.h
+//! @brief     Declares class MinimizerInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERINFO_H
+#define MINIMIZERINFO_H
+
+#include "WinDllMacros.h"
+#include <string>
+#include <vector>
+
+//! @class InfoItem
+//! @ingroup fitting_internal
+//! @brief Simple item to hold the name and the description.
+
+class BA_CORE_API_ InfoItem {
+public:
+    InfoItem(){}
+    InfoItem(const std::string& itemName, const std::string& itemDescription)
+        : m_itemName(itemName)
+        , m_itemDescription(itemDescription){}
+
+    std::string name() const { return m_itemName; }
+    std::string description() const { return m_itemDescription; }
+private:
+    std::string m_itemName;
+    std::string m_itemDescription;
+};
+
+
+//! @class MinimizerInfo
+//! @ingroup fitting_internal
+//! @brief The MinimizerInfo class provides info about the minimizer, including list of defined
+//! minimization algorithms.
+
+class BA_CORE_API_ MinimizerInfo : public InfoItem {
+public:
+    using AlgorithmInfo = InfoItem;
+
+    MinimizerInfo(){}
+    MinimizerInfo(const std::string& minimizerType, const std::string& minimizerDescription);
+
+    //! Sets currently active algorithm
+    void setAlgorithmName(const std::string &algorithmName);
+    std::string algorithmName() const;
+
+    std::vector<std::string> algorithmNames() const;
+    std::vector<std::string> algorithmDescriptions() const;
+
+    static MinimizerInfo buildMinuit2Info(const std::string &defaultAlgo = std::string());
+    static MinimizerInfo buildGSLMultiMinInfo(const std::string &defaultAlgo = std::string());
+    static MinimizerInfo buildGSLLMAInfo();
+    static MinimizerInfo buildGSLSimAnInfo();
+    static MinimizerInfo buildGeneticInfo();
+    static MinimizerInfo buildTestMinimizerInfo();
+
+private:
+    void addAlgorithm(const AlgorithmInfo& algorithm);
+    void addAlgorithm(const std::string& algorithmName, const std::string& algorithmDescription);
+
+    std::vector<AlgorithmInfo> m_algorithms;
+    std::string m_current_algorithm;
+};
+
+#endif // MINIMIZERINFO_H
diff --git a/Fit/Kernel/MinimizerOptions.cpp b/Fit/Kernel/MinimizerOptions.cpp
new file mode 100644
index 0000000..20c66ac
--- /dev/null
+++ b/Fit/Kernel/MinimizerOptions.cpp
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerOptions.cpp
+//! @brief     Implements class MinimizerOptions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerOptions.h"
+#include "StringUtils.h"
+#include <sstream>
+#include <iostream>
+#include <stdexcept>
+
+namespace {
+const std::string delimeter(";");
+}
+
+std::string MinimizerOptions::toOptionString() const
+{
+    std::ostringstream result;
+    for(auto option: m_options) {
+        result << option->name() << std::string("=") << option->value() << delimeter;
+    }
+    return result.str();
+}
+
+void MinimizerOptions::setOptionString(const std::string &options)
+{
+    // splits multiple option string "Strategy=1;Tolerance=0.01;"
+    std::vector<std::string> tokens = Utils::String::split(options, delimeter);
+    try {
+        for(std::string opt : tokens)
+            if(opt.size())
+                    processCommand(opt);
+    } catch(std::exception &ex) {
+        std::ostringstream ostr;
+        ostr << "MinimizerOptions::setOptions() -> Error. Can't parse option string '"
+             << options << "'.\n, error message '"
+             << ex.what() << "'";
+        throw std::runtime_error(ostr.str());
+    }
+}
+
+//! Process single option string 'Tolerance=0.01' and sets the value
+//! to corresponding MultiOption
+
+void MinimizerOptions::processCommand(const std::string &command)
+{
+    std::vector<std::string> tokens = Utils::String::split(command, "=");
+    if(tokens.size() != 2)
+        throw std::runtime_error("MinimizerOptions::processOption() -> Can't parse option '"+
+                                 command+"'");
+
+    std::string name = tokens[0];
+    std::string value = tokens[1];
+
+    OptionContainer::option_t opt = option(name);
+    opt->setFromString(value);
+}
+
diff --git a/Fit/Kernel/MinimizerOptions.h b/Fit/Kernel/MinimizerOptions.h
new file mode 100644
index 0000000..74464ab
--- /dev/null
+++ b/Fit/Kernel/MinimizerOptions.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerOptions.h
+//! @brief     Declares class MinimizerOptions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZEROPTIONS_H
+#define MINIMIZEROPTIONS_H
+
+#include "OptionContainer.h"
+
+//! @class MinimizerOptions
+//! @ingroup fitting_internal
+//! @brief The MinimizerOptions class holds collection of internal minimizer settings.
+
+class BA_CORE_API_ MinimizerOptions : public OptionContainer {
+public:
+
+    //! Returns string with all options (i.e. "Strategy=1;Tolerance=0.01;")
+    std::string toOptionString() const;
+
+    //! Set options from their string representation
+    void setOptionString(const std::string &options);
+
+private:
+    void processCommand(const std::string &command);
+};
+
+#endif // MINIMIZEROPTIONS_H
diff --git a/Fit/Kernel/MinimizerResultsHelper.cpp b/Fit/Kernel/MinimizerResultsHelper.cpp
new file mode 100644
index 0000000..2a2f125
--- /dev/null
+++ b/Fit/Kernel/MinimizerResultsHelper.cpp
@@ -0,0 +1,123 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerResultsHelper.cpp
+//! @brief     Implements class MinimizerResultsHelper.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerResultsHelper.h"
+#include "RootMinimizerAdapter.h"
+#include "FitParameterSet.h"
+#include "FitParameter.h"
+#include "MinimizerUtils.h"
+#include <boost/format.hpp>
+
+namespace {
+
+const int column_width = 18;
+
+template<typename T>
+std::string reportValue(const std::string &name, T value)
+{
+    std::ostringstream result;
+    result << std::setw(column_width) << std::left << name  << ": " << value << std::endl;
+    return result.str();
+}
+
+}
+
+
+std::string MinimizerResultsHelper::reportResults(const RootMinimizerAdapter *minimizer) const
+{
+    std::ostringstream result;
+
+    result << MinimizerUtils::sectionString();
+    result << reportDescription(minimizer);
+    result << reportOption(minimizer);
+    result << reportStatus(minimizer);
+
+    return result.str();
+}
+
+std::string MinimizerResultsHelper::reportResults(const FitParameterSet *parameters) const
+{
+    std::ostringstream result;
+
+    result << MinimizerUtils::sectionString("FitParameters");
+
+    result << "Npar Name        StartValue  Limits           FitValue  Error" << std::endl;
+
+    int npar(0);
+    for(const FitParameter *par : *parameters) {
+        result << boost::format("#%-2d  %-10s  %-6.4f      %-15s  %-6.4f    %5.4f \n")
+                  % npar
+                  % par->name()
+                  % par->startValue()
+                  % par->limits().toString()
+                  % par->value()
+                  % par->error();
+        ++npar;
+    }
+
+    FitParameterSet::corr_matrix_t matrix = parameters->correlationMatrix();
+    if(matrix.size()) {
+        result << MinimizerUtils::sectionString("Correlations");
+        for(size_t i=0; i<matrix.size(); ++i) {
+            result << boost::format("#%-2d       ") %i;
+            for(size_t j=0; j<matrix[i].size(); ++j) {
+                result << boost::format("%_7.4f    ") % matrix[i][j];
+            }
+            result << std::endl;
+        }
+
+    }
+
+    return result.str();
+}
+
+std::string MinimizerResultsHelper::reportDescription(const RootMinimizerAdapter *minimizer) const
+{
+    std::ostringstream result;
+    result << reportValue("MinimizerType", minimizer->minimizerName());
+    result << reportValue("AlgorithmName", minimizer->algorithmName());
+    return result.str();
+}
+
+std::string MinimizerResultsHelper::reportOption(const RootMinimizerAdapter *minimizer) const
+{
+    if(minimizer->options().size() == 0)
+        return std::string();
+
+    std::ostringstream result;
+    result << MinimizerUtils::sectionString("Options");
+    for(auto option : minimizer->options()) {
+        std::ostringstream opt;
+        opt << std::setw(5) << std::left << option->value() << option->description();
+        result << reportValue(option->name(), opt.str());
+    }
+    result << MinimizerUtils::sectionString("OptionString");
+    result << minimizer->options().toOptionString() << std::endl;
+
+    return result.str();
+}
+
+std::string MinimizerResultsHelper::reportStatus(const RootMinimizerAdapter *minimizer) const
+{
+    std::ostringstream result;
+    result << MinimizerUtils::sectionString("Status");
+
+    auto status = minimizer->statusMap();
+    for(auto it : status) {
+        result << reportValue(it.first, it.second);
+    }
+
+    return result.str();
+}
diff --git a/Fit/Kernel/MinimizerResultsHelper.h b/Fit/Kernel/MinimizerResultsHelper.h
new file mode 100644
index 0000000..8535e93
--- /dev/null
+++ b/Fit/Kernel/MinimizerResultsHelper.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerResultsHelper.h
+//! @brief     Declares class MinimizerResultsHelper.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERRESULTSHELPER_H
+#define MINIMIZERRESULTSHELPER_H
+
+#include "WinDllMacros.h"
+#include <string>
+#include <sstream>
+#include <iomanip>
+
+class RootMinimizerAdapter;
+class FitParameterSet;
+
+//! @class MinimizerResultsHelper
+//! @ingroup fitting_internal
+//! @brief The MinimizerResultsHelper class contains all logic to generate reports with the
+//! result of minimization.
+
+class BA_CORE_API_ MinimizerResultsHelper {
+public:
+    MinimizerResultsHelper(){}
+
+    //! Reports results of minimization in the form of multi-line string
+    std::string reportResults(const RootMinimizerAdapter *minimizer) const;
+
+    //! Reports fit parameters settings and final results
+    std::string reportResults(const FitParameterSet *parameters) const;
+
+private:
+    std::string reportDescription(const RootMinimizerAdapter *minimizer) const;
+    std::string reportOption(const RootMinimizerAdapter *minimizer) const;
+    std::string reportStatus(const RootMinimizerAdapter *minimizer) const;
+};
+
+template <typename T>
+std::string to_string_with_precision(const T a_value, int precision = 10, int width = 0)
+{
+    std::ostringstream out;
+    if(width != 0)
+        out << std::setw(14) << std::left;
+
+    out << std::setprecision(precision) << a_value;
+    return out.str();
+}
+
+template <typename T>
+std::string to_string_scientific(const T a_value, int n = 10)
+{
+    std::ostringstream out;
+    out << std::scientific << std::setprecision(n) << a_value;
+    return out.str();
+}
+
+#endif // MINIMIZERRESULTSHELPER_H
+
diff --git a/Fit/Kernel/MinimizerUtils.cpp b/Fit/Kernel/MinimizerUtils.cpp
new file mode 100644
index 0000000..70c68f6
--- /dev/null
+++ b/Fit/Kernel/MinimizerUtils.cpp
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerUtils.cpp
+//! @brief     Declares namespace MinimizerUtils.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerUtils.h"
+#include <sstream>
+#include <algorithm>
+#include <cmath>
+#include <limits>
+
+std::string MinimizerUtils::toString(const std::vector<std::string> &v, const std::string &delim)
+{
+    std::stringstream s;
+    std::for_each(v.begin(), v.end(), [&s, &delim](const std::string &elem) {s << elem << delim; });
+    return s.str();
+}
+
+//! Returns translation of GSL error code to string.
+
+std::map<int, std::string> MinimizerUtils::gslErrorDescriptionMap()
+{
+    std::map<int, std::string> result;
+
+    result[0] = std::string("OK, valid minimum");
+    result[-2] = std::string("iteration has not converged");
+    result[1] = std::string("input domain error, e.g sqrt(-1)");
+    result[2] = std::string("output range error, e.g. exp(1e100)");
+    result[3] = std::string("invalid pointer");
+    result[4] = std::string("invalid argument supplied by user");
+    result[5] = std::string("generic failure");
+    result[6] = std::string("factorization failed");
+    result[7] = std::string("sanity check failed - shouldn't happen");
+    result[8] = std::string("malloc failed");
+    result[9] = std::string("problem with user-supplied function");
+    result[10] = std::string("iterative process is out of control");
+    result[11] = std::string("exceeded max number of iterations");
+    result[12] = std::string("tried to divide by zero");
+    result[13] = std::string("user specified an invalid tolerance");
+    result[14] = std::string("failed to reach the specified tolerance");
+    result[15] = std::string("underflow");
+    result[16] = std::string("overflow ");
+    result[17] = std::string("loss of accuracy");
+    result[18] = std::string("failed because of roundoff error");
+    result[19] = std::string("matrix, vector lengths are not conformant");
+    result[20] = std::string("matrix not square");
+    result[21] = std::string("apparent singularity detected");
+    result[22] = std::string("integral or series is divergent");
+    result[23] = std::string("requested feature is not supported by the hardware");
+    result[24] = std::string("requested feature not (yet) implemented");
+    result[25] = std::string("cache limit exceeded");
+    result[26] = std::string("table limit exceeded");
+    result[27] = std::string("iteration is not making progress towards solution");
+    result[28] = std::string("jacobian evaluations are not improving the solution");
+    result[29] = std::string("cannot reach the specified tolerance in F");
+    result[30] = std::string("cannot reach the specified tolerance in X");
+    result[31] = std::string("cannot reach the specified tolerance in gradient");
+
+    return result;
+}
+
+std::string MinimizerUtils::gslErrorDescription(int errorCode)
+{
+    static std::map<int, std::string> errorDescription = gslErrorDescriptionMap();
+
+    auto it = errorDescription.find(errorCode);
+    if(it!=errorDescription.end())
+        return it->second;
+
+    return std::string("Unknown error");
+}
+
+bool MinimizerUtils::numbersDiffer(double a, double b, double tol)
+{
+    constexpr double eps = std::numeric_limits<double>::epsilon();
+    if (tol<1)
+        throw std::runtime_error("MinimizerUtils::numbersDiffer() -> Error.Not intended for tol<1");
+    return std::abs(a-b) > eps * std::max( tol*eps, std::abs(b) );
+}
+
+//! Returns horizontal line of 80 characters length with section name in it.
+
+std::string MinimizerUtils::sectionString(const std::string &sectionName, int report_width)
+{
+    std::ostringstream result;
+    if(sectionName.empty()) {
+        result << std::string(report_width, '-') << std::endl;
+    } else {
+        // to make "--- SectionName ------------------------------"
+        std::string prefix(3, '-');
+        std::string body = std::string(" ") + sectionName + std::string(" ");
+        std::string postfix(report_width - body.size() - prefix.size(), '-');
+        result << prefix << body << postfix << std::endl;
+    }
+    return result.str();
+}
diff --git a/Fit/Kernel/MinimizerUtils.h b/Fit/Kernel/MinimizerUtils.h
new file mode 100644
index 0000000..ed36a31
--- /dev/null
+++ b/Fit/Kernel/MinimizerUtils.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MinimizerUtils.h
+//! @brief     Declares namespace MinimizerUtils.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef  MINIMIZERUTILS_H
+#define  MINIMIZERUTILS_H
+
+#include "WinDllMacros.h"
+#include <string>
+#include <vector>
+#include <map>
+
+
+namespace MinimizerUtils {
+
+BA_CORE_API_ std::string toString(const std::vector<std::string> &v, const std::string &delim = "");
+
+BA_CORE_API_ std::map<int, std::string> gslErrorDescriptionMap();
+
+BA_CORE_API_ std::string gslErrorDescription(int errorCode);
+
+BA_CORE_API_ bool numbersDiffer(double a, double b, double tol);
+
+BA_CORE_API_ std::string sectionString(const std::string &sectionName = std::string(),
+                                       int report_width=80);
+
+}
+
+#endif
diff --git a/Fit/Kernel/MultiOption.cpp b/Fit/Kernel/MultiOption.cpp
new file mode 100644
index 0000000..74c23fd
--- /dev/null
+++ b/Fit/Kernel/MultiOption.cpp
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MultiOption.cpp
+//! @brief     Implements class MultiOption
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MultiOption.h"
+#include <boost/lexical_cast.hpp>
+
+MultiOption::MultiOption(const std::string &name)
+    : m_name(name)
+{
+
+}
+
+std::string MultiOption::name() const
+{
+    return m_name;
+}
+
+std::string MultiOption::description() const
+{
+    return m_description;
+}
+
+void MultiOption::setDescription(const std::string &description)
+{
+    m_description = description;
+}
+
+MultiOption::variant_t& MultiOption::value()
+{
+    return m_value;
+}
+
+MultiOption::variant_t& MultiOption::defaultValue()
+{
+    return m_default_value;
+}
+
+//! Sets the value of option from string.
+//! TODO find more elegant way (without if/else and boost::lexical_cast
+
+void MultiOption::setFromString(const std::string &value)
+{
+    if(m_value.which() == 0) {
+        m_value = boost::lexical_cast<int>(value);
+    }
+
+    else if(m_value.which() == 1) {
+        m_value = boost::lexical_cast<double>(value);
+
+    } else {
+        m_value = value;
+    }
+}
diff --git a/Fit/Kernel/MultiOption.h b/Fit/Kernel/MultiOption.h
new file mode 100644
index 0000000..ddc19eb
--- /dev/null
+++ b/Fit/Kernel/MultiOption.h
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/MultiOption.h
+//! @brief     Declares class MultiOption
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MULTIOPTION_H
+#define MULTIOPTION_H
+
+#include "WinDllMacros.h"
+#include <boost/variant.hpp>
+#include <string>
+
+//! @class MultiOption
+//! @ingroup fitting_internal
+//! @brief The MultiOption class is intended to store a single option for minimization
+//! algorithm. Int, double, string values are available.
+//! Relies on boost::variant, will be switched to std::variant in C++-17.
+//! (before was https://github.com/mapbox/variant.
+
+class BA_CORE_API_ MultiOption
+{
+public:
+    using variant_t = boost::variant<int, double, std::string>;
+
+    explicit MultiOption(const std::string &name = std::string());
+
+    template<typename T>
+    explicit MultiOption(const std::string &name, const T &t,
+                             const std::string &descripion = std::string());
+
+    std::string name() const;
+
+    std::string description() const;
+    void setDescription(const std::string &description);
+
+    variant_t& value();
+    variant_t& defaultValue();
+
+    //! Returns the option's value
+    template<typename T>
+    T get() const;
+
+    //! Returns the option's default value (i.e. used during construction)
+    template<typename T>
+    T getDefault() const;
+
+    void setFromString(const std::string &value);
+
+private:
+    std::string m_name;
+    std::string m_description;
+    variant_t m_value;
+    variant_t m_default_value;
+};
+
+
+template<typename T>
+MultiOption::MultiOption(const std::string &name, const T &t, const std::string &descripion)
+{
+    m_name = name;
+    m_description = descripion;
+    m_value = t;
+    m_default_value = t;
+}
+
+template<typename T>
+T MultiOption::get() const
+{
+    return boost::get<T>(m_value);
+}
+
+template<typename T>
+T MultiOption::getDefault() const
+{
+    return boost::get<T>(m_default_value);
+}
+
+#endif // MULTIOPTION_H
+
diff --git a/Fit/Kernel/ObjectiveFunction.cpp b/Fit/Kernel/ObjectiveFunction.cpp
new file mode 100644
index 0000000..d51a809
--- /dev/null
+++ b/Fit/Kernel/ObjectiveFunction.cpp
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/ObjectiveFunction.cpp
+//! @brief     Declares class ObjectiveFunction
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ObjectiveFunction.h"
+#include <stdexcept>
+
+ObjectiveFunction::ObjectiveFunction()
+    : m_ncalls(0)
+    , m_ndatasize(0)
+{
+
+}
+
+void ObjectiveFunction::setObjectiveFunction(objective_function_t func)
+{
+    m_objective_function = func;
+}
+
+void ObjectiveFunction::setGradientFunction(gradient_function_t func, int ndatasize)
+{
+    m_gradient_function = func;
+    m_ndatasize = ndatasize;
+}
+
+//! Evaluates the value of the function for given vector of function parameters using
+//! callback mechanism.
+
+double ObjectiveFunction::evaluate(const std::vector<double> &pars)
+{
+    if(!m_objective_function)
+        throw std::runtime_error("ObjectiveFunction::evaluate() -> Error. "
+                                 "Objective function is not set");
+
+    double result = m_objective_function(pars);
+    ++m_ncalls;
+    return result;
+}
+
+//! Evaluates residual and gradients of the function for given vector of function parameters
+//! and index of dataelement using callback mechanism.
+
+double ObjectiveFunction::evaluate_gradient(const std::vector<double>& pars, int index,
+                                            std::vector<double> &gradient)
+{
+    if(!m_gradient_function)
+        throw std::runtime_error("ObjectiveFunction::evaluate() -> Error. "
+                                 "Gradient function is not set");
+
+    double result = m_gradient_function(pars, index, gradient);
+
+    if(index == 0)
+        ++m_ncalls;
+
+    return result;
+}
diff --git a/Fit/Kernel/ObjectiveFunction.h b/Fit/Kernel/ObjectiveFunction.h
new file mode 100644
index 0000000..20dd0ce
--- /dev/null
+++ b/Fit/Kernel/ObjectiveFunction.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/ObjectiveFunction.h
+//! @brief     Declares class ObjectiveFunction
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OBJECTIVEFUNCTION_H
+#define OBJECTIVEFUNCTION_H
+
+#include "WinDllMacros.h"
+#include "KernelTypes.h"
+
+//! @class ObjectiveFunction
+//! @ingroup fitting_internal
+//! @brief The ObjectiveFunction class represents function to minimize.
+
+class BA_CORE_API_ ObjectiveFunction
+{
+public:
+    ObjectiveFunction();
+
+    void setObjectiveFunction(objective_function_t func);
+    void setGradientFunction(gradient_function_t func, int ndatasize);
+
+    double evaluate(const std::vector<double>& pars);
+
+    double evaluate_gradient(const std::vector<double>& pars, int index,
+                             std::vector<double> &gradient);
+
+    int functionCalls() const { return m_ncalls; }
+
+    int sizeOfData() const { return m_ndatasize; }
+
+private:
+    objective_function_t m_objective_function;
+    gradient_function_t m_gradient_function;
+    int m_ncalls;
+    int m_ndatasize;
+};
+
+#endif // OBJECTIVEFUNCTION_H
+
diff --git a/Fit/Kernel/OptionContainer.cpp b/Fit/Kernel/OptionContainer.cpp
new file mode 100644
index 0000000..647d6c6
--- /dev/null
+++ b/Fit/Kernel/OptionContainer.cpp
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/OptionContainer.cpp
+//! @brief     Implements class OptionContainer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OptionContainer.h"
+#include <sstream>
+
+//! Returns true if option with such name already exists.
+OptionContainer::OptionContainer(const OptionContainer &other)
+{
+    for(auto option: other.m_options)
+        m_options.push_back(option_t(new MultiOption(*option)));
+}
+
+OptionContainer &OptionContainer::operator=(const OptionContainer &other)
+{
+    if (this != &other) {
+        OptionContainer tmp(other);
+        tmp.swapContent(*this);
+    }
+    return *this;
+}
+
+OptionContainer::option_t OptionContainer::option(const std::string &optionName)
+{
+    for(auto option: m_options) {
+        if(option->name() == optionName)
+            return option;
+    }
+
+    throw std::runtime_error("Configurable::getOption() -> Error. No option with name '"
+                             + optionName + "'.");
+}
+
+const OptionContainer::option_t OptionContainer::option(const std::string &optionName) const
+{
+    for(const option_t option: m_options) {
+        if(option->name() == optionName)
+            return option;
+    }
+
+    throw std::runtime_error("Configurable::getOption() -> Error. No option with name '"
+                             + optionName + "'.");
+
+}
+
+bool OptionContainer::exists(const std::string &name)
+{
+    for(auto option: m_options) {
+        if(option->name() == name)
+            return true;
+    }
+    return false;
+}
+
+void OptionContainer::swapContent(OptionContainer &other)
+{
+    std::swap(m_options, other.m_options);
+}
diff --git a/Fit/Kernel/OptionContainer.h b/Fit/Kernel/OptionContainer.h
new file mode 100644
index 0000000..b0286fb
--- /dev/null
+++ b/Fit/Kernel/OptionContainer.h
@@ -0,0 +1,98 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/OptionContainer.h
+//! @brief     Declares class OptionContainer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OPTIONCONTAINER_H
+#define OPTIONCONTAINER_H
+
+#include "WinDllMacros.h"
+#include "MultiOption.h"
+#include <map>
+#include <vector>
+#include <memory>
+#include <stdexcept>
+
+//! @class OptionContainer
+//! @ingroup fitting_internal
+//! @brief The OptionContainer class stores multi option (int,double,string) in a container.
+
+class BA_CORE_API_ OptionContainer
+{
+public:
+    using option_t = std::shared_ptr<MultiOption>;
+    using container_t = std::vector<option_t>;
+    using iterator = container_t::iterator;
+    using const_iterator = container_t::const_iterator;
+
+    OptionContainer(){}
+    OptionContainer(const OptionContainer &other);
+    OptionContainer& operator=(const OptionContainer& other);
+
+    template<class T>
+    option_t addOption(const std::string &optionName, T value,
+                       const std::string &description = std::string());
+
+    option_t option(const std::string &optionName);
+    const option_t option(const std::string &optionName) const;
+
+    template<class T>
+    T optionValue(const std::string &optionName) const;
+
+    //! Sets the value of option. Option should hold same value type already.
+    template<class T>
+    void setOptionValue(const std::string& optionName, T value);
+
+    iterator begin() { return m_options.begin(); }
+    const_iterator begin() const { return m_options.begin(); }
+
+    iterator end() { return m_options.end(); }
+    const_iterator end() const { return m_options.end(); }
+
+    size_t size() const { return m_options.size(); }
+
+protected:
+    bool exists(const std::string &name);
+    void swapContent(OptionContainer& other);
+    container_t m_options;
+};
+
+template<class T>
+OptionContainer::option_t OptionContainer::addOption(const std::string &optionName, T value,
+                                 const std::string &description)
+{
+    if(exists(optionName))
+        throw std::runtime_error("OptionContainer::addOption() -> Error. Option '" + optionName +
+                                 "' exists.");
+
+    option_t result(new MultiOption(optionName, value, description));
+    m_options.push_back(result);
+    return result;
+}
+
+template<class T>
+T OptionContainer::optionValue(const std::string &optionName) const
+{
+    return option(optionName)->get<T>();
+}
+
+template<class T>
+void OptionContainer::setOptionValue(const std::string& optionName, T value)
+{
+    option(optionName)->value() = value;
+    if(option(optionName)->value().which() != option(optionName)->defaultValue().which())
+        throw std::runtime_error("OptionContainer::setOptionValue() -> Error. Attempt to set different"
+                                 "type to option '"+optionName+"'");
+}
+
+#endif // OPTIONCONTAINER_H
diff --git a/Fit/Kernel/TestMinimizer.cpp b/Fit/Kernel/TestMinimizer.cpp
new file mode 100644
index 0000000..b6c3c6e
--- /dev/null
+++ b/Fit/Kernel/TestMinimizer.cpp
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/TestMinimizer.cpp
+//! @brief     Implements class TrivialMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "TestMinimizer.h"
+#include "MinimizerConstants.h"
+#include "FitParameterSet.h"
+#include <sstream>
+
+std::string TestMinimizer::minimizerName() const
+{
+    return std::string(MinimizerNames::Test);
+}
+
+//! run minimization
+void TestMinimizer::minimize()
+{
+    m_min_value = m_fcn(m_parameter_values);
+}
+
+void TestMinimizer::setParameters(const FitParameterSet& parameters)
+{
+    m_parameter_values = parameters.values();
+}
+
+void TestMinimizer::setObjectiveFunction(objective_function_t func)
+{
+    m_fcn = func;
+}
+
+std::string TestMinimizer::reportResults() const
+{
+    std::ostringstream result;
+    result << "TestMinimizer::printResult() -> Done. Objective function value = "
+           << m_min_value << std::endl;
+    return result.str();
+}
diff --git a/Fit/Kernel/TestMinimizer.h b/Fit/Kernel/TestMinimizer.h
new file mode 100644
index 0000000..dc8ac9f
--- /dev/null
+++ b/Fit/Kernel/TestMinimizer.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Kernel/TestMinimizer.h
+//! @brief     Defines class TestMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TESTMINIMIZER_H
+#define TESTMINIMIZER_H
+
+#include "IMinimizer.h"
+class FitParameterSet;
+
+//! @class TestMinimizer
+//! @ingroup fitting_internal
+//! @brief Minimizer which calls minimization function once to test whole chain.
+
+class BA_CORE_API_ TestMinimizer : public IMinimizer
+{
+ public:
+    TestMinimizer() : m_min_value(0) {}
+    ~TestMinimizer(){}
+
+    virtual std::string minimizerName() const override;
+
+    void minimize() override;
+
+    void setParameters(const FitParameterSet &parameters) override;
+
+    void setObjectiveFunction(objective_function_t func) override;
+
+    std::string reportResults() const override;
+
+ private:
+    double m_min_value;
+    std::vector<double> m_parameter_values;
+    objective_function_t m_fcn;
+};
+
+#endif // TESTMINIMIZER_H
diff --git a/Fit/Parameters/AttLimits.cpp b/Fit/Parameters/AttLimits.cpp
new file mode 100644
index 0000000..cae0d1c
--- /dev/null
+++ b/Fit/Parameters/AttLimits.cpp
@@ -0,0 +1,132 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/AttLimits.cpp
+//! @brief     Implements and implements class AttLimits.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "AttLimits.h"
+#include <sstream>
+#include <iomanip>
+
+AttLimits::AttLimits()
+    : m_limits(RealLimits::limitless())
+    , m_att_fixed(Attributes::free())
+{
+
+}
+
+AttLimits AttLimits::limitless()
+{
+    return AttLimits();
+}
+
+AttLimits AttLimits::lowerLimited(double bound_value)
+{
+    return AttLimits(RealLimits::lowerLimited(bound_value), Attributes::free());
+}
+
+AttLimits AttLimits::positive()
+{
+    return AttLimits(RealLimits::positive(), Attributes::free());
+}
+
+AttLimits AttLimits::nonnegative()
+{
+    return AttLimits(RealLimits::nonnegative(), Attributes::free());
+}
+
+AttLimits AttLimits::upperLimited(double bound_value)
+{
+    return AttLimits(RealLimits::upperLimited(bound_value), Attributes::free());
+}
+
+AttLimits AttLimits::limited(double left_bound_value, double right_bound_value)
+{
+    return AttLimits(RealLimits::limited(left_bound_value, right_bound_value), Attributes::free());
+}
+
+AttLimits AttLimits::fixed()
+{
+    return AttLimits(RealLimits::limitless(), Attributes::fixed());
+}
+
+bool AttLimits::isFixed() const
+{
+    return m_att_fixed.isFixed();
+}
+
+bool AttLimits::isLimited() const
+{
+    return m_att_fixed.isFree() && m_limits.hasLowerAndUpperLimits();
+}
+
+bool AttLimits::isUpperLimited() const
+{
+    return m_att_fixed.isFree() && !m_limits.hasLowerLimit() && m_limits.hasUpperLimit();
+}
+
+bool AttLimits::isLowerLimited() const
+{
+    return m_att_fixed.isFree() && m_limits.hasLowerLimit() && !m_limits.hasUpperLimit();
+}
+
+bool AttLimits::isLimitless() const
+{
+    return m_att_fixed.isFree() && !m_limits.hasLowerLimit() && !m_limits.hasUpperLimit();
+}
+
+double AttLimits::lowerLimit() const
+{
+    return m_limits.getLowerLimit();
+}
+
+double AttLimits::upperLimit() const
+{
+    return m_limits.getUpperLimit();
+}
+
+void AttLimits::setFixed(bool isFixed)
+{
+    m_limits.removeLimits();
+    m_att_fixed.setFixed(isFixed);
+}
+
+bool AttLimits::operator==(const AttLimits &other) const
+{
+    return m_limits == other.m_limits && m_att_fixed == other.m_att_fixed;
+}
+
+std::string AttLimits::toString() const
+{
+    std::ostringstream result;
+
+    if(isFixed()) {
+        result << "fixed";
+    }else if(isLimitless()) {
+        result << "free";
+    } else if(isLowerLimited()) {
+        result << "lim("  << std::fixed <<std::setprecision(2) << lowerLimit() << ",)";
+    }else if(isUpperLimited()) {
+        result << "lim(," << std::fixed <<std::setprecision(2) << upperLimit() << ",)";
+    }else if(isLimited()) {
+        result << "lim(" << std::fixed <<std::setprecision(2) << lowerLimit() << "," <<
+            std::fixed <<std::setprecision(2) << upperLimit() << ")";
+    }
+    return result.str();
+}
+
+AttLimits::AttLimits(const RealLimits &limits, const Attributes &fixedAttr)
+    : m_limits(limits)
+    , m_att_fixed(fixedAttr)
+{
+
+}
diff --git a/Fit/Parameters/AttLimits.h b/Fit/Parameters/AttLimits.h
new file mode 100644
index 0000000..3ba83e4
--- /dev/null
+++ b/Fit/Parameters/AttLimits.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/AttLimits.h
+//! @brief     Defines and implements class AttLimits.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ATTLIMITS_H
+#define ATTLIMITS_H
+
+#include "WinDllMacros.h"
+#include "RealLimits.h"
+#include "Attributes.h"
+#include <string>
+
+//! @class AttLimits
+//! @ingroup fitting
+//! @brief The AttLimits class defines limited/free attribute of fit parameter and provides
+//! coupling between them.
+
+class BA_CORE_API_ AttLimits
+{
+public:
+    AttLimits();
+
+    static AttLimits limitless();
+    static AttLimits lowerLimited(double bound_value);
+    static AttLimits positive();
+    static AttLimits nonnegative();
+    static AttLimits upperLimited(double bound_value);
+    static AttLimits limited(double left_bound_value, double right_bound_value);
+    static AttLimits fixed();
+
+    bool isFixed() const;
+    bool isLimited() const;
+    bool isUpperLimited() const;
+    bool isLowerLimited() const;
+    bool isLimitless() const;
+
+    double lowerLimit() const;
+    double upperLimit() const;
+
+    void setFixed(bool isFixed);
+
+    bool operator==(const AttLimits &other) const;
+    bool operator!=(const AttLimits &other) const { return !(*this == other); }
+
+    std::string toString() const;
+
+    friend std::ostream& operator<<(std::ostream& ostr, const AttLimits& m)
+    { ostr << m.toString(); return ostr; }
+
+private:
+    AttLimits(const RealLimits &limits, const Attributes &fixedAttr);
+
+    RealLimits m_limits;
+    Attributes m_att_fixed;
+};
+
+#endif // ATTLIMITS_H
diff --git a/Fit/Parameters/Attributes.h b/Fit/Parameters/Attributes.h
new file mode 100644
index 0000000..63ed29b
--- /dev/null
+++ b/Fit/Parameters/Attributes.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/Attributes.h
+//! @brief     Defines and implements class Attributes.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ATTRIBUTES_H
+#define ATTRIBUTES_H
+
+#include "WinDllMacros.h"
+#include <ostream>
+
+//! Attributes for a fit parameter. Currently, the only attribute is fixed/free.
+//! @ingroup fitting
+
+class BA_CORE_API_ Attributes
+{
+ public:
+    Attributes() : m_is_fixed(false) {}
+    //! Creates a fixed value object
+    static Attributes fixed() { return Attributes(true); }
+    static Attributes free() { return Attributes(false); }
+
+    void setFixed(bool is_fixed) { m_is_fixed = is_fixed; }
+    bool isFixed() const { return m_is_fixed; }
+    bool isFree() const { return !isFixed(); }
+
+    friend std::ostream& operator<<(std::ostream& ostr, const Attributes& m) {
+        m.print(ostr); return ostr; }
+
+    bool operator==(const Attributes &other) const { return isFixed()==other.isFixed(); }
+    bool operator!=(const Attributes &other) const { return !(*this == other); }
+
+ protected:
+    Attributes(bool is_fixed) : m_is_fixed(is_fixed) {}
+
+    bool m_is_fixed; //! parameter is fixed
+
+    void print(std::ostream& ostr) const;
+};
+
+//! Prints class
+inline void Attributes::print(std::ostream& ostr) const
+{
+    if(isFixed())
+        ostr << "fixed";
+    else
+        ostr << "free";
+}
+
+#endif // ATTRIBUTES_H
diff --git a/Fit/Parameters/FitParameter.cpp b/Fit/Parameters/FitParameter.cpp
new file mode 100644
index 0000000..4956133
--- /dev/null
+++ b/Fit/Parameters/FitParameter.cpp
@@ -0,0 +1,132 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/FitParameter.cpp
+//! @brief     Implements class FitParameter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameter.h"
+#include <iomanip>
+#include <sstream>
+
+FitParameter::FitParameter()
+    : m_start_value(0.0)
+    , m_value(0.0)
+    , m_step(0.0)
+    , m_error(0.0)
+{
+
+}
+
+FitParameter::FitParameter(const std::string &name, double value, const AttLimits &limits,
+                                 double step)
+    : m_name(name)
+    , m_start_value(value)
+    , m_value(value)
+    , m_step(step)
+    , m_error(0.0)
+    , m_limits(limits)
+{
+
+}
+
+FitParameter *FitParameter::clone() const
+{
+    return new FitParameter(*this);
+}
+
+std::string FitParameter::name() const { return m_name; }
+
+double FitParameter::startValue() const { return m_start_value; }
+
+double FitParameter::value() const { return m_value; }
+
+void FitParameter::setValue(double value) { m_value = value; }
+
+double FitParameter::step() const { return m_step; }
+
+FitParameter &FitParameter::setStep(double value)
+{
+    m_step = value;
+    return *this;
+}
+
+double FitParameter::error() const { return m_error; }
+
+void FitParameter::setError(double value) { m_error = value; }
+
+const AttLimits &FitParameter::limits() const { return m_limits;}
+
+AttLimits &FitParameter::limits() { return m_limits;}
+
+FitParameter& FitParameter::setLimits(const AttLimits &limits)
+{
+    m_limits = limits;
+    return *this;
+}
+
+FitParameter &FitParameter::setLowerLimited(double bound_value)
+{
+    m_limits = AttLimits::lowerLimited(bound_value);
+    return *this;
+}
+
+FitParameter &FitParameter::setPositive()
+{
+    m_limits = AttLimits::positive();
+    return *this;
+}
+
+FitParameter &FitParameter::setNonnegative()
+{
+    m_limits = AttLimits::nonnegative();
+    return *this;
+}
+
+FitParameter &FitParameter::setUpperLimited(double bound_value)
+{
+    m_limits = AttLimits::upperLimited(bound_value);
+    return *this;
+}
+
+FitParameter &FitParameter::setLimited(double left_bound_value, double right_bound_value)
+{
+    m_limits = AttLimits::limited(left_bound_value, right_bound_value);
+    return *this;
+}
+
+FitParameter &FitParameter::setFixed()
+{
+    m_limits = AttLimits::fixed();
+    return *this;
+}
+
+std::string FitParameter::toString() const
+{
+    std::ostringstream ostr;
+
+    const int max_length_of_name(40);
+    std::string adjusted_name = m_name;
+    adjusted_name.resize(max_length_of_name,' ');
+    ostr << adjusted_name << std::scientific << std::setprecision(8) << m_value << "  ";
+    ostr << m_limits.toString();
+    return ostr.str();
+}
+
+FitParameter::FitParameter(const FitParameter &other) : IFitParameter()
+{
+    m_name = other.m_name;
+    m_start_value = other.m_start_value;
+    m_value = other.m_value;
+    m_step = other.m_step;
+    m_error = other.m_error;
+    m_limits = other.m_limits;
+}
diff --git a/Fit/Parameters/FitParameter.h b/Fit/Parameters/FitParameter.h
new file mode 100644
index 0000000..802f4a7
--- /dev/null
+++ b/Fit/Parameters/FitParameter.h
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/FitParameter.h
+//! @brief     Defines class FitParameter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPARAMETER_H
+#define FITPARAMETER_H
+
+#include "IFitParameter.h"
+#include "AttLimits.h"
+#include <string>
+
+//! @class FitParameter
+//! @ingroup fitting
+//! @brief The FitParameter represents fittable parameter with value, error, step, and limits.
+
+class BA_CORE_API_ FitParameter : public IFitParameter
+{
+public:
+    FitParameter();
+    FitParameter(const std::string& name, double value,
+                    const AttLimits& limits=AttLimits::limitless(), double step=0.0);
+    virtual ~FitParameter(){}
+
+    FitParameter* clone() const;
+
+    std::string name() const;
+
+    double startValue() const;
+
+    double value() const;
+    virtual void setValue(double value);
+
+    double step() const;
+    FitParameter& setStep(double value);
+
+    double error() const;
+    void setError(double value);
+
+    const AttLimits& limits() const;
+    AttLimits& limits();
+
+    FitParameter& setLimits(const AttLimits& limits);
+
+    FitParameter& setLowerLimited(double bound_value);
+    FitParameter& setPositive();
+    FitParameter& setNonnegative();
+    FitParameter& setUpperLimited(double bound_value);
+    FitParameter& setLimited(double left_bound_value, double right_bound_value);
+    FitParameter& setFixed();
+
+    virtual std::string toString() const;
+
+protected:
+    FitParameter(const FitParameter& other);
+
+private:
+    std::string m_name;
+    double m_start_value;
+    double m_value;
+    double m_step;
+    double m_error;
+    AttLimits m_limits;
+};
+
+#endif // FITPARAMETER_H
diff --git a/Fit/Parameters/FitParameterSet.cpp b/Fit/Parameters/FitParameterSet.cpp
new file mode 100644
index 0000000..b671134
--- /dev/null
+++ b/Fit/Parameters/FitParameterSet.cpp
@@ -0,0 +1,278 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/FitParameterSet.cpp
+//! @brief     Implements class FitParameterSet.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameterSet.h"
+#include "FitParameter.h"
+#include "Logger.h"
+#include "MinimizerResultsHelper.h"
+#include "MinimizerUtils.h"
+#include <algorithm>
+#include <cmath>
+#include <iostream>
+#include <limits>
+#include <stdexcept>
+
+FitParameterSet::~FitParameterSet()
+{
+    clear();
+}
+
+//! Clears all defined parameters.
+
+void FitParameterSet::clear()
+{
+    for (auto par: m_parameters)
+        delete par;
+    m_parameters.clear();
+}
+
+//! Returns number of parameters.
+
+size_t FitParameterSet::size() const
+{
+    return m_parameters.size();
+}
+
+//! Container iterators.
+
+FitParameterSet::iterator FitParameterSet::begin()
+{
+    return m_parameters.begin();
+}
+
+FitParameterSet::const_iterator FitParameterSet::begin() const
+{
+    return m_parameters.begin();
+}
+
+FitParameterSet::iterator FitParameterSet::end()
+{
+    return m_parameters.end();
+}
+
+FitParameterSet::const_iterator FitParameterSet::end() const
+{
+    return m_parameters.end();
+}
+
+//! Adds fit parameter.
+
+void FitParameterSet::addFitParameter(FitParameter *par)
+{
+    if(isExistingName(par->name()))
+        throw std::runtime_error("FitParameterSet::addFitParameter() -> Error. Parameter with "
+                                 "the name '"+par->name()+"' already exist.");
+
+    for (auto fitPar: m_parameters)
+        if(fitPar == par)
+            throw std::runtime_error("FitParameterSet::addFitParameter() -> Error. Attempt to add "
+                                     "same fit parameter twice.");
+    m_parameters.push_back(par);
+}
+
+//! Returns fit parameter by given name.
+
+const FitParameter* FitParameterSet::fitParameter(const std::string& name) const
+{
+    for (auto par: m_parameters)
+        if (par->name() == name)
+            return par;
+    throw std::runtime_error("FitParameterSet::getFitParameter() -> "
+                             "Error. No parameter with name '"+name+"'");
+}
+
+FitParameter* FitParameterSet::fitParameter(const std::string& name)
+{
+    return const_cast<FitParameter *>(static_cast<const FitParameterSet *>(this)->fitParameter(name));
+}
+
+//! Indexed access to parameters.
+
+const FitParameter* FitParameterSet::operator[](const std::string &name) const
+{
+    return fitParameter(name);
+}
+
+FitParameter* FitParameterSet::operator[](const std::string &name)
+{
+    return const_cast<FitParameter *>(static_cast<const FitParameterSet *>(this)->operator[](name));
+}
+
+const FitParameter* FitParameterSet::operator[](size_t index) const
+{
+    return m_parameters[check_index(index)];
+}
+
+FitParameter* FitParameterSet::operator[](size_t index)
+{
+    return const_cast<FitParameter *>(static_cast<const FitParameterSet *>(this)->operator[](index));
+}
+
+//! Returns values of all defined parameters.
+
+std::vector<double> FitParameterSet::values() const
+{
+    std::vector<double> result;
+    for (auto par: m_parameters)
+        result.push_back(par->value());
+    return result;
+}
+
+//! Sets values for all defined parameters.
+
+void FitParameterSet::setValues(const std::vector<double>& pars_values)
+{
+    check_array_size(pars_values);
+
+    int index(0);
+    for (auto par: m_parameters) {
+        if (std::isnan(pars_values[index]))
+            throw std::runtime_error("FitParameterSet::setValues() -> Error."
+                                     " Attempt to set nan '"+par->name() + std::string("'."));
+        if (std::isinf(pars_values[index]))
+            throw std::runtime_error("FitParameterSet::setValues() -> Error. Attempt to set inf '"+
+                                      par->name()  + std::string("'."));
+        par->setValue(pars_values[index]);
+        ++index;
+    }
+}
+
+//! Returns true if parameters already have the given values.
+
+bool FitParameterSet::valuesDifferFrom(const std::vector<double> &pars_values, double tol) const
+{
+    check_array_size(pars_values);
+
+    for (size_t i=0; i<m_parameters.size(); ++i)
+        if (MinimizerUtils::numbersDiffer(m_parameters[i]->value(), pars_values[i], tol))
+            return true;
+    return false;
+}
+
+//! Returns errors of all defined parameters.
+
+std::vector<double> FitParameterSet::errors() const
+{
+    std::vector<double> result;
+    for (auto par: m_parameters)
+        result.push_back(par->error());
+    return result;
+}
+
+//! Sets errors to all parameters.
+
+void FitParameterSet::setErrors(const std::vector<double>& pars_errors)
+{
+    check_array_size(pars_errors);
+
+    for (size_t i=0; i<m_parameters.size(); ++i)
+        m_parameters[i]->setError(pars_errors[i]);
+}
+
+//! Returns number of free parameters.
+
+size_t FitParameterSet::freeFitParameterCount() const
+{
+    size_t result(0);
+    for (auto par: m_parameters)
+        if (!par->limits().isFixed())
+            result++;
+    return result;
+}
+
+//! Fix all parameters.
+
+void FitParameterSet::fixAll()
+{
+    for (auto par: m_parameters)
+        par->limits().setFixed(true);
+}
+
+//! Release all parameters.
+
+void FitParameterSet::releaseAll()
+{
+    for (auto par: m_parameters)
+        par->limits().setFixed(false);
+}
+
+//! Set fixed flag for parameters from the list.
+
+void FitParameterSet::setFixed(const std::vector<std::string>& pars, bool is_fixed)
+{
+    for (auto par: pars)
+        fitParameter(par)->limits().setFixed(is_fixed);
+}
+
+
+std::string FitParameterSet::parametersToString() const
+{
+    std::ostringstream result;
+
+    int npar(0);
+    for (auto par: m_parameters)
+        result << "   # "<< npar++ << " " << par->toString() << "\n";
+
+    return result.str();
+}
+
+std::string FitParameterSet::reportResults() const
+{
+    MinimizerResultsHelper helper;
+    return helper.reportResults(this);
+}
+
+void FitParameterSet::setCorrelationMatrix(const FitParameterSet::corr_matrix_t &matrix)
+{
+    if(matrix.size() != size())
+        throw std::runtime_error("FitParameterSet::setCorrelationMatrix() -> Error. Wrong "
+                                 "dimension of correlation matrix.");
+
+    m_corr_matrix = matrix;
+}
+
+//! Returns true if parameter with such name exists.
+
+bool FitParameterSet::isExistingName(const std::string &name) const
+{
+    for (auto par: m_parameters)
+        if (par->name() == name)
+            return true;
+
+    return false;
+}
+
+//! Checks if index corresponds with the number of fit parameters.
+
+size_t FitParameterSet::check_index(size_t index) const {
+    if (index >= m_parameters.size())
+        throw std::runtime_error(
+            "FitSuiteParameters::check_index() -> Index out of bounds");
+    return index;
+}
+
+//! Checks if size of input array corresponds to number of fit parameters,
+//! throws an exception if not.
+
+void FitParameterSet::check_array_size(const std::vector<double> &values) const
+{
+    if (values.size() != m_parameters.size()) {
+        std::ostringstream ostr;
+        ostr << "FitParameterSet::check_array_size() -> Error. Size of inpout array "
+             << values.size() << ", doesn't mach number of fit parameters "
+             << m_parameters.size() << std::endl;
+        throw std::runtime_error(ostr.str());
+    }
+}
diff --git a/Fit/Parameters/FitParameterSet.h b/Fit/Parameters/FitParameterSet.h
new file mode 100644
index 0000000..473d40f
--- /dev/null
+++ b/Fit/Parameters/FitParameterSet.h
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/FitParameterSet.h
+//! @brief     Defines class FitParameterSet.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPARAMETERSET_H
+#define FITPARAMETERSET_H
+
+#include "WinDllMacros.h"
+#include <vector>
+#include <string>
+
+class FitParameter;
+
+//! @class FitParameterSet
+//! @ingroup fitting_internal
+//! @brief The FitParameterSet represents collection of fit parameters for the minimizer.
+
+class BA_CORE_API_ FitParameterSet
+{
+ public:
+    typedef std::vector<FitParameter*> container_t;
+    typedef container_t::iterator iterator;
+    typedef container_t::const_iterator const_iterator;
+    typedef std::vector<std::vector<double>> corr_matrix_t;
+
+    FitParameterSet() {}
+    ~FitParameterSet();
+
+    /// container specific
+
+    void clear();
+    size_t size() const;
+    iterator begin();
+    const_iterator begin() const;
+    iterator end();
+    const_iterator end() const;
+
+    /// adding fit parameters
+
+    void addFitParameter(FitParameter* par);
+
+    /// accessing fit parameters
+    const FitParameter* fitParameter(const std::string& name) const;
+    FitParameter* fitParameter(const std::string& name);
+    const FitParameter* operator[](const std::string &name) const;
+    FitParameter* operator[](const std::string &name);
+    const FitParameter* operator[](size_t index) const;
+    FitParameter* operator[](size_t index);
+
+    /// fit parameter's values and errors
+
+    std::vector<double> values() const;
+    void setValues(const std::vector<double >& pars_values);
+    bool valuesDifferFrom(const std::vector<double>& par_values, double tolerance = 2.0) const;
+    std::vector<double> errors() const;
+    void setErrors(const std::vector<double >& pars_errors);
+
+    /// Make parameters fixed and free
+
+    size_t freeFitParameterCount() const;
+    void fixAll();
+    void releaseAll();
+    void setFixed(const std::vector<std::string>& pars, bool is_fixed);
+
+    //! Printing and reporting
+
+    std::string parametersToString() const;
+    std::string reportResults() const;
+
+    corr_matrix_t correlationMatrix() const { return m_corr_matrix; }
+    void setCorrelationMatrix(const corr_matrix_t &matrix);
+
+    bool isExistingName(const std::string &name) const;
+
+private:    
+    size_t check_index(size_t index) const;
+    void check_array_size(const std::vector<double> &values) const;
+    container_t m_parameters; //!< collection of fit parameters
+    corr_matrix_t m_corr_matrix; //!< correlation matrix
+};
+
+#endif // FITPARAMETERSET_H
diff --git a/Fit/Parameters/IFitParameter.h b/Fit/Parameters/IFitParameter.h
new file mode 100644
index 0000000..990856f
--- /dev/null
+++ b/Fit/Parameters/IFitParameter.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/IFitParameter.h
+//! @brief     Defines class IFitParameter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IFITPARAMETER_H
+#define IFITPARAMETER_H
+
+#include "WinDllMacros.h"
+
+//! @class IFitParameter
+//! @ingroup fitting_internal
+//! @brief The IFitParameter is a base class for fit parameters.
+
+class BA_CORE_API_ IFitParameter
+{
+public:
+    IFitParameter() {}
+    virtual ~IFitParameter() {}
+    IFitParameter(const IFitParameter&) = delete;
+    IFitParameter& operator=(const IFitParameter&) = delete;
+
+    virtual IFitParameter* clone() const = 0;
+};
+
+#endif // IFITPARAMETER_H
diff --git a/Fit/Parameters/RealLimits.cpp b/Fit/Parameters/RealLimits.cpp
new file mode 100644
index 0000000..bd5acf4
--- /dev/null
+++ b/Fit/Parameters/RealLimits.cpp
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/RealLimits.cpp
+//! @brief     Implements class Limits.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RealLimits.h"
+#include <iomanip>
+#include <iostream>
+#include <limits>
+
+//! Creates an object which can have only positive values (>0., zero is not included)
+RealLimits RealLimits::positive()
+{
+    return lowerLimited(std::numeric_limits<double>::min());
+}
+
+//! Prints class
+void RealLimits::print(std::ostream& ostr) const
+{
+    if      (!hasLowerLimit() && !hasUpperLimit())
+        ostr << "unlimited";
+    else if (hasLowerLimit() && !hasUpperLimit())
+        ostr << "lim("  << std::fixed <<std::setprecision(2) << m_lower_limit << ",)";
+    else if (hasUpperLimit() && !hasLowerLimit())
+        ostr << "lim(," << std::fixed <<std::setprecision(2) << m_upper_limit << ",)";
+    else if (hasLowerAndUpperLimits())
+        ostr << "lim(" << std::fixed <<std::setprecision(2) << m_lower_limit << "," <<
+            std::fixed <<std::setprecision(2) << m_upper_limit << ")";
+}
+
+bool RealLimits::isInRange(double value) const
+{
+    if(hasLowerLimit() && value < m_lower_limit) return false;
+    if(hasUpperLimit() && value >= m_upper_limit) return false;
+    return true;
+}
+
+bool RealLimits::operator==(const RealLimits& other) const
+{
+    return (m_has_lower_limit == other.m_has_lower_limit) &&
+            (m_has_upper_limit == other.m_has_upper_limit) &&
+            (m_lower_limit == other.m_lower_limit) &&
+            (m_upper_limit == other.m_upper_limit);
+}
diff --git a/Fit/Parameters/RealLimits.h b/Fit/Parameters/RealLimits.h
new file mode 100644
index 0000000..86d01de
--- /dev/null
+++ b/Fit/Parameters/RealLimits.h
@@ -0,0 +1,112 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Parameters/RealLimits.h
+//! @brief     Defines class RealLimits.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALLIMITS_H
+#define REALLIMITS_H
+
+#include "WinDllMacros.h"
+#include <ostream>
+
+//! Limits for a real fit parameter.
+//! @ingroup fitting
+
+class BA_CORE_API_ RealLimits
+{
+ public:
+    RealLimits()
+        : m_has_lower_limit(false), m_has_upper_limit(false),
+        m_lower_limit(0.), m_upper_limit(0.) {}
+
+    //! if has lower limit
+    bool hasLowerLimit() const { return m_has_lower_limit; }
+
+    //! Returns lower limit
+    double getLowerLimit() const { return m_lower_limit; }
+
+    //! Sets lower limit
+    void setLowerLimit(double value) { m_lower_limit = value; m_has_lower_limit = true; }
+
+    //! remove lower limit
+    void removeLowerLimit() { m_lower_limit = 0.; m_has_lower_limit = false; }
+
+    //! if has upper limit
+    bool hasUpperLimit() const { return m_has_upper_limit; }
+
+    //! Returns upper limit
+    double getUpperLimit() const { return m_upper_limit; }
+
+    //! Sets upper limit
+    void setUpperLimit(double value) { m_upper_limit = value; m_has_upper_limit = true; }
+
+    //! remove upper limit
+    void removeUpperLimit() { m_upper_limit = 0.; m_has_upper_limit = false; }
+
+    //! if has lower and upper limit
+    bool hasLowerAndUpperLimits() const { return (m_has_lower_limit && m_has_upper_limit); }
+
+    //! Sets lower and upper limits
+    void setLimits(double xmin, double xmax) { setLowerLimit(xmin); setUpperLimit(xmax); }
+
+    //! remove limits
+    void removeLimits() { removeLowerLimit(); removeUpperLimit(); }
+
+    //! returns true if proposed value is in limits range
+    bool isInRange(double value) const;
+
+    // ---------
+    // static creation methods
+
+    //! Creates an object bounded from the left
+    static RealLimits lowerLimited(double bound_value) { return RealLimits(true, false, bound_value, 0.); }
+
+    //! Creates an object which can have only positive values (>0., zero is not included)
+    static RealLimits positive();
+
+    //! Creates an object which can have only positive values with 0. included
+    static RealLimits nonnegative() { return lowerLimited(0.); }
+
+    //! Creates an object bounded from the right
+    static RealLimits upperLimited(double bound_value) { return RealLimits(false, true, 0., bound_value); }
+
+    //! Creates an object bounded from the left and right
+    static RealLimits limited(double left_bound_value, double right_bound_value) {
+        return RealLimits(true, true, left_bound_value, right_bound_value); }
+
+    //! Creates an object withoud bounds (default)
+    static RealLimits limitless() { return RealLimits(); }
+
+    //! Prints class
+    friend std::ostream& operator<<(std::ostream& ostr, const RealLimits& m)
+    { m.print(ostr); return ostr; }
+
+    bool operator==(const RealLimits &other) const;
+    bool operator!=(const RealLimits &other) const { return !(*this == other); }
+
+ protected:
+    RealLimits(bool has_lower_limit, bool has_upper_limit, double lower_limit, double upper_limit)
+        : m_has_lower_limit(has_lower_limit)
+        , m_has_upper_limit(has_upper_limit)
+        , m_lower_limit(lower_limit)
+        , m_upper_limit(upper_limit) {}
+
+    bool   m_has_lower_limit; //! parameter has lower bound
+    bool   m_has_upper_limit; //! parameter has upper bound
+    double m_lower_limit; //! minimum allowed value
+    double m_upper_limit; //! maximum allowed value
+
+    void print(std::ostream& ostr) const;
+};
+
+#endif // REALLIMITS_H
diff --git a/Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.cpp b/Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.cpp
new file mode 100644
index 0000000..d2dd049
--- /dev/null
+++ b/Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.cpp
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.cpp
+//! @brief     Implements class GSLLevenbergMarquardtMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "GSLLevenbergMarquardtMinimizer.h"
+#include "GSLMultiMinimizer.h"
+#include "MinimizerResultsHelper.h"
+#include "MinimizerUtils.h"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#include "Math/PatchedGSLNLSMinimizer.h"
+#pragma GCC diagnostic pop
+
+namespace {
+
+std::map<int, std::string> covmatrixStatusDescription()
+{
+    std::map<int, std::string> result;
+    result[0] = std::string("Covariance matrix was not computed");
+    result[1] = std::string("Covariance matrix approximate because minimum is not valid");
+    result[3] = std::string("Covariance matrix OK");
+    return result;
+}
+
+}
+
+GSLLevenbergMarquardtMinimizer::GSLLevenbergMarquardtMinimizer()
+    : RootMinimizerAdapter(MinimizerInfo::buildGSLLMAInfo())
+    , m_gsl_minimizer(new BA_ROOT::Math::GSLNLSMinimizer(2))
+{
+    addOption(OptionNames::Tolerance, 0.01, "Tolerance on the function value at the minimum");
+    addOption(OptionNames::PrintLevel, 0, "Minimizer internal print level");
+    addOption(OptionNames::MaxIterations, 0, "Maximum number of iterations");
+}
+
+GSLLevenbergMarquardtMinimizer::~GSLLevenbergMarquardtMinimizer()
+{
+
+}
+
+void GSLLevenbergMarquardtMinimizer::setTolerance(double value)
+{
+    setOptionValue(OptionNames::Tolerance, value);
+}
+
+double GSLLevenbergMarquardtMinimizer::tolerance() const
+{
+    return optionValue<double>(OptionNames::Tolerance);
+}
+
+void GSLLevenbergMarquardtMinimizer::setPrintLevel(int value)
+{
+    setOptionValue(OptionNames::PrintLevel, value);
+}
+
+int GSLLevenbergMarquardtMinimizer::printLevel() const
+{
+    return optionValue<int>(OptionNames::PrintLevel);
+}
+
+void GSLLevenbergMarquardtMinimizer::setMaxIterations(int value)
+{
+    setOptionValue(OptionNames::MaxIterations, value);
+}
+
+int GSLLevenbergMarquardtMinimizer::maxIterations() const
+{
+    return optionValue<int>(OptionNames::MaxIterations);
+}
+
+std::string GSLLevenbergMarquardtMinimizer::statusToString() const
+{
+    return MinimizerUtils::gslErrorDescription(rootMinimizer()->Status());
+}
+
+std::map<std::string, std::string> GSLLevenbergMarquardtMinimizer::statusMap() const
+{
+    auto result = RootMinimizerAdapter::statusMap();
+    result["Edm"] = to_string_scientific(rootMinimizer()->Edm());
+    result["CovMatrixStatus"] = covmatrixStatusDescription()[rootMinimizer()->CovMatrixStatus()];
+    result["functionCalls"] = std::to_string(rootMinimizer()->NCalls());
+    return result;
+}
+
+void GSLLevenbergMarquardtMinimizer::propagateOptions()
+{
+    m_gsl_minimizer->SetTolerance(tolerance());
+    m_gsl_minimizer->SetPrintLevel(printLevel());
+    m_gsl_minimizer->SetMaxIterations(maxIterations());
+}
+
+const RootMinimizerAdapter::root_minimizer_t *GSLLevenbergMarquardtMinimizer::rootMinimizer() const
+{
+    return m_gsl_minimizer.get();
+}
diff --git a/Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.h b/Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.h
new file mode 100644
index 0000000..9fab3d3
--- /dev/null
+++ b/Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/GSLLevenbergMarquardtMinimizer.h
+//! @brief     Declares class GSLLevenbergMarquardtMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GSLLEVENBERGMARQUARDTMINIMIZER_H
+#define GSLLEVENBERGMARQUARDTMINIMIZER_H
+
+#include "RootMinimizerAdapter.h"
+namespace BA_ROOT { namespace Math { class GSLNLSMinimizer; } }
+
+//! @class GSLLevenbergMarquardtMinimizer
+//! @ingroup fitting_internal
+//! @brief Wrapper for GSL Levenberg-Marquardt minimizer.
+//! http://www.gnu.org/software/gsl/manual/html_node/Nonlinear-Least_002dSquares-Fitting.html
+
+class BA_CORE_API_ GSLLevenbergMarquardtMinimizer : public RootMinimizerAdapter {
+public:
+    GSLLevenbergMarquardtMinimizer();
+    ~GSLLevenbergMarquardtMinimizer();
+
+    //!< Sets tolerance on the function value at the minimum.
+    //! Default value is 0.01.
+    void setTolerance(double value);
+    double tolerance() const;
+
+    //! Sets minimizer internal print level.
+    //! Default value is 0 (silent).
+    void setPrintLevel(int value);
+    int printLevel() const;
+
+    //! Sets maximum number of iterations. This is an internal minimizer setting which has
+    //! no direct relation to the number of objective function calls (e.g. numberOfIteraction=5
+    //! might correspond to ~100 objective function calls).
+    void setMaxIterations(int value);
+    int maxIterations() const;
+
+    std::string statusToString() const;
+    std::map<std::string, std::string> statusMap() const;
+
+protected:
+    virtual bool isGradientBasedAgorithm() { return true; }
+    void propagateOptions();
+    const root_minimizer_t* rootMinimizer() const;
+
+private:
+    std::unique_ptr<BA_ROOT::Math::GSLNLSMinimizer> m_gsl_minimizer;
+};
+
+#endif // GSLLEVENBERGMARQUARDTMINIMIZER_H
diff --git a/Fit/RootAdapter/GSLMultiMinimizer.cpp b/Fit/RootAdapter/GSLMultiMinimizer.cpp
new file mode 100644
index 0000000..9154717
--- /dev/null
+++ b/Fit/RootAdapter/GSLMultiMinimizer.cpp
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/GSLMultiMinimizer.cpp
+//! @brief     Implements class GSLMultiMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "GSLMultiMinimizer.h"
+#include "MinimizerUtils.h"
+#include <string>
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#include "Math/GSLMinimizer.h"
+#pragma GCC diagnostic pop
+
+
+GSLMultiMinimizer::GSLMultiMinimizer(const std::string &algorithmName)
+    : RootMinimizerAdapter(MinimizerInfo::buildGSLMultiMinInfo(algorithmName))
+    , m_gsl_minimizer(new BA_ROOT::Math::GSLMinimizer(algorithmName.c_str()))
+{
+    addOption(OptionNames::PrintLevel, 0, "Minimizer internal print level");
+    addOption(OptionNames::MaxIterations, 0, "Maximum number of iterations");
+}
+
+GSLMultiMinimizer::~GSLMultiMinimizer()
+{
+
+}
+
+void GSLMultiMinimizer::setPrintLevel(int value)
+{
+    setOptionValue(OptionNames::PrintLevel, value);
+}
+
+int GSLMultiMinimizer::printLevel() const
+{
+    return optionValue<int>(OptionNames::PrintLevel);
+}
+
+void GSLMultiMinimizer::setMaxIterations(int value)
+{
+    setOptionValue(OptionNames::MaxIterations, value);
+}
+
+int GSLMultiMinimizer::maxIterations() const
+{
+    return optionValue<int>(OptionNames::MaxIterations);
+}
+
+std::string GSLMultiMinimizer::statusToString() const
+{
+    return MinimizerUtils::gslErrorDescription(rootMinimizer()->Status());
+}
+
+void GSLMultiMinimizer::propagateOptions()
+{
+    m_gsl_minimizer->SetPrintLevel(printLevel());
+    m_gsl_minimizer->SetMaxIterations(maxIterations());
+}
+
+const RootMinimizerAdapter::root_minimizer_t *GSLMultiMinimizer::rootMinimizer() const
+{
+    return m_gsl_minimizer.get();
+}
diff --git a/Fit/RootAdapter/GSLMultiMinimizer.h b/Fit/RootAdapter/GSLMultiMinimizer.h
new file mode 100644
index 0000000..ece1525
--- /dev/null
+++ b/Fit/RootAdapter/GSLMultiMinimizer.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/GSLMultiMinimizer.h
+//! @brief     Declares class GSLMultiMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GSLMULTIMINIMIZER_H
+#define GSLMULTIMINIMIZER_H
+
+#include "RootMinimizerAdapter.h"
+#include "MinimizerConstants.h"
+
+namespace BA_ROOT { namespace Math { class GSLMinimizer; } }
+
+//! @class GSLMultiMinimizer
+//! @ingroup fitting_internal
+//! @brief Wrapper for GSL multi minimizer (gradient descent based) family
+
+class BA_CORE_API_ GSLMultiMinimizer : public RootMinimizerAdapter {
+public:
+    explicit GSLMultiMinimizer(const std::string &algorithmName = AlgorithmNames::ConjugateFR);
+    ~GSLMultiMinimizer();
+
+    //! Sets minimizer internal print level.
+    //! Default value is 0 (silent).
+    void setPrintLevel(int value);
+    int printLevel() const;
+
+    //! Sets maximum number of iterations. This is an internal minimizer setting which has
+    //! no direct relation to the number of objective function calls (e.g. numberOfIteraction=5
+    //! might correspond to ~100 objective function calls).
+    void setMaxIterations(int value);
+    int maxIterations() const;
+
+    std::string statusToString() const;
+
+protected:
+    void propagateOptions();
+    const root_minimizer_t* rootMinimizer() const;
+
+private:
+    std::unique_ptr<BA_ROOT::Math::GSLMinimizer> m_gsl_minimizer;
+};
+
+#endif // GSLMULTIMINIMIZER_H
diff --git a/Fit/RootAdapter/GeneticMinimizer.cpp b/Fit/RootAdapter/GeneticMinimizer.cpp
new file mode 100644
index 0000000..7a2c04b
--- /dev/null
+++ b/Fit/RootAdapter/GeneticMinimizer.cpp
@@ -0,0 +1,154 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/GeneticMinimizer.cpp
+//! @brief     Implements class GeneticMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "GeneticMinimizer.h"
+#include "FitParameter.h"
+#include "MinimizerConstants.h"
+#include "Math/GeneticMinimizer.h"
+
+namespace {
+
+std::map<int, std::string> statusDescription()
+{
+    std::map<int, std::string> result;
+    result[0] = std::string("OK, minimum found");
+    result[1] = std::string("Maximum number of iterations reached");
+    return result;
+}
+
+}
+
+GeneticMinimizer::GeneticMinimizer()
+    : RootMinimizerAdapter(MinimizerInfo::buildGeneticInfo())
+    , m_genetic_minimizer(new BA_ROOT::Math::GeneticMinimizer())
+{
+    addOption(OptionNames::Tolerance, 0.01, "Tolerance on the function value at the minimum");
+    addOption(OptionNames::PrintLevel, 0, "Minimizer internal print level");
+    addOption(OptionNames::MaxIterations, 3, "Maximum number of iterations");
+    addOption(OptionNames::PopulationSize, 300, "Population size");
+    addOption(OptionNames::RandomSeed, 0, "Random seed");
+
+    // Seems it is not used inside Root, no need to expose
+    //addOption("Cycles", 3, "Number of cycles");
+
+    // It's hard to understand (without going to much into genetics details), what parameters below
+    // are doing. So better to not to expose and rely on their internal ROOT's default values.
+
+    //addOption("sc_steps", 10, "Spread control steps");
+    //addOption("sc_rate", 5, "Spread control rate");
+    //addOption("sc_factor", 0.95, "Spread control factor");
+}
+
+GeneticMinimizer::~GeneticMinimizer()
+{
+
+}
+
+void GeneticMinimizer::setTolerance(double value)
+{
+    setOptionValue(OptionNames::Tolerance, value);
+}
+
+double GeneticMinimizer::tolerance() const
+{
+    return optionValue<double>(OptionNames::Tolerance);
+}
+
+void GeneticMinimizer::setPrintLevel(int value)
+{
+    setOptionValue(OptionNames::PrintLevel, value);
+}
+
+int GeneticMinimizer::printLevel() const
+{
+    return optionValue<int>(OptionNames::PrintLevel);
+}
+
+void GeneticMinimizer::setMaxIterations(int value)
+{
+    setOptionValue(OptionNames::MaxIterations, value);
+}
+
+int GeneticMinimizer::maxIterations() const
+{
+    return optionValue<int>(OptionNames::MaxIterations);
+}
+
+void GeneticMinimizer::setPopulationSize(int value)
+{
+    setOptionValue(OptionNames::PopulationSize, value);
+}
+
+int GeneticMinimizer::populationSize() const
+{
+    return optionValue<int>(OptionNames::PopulationSize);
+}
+
+void GeneticMinimizer::setRandomSeed(int value)
+{
+    setOptionValue(OptionNames::RandomSeed, value);
+}
+
+int GeneticMinimizer::randomSeed() const
+{
+    return optionValue<int>(OptionNames::RandomSeed);
+}
+
+//! Sets minimizer parameter. Overload is required to check that parameter is properly limited.
+
+void GeneticMinimizer::setParameter(size_t index, const FitParameter *par)
+{
+    if( !par->limits().isFixed() && !par->limits().isLimited()) {
+        std::ostringstream ostr;
+        ostr << "GeneticMinimizer::setParameter() -> Error! "
+             << "Genetic minimizer requires either fixed or "
+             << "limited AttLimits::limited(left,right) parameter. "
+             << " Parameter name '" << par->name() << "', limits:" << par->limits().toString();
+        throw std::runtime_error(ostr.str());
+    }
+    RootMinimizerAdapter::setParameter(index, par);
+}
+
+std::string GeneticMinimizer::statusToString() const
+{
+    return statusDescription()[rootMinimizer()->Status()];
+}
+
+std::map<std::string, std::string> GeneticMinimizer::statusMap() const
+{
+    auto result = RootMinimizerAdapter::statusMap();
+    result["functionCalls"] = std::to_string(rootMinimizer()->NCalls());
+    return result;
+}
+
+void GeneticMinimizer::propagateOptions()
+{
+    BA_ROOT::Math::GeneticMinimizerParameters pars;
+    pars.fPopSize = populationSize();
+    pars.fNsteps = maxIterations();
+//    pars.fCycles = m_options.getIntValue("Cycles"); // seems it's not used inside ROOT
+//    pars.fSC_steps = m_options.getIntValue("SC_steps"); // no idea what it is doing
+//    pars.fSC_rate = m_options.getIntValue("SC_rate"); // no idea what it is doing
+//    pars.fSC_factor = m_options.getRealValue("SC_factor"); // no idea what it is doing
+    const double scale_as_in_root = 10.0;
+    pars.fConvCrit = scale_as_in_root*tolerance();
+    pars.fSeed = randomSeed();
+    m_genetic_minimizer->SetParameters(pars);
+}
+
+const RootMinimizerAdapter::root_minimizer_t *GeneticMinimizer::rootMinimizer() const
+{
+    return m_genetic_minimizer.get();
+}
diff --git a/Fit/RootAdapter/GeneticMinimizer.h b/Fit/RootAdapter/GeneticMinimizer.h
new file mode 100644
index 0000000..380ef09
--- /dev/null
+++ b/Fit/RootAdapter/GeneticMinimizer.h
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/GeneticMinimizer.h
+//! @brief     Declares class GeneticMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GENETICMINIMIZER_H
+#define GENETICMINIMIZER_H
+
+#include "RootMinimizerAdapter.h"
+
+namespace BA_ROOT { namespace Math { class GeneticMinimizer; } }
+
+//! @class GeneticMinimizer
+//! @ingroup fitting_internal
+//! @brief Wrapper for ROOT Genetic minimizer
+
+class BA_CORE_API_ GeneticMinimizer : public RootMinimizerAdapter {
+public:
+    GeneticMinimizer();
+    ~GeneticMinimizer();
+
+    //!< Sets tolerance on the function value at the minimum.
+    //!< Minimization will stop when the estimated vertical distance to the minimum (EDM) is less
+    //! than 0.001*tolerance*ErrorDef. Here ErrorDef=1.0 for chi squared fit and ErrorDef=0.5
+    //! for negative log likelihood fit.
+    //! Default value is 0.01.
+    void setTolerance(double value);
+    double tolerance() const;
+
+    //! Sets minimizer internal print level.
+    //! Default value is 0 (silent).
+    void setPrintLevel(int value);
+    int printLevel() const;
+
+    //! Sets maximum number of iterations to try at each step.
+    //! Default values is 3.
+    void setMaxIterations(int value);
+    int maxIterations() const;
+
+    //! Sets population size.
+    //! Default value is 300.
+    void setPopulationSize(int value);
+    int populationSize() const;
+
+    //! Sets random seed.
+    //! Default value is 0.
+    void setRandomSeed(int value);
+    int randomSeed() const;
+
+    void setParameter(size_t index, const FitParameter *par);
+
+    std::string statusToString() const;
+    std::map<std::string, std::string> statusMap() const;
+
+protected:
+    void propagateOptions();
+    const root_minimizer_t* rootMinimizer() const;
+
+private:
+    std::unique_ptr<BA_ROOT::Math::GeneticMinimizer> m_genetic_minimizer;
+};
+
+#endif // GENETICMINIMIZER_H
diff --git a/Fit/RootAdapter/Minuit2Minimizer.cpp b/Fit/RootAdapter/Minuit2Minimizer.cpp
new file mode 100644
index 0000000..38c5419
--- /dev/null
+++ b/Fit/RootAdapter/Minuit2Minimizer.cpp
@@ -0,0 +1,171 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/Minuit2Minimizer.cpp
+//! @brief     Declares class Minuit2Minimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Minuit2Minimizer.h"
+#include "MinimizerResultsHelper.h"
+#include "Minuit2/Minuit2Minimizer.h"
+
+namespace {
+
+std::map<int, std::string> statusDescription()
+{
+    std::map<int, std::string> result;
+    result[0] = std::string("OK, valid minimum");
+    result[1] = std::string("Didn't converge, covariance was made pos defined");
+    result[2] = std::string("Didn't converge, Hesse is invalid");
+    result[3] = std::string("Didn't converge, Edm is above max");
+    result[4] = std::string("Didn't converge, reached call limit");
+    result[5] = std::string("Didn't converge, unknown failure");
+    return result;
+}
+
+std::map<int, std::string> covmatrixStatusDescription()
+{
+    std::map<int, std::string> result;
+    result[-1] = std::string("Not available (inversion failed or Hesse failed)");
+    result[0] = std::string("Available but not positive defined");
+    result[1] = std::string("Covariance only approximate");
+    result[2] = std::string("Full matrix but forced pos def");
+    result[3] = std::string("Full accurate");
+    return result;
+}
+
+}
+
+Minuit2Minimizer::Minuit2Minimizer(const std::string &algorithmName)
+    : RootMinimizerAdapter(MinimizerInfo::buildMinuit2Info(algorithmName))
+    , m_minuit2_minimizer(new BA_ROOT::Minuit2::Minuit2Minimizer(algorithmName.c_str()))
+{
+    addOption(OptionNames::Strategy, 1,
+              "Minimization strategy (0-low, 1-medium, 2-high quality)");
+    addOption(OptionNames::ErrorDef, 1.0,
+              "Error definition factor for parameter error calculation");
+    addOption(OptionNames::Tolerance, 0.01,
+              "Tolerance on the function value at the minimum");
+    addOption(OptionNames::Precision, -1.0,
+              "Relative floating point arithmetic precision");
+    addOption(OptionNames::PrintLevel, 0,
+              "Minimizer internal print level");
+    addOption(OptionNames::MaxFunctionCalls, 0,
+              "Maximum number of function calls");
+}
+
+Minuit2Minimizer::~Minuit2Minimizer()
+{
+
+}
+
+void Minuit2Minimizer::setStrategy(int value)
+{
+    setOptionValue(OptionNames::Strategy, value);
+}
+
+int Minuit2Minimizer::strategy() const
+{
+    return optionValue<int>(OptionNames::Strategy);
+}
+
+void Minuit2Minimizer::setErrorDefinition(double value)
+{
+    setOptionValue(OptionNames::ErrorDef, value);
+}
+
+double Minuit2Minimizer::errorDefinition() const
+{
+    return optionValue<double>(OptionNames::ErrorDef);
+}
+
+void Minuit2Minimizer::setTolerance(double value)
+{
+    setOptionValue(OptionNames::Tolerance, value);
+}
+
+double Minuit2Minimizer::tolerance() const
+{
+    return optionValue<double>(OptionNames::Tolerance);
+}
+
+void Minuit2Minimizer::setPrecision(double value)
+{
+    setOptionValue(OptionNames::Precision, value);
+}
+
+double Minuit2Minimizer::precision() const
+{
+    return optionValue<double>(OptionNames::Precision);
+}
+
+void Minuit2Minimizer::setPrintLevel(int value)
+{
+    setOptionValue(OptionNames::PrintLevel, value);
+}
+
+int Minuit2Minimizer::printLevel() const
+{
+    return optionValue<int>(OptionNames::PrintLevel);
+}
+
+void Minuit2Minimizer::setMaxFunctionCalls(int value)
+{
+    setOptionValue(OptionNames::MaxFunctionCalls, value);
+}
+
+int Minuit2Minimizer::maxFunctionCalls() const
+{
+    return optionValue<int>(OptionNames::MaxFunctionCalls);
+}
+
+std::string Minuit2Minimizer::statusToString() const
+{
+    return statusDescription()[rootMinimizer()->Status()];
+}
+
+std::map<std::string, std::string> Minuit2Minimizer::statusMap() const
+{
+    auto result = RootMinimizerAdapter::statusMap();
+    result["Edm"] = to_string_scientific(rootMinimizer()->Edm());
+    result["CovMatrixStatus"] = covmatrixStatusDescription()[rootMinimizer()->CovMatrixStatus()];
+    result["functionCalls"] = std::to_string(rootMinimizer()->NCalls());
+    return result;
+}
+
+// Fumili algorithm can work only with gradient based objective function, while others can
+// work with both, gradient based and chi2 based functions. Historically however, we use
+// simplified approach: if not Fumili, then chi2 only. Think of refactoring TODO.
+bool Minuit2Minimizer::isGradientBasedAgorithm()
+{
+    if(algorithmName() == AlgorithmNames::Fumili)
+        return true;
+
+    return false;
+}
+
+//! Propagate options down to ROOT's Minuit2Minimizer.
+
+void Minuit2Minimizer::propagateOptions()
+{
+    m_minuit2_minimizer->SetStrategy(strategy());
+    m_minuit2_minimizer->SetErrorDef(errorDefinition());
+    m_minuit2_minimizer->SetTolerance(tolerance());
+    m_minuit2_minimizer->SetPrecision(precision());
+    m_minuit2_minimizer->SetPrintLevel(printLevel());
+    m_minuit2_minimizer->SetMaxFunctionCalls(maxFunctionCalls());
+}
+
+const RootMinimizerAdapter::root_minimizer_t *Minuit2Minimizer::rootMinimizer() const
+{
+    return m_minuit2_minimizer.get();
+}
+
diff --git a/Fit/RootAdapter/Minuit2Minimizer.h b/Fit/RootAdapter/Minuit2Minimizer.h
new file mode 100644
index 0000000..cf173e7
--- /dev/null
+++ b/Fit/RootAdapter/Minuit2Minimizer.h
@@ -0,0 +1,87 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/Minuit2Minimizer.h
+//! @brief     Declares class Minuit2Minimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINUIT2MINIMIZER_H
+#define MINUIT2MINIMIZER_H
+
+#include "RootMinimizerAdapter.h"
+#include "MinimizerConstants.h"
+#include <memory>
+
+namespace BA_ROOT { namespace Minuit2 { class Minuit2Minimizer; } }
+
+//! @class Minuit2Minimizer
+//! @ingroup fitting_internal
+//! @brief The Minuit2Minimizer class is a wrapper for ROOT Minuit2 minimizer
+//! See Minuit2 user manual https://root.cern.ch/root/htmldoc/guides/minuit2/Minuit2.pdf.
+
+class BA_CORE_API_ Minuit2Minimizer : public RootMinimizerAdapter
+{
+public:
+    Minuit2Minimizer(const std::string &algorithmName = AlgorithmNames::Migrad);
+    ~Minuit2Minimizer();
+
+    //! Sets minimization strategy (0-low, 1-medium, 2-high minimization quality).
+    //! At low quality number of function calls will be economized.
+    //! Default value is 1.
+    void setStrategy(int value);
+    int strategy() const;
+
+    //! Sets error definition factor for parameter error calculation.
+    //! If objective function (OF) is the usual chisquare function and if the user wants the usual
+    //! one-standard-deviation errors, then the error definition should be 1.0. If OF is a
+    //! negative-log-likelihood function, then 0.5. If OF is a chisquare, but the user wants
+    //! two-standard-deviation errors, 4.0.
+    //! Default value is 1.0.
+    void setErrorDefinition(double value);
+    double errorDefinition() const;
+
+    //!< Sets tolerance on the function value at the minimum.
+    //!< Minimization will stop when the estimated vertical distance to the minimum (EDM) is less
+    //! than 0.001*tolerance*ErrorDef. Here ErrorDef=1.0 for chi squared fit and ErrorDef=0.5
+    //! for negative log likelihood fit.
+    //! Default value is 0.01.
+    void setTolerance(double value);
+    double tolerance() const;
+
+    //!< Sets relative floating point arithmetic precision.
+    //!< Should be adjusted when the user knows that objectiove function value is not
+    //!< calculated to the nominal machine accuracy. Typical values are between 10^-5 and 10^-14.
+    //!  Default value is -1.0 (minimizer specific will be used).
+    void setPrecision(double value);
+    double precision() const;
+
+    //! Sets minimizer internal print level.
+    //! Default value is 0 (silent).
+    void setPrintLevel(int value);
+    int printLevel() const;
+
+    //! Sets maximum number of objective function calls.
+    void setMaxFunctionCalls(int value);
+    int maxFunctionCalls() const;
+
+    std::string statusToString() const;
+    std::map<std::string, std::string> statusMap() const;
+
+protected:
+    bool isGradientBasedAgorithm();
+    void propagateOptions();
+    const root_minimizer_t* rootMinimizer() const;
+
+private:
+    std::unique_ptr<BA_ROOT::Minuit2::Minuit2Minimizer> m_minuit2_minimizer;
+};
+
+#endif // MINUIT2MINIMIZER_H
diff --git a/Fit/RootAdapter/RootMinimizerAdapter.cpp b/Fit/RootAdapter/RootMinimizerAdapter.cpp
new file mode 100644
index 0000000..0c0dce7
--- /dev/null
+++ b/Fit/RootAdapter/RootMinimizerAdapter.cpp
@@ -0,0 +1,231 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/RootMinimizerAdapter.cpp
+//! @brief     Implements class RootMinimizerAdapter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RootMinimizerAdapter.h"
+#include "RootMinimizerFunctions.h"
+#include "Math/Minimizer.h"
+#include "FitParameter.h"
+#include "FitParameterSet.h"
+#include "MinimizerResultsHelper.h"
+#include "RootObjectiveFuncAdapter.h"
+
+
+RootMinimizerAdapter::RootMinimizerAdapter(const MinimizerInfo &minimizerInfo)
+    :  m_minimizerInfo(minimizerInfo)
+    , m_obj_func(new RootObjectiveFunctionAdapter)
+    , m_status(false)
+{
+
+}
+
+RootMinimizerAdapter::~RootMinimizerAdapter()
+{
+
+}
+
+void RootMinimizerAdapter::minimize()
+{
+    propagateOptions();
+    m_status = rootMinimizer()->Minimize();
+}
+
+std::string RootMinimizerAdapter::minimizerName() const
+{
+    return m_minimizerInfo.name();
+}
+
+std::string RootMinimizerAdapter::algorithmName() const
+{
+    return m_minimizerInfo.algorithmName();
+}
+
+void RootMinimizerAdapter::setParameters(const FitParameterSet &parameters)
+{
+    m_obj_func->setNumberOfParameters(parameters.size());
+
+    // Genetic minimizer requires SetFunction before setParameters, others don't care
+    if( isGradientBasedAgorithm() ) {
+        rootMinimizer()->SetFunction(*m_obj_func->rootGradientFunction());
+    } else {
+        rootMinimizer()->SetFunction(*m_obj_func->rootChiSquaredFunction());
+    }
+
+    size_t index(0);
+    for (auto par: parameters)
+        setParameter(index++, par );
+
+    if( (int)parameters.size() != fitDimension())  {
+        std::ostringstream ostr;
+        ostr << "BasicMinimizer::setParameters() -> Error! Unconsistency in fit parameter number: ";
+        ostr << "fitParameterCount = " << fitDimension() << ",";
+        ostr << "parameters.size = " << parameters.size();
+        throw std::runtime_error(ostr.str());
+    }
+}
+
+void RootMinimizerAdapter::setObjectiveFunction(objective_function_t func)
+{
+    m_obj_func->setObjectiveCallback(func);
+}
+
+void RootMinimizerAdapter::setGradientFunction(gradient_function_t func, int ndatasize)
+{
+    m_obj_func->setGradientCallback(func, ndatasize);
+}
+
+double RootMinimizerAdapter::minValue() const
+{
+    return rootMinimizer()->MinValue();
+}
+
+std::string RootMinimizerAdapter::reportResults() const
+{
+    MinimizerResultsHelper reporter;
+    return reporter.reportResults(this);
+}
+
+std::string RootMinimizerAdapter::statusToString() const
+{
+    return (m_status ? std::string("Minimum found") : std::string("Error in solving"));
+}
+
+bool RootMinimizerAdapter::providesError() const
+{
+    return rootMinimizer()->ProvidesError();
+}
+
+std::map<std::string, std::string> RootMinimizerAdapter::statusMap() const
+{
+    std::map<std::string, std::string> result;
+    result["Status"] = statusToString();
+
+    if(providesError()) {
+        result["ProvidesError"] = "Provides parameters error and error matrix";
+    } else {
+        result["ProvidesError"] = "Doesn't provide error calculation";
+    }
+
+    result["MinValue"] = to_string_scientific(minValue());
+
+    return result;
+}
+
+void RootMinimizerAdapter::propagateResults(FitParameterSet &parameters)
+{
+    // sets values and errors found
+    parameters.setValues(parValuesAtMinimum());
+    parameters.setErrors(parErrorsAtMinimum());
+
+    // sets correlation matrix
+    if(providesError()) {
+        FitParameterSet::corr_matrix_t matrix;
+        matrix.resize(fitDimension());
+
+        for(size_t i=0; i<(size_t)fitDimension(); ++i) {
+            matrix[i].resize(fitDimension(), 0.0);
+            for(size_t j=0; j<(size_t)fitDimension(); ++j) {
+                matrix[i][j] = rootMinimizer()->Correlation(i,j);
+            }
+        }
+        parameters.setCorrelationMatrix(matrix);
+    }
+}
+
+void RootMinimizerAdapter::setOptions(const std::string &optionString)
+{
+    options().setOptionString(optionString);
+}
+
+//! Propagate fit parameter down to ROOT minimizer.
+
+void RootMinimizerAdapter::setParameter(size_t index, const FitParameter *par)
+{
+    bool success;
+    if (par->limits().isFixed()) {
+        success = rootMinimizer()->SetFixedVariable((int)index, par->name().c_str(),
+                                                    par->value());
+
+    }
+
+    else if (par->limits().isLimited()) {
+        success = rootMinimizer()->SetLimitedVariable((int)index, par->name().c_str(),
+                                                      par->value(), par->step(),
+                                                      par->limits().lowerLimit(),
+                                                      par->limits().upperLimit());
+    }
+
+    else if (par->limits().isLowerLimited()) {
+        success = rootMinimizer()->SetLowerLimitedVariable((int)index, par->name().c_str(),
+                                                           par->value(), par->step(),
+                                                           par->limits().lowerLimit());
+    }
+
+    else if (par->limits().isUpperLimited()) {
+        success = rootMinimizer()->SetUpperLimitedVariable((int)index, par->name().c_str(),
+                                                           par->value(), par->step(),
+                                                           par->limits().upperLimit());
+    }
+
+    else if (!par->limits().isLimitless()) {
+        success = rootMinimizer()->SetVariable((int)index, par->name().c_str(), par->value(),
+                                               par->step());
+    }
+
+    else {
+        throw std::runtime_error("BasicMinimizer::setParameter() -> Error! Unexpected parameter.");
+    }
+
+    if( !success ) {
+        std::ostringstream ostr;
+        ostr << "BasicMinimizer::setParameter() -> Error! Can't set minimizer's fit parameter";
+        ostr << "Index:" << index << " name '" << par->name() << "'";
+        throw std::runtime_error(ostr.str());
+    }
+}
+
+//! Returns number of fit parameters defined (i.e. dimension of the function to be minimized).
+
+int RootMinimizerAdapter::fitDimension() const
+{
+    return rootMinimizer()->NDim();
+}
+
+//! Returns value of the variables at minimum.
+
+std::vector<double> RootMinimizerAdapter::parValuesAtMinimum() const
+{
+    std::vector<double > result;
+    result.resize(fitDimension(), 0.0);
+    std::copy(rootMinimizer()->X(), rootMinimizer()->X()+fitDimension(), result.begin());
+    return result;
+}
+
+//! Returns errors of the variables at minimum.
+
+std::vector<double> RootMinimizerAdapter::parErrorsAtMinimum() const
+{
+    std::vector<double > result;
+    result.resize(fitDimension(), 0.0);
+    if(rootMinimizer()->Errors() != 0 ) {
+        std::copy(rootMinimizer()->Errors(), rootMinimizer()->Errors()+fitDimension(),
+                  result.begin());
+    }
+    return result;
+}
+
+RootMinimizerAdapter::root_minimizer_t *RootMinimizerAdapter::rootMinimizer() {
+    return const_cast<root_minimizer_t *>(
+        static_cast<const RootMinimizerAdapter *>(this)->rootMinimizer());
+}
diff --git a/Fit/RootAdapter/RootMinimizerAdapter.h b/Fit/RootAdapter/RootMinimizerAdapter.h
new file mode 100644
index 0000000..28ba234
--- /dev/null
+++ b/Fit/RootAdapter/RootMinimizerAdapter.h
@@ -0,0 +1,127 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/RootMinimizerAdapter.h
+//! @brief     Declares class RootMinimizerAdapter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ROOTMINIMIZERADAPTER_H
+#define ROOTMINIMIZERADAPTER_H
+
+#include "IMinimizer.h"
+#include "MinimizerOptions.h"
+#include "MinimizerInfo.h"
+#include <string>
+#include <memory>
+
+class RootObjectiveFunctionAdapter;
+class FitParameter;
+
+namespace BA_ROOT { namespace Math { class Minimizer; } }
+
+//! @class RootMinimizerAdapter
+//! @ingroup fitting_internal
+//! @brief The RootMinimizerAdapter class adapts ROOT minimizer interface to our IMinimizer.
+
+class BA_CORE_API_ RootMinimizerAdapter : public IMinimizer
+{
+public:
+    typedef BA_ROOT::Math::Minimizer root_minimizer_t;
+
+    virtual ~RootMinimizerAdapter();
+
+    virtual void minimize() override;
+
+    //! Returns name of the minimizer.
+    std::string minimizerName() const override final;
+
+    //! Returns name of the minimization algorithm.
+    std::string algorithmName() const override final;
+
+    void setParameters(const FitParameterSet& parameters) override final;
+
+    void setObjectiveFunction(objective_function_t func) override final;
+
+    void setGradientFunction(gradient_function_t func, int ndatasize) override final;
+
+    double minValue() const override final;
+
+    std::string reportResults() const override final;
+
+    MinimizerOptions& options() { return m_options; }
+    const MinimizerOptions& options() const { return m_options; }
+
+    //! Returns string representation of current minimizer status.
+    virtual std::string statusToString() const;
+
+    //! Returns true if minimizer provides error and error matrix
+    bool providesError() const;
+
+    //! Returns map of string representing different minimizer statuses
+    virtual std::map<std::string, std::string> statusMap() const;
+
+    //! Propagates results of minimization to fit parameter set
+    void propagateResults(FitParameterSet& parameters) override;
+
+    //! Sets option string to the minimizer
+    void setOptions(const std::string &optionString) override final;
+
+protected:
+    RootMinimizerAdapter(const MinimizerInfo &minimizerInfo);
+
+    virtual bool isGradientBasedAgorithm() { return false;}
+    virtual void setParameter(size_t index, const FitParameter *par);
+    int fitDimension() const;
+    std::vector<double> parValuesAtMinimum() const;
+    std::vector<double> parErrorsAtMinimum() const;
+
+    virtual void propagateOptions() = 0;
+    virtual const root_minimizer_t* rootMinimizer() const = 0;
+    root_minimizer_t* rootMinimizer();
+
+    template<class T>
+    OptionContainer::option_t addOption(const std::string &optionName, T value,
+                       const std::string &description = std::string());
+
+    template<class T>
+    void setOptionValue(const std::string& optionName, T value);
+
+    template<class T>
+    T optionValue(const std::string &optionName) const;
+
+private:
+    MinimizerOptions m_options;
+    MinimizerInfo m_minimizerInfo;
+    std::unique_ptr<RootObjectiveFunctionAdapter> m_obj_func;
+    bool m_status;
+};
+
+template<class T>
+OptionContainer::option_t RootMinimizerAdapter::addOption(const std::string &optionName, T value,
+                   const std::string &description)
+{
+    return m_options.addOption(optionName, value, description);
+}
+
+template<class T>
+void RootMinimizerAdapter::setOptionValue(const std::string& optionName, T value)
+{
+    m_options.setOptionValue(optionName, value);
+}
+
+template<class T>
+T RootMinimizerAdapter::optionValue(const std::string &optionName) const
+{
+    return m_options.optionValue<T>(optionName);
+}
+
+#endif // ROOTMINIMIZERADAPTER_H
+
diff --git a/Fit/RootAdapter/RootMinimizerFunctions.h b/Fit/RootAdapter/RootMinimizerFunctions.h
new file mode 100644
index 0000000..563d2f5
--- /dev/null
+++ b/Fit/RootAdapter/RootMinimizerFunctions.h
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/RootMinimizerFunctions.h
+//! @brief     Defines classes RootObjectiveFunction and RootGradientFunction
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ROOTMINIMIZERFUNCTIONS_H
+#define ROOTMINIMIZERFUNCTIONS_H
+
+#include "KernelTypes.h"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#include "Math/Functor.h"
+#include "Math/FitMethodFunction.h"
+#pragma GCC diagnostic pop
+
+//! @class RootObjectiveFunction
+//! @ingroup fitting_internal
+//! @brief minimizer chi2 function
+
+class RootObjectiveFunction : public BA_ROOT::Math::Functor
+{
+ public:
+    RootObjectiveFunction(root_objective_t fcn, int ndims )
+        : BA_ROOT::Math::Functor(fcn, ndims) {}
+};
+
+//! @class RootGradientFunction
+//! @ingroup fitting_internal
+//! @brief Minimizer function with access to single data element residuals.
+//! Required by Fumili, Fumili2 and GSLMultiMin minimizers
+
+class RootGradientFunction : public BA_ROOT::Math::FitMethodFunction
+{
+ public:
+    typedef BA_ROOT::Math::BasicFitMethodFunction<BA_ROOT::Math::IMultiGenFunction>::Type_t Type_t;
+
+    RootGradientFunction(root_gradient_t fun_gradient, size_t npars, size_t ndatasize)
+        : BA_ROOT::Math::FitMethodFunction((int)npars, (int)ndatasize)
+        , m_fun_gradient(fun_gradient) { }
+
+    Type_t Type() const { return BA_ROOT::Math::FitMethodFunction::kLeastSquare; }
+
+    BA_ROOT::Math::IMultiGenFunction* Clone() const {
+        return new RootGradientFunction(m_fun_gradient, NDim(), NPoints()); }
+
+    //! evaluation of single data element residual
+    double DataElement(const double* pars, unsigned int i_data, double* gradient = 0) const {
+        return m_fun_gradient(pars, i_data, gradient);
+    }
+
+ private:
+    //! evaluation of chi2
+    double DoEval(const double* pars) const {
+        double chi2 = 0.0;
+        for(size_t i_data=0; i_data<NPoints(); ++i_data) {
+            double  res = DataElement(pars, (unsigned)i_data);
+            chi2 += res*res;
+        }
+        return chi2/double(NPoints());
+    }
+
+    root_gradient_t m_fun_gradient;
+};
+
+#endif // ROOTMINIMIZERFUNCTIONS_H
diff --git a/Fit/RootAdapter/RootObjectiveFuncAdapter.cpp b/Fit/RootAdapter/RootObjectiveFuncAdapter.cpp
new file mode 100644
index 0000000..5e03662
--- /dev/null
+++ b/Fit/RootAdapter/RootObjectiveFuncAdapter.cpp
@@ -0,0 +1,127 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/RootObjectiveFuncAdapter.cpp
+//! @brief     Implements class RootObjectiveFunctionAdapter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RootObjectiveFuncAdapter.h"
+#include "RootMinimizerFunctions.h"
+#include "IMinimizer.h"
+#include <stdexcept>
+
+RootObjectiveFunctionAdapter::RootObjectiveFunctionAdapter()
+    : m_nparameters(0)
+    , m_ndatasize(0)
+{
+
+}
+
+//! Sets the function which will be used for finding objective function minimum value
+
+void RootObjectiveFunctionAdapter::setObjectiveCallback(objective_function_t func)
+{
+    m_objective_callback = func;
+}
+
+//! Sets the function which will be used for gradient calculations.
+
+void RootObjectiveFunctionAdapter::setGradientCallback(gradient_function_t func, int ndatasize)
+{
+    m_gradient_callback = func;
+    m_ndatasize = ndatasize;
+}
+
+//! Sets number of fit parameters (needed to construct correct ROOT's functions).
+
+void RootObjectiveFunctionAdapter::setNumberOfParameters(int nparameters)
+{
+    m_nparameters = nparameters;
+}
+
+//! Creates and returns objective function suitable for ROOT minimizers.
+
+const RootObjectiveFunction*
+    RootObjectiveFunctionAdapter::rootChiSquaredFunction()
+{
+    if(!m_objective_callback)
+        throw std::runtime_error("RootObjectiveFunctionAdapter::rootChiSquaredFunction() -> Error. "
+                                 "Objective function is not set.");
+
+    if(m_nparameters <= 0)
+        throw std::runtime_error("RootObjectiveFunctionAdapter::rootChiSquaredFunction() -> Error. "
+                                 "Number of parameters must be >0");
+
+    root_objective_t rootfun =
+        [&] (const double* pars) {return evaluate(pars); };
+
+    m_root_objective_function.reset(new RootObjectiveFunction(rootfun, m_nparameters));
+
+    return m_root_objective_function.get();
+}
+
+//! Creates and returns gradient function suitable for ROOT minimizers.
+
+const RootGradientFunction *RootObjectiveFunctionAdapter::rootGradientFunction()
+{
+    if(!m_gradient_callback)
+        throw std::runtime_error("RootObjectiveFunctionAdapter::rootGradientFunction() -> Error. "
+                                 "Objective function is not set.");
+
+    if(m_nparameters <= 0)
+        throw std::runtime_error("RootObjectiveFunctionAdapter::rootGradientFunction() -> Error. "
+                                 "Number of parameters must be >0");
+
+    if(m_ndatasize <= 0)
+        throw std::runtime_error("RootObjectiveFunctionAdapter::rootGradientFunction() -> Error. "
+                                 "Number of data elements is not defined.");
+
+    root_gradient_t rootfun =
+        [&] (const double *pars, unsigned int index, double *gradients)
+        {   return evaluate_gradient(pars, index, gradients); };
+
+    m_root_gradient_function.reset(new RootGradientFunction(rootfun, m_nparameters,
+                                                                     m_ndatasize));
+
+    return m_root_gradient_function.get();
+}
+
+//! Transfers call of root's pointer based objective function to our callback
+
+double RootObjectiveFunctionAdapter::evaluate(const double *pars)
+{
+    std::vector<double> vec;
+    vec.resize(m_nparameters, 0.0);
+    std::copy(pars, pars+m_nparameters, vec.begin());
+    return m_objective_callback(vec);
+}
+
+//! Transfers call of root's pointer based gradient function to our callback
+
+double RootObjectiveFunctionAdapter::evaluate_gradient(const double *pars, unsigned int index,
+                                                       double *gradients)
+{
+    std::vector<double> vec;
+    vec.resize(m_nparameters, 0.0);
+    std::copy(pars, pars+m_nparameters, vec.begin());
+
+    std::vector<double> vec_gradients;
+
+    if(gradients)
+        vec_gradients.resize(m_nparameters);
+
+    double result = m_gradient_callback(vec, index, vec_gradients);
+
+    if(gradients)
+        for(int i=0; i<(int)m_nparameters; ++i) gradients[i] = vec_gradients[i];
+
+    return result;
+}
diff --git a/Fit/RootAdapter/RootObjectiveFuncAdapter.h b/Fit/RootAdapter/RootObjectiveFuncAdapter.h
new file mode 100644
index 0000000..46df246
--- /dev/null
+++ b/Fit/RootAdapter/RootObjectiveFuncAdapter.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/RootObjectiveFuncAdapter.h
+//! @brief     Declares class RootObjectiveFunctionAdapter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ROOTOBJECTIVEFUNCADAPTER_H
+#define ROOTOBJECTIVEFUNCADAPTER_H
+
+#include "WinDllMacros.h"
+#include "KernelTypes.h"
+#include <memory>
+#include <vector>
+
+class RootObjectiveFunction;
+class RootGradientFunction;
+
+//! @class RootObjectiveFunctionAdapter
+//! @ingroup fitting_internal
+//! @brief The RootObjectiveFunctionAdapter class adapts our objective functions to ROOT.
+
+class BA_CORE_API_ RootObjectiveFunctionAdapter
+{
+public:
+    RootObjectiveFunctionAdapter();
+
+    void setObjectiveCallback(objective_function_t func);
+    void setGradientCallback(gradient_function_t func, int ndatasize);
+
+    void setNumberOfParameters(int nparameters);
+
+    const RootObjectiveFunction *rootChiSquaredFunction();
+
+    const RootGradientFunction *rootGradientFunction();
+
+private:
+    double evaluate(const double *pars);
+    double evaluate_gradient(const double *pars, unsigned int index, double *gradients);
+
+    objective_function_t m_objective_callback;
+    gradient_function_t m_gradient_callback;
+
+    std::unique_ptr<RootObjectiveFunction> m_root_objective_function;
+    std::unique_ptr<RootGradientFunction> m_root_gradient_function;
+
+    int m_nparameters;
+    int m_ndatasize;
+};
+
+#endif // ROOTOBJECTIVEFUNCADAPTER_H
diff --git a/Fit/RootAdapter/SimAnMinimizer.cpp b/Fit/RootAdapter/SimAnMinimizer.cpp
new file mode 100644
index 0000000..e5dcfcb
--- /dev/null
+++ b/Fit/RootAdapter/SimAnMinimizer.cpp
@@ -0,0 +1,147 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/SimAnMinimizer.cpp
+//! @brief     Implements class SimAnMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SimAnMinimizer.h"
+#include "GSLMultiMinimizer.h"
+#include "MinimizerResultsHelper.h"
+#include "MinimizerConstants.h"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#include "Math/PatchedGSLSimAnMinimizer.h"
+#pragma GCC diagnostic pop
+
+SimAnMinimizer::SimAnMinimizer()
+    : RootMinimizerAdapter(MinimizerInfo::buildGSLSimAnInfo())
+    , m_siman_minimizer(new BA_ROOT::Math::GSLSimAnMinimizer())
+{
+    addOption(OptionNames::PrintLevel, 0, "Minimizer internal print level");
+    addOption(OptionNames::MaxIterations, 100, "Number of points to try for each step");
+    addOption(OptionNames::IterationTemp, 10, "Number of iterations at each temperature");
+    addOption(OptionNames::StepSize, 1.0, "Max step size used in random walk");
+    addOption(OptionNames::BoltzmannK, 1.0, "Boltzmann k");
+    addOption(OptionNames::BoltzmannInitT, 50.0, "Boltzmann initial temperature");
+    addOption(OptionNames::BoltzmannMu, 1.05, "Boltzmann mu");
+    addOption(OptionNames::BoltzmannTmin, 0.1, "Boltzmann minimal temperature");
+}
+
+SimAnMinimizer::~SimAnMinimizer()
+{
+
+}
+
+void SimAnMinimizer::setPrintLevel(int value)
+{
+    setOptionValue(OptionNames::PrintLevel, value);
+}
+
+int SimAnMinimizer::printLevel() const
+{
+    return optionValue<int>(OptionNames::PrintLevel);
+}
+
+void SimAnMinimizer::setMaxIterations(int value)
+{
+    setOptionValue(OptionNames::MaxIterations, value);
+}
+
+int SimAnMinimizer::maxIterations() const
+{
+    return optionValue<int>(OptionNames::MaxIterations);
+}
+
+void SimAnMinimizer::setIterationsAtEachTemp(int value)
+{
+    setOptionValue(OptionNames::IterationTemp, value);
+}
+
+int SimAnMinimizer::iterationsAtEachTemp() const
+{
+    return optionValue<int>(OptionNames::IterationTemp);
+}
+
+void SimAnMinimizer::setStepSize(double value)
+{
+    setOptionValue(OptionNames::StepSize, value);
+}
+
+double SimAnMinimizer::stepSize() const
+{
+    return optionValue<double>(OptionNames::StepSize);
+}
+
+void SimAnMinimizer::setBoltzmannK(double value)
+{
+    setOptionValue(OptionNames::BoltzmannK, value);
+}
+
+double SimAnMinimizer::boltzmannK() const
+{
+    return optionValue<double>(OptionNames::BoltzmannK);
+}
+
+void SimAnMinimizer::setBoltzmannInitialTemp(double value)
+{
+    setOptionValue(OptionNames::BoltzmannInitT, value);
+}
+
+double SimAnMinimizer::boltzmannInitialTemp() const
+{
+    return optionValue<double>(OptionNames::BoltzmannInitT);
+}
+
+void SimAnMinimizer::setBoltzmannMu(double value)
+{
+    setOptionValue(OptionNames::BoltzmannMu, value);
+}
+
+double SimAnMinimizer::boltzmannMu() const
+{
+    return optionValue<double>(OptionNames::BoltzmannMu);
+}
+
+void SimAnMinimizer::setBoltzmannMinTemp(double value)
+{
+    setOptionValue(OptionNames::BoltzmannTmin, value);
+}
+
+double SimAnMinimizer::boltzmannMinTemp() const
+{
+    return optionValue<double>(OptionNames::BoltzmannTmin);
+}
+
+std::map<std::string, std::string> SimAnMinimizer::statusMap() const
+{
+    auto result = RootMinimizerAdapter::statusMap();
+    result["functionCalls"] = std::to_string(rootMinimizer()->NCalls());
+    return result;
+}
+
+void SimAnMinimizer::propagateOptions()
+{
+    BA_ROOT::Math::GSLSimAnParams& pars = m_siman_minimizer->getSolver().Params();
+    pars.n_tries = maxIterations();
+    pars.iters_fixed_T = iterationsAtEachTemp();
+    pars.step_size = stepSize();
+    pars.k = boltzmannK();
+    pars.t_initial = boltzmannInitialTemp();
+    pars.mu = boltzmannMu();
+    pars.t_min = boltzmannMinTemp();
+}
+
+const RootMinimizerAdapter::root_minimizer_t *SimAnMinimizer::rootMinimizer() const
+{
+    return m_siman_minimizer.get();
+}
+
diff --git a/Fit/RootAdapter/SimAnMinimizer.h b/Fit/RootAdapter/SimAnMinimizer.h
new file mode 100644
index 0000000..e4afc90
--- /dev/null
+++ b/Fit/RootAdapter/SimAnMinimizer.h
@@ -0,0 +1,83 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/RootAdapter/SimAnMinimizer.h
+//! @brief     Declares class SimAnMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMANMINIMIZER_H
+#define SIMANMINIMIZER_H
+
+#include "RootMinimizerAdapter.h"
+
+namespace BA_ROOT { namespace Math { class GSLSimAnMinimizer; } }
+
+//! @class SimAnMinimizer
+//! @ingroup fitting_internal
+//! @brief Wrapper for ROOT GSL simmulated annealing minimizer
+
+class BA_CORE_API_ SimAnMinimizer : public RootMinimizerAdapter {
+public:
+    SimAnMinimizer();
+    ~SimAnMinimizer();
+
+    //! Sets minimizer internal print level.
+    //! Default value is 0 (silent).
+    void setPrintLevel(int value);
+    int printLevel() const;
+
+    //! Sets maximum number of iterations to try at each step.
+    //! Default values is 100.
+    void setMaxIterations(int value);
+    int maxIterations() const;
+
+    //! Sets number of iterations at each temperature.
+    //! Default value is 10.
+    void setIterationsAtEachTemp(int value);
+    int iterationsAtEachTemp() const;
+
+    //! Sets max step size used in random walk.
+    //! Default value is 1.0.
+    void setStepSize(double value);
+    double stepSize() const;
+
+    //! Sets Boltzmann distribution parameter: k.
+    //! Default value 1.0.
+    void setBoltzmannK(double value);
+    double boltzmannK() const;
+
+    //! Sets Boltzmann distribution parameter: initial temperature.
+    //! Default value 50.0.
+    void setBoltzmannInitialTemp(double value);
+    double boltzmannInitialTemp() const;
+
+    //! Sets Boltzmann distribution parameter: mu.
+    //! Default value 1.05.
+    void setBoltzmannMu(double value);
+    double boltzmannMu() const;
+
+    //! Sets Boltzmann distribution parameter: minimal temperature.
+    //! Default value 0.1.
+    void setBoltzmannMinTemp(double value);
+    double boltzmannMinTemp() const;
+
+    std::map<std::string, std::string> statusMap() const;
+    virtual bool isGradientBasedAgorithm() { return false; }
+
+protected:
+    void propagateOptions();
+    const root_minimizer_t* rootMinimizer() const;
+
+private:
+    std::unique_ptr<BA_ROOT::Math::GSLSimAnMinimizer> m_siman_minimizer;
+};
+
+#endif // SIMANMINIMIZER_H
diff --git a/Fit/Utils/Logger.cpp b/Fit/Utils/Logger.cpp
new file mode 100644
index 0000000..5a92f38
--- /dev/null
+++ b/Fit/Utils/Logger.cpp
@@ -0,0 +1,99 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Utils/Logger.cpp
+//! @brief     Implement Logger class.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "Logger.h"
+#include <stdexcept>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+std::vector<std::string> MSG::Logger::m_level_names =
+    {"VERBOSE", "DEBUG2", "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
+
+MSG::EMessageLevel MSG::Logger::m_logLevel = MSG::ERROR;
+
+namespace MSG
+{
+
+void SetLevel(EMessageLevel level)
+{
+    Logger::SetLevel(level);
+}
+
+void SetLevel(const std::string& levelname)
+{
+    Logger::SetLevel(levelname);
+}
+
+
+Logger::Logger(EMessageLevel level)
+{
+    //m_buffer << boost::this_thread::get_id();
+    m_buffer << "- " << NowTime();
+    m_buffer << " " << std::setw(8) << std::left << ToString(level) << ": ";
+}
+
+
+Logger::~Logger()
+{
+    m_buffer << std::endl;
+    std::cout << m_buffer.str();
+}
+
+const std::string& Logger::ToString(EMessageLevel level)
+{
+    return m_level_names[level];
+}
+
+void Logger::SetLevel(EMessageLevel level)
+{
+    m_logLevel = level;
+}
+
+EMessageLevel Logger::GetLevel()
+{
+    return m_logLevel;
+}
+
+std::string Logger::NowTime()
+{
+    //struct timeval tv;
+    //gettimeofday(&tv, 0);
+    //char buffer[100];
+    //tm r;
+    //strftime(buffer, sizeof(buffer), "%X", localtime_r(&tv.tv_sec, &r));
+    //char result[100];
+    //sprintf(result, "%s.%06ld", buffer, (long)tv.tv_usec);
+
+    std::ostringstream msg;
+    //const boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
+    boost::posix_time::time_facet*const f=new boost::posix_time::time_facet("%H-%M-%S");
+    msg.imbue(std::locale(msg.getloc(),f));
+    return msg.str();
+}
+
+void Logger::SetLevel(const std::string& levelname)
+{
+    int index(0);
+    for(auto it = m_level_names.begin(); it!=m_level_names.end(); ++it) {
+        if( (*it) == levelname ) {
+            SetLevel(EMessageLevel(index));
+            return;
+        }
+        ++index;
+    }
+    throw std::runtime_error(
+        "Logger::SetLevel() -> Error! There is no message level '"+levelname+"'");
+}
+
+}
diff --git a/Fit/Utils/Logger.h b/Fit/Utils/Logger.h
new file mode 100644
index 0000000..e9adaf9
--- /dev/null
+++ b/Fit/Utils/Logger.h
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Utils/Logger.h
+//! @brief     Defines MSG namespace and Logger class.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LOGGER_H
+#define LOGGER_H
+
+#include "WinDllMacros.h"
+#include <iomanip>
+#include <sstream>
+#include <vector>
+
+
+//! Sets of logging utilities
+namespace MSG
+{
+
+enum EMessageLevel { VERBOSE, DEBUG2, DEBUG, INFO, WARNING, ERROR, FATAL };
+
+//! @class Logger
+//! @ingroup tools_internal
+//! @brief Provides message service
+
+class BA_CORE_API_ Logger
+{
+public:
+    Logger(EMessageLevel level);
+
+    template <typename T>
+    Logger&  operator<<(T const&  value)
+    {
+        m_buffer << value;
+        return *this;
+    }
+
+    ~Logger();
+
+    std::string NowTime();
+    const std::string& ToString(EMessageLevel level);
+    static void SetLevel(EMessageLevel level);
+    static void SetLevel(const std::string& levelname);
+    static EMessageLevel GetLevel();
+
+private:
+    static EMessageLevel m_logLevel;
+    static std::vector<std::string > m_level_names;
+    std::ostringstream m_buffer;
+};
+
+//inline void SetLevel(MessageLevel level) { Logger::SetLevel(level); }
+//inline void SetLevel(const std::string& levelname) { Logger::SetLevel(levelname); }
+
+BA_CORE_API_ void SetLevel(EMessageLevel level);
+BA_CORE_API_ void SetLevel(const std::string& levelname);
+
+}
+
+#define msglog(level) \
+if (level < MSG::Logger::GetLevel()) ; \
+else MSG::Logger(level)
+
+
+
+#endif // LOGGER_H
+
+
diff --git a/Fit/Utils/StringUtils.cpp b/Fit/Utils/StringUtils.cpp
new file mode 100644
index 0000000..f562d4f
--- /dev/null
+++ b/Fit/Utils/StringUtils.cpp
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Utils/StringUtils.cpp
+//! @brief     Implements a few helper functions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "StringUtils.h"
+#include <boost/algorithm/string.hpp>
+#include <boost/regex.hpp>
+
+//! Returns true if text matches pattern with wildcards '*' and '?'.
+
+bool Utils::String::matchesPattern(const std::string& text, const std::string& wildcardPattern)
+{
+    bool caseSensitive(true);
+
+    // escape all regex special characters, except '?' and '*'
+    std::string mywildcardPattern = wildcardPattern;
+    boost::replace_all(mywildcardPattern, "\\", "\\\\");
+    boost::replace_all(mywildcardPattern, "^", "\\^");
+    boost::replace_all(mywildcardPattern, ".", "\\.");
+    boost::replace_all(mywildcardPattern, "$", "\\$");
+    boost::replace_all(mywildcardPattern, "|", "\\|");
+    boost::replace_all(mywildcardPattern, "(", "\\(");
+    boost::replace_all(mywildcardPattern, ")", "\\)");
+    boost::replace_all(mywildcardPattern, "[", "\\[");
+    boost::replace_all(mywildcardPattern, "]", "\\]");
+    boost::replace_all(mywildcardPattern, "+", "\\+");
+    boost::replace_all(mywildcardPattern, "/", "\\/");
+
+    // Convert chars '*?' to their regex equivalents
+    boost::replace_all(mywildcardPattern, "?", ".");
+    boost::replace_all(mywildcardPattern, "*", ".*");
+
+    // constructing regexp pattern
+    mywildcardPattern = "^" + mywildcardPattern + "$";
+    boost::regex pattern(mywildcardPattern,
+                         caseSensitive ? boost::regex::normal : boost::regex::icase);
+
+    // applaying match
+    return boost::regex_match(text, pattern);
+}
+
+//! Returns string right-padded with blanks.
+
+std::string Utils::String::padRight(const std::string& name, int length)
+{
+    std::string result = name;
+    result.resize(length,' ');
+    return result;
+}
+
+//! Returns token vector obtained by splitting string at delimiters.
+
+std::vector<std::string> Utils::String::split(const std::string& text, const std::string& delimiter)
+{
+    std::vector<std::string> tokens;
+    boost::split(tokens, text, boost::is_any_of(delimiter));
+    return tokens;
+}
+
+void Utils::String::replaceItemsFromString(
+    std::string& text, const std::vector<std::string>& items, const std::string& replacement)
+{
+    for(size_t i=0; i<items.size(); ++i)
+        boost::replace_all(text, items[i], replacement);
+}
+
+std::string Utils::String::join(const std::vector<std::string>& joinable, const std::string& joint)
+{
+    std::string result;
+    size_t n = joinable.size();
+    for(size_t i=0; i<n-1; ++i)
+        result += joinable[i] + joint;
+    result += joinable[n-1];
+    return result;
+}
+
+std::string Utils::String::removeSubstring(const std::string &text, const std::string &substr)
+{
+    std::string result = text;
+    for(std::string::size_type i=result.find(substr); i!=std::string::npos; i=result.find(substr))
+        result.erase(i, substr.length());
+    return result;
+}
diff --git a/Fit/Utils/StringUtils.h b/Fit/Utils/StringUtils.h
new file mode 100644
index 0000000..283b4b2
--- /dev/null
+++ b/Fit/Utils/StringUtils.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Utils/StringUtils.h
+//! @brief     Defines a few helper functions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STRINGUTILS_H
+#define STRINGUTILS_H
+
+#include "WinDllMacros.h"
+#include <string>
+#include <vector>
+
+namespace Utils {
+
+namespace String {
+
+//! Returns true if text matches pattern with wildcards '*' and '?'.
+BA_CORE_API_ bool matchesPattern(const std::string& text, const std::string& wildcardPattern);
+
+BA_CORE_API_ std::string padRight(const std::string& name, int length);
+
+//! Split string into vector of string using delimeter.
+BA_CORE_API_ std::vector<std::string> split(const std::string& text, const std::string& delimeter);
+
+//! replace all occurences of items from string text with delimeter
+BA_CORE_API_ void replaceItemsFromString(std::string& text, const std::vector<std::string>& items,
+                                         const std::string& replacement=std::string(""));
+
+//! Returns string obtain by joining vector elements
+BA_CORE_API_ std::string join(const std::vector<std::string>& joinable, const std::string& joint);
+
+//! Removes multiple occurences of given substring from a string and returns result.
+BA_CORE_API_ std::string removeSubstring(const std::string& text, const std::string& substr);
+}
+}
+
+#endif // STRINGUTILS_H
diff --git a/Fit/Utils/TimeInterval.cpp b/Fit/Utils/TimeInterval.cpp
new file mode 100644
index 0000000..ee9aadc
--- /dev/null
+++ b/Fit/Utils/TimeInterval.cpp
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Utils/TimeInterval.cpp
+//! @brief     Implements TimeInterval class.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "TimeInterval.h"
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+class TimeIntervalImp
+{
+public:
+    boost::posix_time::ptime m_start_time;
+    boost::posix_time::ptime m_end_time;
+    bool m_is_running;
+    TimeIntervalImp() : m_is_running(false){}
+};
+
+TimeInterval::TimeInterval()
+    : m_imp(new TimeIntervalImp)
+{
+
+}
+
+TimeInterval::~TimeInterval()
+{
+
+}
+
+void TimeInterval::start()
+{
+    m_imp->m_is_running = true;
+    m_imp->m_start_time = boost::posix_time::microsec_clock::local_time();
+}
+
+void TimeInterval::stop()
+{
+    m_imp->m_is_running = false;
+    m_imp->m_end_time = boost::posix_time::microsec_clock::local_time();
+}
+
+double TimeInterval::runTime() const
+{
+    boost::posix_time::time_duration diff ;
+    if(m_imp->m_is_running) {
+        diff = boost::posix_time::microsec_clock::local_time() - m_imp->m_start_time;
+    } else {
+        diff = m_imp->m_end_time - m_imp->m_start_time;
+    }
+    return diff.total_milliseconds()/1000.;
+}
diff --git a/Fit/Utils/TimeInterval.h b/Fit/Utils/TimeInterval.h
new file mode 100644
index 0000000..5d0406c
--- /dev/null
+++ b/Fit/Utils/TimeInterval.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Fit/Utils/TimeInterval.h
+//! @brief     Defines TimeInterval class.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TIMEINTERVAL_H
+#define TIMEINTERVAL_H
+
+#include "WinDllMacros.h"
+#include <memory>
+
+class TimeIntervalImp;
+
+class BA_CORE_API_ TimeInterval
+{
+public:
+    TimeInterval();
+    ~TimeInterval();
+
+    void start();
+    void stop();
+
+    //! returns run time in sec.msec
+    double runTime() const;
+
+private:
+    std::unique_ptr<TimeIntervalImp> m_imp;
+};
+
+#endif // TIMEINTERVAL_H
diff --git a/GUI/CMakeLists.txt b/GUI/CMakeLists.txt
new file mode 100644
index 0000000..0e32802
--- /dev/null
+++ b/GUI/CMakeLists.txt
@@ -0,0 +1,27 @@
+############################################################################
+# CMakeLists.txt file for building BornAgain/GUI libraries and executable
+############################################################################
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+
+message(STATUS "Configuring BornAgain GUI")
+
+add_subdirectory(coregui)
+
+if(BORNAGAIN_CRASHHANDLER)
+    add_definitions(-DBORNAGAIN_CRASHHANDLER)
+    add_subdirectory(crashhandler)
+endif()
+
+add_subdirectory(main)
+
+set(BornAgainGUI_INCLUDE_DIRS
+    ${BornAgainGUI_INCLUDE_DIRS}
+    PARENT_SCOPE)
+set(BornAgainGUI_LIBRARY
+    ${BornAgainGUI_LIBRARY}
+    PARENT_SCOPE)
diff --git a/GUI/coregui/CMakeLists.txt b/GUI/coregui/CMakeLists.txt
new file mode 100644
index 0000000..ae6a067
--- /dev/null
+++ b/GUI/coregui/CMakeLists.txt
@@ -0,0 +1,195 @@
+############################################################################
+# CMakeLists.txt file for building libBornAgainGUI library
+############################################################################
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+if(POLICY CMP0042)
+    cmake_policy(SET CMP0042 NEW)
+endif()
+if(POLICY CMP0028)
+    cmake_policy(SET CMP0028 NEW)
+endif()
+set(library_name BornAgainGUI)
+
+
+# --- source and include files ---
+set(include_dirs
+    ${CMAKE_CURRENT_SOURCE_DIR}/mainwindow
+    ${CMAKE_CURRENT_SOURCE_DIR}/utils
+    ${CMAKE_CURRENT_SOURCE_DIR}/Models
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/widgetbox
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/SampleDesigner
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/JobWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/IntensityDataWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/InfoWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/MaterialEditor
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/InstrumentWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/SimulationWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/FitWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/PropertyEditor
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/MaskWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/AccordionWidget
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/ImportDataWidgets
+    ${CMAKE_CURRENT_SOURCE_DIR}/Views/CommonWidgets
+)
+include_directories(${include_dirs})
+
+file(GLOB source_files
+    "mainwindow/*.cpp"
+    "utils/*.cpp"
+    "Models/*.cpp"
+    "Views/*.cpp"
+    "Views/SampleDesigner/*.cpp"
+    "Views/JobWidgets/*.cpp"
+    "Views/IntensityDataWidgets/*.cpp"
+    "Views/InfoWidgets/*.cpp"
+    "Views/MaterialEditor/*.cpp"
+    "Views/InstrumentWidgets/*.cpp"
+    "Views/SimulationWidgets/*.cpp"
+    "Views/FitWidgets/*.cpp"
+    "Views/PropertyEditor/*.cpp"
+    "Views/MaskWidgets/*.cpp"
+    "Views/AccordionWidget/*.cpp"
+    "Views/ImportDataWidgets/*.cpp"
+    "Views/CommonWidgets/*.cpp"
+)
+
+set(source_widgetbox
+    "Views/widgetbox/widgetboxcategorylistview.cpp"
+    "Views/widgetbox/widgetboxtreewidget.cpp"
+    "Views/widgetbox/widgetbox.cpp"
+    "Views/widgetbox/widgetbox_dnditem.cpp"
+)
+list(APPEND source_files ${source_widgetbox})
+
+file(GLOB include_files
+    "mainwindow/*.h"
+    "utils/*.h"
+    "Models/*.h"
+    "Views/*.h"
+    "Views/SampleDesigner/*.h"
+    "Views/JobWidgets/*.h"
+    "Views/IntensityDataWidgets/*.h"
+    "Views/InfoWidgets/*.h"
+    "Views/MaterialEditor/*.h"
+    "Views/InstrumentWidgets/*.h"
+    "Views/SimulationWidgets/*.h"
+    "Views/FitWidgets/*.h"
+    "Views/PropertyEditor/*.h"
+    "Views/MaskWidgets/*.h"
+    "Views/AccordionWidget/*.h"
+    "Views/ImportDataWidgets/*.h"
+    "Views/CommonWidgets/*.h"
+)
+
+set(include_widgetbox
+    "Views/widgetbox/widgetboxcategorylistview.h"
+    "Views/widgetbox/widgetboxtreewidget.h"
+    "Views/widgetbox/widgetbox.h"
+    "Views/widgetbox/widgetbox_dnditem.h"
+    "Views/widgetbox/widgetbox_global.h"
+)
+list(APPEND include_files ${include_widgetbox})
+
+set(resource_files
+    "coregui.qrc"
+    "Views/SampleDesigner/SampleDesigner.qrc"
+    "Views/MaskWidgets/MaskWidgets.qrc"
+    "Views/widgetbox/widgetbox.qrc"
+    "Views/AccordionWidget/accordionwidgeticons.qrc"
+)
+
+
+# --- Qt configuration ---------
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+qt5_add_resources(RC_SRCS ${resource_files})
+
+# --- definitions ------
+if(BORNAGAIN_CRASHHANDLER)
+    add_definitions(-DBORNAGAIN_CRASHHANDLER)
+endif()
+
+if(BORNAGAIN_TIFF_SUPPORT)
+    add_definitions(-DBORNAGAIN_TIFF_SUPPORT)
+endif()
+
+if(WIN32)
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBA_CORE_BUILD_DLL")
+endif()
+
+
+# --- making library ---------
+
+add_library(
+    ${library_name}
+    SHARED
+    ${source_files} ${RC_SRCS} ${include_files}
+)
+set_Target_properties(${library_name} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
+set(${library_name}_LIBRARY_TYPE SHARED)
+# exposing library name and list of include directories outside
+set(${library_name}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+
+
+# --- dependencies ---------
+include_directories(
+    ${QtAddOn_INCLUDE_DIRS}
+    ${Boost_INCLUDE_DIRS}
+    ${GSL_INCLUDE_DIR}
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${BornAgainFit_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${PYTHON_INCLUDE_DIRS}
+)
+
+target_link_libraries(${library_name}
+    ${QtAddOn_LIBRARIES}
+    ${PYTHON_LIBRARIES}
+    ${Boost_LIBRARIES}
+    ${BornAgainFit_LIBRARY}
+    ${BornAgainCore_LIBRARY}
+)
+
+target_link_libraries(${library_name}
+    Qt5::Widgets
+    Qt5::Core
+    Qt5::Gui
+    Qt5::Designer
+    Qt5::PrintSupport
+    Qt5::Network
+)
+
+
+# --- Installation ---------
+install (TARGETS ${library_name} DESTINATION ${destination_lib} COMPONENT Libraries)
+
+if(WIN32)
+    # --- Qt ---
+    STRING(REGEX REPLACE "\\\\" "/" QTDIR $ENV{QTDIR} ) # Convert C:\Qt\ to C:/Qt/
+    install(FILES
+    ${QTDIR}/bin/Qt5Widgets.DLL
+    ${QTDIR}/bin/Qt5Core.dll
+    ${QTDIR}/bin/Qt5Gui.dll
+    ${QTDIR}/bin/Qt5Designer.dll
+    ${QTDIR}/bin/Qt5Xml.dll
+    ${QTDIR}/bin/Qt5Svg.dll
+    ${QTDIR}/bin/Qt5Network.dll
+    ${QTDIR}/bin/Qt5PrintSupport.dll
+    DESTINATION ${destination_lib} COMPONENT Libraries)
+
+    install(FILES
+    ${QTDIR}/plugins/platforms/qwindows.dll
+    DESTINATION bin/platforms COMPONENT Libraries)
+
+    install(FILES
+    ${QTDIR}/plugins/iconengines/qsvgicon.dll
+    DESTINATION bin/iconengines COMPONENT Libraries)
+
+endif()
diff --git a/GUI/coregui/Models/AngleProperty.cpp b/GUI/coregui/Models/AngleProperty.cpp
new file mode 100644
index 0000000..0e9c1a1
--- /dev/null
+++ b/GUI/coregui/Models/AngleProperty.cpp
@@ -0,0 +1,148 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/AngleProperty.cpp
+//! @brief     Implements class AngleProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "AngleProperty.h"
+#include "GUIHelpers.h"
+#include "Units.h"
+#include "item_constants.h"
+
+QStringList AngleProperty::m_labels = QStringList()
+        << Constants::UnitsDegrees << Constants::UnitsRadians;
+
+//AngleProperty::AngleProperty(double angle_value, AngleUnits angle_units)
+//    : m_angle_in_radians(0)
+//    , m_angle_units(angle_units)
+//{
+//    if(m_angle_units == AngleProperty::Radians) {
+//        m_angle_in_radians = angle_value;
+//    }
+//    else {
+//        m_angle_in_radians = Units::deg2rad(angle_value);
+//    }
+//}
+
+
+AngleProperty::AngleProperty(double angle_value, const QString &angle_units)
+    : m_angle_in_radians(0)
+    , m_angle_units(angle_units)
+{
+    if(m_angle_units == Constants::UnitsRadians) {
+        m_angle_in_radians = angle_value;
+    }
+    else if(m_angle_units == Constants::UnitsDegrees){
+        m_angle_in_radians = Units::deg2rad(angle_value);
+    }
+    else {
+        throw GUIHelpers::Error("AngleProperty::AngleProperty() -> Error. Unknown units");
+    }
+}
+
+
+QString AngleProperty::getUnits() const
+{
+//    return m_labels[m_angle_units];
+    return m_angle_units;
+}
+
+void AngleProperty::setUnits(const QString &units)
+{
+    if(!m_labels.contains(units))
+        throw GUIHelpers::Error("AngleProperty::setUnitsString() -> Error. Unknown units");
+
+    m_angle_units = units;
+//    if(units == Constants::UnitsDegrees) {
+//        m_angle_units = Degrees;
+//    }
+//    else {
+//        m_angle_units = Radians;
+//    }
+}
+
+
+bool AngleProperty::inRadians() const
+{
+    return m_angle_units == Constants::UnitsRadians;
+}
+
+
+void AngleProperty::setInRadians()
+{
+    m_angle_units = Constants::UnitsRadians;
+}
+
+
+bool AngleProperty::inDegrees() const
+{
+    return m_angle_units == Constants::UnitsDegrees;
+}
+
+
+void AngleProperty::setInDegrees()
+{
+    m_angle_units = Constants::UnitsDegrees;
+}
+
+
+double AngleProperty::getValue() const
+{
+    return m_angle_units == Constants::UnitsRadians ?
+        m_angle_in_radians : Units::rad2deg(m_angle_in_radians);
+}
+
+
+void AngleProperty::setValue(double value)
+{
+    if(m_angle_units == Constants::UnitsRadians)
+        m_angle_in_radians = value;
+    else
+        m_angle_in_radians = Units::deg2rad(value);
+}
+
+
+double AngleProperty::getValueInRadians() const
+{
+    return m_angle_in_radians;
+}
+
+
+QStringList AngleProperty::getLabels() const
+{
+    return m_labels;
+}
+
+QVariant AngleProperty::Degrees(double value)
+{
+    AngleProperty angle(value, Constants::UnitsDegrees);
+    QVariant result;
+    result.setValue(angle);
+    return result;
+}
+
+QVariant AngleProperty::Radians(double value)
+{
+    AngleProperty angle(value, Constants::UnitsRadians);
+    QVariant result;
+    result.setValue(angle);
+    return result;
+}
+
+
+QVariant AngleProperty::getVariant() const
+{
+    QVariant result;
+    result.setValue(*this);
+    return result;
+}
diff --git a/GUI/coregui/Models/AngleProperty.h b/GUI/coregui/Models/AngleProperty.h
new file mode 100644
index 0000000..d961a8d
--- /dev/null
+++ b/GUI/coregui/Models/AngleProperty.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/AngleProperty.h
+//! @brief     Defines class AngleProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ANGLEPROPERTY_H
+#define ANGLEPROPERTY_H
+
+#include "WinDllMacros.h"
+#include <QStringList>
+#include <QVariant>
+
+//! The AngleProperty keeps angle value together with units (radians, degrees)
+//! in which the angle should be presented to the user.
+class BA_CORE_API_ AngleProperty
+{
+public:
+    AngleProperty(double angle_value = 0.0, const QString &angle_units = QString());
+    ~AngleProperty(){}
+
+    QString getUnits() const;
+    void setUnits(const QString &units);
+
+    bool inRadians() const;
+
+    void setInRadians();
+
+    bool inDegrees() const;
+
+    void setInDegrees();
+
+    double getValue() const;
+
+    void setValue(double value);
+
+    double getValueInRadians() const;
+
+    QStringList getLabels() const;
+
+    static QVariant Degrees(double value = 0.0);
+    static QVariant Radians(double value = 0.0);
+
+    QVariant getVariant() const;
+
+private:
+    double m_angle_in_radians;
+    QString m_angle_units;
+    static QStringList m_labels;
+};
+
+Q_DECLARE_METATYPE(AngleProperty)
+
+#endif // ANGLEPROPERTY_H
diff --git a/GUI/coregui/Models/ApplicationModels.cpp b/GUI/coregui/Models/ApplicationModels.cpp
new file mode 100644
index 0000000..7505a32
--- /dev/null
+++ b/GUI/coregui/Models/ApplicationModels.cpp
@@ -0,0 +1,321 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ApplicationModels.cpp
+//! @brief     Defines class holding all application models
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ApplicationModels.h"
+#include "DocumentModel.h"
+#include "GISASSimulation.h"
+#include "GUIObjectBuilder.h"
+#include "ISample.h"
+#include "IconProvider.h"
+#include "InstrumentModel.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "MaterialModel.h"
+#include "MaterialSvc.h"
+#include "MultiLayer.h"
+#include "RealDataModel.h"
+#include "SampleBuilderFactory.h"
+#include "SampleModel.h"
+#include "WarningMessageService.h"
+#include "RealDataItem.h"
+#include "IntensityDataIOFactory.h"
+#include "IntensityDataItem.h"
+#include "ImportDataAssistant.h"
+#include "StandardSimulations.h"
+
+ApplicationModels::ApplicationModels(QObject *parent)
+    : QObject(parent)
+    , m_documentModel(0)
+    , m_materialModel(0)
+    , m_materialSvc(0)
+    , m_instrumentModel(0)
+    , m_sampleModel(0)
+    , m_realDataModel(0)
+    , m_jobModel(0)
+{
+    createModels();
+//    createTestSample();
+//    createTestJob();
+
+//    SessionItem *multilayer = m_sampleModel->insertNewItem(Constants::MultiLayerType);
+//    SessionItem *layer = m_sampleModel->insertNewItem(Constants::LayerType, multilayer->index());
+
+//    SampleModel * mmm = m_sampleModel->createCopy();
+
+}
+
+ApplicationModels::~ApplicationModels()
+{
+    delete m_materialSvc;
+}
+
+DocumentModel *ApplicationModels::documentModel()
+{
+    return m_documentModel;
+}
+
+MaterialModel *ApplicationModels::materialModel()
+{
+    return m_materialModel;
+}
+
+InstrumentModel *ApplicationModels::instrumentModel()
+{
+    return m_instrumentModel;
+}
+
+SampleModel *ApplicationModels::sampleModel()
+{
+    return m_sampleModel;
+}
+
+RealDataModel *ApplicationModels::realDataModel()
+{
+    return m_realDataModel;
+}
+
+JobModel *ApplicationModels::jobModel()
+{
+    return m_jobModel;
+}
+
+ObsoleteFitModel *ApplicationModels::fitModel()
+{
+    return 0;
+}
+
+//! reset all models to initial state
+void ApplicationModels::resetModels()
+{
+    m_documentModel->clear();
+    m_documentModel->insertNewItem(Constants::SimulationOptionsType);
+
+    m_materialModel->clear();
+    m_materialModel->addMaterial("Default", 1e-3, 1e-5);
+    m_materialModel->addMaterial("Air", 0.0, 0.0);
+    m_materialModel->addMaterial("Particle", 6e-4, 2e-8);
+    m_materialModel->addMaterial("Substrate", 6e-6, 2e-8);
+
+    m_sampleModel->clear();
+
+    m_realDataModel->clear();
+
+    m_jobModel->clear();
+
+    m_instrumentModel->clear();
+    SessionItem *instrument = m_instrumentModel->insertNewItem(Constants::InstrumentType);
+    instrument->setItemName("Default GISAS");
+    m_instrumentModel->insertNewItem(Constants::DetectorType, m_instrumentModel->indexOfItem(instrument));
+    m_instrumentModel->insertNewItem(Constants::BeamType, m_instrumentModel->indexOfItem(instrument));
+
+//    m_realDataModel->insertNewItem(Constants::RealDataType);
+//    m_realDataModel->insertNewItem(Constants::RealDataType);
+//    m_realDataModel->insertNewItem(Constants::RealDataType);
+
+}
+
+//! creates and initializes models, order is important
+void ApplicationModels::createModels()
+{
+    createDocumentModel();
+
+    createMaterialModel();
+
+    createSampleModel();
+
+    createInstrumentModel();
+
+    createRealDataModel();
+
+    createJobModel();
+
+    resetModels();
+}
+
+void ApplicationModels::createDocumentModel()
+{
+    delete m_documentModel;
+    m_documentModel = new DocumentModel(this);
+    connectModel(m_documentModel);
+}
+
+void ApplicationModels::createMaterialModel()
+{
+    delete m_materialModel;
+    m_materialModel = new MaterialModel(this);
+    connectModel(m_materialModel);
+    m_materialSvc = new MaterialSvc(m_materialModel);
+}
+
+void ApplicationModels::createSampleModel()
+{
+    Q_ASSERT(m_materialModel);
+    delete m_sampleModel;
+    m_sampleModel = new SampleModel(this);
+    connectModel(m_sampleModel);
+    connect(m_materialModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+            m_sampleModel, SLOT(onMaterialModelChanged(QModelIndex,QModelIndex)));
+}
+
+void ApplicationModels::createInstrumentModel()
+{
+    delete m_instrumentModel;
+    m_instrumentModel = new InstrumentModel(this);
+    connectModel(m_instrumentModel);
+    m_instrumentModel->setIconProvider(new IconProvider());
+}
+
+void ApplicationModels::createRealDataModel()
+{
+    delete m_realDataModel;
+    m_realDataModel = new RealDataModel(this);
+    connectModel(m_realDataModel);
+}
+
+void ApplicationModels::createJobModel()
+{
+    delete m_jobModel;
+    m_jobModel = new JobModel(this);
+    connectModel(m_jobModel);
+}
+
+void ApplicationModels::createTestSample()
+{
+    SampleBuilderFactory factory;
+    const std::unique_ptr<ISample> P_sample(factory.createSample("CylindersAndPrismsBuilder"));
+
+    GUIObjectBuilder guiBuilder;
+    guiBuilder.populateSampleModel(m_sampleModel, *P_sample);
+
+// to populate sample with predefined instrument
+//    const std::unique_ptr<GISASSimulation> simulation(StandardSimulations::GISASWithMasks());
+//    guiBuilder.populateInstrumentModel(m_instrumentModel, *simulation);
+}
+
+void ApplicationModels::createTestJob()
+{
+    SimulationOptionsItem *optionsItem = m_documentModel->getSimulationOptionsItem();
+//    optionsItem->setRunPolicy(Constants::JOB_RUN_IN_BACKGROUND);
+
+    JobItem *jobItem = m_jobModel->addJob(
+                m_sampleModel->multiLayerItem(),
+                m_instrumentModel->instrumentItem(),
+                0,
+                optionsItem);
+
+//    IHistogram *data = IntensityDataIOFactory::readIntensityData("/home/pospelov/development/BornAgain/temp/Untitled12/data_job1_0.int");
+
+//    RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(jobItem->getItem(JobItem::T_REALDATA));
+//    Q_ASSERT(realDataItem);
+
+//    realDataItem->intensityDataItem()->setOutputData(data->createOutputData());
+//    jobItem->setItemValue(JobItem::P_WITH_FITTING, true);
+
+    m_jobModel->runJob(jobItem->index());
+}
+
+void ApplicationModels::createTestRealData()
+{
+    RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(
+                m_realDataModel->insertNewItem(Constants::RealDataType));
+    realDataItem->setItemName("realdata");
+
+    std::unique_ptr<OutputData<double>> data(
+                IntensityDataIOFactory::readOutputData("/home/pospelov/untitled2.int"));
+
+    ImportDataAssistant assistant;
+    OutputData<double> *simplified = assistant.createSimlifiedOutputData(*data.get());
+    realDataItem->setOutputData(simplified);
+}
+
+//! Writes all model in file one by one
+
+void ApplicationModels::writeTo(QXmlStreamWriter *writer)
+{
+    foreach(SessionModel *model, modelList()) {
+        model->writeTo(writer);
+    }
+}
+
+void ApplicationModels::readFrom(QXmlStreamReader *reader, WarningMessageService *messageService)
+{
+    foreach(SessionModel *model, modelList()) {
+        if(model->getModelTag() == reader->name()) {
+            model->readFrom(reader, messageService);
+            if(messageService->hasWarnings(model)) {
+                messageService->send_message(this, "MODEL_READ_WARNING", model->getModelTag());
+            }
+            break;
+        }
+    }
+
+}
+
+//! Returns the list of all GUI models
+
+QList<SessionModel *> ApplicationModels::modelList()
+{
+    QList<SessionModel *> result;
+    result.append(m_documentModel);
+    result.append(m_materialModel);
+    result.append(m_instrumentModel);
+    result.append(m_sampleModel);
+    result.append(m_realDataModel);
+    result.append(m_jobModel);
+    return result;
+}
+
+//! Loads model's non-XML data  from the projectDir
+
+void ApplicationModels::loadNonXMLData(const QString &projectDir)
+{
+    foreach(SessionModel *model, modelList()) {
+        model->loadNonXMLData(projectDir);
+    }
+}
+
+//! Saves model's non-XML data  to the projectDir
+
+void ApplicationModels::saveNonXMLData(const QString &projectDir)
+{
+    foreach(SessionModel *model, modelList()) {
+        model->saveNonXMLData(projectDir);
+    }
+}
+
+void ApplicationModels::disconnectModel(SessionModel *model)
+{
+    if(model) {
+        disconnect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,
+                   SIGNAL(modelChanged()));
+        disconnect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
+                   SIGNAL(modelChanged()));
+        disconnect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this,
+                   SIGNAL(modelChanged()));
+    }
+}
+
+void ApplicationModels::connectModel(SessionModel *model)
+{
+    if(model) {
+        connect(model, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this,
+                   SIGNAL(modelChanged()), Qt::UniqueConnection);
+        connect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
+                   SIGNAL(modelChanged()), Qt::UniqueConnection);
+        connect(model, SIGNAL(rowsInserted(QModelIndex, int,int)), this,
+                   SIGNAL(modelChanged()), Qt::UniqueConnection);
+    }
+}
diff --git a/GUI/coregui/Models/ApplicationModels.h b/GUI/coregui/Models/ApplicationModels.h
new file mode 100644
index 0000000..26c1635
--- /dev/null
+++ b/GUI/coregui/Models/ApplicationModels.h
@@ -0,0 +1,86 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ApplicationModels.h
+//! @brief     Defines class holding all application models
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef APPLICATIONMODELS_H
+#define APPLICATIONMODELS_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class SessionModel;
+class DocumentModel;
+class MaterialModel;
+class MaterialSvc;
+class InstrumentModel;
+class RealDataModel;
+class SampleModel;
+class JobModel;
+class ObsoleteFitModel;
+
+class BA_CORE_API_ ApplicationModels : public QObject
+{
+    Q_OBJECT
+public:
+    ApplicationModels(QObject *parent);
+    ~ApplicationModels();
+
+    DocumentModel *documentModel();
+    MaterialModel *materialModel();
+    InstrumentModel *instrumentModel();
+    SampleModel *sampleModel();
+    RealDataModel *realDataModel();
+    JobModel *jobModel();
+    ObsoleteFitModel *fitModel();
+
+    void resetModels();
+
+    void createTestSample();
+    void createTestJob();
+    void createTestRealData();
+
+    void writeTo(class QXmlStreamWriter *writer);
+    void readFrom(class QXmlStreamReader *reader, class WarningMessageService *messageService);
+
+    QList<SessionModel *> modelList();
+
+    void loadNonXMLData(const QString &projectDir);
+    void saveNonXMLData(const QString &projectDir);
+
+signals:
+    void modelChanged();
+
+private:
+    void createModels();
+    void createDocumentModel();
+    void createMaterialModel();
+    void createInstrumentModel();
+    void createSampleModel();
+    void createRealDataModel();
+    void createJobModel();
+
+    void disconnectModel(SessionModel *model);
+    void connectModel(SessionModel *model);
+
+    DocumentModel *m_documentModel;
+    MaterialModel *m_materialModel;
+    MaterialSvc *m_materialSvc;
+    InstrumentModel *m_instrumentModel;
+    SampleModel *m_sampleModel;
+    RealDataModel *m_realDataModel;
+    JobModel *m_jobModel;
+};
+
+#endif // APPLICATIONMODELS_H
diff --git a/GUI/coregui/Models/AxesItems.cpp b/GUI/coregui/Models/AxesItems.cpp
new file mode 100644
index 0000000..591d905
--- /dev/null
+++ b/GUI/coregui/Models/AxesItems.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/AxesItems.cpp
+//! @brief     Implements various axis items
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "AxesItems.h"
+
+const QString BasicAxisItem::P_IS_VISIBLE = "Visibility";
+const QString BasicAxisItem::P_NBINS = "Nbins";
+const QString BasicAxisItem::P_MIN = "Min";
+const QString BasicAxisItem::P_MAX = "Max";
+const QString BasicAxisItem::P_TITLE = "title";
+//const QString BasicAxisItem::P_TITLE_IS_VISIBLE = "Title Visibility";
+
+static const int max_detector_pixels = 65536;
+
+BasicAxisItem::BasicAxisItem(const QString &type)
+    : SessionItem(type)
+{
+    register_basic_properties();
+}
+
+//bool BasicAxisItem::isAxisLabelVisible() const
+//{
+//    return getItemValue(BasicAxisItem::P_TITLE_IS_VISIBLE).toBool();
+//}
+
+void BasicAxisItem::register_basic_properties()
+{
+    addProperty(P_IS_VISIBLE, true)->setVisible(false);
+    addProperty(P_NBINS, 100)->setLimits(RealLimits::limited(1, max_detector_pixels));
+    addProperty(P_MIN, 0.0)->setDecimals(3);
+    getItem(P_MIN)->setLimits(RealLimits::limitless());
+    addProperty(P_MAX, -1.0)->setDecimals(3);
+    getItem(P_MAX)->setLimits(RealLimits::limitless());
+    addProperty(P_TITLE, QString());
+}
+
+// ---------------------------------------------------------------------------------------------- //
+
+const QString AmplitudeAxisItem::P_IS_LOGSCALE = "log10";
+const QString AmplitudeAxisItem::P_LOCK_MIN_MAX = "Lock (min, max)";
+
+AmplitudeAxisItem::AmplitudeAxisItem()
+    : BasicAxisItem(Constants::AmplitudeAxisType)
+{
+    addProperty(P_LOCK_MIN_MAX, false)->setVisible(false);
+    addProperty(P_IS_LOGSCALE, true);
+    getItem(BasicAxisItem::P_TITLE)->setVisible(false);
+    getItem(BasicAxisItem::P_IS_VISIBLE)->setVisible(true);
+}
diff --git a/GUI/coregui/Models/AxesItems.h b/GUI/coregui/Models/AxesItems.h
new file mode 100644
index 0000000..384a495
--- /dev/null
+++ b/GUI/coregui/Models/AxesItems.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/AxesItems.h
+//! @brief     Defines various axis items
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef AXESITEMS_H
+#define AXESITEMS_H
+
+#include "SessionItem.h"
+
+class BA_CORE_API_  BasicAxisItem : public SessionItem
+{
+public:
+    static const QString P_IS_VISIBLE;
+    static const QString P_NBINS;
+    static const QString P_MIN;
+    static const QString P_MAX;
+    static const QString P_TITLE;
+//    static const QString P_TITLE_IS_VISIBLE;
+    explicit BasicAxisItem(const QString &type=Constants::BasicAxisType);
+
+//    bool isAxisLabelVisible() const;
+
+    virtual ~BasicAxisItem(){}
+protected:
+    void register_basic_properties();
+};
+
+class BA_CORE_API_  AmplitudeAxisItem : public BasicAxisItem
+{
+public:
+    static const QString P_IS_LOGSCALE;
+    static const QString P_LOCK_MIN_MAX;
+    explicit AmplitudeAxisItem();
+    virtual ~AmplitudeAxisItem(){}
+};
+
+#endif // AXESITEMS_H
diff --git a/GUI/coregui/Models/BeamAngleItems.cpp b/GUI/coregui/Models/BeamAngleItems.cpp
new file mode 100644
index 0000000..e855be7
--- /dev/null
+++ b/GUI/coregui/Models/BeamAngleItems.cpp
@@ -0,0 +1,109 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamAngleItems.cpp
+//! @brief     Implements class BeamAngleItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "BeamAngleItems.h"
+#include "Distributions.h"
+#include "GUIHelpers.h"
+#include "Units.h"
+
+BeamInclinationAngleItem::BeamInclinationAngleItem()
+    : BeamDistributionItem(Constants::BeamInclinationAngleType)
+{
+
+    SessionItem *distribution = dynamic_cast<DistributionNoneItem *>(getGroupItem(P_DISTRIBUTION));
+    Q_ASSERT(distribution);
+    auto value = distribution->getItem(DistributionNoneItem::P_VALUE);
+    value->setLimits(RealLimits::limited(0.0, 90.0));
+    value->setDecimals(3);
+    value->setValue(0.2);
+}
+
+std::unique_ptr<IDistribution1D> BeamInclinationAngleItem::createDistribution1D()
+{
+    std::unique_ptr<IDistribution1D> P_distribution {};
+    if(DistributionItem *distributionItem = dynamic_cast<DistributionItem *>(getGroupItem(P_DISTRIBUTION))) {
+        P_distribution = BeamAngleHelper::creatAngleDistribution(distributionItem);
+    }
+    return P_distribution;
+}
+
+// -------------------------------------------------------------------------- //
+
+BeamAzimuthalAngleItem::BeamAzimuthalAngleItem()
+    : BeamDistributionItem(Constants::BeamAzimuthalAngleType)
+{
+    SessionItem *distribution = dynamic_cast<DistributionNoneItem *>(getGroupItem(P_DISTRIBUTION));
+    Q_ASSERT(distribution);
+    auto value = distribution->getItem(DistributionNoneItem::P_VALUE);
+    value->setLimits(RealLimits::limited(-90.0, 90.0));
+    value->setDecimals(3);
+    value->setValue(0.0);
+}
+
+std::unique_ptr<IDistribution1D> BeamAzimuthalAngleItem::createDistribution1D()
+{
+    std::unique_ptr<IDistribution1D> P_distribution {};
+    if(DistributionItem *distributionItem = dynamic_cast<DistributionItem *>(getGroupItem(P_DISTRIBUTION))) {
+        P_distribution = BeamAngleHelper::creatAngleDistribution(distributionItem);
+    }
+    return P_distribution;
+}
+
+// -------------------------------------------------------------------------- //
+
+std::unique_ptr<IDistribution1D>
+BeamAngleHelper::creatAngleDistribution(DistributionItem *distributionItem)
+{
+
+    std::unique_ptr<IDistribution1D> P_distribution {};
+    if (distributionItem->modelType() == Constants::DistributionGateType) {
+        double min
+            = distributionItem->getItemValue(DistributionGateItem::P_MIN).toDouble();
+        double max
+            = distributionItem->getItemValue(DistributionGateItem::P_MAX).toDouble();
+        P_distribution = GUIHelpers::make_unique<DistributionGate>(
+                    Units::deg2rad(min), Units::deg2rad(max));
+    } else if (distributionItem->modelType() == Constants::DistributionLorentzType) {
+        double mean
+            = distributionItem->getItemValue(DistributionLorentzItem::P_MEAN).toDouble();
+        double hwhm
+            = distributionItem->getItemValue(DistributionLorentzItem::P_HWHM).toDouble();
+        P_distribution = GUIHelpers::make_unique<DistributionLorentz>(
+                    Units::deg2rad(mean), Units::deg2rad(hwhm));
+    } else if (distributionItem->modelType() == Constants::DistributionGaussianType) {
+        double mean
+            = distributionItem->getItemValue(DistributionGaussianItem::P_MEAN).toDouble();
+        double std_dev = distributionItem->getItemValue(
+                                               DistributionGaussianItem::P_STD_DEV).toDouble();
+        P_distribution = GUIHelpers::make_unique<DistributionGaussian>(
+                    Units::deg2rad(mean), Units::deg2rad(std_dev));
+    } else if (distributionItem->modelType() == Constants::DistributionLogNormalType) {
+        double median = distributionItem->getItemValue(DistributionLogNormalItem::P_MEDIAN)
+                            .toDouble();
+        double scale_par = distributionItem->getItemValue(
+                                                 DistributionLogNormalItem::P_SCALE_PAR).toDouble();
+        P_distribution = GUIHelpers::make_unique<DistributionLogNormal>(
+                    Units::deg2rad(median), scale_par);
+    } else if (distributionItem->modelType() == Constants::DistributionCosineType) {
+        double mean
+            = distributionItem->getItemValue(DistributionCosineItem::P_MEAN).toDouble();
+        double sigma
+            = distributionItem->getItemValue(DistributionCosineItem::P_SIGMA).toDouble();
+        P_distribution = GUIHelpers::make_unique<DistributionCosine>(
+                    Units::deg2rad(mean), Units::deg2rad(sigma));
+    }
+    return P_distribution;
+}
diff --git a/GUI/coregui/Models/BeamAngleItems.h b/GUI/coregui/Models/BeamAngleItems.h
new file mode 100644
index 0000000..21f69db
--- /dev/null
+++ b/GUI/coregui/Models/BeamAngleItems.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamAngleItems.h
+//! @brief     Defines class BeamAngleItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BEAMANGLEITEMS_H
+#define BEAMANGLEITEMS_H
+
+#include "BeamDistributionItem.h"
+
+class BA_CORE_API_ BeamAzimuthalAngleItem : public BeamDistributionItem
+{
+public:
+    explicit BeamAzimuthalAngleItem();
+    virtual ~BeamAzimuthalAngleItem(){}
+protected:
+    virtual std::unique_ptr<IDistribution1D> createDistribution1D();
+};
+
+class BA_CORE_API_ BeamInclinationAngleItem : public BeamDistributionItem
+{
+public:
+    explicit BeamInclinationAngleItem();
+    virtual ~BeamInclinationAngleItem(){}
+    virtual std::unique_ptr<IDistribution1D> createDistribution1D();
+};
+
+class BA_CORE_API_ BeamAngleHelper
+{
+public:
+    static std::unique_ptr<IDistribution1D> creatAngleDistribution(
+            DistributionItem *distributionItem);
+};
+
+
+#endif // BEAMANGLEITEMS_H
diff --git a/GUI/coregui/Models/BeamDistributionItem.cpp b/GUI/coregui/Models/BeamDistributionItem.cpp
new file mode 100644
index 0000000..40b38b9
--- /dev/null
+++ b/GUI/coregui/Models/BeamDistributionItem.cpp
@@ -0,0 +1,123 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamDistributionItem.cpp
+//! @brief     Implements class BeamDistributionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "BeamDistributionItem.h"
+#include "Distributions.h"
+#include "GUIHelpers.h"
+#include "GroupItem.h"
+#include "ParameterDistribution.h"
+#include "Units.h"
+#include <QDebug>
+
+const QString BeamDistributionItem::P_DISTRIBUTION = "Distribution";
+
+BeamDistributionItem::BeamDistributionItem(const QString name)
+    : SessionItem(name)
+{
+    addGroupProperty(P_DISTRIBUTION, Constants::DistributionExtendedGroup);
+    setGroupProperty(P_DISTRIBUTION, Constants::DistributionNoneType);
+
+
+    mapper()->setOnChildPropertyChange(
+                [this](SessionItem* item, const QString &name)
+    {
+        qDebug() << "AAAAA" << item->modelType() << name;
+        if(item->modelType() == Constants::GroupItemType) {
+            initDistributionItem();
+        }
+//        if (item->modelType() == Constants::IntensityDataType
+//            && name == IntensityDataItem::P_AXES_UNITS) {
+//            auto intensityItem = dynamic_cast<IntensityDataItem *>(item);
+//            JobItemHelper::updateDataAxes(intensityItem, getInstrumentItem());
+//            qDebug() << "QQQQ" << item->modelType() << name;
+
+//        }
+    });
+
+}
+
+//! returns parameter distribution to add into the Simulation
+std::unique_ptr<ParameterDistribution>
+BeamDistributionItem::getParameterDistributionForName(const std::string &parameter_name)
+{
+    std::unique_ptr<ParameterDistribution> P_par_distr{};
+    if (auto distributionItem
+        = dynamic_cast<DistributionItem *>(getGroupItem(P_DISTRIBUTION))) {
+        auto P_distribution = createDistribution1D();
+
+        if (P_distribution) {
+            int nbr_samples = distributionItem->getItemValue(
+                                                    DistributionItem::P_NUMBER_OF_SAMPLES).toInt();
+            double sigma_factor(0);
+            if (distributionItem->isTag(DistributionItem::P_SIGMA_FACTOR)) {
+                sigma_factor = distributionItem->getItemValue(
+                                                     DistributionItem::P_SIGMA_FACTOR).toInt();
+            }
+            RealLimits limits;
+            SessionItem *distributionNoneValueItem =
+                    getGroupItem(P_DISTRIBUTION,Constants::DistributionNoneType)->getItem(DistributionNoneItem::P_VALUE);
+            if (modelType() == Constants::BeamWavelengthType) {
+                limits = distributionNoneValueItem->limits();
+            } else {
+                RealLimits orig = distributionNoneValueItem->limits();
+                if (orig.hasLowerLimit())
+                    limits.setLowerLimit(Units::deg2rad(orig.getLowerLimit()));
+                if (orig.hasUpperLimit())
+                    limits.setUpperLimit(Units::deg2rad(orig.getUpperLimit()));
+            }
+            P_par_distr = GUIHelpers::make_unique<ParameterDistribution>(
+                parameter_name, *P_distribution, nbr_samples, sigma_factor, limits);
+        }
+    }
+    return P_par_distr;
+}
+
+//! Propagates the value stored in DistributionNone type into currently activive distribution.
+
+void BeamDistributionItem::initDistributionItem()
+{
+    GroupItem *groupItem = dynamic_cast<GroupItem *>(getItem(P_DISTRIBUTION));
+    Q_ASSERT(groupItem);
+
+    SessionItem *distributionNone(0);
+    foreach(SessionItem *item, groupItem->getItems(GroupItem::T_ITEMS)) {
+        if(item->modelType() == Constants::DistributionNoneType) {
+            distributionNone = item;
+            break;
+        }
+    }
+
+    if(!distributionNone)
+        return;
+
+    if(distributionNone != groupItem->currentItem()) {
+        DistributionItem *distrItem = dynamic_cast<DistributionItem *>(groupItem->currentItem());
+        Q_ASSERT(distrItem);
+        distrItem->init_parameters(distributionNone->getItemValue(DistributionNoneItem::P_VALUE).toDouble());
+    }
+
+
+}
+
+std::unique_ptr<IDistribution1D> BeamDistributionItem::createDistribution1D()
+{
+    std::unique_ptr<IDistribution1D> P_distribution {};
+    if(DistributionItem *distributionItem = dynamic_cast<DistributionItem *>(
+                getGroupItem(P_DISTRIBUTION))) {
+        P_distribution = distributionItem->createDistribution();
+    }
+    return P_distribution;
+}
diff --git a/GUI/coregui/Models/BeamDistributionItem.h b/GUI/coregui/Models/BeamDistributionItem.h
new file mode 100644
index 0000000..09fa8d6
--- /dev/null
+++ b/GUI/coregui/Models/BeamDistributionItem.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamDistributionItem.h
+//! @brief     Defines class BeamDistributionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BEAMDISTRIBUTIONITEM_H
+#define BEAMDISTRIBUTIONITEM_H
+
+#include "DistributionItem.h"
+
+
+class ParameterDistribution;
+
+//! The BeamDistributionItem handles wavelength, inclination and azimuthal parameter
+//! distribution for BeamItem
+class BA_CORE_API_ BeamDistributionItem : public SessionItem
+{
+public:
+    static const QString P_DISTRIBUTION;
+    explicit BeamDistributionItem(const QString name = QString());
+    virtual ~BeamDistributionItem(){}
+
+    std::unique_ptr<ParameterDistribution> getParameterDistributionForName(
+            const std::string &parameter_name);
+
+protected:
+    void initDistributionItem();
+
+    virtual std::unique_ptr<IDistribution1D> createDistribution1D();
+};
+
+#endif // BEAMDISTRIBUTIONITEM_H
diff --git a/GUI/coregui/Models/BeamItem.cpp b/GUI/coregui/Models/BeamItem.cpp
new file mode 100644
index 0000000..af6313a
--- /dev/null
+++ b/GUI/coregui/Models/BeamItem.cpp
@@ -0,0 +1,114 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamItem.cpp
+//! @brief     Implements class BeamItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "BeamItem.h"
+#include "BeamDistributionItem.h"
+#include "BornAgainNamespace.h"
+#include "ScientificDoubleProperty.h"
+
+
+const QString BeamItem::P_INTENSITY = QString::fromStdString(BornAgain::Intensity);
+const QString BeamItem::P_WAVELENGTH = QString::fromStdString(BornAgain::Wavelength);
+const QString BeamItem::P_INCLINATION_ANGLE = QString::fromStdString(BornAgain::Inclination);
+const QString BeamItem::P_AZIMUTHAL_ANGLE = QString::fromStdString(BornAgain::Azimuth);
+
+BeamItem::BeamItem() : SessionItem(Constants::BeamType)
+{
+    ScientificDoubleProperty intensity(1e+08);
+    addProperty(P_INTENSITY, intensity.getVariant())->setLimits(RealLimits::limited(0.0, 1e+32));
+    addGroupProperty(P_WAVELENGTH, Constants::BeamWavelengthType);
+    addGroupProperty(P_INCLINATION_ANGLE, Constants::BeamInclinationAngleType);
+    addGroupProperty(P_AZIMUTHAL_ANGLE, Constants::BeamAzimuthalAngleType);
+}
+
+double BeamItem::getIntensity() const
+{
+    ScientificDoubleProperty intensity
+        = getItemValue(P_INTENSITY).value<ScientificDoubleProperty>();
+    return intensity.getValue();
+}
+
+void BeamItem::setIntensity(double value)
+{
+    ScientificDoubleProperty intensity
+        = getItemValue(P_INTENSITY).value<ScientificDoubleProperty>();
+    intensity.setValue(value);
+    setItemValue(P_INTENSITY, intensity.getVariant());
+}
+
+double BeamItem::getWavelength() const
+{
+    SessionItem *beamWavelength = getItem(P_WAVELENGTH);
+    Q_ASSERT(beamWavelength);
+    SessionItem *distributionNoneValueItem =
+            beamWavelength->getGroupItem(BeamDistributionItem::P_DISTRIBUTION,
+                                         Constants::DistributionNoneType)
+            ->getItem(DistributionNoneItem::P_VALUE);
+    return distributionNoneValueItem->value().toDouble();
+}
+
+void BeamItem::setWavelength(double value, const QString &distribution_name)
+{
+    Q_UNUSED(distribution_name);
+    SessionItem *beamWavelength = getItem(P_WAVELENGTH);
+    Q_ASSERT(beamWavelength);
+    SessionItem *distributionItem = beamWavelength->setGroupProperty(
+        BeamDistributionItem::P_DISTRIBUTION, Constants::DistributionNoneType);
+    Q_ASSERT(distributionItem);
+    distributionItem->setItemValue(DistributionNoneItem::P_VALUE, value);
+}
+
+double BeamItem::getInclinationAngle() const
+{
+    SessionItem *angleItem = getItem(P_INCLINATION_ANGLE);
+    Q_ASSERT(angleItem);
+    SessionItem *distributionNoneValueItem =
+            angleItem->getGroupItem(BeamDistributionItem::P_DISTRIBUTION,Constants::DistributionNoneType)
+            ->getItem(DistributionNoneItem::P_VALUE);
+    return distributionNoneValueItem->value().toDouble();
+}
+
+void BeamItem::setInclinationAngle(double value, const QString &distribution_name)
+{
+    Q_UNUSED(distribution_name);
+    SessionItem *angleItem = getItem(P_INCLINATION_ANGLE);
+    Q_ASSERT(angleItem);
+    SessionItem *distributionItem = angleItem->setGroupProperty(
+        BeamDistributionItem::P_DISTRIBUTION, Constants::DistributionNoneType);
+    Q_ASSERT(distributionItem);
+    distributionItem->setItemValue(DistributionNoneItem::P_VALUE, value);
+}
+
+double BeamItem::getAzimuthalAngle() const
+{
+    SessionItem *angleItem = getItem(P_AZIMUTHAL_ANGLE);
+    Q_ASSERT(angleItem);
+    SessionItem *distributionNoneValueItem =
+            angleItem->getGroupItem(BeamDistributionItem::P_DISTRIBUTION,Constants::DistributionNoneType)
+            ->getItem(DistributionNoneItem::P_VALUE);
+    return distributionNoneValueItem->value().toDouble();
+}
+
+void BeamItem::setAzimuthalAngle(double value, const QString &distribution_name)
+{
+    Q_UNUSED(distribution_name);
+    SessionItem *angleItem = getItem(P_AZIMUTHAL_ANGLE);
+    Q_ASSERT(angleItem);
+    SessionItem *distributionItem = angleItem->setGroupProperty(
+        BeamDistributionItem::P_DISTRIBUTION, Constants::DistributionNoneType);
+    Q_ASSERT(distributionItem);
+    distributionItem->setItemValue(DistributionNoneItem::P_VALUE, value);
+}
diff --git a/GUI/coregui/Models/BeamItem.h b/GUI/coregui/Models/BeamItem.h
new file mode 100644
index 0000000..644a86b
--- /dev/null
+++ b/GUI/coregui/Models/BeamItem.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamItem.h
+//! @brief     Defines class BeamItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BEAMITEM_H
+#define BEAMITEM_H
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ BeamItem : public SessionItem
+{
+
+public:
+    static const QString P_INTENSITY;
+    static const QString P_WAVELENGTH;
+    static const QString P_INCLINATION_ANGLE;
+    static const QString P_AZIMUTHAL_ANGLE;
+    explicit BeamItem();
+    virtual ~BeamItem(){}
+
+    double getIntensity() const;
+    void setIntensity(double value);
+
+    double getWavelength() const;
+    void setWavelength(double value, const QString &distribution_name = QString());
+
+    double getInclinationAngle() const;
+    void setInclinationAngle(double value, const QString &distribution_name = QString());
+
+    double getAzimuthalAngle() const;
+    void setAzimuthalAngle(double value, const QString &distribution_name = QString());
+};
+
+#endif // BEAMITEM_H
+
diff --git a/GUI/coregui/Models/BeamWavelengthItem.cpp b/GUI/coregui/Models/BeamWavelengthItem.cpp
new file mode 100644
index 0000000..5325c40
--- /dev/null
+++ b/GUI/coregui/Models/BeamWavelengthItem.cpp
@@ -0,0 +1,22 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamWavelengthItem.cpp
+//! @brief     Implements class BeamWavelengthItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "BeamWavelengthItem.h"
+
+BeamWavelengthItem::BeamWavelengthItem()
+    : BeamDistributionItem(Constants::BeamWavelengthType)
+{
+}
diff --git a/GUI/coregui/Models/BeamWavelengthItem.h b/GUI/coregui/Models/BeamWavelengthItem.h
new file mode 100644
index 0000000..879221a
--- /dev/null
+++ b/GUI/coregui/Models/BeamWavelengthItem.h
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/BeamWavelengthItem.h
+//! @brief     Defines class BeamWavelengthItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BEAMWAVELENGTHITEM_H
+#define BEAMWAVELENGTHITEM_H
+
+#include "BeamDistributionItem.h"
+
+class BA_CORE_API_ BeamWavelengthItem : public BeamDistributionItem
+{
+
+public:
+    explicit BeamWavelengthItem();
+    virtual ~BeamWavelengthItem(){}
+};
+
+#endif // BEAMWAVELENGTHITEM_H
diff --git a/GUI/coregui/Models/ColorProperty.h b/GUI/coregui/Models/ColorProperty.h
new file mode 100644
index 0000000..c4adfd4
--- /dev/null
+++ b/GUI/coregui/Models/ColorProperty.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ColorProperty.h
+//! @brief     Defines class ColorProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORPROPERTY_H
+#define COLORPROPERTY_H
+
+#include "WinDllMacros.h"
+#include <QPixmap>
+#include <QVariant>
+
+//! The ColorProperty for SessionItem and PropertyEditor
+//!
+//! The reason is to have simple color editor in PropertyEditor instead of
+//! original one which is too sophisticated.
+class BA_CORE_API_ ColorProperty
+{
+public:
+    ColorProperty() : m_color(Qt::red) {}
+    ColorProperty(QColor color) : m_color(color) {}
+    QPixmap getPixmap() const {
+        QPixmap pixmap(10,10);
+        pixmap.fill(m_color);
+        return pixmap;
+    }
+    QColor getColor() const { return m_color; }
+    void setColor(QColor color) { m_color = color; }
+    QString getText() const {
+        return QString("[%1, %2, %3] (%4)")
+               .arg(m_color.red()).arg(m_color.green()).arg(m_color.blue()).arg(m_color.alpha());
+    }
+
+    QVariant getVariant() const
+    {
+        QVariant variant;
+        variant.setValue(*this);
+        return variant;
+    }
+
+private:
+    QColor m_color;
+};
+
+Q_DECLARE_METATYPE(ColorProperty)
+
+
+
+#endif // COLORPROPERTY_H
diff --git a/GUI/coregui/Models/ComboProperty.cpp b/GUI/coregui/Models/ComboProperty.cpp
new file mode 100644
index 0000000..78de40a
--- /dev/null
+++ b/GUI/coregui/Models/ComboProperty.cpp
@@ -0,0 +1,86 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ComboProperty.cpp
+//! @brief     Implements class ComboProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ComboProperty.h"
+#include "GUIHelpers.h"
+
+
+ComboProperty::ComboProperty(const QStringList &values, const QString &current_value)
+    : m_values(values)
+    , m_current_value(current_value)
+    , m_cache_contains_GUI_value(true)
+{
+}
+
+void ComboProperty::setValue(const QString &name)
+{
+    Q_ASSERT(m_values.contains(name));
+    m_current_value = name;
+}
+
+//! returns list of tool tips for all values
+QStringList ComboProperty::getToolTips() const
+{
+    return m_values_tooltips;
+}
+
+void ComboProperty::setToolTips(const QStringList &tooltips)
+{
+    m_values_tooltips = tooltips;
+}
+
+int ComboProperty::index() const
+{
+    return toIndex(m_current_value);
+}
+
+int ComboProperty::toIndex(const QString &value) const
+{
+    QStringList name_list = getValues();
+    for (int i = 0; i < name_list.size(); ++i) {
+        if (value == name_list[i]) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+QString ComboProperty::toString(int index) const
+{
+    QStringList name_list = getValues();
+    if (index<0 || index>=name_list.size()) {
+        return QString();
+    }
+    return name_list[index];
+}
+
+void ComboProperty::setCachedValue(const QString &name)
+{
+    m_cached_value = name;
+}
+
+bool ComboProperty::operator==(const ComboProperty &other) const {
+    if(m_current_value != other.m_current_value) return false;
+    if(!GUIHelpers::isTheSame(m_values, other.m_values)) return false;
+//    if(m_cached_value != other.m_cached_value) return false;
+//    if(m_cache_contains_GUI_value != other.m_cache_contains_GUI_value) return false;
+    return true;
+}
+
+bool ComboProperty::operator<(const ComboProperty &other) const
+{
+    return m_current_value < other.m_current_value && m_values.size() < other.m_values.size();
+}
diff --git a/GUI/coregui/Models/ComboProperty.h b/GUI/coregui/Models/ComboProperty.h
new file mode 100644
index 0000000..f4597f5
--- /dev/null
+++ b/GUI/coregui/Models/ComboProperty.h
@@ -0,0 +1,134 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ComboProperty.h
+//! @brief     Defines class ComboProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMBOPROPERTY_H
+#define COMBOPROPERTY_H
+
+#include "WinDllMacros.h"
+#include <QStringList>
+#include <QVariant>
+
+//! The ComboProperty defines SessionItem's property with a value
+//! from predefined list.
+//!
+//! This is a light version of GroupProperty without SubItem mechanism
+class BA_CORE_API_ ComboProperty
+{
+public:
+
+    ComboProperty(const QStringList &values = QStringList(),
+                  const QString &current_value = QString("Undefined"));
+    virtual ~ComboProperty() {}
+    QString getValue() const;
+
+    void setValue(const QString &name);
+    bool isDefined();
+
+    QStringList getValues() const;
+
+    QStringList getToolTips() const;
+    void setToolTips(const QStringList &tooltips);
+
+    int index() const;
+    int toIndex(const QString &value) const;
+    QString toString(int index) const;
+
+    inline ComboProperty &operator<<(const QString &str);
+
+    inline ComboProperty &operator<<(const QStringList &str);
+
+    QVariant getVariant() const;
+
+    int getIndex() const;
+
+    QString getCachedValue() const;
+    void setCachedValue(const QString &name);
+
+    bool cacheContainsGUIValue() const;
+    void setCacheContainsGUIFlag(bool flag=true);
+
+    bool operator==(const ComboProperty &other) const;
+    bool operator!=(const ComboProperty &other) const { return !(*this == other); }
+    bool operator<(const ComboProperty &other) const;
+
+private:
+    QStringList m_values;
+    QStringList m_values_tooltips;
+    QString m_current_value;
+    QString m_cached_value;  // for comboboxes with dynamically generated value lists
+    bool m_cache_contains_GUI_value;
+};
+
+inline QString ComboProperty::getValue() const
+{
+    return m_current_value;
+}
+
+inline bool ComboProperty::isDefined()
+{
+    return m_current_value != QStringLiteral("Undefined");
+}
+
+inline QStringList ComboProperty::getValues() const
+{
+    return m_values;
+}
+
+inline ComboProperty &ComboProperty::operator<<(const QString &str)
+{
+    m_values.append(str);
+    if(m_values.size()) m_current_value=m_values.at(0);
+    return *this;
+}
+
+inline ComboProperty &ComboProperty::operator<<(const QStringList &str)
+{
+    m_values.append(str);
+    if(m_values.size()) m_current_value=m_values.at(0);
+    return *this;
+}
+
+inline QVariant ComboProperty::getVariant() const {
+    QVariant result;
+    result.setValue(*this);
+    return result;
+}
+
+inline int ComboProperty::getIndex() const
+{
+    return toIndex(m_current_value);
+}
+
+inline QString ComboProperty::getCachedValue() const
+{
+    return m_cached_value;
+}
+
+inline bool ComboProperty::cacheContainsGUIValue() const
+{
+    return m_cache_contains_GUI_value;
+}
+
+inline void ComboProperty::setCacheContainsGUIFlag(bool flag)
+{
+    m_cache_contains_GUI_value = flag;
+}
+
+Q_DECLARE_METATYPE(ComboProperty)
+
+
+
+#endif // COMBOPROPERTY_H
diff --git a/GUI/coregui/Models/DetectorItems.cpp b/GUI/coregui/Models/DetectorItems.cpp
new file mode 100644
index 0000000..93680a6
--- /dev/null
+++ b/GUI/coregui/Models/DetectorItems.cpp
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DetectorItems.cpp
+//! @brief     Implements classes DetectorItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DetectorItems.h"
+#include "MaskItems.h"
+
+const QString DetectorItem::P_DETECTOR = "DetectorType";
+const QString DetectorItem::T_MASKS = "Mask tag";
+
+DetectorItem::DetectorItem()
+    : SessionItem(Constants::DetectorType)
+{
+    addGroupProperty(P_DETECTOR, Constants::DetectorGroup);
+    registerTag(T_MASKS, 0, -1, QStringList() << Constants::MaskContainerType);
+    setDefaultTag(T_MASKS);
+    setGroupProperty(P_DETECTOR, Constants::SphericalDetectorType);
+    mapper()->setOnPropertyChange(
+                [this] (const QString &name)
+    {
+        if(name == P_DETECTOR) {
+            if(SessionItem *maskContainer = maskContainerItem()) {
+                SessionItem *item = takeRow(rowOfChild(maskContainer));
+                Q_ASSERT(item == maskContainer);
+                delete item;
+            }
+
+        }
+    });
+}
+
+MaskContainerItem *DetectorItem::maskContainerItem() const
+{
+    foreach(SessionItem *item, childItems()) {
+        if(MaskContainerItem *container = dynamic_cast<MaskContainerItem *>(item)) {
+            return container;
+        }
+    }
+    return 0;
+}
+
diff --git a/GUI/coregui/Models/DetectorItems.h b/GUI/coregui/Models/DetectorItems.h
new file mode 100644
index 0000000..6fcac9b
--- /dev/null
+++ b/GUI/coregui/Models/DetectorItems.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DetectorItems.h
+//! @brief     Defines classes DetectorItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DETECTORITEMS_H
+#define DETECTORITEMS_H
+
+#include "RectangularDetectorItem.h"
+#include "SphericalDetectorItem.h"
+
+class MaskContainerItem;
+
+//! DetectorItem, holds masks and either rectangular or spherical detector as sub item
+class BA_CORE_API_ DetectorItem : public SessionItem
+{
+public:
+    static const QString P_DETECTOR;
+    static const QString T_MASKS;
+    explicit DetectorItem();
+    virtual ~DetectorItem(){}
+
+    MaskContainerItem *maskContainerItem() const;
+};
+
+#endif // DETECTORITEMS_H
diff --git a/GUI/coregui/Models/DistributionItem.cpp b/GUI/coregui/Models/DistributionItem.cpp
new file mode 100644
index 0000000..3121983
--- /dev/null
+++ b/GUI/coregui/Models/DistributionItem.cpp
@@ -0,0 +1,227 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DistributionItem.cpp
+//! @brief     Implements class DistributionItem and several subclasses
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DistributionItem.h"
+#include "Distributions.h"
+#include "GUIHelpers.h"
+#include <cmath>
+
+const QString DistributionItem::P_NUMBER_OF_SAMPLES = "Number of samples";
+const QString DistributionItem::P_SIGMA_FACTOR = "Sigma factor";
+const QString DistributionItem::P_IS_INITIALIZED = "is initialized";
+
+DistributionItem::DistributionItem(const QString name)
+    : SessionItem(name)
+{
+    addProperty(P_IS_INITIALIZED, false)->setVisible(false);
+}
+
+//! Provides initialization of the distribution with some reasonable parameters around given value.
+//! Used by beamDistributionItem to propagate value from DistributionNone to the distribution
+//! currently selected by GroupItem.
+
+void DistributionItem::init_parameters(double value)
+{
+    if(getItemValue(P_IS_INITIALIZED).toBool())
+        return;
+
+    init_distribution(value);
+    setItemValue(P_IS_INITIALIZED, true);
+}
+
+void DistributionItem::register_number_of_samples()
+{
+    addProperty(P_NUMBER_OF_SAMPLES, 5);
+}
+
+void DistributionItem::register_sigma_factor()
+{
+    addProperty(P_SIGMA_FACTOR, 2.0);
+}
+
+/* ------------------------------------------------ */
+
+const QString DistributionNoneItem::P_VALUE = "Value";
+
+DistributionNoneItem::DistributionNoneItem()
+    : DistributionItem(Constants::DistributionNoneType)
+{
+    addProperty(P_VALUE, 0.1)->setLimits(RealLimits::lowerLimited(1e-4));
+    getItem(P_VALUE)->setDecimals(4);
+}
+
+std::unique_ptr<IDistribution1D> DistributionNoneItem::createDistribution() const
+{
+    return nullptr;
+}
+
+void DistributionNoneItem::init_distribution(double value)
+{
+    setItemValue(DistributionNoneItem::P_VALUE, value);
+}
+
+/* ------------------------------------------------ */
+
+const QString DistributionGateItem::P_MIN = "Minimum";
+const QString DistributionGateItem::P_MAX = "Maximum";
+
+DistributionGateItem::DistributionGateItem()
+    : DistributionItem(Constants::DistributionGateType)
+{
+    addProperty(P_MIN, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_MAX, 1.0)->setLimits(RealLimits::limitless());
+    register_number_of_samples();
+    register_sigma_factor();
+}
+
+std::unique_ptr<IDistribution1D> DistributionGateItem::createDistribution() const
+{
+    double min = getItemValue(P_MIN).toDouble();
+    double max = getItemValue(P_MAX).toDouble();
+    return GUIHelpers::make_unique<DistributionGate>(min, max);
+}
+
+void DistributionGateItem::init_distribution(double value)
+{
+    double sigma(0.1*std::abs(value));
+    if(sigma == 0.0) sigma = 0.1;
+    setItemValue(P_MIN, value - sigma);
+    setItemValue(P_MAX, value + sigma);
+}
+
+/* ------------------------------------------------ */
+
+const QString DistributionLorentzItem::P_MEAN = "Mean";
+const QString DistributionLorentzItem::P_HWHM = "HWHM";
+
+DistributionLorentzItem::DistributionLorentzItem()
+    : DistributionItem(Constants::DistributionLorentzType)
+{
+    addProperty(P_MEAN, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_HWHM, 1.0);
+    register_number_of_samples();
+    register_sigma_factor();
+}
+
+std::unique_ptr<IDistribution1D> DistributionLorentzItem::createDistribution() const
+{
+    double mean = getItemValue(P_MEAN).toDouble();
+    double hwhm = getItemValue(P_HWHM).toDouble();
+    return GUIHelpers::make_unique<DistributionLorentz>(mean, hwhm);
+}
+
+void DistributionLorentzItem::init_distribution(double value)
+{
+    double sigma(0.1*std::abs(value));
+    if(sigma == 0.0) sigma = 0.1;
+
+    setItemValue(P_MEAN, value);
+    setItemValue(P_HWHM, sigma);
+    getItem(P_HWHM)->setLimits(RealLimits::lowerLimited(0.0));
+}
+
+/* ------------------------------------------------ */
+
+const QString DistributionGaussianItem::P_MEAN = "Mean";
+const QString DistributionGaussianItem::P_STD_DEV = "Standard deviation";
+
+DistributionGaussianItem::DistributionGaussianItem()
+    : DistributionItem(Constants::DistributionGaussianType)
+{
+    addProperty(P_MEAN, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_STD_DEV, 1.0);
+    register_number_of_samples();
+    register_sigma_factor();
+}
+
+std::unique_ptr<IDistribution1D> DistributionGaussianItem::createDistribution() const
+{
+    double mean = getItemValue(P_MEAN).toDouble();
+    double std_dev = getItemValue(P_STD_DEV).toDouble();
+    return GUIHelpers::make_unique<DistributionGaussian>(mean, std_dev);
+}
+
+void DistributionGaussianItem::init_distribution(double value)
+{
+    double sigma(0.1*std::abs(value));
+    if(sigma == 0.0) sigma = 0.1;
+
+    setItemValue(P_MEAN, value);
+    setItemValue(P_STD_DEV, sigma);
+    getItem(P_STD_DEV)->setLimits(RealLimits::lowerLimited(0.0));
+}
+
+/* ------------------------------------------------ */
+
+const QString DistributionLogNormalItem::P_MEDIAN = "Median";
+const QString DistributionLogNormalItem::P_SCALE_PAR = "Scale parameter";
+
+DistributionLogNormalItem::DistributionLogNormalItem()
+    : DistributionItem(Constants::DistributionLogNormalType)
+{
+    addProperty(P_MEDIAN, 1.0);
+    addProperty(P_SCALE_PAR, 1.0);
+    register_number_of_samples();
+    register_sigma_factor();
+}
+
+std::unique_ptr<IDistribution1D> DistributionLogNormalItem::createDistribution() const
+{
+    double median = getItemValue(P_MEDIAN).toDouble();
+    double scale_par = getItemValue(P_SCALE_PAR).toDouble();
+    return GUIHelpers::make_unique<DistributionLogNormal>(median, scale_par);
+}
+
+void DistributionLogNormalItem::init_distribution(double value)
+{
+    double sigma(0.1*std::abs(value));
+    if(sigma == 0.0) sigma = 0.1;
+
+    setItemValue(P_MEDIAN, value);
+    setItemValue(P_SCALE_PAR, sigma);
+    getItem(P_SCALE_PAR)->setLimits(RealLimits::lowerLimited(0.0));
+}
+
+/* ------------------------------------------------ */
+
+const QString DistributionCosineItem::P_MEAN = "Mean";
+const QString DistributionCosineItem::P_SIGMA = "Sigma";
+
+DistributionCosineItem::DistributionCosineItem()
+    : DistributionItem(Constants::DistributionCosineType)
+{
+    addProperty(P_MEAN, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_SIGMA, 1.0);
+    register_number_of_samples();
+    register_sigma_factor();
+}
+
+std::unique_ptr<IDistribution1D> DistributionCosineItem::createDistribution() const
+{
+    double mean = getItemValue(P_MEAN).toDouble();
+    double sigma = getItemValue(P_SIGMA).toDouble();
+    return GUIHelpers::make_unique<DistributionCosine>(mean, sigma);
+}
+
+void DistributionCosineItem::init_distribution(double value)
+{
+    double sigma(0.1*std::abs(value));
+    if(sigma == 0.0) sigma = 0.1;
+
+    setItemValue(P_MEAN, value);
+    setItemValue(P_SIGMA, sigma);
+    getItem(P_SIGMA)->setLimits(RealLimits::lowerLimited(0.0));
+}
diff --git a/GUI/coregui/Models/DistributionItem.h b/GUI/coregui/Models/DistributionItem.h
new file mode 100644
index 0000000..f20fd7b
--- /dev/null
+++ b/GUI/coregui/Models/DistributionItem.h
@@ -0,0 +1,117 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DistributionItem.h
+//! @brief     Defines class DistributionItem and several subclasses
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DISTRIBUTIONITEM_H
+#define DISTRIBUTIONITEM_H
+
+#include "SessionItem.h"
+
+
+class IDistribution1D;
+
+class BA_CORE_API_ DistributionItem : public SessionItem
+{
+
+public:
+    static const QString P_NUMBER_OF_SAMPLES;
+    static const QString P_SIGMA_FACTOR;
+    static const QString P_IS_INITIALIZED;
+    explicit DistributionItem(const QString name);
+    virtual std::unique_ptr<IDistribution1D> createDistribution() const=0;
+
+    void init_parameters(double);
+protected:
+    virtual void init_distribution(double){}
+    void register_number_of_samples();
+    void register_sigma_factor();
+};
+
+class BA_CORE_API_ DistributionNoneItem : public DistributionItem
+{
+
+public:
+    static const QString P_VALUE;
+    explicit DistributionNoneItem();
+    virtual std::unique_ptr<IDistribution1D> createDistribution() const;
+    virtual void init_distribution(double value);
+};
+
+
+class BA_CORE_API_ DistributionGateItem : public DistributionItem
+{
+
+public:
+    static const QString P_MIN;
+    static const QString P_MAX;
+    explicit DistributionGateItem();
+
+    virtual std::unique_ptr<IDistribution1D> createDistribution() const;
+    virtual void init_distribution(double value);
+};
+
+
+class BA_CORE_API_ DistributionLorentzItem : public DistributionItem
+{
+
+public:
+    static const QString P_MEAN;
+    static const QString P_HWHM;
+    explicit DistributionLorentzItem();
+
+    virtual std::unique_ptr<IDistribution1D> createDistribution() const;
+    virtual void init_distribution(double value);
+};
+
+
+class BA_CORE_API_ DistributionGaussianItem : public DistributionItem
+{
+
+public:
+    static const QString P_MEAN;
+    static const QString P_STD_DEV;
+    explicit DistributionGaussianItem();
+
+    virtual std::unique_ptr<IDistribution1D> createDistribution() const;
+    virtual void init_distribution(double value);
+};
+
+
+class BA_CORE_API_ DistributionLogNormalItem : public DistributionItem
+{
+
+public:
+    static const QString P_MEDIAN;
+    static const QString P_SCALE_PAR;
+    explicit DistributionLogNormalItem();
+
+    virtual std::unique_ptr<IDistribution1D> createDistribution() const;
+    virtual void init_distribution(double value);
+};
+
+
+class BA_CORE_API_ DistributionCosineItem : public DistributionItem
+{
+
+public:
+    static const QString P_MEAN;
+    static const QString P_SIGMA;
+    explicit DistributionCosineItem();
+
+    virtual std::unique_ptr<IDistribution1D> createDistribution() const;
+    virtual void init_distribution(double value);
+};
+
+#endif // DISTRIBUTIONITEM_H
diff --git a/GUI/coregui/Models/DocumentModel.cpp b/GUI/coregui/Models/DocumentModel.cpp
new file mode 100644
index 0000000..8afe0eb
--- /dev/null
+++ b/GUI/coregui/Models/DocumentModel.cpp
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DocumentModel.cpp
+//! @brief     Implements class DocumentModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DocumentModel.h"
+#include "SimulationOptionsItem.h"
+
+DocumentModel::DocumentModel(QObject *parent)
+    : SessionModel(SessionXML::DocumentModelTag, parent)
+{
+    setObjectName(SessionXML::DocumentModelTag);
+}
+
+SimulationOptionsItem *DocumentModel::getSimulationOptionsItem()
+{
+    return dynamic_cast<SimulationOptionsItem *>(topItem(Constants::SimulationOptionsType));
+
+}
diff --git a/GUI/coregui/Models/DocumentModel.h b/GUI/coregui/Models/DocumentModel.h
new file mode 100644
index 0000000..c4ee63c
--- /dev/null
+++ b/GUI/coregui/Models/DocumentModel.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DocumentModel.h
+//! @brief     Defines class DocumentModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DOCUMENTMODEL_H
+#define DOCUMENTMODEL_H
+
+#include "SessionModel.h"
+
+class SimulationOptionsItem;
+
+//! The DocumentModel class is a model with GUI settings related to the opened project.
+//! Can be the place to store splitter position, etc.
+
+class BA_CORE_API_ DocumentModel : public SessionModel
+{
+    Q_OBJECT
+
+public:
+    explicit DocumentModel(QObject *parent = 0);
+
+    SimulationOptionsItem *getSimulationOptionsItem();
+
+};
+
+#endif // DOCUMENTMODEL_H
diff --git a/GUI/coregui/Models/DomainFittingBuilder.cpp b/GUI/coregui/Models/DomainFittingBuilder.cpp
new file mode 100644
index 0000000..51f5df1
--- /dev/null
+++ b/GUI/coregui/Models/DomainFittingBuilder.cpp
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DomainFittingBuilder.cpp
+//! @brief     Implements class DomainFittingBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+#include "DomainFittingBuilder.h"
+#include "DomainSimulationBuilder.h"
+#include "FitParameterItems.h"
+#include "FitSuite.h"
+#include "FitSuiteItem.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "IMinimizer.h"
+#include "IntensityDataItem.h"
+#include "JobItem.h"
+#include "MinimizerItem.h"
+#include "ModelPath.h"
+#include "MultiLayerItem.h"
+#include "RealDataItem.h"
+
+// FIXME make unique_ptr all along
+
+std::shared_ptr<FitSuite> DomainFittingBuilder::createFitSuite(JobItem *jobItem)
+{
+    std::shared_ptr<FitSuite> result(new FitSuite());
+
+    FitSuiteItem *fitSuiteItem = jobItem->fitSuiteItem();
+    Q_ASSERT(fitSuiteItem);
+
+    result->setMinimizer(fitSuiteItem->minimizerContainerItem()->createMinimizer().release());
+
+    FitParameterContainerItem *container = fitSuiteItem->fitParameterContainerItem();
+    Q_ASSERT(container);
+
+    foreach(FitParameterItem *parItem, container->fitParameterItems()) {
+        double value = parItem->getItemValue(FitParameterItem::P_START_VALUE).toDouble();
+        foreach(SessionItem *linkItem, parItem->getItems(FitParameterItem::T_LINK)) {
+            QString link = linkItem->getItemValue(FitParameterLinkItem::P_LINK).toString();
+            std::string domainPath = "*" + ModelPath::translateParameterName(jobItem, link);
+            linkItem->setItemValue(FitParameterLinkItem::P_DOMAIN, QString::fromStdString(domainPath));
+            result->addFitParameter(domainPath, value, parItem->getAttLimits());
+            //FIXME only one link is possible at the time due to limitations in FitCore
+            break;
+        }
+    }
+
+    DomainSimulationBuilder builder;
+    const std::unique_ptr<GISASSimulation> simulation(
+                builder.getSimulation(jobItem->multiLayerItem(), jobItem->instrumentItem(),
+                                      jobItem->getSimulationOptionsItem()));
+
+    RealDataItem *realDataItem = jobItem->realDataItem();
+    if(!realDataItem)
+        throw GUIHelpers::Error("DomainFittingBuilder::createFitSuite() -> No Real Data defined.");
+
+    const IntensityDataItem *intensityItem = realDataItem->intensityDataItem();
+    Q_ASSERT(intensityItem);
+    Q_ASSERT(intensityItem->getOutputData());
+
+    result->addSimulationAndRealData(*simulation.get(), *intensityItem->getOutputData());
+
+    return result;
+}
diff --git a/GUI/coregui/Models/DomainFittingBuilder.h b/GUI/coregui/Models/DomainFittingBuilder.h
new file mode 100644
index 0000000..1dc558b
--- /dev/null
+++ b/GUI/coregui/Models/DomainFittingBuilder.h
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DomainFittingBuilder.h
+//! @brief     Defines class DomainFittingBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DOMAINFITTINGBUILDER_H
+#define DOMAINFITTINGBUILDER_H
+
+#include <memory>
+
+class JobItem;
+class FitSuite;
+
+//! The DomainFittingBuilder class builds the domain FitSuite using JobItem
+
+class DomainFittingBuilder
+{
+public:
+    static std::shared_ptr<FitSuite> createFitSuite(JobItem *jobItem);
+};
+
+#endif // DOMAINFITTINGBUILDER_H
diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
new file mode 100644
index 0000000..61572de
--- /dev/null
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -0,0 +1,147 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DomainObjectBuilder.cpp
+//! @brief     Implements class DomainObjectBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DomainObjectBuilder.h"
+#include "ComboProperty.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "IInterferenceFunction.h"
+#include "LayerItem.h"
+#include "MultiLayer.h"
+#include "ParticleDistributionItem.h"
+#include "ParticleLayoutItem.h"
+#include "TransformToDomain.h"
+
+std::unique_ptr<MultiLayer> DomainObjectBuilder::buildMultiLayer(
+    const SessionItem& multilayer_item) const
+{
+    auto P_multilayer = TransformToDomain::createMultiLayer(multilayer_item);
+    QVector<SessionItem *> children = multilayer_item.childItems();
+    for (int i = 0; i < children.size(); ++i) {
+        if (children[i]->modelType() == Constants::LayerType) {
+            auto P_layer = buildLayer(*children[i]);
+            auto roughnessItem = children[i]->getGroupItem(LayerItem::P_ROUGHNESS);
+            Q_ASSERT(roughnessItem);
+            auto P_roughness = TransformToDomain::createLayerRoughness(*roughnessItem);
+            if (P_layer) {
+                if (P_roughness) {
+                    P_multilayer->addLayerWithTopRoughness(*P_layer, *P_roughness);
+                } else {
+                    P_multilayer->addLayer(*P_layer);
+                }
+            }
+        }
+    }
+    return P_multilayer;
+}
+
+std::unique_ptr<Layer> DomainObjectBuilder::buildLayer(const SessionItem& item) const
+{
+    auto P_layer = TransformToDomain::createLayer(item);
+    QVector<SessionItem *> children = item.childItems();
+    for (int i = 0; i < children.size(); ++i) {
+        if (children[i]->modelType() == Constants::ParticleLayoutType) {
+            auto P_layout = buildParticleLayout(*children[i]);
+            if (P_layout) {
+                P_layer->addLayout(*P_layout);
+            }
+        }
+    }
+    return P_layer;
+}
+
+std::unique_ptr<ParticleLayout> DomainObjectBuilder::buildParticleLayout(
+        const SessionItem& item) const
+{
+    auto P_layout = TransformToDomain::createParticleLayout(item);
+    QVector<SessionItem *> children = item.getItems();
+    for (int i = 0; i < children.size(); ++i) {
+        auto P_particle = TransformToDomain::createIParticle(*children[i]);
+        if (P_particle) {
+            P_layout->addParticle(*P_particle);
+            continue;
+        }
+        if (children[i]->modelType() == Constants::ParticleDistributionType) {
+            auto prop
+                = children[i]
+                      ->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
+                      .value<ComboProperty>();
+            QString par_name = prop.getValue();
+            if (par_name == ParticleDistributionItem::NO_SELECTION) {
+                auto grandchildren = children[i]->getItems();
+                if (grandchildren.size() == 0) {
+                    continue;
+                }
+                if (grandchildren.size() > 1) {
+                    throw GUIHelpers::Error("DomainObjectBuilder::buildParticleLayout()"
+                                            " -> Error! Too many particles defined"
+                                            " in ParticleDistribution");
+                }
+                auto P_particle = TransformToDomain::createIParticle(*grandchildren[0]);
+                if (P_particle) {
+                    P_layout->addParticle(*P_particle);
+                }
+            } else {
+                auto P_part_distr = TransformToDomain::createParticleDistribution(*children[i]);
+                if (P_part_distr) {
+                    P_layout->addParticle(*P_part_distr);
+                }
+            }
+        } else {
+            throw GUIHelpers::Error("DomainObjectBuilder::buildParticleLayout()"
+                                    " -> Error! Not implemented");
+        }
+    }
+    QVector<SessionItem*> interferences = item.getItems(ParticleLayoutItem::T_INTERFERENCE);
+    for (int i = 0; i < interferences.size(); i++) {
+        auto P_interference = buildInterferenceFunction(*interferences[i]);
+        if (P_interference) {
+            P_layout->addInterferenceFunction(*P_interference);
+        }
+    }
+    return P_layout;
+}
+
+std::unique_ptr<IInterferenceFunction>
+DomainObjectBuilder::buildInterferenceFunction(const SessionItem& item) const
+{
+    auto P_iff = TransformToDomain::createInterferenceFunction(item);
+    Q_ASSERT(P_iff);
+    return P_iff;
+}
+
+std::unique_ptr<Instrument> DomainObjectBuilder::buildInstrument(
+    const SessionItem& instrument_item) const
+{
+    auto P_instrument = TransformToDomain::createInstrument(instrument_item);
+    QVector<SessionItem *> children = instrument_item.childItems();
+    for (int i = 0; i < children.size(); ++i) {
+        if (children[i]->modelType() == Constants::BeamType) {
+            auto P_beam = buildBeam(*children[i]);
+            if (P_beam) {
+                P_instrument->setBeam(*P_beam);
+            }
+        } else if (children[i]->modelType() == Constants::DetectorType) {
+            TransformToDomain::initInstrumentFromDetectorItem(*children[i], P_instrument.get());
+        }
+    }
+    return P_instrument;
+}
+
+std::unique_ptr<Beam> DomainObjectBuilder::buildBeam(const SessionItem& item) const
+{
+    return TransformToDomain::createBeam(item);
+}
diff --git a/GUI/coregui/Models/DomainObjectBuilder.h b/GUI/coregui/Models/DomainObjectBuilder.h
new file mode 100644
index 0000000..26ac0f2
--- /dev/null
+++ b/GUI/coregui/Models/DomainObjectBuilder.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DomainObjectBuilder.h
+//! @brief     Defines class DomainObjectBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DOMAINOBJECTBUILDER_H
+#define DOMAINOBJECTBUILDER_H
+
+#include "WinDllMacros.h"
+#include <memory>
+
+class Instrument;
+class MultiLayer;
+class Layer;
+class ParticleLayout;
+class IInterferenceFunction;
+class Beam;
+class SessionItem;
+
+class BA_CORE_API_ DomainObjectBuilder
+{
+public:
+    std::unique_ptr<MultiLayer> buildMultiLayer(const SessionItem &multilayer_item) const;
+    std::unique_ptr<Layer> buildLayer(const SessionItem &item) const;
+    std::unique_ptr<ParticleLayout> buildParticleLayout(const SessionItem &item) const;
+    std::unique_ptr<IInterferenceFunction>
+    buildInterferenceFunction(const SessionItem &item) const;
+    std::unique_ptr<Instrument> buildInstrument(const SessionItem &instrument_item) const;
+    std::unique_ptr<Beam> buildBeam(const SessionItem &item) const;
+};
+
+#endif // DOMAINOBJECTBUILDER_H
diff --git a/GUI/coregui/Models/DomainSimulationBuilder.cpp b/GUI/coregui/Models/DomainSimulationBuilder.cpp
new file mode 100644
index 0000000..830d9dd
--- /dev/null
+++ b/GUI/coregui/Models/DomainSimulationBuilder.cpp
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DomainSimulationBuilder.cpp
+//! @brief     Implements class DomainSimulationBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DomainSimulationBuilder.h"
+#include "BeamItem.h"
+#include "DetectorItems.h"
+#include "DomainObjectBuilder.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "InstrumentItem.h"
+#include "MultiLayer.h"
+#include "MultiLayerItem.h"
+#include "SimulationOptionsItem.h"
+#include "TransformToDomain.h"
+
+//! Creates domain simulation from sample and instrument items.
+GISASSimulation *DomainSimulationBuilder::getSimulation(const MultiLayerItem *sampleItem,
+                                                        const InstrumentItem *instrumentItem,
+                                                        const SimulationOptionsItem *optionsItem)
+{
+    if(sampleItem == nullptr || instrumentItem==nullptr) {
+        QString message("DomainSimulationBuilder::getSimulation() -> Error. Either MultiLayerItem "
+                        " or InstrumentItem is not defined.");
+        throw GUIHelpers::Error(message);
+    }
+    DomainObjectBuilder builder;
+
+    GISASSimulation *result = new GISASSimulation;
+    auto P_multilayer = builder.buildMultiLayer(*sampleItem);
+    auto P_instrument = builder.buildInstrument(*instrumentItem);
+    result->setSample(*P_multilayer);
+    result->setInstrument(*P_instrument);
+
+    TransformToDomain::addDistributionParametersToSimulation(*instrumentItem->beamItem(),
+                                                             result);
+
+    if(optionsItem)
+        TransformToDomain::setSimulationOptions(result, *optionsItem);
+
+    return result;
+}
diff --git a/GUI/coregui/Models/DomainSimulationBuilder.h b/GUI/coregui/Models/DomainSimulationBuilder.h
new file mode 100644
index 0000000..cfc1fe1
--- /dev/null
+++ b/GUI/coregui/Models/DomainSimulationBuilder.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/DomainSimulationBuilder.h
+//! @brief     Defines class DomainSimulationBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DOMAINSIMULATIONBUILDER_H
+#define DOMAINSIMULATIONBUILDER_H
+
+#include "WinDllMacros.h"
+
+class GISASSimulation;
+class MultiLayerItem;
+class InstrumentItem;
+class SimulationOptionsItem;
+
+//! The DomainSimulationBuilder class builds the domain simulation
+//! from instrument and sample models.
+class BA_CORE_API_ DomainSimulationBuilder
+{
+public:
+    static GISASSimulation *getSimulation(const MultiLayerItem *sampleItem,
+                                          const InstrumentItem *instrumentItem,
+                                          const SimulationOptionsItem *optionsItem = 0);
+};
+
+#endif // DOMAINSIMULATIONBUILDER_H
diff --git a/GUI/coregui/Models/FTDecayFunctionItems.cpp b/GUI/coregui/Models/FTDecayFunctionItems.cpp
new file mode 100644
index 0000000..0f083e5
--- /dev/null
+++ b/GUI/coregui/Models/FTDecayFunctionItems.cpp
@@ -0,0 +1,140 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FTDecayFunctionItems.cpp
+//! @brief     Implements FTDecayFunction1DItem classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FTDecayFunctionItems.h"
+#include "Units.h"
+#include "BornAgainNamespace.h"
+
+const QString FTDecayFunction1DItem::P_DECAY_LENGTH
+    = QString::fromStdString(BornAgain::DecayLengthX);
+const QString FTDecayFunction1DVoigtItem::P_ETA
+    = QString::fromStdString(BornAgain::Eta);
+const QString FTDecayFunction2DItem::P_DECAY_LENGTH_X
+    = QString::fromStdString(BornAgain::DecayLengthX);
+const QString FTDecayFunction2DItem::P_DECAY_LENGTH_Y
+    = QString::fromStdString(BornAgain::DecayLengthY);
+const QString FTDecayFunction2DItem::P_GAMMA
+    = QString::fromStdString(BornAgain::Gamma);
+const QString FTDecayFunction2DVoigtItem::P_ETA
+    = QString::fromStdString(BornAgain::Eta);
+
+using namespace Constants;
+
+//===============1D======================
+
+// Cauchy
+FTDecayFunction1DCauchyItem::FTDecayFunction1DCauchyItem()
+    : FTDecayFunction1DItem(FTDecayFunction1DCauchyType)
+{
+    addProperty(P_DECAY_LENGTH, 1000.0);
+}
+
+IFTDecayFunction1D* FTDecayFunction1DCauchyItem::createFTDecayFunction() const
+{
+    return new FTDecayFunction1DCauchy(getItemValue(P_DECAY_LENGTH).toDouble() );
+}
+
+// Gauss
+FTDecayFunction1DGaussItem::FTDecayFunction1DGaussItem()
+    : FTDecayFunction1DItem(FTDecayFunction1DGaussType)
+{
+    addProperty(P_DECAY_LENGTH, 1000.0);
+}
+
+IFTDecayFunction1D* FTDecayFunction1DGaussItem::createFTDecayFunction() const
+{
+    return new FTDecayFunction1DGauss(getItemValue(P_DECAY_LENGTH).toDouble() );
+}
+
+// Triangle
+FTDecayFunction1DTriangleItem::FTDecayFunction1DTriangleItem()
+    : FTDecayFunction1DItem(FTDecayFunction1DTriangleType)
+{
+    addProperty(P_DECAY_LENGTH, 1000.0);
+}
+
+IFTDecayFunction1D* FTDecayFunction1DTriangleItem::createFTDecayFunction() const
+{
+    return new FTDecayFunction1DTriangle(getItemValue(P_DECAY_LENGTH).toDouble() );
+}
+
+// Voigt
+FTDecayFunction1DVoigtItem::FTDecayFunction1DVoigtItem()
+    : FTDecayFunction1DItem(FTDecayFunction1DVoigtType)
+{
+    addProperty(P_DECAY_LENGTH, 1000.0);
+    addProperty(P_ETA, 0.5)->setLimits(RealLimits::limited(0.0, 1.0));
+}
+
+IFTDecayFunction1D* FTDecayFunction1DVoigtItem::createFTDecayFunction() const
+{
+    return new FTDecayFunction1DVoigt(
+                getItemValue(P_DECAY_LENGTH).toDouble(),
+                getItemValue(P_ETA).toDouble() );
+}
+
+FTDecayFunction2DCauchyItem::FTDecayFunction2DCauchyItem()
+    : FTDecayFunction2DItem(FTDecayFunction2DCauchyType)
+{
+    addProperty(P_DECAY_LENGTH_X, 1000.0);
+    addProperty(P_DECAY_LENGTH_Y, 1000.0);
+}
+
+IFTDecayFunction2D* FTDecayFunction2DCauchyItem::createFTDecayFunction() const
+{
+    auto* p_result
+        = new FTDecayFunction2DCauchy(getItemValue(P_DECAY_LENGTH_X).toDouble(),
+                                      getItemValue(P_DECAY_LENGTH_Y).toDouble());
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble());
+    p_result->setGamma(gamma);
+    return p_result;
+}
+
+FTDecayFunction2DGaussItem::FTDecayFunction2DGaussItem()
+    : FTDecayFunction2DItem(FTDecayFunction2DGaussType)
+{
+    addProperty(P_DECAY_LENGTH_X, 1000.0);
+    addProperty(P_DECAY_LENGTH_Y, 1000.0);
+}
+
+IFTDecayFunction2D* FTDecayFunction2DGaussItem::createFTDecayFunction() const
+{
+    auto* p_result
+        = new FTDecayFunction2DGauss(getItemValue(P_DECAY_LENGTH_X).toDouble(),
+                                     getItemValue(P_DECAY_LENGTH_Y).toDouble());
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble());
+    p_result->setGamma(gamma);
+    return p_result;
+}
+
+FTDecayFunction2DVoigtItem::FTDecayFunction2DVoigtItem()
+    : FTDecayFunction2DItem(FTDecayFunction2DVoigtType)
+{
+    addProperty(P_DECAY_LENGTH_X, 1000.0);
+    addProperty(P_DECAY_LENGTH_Y, 1000.0);
+    addProperty(P_ETA, 0.5)->setLimits(RealLimits::limited(0.0, 1.0));
+}
+
+IFTDecayFunction2D* FTDecayFunction2DVoigtItem::createFTDecayFunction() const
+{
+    auto* p_result
+        = new FTDecayFunction2DVoigt(getItemValue(P_DECAY_LENGTH_X).toDouble(),
+                                     getItemValue(P_DECAY_LENGTH_Y).toDouble(),
+                                     getItemValue(P_ETA).toDouble());
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble());
+    p_result->setGamma(gamma);
+    return p_result;
+}
diff --git a/GUI/coregui/Models/FTDecayFunctionItems.h b/GUI/coregui/Models/FTDecayFunctionItems.h
new file mode 100644
index 0000000..893b464
--- /dev/null
+++ b/GUI/coregui/Models/FTDecayFunctionItems.h
@@ -0,0 +1,112 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FTDecayFunctionItems.h
+//! @brief     Defines FTDecayFunction1DItem classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FTDECAYFUNCTIONITEMS_H
+#define FTDECAYFUNCTIONITEMS_H
+
+
+#include "SessionItem.h"
+#include "FTDecayFunctions.h"
+
+
+class BA_CORE_API_ FTDecayFunction1DItem : public SessionItem
+{
+
+public:
+    static const QString P_DECAY_LENGTH;
+    explicit FTDecayFunction1DItem(const QString name)
+        : SessionItem(name){}
+    virtual IFTDecayFunction1D *createFTDecayFunction() const { return 0;}
+    virtual ~FTDecayFunction1DItem(){}
+};
+
+class BA_CORE_API_ FTDecayFunction1DCauchyItem : public FTDecayFunction1DItem
+{
+
+public:
+    explicit FTDecayFunction1DCauchyItem();
+    virtual IFTDecayFunction1D *createFTDecayFunction() const;
+};
+
+class BA_CORE_API_ FTDecayFunction1DGaussItem : public FTDecayFunction1DItem
+{
+
+public:
+    explicit FTDecayFunction1DGaussItem();
+    virtual IFTDecayFunction1D *createFTDecayFunction() const;
+};
+
+class BA_CORE_API_ FTDecayFunction1DTriangleItem : public FTDecayFunction1DItem
+{
+
+public:
+    explicit FTDecayFunction1DTriangleItem();
+    virtual IFTDecayFunction1D *createFTDecayFunction() const;
+};
+
+class BA_CORE_API_ FTDecayFunction1DVoigtItem : public FTDecayFunction1DItem
+{
+
+public:
+    static const QString P_ETA;
+    explicit FTDecayFunction1DVoigtItem();
+    virtual IFTDecayFunction1D *createFTDecayFunction() const;
+};
+
+class BA_CORE_API_ FTDecayFunction2DItem : public SessionItem
+{
+
+public:
+    static const QString P_DECAY_LENGTH_X;
+    static const QString P_DECAY_LENGTH_Y;
+    static const QString P_GAMMA;
+    explicit FTDecayFunction2DItem(const QString name)
+        : SessionItem(name) {
+         addProperty(P_GAMMA, 0.0);
+    }
+    virtual IFTDecayFunction2D *createFTDecayFunction() const { return 0;}
+    virtual ~FTDecayFunction2DItem(){}
+};
+
+class BA_CORE_API_ FTDecayFunction2DCauchyItem : public FTDecayFunction2DItem
+{
+
+public:
+    explicit FTDecayFunction2DCauchyItem();
+    virtual IFTDecayFunction2D *createFTDecayFunction() const;
+};
+
+class BA_CORE_API_ FTDecayFunction2DGaussItem : public FTDecayFunction2DItem
+{
+
+public:
+    explicit FTDecayFunction2DGaussItem();
+    virtual IFTDecayFunction2D *createFTDecayFunction() const;
+};
+
+class BA_CORE_API_ FTDecayFunction2DVoigtItem : public FTDecayFunction2DItem
+{
+
+public:
+    static const QString P_ETA;
+    explicit FTDecayFunction2DVoigtItem();
+    virtual IFTDecayFunction2D *createFTDecayFunction() const;
+};
+
+
+
+#endif // FTDECAYFUNCTIONITEMS_H
+
diff --git a/GUI/coregui/Models/FTDistributionItems.cpp b/GUI/coregui/Models/FTDistributionItems.cpp
new file mode 100644
index 0000000..63275e8
--- /dev/null
+++ b/GUI/coregui/Models/FTDistributionItems.cpp
@@ -0,0 +1,215 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FTDistributionItems.cpp
+//! @brief     Implements FTDistribution1DItem's classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FTDistributionItems.h"
+#include "Units.h"
+#include "BornAgainNamespace.h"
+
+using namespace Constants;
+
+const QString FTDistribution1DItem::P_CORR_LENGTH = "Corr_length";
+const QString FTDistribution1DVoigtItem::P_ETA = "Eta";
+
+const QString FTDistribution2DItem::P_COHER_LENGTH_X =
+        QString::fromStdString(BornAgain::CoherenceLengthX);
+const QString FTDistribution2DItem::P_COHER_LENGTH_Y =
+    QString::fromStdString(BornAgain::CoherenceLengthY);
+const QString FTDistribution2DItem::P_GAMMA =
+        QString::fromStdString(BornAgain::Gamma);
+const QString FTDistribution2DVoigtItem::P_ETA = "Eta";
+
+
+//===============1D======================
+
+// Cauchy
+FTDistribution1DCauchyItem::FTDistribution1DCauchyItem()
+    : FTDistribution1DItem(FTDistribution1DCauchyType)
+{
+    addProperty(P_CORR_LENGTH, 1.0);
+}
+
+IFTDistribution1D *FTDistribution1DCauchyItem::createFTDistribution() const
+{
+    return new FTDistribution1DCauchy(
+                getItemValue(P_CORR_LENGTH).toDouble() );
+}
+
+// Gauss
+FTDistribution1DGaussItem::FTDistribution1DGaussItem()
+    : FTDistribution1DItem(FTDistribution1DGaussType)
+{
+    addProperty(P_CORR_LENGTH, 1.0);
+}
+
+IFTDistribution1D *FTDistribution1DGaussItem::createFTDistribution() const
+{
+    return new FTDistribution1DGauss(
+                getItemValue(P_CORR_LENGTH).toDouble() );
+}
+
+// Gate
+FTDistribution1DGateItem::FTDistribution1DGateItem()
+    : FTDistribution1DItem(FTDistribution1DGateType)
+{
+    addProperty(P_CORR_LENGTH, 1.0);
+}
+
+IFTDistribution1D *FTDistribution1DGateItem::createFTDistribution() const
+{
+    return new FTDistribution1DGate(
+                getItemValue(P_CORR_LENGTH).toDouble() );
+}
+
+// Triangle
+FTDistribution1DTriangleItem::FTDistribution1DTriangleItem()
+    : FTDistribution1DItem(FTDistribution1DTriangleType)
+{
+    addProperty(P_CORR_LENGTH, 1.0);
+}
+
+IFTDistribution1D *FTDistribution1DTriangleItem::createFTDistribution() const
+{
+    return new FTDistribution1DTriangle(
+                getItemValue(P_CORR_LENGTH).toDouble() );
+}
+
+// Cosine
+FTDistribution1DCosineItem::FTDistribution1DCosineItem()
+    : FTDistribution1DItem(FTDistribution1DCosineType)
+{
+    addProperty(P_CORR_LENGTH, 1.0);
+}
+
+IFTDistribution1D *FTDistribution1DCosineItem::createFTDistribution() const
+{
+    return new FTDistribution1DCosine(
+                getItemValue(P_CORR_LENGTH).toDouble() );
+}
+
+// Voigt
+FTDistribution1DVoigtItem::FTDistribution1DVoigtItem()
+    : FTDistribution1DItem(FTDistribution1DVoigtType)
+{
+    addProperty(P_CORR_LENGTH, 1.0);
+    addProperty(P_ETA, 0.5)->setLimits(RealLimits::limited(0.0, 1.0));
+}
+
+IFTDistribution1D *FTDistribution1DVoigtItem::createFTDistribution() const
+{
+    return new FTDistribution1DVoigt(
+                getItemValue(P_CORR_LENGTH).toDouble(),
+                getItemValue(P_ETA).toDouble() );
+}
+
+
+//===============2D======================
+
+// Cauchy
+FTDistribution2DCauchyItem::FTDistribution2DCauchyItem()
+    : FTDistribution2DItem(FTDistribution2DCauchyType)
+{
+    addProperty(P_COHER_LENGTH_X, 1.0);
+    addProperty(P_COHER_LENGTH_Y, 1.0);
+}
+
+IFTDistribution2D *FTDistribution2DCauchyItem::createFTDistribution() const
+{
+    auto *p_result = new FTDistribution2DCauchy(
+                getItemValue(P_COHER_LENGTH_X).toDouble(),
+                getItemValue(P_COHER_LENGTH_Y).toDouble()
+                );
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble() );
+    p_result->setGamma(gamma);
+    return p_result;
+}
+
+// Gauss
+FTDistribution2DGaussItem::FTDistribution2DGaussItem()
+    : FTDistribution2DItem(FTDistribution2DGaussType)
+{
+    addProperty(P_COHER_LENGTH_X, 1.0);
+    addProperty(P_COHER_LENGTH_Y, 1.0);
+}
+
+IFTDistribution2D *FTDistribution2DGaussItem::createFTDistribution() const
+{
+    auto *p_result =  new FTDistribution2DGauss(
+                getItemValue(P_COHER_LENGTH_X).toDouble(),
+                getItemValue(P_COHER_LENGTH_Y).toDouble()
+                );
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble() );
+    p_result->setGamma(gamma);
+    return p_result;
+}
+
+// Gate
+FTDistribution2DGateItem::FTDistribution2DGateItem()
+    : FTDistribution2DItem(FTDistribution2DGateType)
+{
+    addProperty(P_COHER_LENGTH_X, 1.0);
+    addProperty(P_COHER_LENGTH_Y, 1.0);
+}
+
+IFTDistribution2D *FTDistribution2DGateItem::createFTDistribution() const
+{
+    auto *p_result = new FTDistribution2DGate(
+                getItemValue(P_COHER_LENGTH_X).toDouble(),
+                getItemValue(P_COHER_LENGTH_Y).toDouble()
+                );
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble() );
+    p_result->setGamma(gamma);
+    return p_result;
+}
+
+// Cone
+FTDistribution2DConeItem::FTDistribution2DConeItem()
+    : FTDistribution2DItem(FTDistribution2DConeType)
+{
+    addProperty(P_COHER_LENGTH_X, 1.0);
+    addProperty(P_COHER_LENGTH_Y, 1.0);
+}
+
+IFTDistribution2D *FTDistribution2DConeItem::createFTDistribution() const
+{
+    auto *p_result = new FTDistribution2DCone(
+                getItemValue(P_COHER_LENGTH_X).toDouble(),
+                getItemValue(P_COHER_LENGTH_Y).toDouble()
+                );
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble() );
+    p_result->setGamma(gamma);
+    return p_result;
+}
+
+// Voigt
+FTDistribution2DVoigtItem::FTDistribution2DVoigtItem()
+    : FTDistribution2DItem(FTDistribution2DVoigtType)
+{
+    addProperty(P_COHER_LENGTH_X, 1.0);
+    addProperty(P_COHER_LENGTH_Y, 1.0);
+    addProperty(P_ETA, 0.5)->setLimits(RealLimits::limited(0.0, 1.0));
+}
+
+IFTDistribution2D *FTDistribution2DVoigtItem::createFTDistribution() const
+{
+    auto *p_result = new FTDistribution2DVoigt(
+                getItemValue(P_COHER_LENGTH_X).toDouble(),
+                getItemValue(P_COHER_LENGTH_Y).toDouble(),
+                getItemValue(P_ETA).toDouble()
+                );
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble() );
+    p_result->setGamma(gamma);
+    return p_result;
+}
diff --git a/GUI/coregui/Models/FTDistributionItems.h b/GUI/coregui/Models/FTDistributionItems.h
new file mode 100644
index 0000000..08030d7
--- /dev/null
+++ b/GUI/coregui/Models/FTDistributionItems.h
@@ -0,0 +1,148 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FTDistributionItems.h
+//! @brief     Defines FTDistribution1DItem's classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FTDISTRIBUTIONITEMS_H
+#define FTDISTRIBUTIONITEMS_H
+
+
+#include "SessionItem.h"
+#include "FTDistributions1D.h"
+#include "FTDistributions2D.h"
+
+
+class BA_CORE_API_ FTDistribution1DItem : public SessionItem
+{
+
+public:
+    static const QString P_CORR_LENGTH;
+    explicit FTDistribution1DItem(const QString name)
+        : SessionItem(name){}
+    virtual IFTDistribution1D *createFTDistribution() const { return 0;}
+    virtual ~FTDistribution1DItem(){}
+};
+
+class BA_CORE_API_ FTDistribution1DCauchyItem : public FTDistribution1DItem
+{
+
+public:
+    explicit FTDistribution1DCauchyItem();
+    virtual IFTDistribution1D *createFTDistribution() const;
+};
+
+class BA_CORE_API_ FTDistribution1DGaussItem : public FTDistribution1DItem
+{
+
+public:
+    explicit FTDistribution1DGaussItem();
+    virtual IFTDistribution1D *createFTDistribution() const;
+};
+
+class BA_CORE_API_ FTDistribution1DGateItem : public FTDistribution1DItem
+{
+
+public:
+    explicit FTDistribution1DGateItem();
+    virtual IFTDistribution1D *createFTDistribution() const;
+};
+
+class BA_CORE_API_ FTDistribution1DTriangleItem : public FTDistribution1DItem
+{
+
+public:
+    explicit FTDistribution1DTriangleItem();
+    virtual IFTDistribution1D *createFTDistribution() const;
+};
+
+class BA_CORE_API_ FTDistribution1DCosineItem : public FTDistribution1DItem
+{
+
+public:
+    explicit FTDistribution1DCosineItem();
+    virtual IFTDistribution1D *createFTDistribution() const;
+};
+
+class BA_CORE_API_ FTDistribution1DVoigtItem : public FTDistribution1DItem
+{
+
+public:
+    static const QString P_ETA;
+    explicit FTDistribution1DVoigtItem();
+    virtual IFTDistribution1D *createFTDistribution() const;
+};
+
+class BA_CORE_API_ FTDistribution2DItem : public SessionItem
+{
+
+public:
+    static const QString P_COHER_LENGTH_X;
+    static const QString P_COHER_LENGTH_Y;
+    static const QString P_GAMMA;
+    explicit FTDistribution2DItem(const QString name)
+        : SessionItem(name) {
+        addProperty(P_GAMMA, 0.0);
+    }
+    virtual IFTDistribution2D *createFTDistribution() const { return 0;}
+    virtual ~FTDistribution2DItem(){}
+};
+
+
+class BA_CORE_API_ FTDistribution2DCauchyItem : public FTDistribution2DItem
+{
+
+public:
+    explicit FTDistribution2DCauchyItem();
+    virtual IFTDistribution2D *createFTDistribution() const;
+};
+
+
+class BA_CORE_API_ FTDistribution2DGaussItem : public FTDistribution2DItem
+{
+
+public:
+    explicit FTDistribution2DGaussItem();
+    virtual IFTDistribution2D *createFTDistribution() const;
+};
+
+
+class BA_CORE_API_ FTDistribution2DGateItem : public FTDistribution2DItem
+{
+
+public:
+    explicit FTDistribution2DGateItem();
+    virtual IFTDistribution2D *createFTDistribution() const;
+};
+
+
+class BA_CORE_API_ FTDistribution2DConeItem : public FTDistribution2DItem
+{
+
+public:
+    explicit FTDistribution2DConeItem();
+    virtual IFTDistribution2D *createFTDistribution() const;
+};
+
+
+class BA_CORE_API_ FTDistribution2DVoigtItem : public FTDistribution2DItem
+{
+
+public:
+    static const QString P_ETA;
+    explicit FTDistribution2DVoigtItem();
+    virtual IFTDistribution2D *createFTDistribution() const;
+};
+
+
+#endif // FTDISTRIBUTIONITEMS_H
diff --git a/GUI/coregui/Models/FilterPropertyProxy.cpp b/GUI/coregui/Models/FilterPropertyProxy.cpp
new file mode 100644
index 0000000..91ea5ba
--- /dev/null
+++ b/GUI/coregui/Models/FilterPropertyProxy.cpp
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FilterPropertyProxy.cpp
+//! @brief     Implements class FilterPropertyProxy
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FilterPropertyProxy.h"
+#include "SessionModel.h"
+
+int FilterPropertyProxy::columnCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return m_columns;
+}
+
+QModelIndex FilterPropertyProxy::toSourceIndex(QModelIndex index)
+{
+    FilterPropertyProxy *proxy
+        = dynamic_cast<FilterPropertyProxy *>(const_cast<QAbstractItemModel *>(index.model()));
+    if (proxy)
+        return proxy->mapToSource(index);
+    return index;
+}
+
+bool FilterPropertyProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
+{
+    QModelIndex index = sourceModel()->index(sourceRow, 1, sourceParent);
+    if (!sourceParent.isValid())
+        return true;
+    const QString modelType = index.data(SessionModel::ModelTypeRole).toString();
+    if (modelType == Constants::PropertyType || modelType == Constants::GroupItemType
+        || modelType == Constants::VectorType)
+        return false;
+
+    return true; //! sourceModel()->data(index, Qt::DisplayRole).isValid();
+}
diff --git a/GUI/coregui/Models/FilterPropertyProxy.h b/GUI/coregui/Models/FilterPropertyProxy.h
new file mode 100644
index 0000000..9a10a74
--- /dev/null
+++ b/GUI/coregui/Models/FilterPropertyProxy.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FilterPropertyProxy.h
+//! @brief     Defines class FilterPropertyProxy
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+#ifndef FILTERPROPERTYPROXY_H
+#define FILTERPROPERTYPROXY_H
+
+#include "WinDllMacros.h"
+#include <QSortFilterProxyModel>
+
+//!
+//! \brief The FilterPropertyProxy class filters out all PropertyItem's and similar from
+//! SessionModel to have only top level items
+//!
+
+class BA_CORE_API_ FilterPropertyProxy : public QSortFilterProxyModel
+{
+    Q_OBJECT
+
+public:
+    FilterPropertyProxy(int columns, QObject *parent = 0) : QSortFilterProxyModel(parent)
+        , m_columns(columns) {}
+    int columnCount(const QModelIndex &parent) const;
+
+    static QModelIndex toSourceIndex(QModelIndex index);
+
+protected:
+    bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
+
+private:
+    int m_columns;
+};
+
+#endif // FILTERPROPERTYPROXY_H
diff --git a/GUI/coregui/Models/FitParameterHelper.cpp b/GUI/coregui/Models/FitParameterHelper.cpp
new file mode 100644
index 0000000..dfd228f
--- /dev/null
+++ b/GUI/coregui/Models/FitParameterHelper.cpp
@@ -0,0 +1,132 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitParameterHelper.cpp
+//! @brief     Implements class FitModelHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameterHelper.h"
+#include "FitParameterItems.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "ModelPath.h"
+#include "ParameterTreeItems.h"
+
+//! Creates fit parameter from given ParameterItem, sets starting value to the value
+//! of ParameterItem, copies link.
+
+void FitParameterHelper::createFitParameter(FitParameterContainerItem *container,
+                                        ParameterItem *parameterItem)
+{
+    Q_ASSERT(container);
+    Q_ASSERT(parameterItem);
+
+    removeFromFitParameters(container, parameterItem);
+
+    FitParameterItem *fitPar = dynamic_cast<FitParameterItem *>(
+        container->model()->insertNewItem(Constants::FitParameterType, container->index()));
+    Q_ASSERT(fitPar);
+    fitPar->setDisplayName(QStringLiteral("par"));
+    SessionItem *link
+        = fitPar->model()->insertNewItem(Constants::FitParameterLinkType, fitPar->index());
+    fitPar->setItemValue(FitParameterItem::P_START_VALUE, parameterItem->value());
+    link->setItemValue(FitParameterLinkItem::P_LINK, getParameterItemPath(parameterItem));
+
+    fitPar->initMinMaxValues(parameterItem->getLinkedItem()->limits());
+}
+
+//! Removes link to given parameterItem from fit parameters
+
+void FitParameterHelper::removeFromFitParameters(FitParameterContainerItem *container,
+                                             ParameterItem *parameterItem)
+{
+    FitParameterItem *fitParItem = getFitParameterItem(container, parameterItem);
+
+    if (fitParItem) {
+        foreach (SessionItem *linkItem, fitParItem->getItems(FitParameterItem::T_LINK)) {
+            if (getParameterItemPath(parameterItem)
+                == linkItem->getItemValue(FitParameterLinkItem::P_LINK)) {
+                fitParItem->model()->removeRow(linkItem->index().row(), linkItem->index().parent());
+                break;
+            }
+        }
+    }
+}
+
+//! Adds given parameterItem to the existing fit parameter with display name fitParName.
+//! If parameterItem is already linked with another fitParameter, it will be relinked
+
+void FitParameterHelper::addToFitParameter(FitParameterContainerItem *container,
+                                       ParameterItem *parameterItem, const QString &fitParName)
+{
+    Q_ASSERT(container);
+
+    removeFromFitParameters(container, parameterItem);
+    foreach (SessionItem *fitPar,
+             container->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
+        if (fitPar->displayName() == fitParName) {
+            SessionItem *link
+                = fitPar->model()->insertNewItem(Constants::FitParameterLinkType, fitPar->index());
+            link->setItemValue(FitParameterLinkItem::P_LINK, getParameterItemPath(parameterItem));
+            break;
+        }
+    }
+}
+
+//! Returns fFitParameterItem corresponding to given ParameterItem
+
+FitParameterItem *FitParameterHelper::getFitParameterItem(FitParameterContainerItem *container,
+                                                      ParameterItem *parameterItem)
+{
+    Q_ASSERT(container);
+    return container->getFitParameterItem(getParameterItemPath(parameterItem));
+}
+
+//! Returns list of fit parameter display names
+
+QStringList FitParameterHelper::getFitParameterNames(FitParameterContainerItem *container)
+{
+    Q_ASSERT(container);
+    QStringList result;
+    foreach (SessionItem *item, container->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
+        result.append(item->displayName());
+    }
+    return result;
+}
+
+//! return path to given item in the ParameterTreeContainer
+
+QString FitParameterHelper::getParameterItemPath(const ParameterItem *parameterItem)
+{
+    QString result = ModelPath::getPathFromIndex(parameterItem->index());
+    QString containerPrefix = Constants::ParameterContainerType + "/";
+    int containerEnd = result.indexOf(containerPrefix) + containerPrefix.size();
+    result = result.mid(containerEnd);
+    return result;
+}
+
+//! Returns ParameterItem corresponding to given link.
+//! Link is relative to ParameterContainerItem, so first we have to find it
+
+ParameterItem *FitParameterHelper::getParameterItem(FitParameterContainerItem *container,
+                                                const QString &link)
+{
+    SessionItem *cur = container;
+    while (cur && cur->modelType() != Constants::JobItemType) {
+        cur = cur->parent();
+    }
+    Q_ASSERT(cur->modelType() == Constants::JobItemType);
+    JobItem *jobItem = dynamic_cast<JobItem *>(cur);
+    Q_ASSERT(jobItem);
+    return dynamic_cast<ParameterItem *>(
+        ModelPath::getItemFromPath(link, jobItem->parameterContainerItem()));
+}
diff --git a/GUI/coregui/Models/FitParameterHelper.h b/GUI/coregui/Models/FitParameterHelper.h
new file mode 100644
index 0000000..e8352e2
--- /dev/null
+++ b/GUI/coregui/Models/FitParameterHelper.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitParameterHelper.h
+//! @brief     Defines class FitParameterHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPARAMETERHELPER_H
+#define FITPARAMETERHELPER_H
+
+#include "WinDllMacros.h"
+#include <QStringList>
+
+class ParameterItem;
+class FitParameterItem;
+class FitParameterContainerItem;
+
+//! The FitParameterHelper class contains set of convenience static methods to handle
+//! various fitting items in given JobItem.
+
+class BA_CORE_API_ FitParameterHelper
+{
+public:
+    static void createFitParameter(FitParameterContainerItem *container,
+                                   ParameterItem *parameterItem);
+
+    static void removeFromFitParameters(FitParameterContainerItem *container,
+                                        ParameterItem *parameterItem);
+    static void addToFitParameter(FitParameterContainerItem *container,
+                                  ParameterItem *parameterItem, const QString &fitParName);
+
+    static FitParameterItem *getFitParameterItem(FitParameterContainerItem *container,
+                                                 ParameterItem *parameterItem);
+
+    static QStringList getFitParameterNames(FitParameterContainerItem *container);
+    static QString getParameterItemPath(const ParameterItem *parameterItem);
+    static ParameterItem *getParameterItem(FitParameterContainerItem *container,
+                                           const QString &link);
+};
+
+#endif // FITPARAMETERHELPER_H
diff --git a/GUI/coregui/Models/FitParameterItems.cpp b/GUI/coregui/Models/FitParameterItems.cpp
new file mode 100644
index 0000000..57259be
--- /dev/null
+++ b/GUI/coregui/Models/FitParameterItems.cpp
@@ -0,0 +1,272 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitParameterItems.cpp
+//! @brief     Implements class FitParameterItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameterItems.h"
+#include "ComboProperty.h"
+#include "GUIHelpers.h"
+#include "ModelPath.h"
+#include "ParameterTreeItems.h"
+#include <cmath>
+
+namespace
+{
+
+QStringList getFitParTypeTooltips()
+{
+    QStringList result;
+    result.append(QStringLiteral("Fixed at given value"));
+    result.append(QStringLiteral("Limited in the range [min, max]"));
+    result.append(QStringLiteral("Limited at lower bound [min, inf]"));
+    result.append(QStringLiteral("Limited at upper bound [-inf, max]"));
+    result.append(QStringLiteral("No limits imposed to parameter value"));
+    return result;
+}
+
+const double range_factor = 0.5;
+
+}
+
+
+// ----------------------------------------------------------------------------
+
+const QString FitParameterLinkItem::P_LINK = "Link";
+const QString FitParameterLinkItem::P_DOMAIN = "Domain";
+
+FitParameterLinkItem::FitParameterLinkItem()
+    : SessionItem(Constants::FitParameterLinkType)
+{
+    addProperty(P_LINK, "");
+    addProperty(P_DOMAIN, "");
+}
+
+// ----------------------------------------------------------------------------
+
+const QString FitParameterItem::P_TYPE = "Type";
+const QString FitParameterItem::P_START_VALUE = "Value";
+const QString FitParameterItem::P_MIN = "Min";
+const QString FitParameterItem::P_MAX = "Max";
+const QString FitParameterItem::T_LINK = "Link tag";
+
+FitParameterItem::FitParameterItem()
+    : SessionItem(Constants::FitParameterType)
+{
+    ComboProperty partype;
+    partype << Constants::FITPAR_FIXED << Constants::FITPAR_LIMITED
+            << Constants::FITPAR_LOWERLIMITED
+            << Constants::FITPAR_UPPERLIMITED << Constants::FITPAR_FREE;
+    partype.setValue(Constants::FITPAR_LIMITED);
+    partype.setToolTips(getFitParTypeTooltips());
+
+    addProperty(P_TYPE, partype.getVariant());
+    addProperty(P_START_VALUE, 0.0);
+    addProperty(P_MIN, 0.0);
+    addProperty(P_MAX, 0.0)->setEnabled(false);
+    registerTag(T_LINK, 0, -1, QStringList() << Constants::FitParameterLinkType);
+    setDefaultTag(T_LINK);
+
+    mapper()->setOnPropertyChange(
+                [this](const QString &name) {
+        if(name == P_TYPE)
+            onTypeChange();
+    });
+
+    onTypeChange();
+}
+
+//! Inits P_MIN and P_MAX taking into account current value and external limits
+
+void FitParameterItem::initMinMaxValues(const RealLimits &limits)
+{
+    double value = getItemValue(P_START_VALUE).toDouble();
+
+    double dr(0);
+    if(value == 0.0) {
+        dr = 1.0*range_factor;
+    } else {
+        dr = std::abs(value)*range_factor;
+    }
+
+    ComboProperty partype = getItemValue(P_TYPE).value<ComboProperty>();
+    if(partype.getValue() == Constants::FITPAR_LIMITED) {
+        double min = value - dr;
+        double max = value + dr;
+        if(limits.hasLowerLimit() && min <limits.getLowerLimit()) min = limits.getLowerLimit();
+        if(limits.hasUpperLimit() && max >limits.getUpperLimit()) max = limits.getUpperLimit();
+        setItemValue(P_MIN, min);
+        setItemValue(P_MAX, max);
+    }
+}
+
+//! Constructs Limits correspodning to current GUI settings.
+
+AttLimits FitParameterItem::getAttLimits()
+{
+    if(isFixed()) {
+        return AttLimits::fixed();
+    }
+
+    else if(isLimited()) {
+        return AttLimits::limited(getItemValue(P_MIN).toDouble(), getItemValue(P_MAX).toDouble());
+    }
+
+    else if(isLowerLimited()) {
+        return AttLimits::lowerLimited(getItemValue(P_MIN).toDouble());
+    }
+
+    else if(isUpperLimited()) {
+        return AttLimits::upperLimited(getItemValue(P_MAX).toDouble());
+    }
+
+    else if(isFree()) {
+        return AttLimits::limitless();
+    }
+
+    else {
+        throw GUIHelpers::Error("FitParameterItem::getLimits() -> Error. Unknown limit type");
+    }
+}
+
+//! Enables/disables min, max properties on FitParameterItem's type
+
+void FitParameterItem::onTypeChange()
+{
+    if(isFixed()) {
+        setLimitEnabled(P_MIN, false);
+        setLimitEnabled(P_MAX, false);
+    }
+
+    else if(isLimited()) {
+        setLimitEnabled(P_MIN, true);
+        setLimitEnabled(P_MAX, true);
+    }
+
+    else if(isLowerLimited()) {
+        setLimitEnabled(P_MIN, true);
+        setLimitEnabled(P_MAX, false);
+    }
+
+    else if(isUpperLimited()) {
+        setLimitEnabled(P_MIN, false);
+        setLimitEnabled(P_MAX, true);
+    }
+
+    else if(isFree()) {
+        setLimitEnabled(P_MIN, false);
+        setLimitEnabled(P_MAX, false);
+    }
+}
+
+//! Set limit property with given name to the enabled state
+
+void FitParameterItem::setLimitEnabled(const QString &name, bool enabled)
+{
+    if(isTag(name)) {
+        SessionItem* propertyItem = getItem(name);
+        Q_ASSERT(propertyItem);
+        propertyItem->setEnabled(enabled);
+        propertyItem->setEditable(enabled);
+    }
+}
+
+bool FitParameterItem::isLimited() const
+{
+    ComboProperty partype = getItemValue(P_TYPE).value<ComboProperty>();
+    return partype.getValue() == Constants::FITPAR_LIMITED;
+}
+
+bool FitParameterItem::isFree() const
+{
+    ComboProperty partype = getItemValue(P_TYPE).value<ComboProperty>();
+    return partype.getValue() == Constants::FITPAR_FREE;
+}
+
+bool FitParameterItem::isLowerLimited() const
+{
+    ComboProperty partype = getItemValue(P_TYPE).value<ComboProperty>();
+    return partype.getValue() == Constants::FITPAR_LOWERLIMITED;
+}
+
+bool FitParameterItem::isUpperLimited() const
+{
+    ComboProperty partype = getItemValue(P_TYPE).value<ComboProperty>();
+    return partype.getValue() == Constants::FITPAR_UPPERLIMITED;
+}
+
+bool FitParameterItem::isFixed() const
+{
+    ComboProperty partype = getItemValue(P_TYPE).value<ComboProperty>();
+    return partype.getValue() == Constants::FITPAR_FIXED;
+}
+
+// ----------------------------------------------------------------------------
+
+const QString FitParameterContainerItem::T_FIT_PARAMETERS = "Data tag";
+
+FitParameterContainerItem::FitParameterContainerItem()
+    : SessionItem(Constants::FitParameterContainerType)
+{
+    registerTag(T_FIT_PARAMETERS, 0, -1, QStringList() << Constants::FitParameterType);
+    setDefaultTag(T_FIT_PARAMETERS);
+}
+
+//! returns FitParameterItem for given link (path in model)
+FitParameterItem* FitParameterContainerItem::getFitParameterItem(const QString &link)
+{
+    foreach(SessionItem* item, getItems(T_FIT_PARAMETERS)) {
+        foreach(SessionItem* linkItem, item->getItems(FitParameterItem::T_LINK)) {
+            if(link == linkItem->getItemValue(FitParameterLinkItem::P_LINK)) {
+                return dynamic_cast<FitParameterItem*>(item);
+            }
+        }
+    }
+    return nullptr;
+}
+
+QVector<FitParameterItem*> FitParameterContainerItem::fitParameterItems()
+{
+    QVector<FitParameterItem*> result;
+    foreach(SessionItem* parItem, getItems(T_FIT_PARAMETERS))
+        result.push_back(dynamic_cast<FitParameterItem*>(parItem));
+    return result;
+}
+
+bool FitParameterContainerItem::isEmpty()
+{
+    return getItems(T_FIT_PARAMETERS).isEmpty();
+}
+
+//! Propagate values to the corresponding parameter tree items of parameterContainer.
+
+void FitParameterContainerItem::setValuesInParameterContainer(
+    const QVector<double> &values, ParameterContainerItem* parameterContainer)
+{
+    Q_ASSERT(parameterContainer);
+
+    QVector<SessionItem*> fitPars = getItems(FitParameterContainerItem::T_FIT_PARAMETERS);
+
+    if(fitPars.size() != values.size())
+        throw GUIHelpers::Error(" FitParameterContainerItem::setValuesInParameterContainer() -> "
+                                "Error. Wrong size of value vector.");
+
+    for(int i=0; i<fitPars.size(); ++i) {
+        foreach(SessionItem* linkItem, fitPars[i]->getItems(FitParameterItem::T_LINK)) {
+            QString parPath = linkItem->getItemValue(FitParameterLinkItem::P_LINK).toString();
+            SessionItem* itemInTuningTree = ModelPath::getItemFromPath(parPath, parameterContainer);
+            Q_ASSERT(itemInTuningTree);
+            itemInTuningTree->setValue(values[i]);
+        }
+    }
+}
diff --git a/GUI/coregui/Models/FitParameterItems.h b/GUI/coregui/Models/FitParameterItems.h
new file mode 100644
index 0000000..412bf27
--- /dev/null
+++ b/GUI/coregui/Models/FitParameterItems.h
@@ -0,0 +1,78 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitParameterItems.h
+//! @brief     Defines class FitParameterItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+#ifndef FITPARAMETERITEMS_H
+#define FITPARAMETERITEMS_H
+
+#include "SessionItem.h"
+#include "AttLimits.h"
+
+//! FitParameterItems is a collection of items to define fit parameters in GUI.
+
+//! The FitParameterLinkItem class holds a link to ParameterItem in tuning tree.
+
+class BA_CORE_API_ FitParameterLinkItem : public SessionItem
+{
+
+public:
+    static const QString P_LINK;
+    static const QString P_DOMAIN;
+    explicit FitParameterLinkItem();
+};
+
+//! The FitParameterItem class represents a fit parameter in GUI. Contains links to corresponding
+//! ParameterItem's in a tuning tree.
+
+class BA_CORE_API_ FitParameterItem : public SessionItem
+{
+
+public:
+    static const QString P_TYPE;
+    static const QString P_START_VALUE;
+    static const QString P_MIN;
+    static const QString P_MAX;
+    static const QString T_LINK;
+    explicit FitParameterItem();
+
+    void initMinMaxValues(const RealLimits &limits);
+
+    AttLimits getAttLimits();
+
+private:
+    void onTypeChange();
+    void setLimitEnabled(const QString &name, bool enabled);
+    bool isLimited() const;
+    bool isFree() const;
+    bool isLowerLimited() const;
+    bool isUpperLimited() const;
+    bool isFixed() const;
+};
+
+//! The FitParameterContainerItem class is a collection of all defined fit parameters in JobItem.
+
+class BA_CORE_API_ FitParameterContainerItem : public SessionItem
+{
+
+public:
+    static const QString T_FIT_PARAMETERS;
+    explicit FitParameterContainerItem();
+    FitParameterItem *getFitParameterItem(const QString &link);
+    QVector<FitParameterItem *> fitParameterItems();
+    bool isEmpty();
+    void setValuesInParameterContainer(const QVector<double> &values,
+                                       class ParameterContainerItem *parameterContainer);
+};
+
+#endif // FITPARAMETERITEMS_H
diff --git a/GUI/coregui/Models/FitParameterProxyModel.cpp b/GUI/coregui/Models/FitParameterProxyModel.cpp
new file mode 100644
index 0000000..ac890e4
--- /dev/null
+++ b/GUI/coregui/Models/FitParameterProxyModel.cpp
@@ -0,0 +1,416 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitParameterProxyModel.cpp
+//! @brief     Implements class FitParameterAbsModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameterProxyModel.h"
+#include "FitParameterHelper.h"
+#include "FitParameterItems.h"
+#include "GUIHelpers.h"
+#include "JobModel.h"
+#include "ModelPath.h"
+#include <QMimeData>
+
+
+FitParameterProxyModel::FitParameterProxyModel(FitParameterContainerItem *fitParContainer, QObject *parent)
+    : QAbstractItemModel(parent)
+    , m_root_item(fitParContainer)
+{
+    addColumn(PAR_NAME, QStringLiteral("Name"), QStringLiteral("Name of fit parameter"));
+    addColumn(PAR_TYPE, FitParameterItem::P_TYPE, QStringLiteral("Fit parameter limits type"));
+    addColumn(PAR_VALUE, FitParameterItem::P_START_VALUE, QStringLiteral("Starting value of fit parameter"));
+    addColumn(PAR_MIN, FitParameterItem::P_MIN, QStringLiteral("Lower bound on fit parameter value"));
+    addColumn(PAR_MAX, FitParameterItem::P_MAX, QStringLiteral("Upper bound on fit parameter value"));
+
+    connectModel(fitParContainer->model());
+
+    m_root_item->mapper()->setOnItemDestroy(
+                [this](SessionItem *parentItem) {
+        if(parentItem != m_root_item) {
+            throw GUIHelpers::Error("FitParameterProxyModel::FitParameterProxyModel() -> Error. "
+                                    "Wrong item reported.");
+        }
+        m_root_item = 0;
+    });
+}
+
+Qt::ItemFlags FitParameterProxyModel::flags(const QModelIndex &index) const
+{
+    if(!m_root_item) return Qt::NoItemFlags;
+
+    Qt::ItemFlags returnVal = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+    if(SessionItem *item = itemForIndex(index)) {
+        if(item->isEditable() && index.column() != 0) returnVal |= Qt::ItemIsEditable;
+        if(item->parent()->modelType() == Constants::FitParameterLinkType && index.column() == 0) {
+            returnVal |= Qt::ItemIsDragEnabled;
+        }
+
+        // TODO REDMINE #1478 > allow to drop on top of FitParameterItem as soon as 1478 resolved
+        const bool allow_one_fit_parameter_to_have_more_than_one_link = false;
+        if(allow_one_fit_parameter_to_have_more_than_one_link) {
+            // drop is allowed to fit parameter container, and, to FitParameterItem itself.
+            // (i.e. we can have more than one link in single FitParameterItem)
+            if(item->modelType() == Constants::FitParameterType || item->modelType() == Constants::FitParameterContainerType) {
+                  returnVal |= Qt::ItemIsDropEnabled;
+            }
+        } else {
+            // drop is allowed only to fit parameter container
+            // (i.e. only one link is allowed in FitParameterItem)
+            if(item->modelType() == Constants::FitParameterContainerType) {
+                returnVal |= Qt::ItemIsDropEnabled;
+            }
+        }
+
+
+    }
+
+    return returnVal;
+}
+
+QModelIndex FitParameterProxyModel::index(int row, int column, const QModelIndex &parent) const
+{
+    if (!m_root_item || row < 0 || column < 0 || column >= columnCount(QModelIndex())
+        || (parent.isValid() && parent.column() != 0))
+        return QModelIndex();
+
+    SessionItem *parent_item = itemForIndex(parent);
+//    if(!isValidSourceItem(parent_item)) return QModelIndex();
+    Q_ASSERT(parent_item);
+
+    if(parent_item->modelType() == Constants::FitParameterContainerType) {
+        if (SessionItem *fitParItem = parent_item->childAt(row)) {
+            SessionItem *itemToPack = fitParItem;
+            if(column != 0) {
+                itemToPack = fitParItem->getItem(m_columnNames.value(column));
+            }
+            return createIndex(row, column, itemToPack);
+        }
+    }
+
+    else if(parent_item->modelType() == Constants::FitParameterType && column == 0) {
+        QVector<SessionItem *> links = parent_item->getItems(FitParameterItem::T_LINK);
+        if(row < links.size()) {
+            if(SessionItem *linkItem = links.at(row)) {
+                return createIndex(row, column, linkItem->getItem(FitParameterLinkItem::P_LINK));
+            }
+        }
+    }
+
+    return QModelIndex();
+}
+
+QModelIndex FitParameterProxyModel::parent(const QModelIndex &child) const
+{
+    if(!m_root_item)
+        return QModelIndex();
+
+    if (!child.isValid())
+        return QModelIndex();
+
+    if (SessionItem *child_item = itemForIndex(child)) {
+        if (SessionItem *parent_item = child_item->parent()) {
+
+            if(!isValidSourceItem(parent_item)) return QModelIndex();
+
+            if(parent_item->modelType()==Constants::FitParameterLinkType) {
+                SessionItem *fitPar = parent_item->parent();
+
+                if(!isValidSourceItem(fitPar)) return QModelIndex();
+
+                return createIndex(fitPar->parentRow(), 0, fitPar);
+            }
+        }
+
+    }
+
+    return QModelIndex();
+}
+
+int FitParameterProxyModel::rowCount(const QModelIndex &parent) const
+{
+    if(!m_root_item) return 0;
+
+    if (parent.isValid() && parent.column() != 0)
+        return 0;
+
+    SessionItem *parent_item = itemForIndex(parent);
+    if(parent_item!=m_root_item && !isValidSourceItem(parent_item)) return 0;
+
+    if(parent_item->modelType() == Constants::FitParameterContainerType) {
+        return parent_item->rowCount();
+    }
+
+    else if(parent_item->modelType() == Constants::FitParameterType) {
+        return parent_item->getItems(FitParameterItem::T_LINK).size();
+    }
+
+    return 0;
+}
+
+int FitParameterProxyModel::columnCount(const QModelIndex &parent) const
+{
+    if(!m_root_item) return 0;
+
+    if (parent.isValid() && parent.column() != 0)
+        return 0;
+
+    if(!parent.isValid())
+        return MAX_COLUMNS;
+
+    if(parent.isValid()) {
+        if(SessionItem *parentItem = itemForIndex(parent)) {
+            if(parentItem->modelType() == Constants::FitParameterType) {
+                return (parentItem->getItems(FitParameterItem::T_LINK).size() ? 1 : 0);
+            }
+        }
+
+    }
+
+    return 0;
+}
+
+QVariant FitParameterProxyModel::data(const QModelIndex &index, int role) const
+{
+    if(!m_root_item) return QVariant();
+
+    if ( !index.isValid() || index.column() < 0 || index.column() >= MAX_COLUMNS)
+        return QVariant();
+
+    if (SessionItem *item = itemForIndex(index)) {
+        if (role == Qt::DisplayRole || role == Qt::EditRole) {
+            if(item->modelType() == Constants::FitParameterType) {
+                return item->displayName();
+            } else {
+                return item->value();
+            }
+        }
+        else if(role == Qt::TextColorRole && !item->isEditable()) {
+            return QVariant(QColor(Qt::gray));
+        }
+
+        else if(role == Qt::ToolTipRole && item->displayName() == FitParameterLinkItem::P_LINK) {
+            return item->value();
+        }
+    }
+
+    return QVariant();
+}
+
+bool FitParameterProxyModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+    if(!m_root_item) return false;
+
+    if (!index.isValid())
+        return false;
+    if (SessionItem *item = itemForIndex(index)) {
+        if (role == Qt::EditRole) {
+            item->setValue(value);
+            emit dataChanged(index, index);
+            return true;
+        }
+    }
+    return false;
+}
+
+QStringList FitParameterProxyModel::mimeTypes() const
+{
+    QStringList types;
+    types << SessionXML::LinkMimeType;
+    return types;
+}
+
+QMimeData *FitParameterProxyModel::mimeData(const QModelIndexList &indexes) const
+{
+    QMimeData *mimeData = new QMimeData();
+    QModelIndex index = indexes.first();
+    if (index.isValid()) {
+        if(SessionItem *item = itemForIndex(index)) {
+            QString path = item->value().toString();
+            mimeData->setData(SessionXML::LinkMimeType, path.toLatin1());
+        }
+    }
+    return mimeData;
+}
+
+bool FitParameterProxyModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
+{
+    Q_UNUSED(data);
+    Q_UNUSED(action);
+    Q_UNUSED(row);
+    bool drop_is_possible(false);
+    if(parent.isValid()) drop_is_possible = true;
+    if(!parent.isValid() && row==-1 && column == -1) drop_is_possible = true;
+    return drop_is_possible;
+}
+
+bool FitParameterProxyModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row,
+                                        int column, const QModelIndex &parent)
+{
+    Q_UNUSED(action);
+    Q_UNUSED(row);
+    Q_UNUSED(column);
+
+    if (parent.isValid()) {
+        if (SessionItem *fitParItem = itemForIndex(parent)) {
+            Q_ASSERT(fitParItem->modelType() == Constants::FitParameterType);
+            ParameterItem *parItem = FitParameterHelper::getParameterItem(
+                m_root_item, QString::fromLatin1(data->data(SessionXML::LinkMimeType)));
+            Q_ASSERT(parItem);
+            FitParameterHelper::addToFitParameter(m_root_item, parItem, fitParItem->displayName());
+        }
+
+    } else {
+        ParameterItem *parItem = FitParameterHelper::getParameterItem(
+            m_root_item, QString::fromLatin1(data->data(SessionXML::LinkMimeType)));
+        Q_ASSERT(parItem);
+        FitParameterHelper::createFitParameter(m_root_item, parItem);
+    }
+
+    return true;
+}
+
+QVariant FitParameterProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
+        return m_columnNames.value(section);
+    }
+    else if(role == Qt::ToolTipRole) {
+        return m_columnToolTips.value(section);
+    }
+    return QVariant();
+}
+
+void FitParameterProxyModel::onSourceDataChanged(const QModelIndex &topLeft,
+                                               const QModelIndex &bottomRight,
+                                               const QVector<int> &roles)
+{
+    Q_UNUSED(bottomRight);
+
+    JobModel *sourceModel = qobject_cast<JobModel *>(sender());
+    Q_ASSERT(sourceModel);
+    SessionItem *sourceItem = sourceModel->itemForIndex(topLeft);
+
+    QModelIndex itemIndex = indexOfItem(sourceItem);
+
+    if (itemIndex.isValid())
+        emit dataChanged(itemIndex, itemIndex, roles);
+}
+
+void FitParameterProxyModel::onSourceRowsRemoved(const QModelIndex &parent, int first, int last)
+{
+    Q_UNUSED(parent);
+    Q_UNUSED(first);
+    Q_UNUSED(last);
+    beginResetModel();
+    endResetModel();
+}
+
+void FitParameterProxyModel::onSourceAboutToBeReset()
+{
+    if(!m_root_item) return;
+    beginResetModel();
+    endResetModel();
+}
+
+void FitParameterProxyModel::connectModel(QAbstractItemModel *sourceModel, bool isConnect)
+{
+    Q_ASSERT(sourceModel);
+    if(isConnect) {
+        connect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
+                this, SLOT(onSourceDataChanged(QModelIndex,QModelIndex,QVector<int>)));
+        connect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+                   this, SLOT(onSourceRowsRemoved(QModelIndex,int,int)));
+        connect(sourceModel, SIGNAL(modelAboutToBeReset()), this, SLOT(onSourceAboutToBeReset()));
+
+    }
+
+    else {
+        disconnect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
+                this, SLOT(onSourceDataChanged(QModelIndex,QModelIndex,QVector<int>)));
+        disconnect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+                   this, SLOT(onSourceRowsRemoved(QModelIndex,int,int)));
+        disconnect(sourceModel, SIGNAL(modelAboutToBeReset()), this, SLOT(onSourceAboutToBeReset()));
+    }
+}
+
+void FitParameterProxyModel::addColumn(FitParameterProxyModel::EColumn id, const QString &name,
+                                     const QString &tooltip)
+{
+    m_columnNames[id] = name;
+    m_columnToolTips[id] = tooltip;
+}
+
+QModelIndex FitParameterProxyModel::indexOfItem(SessionItem *item) const
+{
+    if(!m_root_item) return QModelIndex();
+
+    if(SessionItem *parent_item = item->parent()) {
+        if(parent_item->modelType() == Constants::FitParameterContainerType) {
+            if(item->modelType() == Constants::FitParameterType) {
+                return createIndex(item->parentRow(), 0, item);
+            }
+        }
+
+        else if(parent_item->modelType() == Constants::FitParameterType) {
+
+            QString tag = parent_item->tagFromItem(item);
+            int col = m_columnNames.key(tag, -1);
+            if(col > 0) {
+                return createIndex(parent_item->parentRow(), col, item);
+            }
+        }
+
+        else if(parent_item->modelType() == Constants::FitParameterLinkType) {
+            QVector<SessionItem *> links = parent_item->parent()->getItems(FitParameterItem::T_LINK);
+            return createIndex(links.indexOf(parent_item), 0, item);
+        }
+
+    }
+
+    return QModelIndex();
+}
+
+SessionItem *FitParameterProxyModel::itemForIndex(const QModelIndex &index) const
+{
+    if(!m_root_item) return 0;
+
+    if (index.isValid()) {
+        SessionItem *item = static_cast<SessionItem *>(index.internalPointer());
+        if(item) {
+            if(!isValidSourceItem(item)) {
+                return 0;
+//                throw GUIHelpers::Error("FitParameterAbsModel::itemForIndex -> Error! Attempt to "
+//                                    "use destroyed item.");
+            }
+
+            return item;
+        }
+    }
+    return m_root_item;
+}
+
+SessionModel *FitParameterProxyModel::sourceModel() const
+{
+    Q_ASSERT(m_root_item);
+    return m_root_item->model();
+}
+
+//! Returns true if given item still exists in source model
+bool FitParameterProxyModel::isValidSourceItem(SessionItem *item) const
+{
+    if(item == m_root_item) return true;
+    if(sourceModel() && ModelPath::isValidItem(sourceModel(), item, m_root_item->index()))
+        return true;
+    return false;
+}
diff --git a/GUI/coregui/Models/FitParameterProxyModel.h b/GUI/coregui/Models/FitParameterProxyModel.h
new file mode 100644
index 0000000..0be7192
--- /dev/null
+++ b/GUI/coregui/Models/FitParameterProxyModel.h
@@ -0,0 +1,96 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitParameterProxyModel.h
+//! @brief     Defines class FitParameterProxyModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPARAMETERPROXYMODEL_H
+#define FITPARAMETERPROXYMODEL_H
+
+#include "WinDllMacros.h"
+#include <QAbstractItemModel>
+#include <QStringList>
+
+class SessionModel;
+class FitParameterContainerItem;
+class SessionItem;
+
+//! The FitParameterProxyModel adopt original JobModel to show items from FitParameterContainer
+//! in 5 column tree view.
+//! It is derived from QAbstractItemModel (and not from QAbstractProxyModel).
+
+class BA_CORE_API_ FitParameterProxyModel : public QAbstractItemModel
+{
+    Q_OBJECT
+
+public:
+
+    explicit FitParameterProxyModel(FitParameterContainerItem *fitParContainer, QObject *parent = 0);
+
+    enum EColumn {PAR_NAME, PAR_TYPE, PAR_VALUE, PAR_MIN, PAR_MAX, MAX_COLUMNS};
+
+    Qt::ItemFlags flags(const QModelIndex & index) const Q_DECL_OVERRIDE;
+    QModelIndex index(int row, int column, const QModelIndex &parent) const Q_DECL_OVERRIDE;
+    QModelIndex parent(const QModelIndex &child) const Q_DECL_OVERRIDE;
+    int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
+    int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
+    bool setData(const QModelIndex &index, const QVariant &value, int role) Q_DECL_OVERRIDE;
+
+    QStringList mimeTypes() const Q_DECL_OVERRIDE;
+    Qt::DropActions supportedDragActions() const Q_DECL_OVERRIDE;
+    Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE;
+    QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE;
+    bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
+                             const QModelIndex &parent) const Q_DECL_OVERRIDE;
+    bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
+                        const QModelIndex &parent)  Q_DECL_OVERRIDE;
+
+
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE;
+
+
+    QModelIndex indexOfItem(SessionItem *item) const;
+    SessionItem *itemForIndex(const QModelIndex &index) const;
+
+    SessionModel *sourceModel() const;
+
+    bool isValidSourceItem(SessionItem *item) const;
+
+private slots:
+    void onSourceDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight,
+                             const QVector<int> & roles);
+    void onSourceRowsRemoved(const QModelIndex & parent, int first, int last);
+    void onSourceAboutToBeReset();
+
+private:
+    void connectModel(QAbstractItemModel *sourceModel, bool isConnect = true);
+    void addColumn(EColumn id, const QString &name, const QString &tooltip);
+
+    FitParameterContainerItem *m_root_item;
+    QMap<int, QString> m_columnNames;
+    QMap<int, QString> m_columnToolTips;
+};
+
+inline Qt::DropActions FitParameterProxyModel::supportedDragActions() const
+{
+    return Qt::MoveAction | Qt::CopyAction;
+}
+
+inline Qt::DropActions FitParameterProxyModel::supportedDropActions() const
+{
+    return Qt::MoveAction | Qt::CopyAction;
+}
+
+
+#endif // FITPARAMETERPROXYMODEL_H
diff --git a/GUI/coregui/Models/FitSuiteItem.cpp b/GUI/coregui/Models/FitSuiteItem.cpp
new file mode 100644
index 0000000..2f069e6
--- /dev/null
+++ b/GUI/coregui/Models/FitSuiteItem.cpp
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitSuiteItem.cpp
+//! @brief     Implements class FitSuiteItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuiteItem.h"
+#include "FitParameterItems.h"
+#include "MinimizerItem.h"
+
+const QString FitSuiteItem::P_UPDATE_INTERVAL = "Update interval";
+const QString FitSuiteItem::P_ITERATION_COUNT = "Number of iterations";
+const QString FitSuiteItem::P_CHI2 = "Chi2";
+const QString FitSuiteItem::T_FIT_PARAMETERS = "Fit parameters container";
+const QString FitSuiteItem::T_MINIMIZER = "Minimizer settings";
+
+
+FitSuiteItem::FitSuiteItem()
+    : SessionItem(Constants::FitSuiteType)
+{
+    addProperty(P_UPDATE_INTERVAL, 10);
+    addProperty(P_ITERATION_COUNT, 0);
+    addProperty(P_CHI2, 0.0);
+
+    registerTag(T_FIT_PARAMETERS, 1, 1, QStringList() << Constants::FitParameterContainerType);
+    registerTag(T_MINIMIZER, 1, 1, QStringList() << Constants::MinimizerContainerType);
+}
+
+FitParameterContainerItem *FitSuiteItem::fitParameterContainerItem()
+{
+    return dynamic_cast<FitParameterContainerItem *>(getItem(FitSuiteItem::T_FIT_PARAMETERS));
+}
+
+MinimizerContainerItem *FitSuiteItem::minimizerContainerItem()
+{
+    return dynamic_cast<MinimizerContainerItem *>(getItem(FitSuiteItem::T_MINIMIZER));
+}
+
+//std::unique_ptr<FitSuite> FitSuiteItem::createFitSuite()
+//{
+//    std::unique_ptr<FitSuite> result(new FitSuite);
+
+////    SessionItem *container = getItem(T_FIT_PARAMETERS);
+////    Q_ASSERT(container);
+
+////    foreach(SessionItem *parItem, container->getItems(T_FIT_PARAMETERS)) {
+
+////    }
+
+//    return std::move(result);
+//}
diff --git a/GUI/coregui/Models/FitSuiteItem.h b/GUI/coregui/Models/FitSuiteItem.h
new file mode 100644
index 0000000..0aca440
--- /dev/null
+++ b/GUI/coregui/Models/FitSuiteItem.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FitSuiteItem.h
+//! @brief     Defines class FitSuiteItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITEITEM_H
+#define FITSUITEITEM_H
+
+#include "SessionItem.h"
+
+class FitParameterContainerItem;
+class MinimizerContainerItem;
+
+class BA_CORE_API_ FitSuiteItem : public SessionItem
+{
+
+public:
+    static const QString P_UPDATE_INTERVAL;
+    static const QString P_ITERATION_COUNT;
+    static const QString P_CHI2;
+    static const QString T_FIT_PARAMETERS;
+    static const QString T_MINIMIZER;
+    explicit FitSuiteItem();
+
+    FitParameterContainerItem *fitParameterContainerItem();
+    MinimizerContainerItem *minimizerContainerItem();
+//    std::unique_ptr<FitSuite> createFitSuite();
+};
+
+#endif // FITSUITEITEM_H
diff --git a/GUI/coregui/Models/FormFactorItems.cpp b/GUI/coregui/Models/FormFactorItems.cpp
new file mode 100644
index 0000000..81460c2
--- /dev/null
+++ b/GUI/coregui/Models/FormFactorItems.cpp
@@ -0,0 +1,480 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FormFactorItems.cpp
+//! @brief     Implements FormFactorItems classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FormFactorItems.h"
+#include "BornAgainNamespace.h"
+#include "FormFactors.h"
+#include "GUIHelpers.h"
+#include "Units.h"
+
+/* ------------------------------------------------ */
+
+const QString AnisoPyramidItem::P_LENGTH = QString::fromStdString(BornAgain::Length);
+const QString AnisoPyramidItem::P_WIDTH = QString::fromStdString(BornAgain::Width);
+const QString AnisoPyramidItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString AnisoPyramidItem::P_ALPHA = QString::fromStdString(BornAgain::Alpha);
+
+AnisoPyramidItem::AnisoPyramidItem()
+    : FormFactorItem(Constants::AnisoPyramidType)
+{
+    addProperty(P_LENGTH, 20.0);
+    addProperty(P_WIDTH, 16.0);
+    addProperty(P_HEIGHT, 13.0);
+    addProperty(P_ALPHA, 60.0);
+}
+
+std::unique_ptr<IFormFactor> AnisoPyramidItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorAnisoPyramid>(
+                getItemValue(P_LENGTH).toDouble(),
+                getItemValue(P_WIDTH).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_ALPHA).toDouble()*Units::degree
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString BoxItem::P_LENGTH = QString::fromStdString(BornAgain::Length);
+const QString BoxItem::P_WIDTH = QString::fromStdString(BornAgain::Width);
+const QString BoxItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+BoxItem::BoxItem()
+    : FormFactorItem(Constants::BoxType)
+{
+    addProperty(P_LENGTH, 20.0);
+    addProperty(P_WIDTH, 16.0);
+    addProperty(P_HEIGHT, 13.0);
+}
+
+std::unique_ptr<IFormFactor> BoxItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorBox>(
+                getItemValue(P_LENGTH).toDouble(),
+                getItemValue(P_WIDTH).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString ConeItem::P_RADIUS = QString::fromStdString(BornAgain::Radius);
+const QString ConeItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString ConeItem::P_ALPHA = QString::fromStdString(BornAgain::Alpha);
+
+ConeItem::ConeItem()
+    : FormFactorItem(Constants::ConeType)
+{
+    addProperty(P_RADIUS, 10.0);
+    addProperty(P_HEIGHT, 13.0);
+    addProperty(P_ALPHA, 60.0);
+}
+
+std::unique_ptr<IFormFactor> ConeItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorCone>(
+                getItemValue(P_RADIUS).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_ALPHA).toDouble()*Units::degree
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString Cone6Item::P_BASEEDGE = QString::fromStdString(BornAgain::BaseEdge);
+const QString Cone6Item::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString Cone6Item::P_ALPHA = QString::fromStdString(BornAgain::Alpha);
+
+Cone6Item::Cone6Item()
+    : FormFactorItem(Constants::Cone6Type)
+{
+    addProperty(P_BASEEDGE, 10.0);
+    addProperty(P_HEIGHT, 13.0);
+    addProperty(P_ALPHA, 60.0);
+}
+
+std::unique_ptr<IFormFactor> Cone6Item::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorCone6>(
+                getItemValue(P_BASEEDGE).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_ALPHA).toDouble()*Units::degree
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString CuboctahedronItem::P_LENGTH = QString::fromStdString(BornAgain::Length);
+const QString CuboctahedronItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString CuboctahedronItem::P_HEIGHT_RATIO = QString::fromStdString(BornAgain::HeightRatio);
+const QString CuboctahedronItem::P_ALPHA = QString::fromStdString(BornAgain::Alpha);
+
+CuboctahedronItem::CuboctahedronItem()
+    : FormFactorItem(Constants::CuboctahedronType)
+{
+    addProperty(P_LENGTH, 20.0);
+    addProperty(P_HEIGHT, 13.0);
+    addProperty(P_HEIGHT_RATIO, 0.7)->setLimits(RealLimits::lowerLimited(0.0));
+    addProperty(P_ALPHA, 60.0);
+}
+
+std::unique_ptr<IFormFactor> CuboctahedronItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorCuboctahedron>(
+                getItemValue(P_LENGTH).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_HEIGHT_RATIO).toDouble(),
+                getItemValue(P_ALPHA).toDouble()*Units::degree
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString CylinderItem::P_RADIUS = QString::fromStdString(BornAgain::Radius);
+const QString CylinderItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+CylinderItem::CylinderItem()
+    : FormFactorItem(Constants::CylinderType)
+{
+    addProperty(P_RADIUS, 8.0);
+    addProperty(P_HEIGHT, 16.0);
+}
+
+std::unique_ptr<IFormFactor> CylinderItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorCylinder>(
+                getItemValue(P_RADIUS).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString DodecahedronItem::P_EDGE = QString::fromStdString(BornAgain::Edge);
+
+DodecahedronItem::DodecahedronItem()
+    : FormFactorItem(Constants::DodecahedronType)
+{
+    addProperty(P_EDGE, 10.0);
+}
+
+std::unique_ptr<IFormFactor> DodecahedronItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorDodecahedron>(
+                getItemValue(P_EDGE).toDouble()
+                );
+}
+
+
+/* ------------------------------------------------ */
+
+const QString EllipsoidalCylinderItem::P_RADIUS_X = QString::fromStdString(BornAgain::RadiusX);
+const QString EllipsoidalCylinderItem::P_RADIUS_Y = QString::fromStdString(BornAgain::RadiusY);
+const QString EllipsoidalCylinderItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+EllipsoidalCylinderItem::EllipsoidalCylinderItem()
+    : FormFactorItem(Constants::EllipsoidalCylinderType)
+{
+    addProperty(P_RADIUS_X, 8.0);
+    addProperty(P_RADIUS_Y, 13.0);
+    addProperty(P_HEIGHT, 16.0);
+}
+
+std::unique_ptr<IFormFactor> EllipsoidalCylinderItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorEllipsoidalCylinder>(
+                getItemValue(P_RADIUS_X).toDouble(),
+                getItemValue(P_RADIUS_Y).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString FullSphereItem::P_RADIUS = QString::fromStdString(BornAgain::Radius);
+
+FullSphereItem::FullSphereItem()
+    : FormFactorItem(Constants::FullSphereType)
+{
+    addProperty(P_RADIUS, 8.0);
+}
+
+std::unique_ptr<IFormFactor> FullSphereItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorFullSphere>(
+                getItemValue(P_RADIUS).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString FullSpheroidItem::P_RADIUS = QString::fromStdString(BornAgain::Radius);
+const QString FullSpheroidItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+FullSpheroidItem::FullSpheroidItem()
+    : FormFactorItem(Constants::FullSpheroidType)
+{
+    addProperty(P_RADIUS, 10.0);
+    addProperty(P_HEIGHT, 13.0);
+}
+
+std::unique_ptr<IFormFactor> FullSpheroidItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorFullSpheroid>(
+                getItemValue(P_RADIUS).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString HemiEllipsoidItem::P_RADIUS_X = QString::fromStdString(BornAgain::RadiusX);
+const QString HemiEllipsoidItem::P_RADIUS_Y = QString::fromStdString(BornAgain::RadiusY);
+const QString HemiEllipsoidItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+HemiEllipsoidItem::HemiEllipsoidItem()
+    : FormFactorItem(Constants::HemiEllipsoidType)
+{
+    addProperty(P_RADIUS_X, 10.0);
+    addProperty(P_RADIUS_Y, 6.0);
+    addProperty(P_HEIGHT, 8.0);
+}
+
+std::unique_ptr<IFormFactor> HemiEllipsoidItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorHemiEllipsoid>(
+                getItemValue(P_RADIUS_X).toDouble(),
+                getItemValue(P_RADIUS_Y).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString IcosahedronItem::P_EDGE = QString::fromStdString(BornAgain::Edge);
+
+IcosahedronItem::IcosahedronItem()
+    : FormFactorItem(Constants::IcosahedronType)
+{
+    addProperty(P_EDGE, 10.0);
+}
+
+std::unique_ptr<IFormFactor> IcosahedronItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorIcosahedron>(
+                getItemValue(P_EDGE).toDouble()
+                );
+}
+
+
+/* ------------------------------------------------ */
+
+const QString Prism3Item::P_BASEEDGE = QString::fromStdString(BornAgain::BaseEdge);
+const QString Prism3Item::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+Prism3Item::Prism3Item()
+    : FormFactorItem(Constants::Prism3Type)
+{
+    addProperty(P_BASEEDGE, 10.0);
+    addProperty(P_HEIGHT, 13.0);
+}
+
+std::unique_ptr<IFormFactor> Prism3Item::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorPrism3>(
+                getItemValue(P_BASEEDGE).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString Prism6Item::P_BASEEDGE = QString::fromStdString(BornAgain::BaseEdge);
+const QString Prism6Item::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+Prism6Item::Prism6Item()
+    : FormFactorItem(Constants::Prism6Type)
+{
+    addProperty(P_BASEEDGE, 5.0);
+    addProperty(P_HEIGHT, 11.0);
+}
+
+std::unique_ptr<IFormFactor> Prism6Item::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorPrism6>(
+                getItemValue(P_BASEEDGE).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString PyramidItem::P_BASEEDGE = QString::fromStdString(BornAgain::BaseEdge);
+const QString PyramidItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString PyramidItem::P_ALPHA = QString::fromStdString(BornAgain::Alpha);
+
+PyramidItem::PyramidItem()
+    : FormFactorItem(Constants::PyramidType)
+{
+    addProperty(P_BASEEDGE, 18.0);
+    addProperty(P_HEIGHT, 13.0);
+    addProperty(P_ALPHA, 60.0);
+}
+
+std::unique_ptr<IFormFactor> PyramidItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorPyramid>(
+                getItemValue(P_BASEEDGE).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_ALPHA).toDouble()*Units::degree
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString Ripple1Item::P_LENGTH = QString::fromStdString(BornAgain::Length);
+const QString Ripple1Item::P_WIDTH = QString::fromStdString(BornAgain::Width);
+const QString Ripple1Item::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+Ripple1Item::Ripple1Item()
+    : FormFactorItem(Constants::Ripple1Type)
+{
+    addProperty(P_LENGTH, 27.0);
+    addProperty(P_WIDTH, 20.0);
+    addProperty(P_HEIGHT, 14.0);
+}
+
+std::unique_ptr<IFormFactor> Ripple1Item::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorRipple1>(
+                getItemValue(P_LENGTH).toDouble(),
+                getItemValue(P_WIDTH).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString Ripple2Item::P_LENGTH = QString::fromStdString(BornAgain::Length);
+const QString Ripple2Item::P_WIDTH = QString::fromStdString(BornAgain::Width);
+const QString Ripple2Item::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString Ripple2Item::P_ASYMMETRY = QString::fromStdString(BornAgain::AsymmetryLength);
+
+Ripple2Item::Ripple2Item()
+    : FormFactorItem(Constants::Ripple2Type)
+{
+    addProperty(P_LENGTH, 36.0);
+    addProperty(P_WIDTH, 25.0);
+    addProperty(P_HEIGHT, 14.0);
+    addProperty(P_ASYMMETRY, 3.0);
+}
+
+std::unique_ptr<IFormFactor> Ripple2Item::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorRipple2>(
+                getItemValue(P_LENGTH).toDouble(),
+                getItemValue(P_WIDTH).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_ASYMMETRY).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString TetrahedronItem::P_BASEEDGE = QString::fromStdString(BornAgain::BaseEdge);
+const QString TetrahedronItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString TetrahedronItem::P_ALPHA = QString::fromStdString(BornAgain::Alpha);
+
+TetrahedronItem::TetrahedronItem()
+    : FormFactorItem(Constants::TetrahedronType)
+{
+    addProperty(P_BASEEDGE, 15.0);
+    addProperty(P_HEIGHT, 6.0);
+    addProperty(P_ALPHA, 60.0);
+}
+
+std::unique_ptr<IFormFactor> TetrahedronItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorTetrahedron>(
+                getItemValue(P_BASEEDGE).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_ALPHA).toDouble()*Units::degree
+                );
+}
+
+
+/* ------------------------------------------------ */
+
+const QString TruncatedCubeItem::P_LENGTH = QString::fromStdString(BornAgain::Length);
+const QString TruncatedCubeItem::P_REMOVED_LENGTH = QString::fromStdString(BornAgain::RemovedLength);
+
+TruncatedCubeItem::TruncatedCubeItem()
+    : FormFactorItem(Constants::TruncatedCubeType)
+{
+    addProperty(P_LENGTH, 15.0);
+    addProperty(P_REMOVED_LENGTH, 6.0);
+}
+
+std::unique_ptr<IFormFactor> TruncatedCubeItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorTruncatedCube>(
+                getItemValue(P_LENGTH).toDouble(),
+                getItemValue(P_REMOVED_LENGTH).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString TruncatedSphereItem::P_RADIUS = QString::fromStdString(BornAgain::Radius);
+const QString TruncatedSphereItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+
+TruncatedSphereItem::TruncatedSphereItem()
+    : FormFactorItem(Constants::TruncatedSphereType)
+{
+    addProperty(P_RADIUS, 5.0);
+    addProperty(P_HEIGHT, 7.0);
+}
+
+std::unique_ptr<IFormFactor> TruncatedSphereItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorTruncatedSphere>(
+                getItemValue(P_RADIUS).toDouble(),
+                getItemValue(P_HEIGHT).toDouble()
+                );
+}
+
+/* ------------------------------------------------ */
+
+const QString TruncatedSpheroidItem::P_RADIUS = QString::fromStdString(BornAgain::Radius);
+const QString TruncatedSpheroidItem::P_HEIGHT = QString::fromStdString(BornAgain::Height);
+const QString TruncatedSpheroidItem::P_HFC = QString::fromStdString(BornAgain::HeightFlattening);
+
+TruncatedSpheroidItem::TruncatedSpheroidItem()
+    : FormFactorItem(Constants::TruncatedSpheroidType)
+{
+    addProperty(P_RADIUS, 7.5);
+    addProperty(P_HEIGHT, 9.0);
+    addProperty(P_HFC, 1.2);
+}
+
+std::unique_ptr<IFormFactor> TruncatedSpheroidItem::createFormFactor() const
+{
+    return GUIHelpers::make_unique<FormFactorTruncatedSpheroid>(
+                getItemValue(P_RADIUS).toDouble(),
+                getItemValue(P_HEIGHT).toDouble(),
+                getItemValue(P_HFC).toDouble()
+                );
+}
diff --git a/GUI/coregui/Models/FormFactorItems.h b/GUI/coregui/Models/FormFactorItems.h
new file mode 100644
index 0000000..5e3b190
--- /dev/null
+++ b/GUI/coregui/Models/FormFactorItems.h
@@ -0,0 +1,254 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/FormFactorItems.h
+//! @brief     Defines FormFactorItems classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FORMFACTORITEMS_H
+#define FORMFACTORITEMS_H
+
+#include "SessionItem.h"
+
+
+class IFormFactor;
+
+class BA_CORE_API_ FormFactorItem : public SessionItem
+{
+public:
+    explicit FormFactorItem(const QString &model_type)
+        : SessionItem(model_type) {}
+    virtual std::unique_ptr<IFormFactor> createFormFactor() const=0;
+};
+
+
+class BA_CORE_API_ AnisoPyramidItem : public FormFactorItem
+{
+public:
+    static const QString P_LENGTH;
+    static const QString P_WIDTH;
+    static const QString P_HEIGHT;
+    static const QString P_ALPHA;
+    explicit AnisoPyramidItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ BoxItem : public FormFactorItem
+{
+public:
+    static const QString P_LENGTH;
+    static const QString P_WIDTH;
+    static const QString P_HEIGHT;
+    explicit BoxItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ ConeItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS;
+    static const QString P_HEIGHT;
+    static const QString P_ALPHA;
+    explicit ConeItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ Cone6Item : public FormFactorItem
+{
+public:
+    static const QString P_BASEEDGE;
+    static const QString P_HEIGHT;
+    static const QString P_ALPHA;
+    explicit Cone6Item();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ CuboctahedronItem : public FormFactorItem
+{
+public:
+    static const QString P_LENGTH;
+    static const QString P_HEIGHT;
+    static const QString P_HEIGHT_RATIO;
+    static const QString P_ALPHA;
+    explicit CuboctahedronItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ DodecahedronItem : public FormFactorItem
+{public:
+    static const QString P_EDGE;
+    explicit DodecahedronItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ CylinderItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS;
+    static const QString P_HEIGHT;
+    explicit CylinderItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ EllipsoidalCylinderItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS_X;
+    static const QString P_RADIUS_Y;
+    static const QString P_HEIGHT;
+    explicit EllipsoidalCylinderItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ FullSphereItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS;
+    explicit FullSphereItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ FullSpheroidItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS;
+    static const QString P_HEIGHT;
+    explicit FullSpheroidItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ HemiEllipsoidItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS_X;
+    static const QString P_RADIUS_Y;
+    static const QString P_HEIGHT;
+    explicit HemiEllipsoidItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ IcosahedronItem : public FormFactorItem
+{public:
+    static const QString P_EDGE;
+    explicit IcosahedronItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ Prism3Item : public FormFactorItem
+{
+public:
+    static const QString P_BASEEDGE;
+    static const QString P_HEIGHT;
+    explicit Prism3Item();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ Prism6Item : public FormFactorItem
+{
+public:
+    static const QString P_BASEEDGE;
+    static const QString P_HEIGHT;
+    explicit Prism6Item();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ PyramidItem : public FormFactorItem
+{
+public:
+    static const QString P_BASEEDGE;
+    static const QString P_HEIGHT;
+    static const QString P_ALPHA;
+    explicit PyramidItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ Ripple1Item : public FormFactorItem
+{
+public:
+    static const QString P_LENGTH;
+    static const QString P_WIDTH;
+    static const QString P_HEIGHT;
+    explicit Ripple1Item();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ Ripple2Item : public FormFactorItem
+{
+public:
+    static const QString P_LENGTH;
+    static const QString P_WIDTH;
+    static const QString P_HEIGHT;
+    static const QString P_ASYMMETRY;
+    explicit Ripple2Item();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ TetrahedronItem : public FormFactorItem
+{
+public:
+    static const QString P_BASEEDGE;
+    static const QString P_HEIGHT;
+    static const QString P_ALPHA;
+    explicit TetrahedronItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ TruncatedCubeItem : public FormFactorItem
+{
+public:
+    static const QString P_LENGTH;
+    static const QString P_REMOVED_LENGTH;
+    explicit TruncatedCubeItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ TruncatedSphereItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS;
+    static const QString P_HEIGHT;
+    explicit TruncatedSphereItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+class BA_CORE_API_ TruncatedSpheroidItem : public FormFactorItem
+{
+public:
+    static const QString P_RADIUS;
+    static const QString P_HEIGHT;
+    static const QString P_HFC;
+    explicit TruncatedSpheroidItem();
+    std::unique_ptr<IFormFactor> createFormFactor() const;
+};
+
+
+#endif // FORMFACTORITEMS_H
diff --git a/GUI/coregui/Models/GUIExamplesFactory.cpp b/GUI/coregui/Models/GUIExamplesFactory.cpp
new file mode 100644
index 0000000..6c09a9c
--- /dev/null
+++ b/GUI/coregui/Models/GUIExamplesFactory.cpp
@@ -0,0 +1,83 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GUIExamplesFactory.cpp
+//! @brief     Implements class GUIExamplesFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUIExamplesFactory.h"
+#include "GUIObjectBuilder.h"
+#include "MultiLayer.h"
+#include "SampleBuilderFactory.h"
+#include <memory>
+
+//! Defines correspondance between example name and real name of simulation from SimulationFactory
+QMap<QString, QString > init_NameToRegistry()
+{
+    QMap<QString, QString > result;
+    result["example01"] = "CylindersAndPrismsBuilder";
+    result["example02"] = "RadialParaCrystalBuilder";
+    result["example03"] = "HexParaCrystalBuilder";
+    result["example04"] = "CoreShellParticleBuilder";
+    result["example05"] = "MultiLayerWithRoughnessBuilder";
+    result["example06"] = "SquareLatticeBuilder";
+    result["example07"] = "RotatedPyramidsBuilder";
+    result["example08"] = "CylindersWithSizeDistributionBuilder";
+    result["example09"] = "ParticleCompositionBuilder";
+
+    // temporary for testing
+    //result["example09"] = "MultipleLayoutBuilder";
+    //result["example09"] = "TwoTypesCylindersDistributionBuilder";
+    //result["example09"] = "RectParaCrystalBuilder";
+    //result["example09"] = "SizeDistributionLMAModelBuilder";
+    //result["example09"] = "CylindersInSSCABuilder";
+    //result["example09"] = "TransformBoxBuilder";
+    //result["example09"] = "BoxCompositionRotateZandYBuilder";
+    //result["example09"] = "CoreShellBoxRotateZandYBuilder";
+    //result["example09"] = "BoxStackCompositionBuilder";
+    //result["example09"] = "CylindersWithSizeDistributionBuilder";
+    //result["example09"] = "LargeCylindersInDWBABuilder";
+
+
+    return result;
+}
+
+QMap<QString, QString> GUIExamplesFactory::m_name_to_registry = init_NameToRegistry();
+
+bool GUIExamplesFactory::isValidExampleName(const QString &name)
+{
+    return m_name_to_registry.contains(name);
+}
+
+//! Populate sample model with
+SessionItem *GUIExamplesFactory::createSampleItems(const QString &name, SampleModel *sampleModel)
+{
+    QString exampleName = m_name_to_registry[name];
+
+    SampleBuilderFactory factory;
+    const std::unique_ptr<ISample> sample(factory.createSample(exampleName.toStdString()));
+
+    GUIObjectBuilder guiBuilder;
+    return guiBuilder.populateSampleModel(sampleModel, *sample.get(), name);
+}
+
+//SessionItem *GUIExamplesFactory::createInstrumentItems(const QString &name, InstrumentModel *instrumentModel)
+//{
+//    QString exampleName = m_name_to_registry[name];
+//    SimulationFactory registry;
+//    const std::unique_ptr<GISASSimulation> P_simulation(registry.createSimulation(exampleName.toStdString()));
+//    Q_ASSERT(P_simulation.get());
+
+//    QString instrumentName = name + "_instrument";
+//    GUIObjectBuilder guiBuilder;
+//    return guiBuilder.populateInstrumentModel(instrumentModel, *P_simulation, instrumentName);
+//}
diff --git a/GUI/coregui/Models/GUIExamplesFactory.h b/GUI/coregui/Models/GUIExamplesFactory.h
new file mode 100644
index 0000000..cbd906c
--- /dev/null
+++ b/GUI/coregui/Models/GUIExamplesFactory.h
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GUIExamplesFactory.h
+//! @brief     Defines class GUIExamplesFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GUIEXAMPLESFACTORY_H
+#define GUIEXAMPLESFACTORY_H
+
+#include "WinDllMacros.h"
+#include <QMap>
+
+class SessionItem;
+class SampleModel;
+
+//! Class that generates GUI model from
+class BA_CORE_API_ GUIExamplesFactory
+{
+public:
+    static bool isValidExampleName(const QString &name);
+
+    static SessionItem *createSampleItems(const QString &name, SampleModel *sampleModel);
+//    static SessionItem *createInstrumentItems(const QString &name, InstrumentModel *instrumentModel);
+
+private:
+    static QMap<QString, QString> m_name_to_registry;
+    //!< correspondance of GUI example name and name from StandardSamples registry
+};
+
+
+#endif // GUIEXAMPLESFACTORY_H
+
diff --git a/GUI/coregui/Models/GUIObjectBuilder.cpp b/GUI/coregui/Models/GUIObjectBuilder.cpp
new file mode 100644
index 0000000..39ff262
--- /dev/null
+++ b/GUI/coregui/Models/GUIObjectBuilder.cpp
@@ -0,0 +1,689 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GUIObjectBuilder.cpp
+//! @brief     Implements class GUIObjectBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUIObjectBuilder.h"
+#include "BeamDistributionItem.h"
+#include "BeamItem.h"
+#include "BornAgainNamespace.h"
+#include "ComboProperty.h"
+#include "Crystal.h"
+#include "DetectorItems.h"
+#include "DocumentModel.h"
+#include "FormFactorItems.h"
+#include "FormFactors.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "IMaterial.h"
+#include "InstrumentModel.h"
+#include "IMultiLayerBuilder.h"
+#include "Layer.h"
+#include "LayerItem.h"
+#include "MaterialModel.h"
+#include "MaterialSvc.h"
+#include "MaterialUtils.h"
+#include "MultiLayer.h"
+#include "MultiLayerItem.h"
+#include "ParticleComposition.h"
+#include "ParticleCoreShellItem.h"
+#include "ParticleDistributionItem.h"
+#include "ParticleItem.h"
+#include "ParticleLayout.h"
+#include "ParticleLayoutItem.h"
+#include "RectangularDetector.h"
+#include "RotationItems.h"
+#include "SampleModel.h"
+#include "SimulationOptionsItem.h"
+#include "SphericalDetector.h"
+#include "TransformFromDomain.h"
+#include "TransformationItem.h"
+#include "Units.h"
+#include "VectorItem.h"
+#include <QDebug>
+
+GUIObjectBuilder::GUIObjectBuilder()
+    : m_sampleModel(0)
+{
+}
+
+SessionItem* GUIObjectBuilder::populateSampleModel(
+    SampleModel* sampleModel, const GISASSimulation& simulation, const QString& sampleName)
+{
+    std::unique_ptr<ISample> P_sample;
+    if(simulation.getSampleBuilder()) {
+        P_sample.reset(simulation.getSampleBuilder()->buildSample());
+    } else if(simulation.getSample()) {
+        P_sample.reset(simulation.getSample()->clone());
+    } else {
+        throw GUIHelpers::Error("GUIObjectBuilder::populateSampleModel() -> No valid sample");
+    }
+
+    return populateSampleModel(sampleModel,* P_sample, sampleName);
+}
+
+SessionItem* GUIObjectBuilder::populateSampleModel(
+    SampleModel* sampleModel, const ISample& sample, const QString& sampleName)
+{
+    Q_ASSERT(sampleModel);
+
+    m_levelToParentItem.clear();
+
+    m_topSampleName = sampleName;
+    if(m_topSampleName.isEmpty()) m_topSampleName = sample.getName().c_str();
+
+    m_sampleModel = sampleModel;
+
+    VisitSampleTreePreorder(sample, *this);
+    SessionItem* result = m_levelToParentItem[1];
+
+    result->setItemName(m_topSampleName);
+    return result;
+}
+
+SessionItem* GUIObjectBuilder::populateInstrumentModel(
+    InstrumentModel* instrumentModel,
+    const GISASSimulation& simulation, const QString& instrumentName)
+{
+    Q_ASSERT(instrumentModel);
+    SessionItem* instrumentItem =
+            instrumentModel->insertNewItem(Constants::InstrumentType);
+
+    if(instrumentName.isEmpty()) {
+        instrumentItem->setItemName(simulation.getInstrument().getName().c_str());
+    } else {
+        instrumentItem->setItemName(instrumentName);
+    }
+
+    // beam
+    BeamItem* beamItem = dynamic_cast<BeamItem*>(instrumentModel->insertNewItem(
+                Constants::BeamType,
+                instrumentModel->indexOfItem(instrumentItem)));
+
+    TransformFromDomain::setItemFromSample(beamItem, simulation);
+
+    // detector
+    DetectorItem* detectorItem = dynamic_cast<DetectorItem*>(instrumentModel->insertNewItem(
+        Constants::DetectorType, instrumentModel->indexOfItem(instrumentItem)));
+    TransformFromDomain::setItemFromSample(detectorItem, simulation);
+
+    // detector masks
+    TransformFromDomain::setDetectorMasks(detectorItem, simulation);
+
+
+    return instrumentItem;
+}
+
+SessionItem* GUIObjectBuilder::populateDocumentModel(DocumentModel* documentModel,
+                                                     const GISASSimulation& simulation)
+{
+    SimulationOptionsItem* optionsItem = dynamic_cast<SimulationOptionsItem*>(
+            documentModel->insertNewItem(Constants::SimulationOptionsType));
+    Q_ASSERT(optionsItem);
+    if(simulation.getOptions().isIntegrate()) {
+        optionsItem->setComputationMethod(Constants::SIMULATION_MONTECARLO);
+        optionsItem->setNumberOfMonteCarloPoints(simulation.getOptions().getMcPoints());
+    }
+    return optionsItem;
+}
+
+
+void GUIObjectBuilder::visit(const ParticleLayout* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const ParticleLayout*)"  << getLevel();
+    SessionItem* parent = m_levelToParentItem[getLevel()-1];
+    SessionItem* item(0);
+    if (parent) {
+        item = m_sampleModel->insertNewItem(Constants::ParticleLayoutType,
+                                         m_sampleModel->indexOfItem(parent));
+    } else {
+        item = m_sampleModel->insertNewItem(Constants::ParticleLayoutType);
+    }
+
+    ComboProperty approx_prop;
+    approx_prop << "Decoupling Approximation"
+                << "Size Space Coupling Approximation";
+    ILayout::EInterferenceApproximation approx = sample->getApproximation();
+    switch(approx)
+    {
+    case ILayout::DA:
+        approx_prop.setValue("Decoupling Approximation");
+        break;
+    case ILayout::SSCA:
+        approx_prop.setValue("Size Space Coupling Approximation");
+        break;
+    default:
+        approx_prop.setValue("Decoupling Approximation");
+        break;
+    }
+    item->setItemValue(ParticleLayoutItem::P_APPROX, approx_prop.getVariant());
+    item->setItemValue(ParticleLayoutItem::P_TOTAL_DENSITY,
+                       sample->getTotalParticleSurfaceDensity());
+    m_levelToParentItem[getLevel()] = item;
+}
+
+void GUIObjectBuilder::visit(const Layer* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const Layer*)"  << getLevel();
+    SessionItem* parent = m_levelToParentItem[getLevel()-1];
+    Q_ASSERT(parent);
+
+    auto multilayer = dynamic_cast<const MultiLayer*>(m_itemToSample[parent]);
+    Q_ASSERT(multilayer);
+    int layer_index = multilayer->getIndexOfLayer(sample);
+    Q_ASSERT(layer_index != -1);
+    const LayerInterface* interface = multilayer->getLayerTopInterface(layer_index);
+
+    SessionItem* layerItem = m_sampleModel->insertNewItem(
+        Constants::LayerType, m_sampleModel->indexOfItem(parent));
+    layerItem->setItemValue(LayerItem::P_MATERIAL,
+        createMaterialFromDomain(sample->getMaterial()).getVariant());
+
+    TransformFromDomain::setItemFromSample(layerItem, sample, interface);
+
+    m_levelToParentItem[getLevel()] = layerItem;
+}
+
+void GUIObjectBuilder::visit(const LayerInterface*)
+{
+    qDebug() << "GUIObjectBuilder::visit(const LayerInterface*)" << getLevel();
+}
+
+void GUIObjectBuilder::visit(const MultiLayer* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const MultiLayer*)" << getLevel();
+
+    SessionItem* item =
+            m_sampleModel->insertNewItem(Constants::MultiLayerType);
+    item->setItemName(sample->getName().c_str());
+    item->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, sample->getCrossCorrLength());
+    m_levelToParentItem[getLevel()] = item;
+    m_itemToSample[item] = sample;
+}
+
+void GUIObjectBuilder::visit(const Particle* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const Particle*)" << getLevel();
+
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+
+    SessionItem* particleItem(0);
+    if (parent->modelType() == Constants::ParticleCoreShellType) {
+        const ParticleCoreShell* coreshell
+            = dynamic_cast<const ParticleCoreShell*>(m_itemToSample[parent]);
+        Q_ASSERT(coreshell);
+        if (sample == coreshell->getCoreParticle()) {
+            particleItem = m_sampleModel->insertNewItem(Constants::ParticleType,
+                                                        m_sampleModel->indexOfItem(parent), -1,
+                                                        ParticleCoreShellItem::T_CORE);
+            Q_ASSERT(particleItem);
+        } else if (sample == coreshell->getShellParticle()) {
+            particleItem = m_sampleModel->insertNewItem(Constants::ParticleType,
+                                                        m_sampleModel->indexOfItem(parent), -1,
+                                                        ParticleCoreShellItem::T_SHELL);
+            Q_ASSERT(particleItem);
+        } else {
+            throw GUIHelpers::Error(
+                "GUIObjectBuilder::visit"
+                "(const Particle* sample) -> Error. Logically should not be here");
+        }
+    } else if (parent->modelType() == Constants::ParticleCompositionType
+               || parent->modelType() == Constants::ParticleLayoutType
+               || parent->modelType() == Constants::ParticleDistributionType) {
+        particleItem = m_sampleModel->insertNewItem(Constants::ParticleType,
+                                                    m_sampleModel->indexOfItem(parent));
+    } else {
+        throw GUIHelpers::Error("GUIObjectBuilder::visit"
+                                "(const Particle* sample) -> Logic error.");
+    }
+
+    buildPositionInfo(particleItem, sample);
+
+    particleItem->setItemValue(ParticleItem::P_ABUNDANCE, sample->getAbundance());
+    particleItem->setItemValue(ParticleItem::P_MATERIAL,
+        createMaterialFromDomain(sample->getMaterial()).getVariant());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const ParticleDistribution* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const ParticleDistribution*)" << getLevel();
+
+    SessionItem* layoutItem = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(layoutItem);
+    SessionItem* particle_distribution_item = m_sampleModel->insertNewItem(
+        Constants::ParticleDistributionType, m_sampleModel->indexOfItem(layoutItem));
+    Q_ASSERT(particle_distribution_item);
+
+    TransformFromDomain::setItemFromSample(particle_distribution_item, sample);
+
+    m_levelToParentItem[getLevel()] = particle_distribution_item;
+    m_itemToSample[particle_distribution_item] = sample;
+}
+
+void GUIObjectBuilder::visit(const ParticleCoreShell* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const ParticleCoreShell*)" << getLevel();
+
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+
+    SessionItem* coreshellItem = m_sampleModel->insertNewItem(
+        Constants::ParticleCoreShellType, m_sampleModel->indexOfItem(parent));
+    coreshellItem->setItemValue(ParticleItem::P_ABUNDANCE, sample->getAbundance());
+
+    buildPositionInfo(coreshellItem, sample);
+
+    m_levelToParentItem[getLevel()] = coreshellItem;
+    m_itemToSample[coreshellItem] = sample;
+}
+
+void GUIObjectBuilder::visit(const ParticleComposition* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const ParticleComposition*)" << getLevel();
+
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+    SessionItem* particle_composition_item = m_sampleModel->insertNewItem(
+        Constants::ParticleCompositionType, m_sampleModel->indexOfItem(parent));
+    particle_composition_item->setItemValue(ParticleItem::P_ABUNDANCE, sample->getAbundance());
+
+    buildPositionInfo(particle_composition_item, sample);
+
+    m_levelToParentItem[getLevel()] = particle_composition_item;
+    m_itemToSample[particle_composition_item] = sample;
+}
+
+void GUIObjectBuilder::visit(const FormFactorAnisoPyramid* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::AnisoPyramidType);
+    ffItem->setItemValue(AnisoPyramidItem::P_LENGTH, sample->getLength());
+    ffItem->setItemValue(AnisoPyramidItem::P_WIDTH, sample->getWidth());
+    ffItem->setItemValue(AnisoPyramidItem::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(AnisoPyramidItem::P_ALPHA, Units::rad2deg(sample->getAlpha()));
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorBox* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::BoxType);
+    ffItem->setItemValue(BoxItem::P_LENGTH, sample->getLength());
+    ffItem->setItemValue(BoxItem::P_WIDTH, sample->getWidth());
+    ffItem->setItemValue(BoxItem::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorCone* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::ConeType);
+    ffItem->setItemValue(ConeItem::P_RADIUS, sample->getRadius());
+    ffItem->setItemValue(ConeItem::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(ConeItem::P_ALPHA, Units::rad2deg(sample->getAlpha()));
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorCone6* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::Cone6Type);
+    ffItem->setItemValue(Cone6Item::P_BASEEDGE, sample->getBaseEdge());
+    ffItem->setItemValue(Cone6Item::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(Cone6Item::P_ALPHA, Units::rad2deg(sample->getAlpha()));
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorCuboctahedron* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::CuboctahedronType);
+    ffItem->setItemValue(CuboctahedronItem::P_LENGTH, sample->getLength());
+    ffItem->setItemValue(CuboctahedronItem::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(CuboctahedronItem::P_HEIGHT_RATIO, sample->getHeightRatio());
+    ffItem->setItemValue(CuboctahedronItem::P_ALPHA, Units::rad2deg(sample->getAlpha()));
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorCylinder* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::CylinderType);
+    ffItem->setItemValue(CylinderItem::P_RADIUS, sample->getRadius());
+    ffItem->setItemValue(CylinderItem::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorDodecahedron* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::DodecahedronType);
+    ffItem->setItemValue(DodecahedronItem::P_EDGE, sample->getEdge());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorEllipsoidalCylinder* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+       ParticleItem::P_FORM_FACTOR, Constants::EllipsoidalCylinderType);
+    ffItem->setItemValue(EllipsoidalCylinderItem::P_RADIUS_X, sample->getRadiusX());
+    ffItem->setItemValue(EllipsoidalCylinderItem::P_RADIUS_Y, sample->getRadiusY());
+    ffItem->setItemValue(EllipsoidalCylinderItem::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorFullSphere* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::FullSphereType);
+    ffItem->setItemValue(FullSphereItem::P_RADIUS, sample->getRadius());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorFullSpheroid* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::FullSpheroidType);
+    ffItem->setItemValue(FullSpheroidItem::P_RADIUS, sample->getRadius());
+    ffItem->setItemValue(FullSpheroidItem::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorIcosahedron* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::IcosahedronType);
+    ffItem->setItemValue(IcosahedronItem::P_EDGE, sample->getEdge());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorHemiEllipsoid* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::HemiEllipsoidType);
+    ffItem->setItemValue(HemiEllipsoidItem::P_RADIUS_X, sample->getRadiusX());
+    ffItem->setItemValue(HemiEllipsoidItem::P_RADIUS_Y, sample->getRadiusY());
+    ffItem->setItemValue(HemiEllipsoidItem::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorPrism3* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::Prism3Type);
+    ffItem->setItemValue(Prism3Item::P_BASEEDGE, sample->getBaseEdge());
+    ffItem->setItemValue(Prism3Item::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorPrism6* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::Prism6Type);
+    ffItem->setItemValue(Prism6Item::P_BASEEDGE, sample->getBaseEdge());
+    ffItem->setItemValue(Prism6Item::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorPyramid* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::PyramidType);
+    ffItem->setItemValue(PyramidItem::P_BASEEDGE, sample->getBaseEdge());
+    ffItem->setItemValue(PyramidItem::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(PyramidItem::P_ALPHA, Units::rad2deg(sample->getAlpha()));
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorRipple1* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::Ripple1Type);
+    ffItem->setItemValue(Ripple1Item::P_LENGTH, sample->getLength());
+    ffItem->setItemValue(Ripple1Item::P_WIDTH, sample->getWidth());
+    ffItem->setItemValue(Ripple1Item::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorRipple2* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::Ripple2Type);
+    ffItem->setItemValue(Ripple2Item::P_LENGTH, sample->getLength());
+    ffItem->setItemValue(Ripple2Item::P_WIDTH, sample->getWidth());
+    ffItem->setItemValue(Ripple2Item::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(Ripple2Item::P_ASYMMETRY, sample->getAsymmetry());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorTetrahedron* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::TetrahedronType);
+    ffItem->setItemValue(TetrahedronItem::P_BASEEDGE, sample->getBaseEdge());
+    ffItem->setItemValue(TetrahedronItem::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(TetrahedronItem::P_ALPHA, Units::rad2deg(sample->getAlpha()));
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorTruncatedCube* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::TruncatedCubeType);
+    ffItem->setItemValue(TruncatedCubeItem::P_LENGTH, sample->getLength());
+    ffItem->setItemValue(TruncatedCubeItem::P_REMOVED_LENGTH, sample->getRemovedLength());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorTruncatedSphere* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+        ParticleItem::P_FORM_FACTOR, Constants::TruncatedSphereType);
+    ffItem->setItemValue(TruncatedSphereItem::P_RADIUS, sample->getRadius());
+    ffItem->setItemValue(TruncatedSphereItem::P_HEIGHT, sample->getHeight());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const FormFactorTruncatedSpheroid* sample)
+{
+    SessionItem* particleItem = m_levelToParentItem[getLevel()-1];
+    SessionItem* ffItem = particleItem->setGroupProperty(
+                ParticleItem::P_FORM_FACTOR, Constants::TruncatedSpheroidType);
+    ffItem->setItemValue(TruncatedSpheroidItem::P_RADIUS, sample->getRadius());
+    ffItem->setItemValue(TruncatedSpheroidItem::P_HEIGHT, sample->getHeight());
+    ffItem->setItemValue(TruncatedSpheroidItem::P_HFC, sample->getHeightFlattening());
+    m_levelToParentItem[getLevel()] = particleItem;
+}
+
+void GUIObjectBuilder::visit(const InterferenceFunctionRadialParaCrystal* sample)
+{
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+    SessionItem* item = m_sampleModel->insertNewItem(
+        Constants::InterferenceFunctionRadialParaCrystalType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleLayoutItem::T_INTERFERENCE);
+    Q_ASSERT(item);
+    TransformFromDomain::setItemFromSample(item, sample);
+    m_levelToParentItem[getLevel()] = item;
+}
+
+void GUIObjectBuilder::visit(const InterferenceFunction2DParaCrystal* sample)
+{
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+    SessionItem* item = m_sampleModel->insertNewItem(
+        Constants::InterferenceFunction2DParaCrystalType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleLayoutItem::T_INTERFERENCE);
+    Q_ASSERT(item);
+    TransformFromDomain::setItemFromSample(item, sample);
+    m_levelToParentItem[getLevel()] = item;
+}
+
+void GUIObjectBuilder::visit(const InterferenceFunction1DLattice* sample)
+{
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+    SessionItem* item = m_sampleModel->insertNewItem(
+        Constants::InterferenceFunction1DLatticeType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleLayoutItem::T_INTERFERENCE);
+    Q_ASSERT(item);
+    TransformFromDomain::setItemFromSample(item, sample);
+    m_levelToParentItem[getLevel()] = item;
+}
+
+void GUIObjectBuilder::visit(const InterferenceFunction2DLattice* sample)
+{
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+    SessionItem* item = m_sampleModel->insertNewItem(
+        Constants::InterferenceFunction2DLatticeType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleLayoutItem::T_INTERFERENCE);
+    Q_ASSERT(item);
+    TransformFromDomain::setItemFromSample(item, sample);
+    m_levelToParentItem[getLevel()] = item;
+}
+
+void GUIObjectBuilder::visit(const InterferenceFunctionNone*)
+{
+    qDebug() << "GUIObjectBuilder::visit(const InterferenceFunctionNone*)"
+             << getLevel();
+}
+
+void GUIObjectBuilder::visit(const LayerRoughness*)
+{
+    qDebug() << "GUIObjectBuilder::visit(const LayerRoughness*)" << getLevel();
+}
+
+void GUIObjectBuilder::visit(const RotationX* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const RotationX*)" << getLevel();
+
+    SessionItem* parent = m_levelToParentItem[getLevel()-1];
+    Q_ASSERT(parent);
+
+    SessionItem* transformation_item = m_sampleModel->insertNewItem(
+        Constants::TransformationType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleItem::T_TRANSFORMATION);
+    SessionItem* p_rotationItem = transformation_item->setGroupProperty(
+                TransformationItem::P_ROT, Constants::XRotationType);
+    p_rotationItem->setItemValue(XRotationItem::P_ANGLE,
+                                          Units::rad2deg(sample->getAngle()) );
+    m_levelToParentItem[getLevel()] = transformation_item;
+}
+
+void GUIObjectBuilder::visit(const RotationY* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const RotationY*)" << getLevel();
+
+    SessionItem* parent = m_levelToParentItem[getLevel() - 1];
+    Q_ASSERT(parent);
+
+    SessionItem* transformation_item = m_sampleModel->insertNewItem(
+        Constants::TransformationType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleItem::T_TRANSFORMATION);
+    SessionItem* p_rotationItem = transformation_item->setGroupProperty(
+        TransformationItem::P_ROT, Constants::YRotationType);
+    p_rotationItem->setItemValue(YRotationItem::P_ANGLE, Units::rad2deg(sample->getAngle()));
+    m_levelToParentItem[getLevel()] = transformation_item;
+}
+
+void GUIObjectBuilder::visit(const RotationZ* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const RotationZ*)" << getLevel();
+
+    SessionItem* parent = m_levelToParentItem[getLevel()-1];
+    Q_ASSERT(parent);
+
+    SessionItem* transformation_item = m_sampleModel->insertNewItem(
+        Constants::TransformationType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleItem::T_TRANSFORMATION);
+    SessionItem* p_rotationItem = transformation_item->setGroupProperty(
+                TransformationItem::P_ROT, Constants::ZRotationType);
+    p_rotationItem->setItemValue(ZRotationItem::P_ANGLE, Units::rad2deg(sample->getAngle()) );
+    m_levelToParentItem[getLevel()] = transformation_item;
+}
+
+void GUIObjectBuilder::visit(const RotationEuler* sample)
+{
+    qDebug() << "GUIObjectBuilder::visit(const RotationEuler*)" << getLevel();
+
+    SessionItem* parent = m_levelToParentItem[getLevel()-1];
+    Q_ASSERT(parent);
+
+    SessionItem* transformation_item = m_sampleModel->insertNewItem(
+        Constants::TransformationType, m_sampleModel->indexOfItem(parent),
+                -1, ParticleItem::T_TRANSFORMATION);
+    Q_ASSERT(transformation_item);
+    SessionItem* p_rotationItem = transformation_item->setGroupProperty(
+                TransformationItem::P_ROT, Constants::EulerRotationType);
+    p_rotationItem->setItemValue(EulerRotationItem::P_ALPHA,  Units::rad2deg(sample->getAlpha()) );
+    p_rotationItem->setItemValue(EulerRotationItem::P_BETA, Units::rad2deg(sample->getBeta()) );
+    p_rotationItem->setItemValue(EulerRotationItem::P_GAMMA, Units::rad2deg(sample->getGamma()) );
+    m_levelToParentItem[getLevel()] = transformation_item;
+}
+
+void GUIObjectBuilder::buildPositionInfo(SessionItem* particleItem, const IParticle* sample)
+{
+    kvector_t position = sample->getPosition();
+    SessionItem* positionItem = particleItem->getItem(ParticleItem::P_POSITION);
+    Q_ASSERT(positionItem);
+    positionItem->setItemValue(VectorItem::P_X, position.x());
+    positionItem->setItemValue(VectorItem::P_Y, position.y());
+    positionItem->setItemValue(VectorItem::P_Z, position.z());
+}
+
+MaterialProperty GUIObjectBuilder::createMaterialFromDomain(
+        const IMaterial* material)
+{
+    QString materialName = m_topSampleName + QString("_")
+            + QString(material->getName().c_str());
+
+    MaterialProperty materialProperty =
+            MaterialSvc::getMaterialProperty(materialName);
+    if(materialProperty.isDefined()) return materialProperty;
+
+    MaterialModel* model = MaterialSvc::getMaterialModel();
+
+    if(material->isScalarMaterial()) {
+      complex_t rindex = material->getRefractiveIndex();
+      MaterialItem* materialItem  =
+              model->addMaterial(materialName, 1-rindex.real(),rindex.imag());
+      return MaterialProperty(materialItem->getIdentifier());
+    } else {
+        throw GUIHelpers::Error("GUIObjectBuilder::createMaterialFromDomain()"
+                                " -> Not implemented.");
+    }
+}
diff --git a/GUI/coregui/Models/GUIObjectBuilder.h b/GUI/coregui/Models/GUIObjectBuilder.h
new file mode 100644
index 0000000..82fee16
--- /dev/null
+++ b/GUI/coregui/Models/GUIObjectBuilder.h
@@ -0,0 +1,116 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GUIObjectBuilder.h
+//! @brief     Defines class GUIObjectBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GUIOBJECTBUILDER_H
+#define GUIOBJECTBUILDER_H
+
+#include "ISampleVisitor.h"
+#include "MaterialProperty.h"
+
+class IMaterial;
+class InstrumentModel;
+class SampleModel;
+class SessionItem;
+class DocumentModel;
+
+//! Class to build SampleModel and InstrumentModel from domain's ISample
+class BA_CORE_API_ GUIObjectBuilder : public ISampleVisitor
+{
+public:
+    GUIObjectBuilder();
+    virtual ~GUIObjectBuilder(){}
+
+    SessionItem* populateSampleModel(SampleModel* sampleModel,
+                                     const class GISASSimulation &simulation,
+                                     const QString &sampleName=QString());
+
+    SessionItem* populateSampleModel(SampleModel* sampleModel,
+                                     const ISample &sample,
+                                     const QString &sampleName=QString());
+
+    SessionItem* populateInstrumentModel(InstrumentModel* instrumentModel,
+                                         const class GISASSimulation &simulation,
+                                               const QString &instrumentName=QString());
+
+    SessionItem* populateDocumentModel(DocumentModel* documentModel,
+                                       const class GISASSimulation &simulation);
+
+
+    using ISampleVisitor::visit;
+
+    void visit(const ParticleLayout *);
+
+    void visit(const Layer*);
+
+    void visit(const LayerInterface*);
+
+    void visit(const MultiLayer*);
+
+    void visit(const Particle*);
+    void visit(const ParticleDistribution*);
+    void visit(const ParticleCoreShell*);
+    void visit(const ParticleComposition*);
+
+    void visit(const FormFactorAnisoPyramid*);
+    void visit(const FormFactorBox*);
+    void visit(const FormFactorCone*);
+    void visit(const FormFactorCone6*);
+    void visit(const FormFactorCuboctahedron*);
+    void visit(const FormFactorCylinder*);
+    void visit(const FormFactorDodecahedron*);
+    void visit(const FormFactorEllipsoidalCylinder*);
+    void visit(const FormFactorFullSphere*);
+    void visit(const FormFactorFullSpheroid*);
+    void visit(const FormFactorHemiEllipsoid*);
+    void visit(const FormFactorIcosahedron*);
+    void visit(const FormFactorPrism3*);
+    void visit(const FormFactorPrism6*);
+    void visit(const FormFactorPyramid*);
+    void visit(const FormFactorRipple1*);
+    void visit(const FormFactorRipple2*);
+    void visit(const FormFactorTetrahedron*);
+    void visit(const FormFactorTruncatedCube*);
+    void visit(const FormFactorTruncatedSphere*);
+    void visit(const FormFactorTruncatedSpheroid*);
+
+    void visit(const InterferenceFunctionRadialParaCrystal*);
+    void visit(const InterferenceFunction2DParaCrystal*);
+    void visit(const InterferenceFunction1DLattice*);
+    void visit(const InterferenceFunction2DLattice*);
+    void visit(const InterferenceFunctionNone*);
+
+    void visit(const LayerRoughness*);
+
+    void visit(const RotationX*);
+    void visit(const RotationY*);
+    void visit(const RotationZ*);
+    void visit(const RotationEuler*);
+
+private:
+    void buildAbundanceInfo(SessionItem* particleItem);
+    void buildPositionInfo(SessionItem* particleItem, const IParticle* sample);
+    MaterialProperty createMaterialFromDomain(const IMaterial*);
+
+    SampleModel* m_sampleModel;
+
+    QMap<int, SessionItem*> m_levelToParentItem;
+    QMap<QString, double > m_propertyToValue;
+    QMap<QString, bool> m_sample_encountered;
+    QMap<SessionItem* , const ISample*> m_itemToSample;
+    QString m_topSampleName;
+};
+
+#endif // GUIOBJECTBUILDER_H
diff --git a/GUI/coregui/Models/GroupItem.cpp b/GUI/coregui/Models/GroupItem.cpp
new file mode 100644
index 0000000..eaa451d
--- /dev/null
+++ b/GUI/coregui/Models/GroupItem.cpp
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GroupItem.cpp
+//! @brief     Implements class GroupItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GroupItem.h"
+
+const QString GroupItem::T_ITEMS = "Item tag";
+
+GroupItem::GroupItem()
+    :SessionItem(Constants::GroupItemType)
+{
+    registerTag(T_ITEMS);
+    setDefaultTag(T_ITEMS);
+
+//    mapper()->setOnChildPropertyChange(
+//                [this](SessionItem* item, const QString &name)
+//    {
+//        qDebug() << "QQQQ" << item->itemLabel() << name;
+//        group()->setCurrentLabel(item->itemLabel());
+////        qDebug() << "emmiting..." << modelType();
+////        emitDataChanged();
+////        qDebug() << "...emmited";
+//    });
+
+}
+
+void GroupItem::setGroup(GroupProperty_t group)
+{
+    group->setGroupItem(this);
+    setValue(QVariant::fromValue(group));
+}
+
+GroupProperty_t GroupItem::group() const
+{
+    return value().value<GroupProperty_t>();
+}
+
+SessionItem *GroupItem::currentItem()
+{
+    return group()->getCurrentItem();
+}
diff --git a/GUI/coregui/Models/GroupItem.h b/GUI/coregui/Models/GroupItem.h
new file mode 100644
index 0000000..c1723f6
--- /dev/null
+++ b/GUI/coregui/Models/GroupItem.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GroupItem.h
+//! @brief     Defines class GroupItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GROUPITEM_H
+#define GROUPITEM_H
+
+#include "SessionItem.h"
+#include "GroupProperty.h"
+
+class BA_CORE_API_ GroupItem : public SessionItem
+{
+
+public:
+    static const QString T_ITEMS;
+    GroupItem();
+    void setGroup(GroupProperty_t group);
+    GroupProperty_t group() const;
+    SessionItem *currentItem();
+};
+
+#endif // GROUPITEM_H
+
diff --git a/GUI/coregui/Models/GroupProperty.cpp b/GUI/coregui/Models/GroupProperty.cpp
new file mode 100644
index 0000000..fe608e7
--- /dev/null
+++ b/GUI/coregui/Models/GroupProperty.cpp
@@ -0,0 +1,131 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GroupProperty.cpp
+//! @brief     Implements class GroupProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GroupProperty.h"
+#include "ItemFactory.h"
+#include <QDebug>
+
+
+GroupProperty::GroupProperty(QString group_name)
+    : m_group_name(std::move(group_name))
+    , m_groupItem(0)
+{
+}
+
+SessionItem *GroupProperty::getCurrentItem()
+{
+    qDebug() << "GroupProperty::getCurrentItem()" << m_groupItem;
+    if(m_groupItem) return m_groupItem->getChildByName(this->getCurrentType());
+    return 0;
+}
+
+void GroupProperty::setGroupItem(SessionItem *groupItem)
+{
+    Q_ASSERT(groupItem);
+    m_groupItem = groupItem;
+    SessionItem *item = createCorrespondingItem();
+    m_groupItem->insertItem(-1, item);
+}
+
+SessionItem *GroupProperty::createCorrespondingItem()
+{
+    SessionItem *result = ItemFactory::createItem(getCurrentType());
+    return result;
+}
+
+QString GroupProperty::getCurrentType() const
+{
+    return m_current_type;
+}
+
+void GroupProperty::setCurrentType(const QString &type, bool)
+{
+    if(type == getCurrentType()) return;
+
+    SessionItem *prevItem = getCurrentItem();
+    m_current_type = type;
+
+    if(m_groupItem) {
+        if (auto item = m_groupItem->getChildByName(m_current_type)) {
+            item->setVisible(true);
+            item->setEnabled(true);
+        } else {
+            SessionItem *new_item = createCorrespondingItem();
+            m_groupItem->insertItem(-1, new_item);
+        }
+
+        if(prevItem) {
+            prevItem->setVisible(false);
+            prevItem->setEnabled(false);
+        }
+
+        m_groupItem->emitDataChanged();
+    }
+}
+
+QString GroupProperty::getCurrentLabel() const
+{
+    return m_type_label_map.at(m_current_type);
+}
+
+QStringList GroupProperty::getTypes() const
+{
+    QStringList result;
+    for (const auto& key_value_pair : m_type_label_map) {
+        result << key_value_pair.first;
+    }
+    return result;
+}
+
+QStringList GroupProperty::getLabels() const
+{
+    QStringList result;
+    for (const auto& key_value_pair : m_type_label_map) {
+        result << key_value_pair.second;
+    }
+    return result;
+}
+
+int GroupProperty::index() const
+{
+    return toIndex(m_current_type);
+}
+
+int GroupProperty::toIndex(const QString &type) const
+{
+    QStringList name_list = getTypes();
+    for (int i = 0; i < name_list.size(); ++i) {
+        if (type == name_list[i]) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+QString GroupProperty::toString(int index) const
+{
+    QStringList name_list = getTypes();
+    if (index<0 || index>=name_list.size()) {
+        return QString();
+    }
+    return name_list[index];
+}
+
+void GroupProperty::setGroupMap(std::map<QString, QString> group_map)
+{
+    m_type_label_map = std::move(group_map);
+    setCurrentType(m_type_label_map.begin()->first);
+}
diff --git a/GUI/coregui/Models/GroupProperty.h b/GUI/coregui/Models/GroupProperty.h
new file mode 100644
index 0000000..66bf528
--- /dev/null
+++ b/GUI/coregui/Models/GroupProperty.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GroupProperty.h
+//! @brief     Defines class GroupProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GROUPPROPERTY_H
+#define GROUPPROPERTY_H
+
+#include "WinDllMacros.h"
+#include <QSharedPointer>
+#include <QStringList>
+
+class SessionItem;
+
+//! The GroupProperty class represents a composition of the basic properties
+//! corresponding to a SessionItem object.
+//! Its construction is handled by a GroupPropertyRegistry object.
+class BA_CORE_API_ GroupProperty
+{
+public:
+    void setGroupItem(SessionItem *groupItem);
+
+    SessionItem *getCurrentItem();
+
+    SessionItem *createCorrespondingItem();
+
+    QString getCurrentType() const;
+    void setCurrentType(const QString &type, bool = true);
+
+    QString getCurrentLabel() const;
+
+    QStringList getTypes() const;
+    QStringList getLabels() const;
+
+    int index() const;
+    int toIndex(const QString &type) const;
+    QString toString(int index) const;
+
+    friend class GroupPropertyRegistry;
+
+private:
+    GroupProperty(QString group_name);
+    void setGroupMap(std::map<QString, QString> group_map);
+
+    QString m_group_name;
+    SessionItem *m_groupItem;
+    QString m_current_type;
+    std::map<QString, QString > m_type_label_map;
+};
+
+typedef QSharedPointer<GroupProperty> GroupProperty_t;
+Q_DECLARE_METATYPE(GroupProperty_t)
+
+#endif // GROUPPROPERTY_H
diff --git a/GUI/coregui/Models/GroupPropertyRegistry.cpp b/GUI/coregui/Models/GroupPropertyRegistry.cpp
new file mode 100644
index 0000000..829b29c
--- /dev/null
+++ b/GUI/coregui/Models/GroupPropertyRegistry.cpp
@@ -0,0 +1,157 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GroupPropertyRegistry.cpp
+//! @brief     Implements class GroupPropertyRegistry
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GroupPropertyRegistry.h"
+
+namespace
+{
+
+// Correspondance of SessionItem's types to their labels
+GroupPropertyRegistry::SelectableGroupMap_t initializeSelectableGroupMap()
+{
+    GroupPropertyRegistry::SelectableGroupMap_t result;
+
+    std::map<QString, QString> formfactors;
+    formfactors[Constants::AnisoPyramidType] = "Aniso Pyramid";
+    formfactors[Constants::BoxType] = "Box";
+    formfactors[Constants::ConeType] = "Cone";
+    formfactors[Constants::Cone6Type] = "Cone6";
+    formfactors[Constants::CuboctahedronType] = "Cuboctahedron";
+    formfactors[Constants::CylinderType] = "Cylinder";
+    formfactors[Constants::DodecahedronType] = "Dodecahedron";
+    formfactors[Constants::EllipsoidalCylinderType] = "Ellipsoidal Cylinder";
+    formfactors[Constants::FullSphereType] = "Full Sphere";
+    formfactors[Constants::FullSpheroidType] = "Full Spheroid";
+    formfactors[Constants::HemiEllipsoidType] = "Hemi Ellipsoid";
+    formfactors[Constants::IcosahedronType] = "Icosahedron";
+    formfactors[Constants::Prism3Type] = "Prism3";
+    formfactors[Constants::Prism6Type] = "Prism6";
+    formfactors[Constants::PyramidType] = "Pyramid";
+    formfactors[Constants::Ripple1Type] = "Ripple1";
+    formfactors[Constants::Ripple2Type] = "Ripple2";
+    formfactors[Constants::TetrahedronType] = "Tetrahedron";
+    formfactors[Constants::TruncatedCubeType] = "Truncated Cube";
+    formfactors[Constants::TruncatedSphereType] = "Truncated Sphere";
+    formfactors[Constants::TruncatedSpheroidType] = "Truncated Spheroid";
+    result[Constants::FormFactorGroup] = formfactors;
+
+    std::map<QString, QString> rotations;
+    rotations[Constants::XRotationType] = "X axis Rotation";
+    rotations[Constants::YRotationType] = "Y axis Rotation";
+    rotations[Constants::ZRotationType] = "Z axis Rotation";
+    rotations[Constants::EulerRotationType] = "Euler Rotation";
+    result[Constants::RotationGroup] = rotations;
+
+    std::map<QString, QString> roughnesses;
+    roughnesses[Constants::LayerBasicRoughnessType] = "Basic";
+    roughnesses[Constants::LayerZeroRoughnessType] = "No";
+    result[Constants::LayerRoughnessGroup] = roughnesses;
+
+    std::map<QString, QString> detectors;
+    detectors[Constants::SphericalDetectorType] = "Spherical detector";
+    detectors[Constants::RectangularDetectorType] = "Rectangular detector";
+    result[Constants::DetectorGroup] = detectors;
+
+    std::map<QString, QString> distributions;
+    distributions[Constants::DistributionGateType] = "Gate distribution";
+    distributions[Constants::DistributionLorentzType] = "Lorentz distribution";
+    distributions[Constants::DistributionGaussianType] = "Gaussian distribution";
+    distributions[Constants::DistributionLogNormalType] = "Log Normal distribution";
+    distributions[Constants::DistributionCosineType] = "Cosine distribution";
+    result[Constants::DistributionGroup] = distributions;
+
+    std::map<QString, QString> distributions_ext;
+    distributions_ext[Constants::DistributionNoneType] = "None";
+    distributions_ext[Constants::DistributionGateType] = "Gate";
+    distributions_ext[Constants::DistributionLorentzType] = "Lorentz";
+    distributions_ext[Constants::DistributionGaussianType] = "Gaussian";
+    distributions_ext[Constants::DistributionLogNormalType] = "Log Normal";
+    distributions_ext[Constants::DistributionCosineType] = "Cosine";
+    result[Constants::DistributionExtendedGroup] = distributions_ext;
+
+    std::map<QString, QString> pdfs_1d;
+    pdfs_1d[Constants::FTDistribution1DCauchyType] = "Cauchy 1D";
+    pdfs_1d[Constants::FTDistribution1DGaussType] = "Gauss 1D";
+    pdfs_1d[Constants::FTDistribution1DGateType] = "Gate 1D";
+    pdfs_1d[Constants::FTDistribution1DTriangleType] = "Triangle 1D";
+    pdfs_1d[Constants::FTDistribution1DCosineType] = "Cosine 1D";
+    pdfs_1d[Constants::FTDistribution1DVoigtType] = "Voigt 1D";
+    result[Constants::FTDistribution1DGroup] = pdfs_1d;
+
+    std::map<QString, QString> pdfs_2d;
+    pdfs_2d[Constants::FTDistribution2DCauchyType] = "Cauchy 2D";
+    pdfs_2d[Constants::FTDistribution2DGaussType] = "Gauss 2D";
+    pdfs_2d[Constants::FTDistribution2DGateType] = "Gate 2D";
+    pdfs_2d[Constants::FTDistribution2DConeType] = "Cone 2D";
+    pdfs_2d[Constants::FTDistribution2DVoigtType] = "Voigt 2D";
+    result[Constants::FTDistribution2DGroup] = pdfs_2d;
+
+    std::map<QString, QString> pdecay_1d;
+    pdecay_1d[Constants::FTDecayFunction1DCauchyType] = "Cauchy 1D";
+    pdecay_1d[Constants::FTDecayFunction1DGaussType] = "Gauss 1D";
+    pdecay_1d[Constants::FTDecayFunction1DTriangleType] = "Triangle 1D";
+    pdecay_1d[Constants::FTDecayFunction1DVoigtType] = "Voigt 1D";
+    result[Constants::FTDecayFunction1DGroup] = pdecay_1d;
+
+    std::map<QString, QString> pdecay_2d;
+    pdecay_2d[Constants::FTDecayFunction2DCauchyType] = "Cauchy 2D";
+    pdecay_2d[Constants::FTDecayFunction2DGaussType] = "Gauss 2D";
+    pdecay_2d[Constants::FTDecayFunction2DVoigtType] = "Voigt 2D";
+    result[Constants::FTDecayFunction2DGroup] = pdecay_2d;
+
+    std::map<QString, QString> lattices;
+    lattices[Constants::BasicLatticeType] = "Basic";
+    lattices[Constants::SquareLatticeType] = "Square";
+    lattices[Constants::HexagonalLatticeType] = "Hexagonal";
+    result[Constants::LatticeGroup] = lattices;
+
+    std::map<QString, QString> resolution_functions;
+    resolution_functions[Constants::ResolutionFunctionNoneType] = "None";
+    resolution_functions[Constants::ResolutionFunction2DGaussianType] = "2D Gaussian";
+    result[Constants::ResolutionFunctionGroup] = resolution_functions;
+
+    std::map<QString, QString> minimizers;
+    minimizers[Constants::MinuitMinimizerType] = "Minuit2";
+    minimizers[Constants::GSLMultiMinimizerType] = "GSL MultiMin";
+    minimizers[Constants::GeneticMinimizerType] = "TMVA Genetic";
+    minimizers[Constants::GSLSimAnMinimizerType] = "GSL Simulated Annealing";
+    minimizers[Constants::GSLLMAMinimizerType] = "GSL Levenberg-Marquardt";
+    minimizers[Constants::TestMinimizerType] = "Test minimizer";
+    result[Constants::MinimizerLibraryGroup] = minimizers;
+
+    return result;
+}
+}
+
+GroupPropertyRegistry::SelectableGroupMap_t GroupPropertyRegistry::m_selectable_group_map
+    = initializeSelectableGroupMap();
+
+bool GroupPropertyRegistry::isValidGroup(const QString &group_type)
+{
+    auto it = m_selectable_group_map.find(group_type);
+    return it==m_selectable_group_map.end() ? false : true;
+}
+
+GroupProperty_t
+GroupPropertyRegistry::createGroupProperty(const QString &group_name,
+                                           const Constants::ModelType &group_type)
+{
+    Q_ASSERT(isValidGroup(group_type));
+    GroupProperty_t result(new GroupProperty(group_name));
+    result->setGroupMap(m_selectable_group_map[group_type]);
+
+    return result;
+}
diff --git a/GUI/coregui/Models/GroupPropertyRegistry.h b/GUI/coregui/Models/GroupPropertyRegistry.h
new file mode 100644
index 0000000..4094b76
--- /dev/null
+++ b/GUI/coregui/Models/GroupPropertyRegistry.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/GroupPropertyRegistry.h
+//! @brief     Defines class GroupPropertyRegistry
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GROUPPROPERTYREGISTRY_H
+#define GROUPPROPERTYREGISTRY_H
+
+#include "GroupProperty.h"
+#include "item_constants.h"
+
+
+
+//! The GroupPropertyRegistry is responsible for constructing GroupProperty objects
+//! according to the given name of the group.
+class BA_CORE_API_ GroupPropertyRegistry
+{
+public:
+    using SelectableGroupMap_t = std::map<QString, std::map<QString, QString>>;
+
+    static bool isValidGroup(const QString &group_type);
+
+    static GroupProperty_t createGroupProperty(const QString &group_name,
+            const Constants::ModelType &group_type);
+
+private:
+    static SelectableGroupMap_t m_selectable_group_map;
+    //!< Contains correspondance of selectable group names to their content,
+    //!< which is a map between item types and item labels
+};
+
+
+#endif // GROUPPROPERTYREGISTRY_H
diff --git a/GUI/coregui/Models/IconProvider.cpp b/GUI/coregui/Models/IconProvider.cpp
new file mode 100644
index 0000000..7af53e2
--- /dev/null
+++ b/GUI/coregui/Models/IconProvider.cpp
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/IconProvider.cpp
+//! @brief     Implements class IconProvider
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IconProvider.h"
+#include "MaterialItem.h"
+
+QIcon IconProvider::icon(const SessionItem *item)
+{
+    Q_ASSERT(item);
+    QIcon result;
+
+    if(item->modelType() == Constants::InstrumentType) {
+        result.addPixmap(QPixmap(":/images/gisas_instrument_bw.png"), QIcon::Normal);
+        result.addPixmap(QPixmap(":/images/gisas_instrument.png"), QIcon::Selected);
+    }
+
+    else if(item->modelType() == Constants::MaterialType) {
+        if(const MaterialItem *materialItem = dynamic_cast<const MaterialItem *>(item)) {
+            QPixmap pixmap(10,10);
+            pixmap.fill(materialItem->getColor());
+            result.addPixmap(pixmap);
+        }
+
+    }
+
+    return result;
+}
diff --git a/GUI/coregui/Models/IconProvider.h b/GUI/coregui/Models/IconProvider.h
new file mode 100644
index 0000000..7a54fc2
--- /dev/null
+++ b/GUI/coregui/Models/IconProvider.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/IconProvider.h
+//! @brief     Defines class IconProvider
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ICONPROVIDER_H
+#define ICONPROVIDER_H
+
+#include "WinDllMacros.h"
+#include <QIcon>
+
+class SessionItem;
+
+//! Class which returns icons for SessionItems to use in SessionModel
+class BA_CORE_API_ IconProvider
+{
+public:
+    IconProvider(){}
+    virtual ~IconProvider(){}
+
+    virtual QIcon icon(const SessionItem *item);
+
+};
+
+
+#endif // ICONPROVIDER_H
+
diff --git a/GUI/coregui/Models/InstrumentItem.cpp b/GUI/coregui/Models/InstrumentItem.cpp
new file mode 100644
index 0000000..0e3a532
--- /dev/null
+++ b/GUI/coregui/Models/InstrumentItem.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/InstrumentItem.cpp
+//! @brief     Implements class InstrumentItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InstrumentItem.h"
+#include "BeamItem.h"
+#include "DetectorItems.h"
+#include "GUIHelpers.h"
+
+const QString InstrumentItem::P_IDENTIFIER = "Identifier";
+
+InstrumentItem::InstrumentItem()
+    : SessionItem(Constants::InstrumentType)
+{
+    setItemName(Constants::InstrumentType);
+
+    addProperty(P_IDENTIFIER, GUIHelpers::createUuid())->setVisible(false);
+
+    const QString T_DATA = "Data tag";
+    registerTag(T_DATA, 0, -1, QStringList() << Constants::BeamType << Constants::DetectorType);
+    setDefaultTag(T_DATA);
+}
+
+BeamItem *InstrumentItem::beamItem() const
+{
+    for(SessionItem *item : childItems())
+        if(item->modelType() == Constants::BeamType)
+            return dynamic_cast<BeamItem *>(item);
+    return 0;
+}
+
+DetectorItem *InstrumentItem::detectorItem() const
+{
+    for(SessionItem *item : childItems())
+        if(item->modelType() == Constants::DetectorType)
+            return dynamic_cast<DetectorItem *>(item);
+    return 0;
+}
diff --git a/GUI/coregui/Models/InstrumentItem.h b/GUI/coregui/Models/InstrumentItem.h
new file mode 100644
index 0000000..b622609
--- /dev/null
+++ b/GUI/coregui/Models/InstrumentItem.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/InstrumentItem.h
+//! @brief     Defines class InstrumentItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INSTRUMENTITEM_H
+#define INSTRUMENTITEM_H
+
+#include "SessionItem.h"
+
+class BeamItem;
+class DetectorItem;
+
+class BA_CORE_API_ InstrumentItem : public SessionItem
+{
+public:    
+    static const QString P_IDENTIFIER;
+    InstrumentItem();
+
+    BeamItem *beamItem() const;
+    DetectorItem *detectorItem() const;
+};
+
+#endif // INSTRUMENTITEM_H
diff --git a/GUI/coregui/Models/InstrumentModel.cpp b/GUI/coregui/Models/InstrumentModel.cpp
new file mode 100644
index 0000000..d3cb316
--- /dev/null
+++ b/GUI/coregui/Models/InstrumentModel.cpp
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/InstrumentModel.cpp
+//! @brief     Implements class InstrumentModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InstrumentModel.h"
+#include "InstrumentItem.h"
+
+InstrumentModel::InstrumentModel(QObject *parent)
+    : SessionModel(SessionXML::InstrumentModelTag, parent)
+{
+    setObjectName(SessionXML::InstrumentModelTag);
+}
+
+
+InstrumentModel *InstrumentModel::createCopy(SessionItem *parent)
+{
+    InstrumentModel *result = new InstrumentModel();
+    result->initFrom(this, parent);
+    return result;
+}
+
+InstrumentItem *InstrumentModel::instrumentItem(const QString &instrument_name)
+{
+    return dynamic_cast<InstrumentItem *>(topItem(Constants::InstrumentType, instrument_name));
+}
+
diff --git a/GUI/coregui/Models/InstrumentModel.h b/GUI/coregui/Models/InstrumentModel.h
new file mode 100644
index 0000000..d5df3c9
--- /dev/null
+++ b/GUI/coregui/Models/InstrumentModel.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/InstrumentModel.h
+//! @brief     Defines class InstrumentModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INSTRUMENTMODEL_H
+#define INSTRUMENTMODEL_H
+
+#include "SessionModel.h"
+
+class InstrumentItem;
+
+class BA_CORE_API_ InstrumentModel : public SessionModel
+{
+    Q_OBJECT
+
+public:
+    explicit InstrumentModel(QObject *parent = 0);
+    virtual ~InstrumentModel(){}
+
+    virtual InstrumentModel *createCopy(SessionItem *parent=0);
+
+    InstrumentItem *instrumentItem(const QString &instrument_name = QString());
+};
+
+#endif // INSTRUMENTMODEL_H
diff --git a/GUI/coregui/Models/IntensityDataItem.cpp b/GUI/coregui/Models/IntensityDataItem.cpp
new file mode 100644
index 0000000..a7c5ac9
--- /dev/null
+++ b/GUI/coregui/Models/IntensityDataItem.cpp
@@ -0,0 +1,379 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/IntensityDataItem.cpp
+//! @brief     Implements class IntensityDataItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IntensityDataItem.h"
+#include "AxesItems.h"
+#include "BornAgainNamespace.h"
+#include "ComboProperty.h"
+#include "GUIHelpers.h"
+#include "MaskItems.h"
+
+const QString IntensityDataItem::P_AXES_UNITS = "Axes Units";
+const QString IntensityDataItem::P_TITLE = "Title";
+const QString IntensityDataItem::P_PROJECTIONS_FLAG = "Projections";
+const QString IntensityDataItem::P_IS_INTERPOLATED = "Interpolation";
+const QString IntensityDataItem::P_GRADIENT = "Gradient";
+const QString IntensityDataItem::P_PROPERTY_PANEL_FLAG = "Property Panel Flag";
+const QString IntensityDataItem::P_XAXIS = "x-axis";
+const QString IntensityDataItem::P_YAXIS = "y-axis";
+const QString IntensityDataItem::P_ZAXIS = "color-axis";
+const QString IntensityDataItem::P_FILE_NAME = "FileName";
+const QString IntensityDataItem::T_MASKS = "Mask tag";
+
+
+IntensityDataItem::IntensityDataItem()
+    : SessionItem(Constants::IntensityDataType)
+{
+//    setItemName(Constants::IntensityDataType);
+
+    ComboProperty units = ComboProperty() << Constants::UnitsNbins;
+    addProperty(P_AXES_UNITS, units.getVariant());
+
+    addProperty(P_TITLE, QString())->setVisible(false);
+
+    addProperty(P_PROJECTIONS_FLAG, false)->setVisible(false);
+    addProperty(P_IS_INTERPOLATED, true);
+
+    ComboProperty gradient;
+
+    gradient << Constants::GRADIENT_GRAYSCALE << Constants::GRADIENT_HOT
+             << Constants::GRADIENT_COLD << Constants::GRADIENT_NIGHT
+             << Constants::GRADIENT_CANDY << Constants::GRADIENT_GEOGRAPHY
+             << Constants::GRADIENT_ION << Constants::GRADIENT_THERMAL
+             << Constants::GRADIENT_POLAR << Constants::GRADIENT_SPECTRUM
+             << Constants::GRADIENT_JET << Constants::GRADIENT_HUES;
+    gradient.setValue(Constants::GRADIENT_JET);
+    addProperty(P_GRADIENT, gradient.getVariant());
+
+    addProperty(P_PROPERTY_PANEL_FLAG, false)->setVisible(false);
+
+    SessionItem *item = addGroupProperty(P_XAXIS, Constants::BasicAxisType);
+    item->getItem(BasicAxisItem::P_NBINS)->setVisible(false);
+
+    item = addGroupProperty(P_YAXIS, Constants::BasicAxisType);
+    item->getItem(BasicAxisItem::P_NBINS)->setVisible(false);
+
+    item = addGroupProperty(P_ZAXIS, Constants::AmplitudeAxisType);
+    item->getItem(BasicAxisItem::P_NBINS)->setVisible(false);
+
+    setXaxisTitle("X [nbins]");
+    setYaxisTitle("Y [nbins]");
+
+    // name of the file used to serialize given IntensityDataItem
+    addProperty(P_FILE_NAME, QStringLiteral("undefined"))->setVisible(false);
+
+    registerTag(T_MASKS, 0, -1, QStringList() << Constants::MaskContainerType);
+    setDefaultTag(T_MASKS);
+}
+
+IntensityDataItem::~IntensityDataItem()
+{
+
+}
+
+void IntensityDataItem::setOutputData(OutputData<double> *data)
+{
+    Q_ASSERT(data);
+    m_data.reset(data);
+
+    updateAxesZoomLevel();
+    updateAxesLabels();
+    updateDataRange();
+
+    emitDataChanged();
+}
+
+//! Sets the raw data vector from external source
+
+void IntensityDataItem::setRawDataVector(const OutputData<double> *data)
+{
+    if(!m_data->hasSameDimensions(*data)) {
+        throw GUIHelpers::Error("IntensityDataItem::setRawDataVector() -> Error. "
+                                "Different dimensions of data.");
+    }
+    m_data->setRawDataVector(data->getRawDataVector());
+    emitDataChanged();
+}
+
+double IntensityDataItem::getLowerX() const
+{
+    return getItem(P_XAXIS)->getItemValue(BasicAxisItem::P_MIN).toDouble();
+}
+
+double IntensityDataItem::getUpperX() const
+{
+    return getItem(P_XAXIS)->getItemValue(BasicAxisItem::P_MAX).toDouble();
+}
+
+double IntensityDataItem::getXmin() const
+{
+    Q_ASSERT(m_data);
+    return m_data->getAxis(BornAgain::X_AXIS_INDEX).getMin();
+}
+
+double IntensityDataItem::getXmax() const
+{
+    Q_ASSERT(m_data);
+    return m_data->getAxis(BornAgain::X_AXIS_INDEX).getMax();
+}
+
+double IntensityDataItem::getLowerY() const
+{
+    return getItem(P_YAXIS)->getItemValue(BasicAxisItem::P_MIN).toDouble();
+}
+
+double IntensityDataItem::getUpperY() const
+{
+    return getItem(P_YAXIS)->getItemValue(BasicAxisItem::P_MAX).toDouble();
+}
+
+double IntensityDataItem::getYmin() const
+{
+    Q_ASSERT(m_data);
+    return m_data->getAxis(BornAgain::Y_AXIS_INDEX).getMin();
+}
+
+double IntensityDataItem::getYmax() const
+{
+    Q_ASSERT(m_data);
+        return m_data->getAxis(BornAgain::Y_AXIS_INDEX).getMax();
+}
+
+double IntensityDataItem::getLowerZ() const
+{
+    return getItem(P_ZAXIS)->getItemValue(BasicAxisItem::P_MIN).toDouble();
+}
+
+double IntensityDataItem::getUpperZ() const
+{
+    return getItem(P_ZAXIS)->getItemValue(BasicAxisItem::P_MAX).toDouble();
+}
+
+QString IntensityDataItem::getGradient() const
+{
+    ComboProperty combo_property = getItemValue(P_GRADIENT).value<ComboProperty>();
+    return combo_property.getValue();
+}
+
+bool IntensityDataItem::isLogz() const
+{
+    return getItem(P_ZAXIS)->getItemValue(AmplitudeAxisItem::P_IS_LOGSCALE).toBool();
+}
+
+bool IntensityDataItem::isInterpolated() const
+{
+    return getItemValue(P_IS_INTERPOLATED).toBool();
+}
+
+QString IntensityDataItem::getXaxisTitle() const
+{
+    return getItem(P_XAXIS)->getItemValue(BasicAxisItem::P_TITLE).toString();
+}
+
+QString IntensityDataItem::getYaxisTitle() const
+{
+    return getItem(P_YAXIS)->getItemValue(BasicAxisItem::P_TITLE).toString();
+}
+
+bool IntensityDataItem::isZAxisLocked() const
+{
+    return getItem(P_ZAXIS)->getItemValue(AmplitudeAxisItem::P_LOCK_MIN_MAX).toBool();
+}
+
+void IntensityDataItem::setZAxisLocked(bool state)
+{
+    return getItem(P_ZAXIS)->setItemValue(AmplitudeAxisItem::P_LOCK_MIN_MAX, state);
+}
+
+QString IntensityDataItem::getSelectedAxesUnits() const
+{
+    ComboProperty combo= getItemValue(IntensityDataItem::P_AXES_UNITS)
+              .value<ComboProperty>();
+    return combo.getValue();
+}
+
+QString IntensityDataItem::fileName(const QString &projectDir)
+{
+    return projectDir + QStringLiteral("/")
+           + getItemValue(IntensityDataItem::P_FILE_NAME).toString();
+}
+
+void IntensityDataItem::setLowerX(double xmin)
+{
+    getItem(P_XAXIS)->setItemValue(BasicAxisItem::P_MIN, xmin);
+}
+
+void IntensityDataItem::setUpperX(double xmax)
+{
+    getItem(P_XAXIS)->setItemValue(BasicAxisItem::P_MAX, xmax);
+}
+
+void IntensityDataItem::setLowerY(double ymin)
+{
+    getItem(P_YAXIS)->setItemValue(BasicAxisItem::P_MIN, ymin);
+}
+
+void IntensityDataItem::setUpperY(double ymax)
+{
+    getItem(P_YAXIS)->setItemValue(BasicAxisItem::P_MAX, ymax);
+}
+
+void IntensityDataItem::setLowerAndUpperZ(double zmin, double zmax)
+{
+    if(getLowerZ() != zmin) {
+        getItem(P_ZAXIS)->setItemValue(BasicAxisItem::P_MIN, zmin);
+    }
+    if(getUpperZ() != zmax) {
+        getItem(P_ZAXIS)->setItemValue(BasicAxisItem::P_MAX, zmax);
+    }
+}
+
+void IntensityDataItem::setLowerZ(double zmin)
+{
+    getItem(P_ZAXIS)->setItemValue(BasicAxisItem::P_MIN, zmin);
+}
+
+void IntensityDataItem::setUpperZ(double zmax)
+{
+    getItem(P_ZAXIS)->setItemValue(BasicAxisItem::P_MAX, zmax);
+}
+
+void IntensityDataItem::setLogz(bool logz)
+{
+    getItem(P_ZAXIS)->setItemValue(AmplitudeAxisItem::P_IS_LOGSCALE, logz);
+}
+
+void IntensityDataItem::setInterpolated(bool interp)
+{
+    setItemValue(P_IS_INTERPOLATED, interp);
+}
+
+void IntensityDataItem::setXaxisTitle(QString xtitle)
+{
+    getItem(P_XAXIS)->setItemValue(BasicAxisItem::P_TITLE, xtitle);
+}
+
+void IntensityDataItem::setYaxisTitle(QString ytitle)
+{
+    getItem(P_YAXIS)->setItemValue(BasicAxisItem::P_TITLE, ytitle);
+}
+
+//! set zoom range of x,y axes to axes of input data
+void IntensityDataItem::setAxesRangeToData()
+{
+    setLowerX(getXmin());
+    setUpperX(getXmax());
+    setLowerY(getYmin());
+    setUpperY(getYmax());
+}
+
+//! Sets zoom range of X,Y axes, if it was not yet defined.
+
+void IntensityDataItem::updateAxesZoomLevel()
+{
+    // set zoom range of x-axis to min, max values if it was not set already
+    if(getUpperX() < getLowerX()) {
+        setLowerX(getXmin());
+        setUpperX(getXmax());
+    }
+
+    // set zoom range of y-axis to min, max values if it was not set already
+    if(getUpperY() < getLowerY()) {
+        setLowerY(getYmin());
+        setUpperY(getYmax());
+    }
+
+    const int nx = static_cast<int>(m_data->getAxis(BornAgain::X_AXIS_INDEX).size());
+    xAxisItem()->setItemValue(BasicAxisItem::P_NBINS, nx);
+    const int ny = static_cast<int>(m_data->getAxis(BornAgain::Y_AXIS_INDEX).size());
+    yAxisItem()->setItemValue(BasicAxisItem::P_NBINS, ny);
+}
+
+//! Init axes labels, if it was not done already.
+
+void IntensityDataItem::updateAxesLabels()
+{
+    if(getXaxisTitle().isEmpty())
+        setXaxisTitle(QString::fromStdString(m_data->getAxis(BornAgain::X_AXIS_INDEX).getName()));
+
+    if(getYaxisTitle().isEmpty())
+        setYaxisTitle(QString::fromStdString(m_data->getAxis(BornAgain::Y_AXIS_INDEX).getName()));
+}
+
+//! Sets min,max values for z-axis, if axes is not locked, and ranges are not yet set.
+
+void IntensityDataItem::updateDataRange()
+{
+    if(isZAxisLocked())
+        return;
+
+    if(getLowerZ() <= getUpperZ())
+        return;
+
+    computeDataRange();
+}
+
+void IntensityDataItem::computeDataRange()
+{
+    QPair<double, double> minmax = getDataRange();
+    setLowerAndUpperZ(minmax.first, minmax.second);
+}
+
+//! Init zmin, zmax to match the intensity values range.
+QPair<double, double> IntensityDataItem::getDataRange() const
+{
+    const OutputData<double> *data = getOutputData();
+    OutputData<double>::const_iterator it_max = std::max_element(data->begin(), data->end());
+    OutputData<double>::const_iterator it_min = std::min_element(data->begin(), data->end());
+    double min(*it_min), max(*it_max);
+    if (isLogz()) {
+        if (max > 10000) {
+            min = 1.0;
+            max = max * 1.1;
+        } else {
+            min = max / 10000;
+            max = max * 1.1;
+        }
+    } else {
+        max = max * 1.1;
+    }
+
+    return QPair<double, double>(min, max);
+}
+
+BasicAxisItem *IntensityDataItem::xAxisItem()
+{
+    return dynamic_cast<BasicAxisItem *>(getItem(P_XAXIS));
+}
+
+BasicAxisItem *IntensityDataItem::yAxisItem()
+{
+    return dynamic_cast<BasicAxisItem *>(getItem(P_YAXIS));
+}
+
+//! Set axes viewport to original data.
+
+void IntensityDataItem::resetView()
+{
+    setAxesRangeToData();
+    if(!isZAxisLocked())
+        computeDataRange();
+}
+
+MaskContainerItem *IntensityDataItem::maskContainerItem()
+{
+    return dynamic_cast<MaskContainerItem *>(getItem(IntensityDataItem::T_MASKS));
+}
diff --git a/GUI/coregui/Models/IntensityDataItem.h b/GUI/coregui/Models/IntensityDataItem.h
new file mode 100644
index 0000000..0028f69
--- /dev/null
+++ b/GUI/coregui/Models/IntensityDataItem.h
@@ -0,0 +1,121 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/IntensityDataItem.h
+//! @brief     Defines class IntensityDataItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTENSITYDATAITEM_H
+#define INTENSITYDATAITEM_H
+
+#include "SessionItem.h"
+#include "IDetector2D.h"
+
+class BasicAxisItem;
+class MaskContainerItem;
+
+class BA_CORE_API_ IntensityDataItem : public SessionItem
+{
+public:
+    static const QString P_PROJECTIONS_FLAG;
+    static const QString P_TITLE;
+    static const QString P_IS_INTERPOLATED;
+    static const QString P_GRADIENT;
+    static const QString P_ZAXIS_MIN;
+    static const QString P_ZAXIS_MAX;
+    static const QString P_AXES_UNITS;
+    static const QString P_PROPERTY_PANEL_FLAG;
+    static const QString P_XAXIS;
+    static const QString P_YAXIS;
+    static const QString P_ZAXIS;
+    static const QString P_FILE_NAME;
+    static const QString T_MASKS;
+
+
+    explicit IntensityDataItem();
+    virtual ~IntensityDataItem();
+
+    OutputData<double> *getOutputData() { return m_data.get(); }
+    const OutputData<double> *getOutputData() const { return m_data.get(); }
+    void setOutputData(OutputData<double> *data);
+    void setRawDataVector(const OutputData<double> *data);
+
+    //! returns lower and upper zoom ranges of x-axis
+    double getLowerX() const;
+    double getUpperX() const;
+
+    //! returns min and max range of x-axis as given by IntensityData
+    double getXmin() const;
+    double getXmax() const;
+
+    //! returns lower and upper zoom ranges of y-axis
+    double getLowerY() const;
+    double getUpperY() const;
+
+    //! returns min and max range of y-axis as given by IntensityData
+    double getYmin() const;
+    double getYmax() const;
+
+    //! returns lower and upper zoom ranges of z-axis
+    double getLowerZ() const;
+    double getUpperZ() const;
+
+    QString getGradient() const;
+    bool isLogz() const;
+    bool isInterpolated() const;
+    QString getXaxisTitle() const;
+    QString getYaxisTitle() const;
+
+    //! return true if min, max range of Z-axis is locked (change not allowed)
+    bool isZAxisLocked() const;
+    void setZAxisLocked(bool state);
+
+//    void setNameFromProposed(const QString &proposed_name);
+
+    virtual QString getSelectedAxesUnits() const;
+
+    QString fileName(const QString &projectDir);
+
+    void updateDataRange();
+    void computeDataRange();
+    QPair<double, double> getDataRange() const;
+
+    BasicAxisItem *xAxisItem();
+    BasicAxisItem *yAxisItem();
+
+    void resetView();
+
+    MaskContainerItem *maskContainerItem();
+
+public slots:
+    void setLowerX(double xmin);
+    void setUpperX(double xmax);
+    void setLowerY(double ymin);
+    void setUpperY(double ymax);
+    void setLowerAndUpperZ(double zmin, double zmax);
+    void setLowerZ(double zmin);
+    void setUpperZ(double zmax);
+    void setLogz(bool logz);
+    void setInterpolated(bool interp);
+    void setXaxisTitle(QString xtitle);
+    void setYaxisTitle(QString ytitle);
+    void setAxesRangeToData();
+
+private:
+    void updateAxesZoomLevel();
+    void updateAxesLabels();
+
+    std::unique_ptr<OutputData<double> > m_data; //!< simulation results
+};
+
+#endif // INTENSITYDATAITEM_H
+
diff --git a/GUI/coregui/Models/InterferenceFunctionItems.cpp b/GUI/coregui/Models/InterferenceFunctionItems.cpp
new file mode 100644
index 0000000..81b014e
--- /dev/null
+++ b/GUI/coregui/Models/InterferenceFunctionItems.cpp
@@ -0,0 +1,115 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/InterferenceFunctionItems.cpp
+//! @brief     Implements InterferenceFunctionItems's classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InterferenceFunctionItems.h"
+#include "BornAgainNamespace.h"
+#include "ParameterTranslators.h"
+#include "ModelPath.h"
+#include "Units.h"
+
+const QString InterferenceFunctionRadialParaCrystalItem::P_PEAK_DISTANCE =
+        QString::fromStdString(BornAgain::PeakDistance);
+const QString InterferenceFunctionRadialParaCrystalItem::P_DAMPING_LENGTH =
+        QString::fromStdString(BornAgain::DampingLength);
+const QString InterferenceFunctionRadialParaCrystalItem::P_DOMAIN_SIZE =
+        QString::fromStdString(BornAgain::DomainSize);
+const QString InterferenceFunctionRadialParaCrystalItem::P_KAPPA =
+        QString::fromStdString(BornAgain::SizeSpaceCoupling);
+const QString InterferenceFunctionRadialParaCrystalItem::P_PDF = "PDF";
+
+const QString InterferenceFunction2DParaCrystalItem::P_ROTATION_ANGLE =
+        QString::fromStdString(BornAgain::Xi);
+const QString InterferenceFunction2DParaCrystalItem::P_DAMPING_LENGTH =
+        QString::fromStdString(BornAgain::DampingLength);
+const QString InterferenceFunction2DParaCrystalItem::P_DOMAIN_SIZE1 =
+        QString::fromStdString(BornAgain::DomainSize1);
+const QString InterferenceFunction2DParaCrystalItem::P_DOMAIN_SIZE2 =
+        QString::fromStdString(BornAgain::DomainSize2);
+const QString InterferenceFunction2DParaCrystalItem::P_XI_INTEGRATION = "Integration_over_xi";
+const QString InterferenceFunction2DParaCrystalItem::P_PDF1 = "PDF #1";
+const QString InterferenceFunction2DParaCrystalItem::P_PDF2 = "PDF #2";
+
+const QString InterferenceFunction1DLatticeItem::P_LENGTH =
+        QString::fromStdString(BornAgain::Length);
+const QString InterferenceFunction1DLatticeItem::P_ROTATION_ANGLE =
+        QString::fromStdString(BornAgain::Xi);
+const QString InterferenceFunction1DLatticeItem::P_DECAY_FUNCTION = "Decay Function";
+
+const QString InterferenceFunction2DLatticeItem::P_LATTICE_TYPE = "Lattice_type";
+const QString InterferenceFunction2DLatticeItem::P_ROTATION_ANGLE =
+        QString::fromStdString(BornAgain::Xi);
+const QString InterferenceFunction2DLatticeItem::P_DECAY_FUNCTION = "Decay Function";
+
+
+InterferenceFunctionRadialParaCrystalItem::InterferenceFunctionRadialParaCrystalItem(
+        )
+    : SessionGraphicsItem(Constants::InterferenceFunctionRadialParaCrystalType)
+{
+    addProperty(P_PEAK_DISTANCE, 20.0*Units::nanometer);
+    addProperty(P_DAMPING_LENGTH, 1000.0*Units::micrometer);
+    addProperty(P_DOMAIN_SIZE, 20.0*Units::micrometer);
+    addProperty(P_KAPPA, 0.0);
+    addGroupProperty(P_PDF, Constants::FTDistribution1DGroup);
+}
+
+InterferenceFunction2DParaCrystalItem::InterferenceFunction2DParaCrystalItem(
+        )
+    : SessionGraphicsItem(Constants::InterferenceFunction2DParaCrystalType)
+{
+    addGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
+                          Constants::LatticeGroup);
+    addProperty(P_DAMPING_LENGTH, 0.0);
+    addProperty(P_DOMAIN_SIZE1, 20.0*Units::micrometer);
+    addProperty(P_DOMAIN_SIZE2, 20.0*Units::micrometer);
+    addProperty(P_XI_INTEGRATION, true);
+    addProperty(P_ROTATION_ANGLE, 0.0);
+    getItem(P_ROTATION_ANGLE)->setEnabled(false);
+    addGroupProperty(P_PDF1, Constants::FTDistribution2DGroup);
+    addGroupProperty(P_PDF2, Constants::FTDistribution2DGroup);
+
+    LatticeTypeTranslator lattice_translator;
+    ModelPath::addParameterTranslator(lattice_translator);
+
+    mapper()->setOnPropertyChange(
+        [this](const QString &name) {
+            if(name == P_XI_INTEGRATION && isTag(P_ROTATION_ANGLE)) {
+                if(getItemValue(P_XI_INTEGRATION).toBool()) {
+                    getItem(P_ROTATION_ANGLE)->setEnabled(false);
+                } else {
+                    getItem(P_ROTATION_ANGLE)->setEnabled(true);
+                }
+            }
+    });
+}
+
+InterferenceFunction1DLatticeItem::InterferenceFunction1DLatticeItem()
+    : SessionGraphicsItem(Constants::InterferenceFunction1DLatticeType)
+{
+    addProperty(P_LENGTH, 20.0*Units::nanometer);
+    addProperty(P_ROTATION_ANGLE, 0.0);
+    addGroupProperty(P_DECAY_FUNCTION, Constants::FTDecayFunction1DGroup);
+}
+
+InterferenceFunction2DLatticeItem::InterferenceFunction2DLatticeItem(
+        )
+    : SessionGraphicsItem(Constants::InterferenceFunction2DLatticeType)
+{
+    addGroupProperty(P_LATTICE_TYPE, Constants::LatticeGroup);
+    addProperty(P_ROTATION_ANGLE, 0.0);
+    addGroupProperty(P_DECAY_FUNCTION, Constants::FTDecayFunction2DGroup);
+    LatticeTypeTranslator lattice_translator;
+    ModelPath::addParameterTranslator(lattice_translator);
+}
diff --git a/GUI/coregui/Models/InterferenceFunctionItems.h b/GUI/coregui/Models/InterferenceFunctionItems.h
new file mode 100644
index 0000000..78c0736
--- /dev/null
+++ b/GUI/coregui/Models/InterferenceFunctionItems.h
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/InterferenceFunctionItems.h
+//! @brief     Defines InterferenceFunctionItems's classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTIONITEMS_H
+#define INTERFERENCEFUNCTIONITEMS_H
+
+#include "SessionGraphicsItem.h"
+
+
+class BA_CORE_API_ InterferenceFunctionRadialParaCrystalItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_PEAK_DISTANCE;
+    static const QString P_DAMPING_LENGTH;
+    static const QString P_DOMAIN_SIZE;
+    static const QString P_KAPPA;
+    static const QString P_PDF;
+    explicit InterferenceFunctionRadialParaCrystalItem();
+    virtual ~InterferenceFunctionRadialParaCrystalItem(){}
+};
+
+
+class BA_CORE_API_ InterferenceFunction2DParaCrystalItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_ROTATION_ANGLE;
+    static const QString P_DAMPING_LENGTH;
+    static const QString P_DOMAIN_SIZE1;
+    static const QString P_DOMAIN_SIZE2;
+    static const QString P_XI_INTEGRATION;
+    static const QString P_PDF1;
+    static const QString P_PDF2;
+    explicit InterferenceFunction2DParaCrystalItem();
+    virtual ~InterferenceFunction2DParaCrystalItem(){}
+};
+
+
+class BA_CORE_API_ InterferenceFunction1DLatticeItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_LENGTH;
+    static const QString P_ROTATION_ANGLE;
+    static const QString P_DECAY_FUNCTION;
+    explicit InterferenceFunction1DLatticeItem();
+    virtual ~InterferenceFunction1DLatticeItem(){}
+};
+
+
+class BA_CORE_API_ InterferenceFunction2DLatticeItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_LATTICE_TYPE;
+    static const QString P_ROTATION_ANGLE;
+    static const QString P_DECAY_FUNCTION;
+    explicit InterferenceFunction2DLatticeItem();
+    virtual ~InterferenceFunction2DLatticeItem(){}
+};
+
+#endif // INTERFERENCEFUNCTIONITEMS_H
diff --git a/GUI/coregui/Models/ItemFactory.cpp b/GUI/coregui/Models/ItemFactory.cpp
new file mode 100644
index 0000000..5ca9875
--- /dev/null
+++ b/GUI/coregui/Models/ItemFactory.cpp
@@ -0,0 +1,254 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ItemFactory.cpp
+//! @brief     Implements class ItemFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemFactory.h"
+#include "AxesItems.h"
+#include "BeamAngleItems.h"
+#include "BeamItem.h"
+#include "BeamWavelengthItem.h"
+#include "DetectorItems.h"
+#include "FTDecayFunctionItems.h"
+#include "FTDistributionItems.h"
+#include "FitParameterItems.h"
+#include "FitSuiteItem.h"
+#include "FormFactorItems.h"
+#include "GUIHelpers.h"
+#include "GroupItem.h"
+#include "InstrumentItem.h"
+#include "IntensityDataItem.h"
+#include "InterferenceFunctionItems.h"
+#include "JobItem.h"
+#include "LatticeTypeItems.h"
+#include "LayerItem.h"
+#include "LayerRoughnessItems.h"
+#include "MagneticFieldItem.h"
+#include "MaskItems.h"
+#include "MaterialItem.h"
+#include "MinimizerItem.h"
+#include "MultiLayerItem.h"
+#include "ParameterTreeItems.h"
+#include "ParticleCompositionItem.h"
+#include "ParticleCoreShellItem.h"
+#include "ParticleDistributionItem.h"
+#include "ParticleItem.h"
+#include "ParticleLayoutItem.h"
+#include "PropertyItem.h"
+#include "RealDataItem.h"
+#include "RefractiveIndexItem.h"
+#include "ResolutionFunctionItems.h"
+#include "RotationItems.h"
+#include "SimulationOptionsItem.h"
+#include "TransformationItem.h"
+#include "VectorItem.h"
+#include "LinkInstrumentItem.h"
+#include <QDebug>
+
+namespace {
+template<typename T> SessionItem *createInstance() { return new T; }
+
+ItemFactory::ItemMap_t initializeItemMap() {
+    ItemFactory::ItemMap_t result;
+
+    result[Constants::MultiLayerType] = &createInstance<MultiLayerItem>;
+    result[Constants::LayerType] = &createInstance<LayerItem>;
+    result[Constants::ParticleLayoutType] = &createInstance<ParticleLayoutItem>;
+    result[Constants::ParticleType] = &createInstance<ParticleItem>;
+    result[Constants::TransformationType] = &createInstance<TransformationItem>;
+    result[Constants::ParticleCoreShellType] = &createInstance<ParticleCoreShellItem>;
+    result[Constants::ParticleCompositionType] = &createInstance<ParticleCompositionItem>;
+    result[Constants::ParticleDistributionType] = &createInstance<ParticleDistributionItem>;
+    result[Constants::InterferenceFunctionRadialParaCrystalType] = &createInstance<InterferenceFunctionRadialParaCrystalItem>;
+    result[Constants::InterferenceFunction2DParaCrystalType] = &createInstance<InterferenceFunction2DParaCrystalItem>;
+    result[Constants::InterferenceFunction2DLatticeType] = &createInstance<InterferenceFunction2DLatticeItem>;
+    result[Constants::InterferenceFunction1DLatticeType] = &createInstance<InterferenceFunction1DLatticeItem>;
+    result[Constants::InstrumentType] = &createInstance<InstrumentItem>;
+    result[Constants::DetectorType] = &createInstance<DetectorItem>;
+    result[Constants::BeamType] = &createInstance<BeamItem>;
+    result[Constants::VectorType] = &createInstance<VectorItem>;
+    result[Constants::PropertyType] = &createInstance<PropertyItem>;
+
+    result[Constants::AnisoPyramidType] = &createInstance<AnisoPyramidItem>;
+    result[Constants::BoxType] = &createInstance<BoxItem>;
+    result[Constants::ConeType] = &createInstance<ConeItem>;
+    result[Constants::Cone6Type] = &createInstance<Cone6Item>;
+    result[Constants::CuboctahedronType] = &createInstance<CuboctahedronItem>;
+    result[Constants::DodecahedronType] = &createInstance<DodecahedronItem>;
+    result[Constants::CylinderType] = &createInstance<CylinderItem>;
+    result[Constants::EllipsoidalCylinderType] = &createInstance<EllipsoidalCylinderItem>;
+    result[Constants::FullSphereType] = &createInstance<FullSphereItem>;
+    result[Constants::FullSpheroidType] = &createInstance<FullSpheroidItem>;
+    result[Constants::HemiEllipsoidType] = &createInstance<HemiEllipsoidItem>;
+    result[Constants::IcosahedronType] = &createInstance<IcosahedronItem>;
+    result[Constants::Prism3Type] = &createInstance<Prism3Item>;
+    result[Constants::Prism6Type] = &createInstance<Prism6Item>;
+    result[Constants::PyramidType] = &createInstance<PyramidItem>;
+    result[Constants::Ripple1Type] = &createInstance<Ripple1Item>;
+    result[Constants::Ripple2Type] = &createInstance<Ripple2Item>;
+    result[Constants::TetrahedronType] = &createInstance<TetrahedronItem>;
+    result[Constants::TruncatedCubeType] = &createInstance<TruncatedCubeItem>;
+    result[Constants::TruncatedSphereType] = &createInstance<TruncatedSphereItem>;
+    result[Constants::TruncatedSpheroidType] = &createInstance<TruncatedSpheroidItem>;
+
+    result[Constants::XRotationType] = &createInstance<XRotationItem>;
+    result[Constants::YRotationType] = &createInstance<YRotationItem>;
+    result[Constants::ZRotationType] = &createInstance<ZRotationItem>;
+    result[Constants::EulerRotationType] = &createInstance<EulerRotationItem>;
+
+    result[Constants::LayerBasicRoughnessType] = &createInstance<LayerBasicRoughnessItem>;
+    result[Constants::LayerZeroRoughnessType] = &createInstance<LayerZeroRoughnessItem>;
+
+    result[Constants::DetectorType] = &createInstance<DetectorItem>;
+    result[Constants::SphericalDetectorType] = &createInstance<SphericalDetectorItem>;
+    result[Constants::RectangularDetectorType] = &createInstance<RectangularDetectorItem>;
+
+    result[Constants::DistributionNoneType] = &createInstance<DistributionNoneItem>;
+    result[Constants::DistributionGateType] = &createInstance<DistributionGateItem>;
+    result[Constants::DistributionLorentzType] = &createInstance<DistributionLorentzItem>;
+    result[Constants::DistributionGaussianType] = &createInstance<DistributionGaussianItem>;
+    result[Constants::DistributionLogNormalType] = &createInstance<DistributionLogNormalItem>;
+    result[Constants::DistributionCosineType] = &createInstance<DistributionCosineItem>;
+
+    result[Constants::FTDistribution1DCauchyType] = &createInstance<FTDistribution1DCauchyItem>;
+    result[Constants::FTDistribution1DGaussType] = &createInstance<FTDistribution1DGaussItem>;
+    result[Constants::FTDistribution1DGateType] = &createInstance<FTDistribution1DGateItem>;
+    result[Constants::FTDistribution1DTriangleType] = &createInstance<FTDistribution1DTriangleItem>;
+    result[Constants::FTDistribution1DCosineType] = &createInstance<FTDistribution1DCosineItem>;
+    result[Constants::FTDistribution1DVoigtType] = &createInstance<FTDistribution1DVoigtItem>;
+
+    result[Constants::FTDistribution2DCauchyType] = &createInstance<FTDistribution2DCauchyItem>;
+    result[Constants::FTDistribution2DGaussType] = &createInstance<FTDistribution2DGaussItem>;
+    result[Constants::FTDistribution2DGateType] = &createInstance<FTDistribution2DGateItem>;
+    result[Constants::FTDistribution2DConeType] = &createInstance<FTDistribution2DConeItem>;
+    result[Constants::FTDistribution2DVoigtType] = &createInstance<FTDistribution2DVoigtItem>;
+
+    result[Constants::FTDecayFunction1DCauchyType] = &createInstance<FTDecayFunction1DCauchyItem>;
+    result[Constants::FTDecayFunction1DGaussType] = &createInstance<FTDecayFunction1DGaussItem>;
+    result[Constants::FTDecayFunction1DTriangleType] = &createInstance<FTDecayFunction1DTriangleItem>;
+    result[Constants::FTDecayFunction1DVoigtType] = &createInstance<FTDecayFunction1DVoigtItem>;
+
+    result[Constants::FTDecayFunction2DCauchyType] = &createInstance<FTDecayFunction2DCauchyItem>;
+    result[Constants::FTDecayFunction2DGaussType] = &createInstance<FTDecayFunction2DGaussItem>;
+    result[Constants::FTDecayFunction2DVoigtType] = &createInstance<FTDecayFunction2DVoigtItem>;
+
+    result[Constants::BasicLatticeType] = &createInstance<BasicLatticeTypeItem>;
+    result[Constants::SquareLatticeType] = &createInstance<SquareLatticeTypeItem>;
+    result[Constants::HexagonalLatticeType] = &createInstance<HexagonalLatticeTypeItem>;
+
+    result[Constants::MaterialType] = &createInstance<MaterialItem>;
+
+    result[Constants::RefractiveIndexType] = &createInstance<RefractiveIndexItem>;
+
+    result[Constants::MagneticFieldType] = &createInstance<MagneticFieldItem>;
+
+    result[Constants::JobItemType] = &createInstance<JobItem>;
+
+    result[Constants::IntensityDataType] = &createInstance<IntensityDataItem>;
+
+    result[Constants::BasicAxisType] = &createInstance<BasicAxisItem>;
+    result[Constants::AmplitudeAxisType] = &createInstance<AmplitudeAxisItem>;
+
+//    result[Constants::BeamDistributionType] = &createInstance<BeamDistributionItem>;
+    result[Constants::BeamWavelengthType] = &createInstance<BeamWavelengthItem>;
+    result[Constants::BeamAzimuthalAngleType] = &createInstance<BeamAzimuthalAngleItem>;
+    result[Constants::BeamInclinationAngleType] = &createInstance<BeamInclinationAngleItem>;
+
+    result[Constants::ResolutionFunctionNoneType] = &createInstance<ResolutionFunctionNoneItem>;
+    result[Constants::ResolutionFunction2DGaussianType] = &createInstance<ResolutionFunction2DGaussianItem>;
+
+    result[Constants::MaskContainerType] = &createInstance<MaskContainerItem>;
+    result[Constants::RectangleMaskType] = &createInstance<RectangleItem>;
+    result[Constants::PolygonPointType] = &createInstance<PolygonPointItem>;
+    result[Constants::PolygonMaskType] = &createInstance<PolygonItem>;
+    result[Constants::VerticalLineMaskType] = &createInstance<VerticalLineItem>;
+    result[Constants::HorizontalLineMaskType] = &createInstance<HorizontalLineItem>;
+    result[Constants::EllipseMaskType] = &createInstance<EllipseItem>;
+    result[Constants::MaskAllType] = &createInstance<MaskAllItem>;
+
+    result[Constants::RegionOfInterestType] = &createInstance<RegionOfInterestItem>;
+
+    result[Constants::GroupItemType] = &createInstance<GroupItem>;
+
+    result[Constants::ParameterContainerType] = &createInstance<ParameterContainerItem>;
+    result[Constants::ParameterLabelType] = &createInstance<ParameterLabelItem>;
+    result[Constants::ParameterType] = &createInstance<ParameterItem>;
+
+    result[Constants::FitParameterContainerType] = &createInstance<FitParameterContainerItem>;
+    result[Constants::FitParameterType] = &createInstance<FitParameterItem>;
+    result[Constants::FitParameterLinkType] = &createInstance<FitParameterLinkItem>;
+    result[Constants::FitSuiteType] = &createInstance<FitSuiteItem>;
+
+    result[Constants::SimulationOptionsType] = &createInstance<SimulationOptionsItem>;
+
+    result[Constants::RealDataType] = &createInstance<RealDataItem>;
+    result[Constants::LinkInstrumentType] = &createInstance<LinkInstrumentItem>;
+
+    result[Constants::MinimizerContainerType] = &createInstance<MinimizerContainerItem>;
+    result[Constants::MinuitMinimizerType] = &createInstance<MinuitMinimizerItem>;
+    result[Constants::GSLMultiMinimizerType] = &createInstance<GSLMultiMinimizerItem>;
+    result[Constants::GeneticMinimizerType] = &createInstance<GeneticMinimizerItem>;
+    result[Constants::GSLSimAnMinimizerType] = &createInstance<SimAnMinimizerItem>;
+    result[Constants::GSLLMAMinimizerType] = &createInstance<GSLLMAMinimizerItem>;
+    result[Constants::TestMinimizerType] = &createInstance<TestMinimizerItem>;
+
+    return result;
+}
+}
+
+QStringList ItemFactory::m_valid_top_item_names = QStringList()
+        << Constants::MultiLayerType
+        << Constants::LayerType
+        << Constants::ParticleLayoutType
+        << Constants::ParticleType
+        << Constants::ParticleCoreShellType
+        << Constants::ParticleCompositionType
+        << Constants::ParticleDistributionType
+        << Constants::TransformationType
+        << Constants::InterferenceFunctionRadialParaCrystalType
+        << Constants::InterferenceFunction2DParaCrystalType
+        << Constants::InterferenceFunction2DLatticeType;
+
+ItemFactory::ItemMap_t ItemFactory::m_item_map = initializeItemMap();
+
+SessionItem *ItemFactory::createItem(const QString &model_name,
+                                           SessionItem *parent)
+{
+    //qDebug() << "ItemFactory::createItem" << model_name;
+
+    if(!m_item_map.contains(model_name))
+        throw GUIHelpers::Error("ItemFactory::createItem() -> Error: Model name does not exist: "+model_name);
+
+    SessionItem *result = m_item_map[model_name]();
+    if(parent) {
+        parent->insertItem(-1, result);
+    }
+    //qDebug() << "       result:" << result;
+    return result;
+}
+
+SessionItem *ItemFactory::createEmptyItem()
+{
+    SessionItem *result = new SessionItem(QStringLiteral("ROOT_ITEM"));
+    return result;
+}
+
+QList<QString> ItemFactory::getValidTopItemNames() {
+    return m_valid_top_item_names;
+}
+
+bool ItemFactory::isValidItemType(const QString &name)
+{
+    return m_item_map.contains(name);
+}
diff --git a/GUI/coregui/Models/ItemFactory.h b/GUI/coregui/Models/ItemFactory.h
new file mode 100644
index 0000000..747a408
--- /dev/null
+++ b/GUI/coregui/Models/ItemFactory.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ItemFactory.h
+//! @brief     Defines class ItemFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMFACTORY_H
+#define ITEMFACTORY_H
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ ItemFactory
+{
+public:
+    typedef QMap<QString, SessionItem *(*)()> ItemMap_t;
+
+
+    //! create SessionItem of specific type and parent
+    static SessionItem *createItem(const QString &model_name,
+                                         SessionItem *parent=0);
+
+    //! create empty SessionItem that serves as a root item
+    static SessionItem *createEmptyItem();
+
+    //! retrieve list of all possible item names
+    static QList<QString> getValidTopItemNames();
+
+    //! returns true of factory supports given item type
+    static bool isValidItemType(const QString &name);
+
+private:
+    static QStringList m_valid_top_item_names;
+    static ItemMap_t m_item_map;
+    ItemFactory() {}
+    ~ItemFactory() {}
+};
+
+#endif // ITEMFACTORY_H
diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp
new file mode 100644
index 0000000..1a35dc7
--- /dev/null
+++ b/GUI/coregui/Models/JobItem.cpp
@@ -0,0 +1,327 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobItem.cpp
+//! @brief     Implements class JobItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobItem.h"
+#include "ComboProperty.h"
+#include "FitSuiteItem.h"
+#include "GUIHelpers.h"
+#include "InstrumentItem.h"
+#include "IntensityDataItem.h"
+#include "JobItemHelper.h"
+#include "MultiLayerItem.h"
+#include "ParameterTreeItems.h"
+#include "RealDataItem.h"
+#include "SimulationOptionsItem.h"
+#include "IntensityDataItem.h"
+#include "JobItemFunctions.h"
+#include <QDebug>
+
+namespace {
+    QVariant createStatusVariant() {
+        ComboProperty status;
+        status << Constants::STATUS_IDLE << Constants::STATUS_RUNNING
+               << Constants::STATUS_FITTING << Constants::STATUS_COMPLETED
+               << Constants::STATUS_CANCELED << Constants::STATUS_FAILED;
+        return status.getVariant();
+    }
+}
+
+const QString JobItem::P_IDENTIFIER = "Identifier";
+const QString JobItem::P_SAMPLE_NAME = "Sample";
+const QString JobItem::P_INSTRUMENT_NAME = "Instrument";
+const QString JobItem::P_WITH_FITTING = "With Fitting";
+const QString JobItem::P_STATUS = "Status";
+const QString JobItem::P_BEGIN_TIME = "Begin Time";
+const QString JobItem::P_END_TIME = "End Time";
+const QString JobItem::P_DURATION = "Duration";
+const QString JobItem::P_COMMENTS = "Comments";
+const QString JobItem::P_PROGRESS = "Progress";
+const QString JobItem::T_SAMPLE = "Sample Tag";
+const QString JobItem::T_INSTRUMENT = "Instrument Tag";
+const QString JobItem::T_OUTPUT = "Output Tag";
+const QString JobItem::T_REALDATA = "Real Data Tag";
+const QString JobItem::T_PARAMETER_TREE = "Parameter Tree";
+const QString JobItem::T_SIMULATION_OPTIONS = "Simulation Options";
+const QString JobItem::T_FIT_SUITE = "Fit Suite";
+
+JobItem::JobItem()
+    : SessionItem(Constants::JobItemType)
+{
+    setItemName(Constants::JobItemType);
+    addProperty(P_IDENTIFIER, QString())->setVisible(false);
+    addProperty(P_SAMPLE_NAME, QString())->setEditable(false);
+    addProperty(P_INSTRUMENT_NAME, QString())->setEditable(false);
+    addProperty(P_WITH_FITTING, false)->setVisible(false);
+
+//    ComboProperty status;
+//    status << Constants::STATUS_IDLE << Constants::STATUS_RUNNING << Constants::STATUS_FITTING << Constants::STATUS_COMPLETED
+//           << Constants::STATUS_CANCELED << Constants::STATUS_FAILED;
+    addProperty(P_STATUS, createStatusVariant())->setEditable(false);
+
+    addProperty(P_BEGIN_TIME, QString())->setEditable(false);
+    addProperty(P_END_TIME, QString())->setEditable(false);
+
+    SessionItem *durationItem = addProperty(P_DURATION, QString());
+    durationItem->setEditable(false);
+    durationItem->setToolTip(QStringLiteral("Duration of DWBA simulation in sec.msec format"));
+
+    addProperty(P_COMMENTS, QString())->setVisible(false);
+    addProperty(P_PROGRESS, 0)->setVisible(false);
+
+    registerTag(T_SAMPLE, 1, 1, QStringList() << Constants::MultiLayerType);
+    registerTag(T_INSTRUMENT, 1, 1, QStringList() << Constants::InstrumentType);
+    registerTag(T_OUTPUT, 1, 1, QStringList() << Constants::IntensityDataType);
+    registerTag(T_REALDATA, 1, 1, QStringList() << Constants::RealDataType);
+//    registerTag(T_PARAMETER_TREE, 0, -1, QStringList() << Constants::ParameterLabelType
+//                << Constants::ParameterType);
+    registerTag(T_PARAMETER_TREE, 0, -1, QStringList() << Constants::ParameterContainerType);
+
+    registerTag(T_SIMULATION_OPTIONS, 1, 1, QStringList() << Constants::SimulationOptionsType);
+
+    registerTag(T_FIT_SUITE, 1, 1, QStringList() << Constants::FitSuiteType);
+
+    mapper()->setOnChildPropertyChange(
+                [this](SessionItem* item, const QString &name)
+    {
+        if (item->parent() == this && item->modelType() == Constants::IntensityDataType
+            && name == IntensityDataItem::P_AXES_UNITS) {
+            auto intensityItem = dynamic_cast<IntensityDataItem *>(item);
+            JobItemHelper::updateDataAxes(intensityItem, instrumentItem());
+        }
+    });
+
+    mapper()->setOnPropertyChange(
+        [this](const QString &name){
+        if(name == P_NAME)
+            updateIntensityDataFileName();
+        }
+    );
+
+}
+
+JobItem::~JobItem()
+{
+}
+
+QString JobItem::getIdentifier() const
+{
+    return getItemValue(P_IDENTIFIER).toString();
+}
+
+void JobItem::setIdentifier(const QString &identifier)
+{
+    setItemValue(JobItem::P_IDENTIFIER, identifier);
+}
+
+IntensityDataItem *JobItem::intensityDataItem()
+{
+    return dynamic_cast<IntensityDataItem*>(getItem(T_OUTPUT));
+}
+
+QString JobItem::getStatus() const
+{
+    ComboProperty combo_property = getItemValue(P_STATUS).value<ComboProperty>();
+    return combo_property.getValue();
+}
+
+void JobItem::setStatus(const QString &status)
+{
+    ComboProperty combo_property = getItemValue(P_STATUS).value<ComboProperty>();
+    combo_property.setValue(status);
+    setItemValue(P_STATUS, combo_property.getVariant());
+    if(status == Constants::STATUS_FAILED) {
+        if(IntensityDataItem *intensityItem = intensityDataItem()) {
+            if(intensityItem->getOutputData())
+                intensityItem->getOutputData()->setAllTo(0.0);
+                emit intensityItem->emitDataChanged();
+        }
+    }
+}
+
+bool JobItem::isIdle() const
+{
+    ComboProperty combo_property = getItemValue(P_STATUS).value<ComboProperty>();
+    return combo_property.getValue() == Constants::STATUS_IDLE;
+}
+
+bool JobItem::isRunning() const
+{
+    ComboProperty combo_property = getItemValue(P_STATUS).value<ComboProperty>();
+    return combo_property.getValue() == Constants::STATUS_RUNNING;
+}
+
+bool JobItem::isCompleted() const
+{
+    ComboProperty combo_property = getItemValue(P_STATUS).value<ComboProperty>();
+    return combo_property.getValue() == Constants::STATUS_COMPLETED;
+}
+
+bool JobItem::isCanceled() const
+{
+    ComboProperty combo_property = getItemValue(P_STATUS).value<ComboProperty>();
+    return combo_property.getValue() == Constants::STATUS_CANCELED;
+}
+
+bool JobItem::isFailed() const
+{
+    ComboProperty combo_property = getItemValue(P_STATUS).value<ComboProperty>();
+    return combo_property.getValue() == Constants::STATUS_FAILED;
+}
+
+bool JobItem::isValidForFitting()
+{
+    if(isTag(T_REALDATA) && getItem(T_REALDATA)) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+void JobItem::setBeginTime(const QString &begin_time)
+{
+    setItemValue(P_BEGIN_TIME, begin_time);
+}
+
+void JobItem::setEndTime(const QString &end_time)
+{
+    setItemValue(P_END_TIME, end_time);
+}
+
+// Sets duration (msec -> "sec.msec")
+void JobItem::setDuration(int duration)
+{
+    QString str;
+    if(duration != 0)
+        str.sprintf("%7.3f", duration/1000.);
+    setItemValue(P_DURATION, str.simplified());
+}
+
+QString JobItem::getComments() const
+{
+    return getItemValue(P_COMMENTS).toString();
+}
+
+void JobItem::setComments(const QString &comments)
+{
+    setItemValue(P_COMMENTS, comments);
+}
+
+int JobItem::getProgress() const
+{
+    return getItemValue(P_PROGRESS).toInt();
+}
+
+void JobItem::setProgress(int progress)
+{
+    setItemValue(P_PROGRESS, progress);
+}
+
+int JobItem::getNumberOfThreads() const
+{
+    return getSimulationOptionsItem()->getNumberOfThreads();
+}
+
+void JobItem::setRunPolicy(const QString &run_policy)
+{
+    getSimulationOptionsItem()->setRunPolicy(run_policy);
+}
+
+bool JobItem::runImmediately() const
+{
+    return getSimulationOptionsItem()->runImmediately();
+}
+
+bool JobItem::runInBackground() const
+{
+    return getSimulationOptionsItem()->runInBackground();
+}
+
+//! Returns MultiLayerItem of this JobItem, if from_backup=true, then backup'ed version of
+//! multilayer will be used
+MultiLayerItem *JobItem::multiLayerItem()
+{
+    return dynamic_cast<MultiLayerItem*>(getItem(T_SAMPLE));
+}
+
+//! Returns InstrumentItem of this JobItem, if from_backup=true, then backup'ed version of
+//! the instrument will be used
+InstrumentItem *JobItem::instrumentItem()
+{
+    return dynamic_cast<InstrumentItem*>(getItem(T_INSTRUMENT));
+}
+
+void JobItem::setResults(const GISASSimulation *simulation)
+{
+    IntensityDataItem *intensityItem = intensityDataItem();
+    Q_ASSERT(intensityItem);
+
+    JobItemHelper::setResults(intensityItem, simulation);
+    updateIntensityDataFileName();
+}
+
+FitSuiteItem *JobItem::fitSuiteItem()
+{
+    return dynamic_cast<FitSuiteItem *>(getItem(JobItem::T_FIT_SUITE));
+}
+
+ParameterContainerItem *JobItem::parameterContainerItem()
+{
+    return dynamic_cast<ParameterContainerItem *>(getItem(JobItem::T_PARAMETER_TREE));
+}
+
+FitParameterContainerItem *JobItem::fitParameterContainerItem()
+{
+    if(FitSuiteItem *item = fitSuiteItem())
+        return item->fitParameterContainerItem();
+
+    return nullptr;
+}
+
+RealDataItem *JobItem::realDataItem()
+{
+    return dynamic_cast<RealDataItem*>(getItem(JobItem::T_REALDATA));
+}
+
+//! Updates the name of file to store intensity data.
+
+void JobItem::updateIntensityDataFileName()
+{
+    if(IntensityDataItem *item = intensityDataItem())
+        item->setItemValue(IntensityDataItem::P_FILE_NAME,
+                           JobItemFunctions::jobResultsFileName(*this));
+
+    if(RealDataItem *realItem = realDataItem())
+        if(IntensityDataItem *item = realItem->intensityDataItem())
+            item->setItemValue(IntensityDataItem::P_FILE_NAME,
+                               JobItemFunctions::jobReferenceFileName(*this));
+
+}
+
+SimulationOptionsItem *JobItem::getSimulationOptionsItem()
+{
+    return const_cast<SimulationOptionsItem *>(static_cast<const JobItem*>(this)->getSimulationOptionsItem());
+}
+
+const SimulationOptionsItem *JobItem::getSimulationOptionsItem() const
+{
+    const SimulationOptionsItem *result = dynamic_cast<const SimulationOptionsItem *>(getItem(T_SIMULATION_OPTIONS));
+    if(!result) {
+        throw GUIHelpers::Error("JobItem::getSimulationOptions() -> Error. "
+                                "Can't get SimulationOptionsItem");
+    }
+    return result;
+}
+
diff --git a/GUI/coregui/Models/JobItem.h b/GUI/coregui/Models/JobItem.h
new file mode 100644
index 0000000..b8f18cc
--- /dev/null
+++ b/GUI/coregui/Models/JobItem.h
@@ -0,0 +1,107 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobItem.h
+//! @brief     Defines class JobItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBITEM_H
+#define JOBITEM_H
+
+#include "SessionItem.h"
+class IntensityDataItem;
+class GISASSimulation;
+class MultiLayerItem;
+class InstrumentItem;
+class SimulationOptionsItem;
+class FitSuiteItem;
+class ParameterContainerItem;
+class FitParameterContainerItem;
+class RealDataItem;
+
+class BA_CORE_API_ JobItem : public SessionItem
+{
+
+public:
+    static const QString P_IDENTIFIER;
+    static const QString P_SAMPLE_NAME;
+    static const QString P_INSTRUMENT_NAME;
+    static const QString P_WITH_FITTING;
+    static const QString P_STATUS;
+    static const QString P_BEGIN_TIME;
+    static const QString P_END_TIME;
+    static const QString P_DURATION;
+    static const QString P_COMMENTS;
+    static const QString P_PROGRESS;
+    static const QString T_SAMPLE;
+    static const QString T_INSTRUMENT;
+    static const QString T_OUTPUT;
+    static const QString T_REALDATA;
+    static const QString T_PARAMETER_TREE;
+    static const QString T_SIMULATION_OPTIONS;
+    static const QString T_FIT_SUITE;
+    explicit JobItem();
+    virtual ~JobItem();
+
+    QString getIdentifier() const;
+    void setIdentifier(const QString &identifier);
+
+    IntensityDataItem *intensityDataItem();
+
+    QString getStatus() const;
+    void setStatus(const QString &status);
+
+    bool isIdle() const;
+    bool isRunning() const;
+    bool isCompleted() const;
+    bool isCanceled() const;
+    bool isFailed() const;
+    bool isValidForFitting();
+
+    void setBeginTime(const QString &begin_time);
+
+    void setEndTime(const QString &end_time);
+
+    void setDuration(int duration);
+
+    QString getComments() const;
+    void setComments(const QString &comments);
+
+    int getProgress() const;
+    void setProgress(int progress);
+
+    int getNumberOfThreads() const;
+
+    void setRunPolicy(const QString &run_policy);
+
+    bool runImmediately() const;
+    bool runInBackground() const;
+
+    MultiLayerItem *multiLayerItem();
+
+    InstrumentItem *instrumentItem();
+
+    SimulationOptionsItem *getSimulationOptionsItem();
+
+    void setResults(const GISASSimulation *simulation);
+
+    FitSuiteItem *fitSuiteItem();
+    ParameterContainerItem *parameterContainerItem();
+    FitParameterContainerItem *fitParameterContainerItem();
+    RealDataItem *realDataItem();
+
+private:
+    void updateIntensityDataFileName();
+    const SimulationOptionsItem *getSimulationOptionsItem() const;
+};
+
+#endif // JOBITEM_H
diff --git a/GUI/coregui/Models/JobItemFunctions.cpp b/GUI/coregui/Models/JobItemFunctions.cpp
new file mode 100644
index 0000000..51b3b68
--- /dev/null
+++ b/GUI/coregui/Models/JobItemFunctions.cpp
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobItemFunctions.h
+//! @brief     Defines auxiliary functions in JobItemFunctions namespace.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobItemFunctions.h"
+#include "GUIHelpers.h"
+#include "JobItem.h"
+#include "RealDataItem.h"
+#include "item_constants.h"
+
+namespace JobItemFunctions
+{
+const QString jobdata_file_prefix = "jobdata";
+const QString refdata_file_prefix = "refdata";
+const QString realdata_file_prefix = "realdata";
+
+QString intensityDataFileName(const QString& itemName, const QString& prefix);
+
+}
+
+//! Constructs the name of the file for intensity data.
+
+QString JobItemFunctions::intensityDataFileName(const QString& itemName, const QString& prefix)
+{
+    QString bodyName = GUIHelpers::getValidFileName(itemName);
+    return QString("%1_%2_0.int.gz").arg(prefix).arg(bodyName);
+}
+
+//! Constructs the name of the file with simulated intensities.
+
+QString JobItemFunctions::jobResultsFileName(const JobItem& jobItem)
+{
+    return JobItemFunctions::intensityDataFileName(jobItem.itemName(), jobdata_file_prefix);
+}
+
+//! Constructs the name of the file with reference data.
+
+QString JobItemFunctions::jobReferenceFileName(const JobItem& jobItem)
+{
+    return JobItemFunctions::intensityDataFileName(jobItem.itemName(), refdata_file_prefix);
+}
+
+//! Constructs the name of the intensity file belonging to real data item.
+
+QString JobItemFunctions::realDataFileName(const RealDataItem& realDataItem)
+{
+    return JobItemFunctions::intensityDataFileName(realDataItem.itemName(), realdata_file_prefix);
+}
diff --git a/GUI/coregui/Models/JobItemFunctions.h b/GUI/coregui/Models/JobItemFunctions.h
new file mode 100644
index 0000000..f5b21c5
--- /dev/null
+++ b/GUI/coregui/Models/JobItemFunctions.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobItemFunctions.h
+//! @brief     Defines auxiliary functions in JobItemFunctions namespace.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBITEMFUNCTIONS_H
+#define JOBITEMFUNCTIONS_H
+
+#include "WinDllMacros.h"
+#include <QString>
+
+class JobItem;
+class RealDataItem;
+
+//! Contains set of convenience methods for JobItem and its children.
+
+namespace JobItemFunctions
+{
+
+BA_CORE_API_ QString jobResultsFileName(const JobItem& jobItem);
+
+BA_CORE_API_ QString jobReferenceFileName(const JobItem& jobItem);
+
+BA_CORE_API_ QString realDataFileName(const RealDataItem& realDataItem);
+
+}
+
+#endif
diff --git a/GUI/coregui/Models/JobItemHelper.cpp b/GUI/coregui/Models/JobItemHelper.cpp
new file mode 100644
index 0000000..d2ed916
--- /dev/null
+++ b/GUI/coregui/Models/JobItemHelper.cpp
@@ -0,0 +1,288 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobItemHelper.cpp
+//! @brief     Implements class JobItemHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobItemHelper.h"
+#include "ComboProperty.h"
+#include "DomainObjectBuilder.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "InstrumentItem.h"
+#include "IntensityDataIOFactory.h"
+#include "IntensityDataItem.h"
+#include "JobItem.h"
+#include "RealDataItem.h"
+#include <QFileInfo>
+
+namespace
+{
+QMap<QString, IDetector2D::EAxesUnits> init_units_to_description_map()
+{
+    QMap<QString, IDetector2D::EAxesUnits> result;
+    result[Constants::UnitsNbins] = IDetector2D::NBINS;
+    result[Constants::UnitsRadians] = IDetector2D::RADIANS;
+    result[Constants::UnitsDegrees] = IDetector2D::DEGREES;
+    result[Constants::UnitsMm] = IDetector2D::MM;
+    result[Constants::UnitsQyQz] = IDetector2D::QYQZ;
+    return result;
+}
+
+QMap<IDetector2D::EAxesUnits, QString> init_description_to_units_map()
+{
+    QMap<IDetector2D::EAxesUnits, QString> result;
+    result[IDetector2D::NBINS] = Constants::UnitsNbins;
+    result[IDetector2D::RADIANS] = Constants::UnitsRadians;
+    result[IDetector2D::DEGREES] = Constants::UnitsDegrees;
+    result[IDetector2D::MM] = Constants::UnitsMm;
+    result[IDetector2D::QYQZ] = Constants::UnitsQyQz;
+    return result;
+}
+}
+
+QMap<QString, IDetector2D::EAxesUnits> JobItemHelper::m_name_to_units
+    = init_units_to_description_map();
+
+QMap<IDetector2D::EAxesUnits, QString> JobItemHelper::m_units_to_name
+    = init_description_to_units_map();
+
+void JobItemHelper::setResults(IntensityDataItem *intensityItem,
+                                     const GISASSimulation *simulation)
+{
+    IDetector2D::EAxesUnits selected_units = IDetector2D::DEFAULT;
+
+    if(intensityItem->getOutputData() == nullptr) {
+        const IDetector2D *detector = simulation->getInstrument().getDetector();
+        setIntensityItemAxesUnits(intensityItem, detector);
+        selected_units = getAxesUnitsFromName(intensityItem->getSelectedAxesUnits());
+        updateAxesTitle(intensityItem);
+    }
+
+    std::unique_ptr<OutputData<double>> data(simulation->getDetectorIntensity(selected_units));
+
+    if(intensityItem->getOutputData() == nullptr) {
+        intensityItem->setOutputData(data.release());
+    } else {
+        intensityItem->setRawDataVector(data.get());
+        if(!intensityItem->isZAxisLocked())
+            intensityItem->computeDataRange();
+    }
+
+}
+
+//! Updates axes of OutputData in IntensityData item to correspond with ::P_AXES_UNITS selection.
+//! InstrumentItem is used to get domain's detector map for given units.
+
+void JobItemHelper::updateDataAxes(IntensityDataItem *intensityItem,
+                                   const InstrumentItem *instrumentItem)
+{
+    Q_ASSERT(intensityItem);
+    Q_ASSERT(instrumentItem);
+
+    if (!intensityItem->getOutputData())
+        return;
+
+    IDetector2D::EAxesUnits requested_units
+        = getAxesUnitsFromName(intensityItem->getSelectedAxesUnits());
+
+    OutputData<double> *newData = createDetectorMap(instrumentItem, requested_units);
+    newData->setRawDataVector(intensityItem->getOutputData()->getRawDataVector());
+
+    intensityItem->setOutputData(newData);
+    intensityItem->setAxesRangeToData();
+    updateAxesTitle(intensityItem);
+}
+
+void JobItemHelper::adjustAxesUnitsToInstrument(IntensityDataItem *intensityDataItem,
+                                                    const InstrumentItem *instrumentItem)
+{
+    DomainObjectBuilder builder;
+    auto instrument = builder.buildInstrument(*instrumentItem);
+    instrument->initDetector();
+
+    IDetector2D::EAxesUnits preferrable_units
+        = preferableGUIAxesUnits(instrument->getDetector()->getDefaultAxesUnits());
+
+    ComboProperty unitsCombo;
+    foreach (auto units, instrument->getDetector()->getValidAxesUnits())
+        unitsCombo << getNameFromAxesUnits(units);
+    unitsCombo.setValue(getNameFromAxesUnits(preferrable_units));
+
+    intensityDataItem->setItemValue(IntensityDataItem::P_AXES_UNITS, unitsCombo.getVariant());
+}
+
+
+//! Saves intensityData in project directory
+
+void JobItemHelper::saveIntensityData(IntensityDataItem *intensityItem, const QString &projectDir)
+{
+    if(!intensityItem || !intensityItem->getOutputData())
+        return;
+
+    QString filename = intensityItem->fileName(projectDir);
+    IntensityDataIOFactory::writeOutputData(
+                *intensityItem->getOutputData(), filename.toStdString());
+}
+
+//! Loads intensityData from project directory
+
+void JobItemHelper::loadIntensityData(JobItem *jobItem, const QString &projectDir)
+{
+    IntensityDataItem *intensityItem = jobItem->intensityDataItem();
+    if(!intensityItem)
+        return;
+
+    QString filename = intensityItem->fileName(projectDir);
+
+    QFileInfo info(filename);
+    if (info.exists()) {
+        std::unique_ptr<OutputData<double>> rawData(
+            IntensityDataIOFactory::readOutputData(filename.toStdString()));
+        setIntensityItemAxesUnits(intensityItem, jobItem->instrumentItem());
+        intensityItem->setOutputData(rawData.release());
+
+    } else {
+        jobItem->setStatus(Constants::STATUS_FAILED);
+        QString warning("Error while loading job from file, intensity data file '");
+        warning.append(filename);
+        warning.append("' was not found");
+        jobItem->setComments(warning);
+    }
+}
+
+QString JobItemHelper::getNameFromAxesUnits(IDetector2D::EAxesUnits units)
+{
+    return m_units_to_name[units];
+}
+
+IDetector2D::EAxesUnits JobItemHelper::getAxesUnitsFromName(const QString &name)
+{
+    return m_name_to_units[name];
+}
+
+//! Converts detector default axes units into units most suitable for GUI.
+//! SphericalDetector's default units (RADIANS) will be converted to DEGREES
+//! RectangularDetector's default units (MM) will remain the same
+
+IDetector2D::EAxesUnits
+JobItemHelper::preferableGUIAxesUnits(IDetector2D::EAxesUnits default_units)
+{
+    if (default_units == IDetector2D::RADIANS)
+        return IDetector2D::DEGREES;
+
+    if (default_units == IDetector2D::MM)
+        return IDetector2D::MM;
+
+    return default_units;
+}
+
+//! Sets axes units suitable for given instrument.
+
+void JobItemHelper::setIntensityItemAxesUnits(IntensityDataItem *intensityItem,
+                                              const InstrumentItem *instrumentItem)
+{
+    DomainObjectBuilder builder;
+    auto instrument = builder.buildInstrument(*instrumentItem);
+    instrument->initDetector();
+    setIntensityItemAxesUnits(intensityItem, instrument->getDetector());
+}
+
+
+//! Sets axes units suitable for given detector. Currently selected units will  be preserved.
+
+void JobItemHelper::setIntensityItemAxesUnits(IntensityDataItem *intensityItem,
+                                              const IDetector2D *detector)
+{
+    ComboProperty orig = intensityItem->getItemValue(IntensityDataItem::P_AXES_UNITS)
+                              .value<ComboProperty>();
+
+//    if(!combo.getValues().isEmpty())
+//        return;
+
+    QString cachedUnits = orig.getCachedValue();
+
+    intensityItem->getItem(IntensityDataItem::P_AXES_UNITS)->setVisible(true);
+
+    ComboProperty combo;
+    foreach (auto units, detector->getValidAxesUnits()) {
+        combo << getNameFromAxesUnits(units);
+    }
+
+    if (cachedUnits.isEmpty()) {
+        IDetector2D::EAxesUnits preferrable_units
+            = preferableGUIAxesUnits(detector->getDefaultAxesUnits());
+        combo.setValue(getNameFromAxesUnits(preferrable_units));
+    } else {
+        combo.setValue(cachedUnits);
+    }
+
+    intensityItem->setItemValue(IntensityDataItem::P_AXES_UNITS, combo.getVariant());
+}
+
+
+void JobItemHelper::updateAxesTitle(IntensityDataItem *intensityItem)
+{
+    // axes labels
+    if (intensityItem->getSelectedAxesUnits() == Constants::UnitsRadians) {
+        intensityItem->setXaxisTitle("phi_f [rad]");
+        intensityItem->setYaxisTitle("alpha_f [rad]");
+    } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsDegrees) {
+        intensityItem->setXaxisTitle("phi_f [deg]");
+        intensityItem->setYaxisTitle("alpha_f [deg]");
+    } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsQyQz) {
+        intensityItem->setXaxisTitle("Qy [1/nm]");
+        intensityItem->setYaxisTitle("Qz [1/nm]");
+    } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsMm) {
+        intensityItem->setXaxisTitle("X [mm]");
+        intensityItem->setYaxisTitle("Y [mm]");
+    } else if (intensityItem->getSelectedAxesUnits() == Constants::UnitsNbins) {
+        intensityItem->setXaxisTitle("X [nbins]");
+        intensityItem->setYaxisTitle("Y [nbins]");
+    }
+}
+
+
+OutputData<double> *JobItemHelper::createDefaultDetectorMap(const InstrumentItem *instrumentItem)
+{
+    DomainObjectBuilder builder;
+    auto instrument = builder.buildInstrument(*instrumentItem);
+    instrument->initDetector();
+    IDetector2D::EAxesUnits units = instrument->getDetector()->getDefaultAxesUnits();
+    return instrument->getDetector()->createDetectorMap(instrument->getBeam(),
+                                                        preferableGUIAxesUnits(units));
+}
+
+
+
+//! creates detector map from instrument description with axes corresponding to given units
+OutputData<double> *JobItemHelper::createDetectorMap(const InstrumentItem *instrumentItem,
+                                                           IDetector2D::EAxesUnits units)
+{
+    DomainObjectBuilder builder;
+    auto instrument = builder.buildInstrument(*instrumentItem);
+    instrument->initDetector();
+
+    if (units == IDetector2D::DEFAULT)
+        units = instrument->getDetector()->getDefaultAxesUnits();
+
+    OutputData<double> *result
+        = instrument->getDetector()->createDetectorMap(instrument->getBeam(), units);
+
+    if (!result) {
+        throw GUIHelpers::Error("JobResultsPresenter::createDetectorMap -> Error. "
+                                "Can't create detector map.");
+    }
+
+    return result;
+}
diff --git a/GUI/coregui/Models/JobItemHelper.h b/GUI/coregui/Models/JobItemHelper.h
new file mode 100644
index 0000000..1a5ced0
--- /dev/null
+++ b/GUI/coregui/Models/JobItemHelper.h
@@ -0,0 +1,82 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobItemHelper.h
+//! @brief     Defines class JobItemHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBITEMHELPER_H
+#define JOBITEMHELPER_H
+
+#include "IDetector2D.h"
+#include <QMap>
+
+class GISASSimulation;
+class IntensityDataItem;
+class InstrumentItem;
+class JobItem;
+
+//! The JobItemHelper is a mediator between GISASSimulation, JobItem and IntensityDataItem.
+//! Used to modify OutputData's axes units as requested by IntensityDataItem.
+
+class BA_CORE_API_ JobItemHelper
+{
+public:
+    //! Sets simulation results into the IntensityDataItem
+    static void setResults(IntensityDataItem *intensityItem, const GISASSimulation *simulation);
+
+
+    //! updates axes of OutputData in IntensityData item
+    static void updateDataAxes(IntensityDataItem *intensityItem,
+                               const InstrumentItem *instrumentItem);
+
+    static void adjustAxesUnitsToInstrument(IntensityDataItem *intensityDataItem,
+                                                const InstrumentItem *instrumentItem);
+
+    //! saves intensity data into project directory
+    static void saveIntensityData(IntensityDataItem *intensityItem, const QString &projectDir);
+
+    //! load intensity data from project directory
+    static void loadIntensityData(JobItem *jobItem, const QString &projectDir);
+
+    //! returns axes units names from their domain counterpart
+    static QString getNameFromAxesUnits(IDetector2D::EAxesUnits units);
+
+    //! returns domain axes units type from their GUI name
+    static IDetector2D::EAxesUnits getAxesUnitsFromName(const QString &name);
+
+    //! converts detector default axes units into units most suitable for GUI
+    static IDetector2D::EAxesUnits preferableGUIAxesUnits(IDetector2D::EAxesUnits default_units);
+
+    static void setIntensityItemAxesUnits(IntensityDataItem *intensityItem, const InstrumentItem *instrumentItem);
+    static void setIntensityItemAxesUnits(IntensityDataItem *intensityItem, const IDetector2D *detector);
+
+
+    static void updateAxesTitle(IntensityDataItem *intensityItem);
+
+    static OutputData<double> *createDefaultDetectorMap(const InstrumentItem *instrumentItem);
+
+
+    static OutputData<double> *createDetectorMap(const InstrumentItem *instrumentItem,
+                                                 IDetector2D::EAxesUnits units);
+
+    //!< correspondance of GUI axes units names to their domain counterpart
+    static QMap<QString, IDetector2D::EAxesUnits> m_name_to_units;
+
+    //!< correspondance of domain detector axes types to their gui counterpart
+    static QMap<IDetector2D::EAxesUnits, QString> m_units_to_name;
+
+};
+
+
+#endif // JOBITEMHELPER_H
+
diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp
new file mode 100644
index 0000000..02037c4
--- /dev/null
+++ b/GUI/coregui/Models/JobModel.cpp
@@ -0,0 +1,210 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobModel.cpp
+//! @brief     Implements class JobModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobModel.h"
+#include "FitSuiteItem.h"
+#include "GUIHelpers.h"
+#include "InstrumentItem.h"
+#include "IntensityDataItem.h"
+#include "JobItem.h"
+#include "JobItemHelper.h"
+#include "JobQueueData.h"
+#include "MultiLayerItem.h"
+#include "ParameterTreeBuilder.h"
+#include "ParameterTreeItems.h"
+#include "RealDataItem.h"
+#include "SimulationOptionsItem.h"
+#include "JobModelFunctions.h"
+#include "ImportDataAssistant.h"
+#include <QDebug>
+
+
+JobModel::JobModel(QObject *parent)
+    : SessionModel(SessionXML::JobModelTag, parent)
+    , m_queue_data(0)
+{
+    m_queue_data = new JobQueueData(this);
+    connect(m_queue_data, SIGNAL(focusRequest(JobItem *)), this, SIGNAL(focusRequest(JobItem *)));
+    connect(m_queue_data, SIGNAL(globalProgress(int)), this, SIGNAL(globalProgress(int)));
+    setObjectName(SessionXML::JobModelTag);
+}
+
+JobModel::~JobModel()
+{
+    delete m_queue_data;
+}
+
+const JobItem *JobModel::getJobItemForIndex(const QModelIndex &index) const
+{
+    const JobItem *result = dynamic_cast<const JobItem *>(itemForIndex(index));
+    Q_ASSERT(result);
+    return result;
+}
+
+JobItem *JobModel::getJobItemForIndex(const QModelIndex &index)
+{
+    JobItem *result = dynamic_cast<JobItem *>(itemForIndex(index));
+    Q_ASSERT(result);
+    return result;
+}
+
+JobItem *JobModel::getJobItemForIdentifier(const QString &identifier)
+{
+    QModelIndex parentIndex;
+    for(int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
+        QModelIndex itemIndex = index( i_row, 0, parentIndex );
+        JobItem *jobItem = getJobItemForIndex(itemIndex);
+        if(jobItem->getIdentifier() == identifier) return jobItem;
+    }
+    return 0;
+}
+
+
+//! Main method to add a job
+JobItem *JobModel::addJob(const MultiLayerItem *multiLayerItem,
+                          const InstrumentItem *instrumentItem,
+                          const RealDataItem *realDataItem,
+                          const SimulationOptionsItem *optionItem)
+{
+    Q_ASSERT(multiLayerItem);
+    Q_ASSERT(instrumentItem);
+    Q_ASSERT(optionItem);
+
+    JobItem *jobItem = dynamic_cast<JobItem *>(insertNewItem(Constants::JobItemType));
+    jobItem->setItemName(generateJobName());
+    jobItem->setIdentifier(GUIHelpers::createUuid());
+
+    SessionItem *multilayer = copyParameterizedItem(multiLayerItem, jobItem, JobItem::T_SAMPLE);
+    multilayer->setItemName(Constants::MultiLayerType);
+    SessionItem *instrument = copyParameterizedItem(instrumentItem, jobItem, JobItem::T_INSTRUMENT);
+    instrument->setItemName(Constants::InstrumentType);
+    copyParameterizedItem(optionItem, jobItem, JobItem::T_SIMULATION_OPTIONS);
+
+    jobItem->getItem(JobItem::P_SAMPLE_NAME)->setValue(multiLayerItem->itemName());
+    jobItem->getItem(JobItem::P_INSTRUMENT_NAME)->setValue(instrumentItem->itemName());
+
+    ParameterTreeBuilder::createParameterTree(jobItem, JobItem::T_PARAMETER_TREE);
+
+    insertNewItem(Constants::IntensityDataType, indexOfItem(jobItem), -1, JobItem::T_OUTPUT);
+
+    if(realDataItem)
+        JobModelFunctions::setupJobItemForFit(jobItem, realDataItem);
+
+    return jobItem;
+}
+
+//! restore instrument and sample model from backup for given JobItem
+void JobModel::restore(JobItem *jobItem)
+{
+    restoreItem(jobItem->getItem(JobItem::T_PARAMETER_TREE));
+}
+
+bool JobModel::hasUnfinishedJobs()
+{
+    return m_queue_data->hasUnfinishedJobs();
+}
+
+void JobModel::clear()
+{
+    foreach (SessionItem *item, topItems(Constants::JobItemType)) {
+        removeJob(item->index());
+    }
+    SessionModel::clear();
+}
+
+//! Loads OutputData from the projectDir to JobItem
+
+void JobModel::loadNonXMLData(const QString &projectDir)
+{
+    for (int i = 0; i < rowCount(QModelIndex()); ++i) {
+        JobItem *jobItem = getJobItemForIndex(index(i, 0, QModelIndex()));
+        JobItemHelper::loadIntensityData(jobItem, projectDir);
+        if(RealDataItem *refItem = jobItem->realDataItem()) {
+            ImportDataAssistant::loadIntensityData(refItem, projectDir);
+            refItem->linkToInstrument(jobItem->instrumentItem());
+        }
+    }
+}
+
+//! Saves JobItem's OutputData to the projectDir
+
+void JobModel::saveNonXMLData(const QString &projectDir)
+{
+    for (int i = 0; i < rowCount(QModelIndex()); ++i) {
+        JobItem *jobItem = getJobItemForIndex(index(i, 0, QModelIndex()));
+        JobItemHelper::saveIntensityData(jobItem->intensityDataItem(), projectDir);
+        if(RealDataItem *refItem = jobItem->realDataItem())
+            JobItemHelper::saveIntensityData(refItem->intensityDataItem(), projectDir);
+    }
+}
+
+void JobModel::onCancelAllJobs()
+{
+    m_queue_data->onCancelAllJobs();
+}
+
+void JobModel::runJob(const QModelIndex &index)
+{
+    m_queue_data->runJob(getJobItemForIndex(index));
+}
+
+void JobModel::cancelJob(const QModelIndex &index)
+{
+    qDebug() << "JobModel::cancelJob(const QModelIndex &index)";
+    m_queue_data->cancelJob(getJobItemForIndex(index)->getIdentifier());
+}
+
+void JobModel::removeJob(const QModelIndex &index)
+{
+    qDebug() << "NJobModel::removeJob(const QModelIndex &index)";
+    JobItem *jobItem = getJobItemForIndex(index);
+    Q_ASSERT(jobItem);
+    m_queue_data->removeJob(jobItem->getIdentifier());
+
+    emit aboutToDeleteJobItem(jobItem);
+    removeRows(index.row(), 1, QModelIndex());
+}
+
+//! generates job name
+QString JobModel::generateJobName()
+{
+    int glob_index = 0;
+    QModelIndex parentIndex;
+    for(int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
+         QModelIndex itemIndex = index( i_row, 0, parentIndex );
+
+         if (SessionItem *item = itemForIndex(itemIndex)){
+             if(item->modelType() == Constants::JobItemType) {
+                 QString jobName = item->itemName();
+                 if(jobName.startsWith("job")) {
+                     int job_index = jobName.remove(0,3).toInt();
+                     if(job_index > glob_index) glob_index = job_index;
+                 }
+             }
+         }
+    }
+    return QString("job")+QString::number(++glob_index);
+}
+
+void JobModel::restoreItem(SessionItem *item)
+{
+    if (ParameterItem *parameter = dynamic_cast<ParameterItem*>(item)) {
+        parameter->propagateValueLink(true);
+    }
+    for (auto child : item->childItems()) {
+        restoreItem(child);
+    }
+}
diff --git a/GUI/coregui/Models/JobModel.h b/GUI/coregui/Models/JobModel.h
new file mode 100644
index 0000000..55f393f
--- /dev/null
+++ b/GUI/coregui/Models/JobModel.h
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobModel.h
+//! @brief     Defines class JobModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+#ifndef JOBMODEL_H
+#define JOBMODEL_H
+
+#include "SessionModel.h"
+class JobQueueData;
+class JobItem;
+class MultiLayerItem;
+class InstrumentItem;
+class RealDataItem;
+class SimulationOptionsItem;
+
+class BA_CORE_API_ JobModel : public SessionModel
+{
+    Q_OBJECT
+
+public:
+    explicit JobModel(QObject *parent = 0);
+    virtual ~JobModel();
+
+    const JobItem *getJobItemForIndex(const QModelIndex &index) const;
+    JobItem *getJobItemForIndex(const QModelIndex &index);
+
+    JobItem *getJobItemForIdentifier(const QString &identifier);
+
+    JobItem *addJob(const MultiLayerItem *multiLayerItem,
+                    const InstrumentItem *instrumentItem,
+                    const RealDataItem *realDataItem,
+                    const SimulationOptionsItem *optionItem);
+
+    void restore(JobItem *jobItem);
+
+    bool hasUnfinishedJobs();
+
+    void clear();
+
+    void loadNonXMLData(const QString &projectDir);
+    void saveNonXMLData(const QString &projectDir);
+
+signals:
+    void aboutToDeleteJobItem(JobItem *item);
+    void focusRequest(JobItem *item);
+    void globalProgress(int);
+
+public slots:
+    void onCancelAllJobs();
+    void runJob(const QModelIndex &index);
+    void cancelJob(const QModelIndex &index);
+    void removeJob(const QModelIndex &index);
+
+private:
+    QString generateJobName();
+    void restoreItem(SessionItem *item);
+    JobQueueData *m_queue_data;
+};
+
+#endif // JOBMODEL_H
diff --git a/GUI/coregui/Models/JobModelFunctions.cpp b/GUI/coregui/Models/JobModelFunctions.cpp
new file mode 100644
index 0000000..da7f24c
--- /dev/null
+++ b/GUI/coregui/Models/JobModelFunctions.cpp
@@ -0,0 +1,170 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobModelFunctions.cpp
+//! @brief     Implements auxiliary functions in JobModelFunctions namespace.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobModelFunctions.h"
+#include "JobModel.h"
+#include "JobItem.h"
+#include "RealDataItem.h"
+#include "IntensityDataItem.h"
+#include "FitSuiteItem.h"
+#include "InstrumentItem.h"
+#include "GUIHelpers.h"
+#include "MaskUnitsConverter.h"
+#include "DetectorItems.h"
+#include "MaskItems.h"
+#include "DetectorFunctions.h"
+#include "DomainObjectBuilder.h"
+#include "Instrument.h"
+#include "JobItemHelper.h"
+#include "IDetector2D.h"
+#include "JobItemFunctions.h"
+#include <QDebug>
+
+namespace JobModelFunctions {
+void copyRealDataItem(JobItem *jobItem, const RealDataItem *realDataItem);
+void processInstrumentLink(JobItem *jobItem);
+void copyMasksToInstrument(JobItem *jobItem);
+void cropRealData(JobItem *jobItem);
+void createFitContainers(JobItem *jobItem);
+}
+
+//! Setups JobItem for fit.
+
+void JobModelFunctions::setupJobItemForFit(JobItem *jobItem, const RealDataItem *realDataItem)
+{
+    if(!jobItem->instrumentItem())
+        throw GUIHelpers::Error("JobModelFunctions::processInstrumentLink() -> Error. "
+                                "No instrument.");
+
+    JobModelFunctions::copyRealDataItem(jobItem, realDataItem);
+    JobModelFunctions::processInstrumentLink(jobItem);
+    JobModelFunctions::copyMasksToInstrument(jobItem);
+    JobModelFunctions::cropRealData(jobItem);
+    JobModelFunctions::createFitContainers(jobItem);
+}
+
+
+//! Copy RealDataItem to jobItem intended for fitting.
+
+void JobModelFunctions::copyRealDataItem(JobItem *jobItem, const RealDataItem *realDataItem)
+{
+    if(!realDataItem)
+        return;
+
+    SessionModel *model = jobItem->model();
+
+    RealDataItem *realDataItemCopy = dynamic_cast<RealDataItem *>(
+        model->copyParameterizedItem(realDataItem, jobItem, JobItem::T_REALDATA));
+    Q_ASSERT(realDataItemCopy);
+
+    realDataItemCopy->intensityDataItem()->setOutputData(
+                realDataItem->intensityDataItem()->getOutputData()->clone());
+
+    // adapting the name to job name
+    realDataItemCopy->intensityDataItem()->setItemValue(IntensityDataItem::P_FILE_NAME,
+        JobItemFunctions::jobReferenceFileName(*jobItem));
+}
+
+//! Links RealDataItem to the JobItem's instrument.
+// (re-)Linking is necessary because of following reason
+// 1) Copying of RealDataItem from RealDataModel on board of JobItem requires relink to the copied
+//    insturment
+// 2) During relink all masks (if exists) will be converted to the default units of current detector
+
+void JobModelFunctions::processInstrumentLink(JobItem *jobItem)
+{
+    RealDataItem *realData = jobItem->realDataItem();
+    if(!realData)
+        throw GUIHelpers::Error("JobModelFunctions::processInstrumentLink() -> Error. No data.");
+
+    realData->linkToInstrument(jobItem->instrumentItem());
+}
+
+//! Copies masks and ROI from RealDataItem on board of instrument.
+
+void JobModelFunctions::copyMasksToInstrument(JobItem *jobItem)
+{
+    IntensityDataItem *intensityItem = jobItem->realDataItem()->intensityDataItem();
+    DetectorItem *detector = jobItem->instrumentItem()->detectorItem();
+
+    // removing original masks from the detector, if exists
+    if(detector->maskContainerItem())
+        detector->takeItem(0, DetectorItem::T_MASKS);
+
+    if(MaskContainerItem *container = intensityItem->maskContainerItem()) {
+        SessionModel *model = detector->model();
+        model->copyParameterizedItem(container, detector, DetectorItem::T_MASKS);
+    }
+}
+
+//! Crops RealDataItem to the region of interest. TODO is there better place?
+
+void JobModelFunctions::cropRealData(JobItem *jobItem) {
+    RealDataItem *realData = jobItem->realDataItem();
+
+    // adjusting real data to the size of region of interest
+    IntensityDataItem *intensityItem = realData->intensityDataItem();
+
+    DomainObjectBuilder builder;
+    auto instrument = builder.buildInstrument(*jobItem->instrumentItem());
+    instrument->initDetector();
+
+    IDetector2D::EAxesUnits requested_units
+        = JobItemHelper::getAxesUnitsFromName(intensityItem->getSelectedAxesUnits());
+    qDebug() << "AAAAAAa" << requested_units << intensityItem->getSelectedAxesUnits();
+
+    std::unique_ptr<OutputData<double>> adjustedData = DetectorFunctions::createDataSet(
+                *instrument.get(), *intensityItem->getOutputData(), true, requested_units);
+    intensityItem->setOutputData(adjustedData.release());
+    intensityItem->setAxesRangeToData();
+}
+
+//! Creates necessary fit containers for jobItem intended for fitting.
+
+void JobModelFunctions::createFitContainers(JobItem *jobItem)
+{
+    SessionModel *model = jobItem->model();
+
+    SessionItem *fitSuiteItem = jobItem->getItem(JobItem::T_FIT_SUITE);
+    if(fitSuiteItem != nullptr) {
+        throw GUIHelpers::Error("JobModel::createFitContainers() -> Error. Attempt to create "
+                                "a second FitSuiteItem.");
+    }
+
+    fitSuiteItem = model->insertNewItem(Constants::FitSuiteType,
+                                 jobItem->index(), -1, JobItem::T_FIT_SUITE);
+
+    SessionItem *parsContainerItem = fitSuiteItem->getItem(FitSuiteItem::T_FIT_PARAMETERS);
+    if(parsContainerItem != nullptr) {
+        throw GUIHelpers::Error("JobModel::createFitContainers() -> Error. Attempt to create "
+                                "a second FitParameterContainer.");
+    }
+
+    parsContainerItem = model->insertNewItem(Constants::FitParameterContainerType,
+                                      fitSuiteItem->index(), -1, FitSuiteItem::T_FIT_PARAMETERS);
+
+    // Minimizer settings
+    SessionItem *minimizerContainerItem = fitSuiteItem->getItem(FitSuiteItem::T_MINIMIZER);
+    if(minimizerContainerItem != nullptr) {
+        throw GUIHelpers::Error("JobModel::createFitContainers() -> Error. Attempt to create "
+                                "a second MinimizerContainer.");
+    }
+
+    minimizerContainerItem = model->insertNewItem(Constants::MinimizerContainerType,
+                                      fitSuiteItem->index(), -1, FitSuiteItem::T_MINIMIZER);
+
+}
+
diff --git a/GUI/coregui/Models/JobModelFunctions.h b/GUI/coregui/Models/JobModelFunctions.h
new file mode 100644
index 0000000..ac4a4c4
--- /dev/null
+++ b/GUI/coregui/Models/JobModelFunctions.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobModelFunctions.h
+//! @brief     Defines auxiliary functions in JobModelFunctions namespace.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBMODELFUNCTIONS_H
+#define JOBMODELFUNCTIONS_H
+
+#include "WinDllMacros.h"
+
+class JobItem;
+class RealDataItem;
+
+//! Contains set of functions to extend JobModel functionality.
+//! Handles setup of JobItem in fitting context.
+
+namespace JobModelFunctions
+{
+
+BA_CORE_API_ void setupJobItemForFit(JobItem *jobItem, const RealDataItem *realDataItem);
+
+}
+
+
+#endif
+
diff --git a/GUI/coregui/Models/JobQueueData.cpp b/GUI/coregui/Models/JobQueueData.cpp
new file mode 100644
index 0000000..40480af
--- /dev/null
+++ b/GUI/coregui/Models/JobQueueData.cpp
@@ -0,0 +1,291 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobQueueData.cpp
+//! @brief     Implements class JobQueueData
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobQueueData.h"
+#include "DomainSimulationBuilder.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "JobWorker.h"
+#include <QDebug>
+#include <QThread>
+
+JobQueueData::JobQueueData(JobModel *jobModel)
+    : m_jobModel(jobModel)
+{
+
+}
+
+//! Returns the thread for given identifier.
+
+QThread *JobQueueData::getThread(QString identifier)
+{
+    QMap<QString, QThread *>::const_iterator it = m_threads.find(identifier);
+    if(it != m_threads.end()) {
+        return it.value();
+    }
+    return 0;
+}
+
+//! Returns job runner for given identifier.
+
+JobWorker *JobQueueData::getRunner(QString identifier)
+{
+    QMap<QString, JobWorker *>::const_iterator it = m_runners.find(identifier);
+    if(it != m_runners.end()) {
+        return it.value();
+    }
+    return 0;
+}
+
+//! Returns the simulation (if exists) for given identifier.
+
+GISASSimulation *JobQueueData::getSimulation(QString identifier)
+{
+    QMap<QString, GISASSimulation *>::const_iterator it = m_simulations.find(identifier);
+    if(it != m_simulations.end()) {
+        return it.value();
+    }
+    return 0;
+}
+
+bool JobQueueData::hasUnfinishedJobs()
+{
+    return m_simulations.size();
+}
+
+//! Submits job and run it in a thread.
+
+void JobQueueData::runJob(JobItem *jobItem)
+{
+    QString identifier = jobItem->getIdentifier();
+    if(getThread(identifier)) {
+        qDebug() << "JobQueueData::runInThread() -> Thread is already running";
+        return;
+    }
+
+    if(getSimulation(identifier))
+        throw GUIHelpers::Error("JobQueueData::runJob() -> Error. Simulation is already existing.");
+
+    GISASSimulation *simulation(0);
+    try{
+        simulation = DomainSimulationBuilder::getSimulation(jobItem->multiLayerItem(),
+                                                            jobItem->instrumentItem(),
+                                                            jobItem->getSimulationOptionsItem());
+    } catch(const std::exception &ex) {
+        QString message("JobQueueData::runJob() -> Error. "
+                        "Attempt to create sample/instrument object from user description "
+                        "has failed with following error message.\n\n");
+        message += QString::fromStdString(std::string(ex.what()));
+        jobItem->setComments(message);
+        jobItem->setProgress(100);
+        jobItem->setStatus(Constants::STATUS_FAILED);
+        emit focusRequest(jobItem);
+        return;
+    }
+
+    m_simulations[identifier] = simulation;
+
+    JobWorker *runner = new JobWorker(identifier, simulation);
+    m_runners[identifier] = runner;
+
+    QThread *thread = new QThread();
+    runner->moveToThread(thread);
+    m_threads[identifier] = thread;
+
+    // thread will start the runner
+    connect(thread, SIGNAL(started()), runner, SLOT(start()));
+
+    // after runner is finished it will tell to the thread to quit (weared behaviour)
+    //connect(runner, SIGNAL(finished()), thread, SLOT(quit()));
+
+    // finished thread will be removed from the list
+    connect(thread, SIGNAL(finished()), this, SLOT(onFinishedThread()));
+
+    // connecting the runner to started/progress slots
+    connect(runner, SIGNAL(started()), this, SLOT(onStartedJob()));
+    connect(runner, SIGNAL(progressUpdate()), this, SLOT(onProgressUpdate()));
+
+    // finished job will do all cleanup
+    connect(runner, SIGNAL(finished()), this, SLOT(onFinishedJob()));
+
+    thread->start();
+}
+
+//! Cancels running job.
+
+void JobQueueData::cancelJob(const QString &identifier)
+{
+    if(getThread(identifier)) {
+        JobWorker *runner = getRunner(identifier);
+        runner->terminate();
+    }
+}
+
+//! Remove job from list completely.
+
+void JobQueueData::removeJob(const QString &identifier)
+{
+    cancelJob(identifier);
+    clearSimulation(identifier);
+}
+
+//! Sets JobItem properties when the job is going to start.
+
+void JobQueueData::onStartedJob()
+{
+    JobWorker *runner = qobject_cast<JobWorker *>(sender());
+    Q_ASSERT(runner);
+    JobItem *jobItem = m_jobModel->getJobItemForIdentifier(runner->getIdentifier());
+    jobItem->setProgress(0);
+    jobItem->setStatus(Constants::STATUS_RUNNING);
+    jobItem->setBeginTime(GUIHelpers::currentDateTime());
+    jobItem->setEndTime(QString());
+}
+
+//! Performs necessary actions when job is finished.
+
+void JobQueueData::onFinishedJob()
+{
+    JobWorker *runner = qobject_cast<JobWorker *>(sender());
+    Q_ASSERT(runner);
+
+    JobItem *jobItem = m_jobModel->getJobItemForIdentifier(runner->getIdentifier());
+
+    processFinishedJob(runner, jobItem);
+
+    // I tell to the thread to exit here (instead of connecting JobRunner::finished
+    // to the QThread::quit because of strange behaviour)
+    getThread(runner->getIdentifier())->quit();
+
+    emit focusRequest(jobItem);
+
+    clearSimulation(runner->getIdentifier());
+    assignForDeletion(runner);
+
+    if(!hasUnfinishedJobs())
+        emit globalProgress(100);
+}
+
+void JobQueueData::onFinishedThread()
+{
+    QThread *thread = qobject_cast<QThread *>(sender());
+    assignForDeletion(thread);
+}
+
+void JobQueueData::onProgressUpdate()
+{
+    JobWorker *runner = qobject_cast<JobWorker *>(sender());
+    Q_ASSERT(runner);
+    JobItem *jobItem = m_jobModel->getJobItemForIdentifier(runner->getIdentifier());
+    jobItem->setProgress(runner->getProgress());
+    updateGlobalProgress();
+}
+
+//! Estimates global progress from the progress of multiple running jobs and
+//! emmits appropriate signal.
+
+void JobQueueData::updateGlobalProgress()
+{
+    int global_progress(0);
+    int nRunningJobs(0);
+    QModelIndex parentIndex;
+    for(int i_row = 0; i_row < m_jobModel->rowCount(parentIndex); ++i_row) {
+        QModelIndex itemIndex = m_jobModel->index( i_row, 0, parentIndex );
+        JobItem *jobItem = m_jobModel->getJobItemForIndex(itemIndex);
+        if(jobItem->isRunning()) {
+            global_progress += jobItem->getProgress();
+            nRunningJobs++;
+        }
+    }
+    if(nRunningJobs) {
+        global_progress /= nRunningJobs;
+    } else {
+        global_progress=-1;
+    }
+    emit globalProgress(global_progress);
+}
+
+//! Cancels all running jobs.
+
+void JobQueueData::onCancelAllJobs()
+{
+    QStringList keys = m_threads.keys();
+    foreach(QString key, keys) {
+        cancelJob(key);
+    }
+}
+
+//! Removes QThread from the map of known threads, assigns it for deletion.
+
+void JobQueueData::assignForDeletion(QThread *thread)
+{
+    Q_ASSERT(thread);
+    for(auto it=m_threads.begin(); it!=m_threads.end(); ++it) {
+        if(it.value() == thread) {
+            thread->deleteLater();
+            m_threads.erase(it);
+            return;
+        }
+    }
+    throw GUIHelpers::Error("JobQueueData::assignForDeletion() -> Error! Can't find thread.");
+}
+
+//! Removes JobRunner from the map of known runners, assigns it for deletion.
+
+void JobQueueData::assignForDeletion(JobWorker *runner)
+{
+    Q_ASSERT(runner);
+    runner->disconnect();
+    for(auto it=m_runners.begin(); it!=m_runners.end(); ++it) {
+        if(it.value() == runner) {
+            runner->deleteLater();
+            m_runners.erase(it);
+            return;
+        }
+    }
+    throw GUIHelpers::Error("JobQueueData::assignForDeletion() -> Error! Can't find the runner.");
+}
+
+void JobQueueData::clearSimulation(const QString &identifier)
+{
+    GISASSimulation *simulation = getSimulation(identifier);
+    m_simulations.remove(identifier);
+    delete simulation;
+}
+
+//! Set all data of finished job
+
+void JobQueueData::processFinishedJob(JobWorker *runner, JobItem *jobItem)
+{
+    jobItem->setEndTime(GUIHelpers::currentDateTime());
+    jobItem->setDuration(runner->getSimulationDuration());
+
+    // propagating status of runner
+    jobItem->setStatus(runner->getStatus());
+    if(jobItem->isFailed()) {
+        jobItem->setComments(runner->getFailureMessage());
+    } else {
+        // propagating simulation results
+        GISASSimulation *simulation = getSimulation(runner->getIdentifier());
+        jobItem->setResults(simulation);
+    }
+
+    // fixing job progress (if job was successfull, but due to wrong estimation, progress not 100%)
+    if(jobItem->isCompleted())
+        jobItem->setProgress(100);
+}
diff --git a/GUI/coregui/Models/JobQueueData.h b/GUI/coregui/Models/JobQueueData.h
new file mode 100644
index 0000000..5cebf0c
--- /dev/null
+++ b/GUI/coregui/Models/JobQueueData.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobQueueData.h
+//! @brief     Defines class JobQueueData
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBQUEUEDATA_H
+#define JOBQUEUEDATA_H
+
+#include "WinDllMacros.h"
+#include <QMap>
+#include <QObject>
+
+class JobItem;
+class JobModel;
+class GISASSimulation;
+class JobWorker;
+
+//! The JobQueueData class holds all objects/logic to run simulation in a thread.
+
+class BA_CORE_API_ JobQueueData : public QObject
+{
+    Q_OBJECT
+public:
+    JobQueueData(JobModel *jobModel);
+
+    QThread *getThread(QString identifier);
+    JobWorker *getRunner(QString identifier);
+    GISASSimulation *getSimulation(QString identifier);
+
+    bool hasUnfinishedJobs();
+
+signals:
+    void globalProgress(int);
+    void focusRequest(JobItem *jobItem);
+
+public slots:
+    void onStartedJob();
+    void onProgressUpdate();
+    void onFinishedJob();
+
+    void onFinishedThread();
+    void onCancelAllJobs();
+
+    void runJob(JobItem *jobItem);
+    void cancelJob(const QString &identifier);
+    void removeJob(const QString &identifier);
+
+private:
+    void assignForDeletion(QThread *thread);
+    void assignForDeletion(JobWorker *runner);
+    void clearSimulation(const QString &identifier);
+    void processFinishedJob(JobWorker *runner, JobItem *jobItem);
+
+    void updateGlobalProgress();
+
+    QMap<QString, QThread *> m_threads; //! correspondance of JobIdentifier and running threads
+    QMap<QString, JobWorker *> m_runners; //! correspondance of JobIdentifier and JobRunner's
+    QMap<QString, GISASSimulation *> m_simulations; //! correspondance of JobIdentifier and simulation
+
+    JobModel *m_jobModel;
+};
+
+#endif // JOBQUEUEDATA_H
diff --git a/GUI/coregui/Models/JobWorker.cpp b/GUI/coregui/Models/JobWorker.cpp
new file mode 100644
index 0000000..8ed14e0
--- /dev/null
+++ b/GUI/coregui/Models/JobWorker.cpp
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobWorker.cpp
+//! @brief     Implements class JobWorker
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobWorker.h"
+#include "GISASSimulation.h"
+#include "item_constants.h"
+#include <QDateTime>
+#include <QDebug>
+#include <memory>
+
+JobWorker::JobWorker(QString identifier, GISASSimulation *simulation)
+    : m_identifier(identifier)
+    , m_simulation(simulation)
+    , m_percentage_done(0)
+    , m_job_status(Constants::STATUS_IDLE)
+    , m_terminate_request_flag(false)
+    , m_simulation_duration(0)
+{
+}
+
+void JobWorker::start()
+{
+    qDebug() << "JobRunner::start() " << m_simulation;
+    m_terminate_request_flag = false;
+    m_simulation_duration = 0;
+    emit started();
+
+    if(m_simulation) {
+        m_simulation->subscribe(
+            [this] (int percentage_done) {
+                return simulationInformsUs(percentage_done); } );
+
+        m_job_status = Constants::STATUS_RUNNING;
+
+        try {
+            QDateTime beginTime = QDateTime::currentDateTime();
+            m_simulation->runSimulation();
+            if(m_job_status != Constants::STATUS_CANCELED)
+                m_job_status = Constants::STATUS_COMPLETED;
+
+            QDateTime endTime = QDateTime::currentDateTime();
+            m_simulation_duration = beginTime.msecsTo(endTime);
+
+        }
+        catch(const std::exception &ex)
+        {
+            m_job_status = Constants::STATUS_FAILED;
+            m_percentage_done = 100;
+            m_failure_message = QString(
+                        "JobRunner::start() -> Simulation failed with exception throw:\n\n");
+
+            m_failure_message.append(QString(ex.what()));
+        }
+
+    } else {
+        m_job_status = Constants::STATUS_FAILED;
+        m_percentage_done = 100;
+        m_failure_message = QString("JobRunner::start() -> Error. Simulation doesn't exist.");
+    }
+    emit progressUpdate();
+    emit finished();
+}
+
+//! Informs us about progress of the simulation. Returns true if we want to continue the simulation.
+//! To be registered as callback function via ProgressHandler::subscribe().
+bool JobWorker::simulationInformsUs(int percentage_done)
+{
+    if (percentage_done > m_percentage_done) {
+        m_percentage_done = percentage_done;
+        emit progressUpdate();
+    }
+    return !m_terminate_request_flag;
+}
+
+//! set request for JobRunner to terminate underlying domain simulation
+void JobWorker::terminate()
+{
+    qDebug() << "JobRunner::terminate()";
+    m_terminate_request_flag = true;
+    m_job_status = Constants::STATUS_CANCELED;
+}
diff --git a/GUI/coregui/Models/JobWorker.h b/GUI/coregui/Models/JobWorker.h
new file mode 100644
index 0000000..481e01b
--- /dev/null
+++ b/GUI/coregui/Models/JobWorker.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/JobWorker.h
+//! @brief     Defines class JobWorker
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBWORKER_H
+#define JOBWORKER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class GISASSimulation;
+
+//! The JobWorker class provides running the domain simulation in a thread.
+
+class BA_CORE_API_ JobWorker : public QObject
+{
+    Q_OBJECT
+public:
+
+    JobWorker(QString identifier, GISASSimulation *simulation = 0);
+
+    QString getIdentifier() const { return m_identifier; }
+    void setIdentifier(QString identifier) { m_identifier = identifier; }
+
+    int getProgress() const { return m_percentage_done; }
+
+    bool simulationInformsUs(int);
+
+    bool isTerminated() { return m_terminate_request_flag; }
+
+    QString getStatus() const { return m_job_status; }
+
+    QString getFailureMessage() const { return m_failure_message; }
+
+    int getSimulationDuration() const { return m_simulation_duration; }
+
+signals:
+    void started();
+    void finished();
+    void progressUpdate();
+
+public slots:
+    void start();
+    void terminate();
+
+private:
+    QString m_identifier;
+    GISASSimulation *m_simulation;
+    int m_percentage_done;
+    QString m_job_status;
+    bool m_terminate_request_flag;
+    QString m_failure_message;
+    int m_simulation_duration;
+};
+
+#endif // JOBWORKER_H
diff --git a/GUI/coregui/Models/LatticeTypeItems.cpp b/GUI/coregui/Models/LatticeTypeItems.cpp
new file mode 100644
index 0000000..41ec166
--- /dev/null
+++ b/GUI/coregui/Models/LatticeTypeItems.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LatticeTypeItems.cpp
+//! @brief     Implements classes LatticeTypeItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "LatticeTypeItems.h"
+#include "BornAgainNamespace.h"
+
+const QString BasicLatticeTypeItem::P_LATTICE_LENGTH1
+    = QString::fromStdString(BornAgain::LatticeLength1);
+const QString BasicLatticeTypeItem::P_LATTICE_LENGTH2
+    = QString::fromStdString(BornAgain::LatticeLength2);
+const QString BasicLatticeTypeItem::P_LATTICE_ANGLE
+    = QString::fromStdString(BornAgain::LatticeAngle);
+const QString SquareLatticeTypeItem::P_LATTICE_LENGTH
+    = QString::fromStdString(BornAgain::LatticeLength);
+const QString HexagonalLatticeTypeItem::P_LATTICE_LENGTH
+    = QString::fromStdString(BornAgain::LatticeLength);
+
+
+BasicLatticeTypeItem::BasicLatticeTypeItem()
+    : SessionItem(QString("BasicLatticeType"))
+{
+    addProperty(P_LATTICE_LENGTH1, 20.0);
+    addProperty(P_LATTICE_LENGTH2, 20.0);
+    addProperty(P_LATTICE_ANGLE, 90.0);
+}
+
+SquareLatticeTypeItem::SquareLatticeTypeItem()
+    : SessionItem(QString("SquareLatticeType"))
+{
+    addProperty(P_LATTICE_LENGTH, 20.0);
+}
+
+HexagonalLatticeTypeItem::HexagonalLatticeTypeItem()
+    : SessionItem(QString("HexagonalLatticeType"))
+{
+    addProperty(P_LATTICE_LENGTH, 20.0);
+}
diff --git a/GUI/coregui/Models/LatticeTypeItems.h b/GUI/coregui/Models/LatticeTypeItems.h
new file mode 100644
index 0000000..2494162
--- /dev/null
+++ b/GUI/coregui/Models/LatticeTypeItems.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LatticeTypeItems.h
+//! @brief     Defines classes LatticeTypeItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LATTICETYPEITEMS_H
+#define LATTICETYPEITEMS_H
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ BasicLatticeTypeItem : public SessionItem
+{
+
+public:
+    static const QString P_LATTICE_LENGTH1;
+    static const QString P_LATTICE_LENGTH2;
+    static const QString P_LATTICE_ANGLE;
+    explicit BasicLatticeTypeItem();
+    virtual ~BasicLatticeTypeItem(){}
+};
+
+class BA_CORE_API_ SquareLatticeTypeItem : public SessionItem
+{
+
+public:
+    static const QString P_LATTICE_LENGTH;
+    explicit SquareLatticeTypeItem();
+    virtual ~SquareLatticeTypeItem(){}
+};
+
+class BA_CORE_API_ HexagonalLatticeTypeItem : public SessionItem
+{
+
+public:
+    static const QString P_LATTICE_LENGTH;
+    explicit HexagonalLatticeTypeItem();
+    virtual ~HexagonalLatticeTypeItem(){}
+};
+
+#endif // LATTICETYPEITEMS_H
diff --git a/GUI/coregui/Models/LayerItem.cpp b/GUI/coregui/Models/LayerItem.cpp
new file mode 100644
index 0000000..e0da55e
--- /dev/null
+++ b/GUI/coregui/Models/LayerItem.cpp
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LayerItem.cpp
+//! @brief     Implements class LayerItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "LayerItem.h"
+#include "BornAgainNamespace.h"
+#include "MaterialUtils.h"
+
+const QString LayerItem::P_THICKNESS = QString::fromStdString(BornAgain::Thickness);
+const QString LayerItem::P_ROUGHNESS = "Top roughness";
+const QString LayerItem::P_MATERIAL = "Material";
+const QString LayerItem::T_LAYOUTS = "Layout tag";
+
+LayerItem::LayerItem()
+    : SessionGraphicsItem(Constants::LayerType)
+{
+    addProperty(P_THICKNESS, 0.0);
+    getItem(P_THICKNESS)->setLimits(RealLimits::lowerLimited(0.0));
+    addProperty(P_MATERIAL, MaterialUtils::getDefaultMaterialProperty().getVariant());
+
+    addGroupProperty(P_ROUGHNESS, Constants::LayerRoughnessGroup);
+    setGroupProperty(P_ROUGHNESS, Constants::LayerZeroRoughnessType);
+    registerTag(T_LAYOUTS, 0, -1, QStringList() << Constants::ParticleLayoutType);
+    setDefaultTag(T_LAYOUTS);
+}
diff --git a/GUI/coregui/Models/LayerItem.h b/GUI/coregui/Models/LayerItem.h
new file mode 100644
index 0000000..a61767c
--- /dev/null
+++ b/GUI/coregui/Models/LayerItem.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LayerItem.h
+//! @brief     Defines class LayerItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERITEM_H
+#define LAYERITEM_H
+
+#include "SessionGraphicsItem.h"
+
+class BA_CORE_API_ LayerItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_THICKNESS;
+    static const QString P_ROUGHNESS;
+    static const QString P_MATERIAL;
+    static const QString T_LAYOUTS;
+    explicit LayerItem();
+    virtual ~LayerItem(){}
+};
+
+#endif // LAYERITEM_H
+
diff --git a/GUI/coregui/Models/LayerRoughnessItems.cpp b/GUI/coregui/Models/LayerRoughnessItems.cpp
new file mode 100644
index 0000000..4d63e24
--- /dev/null
+++ b/GUI/coregui/Models/LayerRoughnessItems.cpp
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LayerRoughnessItems.cpp
+//! @brief     Implements classes LayerRoughnessItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "LayerRoughnessItems.h"
+
+
+LayerZeroRoughnessItem::LayerZeroRoughnessItem()
+    : SessionItem(Constants::LayerZeroRoughnessType)
+{
+}
+
+const QString LayerBasicRoughnessItem::P_SIGMA = "Sigma";
+const QString LayerBasicRoughnessItem::P_HURST = "Hurst parameter";
+const QString LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH = "Lateral corr length";
+
+LayerBasicRoughnessItem::LayerBasicRoughnessItem()
+    : SessionItem(Constants::LayerBasicRoughnessType)
+{
+    addProperty(P_SIGMA, 1.0);
+    addProperty(P_HURST, 0.3)->setLimits(RealLimits::limited(0.0, 1.0));
+    getItem(P_HURST)->setDecimals(3);
+    addProperty(P_LATERAL_CORR_LENGTH, 5.0);
+}
diff --git a/GUI/coregui/Models/LayerRoughnessItems.h b/GUI/coregui/Models/LayerRoughnessItems.h
new file mode 100644
index 0000000..4fa4657
--- /dev/null
+++ b/GUI/coregui/Models/LayerRoughnessItems.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LayerRoughnessItems.h
+//! @brief     Defines classes LayerRoughnessItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERROUGHNESSITEMS_H
+#define LAYERROUGHNESSITEMS_H
+
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ LayerZeroRoughnessItem : public SessionItem
+{
+
+public:
+    explicit LayerZeroRoughnessItem();
+    virtual ~LayerZeroRoughnessItem(){}
+};
+
+
+class BA_CORE_API_ LayerBasicRoughnessItem : public SessionItem
+{
+
+public:
+    static const QString P_SIGMA;
+    static const QString P_HURST;
+    static const QString P_LATERAL_CORR_LENGTH;
+    explicit LayerBasicRoughnessItem();
+    virtual ~LayerBasicRoughnessItem(){}
+};
+
+
+#endif // LAYERROUGHNESSITEMS_H
diff --git a/GUI/coregui/Models/LinkInstrumentItem.cpp b/GUI/coregui/Models/LinkInstrumentItem.cpp
new file mode 100644
index 0000000..3cc1007
--- /dev/null
+++ b/GUI/coregui/Models/LinkInstrumentItem.cpp
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LinkInstrumentItem.cpp
+//! @brief     Defines class LinkInstrumentItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "LinkInstrumentItem.h"
+#include "ComboProperty.h"
+
+const QString LinkInstrumentItem::P_REALDATA_NAME = "RealDataName";
+const QString LinkInstrumentItem::P_INSTRUMENT_ID = "Instrument Id";
+const QString LinkInstrumentItem::P_INSTRUMENT_NAME = "Instrument";
+const QString LinkInstrumentItem::P_INSTRUMENT_COMBO = "Combo";
+
+
+LinkInstrumentItem::LinkInstrumentItem()
+    : SessionItem(Constants::LinkInstrumentType)
+{
+    addProperty(P_REALDATA_NAME, QString());
+    addProperty(P_INSTRUMENT_ID, QString());
+    addProperty(P_INSTRUMENT_NAME, QString());
+    ComboProperty instruments = ComboProperty() << "Undefined";
+    addProperty(P_INSTRUMENT_COMBO, instruments.getVariant());
+}
diff --git a/GUI/coregui/Models/LinkInstrumentItem.h b/GUI/coregui/Models/LinkInstrumentItem.h
new file mode 100644
index 0000000..fbbf17b
--- /dev/null
+++ b/GUI/coregui/Models/LinkInstrumentItem.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/LinkInstrumentItem.h
+//! @brief     Defines class LinkInstrumentItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LINKINSTRUMENTITEM_H
+#define LINKINSTRUMENTITEM_H
+
+#include "SessionItem.h"
+
+//! The LinkInstrumentItem class is a helper item to link RealDataItem to InstrumentItem.
+//! Contains dynamic ComboProperty with list of all instrument names, which is updated on
+//! every change of instrument name, and on add/remove InstrumentItem.
+//! Handled by temporary (not serializable) model from LinkInstrumentManager.
+
+class BA_CORE_API_ LinkInstrumentItem : public SessionItem
+{
+public:
+    static const QString P_REALDATA_NAME;
+    static const QString P_INSTRUMENT_ID;
+    static const QString P_INSTRUMENT_NAME;
+    static const QString P_INSTRUMENT_COMBO;
+    LinkInstrumentItem();
+};
+
+#endif // LINKINSTRUMENTITEM_H
diff --git a/GUI/coregui/Models/MagneticFieldItem.cpp b/GUI/coregui/Models/MagneticFieldItem.cpp
new file mode 100644
index 0000000..7408cd5
--- /dev/null
+++ b/GUI/coregui/Models/MagneticFieldItem.cpp
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MagneticFieldItem.cpp
+//! @brief     Implements class MagneticFieldItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MagneticFieldItem.h"
+
+const QString MagneticFieldItem::P_BX = "Bx";
+const QString MagneticFieldItem::P_BY = "By";
+const QString MagneticFieldItem::P_BZ = "Bz";
+
+MagneticFieldItem::MagneticFieldItem()
+    : SessionItem(Constants::MagneticFieldType)
+{
+    addProperty(P_BX, 0.0);
+    addProperty(P_BY, 0.0);
+    addProperty(P_BZ, 0.0);
+}
+
+QString MagneticFieldItem::itemLabel() const
+{
+    return QString("(%1, %2, %3)").arg(getItemValue(P_BX).toDouble())
+                                  .arg(getItemValue(P_BY).toDouble())
+                                  .arg(getItemValue(P_BZ).toDouble());
+}
diff --git a/GUI/coregui/Models/MagneticFieldItem.h b/GUI/coregui/Models/MagneticFieldItem.h
new file mode 100644
index 0000000..9146ab8
--- /dev/null
+++ b/GUI/coregui/Models/MagneticFieldItem.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MagneticFieldItem.h
+//! @brief     Defines class MagneticFieldItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MAGNETICFIELDITEM_H
+#define MAGNETICFIELDITEM_H
+
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ MagneticFieldItem : public SessionItem
+{
+
+public:
+    static const QString P_BX;
+    static const QString P_BY;
+    static const QString P_BZ;
+    explicit MagneticFieldItem();
+    virtual ~MagneticFieldItem() {}
+    virtual QString itemLabel() const;
+};
+
+
+
+#endif // MAGNETICFIELDITEM_H
+
diff --git a/GUI/coregui/Models/MaskItems.cpp b/GUI/coregui/Models/MaskItems.cpp
new file mode 100644
index 0000000..cdef7c3
--- /dev/null
+++ b/GUI/coregui/Models/MaskItems.cpp
@@ -0,0 +1,202 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaskItems.cpp
+//! @brief     Implements MaskItems classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskItems.h"
+#include "Ellipse.h"
+#include "GUIHelpers.h"
+#include "InfinitePlane.h"
+#include "Line.h"
+#include "Polygon.h"
+#include "Rectangle.h"
+
+
+MaskContainerItem::MaskContainerItem()
+    : SessionItem(Constants::MaskContainerType)
+{
+    const QString T_MASKS = "Mask Tag";
+    QStringList allowedMasks = QStringList()
+            << Constants::RectangleMaskType << Constants::PolygonMaskType
+            << Constants::EllipseMaskType << Constants::VerticalLineMaskType
+            << Constants::HorizontalLineMaskType << Constants::MaskAllType
+            << Constants::RegionOfInterestType;
+    registerTag(T_MASKS, 0, -1, allowedMasks);
+    setDefaultTag(T_MASKS);
+}
+
+/* ------------------------------------------------------------------------- */
+
+const QString MaskItem::P_MASK_VALUE = "Mask value";
+
+MaskItem::MaskItem(const QString &name)
+    : SessionItem(name)
+{
+    addProperty(P_MASK_VALUE, true);
+}
+
+std::unique_ptr<Geometry::IShape2D> MaskItem::createShape(double scale) const
+{
+    Q_UNUSED(scale);
+    throw GUIHelpers::Error("MaskItem::createShape() -> Not implemented.");
+}
+
+
+/* ------------------------------------------------------------------------- */
+const QString RectangleItem::P_XLOW = "xlow";
+const QString RectangleItem::P_YLOW = "ylow";
+const QString RectangleItem::P_XUP = "xup";
+const QString RectangleItem::P_YUP = "yup";
+
+RectangleItem::RectangleItem(const QString &modelType)
+    : MaskItem(modelType)
+{
+    setItemName(modelType);
+    addProperty(P_XLOW, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_YLOW, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_XUP, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_YUP, 0.0)->setLimits(RealLimits::limitless());
+}
+
+std::unique_ptr<Geometry::IShape2D> RectangleItem::createShape(double scale) const
+{
+    double xlow = scale*getItemValue(P_XLOW).toDouble();
+    double ylow = scale*getItemValue(P_YLOW).toDouble();
+    double xup = scale*getItemValue(P_XUP).toDouble();
+    double yup = scale*getItemValue(P_YUP).toDouble();
+    return GUIHelpers::make_unique<Geometry::Rectangle>(xlow, ylow, xup, yup);
+}
+
+/* ------------------------------------------------------------------------- */
+
+RegionOfInterestItem::RegionOfInterestItem()
+    : RectangleItem(Constants::RegionOfInterestType)
+{
+    setItemValue(P_MASK_VALUE, false);
+}
+
+/* ------------------------------------------------------------------------- */
+
+const QString PolygonPointItem::P_POSX = "X position";
+const QString PolygonPointItem::P_POSY = "Y position";
+
+PolygonPointItem::PolygonPointItem()
+    : SessionItem(Constants::PolygonPointType)
+{
+    setItemName(Constants::PolygonPointType);
+    addProperty(P_POSX, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_POSY, 0.0)->setLimits(RealLimits::limitless());
+}
+
+/* ------------------------------------------------------------------------- */
+
+const QString PolygonItem::P_ISCLOSED = "Is closed";
+
+PolygonItem::PolygonItem()
+    : MaskItem(Constants::PolygonMaskType)
+{
+    setItemName(Constants::PolygonMaskType);
+    const QString T_POINTS = "Point tag";
+    registerTag(T_POINTS, 0, -1, QStringList() << Constants::PolygonPointType);
+    setDefaultTag(T_POINTS);
+    addProperty(P_ISCLOSED, false)->setVisible(false);
+}
+
+std::unique_ptr<Geometry::IShape2D> PolygonItem::createShape(double scale) const
+{
+    std::vector<double> x,y;
+    foreach(SessionItem *item, this->getChildrenOfType(Constants::PolygonPointType)) {
+        x.push_back(scale*item->getItemValue(PolygonPointItem::P_POSX).toDouble());
+        y.push_back(scale*item->getItemValue(PolygonPointItem::P_POSY).toDouble());
+    }
+    return GUIHelpers::make_unique<Geometry::Polygon>(x, y);
+}
+
+/* ------------------------------------------------------------------------- */
+const QString VerticalLineItem::P_POSX = "X position";
+
+VerticalLineItem::VerticalLineItem()
+    : MaskItem(Constants::VerticalLineMaskType)
+{
+    setItemName(Constants::VerticalLineMaskType);
+    addProperty(P_POSX, 0.0)->setLimits(RealLimits::limitless());
+}
+
+std::unique_ptr<Geometry::IShape2D> VerticalLineItem::createShape(double scale) const
+{
+    return GUIHelpers::make_unique<Geometry::VerticalLine>(
+                scale*getItemValue(VerticalLineItem::P_POSX).toDouble());
+}
+
+/* ------------------------------------------------------------------------- */
+const QString HorizontalLineItem::P_POSY = "Y position";
+
+HorizontalLineItem::HorizontalLineItem()
+    : MaskItem(Constants::HorizontalLineMaskType)
+{
+    setItemName(Constants::HorizontalLineMaskType);
+    addProperty(P_POSY, 0.0)->setLimits(RealLimits::limitless());
+}
+
+std::unique_ptr<Geometry::IShape2D> HorizontalLineItem::createShape(double scale) const
+{
+    return GUIHelpers::make_unique<Geometry::HorizontalLine>(
+                scale*getItemValue(HorizontalLineItem::P_POSY).toDouble());
+}
+
+/* ------------------------------------------------------------------------- */
+
+const QString EllipseItem::P_XCENTER = "X position";
+const QString EllipseItem::P_YCENTER = "Y position";
+const QString EllipseItem::P_XRADIUS = "X radius";
+const QString EllipseItem::P_YRADIUS = "Y radius";
+const QString EllipseItem::P_ANGLE = "Angle";
+
+EllipseItem::EllipseItem()
+    : MaskItem(Constants::EllipseMaskType)
+{
+    setItemName(Constants::EllipseMaskType);
+    addProperty(P_XCENTER, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_YCENTER, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_XRADIUS, 0.0);
+    addProperty(P_YRADIUS, 0.0);
+    addProperty(P_ANGLE, 0.0)->setLimits(RealLimits::limitless());
+}
+
+std::unique_ptr<Geometry::IShape2D> EllipseItem::createShape(double scale) const
+{
+    double xcenter = scale*getItemValue(EllipseItem::P_XCENTER).toDouble();
+    double ycenter = scale*getItemValue(EllipseItem::P_YCENTER).toDouble();
+    double xradius = scale*getItemValue(EllipseItem::P_XRADIUS).toDouble();
+    double yradius = scale*getItemValue(EllipseItem::P_YRADIUS).toDouble();
+    double angle = scale*getItemValue(EllipseItem::P_ANGLE).toDouble();
+
+    return GUIHelpers::make_unique<Geometry::Ellipse>(xcenter, ycenter, xradius, yradius, angle);
+}
+
+/* ------------------------------------------------------------------------- */
+
+MaskAllItem::MaskAllItem()
+    : MaskItem(Constants::MaskAllType)
+{
+    setItemName(Constants::MaskAllType);
+    getItem(MaskItem::P_MASK_VALUE)->setEnabled(false);
+}
+
+std::unique_ptr<Geometry::IShape2D> MaskAllItem::createShape(double scale) const
+{
+    Q_UNUSED(scale);
+    return GUIHelpers::make_unique<Geometry::InfinitePlane>();
+}
+
diff --git a/GUI/coregui/Models/MaskItems.h b/GUI/coregui/Models/MaskItems.h
new file mode 100644
index 0000000..8c36e2a
--- /dev/null
+++ b/GUI/coregui/Models/MaskItems.h
@@ -0,0 +1,119 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaskItems.h
+//! @brief     Defines MaskItems classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKITEMS_H
+#define MASKITEMS_H
+
+#include "SessionItem.h"
+
+namespace Geometry {
+class IShape2D;
+}
+
+//! Container holding various masks as children
+
+class BA_CORE_API_ MaskContainerItem : public SessionItem
+{
+public:
+    MaskContainerItem();
+};
+
+
+//! A base class for all mask items
+
+class BA_CORE_API_ MaskItem : public SessionItem
+{
+public:
+    static const QString P_MASK_VALUE;
+    explicit MaskItem(const QString &name);
+    virtual std::unique_ptr<Geometry::IShape2D> createShape(double scale = 1.0) const;
+};
+
+class BA_CORE_API_ RectangleItem : public MaskItem
+{
+public:
+    static const QString P_XLOW;
+    static const QString P_YLOW;
+    static const QString P_XUP;
+    static const QString P_YUP;
+    explicit RectangleItem(const QString &modelType = Constants::RectangleMaskType);
+    virtual std::unique_ptr<Geometry::IShape2D> createShape(double scale) const;
+};
+
+class BA_CORE_API_ RegionOfInterestItem : public RectangleItem
+{
+public:
+    RegionOfInterestItem();
+};
+
+
+class BA_CORE_API_ PolygonPointItem : public SessionItem
+{
+
+public:
+    static const QString P_POSX;
+    static const QString P_POSY;
+    PolygonPointItem();
+};
+
+class BA_CORE_API_ PolygonItem : public MaskItem
+{
+
+public:
+    static const QString P_ISCLOSED;
+    PolygonItem();
+    virtual std::unique_ptr<Geometry::IShape2D> createShape(double scale) const;
+};
+
+class BA_CORE_API_ VerticalLineItem : public MaskItem
+{
+
+public:
+    static const QString P_POSX;
+    VerticalLineItem();
+    virtual std::unique_ptr<Geometry::IShape2D> createShape(double scale) const;
+};
+
+class BA_CORE_API_ HorizontalLineItem : public MaskItem
+{
+
+public:
+    static const QString P_POSY;
+    HorizontalLineItem();
+    virtual std::unique_ptr<Geometry::IShape2D> createShape(double scale) const;
+};
+
+class BA_CORE_API_ EllipseItem : public MaskItem
+{
+
+public:
+    static const QString P_XCENTER;
+    static const QString P_YCENTER;
+    static const QString P_XRADIUS;
+    static const QString P_YRADIUS;
+    static const QString P_ANGLE;
+    EllipseItem();
+    virtual std::unique_ptr<Geometry::IShape2D> createShape(double scale) const;
+};
+
+class BA_CORE_API_ MaskAllItem : public MaskItem
+{
+public:
+    MaskAllItem();
+    virtual std::unique_ptr<Geometry::IShape2D> createShape(double scale) const;
+};
+
+#endif // MASKITEMS_H
diff --git a/GUI/coregui/Models/MaskModel.cpp b/GUI/coregui/Models/MaskModel.cpp
new file mode 100644
index 0000000..9406248
--- /dev/null
+++ b/GUI/coregui/Models/MaskModel.cpp
@@ -0,0 +1,23 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaskModel.cpp
+//! @brief     Implements MaskModel classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskModel.h"
+
+MaskModel::MaskModel(QObject *parent)
+    : SessionModel(SessionXML::MaskModelTag, parent)
+{
+
+}
diff --git a/GUI/coregui/Models/MaskModel.h b/GUI/coregui/Models/MaskModel.h
new file mode 100644
index 0000000..c48c5f8
--- /dev/null
+++ b/GUI/coregui/Models/MaskModel.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaskModel.h
+//! @brief     Defines MaskModel classes
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKMODEL_H
+#define MASKMODEL_H
+
+#include "SessionModel.h"
+
+class BA_CORE_API_ MaskModel : public SessionModel
+{
+    Q_OBJECT
+
+public:
+    explicit MaskModel(QObject *parent = 0);
+    virtual ~MaskModel() {}
+};
+
+#endif // MASKMODEL_H
diff --git a/GUI/coregui/Models/MaterialItem.cpp b/GUI/coregui/Models/MaterialItem.cpp
new file mode 100644
index 0000000..a101e78
--- /dev/null
+++ b/GUI/coregui/Models/MaterialItem.cpp
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaterialItem.cpp
+//! @brief     Implements class MaterialItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialItem.h"
+#include "GUIHelpers.h"
+#include "HomogeneousMaterial.h"
+#include "MaterialUtils.h"
+#include "RefractiveIndexItem.h"
+
+
+const QString MaterialItem::P_COLOR = "Color";
+const QString MaterialItem::P_REFRACTIVE_INDEX = "Refractive index";
+const QString MaterialItem::P_IDENTIFIER = "Identifier";
+
+MaterialItem::MaterialItem()
+    : SessionItem(Constants::MaterialType)
+{
+    setItemName(Constants::MaterialType);
+
+    ColorProperty color;
+    addProperty(P_COLOR, color.getVariant());
+    addGroupProperty(P_REFRACTIVE_INDEX, Constants::RefractiveIndexType);
+    addProperty(P_IDENTIFIER, GUIHelpers::createUuid());
+    getItem(P_IDENTIFIER)->setVisible(false);
+}
+
+QString MaterialItem::getIdentifier() const
+{
+    return getItemValue(P_IDENTIFIER).toString();
+}
+
+QColor MaterialItem::getColor() const
+{
+    ColorProperty property = getItemValue(P_COLOR).value<ColorProperty>();
+    return property.getColor();
+}
+
+std::unique_ptr<IMaterial> MaterialItem::createMaterial() const
+{
+    const RefractiveIndexItem *refractiveIndexItem
+        = dynamic_cast<const RefractiveIndexItem *>(
+            getItem(MaterialItem::P_REFRACTIVE_INDEX));
+
+    Q_ASSERT(refractiveIndexItem);
+
+    double delta = refractiveIndexItem->getDelta();
+    double beta = refractiveIndexItem->getBeta();
+
+    return GUIHelpers::make_unique<HomogeneousMaterial>(
+                itemName().toStdString(), delta, beta);
+}
diff --git a/GUI/coregui/Models/MaterialItem.h b/GUI/coregui/Models/MaterialItem.h
new file mode 100644
index 0000000..f560242
--- /dev/null
+++ b/GUI/coregui/Models/MaterialItem.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaterialItem.h
+//! @brief     Defines class MaterialItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALITEM_H
+#define MATERIALITEM_H
+
+#include "SessionItem.h"
+
+class IMaterial;
+
+class BA_CORE_API_ MaterialItem : public SessionItem
+{
+
+
+public:
+    static const QString P_COLOR;
+    static const QString P_REFRACTIVE_INDEX;
+    static const QString P_IDENTIFIER;
+    explicit MaterialItem();
+
+    QString getIdentifier() const;
+    QColor getColor() const;
+    std::unique_ptr<IMaterial> createMaterial() const;
+};
+
+#endif // MATERIALITEM_H
diff --git a/GUI/coregui/Models/MaterialModel.cpp b/GUI/coregui/Models/MaterialModel.cpp
new file mode 100644
index 0000000..e24c132
--- /dev/null
+++ b/GUI/coregui/Models/MaterialModel.cpp
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaterialModel.cpp
+//! @brief     Implements class MaterialModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialModel.h"
+#include "IconProvider.h"
+#include "MaterialUtils.h"
+#include "RefractiveIndexItem.h"
+#include "GUIHelpers.h"
+#include <QDebug>
+
+MaterialModel::MaterialModel(QObject *parent)
+    : SessionModel(SessionXML::MaterialModelTag, parent)
+{
+    setObjectName(SessionXML::MaterialModelTag);
+    setIconProvider(new IconProvider());
+}
+
+MaterialModel *MaterialModel::createCopy(SessionItem *parent)
+{
+    MaterialModel *result = new MaterialModel();
+    result->initFrom(this, parent);
+    return result;
+}
+
+MaterialItem *MaterialModel::addMaterial(const QString &name, double delta, double beta)
+{
+    MaterialItem *materialItem = dynamic_cast<MaterialItem *>(insertNewItem(Constants::MaterialType));
+    materialItem->setItemName(name);
+
+    RefractiveIndexItem *refractiveIndexItem =
+            dynamic_cast<RefractiveIndexItem *>(materialItem->getItem(MaterialItem::P_REFRACTIVE_INDEX));
+    Q_ASSERT(refractiveIndexItem);
+
+    refractiveIndexItem->setDelta(delta);
+    refractiveIndexItem->setBeta(beta);
+
+    materialItem->setItemValue(MaterialItem::P_COLOR, MaterialUtils::suggestMaterialColorProperty(name).getVariant());
+
+    return materialItem;
+}
+
+void MaterialModel::removeMaterial(MaterialItem *item)
+{
+    QModelIndex materialIndex = indexOfItem(item);
+    removeRows(materialIndex.row(), 1, materialIndex.parent());
+}
+
+MaterialItem *MaterialModel::getMaterial(const QModelIndex &index)
+{
+    return dynamic_cast<MaterialItem *>(itemForIndex(index));
+}
+
+MaterialItem *MaterialModel::getMaterial(const MaterialProperty &property)
+{
+    qDebug() << "MaterialModel::getMaterial()";
+    QModelIndex parentIndex;
+    for( int i_row = 0; i_row < rowCount( parentIndex ); ++i_row) {
+         QModelIndex itemIndex = index( i_row, 0, parentIndex );
+
+         if (MaterialItem *material = dynamic_cast<MaterialItem *>(itemForIndex(itemIndex))){
+             if(material->getIdentifier() == property.getIdentifier()) return material;
+         }
+    }
+    return 0;
+}
+
+MaterialItem *MaterialModel::getMaterial(const QString &material_name)
+{
+    qDebug() << "MaterialModel::getMaterial()";
+    QModelIndex parentIndex;
+    for( int i_row = 0; i_row < rowCount( parentIndex ); ++i_row) {
+         QModelIndex itemIndex = index( i_row, 0, parentIndex );
+
+         if (MaterialItem *material = dynamic_cast<MaterialItem *>(itemForIndex(itemIndex))){
+             if(material->itemName() == material_name) return material;
+         }
+    }
+    return 0;
+}
+
+//! Returns clone of material with given index.
+
+MaterialItem *MaterialModel::cloneMaterial(const QModelIndex &index)
+{
+    const MaterialItem *origMaterial = getMaterial(index);
+    if(!origMaterial)
+        return nullptr;
+
+    SessionItem *clonedMaterial = copyParameterizedItem(origMaterial, 0);
+    clonedMaterial->setItemValue(MaterialItem::P_IDENTIFIER, GUIHelpers::createUuid());
+    clonedMaterial->setItemName(origMaterial->itemName()+" (clone)");
+    return dynamic_cast<MaterialItem *>(clonedMaterial);
+}
diff --git a/GUI/coregui/Models/MaterialModel.h b/GUI/coregui/Models/MaterialModel.h
new file mode 100644
index 0000000..8ec3abb
--- /dev/null
+++ b/GUI/coregui/Models/MaterialModel.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MaterialModel.h
+//! @brief     Defines class MaterialModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALMODEL_H
+#define MATERIALMODEL_H
+
+#include "SessionModel.h"
+
+class MaterialItem;
+class MaterialProperty;
+
+class BA_CORE_API_ MaterialModel : public SessionModel
+{
+    Q_OBJECT
+
+public:
+    explicit MaterialModel(QObject *parent = 0);
+    virtual ~MaterialModel(){}
+
+    virtual MaterialModel *createCopy(SessionItem *parent = 0);
+
+    MaterialItem *addMaterial(const QString &name, double delta = 0.0, double beta = 0.0);
+    void removeMaterial(MaterialItem *);
+
+    MaterialItem *getMaterial(const QModelIndex &index);
+    MaterialItem *getMaterial(const MaterialProperty &property);
+    MaterialItem *getMaterial(const QString &material_name);
+
+    MaterialItem *cloneMaterial(const QModelIndex &index);
+};
+
+#endif // MATERIALMODEL_H
+
diff --git a/GUI/coregui/Models/MinimizerItem.cpp b/GUI/coregui/Models/MinimizerItem.cpp
new file mode 100644
index 0000000..4adadcf
--- /dev/null
+++ b/GUI/coregui/Models/MinimizerItem.cpp
@@ -0,0 +1,213 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MinimizerItem.cpp
+//! @brief     Implements MinimizerItem class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerItem.h"
+#include "MinimizerItemCatalogue.h"
+#include "MinimizerConstants.h"
+#include "Minuit2Minimizer.h"
+#include "GSLMultiMinimizer.h"
+#include "GeneticMinimizer.h"
+#include "GSLLevenbergMarquardtMinimizer.h"
+#include "SimAnMinimizer.h"
+#include "TestMinimizer.h"
+
+// ----------------------------------------------------------------------------
+
+MinimizerItem::MinimizerItem(const QString &model_type) : SessionItem(model_type)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+const QString MinimizerContainerItem::P_MINIMIZERS = "Minimizer";
+
+MinimizerContainerItem::MinimizerContainerItem() : MinimizerItem(Constants::MinimizerContainerType)
+{
+    addGroupProperty(P_MINIMIZERS, Constants::MinimizerLibraryGroup)
+        ->setToolTip(QStringLiteral("Minimizer library"));
+    setGroupProperty(P_MINIMIZERS, Constants::MinuitMinimizerType);
+}
+
+std::unique_ptr<IMinimizer> MinimizerContainerItem::createMinimizer() const
+{
+    auto minimizer = static_cast<MinimizerItem *>(getGroupItem(P_MINIMIZERS));
+    Q_ASSERT(minimizer);
+    return minimizer->createMinimizer();
+}
+
+// ----------------------------------------------------------------------------
+
+const QString MinuitMinimizerItem::P_ALGORITHMS = "Algorithms";
+const QString MinuitMinimizerItem::P_STRATEGY = QString::fromStdString(OptionNames::Strategy);
+const QString MinuitMinimizerItem::P_ERRORDEF = QString::fromStdString(OptionNames::ErrorDef);
+const QString MinuitMinimizerItem::P_TOLERANCE = QString::fromStdString(OptionNames::Tolerance);
+const QString MinuitMinimizerItem::P_PRECISION = QString::fromStdString(OptionNames::Precision);
+const QString MinuitMinimizerItem::P_MAXFUNCTIONCALLS
+    = QString::fromStdString(OptionNames::MaxFunctionCalls);
+
+MinuitMinimizerItem::MinuitMinimizerItem() : MinimizerItem(Constants::MinuitMinimizerType)
+{
+    addProperty(P_ALGORITHMS, MinimizerItemCatalogue::algorithmCombo(modelType()).getVariant());
+
+    addProperty(P_STRATEGY, 1)
+        ->setToolTip("Minimization strategy (0-low, 1-medium, 2-high quality)");
+
+    addProperty(P_ERRORDEF, 1.0)
+        ->setToolTip("Error definition factor for parameter error calculation");
+
+    addProperty(P_TOLERANCE, 0.01)->setToolTip("Tolerance on the function value at the minimum");
+
+    addProperty(P_PRECISION, -1.0)->setToolTip("Relative floating point arithmetic precision");
+
+    // Minimizer internal print level is working to std::cout and is not intercepted by GUI
+    //    addProperty(P_PRINTLEVEL, 0)->setToolTip("Minimizer internal print level");
+
+    addProperty(P_MAXFUNCTIONCALLS, 0)->setToolTip("Maximum number of function calls");
+}
+
+std::unique_ptr<IMinimizer> MinuitMinimizerItem::createMinimizer() const
+{
+    QString algorithmName = getItemValue(P_ALGORITHMS).value<ComboProperty>().getValue();
+
+    Minuit2Minimizer *domainMinimizer = new Minuit2Minimizer(algorithmName.toStdString());
+    domainMinimizer->setStrategy(getItemValue(P_STRATEGY).toInt());
+    domainMinimizer->setErrorDefinition(getItemValue(P_ERRORDEF).toDouble());
+    domainMinimizer->setTolerance(getItemValue(P_TOLERANCE).toDouble());
+    domainMinimizer->setPrecision(getItemValue(P_PRECISION).toDouble());
+    domainMinimizer->setMaxFunctionCalls(getItemValue(P_MAXFUNCTIONCALLS).toInt());
+
+    return std::unique_ptr<IMinimizer>(domainMinimizer);
+}
+
+// ----------------------------------------------------------------------------
+
+const QString GSLMultiMinimizerItem::P_ALGORITHMS = "Algorithms";
+const QString GSLMultiMinimizerItem::P_MAXITERATIONS
+    = QString::fromStdString(OptionNames::MaxIterations);
+
+GSLMultiMinimizerItem::GSLMultiMinimizerItem() : MinimizerItem(Constants::GSLMultiMinimizerType)
+{
+    addProperty(P_ALGORITHMS, MinimizerItemCatalogue::algorithmCombo(modelType()).getVariant());
+    addProperty(P_MAXITERATIONS, 0)->setToolTip("Maximum number of iterations");
+}
+
+std::unique_ptr<IMinimizer> GSLMultiMinimizerItem::createMinimizer() const
+{
+    QString algorithmName = getItemValue(P_ALGORITHMS).value<ComboProperty>().getValue();
+
+    GSLMultiMinimizer *domainMinimizer = new GSLMultiMinimizer(algorithmName.toStdString());
+    domainMinimizer->setMaxIterations(getItemValue(P_MAXITERATIONS).toInt());
+    return std::unique_ptr<IMinimizer>(domainMinimizer);
+}
+
+// ----------------------------------------------------------------------------
+
+const QString GeneticMinimizerItem::P_TOLERANCE = QString::fromStdString(OptionNames::Tolerance);
+const QString GeneticMinimizerItem::P_MAXITERATIONS
+    = QString::fromStdString(OptionNames::MaxIterations);
+const QString GeneticMinimizerItem::P_POPULATIONSIZE
+    = QString::fromStdString(OptionNames::PopulationSize);
+const QString GeneticMinimizerItem::P_RANDOMSEED = QString::fromStdString(OptionNames::RandomSeed);
+
+GeneticMinimizerItem::GeneticMinimizerItem() : MinimizerItem(Constants::GeneticMinimizerType)
+{
+    addProperty(P_TOLERANCE, 0.01)->setToolTip("Tolerance on the function value at the minimum");
+    addProperty(P_MAXITERATIONS, 3)->setToolTip("Maximum number of iterations");
+    addProperty(P_POPULATIONSIZE, 300)->setToolTip("Population size");
+    addProperty(P_RANDOMSEED, 0)->setToolTip("Random seed");
+}
+
+std::unique_ptr<IMinimizer> GeneticMinimizerItem::createMinimizer() const
+{
+    GeneticMinimizer *domainMinimizer = new GeneticMinimizer();
+    domainMinimizer->setTolerance(getItemValue(P_TOLERANCE).toDouble());
+    domainMinimizer->setMaxIterations(getItemValue(P_MAXITERATIONS).toInt());
+    domainMinimizer->setPopulationSize(getItemValue(P_POPULATIONSIZE).toInt());
+    domainMinimizer->setRandomSeed(getItemValue(P_RANDOMSEED).toInt());
+    return std::unique_ptr<IMinimizer>(domainMinimizer);
+}
+
+// ----------------------------------------------------------------------------
+
+const QString SimAnMinimizerItem::P_MAXITERATIONS
+    = QString::fromStdString(OptionNames::MaxIterations);
+const QString SimAnMinimizerItem::P_ITERATIONSTEMP
+    = QString::fromStdString(OptionNames::IterationTemp);
+const QString SimAnMinimizerItem::P_STEPSIZE = QString::fromStdString(OptionNames::StepSize);
+const QString SimAnMinimizerItem::P_BOLTZMANN_K = QString::fromStdString(OptionNames::BoltzmannK);
+const QString SimAnMinimizerItem::P_BOLTZMANN_TINIT
+    = QString::fromStdString(OptionNames::BoltzmannInitT);
+const QString SimAnMinimizerItem::P_BOLTZMANN_MU = QString::fromStdString(OptionNames::BoltzmannMu);
+const QString SimAnMinimizerItem::P_BOLTZMANN_TMIN
+    = QString::fromStdString(OptionNames::BoltzmannTmin);
+
+SimAnMinimizerItem::SimAnMinimizerItem() : MinimizerItem(Constants::GSLSimAnMinimizerType)
+{
+    addProperty(P_MAXITERATIONS, 100)->setToolTip("Number of points to try for each step");
+    addProperty(P_ITERATIONSTEMP, 10)->setToolTip("Number of iterations at each temperature");
+    addProperty(P_STEPSIZE, 1.0)->setToolTip("Max step size used in random walk");
+    addProperty(P_BOLTZMANN_K, 1.0)->setToolTip("Boltzmann k");
+    addProperty(P_BOLTZMANN_TINIT, 50.0)->setToolTip("Boltzmann initial temperature");
+    addProperty(P_BOLTZMANN_MU, 1.05)->setToolTip("Boltzmann mu");
+    addProperty(P_BOLTZMANN_TMIN, 0.1)->setToolTip("Boltzmann minimal temperature");
+}
+
+std::unique_ptr<IMinimizer> SimAnMinimizerItem::createMinimizer() const
+{
+    SimAnMinimizer *domainMinimizer = new SimAnMinimizer();
+    domainMinimizer->setMaxIterations(getItemValue(P_MAXITERATIONS).toInt());
+    domainMinimizer->setIterationsAtEachTemp(getItemValue(P_ITERATIONSTEMP).toInt());
+    domainMinimizer->setStepSize(getItemValue(P_STEPSIZE).toDouble());
+    domainMinimizer->setBoltzmannK(getItemValue(P_BOLTZMANN_K).toDouble());
+    domainMinimizer->setBoltzmannInitialTemp(getItemValue(P_BOLTZMANN_TINIT).toDouble());
+    domainMinimizer->setBoltzmannMu(getItemValue(P_BOLTZMANN_MU).toDouble());
+    domainMinimizer->setBoltzmannMinTemp(getItemValue(P_BOLTZMANN_TMIN).toDouble());
+    return std::unique_ptr<IMinimizer>(domainMinimizer);
+}
+
+// ----------------------------------------------------------------------------
+
+const QString GSLLMAMinimizerItem::P_TOLERANCE = QString::fromStdString(OptionNames::Tolerance);
+const QString GSLLMAMinimizerItem::P_MAXITERATIONS
+    = QString::fromStdString(OptionNames::MaxIterations);
+
+GSLLMAMinimizerItem::GSLLMAMinimizerItem()
+    : MinimizerItem(Constants::GSLLMAMinimizerType)
+{
+    addProperty(P_TOLERANCE, 0.01)->setToolTip("Tolerance on the function value at the minimum");
+    addProperty(P_MAXITERATIONS, 0)->setToolTip("Maximum number of iterations");
+}
+
+std::unique_ptr<IMinimizer> GSLLMAMinimizerItem::createMinimizer() const
+{
+    GSLLevenbergMarquardtMinimizer *domainMinimizer = new GSLLevenbergMarquardtMinimizer();
+    domainMinimizer->setTolerance(getItemValue(P_TOLERANCE).toDouble());
+    domainMinimizer->setMaxIterations(getItemValue(P_MAXITERATIONS).toInt());
+    return std::unique_ptr<IMinimizer>(domainMinimizer);
+}
+
+// ----------------------------------------------------------------------------
+
+TestMinimizerItem::TestMinimizerItem()
+    : MinimizerItem(Constants::TestMinimizerType)
+{
+
+}
+
+std::unique_ptr<IMinimizer> TestMinimizerItem::createMinimizer() const
+{
+    return std::unique_ptr<IMinimizer>(new TestMinimizer());
+}
diff --git a/GUI/coregui/Models/MinimizerItem.h b/GUI/coregui/Models/MinimizerItem.h
new file mode 100644
index 0000000..c1e3533
--- /dev/null
+++ b/GUI/coregui/Models/MinimizerItem.h
@@ -0,0 +1,126 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MinimizerItem.h
+//! @brief     Defines MinimizerItem class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERITEM_H
+#define MINIMIZERITEM_H
+
+#include "SessionItem.h"
+
+class IMinimizer;
+
+//! The MinimizerItem class is the base item to hold minimizer settings.
+
+class BA_CORE_API_ MinimizerItem : public SessionItem
+{
+public:
+    explicit MinimizerItem(const QString &model_type);
+    virtual std::unique_ptr<IMinimizer> createMinimizer() const = 0;
+};
+
+//! The MinimizerContainerItem class holds collection of minimizers.
+
+class BA_CORE_API_ MinimizerContainerItem : public MinimizerItem
+{
+public:
+    static const QString P_MINIMIZERS;
+    MinimizerContainerItem();
+
+    std::unique_ptr<IMinimizer> createMinimizer() const;
+};
+
+//! The MinuitMinimizerItem class represents settings for ROOT Minuit2 minimizer.
+
+class BA_CORE_API_ MinuitMinimizerItem : public MinimizerItem
+{
+public:
+    static const QString P_ALGORITHMS;
+    static const QString P_STRATEGY;
+    static const QString P_ERRORDEF;
+    static const QString P_TOLERANCE;
+    static const QString P_PRECISION;
+    static const QString P_MAXFUNCTIONCALLS;
+
+    MinuitMinimizerItem();
+    std::unique_ptr<IMinimizer> createMinimizer() const;
+};
+
+//! The GSLMinimizerItem class represents settings for GSL MultiMin minimizer family.
+
+class BA_CORE_API_ GSLMultiMinimizerItem : public MinimizerItem
+{
+public:
+    static const QString P_ALGORITHMS;
+    static const QString P_MAXITERATIONS;
+
+    GSLMultiMinimizerItem();
+    std::unique_ptr<IMinimizer> createMinimizer() const;
+};
+
+//! The GeneticMinimizerItem class represents settings for TMVA/Genetic minimizer.
+
+class BA_CORE_API_ GeneticMinimizerItem : public MinimizerItem
+{
+public:
+    static const QString P_TOLERANCE;
+    static const QString P_MAXITERATIONS;
+    static const QString P_POPULATIONSIZE;
+    static const QString P_RANDOMSEED;
+
+    GeneticMinimizerItem();
+    std::unique_ptr<IMinimizer> createMinimizer() const;
+};
+
+//! The SimAnMinimizerItem class represents settings for GSL's simulated annealing minimizer.
+
+class BA_CORE_API_ SimAnMinimizerItem : public MinimizerItem
+{
+public:
+    static const QString P_MAXITERATIONS;
+    static const QString P_ITERATIONSTEMP;
+    static const QString P_STEPSIZE;
+    static const QString P_BOLTZMANN_K;
+    static const QString P_BOLTZMANN_TINIT;
+    static const QString P_BOLTZMANN_MU;
+    static const QString P_BOLTZMANN_TMIN;
+
+    SimAnMinimizerItem();
+
+    std::unique_ptr<IMinimizer> createMinimizer() const;
+};
+
+//! The GSLLMAMinimizerItem class represents settings for GSL's version of Levenberg-Marquardt.
+
+class BA_CORE_API_ GSLLMAMinimizerItem : public MinimizerItem
+{
+public:
+    static const QString P_TOLERANCE;
+    static const QString P_MAXITERATIONS;
+
+    GSLLMAMinimizerItem();
+    std::unique_ptr<IMinimizer> createMinimizer() const;
+};
+
+//! The TestMinimizerItem class represents domain's TestMinimizer to test whole chain
+
+class BA_CORE_API_ TestMinimizerItem : public MinimizerItem
+{
+public:
+    TestMinimizerItem();
+    std::unique_ptr<IMinimizer> createMinimizer() const;
+};
+
+#endif // MINIMIZERITEM_H
+
diff --git a/GUI/coregui/Models/MinimizerItemCatalogue.cpp b/GUI/coregui/Models/MinimizerItemCatalogue.cpp
new file mode 100644
index 0000000..659a419
--- /dev/null
+++ b/GUI/coregui/Models/MinimizerItemCatalogue.cpp
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MinimizerItemCatalogue.cpp
+//! @brief     Implements MinimizerItemCatalogue class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerItemCatalogue.h"
+#include "MinimizerFactory.h"
+#include "GUIHelpers.h"
+
+//! Returns ComboProperty representing list of algorithms defined for given minimizerType.
+
+ComboProperty MinimizerItemCatalogue::algorithmCombo(const QString& minimizerType)
+{
+    ComboProperty result = ComboProperty() << algorithmNames(minimizerType);
+    result.setToolTips(algorithmDescriptions(minimizerType));
+    return result;
+}
+
+//! Returns list of algorithm names defined for given minimizer.
+
+QStringList MinimizerItemCatalogue::algorithmNames(const QString &minimizerType)
+{
+    std::vector<std::string> algos
+        = MinimizerFactory::catalogue().algorithmNames(minimizerType.toStdString());
+    return GUIHelpers::fromStdStrings(algos);
+}
+
+//! Returns list of algoritm descriptions defined for given minimizer.
+
+QStringList MinimizerItemCatalogue::algorithmDescriptions(const QString &minimizerType)
+{
+    std::vector<std::string> descr
+        = MinimizerFactory::catalogue().algorithmDescriptions(minimizerType.toStdString());
+    return GUIHelpers::fromStdStrings(descr);
+}
diff --git a/GUI/coregui/Models/MinimizerItemCatalogue.h b/GUI/coregui/Models/MinimizerItemCatalogue.h
new file mode 100644
index 0000000..351be2e
--- /dev/null
+++ b/GUI/coregui/Models/MinimizerItemCatalogue.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MinimizerItemCatalogue.h
+//! @brief     Defines MinimizerItemCatalogue class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERITEMCATALOGUE_H
+#define MINIMIZERITEMCATALOGUE_H
+
+#include "ComboProperty.h"
+
+class MinimizerItem;
+
+//! The MinimizerItemCatalogue class is a static class to provide MinimizerItem
+//! with the list of available minimizers/algorithms.
+
+class BA_CORE_API_ MinimizerItemCatalogue {
+public:
+    static ComboProperty algorithmCombo(const QString &minimizerType);
+
+private:
+    static QStringList algorithmNames(const QString &minimizerType);
+    static QStringList algorithmDescriptions(const QString &minimizerType);
+};
+
+#endif // MINIMIZERITEMCATALOGUE_H
diff --git a/GUI/coregui/Models/ModelMapper.cpp b/GUI/coregui/Models/ModelMapper.cpp
new file mode 100644
index 0000000..75f1ed9
--- /dev/null
+++ b/GUI/coregui/Models/ModelMapper.cpp
@@ -0,0 +1,352 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ModelMapper.cpp
+//! @brief     Implements class ModelMapper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SessionModel.h"
+
+ModelMapper::ModelMapper(QObject *parent)
+    : QObject(parent)
+    , m_active {true}
+    , m_model(0)
+    , m_item(0)
+{
+}
+
+void ModelMapper::setItem(SessionItem *item)
+{
+    if (item) {
+        m_item = item;
+        setModel(item->model());
+    }
+}
+
+void ModelMapper::setOnValueChange(std::function<void(void)> f, const void *caller)
+{
+    m_onValueChange.push_back(call_t(f, caller));
+}
+
+void ModelMapper::setOnPropertyChange(std::function<void(QString)> f, const void *caller)
+{
+    m_onPropertyChange.push_back(call_str_t(f, caller));
+}
+
+void ModelMapper::setOnChildPropertyChange(std::function<void (SessionItem *, QString)> f, const void *caller)
+{
+    m_onChildPropertyChange.push_back(call_item_str_t(f, caller));
+}
+
+void ModelMapper::setOnParentChange(std::function<void (SessionItem *)> f, const void *caller)
+{
+    m_onParentChange.push_back(call_item_t(f, caller));
+}
+
+void ModelMapper::setOnChildrenChange(std::function<void(SessionItem *)> f, const void *caller)
+{
+    m_onChildrenChange.push_back(call_item_t(f, caller));
+}
+
+void ModelMapper::setOnSiblingsChange(std::function<void ()> f, const void *caller)
+{
+    m_onSiblingsChange.push_back(call_t(f, caller));
+}
+
+void ModelMapper::setOnAnyChildChange(std::function<void (SessionItem *)> f, const void *caller)
+{
+    m_onAnyChildChange.push_back(call_item_t(f, caller));
+}
+
+void ModelMapper::setOnItemDestroy(std::function<void (SessionItem *)> f, const void *caller)
+{
+    m_onItemDestroy.push_back(call_item_t(f, caller));
+}
+
+//! Cancells all subscribtion of given caller
+void ModelMapper::unsubscribe(const void *caller)
+{
+    clean_container(m_onValueChange, caller);
+    clean_container(m_onPropertyChange, caller);
+    clean_container(m_onChildPropertyChange, caller);
+    clean_container(m_onParentChange, caller);
+    clean_container(m_onChildrenChange, caller);
+    clean_container(m_onSiblingsChange, caller);
+    clean_container(m_onAnyChildChange, caller);
+    clean_container(m_onItemDestroy, caller);
+}
+
+void ModelMapper::setModel(SessionModel *model)
+{
+    if (m_model) {
+        disconnect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
+                   this, SLOT(onDataChanged(QModelIndex,QModelIndex,QVector<int>)));
+        disconnect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+                   this, SLOT(onRowsInserted(QModelIndex,int,int)));
+        disconnect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+                this, SLOT(onBeginRemoveRows(QModelIndex,int,int)));
+        disconnect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+                this, SLOT(onRowRemoved(QModelIndex,int,int)));
+    }
+
+    m_model = model;
+
+    if (m_model) {
+        connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
+                   this, SLOT(onDataChanged(QModelIndex,QModelIndex,QVector<int>)));
+        connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+                   this, SLOT(onRowsInserted(QModelIndex,int,int)));
+        connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+                this, SLOT(onBeginRemoveRows(QModelIndex,int,int)));
+        connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+                this, SLOT(onRowRemoved(QModelIndex,int,int)));
+    }
+}
+
+int ModelMapper::nestlingDepth(SessionItem *item, int level)
+{
+    if (item == nullptr || item == m_model->rootItem())
+        return -1;
+    if (item == m_item)
+        return level;
+    return nestlingDepth(item->parent(), level + 1);
+
+}
+
+void ModelMapper::callOnValueChange()
+{
+    if (m_active && m_onValueChange.size() > 0) {
+        for (auto f : m_onValueChange) {
+            f.first();
+        }
+    }
+//    if(m_active) emit valueChange();
+}
+
+void ModelMapper::callOnPropertyChange(const QString &name)
+{
+    if (m_active && m_onPropertyChange.size() > 0) {
+        for (auto f : m_onPropertyChange) {
+            f.first(name);
+        }
+    }
+//    if(m_active) emit propertyChange(name);
+}
+
+void ModelMapper::callOnChildPropertyChange(SessionItem *item, const QString &name)
+{
+    if (m_active && m_onChildPropertyChange.size() > 0) {
+        for (auto f : m_onChildPropertyChange) {
+            f.first(item, name);
+        }
+    }
+//    if(m_active) emit childPropertyChange(item, name);
+}
+
+void ModelMapper::callOnParentChange(SessionItem *new_parent)
+{
+    if (m_active && m_onParentChange.size() > 0) {
+        for (auto f : m_onParentChange) {
+            f.first(new_parent);
+        }
+    }
+//    if(m_active) emit parentChange(new_parent);
+}
+
+void ModelMapper::callOnChildrenChange(SessionItem *item)
+{
+    if (m_active && m_onChildrenChange.size() > 0) {
+        for (auto f : m_onChildrenChange) {
+            f.first(item);
+        }
+    }
+//    if(m_active) emit childrenChange(item);
+}
+
+void ModelMapper::callOnSiblingsChange()
+{
+    if (m_active && m_onSiblingsChange.size() > 0) {
+        for (auto f : m_onSiblingsChange) {
+            f.first();
+        }
+    }
+//    if(m_active) emit siblingsChange();
+}
+
+void ModelMapper::callOnAnyChildChange(SessionItem *item)
+{
+    if (m_active && m_onAnyChildChange.size() > 0) {
+        for (auto f : m_onAnyChildChange) {
+            f.first(item);
+        }
+    }
+//    if(m_active) emit anyChildChange(item);
+}
+
+//! Notifies subscribers if an item owning given mapper is about to be destroyed
+void ModelMapper::callOnItemDestroy()
+{
+    if (m_active && m_onItemDestroy.size() > 0) {
+        for (auto f : m_onItemDestroy) {
+            f.first(m_item);
+        }
+    }
+//    if(m_active) emit itemDestroy(new_parent);
+}
+
+void ModelMapper::clearMapper()
+{
+    m_item = 0;
+    setModel(0);
+    m_onValueChange.clear();
+    m_onPropertyChange.clear();
+    m_onChildPropertyChange.clear();
+    m_onParentChange.clear();
+    m_onChildrenChange.clear();
+    m_onSiblingsChange.clear();
+    m_onAnyChildChange.clear();
+    m_onItemDestroy.clear();
+}
+
+void ModelMapper::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight,
+                                const QVector<int> &/*roles*/)
+{
+    Q_ASSERT(m_item);
+
+    if (topLeft.parent() != bottomRight.parent())
+        return; // range must be from the same parent
+
+    SessionItem *item = m_model->itemForIndex(topLeft);
+
+    int nestling = nestlingDepth(item);
+    if (nestling == 0) {
+        callOnValueChange();
+    }
+    if (nestling == 1) {
+        // something happened with our children
+        if (SessionItem *item = m_model->itemForIndex(topLeft)) {
+            // only care f
+            const QString tag = m_item->tagFromItem(item);
+            if (!tag.isEmpty()) {
+                callOnPropertyChange(tag);
+            }
+        }
+    }
+    if (nestling > 1) {
+        if (SessionItem *parent = item->parent()) {
+            const QString tag = parent->tagFromItem(item);
+            if (!tag.isEmpty()) {
+                callOnChildPropertyChange(parent, tag);
+            }
+        }
+    }
+    if (nestling > 0) {
+        callOnAnyChildChange(item);
+    }
+}
+
+void ModelMapper::onRowsInserted(const QModelIndex &parent, int first, int /*last*/)
+{
+    Q_ASSERT(m_item);
+
+    SessionItem *newChild = m_model->itemForIndex(parent.child(first, 0));
+
+    int nestling = nestlingDepth(newChild);
+
+    if (newChild) {
+        if (m_item == newChild) {
+            callOnParentChange(m_model->itemForIndex(parent));
+        }
+    }
+    if (nestling == 1) {
+
+        callOnChildrenChange(newChild);
+
+        // inform siblings about the change
+        // FIXME SessionItems with invalid parent index (i.e. IView's located on top of graphics scene like ParticleView) should be also notified to update the label
+//        if(SessionItem *parent = newChild->parent()) {
+//            QVector<SessionItem *> items = parent->getChildrenOfType(newChild->modelType());
+//            foreach(SessionItem *sibling, items) {
+//                if(m_item == sibling) callOnSiblingsChange();
+//            }
+//        }
+    }
+
+    if(SessionItem *parent = newChild->parent()) {
+        QVector<SessionItem *> items = parent->getChildrenOfType(newChild->modelType());
+        foreach(SessionItem *sibling, items) {
+            if(m_item == sibling)
+                callOnSiblingsChange();
+        }
+    }
+
+
+    if (nestling > 0) {
+        callOnAnyChildChange(newChild);
+    }
+}
+
+void ModelMapper::onBeginRemoveRows(const QModelIndex &parent, int first, int /*last*/)
+{
+    Q_ASSERT(m_item);
+    SessionItem *oldChild = m_model->itemForIndex(parent.child(first, 0));
+
+    int nestling = nestlingDepth(m_model->itemForIndex(parent));
+
+    if (oldChild) {
+        if (m_item == oldChild) {
+            callOnParentChange(0);
+        }
+        if (nestling == 0) {
+
+            callOnChildrenChange(0);
+
+            // inform siblings about the change
+//            if(SessionItem *parent = oldChild->parent()) {
+//                QVector<SessionItem *> items = parent->getChildrenOfType(oldChild->modelType());
+//                foreach(SessionItem *sibling, items) {
+//                    if(m_item == sibling) callOnSiblingsChange();
+//                }
+//            }
+        }
+
+//        if(SessionItem *parent = oldChild->parent()) {
+//            QVector<SessionItem *> items = parent->getChildrenOfType(oldChild->modelType());
+//            foreach(SessionItem *sibling, items) {
+//                if(m_item == sibling)
+//                    callOnSiblingsChange();
+//            }
+//        }
+
+
+    }
+
+    if (m_item == oldChild) {
+        m_aboutToDelete = parent.child(first, 0);
+    }
+}
+
+void ModelMapper::onRowRemoved(const QModelIndex &parent, int first, int /*last*/)
+{
+    int nestling = nestlingDepth(m_model->itemForIndex(parent));
+
+    if (nestling >= 0 || m_model->itemForIndex(parent) == m_item->parent()) {
+        callOnAnyChildChange(nullptr);
+        callOnSiblingsChange();
+
+    }
+
+    if(m_aboutToDelete.isValid() && m_aboutToDelete == parent.child(first, 0)) {
+        clearMapper();
+
+    }
+}
diff --git a/GUI/coregui/Models/ModelMapper.h b/GUI/coregui/Models/ModelMapper.h
new file mode 100644
index 0000000..6ff7158
--- /dev/null
+++ b/GUI/coregui/Models/ModelMapper.h
@@ -0,0 +1,124 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ModelMapper.h
+//! @brief     Defines class ModelMapper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MODELMAPPER_H
+#define MODELMAPPER_H
+
+#include "WinDllMacros.h"
+#include <QModelIndex>
+#include <functional>
+
+class SessionModel;
+class SessionItem;
+
+
+class BA_CORE_API_ ModelMapper : public QObject
+{
+    Q_OBJECT
+public:
+    ModelMapper(QObject *parent = 0);
+
+    void setItem(SessionItem* item);
+
+    void setOnValueChange(std::function<void(void)> f, const void *caller=0);
+
+    void setOnPropertyChange(std::function<void(QString)> f, const void *caller=0);
+
+    void setOnChildPropertyChange(std::function<void(SessionItem*,QString)> f, const void *caller=0);
+
+    void setOnParentChange(std::function<void(SessionItem*)> f, const void *caller=0);
+
+    void setOnChildrenChange(std::function<void(SessionItem*)> f, const void *caller=0);
+
+    void setOnSiblingsChange(std::function<void(void)> f, const void *caller=0);
+
+    void setOnAnyChildChange(std::function<void(SessionItem*)> f, const void *caller=0);
+
+    void setActive(bool state) {m_active = state;}
+
+    void setOnItemDestroy(std::function<void(SessionItem*)> f, const void *caller=0);
+
+    void unsubscribe(const void *caller);
+
+    void callOnItemDestroy();
+
+signals:
+    void valueChange();
+    void propertyChange(const QString &name);
+    void childPropertyChange(SessionItem *item, const QString &name);
+    void parentChange(SessionItem *item);
+    void childrenChange(SessionItem *item);
+    void siblingsChange();
+    void anyChildChange(SessionItem *item);
+    void itemDestroy(SessionItem *item);
+
+public slots:
+    void onDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight,
+                       const QVector<int> & roles = QVector<int> ());
+
+    void onRowsInserted(const QModelIndex & parent, int first, int last);
+
+    void onBeginRemoveRows(const QModelIndex & parent, int first, int last);
+
+    void onRowRemoved(const QModelIndex & parent, int first, int last);
+
+private:
+    //! removes all callbacks related to given caller
+    template<class U> void clean_container(U& v, const void *caller);
+
+    void setModel(SessionModel *model);
+    int nestlingDepth(SessionItem* item, int level = 0);
+
+    void callOnValueChange();
+    void callOnPropertyChange(const QString &name);
+    void callOnChildPropertyChange(SessionItem *item, const QString &name);
+    void callOnParentChange(SessionItem *new_parent);
+    void callOnChildrenChange(SessionItem *item);
+    void callOnSiblingsChange();
+    void callOnAnyChildChange(SessionItem *item);
+
+    void clearMapper();
+
+    bool m_active;
+    SessionModel *m_model;
+    SessionItem *m_item;
+
+    using call_t = std::pair<std::function<void(void)>, const void *>;
+    using call_str_t = std::pair<std::function<void(QString)>, const void *>;
+    using call_item_t = std::pair<std::function<void(SessionItem *)>, const void *>;
+    using call_item_str_t = std::pair<std::function<void(SessionItem*,QString)>, const void *>;
+
+    std::vector<call_t> m_onValueChange;
+    std::vector<call_str_t> m_onPropertyChange;
+    std::vector<call_item_str_t> m_onChildPropertyChange;
+    std::vector<call_item_t> m_onParentChange;
+    std::vector<call_item_t> m_onChildrenChange;
+    std::vector<call_t> m_onSiblingsChange;
+    std::vector<call_item_t> m_onAnyChildChange;
+    std::vector<call_item_t> m_onItemDestroy;
+    QModelIndex m_aboutToDelete;
+};
+
+
+template<class U>
+inline void ModelMapper::clean_container(U& v, const void *caller) {
+    v.erase(std::remove_if(v.begin(), v.end(),
+        [caller](typename U::value_type const &x) -> bool { return (x.second == caller ? true : false); }),
+            v.end());
+}
+
+
+#endif // MODELMAPPER_H
diff --git a/GUI/coregui/Models/ModelPath.cpp b/GUI/coregui/Models/ModelPath.cpp
new file mode 100644
index 0000000..737d952
--- /dev/null
+++ b/GUI/coregui/Models/ModelPath.cpp
@@ -0,0 +1,270 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ModelPath.cpp
+//! @brief     Implements class ModelPath
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ModelPath.h"
+#include "GroupItem.h"
+#include "ParticleItem.h"
+#include "ParticleLayoutItem.h"
+#include "SessionModel.h"
+#include "JobItem.h"
+
+using std::string;
+
+std::vector<std::unique_ptr<IParameterTranslator>> ModelPath::m_special_translators {};
+
+QStringList ModelPath::getParameterTreeList(const SessionItem *item, QString prefix)
+{
+    QStringList result;
+    if (item->modelType() ==  Constants::PropertyType
+            && item->value().type() == QVariant::Double && item->itemName() != ParticleItem::P_ABUNDANCE) {
+        if (prefix.endsWith("/"))
+            prefix = prefix.mid(0, prefix.size()-1);
+        result << prefix;
+    }
+    else {
+        if (item->hasChildren()) {
+            for (auto p_child : item->childItems()) {
+                if(p_child->isVisible()) {
+                    if (p_child->modelType() ==  Constants::GroupItemType) {
+                        if (const GroupItem *groupItem = dynamic_cast<const GroupItem*>(p_child)) {
+                            if (const SessionItem *subItem = groupItem->group()->getCurrentItem()) {
+                                QString child_prefix = prefix + subItem->itemName() + QString("/");
+                                result << getParameterTreeList(subItem, child_prefix);
+                            }
+                        }
+                    } else {
+                        QString child_name = p_child->itemName();
+                        QString child_prefix = prefix + child_name + QString("/");
+                        result << getParameterTreeList(p_child, child_prefix);
+                    }
+                }
+            }
+        }
+    }
+    return result;
+}
+
+double ModelPath::getParameterValue(const SessionItem *item, const QString &name)
+{
+    QString head = getFirstField(name);
+    auto p_child = item->getChildByName(head);
+    if (p_child) {
+        return getParameterValue(p_child, stripFirstField(name));
+    }
+    if (item->isTag(head)) {
+        return item->getItemValue(head).toDouble();
+    } else {
+        return 0.0;
+    }
+}
+
+string ModelPath::translateParameterName(const SessionItem* item, const QString& par_name)
+{
+    std::ostringstream result;
+    QStringList list = splitParameterName(par_name);
+    if (list.isEmpty()) {
+        return {};
+    }
+    QString first_field = list[0];
+    result << "/" << translateSingleName(first_field);
+    if (list.size() > 1) {
+        QString remainder = list[1];
+        const SessionItem* p_child = findChild(item, first_field);
+        if (p_child) {
+            result << translateParameterName(p_child, remainder);
+        }
+    }
+    return stripDistributionNone(result.str());
+}
+
+void ModelPath::addParameterTranslator(const IParameterTranslator &translator)
+{
+    m_special_translators.emplace_back(translator.clone());
+}
+
+QString ModelPath::getPathFromIndex(const QModelIndex &index)
+{
+    if (index.isValid()) {
+        QStringList namePath;
+        QModelIndex cur = index;
+        while (cur.isValid()) {
+            namePath << cur.data().toString();
+            cur = cur.parent();
+        }
+        std::reverse(namePath.begin(), namePath.end());
+        return namePath.join("/");
+    }
+    return QString();
+}
+
+// FIXME TODO refactor this hell, item #1623, item #1624
+
+QModelIndex ModelPath::getIndexFromPath(const SessionModel *model, const QString &path)
+{
+    if (model) {
+        QStringList parts = path.split("/");
+        SessionItem *t = model->rootItem();
+        for(int i = 0; i < parts.length(); i++) {
+            if (t->modelType()==Constants::JobItemType && parts[i]==Constants::InstrumentType) {
+                t = t->getItem(JobItem::T_INSTRUMENT);
+                continue;
+            }
+            for (int j = 0; j < t->rowCount(); j++) {
+                if (t->childAt(j)->itemName() == parts[i]) {
+                    t = t->childAt(j);
+                    break;
+                }
+            }
+        }
+        return t->index();
+    }
+    return QModelIndex();
+}
+
+//! returns an item from relative path wrt to given parent
+SessionItem *ModelPath::getItemFromPath(const QString &relPath, SessionItem *parent)
+{
+    Q_ASSERT(parent);
+    QString fullPath = getPathFromIndex(parent->index()) + "/" + relPath;
+    return parent->model()->itemForIndex(ModelPath::getIndexFromPath(parent->model(), fullPath));
+}
+
+//! Iterates through all the model and returns true if item is found. This is to
+
+bool ModelPath::isValidItem(SessionModel *model, SessionItem *item, const QModelIndex &parent)
+{
+    for(int i_row=0; i_row<model->rowCount(parent); ++i_row) {
+        QModelIndex index = model->index(i_row, 0, parent);
+        SessionItem *curr = model->itemForIndex(index);
+        if(curr == item) return true;
+
+        bool isvalid = isValidItem(model, item, index);
+        if(isvalid) return isvalid;
+    }
+    return false;
+}
+
+QStringList ModelPath::splitParameterName(const QString &par_name)
+{
+    QStringList result;
+    for (auto& translator : m_special_translators) {
+        result = translator->split(par_name);
+        if (result.size() > 0) {
+            return result;
+        }
+    }
+    // TODO: extract as default split method
+    result << getFirstField(par_name);
+    QString remainder = stripFirstField(par_name);
+    if (!remainder.isEmpty()) {
+        result << remainder;
+    }
+    return result;
+}
+
+QString ModelPath::getFirstField(const QString &par_name)
+{
+    QStringList par_list = par_name.split("/");
+    if (par_list.size()==0) return QString {};
+    return par_list.front();
+}
+
+QString ModelPath::stripFirstField(const QString &par_name)
+{
+    QStringList par_list = par_name.split("/");
+    if (par_list.size()<2) return QString {};
+    par_list.removeFirst();
+    return par_list.join("/");
+}
+
+string ModelPath::translateSingleName(const QString &name)
+{
+    for (auto& translator : m_special_translators) {
+        auto result = translator->translate(name);
+        if (!result.empty()) {
+            return result;
+        }
+    }
+    return name.toStdString();
+}
+
+SessionItem* ModelPath::findChild(const SessionItem *item, const QString& first_field)
+{
+    if (item->modelType()==Constants::JobItemType) {
+        if (first_field==Constants::MultiLayerType) {
+            return item->getItem(JobItem::T_SAMPLE);
+        } else if (first_field==Constants::InstrumentType) {
+            return item->getItem(JobItem::T_INSTRUMENT);
+        }
+    }
+    SessionItem* p_child = item->getChildByName(first_field);
+    if (!p_child) { //search through group items
+        auto groupItems = item->getChildrenOfType(Constants::GroupItemType);
+        for (SessionItem* groupItem : groupItems) {
+            if (GroupItem *gItem = dynamic_cast<GroupItem*>(groupItem)) {
+                if (gItem->group()->getCurrentType() == first_field) {
+                    p_child = gItem->group()->getCurrentItem();
+                    break;
+                }
+            }
+        }
+    }
+    return p_child;
+}
+
+// TODO: item #1623, remove this hack when refactoring name translations
+string ModelPath::stripDistributionNone(const string &name)
+{
+    const string distribution_none { "/DistributionNone/Value" };
+    if (name.length() >= distribution_none.length() &&
+        name.compare(name.length()-distribution_none.length(), distribution_none.length(),
+                     distribution_none)==0) {
+        return name.substr(0, name.length()-distribution_none.length());
+    }
+    return name;
+}
+
+//! Returns true when we know how to translate ParameterItem link to domain name.
+// TODO: item #1623, item #1624 remove this hack when refactoring name translations
+// Function is intended to disalow drag-and-drop of ParameterItem onto FitParameterItem
+// for non-implemented  or senseless translations (in GUI)
+bool ModelPath::isTranslatable(const SessionItem *item, const QString &par_name)
+{
+    Q_UNUSED(item);
+    if(par_name.contains(Constants::DetectorType))
+        return false;
+    if(par_name.contains(ParticleItem::P_ABUNDANCE))
+        return false;
+    if(par_name.contains(ParticleLayoutItem::P_TOTAL_DENSITY))
+        return false;
+    if(par_name.contains("FTDistribution1D") || par_name.contains("FTDecayFunction1D"))
+        return false;
+    if(par_name.contains("FTDistribution2D") || par_name.contains("FTDecayFunction2D"))
+        return false;
+    return true;
+}
+
+//! Returns ancestor of given modelType for given item.
+//! For example, returns corresponding jobItem owning ParameterItem via ParameterContainer.
+
+const SessionItem* ModelPath::ancestor(const SessionItem *item, const QString &requiredModelType)
+{
+    const SessionItem *cur = item;
+    while (cur && cur->modelType() != requiredModelType)
+        cur = cur->parent();
+
+    return cur;
+}
diff --git a/GUI/coregui/Models/ModelPath.h b/GUI/coregui/Models/ModelPath.h
new file mode 100644
index 0000000..45d102f
--- /dev/null
+++ b/GUI/coregui/Models/ModelPath.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ModelPath.h
+//! @brief     Defines class ModelPath
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MODELPATH_H
+#define MODELPATH_H
+
+#include "WinDllMacros.h"
+#include "ParameterTranslators.h"
+#include <memory>
+#include <vector>
+
+class SessionItem;
+class QModelIndex;
+class SessionModel;
+
+class BA_CORE_API_ ModelPath
+{
+public:
+    //! retrieves a list of all parameter names in the SessionItem tree starting
+    //! with this node and prefixes them
+    static QStringList getParameterTreeList(const SessionItem *item, QString prefix = "");
+
+    //! retrieve value of given parameter name
+    static double getParameterValue(const SessionItem *item, const QString &name);
+
+    //! translates the given parameter name to a domain parameter name
+    //! name should start with a child/subitem name or be a direct parameter name
+    static std::string translateParameterName(const SessionItem *item, const QString &par_name);
+
+    static void addParameterTranslator(const IParameterTranslator &translator);
+
+    static QString getPathFromIndex(const QModelIndex &index);
+
+    static QModelIndex getIndexFromPath(const SessionModel *model, const QString &path);
+
+    static SessionItem* getItemFromPath(const QString &relPath, SessionItem *parent);
+
+    static bool isValidItem(SessionModel *model, SessionItem *item, const QModelIndex &parent);
+
+    static bool isTranslatable(const SessionItem *item, const QString &par_name);
+
+    static const SessionItem *ancestor(const SessionItem *item, const QString& requiredModelType);
+
+private:
+
+    static QStringList splitParameterName(const QString& par_name);
+
+    static QString getFirstField(const QString& par_name);
+
+    static QString stripFirstField(const QString& par_name);
+
+    static std::string translateSingleName(const QString& name);
+
+    static SessionItem* findChild(const SessionItem* item, const QString& first_field);
+
+    static std::string stripDistributionNone(const std::string& name);
+
+    static std::vector<std::unique_ptr<IParameterTranslator>> m_special_translators;
+};
+
+#endif // MODELPATH_H
diff --git a/GUI/coregui/Models/MultiLayerItem.cpp b/GUI/coregui/Models/MultiLayerItem.cpp
new file mode 100644
index 0000000..4b91c6d
--- /dev/null
+++ b/GUI/coregui/Models/MultiLayerItem.cpp
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MultiLayerItem.cpp
+//! @brief     Implements class MultiLayerItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MultiLayerItem.h"
+#include "BornAgainNamespace.h"
+#include "LayerItem.h"
+
+const QString MultiLayerItem::P_CROSS_CORR_LENGTH =
+        QString::fromStdString(BornAgain::CrossCorrelationLength);
+const QString MultiLayerItem::T_LAYERS = "Layer tag";
+
+MultiLayerItem::MultiLayerItem()
+    : SessionGraphicsItem(Constants::MultiLayerType)
+{
+    addProperty(P_CROSS_CORR_LENGTH, 0.0);
+    registerTag(T_LAYERS, 0, -1, QStringList() << Constants::LayerType);
+    setDefaultTag(T_LAYERS);
+    setItemName(Constants::MultiLayerType);
+    mapper()->setOnChildrenChange(
+                [this](SessionItem*)
+    {
+        updateLayers();
+    });
+}
+
+void MultiLayerItem::updateLayers()
+{
+    QVector<SessionItem*> list = getChildrenOfType(Constants::LayerType);
+    for(auto it = list.begin(); it != list.end(); ++it) {
+        if(it == list.begin()) {
+            (*it)->getItem(LayerItem::P_ROUGHNESS)->setEnabled(false);
+        } else {
+            (*it)->getItem(LayerItem::P_ROUGHNESS)->setEnabled(true);
+        }
+        if(it == list.begin() || it == (list.end()-1)) {
+            (*it)->getItem(LayerItem::P_THICKNESS)->setEnabled(false);
+        } else {
+            (*it)->getItem(LayerItem::P_THICKNESS)->setEnabled(true);
+        }
+    }
+}
diff --git a/GUI/coregui/Models/MultiLayerItem.h b/GUI/coregui/Models/MultiLayerItem.h
new file mode 100644
index 0000000..797e2a1
--- /dev/null
+++ b/GUI/coregui/Models/MultiLayerItem.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/MultiLayerItem.h
+//! @brief     Defines class MultiLayerItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MULTILAYERITEM_H
+#define MULTILAYERITEM_H
+
+#include "SessionGraphicsItem.h"
+
+class BA_CORE_API_ MultiLayerItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_CROSS_CORR_LENGTH;
+    static const QString T_LAYERS;
+    explicit MultiLayerItem();
+    virtual ~MultiLayerItem() {}
+
+private:
+    void updateLayers();
+};
+
+#endif // MULTILAYERITEM_H
diff --git a/GUI/coregui/Models/ParameterTranslators.cpp b/GUI/coregui/Models/ParameterTranslators.cpp
new file mode 100644
index 0000000..aa3eac5
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTranslators.cpp
@@ -0,0 +1,108 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTranslators.cpp
+//! @brief     Implements subclasses of IParameterTranslator
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterTranslators.h"
+#include "BornAgainNamespace.h"
+#include "ParticleItem.h"
+#include "RotationItems.h"
+#include "VectorItem.h"
+#include "InterferenceFunctionItems.h"
+#include "LatticeTypeItems.h"
+#include <QDebug>
+
+QStringList IParameterTranslator::split(const QString &par_name) const
+{
+    QStringList result;
+
+    std::string translated_name = translate(par_name);
+    if (!translated_name.empty())
+        result << par_name;
+
+    return result;
+}
+
+std::string PositionTranslator::translate(const QString& name) const
+{
+    QStringList name_list = name.split("/");
+    if (name_list.size() > 2) return {};
+    if (name_list.size() > 1 && name_list[0] == ParticleItem::P_POSITION) {
+        if (name_list[1] == VectorItem::P_X) {
+            return BornAgain::PositionX;
+        }
+        if (name_list[1] == VectorItem::P_Y) {
+            return BornAgain::PositionY;
+        }
+        if (name_list[1] == VectorItem::P_Z) {
+            return BornAgain::PositionZ;
+        }
+    }
+    return {};
+}
+
+std::string LatticeTypeTranslator::translate(const QString& name) const
+{
+    QStringList name_list = name.split("/");
+    if (name_list.size() != 2) return {};
+    if (name_list[0] == Constants::BasicLatticeType) {
+
+        if (name_list[1] == BasicLatticeTypeItem::P_LATTICE_LENGTH1) {
+            return BornAgain::LatticeLength1;
+        }
+        if (name_list[1] == BasicLatticeTypeItem::P_LATTICE_LENGTH2) {
+            return BornAgain::LatticeLength2;
+        }
+
+        if (name_list[1] == BasicLatticeTypeItem::P_LATTICE_ANGLE) {
+            return BornAgain::LatticeAngle;
+        }
+    }
+
+    else if(name_list[0] == Constants::SquareLatticeType
+            || name_list[0] == Constants::HexagonalLatticeType) {
+        if (name_list[1] == SquareLatticeTypeItem::P_LATTICE_LENGTH) {
+            return SquareLatticeTypeItem::P_LATTICE_LENGTH.toStdString() + std::string("*");
+        }
+    }
+    return {};
+}
+
+std::string RotationTranslator::translate(const QString& name) const
+{
+    QStringList name_list = name.split("/");
+    std::string separator {"/"};
+    if (name_list.size() > 3) return {};
+    if (name_list.size() == 3 && name_list[0] == Constants::TransformationType) {
+        if (name_list[1] == Constants::XRotationType) {
+            return BornAgain::XRotationType + separator + BornAgain::Angle;
+        }
+        if (name_list[1] == Constants::YRotationType) {
+            return BornAgain::YRotationType + separator + BornAgain::Angle;
+        }
+        if (name_list[1] == Constants::ZRotationType) {
+            return BornAgain::ZRotationType + separator + BornAgain::Angle;
+        }
+        if (name_list[1] == Constants::EulerRotationType) {
+            if (name_list[2] == EulerRotationItem::P_ALPHA) {
+                return BornAgain::EulerRotationType + separator + BornAgain::Alpha;
+            } else if (name_list[2] == EulerRotationItem::P_BETA) {
+                return BornAgain::EulerRotationType + separator + BornAgain::Beta;
+            } else if (name_list[2] == EulerRotationItem::P_GAMMA) {
+                return BornAgain::EulerRotationType + separator + BornAgain::Gamma;
+            }
+        }
+    }
+    return {};
+}
diff --git a/GUI/coregui/Models/ParameterTranslators.h b/GUI/coregui/Models/ParameterTranslators.h
new file mode 100644
index 0000000..84e70b3
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTranslators.h
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTranslators.h
+//! @brief     Defines interface IParameterTranslator and subclasses
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERTRANSLATORS_H
+#define PARAMETERTRANSLATORS_H
+
+#include <QStringList>
+
+class IParameterTranslator {
+public:
+    virtual ~IParameterTranslator()=default;
+
+    virtual IParameterTranslator* clone() const=0;
+
+    virtual QStringList split(const QString &par_name) const;
+    virtual std::string translate(const QString &name) const=0;
+};
+
+
+class PositionTranslator final : public IParameterTranslator {
+public:
+    ~PositionTranslator() override {}
+
+    PositionTranslator* clone() const override { return new PositionTranslator {}; }
+
+    std::string translate(const QString &name) const override;
+};
+
+
+class LatticeTypeTranslator final : public IParameterTranslator {
+public:
+    ~LatticeTypeTranslator() override {}
+
+    LatticeTypeTranslator* clone() const override { return new LatticeTypeTranslator {}; }
+
+    std::string translate(const QString &name) const override;
+};
+
+
+class RotationTranslator final : public IParameterTranslator {
+public:
+    ~RotationTranslator() override {}
+
+    RotationTranslator* clone() const override { return new RotationTranslator {}; }
+
+    std::string translate(const QString &name) const override;
+};
+
+#endif // PARAMETERTRANSLATORS_H
diff --git a/GUI/coregui/Models/ParameterTreeBuilder.cpp b/GUI/coregui/Models/ParameterTreeBuilder.cpp
new file mode 100644
index 0000000..ecff9b8
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTreeBuilder.cpp
@@ -0,0 +1,117 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTreeBuilder.cpp
+//! @brief     Implements class ParameterTreeBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterTreeBuilder.h"
+#include "FitParameterHelper.h"
+#include "GroupItem.h"
+#include "JobItem.h"
+#include "ModelPath.h"
+#include "MultiLayerItem.h"
+#include "ParameterTreeItems.h"
+#include "SampleModel.h"
+#include <QStack>
+
+void ParameterTreeBuilder::createParameterTree(JobItem *item, const QString &tag)
+{
+    SessionItem *container
+        = item->model()->insertNewItem(Constants::ParameterContainerType, item->index(), -1, tag);
+
+    SessionItem *multiLayer
+        = container->model()->insertNewItem(Constants::ParameterLabelType, container->index());
+    handleItem(multiLayer, item->getItem(JobItem::T_SAMPLE));
+
+    SessionItem *instrument
+        = container->model()->insertNewItem(Constants::ParameterLabelType, container->index());
+    handleItem(instrument, item->getItem(JobItem::T_INSTRUMENT));
+
+#ifndef NDEBUG
+    // Provides all items in "JobItem/Parameter Tree Container" with domain links already
+    // at the stage of ParameterTree creation. It is necessary for validation, in Release mode
+    // it will lead for unnecessary large project files.
+    populateDomainLinks(item, tag);
+#endif
+}
+
+void ParameterTreeBuilder::handleItem(SessionItem *tree, SessionItem *source)
+{
+    if (tree->modelType() == Constants::ParameterLabelType) {
+        tree->setDisplayName(source->itemName());
+
+    }
+
+    else if (tree->modelType() == Constants::ParameterType) {
+        tree->setDisplayName(source->itemName());
+        tree->setValue(source->value());
+        QString path = ModelPath::getPathFromIndex(source->index());
+        int firstSlash = path.indexOf('/');
+        path = path.mid(firstSlash + 1);
+        tree->setItemValue(ParameterItem::P_LINK, path);
+        tree->setItemValue(ParameterItem::P_BACKUP, source->value());
+        return;
+    }
+
+    else {
+        return;
+    }
+
+    for (SessionItem *child : source->childItems()) {
+        if (child->isVisible() && child->isEnabled()) {
+            if (child->modelType() == Constants::PropertyType) {
+                if (child->value().type() == QVariant::Double) {
+                    SessionItem *branch
+                        = tree->model()->insertNewItem(Constants::ParameterType, tree->index());
+                    handleItem(branch, child);
+                }
+            } else if (child->modelType() == Constants::GroupItemType) {
+                SessionItem *currentItem
+                    = dynamic_cast<GroupItem *>(child)->group()->getCurrentItem();
+                if (currentItem && currentItem->rowCount() > 0) {
+                    SessionItem *branch = tree->model()->insertNewItem(
+                        Constants::ParameterLabelType, tree->index());
+                    handleItem(branch, currentItem);
+                }
+            } else {
+                SessionItem *branch
+                    = tree->model()->insertNewItem(Constants::ParameterLabelType, tree->index());
+                handleItem(branch, child);
+            }
+        }
+    }
+}
+
+//! For every ParameterItem in JobItem's ParameterTree container creates a link to domain.
+void ParameterTreeBuilder::populateDomainLinks(JobItem *jobItem, const QString &tag)
+{
+    SessionItem *current = jobItem->getItem(tag); // this is container
+    QStack<SessionItem *> stack;
+    stack.push(current);
+    while (!stack.empty()) {
+        current = stack.pop();
+        if (current->modelType() == Constants::ParameterLabelType
+                || current->modelType() == Constants::ParameterContainerType) {
+            for (SessionItem *child : current->getItems()) {
+                stack.push(child);
+            }
+        } else {
+            if (ParameterItem *parItem = dynamic_cast<ParameterItem *>(current)) {
+                QString parItemPath = FitParameterHelper::getParameterItemPath(parItem);
+                std::string domainPath = ModelPath::translateParameterName(
+                    jobItem, parItemPath);
+                parItem->setItemValue(ParameterItem::P_DOMAIN, QString::fromStdString(domainPath));
+            }
+        }
+    }
+}
diff --git a/GUI/coregui/Models/ParameterTreeBuilder.h b/GUI/coregui/Models/ParameterTreeBuilder.h
new file mode 100644
index 0000000..3d1a7af
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTreeBuilder.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTreeBuilder.h
+//! @brief     Defines class ParameterTreeBuilder
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERTREEBUILDER_H
+#define PARAMETERTREEBUILDER_H
+
+#include <QString>
+#include "WinDllMacros.h"
+
+class JobItem;
+class SessionItem;
+
+//! The ParameterTreeBuilder class helps JobModel to create a container with ParameterItem's.
+//! The ParameterItem appears in RealTimeView and provides real time tuning of MultiLayerItem
+//! and InstrumentItem.
+
+class BA_CORE_API_ ParameterTreeBuilder
+{
+public:
+    static void createParameterTree(JobItem *item, const QString &tag = QString());
+    static void populateDomainLinks(JobItem *jobItem,  const QString &tag);
+private:
+    static void handleItem(SessionItem *tree, SessionItem *source);
+};
+
+#endif // PARAMETERTREEBUILDER_H
diff --git a/GUI/coregui/Models/ParameterTreeItems.cpp b/GUI/coregui/Models/ParameterTreeItems.cpp
new file mode 100644
index 0000000..601d6d2
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTreeItems.cpp
@@ -0,0 +1,95 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTreeItems.cpp
+//! @brief     Implements classes for ParameterTreeItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterTreeItems.h"
+#include "ModelPath.h"
+#include "SessionModel.h"
+#include "FitParameterHelper.h"
+
+// ----------------------------------------------------------------------------
+
+ParameterLabelItem::ParameterLabelItem()
+    : SessionItem(Constants::ParameterLabelType)
+{
+    const QString T_CHILDREN = "children tag";
+    registerTag(T_CHILDREN, 0, -1, QStringList()
+                << Constants::ParameterLabelType << Constants::ParameterType);
+    setDefaultTag(T_CHILDREN);
+}
+
+const QString ParameterItem::P_LINK = "Link";
+const QString ParameterItem::P_BACKUP = "Backup";
+const QString ParameterItem::P_DOMAIN = "Domain";
+ParameterItem::ParameterItem()
+    : SessionItem(Constants::ParameterType)
+{
+    // Link to original PropertyItem in one of components of MultiLayerItem or InstrumentItem
+    addProperty(P_LINK, "");
+    // The back up value of PropertyItem to be able to reset parameter tuning tree to initial state
+    addProperty(P_BACKUP, 0.0);
+    // The domain name of corresponding ISample's registered parameter
+    addProperty(P_DOMAIN, "");
+}
+
+// ----------------------------------------------------------------------------
+
+//! Sets current value to the original PropertyItem of MultiLayerItem/InstrumentItem.
+
+void ParameterItem::propagateValueLink(bool backup)
+{
+    if (backup)
+        setValue(getItemValue(P_BACKUP));
+    SessionItem *item = getLinkedItem();
+    if (item)
+        item->setValue(value());
+}
+
+//! Returns corresponding linked item in MultiLayerItem/IsntrumentItem
+
+SessionItem *ParameterItem::getLinkedItem()
+{
+    const SessionItem *jobItem = ModelPath::ancestor(this, Constants::JobItemType);
+    Q_ASSERT(jobItem);
+    QString link = jobItem->itemName() + "/" + getItemValue(P_LINK).toString();
+    return model()->itemForIndex(ModelPath::getIndexFromPath(model(), link));
+}
+
+//! Returns true if item can be used to drag-and-drop to FitParameterContainer.
+//! In other words, if translation to domain name is implemented and valid.
+// TODO, item #1623, consider the necessity of method after all fit parameter translations
+// are fixed
+
+bool ParameterItem::isFittable() const
+{
+    const SessionItem *jobItem = ModelPath::ancestor(this, Constants::JobItemType);
+    Q_ASSERT(jobItem);
+    return ModelPath::isTranslatable(jobItem, FitParameterHelper::getParameterItemPath(this));
+
+// TODO, item #1623, consider equivalent implementation instead
+//    if(getItemValue(P_DOMAIN).toString() == Constants::FITPAR_UNFITTABLE)
+//        return false;
+//    return true;
+}
+
+// ----------------------------------------------------------------------------
+
+ParameterContainerItem::ParameterContainerItem()
+    : SessionItem(Constants::ParameterContainerType)
+{
+    const QString T_CHILDREN = "children tag";
+    registerTag(T_CHILDREN, 0, -1, QStringList() << Constants::ParameterLabelType);
+    setDefaultTag(T_CHILDREN);
+}
diff --git a/GUI/coregui/Models/ParameterTreeItems.h b/GUI/coregui/Models/ParameterTreeItems.h
new file mode 100644
index 0000000..055abbb
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTreeItems.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTreeItems.h
+//! @brief     Defines classes for ParameterTreeItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERTREEITEMS_H
+#define PARAMETERTREEITEMS_H
+
+#include "SessionItem.h"
+
+//! ParameterTreeItems is a collection of items necessary to form a tuning tree for
+//! real time widget.
+
+//! The ParameterLabelItem class represents a label (string without value, like 'Layer',
+//! 'MultiLayer') in a parameter tuning tree.
+
+class BA_CORE_API_ ParameterLabelItem : public SessionItem
+{
+public:
+    ParameterLabelItem();
+};
+
+//! The ParameterItem class represent a tuning value in a parameter tuning tree.
+
+class BA_CORE_API_ ParameterItem : public SessionItem
+{
+public:
+    static const QString P_LINK;
+    static const QString P_BACKUP;
+    static const QString P_DOMAIN;
+    ParameterItem();
+    void propagateValueLink(bool backup = false);
+    SessionItem *getLinkedItem();
+
+    bool isFittable() const;
+};
+
+//! The ParameterContainerItem is a top item to hold all ParameterItem, represents an entry
+//! point to parameter tuning tree. Part of JobItem.
+
+class BA_CORE_API_ ParameterContainerItem : public SessionItem
+{
+public:
+    ParameterContainerItem();
+};
+
+#endif // PARAMETERTREEITEMS_H
diff --git a/GUI/coregui/Models/ParameterTuningModel.cpp b/GUI/coregui/Models/ParameterTuningModel.cpp
new file mode 100644
index 0000000..db4a96e
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTuningModel.cpp
@@ -0,0 +1,78 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTuningModel.cpp
+//! @brief     Implements class ParameterTuningModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterTuningModel.h"
+#include "FitParameterHelper.h"
+#include "ParameterTreeItems.h"
+#include "SessionModel.h"
+#include <QDebug>
+#include <QMimeData>
+
+ParameterTuningModel::ParameterTuningModel(QObject *parent)
+    : FilterPropertyProxy(2, parent)
+{
+
+}
+
+Qt::ItemFlags ParameterTuningModel::flags(const QModelIndex &proxyIndex) const
+{
+    Qt::ItemFlags result = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
+
+    QModelIndex sourceIndex = toSourceIndex(proxyIndex);
+    if(sourceIndex.isValid()) {
+        if (sourceIndex.column() == SessionModel::ITEM_VALUE) result |= Qt::ItemIsEditable;
+
+        const QString modelType = sourceIndex.data(SessionModel::ModelTypeRole).toString();
+        if(modelType == Constants::ParameterType) {
+            if(ParameterItem *parameterItem = getParameterItem(proxyIndex)) {
+                if(parameterItem->isFittable())
+                    result |= Qt::ItemIsDragEnabled;
+            }
+        }
+    }
+
+    return result;
+}
+
+QMimeData *ParameterTuningModel::mimeData(const QModelIndexList &proxyIndexes) const
+{
+    qDebug() << "ParameterTuningModel::mimeData" << proxyIndexes;
+    QMimeData *mimeData = new QMimeData();
+
+    foreach(QModelIndex proxyIndex, proxyIndexes) {
+        if(ParameterItem *parameterItem = getParameterItem(proxyIndex)) {
+            QString path = FitParameterHelper::getParameterItemPath(parameterItem);
+            mimeData->setData(SessionXML::LinkMimeType, path.toLatin1());
+            qDebug() << "       FilterPropertyProxy::mimeData" << path;
+            break;
+        }
+    }
+    return mimeData;
+}
+
+//! Returns ParameterItem from given proxy index
+
+ParameterItem *ParameterTuningModel::getParameterItem(const QModelIndex &proxyIndex) const
+{
+    SessionModel *sessionModel = dynamic_cast<SessionModel *>(sourceModel());
+    Q_ASSERT(sessionModel);
+
+    QModelIndex sourceIndex = toSourceIndex(proxyIndex);
+    if(sourceIndex.column() == 0) {
+        return dynamic_cast<ParameterItem *>(sessionModel->itemForIndex(sourceIndex));
+    }
+    return nullptr;
+}
diff --git a/GUI/coregui/Models/ParameterTuningModel.h b/GUI/coregui/Models/ParameterTuningModel.h
new file mode 100644
index 0000000..eeeb342
--- /dev/null
+++ b/GUI/coregui/Models/ParameterTuningModel.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParameterTuningModel.h
+//! @brief     Defines class ParameterTuningModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERTUNINGMODEL_H
+#define PARAMETERTUNINGMODEL_H
+
+#include "FilterPropertyProxy.h"
+
+class ParameterItem;
+
+//!
+//! \brief The ParameterTuningModel class represents parameters which can be tuned in real time
+//! in ParameterTuningWidget. In the fitting activity context handles dragging of ParameterItem's
+//! to the FitParametersWidget.
+//!
+
+class BA_CORE_API_ ParameterTuningModel : public FilterPropertyProxy
+{
+    Q_OBJECT
+
+public:
+    ParameterTuningModel(QObject *parent = 0);
+
+    Qt::ItemFlags flags(const QModelIndex &proxyIndex) const;
+    QMimeData *mimeData(const QModelIndexList &proxyIndexes) const;
+    Qt::DropActions supportedDragActions() const;
+    Qt::DropActions supportedDropActions() const;
+
+    ParameterItem *getParameterItem(const QModelIndex &proxyIndex) const;
+
+};
+
+inline Qt::DropActions ParameterTuningModel::supportedDragActions() const
+{
+    return Qt::CopyAction;
+}
+
+inline Qt::DropActions ParameterTuningModel::supportedDropActions() const
+{
+    return Qt::IgnoreAction;
+}
+
+#endif // PARAMETERTUNINGMODEL_H
diff --git a/GUI/coregui/Models/ParticleCompositionItem.cpp b/GUI/coregui/Models/ParticleCompositionItem.cpp
new file mode 100644
index 0000000..0862541
--- /dev/null
+++ b/GUI/coregui/Models/ParticleCompositionItem.cpp
@@ -0,0 +1,90 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleCompositionItem.cpp
+//! @brief     Implements class ParticleCompositionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleCompositionItem.h"
+#include "GUIHelpers.h"
+#include "ModelPath.h"
+#include "ParticleCoreShellItem.h"
+#include "ParticleItem.h"
+#include "TransformToDomain.h"
+
+const QString ParticleCompositionItem::T_PARTICLES = "Particle Tag";
+
+ParticleCompositionItem::ParticleCompositionItem()
+    : SessionGraphicsItem(Constants::ParticleCompositionType)
+{
+    addProperty(ParticleItem::P_ABUNDANCE, 1.0);
+    getItem(ParticleItem::P_ABUNDANCE)->setLimits(RealLimits::limited(0.0, 1.0));
+    getItem(ParticleItem::P_ABUNDANCE)->setDecimals(3);
+    addGroupProperty(ParticleItem::P_POSITION, Constants::VectorType);
+    PositionTranslator position_translator;
+    ModelPath::addParameterTranslator(position_translator);
+
+    registerTag(T_PARTICLES, 0, -1, QStringList() << Constants::ParticleType <<
+                Constants::ParticleCoreShellType << Constants::ParticleCompositionType);
+    setDefaultTag(T_PARTICLES);
+    registerTag(ParticleItem::T_TRANSFORMATION, 0, 1, QStringList() << Constants::TransformationType);
+    RotationTranslator rotation_translator;
+    ModelPath::addParameterTranslator(rotation_translator);
+
+    mapper()->setOnParentChange(
+                [this](SessionItem *parent) {
+        if (parent && (parent->modelType() == Constants::ParticleCompositionType
+            || parent->modelType() == Constants::ParticleDistributionType)) {
+            setItemValue(ParticleItem::P_ABUNDANCE, 1.0);
+            getItem(ParticleItem::P_ABUNDANCE)->setEnabled(false);
+        } else {
+            getItem(ParticleItem::P_ABUNDANCE)->setEnabled(true);
+        }
+    });
+}
+
+std::unique_ptr<ParticleComposition> ParticleCompositionItem::createParticleComposition() const
+{
+    double abundance = getItemValue(ParticleItem::P_ABUNDANCE).toDouble();
+    auto P_composition = GUIHelpers::make_unique<ParticleComposition>();
+    P_composition->setAbundance(abundance);
+    QVector<SessionItem *> children = childItems();
+    for (int i = 0; i < children.size(); ++i) {
+        if (children[i]->modelType() == Constants::ParticleType) {
+            auto *particle_item = static_cast<ParticleItem*>(children[i]);
+            auto P_particle = particle_item->createParticle();
+            if (P_particle) {
+                P_composition->addParticle(*P_particle);
+            }
+        } else if (children[i]->modelType() == Constants::ParticleCoreShellType) {
+            auto *particle_coreshell_item = static_cast<ParticleCoreShellItem*>(children[i]);
+            auto P_particle_coreshell = particle_coreshell_item->createParticleCoreShell();
+            if (P_particle_coreshell) {
+                P_composition->addParticle(*P_particle_coreshell);
+            }
+        } else if (children[i]->modelType() == Constants::ParticleCompositionType) {
+            auto *particlecomposition_item = static_cast<ParticleCompositionItem*>(children[i]);
+            auto P_child_composition = particlecomposition_item->createParticleComposition();
+            if (P_child_composition) {
+                P_composition->addParticle(*P_child_composition);
+            }
+        } else if (children[i]->modelType() == Constants::TransformationType) {
+            continue;
+        } else {
+//            throw GUIHelpers::Error("ParticleCompositionItem::createParticleComposition()"
+//                                    " -> Error! Not implemented");
+        }
+    }
+    TransformToDomain::setTransformationInfo(P_composition.get(), *this);
+
+    return P_composition;
+}
diff --git a/GUI/coregui/Models/ParticleCompositionItem.h b/GUI/coregui/Models/ParticleCompositionItem.h
new file mode 100644
index 0000000..bef6c36
--- /dev/null
+++ b/GUI/coregui/Models/ParticleCompositionItem.h
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleCompositionItem.h
+//! @brief     Defines class ParticleCompositionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLECOMPOSITIONITEM_H
+#define PARTICLECOMPOSITIONITEM_H
+
+#include "SessionGraphicsItem.h"
+#include "ParticleComposition.h"
+
+
+class BA_CORE_API_ ParticleCompositionItem : public SessionGraphicsItem
+{
+
+public:
+    const static QString T_PARTICLES;
+    explicit ParticleCompositionItem();
+    virtual ~ParticleCompositionItem() {}
+    std::unique_ptr<ParticleComposition> createParticleComposition() const;
+};
+
+#endif // PARTICLECOMPOSITIONITEM_H
diff --git a/GUI/coregui/Models/ParticleCoreShellItem.cpp b/GUI/coregui/Models/ParticleCoreShellItem.cpp
new file mode 100644
index 0000000..dcd1ce8
--- /dev/null
+++ b/GUI/coregui/Models/ParticleCoreShellItem.cpp
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleCoreShellItem.cpp
+//! @brief     Implements class ParticleCoreShellItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleCoreShellItem.h"
+#include "GUIHelpers.h"
+#include "ModelPath.h"
+#include "ParticleItem.h"
+#include "TransformToDomain.h"
+
+const QString ParticleCoreShellItem::T_CORE = "Core Tag";
+const QString ParticleCoreShellItem::T_SHELL = "Shell Tag";
+
+ParticleCoreShellItem::ParticleCoreShellItem()
+    : SessionGraphicsItem(Constants::ParticleCoreShellType)
+{
+    addProperty(ParticleItem::P_ABUNDANCE, 1.0);
+    getItem(ParticleItem::P_ABUNDANCE)->setLimits(RealLimits::limited(0.0, 1.0));
+    getItem(ParticleItem::P_ABUNDANCE)->setDecimals(3);
+    addGroupProperty(ParticleItem::P_POSITION, Constants::VectorType);
+    PositionTranslator position_translator;
+    ModelPath::addParameterTranslator(position_translator);
+
+    registerTag(T_CORE, 0, 1, QStringList() << Constants::ParticleType);
+    registerTag(T_SHELL, 0, 1, QStringList() << Constants::ParticleType);
+    registerTag(ParticleItem::T_TRANSFORMATION, 0, 1, QStringList() << Constants::TransformationType);
+    RotationTranslator rotation_translator;
+    ModelPath::addParameterTranslator(rotation_translator);
+    mapper()->setOnParentChange(
+                [this](SessionItem*)
+    {
+        if (parent()) {
+            if (parent()->modelType() == Constants::ParticleCompositionType
+                || parent()->modelType() == Constants::ParticleDistributionType) {
+                setItemValue(ParticleItem::P_ABUNDANCE, 1.0);
+                getItem(ParticleItem::P_ABUNDANCE)->setEnabled(false);
+            }
+        }
+    });
+}
+
+std::unique_ptr<ParticleCoreShell> ParticleCoreShellItem::createParticleCoreShell() const
+{
+    double abundance = getItemValue(ParticleItem::P_ABUNDANCE).toDouble();
+    auto children = childItems();
+    std::unique_ptr<Particle> P_core {};
+    std::unique_ptr<Particle> P_shell {};
+    auto core_item = dynamic_cast<ParticleItem*>(getItem(T_CORE));
+    if (core_item)
+        P_core = core_item->createParticle();
+    auto shell_item = dynamic_cast<ParticleItem*>(getItem(T_SHELL));
+    if (shell_item)
+        P_shell = shell_item->createParticle();
+    if (!P_core || !P_shell)
+        throw GUIHelpers::Error("ParticleCoreShellItem::createParticleCoreShell -> Error. Either "
+                                "core or shell particle is undefined.");
+    auto P_coreshell = GUIHelpers::make_unique<ParticleCoreShell>(*P_shell, *P_core);
+    P_coreshell->setAbundance(abundance);
+    TransformToDomain::setTransformationInfo(P_coreshell.get(), *this);
+    return P_coreshell;
+}
diff --git a/GUI/coregui/Models/ParticleCoreShellItem.h b/GUI/coregui/Models/ParticleCoreShellItem.h
new file mode 100644
index 0000000..c833a9d
--- /dev/null
+++ b/GUI/coregui/Models/ParticleCoreShellItem.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleCoreShellItem.h
+//! @brief     Defines class ParticleCoreShellItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLECORESHELLITEM_H
+#define PARTICLECORESHELLITEM_H
+
+#include "SessionGraphicsItem.h"
+#include "ParticleCoreShell.h"
+
+
+class BA_CORE_API_ ParticleCoreShellItem : public SessionGraphicsItem
+{
+
+public:
+    const static QString T_CORE;
+    const static QString T_SHELL;
+    enum ECoreShell { CORE, SHELL};
+    explicit ParticleCoreShellItem();
+    virtual ~ParticleCoreShellItem() {}
+    std::unique_ptr<ParticleCoreShell> createParticleCoreShell() const;
+
+};
+
+#endif // PARTICLECORESHELLITEM_H
diff --git a/GUI/coregui/Models/ParticleDistributionItem.cpp b/GUI/coregui/Models/ParticleDistributionItem.cpp
new file mode 100644
index 0000000..2cfc0b0
--- /dev/null
+++ b/GUI/coregui/Models/ParticleDistributionItem.cpp
@@ -0,0 +1,151 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleDistributionItem.cpp
+//! @brief     Implements class ParticleDistributionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleDistributionItem.h"
+#include "ComboProperty.h"
+#include "DistributionItem.h"
+#include "Distributions.h"
+#include "GUIHelpers.h"
+#include "ModelPath.h"
+#include "ParameterPool.h"
+#include "ParticleItem.h"
+#include "TransformFromDomain.h"
+#include "TransformToDomain.h"
+#include <QDebug>
+
+const QString ParticleDistributionItem::P_DISTRIBUTED_PARAMETER = "Distributed parameter";
+const QString ParticleDistributionItem::P_DISTRIBUTION = "Distribution";
+const QString ParticleDistributionItem::NO_SELECTION = "None";
+const QString ParticleDistributionItem::T_PARTICLES = "Particle Tag";
+
+ParticleDistributionItem::ParticleDistributionItem()
+    : SessionGraphicsItem(Constants::ParticleDistributionType)
+{
+    addProperty(ParticleItem::P_ABUNDANCE, 1.0);
+    getItem(ParticleItem::P_ABUNDANCE)->setLimits(RealLimits::limited(0.0, 1.0));
+    getItem(ParticleItem::P_ABUNDANCE)->setDecimals(3);
+
+    addGroupProperty(P_DISTRIBUTION, Constants::DistributionGroup);
+
+    registerTag(T_PARTICLES, 0, 1, QStringList() << Constants::ParticleType <<
+                Constants::ParticleCoreShellType << Constants::ParticleCompositionType);
+    setDefaultTag(T_PARTICLES);
+
+    ComboProperty par_prop;
+    addProperty(P_DISTRIBUTED_PARAMETER, par_prop.getVariant());
+    updateParameterList();
+    mapper()->setOnAnyChildChange(
+        [this] (SessionItem* item) {
+            // prevent infinit loop when item changes its own properties
+            if (item && item->modelType()== Constants::PropertyType && item->parent() == this)
+                return;
+            updateParameterList();
+        } );
+}
+
+ParticleDistributionItem::~ParticleDistributionItem()
+{
+}
+
+std::unique_ptr<ParticleDistribution> ParticleDistributionItem::createParticleDistribution() const
+{
+    auto children = childItems();
+    if (children.size() == 0)
+        return nullptr;
+    std::unique_ptr<IParticle> P_particle = TransformToDomain::createIParticle(*getItem());
+    if (!P_particle)
+        throw GUIHelpers::Error("DomainObjectBuilder::buildParticleDistribution()"
+                                " -> Error! No correct particle defined");
+    auto distr_item = getGroupItem(ParticleDistributionItem::P_DISTRIBUTION);
+    Q_ASSERT(distr_item);
+
+    auto P_distribution = TransformToDomain::createDistribution(*distr_item);
+
+    auto prop = getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
+                    .value<ComboProperty>();
+    QString par_name = prop.getValue();
+    std::string domain_par = ModelPath::translateParameterName(this, par_name);
+    int nbr_samples
+        = distr_item->getItemValue(DistributionItem::P_NUMBER_OF_SAMPLES).toInt();
+    double sigma_factor
+        = distr_item->getItemValue(DistributionItem::P_SIGMA_FACTOR).toDouble();
+    ParameterDistribution par_distr(domain_par, *P_distribution, nbr_samples, sigma_factor);
+    auto result = GUIHelpers::make_unique<ParticleDistribution>(*P_particle, par_distr);
+    double abundance = getItemValue(ParticleItem::P_ABUNDANCE).toDouble();
+    result->setAbundance(abundance);
+    return result;
+}
+
+void ParticleDistributionItem::updateParameterList()
+{
+    if (!isTag(P_DISTRIBUTED_PARAMETER))
+        return;
+    QVariant par_prop = getItemValue(P_DISTRIBUTED_PARAMETER);
+    auto combo_prop = par_prop.value<ComboProperty>();
+    QString cached_par = combo_prop.getCachedValue();
+    if (!combo_prop.cacheContainsGUIValue()) {
+        auto gui_name = TransformFromDomain::translateParameterNameToGUI(this, cached_par);
+        if (!gui_name.isEmpty()) {
+            cached_par = gui_name;
+            combo_prop.setCachedValue(cached_par);
+            combo_prop.setCacheContainsGUIFlag();
+        }
+    }
+    QString selected_par = combo_prop.getValue();
+    QStringList par_names = getChildParameterNames();
+    par_names.removeAll(ParticleItem::P_ABUNDANCE);
+    auto updated_prop = ComboProperty(par_names);
+    updated_prop.setCachedValue(cached_par);
+    updated_prop.setCacheContainsGUIFlag(combo_prop.cacheContainsGUIValue());
+    if (updated_prop.getValues().contains(cached_par) ) {
+        updated_prop.setValue(cached_par);
+    } else if (updated_prop.getValues().contains(selected_par)) {
+        updated_prop.setValue(selected_par);
+    } else {
+        updated_prop.setValue(NO_SELECTION);
+    }
+    setItemValue(P_DISTRIBUTED_PARAMETER, updated_prop.getVariant());
+}
+
+QStringList ParticleDistributionItem::getChildParameterNames() const
+{
+    QStringList result;
+    QVector<SessionItem*> children = getItems();
+    if (children.size() > 1) {
+        Q_ASSERT(0);
+        qDebug() << "ParticleDistributionItem::getChildParameterNames(): "
+                 << "More than one child item";
+        return result;
+    }
+    if (children.size() == 0) {
+        result << NO_SELECTION;
+        return result;
+    }
+    QString prefix = children.front()->displayName() + QString("/");
+    result = ModelPath::getParameterTreeList(children.front(), prefix);
+    result.prepend(NO_SELECTION);
+    return result;
+}
+
+QStringList ParticleDistributionItem::extractFromParameterPool(const ParameterPool *pool) const
+{
+    QStringList result;
+    std::vector<std::string> par_names = pool->getParameterNames();
+    for (size_t i = 0; i < par_names.size(); ++i) {
+        result << QString(par_names[i].c_str());
+    }
+    return result;
+}
diff --git a/GUI/coregui/Models/ParticleDistributionItem.h b/GUI/coregui/Models/ParticleDistributionItem.h
new file mode 100644
index 0000000..82c91b6
--- /dev/null
+++ b/GUI/coregui/Models/ParticleDistributionItem.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleDistributionItem.h
+//! @brief     Defines class ParticleDistributionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLEDISTRIBUTIONITEM_H
+#define PARTICLEDISTRIBUTIONITEM_H
+
+#include "SessionGraphicsItem.h"
+#include "ParticleDistribution.h"
+
+
+
+class BA_CORE_API_ ParticleDistributionItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_DISTRIBUTED_PARAMETER;
+    static const QString P_DISTRIBUTION;
+    static const QString NO_SELECTION;
+    static const QString T_PARTICLES;
+    explicit ParticleDistributionItem();
+    virtual ~ParticleDistributionItem();
+
+    std::unique_ptr<ParticleDistribution> createParticleDistribution() const;
+
+public slots:
+    void updateParameterList();
+
+private:
+    QStringList getChildParameterNames() const;
+    QStringList extractFromParameterPool(const ParameterPool *pool) const;
+};
+
+#endif // PARTICLEDISTRIBUTIONITEM_H
+
diff --git a/GUI/coregui/Models/ParticleItem.cpp b/GUI/coregui/Models/ParticleItem.cpp
new file mode 100644
index 0000000..5d1d80d
--- /dev/null
+++ b/GUI/coregui/Models/ParticleItem.cpp
@@ -0,0 +1,92 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleItem.cpp
+//! @brief     Implements class ParticleItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleItem.h"
+#include "FormFactorItems.h"
+#include "GUIHelpers.h"
+#include "MaterialUtils.h"
+#include "ModelPath.h"
+#include "ParticleCoreShellItem.h"
+#include "TransformToDomain.h"
+#include "VectorItem.h"
+
+
+const QString ParticleItem::P_FORM_FACTOR = "Form Factor";
+const QString ParticleItem::P_ABUNDANCE = "Abundance";
+const QString ParticleItem::P_MATERIAL = "Material";
+const QString ParticleItem::P_POSITION = "Position Offset";
+const QString ParticleItem::T_TRANSFORMATION = "Transformation Tag";
+
+ParticleItem::ParticleItem()
+    : SessionGraphicsItem(Constants::ParticleType)
+{
+    addGroupProperty(P_FORM_FACTOR, Constants::FormFactorGroup);
+    addProperty(P_MATERIAL,
+                     MaterialUtils::getDefaultMaterialProperty().getVariant());
+    addProperty(P_ABUNDANCE, 1.0)->setLimits(RealLimits::limited(0.0, 1.0));
+    getItem(P_ABUNDANCE)->setDecimals(3);
+    addGroupProperty(P_POSITION, Constants::VectorType);
+    PositionTranslator position_translator;
+    ModelPath::addParameterTranslator(position_translator);
+
+    registerTag(T_TRANSFORMATION, 0, 1, QStringList() << Constants::TransformationType);
+    setDefaultTag(T_TRANSFORMATION);
+    RotationTranslator rotation_translator;
+    ModelPath::addParameterTranslator(rotation_translator);
+
+    mapper()->setOnParentChange(
+                [this](SessionItem* parentItem) {
+        if (parentItem) {
+            if (parent()->modelType() == Constants::ParticleCoreShellType
+                || parent()->modelType() == Constants::ParticleCompositionType
+                || parent()->modelType() == Constants::ParticleDistributionType) {
+                setItemValue(ParticleItem::P_ABUNDANCE, 1.0);
+                getItem(ParticleItem::P_ABUNDANCE)->setEnabled(false);
+                if (parent()->modelType() == Constants::ParticleCoreShellType &&
+                    parent()->tagFromItem(this) == ParticleCoreShellItem::T_SHELL) {
+                        SessionItem *positionItem = getItem(ParticleItem::P_POSITION);
+                    positionItem->setItemValue(VectorItem::P_X, 0.0);
+                    positionItem->setItemValue(VectorItem::P_Y, 0.0);
+                    positionItem->setItemValue(VectorItem::P_Z, 0.0);
+                    positionItem->setEnabled(false);
+                } else {
+                    getItem(ParticleItem::P_POSITION)->setEnabled(true);
+                }
+                return;
+            }
+        }
+        getItem(ParticleItem::P_ABUNDANCE)->setEnabled(true);
+        getItem(ParticleItem::P_POSITION)->setEnabled(true);
+    });
+}
+
+std::unique_ptr<Particle> ParticleItem::createParticle() const
+{
+    auto P_material = TransformToDomain::createDomainMaterial(*this);
+    auto P_particle = GUIHelpers::make_unique<Particle>(*P_material);
+
+    double abundance = getItemValue(ParticleItem::P_ABUNDANCE).toDouble();
+    P_particle->setAbundance(abundance);
+
+    auto ffItem = static_cast<FormFactorItem*>(getGroupItem(ParticleItem::P_FORM_FACTOR));
+    Q_ASSERT(ffItem);
+    auto P_ff = ffItem->createFormFactor();
+    P_particle->setFormFactor(*P_ff);
+
+    TransformToDomain::setTransformationInfo(P_particle.get(), *this);
+
+    return P_particle;
+}
diff --git a/GUI/coregui/Models/ParticleItem.h b/GUI/coregui/Models/ParticleItem.h
new file mode 100644
index 0000000..66ab6c3
--- /dev/null
+++ b/GUI/coregui/Models/ParticleItem.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleItem.h
+//! @brief     Defines class ParticleItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLEITEM_H
+#define PARTICLEITEM_H
+
+#include "SessionGraphicsItem.h"
+#include "Particle.h"
+
+
+class BA_CORE_API_ ParticleItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_FORM_FACTOR;
+    static const QString P_ABUNDANCE;
+    static const QString P_MATERIAL;
+    static const QString P_POSITION;
+    static const QString T_TRANSFORMATION;
+    explicit ParticleItem();
+    virtual ~ParticleItem() {}
+    std::unique_ptr<Particle> createParticle() const;
+};
+
+#endif // PARTICLEITEM_H
diff --git a/GUI/coregui/Models/ParticleLayoutItem.cpp b/GUI/coregui/Models/ParticleLayoutItem.cpp
new file mode 100644
index 0000000..4f7207a
--- /dev/null
+++ b/GUI/coregui/Models/ParticleLayoutItem.cpp
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleLayoutItem.cpp
+//! @brief     Implements class ParticleLayoutItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleLayoutItem.h"
+#include "ComboProperty.h"
+
+const QString ParticleLayoutItem::P_APPROX = "Approximation";
+const QString ParticleLayoutItem::P_TOTAL_DENSITY = "Total particle density";
+const QString ParticleLayoutItem::T_PARTICLES = "Particle Tag";
+const QString ParticleLayoutItem::T_INTERFERENCE = "Interference Tag";
+
+ParticleLayoutItem::ParticleLayoutItem()
+    : SessionGraphicsItem(Constants::ParticleLayoutType)
+{
+    ComboProperty approx;
+    approx << "Decoupling Approximation" << "Size Space Coupling Approximation";
+    addProperty(P_APPROX, approx.getVariant());
+    addProperty(P_TOTAL_DENSITY, 1.0);
+
+    registerTag(T_PARTICLES, 0, -1, QStringList() << Constants::ParticleType << Constants::ParticleCoreShellType
+                << Constants::ParticleCompositionType << Constants::ParticleDistributionType);
+    setDefaultTag(T_PARTICLES);
+    registerTag(T_INTERFERENCE, 0, 1, QStringList() << Constants::InterferenceFunctionRadialParaCrystalType
+                << Constants::InterferenceFunction2DParaCrystalType << Constants::InterferenceFunction1DLatticeType
+                << Constants::InterferenceFunction2DLatticeType);
+
+    mapper()->setOnChildrenChange(
+                [this](SessionItem* item)
+    {
+        int count = 0;
+        for (auto child_item : childItems()) {
+            if (child_item->modelType() == Constants::InterferenceFunction2DParaCrystalType
+                || child_item->modelType() == Constants::InterferenceFunction2DLatticeType) {
+                count++;
+            }
+        }
+        if ((item && count > 0) || (!item && count > 1))
+            getItem(P_TOTAL_DENSITY)->setEnabled(false);
+        else
+            getItem(P_TOTAL_DENSITY)->setEnabled(true);
+    });
+}
+
+ParticleLayoutItem::~ParticleLayoutItem()
+{
+}
diff --git a/GUI/coregui/Models/ParticleLayoutItem.h b/GUI/coregui/Models/ParticleLayoutItem.h
new file mode 100644
index 0000000..8b2b234
--- /dev/null
+++ b/GUI/coregui/Models/ParticleLayoutItem.h
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ParticleLayoutItem.h
+//! @brief     Defines class ParticleLayoutItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLELAYOUTITEM_H
+#define PARTICLELAYOUTITEM_H
+
+#include "SessionGraphicsItem.h"
+
+class BA_CORE_API_ ParticleLayoutItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_APPROX;
+    static const QString P_TOTAL_DENSITY;
+    static const QString T_PARTICLES;
+    static const QString T_INTERFERENCE;
+    explicit ParticleLayoutItem();
+    virtual ~ParticleLayoutItem();
+};
+
+#endif // PARTICLELAYOUTITEM_H
diff --git a/GUI/coregui/Models/PropertyAttribute.cpp b/GUI/coregui/Models/PropertyAttribute.cpp
new file mode 100644
index 0000000..0f520e8
--- /dev/null
+++ b/GUI/coregui/Models/PropertyAttribute.cpp
@@ -0,0 +1,196 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/PropertyAttribute.cpp
+//! @brief     Implements class PropertyAttribute
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PropertyAttribute.h"
+#include "SessionItem.h"
+#include "tooltipdatabase.h"
+
+PropertyAttribute::PropertyAttribute(PropertyAttribute::Appearance appearance,
+                                     const RealLimits &limits, int decimals, const QString &label,
+                                     const QString &tooltip)
+    : m_appearance(appearance)
+    , m_limits(limits)
+    , m_decimals(decimals)
+    , m_label(label)
+    , m_tooltip(tooltip)
+{
+
+}
+
+PropertyAttribute::PropertyAttribute(const RealLimits &limits, int decimals)
+    : m_appearance(VISIBLE)
+    , m_limits(limits)
+    , m_decimals(decimals)
+{
+
+}
+
+PropertyAttribute PropertyAttribute::labeled(const QString &label)
+{
+    return PropertyAttribute(VISIBLE, RealLimits::lowerLimited(0.0), 2, label);
+}
+
+PropertyAttribute::Appearance PropertyAttribute::getAppearance() const
+{
+    return m_appearance;
+}
+
+void PropertyAttribute::setAppearance(PropertyAttribute::Appearance appearance)
+{
+    m_appearance = appearance;
+}
+
+RealLimits PropertyAttribute::getLimits() const
+{
+    return m_limits;
+}
+
+PropertyAttribute& PropertyAttribute::setLimits(const RealLimits &limits)
+{
+    m_limits = limits;
+    return *this;
+}
+
+PropertyAttribute &PropertyAttribute::lowerLimited(double value)
+{
+    m_limits = RealLimits::lowerLimited(value);
+    return *this;
+}
+
+PropertyAttribute &PropertyAttribute::upperLimited(double value)
+{
+    m_limits = RealLimits::upperLimited(value);
+    return *this;
+}
+
+PropertyAttribute &PropertyAttribute::limited(double left_bound_value, double right_bound_value)
+{
+    m_limits = RealLimits::limited(left_bound_value, right_bound_value);
+    return *this;
+}
+
+PropertyAttribute &PropertyAttribute::limitless()
+{
+    m_limits = RealLimits::limitless();
+    return *this;
+}
+
+int PropertyAttribute::getDecimals() const
+{
+    return m_decimals;
+}
+
+PropertyAttribute &PropertyAttribute::setDecimals(int decimals)
+{
+    m_decimals = decimals;
+    return *this;
+}
+
+QString PropertyAttribute::getLabel() const
+{
+    return m_label;
+}
+
+PropertyAttribute &PropertyAttribute::setLabel(const QString &label)
+{
+    m_label = label;
+    return *this;
+}
+
+QString PropertyAttribute::getToolTip() const
+{
+    return m_tooltip;
+}
+
+PropertyAttribute &PropertyAttribute::setToolTip(const QString &tooltip)
+{
+    m_tooltip = tooltip;
+    return *this;
+}
+
+bool PropertyAttribute::isVisible() const
+{
+    return !isHidden();
+}
+
+PropertyAttribute &PropertyAttribute::setVisible()
+{
+    m_appearance &= ~PropertyAttribute::HIDDEN;
+    return *this;
+}
+
+bool PropertyAttribute::isHidden() const
+{
+    return m_appearance.testFlag(PropertyAttribute::HIDDEN);
+}
+
+PropertyAttribute& PropertyAttribute::setHidden()
+{
+    m_appearance |= PropertyAttribute::HIDDEN;
+    return *this;
+}
+
+bool PropertyAttribute::isDisabled() const
+{
+    return m_appearance.testFlag(PropertyAttribute::DISABLED);
+}
+
+PropertyAttribute& PropertyAttribute::setDisabled()
+{
+    m_appearance |= PropertyAttribute::DISABLED;
+    return *this;
+}
+
+PropertyAttribute &PropertyAttribute::setEnabled()
+{
+    m_appearance &= ~PropertyAttribute::DISABLED;
+    return *this;
+}
+
+bool PropertyAttribute::isReadOnly() const
+{
+    return m_appearance.testFlag(PropertyAttribute::READONLY);
+}
+
+PropertyAttribute& PropertyAttribute::setReadOnly()
+{
+    m_appearance |= PropertyAttribute::READONLY;
+    return *this;
+}
+
+PropertyAttribute PropertyAttribute::fromItem(SessionItem *item)
+{
+    PropertyAttribute attribute = PropertyAttribute(PropertyAttribute::VISIBLE, item->limits(),
+                                                    item->decimals(), item->displayName(), item->toolTip());
+    if (!item->isVisible())
+        attribute.setHidden();
+    if (!item->isEditable())
+        attribute.setReadOnly();
+    if (!item->isEnabled())
+        attribute.setDisabled();
+
+    if(attribute.getToolTip().isEmpty()) {
+        if(SessionItem *parent = item->parent()) {
+            attribute.setToolTip(ToolTipDataBase::getSampleViewToolTip(
+                                     parent->modelType(), item->displayName()));
+        }
+    }
+
+    return attribute;
+}
+
+
+
diff --git a/GUI/coregui/Models/PropertyAttribute.h b/GUI/coregui/Models/PropertyAttribute.h
new file mode 100644
index 0000000..d0cf5ad
--- /dev/null
+++ b/GUI/coregui/Models/PropertyAttribute.h
@@ -0,0 +1,95 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/PropertyAttribute.h
+//! @brief     Defines class PropertyAttribute
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROPERTYATTRIBUTE_H
+#define PROPERTYATTRIBUTE_H
+
+
+#include "RealLimits.h"
+#include <QMetaType>
+#include <QString>
+
+class SessionItem;
+
+
+//! Class to handle visual appearance of SessionItem's property in
+//! different kind of property editors.
+class BA_CORE_API_ PropertyAttribute {
+public:
+    enum EAppearance {
+        VISIBLE = 0x000,
+        HIDDEN = 0x001,
+        DISABLED = 0x002,
+        READONLY = 0x0004
+    };
+    Q_DECLARE_FLAGS(Appearance, EAppearance)
+
+    PropertyAttribute(Appearance appearance = VISIBLE,
+                      const RealLimits &limits = RealLimits::lowerLimited(0.0),
+                      int decimals = 2, const QString &label = QString(),
+                      const QString &tooltip = QString());
+
+    PropertyAttribute(const RealLimits &limits, int decimals=2);
+
+    static PropertyAttribute labeled(const QString &label);
+
+    Appearance getAppearance() const;
+    void setAppearance(PropertyAttribute::Appearance appearance);
+
+    RealLimits getLimits() const;
+    PropertyAttribute& setLimits(const RealLimits &limits);
+    PropertyAttribute& lowerLimited(double value);
+    PropertyAttribute& upperLimited(double value);
+    PropertyAttribute& limited(double left_bound_value, double right_bound_value);
+    PropertyAttribute& limitless();
+
+    int getDecimals() const;
+    PropertyAttribute& setDecimals(int decimals);
+
+    QString getLabel() const;
+    PropertyAttribute& setLabel(const QString &label);
+
+    QString getToolTip() const;
+    PropertyAttribute& setToolTip(const QString &tooltip);
+
+    bool isVisible() const;
+    PropertyAttribute& setVisible();
+
+    bool isHidden() const;
+    PropertyAttribute& setHidden();
+
+    bool isDisabled() const;
+    PropertyAttribute& setDisabled();
+    PropertyAttribute& setEnabled();
+
+    bool isReadOnly() const;
+    PropertyAttribute& setReadOnly();
+
+    static PropertyAttribute fromItem(SessionItem* item);
+
+private:
+    Appearance m_appearance;
+    RealLimits m_limits;
+    int m_decimals; // number of digits
+    QString m_label;
+    QString m_tooltip;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(PropertyAttribute::Appearance)
+Q_DECLARE_METATYPE(PropertyAttribute)
+
+#endif // PROPERTYATTRIBUTE_H
+
diff --git a/GUI/coregui/Models/PropertyItem.cpp b/GUI/coregui/Models/PropertyItem.cpp
new file mode 100644
index 0000000..8c9f801
--- /dev/null
+++ b/GUI/coregui/Models/PropertyItem.cpp
@@ -0,0 +1,23 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/PropertyItem.cpp
+//! @brief     Implements class PropertyItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PropertyItem.h"
+
+PropertyItem::PropertyItem()
+    : SessionItem(Constants::PropertyType)
+{
+
+}
diff --git a/GUI/coregui/Models/PropertyItem.h b/GUI/coregui/Models/PropertyItem.h
new file mode 100644
index 0000000..2978f4f
--- /dev/null
+++ b/GUI/coregui/Models/PropertyItem.h
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/PropertyItem.h
+//! @brief     Defines class PropertyItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROPERTYITEM_H
+#define PROPERTYITEM_H
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ PropertyItem : public SessionItem
+{
+
+public:
+    PropertyItem();
+};
+
+#endif // PROPERTYITEM_H
+
diff --git a/GUI/coregui/Models/RealDataItem.cpp b/GUI/coregui/Models/RealDataItem.cpp
new file mode 100644
index 0000000..2ecc3e6
--- /dev/null
+++ b/GUI/coregui/Models/RealDataItem.cpp
@@ -0,0 +1,150 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RealDataItem.cpp
+//! @brief     Implements class RealDataItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RealDataItem.h"
+#include "GUIHelpers.h"
+#include "IntensityDataItem.h"
+#include "ComboProperty.h"
+#include "SessionModel.h"
+#include "ComboProperty.h"
+#include "JobItemHelper.h"
+#include "ImportDataAssistant.h"
+#include "MaskUnitsConverter.h"
+#include "JobItemFunctions.h"
+#include <QDebug>
+
+const QString RealDataItem::P_INSTRUMENT_ID = "Instrument Id";
+const QString RealDataItem::P_INSTRUMENT_NAME = "Instrument";
+const QString RealDataItem::T_INTENSITY_DATA = "Intensity data";
+
+RealDataItem::RealDataItem()
+    : SessionItem(Constants::RealDataType)
+    , m_linkedInstrument(0)
+{
+    setItemName(QStringLiteral("undefined"));
+
+    addProperty(P_INSTRUMENT_ID, QString());
+    addProperty(P_INSTRUMENT_NAME, QString());
+
+    registerTag(T_INTENSITY_DATA, 1, 1, QStringList() << Constants::IntensityDataType);
+    setDefaultTag(T_INTENSITY_DATA);
+    insertItem(0, new IntensityDataItem(), T_INTENSITY_DATA);
+
+    mapper()->setOnPropertyChange(
+        [this](const QString &name){
+        if(name == P_NAME && isTag(T_INTENSITY_DATA)) {
+            updateIntensityDataFileName();
+        }
+
+    }
+    );
+
+    mapper()->setOnChildrenChange(
+        [this](SessionItem *item){
+        if(item && item->modelType() == Constants::IntensityDataType)
+            updateIntensityDataFileName();
+        }
+    );
+
+    mapper()->setOnChildPropertyChange(
+                [this](SessionItem* item, const QString &name)
+    {
+        if (item && item->modelType() == Constants::IntensityDataType
+            && name == IntensityDataItem::P_AXES_UNITS) {
+            if(!m_linkedInstrument)
+                return;
+            mapper()->setActive(false);
+
+            MaskUnitsConverter converter;
+            converter.convertToNbins(intensityDataItem());
+
+            JobItemHelper::updateDataAxes(intensityDataItem(), m_linkedInstrument);
+
+            converter.convertFromNbins(intensityDataItem());
+
+            mapper()->setActive(true);
+        }
+    });
+
+}
+
+IntensityDataItem *RealDataItem::intensityDataItem()
+{
+    return const_cast<IntensityDataItem *>(
+                static_cast<const RealDataItem*>(this)->intensityDataItem());
+}
+
+const IntensityDataItem *RealDataItem::intensityDataItem() const
+{
+    const IntensityDataItem *result = dynamic_cast<const IntensityDataItem *>(
+                getItem(T_INTENSITY_DATA));
+    return result;
+}
+
+//! Sets OutputData to underlying item. Creates it, if not exists.
+
+void RealDataItem::setOutputData(OutputData<double> *data)
+{
+    IntensityDataItem *item = intensityDataItem();
+    Q_ASSERT(item);
+    item->setOutputData(data);
+}
+
+void RealDataItem::linkToInstrument(const InstrumentItem *instrument)
+{
+    m_linkedInstrument = instrument;
+    updateToInstrument();
+}
+
+//! Updates the name of file to store intensity data.
+
+void RealDataItem::updateIntensityDataFileName()
+{
+    if(IntensityDataItem *item = intensityDataItem())
+        item->setItemValue(IntensityDataItem::P_FILE_NAME,
+                           JobItemFunctions::realDataFileName(*this));
+}
+
+void RealDataItem::updateToInstrument()
+{
+    if(!intensityDataItem())
+        return;
+
+    if(!intensityDataItem()->getOutputData())
+        return;
+
+    IntensityDataItem *item = intensityDataItem();
+    Q_ASSERT(item);
+
+    if(m_linkedInstrument == 0) {
+        ComboProperty combo;
+        combo << Constants::UnitsNbins;
+        item->setItemValue(IntensityDataItem::P_AXES_UNITS, combo.getVariant());
+        item->getItem(IntensityDataItem::P_AXES_UNITS)->setVisible(true);
+        item->setXaxisTitle("X [nbins]");
+        item->setYaxisTitle("Y [nbins]");
+        MaskUnitsConverter converter;
+        converter.convertToNbins(intensityDataItem());
+        item->setOutputData(ImportDataAssistant::createSimlifiedOutputData(*item->getOutputData()));
+        item->setAxesRangeToData();
+        converter.convertFromNbins(intensityDataItem());
+    }
+
+    else {
+        JobItemHelper::adjustAxesUnitsToInstrument(item, m_linkedInstrument);
+    }
+
+}
diff --git a/GUI/coregui/Models/RealDataItem.h b/GUI/coregui/Models/RealDataItem.h
new file mode 100644
index 0000000..aac7755
--- /dev/null
+++ b/GUI/coregui/Models/RealDataItem.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RealDataItem.h
+//! @brief     Defines class RealDataItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALDATAITEM_H
+#define REALDATAITEM_H
+
+#include "SessionItem.h"
+
+template <class T> class OutputData;
+class IntensityDataItem;
+class InstrumentItem;
+
+//! The RealDataItem class represents intensity data imported from file and intended for fitting.
+
+class BA_CORE_API_ RealDataItem : public SessionItem
+{
+public:
+    static const QString P_INSTRUMENT_ID;
+    static const QString P_INSTRUMENT_NAME;
+    static const QString T_INTENSITY_DATA;
+    RealDataItem();
+
+    IntensityDataItem *intensityDataItem();
+    const IntensityDataItem *intensityDataItem() const;
+
+    void setOutputData(OutputData<double> *data);
+
+    void linkToInstrument(const InstrumentItem *instrument);
+
+private:
+    void updateIntensityDataFileName();
+    void updateToInstrument();
+    const InstrumentItem *m_linkedInstrument;
+};
+
+#endif // REALDATAITEM_H
+
+
diff --git a/GUI/coregui/Models/RealDataModel.cpp b/GUI/coregui/Models/RealDataModel.cpp
new file mode 100644
index 0000000..cc53b35
--- /dev/null
+++ b/GUI/coregui/Models/RealDataModel.cpp
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RealDataModel.cpp
+//! @brief     Implements class RealDataModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RealDataModel.h"
+#include "ImportDataAssistant.h"
+#include "RealDataItem.h"
+
+RealDataModel::RealDataModel(QObject *parent)
+    : SessionModel(SessionXML::RealDataModelTag, parent)
+{
+    setObjectName(SessionXML::RealDataModelTag);
+}
+
+//Qt::ItemFlags RealDataModel::flags(const QModelIndex &index) const
+//{
+//    Qt::ItemFlags result_flags =  SessionModel::flags(index);
+//    result_flags |= Qt::ItemIsEditable;
+//    return result_flags;
+//}
+
+
+//! Loads OutputData from the projectDir to JobItem
+
+void RealDataModel::loadNonXMLData(const QString &projectDir)
+{
+    for (int i = 0; i < rowCount(QModelIndex()); ++i) {
+        RealDataItem *realDataItem
+            = dynamic_cast<RealDataItem *>(itemForIndex(index(i, 0, QModelIndex())));
+        ImportDataAssistant::loadIntensityData(realDataItem, projectDir);
+    }
+    emit modelLoaded();
+}
+
+//! Saves JobItem's OutputData to the projectDir
+
+void RealDataModel::saveNonXMLData(const QString &projectDir)
+{
+    for (int i = 0; i < rowCount(QModelIndex()); ++i) {
+        RealDataItem *realDataItem
+            = dynamic_cast<RealDataItem *>(itemForIndex(index(i, 0, QModelIndex())));
+        ImportDataAssistant::saveIntensityData(realDataItem, projectDir);
+    }
+}
diff --git a/GUI/coregui/Models/RealDataModel.h b/GUI/coregui/Models/RealDataModel.h
new file mode 100644
index 0000000..bbb25ee
--- /dev/null
+++ b/GUI/coregui/Models/RealDataModel.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RealDataModel.h
+//! @brief     Defines class RealDataModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALDATAMODEL_H
+#define REALDATAMODEL_H
+
+#include "SessionModel.h"
+
+//! The RealDataModel class is a model to store all imported RealDataItem's.
+
+class BA_CORE_API_ RealDataModel : public SessionModel
+{
+    Q_OBJECT
+
+public:
+    explicit RealDataModel(QObject *parent = 0);
+//    Qt::ItemFlags flags(const QModelIndex &index) const;
+
+    void loadNonXMLData(const QString &projectDir);
+    void saveNonXMLData(const QString &projectDir);
+
+signals:
+    void modelLoaded();
+
+};
+
+#endif // REALDATAMODEL_H
diff --git a/GUI/coregui/Models/RectangularDetectorItem.cpp b/GUI/coregui/Models/RectangularDetectorItem.cpp
new file mode 100644
index 0000000..fa1c684
--- /dev/null
+++ b/GUI/coregui/Models/RectangularDetectorItem.cpp
@@ -0,0 +1,264 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RectangularDetectorItem.cpp
+//! @brief     Implements class RectangularDetectorItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RectangularDetectorItem.h"
+#include "AxesItems.h"
+#include "ComboProperty.h"
+#include "GUIHelpers.h"
+#include "RectangularDetector.h"
+#include "ResolutionFunctionItems.h"
+#include "VectorItem.h"
+#include <QDebug>
+
+namespace {
+const double default_detector_width = 20.0;
+const double default_detector_height = 20.0;
+const double default_detector_distance = 1000.0;
+const QString tooltip_u0="u-coordinate of point of intersection of normal vector "
+                         "and detector plane, \n in local detector coordinates";
+const QString tooltip_v0="v-coordinate of point of intersection of normal vector "
+                         "and detector plane, \n in local detector coordinates";
+
+const QString tooltip_dbeam_u0="u-coordinate of point where direct beam hits the detector, \n"
+                               "in local detector coordinates [mm]";
+const QString tooltip_dbeam_v0="v-coordinate of point where direct beam hits the detector, \n"
+                               "in local detector coordinates [mm]";
+
+const QString tooltip_refbeam_u0="u-coordinate of point where reflected beam hits the detector, \n"
+                               "in local detector coordinates [mm]";
+const QString tooltip_refbeam_v0="v-coordinate of point where reflected beam hits the detector, \n"
+                               "in local detector coordinates [mm]";
+
+
+const QString tooltip_samplex_u0="u-coordinate of point where sample x-axis crosses the detector, \n"
+                               "in local detector coordinates [mm]";
+const QString tooltip_samplex_v0="v-coordinate of point where sample x-axis crosses the detector, \n"
+                               "in local detector coordinates [mm]";
+}
+
+const QString RectangularDetectorItem::P_X_AXIS = "X axis";
+const QString RectangularDetectorItem::P_Y_AXIS = "Y axis";
+const QString RectangularDetectorItem::P_RESOLUTION_FUNCTION = "Type";
+const QString RectangularDetectorItem::P_ALIGNMENT = "Alignment";
+const QString RectangularDetectorItem::P_NORMAL = "Normal vector";
+const QString RectangularDetectorItem::P_DIRECTION = "Direction vector";
+const QString RectangularDetectorItem::P_U0 = "u0";
+const QString RectangularDetectorItem::P_V0 = "v0";
+const QString RectangularDetectorItem::P_DBEAM_U0 = "u0 (dbeam)";
+const QString RectangularDetectorItem::P_DBEAM_V0 = "v0 (dbeam)";
+const QString RectangularDetectorItem::P_DISTANCE = "Distance";
+
+RectangularDetectorItem::RectangularDetectorItem()
+    : SessionItem(Constants::RectangularDetectorType)
+    , m_is_constructed(false)
+{
+    // axes parameters
+    SessionItem *item = addGroupProperty(P_X_AXIS, Constants::BasicAxisType);
+    item->getItem(BasicAxisItem::P_TITLE)->setVisible(false);
+    item->getItem(BasicAxisItem::P_MIN)->setVisible(false);
+    item->setItemValue(BasicAxisItem::P_MAX, default_detector_width);
+    item->getItem(BasicAxisItem::P_MAX)->setDisplayName(QStringLiteral("Width"));
+    item->getItem(BasicAxisItem::P_MAX)->setToolTip(QStringLiteral("Width of the detector in mm"));
+
+    item = addGroupProperty(P_Y_AXIS, Constants::BasicAxisType);
+    item->getItem(BasicAxisItem::P_TITLE)->setVisible(false);
+    item->getItem(BasicAxisItem::P_MIN)->setVisible(false);
+    item->setItemValue(BasicAxisItem::P_MAX, default_detector_height);
+    item->getItem(BasicAxisItem::P_MAX)->setDisplayName(QStringLiteral("Height"));
+    item->getItem(BasicAxisItem::P_MAX)->setToolTip(QStringLiteral("Height of the detector in mm"));
+
+    // resolution function
+    addGroupProperty(P_RESOLUTION_FUNCTION, Constants::ResolutionFunctionGroup);
+    setGroupProperty(P_RESOLUTION_FUNCTION, Constants::ResolutionFunctionNoneType);
+
+    // alignment selector
+    ComboProperty alignment;
+    alignment << Constants::ALIGNMENT_GENERIC << Constants::ALIGNMENT_TO_DIRECT_BEAM
+              << Constants::ALIGNMENT_TO_SAMPLE << Constants::ALIGNMENT_TO_REFLECTED_BEAM
+              << Constants::ALIGNMENT_TO_REFLECTED_BEAM_DPOS;
+    alignment.setValue(Constants::ALIGNMENT_TO_DIRECT_BEAM);
+    addProperty(P_ALIGNMENT, alignment.getVariant());
+
+    // alignment parameters
+    item = addGroupProperty(P_NORMAL, Constants::VectorType);
+    item->setItemValue(VectorItem::P_X, default_detector_distance);
+
+    // direction
+    item = addGroupProperty(P_DIRECTION, Constants::VectorType);
+    item->setItemValue(VectorItem::P_Y, -1.0);
+
+    addProperty(P_U0, default_detector_width / 2.)
+        ->setToolTip(tooltip_u0).setLimits(RealLimits::limitless());
+    addProperty(P_V0, 0.0)
+        ->setToolTip(tooltip_v0).setLimits(RealLimits::limitless());
+    addProperty(P_DBEAM_U0, default_detector_width / 2.)
+        ->setToolTip(tooltip_dbeam_u0).setLimits(RealLimits::limitless());
+    addProperty(P_DBEAM_V0, 0.0)
+        ->setToolTip(tooltip_dbeam_v0).setLimits(RealLimits::limitless());
+
+    addProperty(P_DISTANCE, default_detector_distance)
+        ->setToolTip(QStringLiteral("Distance in [mm] from the sample origin to the detector plane"));
+
+    update_properties_appearance();
+    m_is_constructed=true;
+
+    mapper()->setOnPropertyChange(
+                [this](const QString &name) {
+        if(name == P_ALIGNMENT && m_is_constructed) update_properties_appearance();
+    });
+}
+
+std::unique_ptr<IDetector2D> RectangularDetectorItem::createDetector() const
+{
+    // basic axes parameters
+    auto x_axis = dynamic_cast<BasicAxisItem *>(
+        getItem(RectangularDetectorItem::P_X_AXIS));
+    Q_ASSERT(x_axis);
+    int n_x = x_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+    double width = x_axis->getItemValue(BasicAxisItem::P_MAX).toDouble();
+
+    auto y_axis = dynamic_cast<BasicAxisItem *>(
+        getItem(RectangularDetectorItem::P_Y_AXIS));
+    Q_ASSERT(y_axis);
+    int n_y = y_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+    double height = y_axis->getItemValue(BasicAxisItem::P_MAX).toDouble();
+
+//    std::unique_ptr<RectangularDetector> result(new RectangularDetector(100, 20.0, 100, 20.0));
+//    result->setPerpendicularToSampleX(1000.0, 10.0, 0.0);
+
+    std::unique_ptr<RectangularDetector> result(new RectangularDetector(n_x, width, n_y, height));
+
+
+    // distance and alighnment
+    double u0 = getItemValue(P_U0).toDouble();
+    double v0 = getItemValue(P_V0).toDouble();
+    double dbeam_u0 = getItemValue(P_DBEAM_U0).toDouble();
+    double dbeam_v0 = getItemValue(P_DBEAM_V0).toDouble();
+    double distance = getItemValue(P_DISTANCE).toDouble();
+
+    kvector_t normal = getNormalVector();
+    kvector_t direction = getDirectionVector();
+
+    ComboProperty alignment = getItemValue(P_ALIGNMENT).value<ComboProperty>();
+
+    if (alignment.getValue() == Constants::ALIGNMENT_GENERIC) {
+        result->setPosition(normal, u0, v0, direction);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_DIRECT_BEAM) {
+        result->setPerpendicularToDirectBeam(distance, dbeam_u0, dbeam_v0);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_SAMPLE) {
+        qDebug() << n_x << n_y << width << height << " xx " << distance << u0 << v0;
+//        Q_ASSERT(0);
+
+        result->setPerpendicularToSampleX(distance, u0, v0);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_REFLECTED_BEAM) {
+        result->setPerpendicularToReflectedBeam(distance, u0, v0);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_REFLECTED_BEAM_DPOS) {
+        result->setPerpendicularToReflectedBeam(distance);
+        result->setDirectBeamPosition(dbeam_u0, dbeam_v0);
+    }
+
+    return std::move(result);
+}
+
+std::unique_ptr<IResolutionFunction2D> RectangularDetectorItem::createResolutionFunction()
+{
+    auto resfuncItem = dynamic_cast<ResolutionFunctionItem *>(
+        getGroupItem(P_RESOLUTION_FUNCTION));
+    Q_ASSERT(resfuncItem);
+    std::unique_ptr<IResolutionFunction2D> result(resfuncItem->createResolutionFunction());
+    return result;
+}
+
+void RectangularDetectorItem::setDetectorAlignment(const QString &alignment)
+{
+    ComboProperty combo_property
+        = getItemValue(RectangularDetectorItem::P_ALIGNMENT).value<ComboProperty>();
+
+    if(!combo_property.getValues().contains(alignment)) {
+        throw GUIHelpers::Error("RectangularDetectorItem::setDetectorAlignment -> Unexpected alignment");
+    }
+    combo_property.setValue(alignment);
+    setItemValue(RectangularDetectorItem::P_ALIGNMENT, combo_property.getVariant());
+
+}
+
+//! updates property tooltips and visibility flags, depending from type of alignment selected
+void RectangularDetectorItem::update_properties_appearance()
+{
+    // hiding all alignment properties
+    ComboProperty alignment = getItemValue(P_ALIGNMENT).value<ComboProperty>();
+    QStringList prop_list;
+    prop_list << P_NORMAL << P_DIRECTION << P_U0 << P_V0 << P_DBEAM_U0 << P_DBEAM_V0 << P_DISTANCE;
+    foreach(auto prop, prop_list) {
+        getItem(prop)->setVisible(false);
+    }
+
+    // enabling some properties back, depending from detector alignment mode
+    if (alignment.getValue() == Constants::ALIGNMENT_GENERIC) {
+        getItem(P_NORMAL)->setVisible(true);
+        getItem(P_DIRECTION)->setVisible(true);
+        getItem(P_U0)->setVisible(true);
+        getItem(P_U0)->setToolTip(tooltip_u0);
+        getItem(P_V0)->setVisible(true);
+        getItem(P_V0)->setToolTip(tooltip_v0);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_SAMPLE) {
+        getItem(P_DISTANCE)->setVisible(true);
+        getItem(P_U0)->setVisible(true);
+        getItem(P_U0)->setToolTip(tooltip_samplex_u0);
+        getItem(P_V0)->setVisible(true);
+        getItem(P_V0)->setToolTip(tooltip_samplex_v0);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_DIRECT_BEAM) {
+        getItem(P_DISTANCE)->setVisible(true);
+        getItem(P_DBEAM_U0)->setVisible(true);
+        getItem(P_DBEAM_V0)->setVisible(true);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_REFLECTED_BEAM) {
+        getItem(P_DISTANCE)->setVisible(true);
+        getItem(P_U0)->setVisible(true);
+        getItem(P_U0)->setToolTip(tooltip_refbeam_u0);
+        getItem(P_V0)->setVisible(true);
+        getItem(P_V0)->setToolTip(tooltip_refbeam_v0);
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_REFLECTED_BEAM_DPOS) {
+        getItem(P_DISTANCE)->setVisible(true);
+        getItem(P_DBEAM_U0)->setVisible(true);
+        getItem(P_DBEAM_V0)->setVisible(true);
+    }
+}
+
+kvector_t RectangularDetectorItem::getNormalVector() const
+{
+    auto item = dynamic_cast<VectorItem *>(
+        getItem(RectangularDetectorItem::P_NORMAL));
+    Q_ASSERT(item);
+    return item->getVector();
+}
+
+kvector_t RectangularDetectorItem::getDirectionVector() const
+{
+    auto item = dynamic_cast<VectorItem *>(
+        getItem(RectangularDetectorItem::P_DIRECTION));
+    Q_ASSERT(item);
+    return item->getVector();
+}
+
+
diff --git a/GUI/coregui/Models/RectangularDetectorItem.h b/GUI/coregui/Models/RectangularDetectorItem.h
new file mode 100644
index 0000000..bc21b96
--- /dev/null
+++ b/GUI/coregui/Models/RectangularDetectorItem.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RectangularDetectorItem.h
+//! @brief     Defines class RectangularDetectorItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RECTANGULARDETECTORITEM_H
+#define RECTANGULARDETECTORITEM_H
+
+#include "SessionItem.h"
+#include "Vectors3D.h"
+
+class IDetector2D;
+class IResolutionFunction2D;
+
+
+class BA_CORE_API_ RectangularDetectorItem : public SessionItem
+{
+public:
+    static const QString P_X_AXIS;
+    static const QString P_Y_AXIS;
+    static const QString P_RESOLUTION_FUNCTION;
+    static const QString P_ALIGNMENT;
+    static const QString P_NORMAL;
+    static const QString P_DIRECTION;
+    static const QString P_U0;
+    static const QString P_V0;
+    static const QString P_DBEAM_U0;
+    static const QString P_DBEAM_V0;
+    static const QString P_DISTANCE;
+
+    explicit RectangularDetectorItem();
+
+    std::unique_ptr<IDetector2D> createDetector() const;
+    std::unique_ptr<IResolutionFunction2D> createResolutionFunction();
+
+    void setDetectorAlignment(const QString &alignment);
+
+private:
+    void update_properties_appearance();
+
+    kvector_t getNormalVector() const;
+    kvector_t getDirectionVector() const;
+
+    bool m_is_constructed;
+};
+
+#endif // RECTANGULARDETECTORITEM_H
diff --git a/GUI/coregui/Models/RefractiveIndexItem.cpp b/GUI/coregui/Models/RefractiveIndexItem.cpp
new file mode 100644
index 0000000..7f8d7ce
--- /dev/null
+++ b/GUI/coregui/Models/RefractiveIndexItem.cpp
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RefractiveIndexItem.cpp
+//! @brief     Implements class RefractiveIndexItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RefractiveIndexItem.h"
+#include "ScientificDoubleProperty.h"
+
+
+const QString RefractiveIndexItem::P_DELTA = "delta";
+const QString RefractiveIndexItem::P_BETA = "beta";
+
+
+RefractiveIndexItem::RefractiveIndexItem()
+    : SessionItem(Constants::RefractiveIndexType)
+{
+    ScientificDoubleProperty delta(0.0);
+    addProperty(P_DELTA, delta.getVariant());
+
+    ScientificDoubleProperty beta(0.0);
+    addProperty(P_BETA, beta.getVariant());
+
+    mapper()->setOnPropertyChange(
+        [this](const QString &){
+            setValue(itemLabel());
+        }
+    );
+
+    setValue(itemLabel());
+    setEditable(false);
+}
+
+QString RefractiveIndexItem::itemLabel() const
+{
+    return QString("(1 - %1, %2)").arg(getDelta()).arg(getBeta());
+}
+
+double RefractiveIndexItem::getDelta() const
+{
+    return getItemValue(P_DELTA).value<ScientificDoubleProperty>().getValue();
+}
+
+void RefractiveIndexItem::setDelta(double delta)
+{
+    ScientificDoubleProperty property = getItemValue(P_DELTA).value<ScientificDoubleProperty>();
+    property.setValue(delta);
+    setItemValue(P_DELTA, property.getVariant());
+}
+
+double RefractiveIndexItem::getBeta() const
+{
+    return getItemValue(P_BETA).value<ScientificDoubleProperty>().getValue();
+}
+
+void RefractiveIndexItem::setBeta(double beta)
+{
+    ScientificDoubleProperty property = getItemValue(P_BETA).value<ScientificDoubleProperty>();
+    property.setValue(beta);
+    setItemValue(P_BETA, property.getVariant());
+}
diff --git a/GUI/coregui/Models/RefractiveIndexItem.h b/GUI/coregui/Models/RefractiveIndexItem.h
new file mode 100644
index 0000000..13a02f9
--- /dev/null
+++ b/GUI/coregui/Models/RefractiveIndexItem.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RefractiveIndexItem.h
+//! @brief     Defines class RefractiveIndexItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REFRACTIVEINDEXITEM_H
+#define REFRACTIVEINDEXITEM_H
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ RefractiveIndexItem : public SessionItem
+{
+
+public:
+    static const QString P_DELTA;
+    static const QString P_BETA;
+    explicit RefractiveIndexItem();
+    virtual ~RefractiveIndexItem(){}
+    virtual QString itemLabel() const;
+
+    double getDelta() const;
+    void setDelta(double delta);
+
+    double getBeta() const;
+    void setBeta(double beta);
+};
+
+#endif // REFRACTIVEINDEXITEM_H
diff --git a/GUI/coregui/Models/ResolutionFunctionItems.cpp b/GUI/coregui/Models/ResolutionFunctionItems.cpp
new file mode 100644
index 0000000..4281b72
--- /dev/null
+++ b/GUI/coregui/Models/ResolutionFunctionItems.cpp
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ResolutionFunctionItems.cpp
+//! @brief     Implements family of ResolutionFunctionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ResolutionFunctionItems.h"
+
+ResolutionFunctionItem::ResolutionFunctionItem(const QString name)
+    : SessionItem(name)
+{
+}
+
+/* ------------------------------------------------ */
+
+ResolutionFunctionNoneItem::ResolutionFunctionNoneItem()
+    : ResolutionFunctionItem(Constants::ResolutionFunctionNoneType)
+{
+}
+
+IResolutionFunction2D *ResolutionFunctionNoneItem::createResolutionFunction(double scale) const
+{
+    Q_UNUSED(scale);
+    return 0;
+}
+
+/* ------------------------------------------------ */
+
+const QString ResolutionFunction2DGaussianItem::P_SIGMA_X = "Sigma X";
+const QString ResolutionFunction2DGaussianItem::P_SIGMA_Y = "Sigma Y";
+
+ResolutionFunction2DGaussianItem::ResolutionFunction2DGaussianItem()
+    : ResolutionFunctionItem(Constants::ResolutionFunction2DGaussianType)
+{
+    addProperty(P_SIGMA_X, 0.02);
+    getItem(P_SIGMA_X)->setLimits(RealLimits::lowerLimited(0.0));
+    getItem(P_SIGMA_X)->setDecimals(3);
+    addProperty(P_SIGMA_Y, 0.02);
+    getItem(P_SIGMA_Y)->setLimits(RealLimits::lowerLimited(0.0));
+    getItem(P_SIGMA_Y)->setDecimals(3);
+}
+
+IResolutionFunction2D *ResolutionFunction2DGaussianItem::createResolutionFunction(double scale) const
+{
+    double sigma_x = getItemValue(P_SIGMA_X).toDouble();
+    double sigma_y = getItemValue(P_SIGMA_Y).toDouble();
+    return new ResolutionFunction2DGaussian(sigma_x*scale, sigma_y*scale);
+}
diff --git a/GUI/coregui/Models/ResolutionFunctionItems.h b/GUI/coregui/Models/ResolutionFunctionItems.h
new file mode 100644
index 0000000..a2f0cb2
--- /dev/null
+++ b/GUI/coregui/Models/ResolutionFunctionItems.h
@@ -0,0 +1,55 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ResolutionFunctionItems.h
+//! @brief     Defines family of ResolutionFunctionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RESOLUTIONFUNCTIONITEMS_H
+#define RESOLUTIONFUNCTIONITEMS_H
+
+#include "SessionItem.h"
+#include "ResolutionFunction2DGaussian.h"
+
+
+class BA_CORE_API_ ResolutionFunctionItem : public SessionItem
+{
+
+public:
+    explicit ResolutionFunctionItem(const QString name);
+    virtual ~ResolutionFunctionItem() {}
+
+    virtual IResolutionFunction2D *createResolutionFunction(double scale = 1.0) const=0;
+};
+
+class BA_CORE_API_ ResolutionFunctionNoneItem : public ResolutionFunctionItem
+{
+
+public:
+    explicit ResolutionFunctionNoneItem();
+    virtual IResolutionFunction2D *createResolutionFunction(double scale) const;
+};
+
+class BA_CORE_API_ ResolutionFunction2DGaussianItem : public ResolutionFunctionItem
+{
+
+public:
+    static const QString P_SIGMA_X;
+    static const QString P_SIGMA_Y;
+    explicit ResolutionFunction2DGaussianItem();
+    virtual IResolutionFunction2D *createResolutionFunction(double scale) const;
+};
+
+
+
+#endif // RESOLUTIONFUNCTIONITEMS_H
+
diff --git a/GUI/coregui/Models/RotationItems.cpp b/GUI/coregui/Models/RotationItems.cpp
new file mode 100644
index 0000000..0f429f0
--- /dev/null
+++ b/GUI/coregui/Models/RotationItems.cpp
@@ -0,0 +1,88 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RotationItems.cpp
+//! @brief     Implements class RotationItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RotationItems.h"
+#include "Units.h"
+
+/* ------------------------------------------------ */
+
+const QString XRotationItem::P_ANGLE = "Angle";
+
+XRotationItem::XRotationItem()
+    : RotationItem(Constants::XRotationType)
+{
+    addProperty(P_ANGLE, 0.0);
+}
+
+IRotation *XRotationItem::createRotation() const
+{
+    double alpha = Units::deg2rad(getItemValue(P_ANGLE).toDouble() );
+    return new RotationX(alpha);
+}
+
+/* ------------------------------------------------ */
+
+const QString YRotationItem::P_ANGLE = "Angle";
+
+YRotationItem::YRotationItem()
+    : RotationItem(Constants::YRotationType)
+{
+    addProperty(P_ANGLE, 0.0);
+}
+
+IRotation *YRotationItem::createRotation() const
+{
+    double alpha = Units::deg2rad(getItemValue(P_ANGLE).toDouble() );
+    return new RotationY(alpha);
+}
+
+/* ------------------------------------------------ */
+
+const QString ZRotationItem::P_ANGLE = "Angle";
+
+ZRotationItem::ZRotationItem()
+    : RotationItem(Constants::ZRotationType)
+{
+    addProperty(P_ANGLE, 0.0);
+}
+
+IRotation *ZRotationItem::createRotation() const
+{
+    double alpha = Units::deg2rad(getItemValue(P_ANGLE).toDouble() );
+    return new RotationZ(alpha);
+}
+
+/* ------------------------------------------------ */
+
+const QString EulerRotationItem::P_ALPHA = "Alpha";
+const QString EulerRotationItem::P_BETA = "Beta";
+const QString EulerRotationItem::P_GAMMA = "Gamma";
+
+EulerRotationItem::EulerRotationItem()
+    : RotationItem(Constants::EulerRotationType)
+{
+    addProperty(P_ALPHA, 0.0);
+    addProperty(P_BETA, 0.0);
+    addProperty(P_GAMMA, 0.0);
+}
+
+IRotation *EulerRotationItem::createRotation() const
+{
+    double alpha = Units::deg2rad(getItemValue(P_ALPHA).toDouble() );
+    double beta = Units::deg2rad(getItemValue(P_BETA).toDouble() );
+    double gamma = Units::deg2rad(getItemValue(P_GAMMA).toDouble() );
+    return new RotationEuler(alpha, beta, gamma);
+}
diff --git a/GUI/coregui/Models/RotationItems.h b/GUI/coregui/Models/RotationItems.h
new file mode 100644
index 0000000..8413cbe
--- /dev/null
+++ b/GUI/coregui/Models/RotationItems.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/RotationItems.h
+//! @brief     Defines class RotationItems
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ROTATIONITEMS_H
+#define ROTATIONITEMS_H
+
+#include "SessionItem.h"
+#include "Rotations.h"
+
+class RotationItem : public SessionItem
+{
+
+public:
+    explicit RotationItem(const QString name) : SessionItem(name){}
+    virtual IRotation *createRotation() const{ return 0;}
+    virtual ~RotationItem(){}
+};
+
+
+class XRotationItem : public RotationItem
+{
+
+public:
+    static const QString P_ANGLE;
+    explicit XRotationItem();
+    IRotation *createRotation() const;
+};
+
+class YRotationItem : public RotationItem
+{
+
+public:
+    static const QString P_ANGLE;
+    explicit YRotationItem();
+    IRotation *createRotation() const;
+};
+
+class ZRotationItem : public RotationItem
+{
+
+public:
+    static const QString P_ANGLE;
+    explicit ZRotationItem();
+    IRotation *createRotation() const;
+};
+
+class EulerRotationItem : public RotationItem
+{
+
+public:
+    static const QString P_ALPHA, P_BETA, P_GAMMA;
+    explicit EulerRotationItem();
+    IRotation *createRotation() const;
+};
+
+#endif // ROTATIONITEMS_H
+
diff --git a/GUI/coregui/Models/SampleModel.cpp b/GUI/coregui/Models/SampleModel.cpp
new file mode 100644
index 0000000..ee671ce
--- /dev/null
+++ b/GUI/coregui/Models/SampleModel.cpp
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SampleModel.cpp
+//! @brief     Implements class SampleModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleModel.h"
+#include "LayerItem.h"
+#include "MultiLayerItem.h"
+
+SampleModel::SampleModel(QObject *parent)
+    : SessionModel(SessionXML::SampleModelTag, parent)
+    , m_block_explore_for_material(false)
+{
+    setObjectName(SessionXML::SampleModelTag);
+}
+
+SampleModel *SampleModel::createCopy(SessionItem *parent)
+{
+    SampleModel *result = new SampleModel();
+    result->initFrom(this, parent);
+    return result;
+}
+
+MultiLayerItem *SampleModel::multiLayerItem(const QString &item_name)
+{
+    return dynamic_cast<MultiLayerItem *>(topItem(Constants::MultiLayerType, item_name));
+}
+
+void SampleModel::onMaterialModelChanged(const QModelIndex &, const QModelIndex &)
+{
+    if(m_block_explore_for_material)
+        return;
+
+    m_block_explore_for_material = true;
+    exploreForMaterials();
+    m_block_explore_for_material = false;
+}
+
+void SampleModel::exploreForMaterials(const QModelIndex &parentIndex)
+{
+
+    for (int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
+        QModelIndex itemIndex = index(i_row, 0, parentIndex);
+        if (SessionItem *item = itemForIndex(itemIndex)) {
+            if (item->modelType() == Constants::LayerType
+                || item->modelType() == Constants::ParticleType) {
+                // we pretend here that MaterialProperty changed to update IView colors
+                item->getItem(LayerItem::P_MATERIAL)->emitDataChanged();
+            }
+        }
+        exploreForMaterials(itemIndex);
+    }
+}
diff --git a/GUI/coregui/Models/SampleModel.h b/GUI/coregui/Models/SampleModel.h
new file mode 100644
index 0000000..01962d6
--- /dev/null
+++ b/GUI/coregui/Models/SampleModel.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SampleModel.h
+//! @brief     Defines class SampleModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEMODEL_H
+#define SAMPLEMODEL_H
+
+#include "SessionModel.h"
+
+class MultiLayerItem;
+class BA_CORE_API_ SampleModel : public SessionModel
+{
+    Q_OBJECT
+
+public:
+    explicit SampleModel(QObject *parent = 0);
+    virtual ~SampleModel(){}
+
+    virtual SampleModel *createCopy(SessionItem *parent = 0);
+
+    MultiLayerItem *multiLayerItem(const QString &item_name=QString());
+
+public slots:
+    void onMaterialModelChanged(const QModelIndex &, const QModelIndex &);
+
+private:
+    void exploreForMaterials(const QModelIndex &parentIndex = QModelIndex());
+    bool m_block_explore_for_material;
+};
+
+#endif // SAMPLEMODEL_H
diff --git a/GUI/coregui/Models/SampleValidator.cpp b/GUI/coregui/Models/SampleValidator.cpp
new file mode 100644
index 0000000..6ae21d8
--- /dev/null
+++ b/GUI/coregui/Models/SampleValidator.cpp
@@ -0,0 +1,158 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SampleValidator.cpp
+//! @brief     Implements class SampleValidator
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleValidator.h"
+#include "LayerItem.h"
+#include "MultiLayerItem.h"
+#include "ParticleCompositionItem.h"
+#include "ParticleCoreShellItem.h"
+#include "ParticleDistributionItem.h"
+#include "ParticleLayoutItem.h"
+
+SampleValidator::SampleValidator()
+    : m_valid_sample(true)
+{
+
+}
+
+void SampleValidator::initValidator()
+{
+    m_validation_message.clear();
+    m_valid_sample = true;
+}
+
+void SampleValidator::iterateItems(const SessionItem *parentItem)
+{
+    foreach(const SessionItem *child, parentItem->childItems()) {
+        validateItem(child);
+        iterateItems(child);
+    }
+}
+
+void SampleValidator::validateItem(const SessionItem *item)
+{
+    if(!item) return;
+
+    QString diagnosis;
+
+    if(item->modelType() == Constants::MultiLayerType) {
+        diagnosis = validateMultiLayerItem(item);
+    }
+
+    else if(item->modelType() == Constants::ParticleLayoutType) {
+        diagnosis = validateParticleLayoutItem(item);
+    }
+
+    else if(item->modelType() == Constants::ParticleCoreShellType) {
+        diagnosis = validateParticleCoreShellItem(item);
+    }
+
+    else if(item->modelType() == Constants::ParticleCompositionType) {
+        diagnosis = validateParticleCompositionItem(item);
+    }
+
+    else if(item->modelType() == Constants::ParticleCompositionType) {
+        diagnosis = validateParticleCompositionItem(item);
+    }
+
+    else if(item->modelType() == Constants::ParticleDistributionType) {
+        diagnosis = validateParticleDistributionItem(item);
+    }
+
+    if(!diagnosis.isEmpty()) {
+        m_valid_sample = false;
+        m_validation_message += QString("* ") + diagnosis + QString("\n");
+    }
+}
+
+QString SampleValidator::validateMultiLayerItem(const SessionItem *item)
+{
+    QString result;
+
+    QVector<SessionItem *> layers = item->getItems(MultiLayerItem::T_LAYERS);
+
+    if(layers.isEmpty()) {
+        result = QStringLiteral("MultiLayer should contain at least one layer.");
+    }
+
+    else if(layers.size() == 1) {
+        if(layers.front()->getItems(LayerItem::T_LAYOUTS).isEmpty()) {
+            result = QStringLiteral(
+                        "The single layer in your MultiLayer should contain ParticleLayout.");
+        }
+    }
+    return result;
+}
+
+
+QString SampleValidator::validateParticleLayoutItem(const SessionItem *item)
+{
+    QString result;
+
+    QVector<SessionItem *> particles = item->getItems(ParticleLayoutItem::T_PARTICLES);
+    if(particles.isEmpty())
+        result = QStringLiteral("ParticleLayout doesn't contain any particles.");
+
+    return result;
+}
+
+QString SampleValidator::validateParticleCoreShellItem(const SessionItem *item)
+{
+    QString result;
+
+    const SessionItem *core = item->getItem(ParticleCoreShellItem::T_CORE);
+    const SessionItem *shell = item->getItem(ParticleCoreShellItem::T_SHELL);
+
+    if(core == nullptr || shell == nullptr)
+        result = QStringLiteral("ParticleCoreShell doesn't have either core or shell defined.");
+
+    return result;
+}
+
+QString SampleValidator::validateParticleCompositionItem(const SessionItem *item)
+{
+    QString result;
+    if (item->getItems(ParticleCompositionItem::T_PARTICLES).isEmpty())
+        result = QStringLiteral("ParticleComposition doesn't have any particles.");
+
+    return result;
+}
+
+QString SampleValidator::validateParticleDistributionItem(const SessionItem *item)
+{
+    QString result;
+    if (item->getItems(ParticleDistributionItem::T_PARTICLES).isEmpty())
+        result = QStringLiteral("ParticleDistribution doesn't have any particle.");
+
+    return result;
+
+}
+
+bool SampleValidator::isValidMultiLayer(const MultiLayerItem *multilayer)
+{
+    initValidator();
+
+    validateItem(multilayer);
+    iterateItems(multilayer);
+
+    if(!m_valid_sample) {
+        m_validation_message = QStringLiteral(
+                    "Can't setup DWBA simulation for given MultiLayer.\n") + m_validation_message;
+    }
+
+    return m_valid_sample;
+}
+
diff --git a/GUI/coregui/Models/SampleValidator.h b/GUI/coregui/Models/SampleValidator.h
new file mode 100644
index 0000000..01a3a71
--- /dev/null
+++ b/GUI/coregui/Models/SampleValidator.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SampleValidator.h
+//! @brief     Defines class SampleValidator
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEVALIDATOR_H
+#define SAMPLEVALIDATOR_H
+
+#include <QModelIndex>
+
+class SessionItem;
+class MultiLayerItem;
+
+//! Validates SampleModel for MultiLayerItem suitable for simulation
+class SampleValidator
+{
+public:
+    SampleValidator();
+
+    bool isValidMultiLayer(const  MultiLayerItem *multilayer);
+
+    QString getValidationMessage() const { return m_validation_message; }
+
+private:
+    void initValidator();
+
+    void iterateItems(const SessionItem *parentItem);
+    void validateItem(const SessionItem *item);
+
+    QString validateMultiLayerItem(const SessionItem *item);
+    QString validateParticleLayoutItem(const SessionItem *item);
+    QString validateParticleCoreShellItem(const SessionItem *item);
+    QString validateParticleCompositionItem(const SessionItem *item);
+    QString validateParticleDistributionItem(const SessionItem *item);
+
+    bool m_valid_sample;
+    QString m_validation_message;
+};
+
+
+#endif // SAMPLEVALIDATOR_H
diff --git a/GUI/coregui/Models/ScientificDoubleProperty.h b/GUI/coregui/Models/ScientificDoubleProperty.h
new file mode 100644
index 0000000..c0a8224
--- /dev/null
+++ b/GUI/coregui/Models/ScientificDoubleProperty.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/ScientificDoubleProperty.h
+//! @brief     Defines class ScientificDoubleProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SCIENTIFICDOUBLEPROPERTY_H
+#define SCIENTIFICDOUBLEPROPERTY_H
+
+
+//! The ScientificDoubleProperty for SessionItem and PropertyEditor
+//!
+//! The reason is to have simple editor for doubles in scientific notation
+//! in PropertyEditor instead of inconvenient QDoubleSpinBox
+class BA_CORE_API_ ScientificDoubleProperty
+{
+public:
+    explicit ScientificDoubleProperty(double value = 0) : m_value(value) {}
+    double getValue() const { return m_value;}
+    void setValue(double value) { m_value = value; }
+    QString getText() const { return QString::number(m_value,'g');}
+    QVariant getVariant() const {
+        QVariant result;
+        result.setValue(*this);
+        return result;
+    }
+
+private:
+    double m_value;
+};
+
+Q_DECLARE_METATYPE(ScientificDoubleProperty)
+
+
+#endif // SCIENTIFICDOUBLEPROPERTY_H
+
diff --git a/GUI/coregui/Models/SessionGraphicsItem.cpp b/GUI/coregui/Models/SessionGraphicsItem.cpp
new file mode 100644
index 0000000..42f15bf
--- /dev/null
+++ b/GUI/coregui/Models/SessionGraphicsItem.cpp
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionGraphicsItem.cpp
+//! @brief     Implements class SessionGraphicsItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SessionGraphicsItem.h"
+
+
+const QString SessionGraphicsItem::P_XPOS = "xpos";
+const QString SessionGraphicsItem::P_YPOS = "ypos";
+
+
+SessionGraphicsItem::SessionGraphicsItem(const QString &model_type)
+    : SessionItem(model_type)
+{
+    addProperty(P_XPOS, qreal(0.0))->setVisible(false);
+    addProperty(P_YPOS, qreal(0.0))->setVisible(false);
+}
+
diff --git a/GUI/coregui/Models/SessionGraphicsItem.h b/GUI/coregui/Models/SessionGraphicsItem.h
new file mode 100644
index 0000000..845b37a
--- /dev/null
+++ b/GUI/coregui/Models/SessionGraphicsItem.h
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionGraphicsItem.h
+//! @brief     Defines class SessionGraphicsItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONGRAPHICSITEM_H
+#define SESSIONGRAPHICSITEM_H
+
+#include "SessionItem.h"
+
+class BA_CORE_API_ SessionGraphicsItem : public SessionItem
+{
+
+public:
+    static const QString P_XPOS;
+    static const QString P_YPOS;
+
+protected:
+    explicit SessionGraphicsItem(const QString &model_type=QString());
+};
+
+#endif // SESSIONGRAPHICSITEM_H
diff --git a/GUI/coregui/Models/SessionItem.cpp b/GUI/coregui/Models/SessionItem.cpp
new file mode 100644
index 0000000..0d99b71
--- /dev/null
+++ b/GUI/coregui/Models/SessionItem.cpp
@@ -0,0 +1,808 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionItem.cpp
+//! @brief     Implements class SessionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUIHelpers.h"
+#include "GroupItem.h"
+#include "GroupPropertyRegistry.h"
+#include "ItemFactory.h"
+#include "SessionModel.h"
+#include <QDebug>
+
+class SessionItemData
+{
+public:
+    inline SessionItemData() : role(-1) {}
+    inline SessionItemData(int r, const QVariant &v) : role(r), value(v) {}
+    int role;
+    QVariant value;
+    inline bool operator==(const SessionItemData &other) const {
+        return role == other.role && value == other.value;
+    }
+};
+
+const QString SessionItem::P_NAME = "Name";
+
+//! Constructs new item with given model type. The type must be defined.
+
+SessionItem::SessionItem(const QString &modelType)
+    : m_parent(nullptr)
+    , m_model(nullptr)
+{
+    Q_ASSERT(!modelType.isEmpty());
+
+    setData(SessionModel::ModelTypeRole, modelType);
+    setDisplayName(modelType);
+    setDecimals(3);
+    setLimits(RealLimits::lowerLimited(0.0));
+}
+
+//! Destructor deletes all its children and request parent to delete this item.
+
+SessionItem::~SessionItem()
+{
+    if(m_mapper)
+        m_mapper->callOnItemDestroy();
+
+    QVector<SessionItem*>::const_iterator it;
+    for (it = m_children.constBegin(); it != m_children.constEnd(); ++it) {
+        SessionItem *child = *it;
+        if (child)
+            child->setModel(nullptr);
+        delete child;
+    }
+    m_children.clear();
+    if (m_parent && m_model)
+        m_parent->childDeleted(this);
+}
+
+//! internal
+void SessionItem::childDeleted(SessionItem *child)
+{
+    int index = rowOfChild(child);
+    Q_ASSERT(index != -1);
+    m_children.replace(index, nullptr);
+}
+
+//! internal
+void SessionItem::setParentAndModel(SessionItem *parent, SessionModel *model)
+{
+    setModel(model);
+    m_parent = parent;
+}
+
+//! internal
+void SessionItem::setModel(SessionModel *model)
+{
+    m_model = model;
+    if (m_mapper) {
+        m_mapper->setItem(this);
+    }
+    // process children as well
+    for (auto &child : m_children) {
+        child->setModel(model);
+    }
+}
+
+
+
+//! Returns model of this item.
+
+SessionModel *SessionItem::model() const
+{
+    return m_model;
+}
+
+//! Returns parent of this item.
+
+SessionItem *SessionItem::parent() const
+{
+    return m_parent;
+}
+
+//! Returns model index of this item.
+
+ QModelIndex SessionItem::index() const
+{
+    if (m_model) {
+        return m_model->indexOfItem(const_cast<SessionItem*>(this));
+    }
+    return QModelIndex();
+}
+
+//! Returns true when item has children.
+
+bool SessionItem::hasChildren() const
+{
+    return !m_children.isEmpty();
+}
+
+//! Returns total number of children.
+
+int SessionItem::rowCount() const
+{
+    return m_children.count();
+}
+
+//! Returns vector of all children.
+
+QVector<SessionItem *> SessionItem::childItems() const
+{
+    return m_children;
+}
+
+
+//! Returns the child at the given row.
+
+SessionItem *SessionItem::childAt(int row) const
+{
+    return m_children.value(row, nullptr);
+}
+
+//! Returns row index of given child.
+
+int SessionItem::rowOfChild(SessionItem *child) const
+{
+    return m_children.indexOf(child);
+}
+
+
+//! Returns the index of this item within its parent, returns -1 when no parent is set.
+
+int SessionItem::parentRow() const
+{
+    if (m_parent)
+        return m_parent->rowOfChild(const_cast<SessionItem*>(this));
+    return -1;
+}
+
+//! Returns the first child with the given name.
+SessionItem *SessionItem::getChildByName(const QString &name) const
+{
+    for (auto child : m_children) {
+        if (child->itemName() == name) return child;
+    }
+    return nullptr;
+}
+
+//! Returns the first child of the given type.
+
+SessionItem *SessionItem::getChildOfType(const QString &type) const
+{
+    for (auto child : m_children) {
+        if (child->modelType() == type) return child;
+    }
+    return nullptr;
+}
+
+//! Returns a vector of all children of the given type.
+
+QVector<SessionItem *> SessionItem::getChildrenOfType(const QString &model_type) const
+{
+    QVector<SessionItem *> result;
+    for (auto child : m_children) {
+        if (child->modelType() == model_type)
+            result.append(child);
+    }
+    return result;
+}
+
+//! Removes row from item and returns the item.
+
+SessionItem *SessionItem::takeRow(int row)
+{
+    SessionItem *item = childAt(row);
+    QString tag = tagFromItem(item);
+    auto items = getItems(tag);
+    return takeItem(items.indexOf(item), tag);
+}
+
+//! Add new tag to this item with given name, min, max and types.
+//! max = -1 -> unlimited, modelTypes empty -> all types allowed
+
+bool SessionItem::registerTag(const QString &name, int min, int max, QStringList modelTypes)
+{
+    if (min < 0 || (min > max && max >= 0))
+        return false;
+    if (name.isEmpty() || getTagInfo(name).isValid())
+        return false;
+    m_tags.append(SessionTagInfo(name, min, max, modelTypes));
+    return true;
+}
+
+//! Returns true if tag is available.
+
+bool SessionItem::isTag(const QString &name) const
+{
+    return getTagInfo(name).isValid();
+}
+
+//! Returns the tag name of given item when existing.
+
+QString SessionItem::tagFromItem(const SessionItem *item) const
+{
+    int index = m_children.indexOf(const_cast<SessionItem*>(item));
+    if (index == -1)
+        return QString();
+    QVector<SessionTagInfo>::const_iterator it;
+    for (it = m_tags.constBegin(); it != m_tags.constEnd(); ++it) {
+        SessionTagInfo tagInfo = *it;
+        if (index < tagInfo.childCount) {
+            return tagInfo.name;
+        } else {
+            index -= tagInfo.childCount;
+        }
+    }
+    return QString();
+}
+
+//! Returns corresponding tag info.
+
+SessionTagInfo SessionItem::getTagInfo(const QString &tag) const
+{
+    QString tagName = tag.isEmpty() ? defaultTag() : tag;
+    QVector<SessionTagInfo>::const_iterator it;
+    for (it = m_tags.constBegin(); it != m_tags.constEnd(); ++it) {
+        SessionTagInfo tagInfo = *it;
+        if (tagInfo.name == tagName)
+            return tagInfo;
+    }
+    return SessionTagInfo();
+}
+
+//! Returns true if model type can be added to default tag.
+
+bool SessionItem::acceptsAsDefaultItem(const QString &item_name) const
+{
+    return getTagInfo(defaultTag()).modelTypes.contains(item_name);
+}
+
+//! Returns vector of acceptable default tag types.
+
+QVector<QString> SessionItem::acceptableDefaultItemTypes() const
+{
+    return getTagInfo(defaultTag()).modelTypes.toVector();
+}
+
+//! internal
+int SessionItem::tagStartIndex(const QString &name) const
+{
+    int index = 0;
+    QVector<SessionTagInfo>::const_iterator it;
+    for (it = m_tags.constBegin(); it != m_tags.constEnd(); ++it) {
+        SessionTagInfo tagInfo = *it;
+        if (tagInfo.name == name) {
+            return index;
+        } else {
+            index += tagInfo.childCount;
+        }
+    }
+    return -1;
+}
+
+//! Returns item in given row of given tag.
+
+SessionItem *SessionItem::getItem(const QString &tag, int row) const
+{
+    const QString tagName = tag.isEmpty() ? defaultTag() : tag;
+    SessionTagInfo tagInfo = getTagInfo(tagName);
+    if (!tagInfo.isValid())
+        return nullptr;
+    if (tagInfo.childCount == 0)
+        return nullptr;
+    if (row < 0 || row >= tagInfo.childCount)
+        return nullptr;
+    int index = tagStartIndex(tagName) + row;
+    Q_ASSERT(index >= 0 && index < m_children.size());
+    return m_children[index];
+}
+
+//! Returns vector of all items of given tag.
+
+QVector<SessionItem *> SessionItem::getItems(const QString &tag) const
+{
+    const QString tagName = tag.isEmpty() ? defaultTag() : tag;
+    SessionTagInfo tagInfo = getTagInfo(tagName);
+    if (!tagInfo.isValid())
+        return QVector<SessionItem*>();
+    int index = tagStartIndex(tagName);
+    Q_ASSERT(index >= 0 && index <= m_children.size());
+    return m_children.mid(index, tagInfo.childCount);
+}
+
+//! Insert item into given tag into given row.
+
+bool SessionItem::insertItem(int row, SessionItem *item, const QString &tag)
+{
+    if (!item)
+        return false;
+    const QString tagName = tag.isEmpty() ? defaultTag() : tag;
+    SessionTagInfo tagInfo = getTagInfo(tagName);
+    if (!tagInfo.isValid())
+        return false;
+    if (row == -1)
+        row = tagInfo.childCount;
+    if (row < 0 || row > tagInfo.childCount)
+        return false;
+    if (tagInfo.max >= 0 && tagInfo.childCount == tagInfo.max)
+        return false;
+    if (!tagInfo.modelTypes.isEmpty()) {
+        if (!tagInfo.modelTypes.contains(item->modelType()))
+            return false;
+    }
+    int index = tagStartIndex(tagName) + row;
+    Q_ASSERT(index <= m_children.size());
+    if (m_model)
+            m_model->beginInsertRows(this->index(),index, index);
+    if (item) {
+        if (item->parent() == nullptr) {
+            item->setParentAndModel(this, m_model);
+        } else {
+            qDebug() << "Double insertion of item";
+            return false;
+        }
+    }
+    m_children.insert(index, item);
+
+    QVector<SessionTagInfo>::iterator it;
+    for (it = m_tags.begin(); it != m_tags.end(); ++it) {
+        if (it->name == tagName) {
+            it->childCount++;
+            break;
+        }
+    }
+
+    if (m_model)
+            m_model->endInsertRows();
+    return true;
+}
+
+//! Remove item from given row from given tag.
+
+SessionItem *SessionItem::takeItem(int row, const QString &tag)
+{
+    const QString tagName = tag.isEmpty() ? defaultTag() : tag;
+    SessionTagInfo tagInfo = getTagInfo(tagName);
+    if (!tagInfo.isValid())
+        return nullptr;
+    if (row < 0 || row >= tagInfo.childCount)
+        return nullptr;
+    if (tagInfo.childCount <= tagInfo.min)
+        return nullptr;
+    int index = tagStartIndex(tagName) + row;
+    Q_ASSERT(index >= 0 && index <= m_children.size());
+    if (m_model)
+            m_model->beginRemoveRows(this->index(),index, index);
+    SessionItem *result = m_children.takeAt(index);
+    result->setParentAndModel(nullptr, nullptr);
+
+    QVector<SessionTagInfo>::iterator it;
+    for (it = m_tags.begin(); it != m_tags.end(); ++it) {
+        if (it->name == tagName) {
+            it->childCount--;
+            break;
+        }
+    }
+
+    if (m_model)
+            m_model->endRemoveRows();
+    return result;
+}
+
+//! Add new property item and register new tag.
+
+SessionItem *SessionItem::addProperty(const QString &name, const QVariant &variant)
+{
+    if (isTag(name))
+        throw GUIHelpers::Error(
+            "ParameterizedItem::registerProperty() -> Error. Already existing property " + name);
+
+    const QString property_type = Constants::PropertyType;
+    SessionItem *property = ItemFactory::createItem(property_type);
+    property->setDisplayName(name);
+    registerTag(name, 1, 1, QStringList() << property_type);
+    if(!insertItem(0, property, name)) {
+        throw GUIHelpers::Error("SessionItem::addProperty -> Error. Can't insert item");
+    }
+    property->setValue(variant);
+    return property;
+}
+
+//! Directly access value of item under given tag.
+
+QVariant SessionItem::getItemValue(const QString &tag) const
+{
+    if (!isTag(tag))
+        throw GUIHelpers::Error(
+            "ParameterizedItem::getRegisteredProperty() -> Error. Unknown property '" + tag
+            + "', item '" + modelType() + "'");
+
+    return getItem(tag)->value();
+}
+
+//! Directly set value of item under given tag.
+
+void SessionItem::setItemValue(const QString &tag, const QVariant &variant)
+{
+    // check if variant of previous property coincides with new one
+    if (!isTag(tag))
+        throw GUIHelpers::Error("Property not existing!");
+
+     getItem(tag)->setValue(variant);
+}
+
+//! Creates new group item and register new tag, returns GroupItem.
+
+SessionItem *SessionItem::addGroupProperty(const QString &groupName, const QString &groupType)
+{
+    SessionItem *result(0);
+
+    if(GroupPropertyRegistry::isValidGroup(groupType)) {
+        // create group item
+        GroupProperty_t group_property
+            = GroupPropertyRegistry::createGroupProperty(groupName, groupType);
+        GroupItem *groupItem = dynamic_cast<GroupItem *>(
+                    ItemFactory::createItem(Constants::GroupItemType));
+        Q_ASSERT(groupItem);
+        groupItem->setGroup(group_property);
+        registerTag(groupName, 1, 1, QStringList() << Constants::GroupItemType);
+        result = groupItem;
+    }
+
+    else {
+        // create single item
+        registerTag(groupName, 1, 1, QStringList() << groupType);
+        result = ItemFactory::createItem(groupType);
+    }
+
+    Q_ASSERT(result);
+    result->setDisplayName(groupName);
+    if(!insertItem(0, result, groupName)) {
+        throw GUIHelpers::Error("SessionItem::addGroupProperty -> Error. Can't insert group item");
+    }
+
+    return result;
+}
+
+//! Access subitem of group item. If not existing, new item will be created by group property.
+
+SessionItem *SessionItem::getGroupItem(const QString &name, const QString &type) const
+{
+    if (GroupItem *item = dynamic_cast<GroupItem *>(getItem(name))) {
+        GroupProperty_t group_property = item->group();
+        if (type.isEmpty()) {
+            return group_property->getCurrentItem();
+        }
+        QString backup = group_property->getCurrentType();
+        group_property->setCurrentType(type);
+        SessionItem *value = group_property->getCurrentItem();
+        group_property->setCurrentType(backup);
+        return value;
+    }
+    return nullptr;
+}
+
+//! Set the current type of group item.
+
+SessionItem *SessionItem::setGroupProperty(const QString &name, const QString &value) const
+{
+    qDebug() << "ParameterizedItem::setGroupProperty()" << name << value;
+    if (GroupItem *item = dynamic_cast<GroupItem *>(getItem(name))) {
+        GroupProperty_t group_property = item->group();
+        group_property->setCurrentType(value);
+        return group_property->getCurrentItem();
+    }
+    return nullptr;
+}
+
+//! Returns corresponding variant under given role, invalid variant when role is not present.
+
+QVariant SessionItem::data(int role) const
+{
+    role = (role == Qt::EditRole) ? Qt::DisplayRole : role;
+    QVector<SessionItemData>::const_iterator it;
+    for (it = m_values.begin(); it != m_values.end(); ++it) {
+        if ((*it).role == role)
+            return (*it).value;
+    }
+    return QVariant();
+}
+
+//! Set variant to role, create role if not present yet.
+
+bool SessionItem::setData(int role, const QVariant &value)
+{
+    role = (role == Qt::EditRole) ? Qt::DisplayRole : role;
+    QVector<SessionItemData>::iterator it;
+    for (it = m_values.begin(); it != m_values.end(); ++it) {
+        if ((*it).role == role) {
+            if (value.isValid()) {
+                if ((*it).value.type() == value.type() && (*it).value == value)
+                    return true;
+                (*it).value = value;
+            } else {
+                m_values.erase(it);
+            }
+            if (m_model)
+                emitDataChanged(role);
+            return true;
+        }
+    }
+    m_values.append(SessionItemData(role, value));
+    if (m_model)
+        emitDataChanged(role);
+
+    return true;
+}
+
+//! Returns vector of all present roles.
+
+QVector<int> SessionItem::getRoles() const
+{
+    QVector<int> result;
+    QVector<SessionItemData>::const_iterator it;
+    for (it = m_values.constBegin(); it != m_values.constEnd(); ++it) {
+        result.append(it->role);
+    }
+    return result;
+}
+
+//! Notify model about data changes.
+
+void SessionItem::emitDataChanged(int role)
+{
+    if (m_model) {
+        QModelIndex index = m_model->indexOfItem(this);
+        m_model->dataChanged(index, index.sibling(index.row(), 1), QVector<int>() << role);
+    }
+}
+
+//! internal
+int SessionItem::flags() const
+{
+    QVariant flags = data(SessionModel::FlagRole);
+    if (!flags.isValid())
+        return SessionModel::VISIBLE | SessionModel::EDITABLE | SessionModel::ENABLED;
+
+    return flags.toInt();
+}
+
+//! internal
+void SessionItem::changeFlags(bool enabled, int flag)
+{
+    int flags = this->flags();
+    if (enabled) {
+        flags |= flag;
+    } else {
+        flags &= ~flag;
+    }
+    setData(SessionModel::FlagRole, flags);
+}
+
+//! Get model type
+
+QString SessionItem::modelType() const
+{
+    return data(SessionModel::ModelTypeRole).toString();
+}
+
+//! Get value
+
+QVariant SessionItem::value() const
+{
+    return data(Qt::DisplayRole);
+}
+
+//! Set value, ensure that variant types match.
+
+bool SessionItem::setValue(QVariant value)
+{
+    QVariant previous_variant = this->value();
+    if (previous_variant.isValid() && GUIHelpers::getVariantType(previous_variant)
+            != GUIHelpers::getVariantType(value)) {
+        qDebug() << "ParameterizedItem::setRegisteredProperty() -> Error. Type of previous and new "
+                    "variant does not coincide.";
+        qDebug() << "New variant" << value << ", previous " << previous_variant;
+        throw GUIHelpers::Error("ParameterizedItem::setRegisteredProperty() -> Error. Type of "
+                                "previous and new variant does not coincide.");
+    }
+    return setData(Qt::DisplayRole, value);
+}
+
+//! Get default tag
+
+QString SessionItem::defaultTag() const
+{
+    return data(SessionModel::DefaultTagRole).toString();
+}
+
+//! Set default tag
+
+void SessionItem::setDefaultTag(const QString &tag)
+{
+    setData(SessionModel::DefaultTagRole, tag);
+}
+
+//! Get display name of item, append index if ambigue.
+
+QString SessionItem::displayName() const
+{
+    QString result = data(SessionModel::DisplayNameRole).toString();
+
+    if(modelType() == Constants::PropertyType || modelType() == Constants::GroupItemType ||
+       modelType() == Constants::ParameterType || modelType() == Constants::ParameterLabelType)
+        return result;
+
+    if(m_parent) {
+        QString tag = m_parent->tagFromItem(this);
+        SessionTagInfo info = m_parent->getTagInfo(tag);
+        // if only one child of this type is allowed, return name without change
+        if (info.min == 1 && info.max == 1 && info.childCount == 1) {
+            return result;
+        }
+
+        int index = m_parent->getCopyNumberOfChild(this);
+        if(index >= 0) {
+            return result + QString::number(index);
+        }
+
+    }
+
+    return result;
+}
+
+//! Set display name
+
+void SessionItem::setDisplayName(const QString &display_name)
+{
+    setData(SessionModel::DisplayNameRole, display_name);
+}
+
+//! internal
+int SessionItem::getCopyNumberOfChild(const SessionItem *item) const
+{
+    if (!item) return -1;
+    int result = -1;
+    int count = 0;
+    QString model_type = item->modelType();
+    // check child items:
+    for (auto p_child_item : m_children) {
+        QString child_type = p_child_item->modelType();
+        if (p_child_item == item) {
+            result = count;
+        }
+        if (child_type == model_type && !p_child_item->isTag(P_NAME)) {
+            ++count;
+        }
+    }
+    if (count > 1) return result;
+    return -1;
+}
+
+//! Get item name, return display name if no name is set.
+
+QString SessionItem::itemName() const
+{
+    if (isTag(P_NAME)) {
+        return getItemValue(P_NAME).toString();
+    } else {
+        return displayName();
+    }
+}
+
+//! Set item name, add property if necessary.
+
+void SessionItem::setItemName(const QString &name)
+{
+    if (isTag(P_NAME)) {
+        setItemValue(P_NAME, name);
+    } else {
+        addProperty(P_NAME, name);
+        // when name changes, than parent should be notified about it
+        mapper()->setOnPropertyChange(
+                    [this] (const QString &name)
+        {
+            if (name == P_NAME)
+                emitDataChanged();
+        });
+    }
+}
+
+
+// access flags
+
+void SessionItem::setVisible(bool enabled)
+{
+    changeFlags(enabled, SessionModel::VISIBLE);
+}
+
+void SessionItem::setEnabled(bool enabled)
+{
+    changeFlags(enabled, SessionModel::ENABLED);
+}
+
+void SessionItem::setEditable(bool enabled)
+{
+    changeFlags(enabled, SessionModel::EDITABLE);
+}
+
+bool SessionItem::isVisible() const
+{
+    return flags() & SessionModel::VISIBLE;
+}
+
+bool SessionItem::isEnabled() const
+{
+    return flags() & SessionModel::ENABLED;
+}
+
+bool SessionItem::isEditable() const
+{
+    return flags() & SessionModel::EDITABLE;
+}
+
+
+// more roles
+
+RealLimits SessionItem::limits() const
+{
+    return data(SessionModel::LimitsRole).value<RealLimits>();
+}
+
+SessionItem& SessionItem::setLimits(const RealLimits &value)
+{
+    this->setData(SessionModel::LimitsRole, QVariant::fromValue<RealLimits>(value));
+    return *this;
+}
+
+int SessionItem::decimals() const
+{
+    return data(SessionModel::DecimalRole).toInt();
+}
+
+SessionItem& SessionItem::setDecimals(int n)
+{
+    setData(SessionModel::DecimalRole, n);
+    return *this;
+}
+
+QString SessionItem::toolTip() const
+{
+    return data(Qt::ToolTipRole).toString();
+}
+
+SessionItem& SessionItem::setToolTip(const QString &tooltip)
+{
+    setData(Qt::ToolTipRole, tooltip);
+    return *this;
+}
+
+//! Returns label of item shown in property editor.
+
+QString SessionItem::itemLabel() const
+{
+    return QString("");
+}
+
+//! Returns the current model mapper of this item. Creates new one if necessary.
+
+ModelMapper *SessionItem::mapper()
+{
+    if (!m_mapper) {
+        m_mapper = std::unique_ptr<ModelMapper>(new ModelMapper);
+        m_mapper->setItem(this);
+    }
+    return m_mapper.get();
+}
diff --git a/GUI/coregui/Models/SessionItem.h b/GUI/coregui/Models/SessionItem.h
new file mode 100644
index 0000000..04e4d09
--- /dev/null
+++ b/GUI/coregui/Models/SessionItem.h
@@ -0,0 +1,159 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionItem.h
+//! @brief     Defines class SessionItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONITEM_H
+#define SESSIONITEM_H
+
+#include "RealLimits.h"
+#include "ModelMapper.h"
+#include "item_constants.h"
+#include <QStringList>
+#include <memory>
+
+Q_DECLARE_METATYPE(RealLimits)
+
+class SessionItemData;
+
+class SessionTagInfo
+{
+public:
+    inline SessionTagInfo() : name(QString()), min(0), max(-1), childCount(0) {}
+    inline SessionTagInfo(QString n, int mi, int ma, QStringList mt = QStringList())
+        :name(n)
+        , min(mi)
+        , max(ma)
+        , childCount(0)
+        , modelTypes(mt) {}
+    QString name;
+    int min;
+    int max;
+    int childCount;
+    QStringList modelTypes;
+    inline bool isValid() { return !name.isEmpty(); }
+};
+
+
+class BA_CORE_API_ SessionItem
+{
+    friend class SessionModel;
+
+public:
+    static const QString P_NAME;
+
+    explicit SessionItem(const QString &modelType = QString());
+    virtual ~SessionItem();
+    SessionModel *model() const;
+    SessionItem *parent() const;
+
+    // these functions work without tags and operate on all children
+    QModelIndex index() const;
+    bool hasChildren() const;
+    int rowCount() const;
+    QVector<SessionItem *> childItems() const;
+    SessionItem *childAt(int row) const;
+    int rowOfChild(SessionItem *child) const;
+    int parentRow() const;
+    SessionItem* getChildByName(const QString &name) const;
+    SessionItem *getChildOfType(const QString &type) const;
+    QVector<SessionItem *> getChildrenOfType(const QString &model_type) const;
+    SessionItem *takeRow(int row);
+
+    // manage and check tags
+    bool registerTag(const QString &name, int min = 0, int max = -1,
+                     QStringList modelTypes = QStringList());
+    bool isTag(const QString &name) const;
+    QString tagFromItem(const SessionItem *item) const;
+    SessionTagInfo getTagInfo(const QString &name = QString()) const;
+    bool acceptsAsDefaultItem(const QString &item_name) const;
+    QVector<QString> acceptableDefaultItemTypes() const;
+
+    // access tagged items
+    SessionItem *getItem(const QString &tag = QString(), int row = 0) const;
+    QVector<SessionItem *> getItems(const QString &tag = QString()) const;
+    bool insertItem(int row, SessionItem *item, const QString &tag = QString());
+    SessionItem *takeItem(int row, const QString &tag);
+
+    // convenience functions for properties and groups
+    SessionItem *addProperty(const QString &name, const QVariant &variant);
+    QVariant getItemValue(const QString &tag) const;
+    void setItemValue(const QString &tag, const QVariant &variant);
+    SessionItem *addGroupProperty(const QString &groupName, const QString &groupType);
+
+    SessionItem *setGroupProperty(const QString &name, const QString &value) const;
+    SessionItem *getGroupItem(const QString &name, const QString &type = QString()) const;
+
+    // access data stored in roles
+    virtual QVariant data(int role) const;
+    virtual bool setData(int role, const QVariant &value);
+    QVector<int> getRoles() const;
+    void emitDataChanged(int role = Qt::DisplayRole);
+
+    // custom data types
+    QString modelType() const;
+
+    QVariant value() const;
+    bool setValue(QVariant value);
+
+    QString defaultTag() const;
+    void setDefaultTag(const QString &tag);
+
+    QString displayName() const;
+    void setDisplayName(const QString &display_name);
+
+    QString itemName() const;
+    void setItemName(const QString &name);
+
+    void setVisible(bool enabled);
+    void setEnabled(bool enabled);
+    void setEditable(bool enabled);
+    bool isVisible() const;
+    bool isEnabled() const;
+    bool isEditable() const;
+
+    RealLimits limits() const;
+    SessionItem& setLimits(const RealLimits &value);
+
+    int decimals() const;
+    SessionItem& setDecimals(int n);
+
+    QString toolTip() const;
+    SessionItem& setToolTip(const QString &tooltip);
+
+
+    // helper functions
+    virtual QString itemLabel() const;
+    ModelMapper *mapper();
+
+private:
+    void childDeleted(SessionItem *child);
+    void setParentAndModel(SessionItem *parent, SessionModel *model);
+    void setModel(SessionModel *model);
+    int tagStartIndex(const QString &name) const;
+    int flags() const;
+    void changeFlags(bool enabled, int flag);
+    int getCopyNumberOfChild(const SessionItem *item) const;
+
+    SessionItem *m_parent;
+    SessionModel *m_model;
+    QVector<SessionItem *> m_children;
+    QVector<SessionItemData> m_values;
+    QVector<SessionTagInfo> m_tags;
+    std::unique_ptr<ModelMapper> m_mapper;
+};
+
+Q_DECLARE_METATYPE(SessionItem*) // INVESTIGATE something requires sessionitem be declared as meta type
+
+#endif // SESSIONITEM_H
diff --git a/GUI/coregui/Models/SessionModel.cpp b/GUI/coregui/Models/SessionModel.cpp
new file mode 100644
index 0000000..4295239
--- /dev/null
+++ b/GUI/coregui/Models/SessionModel.cpp
@@ -0,0 +1,533 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionModel.cpp
+//! @brief     Implements class SessionModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SessionModel.h"
+#include "GUIHelpers.h"
+#include "IconProvider.h"
+#include "ItemFactory.h"
+#include <QDebug>
+#include <QFile>
+#include <QMimeData>
+
+namespace
+{
+const int MaxCompression = 9;
+}
+
+SessionModel::SessionModel(QString model_tag, QObject *parent)
+    : QAbstractItemModel(parent)
+    , m_root_item(0)
+    , m_name("DefaultName")
+    , m_model_tag(model_tag)
+{
+    createRootItem();
+}
+
+void SessionModel::createRootItem()
+{
+    m_root_item = ItemFactory::createEmptyItem();
+    m_root_item->setModel(this);
+    m_root_item->registerTag("rootTag");
+    m_root_item->setDefaultTag("rootTag");
+}
+
+SessionModel::~SessionModel()
+{
+    delete m_root_item;
+}
+
+Qt::ItemFlags SessionModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags result_flags = QAbstractItemModel::flags(index);
+    if (index.isValid()) {
+        result_flags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled
+                        | Qt::ItemIsDragEnabled;
+        SessionItem *item = itemForIndex(index);
+        if (index.column() == ITEM_VALUE && item->value().isValid())
+            result_flags |= Qt::ItemIsEditable;
+        QVector<QString> acceptable_child_items = getAcceptableDefaultItemTypes(index);
+        if (acceptable_child_items.contains(m_dragged_item_type)) {
+            result_flags |= Qt::ItemIsDropEnabled;
+        }
+    } else {
+        result_flags |= Qt::ItemIsDropEnabled;
+    }
+    return result_flags;
+}
+
+QVariant SessionModel::data(const QModelIndex &index, int role) const
+{
+    if (!m_root_item || !index.isValid() || index.column() < 0 || index.column() >= columnCount(QModelIndex())) {
+        return QVariant();
+    }
+    if (SessionItem *item = itemForIndex(index)) {
+        if (role == Qt::DisplayRole || role == Qt::EditRole) {
+            if (index.column() == ITEM_VALUE)
+                return item->data(Qt::DisplayRole);
+            if (index.column() == ITEM_NAME)
+                return item->itemName();
+        } else if (role == Qt::DecorationRole && m_iconProvider) {
+            return m_iconProvider->icon(item);
+
+        } else if(role == Qt::ToolTipRole) {
+            return item->displayName();
+        } else {
+            return item->data(role);
+        }
+    }
+    return QVariant();
+}
+
+QVariant SessionModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
+        switch (section) {
+        case ITEM_NAME:
+            return "Name";
+        case ITEM_VALUE:
+            return "Value";
+        }
+    }
+    return QVariant();
+}
+
+int SessionModel::rowCount(const QModelIndex &parent) const
+{
+    if (parent.isValid() && parent.column() != 0)
+        return 0;
+    SessionItem *parent_item = itemForIndex(parent);
+    return parent_item ? parent_item->rowCount() : 0;
+}
+
+int SessionModel::columnCount(const QModelIndex &parent) const
+{
+    if (parent.isValid() && parent.column() != 0)
+        return 0;
+    return MAX_COLUMNS;
+}
+
+QModelIndex SessionModel::index(int row, int column, const QModelIndex &parent) const
+{
+    if (!m_root_item || row < 0 || column < 0 || column >= columnCount(QModelIndex())
+        || (parent.isValid() && parent.column() != 0))
+        return QModelIndex();
+    SessionItem *parent_item = itemForIndex(parent);
+    if (SessionItem *item = parent_item->childAt(row)) {
+        return createIndex(row, column, item);
+    }
+    return QModelIndex();
+}
+
+QModelIndex SessionModel::parent(const QModelIndex &child) const
+{
+    if (!child.isValid())
+        return QModelIndex();
+    if (SessionItem *child_item = itemForIndex(child)) {
+        if (SessionItem *parent_item = child_item->parent()) {
+            if (parent_item == m_root_item)
+                return QModelIndex();
+
+            return createIndex(parent_item->parentRow(), 0, parent_item);
+        }
+    }
+    return QModelIndex();
+}
+
+bool SessionModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+    if (!index.isValid())
+        return false;
+    QModelIndex dataIndex = index;
+    if (SessionItem *item = itemForIndex(dataIndex)) {
+        if (item->setData(role, value)) {
+            return true;
+        }
+    }
+    return false;
+}
+
+bool SessionModel::removeRows(int row, int count, const QModelIndex &parent)
+{
+    if (!m_root_item)
+        return false;
+    SessionItem *item = parent.isValid() ? itemForIndex(parent) : m_root_item;
+    for (int i = 0; i < count; ++i) {
+        delete item->takeRow(row);
+    }
+    return true;
+}
+
+QStringList SessionModel::mimeTypes() const
+{
+    return QStringList() << SessionXML::ItemMimeType;
+}
+
+QMimeData *SessionModel::mimeData(const QModelIndexList &indices) const
+{
+    if (indices.count() != 2)
+        return 0;
+    if (SessionItem *item = itemForIndex(indices.at(0))) {
+        QMimeData *mime_data = new QMimeData;
+        QByteArray xml_data;
+        QXmlStreamWriter writer(&xml_data);
+        SessionWriter::writeItemAndChildItems(&writer, item);
+        mime_data->setData(SessionXML::ItemMimeType, qCompress(xml_data, MaxCompression));
+        return mime_data;
+    }
+    return 0;
+}
+
+bool SessionModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row,
+                                   int column, const QModelIndex &parent) const
+{
+    (void)row;
+    if (action == Qt::IgnoreAction)
+        return true;
+    if (action != Qt::MoveAction || column > 0 || !data || !data->hasFormat(SessionXML::ItemMimeType))
+        return false;
+    if (!parent.isValid())
+        return true;
+    QVector<QString> acceptable_child_items = getAcceptableDefaultItemTypes(parent);
+    QByteArray xml_data = qUncompress(data->data(SessionXML::ItemMimeType));
+    QXmlStreamReader reader(xml_data);
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.isStartElement()) {
+            if (reader.name() == SessionXML::ItemTag) {
+                const QString model_type
+                    = reader.attributes().value(SessionXML::ModelTypeAttribute).toString();
+                return acceptable_child_items.contains(model_type);
+            }
+        }
+    }
+    return false;
+}
+
+bool SessionModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
+                                const QModelIndex &parent)
+{
+    if (action == Qt::IgnoreAction)
+        return true;
+    if (action != Qt::MoveAction || column > 0 || !data || !data->hasFormat(SessionXML::ItemMimeType))
+        return false;
+    if (!canDropMimeData(data, action, row, column, parent))
+        return false;
+    if (SessionItem *item = itemForIndex(parent)) {
+        QByteArray xml_data = qUncompress(data->data(SessionXML::ItemMimeType));
+        QXmlStreamReader reader(xml_data);
+        if (row == -1)
+            row = item->rowCount();
+        beginInsertRows(parent, row, row);
+        // this code block is currently not in use. The row parameter of the reader is removed
+        //SessionReader::readItems(&reader, item, row);
+        endInsertRows();
+        return true;
+    }
+    return false;
+}
+
+QModelIndex SessionModel::indexOfItem(SessionItem *item) const
+{
+    if (!item || item == m_root_item || !item->parent())
+        return QModelIndex();
+    SessionItem *parent_item = item->parent();
+//    qDebug() << "OOO indexOfItem:" << item << " parent_item" <<  parent_item << "m_root_item:" << m_root_item;
+    int row = parent_item->rowOfChild(item);
+    Q_ASSERT(row>=0); // FIXME For Debugging
+    return createIndex(row, 0, item);
+}
+
+SessionItem *SessionModel::insertNewItem(QString model_type, const QModelIndex &parent,
+                                               int row, QString tag)
+{
+    SessionItem *parent_item = itemForIndex(parent);
+    if (!parent_item)
+        parent_item = m_root_item;
+    if (row > parent_item->rowCount())
+        return nullptr;
+    if (parent_item != m_root_item) {
+        if (tag.isEmpty())
+            tag = parent_item->defaultTag();
+        SessionTagInfo tagInfo = parent_item->getTagInfo(tag);
+
+        if (!tagInfo.modelTypes.contains(model_type)) {
+            qDebug() << "Child of type " << model_type << " not acceptable!\n";
+            return nullptr;
+        }
+    }
+
+    SessionItem *new_item = ItemFactory::createItem(model_type);
+
+    if (!new_item)
+        throw GUIHelpers::Error("SessionModel::insertNewItem() -> Wrong model type " + model_type);
+
+    if(!parent_item->insertItem(row, new_item, tag)) {
+        throw GUIHelpers::Error("SessionModel::insertNewItem -> Error. Can't insert item");
+    }
+
+    return new_item;
+}
+
+QVector<QString> SessionModel::getAcceptableDefaultItemTypes(const QModelIndex &parent) const
+{
+    QVector<QString> result;
+    if (SessionItem *parent_item = itemForIndex(parent)) {
+        result = parent_item->acceptableDefaultItemTypes();
+    }
+    return result;
+}
+
+void SessionModel::clear()
+{
+    beginResetModel();
+    delete m_root_item;
+    createRootItem();
+    endResetModel();
+}
+
+void SessionModel::load(const QString &filename)
+{
+    beginResetModel();
+    QFile file(filename);
+    if (!file.open(QIODevice::ReadOnly))
+        throw GUIHelpers::Error(file.errorString());
+    clear();
+    m_root_item = ItemFactory::createEmptyItem();
+    QXmlStreamReader reader(&file);
+    SessionReader::readItems(&reader, m_root_item);
+    if (reader.hasError())
+        throw GUIHelpers::Error(reader.errorString());
+    endResetModel();
+}
+
+void SessionModel::save(const QString &filename)
+{
+    QFile file(filename);
+    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
+        throw GUIHelpers::Error(file.errorString());
+
+    QXmlStreamWriter writer(&file);
+    writer.setAutoFormatting(true);
+    writer.writeStartDocument();
+    writer.writeStartElement("BornAgain");
+    writer.writeAttribute("Version", GUIHelpers::getBornAgainVersionString());
+    SessionWriter::writeItemAndChildItems(&writer, m_root_item);
+    writer.writeEndElement(); // BornAgain
+    writer.writeEndDocument();
+}
+
+SessionItem *SessionModel::itemForIndex(const QModelIndex &index) const
+{
+    if (index.isValid()) {
+        if (SessionItem *item = static_cast<SessionItem *>(index.internalPointer()))
+            return item;
+    }
+    return m_root_item;
+}
+
+void SessionModel::readFrom(QXmlStreamReader *reader, WarningMessageService *messageService)
+{
+    Q_ASSERT(reader);
+
+    qDebug() << "SessionModel::readFrom()" << m_model_tag << reader->name() << m_root_item;
+
+    if (reader->name() != m_model_tag) {
+        throw GUIHelpers::Error("SessionModel::readFrom() -> Format error in p1");
+    }
+
+    beginResetModel();
+    clear();
+
+    m_name = reader->attributes().value(SessionXML::ModelNameAttribute).toString();
+
+    createRootItem();
+
+    SessionReader::readItems(reader, m_root_item, QString(), messageService);
+    if (reader->hasError())
+        throw GUIHelpers::Error(reader->errorString());
+    endResetModel();
+
+}
+
+void SessionModel::writeTo(QXmlStreamWriter *writer, SessionItem *parent)
+{
+    if (!parent)
+        parent = m_root_item;
+    SessionWriter::writeTo(writer, parent);
+}
+
+//! Move given parameterized item to the new_parent at given row. If new_parent is not defined,
+//! use root_item as a new parent.
+SessionItem *SessionModel::moveParameterizedItem(SessionItem *item, SessionItem *new_parent,
+                                         int row, const QString &tag)
+{
+    qDebug() << "";
+    qDebug() << "";
+    qDebug() << "SessionModel::moveParameterizedItem() " << item << new_parent << row;
+    if (!new_parent)
+        new_parent = m_root_item;
+    const QString tagName = tag.isEmpty() ? new_parent->defaultTag() : tag;
+
+    if (new_parent) {
+        if (!new_parent->getTagInfo(tagName).modelTypes.empty() &&
+                !new_parent->getTagInfo(tagName).modelTypes.contains(item->modelType()))
+            return 0;
+    }
+
+    if (item->parent() == new_parent) {
+        // take care of indexes when moving item within same parent
+        int previousIndex = item->parent()->getItems(tagName).indexOf(item);
+        if (row==previousIndex) {
+            qDebug()
+                << "SessionModel::moveParameterizedItem() -> no need to move, same parent, same row. ";
+            return item;
+        } else if (previousIndex >= 0 && row>previousIndex) {
+            row--;
+        }
+    }
+    SessionItem *stuff = item->parent()->takeRow(item->parent()->rowOfChild(item));
+    if(!new_parent->insertItem(row, stuff, tagName)) {
+        SessionTagInfo info = new_parent->getTagInfo(tagName);
+        if (info.max == info.childCount && info.childCount == 1) {
+            SessionItem *old = new_parent->takeItem(0, tagName);
+            new_parent->insertItem(row, stuff, tagName);
+            m_root_item->insertItem(-1, old);
+        }
+        m_root_item->insertItem(-1, stuff);
+    }
+
+
+    return stuff;
+}
+
+//! Copy given item to the new_parent at given row. Item indended for copying can belong to
+//! another model and it will remains intact. Returns pointer to the new child.
+SessionItem *SessionModel::copyParameterizedItem(const SessionItem *item_to_copy,
+                                                       SessionItem *new_parent, const QString &tag)
+{
+    if (!new_parent) {
+        new_parent = m_root_item;
+    }
+
+    const QString tagName = tag.isEmpty() ? new_parent->defaultTag() : tag;
+
+
+    QByteArray xml_data;
+    QXmlStreamWriter writer(&xml_data);
+    SessionWriter::writeItemAndChildItems(&writer, item_to_copy);
+
+    QXmlStreamReader reader(xml_data);
+
+    SessionReader::readItems(&reader, new_parent, tagName);
+
+//    return new_parent->getItem(tagName);
+    return new_parent->getItems(tagName).back();
+}
+
+SessionModel *SessionModel::createCopy(SessionItem *parent)
+{
+    (void)parent;
+    throw GUIHelpers::Error("SessionModel::createCopy() -> Error. Not implemented.");
+}
+
+//! returns top level item with given name and model type
+SessionItem *SessionModel::topItem(const QString &model_type,
+                                            const QString &item_name) const
+{
+    QList<SessionItem *> items = topItems(model_type);
+
+    if(item_name.isEmpty() && items.size())
+        return items.front();
+
+    foreach(SessionItem *item, items) {
+        if(item_name == item->itemName())
+            return item;
+    }
+
+    return nullptr;
+}
+
+//! Returns top items which are children of parentIndex and have given model_type
+
+QList<SessionItem *> SessionModel::topItems(const QString &model_type, const QModelIndex &parentIndex) const
+{
+    QList<SessionItem *> result;
+    for (int i_row = 0; i_row < rowCount(parentIndex); ++i_row) {
+        QModelIndex itemIndex = index(i_row, 0, parentIndex);
+        if (SessionItem *item = itemForIndex(itemIndex)) {
+            if (model_type.isEmpty()) {
+                result.append(item);
+            } else {
+                if (item->modelType() == model_type) {
+                    result.append(item);
+                }
+            }
+        }
+    }
+    return result;
+}
+
+QStringList SessionModel::topItemNames(const QString &model_type, const QModelIndex &parentIndex) const
+{
+    QList<SessionItem *> items = topItems(model_type, parentIndex);
+    QStringList result;
+    foreach(SessionItem *item, items) {
+        result.append(item->itemName());
+    }
+    return result;
+}
+
+void SessionModel::initFrom(SessionModel *model, SessionItem *parent)
+{
+    qDebug() << "SessionModel::initFrom() -> " << model->getModelTag() << parent;
+    QByteArray byte_array;
+    QXmlStreamWriter writer(&byte_array);
+    writer.setAutoFormatting(true);
+
+    model->writeTo(&writer);
+
+    QXmlStreamReader reader(byte_array);
+
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.isStartElement()) {
+            readFrom(&reader);
+        }
+    }
+}
+
+SessionItem* SessionModel::rootItem() const{
+    return m_root_item;
+}
+
+//! Loads non-XML data of the model from the projectDir
+
+void SessionModel::loadNonXMLData(const QString &projectDir)
+{
+    Q_UNUSED(projectDir);
+}
+
+//! Saves non-XML data of the model to the projectDir
+
+void SessionModel::saveNonXMLData(const QString &projectDir)
+{
+    Q_UNUSED(projectDir);
+}
+
+void SessionModel::setIconProvider(IconProvider *icon_provider)
+{
+    m_iconProvider.reset(icon_provider);
+}
diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h
new file mode 100644
index 0000000..9bda142
--- /dev/null
+++ b/GUI/coregui/Models/SessionModel.h
@@ -0,0 +1,165 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionModel.h
+//! @brief     Defines class SessionModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONMODEL_H
+#define SESSIONMODEL_H
+
+#include "SessionItem.h"
+#include "SessionXML.h"
+#include <QStringList>
+#include <QtCore/QXmlStreamWriter>
+
+class IconProvider;
+
+class BA_CORE_API_ SessionModel : public QAbstractItemModel
+{
+    Q_OBJECT
+    friend class SessionItem; // NEW
+public:
+    explicit SessionModel(QString model_tag, QObject *parent = 0);
+    virtual ~SessionModel();
+    void createRootItem(); //NEW
+
+    enum EColumn {ITEM_NAME, ITEM_VALUE, MAX_COLUMNS}; // NEW column usage
+
+    enum ERoles {ModelTypeRole = Qt::UserRole + 1, FlagRole, DisplayNameRole, LimitsRole,
+                 DecimalRole, DefaultTagRole, EndSessionRoles}; // NEW roles
+
+    enum EAppearance {
+        VISIBLE = 0x001,
+        ENABLED = 0x002,
+        EDITABLE = 0x004
+    };
+
+//    // Begin overriden methods from QAbstractItemModel
+    virtual Qt::ItemFlags flags(const QModelIndex &index) const;
+    virtual QVariant data(const QModelIndex &index, int role) const;
+    virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    virtual int rowCount(const QModelIndex &parent) const;
+    virtual int columnCount(const QModelIndex &parent) const;
+    virtual QModelIndex index(int row, int column, const QModelIndex &parent) const;
+    virtual QModelIndex parent(const QModelIndex &child) const;
+
+    virtual bool setHeaderData(int, Qt::Orientation, const QVariant &, int = Qt::EditRole);
+    virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
+    virtual bool removeRows(int row, int count, const QModelIndex &parent);
+
+    virtual Qt::DropActions supportedDragActions() const;
+    virtual Qt::DropActions supportedDropActions() const;
+    virtual QStringList mimeTypes() const;
+    virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
+    virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
+                         const QModelIndex &parent) const;
+    virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
+                      const QModelIndex &parent);
+    // End overridden methods from QAbstractItemModel
+
+    QModelIndex indexOfItem(SessionItem *item) const;
+    SessionItem *insertNewItem(QString model_type, const QModelIndex &parent = QModelIndex(),
+                                     int row = -1, QString tag = QString());
+
+    QString getModelTag() const;
+    QString getModelName() const;
+    void setModelName(const QString &name);
+
+    QVector<QString> getAcceptableDefaultItemTypes(const QModelIndex &parent) const;
+
+    virtual void clear();
+    void load(const QString &filename = QString());
+    void save(const QString &filename = QString());
+
+    // Sets mimedata pointer of item being dragged
+    void setDraggedItemType(const QString &type);
+
+    // Returns root item if index is not valid
+    SessionItem *itemForIndex(const QModelIndex &index) const;
+
+    void readFrom(QXmlStreamReader *reader, WarningMessageService *messageService=0);
+    void writeTo(QXmlStreamWriter *writer, SessionItem *parent = 0);
+
+    SessionItem *moveParameterizedItem(SessionItem *item,
+                                             SessionItem *new_parent = 0, int row = -1,
+                                       const QString &tag = QString());
+
+    SessionItem *copyParameterizedItem(const SessionItem *item_to_copy,
+                                             SessionItem *new_parent = 0,
+                                             const QString &tag = QString());
+
+    void setIconProvider(IconProvider *icon_provider);
+
+    virtual SessionModel *createCopy(SessionItem *parent = 0);
+
+    SessionItem *topItem(const QString &model_type = QString(),
+                         const QString &item_name = QString()) const;
+    QList<SessionItem *> topItems(const QString &model_type = QString(),
+                                  const QModelIndex &parentIndex = QModelIndex()) const;
+    QStringList topItemNames(const QString &model_type = QString(),
+                             const QModelIndex &parentIndex = QModelIndex()) const;
+
+    virtual void initFrom(SessionModel *model, SessionItem *parent);
+    SessionItem* rootItem() const;
+
+    virtual void loadNonXMLData(const QString &projectDir);
+    virtual void saveNonXMLData(const QString &projectDir);
+
+
+protected:
+    void setRootItem(SessionItem *root) {m_root_item = root;}
+
+private:
+    SessionItem *m_root_item;
+    QString m_dragged_item_type;
+    QString m_name;      //!< model name
+    QString m_model_tag; //!< model tag (SampleModel, InstrumentModel)
+    std::unique_ptr<IconProvider> m_iconProvider;
+};
+
+inline bool SessionModel::setHeaderData(int, Qt::Orientation, const QVariant &, int)
+{
+    return false;
+}
+
+inline Qt::DropActions SessionModel::supportedDragActions() const
+{
+    return Qt::MoveAction;
+}
+
+inline Qt::DropActions SessionModel::supportedDropActions() const
+{
+    return Qt::MoveAction;
+}
+
+inline QString SessionModel::getModelTag() const
+{
+    return m_model_tag;
+}
+
+inline QString SessionModel::getModelName() const
+{
+    return m_name;
+}
+
+inline void SessionModel::setModelName(const QString &name)
+{
+    m_name = name;
+}
+
+inline void SessionModel::setDraggedItemType(const QString &type)
+{
+    m_dragged_item_type = type;
+}
+
+#endif // SESSIONMODEL_H
diff --git a/GUI/coregui/Models/SessionModelAssistant.cpp b/GUI/coregui/Models/SessionModelAssistant.cpp
new file mode 100644
index 0000000..fbb83f3
--- /dev/null
+++ b/GUI/coregui/Models/SessionModelAssistant.cpp
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionModelAssistant.cpp
+//! @brief     Implements class SessionModelAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SessionModelAssistant.h"
+#include "GUIHelpers.h"
+#include "SessionItem.h"
+
+SessionModelAssistant::SessionModelAssistant()
+    : m_on_error_behavior(THROW_EXCEPTION)
+{
+
+}
+
+void SessionModelAssistant::start_error_recording()
+{
+    clear_errors();
+    m_on_error_behavior = RECORD_ERROR;
+}
+
+void SessionModelAssistant::stop_error_recording()
+{
+    m_on_error_behavior = THROW_EXCEPTION;
+}
+
+void SessionModelAssistant::clear_errors()
+{
+    m_list_of_errors.clear();
+}
+
+bool SessionModelAssistant::hasErrors() const
+{
+    return m_list_of_errors.size();
+}
+
+void SessionModelAssistant::report_unknown_item_property(const SessionItem *item,
+                                                         const QString &property_name)
+{
+    QString message = QString("Unknown property '%1' for item type '%2'")
+                      .arg(item->modelType()).arg(property_name);
+    if(m_on_error_behavior == THROW_EXCEPTION) {
+        throw GUIHelpers::Error(message);
+    }
+    m_list_of_errors.push_back(Error(SET_ITEM_PROPERTY_ERROR, message));
+
+}
diff --git a/GUI/coregui/Models/SessionModelAssistant.h b/GUI/coregui/Models/SessionModelAssistant.h
new file mode 100644
index 0000000..babf8e4
--- /dev/null
+++ b/GUI/coregui/Models/SessionModelAssistant.h
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionModelAssistant.h
+//! @brief     Defines class SessionModelAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONMODELASSISTANT_H
+#define SESSIONMODELASSISTANT_H
+
+#include <QMap>
+#include <QString> // need detected by TeamCity
+
+class SessionItem;
+
+//! @class SessionModelAssistant
+//! @brief Assists SessionModel in various aspects. Currently keeps record of all reading errors
+//! to make detailed report in the case of project load failure.
+//!
+//! It has two types of behavior on reported error. In THROW_EXCEPTION mode assistant just
+//! throws an exception with error description.
+//!
+//! In RECORD_ERROR mode it saves errors in a list for later printout. This mode is triggered
+//! by start_error_recording() method and intended for use during project loading.
+
+class SessionModelAssistant
+{
+public:
+    enum EOnErrorBehavior {
+        THROW_EXCEPTION,
+        RECORD_ERROR
+    };
+    enum EErrorType {
+        XML_FORMAT_ERROR = 0x0001,
+        SET_ITEM_PROPERTY_ERROR = 0x0002
+    };
+    class Error {
+    public:
+        Error(EErrorType error_type, const QString &description)
+            : m_error_type(error_type), m_error_description(description){}
+        EErrorType m_error_type;
+        QString m_error_description;
+    };
+
+    SessionModelAssistant();
+
+    void start_error_recording();
+
+    void stop_error_recording();
+
+    void clear_errors();
+
+    bool hasErrors() const;
+
+    void report_unknown_item_property(const SessionItem *item, const QString &property_name);
+
+private:
+    QList<Error> m_list_of_errors;
+    EOnErrorBehavior m_on_error_behavior;
+};
+
+#endif // SESSIONMODELASSISTANT_H
diff --git a/GUI/coregui/Models/SessionModelDelegate.cpp b/GUI/coregui/Models/SessionModelDelegate.cpp
new file mode 100644
index 0000000..8b54414
--- /dev/null
+++ b/GUI/coregui/Models/SessionModelDelegate.cpp
@@ -0,0 +1,90 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionModelDelegate.cpp
+//! @brief     Implements class SessionModelDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SessionModelDelegate.h"
+#include "PropertyBrowserUtils.h"
+#include <QApplication>
+
+SessionModelDelegate::SessionModelDelegate(QWidget *parent)
+    : QStyledItemDelegate(parent)
+{
+
+}
+
+void SessionModelDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
+                                 const QModelIndex &index) const
+{
+    QVariant prop_value = index.model()->data(index, Qt::EditRole);
+    if(prop_value.canConvert<ComboProperty>()) {
+        ComboProperty property = prop_value.value<ComboProperty>();
+        QStyleOptionViewItem opt = option;
+        initStyleOption(&opt, index); // calling original method to take into accounts colors etc
+        opt.text = displayText(property.getValue(), option.locale); // by overriding text with ours
+        const QWidget *widget = opt.widget;
+        QStyle *style = widget ? widget->style() : QApplication::style();
+        style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
+    } else {
+        QStyledItemDelegate::paint(painter, option, index);
+    }
+
+}
+
+QWidget *SessionModelDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+                                            const QModelIndex &index) const
+{
+    if (index.data().canConvert<ComboProperty>()) {
+        ComboPropertyEdit *editor = new ComboPropertyEdit(parent);
+        ComboProperty combo = index.data().value<ComboProperty>();
+        editor->setComboProperty(combo);
+        connect(editor, SIGNAL(comboPropertyChanged(const ComboProperty &)),
+                this, SLOT(onComboPropertyChanged(const ComboProperty &)));
+        return editor;
+
+    } else {
+        return QStyledItemDelegate::createEditor(parent, option, index);
+    }
+
+}
+
+void SessionModelDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
+                                        const QModelIndex &index) const
+{
+    if (index.data().canConvert<ComboProperty>()) {
+        ComboPropertyEdit *comboEditor = qobject_cast<ComboPropertyEdit *>(editor);
+        model->setData(index, comboEditor->getComboProperty().getVariant());
+    } else {
+        QStyledItemDelegate::setModelData(editor, model, index);
+    }
+
+}
+
+void SessionModelDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    if (index.data().canConvert<ComboProperty>()) {
+        //as using custom widget, doing nothing here
+    } else {
+        QStyledItemDelegate::setEditorData(editor, index);
+    }
+}
+
+void SessionModelDelegate::onComboPropertyChanged(const ComboProperty &property)
+{
+    Q_UNUSED(property);
+    ComboPropertyEdit *editor = qobject_cast<ComboPropertyEdit *>(sender());
+    Q_ASSERT(editor);
+    emit commitData(editor);
+    //emit closeEditor(editor); // Qt by default leaves editor alive after editing finished
+}
diff --git a/GUI/coregui/Models/SessionModelDelegate.h b/GUI/coregui/Models/SessionModelDelegate.h
new file mode 100644
index 0000000..26c54e5
--- /dev/null
+++ b/GUI/coregui/Models/SessionModelDelegate.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionModelDelegate.h
+//! @brief     Defines class SessionModelDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONMODELDELEGATE_H
+#define SESSIONMODELDELEGATE_H
+
+#include "WinDllMacros.h"
+#include <QStyledItemDelegate>
+
+class ComboProperty;
+
+//! The SessionModelDelegate class presents the content of SessionModel items in
+//! standard QTreeView. Extents base QItemDelegate with possibility to show/edit
+//! our custom QVariant's.
+
+class BA_CORE_API_ SessionModelDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+public:
+    SessionModelDelegate(QWidget *parent);
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+                      const QModelIndex &index ) const;
+
+    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+                                        const QModelIndex &index) const;
+
+    void setModelData(QWidget *editor, QAbstractItemModel *model,
+                      const QModelIndex &index) const;
+
+    void setEditorData(QWidget *editor, const QModelIndex &index) const;
+
+private slots:
+    void onComboPropertyChanged(const ComboProperty &);
+
+};
+
+#endif // SESSIONMODELDELEGATE_H
diff --git a/GUI/coregui/Models/SessionXML.cpp b/GUI/coregui/Models/SessionXML.cpp
new file mode 100644
index 0000000..b72e8d0
--- /dev/null
+++ b/GUI/coregui/Models/SessionXML.cpp
@@ -0,0 +1,379 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionXML.cpp
+//! @brief     Implements reader and writer classes for SessionModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "AngleProperty.h"
+#include "ColorProperty.h"
+#include "ComboProperty.h"
+#include "GUIHelpers.h"
+#include "GroupItem.h"
+#include "ItemFactory.h"
+#include "MaterialProperty.h"
+#include "ScientificDoubleProperty.h"
+#include "SessionModel.h"
+#include "WarningMessageService.h"
+#include <QDebug>
+
+namespace
+{
+const QString SET_ITEM_PROPERTY_ERROR = "SET_ITEM_PROPERTY_ERROR";
+const QString ITEM_IS_NOT_INITIALIZED = "ITEM_IS_NOT_INITIALIZED";
+const QString NON_EXISTING_SUBITEM = "NON_EXISTING_SUBITEM";
+}
+
+void SessionWriter::writeTo(QXmlStreamWriter *writer, SessionItem *parent)
+{
+    writer->writeStartElement(parent->model()->getModelTag());
+    writer->writeAttribute(SessionXML::ModelNameAttribute, parent->model()->getModelName());
+
+    writeItemAndChildItems(writer, parent);
+
+    writer->writeEndElement(); // m_model_tag
+}
+
+void SessionWriter::writeItemAndChildItems(QXmlStreamWriter *writer, const SessionItem *item)
+{
+    Q_ASSERT(item);
+    if (item->parent()) {
+        writer->writeStartElement(SessionXML::ItemTag);
+        writer->writeAttribute(SessionXML::ModelTypeAttribute, item->modelType());
+        QString tag = item->parent()->tagFromItem(item);
+        if (tag == item->parent()->defaultTag())
+            tag = "";
+        writer->writeAttribute(SessionXML::TagAttribute, tag);
+        writer->writeAttribute(SessionXML::DisplayNameAttribute, item->data(SessionModel::DisplayNameRole).toString());
+        QVector<int> roles = item->getRoles();
+        foreach(int role, roles) {
+            if (role == Qt::DisplayRole || role == Qt::EditRole)
+                writeVariant(writer, item->value(), role);
+        }
+
+    }
+    foreach (SessionItem *child_item, item->childItems()) {
+        writeItemAndChildItems(writer, child_item);
+    }
+    if (item->parent()) {
+        writer->writeEndElement(); // ItemTag
+    }
+}
+
+void SessionWriter::writeVariant(QXmlStreamWriter *writer, QVariant variant, int role)
+{
+    if (variant.isValid()) {
+        writer->writeStartElement(SessionXML::ParameterTag);
+        QString type_name = variant.typeName();
+        writer->writeAttribute(SessionXML::ParameterTypeAttribute, type_name);
+        writer->writeAttribute(SessionXML::ParameterRoleAttribute, QString::number(role));
+
+        if (type_name == QString("double")) {
+            writer->writeAttribute(SessionXML::ParameterValueAttribute,
+                                   QString::number(variant.toDouble(), 'e', 12));
+        }
+
+        else if (type_name == QString("int")) {
+            writer->writeAttribute(SessionXML::ParameterValueAttribute,
+                                   QString::number(variant.toInt()));
+        }
+
+        else if (type_name == QString("bool")) {
+            writer->writeAttribute(SessionXML::ParameterValueAttribute,
+                                   QString::number(variant.toBool()));
+        }
+
+        else if (type_name == QString("QString")) {
+            writer->writeAttribute(SessionXML::ParameterValueAttribute, variant.toString());
+        }
+
+        else if (type_name == QString("MaterialProperty")) {
+            MaterialProperty material_property = variant.value<MaterialProperty>();
+            writer->writeAttribute(SessionXML::ParameterValueAttribute,
+                                   material_property.getName());
+            writer->writeAttribute(SessionXML::IdentifierAttribute,
+                                   material_property.getIdentifier());
+
+        }
+
+        else if (type_name == QString("ComboProperty")) {
+            writer->writeAttribute(SessionXML::ParameterValueAttribute,
+                                   variant.value<ComboProperty>().getValue());
+        }
+
+        else if (type_name == QString("ScientificDoubleProperty")) {
+            writer->writeAttribute(SessionXML::ParameterValueAttribute,
+                                   variant.value<ScientificDoubleProperty>().getText());
+
+        }
+
+        else if (type_name == QString("GroupProperty_t")) {
+            QString ff_name = variant.value<GroupProperty_t>()->getCurrentType();
+            writer->writeAttribute(SessionXML::ParameterValueAttribute, ff_name);
+        }
+
+        else if (type_name == QString("ColorProperty")) {
+            int r, g, b, a;
+            QColor material_color = variant.value<ColorProperty>().getColor();
+            material_color.getRgb(&r, &g, &b, &a);
+            writer->writeAttribute(SessionXML::ColorRedAttribute, QString::number(r));
+            writer->writeAttribute(SessionXML::ColorGreenAttribute, QString::number(g));
+            writer->writeAttribute(SessionXML::ColorBlueAttribute, QString::number(b));
+            writer->writeAttribute(SessionXML::ColorAlphaAttribute, QString::number(a));
+        }
+
+        else if (type_name == QString("AngleProperty")) {
+            double value = variant.value<AngleProperty>().getValueInRadians();
+            writer->writeAttribute(SessionXML::ParameterValueAttribute,
+                                   QString::number(value, 'g'));
+            writer->writeAttribute(SessionXML::AngleUnitsAttribute,
+                                   variant.value<AngleProperty>().getUnits());
+
+        } else {
+            throw GUIHelpers::Error("SessionModel::writeProperty: Parameter type not supported " + type_name);
+        }
+
+        writer->writeEndElement(); // end ParameterTag
+    }
+}
+
+void SessionReader::readItems(QXmlStreamReader *reader, SessionItem *item, const QString &topTag,
+                              WarningMessageService *messageService)
+{
+    bool isTopItem = true;
+    qDebug() << "SessionModel::readItems()  item:" << item << "topTag:" << topTag;
+    if(item) qDebug() << "  item" << item->modelType();
+    const QString modelType = item->model()->getModelTag();
+    while (!reader->atEnd()) {
+        reader->readNext();
+        if (reader->isStartElement()) {
+            if (reader->name() == SessionXML::ItemTag) {
+                const QString model_type
+                    = reader->attributes().value(SessionXML::ModelTypeAttribute).toString();
+                QString tag = reader->attributes().value(SessionXML::TagAttribute).toString();
+                if (isTopItem) {
+                    tag = topTag;
+                }
+                if (tag == SessionItem::P_NAME)
+                    item->setItemName("");
+                if (model_type == Constants::PropertyType || model_type == Constants::GroupItemType) {
+                    SessionItem *newItem = item->getItem(tag);
+                    if (!newItem) {
+                        QString message = QString("Unrecoverable read error for model '%1', "
+                            "Can't get item for tag '%2'").arg(item->model()->getModelTag()).arg(tag);
+                        throw GUIHelpers::Error(message);
+                    }
+                    item = newItem;
+
+                } else if (item->modelType() == Constants::GroupItemType) {
+                    SessionItem *newItem = item->parent()->getGroupItem(item->parent()
+                                                ->tagFromItem(item), model_type);
+                    if (!newItem) {
+                        QString message = QString("Unrecoverable read error for model '%1', "
+                            "Can't get group item").arg(item->model()->getModelTag());
+                        throw GUIHelpers::Error(message);
+                    }
+                    item = newItem;
+
+                } else {
+                    if (tag == "")
+                        tag = item->defaultTag();
+
+                    SessionItem *newItem(0);
+                    SessionTagInfo info = item->getTagInfo(tag);
+                    if (info.min == 1 && info.max == 1 && info.childCount == 1) {
+                        newItem = item->getItem(tag);
+                    } else {
+                        newItem = ItemFactory::createItem(model_type);
+                        if (!item->insertItem(-1, newItem, tag)) {
+                            QString message = QString("Attempt to create item '%1' for tag '%2' failed")
+                                              .arg(model_type).arg(tag);
+                            report_error(messageService, item, ITEM_IS_NOT_INITIALIZED, message);
+                            return;
+                        }
+
+                    }
+
+                    if (!newItem) {
+                        QString message = QString("Unrecoverable read error for model '%1', "
+                            "Can't add item for tag").arg(item->model()->getModelTag()).arg(tag);
+                        throw GUIHelpers::Error(message);
+                    }
+
+                    if (reader->attributes().hasAttribute(SessionXML::DisplayNameAttribute)) {
+                        newItem->setDisplayName(reader->attributes().value(SessionXML::DisplayNameAttribute).toString());
+                    }
+                    item = newItem;
+                }
+                if (!item) {
+//                    tag = -1;
+                }
+
+//                tag = -1; // all but the first item should be appended
+                isTopItem = false;
+
+            } else if (reader->name() == SessionXML::ParameterTag) {
+                readProperty(reader, item, messageService);
+            }
+        } else if (reader->isEndElement()) {
+            if (reader->name() == SessionXML::ItemTag) {
+                if(item) {
+                    item = item->parent();
+                } else {
+                    // handling the case when reading obsolete project file, when SubItem doesn't exist anymore
+                    qDebug() << "!!";
+                    Q_ASSERT(0);
+                }
+            }
+            if (reader->name() == modelType) {
+                break;
+            }
+            if (reader->name() == SessionXML::ParameterTag) {
+            }
+        }
+    }
+}
+
+QString SessionReader::readProperty(QXmlStreamReader *reader,
+        SessionItem *item, WarningMessageService *messageService)
+{
+//    qDebug() << "SessionModel::readProperty() for" << item;
+    if (item)
+        qDebug() << item->modelType();
+    const QString parameter_name
+        = reader->attributes().value(SessionXML::ParameterNameAttribute).toString();
+    const QString parameter_type
+        = reader->attributes().value(SessionXML::ParameterTypeAttribute).toString();
+    const int role
+            = reader->attributes().value(SessionXML::ParameterRoleAttribute).toInt();
+
+    if(!item) {
+        QString message = QString("Attempt to set property '%1' for non existing item")
+                          .arg(parameter_name);
+        report_error(messageService, item, ITEM_IS_NOT_INITIALIZED, message);
+        return parameter_name;
+    }
+
+    QVariant variant;
+    if (parameter_type == "double") {
+        double parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toDouble();
+        variant = parameter_value;
+
+    }
+
+    else if (parameter_type == "int") {
+        int parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toInt();
+        variant = parameter_value;
+    }
+
+    else if (parameter_type == "bool") {
+        bool parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toInt();
+        variant = parameter_value;
+
+    }
+
+    else if (parameter_type == "QString") {
+        QString parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toString();
+        variant = parameter_value;
+
+    }
+
+    else if (parameter_type == "MaterialProperty") {
+        QString identifier = reader->attributes().value(SessionXML::IdentifierAttribute).toString();
+
+        MaterialProperty material_property(identifier);
+        variant = material_property.getVariant();
+    }
+
+    else if (parameter_type == "ComboProperty") {
+        QString parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toString();
+
+        ComboProperty combo_property
+            = item->value().value<ComboProperty>();
+        if (combo_property.getValues().contains(parameter_value)) {
+            combo_property.setValue(parameter_value);
+        }
+        combo_property.setCachedValue(parameter_value);
+        variant = combo_property.getVariant();
+    }
+
+    else if (parameter_type == "ScientificDoubleProperty") {
+        double parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toDouble();
+
+        ScientificDoubleProperty scdouble_property(parameter_value);
+        QVariant v;
+        v.setValue(scdouble_property);
+        variant = v;
+    }
+
+    else if (parameter_type == "GroupProperty_t") {
+        QString parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toString();
+
+        QVariant v = item->value();
+        if(!v.canConvert<GroupProperty_t>()) {
+            report_error(messageService, item, SET_ITEM_PROPERTY_ERROR,
+                         QStringLiteral("GroupProperty conversion failed"));
+        } else {
+            GroupProperty_t group_property = v.value<GroupProperty_t>();
+            group_property->setCurrentType(parameter_value);
+            variant = QVariant::fromValue<GroupProperty_t>(group_property);
+        }
+
+    }
+
+    else if (parameter_type == "ColorProperty") {
+        int r = reader->attributes().value(SessionXML::ColorRedAttribute).toInt();
+        int g = reader->attributes().value(SessionXML::ColorGreenAttribute).toInt();
+        int b = reader->attributes().value(SessionXML::ColorBlueAttribute).toInt();
+        int a = reader->attributes().value(SessionXML::ColorAlphaAttribute).toInt();
+        ColorProperty color(QColor(r, g, b, a));
+        variant = color.getVariant();
+    }
+
+    else if (parameter_type == "AngleProperty") {
+        double parameter_value
+            = reader->attributes().value(SessionXML::ParameterValueAttribute).toDouble();
+        QString units = reader->attributes().value(SessionXML::AngleUnitsAttribute).toString();
+        AngleProperty angle_property(parameter_value, Constants::UnitsRadians);
+        angle_property.setUnits(units);
+        variant = angle_property.getVariant();
+    }
+
+    else {
+        throw GUIHelpers::Error("SessionModel::readProperty: "
+                                "Parameter type not supported" + parameter_type);
+    }
+
+    if (variant.isValid()) {
+        item->setData(role, variant);
+    }
+
+    return parameter_name;
+}
+
+void SessionReader::report_error(WarningMessageService *messageService,
+                                 SessionItem *item, const QString &error_type,
+                                 const QString &message)
+{
+    if(messageService) {
+        messageService->send_message(item->model(), error_type, message);
+    } else {
+        throw GUIHelpers::Error(error_type + QString(" ") + message);
+    }
+}
diff --git a/GUI/coregui/Models/SessionXML.h b/GUI/coregui/Models/SessionXML.h
new file mode 100644
index 0000000..e3ce0ff
--- /dev/null
+++ b/GUI/coregui/Models/SessionXML.h
@@ -0,0 +1,88 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SessionXML.h
+//! @brief     Defines reader and writer classes for SessionModel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONXML_H
+#define SESSIONXML_H
+
+#include "WinDllMacros.h"
+#include <QVariant>
+
+class QXmlStreamWriter;
+class QXmlStreamReader;
+class SessionItem;
+class WarningMessageService;
+
+namespace SessionXML {
+const QString ItemMimeType = "application/org.bornagainproject.xml.item.z";
+const QString LinkMimeType = "application/org.bornagainproject.fittinglink";
+
+const QString ModelTag("SessionModel");
+const QString InstrumentModelTag("InstrumentModel");
+const QString SampleModelTag("SampleModel");
+const QString MaterialModelTag("MaterialModel");
+const QString FitModelTag("FitModel");
+const QString JobModelTag("JobModel");
+const QString MaskModelTag("MaskModel");
+const QString DocumentModelTag("DocumentModel");
+const QString RealDataModelTag("RealDataModel");
+
+const QString TagAttribute("Tag");
+
+const QString ModelNameAttribute("Name");
+const QString ItemTag("Item");
+const QString ModelTypeAttribute("ModelType");
+const QString DisplayNameAttribute("DisplayName");
+const QString ParameterTag("Parameter");
+const QString ParameterNameAttribute("ParName");
+const QString ParameterTypeAttribute("ParType");
+const QString ParameterValueAttribute("ParValue");
+const QString ParameterRoleAttribute("ParRole");
+
+const QString IdentifierAttribute("Identifier");
+
+const QString ColorRedAttribute("Red");
+const QString ColorGreenAttribute("Green");
+const QString ColorBlueAttribute("Blue");
+const QString ColorAlphaAttribute("Alpha");
+
+const QString AngleUnitsAttribute("Units");
+
+}
+
+class BA_CORE_API_ SessionWriter
+{
+public:
+    static void writeTo(QXmlStreamWriter *writer, SessionItem *parent);
+    static void writeItemAndChildItems(QXmlStreamWriter *writer, const SessionItem *item);
+private:
+    static void writeVariant(QXmlStreamWriter *writer, QVariant variant, int role);
+};
+
+class BA_CORE_API_ SessionReader
+{
+public:
+    static void readItems(QXmlStreamReader *reader, SessionItem *item,
+                          const QString &topTag = QString(),
+                          WarningMessageService *messageService=0);
+private:
+    static QString readProperty(QXmlStreamReader *reader, SessionItem *item,
+                                WarningMessageService *messageService=0);
+
+    static void report_error(WarningMessageService *messageService, SessionItem *item,
+                      const QString &error_type, const QString &message);
+};
+
+#endif // SESSIONXML_H
diff --git a/GUI/coregui/Models/SimulationOptionsItem.cpp b/GUI/coregui/Models/SimulationOptionsItem.cpp
new file mode 100644
index 0000000..d551eb9
--- /dev/null
+++ b/GUI/coregui/Models/SimulationOptionsItem.cpp
@@ -0,0 +1,152 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SimulationOptionsItem.cpp
+//! @brief     Defines class SimulationOptionsItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationOptionsItem.h"
+#include "ComboProperty.h"
+#include "Utils.h"
+
+namespace
+{
+
+QStringList getRunPolicyTooltips()
+{
+    QStringList result;
+    result.append(QStringLiteral("Start simulation immediately, switch to Jobs view automatically when completed"));
+    result.append(QStringLiteral("Start simulation immediately, do not switch to Jobs view when completed"));
+    result.append(QStringLiteral("Only submit simulation for consequent execution,"
+                " has to be started from Jobs view explicitely"));
+    return result;
+}
+
+const QString tooltip_runpolicy = "Defines run policy for the simulation";
+const QString tooltip_nthreads = "Defines number of threads to use for the simulation.";
+const QString tooltip_computation =
+        "Defines computation method (analytical or Monte-Carlo integration)";
+
+}
+
+
+const QString SimulationOptionsItem::P_RUN_POLICY = "Run Policy";
+const QString SimulationOptionsItem::P_NTHREADS = "Number of Threads";
+const QString SimulationOptionsItem::P_COMPUTATION_METHOD = "Computation method";
+const QString SimulationOptionsItem::P_MC_POINTS = "Number of MC points";
+
+
+SimulationOptionsItem::SimulationOptionsItem()
+    : SessionItem(Constants::SimulationOptionsType)
+{
+
+    ComboProperty policy;
+    policy << Constants::JOB_RUN_IMMEDIATELY
+           << Constants::JOB_RUN_IN_BACKGROUND
+           << Constants::JOB_RUN_SUBMIT_ONLY;
+    policy.setToolTips(getRunPolicyTooltips());
+    addProperty(P_RUN_POLICY, policy.getVariant())->setToolTip(tooltip_runpolicy);
+
+    ComboProperty nthreads;
+    nthreads << getCPUUsageOptions();
+    addProperty(P_NTHREADS, nthreads.getVariant())->setToolTip(tooltip_nthreads);
+
+    ComboProperty computationMethod;
+    computationMethod << Constants::SIMULATION_ANALYTICAL << Constants::SIMULATION_MONTECARLO;
+    addProperty(P_COMPUTATION_METHOD, computationMethod.getVariant())->setToolTip(tooltip_computation);
+
+    addProperty(P_MC_POINTS, 100)->setEnabled(false);
+
+    mapper()->setOnPropertyChange(
+        [this](const QString &name) {
+            if(name == P_COMPUTATION_METHOD && isTag(P_MC_POINTS)) {
+                ComboProperty combo = getItemValue(P_COMPUTATION_METHOD).value<ComboProperty>();
+
+                if(combo.getValue() == Constants::SIMULATION_ANALYTICAL) {
+                    getItem(P_MC_POINTS)->setEnabled(false);
+
+                } else {
+                    getItem(P_MC_POINTS)->setEnabled(true);
+                }
+            }
+    });
+
+
+}
+
+int SimulationOptionsItem::getNumberOfThreads() const
+{
+    ComboProperty combo = getItemValue(P_NTHREADS).value<ComboProperty>();
+    foreach(QChar ch, combo.getValue()) {
+        if(ch.isDigit()) return ch.digitValue();
+    }
+    return 0;
+}
+
+bool SimulationOptionsItem::runImmediately() const
+{
+    ComboProperty combo = getItemValue(P_RUN_POLICY).value<ComboProperty>();
+    return combo.getValue() == Constants::JOB_RUN_IMMEDIATELY;
+}
+
+bool SimulationOptionsItem::runInBackground() const
+{
+    ComboProperty combo = getItemValue(P_RUN_POLICY).value<ComboProperty>();
+    return combo.getValue() == Constants::JOB_RUN_IN_BACKGROUND;
+}
+
+void SimulationOptionsItem::setRunPolicy(const QString &policy)
+{
+    ComboProperty combo = getItemValue(P_RUN_POLICY).value<ComboProperty>();
+    combo.setValue(policy);
+    setItemValue(P_RUN_POLICY, combo.getVariant());
+}
+
+void SimulationOptionsItem::setComputationMethod(const QString &name)
+{
+    ComboProperty combo = getItemValue(P_COMPUTATION_METHOD).value<ComboProperty>();
+    combo.setValue(name);
+    setItemValue(P_COMPUTATION_METHOD, combo.getVariant());
+}
+
+QString SimulationOptionsItem::getComputationMethod() const
+{
+    ComboProperty combo = getItemValue(P_COMPUTATION_METHOD).value<ComboProperty>();
+    return combo.getValue();
+}
+
+int SimulationOptionsItem::getNumberOfMonteCarloPoints() const
+{
+    return getItemValue(P_MC_POINTS).toInt();
+}
+
+void SimulationOptionsItem::setNumberOfMonteCarloPoints(int npoints)
+{
+    setItemValue(P_MC_POINTS, npoints);
+}
+
+//! returns list with number of threads to select
+QStringList SimulationOptionsItem::getCPUUsageOptions()
+{
+    QStringList result;
+    int nthreads = Utils::System::getThreadHardwareConcurrency();
+    for(int i = nthreads; i>0; i--){
+        if(i == nthreads) {
+            result.append(QString("Max (%1 threads)").arg(QString::number(i)));
+        } else if(i == 1) {
+            result.append(QString("%1 thread").arg(QString::number(i)));
+        } else {
+            result.append(QString("%1 threads").arg(QString::number(i)));
+        }
+    }
+    return result;
+}
diff --git a/GUI/coregui/Models/SimulationOptionsItem.h b/GUI/coregui/Models/SimulationOptionsItem.h
new file mode 100644
index 0000000..6f7d218
--- /dev/null
+++ b/GUI/coregui/Models/SimulationOptionsItem.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SimulationOptionsItem.h
+//! @brief     Defines class SimulationOptionsItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONOPTIONSITEM_H
+#define SIMULATIONOPTIONSITEM_H
+
+#include "SessionItem.h"
+
+//! The SimulationOptionsItem class holds simulation status (run policy, number of threads,
+//! integration flag). Used in SimulationView to define job settings. When job is started,
+//! item is copied to the job as a child.
+
+class BA_CORE_API_ SimulationOptionsItem : public SessionItem
+{
+public:
+    static const QString P_RUN_POLICY;
+    static const QString P_NTHREADS;
+    static const QString P_COMPUTATION_METHOD;
+    static const QString P_MC_POINTS;
+
+    explicit SimulationOptionsItem();
+
+    int getNumberOfThreads() const;
+    bool runImmediately() const;
+    bool runInBackground() const;
+
+    void setRunPolicy(const QString &policy);
+
+    void setComputationMethod(const QString &name);
+    QString getComputationMethod() const;
+
+    int getNumberOfMonteCarloPoints() const;
+    void setNumberOfMonteCarloPoints(int npoints);
+
+private:
+    QStringList getCPUUsageOptions();
+};
+
+#endif // SIMULATIONOPTIONSITEM_H
diff --git a/GUI/coregui/Models/SphericalDetectorItem.cpp b/GUI/coregui/Models/SphericalDetectorItem.cpp
new file mode 100644
index 0000000..0c9a56c
--- /dev/null
+++ b/GUI/coregui/Models/SphericalDetectorItem.cpp
@@ -0,0 +1,81 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SphericalDetectorItem.cpp
+//! @brief     Implements class SphericalDetectorItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SphericalDetectorItem.h"
+#include "AxesItems.h"
+#include "ResolutionFunctionItems.h"
+#include "SphericalDetector.h"
+#include "Units.h"
+
+const QString SphericalDetectorItem::P_PHI_AXIS = "Phi axis";
+const QString SphericalDetectorItem::P_ALPHA_AXIS = "Alpha axis";
+const QString SphericalDetectorItem::P_RESOLUTION_FUNCTION = "Type";
+
+SphericalDetectorItem::SphericalDetectorItem()
+    : SessionItem(Constants::SphericalDetectorType)
+{
+    SessionItem *item = addGroupProperty(P_PHI_AXIS, Constants::BasicAxisType);
+    item->getItem(BasicAxisItem::P_TITLE)->setVisible(false);
+    item->setItemValue(BasicAxisItem::P_MIN, -1.0);
+    item->setItemValue(BasicAxisItem::P_MAX, 1.0);
+
+    item = addGroupProperty(P_ALPHA_AXIS, Constants::BasicAxisType);
+    item->getItem(BasicAxisItem::P_TITLE)->setVisible(false);
+    item->setItemValue(BasicAxisItem::P_MIN, 0.0);
+    item->setItemValue(BasicAxisItem::P_MAX, 2.0);
+
+    addGroupProperty(P_RESOLUTION_FUNCTION, Constants::ResolutionFunctionGroup);
+    setGroupProperty(P_RESOLUTION_FUNCTION, Constants::ResolutionFunctionNoneType);
+}
+
+std::unique_ptr<IDetector2D> SphericalDetectorItem::createDetector() const
+{
+    std::unique_ptr<SphericalDetector> result(new SphericalDetector());
+
+    auto x_axis = dynamic_cast<BasicAxisItem *>(
+        getItem(SphericalDetectorItem::P_PHI_AXIS));
+    Q_ASSERT(x_axis);
+    int n_x = x_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+    double x_min
+        = Units::deg2rad(x_axis->getItemValue(BasicAxisItem::P_MIN).toDouble());
+    double x_max
+        = Units::deg2rad(x_axis->getItemValue(BasicAxisItem::P_MAX).toDouble());
+
+    auto y_axis = dynamic_cast<BasicAxisItem *>(
+        getItem(SphericalDetectorItem::P_ALPHA_AXIS));
+    Q_ASSERT(y_axis);
+    int n_y = y_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+    double y_min
+        = Units::deg2rad(y_axis->getItemValue(BasicAxisItem::P_MIN).toDouble());
+    double y_max
+        = Units::deg2rad(y_axis->getItemValue(BasicAxisItem::P_MAX).toDouble());
+
+    result->setDetectorParameters(n_x, x_min, x_max, n_y, y_min, y_max);
+
+    return std::move(result);
+}
+
+std::unique_ptr<IResolutionFunction2D> SphericalDetectorItem::createResolutionFunction()
+{
+    // setting up resolution function
+    auto resfuncItem = dynamic_cast<ResolutionFunctionItem *>(
+        getGroupItem(P_RESOLUTION_FUNCTION));
+    Q_ASSERT(resfuncItem);
+
+    std::unique_ptr<IResolutionFunction2D> result(resfuncItem->createResolutionFunction(Units::degree));
+
+    return result;
+}
diff --git a/GUI/coregui/Models/SphericalDetectorItem.h b/GUI/coregui/Models/SphericalDetectorItem.h
new file mode 100644
index 0000000..6e0fc93
--- /dev/null
+++ b/GUI/coregui/Models/SphericalDetectorItem.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/SphericalDetectorItem.h
+//! @brief     Defines class SphericalDetectorItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPHERICALDETECTORITEM_H
+#define SPHERICALDETECTORITEM_H
+
+#include "SessionItem.h"
+
+class IDetector2D;
+class IResolutionFunction2D;
+
+class SphericalDetectorItem : public SessionItem
+{
+public:
+    static const QString P_PHI_AXIS;
+    static const QString P_ALPHA_AXIS;
+    static const QString P_RESOLUTION_FUNCTION;
+    explicit SphericalDetectorItem();
+
+    std::unique_ptr<IDetector2D> createDetector() const;
+    std::unique_ptr<IResolutionFunction2D> createResolutionFunction();
+
+};
+
+#endif // SPHERICALDETECTORITEM_H
diff --git a/GUI/coregui/Models/TestItem.cpp b/GUI/coregui/Models/TestItem.cpp
new file mode 100644
index 0000000..081abe3
--- /dev/null
+++ b/GUI/coregui/Models/TestItem.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TestItem.cpp
+//! @brief     Implements class TestItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "TestItem.h"
+#include "ComboProperty.h"
+
+const QString TestItem::P_DISTRIBUTION = "Distribution";
+const QString TestItem::P_VALUE = "Value";
+const QString TestItem::P_COMBO = "Combo";
+const QString TestItem::P_VECTOR = "Vector";
+TestItem::TestItem()
+    : SessionItem(QString("TestItem"))
+{
+    addGroupProperty(P_DISTRIBUTION, Constants::DistributionExtendedGroup);
+    addProperty(P_VALUE, 99.0);
+    ComboProperty types;
+    types << "property 1" << "property 2" << "property 3";
+    addProperty(P_COMBO, types.getVariant());
+    addGroupProperty(P_VECTOR, Constants::VectorType);
+}
diff --git a/GUI/coregui/Models/TestItem.h b/GUI/coregui/Models/TestItem.h
new file mode 100644
index 0000000..8889d4f
--- /dev/null
+++ b/GUI/coregui/Models/TestItem.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TestItem.h
+//! @brief     Defines class TestItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TESTITEM_H
+#define TESTITEM_H
+
+#include "SessionItem.h"
+
+//! The TestItem class for TestSessionItem unit tests and for checking AwesomePropertyEditor machinery
+class BA_CORE_API_ TestItem : public SessionItem
+{
+
+public:
+    static const QString P_DISTRIBUTION;
+    static const QString P_VALUE;
+    static const QString P_COMBO;
+    static const QString P_VECTOR;
+    explicit TestItem();
+    virtual ~TestItem(){}
+};
+
+#endif // TESTITEM_H
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
new file mode 100644
index 0000000..610c767
--- /dev/null
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -0,0 +1,791 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TransformFromDomain.cpp
+//! @brief     Implements namespace TransformFromDomain
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "TransformFromDomain.h"
+#include "AxesItems.h"
+#include "Beam.h"
+#include "BeamAngleItems.h"
+#include "BeamItem.h"
+#include "BornAgainNamespace.h"
+#include "ComboProperty.h"
+#include "ConvolutionDetectorResolution.h"
+#include "DetectorItems.h"
+#include "Distributions.h"
+#include "Ellipse.h"
+#include "FTDecayFunctionItems.h"
+#include "FTDistributionItems.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "InfinitePlane.h"
+#include "InterferenceFunctionItems.h"
+#include "InterferenceFunctions.h"
+#include "LatticeTypeItems.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerItem.h"
+#include "LayerRoughness.h"
+#include "LayerRoughnessItems.h"
+#include "Line.h"
+#include "MaskItems.h"
+#include "ModelPath.h"
+#include "Numeric.h"
+#include "ParameterPattern.h"
+#include "ParticleDistributionItem.h"
+#include "ParticleItem.h"
+#include "Polygon.h"
+#include "Rectangle.h"
+#include "RegionOfInterest.h"
+#include "RectangularDetector.h"
+#include "ResolutionFunctionItems.h"
+#include "SphericalDetector.h"
+#include "Units.h"
+#include "VectorItem.h"
+#include <QDebug>
+#include <limits>
+
+using namespace BornAgain;
+
+void SetPDF1D(SessionItem* item, const IFTDistribution1D* pdf, QString group_name);
+void setPDF2D(SessionItem* item, const IFTDistribution2D* pdf, QString group_name);
+void SetDecayFunction1D(SessionItem* item, const IFTDecayFunction1D* pdf, QString group_name);
+void SetDecayFunction2D(SessionItem* item, const IFTDecayFunction2D* pdf, QString group_name);
+
+void set2DLatticeParameters(SessionItem* item, Lattice2DParameters lattice_params,
+                            SessionItem* lattice_item);
+void setDistribution(SessionItem* item, ParameterDistribution par_distr,
+                     QString group_name, double factor = 1.0);
+
+void TransformFromDomain::setItemFromSample(SessionItem* item,
+                                            const InterferenceFunctionRadialParaCrystal* sample)
+{
+    item->setItemValue(InterferenceFunctionRadialParaCrystalItem::P_PEAK_DISTANCE,
+                                sample->getPeakDistance());
+    item->setItemValue(InterferenceFunctionRadialParaCrystalItem::P_DAMPING_LENGTH,
+                                sample->getDampingLength());
+    item->setItemValue(InterferenceFunctionRadialParaCrystalItem::P_DOMAIN_SIZE,
+                                sample->getDomainSize());
+    item->setItemValue(InterferenceFunctionRadialParaCrystalItem::P_KAPPA,
+                                sample->getKappa());
+
+    const IFTDistribution1D* ipdf = sample->getProbabilityDistribution();
+    QString group_name = InterferenceFunctionRadialParaCrystalItem::P_PDF;
+    qDebug() << "    group_name" << group_name;
+    SetPDF1D(item, ipdf, group_name);
+}
+
+void TransformFromDomain::setItemFromSample(SessionItem* item,
+                                            const InterferenceFunction2DParaCrystal* sample)
+{
+    SessionItem* lattice_item(0);
+    Lattice2DParameters lattice_params = sample->getLatticeParameters();
+    set2DLatticeParameters(item, lattice_params, lattice_item);
+
+    item->setItemValue(InterferenceFunction2DParaCrystalItem::P_DAMPING_LENGTH,
+                                sample->getDampingLength());
+    item->setItemValue(InterferenceFunction2DParaCrystalItem::P_DOMAIN_SIZE1,
+                                sample->getDomainSizes()[0]);
+    item->setItemValue(InterferenceFunction2DParaCrystalItem::P_DOMAIN_SIZE2,
+                                sample->getDomainSizes()[1]);
+    item->setItemValue(InterferenceFunction2DParaCrystalItem::P_XI_INTEGRATION,
+                                sample->getIntegrationOverXi());
+
+    std::vector<const IFTDistribution2D*> pdfs = sample->getProbabilityDistributions();
+    QStringList group_names;
+    group_names << InterferenceFunction2DParaCrystalItem::P_PDF1
+                << InterferenceFunction2DParaCrystalItem::P_PDF2;
+    for (size_t i = 0; i < pdfs.size(); ++i) {
+        qDebug() << "    group_name" << group_names[i];
+        setPDF2D(item, pdfs[i], group_names[i]);
+    }
+}
+
+void TransformFromDomain::setItemFromSample(SessionItem* item,
+                                            const InterferenceFunction1DLattice* sample)
+{
+    Lattice1DParameters lattice_params = sample->getLatticeParameters();
+    item->setItemValue(InterferenceFunction1DLatticeItem::P_LENGTH,
+                                lattice_params.m_length);
+    item->setItemValue(InterferenceFunction1DLatticeItem::P_ROTATION_ANGLE,
+                                Units::rad2deg(lattice_params.m_xi));
+
+    const IFTDecayFunction1D* pdf = sample->getDecayFunction();
+    QString group_name = InterferenceFunction1DLatticeItem::P_DECAY_FUNCTION;
+    qDebug() << "    group_name" << group_name;
+    SetDecayFunction1D(item, pdf, group_name);
+}
+
+void TransformFromDomain::setItemFromSample(SessionItem* item,
+                                            const InterferenceFunction2DLattice* sample)
+{
+    SessionItem* lattice_item(0);
+    Lattice2DParameters lattice_params = sample->getLatticeParameters();
+    set2DLatticeParameters(item, lattice_params, lattice_item);
+
+    const IFTDecayFunction2D* p_pdf = sample->getDecayFunction();
+    QString group_name = InterferenceFunction2DLatticeItem::P_DECAY_FUNCTION;
+    qDebug() << "    group_name" << group_name;
+    SetDecayFunction2D(item, p_pdf, group_name);
+}
+
+void TransformFromDomain::setItemFromSample(SessionItem* layerItem, const Layer* layer,
+                                            const LayerInterface* top_interface)
+{
+    layerItem->setItemValue(LayerItem::P_THICKNESS, layer->getThickness());
+    layerItem->setGroupProperty(LayerItem::P_ROUGHNESS, Constants::LayerZeroRoughnessType);
+
+    if (top_interface) {
+        const LayerRoughness* roughness = top_interface->getRoughness();
+        if (TransformFromDomain::isValidRoughness(roughness)) {
+            SessionItem* roughnessItem = layerItem->setGroupProperty(
+                LayerItem::P_ROUGHNESS, Constants::LayerBasicRoughnessType);
+            TransformFromDomain::setItemFromSample(roughnessItem, roughness);
+        }
+    }
+}
+
+void TransformFromDomain::setItemFromSample(SessionItem* item, const LayerRoughness* sample)
+{
+    item->setItemValue(LayerBasicRoughnessItem::P_SIGMA, sample->getSigma());
+    item->setItemValue(LayerBasicRoughnessItem::P_HURST, sample->getHurstParameter());
+    item->setItemValue(LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH,
+                                sample->getLatteralCorrLength());
+}
+
+//! Initialization of ParticleDistributionItem
+void TransformFromDomain::setItemFromSample(SessionItem* item,
+                                            const ParticleDistribution* sample)
+{
+    item->setItemValue(ParticleItem::P_ABUNDANCE, sample->getAbundance());
+
+    ParameterDistribution par_distr = sample->getParameterDistribution();
+    QString main_distr_par_name = QString::fromStdString(par_distr.getMainParameterName());
+    ComboProperty combo_property
+        = item->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
+              .value<ComboProperty>();
+    combo_property.setCachedValue(main_distr_par_name);
+    combo_property.setCacheContainsGUIFlag(false);
+    item->setItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER,
+                                combo_property.getVariant());
+
+    QString group_name = ParticleDistributionItem::P_DISTRIBUTION;
+    setDistribution(item, par_distr, group_name);
+}
+
+//! Returns true if given roughness is non-zero roughness
+bool TransformFromDomain::isValidRoughness(const LayerRoughness* roughness)
+{
+    if (!roughness)
+        return false;
+    if (roughness->getSigma() == 0 && roughness->getHurstParameter() == 0.0
+        && roughness->getLatteralCorrLength() == 0.0)
+        return false;
+    return true;
+}
+
+bool TransformFromDomain::isSquareLattice(double length1, double length2, double angle)
+{
+    return length1 == length2 && Numeric::areAlmostEqual(angle, M_PI / 2.0);
+}
+
+bool TransformFromDomain::isHexagonalLattice(double length1, double length2, double angle)
+{
+    return length1 == length2 && Numeric::areAlmostEqual(angle, M_TWOPI / 3.0);
+}
+
+void TransformFromDomain::setItemFromSample(BeamItem* beamItem, const GISASSimulation& simulation)
+{
+    Q_ASSERT(beamItem);
+    Beam beam = simulation.getInstrument().getBeam();
+
+    beamItem->setIntensity(beam.getIntensity());
+    beamItem->setWavelength(beam.getWavelength());
+    beamItem->setInclinationAngle(Units::rad2deg(beam.getAlpha()));
+    beamItem->setAzimuthalAngle(Units::rad2deg(beam.getPhi()));
+
+    // distribution parameters
+    const DistributionHandler::Distributions_t distributions
+        = simulation.getDistributionHandler().getDistributions();
+    for (size_t i = 0; i < distributions.size(); ++i) {
+        ParameterPattern pattern_wavelength;
+        pattern_wavelength.beginsWith("*").add(BeamType).add(Wavelength);
+        ParameterPattern pattern_alpha;
+        pattern_alpha.beginsWith("*").add(BeamType).add(Inclination);
+        ParameterPattern pattern_phi;
+        pattern_phi.beginsWith("*").add(BeamType).add(Azimuth);
+        std::string mainParameterName = distributions[i].getMainParameterName();
+        if (mainParameterName == pattern_wavelength.toStdString()) {
+            BeamDistributionItem* beamWavelength = dynamic_cast<BeamDistributionItem*>(
+                beamItem->getItem(BeamItem::P_WAVELENGTH));
+            setItemFromSample(beamWavelength, distributions[i]);
+        } else if (mainParameterName == pattern_alpha.toStdString()) {
+            BeamDistributionItem* inclinationAngle = dynamic_cast<BeamDistributionItem*>(
+                beamItem->getItem(BeamItem::P_INCLINATION_ANGLE));
+            setItemFromSample(inclinationAngle, distributions[i]);
+        } else if (mainParameterName == pattern_phi.toStdString()) {
+            BeamDistributionItem* azimuthalAngle = dynamic_cast<BeamDistributionItem*>(
+                beamItem->getItem(BeamItem::P_AZIMUTHAL_ANGLE));
+            setItemFromSample(azimuthalAngle, distributions[i]);
+        }
+    }
+}
+
+void TransformFromDomain::setItemFromSample(DetectorItem* detectorItem,
+                                            const GISASSimulation& simulation)
+{
+    Q_ASSERT(detectorItem);
+    const IDetector2D* iDetector = simulation.getInstrument().getDetector();
+    if(auto detector = dynamic_cast<const SphericalDetector*>(iDetector)) {
+        auto item = dynamic_cast<SphericalDetectorItem*>
+                (detectorItem->setGroupProperty(DetectorItem::P_DETECTOR,
+                                             Constants::SphericalDetectorType));
+        Q_ASSERT(item);
+        setItemFromSample(item,* detector);
+    }
+
+    else if(auto detector = dynamic_cast<const RectangularDetector*>(iDetector)) {
+        auto item = dynamic_cast<RectangularDetectorItem*>
+                (detectorItem->setGroupProperty(DetectorItem::P_DETECTOR,
+                                             Constants::RectangularDetectorType));
+        Q_ASSERT(item);
+        setItemFromSample(item,* detector);
+    }
+
+    else {
+        throw GUIHelpers::Error(
+            "TransformFromDomain::setItemFromSample(DetectorItem*) -> Unknown detector type.");
+    }
+}
+
+
+void TransformFromDomain::setItemFromSample(SphericalDetectorItem* detectorItem,
+                                            const SphericalDetector& detector)
+{
+    // Axes
+    const IAxis& phi_axis = detector.getAxis(0);
+    const IAxis& alpha_axis = detector.getAxis(1);
+
+    BasicAxisItem* phiAxisItem = dynamic_cast<BasicAxisItem*>(
+        detectorItem->getItem(SphericalDetectorItem::P_PHI_AXIS));
+    Q_ASSERT(phiAxisItem);
+    phiAxisItem->setItemValue(BasicAxisItem::P_NBINS, (int)phi_axis.size());
+    phiAxisItem->setItemValue(BasicAxisItem::P_MIN, Units::rad2deg(phi_axis.getMin()));
+    phiAxisItem->setItemValue(BasicAxisItem::P_MAX, Units::rad2deg(phi_axis.getMax()));
+
+    BasicAxisItem* alphaAxisItem = dynamic_cast<BasicAxisItem*>(
+        detectorItem->getItem(SphericalDetectorItem::P_ALPHA_AXIS));
+    Q_ASSERT(alphaAxisItem);
+    alphaAxisItem->setItemValue(BasicAxisItem::P_NBINS, (int)alpha_axis.size());
+    alphaAxisItem->setItemValue(BasicAxisItem::P_MIN, Units::rad2deg(alpha_axis.getMin()));
+    alphaAxisItem->setItemValue(BasicAxisItem::P_MAX, Units::rad2deg(alpha_axis.getMax()));
+
+    // detector resolution
+    if (const IDetectorResolution* p_resfunc = detector.getDetectorResolutionFunction()) {
+        if (const ConvolutionDetectorResolution* p_convfunc
+            = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) {
+            if (const ResolutionFunction2DGaussian* resfunc
+                = dynamic_cast<const ResolutionFunction2DGaussian*>(
+                    p_convfunc->getResolutionFunction2D())) {
+                SessionItem* item
+                    = detectorItem->setGroupProperty(SphericalDetectorItem::P_RESOLUTION_FUNCTION,
+                                                     Constants::ResolutionFunction2DGaussianType);
+                item->setItemValue(ResolutionFunction2DGaussianItem::P_SIGMA_X,
+                                            Units::rad2deg(resfunc->getSigmaX()));
+                item->setItemValue(ResolutionFunction2DGaussianItem::P_SIGMA_Y,
+                                            Units::rad2deg(resfunc->getSigmaY()));
+            } else {
+                throw GUIHelpers::Error("TransformFromDomain::setItemFromSample("
+                                        "SphericalDetectorItem* detectorItem, const GISASSimulation "
+                                        "&simulation) -> Error, unknown detector resolution "
+                                        "function");
+            }
+        } else {
+            throw GUIHelpers::Error(
+                "TransformFromDomain::setItemFromSample(SphericalDetectorItem "
+                "*detectorItem, const GISASSimulation& simulation) -> Error, not a "
+                "ConvolutionDetectorResolution function");
+        }
+    }
+}
+
+
+void TransformFromDomain::setItemFromSample(RectangularDetectorItem* detectorItem,
+                                            const RectangularDetector& detector)
+{
+    // Axes
+    BasicAxisItem* xAxisItem = dynamic_cast<BasicAxisItem*>(
+        detectorItem->getItem(RectangularDetectorItem::P_X_AXIS));
+    Q_ASSERT(xAxisItem);
+    xAxisItem->setItemValue(BasicAxisItem::P_NBINS, (int)detector.getNbinsX());
+    xAxisItem->setItemValue(BasicAxisItem::P_MAX, detector.getWidth());
+
+    BasicAxisItem* yAxisItem = dynamic_cast<BasicAxisItem*>(
+        detectorItem->getItem(RectangularDetectorItem::P_Y_AXIS));
+    Q_ASSERT(yAxisItem);
+    yAxisItem->setItemValue(BasicAxisItem::P_NBINS, (int)detector.getNbinsY());
+    yAxisItem->setItemValue(BasicAxisItem::P_MAX, detector.getHeight());
+
+    if(detector.getDetectorArrangment() == RectangularDetector::GENERIC) {
+        detectorItem->setDetectorAlignment(Constants::ALIGNMENT_GENERIC);
+
+        kvector_t normal = detector.getNormalVector();
+        detectorItem->getItem(RectangularDetectorItem::P_NORMAL)->setItemValue(
+            VectorItem::P_X, normal.x());
+        detectorItem->getItem(RectangularDetectorItem::P_NORMAL)->setItemValue(
+            VectorItem::P_Y, normal.y());
+        detectorItem->getItem(RectangularDetectorItem::P_NORMAL)->setItemValue(
+            VectorItem::P_Z, normal.z());
+
+        kvector_t direction = detector.getDirectionVector();
+        detectorItem->getItem(RectangularDetectorItem::P_DIRECTION)->setItemValue(
+            VectorItem::P_X, direction.x());
+        detectorItem->getItem(RectangularDetectorItem::P_DIRECTION)->setItemValue(
+            VectorItem::P_Y, direction.y());
+        detectorItem->getItem(RectangularDetectorItem::P_DIRECTION)->setItemValue(
+            VectorItem::P_Z, direction.z());
+
+        detectorItem->setItemValue(RectangularDetectorItem::P_U0, detector.getU0());
+        detectorItem->setItemValue(RectangularDetectorItem::P_V0, detector.getV0());
+    }
+
+    else if (detector.getDetectorArrangment() == RectangularDetector::PERPENDICULAR_TO_SAMPLE) {
+        detectorItem->setDetectorAlignment(Constants::ALIGNMENT_TO_SAMPLE);
+        detectorItem->setItemValue(RectangularDetectorItem::P_DISTANCE,
+                                            detector.getDistance());
+        detectorItem->setItemValue(RectangularDetectorItem::P_U0, detector.getU0());
+        detectorItem->setItemValue(RectangularDetectorItem::P_V0, detector.getV0());
+
+    } else if (detector.getDetectorArrangment()
+               == RectangularDetector::PERPENDICULAR_TO_DIRECT_BEAM) {
+        detectorItem->setDetectorAlignment(Constants::ALIGNMENT_TO_DIRECT_BEAM);
+        detectorItem->setItemValue(RectangularDetectorItem::P_DISTANCE,
+                                            detector.getDistance());
+        detectorItem->setItemValue(RectangularDetectorItem::P_DBEAM_U0, detector.getU0());
+        detectorItem->setItemValue(RectangularDetectorItem::P_DBEAM_V0, detector.getV0());
+
+    } else if (detector.getDetectorArrangment()
+               == RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM) {
+        detectorItem->setDetectorAlignment(Constants::ALIGNMENT_TO_REFLECTED_BEAM);
+        detectorItem->setItemValue(RectangularDetectorItem::P_DISTANCE,
+                                            detector.getDistance());
+        detectorItem->setItemValue(RectangularDetectorItem::P_U0, detector.getU0());
+        detectorItem->setItemValue(RectangularDetectorItem::P_V0, detector.getV0());
+
+    } else if (detector.getDetectorArrangment()
+               == RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM_DPOS) {
+        detectorItem->setDetectorAlignment(Constants::ALIGNMENT_TO_REFLECTED_BEAM_DPOS);
+        detectorItem->setItemValue(RectangularDetectorItem::P_DISTANCE,
+                                            detector.getDistance());
+        detectorItem->setItemValue(RectangularDetectorItem::P_DBEAM_U0,
+                                            detector.getDirectBeamU0());
+        detectorItem->setItemValue(RectangularDetectorItem::P_DBEAM_V0,
+                                            detector.getDirectBeamV0());
+
+    } else {
+        throw GUIHelpers::Error(
+            "TransformFromDomain::setItemFromSample(RectangularDetectorItem* detectorItem "
+            "Error. Unknown detector arrangement");
+    }
+
+    // detector resolution
+    if (const IDetectorResolution* p_resfunc = detector.getDetectorResolutionFunction()) {
+        if (const ConvolutionDetectorResolution* p_convfunc
+            = dynamic_cast<const ConvolutionDetectorResolution*>(p_resfunc)) {
+            if (const ResolutionFunction2DGaussian* resfunc
+                = dynamic_cast<const ResolutionFunction2DGaussian*>(
+                    p_convfunc->getResolutionFunction2D())) {
+                SessionItem* item
+                    = detectorItem->setGroupProperty(RectangularDetectorItem::P_RESOLUTION_FUNCTION,
+                                                     Constants::ResolutionFunction2DGaussianType);
+                item->setItemValue(ResolutionFunction2DGaussianItem::P_SIGMA_X,
+                                            resfunc->getSigmaX());
+                item->setItemValue(ResolutionFunction2DGaussianItem::P_SIGMA_Y,
+                                            resfunc->getSigmaY());
+            } else {
+                throw GUIHelpers::Error("TransformFromDomain::setItemFromSample("
+                                        "RectangularDetectorItem* detectorItem, const GISASSimulation "
+                                        "&simulation) -> Error, unknown detector resolution "
+                                        "function");
+            }
+        } else {
+            throw GUIHelpers::Error(
+                "TransformFromDomain::setItemFromSample(RectangularDetectorItem "
+                "*detectorItem, const GISASSimulation& simulation) -> Error, not a "
+                "ConvolutionDetectorResolution function");
+        }
+    }
+}
+
+
+void TransformFromDomain::setDetectorMasks(DetectorItem* detectorItem, const GISASSimulation& simulation)
+{
+    Q_ASSERT(detectorItem);
+
+    double scale(1.0);
+    if(detectorItem->getGroupItem(DetectorItem::P_DETECTOR)->modelType()
+            == Constants::SphericalDetectorType)
+        scale = 1./Units::degree;
+
+    const IDetector2D* detector = simulation.getInstrument().getDetector();
+    const DetectorMask* detectorMask = detector->getDetectorMask();
+    if(detectorMask && detectorMask->numberOfMasks()) {
+        MaskContainerItem* containerItem = new MaskContainerItem();
+        detectorItem->insertItem(-1, containerItem);
+        for(size_t i_mask=0; i_mask<detectorMask->numberOfMasks(); ++i_mask) {
+            bool mask_value(false);
+            const Geometry::IShape2D* shape = detectorMask->getMaskShape(i_mask, mask_value);
+            if(const Geometry::Ellipse* ellipse = dynamic_cast<const Geometry::Ellipse*>(shape)) {
+                EllipseItem* ellipseItem = new EllipseItem();
+                ellipseItem->setItemValue(EllipseItem::P_XCENTER, scale*ellipse->getCenterX());
+                ellipseItem->setItemValue(EllipseItem::P_YCENTER, scale*ellipse->getCenterY());
+                ellipseItem->setItemValue(EllipseItem::P_XRADIUS, scale*ellipse->getRadiusX());
+                ellipseItem->setItemValue(EllipseItem::P_YRADIUS, scale*ellipse->getRadiusY());
+                ellipseItem->setItemValue(EllipseItem::P_ANGLE, scale*ellipse->getTheta());
+                ellipseItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
+                containerItem->insertItem(0, ellipseItem);
+
+            }
+            else if(const Geometry::Rectangle* rectangle = dynamic_cast<const Geometry::Rectangle*>(shape)) {
+                RectangleItem* rectangleItem = new RectangleItem();
+                rectangleItem->setItemValue(RectangleItem::P_XLOW, scale*rectangle->getXlow());
+                rectangleItem->setItemValue(RectangleItem::P_YLOW, scale*rectangle->getYlow());
+                rectangleItem->setItemValue(RectangleItem::P_XUP, scale*rectangle->getXup());
+                rectangleItem->setItemValue(RectangleItem::P_YUP, scale*rectangle->getYup());
+                rectangleItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
+                containerItem->insertItem(0, rectangleItem);
+
+            }
+            else if(const Geometry::Polygon* polygon = dynamic_cast<const Geometry::Polygon*>(shape)) {
+                PolygonItem* polygonItem = new PolygonItem();
+                std::vector<double> xpos, ypos;
+                polygon->getPoints(xpos, ypos);
+                for(size_t i_point=0; i_point<xpos.size(); ++i_point) {
+                    PolygonPointItem* pointItem = new PolygonPointItem();
+                    pointItem->setItemValue(PolygonPointItem::P_POSX, scale*xpos[i_point]);
+                    pointItem->setItemValue(PolygonPointItem::P_POSY, scale*ypos[i_point]);
+                    polygonItem->insertItem(-1, pointItem);
+                }
+
+                polygonItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
+                polygonItem->setItemValue(PolygonItem::P_ISCLOSED, true);
+
+                containerItem->insertItem(0, polygonItem);
+            }
+            else if(const Geometry::VerticalLine* vline = dynamic_cast<const Geometry::VerticalLine*>(shape)) {
+                VerticalLineItem* lineItem = new VerticalLineItem();
+                lineItem->setItemValue(VerticalLineItem::P_POSX, scale*vline->getXpos());
+                lineItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
+                containerItem->insertItem(0, lineItem);
+            }
+            else if(const Geometry::HorizontalLine* hline = dynamic_cast<const Geometry::HorizontalLine*>(shape)) {
+                HorizontalLineItem* lineItem = new HorizontalLineItem();
+                lineItem->setItemValue(HorizontalLineItem::P_POSY, scale*hline->getYpos());
+                lineItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
+                containerItem->insertItem(0, lineItem);
+            }
+            else if(const Geometry::InfinitePlane* plane = dynamic_cast<const Geometry::InfinitePlane*>(shape)) {
+                Q_UNUSED(plane);
+                MaskAllItem* planeItem = new MaskAllItem();
+                planeItem->setItemValue(MaskItem::P_MASK_VALUE, mask_value);
+                containerItem->insertItem(-1, planeItem);
+            }
+            else {
+                throw GUIHelpers::Error("TransformFromDomain::setDetectorMasks() -> Error. "
+                                        "Unknown shape");
+            }
+        }
+    }
+
+    if(detector->regionOfInterest()) {
+        SessionItem* containerItem = detectorItem->getChildOfType(Constants::MaskContainerType);
+        if(!containerItem) {
+            containerItem = new MaskContainerItem();
+            detectorItem->insertItem(-1, containerItem);
+        }
+
+        RegionOfInterestItem *roiItem = new RegionOfInterestItem();
+        roiItem->setItemValue(RectangleItem::P_XLOW, scale*detector->regionOfInterest()->getXlow());
+        roiItem->setItemValue(RectangleItem::P_YLOW, scale*detector->regionOfInterest()->getYlow());
+        roiItem->setItemValue(RectangleItem::P_XUP, scale*detector->regionOfInterest()->getXup());
+        roiItem->setItemValue(RectangleItem::P_YUP, scale*detector->regionOfInterest()->getYup());
+        containerItem->insertItem(-1, roiItem);
+    }
+}
+
+void TransformFromDomain::setItemFromSample(BeamDistributionItem* beamDistributionItem,
+                                            const ParameterDistribution& parameterDistribution)
+{
+    Q_ASSERT(beamDistributionItem);
+
+    if (parameterDistribution.getMinValue() < parameterDistribution.getMaxValue()) {
+        throw GUIHelpers::Error(
+            "TransformFromDomain::setItemFromSample(BeamDistributionItem* beamDistributionItem,"
+            "const ParameterDistribution& parameterDistribution) -> Error. ParameterDistribution "
+            "with defined min,max are not yet implemented in GUI");
+    }
+
+    double unit_factor(1.0);
+    if (beamDistributionItem->modelType() == Constants::BeamAzimuthalAngleType
+        || beamDistributionItem->modelType() == Constants::BeamInclinationAngleType) {
+        unit_factor = 1. / Units::degree;
+    }
+    QString group_name = BeamDistributionItem::P_DISTRIBUTION;
+    setDistribution(beamDistributionItem, parameterDistribution, group_name, unit_factor);
+}
+
+QString TransformFromDomain::translateParameterNameToGUI(SessionItem* item,
+                                                         const QString& par_name)
+{
+    QStringList gui_par_list = ModelPath::getParameterTreeList(item);
+    for (QString gui_par_name : gui_par_list) {
+        QString domain_par_name = QString::fromStdString(
+                    ModelPath::translateParameterName(item, gui_par_name));
+        if (domain_par_name == par_name) {
+            return gui_par_name;
+        }
+    }
+    return {};
+}
+
+void SetPDF1D(SessionItem* item, const IFTDistribution1D* ipdf, QString group_name)
+{
+    if (const FTDistribution1DCauchy* pdf = dynamic_cast<const FTDistribution1DCauchy*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution1DCauchyType);
+        pdfItem->setItemValue(FTDistribution1DCauchyItem::P_CORR_LENGTH, pdf->getOmega());
+    } else if (const FTDistribution1DGauss* pdf
+               = dynamic_cast<const FTDistribution1DGauss*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution1DGaussType);
+        pdfItem->setItemValue(FTDistribution1DGaussItem::P_CORR_LENGTH, pdf->getOmega());
+    } else if (const FTDistribution1DGate* pdf = dynamic_cast<const FTDistribution1DGate*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution1DGateType);
+        pdfItem->setItemValue(FTDistribution1DGateItem::P_CORR_LENGTH, pdf->getOmega());
+    } else if (const FTDistribution1DTriangle* pdf
+               = dynamic_cast<const FTDistribution1DTriangle*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution1DTriangleType);
+        pdfItem->setItemValue(FTDistribution1DTriangleItem::P_CORR_LENGTH,
+                                       pdf->getOmega());
+    } else if (const FTDistribution1DCosine* pdf
+               = dynamic_cast<const FTDistribution1DCosine*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution1DCosineType);
+        pdfItem->setItemValue(FTDistribution1DCosineItem::P_CORR_LENGTH, pdf->getOmega());
+    } else if (const FTDistribution1DVoigt* pdf
+               = dynamic_cast<const FTDistribution1DVoigt*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution1DVoigtType);
+        pdfItem->setItemValue(FTDistribution1DVoigtItem::P_CORR_LENGTH, pdf->getOmega());
+        pdfItem->setItemValue(FTDistribution1DVoigtItem::P_ETA, pdf->getEta());
+    } else {
+        throw GUIHelpers::Error("TransformFromDomain::setPDF1D: -> Error");
+    }
+}
+
+void setPDF2D(SessionItem* item, const IFTDistribution2D* pdf, QString group_name)
+{
+    if (const FTDistribution2DCauchy* pdf_cauchy
+        = dynamic_cast<const FTDistribution2DCauchy*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution2DCauchyType);
+        pdfItem->setItemValue(FTDistribution2DCauchyItem::P_COHER_LENGTH_X,
+                                       pdf_cauchy->getCoherenceLengthX());
+        pdfItem->setItemValue(FTDistribution2DCauchyItem::P_COHER_LENGTH_Y,
+                                       pdf_cauchy->getCoherenceLengthY());
+        pdfItem->setItemValue(FTDistribution2DCauchyItem::P_GAMMA,
+                                       Units::rad2deg(pdf_cauchy->getGamma()));
+    } else if (const FTDistribution2DGauss* pdf_gauss
+               = dynamic_cast<const FTDistribution2DGauss*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution2DGaussType);
+        pdfItem->setItemValue(FTDistribution2DGaussItem::P_COHER_LENGTH_X,
+                                       pdf_gauss->getCoherenceLengthX());
+        pdfItem->setItemValue(FTDistribution2DGaussItem::P_COHER_LENGTH_Y,
+                                       pdf_gauss->getCoherenceLengthY());
+        pdfItem->setItemValue(FTDistribution2DGaussItem::P_GAMMA,
+                                       Units::rad2deg(pdf_gauss->getGamma()));
+    } else if (const FTDistribution2DGate* pdf_gate
+               = dynamic_cast<const FTDistribution2DGate*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution2DGateType);
+        pdfItem->setItemValue(FTDistribution2DGateItem::P_COHER_LENGTH_X,
+                                       pdf_gate->getCoherenceLengthX());
+        pdfItem->setItemValue(FTDistribution2DGateItem::P_COHER_LENGTH_Y,
+                                       pdf_gate->getCoherenceLengthY());
+        pdfItem->setItemValue(FTDistribution2DGateItem::P_GAMMA,
+                                       Units::rad2deg(pdf_gate->getGamma()));
+    } else if (const FTDistribution2DCone* pdf_cone
+               = dynamic_cast<const FTDistribution2DCone*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution2DConeType);
+        pdfItem->setItemValue(FTDistribution2DConeItem::P_COHER_LENGTH_X,
+                                       pdf_cone->getCoherenceLengthX());
+        pdfItem->setItemValue(FTDistribution2DConeItem::P_COHER_LENGTH_Y,
+                                       pdf_cone->getCoherenceLengthY());
+        pdfItem->setItemValue(FTDistribution2DConeItem::P_GAMMA,
+                                       Units::rad2deg(pdf_cone->getGamma()));
+    } else if (const FTDistribution2DVoigt* pdf_voigt
+               = dynamic_cast<const FTDistribution2DVoigt*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDistribution2DVoigtType);
+        pdfItem->setItemValue(FTDistribution2DVoigtItem::P_COHER_LENGTH_X,
+                                       pdf_voigt->getCoherenceLengthX());
+        pdfItem->setItemValue(FTDistribution2DVoigtItem::P_COHER_LENGTH_Y,
+                                       pdf_voigt->getCoherenceLengthY());
+        pdfItem->setItemValue(FTDistribution2DVoigtItem::P_GAMMA,
+                                       Units::rad2deg(pdf_voigt->getGamma()));
+        pdfItem->setItemValue(FTDistribution2DVoigtItem::P_ETA, pdf_voigt->getEta());
+    } else {
+        throw GUIHelpers::Error("TransformFromDomain::setPDF2D: -> Error");
+    }
+}
+
+void SetDecayFunction1D(SessionItem* item, const IFTDecayFunction1D* ipdf, QString group_name)
+{
+    if (const FTDecayFunction1DCauchy* pdf = dynamic_cast<const FTDecayFunction1DCauchy*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDecayFunction1DCauchyType);
+        pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH, pdf->getOmega());
+    } else if (const FTDecayFunction1DGauss* pdf
+               = dynamic_cast<const FTDecayFunction1DGauss*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDecayFunction1DGaussType);
+        pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH, pdf->getOmega());
+    } else if (const FTDecayFunction1DTriangle* pdf
+               = dynamic_cast<const FTDecayFunction1DTriangle*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDecayFunction1DTriangleType);
+        pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH,
+                                       pdf->getOmega());
+    } else if (const FTDecayFunction1DVoigt* pdf
+               = dynamic_cast<const FTDecayFunction1DVoigt*>(ipdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDecayFunction1DVoigtType);
+        pdfItem->setItemValue(FTDecayFunction1DItem::P_DECAY_LENGTH, pdf->getOmega());
+        pdfItem->setItemValue(FTDecayFunction1DVoigtItem::P_ETA, pdf->getEta());
+    } else {
+        throw GUIHelpers::Error("TransformFromDomain::SetDecayFunction1D: -> Error");
+    }
+}
+
+void SetDecayFunction2D(SessionItem* item, const IFTDecayFunction2D* pdf, QString group_name)
+{
+    if (const FTDecayFunction2DCauchy* pdf_cauchy
+        = dynamic_cast<const FTDecayFunction2DCauchy*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDecayFunction2DCauchyType);
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_X,
+                                       pdf_cauchy->getDecayLengthX());
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_Y,
+                                       pdf_cauchy->getDecayLengthY());
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_GAMMA,
+                                       Units::rad2deg(pdf_cauchy->getGamma()));
+    } else if (const FTDecayFunction2DGauss* pdf_gauss
+               = dynamic_cast<const FTDecayFunction2DGauss*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDecayFunction2DGaussType);
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_X,
+                                       pdf_gauss->getDecayLengthX());
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_Y,
+                                       pdf_gauss->getDecayLengthY());
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_GAMMA,
+                                       Units::rad2deg(pdf_gauss->getGamma()));
+    } else if (const FTDecayFunction2DVoigt* pdf_voigt
+               = dynamic_cast<const FTDecayFunction2DVoigt*>(pdf)) {
+        SessionItem* pdfItem
+            = item->setGroupProperty(group_name, Constants::FTDecayFunction2DVoigtType);
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_X,
+                                       pdf_voigt->getDecayLengthX());
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_DECAY_LENGTH_Y,
+                                       pdf_voigt->getDecayLengthY());
+        pdfItem->setItemValue(FTDecayFunction2DItem::P_GAMMA,
+                                       Units::rad2deg(pdf_voigt->getGamma()));
+        pdfItem->setItemValue(FTDecayFunction2DVoigtItem::P_ETA, pdf_voigt->getEta());
+    } else {
+        throw GUIHelpers::Error("TransformFromDomain::SetDecayFunction2D: -> Error");
+    }
+}
+
+void set2DLatticeParameters(SessionItem* item, Lattice2DParameters lattice_params,
+                            SessionItem* lattice_item)
+{
+    if (TransformFromDomain::isSquareLattice(lattice_params.m_length_1, lattice_params.m_length_2,
+                                             lattice_params.m_angle)) {
+        lattice_item = item->setGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
+                                                 Constants::SquareLatticeType);
+        lattice_item->setItemValue(SquareLatticeTypeItem::P_LATTICE_LENGTH,
+                                               lattice_params.m_length_1);
+    } else if (TransformFromDomain::isHexagonalLattice(
+                   lattice_params.m_length_1, lattice_params.m_length_2, lattice_params.m_angle)) {
+        lattice_item = item->setGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
+                                                 Constants::HexagonalLatticeType);
+        lattice_item->setItemValue(HexagonalLatticeTypeItem::P_LATTICE_LENGTH,
+                                               lattice_params.m_length_1);
+    } else {
+        lattice_item = item->setGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
+                                                 Constants::BasicLatticeType);
+        lattice_item->setItemValue(BasicLatticeTypeItem::P_LATTICE_LENGTH1,
+                                               lattice_params.m_length_1);
+        lattice_item->setItemValue(BasicLatticeTypeItem::P_LATTICE_LENGTH2,
+                                               lattice_params.m_length_2);
+        lattice_item->setItemValue(BasicLatticeTypeItem::P_LATTICE_ANGLE,
+                                               Units::rad2deg(lattice_params.m_angle));
+    }
+    item->setItemValue(InterferenceFunction2DLatticeItem::P_ROTATION_ANGLE,
+                                Units::rad2deg(lattice_params.m_xi));
+}
+
+void setDistribution(SessionItem* item, ParameterDistribution par_distr,
+                     QString group_name, double factor)
+{
+    const IDistribution1D* p_distribution = par_distr.getDistribution();
+    SessionItem* pdfItem = 0;
+    if (const DistributionGate* distr = dynamic_cast<const DistributionGate*>(p_distribution)) {
+        pdfItem = item->setGroupProperty(group_name, Constants::DistributionGateType);
+        pdfItem->setItemValue(DistributionGateItem::P_MIN, factor*distr->getMin());
+        pdfItem->setItemValue(DistributionGateItem::P_MAX, factor*distr->getMax());
+    } else if (const DistributionLorentz* distr
+               = dynamic_cast<const DistributionLorentz*>(p_distribution)) {
+        pdfItem = item->setGroupProperty(group_name, Constants::DistributionLorentzType);
+        pdfItem->setItemValue(DistributionLorentzItem::P_MEAN, factor*distr->getMean());
+        pdfItem->setItemValue(DistributionLorentzItem::P_HWHM, factor*distr->getHWHM());
+    } else if (const DistributionGaussian* distr
+               = dynamic_cast<const DistributionGaussian*>(p_distribution)) {
+        pdfItem = item->setGroupProperty(group_name, Constants::DistributionGaussianType);
+        pdfItem->setItemValue(DistributionGaussianItem::P_MEAN, factor*distr->getMean());
+        pdfItem->setItemValue(DistributionGaussianItem::P_STD_DEV, factor*distr->getStdDev());
+    } else if (const DistributionLogNormal* distr
+               = dynamic_cast<const DistributionLogNormal*>(p_distribution)) {
+        pdfItem = item->setGroupProperty(group_name, Constants::DistributionLogNormalType);
+        pdfItem->setItemValue(DistributionLogNormalItem::P_MEDIAN, factor*distr->getMedian());
+        pdfItem->setItemValue(DistributionLogNormalItem::P_SCALE_PAR,
+                                       distr->getScalePar());
+    } else if (const DistributionCosine* distr
+               = dynamic_cast<const DistributionCosine*>(p_distribution)) {
+        pdfItem = item->setGroupProperty(group_name, Constants::DistributionCosineType);
+        pdfItem->setItemValue(DistributionCosineItem::P_MEAN, factor*distr->getMean());
+        pdfItem->setItemValue(DistributionCosineItem::P_SIGMA, factor*distr->getSigma());
+    } else {
+        throw GUIHelpers::Error("TransformFromDomain::setDistribution: -> unknown distribution");
+    }
+    if (pdfItem) {
+        pdfItem->setItemValue(DistributionItem::P_NUMBER_OF_SAMPLES,
+                                       (int)par_distr.getNbrSamples());
+        pdfItem->setItemValue(DistributionItem::P_SIGMA_FACTOR,
+                                       par_distr.getSigmaFactor());
+    }
+}
diff --git a/GUI/coregui/Models/TransformFromDomain.h b/GUI/coregui/Models/TransformFromDomain.h
new file mode 100644
index 0000000..058bc2c
--- /dev/null
+++ b/GUI/coregui/Models/TransformFromDomain.h
@@ -0,0 +1,99 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TransformFromDomain.h
+//! @brief     Defines namespace TransformFromDomain
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TRANSFORMFROMDOMAIN_H
+#define TRANSFORMFROMDOMAIN_H
+
+#include "WinDllMacros.h"
+#include <QString>
+
+class BeamDistributionItem;
+class BeamItem;
+class DetectorItem;
+class FormFactorAnisoPyramid;
+class GISASSimulation;
+class InterferenceFunction1DLattice;
+class InterferenceFunction2DLattice;
+class InterferenceFunction2DParaCrystal;
+class InterferenceFunctionRadialParaCrystal;
+class Layer;
+class LayerInterface;
+class LayerRoughness;
+class ParameterDistribution;
+class ParticleDistribution;
+class RectangularDetector;
+class RectangularDetectorItem;
+class SessionItem;
+class SphericalDetector;
+class SphericalDetectorItem;
+
+namespace TransformFromDomain
+{
+BA_CORE_API_ void setItemFromSample(SessionItem *item,
+                                    const FormFactorAnisoPyramid *sample);
+
+BA_CORE_API_ void setItemFromSample(SessionItem *item,
+                                    const InterferenceFunctionRadialParaCrystal *sample);
+
+BA_CORE_API_ void setItemFromSample(SessionItem *item,
+                                    const InterferenceFunction2DParaCrystal *sample);
+
+BA_CORE_API_ void setItemFromSample(SessionItem *item,
+                                    const InterferenceFunction1DLattice *sample);
+
+BA_CORE_API_ void setItemFromSample(SessionItem *item,
+                                    const InterferenceFunction2DLattice *sample);
+
+BA_CORE_API_ void setItemFromSample(SessionItem *layerItem, const Layer *layer,
+                                    const LayerInterface *top_interface);
+
+BA_CORE_API_ void setItemFromSample(SessionItem *item,
+                                    const LayerRoughness *sample);
+
+BA_CORE_API_ void setItemFromSample(SessionItem *item,
+                                    const ParticleDistribution *sample);
+
+BA_CORE_API_ bool isValidRoughness(const LayerRoughness *roughness);
+
+BA_CORE_API_ bool isSquareLattice(double length1, double length2, double angle);
+
+BA_CORE_API_ bool isHexagonalLattice(double length1, double length2, double angle);
+
+BA_CORE_API_ void setItemFromSample(BeamItem *beamItem,
+                                    const GISASSimulation &simulation);
+
+BA_CORE_API_ void setItemFromSample(DetectorItem *detectorItem,
+                                    const GISASSimulation &simulation);
+
+BA_CORE_API_ void setItemFromSample(SphericalDetectorItem *detectorItem,
+                                    const SphericalDetector &detector);
+
+BA_CORE_API_ void setItemFromSample(RectangularDetectorItem *detectorItem,
+                                    const RectangularDetector &detector);
+
+BA_CORE_API_ void setDetectorMasks(DetectorItem *detectorItem,
+                                   const GISASSimulation &simulation);
+
+BA_CORE_API_ void setItemFromSample(BeamDistributionItem *beamDistributionItem,
+                                    const ParameterDistribution &parameterDistribution);
+
+BA_CORE_API_ void setItemFromSample(BeamDistributionItem *beamDistributionItem,
+                                    const ParameterDistribution &parameterDistribution);
+
+BA_CORE_API_ QString translateParameterNameToGUI(SessionItem *item, const QString &par_name);
+}
+
+#endif // TRANSFORMFROMDOMAIN_H
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
new file mode 100644
index 0000000..e9413d7
--- /dev/null
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -0,0 +1,448 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TransformToDomain.cpp
+//! @brief     Implements class TransformToDomain
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "TransformToDomain.h"
+#include "BeamAngleItems.h"
+#include "BeamItem.h"
+#include "BeamWavelengthItem.h"
+#include "BornAgainNamespace.h"
+#include "ComboProperty.h"
+#include "DetectorItems.h"
+#include "Distributions.h"
+#include "FTDecayFunctionItems.h"
+#include "FTDistributionItems.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "IResolutionFunction2D.h"
+#include "InterferenceFunction1DLattice.h"
+#include "InterferenceFunction2DLattice.h"
+#include "InterferenceFunction2DParaCrystal.h"
+#include "InterferenceFunctionItems.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "LatticeTypeItems.h"
+#include "LayerItem.h"
+#include "LayerRoughnessItems.h"
+#include "MaskItems.h"
+#include "MaterialUtils.h"
+#include "MultiLayerItem.h"
+#include "ParameterPattern.h"
+#include "ParticleCompositionItem.h"
+#include "ParticleCoreShellItem.h"
+#include "ParticleDistributionItem.h"
+#include "ParticleItem.h"
+#include "ParticleLayoutItem.h"
+#include "RotationItems.h"
+#include "SimulationOptionsItem.h"
+#include "TransformationItem.h"
+#include "Units.h"
+#include "VectorItem.h"
+
+using namespace BornAgain;
+
+std::unique_ptr<IMaterial> TransformToDomain::createDomainMaterial(const SessionItem& item)
+{
+    MaterialProperty material_property;
+    if (item.modelType() == Constants::ParticleType) {
+        material_property
+            = item.getItemValue(ParticleItem::P_MATERIAL).value<MaterialProperty>();
+    } else if (item.modelType() == Constants::LayerType) {
+        material_property
+            = item.getItemValue(LayerItem::P_MATERIAL).value<MaterialProperty>();
+    }
+    if (!material_property.isDefined())
+        throw GUIHelpers::Error(
+            "TransformToDomain::createDomainMaterial() -> Error. Unknown item to create material");
+
+    return MaterialUtils::createDomainMaterial(material_property);
+}
+
+std::unique_ptr<MultiLayer> TransformToDomain::createMultiLayer(const SessionItem& item)
+{
+    auto P_multilayer = GUIHelpers::make_unique<MultiLayer>();
+    auto cross_corr_length
+        = item.getItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH).toDouble();
+    if (cross_corr_length > 0)
+        P_multilayer->setCrossCorrLength(cross_corr_length);
+    return P_multilayer;
+}
+
+std::unique_ptr<Layer> TransformToDomain::createLayer(const SessionItem& item)
+{
+    return GUIHelpers::make_unique<Layer>(
+        *createDomainMaterial(item),
+        item.getItemValue(LayerItem::P_THICKNESS).toDouble());
+}
+
+std::unique_ptr<LayerRoughness>
+TransformToDomain::createLayerRoughness(const SessionItem& roughnessItem)
+{
+    if (roughnessItem.modelType() == Constants::LayerZeroRoughnessType) {
+        return nullptr;
+    } else if (roughnessItem.modelType() == Constants::LayerBasicRoughnessType) {
+        return GUIHelpers::make_unique<LayerRoughness>(
+            roughnessItem.getItemValue(LayerBasicRoughnessItem::P_SIGMA).toDouble(),
+            roughnessItem.getItemValue(LayerBasicRoughnessItem::P_HURST).toDouble(),
+            roughnessItem.getItemValue(LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH)
+                .toDouble());
+    } else {
+        throw GUIHelpers::Error("TransformToDomain::createLayerRoughness() -> Error.");
+    }
+}
+
+std::unique_ptr<ParticleLayout>
+TransformToDomain::createParticleLayout(const SessionItem& item)
+{
+    auto P_layout = GUIHelpers::make_unique<ParticleLayout>();
+    auto prop = item.getItemValue(ParticleLayoutItem::P_APPROX).value<ComboProperty>();
+    QString approximation = prop.getValue();
+    if (approximation == QString("Decoupling Approximation")) {
+        P_layout->setApproximation(ILayout::DA);
+    } else if (approximation == QString("Size Space Coupling Approximation")) {
+        P_layout->setApproximation(ILayout::SSCA);
+    }
+    auto total_density
+        = item.getItemValue(ParticleLayoutItem::P_TOTAL_DENSITY).value<double>();
+    P_layout->setTotalParticleSurfaceDensity(total_density);
+    return P_layout;
+}
+
+std::unique_ptr<IParticle> TransformToDomain::createIParticle(const SessionItem& item)
+{
+    std::unique_ptr<IParticle> P_particle;
+    if (item.modelType() == Constants::ParticleType) {
+        auto& particle_item = static_cast<const ParticleItem&>(item);
+        P_particle = particle_item.createParticle();
+    } else if (item.modelType() == Constants::ParticleCoreShellType) {
+        auto& particle_coreshell_item = static_cast<const ParticleCoreShellItem&>(item);
+        P_particle = particle_coreshell_item.createParticleCoreShell();
+    } else if (item.modelType() == Constants::ParticleCompositionType) {
+        auto& particle_composition_item = static_cast<const ParticleCompositionItem&>(item);
+        P_particle = particle_composition_item.createParticleComposition();
+    }
+    return P_particle;
+}
+
+std::unique_ptr<ParticleDistribution> TransformToDomain::createParticleDistribution(
+        const SessionItem& item)
+{
+    auto& particle_distribution = static_cast<const ParticleDistributionItem&>(item);
+    auto P_part_distr = particle_distribution.createParticleDistribution();
+    return P_part_distr;
+}
+
+std::unique_ptr<IDistribution1D>
+TransformToDomain::createDistribution(const SessionItem& item)
+{
+    auto distr_item = dynamic_cast<const DistributionItem*>(&item);
+    Q_ASSERT(distr_item);
+    return distr_item->createDistribution();
+}
+
+std::unique_ptr<IInterferenceFunction>
+TransformToDomain::createInterferenceFunction(const SessionItem& item)
+{
+    std::unique_ptr<IInterferenceFunction> P_result{};
+    if (item.modelType() == Constants::InterferenceFunctionRadialParaCrystalType) {
+        double peak_distance
+            = item.getItemValue(InterferenceFunctionRadialParaCrystalItem::P_PEAK_DISTANCE)
+                  .toDouble();
+        double damping_length
+            = item.getItemValue(
+                       InterferenceFunctionRadialParaCrystalItem::P_DAMPING_LENGTH).toDouble();
+        double domain_size
+            = item.getItemValue(InterferenceFunctionRadialParaCrystalItem::P_DOMAIN_SIZE)
+                  .toDouble();
+        double kappa = item.getItemValue(
+                                InterferenceFunctionRadialParaCrystalItem::P_KAPPA).toDouble();
+        auto P_iff = GUIHelpers::make_unique<InterferenceFunctionRadialParaCrystal>(peak_distance,
+                                                                                    damping_length);
+        P_iff->setDomainSize(domain_size);
+        P_iff->setKappa(kappa);
+        auto pdfItem = item.getGroupItem(InterferenceFunctionRadialParaCrystalItem::P_PDF);
+        Q_ASSERT(pdfItem);
+        std::unique_ptr<IFTDistribution1D> P_pdf(
+            dynamic_cast<FTDistribution1DItem*>(pdfItem)->createFTDistribution());
+        Q_ASSERT(P_pdf);
+        P_iff->setProbabilityDistribution(*P_pdf);
+        P_result = std::move(P_iff);
+    } else if (item.modelType() == Constants::InterferenceFunction2DParaCrystalType) {
+        auto latticeItem
+                = item.getGroupItem(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE);
+        Q_ASSERT(latticeItem);
+        double length_1 {0.0}, length_2 {0.0}, alpha_lattice {0.0};
+        if (latticeItem->modelType() == Constants::BasicLatticeType) {
+            length_1 = latticeItem->getItemValue(BasicLatticeTypeItem::P_LATTICE_LENGTH1)
+                           .toDouble();
+            length_2 = latticeItem->getItemValue(BasicLatticeTypeItem::P_LATTICE_LENGTH2)
+                           .toDouble();
+            alpha_lattice = Units::deg2rad(
+                latticeItem->getItemValue(BasicLatticeTypeItem::P_LATTICE_ANGLE)
+                    .toDouble());
+        } else if (latticeItem->modelType() == Constants::SquareLatticeType) {
+            length_1 = latticeItem->getItemValue(SquareLatticeTypeItem::P_LATTICE_LENGTH)
+                           .toDouble();
+            length_2 = length_1;
+            alpha_lattice = M_PI / 2.0;
+        } else if (latticeItem->modelType() == Constants::HexagonalLatticeType) {
+            length_1 = latticeItem->getItemValue(
+                                        HexagonalLatticeTypeItem::P_LATTICE_LENGTH).toDouble();
+            length_2 = length_1;
+            alpha_lattice = M_TWOPI / 3.0;
+        } else {
+            throw GUIHelpers::Error("TransformToDomain::createInterferenceFunction() -> Error");
+        }
+
+        auto P_iff = GUIHelpers::make_unique<InterferenceFunction2DParaCrystal>(
+            length_1, length_2, alpha_lattice,
+            Units::deg2rad(
+                item.getItemValue(InterferenceFunction2DParaCrystalItem::P_ROTATION_ANGLE)
+                    .toDouble()),
+            item.getItemValue(InterferenceFunction2DParaCrystalItem::P_DAMPING_LENGTH)
+                .toDouble());
+        P_iff->setDomainSizes(
+            item.getItemValue(InterferenceFunction2DParaCrystalItem::P_DOMAIN_SIZE1)
+                .toDouble(),
+            item.getItemValue(InterferenceFunction2DParaCrystalItem::P_DOMAIN_SIZE2)
+                .toDouble());
+        P_iff->setIntegrationOverXi(
+            item.getItemValue(InterferenceFunction2DParaCrystalItem::P_XI_INTEGRATION)
+                .toBool());
+
+        auto pdf1Item = item.getGroupItem(InterferenceFunction2DParaCrystalItem::P_PDF1);
+        Q_ASSERT(pdf1Item);
+        std::unique_ptr<IFTDistribution2D> P_pdf1(
+            dynamic_cast<FTDistribution2DItem*>(pdf1Item)->createFTDistribution());
+        Q_ASSERT(P_pdf1.get());
+
+        auto pdf2Item = item.getGroupItem(InterferenceFunction2DParaCrystalItem::P_PDF2);
+        Q_ASSERT(pdf2Item);
+        std::unique_ptr<IFTDistribution2D> P_pdf2(
+            dynamic_cast<FTDistribution2DItem*>(pdf2Item)->createFTDistribution());
+        Q_ASSERT(P_pdf2.get());
+
+        P_iff->setProbabilityDistributions(*P_pdf1, *P_pdf2);
+        P_result = std::move(P_iff);
+    } else if (item.modelType() == Constants::InterferenceFunction1DLatticeType) {
+        double length =
+                item.getItemValue(InterferenceFunction1DLatticeItem::P_LENGTH).toDouble();
+        double angle = Units::deg2rad(
+                item.getItemValue(InterferenceFunction1DLatticeItem::P_ROTATION_ANGLE)
+                       .toDouble());
+        auto P_iff = GUIHelpers::make_unique<InterferenceFunction1DLattice>(length, angle);
+        auto pdfItem = item.getGroupItem(InterferenceFunction1DLatticeItem::P_DECAY_FUNCTION);
+        Q_ASSERT(pdfItem);
+        std::unique_ptr<IFTDecayFunction1D> P_pdf(
+            dynamic_cast<FTDecayFunction1DItem*>(pdfItem)->createFTDecayFunction());
+        Q_ASSERT(P_pdf);
+        P_iff->setDecayFunction(*P_pdf);
+        P_result = std::move(P_iff);
+    } else if (item.modelType() == Constants::InterferenceFunction2DLatticeType) {
+        auto latticeItem = item.getGroupItem(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE);
+        Q_ASSERT(latticeItem);
+
+        double length_1 {0.0}, length_2 {0.0}, angle {0.0};
+        if (latticeItem->modelType() == Constants::BasicLatticeType) {
+            length_1 = latticeItem->getItemValue(BasicLatticeTypeItem::P_LATTICE_LENGTH1)
+                           .toDouble();
+            length_2 = latticeItem->getItemValue(BasicLatticeTypeItem::P_LATTICE_LENGTH2)
+                           .toDouble();
+            angle = Units::deg2rad(
+                latticeItem->getItemValue(BasicLatticeTypeItem::P_LATTICE_ANGLE)
+                    .toDouble());
+        } else if (latticeItem->modelType() == Constants::SquareLatticeType) {
+            length_1 = latticeItem->getItemValue(SquareLatticeTypeItem::P_LATTICE_LENGTH)
+                           .toDouble();
+            length_2 = length_1;
+            angle = M_PI / 2.0;
+        } else if (latticeItem->modelType() == Constants::HexagonalLatticeType) {
+            length_1 = latticeItem->getItemValue(
+                                        HexagonalLatticeTypeItem::P_LATTICE_LENGTH).toDouble();
+            length_2 = length_1;
+            angle = M_TWOPI / 3.0;
+        } else {
+            throw GUIHelpers::Error("TransformToDomain::createInterferenceFunction() -> Error");
+        }
+        double xi = Units::deg2rad(
+            item.getItemValue(InterferenceFunction2DLatticeItem::P_ROTATION_ANGLE)
+                .toDouble());
+        auto P_iff
+            = GUIHelpers::make_unique<InterferenceFunction2DLattice>(length_1, length_2, angle, xi);
+        auto pdfItem = item.getGroupItem(InterferenceFunction2DLatticeItem::P_DECAY_FUNCTION);
+        Q_ASSERT(pdfItem);
+        std::unique_ptr<IFTDecayFunction2D> P_pdf(
+            dynamic_cast<FTDecayFunction2DItem*>(pdfItem)->createFTDecayFunction());
+        Q_ASSERT(P_pdf);
+        P_iff->setDecayFunction(*P_pdf);
+        P_result = std::move(P_iff);
+    }
+    return P_result;
+}
+
+std::unique_ptr<Instrument> TransformToDomain::createInstrument(const SessionItem& item)
+{
+    Q_UNUSED(item);
+    return GUIHelpers::make_unique<Instrument>();
+}
+
+std::unique_ptr<Beam> TransformToDomain::createBeam(const SessionItem& item)
+{
+    auto P_beam = GUIHelpers::make_unique<Beam>();
+
+    auto beamItem = dynamic_cast<const BeamItem*>(&item);
+    P_beam->setIntensity(beamItem->getIntensity());
+    double lambda = beamItem->getWavelength();
+    double inclination_angle = Units::deg2rad(beamItem->getInclinationAngle());
+    double azimuthal_angle = Units::deg2rad(beamItem->getAzimuthalAngle());
+    P_beam->setCentralK(lambda, inclination_angle, azimuthal_angle);
+
+    return P_beam;
+}
+
+void TransformToDomain::initInstrumentFromDetectorItem(const SessionItem& detectorItem,
+                                                       Instrument* instrument)
+{
+    auto subDetector = detectorItem.getGroupItem(DetectorItem::P_DETECTOR);
+    Q_ASSERT(subDetector);
+
+    double scale(1.0);
+    if(auto sphericalDetector = dynamic_cast<SphericalDetectorItem*>(subDetector)) {
+        scale = Units::degree;
+        auto detector = sphericalDetector->createDetector();
+        instrument->setDetector(*detector);
+        auto resfunc = sphericalDetector->createResolutionFunction();
+        if(resfunc) instrument->setDetectorResolutionFunction(*resfunc);
+    }
+
+    else if(auto rectangularDetector = dynamic_cast<RectangularDetectorItem*>(subDetector)) {
+        auto detector = rectangularDetector->createDetector();
+        instrument->setDetector(*detector);
+        auto resfunc = rectangularDetector->createResolutionFunction();
+        if(resfunc) instrument->setDetectorResolutionFunction(*resfunc);
+
+    } else {
+        throw GUIHelpers::Error(
+            "TransformToDomain::initInstrumentWithDetectorItem() -> Error. Unknown model type "
+            + subDetector->modelType());
+    }
+
+    if(auto maskContainerItem = detectorItem.getChildOfType(Constants::MaskContainerType)) {
+        for(int i_row = maskContainerItem->childItems().size(); i_row>0; --i_row) {
+            if(auto maskItem = dynamic_cast<MaskItem*>(
+                   maskContainerItem->childItems().at(i_row-1))) {
+
+                if(maskItem->modelType() == Constants::RegionOfInterestType) {
+                    double xlow = scale*maskItem->getItemValue(RectangleItem::P_XLOW).toDouble();
+                    double ylow = scale*maskItem->getItemValue(RectangleItem::P_YLOW).toDouble();
+                    double xup = scale*maskItem->getItemValue(RectangleItem::P_XUP).toDouble();
+                    double yup = scale*maskItem->getItemValue(RectangleItem::P_YUP).toDouble();
+                    instrument->getDetector()->setRegionOfInterest(xlow, ylow, xup, yup);
+
+                } else {
+                    std::unique_ptr<Geometry::IShape2D > shape(maskItem->createShape(scale));
+                    bool mask_value = maskItem->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+                    instrument->getDetector()->addMask(*shape, mask_value);
+                }
+            }
+        }
+    }
+}
+
+//! adds DistributionParameters to the Simulation
+void TransformToDomain::addDistributionParametersToSimulation(const SessionItem& beam_item,
+                                                              GISASSimulation* simulation)
+{
+    ParameterPattern pattern_wavelength;
+    pattern_wavelength.beginsWith("*").add(BeamType).add(Wavelength);
+    ParameterPattern pattern_alpha;
+    pattern_alpha.beginsWith("*").add(BeamType).add(Inclination);
+    ParameterPattern pattern_phi;
+    pattern_phi.beginsWith("*").add(BeamType).add(Azimuth);
+    if (beam_item.modelType() == Constants::BeamType) {
+        if (auto beamWavelength
+            = dynamic_cast<BeamWavelengthItem*>(beam_item.getItem(BeamItem::P_WAVELENGTH))) {
+            auto P_par_distr = beamWavelength->getParameterDistributionForName(
+                        pattern_wavelength.toStdString());
+            if (P_par_distr)
+                simulation->addParameterDistribution(*P_par_distr);
+        }
+        if (auto inclinationAngle = dynamic_cast<BeamInclinationAngleItem*>(
+                beam_item.getItem(BeamItem::P_INCLINATION_ANGLE))) {
+            auto P_par_distr = inclinationAngle->getParameterDistributionForName(
+                        pattern_alpha.toStdString());
+            if (P_par_distr)
+                simulation->addParameterDistribution(*P_par_distr);
+        }
+        if (auto azimuthalAngle = dynamic_cast<BeamAzimuthalAngleItem*>(
+                beam_item.getItem(BeamItem::P_AZIMUTHAL_ANGLE))) {
+            auto P_par_distr = azimuthalAngle->getParameterDistributionForName(
+                        pattern_phi.toStdString());
+            if (P_par_distr)
+                simulation->addParameterDistribution(*P_par_distr);
+        }
+    }
+}
+
+void TransformToDomain::setSimulationOptions(GISASSimulation* simulation,
+                                             const SessionItem& item)
+{
+    Q_ASSERT(item.modelType() == Constants::SimulationOptionsType);
+
+    if(auto optionItem = dynamic_cast<const SimulationOptionsItem*>(&item)) {
+        simulation->getOptions().setNumberOfThreads(optionItem->getNumberOfThreads());
+        if(optionItem->getComputationMethod() == Constants::SIMULATION_MONTECARLO) {
+            simulation->getOptions().setMonteCarloIntegration(true,
+                    optionItem->getNumberOfMonteCarloPoints());
+        }
+    }
+
+}
+
+void TransformToDomain::setTransformationInfo(IParticle* result, const SessionItem& item)
+{
+    setPositionInfo(result, item);
+    setRotationInfo(result, item);
+}
+
+void TransformToDomain::setPositionInfo(IParticle* result, const SessionItem& item)
+{
+    SessionItem* positionItem = item.getItem(ParticleItem::P_POSITION);
+    Q_ASSERT(positionItem);
+    double pos_x = positionItem->getItemValue(VectorItem::P_X).toDouble();
+    double pos_y = positionItem->getItemValue(VectorItem::P_Y).toDouble();
+    double pos_z = positionItem->getItemValue(VectorItem::P_Z).toDouble();
+    result->setPosition(pos_x, pos_y, pos_z);
+}
+
+void TransformToDomain::setRotationInfo(IParticle* result, const SessionItem& item)
+{
+    QVector<SessionItem*> children = item.childItems();
+    for (int i = 0; i < children.size(); ++i) {
+        if (children[i]->modelType() == Constants::TransformationType) {
+            RotationItem* rot_item = dynamic_cast<RotationItem*>(
+                children[i]->getGroupItem(TransformationItem::P_ROT));
+            if (!rot_item) {
+                throw GUIHelpers::Error("DomainObjectBuilder::setRotationInfo() "
+                                        "-> Error! ParticleItem's child is"
+                                        " not a rotation.");
+            }
+            std::unique_ptr<IRotation> P_rotation(rot_item->createRotation());
+            if (P_rotation.get()) {
+                result->setRotation(*P_rotation);
+            }
+            break;
+        }
+    }
+}
diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h
new file mode 100644
index 0000000..83c5c36
--- /dev/null
+++ b/GUI/coregui/Models/TransformToDomain.h
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TransformToDomain.h
+//! @brief     Defines class TransformToDomain
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TRANSFORMTODOMAIN_H
+#define TRANSFORMTODOMAIN_H
+
+#include "Beam.h"
+#include "Distributions.h" // for IDistribution1D
+#include "IInterferenceFunction.h"
+#include "IMaterial.h"
+#include "IParticle.h"
+#include "Instrument.h"
+#include "Layer.h"
+#include "LayerRoughness.h"
+#include "MultiLayer.h"
+#include "ParticleDistribution.h"
+#include "ParticleLayout.h"
+#include <memory>
+
+class GISASSimulation;
+class SessionItem;
+
+namespace TransformToDomain
+{
+BA_CORE_API_ std::unique_ptr<Beam> createBeam(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<IDistribution1D> createDistribution(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<IInterferenceFunction> createInterferenceFunction(
+    const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<IMaterial> createDomainMaterial(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<IParticle> createIParticle(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<Instrument> createInstrument(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<Layer> createLayer(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<LayerRoughness> createLayerRoughness(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<MultiLayer> createMultiLayer(const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<ParticleDistribution> createParticleDistribution(
+    const SessionItem& item);
+BA_CORE_API_ std::unique_ptr<ParticleLayout> createParticleLayout(const SessionItem& item);
+
+BA_CORE_API_ void initInstrumentFromDetectorItem(const SessionItem& detectorItem,
+                                                 Instrument* instrument);
+BA_CORE_API_ void addDistributionParametersToSimulation(
+    const SessionItem& beam_item, GISASSimulation* simulation);
+BA_CORE_API_ void setSimulationOptions(GISASSimulation* simulation, const SessionItem& item);
+BA_CORE_API_ void setTransformationInfo(IParticle* result, const SessionItem& item);
+BA_CORE_API_ void setPositionInfo(IParticle* result, const SessionItem& item);
+BA_CORE_API_ void setRotationInfo(IParticle* result, const SessionItem& item);
+}
+
+#endif // TRANSFORMTODOMAIN_H
diff --git a/GUI/coregui/Models/TransformationItem.cpp b/GUI/coregui/Models/TransformationItem.cpp
new file mode 100644
index 0000000..1ac6d7a
--- /dev/null
+++ b/GUI/coregui/Models/TransformationItem.cpp
@@ -0,0 +1,26 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TransformationItem.cpp
+//! @brief     Implements class TransformationItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "TransformationItem.h"
+
+const QString TransformationItem::P_ROT = "Rotation type";
+
+
+TransformationItem::TransformationItem()
+    : SessionGraphicsItem(Constants::TransformationType)
+{
+    addGroupProperty(P_ROT, Constants::RotationGroup );
+}
diff --git a/GUI/coregui/Models/TransformationItem.h b/GUI/coregui/Models/TransformationItem.h
new file mode 100644
index 0000000..4fae926
--- /dev/null
+++ b/GUI/coregui/Models/TransformationItem.h
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/TransformationItem.h
+//! @brief     Defines class TransformationItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TRANSFORMATIONITEM_H
+#define TRANSFORMATIONITEM_H
+
+#include "SessionGraphicsItem.h"
+
+class TransformationItem : public SessionGraphicsItem
+{
+
+public:
+    static const QString P_ROT;
+    explicit TransformationItem();
+    virtual ~TransformationItem(){}
+};
+
+
+#endif // TRANSFORMATIONITEM_H
+
diff --git a/GUI/coregui/Models/VectorItem.cpp b/GUI/coregui/Models/VectorItem.cpp
new file mode 100644
index 0000000..ca23e3a
--- /dev/null
+++ b/GUI/coregui/Models/VectorItem.cpp
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/VectorItem.cpp
+//! @brief     Implements class VectorItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "VectorItem.h"
+
+const QString VectorItem::P_X = "X";
+const QString VectorItem::P_Y = "Y";
+const QString VectorItem::P_Z = "Z";
+
+VectorItem::VectorItem()
+    : SessionItem(Constants::VectorType)
+{
+    addProperty(P_X, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_Y, 0.0)->setLimits(RealLimits::limitless());
+    addProperty(P_Z, 0.0)->setLimits(RealLimits::limitless());
+
+    mapper()->setOnPropertyChange(
+        [this](const QString &){
+            setValue(itemLabel());
+        }
+    );
+
+    setValue(itemLabel());
+    setEditable(false);
+}
+
+QString VectorItem::itemLabel() const
+{
+    return QString("(%1, %2, %3)").arg(getItemValue(P_X).toDouble())
+                                  .arg(getItemValue(P_Y).toDouble())
+            .arg(getItemValue(P_Z).toDouble());
+}
+
+kvector_t VectorItem::getVector() const
+{
+    return kvector_t(getItemValue(P_X).toDouble(),
+                     getItemValue(P_Y).toDouble(),
+                     getItemValue(P_Z).toDouble());
+}
+
diff --git a/GUI/coregui/Models/VectorItem.h b/GUI/coregui/Models/VectorItem.h
new file mode 100644
index 0000000..ea173b5
--- /dev/null
+++ b/GUI/coregui/Models/VectorItem.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/VectorItem.h
+//! @brief     Defines class VectorItem
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef VECTORITEM_H
+#define VECTORITEM_H
+
+#include "SessionItem.h"
+#include "Vectors3D.h"
+
+class BA_CORE_API_  VectorItem : public SessionItem
+{
+
+public:
+    static const QString P_X;
+    static const QString P_Y;
+    static const QString P_Z;
+    explicit VectorItem();
+    virtual ~VectorItem(){}
+    virtual QString itemLabel() const;
+
+    kvector_t getVector() const;
+};
+
+#endif // VECTORITEM_H
+
diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h
new file mode 100644
index 0000000..247a722
--- /dev/null
+++ b/GUI/coregui/Models/item_constants.h
@@ -0,0 +1,236 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Models/item_constants.h
+//! @brief     Defines item constants
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEM_CONSTANTS_H
+#define ITEM_CONSTANTS_H
+
+#include <QString>
+
+namespace Constants {
+
+// --- Items -------------------------------------------------------------------
+
+using ModelType = QString;
+
+const ModelType LayerType = "Layer";
+const ModelType MultiLayerType = "MultiLayer";
+const ModelType ParticleType = "Particle";
+const ModelType ParticleLayoutType = "ParticleLayout";
+const ModelType ParticleCoreShellType = "ParticleCoreShell";
+const ModelType ParticleDistributionType = "ParticleDistribution";
+const ModelType ParticleCompositionType = "ParticleComposition";
+const ModelType TransformationType = "Rotation";
+const ModelType InterferenceFunctionRadialParaCrystalType = "InterferenceRadialParaCrystal";
+const ModelType InterferenceFunction2DParaCrystalType = "Interference2DParaCrystal";
+const ModelType InterferenceFunction1DLatticeType = "Interference1DLattice";
+const ModelType InterferenceFunction2DLatticeType = "Interference2DLattice";
+const ModelType InstrumentType = "Instrument";
+const ModelType DetectorType = "Detector";
+const ModelType BeamType = "Beam";
+
+const ModelType FormFactorType = "FormFactor";
+const ModelType AnisoPyramidType = "AnisoPyramid";
+const ModelType BoxType = "Box";
+const ModelType ConeType = "Cone";
+const ModelType Cone6Type = "Cone6";
+const ModelType CuboctahedronType = "Cuboctahedron";
+const ModelType CylinderType = "Cylinder";
+const ModelType DodecahedronType = "Dodecahedron";
+const ModelType EllipsoidalCylinderType = "EllipsoidalCylinder";
+const ModelType FullSphereType = "FullSphere";
+const ModelType FullSpheroidType = "FullSpheroid";
+const ModelType HemiEllipsoidType = "HemiEllipsoid";
+const ModelType IcosahedronType = "Icosahedron";
+const ModelType Prism3Type = "Prism3";
+const ModelType Prism6Type = "Prism6";
+const ModelType PyramidType = "Pyramid";
+const ModelType Ripple1Type = "Ripple1";
+const ModelType Ripple2Type = "Ripple2";
+const ModelType TetrahedronType = "Tetrahedron";
+const ModelType TruncatedCubeType = "TruncatedCube";
+const ModelType TruncatedSphereType = "TruncatedSphere";
+const ModelType TruncatedSpheroidType = "TruncatedSpheroid";
+
+const ModelType XRotationType = "XRotation";
+const ModelType YRotationType = "YRotation";
+const ModelType ZRotationType = "ZRotation";
+const ModelType EulerRotationType = "EulerRotation";
+
+const ModelType PropertyType = "Property";
+const ModelType VectorType = "Vector";
+const ModelType GroupItemType = "GroupProperty";
+
+const ModelType LayerBasicRoughnessType = "LayerBasicRoughness";
+const ModelType LayerZeroRoughnessType = "LayerZeroRoughness";
+
+const ModelType SphericalDetectorType = "SphericalDetector";
+const ModelType RectangularDetectorType = "RectangularDetector";
+
+const ModelType DistributionNoneType = "DistributionNone";
+const ModelType DistributionGateType = "DistributionGate";
+const ModelType DistributionLorentzType = "DistributionLorentz";
+const ModelType DistributionGaussianType = "DistributionGaussian";
+const ModelType DistributionLogNormalType = "DistributionLogNormal";
+const ModelType DistributionCosineType = "DistributionCosine";
+
+const ModelType FTDistribution1DCauchyType = "FTDistribution1DCauchy";
+const ModelType FTDistribution1DGaussType = "FTDistribution1DGauss";
+const ModelType FTDistribution1DGateType = "FTDistribution1DGate";
+const ModelType FTDistribution1DTriangleType = "FTDistribution1DTriangle";
+const ModelType FTDistribution1DCosineType = "FTDistribution1DCosine";
+const ModelType FTDistribution1DVoigtType = "FTDistribution1DVoigt";
+
+const ModelType FTDistribution2DCauchyType = "FTDistribution2DCauchy";
+const ModelType FTDistribution2DGaussType = "FTDistribution2DGauss";
+const ModelType FTDistribution2DGateType = "FTDistribution2DGate";
+const ModelType FTDistribution2DConeType = "FTDistribution2DCone";
+const ModelType FTDistribution2DVoigtType = "FTDistribution2DVoigt";
+
+const ModelType FTDecayFunction1DCauchyType = "FTDecayFunction1DCauchy";
+const ModelType FTDecayFunction1DGaussType = "FTDecayFunction1DGauss";
+const ModelType FTDecayFunction1DTriangleType = "FTDecayFunction1DTriangle";
+const ModelType FTDecayFunction1DVoigtType = "FTDecayFunction1DVoigt";
+
+const ModelType FTDecayFunction2DCauchyType = "FTDecayFunction2DCauchy";
+const ModelType FTDecayFunction2DGaussType = "FTDecayFunction2DGauss";
+const ModelType FTDecayFunction2DVoigtType = "FTDecayFunction2DVoigt";
+
+const ModelType BasicLatticeType = "BasicLatticeType";
+const ModelType SquareLatticeType = "SquareLatticeType";
+const ModelType HexagonalLatticeType = "HexagonalLatticeType";
+
+const ModelType MaterialType = "Material";
+const ModelType HomogeneousMaterialType = "Homogeneous Material";
+const ModelType HomogeneousMagneticMaterialType = "Homogeneous Magnetic Material";
+
+const ModelType RefractiveIndexType = "RefractiveIndex";
+
+const ModelType MagneticFieldType = "MagneticField";
+
+const ModelType ParameterContainerType = "Parameter Container";
+const ModelType ParameterType = "Parameter";
+const ModelType ParameterLabelType = "Parameter Label";
+
+const ModelType FitParameterContainerType = "FitParameterContainer";
+const ModelType FitParameterType = "FitParameter";
+const ModelType FitParameterLinkType = "FitParameterLink";
+const ModelType FitSuiteType = "FitSuite";
+
+const ModelType JobItemType = "JobItem";
+const ModelType IntensityDataType = "IntensityData";
+
+const ModelType BasicAxisType = "BasicAxis";
+const ModelType AmplitudeAxisType = "AmplitudeAxis";
+
+const ModelType BeamDistributionType = "BeamDistribution";
+const ModelType BeamWavelengthType = "BeamWavelength";
+const ModelType BeamAzimuthalAngleType = "BeamAzimuthalAngle";
+const ModelType BeamInclinationAngleType = "BeamInclinationAngle";
+
+const ModelType ResolutionFunctionNoneType = "ResolutionFunctionNone";
+const ModelType ResolutionFunction2DGaussianType = "ResolutionFunction2DGaussian";
+
+const ModelType MaskContainerType = "MaskContainer";
+const ModelType RectangleMaskType = "RectangleMask";
+const ModelType PolygonMaskType = "PolygonMask";
+const ModelType PolygonPointType = "PolygonPoint";
+const ModelType EllipseMaskType = "EllipseMask";
+const ModelType VerticalLineMaskType = "VerticalLineMask";
+const ModelType HorizontalLineMaskType = "HorizontalLineMask";
+const ModelType MaskAllType = "MaskAllMask";
+
+const ModelType RegionOfInterestType = "RegionOfInterest";
+
+const ModelType SimulationOptionsType = "SimulationOptions";
+
+const ModelType RealDataType = "RealData";
+const ModelType LinkInstrumentType = "LinkInstrument";
+
+const ModelType MinimizerContainerType = "MinimizerContainer";
+const ModelType MinuitMinimizerType = "Minuit2";
+const ModelType GSLMultiMinimizerType = "GSLMultiMin";
+const ModelType GSLLMAMinimizerType = "GSLLMA";
+const ModelType GSLSimAnMinimizerType = "GSLSimAn";
+const ModelType GeneticMinimizerType = "Genetic";
+const ModelType TestMinimizerType = "Test";
+
+// --- Groups ------------------------------------------------------------------
+
+const ModelType FormFactorGroup = "Form Factor";
+const ModelType RotationGroup = "Rotation group";
+const ModelType LayerRoughnessGroup = "Roughness";
+const ModelType DetectorGroup = "Detector group";
+const ModelType DistributionGroup = "Distribution group";
+const ModelType DistributionExtendedGroup = "Distribution extended group";
+const ModelType FTDistribution1DGroup = "PDF 1D";
+const ModelType FTDistribution2DGroup = "PDF 2D";
+const ModelType FTDecayFunction1DGroup = "Decay function 1D";
+const ModelType FTDecayFunction2DGroup = "Decay function 2D";
+const ModelType LatticeGroup = "Lattice group";
+const ModelType MaterialGroup = "Material group";
+const ModelType ResolutionFunctionGroup = "Resolution function group";
+const ModelType MinimizerLibraryGroup = "Minimizer library group";
+
+// --- Units&Constants----------------------------------------------------------
+const ModelType UnitsNbins = "nbins";
+const ModelType UnitsRadians = "Radians";
+const ModelType UnitsDegrees = "Degrees";
+const ModelType UnitsMm = "mm";
+const ModelType UnitsQyQz = "Qy,Qz";
+
+const ModelType STATUS_IDLE = "Idle";
+const ModelType STATUS_RUNNING = "Running";
+const ModelType STATUS_FITTING = "Fitting";
+const ModelType STATUS_COMPLETED = "Completed";
+const ModelType STATUS_CANCELED = "Canceled";
+const ModelType STATUS_FAILED = "Failed";
+
+const ModelType GRADIENT_GRAYSCALE = "Grayscale";
+const ModelType GRADIENT_HOT = "Hot";
+const ModelType GRADIENT_COLD = "Cold";
+const ModelType GRADIENT_NIGHT = "Night";
+const ModelType GRADIENT_CANDY = "Candy";
+const ModelType GRADIENT_GEOGRAPHY = "Geography";
+const ModelType GRADIENT_ION = "Ion";
+const ModelType GRADIENT_THERMAL = "Thermal";
+const ModelType GRADIENT_POLAR = "Polar";
+const ModelType GRADIENT_SPECTRUM = "Spectrum";
+const ModelType GRADIENT_JET = "Jet";
+const ModelType GRADIENT_HUES = "Hues";
+
+const ModelType JOB_RUN_IMMEDIATELY = "Immediately";
+const ModelType JOB_RUN_IN_BACKGROUND = "In background";
+const ModelType JOB_RUN_SUBMIT_ONLY = "Submit only";
+const ModelType JOB_BACKUP = "_backup";
+
+const ModelType SIMULATION_ANALYTICAL = "Analytical";
+const ModelType SIMULATION_MONTECARLO = "Monte-Carlo Integration";
+
+const ModelType ALIGNMENT_GENERIC = "Generic";
+const ModelType ALIGNMENT_TO_SAMPLE = "Perpendicular to sample x-axis";
+const ModelType ALIGNMENT_TO_DIRECT_BEAM = "Perpendicular to direct beam";
+const ModelType ALIGNMENT_TO_REFLECTED_BEAM = "Perpendicular to reflected beam";
+const ModelType ALIGNMENT_TO_REFLECTED_BEAM_DPOS = "Perpendicular to reflected beam (dpos)";
+
+const ModelType FITPAR_FIXED = "fixed";
+const ModelType FITPAR_LIMITED = "limited";
+const ModelType FITPAR_LOWERLIMITED = "lower limited";
+const ModelType FITPAR_UPPERLIMITED = "upper limited";
+const ModelType FITPAR_FREE = "free";
+
+}
+
+#endif // ITEM_CONSTANTS_H
diff --git a/GUI/coregui/Views/AccordionWidget/AccordionWidget.cpp b/GUI/coregui/Views/AccordionWidget/AccordionWidget.cpp
new file mode 100644
index 0000000..8248130
--- /dev/null
+++ b/GUI/coregui/Views/AccordionWidget/AccordionWidget.cpp
@@ -0,0 +1,434 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/AccordionWidget/AccordionWidget.cpp
+//! @brief     Implements AccordionWidget class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+// This file is part of qAccordion. An Accordion widget for Qt
+// Copyright © 2015 Christian Rapp <0x2a at posteo dot org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#include "AccordionWidget.h"
+
+
+AccordionWidget::AccordionWidget(QWidget *parent) : QWidget(parent)
+{
+    // make sure our resource file gets initialized
+    Q_INIT_RESOURCE(accordionwidgeticons);
+
+    this->multiActive = true;
+    this->collapsible = true;
+
+    // set our basic layout
+    this->setLayout(new QVBoxLayout());
+
+    // add a stretch to the end so all content panes are at the top
+    dynamic_cast<QVBoxLayout *>(this->layout())->addStretch();
+    this->layout()->setSpacing(1);
+    this->layout()->setContentsMargins(QMargins());
+    // TODO: Do we need to keep a pointer to the spacer?
+    this->spacer = dynamic_cast<QSpacerItem *>(this->layout()->itemAt(0));
+
+    // seome things we want to do if the number of panes change
+    QObject::connect(this, &AccordionWidget::numberOfContentPanesChanged, this,
+                     &AccordionWidget::numberOfPanesChanged);
+}
+
+int AccordionWidget::numberOfContentPanes() { return this->contentPanes.size(); }
+
+int AccordionWidget::addContentPane(QString header)
+{
+    return this->internalAddContentPane(std::move(header));
+}
+
+int AccordionWidget::addContentPane(QString header, QFrame *contentFrame)
+{
+    return this->internalAddContentPane(std::move(header), contentFrame);
+}
+
+int AccordionWidget::addContentPane(ContentPane *cpane)
+{
+    return this->internalAddContentPane("", nullptr, cpane);
+}
+
+bool AccordionWidget::insertContentPane(uint index, QString header)
+{
+    return this->internalInsertContentPane(index, header);
+}
+
+bool AccordionWidget::insertContentPane(uint index, QString header,
+                                   QFrame *contentFrame)
+{
+    return this->internalInsertContentPane(index, header, contentFrame);
+}
+
+bool AccordionWidget::insertContentPane(uint index, ContentPane *cpane)
+{
+    return this->internalInsertContentPane(index, "", nullptr, cpane);
+}
+
+bool AccordionWidget::swapContentPane(uint index, ContentPane *cpane)
+{
+    if (this->checkIndexError(index, false,
+                              "Can not swap content pane at index " +
+                                  QString::number(index) +
+                                  ". Index out of range.")) {
+        return false;
+    }
+
+    if (this->findContentPaneIndex("", nullptr, cpane) != -1) {
+        this->errorString = "Can not swap content pane as new pane is already "
+                            "managed by accordion widget";
+        return false;
+    }
+
+    // remove the old content pane from the accordion layout
+    dynamic_cast<QVBoxLayout *>(this->layout())
+        ->removeWidget(this->contentPanes.at(index));
+    delete this->contentPanes.at(index);
+
+    // add the new content pane to the appropriate vector
+    this->contentPanes.at(index) = cpane;
+
+    // add the new content pane to the layout
+    dynamic_cast<QVBoxLayout *>(this->layout())
+        ->insertWidget(index, this->contentPanes.at(index));
+
+    return true;
+}
+
+bool AccordionWidget::removeContentPane(bool deleteObject, uint index)
+{
+    return this->internalRemoveContentPane(deleteObject, index);
+}
+
+bool AccordionWidget::removeContentPane(bool deleteObject, QString header)
+{
+    return this->internalRemoveContentPane(deleteObject, -1, header);
+}
+
+bool AccordionWidget::removeContentPane(bool deleteObject, QFrame *contentframe)
+{
+    return this->internalRemoveContentPane(deleteObject, -1, "", contentframe);
+}
+
+bool AccordionWidget::removeContentPane(bool deleteObject, ContentPane *contentPane)
+{
+    return this->internalRemoveContentPane(deleteObject, -1, "", nullptr,
+                                           contentPane);
+}
+
+bool AccordionWidget::moveContentPane(uint currentIndex, uint newIndex)
+{
+    if (this->checkIndexError(currentIndex, false,
+                              "Can not move from " +
+                                  QString::number(currentIndex) +
+                                  ". Index out of range.") ||
+        this->checkIndexError(newIndex, false, "Can not move to " +
+                                                   QString::number(newIndex) +
+                                                   ". Index out of range.")) {
+        return false;
+    }
+
+    QVBoxLayout *layout = dynamic_cast<QVBoxLayout *>(this->layout());
+    // get the pane we want to move
+    ContentPane *movePane = this->contentPanes.at(currentIndex);
+
+    // remove the widget from the layout and insert it at the new position
+    layout->removeWidget(movePane);
+    layout->insertWidget(newIndex, movePane);
+
+    // keep our vector synchronized
+    this->contentPanes.erase(this->contentPanes.begin() + currentIndex);
+    this->contentPanes.insert(this->contentPanes.begin() + newIndex, movePane);
+
+    return true;
+}
+
+ContentPane *AccordionWidget::getContentPane(uint index)
+{
+    try {
+        return this->contentPanes.at(index);
+    } catch (const std::out_of_range &ex) {
+        qDebug() << Q_FUNC_INFO << "Can not return Content Pane: " << ex.what();
+        this->errorString = "Can not return Content Pane: " + QString(ex.what());
+        return nullptr;
+    }
+}
+
+int AccordionWidget::getContentPaneIndex(QString header)
+{
+    return this->findContentPaneIndex(header);
+}
+
+int AccordionWidget::getContentPaneIndex(QFrame *contentFrame)
+{
+    return this->findContentPaneIndex("", contentFrame);
+}
+
+int AccordionWidget::getContentPaneIndex(ContentPane *contentPane)
+{
+    return this->findContentPaneIndex("", nullptr, contentPane);
+}
+
+void AccordionWidget::getActiveContentPaneIndex(std::vector<int> &indexVector)
+{
+    // first of all make sure it is empty
+    indexVector.clear();
+    std::for_each(this->contentPanes.begin(), this->contentPanes.end(),
+                  [&indexVector, this](ContentPane *pane) {
+                      if (pane->getActive()) {
+                          indexVector.push_back(
+                              this->findContentPaneIndex("", nullptr, pane));
+                      }
+                  });
+}
+
+int AccordionWidget::getNumberOfContentPanes() { return this->contentPanes.size(); }
+
+void AccordionWidget::setMultiActive(bool status) { this->multiActive = status; }
+
+bool AccordionWidget::getMultiActive() { return this->multiActive; }
+
+void AccordionWidget::setCollapsible(bool status) { this->collapsible = status; }
+
+bool AccordionWidget::getCollapsible() { return this->collapsible; }
+
+QString AccordionWidget::getError() { return this->errorString; }
+
+int AccordionWidget::internalAddContentPane(QString header, QFrame *cframe,
+                                       ContentPane *cpane)
+{
+    if (this->findContentPaneIndex(header, cframe, cpane) != -1) {
+        this->errorString = "Can not add content pane as it already exists";
+        return -1;
+    }
+
+    if (cpane == nullptr) {
+        if (cframe != nullptr) {
+            cpane = new ContentPane(std::move(header), cframe);
+        } else {
+            cpane = new ContentPane(std::move(header));
+        }
+    }
+    dynamic_cast<QVBoxLayout *>(this->layout())
+        ->insertWidget(this->layout()->count() - 1, cpane);
+    this->contentPanes.push_back(cpane);
+
+    // manage the clicked signal in a lambda expression
+    QObject::connect(cpane, &ContentPane::clicked,
+                     [this, cpane]() { this->handleClickedSignal(cpane); });
+
+    emit numberOfContentPanesChanged(this->contentPanes.size());
+
+    return this->contentPanes.size() - 1;
+}
+
+bool AccordionWidget::internalInsertContentPane(uint index, QString header,
+                                           QFrame *contentFrame,
+                                           ContentPane *cpane)
+{
+    if (this->checkIndexError(
+            index, true, "Can not insert Content Pane at index " +
+                             QString::number(index) + ". Index out of range")) {
+        return false;
+    }
+
+    if (this->findContentPaneIndex(header, contentFrame, cpane) != -1) {
+        return false;
+    }
+
+    if (cpane == nullptr) {
+        if (contentFrame != nullptr) {
+            cpane = new ContentPane(std::move(header), contentFrame);
+        } else {
+            cpane = new ContentPane(std::move(header));
+        }
+    }
+
+    dynamic_cast<QVBoxLayout *>(this->layout())->insertWidget(index, cpane);
+
+    this->contentPanes.insert(this->contentPanes.begin() + index, cpane);
+
+    // manage the clicked signal in a lambda expression
+    QObject::connect(cpane, &ContentPane::clicked,
+                     [this, cpane]() { this->handleClickedSignal(cpane); });
+
+    emit numberOfContentPanesChanged(this->contentPanes.size());
+
+    return true;
+}
+
+bool AccordionWidget::internalRemoveContentPane(bool deleteOject, int index,
+                                           QString name, QFrame *contentFrame,
+                                           ContentPane *cpane)
+{
+    if (index != -1 &&
+        this->checkIndexError(
+            index, false, "Can not remove content pane at index " +
+                              QString::number(index) + ". Index out of range")) {
+        return false;
+    }
+
+    if (index == -1) {
+        index = this->findContentPaneIndex(std::move(name), contentFrame, cpane);
+        if (index == -1) {
+            this->errorString = "Can not remove content pane as it is not part "
+                                "of the accordion widget";
+            return false;
+        }
+    }
+
+    dynamic_cast<QVBoxLayout *>(this->layout())
+        ->removeWidget(this->contentPanes.at(index));
+
+    // only delete the object if user wants to.
+    if (deleteOject) {
+        delete this->contentPanes.at(index);
+        this->contentPanes.at(index) = nullptr;
+    }
+
+    this->contentPanes.erase(this->contentPanes.begin() + index);
+
+    emit numberOfContentPanesChanged(this->contentPanes.size());
+
+    return true;
+}
+
+int AccordionWidget::findContentPaneIndex(QString name, QFrame *cframe,
+                                     ContentPane *cpane)
+{
+    // simple method that finds the index of a content by Header, content frame
+    // or content pane.
+    int index = -1;
+    if (name != "") {
+        auto result = std::find_if(
+            this->contentPanes.begin(), this->contentPanes.end(),
+            [&name](ContentPane *pane) { return pane->getHeader() == name; });
+        if (result != std::end(this->contentPanes)) {
+            // get the index by subtracting begin iterator from result
+            // iterator
+            // TODO: Is this cast really necessary?
+            index = static_cast<int>(result - this->contentPanes.begin());
+        }
+    }
+    if (cframe != nullptr) {
+        auto result =
+            std::find_if(this->contentPanes.begin(), this->contentPanes.end(),
+                         [cframe](ContentPane *cpane) {
+                             return cpane->getContentFrame() == cframe;
+                         });
+        if (result != std::end(this->contentPanes)) {
+            index = static_cast<int>(result - this->contentPanes.begin());
+        }
+    }
+    if (cpane != nullptr) {
+        auto result = std::find(this->contentPanes.begin(),
+                                this->contentPanes.end(), cpane);
+        if (result != std::end(this->contentPanes)) {
+            index = static_cast<int>(result - this->contentPanes.begin());
+        }
+    }
+    return index;
+}
+
+bool AccordionWidget::checkIndexError(uint index, bool sizeIndexAllowed,
+                                 const QString &errMessage)
+{
+    // sizeIndexAllowed is only used by inserting. If there is one pane you will
+    // be able to insert a new one before and after.
+    // FIXME: Actually there seem to be some bugs hidden here. User may now for
+    // example delete index 0 even if there isn't any content pane. I think we
+    // excluded checking 0 because of inserting.
+    // Update, I removed the 0 exclusion in the second if statement. Really a
+    // fix??
+    if (sizeIndexAllowed) {
+        if (index != 0 && index > this->contentPanes.size()) {
+            qDebug() << Q_FUNC_INFO << errMessage;
+            this->errorString = errMessage;
+            return true;
+        }
+    } else {
+        if (index >= this->contentPanes.size()) {
+            qDebug() << Q_FUNC_INFO << errMessage;
+            this->errorString = errMessage;
+            return true;
+        }
+    }
+    return false;
+}
+
+void AccordionWidget::handleClickedSignal(ContentPane *cpane)
+{
+    // if the clicked content pane is open we simply close it and return
+    if (cpane->getActive()) {
+        // if collapsible and multiActive are false we are not allowed to close
+        // this pane
+        if (!this->collapsible && !this->multiActive) {
+            return;
+        }
+        // when multiActive is true we have to check if there is any other open
+        // cpane. if so we can close this one
+        std::vector<int> activePanes;
+        if (!this->collapsible) {
+            this->getActiveContentPaneIndex(activePanes);
+            if (activePanes.size() == 1)
+                return; // only one active --> good bye :)
+        }
+        cpane->closeContentPane();
+        return;
+    }
+    // if it is not open we will open it and search our vector for other
+    // panes that are already open.
+    // TODO: Is it really necessary to search for more than one open cpane?
+    if (!cpane->getActive()) {
+        // check if multiActive is allowed
+        if (!this->getMultiActive()) {
+            std::for_each(this->contentPanes.begin(), this->contentPanes.end(),
+                          [](ContentPane *pane) {
+                              if (pane->getActive())
+                                  pane->closeContentPane();
+                          });
+        }
+        cpane->openContentPane();
+    }
+}
+
+void AccordionWidget::numberOfPanesChanged(int number)
+{
+    // automatically open contentpane if we have only one and collapsible is
+    // false
+    if (number == 1 && this->collapsible == false) {
+        this->contentPanes.at(0)->openContentPane();
+    }
+}
+
+void AccordionWidget::paintEvent(ATTR_UNUSED QPaintEvent *event)
+{
+    QStyleOption o;
+    o.initFrom(this);
+    QPainter p(this);
+    style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this);
+}
diff --git a/GUI/coregui/Views/AccordionWidget/AccordionWidget.h b/GUI/coregui/Views/AccordionWidget/AccordionWidget.h
new file mode 100644
index 0000000..7ee4e93
--- /dev/null
+++ b/GUI/coregui/Views/AccordionWidget/AccordionWidget.h
@@ -0,0 +1,398 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/AccordionWidget/AccordionWidget.h
+//! @brief     Defines AccordionWidget class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+// This file is part of qAccordion. An Accordion widget for Qt
+// Copyright © 2015 Christian Rapp <0x2a at posteo dot org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef ACCORDIONWIDGET_H
+#define ACCORDIONWIDGET_H
+
+#include "ClickableFrame.h"
+#include "ContentPane.h"
+#include "WinDllMacros.h"
+#include <QDebug>
+#include <QGridLayout>
+#include <QHBoxLayout>
+#include <QPainter>
+#include <QSpacerItem>
+#include <QString>
+#include <QStyleOption>
+#include <QVBoxLayout>
+#include <QWidget>
+#include <algorithm>
+#include <iterator>
+#include <memory>
+#include <vector>
+
+class ContentPane;
+
+/**
+ * @brief QAccordion base class
+ *
+ * @details
+ * This class is the basis of the qAccordion widget. If you want to add a
+ * accordion widget to your gui then you have to create an object of this class.
+ *
+ * Managing content panes is simpel:
+ * * You can either add (addContentPane()) or insert (insertContentPane()) new ContentPanes.
+ * * Use removeContentPane() to remove existing ContentPanes.
+ * * moveContentPane() allows you to change the order of the ContentPanes.
+ * * To change a ContentPane in place use swapContentPane()
+ *
+ * @note
+ * Many of the mentioned functions are overloaded, provided for convenience.
+ *
+ * @details
+ * The signal numberOfContentPanesChanged() is emitted whenever the number of
+ * content panes changed.
+ *
+ * In case of an error you may get a more detailed error description with
+ * getError().
+ *
+ * @warning
+ * Currently Headers have to be unique
+ *
+ */
+class BA_CORE_API_ AccordionWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    /**
+     * @brief QAccordion constructor
+     * @param parent Optionally provide a parent widget
+     */
+    explicit AccordionWidget(QWidget *parent = 0);
+
+    /**
+     * @brief Returns the number of content panes
+     * @return int
+     */
+    int numberOfContentPanes();
+
+    /**
+     * @brief Add a new content Pane
+     * @param header Header of the content pane
+     * @return Content pane index
+     *
+     * @details
+     * Use this method to add a new content pane with the Header header.
+     * The method will return the index of the new content pane, or <b>-1</b> if
+     * the pane was not added because \p header already exists.
+     */
+    int addContentPane(QString header);
+    /**
+     * @brief Add a new content Pane
+     * @param header Header of the content pane
+     * @param contentFrame The content of the pane
+     * @return Content pane index
+     *
+     * @details
+     * This is an overloaded method of addContentPane(QString), that
+     * allows you to provide your own content frame.
+     * @warning
+     * Headers have to be unique
+     */
+    int addContentPane(QString header, QFrame *contentFrame);
+    /**
+     * @brief Add content pane
+     * @param cpane New content pane to add
+     * @return Content pane index
+     *
+     * @details
+     * This is an overloaded method of addContentPane(QString), that
+     * allows you to provide your own content pane.
+     */
+    int addContentPane(ContentPane *cpane);
+    /**
+     * @brief Insert content pane
+     * @param index Index of the content pane
+     * @param header Header of the content pane
+     * @return bool True if insert was successfull
+     *
+     * @details
+     * You can use this method to insert a new content pane at given index with
+     * \p header defining the Header. An empty content pane will be created that
+     * you can get with getContentPane().
+     *
+     * Returns true if the insert was successfull.
+     */
+    bool insertContentPane(uint index, QString header);
+    /**
+     * @brief Insert content pane
+     * @param index Index of the content pane
+     * @param header Header of the content pane
+     * @param contentFrame Content frame of the content pane
+     * @return bool True if insert was successfull
+     *
+     * @details
+     * This is an overloaded method of insertContentPane(uint, QString).
+     * Use this method when you already created a content frame that you want to
+     * insert.
+     * @warning
+     * Headers have to be unique
+     */
+    bool insertContentPane(uint index, QString header, QFrame *contentFrame);
+    /**
+     * @brief Insert content pane
+     * @param index Index of the content pane
+     * @param cpane Content Pane to insert
+     * @return bool True if insert was successfull
+     *
+     * @details
+     * This is an overloaded method of insertContentPane(uint, QString).
+     * Use this method when you already created a content pane that you want to
+     * insert.
+     */
+    bool insertContentPane(uint index, ContentPane *cpane);
+
+    /**
+     * @brief Swap the content pane
+     * @param index Index of the content pane to swap
+     * @param cpane New content pane
+     * @return bool True if swap was successfull
+     *
+     * @details
+     * With this method you can replace an existing content pane at \p index with
+     * a new one \p cpane.
+     *
+     * Returns true if the swap was successfull.
+     *
+     * The old content pane will be __deleted__.
+     */
+    bool swapContentPane(uint index, ContentPane *cpane);
+
+    /**
+     * @brief Remove a content pane
+     * @param deleteObject Delete the object and free memory
+     * @param index Index of the content pane
+     * @return bool
+     *
+     * @details
+     * Remove a content pane at \p index. If \p deleteObject is \p true the
+     * object will be deleted. Otherwise it is up to the user to
+     * free the allocated memory.
+     *
+     * Returns true if the pane was removed and false otherwise.
+     */
+    bool removeContentPane(bool deleteObject, uint index);
+    /**
+     * @brief Remove a content pane
+     * @param deleteObject Delete the object and free memory
+     * @param header Header of the content pane
+     * @return bool
+     *
+     * @details
+     * This is an overloaded method of removeContentPane(bool, uint).
+     */
+    bool removeContentPane(bool deleteObject, QString header);
+    /**
+     * @brief Remove a content pane
+     * @param deleteObject Delete the object and free memory
+     * @param contentframe Content frame of the content pane
+     * @return bool
+     *
+     * @details
+     * This is an overloaded method of removeContentPane(bool, uint).
+     */
+    bool removeContentPane(bool deleteObject, QFrame *contentframe);
+    /**
+     * @brief Remove a content pane
+     * @param deleteObject Delete the object and free memory
+     * @param contentPane The content pane to remove
+     * @return bool
+     *
+     * @details
+     * This is an overloaded method of removeContentPane(bool, uint).
+     */
+    bool removeContentPane(bool deleteObject, ContentPane *contentPane);
+
+    /**
+     * @brief Move content pane
+     * @param currentIndex The current index of the content pane.
+     * @param newIndex The new index of the current pane
+     * @return bool
+     *
+     * @details
+     * Moves a content from \p currentIndex to \p newIndex. Returns true if the
+     * content pane was moved, false otherwise.
+     */
+    bool moveContentPane(uint currentIndex, uint newIndex);
+
+    /**
+     * @brief Get content pane
+     * @param index Index of the content pane
+     * @return QFrame* or nullptr
+     *
+     * @details
+     * Get a content pane (QFrame*) with \p index. This method will return a
+     * __nullptr__ if the content pane does not exist.
+     */
+    ContentPane *getContentPane(uint index);
+
+    /**
+     * @brief Get the index of a content pane
+     * @param header Header of the Content Pane
+     * @return Index of the content pane
+     *
+     * @details
+     * Get the index of a ContentPane with \p header. This method will return
+     * <b>-1</b> if a ContentPane with this header does not exist.
+     */
+    int getContentPaneIndex(QString header);
+    /**
+     * @brief Get the index of a content pane
+     * @param contentFrame Content Frame
+     * @return Index of the content pane
+     *
+     * @details
+     * This is an overloaded function of getContentPaneIndex(QString)
+     */
+    int getContentPaneIndex(QFrame *contentFrame);
+    /**
+     * @brief Get the index of a content pane
+     * @param contentPane ContentPane*
+     * @return Index of the content pane
+     *
+     * @details
+     * This is an overloaded function of getContentPaneIndex(QString)
+     */
+    int getContentPaneIndex(ContentPane *contentPane);
+
+    /**
+     * @brief Get the index of the active ContentPane
+     * @return Vector with indexes of all active ContentPanes
+     *
+     * @details
+     * This method will fill a vector with the index of all active ContentPanes.
+     * The vector will be empty if no ContentPane is active
+     */
+    void getActiveContentPaneIndex(std::vector<int> &indexVector);
+
+    /**
+     * @brief Get the number of content panes
+     * @return Number of content panes
+     */
+    int getNumberOfContentPanes();
+
+    /**
+     * @brief Allow multiple ContentPane to be open
+     * @param status
+     *
+     * @details
+     * This option allows you to open several ContentPane at the same time.
+     * @note
+     * Default value for this option is \p false.
+     */
+    void setMultiActive(bool status);
+    /**
+     * @brief Check status of multiActive
+     * @return bool
+     *
+     * @sa
+     * setMultiActive()
+     */
+    bool getMultiActive();
+
+    /**
+     * @brief If collapsible is true you can close all ContentPanes
+     * @param status
+     *
+     * @details
+     * With the collapsible option you can control if one content pane has to be
+     * open and can't be closed.
+     */
+    void setCollapsible(bool status);
+    /**
+     * @brief Get collapsible status
+     * @return bool
+     * @sa
+     * setCollapsible()
+     */
+    bool getCollapsible();
+
+    /**
+     * @brief Get error string
+     * @return Error string
+     *
+     * @details
+     * Call this method after a function call failed for a detailed error
+     * description.
+     */
+    QString getError();
+
+signals:
+    /**
+     * @brief Signals the new number of content panes
+     * @param number Number of content panes
+     *
+     * @details
+     * Signal will be emitted if the number of content panes changes
+     */
+    void numberOfContentPanesChanged(int number);
+
+public slots:
+
+private:
+    std::vector<ContentPane *> contentPanes;
+
+    QSpacerItem *spacer;
+
+    QString errorString;
+
+    bool multiActive;
+    bool collapsible;
+
+    int internalAddContentPane(QString header, QFrame *cframe = nullptr,
+                               ContentPane *cpane = nullptr);
+    bool internalInsertContentPane(uint index, QString header,
+                                   QFrame *contentFrame = nullptr,
+                                   ContentPane *cpane = nullptr);
+    bool internalRemoveContentPane(bool deleteOject, int index = -1,
+                                   QString name = "",
+                                   QFrame *contentFrame = nullptr,
+                                   ContentPane *cpane = nullptr);
+    int findContentPaneIndex(QString name = "", QFrame *cframe = nullptr,
+                             ContentPane *cpane = nullptr);
+
+    bool checkIndexError(uint index, bool sizeIndexAllowed,
+                         const QString &errMessage);
+    void handleClickedSignal(ContentPane *cpane);
+
+private slots:
+    void numberOfPanesChanged(int number);
+
+protected:
+    /**
+     * @brief paintEvent Reimplement paintEvent to use stylesheets in derived Widgets
+     * @param event
+     */
+    void paintEvent(ATTR_UNUSED QPaintEvent *event);
+};
+
+#endif // ACCORDIONWIDGET_H
diff --git a/GUI/coregui/Views/AccordionWidget/ClickableFrame.cpp b/GUI/coregui/Views/AccordionWidget/ClickableFrame.cpp
new file mode 100644
index 0000000..1114835
--- /dev/null
+++ b/GUI/coregui/Views/AccordionWidget/ClickableFrame.cpp
@@ -0,0 +1,133 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/AccordionWidget/ClickableFrame.cpp
+//! @brief     Implements AccordionWidget class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+// This file is part of qAccordion. An Accordion widget for Qt
+// Copyright © 2015 Christian Rapp <0x2a at posteo dot org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#include "ClickableFrame.h"
+#include <QDebug>
+#include <QStyleOption>
+
+ClickableFrame::ClickableFrame(QString header, QWidget *parent,
+                               Qt::WindowFlags f)
+    : QFrame(parent, f)
+    , header(header)
+{
+    this->setAttribute(Qt::WA_Hover, true);
+    this->clickable = true;
+    this->setCursor(Qt::PointingHandCursor);
+    QColor background = this->palette().color(QPalette::ColorRole::Background);
+    QColor lighter = background.lighter(110);
+    this->normalStylesheet = "";
+    this->hoverStylesheet = "QFrame {background-color: " + lighter.name() + ";}";
+    this->initFrame();
+}
+
+void ClickableFrame::setClickable(bool status)
+{
+    this->clickable = status;
+    if (status) {
+        this->setCursor(Qt::PointingHandCursor);
+    } else {
+        this->setCursor(Qt::ForbiddenCursor);
+    }
+}
+
+bool ClickableFrame::getClickable() { return this->clickable; }
+
+void ClickableFrame::setHeader(QString header)
+{
+    this->header = header;
+    this->nameLabel->setText(this->header);
+}
+
+QString ClickableFrame::getHeader() { return this->header; }
+
+void ClickableFrame::setNormalStylesheet(QString stylesheet)
+{
+    this->normalStylesheet = stylesheet;
+    this->setStyleSheet(this->normalStylesheet);
+}
+
+QString ClickableFrame::getNormalStylesheet() { return this->normalStylesheet; }
+
+void ClickableFrame::setHoverStylesheet(QString stylesheet)
+{
+    this->hoverStylesheet = stylesheet;
+}
+
+QString ClickableFrame::getHoverStylesheet() { return this->hoverStylesheet; }
+
+void ClickableFrame::setCaretPixmap(QString pixmapPath)
+{
+    this->caretLabel->setPixmap(QPixmap(pixmapPath));
+}
+
+void ClickableFrame::initFrame()
+{
+    this->setSizePolicy(QSizePolicy::Policy::Preferred,
+                        QSizePolicy::Policy::Fixed);
+    this->setLayout(new QHBoxLayout());
+
+    this->caretLabel = new QLabel();
+    this->caretLabel->setPixmap(QPixmap(":/qAccordionIcons/caret-right.png"));
+    this->layout()->addWidget(this->caretLabel);
+
+    this->nameLabel = new QLabel();
+    nameLabel->setText(this->header);
+    this->layout()->addWidget(nameLabel);
+
+    dynamic_cast<QHBoxLayout *>(this->layout())->addStretch();
+
+    this->setStyleSheet(this->normalStylesheet);
+}
+
+void ClickableFrame::mousePressEvent(QMouseEvent *event)
+{
+    if (this->clickable) {
+        emit this->singleClick(event->pos());
+        event->accept();
+    } else {
+        event->ignore();
+    }
+}
+
+void ClickableFrame::enterEvent(ATTR_UNUSED QEvent *event)
+{
+    if (this->clickable) {
+        this->setStyleSheet(this->hoverStylesheet);
+    }
+}
+
+void ClickableFrame::leaveEvent(ATTR_UNUSED QEvent *event)
+{
+    if (this->clickable) {
+        this->setStyleSheet(this->normalStylesheet);
+    }
+}
diff --git a/GUI/coregui/Views/AccordionWidget/ClickableFrame.h b/GUI/coregui/Views/AccordionWidget/ClickableFrame.h
new file mode 100644
index 0000000..132b5eb
--- /dev/null
+++ b/GUI/coregui/Views/AccordionWidget/ClickableFrame.h
@@ -0,0 +1,176 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/AccordionWidget/ClickableFrame.h
+//! @brief     Defines AccordionWidget class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+// This file is part of qAccordion. An Accordion widget for Qt
+// Copyright © 2015 Christian Rapp <0x2a at posteo dot org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef CLICKABLEFRAME_H
+#define CLICKABLEFRAME_H
+
+#include "WinDllMacros.h"
+#include <QFrame>
+#include <QGraphicsView>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QMouseEvent>
+#include <QString>
+
+#ifdef __GNUC__
+  #define ATTR_UNUSED __attribute__((unused))
+#else
+  #define ATTR_UNUSED
+#endif
+
+// TODO: No need to use a namespace for our constants as we are using them only
+// in this class
+namespace ClickableFrame_constants
+{
+const char *const CARRET_ICON_CLOSED = ":/qAccordionIcons/caret-right.png"; /**< Qt qrc "path" for the closed icon */
+const char *const CARRET_ICON_OPENED = ":/qAccordionIcons/caret-bottom.png"; /**< Qt qrc "path" for the opened icon */
+}
+
+/**
+ * @brief The ClickableFrame class
+ *
+ * This class represents a clickable QFrame. It is used by a ContentPane. The class
+ * is used internally.
+ */
+class BA_CORE_API_ ClickableFrame : public QFrame
+{
+
+    Q_OBJECT
+public:
+    /**
+     * @brief ClickableFrame constructor
+     * @param header Header of the frame
+     * @param parent Parent widget or 0
+     * @param f Qt::WindowFlags
+     */
+    explicit ClickableFrame(QString header, QWidget *parent = 0,
+                            Qt::WindowFlags f = 0);
+
+    // TODO: Expose this function to the ContentPane api
+    /**
+     * @brief Change clickable status
+     * @param status
+     *
+     * @warning
+     * This function is currently not exposed by the qAccordion api.
+     */
+    void setClickable(bool status);
+    /**
+     * @brief Check if the frame is clickable
+     * @return bool
+     */
+    bool getClickable();
+    /**
+     * @brief Set the header string
+     * @param header
+     */
+    void setHeader(QString header);
+    /**
+     * @brief Get the header string
+     * @return QString
+     */
+    QString getHeader();
+    /**
+     * @brief Set the default stylesheet
+     * @param stylesheet
+     */
+    void setNormalStylesheet(QString stylesheet);
+    /**
+     * @brief Get the default stylesheet
+     * @return QString
+     */
+    QString getNormalStylesheet();
+    /**
+     * @brief Set mouseover stylesheet
+     * @param stylesheet
+     */
+    void setHoverStylesheet(QString stylesheet);
+    /**
+     * @brief Get mouseover stylesheet
+     * @return
+     */
+    QString getHoverStylesheet();
+
+signals:
+    /**
+     * @brief Signal that is emitted upon a singleclick
+     * @param pos
+     */
+    void singleClick(QPoint pos);
+
+public slots:
+
+    /**
+     * @brief Set the caret pixmap
+     * @param pixmapPath
+     *
+     * @details
+     * Set the carret pixmap according to the state (expanded, retracted) of the
+     * ContentPane that this ClickableFrame belongs to.
+     */
+    void setCaretPixmap(QString pixmapPath);
+
+private:
+    QLabel *caretLabel;
+    QLabel *nameLabel;
+
+    QString hoverStylesheet;
+    QString normalStylesheet;
+
+    QString header;
+    QString tooltip;
+
+    bool clickable;
+
+    void initFrame();
+
+protected:
+
+    /**
+     * @brief Reimplemented function to QMouseEvents
+     * @param event
+     */
+    void mousePressEvent(QMouseEvent *event);
+
+    /**
+     * @brief Enter event for mouse over effects.
+     * @param event
+     */
+    void enterEvent(QEvent *event);
+    /**
+     * @brief Leave effect for mouse over effects.
+     * @param event
+     */
+    void leaveEvent(QEvent *event);
+};
+
+#endif // CLICKABLEFRAME_H
diff --git a/GUI/coregui/Views/AccordionWidget/ContentPane.cpp b/GUI/coregui/Views/AccordionWidget/ContentPane.cpp
new file mode 100644
index 0000000..acb7905
--- /dev/null
+++ b/GUI/coregui/Views/AccordionWidget/ContentPane.cpp
@@ -0,0 +1,233 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/AccordionWidget/ContentPane.cpp
+//! @brief     Implements ContentPane class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+// This file is part of qAccordion. An Accordion widget for Qt
+// Copyright © 2015 Christian Rapp <0x2a at posteo dot org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#include "ContentPane.h"
+
+namespace clickcon = ClickableFrame_constants;
+
+ContentPane::ContentPane(QString header, QWidget *parent) : QWidget(parent)
+{
+    this->content = nullptr;
+
+    this->initDefaults(std::move(header));
+}
+
+ContentPane::ContentPane(QString header, QFrame *content, QWidget *parent)
+    : QWidget(parent) , content(content)
+{
+    this->initDefaults(std::move(header));
+}
+
+bool ContentPane::getActive() { return this->active; }
+
+QFrame *ContentPane::getContentFrame() { return this->content; }
+
+void ContentPane::setContentFrame(QFrame *content)
+{
+    this->container->layout()->removeWidget(this->content);
+    if (this->content != nullptr)
+        delete (this->content);
+    this->content = content;
+    dynamic_cast<QVBoxLayout *>(this->container->layout())
+        ->insertWidget(0, this->content);
+}
+
+int ContentPane::getMaximumHeight() { return this->container->maximumHeight(); }
+
+void ContentPane::setMaximumHeight(int maxHeight)
+{
+    this->containerAnimationMaxHeight = maxHeight;
+
+    if (this->getActive())
+        this->container->setMaximumHeight(this->containerAnimationMaxHeight);
+    this->openAnimation->setEndValue(this->containerAnimationMaxHeight);
+    this->closeAnimation->setStartValue(this->containerAnimationMaxHeight);
+}
+
+void ContentPane::setHeader(QString header)
+{
+    this->header->setHeader(std::move(header));
+}
+
+QString ContentPane::getHeader() { return this->header->getHeader(); }
+
+void ContentPane::setHeaderTooltip(QString tooltip)
+{
+    this->header->setToolTip(tooltip);
+}
+
+QString ContentPane::getHeaderTooltip() { return this->header->toolTip(); }
+
+void ContentPane::setHeaderStylesheet(QString stylesheet)
+{
+    this->header->setNormalStylesheet(std::move(stylesheet));
+}
+
+QString ContentPane::getHeaderStylesheet()
+{
+    return this->header->getNormalStylesheet();
+}
+
+void ContentPane::setHeaderHoverStylesheet(QString stylesheet)
+{
+    this->header->setHoverStylesheet(std::move(stylesheet));
+}
+
+QString ContentPane::getHeaderHoverStylesheet()
+{
+    return this->header->getHoverStylesheet();
+}
+
+void ContentPane::setHeaderFrameStyle(int style)
+{
+    this->header->setFrameStyle(style);
+}
+
+int ContentPane::getHeaderFrameStyle() { return this->header->frameStyle(); }
+
+void ContentPane::setContainerFrameStyle(int style)
+{
+    this->container->setFrameStyle(style);
+}
+
+int ContentPane::getContainerFrameStyle()
+{
+    return this->container->frameStyle();
+}
+
+void ContentPane::openContentPane()
+{
+    if (this->getActive())
+        return;
+    this->openAnimation->start();
+    this->header->setCaretPixmap(clickcon::CARRET_ICON_OPENED);
+    this->active = true;
+}
+
+void ContentPane::closeContentPane()
+{
+    if (!this->getActive())
+        return;
+    this->closeAnimation->start();
+    this->header->setCaretPixmap(clickcon::CARRET_ICON_CLOSED);
+    this->active = false;
+}
+
+void ContentPane::initDefaults(QString header)
+{
+    this->active = false;
+
+    this->headerFrameStyle = QFrame::Shape::StyledPanel | QFrame::Shadow::Raised;
+    this->contentPaneFrameStyle =
+        QFrame::Shape::StyledPanel | QFrame::Shadow::Plain;
+    this->containerAnimationMaxHeight = 150;
+    // TODO: Why do I need to set the vertial policy to Maximum? from the api
+    // documentation Minimum would make more sens :/
+    this->setSizePolicy(QSizePolicy::Policy::Preferred,
+                        QSizePolicy::Policy::Maximum);
+
+    this->setLayout(new QVBoxLayout());
+    this->layout()->setSpacing(0);
+    this->layout()->setContentsMargins(QMargins());
+
+    this->initHeaderFrame(std::move(header));
+    this->initContainerContentFrame();
+    this->initAnimations();
+}
+
+void ContentPane::initHeaderFrame(QString header)
+{
+    this->header = new ClickableFrame(std::move(header));
+    this->header->setFrameStyle(this->headerFrameStyle);
+    this->layout()->addWidget(this->header);
+
+    QObject::connect(this->header, &ClickableFrame::singleClick, this,
+                     &ContentPane::headerClicked);
+}
+
+void ContentPane::initContainerContentFrame()
+{
+    this->container = new QFrame();
+    this->container->setLayout(new QVBoxLayout());
+    this->container->setFrameStyle(this->contentPaneFrameStyle);
+    this->container->setMaximumHeight(0);
+    this->container->setSizePolicy(QSizePolicy::Policy::Preferred,
+                                   QSizePolicy::Policy::Preferred);
+    this->layout()->addWidget(this->container);
+
+    if (this->content == nullptr) {
+        this->content = new QFrame();
+    }
+
+    this->container->layout()->addWidget(this->content);
+    this->container->layout()->setSpacing(0);
+    this->container->layout()->setContentsMargins(QMargins());
+}
+
+void ContentPane::initAnimations()
+{
+    this->openAnimation =
+        std::unique_ptr<QPropertyAnimation>(new QPropertyAnimation());
+    this->closeAnimation =
+        std::unique_ptr<QPropertyAnimation>(new QPropertyAnimation());
+    // TODO: Currently these animations only animate maximumHeight. This leads to
+    // different behaviour depending on whether the Accordion Widget is placed
+    // inside a QScollWidget or not. Maybe we also need to animate minimumHeight
+    // as well to get the same effect.
+    this->openAnimation->setTargetObject(this->container);
+    this->openAnimation->setPropertyName("maximumHeight");
+    this->closeAnimation->setTargetObject(this->container);
+    this->closeAnimation->setPropertyName("maximumHeight");
+
+    this->openAnimation->setDuration(100);
+    this->closeAnimation->setDuration(100);
+    this->openAnimation->setStartValue(0);
+    this->closeAnimation->setStartValue(this->containerAnimationMaxHeight);
+    this->openAnimation->setEndValue(this->containerAnimationMaxHeight);
+    this->closeAnimation->setEndValue(0);
+    this->openAnimation->setEasingCurve(
+        QEasingCurve(QEasingCurve::Type::Linear));
+    this->closeAnimation->setEasingCurve(
+                QEasingCurve(QEasingCurve::Type::Linear));
+}
+
+void ContentPane::headerClicked() {
+    emit this->clicked();
+}
+
+void ContentPane::paintEvent(ATTR_UNUSED QPaintEvent *event)
+{
+    QStyleOption o;
+    o.initFrom(this);
+    QPainter p(this);
+    style()->drawPrimitive(QStyle::PE_Widget, &o, &p, this);
+}
diff --git a/GUI/coregui/Views/AccordionWidget/ContentPane.h b/GUI/coregui/Views/AccordionWidget/ContentPane.h
new file mode 100644
index 0000000..b64ec65
--- /dev/null
+++ b/GUI/coregui/Views/AccordionWidget/ContentPane.h
@@ -0,0 +1,335 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/AccordionWidget/ContentPane.h
+//! @brief     Defines ContentPane class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+// This file is part of qAccordion. An Accordion widget for Qt
+// Copyright © 2015 Christian Rapp <0x2a at posteo dot org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef CONTENTPANE_H
+#define CONTENTPANE_H
+
+#include "AccordionWidget.h"
+#include "ClickableFrame.h"
+#include "WinDllMacros.h"
+#include <QFrame>
+#include <QHBoxLayout>
+#include <QPainter>
+#include <QPoint>
+#include <QPropertyAnimation>
+#include <QString>
+#include <QStyleOption>
+#include <QWidget>
+#include <memory>
+
+// TODO: Do i really need to export the ClickableFrame class?
+/**
+ * @brief Content Pane class
+ *
+ * @details
+ * Content Panes are part of a QAccordion object. They represent a clickable
+ * Header and can be expanded or retracted.
+ *
+ * When a ContentPane is created you have to provide a Header (ContentPane(QString, QWidget*))
+ * and, if you want, a QFrame* (ContentPane(QString, QFrame*, QWidget*)) with the
+ * content that should be displayed when the ContentPane is expanded.
+ *
+ * Managing the content is pretty straight forward use getContentFrame() and setContentFrame()
+ * to manage the content. You are absolutely free to do anything what you like with
+ * this QFrame. Just keep in mind there is a maximumHeight for the container in which
+ * the content frame is placed (currently 150). If your content exceeds this height
+ * you have to either increase it with setMaximumHeight() or add a [QScrollArea](http://doc.qt.io/qt-5/qscrollarea.html)
+ * to the content frame. You may use setContainerFrameStyle() to change the frame
+ * style of the container.
+ *
+ * The Header can be changed after the creation of the ContentPane with setHeader().
+ * Additionally you can set a tooltip, a standard stylesheet and a mouseover
+ * stylesheet, and the frame style.
+ * @sa
+ * setHeaderTooltip(), setHeaderStylesheet(), setHeaderHoverStylesheet(),
+ * setHeaderFrameStyle()
+ *
+ * @details
+ * The animation speed is influenceable setAnimationDuration().
+ */
+class BA_CORE_API_ ContentPane : public QWidget
+{
+    Q_OBJECT
+public:
+    /**
+     * @brief ContentPane constructor
+     * @param header The Header of the content pane
+     * @param parent Parent widget or 0
+     */
+    explicit ContentPane(QString header, QWidget *parent = 0);
+    /**
+     * @brief ContentPane constructor
+     * @param header The Header of the content pane
+     * @param content Content to display when expanded
+     * @param parent Parent widget or 0
+     */
+    explicit ContentPane(QString header, QFrame *content, QWidget *parent = 0);
+
+    /**
+     * @brief Check if this Content pane is active
+     * @return boolean True if active
+     */
+    bool getActive();
+
+    /**
+     * @brief Get the content frame of the content pane
+     * @return QFrame*
+     *
+     * @details
+     * Use this method to get a pointer to a QFrame where you can place
+     * your content. The widget lifetime is managed by qAccordion.
+     */
+    QFrame *getContentFrame();
+    /**
+     * @brief Set the content frame
+     * @param content QFrame* with your content
+     *
+     * Set / change the content frame of this content pane with \p content. The
+     * lifecycle
+     */
+    void setContentFrame(QFrame *content);
+
+    /**
+     * @brief Get the maximum height of the content pane container frame
+     * @return int
+     */
+    int getMaximumHeight();
+    /**
+     * @brief Set the maximum height of the content pane container.
+     * @param maxHeight
+     *
+     * @details
+     * Every content pane has a container frame that defines the visible maximum
+     * height. With this function you can change this setting.
+     *
+       @note
+     * This setting does not set the maximum height of the content frame. It is
+     * the users responsibilty to make sure everything in the content frame is
+     * visible. This can be influenced by either changing the maximum height of the
+     * container or for example by adding a [QScrollArea](http://doc.qt.io/qt-5.5/qscrollarea.html).
+     */
+    void setMaximumHeight(int maxHeight);
+    /**
+     * @brief Set the header of the content pane
+     * @param header
+     */
+    void setHeader(QString header);
+    /**
+     * @brief Return the header of the content pane
+     * @return QString
+     */
+    QString getHeader();
+    /**
+     * @brief Set header tooltip
+     * @param tooltip String to show as tooltip
+     *
+     * @details
+     * Set a string as header tooltip that will be shown when the mouse hovers
+     * over the header area.
+     */
+    void setHeaderTooltip(QString tooltip);
+    /**
+     * @brief Get the header tooltip
+     * @return Tooltip as QString
+     *
+     * @details
+     * Get the header tooltip as QString.
+     */
+    QString getHeaderTooltip();
+    /**
+     * @brief Set a stylesheet for the header frame
+     * @param stylesheet CSS Style Sheet as string
+     *
+     * @details
+     * You can use [Cascading Style Sheets](http://doc.qt.io/qt-5/stylesheet.html) as supported by Qt to
+     * style the header. This is the standard style sheet. You may also set a
+     * style for mouse over with setHeaderHoverStylesheet().
+     */
+    void setHeaderStylesheet(QString stylesheet);
+    /**
+     * @brief Get the current header style sheet
+     * @return CSS string
+     *
+     * @details
+     * Get the css of the content pane header as QString.
+     */
+    QString getHeaderStylesheet();
+    /**
+     * @brief Set a stylesheet for the header frame when the mouse hovers over it
+     * @param stylesheet CSS Style Sheet as string
+     *
+     * @details
+     * Set a \p stylesheet for the header for a special effect when the mouse
+     * hovers over it.
+     * @sa
+     * setHeaderStylesheet() for additional details.
+     */
+    void setHeaderHoverStylesheet(QString stylesheet);
+    /**
+     * @brief Get the mouse over header style sheet
+     * @return CSS Style Sheet as string
+     *
+     * @details
+     * Returns the mouse over header style sheet.
+     */
+    QString getHeaderHoverStylesheet();
+    /**
+     * @brief Set the header frame style
+     * @param style
+     *
+     * @details
+     * The style is the bitwise OR between a frame shape and a frame shadow style.
+     * See the [Qt Documentation](http://doc.qt.io/qt-5/qframe.html#setFrameStyle) for additional details.
+     */
+    void setHeaderFrameStyle(int style);
+    /**
+     * @brief Get the header frame style
+     * @return int
+     *
+     * @sa
+     * setHeaderFrameStyle() for additional information.
+     */
+    int getHeaderFrameStyle();
+    /**
+     * @brief Set the container frame style
+     * @param style
+     *
+     * @sa
+     * setHeaderFrameStyle() for additional information
+     */
+    void setContainerFrameStyle(int style);
+    /**
+     * @brief Get the container frame style
+     * @return int
+     *
+     * @sa
+     * setHeaderFrameStyle() for additional information
+     */
+    int getContainerFrameStyle();
+    /**
+     * @brief Set the duration for the open and close animation
+     * @param duration Duration in milliseconds
+     *
+     * @details
+     * Set the duration of the QPropertyAnimation in milliseconds.
+     */
+    void setAnimationDuration(uint duration);
+    /**
+     * @brief Get the duration of the open, close animation.
+     * @return Duration in milliseconds
+     */
+    uint getAnimationDuration();
+
+signals:
+
+    /**
+     * @brief Clicked signal is emitted when the header is clicked
+     */
+    void clicked();
+    /**
+     * @brief Signal will be emitted after the open animation finished
+     */
+    void isActive();
+    /**
+     * @brief Signal will be emitted after the close animation finished
+     */
+    void isInactive();
+
+public slots:
+
+    /**
+     * @brief Slot that is called when the header has been triggered
+     * @param pos Currently unused
+     *
+     * @details
+     * This slot is used to notify the ContentPane widget that the header
+     * has been triggered. You can use this slot yourself to open or close the
+     * ContentPane. Check the state of the pane before with getActive() as this
+     * slot might not do what you intended to do (for example you want to close
+     * the ContentPane. If it is already inactive and you call this slot without
+     * checking the state it will be opened).
+     */
+    void headerClicked();
+
+private:
+    // yeah we are friends. this is important to keep openContentPane and
+    // closeContentPane private
+    friend class AccordionWidget;
+
+    QFrame *content;
+    ClickableFrame *header;
+    QFrame *container;
+
+    int headerFrameStyle;
+    int contentPaneFrameStyle;
+    int containerAnimationMaxHeight;
+
+    bool active;
+
+    std::unique_ptr<QPropertyAnimation> openAnimation;
+    std::unique_ptr<QPropertyAnimation> closeAnimation;
+
+    void initDefaults(QString header);
+    void initHeaderFrame(QString header);
+    void initContainerContentFrame();
+    void initAnimations();
+
+private slots:
+
+    /**
+     * @brief Open the content pane
+     *
+     * @details
+     * This will open the content pane if it is currently closed.
+     * @warning
+     * Currently there is no inbuild mechanism to close an already open
+     * Content Pane when you open another one programmatically. Meaning you have
+     * to take care of this yourself.
+     */
+    void openContentPane();
+    /**
+     * @brief Close the content pane
+     *
+     * @details
+     * This will close the content pane if it is currently open.
+     */
+    void closeContentPane();
+
+protected:
+    /**
+     * @brief paintEvent Reimplement paintEvent to use stylesheets in derived Widgets
+     * @param event
+     */
+    void paintEvent(ATTR_UNUSED QPaintEvent *event);
+};
+
+#endif // CONTENTPANE_H
diff --git a/GUI/coregui/Views/AccordionWidget/accordionwidgeticons.qrc b/GUI/coregui/Views/AccordionWidget/accordionwidgeticons.qrc
new file mode 100644
index 0000000..f498114
--- /dev/null
+++ b/GUI/coregui/Views/AccordionWidget/accordionwidgeticons.qrc
@@ -0,0 +1,6 @@
+<RCC>
+    <qresource prefix="/qAccordionIcons">
+        <file>caret-bottom.png</file>
+        <file>caret-right.png</file>
+    </qresource>
+</RCC>
diff --git a/GUI/coregui/Views/AccordionWidget/caret-bottom.png b/GUI/coregui/Views/AccordionWidget/caret-bottom.png
new file mode 100644
index 0000000..d6243c9
Binary files /dev/null and b/GUI/coregui/Views/AccordionWidget/caret-bottom.png differ
diff --git a/GUI/coregui/Views/AccordionWidget/caret-right.png b/GUI/coregui/Views/AccordionWidget/caret-right.png
new file mode 100644
index 0000000..4c5ddc3
Binary files /dev/null and b/GUI/coregui/Views/AccordionWidget/caret-right.png differ
diff --git a/GUI/coregui/Views/CommonWidgets/InfoPanel.cpp b/GUI/coregui/Views/CommonWidgets/InfoPanel.cpp
new file mode 100644
index 0000000..1f5aad2
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/InfoPanel.cpp
@@ -0,0 +1,136 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/InfoPanel.cpp
+//! @brief     Declares class InfoPanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InfoPanel.h"
+#include "InfoPanelToolBar.h"
+#include <QBoxLayout>
+#include <QDebug>
+#include <QResizeEvent>
+#include <QStackedWidget>
+
+namespace {
+const int minimum_widget_height = 25; // height of toolbar
+const int minimum_height_before_collapse = 50;
+const int default_height = 200;
+}
+
+InfoPanel::InfoPanel(QWidget *parent)
+    : QFrame(parent)
+    , m_toolBar(new InfoPanelToolBar)
+    , m_stackedWidget(new QStackedWidget)
+    , m_cached_height(default_height)
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(m_toolBar);
+    mainLayout->addWidget(m_stackedWidget);
+
+    mainLayout->setContentsMargins(0, 0, 0, 0);
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    setLayout(mainLayout);
+
+    connect(m_toolBar, SIGNAL(expandButtonClicked()), this, SLOT(onExpandButtonClicked()));
+    connect(m_toolBar, SIGNAL(closeButtonClicked()), this, SLOT(onCloseButtonClicked()));
+}
+
+QSize InfoPanel::sizeHint() const
+{
+    QSize result = m_toolBar->sizeHint();
+
+    if(QWidget *widget = m_stackedWidget->currentWidget()) {
+        if(widget->isVisible())
+            result.setHeight(widget->height() + m_toolBar->height() );
+    } else {
+        result.setHeight(m_toolBar->height() );
+    }
+    qDebug() << "SSSSSS InfoPanel::sizeHint()" << result;
+    return result;
+}
+
+QSize InfoPanel::minimumSizeHint() const
+{
+    qDebug() << "SSSSSS InfoPanel::minimumSizeHint()" << QSize(minimum_widget_height, minimum_widget_height);
+    return QSize(minimum_widget_height, minimum_widget_height);
+}
+
+void InfoPanel::onExpandButtonClicked()
+{
+    qDebug() << "InfoPanel::onExpandButtonClicked()  isContentVisible()?" << isContentVisible();
+    setContentVisible(!isContentVisible(), true);
+}
+
+void InfoPanel::onCloseButtonClicked()
+{
+    qDebug() << "InfoPanel::onCloseButtonClicked()";
+    emit widgetCloseRequest();
+}
+
+void InfoPanel::setContentVisible(bool editor_status, bool dock_notify)
+{
+    qDebug() << "InfoPanel::setContentVisible" << editor_status << dock_notify;
+
+    m_toolBar->setExpandStatus(editor_status);
+    if(editor_status) {
+        if(m_cached_height)
+            if(dock_notify) emit widgetHeightRequest(m_cached_height);
+
+        if(m_stackedWidget->currentWidget())
+            m_stackedWidget->currentWidget()->show();
+
+    } else {
+        m_cached_height = (height() < minimum_height_before_collapse ? default_height : height());
+//        m_cached_height = height();
+        if(m_stackedWidget->currentWidget())
+            m_stackedWidget->currentWidget()->hide();
+
+        if(dock_notify) emit widgetHeightRequest(minimum_widget_height);
+    }
+
+//    m_stackedWidget->setVisible(editor_status);
+}
+
+bool InfoPanel::isContentVisible()
+{
+    qDebug() << "InfoPanel::isContentVisible() m_stackedWidget->currentWidget()" << m_stackedWidget->currentWidget();
+    if(m_stackedWidget->currentWidget()) {
+        qDebug() << "m_stackedWidget->currentWidget()->isVisible()" << m_stackedWidget->currentWidget()->isVisible();
+        return m_stackedWidget->currentWidget()->isVisible();
+    }
+
+    return false;
+}
+
+void InfoPanel::resizeEvent(QResizeEvent *event)
+{
+    // widget is schrinking in height
+    if(event->oldSize().height() > event->size().height()) {
+        if(event->size().height() <= minimum_height_before_collapse && isContentVisible()) {
+            setContentVisible(false);
+        }
+    }
+
+    // widget is growing in height
+    if(event->oldSize().height() < event->size().height()) {
+        if(event->size().height() > minimum_height_before_collapse && !isContentVisible()) {
+            setContentVisible(true);
+        }
+    }
+
+    QWidget::resizeEvent(event);
+
+}
+
diff --git a/GUI/coregui/Views/CommonWidgets/InfoPanel.h b/GUI/coregui/Views/CommonWidgets/InfoPanel.h
new file mode 100644
index 0000000..cbdd131
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/InfoPanel.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/InfoPanel.h
+//! @brief     Defines class InfoPanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INFOPANEL_H
+#define INFOPANEL_H
+
+#include "WinDllMacros.h"
+#include <QFrame>
+
+class QStackedWidget;
+class InfoPanelToolBar;
+class QResizeEvent;
+
+//! The InfoPanel class serves as a widget container with tool bar on top, with
+//! collapse/expand button functionality. Intended for QDockWindow, to be able to quickly
+//! minimize/maximize its appearance.
+
+//! Used in JobMessagePanel.
+
+class BA_CORE_API_ InfoPanel : public QFrame
+{
+    Q_OBJECT
+public:
+    explicit InfoPanel(QWidget *parent);
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+signals:
+    void widgetHeightRequest(int);
+    void widgetCloseRequest();
+
+protected slots:
+    void onExpandButtonClicked();
+    void onCloseButtonClicked();
+    void setContentVisible(bool editor_status, bool dock_notify = false);
+
+protected:
+    bool isContentVisible();
+    void resizeEvent(QResizeEvent *event);
+
+    InfoPanelToolBar *m_toolBar;
+    QStackedWidget *m_stackedWidget;
+    int m_cached_height;
+};
+
+#endif // INFOPANEL_H
diff --git a/GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.cpp b/GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.cpp
new file mode 100644
index 0000000..cd05425
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.cpp
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.cpp
+//! @brief     Declares class InfoPanelToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InfoPanelToolBar.h"
+#include <QHBoxLayout>
+#include <QToolButton>
+
+namespace {
+const int minimum_size = 25;
+}
+
+InfoPanelToolBar::InfoPanelToolBar(QWidget *parent)
+    : StyledToolBar(parent)
+    , m_expandButton(new QToolButton)
+    , m_closeButton(new QToolButton)
+    , m_expanded(false)
+{
+    setMinimumSize(minimum_size, minimum_size);
+
+    m_expandButton->setIcon(QIcon(":/images/darkarrowup.png"));
+    m_expandButton->setToolTip("Collapse/expand view");
+    connect(m_expandButton, SIGNAL(clicked()), this, SLOT(onExpandButtonClicked()));
+
+    m_closeButton->setIcon(QIcon(":/images/darkclosebutton.png"));
+    m_closeButton->setToolTip("Close viewe");
+    connect(m_closeButton, SIGNAL(clicked()), this, SIGNAL(closeButtonClicked()));
+
+    addStyledExpand();
+    addWidget(m_expandButton);
+    addWidget(m_closeButton);
+
+    setStyleSheet("QToolBar {border-bottom: 1px solid gray}");
+}
+
+void InfoPanelToolBar::setExpandStatus(bool status)
+{
+    m_expanded = status;
+    if(m_expanded) {
+        m_expandButton->setIcon(QIcon(":/images/darkarrowdown.png"));
+    } else {
+        m_expandButton->setIcon(QIcon(":/images/darkarrowup.png"));
+    }
+}
+
+void InfoPanelToolBar::onExpandButtonClicked()
+{
+    m_expanded = !m_expanded;
+    setExpandStatus(m_expanded);
+    emit expandButtonClicked();
+}
+
diff --git a/GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.h b/GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.h
new file mode 100644
index 0000000..8849442
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/InfoPanelToolBar.h
+//! @brief     Defines class InfoPanelToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INFOPANELTOOLBAR_H
+#define INFOPANELTOOLBAR_H
+
+#include "StyledToolBar.h"
+
+class QToolButton;
+
+//! The InfoPanelToolBar class represents a toolbar for InfoPanel
+
+class BA_CORE_API_ InfoPanelToolBar : public StyledToolBar
+{
+    Q_OBJECT
+
+public:
+    explicit InfoPanelToolBar(QWidget *parent = 0);
+
+signals:
+    void expandButtonClicked();
+    void closeButtonClicked();
+
+public slots:
+    void setExpandStatus(bool status);
+
+protected slots:
+    void onExpandButtonClicked();
+
+private:
+    QToolButton *m_expandButton;
+    QToolButton *m_closeButton;
+    bool m_expanded;
+};
+
+
+#endif // INFOPANELTOOLBAR_H
diff --git a/GUI/coregui/Views/CommonWidgets/ItemComboToolBar.cpp b/GUI/coregui/Views/CommonWidgets/ItemComboToolBar.cpp
new file mode 100644
index 0000000..1d61f91
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemComboToolBar.cpp
@@ -0,0 +1,90 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemComboToolBar.cpp
+//! @brief     Implements class ItemComboToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemComboToolBar.h"
+#include <QAction>
+#include <QComboBox>
+
+ItemComboToolBar::ItemComboToolBar(QWidget *parent)
+    : StyledToolBar(parent)
+    , m_comboBox(new QComboBox)
+    , m_comboBoxAction(0)
+{
+    setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+
+    m_comboBox->setFixedWidth(125);
+    m_comboBox->setToolTip("Select type of graphical presentation.");
+
+    m_comboBoxAction = addWidget(m_comboBox);
+
+    setComboConnected(true);
+}
+
+void ItemComboToolBar::setPresentation(const QString &name)
+{
+    setComboConnected(false);
+    m_comboBox->setCurrentText(name);
+    setComboConnected(true);
+}
+
+void ItemComboToolBar::addPresentationType(const QString &name)
+{
+    setComboConnected(false);
+    m_comboBox->addItem(name);
+    setComboConnected(true);
+}
+
+void ItemComboToolBar::setPresentationList(const QStringList &presentationList)
+{
+    Q_ASSERT(presentationList.size());
+
+    setComboConnected(false);
+    m_comboBox->addItems(presentationList);
+    setComboConnected(true);
+}
+
+QString ItemComboToolBar::currentPresentation() const
+{
+    return m_comboBox->currentText();
+}
+
+//! Sets external actions to tool bar (previous actions will be removed).
+
+void ItemComboToolBar::setActionList(const QList<QAction *> &actionList)
+{
+    foreach(QAction *action, actions()) {
+        removeAction(action);
+    }
+
+    foreach(QAction *action, actionList) {
+        addAction(action);
+        addStyledSeparator();
+    }
+
+    addStyledExpand();
+    addAction(m_comboBoxAction);
+}
+
+void ItemComboToolBar::setComboConnected(bool value)
+{
+    if(value) {
+        connect(m_comboBox, SIGNAL(currentIndexChanged(QString)),
+                this, SIGNAL(comboChanged(QString)), Qt::UniqueConnection);
+    } else {
+        disconnect(m_comboBox, SIGNAL(currentIndexChanged(QString)),
+                this, SIGNAL(comboChanged(QString)));
+    }
+}
diff --git a/GUI/coregui/Views/CommonWidgets/ItemComboToolBar.h b/GUI/coregui/Views/CommonWidgets/ItemComboToolBar.h
new file mode 100644
index 0000000..bd463e7
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemComboToolBar.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemComboToolBar.h
+//! @brief     Defines class ItemComboToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMCOMBOTOOLBAR_H
+#define ITEMCOMBOTOOLBAR_H
+
+#include "StyledToolBar.h"
+#include <QList>
+
+class QAction;
+
+//! The ItemComboToolBar class is a styled toolbar on top of ItemComboWidget. Contains
+//! ComboBox to switch ItemComboWidget, and dynamic list of actions, which are updated
+//! according to current state of ItemComboWidget.
+
+class BA_CORE_API_ ItemComboToolBar : public StyledToolBar
+{
+    Q_OBJECT
+
+public:
+    explicit ItemComboToolBar(QWidget *parent = 0);
+
+    void setPresentation(const QString &name);
+
+    void addPresentationType(const QString &name);
+    void setPresentationList(const QStringList &presentationList);
+
+    QString currentPresentation() const;
+
+    void setActionList(const QList<QAction *> &actionList);
+
+signals:
+    void comboChanged(const QString &presentation);
+
+private:
+    void setComboConnected(bool value);
+
+    class QComboBox *m_comboBox;
+    QAction *m_comboBoxAction;
+};
+
+#endif // ITEMCOMBOTOOLBAR_H
+
diff --git a/GUI/coregui/Views/CommonWidgets/ItemComboWidget.cpp b/GUI/coregui/Views/CommonWidgets/ItemComboWidget.cpp
new file mode 100644
index 0000000..0dd60c0
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemComboWidget.cpp
@@ -0,0 +1,129 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemComboWidget.cpp
+//! @brief     Implements class ItemComboWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemComboWidget.h"
+#include "ItemComboToolBar.h"
+#include "SessionItemWidget.h"
+#include "GUIHelpers.h"
+#include <QComboBox>
+#include <QDebug>
+#include <QEvent>
+#include <QStackedWidget>
+#include <QVBoxLayout>
+
+ItemComboWidget::ItemComboWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_toolBar(new ItemComboToolBar)
+    , m_stackedWidget(new QStackedWidget)
+    , m_currentItem(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    m_stackedWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->setContentsMargins(0,0,0,0);
+    layout->addWidget(m_toolBar);
+    layout->addWidget(m_stackedWidget);
+    setLayout(layout);
+
+    connect(m_toolBar, SIGNAL(comboChanged(QString)),
+            this, SLOT(onComboChanged(QString)));
+}
+
+
+void ItemComboWidget::setItem(SessionItem *item)
+{
+    if(!item)
+        return;
+
+    QStringList validPresentations = getValidPresentationList(item);
+    m_toolBar->setPresentationList(validPresentations);
+
+    m_currentItem = item;
+
+    setPresentation(currentPresentation());
+
+}
+
+void ItemComboWidget::registerWidget(const QString &presentationType, factory_function_t f)
+{
+    m_widgetFactory.registerItem(presentationType, f);
+}
+
+//! Sets stack to show widget corresponding to given presentation
+
+void ItemComboWidget::setPresentation(const QString &presentationType)
+{
+    if(!getValidPresentationList(m_currentItem).contains(presentationType))
+        return;
+
+    m_toolBar->setPresentation(presentationType);
+
+    Q_ASSERT(m_currentItem);
+
+    SessionItemWidget *widget = m_presentationTypeToWidget[presentationType];
+
+    if(!widget) {
+        widget = m_widgetFactory.createItem(presentationType);
+        m_stackedWidget->addWidget(widget);
+        m_presentationTypeToWidget[presentationType] = widget;
+        widget->setItem(m_currentItem);
+    }
+    Q_ASSERT(widget);
+    m_toolBar->setActionList(widget->actionList());
+    m_stackedWidget->setCurrentWidget(widget);
+    if(widget->isHidden())
+        widget->show();
+
+}
+
+//! Returns list of presentations valid for given item.
+
+QStringList ItemComboWidget::getValidPresentationList(SessionItem *item)
+{
+    Q_UNUSED(item);
+    return QStringList();
+}
+
+
+//void ItemComboWidget::showEvent(QShowEvent *)
+//{
+//    if(!m_externalToolBar)
+//        return;
+
+
+//}
+
+//void ItemComboWidget::hideEvent(QHideEvent *)
+//{
+//    if(!m_externalToolBar)
+//        return;
+
+//}
+
+void ItemComboWidget::onComboChanged(const QString &name)
+{
+    qDebug() << "ItemComboWidget::onWidgetChangeRequest" << name;
+    setPresentation(currentPresentation());
+}
+
+QString ItemComboWidget::currentPresentation() const
+{
+    return m_toolBar->currentPresentation();
+}
+
diff --git a/GUI/coregui/Views/CommonWidgets/ItemComboWidget.h b/GUI/coregui/Views/CommonWidgets/ItemComboWidget.h
new file mode 100644
index 0000000..e0ade16
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemComboWidget.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemComboWidget.h
+//! @brief     Defines class ItemComboWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMCOMBOWIDGET_H
+#define ITEMCOMBOWIDGET_H
+
+#include "IFactory.h"
+#include "WinDllMacros.h"
+#include <QMap>
+#include <QString>
+#include <QWidget>
+
+class SessionItem;
+class SessionItemWidget;
+class ItemComboToolBar;
+
+//! The ItemComboWidget class combines stack of widgets with QComboBox controller to switch between
+//! widgets. It is used in the case when one SessionItem can be presented with different widgets.
+
+//! For example, in JobOutputDataWidget the results of the job can be presented with either
+//! IntensityDataWidget or FitDataWidget, depending from the JobView's activity type.
+
+class BA_CORE_API_ ItemComboWidget : public QWidget {
+    Q_OBJECT
+
+public:
+    typedef std::function<SessionItemWidget*()> factory_function_t;
+
+    explicit ItemComboWidget(QWidget *parent = 0);
+
+    virtual void setItem(SessionItem *item);
+
+    void registerWidget(const QString &presentationType, factory_function_t);
+
+    void setPresentation(const QString &presentationType);
+
+
+protected:
+//    virtual void showEvent(class QShowEvent *);
+//    virtual void hideEvent(class QHideEvent *);
+    virtual QStringList getValidPresentationList(SessionItem *item);
+
+private slots:
+    void onComboChanged(const QString &name);
+
+private:
+    QString currentPresentation() const;
+
+    ItemComboToolBar *m_toolBar;
+    class QStackedWidget *m_stackedWidget;
+    SessionItem *m_currentItem;
+    IFactory<QString, SessionItemWidget> m_widgetFactory;
+    QMap<QString, SessionItemWidget *> m_presentationTypeToWidget;
+
+};
+
+#endif // ITEMCOMBOWIDGET_H
diff --git a/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp b/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp
new file mode 100644
index 0000000..940ba05
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp
@@ -0,0 +1,130 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.cpp
+//! @brief     Implements class ItemSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemSelectorWidget.h"
+#include "SessionItem.h"
+#include "SessionModel.h"
+#include "mainwindow_constants.h"
+#include <QDebug>
+#include <QListView>
+#include <QVBoxLayout>
+
+
+ItemSelectorWidget::ItemSelectorWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_listView(new QListView(this))
+    , m_model(0)
+{
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+
+    layout->addWidget(m_listView);
+    setLayout(layout);
+
+    m_listView->setContextMenuPolicy(Qt::CustomContextMenu);
+    m_listView->setAttribute(Qt::WA_MacShowFocusRect, false);
+
+    connect(m_listView, SIGNAL(customContextMenuRequested(const QPoint &)),
+            this, SLOT(onCustomContextMenuRequested(const QPoint &)));
+
+}
+
+QSize ItemSelectorWidget::sizeHint() const
+{
+    return QSize(Constants::ITEM_SELECTOR_WIDGET_WIDTH, Constants::ITEM_SELECTOR_WIDGET_HEIGHT);
+}
+
+QSize ItemSelectorWidget::minimumSizeHint() const
+{
+    return QSize(25, 25);
+}
+
+void ItemSelectorWidget::setModel(SessionModel *model)
+{
+    if(model == m_model)
+        return;
+
+    disconnectModel();
+    m_model = model;
+    connectModel();
+}
+
+void ItemSelectorWidget::setItemDelegate(QAbstractItemDelegate *delegate)
+{
+    m_listView->setItemDelegate(delegate);
+}
+
+QItemSelectionModel *ItemSelectorWidget::selectionModel()
+{
+    return m_listView->selectionModel();
+}
+
+QListView *ItemSelectorWidget::listView()
+{
+    return m_listView;
+}
+
+void ItemSelectorWidget::onSelectionChanged(const QItemSelection &selected, const QItemSelection &)
+{
+    QModelIndexList indexes = selected.indexes();
+    SessionItem *selectedItem(0);
+    if(indexes.size()) {
+        selectedItem = m_model->itemForIndex(indexes.back());
+    }
+    emit selectionChanged(selectedItem);
+}
+
+void ItemSelectorWidget::onCustomContextMenuRequested(const QPoint &point)
+{
+    emit contextMenuRequest(m_listView->mapToGlobal(point), m_listView->indexAt(point));
+}
+
+void ItemSelectorWidget::connectModel()
+{
+    if(!m_model)
+        return;
+
+    m_listView->setModel(m_model);
+
+    connect(m_listView->selectionModel(),
+            SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+            this,
+            SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&)),
+            Qt::UniqueConnection
+    );
+
+}
+
+void ItemSelectorWidget::disconnectModel()
+{
+    m_listView->setModel(0);
+    m_model = 0;
+}
+
+//! provide default selection when widget is shown
+void ItemSelectorWidget::showEvent(QShowEvent *)
+{
+    if(!m_model || !selectionModel()) return;
+
+    if(selectionModel()->selectedIndexes().isEmpty()) {
+        if(m_model->rowCount(QModelIndex()) != 0) {
+            selectionModel()->select(m_model->index(0, 0, QModelIndex()),
+                                     QItemSelectionModel::Select);
+        }
+    }
+}
diff --git a/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.h b/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.h
new file mode 100644
index 0000000..ae074e8
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemSelectorWidget.h
+//! @brief     Defines class ItemSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMSELECTORWIDGET_H
+#define ITEMSELECTORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class SessionModel;
+class SessionItem;
+class QItemSelection;
+class QItemSelectionModel;
+class QModelIndex;
+class QAbstractItemDelegate;
+class QListView;
+
+//! The ItemSelectorWidget class holds QListView to show top level items of SessionModel.
+//! Used in InstrumentView, ImportDataView, JobSelectorView to switch between items.
+
+class BA_CORE_API_ ItemSelectorWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    ItemSelectorWidget(QWidget *parent = 0);
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+    void setModel(SessionModel *model);
+    void setItemDelegate(QAbstractItemDelegate *delegate);
+
+    QItemSelectionModel *selectionModel();
+    QListView *listView();
+
+signals:
+    void selectionChanged(SessionItem *item);
+    void contextMenuRequest(const QPoint &point, const QModelIndex &index);
+
+private slots:
+    void onSelectionChanged(const QItemSelection &selected, const QItemSelection&);
+    void onCustomContextMenuRequested(const QPoint &point);
+
+protected:
+    void connectModel();
+    void disconnectModel();
+    void showEvent(class QShowEvent *);
+
+private:
+    class QListView *m_listView;
+    SessionModel *m_model;
+};
+
+#endif // ITEMSELECTORWIDGET_H
diff --git a/GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h b/GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h
new file mode 100644
index 0000000..bfab617
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h
@@ -0,0 +1,113 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemStackPresenter.h
+//! @brief     Defines class ItemStackPresenter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMSTACKPRESENTER_H
+#define ITEMSTACKPRESENTER_H
+
+#include "ItemStackWidget.h"
+#include <QDebug>
+#include <QMap>
+#include <QStackedWidget>
+
+class SessionItem;
+
+//! The ItemStackPresenter templated class extends ItemStackWidget so it could operate with
+//! SesionItem editor's of specified type, while still keeping signal/slots alive.
+
+template<class T>
+class BA_CORE_API_ ItemStackPresenter : public ItemStackWidget
+{
+public:
+
+    virtual void setItem(SessionItem *item, bool &isNew) {
+        validateItem(item);
+
+        isNew = false;
+        if(!item) {
+            hideWidgets();
+            return;
+        }
+
+        T *widget = m_itemToWidget[item];
+
+        if(!widget) {
+            widget = new T();
+            isNew = true;
+            m_stackedWidget->addWidget(widget);
+            m_itemToWidget[item] = widget;
+        }
+        Q_ASSERT(widget);
+        m_stackedWidget->setCurrentWidget(widget);
+        if(widget->isHidden())
+            widget->show();
+
+    }
+
+    T *currentWidget() {
+        return dynamic_cast<T *>(m_stackedWidget->currentWidget());
+    }
+
+    T *itemWidget(SessionItem *item) {
+        return m_itemToWidget[item];
+    }
+
+    void hideWidgets() {
+        if(m_stackedWidget->currentWidget()) {
+            m_stackedWidget->currentWidget()->hide();
+        }
+    }
+
+protected:
+    void removeWidgetForItem(SessionItem *item) {
+        Q_ASSERT(item);
+
+        T *widget = m_itemToWidget[item];
+        if(!widget) return;
+
+        qDebug() << "ItemStackPresenter::removeWidgetForItem";
+
+        typename QMap<SessionItem *, T *>::iterator it = m_itemToWidget.begin();
+        while(it!=m_itemToWidget.end()) {
+            if(it.value() == widget) {
+                it = m_itemToWidget.erase(it);
+            } else {
+                ++it;
+            }
+        }
+
+        m_stackedWidget->removeWidget(widget);
+        delete widget;
+
+
+    }
+
+    void removeWidgets() {
+        qDebug() << "ItemStackPresenter::removeWidgets";
+        typename QMap<SessionItem *, T *>::iterator it = m_itemToWidget.begin();
+        while(it!=m_itemToWidget.end()) {
+            m_stackedWidget->removeWidget(it.value());
+            delete it.value();
+            ++it;
+        }
+        m_itemToWidget.clear();
+    }
+
+private:
+    QMap<SessionItem *, T *> m_itemToWidget;
+};
+
+
+#endif // ITEMSTACKPRESENTER_H
diff --git a/GUI/coregui/Views/CommonWidgets/ItemStackWidget.cpp b/GUI/coregui/Views/CommonWidgets/ItemStackWidget.cpp
new file mode 100644
index 0000000..0d01307
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemStackWidget.cpp
@@ -0,0 +1,128 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemStackWidget.cpp
+//! @brief     Implements class ItemStackWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemStackWidget.h"
+#include "GUIHelpers.h"
+#include "SessionModel.h"
+#include <QDebug>
+#include <QStackedWidget>
+#include <QVBoxLayout>
+
+
+ItemStackWidget::ItemStackWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_stackedWidget(new QStackedWidget)
+    , m_model(0)
+    , m_size_hint(QSize(1024, 1024))
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    m_stackedWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->setContentsMargins(0,0,0,0);
+    layout->addWidget(m_stackedWidget);
+    setLayout(layout);
+}
+
+void ItemStackWidget::setModel(SessionModel *model)
+{
+    if(model == m_model)
+        return;
+
+    disconnectModel();
+    m_model = model;
+    connectModel();
+}
+
+QSize ItemStackWidget::sizeHint() const
+{
+    return m_size_hint;
+}
+
+QSize ItemStackWidget::minimumSizeHint() const
+{
+    return QSize(25, 25);
+}
+
+void ItemStackWidget::setSizeHint(const QSize &size_hint)
+{
+    m_size_hint = size_hint;
+}
+
+void ItemStackWidget::onModelAboutToBeReset()
+{
+    qDebug() << "ItemStackWidget::onModelAboutToBeReset()";
+    removeWidgets();
+}
+
+void ItemStackWidget::onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int)
+{
+    qDebug() << "ItemStackWidget::onRowsAboutToBeRemoved()";
+    SessionItem *item = m_model->itemForIndex(m_model->index(first, 0, parent));
+    removeWidgetForItem(item);
+}
+
+void ItemStackWidget::onSelectionChanged(SessionItem *item)
+{
+    if(item) qDebug() << "ItemStackWidget::onSelectionChanged(SessionItem *item)" << item->displayName();
+    bool isNew(false);
+    setItem(item, isNew);
+}
+
+
+void ItemStackWidget::connectModel()
+{
+    if(!m_model) return;
+
+    connect(m_model, SIGNAL(modelAboutToBeReset()),
+            this, SLOT(onModelAboutToBeReset()),
+            Qt::UniqueConnection);
+
+    connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int,int)),
+            this, SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int)),
+            Qt::UniqueConnection);
+}
+
+void ItemStackWidget::disconnectModel()
+{
+    if(!m_model) return;
+
+    disconnect(m_model, SIGNAL(modelAboutToBeReset()),
+            this, SLOT(onModelAboutToBeReset()));
+
+    disconnect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int,int)),
+               this, SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int)));
+}
+
+//! Checks if model was set correctly.
+
+void ItemStackWidget::validateItem(SessionItem *item)
+{
+    if(!item) return;
+
+    if(m_model) {
+        if(m_model != item->model()) {
+            // in principle it should be possible, but should be tested
+            throw GUIHelpers::Error("ItemStackWidget::validateItem() -> Error. "
+                                    "Attempt to use items from different models.");
+        }
+    } else {
+        qDebug() << "ItemStackPresenter::setItem() -> Warning, model is not initialized.";
+        setModel(item->model());
+    }
+}
diff --git a/GUI/coregui/Views/CommonWidgets/ItemStackWidget.h b/GUI/coregui/Views/CommonWidgets/ItemStackWidget.h
new file mode 100644
index 0000000..fe6ed0a
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/ItemStackWidget.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/ItemStackWidget.h
+//! @brief     Defines class ItemStackWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMSTACKWIDGET_H
+#define ITEMSTACKWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class SessionModel;
+class SessionItem;
+
+//! The ItemStackWidget class contains a stack of widgets presenting top level items
+//! of SessionModel. Every item corresponds to its own widget.
+
+//! This is the base for ItemStackPresenter, which actually contains item
+//! specific editor's logic. Used in InstrumentView, ImportDataView, JobView to show editors for
+//! currently selected items.
+
+class BA_CORE_API_ ItemStackWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    ItemStackWidget(QWidget *parent = 0);
+
+    void setModel(SessionModel *model);
+
+    //! Shows the widget for given item (and hides previous one).
+    //! If no widget yet exists, it will be created (flag isNew will become 'true' in this case).
+    virtual void setItem(SessionItem *item, bool &isNew) = 0;
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+    void setSizeHint(const QSize &size_hint);
+
+public slots:
+    virtual void onModelAboutToBeReset();
+    virtual void onRowsAboutToBeRemoved(const QModelIndex &parent,int first,int);
+    virtual void onSelectionChanged(SessionItem *item);
+
+protected:
+    void connectModel();
+    void disconnectModel();
+    void validateItem(SessionItem *item);
+    virtual void removeWidgetForItem(SessionItem *item) = 0;
+    virtual void removeWidgets() = 0;
+
+    class QStackedWidget *m_stackedWidget;
+    SessionModel *m_model;
+    QSize m_size_hint;
+};
+
+#endif // ITEMSTACKWIDGET_H
diff --git a/GUI/coregui/Views/CommonWidgets/SessionItemWidget.cpp b/GUI/coregui/Views/CommonWidgets/SessionItemWidget.cpp
new file mode 100644
index 0000000..3fd2ddc
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/SessionItemWidget.cpp
@@ -0,0 +1,29 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/SessionItemWidget.cpp
+//! @brief     Declares class ItemComboWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SessionItemWidget.h"
+
+
+SessionItemWidget::SessionItemWidget(QWidget *parent)
+    : QWidget(parent)
+{
+
+}
+
+QList<QAction *> SessionItemWidget::actionList()
+{
+    return QList<QAction *>();
+}
diff --git a/GUI/coregui/Views/CommonWidgets/SessionItemWidget.h b/GUI/coregui/Views/CommonWidgets/SessionItemWidget.h
new file mode 100644
index 0000000..809f48d
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/SessionItemWidget.h
@@ -0,0 +1,38 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/SessionItemWidget.h
+//! @brief     Defines class ItemComboWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONITEMWIDGET_H
+#define SESSIONITEMWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+//! The SessionItemWidget class is a base for all widgets representing the content of SessionItem.
+
+class BA_CORE_API_ SessionItemWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit SessionItemWidget(QWidget *parent = 0);
+
+    virtual void setItem(class SessionItem *item) = 0;
+    virtual QList<QAction *> actionList();
+
+};
+
+#endif // SESSIONITEMWIDGET_H
+
diff --git a/GUI/coregui/Views/CommonWidgets/StatusLabel.cpp b/GUI/coregui/Views/CommonWidgets/StatusLabel.cpp
new file mode 100644
index 0000000..bec300b
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/StatusLabel.cpp
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/StatusLabel.cpp
+//! @brief     Implements class StatusLabel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "StatusLabel.h"
+#include <QColor>
+#include <QDebug>
+#include <QFont>
+#include <QPainter>
+
+namespace {
+const int default_label_height = 20;
+const int default_text_size = 11;
+}
+
+StatusLabel::StatusLabel(QWidget *parent)
+    : QFrame(parent)
+    , m_font("Monospace", default_text_size, QFont::Normal, false)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+    setFixedHeight(default_label_height);
+}
+
+void StatusLabel::setText(const QString &text)
+{
+    m_text = text;
+    update();
+}
+
+void StatusLabel::setFont(const QFont &font)
+{
+    m_font = font;
+    update();
+}
+
+void StatusLabel::setPointSize(int pointSize)
+{
+    m_font.setPointSize(pointSize);
+    update();
+}
+
+void StatusLabel::setAlignment(Qt::Alignment alignment)
+{
+    m_alignment = alignment;
+    update();
+}
+
+void StatusLabel::paintEvent(QPaintEvent *event)
+{
+    QWidget::paintEvent(event);
+
+    QPainter painter(this);
+    painter.setBrush(QColor(Qt::black));
+    painter.setPen(QColor(Qt::black));
+    painter.setFont(m_font);
+
+    QRect textRect(0, 0, geometry().width(), geometry().height());
+    painter.fillRect(textRect, QColor(Qt::white));
+    painter.drawText(textRect, m_alignment, m_text);
+}
diff --git a/GUI/coregui/Views/CommonWidgets/StatusLabel.h b/GUI/coregui/Views/CommonWidgets/StatusLabel.h
new file mode 100644
index 0000000..dd2ef0d
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/StatusLabel.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/StatusLabel.h
+//! @brief     Defines class StatusLabel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STATUSLABEL_H
+#define STATUSLABEL_H
+
+#include "WinDllMacros.h"
+#include <QFrame>
+
+class QPaintEvent;
+
+//! The StatusLabel class shows a single line of text on a white background. Opposite to QLabel,
+//! if text string is too long for current size, it will be clipped.
+
+//! This class is intended for ColorMapLabel, where the size of font is adjusted automatically
+//! depending from available space.
+
+class BA_CORE_API_ StatusLabel : public QFrame
+{
+    Q_OBJECT
+
+public:
+    explicit StatusLabel(QWidget *parent = 0);
+
+    void setText(const QString &text);
+    void setFont(const QFont &font);
+    void setPointSize(int pointSize);
+    void setAlignment(Qt::Alignment);
+
+
+protected:
+    void paintEvent(QPaintEvent *event);
+
+private:
+    QString m_text;
+    Qt::Alignment m_alignment;
+    QFont m_font;
+};
+
+#endif // STATUSLABEL_H
+
diff --git a/GUI/coregui/Views/CommonWidgets/UpdateTimer.cpp b/GUI/coregui/Views/CommonWidgets/UpdateTimer.cpp
new file mode 100644
index 0000000..d2d9d3a
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/UpdateTimer.cpp
@@ -0,0 +1,82 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/UpdateTimer.cpp
+//! @brief     Implements class UpdateTimer
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "UpdateTimer.h"
+#include <QDebug>
+#include <QTimer>
+
+namespace {
+const int default_timer_interval_in_msec = 2;
+}
+
+UpdateTimer::UpdateTimer(int accumulateDuring, QObject *parent)
+    : QObject(parent)
+    , m_accumulate_updates_during(accumulateDuring)
+    , m_update_request_count(0)
+    , m_timer_interval(default_timer_interval_in_msec)
+    , m_remaining_time_to_update(0)
+    , m_timer(new QTimer(this))
+{
+    m_timer->setInterval(m_timer_interval);
+    connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimerTimeout()));
+}
+
+//! Sets time period in msec, during which updates will be accumulated.
+
+void UpdateTimer::setAccumulateDuring(int accumulateDuring)
+{
+    m_accumulate_updates_during = accumulateDuring;
+}
+
+//! Sets timer interval in msec to check if it is time to propagate update requests back.
+
+void UpdateTimer::setTimerInterval(int timerInterval)
+{
+    m_timer_interval = timerInterval;
+}
+
+//! Schedule subsequent update.
+
+void UpdateTimer::scheduleUpdate()
+{
+    ++m_update_request_count;
+
+    if(!m_timer->isActive()) {
+        m_timer->start(m_timer_interval);
+        m_remaining_time_to_update = m_accumulate_updates_during;
+    }
+}
+
+
+void UpdateTimer::onTimerTimeout()
+{
+    m_remaining_time_to_update -= m_timer_interval;
+
+    if(m_remaining_time_to_update <= 0) {
+        m_timer->stop();
+        processUpdates();
+    }
+}
+
+void UpdateTimer::processUpdates()
+{
+    Q_ASSERT(!m_timer->isActive());
+
+    if(m_update_request_count > 0)
+        emit timeToUpdate();
+
+    m_update_request_count = 0;
+}
diff --git a/GUI/coregui/Views/CommonWidgets/UpdateTimer.h b/GUI/coregui/Views/CommonWidgets/UpdateTimer.h
new file mode 100644
index 0000000..8cf95bc
--- /dev/null
+++ b/GUI/coregui/Views/CommonWidgets/UpdateTimer.h
@@ -0,0 +1,66 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/CommonWidgets/UpdateTimer.h
+//! @brief     Defines class UpdateTimer
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef UPDATETIMER_H
+#define UPDATETIMER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class QTimer;
+
+//! The UpdateTimer class accumulates update requests during certain period of time, and at
+//! the end of this period emits special signal.
+
+//! Used in ColorMap plot to avoid often replot of CustomPlot.
+
+class BA_CORE_API_ UpdateTimer : public QObject {
+    Q_OBJECT
+
+public:
+    explicit UpdateTimer(int accumulateDuring, QObject *parent = 0);
+
+    void setAccumulateDuring(int accumulateDuring);
+    void setTimerInterval(int timerInterval);
+
+signals:
+    void timeToUpdate();
+
+public slots:
+    void scheduleUpdate();
+
+private slots:
+    void onTimerTimeout();
+
+private:
+    void processUpdates();
+
+    //!< Interval in msec during which all update requests will be accumulated.
+    int m_accumulate_updates_during;
+
+    //!< Number of requests accumulated so far.
+    int m_update_request_count;
+
+    //!< Timer interval to check what is going on.
+    int m_timer_interval;
+
+    //!< Remaining time to to emit timeToUpdate signal
+    int m_remaining_time_to_update;
+
+    QTimer *m_timer;
+};
+
+#endif // UPDATETIMER_H
diff --git a/GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp b/GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp
new file mode 100644
index 0000000..0e540dd
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp
@@ -0,0 +1,122 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitActivityPanel.cpp
+//! @brief     Implements class FitActivityPanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitActivityPanel.h"
+#include "FitSuiteWidget.h"
+#include "JobItem.h"
+#include "JobMessagePanel.h"
+#include "JobModel.h"
+#include "JobRealTimeWidget.h"
+#include "RunFitControlWidget.h"
+#include "mainwindow_constants.h"
+#include <QPushButton>
+#include <QVBoxLayout>
+
+FitActivityPanel::FitActivityPanel(JobModel *jobModel, QWidget *parent)
+    : QWidget(parent)
+    , m_stackedWidget(new ItemStackPresenter<FitSuiteWidget>)
+    , m_controlWidget(new RunFitControlWidget)
+    , m_realTimeWidget(0)
+    , m_jobMessagePanel(0)
+{
+    setWindowTitle(Constants::JobFitPanelName);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    mainLayout->addWidget(m_stackedWidget);
+    mainLayout->addWidget(m_controlWidget);
+
+    setLayout(mainLayout);
+
+    connect(m_controlWidget, SIGNAL(startFittingPushed()), this, SLOT(onStartFittingRequest()));
+    connect(m_controlWidget, SIGNAL(stopFittingPushed()), this, SLOT(onStopFittingRequest()));
+
+    m_stackedWidget->setModel(jobModel);
+}
+
+void FitActivityPanel::setRealTimeWidget(JobRealTimeWidget *realTimeWidget)
+{
+    Q_ASSERT(realTimeWidget);
+    m_realTimeWidget = realTimeWidget;
+}
+
+void FitActivityPanel::setJobMessagePanel(JobMessagePanel *jobMessagePanel)
+{
+    m_jobMessagePanel = jobMessagePanel;
+    m_controlWidget->setJobMessagePanel(jobMessagePanel);
+}
+
+QSize FitActivityPanel::sizeHint() const {
+    return QSize(Constants::REALTIME_WIDGET_WIDTH_HINT, Constants::FIT_ACTIVITY_PANEL_HEIGHT);
+}
+
+QSize FitActivityPanel::minimumSizeHint() const {
+    return QSize(80, 80);
+}
+
+void FitActivityPanel::setItem(JobItem *item)
+{
+    m_controlWidget->setItem(item);
+
+    if(!isValidJobItem(item)) {
+        m_stackedWidget->hideWidgets();
+        return;
+    }
+
+    bool isNew(false);
+    m_stackedWidget->setItem(item, isNew);
+
+    if(isNew) {
+        FitSuiteWidget *widget = m_stackedWidget->currentWidget();
+        Q_ASSERT(widget);
+        widget->setItem(item);
+        widget->setModelTuningWidget(m_realTimeWidget->parameterTuningWidget(item));
+        connect(widget, SIGNAL(fittingStarted(JobItem *)), m_controlWidget,
+                SLOT(onFittingStarted(JobItem *)), Qt::UniqueConnection);
+        connect(widget, SIGNAL(fittingFinished(JobItem *)), m_controlWidget,
+                SLOT(onFittingFinished(JobItem *)), Qt::UniqueConnection);
+        connect(widget, SIGNAL(fittingError(QString)), m_controlWidget,
+                SLOT(onFittingError(QString)), Qt::UniqueConnection);
+        connect(widget, SIGNAL(fittingLog(QString)), m_controlWidget,
+                SLOT(onFittingLog(QString)), Qt::UniqueConnection);
+    }
+}
+
+void FitActivityPanel::onStartFittingRequest()
+{
+    if(FitSuiteWidget *widget = currentFitSuiteWidget())
+        widget->startFitting();
+}
+
+void FitActivityPanel::onStopFittingRequest()
+{
+    if(FitSuiteWidget *widget = currentFitSuiteWidget())
+        widget->stopFitting();
+}
+
+bool FitActivityPanel::isValidJobItem(JobItem *item)
+{
+    if(!item) return false;
+    return item->isValidForFitting();
+}
+
+FitSuiteWidget *FitActivityPanel::currentFitSuiteWidget()
+{
+    return m_stackedWidget->currentWidget();
+}
diff --git a/GUI/coregui/Views/FitWidgets/FitActivityPanel.h b/GUI/coregui/Views/FitWidgets/FitActivityPanel.h
new file mode 100644
index 0000000..5eb5847
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitActivityPanel.h
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitActivityPanel.h
+//! @brief     Defines class FitActivityPanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITACTIVITYPANEL_H
+#define FITACTIVITYPANEL_H
+
+#include "ItemStackPresenter.h"
+#include <QWidget>
+
+class JobModel;
+class JobItem;
+class FitSuiteWidget;
+class JobRealTimeWidget;
+class RunFitControlWidget;
+class JobMessagePanel;
+
+//! The FitActivityPanel class is a main widget to run the fitting.
+//! Occupies bottom right corner of JobView, contains stack of FitSuiteWidgets for every
+//! JobItem which is suitable for fitting.
+
+class BA_CORE_API_ FitActivityPanel : public QWidget
+{
+    Q_OBJECT
+public:
+    FitActivityPanel(JobModel *jobModel, QWidget *parent = 0);
+
+    void setRealTimeWidget(JobRealTimeWidget *realTimeWidget);
+    void setJobMessagePanel(JobMessagePanel *jobMessagePanel);
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+public slots:
+    void setItem(JobItem *item);
+
+private slots:
+    void onStartFittingRequest();
+    void onStopFittingRequest();
+
+private:
+    bool isValidJobItem(JobItem *item);
+    FitSuiteWidget *currentFitSuiteWidget();
+
+    ItemStackPresenter<FitSuiteWidget> *m_stackedWidget;
+    RunFitControlWidget *m_controlWidget;
+    JobRealTimeWidget *m_realTimeWidget;
+    JobMessagePanel *m_jobMessagePanel;
+};
+
+#endif // FITACTIVITYPANEL_H
diff --git a/GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp b/GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp
new file mode 100644
index 0000000..203b639
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp
@@ -0,0 +1,273 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitComparisonWidget.cpp
+//! @brief     Implements class FitComparisonWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitComparisonWidget.h"
+#include "AxesItems.h"
+#include "ColorMapCanvas.h"
+#include "ColorMapLabel.h"
+#include "FitFlowWidget.h"
+#include "IntensityDataFunctions.h"
+#include "IntensityDataItem.h"
+#include "JobItem.h"
+#include "RealDataItem.h"
+#include "SessionModel.h"
+#include <QAction>
+#include <QDebug>
+#include <QGridLayout>
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QVBoxLayout>
+
+namespace {
+const double relative_diff_min = 1e-05;
+const double relative_diff_max = 1;
+}
+
+FitComparisonWidget::FitComparisonWidget(QWidget *parent)
+    : SessionItemWidget(parent)
+    , m_realDataPlot(new ColorMapCanvas)
+    , m_simulatedDataPlot(new ColorMapCanvas)
+    , m_relativeDiffPlot(new ColorMapCanvas)
+    , m_fitFlowWidget(new FitFlowWidget)
+    , m_statusLabel(new ColorMapLabel(0, this))
+    , m_currentJobItem(0)
+    , m_realDataItem(0)
+    , m_simulatedDataItem(0)
+    , m_relativeDiffItem(0)
+    , m_resetViewAction(0)
+    , m_tempIntensityDataModel(new SessionModel("TempIntensityDataModel", this))
+{
+    QVBoxLayout *vlayout = new QVBoxLayout;
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+
+    QGridLayout *gridLayout = new QGridLayout;
+    gridLayout->setMargin(0);
+    gridLayout->setSpacing(0);
+
+    setStyleSheet("background-color:white;");
+
+    gridLayout->addWidget(m_realDataPlot, 0, 0);
+    gridLayout->addWidget(m_simulatedDataPlot, 0, 1);
+    gridLayout->addWidget(m_relativeDiffPlot, 1, 0);
+    gridLayout->addWidget(m_fitFlowWidget, 1, 1);
+
+    vlayout->addLayout(gridLayout);
+    vlayout->addWidget(m_statusLabel);
+    setLayout(vlayout);
+
+    m_resetViewAction = new QAction(this);
+    m_resetViewAction->setText("Reset View");
+    m_resetViewAction->setIcon(QIcon(":/images/toolbar16light_refresh.svg"));
+    m_resetViewAction->setToolTip("Reset View");
+    connect(m_resetViewAction, SIGNAL(triggered()), this, SLOT(onResetViewAction()));
+
+}
+
+FitComparisonWidget::~FitComparisonWidget()
+{
+    if(m_simulatedDataItem)
+        m_simulatedDataItem->mapper()->unsubscribe(this);
+
+    if(m_currentJobItem)
+        m_currentJobItem->mapper()->unsubscribe(this);
+}
+
+void FitComparisonWidget::setItem(SessionItem *item)
+{
+    JobItem *jobItem = dynamic_cast<JobItem *>(item);
+    setJobItem(jobItem);
+}
+
+QList<QAction *> FitComparisonWidget::actionList()
+{
+    return QList<QAction *>() << m_resetViewAction;
+}
+
+void FitComparisonWidget::setJobItem(JobItem *jobItem)
+{
+    if(!jobItem->isValidForFitting())
+        return;
+
+    processJobItemItem(jobItem);
+    setSimulatedDataItem(jobItem->intensityDataItem());
+
+
+    m_relativeDiffItem = createRelativeDifferenceItem();
+    calculateRelativeDifference();
+
+    m_realDataPlot->setItem(m_realDataItem);
+    m_simulatedDataPlot->setItem(m_simulatedDataItem);
+    m_relativeDiffPlot->setItem(m_relativeDiffItem);
+    m_fitFlowWidget->setItem(jobItem->fitSuiteItem());
+
+    m_statusLabel->reset();
+    m_statusLabel->addColorMap(m_realDataPlot);
+    m_statusLabel->addColorMap(m_simulatedDataPlot);
+    m_statusLabel->addColorMap(m_relativeDiffPlot);
+}
+
+//! When widget is visible, axes labels will be removed intensity data items to free more space.
+
+void FitComparisonWidget::showEvent(QShowEvent *)
+{
+    if(isVisible()) {
+        qDebug() << "!!! visible";
+        removeLabels(m_realDataItem);
+        removeLabels(m_simulatedDataItem);
+    }
+}
+
+//! When widget is about to be hidden, axes labels will be restored to not to upset other widgets.
+
+void FitComparisonWidget::hideEvent(QHideEvent *)
+{
+    if(isHidden()) {
+        qDebug() << "!!! hidden";
+        restoreLabels(m_realDataItem);
+        restoreLabels(m_simulatedDataItem);
+    }
+}
+
+void FitComparisonWidget::processJobItemItem(JobItem *jobItem)
+{
+
+    if(jobItem == m_currentJobItem)
+        return;
+
+    if(m_currentJobItem)
+        m_currentJobItem->mapper()->unsubscribe(this);
+
+    m_currentJobItem = jobItem;
+    if(!m_currentJobItem) return;
+
+    m_currentJobItem->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+    {
+        if(name == JobItem::P_STATUS) {
+            if(m_currentJobItem->isCompleted())
+                onResetViewAction();
+        }
+    }, this);
+
+    m_currentJobItem->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_currentJobItem = 0;
+    }, this);
+
+    m_realDataItem = m_currentJobItem->realDataItem()->intensityDataItem();
+    backupLabels(m_realDataItem);
+}
+
+void FitComparisonWidget::onResetViewAction()
+{
+    qDebug() << "FitComparisonWidget::onResetViewAction()";
+    m_realDataItem->resetView();
+    m_simulatedDataItem->resetView();
+    m_relativeDiffItem->resetView();
+    m_relativeDiffItem->setLowerAndUpperZ(relative_diff_min, relative_diff_max);
+}
+
+//! Sets tracking of simulated data item.
+
+void FitComparisonWidget::setSimulatedDataItem(IntensityDataItem *simulatedDataItem)
+{
+    if(simulatedDataItem == m_simulatedDataItem)
+        return;
+
+    if(m_simulatedDataItem)
+        m_simulatedDataItem->mapper()->unsubscribe(this);
+
+    m_simulatedDataItem = simulatedDataItem;
+    if(!m_simulatedDataItem) return;
+
+    m_simulatedDataItem->mapper()->setOnValueChange(
+        [this]()
+    {
+        calculateRelativeDifference();
+    }, this);
+
+    m_simulatedDataItem->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_simulatedDataItem = 0;
+    }, this);
+
+    backupLabels(simulatedDataItem);
+
+}
+
+//! Creates an IntensityDataItem which will hold relative difference map between simulation
+//! and real data.
+
+IntensityDataItem *FitComparisonWidget::createRelativeDifferenceItem()
+{
+    m_tempIntensityDataModel->clear();
+
+    IntensityDataItem *result = dynamic_cast<IntensityDataItem *>(
+        m_tempIntensityDataModel->insertNewItem(Constants::IntensityDataType));
+
+    return result;
+}
+
+void FitComparisonWidget::calculateRelativeDifference()
+{
+    Q_ASSERT(m_realDataItem);
+    Q_ASSERT(m_simulatedDataItem);
+    Q_ASSERT(m_relativeDiffItem);
+
+    m_relativeDiffItem->setOutputData(
+        IntensityDataFunctions::createRelativeDifferenceData(*m_simulatedDataItem->getOutputData(),
+                *m_realDataItem->getOutputData()));
+
+    m_relativeDiffItem->xAxisItem()->setItemValue(BasicAxisItem::P_TITLE, QString());
+    m_relativeDiffItem->yAxisItem()->setItemValue(BasicAxisItem::P_TITLE, QString());
+    m_relativeDiffItem->setLowerAndUpperZ(relative_diff_min, relative_diff_max);
+
+}
+
+//! Backup axes labels for given item. Labels will be returned back when FitComparisonWidget
+//! is hidden.
+
+void FitComparisonWidget::backupLabels(IntensityDataItem *intensityItem)
+{
+    LabelBackup data;
+    data.xlabel = intensityItem->xAxisItem()->getItemValue(BasicAxisItem::P_TITLE).toString();
+    data.ylabel = intensityItem->yAxisItem()->getItemValue(BasicAxisItem::P_TITLE).toString();
+    m_labelBackup[intensityItem] = data;
+}
+
+//! Restores item labels from the backup.
+
+void FitComparisonWidget::restoreLabels(IntensityDataItem *intensityItem)
+{
+    QMap<IntensityDataItem *, LabelBackup>::iterator it = m_labelBackup.find(intensityItem);
+    if(it != m_labelBackup.end()) {
+        LabelBackup lb = it.value();
+        intensityItem->xAxisItem()->setItemValue(BasicAxisItem::P_TITLE, lb.xlabel);
+        intensityItem->yAxisItem()->setItemValue(BasicAxisItem::P_TITLE, lb.ylabel);
+    }
+}
+
+//! Removes axes label from item. This is because they occupy too much space on this dense widget.
+
+void FitComparisonWidget::removeLabels(IntensityDataItem *intensityItem)
+{
+    if(!intensityItem)
+        return;
+
+    intensityItem->xAxisItem()->setItemValue(BasicAxisItem::P_TITLE, QString());
+    intensityItem->yAxisItem()->setItemValue(BasicAxisItem::P_TITLE, QString());
+}
diff --git a/GUI/coregui/Views/FitWidgets/FitComparisonWidget.h b/GUI/coregui/Views/FitWidgets/FitComparisonWidget.h
new file mode 100644
index 0000000..4824988
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitComparisonWidget.h
@@ -0,0 +1,88 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitComparisonWidget.h
+//! @brief     Defines class FitComparisonWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITCOMPARISONWIDGET_H
+#define FITCOMPARISONWIDGET_H
+
+#include "SessionItemWidget.h"
+#include <QMap>
+
+class JobItem;
+class IntensityDataItem;
+class ColorMapCanvas;
+class SessionModel;
+class FitFlowWidget;
+class ColorMapLabel;
+class QAction;
+
+//! The FitComparisonWidget class plots realdata, simulated data and relative difference map
+//! during the course of the fit.
+
+class BA_CORE_API_ FitComparisonWidget : public SessionItemWidget
+{
+    Q_OBJECT
+
+public:
+    explicit FitComparisonWidget(QWidget *parent = 0);
+    ~FitComparisonWidget();
+
+    void setItem(class SessionItem *item);
+
+    virtual QList<QAction *> actionList();
+
+private slots:
+    void onResetViewAction();
+
+protected:
+    void setJobItem(class JobItem *jobItem);
+    virtual void showEvent(QShowEvent *);
+    virtual void hideEvent(QHideEvent *);
+
+private:
+
+    struct LabelBackup {
+        QString xlabel, ylabel;
+    };
+
+    void processJobItemItem(JobItem *jobItem);
+    void setSimulatedDataItem(IntensityDataItem *simulatedDataItem);
+
+    IntensityDataItem *createRelativeDifferenceItem();
+    void calculateRelativeDifference();
+    void backupLabels(IntensityDataItem *intensityItem);
+    void restoreLabels(IntensityDataItem *intensityItem);
+    void removeLabels(IntensityDataItem *intensityItem);
+
+    ColorMapCanvas *m_realDataPlot;
+    ColorMapCanvas *m_simulatedDataPlot;
+    ColorMapCanvas *m_relativeDiffPlot;
+
+
+    FitFlowWidget *m_fitFlowWidget;
+    ColorMapLabel *m_statusLabel;
+
+    JobItem *m_currentJobItem;
+    IntensityDataItem *m_realDataItem;
+    IntensityDataItem *m_simulatedDataItem;
+    IntensityDataItem *m_relativeDiffItem;
+
+    QAction *m_resetViewAction;
+
+    SessionModel *m_tempIntensityDataModel;
+    QMap<IntensityDataItem *, LabelBackup> m_labelBackup;
+};
+
+#endif // FITCOMPARISONWIDGET_H
diff --git a/GUI/coregui/Views/FitWidgets/FitFlowWidget.cpp b/GUI/coregui/Views/FitWidgets/FitFlowWidget.cpp
new file mode 100644
index 0000000..066d727
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitFlowWidget.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitFlowWidget.cpp
+//! @brief     Implement class FitFlowWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitFlowWidget.h"
+#include "FitSuiteItem.h"
+#include "HistogramPlot.h"
+#include <QDebug>
+#include <QVBoxLayout>
+
+FitFlowWidget::FitFlowWidget(QWidget *parent)
+    : QFrame(parent)
+    , m_histPlot(new HistogramPlot)
+    , m_fitSuiteItem(0)
+{
+    setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setContentsMargins(0, 15, 15, 0);
+    layout->addWidget(m_histPlot);
+
+    setStyleSheet("background-color:white;");
+
+    setLayout(layout);
+}
+
+FitFlowWidget::~FitFlowWidget()
+{
+    if(m_fitSuiteItem)
+        m_fitSuiteItem->mapper()->unsubscribe(this);
+}
+
+void FitFlowWidget::setItem(FitSuiteItem *fitSuiteItem)
+{
+    if(fitSuiteItem == m_fitSuiteItem)
+        return;
+
+    if(m_fitSuiteItem)
+        m_fitSuiteItem->mapper()->unsubscribe(this);
+
+    m_fitSuiteItem = fitSuiteItem;
+    if(!m_fitSuiteItem)
+        return;
+
+    m_fitSuiteItem->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+    {
+        if(name == FitSuiteItem::P_CHI2) {
+            int iter = m_fitSuiteItem->getItemValue(FitSuiteItem::P_ITERATION_COUNT).toInt();
+            double chi = m_fitSuiteItem->getItemValue(FitSuiteItem::P_CHI2).toDouble();
+            if(iter == 0) {
+                m_histPlot->clearData();
+//                m_x.clear();
+//                m_y.clear();
+            }
+//            m_x.push_back(static_cast<double>(iter));
+//            m_y.push_back(chi);
+            m_histPlot->addData(static_cast<double>(iter), chi);
+        }
+//        if(name == JobItem::P_STATUS) {
+//            if(m_currentJobItem->isCompleted())
+//                onResetViewAction();
+//        }
+    }, this);
+
+    m_fitSuiteItem->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_fitSuiteItem = 0;
+    }, this);
+
+}
+
diff --git a/GUI/coregui/Views/FitWidgets/FitFlowWidget.h b/GUI/coregui/Views/FitWidgets/FitFlowWidget.h
new file mode 100644
index 0000000..3c616b2
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitFlowWidget.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitFlowWidget.h
+//! @brief     Defines class FitFlowWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITFLOWWIDGET_H
+#define FITFLOWWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QFrame>
+
+class HistogramPlot;
+class FitSuiteItem;
+
+//! The FitFlowWidget class is intended for showing chi2 .vs interation count dependency.
+//! The main goal is to fill vacant place in FitComparisonWidget.
+
+class BA_CORE_API_ FitFlowWidget : public QFrame
+{
+    Q_OBJECT
+public:
+    explicit FitFlowWidget(QWidget *parent = 0);
+    ~FitFlowWidget();
+
+    void setItem(FitSuiteItem *fitSuiteItem);
+
+private:
+    HistogramPlot *m_histPlot;
+    FitSuiteItem *m_fitSuiteItem;
+    QVector<double> m_x;
+    QVector<double> m_y;
+};
+
+
+
+#endif // FITFLOWWIDGET_H
+
diff --git a/GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp b/GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp
new file mode 100644
index 0000000..faa8204
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp
@@ -0,0 +1,446 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitParameterWidget.cpp
+//! @brief     Implements class FitParameterWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameterWidget.h"
+#include "CustomEventFilters.h"
+#include "FilterPropertyProxy.h"
+#include "FitParameterHelper.h"
+#include "FitParameterItems.h"
+#include "FitParameterProxyModel.h"
+#include "FitSuiteItem.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "OverlayLabelController.h"
+#include "ParameterTreeItems.h"
+#include "ParameterTuningWidget.h"
+#include "SessionModelDelegate.h"
+#include "mainwindow_constants.h"
+#include <QAction>
+#include <QDebug>
+#include <QMenu>
+#include <QSignalMapper>
+#include <QTreeView>
+#include <QVBoxLayout>
+
+FitParameterWidget::FitParameterWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_treeView(new QTreeView)
+    , m_jobItem(0)
+    , m_tuningWidget(0)
+    , m_createFitParAction(0)
+    , m_removeFromFitParAction(0)
+    , m_removeFitParAction(0)
+    , m_signalMapper(0)
+    , m_fitParameterModel(0)
+    , m_delegate(new SessionModelDelegate(this))
+    , m_keyboardFilter(new DeleteEventFilter(this))
+    , m_infoLabel(new OverlayLabelController(this))
+{
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->addWidget(m_treeView);
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    setLayout(layout);
+    init_actions();
+
+    m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    m_treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
+    m_treeView->setContextMenuPolicy(Qt::CustomContextMenu);
+    m_treeView->setItemDelegate(m_delegate);
+    m_treeView->setDragEnabled(true);
+    m_treeView->setDragDropMode(QAbstractItemView::DragDrop);
+    m_treeView->installEventFilter(m_keyboardFilter);
+    m_treeView->setAlternatingRowColors(true);
+    m_treeView->setStyleSheet("alternate-background-color: #EFF0F1;");
+
+    connect(m_treeView, SIGNAL(customContextMenuRequested(const QPoint &)),
+            this, SLOT(onFitParameterTreeContextMenu(const QPoint &)));
+
+    m_infoLabel->setArea(m_treeView);
+    m_infoLabel->setText(QStringLiteral("Drop parameter(s) to fit here"));
+}
+
+void FitParameterWidget::setItem(JobItem *jobItem)
+{
+    if(jobItem == m_jobItem) {
+        return;
+    }
+
+    else {
+        m_jobItem = jobItem;
+        if (!m_jobItem) return;
+
+        init_fit_model();
+    }
+}
+
+//! Sets ParameterTuningWidget to be able to provide it with context menu and steer
+//! it behaviour in the course of fit settings or fit runnig
+
+void FitParameterWidget::setParameterTuningWidget(ParameterTuningWidget *tuningWidget)
+{
+    if(tuningWidget == m_tuningWidget) {
+        return;
+
+    } else {
+        if(m_tuningWidget)
+            disconnect(m_tuningWidget, SIGNAL(itemContextMenuRequest(QPoint)),
+                this, SLOT(onTuningWidgetContextMenu(QPoint)));
+
+        m_tuningWidget = tuningWidget;
+        if(!m_tuningWidget) return;
+
+        connect(m_tuningWidget, SIGNAL(itemContextMenuRequest(QPoint)),
+            this, SLOT(onTuningWidgetContextMenu(QPoint)), Qt::UniqueConnection);
+    }
+}
+
+//QSize FitParameterWidget::sizeHint() const
+//{
+//    return QSize(Constants::REALTIME_WIDGET_WIDTH_HINT, Constants::FIT_PARAMETER_WIDGET_HEIGHT);
+//}
+
+//QSize FitParameterWidget::minimumSizeHint() const
+//{
+//    return QSize(25, 25);
+//}
+
+//! Creates context menu for ParameterTuningWidget
+
+void FitParameterWidget::onTuningWidgetContextMenu(const QPoint &point)
+{
+    QMenu menu;
+    initTuningWidgetContextMenu(menu);
+    menu.exec(point);
+    setActionsEnabled(true);
+}
+
+//! Creates context menu for the tree with fit parameters
+
+void FitParameterWidget::onFitParameterTreeContextMenu(const QPoint &point)
+{
+    QMenu menu;
+    initFitParameterTreeContextMenu(menu);
+    menu.exec(m_treeView->mapToGlobal(point+ QPoint(2, 22)));
+    setActionsEnabled(true);
+}
+
+void FitParameterWidget::onTuningWidgetSelectionChanged(const QItemSelection &selection)
+{
+    Q_UNUSED(selection);
+}
+
+//! Propagates selection form the tree with fit parameters to the tuning widget
+
+void FitParameterWidget::onFitParametersSelectionChanged(const QItemSelection &selection)
+{
+    Q_UNUSED(selection);
+    qDebug() << "onFitParametersSelectionChanged ->";
+    if (selection.indexes().isEmpty())
+        return;
+
+    foreach(QModelIndex index, selection.indexes()) {
+        m_tuningWidget->selectionModel()->clearSelection();
+        SessionItem *item = m_fitParameterModel->itemForIndex(index);
+        if(item->parent()->modelType() == Constants::FitParameterLinkType) {
+            QString link = item->parent()->getItemValue(FitParameterLinkItem::P_LINK).toString();
+            m_tuningWidget->makeSelected(FitParameterHelper::getParameterItem(m_jobItem->fitParameterContainerItem(), link));
+        }
+        qDebug() << "XXX index" << index << item->modelType();
+
+    }
+
+}
+
+//! Creates fit parameters for all selected ParameterItem's in tuning widget
+
+void FitParameterWidget::onCreateFitParAction()
+{
+    foreach(ParameterItem *item, m_tuningWidget->getSelectedParameters()) {
+        if(!FitParameterHelper::getFitParameterItem(m_jobItem->fitParameterContainerItem(), item)) {
+            FitParameterHelper::createFitParameter(m_jobItem->fitParameterContainerItem(), item);
+        }
+    }
+}
+
+//! All ParameterItem's selected in tuning widget will be removed from link section of
+//! corresponding fitParameterItem.
+
+void FitParameterWidget::onRemoveFromFitParAction()
+{
+    foreach(ParameterItem *item, m_tuningWidget->getSelectedParameters()) {
+        if(FitParameterHelper::getFitParameterItem(m_jobItem->fitParameterContainerItem(), item)) {
+            FitParameterHelper::removeFromFitParameters(m_jobItem->fitParameterContainerItem(), item);
+        }
+    }
+}
+
+//! All selected FitParameterItem's of FitParameterItemLink's will be removed
+
+void FitParameterWidget::onRemoveFitParAction()
+{
+    FitParameterContainerItem *container = m_jobItem->fitParameterContainerItem();
+
+    // retrieve both, selected FitParameterItem and FitParameterItemLink
+    QVector<FitParameterLinkItem *> linksToRemove = selectedFitParameterLinks();
+    QVector<FitParameterItem *> itemsToRemove = selectedFitParameters();
+
+    foreach(FitParameterLinkItem *item, linksToRemove) {
+        container->model()->removeRow(item->index().row(), item->index().parent());
+    }
+
+    foreach(FitParameterItem *item, itemsToRemove) {
+        container->model()->removeRow(item->index().row(), item->index().parent());
+    }
+}
+
+//! Add all selected parameters to fitParameter with given index
+
+void FitParameterWidget::onAddToFitParAction(int ipar)
+{
+    QStringList fitParNames
+        = FitParameterHelper::getFitParameterNames(m_jobItem->fitParameterContainerItem());
+    foreach (ParameterItem *item, m_tuningWidget->getSelectedParameters()) {
+        FitParameterHelper::addToFitParameter(m_jobItem->fitParameterContainerItem(), item,
+                                          fitParNames.at(ipar));
+    }
+}
+
+void FitParameterWidget::onFitParameterModelChange()
+{
+    qDebug() << "FitParameterWidget::onFitParameterModelChange()";
+    spanParameters();
+    updateInfoLabel();
+}
+
+
+//! Context menu reimplemented to suppress the default one
+
+void FitParameterWidget::contextMenuEvent(QContextMenuEvent *event)
+{
+    Q_UNUSED(event);
+}
+
+void FitParameterWidget::init_actions()
+{
+    m_createFitParAction = new QAction(QStringLiteral("Create fit parameter"), this);
+    connect(m_createFitParAction, SIGNAL(triggered()), this, SLOT(onCreateFitParAction()));
+
+    m_removeFromFitParAction = new QAction(QStringLiteral("Remove from fit parameters"), this);
+    connect(m_removeFromFitParAction, SIGNAL(triggered()), this, SLOT(onRemoveFromFitParAction()));
+
+    m_removeFitParAction = new QAction(QStringLiteral("Remove fit parameter"), this);
+    connect(m_removeFitParAction, SIGNAL(triggered()), this, SLOT(onRemoveFitParAction()));
+
+    m_signalMapper = new QSignalMapper(this);
+    connect(m_signalMapper, SIGNAL(mapped(int)), this, SLOT(onAddToFitParAction(int)));
+
+    connect(m_keyboardFilter, SIGNAL(removeItem()), this, SLOT(onRemoveFitParAction()));
+}
+
+//! Fills context menu for ParameterTuningWidget with content.
+
+void FitParameterWidget::initTuningWidgetContextMenu(QMenu &menu)
+{
+    if(m_jobItem->getStatus() == Constants::STATUS_FITTING) {
+        setActionsEnabled(false);
+        return;
+    }
+
+    m_removeFromFitParAction->setEnabled(canRemoveFromFitParameters());
+    m_createFitParAction->setEnabled(canCreateFitParameter());
+
+    menu.addAction(m_createFitParAction);
+    QMenu *addToFitParMenu = menu.addMenu("Add to existing fit parameter");
+    addToFitParMenu->setDisabled(true);
+    Q_UNUSED(addToFitParMenu);
+
+    // --> TODO REDMINE #1478 Uncomment, when issue is solved
+
+//    QStringList fitParNames
+//        = FitParameterHelper::getFitParameterNames(m_jobItem->fitParameterContainerItem());
+//    if(fitParNames.isEmpty() || canCreateFitParameter()==false) {
+//        addToFitParMenu->setEnabled(false);
+//    }
+
+//    for(int i =0; i<fitParNames.count(); ++i) {
+//        QAction *action = new QAction(QString("to ").append(fitParNames.at(i)), addToFitParMenu);
+//        connect(action, SIGNAL(triggered()), m_signalMapper, SLOT(map()));
+//        m_signalMapper->setMapping(action, i);
+//        addToFitParMenu->addAction(action);
+//    }
+    // <-- end of uncomment
+
+    menu.addSeparator();
+    menu.addAction(m_removeFromFitParAction);
+}
+
+//! Fills context menu for FitParameterTree with content.
+
+void FitParameterWidget::initFitParameterTreeContextMenu(QMenu &menu)
+{
+    if(m_jobItem->getStatus() == Constants::STATUS_FITTING) {
+        setActionsEnabled(false);
+        return;
+    }
+    menu.addAction(m_removeFitParAction);
+}
+
+//! Initializes FitParameterModel and its tree.
+
+void FitParameterWidget::init_fit_model()
+{
+    m_treeView->setModel(0);
+
+    delete m_fitParameterModel;
+    m_fitParameterModel = new FitParameterProxyModel(m_jobItem->fitParameterContainerItem(),
+                                                   m_jobItem->fitParameterContainerItem()->model());
+    m_treeView->setModel(m_fitParameterModel);
+
+    connect(m_fitParameterModel, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
+            this, SLOT(onFitParameterModelChange()));
+    connect(m_fitParameterModel, SIGNAL(modelReset()), this, SLOT(onFitParameterModelChange()));
+
+    onFitParameterModelChange();
+    connectFitParametersSelection(true);
+}
+
+//! Returns true if tuning widget contains selected ParameterItem's which can be used to create
+//! a fit parameter (i.e. it is not linked with some fit parameter already).
+
+bool FitParameterWidget::canCreateFitParameter()
+{
+    QVector<ParameterItem *> selected = m_tuningWidget->getSelectedParameters();
+    foreach(ParameterItem *item, selected) {
+        if(FitParameterHelper::getFitParameterItem(
+                    m_jobItem->fitParameterContainerItem(), item) == nullptr)
+            return true;
+    }
+    return false;
+}
+
+//! Returns true if tuning widget contains selected ParameterItem's which can be removed from
+//! fit parameters.
+
+bool FitParameterWidget::canRemoveFromFitParameters()
+{
+    QVector<ParameterItem *> selected = m_tuningWidget->getSelectedParameters();
+    foreach(ParameterItem *item, selected) {
+        if(FitParameterHelper::getFitParameterItem(m_jobItem->fitParameterContainerItem(), item))
+            return true;
+    }
+    return false;
+}
+
+//! Enables/disables all context menu actions.
+
+void FitParameterWidget::setActionsEnabled(bool value)
+{
+    m_createFitParAction->setEnabled(value);
+    m_removeFromFitParAction->setEnabled(value);
+    m_removeFitParAction->setEnabled(value);
+}
+
+//! Returns list of FitParameterItem's currently selected in FitParameterItem tree
+
+QVector<FitParameterItem *> FitParameterWidget::selectedFitParameters()
+{
+    QVector<FitParameterItem *> result;
+    QModelIndexList indexes = m_treeView->selectionModel()->selectedIndexes();
+    foreach(QModelIndex index, indexes) {
+        if(SessionItem *item = m_fitParameterModel->itemForIndex(index)) {
+            if(item->modelType() == Constants::FitParameterType) {
+                FitParameterItem *fitParItem = dynamic_cast<FitParameterItem *>(item);
+                Q_ASSERT(fitParItem);
+                result.push_back(fitParItem);
+            }
+        }
+    }
+    return result;
+}
+
+//! Returns links of FitParameterLink's item selected in FitParameterItem tree
+
+QVector<FitParameterLinkItem *> FitParameterWidget::selectedFitParameterLinks()
+{
+    QVector<FitParameterLinkItem *> result;
+    QModelIndexList indexes = m_treeView->selectionModel()->selectedIndexes();
+    foreach (QModelIndex index, indexes) {
+        if (SessionItem *item = m_fitParameterModel->itemForIndex(index)) {
+            if (item->parent()->modelType() == Constants::FitParameterLinkType) {
+                FitParameterLinkItem *fitParItem
+                    = dynamic_cast<FitParameterLinkItem *>(item->parent());
+                Q_ASSERT(fitParItem);
+                result.push_back(fitParItem);
+            }
+        }
+    }
+    return result;
+}
+
+//! Makes first column in FitParameterItem's tree related to ParameterItem link occupy whole space.
+
+void FitParameterWidget::spanParameters()
+{
+    m_treeView->expandAll();
+    for (int i = 0; i < m_fitParameterModel->rowCount(QModelIndex()); i++){
+        QModelIndex parameter = m_fitParameterModel->index(i,0,QModelIndex());
+        if (!parameter.isValid())
+            break;
+        int childRowCount = m_fitParameterModel->rowCount(parameter);
+        if (childRowCount > 0){
+            for (int j = 0; j < childRowCount; j++) {
+                m_treeView->setFirstColumnSpanned(j, parameter, true);
+            }
+        }
+    }
+}
+
+//! Places overlay label on top of tree view, if there is no fit parameters
+void FitParameterWidget::updateInfoLabel()
+{
+    Q_ASSERT(m_jobItem);
+    bool is_to_show_label = m_jobItem->fitParameterContainerItem()->isEmpty();
+    m_infoLabel->setShown(is_to_show_label);
+}
+
+
+void FitParameterWidget::connectTuningWidgetSelection(bool active)
+{
+    Q_ASSERT(m_tuningWidget);
+
+    if (active) {
+        connect(m_tuningWidget->selectionModel(),
+                SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+                this, SLOT(onTuningWidgetSelectionChanged(QItemSelection)), Qt::UniqueConnection);
+    } else {
+        disconnect(m_tuningWidget->selectionModel(),
+                SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+                this, SLOT(onTuningWidgetSelectionChanged(QItemSelection)));
+    }
+}
+
+void FitParameterWidget::connectFitParametersSelection(bool active) {
+    if (active) {
+        connect(m_treeView->selectionModel(),
+                SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+                this, SLOT(onFitParametersSelectionChanged(QItemSelection)), Qt::UniqueConnection);
+    } else {
+        disconnect(m_treeView->selectionModel(),
+                SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+                this, SLOT(onFitParametersSelectionChanged(QItemSelection)));
+    }
+}
diff --git a/GUI/coregui/Views/FitWidgets/FitParameterWidget.h b/GUI/coregui/Views/FitWidgets/FitParameterWidget.h
new file mode 100644
index 0000000..f3078a7
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitParameterWidget.h
@@ -0,0 +1,103 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitParameterWidget.h
+//! @brief     Defines class FitParameterWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPARAMETERWIDGET_H
+#define FITPARAMETERWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class JobItem;
+class ParameterTuningWidget;
+class QTreeView;
+class QSignalMapper;
+class QAction;
+class QMenu;
+class FitParameterProxyModel;
+class ParameterItem;
+class FitParameterItem;
+class FitParameterLinkItem;
+class QItemSelection;
+class SessionModelDelegate;
+class DeleteEventFilter;
+class OverlayLabelController;
+
+//! The FitParametersWidget class contains a tree view to set fit parameters (fix/release,
+//! starting value, min/max bounds). It occupies buttom right corner of JobView.
+
+class BA_CORE_API_ FitParameterWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    FitParameterWidget(QWidget *parent = 0);
+
+    void setItem(JobItem *jobItem);
+    void setParameterTuningWidget(ParameterTuningWidget *tuningWidget);
+
+//    QSize sizeHint() const;
+//    QSize minimumSizeHint() const;
+
+public slots:
+    void onTuningWidgetContextMenu(const QPoint &point);
+    void onFitParameterTreeContextMenu(const QPoint &point);
+    void onTuningWidgetSelectionChanged(const QItemSelection&selection);
+    void onFitParametersSelectionChanged(const QItemSelection &selection);
+
+private slots:
+    void onCreateFitParAction();
+    void onRemoveFromFitParAction();
+    void onRemoveFitParAction();
+    void onAddToFitParAction(int ipar);
+    void onFitParameterModelChange();
+
+protected:
+    void contextMenuEvent(QContextMenuEvent *event);
+
+private:
+    void init_actions();
+    void initTuningWidgetContextMenu(QMenu &menu);
+    void initFitParameterTreeContextMenu(QMenu &menu);
+
+    void init_fit_model();
+
+    bool canCreateFitParameter();
+    bool canRemoveFromFitParameters();
+
+    void setActionsEnabled(bool value);
+    void connectTuningWidgetSelection(bool active);
+    void connectFitParametersSelection(bool active);
+
+    QVector<FitParameterItem *> selectedFitParameters();
+    QVector<FitParameterLinkItem *> selectedFitParameterLinks();
+
+    void spanParameters();
+    void updateInfoLabel();
+
+    QTreeView *m_treeView;
+    JobItem *m_jobItem;
+    ParameterTuningWidget *m_tuningWidget;
+    QAction *m_createFitParAction;
+    QAction *m_removeFromFitParAction;
+    QAction *m_removeFitParAction;
+    QSignalMapper *m_signalMapper;
+    FitParameterProxyModel* m_fitParameterModel;
+    SessionModelDelegate *m_delegate;
+    DeleteEventFilter *m_keyboardFilter;
+    OverlayLabelController *m_infoLabel;
+};
+
+#endif // FITPARAMETERWIDGET_H
diff --git a/GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp b/GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp
new file mode 100644
index 0000000..2be13c3
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitProgressInfo.cpp
+//! @brief     Implements class FitProgressInfo
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitProgressInfo.h"
+
+FitProgressInfo::FitProgressInfo()
+    : m_chi2(0.0)
+    , m_iteration_count(0)
+{
+
+}
+
+//! Copy constructor is reimplemented as required by Qt's meta-object system
+
+FitProgressInfo::FitProgressInfo(const FitProgressInfo &other)
+{
+    m_chi2 = other.m_chi2;
+    m_iteration_count = other.m_iteration_count;
+    m_values = other.m_values;
+}
+
+//! Destructor is reimplemented as required by Qt's meta-object system
+
+FitProgressInfo::~FitProgressInfo()
+{
+
+}
diff --git a/GUI/coregui/Views/FitWidgets/FitProgressInfo.h b/GUI/coregui/Views/FitWidgets/FitProgressInfo.h
new file mode 100644
index 0000000..388e0ff
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitProgressInfo.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitProgressInfo.h
+//! @brief     Defines class FitProgressInfo
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPROGRESSINFO_H
+#define FITPROGRESSINFO_H
+
+#include "WinDllMacros.h"
+#include <QMetaType>
+#include <QVector>
+
+//! The FitProgressInfo class contains all essential information about fit progress.
+//! It is send from GUIFitObserver to FitSuiteWidget on every nth iteration.
+
+//! Important: the class is used for Qt::QueuedConnection type, when sender leaves in another
+//! thread. To make it possible, it is also registered in main.cpp.
+
+class BA_CORE_API_ FitProgressInfo {
+public:
+    FitProgressInfo();
+    FitProgressInfo(const FitProgressInfo &other);
+    ~FitProgressInfo();
+
+    double chi2() const { return m_chi2; }
+    int iterationCount() const { return m_iteration_count; }
+    QVector<double> parValues() const { return m_values; }
+
+    friend class GUIFitObserver;
+private:
+    double m_chi2;
+    int m_iteration_count;
+    QVector<double> m_values;
+};
+
+Q_DECLARE_METATYPE(FitProgressInfo)
+
+#endif // FITPROGRESSINFO_H
diff --git a/GUI/coregui/Views/FitWidgets/FitResultsWidget.cpp b/GUI/coregui/Views/FitWidgets/FitResultsWidget.cpp
new file mode 100644
index 0000000..5b1142d
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitResultsWidget.cpp
@@ -0,0 +1,24 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitResultsWidget.cpp
+//! @brief     Implements class FitResultsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitResultsWidget.h"
+
+FitResultsWidget::FitResultsWidget(QWidget *parent)
+    : QWidget(parent)
+{
+    setWindowTitle(QLatin1String("Fit Results"));
+
+}
diff --git a/GUI/coregui/Views/FitWidgets/FitResultsWidget.h b/GUI/coregui/Views/FitWidgets/FitResultsWidget.h
new file mode 100644
index 0000000..233c9fb
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitResultsWidget.h
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitResultsWidget.h
+//! @brief     Defines class FitResultsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITRESULTSWIDGET_H
+#define FITRESULTSWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+//! The FitResultsWidget contains fitting summary. Part of FitSuiteWidget.
+
+class BA_CORE_API_ FitResultsWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    FitResultsWidget(QWidget *parent = 0);
+};
+
+#endif // FITRESULTSWIDGET_H
diff --git a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp
new file mode 100644
index 0000000..3db0e8c
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp
@@ -0,0 +1,262 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitSuiteWidget.cpp
+//! @brief     Implements class FitSuiteWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitSuiteWidget.h"
+#include "DomainFittingBuilder.h"
+#include "FitParameterItems.h"
+#include "FitParameterWidget.h"
+#include "FitProgressInfo.h"
+#include "FitResultsWidget.h"
+#include "FitSuite.h"
+#include "FitSuiteItem.h"
+#include "GUIFitObserver.h"
+#include "GUIHelpers.h"
+#include "IntensityDataItem.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "MinimizerSettingsWidget.h"
+#include "ModelPath.h"
+#include "ParameterTreeItems.h"
+#include "RunFitManager.h"
+#include "mainwindow_constants.h"
+#include <QDebug>
+#include <QMessageBox>
+#include <QTabWidget>
+#include <QVBoxLayout>
+
+FitSuiteWidget::FitSuiteWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_tabWidget(new QTabWidget)
+    , m_fitParametersWidget(new FitParameterWidget)
+    , m_minimizerSettingsWidget(new MinimizerSettingsWidget)
+    , m_fitResultsWidget(new FitResultsWidget)
+    , m_currentItem(0)
+    , m_runFitManager(new RunFitManager(parent))
+    , m_observer(new GUIFitObserver())
+    , m_block_progress_update(false)
+{
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->setMargin(0);
+    layout->setSpacing(0);
+
+//    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+//    m_tabWidget->setMinimumSize(25, 25);
+//    m_tabWidget->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
+
+    m_tabWidget->addTab(m_fitParametersWidget, "Fit Parameters");
+    m_tabWidget->addTab(m_minimizerSettingsWidget, "Minimizer");
+    //m_tabWidget->addTab(m_fitResultsWidget, "Fit Results");
+
+    layout->addWidget(m_tabWidget);
+
+    setLayout(layout);
+    connectSignals();
+}
+
+FitSuiteWidget::~FitSuiteWidget()
+{
+
+}
+
+void FitSuiteWidget::setItem(JobItem *jobItem)
+{
+    Q_ASSERT(jobItem);
+    m_currentItem = jobItem;
+    m_fitParametersWidget->setItem(jobItem);
+    m_minimizerSettingsWidget->setItem(jobItem);
+}
+
+void FitSuiteWidget::setModelTuningWidget(ParameterTuningWidget *tuningWidget)
+{
+    Q_ASSERT(m_fitParametersWidget);
+    Q_ASSERT(tuningWidget);
+    m_fitParametersWidget->setParameterTuningWidget(tuningWidget);
+}
+
+QSize FitSuiteWidget::sizeHint() const
+{
+    return QSize(Constants::REALTIME_WIDGET_WIDTH_HINT, Constants::FIT_SUITE_WIDGET_HEIGHT);
+}
+
+QSize FitSuiteWidget::minimumSizeHint() const
+{
+    return QSize(25, 25);
+}
+
+void FitSuiteWidget::onError(const QString &text)
+{
+    qDebug() << "FitSuiteWidget::onError" << text;
+}
+
+void FitSuiteWidget::onPlotsUpdate()
+{
+    qDebug() << "FitSuiteWidget::onPlotsUpdate";
+    m_currentItem->intensityDataItem()->setRawDataVector(m_observer->simulationData());
+    m_observer->finishedPlotting();
+}
+
+//! Propagates fit progress as reported by GUIFitObserver back to JobItem.
+
+void FitSuiteWidget::onProgressInfoUpdate(const FitProgressInfo &info)
+{
+    if(m_block_progress_update) return;
+
+    m_block_progress_update = true;
+
+    updateIterationCount(info);
+    updateTuningWidgetParameterValues(info);
+    updateLog(info);
+
+    m_block_progress_update = false;
+}
+
+void FitSuiteWidget::startFitting()
+{
+    if(!m_currentItem)
+        return;
+    qDebug() << "FitSuiteWidget::startFitting()";
+
+    m_currentItem->fitSuiteItem()->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+    {
+        onFitSuitePropertyChange(name);
+    }, this);
+
+
+    try {
+        qDebug() << " try run fitting";
+        m_observer->setInterval(m_currentItem->fitSuiteItem()->getItemValue(
+                                    FitSuiteItem::P_UPDATE_INTERVAL).toInt());
+        std::shared_ptr<FitSuite> fitSuite(DomainFittingBuilder::createFitSuite(m_currentItem));
+        fitSuite->attachObserver(m_observer);
+        m_runFitManager->setFitSuite(fitSuite);
+        m_observer->finishedPlotting();
+        m_runFitManager->runFitting();
+        qDebug() << " done";
+    } catch(std::exception& e) {
+        m_currentItem->setStatus(Constants::STATUS_FAILED);
+        m_currentItem->fitSuiteItem()->mapper()->unsubscribe(this);
+        processFittingError(QString::fromStdString(e.what()));
+        emit fittingError(QString::fromStdString(e.what()));
+    }
+
+
+}
+
+void FitSuiteWidget::stopFitting()
+{
+//    if(!m_currentItem)
+//        return;
+    qDebug() << "FitSuiteWidget::stopFitting()";
+    m_runFitManager->interruptFitting();
+}
+
+void FitSuiteWidget::onFittingStarted()
+{
+    m_currentItem->setStatus(Constants::STATUS_FITTING);
+    m_currentItem->setProgress(0);
+    m_currentItem->setBeginTime(GUIHelpers::currentDateTime());
+    m_currentItem->setEndTime(QString());
+    m_currentItem->setDuration(0);
+
+    qDebug() << "FitSuiteWidget::onFittingStarted()";
+    emit fittingStarted(m_currentItem);
+}
+
+void FitSuiteWidget::onFittingFinished()
+{
+    if(m_currentItem->getStatus() != Constants::STATUS_FAILED)
+        m_currentItem->setStatus(Constants::STATUS_COMPLETED);
+    m_currentItem->setEndTime(GUIHelpers::currentDateTime());
+    m_currentItem->setProgress(100);
+    m_currentItem->setDuration(m_runFitManager->getDuration());
+    qDebug() << "FitSuiteWidget::onFittingFinished()";
+    m_currentItem->fitSuiteItem()->mapper()->unsubscribe(this);
+    emit fittingFinished(m_currentItem);
+}
+
+//! Propagates update interval from FitSuiteItem to fit observer.
+void FitSuiteWidget::onFitSuitePropertyChange(const QString &name)
+{
+    if(name == FitSuiteItem::P_UPDATE_INTERVAL) {
+        m_observer->setInterval(m_currentItem->fitSuiteItem()->getItemValue(
+                                    FitSuiteItem::P_UPDATE_INTERVAL).toInt());
+
+    }
+
+}
+
+void FitSuiteWidget::processFittingError(const QString &text)
+{
+    //m_currentItem->setStatus(Constants::STATUS_FITTING_FAILED);
+    emit fittingError(text);
+}
+
+void FitSuiteWidget::connectSignals()
+{
+    connect(m_runFitManager, SIGNAL(startedFitting()), this, SLOT(onFittingStarted()));
+    connect(m_runFitManager, SIGNAL(finishedFitting()), this, SLOT(onFittingFinished()));
+    connect(m_runFitManager, SIGNAL(fittingError(QString)),
+            this, SLOT(processFittingError(QString)));
+
+    connect(m_observer.get(), SIGNAL(plotsUpdate()), this, SLOT(onPlotsUpdate()));
+
+
+    connect(m_observer.get(), SIGNAL(logInfoUpdate(QString)),
+            this, SIGNAL(fittingLog(QString)));
+
+
+    connect(m_observer.get(), SIGNAL(progressInfoUpdate(const FitProgressInfo&)),
+            this, SLOT(onProgressInfoUpdate(const FitProgressInfo&)));
+
+}
+
+//! Propagates current number of iteration to FitSuiteItem to make FitControlWidget informed.
+
+void FitSuiteWidget::updateIterationCount(const FitProgressInfo &info)
+{
+    FitSuiteItem *fitSuiteItem = m_currentItem->fitSuiteItem();
+    fitSuiteItem->setItemValue(FitSuiteItem::P_ITERATION_COUNT, info.iterationCount());
+    fitSuiteItem->setItemValue(FitSuiteItem::P_CHI2, info.chi2());
+}
+
+void FitSuiteWidget::updateTuningWidgetParameterValues(const FitProgressInfo &info)
+{
+    QVector<double> values = info.parValues();
+    FitParameterContainerItem *fitParContainer = m_currentItem->fitParameterContainerItem();
+    fitParContainer->setValuesInParameterContainer(values, m_currentItem->parameterContainerItem());
+}
+
+// FIXME provide normal print on log update
+
+void FitSuiteWidget::updateLog(const FitProgressInfo &info)
+{
+    QString message = QString("NCalls:%1 chi2:%2 \n").arg(info.iterationCount()).arg(info.chi2());
+    FitParameterContainerItem *fitParContainer = m_currentItem->fitParameterContainerItem();
+    int index(0);
+    QVector<double> values = info.parValues();
+    foreach(SessionItem *item,
+            fitParContainer->getItems(FitParameterContainerItem::T_FIT_PARAMETERS)) {
+        QString parinfo = QString("      %1 %2\n").arg(item->displayName()).arg(values[index++]);
+        message.append(parinfo);
+    }
+
+//    message.append("\n");
+    emit fittingLog(message);
+}
+
diff --git a/GUI/coregui/Views/FitWidgets/FitSuiteWidget.h b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.h
new file mode 100644
index 0000000..8178614
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FitSuiteWidget.h
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FitSuiteWidget.h
+//! @brief     Defines class FitSuiteWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITSUITEWIDGET_H
+#define FITSUITEWIDGET_H
+
+#include "FitProgressInfo.h"
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class QTabWidget;
+class JobModel;
+class JobItem;
+class SessionItem;
+class FitParameterWidget;
+class MinimizerSettingsWidget;
+class FitResultsWidget;
+class ParameterTuningWidget;
+class RunFitManager;
+class GUIFitObserver;
+template <class T> class OutputData;
+//class FitProgressInfo;
+
+
+//! The FitSuiteWidget contains all fit settings for given JobItem (fit parameters,
+//! minimizer settings) and all logic to communicate with fit observers.
+//! Controlled by FitActivityPanel.
+
+class BA_CORE_API_ FitSuiteWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    FitSuiteWidget(QWidget *parent = 0);
+    ~FitSuiteWidget();
+
+    void setItem(JobItem *jobItem);
+    void setModelTuningWidget(ParameterTuningWidget *tuningWidget);
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+signals:
+    void fittingStarted(JobItem *jobItem);
+    void fittingFinished(JobItem *jobItem);
+    void fittingError(const QString &what);
+    void fittingLog(const QString &text);
+
+public slots:
+    void onError(const QString &text);
+    void onPlotsUpdate();
+    void onProgressInfoUpdate(const FitProgressInfo &info);
+
+    void startFitting();
+    void stopFitting();
+
+private slots:
+    void onFittingStarted();
+    void onFittingFinished();
+    void onFitSuitePropertyChange(const QString &name);
+    void processFittingError(const QString &text);
+
+private:
+    void connectSignals();
+    void updateIterationCount(const FitProgressInfo &info);
+    void updateTuningWidgetParameterValues(const FitProgressInfo &info);
+    void updateLog(const FitProgressInfo &info);
+
+    QTabWidget *m_tabWidget;
+    FitParameterWidget *m_fitParametersWidget;
+    MinimizerSettingsWidget *m_minimizerSettingsWidget;
+    FitResultsWidget *m_fitResultsWidget;
+    JobItem *m_currentItem;
+    RunFitManager *m_runFitManager;
+    std::shared_ptr<GUIFitObserver> m_observer;
+    bool m_block_progress_update;
+};
+
+#endif // FITSUITEWIDGET_H
diff --git a/GUI/coregui/Views/FitWidgets/FittingWorker.cpp b/GUI/coregui/Views/FitWidgets/FittingWorker.cpp
new file mode 100644
index 0000000..4ae4e20
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FittingWorker.cpp
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FittingWorker.cpp
+//! @brief     Implements class FittingWorker
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FittingWorker.h"
+#include "FitSuite.h"
+#include <QDateTime>
+#include <QDebug>
+
+void FittingWorker::startFit()
+{
+    int duration(0);
+    QDateTime beginTime = QDateTime::currentDateTime();
+
+    m_fitsuite->resetInterrupt();
+    emit started();
+    try {
+        m_fitsuite->runFit();
+        duration = durationSince(beginTime);
+
+    } catch(const std::exception& ex) {
+        duration = durationSince(beginTime);
+        emit error(QString::fromLatin1(ex.what()));
+    }
+    emit finished(duration);
+}
+
+void FittingWorker::interruptFitting()
+{
+    if (m_fitsuite)
+        m_fitsuite->interruptFitting();
+}
+
+int FittingWorker::durationSince(const QDateTime &since)
+{
+    QDateTime endTime = QDateTime::currentDateTime();
+    return int(since.msecsTo(endTime));
+}
+
diff --git a/GUI/coregui/Views/FitWidgets/FittingWorker.h b/GUI/coregui/Views/FitWidgets/FittingWorker.h
new file mode 100644
index 0000000..5260667
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/FittingWorker.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/FittingWorker.h
+//! @brief     Implements class FittingWorker
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITTINGWORKER_H
+#define FITTINGWORKER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+#include <memory>
+
+class FitSuite;
+
+class BA_CORE_API_ FittingWorker : public QObject
+{
+    Q_OBJECT
+
+public:
+
+    FittingWorker(std::shared_ptr<FitSuite> suite) {m_fitsuite = suite;}
+
+public slots:
+
+    void startFit();
+
+    void interruptFitting();
+
+signals:
+
+    void started();
+
+    void finished(int duration);
+
+    void error(const QString &message);
+
+private:
+    int durationSince(const class QDateTime &since);
+    std::shared_ptr<FitSuite> m_fitsuite;
+
+};
+
+#endif // FITTINGWORKER_H
diff --git a/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp b/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp
new file mode 100644
index 0000000..f3e5a30
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp
@@ -0,0 +1,129 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/GUIFitObserver.cpp
+//! @brief     Implements class GUIFitObserver
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUIFitObserver.h"
+#include "FitParameter.h"
+#include "FitProgressInfo.h"
+#include "FitSuite.h"
+#include "FitParameterSet.h"
+#include "GUIHelpers.h"
+#include "IntensityDataItem.h"
+#include <QDebug>
+#include <QVector>
+
+
+GUIFitObserver::GUIFitObserver(QObject *parent)
+    : QObject(parent)
+    , IFitObserver(1)
+    , m_block_update_plots(false)
+    , m_update_interval(1)
+{}
+
+GUIFitObserver::~GUIFitObserver()
+{
+
+}
+
+void GUIFitObserver::update(FitSuite *subject)
+{
+    // discard data after interruption
+    if (subject->isInterrupted())
+        return;
+
+//    if(canUpdateProgressInfo(subject)) {
+//        FitProgressInfo info;
+//        info.m_chi2 = subject->getChi2();
+//        info.m_iteration_count = (int)subject->getNumberOfIterations();
+//        info.m_values = GUIHelpers::fromStdVector(subject->getFitParameters()->getValues());
+//        qDebug() << "Emitting progressInfoUpdate" << info.m_iteration_count;
+//        emit progressInfoUpdate(info);
+//    }
+
+//    if(canUpdatePlots(subject)) {
+//        m_block_update_plots = true;
+//        m_simData.reset(subject->getSimulationOutputData()->clone());
+//        emit plotsUpdate();
+//    }
+
+    if(subject->numberOfIterations() % m_update_interval == 0) {
+        if(m_block_update_plots) {
+            qDebug() << "GUI is busy with plotting, skipping iteration "
+                     << subject->numberOfIterations();
+        }
+    }
+
+
+    if(canUpdatePlots(subject)) {
+        m_block_update_plots = true;
+
+        FitProgressInfo info;
+        info.m_chi2 = subject->getChi2();
+        info.m_iteration_count = (int)subject->numberOfIterations();
+        info.m_values = GUIHelpers::fromStdVector(subject->fitParameters()->values());
+        qDebug() << "Emitting progressInfoUpdate" << info.m_iteration_count;
+        emit progressInfoUpdate(info);
+
+        m_simData.reset(subject->getSimulationOutputData()->clone());
+        emit plotsUpdate();
+    }
+
+
+    if (subject->isLastIteration())
+        emit logInfoUpdate(QString::fromStdString(subject->reportResults()));
+
+}
+
+void GUIFitObserver::setInterval(int val)
+{
+    m_update_interval = val;
+}
+
+//! Returns true if it is time to update plots.
+
+bool GUIFitObserver::canUpdatePlots(FitSuite *fitSuite)
+{
+    if(m_block_update_plots) return false;
+    if(fitSuite->numberOfIterations() % m_update_interval == 0) return true;
+    if(fitSuite->isLastIteration()) return true;
+    return false;
+}
+
+//! Returns true if it is time to update progress. Follow same rules as for plots update,
+//! or in the case of last iteration
+bool GUIFitObserver::canUpdateProgressInfo(FitSuite *fitSuite)
+{
+    if(fitSuite->numberOfIterations() == 0) return true;
+    if(fitSuite->numberOfIterations() % m_update_interval == 0) return true;
+    if(fitSuite->isLastIteration()) return true;
+    return false;
+}
+
+//! Informs observer that FitSuiteWidget has finished plotting and is ready for next plot
+void GUIFitObserver::finishedPlotting()
+{
+    m_block_update_plots = false;
+}
+
+const OutputData<double> *GUIFitObserver::simulationData() const
+{
+    return m_simData.get();
+}
+
+//const OutputData<double> *GUIFitObserver::chiSquaredData() const
+//{
+//    return m_chiData.get();
+//}
+
diff --git a/GUI/coregui/Views/FitWidgets/GUIFitObserver.h b/GUI/coregui/Views/FitWidgets/GUIFitObserver.h
new file mode 100644
index 0000000..696080c
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/GUIFitObserver.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/GUIFitObserver.h
+//! @brief     Implements class GUIFitObserver
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GUIFITOBSERVER_H
+#define GUIFITOBSERVER_H
+
+#include "FitProgressInfo.h"
+#include "IFitObserver.h"
+#include <QObject>
+#include <atomic>
+
+template <class T> class OutputData;
+class FitSuite;
+class IntensityDataItem;
+class FitProgressInfo;
+
+//! The GUIFitObserver class is a intermediate between FitSuite and the GUI.
+//! It is called at the end of each iterations and sends (messages, data) to the rest of the GUI.
+
+class BA_CORE_API_ GUIFitObserver : public QObject, public IFitObserver
+{
+    Q_OBJECT
+
+public:
+
+    GUIFitObserver(QObject *parent = 0);
+    ~GUIFitObserver();
+
+    void update(FitSuite *subject);
+
+    void finishedPlotting();
+
+    const OutputData<double> *simulationData() const;
+    //const OutputData<double> *chiSquaredData() const;
+
+public slots:
+    void setInterval(int val);
+
+signals:
+    void plotsUpdate();
+    void logInfoUpdate(const QString &);
+    void progressInfoUpdate(const FitProgressInfo &info);
+//    void chiSquareUpdate(int niter, double chi2);
+
+private:
+    bool canUpdatePlots(FitSuite *fitSuite);
+    bool canUpdateProgressInfo(FitSuite *fitSuite);
+
+    std::atomic<bool> m_block_update_plots;
+    int m_update_interval;
+    std::unique_ptr<OutputData<double> > m_simData;
+    //std::unique_ptr<OutputData<double> > m_chiData;
+};
+
+#endif // GUIFITOBSERVER_H
diff --git a/GUI/coregui/Views/FitWidgets/HistogramPlot.cpp b/GUI/coregui/Views/FitWidgets/HistogramPlot.cpp
new file mode 100644
index 0000000..d622531
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/HistogramPlot.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/HistogramPlot.cpp
+//! @brief     Implements class HistogramPlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "HistogramPlot.h"
+#include "plot_constants.h"
+
+HistogramPlot::HistogramPlot(QWidget *parent)
+    : QWidget(parent)
+    , m_customPlot(new QCustomPlot)
+
+{
+    QVBoxLayout *vlayout = new QVBoxLayout(this);
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+    vlayout->addWidget(m_customPlot);
+    setLayout(vlayout);
+
+    m_customPlot->addGraph();
+
+    QPen pen;
+    pen.setColor(QColor(0, 0, 255, 200));
+    m_customPlot->graph()->setLineStyle(QCPGraph::lsLine);
+    m_customPlot->graph()->setPen(pen);
+    m_customPlot->graph()->setBrush(QBrush(QColor(255/4.0,160,50,150)));
+
+
+    m_customPlot->xAxis->setTickLabelFont(QFont(QFont().family(), Constants::plot_tick_label_size));
+    m_customPlot->yAxis->setTickLabelFont(QFont(QFont().family(), Constants::plot_tick_label_size));
+
+    m_customPlot->yAxis->setScaleType(QCPAxis::stLogarithmic);
+    m_customPlot->yAxis->setNumberFormat("eb");
+    m_customPlot->yAxis->setNumberPrecision(0);
+
+    m_customPlot->xAxis->setLabel("iteration");
+    m_customPlot->yAxis->setLabel("chi2");
+
+    m_customPlot->xAxis->setLabelFont(QFont(QFont().family(), Constants::plot_axes_label_size));
+    m_customPlot->yAxis->setLabelFont(QFont(QFont().family(), Constants::plot_axes_label_size));
+
+}
+
+void HistogramPlot::addData(double x, double y)
+{
+    m_customPlot->graph()->addData(x, y);
+    m_customPlot->graph(0)->rescaleAxes();
+    m_customPlot->replot();
+}
+
+void HistogramPlot::addData(const QVector<double> &x, const QVector<double> y)
+{
+    m_customPlot->graph()->addData(x, y);
+    m_customPlot->graph(0)->rescaleAxes();
+    m_customPlot->replot();
+}
+
+void HistogramPlot::setData(const QVector<double> &x, const QVector<double> y)
+{
+    m_customPlot->graph()->setData(x, y);
+    m_customPlot->graph(0)->rescaleAxes();
+    m_customPlot->replot();
+}
+
+void HistogramPlot::clearData()
+{
+    m_customPlot->graph()->clearData();
+}
+
+//bool HistogramPlot::addData(double x, double y)
+//{
+
+//}
diff --git a/GUI/coregui/Views/FitWidgets/HistogramPlot.h b/GUI/coregui/Views/FitWidgets/HistogramPlot.h
new file mode 100644
index 0000000..8ee932a
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/HistogramPlot.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/HistogramPlot.h
+//! @brief     Defines class HistogramPlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HISTOGRAMPLOT_H
+#define HISTOGRAMPLOT_H
+
+#include "WinDllMacros.h"
+#include "qcustomplot.h"
+#include <QWidget>
+
+class BA_CORE_API_ HistogramPlot : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit HistogramPlot(QWidget *parent = 0);
+
+public slots:
+//    bool addData(double x, double y);
+
+    void addData(double x, double y);
+    void addData(const QVector<double> &x, const QVector<double> y);
+    void setData(const QVector<double> &x, const QVector<double> y);
+
+    void clearData();
+
+private:
+
+    QCustomPlot *m_customPlot;
+
+};
+
+#endif // HISTOGRAMPLOT_H
+
diff --git a/GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.cpp b/GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.cpp
new file mode 100644
index 0000000..12dc5f0
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.cpp
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.cpp
+//! @brief     Implements class MinimizerSettingsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerSettingsWidget.h"
+#include "ComponentEditor.h"
+#include "FitSuiteItem.h"
+#include "JobItem.h"
+#include "MinimizerItem.h"
+#include <QDebug>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+MinimizerSettingsWidget::MinimizerSettingsWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_currentItem(0)
+    , m_propertyEditor(new ComponentEditor)
+{
+    setWindowTitle(QLatin1String("Minimizer Settings"));
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->addWidget(m_propertyEditor);
+
+    setLayout(layout);
+}
+
+QSize MinimizerSettingsWidget::minimumSizeHint() const
+{
+    return QSize(25, 25);
+}
+
+void MinimizerSettingsWidget::setItem(JobItem *jobItem)
+{
+    Q_ASSERT(jobItem);
+    setItem(jobItem->fitSuiteItem()->minimizerContainerItem());
+}
+
+void MinimizerSettingsWidget::setItem(MinimizerContainerItem *minimizerItem)
+{
+    Q_ASSERT(minimizerItem);
+    m_currentItem = minimizerItem;
+    m_propertyEditor->setItem(minimizerItem);
+}
diff --git a/GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.h b/GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.h
new file mode 100644
index 0000000..5dd939a
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/MinimizerSettingsWidget.h
+//! @brief     Defines class MinimizerSettingsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERSETTINGSWIDGET_H
+#define MINIMIZERSETTINGSWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class ComponentEditor;
+class JobItem;
+class MinimizerContainerItem;
+
+//! The MinimizerSettingsWidget contains editor for all minnimizer settings and related fit
+//! options. Part of FitSuiteWidget.
+
+class BA_CORE_API_ MinimizerSettingsWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    MinimizerSettingsWidget(QWidget *parent = 0);
+
+    QSize minimumSizeHint() const;
+
+public slots:
+    void setItem(JobItem *jobItem);
+    void setItem(MinimizerContainerItem *minimizerItem);
+
+private:
+    MinimizerContainerItem *m_currentItem;
+    ComponentEditor *m_propertyEditor;
+};
+
+#endif // MINIMIZERSETTINGSWIDGET_H
diff --git a/GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp
new file mode 100644
index 0000000..f3f2716
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp
@@ -0,0 +1,249 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp
+//! @brief     Implements class RunFitControlWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RunFitControlWidget.h"
+#include "DesignerHelper.h"
+#include "FitSuiteItem.h"
+#include "JobItem.h"
+#include "JobMessagePanel.h"
+#include "WarningSignWidget.h"
+#include "mainwindow_constants.h"
+#include <QDebug>
+#include <QFont>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPushButton>
+#include <QSlider>
+
+namespace {
+const int warning_sign_xpos = 42;
+const int warning_sign_ypos = 42;
+const int default_update_interval = 10;
+const std::vector<int> slider_to_interval = {1,2,3,4,5,10,15,20,25,30,50,100,200,500,1000};
+const QString slider_tooltip = "Updates fit progress every Nth iteration";
+}
+
+RunFitControlWidget::RunFitControlWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_startButton(new QPushButton)
+    , m_stopButton(new QPushButton)
+    , m_intervalSlider(new QSlider)
+    , m_updateIntervalLabel(new QLabel("25"))
+    , m_iterationsCountLabel(new QLabel)
+    , m_currentItem(0)
+    , m_warningSign(0)
+    , m_jobMessagePanel(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+    setFixedHeight(Constants::RUN_FIT_CONTROL_WIDGET_HEIGHT);
+
+    QHBoxLayout *layout = new QHBoxLayout;
+    layout->setSpacing(0);
+
+    m_startButton->setText("Run");
+    m_startButton->setToolTip("Run fitting");
+    m_startButton->setMaximumWidth(80);
+//    m_startButton->setMinimumHeight(50);
+
+    m_stopButton->setText("Stop");
+    m_stopButton->setToolTip("Interrupt fitting");
+    m_stopButton->setMaximumWidth(80);
+//    m_stopButton->setEnabled(false);
+
+    m_intervalSlider->setToolTip(slider_tooltip);
+    m_intervalSlider->setOrientation(Qt::Horizontal);
+    m_intervalSlider->setRange(0, slider_to_interval.size()-1);
+    m_intervalSlider->setMaximumWidth(120);
+    m_intervalSlider->setMinimumWidth(120);
+    m_intervalSlider->setFocusPolicy(Qt::NoFocus);
+    m_intervalSlider->setValue(5);
+
+    QFont font("Monospace", DesignerHelper::getLabelFontSize(), QFont::Normal);
+    font.setPointSize(DesignerHelper::getPortFontSize());
+    m_updateIntervalLabel->setToolTip(slider_tooltip);
+    m_updateIntervalLabel->setFont(font);
+    m_updateIntervalLabel->setText(QString::number(sliderUpdateInterval()));
+
+    layout->addWidget(m_startButton);
+    layout->addSpacing(5);
+    layout->addWidget(m_stopButton);
+    layout->addSpacing(5);
+    layout->addWidget(m_intervalSlider);
+    layout->addSpacing(2);
+    layout->addWidget(m_updateIntervalLabel);
+    layout->addSpacing(5);
+    layout->addStretch();
+    layout->addWidget(m_iterationsCountLabel);
+    setLayout(layout);
+
+    connect(m_startButton, SIGNAL(clicked(bool)), this, SIGNAL(startFittingPushed()));
+    connect(m_stopButton, SIGNAL(clicked(bool)), this, SIGNAL(stopFittingPushed()));
+    connect(m_intervalSlider, SIGNAL(valueChanged(int)), this, SLOT(onSliderValueChanged(int)));
+
+    setEnabled(false);
+}
+
+void RunFitControlWidget::setJobMessagePanel(JobMessagePanel *jobMessagePanel)
+{
+    m_jobMessagePanel = jobMessagePanel;
+}
+
+void RunFitControlWidget::onFittingStarted(JobItem *jobItem)
+{
+    m_currentItem = jobItem;
+    clearWarningSign();
+    m_startButton->setEnabled(false);
+    m_stopButton->setEnabled(true);
+
+    Q_ASSERT(fitSuiteItem());
+
+    fitSuiteItem()->setItemValue(FitSuiteItem::P_UPDATE_INTERVAL, sliderUpdateInterval());
+
+    fitSuiteItem()->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+    {
+        onFitSuitePropertyChange(name);
+    }, this);
+
+    onFitSuitePropertyChange(FitSuiteItem::P_ITERATION_COUNT);
+
+    Q_ASSERT(m_jobMessagePanel);
+    m_jobMessagePanel->onClearLog();
+}
+
+void RunFitControlWidget::onFittingFinished(JobItem *jobItem)
+{
+    Q_ASSERT(jobItem = m_currentItem);
+
+    if(jobItem->isCompleted())
+        m_jobMessagePanel->onMessage(QStringLiteral("Done"), QColor(Qt::darkBlue));
+
+    m_startButton->setEnabled(true);
+    m_stopButton->setEnabled(false);
+    fitSuiteItem()->mapper()->unsubscribe(this);
+    m_currentItem = 0;
+}
+
+void RunFitControlWidget::onFittingError(const QString &what)
+{
+    clearWarningSign();
+    m_iterationsCountLabel->setText("");
+
+    QString message;
+    message.append("Current settings cause fitting failure.\n\n");
+    message.append(what);
+
+    m_warningSign = new WarningSignWidget(this);
+    m_warningSign->setWarningMessage(message);
+    QPoint pos = getPositionForWarningSign();
+    m_warningSign->setPosition(pos.x(), pos.y());
+    m_warningSign->show();
+
+    m_jobMessagePanel->onMessage(message, QColor(Qt::darkRed));
+}
+
+void RunFitControlWidget::onFittingLog(const QString &text)
+{
+    Q_ASSERT(m_jobMessagePanel);
+    m_jobMessagePanel->onMessage(text);
+}
+
+void RunFitControlWidget::setItem(JobItem *item)
+{
+    Q_UNUSED(item);
+    // If item is not suitable for fitting, disable widget
+    if(!isValidJobItem(item)) {
+        setEnabled(false);
+        return;
+    }
+
+    // if item is ready for fitting, or already has fitting running, enable widget
+    if(m_currentItem == 0 || m_currentItem == item) {
+        setEnabled(true);
+        return;
+    }
+
+    // it's not possible to run new fitting if old is running
+    setEnabled(false);
+}
+
+void RunFitControlWidget::onSliderValueChanged(int value)
+{
+    qDebug() << "RunFitControlWidget::onSliderValueChanged(int value)";
+    int interval = sliderValueToUpdateInterval(value);
+    m_updateIntervalLabel->setText(QString::number(interval));
+    if(fitSuiteItem())
+        fitSuiteItem()->setItemValue(FitSuiteItem::P_UPDATE_INTERVAL, interval);
+}
+
+void RunFitControlWidget::onFitSuitePropertyChange(const QString &name)
+{
+    if(name == FitSuiteItem::P_ITERATION_COUNT) {
+        int niter = fitSuiteItem()->getItemValue(FitSuiteItem::P_ITERATION_COUNT).toInt();
+        m_iterationsCountLabel->setText(QString::number(niter));
+    }
+}
+
+void RunFitControlWidget::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED(event);
+    if(m_warningSign) {
+        QPoint pos = getPositionForWarningSign();
+        m_warningSign->setPosition(pos.x(),pos.y());
+    }
+    QWidget::resizeEvent(event);
+}
+
+QPoint RunFitControlWidget::getPositionForWarningSign()
+{
+    int x = width()-warning_sign_xpos;
+    int y = height()-warning_sign_ypos;
+    return QPoint(x, y);
+}
+
+void RunFitControlWidget::clearWarningSign()
+{
+    delete m_warningSign;
+    m_warningSign = 0;
+}
+
+int RunFitControlWidget::sliderUpdateInterval()
+{
+    return sliderValueToUpdateInterval(m_intervalSlider->value());
+}
+
+//! converts slider value (1-15) to update interval to be propagated to FitSuiteWidget
+int RunFitControlWidget::sliderValueToUpdateInterval(int value)
+{
+    if(value < (int)slider_to_interval.size())
+        return slider_to_interval[value];
+
+    return default_update_interval;
+}
+
+FitSuiteItem *RunFitControlWidget::fitSuiteItem()
+{
+    if(m_currentItem)
+        return m_currentItem->fitSuiteItem();
+
+    return nullptr;
+}
+
+bool RunFitControlWidget::isValidJobItem(JobItem *jobItem)
+{
+    if(!jobItem) return false;
+    return jobItem->isValidForFitting();
+}
diff --git a/GUI/coregui/Views/FitWidgets/RunFitControlWidget.h b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.h
new file mode 100644
index 0000000..9fdbb27
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/RunFitControlWidget.h
@@ -0,0 +1,78 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/RunFitControlWidget.h
+//! @brief     Defines class RunFitControlWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RUNFITCONTROLWIDGET_H
+#define RUNFITCONTROLWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class JobItem;
+class QPushButton;
+class QSlider;
+class WarningSignWidget;
+class QLabel;
+class FitSuiteItem;
+class JobMessagePanel;
+
+//! The RunFitControlWidget contains elements to start/stop fitting and to provide minimal
+//! diagnostic. Part of FitActivityPanel.
+
+class BA_CORE_API_ RunFitControlWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    RunFitControlWidget(QWidget *parent = 0);
+
+    void setJobMessagePanel(JobMessagePanel *jobMessagePanel);
+
+signals:
+    void startFittingPushed();
+    void stopFittingPushed();
+
+public slots:
+    void onFittingStarted(JobItem *jobItem);
+    void onFittingFinished(JobItem *jobItem);
+    void onFittingError(const QString &what);
+    void onFittingLog(const QString &text);
+    void setItem(JobItem *item);
+
+private slots:
+    void onSliderValueChanged(int value);
+    void onFitSuitePropertyChange(const QString &name);
+
+protected:
+    void resizeEvent(QResizeEvent *event);
+
+private:
+    QPoint getPositionForWarningSign();
+    void clearWarningSign();
+    int sliderUpdateInterval();
+    int sliderValueToUpdateInterval(int value);
+    FitSuiteItem *fitSuiteItem();
+    bool isValidJobItem(JobItem *jobItem);
+
+    QPushButton *m_startButton;
+    QPushButton *m_stopButton;
+    QSlider *m_intervalSlider;
+    QLabel *m_updateIntervalLabel;
+    QLabel *m_iterationsCountLabel;
+    JobItem *m_currentItem;
+    WarningSignWidget *m_warningSign;
+    JobMessagePanel *m_jobMessagePanel;
+};
+
+#endif // RUNFITCONTROLWIDGET_H
diff --git a/GUI/coregui/Views/FitWidgets/RunFitManager.cpp b/GUI/coregui/Views/FitWidgets/RunFitManager.cpp
new file mode 100644
index 0000000..4ad26f8
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/RunFitManager.cpp
@@ -0,0 +1,96 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/RunFitManager.cpp
+//! @brief     Implements class RunFitManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RunFitManager.h"
+#include "FitSuite.h"
+#include "FittingWorker.h"
+#include <QDebug>
+#include <QThread>
+#include <memory>
+
+RunFitManager::RunFitManager(QObject *parent)
+    : QObject(parent)
+    , m_fitSuite(nullptr)
+    , m_is_fit_running{false}
+    , m_duration(0)
+{
+}
+
+void RunFitManager::setFitSuite(std::shared_ptr<FitSuite> suite)
+{
+    m_fitSuite = suite;
+}
+
+// start fitting in separate thread
+void RunFitManager::runFitting()
+{
+    if (!m_fitSuite || m_is_fit_running)
+        return;
+
+    QThread *thread = new QThread();
+    FittingWorker *fw = new FittingWorker(m_fitSuite);
+    fw->moveToThread(thread);
+
+    // start fitting when thread starts
+    connect(thread, SIGNAL(started()), fw, SLOT(startFit()));
+    connect(fw, SIGNAL(started()), this, SLOT(intern_workerStarted()));
+
+    connect(this, SIGNAL(intern_interruptFittingWorker()), fw, SLOT(interruptFitting()),
+            Qt::DirectConnection);
+
+    connect(fw, SIGNAL(error(QString)), this, SLOT(intern_error(QString)));
+
+    connect(fw, SIGNAL(finished(int)), this, SLOT(intern_workerFinished(int)));
+
+    // delete fitting worker and thread when done
+    connect(fw, SIGNAL(finished(int)), fw, SLOT(deleteLater()));
+    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
+
+    m_is_fit_running = true;
+    thread->start();
+}
+
+//! Returns duration of fit in msec.
+
+int RunFitManager::getDuration()
+{
+    return m_duration;
+}
+
+void RunFitManager::interruptFitting()
+{
+    if (m_is_fit_running) {
+        emit intern_interruptFittingWorker();
+    }
+}
+
+void RunFitManager::intern_workerFinished(int duration)
+{
+    m_is_fit_running = false;
+    m_duration = duration;
+    m_fitSuite.reset();
+    emit finishedFitting();
+}
+
+void RunFitManager::intern_workerStarted()
+{
+    emit startedFitting();
+}
+
+void RunFitManager::intern_error(const QString &mesg)
+{
+    emit fittingError(mesg);
+}
diff --git a/GUI/coregui/Views/FitWidgets/RunFitManager.h b/GUI/coregui/Views/FitWidgets/RunFitManager.h
new file mode 100644
index 0000000..066498c
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/RunFitManager.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/RunFitManager.h
+//! @brief     Implements class RunFitManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RUNFITMANAGER_H
+#define RUNFITMANAGER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+#include <atomic>
+#include <memory>
+
+class FitSuite;
+
+class BA_CORE_API_ RunFitManager : public QObject
+{
+    Q_OBJECT
+
+public:
+    RunFitManager(QObject *parent);
+
+    void setFitSuite(std::shared_ptr<FitSuite> suite);
+
+    void runFitting();
+
+    int getDuration();
+
+public slots:
+    void interruptFitting();
+
+signals:
+    void finishedFitting();
+    void startedFitting();
+    void fittingError(const QString &message);
+
+// only used by manager for communication with FittingWorker
+private slots:
+    void intern_workerFinished(int duration);
+
+    void intern_workerStarted();
+
+    void intern_error(const QString &mesg);
+
+signals:
+    void intern_interruptFittingWorker();
+
+private:
+    std::shared_ptr<FitSuite> m_fitSuite;
+    std::atomic<bool> m_is_fit_running;
+    int m_duration;
+};
+
+#endif // RUNFITMANAGER_H
diff --git a/GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp b/GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp
new file mode 100644
index 0000000..0706151
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/TestFitWidgets.cpp
+//! @brief     Implements class TestFitWidgets
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "TestFitWidgets.h"
+#include "FitParameterItems.h"
+#include "FitParameterWidget.h"
+#include "FitSuiteItem.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "ParameterTuningWidget.h"
+#include "item_constants.h"
+#include "mainwindow.h"
+#include <QHBoxLayout>
+#include <QTreeView>
+#include <QVBoxLayout>
+
+TestFitWidgets::TestFitWidgets(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_mainWindow(mainWindow)
+    , m_tuningWidget(new ParameterTuningWidget)
+    , m_fitParametersWidget(new FitParameterWidget(this))
+    , m_jobTreeView(new QTreeView)
+    , m_jobItem(0)
+{
+    QHBoxLayout *hlayout = new QHBoxLayout;
+    hlayout->addWidget(m_tuningWidget);
+
+    QVBoxLayout *vlayout = new QVBoxLayout;
+    vlayout->addWidget(m_fitParametersWidget);
+    vlayout->addWidget(m_jobTreeView);
+
+    hlayout->addLayout(vlayout);
+    setLayout(hlayout);
+}
+
+void TestFitWidgets::showEvent(QShowEvent *)
+{
+    JobItem *jobItem = dynamic_cast<JobItem *>(m_mainWindow->jobModel()->topItem(Constants::JobItemType));
+    if(jobItem) {
+        m_jobItem = jobItem;
+        m_tuningWidget->setItem(jobItem);
+        m_fitParametersWidget->setItem(jobItem);
+        m_fitParametersWidget->setParameterTuningWidget(m_tuningWidget);
+        m_jobTreeView->setModel(m_mainWindow->jobModel());
+        m_jobTreeView->setRootIndex(jobItem->fitSuiteItem()->index());
+    }
+
+}
diff --git a/GUI/coregui/Views/FitWidgets/TestFitWidgets.h b/GUI/coregui/Views/FitWidgets/TestFitWidgets.h
new file mode 100644
index 0000000..3ee18ec
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/TestFitWidgets.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/TestFitWidgets.h
+//! @brief     Defines class TestFitWidgets
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TESTFITWIDGETS_H
+#define TESTFITWIDGETS_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class MainWindow;
+class ParameterTuningWidget;
+class FitParameterWidget;
+class JobItem;
+class QTreeView;
+
+//! TestFitWidgets is a temporary widget (created by mainwindow)
+//! for testing fitting related widgets.
+
+class BA_CORE_API_ TestFitWidgets : public QWidget
+{
+    Q_OBJECT
+public:
+    TestFitWidgets(MainWindow *mainWindow);
+
+    void showEvent(QShowEvent *);
+
+private:
+    MainWindow *m_mainWindow;
+    ParameterTuningWidget *m_tuningWidget;
+    FitParameterWidget *m_fitParametersWidget;
+    QTreeView *m_jobTreeView;
+    JobItem *m_jobItem;
+};
+
+#endif // TESTFITWIDGETS_H
diff --git a/GUI/coregui/Views/FitWidgets/plot_constants.h b/GUI/coregui/Views/FitWidgets/plot_constants.h
new file mode 100644
index 0000000..afe4673
--- /dev/null
+++ b/GUI/coregui/Views/FitWidgets/plot_constants.h
@@ -0,0 +1,29 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/FitWidgets/plot_constants.h
+//! @brief     Defines various constants for plotting
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PLOT_CONSTANTS_H
+#define PLOT_CONSTANTS_H
+
+namespace Constants
+{
+
+const int plot_tick_label_size = 10;
+const int plot_axes_label_size = 10;
+const int plot_colorbar_size=12;
+
+}
+
+#endif // PLOT_CONSTANTS_H
diff --git a/GUI/coregui/Views/ImportDataView.cpp b/GUI/coregui/Views/ImportDataView.cpp
new file mode 100644
index 0000000..2519b6f
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataView.cpp
@@ -0,0 +1,87 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataView.cpp
+//! @brief     Implements class ImportDataView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ImportDataView.h"
+#include "ImportDataToolBar.h"
+#include "ItemSelectorWidget.h"
+#include "RealDataModel.h"
+#include "RealDataSelectorWidget.h"
+#include "mainwindow.h"
+#include "mainwindow_constants.h"
+#include "minisplitter.h"
+#include <QVBoxLayout>
+
+ImportDataView::ImportDataView(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_toolBar(new ImportDataToolBar)
+    , m_splitter(new Manhattan::MiniSplitter)
+    , m_selectorWidget(new RealDataSelectorWidget)
+//    , m_stackedWidget(new ItemStackPresenter<RealDataEditorWidget>)
+    , m_stackedWidget(new ItemStackPresenter<RealDataMaskWidget>)
+    , m_realDataModel(mainWindow->realDataModel())
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    mainLayout->setContentsMargins(0,0,0,0);
+
+    m_stackedWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    m_selectorWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+    m_stackedWidget->setSizeHint(QSize(1024, 1024));
+
+    m_splitter->addWidget(m_selectorWidget);
+    m_splitter->addWidget(m_stackedWidget);
+    m_splitter->setCollapsible(0, false);
+    m_splitter->setCollapsible(1, false);
+
+    m_splitter->setSizes(QList<int>() << Constants::ITEM_SELECTOR_WIDGET_WIDTH
+                         << Constants::ITEM_SELECTOR_WIDGET_WIDTH*7);
+
+    mainLayout->addWidget(m_toolBar);
+    mainLayout->addWidget(m_splitter);
+
+    setLayout(mainLayout);
+
+    setupConnections();
+
+    m_selectorWidget->setModels(mainWindow->instrumentModel(), mainWindow->realDataModel());
+    m_stackedWidget->setModel(mainWindow->realDataModel());
+    m_toolBar->setRealDataModel(mainWindow->realDataModel());
+    m_toolBar->setInstrumentModel(mainWindow->instrumentModel());
+    m_toolBar->setSelectionModel(m_selectorWidget->selectionModel());
+}
+
+void ImportDataView::onSelectionChanged(SessionItem *item)
+{
+    if(!item) return;
+
+    bool isNew(false);
+    m_stackedWidget->setItem(item, isNew);
+    if(isNew) {
+//        RealDataEditorWidget *widget = m_stackedWidget->currentWidget();
+        RealDataMaskWidget *widget = m_stackedWidget->currentWidget();
+        Q_ASSERT(widget);
+        widget->setItem(item);
+    }
+    m_toolBar->setActionList(m_stackedWidget->currentWidget()->actionList());
+
+}
+
+void ImportDataView::setupConnections()
+{
+    connect(m_selectorWidget, SIGNAL(selectionChanged(SessionItem *)),
+        this, SLOT(onSelectionChanged(SessionItem *)));
+}
diff --git a/GUI/coregui/Views/ImportDataView.h b/GUI/coregui/Views/ImportDataView.h
new file mode 100644
index 0000000..fdb0aee
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataView.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataView.h
+//! @brief     Defines class ImportDataView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMPORTDATAVIEW_H
+#define IMPORTDATAVIEW_H
+
+#include "ItemStackPresenter.h"
+#include "RealDataEditorWidget.h"
+#include "RealDataMaskWidget.h"
+
+class ImportDataToolBar;
+class RealDataModel;
+class RealDataSelectorWidget;
+namespace Manhattan { class MiniSplitter; }
+
+//! The ImportDataView class is a main view for importing experimental data.
+
+class BA_CORE_API_ ImportDataView : public QWidget
+{
+    Q_OBJECT
+
+public:
+    ImportDataView(class MainWindow *mainWindow);
+
+public slots:
+    void onSelectionChanged(SessionItem *item);
+
+private:
+    void setupConnections();
+
+    ImportDataToolBar *m_toolBar;
+    Manhattan::MiniSplitter *m_splitter;
+    RealDataSelectorWidget *m_selectorWidget;
+    ItemStackPresenter<RealDataMaskWidget> *m_stackedWidget;
+//    ItemStackPresenter<RealDataEditorWidget> *m_stackedWidget;
+    RealDataModel *m_realDataModel;
+};
+
+#endif // IMPORTDATAVIEW_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp b/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp
new file mode 100644
index 0000000..d8f93ef
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp
@@ -0,0 +1,217 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.cpp
+//! @brief     Implements class ImportDataAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ImportDataAssistant.h"
+#include "AppSvc.h"
+#include "GUIHelpers.h"
+#include "IntensityDataIOFactory.h"
+#include "IntensityDataItem.h"
+#include "RealDataItem.h"
+#include "projectmanager.h"
+#include "BornAgainNamespace.h"
+#include "InstrumentItem.h"
+#include "AxesItems.h"
+#include "DetectorItems.h"
+#include <QDebug>
+#include <QFileDialog>
+#include <QFileInfo>
+#include <QMessageBox>
+
+namespace {
+//const QString filter_string = "Intensity File (*.int *.int.gz *.tif *.tif.gz *.txt *.txt.gz);;"
+//        "Other (*)";
+
+const QString filter_string = "Intensity File (*.int *.gz *.tif *.txt);;"
+        "Other (*)";
+
+}
+
+OutputData<double> *ImportDataAssistant::importData(QString &baseNameOfLoadedFile)
+{
+    QString dirname = AppSvc::projectManager()->userImportDir();
+    QString fileName = QFileDialog::getOpenFileName(
+        0, QStringLiteral("Open Intensity File"), dirname, filter_string);
+
+    if(fileName.isEmpty())
+        return nullptr;
+
+    QFileInfo info(fileName);
+    baseNameOfLoadedFile = info.baseName();
+
+    QString newImportDir = GUIHelpers::fileDir(fileName);
+    if(newImportDir != dirname)
+        AppSvc::projectManager()->setImportDir(newImportDir);
+
+    OutputData<double> *result(nullptr);
+
+    try {
+        std::unique_ptr<OutputData<double>> data(
+                    IntensityDataIOFactory::readOutputData(fileName.toStdString()));
+        result = createSimlifiedOutputData(*data.get());
+    } catch (std::exception &ex) {
+        QString message = QString("Error while trying to read file\n\n'%1'\n\n%2")
+                              .arg(fileName)
+                              .arg(QString::fromStdString(std::string(ex.what())));
+        QMessageBox::warning(0, "IO Problem", message);
+    }
+
+    return result;
+}
+
+//! Loads corresponding intensityDataItem from projectDir.
+
+void ImportDataAssistant::loadIntensityData(RealDataItem *realDataItem, const QString &projectDir)
+{
+    if(IntensityDataItem *intensityItem = realDataItem->intensityDataItem()) {
+        QString filename = intensityItem->fileName(projectDir);
+        auto data = IntensityDataIOFactory::readOutputData(filename.toStdString());
+        intensityItem->setOutputData(data);
+    }
+}
+
+//! Saves corresponding intensityDataItem to projectDir.
+
+void ImportDataAssistant::saveIntensityData(RealDataItem *realDataItem, const QString &projectDir)
+{
+    if(IntensityDataItem *intensityItem = realDataItem->intensityDataItem()) {
+        QString filename = intensityItem->fileName(projectDir);
+        IntensityDataIOFactory::writeOutputData(
+                    *intensityItem->getOutputData(), filename.toStdString());
+    }
+}
+
+//! Creates OutputData with simplified axes [0,nxbin]x[0,nybin].
+
+OutputData<double> *ImportDataAssistant::createSimlifiedOutputData(const OutputData<double> &data)
+{
+    double xmin(0.0), ymin(0.0);
+
+    const IAxis &aX = data.getAxis(BornAgain::X_AXIS_INDEX);
+    const IAxis &aY = data.getAxis(BornAgain::Y_AXIS_INDEX);
+
+    double xmax = double(aX.size());
+    double ymax = double(aY.size());
+
+    OutputData<double> *result = new OutputData<double>;
+    result->addAxis(FixedBinAxis(aX.getName(), aX.size(), xmin, xmax));
+    result->addAxis(FixedBinAxis(aY.getName(), aY.size(), ymin, ymax));
+    result->setRawDataVector(data.getRawDataVector());
+
+    return result;
+}
+
+bool ImportDataAssistant::hasSameDimensions(const InstrumentItem *instrumentItem,
+                                            const RealDataItem *realDataItem)
+{
+    QString message;
+    return hasSameDimensions(instrumentItem, realDataItem, message);
+}
+
+//! Returns trues if [nxbin X nybin] of the detector is the same as in realData.
+
+bool ImportDataAssistant::hasSameDimensions(const InstrumentItem *instrumentItem,
+                              const RealDataItem *realDataItem, QString &message)
+{
+    bool isSame(true);
+    message.clear();
+
+    int nxData(0), nyData(0);
+    realDataShape(realDataItem, nxData, nyData);
+
+    int nxDetector(0), nyDetector(0);
+    detectorShape(instrumentItem, nxDetector, nyDetector);
+
+    if(nxData != nxDetector || nyData != nyDetector) {
+        isSame = false;
+        message = QString("detector [%1x%2], data [%3x%4]")
+                          .arg(nxDetector).arg(nyDetector).arg(nxData).arg(nyData);
+    }
+
+    return isSame;
+}
+
+//! Returns shape of RealDataItem axes.
+
+void ImportDataAssistant::realDataShape(const RealDataItem *realData, int &nx, int &ny)
+{
+    nx = ny = 0;
+    if(const IntensityDataItem *intensityItem = realData->intensityDataItem()) {
+        SessionItem *xaxis = intensityItem->getItem(IntensityDataItem::P_XAXIS);
+        nx = xaxis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+        SessionItem *yaxis = intensityItem->getItem(IntensityDataItem::P_YAXIS);
+        ny = yaxis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+    }
+}
+
+//! Returns shape of Instrument's detector axes.
+
+void ImportDataAssistant::detectorShape(const InstrumentItem *instrumentItem, int &nx, int &ny)
+{
+    nx = ny = 0;
+    DetectorItem *detectorItem = instrumentItem ->detectorItem();
+    Q_ASSERT(detectorItem);
+
+    // FIXME Refactor subDetector
+    auto subDetector = detectorItem->getGroupItem(DetectorItem::P_DETECTOR);
+    Q_ASSERT(subDetector);
+
+    std::unique_ptr<IDetector2D> detector;
+
+    if(auto sphericalDetector = dynamic_cast<SphericalDetectorItem *>(subDetector)) {
+        detector = sphericalDetector->createDetector();
+    }
+
+    else if(auto rectangularDetector = dynamic_cast<RectangularDetectorItem *>(subDetector)) {
+        detector = rectangularDetector->createDetector();
+    }
+
+    Q_ASSERT(detector.get());
+    nx = detector->getAxis(0).size();
+    ny = detector->getAxis(1).size();
+}
+
+void ImportDataAssistant::setInstrumentShapeToData(InstrumentItem *instrumentItem,
+                                                   const RealDataItem *realDataItemItem)
+{
+    int nxData(0), nyData(0);
+    realDataShape(realDataItemItem, nxData, nyData);
+
+    DetectorItem *detectorItem = instrumentItem ->detectorItem();
+    Q_ASSERT(detectorItem);
+
+    // FIXME Refactor subDetector
+    auto subDetector = detectorItem->getGroupItem(DetectorItem::P_DETECTOR);
+    Q_ASSERT(subDetector);
+
+    if (subDetector->modelType() == Constants::SphericalDetectorType) {
+      subDetector->getItem(SphericalDetectorItem::P_PHI_AXIS)
+          ->setItemValue(BasicAxisItem::P_NBINS, nxData);
+      subDetector->getItem(SphericalDetectorItem::P_ALPHA_AXIS)
+          ->setItemValue(BasicAxisItem::P_NBINS, nyData);
+    }
+
+    else if (subDetector->modelType() == Constants::RectangularDetectorType) {
+        subDetector->getItem(RectangularDetectorItem::P_X_AXIS)
+            ->setItemValue(BasicAxisItem::P_NBINS, nxData);
+        subDetector->getItem(RectangularDetectorItem::P_Y_AXIS)
+            ->setItemValue(BasicAxisItem::P_NBINS, nyData);
+    }
+
+    else {
+        throw GUIHelpers::Error("ImportDataAssistant::setInstrumentShapeToData() -> Error.");
+    }
+
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.h b/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.h
new file mode 100644
index 0000000..6d0ae64
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.h
@@ -0,0 +1,55 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/ImportDataAssistant.h
+//! @brief     Defines class ImportDataAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMPORTDATAASSISTANT_H
+#define IMPORTDATAASSISTANT_H
+
+#include "WinDllMacros.h"
+#include <QString>
+
+template <class T> class OutputData;
+class RealDataItem;
+class InstrumentItem;
+
+//! The ImportDataAssistant class provides utility methods to import data files.
+
+class BA_CORE_API_ ImportDataAssistant {
+public:
+
+    OutputData<double> *importData(QString &baseNameOfLoadedFile);
+
+    static void loadIntensityData(RealDataItem *realDataItem, const QString &projectDir);
+    static void saveIntensityData(RealDataItem *realDataItem, const QString &projectDir);
+
+    static OutputData<double> *createSimlifiedOutputData(const OutputData<double> &data);
+
+    static bool hasSameDimensions(const InstrumentItem *instrumentItem,
+                                  const RealDataItem *realDataItem);
+
+    static bool hasSameDimensions(const InstrumentItem *instrumentItem,
+                                  const RealDataItem *realDataItem,
+                                  QString &message);
+
+    static void realDataShape(const RealDataItem *realData, int &nx, int &ny);
+
+    static void detectorShape(const InstrumentItem *instrumentItem, int &nx, int &ny);
+
+    static void setInstrumentShapeToData(InstrumentItem *instrumentItem,
+                                         const RealDataItem *realDataItemItem);
+
+};
+
+#endif // IMPORTDATAASSISTANT_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.cpp b/GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.cpp
new file mode 100644
index 0000000..055a27e
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.cpp
@@ -0,0 +1,226 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.cpp
+//! @brief     Implements class ImportDataToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ImportDataToolBar.h"
+#include "ImportDataToolBar.h"
+#include "ComboProperty.h"
+#include "DetectorItems.h"
+#include "IDetector2D.h"
+#include "IDetector2D.h"
+#include "ImportDataAssistant.h"
+#include "InstrumentItem.h"
+#include "InstrumentModel.h"
+#include "IntensityDataItem.h"
+#include "JobItemHelper.h"
+#include "RealDataItem.h"
+#include "RealDataModel.h"
+#include "RectangularDetectorItem.h"
+#include "SessionItem.h"
+#include "SphericalDetectorItem.h"
+#include <QAction>
+#include <QDebug>
+#include <QItemSelectionModel>
+
+ImportDataToolBar::ImportDataToolBar(QWidget *parent)
+    : StyledToolBar(parent)
+    , m_importDataAction(0)
+//    , m_cloneDataAction(0)
+    , m_removeDataAction(0)
+    , m_realDataModel(0)
+    , m_instrumentModel(0)
+    , m_selectionModel(0)
+{
+    setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+
+    m_importDataAction = new QAction(QStringLiteral("Import"), parent);
+    m_importDataAction->setIcon(QIcon(":/images/toolbar16light_newitem.svg"));
+    m_importDataAction->setToolTip(QStringLiteral("Import data"));
+    connect(m_importDataAction, SIGNAL(triggered()), this,
+            SLOT(onImportDataAction()));
+    addAction(m_importDataAction);
+
+//    m_cloneDataAction = new QAction(QStringLiteral("Clone"), parent);
+//    m_cloneDataAction->setIcon(
+//        QIcon(":/images/toolbar16light_cloneitem.svg"));
+//    m_cloneDataAction->setToolTip(QStringLiteral("Clone selected data"));
+//    connect(m_cloneDataAction, SIGNAL(triggered()), this,
+//            SLOT(onCloneDataAction()));
+//    addAction(m_cloneDataAction);
+
+    m_removeDataAction = new QAction(QStringLiteral("Remove"), parent);
+    m_removeDataAction->setIcon(QIcon(":/images/toolbar16light_recycle.svg"));
+    m_removeDataAction->setToolTip(QStringLiteral("Remove selected data"));
+    connect(m_removeDataAction, SIGNAL(triggered()), this,
+            SLOT(onRemoveDataAction()));
+    addAction(m_removeDataAction);
+
+}
+
+void ImportDataToolBar::setRealDataModel(RealDataModel *model)
+{
+    m_realDataModel = model;
+}
+
+void ImportDataToolBar::setInstrumentModel(InstrumentModel *model)
+{
+    m_instrumentModel = model;
+}
+
+void ImportDataToolBar::setSelectionModel(QItemSelectionModel *selectionModel)
+{
+    m_selectionModel = selectionModel;
+}
+
+//! Sets action to toolbar, preserving own toolbar's actions.
+
+void ImportDataToolBar::setActionList(const QList<QAction *> &actionList)
+{
+    clear();
+
+    addAction(m_importDataAction);
+    addAction(m_removeDataAction);
+
+    addStyledSeparator();
+
+    foreach(QAction *action, actionList) {
+        addAction(action);
+    }
+
+}
+
+void ImportDataToolBar::onImportDataAction()
+{
+    qDebug() << "ImportDataToolBar::onImportDataAction()";
+    Q_ASSERT(m_realDataModel);
+    ImportDataAssistant assistant;
+    QString baseNameOfImportedFile;
+
+
+    std::unique_ptr<OutputData<double>> data(assistant.importData(baseNameOfImportedFile));
+    if(data) {
+        RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(
+            m_realDataModel->insertNewItem(Constants::RealDataType));
+        realDataItem->setItemName(baseNameOfImportedFile);
+        realDataItem->setOutputData(data.release());
+
+
+//        IntensityDataItem *intensityDataItem = dynamic_cast<IntensityDataItem *>(
+//            m_realDataModel->insertNewItem(Constants::IntensityDataType, realDataItem->index()));
+//        intensityDataItem->setOutputData(data.release());
+//        ComboProperty combo;
+//        combo << Constants::UnitsNbins;
+//        intensityDataItem->setItemValue(IntensityDataItem::P_AXES_UNITS, combo.getVariant());
+//        intensityDataItem->getItem(IntensityDataItem::P_AXES_UNITS)->setVisible(true);
+
+        m_selectionModel->clearSelection();
+        m_selectionModel->select(realDataItem->index(), QItemSelectionModel::Select);
+    }
+
+
+//    if(OutputData<double> *data = assistant.importData(baseNameOfImportedFile)) {
+//        RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(
+//                    m_realDataModel->insertNewItem(Constants::RealDataType));
+//        realDataItem->setItemName(baseNameOfImportedFile);
+//        IntensityDataItem *intensityDataItem = dynamic_cast<IntensityDataItem *>(
+//                    m_realDataModel->insertNewItem(Constants::IntensityDataType, realDataItem->index()));
+//        intensityDataItem->setOutputData(data);
+//        m_selectionModel->clearSelection();
+//        m_selectionModel->select(realDataItem->index(), QItemSelectionModel::Select);
+//        qDebug() << "baseNameOfImportedFile" << baseNameOfImportedFile;
+
+//        //matchAxesToInstrument(realDataItem);
+//    }
+
+}
+
+void ImportDataToolBar::onCloneDataAction()
+{
+    qDebug() << "ImportDataToolBar::onCloneDataAction()";
+
+}
+
+void ImportDataToolBar::onRemoveDataAction()
+{
+    qDebug() << "ImportDataToolBar::onRemoveDataAction()";
+    Q_ASSERT(m_realDataModel);
+    Q_ASSERT(m_selectionModel);
+
+    QModelIndex currentIndex = m_selectionModel->currentIndex();
+    qDebug() << "InstrumentView::onRemoveInstrument()" <<  currentIndex;
+    if(currentIndex.isValid())
+        m_realDataModel->removeRows(currentIndex.row(), 1, currentIndex.parent());
+
+//    QModelIndexList indexes = m_selectionModel->selectedIndexes();
+//    while (indexes.size()) {
+//        m_model->removeRows(indexes.back().row(), 1, indexes.back().parent());
+//        indexes = m_selectionModel->selectedIndexes();
+    //    }
+}
+
+
+//! FIXME refactor this after refactoring of DetectorItem
+
+//! When we import new real data, we perform scan of existing instruments, and if
+//! the  axes dimensions in the detectorItem is the same as in RealDataItem, we silently set axes
+//! of RealDataItem to match  the axes of existing detector.
+
+//! TODO this is a temporary hack, later it will be replaced with special widget to match
+//! axes of RealDataItem with existing instruments.
+//! Combine with JobItemHelper::updateDataAxes to avoid duplication.
+
+void ImportDataToolBar::matchAxesToInstrument(RealDataItem *realDataItem)
+{
+
+    std::unique_ptr<OutputData<double>> detectorMap;
+
+    foreach(SessionItem *item, m_instrumentModel->topItems()) {
+        InstrumentItem *instrumentItem = dynamic_cast<InstrumentItem *>(item);
+        detectorMap.reset(JobItemHelper::createDefaultDetectorMap(instrumentItem));
+
+        OutputData<double> *realData = realDataItem->intensityDataItem()->getOutputData();
+        if(realData->hasSameDimensions(*detectorMap.get())) {
+            detectorMap->setRawDataVector(realData->getRawDataVector());
+            IntensityDataItem *intensityItem = realDataItem->intensityDataItem();
+            intensityItem->setOutputData(detectorMap.release());
+            intensityItem->setAxesRangeToData();
+            ComboProperty combo;
+            combo << Constants::UnitsNbins;
+            intensityItem->setItemValue(IntensityDataItem::P_AXES_UNITS, combo.getVariant());
+            intensityItem->getItem(IntensityDataItem::P_AXES_UNITS)->setVisible(true);
+
+            break;
+        }
+
+
+
+//        DetectorItem *detectorItem = instrumentItem->getDetectorItem();
+
+//        auto subDetector = detectorItem->getGroupItem(DetectorItem::P_DETECTOR);
+//        Q_ASSERT(subDetector);
+
+//        if(auto sphericalDetector = dynamic_cast<SphericalDetectorItem *>(subDetector)) {
+//            auto detector = sphericalDetector->createDetector();
+//            detectorMap.reset(detector->createDetectorMap(IDetector2D::DEGREES));
+//        }
+
+//        else if(auto rectangularDetector = dynamic_cast<RectangularDetectorItem *>(subDetector)) {
+//            auto detector = rectangularDetector->createDetector();
+//            detectorMap.reset(detector->createDetectorMap(IDetector2D::DEGREES));
+//        }
+
+    }
+
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.h b/GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.h
new file mode 100644
index 0000000..6997548
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/ImportDataToolBar.h
+//! @brief     Defines class ImportDataToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMPORTDATATOOLBAR_H
+#define IMPORTDATATOOLBAR_H
+
+#include "StyledToolBar.h"
+
+class QAction;
+class RealDataModel;
+class InstrumentModel;
+class QItemSelectionModel;
+class RealDataItem;
+
+//! The ImportDataToolBar class represents a narrow toolbar on top of ImportDataView. Contains
+//! all action's logic to import, clone and remove data set.
+
+class BA_CORE_API_ ImportDataToolBar : public StyledToolBar
+{
+    Q_OBJECT
+public:
+    ImportDataToolBar(QWidget *parent = 0);
+
+    void setRealDataModel(RealDataModel *model);
+    void setInstrumentModel(InstrumentModel *model);
+    void setSelectionModel(QItemSelectionModel *selectionModel);
+
+    void setActionList(const QList<QAction *> &actionList);
+
+private slots:
+    void onImportDataAction();
+    void onCloneDataAction();
+    void onRemoveDataAction();
+
+private:
+    void matchAxesToInstrument(RealDataItem *realDataItem);
+
+    QAction *m_importDataAction;
+//    QAction *m_cloneDataAction;
+    QAction *m_removeDataAction;
+
+    RealDataModel *m_realDataModel;
+    InstrumentModel *m_instrumentModel;
+    QItemSelectionModel *m_selectionModel;
+};
+
+#endif // IMPORTDATATOOLBAR_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
new file mode 100644
index 0000000..c9fa2d2
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
@@ -0,0 +1,370 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp
+//! @brief     Implements class LinkInstrumentManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "LinkInstrumentManager.h"
+#include "InstrumentModel.h"
+#include "RealDataModel.h"
+#include "InstrumentItem.h"
+#include "RealDataItem.h"
+#include "ImportDataAssistant.h"
+#include "AxesItems.h"
+#include "DetectorItems.h"
+#include "MaskItems.h"
+#include <QMessageBox>
+#include <QPushButton>
+#include <QDebug>
+
+namespace {
+const QString undefinedInstrumentName = "Undefined";
+}
+
+LinkInstrumentManager::InstrumentInfo::InstrumentInfo()
+    : m_name(undefinedInstrumentName)
+    , m_instrument(0)
+{}
+
+
+LinkInstrumentManager::LinkInstrumentManager(QObject *parent)
+    : QObject(parent)
+    , m_instrumentModel(0)
+    , m_realDataModel(0)
+{
+}
+
+//! Sets models and builds initial links.
+
+void LinkInstrumentManager::setModels(InstrumentModel *instrumentModel,
+                                      RealDataModel *realDataModel)
+{
+    setInstrumentModel(instrumentModel);
+    setRealDataModel(realDataModel);
+    updateInstrumentMap();
+    updateRealDataMap();
+    updateLinks();
+}
+
+//! Returns InstrumentItem for given identifier.
+
+InstrumentItem *LinkInstrumentManager::getInstrument(const QString &identifier)
+{
+    for(int i=0; i<m_instrumentVec.size(); ++i)
+        if(m_instrumentVec[i].m_identifier == identifier)
+            return m_instrumentVec[i].m_instrument;
+
+    return nullptr;
+}
+
+//! Returns list of instrument names including artificial name "Undefined".
+
+QStringList LinkInstrumentManager::instrumentNames() const
+{
+    QStringList result;
+    for(int i=0; i<m_instrumentVec.size(); ++i)
+        result.append(m_instrumentVec[i].m_name);
+    return result;
+}
+
+//! Returns combo index for instrument selector from given identifier.
+
+int LinkInstrumentManager::instrumentComboIndex(const QString &identifier)
+{
+    for(int i=0; i<m_instrumentVec.size(); ++i)
+        if(m_instrumentVec[i].m_identifier == identifier)
+            return i;
+
+    return -1; // no such identifier exists
+}
+
+//! Returns instrument identifier from given index in combo instrument selector.
+
+QString LinkInstrumentManager::instrumentIdentifier(int comboIndex)
+{
+    Q_ASSERT(comboIndex >= 0 && comboIndex < m_instrumentVec.size());
+    return m_instrumentVec[comboIndex].m_identifier;
+}
+
+//! Returns true if RealDataItem can be linked to the instrument (same number of bins).
+//! Also offers dialog to adjust instrument to match shape of real data.
+
+bool LinkInstrumentManager::canLinkDataToInstrument(const RealDataItem *realDataItem,
+                                                    const QString &identifier)
+{
+    InstrumentItem *instrumentItem = getInstrument(identifier);
+
+    // linking to null instrument is possible, it means unlinking from currently linked
+    if(instrumentItem == nullptr)
+        return true;
+
+    // FIXME temporary hack to get rid from Instrument's own masks and ROI
+    DetectorItem *detectorItem = instrumentItem->detectorItem();
+    if(SessionItem *maskContainer = detectorItem->maskContainerItem()) {
+        SessionItem *item = detectorItem->takeRow(detectorItem->rowOfChild(maskContainer));
+        delete item;
+    }
+
+    QString message;
+    if(ImportDataAssistant::hasSameDimensions(instrumentItem, realDataItem, message))
+       return true;
+
+    bool canLink(false);
+
+    QMessageBox msgBox;
+    msgBox.setText("The shape of data and detector differs.");
+
+    QString informative;
+    informative.append(message);
+    informative.append("\n\nDo you want to modify instrument so it matches shape of real data?\n\n");
+    msgBox.setInformativeText(informative);
+
+    QPushButton *modifyInstrumentButton = msgBox.addButton("Yes, please modify instrument",
+                                                           QMessageBox::YesRole);
+    QPushButton *cancelButton = msgBox.addButton("No, leave as it is",
+                                                 QMessageBox::NoRole);
+
+    msgBox.exec();
+
+    if (msgBox.clickedButton() == modifyInstrumentButton) {
+        canLink = true;
+        ImportDataAssistant::setInstrumentShapeToData(instrumentItem, realDataItem);
+    } else if (msgBox.clickedButton() == cancelButton) {
+        canLink = false;
+    }
+
+    return canLink;
+}
+
+//! Calls rebuild of instrument map if the name or identifier of the instrument have changed.
+
+void LinkInstrumentManager::setOnInstrumentPropertyChange(SessionItem *instrument,
+                                                          const QString &property)
+{
+    Q_ASSERT(instrument);
+    if(property == SessionItem::P_NAME || property == InstrumentItem::P_IDENTIFIER) {
+        updateInstrumentMap();
+    }
+}
+
+//! Link or re-link RealDataItem to the instrument on identifier change.
+
+void LinkInstrumentManager::setOnRealDataPropertyChange(SessionItem *dataItem,
+                                                        const QString &property)
+{
+    if(property == RealDataItem::P_INSTRUMENT_ID) {
+        RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(dataItem);
+        QString identifier = dataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString();
+        realDataItem->linkToInstrument(getInstrument(identifier));
+    }
+}
+
+//! Perform actions on instrument children change.
+
+void LinkInstrumentManager::onInstrumentChildChange(InstrumentItem *instrument, SessionItem *child)
+{
+    if(child == nullptr)
+        return;
+
+    qDebug() << "SSS 1.1" << child->modelType() << child->itemName();
+    qDebug() << "SSS 1.1" << child->parent()->modelType() << child->parent()->itemName();
+
+
+    if(child->itemName() == BasicAxisItem::P_NBINS ||
+       child->parent()->itemName() == DetectorItem::P_DETECTOR) {
+        onInstrumentBinningChange(instrument);
+    } else {
+        onInstrumentLayoutChange(instrument);
+    }
+}
+
+//! Updates map of instruments on insert/remove InstrumentItem event.
+
+void LinkInstrumentManager::onInstrumentRowsChange(const QModelIndex &parent, int, int)
+{
+    // valid parent means not an instrument (which is top level item) but something below
+    if(parent.isValid())
+        return;
+
+    updateInstrumentMap();
+    updateLinks();
+}
+
+//! Updates map of data on insert/remove RealDataItem event.
+
+void LinkInstrumentManager::onRealDataRowsChange(const QModelIndex &parent, int, int)
+{
+    // valid parent means not a data (which is top level item) but something below
+    if(parent.isValid())
+        return;
+
+    updateRealDataMap();
+    updateLinks();
+}
+
+//! Runs through all RealDataItem and check all links.
+
+void LinkInstrumentManager::updateLinks()
+{
+    foreach(SessionItem *item, m_realDataModel->topItems(Constants::RealDataType)) {
+        RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(item);
+        Q_ASSERT(realDataItem);
+
+        QString identifier = realDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString();
+        InstrumentItem *instrumentItem = getInstrument(identifier);
+
+        if(!instrumentItem) {
+            // if no instrument with P_INSTRUMENT_ID exists, break the link
+            realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString());
+        } else {
+            // refresh the link to update axes
+            realDataItem->linkToInstrument(instrumentItem);
+        }
+    }
+}
+
+//! Builds the map of existing instruments, their names, identifiers and sets up callbacks.
+
+void LinkInstrumentManager::updateInstrumentMap()
+{
+    m_instrumentVec.clear();
+    m_instrumentVec.append(InstrumentInfo()); // undefined instrument
+    foreach(SessionItem *item, m_instrumentModel->topItems(Constants::InstrumentType)) {
+        InstrumentItem *instrumentItem = dynamic_cast<InstrumentItem *>(item);
+        instrumentItem->mapper()->unsubscribe(this);
+
+        instrumentItem->mapper()->setOnPropertyChange(
+                    [this, item](const QString &name)
+        {
+            setOnInstrumentPropertyChange(item, name);
+        }, this);
+
+        instrumentItem->mapper()->setOnAnyChildChange(
+            [this, instrumentItem] (SessionItem* child)
+        {
+            onInstrumentChildChange(instrumentItem, child);
+        }, this);
+
+        InstrumentInfo info;
+        info.m_name = item->itemName();
+        info.m_identifier = item->getItemValue(InstrumentItem::P_IDENTIFIER).toString();
+        info.m_instrument = instrumentItem;
+        m_instrumentVec.append(info);
+    }
+
+    emit instrumentMapUpdated();
+}
+
+//! Sets callbacks for all RealDataItem.
+
+void LinkInstrumentManager::updateRealDataMap()
+{
+    foreach(SessionItem *dataItem, m_realDataModel->topItems(Constants::RealDataType)) {
+        dataItem->mapper()->unsubscribe(this);
+
+        dataItem->mapper()->setOnPropertyChange(
+                    [this, dataItem](const QString &name)
+        {
+            setOnRealDataPropertyChange(dataItem, name);
+        }, this);
+
+    }
+}
+
+//! Runs through all RealDataItem and break the link, if instrument binning doesn't match the data.
+
+void LinkInstrumentManager::onInstrumentBinningChange(InstrumentItem *changedInstrument)
+{
+    foreach(RealDataItem *realDataItem, linkedItems(changedInstrument)) {
+        if(!ImportDataAssistant::hasSameDimensions(changedInstrument, realDataItem)) {
+            qDebug() << "Breaking the link ";
+            realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString());
+        }
+    }
+}
+
+//! Runs through all RealDataItem and refresh linking to match possible change in detector
+//! axes definition.
+
+void LinkInstrumentManager::onInstrumentLayoutChange(InstrumentItem *changedInstrument)
+{
+    foreach(RealDataItem *realDataItem, linkedItems(changedInstrument)) {
+        qDebug() << "Changing layout";
+        realDataItem->linkToInstrument(changedInstrument);
+    }
+}
+
+//! Returns list of RealDataItem's linked to given instrument.
+
+QList<RealDataItem *> LinkInstrumentManager::linkedItems(InstrumentItem *instrumentItem)
+{
+    QList<RealDataItem *> result;
+    foreach(SessionItem *item, m_realDataModel->topItems(Constants::RealDataType)) {
+        RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(item);
+
+        QString linkedIdentifier
+            = realDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString();
+        QString instrumentIdentifier
+            = instrumentItem->getItemValue(InstrumentItem::P_IDENTIFIER).toString();
+
+        if(linkedIdentifier == instrumentIdentifier)
+            result.append(realDataItem);
+    }
+    return result;
+}
+
+//! Sets connections for instrument model.
+
+void LinkInstrumentManager::setInstrumentModel(InstrumentModel *model)
+{
+    if (m_instrumentModel) {
+        disconnect(m_instrumentModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+                   this, SLOT(onInstrumentRowsChange(QModelIndex,int,int)));
+        disconnect(m_instrumentModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+                   this, SLOT(onInstrumentRowsChange(QModelIndex, int, int)));
+    }
+
+    m_instrumentModel = model;
+
+    if (m_instrumentModel) {
+        connect(m_instrumentModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+                   this, SLOT(onInstrumentRowsChange(QModelIndex, int, int)));
+        connect(m_instrumentModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+                   this, SLOT(onInstrumentRowsChange(QModelIndex, int, int)));
+    }
+}
+
+//! Sets connections for real data model.
+
+void LinkInstrumentManager::setRealDataModel(RealDataModel *model)
+{
+    if (m_realDataModel) {
+        disconnect(m_realDataModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+                   this, SLOT(onRealDataRowsChange(QModelIndex, int, int)));
+        disconnect(m_realDataModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+                   this, SLOT(onRealDataRowsChange(QModelIndex, int, int)));
+        disconnect(m_realDataModel, SIGNAL(modelLoaded()),
+                   this, SLOT(updateLinks()));
+    }
+
+    m_realDataModel = model;
+
+    if (m_realDataModel) {
+        connect(m_realDataModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+                   this, SLOT(onRealDataRowsChange(QModelIndex, int, int)));
+        connect(m_realDataModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+                   this, SLOT(onRealDataRowsChange(QModelIndex, int, int)));
+        connect(m_realDataModel, SIGNAL(modelLoaded()),
+                   this, SLOT(updateLinks()));
+    }
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h
new file mode 100644
index 0000000..59035c3
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h
@@ -0,0 +1,86 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h
+//! @brief     Defines class LinkInstrumentManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LINKINSTRUMENTMANAGER_H
+#define LINKINSTRUMENTMANAGER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+#include <QVector>
+#include <QList>
+#include <QStringList>
+
+class InstrumentModel;
+class RealDataModel;
+class SessionItem;
+class InstrumentItem;
+class RealDataItem;
+class SessionModel;
+
+//! The LinkInstrumentManager class provides communication between InstrumentModel and
+//! RealDataModel. Particularly, it notifies RealDataItem about changes in linked instruments
+//! to adjust axes of IntensityDataItem.
+
+class BA_CORE_API_ LinkInstrumentManager : public QObject {
+    Q_OBJECT
+
+public:
+    class InstrumentInfo
+    {
+    public:
+        InstrumentInfo();
+        QString m_identifier;
+        QString m_name;
+        InstrumentItem *m_instrument;
+    };
+
+    explicit LinkInstrumentManager(QObject *parent =  0);
+
+    void setModels(InstrumentModel *instrumentModel, RealDataModel *realDataModel);
+
+    InstrumentItem *getInstrument(const QString &identifier);
+    QStringList instrumentNames() const;
+    int instrumentComboIndex(const QString &identifier);
+    QString instrumentIdentifier(int comboIndex);
+    bool canLinkDataToInstrument(const RealDataItem *realDataItem, const QString &identifier);
+
+signals:
+    void instrumentMapUpdated();
+
+private slots:
+    void setOnInstrumentPropertyChange(SessionItem *instrument, const QString &property);
+    void setOnRealDataPropertyChange(SessionItem *dataItem, const QString &property);
+    void onInstrumentChildChange(InstrumentItem *instrument, SessionItem *child);
+    void onInstrumentRowsChange(const QModelIndex & parent, int, int);
+    void onRealDataRowsChange(const QModelIndex & parent, int, int);
+
+    void updateLinks();
+    void updateInstrumentMap();
+    void updateRealDataMap();
+    void onInstrumentBinningChange(InstrumentItem *changedInstrument);
+    void onInstrumentLayoutChange(InstrumentItem *changedInstrument);
+    QList<RealDataItem *> linkedItems(InstrumentItem *instrumentItem);
+
+private:
+    void setInstrumentModel(InstrumentModel *model);
+    void setRealDataModel(RealDataModel *model);
+
+    InstrumentModel *m_instrumentModel;
+    RealDataModel *m_realDataModel;
+    QVector<InstrumentInfo> m_instrumentVec;
+};
+
+#endif // LINKINSTRUMENTMANAGER_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.cpp
new file mode 100644
index 0000000..c5250cf
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.cpp
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.cpp
+//! @brief     Declares class RealDataEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RealDataEditorWidget.h"
+#include "IntensityDataItem.h"
+#include "IntensityDataPropertyWidget.h"
+#include "IntensityDataWidget.h"
+#include "RealDataItem.h"
+#include "SessionItem.h"
+#include <QAction>
+#include <QBoxLayout>
+#include <QDebug>
+
+RealDataEditorWidget::RealDataEditorWidget(QWidget *parent)
+    : SessionItemWidget(parent)
+    , m_intensityWidget(new IntensityDataWidget)
+    , m_propertyWidget(new IntensityDataPropertyWidget)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QHBoxLayout *hlayout = new QHBoxLayout;
+    hlayout->setMargin(0);
+    hlayout->setSpacing(0);
+
+    hlayout->addWidget(m_intensityWidget);
+    hlayout->addWidget(m_propertyWidget);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    mainLayout->addLayout(hlayout);
+    setLayout(mainLayout);
+
+}
+
+void RealDataEditorWidget::setItem(SessionItem *item)
+{
+    IntensityDataItem *intensityData = dynamic_cast<IntensityDataItem *>(item->getItem(RealDataItem::T_INTENSITY_DATA));
+    m_intensityWidget->setItem(intensityData);
+    m_propertyWidget->setItem(intensityData);
+}
+
+QList<QAction *> RealDataEditorWidget::actionList()
+{
+    return m_intensityWidget->actionList() + m_propertyWidget->actionList();
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.h b/GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.h
new file mode 100644
index 0000000..c3984c0
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataEditorWidget.h
+//! @brief     Defines class RealDataEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALDATAEDITORWIDGET_H
+#define REALDATAEDITORWIDGET_H
+
+#include "SessionItemWidget.h"
+
+class SessionItem;
+class IntensityDataWidget;
+class IntensityDataPropertyWidget;
+class IntensityDataItem;
+class QAction;
+
+//! The RealDataEditorWidget class provides editing/presenation of RealDataItem in ImportDataView.
+
+class BA_CORE_API_ RealDataEditorWidget : public SessionItemWidget
+{
+    Q_OBJECT
+
+public:
+    RealDataEditorWidget(QWidget *parent = 0);
+
+//    QSize sizeHint() const { return QSize(200, 400); }
+//    QSize minimumSizeHint() const { return QSize(200, 200); }
+
+    void setItem(class SessionItem *item);
+
+    QList<QAction *> actionList();
+
+private:
+    IntensityDataWidget *m_intensityWidget;
+    IntensityDataPropertyWidget *m_propertyWidget;
+    IntensityDataItem *m_currentItem;
+};
+
+#endif // REALDATAEDITORWIDGET_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.cpp
new file mode 100644
index 0000000..593f8ee
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.cpp
@@ -0,0 +1,83 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.cpp
+//! @brief     Implements class RealDataMaskWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RealDataMaskWidget.h"
+#include "IntensityDataItem.h"
+//#include "IntensityDataPropertyWidget.h"
+//#include "IntensityDataWidget.h"
+#include "MaskEditor.h"
+#include "RealDataItem.h"
+#include "SessionItem.h"
+#include "MaskItems.h"
+#include "SessionModel.h"
+#include <QAction>
+#include <QBoxLayout>
+#include <QDebug>
+
+RealDataMaskWidget::RealDataMaskWidget(QWidget *parent)
+    : SessionItemWidget(parent)
+//    , m_intensityWidget(new IntensityDataWidget)
+//    , m_propertyWidget(new IntensityDataPropertyWidget)
+    , m_maskEditor(new MaskEditor)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QHBoxLayout *hlayout = new QHBoxLayout;
+    hlayout->setMargin(0);
+    hlayout->setSpacing(0);
+
+//    hlayout->addWidget(m_intensityWidget);
+//    hlayout->addWidget(m_propertyWidget);
+    hlayout->addWidget(m_maskEditor);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    mainLayout->addLayout(hlayout);
+    setLayout(mainLayout);
+}
+
+void RealDataMaskWidget::setItem(SessionItem *item)
+{
+    IntensityDataItem *intensityData = dynamic_cast<IntensityDataItem *>(item->getItem(RealDataItem::T_INTENSITY_DATA));
+    Q_ASSERT(intensityData);
+    MaskContainerItem *container = createMaskContainer(intensityData);
+//    m_intensityWidget->setItem(intensityData);
+//    m_propertyWidget->setItem(intensityData);
+
+    m_maskEditor->setMaskContext(intensityData->model(), container->index(), intensityData);
+    m_maskEditor->update();
+
+}
+
+QList<QAction *> RealDataMaskWidget::actionList()
+{
+    return m_maskEditor->topToolBarActions();
+}
+
+MaskContainerItem *RealDataMaskWidget::createMaskContainer(IntensityDataItem *intensityData)
+{
+    MaskContainerItem *result = dynamic_cast<MaskContainerItem *>(
+                intensityData->getItem(IntensityDataItem::T_MASKS));
+
+    if(!result)
+        result = dynamic_cast<MaskContainerItem *>(
+            intensityData->model()->insertNewItem(Constants::MaskContainerType, intensityData->index()));
+
+    Q_ASSERT(result);
+    return result;
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.h b/GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.h
new file mode 100644
index 0000000..5f09a35
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataMaskWidget.h
+//! @brief     Defines class RealDataMaskWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALDATAMASKWIDGET_H
+#define REALDATAMASKWIDGET_H
+
+#include "SessionItemWidget.h"
+
+class SessionItem;
+//class IntensityDataWidget;
+//class IntensityDataPropertyWidget;
+class MaskEditor;
+class IntensityDataItem;
+class QAction;
+class MaskContainerItem;
+
+//! The RealDataMaskWidget class provides mask editing for RealDataItem on ImportDataView.
+
+class BA_CORE_API_ RealDataMaskWidget : public SessionItemWidget
+{
+    Q_OBJECT
+
+public:
+    RealDataMaskWidget(QWidget *parent = 0);
+
+    void setItem(class SessionItem *item);
+
+    QList<QAction *> actionList();
+
+private:
+    MaskContainerItem* createMaskContainer(IntensityDataItem *intensityData);
+
+//    IntensityDataWidget *m_intensityWidget;
+//    IntensityDataPropertyWidget *m_propertyWidget;
+    MaskEditor *m_maskEditor;
+    IntensityDataItem *m_currentItem;
+};
+
+#endif // REALDATAMASKWIDGET_H
+
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp
new file mode 100644
index 0000000..ef52984
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp
@@ -0,0 +1,213 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp
+//! @brief     Implements class RealDataPropertiesWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RealDataPropertiesWidget.h"
+#include "RealDataItem.h"
+#include "SessionModel.h"
+#include "LinkInstrumentManager.h"
+#include "GUIHelpers.h"
+#include <QVBoxLayout>
+#include <QLineEdit>
+#include <QComboBox>
+#include <QDataWidgetMapper>
+#include <QLabel>
+#include <QDebug>
+
+namespace {
+const QString instrumentNameTooltip = "Name of real data";
+const QString selectorTooltip = "Select instrument to link with real data";
+}
+
+RealDataPropertiesWidget::RealDataPropertiesWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_linkManager(new LinkInstrumentManager(this))
+    , m_dataNameMapper(new QDataWidgetMapper)
+    , m_dataNameLabel(new QLabel("Dataset"))
+    , m_dataNameEdit(new QLineEdit)
+    , m_instrumentLabel(new QLabel("Linked instrument"))
+    , m_instrumentCombo(new QComboBox)
+    , m_currentDataItem(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    setWindowTitle("RealDataPropertiesWidget");
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(5);
+    mainLayout->setSpacing(2);
+
+    m_dataNameLabel->setToolTip(instrumentNameTooltip);
+    m_dataNameEdit->setToolTip(instrumentNameTooltip);
+    m_instrumentLabel->setToolTip(selectorTooltip);
+    m_instrumentCombo->setToolTip(selectorTooltip);
+
+    mainLayout->addWidget(m_dataNameLabel);
+    mainLayout->addWidget(m_dataNameEdit);
+    mainLayout->addSpacing(5);
+    mainLayout->addWidget(m_instrumentLabel);
+    mainLayout->addWidget(m_instrumentCombo);
+
+    mainLayout->addStretch();
+    setLayout(mainLayout);
+
+    setComboConnected(true);
+    connect(m_linkManager, SIGNAL(instrumentMapUpdated()),
+            this, SLOT(onInstrumentMapUpdate()));
+
+    setPropertiesEnabled(false);
+}
+
+//! Sets models to underlying link manager.
+
+void RealDataPropertiesWidget::setModels(InstrumentModel *instrumentModel,
+                                         RealDataModel *realDataModel)
+{
+    m_linkManager->setModels(instrumentModel, realDataModel);
+}
+
+//! Set current RealDataItem to display in instrument selector.
+
+void RealDataPropertiesWidget::setItem(SessionItem *item)
+{
+    m_dataNameMapper->clearMapping();
+
+    if(item == m_currentDataItem)
+        return;
+
+    if(m_currentDataItem)
+        m_currentDataItem->mapper()->unsubscribe(this);
+
+    m_currentDataItem = dynamic_cast<RealDataItem *>(item);
+
+    if(!m_currentDataItem) {
+        setPropertiesEnabled(false);
+        return;
+    }
+
+    setPropertiesEnabled(true);
+
+    m_currentDataItem->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+    {
+        onRealDataPropertyChanged(name);
+    }, this);
+
+    m_currentDataItem->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_currentDataItem = 0;
+    }, this);
+
+    // Initialize QLineEdit to edit itemName directly in the model
+    m_dataNameMapper->setModel(item->model());
+    m_dataNameMapper->setRootIndex(item->index());
+    m_dataNameMapper->setCurrentModelIndex(item->getItem(SessionItem::P_NAME)->index());
+    m_dataNameMapper->addMapping(m_dataNameEdit, 1);
+    m_dataNameMapper->toFirst();
+
+    // Set combo selector to show linked instrument
+    setComboToIdentifier(item->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString());
+}
+
+//! Processes user interaction with instrument selector combo. If there is realDataItem,
+//! it will be linked with selected instrument.
+
+void RealDataPropertiesWidget::onInstrumentComboIndexChanged(int index)
+{
+    m_current_id = m_linkManager->instrumentIdentifier(index);
+
+    if(!m_currentDataItem)
+        return;
+
+    QString dataLink = m_currentDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString();
+    if(m_current_id == dataLink)
+        return;
+
+    if(m_linkManager->canLinkDataToInstrument(m_currentDataItem, m_current_id)) {
+        m_currentDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, m_current_id);
+
+    } else {
+        // LinkManager doesn't allow to link data to instrument.
+        setComboToIdentifier(dataLink); // Returning Combo selector to previous state
+    }
+}
+
+//! Updates instrument selector for new instruments and their names.
+//! Current selection will be preserved.
+
+void RealDataPropertiesWidget::onInstrumentMapUpdate()
+{
+    setComboConnected(false);
+    m_instrumentCombo->clear();
+    m_instrumentCombo->addItems(m_linkManager->instrumentNames());
+    int index = m_linkManager->instrumentComboIndex(m_current_id);
+    if(index >= 0) {
+        m_instrumentCombo->setCurrentIndex(index);
+    } else {
+        // instrument corresponding to m_current_id was deleted
+        m_current_id = QString();
+        m_instrumentCombo->setCurrentIndex(0);
+    }
+    setComboConnected(true);
+}
+
+//! Updates instrument combo on link change of current RealDataItem.
+
+void RealDataPropertiesWidget::onRealDataPropertyChanged(const QString &name)
+{
+    if(name == RealDataItem::P_INSTRUMENT_ID) {
+        setComboToIdentifier(
+                    m_currentDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString());
+    }
+}
+
+//! Sets instrument combo selector to the state corresponding to given instrument identifier.
+
+void RealDataPropertiesWidget::setComboToIdentifier(const QString &identifier)
+{
+    setComboConnected(false);
+    m_current_id = identifier;
+    int index = m_linkManager->instrumentComboIndex(identifier);
+    Q_ASSERT(index >=0);
+    m_instrumentCombo->setCurrentIndex(index);
+    setComboConnected(true);
+}
+
+//! Sets connected/disconnected for instrument combo selector.
+
+void RealDataPropertiesWidget::setComboConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_instrumentCombo, SIGNAL(currentIndexChanged(int)),
+                this, SLOT(onInstrumentComboIndexChanged(int)));
+    } else {
+        disconnect(m_instrumentCombo, SIGNAL(currentIndexChanged(int)),
+                this, SLOT(onInstrumentComboIndexChanged(int)));
+    }
+}
+
+//! Sets all widget's children enabled/disabled. When no RealDataItem selected all
+//! will appear in gray.
+
+void RealDataPropertiesWidget::setPropertiesEnabled(bool enabled)
+{
+    m_dataNameLabel->setEnabled(enabled);
+    m_dataNameEdit->setEnabled(enabled);
+    m_instrumentLabel->setEnabled(enabled);
+    m_instrumentCombo->setEnabled(enabled);
+    if(enabled == false) {
+        m_dataNameEdit->clear();
+        m_instrumentCombo->setCurrentIndex(0);
+    }
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h
new file mode 100644
index 0000000..5e74af0
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h
+//! @brief     Defines class RealDataPropertiesWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALDATAPROPERTIESWIDGET_H
+#define REALDATAPROPERTIESWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class LinkInstrumentManager;
+class SessionItem;
+class InstrumentModel;
+class RealDataModel;
+class RealDataItem;
+class QDataWidgetMapper;
+class QLineEdit;
+class QComboBox;
+class QLabel;
+
+//! The RealDataPropertiesWidget class holds instrument selector to link with RealDataItem.
+//! Part of RealDataSelectorWidget, resides at lower left corner of ImportDataView.
+
+class BA_CORE_API_ RealDataPropertiesWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit RealDataPropertiesWidget(QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(64, 135); }
+    QSize minimumSizeHint() const { return QSize(64, 128); }
+
+    void setModels(InstrumentModel *instrumentModel, RealDataModel *realDataModel);
+    void setItem(SessionItem *item);
+
+public slots:
+    void onInstrumentComboIndexChanged(int index);
+    void onInstrumentMapUpdate();
+    void onRealDataPropertyChanged(const QString &name);
+
+private:
+    void setComboToIdentifier(const QString &identifier);
+    void setComboConnected(bool isConnected);
+    void setPropertiesEnabled(bool enabled);
+
+    LinkInstrumentManager *m_linkManager;
+    QDataWidgetMapper *m_dataNameMapper;
+    QLabel *m_dataNameLabel;
+    QLineEdit *m_dataNameEdit;
+    QLabel *m_instrumentLabel;
+    QComboBox *m_instrumentCombo;
+    QString m_current_id;
+    RealDataItem *m_currentDataItem;
+};
+
+#endif // REALDATAPROPERTIESWIDGET_H
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp
new file mode 100644
index 0000000..107fdb3
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.cpp
+//! @brief     Implements class RealDataSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RealDataSelectorWidget.h"
+#include "ItemSelectorWidget.h"
+#include "RealDataPropertiesWidget.h"
+#include "RealDataModel.h"
+#include "LinkInstrumentManager.h"
+#include "minisplitter.h"
+#include <QVBoxLayout>
+#include <QItemSelectionModel>
+
+RealDataSelectorWidget::RealDataSelectorWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_splitter(new Manhattan::MiniSplitter)
+    , m_selectorWidget(new ItemSelectorWidget)
+    , m_propertiesWidget(new RealDataPropertiesWidget)
+{
+    setMinimumSize(128, 600);
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+    setWindowTitle("RealDataSelectorWidget");
+
+    m_splitter->setOrientation(Qt::Vertical);
+    m_splitter->addWidget(m_selectorWidget);
+    m_splitter->addWidget(m_propertiesWidget);
+    m_splitter->setChildrenCollapsible(true);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->addWidget(m_splitter);
+    setLayout(mainLayout);
+
+    connect(m_selectorWidget, SIGNAL(selectionChanged(SessionItem *)),
+        this, SLOT(onSelectionChanged(SessionItem *)));
+
+}
+
+void RealDataSelectorWidget::setModels(InstrumentModel *instrumentModel,
+                                       RealDataModel *realDataModel)
+{
+    m_selectorWidget->setModel(realDataModel);
+    m_propertiesWidget->setModels(instrumentModel, realDataModel);
+}
+
+QItemSelectionModel *RealDataSelectorWidget::selectionModel()
+{
+    return m_selectorWidget->selectionModel();
+}
+
+void RealDataSelectorWidget::onSelectionChanged(SessionItem *item)
+{
+   m_propertiesWidget->setItem(item);
+   emit selectionChanged(item);
+}
diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h
new file mode 100644
index 0000000..7cfbe31
--- /dev/null
+++ b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/ImportDataWidgets/RealDataSelectorWidget.h
+//! @brief     Defines class RealDataSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REALDATASELECTORWIDGET_H
+#define REALDATASELECTORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class RealDataPropertiesWidget;
+class ItemSelectorWidget;
+class RealDataPropertiesWidget;
+class InstrumentModel;
+class RealDataModel;
+class SessionItem;
+class QItemSelectionModel;
+namespace Manhattan { class MiniSplitter;}
+
+//! The RealDataSelectorWidget represents left panel of ImportDataView. Contains a widget to
+//! select data set (ItemSelectorWidget) and properties of currently selected data
+//! (RealDataPropertiesWidget).
+
+class BA_CORE_API_ RealDataSelectorWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    RealDataSelectorWidget(QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(200, 400); }
+    QSize minimumSizeHint() const { return QSize(128, 200); }
+
+    void setModels(InstrumentModel *instrumentModel, RealDataModel *realDataModel);
+
+    QItemSelectionModel *selectionModel();
+
+signals:
+    void selectionChanged(SessionItem *);
+
+public slots:
+    void onSelectionChanged(SessionItem *item);
+
+private:
+    Manhattan::MiniSplitter *m_splitter;
+    ItemSelectorWidget *m_selectorWidget;
+    RealDataPropertiesWidget *m_propertiesWidget;
+};
+
+#endif // REALDATASELECTORWIDGET_H
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionDialog.cpp b/GUI/coregui/Views/InfoWidgets/DistributionDialog.cpp
new file mode 100644
index 0000000..4d3af5f
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/DistributionDialog.cpp
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/DistributionDialog.cpp
+//! @brief     Implements class DistributionDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DistributionDialog.h"
+#include "DistributionEditor.h"
+#include "SessionItem.h"
+#include <QHBoxLayout>
+#include <QPushButton>
+
+DistributionDialog::DistributionDialog(QWidget *parent)
+    : QDialog(parent)
+    , m_editor(new DistributionEditor)
+{
+    setMinimumSize(256, 256);
+    resize(700, 480);
+    setWindowTitle("Select Distribution");
+//    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    setModal(true);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    QPushButton *button = new QPushButton("Close", this);
+    button->setAutoDefault(false);
+    connect(button, SIGNAL(clicked()), this, SLOT(close()));
+
+    QHBoxLayout *buttonLayout = new QHBoxLayout;
+    buttonLayout->addStretch(1);
+    buttonLayout->setContentsMargins(4, 4, 4, 4);
+    buttonLayout->addWidget(button);
+
+    layout->addWidget(m_editor);
+    layout->addLayout(buttonLayout);
+
+    layout->setContentsMargins(0, 0, 0, 0);
+    setLayout(layout);
+
+    setAttribute(Qt::WA_DeleteOnClose, true);
+}
+
+void DistributionDialog::setItem(SessionItem *item)
+{
+    m_editor->setItem(item);
+}
+
+void DistributionDialog::setNameOfEditor(const QString &name)
+{
+    m_editor->setNameOfEditor(name);
+}
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionDialog.h b/GUI/coregui/Views/InfoWidgets/DistributionDialog.h
new file mode 100644
index 0000000..6534d8e
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/DistributionDialog.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/DistributionDialog.h
+//! @brief     Defines class DistributionDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DISTRIBUTIONDIALOG_H
+#define DISTRIBUTIONDIALOG_H
+
+#include <QDialog>
+class DistributionEditor;
+class SessionItem;
+
+//! The dialog which shows an editor to change parameters of DistributionItem
+class DistributionDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    DistributionDialog(QWidget *parent = 0);
+    virtual ~DistributionDialog(){}
+
+    void setItem(SessionItem *item);
+    void setNameOfEditor(const QString &name);
+
+private:
+    DistributionEditor *m_editor;
+};
+
+#endif // DISTRIBUTIONDIALOG_H
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp
new file mode 100644
index 0000000..ab92a61
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp
@@ -0,0 +1,108 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/DistributionEditor.cpp
+//! @brief     Implements class DistributionEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DistributionEditor.h"
+#include "BeamWavelengthItem.h"
+#include "ComponentBoxEditor.h"
+#include "DistributionDialog.h"
+#include "DistributionWidget.h"
+#include "Distributions.h"
+#include "GroupInfoBox.h"
+#include "GroupItem.h"
+#include "SessionItem.h"
+#include "qcustomplot.h"
+#include <QDebug>
+#include <QVBoxLayout>
+
+namespace
+{
+int minimumWidth_of_AwesomePropertyEditor = 250;
+}
+
+DistributionEditor::DistributionEditor(QWidget *parent)
+    : QWidget(parent), m_item(0), m_plotwidget(0), m_box(new QGroupBox)
+
+{
+    m_plotwidget = new DistributionWidget(this);
+    m_propertyEditor = new ComponentBoxEditor;
+
+    QVBoxLayout *boxLayout = new QVBoxLayout;
+    m_propertyEditor->setMaximumWidth(minimumWidth_of_AwesomePropertyEditor);
+    boxLayout->addWidget(m_propertyEditor);
+    boxLayout->setContentsMargins(0, 0, 0, 0);
+    m_box->setLayout(boxLayout);
+
+    QVBoxLayout *verticalLayout = new QVBoxLayout;
+    verticalLayout->addWidget(m_box);
+    verticalLayout->addStretch(1);
+
+    QHBoxLayout *mainLayout = new QHBoxLayout;
+    mainLayout->addWidget(m_plotwidget, 1);
+    mainLayout->addSpacing(5);
+    mainLayout->addLayout(verticalLayout);
+
+    setLayout(mainLayout);
+}
+
+DistributionEditor::~DistributionEditor()
+{
+    if(m_item) m_item->mapper()->unsubscribe(this);
+}
+
+void DistributionEditor::setItem(SessionItem *item)
+{
+    m_propertyEditor->clearEditor();
+    m_propertyEditor->addPropertyItems(item);
+
+    if (m_item == item) {
+        return;
+
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = dynamic_cast<GroupItem *>(item);
+        if(!m_item) return;
+
+        m_item->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
+
+        DistributionItem *distrItem = dynamic_cast<DistributionItem *>(
+            m_item->currentItem());
+        Q_ASSERT(distrItem);
+        m_plotwidget->setItem(distrItem);
+    }
+}
+
+void DistributionEditor::onPropertyChanged(const QString &property_name)
+{
+    if (property_name == GroupItem::T_ITEMS) {
+        DistributionItem *distrItem = dynamic_cast<DistributionItem *>(
+            m_item->currentItem());
+        Q_ASSERT(distrItem);
+        m_plotwidget->setItem(distrItem);
+    }
+}
+
+void DistributionEditor::setNameOfEditor(QString name)
+{
+    m_box->setTitle(name);
+    m_plotwidget->setXAxisName(name);
+}
+
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionEditor.h b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h
new file mode 100644
index 0000000..097c9c5
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/DistributionEditor.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/DistributionEditor.h
+//! @brief     Defines class DistributionEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DISTRIBUTIONEDITOR_H
+#define DISTRIBUTIONEDITOR_H
+
+#include "SessionItem.h"
+#include "qcustomplot.h"
+#include <QWidget>
+#include <memory>
+
+class QGroupBox;
+class DistributionWidget;
+class GroupItem;
+class ComponentBoxEditor;
+
+//! The DistributionEditor class, being a child of DistributionDialog, contains a widget
+//! to show Distribution1D and awesome property editor to change distribution parameters
+class DistributionEditor : public QWidget
+{
+    Q_OBJECT
+public:
+    DistributionEditor(QWidget *parent = 0);
+    virtual ~DistributionEditor();
+
+    void setItem(SessionItem *item);
+    void plotItem(SessionItem *item);
+    void setNameOfEditor(QString name);
+
+private slots:
+    void onPropertyChanged(const QString &property_name);
+
+private:
+    ComponentBoxEditor *m_propertyEditor;
+    GroupItem *m_item;
+    DistributionWidget *m_plotwidget;
+    QString m_nameOfEditor;
+    QGroupBox *m_box;
+};
+
+#endif // DISTRIBUTIONEDITOR_H
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp
new file mode 100644
index 0000000..a24659e
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp
@@ -0,0 +1,290 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/DistributionWidget.cpp
+//! @brief     Implements class DistributionWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DistributionWidget.h"
+#include "DistributionItem.h"
+#include "Distributions.h"
+#include "qcustomplot.h"
+#include <QLabel>
+#include <QVBoxLayout>
+#include <sstream>
+
+namespace
+{
+int number_of_points_for_smooth_plot = 100;
+double sigmafactor_for_smooth_plot = 3.5;
+double gap_between_bars = 0.05;
+double xRangeDivisor = 9;
+double xBarRange = 0.4;
+double percentage_for_yRange = 1.1;
+int warning_sign_xpos = 50;
+int warning_sign_ypos = 18;
+}
+
+DistributionWidget::DistributionWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_plot(new QCustomPlot)
+    , m_item(0)
+    , m_label(new QLabel)
+    , m_resetAction(new QAction(this))
+    , m_xRange(new QCPRange)
+    , m_yRange(new QCPRange)
+    , m_warningSign(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    m_resetAction->setText("Reset View");
+    connect(m_resetAction, SIGNAL(triggered()), this, SLOT(resetView()));
+
+    m_label->setAlignment(Qt::AlignVCenter| Qt::AlignLeft);
+    m_label->setStyleSheet("background-color:white;");
+    m_label->setMargin(3);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    mainLayout->addWidget(m_plot, 1);
+    mainLayout->addWidget(m_label);
+    setLayout(mainLayout);
+
+    setStyleSheet("background-color:white;");
+    connect(m_plot, SIGNAL(mousePress(QMouseEvent *)), this, SLOT(onMousePress(QMouseEvent *)));
+    connect(m_plot, SIGNAL(mouseRelease(QMouseEvent*)), this, SLOT(onMouseRelease(QMouseEvent*)));
+    connect(m_plot, SIGNAL(mouseRelease(QMouseEvent*)), this, SLOT(onMouseRelease(QMouseEvent*)));
+}
+
+void DistributionWidget::setItem(DistributionItem *item)
+{
+    if (m_item == item) {
+        return;
+
+    } else {
+        if (m_item) {
+            disconnect();
+            m_item->mapper()->unsubscribe(this);
+        }
+
+        m_item = item;
+        if (!m_item) return;
+
+        plotItem();
+
+        m_item->mapper()->setOnPropertyChange(
+                    [this](QString)
+        {
+            plotItem();
+        }, this);
+
+    }
+
+}
+
+void DistributionWidget::plotItem()
+{
+    delete m_warningSign;
+    m_warningSign = 0;
+
+    m_plot->clearGraphs();
+    m_plot->clearItems();
+    m_plot->clearPlottables();
+    m_plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes
+                            | QCP::iSelectLegend | QCP::iSelectPlottables);
+    m_plot->yAxis->setLabel("probability");
+    m_plot->xAxis2->setVisible(true);
+    m_plot->yAxis2->setVisible(true);
+    m_plot->xAxis2->setTickLabels(false);
+    m_plot->yAxis2->setTickLabels(false);
+    m_plot->xAxis2->setTicks(false);
+    m_plot->yAxis2->setTicks(false);
+
+    std::unique_ptr<IDistribution1D> P_distribution {};
+    bool exceptionThrown = false;
+    try {
+        P_distribution = m_item->createDistribution();
+    } catch (const std::exception &ex) {
+        exceptionThrown = true;
+        Q_UNUSED(ex);
+        m_plot->clearGraphs();
+        m_plot->clearItems();
+        m_plot->clearPlottables();
+
+        m_warningSign = new WarningSignWidget(this);
+
+        QString message
+            = QString("Wrong parameters\n").append(QString::fromStdString(ex.what()));
+
+        m_warningSign->setWarningMessage(message);
+        QPoint pos = getPositionForWarningSign();
+        m_warningSign->setPosition(pos.x(), pos.y());
+        m_warningSign->show();
+    }
+
+    if (m_item->itemName() != Constants::DistributionNoneType && !exceptionThrown) {
+        int numberOfSamples
+            = m_item->getItemValue(DistributionItem::P_NUMBER_OF_SAMPLES).toInt();
+        double sigmafactor
+            = m_item->getItemValue(DistributionItem::P_SIGMA_FACTOR).toDouble();
+
+        QVector<double> xBar;
+        QVector<double> x;
+        xBar = xBar.fromStdVector(P_distribution->generateValueList(numberOfSamples, sigmafactor));
+        x = x.fromStdVector(P_distribution->generateValueList(number_of_points_for_smooth_plot,
+                                                            sigmafactor_for_smooth_plot));
+        QVector<double> yBar(xBar.size());
+        QVector<double> y(x.size());
+        double sumOfWeigths(0);
+
+        for (int i = 0; i < xBar.size(); ++i) {
+            yBar[i] = P_distribution->probabilityDensity(xBar[i]);
+            sumOfWeigths += yBar[i];
+        }
+        for (int i = 0; i < x.size(); ++i) {
+            y[i] = P_distribution->probabilityDensity(x[i]);
+        }
+        for (int i = 0; i < y.size(); ++i) {
+            y[i] = y[i] / sumOfWeigths;
+        }
+        for (int i = 0; i < yBar.size(); ++i) {
+            yBar[i] = yBar[i] / sumOfWeigths;
+        }
+        m_plot->addGraph();
+        m_plot->graph(0)->setData(x, y);
+        QCPBars *bars = new QCPBars(m_plot->xAxis, m_plot->yAxis);
+        bars->setWidth(getWidthOfBars(xBar[0], xBar[xBar.length() - 1], xBar.length()));
+        bars->setData(xBar, yBar);
+        double xRange = (x[x.size() - 1] - x[0]) / xRangeDivisor;
+        m_xRange = new QCPRange(x[0] - xRange, x[x.size() - 1] + xRange);
+        m_yRange = new QCPRange(0, y[getMaxYPosition(y.size())] * percentage_for_yRange);
+        m_plot->xAxis->setRange(*m_xRange);
+        m_plot->yAxis->setRange(*m_yRange);
+        m_plot->addPlottable(bars);
+        setVerticalDashedLine(xBar[0], 0, xBar[xBar.length() - 1], m_plot->yAxis->range().upper);
+    } else if(!exceptionThrown) {
+        QVector<double> xPos;
+        QVector<double> yPos;
+        xPos.push_back(m_item->getItemValue(DistributionNoneItem::P_VALUE).toDouble());
+        yPos.push_back(1);
+        QCPBars *bars = new QCPBars(m_plot->xAxis, m_plot->yAxis);
+        bars->setWidth(gap_between_bars);
+        bars->setData(xPos, yPos);
+        m_plot->addPlottable(bars);
+        m_xRange = new QCPRange(xPos[0] - xBarRange, xPos[0] + xBarRange);
+        m_yRange = new QCPRange(0, yPos[0] * percentage_for_yRange);
+        m_plot->xAxis->setRange(*m_xRange);
+        m_plot->yAxis->setRange(*m_yRange);
+        setVerticalDashedLine(xPos[0], 0, xPos[xPos.size() - 1], m_plot->yAxis->range().upper);
+    }
+    m_plot->replot();
+    connect(m_plot, SIGNAL(mouseMove(QMouseEvent *)), this, SLOT(onMouseMove(QMouseEvent *)));
+}
+
+double DistributionWidget::getWidthOfBars(double min, double max, int samples)
+{
+    double widthConst = (max - min) * gap_between_bars;
+    double widthSample = (max - min) / samples;
+
+    if (widthConst > widthSample) {
+        return widthSample;
+    }
+    return widthConst;
+}
+
+void DistributionWidget::setVerticalDashedLine(double xMin, double yMin, double xMax, double yMax)
+{
+    QCPItemLine *min = new QCPItemLine(m_plot);
+    QCPItemLine *max = new QCPItemLine(m_plot);
+
+    QPen pen(Qt::blue, 1, Qt::DashLine);
+    min->setPen(pen);
+    max->setPen(pen);
+
+    min->setSelectable(true);
+    max->setSelectable(true);
+
+    // Adding the vertical lines to the plot
+    m_plot->addItem(min);
+    min->start->setCoords(xMin, yMin);
+    min->end->setCoords(xMin, yMax);
+
+    m_plot->addItem(max);
+    max->start->setCoords(xMax, yMin);
+    max->end->setCoords(xMax, yMax);
+}
+
+int DistributionWidget::getMaxYPosition(int y)
+{
+    if ((y - 1) % 2 == 0) {
+        return (y - 1) / 2;
+    } else {
+        return (y / 2) - 1;
+    }
+}
+
+// get current mouse position in plot
+void DistributionWidget::onMouseMove(QMouseEvent *event)
+{
+    QPoint point = event->pos();
+    double xPos = m_plot->xAxis->pixelToCoord(point.x());
+    double yPos = m_plot->yAxis->pixelToCoord(point.y());
+
+    if (m_plot->xAxis->range().contains(xPos) && m_plot->yAxis->range().contains(yPos)) {
+        std::stringstream labelText;
+        labelText << "[x: " << xPos << ",  y: " << yPos << "]";
+        m_label->setText(labelText.str().c_str());
+    }
+}
+
+void DistributionWidget::onMousePress(QMouseEvent *event)
+{
+    if (event->button() == Qt::RightButton) {
+        QPoint point = event->globalPos();
+        QMenu menu;
+        menu.addAction(m_resetAction);
+        menu.exec(point);
+    }
+}
+
+void DistributionWidget::resetView()
+{
+    m_plot->xAxis->setRange(*m_xRange);
+    m_plot->yAxis->setRange(*m_yRange);
+    m_plot->replot();
+}
+
+void DistributionWidget::setXAxisName(QString xAxisName)
+{
+    m_plot->xAxis->setLabel(xAxisName);
+}
+
+//! Returns position for warning sign at the bottom right corner of the editor. The position will
+//! be adjusted according to the visibility of scroll bars
+QPoint DistributionWidget::getPositionForWarningSign()
+{
+    int x = m_plot->geometry().topRight().x() - warning_sign_xpos;
+    int y = m_plot->geometry().topRight().y() + warning_sign_ypos;
+    return QPoint(x, y);
+}
+
+//! adjusts position of warning label on widget move
+void DistributionWidget::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED(event);
+    if (m_warningSign) {
+        QPoint pos = getPositionForWarningSign();
+        m_warningSign->setPosition(pos.x(), pos.y());
+    }
+}
+
diff --git a/GUI/coregui/Views/InfoWidgets/DistributionWidget.h b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h
new file mode 100644
index 0000000..e4551d3
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/DistributionWidget.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/DistributionWidget.h
+//! @brief     Defines class DistributionWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DISTRIBUTIONWIDGET_H
+#define DISTRIBUTIONWIDGET_H
+
+#include "WarningSignWidget.h"
+#include "qcustomplot.h"
+#include <QWidget>
+#include <memory>
+
+class SessionItem;
+class AwesomePropertyEditor;
+class QLabel;
+class QCustomPlot;
+class DistributionItem;
+class QCPRange;
+class QAction;
+
+//! The DistributionWidget class plots 1d functions corresponding to domain's Distribution1D
+class DistributionWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    DistributionWidget(QWidget *parent = 0);
+
+    void setItem(DistributionItem *item);
+    void plotItem();
+    double getWidthOfBars(double min, double max, int samples);
+    void setVerticalDashedLine(double xMin, double yMin, double xMax, double yMax);
+    int getMaxYPosition(int y);
+    void setXAxisName(QString xAxisName);
+    QPoint getPositionForWarningSign();
+
+public slots:
+    void onMouseMove(QMouseEvent *event);
+    void onMousePress(QMouseEvent *event);
+
+protected:
+    void resizeEvent(QResizeEvent *event);
+private slots:
+    void resetView();
+
+private:
+    QCustomPlot *m_plot;
+    DistributionItem *m_item;
+    QLabel *m_label;
+    QAction *m_resetAction;
+    QCPRange *m_xRange;
+    QCPRange *m_yRange;
+    WarningSignWidget *m_warningSign;
+};
+
+#endif // DISTRIBUTIONWIDGET_H
diff --git a/GUI/coregui/Views/InfoWidgets/GroupInfoBox.cpp b/GUI/coregui/Views/InfoWidgets/GroupInfoBox.cpp
new file mode 100644
index 0000000..a586b09
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/GroupInfoBox.cpp
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/GroupInfoBox.cpp
+//! @brief     Implements class GroupInfoBox
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GroupInfoBox.h"
+#include "hostosinfo.h"
+#include <QApplication>
+#include <QDebug>
+#include <QMouseEvent>
+#include <QPainter>
+#include <QPixmap>
+#include <QPushButton>
+#include <QStyleOptionGroupBox>
+#include <QStylePainter>
+#include <QToolTip>
+#include <iostream>
+
+namespace
+{
+    int imageWidth = 16;
+    int imageheigth = 16;
+    int offset_of_tooltip_position = 20;
+    int offset_of_icon_position = 24;
+}
+
+GroupInfoBox::GroupInfoBox( QWidget *parent )
+    : QGroupBox( parent )
+    , m_xImage(0)
+    , m_yImage(0)
+{
+    init_box();
+}
+
+GroupInfoBox::GroupInfoBox( const QString &title, QWidget *parent )
+    : QGroupBox( title, parent ), m_title(title)
+{
+    init_box();
+}
+
+void GroupInfoBox::setButtonToolTip(const QString &text)
+{
+    m_toolTipText = text;
+}
+
+void GroupInfoBox::mousePressEvent( QMouseEvent *e )
+{
+    if( e->button() == Qt::LeftButton )
+    {
+        QStyleOptionGroupBox option;
+        initStyleOption( &option );
+        QRect buttonArea( m_xImage, m_yImage, imageWidth , imageheigth );
+        if( buttonArea.contains( e->pos() ) ) {
+            emit clicked(true);
+        }
+    }
+}
+
+void GroupInfoBox::mouseMoveEvent(QMouseEvent *event)
+{
+    QRect buttonArea(m_xImage, m_yImage, imageWidth, imageheigth);
+
+    if (buttonArea.contains(event->pos())) {
+        QToolTip::showText(
+            this->mapToGlobal(QPoint(m_xImage + offset_of_tooltip_position, m_yImage)),
+            m_toolTipText);
+    }
+}
+
+void GroupInfoBox::init_box()
+{
+    setMouseTracking(true);
+    m_toolTipText = QStringLiteral("Gives access to the extended distribution viewer.");
+}
+
+void GroupInfoBox::paintEvent(QPaintEvent *)
+{
+    QStylePainter paint(this);
+    QStyleOptionGroupBox option;
+    initStyleOption(&option);
+    paint.drawComplexControl(QStyle::CC_GroupBox, option);
+
+    m_xImage = this->geometry().topRight().x() - offset_of_icon_position;
+    m_yImage = 0;
+
+    // draw groupbox
+	int shift(1);
+	if(Utils::HostOsInfo::isLinuxHost()) shift = 3;
+
+    paint.drawItemPixmap(option.rect.adjusted(0, shift, 0, 0), Qt::AlignTop | Qt::AlignRight,
+                         QPixmap(":/images/magnifier.png"));
+}
+
+
+
diff --git a/GUI/coregui/Views/InfoWidgets/GroupInfoBox.h b/GUI/coregui/Views/InfoWidgets/GroupInfoBox.h
new file mode 100644
index 0000000..8677990
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/GroupInfoBox.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/GroupInfoBox.h
+//! @brief     Defines class GroupInfoBox
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GROUPINFOBOX_H
+#define GROUPINFOBOX_H
+
+#include <QGroupBox>
+
+//! The class which extends QGroupBox with clickable icon next to the label
+class GroupInfoBox : public QGroupBox
+{
+        Q_OBJECT
+
+public:
+        GroupInfoBox( QWidget *parent = 0 );
+        GroupInfoBox( const QString &title, QWidget *parent = 0 );
+
+        void setButtonToolTip(const QString &text);
+
+protected:
+        void mousePressEvent( QMouseEvent *e );
+        void paintEvent( QPaintEvent * );
+        void mouseMoveEvent(QMouseEvent *event);
+
+private:
+        void init_box();
+
+        QString m_title;
+        QString m_toolTipText;
+        int m_xImage;
+        int m_yImage;
+};
+
+#endif // GROUPINFOBOX_H
diff --git a/GUI/coregui/Views/InfoWidgets/InfoToolBar.cpp b/GUI/coregui/Views/InfoWidgets/InfoToolBar.cpp
new file mode 100644
index 0000000..cf0cc6e
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/InfoToolBar.cpp
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/InfoToolBar.cpp
+//! @brief     Implements class InfoToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InfoToolBar.h"
+#include <QHBoxLayout>
+#include <QToolButton>
+
+InfoToolBar::InfoToolBar(QWidget *parent)
+    : StyledToolBar(parent)
+    , m_expandButton(new QToolButton)
+    , m_closeButton(new QToolButton)
+    , m_expanded(false)
+{
+    setMinimumSize(25, 25);
+
+    m_expandButton->setIcon(QIcon(":/images/darkarrowup.png"));
+    m_expandButton->setToolTip("Collapse/expand view");
+    connect(m_expandButton, SIGNAL(clicked()), this, SLOT(onExpandButtonClicked()));
+
+    m_closeButton->setIcon(QIcon(":/images/darkclosebutton.png"));
+    m_closeButton->setToolTip("Close viewer");
+    connect(m_closeButton, SIGNAL(clicked()), this, SIGNAL(closeButtonClicked()));
+
+    QWidget* empty = new QWidget();
+    empty->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    addWidget(empty);
+
+    addWidget(m_expandButton);
+    addWidget(m_closeButton);
+
+    setStyleSheet("QToolBar {border-bottom: 1px solid gray}");
+}
+
+void InfoToolBar::setExpandStatus(bool status)
+{
+    m_expanded = status;
+    if(m_expanded) {
+        m_expandButton->setIcon(QIcon(":/images/darkarrowdown.png"));
+    } else {
+        m_expandButton->setIcon(QIcon(":/images/darkarrowup.png"));
+    }
+}
+
+void InfoToolBar::onExpandButtonClicked()
+{
+    m_expanded = !m_expanded;
+    setExpandStatus(m_expanded);
+    emit expandButtonClicked();
+}
+
diff --git a/GUI/coregui/Views/InfoWidgets/InfoToolBar.h b/GUI/coregui/Views/InfoWidgets/InfoToolBar.h
new file mode 100644
index 0000000..96eca7a
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/InfoToolBar.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/InfoToolBar.h
+//! @brief     Defines class InfoToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INFOTOOLBAR_H
+#define INFOTOOLBAR_H
+
+#include "StyledToolBar.h"
+
+class QToolButton;
+
+//! The InfoToolBar class represents a toolbar for InfoWidget
+
+class BA_CORE_API_ InfoToolBar : public StyledToolBar
+{
+    Q_OBJECT
+
+public:
+    explicit InfoToolBar(QWidget *parent = 0);
+
+signals:
+    void expandButtonClicked();
+    void closeButtonClicked();
+
+public slots:
+    void setExpandStatus(bool status);
+
+protected slots:
+    void onExpandButtonClicked();
+
+private:
+    QToolButton *m_expandButton;
+    QToolButton *m_closeButton;
+    bool m_expanded;
+};
+
+#endif // INFOTOOLBAR_H
diff --git a/GUI/coregui/Views/InfoWidgets/InfoWidget.cpp b/GUI/coregui/Views/InfoWidgets/InfoWidget.cpp
new file mode 100644
index 0000000..0c4f124
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/InfoWidget.cpp
@@ -0,0 +1,158 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/InfoWidget.cpp
+//! @brief     Implements class InfoWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InfoWidget.h"
+#include "InfoToolBar.h"
+#include "PySampleWidget.h"
+#include <QDebug>
+#include <QResizeEvent>
+#include <QVBoxLayout>
+
+namespace {
+const int minimum_widget_height = 25; // height of toolbar
+const int minimum_height_before_collapse = 40;
+}
+
+InfoWidget::InfoWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_infoToolBar(new InfoToolBar(this))
+    , m_pySampleWidget(new PySampleWidget(this))
+    , m_placeHolder(new QWidget(this))
+    , m_cached_height(200)
+{
+    setWindowTitle("Python Script Viewer");
+    setObjectName("PythonScriptViewer");
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(m_infoToolBar);
+    mainLayout->addWidget(m_placeHolder);
+    mainLayout->addWidget(m_pySampleWidget);
+
+    m_placeHolder->show();
+    m_pySampleWidget->hide();
+
+    mainLayout->setContentsMargins(0, 0, 0, 0);
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    setLayout(mainLayout);
+
+    connect(m_infoToolBar, SIGNAL(expandButtonClicked()), this, SLOT(onExpandButtonClicked()));
+    connect(m_infoToolBar, SIGNAL(closeButtonClicked()), this, SIGNAL(widgetCloseRequest()));
+
+}
+
+void InfoWidget::setSampleModel(SampleModel *sampleModel)
+{
+    Q_ASSERT(m_pySampleWidget);
+    m_pySampleWidget->setSampleModel(sampleModel);
+}
+
+void InfoWidget::setInstrumentModel(InstrumentModel *instrumentModel)
+{
+    Q_ASSERT(m_pySampleWidget);
+    m_pySampleWidget->setInstrumentModel(instrumentModel);
+}
+
+QSize InfoWidget::sizeHint() const
+{
+    QSize result = m_infoToolBar->sizeHint();
+    if(m_pySampleWidget->isHidden()) {
+        result.setHeight(m_infoToolBar->height() );
+    } else {
+        result.setHeight(m_pySampleWidget->height() + m_infoToolBar->height() );
+    }
+    qDebug() << "InfoWidget::sizeHint()" << result;
+    return result;
+}
+
+QSize InfoWidget::minimumSizeHint() const
+{
+    return QSize(minimum_widget_height, minimum_widget_height);
+}
+
+void InfoWidget::onDockVisibilityChange(bool is_visible)
+{
+    qDebug() << "InfoWidget::onDockVisibilityChange(bool status)" << is_visible << isEditorVisible();
+    Q_ASSERT(m_pySampleWidget);
+    if(isEditorVisible()) {
+        if(!is_visible) {
+            m_pySampleWidget->disableEditor();
+        } else {
+            //m_pySampleWidget->scheduleUpdate();
+            m_pySampleWidget->enableEditor();
+        }
+    }
+
+
+//    if(status != isEditorVisible())
+//        m_pySampleWidget->setEditorEnabled(status);
+}
+
+void InfoWidget::onExpandButtonClicked()
+{
+    qDebug() << "InfoWidget::onExpandButtonClicked()" << m_cached_height;
+    setEditorVisible(!isEditorVisible(), true);
+}
+
+//! sets the editor to be visible or not.
+//! @param dock_notify is used to inform parent QDockWidget about necessary adjustments
+//! in its own height
+void InfoWidget::setEditorVisible(bool editor_status, bool dock_notify)
+{
+    m_infoToolBar->setExpandStatus(editor_status);
+    if(editor_status) {
+        if(m_cached_height) {
+            if(dock_notify) emit widgetHeightRequest(m_cached_height);
+        }
+        m_placeHolder->hide();
+        m_pySampleWidget->show();
+        m_pySampleWidget->enableEditor();
+    } else {
+        m_cached_height = height();
+        m_pySampleWidget->hide();
+        m_pySampleWidget->disableEditor();
+        m_placeHolder->show();
+        if(dock_notify) emit widgetHeightRequest(minimum_widget_height);
+    }
+}
+
+//! Method watches over the height of the widget (which is triggered from outside, i.e. from
+//! DockWindow splitter) and if height becomes too small, disables python editor.
+//! Similarly, if widget is growing in height, the editor will be enabled back again
+void InfoWidget::resizeEvent(QResizeEvent *event)
+{
+    // widget is schrinking in height
+    if(event->oldSize().height() > event->size().height()) {
+        if(event->size().height() <= minimum_height_before_collapse && isEditorVisible()) {
+            setEditorVisible(false);
+        }
+    }
+
+    // widget is growing in height
+    if(event->oldSize().height() < event->size().height()) {
+        if(event->size().height() > minimum_height_before_collapse && !isEditorVisible()) {
+            setEditorVisible(true);
+        }
+    }
+
+    QWidget::resizeEvent(event);
+}
+
+bool InfoWidget::isEditorVisible()
+{
+    return m_pySampleWidget->isVisible();
+}
diff --git a/GUI/coregui/Views/InfoWidgets/InfoWidget.h b/GUI/coregui/Views/InfoWidgets/InfoWidget.h
new file mode 100644
index 0000000..0350b99
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/InfoWidget.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/InfoWidget.h
+//! @brief     Defines class InfoWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INFOWIDGET_H
+#define INFOWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class InfoToolBar;
+class SampleModel;
+class InstrumentModel;
+class PySampleWidget;
+
+//! The InfoWidget resides at the bottom of SampleView and displays a Python script
+class BA_CORE_API_ InfoWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit InfoWidget(QWidget *parent = 0);
+
+    void setSampleModel(SampleModel *sampleModel);
+    void setInstrumentModel(InstrumentModel *instrumentModel);
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+signals:
+    void widgetHeightRequest(int);
+    void widgetCloseRequest();
+
+public slots:
+    void onDockVisibilityChange(bool is_visible);
+
+private slots:
+    void onExpandButtonClicked();
+
+    void setEditorVisible(bool editor_status, bool dock_notify = false);
+
+protected:
+    void resizeEvent(QResizeEvent *);
+    bool isEditorVisible();
+
+private:
+    InfoToolBar *m_infoToolBar;
+    PySampleWidget *m_pySampleWidget;
+    QWidget *m_placeHolder;
+    int m_cached_height;
+};
+
+#endif // INFOWIDGET_H
diff --git a/GUI/coregui/Views/InfoWidgets/OverlayLabelController.cpp b/GUI/coregui/Views/InfoWidgets/OverlayLabelController.cpp
new file mode 100644
index 0000000..c85d924
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/OverlayLabelController.cpp
@@ -0,0 +1,75 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/OverlayLabelController.cpp
+//! @brief     Implements class OverlayLabelController
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "OverlayLabelController.h"
+#include "OverlayLabelWidget.h"
+#include <QAbstractScrollArea>
+#include <QDebug>
+#include <QEvent>
+#include <QRect>
+
+OverlayLabelController::OverlayLabelController(QObject *parent)
+    : QObject(parent)
+    , m_label(0)
+    , m_area(0)
+{
+
+}
+
+void OverlayLabelController::setText(const QString &text)
+{
+    m_text = text;
+}
+
+void OverlayLabelController::setArea(QAbstractScrollArea *area)
+{
+    m_area = area;
+    m_area->installEventFilter(this);
+}
+
+//! Shows/removes a label from the controlled widget
+
+void OverlayLabelController::setShown(bool shown)
+{
+    if(shown) {
+        Q_ASSERT(m_area);
+        if(!m_label) {
+            m_label = new OverlayLabelWidget(m_area);
+            m_label->setText(m_text);
+            updateLabelGeometry();
+            m_label->show();
+        }
+
+    } else {
+        delete m_label;
+        m_label = 0;
+    }
+}
+
+bool OverlayLabelController::eventFilter(QObject *obj, QEvent *event)
+{
+    if (event->type() == QEvent::Resize)
+        updateLabelGeometry();
+
+    return QObject::eventFilter(obj, event);
+}
+
+void OverlayLabelController::updateLabelGeometry()
+{
+    if(!m_label || !m_area) return;
+    m_label->setRectangle(QRect(0, 0, m_area->width(), m_area->height()));
+    m_label->setPosition(0, 0);
+}
diff --git a/GUI/coregui/Views/InfoWidgets/OverlayLabelController.h b/GUI/coregui/Views/InfoWidgets/OverlayLabelController.h
new file mode 100644
index 0000000..1aff76c
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/OverlayLabelController.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/OverlayLabelController.h
+//! @brief     Defines class OverlayLabelController
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OVERLAYLABELCONTROLLER_H
+#define OVERLAYLABELCONTROLLER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+#include <QString>
+
+class OverlayLabelWidget;
+class QAbstractScrollArea;
+
+//! The OverlayLabelController class controlls appearance of InfoLabelWidget (position, show/hide)
+//! on top of some scroll area.
+
+class BA_CORE_API_ OverlayLabelController : public QObject
+{
+    Q_OBJECT
+public:
+    OverlayLabelController(QObject *parent = 0);
+
+    void setText(const QString &text);
+
+    void setArea(QAbstractScrollArea *area);
+
+    void setShown(bool shown);
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *event);
+
+private:
+    void updateLabelGeometry();
+
+    OverlayLabelWidget *m_label;
+    QAbstractScrollArea *m_area;
+    QString m_text;
+};
+
+#endif // OVERLAYLABELCONTROLLER_H
diff --git a/GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.cpp b/GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.cpp
new file mode 100644
index 0000000..4e85057
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.cpp
+//! @brief     Implements class OverlayLabelWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "OverlayLabelWidget.h"
+#include "DesignerHelper.h"
+#include <QColor>
+#include <QFont>
+#include <QPainter>
+
+OverlayLabelWidget::OverlayLabelWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_bounding_rect(QRect(0,0,10,10))
+{
+    setAttribute(Qt::WA_TransparentForMouseEvents);
+}
+
+void OverlayLabelWidget::setRectangle(const QRect &rect)
+{
+    m_bounding_rect = rect;
+}
+
+void OverlayLabelWidget::setPosition(int x, int y)
+{
+    setGeometry(x, y, m_bounding_rect.width(), m_bounding_rect.height());
+}
+
+void OverlayLabelWidget::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event);
+    QPainter painter(this);
+    painter.setBrush(QColor(Qt::lightGray));
+    QFont serifFont("Monospace", DesignerHelper::getHeaderFontSize(),
+                    QFont::Normal, true);
+    painter.setFont(serifFont);
+//    painter.drawRect(m_bounding_rect);
+    painter.drawText(m_bounding_rect, Qt::AlignCenter, m_text);
+}
diff --git a/GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.h b/GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.h
new file mode 100644
index 0000000..01c50a0
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/OverlayLabelWidget.h
+//! @brief     Defines class OverlayLabelWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OVERLAYLABELWIDGET_H
+#define OVERLAYLABELWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QRect>
+#include <QString>
+#include <QWidget>
+
+//! The OverlayLabelWidget is a semi-transparent overlay label to place on top of other
+//! widgets outside of any layout context.
+
+class BA_CORE_API_ OverlayLabelWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    OverlayLabelWidget(QWidget *parent = 0);
+
+    void setRectangle(const QRect &rect);
+    void setPosition(int x, int y);
+
+    void setText(const QString &text) {m_text = text;}
+
+protected:
+    void paintEvent(QPaintEvent *event);
+
+private:
+    QString m_text;
+    QRect m_bounding_rect;
+};
+
+#endif // OVERLAYLABELWIDGET_H
diff --git a/GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.cpp b/GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.cpp
new file mode 100644
index 0000000..34bb734
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.cpp
@@ -0,0 +1,304 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.cpp
+//! @brief     Implements class ProjectLoadWarningDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ProjectLoadWarningDialog.h"
+#include "DesignerHelper.h"
+#include "GUIHelpers.h"
+#include "GUIMessage.h"
+#include "MessageContainer.h"
+#include "SessionModel.h"
+#include "WarningMessageService.h"
+#include <QBoxLayout>
+#include <QDebug>
+#include <QFrame>
+#include <QGridLayout>
+#include <QHeaderView>
+#include <QLabel>
+#include <QPushButton>
+#include <QTableWidget>
+#include <QTableWidgetItem>
+#include <QTextEdit>
+
+namespace {
+const int top_panel_height = 80;
+}
+
+ProjectLoadWarningDialog::ProjectLoadWarningDialog(QWidget *parent,
+                                                   const WarningMessageService *messageService,
+                                                   const QString &documentVersion)
+    : QDialog(parent), m_messageService(messageService)
+    , m_projectDocumentVersion(documentVersion)
+{
+    setMinimumSize(256, 256);
+    resize(520, 620);
+    setWindowTitle("Problems encountered while loading project");
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    //setModal(true);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+
+    mainLayout->addWidget(createTopPanel());
+    mainLayout->addWidget(createModelInfoPanel());
+    mainLayout->addWidget(createExplanationPanel());
+    mainLayout->addWidget(createDetailsPanel());
+
+    QPushButton *button = new QPushButton("Close", this);
+    button->setAutoDefault(false);
+    connect(button, SIGNAL(clicked()), this, SLOT(close()));
+
+    QHBoxLayout *buttonLayout = new QHBoxLayout;
+    buttonLayout->addStretch(3);
+//    buttonLayout->setContentsMargins(0, 8, 5, 0);
+    buttonLayout->setContentsMargins(0, 0, 0, 0);
+    buttonLayout->addWidget(button);
+
+    mainLayout->addLayout(buttonLayout);
+
+    setLayout(mainLayout);
+
+    setAttribute(Qt::WA_DeleteOnClose, true);
+}
+
+//! Top panel with warning icon and the header
+QWidget *ProjectLoadWarningDialog::createTopPanel()
+{
+    QWidget *result = new QWidget(this);
+    QHBoxLayout *layout = new QHBoxLayout;
+
+    // ---
+    QLabel *warningLabel = new QLabel;
+    warningLabel->setPixmap(QPixmap(":/images/warning_64x64.png"));
+
+    QWidget *warningWidget = new QWidget;
+    warningWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    warningWidget->resize(top_panel_height,top_panel_height);
+    QHBoxLayout *warningWidgetLayout = new QHBoxLayout;
+    warningWidgetLayout->addWidget(warningLabel);
+    warningWidget->setLayout(warningWidgetLayout);
+
+    QFont titleFont;
+    titleFont.setPointSize(DesignerHelper::getSectionFontSize());
+    titleFont.setBold(true);
+
+    QLabel *messageLabel = new QLabel();
+    messageLabel->setFont(titleFont);
+    messageLabel->setText("Some parts of the project were not loaded correctly.");
+    messageLabel->setWordWrap(true);
+
+    layout->addWidget(warningWidget);
+    layout->addWidget(messageLabel);
+
+    layout ->setContentsMargins(0, 0, 0, 0);
+
+    result->setLayout(layout);
+    return result;
+}
+
+//! Info panel with summary over warnings in different models
+QWidget *ProjectLoadWarningDialog::createModelInfoPanel()
+{
+    QWidget *result = new QWidget(this);
+    QHBoxLayout *layout = new QHBoxLayout;
+
+    QFrame* line = new QFrame();
+    line->setFrameShape(QFrame::VLine);
+    line->setFrameShadow(QFrame::Sunken);
+
+
+    QGridLayout *gridLayout = new QGridLayout;
+
+    QStringList names = getModelNames();
+    for(int irow=0; irow<names.size(); ++irow) {
+        gridLayout->addWidget(new QLabel(names.at(irow)), irow, 0);
+        gridLayout->addWidget(createModelStatusLabel(names.at(irow)), irow, 1);
+    }
+
+    layout->addWidget(line);
+    layout->addLayout(gridLayout);
+    layout->addWidget(new QWidget);
+
+    layout ->setContentsMargins(0, 0, 0, 0);
+
+    result->setLayout(layout);
+    return result;
+}
+
+//! Info panel with explanations what had happened and what to do
+QWidget *ProjectLoadWarningDialog::createExplanationPanel()
+{
+    QWidget *result = new QWidget(this);
+    QVBoxLayout *layout = new QVBoxLayout;
+
+    QFont titleFont;
+    titleFont.setPointSize(DesignerHelper::getSectionFontSize());
+    titleFont.setBold(true);
+
+    QLabel *whyLabel = new QLabel;
+    whyLabel->setFont(titleFont);
+    whyLabel->setText("Why did this happen to me?");
+
+    QLabel *explanationLabel = new QLabel;
+    explanationLabel->setText(getExplanationText());
+    explanationLabel->setWordWrap(true);
+
+    QLabel *whatLabel = new QLabel;
+    whatLabel->setFont(titleFont);
+    whatLabel->setText("What to do?");
+
+    QLabel *adviceLabel = new QLabel;
+    QString adviceText(
+        "Check parameters of your items and re-enter uninitialized values. "
+        "Use detailed log below to get a hint what went wrong. "
+        "After that, save you project and work as normal."
+                );
+    adviceLabel->setText(adviceText);
+    adviceLabel->setWordWrap(true);
+
+    layout->addWidget(whyLabel);
+    layout->addWidget(explanationLabel);
+    layout->addWidget(whatLabel);
+    layout->addWidget(adviceLabel);
+
+    layout ->setContentsMargins(0, 0, 0, 0);
+
+    result->setLayout(layout);
+    return result;
+}
+
+//! Info panel with table widget containing error messages
+QWidget *ProjectLoadWarningDialog::createDetailsPanel()
+{
+    QWidget *result = new QWidget(this);
+    QVBoxLayout *layout = new QVBoxLayout;
+
+    QFont titleFont;
+    titleFont.setPointSize(DesignerHelper::getSectionFontSize());
+    titleFont.setBold(true);
+
+    QLabel *detailsLabel = new QLabel;
+    detailsLabel->setFont(titleFont);
+    detailsLabel->setText("Details");
+
+    layout->addWidget(detailsLabel);
+    layout->addWidget(createTableWidget());
+
+    layout ->setContentsMargins(0, 0, 0, 0);
+
+    result->setLayout(layout);
+    return result;
+}
+
+//! Creates QTableWidget and fills it with error messages
+QTableWidget *ProjectLoadWarningDialog::createTableWidget()
+{
+    Q_ASSERT(m_messageService);
+    QTableWidget *result = new QTableWidget;
+
+    result->setRowCount(getNumberOfTableRows());
+    result->setColumnCount(getTableHeaderLabels().size());
+    result->setHorizontalHeaderLabels(getTableHeaderLabels());
+    result->verticalHeader()->setVisible(false);
+    result->horizontalHeader()->setStretchLastSection(true);
+
+    int rowCount(0);
+    for (WarningMessageService::container_t::const_iterator it = m_messageService->begin();
+         it != m_messageService->end(); ++it) {
+        const MessageContainer *messageContainer = it.value();
+        for (MessageContainer::const_iterator it = messageContainer->begin();
+             it != messageContainer->end(); ++it) {
+            const GUIMessage *guiMessage = (*it);
+            // item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
+
+            result->setItem(rowCount, 0, createTableItem(guiMessage->getSenderName()));
+            result->setItem(rowCount, 1, createTableItem(guiMessage->getMessageType()));
+            result->setItem(rowCount, 2, createTableItem(guiMessage->getMessageDescription()));
+            ++rowCount;
+        }
+    }
+
+    return result;
+}
+
+//! Returns number of rows in table with error messages, each row represents an error message
+int ProjectLoadWarningDialog::getNumberOfTableRows() const
+{
+    Q_ASSERT(m_messageService);
+    int result(0);
+    for(WarningMessageService::container_t::const_iterator it=m_messageService->begin(); it!=m_messageService->end(); ++it) {
+        result += it.value()->size();
+    }
+    return result;
+}
+
+//! Returns labels for table header
+QStringList ProjectLoadWarningDialog::getTableHeaderLabels() const
+{
+    QStringList result;
+    result << "Sender" << "Warning" << "Description";
+    return result;
+}
+
+QTableWidgetItem *ProjectLoadWarningDialog::createTableItem(const QString &name)
+{
+  QTableWidgetItem *result = new QTableWidgetItem(name);
+  result->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
+  return result;
+}
+
+
+//! Returns list of model names to form summary
+QStringList ProjectLoadWarningDialog::getModelNames() const
+{
+    QStringList names;
+    names << SessionXML::MaterialModelTag << SessionXML::InstrumentModelTag
+          << SessionXML::SampleModelTag << SessionXML::JobModelTag;
+    return names;
+}
+
+//! create status label "OK"/"WARNING" depending on presence of warning messages in the container
+QLabel *ProjectLoadWarningDialog::createModelStatusLabel(const QString &model_name) const
+{
+    QLabel *result = new QLabel("OK");
+    for (WarningMessageService::container_t::const_iterator it = m_messageService->begin();
+         it != m_messageService->end(); ++it) {
+
+        const MessageContainer *messageContainer = it.value();
+        if (model_name == it.key()->objectName() && messageContainer->size()) {
+            result->setText("WARNING");
+        }
+    }
+    return result;
+}
+
+//! Returns explanations what went wrong.
+QString ProjectLoadWarningDialog::getExplanationText() const
+{
+    QString result;
+    if(m_projectDocumentVersion != GUIHelpers::getBornAgainVersionString()) {
+        result = QString(
+                    "Given project was created using BornAgain version %1 "
+                    " which is different from version %2 you are currently using. "
+                    "At the moment we provide only limited support for import from older versions."
+                    ).arg(m_projectDocumentVersion).arg(GUIHelpers::getBornAgainVersionString());
+    } else {
+        result = QString(
+            "Given project was created using BornAgain version %1 "
+            "which is the same as the current version of the framework. "
+            "Strangely enough, some parts was not loaded correctly due to format mismatch. "
+            "Please contact developpers.").arg(m_projectDocumentVersion);
+    }
+    return result;
+}
diff --git a/GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.h b/GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.h
new file mode 100644
index 0000000..4da9469
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/ProjectLoadWarningDialog.h
+//! @brief     Defines class ProjectLoadWarningDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROJECTLOADWARNINGDIALOG_H
+#define PROJECTLOADWARNINGDIALOG_H
+
+#include <QDialog>
+#include <QStringList>
+
+class WarningMessageService;
+class QTableWidget;
+class QLabel;
+class QTableWidgetItem;
+
+//! @class ProjectLoadWarningDialog
+//! @brief The dialog to inform user about encountered problems during the loading of old project
+
+class ProjectLoadWarningDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    ProjectLoadWarningDialog(QWidget *parent, const WarningMessageService *messageService = 0,
+            const QString &documentVersion = QString());
+
+private:
+    QWidget *createTopPanel();
+    QWidget *createModelInfoPanel();
+    QWidget *createExplanationPanel();
+    QWidget *createDetailsPanel();
+    QTableWidget *createTableWidget();
+    int getNumberOfTableRows() const;
+    QStringList getTableHeaderLabels() const;
+    QTableWidgetItem *createTableItem(const QString &name);
+
+    QStringList getModelNames() const;
+    QLabel *createModelStatusLabel(const QString &model_name) const;
+
+    QString getExplanationText() const;
+
+    const WarningMessageService *m_messageService;
+    QString m_projectDocumentVersion;
+};
+
+#endif // PROJECTLOADWARNINGDIALOG_H
diff --git a/GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp b/GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp
new file mode 100644
index 0000000..0c144e6
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp
@@ -0,0 +1,290 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/PySampleWidget.cpp
+//! @brief     Implements class PySampleWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PySampleWidget.h"
+#include "DesignerHelper.h"
+#include "DomainObjectBuilder.h"
+#include "InstrumentModel.h"
+#include "MultiLayer.h"
+#include "ExportToPython.h"
+#include "PythonSyntaxHighlighter.h"
+#include "SampleModel.h"
+#include "WarningSignWidget.h"
+#include <QDebug>
+#include <QFile>
+#include <QModelIndex>
+#include <QPainter>
+#include <QPixmap>
+#include <QScrollBar>
+#include <QTextCodec>
+#include <QTextEdit>
+#include <QTextStream>
+#include <QTimer>
+#include <QVBoxLayout>
+
+namespace {
+const int timer_interval_msec = 10;
+const int accumulate_updates_during_msec = 20.;
+const int warning_sign_xpos = 38;
+const int warning_sign_ypos = 38;
+
+const QString welcome_message =
+"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta http-equiv=\"Content-Type\" "
+"content=\"text/html; charset=UTF-8\" /><title>QTextEdit Example</title><style type=\"text/css\">"
+"p, li { white-space: pre-wrap; }</style></head><body style=\" font-family:'Helvetica';"
+" font-size:10pt; font-weight:400; font-style:normal;\"><p align=\"center\" style=\""
+" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0;"
+" text-indent:0px;\"><span style=\" font-size:14pt;\">Sample Script View</span></p>"
+"<p align=\"justify\" style=\" margin-top:12px; margin-bottom:12px; margin-left:0px;"
+" margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt;\">"
+"The Sample Script View displays Python code corresponding to the sample being constructed."
+" Start building a multilayer and corresponding code snippet will start appear in this window."
+"</span></p>"
+"<ul type=\"circle\" style=\"margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:"
+" 0px; -qt-list-indent: 1;\"><li style=\" font-size:10pt;\" align=\"justify\" style=\""
+" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0;"
+" text-indent:0px;\">This is an experimental feature and is provided as tech preview only</li>"
+"<li style=\" font-size:10pt;\" align=\"justify\" style=\" margin-top:12px; margin-bottom:12px;"
+" margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+"Only items which are connected to the multilayer will be translated</li></ul>"
+"<p style=\"-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px;"
+" margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;\"><br /></p></body></html>";
+}
+
+PySampleWidget::PySampleWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_textEdit(new QTextEdit)
+    , m_sampleModel(0)
+    , m_instrumentModel(0)
+    , m_time_to_update(accumulate_updates_during_msec)
+    , m_n_of_sceduled_updates(-1)
+    , m_highlighter(0)
+    , m_warningSign(0)
+{
+    m_textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setContentsMargins(0, 0, 0, 0);
+    mainLayout->addWidget(m_textEdit);
+
+    setLayout(mainLayout);
+
+    m_timer = new QTimer(this);
+    m_timer->setInterval(timer_interval_msec);
+    connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimerTimeout()));
+
+    m_textEdit->setHtml(getWelcomeMessage());
+    m_textEdit->setReadOnly(true);
+    QFont textFont("Monospace");
+    m_textEdit->setFont(textFont);
+    m_textEdit->setFontPointSize(DesignerHelper::getPythonEditorFontSize());
+
+    // FIXME First appearance of the editor takes ~0.3sec delay which is unconfortable.
+    // It can be made faster, if one uncomment line below. But we would like to have it
+    // commented because of welcome message (we need to wrap welcome message).
+    //m_textEdit->setLineWrapMode(QTextEdit::NoWrap);
+}
+
+void PySampleWidget::setSampleModel(SampleModel *sampleModel)
+{
+    Q_ASSERT(sampleModel);
+    if(sampleModel != m_sampleModel) {
+        if(m_sampleModel) disableEditor();
+        m_sampleModel = sampleModel;
+    }
+}
+
+void PySampleWidget::setInstrumentModel(InstrumentModel *instrumentModel)
+{
+    Q_ASSERT(instrumentModel);
+    m_instrumentModel = instrumentModel;
+}
+
+void PySampleWidget::onModifiedRow(const QModelIndex &, int, int)
+{
+    //if(m_sampleModel->getSampleMap().empty()) return;
+    scheduleUpdate();
+}
+
+void PySampleWidget::onDataChanged(const QModelIndex &, const QModelIndex &)
+{
+    //if(m_sampleModel->getSampleMap().empty()) return;
+    scheduleUpdate();
+}
+
+//! Schedule subsequent update of the editor
+void PySampleWidget::scheduleUpdate()
+{
+    m_n_of_sceduled_updates++;
+    qDebug() << "PySampleWidget::scheduleUpdate()" << m_n_of_sceduled_updates;
+    if(!m_timer->isActive()) m_timer->start();
+}
+
+//! Update the editor with the script content
+void PySampleWidget::updateEditor()
+{
+    if(!m_highlighter) {
+        m_highlighter = new PythonSyntaxHighlighter(m_textEdit->document());
+        m_textEdit->setLineWrapMode(QTextEdit::NoWrap);
+    }
+
+    Q_ASSERT(!m_timer->isActive());
+    qDebug() << "PySampleWidget::updateEditor() -> begin" << m_n_of_sceduled_updates;
+    m_n_of_sceduled_updates = 0;
+
+    const int old_scrollbar_value = m_textEdit->verticalScrollBar()->value();
+
+    QString code_snippet = generateCodeSnippet();
+    if(!m_warningSign) m_textEdit->clear();
+
+    if(!code_snippet.isEmpty()) {
+        m_textEdit->setText(code_snippet);
+    }
+
+    m_textEdit->verticalScrollBar()->setValue(old_scrollbar_value);
+
+    m_time_to_update = accumulate_updates_during_msec;
+}
+
+//! Disconnect from all signals to prevent editor update
+void PySampleWidget::disableEditor()
+{
+    Q_ASSERT(m_sampleModel);
+    m_timer->stop();
+    disconnect(m_sampleModel, SIGNAL(rowsInserted(QModelIndex, int,int)),
+               this, SLOT(onModifiedRow(QModelIndex,int,int)));
+    disconnect(m_sampleModel, SIGNAL(rowsRemoved(QModelIndex, int,int)),
+               this, SLOT(onModifiedRow(QModelIndex,int,int)));
+    disconnect(m_sampleModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+               this, SLOT(onDataChanged(QModelIndex,QModelIndex)));
+    disconnect(m_sampleModel, SIGNAL(modelReset()),
+               this, SLOT(updateEditor()));
+}
+
+void PySampleWidget::enableEditor()
+{
+    Q_ASSERT(m_sampleModel);
+
+    if(m_sampleModel->topItems().isEmpty()) {
+        // negative number would mean that editor was never used and still contains welcome message
+        // which we want to keep
+        if(m_n_of_sceduled_updates >= 0) updateEditor();
+    } else {
+        updateEditor();
+    }
+
+    connect(m_sampleModel, SIGNAL(rowsInserted(QModelIndex, int,int)),
+            this, SLOT(onModifiedRow(QModelIndex,int,int)), Qt::UniqueConnection);
+    connect(m_sampleModel, SIGNAL(rowsRemoved(QModelIndex, int,int)),
+            this, SLOT(onModifiedRow(QModelIndex,int,int)), Qt::UniqueConnection);
+    connect(m_sampleModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+            this, SLOT(onDataChanged(QModelIndex,QModelIndex)), Qt::UniqueConnection);
+    connect(m_sampleModel, SIGNAL(modelReset()),
+            this, SLOT(updateEditor()), Qt::UniqueConnection);
+}
+
+//! Triggers the update of the editor
+void PySampleWidget::onTimerTimeout()
+{
+    qDebug() << "PySampleWidget::onTimerTimeout()" << m_time_to_update
+             << "scheduled updates" << m_n_of_sceduled_updates;
+    m_time_to_update -= timer_interval_msec;
+
+    if(m_time_to_update < 0) {
+        m_timer->stop();
+        updateEditor();
+    }
+}
+
+//! adjusts position of warning label on widget move
+void PySampleWidget::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED(event);
+    if(m_warningSign) {
+        QPoint pos = getPositionForWarningSign();
+        m_warningSign->setPosition(pos.x(),pos.y());
+    }
+}
+
+//! generates string representing code snippet for all multi layers in the model
+QString PySampleWidget::generateCodeSnippet()
+{
+    delete m_warningSign;
+    m_warningSign = 0;
+
+    QString result;
+
+    foreach(SessionItem *sampleItem, m_sampleModel->topItems()) {
+        DomainObjectBuilder builder;
+        try {
+            auto P_multilayer = builder.buildMultiLayer(*sampleItem);
+            ExportToPython visitor(*P_multilayer);
+            std::ostringstream ostr;
+            ostr << visitor.defineGetSample();
+            if(!result.isEmpty()) result.append("\n");
+            result.append(QString::fromStdString(ostr.str()));
+        } catch(const std::exception &ex) {
+            m_warningSign = new WarningSignWidget(this);
+
+            QString message = QString(
+                "Generation of Python Script failed. Code is not complete.\n\n"
+                "It can happen if sample requires further assembling or some of sample parameters "
+                "are not valid. See details below.\n\n%1").arg(QString::fromStdString(ex.what()));
+
+            m_warningSign->setWarningMessage(message);
+            QPoint pos = getPositionForWarningSign();
+            m_warningSign->setPosition(pos.x(), pos.y());
+            m_warningSign->show();
+        }
+    }
+
+    return result;
+}
+
+//! Returns position for warning sign at the bottom right corner of the editor. The position will
+//! be adjusted according to the visibility of scroll bars
+QPoint PySampleWidget::getPositionForWarningSign()
+{
+    int x = width() -warning_sign_xpos;
+    int y = height()-warning_sign_ypos;
+
+    if(QScrollBar *horizontal = m_textEdit->horizontalScrollBar()) {
+        if(horizontal->isVisible())
+            y -= horizontal->height();
+    }
+
+    if(QScrollBar *vertical = m_textEdit->verticalScrollBar()) {
+        if(vertical->isVisible())
+            x -= vertical->width();
+    }
+
+    return QPoint(x, y);
+}
+
+//! returns welcome message with fonts adjusted to the system
+QString PySampleWidget::getWelcomeMessage()
+{
+    QString result = welcome_message;
+
+    result.replace("font-size:10pt;", QString("font-size:%1pt;")
+                   .arg(DesignerHelper::getPythonEditorFontSize()));
+
+    result.replace("font-size:14pt;", QString("font-size:%1pt;")
+                   .arg(DesignerHelper::getPythonEditorFontSize()+2));
+
+    return result;
+}
diff --git a/GUI/coregui/Views/InfoWidgets/PySampleWidget.h b/GUI/coregui/Views/InfoWidgets/PySampleWidget.h
new file mode 100644
index 0000000..093b737
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/PySampleWidget.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/PySampleWidget.h
+//! @brief     Defines class PySampleWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PYSAMPLEWIDGET_H
+#define PYSAMPLEWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class SampleModel;
+class InstrumentModel;
+class QTextEdit;
+class QModelIndex;
+class QTimer;
+class PythonSyntaxHighlighter;
+class WarningSignWidget;
+
+//! The PySampleWidget displays Python script representing a MultiLayer at the bottom of SampleView
+//! Belongs to InfoWidget
+class BA_CORE_API_ PySampleWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    PySampleWidget(QWidget *parent = 0);
+
+    void setSampleModel(SampleModel *sampleModel);
+    void setInstrumentModel(InstrumentModel *instrumentModel);
+
+public slots:
+    void onModifiedRow(const QModelIndex &, int, int);
+    void onDataChanged(const QModelIndex &, const QModelIndex &);
+
+    void scheduleUpdate();
+    void updateEditor();
+
+    void disableEditor();
+    void enableEditor();
+
+private slots:
+    void onTimerTimeout();
+
+protected:
+    void resizeEvent(QResizeEvent *event);
+
+private:
+    QString generateCodeSnippet();
+    QPoint getPositionForWarningSign();
+    QString getWelcomeMessage();
+
+    QTextEdit *m_textEdit;
+    SampleModel *m_sampleModel;
+    InstrumentModel *m_instrumentModel;
+    QTimer *m_timer;
+    int m_time_to_update;
+    int m_n_of_sceduled_updates;
+    PythonSyntaxHighlighter *m_highlighter;
+    WarningSignWidget *m_warningSign;
+};
+
+#endif // PYSAMPLEWIDGET_H
diff --git a/GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.cpp b/GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.cpp
new file mode 100644
index 0000000..8422387
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.cpp
@@ -0,0 +1,254 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.cpp
+//! @brief     Defines class PythonSyntaxHighlighter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+/*
+This is a C++ port of the following PyQt example
+http://diotavelli.net/PyQtWiki/Python%20syntax%20highlighting
+C++ port by Frankie Simon (docklight.de, www.fuh-edv.de)
+
+The following free software license applies for this file ("X11 license"):
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "PythonSyntaxHighlighter.h"
+
+PythonSyntaxHighlighter::PythonSyntaxHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent)
+{
+    keywords = QStringList() << "and"
+                             << "assert"
+                             << "break"
+                             << "class"
+                             << "continue"
+                             << "def"
+                             << "del"
+                             << "elif"
+                             << "else"
+                             << "except"
+                             << "exec"
+                             << "finally"
+                             << "for"
+                             << "from"
+                             << "global"
+                             << "if"
+                             << "import"
+                             << "in"
+                             << "is"
+                             << "lambda"
+                             << "not"
+                             << "or"
+                             << "pass"
+                             << "print"
+                             << "raise"
+                             << "return"
+                             << "try"
+                             << "while"
+                             << "yield"
+                             << "None"
+                             << "True"
+                             << "False";
+
+    operators = QStringList() << "=" <<
+                // Comparison
+                "=="
+                              << "!="
+                              << "<"
+                              << "<="
+                              << ">"
+                              << ">=" <<
+                // Arithmetic
+                "\\+"
+                              << "-"
+                              << "\\*"
+                              << "/"
+                              << "//"
+                              << "%"
+                              << "\\*\\*" <<
+                // In-place
+                "\\+="
+                              << "-="
+                              << "\\*="
+                              << "/="
+                              << "%=" <<
+                // Bitwise
+                "\\^"
+                              << "\\|"
+                              << "&"
+                              << "~"
+                              << ">>"
+                              << "<<";
+
+    braces = QStringList() << "{"
+                           << "}"
+                           << "\\("
+                           << "\\)"
+                           << "\\["
+                           << "]";
+
+    basicStyles.insert("keyword", getTextCharFormat("blue"));
+    basicStyles.insert("operator", getTextCharFormat("red"));
+    basicStyles.insert("brace", getTextCharFormat("darkGray"));
+    basicStyles.insert("defclass", getTextCharFormat("black", "bold"));
+    basicStyles.insert("brace", getTextCharFormat("black"));
+    basicStyles.insert("string", getTextCharFormat("magenta"));
+    basicStyles.insert("string2", getTextCharFormat("darkMagenta"));
+    basicStyles.insert("comment", getTextCharFormat("darkGreen", "italic"));
+    basicStyles.insert("self", getTextCharFormat("black", "italic"));
+    basicStyles.insert("numbers", getTextCharFormat("brown"));
+
+    triSingleQuote.setPattern("'''");
+    triDoubleQuote.setPattern("\"\"\"");
+
+    initializeRules();
+}
+
+void PythonSyntaxHighlighter::initializeRules()
+{
+    foreach (QString currKeyword, keywords) {
+        rules.append(HighlightingRule(QString("\\b%1\\b").arg(currKeyword), 0,
+                                      basicStyles.value("keyword")));
+    }
+    foreach (QString currOperator, operators) {
+        rules.append(
+            HighlightingRule(QString("%1").arg(currOperator), 0, basicStyles.value("operator")));
+    }
+    foreach (QString currBrace, braces) {
+        rules.append(HighlightingRule(QString("%1").arg(currBrace), 0, basicStyles.value("brace")));
+    }
+    // 'self'
+    rules.append(HighlightingRule("\\bself\\b", 0, basicStyles.value("self")));
+
+    // Double-quoted string, possibly containing escape sequences
+    // FF: originally in python : r'"[^"\\]*(\\.[^"\\]*)*"'
+    rules.append(
+        HighlightingRule("\"[^\"\\\\]*(\\\\.[^\"\\\\]*)*\"", 0, basicStyles.value("string")));
+    // Single-quoted string, possibly containing escape sequences
+    // FF: originally in python : r"'[^'\\]*(\\.[^'\\]*)*'"
+    rules.append(HighlightingRule("'[^'\\\\]*(\\\\.[^'\\\\]*)*'", 0, basicStyles.value("string")));
+
+    // 'def' followed by an identifier
+    // FF: originally: r'\bdef\b\s*(\w+)'
+    rules.append(HighlightingRule("\\bdef\\b\\s*(\\w+)", 1, basicStyles.value("defclass")));
+    //  'class' followed by an identifier
+    // FF: originally: r'\bclass\b\s*(\w+)'
+    rules.append(HighlightingRule("\\bclass\\b\\s*(\\w+)", 1, basicStyles.value("defclass")));
+
+    // From '#' until a newline
+    // FF: originally: r'#[^\\n]*'
+    rules.append(HighlightingRule("#[^\\n]*", 0, basicStyles.value("comment")));
+
+    // Numeric literals
+    rules.append(HighlightingRule("\\b[+-]?[0-9]+[lL]?\\b", 0,
+                                  basicStyles.value("numbers"))); // r'\b[+-]?[0-9]+[lL]?\b'
+    rules.append(
+        HighlightingRule("\\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\\b", 0,
+                         basicStyles.value("numbers"))); // r'\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b'
+    rules.append(HighlightingRule(
+        "\\b[+-]?[0-9]+(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b", 0,
+        basicStyles.value("numbers"))); // r'\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b'
+}
+
+void PythonSyntaxHighlighter::highlightBlock(const QString &text)
+{
+    foreach (HighlightingRule currRule, rules) {
+        int idx = currRule.pattern.indexIn(text, 0);
+        while (idx >= 0) {
+            // Get index of Nth match
+            idx = currRule.pattern.pos(currRule.nth);
+            int length = currRule.pattern.cap(currRule.nth).length();
+            setFormat(idx, length, currRule.format);
+            idx = currRule.pattern.indexIn(text, idx + length);
+        }
+    }
+
+    setCurrentBlockState(0);
+
+    // Do multi-line strings
+    bool isInMultilne = matchMultiline(text, triSingleQuote, 1, basicStyles.value("string2"));
+    if (!isInMultilne)
+        isInMultilne = matchMultiline(text, triDoubleQuote, 2, basicStyles.value("string2"));
+}
+
+bool PythonSyntaxHighlighter::matchMultiline(const QString &text, const QRegExp &delimiter,
+                                             const int inState, const QTextCharFormat &style)
+{
+    int start = -1;
+    int add = -1;
+    int end = -1;
+    int length = 0;
+
+    // If inside triple-single quotes, start at 0
+    if (previousBlockState() == inState) {
+        start = 0;
+        add = 0;
+    }
+    // Otherwise, look for the delimiter on this line
+    else {
+        start = delimiter.indexIn(text);
+        // Move past this match
+        add = delimiter.matchedLength();
+    }
+
+    // As long as there's a delimiter match on this line...
+    while (start >= 0) {
+        // Look for the ending delimiter
+        end = delimiter.indexIn(text, start + add);
+        // Ending delimiter on this line?
+        if (end >= add) {
+            length = end - start + add + delimiter.matchedLength();
+            setCurrentBlockState(0);
+        }
+        // No; multi-line string
+        else {
+            setCurrentBlockState(inState);
+            length = text.length() - start + add;
+        }
+        // Apply formatting and look for next
+        setFormat(start, length, style);
+        start = delimiter.indexIn(text, start + length);
+    }
+    // Return True if still inside a multi-line string, False otherwise
+    if (currentBlockState() == inState)
+        return true;
+    else
+        return false;
+}
+
+const QTextCharFormat PythonSyntaxHighlighter::getTextCharFormat(const QString &colorName,
+                                                                 const QString &style)
+{
+    QTextCharFormat charFormat;
+    QColor color(colorName);
+    charFormat.setForeground(color);
+    if (style.contains("bold", Qt::CaseInsensitive))
+        charFormat.setFontWeight(QFont::Bold);
+    if (style.contains("italic", Qt::CaseInsensitive))
+        charFormat.setFontItalic(true);
+    return charFormat;
+}
diff --git a/GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.h b/GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.h
new file mode 100644
index 0000000..24a708a
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.h
@@ -0,0 +1,95 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/PythonSyntaxHighlighter.h
+//! @brief     Defines class PythonSyntaxHighlighter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+/*
+This is a C++ port of the following PyQt example
+http://diotavelli.net/PyQtWiki/Python%20syntax%20highlighting
+C++ port by Frankie Simon (docklight.de, www.fuh-edv.de)
+
+The following free software license applies for this file ("X11 license"):
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef PYTHONSYNTAXHIGHLIGHTER_H
+#define PYTHONSYNTAXHIGHLIGHTER_H
+
+#include <QSyntaxHighlighter>
+
+//! Container to describe a highlighting rule. Based on a regular expression, a relevant match # and the format.
+class HighlightingRule
+{
+public:
+    HighlightingRule(const QString &patternStr, int n, const QTextCharFormat &matchingFormat)
+    {
+        originalRuleStr = patternStr;
+        pattern = QRegExp(patternStr);
+        nth = n;
+        format = matchingFormat;
+    }
+    QString originalRuleStr;
+    QRegExp pattern;
+    int nth;
+    QTextCharFormat format;
+};
+
+//! Implementation of highlighting for Python code.
+class PythonSyntaxHighlighter : public QSyntaxHighlighter
+{
+    Q_OBJECT
+public:
+    PythonSyntaxHighlighter(QTextDocument *parent = 0);
+
+protected:
+    void highlightBlock(const QString &text);
+
+private:
+    QStringList keywords;
+    QStringList operators;
+    QStringList braces;
+
+    QHash<QString, QTextCharFormat> basicStyles;
+
+    void initializeRules();
+
+    //! Highlighst multi-line strings, returns true if after processing we are still within the
+    //multi-line section.
+    bool matchMultiline(const QString &text, const QRegExp &delimiter, const int inState,
+                        const QTextCharFormat &style);
+    const QTextCharFormat getTextCharFormat(const QString &colorName,
+                                            const QString &style = QString());
+
+    QList<HighlightingRule> rules;
+    QRegExp triSingleQuote;
+    QRegExp triDoubleQuote;
+};
+
+#endif // PYTHONSYNTAXHIGHLIGHTER_H
+
+
diff --git a/GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp
new file mode 100644
index 0000000..ba415e5
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/WarningSignWidget.cpp
+//! @brief     Implements class WarningSignWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "WarningSignWidget.h"
+#include <QMessageBox>
+#include <QPainter>
+#include <QRect>
+
+WarningSignWidget::WarningSignWidget(QWidget * parent)
+    : QWidget(parent)
+{
+    setAttribute(Qt::WA_NoSystemBackground);
+    //setAttribute(Qt::WA_TransparentForMouseEvents);
+    m_pixmap = QPixmap(":/images/warning at 2x.png");
+    setToolTip(QString(
+        "Houston, we have a problem.\n"
+        "Click to see details."
+                   ));
+}
+
+void WarningSignWidget::paintEvent(QPaintEvent *event) {
+    Q_UNUSED(event);
+    QPainter painter(this);
+    QRect target(m_pixmap.rect());
+    painter.drawPixmap(target, m_pixmap);
+}
+
+void WarningSignWidget::mousePressEvent(QMouseEvent *event)
+{
+    Q_UNUSED(event);
+    QMessageBox::warning(this, "Houston, we have a problem.", m_warning_message);
+}
+
+//! set geometry of widget around center point
+void WarningSignWidget::setPosition(int x, int y)
+{
+    setGeometry(x, y, m_pixmap.width(), m_pixmap.height());
+}
diff --git a/GUI/coregui/Views/InfoWidgets/WarningSignWidget.h b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.h
new file mode 100644
index 0000000..91eb1ec
--- /dev/null
+++ b/GUI/coregui/Views/InfoWidgets/WarningSignWidget.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InfoWidgets/WarningSignWidget.h
+//! @brief     Defines class WarningSignWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef WARNINGSIGNWIDGET_H
+#define WARNINGSIGNWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QPixmap>
+#include <QString>
+#include <QWidget>
+
+//! The WarningSignWidget is an transparent widget with warning sign pixmap intended to be
+//! overlayed onto other widget at some arbitrary position.
+class WarningSignWidget : public QWidget
+{
+public:
+    WarningSignWidget(QWidget *parent = 0);
+
+    void setPosition(int x, int y);
+
+    void setWarningMessage(const QString &message) {m_warning_message = message;}
+
+protected:
+    void paintEvent(QPaintEvent *event);
+    void mousePressEvent(QMouseEvent *event);
+
+private:
+    QPixmap m_pixmap;
+    QString m_warning_message;
+};
+
+#endif // WARNINGSIGNWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentView.cpp b/GUI/coregui/Views/InstrumentView.cpp
new file mode 100644
index 0000000..4e92fed
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentView.cpp
@@ -0,0 +1,279 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentView.cpp
+//! @brief     Implements class InstrumentView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InstrumentView.h"
+#include "ExtendedDetectorDialog.h"
+#include "InstrumentEditorWidget.h"
+#include "InstrumentModel.h"
+#include "InstrumentSelectorWidget.h"
+#include "StyledToolBar.h"
+#include "mainwindow.h"
+#include <QAction> // need detected by TeamCity
+#include <QBoxLayout>
+#include <QDebug>
+#include <QDebug>
+#include <QListView>
+#include <QStackedWidget>
+#include <QToolButton>
+
+InstrumentView::InstrumentView(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_instrumentModel(mainWindow->instrumentModel())
+    , m_toolBar(new StyledToolBar(this))
+    , m_instrumentSelector(new InstrumentSelectorWidget(m_instrumentModel, this))
+    , m_stackWidget(new QStackedWidget)
+    , m_addInstrumentAction(0)
+    , m_removeInstrumentAction(0)
+    , m_addInstrumentButton(0)
+    , m_removeInstrumentButton(0)
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    QHBoxLayout *horizontalLayout = new QHBoxLayout;
+    horizontalLayout->addWidget(m_instrumentSelector);
+    horizontalLayout->addWidget(m_stackWidget, 1);
+
+    mainLayout->addWidget(m_toolBar);
+    mainLayout->addLayout(horizontalLayout);
+    setLayout(mainLayout);
+
+    setupConnections();
+    setupActions();
+
+    if(m_instrumentModel->rowCount(QModelIndex()) == 0)
+        onAddInstrument();
+
+    updateView();
+}
+
+
+void InstrumentView::updateView()
+{
+    qDebug() << "InstrumentView::updateView()";
+    m_instrumentSelector->updateSelection();
+}
+
+
+void InstrumentView::resetView()
+{
+    qDebug() << "InstrumentView::resetView()";
+
+    QMap<SessionItem *, InstrumentEditorWidget *>::iterator it = m_instrumentToEditor.begin();
+    while(it!=m_instrumentToEditor.end()) {
+        m_stackWidget->removeWidget(it.value());
+        delete it.value();
+        ++it;
+    }
+    m_instrumentToEditor.clear();
+    m_name_to_copy.clear();
+}
+
+
+void InstrumentView::onSelectionChanged(
+    const QItemSelection &selected, const QItemSelection &deselected )
+{
+    qDebug() << "InstrumentView::onSelectionChanged()" << selected << deselected;
+    if(selected.indexes().isEmpty()) {
+        qDebug() << "       InstrumentView::onSelectionChanged() -> no selected"
+                 << selected << deselected;
+        return;
+    }
+
+    SessionItem *instrument = m_instrumentModel->itemForIndex(selected.indexes().back());
+    qDebug() << "InstrumentView::onSelectionChanged()" << instrument->itemName();
+
+    InstrumentEditorWidget *widget = m_instrumentToEditor[instrument];
+
+    if( !widget) {
+        widget = new InstrumentEditorWidget();
+        connect(widget,
+                SIGNAL(extendedDetectorEditorRequest(DetectorItem *)),
+                this,
+                SLOT(onExtendedDetectorEditorRequest(DetectorItem *))
+                );
+
+        widget->setInstrumentItem(instrument);
+        m_stackWidget->addWidget(widget);
+        m_instrumentToEditor[instrument] = widget;
+    }
+    m_stackWidget->setCurrentWidget(widget);
+
+}
+
+
+void InstrumentView::onAddInstrument()
+{
+    qDebug() << "InstrumentView::onAddInstrument()";
+    SessionItem *instrument = m_instrumentModel->insertNewItem(Constants::InstrumentType);
+    instrument->setItemName(getNewInstrumentName("Default GISAS"));
+    m_instrumentModel->insertNewItem(
+        Constants::DetectorType, m_instrumentModel->indexOfItem(instrument));
+    m_instrumentModel->insertNewItem(
+        Constants::BeamType, m_instrumentModel->indexOfItem(instrument));
+    QModelIndex itemIndex = m_instrumentModel->indexOfItem(instrument);
+    qDebug() << "       InstrumentView::onAddInstrument() -> clearing selection";
+    m_instrumentSelector->getSelectionModel()->clearSelection();
+    qDebug() << "       InstrumentView::onAddInstrument() -> clearing selection -> done.";
+    m_instrumentSelector->getSelectionModel()->select(itemIndex, QItemSelectionModel::Select);
+}
+
+
+void InstrumentView::onRemoveInstrument()
+{
+    qDebug() << "InstrumentView::onRemoveInstrument()";
+    QModelIndex currentIndex = m_instrumentSelector->getSelectionModel()->currentIndex();
+    qDebug() << "InstrumentView::onRemoveInstrument()" <<  currentIndex;
+    if(currentIndex.isValid())
+        m_instrumentModel->removeRows(currentIndex.row(), 1, QModelIndex());
+}
+
+
+void InstrumentView::onRowsAboutToBeRemoved(QModelIndex parent, int first, int /* last */)
+{
+    qDebug() << "InstrumentView::onRowsAboutToBeRemoved()";
+    SessionItem *item = m_instrumentModel->itemForIndex(m_instrumentModel->index(first,0, parent));
+    Q_ASSERT(item);
+    InstrumentEditorWidget *widget = m_instrumentToEditor[item];
+
+    if(!widget) return;
+
+    QMap<SessionItem *, InstrumentEditorWidget *>::iterator it = m_instrumentToEditor.begin();
+    while(it!=m_instrumentToEditor.end()) {
+        if(it.value() == widget) {
+            it = m_instrumentToEditor.erase(it);
+        } else {
+            ++it;
+        }
+    }
+
+    m_stackWidget->removeWidget(widget);
+    delete widget;
+}
+
+void InstrumentView::onExtendedDetectorEditorRequest(DetectorItem *detectorItem)
+{
+    ExtendedDetectorDialog *dialog = new ExtendedDetectorDialog(this);
+    dialog->setDetectorContext(m_instrumentModel, detectorItem);
+    dialog->show();
+}
+
+void InstrumentView::setupConnections()
+{
+    connect(m_instrumentSelector,
+        SIGNAL( selectionChanged(const QItemSelection&, const QItemSelection&) ),
+        this,
+        SLOT( onSelectionChanged(const QItemSelection&, const QItemSelection&) )
+        );
+
+    connect(m_instrumentModel,
+            SIGNAL(modelAboutToBeReset()),
+            this,
+            SLOT(resetView())
+            );
+
+    connect(m_instrumentModel,
+            SIGNAL(rowsAboutToBeRemoved(QModelIndex, int,int)),
+            this,
+            SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int))
+            );
+}
+
+
+void InstrumentView::setupActions()
+{
+    m_addInstrumentButton = new QToolButton;
+    m_addInstrumentButton->setText("Add instrument");
+    m_addInstrumentButton->setIcon(QIcon(":/images/toolbar_newitem.png"));
+    m_addInstrumentButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    m_addInstrumentButton->setToolTip("Add new instrument");
+    connect(m_addInstrumentButton, SIGNAL(clicked()), this, SLOT(onAddInstrument()));
+    m_toolBar->addWidget(m_addInstrumentButton);
+
+    m_toolBar->addWidget(new QLabel(" "));
+    m_toolBar->addSeparator();
+    m_toolBar->addWidget(new QLabel(" "));
+
+    m_removeInstrumentButton = new QToolButton;
+    m_removeInstrumentButton->setText("Remove instrument");
+    m_removeInstrumentButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_recycle.png"));
+    m_removeInstrumentButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    m_removeInstrumentButton->setToolTip("Remove currently selected instrument");
+    connect(m_removeInstrumentButton, SIGNAL(clicked()), this, SLOT(onRemoveInstrument()));
+    m_toolBar->addWidget(m_removeInstrumentButton);
+
+    m_toolBar->addWidget(new QLabel(" "));
+    m_toolBar->addSeparator();
+    m_toolBar->addWidget(new QLabel(" "));
+
+    m_addInstrumentAction
+        = new QAction(QIcon(":/images/toolbar_newitem_dark.png"), "Add new instrument", this);
+    connect(m_addInstrumentAction, SIGNAL(triggered()), this, SLOT(onAddInstrument()));
+
+    m_removeInstrumentAction
+        = new QAction(QIcon(":/SampleDesigner/images/toolbar_recycle_dark.png"),
+                      "Remove currently selected instrument", this);
+    connect(m_removeInstrumentAction, SIGNAL(triggered()), this, SLOT(onRemoveInstrument()));
+
+    Q_ASSERT(m_instrumentSelector->getListView());
+    m_instrumentSelector->getListView()->setContextMenuPolicy(Qt::ActionsContextMenu);
+    m_instrumentSelector->getListView()->addAction(m_addInstrumentAction);
+    m_instrumentSelector->getListView()->addAction(m_removeInstrumentAction);
+}
+
+
+//! returns name of instrument which is based on suggested name
+//! If "Default GISAS" name already exists, then "Default GISAS (2)" will be proposed.
+QString InstrumentView::getNewInstrumentName(const QString &name)
+{
+    updateMapOfNames();
+
+    int ncopies = m_name_to_copy[name];
+    qDebug() << "   InstrumentView::getNewInstrumentName()" << ncopies;
+    if(ncopies == 0) {
+        m_name_to_copy[name]=1;
+        return name;
+    }
+    else {
+        m_name_to_copy[name]++;
+        return QString("%1 (%2)").arg(name).arg(m_name_to_copy[name]);
+    }
+}
+
+
+//! construct map of instrument names defined in the model together with number
+//! of copies
+void InstrumentView::updateMapOfNames()
+{
+
+    m_name_to_copy.clear();
+    QModelIndex parentIndex;
+    for( int i_row = 0; i_row < m_instrumentModel->rowCount( parentIndex ); ++i_row) {
+        QModelIndex itemIndex = m_instrumentModel->index( i_row, 0, parentIndex );
+        QString name =  m_instrumentModel->itemForIndex(itemIndex)->itemName();
+        int ncopy(1);
+        QRegExp regexp("\\((.*)\\)");
+        if(regexp.indexIn(name) >= 0) {
+            ncopy = regexp.cap(1).toInt();
+        }
+        name.replace(regexp.cap(0),"");
+        name = name.trimmed();
+        m_name_to_copy[name] = ncopy;
+//        qDebug() << " ";
+//        qDebug() << "XXXXXXXXXXXXXXXX" << name << ncopy << regexp.cap(0);
+    }
+}
diff --git a/GUI/coregui/Views/InstrumentView.h b/GUI/coregui/Views/InstrumentView.h
new file mode 100644
index 0000000..d8c5bea
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentView.h
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentView.h
+//! @brief     Defines class InstrumentView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INSTRUMENTVIEW_H
+#define INSTRUMENTVIEW_H
+
+#include "WinDllMacros.h"
+#include <QMap>
+#include <QWidget>
+
+class MainWindow;
+class InstrumentSelectorWidget;
+class InstrumentEditorWidget;
+class InstrumentModel;
+class QStackedWidget;
+class QItemSelection;
+class SessionItem;
+class QToolButton;
+class DetectorItem;
+
+
+class BA_CORE_API_ InstrumentView : public QWidget
+{
+    Q_OBJECT
+
+public:
+    InstrumentView(MainWindow *mainWindow);
+
+public slots:
+    void updateView();
+    void resetView();
+    void onSelectionChanged(const QItemSelection&, const QItemSelection&);
+    void onAddInstrument();
+    void onRemoveInstrument();
+    void onRowsAboutToBeRemoved(QModelIndex,int,int);
+    void onExtendedDetectorEditorRequest(DetectorItem *detectorItem);
+
+private:
+    void setupConnections();
+    void setupActions();
+    QString getNewInstrumentName(const QString &name);
+    void updateMapOfNames();
+
+    InstrumentModel *m_instrumentModel;
+    class StyledToolBar *m_toolBar;
+    InstrumentSelectorWidget *m_instrumentSelector;
+    QStackedWidget *m_stackWidget;
+    QMap<SessionItem *, InstrumentEditorWidget *> m_instrumentToEditor;
+    QAction *m_addInstrumentAction;
+    QAction *m_removeInstrumentAction;
+    QToolButton *m_addInstrumentButton;
+    QToolButton *m_removeInstrumentButton;
+
+    QMap<QString, int> m_name_to_copy;
+};
+
+
+#endif // INSTRUMENTVIEW_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.cpp
new file mode 100644
index 0000000..c551de1
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.cpp
@@ -0,0 +1,118 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.cpp
+//! @brief     Implements class BeamEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "BeamEditorWidget.h"
+#include "BeamDistributionItem.h"
+#include "BeamItem.h"
+#include "ComponentBoxEditor.h"
+#include "ComponentInfoBox.h"
+#include "DistributionDialog.h"
+#include "GUIHelpers.h"
+#include "GroupInfoBox.h"
+#include "LayerItem.h"
+#include <QComboBox>
+#include <QDebug>
+#include <QGroupBox>
+#include <QLabel>
+#include <QLineEdit>
+#include <QVBoxLayout>
+#include <iostream>
+namespace
+{
+    QString name_of_groupbox_wavenlength("Wavelength [nm]");
+    QString name_of_groupbox_inclination("Inclination angle [deg]");
+    QString name_of_groupbox_azimuthal("Azimuthal angle [deg]");
+}
+
+BeamEditorWidget::BeamEditorWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_intensityEditor(0)
+    , m_wavelengthPresenter(0)
+    , m_inclinationAnglePresenter(0)
+    , m_azimuthalAnglePresenter(0)
+    , m_gridLayout(0)
+    , m_beamItem(0)
+{
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+
+    QGroupBox *groupBox = new QGroupBox("Beam Parameters");
+
+    QVBoxLayout *groupLayout = new QVBoxLayout;
+    groupBox->setLayout(groupLayout);
+
+    // whole content is represented as grid layout
+    m_gridLayout = new QGridLayout;
+
+    m_intensityEditor = new ComponentBoxEditor;
+
+
+    m_gridLayout->addWidget(m_intensityEditor, 0, 0);
+
+    m_wavelengthPresenter = new ComponentInfoBox(name_of_groupbox_wavenlength);
+    m_gridLayout->addWidget(m_wavelengthPresenter, 1, 0);
+    connect(m_wavelengthPresenter, SIGNAL(onDialogRequest(SessionItem*, QString)), this,
+            SLOT(onDialogRequest(SessionItem*, QString)));
+
+    m_inclinationAnglePresenter = new ComponentInfoBox(name_of_groupbox_inclination, this);
+    m_gridLayout->addWidget(m_inclinationAnglePresenter, 1, 1);
+    connect(m_inclinationAnglePresenter, SIGNAL(onDialogRequest(SessionItem*, QString)),
+            this, SLOT(onDialogRequest(SessionItem*, QString)));
+
+    m_azimuthalAnglePresenter = new ComponentInfoBox(name_of_groupbox_azimuthal, this);
+    m_gridLayout->addWidget(m_azimuthalAnglePresenter, 1, 2);
+    connect(m_azimuthalAnglePresenter, SIGNAL(onDialogRequest(SessionItem*, QString)),
+            this, SLOT(onDialogRequest(SessionItem*, QString)));
+
+    groupLayout->addLayout(m_gridLayout);
+
+    // main layout
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(groupBox);
+    mainLayout->addStretch();
+    setLayout(mainLayout);
+}
+
+void BeamEditorWidget::setBeamItem(BeamItem *beamItem)
+{
+    m_beamItem = beamItem;
+    m_intensityEditor->clearEditor();
+    m_wavelengthPresenter->clearEditor();
+    m_inclinationAnglePresenter->clearEditor();
+    m_azimuthalAnglePresenter->clearEditor();
+
+    if (!m_beamItem)
+        return;
+
+    m_intensityEditor->addItem(m_beamItem->getItem(BeamItem::P_INTENSITY));
+
+    SessionItem *wavelengthItem = m_beamItem->getItem(BeamItem::P_WAVELENGTH);
+    m_wavelengthPresenter->addPropertyItems(wavelengthItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
+
+    SessionItem *inclinationAngleItem
+            = m_beamItem->getItem(BeamItem::P_INCLINATION_ANGLE);
+    m_inclinationAnglePresenter->addPropertyItems(inclinationAngleItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
+
+    SessionItem *azimuthalAngleItem = m_beamItem->getItem(BeamItem::P_AZIMUTHAL_ANGLE);
+    m_azimuthalAnglePresenter->addPropertyItems(azimuthalAngleItem->getItem(BeamDistributionItem::P_DISTRIBUTION));
+}
+
+void BeamEditorWidget::onDialogRequest(SessionItem *item, QString name)
+{
+    DistributionDialog *dialog = new DistributionDialog(this);
+    dialog->setItem(item);
+    dialog->setNameOfEditor(name);
+    dialog->show();
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.h b/GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.h
new file mode 100644
index 0000000..81d0e25
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/BeamEditorWidget.h
+//! @brief     Defines class BeamEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BEAMEDITORWIDGET_H
+#define BEAMEDITORWIDGET_H
+
+#include "SessionItem.h"
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class BeamItem;
+class ComponentBoxEditor;
+class ComponentInfoBox;
+class QGridLayout;
+
+class BA_CORE_API_ BeamEditorWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    BeamEditorWidget(QWidget *parent = 0);
+
+    void setBeamItem(BeamItem *beamItem);
+
+    QGridLayout *getGridLayout() { return m_gridLayout;}
+
+private slots:
+    void onDialogRequest(SessionItem *item, QString name);
+
+private:
+    ComponentBoxEditor *m_intensityEditor;
+    ComponentInfoBox *m_wavelengthPresenter;
+    ComponentInfoBox *m_inclinationAnglePresenter;
+    ComponentInfoBox *m_azimuthalAnglePresenter;
+    QGridLayout *m_gridLayout;
+    BeamItem *m_beamItem;
+};
+
+#endif // BEAMEDITORWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/ComboWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/ComboWidget.cpp
new file mode 100644
index 0000000..71a5519
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/ComboWidget.cpp
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/ComboWidget.cpp
+//! @brief     Implements class ComboWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ComboWidget.h"
+#include "GUIHelpers.h"
+#include <QBoxLayout>
+#include <QComboBox>
+#include <QDebug>
+#include <QDoubleSpinBox>
+#include <QGridLayout>
+#include <QGroupBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QSpinBox>
+
+ComboWidget::ComboWidget(QString item, QGridLayout *layout, QWidget *parent)
+    : QWidget(parent)
+    , m_collapsed(false)
+
+{
+    m_detailsLayout = layout;
+
+    m_mainComboBox = new QComboBox();
+    m_mainComboBox->addItem(item);
+
+    m_icon_collapse = new QIcon(":/images/collapse_arrow.png"  );
+    m_icon_expand = new QIcon(":/images/expand_arrow.png"  );
+
+    m_detailsButton = new QPushButton("Details");
+    m_detailsButton->setFixedWidth(75);
+    //m_detailsButton->setLayoutDirection(Qt::RightToLeft);
+    //detailsButton->setCheckable(true);
+    m_detailsButton->setIcon(QIcon( m_collapsed ?
+                 *m_icon_expand :
+                 *m_icon_collapse));
+    m_detailsButton->setIconSize(QSize(16,16));
+
+
+    QGridLayout *comboLayout = new QGridLayout;
+    comboLayout->addWidget(m_mainComboBox, 0, 0);
+    comboLayout->addWidget(m_detailsButton, 0, 1);
+
+
+    if(m_detailsLayout)
+    {
+        comboLayout->addLayout(m_detailsLayout, 1, 0);
+    }
+
+    connect(m_detailsButton, SIGNAL(clicked()),this, SLOT(onDetailsButtonClicked()));
+
+
+    // main layout
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addLayout(comboLayout);
+    setLayout(mainLayout);
+}
+
+void ComboWidget::onDetailsButtonClicked()
+{
+    setCollapse(!m_collapsed);
+    m_detailsButton->setIcon(QIcon( m_collapsed ?
+                 *m_icon_expand :
+                 *m_icon_collapse));
+}
+
+void ComboWidget::setCollapse( bool collapse )
+{
+    for (int i = 0; i < m_detailsLayout->count(); ++i)
+    {
+      m_detailsLayout->itemAt(i)->widget()->setVisible(!collapse);
+    }
+
+    m_collapsed = collapse;
+
+}
+
+void ComboWidget::addItem(QString item)
+{
+    m_mainComboBox->addItem(item);
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/ComboWidget.h b/GUI/coregui/Views/InstrumentWidgets/ComboWidget.h
new file mode 100644
index 0000000..413542b
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/ComboWidget.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/ComboWidget.h
+//! @brief     Defines class ComboWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMBOWIDGET_H
+#define COMBOWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class QComboBox;
+class QLabel;
+class QSpinBox;
+class QDoubleSpinBox;
+class QGridLayout;
+class QPushButton;
+
+class BA_CORE_API_ ComboWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    ComboWidget(QString item, QGridLayout *layout = 0, QWidget *parent = 0);
+    void addItem(QString item);
+
+public slots:
+    void onDetailsButtonClicked();
+
+private:
+    bool m_collapsed;
+    QGridLayout *m_detailsLayout;
+    QComboBox *m_mainComboBox;
+    QPushButton *m_detailsButton;
+    QIcon *m_icon_collapse, *m_icon_expand;
+
+    void setCollapse(bool);
+};
+
+#endif // COMBOWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.cpp b/GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.cpp
new file mode 100644
index 0000000..6e738d0
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.cpp
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.cpp
+//! @brief     Implements class ComponentInfoBox
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ComponentInfoBox.h"
+#include "ComponentBoxEditor.h"
+#include <QGroupBox>
+#include <QVBoxLayout>
+#include <iostream>
+
+ComponentInfoBox::ComponentInfoBox(const QString &title, QWidget *parent)
+    : QWidget(parent)
+    , m_groupBox(new GroupInfoBox(title))
+    , m_editor(new ComponentBoxEditor)
+    , m_item(0)
+    , m_title(title)
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+
+    QVBoxLayout *groupBoxLayout = new QVBoxLayout;
+    groupBoxLayout->setContentsMargins( 0, 0, 0, 0 );
+    groupBoxLayout->addWidget(m_editor);
+    m_groupBox->setLayout(groupBoxLayout);
+
+    connect(m_groupBox, SIGNAL(clicked()), this, SLOT(dialogRequest()));
+
+    mainLayout->addWidget(m_groupBox);
+    mainLayout->addStretch();
+
+    setLayout(mainLayout);
+}
+
+void ComponentInfoBox::addPropertyItems(SessionItem *item)
+{
+    m_editor->addPropertyItems(item);
+    m_item = item;
+}
+
+void ComponentInfoBox::clearEditor()
+{
+    m_editor->clearEditor();
+}
+
+void ComponentInfoBox::dialogRequest()
+{
+    emit onDialogRequest(m_item, m_title);
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.h b/GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.h
new file mode 100644
index 0000000..8f0845e
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/ComponentInfoBox.h
+//! @brief     Defines class ComponentInfoBox
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPONENTINFOBOX_H
+#define COMPONENTINFOBOX_H
+
+#include "GroupInfoBox.h"
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class ComponentBoxEditor;
+class SessionItem;
+
+//! The ComponentEditorBox is a widget to display ComponentEditor inside
+//! custom group box equipped with help sign functionality
+//! (used to summon DistributionEditor)
+class BA_CORE_API_ ComponentInfoBox : public QWidget
+{
+    Q_OBJECT
+public:
+
+    ComponentInfoBox(const QString &title, QWidget *parent = 0);
+
+    void addPropertyItems(SessionItem *item);
+
+    void clearEditor();
+
+signals:
+    void onDialogRequest(SessionItem *item, QString names);
+
+private slots:
+    void dialogRequest();
+
+private:
+    GroupInfoBox *m_groupBox;
+    ComponentBoxEditor *m_editor;
+    SessionItem *m_item;
+    QString m_title;
+};
+
+#endif // COMPONENTINFOBOX_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp
new file mode 100644
index 0000000..f2cee32
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp
@@ -0,0 +1,140 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.cpp
+//! @brief     Implements class DetectorEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DetectorEditorWidget.h"
+#include "ComponentBoxEditor.h"
+#include "DetectorItems.h"
+#include "DetectorItems.h"
+#include "ExtendedDetectorDialog.h"
+#include "GUIHelpers.h"
+#include "GroupInfoBox.h"
+#include "RectangularDetectorWidget.h"
+#include "SphericalDetectorWidget.h"
+#include "columnresizer.h"
+#include <QDebug>
+#include <QGroupBox>
+#include <QLabel>
+#include <QVBoxLayout>
+
+DetectorEditorWidget::DetectorEditorWidget(ColumnResizer *columnResizer, QWidget *parent)
+    : QWidget(parent)
+    , m_columnResizer(columnResizer)
+    , m_groupBox(new GroupInfoBox("Detector Parameters"))
+    , m_detectorItem(0)
+    , m_subDetectorWidget(0)
+{
+    QVBoxLayout *groupLayout = new QVBoxLayout;
+    m_groupBox->setButtonToolTip("Gives access to the detector mask editor");
+    m_groupBox->setLayout(groupLayout);
+    connect(m_groupBox, SIGNAL(clicked()), this, SLOT(onGroupBoxExtendedButton()));
+
+    m_detectorTypeEditor = new ComponentBoxEditor;
+    groupLayout->addWidget(m_detectorTypeEditor);
+
+    // main layout
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(m_groupBox);
+    mainLayout->addStretch();
+    setLayout(mainLayout);
+}
+
+DetectorEditorWidget::~DetectorEditorWidget()
+{
+    qDebug() << "DetectorEditorWidget::~DetectorEditorWidget()";
+}
+
+void DetectorEditorWidget::setDetectorItem(DetectorItem *detectorItem)
+{
+    if(m_detectorItem == detectorItem) {
+        return;
+
+    } else {
+        if(m_detectorItem)
+            m_detectorItem->mapper()->unsubscribe(this);
+
+        m_detectorItem = detectorItem;
+        if(!m_detectorItem) return;
+
+        m_detectorItem->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
+
+        m_detectorTypeEditor->clearEditor();
+        m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR));
+
+        init_SubDetector_Widget();
+    }
+
+
+
+//    qDebug() << "DetectorEditorWidget::setDetectorItem() -> XXX";
+//    m_detectorItem = detectorItem;
+//    if(!m_detectorItem) return;
+
+//    m_mapper.reset(new ModelMapper);
+//    m_mapper->setItem(m_detectorItem);
+//    m_mapper->setOnPropertyChange(
+//                [this](const QString &name)
+//    {
+//        onPropertyChanged(name);
+//    });
+
+//    m_detectorTypeEditor->clearEditor();
+//    m_detectorTypeEditor->addItem(m_detectorItem->getItem(DetectorItem::P_DETECTOR));
+
+//    init_SubDetector_Widget();
+}
+
+void DetectorEditorWidget::onPropertyChanged(const QString &propertyName)
+{
+    if(propertyName == DetectorItem::P_DETECTOR) {
+        init_SubDetector_Widget();
+    }
+}
+
+void DetectorEditorWidget::onGroupBoxExtendedButton()
+{
+    emit extendedDetectorEditorRequest(m_detectorItem);
+}
+
+void DetectorEditorWidget::init_SubDetector_Widget()
+{
+    if(m_subDetectorWidget) m_groupBox->layout()->removeWidget(m_subDetectorWidget);
+    delete m_subDetectorWidget;
+    m_subDetectorWidget = 0;
+
+
+    SessionItem *subItem = m_detectorItem->getGroupItem(DetectorItem::P_DETECTOR);
+//    if(SphericalDetectorItem *SphericalDetectorItem = dynamic_cast<)
+
+
+    if(subItem->modelType() == Constants::SphericalDetectorType) {
+        m_subDetectorWidget = new SphericalDetectorWidget(m_columnResizer, m_detectorItem);
+    } else if(subItem->modelType() == Constants::RectangularDetectorType) {
+        m_subDetectorWidget = new RectangularDetectorWidget(
+            m_columnResizer, dynamic_cast<RectangularDetectorItem *>(subItem));
+    } else {
+        throw GUIHelpers::Error("DetectorEditorWidget::init_SubDetector_Widget() -> Error!"
+                                "Unknown sybdetector type.");
+    }
+
+    m_groupBox->layout()->addWidget(m_subDetectorWidget);
+}
+
+
+
diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h
new file mode 100644
index 0000000..7a06ed5
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/DetectorEditorWidget.h
+//! @brief     Defines class DetectorEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DETECTOREDITORWIDGET_H
+#define DETECTOREDITORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class GroupInfoBox;
+class DetectorItem;
+class ComponentBoxEditor;
+class QGridLayout;
+class SphericalDetectorWidget;
+class ColumnResizer;
+
+class BA_CORE_API_ DetectorEditorWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    DetectorEditorWidget(ColumnResizer *columnResizer, QWidget *parent = 0);
+    virtual ~DetectorEditorWidget();
+
+    void setDetectorItem(DetectorItem *detectorItem);
+
+signals:
+    void extendedDetectorEditorRequest(DetectorItem *);
+
+public slots:
+    void onPropertyChanged(const QString &propertyName);
+
+private slots:
+    void onGroupBoxExtendedButton();
+
+private:
+    void init_SubDetector_Widget();
+    ComponentBoxEditor *m_detectorTypeEditor;
+    ColumnResizer *m_columnResizer;
+    GroupInfoBox *m_groupBox;
+    DetectorItem *m_detectorItem;
+    QWidget *m_subDetectorWidget;
+};
+
+#endif // DETECTOREDITORWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp b/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp
new file mode 100644
index 0000000..ffa8009
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp
@@ -0,0 +1,184 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.cpp
+//! @brief     Implements class DetectorMaskDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DetectorMaskDelegate.h"
+#include "AxesItems.h"
+#include "ComboProperty.h"
+#include "DetectorItems.h"
+#include "GUIHelpers.h"
+#include "InstrumentModel.h"
+#include "IntensityDataItem.h"
+#include "MaskEditor.h"
+#include "MaskItems.h"
+#include "MaskModel.h"
+#include "OutputData.h"
+#include <QDebug>
+
+DetectorMaskDelegate::DetectorMaskDelegate(QObject *parent)
+    : QObject(parent)
+    , m_tempIntensityDataModel(new SessionModel("TempIntensityDataModel", this))
+    , m_instrumentModel(0)
+    , m_detectorItem(0)
+    , m_intensityItem(0)
+{
+}
+
+void DetectorMaskDelegate::initMaskEditorContext(
+    MaskEditor *maskEditor, InstrumentModel *instrumentModel,
+    DetectorItem *detectorItem)
+{
+    m_instrumentModel = instrumentModel;
+    m_detectorItem = detectorItem;
+
+    Q_ASSERT(m_instrumentModel);
+    Q_ASSERT(m_detectorItem);
+
+    createIntensityDataItem();
+    createMaskContainer();
+
+    Q_ASSERT(m_detectorItem->maskContainerItem());
+
+    maskEditor->setMaskContext(
+        m_instrumentModel,
+        m_instrumentModel->indexOfItem(m_detectorItem->maskContainerItem()),
+        m_intensityItem);
+}
+
+//! Creates IntensityDataItem from DetectorItem for later usage in MaskEditor.
+//! As amplitude, value 1.0 is set for each bin.
+//! The object additionally tuned to appear nicely on ColorMap plot.
+void DetectorMaskDelegate::createIntensityDataItem()
+{
+    m_tempIntensityDataModel->clear();
+
+    m_intensityItem = dynamic_cast<IntensityDataItem *>(
+        m_tempIntensityDataModel->insertNewItem(Constants::IntensityDataType));
+    Q_ASSERT(m_intensityItem);
+
+    m_intensityItem->getItem(IntensityDataItem::P_PROJECTIONS_FLAG)->setEnabled(false);
+    m_intensityItem->setItemValue(IntensityDataItem::P_IS_INTERPOLATED,
+                                           false);
+
+//    ComboProperty gradient
+//        = m_intensityItem->getRegisteredProperty(IntensityDataItem::P_GRADIENT)
+//              .value<ComboProperty>();
+//    gradient.setValue(Constants::GRADIENT_GRAYSCALE);
+//    m_intensityItem->setRegisteredProperty(IntensityDataItem::P_GRADIENT,
+//                                           gradient.getVariant());
+
+    AmplitudeAxisItem *zAxisItem = dynamic_cast<AmplitudeAxisItem *>(
+        m_intensityItem->getItem(IntensityDataItem::P_ZAXIS));
+
+    zAxisItem->setItemValue(BasicAxisItem::P_IS_VISIBLE, false);
+    zAxisItem->setItemValue(BasicAxisItem::P_MIN, 0.0);
+    zAxisItem->setItemValue(BasicAxisItem::P_MAX, 2.0);
+    zAxisItem->setItemValue(AmplitudeAxisItem::P_IS_LOGSCALE, false);
+    zAxisItem->setItemValue(AmplitudeAxisItem::P_LOCK_MIN_MAX, true);
+
+    m_intensityItem->setOutputData(createOutputData(m_detectorItem));
+}
+
+//! Creates MaskContainer in DetectorItem
+void DetectorMaskDelegate::createMaskContainer()
+{
+    Q_ASSERT(m_detectorItem);
+    if (!m_detectorItem->maskContainerItem()) {
+        m_instrumentModel->insertNewItem(
+            Constants::MaskContainerType,
+            m_instrumentModel->indexOfItem(m_detectorItem));
+    }
+}
+
+//! Creates OutputData from DetectorItem's axes for later initialization of
+//! IntensityDataItem
+OutputData<double> *
+DetectorMaskDelegate::createOutputData(DetectorItem *detectorItem)
+{
+    Q_ASSERT(detectorItem);
+    OutputData<double> *result = new OutputData<double>;
+
+    auto subDetector = detectorItem->getGroupItem(DetectorItem::P_DETECTOR);
+    Q_ASSERT(subDetector);
+
+    if (subDetector->modelType() == Constants::SphericalDetectorType) {
+
+        auto x_axis = dynamic_cast<BasicAxisItem *>(
+            subDetector->getItem(SphericalDetectorItem::P_PHI_AXIS));
+        Q_ASSERT(x_axis);
+        int n_x = x_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+        double x_min
+            = x_axis->getItemValue(BasicAxisItem::P_MIN).toDouble();
+        double x_max
+            = x_axis->getItemValue(BasicAxisItem::P_MAX).toDouble();
+
+        auto y_axis = dynamic_cast<BasicAxisItem *>(
+            subDetector->getItem(SphericalDetectorItem::P_ALPHA_AXIS));
+        Q_ASSERT(y_axis);
+        int n_y = y_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+        double y_min
+            = y_axis->getItemValue(BasicAxisItem::P_MIN).toDouble();
+        double y_max
+            = y_axis->getItemValue(BasicAxisItem::P_MAX).toDouble();
+
+        result->addAxis("x", n_x, x_min, x_max);
+        result->addAxis("y", n_y, y_min, y_max);
+
+    }
+
+    else if (subDetector->modelType() == Constants::RectangularDetectorType) {
+        auto x_axis = dynamic_cast<BasicAxisItem *>(
+            subDetector->getItem(RectangularDetectorItem::P_X_AXIS));
+        Q_ASSERT(x_axis);
+        int n_x = x_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+        double x_min = x_axis->getItemValue(BasicAxisItem::P_MIN).toDouble();
+        double x_max = x_axis->getItemValue(BasicAxisItem::P_MAX).toDouble();
+
+        auto y_axis = dynamic_cast<BasicAxisItem *>(
+            subDetector->getItem(RectangularDetectorItem::P_Y_AXIS));
+        Q_ASSERT(y_axis);
+        int n_y = y_axis->getItemValue(BasicAxisItem::P_NBINS).toInt();
+        double y_min
+            = y_axis->getItemValue(BasicAxisItem::P_MIN).toDouble();
+        double y_max
+            = y_axis->getItemValue(BasicAxisItem::P_MAX).toDouble();
+
+        result->addAxis("x", n_x, x_min, x_max);
+        result->addAxis("y", n_y, y_min, y_max);
+
+    }
+
+    else {
+        throw GUIHelpers::Error(
+            "DetectorMaskDelegate::createOutputData() -> Error. "
+            " Unknown detector type");
+    }
+
+    result->setAllTo(1.0);
+//    (*result)[0] = 10;
+
+//    const IAxis *axis0 = result->getAxis(0);
+//    const IAxis *axis1 = result->getAxis(1);
+
+//    for(int ix=0; ix<(int)axis0.size(); ix+=2) {
+//        for(int iy=0; iy<(int)axis1.size(); iy+=2) {
+//            std::vector<int> indices = {ix, iy};
+//            int index = result->toGlobalIndex(indices);
+//            (*result)[index] = 10;
+//        }
+//    }
+
+    return result;
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.h b/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.h
new file mode 100644
index 0000000..4c70f6d
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/DetectorMaskDelegate.h
+//! @brief     Defines class DetectorMaskDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DETECTORMASKDELEGATE_H
+#define DETECTORMASKDELEGATE_H
+
+#include "WinDllMacros.h"
+#include <QModelIndex>
+#include <QObject>
+
+template <class T> class OutputData;
+
+class MaskModel;
+class DetectorItem;
+class InstrumentModel;
+class IntensityDataItem;
+class MaskEditor;
+class SessionModel;
+
+//! The DetectorMaskDelegate class provides syncronization between DetectorItem (defined
+//! in InstrumentModel) and temporary IntensityDataItem (defined in temporary SessionModel).
+//! The later one is used by MaskEditor for mask drawing.
+
+class BA_CORE_API_ DetectorMaskDelegate : public QObject
+{
+    Q_OBJECT
+public:
+    DetectorMaskDelegate(QObject *parent);
+
+    void initMaskEditorContext(MaskEditor *maskEditor,
+                               InstrumentModel *instrumentModel,
+                               DetectorItem *detectorItem);
+
+private:
+    void createIntensityDataItem();
+    void createMaskContainer();
+    OutputData<double> *createOutputData(DetectorItem *detectorItem);
+
+    SessionModel *m_tempIntensityDataModel;
+    InstrumentModel *m_instrumentModel;
+    DetectorItem *m_detectorItem;
+    IntensityDataItem *m_intensityItem;
+};
+
+
+#endif // DETECTORMASKDELEGATE_H
+
diff --git a/GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.cpp b/GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.cpp
new file mode 100644
index 0000000..af76c25
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.cpp
@@ -0,0 +1,103 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.cpp
+//! @brief     Implements class DistributionDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ExtendedDetectorDialog.h"
+#include "CustomEventFilters.h"
+#include "DetectorMaskDelegate.h"
+#include "MaskEditor.h"
+#include "MaskModel.h"
+#include "mainwindow_constants.h"
+#include <QDebug>
+#include <QKeyEvent>
+#include <QModelIndex>
+#include <QPushButton>
+#include <QSettings>
+#include <QVBoxLayout>
+
+ExtendedDetectorDialog::ExtendedDetectorDialog(QWidget *parent)
+    : QDialog(parent)
+    , m_maskEditor(new MaskEditor)
+    , m_detectorMaskDelegate(new DetectorMaskDelegate(this))
+{
+    setMinimumSize(256, 256);
+
+    readSettings();
+
+    setWindowTitle("Mask Editor");
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    setAttribute(Qt::WA_DeleteOnClose, true);
+    setModal(true);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    QPushButton *button = new QPushButton("Close", this);
+    connect(button, SIGNAL(clicked()), this, SLOT(close()));
+
+    QHBoxLayout *buttonLayout = new QHBoxLayout;
+    buttonLayout->addStretch(1);
+    buttonLayout->setContentsMargins(4, 4, 4, 4);
+    buttonLayout->addWidget(button);
+
+    layout->addWidget(m_maskEditor);
+    layout->addLayout(buttonLayout);
+
+    layout->setContentsMargins(0, 0, 0, 0);
+    setLayout(layout);
+
+    // hadling keyboar focus policies
+    button->setDefault(false);
+    button->setAutoDefault(false);
+    setFocusProxy(m_maskEditor);
+
+    SpaceKeyEater *filter = new SpaceKeyEater(this);
+    installEventFilter(filter);
+    button->installEventFilter(filter);
+
+}
+
+void ExtendedDetectorDialog::setDetectorContext(InstrumentModel *instrumentModel,
+                                                DetectorItem *detectorItem)
+{
+    m_detectorMaskDelegate->initMaskEditorContext(m_maskEditor, instrumentModel,
+                                                  detectorItem);
+}
+
+void ExtendedDetectorDialog::reject()
+{
+    writeSettings();
+    QDialog::reject();
+}
+
+void ExtendedDetectorDialog::readSettings()
+{
+    QSettings settings;
+    if (settings.childGroups().contains(Constants::S_MASKEDITOR)) {
+        settings.beginGroup(Constants::S_MASKEDITOR);
+        resize(settings.value(Constants::S_WINDOWSIZE, QSize(750, 650)).toSize());
+        move(settings.value(Constants::S_WINDOWPOSITION, QPoint(200,200)).toPoint());
+    }
+    else {
+        resize(750, 650);
+    }
+}
+
+void ExtendedDetectorDialog::writeSettings()
+{
+    QSettings settings;
+    settings.beginGroup(Constants::S_MASKEDITOR);
+    settings.setValue(Constants::S_WINDOWSIZE, this->size());
+    settings.setValue(Constants::S_WINDOWPOSITION, this->pos());
+    settings.endGroup();
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.h b/GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.h
new file mode 100644
index 0000000..1f4f75d
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/ExtendedDetectorDialog.h
+//! @brief     Defines class DistributionDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef EXTENDEDDETECTORDIALOG_H
+#define EXTENDEDDETECTORDIALOG_H
+
+#include <QDialog>
+
+class MaskEditor;
+class DetectorItem;
+class DetectorMaskDelegate;
+class InstrumentModel;
+
+//! The dialog which shows a MaskEditor
+
+class ExtendedDetectorDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    ExtendedDetectorDialog(QWidget *parent = 0);
+    virtual ~ExtendedDetectorDialog(){}
+
+public slots:
+    void setDetectorContext(InstrumentModel *instrumentModel, DetectorItem *detectorItem);
+
+private:
+    void reject();
+
+private:
+    void readSettings();
+    void writeSettings();
+
+    MaskEditor *m_maskEditor;
+    DetectorMaskDelegate *m_detectorMaskDelegate;
+};
+
+#endif // EXTENDEDDETECTORDIALOG_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.cpp
new file mode 100644
index 0000000..2bbba29
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.cpp
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.cpp
+//! @brief     Implements class InstrumentComponentsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InstrumentComponentsWidget.h"
+#include "BeamEditorWidget.h"
+#include "DetectorEditorWidget.h"
+#include "columnresizer.h"
+#include <QDebug>
+#include <QVBoxLayout>
+
+InstrumentComponentsWidget::InstrumentComponentsWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_columnResizer(new ColumnResizer(this))
+    , m_beamEditor(new BeamEditorWidget)
+    , m_detectorEditor(new DetectorEditorWidget(m_columnResizer))
+    , m_beamItem(0)
+    , m_detectorItem(0)
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout(this);
+    mainLayout->addWidget(m_beamEditor);
+    mainLayout->addWidget(m_detectorEditor);
+    mainLayout->addStretch();
+
+    m_columnResizer->addWidgetsFromGridLayout(m_beamEditor->getGridLayout(), 0);
+    m_columnResizer->addWidgetsFromGridLayout(m_beamEditor->getGridLayout(), 1);
+    m_columnResizer->addWidgetsFromGridLayout(m_beamEditor->getGridLayout(), 2);
+
+    connect(m_detectorEditor,
+            SIGNAL(extendedDetectorEditorRequest(DetectorItem *)),
+            this,
+            SIGNAL(extendedDetectorEditorRequest(DetectorItem *))
+            );
+
+}
+
+void InstrumentComponentsWidget::setBeamItem(BeamItem *beamItem)
+{
+    m_beamItem = beamItem;
+    m_beamEditor->setBeamItem(beamItem);
+}
+
+void InstrumentComponentsWidget::setDetectorItem(DetectorItem *detectorItem)
+{
+    m_detectorItem = detectorItem;
+    m_detectorEditor->setDetectorItem(detectorItem);
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.h b/GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.h
new file mode 100644
index 0000000..a053de5
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/InstrumentComponentsWidget.h
+//! @brief     Defines class InstrumentComponentsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INSTRUMENTCOMPONENTSWIDGET_H
+#define INSTRUMENTCOMPONENTSWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class BeamItem;
+class DetectorItem;
+class BeamEditorWidget;
+class DetectorEditorWidget;
+class ColumnResizer;
+
+class BA_CORE_API_ InstrumentComponentsWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    InstrumentComponentsWidget(QWidget *parent = 0);
+
+    void setBeamItem(BeamItem *beamItem);
+    void setDetectorItem(DetectorItem *detectorItem);
+
+signals:
+    void extendedDetectorEditorRequest(DetectorItem *);
+
+private:
+    ColumnResizer *m_columnResizer;
+    BeamEditorWidget *m_beamEditor;
+    DetectorEditorWidget *m_detectorEditor;
+    BeamItem *m_beamItem;
+    DetectorItem *m_detectorItem;
+};
+
+#endif // INSTRUMENTCOMPONENTSWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp
new file mode 100644
index 0000000..f9ef746
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp
@@ -0,0 +1,187 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.cpp
+//! @brief     Implements class InstrumentEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InstrumentEditorWidget.h"
+#include "BeamEditorWidget.h"
+#include "BeamItem.h"
+#include "DetectorEditorWidget.h"
+#include "DetectorItems.h"
+#include "InstrumentComponentsWidget.h"
+#include "InstrumentItem.h"
+#include "SessionItem.h"
+#include <QBoxLayout>
+#include <QComboBox>
+#include <QDebug>
+#include <QEvent>
+#include <QGroupBox>
+#include <QLineEdit>
+#include <QScrollArea>
+#include <QScrollBar>
+
+
+class AdjustingScrollArea : public QScrollArea {
+    bool eventFilter(QObject * obj, QEvent * ev) {
+        if (obj == widget() && ev->type() != QEvent::Resize) {
+            widget()->setMaximumWidth(viewport()->width());
+            setMaximumHeight(height() - viewport()->height() + widget()->height());
+        }
+
+        return QScrollArea::eventFilter(obj, ev);
+    }
+
+    QSize sizeHint() const {
+        QScrollBar *horizontal = horizontalScrollBar();
+        QSize result(viewport()->width(), widget()->height()+horizontal->height()*2);
+        return result;
+    }
+public:
+    AdjustingScrollArea(QWidget * parent = 0) : QScrollArea(parent)
+    {
+        setObjectName("MyScrollArea");
+    }
+    void setWidget(QWidget *w) {
+        QScrollArea::setWidget(w);
+        w->installEventFilter(this);
+    }
+};
+
+InstrumentEditorWidget::InstrumentEditorWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_nameLineEdit(new QLineEdit())
+    , m_typeComboBox(new QComboBox())
+    , m_currentItem(0)
+    , m_block_signals(false)
+    , m_instrumentComponents(new InstrumentComponentsWidget)
+{
+    setMinimumSize(400, 400);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    // main group box with all instrument parameters
+    QGroupBox *instrumentGroup = new QGroupBox("Instrument Parameters");
+    QVBoxLayout *instrumentGroupLayout = new QVBoxLayout;
+    instrumentGroupLayout->setContentsMargins(0,0,0,0);
+    instrumentGroup->setLayout(instrumentGroupLayout);
+
+    instrumentGroupLayout->addSpacing(10);
+    instrumentGroupLayout->addLayout(create_NameAndTypeLayout());
+
+    // Scroling area with insturment components
+    m_instrumentComponents->setStyleSheet("InstrumentComponentsWidget {background-color:transparent;}");
+
+    AdjustingScrollArea *area = new AdjustingScrollArea;
+    area->setContentsMargins( 0, 0, 0, 0 );
+    area->setWidgetResizable(true);
+    area->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    area->setWidget(m_instrumentComponents);
+    area->setStyleSheet("QScrollArea#MyScrollArea {border: 0px; background-color:transparent;}");
+    instrumentGroupLayout->addWidget(area, 1);
+    instrumentGroupLayout->addStretch();
+
+    // setting main layout
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(instrumentGroup);
+    setLayout(mainLayout);
+
+    connect(m_nameLineEdit,
+            SIGNAL(textChanged(const QString &)),
+            this,
+            SLOT(onChangedEditor(const QString &))
+            );
+
+    connect(m_instrumentComponents,
+            SIGNAL(extendedDetectorEditorRequest(DetectorItem *)),
+            this,
+            SIGNAL(extendedDetectorEditorRequest(DetectorItem *))
+            );
+}
+
+void InstrumentEditorWidget::setInstrumentItem(SessionItem *instrument)
+{
+    Q_ASSERT(instrument);
+    if(instrument != m_currentItem) {
+        if(m_currentItem) {
+            // TODO restore logic
+//            disconnect(m_currentItem,
+//                       SIGNAL(propertyChanged(QString)),
+//                       this,
+//                       SLOT(onPropertyChanged(QString))
+//                       );
+//            disconnect(m_currentItem,
+//                       SIGNAL(subItemChanged(QString)),
+//                       this,
+//                       SLOT(onPropertyChanged(QString))
+//                       );
+        }
+        m_currentItem = instrument;
+//        connect(m_currentItem,
+//                   SIGNAL(propertyChanged(QString)),
+//                   this,
+//                   SLOT(onPropertyChanged(QString))
+//                   );
+//        connect(m_currentItem,
+//                   SIGNAL(subItemChanged(QString)),
+//                   this,
+//                   SLOT(onPropertyChanged(QString))
+//                   );
+        updateWidgets();
+    }
+    InstrumentItem *instrumentItem = dynamic_cast<InstrumentItem *>(instrument);
+
+    m_instrumentComponents->setBeamItem(instrumentItem->beamItem());
+    m_instrumentComponents->setDetectorItem(instrumentItem->detectorItem());
+}
+
+void InstrumentEditorWidget::onChangedEditor(const QString &)
+{
+    qDebug() << "InstrumentEditorWidget::onChangedEditor() ->";
+    Q_ASSERT(m_currentItem);
+    if(m_block_signals) return;
+    qDebug() << "          InstrumentEditorWidget::onChangedEditor(): " << m_nameLineEdit->text();
+    m_currentItem->setItemName(m_nameLineEdit->text());
+}
+
+void InstrumentEditorWidget::onPropertyChanged(const QString &)
+{
+    qDebug() << "InstrumentEditorWidget::onPropertyChanged() ->";
+}
+
+//! top block with instrument name and type
+QLayout *InstrumentEditorWidget::create_NameAndTypeLayout()
+{
+    QHBoxLayout *result = new QHBoxLayout;
+    m_nameLineEdit->setMinimumWidth(200);
+    m_typeComboBox->addItem("Default GISAS Instrument");
+
+    result->addSpacing(17);
+    result->addWidget(new QLabel("Name"));
+    result->addWidget(m_nameLineEdit);
+    result->addSpacing(5);
+    result->addWidget(new QLabel("Type"));
+    result->addWidget(m_typeComboBox);
+    result->addSpacing(18);
+    result->addStretch(1);
+
+    return result;
+}
+
+void InstrumentEditorWidget::updateWidgets()
+{
+    qDebug() << "InstrumentEditorWidget::updateWidgets() ->";
+    Q_ASSERT(m_currentItem);
+    m_block_signals = true;
+    m_nameLineEdit->setText(m_currentItem->itemName());
+    m_block_signals = false;
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.h b/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.h
new file mode 100644
index 0000000..4f97785
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.h
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/InstrumentEditorWidget.h
+//! @brief     Defines class InstrumentEditorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INSTRUMENTEDITORWIDGET_H
+#define INSTRUMENTEDITORWIDGET_H
+
+
+#include "WinDllMacros.h"
+#include <QLabel>
+#include <QMap>
+#include <QWidget>
+
+class SessionItem;
+class DetectorEditorWidget;
+class BeamEditorWidget;
+class QLineEdit;
+class QComboBox;
+class InstrumentComponentsWidget;
+class DetectorItem;
+
+class BA_CORE_API_ InstrumentEditorWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    InstrumentEditorWidget(QWidget *parent = 0);
+    QSize sizeHint() const { return QSize(600, 600); }
+
+    void setInstrumentItem(SessionItem *instrument);
+
+signals:
+    void extendedDetectorEditorRequest(DetectorItem *);
+
+public slots:
+    void onChangedEditor(const QString &);
+    void onPropertyChanged(const QString &);
+
+private:
+    QLayout *create_NameAndTypeLayout();
+
+    void updateWidgets();
+
+    QLineEdit *m_nameLineEdit;
+    QComboBox *m_typeComboBox;
+    SessionItem *m_currentItem;
+    bool m_block_signals;
+    InstrumentComponentsWidget *m_instrumentComponents;
+};
+
+#endif // INSTRUMENTEDITORWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.cpp
new file mode 100644
index 0000000..ea005c1
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.cpp
@@ -0,0 +1,101 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.cpp
+//! @brief     Implements class InstrumentSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InstrumentSelectorWidget.h"
+#include "InstrumentModel.h"
+#include "SessionItem.h"
+#include <QAction>
+#include <QDebug>
+#include <QListView>
+#include <QMenu>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+InstrumentSelectorWidget::InstrumentSelectorWidget(InstrumentModel *model, QWidget *parent)
+    : QWidget(parent)
+    , m_instrumentModel(0)
+    , m_listView(0)
+{
+    setMinimumSize(128, 400);
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+
+    m_listView = new QListView;
+    m_listView->setViewMode(QListView::IconMode);
+    m_listView->setIconSize(QSize(96, 84));
+    m_listView->setMovement(QListView::Static);
+    m_listView->setMaximumWidth(200);
+    m_listView->setSpacing(12);
+    m_listView->setAttribute(Qt::WA_MacShowFocusRect, false);
+    //m_listView->setModel(m_instrumentModel);
+
+    m_listView->setObjectName("listView");
+    m_listView->setStyleSheet(QString::fromUtf8("QListView#listView\n"
+    "{\n"
+    "   selection-background-color : rgb(98,100,105); \n"
+    "   selection-color: rgb(255,255,255);\n"
+    "   border: 1px solid rgb(98,100,105);\n"
+    "}\n"
+    ""));
+
+    QVBoxLayout *verticaLayout = new QVBoxLayout;
+    verticaLayout->setMargin(10);
+    verticaLayout->setSpacing(10);
+    verticaLayout->addWidget(m_listView, 3);
+
+    setLayout(verticaLayout);
+
+    setInstrumentModel(model);
+}
+
+
+void InstrumentSelectorWidget::setInstrumentModel(InstrumentModel *model)
+{
+    Q_ASSERT(model);
+    Q_ASSERT(m_listView);
+
+    if(model != m_instrumentModel) {
+        m_instrumentModel = model;
+
+        if(m_instrumentModel) {
+            m_listView->setModel(model);
+
+            connect(m_listView->selectionModel(),
+                    SIGNAL( selectionChanged(const QItemSelection&, const QItemSelection&)),
+                    this,
+                    SIGNAL( selectionChanged(const QItemSelection&, const QItemSelection&)),
+                    Qt::UniqueConnection
+            );
+        }
+
+    }
+}
+
+
+QItemSelectionModel *InstrumentSelectorWidget::getSelectionModel()
+{
+    return m_listView->selectionModel();
+}
+
+
+//! select last item if no selection exists
+void InstrumentSelectorWidget::updateSelection()
+{
+    if (!getSelectionModel()->hasSelection()) {
+        QModelIndex itemIndex = m_instrumentModel->index(
+            m_instrumentModel->rowCount(QModelIndex()) - 1, 0, QModelIndex());
+        getSelectionModel()->select(itemIndex, QItemSelectionModel::Select);
+    }
+}
diff --git a/GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.h b/GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.h
new file mode 100644
index 0000000..8e8cee9
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/InstrumentSelectorWidget.h
+//! @brief     Defines class InstrumentSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INSTRUMENTSELECTORWIDGET_H
+#define INSTRUMENTSELECTORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+class InstrumentModel;
+class QListView;
+class QAction;
+class QItemSelectionModel;
+class QItemSelection;
+
+
+class BA_CORE_API_ InstrumentSelectorWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    InstrumentSelectorWidget(InstrumentModel *model, QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(200, 400); }
+    QSize minimumSizeHint() const { return QSize(128, 200); }
+
+    void setInstrumentModel(InstrumentModel *model);
+
+    QItemSelectionModel *getSelectionModel();
+    QListView *getListView() { return m_listView; }
+
+signals:
+    void selectionChanged(const QItemSelection&, const QItemSelection&);
+
+public slots:
+    void updateSelection();
+
+private:
+    InstrumentModel *m_instrumentModel;
+    QListView *m_listView;
+};
+
+
+#endif // INSTRUMENTSELECTORWIDGET_H
+
diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp
new file mode 100644
index 0000000..fb8e1af
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp
@@ -0,0 +1,225 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.cpp
+//! @brief     Implements class RectangularDetectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RectangularDetectorWidget.h"
+#include "ComboProperty.h"
+#include "ComponentBoxEditor.h"
+#include "ComponentEditor.h"
+#include "DetectorItems.h"
+#include "ExtendedDetectorDialog.h"
+#include "GroupInfoBox.h"
+#include "columnresizer.h"
+#include <QDebug>
+#include <QGroupBox>
+#include <QVBoxLayout>
+
+RectangularDetectorWidget::RectangularDetectorWidget(ColumnResizer *columnResizer,
+                                                     RectangularDetectorItem *detectorItem, QWidget *parent)
+    : QWidget(parent)
+    , m_columnResizer(0)
+    , m_xAxisEditor(0)
+    , m_yAxisEditor(0)
+    , m_resolutionFunctionEditor(0)
+    , m_alignmentEditor(0)
+    , m_positionsEditor(0)
+    , m_normalEditor(0)
+    , m_directionEditor(0)
+    , m_gridLayout(new QGridLayout)
+    , m_detectorItem(0)
+{
+    create_editors();
+    setColumnResizer(columnResizer);
+
+    // main layout
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->addLayout(m_gridLayout);
+    mainLayout->addStretch();
+    setLayout(mainLayout);
+
+    setDetectorItem(detectorItem);
+}
+
+RectangularDetectorWidget::~RectangularDetectorWidget()
+{
+    if(m_columnResizer) m_columnResizer->dropWidgetsFromGridLayout(m_gridLayout);
+}
+
+void RectangularDetectorWidget::setDetectorItem(RectangularDetectorItem *detectorItem)
+{
+    if(m_detectorItem == detectorItem) {
+        return;
+
+    } else {
+        if(m_detectorItem)
+            m_detectorItem->mapper()->unsubscribe(this);
+
+        m_detectorItem = detectorItem;
+        if(!m_detectorItem) return;
+
+        m_detectorItem->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
+
+        init_editors();
+    }
+}
+
+void RectangularDetectorWidget::onPropertyChanged(const QString &propertyName)
+{
+    qDebug() << "RectangularDetectorWidget::onPropertyChanged()" << propertyName;
+    if(propertyName == RectangularDetectorItem::P_ALIGNMENT) {
+        init_alignment_editors();
+    }
+
+}
+
+void RectangularDetectorWidget::onColumnResizerDestroyed(QObject *object)
+{
+    if(object == m_columnResizer) m_columnResizer = 0;
+}
+
+//! set widget alignment to be under the control of external resizer
+void RectangularDetectorWidget::setColumnResizer(ColumnResizer *columnResizer)
+{
+    if(m_columnResizer) {
+        m_columnResizer->dropWidgetsFromGridLayout(m_gridLayout);
+        disconnect(m_columnResizer,
+                   SIGNAL(destroyed(QObject*)),
+                   this,
+                   SLOT(onColumnResizerDestroyed(QObject *)));
+    }
+    m_columnResizer = columnResizer;
+
+    if(m_columnResizer) {
+        connect(m_columnResizer,
+                SIGNAL(destroyed(QObject*)),
+                this,
+                SLOT(onColumnResizerDestroyed(QObject *)));
+
+    }
+    m_columnResizer->addWidgetsFromGridLayout(m_gridLayout, 0);
+    m_columnResizer->addWidgetsFromGridLayout(m_gridLayout, 1);
+    m_columnResizer->addWidgetsFromGridLayout(m_gridLayout, 2);
+}
+
+//! create various editors to hold RectangularDetector properties
+void RectangularDetectorWidget::create_editors()
+{
+    // axes and resolution function editors
+    m_xAxisEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_xAxisEditor, 1, 0);
+
+    m_yAxisEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_yAxisEditor, 1, 1);
+
+    m_resolutionFunctionEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_resolutionFunctionEditor, 1, 2);
+
+    // alignment selector editors
+    m_alignmentEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_alignmentEditor, 2, 0);
+
+    // editors for various positions
+    m_positionsEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_positionsEditor, 3, 0);
+
+    m_normalEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_normalEditor, 3, 1);
+
+    m_directionEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_directionEditor, 3, 2);
+
+}
+
+void RectangularDetectorWidget::init_editors()
+{
+    m_xAxisEditor->clearEditor();
+    SessionItem *xAxisItem = m_detectorItem->getItem(RectangularDetectorItem::P_X_AXIS);
+    m_xAxisEditor->addPropertyItems(xAxisItem, QString("X axis"));
+
+    m_yAxisEditor->clearEditor();
+    SessionItem *yAxisItem
+        = m_detectorItem->getItem(RectangularDetectorItem::P_Y_AXIS);
+    m_yAxisEditor->addPropertyItems(yAxisItem, QString("Y axis"));
+
+    m_resolutionFunctionEditor->clearEditor();
+    SessionItem *resFuncGroup = m_detectorItem->getItem(RectangularDetectorItem::P_RESOLUTION_FUNCTION);
+    m_resolutionFunctionEditor->addPropertyItems(resFuncGroup, QString("Resolution function"));
+
+
+    m_alignmentEditor->clearEditor();
+    m_alignmentEditor->addItem(m_detectorItem->getItem(RectangularDetectorItem::P_ALIGNMENT));
+
+    init_alignment_editors();
+}
+
+void RectangularDetectorWidget::init_alignment_editors()
+{
+    m_positionsEditor->clearEditor();
+    m_positionsEditor->hide();
+
+    m_normalEditor->clearEditor();
+    m_normalEditor->hide();
+
+    m_directionEditor->clearEditor();
+    m_directionEditor->hide();
+
+    ComboProperty alignment
+        = m_detectorItem->getItemValue(RectangularDetectorItem::P_ALIGNMENT)
+              .value<ComboProperty>();
+
+
+    if (alignment.getValue() == Constants::ALIGNMENT_GENERIC) {
+        m_positionsEditor->show();
+        m_normalEditor->show();
+        m_directionEditor->show();
+
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_U0), "Positions");
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_V0), "Positions");
+
+        SessionItem *normalVectorItem
+            = m_detectorItem->getItem(RectangularDetectorItem::P_NORMAL);
+        m_normalEditor->addPropertyItems(normalVectorItem, "Normal vector");
+
+        SessionItem *directionVectorItem
+            = m_detectorItem->getItem(RectangularDetectorItem::P_DIRECTION);
+        m_directionEditor->addPropertyItems(directionVectorItem, "Direction vector");
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_DIRECT_BEAM ||
+               alignment.getValue() == Constants::ALIGNMENT_TO_REFLECTED_BEAM_DPOS) {
+        m_positionsEditor->show();
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_DBEAM_U0), "Positions");
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_DBEAM_V0), "Positions");
+
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_DISTANCE), "Positions");
+
+    } else if (alignment.getValue() == Constants::ALIGNMENT_TO_SAMPLE ||
+               alignment.getValue() == Constants::ALIGNMENT_TO_REFLECTED_BEAM) {
+        m_positionsEditor->show();
+
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_U0), "Positions");
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_V0), "Positions");
+
+        m_positionsEditor->addPropertyItems(m_detectorItem->getItem(RectangularDetectorItem::P_DISTANCE), "Positions");
+
+    }
+
+}
+
+
diff --git a/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h
new file mode 100644
index 0000000..1dbc6e8
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/RectangularDetectorWidget.h
+//! @brief     Defines class RectangularDetectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RECTANGULARDETECTORWIDGET_H
+#define RECTANGULARDETECTORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class ColumnResizer;
+class GroupInfoBox;
+class RectangularDetectorItem;
+class AwesomePropertyEditor;
+class ComponentBoxEditor;
+class QGridLayout;
+class ColumnResizer;
+
+class BA_CORE_API_ RectangularDetectorWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    RectangularDetectorWidget(ColumnResizer *columnResizer,
+                              RectangularDetectorItem *detectorItem, QWidget *parent = 0);
+    virtual ~RectangularDetectorWidget();
+
+    void setDetectorItem(RectangularDetectorItem *detectorItem);
+
+public slots:
+    void onPropertyChanged(const QString &propertyName);
+    void onColumnResizerDestroyed(QObject *object);
+    void setColumnResizer(ColumnResizer *columnResizer);
+
+private:
+    void create_editors();
+    void init_editors();
+    void init_alignment_editors();
+
+    ColumnResizer *m_columnResizer;
+    ComponentBoxEditor *m_xAxisEditor;
+    ComponentBoxEditor *m_yAxisEditor;
+    ComponentBoxEditor *m_resolutionFunctionEditor;
+    ComponentBoxEditor *m_alignmentEditor;
+
+    ComponentBoxEditor *m_positionsEditor;
+    ComponentBoxEditor *m_normalEditor;
+    ComponentBoxEditor *m_directionEditor;
+
+    QGridLayout *m_gridLayout;
+
+    RectangularDetectorItem *m_detectorItem;
+};
+
+#endif // RECTANGULARDETECTORWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.cpp b/GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.cpp
new file mode 100644
index 0000000..c20de31
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.cpp
@@ -0,0 +1,100 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.cpp
+//! @brief     Implements class SphericalDetectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SphericalDetectorWidget.h"
+#include "ComponentBoxEditor.h"
+#include "DetectorItems.h"
+#include "ExtendedDetectorDialog.h"
+#include "GroupInfoBox.h"
+#include "columnresizer.h"
+#include <QDebug>
+#include <QGroupBox>
+#include <QVBoxLayout>
+
+SphericalDetectorWidget::SphericalDetectorWidget(ColumnResizer *columnResizer,
+                                                 DetectorItem *detectorItem, QWidget *parent)
+    : QWidget(parent)
+    , m_columnResizer(columnResizer)
+    , m_phiAxisEditor(0)
+    , m_alphaAxisEditor(0)
+    , m_resolutionFunctionEditor(0)
+    , m_gridLayout(new QGridLayout)
+{
+    m_phiAxisEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_phiAxisEditor, 1, 0);
+
+    m_alphaAxisEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_alphaAxisEditor, 1, 1);
+
+    m_resolutionFunctionEditor = new ComponentBoxEditor;
+    m_gridLayout->addWidget(m_resolutionFunctionEditor, 1, 2);
+
+    m_columnResizer->addWidgetsFromGridLayout(m_gridLayout, 0);
+    m_columnResizer->addWidgetsFromGridLayout(m_gridLayout, 1);
+    m_columnResizer->addWidgetsFromGridLayout(m_gridLayout, 2);
+
+    connect(m_columnResizer, SIGNAL(destroyed(QObject*)), this, SLOT(onColumnResizerDestroyed(QObject *)));
+
+    // main layout
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->addLayout(m_gridLayout);
+    mainLayout->addStretch();
+    setLayout(mainLayout);
+
+    setDetectorItem(detectorItem);
+}
+
+SphericalDetectorWidget::~SphericalDetectorWidget()
+{
+    qDebug() << "SphericalDetectorWidget::~SphericalDetectorWidget()";
+    m_phiAxisEditor->clearEditor();
+    m_alphaAxisEditor->clearEditor();
+    m_resolutionFunctionEditor->clearEditor();
+    if(m_columnResizer) m_columnResizer->dropWidgetsFromGridLayout(m_gridLayout);
+
+}
+
+void SphericalDetectorWidget::setDetectorItem(DetectorItem *detectorItem)
+{
+    m_phiAxisEditor->clearEditor();
+    m_alphaAxisEditor->clearEditor();
+    m_resolutionFunctionEditor->clearEditor();
+
+    if (!detectorItem)
+        return;
+
+    SphericalDetectorItem *sphericalDetector = dynamic_cast<SphericalDetectorItem *>(
+                detectorItem->getGroupItem(DetectorItem::P_DETECTOR));
+    Q_ASSERT(sphericalDetector);
+
+    SessionItem *phiAxisItem = sphericalDetector->getItem(SphericalDetectorItem::P_PHI_AXIS);
+    m_phiAxisEditor->addPropertyItems(phiAxisItem, QString("Phi axis"));
+
+    SessionItem *alphaAxisItem
+        = sphericalDetector->getItem(SphericalDetectorItem::P_ALPHA_AXIS);
+    m_alphaAxisEditor->addPropertyItems(alphaAxisItem, QString("Alpha axis"));
+
+    SessionItem *resFuncGroup = sphericalDetector->getItem(SphericalDetectorItem::P_RESOLUTION_FUNCTION);
+    m_resolutionFunctionEditor->addPropertyItems(resFuncGroup, QString("Resolution function"));
+}
+
+void SphericalDetectorWidget::onColumnResizerDestroyed(QObject *object)
+{
+    if(object == m_columnResizer) m_columnResizer = 0;
+}
+
+
diff --git a/GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.h b/GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.h
new file mode 100644
index 0000000..62c0a54
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/SphericalDetectorWidget.h
+//! @brief     Defines class SphericalDetectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPHERICALDETECTORWIDGET_H
+#define SPHERICALDETECTORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class DetectorItem;
+class QGridLayout;
+class ColumnResizer;
+class ComponentBoxEditor;
+
+//! Widget for editing a spherical detector settings
+
+class BA_CORE_API_ SphericalDetectorWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    SphericalDetectorWidget(ColumnResizer *columnResizer,
+                            DetectorItem *detectorItem, QWidget *parent = 0);
+    virtual ~SphericalDetectorWidget();
+
+    void setDetectorItem(DetectorItem *detectorItem);
+
+public slots:
+    void onColumnResizerDestroyed(QObject *object);
+
+private:
+    ColumnResizer *m_columnResizer;
+    ComponentBoxEditor *m_phiAxisEditor;
+    ComponentBoxEditor *m_alphaAxisEditor;
+    ComponentBoxEditor *m_resolutionFunctionEditor;
+    QGridLayout *m_gridLayout;
+};
+
+#endif // SPHERICALDETECTORWIDGET_H
diff --git a/GUI/coregui/Views/InstrumentWidgets/columnresizer.cpp b/GUI/coregui/Views/InstrumentWidgets/columnresizer.cpp
new file mode 100644
index 0000000..0d13340
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/columnresizer.cpp
@@ -0,0 +1,291 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/columnresizer.cpp
+//! @brief     Implements class ColumnResizer
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+/*
+ * Copyright 2011 Aurélien Gâteau <agateau at kde.org>
+ * License: LGPL v2.1 or later (see COPYING)
+ */
+#include <columnresizer.h>
+
+#include <QDebug>
+#include <QEvent>
+#include <QFormLayout>
+#include <QGridLayout>
+#include <QTimer>
+#include <QWidget>
+
+class FormLayoutWidgetItem : public QWidgetItem
+{
+public:
+    FormLayoutWidgetItem(QWidget* widget, QFormLayout* formLayout, QFormLayout::ItemRole itemRole)
+    : QWidgetItem(widget)
+    , m_width(-1)
+    , m_formLayout(formLayout)
+    , m_itemRole(itemRole)
+    {}
+
+    QSize sizeHint() const
+    {
+        QSize size = QWidgetItem::sizeHint();
+        if (m_width != -1) {
+            size.setWidth(m_width);
+        }
+        return size;
+    }
+
+    QSize minimumSize() const
+    {
+        QSize size = QWidgetItem::minimumSize();
+        if (m_width != -1) {
+            size.setWidth(m_width);
+        }
+        return size;
+    }
+
+    QSize maximumSize() const
+    {
+        QSize size = QWidgetItem::maximumSize();
+        if (m_width != -1) {
+            size.setWidth(m_width);
+        }
+        return size;
+    }
+
+    void setWidth(int width)
+    {
+        if (width != m_width) {
+            m_width = width;
+            invalidate();
+        }
+    }
+
+    void setGeometry(const QRect& _rect)
+    {
+        QRect rect = _rect;
+        int width = widget()->sizeHint().width();
+        if (m_itemRole == QFormLayout::LabelRole && m_formLayout->labelAlignment() & Qt::AlignRight) {
+            rect.setLeft(rect.right() - width);
+        }
+        QWidgetItem::setGeometry(rect);
+    }
+
+    QFormLayout* formLayout() const
+    {
+        return m_formLayout;
+    }
+
+private:
+    int m_width;
+    QFormLayout* m_formLayout;
+    QFormLayout::ItemRole m_itemRole;
+};
+
+typedef QPair<QGridLayout*, int> GridColumnInfo;
+
+class ColumnResizerPrivate
+{
+public:
+    ColumnResizerPrivate(ColumnResizer* q_ptr)
+    : q(q_ptr)
+    , m_updateTimer(new QTimer(q))
+    , block_update(false)
+    {
+        m_updateTimer->setSingleShot(true);
+        m_updateTimer->setInterval(0);
+        QObject::connect(m_updateTimer, SIGNAL(timeout()), q, SLOT(updateWidth()));
+    }
+
+    void scheduleWidthUpdate()
+    {
+        if(block_update) return;
+        m_updateTimer->start();
+    }
+
+    ColumnResizer* q;
+    QTimer* m_updateTimer;
+    QList<QWidget*> m_widgets;
+    QList<FormLayoutWidgetItem*> m_wrWidgetItemList;
+    QList<GridColumnInfo> m_gridColumnInfoList;
+    bool block_update;
+};
+
+ColumnResizer::ColumnResizer(QObject* parent)
+: QObject(parent)
+, d(new ColumnResizerPrivate(this))
+{}
+
+ColumnResizer::~ColumnResizer()
+{
+    qDebug() << "ColumnResizer::~ColumnResizer() ->";
+    delete d;
+}
+
+void ColumnResizer::addWidget(QWidget* widget)
+{
+    d->m_widgets.append(widget);
+    widget->installEventFilter(this);
+//    connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(onObjectDestroyed(QObject*)));
+    d->scheduleWidthUpdate();
+}
+
+void ColumnResizer::updateWidth()
+{
+    if(d->block_update) return;
+    qDebug() << "ColumnResizer::updateWidth()";
+    int width = 0;
+    Q_FOREACH(QWidget* widget, d->m_widgets) {
+        qDebug() << "       ColumnResizer::updateWidth()" << widget;
+        width = qMax(widget->sizeHint().width(), width);
+    }
+    Q_FOREACH(FormLayoutWidgetItem* item, d->m_wrWidgetItemList) {
+        item->setWidth(width);
+        item->formLayout()->update();
+    }
+    Q_FOREACH(GridColumnInfo info, d->m_gridColumnInfoList) {
+        info.first->setColumnMinimumWidth(info.second, width);
+    }
+}
+
+void ColumnResizer::removeWidget(QWidget *widget)
+{
+    if(d->m_widgets.contains(widget)) {
+        d->m_widgets.removeAll(widget);
+        widget->removeEventFilter(this);
+    }
+}
+
+bool ColumnResizer::eventFilter(QObject*, QEvent* event)
+{
+    if (event->type() == QEvent::Resize) {
+        d->scheduleWidthUpdate();
+    }
+    return false;
+}
+
+void ColumnResizer::addWidgetsFromLayout(QLayout* layout, int column)
+{
+    Q_ASSERT(column >= 0);
+    QGridLayout* gridLayout = qobject_cast<QGridLayout*>(layout);
+    QFormLayout* formLayout = qobject_cast<QFormLayout*>(layout);
+    if (gridLayout) {
+        addWidgetsFromGridLayout(gridLayout, column);
+    } else if (formLayout) {
+        if (column > QFormLayout::SpanningRole) {
+            qCritical() << "column should not be more than" << QFormLayout::SpanningRole << "for QFormLayout";
+            return;
+        }
+        QFormLayout::ItemRole role = static_cast<QFormLayout::ItemRole>(column);
+        addWidgetsFromFormLayout(formLayout, role);
+    } else {
+        qCritical() << "Don't know how to handle layout" << layout;
+    }
+}
+
+void ColumnResizer::addWidgetsFromGridLayout(QGridLayout* layout, int column)
+{
+    for (int row = 0; row < layout->rowCount(); ++row) {
+        QLayoutItem* item = layout->itemAtPosition(row, column);
+        if (!item) {
+            continue;
+        }
+        QWidget* widget = item->widget();
+        if (!widget) {
+            continue;
+        }
+        addWidget(widget);
+    }
+    d->m_gridColumnInfoList << GridColumnInfo(layout, column);
+//    connect(layout, SIGNAL(destroyed(QObject*)), this, SLOT(onObjectDestroyed(QObject*)));
+
+}
+
+void ColumnResizer::addWidgetsFromFormLayout(QFormLayout* layout, QFormLayout::ItemRole role)
+{
+    for (int row = 0; row < layout->rowCount(); ++row) {
+        QLayoutItem* item = layout->itemAt(row, role);
+        if (!item) {
+            continue;
+        }
+        QWidget* widget = item->widget();
+        if (!widget) {
+            continue;
+        }
+        layout->removeItem(item);
+        delete item;
+        FormLayoutWidgetItem* newItem = new FormLayoutWidgetItem(widget, layout, role);
+        layout->setItem(row, role, newItem);
+        addWidget(widget);
+        d->m_wrWidgetItemList << newItem;
+    }
+}
+
+void ColumnResizer::dropWidgetsFromGridLayout(QGridLayout *layout)
+{
+    qDebug() << "ColumnResizer::dropWidgetsFromGridLayout";
+//    d->block_update = true;
+    // removing all widgets from being supervised
+    for (int row = 0; row < layout->rowCount(); ++row) {
+        for(int column =0; column<layout->columnCount(); ++column) {
+            QLayoutItem* item = layout->itemAtPosition(row, column);
+            if (!item) {
+                continue;
+            }
+            QWidget* widget = item->widget();
+            if (!widget) {
+                continue;
+            }
+            removeWidget(widget);
+        }
+    }
+
+    // removing their layout
+    QMutableListIterator<GridColumnInfo> it(d->m_gridColumnInfoList);
+    while (it.hasNext()) {
+        GridColumnInfo ci = it.next();
+        if(ci.first == layout) {
+            it.remove();
+        }
+    }
+
+//    d->block_update = false;
+    //d->scheduleWidthUpdate();
+}
+
+//void ColumnResizer::onObjectDestroyed(QObject *object)
+//{
+//    qDebug() << "================================";
+//    qDebug() << "ColumnResizer::onObjectDestroyed" << object;
+//    d->block_update = true;
+//    if(QWidget *widget = dynamic_cast<QWidget *>(object)) {
+//        Q_ASSERT(0);
+//        if(d->m_widgets.contains(widget)) {
+//            d->m_widgets.removeAll(widget);
+//        }
+//    }
+//    else if(QGridLayout *layout = qobject_cast<QGridLayout *>(object)) {
+//        QMutableListIterator<GridColumnInfo> it(d->m_gridColumnInfoList);
+//        while (it.hasNext()) {
+//            GridColumnInfo ci = it.next();
+//            if(ci.first == layout) {
+//                it.remove();
+//            }
+//        }
+//    }
+//    d->block_update = false;
+//}
+
+#include <columnresizer.moc>
+// vi: ts=4 sw=4 et
diff --git a/GUI/coregui/Views/InstrumentWidgets/columnresizer.h b/GUI/coregui/Views/InstrumentWidgets/columnresizer.h
new file mode 100644
index 0000000..ca1fa37
--- /dev/null
+++ b/GUI/coregui/Views/InstrumentWidgets/columnresizer.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/InstrumentWidgets/columnresizer.h
+//! @brief     Defines class ColumnResizer
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+/*
+ * Copyright 2011 Aurélien Gâteau <agateau at kde.org>
+ * License: LGPL v2.1 or later (see COPYING)
+ */
+#ifndef COLUMNRESIZER_H
+#define COLUMNRESIZER_H
+
+#include <QFormLayout>
+
+#include <QtCore/QObject>
+#include <QtCore/QList>
+
+class QEvent;
+class QGridLayout;
+class QLayout;
+class QWidget;
+
+class ColumnResizerPrivate;
+
+//! The ColumnResizer class provides vertically aligned widgets from diferent layouts
+//! http://agateau.com/2011/clean-up-your-layouts-with-columnresizer/
+//! https://github.com/agateau/columnresizer
+class ColumnResizer : public QObject
+{
+    Q_OBJECT
+public:
+    ColumnResizer(QObject* parent = 0);
+    virtual ~ColumnResizer();
+
+    void addWidget(QWidget* widget);
+    void addWidgetsFromLayout(QLayout*, int column);
+    void addWidgetsFromGridLayout(QGridLayout*, int column);
+    void addWidgetsFromFormLayout(QFormLayout*, QFormLayout::ItemRole role);
+
+    void dropWidgetsFromGridLayout(QGridLayout *layout);
+
+//public slots:
+//    void onObjectDestroyed(QObject *object);
+
+private slots:
+    void updateWidth();
+
+protected:
+    void removeWidget(QWidget* widget);
+    virtual bool eventFilter(QObject*, QEvent* event);
+
+private:
+    ColumnResizerPrivate* const d;
+};
+
+#endif // COLUMNRESIZER_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp
new file mode 100644
index 0000000..b063a41
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp
@@ -0,0 +1,520 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMap.cpp
+//! @brief     Implements class ColorMap
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMap.h"
+#include "AxesItems.h"
+#include "ColorMapEvent.h"
+#include "ColorMapHelper.h"
+#include "GUIHelpers.h"
+#include "IntensityDataItem.h"
+#include "MathConstants.h"
+#include "UpdateTimer.h"
+#include "plot_constants.h"
+#include <QDebug>
+
+namespace {
+const int replot_update_interval = 10;
+}
+
+ColorMap::ColorMap(QWidget *parent)
+    : QWidget(parent)
+    , m_customPlot(new QCustomPlot())
+    , m_colorMap(0)
+    , m_colorScale(0)
+    , m_updateTimer(new UpdateTimer(replot_update_interval, this))
+    , m_colorMapEvent(new ColorMapEvent(this))
+    , m_item(0)
+    , m_block_update(true)
+{
+    initColorMap();
+
+    QVBoxLayout *vlayout = new QVBoxLayout(this);
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+    vlayout->addWidget(m_customPlot);
+    setLayout(vlayout);
+
+    setMouseTrackingEnabled(true);
+
+    //    setFixedColorMapMargins();
+}
+
+ColorMap::~ColorMap()
+{
+    if(m_item)
+        m_item->mapper()->unsubscribe(this);
+
+}
+
+//! Sets ColorMap to track intensity item.
+
+void ColorMap::setItem(IntensityDataItem *item)
+{
+    if(item == m_item)
+        return;
+
+    resetColorMap();
+
+    m_item = item;
+    if(!m_item)
+        return;
+
+    // FIXME. ColorMapPlot should be functional, even if OutputData is zero
+    if(m_item->getOutputData() == nullptr) {
+        m_item = 0;
+        return;
+    }
+
+    setColorMapFromItem(m_item);
+
+    m_item->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+    {
+        onPropertyChanged(name);
+    }, this);
+
+    m_item->mapper()->setOnChildPropertyChange([this](SessionItem *item, const QString name) {
+        onSubItemPropertyChanged(item->itemName(), name);
+    }, this);
+
+    m_item->mapper()->setOnValueChange(
+        [this]()
+    {
+        onIntensityModified();
+    }, this);
+
+    m_item->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_item = 0;
+    }, this);
+
+    setConnected(true);
+
+}
+
+double ColorMap::xAxisCoordToPixel(double axis_coordinate) const
+{
+    return m_customPlot->xAxis->coordToPixel(axis_coordinate);
+}
+
+double ColorMap::yAxisCoordToPixel(double axis_coordinate) const
+{
+    return m_customPlot->yAxis->coordToPixel(axis_coordinate);
+}
+
+double ColorMap::pixelToXaxisCoord(double pixel) const
+{
+    return m_customPlot->xAxis->pixelToCoord(pixel);
+}
+
+double ColorMap::pixelToYaxisCoord(double pixel) const
+{
+    return m_customPlot->yAxis->pixelToCoord(pixel);
+}
+
+QRectF ColorMap::getViewportRectangleInWidgetCoordinates()
+{
+    QCPRange xrange = m_customPlot->xAxis->range();
+    QCPRange yrange = m_customPlot->yAxis->range();
+    double left = xrange.lower;
+    double right = xrange.upper;
+    double top = yrange.upper;
+    double bottom = yrange.lower;
+
+    return QRectF(xAxisCoordToPixel(left),
+                  yAxisCoordToPixel(top),
+                  xAxisCoordToPixel(right) - xAxisCoordToPixel(left),
+                  yAxisCoordToPixel(bottom) - yAxisCoordToPixel(top));
+}
+
+bool ColorMap::axesRangeContains(double xpos, double ypos) const
+{
+    if (customPlot()->xAxis->range().contains(xpos)
+            && customPlot()->yAxis->range().contains(ypos)) {
+        return true;
+    }
+    return false;
+}
+
+ColorMapBin ColorMap::colorMapBin(double xpos, double ypos) const
+{
+    ColorMapBin result;
+
+    result.m_x = xpos;
+    result.m_y = ypos;
+
+    if(axesRangeContains(xpos, ypos))
+        result.in_axes_range = true;
+
+     m_colorMap->data()->coordToCell(xpos, ypos, &result.m_nx, &result.m_ny);
+     result.m_value = m_colorMap->data()->cell(result.m_nx, result.m_ny);
+
+    return result;
+}
+
+//! to track move events (used when showing profile histograms and printing status string)
+
+void ColorMap::setMouseTrackingEnabled(bool enable)
+{
+    m_colorMapEvent->setMouseTrackingEnabled(enable);
+}
+
+//! sets logarithmic scale
+void ColorMap::setLogz(bool logz)
+{
+    if (logz) {
+        if(m_colorScale->dataScaleType() != QCPAxis::stLogarithmic) {
+            m_colorScale->setDataScaleType(QCPAxis::stLogarithmic);
+            m_colorScale->axis()->setNumberFormat("eb");
+            m_colorScale->axis()->setNumberPrecision(0);
+        }
+    } else {
+        if(m_colorScale->dataScaleType() != QCPAxis::stLinear) {
+            m_colorScale->axis()->setNumberFormat("f");
+            m_colorScale->axis()->setNumberPrecision(0);
+            m_colorScale->setDataScaleType(QCPAxis::stLinear);
+        }
+    }
+}
+
+//! reset all axes min,max to initial value
+void ColorMap::resetView()
+{
+    m_item->resetView();
+}
+
+void ColorMap::onIntensityModified()
+{
+    setAxesRangeFromItem(m_item);
+    setDataFromItem(m_item);
+    replot();
+}
+
+//! updates color map depending on  IntensityDataItem properties
+void ColorMap::onPropertyChanged(const QString &property_name)
+{
+    if (m_block_update)
+        return;
+
+    if (property_name == IntensityDataItem::P_GRADIENT) {
+        m_colorMap->setGradient(ColorMapHelper::itemGradient(m_item));
+        replot();
+    } else if (property_name == IntensityDataItem::P_IS_INTERPOLATED) {
+        m_colorMap->setInterpolate(m_item->isInterpolated());
+        replot();
+    } else if(property_name == IntensityDataItem::P_AXES_UNITS) {
+        setAxesRangeFromItem(m_item);
+        replot();
+    }
+}
+
+void ColorMap::onSubItemPropertyChanged(const QString &property_group,
+                                            const QString &property_name)
+{
+    if (m_block_update)
+        return;
+
+    if (property_group == IntensityDataItem::P_XAXIS) {
+        if (property_name == BasicAxisItem::P_MIN || property_name == BasicAxisItem::P_MAX) {
+            setAxesRangeConnected(false);
+            QCPRange range = m_customPlot->xAxis->range();
+            range.lower = m_item->getLowerX();
+            range.upper = m_item->getUpperX();
+            m_customPlot->xAxis->setRange(range);
+            setAxesRangeConnected(true);
+            replot();
+        } else if (property_name == BasicAxisItem::P_TITLE) {
+            m_customPlot->xAxis->setLabel(m_item->getXaxisTitle());
+            m_colorScale->setMargins(QMargins(0,0,0,0));
+            // a hack to make MarginGroup working
+            //             m_customPlot->plotLayout()->simplify();
+            replot();
+        }
+    } else if (property_group == IntensityDataItem::P_YAXIS) {
+        if (property_name == BasicAxisItem::P_MIN || property_name == BasicAxisItem::P_MAX) {
+            setAxesRangeConnected(false);
+            QCPRange range = m_customPlot->yAxis->range();
+            range.lower = m_item->getLowerY();
+            range.upper = m_item->getUpperY();
+            m_customPlot->yAxis->setRange(range);
+            setAxesRangeConnected(true);
+            replot();
+        } else if (property_name == BasicAxisItem::P_TITLE) {
+            m_customPlot->yAxis->setLabel(m_item->getYaxisTitle());
+            replot();
+        }
+    }
+
+    else if (property_group == IntensityDataItem::P_ZAXIS) {
+        if (property_name == BasicAxisItem::P_MIN || property_name == BasicAxisItem::P_MAX) {
+            setDataRangeFromItem(m_item);
+            replot();
+        } else if (property_name == AmplitudeAxisItem::P_IS_LOGSCALE) {
+            setLogz(m_item->isLogz());
+            replot();
+
+        } else if (property_name == BasicAxisItem::P_IS_VISIBLE) {
+            setColorScaleVisible(m_item->getItem(IntensityDataItem::P_ZAXIS)
+                ->getItemValue(BasicAxisItem::P_IS_VISIBLE).toBool());
+            replot();
+        }
+    }
+}
+
+//! Propagate zmin, zmax back to IntensityDataItem
+void ColorMap::onDataRangeChanged(QCPRange newRange)
+{
+    m_block_update = true;
+    m_item->setLowerAndUpperZ(newRange.lower, newRange.upper);
+    m_block_update = false;
+}
+
+//! Propagate xmin, xmax back to IntensityDataItem
+void ColorMap::onXaxisRangeChanged(QCPRange newRange)
+{
+    m_block_update = true;
+    m_item->setLowerX(newRange.lower);
+    m_item->setUpperX(newRange.upper);
+    m_block_update = false;
+}
+
+//! Propagate ymin, ymax back to IntensityDataItem
+void ColorMap::onYaxisRangeChanged(QCPRange newRange)
+{
+    m_block_update = true;
+    m_item->setLowerY(newRange.lower);
+    m_item->setUpperY(newRange.upper);
+    m_block_update = false;
+}
+
+//! Schedule replot for later execution by onTimeReplot() slot.
+
+void ColorMap::replot()
+{
+    m_updateTimer->scheduleUpdate();
+//    m_customPlot->replot(); // will trigger immediate replot, seems that slower
+}
+
+//! Replots ColorMap.
+
+void ColorMap::onTimeToReplot()
+{
+    m_customPlot->replot();
+}
+
+//! creates and initializes the color map
+void ColorMap::initColorMap()
+{
+    m_colorMap = new QCPColorMap(m_customPlot->xAxis, m_customPlot->yAxis);
+    m_customPlot->addPlottable(m_colorMap);
+    m_colorScale = new QCPColorScale(m_customPlot);
+    m_colorMap->setColorScale(m_colorScale);
+
+    m_colorScale->setBarWidth(Constants::plot_colorbar_size);
+    m_colorScale->axis()->setTickLabelFont(QFont(QFont().family(), Constants::plot_tick_label_size));
+    m_customPlot->xAxis->setTickLabelFont(QFont(QFont().family(), Constants::plot_tick_label_size));
+    m_customPlot->yAxis->setTickLabelFont(QFont(QFont().family(), Constants::plot_tick_label_size));
+
+}
+
+
+void ColorMap::setConnected(bool isConnected)
+{
+    setAxesRangeConnected(isConnected);
+    setDataRangeConnected(isConnected);
+    setUpdateTimerConnected(isConnected);
+}
+
+//! Connects/disconnects signals related to ColorMap's X,Y axes rectangle change.
+
+void ColorMap::setAxesRangeConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onXaxisRangeChanged(QCPRange)), Qt::UniqueConnection);
+
+        connect(m_customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onYaxisRangeChanged(QCPRange)), Qt::UniqueConnection);
+
+    } else {
+        disconnect(m_customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onXaxisRangeChanged(QCPRange)));
+
+        disconnect(m_customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onYaxisRangeChanged(QCPRange)));
+    }
+}
+
+//! Connects/disconnects signals related to ColorMap's Z-axis (min,max) change.
+
+void ColorMap::setDataRangeConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_colorMap, SIGNAL(dataRangeChanged(QCPRange)), this,
+                SLOT(onDataRangeChanged(QCPRange)), Qt::UniqueConnection);
+    } else {
+        disconnect(m_colorMap, SIGNAL(dataRangeChanged(QCPRange)), this,
+                SLOT(onDataRangeChanged(QCPRange)));
+    }
+}
+
+void ColorMap::setUpdateTimerConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_updateTimer, SIGNAL(timeToUpdate()),
+                this, SLOT(onTimeToReplot()), Qt::UniqueConnection);
+    } else {
+        disconnect(m_updateTimer, SIGNAL(timeToUpdate()),
+                this, SLOT(onTimeToReplot()));
+    }
+}
+
+
+//! to make fixed margins for whole colormap (change in axes labels wont affect axes rectangle)
+void ColorMap::setFixedColorMapMargins()
+{
+    QFontMetrics fontMetric(font());
+    auto em = fontMetric.width('M'), fontAscent = fontMetric.ascent();
+    auto *axisRectangle = m_customPlot->axisRect();
+    axisRectangle->setAutoMargins(QCP::msTop | QCP::msBottom);
+    axisRectangle->setMargins(QMargins(6.0*em, fontAscent*1.5, em*1.2, 4.5*fontAscent));
+}
+
+//! Sets initial state of ColorMap to match given intensity item.
+
+void ColorMap::setColorMapFromItem(IntensityDataItem *intensityItem)
+{
+    Q_ASSERT(intensityItem);
+
+    m_block_update = true;
+
+    setAxesRangeFromItem(intensityItem);
+    setAxesZoomFromItem(intensityItem);
+    setLabelsFromItem(intensityItem);
+    setDataFromItem(intensityItem);
+    setColorScaleAppearanceFromItem(intensityItem);
+    setDataRangeFromItem(intensityItem);
+
+    replot();
+
+    m_block_update = false;
+}
+
+//! Sets (xmin,xmax,nbins) and (ymin,ymax,nbins) of ColorMap from intensity item.
+
+void ColorMap::setAxesRangeFromItem(IntensityDataItem *item)
+{
+    auto data = item->getOutputData();
+    if(!data) return;
+
+    m_customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
+    m_customPlot->axisRect()->setupFullAxesBox(true);
+
+    const IAxis &axis_x = data->getAxis(0);
+    const IAxis &axis_y = data->getAxis(1);
+
+    m_colorMap->data()->setSize(static_cast<int>(axis_x.size()),
+                                static_cast<int>(axis_y.size()));
+
+    m_colorMap->data()->setRange(ColorMapHelper::itemXrange(item),
+                                 ColorMapHelper::itemYrange(item));
+
+}
+
+//! Sets zoom range of X,Y axes as in intensity item.
+
+void ColorMap::setAxesZoomFromItem(IntensityDataItem *item)
+{
+    setAxesRangeConnected(false);
+    m_customPlot->xAxis->setRange(item->getLowerX(), item->getUpperX());
+    m_customPlot->yAxis->setRange(item->getLowerY(), item->getUpperY());
+    setAxesRangeConnected(true);
+}
+
+//! Sets X,Y axes labels from item
+
+void ColorMap::setLabelsFromItem(IntensityDataItem *item)
+{
+    m_customPlot->xAxis->setLabel(item->getXaxisTitle());
+    m_customPlot->yAxis->setLabel(item->getYaxisTitle());
+}
+
+//! Sets the intensity values to ColorMap.
+
+void ColorMap::setDataFromItem(IntensityDataItem *item)
+{
+    auto data = item->getOutputData();
+    if(!data) return;
+
+    const IAxis &axis_x = data->getAxis(0);
+    const IAxis &axis_y = data->getAxis(1);
+
+    for(size_t ix=0; ix<axis_x.size(); ++ix) {
+        for(size_t iy=0; iy<axis_y.size(); ++iy) {
+            m_colorMap->data()->setCell(static_cast<int>(ix), static_cast<int>(iy),
+                                        (*data)[iy+axis_y.size()*ix]);
+        }
+    }
+}
+
+//! Sets the appearance of color scale (visibility, gradient type) from intensity item.
+
+void ColorMap::setColorScaleAppearanceFromItem(IntensityDataItem *item)
+{
+    setColorScaleVisible(item->getItem(IntensityDataItem::P_ZAXIS)
+        ->getItemValue(BasicAxisItem::P_IS_VISIBLE).toBool());
+    m_colorMap->setGradient(ColorMapHelper::itemGradient(m_item));
+    m_colorMap->setInterpolate(m_item->isInterpolated());
+    // make sure the axis rect and color scale synchronize their bottom and top margins (so they
+    // line up):
+    QCPMarginGroup *marginGroup = new QCPMarginGroup(m_customPlot);
+    m_customPlot->axisRect()->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
+    m_colorScale->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
+}
+
+void ColorMap::setDataRangeFromItem(IntensityDataItem *item)
+{
+    setDataRangeConnected(false);
+
+    QCPRange newDataRange(item->getLowerZ(), item->getUpperZ());
+    m_colorMap->setDataRange(newDataRange);
+    setLogz(item->isLogz());
+
+    setDataRangeConnected(true);
+}
+
+
+void ColorMap::setColorScaleVisible(bool visibility_flag)
+{
+    m_colorScale->setVisible(visibility_flag);
+    if(visibility_flag) {
+        // add it to the right of the main axis rect
+        m_customPlot->plotLayout()->addElement(0, 1, m_colorScale);
+    } else {
+        m_customPlot->plotLayout()->take(m_colorScale);
+        m_customPlot->plotLayout()->simplify();
+    }
+}
+
+//! Disconnects everything
+
+void ColorMap::resetColorMap()
+{
+    setConnected(false);
+    if(m_item)
+        m_item->mapper()->unsubscribe(this);
+}
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMap.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMap.h
new file mode 100644
index 0000000..42db4b9
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMap.h
@@ -0,0 +1,125 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMap.h
+//! @brief     Defines class ColorMap
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAP_H
+#define COLORMAP_H
+
+#include "ColorMapBin.h"
+#include "WinDllMacros.h"
+#include "qcustomplot.h"
+#include <QMap>
+#include <QPoint>
+#include <QWidget>
+#include <memory>
+
+class IntensityDataItem;
+class QCustomPlot;
+class QCPColorMap;
+class QCPColorScale;
+class UpdateTimer;
+class ColorMapEvent;
+
+//! The ColorMap class presents 2D intensity data from IntensityDataItem as color map.
+
+//! Provides a minimal functionality for data plotting and axes interaction. Should be a component
+//! for more complicated plotting widgets. This is a replacement for ColorMapPlot.
+
+class BA_CORE_API_ ColorMap : public QWidget {
+    Q_OBJECT
+
+public:
+    explicit ColorMap(QWidget *parent = 0);
+    ~ColorMap();
+
+    QSize sizeHint() const { return QSize(500, 400); }
+    QSize minimumSizeHint() const { return QSize(128, 128); }
+
+    void setItem(IntensityDataItem *item);
+
+    QCustomPlot *customPlot() { return m_customPlot; }
+    const QCustomPlot *customPlot() const { return m_customPlot; }
+    QCPColorScale *colorScale() { return m_colorScale; }
+
+    //! transform axes coordinates to CustomPlot widget coordinates
+    double xAxisCoordToPixel(double axis_coordinate) const;
+    double yAxisCoordToPixel(double axis_coordinate) const;
+
+    //! transform widget coordinates to axes coordinates
+    double pixelToXaxisCoord(double pixel) const;
+    double pixelToYaxisCoord(double pixel) const;
+
+    //! returns rectangle representing current axes zoom state in widget coordinates
+    QRectF getViewportRectangleInWidgetCoordinates();
+
+    //! Returns true if axes rectangle contains given in axes coordinates.
+    bool axesRangeContains(double xpos, double ypos) const;
+
+    //! Returns ColorMapBin corresponding to given axes coordinates.
+    ColorMapBin colorMapBin(double xpos, double ypos) const;
+
+    void setMouseTrackingEnabled(bool enable);
+
+signals:
+    void statusString(const QString &text);
+
+public slots:
+    void setLogz(bool logz);
+    void resetView();
+
+private slots:
+    void onIntensityModified();
+    void onPropertyChanged(const QString &property_name);
+    void onSubItemPropertyChanged(const QString &property_group, const QString &property_name);
+    void onDataRangeChanged(QCPRange newRange);
+    void onXaxisRangeChanged(QCPRange newRange);
+    void onYaxisRangeChanged(QCPRange newRange);
+    void replot();
+    void onTimeToReplot();
+
+private:
+    void initColorMap();
+
+    void setConnected(bool isConnected);
+    void setAxesRangeConnected(bool isConnected);
+    void setDataRangeConnected(bool isConnected);
+    void setUpdateTimerConnected(bool isConnected);
+
+    void setFixedColorMapMargins();
+
+    void setColorMapFromItem(IntensityDataItem *intensityItem);
+    void setAxesRangeFromItem(IntensityDataItem *item);
+    void setAxesZoomFromItem(IntensityDataItem *item);
+    void setLabelsFromItem(IntensityDataItem *item);
+    void setDataFromItem(IntensityDataItem *item);
+    void setColorScaleAppearanceFromItem(IntensityDataItem *item);
+    void setDataRangeFromItem(IntensityDataItem *item);
+
+    void setColorScaleVisible(bool visibility_flag);
+
+    void resetColorMap();
+
+    QCustomPlot *m_customPlot;
+    QCPColorMap *m_colorMap;
+    QCPColorScale *m_colorScale;
+
+    UpdateTimer *m_updateTimer;
+    ColorMapEvent *m_colorMapEvent;
+
+    IntensityDataItem *m_item;
+    bool m_block_update;
+};
+
+#endif // COLORMAP_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapBin.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapBin.h
new file mode 100644
index 0000000..2d7f82f
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapBin.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapBin.h
+//! @brief     Defines class ColorMapBin
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPBIN_H
+#define COLORMAPBIN_H
+
+#include "WinDllMacros.h"
+#include <QString>
+
+//! The ColorMapBin class contains parameters of intensity data bin under current mouse position.
+
+class BA_CORE_API_ ColorMapBin {
+public:
+    ColorMapBin()
+        : in_axes_range(false), m_nx(0), m_ny(0), m_x(0), m_y(0), m_value(0) {}
+
+    void reset() {
+        in_axes_range = false;
+        m_nx = m_ny = 0;
+        m_x = m_y = m_value = 0.0;
+    }
+
+    QString statusString() {
+        QString result = QString(" [x: %1, y: %2]    [binx: %3, biny:%4]    [value: %5]")
+                     .arg(QString::number(m_x, 'f', 4))
+                     .arg(QString::number(m_y, 'f', 4), 2)
+                     .arg(m_nx, 2)
+                     .arg(m_ny, 2)
+                     .arg(QString::number(m_value, 'f', 2));
+
+        return result;
+    }
+
+    bool inAxesRange() const { return in_axes_range; }
+
+    bool in_axes_range;
+    int m_nx, m_ny;
+    double m_x, m_y, m_value;
+};
+
+#endif // COLORMAPBIN_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.cpp
new file mode 100644
index 0000000..a73c89f
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.cpp
@@ -0,0 +1,105 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.cpp
+//! @brief     Declares class ColorMapCanvas
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMapCanvas.h"
+#include "ColorMap.h"
+#include "ColorMapCanvasEvent.h"
+#include "ColorMapLabel.h"
+#include "IntensityDataItem.h"
+#include "StatusLabel.h"
+#include <QDebug>
+#include <QLabel>
+#include <QVBoxLayout>
+
+
+ColorMapCanvas::ColorMapCanvas(QWidget *parent)
+    : QWidget(parent)
+//    , m_titleLabel(new StatusLabel)
+    , m_colorMap(new ColorMap)
+    , m_canvasEvent(new ColorMapCanvasEvent(this))
+    , m_statusLabel(new ColorMapLabel(m_colorMap, this))
+{
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+
+//    m_titleLabel->setAlignment(Qt::AlignBottom| Qt::AlignHCenter);
+//    layout->addWidget(m_titleLabel);
+
+    layout->addWidget(m_colorMap);
+    layout->addWidget(m_statusLabel);
+
+    setLayout(layout);
+
+    setStatusLabelEnabled(false);
+}
+
+
+void ColorMapCanvas::setItem(IntensityDataItem *intensityDataItem)
+{
+    m_colorMap->setItem(intensityDataItem);
+
+//    intensityDataItem->mapper()->setOnPropertyChange(
+//                [this, intensityDataItem](const QString &name)
+//    {
+//        if(name == IntensityDataItem::P_TITLE) {
+//            onTitleChanged(intensityDataItem->getItemValue(IntensityDataItem::P_TITLE).toString());
+//        }
+//    }, this);
+
+//    onTitleChanged(intensityDataItem->getItemValue(IntensityDataItem::P_TITLE).toString());
+//    ("Monospace", default_text_size, QFont::Normal, false)
+    QFont font = m_colorMap->customPlot()->xAxis->labelFont();
+    qDebug() << "FFFFF" << font;
+//    m_colorMap->customPlot()->xAxis->setLabelFont();
+}
+
+ColorMap *ColorMapCanvas::colorMap()
+{
+    return m_colorMap;
+}
+
+QCustomPlot *ColorMapCanvas::customPlot() {
+    return m_colorMap->customPlot();
+}
+
+void ColorMapCanvas::setStatusLabelEnabled(bool flag)
+{
+    m_statusLabel->setLabelEnabled(flag);
+    m_statusLabel->setHidden(!flag);
+}
+
+//QLabel *ColorMapCanvas::statusLabel()
+//{
+//    return m_statusLabel;
+//}
+
+void ColorMapCanvas::onStatusString(const QString &name)
+{
+    m_statusLabel->setText(name);
+}
+
+//void ColorMapCanvas::onTitleChanged(const QString &title)
+//{
+//    if(title.isEmpty()) {
+//        m_titleLabel->hide();
+//    } else {
+//        m_titleLabel->show();
+//        m_titleLabel->setText(title);
+//    }
+//}
+
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.h
new file mode 100644
index 0000000..59215fb
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.h
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvas.h
+//! @brief     Defines class ColorMapCanvas
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPCANVAS_H
+#define COLORMAPCANVAS_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class ColorMap;
+class QCustomPlot;
+class ColorMapCanvasEvent;
+class IntensityDataItem;
+class ColorMapLabel;
+class StatusLabel;
+
+//! The ColorMapCanvas class contains ColorMap for intensity data presentation, and provide
+//! control of font size, status string appearance, defines common actions
+//! (reset view, save plot, show context menu).
+
+class BA_CORE_API_ ColorMapCanvas : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit ColorMapCanvas(QWidget *parent = 0);
+
+    void setItem(IntensityDataItem *intensityDataItem);
+
+    ColorMap *colorMap();
+    QCustomPlot *customPlot();
+
+    void setStatusLabelEnabled(bool flag);
+
+public slots:
+    void onStatusString(const QString &name);
+
+private:
+//    void onTitleChanged(const QString &title);
+
+//    StatusLabel *m_titleLabel;
+    ColorMap *m_colorMap;
+    ColorMapCanvasEvent *m_canvasEvent;
+    ColorMapLabel *m_statusLabel;
+};
+
+#endif // COLORMAPCANVAS_H
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.cpp
new file mode 100644
index 0000000..d1620ae
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.cpp
@@ -0,0 +1,87 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.cpp
+//! @brief     Implements class ColorMapCanvasEvent
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMapCanvasEvent.h"
+#include "ColorMap.h"
+#include "ColorMapCanvas.h"
+#include "qcustomplot.h"
+#include <QDebug>
+#include <QLabel>
+#include <QRect>
+#include <QResizeEvent>
+
+namespace {
+const QString tick_font = "tick-font-key";
+const int widget_size_to_switch_font = 500;
+}
+
+ColorMapCanvasEvent::ColorMapCanvasEvent(ColorMapCanvas *canvas)
+    : QObject(canvas)
+    , m_canvas(canvas)
+{
+    canvas->installEventFilter(this);
+}
+
+bool ColorMapCanvasEvent::eventFilter(QObject *obj, QEvent *event)
+{
+    if (event->type() == QEvent::Resize) {
+        QResizeEvent *resizeEvent = static_cast<QResizeEvent *>(event);
+        Q_ASSERT(resizeEvent);
+
+        if(!m_fonts.contains(tick_font)) {
+            backupFonts();
+
+        } else {
+            if(resizeEvent->size().width() < widget_size_to_switch_font) {
+                scaleFonts(0.8);
+            } else {
+                restoreFonts();
+            }
+
+        }
+    }
+
+    return QObject::eventFilter(obj, event);
+}
+
+//! Backup all fonts.
+
+void ColorMapCanvasEvent::backupFonts()
+{
+    m_fonts[tick_font] = m_canvas->colorMap()->customPlot()->xAxis->tickLabelFont();
+
+}
+
+void ColorMapCanvasEvent::restoreFonts()
+{
+    QFont ff = m_fonts[tick_font];
+    setTickLabelFont(ff);
+}
+
+void ColorMapCanvasEvent::scaleFonts(double factor)
+{
+    QFont ff = m_fonts[tick_font];
+    ff.setPointSizeF(ff.pointSizeF()*factor);
+    setTickLabelFont(ff);
+}
+
+void ColorMapCanvasEvent::setTickLabelFont(const QFont &font)
+{
+    m_canvas->colorMap()->customPlot()->xAxis->setTickLabelFont(font);
+    m_canvas->colorMap()->customPlot()->yAxis->setTickLabelFont(font);
+    m_canvas->colorMap()->colorScale()->axis()->setTickLabelFont(font);
+
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.h
new file mode 100644
index 0000000..1fa49ac
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapCanvasEvent.h
+//! @brief     Defines class ColorMapCanvasEvent
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPCANVASEVENT_H
+#define COLORMAPCANVASEVENT_H
+
+#include "WinDllMacros.h"
+#include <QFont>
+#include <QMap>
+#include <QObject>
+
+class ColorMapCanvas;
+class QObject;
+class QEvent;
+
+//! The ColorMapCanvasEvent provide event filter for ColorMapCanvas. Its goal is to provide
+//! font size adjustment on resize events.
+
+class BA_CORE_API_ ColorMapCanvasEvent : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit ColorMapCanvasEvent(ColorMapCanvas *canvas);
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *event);
+
+private:
+    void backupFonts();
+    void restoreFonts();
+    void scaleFonts(double factor);
+    void setTickLabelFont(const QFont &font);
+
+    ColorMapCanvas *m_canvas;
+    QMap<QString, QFont> m_fonts;
+};
+
+#endif // COLORMAPCANVASEVENT_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.cpp
new file mode 100644
index 0000000..56460f1
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.cpp
@@ -0,0 +1,90 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.cpp
+//! @brief     Implements class ColorMapEvent
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMapEvent.h"
+#include "ColorMap.h"
+#include <QDebug>
+#include <QMouseEvent>
+
+ColorMapEvent::ColorMapEvent(ColorMap *colorMap)
+    : QObject(colorMap)
+    , m_colorMap(colorMap)
+{
+
+}
+
+//! Sets tracking of the mouse for parent COlorMap
+
+void ColorMapEvent::setMouseTrackingEnabled(bool enable)
+{
+    m_colorMap->setMouseTracking(enable);
+    customPlot()->setMouseTracking(enable);
+
+    if(enable) {
+        connect(customPlot(), SIGNAL(mouseMove(QMouseEvent *)),
+                this, SLOT(onCustomMouseMove(QMouseEvent *)), Qt::UniqueConnection);
+    } else {
+        disconnect(customPlot(), SIGNAL(mouseMove(QMouseEvent *)),
+                this, SLOT(onCustomMouseMove(QMouseEvent *)));
+    }
+}
+
+//! Constructs status string on mouse move event coming from QCustomPlot. String is emitted
+//! if mouse is in axes's viewport rectangle. Once mouse goes out of it, an
+//! empty string is emitted once.
+
+void ColorMapEvent::onCustomMouseMove(QMouseEvent *event)
+{
+    ColorMapBin currentPos = currentColorMapBin(event);
+
+    if(currentPos.inAxesRange()) {
+        emit colorMap()->statusString(currentPos.statusString());
+
+    } else {
+        if(m_prevPos.inAxesRange()) {
+            emit colorMap()->statusString(QString());
+        }
+    }
+
+    m_prevPos = currentPos;
+}
+
+ColorMap *ColorMapEvent::colorMap()
+{
+    return m_colorMap;
+}
+
+const ColorMap *ColorMapEvent::colorMap() const
+{
+    return m_colorMap;
+}
+
+QCustomPlot *ColorMapEvent::customPlot()
+{
+    return m_colorMap->customPlot();
+}
+
+
+//! Constructs current position of the data.
+
+ColorMapBin ColorMapEvent::currentColorMapBin(QMouseEvent *event) const
+{
+    double x = colorMap()->pixelToXaxisCoord(event->pos().x());
+    double y = colorMap()->pixelToYaxisCoord(event->pos().y());
+
+    return colorMap()->colorMapBin(x, y);
+}
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.h
new file mode 100644
index 0000000..470ce68
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapEvent.h
+//! @brief     Defines class ColorMapEvent
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPEVENT_H
+#define COLORMAPEVENT_H
+
+#include "ColorMapBin.h"
+#include "WinDllMacros.h"
+#include <QObject>
+
+class ColorMap;
+class QMouseEvent;
+class QCustomPlot;
+
+//! The ColorMapEvent class helps ColorMap to handle mouse events. Particularly,
+//! it constructs a valid status string. Can be extended to play a role of event filter.
+
+class BA_CORE_API_ ColorMapEvent : public QObject {
+    Q_OBJECT
+
+public:
+    explicit ColorMapEvent(ColorMap *colorMap);
+
+    void setMouseTrackingEnabled(bool enable);
+
+public slots:
+    void onCustomMouseMove(QMouseEvent *event);
+
+private:
+    ColorMap *colorMap();
+    const ColorMap *colorMap() const;
+    QCustomPlot *customPlot();
+    ColorMapBin currentColorMapBin(QMouseEvent *event) const;
+
+    ColorMap *m_colorMap;
+    ColorMapBin m_prevPos;
+};
+
+#endif // COLORMAPEVENT_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.cpp
new file mode 100644
index 0000000..205a918
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.cpp
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.cpp
+//! @brief     Implements class ColorMapHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMapHelper.h"
+#include "GUIHelpers.h"
+#include "IntensityDataItem.h"
+#include "item_constants.h"
+
+namespace {
+ColorMapHelper::gradient_map_t createGradientMap() {
+    ColorMapHelper::gradient_map_t result;
+
+    result[Constants::GRADIENT_GRAYSCALE] = QCPColorGradient::gpGrayscale;
+    result[Constants::GRADIENT_HOT] = QCPColorGradient::gpHot;
+    result[Constants::GRADIENT_COLD] = QCPColorGradient::gpCold;
+    result[Constants::GRADIENT_NIGHT] = QCPColorGradient::gpNight;
+    result[Constants::GRADIENT_CANDY] = QCPColorGradient::gpCandy;
+    result[Constants::GRADIENT_GEOGRAPHY] = QCPColorGradient::gpGeography;
+    result[Constants::GRADIENT_ION] = QCPColorGradient::gpIon;
+    result[Constants::GRADIENT_THERMAL] = QCPColorGradient::gpThermal;
+    result[Constants::GRADIENT_POLAR] = QCPColorGradient::gpPolar;
+    result[Constants::GRADIENT_SPECTRUM] = QCPColorGradient::gpSpectrum;
+    result[Constants::GRADIENT_JET] = QCPColorGradient::gpJet;
+    result[Constants::GRADIENT_HUES] = QCPColorGradient::gpHues;
+
+    return result;
+}
+}
+
+ColorMapHelper::gradient_map_t ColorMapHelper::m_gradient_map = createGradientMap();
+
+
+
+QCPColorGradient ColorMapHelper::getGradient(const QString &gradientName)
+{
+    auto it = m_gradient_map.find(gradientName);
+    if(it == m_gradient_map.end()) {
+        throw GUIHelpers::Error("ColorMapHelper::getGradient() -> Error. No such gradient" +
+                                gradientName);
+    }
+    return QCPColorGradient(it.value());
+}
+
+QCPColorGradient ColorMapHelper::itemGradient(const IntensityDataItem *item)
+{
+    return getGradient(item->getGradient());
+}
+
+QCPRange ColorMapHelper::itemXrange(const IntensityDataItem *item)
+{
+    return QCPRange(item->getXmin(), item->getXmax());
+}
+
+QCPRange ColorMapHelper::itemYrange(const IntensityDataItem *item)
+{
+    return QCPRange(item->getYmin(), item->getYmax());
+}
+
+QCPRange ColorMapHelper::itemDataRange(const IntensityDataItem *item)
+{
+    QPair<double, double> range = item->getDataRange();
+    return QCPRange(range.first, range.second);
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.h
new file mode 100644
index 0000000..91dd51c
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapHelper.h
+//! @brief     Defines class ColorMapHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPHELPER_H
+#define COLORMAPHELPER_H
+
+#include "WinDllMacros.h"
+#include "qcustomplot.h"
+#include <QMap>
+#include <QString>
+
+class IntensityDataItem;
+
+//! The ColorMapHelper class provides few helper functions for ColorMapPlot.
+
+class BA_CORE_API_ ColorMapHelper
+{
+public:
+    typedef QMap<QString, QCPColorGradient::GradientPreset> gradient_map_t;
+
+    static QCPColorGradient getGradient(const QString &gradientName);
+    static QCPColorGradient itemGradient(const IntensityDataItem *item);
+
+    static QCPRange itemXrange(const IntensityDataItem *item);
+    static QCPRange itemYrange(const IntensityDataItem *item);
+    static QCPRange itemDataRange(const IntensityDataItem *item);
+
+
+private:
+    //!< GUI name of the gradient to QCPColorGradient::GradientPreset;
+    static gradient_map_t m_gradient_map;
+};
+
+#endif // COLORMAPHELPER_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.cpp
new file mode 100644
index 0000000..693b2a1
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.cpp
@@ -0,0 +1,97 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.cpp
+//! @brief     Implements class ColorMapLabel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMapLabel.h"
+#include "ColorMap.h"
+#include "ColorMapCanvas.h"
+
+//namespace {
+//const int min_size = 0;
+//}
+
+ColorMapLabel::ColorMapLabel(ColorMap *colorMap, QWidget *parent)
+    : StatusLabel(parent)
+{
+    if(colorMap)
+        addColorMap(colorMap);
+}
+
+void ColorMapLabel::addColorMap(ColorMap *colorMap)
+{
+    if(m_colorMaps.contains(colorMap))
+        return;
+
+    m_colorMaps.push_back(colorMap);
+
+    setColorMapLabelEnabled(colorMap, true);
+}
+
+void ColorMapLabel::addColorMap(ColorMapCanvas *colorMapCanvas)
+{
+    addColorMap(colorMapCanvas->colorMap());
+}
+
+//! Enables/disables label. If disabled, all colorMaps are disconnected and label is hiding.
+
+void ColorMapLabel::setLabelEnabled(bool flag)
+{
+    foreach(ColorMap *colorMap, m_colorMaps)
+        setColorMapLabelEnabled(colorMap, flag);
+
+    setEnabled(flag);
+}
+
+//! Disconnects all color maps from the label.
+
+void ColorMapLabel::reset()
+{
+    foreach(ColorMap *colorMap, m_colorMaps)
+        setColorMapLabelEnabled(colorMap, false);
+
+    m_colorMaps.clear();
+}
+
+void ColorMapLabel::onColorMapStatusString(const QString &text)
+{
+    setText(text);
+}
+
+//void ColorMapLabel::resizeEvent(QResizeEvent *event)
+//{
+//    qDebug() << "ColorMapLabel::resizeEvent(QResizeEvent *event)" << event->size();
+
+//}
+
+//! Enables/disables showing of label for given color map.
+
+void ColorMapLabel::setColorMapLabelEnabled(ColorMap *colorMap, bool flag)
+{
+    colorMap->setMouseTrackingEnabled(flag);
+    setConnected(colorMap, flag);
+}
+
+//! Connects with colorMap's status string signal.
+
+void ColorMapLabel::setConnected(ColorMap *colorMap, bool flag)
+{
+    if(flag) {
+        connect(colorMap, SIGNAL(statusString(const QString&)),
+                this, SLOT(onColorMapStatusString(const QString&)), Qt::UniqueConnection);
+    } else {
+        disconnect(colorMap, SIGNAL(statusString(const QString&)),
+                this, SLOT(onColorMapStatusString(const QString&)));
+    }
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.h
new file mode 100644
index 0000000..55d0c7c
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapLabel.h
+//! @brief     Defines class ColorMapLabel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPLABEL_H
+#define COLORMAPLABEL_H
+
+#include "StatusLabel.h"
+#include <QList>
+
+class ColorMap;
+class ColorMapCanvas;
+class QResizeEvent;
+
+//! The ColorMapLabel class shows status string as reported by ColorMap in a frame.
+//! Can work with more than one ColorMap. Provides automatic adjustment of font size,
+//! depending on available space in parent layout. Also doesn't trigger layout resize,
+//! beeing happy with place it has.
+
+class BA_CORE_API_ ColorMapLabel : public StatusLabel
+{
+    Q_OBJECT
+public:
+    ColorMapLabel(ColorMap *colorMap, QWidget *parent = 0);
+
+    void addColorMap(ColorMap *colorMap);
+    void addColorMap(ColorMapCanvas *colorMapCanvas);
+
+    void setLabelEnabled(bool flag);
+
+    void reset();
+
+public slots:
+    void onColorMapStatusString(const QString &text);
+
+//protected:
+//    void resizeEvent(QResizeEvent *event);
+
+private:
+    void setColorMapLabelEnabled(ColorMap *colorMap, bool flag);
+    void setConnected(ColorMap *colorMap, bool flag);
+
+    QList<ColorMap *> m_colorMaps;
+};
+
+#endif // COLORMAPLABEL_H
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp
new file mode 100644
index 0000000..2e9d60c
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp
@@ -0,0 +1,670 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.cpp
+//! @brief     Implements class ColorMapPlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMapPlot.h"
+#include "AxesItems.h"
+#include "ColorMapHelper.h"
+#include "GUIHelpers.h"
+#include "IntensityDataItem.h"
+#include "MathConstants.h"
+#include "UpdateTimer.h"
+#include <QDebug>
+
+namespace {
+const int replot_update_interval = 10;
+}
+
+ColorMapPlot::ColorMapPlot(QWidget *parent)
+    : QWidget(parent)
+    , m_customPlot(0)
+    , m_colorMap(0)
+    , m_colorScale(0)
+    , m_item(0)
+    , m_block_update(true)
+    , m_updateTimer(new UpdateTimer(replot_update_interval, this))
+{
+    initColorMap();
+
+    QVBoxLayout *vlayout = new QVBoxLayout(this);
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+    vlayout->addWidget(m_customPlot);
+    setLayout(vlayout);
+    setMouseTracking(false);
+    m_customPlot->setMouseTracking(false);
+
+    //    setFixedColorMapMargins();
+}
+
+ColorMapPlot::~ColorMapPlot()
+{
+    if(m_item)
+        m_item->mapper()->unsubscribe(this);
+
+}
+
+//! Sets ColorMap to track intensity item.
+
+void ColorMapPlot::setItem(IntensityDataItem *item)
+{
+    if(item == m_item)
+        return;
+
+    resetColorMap();
+
+    m_item = item;
+    if(!m_item)
+        return;
+
+    // FIXME. ColorMapPlot should be functional, even if OutputData is zero
+    if(m_item->getOutputData() == nullptr) {
+        m_item = 0;
+        return;
+    }
+
+    setColorMapFromItem(m_item);
+
+    m_item->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+    {
+        onPropertyChanged(name);
+    }, this);
+
+    m_item->mapper()->setOnChildPropertyChange([this](SessionItem *item, const QString name) {
+        onSubItemPropertyChanged(item->itemName(), name);
+    }, this);
+
+    m_item->mapper()->setOnValueChange(
+        [this]()
+    {
+        onIntensityModified();
+    }, this);
+
+    m_item->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_item = 0;
+    }, this);
+
+    setConnected(true);
+
+}
+
+//! returns string containing bin content information
+QString ColorMapPlot::getStatusString()
+{
+    QString result;
+    if (m_posData.valid) {
+        result = QString(" [x: %1, y: %2]    [binx: %3, biny:%4]    [value: %5]")
+                     .arg(QString::number(m_posData.m_xPos, 'f', 4))
+                     .arg(QString::number(m_posData.m_yPos, 'f', 4), 2)
+                     .arg(m_posData.key, 2)
+                     .arg(m_posData.value, 2)
+                     .arg(QString::number(m_posData.cellValue, 'f', 2));
+    }
+    return result;
+}
+
+//! draws two crossed lines
+void ColorMapPlot::drawLinesOverTheMap()
+{
+    if (!m_customPlot->graph(0)->visible() || !m_customPlot->graph(1)->visible())
+        return;
+
+    QCPColorMapData *data = m_colorMap->data();
+    Q_ASSERT(data);
+
+    // draw line over plot
+    QCPRange keyRange = data->keyRange();
+    QCPRange valueRange = data->valueRange();
+
+    int keySize = data->keySize();
+    int valueSize = data->valueSize();
+
+    double fraction = (keyRange.upper - keyRange.lower) / keySize;
+
+    QVector<double> x1(keySize + 1), y1(keySize + 1);
+    for (int i = 0; i < x1.size(); i++) {
+        x1[i] = keyRange.lower + (i * fraction);
+        y1[i] = m_posData.m_yPos;
+    }
+    m_customPlot->graph(0)->setData(x1, y1);
+
+    // draw vertical line
+    fraction = (valueRange.upper - valueRange.lower) / valueSize;
+
+    QVector<double> x2(valueSize + 1), y2(valueSize + 1);
+    for (int i = 0; i < x2.size(); i++) {
+        x2[i] = m_posData.m_xPos;
+        y2[i] = valueRange.lower + (i * fraction);
+    }
+    m_customPlot->graph(1)->setData(x2, y2);
+
+    m_customPlot->replot();
+}
+
+//! switches visibility of two crossed lines
+void ColorMapPlot::showLinesOverTheMap(bool isVisible)
+{
+    if (m_customPlot->graph(0) && m_customPlot->graph(1)) {
+        m_customPlot->graph(0)->setVisible(isVisible);
+        m_customPlot->graph(1)->setVisible(isVisible);
+        m_customPlot->replot();
+    }
+}
+
+double ColorMapPlot::xAxisCoordToPixel(double axis_coordinate) const
+{
+    double result = m_customPlot->xAxis->coordToPixel(axis_coordinate);
+//    qDebug() << "ColorMapPlot::xAxisCoordToPixel axis_coordinate:" << axis_coordinate << "result:" << result;
+    return result;
+}
+
+double ColorMapPlot::yAxisCoordToPixel(double axis_coordinate) const
+{
+    return m_customPlot->yAxis->coordToPixel(axis_coordinate);
+}
+
+double ColorMapPlot::pixelToXaxisCoord(double pixel) const
+{
+    return m_customPlot->xAxis->pixelToCoord(pixel);
+}
+
+double ColorMapPlot::pixelToYaxisCoord(double pixel) const
+{
+    return m_customPlot->yAxis->pixelToCoord(pixel);
+}
+
+QRectF ColorMapPlot::getViewportRectangleInWidgetCoordinates()
+{
+    QCPRange xrange = m_customPlot->xAxis->range();
+    QCPRange yrange = m_customPlot->yAxis->range();
+    double left = xrange.lower;
+    double right = xrange.upper;
+    double top = yrange.upper;
+    double bottom = yrange.lower;
+
+    return QRectF(xAxisCoordToPixel(left),
+                  yAxisCoordToPixel(top),
+                  xAxisCoordToPixel(right) - xAxisCoordToPixel(left),
+                  yAxisCoordToPixel(bottom) - yAxisCoordToPixel(top));
+}
+
+//! to track move events (used when showing profile histograms and printing status string)
+void ColorMapPlot::setTrackMoveEventsFlag(bool flag)
+{
+    setMouseTracking(flag);
+    m_customPlot->setMouseTracking(flag);
+}
+
+//! sets logarithmic scale
+void ColorMapPlot::setLogz(bool logz)
+{
+    if (logz) {
+        if(m_colorScale->dataScaleType() != QCPAxis::stLogarithmic) {
+            m_colorScale->setDataScaleType(QCPAxis::stLogarithmic);
+            m_colorScale->axis()->setNumberFormat("eb");
+            m_colorScale->axis()->setNumberPrecision(0);
+        }
+    } else {
+        if(m_colorScale->dataScaleType() != QCPAxis::stLinear) {
+            m_colorScale->axis()->setNumberFormat("f");
+            m_colorScale->axis()->setNumberPrecision(0);
+            m_colorScale->setDataScaleType(QCPAxis::stLinear);
+        }
+    }
+//    if (logz) {
+//        m_colorScale->setDataScaleType(QCPAxis::stLogarithmic);
+//        m_colorScale->axis()->setNumberFormat("eb");
+//        m_colorScale->axis()->setNumberPrecision(0);
+//    } else {
+//        m_colorScale->axis()->setNumberFormat("f");
+//        m_colorScale->axis()->setNumberPrecision(0);
+//        m_colorScale->setDataScaleType(QCPAxis::stLinear);
+//    }
+}
+
+//! reset all axes min,max to initial value
+void ColorMapPlot::resetView()
+{
+    m_item->resetView();
+}
+
+//! saves information about mouse position and intensity data underneath
+void ColorMapPlot::onMouseMove(QMouseEvent *event)
+{
+    m_posData.reset();
+    QPoint point = event->pos();
+    double xPos = m_customPlot->xAxis->pixelToCoord(point.x());
+    double yPos = m_customPlot->yAxis->pixelToCoord(point.y());
+
+
+    if (m_customPlot->xAxis->range().contains(xPos)
+        && m_customPlot->yAxis->range().contains(yPos)) {
+        m_posData.valid = true;
+        m_posData.m_xPos = xPos;
+        m_posData.m_yPos = yPos;
+        QCPColorMapData *data = m_colorMap->data();
+        data->coordToCell(xPos, yPos, &m_posData.key, &m_posData.value);
+        m_posData.cellValue = data->cell(m_posData.key, m_posData.value);
+        emit validMousMove();
+    }
+}
+
+//! returns vectors corresponding to the cut along x-axis
+void ColorMapPlot::getHorizontalSlice(QVector<double> &x, QVector<double> &y)
+{
+    x.clear();
+    y.clear();
+
+    QCPColorMapData *data = m_colorMap->data();
+    QCPRange range = data->keyRange();
+    int keySize = data->keySize();
+    int valueSize = data->valueSize();
+
+    x.resize(keySize);
+    y.resize(keySize);
+
+    double fraction = (range.upper - range.lower) / keySize;
+
+    for (int i = 0; i < x.size(); ++i) {
+        x[i] = range.lower + (i * fraction);
+
+        if (m_posData.value >= 0 && m_posData.value < valueSize) {
+            y[i] = data->cell(i, m_posData.value);
+        } else {
+            y[i] = 0;
+        }
+    }
+}
+
+//! returns vectors corresponding to the cut along y-axis
+void ColorMapPlot::getVerticalSlice(QVector<double> &x, QVector<double> &y)
+{
+    x.clear();
+    y.clear();
+
+    QCPColorMapData *data = m_colorMap->data();
+    QCPRange range = data->valueRange();
+    int keySize = data->keySize();
+    int valueSize = data->valueSize();
+
+    x.resize(valueSize);
+    y.resize(valueSize);
+
+    double fraction = (range.upper - range.lower) / valueSize;
+
+    for (int i = 0; i < x.size(); ++i) {
+        x[i] = range.lower + (i * fraction);
+
+        if (m_posData.key >= 0 && m_posData.key < keySize) {
+            y[i] = data->cell(m_posData.key, i);
+        } else {
+            y[i] = 0;
+        }
+    }
+}
+
+void ColorMapPlot::onIntensityModified()
+{
+    setDataFromItem(m_item);
+    replot();
+}
+
+//! updates color map depending on  IntensityDataItem properties
+void ColorMapPlot::onPropertyChanged(const QString &property_name)
+{
+    if (m_block_update)
+        return;
+
+    if (property_name == IntensityDataItem::P_GRADIENT) {
+        m_colorMap->setGradient(ColorMapHelper::itemGradient(m_item));
+        replot();
+    } else if (property_name == IntensityDataItem::P_IS_INTERPOLATED) {
+        m_colorMap->setInterpolate(m_item->isInterpolated());
+        replot();
+    } else if (property_name == IntensityDataItem::P_PROJECTIONS_FLAG) {
+        showLinesOverTheMap(
+            m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool());
+    } else if(property_name == IntensityDataItem::P_AXES_UNITS) {
+        setAxesRangeFromItem(m_item);
+        replot();
+    }
+}
+
+void ColorMapPlot::onSubItemPropertyChanged(const QString &property_group,
+                                            const QString &property_name)
+{
+    if (m_block_update)
+        return;
+
+    if (property_group == IntensityDataItem::P_XAXIS) {
+        if (property_name == BasicAxisItem::P_MIN || property_name == BasicAxisItem::P_MAX) {
+            setAxesRangeConnected(false);
+            QCPRange range = m_customPlot->xAxis->range();
+            range.lower = m_item->getLowerX();
+            range.upper = m_item->getUpperX();
+            m_customPlot->xAxis->setRange(range);
+            setAxesRangeConnected(true);
+            replot();
+        } else if (property_name == BasicAxisItem::P_TITLE) {
+            m_customPlot->xAxis->setLabel(m_item->getXaxisTitle());
+            m_colorScale->setMargins(QMargins(0,0,0,0));
+            replot();
+        }
+    } else if (property_group == IntensityDataItem::P_YAXIS) {
+        if (property_name == BasicAxisItem::P_MIN || property_name == BasicAxisItem::P_MAX) {
+            setAxesRangeConnected(false);
+            QCPRange range = m_customPlot->yAxis->range();
+            range.lower = m_item->getLowerY();
+            range.upper = m_item->getUpperY();
+            m_customPlot->yAxis->setRange(range);
+            setAxesRangeConnected(true);
+            replot();
+        } else if (property_name == BasicAxisItem::P_TITLE) {
+            m_customPlot->yAxis->setLabel(m_item->getYaxisTitle());
+            replot();
+        }
+    }
+
+    else if (property_group == IntensityDataItem::P_ZAXIS) {
+        if (property_name == BasicAxisItem::P_MIN || property_name == BasicAxisItem::P_MAX) {
+            setDataRangeFromItem(m_item);
+            replot();
+        } else if (property_name == AmplitudeAxisItem::P_IS_LOGSCALE) {
+            setLogz(m_item->isLogz());
+            replot();
+
+        } else if (property_name == BasicAxisItem::P_IS_VISIBLE) {
+            setColorScaleVisible(m_item->getItem(IntensityDataItem::P_ZAXIS)
+                ->getItemValue(BasicAxisItem::P_IS_VISIBLE).toBool());
+            replot();
+        }
+    }
+}
+
+//! Propagate zmin, zmax back to IntensityDataItem
+void ColorMapPlot::onDataRangeChanged(QCPRange newRange)
+{
+    m_block_update = true;
+    m_item->setLowerAndUpperZ(newRange.lower, newRange.upper);
+    m_block_update = false;
+}
+
+//! Propagate xmin, xmax back to IntensityDataItem
+void ColorMapPlot::onXaxisRangeChanged(QCPRange newRange)
+{
+    m_block_update = true;
+    m_item->setLowerX(newRange.lower);
+    m_item->setUpperX(newRange.upper);
+    m_block_update = false;
+}
+
+//! Propagate ymin, ymax back to IntensityDataItem
+void ColorMapPlot::onYaxisRangeChanged(QCPRange newRange)
+{
+    m_block_update = true;
+    m_item->setLowerY(newRange.lower);
+    m_item->setUpperY(newRange.upper);
+    m_block_update = false;
+}
+
+//! Schedule replot for later execution by onTimeReplot() slot.
+
+void ColorMapPlot::replot()
+{
+    m_updateTimer->scheduleUpdate();
+//    m_customPlot->replot(); // will trigger immediate replot, seems that slower
+}
+
+//! Replots ColorMap.
+
+void ColorMapPlot::onTimeToReplot()
+{
+    m_customPlot->replot();
+}
+
+//! creates and initializes the color map
+void ColorMapPlot::initColorMap()
+{
+    m_customPlot = new QCustomPlot();
+
+    m_colorMap = new QCPColorMap(m_customPlot->xAxis, m_customPlot->yAxis);
+    m_customPlot->addPlottable(m_colorMap);
+    m_colorScale = new QCPColorScale(m_customPlot);
+
+    // add it to the right of the main axis rect
+    m_customPlot->plotLayout()->addElement(0, 1, m_colorScale);
+
+    // scale shall be vertical bar with tick/axis labels
+    m_colorScale->setType(QCPAxis::atRight);
+
+    m_colorMap->setColorScale(m_colorScale);
+
+    QPen pen;
+    pen.setWidth(1);
+    pen.setStyle(Qt::SolidLine);
+    pen.setColor(QColor(255, 255, 255, 130));
+    m_customPlot->addGraph();
+    m_customPlot->graph(0)->setPen(pen);
+    m_customPlot->addGraph();
+    m_customPlot->graph(1)->setPen(pen);
+
+    //setConnected(true);
+}
+
+
+void ColorMapPlot::setConnected(bool isConnected)
+{
+    setAxesRangeConnected(isConnected);
+    setDataRangeConnected(isConnected);
+    setMouseMoveConnected(isConnected);
+    setUpdateTimerConnected(isConnected);
+}
+
+//! Connects/disconnects signals related to ColorMap's X,Y axes rectangle change.
+
+void ColorMapPlot::setAxesRangeConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onXaxisRangeChanged(QCPRange)), Qt::UniqueConnection);
+
+        connect(m_customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onYaxisRangeChanged(QCPRange)), Qt::UniqueConnection);
+
+    } else {
+        disconnect(m_customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onXaxisRangeChanged(QCPRange)));
+
+        disconnect(m_customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), this,
+                SLOT(onYaxisRangeChanged(QCPRange)));
+    }
+}
+
+//! Connects/disconnects signals related to ColorMap's Z-axis (min,max) change.
+
+void ColorMapPlot::setDataRangeConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_colorMap, SIGNAL(dataRangeChanged(QCPRange)), this,
+                SLOT(onDataRangeChanged(QCPRange)), Qt::UniqueConnection);
+    } else {
+        disconnect(m_colorMap, SIGNAL(dataRangeChanged(QCPRange)), this,
+                SLOT(onDataRangeChanged(QCPRange)));
+    }
+}
+
+//! Connects/disconnects signals related to MouseMove in ColorMap
+
+void ColorMapPlot::setMouseMoveConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_customPlot, SIGNAL(mouseMove(QMouseEvent *)),
+                this, SLOT(onMouseMove(QMouseEvent *)), Qt::UniqueConnection);
+
+    } else {
+        disconnect(m_customPlot, SIGNAL(mouseMove(QMouseEvent *)),
+                this, SLOT(onMouseMove(QMouseEvent *)));
+    }
+}
+
+void ColorMapPlot::setUpdateTimerConnected(bool isConnected)
+{
+    if(isConnected) {
+        connect(m_updateTimer, SIGNAL(timeToUpdate()),
+                this, SLOT(onTimeToReplot()), Qt::UniqueConnection);
+    } else {
+        disconnect(m_updateTimer, SIGNAL(timeToUpdate()),
+                this, SLOT(onTimeToReplot()));
+    }
+}
+
+
+//! to make fixed margins for whole colormap (change in axes labels wont affect axes rectangle)
+void ColorMapPlot::setFixedColorMapMargins()
+{
+    QFontMetrics fontMetric(font());
+    auto em = fontMetric.width('M'), fontAscent = fontMetric.ascent();
+    auto *axisRectangle = m_customPlot->axisRect();
+    axisRectangle->setAutoMargins(QCP::msTop | QCP::msBottom);
+    axisRectangle->setMargins(QMargins(6.0*em, fontAscent*1.5, em*1.2, 4.5*fontAscent));
+}
+
+//! Sets initial state of ColorMap to match given intensity item.
+
+void ColorMapPlot::setColorMapFromItem(IntensityDataItem *intensityItem)
+{
+    Q_ASSERT(intensityItem);
+
+    m_block_update = true;
+
+    setAxesRangeFromItem(intensityItem);
+    setAxesZoomFromItem(intensityItem);
+    setLabelsFromItem(intensityItem);
+    setDataFromItem(intensityItem);
+    setColorScaleAppearanceFromItem(intensityItem);
+    setDataRangeFromItem(intensityItem);
+
+    replot();
+
+    m_block_update = false;
+}
+
+//! Sets (xmin,xmax,nbins) and (ymin,ymax,nbins) of ColorMapPlot from intensity item.
+
+void ColorMapPlot::setAxesRangeFromItem(IntensityDataItem *item)
+{
+    auto data = item->getOutputData();
+    if(!data) return;
+
+    m_customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
+    m_customPlot->axisRect()->setupFullAxesBox(true);
+
+    const IAxis &axis_x = data->getAxis(0);
+    const IAxis &axis_y = data->getAxis(1);
+
+    m_colorMap->data()->setSize(static_cast<int>(axis_x.size()),
+                                static_cast<int>(axis_y.size()));
+
+    m_colorMap->data()->setRange(ColorMapHelper::itemXrange(item),
+                                 ColorMapHelper::itemYrange(item));
+
+}
+
+//! Sets zoom range of X,Y axes as in intensity item.
+
+void ColorMapPlot::setAxesZoomFromItem(IntensityDataItem *item)
+{
+    setAxesRangeConnected(false);
+    m_customPlot->xAxis->setRange(item->getLowerX(), item->getUpperX());
+    m_customPlot->yAxis->setRange(item->getLowerY(), item->getUpperY());
+    setAxesRangeConnected(true);
+}
+
+//! Sets X,Y axes labels from item
+
+void ColorMapPlot::setLabelsFromItem(IntensityDataItem *item)
+{
+    m_customPlot->xAxis->setLabel(item->getXaxisTitle());
+    m_customPlot->yAxis->setLabel(item->getYaxisTitle());
+}
+
+//! Sets the intensity values to ColorMapPlot.
+
+void ColorMapPlot::setDataFromItem(IntensityDataItem *item)
+{
+    auto data = item->getOutputData();
+    if(!data) return;
+
+    const IAxis &axis_x = data->getAxis(0);
+    const IAxis &axis_y = data->getAxis(1);
+
+    for(size_t ix=0; ix<axis_x.size(); ++ix) {
+        for(size_t iy=0; iy<axis_y.size(); ++iy) {
+            m_colorMap->data()->setCell(static_cast<int>(ix), static_cast<int>(iy),
+                                        (*data)[iy+axis_y.size()*ix]);
+        }
+    }
+}
+
+//! Sets the appearance of color scale (visibility, gradient type) from intensity item.
+
+void ColorMapPlot::setColorScaleAppearanceFromItem(IntensityDataItem *item)
+{
+    setColorScaleVisible(item->getItem(IntensityDataItem::P_ZAXIS)
+        ->getItemValue(BasicAxisItem::P_IS_VISIBLE).toBool());
+    m_colorMap->setGradient(ColorMapHelper::itemGradient(m_item));
+    m_colorMap->setInterpolate(m_item->isInterpolated());
+    // make sure the axis rect and color scale synchronize their bottom and top margins (so they
+    // line up):
+    QCPMarginGroup *marginGroup = new QCPMarginGroup(m_customPlot);
+    m_customPlot->axisRect()->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
+    m_colorScale->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
+}
+
+void ColorMapPlot::setDataRangeFromItem(IntensityDataItem *item)
+{
+    setDataRangeConnected(false);
+
+    QCPRange newDataRange(item->getLowerZ(), item->getUpperZ());
+    m_colorMap->setDataRange(newDataRange);
+    setLogz(item->isLogz());
+
+    setDataRangeConnected(true);
+}
+
+
+void ColorMapPlot::setColorScaleVisible(bool visibility_flag)
+{
+    m_colorScale->setVisible(visibility_flag);
+    if(visibility_flag) {
+        // add it to the right of the main axis rect
+        m_customPlot->plotLayout()->addElement(0, 1, m_colorScale);
+    } else {
+        m_customPlot->plotLayout()->take(m_colorScale);
+        m_customPlot->plotLayout()->simplify();
+    }
+}
+
+//! Disconnects everything
+
+void ColorMapPlot::resetColorMap()
+{
+    setConnected(false);
+    if(m_item)
+        m_item->mapper()->unsubscribe(this);
+}
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h
new file mode 100644
index 0000000..fb49c3d
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h
@@ -0,0 +1,145 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ColorMapPlot.h
+//! @brief     Defines class ColorMapPlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPPLOT_H
+#define COLORMAPPLOT_H
+
+#include "WinDllMacros.h"
+#include "qcustomplot.h"
+#include <QMap>
+#include <QPoint>
+#include <QWidget>
+#include <memory>
+
+class IntensityDataItem;
+class QCustomPlot;
+class QCPColorMap;
+class QCPColorScale;
+class UpdateTimer;
+
+//! 2D color map widget for IntensityData
+class BA_CORE_API_ ColorMapPlot : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit ColorMapPlot(QWidget *parent = 0);
+    ~ColorMapPlot();
+
+    QSize sizeHint() const { return QSize(500, 400); }
+    QSize minimumSizeHint() const { return QSize(128, 128); }
+
+    void setItem(IntensityDataItem *item);
+
+    QString getStatusString();
+
+    void drawLinesOverTheMap();
+
+    void showLinesOverTheMap(bool isVisible);
+
+    QCustomPlot *getCustomPlot() { return m_customPlot; }
+
+    //! transform axes coordinates to CustomPlot widget coordinates
+    double xAxisCoordToPixel(double axis_coordinate) const;
+    double yAxisCoordToPixel(double axis_coordinate) const;
+
+    //! transform widget coordinates to axes coordinates
+    double pixelToXaxisCoord(double pixel) const;
+    double pixelToYaxisCoord(double pixel) const;
+
+    //! returns rectangle representing current axes zoom state in widget coordinates
+    QRectF getViewportRectangleInWidgetCoordinates();
+
+    void setTrackMoveEventsFlag(bool flag);
+
+signals:
+    void validMousMove();
+
+public slots:
+    void setLogz(bool logz);
+    void resetView();
+    void onMouseMove(QMouseEvent *event);
+
+    void getHorizontalSlice(QVector<double> &x, QVector<double> &y);
+    void getVerticalSlice(QVector<double> &x, QVector<double> &y);
+
+private slots:
+    void onIntensityModified();
+    void onPropertyChanged(const QString &property_name);
+    void onSubItemPropertyChanged(const QString &property_group, const QString &property_name);
+    void onDataRangeChanged(QCPRange newRange);
+    void onXaxisRangeChanged(QCPRange newRange);
+    void onYaxisRangeChanged(QCPRange newRange);
+    void replot();
+    void onTimeToReplot();
+
+private:
+
+    class PositionData {
+    public:
+        PositionData() { reset(); }
+        bool valid;
+        int key;
+        int value;
+        double m_xPos;
+        double m_yPos;
+        double cellValue;
+        void reset() {
+            valid = false;
+            key = 0;
+            value = 0;
+            m_xPos = 0;
+            m_yPos = 0;
+            cellValue = 0;
+        }
+    };
+
+    void initColorMap();
+
+    void setConnected(bool isConnected);
+    void setAxesRangeConnected(bool isConnected);
+    void setDataRangeConnected(bool isConnected);
+    void setMouseMoveConnected(bool isConnected);
+    void setUpdateTimerConnected(bool isConnected);
+
+    void setFixedColorMapMargins();
+
+    void setColorMapFromItem(IntensityDataItem *intensityItem);
+    void setAxesRangeFromItem(IntensityDataItem *item);
+    void setAxesZoomFromItem(IntensityDataItem *item);
+    void setLabelsFromItem(IntensityDataItem *item);
+    void setDataFromItem(IntensityDataItem *item);
+    void setColorScaleAppearanceFromItem(IntensityDataItem *item);
+    void setDataRangeFromItem(IntensityDataItem *item);
+
+    void setColorScaleVisible(bool visibility_flag);
+
+    void resetColorMap();
+
+    QCustomPlot *m_customPlot;
+    QCPColorMap *m_colorMap;
+    QCPColorScale *m_colorScale;
+
+    IntensityDataItem *m_item;
+
+    bool m_block_update;
+    PositionData m_posData;
+
+    UpdateTimer *m_updateTimer;
+};
+
+
+
+#endif // COLORMAPPLOT_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
new file mode 100644
index 0000000..f631da6
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
@@ -0,0 +1,205 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
+//! @brief     Implements class HorizontalSlicePlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "HorizontalSlicePlot.h"
+#include "AxesItems.h"
+#include "IntensityDataItem.h"
+#include "MathConstants.h"
+#include "qcustomplot.h"
+#include <QVBoxLayout>
+
+HorizontalSlicePlot::HorizontalSlicePlot(QWidget *parent)
+    : QWidget(parent)
+    , m_customPlot(0)
+    , m_bars(0)
+    , m_item(0)
+//    , m_mapper(0)
+{
+    m_customPlot = new QCustomPlot();
+    m_bars = new QCPBars(m_customPlot->xAxis, m_customPlot->yAxis);
+    m_customPlot->addPlottable(m_bars);
+
+    QVBoxLayout *vlayout = new QVBoxLayout(this);
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+    vlayout->addWidget(m_customPlot);
+    setLayout(vlayout);
+
+}
+
+void HorizontalSlicePlot::setItem(IntensityDataItem *item)
+{
+    if(m_item == item) {
+        return;
+
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if (!m_item) return;
+
+        plotItem(m_item);
+
+        m_item->mapper()->setOnChildPropertyChange(
+                    [this](SessionItem* item, const QString name)
+        {
+            if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
+                onSubItemPropertyChanged(item->itemName(), name);
+        }, this);
+    }
+
+
+}
+
+void HorizontalSlicePlot::plotData(const QVector<double> &x, const QVector<double> &y)
+{
+    //qDebug() << "NHistogramPlot::plotData(const QVector<double> &x, const QVector<double> &y)";
+    m_bars->setData(x, y);
+    m_customPlot->replot();
+}
+
+void HorizontalSlicePlot::onSubItemPropertyChanged(const QString &property_group, const QString &property_name)
+{
+    qDebug() << "HorizontalSlicePlot::onSubItemPropertyChanged(const QString &property_name)" << property_group << property_name;
+    if(property_group == IntensityDataItem::P_XAXIS) {
+        if(property_name == BasicAxisItem::P_MIN) {
+            setXmin(m_item->getLowerX());
+        }
+        else if(property_name == BasicAxisItem::P_MAX) {
+            setXmax(m_item->getUpperX());
+        }
+    }
+    else if(property_group == IntensityDataItem::P_YAXIS) {
+        if(property_name == BasicAxisItem::P_MIN) {
+            setYmin(m_item->getLowerY());
+        }
+        else if(property_name == BasicAxisItem::P_MAX) {
+            setYmax(m_item->getUpperY());
+        }
+    }
+    else if(property_group == IntensityDataItem::P_ZAXIS) {
+        if(property_name == BasicAxisItem::P_MIN) {
+            setZmin(m_item->getLowerZ());
+        }
+        else if(property_name == BasicAxisItem::P_MAX) {
+            setZmax(m_item->getUpperZ());
+        }
+        else if(property_name == AmplitudeAxisItem::P_IS_LOGSCALE) {
+            setLogz(m_item->isLogz(), true);
+        }
+    }
+}
+
+void HorizontalSlicePlot::plotItem(IntensityDataItem *intensityItem)
+{
+    //qDebug() << "NHistogramPlot::plotItem(NIntensityDataItem *intensityItem)";
+    Q_ASSERT(intensityItem);
+
+    const OutputData<double> *data = intensityItem->getOutputData();
+    if(!data) return;
+
+    if(data->getRank() != 2) {
+        throw Exceptions::NullPointerException("NHistogramPlot::plotItem::Draw() -> Error. Zero pointer to the data to draw");
+    }
+
+    m_customPlot->axisRect()->setupFullAxesBox(true);
+
+    m_customPlot->xAxis->setRange(intensityItem->getLowerX(), intensityItem->getUpperX());
+    m_customPlot->yAxis->setRange(intensityItem->getLowerZ(), intensityItem->getUpperZ());
+
+    const IAxis &axis0 = data->getAxis(0);
+    double bin_size(0);
+    bin_size = (axis0.getMax() - axis0.getMin())/axis0.size();
+
+    m_bars->setWidth(bin_size);
+    m_bars->setPen(Qt::NoPen);
+    m_bars->setBrush(Qt::blue);
+
+    setLogz(intensityItem->isLogz());
+
+//    const QMargins margins(0,0,82,0);
+    const QMargins margins(10,0,77,0);
+    m_customPlot->axisRect()->setMargins(margins);
+    m_customPlot->axisRect()->layout()->setMargins(margins);
+
+    m_customPlot->replot();
+}
+
+
+void HorizontalSlicePlot::setLogz(bool logz, bool isReplot)
+{
+    if(logz) {
+        m_customPlot->yAxis->setScaleType(QCPAxis::stLogarithmic);
+        m_customPlot->yAxis->setNumberFormat("eb");
+        m_customPlot->yAxis->setNumberPrecision(0);
+    } else {
+        m_customPlot->yAxis->setScaleType(QCPAxis::stLinear);
+        m_customPlot->yAxis->setNumberFormat("f");
+    }
+
+    if(isReplot) m_customPlot->replot();
+}
+
+void HorizontalSlicePlot::setXmin(double value)
+{
+    QCPRange range = m_customPlot->xAxis->range();
+    range.lower = value;
+    m_customPlot->xAxis->setRange(range);
+    m_customPlot->replot();
+}
+
+void HorizontalSlicePlot::setXmax(double value)
+{
+    QCPRange range = m_customPlot->xAxis->range();
+    range.upper = value;
+    m_customPlot->xAxis->setRange(range);
+    m_customPlot->replot();
+}
+
+void HorizontalSlicePlot::setYmin(double value)
+{
+    Q_UNUSED(value);
+//    QCPRange range = m_customPlot->yAxis->range();
+//    range.lower = value;
+//    m_customPlot->yAxis->setRange(range);
+//    m_customPlot->replot();
+}
+
+void HorizontalSlicePlot::setYmax(double value)
+{
+    Q_UNUSED(value);
+//    QCPRange range = m_customPlot->yAxis->range();
+//    range.upper = value;
+//    m_customPlot->yAxis->setRange(range);
+//    m_customPlot->replot();
+}
+
+void HorizontalSlicePlot::setZmin(double value)
+{
+    QCPRange range = m_customPlot->yAxis->range();
+    range.lower = value;
+    m_customPlot->yAxis->setRange(range);
+    m_customPlot->replot();
+}
+
+void HorizontalSlicePlot::setZmax(double value)
+{
+    QCPRange range = m_customPlot->yAxis->range();
+    range.upper = value;
+    m_customPlot->yAxis->setRange(range);
+    m_customPlot->replot();
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h
new file mode 100644
index 0000000..116ce31
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.h
+//! @brief     Defines class HorizontalSlicePlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HORIZONTALSLICEPLOT_H
+#define HORIZONTALSLICEPLOT_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class IntensityDataItem;
+class QCustomPlot;
+class QCPBars;
+
+//! Slice of 2D IntensityData along x-axis
+//!  FIXME functionality has to be merged with VerticalSlicePlot (code duplication)
+class BA_CORE_API_ HorizontalSlicePlot : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit HorizontalSlicePlot(QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(128, 128); }
+    QSize minimumSizeHint() const { return QSize(64, 64); }
+
+    void setItem(IntensityDataItem *item);
+
+public slots:
+    void plotData(const QVector<double> &x, const QVector<double> &y);
+
+private slots:
+//    void onPropertyChanged(const QString &property_name);
+    void onSubItemPropertyChanged(const QString &property_group, const QString &property_name);
+
+private:
+    void plotItem(IntensityDataItem *intensityItem);
+    void setLogz(bool logz, bool isReplot = false);
+    void setXmin(double value);
+    void setXmax(double value);
+    void setYmin(double value);
+    void setYmax(double value);
+    void setZmin(double value);
+    void setZmax(double value);
+
+    QCustomPlot *m_customPlot;
+    QCPBars *m_bars;
+    IntensityDataItem *m_item;
+};
+
+#endif // HORIZONTALSLICEPLOT_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.cpp
new file mode 100644
index 0000000..6ee3a7a
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.cpp
@@ -0,0 +1,113 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.cpp
+//! @brief     Implements class IntensityDataPropertyWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IntensityDataPropertyWidget.h"
+#include "ComponentEditor.h"
+#include "IntensityDataItem.h"
+#include "JobModel.h"
+#include <QAction>
+#include <QDebug>
+#include <QVBoxLayout>
+
+IntensityDataPropertyWidget::IntensityDataPropertyWidget(QWidget *parent)
+    : SessionItemWidget(parent)
+    , m_togglePanelAction(0)
+    , m_currentItem(0)
+    , m_componentEditor(0)
+{
+    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+    setWindowTitle(QLatin1String("Intensity Data Properties"));
+    setObjectName(QLatin1String("Intensity Data Properties"));
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    m_componentEditor = new ComponentEditor();
+
+    mainLayout->addWidget(m_componentEditor);
+
+    setLayout(mainLayout);
+
+    m_togglePanelAction = new QAction(this);
+    m_togglePanelAction->setText("Properties");
+    m_togglePanelAction->setIcon(QIcon(":/images/toolbar16light_propertypanel.svg"));
+    m_togglePanelAction->setToolTip("Toggle Property Panel");
+    connect(m_togglePanelAction, SIGNAL(triggered()), this, SLOT(onTogglePanelAction()));
+
+}
+
+IntensityDataPropertyWidget::~IntensityDataPropertyWidget()
+{
+    if(m_currentItem)
+        m_currentItem->mapper()->unsubscribe(this);
+}
+
+void IntensityDataPropertyWidget::setItem(SessionItem *item)
+{
+    if(m_currentItem == item)
+        return;
+
+    if(m_currentItem)
+        m_currentItem->mapper()->unsubscribe(this);
+
+    m_currentItem = item;
+   if (!m_currentItem) return;
+
+    m_componentEditor->setItem(item);
+
+    setPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
+
+    m_currentItem->mapper()->setOnPropertyChange(
+                 [this](const QString &name)
+    {
+        if(name == IntensityDataItem::P_PROPERTY_PANEL_FLAG) {
+            setPanelVisible(m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
+        }
+    }, this);
+
+    m_currentItem->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_currentItem = 0;
+    }, this);
+
+
+}
+
+QList<QAction *> IntensityDataPropertyWidget::actionList()
+{
+    return QList<QAction *>() << m_togglePanelAction;
+}
+
+void IntensityDataPropertyWidget::onTogglePanelAction()
+{
+    if(m_currentItem) {
+        bool current_flag = m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool();
+        m_currentItem->setItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG, !current_flag);
+    }
+
+}
+
+void IntensityDataPropertyWidget::setPanelVisible(bool visible)
+{
+    if(visible) {
+        m_componentEditor->setItem(m_currentItem);
+
+    } else {
+        m_componentEditor->setItem(0);
+    }
+    setVisible(visible);
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.h b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.h
new file mode 100644
index 0000000..9690c8e
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/IntensityDataPropertyWidget.h
+//! @brief     Defines class IntensityDataPropertyWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTENSITYDATAPROPERTYWIDGET_H
+#define INTENSITYDATAPROPERTYWIDGET_H
+
+#include "SessionItemWidget.h"
+
+class JobModel;
+class IntensityDataItem;
+class ComponentEditor;
+class SessionItem;
+
+//! The IntensityDataPropertyWidget shows ComponentEditor for given IntensityDataItem.
+
+class BA_CORE_API_ IntensityDataPropertyWidget : public SessionItemWidget
+{
+    Q_OBJECT
+public:
+    explicit IntensityDataPropertyWidget(QWidget *parent = 0);
+    ~IntensityDataPropertyWidget();
+
+    QSize sizeHint() const { return QSize(230, 256); }
+    QSize minimumSizeHint() const { return QSize(230, 64); }
+
+    void setItem(SessionItem *item);
+
+    QList<QAction *> actionList();
+
+public slots:
+    void onTogglePanelAction();
+
+private:
+    void setPanelVisible(bool visible);
+
+    QAction *m_togglePanelAction;
+    SessionItem *m_currentItem;
+    ComponentEditor *m_componentEditor;
+};
+
+#endif // INTENSITYDATAPROPERTYWIDGET_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp
new file mode 100644
index 0000000..36f9cdb
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.cpp
+//! @brief     Implements class IntensityDataWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IntensityDataWidget.h"
+#include "AppSvc.h"
+#include "ColorMapCanvas.h"
+#include "IntensityDataItem.h"
+#include "SavePlotAssistant.h"
+#include "projectmanager.h"
+#include <QAction>
+#include <QVBoxLayout>
+
+IntensityDataWidget::IntensityDataWidget(QWidget *parent)
+    : SessionItemWidget(parent)
+    , m_colorMap(new ColorMapCanvas(this))
+    , m_resetViewAction(0)
+    , m_savePlotAction(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(m_colorMap);
+    setLayout(layout);
+
+    m_colorMap->setStatusLabelEnabled(true);
+
+    initActions();
+}
+
+void IntensityDataWidget::setItem(SessionItem *item)
+{
+    IntensityDataItem *intensityItem = dynamic_cast<IntensityDataItem *>(item);
+    Q_ASSERT(intensityItem);
+    setIntensityData(intensityItem);
+}
+
+void IntensityDataWidget::setIntensityData(IntensityDataItem *intensityItem)
+{
+    m_currentItem = intensityItem;
+    m_colorMap->setItem(intensityItem);
+}
+
+QList<QAction *> IntensityDataWidget::actionList()
+{
+    return QList<QAction *>() << m_resetViewAction << m_savePlotAction;
+}
+
+void IntensityDataWidget::onResetViewAction()
+{
+    m_currentItem->resetView();
+}
+
+void IntensityDataWidget::onSavePlotAction()
+{
+    QString dirname = AppSvc::projectManager()->userExportDir();
+    SavePlotAssistant saveAssistant;
+    saveAssistant.savePlot(dirname, m_colorMap->customPlot(), m_currentItem);
+}
+
+void IntensityDataWidget::initActions()
+{
+    m_resetViewAction = new QAction(this);
+    m_resetViewAction->setText("Reset");
+    m_resetViewAction->setIcon(QIcon(":/images/toolbar16light_refresh.svg"));
+    m_resetViewAction->setToolTip("Reset View");
+    connect(m_resetViewAction, SIGNAL(triggered()), this, SLOT(onResetViewAction()));
+
+    m_savePlotAction = new QAction(this);
+    m_savePlotAction->setText("Save");
+    m_savePlotAction->setIcon(QIcon(":/images/toolbar16light_save.svg"));
+    m_savePlotAction->setToolTip("Save Plot");
+    connect(m_savePlotAction, SIGNAL(triggered()), this, SLOT(onSavePlotAction()));
+}
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h
new file mode 100644
index 0000000..ef6124c
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/IntensityDataWidget.h
+//! @brief     Defines class IntensityDataWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTENSITYDATAWIDGET_H
+#define INTENSITYDATAWIDGET_H
+
+#include "SessionItemWidget.h"
+
+class SessionItem;
+class IntensityDataItem;
+class ColorMapCanvas;
+class QAction;
+
+//! The IntensityDataWidget class represents IntensityDataItem as color map,
+//! provides standard actions (reset view, save as) for external toolbars and context menus.
+
+class BA_CORE_API_ IntensityDataWidget : public SessionItemWidget
+{
+    Q_OBJECT
+public:
+    explicit IntensityDataWidget(QWidget *parent = 0);
+
+    void setItem(SessionItem *item);
+    void setIntensityData(IntensityDataItem *intensityItem);
+
+    QSize sizeHint() const { return QSize(500, 400); }
+    QSize minimumSizeHint() const { return QSize(128, 128); }
+
+    QList<QAction *> actionList();
+
+public slots:
+    void onResetViewAction();
+    void onSavePlotAction();
+
+private:
+    void initActions();
+
+    ColorMapCanvas *m_colorMap;
+    IntensityDataItem *m_currentItem;
+    QAction *m_resetViewAction;
+    QAction *m_savePlotAction;
+};
+
+#endif // INTENSITYDATAWIDGET_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.cpp
new file mode 100644
index 0000000..19e8214
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.cpp
@@ -0,0 +1,302 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.cpp
+//! @brief     Implements class ObsoleteIntensityDataPlotWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ObsoleteIntensityDataPlotWidget.h"
+#include "ColorMapPlot.h"
+#include "HorizontalSlicePlot.h"
+#include "IntensityDataItem.h"
+#include "SavePlotAssistant.h"
+#include "VerticalSlicePlot.h"
+#include "qcustomplot.h"
+#include <QDebug>
+#include <QLabel>
+#include <QSplitter>
+#include <QVBoxLayout>
+
+
+ObsoleteIntensityDataPlotWidget::ObsoleteIntensityDataPlotWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_splitter(new QSplitter(this))
+    , m_splitterTop(new QSplitter(this))
+    , m_splitterBottom(new QSplitter(this))
+    , m_propertyPanelAction(0)
+    , m_projectionsAction(0)
+    , m_resetAction(0)
+    , m_saveAction(0)
+    , m_centralPlot(new ColorMapPlot(this))
+    , m_verticalPlot(new VerticalSlicePlot(this))
+    , m_horizontalPlot(new HorizontalSlicePlot(this))
+    , m_statusLabel(new QLabel(this))
+    , m_leftHistogramArea(150)
+    , m_bottomHistogramArea(150)
+    , m_item(0)
+//    , m_mapper(0)
+{
+    setObjectName(QStringLiteral("IntensityDataPlotWidget"));
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    m_centralPlot->setTrackMoveEventsFlag(true);
+
+    m_splitterTop->addWidget(m_verticalPlot);
+    m_splitterTop->addWidget(m_centralPlot);
+    m_splitterTop->setStyleSheet("background-color:white;");
+
+    m_splitterBottom->addWidget(new QWidget());
+    m_splitterBottom->addWidget(m_horizontalPlot);
+    m_splitterBottom->setStyleSheet("background-color:white;");
+    m_splitterBottom->setHandleWidth(0);
+
+    m_splitter->setOrientation(Qt::Vertical);
+    m_splitter->addWidget(m_splitterTop);
+    m_splitter->addWidget(m_splitterBottom);
+    m_splitter->setStyleSheet("background-color:white;");
+
+    m_statusLabel->setAlignment(Qt::AlignVCenter| Qt::AlignLeft);
+    m_statusLabel->setStyleSheet("background-color:white;");
+    m_statusLabel->setMargin(3);
+
+    QVBoxLayout *vlayout = new QVBoxLayout(this);
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+    vlayout->addWidget(m_splitter);
+    vlayout->addWidget(m_statusLabel);
+    this->setLayout(vlayout);
+
+    initLeftRightAreaSize(0, 600);
+    initTopBottomAreaSize(500, 0);
+
+    connect(m_splitterTop, SIGNAL(splitterMoved(int,int)), this, SLOT(onSplitterMoved(int,int)));
+    connect(m_splitterBottom, SIGNAL(splitterMoved(int,int)), this, SLOT(onSplitterMoved(int,int)));
+    connect(m_centralPlot, SIGNAL(validMousMove()), this, SLOT(onMouseMove()));
+    connect(m_centralPlot->getCustomPlot(), SIGNAL(mousePress(QMouseEvent*)), this, SLOT(onMousePress(QMouseEvent*)), Qt::UniqueConnection);
+
+    setupContextMenuActions();
+}
+
+ObsoleteIntensityDataPlotWidget::~ObsoleteIntensityDataPlotWidget()
+{
+
+}
+
+//! initializes the class with NIntensityDataItem
+void ObsoleteIntensityDataPlotWidget::setItem(IntensityDataItem *item)
+{
+    m_centralPlot->setItem(item);
+    m_horizontalPlot->setItem(item);
+    m_verticalPlot->setItem(item);
+
+    if (m_item == item) {
+        return;
+
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if (!m_item) return;
+
+        updateItem(m_item);
+
+        m_item->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            if(name == IntensityDataItem::P_PROJECTIONS_FLAG) {
+                showProjections(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool());
+            }
+        }, this);
+
+    }
+
+}
+
+//! provide syncronious move of top and bottom splitters
+void ObsoleteIntensityDataPlotWidget::onSplitterMoved(int pos, int index)
+{
+    Q_UNUSED(index);
+    QSplitter *splitter = qobject_cast<QSplitter *>(sender());
+    QList<int> sizes = QList<int>() << pos << (this->size().width()-pos);
+    if(splitter == m_splitterTop) {
+        m_splitterBottom->setSizes(sizes);
+    } else if(splitter == m_splitterBottom) {
+        m_splitterTop->setSizes(sizes);
+    }
+}
+
+void ObsoleteIntensityDataPlotWidget::resetView()
+{
+    m_item->resetView();
+}
+
+//! reset views to original axes min and max
+//void IntensityDataPlotWidget::resetView()
+//{
+//    m_centralPlot->resetView();
+//}
+
+//! updates status string, line cross and projections on mouse move
+void ObsoleteIntensityDataPlotWidget::onMouseMove()
+{
+    m_statusLabel->setText(m_centralPlot->getStatusString());
+
+    bool bottom_is_visible = isBottomAreaVisible();
+    if(bottom_is_visible) {
+        QVector<double> x, y;
+        m_centralPlot->getHorizontalSlice(x, y);
+        m_horizontalPlot->plotData(x,y);
+    }
+
+    bool left_is_visible = isLeftAreaVisible();
+    if(left_is_visible) {
+        QVector<double> x, y;
+        m_centralPlot->getVerticalSlice(x, y);
+        m_verticalPlot->plotData(x,y);
+    }
+
+    if(bottom_is_visible || left_is_visible)
+        m_centralPlot->drawLinesOverTheMap();
+}
+
+//! provides context menu on right mouse button
+void ObsoleteIntensityDataPlotWidget::onMousePress(QMouseEvent *event)
+{
+    if(event->button() == Qt::RightButton) {
+        //showContextMenu(event->pos());
+        showContextMenu(event->globalPos());
+    }
+}
+
+//! saves plot into proposed directory
+void ObsoleteIntensityDataPlotWidget::savePlot(const QString &dirname)
+{
+    Q_ASSERT(m_item);
+
+    bool projections_flag = m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool();
+    if(projections_flag)
+        m_centralPlot->showLinesOverTheMap(false);
+
+    SavePlotAssistant saveAssistant;
+    saveAssistant.savePlot(dirname, m_centralPlot->getCustomPlot(), m_item);
+
+    m_centralPlot->showLinesOverTheMap(projections_flag);
+}
+
+//! switches projections On and Off
+void ObsoleteIntensityDataPlotWidget::showProjections(bool flag)
+{
+    if(flag) {
+        // restoring old splitter positions
+        int width = m_splitterTop->width() - m_leftHistogramArea;
+        if(width < 0) width = m_leftHistogramArea*3;
+        initLeftRightAreaSize(m_leftHistogramArea, width);
+
+        int height = m_splitter->height() - m_bottomHistogramArea;
+        if(height < 0) height = m_bottomHistogramArea*3;
+        initTopBottomAreaSize(height, m_bottomHistogramArea);
+
+    } else {
+        // saving splitter positions, and then
+        // hiding projections by setting corresponding splitter size to zero
+        QList<int> horizontal_sizes = m_splitterTop->sizes();
+        if(horizontal_sizes[0] > 0) m_leftHistogramArea = horizontal_sizes[0];
+        initLeftRightAreaSize(0, horizontal_sizes[0]+horizontal_sizes[1]);
+        QList<int> vertical_sizes = m_splitter->sizes();
+        if(vertical_sizes[1] > 0) m_bottomHistogramArea = vertical_sizes[1];
+        initTopBottomAreaSize(vertical_sizes[0]+vertical_sizes[1], 0);
+    }
+}
+
+void ObsoleteIntensityDataPlotWidget::onPropertyPanelAction(bool flag)
+{
+    Q_ASSERT(m_item);
+    m_item->setItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG, flag);
+}
+
+void ObsoleteIntensityDataPlotWidget::onProjectionsAction(bool flag)
+{
+    Q_ASSERT(m_item);
+    m_item->setItemValue(IntensityDataItem::P_PROJECTIONS_FLAG, flag);
+}
+
+
+void ObsoleteIntensityDataPlotWidget::showContextMenu(const QPoint &point)
+{
+    Q_ASSERT(m_item);
+    QMenu menu;
+
+    m_propertyPanelAction->setChecked(m_item->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool());
+    m_projectionsAction->setChecked(m_item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool());
+
+    menu.addAction(m_propertyPanelAction);
+    menu.addAction(m_projectionsAction);
+    menu.addAction(m_resetAction);
+    menu.addAction(m_saveAction);
+
+    //menu.exec(mapToGlobal(point));
+    menu.exec(point);
+}
+
+void ObsoleteIntensityDataPlotWidget::setupContextMenuActions()
+{
+    m_propertyPanelAction = new QAction("Plot Properties", this);
+    m_propertyPanelAction->setCheckable(true);
+    connect(m_propertyPanelAction, SIGNAL(triggered(bool)), this, SLOT(onPropertyPanelAction(bool)));
+
+    m_projectionsAction = new QAction("&Projections", this);
+    m_projectionsAction->setCheckable(true);
+    connect(m_projectionsAction, SIGNAL(triggered(bool)), this, SLOT(onProjectionsAction(bool)));
+
+    m_resetAction = new QAction("Reset View", this);
+    connect(m_resetAction, SIGNAL(triggered()), this, SLOT(resetView()));
+
+    m_saveAction = new QAction("Save as", this);
+    connect(m_saveAction, SIGNAL(triggered()), this, SIGNAL(savePlotRequest()));
+
+}
+
+void ObsoleteIntensityDataPlotWidget::updateItem(IntensityDataItem *item)
+{
+    showProjections(item->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool());
+}
+
+//! sets sizes of top and bottom splitters to have correct sizes of vertical histogram (on the left) and color map
+void ObsoleteIntensityDataPlotWidget::initLeftRightAreaSize(int left_size, int right_size)
+{
+    QList<int> sizes = QList<int>() << left_size << right_size;
+    m_splitterTop->setSizes(sizes);
+    m_splitterBottom->setSizes(sizes);
+}
+
+//! set size of main splitter to have correct sizes of horizontal histogram (at the bottom) and color map
+void ObsoleteIntensityDataPlotWidget::initTopBottomAreaSize(int top_size, int bottom_size)
+{
+    QList<int> sizes = QList<int>() << top_size << bottom_size;
+    m_splitter->setSizes(sizes);
+}
+
+//! returns true if bottom splitter is not collapsed
+bool ObsoleteIntensityDataPlotWidget::isBottomAreaVisible()
+{
+    QList<int> sizes = m_splitter->sizes();
+    return sizes[1] != 0;
+}
+
+//! returns true if left splitter is not collapsed
+bool ObsoleteIntensityDataPlotWidget::isLeftAreaVisible()
+{
+    QList<int> sizes = m_splitterTop->sizes();
+    return sizes[0] != 0;
+}
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.h b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.h
new file mode 100644
index 0000000..0965bc0
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.h
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataPlotWidget.h
+//! @brief     Defines class ObsoleteIntensityDataPlotWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OBSOLETEINTENSITYDATAPLOTWIDGET_H
+#define OBSOLETEINTENSITYDATAPLOTWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class QSplitter;
+class HorizontalSlicePlot;
+class VerticalSlicePlot;
+class ColorMapPlot;
+class QLabel;
+class IntensityDataItem;
+
+//! The widget contains IntensityDataItem color map, two projections and all
+//! logic. Belongs to IntensityDataWidget.
+class BA_CORE_API_ ObsoleteIntensityDataPlotWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit ObsoleteIntensityDataPlotWidget(QWidget *parent = 0);
+    ~ObsoleteIntensityDataPlotWidget();
+
+    QSize sizeHint() const { return QSize(800, 800); }
+    QSize minimumSizeHint() const { return QSize(256, 256); }
+
+    void setItem(IntensityDataItem *item);
+
+signals:
+    void savePlotRequest();
+
+public slots:
+    void onSplitterMoved(int pos, int index);
+    void resetView();
+    void onMouseMove();
+    void onMousePress(QMouseEvent *event);
+    void savePlot(const QString &dirname);
+
+private slots:
+    void showProjections(bool flag);
+    void onPropertyPanelAction(bool flag);
+    void onProjectionsAction(bool flag);
+    void showContextMenu(const QPoint &point);
+
+private:
+    void setupContextMenuActions();
+    void updateItem(IntensityDataItem *item);
+    void initLeftRightAreaSize(int left_size, int right_size);
+    void initTopBottomAreaSize(int bottom_size, int top_size);
+    bool isBottomAreaVisible();
+    bool isLeftAreaVisible();
+
+    QSplitter *m_splitter;
+    QSplitter *m_splitterTop;
+    QSplitter *m_splitterBottom;
+    QAction *m_propertyPanelAction;
+    QAction *m_projectionsAction;
+    QAction *m_resetAction;
+    QAction *m_saveAction;
+    ColorMapPlot *m_centralPlot;
+    VerticalSlicePlot *m_verticalPlot;
+    HorizontalSlicePlot *m_horizontalPlot;
+    QLabel *m_statusLabel;
+    int m_leftHistogramArea;
+    int m_bottomHistogramArea;
+    IntensityDataItem *m_item;
+};
+
+#endif // OBSOLETEINTENSITYDATAPLOTWIDGET_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.cpp b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.cpp
new file mode 100644
index 0000000..a04de4a
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.cpp
@@ -0,0 +1,119 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.cpp
+//! @brief     Implements class ObsoleteIntensityDataWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ObsoleteIntensityDataWidget.h"
+#include "AppSvc.h"
+#include "IntensityDataItem.h"
+#include "IntensityDataPropertyWidget.h"
+#include "JobItem.h"
+#include "ModelMapper.h"
+#include "ObsoleteIntensityDataPlotWidget.h"
+#include "ObsoleteIntensityDataWidgetActions.h"
+#include "projectmanager.h"
+#include <QDebug>
+#include <QVBoxLayout>
+
+
+ObsoleteIntensityDataWidget::ObsoleteIntensityDataWidget(QWidget *parent)
+    : SessionItemWidget(parent)
+    , m_widgetActions(new ObsoleteIntensityDataWidgetActions(this))
+    , m_plotWidget(0)
+    , m_propertyWidget(0)
+    , m_currentItem(0)
+{
+    setMinimumSize(600, 600);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    setWindowTitle(QLatin1String("IntensityDataWidget"));
+    setObjectName(QLatin1String("IntensityDataWidget"));
+
+    m_plotWidget = new ObsoleteIntensityDataPlotWidget(this);
+    connect(m_plotWidget, SIGNAL(savePlotRequest()), this, SLOT(savePlot()));
+
+    m_propertyWidget = new IntensityDataPropertyWidget(this);
+
+    QHBoxLayout *hlayout = new QHBoxLayout;
+    hlayout->setMargin(0);
+    hlayout->setSpacing(0);
+
+    hlayout->addWidget(m_plotWidget);
+    hlayout->addWidget(m_propertyWidget);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    mainLayout->addLayout(hlayout);
+    setLayout(mainLayout);
+
+
+    connect(m_widgetActions, SIGNAL(togglePropertyPanel()), this, SLOT(togglePropertyPanel()));
+    connect(m_widgetActions, SIGNAL(toggleProjections()), this, SLOT(toggleProjections()));
+    connect(m_widgetActions, SIGNAL(resetView()), this, SLOT(onResetView()));
+    connect(m_widgetActions, SIGNAL(savePlot()), this, SLOT(savePlot()));
+
+}
+
+
+void ObsoleteIntensityDataWidget::setItem(SessionItem *item)
+{
+    JobItem *jobItem = dynamic_cast<JobItem *>(item);
+    Q_ASSERT(jobItem);
+    m_currentItem = jobItem->intensityDataItem();
+    setIntensityData(jobItem->intensityDataItem());
+}
+
+void ObsoleteIntensityDataWidget::setIntensityData(IntensityDataItem *intensityItem)
+{
+    m_plotWidget->setItem(intensityItem);
+    m_propertyWidget->setItem(intensityItem);
+}
+
+QList<QAction *> ObsoleteIntensityDataWidget::actionList()
+{
+    return m_widgetActions->actionList();
+}
+
+void ObsoleteIntensityDataWidget::togglePropertyPanel()
+{
+    if(m_currentItem) {
+        bool current_flag = m_currentItem->getItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG).toBool();
+        m_currentItem->setItemValue(IntensityDataItem::P_PROPERTY_PANEL_FLAG, !current_flag);
+    }
+}
+
+void ObsoleteIntensityDataWidget::toggleProjections()
+{
+    if(!m_currentItem)
+        return;
+
+    bool current_flag = m_currentItem->getItemValue(IntensityDataItem::P_PROJECTIONS_FLAG).toBool();
+    m_currentItem->setItemValue(IntensityDataItem::P_PROJECTIONS_FLAG, !current_flag);
+
+}
+
+void ObsoleteIntensityDataWidget::onResetView()
+{
+    if(!m_currentItem)
+        return;
+
+    m_currentItem->resetView();
+}
+
+void ObsoleteIntensityDataWidget::savePlot()
+{
+    QString dirname = AppSvc::projectManager()->userExportDir();
+    m_plotWidget->savePlot(dirname);
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.h b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.h
new file mode 100644
index 0000000..b055902
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidget.h
+//! @brief     Defines class ObsoleteIntensityDataWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OBSOLETEINTENSITYDATAWIDGET_H
+#define OBSOLETEINTENSITYDATAWIDGET_H
+
+#include "SessionItemWidget.h"
+
+class IntensityDataItem;
+class ObsoleteIntensityDataWidgetActions;
+class ObsoleteIntensityDataPlotWidget;
+class IntensityDataPropertyWidget;
+
+//! The widget presents IntensityData color map and property editor.
+//! Belongs to the stack handled by JobOutputDataWidget
+class BA_CORE_API_ ObsoleteIntensityDataWidget : public SessionItemWidget
+{
+    Q_OBJECT
+public:
+    explicit ObsoleteIntensityDataWidget(QWidget *parent = 0);
+
+    void setItem(class SessionItem *item);
+    void setIntensityData(IntensityDataItem *intensityItem);
+
+    QSize sizeHint() const { return QSize(500, 400); }
+    QSize minimumSizeHint() const { return QSize(128, 128); }
+
+    QList<QAction *> actionList();
+
+signals:
+    void savePlotRequest();
+
+public slots:
+    void onResetView();
+    void togglePropertyPanel();
+    void savePlot();
+    void toggleProjections();
+
+private:
+    ObsoleteIntensityDataWidgetActions *m_widgetActions;
+    ObsoleteIntensityDataPlotWidget *m_plotWidget;
+    IntensityDataPropertyWidget *m_propertyWidget;
+    IntensityDataItem *m_currentItem;
+};
+
+#endif // OBSOLETEINTENSITYDATAWIDGET_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.cpp b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.cpp
new file mode 100644
index 0000000..3158e4b
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.cpp
+//! @brief     Implements class ObsoleteIntensityDataWidgetActions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ObsoleteIntensityDataWidgetActions.h"
+#include <QAction>
+
+ObsoleteIntensityDataWidgetActions::ObsoleteIntensityDataWidgetActions(QObject *parent)
+    : QObject(parent)
+    , m_toggleProjectionsAction(0)
+    , m_togglePropertyPanelAction(0)
+    , m_resetViewAction(0)
+    , m_savePlotAction(0)
+
+{
+    // projections button
+    m_toggleProjectionsAction = new QAction(this);
+    m_toggleProjectionsAction->setText("Projections");
+    m_toggleProjectionsAction->setIcon(QIcon(":/images/toolbar16light_projections.svg"));
+    m_toggleProjectionsAction->setToolTip("Toggle Projections, Ctrl+P");
+    m_toggleProjectionsAction->setShortcut(Qt::CTRL + Qt::Key_P);
+    connect(m_toggleProjectionsAction, SIGNAL(triggered()), this, SIGNAL(toggleProjections()));
+
+    // plot properties button
+    m_togglePropertyPanelAction = new QAction(this);
+    m_togglePropertyPanelAction->setText("Plot Properties");
+    m_togglePropertyPanelAction->setIcon(QIcon(":/images/toolbar16light_propertypanel.svg"));
+    m_togglePropertyPanelAction->setToolTip("Toggle Property Panel");
+    connect(m_togglePropertyPanelAction, SIGNAL(triggered()), this, SIGNAL(togglePropertyPanel()));
+
+    // reset view button
+    m_resetViewAction = new QAction(this);
+    m_resetViewAction->setText("Reset View");
+    m_resetViewAction->setIcon(QIcon(":/images/toolbar16light_refresh.svg"));
+    m_resetViewAction->setToolTip("Reset View");
+    connect(m_resetViewAction, SIGNAL(triggered()), this, SIGNAL(resetView()));
+
+    // save plot button
+    m_savePlotAction = new QAction(this);
+    m_savePlotAction->setText("Save Plot");
+    m_savePlotAction->setIcon(QIcon(":/images/toolbar16light_save.svg"));
+    m_savePlotAction->setToolTip("Save Plot");
+    connect(m_savePlotAction, SIGNAL(triggered()), this, SIGNAL(savePlot()));
+}
+
+QList<QAction *> ObsoleteIntensityDataWidgetActions::actionList()
+{
+    return QList<QAction *>() << m_resetViewAction << m_toggleProjectionsAction
+                              << m_togglePropertyPanelAction << m_savePlotAction;
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.h b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.h
new file mode 100644
index 0000000..b73fcbc
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/ObsoleteIntensityDataWidgetActions.h
+//! @brief     Defines class ObsoleteIntensityDataWidgetActions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OBSOLETEINTENSITYDATAWIDGETACTIONS_H
+#define OBSOLETEINTENSITYDATAWIDGETACTIONS_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class QAction;
+
+//! The IntensityDataWidgetActions class holds all actions related to IntensityDataWidget
+
+class BA_CORE_API_ ObsoleteIntensityDataWidgetActions : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit ObsoleteIntensityDataWidgetActions(QObject *parent);
+
+    QList<QAction *> actionList();
+
+signals:
+    void togglePropertyPanel();
+    void toggleProjections();
+    void resetView();
+    void savePlot();
+
+private:
+    QAction *m_toggleProjectionsAction;
+    QAction *m_togglePropertyPanelAction;
+    QAction *m_resetViewAction;
+    QAction *m_savePlotAction;
+};
+
+#endif // OBSOLETEINTENSITYDATAWIDGETACTIONS_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.cpp b/GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.cpp
new file mode 100644
index 0000000..55390f6
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.cpp
@@ -0,0 +1,160 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.cpp
+//! @brief     Implements class SavePlotAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SavePlotAssistant.h"
+#include "ColorMapPlot.h"
+#include "IntensityDataIOFactory.h"
+#include "IntensityDataItem.h"
+#include <QDebug>
+#include <QFileDialog>
+#include <QMessageBox>
+
+namespace {
+const QString png_extension = ".png";
+const QString jpg_extension = ".jpg";
+const QString pdf_extension = ".pdf";
+const QString int_extension = ".int";
+const QString tif_extension = ".tif";
+const QString txt_extension = ".txt";
+
+QVector<SavePlotAssistant::Format> initializeFormats() {
+    QVector<SavePlotAssistant::Format> result;
+    result.push_back(SavePlotAssistant::Format(png_extension, "*.png"));
+    result.push_back(SavePlotAssistant::Format(jpg_extension, "*.jpg"));
+    result.push_back(SavePlotAssistant::Format(pdf_extension, "*.pdf"));
+    result.push_back(SavePlotAssistant::Format(int_extension, "BornAgain ASCII format (*.int)"));
+    result.push_back(SavePlotAssistant::Format(txt_extension, "Simple ASCII table (*.txt)"));
+#ifdef BORNAGAIN_TIFF_SUPPORT
+    result.push_back(SavePlotAssistant::Format(tif_extension, "32-bits TIFF files (*.tif)"));
+#endif
+    return result;
+}
+
+}
+
+QVector<SavePlotAssistant::Format> SavePlotAssistant::m_formats = initializeFormats();
+
+SavePlotAssistant::Format::Format(const QString &file_extention, const QString &filter)
+    : m_file_extention(file_extention)
+    , m_filter(filter)
+{
+
+}
+
+void SavePlotAssistant::savePlot(const QString &dirname, QCustomPlot *plot,
+                                 IntensityDataItem *item)
+
+{
+    QString selectedFilter("*.png");
+    QString defaultName = dirname + QString("/untitled");
+    QString fileName =QFileDialog::getSaveFileName(0, "Save Plot", defaultName,
+        getFilterString(), &selectedFilter);
+
+    QString nameToSave = composeFileName(fileName, selectedFilter);
+
+    if(!nameToSave.isEmpty()) {
+        try {
+            saveToFile(nameToSave, plot, item);
+        } catch(const std::exception &ex) {
+            QString message = "Attempt to save file with the name '";
+            message.append(nameToSave);
+            message.append("' has failed with following error message\n\n");
+            message.append(QString::fromStdString(ex.what()));
+            QMessageBox::warning(0, "Houston, we have a problem.", message);
+        }
+    }
+
+}
+
+void SavePlotAssistant::saveToFile(const QString &fileName, QCustomPlot *plot, IntensityDataItem *item)
+{
+    if(isPngFile(fileName)) {
+        plot->savePng(fileName);
+    }
+
+    else if(isJpgFile(fileName)) {
+        plot->saveJpg(fileName);
+    }
+
+    else if(isPdfFile(fileName)) {
+        plot->savePdf(fileName, true, plot->width(), plot->height());
+    }
+
+    else {
+        IntensityDataIOFactory::writeOutputData(*item->getOutputData(),
+                                                fileName.toStdString());
+    }
+}
+
+//! Returns string contraining all defined filters in the format suitable for QFileDialog
+QString SavePlotAssistant::getFilterString() const
+{
+    QString result;
+    for(int i=0; i<m_formats.size(); ++i) {
+        result.append(m_formats[i].m_filter);
+        if(i!=m_formats.size()-1) result.append(";;");
+    }
+    return result;
+}
+
+//! Compose file name to save plot from information provided by QFileDialog
+QString SavePlotAssistant::composeFileName(const QString &fileName, const QString &filterName) const
+{
+    QString result;
+    if (!fileName.isEmpty() && !filterName.isEmpty()) {
+        if(isValidExtension(fileName)) {
+            result = fileName;
+        } else {
+            result = fileName + getExtensionFromFilterName(filterName);
+        }
+    }
+    return result;
+}
+
+bool SavePlotAssistant::isValidExtension(const QString &fileName) const
+{
+    for(int i=0; i<m_formats.size(); ++i) {
+        if(fileName.endsWith(m_formats[i].m_file_extention, Qt::CaseInsensitive)) {
+            return true;
+        }
+    }
+    return false;
+}
+
+QString SavePlotAssistant::getExtensionFromFilterName(const QString &filterName) const
+{
+    for(int i=0; i<m_formats.size(); ++i) {
+        if(m_formats[i].m_filter == filterName) {
+            return m_formats[i].m_file_extention;
+        }
+    }
+    return QString();
+}
+
+bool SavePlotAssistant::isPngFile(const QString &fileName) const
+{
+    return fileName.endsWith(png_extension, Qt::CaseInsensitive);
+}
+
+bool SavePlotAssistant::isJpgFile(const QString &fileName) const
+{
+    return fileName.endsWith(jpg_extension, Qt::CaseInsensitive);
+}
+
+bool SavePlotAssistant::isPdfFile(const QString &fileName) const
+{
+    return fileName.endsWith(pdf_extension, Qt::CaseInsensitive);
+}
diff --git a/GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.h b/GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.h
new file mode 100644
index 0000000..5e07979
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/SavePlotAssistant.h
+//! @brief     Defines class SavePlotAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAVEPLOTASSISTANT_H
+#define SAVEPLOTASSISTANT_H
+
+#include "WinDllMacros.h"
+#include <QString>
+#include <QVector>
+
+class QCustomPlot;
+class IntensityDataItem;
+
+//! Assistant class which contains all logic for saving IntensityData to various formats
+//! from IntensityDataPlotWidget.
+
+class BA_CORE_API_ SavePlotAssistant
+{
+public:
+    class Format {
+    public:
+        Format(){}
+        Format(const QString &file_extention, const QString &filter);
+        QString m_file_extention;
+        QString m_filter;
+    };
+
+    void savePlot(const QString &dirname, QCustomPlot *plot, IntensityDataItem *item);
+
+private:
+    void saveToFile(const QString &dirname, QCustomPlot *plot, IntensityDataItem *item);
+    QString getFilterString() const;
+    QString composeFileName(const QString &fileName, const QString &filterName) const;
+    bool isValidExtension(const QString &fileName) const;
+    QString getExtensionFromFilterName(const QString &filterName) const;
+    bool isPngFile(const QString &fileName) const;
+    bool isJpgFile(const QString &fileName) const;
+    bool isPdfFile(const QString &fileName) const;
+    static QVector<Format> m_formats;
+};
+
+
+#endif // SAVEPLOTASSISTANT_H
diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
new file mode 100644
index 0000000..c7ac750
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
@@ -0,0 +1,201 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
+//! @brief     Implements class VerticalSlicePlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "VerticalSlicePlot.h"
+#include "AxesItems.h"
+#include "IntensityDataItem.h"
+#include "MathConstants.h"
+#include "qcustomplot.h"
+#include <QVBoxLayout>
+
+VerticalSlicePlot::VerticalSlicePlot(QWidget *parent)
+    : QWidget(parent)
+    , m_customPlot(0)
+    , m_bars(0)
+    , m_item(0)
+//    , m_mapper(0)
+{
+    m_customPlot = new QCustomPlot();
+    m_bars = new QCPBars(m_customPlot->yAxis, m_customPlot->xAxis);
+    m_customPlot->addPlottable(m_bars);
+
+    QVBoxLayout *vlayout = new QVBoxLayout(this);
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+    vlayout->addWidget(m_customPlot);
+    setLayout(vlayout);
+
+}
+
+void VerticalSlicePlot::setItem(IntensityDataItem *item)
+{
+    if (m_item == item) {
+        return;
+
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if (!m_item) return;
+
+        plotItem(m_item);
+
+        m_item->mapper()->setOnChildPropertyChange(
+                    [this](SessionItem* item, const QString name)
+        {
+            if (item->parent() && item->parent()->modelType() == Constants::GroupItemType)
+                onSubItemPropertyChanged(item->itemName(), name);
+        }, this);
+    }
+
+}
+
+void VerticalSlicePlot::plotData(const QVector<double> &x, const QVector<double> &y)
+{
+    //qDebug() << "NHistogramPlot::plotData(const QVector<double> &x, const QVector<double> &y)";
+    m_bars->setData(x, y);
+    m_customPlot->replot();
+}
+
+void VerticalSlicePlot::onSubItemPropertyChanged(const QString &property_group, const QString &property_name)
+{
+    qDebug() << "HorizontalSlicePlot::onSubItemPropertyChanged(const QString &property_name)" << property_group << property_name;
+    if(property_group == IntensityDataItem::P_XAXIS) {
+        if(property_name == BasicAxisItem::P_MIN) {
+            setXmin(m_item->getLowerX());
+        }
+        else if(property_name == BasicAxisItem::P_MAX) {
+            setXmax(m_item->getUpperX());
+        }
+    }
+    else if(property_group == IntensityDataItem::P_YAXIS) {
+        if(property_name == BasicAxisItem::P_MIN) {
+            setYmin(m_item->getLowerY());
+        }
+        else if(property_name == BasicAxisItem::P_MAX) {
+            setYmax(m_item->getUpperY());
+        }
+    }
+    else if(property_group == IntensityDataItem::P_ZAXIS) {
+        if(property_name == BasicAxisItem::P_MIN) {
+            setZmin(m_item->getLowerZ());
+        }
+        else if(property_name == BasicAxisItem::P_MAX) {
+            setZmax(m_item->getUpperZ());
+        }
+        else if(property_name == AmplitudeAxisItem::P_IS_LOGSCALE) {
+            setLogz(m_item->isLogz(), true);
+        }
+    }
+}
+
+
+void VerticalSlicePlot::plotItem(IntensityDataItem *intensityItem)
+{
+    //qDebug() << "NHistogramPlot::plotItem(NIntensityDataItem *intensityItem)";
+    Q_ASSERT(intensityItem);
+
+    const OutputData<double> *data = intensityItem->getOutputData();
+    if(!data) return;
+
+    if(data->getRank() != 2) {
+        throw Exceptions::NullPointerException("NHistogramPlot::plotItem::Draw() -> Error. Zero pointer to the data to draw");
+    }
+
+    m_customPlot->axisRect()->setupFullAxesBox(true);
+
+    m_customPlot->xAxis->setRange(intensityItem->getLowerZ(), intensityItem->getUpperZ());
+    m_customPlot->yAxis->setRange(intensityItem->getLowerY(), intensityItem->getUpperY());
+
+    const IAxis &axis = data->getAxis(1);
+    double bin_size(0);
+//    if(intensityItem->axesInRadians()) {
+        bin_size = (axis.getMax() - axis.getMin())/axis.size();
+//    } else {
+//        bin_size = (Units::rad2deg(axis->getMax()) - Units::rad2deg((axis->getMin())))/axis.size();
+//    }
+
+    m_bars->setWidth(bin_size);
+    m_bars->setPen(Qt::NoPen);
+    m_bars->setBrush(Qt::blue);
+
+    setLogz(intensityItem->isLogz());
+
+    const QMargins margins(0,0,0,0);
+    m_customPlot->axisRect()->setMargins(margins);
+    m_customPlot->axisRect()->layout()->setMargins(margins);
+
+    m_customPlot->replot();
+}
+
+
+void VerticalSlicePlot::setLogz(bool logz, bool isReplot)
+{
+    if(logz) {
+        m_customPlot->xAxis->setScaleType(QCPAxis::stLogarithmic);
+        m_customPlot->xAxis->setNumberFormat("eb");
+        m_customPlot->xAxis->setNumberPrecision(0);
+    } else {
+        m_customPlot->xAxis->setScaleType(QCPAxis::stLinear);
+        m_customPlot->xAxis->setNumberFormat("f");
+    }
+
+    if(isReplot) m_customPlot->replot();
+}
+
+void VerticalSlicePlot::setXmin(double value)
+{
+    Q_UNUSED(value);
+}
+
+void VerticalSlicePlot::setXmax(double value)
+{
+    Q_UNUSED(value);
+}
+
+void VerticalSlicePlot::setYmin(double value)
+{
+    QCPRange range = m_customPlot->yAxis->range();
+    range.lower = value;
+    m_customPlot->yAxis->setRange(range);
+    m_customPlot->replot();
+}
+
+void VerticalSlicePlot::setYmax(double value)
+{
+    QCPRange range = m_customPlot->yAxis->range();
+    range.upper = value;
+    m_customPlot->yAxis->setRange(range);
+    m_customPlot->replot();
+}
+
+void VerticalSlicePlot::setZmin(double value)
+{
+    QCPRange range = m_customPlot->xAxis->range();
+    range.lower = value;
+    m_customPlot->xAxis->setRange(range);
+    m_customPlot->replot();
+}
+
+void VerticalSlicePlot::setZmax(double value)
+{
+    QCPRange range = m_customPlot->xAxis->range();
+    range.upper = value;
+    m_customPlot->xAxis->setRange(range);
+    m_customPlot->replot();
+}
+
diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h
new file mode 100644
index 0000000..7d1bf7a
--- /dev/null
+++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.h
+//! @brief     Defines class VerticalSlicePlot
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef VERTICALSLICEPLOT_H
+#define VERTICALSLICEPLOT_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class IntensityDataItem;
+class QCustomPlot;
+class QCPBars;
+
+//! Slice of 2D IntensityData along x-axis
+class BA_CORE_API_ VerticalSlicePlot : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit VerticalSlicePlot(QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(128, 128); }
+    QSize minimumSizeHint() const { return QSize(64, 64); }
+
+    void setItem(IntensityDataItem *item);
+
+public slots:
+    void plotData(const QVector<double> &x, const QVector<double> &y);
+
+private slots:
+//    void onPropertyChanged(const QString &property_name);
+    void onSubItemPropertyChanged(const QString &property_group, const QString &property_name);
+
+private:
+    void plotItem(IntensityDataItem *intensityItem);
+    void setLogz(bool logz, bool isReplot = false);
+    void setXmin(double value);
+    void setXmax(double value);
+    void setYmin(double value);
+    void setYmax(double value);
+    void setZmin(double value);
+    void setZmax(double value);
+
+    QCustomPlot *m_customPlot;
+    QCPBars *m_bars;
+    IntensityDataItem *m_item;
+};
+
+
+
+
+#endif // VERTICALSLICEPLOT_H
diff --git a/GUI/coregui/Views/JobView.cpp b/GUI/coregui/Views/JobView.cpp
new file mode 100644
index 0000000..cbb4165
--- /dev/null
+++ b/GUI/coregui/Views/JobView.cpp
@@ -0,0 +1,153 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobView.cpp
+//! @brief     Implements class JobView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobView.h"
+#include "JobActivityStatusBar.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "JobOutputDataWidget.h"
+#include "JobProgressAssistant.h"
+#include "JobSelectorWidget.h"
+#include "JobViewDocks.h"
+#include "mainwindow.h"
+#include <QMenu>
+
+JobView::JobView(MainWindow *mainWindow)
+    : m_docks(new JobViewDocks(this))
+    , m_jobActivityStatusBar(new JobActivityStatusBar(mainWindow))
+    , m_progressAssistant(new JobProgressAssistant(mainWindow))
+    , m_currentItem(0)
+    , m_mainWindow(mainWindow)
+{
+    setObjectName("JobView");
+    m_docks->initViews(mainWindow->jobModel());
+
+    connectSignals();
+}
+
+void JobView::onFocusRequest(JobItem *jobItem)
+{
+    if(jobItem->runInBackground())
+        return;
+
+    setAppropriateActivityForJob(jobItem);
+    m_docks->jobSelector()->makeJobItemSelected(jobItem);
+
+    emit focusRequest(MainWindow::JOB);
+}
+
+//! Sets docks visibility in accordance with required activity.
+
+void JobView::setActivity(int activity)
+{
+    m_docks->setActivity(activity);
+    emit activityChanged(activity);
+}
+
+//! Creates global dock menu at cursor position.
+
+void JobView::onDockMenuRequest()
+{
+    QMenu *menu = createPopupMenu();
+    menu->exec(QCursor::pos());
+    delete menu;
+}
+
+//! Propagates change in JobItem's selection down into main widgets.
+
+void JobView::onSelectionChanged(JobItem *jobItem)
+{
+    m_docks->setItem(jobItem);
+}
+
+void JobView::showEvent(QShowEvent *)
+{
+    if(isVisible())
+        m_jobActivityStatusBar->show();
+}
+
+void JobView::hideEvent(QHideEvent *)
+{
+    if(isHidden())
+        m_jobActivityStatusBar->hide();
+}
+
+
+void JobView::connectSignals()
+{    
+    connectActivityRelated();
+    connectLayoutRelated();
+    connectJobRelated();
+}
+
+//! Connects signal related to activity change.
+
+void JobView::connectActivityRelated()
+{
+    // Change activity requests: JobActivityStatusBar -> this
+    connect(m_jobActivityStatusBar, SIGNAL(changeActivityRequest(int)),
+            this, SLOT(setActivity(int)));
+
+    // Activity was changed: this -> JobActivityStatusBar
+    connect(this, SIGNAL(activityChanged(int)),
+            m_jobActivityStatusBar, SLOT(onActivityChanged(int)));
+
+    // Activity was changed: this -> JobOutputDataWidget
+    connect(this, SIGNAL(activityChanged(int)),
+            m_docks->jobOutputDataWidget(), SLOT(onActivityChanged(int)));
+
+}
+
+//! Connects signals related to dock layout.
+
+void JobView::connectLayoutRelated()
+{
+    connect(this, SIGNAL(resetLayout()), m_docks, SLOT(onResetLayout()));
+
+    // Toggling of JobSelector request: JobActivityStatusBar -> this
+    connect(m_jobActivityStatusBar, SIGNAL(toggleJobSelectorRequest()),
+            m_docks, SLOT(onToggleJobSelector()));
+
+    // Dock menu request: JobActivityStatusBar -> this
+    connect(m_jobActivityStatusBar, SIGNAL(dockMenuRequest()),
+            this, SLOT(onDockMenuRequest()));
+}
+
+//! Connects signals related to JobItem
+
+void JobView::connectJobRelated()
+{
+    // Focus request: JobModel -> this
+    connect(m_mainWindow->jobModel(), SIGNAL(focusRequest(JobItem *)),
+            this, SLOT(onFocusRequest(JobItem *)));
+
+    // JobItem selection: JobSelectorWidget -> this
+    connect(m_docks->jobSelector(), SIGNAL(selectionChanged(JobItem*)),
+            this, SLOT(onSelectionChanged(JobItem*)));
+
+}
+
+//! Sets appropriate activity for new JobItem
+
+void JobView::setAppropriateActivityForJob(JobItem *jobItem)
+{
+    if(m_docks->jobSelector()->currentJobItem() != jobItem) {
+        if(jobItem->isValidForFitting())
+            setActivity(JobViewFlags::FITTING_ACTIVITY);
+//        else
+//            setActivity(JobViewFlags::JOB_VIEW_ACTIVITY);
+    }
+}
diff --git a/GUI/coregui/Views/JobView.h b/GUI/coregui/Views/JobView.h
new file mode 100644
index 0000000..5625263
--- /dev/null
+++ b/GUI/coregui/Views/JobView.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobView.h
+//! @brief     Defines class JobView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBVIEW_H
+#define JOBVIEW_H
+
+#include "WinDllMacros.h"
+#include "fancymainwindow.h"
+
+class MainWindow;
+class JobViewDocks;
+class JobActivityStatusBar;
+class JobProgressAssistant;
+class JobItem;
+
+//! The JobView class is a main view to show list of jobs, job results and widgets for real time
+//! and fitting activities.
+
+class BA_CORE_API_ JobView : public Manhattan::FancyMainWindow
+{
+    Q_OBJECT
+
+public:
+    JobView(MainWindow *mainWindow);
+
+signals:
+    void focusRequest(int);
+    void activityChanged(int activity);
+
+public slots:
+    void onFocusRequest(JobItem *jobItem);
+    void setActivity(int activity);
+    void onDockMenuRequest();
+    void onSelectionChanged(JobItem *jobItem);
+
+protected:
+    virtual void showEvent(QShowEvent *);
+    virtual void hideEvent(QHideEvent *);
+
+private:
+    void connectSignals();
+    void connectActivityRelated();
+    void connectLayoutRelated();
+    void connectJobRelated();
+
+    void setAppropriateActivityForJob(JobItem *jobItem);
+
+    JobViewDocks *m_docks;
+    JobActivityStatusBar *m_jobActivityStatusBar;
+    JobProgressAssistant *m_progressAssistant;
+    JobItem *m_currentItem;
+    MainWindow *m_mainWindow;
+};
+
+#endif // JOBVIEW_H
diff --git a/GUI/coregui/Views/JobWidgets/JobActivityStatusBar.cpp b/GUI/coregui/Views/JobWidgets/JobActivityStatusBar.cpp
new file mode 100644
index 0000000..76247c6
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobActivityStatusBar.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobActivityStatusBar.cpp
+//! @brief     Implements class JobActivityStatusBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobActivityStatusBar.h"
+#include "JobViewActivities.h"
+#include "mainwindow.h"
+#include <QComboBox>
+#include <QHBoxLayout>
+#include <QStatusBar>
+#include <QToolButton>
+
+JobActivityStatusBar::JobActivityStatusBar(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_toggleJobListButton(0)
+    , m_activityCombo(0)
+    , m_dockMenuButton(0)
+    , m_mainWindow(mainWindow)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);    
+
+    QHBoxLayout *layout = new QHBoxLayout;
+    layout->setSpacing(0);
+    layout->setMargin(0);
+
+    m_toggleJobListButton = new QToolButton;
+    m_toggleJobListButton->setText("Job List");
+    m_toggleJobListButton->setIcon(QIcon(":/images/statusbar_joblist.svg"));
+    m_toggleJobListButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    m_toggleJobListButton->setToolTip("Toggle job list view");
+    connect(m_toggleJobListButton, SIGNAL(clicked()), this, SIGNAL(toggleJobSelectorRequest()));
+
+    m_activityCombo = new QComboBox();
+    m_activityCombo->setToolTip("Main Activity Selector");
+    m_activityCombo->addItems(JobViewActivities::activityList());
+    connect(m_activityCombo, SIGNAL(currentIndexChanged(int)),
+            this, SIGNAL(changeActivityRequest(int)));
+
+    m_dockMenuButton = new QToolButton;
+    m_dockMenuButton->setIcon(QIcon(":/images/statusbar_dockmenu.svg"));
+    m_dockMenuButton->setToolTip("Docks layout menu");
+    connect(m_dockMenuButton, SIGNAL(clicked()), this, SIGNAL(dockMenuRequest()));
+
+    layout->addWidget(m_toggleJobListButton);
+    layout->addStretch();
+    layout->addWidget(m_activityCombo);
+    layout->addWidget(m_dockMenuButton);
+
+    setLayout(layout);
+    initAppearance();
+}
+
+void JobActivityStatusBar::onActivityChanged(int activity)
+{
+    disconnect(m_activityCombo, SIGNAL(currentIndexChanged(int)),
+            this, SIGNAL(changeActivityRequest(int)));
+
+    m_activityCombo->setCurrentIndex(activity);
+
+    connect(m_activityCombo, SIGNAL(currentIndexChanged(int)),
+            this, SIGNAL(changeActivityRequest(int)));
+}
+
+//! Init appearance of MainWindow's statusBar.
+
+void JobActivityStatusBar::initAppearance()
+{
+    Q_ASSERT(m_mainWindow);
+    m_mainWindow->statusBar()->addWidget(this, 1);
+    m_mainWindow->statusBar()->setSizeGripEnabled(false);
+    this->hide();
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobActivityStatusBar.h b/GUI/coregui/Views/JobWidgets/JobActivityStatusBar.h
new file mode 100644
index 0000000..ccae238
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobActivityStatusBar.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobActivityStatusBar.h
+//! @brief     Defines class JobActivityStatusBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBACTIVITYSTATUSBAR_H
+#define JOBACTIVITYSTATUSBAR_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class MainWindow;
+class QToolButton;
+class QComboBox;
+
+//! The JobActivityStatusBar class is a narrow status bar at very bottom of JobView to switch
+//! between activities. Added to the status bar of MainWindow when JobView is shown.
+
+class BA_CORE_API_ JobActivityStatusBar : public QWidget
+{
+    Q_OBJECT
+public:
+    JobActivityStatusBar(MainWindow *mainWindow = 0);
+
+signals:
+    void toggleJobSelectorRequest();
+    void changeActivityRequest(int);
+    void dockMenuRequest();
+
+public slots:
+    void onActivityChanged(int activity);
+
+private:    
+    void initAppearance();
+
+    QToolButton *m_toggleJobListButton;
+    QComboBox *m_activityCombo;
+    QToolButton *m_dockMenuButton;
+    MainWindow *m_mainWindow;
+};
+
+#endif // JOBACTIVITYSTATUSBAR_H
diff --git a/GUI/coregui/Views/JobWidgets/JobListViewDelegate.cpp b/GUI/coregui/Views/JobWidgets/JobListViewDelegate.cpp
new file mode 100644
index 0000000..f74249b
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobListViewDelegate.cpp
@@ -0,0 +1,174 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobListViewDelegate.cpp
+//! @brief     Implements class JobListViewDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobListViewDelegate.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "hostosinfo.h"
+#include "progressbar.h"
+#include <QApplication>
+#include <QDebug>
+#include <QMouseEvent>
+#include <QPaintDevice>
+#include <QPainter>
+#include <QStyleOptionProgressBarV2>
+#include <QWidget>
+
+JobListViewDelegate::JobListViewDelegate(QWidget *parent)
+    : QItemDelegate(parent)
+{
+    m_buttonState =  QStyle::State_Enabled;
+    m_status_to_color[Constants::STATUS_IDLE] = QColor(255, 286, 12);
+    m_status_to_color[Constants::STATUS_RUNNING] = QColor(5, 150, 230);
+    m_status_to_color[Constants::STATUS_COMPLETED] = QColor(5, 150, 230);
+    m_status_to_color[Constants::STATUS_CANCELED] = QColor(186, 0, 0);
+    m_status_to_color[Constants::STATUS_FAILED] = QColor(255, 186, 12);
+}
+
+void JobListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
+                  const QModelIndex &index ) const
+{
+    if (option.state & QStyle::State_Selected)
+        painter->fillRect(option.rect, option.palette.highlight());
+
+    const JobModel* model = static_cast<const JobModel*>(index.model());
+    Q_ASSERT(model);
+
+    const JobItem *item = model->getJobItemForIndex(index);
+    Q_ASSERT(item);
+
+    painter->save();
+
+    painter->setRenderHint(QPainter::Antialiasing, true);
+
+    QString text = item->itemName();
+    QRect textRect = getTextRect(option.rect);
+    painter->drawText(textRect,text);
+
+    drawCustomProjectBar(item, painter, option);
+
+    if(item->isRunning()) {
+        QStyleOptionButton button;
+        button.rect = getButtonRect(option.rect);
+        button.state = m_buttonState | QStyle::State_Enabled;
+        button.icon = QIcon(":/images/darkclosebutton.png");
+        button.iconSize = QSize(12,12);
+
+        QApplication::style()->drawControl (QStyle::CE_PushButton, &button, painter);
+    }
+
+    painter->restore();
+}
+
+bool JobListViewDelegate::editorEvent(QEvent *event,
+    QAbstractItemModel *model,
+    const QStyleOptionViewItem &option,
+    const QModelIndex &index)
+{
+    if( event->type() == QEvent::MouseButtonPress ||
+        event->type() == QEvent::MouseButtonRelease ) {
+    } else {
+        m_buttonState = QStyle::State_Raised;
+        return QItemDelegate::editorEvent(event, model, option, index);
+    }
+
+    const JobModel* jqmodel = static_cast<const JobModel*>(index.model());
+    Q_ASSERT(model);
+
+    const JobItem *item = jqmodel->getJobItemForIndex(index);
+    Q_ASSERT(item);
+
+    if(!item->isRunning()) return false;
+
+    QRect buttonRect = getButtonRect(option.rect);
+
+    QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
+    if( !buttonRect.contains( mouseEvent->pos()) ) {
+        m_buttonState = QStyle::State_Raised;
+        return false; // so that selection can change
+    }
+
+    if( event->type() == QEvent::MouseButtonPress) {
+        m_buttonState = QStyle::State_Sunken;
+    } else if( event->type() == QEvent::MouseButtonRelease) {
+        m_buttonState = QStyle::State_Raised;
+        qDebug("JobListViewDelegate::editorEvent() -> cancel clicked");
+        emit cancelButtonClicked( index);
+    }
+    return true;
+}
+
+void JobListViewDelegate::drawCustomProjectBar(const JobItem *item, QPainter *painter, const QStyleOptionViewItem &option) const
+{
+    int progress = item->getProgress();
+    QRect rect = getProgressBarRect(option.rect);
+
+    painter->save();
+    painter->setRenderHint(QPainter::Antialiasing);
+    painter->setBrush(QColor(204, 223, 230));
+    painter->setPen(QColor("transparent"));
+    QRect rect2(rect.x(), rect.y(), rect.width(),
+                rect.height());
+    painter->drawRoundedRect(rect2, 2, 2);
+    painter->restore();
+
+    int progBarWidth = float((rect.width() * progress) / 100);
+    painter->save();
+    painter->setRenderHint(QPainter::Antialiasing);
+    painter->setPen(QColor("transparent"));
+    painter->setBrush(m_status_to_color[item->getStatus()]);
+    QRect rect5(rect.x(), rect.y(), progBarWidth,
+                    rect.height());
+    painter->drawRoundedRect(rect5, 2, 2);
+    painter->restore();
+}
+
+//! returns rectangle for text
+QRect JobListViewDelegate::getTextRect(QRect optionRect) const
+{
+    int width = optionRect.width()*0.4;
+    int height = optionRect.height();
+    int x = optionRect.x() + 3;
+    int y = optionRect.y();
+    QRect result(x,y,width,height);
+    return result;
+}
+
+//! returns rectangle for progress bar
+QRect JobListViewDelegate::getProgressBarRect(QRect optionRect) const
+{
+    int width = optionRect.width()*0.4;
+    int height = optionRect.height()*0.6;
+    int x = optionRect.x() + optionRect.width()*0.5;
+    int y = optionRect.y() + (optionRect.height() - height)/2.;
+    QRect result(x,y,width,height);
+    return result;
+}
+
+//! returns rectangle for button
+QRect JobListViewDelegate::getButtonRect(QRect optionRect) const
+{
+    int height = 10;
+    int width = 10;
+    int x = optionRect.x() + optionRect.width()*0.92;
+    int y = optionRect.y() + (optionRect.height() - height)/2.;
+    QRect result(x,y,width,height);
+    return result;
+}
+
+
+
+
diff --git a/GUI/coregui/Views/JobWidgets/JobListViewDelegate.h b/GUI/coregui/Views/JobWidgets/JobListViewDelegate.h
new file mode 100644
index 0000000..5db4390
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobListViewDelegate.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobListViewDelegate.h
+//! @brief     Defines class JobListViewDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBLISTVIEWDELEGATE_H
+#define JOBLISTVIEWDELEGATE_H
+
+#include "WinDllMacros.h"
+#include <QItemDelegate>
+#include <QMap>
+#include <QRect>
+
+class JobItem;
+
+//! ViewDelegate to show progress bar JobQueuListView
+class BA_CORE_API_ JobListViewDelegate : public QItemDelegate
+{
+    Q_OBJECT
+public:
+    JobListViewDelegate(QWidget *parent);
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+                      const QModelIndex &index ) const;
+
+    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option,
+        const QModelIndex &index);
+
+signals:
+    void cancelButtonClicked(const QModelIndex &index);
+
+private:
+    QStyle::State  m_buttonState;
+    void drawCustomProjectBar(const JobItem *item, QPainter *painter, const QStyleOptionViewItem &option) const;
+
+    QRect getTextRect(QRect optionRect) const;
+    QRect getProgressBarRect(QRect optionRect) const;
+    QRect getButtonRect(QRect optionRect) const;
+
+    QMap<QString, QColor> m_status_to_color;
+};
+
+#endif // JOBLISTVIEWDELEGATE_H
diff --git a/GUI/coregui/Views/JobWidgets/JobListWidget.cpp b/GUI/coregui/Views/JobWidgets/JobListWidget.cpp
new file mode 100644
index 0000000..01b78c6
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobListWidget.cpp
@@ -0,0 +1,217 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobListWidget.cpp
+//! @brief     Implements class JobListWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobListWidget.h"
+#include "ItemSelectorWidget.h"
+#include "JobItem.h"
+#include "JobListViewDelegate.h"
+#include "JobModel.h"
+#include <QItemSelectionModel>
+#include <QListView>
+#include <QVBoxLayout>
+
+
+JobListWidget::JobListWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_listViewDelegate(new JobListViewDelegate(this))
+    , m_listView(new ItemSelectorWidget(this))
+    , m_jobModel(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    m_listView->listView()->setItemDelegate(m_listViewDelegate);
+    m_listView->listView()->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    QVBoxLayout *vlayout = new QVBoxLayout;
+    vlayout->setMargin(10);
+    vlayout->setSpacing(10);
+
+    vlayout->addWidget(m_listView);
+    mainLayout->addLayout(vlayout);
+
+    setLayout(mainLayout);
+
+    connect(m_listView, SIGNAL(contextMenuRequest(const QPoint &, const QModelIndex &)),
+            this, SIGNAL(contextMenuRequest(const QPoint &, const QModelIndex &)));
+
+    connect(m_listView, SIGNAL(selectionChanged(SessionItem*)),
+            this, SLOT(onItemSelectionChanged(SessionItem*)));
+
+}
+
+void JobListWidget::setModel(JobModel *model)
+{
+    Q_ASSERT(model);
+    if(model != m_jobModel) {
+        m_jobModel = model;
+        m_listView->setModel(model);
+
+        connect(m_listViewDelegate, SIGNAL(cancelButtonClicked(QModelIndex)),
+        m_jobModel, SLOT(cancelJob(QModelIndex)), Qt::UniqueConnection);
+    }
+}
+
+QItemSelectionModel *JobListWidget::selectionModel()
+{
+    return m_listView->selectionModel();
+}
+
+//! Returns currently selected JobItem
+
+const JobItem *JobListWidget::currentJobItem() const
+{
+    QModelIndexList selected = m_listView->selectionModel()->selectedIndexes();
+    if(selected.size() == 1)
+        return m_jobModel->getJobItemForIndex(selected.at(0));
+    return nullptr;
+}
+
+
+//! setup context menu for listView
+//void JobListWidget::setupContextMenuActions()
+//{
+//    m_signalMapper = new QSignalMapper(this);
+//    connect(m_signalMapper, SIGNAL(mapped(int)),
+//            this, SLOT(equalizeSelectedToJob(int)));
+
+//    m_removeJobAction = new QAction("Remove Job", this);
+//    connect(m_removeJobAction, SIGNAL(triggered()), this, SLOT(removeJob()));
+
+//    m_runJobAction = new QAction("Run Job", this);
+//    connect(m_runJobAction, SIGNAL(triggered()), this, SLOT(runJob()));
+//}
+
+//! Equalize colormap plots (xmin, xmax; ymin, ymax; zmin, zmax) of all selected jobs to
+//! the  plot of requested jobItem. selected_id corresponds to the certain position
+//! in the list of selected items, as reported by context menu of QListView.
+//void JobListWidget::equalizeSelectedToJob(int selected_id)
+//{
+//    QModelIndexList selectedList = m_listView->selectionModel()->selectedIndexes();
+
+//    if(selected_id >= selectedList.size() ) return;
+
+//    JobItem *referenceItem = m_jobModel->getJobItemForIndex(selectedList.at(selected_id));
+//    Q_ASSERT(referenceItem);
+
+//    IntensityDataItem *referenceDataItem = referenceItem->getIntensityDataItem();
+//    if(!referenceDataItem) return;
+
+//    foreach(QModelIndex index, selectedList) {
+//        JobItem *jobItem = m_jobModel->getJobItemForIndex(index);
+//        if(jobItem == referenceItem) continue;
+
+//        if(IntensityDataItem *dataItem = jobItem->getIntensityDataItem()) {
+//            dataItem->setLowerX(referenceDataItem->getLowerX());
+//            dataItem->setUpperX(referenceDataItem->getUpperX());
+//            dataItem->setLowerY(referenceDataItem->getLowerY());
+//            dataItem->setUpperY(referenceDataItem->getUpperY());
+//            dataItem->setLowerZ(referenceDataItem->getLowerZ());
+//            dataItem->setUpperZ(referenceDataItem->getUpperZ());
+//        }
+//    }
+//}
+
+//void JobListWidget::makeJobItemSelected(const QModelIndex &index)
+//{
+//    QModelIndexList selected = m_listView->selectionModel()->selectedIndexes();
+
+//    // already selected
+//    if(selected.size() == 1 && selected.at(0) == index)
+//        return;
+
+//    m_listView->selectionModel()->clearSelection();
+//    m_listView->selectionModel()->select(index, QItemSelectionModel::Select);
+//}
+
+void JobListWidget::makeJobItemSelected(JobItem *jobItem)
+{
+    Q_ASSERT(jobItem);
+    QModelIndexList selected = m_listView->selectionModel()->selectedIndexes();
+
+    // Already selected, but we still will emit the signal to notify widgets.
+    // To handle the case, when the job was selected before it completed (and some stack widgets
+    // were refusing to show the content for non-complete job).
+    if(selected.size() == 1 && selected.at(0) == jobItem->index()) {
+        emit selectionChanged(jobItem);
+        return;
+    }
+
+    m_listView->selectionModel()->clearSelection();
+    m_listView->selectionModel()->select(jobItem->index(), QItemSelectionModel::Select);
+}
+
+//! Recieves SeesionItem from ItemSelectorWidget and emits it further as JobItem.
+//! Null item means the absence of selection.
+
+void JobListWidget::onItemSelectionChanged(SessionItem *item)
+{
+    JobItem *jobItem(0);
+    if(item) {
+        jobItem = dynamic_cast<JobItem *>(item);
+        Q_ASSERT(jobItem);
+    }
+    emit selectionChanged(jobItem);
+}
+
+//void JobListWidget::showContextMenu(const QPoint &pnt)
+//{
+//    QMenu menu;
+//    menu.addAction(m_runJobAction);
+//    menu.addAction(m_removeJobAction);
+
+//    QModelIndex item_index = m_listView->indexAt(pnt);
+
+//    if(item_index.isValid()) {
+//        if(jobItemCanBeRun(item_index)) {
+//            m_runJobAction->setDisabled(false);
+//        } else {
+//            m_runJobAction->setDisabled(true);
+//        }
+//        if(jobItemCanBeRemoved(item_index)) {
+//            m_removeJobAction->setDisabled(false);
+//        } else {
+//            m_removeJobAction->setDisabled(true);
+//        }
+//    } else {
+//        m_runJobAction->setDisabled(true);
+//        m_removeJobAction->setDisabled(true);
+//    }
+
+//    // menu for equalization of selected plots
+//    menu.addSeparator();
+
+//    QMenu menu_equalize("Equalize selected plots");
+//    menu_equalize.setToolTip("All plots from the list of selected jobs will be equalized to this one.");
+
+//    QModelIndexList selected = m_listView->selectionModel()->selectedIndexes();
+//    if(selected.size() <= 1)
+//        menu_equalize.setDisabled(true);
+
+//    for(int i =0; i<selected.count(); ++i) {
+//        JobItem *jobItem = m_jobModel->getJobItemForIndex(selected.at(i));
+//        QAction *action = new QAction(QString("to ").append(jobItem->itemName()), this);
+//        connect(action, SIGNAL(triggered()), m_signalMapper, SLOT(map()));
+//        m_signalMapper->setMapping(action, i);
+//        menu_equalize.addAction(action);
+//    }
+
+//    menu.addMenu(&menu_equalize);
+//    menu.exec(m_listView->mapToGlobal(pnt));
+//}
diff --git a/GUI/coregui/Views/JobWidgets/JobListWidget.h b/GUI/coregui/Views/JobWidgets/JobListWidget.h
new file mode 100644
index 0000000..84c51d3
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobListWidget.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobListWidget.h
+//! @brief     Defines class JobListWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBLISTWIDGET_H
+#define JOBLISTWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QModelIndexList>
+#include <QWidget>
+
+class JobModel;
+class JobListViewDelegate;
+class QItemSelectionModel;
+class ItemSelectorWidget;
+class QModelIndex;
+class JobItem;
+class SessionItem;
+
+//! The JobListWidget class contains list view to select job items.
+
+class BA_CORE_API_ JobListWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit JobListWidget(QWidget *parent = 0);
+
+    void setModel(JobModel *model);
+
+//    QSize sizeHint() const { return QSize(64, 768); }
+//    QSize minimumSizeHint() const { return QSize(64, 64); }
+
+    QItemSelectionModel *selectionModel();
+
+    const JobItem *currentJobItem() const;
+
+signals:
+    void contextMenuRequest(const QPoint &point, const QModelIndex &index);
+    void selectionChanged(JobItem *);
+
+public slots:
+    void makeJobItemSelected(JobItem *jobItem);
+
+private slots:
+    void onItemSelectionChanged(SessionItem *item);
+
+private:
+    JobListViewDelegate *m_listViewDelegate;
+    ItemSelectorWidget *m_listView;
+    JobModel *m_jobModel;
+};
+
+#endif // JOBLISTWIDGET_H
diff --git a/GUI/coregui/Views/JobWidgets/JobMessagePanel.cpp b/GUI/coregui/Views/JobWidgets/JobMessagePanel.cpp
new file mode 100644
index 0000000..f9db9a4
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobMessagePanel.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobMessagePanel.cpp
+//! @brief     Implements class JobMessagePanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobMessagePanel.h"
+#include "mainwindow_constants.h"
+#include <QScrollBar>
+#include <QStackedWidget>
+#include <QTextEdit>
+#include <QVBoxLayout>
+
+JobMessagePanel::JobMessagePanel(QWidget *parent)
+    : InfoPanel(parent)
+    , m_plainLog(new QTextEdit)
+{
+    setWindowTitle(Constants::JobMessagePanelName);
+
+    m_plainLog->setReadOnly(true);
+//    m_plainLog->setMaximumBlockCount(100000);
+    QFont f("unexistent");
+    f.setStyleHint(QFont::Monospace);
+    m_plainLog->setFont(f);
+
+    m_stackedWidget->addWidget(m_plainLog);
+
+
+    setContentVisible(false);
+}
+
+void JobMessagePanel::onClearLog()
+{
+    m_plainLog->clear();
+}
+
+void JobMessagePanel::onMessage(const QString &message, const QColor &color)
+{
+    QScrollBar *scrollbar = m_plainLog->verticalScrollBar();
+    bool autoscroll = scrollbar->value() == scrollbar->maximum();
+//    m_plainLog->appendPlainText(message);
+    m_plainLog->setTextColor(color);
+    m_plainLog->append(message);
+    if (autoscroll) {
+        QTextCursor c = m_plainLog->textCursor();
+        c.movePosition(QTextCursor::End);
+        m_plainLog->setTextCursor(c);
+    }
+
+}
+
+
diff --git a/GUI/coregui/Views/JobWidgets/JobMessagePanel.h b/GUI/coregui/Views/JobWidgets/JobMessagePanel.h
new file mode 100644
index 0000000..d7aabec
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobMessagePanel.h
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobMessagePanel.h
+//! @brief     Defines class JobMessagePanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBMESSAGEPANEL_H
+#define JOBMESSAGEPANEL_H
+
+#include "InfoPanel.h"
+#include <QColor>
+
+class QTextEdit;
+
+//! The JobMessagePanel class shows log messages from FitActivityPanel at the
+//! bottom part of JobView.
+
+class BA_CORE_API_ JobMessagePanel : public InfoPanel
+{
+    Q_OBJECT
+public:
+    JobMessagePanel(QWidget *parent = 0);
+
+public slots:
+    void onClearLog();
+    void onMessage(const QString &message, const QColor &color = QColor(Qt::black));
+
+private:
+    QTextEdit *m_plainLog;
+};
+
+#endif // JOBMESSAGEPANEL_H
diff --git a/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp
new file mode 100644
index 0000000..4df1052
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobOutputDataWidget.cpp
+//! @brief     Implements class JobOutputDataWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobOutputDataWidget.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "JobResultsPresenter.h"
+#include "JobViewFlags.h"
+#include "ObsoleteIntensityDataWidget.h"
+#include "mainwindow_constants.h"
+#include <QVBoxLayout>
+
+JobOutputDataWidget::JobOutputDataWidget(JobModel *jobModel, QWidget *parent)
+    : QWidget(parent)
+    , m_stackedWidget(new ItemStackPresenter<JobResultsPresenter>)
+{
+    setWindowTitle(QLatin1String("Job OutputData"));
+
+    setMinimumSize(400, 400);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    mainLayout->addWidget(m_stackedWidget);
+
+    m_stackedWidget->setMinimumSize(600, 600);
+    m_stackedWidget->setModel(jobModel);
+
+    setLayout(mainLayout);
+}
+
+void JobOutputDataWidget::setItem(JobItem * jobItem)
+{
+    if(!isValidJobItem(jobItem)) {
+        m_stackedWidget->hideWidgets();
+        return;
+    }
+
+    bool isNew(false);
+    m_stackedWidget->setItem(jobItem, isNew);
+
+    if(isNew) {
+        JobResultsPresenter *widget = m_stackedWidget->currentWidget();
+        Q_ASSERT(widget);
+        widget->setItem(jobItem);
+        if(jobItem->isValidForFitting())
+            widget->setPresentation(Constants::FitComparisonWidgetName);
+
+    }
+}
+
+void JobOutputDataWidget::onActivityChanged(int activity)
+{
+    if(auto widget = m_stackedWidget->currentWidget()) {
+        if(activity == JobViewFlags::FITTING_ACTIVITY) {
+            widget->setPresentation(Constants::FitComparisonWidgetName);
+        } else if(activity == JobViewFlags::REAL_TIME_ACTIVITY) {
+            widget->setPresentation(Constants::IntensityDataWidgetName);
+        } else if(activity == JobViewFlags::JOB_VIEW_ACTIVITY) {
+            widget->setPresentation(Constants::IntensityDataWidgetName);
+        }
+    }
+}
+
+bool JobOutputDataWidget::isValidJobItem(JobItem *item)
+{
+    if(!item) return false;
+    if(item->isCompleted() || item->isCanceled() || item->isFailed()) return true;
+    return false;
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.h b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.h
new file mode 100644
index 0000000..221e77b
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobOutputDataWidget.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobOutputDataWidget.h
+//! @brief     Defines class JobOutputDataWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBOUTPUTDATAWIDGET_H
+#define JOBOUTPUTDATAWIDGET_H
+
+#include "ItemStackPresenter.h"
+#include <QMap>
+
+class ObsoleteIntensityDataWidget;
+class JobResultsPresenter;
+class JobModel;
+class JobItem;
+
+//! The JobOutputDataWidget class is a central widget of JobView, shows results of the simulation.
+
+class BA_CORE_API_ JobOutputDataWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    JobOutputDataWidget(JobModel *jobModel, QWidget *parent = 0);
+
+public slots:
+    void setItem(JobItem *jobItem);
+    void onActivityChanged(int);
+
+protected:
+    virtual bool isValidJobItem(JobItem *item);
+
+private:
+    ItemStackPresenter<JobResultsPresenter> *m_stackedWidget;
+};
+
+#endif // JOBOUTPUTDATAWIDGET_H
diff --git a/GUI/coregui/Views/JobWidgets/JobProgressAssistant.cpp b/GUI/coregui/Views/JobWidgets/JobProgressAssistant.cpp
new file mode 100644
index 0000000..1e667bc
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobProgressAssistant.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobProgressAssistant.cpp
+//! @brief     Implements class JobProgressAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobProgressAssistant.h"
+#include "JobModel.h"
+#include "JobQueueData.h"
+#include "mainwindow.h"
+#include "progressbar.h"
+
+JobProgressAssistant::JobProgressAssistant(MainWindow *mainWindow)
+    : QObject(mainWindow)
+    , m_mainWindow(mainWindow)
+{
+    connect(m_mainWindow->jobModel(), SIGNAL(globalProgress(int)),
+            this, SLOT(onGlobalProgress(int)));
+
+    connect(m_mainWindow->progressBar(), SIGNAL(clicked()),
+            m_mainWindow->jobModel(), SLOT(onCancelAllJobs()));
+}
+
+void JobProgressAssistant::onGlobalProgress(int progress)
+{
+    Q_ASSERT(m_mainWindow->progressBar());
+    if(progress<0 || progress >= 100) {
+        m_mainWindow->progressBar()->setFinished(true);
+        m_mainWindow->progressBar()->hide();
+    } else {
+        m_mainWindow->progressBar()->show();
+        m_mainWindow->progressBar()->setFinished(false);
+        m_mainWindow->progressBar()->setValue(progress);
+    }
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobProgressAssistant.h b/GUI/coregui/Views/JobWidgets/JobProgressAssistant.h
new file mode 100644
index 0000000..561327d
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobProgressAssistant.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobProgressAssistant.h
+//! @brief     Defines class JobProgressAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBPROGRESSASSISTANT_H
+#define JOBPROGRESSASSISTANT_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class MainWindow;
+
+//! The JobProgressAssistant class helps JobView to visualize current progress.
+
+class BA_CORE_API_ JobProgressAssistant : public QObject
+{
+    Q_OBJECT
+public:
+    JobProgressAssistant(MainWindow *mainWindow);
+
+private slots:
+    void onGlobalProgress(int progress);
+
+private:
+    MainWindow *m_mainWindow;
+};
+
+#endif // JOBPROGRESSASSISTANT_H
diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp
new file mode 100644
index 0000000..db0faa9
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp
@@ -0,0 +1,99 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobPropertiesWidget.cpp
+//! @brief     Implements class JobPropertiesWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobPropertiesWidget.h"
+#include "ComponentEditor.h"
+#include "JobItem.h"
+#include "mainwindow_constants.h"
+#include <QTabBar>
+#include <QTabWidget>
+#include <QTextEdit>
+#include <QVBoxLayout>
+
+JobPropertiesWidget::JobPropertiesWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_currentItem(0)
+    , m_tabWidget(new QTabWidget)
+    , m_propertyEditor(new ComponentEditor)
+    , m_commentsEditor(new QTextEdit)
+    , m_block_update(false)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    setWindowTitle(Constants::JobPropertiesWidgetName);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    mainLayout->setContentsMargins(0,0,0,0);
+
+    m_tabWidget->setTabPosition(QTabWidget::South);
+    m_tabWidget->insertTab(JOB_PROPERTIES, m_propertyEditor, "Job Properties");
+    m_tabWidget->insertTab(JOB_COMMENTS, m_commentsEditor, "Details");
+
+    mainLayout->addWidget(m_tabWidget);
+    setLayout(mainLayout);
+
+    connect(m_commentsEditor, SIGNAL(textChanged()), this, SLOT(onTextChanged()));
+}
+
+void JobPropertiesWidget::setItem(JobItem *jobItem)
+{
+    m_propertyEditor->setItem(jobItem);
+
+    if (m_currentItem == jobItem) {
+        return;
+
+    } else {
+        if(m_currentItem)
+            m_currentItem->mapper()->unsubscribe(this);
+
+        m_currentItem = jobItem;
+        if (!m_currentItem) return;
+
+        updateItem(m_currentItem);
+
+        m_currentItem->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            if(name == JobItem::P_COMMENTS) {
+                updateItem(m_currentItem);
+            }
+        }, this);
+    }
+}
+
+void JobPropertiesWidget::onTextChanged()
+{
+    m_block_update = true;
+    Q_ASSERT(m_currentItem);
+
+    m_currentItem->setComments(m_commentsEditor->toPlainText());
+    m_block_update = false;
+}
+
+void JobPropertiesWidget::updateItem(JobItem *jobItem)
+{
+    if(m_block_update) return;
+
+    if(jobItem) {
+        if(jobItem->getStatus() == Constants::STATUS_FAILED) {
+            m_tabWidget->tabBar()->setTabTextColor(JOB_COMMENTS, Qt::red);
+        } else {
+            m_tabWidget->tabBar()->setTabTextColor(JOB_COMMENTS, Qt::black);
+        }
+        m_commentsEditor->setText(jobItem->getComments());
+    }
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h
new file mode 100644
index 0000000..6682c2d
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobPropertiesWidget.h
+//! @brief     Defines class JobPropertiesWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBPROPERTIESWIDGET_H
+#define JOBPROPERTIESWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class JobItem;
+class QTextEdit;
+class QTabWidget;
+class ComponentEditor;
+
+//! The JobPropertiesWidget class holds component editor for JobItem. Part of JobSelectorWidget,
+//! resides at lower left corner of JobView.
+
+class BA_CORE_API_ JobPropertiesWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    enum ETabId { JOB_PROPERTIES, JOB_COMMENTS };
+    explicit JobPropertiesWidget(QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(64, 256); }
+    QSize minimumSizeHint() const { return QSize(64, 64); }
+
+public slots:
+    void setItem(JobItem *item);
+
+private slots:
+    void onTextChanged();
+
+private:
+    void updateItem(JobItem *item);
+
+    JobItem *m_currentItem;
+    QTabWidget *m_tabWidget;
+    ComponentEditor *m_propertyEditor;
+    QTextEdit *m_commentsEditor;
+    bool m_block_update;
+};
+
+#endif // JOBPROPERTIESWIDGET_H
diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.cpp b/GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.cpp
new file mode 100644
index 0000000..ad63aeb
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.cpp
+//! @brief     Implements class JobRealTimeToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobRealTimeToolBar.h"
+#include <QToolButton>
+
+//! main tool bar on top of SampleView window
+JobRealTimeToolBar::JobRealTimeToolBar(QWidget *parent)
+    : StyledToolBar(parent)
+    , m_resetParametersButton(0)
+{
+    m_resetParametersButton = new QToolButton;
+    m_resetParametersButton->setText("Reset Values");
+    m_resetParametersButton->setIcon(QIcon(":/images/toolbar16light_refresh.svg"));
+    m_resetParametersButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    m_resetParametersButton->setToolTip("Reset parameter tree to initial values");
+    connect(m_resetParametersButton, SIGNAL(clicked()), this, SIGNAL(resetParameters()));
+    addWidget(m_resetParametersButton);
+}
+
diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.h b/GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.h
new file mode 100644
index 0000000..cb7801d
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobRealTimeToolBar.h
+//! @brief     Defines class JobRealTimeToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBREALTIMETOOLBAR_H
+#define JOBREALTIMETOOLBAR_H
+
+#include "StyledToolBar.h"
+
+//! The JobRealTimeToolBar class represents a toolbar with buttons for JobRealTimeWidget.
+
+class BA_CORE_API_ JobRealTimeToolBar : public StyledToolBar
+{
+    Q_OBJECT
+
+public:
+    explicit JobRealTimeToolBar(QWidget *parent = 0);
+
+signals:
+    void resetParameters();
+
+private:
+    class QToolButton *m_resetParametersButton;
+};
+
+#endif // JOBREALTIMETOOLBAR_H
+
diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp
new file mode 100644
index 0000000..62e6dcb
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp
@@ -0,0 +1,96 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp
+//! @brief     Implements class JobRealTimeWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobRealTimeWidget.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "JobRealTimeToolBar.h"
+#include "ParameterTuningWidget.h"
+#include "mainwindow_constants.h"
+#include <QVBoxLayout>
+
+JobRealTimeWidget::JobRealTimeWidget(JobModel *jobModel, QWidget *parent)
+    : QWidget(parent)
+    , m_toolBar(new JobRealTimeToolBar)
+    , m_stackedWidget(new ItemStackPresenter<ParameterTuningWidget>)
+{
+    setWindowTitle(Constants::JobRealTimeWidgetName);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    mainLayout->addWidget(m_toolBar);
+    mainLayout->addWidget(m_stackedWidget);
+
+    setLayout(mainLayout);
+
+    m_stackedWidget->setModel(jobModel);
+    connect(m_toolBar, SIGNAL(resetParameters()), this, SLOT(onResetParameters()));
+}
+
+ParameterTuningWidget *JobRealTimeWidget::parameterTuningWidget(JobItem *jobItem)
+{
+    return m_stackedWidget->itemWidget(jobItem);
+}
+
+QSize JobRealTimeWidget::sizeHint() const
+{
+    return QSize(Constants::REALTIME_WIDGET_WIDTH_HINT, 480);
+}
+
+QSize JobRealTimeWidget::minimumSizeHint() const
+{
+    return QSize(100, 100);
+}
+
+void JobRealTimeWidget::setItem(JobItem * jobItem)
+{
+    if(!isValidJobItem(jobItem)) {
+        m_stackedWidget->hideWidgets();
+        return;
+    }
+
+    bool isNew(false);
+    m_stackedWidget->setItem(jobItem, isNew);
+
+    if(isNew) {
+        ParameterTuningWidget *widget = m_stackedWidget->currentWidget();
+        Q_ASSERT(widget);
+        widget->setItem(jobItem);
+    }
+}
+
+void JobRealTimeWidget::onResetParameters()
+{
+    if(auto widget = currentParameterTuningWidget())
+        widget->restoreModelsOfCurrentJobItem();
+}
+
+ParameterTuningWidget *JobRealTimeWidget::currentParameterTuningWidget()
+{
+    return m_stackedWidget->currentWidget();
+}
+
+//! Returns true if JobItem is valid for real time simulation.
+
+bool JobRealTimeWidget::isValidJobItem(JobItem *item)
+{
+    if(!item) return false;
+    if(item->isCompleted() || item->isCanceled() || item->isFailed()) return true;
+    return false;
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h
new file mode 100644
index 0000000..788d393
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h
+//! @brief     Defines class JobRealTimeWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBREALTIMEWIDGET_H
+#define JOBREALTIMEWIDGET_H
+
+#include "ItemStackPresenter.h"
+
+class JobModel;
+class JobItem;
+class ParameterTuningWidget;
+
+//! The JobRealTimeWidget class provides tuning of sample parameters in real time.
+//! Located on the right side of JobView and is visible when realtime activity is selected.
+
+class BA_CORE_API_ JobRealTimeWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    JobRealTimeWidget(JobModel *jobModel, QWidget *parent = 0);
+
+    ParameterTuningWidget *parameterTuningWidget(JobItem *jobItem);
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+public slots:
+    void setItem(JobItem *jobItem);
+    void onResetParameters();
+
+private:
+    ParameterTuningWidget *currentParameterTuningWidget();
+    bool isValidJobItem(JobItem *item);
+
+    class JobRealTimeToolBar *m_toolBar;
+    ItemStackPresenter<ParameterTuningWidget> *m_stackedWidget;
+};
+
+#endif // JOBREALTIMEWIDGET_H
diff --git a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp
new file mode 100644
index 0000000..ee173a0
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobResultsPresenter.cpp
+//! @brief     Implements class JobResultsPresenter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobResultsPresenter.h"
+#include "FitComparisonWidget.h"
+#include "JobItem.h"
+#include "ObsoleteIntensityDataWidget.h"
+#include "mainwindow_constants.h"
+#include <QBoxLayout>
+
+JobResultsPresenter::JobResultsPresenter(QWidget *parent)
+    : ItemComboWidget(parent)
+{
+    registerWidget(Constants::IntensityDataWidgetName, create_new<ObsoleteIntensityDataWidget>);
+    registerWidget(Constants::FitComparisonWidgetName, create_new<FitComparisonWidget>);
+}
+
+//! Returns list of presentation types, available for given item. JobItem with fitting abilities
+//! is valid for IntensityDataWidget and FitComparisonWidget.
+
+QStringList JobResultsPresenter::getValidPresentationList(SessionItem *item)
+{
+    JobItem *jobItem = dynamic_cast<JobItem *>(item);
+    Q_ASSERT(jobItem);
+
+    QStringList result = QStringList() << Constants::IntensityDataWidgetName;
+    if(jobItem->isValidForFitting())
+        result << Constants::FitComparisonWidgetName;
+
+    return result;
+}
+
diff --git a/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h
new file mode 100644
index 0000000..21f932a
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobResultsPresenter.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobResultsPresenter.h
+//! @brief     Defines class JobResultsPresenter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBRESULTSPRESENTER_H
+#define JOBRESULTSPRESENTER_H
+
+#include "ItemComboWidget.h"
+
+//! The JobResultsPresenter class is a widget which is able to present results of job (JobItem)
+//! using stack of different widgets and combo box in the right top corner of JobView, to switch
+//! between widgets.
+
+//! For example, for JobItem with fitting abilities, it is possible to switch between
+//! ColorMap plot and FitDataWidget.
+
+class BA_CORE_API_ JobResultsPresenter : public ItemComboWidget
+{
+    Q_OBJECT
+
+public:
+    explicit JobResultsPresenter(QWidget *parent = 0);
+
+protected:
+    virtual QStringList getValidPresentationList(SessionItem *item);
+
+};
+
+#endif // JOBRESULTSPRESENTER_H
diff --git a/GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp b/GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp
new file mode 100644
index 0000000..230d291
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp
@@ -0,0 +1,133 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobSelectorActions.cpp
+//! @brief     Implements class JobSelectorActions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobSelectorActions.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "StyledToolBar.h"
+#include <QAction>
+#include <QDebug>
+#include <QItemSelectionModel>
+#include <QMenu>
+
+JobSelectorActions::JobSelectorActions(JobModel *jobModel, QObject *parent)
+    : QObject(parent)
+    , m_runJobAction(0)
+    , m_removeJobAction(0)
+    , m_selectionModel(0)
+    , m_jobModel(jobModel)
+{
+    m_runJobAction = new QAction(QStringLiteral("Run"), this);
+    m_runJobAction->setIcon(QIcon(":/images/toolbar16light_run.svg"));
+    m_runJobAction->setToolTip("Run currently selected job");
+    connect(m_runJobAction, SIGNAL(triggered()), this, SLOT(onRunJob()));
+
+    // plot properties button
+    m_removeJobAction = new QAction(QStringLiteral("Remove"), this);
+    m_removeJobAction->setIcon(QIcon(":/images/toolbar16light_recycle.svg"));
+    m_removeJobAction->setToolTip("Remove currently selected job.");
+    connect(m_removeJobAction, SIGNAL(triggered()), this, SLOT(onRemoveJob()));
+}
+
+void JobSelectorActions::setSelectionModel(QItemSelectionModel *selectionModel)
+{
+    m_selectionModel = selectionModel;
+}
+
+//! Adds local actions to the external toolbar
+
+void JobSelectorActions::setToolBar(StyledToolBar *toolBar)
+{
+    toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    toolBar->addAction(m_runJobAction);
+    toolBar->addAction(m_removeJobAction);
+}
+
+void JobSelectorActions::onRunJob()
+{
+    QModelIndexList indexList = m_selectionModel->selectedIndexes();
+    foreach(QModelIndex index, indexList) {
+        if(canRunJob(index))
+            m_jobModel->runJob(index);
+    }
+}
+
+void JobSelectorActions::onRemoveJob()
+{
+    qDebug() << "JobSelectorActions::onRemoveJob()";
+    Q_ASSERT(m_selectionModel);
+    QModelIndexList indexList = m_selectionModel->selectedIndexes();
+
+    while(indexList.size()) {
+        if(canRemoveJob(indexList.first())) {
+            m_jobModel->removeJob(indexList.first());
+            indexList = m_selectionModel->selectedIndexes();
+        }
+    }
+
+}
+
+//! Generates context menu at given point. If indexAtPoint is provided, the actions will be done
+//! for corresponding JobItem
+
+void JobSelectorActions::onContextMenuRequest(const QPoint &point, const QModelIndex &indexAtPoint)
+{
+    QMenu menu;
+    initItemContextMenu(menu, indexAtPoint);
+    menu.exec(point);
+    setAllActionsEnabled(true);
+}
+
+void JobSelectorActions::initItemContextMenu(QMenu &menu, const QModelIndex &indexAtPoint)
+{
+    menu.addAction(m_runJobAction);
+    menu.addAction(m_removeJobAction);
+
+    QModelIndex targetIndex = indexAtPoint;
+    if(!targetIndex.isValid()) {
+        QModelIndexList indexList = m_selectionModel->selectedIndexes();
+        if(indexList.size())
+            targetIndex = indexList.first();
+    }
+
+    m_runJobAction->setEnabled(canRunJob(targetIndex));
+    m_removeJobAction->setEnabled(canRemoveJob(targetIndex));
+}
+
+void JobSelectorActions::setAllActionsEnabled(bool value)
+{
+    m_runJobAction->setEnabled(value);
+    m_removeJobAction->setEnabled(value);
+}
+
+bool JobSelectorActions::canRunJob(const QModelIndex &index) const
+{
+    if(!index.isValid()) return false;
+
+    const JobItem *jobItem = m_jobModel->getJobItemForIndex(index);
+    if(jobItem->isRunning()) return false;
+    return true;
+}
+
+bool JobSelectorActions::canRemoveJob(const QModelIndex &index) const
+{
+    if(!index.isValid()) return false;
+
+    const JobItem *jobItem = m_jobModel->getJobItemForIndex(index);
+    if(jobItem->isRunning()) return false;
+
+    return true;
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobSelectorActions.h b/GUI/coregui/Views/JobWidgets/JobSelectorActions.h
new file mode 100644
index 0000000..6227e5c
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobSelectorActions.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobSelectorActions.h
+//! @brief     Defines class JobSelectorActions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBSELECTORACTIONS_H
+#define JOBSELECTORACTIONS_H
+
+#include "WinDllMacros.h"
+#include <QModelIndex>
+#include <QObject>
+
+class QAction;
+class JobModel;
+class QItemSelectionModel;
+class QModelIndex;
+
+//! The JobSelectorActions class contains actions to run/remove jobs. Actions are used by the
+//! toolbar and JobSelectorList's context menu.
+
+class BA_CORE_API_ JobSelectorActions : public QObject {
+    Q_OBJECT
+public:
+    JobSelectorActions(JobModel *jobModel, QObject *parent = 0);
+
+    void setSelectionModel(QItemSelectionModel *selectionModel);
+    void setToolBar(class StyledToolBar *toolBar);
+
+public slots:
+    void onRunJob();
+    void onRemoveJob();
+    void onContextMenuRequest(const QPoint &point, const QModelIndex &indexAtPoint = QModelIndex());
+
+private:
+    void initItemContextMenu(class QMenu &menu, const QModelIndex &indexAtPoint);
+    void setAllActionsEnabled(bool value);
+    bool canRunJob(const QModelIndex &index) const;
+    bool canRemoveJob(const QModelIndex &index) const;
+
+    QAction *m_runJobAction;
+    QAction *m_removeJobAction;
+    //QSignalMapper *m_signalMapper;
+    QItemSelectionModel *m_selectionModel;
+    JobModel *m_jobModel;
+};
+
+#endif // JOBSELECTORACTIONS_H
+
diff --git a/GUI/coregui/Views/JobWidgets/JobSelectorWidget.cpp b/GUI/coregui/Views/JobWidgets/JobSelectorWidget.cpp
new file mode 100644
index 0000000..bf11ca3
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobSelectorWidget.cpp
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobSelectorWidget.cpp
+//! @brief     Implements class JobSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobSelectorWidget.h"
+#include "JobItem.h"
+#include "JobListWidget.h"
+#include "JobModel.h"
+#include "JobPropertiesWidget.h"
+#include "JobSelectorActions.h"
+#include "StyledToolBar.h"
+#include "mainwindow_constants.h"
+#include "minisplitter.h"
+#include <QHBoxLayout>
+
+
+JobSelectorWidget::JobSelectorWidget(JobModel *jobModel, QWidget *parent)
+    : QWidget(parent)
+    , m_splitter(new Manhattan::MiniSplitter)
+    , m_toolBar(new StyledToolBar)
+    , m_jobSelectorActions(new JobSelectorActions(jobModel, this))
+    , m_jobListWidget(new JobListWidget)
+    , m_jobProperties(new JobPropertiesWidget)
+    , m_jobModel(0)
+{
+    setModel(jobModel);
+
+    setMinimumSize(128, 600);
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+    setWindowTitle(Constants::JobSelectorWidgetName);
+
+    m_splitter->setOrientation(Qt::Vertical);
+    m_splitter->addWidget(m_toolBar);
+    m_splitter->addWidget(m_jobListWidget);
+    m_splitter->addWidget(m_jobProperties);
+    m_splitter->setChildrenCollapsible(true);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->addWidget(m_splitter);
+    setLayout(mainLayout);
+
+    m_jobSelectorActions->setSelectionModel(m_jobListWidget->selectionModel());
+    m_jobSelectorActions->setToolBar(m_toolBar);
+
+    connect(m_jobListWidget, SIGNAL(contextMenuRequest(const QPoint &, const QModelIndex &)),
+            m_jobSelectorActions, SLOT(onContextMenuRequest(const QPoint &, const QModelIndex &)));
+    connect(m_jobListWidget, SIGNAL(selectionChanged(JobItem*)),
+            this, SLOT(onSelectionChanged(JobItem*)));
+}
+
+void JobSelectorWidget::setModel(JobModel *jobModel)
+{
+    m_jobModel = jobModel;
+    m_jobListWidget->setModel(m_jobModel);
+}
+
+const JobItem *JobSelectorWidget::currentJobItem() const
+{
+    return m_jobListWidget->currentJobItem();
+}
+
+void JobSelectorWidget::makeJobItemSelected(JobItem *item)
+{
+    Q_ASSERT(item);
+//    QModelIndex index = m_jobModel->indexOfItem(item);
+//    Q_ASSERT(index.isValid());
+    m_jobListWidget->makeJobItemSelected(item);
+}
+
+void JobSelectorWidget::onSelectionChanged(JobItem *jobItem)
+{
+    m_jobProperties->setItem(jobItem);
+    emit selectionChanged(jobItem);
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobSelectorWidget.h b/GUI/coregui/Views/JobWidgets/JobSelectorWidget.h
new file mode 100644
index 0000000..767a420
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobSelectorWidget.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobSelectorWidget.h
+//! @brief     Defines class JobSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBSELECTORWIDGET_H
+#define JOBSELECTORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class JobModel;
+class JobItem;
+class StyledToolBar;
+class JobSelectorActions;
+class JobListWidget;
+class JobPropertiesWidget;
+
+namespace Manhattan {
+    class MiniSplitter;
+}
+
+//! The JobSelectorWidget class represents left panel of JobView. Contains a tree to select jobs
+//! on the top and job property editor at the bottom.
+
+class BA_CORE_API_ JobSelectorWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit JobSelectorWidget(JobModel *jobModel, QWidget *parent = 0);
+
+    void setModel(JobModel *jobModel);
+
+    QSize sizeHint() const { return QSize(210, 600); }
+    QSize minimumSizeHint() const { return QSize(64, 300); }
+
+    const JobItem *currentJobItem() const;
+
+signals:
+    void selectionChanged(JobItem *);
+
+public slots:
+    void makeJobItemSelected(JobItem *);
+
+private slots:
+    void onSelectionChanged(JobItem *jobItem);
+
+private:
+    Manhattan::MiniSplitter *m_splitter;
+    StyledToolBar *m_toolBar;
+    JobSelectorActions *m_jobSelectorActions;
+    JobListWidget *m_jobListWidget;
+    JobPropertiesWidget *m_jobProperties;
+    JobModel *m_jobModel;
+};
+
+#endif // JOBSELECTORWIDGET_H
diff --git a/GUI/coregui/Views/JobWidgets/JobViewActivities.cpp b/GUI/coregui/Views/JobWidgets/JobViewActivities.cpp
new file mode 100644
index 0000000..7836d7d
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobViewActivities.cpp
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobViewActivities.cpp
+//! @brief     Implements class JobViewActivities
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobViewActivities.h"
+#include "GUIHelpers.h"
+#include "mainwindow_constants.h"
+
+namespace {
+JobViewActivities::activity_map_t createActivityMap()
+{
+    JobViewActivities::activity_map_t result;
+    result[JobViewFlags::JOB_VIEW_ACTIVITY] = QVector<JobViewFlags::Dock>()
+                                            << JobViewFlags::JOB_LIST_DOCK;
+    result[JobViewFlags::REAL_TIME_ACTIVITY] = QVector<JobViewFlags::Dock>()
+                                             << JobViewFlags::REAL_TIME_DOCK;
+    result[JobViewFlags::FITTING_ACTIVITY] = QVector<JobViewFlags::Dock>()
+                                           << JobViewFlags::REAL_TIME_DOCK
+                                           << JobViewFlags::FIT_PANEL_DOCK
+                                           << JobViewFlags::JOB_MESSAGE_DOCK;
+    return result;
+}
+}
+
+JobViewActivities::activity_map_t JobViewActivities::m_activityToDocks = createActivityMap();
+
+//! Returns list of available activity names.
+
+QStringList JobViewActivities::activityList()
+{
+    QStringList result = QStringList() << Constants::JobViewActivityName
+        << Constants::JobRealTimeActivityName << Constants::JobFittingActivityName;
+    return result;
+}
+
+//! Returns vector of JobView's dockId which have to be shown for given activity.
+
+QVector<JobViewFlags::Dock> JobViewActivities::activeDocks(JobViewFlags::Activity activity)
+{
+    activity_map_t::iterator it = m_activityToDocks.find(activity);
+    if(it == m_activityToDocks.end()) {
+        GUIHelpers::Error("JobViewActivities::activeDocks -> Error. Unknown activity");
+    }
+    return m_activityToDocks[activity];
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobViewActivities.h b/GUI/coregui/Views/JobWidgets/JobViewActivities.h
new file mode 100644
index 0000000..985f98f
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobViewActivities.h
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobViewActivities.h
+//! @brief     Defines class JobViewActivities
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBVIEWACTIVITIES_H
+#define JOBVIEWACTIVITIES_H
+
+#include "JobViewFlags.h"
+#include "WinDllMacros.h"
+#include <QMap>
+#include <QStringList>
+#include <QVector>
+
+//! The JobViewActivities class is a helper static class to get info related to JobView activities
+//! (JobViewActivity, RealTimeActivity and FittingActivity).
+
+class BA_CORE_API_ JobViewActivities {
+
+public:
+    using activity_map_t = QMap<JobViewFlags::Activity, QVector<JobViewFlags::Dock>>;
+
+    static QStringList activityList();
+
+    static QVector<JobViewFlags::Dock> activeDocks(JobViewFlags::Activity activity);
+
+private:
+    static activity_map_t m_activityToDocks;
+};
+
+#endif // JOBVIEWACTIVITIES_H
diff --git a/GUI/coregui/Views/JobWidgets/JobViewDocks.cpp b/GUI/coregui/Views/JobWidgets/JobViewDocks.cpp
new file mode 100644
index 0000000..072e3a4
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobViewDocks.cpp
@@ -0,0 +1,253 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobViewDocks.cpp
+//! @brief     Implements class JobViewDocks
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "JobViewDocks.h"
+#include "FitActivityPanel.h"
+#include "JobMessagePanel.h"
+#include "JobModel.h"
+#include "JobOutputDataWidget.h"
+#include "JobRealTimeWidget.h"
+#include "JobSelectorWidget.h"
+#include "JobView.h"
+#include "JobViewActivities.h"
+#include <QAbstractItemView>
+#include <QAction>
+#include <QDockWidget>
+#include <QTimer>
+
+namespace {
+const JobViewFlags::Activity default_activity = JobViewFlags::JOB_VIEW_ACTIVITY;
+}
+
+JobViewDocks::JobViewDocks(JobView *parent)
+    : QObject(parent)
+    , m_jobSelector(0)
+    , m_jobOutputDataWidget(0)
+    , m_jobRealTimeWidget(0)
+    , m_fitActivityPanel(0)
+    , m_jobMessagePanel(0)
+    , m_jobView(parent)
+{
+
+}
+
+void JobViewDocks::initViews(class JobModel *jobModel)
+{
+    initJobWidgets(jobModel);
+    initDocks();
+}
+
+//! Sets docks visibility so they match the activity flag.
+
+void JobViewDocks::setActivity(int activity)
+{
+    QVector<JobViewFlags::Dock> docksToShow
+            = JobViewActivities::activeDocks(JobViewFlags::Activity(activity));
+
+    for (int i = 0; i < JobViewFlags::NUMBER_OF_DOCKS; i++) {
+        JobViewFlags::Dock id = (JobViewFlags::Dock)i;
+        if(docksToShow.contains(id)) {
+            m_dockWidgets[id]->show();
+        } else {
+            m_dockWidgets[id]->hide();
+        }
+    }
+}
+
+void JobViewDocks::setItem(JobItem *jobItem)
+{
+    jobOutputDataWidget()->setItem(jobItem);
+    jobRealTimeWidget()->setItem(jobItem);
+    fitActivityPanel()->setItem(jobItem);
+}
+
+//! Sets the state of JobView to the default.
+
+void JobViewDocks::onResetLayout()
+{
+    m_jobView->setTrackingEnabled(false);
+    QList<QDockWidget *> dockWidgetList = m_jobView->dockWidgets();
+    foreach (QDockWidget *dockWidget, dockWidgetList) {
+        dockWidget->setFloating(false);
+        m_jobView->removeDockWidget(dockWidget);
+    }
+
+    m_jobView->addDockWidget(Qt::LeftDockWidgetArea, dock(JobViewFlags::JOB_LIST_DOCK));
+    m_jobView->addDockWidget(Qt::RightDockWidgetArea, dock(JobViewFlags::REAL_TIME_DOCK));
+    m_jobView->addDockWidget(Qt::RightDockWidgetArea, dock(JobViewFlags::FIT_PANEL_DOCK));
+    m_jobView->addDockWidget(Qt::BottomDockWidgetArea, dock(JobViewFlags::JOB_MESSAGE_DOCK));
+
+    foreach (QDockWidget *dockWidget, dockWidgetList)
+        dockWidget->show();
+
+    m_jobView->setTrackingEnabled(true);
+
+    setActivity(default_activity);
+}
+
+//! Shows/hides JobSelectorWidget.
+
+void JobViewDocks::onToggleJobSelector()
+{
+    QDockWidget *selectorDock = dock(JobViewFlags::JOB_LIST_DOCK);
+    selectorDock->setHidden(!selectorDock->isHidden());
+}
+
+//! A hack to request update of QDockWidget size if its child (e.g. InfoWidget) wants it.
+//! The problem bypassed here is that there is no direct method to QMainWindow to recalculate
+//! position of splitters surrounding given QDockWidget. So our child QWidget requests here
+//! the change of Min/Max size of QDockWidget, this will trigger recalculation of QDockWidget
+//! layout and will force QDockWidget to respect sizeHints provided by ChildWidget. Later (in one
+//! single timer shot) we return min/max sizes of QDockWidget back to re-enable splitters
+//! functionality.
+
+void JobViewDocks::setDockHeightForWidget(int height)
+{
+    qDebug() << "JobViewDocks::setDockHeightForWidget(int)" << height;
+
+    QWidget *widget = qobject_cast<QWidget *>(sender());
+    Q_ASSERT(widget);
+    QDockWidget *dock = findDock(widget);
+    Q_ASSERT(dock);
+
+    m_dock_info.m_dock = dock;
+    m_dock_info.m_min_size = dock->minimumSize();
+    m_dock_info.m_max_size = dock->maximumSize();
+
+    if(height >0) {
+        if(dock->height() < height) {
+            dock->setMinimumHeight(height);
+        } else {
+            dock->setMaximumHeight(height);
+        }
+    }
+
+// Pity, lambda functions doesn't compile for QTimer under Qt5.3.1
+//    QTimer::singleShot(1, this, [=]() {
+//        Q_ASSERT(m_dock_info.m_dock);
+//        m_dock_info.m_dock->setMinimumSize(m_dock_info.m_min_size);
+//        m_dock_info.m_dock->setMaximumSize(m_dock_info.m_max_size);
+//        m_dock_info.m_dock = 0;
+//    });
+
+    QTimer::singleShot(1, this, SLOT(dockToMinMaxSizes()));
+
+
+}
+
+void JobViewDocks::onWidgetCloseRequest()
+{
+    qDebug() << "JobViewDocks::onWidgetCloseRequest()";
+    QWidget *widget = qobject_cast<QWidget *>(sender());
+    Q_ASSERT(widget);
+    QDockWidget *dock = findDock(widget);
+    Q_ASSERT(dock);
+
+    dock->toggleViewAction()->trigger();
+}
+
+void JobViewDocks::dockToMinMaxSizes()
+{
+    Q_ASSERT(m_dock_info.m_dock);
+    m_dock_info.m_dock->setMinimumSize(m_dock_info.m_min_size);
+    m_dock_info.m_dock->setMaximumSize(m_dock_info.m_max_size);
+    m_dock_info.m_dock = 0;
+}
+
+//! Returns job widget with given Id.
+
+QWidget *JobViewDocks::jobWidget(JobViewFlags::Dock dockId)
+{
+    Q_ASSERT(dockId >=0 && dockId<m_jobWidgets.size());
+    return m_jobWidgets[dockId];
+}
+
+//! Returns dock with given id.
+
+QDockWidget *JobViewDocks::dock(JobViewFlags::Dock dockId)
+{
+    Q_ASSERT(dockId >=0 && dockId<m_dockWidgets.size());
+    return m_dockWidgets[dockId];
+}
+
+QWidget *JobViewDocks::centralWidget()
+{
+    return m_jobOutputDataWidget;
+}
+
+//! Inits all main JobWidgets.
+
+void JobViewDocks::initJobWidgets(JobModel *jobModel)
+{
+    m_jobWidgets.resize(JobViewFlags::NUMBER_OF_DOCKS);
+    m_dockWidgets.resize(JobViewFlags::NUMBER_OF_DOCKS);
+
+    m_jobOutputDataWidget = new JobOutputDataWidget(jobModel, m_jobView);
+
+    m_jobSelector = new JobSelectorWidget(jobModel, m_jobView);
+    m_jobWidgets[JobViewFlags::JOB_LIST_DOCK] = m_jobSelector;
+
+    m_jobRealTimeWidget = new JobRealTimeWidget(jobModel, m_jobView);
+    m_jobWidgets[JobViewFlags::REAL_TIME_DOCK] = m_jobRealTimeWidget;
+
+    m_fitActivityPanel = new FitActivityPanel(jobModel, m_jobView);
+    m_jobWidgets[JobViewFlags::FIT_PANEL_DOCK] = m_fitActivityPanel;
+
+    m_jobMessagePanel = new JobMessagePanel(m_jobView);
+    connect(m_jobMessagePanel, SIGNAL(widgetHeightRequest(int)), this, SLOT(setDockHeightForWidget(int)));
+    connect(m_jobMessagePanel, SIGNAL(widgetCloseRequest()), this, SLOT(onWidgetCloseRequest()));
+
+    m_jobWidgets[JobViewFlags::JOB_MESSAGE_DOCK] = m_jobMessagePanel;
+
+    m_fitActivityPanel->setRealTimeWidget(m_jobRealTimeWidget);
+    m_fitActivityPanel->setJobMessagePanel(m_jobMessagePanel);
+
+    m_jobView->setCentralWidget(centralWidget());
+}
+
+//! Init docks for JobView.
+
+void JobViewDocks::initDocks()
+{
+    m_jobView->setDocumentMode(true);
+    m_jobView->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::South);
+    m_jobView->setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
+    m_jobView->setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
+
+    for (int i = 0; i < JobViewFlags::NUMBER_OF_DOCKS; i++) {
+        QWidget *subWindow = jobWidget(JobViewFlags::Dock(i));
+        m_dockWidgets[i] = m_jobView->addDockForWidget(subWindow);
+        //m_dockWidgets[i]->setMinimumSize(QSize());
+
+        // Since we have 1-pixel splitters, we generally want to remove
+        // frames around item views. So we apply this hack for now.
+        QList<QAbstractItemView*> frames =
+                subWindow->findChildren<QAbstractItemView*>();
+        for (int i = 0 ; i< frames.count(); ++i)
+            frames[i]->setFrameStyle(QFrame::NoFrame);
+
+    }
+
+    onResetLayout();
+}
+
+QDockWidget *JobViewDocks::findDock(QWidget *widget)
+{
+    int index = m_jobWidgets.indexOf(widget);
+    if(index>=0)
+        return m_dockWidgets[index];
+    return nullptr;
+}
diff --git a/GUI/coregui/Views/JobWidgets/JobViewDocks.h b/GUI/coregui/Views/JobWidgets/JobViewDocks.h
new file mode 100644
index 0000000..8094c28
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobViewDocks.h
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobViewDocks.h
+//! @brief     Defines class JobViewDocks
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBVIEWDOCKS_H
+#define JOBVIEWDOCKS_H
+
+#include "JobViewFlags.h"
+#include "WinDllMacros.h"
+#include <QObject>
+#include <QVector>
+
+class QDockWidget;
+class JobView;
+class JobSelectorWidget;
+class JobOutputDataWidget;
+class JobRealTimeWidget;
+class FitActivityPanel;
+class JobMessagePanel;
+
+
+//! The JobViewDocks class assists JobView in holding all main job widgets and corresponding
+//! dock containers.
+
+//! It's main method setActivity handles visibility logic for all of (JobSelectorWidget,
+//! JobOutputDataWidget, JobRealTimeWidget and FitPanelWidget).
+
+class BA_CORE_API_ JobViewDocks : public QObject {
+    Q_OBJECT
+
+public:
+    JobViewDocks(JobView *parent = 0);
+
+    void initViews(class JobModel *jobModel);
+
+    class JobRealTimeWidget *jobRealTimeWidget() { return m_jobRealTimeWidget;}
+    class FitActivityPanel *fitActivityPanel() { return m_fitActivityPanel; }
+    class JobSelectorWidget *jobSelector() { return m_jobSelector; }
+    class JobOutputDataWidget *jobOutputDataWidget() { return m_jobOutputDataWidget; }
+    class JobMessagePanel *jobMessagePanel() { return m_jobMessagePanel; }
+
+    void setActivity(int activity);
+    void setItem(class JobItem *jobItem);
+
+public slots:
+    void onResetLayout();
+    void onToggleJobSelector();
+    void setDockHeightForWidget(int height);
+    void onWidgetCloseRequest();
+    void dockToMinMaxSizes();
+
+private:
+    //! Stores sizes of dock widget
+    struct DockSizeInfo {
+        DockSizeInfo():m_dock(0){}
+        QDockWidget *m_dock;
+        QSize m_min_size;
+        QSize m_max_size;
+    };
+
+    QWidget *jobWidget(JobViewFlags::Dock dockId);
+    QDockWidget *dock(JobViewFlags::Dock dockId);
+    QWidget *centralWidget();
+    void initJobWidgets(class JobModel *jobModel);
+    void initDocks();
+    QDockWidget *findDock(QWidget *widget);
+
+    JobSelectorWidget *m_jobSelector;
+    JobOutputDataWidget *m_jobOutputDataWidget;
+    JobRealTimeWidget *m_jobRealTimeWidget;
+    FitActivityPanel *m_fitActivityPanel;
+    JobMessagePanel *m_jobMessagePanel;
+
+    QVector<QWidget *> m_jobWidgets;
+    QVector<QDockWidget *> m_dockWidgets;
+
+    JobView *m_jobView;
+    DockSizeInfo m_dock_info;
+
+};
+
+#endif // JOBVIEWDOCKS_H
diff --git a/GUI/coregui/Views/JobWidgets/JobViewFlags.h b/GUI/coregui/Views/JobWidgets/JobViewFlags.h
new file mode 100644
index 0000000..467d682
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/JobViewFlags.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/JobViewFlags.h
+//! @brief     Defines class JobViewFlags
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef JOBVIEWFLAGS_H
+#define JOBVIEWFLAGS_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+//! The JobViewFlags class is a namespace for various flags used in JobView.
+
+class JobViewFlags {
+public:
+
+    enum EDocksId {
+        JOB_LIST_DOCK,
+        REAL_TIME_DOCK,
+        FIT_PANEL_DOCK,
+        JOB_MESSAGE_DOCK,
+        NUMBER_OF_DOCKS
+    };
+    Q_DECLARE_FLAGS(Dock, EDocksId)
+
+    enum EActivities {
+        JOB_VIEW_ACTIVITY,
+        REAL_TIME_ACTIVITY,
+        FITTING_ACTIVITY,
+    };
+    Q_DECLARE_FLAGS(Activity, EActivities)
+
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(JobViewFlags::Dock)
+Q_DECLARE_OPERATORS_FOR_FLAGS(JobViewFlags::Activity)
+
+#endif // JOBVIEWFLAGS_H
diff --git a/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp b/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp
new file mode 100644
index 0000000..e7113a7
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp
@@ -0,0 +1,298 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.cpp
+//! @brief     Implements class ParameterTuningDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterTuningDelegate.h"
+#include "GUIHelpers.h"
+#include "ModelPath.h"
+#include "ParameterTreeItems.h"
+#include "ParameterTuningModel.h"
+#include "SessionModel.h"
+#include <QAbstractItemModel>
+#include <QApplication>
+#include <QDebug>
+#include <QDoubleSpinBox>
+#include <QHBoxLayout>
+#include <QItemSelectionModel>
+#include <QMouseEvent>
+#include <QPaintDevice>
+#include <QPainter>
+#include <QRect>
+#include <QStyleOptionSlider>
+#include <QWidget>
+#include <cmath>
+#include <iostream>
+#include <limits>
+
+
+namespace {
+//const double maximum_doublespin_value(1e+20);
+const double maximum_doublespin_value(20000.0);
+//const double minimum_doublespin_value(0.0);
+}
+
+ParameterTuningDelegate::SliderData::SliderData()
+    : m_smin(0)
+    , m_smax(100)
+    , m_rmin(0.0)
+    , m_rmax(0.0)
+    , m_range_factor(100.0)
+{
+
+}
+
+void ParameterTuningDelegate::SliderData::setRangeFactor(double range_factor)
+{
+    m_range_factor = range_factor;
+}
+
+void ParameterTuningDelegate::SliderData::setItemLimits(const RealLimits &item_limits)
+{
+    m_item_limits = item_limits;
+}
+
+int ParameterTuningDelegate::SliderData::value_to_slider(double value)
+{
+    double dr(0);
+    if(value == 0.0) {
+        dr = 1.0*m_range_factor/100.;
+    } else {
+        dr = std::abs(value)*m_range_factor/100.;
+    }
+    m_rmin = value - dr;
+    m_rmax = value + dr;
+
+    if(m_item_limits.hasLowerLimit() && m_rmin < m_item_limits.getLowerLimit())
+        m_rmin = m_item_limits.getLowerLimit();
+
+    if(m_item_limits.hasUpperLimit() && m_rmax > m_item_limits.getUpperLimit())
+        m_rmax = m_item_limits.getUpperLimit();
+
+    return m_smin + (value - m_rmin)*(m_smax-m_smin)/(m_rmax-m_rmin);
+}
+
+double ParameterTuningDelegate::SliderData::slider_to_value(int slider)
+{
+    return m_rmin + (slider - m_smin)*(m_rmax-m_rmin)/(m_smax - m_smin);
+}
+
+
+ParameterTuningDelegate::ParameterTuningDelegate(QObject *parent)
+    : QItemDelegate(parent)
+    , m_valueColumn(1)
+    , m_slider(0)
+    , m_valueBox(0)
+    , m_contentWidget(0)
+    , m_contentLayout(0)
+    , m_currentItem(0)
+    , m_isReadOnly(false)
+{
+
+}
+
+ParameterTuningDelegate::~ParameterTuningDelegate()
+{
+//    if(m_currentItem)
+//        m_currentItem->mapper()->unsubscribe(this);
+
+}
+
+void ParameterTuningDelegate::paint(QPainter *painter,
+                                const QStyleOptionViewItem &option,
+                                const QModelIndex &index) const
+{
+    if (index.column() == m_valueColumn) {
+
+        if(!index.parent().isValid()) return;
+
+        QVariant prop_value = index.model()->data(index, Qt::EditRole);
+        if(prop_value.isValid()) {
+            int type = GUIHelpers::getVariantType(prop_value);
+            if (type == QVariant::Double) {
+                double value = prop_value.toDouble();
+                QString text(QString::number(value));
+
+                QStyleOptionViewItem myOption = option;
+                myOption.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+
+                drawDisplay(painter, myOption, myOption.rect, text);
+                drawFocus(painter, myOption, myOption.rect);
+                return;
+            }
+        }
+    }
+    QItemDelegate::paint(painter, option, index);
+}
+
+
+QWidget *ParameterTuningDelegate::createEditor(QWidget *parent,
+                                           const QStyleOptionViewItem &option,
+                                           const QModelIndex &index) const
+{
+    if(m_isReadOnly)
+        return nullptr;
+
+    if (index.column() == m_valueColumn) {
+        if(index.parent().isValid() == false) return nullptr;
+
+        QVariant data = index.model()->data(index, Qt::EditRole);
+        if(!data.isValid()) return nullptr;
+
+        double value = data.toDouble();
+
+        m_currentItem = static_cast<ParameterItem*>(ParameterTuningModel::toSourceIndex(index).internalPointer());
+        if(!m_currentItem)
+            return nullptr;
+
+        RealLimits limits = m_currentItem->getLinkedItem()->limits();
+
+        // initializing value box
+        m_valueBox = new QDoubleSpinBox();
+        m_valueBox->setKeyboardTracking(false);
+        m_valueBox->setFixedWidth(80);
+        m_valueBox->setDecimals(m_currentItem->getLinkedItem()->decimals());
+        m_valueBox->setSingleStep(1./std::pow(10.,m_currentItem->getLinkedItem()->decimals()-1));
+
+        if(limits.hasLowerLimit()) {
+            m_valueBox->setMinimum(limits.getLowerLimit());
+        } else {
+            m_valueBox->setMinimum(-maximum_doublespin_value);
+        }
+
+        if(limits.hasUpperLimit()) {
+           m_valueBox->setMaximum(limits.getUpperLimit());
+        } else {
+            m_valueBox->setMaximum(maximum_doublespin_value);
+        }
+
+        m_valueBox->setValue(value);
+        connect(m_valueBox, SIGNAL(valueChanged(double)),this, SLOT(editorValueChanged(double)));
+
+        // initializing slider
+        m_slider = new QSlider(Qt::Horizontal);
+        m_slider->setFocusPolicy(Qt::StrongFocus);
+        m_slider->setTickPosition(QSlider::NoTicks);
+        m_slider->setTickInterval(1);
+        m_slider->setSingleStep(1);
+        m_slider_data.setItemLimits(limits);
+        m_slider->setRange(m_slider_data.m_smin, m_slider_data.m_smax);
+
+        updateSlider(value);
+
+        m_contentWidget = new QWidget(parent);
+        m_contentLayout = new QHBoxLayout(parent);
+        m_contentLayout->setMargin(0);
+        m_contentLayout->setSpacing(0);
+        m_contentLayout->addWidget(m_valueBox);
+        m_contentLayout->addWidget(m_slider);
+
+        // FIXME there is an issue with time of life of editor .vs. item
+//        m_currentItem->mapper()->setOnValueChange(
+//                      [this](){
+//            if(m_valueBox && m_currentItem)
+//              m_valueBox->setValue(m_currentItem->value().toDouble());
+//        }, this);
+
+//        m_currentItem->mapper()->setOnItemDestroy(
+//                    [this](SessionItem *) {
+//            m_currentItem = 0;
+//        }, this);
+
+        m_contentWidget->setLayout(m_contentLayout);
+
+        return m_contentWidget;
+    } else {
+        return QItemDelegate::createEditor(parent, option, index);
+    }
+}
+
+
+void ParameterTuningDelegate::updateSlider(double value) const
+{
+    disconnect(m_slider, SIGNAL(valueChanged(int)),this, SLOT(sliderValueChanged(int)));
+
+    m_slider->setValue(m_slider_data.value_to_slider(value));
+
+    connect(m_slider, SIGNAL(valueChanged(int)),this, SLOT(sliderValueChanged(int)));
+}
+
+
+void ParameterTuningDelegate::sliderValueChanged(int position)
+{
+    disconnect(m_valueBox, SIGNAL(valueChanged(double)),this, SLOT(editorValueChanged(double)));
+
+    double value = m_slider_data.slider_to_value(position);
+    m_valueBox->setValue(value);
+
+    connect(m_valueBox, SIGNAL(valueChanged(double)),this, SLOT(editorValueChanged(double)));
+    emitSignals(value);
+}
+
+
+void ParameterTuningDelegate::editorValueChanged(double value)
+{
+    qDebug() << "ModelTuningDelegate::editorValueChanged " << value;
+    disconnect(m_slider, SIGNAL(valueChanged(int)),this, SLOT(sliderValueChanged(int)));
+
+    updateSlider(value);
+
+    connect(m_slider, SIGNAL(valueChanged(int)),this, SLOT(sliderValueChanged(int)));
+    emitSignals(value);
+}
+
+
+void ParameterTuningDelegate::setEditorData(QWidget *editor,
+                                        const QModelIndex &index) const
+{
+    if (index.column() == m_valueColumn) {
+        //as using custom widget, doing nothing here
+    } else {
+        QItemDelegate::setEditorData(editor, index);
+    }
+}
+
+
+void ParameterTuningDelegate::setModelData(QWidget *editor,
+                                       QAbstractItemModel *model,
+                                       const QModelIndex &index) const
+{
+    if (index.column() == m_valueColumn) {
+
+        model->setData(index, m_valueBox->value());
+
+    } else {
+        QItemDelegate::setModelData(editor, model, index);
+    }
+}
+
+
+void ParameterTuningDelegate::emitSignals(double value)
+{
+    if(m_currentItem) {
+        m_currentItem->setValue(value);
+        m_currentItem->propagateValueLink();
+        emit currentLinkChanged(m_currentItem);
+    }
+}
+
+void ParameterTuningDelegate::setSliderRangeFactor(double value)
+{
+    m_slider_data.setRangeFactor(value);
+}
+
+void ParameterTuningDelegate::setReadOnly(bool isReadOnly)
+{
+    m_isReadOnly = isReadOnly;
+}
diff --git a/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.h b/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.h
new file mode 100644
index 0000000..aa497d1
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.h
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/ParameterTuningDelegate.h
+//! @brief     Defines class ParameterTuningDelegate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERTUNINGDELEGATE_H
+#define PARAMETERTUNINGDELEGATE_H
+
+#include "RealLimits.h"
+#include <QItemDelegate>
+#include <memory>
+
+class QDoubleSpinBox;
+class QHBoxLayout;
+class ParameterItem;
+class SessionItem;
+
+class BA_CORE_API_ ParameterTuningDelegate : public QItemDelegate
+{
+    Q_OBJECT
+
+public:
+    class SliderData {
+    public:
+        SliderData();
+        void setRangeFactor(double range_factor);
+        void setItemLimits(const RealLimits &item_limits);
+        int value_to_slider(double value);
+        double slider_to_value(int slider);
+        int m_smin;
+        int m_smax;
+        double m_rmin;
+        double m_rmax;
+        double m_range_factor;
+        RealLimits m_item_limits;
+    };
+
+
+    ParameterTuningDelegate(QObject *parent = 0);
+    ~ParameterTuningDelegate();
+
+    QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & /* index */) const
+    {
+        return QSize(option.rect.width(),25);
+    }
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+               const QModelIndex &index) const;
+    QWidget *createEditor(QWidget *parent,
+                          const QStyleOptionViewItem &option,
+                          const QModelIndex &index) const;
+    void setEditorData(QWidget *editor, const QModelIndex &index) const;
+    void setModelData(QWidget *editor, QAbstractItemModel *model,
+                      const QModelIndex &index) const;
+    void setSliderRangeFactor(double value);
+
+    void setValueColumn(int valueColumn) { m_valueColumn = valueColumn; }
+
+    void setReadOnly(bool isReadOnly);
+
+signals:
+    void currentLinkChanged(SessionItem *item);
+
+private slots:
+    void sliderValueChanged(int position);
+    void editorValueChanged(double value);
+
+private:
+    void updateSlider(double value) const;
+    void emitSignals(double value);
+
+    int m_valueColumn;
+    mutable QSlider *m_slider;
+    mutable QDoubleSpinBox *m_valueBox;
+    mutable QWidget *m_contentWidget;
+    mutable QHBoxLayout * m_contentLayout;
+    mutable ParameterItem *m_currentItem;
+    mutable SliderData m_slider_data;
+    bool m_isReadOnly;
+};
+
+#endif // PARAMETERTUNINGDELEGATE_H
diff --git a/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp
new file mode 100644
index 0000000..07de827
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp
@@ -0,0 +1,318 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp
+//! @brief     Implements class ParameterTuningWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParameterTuningWidget.h"
+#include "DesignerHelper.h"
+#include "GUIHelpers.h"
+#include "InstrumentModel.h"
+#include "IntensityDataItem.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "JobQueueData.h"
+#include "ParameterTreeBuilder.h"
+#include "ParameterTreeItems.h"
+#include "ParameterTuningDelegate.h"
+#include "ParameterTuningModel.h"
+#include "SampleModel.h"
+#include "SliderSettingsWidget.h"
+#include "WarningSignWidget.h"
+#include <QApplication>
+#include <QDebug>
+#include <QItemSelectionModel>
+#include <QKeyEvent>
+#include <QLabel>
+#include <QScrollBar>
+#include <QStandardItemModel>
+#include <QToolButton>
+#include <QTreeView>
+#include <QVBoxLayout>
+
+namespace {
+const int warning_sign_xpos = 38;
+const int warning_sign_ypos = 38;
+}
+
+ParameterTuningWidget::ParameterTuningWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_jobModel(0)
+    , m_currentJobItem(0)
+    , m_parameterTuningModel(0)
+    , m_sliderSettingsWidget(new SliderSettingsWidget(this))
+    , m_delegate(new ParameterTuningDelegate)
+    , m_warningSign(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    m_treeView = new QTreeView();
+    m_treeView->setStyleSheet(
+        "QTreeView::branch {background: palette(base);}QTreeView::branch:has-siblings:!adjoins-item "
+        "{border-image: url(:/images/treeview-vline.png) 0;}QTreeView::branch:has-siblings:"
+        "adjoins-item {border-image: url(:/images/treeview-branch-more.png) 0;}QTreeView::branch:"
+        "!has-children:!has-siblings:adjoins-item {border-image: "
+        "url(:/images/treeview-branch-end.png) 0;}QTreeView::branch:has-children:!has-siblings:closed"
+        ",QTreeView::branch:closed:has-children:has-siblings {border-image: none;image: "
+        "url(:/images/treeview-branch-closed.png);}QTreeView::branch:open:has-children:!has-siblings,"
+        "QTreeView::branch:open:has-children:has-siblings  {border-image: none;image: "
+        "url(:/images/treeview-branch-open.png);}");
+
+    m_treeView->setItemDelegate(m_delegate);
+    //m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    m_treeView->setContextMenuPolicy(Qt::CustomContextMenu);
+    m_treeView->setDragDropMode(QAbstractItemView::NoDragDrop);
+    m_treeView->setAttribute(Qt::WA_MacShowFocusRect, false);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    mainLayout->addWidget(m_sliderSettingsWidget);
+    mainLayout->addWidget(m_treeView);
+    setLayout(mainLayout);
+
+    connect(m_sliderSettingsWidget, SIGNAL(sliderRangeFactorChanged(double)),
+            this, SLOT(onSliderValueChanged(double)));
+    connect(m_sliderSettingsWidget, SIGNAL(lockzChanged(bool)),
+            this, SLOT(onLockZValueChanged(bool)));
+    connect(m_delegate, SIGNAL(currentLinkChanged(SessionItem*)),
+            this, SLOT(onCurrentLinkChanged(SessionItem*)));
+    connect(m_treeView, SIGNAL(customContextMenuRequested(const QPoint &)),
+            this, SLOT(onCustomContextMenuRequested(const QPoint &)));
+}
+
+void ParameterTuningWidget::setItem(JobItem *item)
+{
+    if (m_currentJobItem == item) {
+        return;
+
+    } else {
+        if(m_currentJobItem)
+            m_currentJobItem->mapper()->unsubscribe(this);
+
+        m_currentJobItem = item;
+        if (!m_currentJobItem) return;
+
+        m_jobModel = dynamic_cast<JobModel *>(m_currentJobItem->model());
+
+        updateParameterModel();
+        updateDragAndDropSettings();
+
+        m_currentJobItem->mapper()->setOnPropertyChange(
+                [this](const QString &name)
+        {
+            onPropertyChanged(name);
+        }, this);
+
+    }
+}
+
+QItemSelectionModel *ParameterTuningWidget::selectionModel()
+{
+    Q_ASSERT(m_treeView);
+    return m_treeView->selectionModel();
+}
+
+//! Returns list of ParameterItem's currently selected in parameter tree
+
+QVector<ParameterItem *> ParameterTuningWidget::getSelectedParameters()
+{
+    QVector<ParameterItem *> result;
+    QModelIndexList proxyIndexes = selectionModel()->selectedIndexes();
+    foreach(QModelIndex proxyIndex, proxyIndexes) {
+        if(ParameterItem *parItem = m_parameterTuningModel->getParameterItem(proxyIndex))
+            result.push_back(parItem);
+    }
+    return result;
+}
+
+void ParameterTuningWidget::onCurrentLinkChanged(SessionItem *item)
+{
+    qDebug() << "ModelTuningWidget::onCurrentLinkChanged";
+    Q_ASSERT(m_currentJobItem);
+
+    if(m_currentJobItem->isRunning())
+        return;
+
+    if (item) {
+        qDebug() << "ModelTuningWidget::onCurrentLinkChanged() -> Starting to tune model";
+//                 << link.getItem()->modelType() << link.getPropertyName();
+//        link.updateItem();
+        m_jobModel->runJob(m_currentJobItem->index());
+    }
+}
+
+void ParameterTuningWidget::onSliderValueChanged(double value)
+{
+    m_delegate->setSliderRangeFactor(value);
+}
+
+void ParameterTuningWidget::onLockZValueChanged(bool value)
+{
+    if(!m_currentJobItem) return;
+    if(IntensityDataItem *intensityDataItem = m_currentJobItem->intensityDataItem()) {
+        qDebug() << "ModelTuningWidget::onLockZValueChanged(bool value) ->" << value;
+        intensityDataItem->setZAxisLocked(value);
+    }
+}
+
+void ParameterTuningWidget::updateParameterModel()
+{
+    Q_ASSERT(m_jobModel);
+    qDebug() << "ModelTuningWidget::updateParameterModel()";
+
+    if(!m_currentJobItem) return;
+
+    if(!m_currentJobItem->multiLayerItem() || !m_currentJobItem->instrumentItem())
+        throw GUIHelpers::Error("ModelTuningWidget::updateParameterModel() -> Error."
+                                "JobItem doesn't have sample or instrument model.");
+
+    delete m_parameterTuningModel;
+    m_parameterTuningModel = new ParameterTuningModel(this);
+    m_parameterTuningModel->setSourceModel(m_jobModel);
+
+    m_treeView->setModel(m_parameterTuningModel);
+    m_treeView->setRootIndex(
+        m_parameterTuningModel->mapFromSource(m_currentJobItem->parameterContainerItem()->index()));
+    if (m_treeView->columnWidth(0) < 170)
+        m_treeView->setColumnWidth(0, 170);
+    m_treeView->expandAll();
+}
+
+void ParameterTuningWidget::onCustomContextMenuRequested(const QPoint &point)
+{
+    emit itemContextMenuRequest(m_treeView->mapToGlobal(point+ QPoint(2, 22)));
+}
+
+void ParameterTuningWidget::restoreModelsOfCurrentJobItem()
+{
+    Q_ASSERT(m_jobModel);
+    Q_ASSERT(m_currentJobItem);
+
+    if(m_currentJobItem->isRunning())
+        return;
+
+    closeActiveEditors();
+
+    m_jobModel->restore(m_currentJobItem);
+    m_jobModel->runJob(m_currentJobItem->index());
+}
+
+void ParameterTuningWidget::makeSelected(ParameterItem *item)
+{
+    QModelIndex proxyIndex = m_parameterTuningModel->mapFromSource(item->index());
+    if(proxyIndex.isValid()) {
+       selectionModel()->select(proxyIndex, QItemSelectionModel::Select);
+    }
+}
+
+void ParameterTuningWidget::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED(event);
+    if(m_warningSign) {
+        QPoint pos = getPositionForWarningSign();
+        m_warningSign->setPosition(pos.x(),pos.y());
+    }
+    if(m_treeView) {
+        m_treeView->setColumnWidth(0, width()*0.5);
+    }
+}
+
+//! Context menu reimplemented to suppress the default one
+void ParameterTuningWidget::contextMenuEvent(QContextMenuEvent *event)
+{
+    Q_UNUSED(event);
+}
+
+void ParameterTuningWidget::onPropertyChanged(const QString &property_name)
+{
+    if(property_name == JobItem::P_STATUS) {
+        delete m_warningSign;
+        m_warningSign = 0;
+
+        if(m_currentJobItem->isFailed()) {
+            QString message;
+            message.append("Current parameter values cause simulation failure.\n\n");
+            message.append(m_currentJobItem->getComments());
+
+            m_warningSign = new WarningSignWidget(this);
+            m_warningSign->setWarningMessage(message);
+            QPoint pos = getPositionForWarningSign();
+            m_warningSign->setPosition(pos.x(), pos.y());
+            m_warningSign->show();
+        }
+
+        updateDragAndDropSettings();
+    }
+}
+
+//! Returns position for warning sign at the bottom right corner of the tree view.
+//! The position will be adjusted according to the visibility of scroll bars
+QPoint ParameterTuningWidget::getPositionForWarningSign()
+{
+    int x = width()-warning_sign_xpos;
+    int y = height()-warning_sign_ypos;
+
+    if(QScrollBar *horizontal = m_treeView->horizontalScrollBar()) {
+        if(horizontal->isVisible())
+            y -= horizontal->height();
+    }
+
+    if(QScrollBar *vertical = m_treeView->verticalScrollBar()) {
+        if(vertical->isVisible())
+            x -= vertical->width();
+    }
+
+    return QPoint(x, y);
+}
+
+//! Disable drag-and-drop abilities, if job is in fit running state.
+
+void ParameterTuningWidget::updateDragAndDropSettings()
+{
+    Q_ASSERT(m_currentJobItem);
+    if(m_currentJobItem->getStatus() == Constants::STATUS_FITTING) {
+        setTuningDelegateEnabled(false);
+        m_treeView->setDragDropMode(QAbstractItemView::NoDragDrop);
+    } else {
+        setTuningDelegateEnabled(true);
+        if(m_currentJobItem->isValidForFitting())
+            m_treeView->setDragDropMode(QAbstractItemView::DragOnly);
+    }
+}
+
+//! Sets delegate to enabled/disabled state.
+//! In 'disabled' state the delegate is in ReadOnlyMode, if it was containing already some
+//! editing widget, it will be forced to close.
+void ParameterTuningWidget::setTuningDelegateEnabled(bool enabled)
+{
+    if(enabled) {
+        m_delegate->setReadOnly(false);
+
+    } else {
+        m_delegate->setReadOnly(true);
+        closeActiveEditors();
+    }
+}
+
+void ParameterTuningWidget::closeActiveEditors()
+{
+    QModelIndex index = m_treeView->currentIndex();
+    QWidget *editor = m_treeView->indexWidget(index);
+    if(editor) {
+        //m_delegate->commitData(editor);
+        m_delegate->closeEditor(editor, QAbstractItemDelegate::NoHint);
+    }
+    m_treeView->selectionModel()->clearSelection();
+}
+
diff --git a/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h
new file mode 100644
index 0000000..fc77691
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h
@@ -0,0 +1,82 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/ParameterTuningWidget.h
+//! @brief     Defines class ParameterTuningWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARAMETERTUNINGWIDGET_H
+#define PARAMETERTUNINGWIDGET_H
+
+#include <QWidget>
+#include <memory>
+
+class JobModel;
+class JobItem;
+class SessionItem;
+class QItemSelectionModel;
+class ParameterTuningDelegate;
+class ParameterTuningModel;
+class SliderSettingsWidget;
+class QTreeView;
+class WarningSignWidget;
+class ParameterItem;
+
+class ParameterTuningWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit ParameterTuningWidget(QWidget *parent = 0);
+
+    void setItem(JobItem *item);
+
+    QItemSelectionModel* selectionModel();
+
+    QVector<ParameterItem *> getSelectedParameters();    
+
+signals:
+    void itemContextMenuRequest(const QPoint &point);
+
+public slots:
+    void onCurrentLinkChanged(SessionItem* item);
+    void onSliderValueChanged(double value);
+    void onLockZValueChanged(bool value);
+    void restoreModelsOfCurrentJobItem();
+    void makeSelected(ParameterItem *item);
+
+protected:
+    void resizeEvent(QResizeEvent *event);
+    void contextMenuEvent(QContextMenuEvent *event);
+
+private slots:
+    void onPropertyChanged(const QString &property_name);
+    void updateParameterModel();
+    void onCustomContextMenuRequested(const QPoint &point);
+
+private:
+    QPoint getPositionForWarningSign();
+    void updateDragAndDropSettings();
+
+    void setTuningDelegateEnabled(bool enabled);
+    void closeActiveEditors();
+
+    JobModel *m_jobModel;
+    JobItem *m_currentJobItem;
+    ParameterTuningModel *m_parameterTuningModel;
+    SliderSettingsWidget *m_sliderSettingsWidget;
+    QTreeView *m_treeView;
+    ParameterTuningDelegate *m_delegate;
+    WarningSignWidget *m_warningSign;
+};
+
+#endif // PARAMETERTUNINGWIDGET_H
diff --git a/GUI/coregui/Views/JobWidgets/SliderSettingsWidget.cpp b/GUI/coregui/Views/JobWidgets/SliderSettingsWidget.cpp
new file mode 100644
index 0000000..2ef5f7d
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/SliderSettingsWidget.cpp
@@ -0,0 +1,99 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/SliderSettingsWidget.cpp
+//! @brief     Implements class SliderSettingsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SliderSettingsWidget.h"
+#include <QCheckBox>
+#include <QDebug>
+#include <QGroupBox>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QRadioButton>
+#include <QVBoxLayout>
+
+
+SliderSettingsWidget::SliderSettingsWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_currentSliderRange(100.0)
+    , m_radio1(0)
+    , m_radio2(0)
+    , m_radio3(0)
+    , m_lockzCheckBox(0)
+{
+    // tuning selectors
+    QString tooltip("Allows to tune sample parameters within +/- of given range \nwith the help of the slider.");
+
+    QLabel *label = new QLabel("Tuning:");
+    label->setToolTip(tooltip);
+
+    m_radio1 = new QRadioButton("10%");
+    m_radio1->setAutoExclusive(true);
+    m_radio1->setToolTip(tooltip);
+    connect(m_radio1,SIGNAL(clicked(bool)),this,SLOT(rangeChanged()));
+
+    m_radio2 = new QRadioButton("100%");
+    m_radio2->setChecked(true);
+    m_radio2->setAutoExclusive(true);
+    m_radio2->setToolTip(tooltip);
+    connect(m_radio2,SIGNAL(clicked(bool)),this,SLOT(rangeChanged()));
+
+    m_radio3 = new QRadioButton("1000%");
+    m_radio3->setAutoExclusive(true);
+    m_radio3->setToolTip(tooltip);
+    connect(m_radio3,SIGNAL(clicked(bool)),this,SLOT(rangeChanged()));
+
+    // Fix z-axis
+    m_lockzCheckBox = new QCheckBox("Lock-Z");
+    m_lockzCheckBox->setToolTip("Preserve (min, max) range of intensity axis during parameter tuning.");
+    connect(m_lockzCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onLockZChanged(int)));
+
+    QHBoxLayout *hbox = new QHBoxLayout;
+
+    hbox->addWidget(label);
+    hbox->addWidget(m_radio1);
+    hbox->addWidget(m_radio2);
+    hbox->addWidget(m_radio3);
+    hbox->addStretch(1);
+    hbox->addWidget(m_lockzCheckBox);
+
+    setLayout(hbox);
+}
+
+
+void SliderSettingsWidget::rangeChanged()
+{
+    if(m_radio1->isChecked())
+    {
+        m_currentSliderRange = 10.0;
+    }
+    else if(m_radio2->isChecked())
+    {
+        m_currentSliderRange = 100.0;
+    }
+    else if(m_radio3->isChecked())
+    {
+        m_currentSliderRange = 1000.0;
+    }
+    emit sliderRangeFactorChanged(m_currentSliderRange);
+}
+
+void SliderSettingsWidget::onLockZChanged(int state)
+{
+    if(state == Qt::Unchecked) {
+        emit lockzChanged(false);
+    } else if(state == Qt::Checked) {
+        emit lockzChanged(true);
+    }
+}
diff --git a/GUI/coregui/Views/JobWidgets/SliderSettingsWidget.h b/GUI/coregui/Views/JobWidgets/SliderSettingsWidget.h
new file mode 100644
index 0000000..85ed65d
--- /dev/null
+++ b/GUI/coregui/Views/JobWidgets/SliderSettingsWidget.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/JobWidgets/SliderSettingsWidget.h
+//! @brief     Defines class SliderSettingsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SLIDERSETTINGSWIDGET_H
+#define SLIDERSETTINGSWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class QRadioButton;
+class QCheckBox;
+
+class BA_CORE_API_ SliderSettingsWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SliderSettingsWidget(QWidget *parent = 0);
+
+signals:
+    void sliderRangeFactorChanged(double value);
+    void lockzChanged(bool value);
+
+private slots:
+    void rangeChanged();
+    void onLockZChanged(int state);
+
+private:
+    double m_currentSliderRange;
+    QRadioButton *m_radio1;
+    QRadioButton *m_radio2;
+    QRadioButton *m_radio3;
+    QCheckBox *m_lockzCheckBox;
+};
+
+#endif // SLIDERSETTINGSWIDGET_H
diff --git a/GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.cpp b/GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.cpp
new file mode 100644
index 0000000..1e9f5cb
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.cpp
@@ -0,0 +1,82 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.cpp
+//! @brief     Implements class ColorMapSceneAdaptor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ColorMapSceneAdaptor.h"
+#include "ColorMap.h"
+#include <QDebug>
+
+ColorMapSceneAdaptor::ColorMapSceneAdaptor()
+    : m_plot(0)
+{
+
+}
+
+qreal ColorMapSceneAdaptor::toSceneX(qreal mask_x) const
+{
+    qreal result = mask_x;
+    if(m_plot) result = m_plot->xAxisCoordToPixel(mask_x);
+    return result;
+}
+
+qreal ColorMapSceneAdaptor::toSceneY(qreal mask_y) const
+{
+    qreal result = mask_y;
+    if(m_plot) result = m_plot->yAxisCoordToPixel(mask_y);
+    return result;
+}
+
+qreal ColorMapSceneAdaptor::fromSceneX(qreal scene_x) const
+{
+    qreal result = scene_x;
+    if(m_plot) result = m_plot->pixelToXaxisCoord(scene_x);
+    return result;
+}
+
+qreal ColorMapSceneAdaptor::fromSceneY(qreal scene_y) const
+{
+    qreal result = scene_y;
+    if(m_plot) result = m_plot->pixelToYaxisCoord(scene_y);
+    return result;
+}
+
+void ColorMapSceneAdaptor::setColorMapPlot(ColorMap *plot)
+{
+    m_plot = plot;
+    if(m_plot) {
+        m_plot->installEventFilter(this);
+    }
+}
+
+bool ColorMapSceneAdaptor::eventFilter(QObject *object, QEvent *event)
+{
+    Q_UNUSED(object);
+    qDebug() << "ColorMapSceneAdaptor::eventFilter" << event->type();
+    if (event->type() == QEvent::Resize || event->type() == QEvent::UpdateRequest) {
+        m_viewport_rectangle = m_plot->getViewportRectangleInWidgetCoordinates();
+        emit update_request();
+        qDebug() << "ColorMapSceneAdaptor::eventFilter" << event->type();
+        return false;
+    }
+//    return QObject::eventFilter(object, event);
+    return true;
+}
+
+const QRectF &ColorMapSceneAdaptor::getViewportRectangle() const
+{
+    return m_viewport_rectangle;
+}
+
+
diff --git a/GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.h b/GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.h
new file mode 100644
index 0000000..6b7e0e8
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/ColorMapSceneAdaptor.h
+//! @brief     Defines class ColorMapSceneAdaptor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COLORMAPSCENEADAPTOR_H
+#define COLORMAPSCENEADAPTOR_H
+
+#include "ISceneAdaptor.h"
+class ColorMap;
+
+//! Performs conversion of MaskItems coordinates between ColorMap and GraphicsScene.
+
+class ColorMapSceneAdaptor : public ISceneAdaptor
+{
+    Q_OBJECT
+
+public:
+    ColorMapSceneAdaptor();
+
+    qreal toSceneX(qreal mask_x) const;
+    qreal toSceneY(qreal mask_y) const;
+    qreal fromSceneX(qreal scene_x) const;
+    qreal fromSceneY(qreal scene_y) const;
+
+    void setColorMapPlot(ColorMap *plot);
+
+    bool eventFilter(QObject *object, QEvent *event);
+
+    //! returns ColorMapPlot axes rectangle (at current zoom level) in scene coordinates
+    const QRectF& getViewportRectangle() const;
+
+private:
+    ColorMap *m_plot;
+};
+
+#endif // COLORMAPSCENEADAPTOR_H
diff --git a/GUI/coregui/Views/MaskWidgets/EllipseView.cpp b/GUI/coregui/Views/MaskWidgets/EllipseView.cpp
new file mode 100644
index 0000000..6a49637
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/EllipseView.cpp
@@ -0,0 +1,168 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/EllipseView.cpp
+//! @brief     Implements EllipseView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "EllipseView.h"
+#include "MaskItems.h"
+#include "SizeHandleElement.h"
+#include <QGraphicsSceneMouseEvent>
+#include <QPainter>
+
+EllipseView::EllipseView()
+{
+}
+
+void EllipseView::onChangedX()
+{
+    m_block_on_property_change = true;
+    m_item->setItemValue(EllipseItem::P_XCENTER, fromSceneX(this->x()));
+    m_block_on_property_change = false;
+}
+
+void EllipseView::onChangedY()
+{
+    m_block_on_property_change = true;
+    m_item->setItemValue(EllipseItem::P_YCENTER, fromSceneY(this->y()));
+    m_block_on_property_change = false;
+}
+
+void EllipseView::onPropertyChange(const QString &propertyName)
+{
+    if(m_block_on_property_change) return;
+    m_block_on_property_change = true;
+
+    if(propertyName == EllipseItem::P_XRADIUS || propertyName == EllipseItem::P_YRADIUS) {
+        update_view();
+    }
+    else if(propertyName == EllipseItem::P_XCENTER) {
+        setX(toSceneX(EllipseItem::P_XCENTER));
+    }
+    else if(propertyName == EllipseItem::P_YCENTER) {
+        setY(toSceneY(EllipseItem::P_YCENTER));
+    }
+    else if(propertyName == EllipseItem::P_ANGLE) {
+        setTransform(QTransform().rotate(-1.0*par(EllipseItem::P_ANGLE)));
+    }
+    else if(propertyName == MaskItem::P_MASK_VALUE) {
+        update();
+    }
+
+    m_block_on_property_change = false;
+}
+
+void EllipseView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    painter->setRenderHints(QPainter::Antialiasing);
+    bool mask_value = m_item->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+    painter->setBrush(MaskEditorHelper::getMaskBrush(mask_value));
+    painter->setPen(MaskEditorHelper::getMaskPen(mask_value));
+    painter->drawEllipse(m_mask_rect);
+}
+
+void EllipseView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(m_activeHandleElement) {
+        QPointF opposPos = mapFromScene(m_resize_opposite_origin);
+        qreal xmin = std::min(event->pos().x(),opposPos.x());
+        qreal xmax = std::max(event->pos().x(),opposPos.x());
+        qreal ymin = std::min(event->pos().y(),opposPos.y());
+        qreal ymax = std::max(event->pos().y(),opposPos.y());
+        qreal width = xmax-xmin;
+        qreal height = ymax-ymin;
+
+        qreal xcenter = xmin + (xmax-xmin)/2.;
+        qreal ycenter = ymin + (ymax-ymin)/2.;
+
+        QPointF center(xcenter, ycenter);
+        QPointF centerInScene = mapToScene(center);
+
+        if(m_activeHandleElement->getHandleType() == SizeHandleElement::RESIZE) {
+            m_item->setItemValue(EllipseItem::P_XCENTER, fromSceneX(centerInScene.x()));
+            m_item->setItemValue(EllipseItem::P_YCENTER, fromSceneY(centerInScene.y()));
+
+            m_item->setItemValue(EllipseItem::P_XRADIUS,
+                                          (fromSceneX(centerInScene.x()+width/2.) -
+                                          fromSceneX(centerInScene.x()-width/2.))/2.);
+            m_item->setItemValue(EllipseItem::P_YRADIUS,
+                                          (fromSceneY(centerInScene.y()-height/2.) -
+                                          fromSceneY(centerInScene.y()+height/2.))/2.);
+
+        } else if(m_activeHandleElement->getHandleType() == SizeHandleElement::RESIZE_HEIGHT) {
+            m_item->setItemValue(EllipseItem::P_YCENTER, fromSceneY(centerInScene.y()));
+            m_item->setItemValue(EllipseItem::P_YRADIUS,
+                                          (fromSceneY(centerInScene.y()-height/2.) -
+                                          fromSceneY(centerInScene.y()+height/2.))/2.);
+
+        } else if(m_activeHandleElement->getHandleType() == SizeHandleElement::RESIZE_WIDTH) {
+            m_item->setItemValue(EllipseItem::P_XCENTER, fromSceneX(centerInScene.x()));
+            m_item->setItemValue(EllipseItem::P_XRADIUS,
+                                          (fromSceneX(centerInScene.x()+width/2.) -
+                                          fromSceneX(centerInScene.x()-width/2.))/2.);
+        }
+
+    } else {
+        IMaskView::mouseMoveEvent(event);
+    }
+}
+
+//! updates position of view using item properties
+
+void EllipseView::update_position()
+{
+    disconnect(this, SIGNAL(xChanged()), this, SLOT(onChangedX()));
+    disconnect(this, SIGNAL(yChanged()), this, SLOT(onChangedY()));
+
+    setX(toSceneX(EllipseItem::P_XCENTER));
+    setY(toSceneY(EllipseItem::P_YCENTER));
+
+    connect(this, SIGNAL(xChanged()), this, SLOT(onChangedX()));
+    connect(this, SIGNAL(yChanged()), this, SLOT(onChangedY()));
+
+    if(par(EllipseItem::P_ANGLE) != 0.0)
+        setTransform(QTransform().rotate(-1.0*par(EllipseItem::P_ANGLE)));
+}
+
+QRectF EllipseView::mask_rectangle()
+{
+    return QRectF(-width()/2., -height()/2., width(), height());
+}
+
+//! returns the x-coordinate of the rectangle's left edge
+
+qreal EllipseView::left() const
+{
+    return toSceneX(par(EllipseItem::P_XCENTER) - par(EllipseItem::P_XRADIUS));
+}
+
+//! returns the x-coordinate of the rectangle's right edge
+
+qreal EllipseView::right() const
+{
+    return toSceneX(par(EllipseItem::P_XCENTER)+par(EllipseItem::P_XRADIUS));
+}
+
+//! Returns the y-coordinate of the rectangle's top edge.
+
+qreal EllipseView::top() const
+{
+    return toSceneY(par(EllipseItem::P_YCENTER)+par(EllipseItem::P_YRADIUS));
+}
+
+//! Returns the y-coordinate of the rectangle's bottom edge.
+
+qreal EllipseView::bottom() const
+{
+    return toSceneY(par(EllipseItem::P_YCENTER)-par(EllipseItem::P_YRADIUS));
+}
diff --git a/GUI/coregui/Views/MaskWidgets/EllipseView.h b/GUI/coregui/Views/MaskWidgets/EllipseView.h
new file mode 100644
index 0000000..2b5f2a1
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/EllipseView.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/EllipseView.h
+//! @brief     Defines EllipseView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ELLIPSEVIEW_H
+#define ELLIPSEVIEW_H
+
+#include "RectangleBaseView.h"
+
+//! This is a View of ellipse mask (represented by EllipseItem) on GraphicsScene.
+//! Given view follows standard QGraphicsScene notations: (x,y) is top left corner.
+
+class BA_CORE_API_ EllipseView : public RectangleBaseView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::ELLIPSE; }
+
+    EllipseView();
+
+public slots:
+    virtual void onChangedX();
+    virtual void onChangedY();
+    virtual void onPropertyChange(const QString &propertyName);
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+
+private:
+    void update_position();
+    QRectF mask_rectangle();
+    qreal left() const;
+    qreal right() const;
+    qreal top() const;
+    qreal bottom() const;
+};
+
+#endif // ELLIPSEVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.cpp b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp
new file mode 100644
index 0000000..8541b8d
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/IMaskView.cpp
@@ -0,0 +1,158 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/IMaskView.cpp
+//! @brief     Implements interface class IMaskView for all masks on graphics scene
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IMaskView.h"
+#include "ISceneAdaptor.h"
+#include "MaskItems.h"
+#include "SessionItem.h"
+#include <QAction>
+#include <QDebug>
+#include <QGraphicsSceneContextMenuEvent>
+#include <QMenu>
+#include <QPainter>
+
+IMaskView::IMaskView()
+    : m_item(0)
+    , m_adaptor(0)
+{
+    connect(this, SIGNAL(xChanged()), this, SLOT(onChangedX()));
+    connect(this, SIGNAL(yChanged()), this, SLOT(onChangedY()));
+}
+
+IMaskView::~IMaskView()
+{
+    if(m_item)
+        m_item->mapper()->unsubscribe(this);
+}
+
+QRectF IMaskView::boundingRect() const
+{
+    return m_bounding_rect;
+}
+
+void IMaskView::setParameterizedItem(SessionItem *item)
+{
+    if(m_item == item) {
+        return;
+
+    } else {
+        if(m_item)
+            m_item->mapper()->unsubscribe(this);
+
+        m_item = item;
+        if(!m_item) return;
+
+        m_item->mapper()->setOnPropertyChange(
+                    [this](const QString &name)
+        {
+            onPropertyChange(name);
+        }, this);
+    }
+}
+
+SessionItem *IMaskView::getParameterizedItem()
+{
+    return m_item;
+}
+
+const ISceneAdaptor *IMaskView::getAdaptor()
+{
+    return m_adaptor;
+}
+
+void IMaskView::setSceneAdaptor(const ISceneAdaptor *adaptor)
+{
+    Q_ASSERT(adaptor);
+
+    if(m_adaptor != adaptor) {
+        if(m_adaptor) {
+            disconnect(m_adaptor, SIGNAL(update_request()), this, SLOT(update_view()));
+        }
+
+        m_adaptor = adaptor;
+        connect(m_adaptor, SIGNAL(update_request()), this,
+                SLOT(update_view()), Qt::UniqueConnection);
+        update_view();
+    }
+}
+
+double IMaskView::par(const QString &property_name) const
+{
+    return m_item->getItemValue(property_name).toReal();
+}
+
+qreal IMaskView::toSceneX(const QString &property_name) const
+{
+    return toSceneX(m_item->getItemValue(property_name).toReal());
+}
+
+qreal IMaskView::toSceneX(qreal value) const
+{
+    qreal result = value;
+    if(m_adaptor) result = m_adaptor->toSceneX(result);
+    return result;
+}
+
+qreal IMaskView::toSceneY(const QString &property_name) const
+{
+    return toSceneY(m_item->getItemValue(property_name).toReal());
+}
+
+qreal IMaskView::toSceneY(qreal value) const
+{
+    qreal result = value;
+    if(m_adaptor) result = m_adaptor->toSceneY(result);
+    return result;
+}
+
+qreal IMaskView::fromSceneX(qreal value) const
+{
+    qreal result = value;
+    if(m_adaptor) result = m_adaptor->fromSceneX(value);
+    return result;
+}
+
+qreal IMaskView::fromSceneY(qreal value) const
+{
+    qreal result = value;
+    if(m_adaptor) result = m_adaptor->fromSceneY(value);
+    return result;
+}
+
+void IMaskView::addView(IMaskView *childView, int row)
+{
+    Q_UNUSED(row);
+    if(childItems().contains(childView)) return;
+    childView->setParentItem(this);
+}
+
+void IMaskView::onChangedX()
+{
+}
+
+void IMaskView::onChangedY()
+{
+}
+
+void IMaskView::onPropertyChange(const QString &propertyName)
+{
+    qDebug() << "IMaskView::onPropertyChange ->" << propertyName;
+    if(propertyName == MaskItem::P_MASK_VALUE) {
+        update();
+    }
+
+    emit propertyChanged();
+}
diff --git a/GUI/coregui/Views/MaskWidgets/IMaskView.h b/GUI/coregui/Views/MaskWidgets/IMaskView.h
new file mode 100644
index 0000000..4bf6a6d
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/IMaskView.h
@@ -0,0 +1,78 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/IMaskView.h
+//! @brief     Defines interface class IMaskView for all masks on graphics scene
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMASKVIEW_H
+#define IMASKVIEW_H
+
+#include "MaskEditorHelper.h"
+#include "WinDllMacros.h"
+#include <QGraphicsObject>
+#include <memory>
+
+class SessionItem;
+class ISceneAdaptor;
+class QPainter;
+
+//! Main interface class for views representing MaskItems on graphics scene
+
+class BA_CORE_API_ IMaskView : public QGraphicsObject
+{
+    Q_OBJECT
+public:
+    virtual int type() const { return MaskEditorHelper::IMASKVIEW; }
+
+    IMaskView();
+    virtual ~IMaskView();
+
+    QRectF boundingRect() const;
+
+    virtual void setParameterizedItem(SessionItem *item);
+    virtual SessionItem *getParameterizedItem();
+
+    const ISceneAdaptor *getAdaptor();
+    virtual void setSceneAdaptor(const ISceneAdaptor *adaptor);
+
+    double par(const QString &property_name) const;
+
+    qreal toSceneX(const QString &property_name) const;
+    qreal toSceneX(qreal value) const;
+    qreal toSceneY(const QString &property_name) const;
+    qreal toSceneY(qreal value) const;
+
+    //! convert scene coordinates to ColorMap plot coordinates
+    qreal fromSceneX(qreal value) const;
+    qreal fromSceneY(qreal value) const;
+
+    virtual void addView(IMaskView *childView, int row = 0);
+
+signals:
+    void propertyChanged();
+
+public slots:
+    //! update visual appearance of view (triggered by ISceneAdaptor)
+    virtual void update_view() = 0;
+    virtual void onChangedX();
+    virtual void onChangedY();
+    virtual void onPropertyChange(const QString &propertyName);
+
+protected:
+    SessionItem *m_item;
+    const ISceneAdaptor *m_adaptor;
+    QRectF m_bounding_rect;
+};
+
+#endif // IMASKVIEW_H
+
diff --git a/GUI/coregui/Views/MaskWidgets/ISceneAdaptor.h b/GUI/coregui/Views/MaskWidgets/ISceneAdaptor.h
new file mode 100644
index 0000000..9c6b63c
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/ISceneAdaptor.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/ISceneAdaptor.h
+//! @brief     Defines interface class ISceneAdaptor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISCENEADAPTOR_H
+#define ISCENEADAPTOR_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+#include <QRectF>
+
+//! Interface to adapt MaskItems coordinates (expressed in units of IntensityDataItem)
+//! to/from scene coordinates.
+
+class BA_CORE_API_ ISceneAdaptor : public QObject
+{
+    Q_OBJECT
+public:
+    virtual ~ISceneAdaptor(){}
+
+    //! convert native mask x-coordinate to scene coordinate
+    virtual qreal toSceneX(qreal) const = 0;
+    //! convert native mask y-coordinate to scene coordinate
+    virtual qreal toSceneY(qreal) const = 0;
+    //! convert scene x-coordinate to native mask coordinate
+    virtual qreal fromSceneX(qreal) const = 0;
+    //! convert scene y-coordinate to native mask coordinate
+    virtual qreal fromSceneY(qreal) const = 0;
+
+    //! returns viewport rectangle in scene coordinates
+    virtual const QRectF& getViewportRectangle() const { return m_viewport_rectangle; }
+
+signals:
+    void update_request();
+
+protected:
+    QRectF m_viewport_rectangle;
+};
+
+class BA_CORE_API_ DefaultSceneAdaptor : public ISceneAdaptor
+{
+    Q_OBJECT
+public:
+    DefaultSceneAdaptor(){}
+    qreal toSceneX(qreal value) const { return value; }
+    qreal toSceneY(qreal value) const { return value; }
+    qreal fromSceneX(qreal value) const { return value; }
+    qreal fromSceneY(qreal value) const { return value; }
+};
+
+
+#endif // ISCENEADAPTOR_H
diff --git a/GUI/coregui/Views/MaskWidgets/IntensityDataView.cpp b/GUI/coregui/Views/MaskWidgets/IntensityDataView.cpp
new file mode 100644
index 0000000..dc4c1c5
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/IntensityDataView.cpp
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/IntensityDataView.cpp
+//! @brief     Implements IntensityDataView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IntensityDataView.h"
+#include "ISceneAdaptor.h"
+#include <QBrush>
+#include <QDebug>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+
+
+IntensityDataView::IntensityDataView()
+{
+    // the key flag to not to draw children going outside ot given shape
+    setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
+}
+
+void IntensityDataView::update_view()
+{
+//    prepareGeometryChange();
+    m_bounding_rect = m_adaptor->getViewportRectangle();
+    update();
+}
+
+void IntensityDataView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    Q_UNUSED(painter);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/IntensityDataView.h b/GUI/coregui/Views/MaskWidgets/IntensityDataView.h
new file mode 100644
index 0000000..51f4f63
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/IntensityDataView.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/IntensityDataView.h
+//! @brief     Defines IntensityDataView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTENSITYDATAVIEW_H
+#define INTENSITYDATAVIEW_H
+
+#include "IMaskView.h"
+#include "SizeHandleElement.h"
+#include <QMap>
+
+//! The IntensityDataView is nothing move than just transparent rectangle to cover axes area
+//! of ColorMapPlot inside MaskGraphicsScene. The goal of this rectangle is to hide all MaskViews
+//! if they are going outside of ColorMapPlot.
+//!
+//! The size of the rectangle always matches axes viewport at any zoom level.
+//! All MasksViews are added to IntensityDataView as children.
+
+class BA_CORE_API_ IntensityDataView : public IMaskView
+{
+    Q_OBJECT
+public:
+    IntensityDataView();
+
+public slots:
+    void update_view();
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+};
+
+#endif // INTENSITYDATAVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/LineViews.cpp b/GUI/coregui/Views/MaskWidgets/LineViews.cpp
new file mode 100644
index 0000000..e82285b
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/LineViews.cpp
@@ -0,0 +1,159 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/LineViews.cpp
+//! @brief     Implements classes VerticalLineView and HorizontalLineView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "LineViews.h"
+#include "ColorMapSceneAdaptor.h"
+#include "MaskEditorHelper.h"
+#include "MaskItems.h"
+#include <QCursor>
+#include <QDebug>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+
+namespace {
+const double mask_width = 8.0;
+const double mask_visible_width = 3.0;
+}
+
+VerticalLineView::VerticalLineView()
+    : m_block_on_property_change(false)
+{
+    setFlag(QGraphicsItem::ItemIsSelectable);
+    setFlag(QGraphicsItem::ItemIsMovable);
+    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+    setCursor(Qt::SizeHorCursor);
+}
+
+void VerticalLineView::onChangedX()
+{
+    m_block_on_property_change = true;
+    m_item->setItemValue(VerticalLineItem::P_POSX, fromSceneX(this->x()));
+    m_block_on_property_change = false;
+}
+
+void VerticalLineView::onPropertyChange(const QString &propertyName)
+{
+    if(m_block_on_property_change) return;
+    if(propertyName == VerticalLineItem::P_POSX) {
+        setX(toSceneX(VerticalLineItem::P_POSX));
+    }
+}
+
+void VerticalLineView::update_view()
+{
+    QRectF plot_scene_rectangle = m_adaptor->getViewportRectangle();
+
+    setX(toSceneX(VerticalLineItem::P_POSX));
+    setY(plot_scene_rectangle.top());
+
+    m_bounding_rect = QRectF(-mask_width/2., 0.0, mask_width, plot_scene_rectangle.height());
+    update();
+}
+
+void VerticalLineView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    bool mask_value = m_item->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+    painter->setBrush(MaskEditorHelper::getMaskBrush(mask_value));
+    painter->setPen(MaskEditorHelper::getMaskPen(mask_value));
+    painter->drawRect(QRectF(-mask_visible_width/2., 0.0, mask_visible_width,
+                             m_bounding_rect.height()));
+
+    if(isSelected()) {
+        QPen pen;
+        pen.setStyle(Qt::DashLine);
+        painter->setPen(pen);
+        painter->setBrush(Qt::NoBrush);
+        painter->drawRect(QRectF(-mask_visible_width/2., 0.0, mask_visible_width,
+                                 m_bounding_rect.height()));
+    }
+}
+
+//! Allows item movement along x, prevent movement along y
+QVariant VerticalLineView::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+{
+    if (isSelected() && change == ItemPositionChange && scene()) {
+          QPointF newPos = value.toPointF();
+          newPos.setY(y());
+          return newPos;
+      }
+    return QGraphicsItem::itemChange(change, value);
+}
+
+// ------------------------------------------------------------------------- //
+
+HorizontalLineView::HorizontalLineView()
+    : m_block_on_property_change(false)
+{
+    setFlag(QGraphicsItem::ItemIsSelectable);
+    setFlag(QGraphicsItem::ItemIsMovable);
+    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+    setCursor(Qt::SizeVerCursor);
+}
+
+void HorizontalLineView::onChangedY()
+{
+    m_block_on_property_change = true;
+    m_item->setItemValue(HorizontalLineItem::P_POSY, fromSceneY(this->y()));
+    m_block_on_property_change = false;
+}
+
+void HorizontalLineView::onPropertyChange(const QString &propertyName)
+{
+    if(m_block_on_property_change) return;
+    if(propertyName == HorizontalLineItem::P_POSY) {
+        setY(toSceneY(HorizontalLineItem::P_POSY));
+    }
+}
+
+void HorizontalLineView::update_view()
+{
+    QRectF plot_scene_rectangle = m_adaptor->getViewportRectangle();
+
+    setX(plot_scene_rectangle.left());
+    setY(toSceneY(HorizontalLineItem::P_POSY));
+
+    m_bounding_rect = QRectF(0.0, -mask_width/2., plot_scene_rectangle.width(), mask_width);
+    update();
+}
+
+void HorizontalLineView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    bool mask_value = m_item->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+    painter->setBrush(MaskEditorHelper::getMaskBrush(mask_value));
+    painter->setPen(MaskEditorHelper::getMaskPen(mask_value));
+    painter->drawRect(QRectF( 0.0, -mask_visible_width/2., m_bounding_rect.width(),
+                              mask_visible_width));
+
+    if(isSelected()) {
+        QPen pen;
+        pen.setStyle(Qt::DashLine);
+        painter->setPen(pen);
+        painter->setBrush(Qt::NoBrush);
+        painter->drawRect(QRectF(0.0, -mask_visible_width/2., m_bounding_rect.width(),
+                                 mask_visible_width));
+    }
+}
+
+//! Allows item movement along y, prevent movement along x
+QVariant HorizontalLineView::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+{
+    if (isSelected() && change == ItemPositionChange && scene()) {
+          QPointF newPos = value.toPointF();
+          newPos.setX(x());
+          return newPos;
+      }
+    return QGraphicsItem::itemChange(change, value);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/LineViews.h b/GUI/coregui/Views/MaskWidgets/LineViews.h
new file mode 100644
index 0000000..3a9914e
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/LineViews.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/LineViews.h
+//! @brief     Defines classes VerticalLineView and HorizontalLineView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LINEVIEWS_H
+#define LINEVIEWS_H
+
+#include "IMaskView.h"
+
+//! This is a view of VerticalLineItem mask
+
+class BA_CORE_API_ VerticalLineView : public IMaskView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::VERTICALLINE; }
+
+    VerticalLineView();
+
+public slots:
+    virtual void update_view();
+    virtual void onChangedX();
+    virtual void onPropertyChange(const QString &propertyName);
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+private:
+    bool m_block_on_property_change;
+};
+
+//! This is a view of HorizontalLineItem mask
+
+class BA_CORE_API_ HorizontalLineView : public IMaskView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::HORIZONTALLINE; }
+
+    HorizontalLineView();
+
+public slots:
+    virtual void update_view();
+    virtual void onChangedY();
+    virtual void onPropertyChange(const QString &propertyName);
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+private:
+    bool m_block_on_property_change;
+};
+
+
+#endif // LINEVIEWS_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskAllView.cpp b/GUI/coregui/Views/MaskWidgets/MaskAllView.cpp
new file mode 100644
index 0000000..080cea8
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskAllView.cpp
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskAllView.cpp
+//! @brief     Implements MaskAllView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskAllView.h"
+#include "ColorMapSceneAdaptor.h"
+#include "MaskEditorHelper.h"
+#include "MaskItems.h"
+#include <QBrush>
+#include <QDebug>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+
+MaskAllView::MaskAllView()
+{
+    setFlag(QGraphicsItem::ItemIsSelectable);
+
+}
+
+void MaskAllView::update_view()
+{
+//    prepareGeometryChange();
+    m_bounding_rect = m_adaptor->getViewportRectangle();
+    update();
+}
+
+void MaskAllView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+//    painter->setRenderHints(QPainter::Antialiasing);
+    QColor color(250, 250, 240, 150);
+    painter->setBrush(color);
+    painter->drawRect(m_bounding_rect);
+
+    if(isSelected()) {
+        QPen pen;
+        pen.setStyle(Qt::DashLine);
+        painter->setPen(pen);
+        painter->setBrush(Qt::NoBrush);
+        painter->drawRect(m_bounding_rect);
+    }
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskAllView.h b/GUI/coregui/Views/MaskWidgets/MaskAllView.h
new file mode 100644
index 0000000..ffbd03e
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskAllView.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskAllView.h
+//! @brief     Defines MaskAllView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKALLVIEW_H
+#define MASKALLVIEW_H
+
+#include "IMaskView.h"
+
+//! This is a view of MaskAllItem which covers whole detector plane with mask value=true.
+
+class BA_CORE_API_ MaskAllView : public IMaskView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::MASKALL; }
+
+    MaskAllView();
+
+public slots:
+    virtual void update_view();
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+};
+
+#endif // MASKALLVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskContainerView.cpp b/GUI/coregui/Views/MaskWidgets/MaskContainerView.cpp
new file mode 100644
index 0000000..edb06c7
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskContainerView.cpp
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskContainerView.cpp
+//! @brief     Implements MaskContainerView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskContainerView.h"
+#include "ISceneAdaptor.h"
+#include <QBrush>
+#include <QDebug>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+
+MaskContainerView::MaskContainerView()
+{
+    // the key flag to not to draw children going outside ot given shape
+    setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
+}
+
+void MaskContainerView::update_view()
+{
+    m_bounding_rect = m_adaptor->getViewportRectangle();
+    update();
+}
+
+void MaskContainerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    Q_UNUSED(painter);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskContainerView.h b/GUI/coregui/Views/MaskWidgets/MaskContainerView.h
new file mode 100644
index 0000000..d87d244
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskContainerView.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskContainerView.h
+//! @brief     Defines MaskContainerView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKCONTAINERVIEW_H
+#define MASKCONTAINERVIEW_H
+
+#include "IMaskView.h"
+#include "SizeHandleElement.h"
+#include <QMap>
+
+//! The MaskContainerView is nothing move than just transparent rectangle to cover axes area
+//! of ColorMapPlot inside MaskGraphicsScene. The goal of this rectangle is to hide all MaskViews
+//! if they are going outside of ColorMapPlot.
+//!
+//! The size of the rectangle always matches axes viewport at any zoom level.
+//! All MasksViews are added to MaskContainerView as children.
+
+class BA_CORE_API_ MaskContainerView : public IMaskView
+{
+    Q_OBJECT
+public:
+    MaskContainerView();
+
+public slots:
+    void update_view();
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+};
+
+#endif // MASKCONTAINERVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskDrawingContext.cpp b/GUI/coregui/Views/MaskWidgets/MaskDrawingContext.cpp
new file mode 100644
index 0000000..3f9e15b
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskDrawingContext.cpp
@@ -0,0 +1,143 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskDrawingContext.cpp
+//! @brief     Implements class MaskDrawingContext
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskDrawingContext.h"
+#include "item_constants.h"
+#include <QDebug>
+
+MaskDrawingContext::MaskDrawingContext()
+    : m_current_activity(MaskEditorFlags::PAN_ZOOM_MODE)
+    , m_mask_value(MaskEditorFlags::MASK_ON)
+    , m_drawing_in_progress(false)
+{
+
+}
+
+MaskEditorFlags::Activity MaskDrawingContext::getActivityType() const
+{
+    return m_current_activity;
+}
+
+void MaskDrawingContext::setActivityType(MaskEditorFlags::Activity value)
+{
+    m_current_activity = value;
+}
+
+void MaskDrawingContext::setMaskValue(MaskEditorFlags::MaskValue value)
+{
+    qDebug() << "MaskDrawingContext::setMaskValue" << value;
+    m_mask_value = value;
+}
+
+bool MaskDrawingContext::isSelectionMode() const
+{
+    return m_current_activity == MaskEditorFlags::SELECTION_MODE;
+}
+
+bool MaskDrawingContext::isInZoomMode() const
+{
+    return m_current_activity == MaskEditorFlags::PAN_ZOOM_MODE;
+}
+
+bool MaskDrawingContext::isRectangleShapeMode() const
+{
+    return (m_current_activity == MaskEditorFlags::RECTANGLE_MODE) ||
+           (m_current_activity == MaskEditorFlags::ELLIPSE_MODE) ||
+           (m_current_activity == MaskEditorFlags::ROI_MODE);
+}
+
+bool MaskDrawingContext::isRectangleMode() const
+{
+    return m_current_activity == MaskEditorFlags::RECTANGLE_MODE;
+}
+
+bool MaskDrawingContext::isEllipseMode() const
+{
+    return m_current_activity == MaskEditorFlags::ELLIPSE_MODE;
+}
+
+bool MaskDrawingContext::isPolygonMode() const
+{
+    return m_current_activity == MaskEditorFlags::POLYGON_MODE;
+}
+
+bool MaskDrawingContext::isLineMode() const
+{
+    return isVerticalLineMode() || isHorizontalLineMode();
+}
+
+bool MaskDrawingContext::isVerticalLineMode() const
+{
+    return m_current_activity == MaskEditorFlags::VERTICAL_LINE_MODE;
+}
+
+bool MaskDrawingContext::isHorizontalLineMode() const
+{
+    return m_current_activity == MaskEditorFlags::HORIZONTAL_LINE_MODE;
+}
+
+bool MaskDrawingContext::isMaskAllMode() const
+{
+    return m_current_activity == MaskEditorFlags::MASKALL_MODE;
+}
+
+bool MaskDrawingContext::isROIMode() const
+{
+    return m_current_activity == MaskEditorFlags::ROI_MODE;
+}
+
+bool MaskDrawingContext::isDrawingInProgress() const
+{
+    return m_drawing_in_progress;
+}
+
+void MaskDrawingContext::setDrawingInProgress(bool value)
+{
+    m_drawing_in_progress = value;
+}
+
+bool MaskDrawingContext::getMaskValue() const
+{
+    return bool(m_mask_value);
+}
+
+//! return true, if proposed activity requires the cancel of drawing
+//! i.e. there is an ungoing polygon drawing, but user wants to start other drawing
+bool MaskDrawingContext::isActivityRequiresDrawingCancel(MaskEditorFlags::Activity proposed_new_activity)
+{
+    if(isDrawingInProgress() && isPolygonMode()
+            && proposed_new_activity >= MaskEditorFlags::PAN_ZOOM_MODE) return true;
+    return false;
+}
+
+//! Returns model type corresponding to current activity.
+
+QString MaskDrawingContext::activityToModelType() const
+{
+    if(isRectangleMode()) return Constants::RectangleMaskType;
+    if(isEllipseMode()) return Constants::EllipseMaskType;
+    if(isROIMode()) return Constants::RegionOfInterestType;
+    return QString();
+}
+
+//! Returns model row corresponding to given activity. All shapes, except ROI, will be added
+//! on top of each other. ROI shape will be added at the bottom.
+
+int MaskDrawingContext::activityToRow() const
+{
+    if(isROIMode()) return -1;
+    return 0;
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskDrawingContext.h b/GUI/coregui/Views/MaskWidgets/MaskDrawingContext.h
new file mode 100644
index 0000000..82d3802
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskDrawingContext.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskDrawingContext.h
+//! @brief     Defines class MaskDrawingContext
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKDRAWINGCONTEXT_H
+#define MASKDRAWINGCONTEXT_H
+
+#include "MaskEditorFlags.h"
+#include "WinDllMacros.h"
+
+//! Helper class for MaskGraphicsScene to hold drawing conditions
+
+class BA_CORE_API_ MaskDrawingContext
+{
+public:
+    MaskDrawingContext();
+
+    MaskEditorFlags::Activity getActivityType() const;
+    void setActivityType(MaskEditorFlags::Activity value);
+    void setMaskValue(MaskEditorFlags::MaskValue value);
+
+    bool isSelectionMode() const;
+    bool isInZoomMode() const;
+    bool isRectangleShapeMode() const;
+    bool isRectangleMode() const;
+    bool isEllipseMode() const;
+    bool isPolygonMode() const;
+    bool isLineMode() const;
+    bool isVerticalLineMode() const;
+    bool isHorizontalLineMode() const;
+    bool isMaskAllMode() const;
+    bool isROIMode() const;
+
+    bool isDrawingInProgress() const;
+    void setDrawingInProgress(bool value);
+
+    bool getMaskValue() const;
+
+    bool isActivityRequiresDrawingCancel(MaskEditorFlags::Activity proposed_new_activity);
+
+    QString activityToModelType() const;
+    int activityToRow() const;
+
+private:
+
+    MaskEditorFlags::Activity m_current_activity;
+    MaskEditorFlags::MaskValue m_mask_value;
+    bool m_drawing_in_progress;
+};
+
+
+#endif // MASKDRAWINGCONTEXT_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp
new file mode 100644
index 0000000..21d4649
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp
@@ -0,0 +1,161 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditor.cpp
+//! @brief     Implements class MaskEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskEditor.h"
+#include "GISASSimulation.h"
+#include "GUIHelpers.h"
+#include "IntensityDataItem.h"
+#include "MaskEditorActions.h"
+#include "MaskEditorCanvas.h"
+#include "MaskEditorPropertyPanel.h"
+#include "MaskEditorToolBar.h"
+#include "MaskGraphicsScene.h"
+#include "MaskGraphicsView.h"
+#include "MaskItems.h"
+#include "MultiLayer.h"
+#include "SampleBuilderFactory.h"
+#include "SessionModel.h"
+#include "SimulationFactory.h"
+#include "minisplitter.h"
+#include <QBoxLayout>
+#include <QContextMenuEvent>
+#include <QDebug>
+#include <QMenu>
+
+MaskEditor::MaskEditor(QWidget* parent)
+    : QMainWindow(parent)
+    , m_editorActions(new MaskEditorActions(this))
+    , m_toolBar(new MaskEditorToolBar(m_editorActions))
+    , m_editorPropertyPanel(new MaskEditorPropertyPanel)
+    , m_editorCanvas(new MaskEditorCanvas)
+    , m_splitter(new Manhattan::MiniSplitter)
+{
+    setObjectName(QStringLiteral("MaskEditor"));
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    m_splitter->addWidget(m_editorCanvas);
+    m_splitter->addWidget(m_editorPropertyPanel);
+    m_splitter->setCollapsible(1, true);
+
+    addToolBar(Qt::RightToolBarArea, m_toolBar);
+
+    setCentralWidget(m_splitter);
+
+    setup_connections();
+
+    m_editorPropertyPanel->setPanelHidden(true);
+}
+
+void MaskEditor::setMaskContext(SessionModel* model, const QModelIndex &maskContainerIndex,
+                                IntensityDataItem* intensityItem)
+{
+    m_editorPropertyPanel->setMaskContext(model, maskContainerIndex, intensityItem);
+
+    Q_ASSERT(intensityItem);
+    Q_ASSERT(maskContainerIndex.isValid());
+    Q_ASSERT(model->itemForIndex(maskContainerIndex)->modelType() == Constants::MaskContainerType);
+
+    m_editorCanvas->setMaskContext(model, maskContainerIndex, intensityItem);
+    m_editorCanvas->setSelectionModel(m_editorPropertyPanel->selectionModel());
+
+    m_editorActions->setModel(model, maskContainerIndex);
+    m_editorActions->setSelectionModel(m_editorPropertyPanel->selectionModel());
+}
+
+//! shows/hides right panel with properties
+void MaskEditor::onPropertyPanelRequest()
+{
+    m_editorPropertyPanel->setPanelHidden(!m_editorPropertyPanel->isHidden());
+}
+
+//! Context menu reimplemented to supress default menu
+void MaskEditor::contextMenuEvent(QContextMenuEvent* event)
+{
+    Q_UNUSED(event);
+}
+
+//! Returns list of actions intended for styled toolbar (on the top).
+
+QList<QAction *> MaskEditor::topToolBarActions()
+{
+    return m_editorActions->topToolBarActions();
+}
+
+void MaskEditor::setup_connections()
+{
+    // reset view request is propagated from editorActions to graphics view
+    connect(m_editorActions,
+            SIGNAL(resetViewRequest()),
+            m_editorCanvas,
+            SLOT(onResetViewRequest())
+            );
+
+    // tool panel request is propagated from editorActions to this MaskEditor
+    connect(m_editorActions,
+            SIGNAL(propertyPanelRequest()),
+            this,
+            SLOT(onPropertyPanelRequest())
+            );
+
+    // save plot request is propagated from editorActions to graphics scene
+    connect(m_editorActions,
+            SIGNAL(savePlotRequest()),
+            m_editorCanvas,
+            SLOT(onSavePlotRequest())
+            );
+
+    // selection/drawing activity is propagated from ToolBar to graphics scene
+    connect(m_toolBar,
+            SIGNAL(activityModeChanged(MaskEditorFlags::Activity)),
+            m_editorCanvas->getScene(),
+            SLOT(onActivityModeChanged(MaskEditorFlags::Activity))
+            );
+
+    // mask value is propagated from ToolBar to graphics scene
+    connect(m_toolBar,
+            SIGNAL(maskValueChanged(MaskEditorFlags::MaskValue)),
+            m_editorCanvas->getScene(),
+            SLOT(onMaskValueChanged(MaskEditorFlags::MaskValue))
+            );
+
+    // show results request is propagated from ToolBar to Canvas
+    connect(m_toolBar,
+            SIGNAL(presentationTypeRequest(MaskEditorFlags::PresentationType)),
+            m_editorCanvas,
+            SLOT(onPresentationTypeRequest(MaskEditorFlags::PresentationType))
+            );
+
+    // space bar push (request for zoom mode) is propagated from graphics view to ToolBar
+    connect(m_editorCanvas,
+            SIGNAL(changeActivityRequest(MaskEditorFlags::Activity)),
+            m_toolBar,
+            SLOT(onChangeActivityRequest(MaskEditorFlags::Activity))
+            );
+
+    // context menu request is propagated from graphics scene to MaskEditorActions
+    connect(m_editorCanvas->getScene(),
+            SIGNAL(itemContextMenuRequest(QPoint)),
+            m_editorActions,
+            SLOT(onItemContextMenuRequest(QPoint))
+            );
+
+    // context menu request is propagated from PropertyPanel to MaskEditorActions
+    connect(m_editorPropertyPanel,
+            SIGNAL(itemContextMenuRequest(QPoint)),
+            m_editorActions,
+            SLOT(onItemContextMenuRequest(QPoint))
+            );
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditor.h b/GUI/coregui/Views/MaskWidgets/MaskEditor.h
new file mode 100644
index 0000000..497f64b
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditor.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditor.h
+//! @brief     Defines class MaskEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKEDITOR_H
+#define MASKEDITOR_H
+
+#include "WinDllMacros.h"
+#include <QMainWindow>
+#include <QModelIndex>
+#include <QWidget>
+
+class MaskEditorPropertyPanel;
+class MaskEditorActions;
+class MaskEditorToolBar;
+class MaskEditorCanvas;
+class SessionModel;
+class IntensityDataItem;
+namespace Manhattan { class MiniSplitter; }
+
+//! Main class to draw masks on top of intensity data map
+
+class BA_CORE_API_ MaskEditor : public QMainWindow
+{
+    Q_OBJECT
+public:
+    MaskEditor(QWidget *parent = 0);
+
+public slots:
+    //! Main method to setup context for mask editing
+    //! @par model The model which will hold all masks
+    //! @par maskContainerIndex Index of top level MaskContainerItem in the model to hold masks
+    //! @par intensityItem IntensityDataItem which will be used as background for Mask drawing
+    void setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex,
+                        IntensityDataItem *intensityItem);
+
+    void onPropertyPanelRequest();
+
+    QList<QAction *> topToolBarActions();
+
+protected:
+    void contextMenuEvent(QContextMenuEvent *event);
+
+private:
+    void setup_connections();
+
+    MaskEditorActions *m_editorActions;
+    MaskEditorToolBar *m_toolBar;
+    MaskEditorPropertyPanel *m_editorPropertyPanel;
+    MaskEditorCanvas *m_editorCanvas;
+    Manhattan::MiniSplitter *m_splitter;
+};
+
+
+#endif // MASKEDITOR_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorActions.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditorActions.cpp
new file mode 100644
index 0000000..27427de
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorActions.cpp
@@ -0,0 +1,218 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorActions.cpp
+//! @brief     Implement class MaskEditorActions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskEditorActions.h"
+#include "MaskItems.h"
+#include "SessionModel.h"
+#include <QAction>
+#include <QDebug>
+#include <QItemSelectionModel>
+#include <QMenu>
+
+MaskEditorActions::MaskEditorActions(QWidget *parent)
+    : QObject(parent)
+    , m_maskModel(0)
+    , m_selectionModel(0)
+{
+    m_toggleMaskValueAction = new QAction(QStringLiteral("Toggle mask value"), parent);
+    connect(m_toggleMaskValueAction, SIGNAL(triggered()), this, SLOT(onToggleMaskValueAction()));
+
+    m_bringToFrontAction = new QAction(QStringLiteral("Rise mask up"), parent);
+    m_bringToFrontAction->setIcon(QIcon(":/MaskWidgets/images/maskeditor_bringtofront.svg"));
+    m_bringToFrontAction->setToolTip("Rise selected mask one level up (PgUp)");
+    m_bringToFrontAction->setShortcuts(QKeySequence::MoveToPreviousPage);
+    connect(m_bringToFrontAction, SIGNAL(triggered()), this, SLOT(onBringToFrontAction()));
+
+    m_sendToBackAction = new QAction(QStringLiteral("Lower mask down"), parent);
+    m_sendToBackAction->setIcon(QIcon(":/MaskWidgets/images/maskeditor_sendtoback.svg"));
+    m_sendToBackAction->setToolTip("Lower selected mask one level down (PgDown)");
+    m_sendToBackAction->setShortcuts(QKeySequence::MoveToNextPage);
+    connect(m_sendToBackAction, SIGNAL(triggered()), this, SLOT(onSendToBackAction()));
+
+    m_deleteMaskAction = new QAction(QStringLiteral("Remove mask"), parent);
+    m_deleteMaskAction->setToolTip("Remove selected mask (Del)");
+    m_deleteMaskAction->setShortcuts(QKeySequence::Delete);
+    parent->addAction(m_deleteMaskAction);
+    connect(m_deleteMaskAction, SIGNAL(triggered()), this, SLOT(onDeleteMaskAction()));
+
+    // Actions for top toolbar
+    m_resetViewAction = new QAction(this);
+    m_resetViewAction->setText("Reset");
+    m_resetViewAction->setIcon(QIcon(":/images/toolbar16light_refresh.svg"));
+    m_resetViewAction->setToolTip("Reset View");
+    connect(m_resetViewAction, SIGNAL(triggered()), this, SIGNAL(resetViewRequest()));
+
+    m_savePlotAction = new QAction(this);
+    m_savePlotAction->setText("Save");
+    m_savePlotAction->setIcon(QIcon(":/images/toolbar16light_save.svg"));
+    m_savePlotAction->setToolTip("Save Plot");
+    connect(m_savePlotAction, SIGNAL(triggered()), this, SIGNAL(savePlotRequest()));
+
+    m_togglePanelAction = new QAction(this);
+    m_togglePanelAction->setText("Properties");
+    m_togglePanelAction->setIcon(QIcon(":/images/toolbar16light_propertypanel.svg"));
+    m_togglePanelAction->setToolTip("Toggle Property Panel");
+    connect(m_togglePanelAction, SIGNAL(triggered()), this, SIGNAL(propertyPanelRequest()));
+}
+
+void MaskEditorActions::setModel(SessionModel *maskModel, const QModelIndex &rootIndex)
+{
+    m_maskModel = maskModel;
+    m_rootIndex = rootIndex;
+}
+
+void MaskEditorActions::setSelectionModel(QItemSelectionModel *selectionModel)
+{
+    m_selectionModel = selectionModel;
+}
+
+QAction *MaskEditorActions::sendToBackAction()
+{
+    return m_sendToBackAction;
+}
+
+QAction *MaskEditorActions::bringToFrontAction()
+{
+    return m_bringToFrontAction;
+}
+
+QList<QAction *> MaskEditorActions::topToolBarActions()
+{
+    return QList<QAction*>() << m_resetViewAction << m_savePlotAction << m_togglePanelAction;
+}
+
+//! Constructs MaskItem context menu following the request from MaskGraphicsScene
+//! or MaskEditorInfoPanel
+void MaskEditorActions::onItemContextMenuRequest(const QPoint &point)
+{
+    QMenu menu;
+    initItemContextMenu(menu);
+    menu.exec(point);
+    setAllActionsEnabled(true);
+}
+
+//! Performs switch of mask value for all selected items (true -> false, false -> true)
+void MaskEditorActions::onToggleMaskValueAction()
+{
+    Q_ASSERT(m_maskModel);
+    Q_ASSERT(m_selectionModel);
+    foreach(QModelIndex itemIndex, m_selectionModel->selectedIndexes()) {
+        if(SessionItem *item =  m_maskModel->itemForIndex(itemIndex)) {
+            bool old_value = item->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+            item->setItemValue(MaskItem::P_MASK_VALUE, !old_value);
+        }
+    }
+}
+
+void MaskEditorActions::onBringToFrontAction()
+{
+    changeMaskStackingOrder(MaskEditorFlags::BRING_TO_FRONT);
+}
+
+void MaskEditorActions::onSendToBackAction()
+{
+    changeMaskStackingOrder(MaskEditorFlags::SEND_TO_BACK);
+}
+
+void MaskEditorActions::onDeleteMaskAction()
+{
+    Q_ASSERT(m_maskModel);
+    Q_ASSERT(m_selectionModel);
+
+    QModelIndexList indexes = m_selectionModel->selectedIndexes();
+    while (indexes.size()) {
+        m_maskModel->removeRows(indexes.back().row(), 1, indexes.back().parent());
+        indexes = m_selectionModel->selectedIndexes();
+    }
+}
+
+//! Lower mask one level down or rise one level up in the masks stack
+void MaskEditorActions::changeMaskStackingOrder(MaskEditorFlags::Stacking value)
+{
+    if(!m_maskModel || !m_selectionModel) return;
+
+    int change_in_row(0);
+    if(value == MaskEditorFlags::BRING_TO_FRONT) change_in_row = -1;
+    if(value == MaskEditorFlags::SEND_TO_BACK) change_in_row = 2;
+
+    QModelIndexList indexes = m_selectionModel->selectedIndexes();
+
+    foreach(QModelIndex itemIndex, indexes) {
+        if(SessionItem *item =  m_maskModel->itemForIndex(itemIndex)) {
+            int new_row = itemIndex.row() + change_in_row;
+            if(new_row >= 0 && new_row <= m_maskModel->rowCount(m_rootIndex)) {
+                SessionItem *newItem = m_maskModel->moveParameterizedItem(
+                            item,m_maskModel->itemForIndex(m_rootIndex), new_row);
+                m_selectionModel->select(m_maskModel->indexOfItem(newItem),
+                                         QItemSelectionModel::Select);
+            }
+        }
+    }
+}
+
+//! Returns true if at least one of MaskItems in the selection can be moved one level up
+//! (Naturally, it is always true, if selection contains more than one item. If selection contains
+//! only one item, the result will depend on position of item on the stack.
+//! Top item can't be moved up. Used to disable corresponding context menu line.)
+bool MaskEditorActions::isBringToFrontPossible() const
+{
+    bool result(false);
+    QModelIndexList indexes = m_selectionModel->selectedIndexes();
+    if(indexes.size() == 1 && indexes.front().row() != 0) result=true;
+    return result;
+}
+
+//! Returns true if at least one of MaskItems in the selection can be moved one level down.
+bool MaskEditorActions::isSendToBackPossible() const
+{
+    bool result(false);
+    QModelIndexList indexes = m_selectionModel->selectedIndexes();
+    if(indexes.size() == 1) {
+        SessionItem *item = m_maskModel->itemForIndex(indexes.front());
+        if(indexes.front().row() != item->parent()->rowCount() -1) result = true;
+    }
+    return result;
+}
+
+void MaskEditorActions::setAllActionsEnabled(bool value)
+{
+    m_sendToBackAction->setEnabled(value);
+    m_bringToFrontAction->setEnabled(value);
+    m_toggleMaskValueAction->setEnabled(value);
+    m_deleteMaskAction->setEnabled(value);
+}
+
+//! Init external context menu with currently defined actions.
+//! Triggered from MaskGraphicsScene of MaskEditorInfoPanel (QListView)
+void MaskEditorActions::initItemContextMenu(QMenu &menu)
+{
+    if(!m_rootIndex.isValid()) return;
+
+    Q_ASSERT(m_maskModel);
+    Q_ASSERT(m_selectionModel);
+
+    if(m_selectionModel->selectedIndexes().isEmpty()) {
+        setAllActionsEnabled(false);
+    }
+    m_sendToBackAction->setEnabled(isSendToBackPossible());
+    m_bringToFrontAction->setEnabled(isBringToFrontPossible());
+
+    menu.addAction(m_toggleMaskValueAction);
+    menu.addAction(m_bringToFrontAction);
+    menu.addAction(m_sendToBackAction);
+    menu.addSeparator();
+    menu.addAction(m_deleteMaskAction);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorActions.h b/GUI/coregui/Views/MaskWidgets/MaskEditorActions.h
new file mode 100644
index 0000000..0004f76
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorActions.h
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorActions.h
+//! @brief     Defines class MaskEditorActions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKEDITORACTIONS_H
+#define MASKEDITORACTIONS_H
+
+#include "MaskEditorFlags.h"
+#include "WinDllMacros.h"
+#include <QModelIndex>
+#include <QObject>
+#include <QList>
+
+class QAction;
+class SessionModel;
+class QItemSelectionModel;
+class QMenu;
+class QMenu;
+
+//! Defines actions for MaskEditor which are related to selected MaskItem (toggle mask value,
+//! lower/rize mask in the stack, delete mask). If more than one MaskItem is selected,
+//! action will be applied to the whole selection, if possible.
+
+class BA_CORE_API_ MaskEditorActions : public QObject
+{
+    Q_OBJECT
+public:
+    MaskEditorActions(QWidget *parent);
+
+    void setModel(SessionModel *maskModel, const QModelIndex &rootIndex);
+    void setSelectionModel(QItemSelectionModel *selectionModel);
+
+    QAction *sendToBackAction();
+    QAction *bringToFrontAction();
+
+    QList<QAction *> topToolBarActions();
+
+signals:
+    void resetViewRequest();
+    void propertyPanelRequest();
+    void savePlotRequest();
+
+public slots:
+    void onItemContextMenuRequest(const QPoint &point);
+
+private slots:
+    void onToggleMaskValueAction();
+    void onBringToFrontAction();
+    void onSendToBackAction();
+    void onDeleteMaskAction();
+
+private:
+    void initItemContextMenu(QMenu &menu);
+    void changeMaskStackingOrder(MaskEditorFlags::Stacking value);
+    bool isBringToFrontPossible() const;
+    bool isSendToBackPossible() const;
+    void setAllActionsEnabled(bool value);
+
+    QAction *m_toggleMaskValueAction;
+    QAction *m_bringToFrontAction;
+    QAction *m_sendToBackAction;
+    QAction *m_deleteMaskAction;
+
+    QAction *m_resetViewAction;
+    QAction *m_savePlotAction;
+    QAction *m_togglePanelAction;
+
+    SessionModel *m_maskModel;
+    QModelIndex m_rootIndex; //! Index in the model corresponding to IntensityDataItem
+    QItemSelectionModel *m_selectionModel;
+};
+
+#endif // MASKEDITORACTIONS_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.cpp
new file mode 100644
index 0000000..a2c90a9
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.cpp
@@ -0,0 +1,130 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.cpp
+//! @brief     Implements class MaskEditorCanvas
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskEditorCanvas.h"
+#include "MaskGraphicsProxy.h"
+#include "MaskGraphicsScene.h"
+#include "MaskGraphicsView.h"
+#include "MaskResultsPresenter.h"
+#include "SessionModel.h"
+#include "ColorMapLabel.h"
+#include "SavePlotAssistant.h"
+#include "AppSvc.h"
+#include "projectmanager.h"
+#include "ColorMap.h"
+#include "IntensityDataItem.h"
+#include "MaskItems.h"
+#include <QDebug>
+#include <QGraphicsRectItem>
+#include <QModelIndex>
+#include <QVBoxLayout>
+
+
+MaskEditorCanvas::MaskEditorCanvas(QWidget *parent)
+    : QWidget(parent)
+    , m_scene(new MaskGraphicsScene(this))
+    , m_view(new MaskGraphicsView(m_scene))
+    , m_intensityDataItem(0)
+    , m_statusLabel(new ColorMapLabel(0, this))
+    , m_resultsPresenter(new MaskResultsPresenter(this))
+{
+    setObjectName(QStringLiteral("MaskEditorCanvas"));
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(m_view);
+    mainLayout->addWidget(m_statusLabel);
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    setLayout(mainLayout);
+
+    connect(m_view, SIGNAL(changeActivityRequest(MaskEditorFlags::Activity)),
+            this, SIGNAL(changeActivityRequest(MaskEditorFlags::Activity)));
+
+}
+
+void MaskEditorCanvas::setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex,
+                                      IntensityDataItem *intensityItem)
+{
+    m_intensityDataItem = intensityItem;
+
+    m_scene->setMaskContext(model, maskContainerIndex, intensityItem);
+    m_resultsPresenter->setMaskContext(model, maskContainerIndex, intensityItem);
+    m_view->updateSize(m_view->size());
+    m_statusLabel->addColorMap(m_scene->colorMap());
+}
+
+void MaskEditorCanvas::setSelectionModel(QItemSelectionModel *model)
+{
+    m_scene->setSelectionModel(model);
+}
+
+MaskGraphicsScene *MaskEditorCanvas::getScene()
+{
+    return m_scene;
+}
+
+void MaskEditorCanvas::onPresentationTypeRequest(MaskEditorFlags::PresentationType presentationType)
+{
+    m_resultsPresenter->updatePresenter(presentationType);
+    m_scene->onPresentationTypeRequest(presentationType);
+}
+
+//! Saves plot into project directory.
+
+void MaskEditorCanvas::onSavePlotRequest()
+{
+    QString dirname = AppSvc::projectManager()->userExportDir();
+
+    SavePlotAssistant saveAssistant;
+    saveAssistant.savePlot(dirname, m_scene->colorMap()->customPlot(), m_intensityDataItem);
+}
+
+void MaskEditorCanvas::onResetViewRequest()
+{
+    m_view->onResetViewRequest();
+
+    if(isAxisRangeMatchData()) {
+        setZoomToROI();
+    } else {
+        m_intensityDataItem->resetView();
+    }
+}
+
+//! Returns true if IntensityData is currently at 100% zoom level
+
+bool MaskEditorCanvas::isAxisRangeMatchData() const
+{
+    Q_ASSERT(m_intensityDataItem);
+
+    if(m_intensityDataItem->getLowerX() != m_intensityDataItem->getXmin()) return false;
+    if(m_intensityDataItem->getUpperX() != m_intensityDataItem->getXmax()) return false;
+    if(m_intensityDataItem->getLowerY() != m_intensityDataItem->getYmin()) return false;
+    if(m_intensityDataItem->getUpperY() != m_intensityDataItem->getYmax()) return false;
+    return true;
+}
+
+void MaskEditorCanvas::setZoomToROI()
+{
+    if(MaskContainerItem *maskContainer = m_intensityDataItem->maskContainerItem()) {
+        if(SessionItem *roiItem = maskContainer->getChildOfType(Constants::RegionOfInterestType)) {
+            m_intensityDataItem->setLowerX(roiItem->getItemValue(RectangleItem::P_XLOW).toDouble());
+            m_intensityDataItem->setUpperX(roiItem->getItemValue(RectangleItem::P_XUP).toDouble());
+            m_intensityDataItem->setLowerY(roiItem->getItemValue(RectangleItem::P_YLOW).toDouble());
+            m_intensityDataItem->setUpperY(roiItem->getItemValue(RectangleItem::P_YUP).toDouble());
+        }
+    }
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.h b/GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.h
new file mode 100644
index 0000000..b667632
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.h
@@ -0,0 +1,66 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorCanvas.h
+//! @brief     Defines class MaskEditorCanvas
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKEDITORCANVAS_H
+#define MASKEDITORCANVAS_H
+
+#include "MaskEditorFlags.h"
+#include <QWidget>
+
+class MaskGraphicsScene;
+class MaskGraphicsView;
+class SessionModel;
+class QItemSelectionModel;
+class QModelIndex;
+class MaskResultsPresenter;
+class IntensityDataItem;
+class ColorMapLabel;
+class IntensityDataItem;
+
+//! Painting widget for MaskEditor, contains graphics scene and graphics view
+
+class MaskEditorCanvas : public QWidget
+{
+    Q_OBJECT
+public:
+    MaskEditorCanvas(QWidget *parent = 0);
+
+    void setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex, IntensityDataItem *intensityItem);
+    void setSelectionModel(QItemSelectionModel *model);
+
+    MaskGraphicsScene *getScene();
+
+signals:
+    void changeActivityRequest(MaskEditorFlags::Activity);
+
+public slots:
+    void onPresentationTypeRequest(MaskEditorFlags::PresentationType presentationType);
+    void onSavePlotRequest();
+    void onResetViewRequest();
+
+private:
+    bool isAxisRangeMatchData() const;
+    void setZoomToROI();
+
+    MaskGraphicsScene *m_scene;
+    MaskGraphicsView *m_view;
+    IntensityDataItem *m_intensityDataItem;
+    ColorMapLabel *m_statusLabel;
+    MaskResultsPresenter *m_resultsPresenter;
+};
+
+
+#endif // MASKEDITORCANVAS_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorFlags.h b/GUI/coregui/Views/MaskWidgets/MaskEditorFlags.h
new file mode 100644
index 0000000..cc22645
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorFlags.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorFlags.h
+//! @brief     Defines class MaskEditorFlags
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKEDITORFLAGS_H
+#define MASKEDITORFLAGS_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+//! Help class to define various flags for MaskEditor operation
+
+class BA_CORE_API_ MaskEditorFlags
+{
+public:
+    enum EActivityType {
+        SELECTION_MODE,
+        PAN_ZOOM_MODE,
+        RECTANGLE_MODE,
+        POLYGON_MODE,
+        VERTICAL_LINE_MODE,
+        HORIZONTAL_LINE_MODE,
+        ELLIPSE_MODE,
+        ROI_MODE,
+        MASKALL_MODE
+    };
+    Q_DECLARE_FLAGS(Activity, EActivityType)
+
+    enum EMoveType {
+        BRING_TO_FRONT,
+        SEND_TO_BACK
+    };
+    Q_DECLARE_FLAGS(Stacking, EMoveType)
+
+    enum EMaskValue {
+        MASK_OFF,
+        MASK_ON
+    };
+    Q_DECLARE_FLAGS(MaskValue, EMaskValue)
+
+    enum EPresentationType {
+        MASK_EDITOR,
+        MASK_PRESENTER
+    };
+    Q_DECLARE_FLAGS(PresentationType, EPresentationType)
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(MaskEditorFlags::Activity)
+Q_DECLARE_OPERATORS_FOR_FLAGS(MaskEditorFlags::Stacking)
+Q_DECLARE_OPERATORS_FOR_FLAGS(MaskEditorFlags::MaskValue)
+Q_DECLARE_OPERATORS_FOR_FLAGS(MaskEditorFlags::PresentationType)
+
+#endif // MASKEDITORFLAGS_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorHelper.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditorHelper.cpp
new file mode 100644
index 0000000..7f2e643
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorHelper.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorHelper.cpp
+//! @brief     Implements class MaskEditorHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskEditorHelper.h"
+#include <QBrush>
+#include <QColor>
+#include <QPen>
+#include <QRectF>
+
+QBrush MaskEditorHelper::getSelectionMarkerBrush()
+{
+    QBrush result;
+    result.setStyle(Qt::SolidPattern);
+    result.setColor(QColor(226, 235, 244));
+    return result;
+}
+
+QPen MaskEditorHelper::getSelectionMarkerPen()
+{
+    return QPen(QColor(99, 162, 217));
+}
+
+QBrush MaskEditorHelper::getMaskBrush(bool mask_value)
+{
+    QBrush result;
+    result.setStyle(Qt::SolidPattern);
+    if(mask_value) {
+        result.setColor(QColor(209, 109, 97)); // deep red
+    } else {
+        result.setColor(QColor(0, 213, 106)); // deep green
+    }
+    return result;
+}
+
+QPen MaskEditorHelper::getMaskPen(bool mask_value)
+{
+    if(mask_value) {
+        return QPen(QColor(165, 80, 76)); // dark red
+    } else {
+        return QPen(QColor(0, 140, 70)); // dark green
+    }
+}
+
+QRectF MaskEditorHelper::getMarkerRectangle(const QPointF &pos)
+{
+    QRectF result(0, 0, 7, 7);
+    result.moveCenter(pos);
+    return result;
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorHelper.h b/GUI/coregui/Views/MaskWidgets/MaskEditorHelper.h
new file mode 100644
index 0000000..0661e41
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorHelper.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorHelper.h
+//! @brief     Defines class MaskEditorHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKEDITORHELPER_H
+#define MASKEDITORHELPER_H
+
+#include "WinDllMacros.h"
+#include <QGraphicsItem>
+
+class QBrush;
+class QPen;
+class QRectF;
+class QPointF;
+
+//! Static class to provide MaskEditor with common settings (colors, gradients, etc)
+
+class BA_CORE_API_ MaskEditorHelper
+{
+public:
+    enum EViewTypes {
+        IMASKVIEW = QGraphicsItem::UserType+1, // = 65537
+        RECTANGLEBASE,
+        RECTANGLE,
+        SIZEHANDLE,
+        POLYGON,
+        POLYGONPOINT,
+        VERTICALLINE,
+        HORIZONTALLINE,
+        ELLIPSE,
+        MASKALL,
+        REGIONOFINTEREST,
+        MASKGRAPHICSPROXY
+    };
+
+    static QBrush getSelectionMarkerBrush();
+    static QPen getSelectionMarkerPen();
+    static QBrush getMaskBrush(bool mask_value);
+    static QPen getMaskPen(bool mask_value);
+    static QRectF getMarkerRectangle(const QPointF &pos);
+};
+
+
+#endif // MASKEDITORHELPER_H
+
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp
new file mode 100644
index 0000000..8dd51f6
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp
@@ -0,0 +1,191 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.cpp
+//! @brief     Implements class MaskEditorPropertyPanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskEditorPropertyPanel.h"
+#include "AccordionWidget.h"
+#include "ComponentEditor.h"
+#include "ContentPane.h"
+#include "IntensityDataItem.h"
+#include "MaskEditorFlags.h"
+#include "SessionModel.h"
+#include <QButtonGroup>
+#include <QDebug>
+#include <QGridLayout>
+#include <QItemSelection>
+#include <QLabel>
+#include <QListView>
+#include <QModelIndexList>
+#include <QPushButton>
+#include <QToolButton>
+#include <QVBoxLayout>
+#include <QTreeView>
+
+
+//! Widget to cheat Accordion to resize correctly.
+
+class EnvelopWidget : public QWidget
+{
+public:
+    EnvelopWidget(QWidget *content)
+    {
+        QVBoxLayout *mainLayout = new QVBoxLayout;
+        mainLayout->setContentsMargins(0,0,0,0);
+        mainLayout->setSpacing(0);
+        setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
+        mainLayout->addWidget(content);
+        setLayout(mainLayout);
+    }
+
+    QSize sizeHint() const { return QSize(128, 500); }
+};
+
+MaskEditorPropertyPanel::MaskEditorPropertyPanel(QWidget *parent)
+    : QWidget(parent)
+    , m_listView(new QListView)
+    , m_maskPropertyEditor(new ComponentEditor)
+    , m_plotPropertyEditor(new ComponentEditor)
+    , m_accordion(new AccordionWidget)
+    , m_maskModel(0)
+    , m_intensityDataItem(0)
+{
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+    setObjectName(QLatin1String("MaskEditorToolPanel"));
+
+    m_listView->setContextMenuPolicy(Qt::CustomContextMenu);
+    connect(m_listView, SIGNAL(customContextMenuRequested(const QPoint &)),
+            this, SLOT(onCustomContextMenuRequested(const QPoint &)));
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->setSpacing(0);
+
+    setup_PlotProperties(m_accordion);
+    setup_MaskStack(m_accordion);
+    setup_MaskProperties(m_accordion);
+    m_accordion->getContentPane(0)->headerClicked();
+
+    mainLayout->addWidget(m_accordion);
+
+    setLayout(mainLayout);
+
+    m_plotPropertyEditor->setHeaderHidden(true);
+}
+
+
+void MaskEditorPropertyPanel::setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex,
+                    IntensityDataItem *intensityItem)
+{
+    m_maskModel = model;
+    m_rootIndex = maskContainerIndex;
+    m_intensityDataItem = intensityItem;
+
+    m_listView->setModel(m_maskModel);
+    m_listView->setRootIndex(m_rootIndex);
+    m_listView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+    connect(m_listView->selectionModel(),
+            SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+            this,
+            SLOT(onSelectionChanged(QItemSelection, QItemSelection)));
+
+    m_plotPropertyEditor->setItem(m_intensityDataItem);
+}
+
+QItemSelectionModel *MaskEditorPropertyPanel::selectionModel()
+{
+    Q_ASSERT(m_listView);
+    return m_listView->selectionModel();
+}
+
+//! Show/Hide panel. When panel is hidden, all property editors are disabled.
+void MaskEditorPropertyPanel::setPanelHidden(bool value)
+{
+    this->setHidden(value);
+
+    if(!m_rootIndex.isValid()) return;
+
+    if(value) {
+        m_maskPropertyEditor->setItem(0);
+        m_plotPropertyEditor->setItem(0);
+    } else {
+        QModelIndexList indexes = selectionModel()->selectedIndexes();
+        if(indexes.size()) {
+            m_maskPropertyEditor->setItem(m_maskModel->itemForIndex(indexes.front()));
+        }
+        m_plotPropertyEditor->setItem(m_intensityDataItem);
+    }
+}
+
+void MaskEditorPropertyPanel::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
+{
+    Q_UNUSED(deselected);
+    if(selected.size()) {
+        m_maskPropertyEditor->setItem(m_maskModel->itemForIndex(selected.indexes().front()));
+    } else {
+        m_maskPropertyEditor->setItem(0);
+    }
+
+
+}
+
+void MaskEditorPropertyPanel::onCustomContextMenuRequested(const QPoint &point)
+{
+    emit itemContextMenuRequest(m_listView->mapToGlobal(point));
+}
+
+void MaskEditorPropertyPanel::setup_PlotProperties(AccordionWidget *accordion)
+{
+    ContentPane *cp = accordion->getContentPane(accordion->addContentPane("Plot properties"));
+    cp->setMaximumHeight(600);
+    cp->setHeaderTooltip("Plot properties editor");
+    cp->setContainerFrameStyle(QFrame::Plain);
+    QFrame *contentFrame = cp->getContentFrame();
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->setContentsMargins(0, 0, 0, 0);
+    m_plotPropertyEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    layout->addWidget(new EnvelopWidget(m_plotPropertyEditor));
+    contentFrame->setLayout(layout);
+}
+
+void MaskEditorPropertyPanel::setup_MaskStack(AccordionWidget *accordion)
+{
+    ContentPane *cp = accordion->getContentPane(accordion->addContentPane("Mask stack"));
+    cp->setMaximumHeight(600);
+    cp->setHeaderTooltip("List of created masks representing mask stacking order.");
+    cp->setContainerFrameStyle(QFrame::Plain);
+    QFrame *contentFrame = cp->getContentFrame();
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->addWidget(m_listView);
+    layout->addWidget(new EnvelopWidget(m_listView));
+    contentFrame->setLayout(layout);
+}
+
+void MaskEditorPropertyPanel::setup_MaskProperties(AccordionWidget *accordion)
+{
+    ContentPane *cp = accordion->getContentPane(accordion->addContentPane("Mask properties"));
+    cp->setMaximumHeight(600);
+    cp->setHeaderTooltip("Property editor for currently selected mask.");
+    cp->setContainerFrameStyle(QFrame::Plain);
+    QFrame *contentFrame = cp->getContentFrame();
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->addWidget(new EnvelopWidget(m_maskPropertyEditor));
+    contentFrame->setLayout(layout);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.h b/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.h
new file mode 100644
index 0000000..4d9cc5a
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.h
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorPropertyPanel.h
+//! @brief     Defines class MaskEditorPropertyPanel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKEDITORPROPERTYPANEL_H
+#define MASKEDITORPROPERTYPANEL_H
+
+#include "MaskEditorFlags.h"
+#include <QModelIndex>
+#include <QWidget>
+
+class QListView;
+class SessionModel;
+class QModelIndex;
+class ComponentEditor;
+class QItemSelection;
+class QItemSelectionModel;
+class QButtonGroup;
+class IntensityDataItem;
+class AccordionWidget;
+
+//! Tool widget for MaskEditor
+
+class MaskEditorPropertyPanel : public QWidget
+{
+    Q_OBJECT
+public:
+    MaskEditorPropertyPanel(QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(128, 128); }
+    QSize minimumSizeHint() const { return QSize(128, 128); }
+
+    void setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex,
+                        IntensityDataItem *intensityItem);
+
+    QItemSelectionModel* selectionModel();
+
+    void setPanelHidden(bool value);
+
+signals:
+    void itemContextMenuRequest(const QPoint &point);
+
+private slots:
+    void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+    void onCustomContextMenuRequested(const QPoint &point);
+
+private:
+    void setup_MaskStack(AccordionWidget *accordion);
+    void setup_MaskProperties(AccordionWidget *accordion);
+    void setup_PlotProperties(AccordionWidget *accordion);
+
+    QListView *m_listView;
+    ComponentEditor *m_maskPropertyEditor;
+    ComponentEditor *m_plotPropertyEditor;
+    AccordionWidget *m_accordion;
+    SessionModel *m_maskModel;
+    QModelIndex m_rootIndex;
+    IntensityDataItem *m_intensityDataItem;
+};
+
+#endif // MASKEDITORPROPERTYPANEL_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.cpp
new file mode 100644
index 0000000..9c531ac
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.cpp
@@ -0,0 +1,238 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.cpp
+//! @brief     Implements class MaskEditorToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskEditorToolBar.h"
+#include "MaskEditorActions.h"
+#include <QButtonGroup>
+#include <QDebug>
+#include <QLabel>
+#include <QRadioButton>
+#include <QStyle>
+#include <QToolButton>
+#include <QVariant>
+
+namespace {
+const int toolbar_icon_size = 32;
+}
+
+MaskEditorToolBar::MaskEditorToolBar(MaskEditorActions *editorActions, QWidget *parent)
+    : QToolBar(parent)
+    , m_editorActions(editorActions)
+    , m_activityButtonGroup(new QButtonGroup(this))
+    , m_maskValueGroup(new QButtonGroup(this))
+{
+    setIconSize(QSize(toolbar_icon_size, toolbar_icon_size));
+    setProperty("_q_custom_style_disabled", QVariant(true));
+
+    setup_selection_group();
+//    setup_maskvalue_group();
+    setup_shapes_group();
+    setup_maskmodify_group();
+    setup_extratools_group();
+
+    connect(m_activityButtonGroup, SIGNAL(buttonClicked(int)),
+            this, SLOT(onActivityGroupChange(int)));
+    connect(m_maskValueGroup, SIGNAL(buttonClicked(int)),
+            this, SLOT(onMaskValueGroupChange(int)));
+
+    m_previousActivity = currentActivity();
+}
+
+//! Handles ZOOM requests from MaskGraphicsView while user press and holds
+//! space bar. As soon as space bar is released, activity is returned to previous state.
+void MaskEditorToolBar::onChangeActivityRequest(MaskEditorFlags::Activity value)
+{
+    if(value.testFlag(MaskEditorFlags::PAN_ZOOM_MODE)) {
+        m_previousActivity = currentActivity();
+        m_activityButtonGroup->button(MaskEditorFlags::PAN_ZOOM_MODE)->setChecked(true);
+    } else {
+        setCurrentActivity(m_previousActivity);
+    }
+    emit activityModeChanged(currentActivity());
+}
+
+void MaskEditorToolBar::onActivityGroupChange(int value)
+{
+    Q_UNUSED(value);
+    emit activityModeChanged(currentActivity());
+}
+
+void MaskEditorToolBar::onMaskValueGroupChange(int value)
+{
+    Q_UNUSED(value);
+    emit maskValueChanged(MaskEditorFlags::MaskValue(value));
+}
+
+void MaskEditorToolBar::onPresentationTypePressed()
+{
+    emit presentationTypeRequest(MaskEditorFlags::MASK_PRESENTER);
+}
+
+void MaskEditorToolBar::onPresentationTypeReleased()
+{
+    emit presentationTypeRequest(MaskEditorFlags::MASK_EDITOR);
+}
+
+void MaskEditorToolBar::setup_selection_group()
+{
+    QToolButton *panButton = new QToolButton(this);
+    panButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_hand.svg"));
+    panButton->setToolTip("Pan/zoom mode (space)");
+    panButton->setCheckable(true);
+    panButton->setChecked(true);
+    addWidget(panButton);
+
+    QToolButton *resetViewButton = new QToolButton(this);
+    resetViewButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_refresh.svg"));
+    resetViewButton->setToolTip("Reset pan/zoom to initial state");
+    addWidget(resetViewButton);
+    connect(resetViewButton, SIGNAL(clicked()), m_editorActions, SIGNAL(resetViewRequest()));
+
+    add_separator();
+
+    QToolButton *selectionButton = new QToolButton(this);
+    selectionButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_arrow.svg"));
+    selectionButton->setToolTip("Select/modify mask");
+    selectionButton->setCheckable(true);
+    addWidget(selectionButton);
+
+    m_activityButtonGroup->addButton(panButton, MaskEditorFlags::PAN_ZOOM_MODE);
+    m_activityButtonGroup->addButton(selectionButton, MaskEditorFlags::SELECTION_MODE);
+}
+
+void MaskEditorToolBar::setup_maskvalue_group()
+{
+    addWidget(new QLabel(" "));
+
+    QRadioButton *maskTrueButton = new QRadioButton(this);
+    maskTrueButton->setText("masked");
+    maskTrueButton->setToolTip("Set mask to True (area is excluded from the simulation)");
+    maskTrueButton->setCheckable(true);
+    maskTrueButton->setChecked(true);
+    addWidget(maskTrueButton);
+
+    addWidget(new QLabel(" "));
+
+    QRadioButton *maskFalseButton = new QRadioButton(this);
+    maskFalseButton->setToolTip("Set mask to False (area stays in the simulation)");
+    maskFalseButton->setCheckable(true);
+    maskFalseButton->setText("active");
+    addWidget(maskFalseButton);
+
+    m_maskValueGroup->addButton(maskTrueButton, MaskEditorFlags::MASK_ON);
+    m_maskValueGroup->addButton(maskFalseButton, MaskEditorFlags::MASK_OFF);
+}
+
+void MaskEditorToolBar::setup_shapes_group()
+{
+    QToolButton *roiButton = new QToolButton(this);
+    roiButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_roi.svg"));
+    roiButton->setToolTip("Create region of interest");
+    roiButton->setCheckable(true);
+    addWidget(roiButton);
+
+    QToolButton *rectangleButton = new QToolButton(this);
+    rectangleButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_rectangle.svg"));
+    rectangleButton->setToolTip("Create rectangle mask");
+    rectangleButton->setCheckable(true);
+    addWidget(rectangleButton);
+
+    QToolButton *polygonButton = new QToolButton(this);
+    polygonButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_polygon.svg"));
+    polygonButton->setToolTip("Create polygon mask");
+    polygonButton->setCheckable(true);
+    addWidget(polygonButton);
+
+    QToolButton *verticalLineButton = new QToolButton(this);
+    verticalLineButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_verticalline.svg"));
+    verticalLineButton->setToolTip("Create vertical line mask");
+    verticalLineButton->setCheckable(true);
+    addWidget(verticalLineButton);
+
+    QToolButton *horizontalLineButton = new QToolButton(this);
+    horizontalLineButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_horizontalline.svg"));
+    horizontalLineButton->setToolTip("Create horizontal line mask");
+    horizontalLineButton->setCheckable(true);
+    addWidget(horizontalLineButton);
+
+    QToolButton *ellipseButton = new QToolButton(this);
+    ellipseButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_ellipse.svg"));
+    ellipseButton->setToolTip("Create ellipse mask");
+    ellipseButton->setCheckable(true);
+    addWidget(ellipseButton);
+
+//    QToolButton *maskAllButton = new QToolButton(this);
+//    maskAllButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_maskall.svg"));
+//    maskAllButton->setToolTip("Create masked area covering whole detector plane\n"
+//                              "Will be placed beneath all masks. Only one instance is allowed.");
+//    maskAllButton->setCheckable(true);
+//    addWidget(maskAllButton);
+
+    m_activityButtonGroup->addButton(roiButton, MaskEditorFlags::ROI_MODE);
+    m_activityButtonGroup->addButton(rectangleButton, MaskEditorFlags::RECTANGLE_MODE);
+    m_activityButtonGroup->addButton(polygonButton, MaskEditorFlags::POLYGON_MODE);
+    m_activityButtonGroup->addButton(verticalLineButton, MaskEditorFlags::VERTICAL_LINE_MODE);
+    m_activityButtonGroup->addButton(horizontalLineButton, MaskEditorFlags::HORIZONTAL_LINE_MODE);
+    m_activityButtonGroup->addButton(ellipseButton, MaskEditorFlags::ELLIPSE_MODE);
+//    m_activityButtonGroup->addButton(maskAllButton, MaskEditorFlags::MASKALL_MODE);
+    add_separator();
+}
+
+void MaskEditorToolBar::setup_maskmodify_group()
+{
+    Q_ASSERT(m_editorActions);
+    addAction(m_editorActions->bringToFrontAction());
+    addAction(m_editorActions->sendToBackAction());
+    add_separator();
+}
+
+void MaskEditorToolBar::setup_extratools_group()
+{
+    QToolButton *presentationButton = new QToolButton(this);
+    presentationButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_lightbulb.svg"));
+    presentationButton->setToolTip("Press and hold to see mask results.");
+    addWidget(presentationButton);
+
+    connect(presentationButton, SIGNAL(pressed()), this, SLOT(onPresentationTypePressed()));
+    connect(presentationButton, SIGNAL(released()), this, SLOT(onPresentationTypeReleased()));
+
+    QToolButton *propertyPanelButton = new QToolButton(this);
+    propertyPanelButton->setIcon(QIcon(":/MaskWidgets/images/maskeditor_toolpanel.svg"));
+    propertyPanelButton->setToolTip("Open panel with additional properties");
+    addWidget(propertyPanelButton);
+
+    connect(propertyPanelButton, SIGNAL(clicked()),
+            m_editorActions, SIGNAL(propertyPanelRequest()));
+    add_separator();
+}
+
+void MaskEditorToolBar::add_separator()
+{
+    addWidget(new QLabel(" "));
+    addSeparator();
+    addWidget(new QLabel(" "));
+}
+
+MaskEditorFlags::Activity MaskEditorToolBar::currentActivity() const
+{
+    return MaskEditorFlags::EActivityType(m_activityButtonGroup->checkedId());
+}
+
+void MaskEditorToolBar::setCurrentActivity(MaskEditorFlags::Activity value)
+{
+    m_activityButtonGroup->button(value)->setChecked(true);
+}
+
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.h b/GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.h
new file mode 100644
index 0000000..ff2d693
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskEditorToolBar.h
+//! @brief     Defines class MaskEditorToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKEDITORTOOLBAR_H
+#define MASKEDITORTOOLBAR_H
+
+#include "MaskEditorFlags.h"
+#include "WinDllMacros.h"
+#include <QToolBar>
+
+class MaskEditorActions;
+class QButtonGroup;
+
+//! Main class to draw masks on top of intensity data map
+
+class BA_CORE_API_ MaskEditorToolBar : public QToolBar
+{
+    Q_OBJECT
+public:
+    MaskEditorToolBar(MaskEditorActions *editorActions, QWidget *parent = 0);
+
+signals:
+    void activityModeChanged(MaskEditorFlags::Activity);
+    void presentationTypeRequest(MaskEditorFlags::PresentationType);
+    void maskValueChanged(MaskEditorFlags::MaskValue);
+
+public slots:
+    void onChangeActivityRequest(MaskEditorFlags::Activity value);
+
+private slots:
+    void onActivityGroupChange(int value);
+    void onMaskValueGroupChange(int value);
+    void onPresentationTypePressed();
+    void onPresentationTypeReleased();
+
+private:
+    void setup_selection_group();
+    void setup_maskvalue_group();
+    void setup_shapes_group();
+    void setup_maskmodify_group();
+    void setup_extratools_group();
+    void add_separator();
+
+    MaskEditorFlags::Activity currentActivity() const;
+    void setCurrentActivity(MaskEditorFlags::Activity value);
+
+    MaskEditorActions *m_editorActions;
+    QButtonGroup *m_activityButtonGroup;
+    QButtonGroup *m_maskValueGroup;
+    MaskEditorFlags::Activity m_previousActivity;
+};
+
+
+#endif // MASKEDITORTOOLBAR_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.cpp b/GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.cpp
new file mode 100644
index 0000000..2661079
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.cpp
@@ -0,0 +1,95 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.cpp
+//! @brief     Implements class MaskGraphicsProxy
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskGraphicsProxy.h"
+#include "ColorMapSceneAdaptor.h"
+#include "ColorMap.h"
+#include "IntensityDataItem.h"
+#include <QGraphicsSceneMouseEvent>
+#include <QDebug>
+
+MaskGraphicsProxy::MaskGraphicsProxy()
+    : m_colorMap(new ColorMap)
+    , m_sceneAdaptor(0)
+    , m_send_signals_to_colormap(false)
+{
+    resize(1200, 1000);
+    setInZoomMode(true);
+}
+
+MaskGraphicsProxy::~MaskGraphicsProxy()
+{
+    // no need to delete m_colorMap, base QGraphicsProxyWidget will take care about it
+    if(m_sceneAdaptor)
+        m_sceneAdaptor->setColorMapPlot(0);
+}
+
+void MaskGraphicsProxy::setIntensityItem(IntensityDataItem *intensityDataItem)
+{
+    m_colorMap->setItem(intensityDataItem);
+    if(widget() != m_colorMap)
+        setWidget(m_colorMap);
+}
+
+void MaskGraphicsProxy::setSceneAdaptor(ISceneAdaptor *sceneAdaptor)
+{
+    m_sceneAdaptor = dynamic_cast<ColorMapSceneAdaptor *>(sceneAdaptor);
+    Q_ASSERT(m_sceneAdaptor);
+    m_sceneAdaptor->setColorMapPlot(m_colorMap);
+}
+
+//! Sets widget to zoom mode, when signals (zoom wheel, mouse clicks) are send down to
+//! ColorMap plot. In non-zoom mode, widget doesn't react on clicks.
+void MaskGraphicsProxy::setInZoomMode(bool value)
+{
+    m_send_signals_to_colormap = value;
+    if(value) {
+        setAcceptedMouseButtons(Qt::LeftButton);
+    } else {
+        setAcceptedMouseButtons(Qt::NoButton);
+    }
+}
+
+ColorMap *MaskGraphicsProxy::colorMap()
+{
+    return m_colorMap;
+}
+
+void MaskGraphicsProxy::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(!m_send_signals_to_colormap) return;
+    QGraphicsProxyWidget::mousePressEvent(event);
+    event->accept();
+}
+
+void MaskGraphicsProxy::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(!m_send_signals_to_colormap) return;
+    QGraphicsProxyWidget::mouseReleaseEvent(event);
+}
+
+void MaskGraphicsProxy::wheelEvent(QGraphicsSceneWheelEvent *event)
+{
+    if(!m_send_signals_to_colormap) return;
+    QGraphicsProxyWidget::wheelEvent(event);
+}
+
+void MaskGraphicsProxy::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    qDebug() << "MaskGraphicsProxy::mouseMoveEvent(QGraphicsSceneMouseEvent *event)";
+    if(!m_send_signals_to_colormap) return;
+    QGraphicsProxyWidget::mouseMoveEvent(event);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.h b/GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.h
new file mode 100644
index 0000000..e30bac1
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskGraphicsProxy.h
+//! @brief     Defines class MaskGraphicsProxy
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKGRAPHICSPROXY_H
+#define MASKGRAPHICSPROXY_H
+
+#include "MaskEditorHelper.h"
+#include <QGraphicsProxyWidget>
+
+class SessionItem;
+class ISceneAdaptor;
+class ColorMapSceneAdaptor;
+class ColorMap;
+class IntensityDataItem;
+
+//! Graphics proxy to place QWidget inside QGraphicsScene, used by MaskEditorCanvas.
+
+class MaskGraphicsProxy : public QGraphicsProxyWidget
+{
+    Q_OBJECT
+
+public:
+    MaskGraphicsProxy();
+    virtual ~MaskGraphicsProxy();
+
+    int type() const { return MaskEditorHelper::MASKGRAPHICSPROXY; }
+
+    void setIntensityItem(IntensityDataItem *item);
+    void setSceneAdaptor(ISceneAdaptor *sceneAdaptor);
+    void setInZoomMode(bool value);
+
+    ColorMap *colorMap();
+
+protected:
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    void wheelEvent(QGraphicsSceneWheelEvent *event);
+
+private:
+    ColorMap *m_colorMap;
+    ColorMapSceneAdaptor *m_sceneAdaptor;
+    bool m_send_signals_to_colormap;
+};
+
+#endif // MASKGRAPHICSPROXY_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.cpp b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.cpp
new file mode 100644
index 0000000..8d13556
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.cpp
@@ -0,0 +1,740 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.cpp
+//! @brief     Implements class MaskGraphicsScene
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskGraphicsScene.h"
+#include "ColorMapSceneAdaptor.h"
+#include "IMaskView.h"
+#include "ISceneAdaptor.h"
+#include "IntensityDataItem.h"
+#include "MaskEditorFlags.h"
+#include "MaskGraphicsProxy.h"
+#include "MaskItems.h"
+#include "MaskViewFactory.h"
+#include "PolygonView.h"
+#include "SessionItem.h"
+#include "SessionModel.h"
+#include "item_constants.h"
+#include "GUIHelpers.h"
+#include <QGraphicsItem>
+#include <QItemSelection>
+#include <QLineF>
+#include <QGraphicsSceneMoveEvent>
+#include <QPainter>
+#include <QDebug>
+
+namespace {
+const QRectF default_scene_rect(0, 0, 800, 600);
+const qreal min_distance_to_create_rect = 10;
+}
+
+MaskGraphicsScene::MaskGraphicsScene(QObject *parent)
+    : QGraphicsScene(parent)
+    , m_maskModel(0)
+    , m_selectionModel(0)
+    , m_proxy(0)
+    , m_block_selection(false)
+    , m_intensityItem(0)
+    , m_currentItem(0)
+{
+    setSceneRect(default_scene_rect);
+    connect(this, SIGNAL(selectionChanged()), this, SLOT(onSceneSelectionChanged()));
+}
+
+void MaskGraphicsScene::setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex,
+                    IntensityDataItem *intensityItem)
+{
+    m_intensityItem = intensityItem;
+
+    if (model != m_maskModel || m_maskContainerIndex != maskContainerIndex) {
+
+        if (m_maskModel) {
+            disconnect(m_maskModel, SIGNAL(modelAboutToBeReset()),
+                       this, SLOT(resetScene()));
+            disconnect(m_maskModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+                       this, SLOT(onRowsInserted(QModelIndex, int, int)));
+            disconnect(m_maskModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)),
+                       this, SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int)));
+            disconnect(m_maskModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+                       this, SLOT(onRowsRemoved(QModelIndex, int, int)));
+            disconnect(m_maskModel, SIGNAL(modelReset()),
+                       this, SLOT(updateScene()));
+        }
+
+        m_maskModel = model;
+
+        if(m_maskModel->itemForIndex(maskContainerIndex)->modelType() != Constants::MaskContainerType)
+            throw GUIHelpers::Error("MaskGraphicsScene::setMaskContext() -> Error. Not a container");
+
+        m_maskContainerIndex = maskContainerIndex;
+
+        if(m_maskModel) {
+            connect(m_maskModel, SIGNAL(modelAboutToBeReset()),
+                    this, SLOT(resetScene()));
+            connect(m_maskModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+                    this, SLOT(onRowsInserted(QModelIndex, int, int)));
+            connect(m_maskModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)),
+                    this, SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int)));
+            connect(m_maskModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+                    this, SLOT(onRowsRemoved(QModelIndex, int, int)));
+            connect(m_maskModel, SIGNAL(modelReset()),
+                    this, SLOT(updateScene()));
+        }
+
+        resetScene();
+        updateScene();
+    }
+}
+
+void MaskGraphicsScene::setSelectionModel(QItemSelectionModel *model)
+{
+    Q_ASSERT(model);
+
+    if (model != m_selectionModel) {
+
+        if (m_selectionModel)
+            disconnect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+                       this, SLOT(onSessionSelectionChanged(QItemSelection, QItemSelection)));
+
+        m_selectionModel = model;
+
+        if (m_selectionModel)
+            connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+                    this, SLOT(onSessionSelectionChanged(QItemSelection, QItemSelection)));
+    }
+}
+
+ColorMap *MaskGraphicsScene::colorMap()
+{
+    Q_ASSERT(m_proxy);
+    return m_proxy->colorMap();
+}
+
+void MaskGraphicsScene::onActivityModeChanged(MaskEditorFlags::Activity value)
+{
+    if(!m_proxy)
+        return;
+
+    qDebug() << "XXX MaskGraphicsScene::onActivityModeChanged";
+    if(m_context.isActivityRequiresDrawingCancel(value))
+        cancelCurrentDrawing();
+
+    m_context.setActivityType(value);
+    setInPanAndZoomMode(m_context.isInZoomMode());
+}
+
+void MaskGraphicsScene::onMaskValueChanged(MaskEditorFlags::MaskValue value)
+{
+    m_context.setMaskValue(value);
+}
+
+void MaskGraphicsScene::onRowsInserted(const QModelIndex &, int, int)
+{
+    updateScene();
+}
+
+void MaskGraphicsScene::onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
+{
+    m_block_selection = true;
+    for (int irow = first; irow <= last; ++irow) {
+        QModelIndex itemIndex = m_maskModel->index(irow, 0, parent);
+        deleteViews(itemIndex); // deleting all child items
+    }
+    m_block_selection = false;
+}
+
+void MaskGraphicsScene::onRowsRemoved(const QModelIndex &, int, int)
+{
+    updateScene();
+}
+
+void MaskGraphicsScene::cancelCurrentDrawing()
+{
+    if(isDrawingInProgress()) {
+        Q_ASSERT(m_currentItem);
+        QModelIndex index = m_maskModel->indexOfItem(m_currentItem);
+        m_maskModel->removeRows(index.row(), 1, index.parent());
+        setDrawingInProgress(false);
+    }
+}
+
+void MaskGraphicsScene::resetScene()
+{
+    clear();
+    m_ItemToView.clear();
+    m_proxy = 0;
+    m_adaptor.reset(new ColorMapSceneAdaptor);
+}
+
+//! Main method to update scene on various changes in the model.
+
+void MaskGraphicsScene::updateScene()
+{
+    if(!m_maskModel)
+        return;
+
+    updateProxyWidget();
+    updateViews(m_maskContainerIndex, addViewForItem(m_maskModel->itemForIndex(m_maskContainerIndex)));
+    setZValues();
+}
+
+//! Makes invisible all masks in the case of the request for presentation mode.
+
+void MaskGraphicsScene::onPresentationTypeRequest(MaskEditorFlags::PresentationType presentationType)
+{
+    foreach(IMaskView *view, m_ItemToView.values())
+        view->setVisible(presentationType.testFlag(MaskEditorFlags::MASK_EDITOR));
+}
+
+//! Propagates selection from model to scene.
+
+void MaskGraphicsScene::onSessionSelectionChanged(const QItemSelection&, const QItemSelection&)
+{
+    if (m_block_selection)
+        return;
+
+    m_block_selection = true;
+
+    for (auto it = m_ItemToView.begin(); it != m_ItemToView.end(); ++it) {
+        QModelIndex index = m_maskModel->indexOfItem(it.key());
+        if (index.isValid())
+            it.value()->setSelected(m_selectionModel->isSelected(index));
+    }
+
+    m_block_selection = false;
+}
+
+//! Propagates selection from scene to model.
+
+void MaskGraphicsScene::onSceneSelectionChanged()
+{
+    if (m_block_selection)
+        return;
+
+    m_block_selection = true;
+
+    m_selectionModel->clearSelection();
+
+    foreach(QGraphicsItem *graphicsItem, selectedItems()) {
+        if (IMaskView *view = dynamic_cast<IMaskView *>(graphicsItem)) {
+            QModelIndex itemIndex = m_maskModel->indexOfItem(view->getParameterizedItem());
+            Q_ASSERT(itemIndex.isValid());
+            if (!m_selectionModel->isSelected(itemIndex))
+                m_selectionModel->select(itemIndex, QItemSelectionModel::Select);
+        }
+    }
+
+    m_block_selection = false;
+}
+
+
+void MaskGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(event->buttons() & Qt::RightButton) {
+        if(isDrawingInProgress()) {
+            cancelCurrentDrawing();
+        } else {
+            makeViewAtMousePosSelected(event);
+        }
+        return;
+    }
+
+    if(isValidForPolygonDrawing(event)) {
+        processPolygonItem(event);
+        return;
+    }
+
+    if(isValidForLineDrawing(event)) {
+        processLineItem(event);
+        return;
+    }
+
+    if(isValidForMaskAllDrawing(event)) {
+        processMaskAllItem(event);
+        return;
+    }
+
+    if(isValidForRectangleShapeDrawing(event)) {
+        processRectangleShapeItem(event);
+        return;
+    }
+
+    QGraphicsScene::mousePressEvent(event);
+}
+
+void MaskGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(isDrawingInProgress() && m_context.isRectangleShapeMode()) {
+        processRectangleShapeItem(event);
+        return;
+    }
+
+    QGraphicsScene::mouseMoveEvent(event);
+
+    if( (isDrawingInProgress() && m_context.isPolygonMode()) || m_context.isLineMode()) {
+        m_currentMousePosition = event->scenePos();
+        invalidate();
+    }
+}
+
+//! Finalizes item drawing or pass events to other items.
+
+void MaskGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    qDebug() << "MaskGraphicsScene::mouseReleaseEvent() -> before";
+    if(isDrawingInProgress()) {
+        if (m_context.isRectangleShapeMode()) {
+            clearSelection();
+            if (m_currentItem) {
+                // drawing ended up with item drawn, let's make it selected
+                if (IMaskView *view = m_ItemToView[m_currentItem]) {
+                    view->setSelected(true);
+                }
+            } else {
+                // drawing ended without item to be draw (too short mouse move)
+                // making item beneath of mouse release position to be selected
+                makeViewAtMousePosSelected(event);
+            }
+
+            setDrawingInProgress(false);
+        }
+
+    } else {
+        QGraphicsScene::mouseReleaseEvent(event);
+    }
+}
+
+//! Draws dashed line to the current mouse position in the case of ungoing
+//! line or polygon drawing.
+
+void MaskGraphicsScene::drawForeground(QPainter *painter, const QRectF &)
+{
+    if(!isDrawingInProgress())
+        return;
+
+    if(m_currentMousePosition == QPointF())
+        return;
+
+    if(PolygonView *polygon = currentPolygon()) {
+        painter->setPen(QPen(Qt::black, 1, Qt::DashLine));
+        painter->drawLine(QLineF(polygon->getLastAddedPoint(), m_currentMousePosition));
+    } else {
+        if(m_context.isLineMode()) {
+            const QRectF &plot_scene_rectangle = m_adaptor->getViewportRectangle();
+            if(!plot_scene_rectangle.contains(m_currentMousePosition)) return;
+
+            painter->setPen(QPen(Qt::black, 1, Qt::DashLine));
+            if(m_context.isVerticalLineMode()) {
+                QPointF p1(m_currentMousePosition.x(), plot_scene_rectangle.bottom());
+                QPointF p2(m_currentMousePosition.x(), plot_scene_rectangle.top());
+                painter->drawLine(QLineF(p1, p2));
+            }
+            if(m_context.isHorizontalLineMode()) {
+                QPointF p1(plot_scene_rectangle.left(), m_currentMousePosition.y());
+                QPointF p2(plot_scene_rectangle.right(), m_currentMousePosition.y());
+                painter->drawLine(QLineF(p1, p2));
+            }
+        }
+    }
+}
+
+//! Creates item context menu if there is IMaskView beneath the mouse right click.
+
+void MaskGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
+{
+    if(isDrawingInProgress())
+        return;
+
+    if(dynamic_cast<IMaskView *>(itemAt(event->scenePos(), QTransform())))
+        emit itemContextMenuRequest(event->screenPos());
+}
+
+//! Updates proxy widget for intensity data item.
+
+void MaskGraphicsScene::updateProxyWidget()
+{
+    Q_ASSERT(m_intensityItem);
+    if(!m_proxy) {
+        m_proxy = new MaskGraphicsProxy;
+        m_proxy->setIntensityItem(m_intensityItem);
+        m_proxy->setSceneAdaptor(m_adaptor.data());
+        addItem(m_proxy);
+    }
+}
+
+//! Recutsively runs through the model and creates corresponding views.
+
+void MaskGraphicsScene::updateViews(const QModelIndex &parentIndex, IMaskView *parentView)
+{
+    Q_ASSERT(m_maskModel);
+    IMaskView *childView(0);
+    for (int i_row = 0; i_row < m_maskModel->rowCount(parentIndex); ++i_row) {
+        QModelIndex itemIndex = m_maskModel->index(i_row, 0, parentIndex);
+        if (SessionItem *item = m_maskModel->itemForIndex(itemIndex)) {
+
+            if (item->modelType() == Constants::GroupItemType ||
+                    item->modelType() == Constants::PropertyType)
+                continue;
+
+            childView = addViewForItem(item);
+            if (childView) {
+                if (parentView) {
+                    qDebug() << "       DesignerScene::updateViews() -> adding child "
+                             << item->modelType() << " to parent"
+                             << parentView->getParameterizedItem()->modelType();
+                    parentView->addView(childView, i_row);
+                }
+            }
+        }
+        updateViews(itemIndex, childView);
+    }
+}
+
+//! Creates a view for given item.
+
+IMaskView *MaskGraphicsScene::addViewForItem(SessionItem *item)
+{
+    Q_ASSERT(item);
+    IMaskView *view = m_ItemToView[item];
+    if (!view) {
+        view = MaskViewFactory::createMaskView(item, m_adaptor.data());
+        if (view) {
+            m_ItemToView[item] = view;
+            addItem(view);
+            return view;
+        }
+    }
+    return view;
+}
+
+//! Recursive delete of all views corresponding to given index.
+
+void MaskGraphicsScene::deleteViews(const QModelIndex &parentIndex)
+{
+    for (int i_row = 0; i_row < m_maskModel->rowCount(parentIndex); ++i_row) {
+        QModelIndex itemIndex = m_maskModel->index(i_row, 0, parentIndex);
+
+        if (SessionItem *item = m_maskModel->itemForIndex(itemIndex))
+            removeItemViewFromScene(item);
+
+        deleteViews(itemIndex);
+    }
+    removeItemViewFromScene(m_maskModel->itemForIndex(parentIndex)); // deleting parent item
+}
+
+//! Removes single view from scene.
+
+void MaskGraphicsScene::removeItemViewFromScene(SessionItem *item)
+{
+    for (auto it = m_ItemToView.begin(); it != m_ItemToView.end(); ++it) {
+        if (it.key() == item) {
+            IMaskView *view = it.value();
+            view->setSelected(false);
+            m_ItemToView.erase(it);
+            delete view;
+            break;
+        }
+    }
+}
+
+//! Returns true if left mouse bottom click was inside ColorMap viewport rectangle.
+
+bool MaskGraphicsScene::isValidMouseClick(QGraphicsSceneMouseEvent *event)
+{
+    if(!m_adaptor) return false;
+    if(!(event->buttons() & Qt::LeftButton)) return false;
+    if(!m_adaptor->getViewportRectangle().contains(event->scenePos())) return false;
+    return true;
+}
+
+//! Returns true if mouse click is valid for rectangular/elliptic/ROI shapes.
+
+bool MaskGraphicsScene::isValidForRectangleShapeDrawing(QGraphicsSceneMouseEvent *event)
+{
+    if(isDrawingInProgress()) return false;
+    if(!isValidMouseClick(event)) return false;
+    if(!m_context.isRectangleShapeMode()) return false;
+    if(isAreaContains(event, MaskEditorHelper::SIZEHANDLE)) return false;
+    if(m_context.isROIMode()) {
+        // only one ROI is allowed
+        foreach(SessionItem *item, m_ItemToView.keys())
+            if(item->modelType() == Constants::RegionOfInterestType)
+                return false;
+    }
+    return true;
+}
+
+//! Returns true if mouse click is in context suitable for polygon drawing.
+
+bool MaskGraphicsScene::isValidForPolygonDrawing(QGraphicsSceneMouseEvent *event)
+{
+    if(!isValidMouseClick(event)) return false;
+    if(!m_context.isPolygonMode()) return false;
+    if(!isDrawingInProgress()) {
+        if(isAreaContains(event, MaskEditorHelper::POLYGONPOINT)) return false;
+    }
+    return true;
+}
+
+//! Returns true if mouse click is in context suitable for line drawing.
+
+bool MaskGraphicsScene::isValidForLineDrawing(QGraphicsSceneMouseEvent *event)
+{
+    if(!isValidMouseClick(event)) return false;
+    if(isDrawingInProgress()) return false;
+    if(!m_context.isLineMode()) return false;
+    if(QGraphicsItem *graphicsItem = itemAt(event->scenePos(), QTransform())) {
+        if(graphicsItem->type() == MaskEditorHelper::VERTICALLINE ||
+                graphicsItem->type() == MaskEditorHelper::HORIZONTALLINE) return false;
+    }
+    return true;
+}
+
+//! Returns true if MaskAllItem can be drawn. Only one item of such type is allowed.
+
+bool MaskGraphicsScene::isValidForMaskAllDrawing(QGraphicsSceneMouseEvent *event)
+{
+    if(!isValidMouseClick(event)) return false;
+    if(isDrawingInProgress()) return false;
+    if(!m_context.isMaskAllMode()) return false;
+    foreach(SessionItem *item, m_ItemToView.keys())
+        if(item->modelType() == Constants::MaskAllType)
+            return false;
+    return true;
+}
+
+//! Return true if area beneath the mouse contains views of given type.
+
+bool MaskGraphicsScene::isAreaContains(QGraphicsSceneMouseEvent *event,
+                                       MaskEditorHelper::EViewTypes viewType)
+{
+    foreach(QGraphicsItem *graphicsItem, this->items(event->scenePos()))
+        if(graphicsItem->type() == viewType)
+            return true;
+    return false;
+}
+
+bool MaskGraphicsScene::isDrawingInProgress() const
+{
+    return m_context.isDrawingInProgress();
+}
+
+void MaskGraphicsScene::setDrawingInProgress(bool value)
+{
+    m_context.setDrawingInProgress(value);
+    if(value == false)
+        m_currentItem = 0;
+}
+
+//! Sets the state of all views in pan&zoom mode.
+//! In pan&zoom mode, the selection is removed, all items can't receive mouse clicks, and all
+//! events are propagated down to ColorMap plot.
+
+void MaskGraphicsScene::setInPanAndZoomMode(bool value)
+{
+    if(value)
+        m_selectionModel->clearSelection();
+
+    Qt::MouseButtons acceptedButton = (value ? Qt::NoButton : Qt::LeftButton);
+    foreach(IMaskView *view, m_ItemToView.values())
+        view->setAcceptedMouseButtons(acceptedButton);
+
+    m_proxy->setInZoomMode(value);
+}
+
+void MaskGraphicsScene::makeViewAtMousePosSelected(QGraphicsSceneMouseEvent *event)
+{
+    if(QGraphicsItem *graphicsItem = itemAt(event->scenePos(), QTransform()))
+        graphicsItem->setSelected(true);
+}
+
+//! Processes RectangleItem and EllipseItem drawing
+//! If the mouse move distance with left button down is larger than certain threshold,
+//! new item will be created. Further, this function will update size and position
+//! of current rectangle if mouse keep moving.
+
+void MaskGraphicsScene::processRectangleShapeItem(QGraphicsSceneMouseEvent *event)
+{
+    if(!isDrawingInProgress())
+        setDrawingInProgress(true);
+
+    QPointF click_pos = event->buttonDownScenePos(Qt::LeftButton);
+    QPointF mouse_pos = event->scenePos();
+    QLineF line(mouse_pos, click_pos);
+
+    if(!m_currentItem && line.length() > min_distance_to_create_rect) {
+        m_currentItem = m_maskModel->insertNewItem(m_context.activityToModelType(),
+                                                   m_maskContainerIndex, m_context.activityToRow());
+        if(!m_context.isROIMode())
+            m_currentItem->setItemValue(MaskItem::P_MASK_VALUE,
+                                             m_context.getMaskValue());
+        setItemName(m_currentItem);
+    }
+
+    if(!m_currentItem)
+        return;
+
+    qreal xmin = std::min(click_pos.x(), mouse_pos.x());
+    qreal xmax = std::max(click_pos.x(), mouse_pos.x());
+    qreal ymin = std::min(click_pos.y(), mouse_pos.y());
+    qreal ymax = std::max(click_pos.y(), mouse_pos.y());
+
+    if(m_currentItem->modelType() == Constants::RectangleMaskType ||
+            m_currentItem->modelType() == Constants::RegionOfInterestType) {
+        m_currentItem->setItemValue(RectangleItem::P_XLOW, m_adaptor->fromSceneX(xmin));
+        m_currentItem->setItemValue(RectangleItem::P_YLOW, m_adaptor->fromSceneY(ymax));
+        m_currentItem->setItemValue(RectangleItem::P_XUP, m_adaptor->fromSceneX(xmax));
+        m_currentItem->setItemValue(RectangleItem::P_YUP, m_adaptor->fromSceneY(ymin));
+    }
+
+    else if(m_currentItem->modelType() == Constants::EllipseMaskType){
+        m_currentItem->setItemValue(EllipseItem::P_XCENTER,
+                                             m_adaptor->fromSceneX(xmin + (xmax-xmin)/2.));
+        m_currentItem->setItemValue(EllipseItem::P_YCENTER,
+                                             m_adaptor->fromSceneY(ymin + (ymax-ymin)/2.));
+        m_currentItem->setItemValue(
+            EllipseItem::P_XRADIUS, (m_adaptor->fromSceneX(xmax) - m_adaptor->fromSceneX(xmin))/2.);
+        m_currentItem->setItemValue(
+            EllipseItem::P_YRADIUS, (m_adaptor->fromSceneY(ymin) - m_adaptor->fromSceneY(ymax))/2.);
+    }
+}
+
+void MaskGraphicsScene::processPolygonItem(QGraphicsSceneMouseEvent *event)
+{
+    Q_ASSERT(m_context.isPolygonMode());
+
+    if(!m_currentItem) {
+        setDrawingInProgress(true);
+        m_currentItem = m_maskModel->insertNewItem(Constants::PolygonMaskType,
+                                                   m_maskContainerIndex, 0);
+        m_currentItem->setItemValue(MaskItem::P_MASK_VALUE, m_context.getMaskValue());
+        m_selectionModel->clearSelection();
+        m_selectionModel->select(m_maskModel->indexOfItem(m_currentItem), QItemSelectionModel::Select);
+        setItemName(m_currentItem);
+    }
+
+    Q_ASSERT(m_currentItem->modelType() == Constants::PolygonMaskType);
+
+    if(PolygonView *polygon = currentPolygon()) {
+        if(polygon->closePolygonIfNecessary()) {
+            setDrawingInProgress(false);
+            m_currentMousePosition = QPointF();
+            return;
+        }
+    }
+
+    SessionItem *point = m_maskModel->insertNewItem(Constants::PolygonPointType,
+                                                          m_maskModel->indexOfItem(m_currentItem));
+    QPointF click_pos = event->buttonDownScenePos(Qt::LeftButton);
+
+    point->setItemValue(PolygonPointItem::P_POSX, m_adaptor->fromSceneX(click_pos.x()));
+    point->setItemValue(PolygonPointItem::P_POSY, m_adaptor->fromSceneY(click_pos.y()));
+}
+
+void MaskGraphicsScene::processLineItem(QGraphicsSceneMouseEvent *event)
+{
+    setDrawingInProgress(true);
+    QPointF click_pos = event->buttonDownScenePos(Qt::LeftButton);
+
+    if(m_context.isVerticalLineMode())
+        processVerticalLineItem(click_pos);
+
+    if(m_context.isHorizontalLineMode())
+        processHorizontalLineItem(click_pos);
+
+    m_selectionModel->clearSelection();
+    m_selectionModel->select(m_maskModel->indexOfItem(m_currentItem), QItemSelectionModel::Select);
+    setItemName(m_currentItem);
+    m_currentItem->setItemValue(MaskItem::P_MASK_VALUE,
+                                         m_context.getMaskValue());
+
+    setDrawingInProgress(false);
+}
+
+void MaskGraphicsScene::processVerticalLineItem(const QPointF &pos)
+{
+    m_currentItem = m_maskModel->insertNewItem(Constants::VerticalLineMaskType,
+                                               m_maskContainerIndex, 0);
+    m_currentItem->setItemValue(VerticalLineItem::P_POSX,
+                                         m_adaptor->fromSceneX(pos.x()));
+}
+
+void MaskGraphicsScene::processHorizontalLineItem(const QPointF &pos)
+{
+    m_currentItem = m_maskModel->insertNewItem(Constants::HorizontalLineMaskType,
+                                               m_maskContainerIndex, 0);
+    m_currentItem->setItemValue(HorizontalLineItem::P_POSY,
+                                         m_adaptor->fromSceneY(pos.y()));
+}
+
+void MaskGraphicsScene::processMaskAllItem(QGraphicsSceneMouseEvent *event)
+{
+    Q_UNUSED(event);
+    setDrawingInProgress(true);
+    m_currentItem = m_maskModel->insertNewItem(Constants::MaskAllType,
+                                               m_maskContainerIndex);
+    m_selectionModel->clearSelection();
+    setDrawingInProgress(false);
+}
+
+//! Update Z-values of all IMaskView to reflect stacking order in SessionModel.
+//! Item with irow=0 is the top most on graphics scene (and so is having largest z-values).
+
+void MaskGraphicsScene::setZValues()
+{
+    Q_ASSERT(m_maskContainerIndex.isValid());
+    for(int i = 0; i < m_maskModel->rowCount(m_maskContainerIndex); i++) {
+        QModelIndex itemIndex = m_maskModel->index(i, 0, m_maskContainerIndex);
+        SessionItem *item =  m_maskModel->itemForIndex(itemIndex);
+        if(IMaskView *view = m_ItemToView[item])
+            view->setZValue(m_maskModel->rowCount(m_maskContainerIndex) -  itemIndex.row() + 1);
+    }
+}
+
+//! Returns polygon which is currently under the drawing.
+
+PolygonView *MaskGraphicsScene::currentPolygon() const
+{
+    PolygonView *result(0);
+    if(isDrawingInProgress() && m_context.isPolygonMode()) {
+        if(m_currentItem)
+              result = dynamic_cast<PolygonView *>(m_ItemToView[m_currentItem]);
+    }
+    return result;
+}
+
+//! Sets item name depending on alreay existent items.
+//! If there is already "Rectangle1", the new name will be "Rectangle2"
+
+void MaskGraphicsScene::setItemName(SessionItem *itemToChange)
+{
+    if(itemToChange->modelType() == Constants::RegionOfInterestType)
+        return;
+
+    int glob_index(0);
+    for(int i_row = 0; i_row < m_maskModel->rowCount(m_maskContainerIndex); ++i_row) {
+         QModelIndex itemIndex = m_maskModel->index( i_row, 0, m_maskContainerIndex );
+         if (SessionItem *currentItem = m_maskModel->itemForIndex(itemIndex)){
+             if(currentItem->modelType() == itemToChange->modelType()) {
+                 QString itemName = currentItem->itemName();
+                 if(itemName.startsWith(itemToChange->itemName())) {
+                     int item_index = itemName.remove(0, itemToChange->itemName().size()).toInt();
+                     if(item_index > glob_index) glob_index = item_index;
+                 }
+             }
+         }
+    }
+    itemToChange->setItemName(itemToChange->itemName()+QString::number(++glob_index));
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h
new file mode 100644
index 0000000..30facc0
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h
@@ -0,0 +1,125 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskGraphicsScene.h
+//! @brief     Defines class MaskGraphicsScene
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKGRAPHICSSCENE_H
+#define MASKGRAPHICSSCENE_H
+
+#include "MaskDrawingContext.h"
+#include "MaskEditorHelper.h"
+#include <QGraphicsScene>
+#include <QMap>
+#include <QModelIndex>
+#include <QSharedPointer>
+
+class SessionModel;
+class SessionItem;
+class IMaskView;
+class ISceneAdaptor;
+class MaskGraphicsProxy;
+class QItemSelectionModel;
+class QItemSelection;
+class PolygonView;
+class MaskEditorAction;
+class IntensityDataItem;
+class QGraphicsSceneMouseEvent;
+class QPainter;
+class ColorMap;
+
+//! Graphics scene for MaskEditorCanvas to draw masks on top of intensity data widgets.
+
+class BA_CORE_API_ MaskGraphicsScene : public QGraphicsScene
+{
+    Q_OBJECT
+public:
+    MaskGraphicsScene(QObject *parent = 0);
+
+    void setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex,
+                        IntensityDataItem *intensityItem);
+
+    void setSelectionModel(QItemSelectionModel *model);
+
+    ColorMap *colorMap();
+signals:
+    void itemContextMenuRequest(const QPoint &point);
+
+public slots:
+    void onActivityModeChanged(MaskEditorFlags::Activity value);
+    void onMaskValueChanged(MaskEditorFlags::MaskValue value);
+    void onRowsInserted(const QModelIndex &, int, int);
+    void onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
+    void onRowsRemoved(const QModelIndex &, int, int);
+    void cancelCurrentDrawing();
+    void resetScene();
+    void updateScene();
+    void onPresentationTypeRequest(MaskEditorFlags::PresentationType presentationType);
+
+private slots:
+    void onSessionSelectionChanged(const QItemSelection & /* selected */,
+                                   const QItemSelection & /* deselected */);
+    void onSceneSelectionChanged();
+
+protected:
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    void drawForeground(QPainter *painter, const QRectF &rect);
+    void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
+
+private:
+    void updateProxyWidget();
+    void updateViews(const QModelIndex &parentIndex = QModelIndex(), IMaskView *parentView = 0);
+    IMaskView* addViewForItem(SessionItem *item);
+    void deleteViews(const QModelIndex & itemIndex);
+    void removeItemViewFromScene(SessionItem *item);
+
+    bool isValidMouseClick(QGraphicsSceneMouseEvent *event);    
+    bool isValidForRectangleShapeDrawing(QGraphicsSceneMouseEvent *event);
+    bool isValidForPolygonDrawing(QGraphicsSceneMouseEvent *event);
+    bool isValidForLineDrawing(QGraphicsSceneMouseEvent *event);
+    bool isValidForMaskAllDrawing(QGraphicsSceneMouseEvent *event);
+
+    bool isAreaContains(QGraphicsSceneMouseEvent *event, MaskEditorHelper::EViewTypes viewType);
+    bool isDrawingInProgress() const;
+    void setDrawingInProgress(bool value);
+    void setInPanAndZoomMode(bool value);
+
+    void makeViewAtMousePosSelected(QGraphicsSceneMouseEvent *event);
+
+    void processRectangleShapeItem(QGraphicsSceneMouseEvent *event);
+    void processPolygonItem(QGraphicsSceneMouseEvent *event);
+    void processLineItem(QGraphicsSceneMouseEvent *event);
+    void processVerticalLineItem(const QPointF &pos);
+    void processHorizontalLineItem(const QPointF &pos);
+    void processMaskAllItem(QGraphicsSceneMouseEvent *event);
+
+    void setZValues();
+    PolygonView *currentPolygon() const;
+    void setItemName(SessionItem *itemToChange);
+
+    SessionModel *m_maskModel;
+    QItemSelectionModel *m_selectionModel;
+    QSharedPointer<ISceneAdaptor> m_adaptor;
+    QMap<SessionItem *, IMaskView *> m_ItemToView;
+    MaskGraphicsProxy *m_proxy;
+    bool m_block_selection;
+    QModelIndex m_maskContainerIndex;
+    IntensityDataItem *m_intensityItem;
+    SessionItem *m_currentItem;
+    QPointF m_currentMousePosition;
+    MaskDrawingContext m_context;
+};
+
+#endif // MASKGRAPHICSSCENE_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp
new file mode 100644
index 0000000..03f7e74
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp
@@ -0,0 +1,167 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskGraphicsView.cpp
+//! @brief     Implements class MaskGraphicsView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskGraphicsView.h"
+#include "MaskGraphicsProxy.h"
+#include "MaskGraphicsScene.h"
+#include <QDebug>
+#include <QGraphicsScene>
+#include <QScrollBar>
+#include <QTransform>
+#include <QWheelEvent>
+
+namespace {
+const double min_zoom_value = 1.0;
+const double max_zoom_value = 5.0;
+const double zoom_step = 0.05;
+}
+
+MaskGraphicsView::MaskGraphicsView(QGraphicsScene *scene, QWidget *parent)
+    : QGraphicsView(scene, parent)
+    , m_current_zoom_value(1.0)
+{
+    setObjectName(QStringLiteral("MaskGraphicsView"));
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    setRenderHints(QPainter::HighQualityAntialiasing|QPainter::TextAntialiasing);
+    setStyleSheet( "QGraphicsView { border-style: none; }" );
+    setMouseTracking(true);
+}
+
+//! Reset given view to original zoom state. Also asks graphics scene to do the same with color map.
+void MaskGraphicsView::onResetViewRequest()
+{
+    setZoomValue(1.0);
+}
+
+void MaskGraphicsView::wheelEvent(QWheelEvent *event)
+{
+    // hold control button
+    if(isControlButtonIsPressed(event)) {
+        centerOn(mapToScene(event->pos()));
+
+        if(event->delta() > 0) {
+            // Zoom in
+            increazeZoomValue();
+
+        } else {
+            // Zooming out
+            if(horizontalScrollBar()->isVisible() || verticalScrollBar()->isVisible())
+                decreazeZoomValue();
+        }
+    } else {
+        QGraphicsView::wheelEvent(event);
+    }
+}
+
+//! On resize event changes scene size and MaskGraphicsProxy so they would get the size of viewport
+void MaskGraphicsView::resizeEvent(QResizeEvent *event)
+{
+    QWidget::resizeEvent(event);
+    updateSize(event->size());
+//    foreach (QGraphicsItem *graphicsItem, scene()->items()) {
+//        if(MaskGraphicsProxy *proxy = dynamic_cast<MaskGraphicsProxy *>(graphicsItem)) {
+//            proxy->resize(event->size());
+//            scene()->setSceneRect(0,0,event->size().width(),event->size().height());
+//            proxy->setPos(0,0);
+//            qDebug() << "!!! Resizing" << this->size() << event->size();
+//        }
+//    }
+}
+
+void MaskGraphicsView::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key()) {
+    case Qt::Key_Left:
+        break;
+    case Qt::Key_Space:
+        if(!event->isAutoRepeat()) {
+            emit changeActivityRequest(MaskEditorFlags::PAN_ZOOM_MODE);
+        }
+        break;
+    case Qt::Key_Escape:
+        cancelCurrentDrawing();
+        break;
+    default:
+        QWidget::keyPressEvent(event);
+    }
+}
+
+void MaskGraphicsView::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key()) {
+    case Qt::Key_Space:
+        if(!event->isAutoRepeat()) {
+            emit changeActivityRequest(MaskEditorFlags::SELECTION_MODE);
+        }
+        break;
+    default:
+        QWidget::keyPressEvent(event);
+    }
+}
+
+
+bool MaskGraphicsView::isControlButtonIsPressed(QWheelEvent *event)
+{
+    if(event->modifiers().testFlag(Qt::ControlModifier)){
+        return true;
+    }
+    return false;
+}
+
+void MaskGraphicsView::cancelCurrentDrawing()
+{
+    MaskGraphicsScene *maskScene = dynamic_cast<MaskGraphicsScene *>(scene());
+    maskScene->cancelCurrentDrawing();
+}
+
+void MaskGraphicsView::setZoomValue(double zoom_value)
+{
+    if(zoom_value == m_current_zoom_value) return;
+    QMatrix oldMatrix = matrix();
+    resetMatrix();
+    translate(oldMatrix.dx(), oldMatrix.dy());
+    scale(zoom_value, zoom_value);
+    m_current_zoom_value = zoom_value;
+}
+
+void MaskGraphicsView::decreazeZoomValue()
+{
+    double zoom_value = m_current_zoom_value - zoom_step;
+    if(zoom_value < min_zoom_value) zoom_value = min_zoom_value;
+    setZoomValue(zoom_value);
+}
+
+void MaskGraphicsView::increazeZoomValue()
+{
+    double zoom_value = m_current_zoom_value + zoom_step;
+    if(zoom_value > max_zoom_value) zoom_value = max_zoom_value;
+    setZoomValue(zoom_value);
+}
+
+void MaskGraphicsView::updateSize(const QSize &newSize)
+{
+    foreach (QGraphicsItem *graphicsItem, scene()->items()) {
+        if(MaskGraphicsProxy *proxy = dynamic_cast<MaskGraphicsProxy *>(graphicsItem)) {
+            proxy->resize(newSize);
+            scene()->setSceneRect(0, 0, newSize.width(), newSize.height());
+            proxy->setPos(0,0);
+            qDebug() << "!!! Resizing" << this->size() << newSize;
+        }
+    }
+
+}
+
+
diff --git a/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h
new file mode 100644
index 0000000..3498925
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskGraphicsView.h
+//! @brief     Defines class MaskGraphicsView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKGRAPHICSVIEW_H
+#define MASKGRAPHICSVIEW_H
+
+#include "MaskEditorFlags.h"
+#include <QGraphicsView>
+
+class QWheelEvent;
+class MaskGraphicsProxy;
+
+//! Graphics view for MaskEditorCanvas
+
+class MaskGraphicsView : public QGraphicsView
+{
+    Q_OBJECT
+public:
+    MaskGraphicsView(QGraphicsScene *scene, QWidget *parent = 0);
+    QSize sizeHint() const { return QSize(512, 512); }
+    QSize minimumSizeHint() const { return QSize(128, 128); }
+
+public slots:
+    void onResetViewRequest();
+
+    void updateSize(const QSize &newSize);
+
+signals:
+    void changeActivityRequest(MaskEditorFlags::Activity);
+
+protected:
+    void wheelEvent(QWheelEvent* event);
+    void resizeEvent(QResizeEvent *event);
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+
+private:
+    bool isControlButtonIsPressed(QWheelEvent *event);
+    void cancelCurrentDrawing();
+
+    void setZoomValue(double zoom_value);
+    void decreazeZoomValue();
+    void increazeZoomValue();
+
+    double m_current_zoom_value;
+};
+
+
+#endif // MASKGRAPHICSVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.cpp b/GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.cpp
new file mode 100644
index 0000000..4d1305d
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.cpp
@@ -0,0 +1,128 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.cpp
+//! @brief     Implements class MaskResultsPresenter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskResultsPresenter.h"
+#include "DetectorMask.h"
+#include "IShape2D.h"
+#include "IntensityDataItem.h"
+#include "MaskItems.h"
+#include "OutputData.h"
+#include "SessionModel.h"
+#include "RegionOfInterest.h"
+#include <QDebug>
+#include <QVBoxLayout>
+
+MaskResultsPresenter::MaskResultsPresenter(QWidget *parent)
+    : QObject(parent)
+    , m_interpolation_flag_backup(false)
+{
+
+}
+
+void MaskResultsPresenter::setMaskContext(SessionModel *maskModel,
+                                          const QModelIndex &maskContainerIndex,
+                                          IntensityDataItem *intensityItem)
+{
+    m_maskModel = maskModel;
+    m_maskContainerIndex = maskContainerIndex;
+    m_intensityDataItem = intensityItem;
+}
+
+void MaskResultsPresenter::updatePresenter(MaskEditorFlags::PresentationType presentationType)
+{
+    if(!m_maskContainerIndex.isValid())
+        return;
+
+    if(presentationType == MaskEditorFlags::MASK_PRESENTER) {
+        setShowMaskMode();
+    } else if(presentationType == MaskEditorFlags::MASK_EDITOR) {
+        setOriginalMode();
+    }
+}
+
+//! Update IntensityDataItem in SessionModel to represent masked areas. Corresponding
+//! bins of OutputData will be put to zero.
+
+void MaskResultsPresenter::setShowMaskMode()
+{
+    if (OutputData<double> *maskedData = createMaskPresentation()) {
+        backup_data();
+        m_intensityDataItem->setOutputData(maskedData);
+        m_intensityDataItem->setItemValue(IntensityDataItem::P_IS_INTERPOLATED, false);
+    } else {
+        m_dataBackup.reset();
+    }
+}
+
+//! Restores original state of IntensityDataItem
+
+void MaskResultsPresenter::setOriginalMode()
+{
+    if (m_dataBackup) {
+        m_intensityDataItem->setOutputData(m_dataBackup->clone());
+        m_intensityDataItem->setItemValue(IntensityDataItem::P_IS_INTERPOLATED,
+                                          m_interpolation_flag_backup);
+    }
+}
+
+void MaskResultsPresenter::backup_data()
+{
+    m_interpolation_flag_backup
+        = m_intensityDataItem->getItemValue(IntensityDataItem::P_IS_INTERPOLATED).toBool();
+    m_dataBackup.reset(m_intensityDataItem->getOutputData()->clone());
+}
+
+//! Constructs OutputData which contains original intensity data except masked areas,
+//! and areas outside of ROI, where bin content is set to zero.
+
+OutputData<double> *MaskResultsPresenter::createMaskPresentation() const
+{
+    // Requesting mask information
+    std::unique_ptr<RegionOfInterest> roi;
+    DetectorMask detectorMask;
+    for (int i_row = m_maskModel->rowCount(m_maskContainerIndex); i_row > 0; --i_row) {
+        QModelIndex itemIndex = m_maskModel->index(i_row - 1, 0, m_maskContainerIndex);
+        if (MaskItem *maskItem = dynamic_cast<MaskItem *>(m_maskModel->itemForIndex(itemIndex))) {
+            if(maskItem->modelType() == Constants::RegionOfInterestType) {
+                double xlow = maskItem->getItemValue(RectangleItem::P_XLOW).toDouble();
+                double ylow = maskItem->getItemValue(RectangleItem::P_YLOW).toDouble();
+                double xup = maskItem->getItemValue(RectangleItem::P_XUP).toDouble();
+                double yup = maskItem->getItemValue(RectangleItem::P_YUP).toDouble();
+                roi.reset(new RegionOfInterest(*m_intensityDataItem->getOutputData(),
+                                               xlow, ylow, xup, yup));
+            } else {
+                std::unique_ptr<Geometry::IShape2D > shape(maskItem->createShape());
+                bool mask_value = maskItem->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+                detectorMask.addMask(*shape.get(), mask_value);
+            }
+        }
+    }
+
+    if (!detectorMask.hasMasks() && !roi)
+        return 0;
+
+    OutputData<double> *result = m_intensityDataItem->getOutputData()->clone();
+    detectorMask.initMaskData(*result);
+
+    for (size_t i = 0; i < result->getAllocatedSize(); ++i) {
+        if (detectorMask.isMasked(i))
+            (*result)[i] = 0.0;
+        if(roi && !roi->isInROI(i))
+            (*result)[i] = 0.0;
+    }
+
+    return result;
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.h b/GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.h
new file mode 100644
index 0000000..106571b
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskResultsPresenter.h
+//! @brief     Defines class MaskResultsPresenter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKRESULTSPRESENTER_H
+#define MASKRESULTSPRESENTER_H
+
+#include "MaskEditorFlags.h"
+#include "WinDllMacros.h"
+#include <QModelIndex>
+#include <QObject>
+#include <memory>
+
+class SessionModel;
+class ColorMapPlot;
+class IntensityDataItem;
+template<class T> class OutputData;
+
+//! Updates bin values inside IntensityData to display current mask state. Returns IntensityData
+//! to original state when requested.
+
+class BA_CORE_API_ MaskResultsPresenter : public QObject
+{
+public:
+    MaskResultsPresenter(QWidget *parent = 0);
+
+    void setMaskContext(SessionModel *maskModel, const QModelIndex &maskContainerIndex,
+                        IntensityDataItem *intensityItem);
+
+    void updatePresenter(MaskEditorFlags::PresentationType mode);
+
+private:
+    void setShowMaskMode();
+    void setOriginalMode();
+    void backup_data();
+    OutputData<double> *createMaskPresentation() const;
+
+    SessionModel *m_maskModel;
+    QModelIndex m_maskContainerIndex;
+    IntensityDataItem *m_intensityDataItem;
+    std::unique_ptr<OutputData<double>> m_dataBackup;
+    bool m_interpolation_flag_backup;
+};
+
+#endif // MASKRESULTSPRESENTER_H
+
diff --git a/GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.cpp b/GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.cpp
new file mode 100644
index 0000000..c36d707
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.cpp
@@ -0,0 +1,145 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.cpp
+//! @brief     Implements class MaskUnitsConverter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskUnitsConverter.h"
+#include "IntensityDataItem.h"
+#include "MaskItems.h"
+#include "BornAgainNamespace.h"
+#include "IntensityDataFunctions.h"
+#include "GUIHelpers.h"
+#include <QDebug>
+
+MaskUnitsConverter::MaskUnitsConverter()
+    : mp_data(0)
+    , m_direction(UNDEFINED)
+{
+
+}
+
+//! Converts all masks on board of IntensityDataItem into bin-fraction coordinates.
+
+void MaskUnitsConverter::convertToNbins(IntensityDataItem *intensityData)
+{
+    m_direction = TO_NBINS;
+    convertIntensityDataItem(intensityData);
+}
+
+//! Converts all masks on board of IntensityDataItem from bin-fraction coordinates to coordinates
+//! of axes currently defined in OutputData.
+
+void MaskUnitsConverter::convertFromNbins(IntensityDataItem *intensityData)
+{
+    m_direction = FROM_NBINS;
+    convertIntensityDataItem(intensityData);
+}
+
+//! Converts all masks on board of IntensityDataItem from/to bin-fraction coordinates
+
+void MaskUnitsConverter::convertIntensityDataItem(IntensityDataItem *intensityData)
+{
+    if(!intensityData || !intensityData->getOutputData() || !intensityData->maskContainerItem())
+        return;
+
+    mp_data = intensityData->getOutputData();
+
+    foreach(SessionItem *maskItem, intensityData->maskContainerItem()->getItems())
+        convertMask(maskItem);
+}
+
+//! Converts single mask from/to bin-fraction coordinates
+
+void MaskUnitsConverter::convertMask(SessionItem *maskItem)
+{
+    if(maskItem->modelType() == Constants::RectangleMaskType ||
+            maskItem->modelType() == Constants::RegionOfInterestType) {
+        convertCoordinate(maskItem, RectangleItem::P_XLOW, RectangleItem::P_YLOW);
+        convertCoordinate(maskItem, RectangleItem::P_XUP, RectangleItem::P_YUP);
+    }
+
+    else if(maskItem->modelType() == Constants::PolygonMaskType) {
+        foreach (SessionItem *pointItem, maskItem->getChildrenOfType(Constants::PolygonPointType))
+            convertCoordinate(pointItem, PolygonPointItem::P_POSX, PolygonPointItem::P_POSY);
+    }
+
+    else if(maskItem->modelType() == Constants::VerticalLineMaskType) {
+        convertCoordinate(maskItem, VerticalLineItem::P_POSX, QString());
+    }
+
+    else if(maskItem->modelType() == Constants::HorizontalLineMaskType) {
+        convertCoordinate(maskItem, QString(), HorizontalLineItem::P_POSY);
+    }
+
+    else if(maskItem->modelType() == Constants::EllipseMaskType) {
+        double xc = maskItem->getItemValue(EllipseItem::P_XCENTER).toDouble();
+        double yc = maskItem->getItemValue(EllipseItem::P_YCENTER).toDouble();
+        double xR = maskItem->getItemValue(EllipseItem::P_XRADIUS).toDouble();
+        double yR = maskItem->getItemValue(EllipseItem::P_YRADIUS).toDouble();
+
+        double x2 = xc + xR;
+        double y2 = yc + yR;
+
+        if(m_direction == TO_NBINS) {
+            IntensityDataFunctions::coordinateToBinf(xc, yc, *mp_data);
+            IntensityDataFunctions::coordinateToBinf(x2, y2, *mp_data);
+        } else {
+            IntensityDataFunctions::coordinateFromBinf(xc, yc, *mp_data);
+            IntensityDataFunctions::coordinateFromBinf(x2, y2, *mp_data);
+        }
+
+        maskItem->setItemValue(EllipseItem::P_XCENTER, xc);
+        maskItem->setItemValue(EllipseItem::P_YCENTER, yc);
+        maskItem->setItemValue(EllipseItem::P_XRADIUS, x2 - xc);
+        maskItem->setItemValue(EllipseItem::P_YRADIUS, y2 - yc);
+
+    }
+
+}
+
+//! Convert (x,y) coordinates registered as property (i.e. under P_XPOS, P_YPOS) from/to
+//! bin-fraction coordinates. Result of operation are new values for registered properties.
+
+void MaskUnitsConverter::convertCoordinate(SessionItem *maskItem, const QString &xname,
+                                           const QString &yname)
+{
+    if(maskItem->isTag(xname)) {
+        double x = convert(maskItem->getItemValue(xname).toDouble(), BornAgain::X_AXIS_INDEX);
+        maskItem->setItemValue(xname, x);
+    }
+
+    if(maskItem->isTag(yname)) {
+        double y = convert(maskItem->getItemValue(yname).toDouble(), BornAgain::Y_AXIS_INDEX);
+        maskItem->setItemValue(yname, y);
+    }
+
+}
+
+//! Convert value of axis from/to bin-fraction coordinates.
+
+double MaskUnitsConverter::convert(double value, int axis_index)
+{
+    Q_ASSERT(mp_data);
+    Q_ASSERT(axis_index == BornAgain::X_AXIS_INDEX || axis_index == BornAgain::Y_AXIS_INDEX);
+
+    if(m_direction == TO_NBINS) {
+        return IntensityDataFunctions::coordinateToBinf(value, mp_data->getAxis(axis_index));
+
+    } else if (m_direction == FROM_NBINS){
+        return IntensityDataFunctions::coordinateFromBinf(value, mp_data->getAxis(axis_index));
+    }
+
+    throw GUIHelpers::Error("MaskUnitsConverter::convertX() -> Error. Unknown convertion");
+}
+
diff --git a/GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.h b/GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.h
new file mode 100644
index 0000000..ff2838f
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.h
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.h
+//! @brief     Defines class MaskUnitsConverter
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKUNITSCONVERTER_H
+#define MASKUNITSCONVERTER_H
+
+#include "WinDllMacros.h"
+
+class IntensityDataItem;
+class SessionItem;
+class IAxis;
+template<class T> class OutputData;
+class QString;
+
+//! The MaskUnitsConverter converts coordinates of all masks from one units to anoter.
+//! I.e. masks in 'mm' into masks in 'deg'. This is done in two steps.
+//! On first step masks are converted from native coordinates (as given by axes of OutputData)
+//! into bin-fraction coordinates.
+//! On second step masks are converted from bin-fraction coordinates into current axes of OutputData.
+
+class BA_CORE_API_ MaskUnitsConverter
+{
+public:
+    enum EConvertionDirection {TO_NBINS, FROM_NBINS, UNDEFINED};
+
+    MaskUnitsConverter();
+
+    void convertToNbins(IntensityDataItem *intensityData);
+    void convertFromNbins(IntensityDataItem *intensityData);
+
+private:
+    void convertIntensityDataItem(IntensityDataItem *intensityData);
+    void convertMask(SessionItem *maskItem);
+
+    void convertCoordinate(SessionItem *maskItem, const QString &xname,
+                       const QString &yname);
+
+    double convert(double value, int axis_index);
+
+    const OutputData<double> *mp_data;
+    EConvertionDirection m_direction;
+};
+
+#endif // MASKUNITSCONVERTER_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskViewFactory.cpp b/GUI/coregui/Views/MaskWidgets/MaskViewFactory.cpp
new file mode 100644
index 0000000..422e3e1
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskViewFactory.cpp
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskViewFactory.cpp
+//! @brief     Implements class MaskViewFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaskViewFactory.h"
+#include "EllipseView.h"
+#include "GUIHelpers.h"
+#include "IMaskView.h"
+#include "IntensityDataView.h"
+#include "LineViews.h"
+#include "MaskAllView.h"
+#include "MaskContainerView.h"
+#include "PolygonPointView.h"
+#include "PolygonView.h"
+#include "RectangleView.h"
+#include "RegionOfInterestView.h"
+#include "SessionItem.h"
+#include "item_constants.h"
+
+IMaskView *MaskViewFactory::createMaskView(SessionItem *item,
+                                           ISceneAdaptor *adaptor)
+{
+    IMaskView *result(0);
+    QString model_type = item->modelType();
+
+    if(model_type == Constants::MaskContainerType) {
+        result = new MaskContainerView();
+    }
+
+    else if(model_type == Constants::RectangleMaskType) {
+        result = new RectangleView();
+    }
+
+    else if(model_type == Constants::PolygonMaskType) {
+        result = new PolygonView();
+    }
+
+    else if(model_type == Constants::PolygonPointType) {
+        result = new PolygonPointView();
+    }
+
+    else if(model_type == Constants::VerticalLineMaskType) {
+        result = new VerticalLineView();
+    }
+
+    else if(model_type == Constants::HorizontalLineMaskType) {
+        result = new HorizontalLineView();
+    }
+
+    else if(model_type == Constants::EllipseMaskType) {
+        result = new EllipseView();
+    }
+
+    else if(model_type == Constants::MaskAllType) {
+        result = new MaskAllView();
+    }
+
+    else if(model_type == Constants::RegionOfInterestType) {
+        result = new RegionOfInterestView();
+    }
+
+
+    else {
+        throw GUIHelpers::Error("MaskViewFactory::createSampleView() -> Error! "
+                                "Can't create a view for " + model_type);
+    }
+
+    result->setParameterizedItem(item);
+    result->setSceneAdaptor(adaptor);
+
+    return result;
+}
diff --git a/GUI/coregui/Views/MaskWidgets/MaskViewFactory.h b/GUI/coregui/Views/MaskWidgets/MaskViewFactory.h
new file mode 100644
index 0000000..9ac8443
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskViewFactory.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/MaskViewFactory.h
+//! @brief     Defines class MaskViewFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MASKVIEWFACTORY_H
+#define MASKVIEWFACTORY_H
+
+#include "WinDllMacros.h"
+#include <QString>
+
+class IMaskView;
+class SessionItem;
+class ISceneAdaptor;
+
+//! Factory to construct views out of MaskItems for MaskGraphicsScene
+
+class BA_CORE_API_ MaskViewFactory
+{
+public:
+    static IMaskView *createMaskView(SessionItem *item,
+                                     ISceneAdaptor *adaptor = 0);
+};
+
+#endif // MASKVIEWFACTORY_H
diff --git a/GUI/coregui/Views/MaskWidgets/MaskWidgets.qrc b/GUI/coregui/Views/MaskWidgets/MaskWidgets.qrc
new file mode 100644
index 0000000..415b729
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/MaskWidgets.qrc
@@ -0,0 +1,20 @@
+<RCC>
+    <qresource prefix="/MaskWidgets">
+        <file>images/maskeditor_arrow.svg</file>
+        <file>images/maskeditor_hand.svg</file>
+        <file>images/maskeditor_refresh.svg</file>
+        <file>images/maskeditor_rectangle.svg</file>
+        <file>images/maskeditor_ellipse.svg</file>
+        <file>images/maskeditor_polygon.svg</file>
+        <file>images/maskeditor_bringtofront.svg</file>
+        <file>images/maskeditor_sendtoback.svg</file>
+        <file>images/maskeditor_maskall.svg</file>
+        <file>images/maskeditor_verticalline.svg</file>
+        <file>images/maskeditor_horizontalline.svg</file>
+        <file>images/maskeditor_toolpanel.svg</file>
+        <file>images/maskeditor_masktrue.svg</file>
+        <file>images/maskeditor_maskfalse.svg</file>
+        <file>images/maskeditor_lightbulb.svg</file>
+        <file>images/maskeditor_roi.svg</file>
+    </qresource>
+</RCC>
diff --git a/GUI/coregui/Views/MaskWidgets/PolygonPointView.cpp b/GUI/coregui/Views/MaskWidgets/PolygonPointView.cpp
new file mode 100644
index 0000000..68a20e7
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/PolygonPointView.cpp
@@ -0,0 +1,79 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/PolygonPointView.cpp
+//! @brief     Implements PolygonPointView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PolygonPointView.h"
+#include "ISceneAdaptor.h"
+#include "MaskEditorHelper.h"
+#include "MaskItems.h"
+#include <QCursor>
+#include <QDebug>
+#include <QGraphicsSceneMouseEvent>
+#include <QPainter>
+
+PolygonPointView::PolygonPointView()
+    : m_on_hover(false)
+{
+    setFlag(QGraphicsItem::ItemIsMovable );
+    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+}
+
+QRectF PolygonPointView::boundingRect() const
+{
+    return QRectF(-4, -4, 8, 8);
+}
+
+void PolygonPointView::updateParameterizedItem(const QPointF &pos)
+{
+    m_item->setItemValue(PolygonPointItem::P_POSX, fromSceneX(pos.x()));
+    m_item->setItemValue(PolygonPointItem::P_POSY, fromSceneY(pos.y()));
+}
+
+void PolygonPointView::update_view()
+{
+    update();
+}
+
+void PolygonPointView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    painter->setRenderHints(QPainter::Antialiasing);
+    QBrush brush = MaskEditorHelper::getSelectionMarkerBrush();
+    if(acceptHoverEvents() && m_on_hover) {
+        brush.setColor(Qt::red);
+    }
+    painter->setBrush(brush);
+    painter->setPen(MaskEditorHelper::getSelectionMarkerPen());
+    painter->drawEllipse(boundingRect());
+}
+
+void PolygonPointView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    updateParameterizedItem(event->scenePos());
+}
+
+void PolygonPointView::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
+{
+    Q_UNUSED(event);
+    m_on_hover = true;
+    emit closePolygonRequest(m_on_hover);
+    IMaskView::hoverEnterEvent(event);
+}
+
+void PolygonPointView::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
+{
+    m_on_hover = false;
+    emit closePolygonRequest(m_on_hover);
+    IMaskView::hoverLeaveEvent(event);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/PolygonPointView.h b/GUI/coregui/Views/MaskWidgets/PolygonPointView.h
new file mode 100644
index 0000000..67e6e83
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/PolygonPointView.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/PolygonPointView.h
+//! @brief     Defines PolygonPointView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef POLYGONPOINTVIEW_H
+#define POLYGONPOINTVIEW_H
+
+#include "IMaskView.h"
+
+//! This is a View of polygon point for PolygonMaskItem
+
+class BA_CORE_API_ PolygonPointView : public IMaskView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = MaskEditorHelper::POLYGONPOINT };
+    int type() const { return TYPE; }
+
+    PolygonPointView();
+
+    QRectF boundingRect() const;
+
+    void updateParameterizedItem(const QPointF &pos);
+
+signals:
+    void closePolygonRequest(bool);
+
+public slots:
+    virtual void update_view();
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+    void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+    void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+
+private:
+    bool m_on_hover;
+};
+
+#endif // POLYGONPOINTVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/PolygonView.cpp b/GUI/coregui/Views/MaskWidgets/PolygonView.cpp
new file mode 100644
index 0000000..fef267a
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/PolygonView.cpp
@@ -0,0 +1,208 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/PolygonView.cpp
+//! @brief     Implements PolygonView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PolygonView.h"
+#include "ISceneAdaptor.h"
+#include "MaskEditorHelper.h"
+#include "MaskItems.h"
+#include "PolygonPointView.h"
+#include <QCursor>
+#include <QDebug>
+#include <QGraphicsItem>
+#include <QGraphicsPolygonItem>
+#include <QGraphicsSceneMouseEvent>
+#include <QPainter>
+#include <QRectF>
+
+namespace {
+const double bbox_margins = 5; // additional margins around points to form bounding box
+}
+
+PolygonView::PolygonView()
+    : m_block_on_point_update(false)
+    , m_close_polygon_request(false)
+{
+    setFlag(QGraphicsItem::ItemIsSelectable);
+    setFlag(QGraphicsItem::ItemIsMovable );
+    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+}
+
+void PolygonView::addView(IMaskView *childView, int row)
+{
+    Q_UNUSED(row);
+
+    if(childItems().contains(childView)) return;
+
+    PolygonPointView *pointView = dynamic_cast<PolygonPointView *>(childView);
+    Q_ASSERT(pointView);
+    pointView->setParentItem(this);
+
+    // polygon consisting from more than 2 points can be closed via hover event by clicking
+    // on first polygon point
+    if(!isClosedPolygon() && childItems().size() > 2) {
+        childItems()[0]->setAcceptHoverEvents(true);
+    }
+
+    pointView->setVisible(true);
+    update_polygon();
+
+    connect(pointView, SIGNAL(propertyChanged()), this, SLOT(update_view()));
+    connect(pointView, SIGNAL(closePolygonRequest(bool)), this, SLOT(onClosePolygonRequest(bool)));
+}
+
+//! returns last added poligon point in scene coordinates
+QPointF PolygonView::getLastAddedPoint() const
+{
+    QPointF result;
+    if(childItems().size()) {
+        result = childItems().back()->scenePos();
+    }
+    return result;
+}
+
+//! Returns true if there was a request to close polygon (emitted by its start point),
+//! and then closes a polygon. Returns true if polygon was closed.
+bool PolygonView::closePolygonIfNecessary()
+{
+    if(m_close_polygon_request) {
+        foreach(QGraphicsItem *childItem, childItems()) {
+            childItem->setFlag(QGraphicsItem::ItemIsMovable );
+            childItem->setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+            childItem->setAcceptHoverEvents(false);
+            childItem->setCursor(Qt::SizeAllCursor);
+        }
+        m_item->setItemValue(PolygonItem::P_ISCLOSED, true);
+        update();
+    }
+    return isClosedPolygon();
+}
+
+void PolygonView::onClosePolygonRequest(bool value)
+{
+    m_close_polygon_request = value;
+}
+
+bool PolygonView::isClosedPolygon()
+{
+    return m_item->getItemValue(PolygonItem::P_ISCLOSED).toBool();
+}
+
+void PolygonView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    Q_ASSERT(m_item);
+    painter->setRenderHints(QPainter::Antialiasing);
+
+    bool mask_value = m_item->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+    painter->setBrush(MaskEditorHelper::getMaskBrush(mask_value));
+    painter->setPen(MaskEditorHelper::getMaskPen(mask_value));
+
+    // painter->drawRect(m_bounding_rect);
+
+    painter->drawPolyline(m_polygon.toPolygon());
+
+    if(isClosedPolygon()) {
+        painter->drawPolygon(m_polygon.toPolygon());
+    }
+
+}
+
+QVariant PolygonView::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+{
+    qDebug() << "PolygonView::itemChange" << change << value << this->isSelected();
+    if(change == QGraphicsItem::ItemSelectedHasChanged) {
+        if(this->isSelected()) {
+            setChildrenVisible(true);
+        } else {
+            setChildrenVisible(false);
+        }
+    }
+    return value;
+}
+
+void PolygonView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    IMaskView::mouseMoveEvent(event);
+    update_points();
+}
+
+void PolygonView::update_view()
+{
+//    prepareGeometryChange();
+    update_polygon();
+    update();
+}
+
+//! Runs through all PolygonPointItem and calculate bounding rectangle.
+//! Determines position of the rectangle in scene.
+//! Calculates position of PolygonPointView in local polygon coordinates
+void PolygonView::update_polygon()
+{
+    if(m_block_on_point_update) return;
+
+    m_block_on_point_update = true;
+
+    if (m_item->rowCount()) {
+
+        m_polygon.clear();
+
+        foreach (SessionItem *item, m_item->getChildrenOfType(Constants::PolygonPointType)) {
+            qreal px = toSceneX(item->getItemValue(PolygonPointItem::P_POSX).toReal());
+            qreal py = toSceneY(item->getItemValue(PolygonPointItem::P_POSY).toReal());
+            m_polygon << QPointF(px, py);
+        }
+
+        QRectF scene_rect = m_polygon.boundingRect().marginsAdded(
+            QMarginsF(bbox_margins, bbox_margins, bbox_margins, bbox_margins));
+
+        m_bounding_rect = QRectF(0.0, 0.0, scene_rect.width(), scene_rect.height());
+
+        setPos(scene_rect.x(), scene_rect.y());
+        update(); // to propagate changes to scene
+
+        m_polygon = mapFromScene(m_polygon);
+
+        for (int i = 0; i < childItems().size(); ++i) {
+            QGraphicsItem *childView = childItems()[i];
+            childView->setPos(m_polygon[i]);
+        }
+
+        setPos(scene_rect.x(), scene_rect.y());
+    }
+
+    m_block_on_point_update = false;
+}
+
+//! When polygon moves as a whole thing accross the scene, given method updates coordinates
+//! of PolygonPointItem's
+void PolygonView::update_points()
+{
+    if(m_block_on_point_update) return;
+
+    foreach(QGraphicsItem *childItem, childItems()) {
+        PolygonPointView *view = dynamic_cast<PolygonPointView *>(childItem);
+        QPointF pos = view->scenePos();
+        disconnect(view, SIGNAL(propertyChanged()), this, SLOT(update_view()));
+        view->updateParameterizedItem(pos);
+        connect(view, SIGNAL(propertyChanged()), this, SLOT(update_view()));
+   }
+}
+
+void PolygonView::setChildrenVisible(bool value)
+{
+    foreach(QGraphicsItem *childItem, childItems()) {
+        childItem->setVisible(value);
+    }
+}
diff --git a/GUI/coregui/Views/MaskWidgets/PolygonView.h b/GUI/coregui/Views/MaskWidgets/PolygonView.h
new file mode 100644
index 0000000..7ea9876
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/PolygonView.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/PolygonView.h
+//! @brief     Defines PolygonView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef POLYGONVIEW_H
+#define POLYGONVIEW_H
+
+#include "IMaskView.h"
+#include <QPolygonF>
+
+//! This is a View of polygon mask (represented by PolygonItem) on GraphicsScene.
+
+class BA_CORE_API_ PolygonView : public IMaskView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::POLYGON; }
+
+    PolygonView();
+
+    void addView(IMaskView *childView, int row);
+    bool isClosedPolygon();
+    QPointF getLastAddedPoint() const;
+
+public slots:
+    bool closePolygonIfNecessary();
+    void onClosePolygonRequest(bool value);
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+
+private:
+    void update_view();
+    void update_polygon();
+    void update_points();
+    void setChildrenVisible(bool value);
+    bool makePolygonClosed();
+
+    QPolygonF m_polygon;
+    bool m_block_on_point_update;
+    bool m_close_polygon_request;
+};
+
+#endif // POLYGONVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/RectangleBaseView.cpp b/GUI/coregui/Views/MaskWidgets/RectangleBaseView.cpp
new file mode 100644
index 0000000..cb260de
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/RectangleBaseView.cpp
@@ -0,0 +1,126 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/RectangleBaseView.cpp
+//! @brief     Implements RectangleBaseView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RectangleBaseView.h"
+#include "ISceneAdaptor.h"
+#include "MaskEditorHelper.h"
+#include "MaskItems.h"
+#include "SizeHandleElement.h"
+#include <QDebug>
+#include <QGraphicsSceneMouseEvent>
+#include <QMarginsF>
+#include <QPainter>
+#include <QRegion>
+
+namespace {
+const double bbox_margins = 5; // additional margins around rectangle to form bounding box
+}
+
+RectangleBaseView::RectangleBaseView()
+    : m_block_on_property_change(false)
+    , m_activeHandleElement(0)
+{
+    setFlag(QGraphicsItem::ItemIsSelectable);
+    setFlag(QGraphicsItem::ItemIsMovable );
+    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+    setAcceptHoverEvents(true);
+    create_size_handle_elements();
+}
+
+//! triggered by SizeHandleElement
+void RectangleBaseView::onSizeHandleElementRequest(bool going_to_resize)
+{
+    if(going_to_resize) {
+        setFlag(QGraphicsItem::ItemIsMovable, false);
+        m_activeHandleElement = qobject_cast<SizeHandleElement *>(sender());
+        Q_ASSERT(m_activeHandleElement);
+        SizeHandleElement::EHandleLocation oposite_corner
+                = m_activeHandleElement->getOppositeHandleLocation();
+        m_resize_opposite_origin = m_resize_handles[oposite_corner]->scenePos();
+    } else {
+        setFlag(QGraphicsItem::ItemIsMovable, true);
+        m_activeHandleElement = 0;
+    }
+}
+
+//! Track if item selected/deselected and show/hide size handles
+QVariant RectangleBaseView::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+{
+    if(change == QGraphicsItem::ItemSelectedChange) {
+        for(QMap<SizeHandleElement::EHandleLocation, SizeHandleElement *>::iterator
+            it = m_resize_handles.begin(); it!= m_resize_handles.end(); ++it) {
+            it.value()->setVisible(!this->isSelected());
+        }
+    }
+    return value;
+}
+
+void RectangleBaseView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    onSizeHandleElementRequest(false);
+    IMaskView::mouseReleaseEvent(event);
+}
+
+void RectangleBaseView::update_view()
+{
+    prepareGeometryChange();
+    update_bounding_rect();
+    update_position();
+}
+
+//! updates view's bounding rectangle using item properties
+
+void RectangleBaseView::update_bounding_rect()
+{
+    if(m_item) {
+        m_mask_rect = mask_rectangle();
+        m_bounding_rect = m_mask_rect.marginsAdded(QMarginsF(bbox_margins, bbox_margins,
+                                                      bbox_margins, bbox_margins));
+    }
+    for(QMap<SizeHandleElement::EHandleLocation, SizeHandleElement *>::iterator
+            it = m_resize_handles.begin(); it!= m_resize_handles.end(); ++it) {
+        it.value()->updateHandleElementPosition(m_mask_rect);
+    }
+}
+
+//! returns width of the rectangle
+
+qreal RectangleBaseView::width() const
+{
+    return right() - left();
+}
+
+qreal RectangleBaseView::height() const
+{
+    return bottom() - top();
+}
+
+void RectangleBaseView::create_size_handle_elements()
+{
+    QList<SizeHandleElement::EHandleLocation> points;
+    points << SizeHandleElement::TOPLEFT << SizeHandleElement::TOPMIDDLE
+           << SizeHandleElement::TOPRIGHT
+           << SizeHandleElement::MIDDLERIGHT << SizeHandleElement::BOTTOMRIGHT
+           << SizeHandleElement::BOTTOMMIDLE << SizeHandleElement::BOTTOMLEFT
+           << SizeHandleElement::MIDDLELEFT;
+
+    foreach(SizeHandleElement::EHandleLocation point_type, points) {
+        SizeHandleElement *el = new SizeHandleElement(point_type, this);
+        connect(el, SIGNAL(resize_request(bool)), this, SLOT(onSizeHandleElementRequest(bool)));
+        el->setVisible(false);
+        m_resize_handles[point_type] = el;
+    }
+}
diff --git a/GUI/coregui/Views/MaskWidgets/RectangleBaseView.h b/GUI/coregui/Views/MaskWidgets/RectangleBaseView.h
new file mode 100644
index 0000000..bbe38c4
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/RectangleBaseView.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/RectangleBaseView.h
+//! @brief     Defines RectangleBaseView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RECTANGLEBASEVIEW_H
+#define RECTANGLEBASEVIEW_H
+
+#include "IMaskView.h"
+#include "SizeHandleElement.h"
+#include <QMap>
+
+//! Base view for all rectangular-like masks.
+
+class BA_CORE_API_ RectangleBaseView : public IMaskView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::RECTANGLEBASE; }
+
+    RectangleBaseView();
+
+private slots:
+    void onSizeHandleElementRequest(bool going_to_resize);
+
+protected:
+    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+protected:
+    void update_view();
+
+    virtual void update_bounding_rect();
+    virtual void update_position() = 0;
+    virtual QRectF mask_rectangle() = 0;
+    virtual qreal left() const = 0;
+    virtual qreal right() const = 0;
+    virtual qreal top() const = 0;
+    virtual qreal bottom() const = 0;
+
+    qreal width() const;
+    qreal height() const;
+
+    void create_size_handle_elements();
+    bool m_block_on_property_change;
+    QRectF m_mask_rect; //!< mask rectangle in scene coordinates
+    QMap<SizeHandleElement::EHandleLocation, SizeHandleElement *> m_resize_handles;
+     //!< coordinates of corner opposite to the grip corner at the moment it first clicked
+     //!< in scene coordinates
+    QPointF m_resize_opposite_origin;
+    SizeHandleElement *m_activeHandleElement;
+};
+
+#endif // RECTANGLEBASEVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/RectangleView.cpp b/GUI/coregui/Views/MaskWidgets/RectangleView.cpp
new file mode 100644
index 0000000..100081a
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/RectangleView.cpp
@@ -0,0 +1,133 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/RectangleView.cpp
+//! @brief     Implements RectangleView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RectangleView.h"
+#include "MaskItems.h"
+#include <QDebug>
+#include <QGraphicsSceneMouseEvent>
+#include <QPainter>
+
+RectangleView::RectangleView()
+{
+}
+
+void RectangleView::onChangedX()
+{
+    m_block_on_property_change = true;
+    m_item->setItemValue(RectangleItem::P_XLOW, fromSceneX(this->x()));
+    m_item->setItemValue(RectangleItem::P_XUP, fromSceneX(this->x() + m_mask_rect.width()));
+    m_block_on_property_change = false;
+}
+
+void RectangleView::onChangedY()
+{
+    m_block_on_property_change = true;
+    m_item->setItemValue(RectangleItem::P_YLOW, fromSceneY(this->y() + m_mask_rect.height()));
+    m_item->setItemValue(RectangleItem::P_YUP, fromSceneY(this->y()));
+    m_block_on_property_change = false;
+}
+
+void RectangleView::onPropertyChange(const QString &propertyName)
+{
+    if(m_block_on_property_change) return;
+
+    if(propertyName == MaskItem::P_MASK_VALUE) {
+        update();
+    } else {
+        update_view();
+    }
+}
+
+void RectangleView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    bool mask_value = m_item->getItemValue(MaskItem::P_MASK_VALUE).toBool();
+    painter->setBrush(MaskEditorHelper::getMaskBrush(mask_value));
+    painter->setPen(MaskEditorHelper::getMaskPen(mask_value));
+    painter->drawRect(m_mask_rect);
+}
+
+void RectangleView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(m_activeHandleElement) {
+
+        qreal xmin = std::min(event->scenePos().x(),m_resize_opposite_origin.x());
+        qreal xmax = std::max(event->scenePos().x(),m_resize_opposite_origin.x());
+        qreal ymin = std::min(event->scenePos().y(),m_resize_opposite_origin.y());
+        qreal ymax = std::max(event->scenePos().y(),m_resize_opposite_origin.y());
+
+        if(m_activeHandleElement->getHandleType() == SizeHandleElement::RESIZE) {
+            m_item->setItemValue(RectangleItem::P_XLOW, fromSceneX(xmin));
+            m_item->setItemValue(RectangleItem::P_YLOW, fromSceneY(ymax));
+            m_item->setItemValue(RectangleItem::P_XUP, fromSceneX(xmax));
+            m_item->setItemValue(RectangleItem::P_YUP, fromSceneY(ymin));
+
+        } else if(m_activeHandleElement->getHandleType() == SizeHandleElement::RESIZE_HEIGHT) {
+            m_item->setItemValue(RectangleItem::P_YLOW, fromSceneY(ymax));
+            m_item->setItemValue(RectangleItem::P_YUP, fromSceneY(ymin));
+
+        } else if(m_activeHandleElement->getHandleType() == SizeHandleElement::RESIZE_WIDTH) {
+
+            m_item->setItemValue(RectangleItem::P_XLOW, fromSceneX(xmin));
+            m_item->setItemValue(RectangleItem::P_XUP, fromSceneX(xmax));
+
+        }
+        update_view();
+
+    } else {
+        IMaskView::mouseMoveEvent(event);
+    }
+}
+
+//! updates position of view using item properties
+void RectangleView::update_position()
+{
+    setX(toSceneX(RectangleItem::P_XLOW));
+    setY(toSceneY(RectangleItem::P_YUP));    
+}
+
+QRectF RectangleView::mask_rectangle()
+{
+    return QRectF(0.0, 0.0, width(), height());
+}
+
+//! returns the x-coordinate of the rectangle's left edge
+
+qreal RectangleView::left() const
+{
+    return toSceneX(par(RectangleItem::P_XLOW));
+}
+
+//! returns the x-coordinate of the rectangle's right edge
+
+qreal RectangleView::right() const
+{
+    return toSceneX(par(RectangleItem::P_XUP));
+}
+
+//! Returns the y-coordinate of the rectangle's top edge.
+
+qreal RectangleView::top() const
+{
+    return toSceneY(par(RectangleItem::P_YUP));
+}
+
+//! Returns the y-coordinate of the rectangle's bottom edge.
+
+qreal RectangleView::bottom() const
+{
+    return toSceneY(par(RectangleItem::P_YLOW));
+}
+
diff --git a/GUI/coregui/Views/MaskWidgets/RectangleView.h b/GUI/coregui/Views/MaskWidgets/RectangleView.h
new file mode 100644
index 0000000..a841fc7
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/RectangleView.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/RectangleView.h
+//! @brief     Defines RectangleView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RECTANGLEVIEW_H
+#define RECTANGLEVIEW_H
+
+#include "RectangleBaseView.h"
+
+//! This is a View of rectangular mask (represented by RectangleItem) on GraphicsScene.
+//! Given view follows standard QGraphicsScene notations: (x,y) is top left corner.
+
+class BA_CORE_API_ RectangleView : public RectangleBaseView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::RECTANGLE; }
+
+    RectangleView();
+
+public slots:
+    virtual void onChangedX();
+    virtual void onChangedY();
+    virtual void onPropertyChange(const QString &propertyName);
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+
+protected:
+    void update_position();
+    QRectF mask_rectangle();
+    qreal left() const;
+    qreal right() const;
+    qreal top() const;
+    qreal bottom() const;
+};
+
+#endif // RECTANGLEVIEW_H
diff --git a/GUI/coregui/Views/MaskWidgets/RegionOfInterestView.cpp b/GUI/coregui/Views/MaskWidgets/RegionOfInterestView.cpp
new file mode 100644
index 0000000..bc9db68
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/RegionOfInterestView.cpp
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/RegionOfInterestView.cpp
+//! @brief     Defines RegionOfInterestView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "RegionOfInterestView.h"
+#include <QPainter>
+
+//! Paints two-color tiny frame without filling.
+
+void RegionOfInterestView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    painter->setPen(QPen(QColor(34, 67, 255)));
+    painter->drawRect(m_mask_rect);
+
+    QRectF secondRect = m_mask_rect.marginsAdded(QMarginsF(1, 1, 1, 1));
+    painter->setPen(QPen(QColor(255, 255, 245)));
+    painter->drawRect(secondRect);
+}
diff --git a/GUI/coregui/Views/MaskWidgets/RegionOfInterestView.h b/GUI/coregui/Views/MaskWidgets/RegionOfInterestView.h
new file mode 100644
index 0000000..ea08105
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/RegionOfInterestView.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/RegionOfInterestView.h
+//! @brief     Defines RegionOfInterestView class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef REGIONOFINTERESTVIEW_H
+#define REGIONOFINTERESTVIEW_H
+
+#include "RectangleView.h"
+
+//! The RegionOfInterest class represent view of RegionOfInterestItem on graphics scene.
+
+class BA_CORE_API_ RegionOfInterestView : public RectangleView
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::REGIONOFINTEREST; }
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+
+};
+
+#endif // REGIONOFINTERESTVIEW_H
+
diff --git a/GUI/coregui/Views/MaskWidgets/SizeHandleElement.cpp b/GUI/coregui/Views/MaskWidgets/SizeHandleElement.cpp
new file mode 100644
index 0000000..96a88da
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/SizeHandleElement.cpp
@@ -0,0 +1,178 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/SizeHandleElement.cpp
+//! @brief     Implements SizeHandleElement class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SizeHandleElement.h"
+#include "ISceneAdaptor.h"
+#include "MaskEditorHelper.h"
+#include <QDebug>
+#include <QGraphicsSceneHoverEvent>
+#include <QPainter>
+
+namespace {
+QMap<SizeHandleElement::EHandleLocation, Qt::CursorShape> create_cursors_map()
+{
+    QMap<SizeHandleElement::EHandleLocation, Qt::CursorShape> result;
+    result[SizeHandleElement::NONE] = Qt::ArrowCursor;
+    result[SizeHandleElement::TOPLEFT] = Qt::SizeFDiagCursor;
+    result[SizeHandleElement::TOPMIDDLE] = Qt::SizeVerCursor;
+    result[SizeHandleElement::TOPRIGHT] = Qt::SizeBDiagCursor;
+    result[SizeHandleElement::MIDDLERIGHT] = Qt::SizeHorCursor;
+    result[SizeHandleElement::BOTTOMRIGHT] = Qt::SizeFDiagCursor;
+    result[SizeHandleElement::BOTTOMMIDLE] = Qt::SizeVerCursor;
+    result[SizeHandleElement::BOTTOMLEFT] = Qt::SizeBDiagCursor;
+    result[SizeHandleElement::MIDDLELEFT] = Qt::SizeHorCursor;
+    return result;
+}
+
+QMap<SizeHandleElement::EHandleLocation, SizeHandleElement::EHandleType>
+create_location_to_type_map()
+{
+    QMap<SizeHandleElement::EHandleLocation, SizeHandleElement::EHandleType> result;
+    result[SizeHandleElement::NONE] = SizeHandleElement::RESIZE;
+    result[SizeHandleElement::TOPLEFT] = SizeHandleElement::RESIZE;
+    result[SizeHandleElement::TOPMIDDLE] = SizeHandleElement::RESIZE_HEIGHT;
+    result[SizeHandleElement::TOPRIGHT] = SizeHandleElement::RESIZE;
+    result[SizeHandleElement::MIDDLERIGHT] = SizeHandleElement::RESIZE_WIDTH;
+    result[SizeHandleElement::BOTTOMRIGHT] = SizeHandleElement::RESIZE;
+    result[SizeHandleElement::BOTTOMMIDLE] = SizeHandleElement::RESIZE_HEIGHT;
+    result[SizeHandleElement::BOTTOMLEFT] = SizeHandleElement::RESIZE;
+    result[SizeHandleElement::MIDDLELEFT] = SizeHandleElement::RESIZE_WIDTH;
+    return result;
+}
+
+QMap<SizeHandleElement::EHandleLocation, SizeHandleElement::EHandleLocation> getMapOfOppositeCorners()
+{
+    QMap<SizeHandleElement::EHandleLocation, SizeHandleElement::EHandleLocation> result;
+    result[SizeHandleElement::TOPLEFT] = SizeHandleElement::BOTTOMRIGHT;
+    result[SizeHandleElement::TOPMIDDLE] = SizeHandleElement::BOTTOMMIDLE;
+    result[SizeHandleElement::TOPRIGHT] = SizeHandleElement::BOTTOMLEFT;
+    result[SizeHandleElement::MIDDLERIGHT] = SizeHandleElement::MIDDLELEFT;
+    result[SizeHandleElement::BOTTOMRIGHT] = SizeHandleElement::TOPLEFT;
+    result[SizeHandleElement::BOTTOMMIDLE] = SizeHandleElement::TOPMIDDLE;
+    result[SizeHandleElement::BOTTOMLEFT] = SizeHandleElement::TOPRIGHT;
+    result[SizeHandleElement::MIDDLELEFT] = SizeHandleElement::MIDDLERIGHT;
+    return result;
+}
+
+}
+
+QMap<SizeHandleElement::EHandleLocation, SizeHandleElement::EHandleType>
+SizeHandleElement::m_location_to_type = create_location_to_type_map();
+
+QMap<SizeHandleElement::EHandleLocation, Qt::CursorShape> SizeHandleElement::m_cursors =
+        create_cursors_map();
+
+QMap<SizeHandleElement::EHandleLocation, SizeHandleElement::EHandleLocation>
+SizeHandleElement::m_opposite_handle_location = getMapOfOppositeCorners();
+
+
+// ----------------------------------------------------------------------------
+
+SizeHandleElement::SizeHandleElement(EHandleLocation pointType, QGraphicsObject *parent)
+    : QGraphicsObject(parent)
+    , m_handleLocation(pointType)
+    , m_handleType(m_location_to_type[pointType])
+{
+    setCursor(m_cursors[m_handleLocation]);
+    setParentItem(parent);
+}
+
+QRectF SizeHandleElement::boundingRect() const
+{
+    return QRectF(-4, -4, 8, 8);
+}
+
+void SizeHandleElement::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+    painter->setRenderHints(QPainter::Antialiasing);
+
+    painter->setBrush(MaskEditorHelper::getSelectionMarkerBrush());
+    painter->setPen(MaskEditorHelper::getSelectionMarkerPen());
+    if(getHandleType() == RESIZE) {
+        painter->drawRect(boundingRect());
+    } else {
+        painter->drawEllipse(boundingRect());
+    }
+}
+
+void SizeHandleElement::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    emit resize_request(true);
+    QGraphicsObject::mousePressEvent(event);
+}
+
+void SizeHandleElement::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    emit resize_request(false);
+    QGraphicsObject::mouseReleaseEvent(event);
+}
+
+
+//! set position from location type using coordinates of external rectangle
+void SizeHandleElement::updateHandleElementPosition(const QRectF &rect)
+{
+    if(m_handleLocation == TOPLEFT) {
+        setPos(rect.topLeft());
+    }
+
+    else if(m_handleLocation == TOPMIDDLE) {
+        setPos(QPointF(rect.x()+rect.width()/2., rect.y()));
+    }
+
+    else if(m_handleLocation == TOPRIGHT) {
+        setPos(rect.topRight());
+    }
+
+    else if(m_handleLocation == MIDDLERIGHT) {
+        setPos(QPointF(rect.x()+rect.width(), rect.y()+rect.height()/2.));
+    }
+
+    else if(m_handleLocation == BOTTOMRIGHT) {
+        setPos(rect.bottomRight());
+    }
+
+    else if(m_handleLocation == BOTTOMMIDLE) {
+        setPos(QPointF(rect.x()+rect.width()/2., rect.y()+rect.height()));
+    }
+
+    else if(m_handleLocation == BOTTOMLEFT) {
+        setPos(rect.bottomLeft());
+    }
+
+    else if(m_handleLocation == MIDDLELEFT) {
+        setPos(QPointF(rect.x(), rect.y()+rect.height()/2.));
+    }
+}
+
+SizeHandleElement::EHandleLocation SizeHandleElement::getHandleLocation() const
+{
+    return m_handleLocation;
+}
+
+SizeHandleElement::EHandleLocation SizeHandleElement::getOppositeHandleLocation() const
+{
+    return m_opposite_handle_location[m_handleLocation];
+}
+
+SizeHandleElement::EHandleType SizeHandleElement::getHandleType() const
+{
+    return m_handleType;
+}
+
+void SizeHandleElement::update_view()
+{
+    update();
+}
diff --git a/GUI/coregui/Views/MaskWidgets/SizeHandleElement.h b/GUI/coregui/Views/MaskWidgets/SizeHandleElement.h
new file mode 100644
index 0000000..9a75243
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/SizeHandleElement.h
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaskWidgets/SizeHandleElement.h
+//! @brief     Defines SizeHandleElement class
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIZEHANDLEELEMENT_H
+#define SIZEHANDLEELEMENT_H
+
+#include "MaskEditorHelper.h"
+#include <QCursor>
+#include <QGraphicsObject>
+#include <QMap>
+
+//! Size handle on top of RectangleView represented as small circle or small rectangle.
+//! Placed either in corners on in the middle of the edge.
+
+class BA_CORE_API_ SizeHandleElement : public QGraphicsObject
+{
+    Q_OBJECT
+
+public:
+    int type() const { return MaskEditorHelper::SIZEHANDLE; }
+
+    enum EHandleLocation
+    {
+        NONE,
+        TOPLEFT,     TOPMIDDLE,   TOPRIGHT,
+        MIDDLELEFT,               MIDDLERIGHT,
+        BOTTOMLEFT, BOTTOMMIDLE, BOTTOMRIGHT,
+    };
+
+    enum EHandleType
+    {
+        RESIZE, RESIZE_WIDTH, RESIZE_HEIGHT
+    };
+
+    SizeHandleElement(EHandleLocation pointType, QGraphicsObject *parent =0);
+
+    QRectF boundingRect() const;
+
+    void updateHandleElementPosition(const QRectF &rect);
+
+    EHandleLocation getHandleLocation() const;
+    EHandleLocation getOppositeHandleLocation() const;
+    EHandleType getHandleType() const;
+
+public slots:
+    virtual void update_view();
+
+signals:
+    void resize_request(bool going_to_resize);
+
+protected:
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+private:
+    EHandleLocation m_handleLocation;
+    EHandleType m_handleType;
+    static QMap<EHandleLocation, Qt::CursorShape> m_cursors;
+    static QMap<EHandleLocation, EHandleType> m_location_to_type;
+    static QMap<EHandleLocation, EHandleLocation> m_opposite_handle_location;
+};
+
+#endif // SIZEHANDLEELEMENT_H
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_arrow.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_arrow.svg
new file mode 100644
index 0000000..c2b7a1a
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_arrow.svg
@@ -0,0 +1,542 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_arrow.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.85583162,-0.83328973,1.8180893,1.8025098,-63.503323,-10.722989)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96060506,0,0,1.5498255,-12.150977,-23.819538)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3094"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95988439,-1.5557763,0,66.062408,3.8678472)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67549622,0,0,0.54737322,-46.350634,27.435812)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.7205293,-0.66571079,0,-10.513164,29.242813)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70062717,0,0,2.1148926,-37.23268,-32.065072)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.71319264,0,0,1.3663886,-40.717153,-9.3571414)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.70062716,0,0,1.3718125,-43.736714,-9.5216914)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.71346059,0,0,1.3718424,-47.188067,-9.5228424)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.67549622,0,0,1.0897675,-49.583408,4.5768186)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="-10.933998"
+     inkscape:cy="0.37705293"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path3054"
+       d="m 9.4763217,26.629075 a 2.5605408,1.1943772 44.472215 0 0 1.1494663,2.453518 l 10.113119,10.026466 a 2.5605408,1.1943772 44.472215 0 0 2.673922,0.969219 l 0.909333,-0.885359 A 2.5605408,1.1943772 44.472215 0 0 23.359898,36.557113 L 13.246772,26.530646 a 2.5605408,1.1943772 44.472215 0 0 -2.673914,-0.96922 l -0.9093337,0.885363 a 2.5605408,1.1943772 44.472215 0 0 -0.1872001,0.182292 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3056);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3060);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 7.8416156,23.207981 a 0.96070113,1.5499805 0 0 0 -0.7504738,1.549823 l 0,8.620903 a 0.96070113,1.5499805 0 0 0 0.9606051,1.549828 l 1.0206428,0 a 0.96070113,1.5499805 0 0 0 0.9606053,-1.549828 l 0,-8.620903 A 0.96070113,1.5499805 0 0 0 9.0723897,23.207981 l -1.0206428,0 a 0.96070113,1.5499805 0 0 0 -0.2101313,0 z"
+       id="path3058"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3092"
+       d="m 18.854323,23.845441 a 1.5559317,0.95998046 0 0 0 -1.555775,-0.749912 l -8.6540052,0 a 1.5559317,0.95998046 0 0 0 -1.555777,0.959887 l 0,1.019874 a 1.5559317,0.95998046 0 0 0 1.555777,0.959886 l 8.6540052,0 a 1.5559317,0.95998046 0 0 0 1.555775,-0.959886 l 0,-1.019874 a 1.5559317,0.95998046 0 0 0 0,-0.209975 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3094);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_bringtofront.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_bringtofront.svg
new file mode 100644
index 0000000..b19902a
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_bringtofront.svg
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_bringtofront.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient4670">
+      <stop
+         id="stop4672"
+         offset="0"
+         style="stop-color:#b4b4b4;stop-opacity:1;" />
+      <stop
+         id="stop4674"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4656">
+      <stop
+         id="stop4658"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <stop
+         id="stop4660"
+         offset="1"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3869"
+       x1="4.8882694"
+       y1="23.301275"
+       x2="27.008173"
+       y2="41.190479"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95142998,0,0,0.94499897,0.77688002,1.6290925)" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3877"
+       x1="26.473265"
+       y1="40.554054"
+       x2="5.4277263"
+       y2="23.648773"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       y2="41.190479"
+       x2="27.008173"
+       y1="23.301275"
+       x1="4.8882694"
+       gradientTransform="matrix(0.86085482,0,0,0.83859717,0.21623675,1007.5333)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3070"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.90480101,0,0,0.88740541,-0.48668506,1006.0878)"
+       y2="23.648773"
+       x2="5.4277263"
+       y1="40.554054"
+       x1="26.473265"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3072"
+       xlink:href="#linearGradient4592"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="41.190479"
+       x2="27.008173"
+       y1="23.301275"
+       x1="4.8882694"
+       gradientTransform="matrix(0.95142998,0,0,0.95597995,0.74891079,1005.7528)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3070-8"
+       xlink:href="#linearGradient4619-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4619-4">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621-9" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623-3" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1,0,0,1.0116201,-0.02796921,1004.1048)"
+       y2="23.648773"
+       x2="5.4277263"
+       y1="40.554054"
+       x1="26.473265"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3072-6"
+       xlink:href="#linearGradient4592-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4592-3">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594-6" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596-4" />
+    </linearGradient>
+    <linearGradient
+       y2="41.190479"
+       x2="27.008173"
+       y1="23.301275"
+       x1="4.8882694"
+       gradientTransform="matrix(0.6306245,0,0,0.61183152,10.485733,1020.7179)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4117"
+       xlink:href="#linearGradient4656"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4670"
+       id="linearGradient4668"
+       x1="13.128298"
+       y1="1040.3267"
+       x2="28.016909"
+       y2="1040.3267"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.439805"
+     inkscape:cx="12.002236"
+     inkscape:cy="14.795088"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient4117);fill-opacity:1;stroke:url(#linearGradient4668);stroke-width:1.00492132000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3861-0"
+       width="13.88369"
+       height="10.903726"
+       x="13.630758"
+       y="1034.8749"
+       ry="0.71590114" />
+    <rect
+       style="fill:url(#linearGradient3070);fill-opacity:1;stroke:url(#linearGradient3072);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3861"
+       width="18.952391"
+       height="14.94502"
+       x="4.509459"
+       y="1026.9375"
+       ry="0.9812386" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_details.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_details.svg
new file mode 100644
index 0000000..1e069ba
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_details.svg
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_details.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient3782">
+      <stop
+         style="stop-color:#787878;stop-opacity:1;"
+         offset="0"
+         id="stop3784" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1;"
+         offset="1"
+         id="stop3786" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3774">
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="0"
+         id="stop3776" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3778" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3774"
+       id="linearGradient3780"
+       x1="25.39061"
+       y1="1047.4788"
+       x2="4.8050866"
+       y2="1024.0441"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3788"
+       x1="6.9462075"
+       y1="1036.3729"
+       x2="25.059683"
+       y2="1036.3729"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.439805"
+     inkscape:cx="12.002236"
+     inkscape:cy="14.746164"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient3780);fill-opacity:1;stroke:url(#linearGradient3788);stroke-width:1;stroke-opacity:1"
+       id="rect3004"
+       width="17.113476"
+       height="20.902134"
+       x="7.4462075"
+       y="1025.9219"
+       ry="0.50821292" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_ellipse.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_ellipse.svg
new file mode 100644
index 0000000..755c08c
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_ellipse.svg
@@ -0,0 +1,495 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_ellipse.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3869"
+       x1="4.8882694"
+       y1="23.301275"
+       x2="27.008173"
+       y2="41.190479"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95142998,0,0,0.94499897,41.856088,-9.2421946)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3877"
+       x1="26.473265"
+       y1="40.554054"
+       x2="5.4277263"
+       y2="23.648773"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(41.079208,-10.871287)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3906"
+       x1="67.782814"
+       y1="35.379574"
+       x2="47.099453"
+       y2="21.039604"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3914"
+       x1="67.782814"
+       y1="35.379574"
+       x2="47.099453"
+       y2="21.039604"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.222222"
+     inkscape:cx="25.29703"
+     inkscape:cy="9.2472792"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3914);fill-opacity:1;stroke:url(#linearGradient3906);stroke-width:0.88099450000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3898"
+       sodipodi:cx="56.851486"
+       sodipodi:cy="27.990099"
+       sodipodi:rx="10.782178"
+       sodipodi:ry="6.9504952"
+       d="m 67.633664,27.990099 a 10.782178,6.9504952 0 1 1 -21.564356,0 10.782178,6.9504952 0 1 1 21.564356,0 z"
+       transform="matrix(-1.0578513,0,0,-1.2179487,76.269136,66.0509)" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_hand.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_hand.svg
new file mode 100644
index 0000000..a68c83b
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_hand.svg
@@ -0,0 +1,562 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_hand.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.79088961,-0.77005819,1.6801293,1.6657321,-60.24914,23.85531)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.86898808,0,0,1.3996055,-12.26635,12.761561)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3094"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.8845731,-1.4311398,0,59.33791,37.411947)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.63820376,0,0,0.65825128,-0.83657754,17.164292)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.65291429,-0.55432784,0,30.699753,23.982542)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66975587,0,0,2.5195612,7.5516824,-53.437382)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68553208,0,0,1.6090893,4.1966967,-25.887137)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67900969,0,0,1.5875862,1.3188556,-25.227412)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66088958,0,0,1.6243871,-1.2374112,-26.408124)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.63338996,0,0,1.3005114,-3.5971211,-10.304041)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28"
+     inkscape:cx="8.3085245"
+     inkscape:cy="8.7449063"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3102);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 9.5853055,29.158354 a 0.63345328,1.3006415 0 0 0 -0.4948356,1.300509 l 0,7.234096 a 0.63345328,1.3006415 0 0 0 0.6333896,1.300512 l 0.6729765,0 a 0.63345328,1.3006415 0 0 0 0.633391,-1.300512 l 0,-7.234093 a 0.63345328,1.3006415 0 0 0 -0.633391,-1.300512 l -0.6729765,0 a 0.63345328,1.3006415 0 0 0 -0.138554,0 z"
+       id="rect4605"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3063-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+       d="m 12.528105,22.882009 a 0.66095564,1.6245495 0 0 0 -0.527145,1.624388 l 0,9.035651 a 0.66095564,1.6245495 0 0 0 0.658931,1.624389 l 0.691879,0 a 0.66095564,1.6245495 0 0 0 0.658932,-1.624389 l 0,-9.035652 A 0.66095564,1.6245495 0 0 0 13.35177,22.882009 l -0.691879,0 a 0.66095564,1.6245495 0 0 0 -0.131786,0 z"
+       id="path3046"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3052-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+       d="M 15.450745,22.945905 A 0.67907758,1.5877449 0 0 0 14.92027,24.53349 l 0,8.830949 a 0.67907758,1.5877449 0 0 0 0.679009,1.587587 l 0.721447,0 a 0.67907758,1.5877449 0 0 0 0.67901,-1.587587 l 0,-8.830949 a 0.67907758,1.5877449 0 0 0 -0.67901,-1.587585 l -0.721447,0 a 0.67907758,1.5877449 0 0 0 -0.148534,0 z"
+       id="path3050"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3054-9"
+       d="m 18.464335,22.938663 a 0.68560063,1.6092501 0 0 0 -0.535572,1.609087 l 0,8.950558 a 0.68560063,1.6092501 0 0 0 0.685533,1.609091 l 0.728378,0 a 0.68560063,1.6092501 0 0 0 0.685532,-1.609091 l 0,-8.950558 a 0.68560063,1.6092501 0 0 0 -0.685532,-1.609087 l -0.728378,0 a 0.68560063,1.6092501 0 0 0 -0.149961,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3056-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3060-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+       d="m 21.490979,23.015553 a 0.66982285,2.5198132 0 0 0 -0.523247,2.519562 l 0,14.015057 a 0.66982285,2.5198132 0 0 0 0.669755,2.519563 l 0.711616,0 a 0.66982285,2.5198132 0 0 0 0.669756,-2.519563 l 0,-14.015057 a 0.66982285,2.5198132 0 0 0 -0.669756,-2.519562 l -0.711616,0 a 0.66982285,2.5198132 0 0 0 -0.146508,0 z"
+       id="path3058-9"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3065"
+       d="M 13.879368,37.57132 A 0.55438331,0.6529796 0 0 0 13.32504,37.06123 l -3.083449,0 a 0.55438331,0.6529796 0 0 0 -0.5543286,0.652913 l 0,0.693722 a 0.55438331,0.6529796 0 0 0 0.5543286,0.652916 l 3.083449,0 a 0.55438331,0.6529796 0 0 0 0.554328,-0.652916 l 0,-0.693722 a 0.55438331,0.6529796 0 0 0 0,-0.142823 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3067-0);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3069"
+       d="m 12.446039,37.138105 a 0.63826759,0.65831708 0 0 0 -0.498598,0.658252 l 0,3.661522 a 0.63826759,0.65831708 0 0 0 0.638204,0.658251 l 0.678092,0 a 0.63826759,0.65831708 0 0 0 0.638204,-0.658251 l 0,-3.661522 a 0.63826759,0.65831708 0 0 0 -0.638204,-0.658252 l -0.678092,0 a 0.63826759,0.65831708 0 0 0 -0.139606,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3071-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_horizontalline.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_horizontalline.svg
new file mode 100644
index 0000000..11489df
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_horizontalline.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_horizontalline.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient3776">
+      <stop
+         style="stop-color:#d2d2d2;stop-opacity:1;"
+         offset="0"
+         id="stop3778" />
+      <stop
+         style="stop-color:#d2d2d2;stop-opacity:1;"
+         offset="1"
+         id="stop3780" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3776"
+       id="linearGradient3782"
+       x1="16.976679"
+       y1="27.058661"
+       x2="14.04123"
+       y2="4.9938717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6721312,0,0,1.0862832,1010.056,-33.380666)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.439805"
+     inkscape:cx="12.002236"
+     inkscape:cy="14.746164"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient3782);fill-opacity:1;stroke:none"
+       id="rect3774"
+       width="4.9902625"
+       height="24.021755"
+       x="1033.453"
+       y="-28.009073"
+       ry="0.88227242"
+       transform="matrix(0,1,-1,0,0,0)" />
+    <path
+       style="fill:none;stroke:#797979;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 28.008012,1035.8974 -23.967097,0"
+       id="path3002"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_lightbulb.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_lightbulb.svg
new file mode 100644
index 0000000..9fb9043
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_lightbulb.svg
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_lightbulb.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient3931">
+      <stop
+         id="stop3933"
+         offset="0"
+         style="stop-color:#b4b4b4;stop-opacity:1;" />
+      <stop
+         id="stop3935"
+         offset="1"
+         style="stop-color:#646464;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3818">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3820" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3822" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3782">
+      <stop
+         style="stop-color:#969696;stop-opacity:1;"
+         offset="0"
+         id="stop3784" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1;"
+         offset="1"
+         id="stop3786" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3774">
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="0"
+         id="stop3776" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3778" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3774"
+       id="linearGradient3780"
+       x1="25.39061"
+       y1="1047.4788"
+       x2="4.8050866"
+       y2="1024.0441"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1147846,0,0,0.18649351,26.658726,836.54288)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3788"
+       x1="6.9462075"
+       y1="1036.3729"
+       x2="25.059683"
+       y2="1036.3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1147846,0,0,0.18649351,26.658726,836.54288)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3824"
+       x1="0.90324998"
+       y1="239.89554"
+       x2="478.8862"
+       y2="239.89554"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3826"
+       gradientUnits="userSpaceOnUse"
+       x1="429.29108"
+       y1="44.773693"
+       x2="-27.256935"
+       y2="498.1019" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3929"
+       x1="0.00050000002"
+       y1="207.79124"
+       x2="415.58099"
+       y2="207.79124"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3937"
+       gradientUnits="userSpaceOnUse"
+       x1="0.00050000002"
+       y1="207.79124"
+       x2="415.58099"
+       y2="207.79124" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3885"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3887"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3889"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3891"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3893"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3895"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3897"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3899"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3901"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3903"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3905"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3907"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3909"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3911"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3913"
+       gradientUnits="userSpaceOnUse"
+       x1="208.43869"
+       y1="146.88605"
+       x2="445.53009"
+       y2="486.65384" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="21.194787"
+     inkscape:cx="16"
+     inkscape:cy="20.264074"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <g
+       id="g5"
+       transform="matrix(0.04631876,0,0,0.04631876,4.5686949,1023.4701)"
+       style="fill:url(#linearGradient3885);fill-opacity:1">
+      <g
+         id="Icons_15_"
+         style="fill:url(#linearGradient3913);fill-opacity:1">
+        <g
+           id="g8"
+           style="fill:url(#linearGradient3911);fill-opacity:1">
+          <path
+             id="path10"
+             d="m 290.652,402.646 h -87.595 c -6.781,0 -12.283,5.503 -12.283,12.283 0,6.785 5.502,12.287 12.283,12.287 h 87.595 c 6.781,0 12.289,-5.502 12.289,-12.287 0.001,-6.78 -5.506,-12.283 -12.289,-12.283 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3887);fill-opacity:1" />
+          <path
+             id="path12"
+             d="m 224.299,474.245 c 1.666,11.026 11.086,19.517 22.586,19.517 11.488,0 20.93,-8.487 22.589,-19.517 15.037,-0.888 26.987,-13.245 26.987,-28.504 H 197.25 c 0,15.268 11.985,27.634 27.049,28.504 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3889);fill-opacity:1" />
+          <path
+             id="path14"
+             d="m 246.884,70.87 c 9.062,0 16.387,-7.335 16.387,-16.381 V 16.381 C 263.271,7.332 255.947,0 246.884,0 237.831,0 230.507,7.332 230.507,16.381 v 38.108 c 0.001,9.046 7.325,16.381 16.377,16.381 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3891);fill-opacity:1" />
+          <path
+             id="path16"
+             d="m 139.39,94.736 c 3.217,4.417 8.209,6.761 13.283,6.761 3.326,0 6.699,-1.017 9.609,-3.129 7.313,-5.312 8.945,-15.555 3.633,-22.873 l -22.396,-30.84 c -5.326,-7.312 -15.549,-8.96 -22.887,-3.632 -7.311,5.309 -8.943,15.555 -3.631,22.873 l 22.389,30.84 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3893);fill-opacity:1" />
+          <path
+             id="path18"
+             d="m 354.354,334.861 c -5.313,-7.312 -15.549,-8.934 -22.881,-3.621 -7.306,5.317 -8.937,15.562 -3.61,22.879 l 22.409,30.841 c 3.196,4.407 8.188,6.753 13.265,6.753 3.338,0 6.698,-1.017 9.608,-3.128 7.312,-5.319 8.942,-15.565 3.619,-22.884 l -22.41,-30.84 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3895);fill-opacity:1" />
+          <path
+             id="path20"
+             d="M 99.502,149.684 63.25,137.894 c -8.686,-2.799 -17.846,1.911 -20.648,10.518 -2.803,8.597 1.904,17.843 10.508,20.642 l 36.252,11.79 c 1.693,0.544 3.387,0.809 5.066,0.809 6.91,0 13.324,-4.4 15.582,-11.327 2.802,-8.597 -1.904,-17.844 -10.508,-20.642 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3897);fill-opacity:1" />
+          <path
+             id="path22"
+             d="m 440.649,260.538 -36.243,-11.773 c -8.611,-2.778 -17.841,1.918 -20.638,10.516 -2.802,8.606 1.918,17.848 10.521,20.646 l 36.252,11.772 c 1.681,0.545 3.373,0.807 5.054,0.807 6.909,0 13.323,-4.407 15.581,-11.324 2.795,-8.61 -1.918,-17.845 -10.527,-20.644 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3899);fill-opacity:1" />
+          <path
+             id="path24"
+             d="M 89.375,248.765 53.11,260.522 c -8.604,2.79 -13.324,12.026 -10.521,20.635 2.238,6.927 8.664,11.334 15.574,11.334 1.668,0 3.381,-0.267 5.061,-0.811 l 36.258,-11.756 c 8.611,-2.792 13.33,-12.03 10.529,-20.635 -2.782,-8.6 -11.952,-13.303 -20.636,-10.524 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3901);fill-opacity:1" />
+          <path
+             id="path26"
+             d="m 399.35,181.653 c 1.681,0 3.373,-0.265 5.056,-0.809 l 36.243,-11.773 c 8.608,-2.799 13.322,-12.039 10.526,-20.642 -2.803,-8.6 -12.077,-13.3 -20.635,-10.518 l -36.252,11.772 c -8.604,2.798 -13.322,12.038 -10.521,20.642 2.253,6.921 8.673,11.328 15.583,11.328 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3903);fill-opacity:1" />
+          <path
+             id="path28"
+             d="m 139.412,334.855 -22.431,30.822 c -5.326,7.318 -3.707,17.563 3.619,22.883 2.896,2.119 6.27,3.138 9.609,3.138 5.074,0 10.066,-2.336 13.264,-6.744 l 22.43,-30.824 c 5.326,-7.316 3.707,-17.562 -3.619,-22.883 -7.293,-5.349 -17.582,-3.709 -22.872,3.608 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3905);fill-opacity:1" />
+          <path
+             id="path30"
+             d="m 350.258,44.654 -22.396,30.84 c -5.312,7.318 -3.681,17.562 3.633,22.873 2.91,2.112 6.283,3.129 9.608,3.129 5.074,0 10.065,-2.343 13.276,-6.761 l 22.396,-30.841 c 5.311,-7.318 3.68,-17.564 -3.634,-22.873 -7.355,-5.341 -17.557,-3.695 -22.883,3.633 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3907);fill-opacity:1" />
+          <path
+             id="path32"
+             d="m 365.194,215.404 c 0,-65.354 -52.976,-118.333 -118.322,-118.333 -65.359,0 -118.336,52.979 -118.336,118.333 0,27.569 9.482,52.884 25.322,72.981 13.881,17.612 27.027,36.839 38.42,56.187 v 39.306 h 108.516 v -38.263 c 11.288,-18.818 25.881,-40.484 39.065,-57.211 15.854,-20.103 25.335,-45.413 25.335,-73 z"
+             inkscape:connector-curvature="0"
+             style="fill:url(#linearGradient3909);fill-opacity:1" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_maskall.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_maskall.svg
new file mode 100644
index 0000000..bbcbaca
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_maskall.svg
@@ -0,0 +1,606 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_maskall.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient3888">
+      <stop
+         id="stop3890"
+         offset="0"
+         style="stop-color:#7d7d7d;stop-opacity:1;" />
+      <stop
+         id="stop3892"
+         offset="1"
+         style="stop-color:#787878;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3872">
+      <stop
+         id="stop3874"
+         offset="0"
+         style="stop-color:#5a5a5a;stop-opacity:1;" />
+      <stop
+         id="stop3876"
+         offset="1"
+         style="stop-color:#969696;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.94569472,0,0,0.68138399,33.945275,8.7477615)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.96209819,-3.2915854,0,153.92022,-13.373467)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.98087805,0,0,2.904224,45.21041,-75.483853)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99846971,0,0,1.8468808,40.832148,-43.406433)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0041995,0,0,1.8544742,36.566184,-43.708232)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99884484,0,0,1.8639461,32.701441,-44.067296)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.99233754,0,0,1.4501735,27.913663,-23.398288)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.8315569,0,0,1.4306141,39.435999,-29.762744)"
+       y2="52.404518"
+       x2="8.0653534"
+       y1="34.827862"
+       x1="8.0355835"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3061-8"
+       xlink:href="#linearGradient4619-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3869"
+       x1="4.8882694"
+       y1="23.301275"
+       x2="27.008173"
+       y2="41.190479"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95142998,0,0,0.94499897,0.77688002,1.6290925)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3877"
+       x1="26.473265"
+       y1="40.554054"
+       x2="5.4277263"
+       y2="23.648773"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3872"
+       id="linearGradient3870"
+       x1="26.18812"
+       y1="24.136139"
+       x2="4.4207931"
+       y2="6.849009"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3888"
+       id="linearGradient3886"
+       x1="5.4702973"
+       y1="15.982673"
+       x2="26.519802"
+       y2="15.982673"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.444444"
+     inkscape:cx="11.181571"
+     inkscape:cy="14.408644"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <rect
+       style="fill:url(#linearGradient3869);fill-opacity:1;stroke:url(#linearGradient3877);stroke-width:0.99999981999999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3861"
+       width="20.946472"
+       height="16.841251"
+       x="5.5218148"
+       y="23.495218"
+       ry="1.1057388" />
+    <path
+       style="fill:none;stroke:url(#linearGradient3870);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 6.0148516,7.9405936 C 26.064357,24.024752 26.064357,24.024752 26.064357,24.024752"
+       id="path3093"
+       inkscape:connector-curvature="0"
+       transform="translate(0,16)" />
+    <path
+       style="fill:none;stroke:url(#linearGradient3886);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 5.9702972,24.024752 26.019803,7.9405936"
+       id="path3878"
+       inkscape:connector-curvature="0"
+       transform="translate(0,16)" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_maskfalse.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_maskfalse.svg
new file mode 100644
index 0000000..8da3ca1
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_maskfalse.svg
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_maskfalse.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient3931">
+      <stop
+         id="stop3933"
+         offset="0"
+         style="stop-color:#bebebe;stop-opacity:1;" />
+      <stop
+         id="stop3935"
+         offset="1"
+         style="stop-color:#787878;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3818">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3820" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3822" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3782">
+      <stop
+         style="stop-color:#b4b4b4;stop-opacity:1;"
+         offset="0"
+         id="stop3784" />
+      <stop
+         style="stop-color:#6e6e6e;stop-opacity:1;"
+         offset="1"
+         id="stop3786" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3774">
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="0"
+         id="stop3776" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3778" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3774"
+       id="linearGradient3780"
+       x1="25.39061"
+       y1="1047.4788"
+       x2="4.8050866"
+       y2="1024.0441"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1147846,0,0,0.18649351,-1.7916664,848.62132)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3788"
+       x1="6.9462075"
+       y1="1036.3729"
+       x2="25.059683"
+       y2="1036.3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1147846,0,0,0.18649351,-1.7916664,848.62132)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3824"
+       x1="0.90324998"
+       y1="239.89554"
+       x2="478.8862"
+       y2="239.89554"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3929"
+       x1="0.00050000002"
+       y1="207.79124"
+       x2="415.58099"
+       y2="207.79124"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3937"
+       gradientUnits="userSpaceOnUse"
+       x1="0.00050000002"
+       y1="207.79124"
+       x2="415.58099"
+       y2="207.79124" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3985"
+       x1="735.75482"
+       y1="717.59833"
+       x2="747.63348"
+       y2="717.59833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.21394873,1.1855982)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782-6"
+       id="linearGradient3985-3"
+       x1="735.75482"
+       y1="717.59833"
+       x2="747.63348"
+       y2="717.59833"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3782-6">
+      <stop
+         style="stop-color:#b4b4b4;stop-opacity:1;"
+         offset="0"
+         id="stop3784-3" />
+      <stop
+         style="stop-color:#6e6e6e;stop-opacity:1;"
+         offset="1"
+         id="stop3786-6" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-22.987074,-1458.9694)"
+       y2="717.59833"
+       x2="747.63348"
+       y1="717.59833"
+       x1="735.75482"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4004"
+       xlink:href="#linearGradient3782-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient4023"
+       gradientUnits="userSpaceOnUse"
+       x1="735.75482"
+       y1="717.59833"
+       x2="747.63348"
+       y2="717.59833"
+       gradientTransform="translate(-5.3406133,8.0416131)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.290264"
+     inkscape:cx="20.146499"
+     inkscape:cy="6.6916941"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient3780);fill-opacity:1;stroke:url(#linearGradient3788);stroke-width:1;stroke-opacity:1"
+       id="rect3004"
+       width="19.077839"
+       height="3.8981123"
+       x="6.5092516"
+       y="1039.949"
+       ry="0.094778411" />
+    <rect
+       style="fill:url(#linearGradient3985);fill-opacity:1.0;stroke:none"
+       id="rect3977"
+       width="11.878682"
+       height="3.0015159"
+       x="735.54089"
+       y="717.2832"
+       ry="0.66137046"
+       transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" />
+    <rect
+       transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)"
+       ry="0.66137046"
+       y="-742.87177"
+       x="712.7677"
+       height="3.0015159"
+       width="11.878682"
+       id="rect3987-6"
+       style="fill:url(#linearGradient4004);fill-opacity:1.0;stroke:none"
+       inkscape:transform-center-x="2.3439624"
+       inkscape:transform-center-y="-1.2153879" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_masktrue.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_masktrue.svg
new file mode 100644
index 0000000..d5094f8
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_masktrue.svg
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_maskon.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient3931">
+      <stop
+         id="stop3933"
+         offset="0"
+         style="stop-color:#b4b4b4;stop-opacity:1;" />
+      <stop
+         id="stop3935"
+         offset="1"
+         style="stop-color:#646464;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3818">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3820" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3822" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3782">
+      <stop
+         style="stop-color:#969696;stop-opacity:1;"
+         offset="0"
+         id="stop3784" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1;"
+         offset="1"
+         id="stop3786" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3774">
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="0"
+         id="stop3776" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3778" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3774"
+       id="linearGradient3780"
+       x1="25.39061"
+       y1="1047.4788"
+       x2="4.8050866"
+       y2="1024.0441"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1147846,0,0,0.18649351,-1.7916664,848.62132)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3788"
+       x1="6.9462075"
+       y1="1036.3729"
+       x2="25.059683"
+       y2="1036.3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1147846,0,0,0.18649351,-1.7916664,848.62132)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3824"
+       x1="0.90324998"
+       y1="239.89554"
+       x2="478.8862"
+       y2="239.89554"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3826"
+       gradientUnits="userSpaceOnUse"
+       x1="429.29108"
+       y1="44.773693"
+       x2="-27.256935"
+       y2="498.1019" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3929"
+       x1="0.00050000002"
+       y1="207.79124"
+       x2="415.58099"
+       y2="207.79124"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3931"
+       id="linearGradient3937"
+       gradientUnits="userSpaceOnUse"
+       x1="0.00050000002"
+       y1="207.79124"
+       x2="415.58099"
+       y2="207.79124" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.290264"
+     inkscape:cx="28.053101"
+     inkscape:cy="8.418343"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient3780);fill-opacity:1;stroke:url(#linearGradient3788);stroke-width:1;stroke-opacity:1"
+       id="rect3004"
+       width="19.077839"
+       height="3.8981123"
+       x="6.5092516"
+       y="1039.949"
+       ry="0.094778411" />
+    <g
+       transform="matrix(0.02887527,0,0,0.02887527,11.625954,1026.7757)"
+       id="g3"
+       style="fill:url(#linearGradient3929);fill-opacity:1">
+      <path
+         inkscape:connector-curvature="0"
+         d="m 411.47,96.426 -46.319,-46.32 c -5.482,-5.482 -14.371,-5.482 -19.853,0 L 152.348,243.058 70.282,160.994 c -5.48,-5.482 -14.37,-5.482 -19.851,0 l -46.319,46.32 c -5.482,5.481 -5.482,14.37 0,19.852 l 138.311,138.31 c 2.741,2.742 6.334,4.112 9.926,4.112 3.593,0 7.186,-1.37 9.926,-4.112 L 411.47,116.277 c 2.633,-2.632 4.111,-6.203 4.111,-9.925 10e-4,-3.724 -1.478,-7.293 -4.111,-9.926 z"
+         id="path5"
+         style="fill:url(#linearGradient3937);fill-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_polygon.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_polygon.svg
new file mode 100644
index 0000000..af39e1c
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_polygon.svg
@@ -0,0 +1,501 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_polygon.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3906"
+       x1="67.782814"
+       y1="35.379574"
+       x2="47.099453"
+       y2="21.039604"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3914"
+       x1="67.782814"
+       y1="35.379574"
+       x2="47.099453"
+       y2="21.039604"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3945"
+       x1="-3.0993071"
+       y1="2.4818525"
+       x2="30.71043"
+       y2="16.712542"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3953"
+       x1="-3.0993071"
+       y1="2.4818525"
+       x2="30.71043"
+       y2="16.712542"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.222222"
+     inkscape:cx="25.29703"
+     inkscape:cy="9.3363881"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       sodipodi:type="star"
+       style="fill:url(#linearGradient3953);fill-opacity:1;stroke:url(#linearGradient3945);stroke-width:1.24573742999999992;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;fill-rule:nonzero"
+       id="path3937"
+       sodipodi:sides="6"
+       sodipodi:cx="13.009901"
+       sodipodi:cy="9.6336632"
+       sodipodi:r1="13.898705"
+       sodipodi:r2="11.244289"
+       sodipodi:arg1="0.71279871"
+       sodipodi:arg2="1.2363975"
+       inkscape:flatsided="true"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="M 23.524752,18.722772 10.395928,23.284346 -0.1189234,14.195237 2.49505,0.54455462 15.623874,-4.0170193 26.138725,5.0720893 z"
+       transform="matrix(0.77173922,0.25764688,-0.26653774,0.74599641,8.594086,21.523396)"
+       inkscape:transform-center-x="0.65801709"
+       inkscape:transform-center-y="-0.52228223" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_rectangle.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_rectangle.svg
new file mode 100644
index 0000000..9a427cf
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_rectangle.svg
@@ -0,0 +1,554 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_rectangle.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.94569472,0,0,0.68138399,33.945275,8.7477615)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.96209819,-3.2915854,0,153.92022,-13.373467)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.98087805,0,0,2.904224,45.21041,-75.483853)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99846971,0,0,1.8468808,40.832148,-43.406433)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0041995,0,0,1.8544742,36.566184,-43.708232)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99884484,0,0,1.8639461,32.701441,-44.067296)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.99233754,0,0,1.4501735,27.913663,-23.398288)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.8315569,0,0,1.4306141,39.435999,-29.762744)"
+       y2="52.404518"
+       x2="8.0653534"
+       y1="34.827862"
+       x1="8.0355835"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3061-8"
+       xlink:href="#linearGradient4619-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3869"
+       x1="4.8882694"
+       y1="23.301275"
+       x2="27.008173"
+       y2="41.190479"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95142998,0,0,0.94499897,0.77688002,1.6290925)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3877"
+       x1="26.473265"
+       y1="40.554054"
+       x2="5.4277263"
+       y2="23.648773"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.222222"
+     inkscape:cx="25.29703"
+     inkscape:cy="9.2472792"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <rect
+       style="fill:url(#linearGradient3869);fill-opacity:1;stroke:url(#linearGradient3877);stroke-width:0.99999981999999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3861"
+       width="20.946472"
+       height="16.841251"
+       x="5.5218148"
+       y="23.495218"
+       ry="1.1057388" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_refresh.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_refresh.svg
new file mode 100644
index 0000000..615737a
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_refresh.svg
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_refresh.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#6e6e6e;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#aaaaaa;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3849"
+       x1="6.7053576"
+       y1="2.4417202"
+       x2="16.750076"
+       y2="16.584578"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0646916,0,0,1.0646916,5.7075434,16.103804)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3857"
+       x1="8.1339283"
+       y1="39.205357"
+       x2="9.6383924"
+       y2="41.88393"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2897384,0,0,1.2897384,3.7451135,-27.058853)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3907"
+       x1="10.138392"
+       y1="3.9216595"
+       x2="16.049644"
+       y2="11.671659"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3942"
+       gradientUnits="userSpaceOnUse"
+       x1="10.138392"
+       y1="3.9216595"
+       x2="16.049644"
+       y2="11.671659"
+       gradientTransform="matrix(0,-1,-1,0,-0.26768743,35.589456)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient5357"
+       x1="15.697366"
+       y1="8.7413301"
+       x2="-1.7544643"
+       y2="-0.75867051"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.291153,0,0,1.291153,5.754007,21.652142)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient5361"
+       gradientUnits="userSpaceOnUse"
+       x1="2.0187941"
+       y1="1.2770442"
+       x2="16.459822"
+       y2="9.9199009"
+       gradientTransform="matrix(-1.291153,0,0,-1.291153,26.569294,42.334313)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="-15.495019"
+     inkscape:cy="0.89013387"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient5357);fill-opacity:1;stroke:none;stroke-width:2.39316607;marker:none;visibility:visible;display:inline;overflow:visib [...]
+       d="m 13.500925,22.741552 c -0.200556,0.02168 -0.395789,0.0914 -0.564879,0.201743 l -2.501609,1.452547 -2.5823062,1.492896 c -0.7976734,0.445885 -0.7976734,1.813632 0,2.259517 l 2.5823062,1.492896 2.541957,1.492895 c 0.41575,0.245463 0.971151,0.229128 1.371849,-0.04035 0.351747,-0.239587 0.57127,-0.662952 0.56488,-1.089411 l 0,-1.89638 4.075202,0 c 2.014401,0 3.591019,1.576617 3.591019,3.591018 l 0,0.28244 2.582306,0 0,-0.28244 c 0,-3.400332 -2.772992,-6.173325 -6.173325,-6.173325  [...]
+       id="path5296"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccssccssccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccssccssccc"
+       inkscape:connector-curvature="0"
+       id="path5359"
+       d="m 18.822376,41.244902 c 0.200556,-0.02168 0.395788,-0.0914 0.564879,-0.201742 l 2.501609,-1.452548 2.582306,-1.492895 c 0.797674,-0.445886 0.797674,-1.813633 0,-2.259518 l -2.582306,-1.492896 -2.541957,-1.492896 c -0.415752,-0.245462 -0.97115,-0.229126 -1.37185,0.04035 -0.351747,0.239586 -0.571269,0.662951 -0.56488,1.089409 l 0,1.896382 -4.075202,0 c -2.014401,0 -3.5910184,-1.576618 -3.5910184,-3.59102 l 0,-0.28244 -2.5823061,0 0,0.28244 c 0,3.400333 2.7729926,6.173326 6.173324 [...]
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient5361);fill-opacity:1;stroke:none;stroke-width:2.39316607;marker:none;visibility:visible;display:inline;overflow:visib [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_roi.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_roi.svg
new file mode 100644
index 0000000..e57b57d
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_roi.svg
@@ -0,0 +1,554 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="maskeditor_roi.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.94569472,0,0,0.68138399,33.945275,8.7477615)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.96209819,-3.2915854,0,153.92022,-13.373467)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.98087805,0,0,2.904224,45.21041,-75.483853)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99846971,0,0,1.8468808,40.832148,-43.406433)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0041995,0,0,1.8544742,36.566184,-43.708232)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99884484,0,0,1.8639461,32.701441,-44.067296)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.99233754,0,0,1.4501735,27.913663,-23.398288)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.8315569,0,0,1.4306141,39.435999,-29.762744)"
+       y2="52.404518"
+       x2="8.0653534"
+       y1="34.827862"
+       x1="8.0355835"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3061-8"
+       xlink:href="#linearGradient4619-6"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.444444"
+     inkscape:cx="33.766855"
+     inkscape:cy="7.2547506"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       style="fill:none;fill-opacity:1;stroke:#646464;stroke-width:0.99999982;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 5.4772603,29.108439 0,-4.457077 c 0,-0.615821 0.4957689,-1.11159 1.1115893,-1.11159 l 0,0 4.4157064,1e-6"
+       id="path4254"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#646464;stroke-width:0.99999982;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 20.89141,23.47645 4.457077,0 c 0.615821,0 1.11159,0.495769 1.11159,1.11159 l 0,0 -10e-7,4.415706"
+       id="path4254-09"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#646464;stroke-width:0.99999982;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 26.5285,34.940914 0,4.457077 c 0,0.615821 -0.495769,1.11159 -1.111589,1.11159 l 0,0 -4.415707,-10e-7"
+       id="path4254-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-opacity:1;stroke:#646464;stroke-width:0.99999982;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 11.09869,40.533449 -4.457077,0 c -0.615821,0 -1.11159,-0.495769 -1.11159,-1.11159 l 0,0 1e-6,-4.415706"
+       id="path4254-09-3"
+       inkscape:connector-curvature="0" />
+    <ellipse
+       style="fill:#6e6e6e;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path4381"
+       cx="15.933643"
+       cy="32.000004"
+       rx="2.8787129"
+       ry="2.9455445" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_sendtoback.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_sendtoback.svg
new file mode 100644
index 0000000..531c546
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_sendtoback.svg
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_sendtoback.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient4670">
+      <stop
+         id="stop4672"
+         offset="0"
+         style="stop-color:#b4b4b4;stop-opacity:1;" />
+      <stop
+         id="stop4674"
+         offset="1"
+         style="stop-color:#8c8c8c;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4656">
+      <stop
+         id="stop4658"
+         offset="0"
+         style="stop-color:#f0f0f0;stop-opacity:1;" />
+      <stop
+         id="stop4660"
+         offset="1"
+         style="stop-color:#dcdcdc;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3869"
+       x1="4.8882694"
+       y1="23.301275"
+       x2="27.008173"
+       y2="41.190479"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95142998,0,0,0.94499897,0.77688002,1.6290925)" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3877"
+       x1="26.473265"
+       y1="40.554054"
+       x2="5.4277263"
+       y2="23.648773"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       y2="41.190479"
+       x2="27.008173"
+       y1="23.301275"
+       x1="4.8882694"
+       gradientTransform="matrix(0.86085482,0,0,0.83859717,0.21623675,1007.5333)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3070"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.90480101,0,0,0.88740541,-0.48668506,1006.0878)"
+       y2="23.648773"
+       x2="5.4277263"
+       y1="40.554054"
+       x1="26.473265"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3072"
+       xlink:href="#linearGradient4592"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="41.190479"
+       x2="27.008173"
+       y1="23.301275"
+       x1="4.8882694"
+       gradientTransform="matrix(0.95142998,0,0,0.95597995,0.74891079,1005.7528)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3070-8"
+       xlink:href="#linearGradient4619-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4619-4">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621-9" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623-3" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1,0,0,1.0116201,-0.02796921,1004.1048)"
+       y2="23.648773"
+       x2="5.4277263"
+       y1="40.554054"
+       x1="26.473265"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3072-6"
+       xlink:href="#linearGradient4592-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4592-3">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594-6" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596-4" />
+    </linearGradient>
+    <linearGradient
+       y2="41.190479"
+       x2="27.008173"
+       y1="23.301275"
+       x1="4.8882694"
+       gradientTransform="matrix(0.6306245,0,0,0.61183152,10.485733,1020.7179)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4117"
+       xlink:href="#linearGradient4656"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4670"
+       id="linearGradient4668"
+       x1="13.128298"
+       y1="1040.3267"
+       x2="28.016909"
+       y2="1040.3267"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.439805"
+     inkscape:cx="12.002236"
+     inkscape:cy="14.795088"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient3070);fill-opacity:1;stroke:url(#linearGradient3072);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3861"
+       width="18.952391"
+       height="14.94502"
+       x="4.509459"
+       y="1026.9375"
+       ry="0.9812386" />
+    <rect
+       style="fill:url(#linearGradient4117);fill-opacity:1;stroke:url(#linearGradient4668);stroke-width:1.00492132000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3861-0"
+       width="13.88369"
+       height="10.903726"
+       x="13.630758"
+       y="1034.8749"
+       ry="0.71590114" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_toolpanel.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_toolpanel.svg
new file mode 100644
index 0000000..0c2b36b
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_toolpanel.svg
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_toolpanel.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient3818">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3820" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3822" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3782">
+      <stop
+         style="stop-color:#969696;stop-opacity:1;"
+         offset="0"
+         id="stop3784" />
+      <stop
+         style="stop-color:#646464;stop-opacity:1;"
+         offset="1"
+         id="stop3786" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3774">
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="0"
+         id="stop3776" />
+      <stop
+         style="stop-color:#e6e6e6;stop-opacity:1;"
+         offset="1"
+         id="stop3778" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3774"
+       id="linearGradient3780"
+       x1="25.39061"
+       y1="1047.4788"
+       x2="4.8050866"
+       y2="1024.0441"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1.0274071,30.724364)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3788"
+       x1="6.9462075"
+       y1="1036.3729"
+       x2="25.059683"
+       y2="1036.3729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1.0274071,30.724364)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3824"
+       x1="0.90324998"
+       y1="239.89554"
+       x2="478.8862"
+       y2="239.89554"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3782"
+       id="linearGradient3826"
+       gradientUnits="userSpaceOnUse"
+       x1="429.29108"
+       y1="44.773693"
+       x2="-27.256935"
+       y2="498.1019" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16.290264"
+     inkscape:cx="22.952114"
+     inkscape:cy="6.8610739"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     showguides="false"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient3780);fill-opacity:1;stroke:url(#linearGradient3788);stroke-width:1;stroke-opacity:1"
+       id="rect3004"
+       width="17.113476"
+       height="20.902134"
+       x="8.4736147"
+       y="1056.6462"
+       ry="0.50821292" />
+    <g
+       transform="matrix(0.0418425,0,0,0.0418425,5.9642231,1025.2886)"
+       id="g3"
+       style="fill-opacity:1.0;fill:url(#linearGradient3824)">
+      <path
+         inkscape:connector-curvature="0"
+         d="m 478.409,116.617 c -0.368,-4.271 -3.181,-7.94 -7.2,-9.403 -4.029,-1.472 -8.539,-0.47 -11.57,2.556 l -62.015,62.011 -68.749,-21.768 -21.768,-68.748 62.016,-62.016 c 3.035,-3.032 4.025,-7.543 2.563,-11.565 -1.477,-4.03 -5.137,-6.837 -9.417,-7.207 -37.663,-3.245 -74.566,10.202 -101.247,36.887 -36.542,36.545 -46.219,89.911 -29.083,135.399 -1.873,1.578 -3.721,3.25 -5.544,5.053 L 19.386,373.152 c -0.073,0.071 -0.145,0.149 -0.224,0.219 -24.345,24.346 -24.345,63.959 0,88.309 24.349, [...]
+         id="path5"
+         style="fill-opacity:1.0;fill:url(#linearGradient3826)" />
+    </g>
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaskWidgets/images/maskeditor_verticalline.svg b/GUI/coregui/Views/MaskWidgets/images/maskeditor_verticalline.svg
new file mode 100644
index 0000000..8224f81
--- /dev/null
+++ b/GUI/coregui/Views/MaskWidgets/images/maskeditor_verticalline.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg3955"
+   version="1.1"
+   inkscape:version="0.48.5 r10040"
+   sodipodi:docname="maskeditor_verticalline.svg">
+  <defs
+     id="defs3957">
+    <linearGradient
+       id="linearGradient3776">
+      <stop
+         style="stop-color:#d2d2d2;stop-opacity:1;"
+         offset="0"
+         id="stop3778" />
+      <stop
+         style="stop-color:#d2d2d2;stop-opacity:1;"
+         offset="1"
+         id="stop3780" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3776"
+       id="linearGradient3782"
+       x1="16.976679"
+       y1="27.058661"
+       x2="14.04123"
+       y2="4.9938717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6557377,0,0,1,-10.104842,1020.3622)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="20.439805"
+     inkscape:cx="12.002236"
+     inkscape:cy="14.770626"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1862"
+     inkscape:window-height="1130"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3963"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3960">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1020.3622)">
+    <rect
+       style="fill:url(#linearGradient3782);fill-opacity:1;stroke:none"
+       id="rect3774"
+       width="4.9413385"
+       height="22.113714"
+       x="13.062747"
+       y="1025.3071"
+       ry="0.81219375" />
+    <path
+       style="fill:none;stroke:#797979;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 15.559683,1025.3143 0,22.0468"
+       id="path3002"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialEditor.cpp b/GUI/coregui/Views/MaterialEditor/MaterialEditor.cpp
new file mode 100644
index 0000000..c93acea
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialEditor.cpp
@@ -0,0 +1,159 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialEditor.cpp
+//! @brief     Implements class MaterialEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialEditor.h"
+#include "ComponentEditor.h"
+#include "MaterialEditorToolBar.h"
+#include "MaterialItem.h"
+#include "MaterialModel.h"
+#include <QListView>
+#include <QSplitter>
+#include <QVBoxLayout>
+
+MaterialEditor::MaterialEditor(MaterialModel *materialModel, QWidget *parent)
+    : QWidget(parent)
+    , m_materialModel(materialModel)
+    , m_toolBar(new MaterialEditorToolBar(materialModel, this))
+    , m_splitter(new QSplitter)
+    , m_listView(new QListView)
+    , m_componentEditor(new ComponentEditor)
+    , m_model_was_modified(false)
+{
+    setWindowTitle("MaterialEditorWidget");
+    setMinimumSize(128, 128);
+    resize(512, 400);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setContentsMargins(0,0,0,0);
+
+    m_splitter->addWidget(m_listView);
+    m_splitter->addWidget(m_componentEditor);
+    m_splitter->setCollapsible(0, false);
+    m_splitter->setCollapsible(1, false);
+
+    layout->addWidget(m_toolBar);
+    layout->addWidget(m_splitter);
+
+    setLayout(layout);
+
+    init_views();
+}
+
+QItemSelectionModel *MaterialEditor::getSelectionModel()
+{
+    Q_ASSERT(m_listView);
+    return m_listView->selectionModel();
+}
+
+MaterialItem *MaterialEditor::getSelectedMaterial()
+{
+    QModelIndexList selected = getSelectionModel()->selectedIndexes();
+    if(selected.size()) {
+        return m_materialModel->getMaterial(selected.front());
+    }
+    return nullptr;
+}
+
+//! Sets selection corresponding to initial material property
+void MaterialEditor::setInitialMaterialProperty(const MaterialProperty &matProperty)
+{
+    if(MaterialItem *mat = m_materialModel->getMaterial(matProperty)) {
+        getSelectionModel()->clearSelection();
+        getSelectionModel()->select(m_materialModel->indexOfItem(mat),
+                                    QItemSelectionModel::Select);
+    }
+}
+
+bool MaterialEditor::isModelWasModified() const
+{
+    return m_model_was_modified;
+}
+
+void MaterialEditor::onSelectionChanged(const QItemSelection &selected,
+                                              const QItemSelection &)
+{
+    QModelIndexList indices = selected.indexes();
+
+    if(indices.isEmpty()) {
+        m_componentEditor->setItem(0);
+    } else {
+        if(SessionItem *item = m_materialModel->itemForIndex(indices.at(0))) {
+            m_componentEditor->setItem(item);
+        }
+    }
+}
+
+void MaterialEditor::onDataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &)
+{
+    m_model_was_modified = true;
+}
+
+void MaterialEditor::onRowsInserted(const QModelIndex &, int, int)
+{
+    m_model_was_modified = true;
+}
+
+void MaterialEditor::onRowsRemoved(const QModelIndex &, int, int)
+{
+    m_model_was_modified = true;
+}
+
+
+//! Context menu reimplemented to supress default menu
+void MaterialEditor::contextMenuEvent(QContextMenuEvent *event)
+{
+    Q_UNUSED(event);
+}
+
+
+void MaterialEditor::init_views()
+{
+    // connecting to the model
+    connect(m_materialModel, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
+               this, SLOT(onDataChanged(QModelIndex,QModelIndex,QVector<int>)));
+    connect(m_materialModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
+               this, SLOT(onRowsInserted(QModelIndex,int,int)));
+    connect(m_materialModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+               this, SLOT(onRowsRemoved(QModelIndex,int,int)));
+
+    m_listView->setContextMenuPolicy(Qt::CustomContextMenu);
+    m_listView->setModel(m_materialModel);
+    m_listView->setMovement(QListView::Static);
+    m_listView->setMinimumWidth(50);
+    m_listView->setMaximumWidth(220);
+    m_listView->setSpacing(5);
+
+    m_toolBar->setSelectionModel(getSelectionModel());
+
+    connect(getSelectionModel(),
+            SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+            this,
+            SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&)),
+            Qt::UniqueConnection
+    );
+
+
+    // making first material selected
+    if (!getSelectionModel()->hasSelection()) {
+        QModelIndex itemIndex = m_materialModel->index(0, 0, QModelIndex());
+        getSelectionModel()->select(itemIndex, QItemSelectionModel::Select);
+    }
+
+    connect(m_listView, SIGNAL(customContextMenuRequested(const QPoint &)),
+            m_toolBar, SLOT(onCustomContextMenuRequested(const QPoint &)));
+
+}
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialEditor.h b/GUI/coregui/Views/MaterialEditor/MaterialEditor.h
new file mode 100644
index 0000000..048f431
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialEditor.h
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialEditor.h
+//! @brief     Defines class MaterialEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALEDITOR_H
+#define MATERIALEDITOR_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class MaterialModel;
+class MaterialEditorToolBar;
+class QSplitter;
+class QListView;
+class ComponentEditor;
+class QItemSelection;
+class QItemSelectionModel;
+class MaterialItem;
+class MaterialProperty;
+
+//! Main widget of MaterialEditor
+class BA_CORE_API_ MaterialEditor : public QWidget
+{
+    Q_OBJECT
+
+public:
+    MaterialEditor(MaterialModel *materialModel, QWidget *parent = 0);
+
+    QItemSelectionModel *getSelectionModel();
+
+    MaterialItem *getSelectedMaterial();
+
+    void setInitialMaterialProperty(const MaterialProperty &matProperty);
+
+    bool isModelWasModified() const;
+
+private slots:
+    void onSelectionChanged(const QItemSelection &selected, const QItemSelection&);
+    void onDataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &);
+    void onRowsInserted(const QModelIndex &, int, int );
+    void onRowsRemoved(const QModelIndex &, int, int);
+
+protected:
+    void contextMenuEvent(QContextMenuEvent *event);
+
+private:
+    void init_views();
+
+    MaterialModel *m_materialModel;
+    MaterialEditorToolBar *m_toolBar;
+    QSplitter *m_splitter;
+    QListView *m_listView;
+    ComponentEditor *m_componentEditor;
+    bool m_model_was_modified;
+};
+
+
+#endif // MATERIALEDITOR_H
+
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.cpp b/GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.cpp
new file mode 100644
index 0000000..76185e2
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.cpp
@@ -0,0 +1,134 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.cpp
+//! @brief     Implements class MaterialEditorDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialEditorDialog.h"
+#include "MaterialEditor.h"
+#include "MaterialModel.h"
+#include "MaterialUtils.h"
+#include "mainwindow_constants.h"
+#include <QAction>
+#include <QDebug>
+#include <QPushButton>
+#include <QSettings>
+#include <QVBoxLayout>
+
+namespace {
+const QSize default_dialog_size(512, 400);
+}
+
+MaterialEditorDialog::MaterialEditorDialog(MaterialModel *materialModel, QWidget *parent)
+    : QDialog(parent)
+    , m_origMaterialModel(materialModel)
+    , m_materialEditor(0)
+{
+    setWindowTitle("Material Editor");
+    setMinimumSize(128, 128);
+    resize(default_dialog_size);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    init_material_editor();
+
+    QVBoxLayout *layout = new QVBoxLayout(this);
+    layout->setContentsMargins(0,0,0,0);
+    layout->addWidget(m_materialEditor);
+
+    QPushButton *okButton = new QPushButton("OK");
+    connect(okButton, SIGNAL(clicked()), this, SLOT(onOKButton()));
+    QPushButton *cancelButton = new QPushButton("Cancel");
+    connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancelButton()));
+
+    QHBoxLayout *buttonsLayout = new QHBoxLayout;
+    buttonsLayout->setMargin(10);
+    buttonsLayout->setSpacing(5);
+
+    buttonsLayout->addStretch(1);
+    buttonsLayout->addWidget(okButton);
+    buttonsLayout->addWidget(cancelButton);
+
+    layout->addLayout(buttonsLayout);
+    setLayout(layout);
+}
+
+//! replaces original material model with the model modified by MaterialEditor
+void MaterialEditorDialog::onOKButton()
+{
+    if(m_materialEditor->isModelWasModified()) {
+        m_origMaterialModel->clear();
+        m_origMaterialModel->initFrom(m_tmpMaterialModel.get(), 0);
+    }
+    writeSettings();
+    accept();
+}
+
+
+void MaterialEditorDialog::onCancelButton()
+{
+    writeSettings();
+    reject();
+}
+
+void MaterialEditorDialog::init_material_editor()
+{
+    Q_ASSERT(m_origMaterialModel);
+    m_tmpMaterialModel.reset(m_origMaterialModel->createCopy());
+    m_materialEditor = new MaterialEditor(m_tmpMaterialModel.get(), this);
+    //    m_materialEditor = new MaterialEditor(m_origMaterialModel, this);
+    readSettings();
+
+}
+
+void MaterialEditorDialog::readSettings()
+{
+    QSettings settings;
+    if (settings.childGroups().contains(Constants::S_MATERIALEDITOR)) {
+        settings.beginGroup(Constants::S_MATERIALEDITOR);
+        resize(settings.value(Constants::S_WINDOWSIZE, default_dialog_size).toSize());
+        if(settings.contains(Constants::S_WINDOWPOSITION)) {
+            move(settings.value(Constants::S_WINDOWPOSITION).toPoint());
+        }
+    }
+    else {
+        resize(default_dialog_size);
+    }
+}
+
+void MaterialEditorDialog::writeSettings()
+{
+    QSettings settings;
+    settings.beginGroup(Constants::S_MATERIALEDITOR);
+    settings.setValue(Constants::S_WINDOWSIZE, this->size());
+    settings.setValue(Constants::S_WINDOWPOSITION, this->pos());
+    settings.endGroup();
+}
+
+MaterialProperty MaterialEditorDialog::getSelectedMaterialProperty()
+{
+    if(MaterialItem *material = m_materialEditor->getSelectedMaterial()) {
+        return MaterialProperty(material->getIdentifier());
+    }
+
+    return MaterialProperty();
+}
+
+//!
+void MaterialEditorDialog::setInitialMaterialProperty(const MaterialProperty &matProperty)
+{
+    Q_ASSERT(m_materialEditor);
+
+    m_materialEditor->setInitialMaterialProperty(matProperty);
+
+}
+
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.h b/GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.h
new file mode 100644
index 0000000..99e90d9
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.h
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialEditorDialog.h
+//! @brief     Defines class MaterialEditorDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALEDITORDIALOG_H
+#define MATERIALEDITORDIALOG_H
+
+#include "MaterialProperty.h"
+#include "WinDllMacros.h"
+#include <QDialog>
+#include <memory>
+
+class MaterialModel;
+class MaterialEditor;
+
+//! Main widget of MaterialEditor
+class BA_CORE_API_ MaterialEditorDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    MaterialEditorDialog(MaterialModel *materialModel, QWidget *parent = 0);
+
+    MaterialProperty getSelectedMaterialProperty();
+
+    void setInitialMaterialProperty(const MaterialProperty &matProperty);
+
+public slots:
+    void onOKButton();
+    void onCancelButton();
+
+private:
+    void init_material_editor();
+    void readSettings();
+    void writeSettings();
+
+    MaterialModel *m_origMaterialModel;
+    std::unique_ptr<MaterialModel>  m_tmpMaterialModel;
+    MaterialEditor *m_materialEditor;
+};
+
+#endif // MATERIALEDITORDIALOG_H
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.cpp b/GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.cpp
new file mode 100644
index 0000000..e28ca3f
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.cpp
@@ -0,0 +1,117 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.cpp
+//! @brief     Implements class MaterialEditorToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialEditorToolBar.h"
+#include "MaterialItem.h"
+#include "MaterialModel.h"
+#include <QAction>
+#include <QDebug>
+#include <QItemSelectionModel>
+#include <QListView>
+#include <QMenu>
+#include <QVariant>
+
+namespace {
+const int toolbar_icon_size = 32;
+}
+
+MaterialEditorToolBar::MaterialEditorToolBar(MaterialModel *materialModel,
+                                             QWidget *parent)
+    : QToolBar(parent)
+    , m_materialModel(materialModel)
+    , m_selectionModel(0)
+    , m_newMaterialAction(0)
+    , m_cloneMaterialAction(0)
+    , m_removeMaterialAction(0)
+
+{
+    setIconSize(QSize(toolbar_icon_size, toolbar_icon_size));
+    setProperty("_q_custom_style_disabled", QVariant(true));
+
+    m_newMaterialAction = new QAction(QStringLiteral("Add new material"), parent);
+    m_newMaterialAction->setIcon(QIcon(":/images/toolbar32dark_newitem.svg"));
+    m_newMaterialAction->setToolTip(QStringLiteral("Add new material"));
+    connect(m_newMaterialAction, SIGNAL(triggered()), this,
+            SLOT(onNewMaterialAction()));
+    addAction(m_newMaterialAction);
+
+    m_cloneMaterialAction = new QAction(QStringLiteral("Clone material"), parent);
+    m_cloneMaterialAction->setIcon(
+        QIcon(":/images/toolbar32dark_cloneitem.svg"));
+    m_cloneMaterialAction->setToolTip(QStringLiteral("Clone selected material"));
+    connect(m_cloneMaterialAction, SIGNAL(triggered()), this,
+            SLOT(onCloneMaterialAction()));
+    addAction(m_cloneMaterialAction);
+
+    m_removeMaterialAction = new QAction(QStringLiteral("Remove selected material"), parent);
+    m_removeMaterialAction->setIcon(QIcon(":/images/toolbar32dark_remove.svg"));
+    m_removeMaterialAction->setToolTip(QStringLiteral("Remove selected material"));
+    connect(m_removeMaterialAction, SIGNAL(triggered()), this,
+            SLOT(onRemoveMaterialAction()));
+    addAction(m_removeMaterialAction);
+}
+
+void MaterialEditorToolBar::setSelectionModel(QItemSelectionModel *selectionModel)
+{
+    m_selectionModel = selectionModel;
+}
+
+void MaterialEditorToolBar::onCustomContextMenuRequested(const QPoint &point)
+{
+    QListView *listView = qobject_cast<QListView *>(sender());
+    Q_ASSERT(listView);
+    QPoint global = listView->mapToGlobal(point);
+
+    QMenu menu;
+    initItemContextMenu(menu);
+    menu.exec(global);
+//    setAllActionsEnabled(true);
+
+}
+
+void MaterialEditorToolBar::onNewMaterialAction()
+{
+    m_materialModel->addMaterial("unnamed");
+}
+
+void MaterialEditorToolBar::onCloneMaterialAction()
+{
+    QModelIndexList selected = m_selectionModel->selectedIndexes();
+    if(selected.size()) {
+        QModelIndex selectedIndex = selected.front();
+        m_materialModel->cloneMaterial(selectedIndex);
+    }
+}
+
+void MaterialEditorToolBar::onRemoveMaterialAction()
+{
+    Q_ASSERT(m_materialModel);
+    Q_ASSERT(m_selectionModel);
+
+    QModelIndexList selected = m_selectionModel->selectedIndexes();
+    if(selected.size()) {
+        m_materialModel->removeRows(selected.front().row(), 1, selected.back().parent());
+    }
+}
+
+void MaterialEditorToolBar::initItemContextMenu(QMenu &menu)
+{
+    menu.addAction(m_newMaterialAction);
+    menu.addAction(m_cloneMaterialAction);
+    menu.addSeparator();
+    menu.addAction(m_removeMaterialAction);
+
+}
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.h b/GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.h
new file mode 100644
index 0000000..7487199
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialEditorToolBar.h
+//! @brief     Defines class MaterialEditorToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALEDITORTOOLBAR_H
+#define MATERIALEDITORTOOLBAR_H
+
+#include "WinDllMacros.h"
+#include <QToolBar>
+
+class QAction;
+class MaterialModel;
+class QItemSelectionModel;
+class QPoint;
+class QMenu;
+
+//! Main widget of MaterialEditor
+class BA_CORE_API_ MaterialEditorToolBar : public QToolBar
+{
+    Q_OBJECT
+public:
+    MaterialEditorToolBar(MaterialModel *materialModel, QWidget *parent = 0);
+
+    void setSelectionModel(QItemSelectionModel *selectionModel);
+
+public slots:
+    void onCustomContextMenuRequested(const QPoint &point);
+
+private slots:
+    void onNewMaterialAction();
+    void onCloneMaterialAction();
+    void onRemoveMaterialAction();
+
+private:
+    void initItemContextMenu(QMenu &menu);
+
+    MaterialModel *m_materialModel;
+    QItemSelectionModel *m_selectionModel;
+    QAction *m_newMaterialAction;
+    QAction *m_cloneMaterialAction;
+    QAction *m_removeMaterialAction;
+};
+
+#endif // MATERIALEDITORTOOLBAR_H
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialProperty.cpp b/GUI/coregui/Views/MaterialEditor/MaterialProperty.cpp
new file mode 100644
index 0000000..2ff15b2
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialProperty.cpp
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialProperty.cpp
+//! @brief     Implements class MaterialProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialProperty.h"
+#include "MaterialItem.h"
+#include "MaterialModel.h"
+#include "MaterialSvc.h"
+
+QString MaterialProperty::getName() const
+{
+    MaterialProperty property(getIdentifier());
+    MaterialItem *materialItem = MaterialSvc::getMaterial(property);
+    if(materialItem) {
+        return materialItem->itemName();
+    } else {
+        return QString("Undefined");
+    }
+}
+
+
+QColor MaterialProperty::getColor() const
+{
+    MaterialProperty property(getIdentifier());
+    MaterialItem *materialItem = MaterialSvc::getMaterial(property);
+    if(materialItem) {
+        return materialItem->getColor();
+    } else {
+        return QColor(Qt::red);
+    }
+
+}
+
+
+QPixmap MaterialProperty::getPixmap() const
+{
+    QPixmap pixmap(10,10);
+    pixmap.fill(getColor());
+    return pixmap;
+}
+
+bool MaterialProperty::isDefined() const
+{
+    return !m_identifier.isEmpty();
+}
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialProperty.h b/GUI/coregui/Views/MaterialEditor/MaterialProperty.h
new file mode 100644
index 0000000..a4ab5e1
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialProperty.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialProperty.h
+//! @brief     Defines class MaterialProperty
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALPROPERTY_H
+#define MATERIALPROPERTY_H
+
+#include "WinDllMacros.h"
+#include <QColor>
+#include <QMetaType>
+#include <QPixmap>
+#include <QString>
+#include <QVariant>
+
+//! The MaterialProperty class defines unique identifier to help LayerItem, ParticleItem etc
+//! to access materials from MaterialEditor;
+class BA_CORE_API_ MaterialProperty
+{
+public:
+    explicit MaterialProperty(const QString &identifier=QString())
+        : m_identifier(identifier){}
+
+    QString getIdentifier() const {
+        return m_identifier;
+    }
+
+    QVariant getVariant() const
+    {
+        QVariant variant;
+        variant.setValue(*this);
+        return variant;
+    }
+
+    QString getName() const;
+    QColor getColor() const;
+    QPixmap getPixmap() const;
+
+    bool isDefined() const;
+
+private:
+    QString m_identifier;
+};
+
+Q_DECLARE_METATYPE(MaterialProperty)
+
+#endif // MATERIALPROPERTY_H
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialSvc.cpp b/GUI/coregui/Views/MaterialEditor/MaterialSvc.cpp
new file mode 100644
index 0000000..d2394ff
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialSvc.cpp
@@ -0,0 +1,129 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialSvc.cpp
+//! @brief     Implements class MaterialSvc
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialSvc.h"
+#include "MaterialEditorDialog.h"
+#include "MaterialItem.h"
+#include "MaterialModel.h"
+#include "MaterialUtils.h"
+#include "SessionModel.h"
+#include <QDebug>
+
+MaterialSvc *MaterialSvc::m_instance = 0;
+
+MaterialSvc::MaterialSvc(MaterialModel *materialModel)
+    : m_materialModel(materialModel)
+{
+    Q_ASSERT(!m_instance);
+    m_instance = this;
+}
+
+
+MaterialSvc::~MaterialSvc()
+{
+    m_instance = 0;
+}
+
+MaterialSvc *MaterialSvc::instance()
+{
+    return m_instance;
+}
+
+
+MaterialProperty
+MaterialSvc::selectMaterialProperty(const MaterialProperty &previousMaterial)
+{
+    Q_ASSERT(m_instance);
+    return m_instance->this_selectMaterialProperty(previousMaterial);
+}
+
+
+MaterialProperty
+MaterialSvc::this_selectMaterialProperty(const MaterialProperty &previousMaterial)
+{
+    qDebug() << "MaterialEditor::this_getMaterialProperty()";
+    MaterialEditorDialog dialog(m_materialModel);
+    dialog.setInitialMaterialProperty(previousMaterial);
+    if(dialog.exec() == QDialog::Accepted) {
+        return dialog.getSelectedMaterialProperty();
+    }
+
+    return MaterialProperty();
+}
+
+
+MaterialProperty MaterialSvc::getMaterialProperty(const QString &name)
+{
+    Q_ASSERT(m_instance);
+    return m_instance->this_getMaterialProperty(name);
+}
+
+
+MaterialProperty MaterialSvc::this_getMaterialProperty(const QString &name)
+{
+    MaterialItem *material = m_materialModel->getMaterial(name);
+    if(material)
+        return MaterialProperty(material->getIdentifier());
+
+    return MaterialProperty();
+}
+
+
+MaterialProperty MaterialSvc::getDefaultMaterialProperty()
+{
+    Q_ASSERT(m_instance);
+    return m_instance->this_getDefaultMaterialProperty();
+}
+
+//! Returns default MaterialProperty which is the signature of the first
+//! MaterialItem in the model.
+MaterialProperty MaterialSvc::this_getDefaultMaterialProperty()
+{
+    Q_ASSERT(m_materialModel);
+    if((m_materialModel->rowCount( QModelIndex() ) ) ) {
+        QModelIndex firstIndex = m_materialModel->index(0, 0, QModelIndex());
+        MaterialItem *material = dynamic_cast<MaterialItem *>(m_materialModel->itemForIndex(firstIndex));
+        Q_ASSERT(material);
+        return MaterialProperty(material->getIdentifier());
+    } else {
+        return MaterialProperty();
+    }
+}
+
+
+MaterialModel *MaterialSvc::getMaterialModel()
+{
+    Q_ASSERT(m_instance);
+    return m_instance->this_getMaterialModel();
+}
+
+MaterialItem *MaterialSvc::getMaterial(const MaterialProperty &property)
+{
+    Q_ASSERT(m_instance);
+    return m_instance->this_getMaterial(property);
+}
+
+
+MaterialModel *MaterialSvc::this_getMaterialModel()
+{
+    return m_materialModel;
+}
+
+MaterialItem *MaterialSvc::this_getMaterial(const MaterialProperty &property)
+{
+    return this_getMaterialModel()->getMaterial(property);
+}
+
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialSvc.h b/GUI/coregui/Views/MaterialEditor/MaterialSvc.h
new file mode 100644
index 0000000..7e41392
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialSvc.h
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialSvc.h
+//! @brief     Defines class MaterialSvc
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALSVC_H
+#define MATERIALSVC_H
+
+#include "MaterialProperty.h"
+#include "WinDllMacros.h"
+#include <QObject>
+
+class MaterialModel;
+class SessionModel;
+class MaterialItem;
+
+//! The MaterialEditor is the main class to access materials.
+class BA_CORE_API_ MaterialSvc : public QObject
+{
+    Q_OBJECT
+public:
+    MaterialSvc(MaterialModel *materialModel);
+    virtual ~MaterialSvc();
+
+    static MaterialSvc *instance();
+
+    static MaterialProperty getMaterialProperty(const QString &name);
+    static MaterialProperty selectMaterialProperty(const MaterialProperty &previousMaterial=MaterialProperty());
+    static MaterialProperty getDefaultMaterialProperty();
+
+    static MaterialModel *getMaterialModel();
+
+    static MaterialItem *getMaterial(const MaterialProperty &property);
+
+private:
+    MaterialProperty this_selectMaterialProperty(const MaterialProperty &previousMaterial);
+    MaterialProperty this_getMaterialProperty(const QString &name);
+    MaterialProperty this_getDefaultMaterialProperty();
+    MaterialModel *this_getMaterialModel();
+    MaterialItem *this_getMaterial(const MaterialProperty &property);
+
+    static MaterialSvc *m_instance;
+    MaterialModel *m_materialModel;
+};
+
+
+
+#endif // MATERIALSVC_H
+
+
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialUtils.cpp b/GUI/coregui/Views/MaterialEditor/MaterialUtils.cpp
new file mode 100644
index 0000000..2feee94
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialUtils.cpp
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialUtils.cpp
+//! @brief     Implements class MaterialUtils
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MaterialUtils.h"
+#include "ComboProperty.h"
+#include "DesignerHelper.h"
+#include "GUIHelpers.h"
+#include "HomogeneousMagneticMaterial.h"
+#include "HomogeneousMaterial.h"
+#include "MagneticFieldItem.h"
+#include "MaterialModel.h"
+#include "MaterialSvc.h"
+#include "RefractiveIndexItem.h"
+#include <QDebug>
+
+
+QColor MaterialUtils::suggestMaterialColor(const QString &name)
+{
+    if(name.contains("Air") ) {
+        return QColor(179, 242, 255);
+    }
+    else if(name.contains("Substrate") ) {
+        return QColor(205,102,0);
+    }
+    else if ( name.contains("Default") ) {
+        return QColor(Qt::green);
+    }
+    else if ( name.contains("Particle") ) {
+        return QColor(146, 198, 255);
+    }
+    else {
+        return DesignerHelper::getRandomColor();
+    }
+}
+
+
+MaterialProperty MaterialUtils::getDefaultMaterialProperty()
+{
+    if(MaterialSvc::instance()) {
+        return MaterialSvc::getDefaultMaterialProperty();
+    }
+    return MaterialProperty();
+}
+
+
+ColorProperty MaterialUtils::suggestMaterialColorProperty(const QString &name)
+{
+    return ColorProperty(MaterialUtils::suggestMaterialColor(name));
+}
+
+std::unique_ptr<IMaterial>
+MaterialUtils::createDomainMaterial(const MaterialProperty &material_property)
+{
+    MaterialItem *materialItem
+        = MaterialSvc::getMaterial(material_property);
+    Q_ASSERT(materialItem);
+    return materialItem->createMaterial();
+}
diff --git a/GUI/coregui/Views/MaterialEditor/MaterialUtils.h b/GUI/coregui/Views/MaterialEditor/MaterialUtils.h
new file mode 100644
index 0000000..0e13b36
--- /dev/null
+++ b/GUI/coregui/Views/MaterialEditor/MaterialUtils.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/MaterialEditor/MaterialUtils.h
+//! @brief     Defines class MaterialUtils
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MATERIALUTILS_H
+#define MATERIALUTILS_H
+
+#include "ColorProperty.h"
+#include "MaterialItem.h"
+#include "MaterialProperty.h"
+#include <QColor>
+#include <QString>
+#include <memory>
+
+class IMaterial;
+
+namespace MaterialUtils
+{
+
+BA_CORE_API_ QColor suggestMaterialColor(const QString &name);
+BA_CORE_API_ MaterialProperty getDefaultMaterialProperty();
+BA_CORE_API_ ColorProperty suggestMaterialColorProperty(const QString &name);
+BA_CORE_API_ std::unique_ptr<IMaterial> createDomainMaterial(
+        const MaterialProperty &material_property);
+}
+
+
+#endif // MATERIALUTILS_H
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.cpp b/GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.cpp
new file mode 100644
index 0000000..7bb4a0a
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.cpp
@@ -0,0 +1,105 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.cpp
+//! @brief     Implements class ComponentBoxEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+#include "ComponentBoxEditor.h"
+#include "ComponentEditorPrivate.h"
+#include "CustomEventFilters.h"
+#include "SessionModel.h"
+#include <QModelIndex>
+
+ComponentBoxEditor::ComponentBoxEditor(QWidget *parent)
+    : ComponentEditor(ComponentEditorFlags::BROWSER_GROUPBOX, parent)
+{
+
+}
+
+////! adds all property items to thr PropertyGroup with given name
+void ComponentBoxEditor::addPropertyItems(SessionItem *item, const QString &group_name)
+{
+    Q_ASSERT(item);
+    QtVariantProperty *groupProperty = m_d->processPropertyGroupForName(group_name);
+    updatePropertyItems(item, groupProperty);
+}
+
+void ComponentBoxEditor::updatePropertyItems(SessionItem *item, QtVariantProperty *parentProperty)
+{
+    if(item->modelType() == Constants::PropertyType ||
+            item->modelType() == Constants::GroupItemType) {
+            updateItem(item, parentProperty);
+    }
+
+    if(m_d->m_item_to_insert_mode.contains(item)) {
+        if(m_d->m_item_to_insert_mode[item] == ComponentEditorFlags::SINGLE) return;
+    }
+    foreach (SessionItem *childItem, componentItems(item)) {
+        updateItem(childItem, parentProperty);
+    }
+
+}
+
+//! add single item to property group with given name
+void ComponentBoxEditor::addItem(SessionItem *item, const QString &group_name)
+{
+    Q_ASSERT(item);
+    QtVariantProperty *groupProperty = m_d->processPropertyGroupForName(group_name);
+    updateItem(item, groupProperty);
+    m_d->m_item_to_insert_mode[item] = ComponentEditorFlags::SINGLE;
+}
+
+void ComponentBoxEditor::updateItem(SessionItem *item, QtVariantProperty *parentProperty)
+{
+    connectModel(item->model());
+    m_d->processPropertyForItem(item, parentProperty);
+
+}
+
+void ComponentBoxEditor::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
+{
+    Q_UNUSED(bottomRight);
+//    if (topLeft != bottomRight)
+//        return;
+
+    SessionModel *model = qobject_cast<SessionModel *>(sender());
+    Q_ASSERT(model);
+    SessionItem *item = model->itemForIndex(topLeft);
+    Q_ASSERT(item);
+
+    if (QtVariantProperty *property = m_d->getPropertyForItem(item)) {
+        // updating editor's property appearance (tooltips, limits)
+        if (roles.contains(SessionModel::FlagRole)) {
+            m_d->updatePropertyAppearance(property, PropertyAttribute::fromItem(item));
+        }
+
+        // updating editor's property values
+        if (roles.contains(Qt::DisplayRole) || roles.contains(Qt::EditRole)) {
+            disconnectManager();
+            property->setValue(item->value());
+            connectManager();
+
+            if(item->modelType() == Constants::GroupItemType) {
+                m_d->cleanChildren(item);
+                updatePropertyItems(item, m_d->m_item_to_qtparent[item]);
+//                updateEditor(item, m_d->getPropertyForItem(item->parent()));
+            }
+
+        }
+    }
+
+}
+
+void ComponentBoxEditor::onRowsInserted(const QModelIndex &, int , int )
+{
+    // intentionally empty
+}
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.h b/GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.h
new file mode 100644
index 0000000..225e02a
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/ComponentBoxEditor.h
+//! @brief     Defines class ComponentBoxEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPONENTBOXEDITOR_H
+#define COMPONENTBOXEDITOR_H
+
+#include "ComponentEditor.h"
+#include "WinDllMacros.h"
+
+//! Special version of editor to show property item as standard qt widgets
+
+class BA_CORE_API_ ComponentBoxEditor : public ComponentEditor
+{
+    Q_OBJECT
+public:
+    ComponentBoxEditor(QWidget *parent = 0);
+
+    void addPropertyItems(SessionItem *item, const QString &group_name=QString());
+    void updatePropertyItems(SessionItem *item, QtVariantProperty *parentProperty=0);
+
+    void addItem(SessionItem *item, const QString &group_name=QString());
+    void updateItem(SessionItem *item, QtVariantProperty *parentProperty);
+
+public slots:
+    void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles);
+    void onRowsInserted(const QModelIndex &, int, int);
+
+};
+
+
+#endif // COMPONENTBOXEDITOR_H
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentEditor.cpp b/GUI/coregui/Views/PropertyEditor/ComponentEditor.cpp
new file mode 100644
index 0000000..b079f42
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/ComponentEditor.cpp
@@ -0,0 +1,259 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/ComponentEditor.cpp
+//! @brief     Implements class ComponentEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+#include "ComponentEditor.h"
+#include "ComponentEditorPrivate.h"
+#include "GUIHelpers.h"
+#include "GroupItem.h"
+#include "GroupProperty.h"
+#include "SessionItem.h"
+#include "SessionModel.h"
+#include "qtpropertybrowser.h"
+#include <QVBoxLayout>
+#include <QVariant>
+#include <QTreeView>
+
+ComponentEditor::ComponentEditor(ComponentEditorFlags::PresentationType flags, QWidget *parent)
+    : QWidget(parent)
+    , m_d(new ComponentEditorPrivate(flags, this))
+{
+    setWindowTitle(QLatin1String("Property Editor"));
+    setObjectName(QLatin1String("ComponentEditor"));
+
+    QVBoxLayout *layout = new QVBoxLayout(this);
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->setContentsMargins(0,0,0,0);
+    layout->addWidget(m_d->m_browser);
+//    layout->addStretch();
+
+    connectManager();
+}
+
+ComponentEditor::~ComponentEditor()
+{
+}
+
+//! Sets editor to display all recursive properties of given item
+void ComponentEditor::setItem(SessionItem *item, const QString &group_name)
+{
+    if(item == m_d->m_topItem)
+        return;
+
+    clearEditor();
+
+    m_d->m_topItem = item;
+    if(!item)
+        return;
+
+    connectModel(item->model());
+
+    QtVariantProperty *groupVariantProperty = m_d->processPropertyGroupForName(group_name);
+
+    foreach (SessionItem *childItem, componentItems(item)) {
+        updateEditor(childItem, groupVariantProperty);
+    }
+}
+
+
+//! Main function to run through SessionItem tree and fill editor with
+//! properties
+void ComponentEditor::updateEditor(SessionItem *item,
+                                   QtVariantProperty *parentProperty)
+{
+    if (QtVariantProperty *childProperty
+        = m_d->processPropertyForItem(item, parentProperty)) {
+        parentProperty = childProperty;
+    }
+
+    foreach (SessionItem *childItem, componentItems(item)) {
+        updateEditor(childItem, parentProperty);
+    }
+}
+
+//! Clear editor from all properties, ready to accept new items
+void ComponentEditor::clearEditor()
+{
+    disconnect();
+    disconnectManager();
+    m_d->clear();
+    connectManager();
+}
+
+void ComponentEditor::setHeaderHidden(bool hide)
+{
+    const QObjectList list = m_d->m_browser->children();
+    foreach(QObject *obj, list) {
+        QTreeView *view = dynamic_cast<QTreeView *>(obj);
+        if(view)
+            view->setHeaderHidden(hide);
+    }
+
+}
+
+//! Propagates data from SessionItem to editor
+void ComponentEditor::onDataChanged(const QModelIndex &topLeft,
+                                    const QModelIndex &bottomRight,
+                                    const QVector<int> &roles)
+{
+//    if (topLeft != bottomRight)
+//        return;
+    Q_UNUSED(bottomRight);
+
+    SessionModel *model = qobject_cast<SessionModel *>(sender());
+    Q_ASSERT(model);
+    SessionItem *item = model->itemForIndex(topLeft);
+    Q_ASSERT(item);
+
+    if(m_d->m_changedItems.contains(item)) return;
+
+    if (QtVariantProperty *property = m_d->getPropertyForItem(item)) {
+        // updating editor's property appearance (tooltips, limits)
+        if (roles.contains(SessionModel::FlagRole)) {
+            m_d->updatePropertyAppearance(property, PropertyAttribute::fromItem(item));
+        }
+
+        // updating editor's property values
+        if (roles.contains(Qt::DisplayRole) || roles.contains(Qt::EditRole)) {
+            disconnectManager();
+            property->setValue(item->value());
+            connectManager();
+
+            if(item->modelType() == Constants::GroupItemType) {
+                m_d->cleanChildren(item);
+                updateEditor(item, m_d->getPropertyForItem(item->parent()));
+            }
+
+        }
+    }
+}
+
+//! Updates the editor starting from given SessionItem's parent.
+//! Editor should know already about given item (i.e. corresponding
+//! QtVariantProperty should exist.
+void ComponentEditor::onRowsInserted(const QModelIndex &parent, int,
+                                     int )
+{
+    SessionModel *model = qobject_cast<SessionModel *>(sender());
+
+    SessionItem *item = model->itemForIndex(parent);
+    Q_ASSERT(item);
+    if(m_d->m_changedItems.contains(item)) return;
+
+    if (QtVariantProperty *property = m_d->getPropertyForItem(item)) {
+        updateEditor(item, property);
+    }
+}
+
+//! Propagates value from the editor to SessionItem
+void ComponentEditor::onQtPropertyChanged(QtProperty *property,
+                                          const QVariant &value)
+{
+    if (SessionItem *item = m_d->getItemForProperty(property)) {
+        Q_ASSERT(item);
+//        disconnectModel(item->model());
+        m_d->m_changedItems.append(item);
+        item->setValue(value);
+//        connectModel(item->model());
+        m_d->m_changedItems.removeAll(item);
+    }
+}
+
+//! Returns list of children suitable for displaying in ComponentEditor.
+QList<SessionItem *>
+ComponentEditor::componentItems(SessionItem *item) const
+{
+    QList<SessionItem *> result;
+    foreach (SessionItem *child, item->childItems()) {
+        if (!child->isVisible())
+            continue;
+
+        if (child->modelType() == Constants::PropertyType) {
+            result.append(child);
+        }
+
+        else if (child->modelType() == Constants::GroupItemType) {
+            result.append(child);
+        }
+
+        else if (child->modelType() == Constants::VectorType) {
+            result.append(child);
+        }
+
+        else if (child->modelType() == Constants::RefractiveIndexType) {
+            result.append(child);
+        }
+
+        else if (child->modelType() == Constants::BasicAxisType ||
+                 child->modelType() == Constants::AmplitudeAxisType) {
+            result.append(child);
+        }
+
+        if (item->modelType() == Constants::GroupItemType) {
+            foreach (SessionItem *childOfChild, child->childItems()) {
+                if (childOfChild->isVisible())
+                    result.append(childOfChild);
+            }
+        }
+
+    }
+
+    return result;
+}
+
+
+void ComponentEditor::disconnectModel(SessionModel *model)
+{
+    if(!model) return;
+
+    disconnect(
+        model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &,
+                                  const QVector<int> &)),
+        this, SLOT(onDataChanged(const QModelIndex &, const QModelIndex &,
+                                 const QVector<int> &)));
+
+    disconnect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this,
+               SLOT(onRowsInserted(const QModelIndex &, int, int)));
+}
+
+void ComponentEditor::connectModel(SessionModel *model)
+{
+    if(!model) return;
+
+    connect(model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &,
+                                      const QVector<int> &)),
+            this, SLOT(onDataChanged(const QModelIndex &, const QModelIndex &,
+                                     const QVector<int> &)),
+            Qt::UniqueConnection);
+
+    connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this,
+            SLOT(onRowsInserted(const QModelIndex &, int, int)),
+            Qt::UniqueConnection);
+}
+
+void ComponentEditor::disconnectManager()
+{
+    disconnect(m_d->m_manager,
+               SIGNAL(valueChanged(QtProperty *, const QVariant &)), this,
+               SLOT(onQtPropertyChanged(QtProperty *, const QVariant &)));
+}
+
+void ComponentEditor::connectManager()
+{
+    connect(m_d->m_manager,
+            SIGNAL(valueChanged(QtProperty *, const QVariant &)), this,
+            SLOT(onQtPropertyChanged(QtProperty *, const QVariant &)),
+            Qt::UniqueConnection);
+}
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentEditor.h b/GUI/coregui/Views/PropertyEditor/ComponentEditor.h
new file mode 100644
index 0000000..0c4c117
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/ComponentEditor.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/ComponentEditor.h
+//! @brief     Defines class ComponentEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPONENTEDITOR_H
+#define COMPONENTEDITOR_H
+
+#include "ComponentEditorFlags.h"
+#include "WinDllMacros.h"
+#include <QWidget>
+#include <memory>
+
+class ComponentEditorPrivate;
+class SessionItem;
+class SessionModel;
+class QtVariantProperty;
+class QtProperty;
+
+class BA_CORE_API_ ComponentEditor : public QWidget
+{
+    Q_OBJECT
+public:
+    ComponentEditor(ComponentEditorFlags::PresentationType flags = ComponentEditorFlags::BROWSER_TABLE, QWidget *parent = 0);
+
+    virtual ~ComponentEditor();
+
+    void setItem(SessionItem *item, const QString &group_name=QString());
+
+    void updateEditor(SessionItem *item, QtVariantProperty *parentProperty = 0);
+
+    void clearEditor();
+
+    void setHeaderHidden(bool hide);
+
+public slots:
+    virtual void onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles);
+    virtual void onRowsInserted(const QModelIndex &parent, int first, int last);
+
+private slots:
+    void onQtPropertyChanged(QtProperty *, const QVariant &value);
+
+protected:
+    QList<SessionItem *> componentItems(SessionItem *item) const;
+    void cleanChildren(SessionItem *item);
+
+    void disconnectModel(SessionModel *model);
+    void connectModel(SessionModel *model);
+    void disconnectManager();
+    void connectManager();
+
+    std::unique_ptr<ComponentEditorPrivate> m_d;
+};
+
+
+#endif // COMPONENTEDITOR_H
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentEditorFlags.h b/GUI/coregui/Views/PropertyEditor/ComponentEditorFlags.h
new file mode 100644
index 0000000..b9f6b8c
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/ComponentEditorFlags.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/ComponentEditorFlags.h
+//! @brief     Defines class ComponentEditorFlags
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPONENTEDITORFLAGS_H
+#define COMPONENTEDITORFLAGS_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class BA_CORE_API_ ComponentEditorFlags
+{
+public:
+    enum EPresentationType {
+        BROWSER_TABLE = 0x001,    // table-like browser
+        BROWSER_GROUPBOX = 0x002, // groupbox-like browser
+        BROWSER_BUTTON = 0x004    // button-like browser
+    };
+    Q_DECLARE_FLAGS(PresentationType, EPresentationType)
+
+    enum EInsertModeType {
+        RECURSIVE = 0x001,
+        SINGLE = 0x002,
+    };
+    Q_DECLARE_FLAGS(InsertMode, EInsertModeType)
+
+
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(ComponentEditorFlags::PresentationType)
+
+
+#endif // COMPONENTEDITORFLAGS_H
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.cpp b/GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.cpp
new file mode 100644
index 0000000..abb8345
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.cpp
@@ -0,0 +1,269 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.cpp
+//! @brief     Implements class ComponentEditorPrivate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ComponentEditorPrivate.h"
+#include "CustomEventFilters.h"
+#include "GUIHelpers.h"
+#include <QComboBox>
+#include <QDebug>
+#include <QString>
+#include <cmath>
+
+ComponentEditorPrivate::ComponentEditorPrivate(ComponentEditorFlags::PresentationType flags, QWidget *parent)
+    : m_browser(0), m_manager(0), m_read_only_manager(0)
+    , m_propertyFactory(new PropertyVariantFactory(parent))
+    , m_presentationType(flags)
+    , m_wheel_event_filter(new WheelEventEater)
+    , m_topItem(0)
+{
+    m_read_only_manager = new PropertyVariantManager(parent);
+    m_manager = new PropertyVariantManager(parent);
+    init_browser();
+}
+
+ComponentEditorPrivate::~ComponentEditorPrivate()
+{
+    clear();
+}
+
+void ComponentEditorPrivate::clear()
+{
+    m_browser->clear();
+
+    auto it = m_qtproperty_to_item.begin();
+    while (it != m_qtproperty_to_item.end()) {
+        delete it.key();
+        it++;
+    }
+
+    m_qtproperty_to_item.clear();
+    m_item_to_qtvariantproperty.clear();
+    m_groupname_to_qtvariant.clear();
+    m_item_to_qtparent.clear();
+    m_item_to_insert_mode.clear();
+    m_changedItems.clear();
+}
+
+void ComponentEditorPrivate::init_browser()
+{
+    delete m_browser;
+    m_browser = 0;
+
+    if (m_presentationType & ComponentEditorFlags::BROWSER_TABLE) {
+        QtTreePropertyBrowser *browser = new QtTreePropertyBrowser;
+        browser->setResizeMode(QtTreePropertyBrowser::Interactive);
+        browser->setRootIsDecorated(false);
+        m_browser = browser;
+    }
+
+    else if (m_presentationType & ComponentEditorFlags::BROWSER_GROUPBOX) {
+        m_browser = new QtGroupBoxPropertyBrowser;
+    }
+
+    else if (m_presentationType & ComponentEditorFlags::BROWSER_BUTTON) {
+        m_browser = new QtButtonPropertyBrowser;
+
+    } else {
+        throw GUIHelpers::Error(
+            "ComponentEditorPrivate::init_browser() -> Error. "
+            "Unknown browser type.");
+    }
+    m_browser->setAttribute(Qt::WA_MacShowFocusRect, false);
+    m_browser->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+    m_browser->setFactoryForManager(m_manager, m_propertyFactory);
+}
+
+//! Creates, if necessary, qtVariantProperty for given item and place it in the editor
+QtVariantProperty *ComponentEditorPrivate::
+    processPropertyForItem(SessionItem *item, QtVariantProperty *parentProperty)
+{
+    QtVariantProperty *itemProperty = getPropertyForItem(item);
+    if (!itemProperty) {
+        itemProperty = createQtVariantProperty(item);
+        if (itemProperty) {
+            m_qtproperty_to_item[itemProperty] = item;
+            m_item_to_qtvariantproperty[item] = itemProperty;
+        }
+
+        if (itemProperty) {
+            if (parentProperty) {
+                parentProperty->addSubProperty(itemProperty);
+                m_item_to_qtparent[item] = parentProperty;
+            } else {
+                m_browser->addProperty(itemProperty);
+            }
+        }
+    }
+
+    install_custom_filters();
+
+    return itemProperty;
+}
+
+//! Returns QtVariantProperty representing given item in ComponentEditor.
+QtVariantProperty *ComponentEditorPrivate::getPropertyForItem(SessionItem *item)
+{
+    if (m_item_to_qtvariantproperty.contains(item)) {
+        return m_item_to_qtvariantproperty[item];
+    }
+    return nullptr;
+}
+
+//! Returns SessionItem corresponding to QtVariantProperty representation
+SessionItem *ComponentEditorPrivate::getItemForProperty(QtProperty *property)
+{
+    if (m_qtproperty_to_item.contains(property)) {
+        return m_qtproperty_to_item[property];
+    }
+    return nullptr;
+}
+
+//! creates QtVariantProperty for given SessionItem's property
+QtVariantProperty *ComponentEditorPrivate::createQtVariantProperty(SessionItem *item)
+{
+    QtVariantProperty *result(0);
+
+    QString property_name = item->itemName();
+    QVariant prop_value = item->value();
+    PropertyAttribute prop_attribute = PropertyAttribute::fromItem(item);
+
+    if (!prop_value.isValid()) {
+        result = m_manager->addProperty(QtVariantPropertyManager::groupTypeId(), property_name);
+
+    } else {
+        int type = GUIHelpers::getVariantType(prop_value);
+
+        QtVariantPropertyManager *manager = m_manager;
+        if (prop_attribute.isReadOnly())
+            manager = m_read_only_manager;
+
+        if (!manager->isPropertyTypeSupported(type)) {
+            throw GUIHelpers::Error(
+                "ComponentEditor::createQtVariantProperty() -> Error. Not supported property type "
+                + property_name);
+        }
+
+        result = manager->addProperty(type, property_name);
+        result->setValue(prop_value);
+    }
+
+    updatePropertyAppearance(result, PropertyAttribute::fromItem(item));
+    return result;
+}
+
+QtVariantProperty *ComponentEditorPrivate::processPropertyGroupForName(const QString &name)
+{
+    QtVariantProperty *result = getPropertyForGroupName(name);
+    if(result == nullptr && name.size()) {
+        result = m_manager->addProperty(QtVariantPropertyManager::groupTypeId(), name);
+        m_groupname_to_qtvariant[name] = result;
+        m_browser->addProperty(result);
+    }
+    return result;
+}
+
+QtVariantProperty *ComponentEditorPrivate::getPropertyForGroupName(const QString &name)
+{
+    if (m_groupname_to_qtvariant.contains(name)) {
+        return m_groupname_to_qtvariant[name];
+    }
+    return nullptr;
+}
+
+//! removes given qtVariantProperty from browser and all maps
+void ComponentEditorPrivate::removeQtVariantProperty(QtVariantProperty *property)
+{
+    m_browser->removeProperty(property);
+    delete property;
+    auto it = m_qtproperty_to_item.find(property);
+    if (it != m_qtproperty_to_item.end()) {
+        SessionItem *item = it.value();
+        m_item_to_qtvariantproperty.remove(item);
+        m_item_to_qtparent.remove(item);
+        m_item_to_insert_mode.remove(item);
+        m_qtproperty_to_item.erase(it);
+    }
+}
+
+//! update visual apperance of qtVariantProperty using SessionItem's attribute
+void ComponentEditorPrivate::updatePropertyAppearance(QtVariantProperty *property,
+                                                      const PropertyAttribute &attribute)
+{
+    Q_ASSERT(property);
+
+    QString toolTip = attribute.getToolTip();
+    if (!toolTip.isEmpty())
+        property->setToolTip(toolTip);
+
+    if (attribute.isDisabled()) {
+        property->setEnabled(false);
+    } else {
+        property->setEnabled(true);
+    }
+
+    QVariant prop_value = property->value();
+    if (!prop_value.isValid())
+        return;
+    int type = GUIHelpers::getVariantType(prop_value);
+
+    if (type == QVariant::Double) {
+        RealLimits limits = attribute.getLimits();
+        if (limits.hasLowerLimit())
+            property->setAttribute(QStringLiteral("minimum"), limits.getLowerLimit());
+        if (limits.hasUpperLimit())
+            property->setAttribute(QStringLiteral("maximum"), limits.getUpperLimit());
+        property->setAttribute(QStringLiteral("decimals"), attribute.getDecimals());
+        property->setAttribute(QStringLiteral("singleStep"),
+                               1. / std::pow(10., attribute.getDecimals() - 1));
+    } else if (type == QVariant::Int) {
+        RealLimits limits = attribute.getLimits();
+        if (limits.hasLowerLimit())
+            property->setAttribute(QStringLiteral("minimum"), int(limits.getLowerLimit()));
+        if (limits.hasUpperLimit())
+            property->setAttribute(QStringLiteral("maximum"), int(limits.getUpperLimit()));
+    }
+}
+
+//! removes properties of all child items
+void ComponentEditorPrivate::cleanChildren(SessionItem *item)
+{
+    foreach(SessionItem *child, item->childItems()) {
+        if (QtVariantProperty *property = getPropertyForItem(child)) {
+            removeQtVariantProperty(property);
+        }
+        cleanChildren(child);
+    }
+}
+
+//! installs WheelEventEater on all comboxes
+// hack to change behaviour of ComboBoxes and SpinBoxes produced by QtGroupBoxPropertyBrowser
+// with the goal to react on mouse wheel event only when there is keyboard focus
+void ComponentEditorPrivate::install_custom_filters()
+{
+    if(m_presentationType & ComponentEditorFlags::BROWSER_GROUPBOX) {
+        QList<QAbstractSpinBox*> spinboxes = m_browser->findChildren<QAbstractSpinBox *>();
+        QList<QComboBox*> comboboxes = m_browser->findChildren<QComboBox *>();
+        foreach(QAbstractSpinBox *w, spinboxes) {
+            w->removeEventFilter(m_wheel_event_filter.get());
+            w->installEventFilter(m_wheel_event_filter.get());
+            w->setFocusPolicy(Qt::StrongFocus);
+        }
+        foreach(QComboBox *w, comboboxes) {
+            w->removeEventFilter(m_wheel_event_filter.get());
+            w->installEventFilter(m_wheel_event_filter.get());
+        }
+    }
+}
diff --git a/GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.h b/GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.h
new file mode 100644
index 0000000..80f1777
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.h
@@ -0,0 +1,83 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/ComponentEditorPrivate.h
+//! @brief     Defines class ComponentEditorPrivate
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPONENTEDITORPRIVATE_H
+#define COMPONENTEDITORPRIVATE_H
+
+#include "ComponentEditorFlags.h"
+#include "PropertyAttribute.h"
+#include "PropertyVariantFactory.h"
+#include "PropertyVariantManager.h"
+#include "SessionItem.h"
+#include "WinDllMacros.h"
+#include "qtbuttonpropertybrowser.h"
+#include "qtgroupboxpropertybrowser.h"
+#include "qttreepropertybrowser.h"
+#include <QMap>
+#include <memory>
+
+class WheelEventEater;
+
+//! Holds logic for ComponentEditor
+
+class BA_CORE_API_ ComponentEditorPrivate
+{
+public:
+    ComponentEditorPrivate(ComponentEditorFlags::PresentationType flags
+                           = ComponentEditorFlags::BROWSER_TABLE,
+                           QWidget *parent = 0);
+
+
+    ~ComponentEditorPrivate();
+
+    void clear();
+    void init_browser();
+
+    QtVariantProperty *
+    processPropertyForItem(SessionItem *item,
+                           QtVariantProperty *parentProperty);
+    QtVariantProperty *getPropertyForItem(SessionItem *item);
+    SessionItem *getItemForProperty(QtProperty *property);
+    QtVariantProperty *createQtVariantProperty(SessionItem *item);
+
+    QtVariantProperty *processPropertyGroupForName(const QString &name);
+    QtVariantProperty *getPropertyForGroupName(const QString &name);
+
+    void removeQtVariantProperty(QtVariantProperty *property);
+    void updatePropertyAppearance(QtVariantProperty *property,
+                                  const PropertyAttribute &attribute);
+    void cleanChildren(SessionItem *item);
+
+    void install_custom_filters();
+
+    QtAbstractPropertyBrowser *m_browser;
+    QtVariantPropertyManager *m_manager;
+    QtVariantPropertyManager *m_read_only_manager;
+    PropertyVariantFactory *m_propertyFactory;
+
+    QMap<QtProperty *, SessionItem *> m_qtproperty_to_item;
+    QMap<SessionItem *, QtVariantProperty *> m_item_to_qtvariantproperty;
+    QMap<QString, QtVariantProperty *> m_groupname_to_qtvariant;
+    QMap<SessionItem *, QtVariantProperty *> m_item_to_qtparent;
+    QMap<SessionItem *, ComponentEditorFlags::InsertMode> m_item_to_insert_mode;
+
+    ComponentEditorFlags::PresentationType m_presentationType;
+    QList<SessionItem *> m_changedItems;
+    std::unique_ptr<WheelEventEater> m_wheel_event_filter;
+    SessionItem *m_topItem;
+};
+
+#endif // COMPONENTEDITORPRIVATE_H
diff --git a/GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.cpp b/GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.cpp
new file mode 100644
index 0000000..deba857
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.cpp
@@ -0,0 +1,370 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.cpp
+//! @brief     Implements class PropertyBrowserUtils
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PropertyBrowserUtils.h"
+#include "GUIHelpers.h"
+#include "MaterialSvc.h"
+#include <QColorDialog>
+#include <QComboBox>
+#include <QDebug>
+#include <QDoubleValidator>
+#include <QFileDialog>
+#include <QFocusEvent>
+#include <QHBoxLayout>
+#include <QIcon>
+#include <QLabel>
+#include <QLineEdit>
+#include <QPixmap>
+#include <QRgb>
+#include <QToolButton>
+
+// -----------------------------------------------------------------------------
+// MaterialPropertyEdit
+// -----------------------------------------------------------------------------
+
+MaterialPropertyEdit::MaterialPropertyEdit(QWidget *parent)
+    : QWidget(parent)
+{
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->setMargin(2);
+    layout->setSpacing(0);
+
+    m_textLabel = new QLabel(this);
+    m_textLabel->setText(m_materialProperty.getName());
+
+    m_pixmapLabel = new QLabel(this);
+    m_pixmapLabel->setPixmap(m_materialProperty.getPixmap());
+
+    QToolButton *button = new QToolButton(this);
+    button->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
+                                      QSizePolicy::Preferred));
+    button->setText(QLatin1String("..."));
+    layout->addWidget(m_pixmapLabel, Qt::AlignLeft);
+    layout->addWidget(m_textLabel, Qt::AlignLeft);
+    layout->addStretch(1);
+    layout->addWidget(button);
+    setFocusPolicy(Qt::StrongFocus);
+    setAttribute(Qt::WA_InputMethodEnabled);
+    connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
+}
+
+
+void MaterialPropertyEdit::buttonClicked()
+{
+    MaterialProperty mat = MaterialSvc::selectMaterialProperty(m_materialProperty);
+    if(mat.isDefined() ) {
+        setMaterialProperty(mat);
+        emit materialPropertyChanged(m_materialProperty);
+    }
+}
+
+
+void MaterialPropertyEdit::setMaterialProperty(
+        const MaterialProperty &materialProperty)
+{
+    m_materialProperty = materialProperty;
+    m_textLabel->setText(m_materialProperty.getName());
+    m_pixmapLabel->setPixmap(m_materialProperty.getPixmap());
+}
+
+
+// -----------------------------------------------------------------------------
+// GroupPropertyEdit
+// -----------------------------------------------------------------------------
+GroupPropertyEdit::GroupPropertyEdit(QWidget *parent)
+    : QWidget(parent)
+    , m_box(new QComboBox())
+    , m_label(new QLabel())
+    , m_groupProperty(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(m_box);
+    layout->addWidget(m_label);
+    m_label->hide();
+
+    connect(m_box, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(indexChanged(int)));
+
+    setLayout(layout);
+}
+
+GroupPropertyEdit::~GroupPropertyEdit()
+{
+    qDebug() << "GroupPropertyEdit::~GroupPropertyEdit() -> destroyed" << this;
+}
+
+void GroupPropertyEdit::setGroupProperty(
+        GroupProperty_t groupProperty)
+{
+    if(groupProperty) {
+        m_groupProperty = groupProperty;
+        processGroup();
+    }
+}
+
+void GroupPropertyEdit::processGroup()
+{
+    qDebug() << "GroupPropertyEdit::processGroup()";
+    disconnect(m_box, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(indexChanged(int)));
+
+    if(m_box->count() != m_groupProperty->getLabels().size()) {
+        m_box->clear();
+        m_box->insertItems(0, m_groupProperty->getLabels());
+    }
+    m_box->setCurrentIndex(m_groupProperty->index());
+
+    connect(m_box, SIGNAL(currentIndexChanged(int)),
+            this, SLOT(indexChanged(int)), Qt::UniqueConnection);
+}
+
+void GroupPropertyEdit::indexChanged(int index)
+{
+    qDebug() << "GroupPropertyEdit::textChanged() -> " << index;
+    m_groupProperty->setCurrentType(m_groupProperty->toString(index));
+}
+
+QSize GroupPropertyEdit::sizeHint() const
+{
+    if(m_box)
+        return m_box->sizeHint();
+
+    if(m_label)
+        return m_label->sizeHint();
+
+    return QSize(100,10);
+}
+
+QSize GroupPropertyEdit::minimumSizeHint() const
+{
+    if(m_box)
+        return m_box->minimumSizeHint();
+
+    if(m_label)
+        return m_label->minimumSizeHint();
+
+    return QSize(100,10);
+}
+
+GroupProperty_t GroupPropertyEdit::group() const
+{
+    return m_groupProperty;
+}
+
+void GroupPropertyEdit::setGroup(GroupProperty_t group)
+{
+    setGroupProperty(group);
+}
+
+
+// -----------------------------------------------------------------------------
+// ColorPropertyEdit
+// -----------------------------------------------------------------------------
+
+ColorPropertyEdit::ColorPropertyEdit(QWidget *parent)
+    : QWidget(parent)
+{
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->setMargin(2);
+    layout->setSpacing(2);
+
+    m_textLabel = new QLabel(this);
+    m_textLabel->setText(colorValueText(m_colorProperty.getColor()));
+
+    m_pixmapLabel = new QLabel(this);
+    m_pixmapLabel->setPixmap(m_colorProperty.getPixmap());
+
+    QToolButton *button = new QToolButton(this);
+    button->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
+                                      QSizePolicy::Preferred));
+    button->setText(QLatin1String("..."));
+    layout->insertSpacing(-1,1);
+    layout->addWidget(m_pixmapLabel);
+    layout->insertSpacing(-1,6);
+    layout->addWidget(m_textLabel);
+    layout->addStretch(1);
+    layout->addWidget(button);
+
+    setFocusPolicy(Qt::StrongFocus);
+    setAttribute(Qt::WA_InputMethodEnabled);
+    connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
+}
+
+
+void ColorPropertyEdit::buttonClicked()
+{
+    bool ok = false;
+    QRgb oldRgba = m_colorProperty.getColor().rgba();
+    QRgb newRgba = QColorDialog::getRgba(oldRgba, &ok, this);
+    if (ok && newRgba != oldRgba) {
+        m_colorProperty.setColor(QColor::fromRgba(newRgba));
+        emit colorPropertyChanged(m_colorProperty);
+    }
+
+}
+
+void ColorPropertyEdit::setColorProperty(
+        const ColorProperty &colorProperty)
+{
+    m_colorProperty = colorProperty;
+    m_textLabel->setText(colorValueText(m_colorProperty.getColor()));
+    m_pixmapLabel->setPixmap(m_colorProperty.getPixmap());
+}
+
+QString ColorPropertyEdit::colorValueText(const QColor &c)
+{
+    return QString("[%1, %2, %3] (%4)")
+           .arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha());
+}
+
+
+// -----------------------------------------------------------------------------
+// ScientificDoublePropertyEdit
+// -----------------------------------------------------------------------------
+
+
+ScientificDoublePropertyEdit::ScientificDoublePropertyEdit(QWidget *parent)
+    : QWidget(parent)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->setMargin(0);
+    layout->setSpacing(0);
+
+    m_lineEdit = new QLineEdit(this);
+    layout->addWidget(m_lineEdit);
+
+    m_validator  = new QDoubleValidator(0.0, 1e+100, 1000, this);
+    m_validator->setNotation(QDoubleValidator::ScientificNotation);
+    m_lineEdit->setValidator(m_validator);
+
+    connect(m_lineEdit, SIGNAL(editingFinished()),
+            this, SLOT(onEditingFinished()));
+
+    setLayout(layout);
+}
+
+void ScientificDoublePropertyEdit::setScientificDoubleProperty(
+        const ScientificDoubleProperty &doubleProperty)
+{
+    m_lineEdit->setText(doubleProperty.getText());
+    m_scientificDoubleProperty = doubleProperty;
+}
+
+void ScientificDoublePropertyEdit::onEditingFinished()
+{
+    double new_value = m_lineEdit->text().toDouble();
+    if(new_value != m_scientificDoubleProperty.getValue()) {
+        ScientificDoubleProperty doubleProperty(new_value);
+        setScientificDoubleProperty(doubleProperty);
+        emit scientificDoublePropertyChanged(m_scientificDoubleProperty);
+    }
+}
+
+QSize ScientificDoublePropertyEdit::sizeHint() const
+{
+    return m_lineEdit->sizeHint();
+}
+
+QSize ScientificDoublePropertyEdit::minimumSizeHint() const
+{
+    return m_lineEdit->minimumSizeHint();
+}
+
+// -----------------------------------------------------------------------------
+// ComboPropertyEdit
+// -----------------------------------------------------------------------------
+
+//ComboPropertyEdit::ComboPropertyEdit(QWidget *parent)
+//    : QWidget(parent)
+//    , m_comboBox(0)
+//{
+//    m_comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+//}
+
+ComboPropertyEdit::ComboPropertyEdit(QWidget *parent)
+    : QComboBox(parent)
+{
+}
+
+//ComboPropertyEdit::~ComboPropertyEdit()
+//{
+//    qDebug() << "ComboPropertyEdit::~ComboPropertyEdit()" << this;
+//}
+
+void ComboPropertyEdit::setComboProperty(
+        const ComboProperty &combo_property)
+{
+    qDebug() << "ComboPropertyEdit::setComboProperty() this=" << this;
+    m_combo_property = combo_property;
+//    if (!m_comboBox) {
+//        m_comboBox = new QComboBox(this);
+//    }
+
+    disconnect(this, SIGNAL(currentIndexChanged(QString)),
+            this, SLOT(onCurrentIndexChanged(QString)));
+
+//    m_comboBox->clear();
+    if(count() !=m_combo_property.getValues().size()) {
+        clear();
+        QStringList value_list = m_combo_property.getValues();
+
+        addItems(value_list);
+
+        int index(0);
+        foreach(QString descr, m_combo_property.getToolTips())
+            setItemData(index++, descr, Qt::ToolTipRole);
+
+    }
+    setCurrentText(comboValueText());
+
+    connect(this, SIGNAL(currentIndexChanged(QString)),
+            this, SLOT(onCurrentIndexChanged(QString)));
+}
+
+QString ComboPropertyEdit::comboValueText()
+{
+    return m_combo_property.getValue();
+}
+
+//QSize ComboPropertyEdit::sizeHint() const
+//{
+//    Q_ASSERT(m_comboBox);
+//    return m_comboBox->sizeHint();
+
+//}
+
+//QSize ComboPropertyEdit::minimumSizeHint() const
+//{
+//    Q_ASSERT(m_comboBox);
+//    return m_comboBox->minimumSizeHint();
+//}
+
+void ComboPropertyEdit::onCurrentIndexChanged(QString current_value)
+{
+    qDebug() << "ComboPropertyEdit::onCurrentIndexChanged(QString current_value)" << current_value;
+    m_combo_property.setValue(current_value);
+    m_combo_property.setCachedValue(current_value);
+    qDebug() << "       ComboPropertyEdit::onCurrentIndexChanged(QString current_value) -> emitting combo property";
+    emit comboPropertyChanged(m_combo_property);
+}
+
+
diff --git a/GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.h b/GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.h
new file mode 100644
index 0000000..d5998b9
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.h
@@ -0,0 +1,167 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/PropertyBrowserUtils.h
+//! @brief     Defines class PropertyBrowserUtils
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROPERTYBROWSERUTILS_H
+#define PROPERTYBROWSERUTILS_H
+
+#include <QWidget>
+#include "MaterialProperty.h"
+#include "ColorProperty.h"
+#include "ScientificDoubleProperty.h"
+#include "GroupProperty.h"
+#include "ComboProperty.h"
+
+class QLabel;
+class QIcon;
+class QComboBox;
+class QLineEdit;
+class QDoubleValidator;
+
+//! The MaterialPropertyEdit class provides PropertyVariantFactory with editing
+//! widget for MaterialProperty.
+class BA_CORE_API_ MaterialPropertyEdit : public QWidget
+{
+    Q_OBJECT
+public:
+    MaterialPropertyEdit(QWidget *parent = 0);
+
+    void setMaterialProperty(const MaterialProperty &materialProperty);
+    MaterialProperty getMaterialProperty() const {return m_materialProperty; }
+signals:
+    void materialPropertyChanged(const MaterialProperty &material);
+private slots:
+    void buttonClicked();
+private:
+    QLabel *m_textLabel;
+    QLabel *m_pixmapLabel;
+    MaterialProperty m_materialProperty;
+};
+
+
+class BA_CORE_API_ GroupPropertyEdit : public QWidget
+{
+    Q_OBJECT
+
+    Q_PROPERTY(GroupProperty_t group READ group WRITE setGroup USER true)
+
+public:
+    GroupPropertyEdit(QWidget *parent = 0);
+    virtual ~GroupPropertyEdit();
+
+    void setGroupProperty(GroupProperty_t groupProperty);
+    GroupProperty_t getGroupProperty() const;
+
+    virtual QSize sizeHint() const;
+    virtual QSize minimumSizeHint() const;
+
+    GroupProperty_t group() const;
+    void setGroup(GroupProperty_t group);
+
+signals:
+    void groupPropertyChanged(const GroupProperty_t &group_property);
+
+private slots:
+    void indexChanged(int index);
+
+private:
+    void processGroup();
+    QComboBox *m_box;
+    QLabel *m_label;
+    GroupProperty_t m_groupProperty;
+};
+
+inline GroupProperty_t GroupPropertyEdit::getGroupProperty() const
+{
+    return m_groupProperty;
+}
+
+
+//! The ColorPropertyEdit class provides PropertyVariantFactory with editing
+//! widget for ColorProperty
+class BA_CORE_API_ ColorPropertyEdit : public QWidget
+{
+    Q_OBJECT
+public:
+    ColorPropertyEdit(QWidget *parent = 0);
+
+    void setColorProperty(const ColorProperty &colorProperty);
+    ColorProperty getColorProperty() const {return m_colorProperty; }
+
+    QString colorValueText(const QColor &c);
+
+signals:
+    void colorPropertyChanged(const ColorProperty &material_color);
+
+private slots:
+    void buttonClicked();
+private:
+    QLabel *m_textLabel;
+    QLabel *m_pixmapLabel;
+    ColorProperty m_colorProperty;
+};
+
+
+//! The ScientificDoublePropertyEdit class provides PropertyVariantFactory with editing
+//! widget for ScientificDoubleProperty
+class BA_CORE_API_ ScientificDoublePropertyEdit : public QWidget
+{
+    Q_OBJECT
+public:
+    ScientificDoublePropertyEdit(QWidget *parent = 0);
+
+    void setScientificDoubleProperty(const ScientificDoubleProperty &doubleProperty);
+    ScientificDoubleProperty getScientificDoubleProperty() const {
+        return m_scientificDoubleProperty;
+    }
+
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+signals:
+    void scientificDoublePropertyChanged(const ScientificDoubleProperty &doubleProperty);
+private slots:
+    void onEditingFinished();
+private:
+    QLineEdit *m_lineEdit;
+    QDoubleValidator *m_validator;
+    ScientificDoubleProperty m_scientificDoubleProperty;
+};
+
+#include <QComboBox>
+
+//! The ComboPropertyEdit class provides PropertyVariantFactory with editing
+//! widget for ComboProperty
+class BA_CORE_API_ ComboPropertyEdit : public QComboBox
+{
+    Q_OBJECT
+public:
+    ComboPropertyEdit(QWidget *parent = 0);
+
+    void setComboProperty(const ComboProperty &combo_property);
+    ComboProperty getComboProperty() const {return m_combo_property; }
+
+    QString comboValueText();
+
+signals:
+    void comboPropertyChanged(const ComboProperty &combo_property);
+private slots:
+    void onCurrentIndexChanged(QString current_value);
+
+private:
+    ComboProperty m_combo_property;
+};
+
+#endif // PROPERTYBROWSERUTILS_H
diff --git a/GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.cpp b/GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.cpp
new file mode 100644
index 0000000..c8ea574
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.cpp
@@ -0,0 +1,426 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.cpp
+//! @brief     Implements class PropertyVariantFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PropertyVariantFactory.h"
+#include "PropertyBrowserUtils.h"
+#include "PropertyVariantManager.h"
+#include <QDebug>
+
+
+PropertyVariantFactory::~PropertyVariantFactory()
+{
+//    qDebug() << "PropertyVariantFactory::~PropertyVariantFactory()";
+    QList<MaterialPropertyEdit *> mat_editors =
+            m_material_editor_to_property.keys();
+    QListIterator<MaterialPropertyEdit *> mat_it(mat_editors);
+    while (mat_it.hasNext())
+        delete mat_it.next();
+
+    QList<ColorPropertyEdit *> color_editors =
+            m_color_editor_to_property.keys();
+    QListIterator<ColorPropertyEdit *> color_it(color_editors);
+    while (color_it.hasNext())
+        delete color_it.next();
+
+    QList<ScientificDoublePropertyEdit *> scdouble_editors =
+            m_scdouble_editor_to_property.keys();
+    QListIterator<ScientificDoublePropertyEdit *> scdouble_it(scdouble_editors);
+    while (scdouble_it.hasNext())
+        delete scdouble_it.next();
+
+    QList<GroupPropertyEdit *> fancy_editors =
+            m_fancygroup_editor_to_property.keys();
+    QListIterator<GroupPropertyEdit *> fancy_it(fancy_editors);
+    while (fancy_it.hasNext())
+        delete fancy_it.next();
+
+    QList<ComboPropertyEdit *> combo_editors =
+            m_combo_editor_to_property.keys();
+    QListIterator<ComboPropertyEdit *> combo_it(combo_editors);
+    while (combo_it.hasNext())
+        delete combo_it.next();
+}
+
+void PropertyVariantFactory::connectPropertyManager(
+        QtVariantPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty *, const QVariant &)),
+                this, SLOT(slotPropertyChanged(QtProperty *,
+                                               const QVariant &)));
+    connect(manager, SIGNAL(attributeChanged(QtProperty *, const QString &,
+                                             const QVariant &)),
+                this, SLOT(slotPropertyAttributeChanged(QtProperty *,
+                                    const QString &, const QVariant &)));
+    QtVariantEditorFactory::connectPropertyManager(manager);
+}
+
+
+QWidget *PropertyVariantFactory::createEditor(QtVariantPropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+//    qDebug() << "PropertyVariantFactory::createEditor()" << property->propertyName();
+    if (manager->propertyType(property) ==
+            PropertyVariantManager::materialTypeId()) {
+        MaterialPropertyEdit *editor = new MaterialPropertyEdit(parent);
+        QVariant var = manager->value(property);
+        MaterialProperty mat = var.value<MaterialProperty>();
+        editor->setMaterialProperty(mat);
+
+        m_property_to_material_editors[property].append(editor);
+        m_material_editor_to_property[editor] = property;
+
+        connect(editor, SIGNAL(materialPropertyChanged(const MaterialProperty &)),
+                this, SLOT(slotSetValue(const MaterialProperty &)));
+        connect(editor, SIGNAL(destroyed(QObject *)),
+                this, SLOT(slotEditorDestroyed(QObject *)));
+        return editor;
+    }
+
+    if (manager->propertyType(property) ==
+            PropertyVariantManager::colorPropertyTypeId()) {
+        ColorPropertyEdit *editor = new ColorPropertyEdit(parent);
+        QVariant var = manager->value(property);
+        ColorProperty mat = var.value<ColorProperty>();
+        editor->setColorProperty(mat);
+
+        m_property_to_color_editors[property].append(editor);
+        m_color_editor_to_property[editor] = property;
+
+        connect(editor, SIGNAL(colorPropertyChanged(const ColorProperty &)),
+                this, SLOT(slotSetValue(const ColorProperty &)));
+        connect(editor, SIGNAL(destroyed(QObject *)),
+                this, SLOT(slotEditorDestroyed(QObject *)));
+        return editor;
+    }
+
+    if (manager->propertyType(property) ==
+            PropertyVariantManager::scientificDoubleTypeId()) {
+        ScientificDoublePropertyEdit *editor = new ScientificDoublePropertyEdit(parent);
+        QVariant var = manager->value(property);
+        ScientificDoubleProperty sc = var.value<ScientificDoubleProperty>();
+        editor->setScientificDoubleProperty(sc);
+
+        m_property_to_scdouble_editors[property].append(editor);
+        m_scdouble_editor_to_property[editor] = property;
+
+        connect(editor,
+                SIGNAL(scientificDoublePropertyChanged(const ScientificDoubleProperty &)),
+                this, SLOT(slotSetValue(const ScientificDoubleProperty &)));
+        connect(editor, SIGNAL(destroyed(QObject *)),
+                this, SLOT(slotEditorDestroyed(QObject *)));
+        return editor;
+    }
+
+    if (manager->propertyType(property) ==
+            PropertyVariantManager::fancyGroupTypeId()) {
+        GroupPropertyEdit *editor = new GroupPropertyEdit(parent);
+        QVariant var = manager->value(property);
+        GroupProperty_t ff = var.value<GroupProperty_t>();
+        editor->setGroupProperty(ff);
+
+        m_property_to_fancygroup_editors[property].append(editor);
+        m_fancygroup_editor_to_property[editor] = property;
+
+        connect(editor,
+                SIGNAL(groupPropertyChanged(GroupProperty_t)),
+                this, SLOT(slotSetValue(GroupProperty_t)));
+
+        connect(editor, SIGNAL(destroyed(QObject *)),
+                this, SLOT(slotEditorDestroyed(QObject *)));
+        return editor;
+    }
+
+    if (manager->propertyType(property) ==
+            PropertyVariantManager::comboPropertyTypeId()) {
+        ComboPropertyEdit *editor = new ComboPropertyEdit(parent);
+//        qDebug() << "       PropertyVariantFactory::createEditor() -> created ComboEditor" << editor;
+
+        QVariant var = manager->value(property);
+        ComboProperty combo = var.value<ComboProperty>();
+        editor->setComboProperty(combo);
+
+        m_property_to_combo_editors[property].append(editor);
+        m_combo_editor_to_property[editor] = property;
+
+        connect(editor, SIGNAL(comboPropertyChanged(const ComboProperty &)),
+                this, SLOT(slotSetValue(const ComboProperty &)));
+        connect(editor, SIGNAL(destroyed(QObject *)),
+                this, SLOT(slotEditorDestroyed(QObject *)));
+        return editor;
+    }
+
+    return QtVariantEditorFactory::createEditor(manager, property, parent);
+}
+
+
+void PropertyVariantFactory::disconnectPropertyManager(
+        QtVariantPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QVariant &)),
+               this, SLOT(slotPropertyChanged(QtProperty *, const QVariant &)));
+    disconnect(manager, SIGNAL(attributeChanged(QtProperty *, const QString &,
+                                     const QVariant &)),
+                this, SLOT(slotPropertyAttributeChanged(QtProperty *,
+                                     const QString &, const QVariant &)));
+    QtVariantEditorFactory::disconnectPropertyManager(manager);
+}
+
+
+void PropertyVariantFactory::slotPropertyChanged(QtProperty *property,
+                const QVariant &value)
+{
+//    qDebug() << "PropertyVariantFactory::slotPropertyChanged()" << property->propertyName() << value;
+    if (m_property_to_material_editors.contains(property)) {
+        QList<MaterialPropertyEdit *> editors =
+                m_property_to_material_editors[property];
+        QListIterator<MaterialPropertyEdit *> itEditor(editors);
+        while (itEditor.hasNext()) {
+            MaterialProperty mat = value.value<MaterialProperty>();
+            itEditor.next()->setMaterialProperty(mat);
+        }
+    }
+    else if (m_property_to_color_editors.contains(property)) {
+        QList<ColorPropertyEdit *> editors =
+                m_property_to_color_editors[property];
+        QListIterator<ColorPropertyEdit *> itEditor(editors);
+        while (itEditor.hasNext()) {
+            ColorProperty mat = value.value<ColorProperty>();
+            itEditor.next()->setColorProperty(mat);
+        }
+    }
+    else if (m_property_to_scdouble_editors.contains(property)) {
+        QList<ScientificDoublePropertyEdit *> editors =
+                m_property_to_scdouble_editors[property];
+        QListIterator<ScientificDoublePropertyEdit *> itEditor(editors);
+        while (itEditor.hasNext()) {
+            ScientificDoubleProperty mat = value.value<ScientificDoubleProperty>();
+            itEditor.next()->setScientificDoubleProperty(mat);
+        }
+    }
+    else if (m_property_to_fancygroup_editors.contains(property)) {
+        QList<GroupPropertyEdit *> editors =
+                m_property_to_fancygroup_editors[property];
+        QListIterator<GroupPropertyEdit *> itEditor(editors);
+        while (itEditor.hasNext()) {
+            GroupProperty_t mat = value.value<GroupProperty_t>();
+//            qDebug() << "       PropertyVariantFactory::slotPropertyChanged() -> Setting editor";
+            itEditor.next()->setGroupProperty(mat);
+        }
+    }
+    else if (m_property_to_combo_editors.contains(property)) {
+        QList<ComboPropertyEdit *> editors =
+                m_property_to_combo_editors[property];
+        QListIterator<ComboPropertyEdit *> itEditor(editors);
+        while (itEditor.hasNext()) {
+//            qDebug() << "       PropertyVariantFactory::slotPropertyChanged() -> Setting editor";
+            ComboProperty combo = value.value<ComboProperty>();
+            itEditor.next()->setComboProperty(combo);
+        }
+    }
+}
+
+
+void PropertyVariantFactory::slotSetValue(const MaterialProperty &value)
+{
+//    qDebug() << "PropertyVariantFactory::slotSetValue(const MaterialProperty &value)";
+    QObject *object = sender();
+    QMap<MaterialPropertyEdit *, QtProperty *>::ConstIterator itEditor =
+                m_material_editor_to_property.constBegin();
+    while (itEditor != m_material_editor_to_property.constEnd()) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtVariantPropertyManager *manager = propertyManager(property);
+            if (!manager) return;
+            QVariant var;
+            var.setValue(value);
+            manager->setValue(property, var);
+            // FIXME g.p. Is it the right place to delete?
+            //object->deleteLater();
+            return;
+        }
+        itEditor++;
+    }
+}
+
+void PropertyVariantFactory::slotSetValue(const ColorProperty &value)
+{
+    QObject *object = sender();
+    QMap<ColorPropertyEdit *, QtProperty *>::ConstIterator itEditor =
+                m_color_editor_to_property.constBegin();
+    while (itEditor != m_color_editor_to_property.constEnd()) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtVariantPropertyManager *manager = propertyManager(property);
+            if (!manager) return;
+            QVariant var;
+            var.setValue(value);
+            manager->setValue(property, var);
+            // FIXME g.p. Is it the right place to delete?
+            //object->deleteLater();
+            return;
+        }
+        itEditor++;
+    }
+}
+
+void PropertyVariantFactory::slotSetValue(const ScientificDoubleProperty &value)
+{
+    QObject *object = sender();
+    QMap<ScientificDoublePropertyEdit *, QtProperty *>::ConstIterator itEditor =
+                m_scdouble_editor_to_property.constBegin();
+    while (itEditor != m_scdouble_editor_to_property.constEnd()) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtVariantPropertyManager *manager = propertyManager(property);
+            if (!manager) return;
+            QVariant var;
+            var.setValue(value);
+            manager->setValue(property, var);
+            return;
+        }
+        itEditor++;
+    }
+}
+
+void PropertyVariantFactory::slotSetValue(const GroupProperty_t &value)
+{
+//    qDebug() << "PropertyVariantFactory::slotSetValue(const GroupProperty_t &value)";
+    QObject *object = sender();
+    QMap<GroupPropertyEdit *, QtProperty *>::ConstIterator itEditor =
+                m_fancygroup_editor_to_property.constBegin();
+    while (itEditor != m_fancygroup_editor_to_property.constEnd()) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtVariantPropertyManager *manager = propertyManager(property);
+            if (!manager) return;
+            QVariant var;
+            var.setValue(value);
+            manager->setValue(property, var);
+            return;
+        }
+        itEditor++;
+    }
+}
+
+void PropertyVariantFactory::slotSetValue(const ComboProperty &value)
+{
+//    qDebug() << "PropertyVariantFactory::slotSetValue(const ComboProperty &value)";
+    QObject *object = sender();
+    QMap<ComboPropertyEdit *, QtProperty *>::ConstIterator itEditor =
+                m_combo_editor_to_property.constBegin();
+    while (itEditor != m_combo_editor_to_property.constEnd()) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtVariantPropertyManager *manager = propertyManager(property);
+            if (!manager) return;
+            QVariant var;
+            var.setValue(value);
+            manager->setValue(property, var);
+            // FIXME g.p. Is it the right place to delete?
+            //object->deleteLater();
+            return;
+        }
+        itEditor++;
+    }
+}
+
+void PropertyVariantFactory::slotEditorDestroyed(QObject *object)
+{
+//    qDebug() << "PropertyVariantFactory::slotEditorDestroyed(QObject *object)";
+    QMap<MaterialPropertyEdit *, QtProperty *>::ConstIterator mat_it_editor =
+                m_material_editor_to_property.constBegin();
+    while (mat_it_editor != m_material_editor_to_property.constEnd()) {
+        if (mat_it_editor.key() == object) {
+            MaterialPropertyEdit *editor = mat_it_editor.key();
+            QtProperty *property = mat_it_editor.value();
+            m_material_editor_to_property.remove(editor);
+            m_property_to_material_editors[property].removeAll(editor);
+            if (m_property_to_material_editors[property].isEmpty())
+                m_property_to_material_editors.remove(property);
+            return;
+        }
+        mat_it_editor++;
+    }
+
+    QMap<ColorPropertyEdit *, QtProperty *>::ConstIterator color_it_editor =
+                m_color_editor_to_property.constBegin();
+    while (color_it_editor != m_color_editor_to_property.constEnd()) {
+        if (color_it_editor.key() == object) {
+            ColorPropertyEdit *editor = color_it_editor.key();
+            QtProperty *property = color_it_editor.value();
+            m_color_editor_to_property.remove(editor);
+            m_property_to_color_editors[property].removeAll(editor);
+            if (m_property_to_color_editors[property].isEmpty())
+                m_property_to_color_editors.remove(property);
+            return;
+        }
+        color_it_editor++;
+    }
+
+    QMap<ScientificDoublePropertyEdit *, QtProperty *>::ConstIterator scdouble_it_editor =
+                m_scdouble_editor_to_property.constBegin();
+    while (scdouble_it_editor != m_scdouble_editor_to_property.constEnd()) {
+        if (scdouble_it_editor.key() == object) {
+            ScientificDoublePropertyEdit *editor = scdouble_it_editor.key();
+            QtProperty *property = scdouble_it_editor.value();
+            m_scdouble_editor_to_property.remove(editor);
+            m_property_to_scdouble_editors[property].removeAll(editor);
+            if (m_property_to_scdouble_editors[property].isEmpty())
+                m_property_to_scdouble_editors.remove(property);
+            return;
+        }
+        scdouble_it_editor++;
+    }
+
+    QMap<GroupPropertyEdit *, QtProperty *>::ConstIterator fancygroup_editor_it =
+                m_fancygroup_editor_to_property.constBegin();
+    while (fancygroup_editor_it != m_fancygroup_editor_to_property.constEnd()) {
+        if (fancygroup_editor_it.key() == object) {
+            qDebug() << "PropertyVariantFactory::slotEditorDestroyed(QObject *object) -> fancy group editor";
+
+            GroupPropertyEdit *editor = fancygroup_editor_it.key();
+            QtProperty *property = fancygroup_editor_it.value();
+            m_fancygroup_editor_to_property.remove(editor);
+            m_property_to_fancygroup_editors[property].removeAll(editor);
+            if (m_property_to_fancygroup_editors[property].isEmpty())
+                m_property_to_fancygroup_editors.remove(property);
+            return;
+        }
+        fancygroup_editor_it++;
+    }
+
+    QMap<ComboPropertyEdit *, QtProperty *>::ConstIterator combo_it_editor =
+                m_combo_editor_to_property.constBegin();
+    while (combo_it_editor != m_combo_editor_to_property.constEnd()) {
+        if (combo_it_editor.key() == object) {
+            ComboPropertyEdit *editor = combo_it_editor.key();
+            QtProperty *property = combo_it_editor.value();
+            m_combo_editor_to_property.remove(editor);
+            m_property_to_combo_editors[property].removeAll(editor);
+            if (m_property_to_combo_editors[property].isEmpty())
+                m_property_to_combo_editors.remove(property);
+            return;
+        }
+        combo_it_editor++;
+    }
+}
+
+void PropertyVariantFactory::slotPropertyAttributeChanged(QtProperty *, const QString &, const QVariant &)
+{
+//    qDebug() << "PropertyVariantFactory::slotPropertyAttributeChanged(QtProperty *, const QString &, const QVariant &) -> ???";
+
+}
+
diff --git a/GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.h b/GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.h
new file mode 100644
index 0000000..8ba25f7
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.h
@@ -0,0 +1,90 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/PropertyVariantFactory.h
+//! @brief     Defines class PropertyVariantFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROPERTYVARIANTFACTORY_H
+#define PROPERTYVARIANTFACTORY_H
+
+//! collection of classes extending QtPropertyBrowser functionality
+
+#include "GroupProperty.h"
+#include <QtVariantEditorFactory>
+
+class MaterialPropertyEdit;
+class MaterialProperty;
+class ColorPropertyEdit;
+class ColorProperty;
+class ScientificDoublePropertyEdit;
+class ScientificDoubleProperty;
+class GroupPropertyEdit;
+class ComboPropertyEdit;
+class ComboProperty;
+
+//! The PropertyVariantFactory class provides and manages user defined
+//! QVariant based properties.
+class BA_CORE_API_ PropertyVariantFactory : public QtVariantEditorFactory
+{
+    Q_OBJECT
+public:
+    PropertyVariantFactory(QObject *parent = 0)
+        : QtVariantEditorFactory(parent)
+            { }
+
+    virtual ~PropertyVariantFactory();
+protected:
+    virtual void connectPropertyManager(QtVariantPropertyManager *manager);
+    using QtVariantEditorFactory::createEditor;
+    virtual QWidget *createEditor(QtVariantPropertyManager *manager,
+                                  QtProperty *property, QWidget *parent);
+    virtual void disconnectPropertyManager(QtVariantPropertyManager *manager);
+private slots:
+    void slotPropertyChanged(QtProperty *property, const QVariant &value);
+    void slotSetValue(const MaterialProperty &value);
+    void slotSetValue(const ColorProperty &value);
+    void slotSetValue(const ScientificDoubleProperty &value);
+    void slotSetValue(const GroupProperty_t &value);
+    void slotSetValue(const ComboProperty &value);
+    void slotEditorDestroyed(QObject *object);
+    void slotPropertyAttributeChanged(QtProperty *, const QString &, const QVariant &);
+
+private:
+    QMap<QtProperty *, QList<MaterialPropertyEdit *> >
+        m_property_to_material_editors;
+    QMap<MaterialPropertyEdit *, QtProperty *>
+        m_material_editor_to_property;
+
+    QMap<QtProperty *, QList<ColorPropertyEdit *> >
+        m_property_to_color_editors;
+    QMap<ColorPropertyEdit *, QtProperty *>
+        m_color_editor_to_property;
+
+    QMap<QtProperty *, QList<ScientificDoublePropertyEdit *> >
+        m_property_to_scdouble_editors;
+    QMap<ScientificDoublePropertyEdit *, QtProperty *>
+        m_scdouble_editor_to_property;
+
+    QMap<QtProperty *, QList<GroupPropertyEdit *> >
+        m_property_to_fancygroup_editors;
+    QMap<GroupPropertyEdit *, QtProperty *>
+        m_fancygroup_editor_to_property;
+
+    QMap<QtProperty *, QList<ComboPropertyEdit *> >
+        m_property_to_combo_editors;
+    QMap<ComboPropertyEdit *, QtProperty *>
+        m_combo_editor_to_property;
+
+};
+
+#endif // PROPERTYVARIANTFACTORY_H
diff --git a/GUI/coregui/Views/PropertyEditor/PropertyVariantManager.cpp b/GUI/coregui/Views/PropertyEditor/PropertyVariantManager.cpp
new file mode 100644
index 0000000..2a55105
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/PropertyVariantManager.cpp
@@ -0,0 +1,251 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/PropertyVariantManager.cpp
+//! @brief     Implements class PropertyVariantManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PropertyVariantManager.h"
+#include "DesignerHelper.h"
+#include "SessionItem.h"
+#include <QDebug>
+
+PropertyVariantManager::PropertyVariantManager(QObject *parent)
+    : QtVariantPropertyManager(parent)
+{
+
+}
+
+
+int PropertyVariantManager::materialTypeId()
+{
+    int result = qMetaTypeId<MaterialProperty>();
+    return result;
+}
+
+int PropertyVariantManager::colorPropertyTypeId()
+{
+    int result = qMetaTypeId<ColorProperty>();
+    return result;
+}
+
+int PropertyVariantManager::scientificDoubleTypeId()
+{
+    int result = qMetaTypeId<ScientificDoubleProperty>();
+    return result;
+}
+
+int PropertyVariantManager::fancyGroupTypeId()
+{
+    int result = qMetaTypeId<GroupProperty_t>();
+    return result;
+}
+
+int PropertyVariantManager::comboPropertyTypeId()
+{
+    int result = qMetaTypeId<ComboProperty>();
+    return result;
+}
+
+bool PropertyVariantManager::isPropertyTypeSupported(int propertyType) const
+{
+    if (propertyType == materialTypeId())
+        return true;
+    if (propertyType == colorPropertyTypeId())
+        return true;
+    if (propertyType == scientificDoubleTypeId())
+        return true;
+    if (propertyType == fancyGroupTypeId())
+        return true;
+    if (propertyType == comboPropertyTypeId())
+        return true;
+    return QtVariantPropertyManager::isPropertyTypeSupported(propertyType);
+}
+
+
+int PropertyVariantManager::valueType(int propertyType) const
+{
+    if (propertyType == materialTypeId())
+        return materialTypeId();
+    if (propertyType == colorPropertyTypeId())
+        return colorPropertyTypeId();
+    if (propertyType == scientificDoubleTypeId())
+        return scientificDoubleTypeId();
+    if (propertyType == fancyGroupTypeId())
+        return fancyGroupTypeId();
+    if (propertyType == comboPropertyTypeId())
+        return comboPropertyTypeId();
+    return QtVariantPropertyManager::valueType(propertyType);
+}
+
+
+QVariant PropertyVariantManager::value(const QtProperty *property) const
+{
+    if (m_theMaterialValues.contains(property)) {
+        QVariant v;
+        v.setValue(m_theMaterialValues[property]);
+        return v;
+    }
+    if(m_theColorValues.contains(property)) {
+        QVariant v;
+        v.setValue(m_theColorValues[property]);
+        return v;
+    }
+    if(m_theScientificDoubleValues.contains(property)) {
+        QVariant v;
+        v.setValue(m_theScientificDoubleValues[property]);
+        return v;
+    }
+    if(m_theFancyGroupValues.contains(property)) {
+        QVariant v;
+        v.setValue(m_theFancyGroupValues[property]);
+        return v;
+    }
+    if(m_theComboValues.contains(property)) {
+        QVariant v;
+        v.setValue(m_theComboValues[property]);
+        return v;
+    }
+
+    return QtVariantPropertyManager::value(property);
+}
+
+
+QString PropertyVariantManager::valueText(const QtProperty *property) const
+{
+    if (m_theMaterialValues.contains(property)) {
+        return m_theMaterialValues[property].getName();
+    }
+    if (m_theColorValues.contains(property)) {
+        return m_theColorValues[property].getText();
+    }
+    if (m_theScientificDoubleValues.contains(property)) {
+        return m_theScientificDoubleValues[property].getText();
+    }
+    if (m_theFancyGroupValues.contains(property)) {
+        return m_theFancyGroupValues[property]->getCurrentLabel();
+    }
+    if (m_theComboValues.contains(property)) {
+        return m_theComboValues[property].getValue();
+    }
+    return QtVariantPropertyManager::valueText(property);
+}
+
+
+QIcon PropertyVariantManager::valueIcon(const QtProperty *property) const
+{
+    if (m_theMaterialValues.contains(property)) {
+        return QIcon(m_theMaterialValues[property].getPixmap());
+    }
+    if (m_theColorValues.contains(property)) {
+        return QIcon(m_theColorValues[property].getPixmap());
+    }
+    return QtVariantPropertyManager::valueIcon(property);
+}
+
+
+void PropertyVariantManager::setValue(QtProperty *property, const QVariant &val)
+{
+//    qDebug() << "PropertyVariantManager::setValue(QtProperty *property, const QVariant &val)";
+    if (m_theMaterialValues.contains(property)) {
+        if( val.userType() != materialTypeId() ) return;
+        MaterialProperty mat = val.value<MaterialProperty>();
+        m_theMaterialValues[property] = mat;
+        QVariant v2;
+        v2.setValue(mat);
+        emit propertyChanged(property);
+        emit valueChanged(property, v2);
+        return;
+    }
+    if (m_theColorValues.contains(property)) {
+        if( val.userType() != colorPropertyTypeId() ) return;
+        ColorProperty mat = val.value<ColorProperty>();
+        m_theColorValues[property] = mat;
+        QVariant v2;
+        v2.setValue(mat);
+        emit propertyChanged(property);
+        emit valueChanged(property, v2);
+        return;
+    }
+    if (m_theScientificDoubleValues.contains(property)) {
+        if( val.userType() != scientificDoubleTypeId() ) return;
+        ScientificDoubleProperty double_prop = val.value<ScientificDoubleProperty>();
+        m_theScientificDoubleValues[property] = double_prop;
+        QVariant v2;
+        v2.setValue(double_prop);
+        emit propertyChanged(property);
+        emit valueChanged(property, v2);
+        return;
+    }
+    if (m_theFancyGroupValues.contains(property)) {
+        if( val.userType() != fancyGroupTypeId() ) return;
+        GroupProperty_t group_prop = val.value<GroupProperty_t>();
+        m_theFancyGroupValues[property] = group_prop;
+        QVariant v2;
+        v2.setValue(group_prop);
+        emit propertyChanged(property);
+        emit valueChanged(property, v2);
+        return;
+    }
+    if (m_theComboValues.contains(property)) {
+        if( val.userType() != comboPropertyTypeId() ) return;
+        ComboProperty comboprop = val.value<ComboProperty>();
+        m_theComboValues[property] = comboprop;
+        QVariant v2;
+        v2.setValue(comboprop);
+        emit propertyChanged(property);
+        emit valueChanged(property, v2);
+        return;
+    }
+
+    QtVariantPropertyManager::setValue(property, val);
+}
+
+
+void PropertyVariantManager::initializeProperty(QtProperty *property)
+{
+//    qDebug() << "PropertyVariantManager::initializeProperty(QtProperty *property)";
+    if (propertyType(property) == materialTypeId()) {
+        MaterialProperty m;
+        m_theMaterialValues[property] = m;
+    }
+    if (propertyType(property) == colorPropertyTypeId()) {
+        ColorProperty m;
+        m_theColorValues[property] = m;
+    }
+    if (propertyType(property) == scientificDoubleTypeId()) {
+        ScientificDoubleProperty m;
+        m_theScientificDoubleValues[property] = m;
+    }
+    if (propertyType(property) == fancyGroupTypeId()) {
+        GroupProperty_t m;
+        m_theFancyGroupValues[property] = m;
+    }
+    if (propertyType(property) == comboPropertyTypeId()) {
+        ComboProperty m;
+        m_theComboValues[property] = m;
+    }
+
+    QtVariantPropertyManager::initializeProperty(property);
+}
+
+
+void PropertyVariantManager::uninitializeProperty(QtProperty *property)
+{
+    m_theMaterialValues.remove(property);
+    m_theColorValues.remove(property);
+    m_theScientificDoubleValues.remove(property);
+    m_theFancyGroupValues.remove(property);
+    m_theComboValues.remove(property);
+    QtVariantPropertyManager::uninitializeProperty(property);
+}
+
diff --git a/GUI/coregui/Views/PropertyEditor/PropertyVariantManager.h b/GUI/coregui/Views/PropertyEditor/PropertyVariantManager.h
new file mode 100644
index 0000000..3323aa6
--- /dev/null
+++ b/GUI/coregui/Views/PropertyEditor/PropertyVariantManager.h
@@ -0,0 +1,66 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/PropertyEditor/PropertyVariantManager.h
+//! @brief     Defines class PropertyVariantManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROPERTYVARIANTMANAGER_H
+#define PROPERTYVARIANTMANAGER_H
+
+//! collection of classes extending QtPropertyBrowser functionality
+
+#include "ColorProperty.h"
+#include "ComboProperty.h"
+#include "GroupProperty.h"
+#include "MaterialProperty.h"
+#include "ScientificDoubleProperty.h"
+#include <QtVariantPropertyManager>
+
+class QObject;
+
+//! The ObjectVariantManager class provides and manages user defined
+//! QVariant based properties.
+class BA_CORE_API_ PropertyVariantManager : public QtVariantPropertyManager
+{
+    Q_OBJECT
+public:
+    PropertyVariantManager(QObject *parent = 0);
+
+    virtual QVariant value(const QtProperty *property) const;
+    using QtVariantPropertyManager::valueType;
+    virtual int valueType(int propertyType) const;
+    virtual bool isPropertyTypeSupported(int propertyType) const;
+    static int materialTypeId();
+    static int groupTypeId();
+    static int colorPropertyTypeId();
+    static int scientificDoubleTypeId();
+    static int fancyGroupTypeId();
+    static int comboPropertyTypeId();
+
+public slots:
+    virtual void setValue(QtProperty *property, const QVariant &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    QIcon valueIcon(const QtProperty *property) const;
+
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QMap<const QtProperty *, MaterialProperty> m_theMaterialValues;
+    QMap<const QtProperty *, ColorProperty> m_theColorValues;
+    QMap<const QtProperty *, ScientificDoubleProperty> m_theScientificDoubleValues;
+    QMap<const QtProperty *, GroupProperty_t> m_theFancyGroupValues;
+    QMap<const QtProperty *, ComboProperty> m_theComboValues;
+};
+
+#endif // PROPERTYVARIANTMANAGER_H
diff --git a/GUI/coregui/Views/SampleDesigner/ConnectableView.cpp b/GUI/coregui/Views/SampleDesigner/ConnectableView.cpp
new file mode 100644
index 0000000..94cb0ca
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ConnectableView.cpp
@@ -0,0 +1,194 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ConnectableView.cpp
+//! @brief     Implements class ConnectableView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ConnectableView.h"
+#include "DesignerHelper.h"
+#include "GUIHelpers.h"
+#include "NodeEditorConnection.h"
+#include "NodeEditorPort.h"
+#include "SessionItem.h"
+#include <QDebug>
+#include <QObject>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+#include <iostream>
+
+ConnectableView::ConnectableView(QGraphicsItem *parent, QRect rect)
+    : IView(parent), m_name("Unnamed"), m_color(Qt::gray), m_rect(rect), m_roundpar(3),
+      m_label_vspace(35)
+{
+    setFlag(QGraphicsItem::ItemIsMovable, true);
+    setFlag(QGraphicsItem::ItemIsSelectable, true);
+    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+}
+
+void ConnectableView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
+                            QWidget *widget)
+{
+    Q_UNUSED(widget);
+
+    painter->setPen(Qt::gray);
+    if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) {
+        painter->setPen(Qt::DashLine);
+    }
+
+    painter->setBrush(DesignerHelper::getDecorationGradient(m_color, getRectangle()));
+    painter->drawRoundedRect(getRectangle(), m_roundpar, m_roundpar);
+
+    if (m_label.isEmpty())
+        return;
+
+    painter->setPen(Qt::black);
+    double width = getRectangle().width() * 0.9;
+    double yoffset = 5; // space above the label
+    double height = m_label_vspace - yoffset;
+    QFont serifFont("Monospace", DesignerHelper::getLabelFontSize(), QFont::Normal);
+    painter->setFont(serifFont);
+    QRect textRect(getRectangle().x() + (getRectangle().width() - width) / 2.,
+                   getRectangle().y() + yoffset, width, height);
+    painter->drawText(textRect, Qt::AlignCenter, m_label);
+}
+
+NodeEditorPort *ConnectableView::addPort(const QString &name,
+                                         NodeEditorPort::EPortDirection direction,
+                                         NodeEditorPort::EPortType port_type)
+{
+    NodeEditorPort *port = new NodeEditorPort(this, name, direction, port_type);
+    if (direction == NodeEditorPort::INPUT) {
+        m_input_ports.append(port);
+    } else if (direction == NodeEditorPort::OUTPUT) {
+        m_output_ports.append(port);
+    } else {
+        throw GUIHelpers::Error("ConnectableView::addPort() -> Unknown port type");
+    }
+    setPortCoordinates();
+    return port;
+}
+
+void ConnectableView::setLabel(const QString &name)
+{
+    m_label = name;
+    setPortCoordinates();
+}
+
+void ConnectableView::connectInputPort(ConnectableView *other, int port_number)
+{
+    Q_ASSERT(other);
+
+    if (port_number >= m_input_ports.size())
+        throw GUIHelpers::Error("ConnectableView::connectInputPort() -> Wrong input port number");
+
+    if (other->getOutputPorts().size() != 1)
+        throw GUIHelpers::Error("ConnectableView::connectInputPort() -> Wrong output port number");
+
+    //FIXME for debug
+    if (port_number < 0)
+        return;
+
+    NodeEditorPort *input = m_input_ports.at(port_number);
+    NodeEditorPort *output = other->getOutputPorts().at(0);
+
+    if (!input->isConnected(output)) {
+        NodeEditorConnection *conn = new NodeEditorConnection(0, scene());
+        conn->setPort2(input);
+        conn->setPort1(output);
+        conn->updatePath();
+    }
+}
+
+int ConnectableView::getInputPortIndex(NodeEditorPort *port)
+{
+    return m_input_ports.indexOf(port);
+}
+
+// calculation of y-pos for ports
+void ConnectableView::setPortCoordinates()
+{
+    if (!getNumberOfPorts())
+        return;
+
+    // without main label ports can be placed over all rectangle vertical space
+    int hspace = getRectangle().height();
+    if (!getLabel().isEmpty())
+        hspace -= m_label_vspace;
+
+    int nintervals = getNumberOfPorts()
+                     + 2; // one spare interval for margin between input/output ports
+
+    int dy = hspace / double(nintervals);
+    int ypos = getRectangle().height() - hspace + dy;
+
+    if (getNumberOfPorts() == 1) {
+        // if total number of ports is 1, place it in the middle
+        ypos = getRectangle().height() - hspace + hspace / 2;
+    }
+
+    int nOutPorts = getNumberOfOutputPorts();
+    int nport(0);
+    foreach (QGraphicsItem *item, childItems()) {
+        NodeEditorPort *port = dynamic_cast<NodeEditorPort *>(item);
+        if (!port)
+            continue;
+        if (port->isOutput()) {
+            port->setPos(getRectangle().width(), ypos);
+        } else {
+            if (nport == nOutPorts && nOutPorts != 0)
+                ypos += dy; // additional margin between output and input ports
+            port->setPos(0.0, ypos);
+        }
+        ypos += dy;
+        nport++;
+    }
+}
+
+int ConnectableView::getNumberOfPorts()
+{
+    return m_input_ports.size() + m_output_ports.size();
+}
+
+int ConnectableView::getNumberOfOutputPorts()
+{
+    return m_output_ports.size();
+}
+
+int ConnectableView::getNumberOfInputPorts()
+{
+    return m_input_ports.size();
+}
+
+void ConnectableView::update_appearance()
+{
+    qDebug() << "AAAA COnnectableView " << m_item->modelType() << m_item->displayName();
+    setLabel( hyphenate(m_item->displayName()) );
+    IView::update_appearance();
+}
+
+QString ConnectableView::hyphenate(const QString &name) const
+{
+    QRegExp capital_letter("[A-Z]");
+    QRegExp number("[0-9]");
+    int next_capital = capital_letter.indexIn(name, 1);
+    int next_number = number.indexIn(name, 1);
+    if (next_capital > 0 && next_capital < name.size() - 2) {
+        int first_split_index = (next_number > 0 && next_number < next_capital)
+                ? next_number
+                : next_capital;
+        QString result = name.left(first_split_index) + QString("\n")
+                + name.right(name.size()-first_split_index);
+        return result;
+    }
+    return name;
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ConnectableView.h b/GUI/coregui/Views/SampleDesigner/ConnectableView.h
new file mode 100644
index 0000000..3af8342
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ConnectableView.h
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ConnectableView.h
+//! @brief     Defines class ConnectableView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CONNECTABLEVIEW_H
+#define CONNECTABLEVIEW_H
+
+#include "IView.h"
+#include "NodeEditorPort.h"
+#include "WinDllMacros.h"
+
+class QPainter;
+class QStyleOptionGraphicsItem;
+class QWidget;
+class NodeEditorPort;
+
+//! view of ISample's with rectangular shape and node functionality
+class BA_CORE_API_ ConnectableView : public IView
+{
+    Q_OBJECT
+public:
+    enum { TYPE = DesignerHelper::ISAMPLE_RECT };
+    ConnectableView(QGraphicsItem *parent = 0, QRect rect = QRect(0,0,50,50) );
+    virtual ~ConnectableView(){}
+    int type() const { return TYPE; }
+
+    virtual QRectF boundingRect() const { return getRectangle(); }
+    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+
+    virtual QString getName() const { return m_name; }
+    virtual QColor getColor() const { return m_color; }
+    virtual QRectF getRectangle() const { return m_rect;}
+    virtual void setRectangle(QRectF rect) { m_rect = rect; }
+    virtual QString getLabel() const { return m_label; }
+    virtual void setLabel(const QString &name);
+
+    //! adds port to view
+    virtual NodeEditorPort* addPort(const QString &name, NodeEditorPort::EPortDirection direction, NodeEditorPort::EPortType port_type);
+
+    //! connects input port with given index with output port of other view
+    void connectInputPort(ConnectableView *other, int port_number);
+
+    QList<NodeEditorPort *> getInputPorts() { return m_input_ports; }
+    QList<NodeEditorPort *> getOutputPorts() { return m_output_ports; }
+
+    int getInputPortIndex(NodeEditorPort *port);
+
+    virtual void setName(const QString &name) { m_name = name; }
+    virtual void setColor(const QColor &color) { m_color = color; }
+
+protected:
+    virtual void setPortCoordinates();
+    virtual int getNumberOfPorts();
+    virtual int getNumberOfOutputPorts();
+    virtual int getNumberOfInputPorts();
+    virtual void update_appearance();
+
+    QString m_name;
+    QColor m_color;
+    QRectF m_rect;
+    int m_roundpar;
+    double m_label_vspace; // vertical space occupied by the label
+    QString m_label;
+    QList<NodeEditorPort *> m_input_ports;
+    QList<NodeEditorPort *> m_output_ports;
+
+private:
+    QString hyphenate(const QString& name) const;
+};
+
+
+//! default view of unimplemented ISample's
+//class ISampleDefaultView : public ConnectableView
+//{
+//public:
+//    ISampleDefaultView(QGraphicsItem *parent = 0) : ConnectableView(parent){}
+//    //! сalls the ISampleViewVisitor's visit method
+//};
+
+
+
+#endif // CONNECTABLEVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp b/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp
new file mode 100644
index 0000000..9d225f5
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp
@@ -0,0 +1,270 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerHelper.cpp
+//! @brief     Implements class DesignerHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DesignerHelper.h"
+#include "item_constants.h"
+#include <QDebug>
+#include <QPainter>
+#include <QtGlobal>
+#include <cmath>
+#include <iostream>
+
+int DesignerHelper::m_default_layer_height = 30;
+int DesignerHelper::m_default_layer_width = 200;
+double DesignerHelper::m_current_zoom_level = 1.0;
+
+QGradient DesignerHelper::getLayerGradient(const QColor &color, const QRectF &rect)
+{
+    QColor c = color;
+    c.setAlpha(160);
+    QLinearGradient result(rect.topLeft(), rect.bottomRight());
+    result.setColorAt(0, c.dark(150));
+    result.setColorAt(0.5, c.light(200));
+    result.setColorAt(1, c.dark(150));
+    return result;
+}
+
+QGradient DesignerHelper::getDecorationGradient(const QColor &color, const QRectF &rect)
+{
+    QColor c = color;
+    // c.setAlpha(200);
+    QLinearGradient result(rect.x() + rect.width() / 2, rect.y(), rect.x() + rect.width() / 2,
+                           rect.y() + rect.height());
+    result.setColorAt(0, c);
+    result.setColorAt(0.5, c.lighter(150));
+    result.setColorAt(1, c);
+    return result;
+}
+
+QPixmap DesignerHelper::getSceneBackground()
+{
+    const int size = 10;
+    QPixmap result(size, size);
+    result.fill(QColor(250, 250, 250));
+    QPainter tilePainter(&result);
+    QColor color(220, 220, 220);
+    tilePainter.fillRect(0.0, 0.0, 2, 2, color);
+    tilePainter.end();
+
+    return result;
+}
+
+QPixmap DesignerHelper::getPixmapLayer()
+{
+    QRect rect(0, 0, DesignerHelper::getDefaultLayerWidth(),
+               DesignerHelper::getDefaultLayerHeight());
+    QPixmap pixmap(rect.width() + 1, rect.height() + 1);
+    pixmap.fill(Qt::transparent);
+    QPainter painter(&pixmap);
+    painter.setPen(Qt::black);
+    painter.setBrush(DesignerHelper::getLayerGradient(Qt::green, rect));
+    painter.drawRect(rect);
+    return pixmap;
+}
+
+QPixmap DesignerHelper::getPixmapMultiLayer()
+{
+    QRect rect(0, 0, DesignerHelper::getDefaultMultiLayerWidth(),
+               DesignerHelper::getDefaultLayerHeight());
+    QPixmap pixmap(rect.width() + 1, rect.height() + 1);
+    pixmap.fill(Qt::transparent);
+    QPainter painter(&pixmap);
+    painter.setPen(Qt::black);
+    painter.setBrush(DesignerHelper::getLayerGradient(QColor(75, 157, 249), rect));
+    painter.drawRect(rect);
+    painter.setPen(Qt::DashLine);
+    painter.drawLine(0, DesignerHelper::getDefaultLayerHeight() * 0.3,
+                     DesignerHelper::getDefaultMultiLayerWidth(),
+                     DesignerHelper::getDefaultLayerHeight() * 0.3);
+    painter.drawLine(0, DesignerHelper::getDefaultLayerHeight() * 0.6,
+                     DesignerHelper::getDefaultMultiLayerWidth(),
+                     DesignerHelper::getDefaultLayerHeight() * 0.6);
+    return pixmap;
+}
+
+QPixmap DesignerHelper::getPixmapParticleLayout()
+{
+    QRect rect(0, 0, DesignerHelper::getDefaultParticleLayoutWidth(),
+               DesignerHelper::getDefaultParticleLayoutHeight());
+    QPixmap pixmap(rect.width() + 1, rect.height() + 1);
+    pixmap.fill(Qt::transparent);
+    QPainter painter(&pixmap);
+    painter.setPen(Qt::black);
+    painter.setBrush(DesignerHelper::getDecorationGradient(QColor(135, 206, 50), rect));
+    painter.drawRoundedRect(rect, 3, 3);
+    return pixmap;
+}
+
+QPixmap DesignerHelper::getPixmapInterferenceFunction()
+{
+    QRect rect(0, 0, DesignerHelper::getDefaultInterferenceFunctionWidth(),
+               DesignerHelper::getDefaultInterferenceFunctionHeight());
+    QPixmap pixmap(rect.width() + 1, rect.height() + 1);
+    pixmap.fill(Qt::transparent);
+    QPainter painter(&pixmap);
+    painter.setPen(Qt::black);
+    painter.setBrush(DesignerHelper::getDecorationGradient(Qt::lightGray, rect));
+    painter.drawRoundedRect(rect, 3, 3);
+    return pixmap;
+}
+
+QPixmap DesignerHelper::getPixmapParticle()
+{
+    QRect rect(0, 0, DesignerHelper::getDefaultParticleWidth(),
+               DesignerHelper::getDefaultParticleHeight());
+    QPixmap pixmap(rect.width() + 1, rect.height() + 1);
+    pixmap.fill(Qt::transparent);
+    QPainter painter(&pixmap);
+    painter.setPen(Qt::black);
+    // painter.setBrush(DesignerHelper::getDecorationGradient(QColor(120, 165, 215), rect));
+    painter.setBrush(
+        DesignerHelper::getDecorationGradient(DesignerHelper::getDefaultParticleColor(), rect));
+    painter.drawRoundedRect(rect, 5, 5);
+    return pixmap;
+}
+
+// non-linear convertion of layer's thickness in nanometers to screen size to have reasonable
+// graphics representation
+int DesignerHelper::nanometerToScreen(double nanometer)
+{
+    const int ymin(m_default_layer_height);
+    const int ymax(500);
+    int result(ymin);
+    if (nanometer > 0)
+        result = qBound(ymin, ymin + (int)std::pow(nanometer, 0.9), ymax);
+    return result;
+}
+
+QRectF DesignerHelper::getDefaultBoundingRect(const QString &name)
+{
+    qDebug() << "    getDefaultBoundingRect " << name;
+    if (name == Constants::MultiLayerType) {
+        return QRectF(0, 0, getDefaultMultiLayerWidth(), getDefaultMultiLayerHeight());
+    } else if (name == Constants::LayerType) {
+        return QRectF(0, 0, getDefaultLayerWidth(), getDefaultLayerHeight());
+    } else if (name == Constants::ParticleLayoutType) {
+        return QRectF(0, 0, getDefaultParticleLayoutWidth(), getDefaultParticleLayoutHeight());
+    } else if (name == Constants::TransformationType) {
+        return QRectF(0, 0, getDefaultTransformationWidth(), getDefaultTransformationHeight());
+    } else if (name.startsWith(Constants::FormFactorType) || name == Constants::ParticleType
+               || name == Constants::ParticleCoreShellType
+               || name == Constants::ParticleDistributionType) {
+        return QRectF(0, 0, getDefaultParticleWidth(), getDefaultParticleHeight());
+    } else if (name.startsWith("Interference")) {
+        return QRectF(0, 0, getDefaultInterferenceFunctionWidth(),
+                      getDefaultInterferenceFunctionHeight());
+    } else {
+        return QRectF(0, 0, 50, 50);
+    }
+}
+
+QColor DesignerHelper::getDefaultColor(const QString &name)
+{
+    if (name == Constants::MultiLayerType) {
+        // return QColor(Qt::blue);
+        return QColor(51, 116, 255);
+    } else if (name == Constants::LayerType) {
+        // return QColor(Qt::green);
+        return QColor(26, 156, 9);
+    } else if (name == Constants::ParticleLayoutType) {
+        return QColor(135, 206, 50);
+    } else if (name.startsWith(Constants::FormFactorType) || name == Constants::ParticleType
+               || name == Constants::ParticleCoreShellType) {
+        return QColor(210, 223, 237);
+    } else if (name.startsWith("InterferenceFunction")) {
+        return QColor(255, 236, 139);
+    }
+    else if(name == "Transparant red") {
+        return QColor(0xFF, 0, 0, 0x80);
+    }
+    else if(name == "Transparant blue") {
+        return QColor(0, 0, 0xFF, 0x80);
+    }
+    else {
+        return QColor(Qt::lightGray);
+    }
+}
+
+QPixmap DesignerHelper::getMimePixmap(const QString &name)
+{
+    QRectF default_rect = getDefaultBoundingRect(name);
+    QRectF mime_rect(0, 0, default_rect.width() * m_current_zoom_level,
+                     default_rect.height() * m_current_zoom_level);
+
+    QPixmap pixmap(mime_rect.width() + 1, mime_rect.height() + 1);
+    pixmap.fill(Qt::transparent);
+    QPainter painter(&pixmap);
+    painter.setPen(Qt::black);
+    painter.setBrush(DesignerHelper::getDecorationGradient(getDefaultColor(name), mime_rect));
+    painter.drawRoundedRect(mime_rect, 1, 1);
+    return pixmap;
+}
+
+int DesignerHelper::getHeaderFontSize()
+{
+#ifdef Q_OS_MAC
+    return 14;
+#else
+    return 12;
+#endif
+}
+
+QRectF DesignerHelper::getDefaultMultiLayerRect()
+{
+    return QRectF(0, 0, DesignerHelper::getDefaultMultiLayerWidth(),
+                  DesignerHelper::getDefaultMultiLayerHeight());
+}
+
+int DesignerHelper::getSectionFontSize()
+{
+#ifdef Q_OS_MAC
+    return 12;
+#else
+    return 10;
+#endif
+}
+
+int DesignerHelper::getLabelFontSize()
+{
+#ifdef Q_OS_MAC
+    return 12;
+#else
+    return 10;
+#endif
+}
+
+int DesignerHelper::getPortFontSize()
+{
+#ifdef Q_OS_MAC
+    return 10;
+#else
+    return 8;
+#endif
+}
+
+int DesignerHelper::getPythonEditorFontSize()
+{
+#ifdef Q_OS_MAC
+    return 13;
+#else
+    return 10;
+#endif
+}
+
+void DesignerHelper::setZoomLevel(double value)
+{
+    m_current_zoom_level = value;
+}
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerHelper.h b/GUI/coregui/Views/SampleDesigner/DesignerHelper.h
new file mode 100644
index 0000000..a893a2a
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerHelper.h
@@ -0,0 +1,123 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerHelper.h
+//! @brief     Defines class DesignerHelper
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DESIGNERHELPER_H
+#define DESIGNERHELPER_H
+
+#include "WinDllMacros.h"
+#include <QColor>
+#include <QGradient>
+#include <QGraphicsItem>
+#include <QRect>
+#include <complex>
+
+//! collection of static methods with SampleDesigner geometry settings
+class BA_CORE_API_ DesignerHelper
+{
+public:
+
+    enum EWidgetTypes {
+        IVIEW = QGraphicsItem::UserType+1, // = 65537
+        ISAMPLE_RECT,
+        NODE_EDITOR_PORT,
+        NODE_EDITOR_CONNECTION,
+        MULTILAYER,
+        LAYER,
+        PARTICLE_LAYOUT,
+        INTERFERENCE_FUNCTION,
+        INTERFERENCE_FUNCTION_RADIAL_PARA,
+        INTERFERENCE_FUNCTION_2D_PARA,
+        INTERFERENCE_FUNCTION_1D_LATTICE,
+        INTERFERENCE_FUNCTION_2D_LATTICE,
+        PARTICLE,
+        TRANSFORMATION,
+    };
+
+    static int getDefaultLayerWidth() { return m_default_layer_width; }
+    static int getDefaultLayerHeight() { return m_default_layer_height; }
+    static QColor getDefaultLayerColor() { return QColor(Qt::lightGray); }
+
+    static int getDefaultMultiLayerWidth() { return m_default_layer_width*1.15; }
+    static int getDefaultMultiLayerHeight() { return m_default_layer_height; }
+    static QRectF getDefaultMultiLayerRect();
+
+    static int getDefaultParticleLayoutWidth() { return m_default_layer_height*3.5; }
+    static int getDefaultParticleLayoutHeight() { return m_default_layer_height*4.5; }
+
+    static int getDefaultInterferenceFunctionWidth() { return m_default_layer_height*4; }
+    static int getDefaultInterferenceFunctionHeight() { return m_default_layer_height*4; }
+
+    static int getDefaultParticleWidth() { return m_default_layer_height*3.5; }
+    static int getDefaultParticleHeight() { return m_default_layer_height*4; }
+    static QColor getDefaultParticleColor() { return QColor(210, 223, 237); }
+
+    static int getDefaultTransformationWidth() { return m_default_layer_height*4; }
+    static int getDefaultTransformationHeight() { return m_default_layer_height*2; }
+    static QColor getDefaultTransformationColor() { return QColor(145, 50, 220); }
+
+    static int getDefaultMaterialWidth() { return m_default_layer_height*1.2; }
+    static int getDefaultMaterialHeight() { return m_default_layer_height*1.2; }
+    static QColor getDefaultMaterialColor() { return QColor(qrand() % 256, qrand() % 256, qrand() % 256); }
+
+    static QGradient getLayerGradient(const QColor &color, const QRectF &rect);
+    static QGradient getDecorationGradient(const QColor &color, const QRectF &rect);
+
+    static QPixmap getSceneBackground();
+    static QPixmap getPixmapLayer();
+    static QPixmap getPixmapMultiLayer();
+    static QPixmap getPixmapParticleLayout();
+    static QPixmap getPixmapInterferenceFunction();
+    static QPixmap getPixmapParticle();
+
+    static QColor getRandomColor() { return QColor(qrand() % 256, qrand() % 256, qrand() % 256); }
+
+    //! sort graphics item according they y-coordinate
+    static bool sort_layers(QGraphicsItem* left, QGraphicsItem *right) {
+        return left->y() < right->y();
+    }
+
+    //! non-linear convertion of layer's thickness in nanometers to screen size
+    //! to have reasonable graphics representation of layer in the form of QRect
+    static int nanometerToScreen(double nanometer);
+
+    //! returns default bounding rectangle for given IvView name
+    static QRectF getDefaultBoundingRect(const QString &name);
+
+    //! returns default color for IView with given name
+    static QColor getDefaultColor(const QString &name);
+
+    //! returns Mime pixmap for givew IView name
+    static QPixmap getMimePixmap(const QString &name);
+
+    //! returns system dependent font size
+    static int getHeaderFontSize();
+    static int getSectionFontSize();
+    static int getLabelFontSize();
+    static int getPortFontSize();
+    static int getPythonEditorFontSize();
+
+    static void setZoomLevel(double value);
+
+private:
+    static int m_default_layer_height;
+    static int m_default_layer_width;
+    static double m_current_zoom_level;
+};
+
+typedef std::complex<double> complex_t;
+Q_DECLARE_METATYPE(complex_t)
+
+#endif // DESIGNERHELPER_H
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp b/GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp
new file mode 100644
index 0000000..b108e1c
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp
@@ -0,0 +1,114 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerMimeData.cpp
+//! @brief     Implements class DesignerMimeData
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DesignerMimeData.h"
+#include "DesignerHelper.h"
+#include <QBitmap>
+#include <QByteArray>
+#include <QDataStream>
+#include <QDrag>
+#include <QPainter>
+#include <QPixmap>
+#include <QWidget>
+#include <QXmlStreamReader>
+#include <iostream>
+
+#if QT_VERSION < 0x050000
+#define QStringLiteral QString
+#endif
+
+
+DesignerMimeData::DesignerMimeData(const QString &entryname, const QString &xmldescr, QDrag *drag)
+    : m_entryname(entryname)
+    , m_xmldescr(xmldescr)
+{
+    drag->setMimeData(this);
+
+    read_xmldescr(m_xmldescr);
+
+    QByteArray itemData;
+    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
+    dataStream << xmldescr;
+    setData("bornagain/widget", itemData);
+
+    drag->setPixmap(getPixmap(m_classname));
+    drag->setHotSpot(QPoint(drag->pixmap().width()/2, drag->pixmap().height()/2));
+
+}
+
+
+void DesignerMimeData::read_xmldescr(const QString &xmldescr)
+{
+    QXmlStreamReader reader(xmldescr);
+
+    bool widget_found = false;
+    while (!reader.atEnd()) {
+        if (reader.readNext() == QXmlStreamReader::StartElement) {
+            const QStringRef name = reader.name();
+            if(widget_found)
+                reader.raiseError("Unexpected element <"+name.toString()+">");
+            if (name.compare(QStringLiteral("widget"), Qt::CaseInsensitive) == 0)
+                read_widget(reader);
+            else
+                reader.raiseError("Unexpected element <"+name.toString()+">");
+        }
+    }
+
+    if (reader.hasError()) {
+        QString errorMessage = tr("A parse error occurred at line %1, column %2 of the XML code "
+                                   "specified for the widget %3: %4\n%5")
+                                   .arg(reader.lineNumber()).arg(reader.columnNumber()).arg(m_entryname)
+                                   .arg(reader.errorString()).arg(xmldescr);
+        std::cout << "DesignerMimeData::read_xmldescr() -> Error during parse." << std::endl;
+        std::cout << errorMessage.toStdString() << std::endl;
+    }
+}
+
+
+// extract class name and skip the rest
+void DesignerMimeData::read_widget(QXmlStreamReader &reader)
+{
+    foreach (const QXmlStreamAttribute &attribute, reader.attributes()) {
+        QStringRef name = attribute.name();
+        if (name == QStringLiteral("class")) {
+            m_classname = attribute.value().toString();
+            continue;
+        }
+        reader.raiseError(QStringLiteral("Unexpected attribute ") + name.toString());
+    }
+    reader.skipCurrentElement();
+}
+
+
+// Execute a drag and drop operation.
+Qt::DropAction DesignerMimeData::execDrag(const QString &name, const QString &xmldescr, QWidget *dragSource)
+{
+    if ( !xmldescr.size() ) return Qt::IgnoreAction;
+
+    QDrag *drag = new QDrag(dragSource);
+    DesignerMimeData *mimeData = new DesignerMimeData(name, xmldescr, drag);
+    Q_UNUSED(mimeData);
+
+    const Qt::DropAction executedAction = drag->exec(Qt::CopyAction);
+
+    return executedAction;
+}
+
+
+QPixmap DesignerMimeData::getPixmap(const QString &name)
+{
+    return DesignerHelper::getMimePixmap(name);
+}
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerMimeData.h b/GUI/coregui/Views/SampleDesigner/DesignerMimeData.h
new file mode 100644
index 0000000..dcfe16c
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerMimeData.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerMimeData.h
+//! @brief     Defines class DesignerMimeData
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DESIGNERMIMEDATA_H
+#define DESIGNERMIMEDATA_H
+
+#include "WinDllMacros.h"
+#include <QMimeData>
+
+class QDrag;
+class QXmlStreamReader;
+
+//! Mime data for use with SampleDesigner drag and drop operations
+class BA_CORE_API_ DesignerMimeData : public QMimeData
+{
+    Q_OBJECT
+public:
+    DesignerMimeData(const QString &name, const QString &xmldescr, QDrag *drag);
+    virtual ~DesignerMimeData(){}
+
+    //! Execute a drag and drop operation.
+    static Qt::DropAction execDrag(const QString &name, const QString &xmldescr, QWidget * dragSource);
+
+    QString getClassName() const { return m_classname; }
+private:
+    void read_xmldescr(const QString &xmldescr);
+    void read_widget(QXmlStreamReader &reader);
+
+    QPixmap getPixmap(const QString &name);
+
+    QString m_entryname;
+    QString m_xmldescr;
+    QString m_classname;
+
+};
+
+#endif // DESIGNERMIMEDATA_H
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
new file mode 100644
index 0000000..7a2a035
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
@@ -0,0 +1,557 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerScene.cpp
+//! @brief     Implements class DesignerScene
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DesignerScene.h"
+#include "ConnectableView.h"
+#include "DesignerHelper.h"
+#include "DesignerMimeData.h"
+#include "FilterPropertyProxy.h"
+#include "GUIExamplesFactory.h"
+#include "IView.h"
+#include "InstrumentModel.h"
+#include "ItemFactory.h"
+#include "LayerView.h"
+#include "NodeEditor.h"
+#include "NodeEditorConnection.h"
+#include "ParticleCompositionItem.h"
+#include "ParticleCoreShellItem.h"
+#include "ParticleItem.h"
+#include "ParticleLayoutItem.h"
+#include "SampleBuilderFactory.h"
+#include "SampleModel.h"
+#include "SampleViewAligner.h"
+#include "SampleViewFactory.h"
+#include "SessionGraphicsItem.h"
+#include <QDebug>
+#include <QGraphicsSceneMouseEvent>
+#include <QItemSelection>
+#include <QPainter>
+
+DesignerScene::DesignerScene(QObject *parent)
+    : QGraphicsScene(parent), m_sampleModel(0), m_instrumentModel(0), m_selectionModel(0), m_proxy(0),
+      m_block_selection(false), m_aligner(new SampleViewAligner(this))
+{
+    setSceneRect(QRectF(-800, 0, 1600, 1600));
+    setBackgroundBrush(DesignerHelper::getSceneBackground());
+
+    m_nodeEditor = new NodeEditor(parent);
+    m_nodeEditor->install(this);
+    connect(m_nodeEditor, SIGNAL(connectionIsEstablished(NodeEditorConnection *)), this,
+            SLOT(onEstablishedConnection(NodeEditorConnection *)));
+    connect(m_nodeEditor, SIGNAL(selectionModeChangeRequest(int)), this,
+            SIGNAL(selectionModeChangeRequest(int)));
+    connect(this, SIGNAL(selectionChanged()), this, SLOT(onSceneSelectionChanged()));
+}
+
+DesignerScene::~DesignerScene()
+{
+    delete m_aligner;
+}
+
+void DesignerScene::setSampleModel(SampleModel *sampleModel)
+{
+    Q_ASSERT(sampleModel);
+
+    if (sampleModel != m_sampleModel) {
+
+        if (m_sampleModel) {
+            disconnect(m_sampleModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene()));
+            disconnect(m_sampleModel, SIGNAL(rowsInserted(QModelIndex, int, int)), this,
+                       SLOT(onRowsInserted(QModelIndex, int, int)));
+            disconnect(m_sampleModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this,
+                       SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int)));
+            disconnect(m_sampleModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
+                       SLOT(onRowsRemoved(QModelIndex, int, int)));
+            disconnect(m_sampleModel, SIGNAL(modelReset()), this, SLOT(updateScene()));
+        }
+
+        m_sampleModel = sampleModel;
+
+        connect(m_sampleModel, SIGNAL(modelAboutToBeReset()), this, SLOT(resetScene()));
+        connect(m_sampleModel, SIGNAL(rowsInserted(QModelIndex, int, int)), this,
+                SLOT(onRowsInserted(QModelIndex, int, int)));
+        connect(m_sampleModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this,
+                SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int)));
+        connect(m_sampleModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this,
+                SLOT(onRowsRemoved(QModelIndex, int, int)));
+        connect(m_sampleModel, SIGNAL(modelReset()), this, SLOT(updateScene()));
+
+        resetScene();
+        updateScene();
+    }
+}
+
+void DesignerScene::setInstrumentModel(InstrumentModel *instrumentModel)
+{
+    m_instrumentModel = instrumentModel;
+}
+
+void DesignerScene::setSelectionModel(QItemSelectionModel *model, FilterPropertyProxy *proxy)
+{
+    Q_ASSERT(model);
+
+    if (model != m_selectionModel) {
+
+        if (m_selectionModel) {
+            disconnect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+                       this, SLOT(onSessionSelectionChanged(QItemSelection, QItemSelection)));
+        }
+
+        m_selectionModel = model;
+        m_proxy = proxy;
+
+        connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this,
+                SLOT(onSessionSelectionChanged(QItemSelection, QItemSelection)));
+    }
+}
+
+IView *DesignerScene::getViewForItem(SessionItem *item)
+{
+    auto it = m_ItemToView.find(item);
+    if(it != m_ItemToView.end()) {
+        return it.value();
+    }
+    return nullptr;
+}
+
+void DesignerScene::resetScene()
+{
+    qDebug() << "DesignerScene::resetScene()";
+    clear();
+    m_ItemToView.clear();
+    m_layer_interface_line = QLineF();
+}
+
+void DesignerScene::updateScene()
+{
+    qDebug() << "DesignerScene::updateScene()";
+    updateViews();
+    alignViews();
+}
+
+void DesignerScene::onRowsInserted(const QModelIndex & /* parent */, int /* first */,
+                                   int /* last */)
+{
+    qDebug() << "DesignerScene::onRowsInserted";
+    updateScene();
+}
+
+void DesignerScene::onRowsRemoved(const QModelIndex & /* parent */, int /* first */, int /* last */)
+{
+    qDebug() << "DesignerScene::onRowsRemoved";
+    updateScene();
+}
+
+void DesignerScene::onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
+{
+    m_block_selection = true;
+    qDebug() << "DesignerScene::onRowsAboutToBeRemoved()" << parent << first << last;
+    for (int irow = first; irow <= last; ++irow) {
+        QModelIndex itemIndex = m_sampleModel->index(irow, 0, parent);
+        deleteViews(itemIndex); // deleting all child items
+    }
+    m_block_selection = false;
+}
+
+//! propagate selection from model to scene
+void DesignerScene::onSessionSelectionChanged(const QItemSelection & /* selected */,
+                                              const QItemSelection & /* deselected */)
+{
+    if (m_block_selection)
+        return;
+
+    qDebug() << "DesignerScene::onSessionSelectionChanged()";
+    m_block_selection = true;
+
+    for (QMap<SessionItem *, IView *>::iterator it = m_ItemToView.begin();
+         it != m_ItemToView.end(); ++it) {
+        QModelIndex index = m_proxy->mapFromSource(m_sampleModel->indexOfItem(it.key()));
+        if (index.isValid()) {
+            if (m_selectionModel->isSelected(index)) {
+                it.value()->setSelected(true);
+            } else {
+                it.value()->setSelected(false);
+            }
+        }
+    }
+
+    m_block_selection = false;
+}
+
+//! propagate selection from scene to model
+void DesignerScene::onSceneSelectionChanged()
+{
+    qDebug() << "DesignerScene::onSceneSelectionChanged() 1.1";
+    if (m_block_selection)
+        return;
+
+    m_block_selection = true;
+
+    m_selectionModel->clearSelection();
+    QList<QGraphicsItem *> selected = selectedItems();
+    for (int i = 0; i < selected.size(); ++i) {
+        IView *view = dynamic_cast<IView *>(selected[i]);
+        if (view) {
+            SessionItem *sampleItem = view->getItem();
+            QModelIndex itemIndex = m_sampleModel->indexOfItem(sampleItem);
+            Q_ASSERT(itemIndex.isValid());
+            if (!m_selectionModel->isSelected(m_proxy->mapFromSource(itemIndex)))
+                m_selectionModel->select(m_proxy->mapFromSource(itemIndex), QItemSelectionModel::Select);
+        }
+    }
+
+    m_block_selection = false;
+}
+
+//! runs through all items recursively and updates corresponding views
+void DesignerScene::updateViews(const QModelIndex &parentIndex, IView *parentView)
+{
+    Q_ASSERT(m_sampleModel);
+
+    qDebug() << "DesignerScene::updateVIews()";
+
+    if (!parentIndex.isValid()) {
+        qDebug() << "Dumping model";
+    }
+
+    IView *childView(0);
+    int childCount = 0;
+    for (int i_row = 0; i_row < m_sampleModel->rowCount(parentIndex); ++i_row) {
+        QModelIndex itemIndex = m_sampleModel->index(i_row, 0, parentIndex);
+
+        if (SessionItem *item = m_sampleModel->itemForIndex(itemIndex)) {
+
+            if(item && !SampleViewFactory::isValidType(item->modelType()))
+                    continue;
+
+            childView = addViewForItem(item);
+            if (childView) {
+                if (parentView) {
+                    qDebug() << "       DesignerScene::updateViews() -> adding child "
+                             << item->modelType() << " to parent"
+                             << parentView->getItem()->modelType();
+                    parentView->addView(childView, childCount++);
+                }
+            }
+
+        } else {
+            qDebug() << "not a parameterized graphics item";
+        }
+
+        updateViews(itemIndex, childView);
+    }
+}
+
+//! adds view for item, if it doesn't exists
+IView *DesignerScene::addViewForItem(SessionItem *item)
+{
+    qDebug() << "DesignerScene::addViewForItem() ->" << item->modelType();
+    Q_ASSERT(item);
+
+    IView *view = getViewForItem(item);
+
+    if (!view) {
+        qDebug() << "       DesignerScene::addViewForItem() -> Creating view for item"
+                 << item->modelType();
+        view = SampleViewFactory::createSampleView(item->modelType());
+        if (view) {
+            m_ItemToView[item] = view;
+            view->setParameterizedItem(item);
+            addItem(view);
+            return view;
+        }
+    } else {
+        qDebug() << "       DesignerScene::addViewForItem() -> View for item exists."
+                 << item->modelType();
+    }
+    return view;
+}
+
+//! aligns SampleView's on graphical canvas
+void DesignerScene::alignViews()
+{
+    m_aligner->alignSample(QModelIndex(), QPointF(200, 800));
+}
+
+//! runs recursively through model's item and schedules view removal
+void DesignerScene::deleteViews(const QModelIndex &viewIndex)
+{
+    qDebug() << "DesignerScene::deleteViews()" << viewIndex;
+
+    for (int i_row = 0; i_row < m_sampleModel->rowCount(viewIndex); ++i_row) {
+        QModelIndex itemIndex = m_sampleModel->index(i_row, 0, viewIndex);
+
+        if (SessionItem *item = m_sampleModel->itemForIndex(itemIndex)) {
+            qDebug() << "   deleteViews" << item->modelType() << item->displayName();
+            removeItemViewFromScene(item);
+
+        } else {
+            qDebug() << "not a parameterized graphics item";
+        }
+        deleteViews(itemIndex);
+    }
+    removeItemViewFromScene(m_sampleModel->itemForIndex(viewIndex)); // deleting view itself
+}
+
+//! removes view from scene corresponding to given item
+void DesignerScene::removeItemViewFromScene(SessionItem *item)
+{
+    Q_ASSERT(item);
+
+    qDebug() << "DesignerScene::removeItemFromScene()" << item->modelType() << item->displayName();
+    for (QMap<SessionItem *, IView *>::iterator it = m_ItemToView.begin();
+         it != m_ItemToView.end(); ++it) {
+        if (it.key() == item) {
+            IView *view = it.value();
+            view->setSelected(false);
+            m_ItemToView.erase(it);
+            emit view->aboutToBeDeleted();
+            view->deleteLater();
+//            delete view;
+            update();
+            break;
+        }
+    }
+}
+
+//! propagates deletion of views on the scene to the model
+void DesignerScene::deleteSelectedItems()
+{
+    qDebug() << "DesignerScene::deleteSelectedItems() 1.1" << selectedItems().size();
+
+    QModelIndexList indexes = m_selectionModel->selectedIndexes();
+
+    QList<IView *> views_which_will_be_deleted;
+    foreach (QModelIndex index, indexes) {
+        views_which_will_be_deleted.append(m_ItemToView[m_sampleModel->itemForIndex(m_proxy->mapToSource(index))]);
+    }
+
+    // deleting selected items on model side, corresponding views will be deleted automatically
+    // Since we don't know the order of items and their parent/child relationship, we need this
+    while (indexes.size()) {
+        QModelIndex current = m_proxy->mapToSource(indexes.back());
+        qDebug() << "   DesignerScene::deleteSelectedItems() current.selected" << current;
+        m_sampleModel->removeRows(current.row(), 1, current.parent());
+        indexes = m_selectionModel->selectedIndexes();
+    }
+
+    // Connections will be deleted automatically if one of connected views has been deleted.
+    // For the moment, we have to delete connections which are: 1) were selected 2) Do not connect
+    // views scheduled for deletion.
+    foreach (QGraphicsItem *graphicsItem, selectedItems()) {
+        if (NodeEditorConnection *connection = dynamic_cast<NodeEditorConnection *>(graphicsItem)) {
+            if (views_which_will_be_deleted.contains(connection->getParentView())
+                || views_which_will_be_deleted.contains(connection->getChildView()))
+                continue;
+            removeConnection(connection);
+        }
+    }
+}
+
+//! shows appropriate layer interface to drop while moving ILayerView
+void DesignerScene::drawForeground(QPainter *painter, const QRectF & /* rect */)
+{
+    if (isLayerDragged()) {
+        painter->setPen(QPen(Qt::darkBlue, 2, Qt::DashLine));
+        painter->drawLine(m_layer_interface_line);
+    }
+}
+
+//! propagates connection established by NodeEditor to the model
+void DesignerScene::onEstablishedConnection(NodeEditorConnection *connection)
+{
+    qDebug() << "DesignerScene::onEstablishedConnection()";
+    ConnectableView *parentView = connection->getParentView();
+    ConnectableView *childView = connection->getChildView();
+
+    // TODO restore logic
+//    SessionItem::PortInfo::EPorts input_port_index
+//        = (ParameterizedItem::PortInfo::EPorts)parentView->getInputPortIndex(
+//            connection->getInputPort());
+
+//    childView->getParameterizedItem()->setPort(input_port_index);
+    qDebug() << parentView->getInputPortIndex(connection->inputPort());
+    QString tag;
+    if (connection->getParentView()->getItem()->modelType() == Constants::ParticleLayoutType) {
+        if (connection->inputPort()->getPortType() == NodeEditorPort::INTERFERENCE)
+            tag = ParticleLayoutItem::T_INTERFERENCE;
+    }
+    else if (connection->getParentView()->getItem()->modelType() == Constants::ParticleCoreShellType) {
+        if (parentView->getInputPortIndex(connection->inputPort()) == 0)
+            tag = ParticleCoreShellItem::T_CORE;
+        else if (parentView->getInputPortIndex(connection->inputPort()) == 1)
+            tag = ParticleCoreShellItem::T_SHELL;
+        else if (connection->inputPort()->getPortType() == NodeEditorPort::TRANSFORMATION)
+            tag = ParticleItem::T_TRANSFORMATION;
+
+    } else if (connection->getParentView()->getItem()->modelType() == Constants::ParticleCompositionType) {
+        if (connection->inputPort()->getPortType() == NodeEditorPort::TRANSFORMATION)
+            tag = ParticleItem::T_TRANSFORMATION;
+    }
+    qDebug() << "onEstablishedConnection deleting just created connection";
+    delete connection; // deleting just created connection because it will be recreated from the
+                       // model
+    qDebug() << "onEstablishedConnection preparing to move";
+    m_sampleModel->moveParameterizedItem(childView->getItem(),
+                                         parentView->getItem(), -1, tag);
+}
+
+//! propagates break of connection between views on scene to the model
+void DesignerScene::removeConnection(NodeEditorConnection *connection)
+{
+    qDebug() << "DesignerScene::removeConnection()";
+    IView *childView = dynamic_cast<IView *>(connection->outputPort()->parentItem());
+    m_sampleModel->moveParameterizedItem(childView->getItem(), 0);
+}
+
+//! handles drag event
+//! LayerView can be dragged only over MultiLayerView
+//! MultiLayerView can be dragged both, over the scene and over another MultiLayerView
+void DesignerScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
+{
+    qDebug() << "DesignerScene::dragMoveEvent()";
+    const DesignerMimeData *mimeData = checkDragEvent(event);
+    if(isAcceptedByMultiLayer(mimeData, event)) {
+        QGraphicsScene::dragMoveEvent(event);
+
+    }
+}
+
+//! Hadles drop event
+//! LayerView can be dropped on MultiLayerView only
+//! MultiLayerView can be droped on the scene or another MultiLayerView
+void DesignerScene::dropEvent(QGraphicsSceneDragDropEvent *event)
+{
+    const DesignerMimeData *mimeData = checkDragEvent(event);
+    qDebug() << "DesignerScene::dropEvent()" << mimeData;
+    if (mimeData) {
+
+        // to have possibility to drop MultiLayer on another MultiLayer
+        // * edit function DesignerScene::isAcceptedByMultiLayer
+        // * edit MultiLayerItem for addToValidChildren
+        // * remove method MultiLayerView::itemChange
+
+        if(isAcceptedByMultiLayer(mimeData, event)) {
+            // certain views can be dropped on MultiLayer and so will be processed there
+            QGraphicsScene::dropEvent(event);
+
+        } else {
+            // other views can be dropped on canvas anywhere
+            qDebug() << "DesignerScene::dropEvent() -> about to drop";
+            if (SampleViewFactory::isValidType(mimeData->getClassName())) {
+
+                SessionItem *new_item(0);
+                if (mimeData->getClassName().startsWith(Constants::FormFactorType)) {
+                    new_item = m_sampleModel->insertNewItem(Constants::ParticleType);
+                    QString ffName = mimeData->getClassName();
+                    ffName.remove(Constants::FormFactorType);
+                    new_item->setGroupProperty(ParticleItem::P_FORM_FACTOR, ffName);
+
+                } else {
+                    new_item = m_sampleModel->insertNewItem(mimeData->getClassName());
+                }
+
+                // propagating drop coordinates to SessionItem
+                QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(new_item->modelType());
+                new_item->setItemValue(SessionGraphicsItem::P_XPOS,
+                                                event->scenePos().x() - boundingRect.width() / 2);
+                new_item->setItemValue(SessionGraphicsItem::P_YPOS,
+                                                event->scenePos().y() - boundingRect.height() / 2);
+
+            } else if (GUIExamplesFactory::isValidExampleName(mimeData->getClassName())) {
+                SessionItem *topItem = GUIExamplesFactory::createSampleItems(
+                    mimeData->getClassName(), m_sampleModel);
+                QRectF boundingRect = DesignerHelper::getDefaultBoundingRect(topItem->modelType());
+                QPointF reference(event->scenePos().x() - boundingRect.width() / 2,
+                                  event->scenePos().y() - boundingRect.height() / 2);
+                m_aligner->alignSample(topItem, reference, true);
+            }
+            adjustSceneRect();
+        }
+    }
+}
+
+//! returns proper MimeData if the object can be hadled by graphics scene
+const DesignerMimeData *DesignerScene::checkDragEvent(QGraphicsSceneDragDropEvent *event)
+{
+    const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData());
+    if (!mimeData) {
+        event->ignore();
+        return 0;
+    }
+    event->setAccepted(true);
+    return mimeData;
+}
+
+void DesignerScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(isLayerDragged()) {
+        invalidate(); // to redraw vertical dashed line which denotes where to drag the layer
+    }
+    QGraphicsScene::mouseMoveEvent(event);
+}
+
+//! Returns true if there is MultiLayerView nearby during drag event.
+bool DesignerScene::isMultiLayerNearby(QGraphicsSceneDragDropEvent *event)
+{
+    QRectF rect = DesignerHelper::getDefaultMultiLayerRect();
+    rect.moveCenter(event->scenePos());
+    foreach (QGraphicsItem *item, items(rect)) {
+        if (item->type() == DesignerHelper::MULTILAYER)
+            return true;
+    }
+    return false;
+}
+
+void DesignerScene::adjustSceneRect()
+{
+    QRectF boundingRect = itemsBoundingRect();
+    if (sceneRect().contains(boundingRect))
+        return;
+
+    boundingRect.adjust(20.0, 20.0, 20.0, 20.0);
+    setSceneRect(sceneRect().united(boundingRect));
+}
+
+bool DesignerScene::isAcceptedByMultiLayer(const DesignerMimeData *mimeData, QGraphicsSceneDragDropEvent *event)
+{
+    if(!mimeData) return false;
+
+//    // MultiLayer can be inserted in MultiLayer
+//    if (mimeData->getClassName() == Constants::MultiLayerType && isMultiLayerNearby(event)) {
+//        return true;
+//    }
+
+    // layer can be inserted in MultiLayer
+    if (mimeData->getClassName() == Constants::LayerType && isMultiLayerNearby(event)) {
+        return true;
+    }
+    return false;
+}
+
+bool DesignerScene::isLayerDragged() const
+{
+    ILayerView *layer = dynamic_cast<ILayerView *>(mouseGrabberItem());
+    if (layer && !m_layer_interface_line.isNull()) {
+        return true;
+    }
+    return false;
+}
+
+void DesignerScene::onSmartAlign()
+{
+    m_aligner->smartAlign();
+}
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerScene.h b/GUI/coregui/Views/SampleDesigner/DesignerScene.h
new file mode 100644
index 0000000..8387330
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerScene.h
@@ -0,0 +1,120 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerScene.h
+//! @brief     Defines class DesignerScene
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DESIGNERSCENE_H
+#define DESIGNERSCENE_H
+
+#include "WinDllMacros.h"
+#include <QGraphicsScene>
+#include <QMap>
+#include <QModelIndex>
+
+class InstrumentModel;
+class SampleModel;
+class SessionItem;
+class SessionGraphicsItem;
+class QItemSelectionModel;
+class IView;
+class QItemSelection;
+class NodeEditorConnection;
+class DesignerMimeData;
+class SampleViewAligner;
+class NodeEditor;
+class FilterPropertyProxy;
+
+
+//! Main class which represents SessionModel on graphics scene
+class BA_CORE_API_ DesignerScene : public QGraphicsScene
+{
+    Q_OBJECT
+
+public:
+    explicit DesignerScene(QObject *parent = 0);
+    virtual ~DesignerScene();
+
+    void setSampleModel(SampleModel *sampleModel);
+    void setInstrumentModel(InstrumentModel *instrumentModel);
+    void setSelectionModel(QItemSelectionModel *model, FilterPropertyProxy *proxy);
+
+    SampleModel *getSampleModel() { return m_sampleModel; }
+
+    IView *getViewForItem(SessionItem *item);
+
+    NodeEditor *getNodeEditor() { return m_nodeEditor;}
+
+signals:
+    void selectionModeChangeRequest(int);
+
+public slots:
+    void onSceneSelectionChanged();
+    void onSessionSelectionChanged(const QItemSelection &, const QItemSelection &);
+    void resetScene();
+    void updateScene();
+
+    void onRowsInserted(const QModelIndex &parent, int first, int last);
+    void onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
+    void onRowsRemoved(const QModelIndex &parent, int first, int last);
+
+    void setLayerInterfaceLine(const QLineF &line=QLineF()) { m_layer_interface_line = line; }
+
+    void deleteSelectedItems();
+
+    void onEstablishedConnection(NodeEditorConnection *); // to process signals from NodeEditor
+    void removeConnection(NodeEditorConnection *);
+
+    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
+    void dropEvent(QGraphicsSceneDragDropEvent *event);
+
+    void onSmartAlign();
+
+
+protected:
+    void drawForeground(QPainter* painter, const QRectF& rect);
+    const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+
+private:
+
+    IView *addViewForItem(SessionItem *item);
+    void updateViews(const QModelIndex &parentIndex = QModelIndex(), IView *parentView = 0);
+    void deleteViews(const QModelIndex & parentIndex);
+    void alignViews();
+    void removeItemViewFromScene(SessionItem *item);
+    bool isMultiLayerNearby(QGraphicsSceneDragDropEvent *event);
+    void adjustSceneRect();
+    bool isAcceptedByMultiLayer(const DesignerMimeData *mimeData, QGraphicsSceneDragDropEvent *event);
+    bool isLayerDragged() const;
+
+    SampleModel *m_sampleModel;
+    InstrumentModel *m_instrumentModel;
+    QItemSelectionModel *m_selectionModel;
+    FilterPropertyProxy *m_proxy;
+    bool m_block_selection;
+
+    QMap<SessionItem *, IView *> m_ItemToView;
+    //!< Correspondance of model's item and scene's view
+
+    QLineF m_layer_interface_line;
+    //!< Foreground line representing appropriate interface during layer's movement
+
+    SampleViewAligner *m_aligner;
+
+    NodeEditor *m_nodeEditor;
+};
+
+
+#endif // DESIGNERSCENE_H
+
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerView.cpp b/GUI/coregui/Views/SampleDesigner/DesignerView.cpp
new file mode 100644
index 0000000..bf564cd
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerView.cpp
@@ -0,0 +1,142 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerView.cpp
+//! @brief     Implements class DesignerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "DesignerView.h"
+#include "DesignerHelper.h"
+#include "DesignerMimeData.h"
+#include "DesignerScene.h"
+#include "GUIHelpers.h"
+#include <QDebug>
+#include <QDragEnterEvent>
+#include <QGraphicsScene>
+#include <QGraphicsView>
+#include <QMimeData>
+#include <QShortcut>
+#include <QVBoxLayout>
+
+DesignerView::DesignerView(QGraphicsScene *scene, QWidget *parent) : QGraphicsView(scene, parent)
+{
+    setAcceptDrops(true);
+    setRenderHint(QPainter::Antialiasing);
+    setMouseTracking(true);
+    setDragMode(QGraphicsView::RubberBandDrag);
+}
+
+int DesignerView::getSelectionMode() const
+{
+    if (dragMode() == QGraphicsView::NoDrag) {
+        return SIMPLE_SELECTION;
+    } else if (dragMode() == QGraphicsView::RubberBandDrag) {
+        return RUBBER_SELECTION;
+    } else if (dragMode() == QGraphicsView::ScrollHandDrag) {
+        return HAND_DRAG;
+    } else {
+        throw GUIHelpers::Error("DesignerView::getSelectionMode() -> Error.");
+    }
+}
+
+void DesignerView::onSelectionMode(int mode)
+{
+    switch (mode) {
+    case SIMPLE_SELECTION:
+        setDragMode(QGraphicsView::NoDrag);
+        setInteractive(true);
+        emit selectionModeChanged(SIMPLE_SELECTION);
+        break;
+    case RUBBER_SELECTION:
+        setDragMode(QGraphicsView::RubberBandDrag);
+        setInteractive(true);
+        emit selectionModeChanged(RUBBER_SELECTION);
+        break;
+    case HAND_DRAG:
+        setDragMode(QGraphicsView::ScrollHandDrag);
+        setInteractive(false);
+        emit selectionModeChanged(HAND_DRAG);
+        break;
+    default:
+        break;
+    }
+}
+
+void DesignerView::onCenterView()
+{
+    // fitInView(scene()->itemsBoundingRect() ,Qt::KeepAspectRatio);
+    centerOn(scene()->itemsBoundingRect().center());
+}
+
+void DesignerView::onChangeScale(double new_scale)
+{
+    qDebug() << "DesignerView::onScaleChanged()" << new_scale;
+    QMatrix oldMatrix = matrix();
+    resetMatrix();
+    translate(oldMatrix.dx(), oldMatrix.dy());
+    scale(new_scale, new_scale);
+    DesignerHelper::setZoomLevel(new_scale);
+}
+
+void DesignerView::deleteSelectedItems()
+{
+    DesignerScene *designerScene = dynamic_cast<DesignerScene *>(scene());
+    Q_ASSERT(designerScene);
+    designerScene->deleteSelectedItems();
+}
+
+void DesignerView::zoomIn()
+{
+    qDebug() << "DesignerView::zoomIn() -> Not implemented";
+}
+
+void DesignerView::zoomOut()
+{
+    qDebug() << "DesignerView::zoomOut() -> Not implemented";
+}
+
+void DesignerView::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key()) {
+    case Qt::Key_Left:
+        break;
+    case Qt::Key_Space:
+        if (getSelectionMode() != HAND_DRAG && !event->isAutoRepeat()) {
+            onSelectionMode(HAND_DRAG);
+            qDebug() << "  space pressed" << event->isAutoRepeat();
+        }
+        break;
+    case Qt::Key_Delete:
+        deleteSelectedItems();
+        break;
+    case Qt::Key_Backspace:
+        deleteSelectedItems();
+        break;
+    default:
+        QWidget::keyPressEvent(event);
+    }
+}
+
+void DesignerView::keyReleaseEvent(QKeyEvent *event)
+{
+    switch (event->key()) {
+    case Qt::Key_Space:
+
+        if (getSelectionMode() != RUBBER_SELECTION && !event->isAutoRepeat()) {
+            onSelectionMode(RUBBER_SELECTION);
+            qDebug() << "  space released" << event->isAutoRepeat();
+        }
+        break;
+    default:
+        QWidget::keyPressEvent(event);
+    }
+}
diff --git a/GUI/coregui/Views/SampleDesigner/DesignerView.h b/GUI/coregui/Views/SampleDesigner/DesignerView.h
new file mode 100644
index 0000000..f90628d
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/DesignerView.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/DesignerView.h
+//! @brief     Defines class DesignerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef DESIGNERVIEW_H
+#define DESIGNERVIEW_H
+
+#include "WinDllMacros.h"
+#include<QGraphicsView>
+
+class QGraphicsView;
+class QGraphicsScene;
+class QDragEnterEvent;
+class QWheelEvent;
+class QKeyEvent;
+
+//! The DesignerView class provides widget for displaying the contents of DesignerScene
+//!
+//! Belongs to SampleDesigner
+//! Currently contains logic for zooming, deleting objects
+class BA_CORE_API_ DesignerView : public QGraphicsView
+{
+    Q_OBJECT
+
+public:
+
+    explicit DesignerView(QGraphicsScene *scene, QWidget *parent = 0);
+    virtual ~DesignerView(){}
+
+    enum ESelectionModes { SIMPLE_SELECTION, RUBBER_SELECTION, HAND_DRAG};
+    int getSelectionMode() const;
+
+signals:
+    void selectionModeChanged(int);
+
+public slots:
+    void onSelectionMode(int);
+    void onCenterView();
+    void onChangeScale(double);
+    void deleteSelectedItems();
+
+    void zoomIn();
+    void zoomOut();
+
+
+protected:
+//    void wheelEvent(QWheelEvent *event);
+//    void scaleView(qreal scaleFactor);
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+
+
+};
+
+#endif // DESIGNERVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/ILayerView.cpp b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
new file mode 100644
index 0000000..79d3cf8
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ILayerView.cpp
@@ -0,0 +1,244 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ILayerView.cpp
+//! @brief     Implements class ILayerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ILayerView.h"
+#include "DesignerHelper.h"
+#include "DesignerScene.h"
+#include "GUIHelpers.h"
+#include "LayerItem.h"
+#include "MaterialProperty.h"
+#include "MultiLayerView.h"
+#include "SampleModel.h"
+#include "SessionItem.h"
+#include <QDebug>
+#include <QGraphicsSceneMouseEvent>
+
+QLineF MultiLayerCandidate::getInterfaceToScene()
+{
+    Q_ASSERT(multilayer);
+    QLineF line = multilayer->getInterfaceLine(row);
+    if(line.length() != 0) {
+        QPointF p1(multilayer->mapToScene(line.p1()));
+        QPointF p2(multilayer->mapToScene(line.p2()));
+        const int prolongation = 10.0;
+        return QLineF(p1.x() -prolongation, p1.y(), p2.x()+prolongation, p2.y());
+    }
+
+    return QLineF();
+}
+
+bool MultiLayerCandidate::operator<(const MultiLayerCandidate &cmp) const
+{
+    return cmp.distance < distance;
+}
+
+ILayerView::ILayerView(QGraphicsItem *parent) : ConnectableView(parent)
+{
+    setFlag(QGraphicsItem::ItemIsMovable, true);
+    setFlag(QGraphicsItem::ItemIsSelectable, true);
+    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
+}
+
+//! Propagates change of 'Thickness' dynamic property to screen thickness of ILayerView.
+void ILayerView::onPropertyChange(const QString &propertyName)
+{
+    if (propertyName == LayerItem::P_THICKNESS) {
+        updateHeight();
+    } else if (propertyName == LayerItem::P_MATERIAL) {
+        updateColor();
+    }
+
+    IView::onPropertyChange(propertyName);
+}
+
+void ILayerView::updateHeight()
+{
+    if(m_item->isTag(LayerItem::P_THICKNESS)) {
+        m_rect.setHeight(DesignerHelper::nanometerToScreen(
+            m_item->getItemValue(LayerItem::P_THICKNESS).toDouble()));
+        setPortCoordinates();
+        update();
+        emit heightChanged();
+    }
+}
+
+void ILayerView::updateColor()
+{
+    if(m_item->isTag(LayerItem::P_MATERIAL)) {
+        QVariant v = m_item->getItemValue(LayerItem::P_MATERIAL);
+        if (v.isValid()) {
+            MaterialProperty mp = v.value<MaterialProperty>();
+            setColor(mp.getColor());
+            update();
+        } else {
+            Q_ASSERT(0);
+        }
+    }
+}
+
+//! Detects movement of the ILayerView and sends possible drop areas to GraphicsScene
+//! for visualization.
+QVariant ILayerView::itemChange(GraphicsItemChange change, const QVariant &value)
+{
+    if (change == ItemPositionChange && scene()) {
+
+        MultiLayerCandidate multilayerCandidate = getMultiLayerCandidate();
+        if (multilayerCandidate) {
+            DesignerScene *designerScene = dynamic_cast<DesignerScene *>(scene());
+            designerScene->setLayerInterfaceLine(multilayerCandidate.getInterfaceToScene());
+        }
+    }
+    return QGraphicsItem::itemChange(change, value);
+}
+
+void ILayerView::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    if (event->button() == Qt::LeftButton) {
+        m_drag_start_position = pos();
+    }
+    QGraphicsItem::mousePressEvent(event);
+}
+
+//! Detects possible MultiLayerView's to drop given ILayerView and propagate
+//! request to SessionModel.
+void ILayerView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    qDebug() << "ILayerView::mouseReleaseEvent()  this:" << this
+             << getItem()->itemName() << " parentItem: " << parentItem();
+
+    DesignerScene *designerScene = dynamic_cast<DesignerScene *>(scene());
+    Q_ASSERT(designerScene);
+    designerScene->setLayerInterfaceLine(); // removing drop area hint from the scene
+
+    if (QLineF(m_drag_start_position, pos()).length() == 0) {
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
+
+    MultiLayerCandidate candidate = getMultiLayerCandidate();
+    MultiLayerView *requested_parent = candidate.multilayer;
+    int requested_row = candidate.row;
+
+//    qDebug() << "ILayerView::mouseReleaseEvent()  requested_parent:" << requested_parent
+//             << " requested_row:" << requested_row;
+
+    // Simple move of lonely layer across the scene: let it be.
+    if (requested_parent == 0 && parentItem() == 0) {
+        qDebug() << "ILayerView::mouseReleaseEvent() simple move of lonely layer";
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
+
+    // Layer was moved on top of MultiLayer but not in the right drop area:
+    // returning layer back to starting position.
+    if (requested_parent && requested_row == -1) {
+        qDebug() << "1.1 Layer->MultiLayer, wrong drop area.";
+        setPos(m_drag_start_position);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
+
+    SampleModel *model = designerScene->getSampleModel();
+
+    // Layer was moved only slightly, to the same row of his own MultiLayer: returning back.
+    if (requested_parent == parentItem()
+        && requested_row == getItem()->parent()->getItems().indexOf(getItem())) {
+        qDebug() << "1.2 Layer->MultiLayer (same), same drop area";
+        setPos(m_drag_start_position);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
+
+    // Layer was moved from MultiLayer it belongs to, to an empty place of
+    // the scene: changing ownership.
+    if (parentItem() && !requested_parent) {
+        qDebug() << "1.3 Layer->Scene";
+        QPointF newPos = mapToScene(event->pos()) - event->pos();
+//        setPos(newPos);
+        this->getItem()->setItemValue(SessionGraphicsItem::P_XPOS, newPos.x());
+        this->getItem()->setItemValue(SessionGraphicsItem::P_YPOS, newPos.y());
+
+        model->moveParameterizedItem(this->getItem(), 0);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
+
+    // Layer was moved either from one MultiLayer to another, or is moved inside
+    // one multilayer: changing ownership or row within same ownership.
+    if (requested_parent) {
+        qDebug() << "1.4 ILayerView->MultiLayer";
+        model->moveParameterizedItem(this->getItem(),
+                                     requested_parent->getItem(), requested_row);
+        QGraphicsItem::mouseReleaseEvent(event);
+        return;
+    }
+
+    // should not be here
+    throw GUIHelpers::Error("LayerView::mouseReleaseEvent() -> Loggic error.");
+}
+
+void ILayerView::update_appearance()
+{
+    updateHeight();
+    updateColor();
+    ConnectableView::update_appearance();
+}
+
+//! Finds candidate (another MultiLayer) into which we will move our ILayerView.
+//!
+//! To become the candidate, the bounding rectangles of MultiLayerView and given
+//! ILayerView should intersects and ILayerView center should be near appropriate
+//! drop area. If more than one candidate is found, they will be sorted according
+//! to the distance between drop area and ILayerVIew center
+MultiLayerCandidate ILayerView::getMultiLayerCandidate()
+{
+    // qDebug() << "ILayerView::getMultiLayerCandidate()";
+
+    QVector<MultiLayerCandidate> candidates;
+
+    QRectF layerRect = mapRectToScene(boundingRect());
+    foreach (QGraphicsItem *item, scene()->items()) {
+        if (item->type() == DesignerHelper::MULTILAYER && item != this
+            && !childItems().contains(item)) {
+            MultiLayerView *multilayer = qgraphicsitem_cast<MultiLayerView *>(item);
+            if (multilayer->mapRectToScene(multilayer->boundingRect()).intersects(layerRect)) {
+                MultiLayerCandidate candidate;
+
+                // calculate row number to drop ILayerView and distance to the nearest droping area
+                int row = multilayer->getDropArea(multilayer->mapFromScene(layerRect.center()));
+                QRectF droparea = multilayer->mapRectToScene(multilayer->getDropAreaRectangle(row));
+                int distance = std::abs(droparea.center().y() - layerRect.center().y());
+
+                candidate.multilayer = multilayer;
+                candidate.row = row;
+                candidate.distance = distance;
+                candidates.push_back(candidate);
+            }
+        }
+    }
+
+    // sorting MultiLayerView candidates to find one whose drop area is closer
+    if (candidates.size()) {
+        qSort(candidates.begin(), candidates.end());
+        // foreach(MultiLayerCandidate candidate, candidates) {
+        //    qDebug() << "ILayerView::getMultiLayerCandidate() -> " << candidate.multilayer <<
+        //    candidate.distance << candidate.row;
+        //}
+
+        return candidates.back();
+    }
+    return MultiLayerCandidate();
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ILayerView.h b/GUI/coregui/Views/SampleDesigner/ILayerView.h
new file mode 100644
index 0000000..0e549bf
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ILayerView.h
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ILayerView.h
+//! @brief     Defines class ILayerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ILAYERVIEW_H
+#define ILAYERVIEW_H
+
+#include "ConnectableView.h"
+
+class MultiLayerView;
+class MultiLayerCandidate;
+
+//! Base class for LayerView and MultiLayerView
+//! Provides functionality for moving view on top of MultiLayer.
+class BA_CORE_API_ ILayerView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    ILayerView(QGraphicsItem *parent = 0);
+
+    enum { TYPE = DesignerHelper::LAYER };
+
+    int type() const { return TYPE; }
+
+    virtual QString getLabel() const { return QString(); }
+
+protected:
+    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+    void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+    void update_appearance();
+
+public slots:
+    void onPropertyChange(const QString &propertyName);
+
+private:
+    void updateHeight();
+    void updateColor();
+
+    MultiLayerCandidate getMultiLayerCandidate();
+    QPointF m_drag_start_position;
+};
+
+
+//! Class to hold MultiLayer candidate for dropping LayerView.
+class MultiLayerCandidate
+{
+public:
+    MultiLayerCandidate() : multilayer(0), row(-1), distance(0){}
+    MultiLayerView *multilayer; //!< pointer to the candidate
+    int row; //!< requested row number to drop in
+    int distance; //!< distance from given ILayerView and drop area
+    bool operator< (const MultiLayerCandidate& cmp) const;
+    operator bool() const { return bool(multilayer); }
+    //! returns line representing interface of multilayer in scene coordinates
+    QLineF getInterfaceToScene();
+};
+
+
+#endif // ILAYERVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/IView.cpp b/GUI/coregui/Views/SampleDesigner/IView.cpp
new file mode 100644
index 0000000..e457c6a
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/IView.cpp
@@ -0,0 +1,102 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/IView.cpp
+//! @brief     Implements class IView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IView.h"
+#include "ModelMapper.h"
+#include "SessionGraphicsItem.h"
+#include <QDebug>
+#include <QString>
+
+IView::IView(QGraphicsItem *parent) : QGraphicsObject(parent), m_item(0)
+{
+    connect(this, SIGNAL(xChanged()), this, SLOT(onChangedX()));
+    connect(this, SIGNAL(yChanged()), this, SLOT(onChangedY()));
+}
+
+IView::~IView()
+{
+    if(m_item)
+        m_item->mapper()->unsubscribe(this);
+}
+
+void IView::setParameterizedItem(SessionItem *item)
+{
+    Q_ASSERT(item);
+    Q_ASSERT(m_item == nullptr);
+
+    m_item = item;
+    setX(m_item->getItemValue(SessionGraphicsItem::P_XPOS).toReal());
+    setY(m_item->getItemValue(SessionGraphicsItem::P_YPOS).toReal());
+
+    m_item->mapper()->setOnPropertyChange(
+                [this] (const QString &name)
+    {
+        onPropertyChange(name);
+    }, this);
+
+    m_item->mapper()->setOnSiblingsChange(
+                [this]()
+    {
+         onSiblingsChange();
+    }, this);
+
+    m_item->mapper()->setOnItemDestroy(
+                [this](SessionItem *) {
+        m_item = 0;
+    }, this);
+
+
+    update_appearance();
+}
+
+void IView::addView(IView *, int )
+{
+}
+
+void IView::onChangedX()
+{
+    if(!m_item)
+        return;
+    m_item->setItemValue(SessionGraphicsItem::P_XPOS, x());
+}
+
+void IView::onChangedY()
+{
+    if(!m_item)
+        return;
+    m_item->setItemValue(SessionGraphicsItem::P_YPOS, y());
+}
+
+//! updates visual appearance of the item (color, icons, size etc)
+void IView::update_appearance()
+{
+    update();
+}
+
+void IView::onPropertyChange(const QString &propertyName)
+{
+    Q_ASSERT(m_item);
+    if (propertyName == SessionGraphicsItem::P_XPOS) {
+        setX(m_item->getItemValue(SessionGraphicsItem::P_XPOS).toReal());
+    } else if (propertyName == SessionGraphicsItem::P_YPOS) {
+        setY(m_item->getItemValue(SessionGraphicsItem::P_YPOS).toReal());
+    }
+}
+
+void IView::onSiblingsChange()
+{
+    update_appearance();
+}
diff --git a/GUI/coregui/Views/SampleDesigner/IView.h b/GUI/coregui/Views/SampleDesigner/IView.h
new file mode 100644
index 0000000..259e52f
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/IView.h
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/IView.h
+//! @brief     Defines class IView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IVIEW_H
+#define IVIEW_H
+
+#include "DesignerHelper.h"
+#include <QGraphicsObject>
+#include <memory>
+
+class SessionItem;
+
+//! parent class for graphic representation of all ISample's
+class BA_CORE_API_ IView : public QGraphicsObject
+{
+    Q_OBJECT
+public:
+    enum { TYPE = DesignerHelper::IVIEW };
+
+    IView(QGraphicsItem *parent = 0);
+    virtual ~IView();
+
+    int type() const;
+
+    virtual void setParameterizedItem(SessionItem *item);
+
+    virtual SessionItem *getItem();
+
+    virtual void addView(IView *childView, int row = 0);
+
+signals:
+    void aboutToBeDeleted();
+
+public slots:
+    virtual void onChangedX();
+    virtual void onChangedY();
+
+protected:
+    virtual void update_appearance();
+    virtual void onPropertyChange(const QString &propertyName);
+    virtual void onSiblingsChange();
+
+    SessionItem *m_item;
+};
+
+inline int IView::type() const
+{
+    return TYPE;
+}
+
+inline SessionItem *IView::getItem()
+{
+    return m_item;
+}
+
+#endif // IVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.cpp b/GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.cpp
new file mode 100644
index 0000000..4614f62
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.cpp
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.cpp
+//! @brief     Implements classes InterferenceFunctionViews
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "InterferenceFunctionViews.h"
+#include "DesignerHelper.h"
+#include "item_constants.h"
+
+
+InterferenceFunctionRadialParaCrystalView::InterferenceFunctionRadialParaCrystalView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::InterferenceFunctionRadialParaCrystalType);
+    setColor(QColor(255, 236, 139));
+    setRectangle( DesignerHelper::getDefaultBoundingRect(getName()) );
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::INTERFERENCE);
+    m_roundpar = 3;
+}
+
+InterferenceFunction2DParaCrystalView::InterferenceFunction2DParaCrystalView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::InterferenceFunction2DParaCrystalType);
+    setColor(QColor(255, 236, 139));
+    setRectangle( DesignerHelper::getDefaultBoundingRect(getName()) );
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::INTERFERENCE);
+    m_roundpar = 3;
+}
+
+InterferenceFunction1DLatticeView::InterferenceFunction1DLatticeView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::InterferenceFunction1DLatticeType);
+    setColor(QColor(255, 236, 139));
+    setRectangle( DesignerHelper::getDefaultBoundingRect(getName()) );
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::INTERFERENCE);
+    m_roundpar = 3;
+}
+
+InterferenceFunction2DLatticeView::InterferenceFunction2DLatticeView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::InterferenceFunction2DLatticeType);
+    setColor(QColor(255, 236, 139));
+    setRectangle( DesignerHelper::getDefaultBoundingRect(getName()) );
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::INTERFERENCE);
+    m_roundpar = 3;
+}
diff --git a/GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.h b/GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.h
new file mode 100644
index 0000000..703ae27
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.h
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/InterferenceFunctionViews.h
+//! @brief     Defines classes InterferenceFunctionViews
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef INTERFERENCEFUNCTIONVIEWS_H
+#define INTERFERENCEFUNCTIONVIEWS_H
+
+
+#include "ConnectableView.h"
+
+class BA_CORE_API_ InterferenceFunctionRadialParaCrystalView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::INTERFERENCE_FUNCTION_RADIAL_PARA };
+
+    InterferenceFunctionRadialParaCrystalView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+};
+
+
+class BA_CORE_API_ InterferenceFunction2DParaCrystalView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::INTERFERENCE_FUNCTION_2D_PARA };
+
+    InterferenceFunction2DParaCrystalView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+};
+
+class BA_CORE_API_ InterferenceFunction1DLatticeView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::INTERFERENCE_FUNCTION_1D_LATTICE };
+
+    InterferenceFunction1DLatticeView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+};
+
+class BA_CORE_API_ InterferenceFunction2DLatticeView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::INTERFERENCE_FUNCTION_2D_LATTICE };
+
+    InterferenceFunction2DLatticeView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+};
+
+#endif // INTERFERENCEFUNCTIONVIEWS_H
diff --git a/GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp b/GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp
new file mode 100644
index 0000000..e7a5685
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ItemTreeView.cpp
+//! @brief     Implements class ItemTreeView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemTreeView.h"
+#include "GUIHelpers.h"
+#include "SessionModel.h"
+#include <QDragMoveEvent>
+#include <QMimeData>
+
+ItemTreeView::ItemTreeView(QWidget *parent)
+    : QTreeView(parent)
+{
+
+    setAllColumnsShowFocus(true);
+    setWindowTitle(QString("Sample Tree View"));
+    setObjectName(QString("ObjectTree"));
+    setContextMenuPolicy(Qt::CustomContextMenu);
+    setDragDropMode(QAbstractItemView::InternalMove);
+}
+
+ItemTreeView::~ItemTreeView()
+{
+}
+
+void ItemTreeView::dragMoveEvent(QDragMoveEvent *event)
+{
+    QTreeView::dragMoveEvent(event);
+    SessionModel *model = static_cast<SessionModel *>(this->model());
+    model->setDraggedItemType(QString());
+    QByteArray xml_data = qUncompress(
+                event->mimeData()->data(SessionXML::ItemMimeType));
+    QXmlStreamReader reader(xml_data);
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.isStartElement()) {
+            if (reader.name() == SessionXML::ItemTag) {
+                const QString model_type = reader.attributes()
+                        .value(SessionXML::ModelTypeAttribute).toString();
+                model->setDraggedItemType(model_type);
+                break;
+            }
+        }
+    }
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ItemTreeView.h b/GUI/coregui/Views/SampleDesigner/ItemTreeView.h
new file mode 100644
index 0000000..59ff347
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ItemTreeView.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ItemTreeView.h
+//! @brief     Defines class ItemTreeView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMTREEVIEW_H
+#define ITEMTREEVIEW_H
+
+#include "WinDllMacros.h"
+#include <QTreeView>
+
+class BA_CORE_API_ ItemTreeView : public QTreeView
+{
+    Q_OBJECT
+public:
+    explicit ItemTreeView(QWidget *parent=0);
+    virtual ~ItemTreeView();
+
+protected:
+#ifndef QT_NO_DRAGANDDROP
+    virtual void dragMoveEvent(QDragMoveEvent *event);
+#endif
+};
+
+
+#endif // ITEMTREEVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/LayerView.cpp b/GUI/coregui/Views/SampleDesigner/LayerView.cpp
new file mode 100644
index 0000000..9d48eef
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/LayerView.cpp
@@ -0,0 +1,77 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/LayerView.cpp
+//! @brief     Implements class LayerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "LayerView.h"
+#include "LayerItem.h"
+#include "MaterialProperty.h"
+#include "MultiLayerView.h"
+#include "ParticleLayoutView.h"
+#include "SessionItem.h"
+#include "tooltipdatabase.h"
+#include <QDebug>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+
+
+
+LayerView::LayerView(QGraphicsItem *parent)
+    : ILayerView(parent)
+{
+    setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256) );
+    setName(Constants::LayerType);
+    setRectangle(DesignerHelper::getDefaultBoundingRect(Constants::LayerType));
+    //setToolTip(QString("%1\n%2").arg("Layer").arg("A layer with thickness and material.\nCan be connected with ParticleLayout."));
+    setToolTip(ToolTipDataBase::getSampleViewDesignerToolTip(Constants::LayerType));
+    setAcceptDrops(false);
+    addPort(QString(), NodeEditorPort::INPUT, NodeEditorPort::PARTICLE_LAYOUT);
+}
+
+LayerView::~LayerView()
+{
+    qDebug() << "LayerView::~LayerView()";
+    // FIXME replace with onChildrenChange callback from MultiLayerItem's model mapper.
+//    MultiLayerView *mlView = dynamic_cast<MultiLayerView *>(parentItem());
+//    if(mlView) {
+//        mlView->removeLayer(this);
+//    }
+}
+
+
+void LayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+    Q_UNUSED(widget);
+
+    painter->setPen(Qt::black);
+    if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) {
+        painter->setPen(Qt::DashLine);
+    }
+    painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) );
+    painter->drawRect(getRectangle());
+}
+
+
+void LayerView::addView(IView *childView, int /* row */)
+{
+    qDebug() << "LayerView::addView() " << m_item->itemName() << childView->getItem()->itemName();
+    ParticleLayoutView *layout = dynamic_cast<ParticleLayoutView *>(childView);
+    Q_ASSERT(layout);
+    connectInputPort(layout, 0);
+}
+
+//QVariant LayerView::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+//{
+//    return QGraphicsItem::itemChange(change, value);
+//}
diff --git a/GUI/coregui/Views/SampleDesigner/LayerView.h b/GUI/coregui/Views/SampleDesigner/LayerView.h
new file mode 100644
index 0000000..4987d40
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/LayerView.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/LayerView.h
+//! @brief     Defines class LayerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef LAYERVIEW_H
+#define LAYERVIEW_H
+
+#include "ILayerView.h"
+
+//! Class that represents view of Layer
+class BA_CORE_API_ LayerView : public ILayerView
+{
+    Q_OBJECT
+public:
+    enum { TYPE = DesignerHelper::LAYER };
+
+    LayerView(QGraphicsItem *parent = 0);
+    virtual ~LayerView();
+
+    virtual int type() const { return TYPE; }
+
+    virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+
+    virtual void addView(IView *childView, int row = 0); // to add ParticleLayout
+};
+
+#endif // LAYERVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
new file mode 100644
index 0000000..3edb2fd
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
@@ -0,0 +1,289 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/MultiLayerView.cpp
+//! @brief     Implements class MultiLayerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MultiLayerView.h"
+#include "DesignerHelper.h"
+#include "DesignerMimeData.h"
+#include "DesignerScene.h"
+#include "LayerView.h"
+#include "SampleModel.h"
+#include "SessionItem.h"
+#include <QDebug>
+#include <QGraphicsSceneMouseEvent>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+
+
+
+MultiLayerView::MultiLayerView(QGraphicsItem *parent)
+    : ILayerView(parent)
+{
+    setColor(QColor(Qt::blue));
+
+    //setRectangle(QRect(0, 0, DesignerHelper::getDefaultMultiLayerWidth(), DesignerHelper::getDefaultMultiLayerHeight()));
+    setRectangle(DesignerHelper::getDefaultBoundingRect(Constants::MultiLayerType));
+    setToolTip(Constants::MultiLayerType);
+    setAcceptHoverEvents(false);
+    setAcceptDrops(true);
+    connect(this, SIGNAL(childrenChanged()), this, SLOT(updateHeight()));
+    updateGeometry();
+}
+
+
+void MultiLayerView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+    Q_UNUSED(widget);
+    painter->setPen(m_color);
+    if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) {
+        painter->setPen(Qt::DashLine);
+    }
+    painter->setBrush(DesignerHelper::getLayerGradient(m_color, getRectangle() ) );
+    painter->drawRect(getRectangle());
+}
+
+
+void MultiLayerView::addView(IView *childView, int row)
+{
+    qDebug() << "MultiLayerView::addView() " << m_item->itemName() << childView->getItem()->itemName() << "row" << row;
+    ILayerView *layer = dynamic_cast<ILayerView *>(childView);
+    Q_ASSERT(layer);
+
+    if(!childItems().contains(layer)) {
+        addNewLayer(layer, row);
+    } else {
+        int previous_row = m_layers.indexOf(layer);
+        if(previous_row != row) {
+            m_layers.swap(previous_row, row);
+        }
+    }
+    updateGeometry();
+}
+
+
+void MultiLayerView::addNewLayer(ILayerView *layer, int row)
+{
+    qDebug() << "MultiLayerView::addNewLayer(), row" << row;
+    m_layers.insert(row, layer);
+    connect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()), Qt::UniqueConnection);
+    connect(layer, SIGNAL(aboutToBeDeleted()), this, SLOT(onLayerAboutToBeDeleted()), Qt::UniqueConnection);
+    layer->setParentItem(this);
+}
+
+
+void MultiLayerView::onLayerAboutToBeDeleted()
+{
+    qDebug() << "MultiLayerView::onLayerAboutToBeDeleted()";
+    ILayerView *layer = qobject_cast<ILayerView *>(sender());
+    Q_ASSERT(layer);
+    removeLayer(layer);
+}
+
+
+void MultiLayerView::removeLayer(ILayerView *layer)
+{
+    qDebug() << "MultiLayerView::removeLayer()";
+    Q_ASSERT(m_layers.contains(layer));
+    disconnect(layer, SIGNAL(heightChanged()), this, SLOT(updateHeight()) );
+    disconnect(layer, SIGNAL(aboutToBeDeleted()), this, SLOT(onLayerAboutToBeDeleted()) );
+    m_layers.removeOne(layer);
+    updateGeometry();
+}
+
+
+//! Updates geometry of MultiLayerView from current childs geometries.
+void MultiLayerView::updateGeometry()
+{
+    updateHeight();
+    updateWidth();
+}
+
+
+//! Updates MultiLayer height, sets y-positions of children, defines new drop areas.
+void MultiLayerView::updateHeight()
+{
+    qDebug() << "MultiLayerView::updateHeight()";
+
+    // drop areas are rectangles covering the area of layer interfaces
+    m_drop_areas.clear();
+    m_interfaces.clear();
+
+    bool is_nested_multilayer(false);
+    if( dynamic_cast<MultiLayerView *>(parentItem())) is_nested_multilayer = true;
+
+    int total_height = 0;
+    if(m_layers.size()) {
+        foreach(ILayerView *layer, m_layers) {
+            layer->setY(total_height);
+            layer->update();
+
+            qreal drop_area_height = layer->boundingRect().height()*0.5;
+            qreal drop_area_ypos = total_height - drop_area_height/2.;
+            if(total_height==0 && is_nested_multilayer) {
+                drop_area_height = drop_area_height/2.;
+                drop_area_ypos = total_height + drop_area_height/2.;
+            }
+
+            m_drop_areas.append(QRectF(0, drop_area_ypos, boundingRect().width(), drop_area_height));
+            m_interfaces.append(QLineF(m_rect.left(), total_height, m_rect.right(), total_height));
+            total_height += layer->boundingRect().height();
+        }
+        qreal drop_area_height = m_layers.back()->boundingRect().height()*0.5;
+        qreal drop_area_ypos = total_height - drop_area_height/2.;
+        if(is_nested_multilayer) {
+            drop_area_height = drop_area_height/2.;
+            drop_area_ypos = total_height - drop_area_height;
+        }
+
+        m_drop_areas.append(QRectF(0, drop_area_ypos, boundingRect().width(), drop_area_height));
+        m_interfaces.append(QLineF(m_rect.left(), total_height, m_rect.right(), total_height));
+    } else {
+        total_height = DesignerHelper::getDefaultMultiLayerHeight();
+        m_drop_areas.append(boundingRect());
+        m_interfaces.append(QLineF(m_rect.left(), m_rect.center().y(), m_rect.right(), m_rect.center().y()));
+    }
+
+    m_rect.setHeight(total_height);
+    update();
+    emit heightChanged();
+}
+
+
+//! Updates MultiLayerView width, sets x-positions of children.
+//! If list of children contains another MultiLayer, then width of given MultiLayer
+//! will be increased by 12%
+void MultiLayerView::updateWidth()
+{
+    const double wider_than_children(1.15);
+    double max_width(0);
+    foreach(ILayerView *layer, m_layers) {
+        if(layer->boundingRect().width() > max_width)
+            max_width = layer->boundingRect().width();
+    }
+    max_width *= wider_than_children;
+    if(max_width == 0) {
+        max_width = DesignerHelper::getDefaultMultiLayerWidth();
+    }
+
+    m_rect.setWidth(max_width);
+    update();
+
+    foreach(ILayerView *layer, m_layers) {
+        int xpos = ((boundingRect().width() - layer->boundingRect().width()))/2.;
+        layer->setX(xpos);
+        layer->update();
+    }
+
+    emit widthChanged();
+}
+
+
+//! Returns index of drop area for given coordinate.
+int MultiLayerView::getDropArea(QPointF pos)
+{
+    int area(-1);
+    for(int i=0; i<m_drop_areas.size(); ++i) {
+        if( m_drop_areas.at(i).contains(pos) ) {
+            area = i;
+            break;
+        }
+    }
+    return area;
+}
+
+
+//! Returns true if given coordinate is inside one of drop areas.
+bool MultiLayerView::isInDropArea(QPointF pos)
+{
+    foreach(QRectF rect, m_drop_areas) {
+        if (rect.contains(pos)) return true;
+    }
+    return false;
+}
+
+
+//! Returns drop area rectangle corresponding to given row
+QRectF MultiLayerView::getDropAreaRectangle(int row)
+{
+    if(row>=0 && row < m_drop_areas.size()) {
+        return m_drop_areas[row];
+    } else {
+        return QRectF();
+    }
+}
+
+
+//! Returns line representing interface
+QLineF MultiLayerView::getInterfaceLine(int row)
+{
+    if(row>=0 && row < m_interfaces.size()) {
+        return m_interfaces[row];
+    } else {
+        return QLineF();
+    }
+}
+
+void MultiLayerView::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
+{
+    if (!checkDragEvent(event))
+        QGraphicsItem::dragMoveEvent(event);
+}
+
+
+void MultiLayerView::dropEvent(QGraphicsSceneDragDropEvent *event)
+{
+    const DesignerMimeData *mimeData = checkDragEvent(event);
+    if (mimeData) {
+
+        DesignerScene *designerScene = dynamic_cast<DesignerScene *>(scene());
+        if(designerScene) {
+            SampleModel *sampleModel = designerScene->getSampleModel();
+
+            qDebug() << "\n XXX" << getDropArea(event->scenePos()) << event->scenePos();
+            sampleModel->insertNewItem(
+                        mimeData->getClassName(),
+                        sampleModel->indexOfItem(this->getItem()),
+                        getDropArea(event->pos())
+                        );
+        }
+    }
+}
+
+
+const DesignerMimeData *MultiLayerView::checkDragEvent(QGraphicsSceneDragDropEvent * event)
+{
+    const DesignerMimeData *mimeData = qobject_cast<const DesignerMimeData *>(event->mimeData());
+    if (!mimeData) {
+        event->ignore();
+        return 0;
+    }
+
+    int row = getDropArea(event->pos());
+    if(mimeData->hasFormat("bornagain/widget")
+            && getItem()->acceptsAsDefaultItem(mimeData->getClassName())
+            && row!=-1 ) {
+
+        qDebug() << "MultiLayerView::checkDragEvent -> yes"  << row << getDropAreaRectangle(row);
+        event->setAccepted(true);
+    } else {
+        event->setAccepted(false);
+    }
+    return mimeData;
+}
+
+QVariant MultiLayerView::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+{
+    return QGraphicsItem::itemChange(change, value);
+}
diff --git a/GUI/coregui/Views/SampleDesigner/MultiLayerView.h b/GUI/coregui/Views/SampleDesigner/MultiLayerView.h
new file mode 100644
index 0000000..66962f1
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/MultiLayerView.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/MultiLayerView.h
+//! @brief     Defines class MultiLayerView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MULTILAYERVIEW_H
+#define MULTILAYERVIEW_H
+
+
+#include "ILayerView.h"
+
+class DesignerMimeData;
+class QGraphicsSceneDragDropEvent;
+
+//! Class representing view of MultiLayer.
+//! Handles drop of other MultiLayer and Layer views on top of it
+class BA_CORE_API_ MultiLayerView : public ILayerView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::MULTILAYER };
+
+    MultiLayerView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+
+    void addView(IView *childView, int row = 0);
+
+    virtual void addNewLayer(ILayerView *layer, int row);
+    virtual void removeLayer(ILayerView *layer);
+
+    bool isInDropArea(QPointF pos);
+    int getDropArea(QPointF pos);
+    QRectF getDropAreaRectangle(int row);
+    QLineF getInterfaceLine(int row);
+
+public slots:
+    void updateGeometry();
+    void updateHeight();
+    void updateWidth();
+    void onLayerAboutToBeDeleted();
+
+protected:
+    void dropEvent(QGraphicsSceneDragDropEvent *event);
+    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
+    const DesignerMimeData *checkDragEvent(QGraphicsSceneDragDropEvent * event);
+    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+
+private:
+    QList<ILayerView *> m_layers;
+    QList<QRectF> m_drop_areas;
+    QList<QLineF> m_interfaces;
+};
+
+
+#endif // MULTILAYERVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/NodeEditor.cpp b/GUI/coregui/Views/SampleDesigner/NodeEditor.cpp
new file mode 100644
index 0000000..28a8b97
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/NodeEditor.cpp
@@ -0,0 +1,143 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/NodeEditor.cpp
+//! @brief     Implements class NodeEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "NodeEditor.h"
+#include "DesignerView.h"
+#include "NodeEditorConnection.h"
+#include "NodeEditorPort.h"
+#include <QEvent>
+#include <QGraphicsScene>
+#include <QGraphicsSceneMouseEvent>
+
+NodeEditor::NodeEditor(QObject *parent)
+    : QObject(parent)
+    , m_scene(0)
+    , m_conn(0)
+{
+
+}
+
+void NodeEditor::install(QGraphicsScene *scene)
+{
+    scene->installEventFilter(this);
+    m_scene = scene;
+}
+
+QGraphicsItem* NodeEditor::itemAt(const QPointF &pos)
+{
+    QList<QGraphicsItem*> items = m_scene->items(QRectF(pos - QPointF(1,1), QSize(3,3)));
+
+	foreach(QGraphicsItem *item, items)
+		if (item->type() > QGraphicsItem::UserType)
+			return item;
+
+    return 0;
+}
+
+bool NodeEditor::eventFilter(QObject *object, QEvent *event)
+{
+    QGraphicsSceneMouseEvent *mouseEvent = dynamic_cast<QGraphicsSceneMouseEvent*>(event);
+    if(!mouseEvent)  return QObject::eventFilter(object, event);
+
+    bool isProcessedEvent(false);
+
+    if(event->type() == QEvent::GraphicsSceneMousePress) {
+        isProcessedEvent = processMousePress(mouseEvent);
+    }
+
+    else if(event->type() == QEvent::GraphicsSceneMouseMove) {
+        isProcessedEvent = processMouseMove(mouseEvent);
+    }
+
+    else if(event->type() == QEvent::GraphicsSceneMouseRelease) {
+        isProcessedEvent = processMouseRelease(mouseEvent);
+    }
+
+    return isProcessedEvent ? isProcessedEvent : QObject::eventFilter(object, event);
+
+}
+
+bool NodeEditor::processMousePress(QGraphicsSceneMouseEvent *event)
+{
+    bool result(false);
+
+    if(m_conn==0 && event->button() == Qt::LeftButton) {
+        QGraphicsItem *item = itemAt(event->scenePos());
+        if (item && item->type() == NodeEditorPort::TYPE) {
+            emit selectionModeChangeRequest(DesignerView::SIMPLE_SELECTION);
+            m_conn = new NodeEditorConnection(0, m_scene);
+            m_conn->setPort1((NodeEditorPort*) item);
+            m_conn->setPos1(item->scenePos());
+            m_conn->setPos2(event->scenePos());
+            m_conn->updatePath();
+
+            result = true;
+        }
+    }
+
+    return result;
+}
+
+bool NodeEditor::processMouseMove(QGraphicsSceneMouseEvent *event)
+{
+    bool result(false);
+
+    if (m_conn) {
+        m_conn->setPos2(event->scenePos());
+        m_conn->updatePath();
+        result = true;
+    }
+
+    return result;
+}
+
+bool NodeEditor::processMouseRelease(QGraphicsSceneMouseEvent *event)
+{
+    bool result(false);
+
+    if (m_conn && event->button() == Qt::LeftButton)
+    {
+        emit selectionModeChangeRequest(DesignerView::RUBBER_SELECTION);
+
+        QGraphicsItem *item = itemAt(event->scenePos());
+        if (item && item->type() == NodeEditorPort::TYPE)
+        {
+            NodeEditorPort *port1 = m_conn->port1();
+            NodeEditorPort *port2 = (NodeEditorPort*) item;
+
+            if (port1->parentItem() != port2->parentItem()
+                    && port1->isOutput() != port2->isOutput()
+                    && !port1->isConnected(port2)
+                    && port1->getPortType() == port2->getPortType()
+                    )
+            {
+                m_conn->setPos2(port2->scenePos());
+                m_conn->setPort2(port2);
+                m_conn->updatePath();
+                emit connectionIsEstablished(m_conn);
+                m_conn = 0;
+                return true;
+            }
+        }
+
+        delete m_conn;
+        m_conn = 0;
+        result = true;
+    }
+
+    return result;
+}
+
diff --git a/GUI/coregui/Views/SampleDesigner/NodeEditor.h b/GUI/coregui/Views/SampleDesigner/NodeEditor.h
new file mode 100644
index 0000000..adb5c55
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/NodeEditor.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/NodeEditor.h
+//! @brief     Defines class NodeEditor
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef NODEEDITOR_H
+#define NODEEDITOR_H
+
+/*
+ * Node editor: original code is taken from
+ * http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor/
+ * Copyright (c) 2012, STANISLAW ADASZEWSKI
+ */
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class QGraphicsScene;
+class NodeEditorConnection;
+class QGraphicsItem;
+class QPointF;
+class QGraphicsSceneMouseEvent;
+
+//! The NodeEditor class implement for QGraphicsScene an editable schematic
+//! of the dependency graph, displaying nodes and the connections between their
+//! attributes
+class BA_CORE_API_ NodeEditor : public QObject
+{
+	Q_OBJECT
+
+public:
+    explicit NodeEditor(QObject *parent = 0);
+
+    void install(QGraphicsScene *scene);
+
+    bool eventFilter(QObject *object, QEvent *event);
+
+signals:
+    void selectionModeChangeRequest(int);
+    void connectionIsEstablished(NodeEditorConnection *);
+
+private:
+	QGraphicsItem *itemAt(const QPointF&);
+
+private:
+    bool processMousePress(QGraphicsSceneMouseEvent *event);
+    bool processMouseMove(QGraphicsSceneMouseEvent *event);
+    bool processMouseRelease(QGraphicsSceneMouseEvent *event);
+
+    QGraphicsScene *m_scene;
+    NodeEditorConnection *m_conn;
+};
+
+#endif // NODEEDITOR_H
diff --git a/GUI/coregui/Views/SampleDesigner/NodeEditorConnection.cpp b/GUI/coregui/Views/SampleDesigner/NodeEditorConnection.cpp
new file mode 100644
index 0000000..ed904af
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/NodeEditorConnection.cpp
@@ -0,0 +1,142 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/NodeEditorConnection.cpp
+//! @brief     Implements class NodeEditorConnection
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "NodeEditorConnection.h"
+#include "ConnectableView.h"
+#include "NodeEditorPort.h"
+#include <QBrush>
+#include <QDebug>
+#include <QGraphicsScene>
+#include <QPainter>
+#include <QPen>
+
+NodeEditorConnection::NodeEditorConnection(QGraphicsItem *parent, QGraphicsScene *scene)
+    : QGraphicsPathItem(parent)
+    , m_port1(0)
+    , m_port2(0)
+{
+    setFlag(QGraphicsItem::ItemIsSelectable, true);
+    setPen(QPen(Qt::darkGray, 2));
+    setBrush(Qt::NoBrush);
+    setZValue(-1);
+    if(scene) scene->addItem(this);
+}
+
+
+NodeEditorConnection::~NodeEditorConnection()
+{
+    if (m_port1)
+        m_port1->remove(this);
+
+    if (m_port2)
+        m_port2->remove(this);
+}
+
+void NodeEditorConnection::setPos1(const QPointF &p)
+{
+    pos1 = p;
+}
+
+void NodeEditorConnection::setPos2(const QPointF &p)
+{
+    pos2 = p;
+}
+
+void NodeEditorConnection::setPort1(NodeEditorPort *p)
+{
+    m_port1 = p;
+    m_port1->append(this);
+    setPos1(p->scenePos());
+}
+
+void NodeEditorConnection::setPort2(NodeEditorPort *p)
+{
+    m_port2 = p;
+    m_port2->append(this);
+    setPos2(p->scenePos());
+}
+
+void NodeEditorConnection::updatePosFromPorts()
+{
+    pos1 = m_port1->scenePos();
+    pos2 = m_port2->scenePos();
+}
+
+void NodeEditorConnection::updatePath()
+{
+    QPainterPath p;
+    p.moveTo(pos1);
+    qreal dx = pos2.x() - pos1.x();
+    dx = qMax(dx, 200.);
+    QPointF ctr1(pos1.x() + dx * 0.25, pos1.y() );
+    QPointF ctr2(pos2.x() - dx * 0.25, pos2.y() );
+    p.cubicTo(ctr1, ctr2, pos2);
+    setPath(p);
+}
+
+NodeEditorPort* NodeEditorConnection::port1() const
+{
+    return m_port1;
+}
+
+NodeEditorPort* NodeEditorConnection::port2() const
+{
+    return m_port2;
+}
+
+NodeEditorPort *NodeEditorConnection::inputPort()
+{
+    Q_ASSERT(m_port1 && m_port2);
+    return (m_port1->isInput() ? m_port1 : m_port2);
+}
+
+NodeEditorPort *NodeEditorConnection::outputPort()
+{
+    Q_ASSERT(m_port1 && m_port2);
+    return (m_port1->isOutput() ? m_port1 : m_port2);
+}
+
+void NodeEditorConnection::paint(QPainter *painter,
+                                 const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+    Q_UNUSED(option)
+    Q_UNUSED(widget)
+
+    painter->setPen(QPen(Qt::darkGray, 2));
+    painter->setBrush(Qt::NoBrush);
+
+    if (isSelected()) {
+        painter->setPen(Qt::DashLine);
+    }
+
+    painter->drawPath(path());
+}
+
+ConnectableView *NodeEditorConnection::getParentView()
+{
+    Q_ASSERT(inputPort() != outputPort());
+    ConnectableView *result = dynamic_cast<ConnectableView *>(inputPort()->parentItem());
+    Q_ASSERT(result);
+    return result;
+}
+
+ConnectableView *NodeEditorConnection::getChildView()
+{
+    Q_ASSERT(inputPort() != outputPort());
+    ConnectableView *result = dynamic_cast<ConnectableView *>(outputPort()->parentItem());
+    Q_ASSERT(result);
+    return result;
+}
diff --git a/GUI/coregui/Views/SampleDesigner/NodeEditorConnection.h b/GUI/coregui/Views/SampleDesigner/NodeEditorConnection.h
new file mode 100644
index 0000000..724af02
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/NodeEditorConnection.h
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/NodeEditorConnection.h
+//! @brief     Defines class NodeEditorConnection
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef NODEEDITORCONNECTION_H
+#define NODEEDITORCONNECTION_H
+
+/*
+ * Node editor: original code is taken from
+ * http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor/
+ * Copyright (c) 2012, STANISLAW ADASZEWSKI
+ */
+
+#include <QGraphicsPathItem>
+#include "DesignerHelper.h"
+
+class NodeEditorPort;
+class ConnectableView;
+
+class BA_CORE_API_ NodeEditorConnection : public QGraphicsPathItem
+{
+public:
+    enum { TYPE = DesignerHelper::NODE_EDITOR_CONNECTION };
+
+    NodeEditorConnection(QGraphicsItem *parent = 0, QGraphicsScene *scene = 0);
+    virtual ~NodeEditorConnection();
+
+    void setPos1(const QPointF &p);
+    void setPos2(const QPointF &p);
+    void setPort1(NodeEditorPort *p);
+    void setPort2(NodeEditorPort *p);
+    void updatePosFromPorts();
+    void updatePath();
+
+    NodeEditorPort* port1() const;
+    NodeEditorPort* port2() const;
+
+    NodeEditorPort *inputPort();
+    NodeEditorPort *outputPort();
+
+    int type() const { return TYPE; }
+
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+
+    //! returns parent view, i.e. the view which owns input port of given connection
+    ConnectableView *getParentView();
+
+    //! returns child view, i.e. the view which owns output port of given connection
+    ConnectableView *getChildView();
+
+private:
+    QPointF pos1;
+    QPointF pos2;
+    NodeEditorPort *m_port1;
+    NodeEditorPort *m_port2;
+};
+
+#endif // NODEEDITORCONNECTION_H
diff --git a/GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp b/GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp
new file mode 100644
index 0000000..d90c871
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp
@@ -0,0 +1,129 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/NodeEditorPort.cpp
+//! @brief     Implements class NodeEditorPort
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "NodeEditorPort.h"
+#include "NodeEditorConnection.h"
+#include <QDebug>
+#include <QFontMetrics>
+#include <QGraphicsScene>
+#include <QPainter>
+#include <QPen>
+
+NodeEditorPort::NodeEditorPort(QGraphicsItem *parent, const QString &name,
+                               NodeEditorPort::EPortDirection direction,
+                               NodeEditorPort::EPortType port_type)
+    : QGraphicsPathItem(parent), m_name(name), m_direction(direction), m_port_type(port_type),
+      m_radius(5), m_margin(2)
+{
+    m_color = getPortTypeColor(port_type);
+
+    QPainterPath p;
+    p.addEllipse(-m_radius, -m_radius, 2 * m_radius, 2 * m_radius);
+    setPath(p);
+
+    setPen(QPen(m_color.darker(180)));
+    setBrush(m_color);
+
+    setFlag(QGraphicsItem::ItemSendsScenePositionChanges);
+
+    if (!m_name.isEmpty()) {
+        QGraphicsTextItem *label = new QGraphicsTextItem(this);
+        label->setPlainText(m_name);
+        QFont serifFont("Monospace", DesignerHelper::getPortFontSize(), QFont::Normal);
+        label->setFont(serifFont);
+
+        if (isOutput()) {
+            label->setPos(-m_radius - m_margin - label->boundingRect().width(),
+                          -label->boundingRect().height() / 2);
+        } else {
+            label->setPos(m_radius + m_margin, -label->boundingRect().height() / 2);
+        }
+    }
+}
+
+NodeEditorPort::~NodeEditorPort()
+{
+    QVector<NodeEditorConnection *> connections = m_connections;
+    foreach (NodeEditorConnection *conn, connections) {
+        conn->setSelected(false);
+        delete conn;
+    }
+}
+
+bool NodeEditorPort::isOutput()
+{
+    return (m_direction == OUTPUT ? true : false);
+}
+
+bool NodeEditorPort::isInput()
+{
+    return !isOutput();
+}
+
+void NodeEditorPort::remove(NodeEditorConnection *connection)
+{
+    if(m_connections.contains(connection))
+        m_connections.remove(m_connections.indexOf(connection));
+}
+
+void NodeEditorPort::append(NodeEditorConnection *connection)
+{
+   m_connections.append(connection);
+}
+
+bool NodeEditorPort::isConnected(NodeEditorPort *other)
+{
+    foreach (NodeEditorConnection *conn, m_connections)
+        if (conn->port1() == other || conn->port2() == other)
+            return true;
+
+    return false;
+}
+
+QColor NodeEditorPort::getPortTypeColor(NodeEditorPort::EPortType port_type)
+{
+    switch (port_type) {
+    case DEFAULT:
+        return QColor(Qt::gray);
+        break;
+    case INTERFERENCE:
+        return QColor(Qt::yellow);
+        break;
+    case PARTICLE_LAYOUT:
+        return QColor(Qt::green);
+        break;
+    case FORM_FACTOR:
+        return QColor(Qt::blue);
+        break;
+    case TRANSFORMATION:
+        return QColor(Qt::magenta);
+        break;
+    default:
+        return QColor(Qt::red);
+        break;
+    }
+}
+
+QVariant NodeEditorPort::itemChange(GraphicsItemChange change, const QVariant &value)
+{
+    if (change == ItemScenePositionHasChanged) {
+        foreach (NodeEditorConnection *conn, m_connections) {
+            conn->updatePosFromPorts();
+            conn->updatePath();
+        }
+    }
+    return value;
+}
diff --git a/GUI/coregui/Views/SampleDesigner/NodeEditorPort.h b/GUI/coregui/Views/SampleDesigner/NodeEditorPort.h
new file mode 100644
index 0000000..1b2479c
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/NodeEditorPort.h
@@ -0,0 +1,100 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/NodeEditorPort.h
+//! @brief     Defines class NodeEditorPort
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef NODEEDITORPORT_H
+#define NODEEDITORPORT_H
+
+/*
+ * Node editor: original code is taken from
+ * http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor/
+ * Copyright (c) 2012, STANISLAW ADASZEWSKI
+ */
+
+#include <QGraphicsPathItem>
+#include <QString>
+#include "DesignerHelper.h"
+
+class NodeEditorConnection;
+class IView;
+
+class BA_CORE_API_ NodeEditorPort : public QGraphicsPathItem
+{
+public:
+    enum { TYPE = DesignerHelper::NODE_EDITOR_PORT };
+
+    //! type of ports, same type can be connected together
+    enum EPortType { DEFAULT, INTERFERENCE, PARTICLE_LAYOUT, FORM_FACTOR, TRANSFORMATION };
+
+    //! port direction
+    enum EPortDirection { INPUT, OUTPUT };
+
+    NodeEditorPort(QGraphicsItem *parent = 0, const QString &name = QString("unnamed"),
+                   EPortDirection direction = INPUT, EPortType port_type = DEFAULT);
+
+    virtual ~NodeEditorPort();
+
+    bool isOutput();
+    bool isInput();
+
+    void remove(NodeEditorConnection *connection);
+    void append(NodeEditorConnection *connection);
+
+    const QString &portName() const;
+
+    virtual int type() const;
+
+    bool isConnected(NodeEditorPort *);
+
+    bool isConnected();
+
+    EPortType getPortType() const;
+
+    static QColor getPortTypeColor(NodeEditorPort::EPortType port_type);
+
+protected:
+    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
+
+private:
+    QString m_name;
+    EPortDirection m_direction;
+    EPortType m_port_type;
+    QColor m_color;
+    int m_radius;
+    int m_margin;
+    QVector<NodeEditorConnection *> m_connections;
+};
+
+inline const QString &NodeEditorPort::portName() const
+{
+    return m_name;
+}
+
+inline int NodeEditorPort::type() const
+{
+    return TYPE;
+}
+
+inline bool NodeEditorPort::isConnected()
+{
+    return m_connections.size();
+}
+
+inline NodeEditorPort::EPortType NodeEditorPort::getPortType() const
+{
+    return m_port_type;
+}
+
+#endif // NODEEDITORPORT_H
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp
new file mode 100644
index 0000000..14ac8bf
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleCompositionView.cpp
+//! @brief     Implements class ParticleCompositionView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleCompositionView.h"
+#include "ParticleCompositionItem.h"
+#include "ParticleItem.h"
+#include "SessionItem.h"
+#include <QDebug>
+
+ParticleCompositionView::ParticleCompositionView(QGraphicsItem *parent) : ConnectableView(parent)
+{
+    setName(Constants::ParticleCompositionType);
+    setColor(DesignerHelper::getDefaultParticleColor());
+    setRectangle(DesignerHelper::getDefaultBoundingRect(Constants::ParticleCoreShellType));
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("particles", NodeEditorPort::INPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("transformation", NodeEditorPort::INPUT, NodeEditorPort::TRANSFORMATION);
+    m_roundpar = 5;
+    m_label_vspace = 45;
+}
+
+void ParticleCompositionView::addView(IView *childView, int /* row */)
+{
+    // TODO restore logic
+    int index = 0;//int(childView->getParameterizedItem()->port());
+//                    ->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT)
+//                    .toInt();
+    if (this->getItem()->tagFromItem(childView->getItem()) == ParticleItem::T_TRANSFORMATION)
+        index = 1;
+    qDebug() << "ParticleCompositionView::addView()" << index;
+    connectInputPort(dynamic_cast<ConnectableView *>(childView), index);
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.h b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.h
new file mode 100644
index 0000000..ef678ed
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleCompositionView.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleCompositionView.h
+//! @brief     Defines class ParticleCompositionView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLECOMPOSITIONVIEW_H
+#define PARTICLECOMPOSITIONVIEW_H
+
+#include "ConnectableView.h"
+
+//! Class representing view of Particle item
+class BA_CORE_API_ ParticleCompositionView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::PARTICLE };
+
+    ParticleCompositionView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+
+    void addView(IView *childView, int row = 0);
+
+};
+
+
+#endif // PARTICLECOMPOSITIONVIEW_H
+
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp
new file mode 100644
index 0000000..7a2c0d4
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp
@@ -0,0 +1,54 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.cpp
+//! @brief     Implements class ParticleCoreShellView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleCoreShellView.h"
+#include "ParticleCoreShellItem.h"
+#include "SessionItem.h"
+#include <QDebug>
+
+
+ParticleCoreShellView::ParticleCoreShellView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::ParticleCoreShellType);
+    setColor(DesignerHelper::getDefaultParticleColor());
+    setRectangle(DesignerHelper::getDefaultBoundingRect(Constants::ParticleCoreShellType));
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("core", NodeEditorPort::INPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("shell", NodeEditorPort::INPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("transformation", NodeEditorPort::INPUT, NodeEditorPort::TRANSFORMATION);
+
+    m_roundpar = 5;
+    m_label_vspace = 45;
+}
+
+void ParticleCoreShellView::addView(IView *childView, int /* row */)
+{
+    // TODO restore logic
+//    int index = 0;//int(childView->getParameterizedItem()->port());
+//                    ->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT)
+//                    .toInt();
+    int index = 0;
+    if (this->getItem()->tagFromItem(childView->getItem()) == ParticleCoreShellItem::T_CORE) {
+        index = 0;
+    } else if (this->getItem()->tagFromItem(childView->getItem()) == ParticleCoreShellItem::T_SHELL) {
+        index = 1;
+    } else {
+        index = 2;
+    }
+    qDebug() << "ParticleCoreShellView::addView()" << index;
+    connectInputPort(dynamic_cast<ConnectableView *>(childView), index);
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.h b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.h
new file mode 100644
index 0000000..37ad376
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleCoreShellView.h
+//! @brief     Defines class ParticleCoreShellView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLECORESHELLVIEW_H
+#define PARTICLECORESHELLVIEW_H
+
+#include "ConnectableView.h"
+
+//! Class representing view of Particle item
+class BA_CORE_API_ ParticleCoreShellView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::PARTICLE };
+
+    ParticleCoreShellView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+
+    void addView(IView *childView, int row = 0);
+
+};
+
+
+#endif // PARTICLECORESHELLVIEW_H
+
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp
new file mode 100644
index 0000000..ee2af84
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleDistributionView.cpp
+//! @brief     Implements class ParticleDistributionView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleDistributionView.h"
+#include "SessionItem.h"
+#include <QDebug>
+
+
+ParticleDistributionView::ParticleDistributionView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::ParticleDistributionType);
+    setColor(DesignerHelper::getDefaultParticleColor());
+    setRectangle(DesignerHelper::getDefaultBoundingRect(Constants::ParticleDistributionType));
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("particle", NodeEditorPort::INPUT, NodeEditorPort::FORM_FACTOR);
+    m_roundpar = 5;
+    m_label_vspace = 45;
+}
+
+void ParticleDistributionView::addView(IView *childView, int /* row */)
+{
+    // TODO restore logic
+    int index = 0;//int(childView->getParameterizedItem()->port());
+//                    ->getRegisteredProperty(ParameterizedItem::OBSOLETE_P_PORT)
+//                    .toInt();
+    qDebug() << "ParticleDistributionType::addView()" << index;
+    connectInputPort(dynamic_cast<ConnectableView *>(childView), index);
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h b/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h
new file mode 100644
index 0000000..7aa509f
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleDistributionView.h
+//! @brief     Defines class ParticleDistributionView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLEDISTRIBUTIONVIEW_H
+#define PARTICLEDISTRIBUTIONVIEW_H
+
+#include "ConnectableView.h"
+
+//! Class representing view of distributed particle item
+class BA_CORE_API_ ParticleDistributionView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::PARTICLE };
+
+    ParticleDistributionView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+
+    void addView(IView *childView, int row = 0);
+
+};
+
+
+#endif // PARTICLEDISTRIBUTIONVIEW_H
+
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp
new file mode 100644
index 0000000..b7e4651
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleLayoutView.cpp
+//! @brief     Implements class ParticleLayoutView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleLayoutView.h"
+#include "DesignerHelper.h"
+#include "GUIHelpers.h"
+#include "ParticleView.h"
+#include "SessionItem.h"
+#include <QDebug>
+
+
+ParticleLayoutView::ParticleLayoutView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::ParticleLayoutType);
+    setColor(QColor(135, 206, 50));
+    setRectangle( DesignerHelper::getDefaultBoundingRect(Constants::ParticleLayoutType));
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::PARTICLE_LAYOUT);
+    addPort("particle", NodeEditorPort::INPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("interference", NodeEditorPort::INPUT, NodeEditorPort::INTERFERENCE);
+    m_roundpar = 3;
+}
+
+ParticleLayoutView::~ParticleLayoutView()
+{
+    qDebug() << "ParticleLayoutView::~ParticleLayoutView()";
+}
+
+void ParticleLayoutView::addView(IView *childView, int /* row */)
+{
+    qDebug() << "ParticleLayoutView::addView() xxx " << m_item->itemName()
+             << childView->getItem()->itemName() << childView->type()
+             << DesignerHelper::PARTICLE;
+    if(childView->type() == DesignerHelper::PARTICLE) {
+        connectInputPort(dynamic_cast<ConnectableView *>(childView), 0);
+    }
+    else if(childView->type() == DesignerHelper::INTERFERENCE_FUNCTION_RADIAL_PARA
+         || childView->type() == DesignerHelper::INTERFERENCE_FUNCTION_2D_PARA
+         || childView->type() == DesignerHelper::INTERFERENCE_FUNCTION_1D_LATTICE
+         || childView->type() == DesignerHelper::INTERFERENCE_FUNCTION_2D_LATTICE) {
+        connectInputPort(dynamic_cast<ConnectableView *>(childView), 1);
+    }
+    else {
+        throw GUIHelpers::Error("ParticleLayoutView::addView() -> Error. Unknown view");
+    }
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.h b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.h
new file mode 100644
index 0000000..3397887
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleLayoutView.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleLayoutView.h
+//! @brief     Defines class ParticleLayoutView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLELAYOUTVIEW_H
+#define PARTICLELAYOUTVIEW_H
+
+#include "ConnectableView.h"
+
+class BA_CORE_API_ ParticleLayoutView : public ConnectableView
+{
+public:
+    enum { TYPE = DesignerHelper::PARTICLE_LAYOUT };
+
+    ParticleLayoutView(QGraphicsItem *parent = 0);
+    ~ParticleLayoutView();
+
+    int type() const { return TYPE; }
+
+    void addView(IView *childView, int row = 0); // to add Particle
+};
+
+#endif // PARTICLELAYOUTVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleView.cpp b/GUI/coregui/Views/SampleDesigner/ParticleView.cpp
new file mode 100644
index 0000000..614552a
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleView.cpp
@@ -0,0 +1,110 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleView.cpp
+//! @brief     Implements class ParticleView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ParticleView.h"
+#include "GUIHelpers.h"
+#include "GroupItem.h"
+#include "GroupProperty.h"
+#include "ParticleItem.h"
+#include <QDebug>
+#include <QObject>
+#include <QPainter>
+#include <QStyleOptionGraphicsItem>
+
+ParticleView::ParticleView(QGraphicsItem *parent) : ConnectableView(parent)
+{
+    setName(Constants::ParticleType);
+    setColor(DesignerHelper::getDefaultParticleColor());
+    setRectangle(
+        DesignerHelper::getDefaultBoundingRect(Constants::ParticleType));
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::FORM_FACTOR);
+    addPort("transformation", NodeEditorPort::INPUT,
+            NodeEditorPort::TRANSFORMATION);
+    m_roundpar = 5;
+    m_label_vspace = 45;
+}
+
+void ParticleView::paint(QPainter *painter,
+                         const QStyleOptionGraphicsItem *option,
+                         QWidget *widget)
+{
+    Q_UNUSED(widget);
+
+    painter->setPen(Qt::gray);
+    if (option->state & (QStyle::State_Selected | QStyle::State_HasFocus)) {
+        painter->setPen(Qt::DashLine);
+    }
+
+    painter->setBrush(
+        DesignerHelper::getDecorationGradient(m_color, getRectangle()));
+    painter->drawRoundedRect(getRectangle(), m_roundpar, m_roundpar);
+
+    if (m_label.isEmpty())
+        return;
+
+    painter->setPen(Qt::black);
+    double width = getRectangle().width() * 0.9;
+    double yoffset = 5; // space above the label
+    // double height = m_label_vspace - yoffset;
+    double height = 20;
+    QFont serifFont("Monospace", DesignerHelper::getLabelFontSize(),
+                    QFont::Normal);
+    painter->setFont(serifFont);
+    QRect textRect(getRectangle().x() + (getRectangle().width() - width) / 2.,
+                   getRectangle().y() + yoffset, width, height);
+    painter->drawText(textRect, Qt::AlignCenter, m_label);
+
+    QRect target(getRectangle().width() / 2 - 16, 25, 32, 32);
+    painter->drawPixmap(target, m_pixmap);
+}
+
+void ParticleView::onPropertyChange(const QString &propertyName)
+{
+    if (propertyName == ParticleItem::P_FORM_FACTOR) {
+//        updatePixmap();
+        update_appearance();
+    }
+
+    IView::onPropertyChange(propertyName);
+}
+
+void ParticleView::addView(IView *childView, int /*row*/)
+{
+    if (childView->type() == DesignerHelper::TRANSFORMATION) {
+        connectInputPort(dynamic_cast<ConnectableView *>(childView), 0);
+    } else {
+        throw GUIHelpers::Error(
+            "ParticleView::addView() -> Error. Unknown view");
+    }
+}
+
+void ParticleView::update_appearance()
+{
+    updatePixmap();
+    ConnectableView::update_appearance();
+}
+
+void ParticleView::updatePixmap()
+{
+    GroupProperty_t group_property
+        = dynamic_cast<GroupItem *>(
+              getItem()->getItem(ParticleItem::P_FORM_FACTOR))
+              ->group();
+    QString current_ff_type = group_property->getCurrentType();
+    QString filename
+        = QString(":/widgetbox/images/ff_%1_32.png").arg(current_ff_type);
+    m_pixmap = QPixmap(filename);
+}
diff --git a/GUI/coregui/Views/SampleDesigner/ParticleView.h b/GUI/coregui/Views/SampleDesigner/ParticleView.h
new file mode 100644
index 0000000..2c94bf7
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/ParticleView.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/ParticleView.h
+//! @brief     Defines class ParticleView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PARTICLEVIEW_H
+#define PARTICLEVIEW_H
+
+#include "ConnectableView.h"
+#include <QPixmap>
+
+//! Class representing view of Particle item
+class BA_CORE_API_ ParticleView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::PARTICLE };
+
+    ParticleView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+
+    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+
+    void onPropertyChange(const QString &propertyName);
+
+    void addView(IView *childView, int row = 0); // to add Transformation
+
+protected:
+    void update_appearance();
+
+private:
+    void updatePixmap();
+
+    QPixmap m_pixmap;
+};
+
+
+
+#endif // PARTICLEVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp b/GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp
new file mode 100644
index 0000000..17b533f
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp
@@ -0,0 +1,61 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleDesigner.cpp
+//! @brief     Implements class SampleDesigner
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleDesigner.h"
+#include "DesignerScene.h"
+#include "DesignerView.h"
+#include "FilterPropertyProxy.h"
+#include "ISample.h"
+#include "MultiLayerView.h"
+#include <QDebug>
+
+SampleDesigner::SampleDesigner(QWidget *parent)
+    : SampleDesignerInterface(parent)
+    , m_designerScene(0)
+    , m_designerView(0)
+{
+    m_designerScene = new DesignerScene(parent);
+    m_designerView = new DesignerView(m_designerScene, parent);
+}
+
+
+SampleDesigner::~SampleDesigner()
+{
+}
+
+
+void SampleDesigner::setSampleModel(SampleModel *sampleModel)
+{
+    if(sampleModel) m_designerScene->setSampleModel(sampleModel);
+}
+
+void SampleDesigner::setInstrumentModel(InstrumentModel *instrumentModel)
+{
+    if(instrumentModel) m_designerScene->setInstrumentModel(instrumentModel);
+}
+
+
+void SampleDesigner::setSelectionModel(QItemSelectionModel *model, FilterPropertyProxy *proxy)
+{
+    if(model) m_designerScene->setSelectionModel(model, proxy);
+}
+
+
+void SampleDesigner::onSmartAlign()
+{
+    qDebug() << "SampleDesigner::onSmartAlign()";
+    m_designerScene->onSmartAlign();
+}
diff --git a/GUI/coregui/Views/SampleDesigner/SampleDesigner.h b/GUI/coregui/Views/SampleDesigner/SampleDesigner.h
new file mode 100644
index 0000000..df936a6
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleDesigner.h
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleDesigner.h
+//! @brief     Defines class SampleDesigner
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEDESIGNER_H
+#define SAMPLEDESIGNER_H
+
+#include "DesignerScene.h"
+#include "DesignerView.h"
+#include <QObject>
+#include <QStackedWidget>
+
+class DesignerScene;
+class DesignerWidgetFactory;
+class InstrumentModel;
+class SampleModel;
+class FilterPropertyProxy;
+
+//! sample designer interface
+class BA_CORE_API_ SampleDesignerInterface : public QObject
+{
+    Q_OBJECT
+
+public:
+    SampleDesignerInterface(QObject *parent = 0) : QObject(parent){}
+    virtual ~SampleDesignerInterface() { }
+
+//    virtual DesignerScene *getScene() const = 0;
+//    virtual DesignerView *getView() const = 0;
+
+};
+
+
+//! sample designer provide central window with graphic scene to drag and drop
+class BA_CORE_API_ SampleDesigner: public SampleDesignerInterface
+{
+    Q_OBJECT
+
+public:
+    SampleDesigner(QWidget *parent = 0);
+    virtual ~SampleDesigner();
+
+    DesignerScene *getScene() const { return m_designerScene; }
+    DesignerView *getView() const { return m_designerView; }
+
+    QWidget *getCentralWidget() { return m_designerView; }
+
+    void setSampleModel(SampleModel *sampleModel);
+    void setInstrumentModel(InstrumentModel *instrumentModel);
+    void setSelectionModel(QItemSelectionModel *model, FilterPropertyProxy *proxy);
+
+public slots:
+    void onSmartAlign();
+
+private:
+    DesignerScene *m_designerScene; //! scene which holds all objects
+    DesignerView *m_designerView;   //! graphical representation of scene with object
+};
+
+
+
+#endif // SAMPLEDESIGNER_H
diff --git a/GUI/coregui/Views/SampleDesigner/SampleDesigner.qrc b/GUI/coregui/Views/SampleDesigner/SampleDesigner.qrc
new file mode 100644
index 0000000..2eaf01d
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleDesigner.qrc
@@ -0,0 +1,13 @@
+<RCC>
+    <qresource prefix="/SampleDesigner">
+        <file>images/toolbar_hand.png</file>
+        <file>images/toolbar_pointer.png</file>
+        <file>images/toolbar_materialeditor.png</file>
+        <file>images/toolbar_recycle.png</file>
+        <file>images/toolbar_center.png</file>
+        <file>images/toolbar_redo.png</file>
+        <file>images/toolbar_unddo.png</file>
+        <file>images/toolbar_align.png</file>
+        <file>images/toolbar_recycle_dark.png</file>
+    </qresource>
+</RCC>
diff --git a/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp b/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp
new file mode 100644
index 0000000..26c916f
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp
@@ -0,0 +1,88 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.cpp
+//! @brief     Implements class IntensityDataPropertyWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SamplePropertyWidget.h"
+#include "ComponentEditor.h"
+#include "SessionItem.h"
+#include <QDebug>
+#include <QItemSelection>
+#include <QModelIndexList>
+#include <QSortFilterProxyModel>
+#include <QVBoxLayout>
+
+SamplePropertyWidget::SamplePropertyWidget(QItemSelectionModel *selection_model, QWidget *parent)
+    : QWidget(parent)
+    , m_selection_model(0)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    setWindowTitle(QLatin1String("Property Editor"));
+    setObjectName(QLatin1String("SamplePropertyWidget"));
+
+    setSelectionModel(selection_model);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    m_propertyEditor = new ComponentEditor;
+
+    mainLayout->addWidget(m_propertyEditor);
+    setLayout(mainLayout);
+}
+
+void SamplePropertyWidget::setSelectionModel(QItemSelectionModel *selection_model)
+{
+    if(selection_model != m_selection_model) {
+        if(m_selection_model)
+            disconnect(m_selection_model,
+                    SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+                    this,
+                    SLOT(selectionChanged(QItemSelection,QItemSelection)) );
+
+        m_selection_model = selection_model;
+
+        connect(m_selection_model,
+                SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+                this,
+                SLOT(selectionChanged(QItemSelection,QItemSelection)) );
+
+    }
+}
+
+// show property of currently selected object (triggered by the graphics scene)
+// if more than one object is selected, show only last selected
+void SamplePropertyWidget::selectionChanged(const QItemSelection & selected,
+                                            const QItemSelection & deselected)
+{
+    qDebug() << "SamplePropertyWidget::selectionChanged" << selected << deselected;
+    (void)deselected;
+    QModelIndexList indices = selected.indexes();
+
+    if(indices.size()) {
+        QSortFilterProxyModel *proxy = dynamic_cast<QSortFilterProxyModel*>(const_cast<QAbstractItemModel*>(indices[0].model()));
+        QModelIndex index = indices.back();
+        if (proxy) {
+            index = proxy->mapToSource(index);
+        }
+        SessionItem *item = static_cast<SessionItem *>(
+                index.internalPointer());
+//        m_propertyEditor->setItem(item, item->modelType());
+        if (item)
+            m_propertyEditor->setItem(item, item->modelType());
+    } else {
+        m_propertyEditor->setItem(0);
+    }
+}
diff --git a/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.h b/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.h
new file mode 100644
index 0000000..73255c1
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.h
@@ -0,0 +1,53 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SamplePropertyWidget.h
+//! @brief     Defines class SamplePropertyWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEPROPERTYWIDGET_H
+#define SAMPLEPROPERTYWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class QItemSelectionModel;
+class QItemSelection;
+class AwesomePropertyEditor;
+class ComponentEditor;
+
+//! Property editor to modify property of the objectcurrently selected on the
+//! graphics scene, located in the bottom right corner of SampleView.
+class BA_CORE_API_ SamplePropertyWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    SamplePropertyWidget(QItemSelectionModel *selection_model,
+                         QWidget *parent = 0);
+
+    QSize sizeHint() const { return QSize(230, 256); }
+    QSize minimumSizeHint() const { return QSize(230, 64); }
+
+    void setSelectionModel(QItemSelectionModel *selection_model);
+
+public slots:
+    //! show property of currently selected object (triggered by graphics scene)
+    void selectionChanged(const QItemSelection & selected,
+                          const QItemSelection & deselected);
+
+private:
+    QItemSelectionModel *m_selection_model;
+//    AwesomePropertyEditor *m_propertyEditor;
+    ComponentEditor *m_propertyEditor;
+};
+
+#endif // SAMPLEPROPERTYWIDGET_H
diff --git a/GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp b/GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp
new file mode 100644
index 0000000..01eb54c
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp
@@ -0,0 +1,150 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleToolBar.cpp
+//! @brief     Implements class SampleToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleToolBar.h"
+#include "DesignerView.h"
+#include "MaterialProperty.h"
+#include "MaterialSvc.h"
+#include <QAction>
+#include <QButtonGroup>
+#include <QComboBox>
+#include <QDebug>
+#include <QIcon>
+#include <QLabel>
+#include <QMenu>
+#include <QPushButton>
+#include <QToolButton>
+
+//! main tool bar on top of SampleView window
+SampleToolBar::SampleToolBar(QWidget *parent)
+    : StyledToolBar(parent)
+{
+    // Select & Pan
+    QToolButton *selectionPointerButton = new QToolButton;
+    selectionPointerButton->setCheckable(true);
+    selectionPointerButton->setChecked(true);
+    selectionPointerButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_pointer.png"));
+    selectionPointerButton->setToolTip("Edit mode.");
+    QToolButton *handPointerButton = new QToolButton;
+    handPointerButton->setCheckable(true);
+    handPointerButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_hand.png"));
+    handPointerButton->setToolTip("Pan mode (space).");
+
+    m_pointerModeGroup = new QButtonGroup(this);
+    m_pointerModeGroup->addButton(selectionPointerButton, DesignerView::RUBBER_SELECTION);
+    m_pointerModeGroup->addButton(handPointerButton, DesignerView::HAND_DRAG);
+    connect(m_pointerModeGroup, SIGNAL(buttonClicked(int)),
+            this, SIGNAL(selectionMode(int)));
+    addWidget(selectionPointerButton);
+    addWidget(handPointerButton);
+
+    addStyledSeparator();
+
+    // unddo redo
+    QToolButton *unddoButton = new QToolButton;
+    unddoButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_unddo.png"));
+    unddoButton->setToolTip("Unddo last action (not implemented yet).");
+    addWidget(unddoButton);
+    QToolButton *redoButton = new QToolButton;
+    redoButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_redo.png"));
+    redoButton->setToolTip("Do again the last undone action (not implemented yet).");
+    addWidget(redoButton);
+
+    addStyledSeparator();
+
+    // Remove item
+    m_removeButton = new QToolButton;
+    m_removeButton->setText("Remove item");
+    m_removeButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_recycle.png"));
+    m_removeButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    m_removeButton->setToolTip("Remove selected items and they child items (del).");
+    connect(m_removeButton, SIGNAL(clicked()), this, SIGNAL(deleteItems()));
+    addWidget(m_removeButton);
+
+    addStyledSeparator();
+
+    // Center view
+
+    m_centerViewButton = new QToolButton;
+    m_centerViewButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_center.png"));
+    m_centerViewButton->setToolTip("Center view.");
+    addWidget(m_centerViewButton);
+    connect(m_centerViewButton, SIGNAL(clicked()), this, SIGNAL(centerView()));
+
+    // align sample
+    m_alignItemsButton = new QToolButton;
+    m_alignItemsButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_align.png"));
+    m_alignItemsButton->setToolTip("Try to align items.");
+    connect(m_alignItemsButton, SIGNAL(clicked()), this, SIGNAL(smartAlign()));
+    addWidget(m_alignItemsButton);
+
+    // Zoom
+    addWidget(new QLabel(" "));
+    addSeparator();
+    addWidget(new QLabel(" Zoom "));
+    m_scaleCombo = new QComboBox;
+    QStringList scales;
+    scales << "25%"<< "50%" << "75%" << "100%" << "125%" << "150%";
+    m_scaleCombo->addItems(scales);
+    m_scaleCombo->setCurrentIndex(3);
+    connect(m_scaleCombo, SIGNAL(currentIndexChanged(QString)),
+            this, SLOT(onScaleComboChanged(QString)));
+    addWidget(m_scaleCombo);
+
+
+    // MaterialEditor
+    addWidget(new QLabel(" "));
+    m_materialEditorButton = new QToolButton;
+    m_materialEditorButton->setText("Material Editor");
+    m_materialEditorButton->setIcon(QIcon(":/SampleDesigner/images/toolbar_materialeditor.png"));
+    m_materialEditorButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    m_materialEditorButton->setToolTip("Open material editor (m).");
+    m_materialEditorButton->setShortcut(Qt::Key_M);
+    connect(m_materialEditorButton, SIGNAL(clicked()), this, SLOT(onMaterialEditorCall()));
+    addWidget(m_materialEditorButton);
+
+    // Additional actions
+    m_zoomOutAction = new QAction(this);
+    m_zoomOutAction->setShortcut(QKeySequence(Qt::Key_Minus));
+    connect(m_zoomOutAction, SIGNAL(triggered()), this, SIGNAL(zoomOut()));
+    addAction(m_zoomOutAction);
+
+    m_zoomInAction = new QAction(this);
+    m_zoomInAction->setShortcut(QKeySequence(Qt::Key_Equal));
+    connect(m_zoomInAction, SIGNAL(triggered()), this, SIGNAL(zoomIn()));
+    addAction(m_zoomInAction);
+}
+
+
+void SampleToolBar::onViewSelectionMode(int mode)
+{
+    qDebug() << "SampleToolBar::onViewSelectionMode" << mode;
+    if(mode == DesignerView::RUBBER_SELECTION || mode == DesignerView::HAND_DRAG)
+        m_pointerModeGroup->button(mode)->setChecked(true);
+}
+
+void SampleToolBar::onScaleComboChanged(const QString &scale_string)
+{
+    double scale = scale_string.left(scale_string.indexOf("%")).toDouble() / 100.0;
+    emit changeScale(scale);
+}
+
+void SampleToolBar::onMaterialEditorCall()
+{
+    MaterialProperty mp = MaterialSvc::selectMaterialProperty();
+    qDebug() << "SampleToolBar::materialBrowserCall()" << mp.getName() << mp.getColor();
+
+}
diff --git a/GUI/coregui/Views/SampleDesigner/SampleToolBar.h b/GUI/coregui/Views/SampleDesigner/SampleToolBar.h
new file mode 100644
index 0000000..923fefe
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleToolBar.h
@@ -0,0 +1,63 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleToolBar.h
+//! @brief     Defines class SampleToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLETOOLBAR_H
+#define SAMPLETOOLBAR_H
+
+#include "StyledToolBar.h"
+
+class QAction;
+class QToolButton;
+class QToolBar;
+class QComboBox;
+class QString;
+class QButtonGroup;
+
+//! The SampleToolBar class represents a main toolbar on top of SampleView window
+
+class BA_CORE_API_ SampleToolBar : public StyledToolBar
+{
+    Q_OBJECT
+
+public:
+    explicit SampleToolBar(QWidget *parent = 0);
+
+signals:
+    void deleteItems();
+    void selectionMode(int);
+    void centerView();
+    void smartAlign();
+    void changeScale(double);
+    void zoomIn();
+    void zoomOut();
+
+public slots:
+    void onViewSelectionMode(int);
+    void onScaleComboChanged(const QString &);
+    void onMaterialEditorCall();
+
+private:
+    QButtonGroup *m_pointerModeGroup;
+    QToolButton *m_removeButton;
+    QToolButton *m_centerViewButton;
+    QToolButton *m_alignItemsButton;
+    QComboBox *m_scaleCombo;
+    QToolButton *m_materialEditorButton;
+    QAction *m_zoomInAction;
+    QAction *m_zoomOutAction;
+};
+
+#endif // SAMPLETOOLBAR_H
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp
new file mode 100644
index 0000000..186d5c0
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp
@@ -0,0 +1,199 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleViewAligner.cpp
+//! @brief     Implements class SampleViewAligner
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleViewAligner.h"
+#include "DesignerScene.h"
+#include "IView.h"
+#include "SampleModel.h"
+#include <QDebug>
+#include <QModelIndex>
+
+SampleViewAligner::SampleViewAligner(DesignerScene *scene)
+    : m_scene(scene)
+{
+    Q_ASSERT(m_scene);
+}
+
+
+//! Spring based implified algorithm for smart alignment
+void SampleViewAligner::smartAlign()
+{
+    m_views.clear();
+    updateViews();
+    updateForces();
+    advance();
+}
+
+
+//! Forms list of all views which are subject for smart alignment (i.e. views
+//! which do not have parent view)
+void SampleViewAligner::updateViews(const QModelIndex & parentIndex)
+{
+    SampleModel *sampleModel = m_scene->getSampleModel();
+    for( int i_row = 0; i_row < sampleModel->rowCount( parentIndex ); ++i_row) {
+         QModelIndex itemIndex = sampleModel->index( i_row, 0, parentIndex );
+         IView *view = getViewForIndex(itemIndex);
+         if(view && !view->parentObject()) {
+            m_views.append(view);
+         }
+         updateViews( itemIndex);
+     }
+}
+
+
+//! Calculates forces acting on all views for smart alignment
+void SampleViewAligner::updateForces()
+{
+    m_viewToPos.clear();
+    foreach(IView *view, m_views) {
+        calculateForces(view);
+    }
+}
+
+
+//! Calculates forces acting on single view (simplified force directed spring algorithm)
+//! and deduce new position of views.
+void SampleViewAligner::calculateForces(IView *view)
+{
+    qreal xvel = 0;
+    qreal yvel = 0;
+
+    // repulsive forces which are pushing items away
+
+    double weight1(200.0);
+    foreach(IView *other, m_views) {
+        QPointF vec = view->mapToItem(other, other->boundingRect().center());
+        qreal dx = view->boundingRect().center().x() - vec.x();
+        qreal dy = view->boundingRect().center().y() - vec.y();
+        double l = (dx * dx + dy * dy);
+        if (l > 0) {
+            xvel -= (dx * weight1) / l;
+            yvel -= (dy * weight1) / l;
+        }
+    }
+
+    // attracting forces which are pulling views together
+    double weight2(100.0);
+    foreach(IView *other, getConnectedViews(view)) {
+        QPointF vec = view->mapToItem(other, other->boundingRect().center());
+        qreal dx = view->boundingRect().center().x() - vec.x();
+        qreal dy = view->boundingRect().center().y() - vec.y();
+        xvel += dx/weight2;
+        yvel += dy/weight2;
+    }
+
+    QPointF newPos = view->pos() + QPointF(xvel, yvel);
+    m_viewToPos[view] = newPos;
+}
+
+
+//! Applies calculated positions to views
+void SampleViewAligner::advance()
+{
+    foreach(IView *view, m_views) {
+        view->setPos(m_viewToPos[view]);
+    }
+}
+
+
+//! Returns list of views connected with given view for the subsequent force calculation.
+//!
+//! Weirdness of given function is due to the fact, that, for example, ParticleLayout view
+//! should interact not with Layer view, but with its parent - MultiLayer view.
+//! Similarly, MultiLayer is not interacting with its Layers, but directly with the ParticleLayout.
+QList<IView *> SampleViewAligner::getConnectedViews(IView *view)
+{
+    QList<IView *> result;
+
+    SessionItem *itemOfView = view->getItem();
+
+    QList<SessionItem *> connected_items;
+
+    if(itemOfView->parent()->modelType() == Constants::LayerType) {
+        // e.g. we are dealing here with ParticleLayout, so we will use directly MultiLayer to interact with
+        connected_items.append(itemOfView->parent()->parent());
+    } else {
+        connected_items.append(itemOfView->parent());
+    }
+
+    if(itemOfView->modelType() == Constants::MultiLayerType) {
+        // MultiLayer will not interact with its Layers, but with they children, e.g. with ParticleLayouts
+        foreach(SessionItem *child,  itemOfView->childItems()) {
+            connected_items.append(child->childItems().toList());
+        }
+    } else {
+        connected_items.append(itemOfView->childItems().toList());
+
+    }
+
+    foreach(SessionItem *item, connected_items) {
+        IView *view = m_scene->getViewForItem(item);
+        if(view) {
+            result.append(view);
+        }
+
+    }
+
+    return result;
+}
+
+
+//! Aligns sample starting from
+void SampleViewAligner::alignSample(SessionItem *item, QPointF reference, bool force_alignment)
+{
+    Q_ASSERT(item);
+    alignSample(m_scene->getSampleModel()->indexOfItem(item), reference, force_alignment);
+}
+
+
+//! Aligns sample starting from reference point.
+//! If force_alignment=false, view's position will be changed only if it has Null coordinate,
+//! if force_alignment=true the position will be changed anyway.
+//! Position of View which has parent item (like Layer) will remain unchainged.
+void SampleViewAligner::alignSample(const QModelIndex & parentIndex, QPointF reference, bool force_alignment)
+{
+    SampleModel *sampleModel = m_scene->getSampleModel();
+
+    if(IView *view = getViewForIndex(parentIndex)) {
+        if( (force_alignment || view->pos().isNull()) && !view->parentObject())
+            view->setPos(reference);
+
+        if(view->parentObject()) {
+            reference = view->mapToScene(view->pos());
+        } else {
+            reference = view->pos();
+        }
+    }
+
+    int child_counter = 0;
+    for( int i_row = 0; i_row < sampleModel->rowCount( parentIndex ); ++i_row) {
+         QModelIndex itemIndex = sampleModel->index( i_row, 0, parentIndex );
+         if(!getViewForIndex(itemIndex)) continue;
+         QPointF child_reference = reference + QPointF(-150, 150*child_counter++);
+         alignSample(itemIndex, child_reference, force_alignment);
+    }
+}
+
+
+IView *SampleViewAligner::getViewForIndex(const QModelIndex &index)
+{
+    SampleModel *sampleModel = m_scene->getSampleModel();
+    SessionItem *item = sampleModel->itemForIndex(index);
+    return m_scene->getViewForItem(item);
+}
+
+
+
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewAligner.h b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.h
new file mode 100644
index 0000000..626ef15
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewAligner.h
@@ -0,0 +1,56 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleViewAligner.h
+//! @brief     Defines class SampleViewAligner
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEVIEWALIGNER_H
+#define SAMPLEVIEWALIGNER_H
+
+#include "WinDllMacros.h"
+#include <QMap>
+#include <QModelIndex>
+#include <QPointF>
+class DesignerScene;
+class IView;
+class SessionItem;
+
+
+//! Makes alignment of sample droped on graphics scene.
+//! Implements additional algorithm for smart alignment.
+class BA_CORE_API_ SampleViewAligner
+{
+public:
+    SampleViewAligner(DesignerScene *scene);
+
+    void alignSample(SessionItem *item, QPointF reference = QPointF(), bool force_alignment = false);
+    void alignSample(const QModelIndex & parentIndex, QPointF reference = QPointF(), bool force_alignment = false);
+
+    void smartAlign();
+    void updateViews(const QModelIndex & parentIndex = QModelIndex());
+    void updateForces();
+    void calculateForces(IView *view);
+    void advance();
+
+private:
+    IView *getViewForIndex(const QModelIndex &index);
+    QList<IView *> getConnectedViews(IView *view);
+
+    DesignerScene *m_scene;
+    QList<IView *> m_views; //!< list of all views which are subject to smart align
+    QMap<IView *, QPointF> m_viewToPos;
+};
+
+
+#endif // SAMPLEVIEWALIGNER_H
+
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
new file mode 100644
index 0000000..c9a0d00
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
@@ -0,0 +1,101 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleViewFactory.cpp
+//! @brief     Implements class SampleViewFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleViewFactory.h"
+#include "GUIHelpers.h"
+#include "InterferenceFunctionViews.h"
+#include "LayerView.h"
+#include "MultiLayerView.h"
+#include "ParticleCompositionView.h"
+#include "ParticleCoreShellView.h"
+#include "ParticleDistributionView.h"
+#include "ParticleLayoutView.h"
+#include "ParticleView.h"
+#include "TransformationView.h"
+#include "item_constants.h"
+#include <QDebug>
+
+
+QStringList SampleViewFactory::m_valid_item_names  = QStringList()
+        << Constants::MultiLayerType
+        << Constants::LayerType
+        << Constants::ParticleLayoutType
+        << Constants::ParticleType
+        << Constants::TransformationType
+        << Constants::ParticleCoreShellType
+        << Constants::ParticleCompositionType
+        << Constants::ParticleDistributionType
+        << Constants::InterferenceFunctionRadialParaCrystalType
+        << Constants::InterferenceFunction2DParaCrystalType
+        << Constants::InterferenceFunction1DLatticeType
+        << Constants::InterferenceFunction2DLatticeType;
+
+
+bool SampleViewFactory::isValidType(const QString &name)
+{
+    if(name.startsWith(Constants::FormFactorType)) {
+        return true;
+    } else {
+        return m_valid_item_names.contains(name);
+    }
+}
+
+
+IView *SampleViewFactory::createSampleView(const QString &name)
+{
+    if (name==Constants::MultiLayerType) {
+        return new MultiLayerView();
+    }
+    else if (name==Constants::LayerType) {
+        return new LayerView();
+    }
+    else if (name==Constants::ParticleLayoutType) {
+        return new ParticleLayoutView();
+    }
+    else if (name==Constants::ParticleType) {
+        return new ParticleView();
+    }
+    else if (name==Constants::TransformationType) {
+        return new TransformationView();
+    }
+    else if (name==Constants::ParticleCoreShellType) {
+        return new ParticleCoreShellView();
+    }
+    else if (name==Constants::ParticleCompositionType) {
+        return new ParticleCompositionView();
+    }
+    else if (name==Constants::ParticleDistributionType) {
+        return new ParticleDistributionView();
+    }
+    else if (name==Constants::InterferenceFunctionRadialParaCrystalType) {
+        return new InterferenceFunctionRadialParaCrystalView();
+    }
+    else if (name==Constants::InterferenceFunction2DParaCrystalType) {
+        return new InterferenceFunction2DParaCrystalView();
+    }
+    else if (name==Constants::InterferenceFunction1DLatticeType) {
+        return new InterferenceFunction1DLatticeView();
+    }
+    else if (name==Constants::InterferenceFunction2DLatticeType) {
+        return new InterferenceFunction2DLatticeView();
+    }
+    else {
+        //qDebug() << "SampleViewFactory::createSampleView() -> Error! Can't create a view for" << name;
+//        throw GUIHelpers::Error("SampleViewFactory::createSampleView() -> Error! Can't create a view for " + name);
+    }
+
+    return 0;
+}
diff --git a/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h
new file mode 100644
index 0000000..eeaf76d
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleViewFactory.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleViewFactory.h
+//! @brief     Defines class SampleViewFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEVIEWFACTORY_H
+#define SAMPLEVIEWFACTORY_H
+
+#include "WinDllMacros.h"
+#include <QMap>
+#include <QStringList>
+
+class IView;
+
+class BA_CORE_API_ SampleViewFactory
+{
+public:
+    static bool isValidType(const QString &name);
+    static IView *createSampleView(const QString &name);
+
+    static bool isValidExampleName();
+
+private:
+    static QStringList m_valid_item_names;
+};
+
+
+#endif // SAMPLEVIEWFACTORY_H
diff --git a/GUI/coregui/Views/SampleDesigner/SampleWidgetBox.cpp b/GUI/coregui/Views/SampleDesigner/SampleWidgetBox.cpp
new file mode 100644
index 0000000..81afa40
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleWidgetBox.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleWidgetBox.cpp
+//! @brief     Implements class SampleWidgetBox
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleWidgetBox.h"
+#include "styledbar.h"
+#include "widgetbox.h"
+#include <QVBoxLayout>
+
+#if QT_VERSION < 0x050000
+#define QStringLiteral QString
+#endif
+
+
+SampleWidgetBox::SampleWidgetBox(SampleDesignerInterface *core, QWidget *parent)
+    : QWidget(parent)
+    , m_core(core)
+    , m_widgetBox(0)
+{
+    //Manhattan::StyledBar *bar = new Manhattan::StyledBar(this);
+
+    setWindowTitle("Items Toolbox");
+
+    m_widgetBox = new qdesigner_internal::WidgetBox(m_core, this);
+    m_widgetBox->setFileName(QStringLiteral(":/widgetbox/widgetbox.xml"));
+    m_widgetBox->load();
+    m_widgetBox->setWindowTitle(QLatin1String("Widget Box"));
+    m_widgetBox->setObjectName(QLatin1String("WidgetBox"));
+
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+//    layout->addWidget(bar);
+    layout->addWidget(m_widgetBox);
+    setLayout(layout);
+
+}
diff --git a/GUI/coregui/Views/SampleDesigner/SampleWidgetBox.h b/GUI/coregui/Views/SampleDesigner/SampleWidgetBox.h
new file mode 100644
index 0000000..402de2e
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/SampleWidgetBox.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/SampleWidgetBox.h
+//! @brief     Defines class SampleWidgetBox
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEWIDGETBOX_H
+#define SAMPLEWIDGETBOX_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class QDesignerWidgetBoxInterface;
+class SampleDesignerInterface;
+
+//! widget box and tool window on the left side of SampleView
+class BA_CORE_API_ SampleWidgetBox : public QWidget
+{
+public:
+    explicit SampleWidgetBox(SampleDesignerInterface *core, QWidget *parent);
+
+private:
+    SampleDesignerInterface *m_core;
+    QDesignerWidgetBoxInterface *m_widgetBox;
+};
+
+#endif // SAMPLEWIDGETBOX_H
diff --git a/GUI/coregui/Views/SampleDesigner/TransformationView.cpp b/GUI/coregui/Views/SampleDesigner/TransformationView.cpp
new file mode 100644
index 0000000..71d1b94
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/TransformationView.cpp
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/TransformationView.cpp
+//! @brief     Implements class TransformationView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "TransformationView.h"
+#include "DesignerHelper.h"
+#include "item_constants.h"
+
+
+TransformationView::TransformationView(QGraphicsItem *parent)
+    : ConnectableView(parent)
+{
+    setName(Constants::TransformationType);
+    setColor(DesignerHelper::getDefaultTransformationColor());
+    setRectangle( DesignerHelper::getDefaultBoundingRect(getName()) );
+    addPort("out", NodeEditorPort::OUTPUT, NodeEditorPort::TRANSFORMATION);
+    m_roundpar = 3;
+}
diff --git a/GUI/coregui/Views/SampleDesigner/TransformationView.h b/GUI/coregui/Views/SampleDesigner/TransformationView.h
new file mode 100644
index 0000000..e7da515
--- /dev/null
+++ b/GUI/coregui/Views/SampleDesigner/TransformationView.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleDesigner/TransformationView.h
+//! @brief     Defines class TransformationView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TRANSFORMATIONVIEW_H
+#define TRANSFORMATIONVIEW_H
+
+
+#include "ConnectableView.h"
+
+class TransformationView : public ConnectableView
+{
+    Q_OBJECT
+
+public:
+    enum { TYPE = DesignerHelper::TRANSFORMATION };
+
+    TransformationView(QGraphicsItem *parent = 0);
+
+    int type() const { return TYPE; }
+};
+
+#endif // TRANSFORMATIONVIEW_H
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_align.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_align.png
new file mode 100644
index 0000000..a225d35
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_align.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_center.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_center.png
new file mode 100644
index 0000000..6908965
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_center.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_hand.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_hand.png
new file mode 100644
index 0000000..6d4cbc0
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_hand.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_materialeditor.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_materialeditor.png
new file mode 100644
index 0000000..204bef9
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_materialeditor.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_pointer.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_pointer.png
new file mode 100644
index 0000000..503d3ac
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_pointer.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_recycle.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_recycle.png
new file mode 100644
index 0000000..9c11542
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_recycle.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_recycle_dark.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_recycle_dark.png
new file mode 100644
index 0000000..339d1e7
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_recycle_dark.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_redo.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_redo.png
new file mode 100644
index 0000000..821a118
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_redo.png differ
diff --git a/GUI/coregui/Views/SampleDesigner/images/toolbar_unddo.png b/GUI/coregui/Views/SampleDesigner/images/toolbar_unddo.png
new file mode 100644
index 0000000..78d8cb2
Binary files /dev/null and b/GUI/coregui/Views/SampleDesigner/images/toolbar_unddo.png differ
diff --git a/GUI/coregui/Views/SampleView.cpp b/GUI/coregui/Views/SampleView.cpp
new file mode 100644
index 0000000..23889bd
--- /dev/null
+++ b/GUI/coregui/Views/SampleView.cpp
@@ -0,0 +1,333 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleView.cpp
+//! @brief     Implements class SampleView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleView.h"
+#include "FilterPropertyProxy.h"
+#include "InfoWidget.h"
+#include "ItemFactory.h"
+#include "SampleDesigner.h"
+#include "SamplePropertyWidget.h"
+#include "SampleToolBar.h"
+#include "SampleViewComponents.h"
+#include "mainwindow.h"
+#include <QDebug>
+#include <QDockWidget>
+#include <QMenu>
+#include <QTimer>
+
+SampleView::SampleView(MainWindow *mainWindow)
+    : Manhattan::FancyMainWindow(mainWindow)
+    , m_sampleDesigner(new SampleDesigner(this))
+    , m_toolBar(0)
+    , m_sampleModel(mainWindow->sampleModel())
+    , m_instrumentModel(mainWindow->instrumentModel())
+{
+    setObjectName("SampleView");
+
+    setCentralWidget(m_sampleDesigner->getCentralWidget());
+
+    setDocumentMode(true);
+    setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::South);
+    setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
+    setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
+
+    initSubWindows();
+    initSelectionModel();
+
+    for (int i = 0; i < NUMBER_OF_SUB_WINDOWS; i++) {
+        QWidget *subWindow = m_subWindows[i];
+        //subWindow->setWindowTitle(subs[i]->windowTitle());
+        m_dockWidgets[i] = addDockForWidget(subWindow);
+        m_widget_to_dock[subWindow] = m_dockWidgets[i];
+        m_dock_to_widget[m_dockWidgets[i]] = subWindow;
+
+        // Since we have 1-pixel splitters, we generally want to remove
+        // frames around item views. So we apply this hack for now.
+        QList<QAbstractItemView*> frames =
+                subWindow->findChildren<QAbstractItemView*>();
+        for (int i = 0 ; i< frames.count(); ++i)
+            frames[i]->setFrameStyle(QFrame::NoFrame);
+
+    }
+    resetToDefaultLayout();
+
+    createActions();
+
+    connectSignals();
+}
+
+SampleView::~SampleView()
+{
+    delete m_sampleDesigner;
+}
+
+void SampleView::initSubWindows()
+{
+    qFill(m_subWindows, m_subWindows + NUMBER_OF_SUB_WINDOWS,
+          static_cast<QWidget*>(0));
+
+    m_subWindows[WIDGET_BOX] =
+            SampleViewComponents::createWidgetBox(m_sampleDesigner, this);
+
+    m_tree_view = SampleViewComponents::createTreeView(m_sampleModel, this);
+    m_subWindows[SAMPLE_TREE] = m_tree_view;
+    m_tree_view->expandAll();
+    connect(m_tree_view->model(), SIGNAL(rowsInserted(QModelIndex,int,int)),
+            m_tree_view, SLOT(expandAll()));
+
+    m_subWindows[PROPERTY_EDITOR] = new SamplePropertyWidget(m_tree_view->selectionModel(), this);
+
+    InfoWidget *infoWidget = new InfoWidget(this);
+    connect(infoWidget, SIGNAL(widgetHeightRequest(int)), this, SLOT(setDockHeightForWidget(int)));
+    connect(infoWidget, SIGNAL(widgetCloseRequest()), this, SLOT(onWidgetCloseRequest()));
+    infoWidget->setSampleModel(m_sampleModel);
+    infoWidget->setInstrumentModel(m_instrumentModel);
+    m_subWindows[INFO] = infoWidget;
+
+    m_sampleDesigner->setSampleModel(m_sampleModel);
+    m_sampleDesigner->setInstrumentModel(m_instrumentModel);
+    m_sampleDesigner->setSelectionModel(m_tree_view->selectionModel(), dynamic_cast<FilterPropertyProxy*>(const_cast<QAbstractItemModel*>(m_tree_view->model())));
+}
+
+void SampleView::initSelectionModel()
+{
+    m_selection_model = m_tree_view->selectionModel();
+}
+
+void SampleView::createActions()
+{
+    m_add_item_mapper = new QSignalMapper(this);
+    connect(m_add_item_mapper, SIGNAL(mapped(const QString &)),
+            this, SLOT(addItem(const QString &)));
+
+    m_delete_item_action = new QAction("Delete", this);
+    m_delete_item_action->setStatusTip("Delete current object");
+    connect(m_delete_item_action, SIGNAL(triggered()),
+            this, SLOT(deleteItem()));
+}
+
+void SampleView::resetToDefaultLayout()
+{
+    setTrackingEnabled(false);
+    QList<QDockWidget *> dockWidgetList = dockWidgets();
+    foreach (QDockWidget *dockWidget, dockWidgetList) {
+        dockWidget->setFloating(false);
+        removeDockWidget(dockWidget);
+    }
+
+    addDockWidget(Qt::LeftDockWidgetArea,
+                  m_dockWidgets[WIDGET_BOX]);
+    addDockWidget(Qt::RightDockWidgetArea,
+                  m_dockWidgets[SAMPLE_TREE]);
+    addDockWidget(Qt::RightDockWidgetArea,
+                  m_dockWidgets[PROPERTY_EDITOR]);
+    addDockWidget(Qt::BottomDockWidgetArea,
+                  m_dockWidgets[INFO]);
+
+    foreach (QDockWidget *dockWidget, dockWidgetList)
+        dockWidget->show();
+
+    setTrackingEnabled(true);
+}
+
+void SampleView::addItem(const QString &item_name)
+{
+    QModelIndex currentIndex = FilterPropertyProxy::toSourceIndex(getTreeView()->currentIndex());
+
+    QModelIndex currentIndexAtColumnZero = getIndexAtColumnZero(currentIndex);
+    SessionItem *new_item
+        = getSampleModel()->insertNewItem(item_name, currentIndexAtColumnZero);
+    if (new_item) {
+        QModelIndex new_index = getSampleModel()->indexOfItem(new_item);
+        scrollToIndex(new_index);
+    }
+    setDirty();
+}
+
+void SampleView::deleteItem()
+{
+    QModelIndex currentIndex = FilterPropertyProxy::toSourceIndex(getTreeView()->currentIndex());
+
+    if (!currentIndex.isValid()) return;
+    QModelIndex parent_index = getSampleModel()->parent(currentIndex);
+    int row = currentIndex.row();
+    if (currentIndex.isValid()) {
+        getSampleModel()->removeRows(row, 1, parent_index);
+        setDirty();
+    }
+}
+
+//! A hack to request update of QDockWidget size if its child (e.g. InfoWidget) wants it.
+//! The problem bypassed here is that there is no direct method to QMainWindow to recalculate
+//! position of splitters surrounding given QDockWidget. So our child QWidget requests here
+//! the change of Min/Max size of QDockWidget, this will trigger recalculation of QDockWidget
+//! layout and will force QDockWidget to respect sizeHints provided by ChildWidget. Later (in one
+//! single timer shot) we return min/max sizes of QDockWidget back to re-enable splitters
+//! functionality.
+void SampleView::setDockHeightForWidget(int height)
+{
+    qDebug() << "SampleView::setDockHeightForWidget(int height)" << height;
+    QWidget *widget = qobject_cast<QWidget *>(sender());
+    Q_ASSERT(widget);
+    QDockWidget *dock = m_widget_to_dock[widget];
+    Q_ASSERT(dock);
+
+    m_dock_info.m_dock = dock;
+    m_dock_info.m_min_size = dock->minimumSize();
+    m_dock_info.m_max_size = dock->maximumSize();
+
+    if(height >0) {
+        if(dock->height() < height) {
+            dock->setMinimumHeight(height);
+        } else {
+            dock->setMaximumHeight(height);
+        }
+    }
+
+    QTimer::singleShot(1, this, SLOT(dockToMinMaxSizes()));
+}
+
+void SampleView::onWidgetCloseRequest()
+{
+    QWidget *widget = qobject_cast<QWidget *>(sender());
+    Q_ASSERT(widget);
+    QDockWidget *dock = m_widget_to_dock[widget];
+    Q_ASSERT(dock);
+
+    dock->toggleViewAction()->trigger();
+}
+
+void SampleView::showContextMenu(const QPoint &pnt)
+{
+    QMenu menu;
+    QMenu add_menu(QString("Add"));
+    QVector<QString> addItemNames;
+    QModelIndex parent_index = FilterPropertyProxy::toSourceIndex(getTreeView()->indexAt(pnt));
+    getTreeView()->setCurrentIndex(parent_index);
+    if (!parent_index.isValid()) {
+        addItemNames = ItemFactory::getValidTopItemNames().toVector();
+    } else {
+        addItemNames = getSampleModel()->getAcceptableDefaultItemTypes(parent_index);
+    }
+    if (addItemNames.size() > 0) {
+        foreach (QString item_name, addItemNames) {
+            QAction *add_action = 0;
+            if (m_add_action_map.contains(item_name)) {
+                add_action = m_add_action_map[item_name];
+            }
+            else {
+                add_action = new QAction(item_name, this);
+                m_add_action_map[item_name] = add_action;
+                connect(add_action, SIGNAL(triggered()),
+                        m_add_item_mapper, SLOT(map()));
+                m_add_item_mapper->setMapping(add_action, item_name);
+            }
+            add_menu.addAction(add_action);
+        }
+        menu.addMenu(&add_menu);
+    }
+    if (parent_index.isValid()) {
+        menu.addAction(m_delete_item_action);
+    }
+    if (!menu.isEmpty()) {
+        menu.exec(getTreeView()->mapToGlobal(pnt));
+    }
+}
+
+void SampleView::dockToMinMaxSizes()
+{
+    Q_ASSERT(m_dock_info.m_dock);
+    m_dock_info.m_dock->setMinimumSize(m_dock_info.m_min_size);
+    m_dock_info.m_dock->setMaximumSize(m_dock_info.m_max_size);
+    m_dock_info.m_dock = 0;
+}
+
+void SampleView::onDockVisibilityChangeV2(bool status)
+{
+    QDockWidget *dock = qobject_cast<QDockWidget *>(sender());
+    Q_ASSERT(dock);
+
+    InfoWidget *infoWidget = dynamic_cast<InfoWidget *>(m_dock_to_widget[dock]);
+    Q_ASSERT(infoWidget);
+
+    infoWidget->onDockVisibilityChange(status);
+}
+
+void SampleView::connectSignals()
+{
+
+    connect(this, SIGNAL(resetLayout()), this, SLOT(resetToDefaultLayout()));
+
+    // toolBar should be initialized after MaterialBrowser
+    m_toolBar = new SampleToolBar(this);
+    connect(m_toolBar, SIGNAL(deleteItems()),
+            m_sampleDesigner->getView(), SLOT(deleteSelectedItems()));
+    connect(m_toolBar, SIGNAL(selectionMode(int)), m_sampleDesigner->getView(), SLOT(onSelectionMode(int)));
+    connect(m_sampleDesigner->getView(), SIGNAL(selectionModeChanged(int)),m_toolBar, SLOT(onViewSelectionMode(int)));
+    connect(m_toolBar, SIGNAL(centerView()), m_sampleDesigner->getView(), SLOT(onCenterView()));
+    connect(m_toolBar, SIGNAL(smartAlign()), m_sampleDesigner, SLOT(onSmartAlign()));
+    connect(m_toolBar, SIGNAL(changeScale(double)),
+            m_sampleDesigner->getView(), SLOT(onChangeScale(double)));
+
+    connect(m_toolBar, SIGNAL(zoomOut()),
+            m_sampleDesigner->getView(), SLOT(zoomOut()));
+    connect(m_toolBar, SIGNAL(zoomIn()),
+            m_sampleDesigner->getView(), SLOT(zoomIn()));
+
+    connect(m_sampleDesigner->getScene(), SIGNAL(selectionModeChangeRequest(int)),
+            m_sampleDesigner->getView(), SLOT(onSelectionMode(int)));
+
+    // connect context menu for tree view
+    connect(m_tree_view, SIGNAL(customContextMenuRequested(const QPoint &)),
+            this, SLOT(showContextMenu(const QPoint &)));
+
+    addToolBar(m_toolBar);
+
+    for (int i = 0; i < NUMBER_OF_SUB_WINDOWS; i++) {
+        if(i == INFO) {
+            connect(m_dockWidgets[i], SIGNAL(visibilityChanged(bool)),
+                    this, SLOT(onDockVisibilityChangeV2(bool)));
+
+        }
+    }
+
+}
+
+void SampleView::scrollToIndex(const QModelIndex &index)
+{
+    if (index.isValid()) {
+        m_tree_view->scrollTo(index);
+    }
+}
+
+QModelIndex SampleView::getIndexAtColumnZero(const QModelIndex &index)
+{
+    if (index==QModelIndex() || index.column()==0) return index;
+    QModelIndex parent_index = getSampleModel()->parent(index);
+    return getSampleModel()->index(index.row(), 0, parent_index);
+}
+
+SampleModel *SampleView::getSampleModel()
+{
+    return m_sampleModel;
+}
+
+QTreeView *SampleView::getTreeView()
+{
+    return m_tree_view;
+}
+
+
diff --git a/GUI/coregui/Views/SampleView.h b/GUI/coregui/Views/SampleView.h
new file mode 100644
index 0000000..d46590e
--- /dev/null
+++ b/GUI/coregui/Views/SampleView.h
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleView.h
+//! @brief     Defines class SampleView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEVIEW_H
+#define SAMPLEVIEW_H
+
+#include "WinDllMacros.h"
+#include "fancymainwindow.h"
+#include <QAction>
+#include <QSignalMapper>
+#include <QTreeView>
+
+class MainWindow;
+class SampleModel;
+class InstrumentModel;
+class SampleDesigner;
+class SampleToolBar;
+
+
+class BA_CORE_API_ SampleView : public Manhattan::FancyMainWindow
+{
+    Q_OBJECT
+
+public:
+    enum ESubWindows
+    {
+        WIDGET_BOX,         // drag & drop items
+        SAMPLE_TREE,             // a tree view
+        PROPERTY_EDITOR,    // property editor
+        INFO,              // status/info display
+        NUMBER_OF_SUB_WINDOWS
+    };
+
+    SampleView(MainWindow *mainWindow);
+    virtual ~SampleView();
+
+public slots:
+    void resetToDefaultLayout();
+    void addItem(const QString &item_name);
+    void deleteItem();
+    void setDockHeightForWidget(int height);
+    void onWidgetCloseRequest();
+
+protected slots:
+    void showContextMenu(const QPoint &pnt);
+    void setDirty(bool dirty=true) { setWindowModified(dirty); }
+    void dockToMinMaxSizes();
+    void onDockVisibilityChangeV2(bool status);
+
+private:
+    //! Stores sizes of dock widget
+    struct DockSizeInfo {
+        DockSizeInfo():m_dock(0){}
+        QDockWidget *m_dock;
+        QSize m_min_size;
+        QSize m_max_size;
+    };
+
+    void initSubWindows();
+    void initSelectionModel();
+    void createActions();
+    void connectSignals();
+    void clearSignalMapper();
+    void scrollToIndex(const QModelIndex &index);
+    QModelIndex getIndexAtColumnZero(const QModelIndex &index);
+
+    SampleModel *getSampleModel();
+    QTreeView *getTreeView();
+
+   // MaterialBrowser *m_materialBrowser;  // material editor
+    SampleDesigner *m_sampleDesigner;    // main sample view
+    SampleToolBar *m_toolBar;            // toolbar
+    QWidget *m_subWindows[NUMBER_OF_SUB_WINDOWS];
+    QDockWidget *m_dockWidgets[NUMBER_OF_SUB_WINDOWS];
+
+    QMap<QWidget *, QDockWidget *> m_widget_to_dock;
+    QMap<QDockWidget *, QWidget *> m_dock_to_widget;
+
+    QSignalMapper *m_add_item_mapper;
+    QMap<QString, QAction *> m_add_action_map;
+    QAction *m_delete_item_action;
+
+    SampleModel *m_sampleModel;
+    InstrumentModel *m_instrumentModel;
+    QTreeView *m_tree_view;
+
+    QItemSelectionModel *m_selection_model;
+
+    DockSizeInfo m_dock_info;
+};
+
+
+#endif // SAMPLEVIEW_H
diff --git a/GUI/coregui/Views/SampleViewComponents.cpp b/GUI/coregui/Views/SampleViewComponents.cpp
new file mode 100644
index 0000000..c5eefe1
--- /dev/null
+++ b/GUI/coregui/Views/SampleViewComponents.cpp
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleViewComponents.cpp
+//! @brief     Implements class SampleViewComponents
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SampleViewComponents.h"
+#include "FilterPropertyProxy.h"
+
+
+SampleWidgetBox *SampleViewComponents::createWidgetBox(
+        SampleDesignerInterface *core, QWidget *parent)
+{
+    return new SampleWidgetBox(core, parent);
+}
+
+ItemTreeView *SampleViewComponents::createTreeView(
+        SampleModel *sampleModel, QWidget *parent)
+{
+    ItemTreeView *tree_view = new ItemTreeView(parent);
+    FilterPropertyProxy *proxy = new FilterPropertyProxy(1, parent);
+    proxy->setSourceModel(sampleModel);
+    tree_view->setModel(proxy);
+    tree_view->setAttribute(Qt::WA_MacShowFocusRect, false);
+    return tree_view;
+}
+
+
+
diff --git a/GUI/coregui/Views/SampleViewComponents.h b/GUI/coregui/Views/SampleViewComponents.h
new file mode 100644
index 0000000..8e2a8e5
--- /dev/null
+++ b/GUI/coregui/Views/SampleViewComponents.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SampleViewComponents.h
+//! @brief     Defines class SampleViewComponents
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SAMPLEVIEWCOMPONENTS_H
+#define SAMPLEVIEWCOMPONENTS_H
+
+#include "ItemTreeView.h"
+#include "SampleModel.h"
+#include "SampleWidgetBox.h"
+
+
+
+//class BA_CORE_API_ SampleInfoStreamInterface : public QWidget
+//{
+//public:
+//    explicit SampleInfoStreamInterface(QWidget *parent = 0) : QWidget(parent)
+//    {
+//        setMinimumSize(128, 128);
+//        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+//    }
+//};
+
+
+
+class BA_CORE_API_ SampleViewComponents
+{
+public:
+    static SampleWidgetBox *createWidgetBox(
+            SampleDesignerInterface *core, QWidget *parent);
+//    static SamplePropertyEditor *createPropertyEditor(
+//            QItemSelectionModel *selection_model, QWidget *parent);
+    static ItemTreeView *createTreeView(
+            SampleModel *sample_model, QWidget *parent);
+//    static SampleInfoStreamInterface *createInfoStream(QWidget *parent);
+};
+
+#endif // SAMPLEVIEWCOMPONENTS_H
diff --git a/GUI/coregui/Views/SessionModelView.cpp b/GUI/coregui/Views/SessionModelView.cpp
new file mode 100644
index 0000000..1f73017
--- /dev/null
+++ b/GUI/coregui/Views/SessionModelView.cpp
@@ -0,0 +1,129 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SessionModelView.cpp
+//! @brief     Implements class SessionModelView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SessionModelView.h"
+#include "InstrumentModel.h"
+#include "JobModel.h"
+#include "MaterialModel.h"
+#include "RealDataModel.h"
+#include "SampleModel.h"
+#include "SessionModelDelegate.h"
+#include "mainwindow.h"
+#include <QToolBar>
+#include <QToolButton>
+#include <QTreeView>
+#include <QVBoxLayout>
+
+
+SessionModelView::ModelTree::ModelTree(SessionModel *model, QTreeView *tree)
+    : m_model(model), m_tree(tree), m_is_expanded(false)
+{
+    Q_ASSERT(m_model);
+    Q_ASSERT(m_tree);
+    m_tree->setModel(m_model);
+    if(model->rowCount(QModelIndex()) > 0) {
+        setExpanded(true);
+    }
+}
+
+void SessionModelView::ModelTree::toggleExpanded()
+{
+    setExpanded(!isExpanded());
+}
+
+void SessionModelView::ModelTree::setExpanded(bool expanded)
+{
+    Q_ASSERT(m_tree);
+    if(expanded) {
+        m_tree->expandAll();
+        m_tree->resizeColumnToContents(0);
+        m_tree->resizeColumnToContents(1);
+    } else {
+        m_tree->collapseAll();
+    }
+    m_is_expanded = expanded;
+}
+
+void SessionModelView::ModelTree::setActive(bool is_active)
+{
+    if(is_active) {
+        if(m_tree->model()) return;
+        m_tree->setModel(m_model);
+        setExpanded(true);
+    } else {
+        if(!m_tree->model()) return;
+        m_tree->setModel(0);
+    }
+}
+
+
+SessionModelView::SessionModelView(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_mainWindow(mainWindow)
+    , m_toolBar(new QToolBar(this))
+    , m_tabs(new QTabWidget(this))
+    , m_expandCollapseButton(0)
+    , m_delegate(new SessionModelDelegate(this))
+{
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+
+    m_expandCollapseButton = new QToolButton;
+    m_expandCollapseButton->setText("Expand / collapse tree");
+    m_expandCollapseButton->setIcon(QIcon(":/images/toolbar_expand_collapse_tree.svg"));
+    m_expandCollapseButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    m_expandCollapseButton->setToolTip("Click to  switch between expanded/collapsed tree view");
+    m_toolBar->addWidget(m_expandCollapseButton);
+    connect(m_expandCollapseButton, SIGNAL(clicked()), this, SLOT(onExpandCollapseTree()));
+
+    layout->addWidget(m_toolBar);
+    layout->addWidget(m_tabs);
+    setLayout(layout);
+
+    init_tabs();
+
+    //setViewActive(false);
+
+}
+
+//! Sets given view to enabled/disable state. If disabled, all trees will be disconnected from models
+void SessionModelView::setViewActive(bool is_active)
+{
+    for(int i=0; i<m_content.size(); ++i) {
+        m_content[i].setActive(is_active);
+    }
+}
+
+void SessionModelView::onExpandCollapseTree()
+{
+    m_content[m_tabs->currentIndex()].toggleExpanded();
+}
+
+void SessionModelView::init_tabs()
+{
+    m_content.clear();
+    m_content.push_back(ModelTree(m_mainWindow->instrumentModel(), new QTreeView(this)));
+    m_content.push_back(ModelTree(m_mainWindow->sampleModel(), new QTreeView(this)));
+    m_content.push_back(ModelTree(m_mainWindow->realDataModel(), new QTreeView(this)));
+    m_content.push_back(ModelTree(m_mainWindow->materialModel(), new QTreeView(this)));
+    m_content.push_back(ModelTree(m_mainWindow->jobModel(), new QTreeView(this)));
+    for(int i=0; i<m_content.size(); ++i) {
+        m_tabs->addTab(m_content[i].m_tree, m_content[i].m_model->getModelTag());
+        m_content[i].m_tree->setItemDelegate(m_delegate);
+    }
+}
+
diff --git a/GUI/coregui/Views/SessionModelView.h b/GUI/coregui/Views/SessionModelView.h
new file mode 100644
index 0000000..7c1dc17
--- /dev/null
+++ b/GUI/coregui/Views/SessionModelView.h
@@ -0,0 +1,72 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SessionModelView.h
+//! @brief     Defines class SessionModelView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SESSIONMODELVIEW_H
+#define SESSIONMODELVIEW_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class MainWindow;
+class QToolBar;
+class QTabWidget;
+class QToolButton;
+class SessionModel;
+class QTreeView;
+class SessionModelDelegate;
+
+//! The SessionModelView is a technical view which shows the content all current application
+//! models. It appears as an additional view in the main navigation bar on the left, right
+//! after the jobView (if corresponding setting of MainWindow is On).
+
+class BA_CORE_API_ SessionModelView : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SessionModelView(MainWindow *mainWindow = 0);
+
+    // keeps info about tree and it's model together
+    class ModelTree {
+    public:
+        ModelTree() : m_model(0), m_tree(0), m_is_expanded(false) {}
+        ModelTree(SessionModel *model, QTreeView *tree);
+        void toggleExpanded();
+        void setExpanded(bool expanded);
+        bool isExpanded() const { return m_is_expanded;}
+        void setActive(bool is_active);
+        SessionModel *m_model;
+        QTreeView *m_tree;
+        bool m_is_expanded;
+    };
+
+    void setViewActive(bool is_active);
+
+private slots:
+    void onExpandCollapseTree();
+
+private:
+    void init_tabs();
+
+    MainWindow *m_mainWindow;
+    QToolBar *m_toolBar;
+    QTabWidget *m_tabs;
+    QToolButton *m_expandCollapseButton;
+    SessionModelDelegate *m_delegate;
+    QVector<ModelTree> m_content;
+};
+
+#endif // SESSIONMODELVIEW_H
diff --git a/GUI/coregui/Views/SimulationView.cpp b/GUI/coregui/Views/SimulationView.cpp
new file mode 100644
index 0000000..5ae2711
--- /dev/null
+++ b/GUI/coregui/Views/SimulationView.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationView.cpp
+//! @brief     Implements class SimulationView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationView.h"
+#include "SimulationSetupWidget.h"
+#include "StyledToolBar.h"
+#include "mainwindow.h"
+#include <QVBoxLayout>
+
+SimulationView::SimulationView(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_simulationSetupWidget(new SimulationSetupWidget)
+    , m_toolBar(new StyledToolBar)
+{
+    m_toolBar->setMinimumSize(24, 24);
+
+    m_simulationSetupWidget->setApplicationModels(mainWindow->models());
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setSizeConstraint(QLayout::SetNoConstraint);
+    mainLayout->addWidget(m_toolBar);
+    mainLayout->addWidget(m_simulationSetupWidget);
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    setLayout(mainLayout);
+}
+
+
+void SimulationView::updateSimulationViewElements()
+{
+    m_simulationSetupWidget->updateViewElements();
+}
+
+void SimulationView::onRunSimulationShortcut()
+{
+    m_simulationSetupWidget->onRunSimulation();
+}
diff --git a/GUI/coregui/Views/SimulationView.h b/GUI/coregui/Views/SimulationView.h
new file mode 100644
index 0000000..d1988c2
--- /dev/null
+++ b/GUI/coregui/Views/SimulationView.h
@@ -0,0 +1,47 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationView.h
+//! @brief     Defines class SimulationView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONVIEW_H
+#define SIMULATIONVIEW_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class MainWindow;
+class SimulationSetupWidget;
+class StyledToolBar;
+
+class BA_CORE_API_ SimulationView : public QWidget
+{
+    Q_OBJECT
+
+public:
+    enum ETabViewId { SIMULATION_SETUP, QUICK_SIMULATION};
+    SimulationView(MainWindow *mainWindow);
+
+    void updateSimulationViewElements();
+
+public slots:
+    void onRunSimulationShortcut();
+
+private:
+    SimulationSetupWidget *m_simulationSetupWidget;
+    StyledToolBar *m_toolBar;
+};
+
+
+#endif // SIMULATIONVIEW_H
+
diff --git a/GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.cpp b/GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.cpp
new file mode 100644
index 0000000..a15cf68
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.cpp
@@ -0,0 +1,181 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.cpp
+//! @brief     Implements class PythonScriptWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "PythonScriptWidget.h"
+#include "DesignerHelper.h"
+#include "DomainSimulationBuilder.h"
+#include "GISASSimulation.h"
+#include "InstrumentModel.h"
+#include "PythonFormatting.h"
+#include "PythonSyntaxHighlighter.h"
+#include "SampleModel.h"
+#include "SimulationOptionsItem.h"
+#include "WarningSignWidget.h"
+#include "projectdocument.h"
+#include "projectmanager.h"
+#include <QDebug>
+#include <QDir>
+#include <QFile>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QPushButton>
+#include <QScrollBar>
+#include <QStandardPaths>
+#include <QStyle>
+#include <QTextEdit>
+#include <QTextStream>
+#include <QToolBar>
+#include <QToolButton>
+#include <QVBoxLayout>
+
+PythonScriptWidget::PythonScriptWidget(QWidget *parent)
+    : QDialog(parent)
+    , m_toolBar(0)
+    , m_textEdit(0)
+    , m_warningSign(0)
+{
+    setWindowTitle("Python Script View");
+    setMinimumSize(128, 128);
+    resize(512, 400);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    m_toolBar = new QToolBar;
+    m_toolBar->setFixedHeight(28);
+    m_toolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+    const int size = style()->pixelMetric(QStyle::PM_SmallIconSize);
+    m_toolBar->setIconSize(QSize(size, size));
+    m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+
+    QPushButton *exportToFileButton = new QPushButton;
+    exportToFileButton->setText("Save to file");
+    exportToFileButton->setToolTip("Opens dialog to save given script into the file");
+    connect(exportToFileButton, SIGNAL(clicked()), this, SLOT(onExportToFileButton()));
+    exportToFileButton->setAutoDefault(false);
+    m_toolBar->addWidget(exportToFileButton);
+
+    m_textEdit = new QTextEdit;
+    m_textEdit->setReadOnly(true);
+    QFont textFont("Monospace");
+    m_textEdit->setFont(textFont);
+    m_textEdit->setFontPointSize(DesignerHelper::getPythonEditorFontSize());
+    m_textEdit->setLineWrapMode(QTextEdit::NoWrap);
+    PythonSyntaxHighlighter *highlighter = new PythonSyntaxHighlighter(m_textEdit->document());
+    Q_UNUSED(highlighter);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setContentsMargins(0, 0, 0, 0);
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+    mainLayout->addWidget(m_toolBar);
+    mainLayout->addWidget(m_textEdit);
+
+    setLayout(mainLayout);
+
+    setAttribute(Qt::WA_DeleteOnClose, true);
+}
+
+void PythonScriptWidget::generatePythonScript(const MultiLayerItem *sampleItem,
+        const InstrumentItem *instrumentItem, const SimulationOptionsItem *optionItem,
+                                              const QString &outputDir)
+{
+    m_outputDir = outputDir;
+
+    delete m_warningSign;
+    m_warningSign = 0;
+
+    try{
+        const std::unique_ptr<GISASSimulation> P_simulation(
+            DomainSimulationBuilder::getSimulation(sampleItem, instrumentItem, optionItem));
+
+        QString code = QString::fromStdString(
+            PythonFormatting::simulationToPython(P_simulation.get()));
+        m_textEdit->clear();
+        m_textEdit->setText(code);
+
+    } catch(const std::exception &ex) {
+        m_warningSign = new WarningSignWidget(this);
+
+        QString message = QString(
+            "Generation of Python Script failed. Code is not complete.\n\n"
+            "It can happen if sample requires further assembling or some of sample parameters "
+            "are not valid. See details below.\n\n%1").arg(QString::fromStdString(ex.what()));
+
+        m_warningSign->setWarningMessage(message);
+        QPoint pos = getPositionForWarningSign();
+        m_warningSign->setPosition(pos.x(), pos.y());
+        m_warningSign->show();
+    }
+}
+
+//! adjusts position of warning label on widget move
+void PythonScriptWidget::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED(event);
+    if(m_warningSign) {
+        QPoint pos = getPositionForWarningSign();
+        m_warningSign->setPosition(pos.x(),pos.y());
+    }
+}
+
+void PythonScriptWidget::onExportToFileButton()
+{
+    QString dirname(m_outputDir);
+    if(dirname.isEmpty())
+        dirname = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
+
+    QString file_name = QFileDialog::getSaveFileName(this, "Select file", dirname,
+                            "Python scipts (*.py)", 0,
+                            QFileDialog::DontResolveSymlinks);
+
+    if(file_name.isEmpty()) return;
+
+    QFile file(file_name);
+    if (!file.open(QIODevice::WriteOnly)) {
+        qDebug() << "PythonScriptWidget::onExportToFileButton: Error! Can't save file";
+        QMessageBox warning_dialog(this);
+        warning_dialog.setIcon(QMessageBox::Warning);
+        warning_dialog.setText("File could not be opened for writing!");
+        warning_dialog.exec();
+        return;
+    }
+    QTextStream out(&file);
+    out << m_textEdit->toPlainText();
+    file.close();
+    raise();
+}
+
+//! Returns position for warning sign at the bottom left corner of the editor. The position will
+//! be adjusted according to the visibility of scroll bars
+QPoint PythonScriptWidget::getPositionForWarningSign()
+{
+    const int warning_sign_xpos = 38;
+    const int warning_sign_ypos = 38;
+
+    int x = width()-warning_sign_xpos;
+    int y = height()-warning_sign_ypos;
+
+    if(QScrollBar *horizontal = m_textEdit->horizontalScrollBar()) {
+        if(horizontal->isVisible())
+            y -= horizontal->height();
+    }
+
+    if(QScrollBar *vertical = m_textEdit->verticalScrollBar()) {
+        if(vertical->isVisible())
+            x -= vertical->width();
+    }
+
+    return QPoint(x, y);
+}
diff --git a/GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.h b/GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.h
new file mode 100644
index 0000000..1aeb944
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.h
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/PythonScriptWidget.h
+//! @brief     Defines class PythonScriptWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PYTHONSCRIPTWIDGET_H
+#define PYTHONSCRIPTWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QDialog>
+
+class QToolBar;
+class QTextEdit;
+class WarningSignWidget;
+class ProjectManager;
+class SampleModel;
+class InstrumentModel;
+class MultiLayerItem;
+class InstrumentItem;
+class SimulationOptionsItem;
+
+//! The PythonScriptWidget displays a python script which represents full simulation.
+//! Part of SimulationSetupWidget
+class BA_CORE_API_ PythonScriptWidget : public QDialog
+{
+    Q_OBJECT
+
+public:
+    PythonScriptWidget(QWidget *parent = 0);
+
+    void generatePythonScript(const MultiLayerItem *sampleItem,
+                              const InstrumentItem *instrumentItem,
+                              const SimulationOptionsItem *optionItem = 0,
+                              const QString &outputDir = QString());
+
+protected:
+    virtual void resizeEvent(QResizeEvent *event);
+
+private slots:
+    void onExportToFileButton();
+
+private:
+    QPoint getPositionForWarningSign();
+
+    QToolBar *m_toolBar;
+    QTextEdit *m_textEdit;
+    WarningSignWidget *m_warningSign;
+    QString m_outputDir;
+};
+
+#endif // PYTHONSCRIPTWIDGET_H
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.cpp b/GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.cpp
new file mode 100644
index 0000000..3c7d755
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.cpp
@@ -0,0 +1,171 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.cpp
+//! @brief     Implements class SimulationDataSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationDataSelectorWidget.h"
+#include "ApplicationModels.h"
+#include "InstrumentItem.h"
+#include "InstrumentModel.h"
+#include "MultiLayerItem.h"
+#include "RealDataItem.h"
+#include "RealDataModel.h"
+#include "SampleModel.h"
+#include <QComboBox>
+#include <QDebug>
+#include <QFileDialog>
+#include <QGroupBox>
+#include <QLabel>
+#include <QVBoxLayout>
+
+namespace
+{
+const QString select_instrument_tooltip
+    = "Select Instrument to simulate from those defined in Instrument View";
+const QString select_sample_tooltip
+    = "Select Sample to simulate from those defined in Sample View";
+const QString select_realdata_tooltip
+    = "Select real data to use during the fitting. \n"
+      "If None is selected, the standard simulation will be run.";
+}
+
+SimulationDataSelectorWidget::SimulationDataSelectorWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_instrumentCombo(new QComboBox)
+    , m_sampleCombo(new QComboBox)
+    , m_realDataCombo(new QComboBox)
+    , m_applicationModels(0)
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(0);
+
+    // selection of input parameters
+    QGroupBox *groupBox = new QGroupBox("Data selection");
+
+    QLabel *instrumentSelectionLabel = new QLabel(QStringLiteral("Select Instrument:"));
+    instrumentSelectionLabel->setToolTip(select_instrument_tooltip);
+    m_instrumentCombo->setToolTip(select_instrument_tooltip);
+    m_instrumentCombo->setAttribute(Qt::WA_MacShowFocusRect, false);
+
+    QLabel *sampleSelectionLabel = new QLabel(QStringLiteral("Select Sample:"));
+    sampleSelectionLabel->setToolTip(select_sample_tooltip);
+    m_sampleCombo->setToolTip(select_sample_tooltip);
+
+    QLabel *readDataSelectionLabel = new QLabel(QStringLiteral("Select Real Data:"));
+    readDataSelectionLabel->setToolTip(select_realdata_tooltip);
+    m_realDataCombo->setToolTip(select_realdata_tooltip);
+
+    // layout
+    QGridLayout *dataSelectionLayout = new QGridLayout;
+    dataSelectionLayout->setMargin(12); // to match margin in SimulationOptionsWidget
+
+    dataSelectionLayout->addWidget(instrumentSelectionLabel, 0, 0);
+    dataSelectionLayout->addWidget(m_instrumentCombo, 0, 1);
+    dataSelectionLayout->addWidget(sampleSelectionLabel, 1, 0);
+    dataSelectionLayout->addWidget(m_sampleCombo, 1, 1);
+    dataSelectionLayout->addWidget(readDataSelectionLabel, 2, 0);
+    dataSelectionLayout->addWidget(m_realDataCombo, 2, 1);
+    groupBox->setLayout(dataSelectionLayout);
+
+    mainLayout->addWidget(groupBox);
+    setLayout(mainLayout);
+
+}
+
+void SimulationDataSelectorWidget::setApplicationModels(ApplicationModels *applicationModels)
+{
+    m_applicationModels = applicationModels;
+    updateViewElements();
+}
+
+//! Returns selected MultiLayerItem taking into account that there might be several
+//! multilayers with same name.
+
+const MultiLayerItem *SimulationDataSelectorWidget::selectedMultiLayerItem() const
+{
+    auto items = m_applicationModels->sampleModel()->topItems();
+    if(items.isEmpty()) return nullptr;
+    return dynamic_cast<const MultiLayerItem *>(items.at(selectedSampleIndex()));
+}
+
+//! Returns selected InstrumentItem taking into account that there might be several
+//! instruments with same name.
+
+const InstrumentItem *SimulationDataSelectorWidget::selectedInstrumentItem() const
+{
+    auto items = m_applicationModels->instrumentModel()->topItems();
+    if(items.isEmpty()) return nullptr;
+    return dynamic_cast<const InstrumentItem *>(items.at(selectedInstrumentIndex()));
+}
+
+//! Returns selected InstrumentItem taking into account that there might be several
+//! instruments with same name.
+
+const RealDataItem *SimulationDataSelectorWidget::selectedRealDataItem() const
+{
+    auto items = m_applicationModels->realDataModel()->topItems();
+    if(items.isEmpty()) return nullptr;
+    if(selectedRealDataIndex() >=0 && selectedRealDataIndex()<items.size()) {
+        return dynamic_cast<const RealDataItem *>(items.at(selectedRealDataIndex()));
+    }
+    return nullptr;
+}
+
+void SimulationDataSelectorWidget::updateViewElements()
+{
+    Q_ASSERT(m_applicationModels);
+    updateSelection(m_instrumentCombo, m_applicationModels->instrumentModel()->topItemNames());
+    updateSelection(m_sampleCombo, m_applicationModels->sampleModel()->topItemNames(Constants::MultiLayerType));
+    updateSelection(m_realDataCombo, m_applicationModels->realDataModel()->topItemNames(), true);
+}
+
+int SimulationDataSelectorWidget::selectedInstrumentIndex() const
+{
+    return m_instrumentCombo->currentIndex();
+}
+
+int SimulationDataSelectorWidget::selectedSampleIndex() const
+{
+    return m_sampleCombo->currentIndex();
+}
+
+int SimulationDataSelectorWidget::selectedRealDataIndex() const
+{
+    // -1 because m_realDataCombo always contains "None" as a first entry
+    return m_realDataCombo->currentIndex() - 1;
+}
+
+//! Updates selection combo with string list while preserving previous selection.
+//! If allow_none == true, additional "None" item will be added to the combo.
+
+void SimulationDataSelectorWidget::updateSelection(QComboBox *comboBox,
+                                                        QStringList itemList, bool allow_none)
+{
+    QString previousItem = comboBox->currentText();
+
+    comboBox->clear();
+    if(itemList.isEmpty()) {
+        comboBox->setEnabled(false);
+        comboBox->addItem(QStringLiteral("Not yet defined"));
+    } else {
+        comboBox->setEnabled(true);
+        //qSort(itemList.begin(), itemList.end()); // uncomment, if we want alphabetical order
+        if(allow_none)
+            itemList.insert(-1, QStringLiteral("None"));
+        comboBox->addItems(itemList);
+        if(itemList.contains(previousItem))
+            comboBox->setCurrentIndex(itemList.indexOf(previousItem));
+    }
+}
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.h b/GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.h
new file mode 100644
index 0000000..faaf196
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationDataSelectorWidget.h
+//! @brief     Defines class SimulationDataSelectorWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONDATASELECTORWIDGET_H
+#define SIMULATIONDATASELECTORWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class ApplicationModels;
+class QComboBox;
+class MultiLayerItem;
+class InstrumentItem;
+class RealDataItem;
+
+//! The SimulationDataSelectorWidget class represents widget to select instrument, sample and
+//! real data. Located at the top of SimulationView.
+
+class BA_CORE_API_ SimulationDataSelectorWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SimulationDataSelectorWidget(QWidget *parent = 0);
+
+    void setApplicationModels(ApplicationModels *applicationModels);
+
+    const MultiLayerItem *selectedMultiLayerItem() const;
+    const InstrumentItem *selectedInstrumentItem() const;
+    const RealDataItem *selectedRealDataItem() const;
+
+    void updateViewElements();
+
+private:
+    int selectedInstrumentIndex() const;
+    int selectedSampleIndex() const;
+    int selectedRealDataIndex() const;
+    void updateSelection(QComboBox *comboBox, QStringList itemList, bool allow_none = false);
+
+    QComboBox *m_instrumentCombo;
+    QComboBox *m_sampleCombo;
+    QComboBox *m_realDataCombo;
+    ApplicationModels *m_applicationModels;
+};
+
+#endif // SIMULATIONDATASELECTORWIDGET_H
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.cpp b/GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.cpp
new file mode 100644
index 0000000..ccd1efe
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.cpp
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.cpp
+//! @brief     Implements class SimulationOptionsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationOptionsWidget.h"
+#include "ComponentBoxEditor.h"
+#include "ComponentEditor.h"
+#include "SimulationOptionsItem.h"
+#include <QGroupBox>
+#include <QVBoxLayout>
+
+SimulationOptionsWidget::SimulationOptionsWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_boxEditor(new ComponentBoxEditor)
+
+{
+    QGroupBox *groupBox = new QGroupBox("Simulation Parameters");
+
+    QVBoxLayout *groupLayout = new QVBoxLayout;
+    groupBox->setLayout(groupLayout);
+
+    groupLayout->addWidget(m_boxEditor);
+
+    // main layout
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->addWidget(groupBox);
+    mainLayout->addStretch();
+    setLayout(mainLayout);
+
+}
+
+void SimulationOptionsWidget::setItem(SimulationOptionsItem *item)
+{
+    m_boxEditor->clearEditor();
+    m_boxEditor->addPropertyItems(item);
+//    m_boxEditor->setItem(item);
+}
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.h b/GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.h
new file mode 100644
index 0000000..ae22da3
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationOptionsWidget.h
+//! @brief     Defines class SimulationOptionsWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONOPTIONSWIDGET_H
+#define SIMULATIONOPTIONSWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class SimulationOptionsItem;
+class ComponentBoxEditor;
+//class ComponentEditor;
+
+//! Holds widgets related to the setup of simulation/job options (nthreads, run policy,
+//! computation method). Part of SimulationView/SimulationSetupWidet
+
+class BA_CORE_API_ SimulationOptionsWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SimulationOptionsWidget(QWidget *parent = 0);
+
+    void setItem(SimulationOptionsItem *item);
+
+private:
+    ComponentBoxEditor *m_boxEditor;
+//    ComponentEditor *m_boxEditor;
+};
+
+#endif // SIMULATIONOPTIONSWIDGET_H
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp
new file mode 100644
index 0000000..b858126
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp
@@ -0,0 +1,101 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.cpp
+//! @brief     Implements class SimulationSetupAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationSetupAssistant.h"
+#include "SampleValidator.h"
+#include "ImportDataAssistant.h"
+#include <QDebug>
+#include <QMessageBox>
+
+//! Returns true if given setup is valid for submitting the job
+
+SimulationSetupAssistant::SimulationSetupAssistant()
+    : m_isValid(false)
+{
+
+}
+
+bool SimulationSetupAssistant::isValidSimulationSetup(const MultiLayerItem *multiLayerItem,
+                                                      const InstrumentItem *instrumentItem,
+                                                      const RealDataItem *realData)
+{
+    clear();
+
+    checkMultiLayerItem(multiLayerItem);
+    checkInstrumentItem(instrumentItem);
+    checkFittingSetup(instrumentItem, realData);
+
+    if(!m_isValid)
+        QMessageBox::warning(0, QStringLiteral("Can't run the job"), composeMessage());
+
+    return m_isValid;
+}
+
+void SimulationSetupAssistant::clear()
+{
+    m_isValid = true;
+    m_messages.clear();
+}
+
+void SimulationSetupAssistant::checkMultiLayerItem(const MultiLayerItem *multiLayerItem)
+{
+    if(!multiLayerItem) {
+        m_messages.append(QStringLiteral("No sample selected"));
+        m_isValid = false;
+    } else {
+        SampleValidator sampleValidator;
+        if (!sampleValidator.isValidMultiLayer(multiLayerItem)) {
+            m_isValid = false;
+            m_messages.append(sampleValidator.getValidationMessage());
+        }
+    }
+}
+
+void SimulationSetupAssistant::checkInstrumentItem(const InstrumentItem *instrumentItem)
+{
+    if(!instrumentItem) {
+        m_messages.append(QStringLiteral("No instrument selected"));
+        m_isValid = false;
+    }
+}
+
+//! Check if setup is suitable for fitting. In the case when there is a realData defined,
+//! its axes will be compared with current detector item.
+
+void SimulationSetupAssistant::checkFittingSetup(const InstrumentItem *instrumentItem,
+                                                 const RealDataItem *realData)
+{
+    if(!realData)
+        return;
+
+    QString message;
+    if(!ImportDataAssistant::hasSameDimensions(instrumentItem, realData, message)) {
+        m_isValid = false;
+        m_messages.append("The RealData doesn't match selected instrument: "+message);
+    }
+}
+
+//! Composes the error message for message box.
+
+QString SimulationSetupAssistant::composeMessage()
+{
+    QString result("Can't run the job with current settings\n\n");
+    foreach(QString message, m_messages) {
+        QString text = QString("- %1 \n").arg(message);
+        result.append(text);
+    }
+    return result;
+}
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h
new file mode 100644
index 0000000..4a0c238
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationSetupAssistant.h
+//! @brief     Defines class SimulationSetupAssistant
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONSETUPASSISTANT_H
+#define SIMULATIONSETUPASSISTANT_H
+
+#include "WinDllMacros.h"
+#include <QStringList>
+
+class MultiLayerItem;
+class InstrumentItem;
+class RealDataItem;
+
+//! The SimulationSetupAssistant class provides sample, instrument and real data validation before
+//! submitting the job.
+
+class BA_CORE_API_ SimulationSetupAssistant {
+public:
+    SimulationSetupAssistant();
+
+    bool isValidSimulationSetup(const MultiLayerItem *multiLayerItem,
+                                const InstrumentItem *instrumentItem,
+                                const RealDataItem *realData = 0);
+private:
+    void clear();
+    void checkMultiLayerItem(const MultiLayerItem *multiLayerItem);
+    void checkInstrumentItem(const InstrumentItem *instrumentItem);
+    void checkFittingSetup(const InstrumentItem *instrumentItem, const RealDataItem *realData);
+    QString composeMessage();
+
+    bool m_isValid;
+    QStringList m_messages;
+};
+
+
+#endif // SIMULATIONSETUPASSISTANT_H
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.cpp b/GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.cpp
new file mode 100644
index 0000000..1505895
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.cpp
@@ -0,0 +1,141 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.cpp
+//! @brief     Implements class SimulationSetupWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationSetupWidget.h"
+#include "AppSvc.h"
+#include "ApplicationModels.h"
+#include "DocumentModel.h"
+#include "JobItem.h"
+#include "JobModel.h"
+#include "PythonScriptWidget.h"
+#include "SimulationDataSelectorWidget.h"
+#include "SimulationOptionsWidget.h"
+#include "SimulationSetupAssistant.h"
+#include "projectmanager.h"
+#include <QDebug>
+#include <QMessageBox>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+SimulationSetupWidget::SimulationSetupWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_applicationModels(0)
+    , runSimulationButton(0)
+    , exportToPyScriptButton(0)
+    , m_simDataSelectorWidget(new SimulationDataSelectorWidget(this))
+    , m_simOptionsWidget(new SimulationOptionsWidget(this))
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(m_simDataSelectorWidget);
+    mainLayout->addWidget(m_simOptionsWidget);
+    mainLayout->addWidget(createButtonWidget());
+    mainLayout->addStretch(10);
+    setLayout(mainLayout);
+
+    // signal and slots
+    connect(runSimulationButton, SIGNAL(clicked()), this, SLOT(onRunSimulation()));
+    connect(exportToPyScriptButton, SIGNAL(clicked()), this, SLOT(onExportToPythonScript()));
+}
+
+void SimulationSetupWidget::setApplicationModels(ApplicationModels *model)
+{
+    Q_ASSERT(model);
+    if(model != m_applicationModels) {
+        m_applicationModels = model;
+        m_simDataSelectorWidget->setApplicationModels(model);
+        updateViewElements();
+    }
+}
+
+void SimulationSetupWidget::updateViewElements()
+{
+    m_simDataSelectorWidget->updateViewElements();
+    m_simOptionsWidget->setItem(m_applicationModels->documentModel()->getSimulationOptionsItem());
+}
+
+void SimulationSetupWidget::onRunSimulation()
+{
+    const MultiLayerItem *multiLayerItem = m_simDataSelectorWidget->selectedMultiLayerItem();
+    const InstrumentItem *instrumentItem = m_simDataSelectorWidget->selectedInstrumentItem();
+    const RealDataItem *realDataItem = m_simDataSelectorWidget->selectedRealDataItem();
+
+    SimulationSetupAssistant assistant;
+    if(!assistant.isValidSimulationSetup(multiLayerItem, instrumentItem, realDataItem))
+        return;
+
+    JobItem *jobItem = m_applicationModels->jobModel()->addJob(
+                multiLayerItem,
+                instrumentItem,
+                realDataItem,
+                m_applicationModels->documentModel()->getSimulationOptionsItem());
+
+    if (jobItem->runImmediately() || jobItem->runInBackground())
+        m_applicationModels->jobModel()->runJob(jobItem->index());
+}
+
+void SimulationSetupWidget::onExportToPythonScript()
+{
+    const MultiLayerItem *multiLayerItem = m_simDataSelectorWidget->selectedMultiLayerItem();
+    const InstrumentItem *instrumentItem = m_simDataSelectorWidget->selectedInstrumentItem();
+
+    SimulationSetupAssistant assistant;
+    if(!assistant.isValidSimulationSetup(multiLayerItem, instrumentItem))
+        return;
+
+    PythonScriptWidget *pythonWidget = new PythonScriptWidget(this);
+    pythonWidget->show();
+    pythonWidget->raise();
+    pythonWidget->generatePythonScript(
+        multiLayerItem, instrumentItem,
+        m_applicationModels->documentModel()->getSimulationOptionsItem(),
+        AppSvc::projectManager()->getProjectDir());
+}
+
+QWidget *SimulationSetupWidget::createButtonWidget()
+{
+    QWidget *result = new QWidget;
+
+    QHBoxLayout *simButtonLayout = new QHBoxLayout;
+    // run simulation button
+    runSimulationButton = new QPushButton("Run Simulation");
+    runSimulationButton->setIcon(QIcon(":/images/main_simulation.png"));
+    runSimulationButton->setMinimumWidth(100);
+    runSimulationButton->setMinimumHeight(50);
+    runSimulationButton->setToolTip("Run the simulation using settings above.\n"
+                                    " Global shortcut ctrl-r can be used to run from sample view.");
+//    QPalette palette = runSimulationButton->palette();
+//    palette.setColor(QPalette::Button, QColor(Constants::BUTTON_COLOR));
+//    palette.setColor(QPalette::ButtonText, QColor(Constants::BUTTON_TEXT_COLOR));
+//    runSimulationButton->setPalette(palette);
+
+    // export simulation to a python script
+    exportToPyScriptButton = new QPushButton("Export to Python Script");
+    exportToPyScriptButton->setIcon(QIcon(":/images/mode_script.png"));
+    exportToPyScriptButton->setMinimumWidth(100);
+    exportToPyScriptButton->setMinimumHeight(50);
+    exportToPyScriptButton->setToolTip("Export the simulation using settings above to "
+                                       "a python script.\n");
+//    exportToPyScriptButton->setPalette(palette);
+
+    simButtonLayout->addStretch();
+    simButtonLayout->addWidget(runSimulationButton);
+    simButtonLayout->addWidget(exportToPyScriptButton);
+    simButtonLayout->addStretch();
+
+    result->setLayout(simButtonLayout);
+
+    return result;
+}
diff --git a/GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.h b/GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.h
new file mode 100644
index 0000000..6870391
--- /dev/null
+++ b/GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/SimulationWidgets/SimulationSetupWidget.h
+//! @brief     Defines class SimulationSetupWidget
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONSETUPWIDGET_H
+#define SIMULATIONSETUPWIDGET_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class QPushButton;
+class MultiLayerItem;
+class InstrumentItem;
+class SimulationDataSelectorWidget;
+class SimulationOptionsWidget;
+class ApplicationModels;
+
+//! The SimulationSetupWidget class represents a main widget to define simulation settings
+//! and run the simulation. Belongs to the SimulationView.
+
+class BA_CORE_API_ SimulationSetupWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SimulationSetupWidget(QWidget *parent = 0);
+
+    void setApplicationModels(ApplicationModels *model);
+    void updateViewElements();
+
+public slots:
+    void onRunSimulation();
+    void onExportToPythonScript();
+
+private:
+    QWidget *createButtonWidget();
+
+    ApplicationModels *m_applicationModels;
+
+    QPushButton *runSimulationButton;
+    QPushButton *exportToPyScriptButton;
+
+    SimulationDataSelectorWidget *m_simDataSelectorWidget;
+    SimulationOptionsWidget *m_simOptionsWidget;
+};
+
+#endif // SIMULATIONSETUPWIDGET_H
diff --git a/GUI/coregui/Views/TestComponentView.cpp b/GUI/coregui/Views/TestComponentView.cpp
new file mode 100644
index 0000000..db0c394
--- /dev/null
+++ b/GUI/coregui/Views/TestComponentView.cpp
@@ -0,0 +1,120 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/TestComponentView.cpp
+//! @brief     Implements class TestComponentView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+#include "TestComponentView.h"
+#include "ComponentEditor.h"
+#include "SampleModel.h"
+#include "mainwindow.h"
+#include <QHBoxLayout>
+#include <QTreeView>
+
+TestComponentView::TestComponentView(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_mainWindow(mainWindow)
+    , m_model(new SampleModel(this))
+    , m_treeView(new QTreeView)
+    , m_treeView2(new QTreeView)
+    , m_editor1(new ComponentEditor)
+    , m_editor2(new ComponentEditor)
+//    , m_editor2(0)
+//    , m_editor3(0)
+    , m_editor3(new ComponentEditor)
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+
+    QHBoxLayout *hlayout = new QHBoxLayout;
+    hlayout->addWidget(m_treeView);
+    hlayout->addWidget(m_editor1);
+
+    QVBoxLayout *rightPanel = new QVBoxLayout;
+    rightPanel->addWidget(m_editor2);
+    rightPanel->addWidget(m_editor3);
+//    rightPanel->addWidget(m_treeView2);
+
+    hlayout->addLayout(rightPanel);
+
+    mainLayout->addLayout(hlayout);
+    setLayout(mainLayout);
+
+    init_editors();
+}
+
+void TestComponentView::onSelectionChanged(const QItemSelection &selected, const QItemSelection &)
+{
+    QModelIndexList indices = selected.indexes();
+
+    if(indices.isEmpty()) {
+        m_editor2->setItem(0);
+//        m_editor3->setItem(0);
+    } else {
+        if(SessionItem *item = m_model->itemForIndex(indices.at(0))) {
+            m_editor2->setItem(item);
+//            m_editor2->addItem(item);
+//            m_editor3->setItem(item);
+        }
+    }
+
+}
+
+void TestComponentView::init_editors()
+{
+    // sample model
+//    SampleBuilderFactory factory;
+//    boost::scoped_ptr<ISample> P_sample(factory.createSample("CylindersInDWBABuilder"));
+
+//    GUIObjectBuilder guiBuilder;
+//    guiBuilder.populateSampleModel(m_model, *P_sample);
+
+    m_model->insertNewItem(Constants::ParticleType);
+
+    // tree view
+    m_treeView->setModel(m_model);
+    m_treeView->expandAll();
+
+
+//    SessionCompactModel *compactModel = new SessionCompactModel();
+//    SessionTestModel *compactModel = new SessionTestModel();
+//    compactModel->setSourceModel(m_model);
+
+//    m_treeView2->setModel(compactModel);
+//    m_treeView2->expandAll();
+
+    connect(m_treeView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this,
+            SLOT(onSelectionChanged(QItemSelection, QItemSelection)));
+
+
+    // editors
+//    m_editor1->setPresentationType(ComponentEditorFlags::SHOW_DETAILED | ComponentEditorFlags::BROWSER_TABLE);
+//    m_editor2->setFlat();
+//    m_editor2->setPresentationType(ComponentEditorFlags::SHOW_CONDENSED | ComponentEditorFlags::BROWSER_TABLE);
+//    m_editor3->setPresentationType(ComponentEditorFlags::SHOW_CONDENSED | ComponentEditorFlags::BROWSER_GROUPBOX);
+
+    m_editor1->setItem(m_model->topItem());
+
+//    InstrumentModel *model = m_mainWindow->getInstrumentModel();
+//    InstrumentItem *instrument = model->getInstrumentItem();
+//    Q_ASSERT(instrument);
+
+//    m_editor1->setItem(instrument);
+
+//    BeamItem *beamItem = instrument->getBeamItem();
+//    Q_ASSERT(beamItem);
+
+//    m_editor2->setItem(beamItem->getGroupItem(BeamItem::P_WAVELENGTH));
+//    m_editor3->setItem(beamItem->getGroupItem(BeamItem::P_WAVELENGTH));
+}
+
+
+
diff --git a/GUI/coregui/Views/TestComponentView.h b/GUI/coregui/Views/TestComponentView.h
new file mode 100644
index 0000000..e025e2d
--- /dev/null
+++ b/GUI/coregui/Views/TestComponentView.h
@@ -0,0 +1,49 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/TestComponentView.h
+//! @brief     Defines class TestComponentView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TESTCOMPONENTVIEW_H
+#define TESTCOMPONENTVIEW_H
+
+#include <QWidget>
+
+class MainWindow;
+class SampleModel;
+class ComponentEditor;
+class QTreeView;
+class QItemSelection;
+
+class TestComponentView : public QWidget
+{
+    Q_OBJECT
+public:
+    TestComponentView(MainWindow *mainWindow = 0);
+
+private slots:
+    void onSelectionChanged(const QItemSelection &, const QItemSelection &);
+
+private:
+    void init_editors();
+
+    MainWindow *m_mainWindow;
+    SampleModel *m_model;
+    QTreeView *m_treeView;
+    QTreeView *m_treeView2;
+    ComponentEditor *m_editor1;
+    ComponentEditor *m_editor2;
+    ComponentEditor *m_editor3;
+};
+
+#endif // TESTCOMPONENTVIEW_H
diff --git a/GUI/coregui/Views/TestView.cpp b/GUI/coregui/Views/TestView.cpp
new file mode 100644
index 0000000..b11c67b
--- /dev/null
+++ b/GUI/coregui/Views/TestView.cpp
@@ -0,0 +1,197 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/TestView.cpp
+//! @brief     Implements class TestView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "TestView.h"
+#include "AccordionWidget.h"
+#include "JobModel.h"
+#include "MaskEditor.h"
+#include "MaterialEditor.h"
+#include "MinimizerItem.h"
+#include "MinimizerSettingsWidget.h"
+#include "mainwindow.h"
+#include <QCheckBox>
+#include <QLineEdit>
+
+TestView::TestView(MainWindow *mainWindow)
+    : QWidget(mainWindow)
+    , m_mainWindow(mainWindow)
+{
+//    test_MaskEditor();
+//    test_AccordionWidget();
+//    test_RunFitWidget();
+//    test_MaterialEditor();
+//    test_MinimizerSettings();
+    test_ColorMapLight();
+}
+
+
+void TestView::test_MaterialEditor()
+{
+    MaterialEditor *materialEditor = new MaterialEditor(m_mainWindow->materialModel());
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(materialEditor);
+    setLayout(layout);
+}
+
+void TestView::test_MinimizerSettings()
+{
+    MinimizerSettingsWidget *widget = new MinimizerSettingsWidget;
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(widget);
+    setLayout(layout);
+
+
+    SessionModel* model = new SessionModel("TempModel", this);
+    MinimizerContainerItem *minimizerItem = dynamic_cast<MinimizerContainerItem *>(
+                model->insertNewItem(Constants::MinimizerContainerType));
+    widget->setItem(minimizerItem);
+
+}
+
+void TestView::test_ColorMapLight()
+{
+//    SessionModel *tempIntensityDataModel = new SessionModel("TempIntensityDataModel", this);
+//    IntensityDataItem *intensityData = dynamic_cast<IntensityDataItem *>(
+//        tempIntensityDataModel->insertNewItem(Constants::IntensityDataType));
+////    intensityData->setOutputData(IntensityDataIOFactory::readOutputData("/home/pospelov/development/BornAgain/temp/Untitled25/jobdata_job1_0.int.gz"));
+
+
+//    QGridLayout *gridLayout = new QGridLayout;
+
+////    JobItem *jobItem = dynamic_cast<JobItem *>(m_mainWindow->jobModel()->topItem());
+////    Q_ASSERT(jobItem);
+////    IntensityDataItem *intensityData = jobItem->getIntensityDataItem();
+
+//    ColorMapCanvas *map1 = new ColorMapCanvas;
+//    ColorMapCanvas *map2 = new ColorMapCanvas;
+//    ColorMapCanvas *map3 = new ColorMapCanvas;
+
+//    map1->setItem(intensityData);
+//    map2->setItem(intensityData);
+//    map3->setItem(intensityData);
+
+//    gridLayout->addWidget(map1, 0, 0);
+//    gridLayout->addWidget(map2, 0, 1);
+//    gridLayout->addWidget(map3, 1, 0);
+
+//    setLayout(gridLayout);
+
+}
+
+
+void TestView::test_MaskEditor()
+{
+    MaskEditor *maskEditor = new MaskEditor();
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(maskEditor);
+    setLayout(layout);
+}
+
+void TestView::test_AccordionWidget()
+{
+    AccordionWidget *myAccordion = new AccordionWidget();
+    myAccordion->setMultiActive(true);
+    // add the Accordion to your layout
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->addWidget(myAccordion);
+    setLayout(layout);
+
+    // add a content pane with a header
+    int firstPaneIndex = myAccordion->addContentPane("My first content pane");
+    // make sure our content pane was added
+    if (firstPaneIndex != -1) {
+        // get a QFrame* from the Content Pane. This is where we place our content
+        QFrame *contentFrame = myAccordion->getContentPane(firstPaneIndex)->getContentFrame();
+        // give the QFrame a QLayout
+        contentFrame->setLayout(new QVBoxLayout());
+        // add a simpel QLabel to the frame
+        contentFrame->layout()->addWidget(new QLabel("Hello Cute World!!!"));
+    }
+
+    // add a content pane with a header
+    int secondPaneIndex = myAccordion->addContentPane("Basic settings");
+    // make sure our content pane was added
+    if (secondPaneIndex != -1) {
+        // get a QFrame* from the Content Pane. This is where we place our content
+        QFrame *contentFrame = myAccordion->getContentPane(secondPaneIndex)->getContentFrame();
+        // give the QFrame a QLayout
+        contentFrame->setLayout(new QVBoxLayout());
+        // add a simpel QLabel to the frame
+        QLineEdit *led = new QLineEdit();
+        QLineEdit *led2 = new QLineEdit();
+        contentFrame->layout()->addWidget(new QLabel("Name:"));
+        contentFrame->layout()->addWidget(led);
+        contentFrame->layout()->addWidget(new QLabel("Living place:"));
+        contentFrame->layout()->addWidget(led2);
+    }
+
+    // add a content pane with a header
+    int third = myAccordion->addContentPane("Advanced");
+    // make sure our content pane was added
+    if (third != -1) {
+        // get a QFrame* from the Content Pane. This is where we place our content
+        myAccordion->getContentPane(third)->setMaximumHeight(500);
+        QFrame *contentFrame = myAccordion->getContentPane(third)->getContentFrame();
+        contentFrame->setMaximumHeight(500);
+        // give the QFrame a QLayout
+        contentFrame->setLayout(new QVBoxLayout());
+        // add a simpel QLabel to the frame
+        QCheckBox *cb = new QCheckBox();
+        cb->setText("Option 1");
+        QCheckBox *cb2 = new QCheckBox();
+        cb2->setText("Option 2");
+        QCheckBox *cb3 = new QCheckBox();
+        cb3->setText("Option 3");
+        QCheckBox *cb4 = new QCheckBox();
+        cb4->setText("Option 4");
+        QCheckBox *cb5 = new QCheckBox();
+        cb5->setText("Option 5");
+        QCheckBox *cb6 = new QCheckBox();
+        cb6->setText("Option 6");
+        QCheckBox *cb7 = new QCheckBox();
+        cb7->setText("Option 7");
+        contentFrame->layout()->addWidget(cb);
+        contentFrame->layout()->addWidget(cb2);
+        contentFrame->layout()->addWidget(cb3);
+        contentFrame->layout()->addWidget(cb4);
+        contentFrame->layout()->addWidget(cb5);
+        contentFrame->layout()->addWidget(cb6);
+        contentFrame->layout()->addWidget(cb7);
+
+    }
+}
+
+void TestView::test_RunFitWidget()
+{
+    //FitParameterWidget *fitting = new FitParameterWidget(m_mainWindow);
+    QVBoxLayout *layout = new QVBoxLayout;
+    QTabWidget *tabs = new QTabWidget;
+    //tabs->addTab(maskEditor, "Run Fit");
+    //tabs->addTab(fw, "FitView by Ivonna");
+    //tabs->addTab(fitting, "Test TreeView");
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(tabs);
+    setLayout(layout);
+
+}
+
diff --git a/GUI/coregui/Views/TestView.h b/GUI/coregui/Views/TestView.h
new file mode 100644
index 0000000..4033ab5
--- /dev/null
+++ b/GUI/coregui/Views/TestView.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/TestView.h
+//! @brief     Defines class TestView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TESTVIEW_H
+#define TESTVIEW_H
+
+#include "WinDllMacros.h"
+#include <QWidget>
+
+class MainWindow;
+
+class BA_CORE_API_ TestView : public QWidget
+{
+    Q_OBJECT
+public:
+    TestView(MainWindow *mainWindow = 0);
+
+private:
+    void test_MaskEditor();
+    void test_AccordionWidget();
+    void test_RunFitWidget();
+    void test_MaterialEditor();
+    void test_MinimizerSettings();
+    void test_ColorMapLight();
+
+
+    MainWindow *m_mainWindow;
+};
+
+#endif // TESTVIEW_H
diff --git a/GUI/coregui/Views/WelcomeView.cpp b/GUI/coregui/Views/WelcomeView.cpp
new file mode 100644
index 0000000..4edb9af
--- /dev/null
+++ b/GUI/coregui/Views/WelcomeView.cpp
@@ -0,0 +1,304 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/WelcomeView.cpp
+//! @brief     Implements class WelcomeView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "WelcomeView.h"
+#include "DesignerHelper.h"
+#include "FancyLabel.h"
+#include "mainwindow.h"
+#include "mainwindow_constants.h"
+#include "projectdocument.h"
+#include "projectmanager.h"
+#include "qstringutils.h"
+#include <QCommandLinkButton>
+#include <QDebug>
+#include <QDesktopServices>
+#include <QSignalMapper>
+#include <QUrl>
+#include <QVBoxLayout>
+
+WelcomeView::WelcomeView(MainWindow *parent)
+    : m_mainWindow(parent)
+{
+    QColor bgColor(240,240,240,255);
+    QPalette palette;
+    palette.setColor(QPalette::Background, bgColor);
+    setAutoFillBackground(true);
+    setPalette(palette);
+
+    m_projectManager = m_mainWindow->projectManager();
+    Q_ASSERT(m_projectManager);
+
+    // button layout
+    QFont buttonFont;
+    buttonFont.setPointSize(DesignerHelper::getLabelFontSize());
+    buttonFont.setBold(false);
+    const int buttonHeight = 45;
+    const int buttonWidth = 140;
+
+//    QColor background_color(Constants::BUTTON_COLOR);
+//    QColor text_color(Constants::BUTTON_TEXT_COLOR);
+//    QString ssheet = QString("QPushButton {background-color: %1; color: %2}").
+//            arg(background_color.name(), text_color.name());
+//    QPalette button_palette = m_newProjectButton->palette();
+//        button_palette.setColor(QPalette::Button, QColor(Constants::BUTTON_COLOR));
+//        button_palette.setColor(QPalette::ButtonText, QColor(Constants::BUTTON_TEXT_COLOR));
+//        m_newProjectButton->setPalette(button_palette);
+
+    m_newProjectButton = new QPushButton("New Project");
+    m_newProjectButton->setMinimumWidth(buttonWidth);
+    m_newProjectButton->setMinimumHeight(buttonHeight);
+    m_newProjectButton->setFont(buttonFont);
+    m_newProjectButton->setToolTip("Create new project");
+//    m_newProjectButton->setStyleSheet(ssheet);
+    m_newProjectButton->setAttribute(Qt::WA_MacShowFocusRect, false);
+
+
+    m_openProjectButton = new QPushButton("Open Project");
+    m_openProjectButton->setMinimumWidth(buttonWidth);
+    m_openProjectButton->setMinimumHeight(buttonHeight);
+    m_openProjectButton->setFont(buttonFont);
+    m_openProjectButton->setToolTip("Open existing project");
+//    m_openProjectButton->setStyleSheet(ssheet);
+
+    m_newUsertButton = new QPushButton("New to BornAgain?");
+    m_newUsertButton->setMinimumWidth(buttonWidth);
+    m_newUsertButton->setMinimumHeight(buttonHeight);
+    m_newUsertButton->setFont(buttonFont);
+    m_newUsertButton->setToolTip("Open BornAgain web site");
+//    m_newUsertButton->setStyleSheet(ssheet);
+
+    QVBoxLayout *buttonLayout = new QVBoxLayout;
+
+    buttonLayout->addWidget(m_newProjectButton);
+    buttonLayout->addWidget(m_openProjectButton);
+    buttonLayout->addStretch(1);
+    buttonLayout->addWidget(m_newUsertButton);
+
+    QHBoxLayout *buttonPanel = new QHBoxLayout;
+    buttonPanel->setContentsMargins(30,0,30,0);
+    buttonPanel->addLayout(buttonLayout);
+
+    // current project layout
+    QVBoxLayout *currentProjectLayout = new QVBoxLayout;
+    currentProjectLayout->setContentsMargins(30,0,0,0);
+    QFont titleFont;
+    titleFont.setPointSize(DesignerHelper::getSectionFontSize());
+    titleFont.setBold(true);
+
+    QLabel *currentProLabel = new QLabel("Current Project:");
+    currentProLabel->setFont(titleFont);
+
+    m_currentProName = new FancyLabel("Untitled");
+    currentProjectLayout->addWidget(currentProLabel);
+    currentProjectLayout->addWidget(m_currentProName);
+
+    // recent project layout
+    m_recentProjectLayout = new QVBoxLayout;
+    m_recentProjectLayout->setContentsMargins(30,0,0,0);
+
+    // project layout
+    QVBoxLayout *projectLayout = new QVBoxLayout;
+    projectLayout->addLayout(currentProjectLayout);
+    projectLayout->addSpacing(15);
+    projectLayout->addLayout(m_recentProjectLayout);
+
+    // update notification label
+    m_updateNotification = new QLabel(this);
+    m_updateNotification->setText("");
+    m_updateNotification->setContentsMargins(40, 10, 0, 0);
+    m_updateNotification->setOpenExternalLinks(true);
+    m_updateNotification->setTextInteractionFlags(Qt::TextBrowserInteraction);
+    m_updateNotification->setTextFormat(Qt::RichText);
+
+    // assembling all together
+    QFrame* line = new QFrame();
+    line->setFrameShape(QFrame::VLine);
+    line->setFrameShadow(QFrame::Sunken);
+
+    QHBoxLayout *itemContainerLayout = new QHBoxLayout;
+    itemContainerLayout->addLayout(buttonPanel);
+    itemContainerLayout->addWidget(line);
+//    itemContainerLayout->addLayout(m_recentProjectLayout);
+    itemContainerLayout->addLayout(projectLayout);
+    itemContainerLayout->addStretch(1);
+
+    QWidget *itemContainerWidget = new QWidget;
+    itemContainerWidget->setLayout(itemContainerLayout);
+    itemContainerWidget->setFixedHeight(430);
+
+    QVBoxLayout *containerLayout = new QVBoxLayout;
+    containerLayout->setMargin(0);
+    containerLayout->addWidget(itemContainerWidget);
+    containerLayout->addWidget(m_updateNotification);
+    containerLayout->addStretch(1);
+
+    QWidget *containerWidget = new QWidget;
+    containerWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+    containerWidget->setObjectName("containerWidget");
+    containerWidget->setMaximumWidth(800);
+    containerWidget->setContentsMargins(0,30,0,0);
+    containerWidget->setStyleSheet(QString::fromUtf8("QWidget#containerWidget\n"
+    "{\n"
+    "    border-left: 1px solid gray;\n"
+    "    border-right: 1px solid gray;\n"
+    "    background-color:white;\n"
+    "}\n"
+    ""));
+    containerWidget->setLayout(containerLayout);
+
+    // main layout
+    QHBoxLayout *mainLayout = new QHBoxLayout;
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->addWidget(new QWidget);
+    mainLayout->addWidget(containerWidget);
+    mainLayout->addWidget(new QWidget);
+    setLayout(mainLayout);
+
+    connect(m_newProjectButton, SIGNAL(clicked()), m_projectManager, SLOT(newProject()));
+    connect(m_openProjectButton, SIGNAL(clicked()), m_projectManager, SLOT(openProject()));
+    connect(m_newUsertButton, SIGNAL(clicked()), this, SLOT(onNewUser()));
+
+    connect(m_projectManager, SIGNAL(modified()), this, SLOT(updateRecentProjectPanel()));
+
+    updateRecentProjectPanel();
+}
+
+void WelcomeView::generateRecentProjectList()
+{
+    QFont titleFont;
+    titleFont.setPointSize(DesignerHelper::getSectionFontSize());
+    titleFont.setBold(true);
+
+
+//    QLabel *currentProLabel = new QLabel("Current Project:");
+//    currentProLabel->setFont(titleFont);
+
+    QLabel *recentProLabel = new QLabel("Recent Projects:");
+    recentProLabel->setFont(titleFont);
+
+    setCurrentProjectName(getCurrentProjectFancyName());
+//    QLabel *currentProName = new QLabel("Untitled");
+//    ProjectDocument *projectDocument = m_projectManager->getDocument();
+//    if(projectDocument) {
+//        if(projectDocument->hasValidNameAndPath()) {
+//           m_currentProName->setText(Utils::withTildeHomePath(m_projectManager->getDocument()->getProjectFileName()));
+//        } else {
+//            m_currentProName->setText(m_projectManager->getDocument()->getProjectName());
+//        }
+//    }
+
+//    m_recentProjectLayout->addWidget(currentProLabel);
+//    m_recentProjectLayout->addWidget(currentProName);
+//    m_recentProjectLayout->addSpacing(15);
+
+    m_recentProjectLayout->addWidget(recentProLabel);
+
+    QCommandLinkButton *slotButtons[Constants::MAX_RECENT_PROJECTS];
+    //QLabel *myLabel[count];
+    m_signalMapper = new QSignalMapper(this);
+
+    int i(0);
+    foreach(QString file, m_projectManager->getRecentProjects() ) {
+        //hasRecentProjects = true;
+
+        QFont font;
+        //font.setPointSize(9);
+        font.setPointSize(DesignerHelper::getLabelFontSize());
+        font.setBold(false);
+        //font.underline();
+
+        QPalette palette;
+        palette.setColor(QPalette::ButtonText,QColor(41,73,150));
+
+        slotButtons[i] = new QCommandLinkButton;
+        slotButtons[i]->setText(Utils::withTildeHomePath(file));
+        slotButtons[i]->setFont(font);
+        slotButtons[i]->setPalette(palette);
+        //slotButtons[i]->setDescription("Recent description");
+        slotButtons[i]->setFixedHeight(30);
+        m_signalMapper->setMapping(slotButtons[i], file);
+        connect(slotButtons[i], SIGNAL(clicked()), m_signalMapper, SLOT (map()));
+        m_recentProjectLayout->addWidget(slotButtons[i]);
+
+        i++;
+
+        if(i == Constants::MAX_RECENT_PROJECTS) break;
+    }
+
+    m_recentProjectLayout->addStretch();
+
+    connect(m_signalMapper, SIGNAL(mapped(QString)),
+            m_projectManager, SLOT(openProject(QString)));
+}
+
+//! returns current project name suited for displaying on current project layout
+QString WelcomeView::getCurrentProjectFancyName()
+{
+    QString result("Untitled");
+    if(ProjectDocument *projectDocument = m_projectManager->getDocument()) {
+        if(projectDocument->hasValidNameAndPath()) {
+           result = Utils::withTildeHomePath(projectDocument->getProjectFileName());
+        } else {
+           result = projectDocument->getProjectName();
+        }
+    }
+    return result;
+}
+
+//! updates label with current project name in picturesque manner
+void WelcomeView::setCurrentProjectName(const QString &name)
+{
+    m_currentProName->setTextAnimated(name);
+//    m_currentProName->setText(name);
+}
+
+void WelcomeView::onWebLinkClicked(const QUrl &url)
+{
+    QDesktopServices::openUrl(url);
+}
+
+void WelcomeView::onNewUser()
+{
+    QUrl url("http://www.bornagainproject.org");
+    QDesktopServices::openUrl(url);
+}
+
+void WelcomeView::updateRecentProjectPanel()
+{
+    qDebug() << "WelcomeView::updateRecentProjectPanel called";
+    this->clearLayout(m_recentProjectLayout);
+    this->generateRecentProjectList();
+    update();
+}
+
+void WelcomeView::clearLayout(QLayout* layout, bool deleteWidgets)
+{
+    if(layout) {
+        while (QLayoutItem* item = layout->takeAt(0)) {
+            if (deleteWidgets) {
+                if (QWidget* widget = item->widget())
+                    delete widget;
+            }
+            if (QLayout* childLayout = item->layout()) clearLayout(childLayout, deleteWidgets);
+            delete item;
+        }
+    }
+}
+
+void WelcomeView::setNotificationText(const QString &text)
+{
+    m_updateNotification->setText(text);
+}
diff --git a/GUI/coregui/Views/WelcomeView.h b/GUI/coregui/Views/WelcomeView.h
new file mode 100644
index 0000000..ca4c7db
--- /dev/null
+++ b/GUI/coregui/Views/WelcomeView.h
@@ -0,0 +1,59 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/Views/WelcomeView.h
+//! @brief     Defines class WelcomeView
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef WELCOMEVIEW_H
+#define WELCOMEVIEW_H
+
+#include "WinDllMacros.h"
+#include <QLabel>
+
+class QPushButton;
+class MainWindow;
+class ProjectManager;
+class QSignalMapper;
+class QVBoxLayout;
+class FancyLabel;
+
+class BA_CORE_API_ WelcomeView : public QWidget
+{
+    Q_OBJECT
+public:
+    WelcomeView(MainWindow *parent);
+
+public slots:
+    void onWebLinkClicked(const QUrl &url);
+    void onNewUser();
+    void updateRecentProjectPanel();
+    void setNotificationText(const QString &text);
+
+private:
+    void clearLayout(QLayout* layout, bool deleteWidgets = true);
+    void generateRecentProjectList();
+    QString getCurrentProjectFancyName();
+    void setCurrentProjectName(const QString &name);
+
+    QPushButton *m_newProjectButton;
+    QPushButton *m_openProjectButton;
+    QPushButton *m_newUsertButton;
+    MainWindow *m_mainWindow;
+    ProjectManager *m_projectManager;
+    QSignalMapper *m_signalMapper;
+    QVBoxLayout *m_recentProjectLayout;
+    FancyLabel *m_currentProName;
+    QLabel *m_updateNotification;
+};
+
+#endif // WELCOMEVIEW_H
diff --git a/GUI/coregui/Views/widgetbox/deviceprofile_p.h b/GUI/coregui/Views/widgetbox/deviceprofile_p.h
new file mode 100644
index 0000000..d82b5db
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/deviceprofile_p.h
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef DEVICEPROFILE_P_H
+#define DEVICEPROFILE_P_H
+
+#include "shared_global_p.h"
+
+#include <QtCore/QString>
+#include <QtCore/QSharedDataPointer>
+
+QT_BEGIN_NAMESPACE
+
+class QDesignerFormEditorInterface;
+class QWidget;
+class QStyle;
+
+namespace qdesigner_internal {
+
+class DeviceProfileData;
+
+/* DeviceProfile for embedded design. They influence
+ * default properties (for example, fonts), dpi and
+ * style of the form. This class represents a device
+ * profile. */
+
+class QDESIGNER_SHARED_EXPORT DeviceProfile {
+public:
+    DeviceProfile();
+
+    DeviceProfile(const DeviceProfile&);
+    DeviceProfile& operator=(const DeviceProfile&);
+    ~DeviceProfile();
+
+    void clear();
+
+    // Device name
+    QString name() const;
+    void setName(const QString &);
+
+    // System settings active
+    bool isEmpty() const;
+
+    // Default font family of the embedded system
+    QString fontFamily() const;
+    void setFontFamily(const QString &);
+
+    // Default font size of the embedded system
+    int fontPointSize() const;
+    void setFontPointSize(int p);
+
+    // Display resolution of the embedded system
+    int dpiX() const;
+    void setDpiX(int d);
+    int dpiY() const;
+    void setDpiY(int d);
+
+    // Style
+    QString style() const;
+    void setStyle(const QString &);
+
+    // Initialize from desktop system
+    void fromSystem();
+
+    static void systemResolution(int *dpiX, int *dpiY);
+    static void widgetResolution(const QWidget *w, int *dpiX, int *dpiY);
+
+    bool equals(const DeviceProfile& rhs) const;
+
+    // Apply to form/preview (using font inheritance)
+    enum ApplyMode {
+        /* Pre-Apply to parent widget of form being edited: Apply font
+         * and make use of property inheritance to be able to modify the
+         * font property freely. */
+        ApplyFormParent,
+        /* Post-Apply to preview widget: Change only inherited font
+         * sub properties. */
+        ApplyPreview
+    };
+    void apply(const QDesignerFormEditorInterface *core, QWidget *widget, ApplyMode am) const;
+
+    static void applyDPI(int dpiX, int dpiY, QWidget *widget);
+
+    QString toString() const;
+
+    QString toXml() const;
+    bool fromXml(const QString &xml, QString *errorMessage);
+
+private:
+    QSharedDataPointer<DeviceProfileData> m_d;
+};
+
+inline bool operator==(const DeviceProfile &s1, const DeviceProfile &s2)
+    { return s1.equals(s2); }
+inline bool operator!=(const DeviceProfile &s1, const DeviceProfile &s2)
+    { return !s1.equals(s2); }
+
+}
+
+
+QT_END_NAMESPACE
+
+#endif // DEVICEPROFILE_P_H
diff --git a/GUI/coregui/Views/widgetbox/formwindowbase_p.h b/GUI/coregui/Views/widgetbox/formwindowbase_p.h
new file mode 100644
index 0000000..5bf2d0d
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/formwindowbase_p.h
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef FORMWINDOWBASE_P_H
+#define FORMWINDOWBASE_P_H
+
+#include "shared_global_p.h"
+
+#include <QtDesigner/QDesignerFormWindowInterface>
+
+#include <QtCore/QVariantMap>
+#include <QtCore/QList>
+
+QT_BEGIN_NAMESPACE
+
+class QDesignerDnDItemInterface;
+class QMenu;
+class QtResourceSet;
+class QDesignerPropertySheet;
+
+namespace qdesigner_internal {
+
+class QEditorFormBuilder;
+class DeviceProfile;
+class Grid;
+
+class DesignerPixmapCache;
+class DesignerIconCache;
+class FormWindowBasePrivate;
+
+class QDESIGNER_SHARED_EXPORT FormWindowBase: public QDesignerFormWindowInterface
+{
+    Q_OBJECT
+public:
+    enum HighlightMode  { Restore, Highlight };
+
+    explicit FormWindowBase(QDesignerFormEditorInterface *core, QWidget *parent = 0, Qt::WindowFlags flags = 0);
+    virtual ~FormWindowBase();
+
+    QVariantMap formData();
+    void setFormData(const QVariantMap &vm);
+
+    virtual QStringList checkContents() const;
+
+    // Deprecated
+    virtual QPoint grid() const;
+
+    // Deprecated
+    virtual void setGrid(const QPoint &grid);
+
+    virtual bool hasFeature(Feature f) const;
+    virtual Feature features() const;
+    virtual void setFeatures(Feature f);
+
+    const Grid &designerGrid() const;
+    void setDesignerGrid(const  Grid& grid);
+
+    bool hasFormGrid() const;
+    void setHasFormGrid(bool b);
+
+    bool gridVisible() const;
+
+#if QT_VERSION >= 0x050000
+    virtual ResourceFileSaveMode resourceFileSaveMode() const;
+    virtual void setResourceFileSaveMode(ResourceFileSaveMode behaviour);
+#endif
+
+    static const Grid &defaultDesignerGrid();
+    static void setDefaultDesignerGrid(const Grid& grid);
+
+    // Overwrite to initialize and return a full popup menu for a managed widget
+    virtual QMenu *initializePopupMenu(QWidget *managedWidget);
+    // Helper to create a basic popup menu from task menu extensions (internal/public)
+    static QMenu *createExtensionTaskMenu(QDesignerFormWindowInterface *fw, QObject *o, bool trailingSeparator = true);
+
+    virtual bool dropWidgets(const QList<QDesignerDnDItemInterface*> &item_list, QWidget *target,
+                             const QPoint &global_mouse_pos) = 0;
+
+    // Helper to find the widget at the mouse position with some flags.
+    enum WidgetUnderMouseMode { FindSingleSelectionDropTarget, FindMultiSelectionDropTarget };
+    QWidget *widgetUnderMouse(const QPoint &formPos, WidgetUnderMouseMode m);
+
+    virtual QWidget *widgetAt(const QPoint &pos) = 0;
+    virtual QWidget *findContainer(QWidget *w, bool excludeLayout) const = 0;
+
+    void deleteWidgetList(const QWidgetList &widget_list);
+
+    virtual void highlightWidget(QWidget *w, const QPoint &pos, HighlightMode mode = Highlight) = 0;
+
+    enum PasteMode { PasteAll, PasteActionsOnly };
+#ifndef QT_NO_CLIPBOARD
+    virtual void paste(PasteMode pasteMode) = 0;
+#endif
+
+    // Factory method to create a form builder
+    virtual QEditorFormBuilder *createFormBuilder() = 0;
+
+    virtual bool blockSelectionChanged(bool blocked) = 0;
+    virtual void emitSelectionChanged() = 0;
+
+    DesignerPixmapCache *pixmapCache() const;
+    DesignerIconCache *iconCache() const;
+    virtual QtResourceSet *resourceSet() const;
+    virtual void setResourceSet(QtResourceSet *resourceSet);
+    void addReloadableProperty(QDesignerPropertySheet *sheet, int index);
+    void removeReloadableProperty(QDesignerPropertySheet *sheet, int index);
+    void addReloadablePropertySheet(QDesignerPropertySheet *sheet, QObject *object);
+    void removeReloadablePropertySheet(QDesignerPropertySheet *sheet);
+    void reloadProperties();
+
+    void emitWidgetRemoved(QWidget *w);
+    void emitObjectRemoved(QObject *o);
+
+    DeviceProfile deviceProfile() const;
+    QString styleName() const;
+    QString deviceProfileName() const;
+
+    enum LineTerminatorMode {
+        LFLineTerminator,
+        CRLFLineTerminator,
+        NativeLineTerminator =
+#if defined (Q_OS_WIN)
+            CRLFLineTerminator
+#else
+            LFLineTerminator
+#endif
+    };
+
+    void setLineTerminatorMode(LineTerminatorMode mode);
+    LineTerminatorMode lineTerminatorMode() const;
+
+public slots:
+    void resourceSetActivated(QtResourceSet *resourceSet, bool resourceSetChanged);
+
+private slots:
+    void triggerDefaultAction(QWidget *w);
+
+private:
+    void syncGridFeature();
+
+    FormWindowBasePrivate *m_d;    
+};
+
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // FORMWINDOWBASE_P_H
diff --git a/GUI/coregui/Views/widgetbox/images/Lattice1D.png b/GUI/coregui/Views/widgetbox/images/Lattice1D.png
new file mode 100644
index 0000000..abdeeb9
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/Lattice1D.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/Lattice2D.png b/GUI/coregui/Views/widgetbox/images/Lattice2D.png
new file mode 100644
index 0000000..5a10fb1
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/Lattice2D.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/Layer.png b/GUI/coregui/Views/widgetbox/images/Layer.png
new file mode 100644
index 0000000..e117e14
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/Layer.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/MultiLayer.png b/GUI/coregui/Views/widgetbox/images/MultiLayer.png
new file mode 100644
index 0000000..02d1a40
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/MultiLayer.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ParaCrystal1D.png b/GUI/coregui/Views/widgetbox/images/ParaCrystal1D.png
new file mode 100644
index 0000000..5f6fc8c
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ParaCrystal1D.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ParaCrystal2D.png b/GUI/coregui/Views/widgetbox/images/ParaCrystal2D.png
new file mode 100644
index 0000000..0faecb9
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ParaCrystal2D.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ParticleComposition.png b/GUI/coregui/Views/widgetbox/images/ParticleComposition.png
new file mode 100644
index 0000000..bc559e4
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ParticleComposition.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ParticleCoreShell.png b/GUI/coregui/Views/widgetbox/images/ParticleCoreShell.png
new file mode 100644
index 0000000..dfa9013
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ParticleCoreShell.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ParticleLayout.png b/GUI/coregui/Views/widgetbox/images/ParticleLayout.png
new file mode 100644
index 0000000..1c50c64
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ParticleLayout.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/SizeDistribution.png b/GUI/coregui/Views/widgetbox/images/SizeDistribution.png
new file mode 100644
index 0000000..e7e7231
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/SizeDistribution.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/Transformation.png b/GUI/coregui/Views/widgetbox/images/Transformation.png
new file mode 100644
index 0000000..ae26b62
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/Transformation.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_AnisoPyramid_32.png b/GUI/coregui/Views/widgetbox/images/ff_AnisoPyramid_32.png
new file mode 100644
index 0000000..5445d50
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_AnisoPyramid_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Box_32.png b/GUI/coregui/Views/widgetbox/images/ff_Box_32.png
new file mode 100644
index 0000000..4a29836
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Box_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Cone6_32.png b/GUI/coregui/Views/widgetbox/images/ff_Cone6_32.png
new file mode 100644
index 0000000..a8ff87a
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Cone6_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Cone_32.png b/GUI/coregui/Views/widgetbox/images/ff_Cone_32.png
new file mode 100644
index 0000000..8d9e29b
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Cone_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Cuboctahedron_32.png b/GUI/coregui/Views/widgetbox/images/ff_Cuboctahedron_32.png
new file mode 100644
index 0000000..00de932
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Cuboctahedron_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Cylinder_32.png b/GUI/coregui/Views/widgetbox/images/ff_Cylinder_32.png
new file mode 100644
index 0000000..e66046d
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Cylinder_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Dodecahedron_32.png b/GUI/coregui/Views/widgetbox/images/ff_Dodecahedron_32.png
new file mode 100644
index 0000000..1a08fb9
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Dodecahedron_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_EllipsoidalCylinder_32.png b/GUI/coregui/Views/widgetbox/images/ff_EllipsoidalCylinder_32.png
new file mode 100644
index 0000000..884d8e3
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_EllipsoidalCylinder_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_FullSphere_32.png b/GUI/coregui/Views/widgetbox/images/ff_FullSphere_32.png
new file mode 100644
index 0000000..e242a42
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_FullSphere_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_FullSpheroid_32.png b/GUI/coregui/Views/widgetbox/images/ff_FullSpheroid_32.png
new file mode 100644
index 0000000..2a26cdb
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_FullSpheroid_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_HemiEllipsoid_32.png b/GUI/coregui/Views/widgetbox/images/ff_HemiEllipsoid_32.png
new file mode 100644
index 0000000..7e04efe
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_HemiEllipsoid_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Icosahedron_32.png b/GUI/coregui/Views/widgetbox/images/ff_Icosahedron_32.png
new file mode 100644
index 0000000..d741738
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Icosahedron_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Prism3_32.png b/GUI/coregui/Views/widgetbox/images/ff_Prism3_32.png
new file mode 100644
index 0000000..c375dc5
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Prism3_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Prism6_32.png b/GUI/coregui/Views/widgetbox/images/ff_Prism6_32.png
new file mode 100644
index 0000000..adbdd13
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Prism6_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Pyramid_32.png b/GUI/coregui/Views/widgetbox/images/ff_Pyramid_32.png
new file mode 100644
index 0000000..3172d8a
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Pyramid_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Ripple1_32.png b/GUI/coregui/Views/widgetbox/images/ff_Ripple1_32.png
new file mode 100644
index 0000000..80ee9cd
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Ripple1_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Ripple2_32.png b/GUI/coregui/Views/widgetbox/images/ff_Ripple2_32.png
new file mode 100644
index 0000000..3213f96
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Ripple2_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_Tetrahedron_32.png b/GUI/coregui/Views/widgetbox/images/ff_Tetrahedron_32.png
new file mode 100644
index 0000000..6c66ba7
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_Tetrahedron_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_TruncatedCube_32.png b/GUI/coregui/Views/widgetbox/images/ff_TruncatedCube_32.png
new file mode 100644
index 0000000..6eb9b70
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_TruncatedCube_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_TruncatedSphere_32.png b/GUI/coregui/Views/widgetbox/images/ff_TruncatedSphere_32.png
new file mode 100644
index 0000000..404aeff
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_TruncatedSphere_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/ff_TruncatedSpheroid_32.png b/GUI/coregui/Views/widgetbox/images/ff_TruncatedSpheroid_32.png
new file mode 100644
index 0000000..d547d60
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/ff_TruncatedSpheroid_32.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/sample_layers2.png b/GUI/coregui/Views/widgetbox/images/sample_layers2.png
new file mode 100644
index 0000000..04cd225
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/sample_layers2.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/sample_layers3.png b/GUI/coregui/Views/widgetbox/images/sample_layers3.png
new file mode 100644
index 0000000..63b26cd
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/sample_layers3.png differ
diff --git a/GUI/coregui/Views/widgetbox/images/toolbar_redo.png b/GUI/coregui/Views/widgetbox/images/toolbar_redo.png
new file mode 100644
index 0000000..730f804
Binary files /dev/null and b/GUI/coregui/Views/widgetbox/images/toolbar_redo.png differ
diff --git a/GUI/coregui/Views/widgetbox/qdesigner_dnditem_p.h b/GUI/coregui/Views/widgetbox/qdesigner_dnditem_p.h
new file mode 100644
index 0000000..fb1c583
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/qdesigner_dnditem_p.h
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QDESIGNER_DNDITEM_P_H
+#define QDESIGNER_DNDITEM_P_H
+
+#include "shared_global_p.h"
+#include <QtDesigner/abstractdnditem.h>
+
+#include <QtCore/QPoint>
+#include <QtCore/QList>
+#include <QtCore/QMimeData>
+
+QT_BEGIN_NAMESPACE
+
+class QDrag;
+class QImage;
+class QDropEvent;
+
+namespace qdesigner_internal {
+
+class QDESIGNER_SHARED_EXPORT QDesignerDnDItem: public QDesignerDnDItemInterface
+{
+public:
+    explicit QDesignerDnDItem(DropType type, QWidget *source = 0);
+    virtual ~QDesignerDnDItem();
+
+    virtual DomUI *domUi() const;
+    virtual QWidget *decoration() const;
+    virtual QWidget *widget() const;
+    virtual QPoint hotSpot() const;
+    virtual QWidget *source() const;
+
+    virtual DropType type() const;
+
+protected:
+    void setDomUi(DomUI *dom_ui);
+    void init(DomUI *ui, QWidget *widget, QWidget *decoration, const QPoint &global_mouse_pos);
+
+private:
+    QWidget *m_source;
+    const DropType m_type;
+    const QPoint m_globalStartPos;
+    DomUI *m_dom_ui;
+    QWidget *m_widget;
+    QWidget *m_decoration;
+    QPoint m_hot_spot;
+
+    Q_DISABLE_COPY(QDesignerDnDItem)
+};
+
+// Mime data for use with designer drag and drop operations.
+
+class  QDESIGNER_SHARED_EXPORT QDesignerMimeData : public QMimeData {
+    Q_OBJECT
+
+public:
+    typedef QList<QDesignerDnDItemInterface *> QDesignerDnDItems;
+
+    virtual ~QDesignerMimeData();
+
+    const QDesignerDnDItems &items() const { return m_items; }
+
+    // Execute a drag and drop operation.
+    static Qt::DropAction execDrag(const QDesignerDnDItems &items, QWidget * dragSource);
+
+    QPoint hotSpot() const { return m_hotSpot; }
+
+    // Move the decoration. Required for drops over form windows as the position
+    // is derived from the decoration position.
+    void moveDecoration(const QPoint &globalPos) const;
+
+    // For a move operation, create the undo command sequence to remove
+    // the widgets from the source form.
+    static void removeMovedWidgetsFromSourceForm(const QDesignerDnDItems &items);
+
+    // Accept an event with the proper action.
+    void acceptEvent(QDropEvent *e) const;
+
+    // Helper to accept an event with the desired action.
+    static void acceptEventWithAction(Qt::DropAction desiredAction, QDropEvent *e);
+
+private:
+    QDesignerMimeData(const QDesignerDnDItems &items, QDrag *drag);
+    Qt::DropAction proposedDropAction() const;
+
+    static void setImageTransparency(QImage &image, int alpha);
+
+    const QDesignerDnDItems m_items;
+    QPoint m_globalStartPos;
+    QPoint m_hotSpot;
+};
+
+} // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // QDESIGNER_DNDITEM_P_H
diff --git a/GUI/coregui/Views/widgetbox/qdesigner_formbuilder_p.h b/GUI/coregui/Views/widgetbox/qdesigner_formbuilder_p.h
new file mode 100644
index 0000000..951ca81
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/qdesigner_formbuilder_p.h
@@ -0,0 +1,176 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QDESIGNER_FORMBUILDER_P_H
+#define QDESIGNER_FORMBUILDER_P_H
+
+#include "shared_global_p.h"
+#include "deviceprofile_p.h"
+
+#include <QtDesigner/formbuilder.h>
+
+#include <QtCore/QMap>
+#include <QtCore/QSet>
+
+QT_BEGIN_NAMESPACE
+
+class QDesignerFormEditorInterface;
+class QDesignerFormWindowInterface;
+
+class QPixmap;
+class QtResourceSet;
+
+namespace qdesigner_internal {
+
+class DesignerPixmapCache;
+class DesignerIconCache;
+
+/* Form builder used for previewing forms and widget box.
+ * It applies the system settings to its toplevel window. */
+
+class QDESIGNER_SHARED_EXPORT QDesignerFormBuilder: public QFormBuilder
+{
+public:
+    QDesignerFormBuilder(QDesignerFormEditorInterface *core,
+                         const DeviceProfile &deviceProfile = DeviceProfile());
+
+    // XXX Gena's hack
+    enum Mode {
+      DisableScripts,
+        EnableScripts
+    };
+    QDesignerFormBuilder(QDesignerFormEditorInterface *core, Mode mode,
+                         const DeviceProfile &deviceProfile = DeviceProfile());
+
+    virtual QWidget *createWidget(DomWidget *ui_widget, QWidget *parentWidget = 0)
+    { return QFormBuilder::create(ui_widget, parentWidget); }
+
+    inline QDesignerFormEditorInterface *core() const
+    { return m_core; }
+
+    QString systemStyle() const;
+
+    // Create a preview widget (for integrations) or return 0. The widget has to be embedded into a main window.
+    // Experimental, depending on script support.
+    static QWidget *createPreview(const QDesignerFormWindowInterface *fw, const QString &styleName /* ="" */,
+                                  const QString &appStyleSheet  /* ="" */,
+                                  const DeviceProfile &deviceProfile,
+                                  QString *errorMessage);
+    // Convenience that pops up message boxes in case of failures.
+    static QWidget *createPreview(const QDesignerFormWindowInterface *fw, const QString &styleName = QString());
+    //  Create a preview widget (for integrations) or return 0. The widget has to be embedded into a main window.
+    static QWidget *createPreview(const QDesignerFormWindowInterface *fw, const QString &styleName, const QString &appStyleSheet, QString *errorMessage);
+    // Convenience that pops up message boxes in case of failures.
+    static QWidget *createPreview(const QDesignerFormWindowInterface *fw, const QString &styleName, const QString &appStyleSheet);
+
+    // Create a preview image
+    static QPixmap createPreviewPixmap(const QDesignerFormWindowInterface *fw, const QString &styleName = QString(), const QString &appStyleSheet = QString());
+
+protected:
+    using QFormBuilder::createDom;
+    using QFormBuilder::create;
+
+    virtual QWidget *create(DomUI *ui, QWidget *parentWidget);
+    virtual DomWidget *createDom(QWidget *widget, DomWidget *ui_parentWidget, bool recursive = true);
+    virtual QWidget *create(DomWidget *ui_widget, QWidget *parentWidget);
+    virtual QLayout *create(DomLayout *ui_layout, QLayout *layout, QWidget *parentWidget);
+    virtual void createResources(DomResources *resources);
+
+    virtual QWidget *createWidget(const QString &widgetName, QWidget *parentWidget, const QString &name);
+    virtual bool addItem(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget);
+    virtual bool addItem(DomLayoutItem *ui_item, QLayoutItem *item, QLayout *layout);
+
+    virtual QIcon nameToIcon(const QString &filePath, const QString &qrcPath);
+    virtual QPixmap nameToPixmap(const QString &filePath, const QString &qrcPath);
+
+    virtual void applyProperties(QObject *o, const QList<DomProperty*> &properties);
+
+    virtual void loadExtraInfo(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget);
+
+    QtResourceSet *internalResourceSet() const { return m_tempResourceSet; }
+
+    DeviceProfile deviceProfile() const { return m_deviceProfile; }
+
+private:
+    QDesignerFormEditorInterface *m_core;
+
+    typedef QSet<QWidget *> WidgetSet;
+    WidgetSet m_customWidgetsWithScript;
+
+    const DeviceProfile m_deviceProfile;
+
+    DesignerPixmapCache *m_pixmapCache;
+    DesignerIconCache *m_iconCache;
+    bool m_ignoreCreateResources;
+    QtResourceSet *m_tempResourceSet;
+    bool m_mainWidget;
+};
+
+// Form builder for a new form widget (preview). To allow for promoted
+// widgets in the template, it implements the handling of custom widgets
+// (adding of them to the widget database).
+
+class QDESIGNER_SHARED_EXPORT NewFormWidgetFormBuilder: public QDesignerFormBuilder {
+public:
+    NewFormWidgetFormBuilder(QDesignerFormEditorInterface *core,
+                             const DeviceProfile &deviceProfile = DeviceProfile());
+
+protected:
+    virtual void createCustomWidgets(DomCustomWidgets *);
+};
+
+
+} // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // QDESIGNER_FORMBUILDER_P_H
diff --git a/GUI/coregui/Views/widgetbox/qdesigner_utils_p.h b/GUI/coregui/Views/widgetbox/qdesigner_utils_p.h
new file mode 100644
index 0000000..873397d
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/qdesigner_utils_p.h
@@ -0,0 +1,521 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QDESIGNER_UTILS_P_H
+#define QDESIGNER_UTILS_P_H
+
+#include "shared_global_p.h"
+
+#include <QtDesigner/QDesignerFormWindowInterface>
+
+#include <QtCore/QVariant>
+#include <QtCore/QSharedDataPointer>
+#include <QtCore/QMap>
+//#include <QtWidgets/QMainWindow>
+#include <QMainWindow>
+#include <QtGui/QIcon>
+#include <QtGui/QPixmap>
+
+QT_BEGIN_NAMESPACE
+
+class QDebug;
+
+namespace qdesigner_internal {
+class QDesignerFormWindowCommand;
+class DesignerIconCache;
+class FormWindowBase;
+
+
+QDESIGNER_SHARED_EXPORT void designerWarning(const QString &message);
+
+QDESIGNER_SHARED_EXPORT void reloadIconResources(DesignerIconCache *iconCache, QObject *object);
+
+/* Flag/Enumeration helpers for the property sheet: Enumeration or flag values are returned by the property sheet
+ * as a pair of meta type and integer value.
+ * The meta type carries all the information required for the property editor and serialization
+ * by the form builders (names, etc).
+ * Note that the property editor uses unqualified names ("Cancel") while the form builder serialization  (uic)
+ * requires the whole string
+ * ("QDialogButtonBox::Cancel" or "org.qt-project.qt.gui.QDialogButtonBox.StandardButton.Cancel").*/
+
+/* --------- MetaEnum: Base class representing a QMetaEnum with lookup functions
+ * in both ways. Template of int type since unsigned is more suitable for flags.
+ * The keyToValue() is ignorant of scopes, it can handle fully qualified or unqualified names. */
+
+template <class IntType>
+class MetaEnum
+{
+public:
+    typedef QMap<QString, IntType> KeyToValueMap;
+
+    MetaEnum(const QString &name, const QString &scope, const QString &separator);
+    MetaEnum() {}
+    void addKey(IntType value, const QString &name);
+
+    QString valueToKey(IntType value, bool *ok = 0) const;
+    // Ignorant of scopes.
+    IntType keyToValue(QString key, bool *ok = 0) const;
+
+    const QString &name() const      { return m_name; }
+    const QString &scope() const     { return m_scope; }
+    const QString &separator() const { return m_separator; }
+
+    const QStringList &keys() const { return m_keys; }
+    const KeyToValueMap &keyToValueMap() const { return m_keyToValueMap; }
+
+protected:
+    void appendQualifiedName(const QString &key, QString &target) const;
+
+private:
+    QString m_name;
+    QString m_scope;
+    QString m_separator;
+    KeyToValueMap m_keyToValueMap;
+    QStringList m_keys;
+};
+
+template <class IntType>
+MetaEnum<IntType>::MetaEnum(const QString &name, const QString &scope, const QString &separator) :
+    m_name(name),
+    m_scope(scope),
+    m_separator(separator)
+{
+}
+
+template <class IntType>
+void MetaEnum<IntType>::addKey(IntType value, const QString &name)
+{
+    m_keyToValueMap.insert(name, value);
+    m_keys.append(name);
+}
+
+template <class IntType>
+QString MetaEnum<IntType>::valueToKey(IntType value, bool *ok) const
+{
+    const QString rc = m_keyToValueMap.key(value);
+    if (ok)
+        *ok = !rc.isEmpty();
+    return rc;
+}
+
+template <class IntType>
+IntType MetaEnum<IntType>::keyToValue(QString key, bool *ok) const
+{
+    if (!m_scope.isEmpty() && key.startsWith(m_scope))
+        key.remove(0, m_scope.size() + m_separator.size());
+    const typename KeyToValueMap::const_iterator it = m_keyToValueMap.find(key);
+    const bool found = it != m_keyToValueMap.constEnd();
+    if (ok)
+        *ok = found;
+    return found ? it.value() : IntType(0);
+}
+
+template <class IntType>
+void MetaEnum<IntType>::appendQualifiedName(const QString &key, QString &target) const
+{
+    if (!m_scope.isEmpty()) {
+        target += m_scope;
+        target += m_separator;
+    }
+    target += key;
+}
+
+// -------------- DesignerMetaEnum: Meta type for enumerations
+
+class QDESIGNER_SHARED_EXPORT DesignerMetaEnum : public MetaEnum<int>
+{
+public:
+    DesignerMetaEnum(const QString &name, const QString &scope, const QString &separator);
+    DesignerMetaEnum() {}
+
+    enum SerializationMode { FullyQualified, NameOnly };
+    QString toString(int value, SerializationMode sm, bool *ok = 0) const;
+
+    QString messageToStringFailed(int value) const;
+    QString messageParseFailed(const QString &s) const;
+
+    // parse a string (ignorant of scopes)
+    int parseEnum(const QString &s, bool *ok = 0) const { return keyToValue(s, ok); }
+};
+
+// -------------- DesignerMetaFlags: Meta type for flags.
+// Note that while the handling of flags is done using unsigned integers, the actual values returned
+// by the property system  are integers.
+
+class QDESIGNER_SHARED_EXPORT DesignerMetaFlags : public MetaEnum<uint>
+{
+public:
+    DesignerMetaFlags(const QString &name, const QString &scope, const QString &separator);
+    DesignerMetaFlags() {}
+
+    enum SerializationMode { FullyQualified, NameOnly };
+    QString toString(int value, SerializationMode sm) const;
+    QStringList flags(int value) const;
+
+    QString messageParseFailed(const QString &s) const;
+    // parse a string (ignorant of scopes)
+    int parseFlags(const QString &s, bool *ok = 0) const;
+};
+
+// -------------- EnumValue: Returned by the property sheet for enumerations
+
+struct QDESIGNER_SHARED_EXPORT PropertySheetEnumValue
+{
+    PropertySheetEnumValue(int v, const DesignerMetaEnum &me);
+    PropertySheetEnumValue();
+
+    int value;
+    DesignerMetaEnum metaEnum;
+};
+
+// -------------- FlagValue: Returned by the property sheet for flags
+
+struct QDESIGNER_SHARED_EXPORT PropertySheetFlagValue
+{
+    PropertySheetFlagValue(int v, const DesignerMetaFlags &mf);
+    PropertySheetFlagValue();
+
+    int value;
+    DesignerMetaFlags metaFlags;
+};
+
+// -------------- PixmapValue: Returned by the property sheet for pixmaps
+class QDESIGNER_SHARED_EXPORT PropertySheetPixmapValue
+{
+public:
+    PropertySheetPixmapValue(const QString &path);
+    PropertySheetPixmapValue();
+
+    bool operator==(const PropertySheetPixmapValue &other) const { return compare(other) == 0; }
+    bool operator!=(const PropertySheetPixmapValue &other) const { return compare(other) != 0; }
+    bool operator<(const PropertySheetPixmapValue &other) const  { return compare(other) <  0; }
+
+    // Check where a pixmap comes from
+    enum PixmapSource { LanguageResourcePixmap , ResourcePixmap, FilePixmap };
+    static PixmapSource getPixmapSource(QDesignerFormEditorInterface *core, const QString & path);
+
+    PixmapSource pixmapSource(QDesignerFormEditorInterface *core) const { return getPixmapSource(core, m_path); }
+
+    QString path() const;
+    void setPath(const QString &path); // passing the empty path resets the pixmap
+
+    int compare(const PropertySheetPixmapValue &other) const;
+
+private:
+    QString m_path;
+};
+
+// -------------- IconValue: Returned by the property sheet for icons
+
+class PropertySheetIconValueData;
+
+class QDESIGNER_SHARED_EXPORT PropertySheetIconValue
+{
+ public:
+    PropertySheetIconValue(const PropertySheetPixmapValue &pixmap);
+    PropertySheetIconValue();
+    ~PropertySheetIconValue();
+    PropertySheetIconValue(const PropertySheetIconValue &);
+    PropertySheetIconValue &operator=(const PropertySheetIconValue &);
+
+    bool operator==(const PropertySheetIconValue &other) const { return equals(other); }
+    bool operator!=(const PropertySheetIconValue &other) const { return !equals(other); }
+    bool operator<(const PropertySheetIconValue &other) const;
+
+    bool isEmpty() const;
+
+    QString theme() const;
+    void setTheme(const QString &);
+
+    PropertySheetPixmapValue pixmap(QIcon::Mode mode, QIcon::State state) const;
+    void setPixmap(QIcon::Mode mode, QIcon::State state, const PropertySheetPixmapValue &path); // passing the empty path resets the pixmap
+
+    uint mask() const;
+    uint compare(const PropertySheetIconValue &other) const;
+    void assign(const PropertySheetIconValue &other, uint mask);
+
+    // Convenience accessors to get themed/unthemed icons.
+    PropertySheetIconValue themed() const;
+    PropertySheetIconValue unthemed() const;
+
+    typedef QPair<QIcon::Mode, QIcon::State> ModeStateKey;
+    typedef QMap<ModeStateKey, PropertySheetPixmapValue> ModeStateToPixmapMap;
+
+    const ModeStateToPixmapMap &paths() const;
+
+private:
+    bool equals(const PropertySheetIconValue &rhs) const;
+    QSharedDataPointer<PropertySheetIconValueData> m_data;
+};
+
+QDESIGNER_SHARED_EXPORT QDebug operator<<(QDebug, const PropertySheetIconValue &);
+
+class QDESIGNER_SHARED_EXPORT DesignerPixmapCache : public QObject
+{
+    Q_OBJECT
+public:
+    DesignerPixmapCache(QObject *parent = 0);
+    QPixmap pixmap(const PropertySheetPixmapValue &value) const;
+    void clear();
+signals:
+    void reloaded();
+private:
+    mutable QMap<PropertySheetPixmapValue, QPixmap> m_cache;
+    friend class FormWindowBase;
+};
+
+class QDESIGNER_SHARED_EXPORT DesignerIconCache : public QObject
+{
+    Q_OBJECT
+public:
+    explicit DesignerIconCache(DesignerPixmapCache *pixmapCache, QObject *parent = 0);
+    QIcon icon(const PropertySheetIconValue &value) const;
+    void clear();
+signals:
+    void reloaded();
+private:
+    mutable QMap<PropertySheetIconValue, QIcon> m_cache;
+    DesignerPixmapCache *m_pixmapCache;
+    friend class FormWindowBase;
+};
+
+// -------------- PropertySheetTranslatableData: Base class for translatable properties.
+class QDESIGNER_SHARED_EXPORT PropertySheetTranslatableData
+{
+protected:
+    PropertySheetTranslatableData(bool translatable = true,
+                                  const QString &disambiguation = QString(),
+                                  const QString &comment = QString());
+    bool equals(const PropertySheetTranslatableData &rhs) const;
+
+public:
+    bool translatable() const                { return m_translatable; }
+    void setTranslatable(bool translatable)  { m_translatable = translatable; }
+    QString disambiguation() const           { return m_disambiguation; }
+    void setDisambiguation(const QString &d) { m_disambiguation = d; }
+    QString comment() const                  { return m_comment; }
+    void setComment(const QString &comment)  { m_comment = comment; }
+
+private:
+    bool m_translatable;
+    QString m_disambiguation;
+    QString m_comment;
+};
+
+// -------------- StringValue: Returned by the property sheet for strings
+class QDESIGNER_SHARED_EXPORT PropertySheetStringValue : public PropertySheetTranslatableData
+{
+public:
+    PropertySheetStringValue(const QString &value = QString(), bool translatable = true,
+                             const QString &disambiguation = QString(), const QString &comment = QString());
+
+    bool operator==(const PropertySheetStringValue &other) const { return equals(other); }
+    bool operator!=(const PropertySheetStringValue &other) const { return !equals(other); }
+
+    QString value() const;
+    void setValue(const QString &value);
+
+private:
+    bool equals(const PropertySheetStringValue &rhs) const;
+
+    QString m_value;
+};
+
+// -------------- StringValue: Returned by the property sheet for string lists
+class QDESIGNER_SHARED_EXPORT PropertySheetStringListValue : public PropertySheetTranslatableData
+{
+public:
+    PropertySheetStringListValue(const QStringList &value = QStringList(),
+                                 bool translatable = true,
+                                 const QString &disambiguation = QString(),
+                                 const QString &comment = QString());
+
+    bool operator==(const PropertySheetStringListValue &other) const { return equals(other); }
+    bool operator!=(const PropertySheetStringListValue &other) const { return !equals(other); }
+
+    QStringList value() const;
+    void setValue(const QStringList &value);
+
+private:
+    bool equals(const PropertySheetStringListValue &rhs) const;
+
+    QStringList m_value;
+};
+
+// -------------- StringValue: Returned by the property sheet for strings
+class QDESIGNER_SHARED_EXPORT PropertySheetKeySequenceValue : public PropertySheetTranslatableData
+{
+public:
+    PropertySheetKeySequenceValue(const QKeySequence &value = QKeySequence(),
+                                  bool translatable = true,
+                                  const QString &disambiguation = QString(),
+                                  const QString &comment = QString());
+    PropertySheetKeySequenceValue(const QKeySequence::StandardKey &standardKey,
+                                  bool translatable = true,
+                                  const QString &disambiguation = QString(),
+                                  const QString &comment = QString());
+
+    bool operator==(const PropertySheetKeySequenceValue &other) const { return equals(other); }
+    bool operator!=(const PropertySheetKeySequenceValue &other) const { return !equals(other); }
+
+    QKeySequence value() const;
+    void setValue(const QKeySequence &value);
+    QKeySequence::StandardKey standardKey() const;
+    void setStandardKey(const QKeySequence::StandardKey &standardKey);
+    bool isStandardKey() const;
+
+private:
+    bool equals(const PropertySheetKeySequenceValue &rhs) const;
+
+    QKeySequence m_value;
+    QKeySequence::StandardKey m_standardKey;
+};
+
+} // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+
+// NOTE: Do not move this code, needed for GCC 3.3
+Q_DECLARE_METATYPE(qdesigner_internal::PropertySheetEnumValue)
+Q_DECLARE_METATYPE(qdesigner_internal::PropertySheetFlagValue)
+Q_DECLARE_METATYPE(qdesigner_internal::PropertySheetPixmapValue)
+Q_DECLARE_METATYPE(qdesigner_internal::PropertySheetIconValue)
+Q_DECLARE_METATYPE(qdesigner_internal::PropertySheetStringValue)
+Q_DECLARE_METATYPE(qdesigner_internal::PropertySheetStringListValue)
+Q_DECLARE_METATYPE(qdesigner_internal::PropertySheetKeySequenceValue)
+
+
+QT_BEGIN_NAMESPACE
+
+namespace qdesigner_internal {
+
+
+// Create a command to change a text property (that is, create a reset property command if the text is empty)
+QDESIGNER_SHARED_EXPORT QDesignerFormWindowCommand *createTextPropertyCommand(const QString &propertyName, const QString &text, QObject *object, QDesignerFormWindowInterface *fw);
+
+// Returns preferred task menu action for managed widget
+QDESIGNER_SHARED_EXPORT QAction *preferredEditAction(QDesignerFormEditorInterface *core, QWidget *managedWidget);
+
+// Convenience to run UIC
+QDESIGNER_SHARED_EXPORT bool runUIC(const QString &fileName, QByteArray& ba, QString &errorMessage);
+
+// Find a suitable variable name for a class.
+QDESIGNER_SHARED_EXPORT QString qtify(const QString &name);
+
+/* UpdateBlocker: Blocks the updates of the widget passed on while in scope.
+ * Does nothing if the incoming widget already has updatesEnabled==false
+ * which is important to avoid side-effects when putting it into QStackedLayout. */
+
+class QDESIGNER_SHARED_EXPORT UpdateBlocker {
+    Q_DISABLE_COPY(UpdateBlocker)
+
+public:
+    UpdateBlocker(QWidget *w);
+    ~UpdateBlocker();
+
+private:
+    QWidget *m_widget;
+    const bool m_enabled;
+};
+
+namespace Utils {
+
+inline int valueOf(const QVariant &value, bool *ok = 0)
+{
+    if (value.canConvert<PropertySheetEnumValue>()) {
+        if (ok)
+            *ok = true;
+        return qvariant_cast<PropertySheetEnumValue>(value).value;
+    }
+    else if (value.canConvert<PropertySheetFlagValue>()) {
+        if (ok)
+            *ok = true;
+        return qvariant_cast<PropertySheetFlagValue>(value).value;
+    }
+    return value.toInt(ok);
+}
+
+inline bool isObjectAncestorOf(QObject *ancestor, QObject *child)
+{
+    QObject *obj = child;
+    while (obj != 0) {
+        if (obj == ancestor)
+            return true;
+        obj = obj->parent();
+    }
+    return false;
+}
+
+inline bool isCentralWidget(QDesignerFormWindowInterface *fw, QWidget *widget)
+{
+    if (! fw || ! widget)
+        return false;
+
+    if (widget == fw->mainContainer())
+        return true;
+
+    // ### generalize for other containers
+    if (QMainWindow *mw = qobject_cast<QMainWindow*>(fw->mainContainer())) {
+        return mw->centralWidget() == widget;
+    }
+
+    return false;
+}
+
+} // namespace Utils
+
+} // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // QDESIGNER_UTILS_P_H
diff --git a/GUI/coregui/Views/widgetbox/qdesigner_widgetbox_p.h b/GUI/coregui/Views/widgetbox/qdesigner_widgetbox_p.h
new file mode 100644
index 0000000..279d64c
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/qdesigner_widgetbox_p.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QDESIGNER_WIDGETBOX_P_H
+#define QDESIGNER_WIDGETBOX_P_H
+
+#include "shared_global_p.h"
+#include <QtDesigner/QDesignerWidgetBoxInterface>
+
+QT_BEGIN_NAMESPACE
+
+class DomUI;
+
+namespace qdesigner_internal {
+
+// A widget box with a load mode that allows for updating custom widgets.
+
+class QDESIGNER_SHARED_EXPORT QDesignerWidgetBox : public QDesignerWidgetBoxInterface
+{
+    Q_OBJECT
+public:
+    enum LoadMode { LoadMerge, LoadReplace, LoadCustomWidgetsOnly };
+
+    explicit QDesignerWidgetBox(QWidget *parent = 0, Qt::WindowFlags flags = 0);
+
+    LoadMode loadMode() const;
+    void setLoadMode(LoadMode lm);
+
+    virtual bool loadContents(const QString &contents) = 0;
+
+    // Convenience to access the widget box icon of a widget. Empty category
+    // matches all
+    virtual QIcon iconForWidget(const QString &className,
+                                const QString &category = QString()) const = 0;
+
+    // Convenience to find a widget by class name. Empty category matches all
+    static bool findWidget(const QDesignerWidgetBoxInterface *wbox,
+                           const QString &className,
+                           const QString &category /* = QString()  */,
+                           Widget *widgetData);
+    // Convenience functions to create a DomWidget from widget box xml.
+    static DomUI *xmlToUi(const QString &name, const QString &xml, bool insertFakeTopLevel, QString *errorMessage);
+    static DomUI *xmlToUi(const QString &name, const QString &xml, bool insertFakeTopLevel);
+
+private:
+    LoadMode m_loadMode;
+};
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // QDESIGNER_WIDGETBOX_P_H
diff --git a/GUI/coregui/Views/widgetbox/qsimpleresource_p.h b/GUI/coregui/Views/widgetbox/qsimpleresource_p.h
new file mode 100644
index 0000000..e39ea65
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/qsimpleresource_p.h
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QSIMPLERESOURCE_P_H
+#define QSIMPLERESOURCE_P_H
+
+#include "shared_global_p.h"
+//#include "abstractformbuilder.h"
+#include <QtDesigner/abstractformbuilder.h>
+#include <QtCore/QStringList>
+
+QT_BEGIN_NAMESPACE
+
+class DomScript;
+class DomCustomWidgets;
+class DomCustomWidget;
+class DomSlots;
+
+class QDesignerFormEditorInterface;
+
+namespace qdesigner_internal {
+
+class WidgetDataBaseItem;
+
+class QDESIGNER_SHARED_EXPORT QSimpleResource : public QAbstractFormBuilder
+{
+public:
+    explicit QSimpleResource(QDesignerFormEditorInterface *core);
+    virtual ~QSimpleResource();
+
+    QBrush setupBrush(DomBrush *brush);
+    DomBrush *saveBrush(const QBrush &brush);
+
+    inline QDesignerFormEditorInterface *core() const
+    { return m_core; }
+
+    // Query extensions for additional data
+    static void addExtensionDataToDOM(QAbstractFormBuilder *afb,
+                                      QDesignerFormEditorInterface *core,
+                                      DomWidget *ui_widget, QWidget *widget);
+    static void applyExtensionDataFromDOM(QAbstractFormBuilder *afb,
+                                          QDesignerFormEditorInterface *core,
+                                          DomWidget *ui_widget, QWidget *widget);
+    // Return the script returned by the CustomWidget codeTemplate API
+    static QString customWidgetScript(QDesignerFormEditorInterface *core, QObject *object);
+    static QString customWidgetScript(QDesignerFormEditorInterface *core, const QString &className);
+    static bool hasCustomWidgetScript(QDesignerFormEditorInterface *core, QObject *object);
+
+    // Implementation for FormBuilder::createDomCustomWidgets() that adds
+    // the custom widgets to the widget database
+    static void handleDomCustomWidgets(const QDesignerFormEditorInterface *core,
+                                       const DomCustomWidgets *dom_custom_widgets);
+
+protected:
+    enum ScriptSource { ScriptDesigner, ScriptExtension, ScriptCustomWidgetPlugin };
+    static DomScript*createScript(const QString &script, ScriptSource source);
+    typedef QList<DomScript*> DomScripts;
+    static void addScript(const QString &script, ScriptSource source, DomScripts &domScripts);
+
+    static bool addFakeMethods(const DomSlots *domSlots, QStringList &fakeSlots, QStringList &fakeSignals);
+
+private:
+    static void addCustomWidgetsToWidgetDatabase(const QDesignerFormEditorInterface *core,
+                                                 QList<DomCustomWidget*>& custom_widget_list);
+    static void addFakeMethodsToWidgetDataBase(const DomCustomWidget *domCustomWidget, WidgetDataBaseItem *item);
+
+    static bool m_warningsEnabled;
+    QDesignerFormEditorInterface *m_core;
+};
+
+// Contents of clipboard for formbuilder copy and paste operations
+// (Actions and widgets)
+struct QDESIGNER_SHARED_EXPORT FormBuilderClipboard {
+    typedef QList<QAction*> ActionList;
+
+    FormBuilderClipboard() {}
+    FormBuilderClipboard(QWidget *w);
+
+    bool empty() const;
+
+    QWidgetList m_widgets;
+    ActionList m_actions;
+};
+
+// Base class for a form builder used in the editor that
+// provides copy and paste.(move into base interface)
+class QDESIGNER_SHARED_EXPORT QEditorFormBuilder : public QSimpleResource
+{
+public:
+    explicit QEditorFormBuilder(QDesignerFormEditorInterface *core) : QSimpleResource(core) {}
+
+    virtual bool copy(QIODevice *dev, const FormBuilderClipboard &selection) = 0;
+    virtual DomUI *copy(const FormBuilderClipboard &selection) = 0;
+
+    // A widget parent needs to be specified, otherwise, the widget factory cannot locate the form window via parent
+    // and thus is not able to construct special widgets (QLayoutWidget).
+    virtual FormBuilderClipboard paste(DomUI *ui, QWidget *widgetParent, QObject *actionParent = 0) = 0;
+    virtual FormBuilderClipboard paste(QIODevice *dev, QWidget *widgetParent, QObject *actionParent = 0) = 0;
+};
+
+} // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // QSIMPLERESOURCE_P_H
diff --git a/GUI/coregui/Views/widgetbox/shared_enums_p.h b/GUI/coregui/Views/widgetbox/shared_enums_p.h
new file mode 100644
index 0000000..f57d5c2
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/shared_enums_p.h
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef SHARED_ENUMS_P_H
+#define SHARED_ENUMS_P_H
+
+#include "shared_global_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace qdesigner_internal {
+
+    // Validation mode of text property line edits
+    enum TextPropertyValidationMode {
+        // Allow for multiline editing using literal "\n".
+        ValidationMultiLine,
+        // Allow for HTML rich text including multiline editing using literal "\n".
+        ValidationRichText,
+        // Validate a stylesheet
+        ValidationStyleSheet,
+        // Single line mode, suppresses newlines
+        ValidationSingleLine,
+        // Allow only for identifier characters
+        ValidationObjectName,
+        // Allow only for identifier characters and colons
+        ValidationObjectNameScope,
+        // URL
+        ValidationURL
+        };
+
+    // Container types
+    enum ContainerType {
+        // A container with pages, at least one of which one must always be present (for example, QTabWidget)
+        PageContainer,
+        // Mdi type container. All pages may be deleted, no concept of page order
+        MdiContainer,
+        // Wizard container
+        WizardContainer
+        };
+
+    enum AuxiliaryItemDataRoles {
+        // item->flags while being edited
+        ItemFlagsShadowRole = 0x13370551
+    };
+
+}
+
+QT_END_NAMESPACE
+
+#endif // SHARED_ENUMS_P_H
diff --git a/GUI/coregui/Views/widgetbox/shared_global_p.h b/GUI/coregui/Views/widgetbox/shared_global_p.h
new file mode 100644
index 0000000..6c7edcd
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/shared_global_p.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef SHARED_GLOBAL_P_H
+#define SHARED_GLOBAL_P_H
+
+#include <QtCore/qglobal.h>
+
+#ifdef QT_DESIGNER_STATIC
+#define QDESIGNER_SHARED_EXTERN
+#define QDESIGNER_SHARED_IMPORT
+#else
+#define QDESIGNER_SHARED_EXTERN Q_DECL_EXPORT
+#define QDESIGNER_SHARED_IMPORT Q_DECL_IMPORT
+#endif
+
+#ifndef QT_NO_SHARED_EXPORT
+#  ifdef QDESIGNER_SHARED_LIBRARY
+#    define QDESIGNER_SHARED_EXPORT QDESIGNER_SHARED_EXTERN
+#  else
+#    define QDESIGNER_SHARED_EXPORT QDESIGNER_SHARED_IMPORT
+#  endif
+#else
+#  define QDESIGNER_SHARED_EXPORT
+#endif
+
+#endif // SHARED_GLOBAL_P_H
diff --git a/GUI/coregui/Views/widgetbox/sheet_delegate_p.h b/GUI/coregui/Views/widgetbox/sheet_delegate_p.h
new file mode 100644
index 0000000..9f18f70
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/sheet_delegate_p.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+
+#ifndef SHEET_DELEGATE_P_H
+#define SHEET_DELEGATE_P_H
+
+#include "shared_global_p.h"
+
+//#include <QtWidgets/QItemDelegate>
+//#include <QtWidgets/QTreeView>
+#include <QItemDelegate>
+#include <QTreeView>
+
+QT_BEGIN_NAMESPACE
+
+class QTreeView;
+
+namespace qdesigner_internal {
+
+class QDESIGNER_SHARED_EXPORT SheetDelegate: public QItemDelegate
+{
+    Q_OBJECT
+public:
+    SheetDelegate(QTreeView *view, QWidget *parent);
+
+    virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+    virtual QSize sizeHint(const QStyleOptionViewItem &opt, const QModelIndex &index) const;
+
+private:
+    QTreeView *m_view;
+};
+
+} // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // SHEET_DELEGATE_P_H
diff --git a/GUI/coregui/Views/widgetbox/spacer_widget_p.h b/GUI/coregui/Views/widgetbox/spacer_widget_p.h
new file mode 100644
index 0000000..cec72d7
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/spacer_widget_p.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+
+#ifndef SPACER_WIDGET_P_H
+#define SPACER_WIDGET_P_H
+
+#include "shared_global_p.h"
+
+//#include <QtWidgets/QWidget>
+//#include <QtWidgets/QSizePolicy>
+#include <QWidget>
+#include <QSizePolicy>
+
+QT_BEGIN_NAMESPACE
+
+class QDesignerFormWindowInterface;
+
+class QDESIGNER_SHARED_EXPORT Spacer: public QWidget
+{
+    Q_OBJECT
+
+    Q_ENUMS(SizeType)
+    // Special hack: Make name appear as "spacer name"
+    Q_PROPERTY(QString spacerName  READ objectName WRITE setObjectName)
+    Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)
+    Q_PROPERTY(QSizePolicy::Policy sizeType READ sizeType WRITE setSizeType)
+    Q_PROPERTY(QSize sizeHint READ sizeHintProperty WRITE setSizeHintProperty DESIGNABLE true STORED true)
+
+public:
+    Spacer(QWidget *parent = 0);
+
+    QSize sizeHint() const;
+
+    QSize sizeHintProperty() const;
+    void setSizeHintProperty(const QSize &s);
+
+    QSizePolicy::Policy sizeType() const;
+    void setSizeType(QSizePolicy::Policy t);
+
+    Qt::Alignment alignment() const;
+    Qt::Orientation orientation() const;
+
+    void setOrientation(Qt::Orientation o);
+    void setInteractiveMode(bool b) { m_interactive = b; };
+
+    virtual bool event(QEvent *e);
+
+protected:
+    void paintEvent(QPaintEvent *e);
+    void resizeEvent(QResizeEvent* e);
+    void updateMask();
+
+private:
+    bool isInLayout() const;
+    void updateToolTip();
+
+    const QSize m_SizeOffset;
+    QDesignerFormWindowInterface *m_formWindow;
+    Qt::Orientation m_orientation;
+    bool m_interactive;
+    // Cache information about 'being in layout' which is expensive to calculate.
+    enum LayoutState { InLayout, OutsideLayout, UnknownLayoutState };
+    mutable LayoutState m_layoutState;
+    QSize m_sizeHint;
+};
+
+QT_END_NAMESPACE
+
+#endif // SPACER_WIDGET_P_H
diff --git a/GUI/coregui/Views/widgetbox/ui4_p.h b/GUI/coregui/Views/widgetbox/ui4_p.h
new file mode 100644
index 0000000..62cf1e0
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/ui4_p.h
@@ -0,0 +1,3627 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+// THIS FILE IS AUTOMATICALLY GENERATED
+
+#ifndef UI4_P_H
+#define UI4_P_H
+
+#include <QtCore/QList>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QXmlStreamReader>
+#include <QtCore/QXmlStreamWriter>
+#include <QtCore/qglobal.h>
+
+QT_BEGIN_NAMESPACE
+
+#define QDESIGNER_UILIB_EXTERN Q_DECL_EXPORT
+#define QDESIGNER_UILIB_IMPORT Q_DECL_IMPORT
+
+#if defined(QT_DESIGNER_STATIC) || defined(QT_UIC) || defined(QT_UIC3)
+#  define QDESIGNER_UILIB_EXPORT
+#elif defined(QDESIGNER_UILIB_LIBRARY)
+#  define QDESIGNER_UILIB_EXPORT QDESIGNER_UILIB_EXTERN
+#else
+#  define QDESIGNER_UILIB_EXPORT QDESIGNER_UILIB_IMPORT
+#endif
+
+#ifndef QDESIGNER_UILIB_EXPORT
+#    define QDESIGNER_UILIB_EXPORT
+#endif
+
+#ifdef QFORMINTERNAL_NAMESPACE
+namespace QFormInternal
+{
+#endif
+
+
+/*******************************************************************************
+** Forward declarations
+*/
+
+class DomUI;
+class DomIncludes;
+class DomInclude;
+class DomResources;
+class DomResource;
+class DomActionGroup;
+class DomAction;
+class DomActionRef;
+class DomButtonGroup;
+class DomButtonGroups;
+class DomImages;
+class DomImage;
+class DomImageData;
+class DomCustomWidgets;
+class DomHeader;
+class DomCustomWidget;
+class DomProperties;
+class DomPropertyData;
+class DomSizePolicyData;
+class DomLayoutDefault;
+class DomLayoutFunction;
+class DomTabStops;
+class DomLayout;
+class DomLayoutItem;
+class DomRow;
+class DomColumn;
+class DomItem;
+class DomWidget;
+class DomSpacer;
+class DomColor;
+class DomGradientStop;
+class DomGradient;
+class DomBrush;
+class DomColorRole;
+class DomColorGroup;
+class DomPalette;
+class DomFont;
+class DomPoint;
+class DomRect;
+class DomLocale;
+class DomSizePolicy;
+class DomSize;
+class DomDate;
+class DomTime;
+class DomDateTime;
+class DomStringList;
+class DomResourcePixmap;
+class DomResourceIcon;
+class DomString;
+class DomPointF;
+class DomRectF;
+class DomSizeF;
+class DomChar;
+class DomUrl;
+class DomProperty;
+class DomConnections;
+class DomConnection;
+class DomConnectionHints;
+class DomConnectionHint;
+class DomScript;
+class DomWidgetData;
+class DomDesignerData;
+class DomSlots;
+class DomPropertySpecifications;
+class DomStringPropertySpecification;
+
+/*******************************************************************************
+** Declarations
+*/
+
+class QDESIGNER_UILIB_EXPORT DomUI {
+public:
+    DomUI();
+    ~DomUI();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeVersion() const { return m_has_attr_version; }
+    inline QString attributeVersion() const { return m_attr_version; }
+    inline void setAttributeVersion(const QString& a) { m_attr_version = a; m_has_attr_version = true; }
+    inline void clearAttributeVersion() { m_has_attr_version = false; }
+
+    inline bool hasAttributeLanguage() const { return m_has_attr_language; }
+    inline QString attributeLanguage() const { return m_attr_language; }
+    inline void setAttributeLanguage(const QString& a) { m_attr_language = a; m_has_attr_language = true; }
+    inline void clearAttributeLanguage() { m_has_attr_language = false; }
+
+    inline bool hasAttributeDisplayname() const { return m_has_attr_displayname; }
+    inline QString attributeDisplayname() const { return m_attr_displayname; }
+    inline void setAttributeDisplayname(const QString& a) { m_attr_displayname = a; m_has_attr_displayname = true; }
+    inline void clearAttributeDisplayname() { m_has_attr_displayname = false; }
+
+    inline bool hasAttributeStdsetdef() const { return m_has_attr_stdsetdef; }
+    inline int attributeStdsetdef() const { return m_attr_stdsetdef; }
+    inline void setAttributeStdsetdef(int a) { m_attr_stdsetdef = a; m_has_attr_stdsetdef = true; }
+    inline void clearAttributeStdsetdef() { m_has_attr_stdsetdef = false; }
+
+    inline bool hasAttributeStdSetDef() const { return m_has_attr_stdSetDef; }
+    inline int attributeStdSetDef() const { return m_attr_stdSetDef; }
+    inline void setAttributeStdSetDef(int a) { m_attr_stdSetDef = a; m_has_attr_stdSetDef = true; }
+    inline void clearAttributeStdSetDef() { m_has_attr_stdSetDef = false; }
+
+    // child element accessors
+    inline QString elementAuthor() const { return m_author; }
+    void setElementAuthor(const QString& a);
+    inline bool hasElementAuthor() const { return m_children & Author; }
+    void clearElementAuthor();
+
+    inline QString elementComment() const { return m_comment; }
+    void setElementComment(const QString& a);
+    inline bool hasElementComment() const { return m_children & Comment; }
+    void clearElementComment();
+
+    inline QString elementExportMacro() const { return m_exportMacro; }
+    void setElementExportMacro(const QString& a);
+    inline bool hasElementExportMacro() const { return m_children & ExportMacro; }
+    void clearElementExportMacro();
+
+    inline QString elementClass() const { return m_class; }
+    void setElementClass(const QString& a);
+    inline bool hasElementClass() const { return m_children & Class; }
+    void clearElementClass();
+
+    inline DomWidget* elementWidget() const { return m_widget; }
+    DomWidget* takeElementWidget();
+    void setElementWidget(DomWidget* a);
+    inline bool hasElementWidget() const { return m_children & Widget; }
+    void clearElementWidget();
+
+    inline DomLayoutDefault* elementLayoutDefault() const { return m_layoutDefault; }
+    DomLayoutDefault* takeElementLayoutDefault();
+    void setElementLayoutDefault(DomLayoutDefault* a);
+    inline bool hasElementLayoutDefault() const { return m_children & LayoutDefault; }
+    void clearElementLayoutDefault();
+
+    inline DomLayoutFunction* elementLayoutFunction() const { return m_layoutFunction; }
+    DomLayoutFunction* takeElementLayoutFunction();
+    void setElementLayoutFunction(DomLayoutFunction* a);
+    inline bool hasElementLayoutFunction() const { return m_children & LayoutFunction; }
+    void clearElementLayoutFunction();
+
+    inline QString elementPixmapFunction() const { return m_pixmapFunction; }
+    void setElementPixmapFunction(const QString& a);
+    inline bool hasElementPixmapFunction() const { return m_children & PixmapFunction; }
+    void clearElementPixmapFunction();
+
+    inline DomCustomWidgets* elementCustomWidgets() const { return m_customWidgets; }
+    DomCustomWidgets* takeElementCustomWidgets();
+    void setElementCustomWidgets(DomCustomWidgets* a);
+    inline bool hasElementCustomWidgets() const { return m_children & CustomWidgets; }
+    void clearElementCustomWidgets();
+
+    inline DomTabStops* elementTabStops() const { return m_tabStops; }
+    DomTabStops* takeElementTabStops();
+    void setElementTabStops(DomTabStops* a);
+    inline bool hasElementTabStops() const { return m_children & TabStops; }
+    void clearElementTabStops();
+
+    inline DomImages* elementImages() const { return m_images; }
+    DomImages* takeElementImages();
+    void setElementImages(DomImages* a);
+    inline bool hasElementImages() const { return m_children & Images; }
+    void clearElementImages();
+
+    inline DomIncludes* elementIncludes() const { return m_includes; }
+    DomIncludes* takeElementIncludes();
+    void setElementIncludes(DomIncludes* a);
+    inline bool hasElementIncludes() const { return m_children & Includes; }
+    void clearElementIncludes();
+
+    inline DomResources* elementResources() const { return m_resources; }
+    DomResources* takeElementResources();
+    void setElementResources(DomResources* a);
+    inline bool hasElementResources() const { return m_children & Resources; }
+    void clearElementResources();
+
+    inline DomConnections* elementConnections() const { return m_connections; }
+    DomConnections* takeElementConnections();
+    void setElementConnections(DomConnections* a);
+    inline bool hasElementConnections() const { return m_children & Connections; }
+    void clearElementConnections();
+
+    inline DomDesignerData* elementDesignerdata() const { return m_designerdata; }
+    DomDesignerData* takeElementDesignerdata();
+    void setElementDesignerdata(DomDesignerData* a);
+    inline bool hasElementDesignerdata() const { return m_children & Designerdata; }
+    void clearElementDesignerdata();
+
+    inline DomSlots* elementSlots() const { return m_slots; }
+    DomSlots* takeElementSlots();
+    void setElementSlots(DomSlots* a);
+    inline bool hasElementSlots() const { return m_children & Slots; }
+    void clearElementSlots();
+
+    inline DomButtonGroups* elementButtonGroups() const { return m_buttonGroups; }
+    DomButtonGroups* takeElementButtonGroups();
+    void setElementButtonGroups(DomButtonGroups* a);
+    inline bool hasElementButtonGroups() const { return m_children & ButtonGroups; }
+    void clearElementButtonGroups();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_version;
+    bool m_has_attr_version;
+
+    QString m_attr_language;
+    bool m_has_attr_language;
+
+    QString m_attr_displayname;
+    bool m_has_attr_displayname;
+
+    int m_attr_stdsetdef;
+    bool m_has_attr_stdsetdef;
+
+    int m_attr_stdSetDef;
+    bool m_has_attr_stdSetDef;
+
+    // child element data
+    uint m_children;
+    QString m_author;
+    QString m_comment;
+    QString m_exportMacro;
+    QString m_class;
+    DomWidget* m_widget;
+    DomLayoutDefault* m_layoutDefault;
+    DomLayoutFunction* m_layoutFunction;
+    QString m_pixmapFunction;
+    DomCustomWidgets* m_customWidgets;
+    DomTabStops* m_tabStops;
+    DomImages* m_images;
+    DomIncludes* m_includes;
+    DomResources* m_resources;
+    DomConnections* m_connections;
+    DomDesignerData* m_designerdata;
+    DomSlots* m_slots;
+    DomButtonGroups* m_buttonGroups;
+    enum Child {
+        Author = 1,
+        Comment = 2,
+        ExportMacro = 4,
+        Class = 8,
+        Widget = 16,
+        LayoutDefault = 32,
+        LayoutFunction = 64,
+        PixmapFunction = 128,
+        CustomWidgets = 256,
+        TabStops = 512,
+        Images = 1024,
+        Includes = 2048,
+        Resources = 4096,
+        Connections = 8192,
+        Designerdata = 16384,
+        Slots = 32768,
+        ButtonGroups = 65536
+    };
+
+    DomUI(const DomUI &other);
+    void operator = (const DomUI&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomIncludes {
+public:
+    DomIncludes();
+    ~DomIncludes();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomInclude*> elementInclude() const { return m_include; }
+    void setElementInclude(const QList<DomInclude*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomInclude*> m_include;
+    enum Child {
+        Include = 1
+    };
+
+    DomIncludes(const DomIncludes &other);
+    void operator = (const DomIncludes&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomInclude {
+public:
+    DomInclude();
+    ~DomInclude();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeLocation() const { return m_has_attr_location; }
+    inline QString attributeLocation() const { return m_attr_location; }
+    inline void setAttributeLocation(const QString& a) { m_attr_location = a; m_has_attr_location = true; }
+    inline void clearAttributeLocation() { m_has_attr_location = false; }
+
+    inline bool hasAttributeImpldecl() const { return m_has_attr_impldecl; }
+    inline QString attributeImpldecl() const { return m_attr_impldecl; }
+    inline void setAttributeImpldecl(const QString& a) { m_attr_impldecl = a; m_has_attr_impldecl = true; }
+    inline void clearAttributeImpldecl() { m_has_attr_impldecl = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_location;
+    bool m_has_attr_location;
+
+    QString m_attr_impldecl;
+    bool m_has_attr_impldecl;
+
+    // child element data
+    uint m_children;
+
+    DomInclude(const DomInclude &other);
+    void operator = (const DomInclude&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomResources {
+public:
+    DomResources();
+    ~DomResources();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    // child element accessors
+    inline QList<DomResource*> elementInclude() const { return m_include; }
+    void setElementInclude(const QList<DomResource*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    // child element data
+    uint m_children;
+    QList<DomResource*> m_include;
+    enum Child {
+        Include = 1
+    };
+
+    DomResources(const DomResources &other);
+    void operator = (const DomResources&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomResource {
+public:
+    DomResource();
+    ~DomResource();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeLocation() const { return m_has_attr_location; }
+    inline QString attributeLocation() const { return m_attr_location; }
+    inline void setAttributeLocation(const QString& a) { m_attr_location = a; m_has_attr_location = true; }
+    inline void clearAttributeLocation() { m_has_attr_location = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_location;
+    bool m_has_attr_location;
+
+    // child element data
+    uint m_children;
+
+    DomResource(const DomResource &other);
+    void operator = (const DomResource&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomActionGroup {
+public:
+    DomActionGroup();
+    ~DomActionGroup();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    // child element accessors
+    inline QList<DomAction*> elementAction() const { return m_action; }
+    void setElementAction(const QList<DomAction*>& a);
+
+    inline QList<DomActionGroup*> elementActionGroup() const { return m_actionGroup; }
+    void setElementActionGroup(const QList<DomActionGroup*>& a);
+
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+    inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
+    void setElementAttribute(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    // child element data
+    uint m_children;
+    QList<DomAction*> m_action;
+    QList<DomActionGroup*> m_actionGroup;
+    QList<DomProperty*> m_property;
+    QList<DomProperty*> m_attribute;
+    enum Child {
+        Action = 1,
+        ActionGroup = 2,
+        Property = 4,
+        Attribute = 8
+    };
+
+    DomActionGroup(const DomActionGroup &other);
+    void operator = (const DomActionGroup&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomAction {
+public:
+    DomAction();
+    ~DomAction();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    inline bool hasAttributeMenu() const { return m_has_attr_menu; }
+    inline QString attributeMenu() const { return m_attr_menu; }
+    inline void setAttributeMenu(const QString& a) { m_attr_menu = a; m_has_attr_menu = true; }
+    inline void clearAttributeMenu() { m_has_attr_menu = false; }
+
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+    inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
+    void setElementAttribute(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    QString m_attr_menu;
+    bool m_has_attr_menu;
+
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    QList<DomProperty*> m_attribute;
+    enum Child {
+        Property = 1,
+        Attribute = 2
+    };
+
+    DomAction(const DomAction &other);
+    void operator = (const DomAction&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomActionRef {
+public:
+    DomActionRef();
+    ~DomActionRef();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    // child element data
+    uint m_children;
+
+    DomActionRef(const DomActionRef &other);
+    void operator = (const DomActionRef&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomButtonGroup {
+public:
+    DomButtonGroup();
+    ~DomButtonGroup();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+    inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
+    void setElementAttribute(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    QList<DomProperty*> m_attribute;
+    enum Child {
+        Property = 1,
+        Attribute = 2
+    };
+
+    DomButtonGroup(const DomButtonGroup &other);
+    void operator = (const DomButtonGroup&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomButtonGroups {
+public:
+    DomButtonGroups();
+    ~DomButtonGroups();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomButtonGroup*> elementButtonGroup() const { return m_buttonGroup; }
+    void setElementButtonGroup(const QList<DomButtonGroup*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomButtonGroup*> m_buttonGroup;
+    enum Child {
+        ButtonGroup = 1
+    };
+
+    DomButtonGroups(const DomButtonGroups &other);
+    void operator = (const DomButtonGroups&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomImages {
+public:
+    DomImages();
+    ~DomImages();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomImage*> elementImage() const { return m_image; }
+    void setElementImage(const QList<DomImage*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomImage*> m_image;
+    enum Child {
+        Image = 1
+    };
+
+    DomImages(const DomImages &other);
+    void operator = (const DomImages&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomImage {
+public:
+    DomImage();
+    ~DomImage();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    // child element accessors
+    inline DomImageData* elementData() const { return m_data; }
+    DomImageData* takeElementData();
+    void setElementData(DomImageData* a);
+    inline bool hasElementData() const { return m_children & Data; }
+    void clearElementData();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    // child element data
+    uint m_children;
+    DomImageData* m_data;
+    enum Child {
+        Data = 1
+    };
+
+    DomImage(const DomImage &other);
+    void operator = (const DomImage&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomImageData {
+public:
+    DomImageData();
+    ~DomImageData();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeFormat() const { return m_has_attr_format; }
+    inline QString attributeFormat() const { return m_attr_format; }
+    inline void setAttributeFormat(const QString& a) { m_attr_format = a; m_has_attr_format = true; }
+    inline void clearAttributeFormat() { m_has_attr_format = false; }
+
+    inline bool hasAttributeLength() const { return m_has_attr_length; }
+    inline int attributeLength() const { return m_attr_length; }
+    inline void setAttributeLength(int a) { m_attr_length = a; m_has_attr_length = true; }
+    inline void clearAttributeLength() { m_has_attr_length = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_format;
+    bool m_has_attr_format;
+
+    int m_attr_length;
+    bool m_has_attr_length;
+
+    // child element data
+    uint m_children;
+
+    DomImageData(const DomImageData &other);
+    void operator = (const DomImageData&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomCustomWidgets {
+public:
+    DomCustomWidgets();
+    ~DomCustomWidgets();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomCustomWidget*> elementCustomWidget() const { return m_customWidget; }
+    void setElementCustomWidget(const QList<DomCustomWidget*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomCustomWidget*> m_customWidget;
+    enum Child {
+        CustomWidget = 1
+    };
+
+    DomCustomWidgets(const DomCustomWidgets &other);
+    void operator = (const DomCustomWidgets&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomHeader {
+public:
+    DomHeader();
+    ~DomHeader();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeLocation() const { return m_has_attr_location; }
+    inline QString attributeLocation() const { return m_attr_location; }
+    inline void setAttributeLocation(const QString& a) { m_attr_location = a; m_has_attr_location = true; }
+    inline void clearAttributeLocation() { m_has_attr_location = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_location;
+    bool m_has_attr_location;
+
+    // child element data
+    uint m_children;
+
+    DomHeader(const DomHeader &other);
+    void operator = (const DomHeader&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomCustomWidget {
+public:
+    DomCustomWidget();
+    ~DomCustomWidget();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QString elementClass() const { return m_class; }
+    void setElementClass(const QString& a);
+    inline bool hasElementClass() const { return m_children & Class; }
+    void clearElementClass();
+
+    inline QString elementExtends() const { return m_extends; }
+    void setElementExtends(const QString& a);
+    inline bool hasElementExtends() const { return m_children & Extends; }
+    void clearElementExtends();
+
+    inline DomHeader* elementHeader() const { return m_header; }
+    DomHeader* takeElementHeader();
+    void setElementHeader(DomHeader* a);
+    inline bool hasElementHeader() const { return m_children & Header; }
+    void clearElementHeader();
+
+    inline DomSize* elementSizeHint() const { return m_sizeHint; }
+    DomSize* takeElementSizeHint();
+    void setElementSizeHint(DomSize* a);
+    inline bool hasElementSizeHint() const { return m_children & SizeHint; }
+    void clearElementSizeHint();
+
+    inline QString elementAddPageMethod() const { return m_addPageMethod; }
+    void setElementAddPageMethod(const QString& a);
+    inline bool hasElementAddPageMethod() const { return m_children & AddPageMethod; }
+    void clearElementAddPageMethod();
+
+    inline int elementContainer() const { return m_container; }
+    void setElementContainer(int a);
+    inline bool hasElementContainer() const { return m_children & Container; }
+    void clearElementContainer();
+
+    inline DomSizePolicyData* elementSizePolicy() const { return m_sizePolicy; }
+    DomSizePolicyData* takeElementSizePolicy();
+    void setElementSizePolicy(DomSizePolicyData* a);
+    inline bool hasElementSizePolicy() const { return m_children & SizePolicy; }
+    void clearElementSizePolicy();
+
+    inline QString elementPixmap() const { return m_pixmap; }
+    void setElementPixmap(const QString& a);
+    inline bool hasElementPixmap() const { return m_children & Pixmap; }
+    void clearElementPixmap();
+
+    inline DomScript* elementScript() const { return m_script; }
+    DomScript* takeElementScript();
+    void setElementScript(DomScript* a);
+    inline bool hasElementScript() const { return m_children & Script; }
+    void clearElementScript();
+
+    inline DomProperties* elementProperties() const { return m_properties; }
+    DomProperties* takeElementProperties();
+    void setElementProperties(DomProperties* a);
+    inline bool hasElementProperties() const { return m_children & Properties; }
+    void clearElementProperties();
+
+    inline DomSlots* elementSlots() const { return m_slots; }
+    DomSlots* takeElementSlots();
+    void setElementSlots(DomSlots* a);
+    inline bool hasElementSlots() const { return m_children & Slots; }
+    void clearElementSlots();
+
+    inline DomPropertySpecifications* elementPropertyspecifications() const { return m_propertyspecifications; }
+    DomPropertySpecifications* takeElementPropertyspecifications();
+    void setElementPropertyspecifications(DomPropertySpecifications* a);
+    inline bool hasElementPropertyspecifications() const { return m_children & Propertyspecifications; }
+    void clearElementPropertyspecifications();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QString m_class;
+    QString m_extends;
+    DomHeader* m_header;
+    DomSize* m_sizeHint;
+    QString m_addPageMethod;
+    int m_container;
+    DomSizePolicyData* m_sizePolicy;
+    QString m_pixmap;
+    DomScript* m_script;
+    DomProperties* m_properties;
+    DomSlots* m_slots;
+    DomPropertySpecifications* m_propertyspecifications;
+    enum Child {
+        Class = 1,
+        Extends = 2,
+        Header = 4,
+        SizeHint = 8,
+        AddPageMethod = 16,
+        Container = 32,
+        SizePolicy = 64,
+        Pixmap = 128,
+        Script = 256,
+        Properties = 512,
+        Slots = 1024,
+        Propertyspecifications = 2048
+    };
+
+    DomCustomWidget(const DomCustomWidget &other);
+    void operator = (const DomCustomWidget&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomProperties {
+public:
+    DomProperties();
+    ~DomProperties();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomPropertyData*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomPropertyData*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomPropertyData*> m_property;
+    enum Child {
+        Property = 1
+    };
+
+    DomProperties(const DomProperties &other);
+    void operator = (const DomProperties&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomPropertyData {
+public:
+    DomPropertyData();
+    ~DomPropertyData();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeType() const { return m_has_attr_type; }
+    inline QString attributeType() const { return m_attr_type; }
+    inline void setAttributeType(const QString& a) { m_attr_type = a; m_has_attr_type = true; }
+    inline void clearAttributeType() { m_has_attr_type = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_type;
+    bool m_has_attr_type;
+
+    // child element data
+    uint m_children;
+
+    DomPropertyData(const DomPropertyData &other);
+    void operator = (const DomPropertyData&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomSizePolicyData {
+public:
+    DomSizePolicyData();
+    ~DomSizePolicyData();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementHorData() const { return m_horData; }
+    void setElementHorData(int a);
+    inline bool hasElementHorData() const { return m_children & HorData; }
+    void clearElementHorData();
+
+    inline int elementVerData() const { return m_verData; }
+    void setElementVerData(int a);
+    inline bool hasElementVerData() const { return m_children & VerData; }
+    void clearElementVerData();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_horData;
+    int m_verData;
+    enum Child {
+        HorData = 1,
+        VerData = 2
+    };
+
+    DomSizePolicyData(const DomSizePolicyData &other);
+    void operator = (const DomSizePolicyData&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomLayoutDefault {
+public:
+    DomLayoutDefault();
+    ~DomLayoutDefault();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeSpacing() const { return m_has_attr_spacing; }
+    inline int attributeSpacing() const { return m_attr_spacing; }
+    inline void setAttributeSpacing(int a) { m_attr_spacing = a; m_has_attr_spacing = true; }
+    inline void clearAttributeSpacing() { m_has_attr_spacing = false; }
+
+    inline bool hasAttributeMargin() const { return m_has_attr_margin; }
+    inline int attributeMargin() const { return m_attr_margin; }
+    inline void setAttributeMargin(int a) { m_attr_margin = a; m_has_attr_margin = true; }
+    inline void clearAttributeMargin() { m_has_attr_margin = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    int m_attr_spacing;
+    bool m_has_attr_spacing;
+
+    int m_attr_margin;
+    bool m_has_attr_margin;
+
+    // child element data
+    uint m_children;
+
+    DomLayoutDefault(const DomLayoutDefault &other);
+    void operator = (const DomLayoutDefault&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomLayoutFunction {
+public:
+    DomLayoutFunction();
+    ~DomLayoutFunction();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeSpacing() const { return m_has_attr_spacing; }
+    inline QString attributeSpacing() const { return m_attr_spacing; }
+    inline void setAttributeSpacing(const QString& a) { m_attr_spacing = a; m_has_attr_spacing = true; }
+    inline void clearAttributeSpacing() { m_has_attr_spacing = false; }
+
+    inline bool hasAttributeMargin() const { return m_has_attr_margin; }
+    inline QString attributeMargin() const { return m_attr_margin; }
+    inline void setAttributeMargin(const QString& a) { m_attr_margin = a; m_has_attr_margin = true; }
+    inline void clearAttributeMargin() { m_has_attr_margin = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_spacing;
+    bool m_has_attr_spacing;
+
+    QString m_attr_margin;
+    bool m_has_attr_margin;
+
+    // child element data
+    uint m_children;
+
+    DomLayoutFunction(const DomLayoutFunction &other);
+    void operator = (const DomLayoutFunction&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomTabStops {
+public:
+    DomTabStops();
+    ~DomTabStops();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QStringList elementTabStop() const { return m_tabStop; }
+    void setElementTabStop(const QStringList& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QStringList m_tabStop;
+    enum Child {
+        TabStop = 1
+    };
+
+    DomTabStops(const DomTabStops &other);
+    void operator = (const DomTabStops&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomLayout {
+public:
+    DomLayout();
+    ~DomLayout();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeClass() const { return m_has_attr_class; }
+    inline QString attributeClass() const { return m_attr_class; }
+    inline void setAttributeClass(const QString& a) { m_attr_class = a; m_has_attr_class = true; }
+    inline void clearAttributeClass() { m_has_attr_class = false; }
+
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    inline bool hasAttributeStretch() const { return m_has_attr_stretch; }
+    inline QString attributeStretch() const { return m_attr_stretch; }
+    inline void setAttributeStretch(const QString& a) { m_attr_stretch = a; m_has_attr_stretch = true; }
+    inline void clearAttributeStretch() { m_has_attr_stretch = false; }
+
+    inline bool hasAttributeRowStretch() const { return m_has_attr_rowStretch; }
+    inline QString attributeRowStretch() const { return m_attr_rowStretch; }
+    inline void setAttributeRowStretch(const QString& a) { m_attr_rowStretch = a; m_has_attr_rowStretch = true; }
+    inline void clearAttributeRowStretch() { m_has_attr_rowStretch = false; }
+
+    inline bool hasAttributeColumnStretch() const { return m_has_attr_columnStretch; }
+    inline QString attributeColumnStretch() const { return m_attr_columnStretch; }
+    inline void setAttributeColumnStretch(const QString& a) { m_attr_columnStretch = a; m_has_attr_columnStretch = true; }
+    inline void clearAttributeColumnStretch() { m_has_attr_columnStretch = false; }
+
+    inline bool hasAttributeRowMinimumHeight() const { return m_has_attr_rowMinimumHeight; }
+    inline QString attributeRowMinimumHeight() const { return m_attr_rowMinimumHeight; }
+    inline void setAttributeRowMinimumHeight(const QString& a) { m_attr_rowMinimumHeight = a; m_has_attr_rowMinimumHeight = true; }
+    inline void clearAttributeRowMinimumHeight() { m_has_attr_rowMinimumHeight = false; }
+
+    inline bool hasAttributeColumnMinimumWidth() const { return m_has_attr_columnMinimumWidth; }
+    inline QString attributeColumnMinimumWidth() const { return m_attr_columnMinimumWidth; }
+    inline void setAttributeColumnMinimumWidth(const QString& a) { m_attr_columnMinimumWidth = a; m_has_attr_columnMinimumWidth = true; }
+    inline void clearAttributeColumnMinimumWidth() { m_has_attr_columnMinimumWidth = false; }
+
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+    inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
+    void setElementAttribute(const QList<DomProperty*>& a);
+
+    inline QList<DomLayoutItem*> elementItem() const { return m_item; }
+    void setElementItem(const QList<DomLayoutItem*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_class;
+    bool m_has_attr_class;
+
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    QString m_attr_stretch;
+    bool m_has_attr_stretch;
+
+    QString m_attr_rowStretch;
+    bool m_has_attr_rowStretch;
+
+    QString m_attr_columnStretch;
+    bool m_has_attr_columnStretch;
+
+    QString m_attr_rowMinimumHeight;
+    bool m_has_attr_rowMinimumHeight;
+
+    QString m_attr_columnMinimumWidth;
+    bool m_has_attr_columnMinimumWidth;
+
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    QList<DomProperty*> m_attribute;
+    QList<DomLayoutItem*> m_item;
+    enum Child {
+        Property = 1,
+        Attribute = 2,
+        Item = 4
+    };
+
+    DomLayout(const DomLayout &other);
+    void operator = (const DomLayout&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomLayoutItem {
+public:
+    DomLayoutItem();
+    ~DomLayoutItem();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeRow() const { return m_has_attr_row; }
+    inline int attributeRow() const { return m_attr_row; }
+    inline void setAttributeRow(int a) { m_attr_row = a; m_has_attr_row = true; }
+    inline void clearAttributeRow() { m_has_attr_row = false; }
+
+    inline bool hasAttributeColumn() const { return m_has_attr_column; }
+    inline int attributeColumn() const { return m_attr_column; }
+    inline void setAttributeColumn(int a) { m_attr_column = a; m_has_attr_column = true; }
+    inline void clearAttributeColumn() { m_has_attr_column = false; }
+
+    inline bool hasAttributeRowSpan() const { return m_has_attr_rowSpan; }
+    inline int attributeRowSpan() const { return m_attr_rowSpan; }
+    inline void setAttributeRowSpan(int a) { m_attr_rowSpan = a; m_has_attr_rowSpan = true; }
+    inline void clearAttributeRowSpan() { m_has_attr_rowSpan = false; }
+
+    inline bool hasAttributeColSpan() const { return m_has_attr_colSpan; }
+    inline int attributeColSpan() const { return m_attr_colSpan; }
+    inline void setAttributeColSpan(int a) { m_attr_colSpan = a; m_has_attr_colSpan = true; }
+    inline void clearAttributeColSpan() { m_has_attr_colSpan = false; }
+
+    inline bool hasAttributeAlignment() const { return m_has_attr_alignment; }
+    inline QString attributeAlignment() const { return m_attr_alignment; }
+    inline void setAttributeAlignment(const QString& a) { m_attr_alignment = a; m_has_attr_alignment = true; }
+    inline void clearAttributeAlignment() { m_has_attr_alignment = false; }
+
+    // child element accessors
+    enum Kind { Unknown = 0, Widget, Layout, Spacer };
+    inline Kind kind() const { return m_kind; }
+
+    inline DomWidget* elementWidget() const { return m_widget; }
+    DomWidget* takeElementWidget();
+    void setElementWidget(DomWidget* a);
+
+    inline DomLayout* elementLayout() const { return m_layout; }
+    DomLayout* takeElementLayout();
+    void setElementLayout(DomLayout* a);
+
+    inline DomSpacer* elementSpacer() const { return m_spacer; }
+    DomSpacer* takeElementSpacer();
+    void setElementSpacer(DomSpacer* a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    int m_attr_row;
+    bool m_has_attr_row;
+
+    int m_attr_column;
+    bool m_has_attr_column;
+
+    int m_attr_rowSpan;
+    bool m_has_attr_rowSpan;
+
+    int m_attr_colSpan;
+    bool m_has_attr_colSpan;
+
+    QString m_attr_alignment;
+    bool m_has_attr_alignment;
+
+    // child element data
+    Kind m_kind;
+    DomWidget* m_widget;
+    DomLayout* m_layout;
+    DomSpacer* m_spacer;
+
+    DomLayoutItem(const DomLayoutItem &other);
+    void operator = (const DomLayoutItem&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomRow {
+public:
+    DomRow();
+    ~DomRow();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    enum Child {
+        Property = 1
+    };
+
+    DomRow(const DomRow &other);
+    void operator = (const DomRow&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomColumn {
+public:
+    DomColumn();
+    ~DomColumn();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    enum Child {
+        Property = 1
+    };
+
+    DomColumn(const DomColumn &other);
+    void operator = (const DomColumn&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomItem {
+public:
+    DomItem();
+    ~DomItem();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeRow() const { return m_has_attr_row; }
+    inline int attributeRow() const { return m_attr_row; }
+    inline void setAttributeRow(int a) { m_attr_row = a; m_has_attr_row = true; }
+    inline void clearAttributeRow() { m_has_attr_row = false; }
+
+    inline bool hasAttributeColumn() const { return m_has_attr_column; }
+    inline int attributeColumn() const { return m_attr_column; }
+    inline void setAttributeColumn(int a) { m_attr_column = a; m_has_attr_column = true; }
+    inline void clearAttributeColumn() { m_has_attr_column = false; }
+
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+    inline QList<DomItem*> elementItem() const { return m_item; }
+    void setElementItem(const QList<DomItem*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    int m_attr_row;
+    bool m_has_attr_row;
+
+    int m_attr_column;
+    bool m_has_attr_column;
+
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    QList<DomItem*> m_item;
+    enum Child {
+        Property = 1,
+        Item = 2
+    };
+
+    DomItem(const DomItem &other);
+    void operator = (const DomItem&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomWidget {
+public:
+    DomWidget();
+    ~DomWidget();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeClass() const { return m_has_attr_class; }
+    inline QString attributeClass() const { return m_attr_class; }
+    inline void setAttributeClass(const QString& a) { m_attr_class = a; m_has_attr_class = true; }
+    inline void clearAttributeClass() { m_has_attr_class = false; }
+
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    inline bool hasAttributeNative() const { return m_has_attr_native; }
+    inline bool attributeNative() const { return m_attr_native; }
+    inline void setAttributeNative(bool a) { m_attr_native = a; m_has_attr_native = true; }
+    inline void clearAttributeNative() { m_has_attr_native = false; }
+
+    // child element accessors
+    inline QStringList elementClass() const { return m_class; }
+    void setElementClass(const QStringList& a);
+
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+    inline QList<DomScript*> elementScript() const { return m_script; }
+    void setElementScript(const QList<DomScript*>& a);
+
+    inline QList<DomWidgetData*> elementWidgetData() const { return m_widgetData; }
+    void setElementWidgetData(const QList<DomWidgetData*>& a);
+
+    inline QList<DomProperty*> elementAttribute() const { return m_attribute; }
+    void setElementAttribute(const QList<DomProperty*>& a);
+
+    inline QList<DomRow*> elementRow() const { return m_row; }
+    void setElementRow(const QList<DomRow*>& a);
+
+    inline QList<DomColumn*> elementColumn() const { return m_column; }
+    void setElementColumn(const QList<DomColumn*>& a);
+
+    inline QList<DomItem*> elementItem() const { return m_item; }
+    void setElementItem(const QList<DomItem*>& a);
+
+    inline QList<DomLayout*> elementLayout() const { return m_layout; }
+    void setElementLayout(const QList<DomLayout*>& a);
+
+    inline QList<DomWidget*> elementWidget() const { return m_widget; }
+    void setElementWidget(const QList<DomWidget*>& a);
+
+    inline QList<DomAction*> elementAction() const { return m_action; }
+    void setElementAction(const QList<DomAction*>& a);
+
+    inline QList<DomActionGroup*> elementActionGroup() const { return m_actionGroup; }
+    void setElementActionGroup(const QList<DomActionGroup*>& a);
+
+    inline QList<DomActionRef*> elementAddAction() const { return m_addAction; }
+    void setElementAddAction(const QList<DomActionRef*>& a);
+
+    inline QStringList elementZOrder() const { return m_zOrder; }
+    void setElementZOrder(const QStringList& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_class;
+    bool m_has_attr_class;
+
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    bool m_attr_native;
+    bool m_has_attr_native;
+
+    // child element data
+    uint m_children;
+    QStringList m_class;
+    QList<DomProperty*> m_property;
+    QList<DomScript*> m_script;
+    QList<DomWidgetData*> m_widgetData;
+    QList<DomProperty*> m_attribute;
+    QList<DomRow*> m_row;
+    QList<DomColumn*> m_column;
+    QList<DomItem*> m_item;
+    QList<DomLayout*> m_layout;
+    QList<DomWidget*> m_widget;
+    QList<DomAction*> m_action;
+    QList<DomActionGroup*> m_actionGroup;
+    QList<DomActionRef*> m_addAction;
+    QStringList m_zOrder;
+    enum Child {
+        Class = 1,
+        Property = 2,
+        Script = 4,
+        WidgetData = 8,
+        Attribute = 16,
+        Row = 32,
+        Column = 64,
+        Item = 128,
+        Layout = 256,
+        Widget = 512,
+        Action = 1024,
+        ActionGroup = 2048,
+        AddAction = 4096,
+        ZOrder = 8192
+    };
+
+    DomWidget(const DomWidget &other);
+    void operator = (const DomWidget&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomSpacer {
+public:
+    DomSpacer();
+    ~DomSpacer();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    enum Child {
+        Property = 1
+    };
+
+    DomSpacer(const DomSpacer &other);
+    void operator = (const DomSpacer&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomColor {
+public:
+    DomColor();
+    ~DomColor();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeAlpha() const { return m_has_attr_alpha; }
+    inline int attributeAlpha() const { return m_attr_alpha; }
+    inline void setAttributeAlpha(int a) { m_attr_alpha = a; m_has_attr_alpha = true; }
+    inline void clearAttributeAlpha() { m_has_attr_alpha = false; }
+
+    // child element accessors
+    inline int elementRed() const { return m_red; }
+    void setElementRed(int a);
+    inline bool hasElementRed() const { return m_children & Red; }
+    void clearElementRed();
+
+    inline int elementGreen() const { return m_green; }
+    void setElementGreen(int a);
+    inline bool hasElementGreen() const { return m_children & Green; }
+    void clearElementGreen();
+
+    inline int elementBlue() const { return m_blue; }
+    void setElementBlue(int a);
+    inline bool hasElementBlue() const { return m_children & Blue; }
+    void clearElementBlue();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    int m_attr_alpha;
+    bool m_has_attr_alpha;
+
+    // child element data
+    uint m_children;
+    int m_red;
+    int m_green;
+    int m_blue;
+    enum Child {
+        Red = 1,
+        Green = 2,
+        Blue = 4
+    };
+
+    DomColor(const DomColor &other);
+    void operator = (const DomColor&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomGradientStop {
+public:
+    DomGradientStop();
+    ~DomGradientStop();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributePosition() const { return m_has_attr_position; }
+    inline double attributePosition() const { return m_attr_position; }
+    inline void setAttributePosition(double a) { m_attr_position = a; m_has_attr_position = true; }
+    inline void clearAttributePosition() { m_has_attr_position = false; }
+
+    // child element accessors
+    inline DomColor* elementColor() const { return m_color; }
+    DomColor* takeElementColor();
+    void setElementColor(DomColor* a);
+    inline bool hasElementColor() const { return m_children & Color; }
+    void clearElementColor();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    double m_attr_position;
+    bool m_has_attr_position;
+
+    // child element data
+    uint m_children;
+    DomColor* m_color;
+    enum Child {
+        Color = 1
+    };
+
+    DomGradientStop(const DomGradientStop &other);
+    void operator = (const DomGradientStop&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomGradient {
+public:
+    DomGradient();
+    ~DomGradient();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeStartX() const { return m_has_attr_startX; }
+    inline double attributeStartX() const { return m_attr_startX; }
+    inline void setAttributeStartX(double a) { m_attr_startX = a; m_has_attr_startX = true; }
+    inline void clearAttributeStartX() { m_has_attr_startX = false; }
+
+    inline bool hasAttributeStartY() const { return m_has_attr_startY; }
+    inline double attributeStartY() const { return m_attr_startY; }
+    inline void setAttributeStartY(double a) { m_attr_startY = a; m_has_attr_startY = true; }
+    inline void clearAttributeStartY() { m_has_attr_startY = false; }
+
+    inline bool hasAttributeEndX() const { return m_has_attr_endX; }
+    inline double attributeEndX() const { return m_attr_endX; }
+    inline void setAttributeEndX(double a) { m_attr_endX = a; m_has_attr_endX = true; }
+    inline void clearAttributeEndX() { m_has_attr_endX = false; }
+
+    inline bool hasAttributeEndY() const { return m_has_attr_endY; }
+    inline double attributeEndY() const { return m_attr_endY; }
+    inline void setAttributeEndY(double a) { m_attr_endY = a; m_has_attr_endY = true; }
+    inline void clearAttributeEndY() { m_has_attr_endY = false; }
+
+    inline bool hasAttributeCentralX() const { return m_has_attr_centralX; }
+    inline double attributeCentralX() const { return m_attr_centralX; }
+    inline void setAttributeCentralX(double a) { m_attr_centralX = a; m_has_attr_centralX = true; }
+    inline void clearAttributeCentralX() { m_has_attr_centralX = false; }
+
+    inline bool hasAttributeCentralY() const { return m_has_attr_centralY; }
+    inline double attributeCentralY() const { return m_attr_centralY; }
+    inline void setAttributeCentralY(double a) { m_attr_centralY = a; m_has_attr_centralY = true; }
+    inline void clearAttributeCentralY() { m_has_attr_centralY = false; }
+
+    inline bool hasAttributeFocalX() const { return m_has_attr_focalX; }
+    inline double attributeFocalX() const { return m_attr_focalX; }
+    inline void setAttributeFocalX(double a) { m_attr_focalX = a; m_has_attr_focalX = true; }
+    inline void clearAttributeFocalX() { m_has_attr_focalX = false; }
+
+    inline bool hasAttributeFocalY() const { return m_has_attr_focalY; }
+    inline double attributeFocalY() const { return m_attr_focalY; }
+    inline void setAttributeFocalY(double a) { m_attr_focalY = a; m_has_attr_focalY = true; }
+    inline void clearAttributeFocalY() { m_has_attr_focalY = false; }
+
+    inline bool hasAttributeRadius() const { return m_has_attr_radius; }
+    inline double attributeRadius() const { return m_attr_radius; }
+    inline void setAttributeRadius(double a) { m_attr_radius = a; m_has_attr_radius = true; }
+    inline void clearAttributeRadius() { m_has_attr_radius = false; }
+
+    inline bool hasAttributeAngle() const { return m_has_attr_angle; }
+    inline double attributeAngle() const { return m_attr_angle; }
+    inline void setAttributeAngle(double a) { m_attr_angle = a; m_has_attr_angle = true; }
+    inline void clearAttributeAngle() { m_has_attr_angle = false; }
+
+    inline bool hasAttributeType() const { return m_has_attr_type; }
+    inline QString attributeType() const { return m_attr_type; }
+    inline void setAttributeType(const QString& a) { m_attr_type = a; m_has_attr_type = true; }
+    inline void clearAttributeType() { m_has_attr_type = false; }
+
+    inline bool hasAttributeSpread() const { return m_has_attr_spread; }
+    inline QString attributeSpread() const { return m_attr_spread; }
+    inline void setAttributeSpread(const QString& a) { m_attr_spread = a; m_has_attr_spread = true; }
+    inline void clearAttributeSpread() { m_has_attr_spread = false; }
+
+    inline bool hasAttributeCoordinateMode() const { return m_has_attr_coordinateMode; }
+    inline QString attributeCoordinateMode() const { return m_attr_coordinateMode; }
+    inline void setAttributeCoordinateMode(const QString& a) { m_attr_coordinateMode = a; m_has_attr_coordinateMode = true; }
+    inline void clearAttributeCoordinateMode() { m_has_attr_coordinateMode = false; }
+
+    // child element accessors
+    inline QList<DomGradientStop*> elementGradientStop() const { return m_gradientStop; }
+    void setElementGradientStop(const QList<DomGradientStop*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    double m_attr_startX;
+    bool m_has_attr_startX;
+
+    double m_attr_startY;
+    bool m_has_attr_startY;
+
+    double m_attr_endX;
+    bool m_has_attr_endX;
+
+    double m_attr_endY;
+    bool m_has_attr_endY;
+
+    double m_attr_centralX;
+    bool m_has_attr_centralX;
+
+    double m_attr_centralY;
+    bool m_has_attr_centralY;
+
+    double m_attr_focalX;
+    bool m_has_attr_focalX;
+
+    double m_attr_focalY;
+    bool m_has_attr_focalY;
+
+    double m_attr_radius;
+    bool m_has_attr_radius;
+
+    double m_attr_angle;
+    bool m_has_attr_angle;
+
+    QString m_attr_type;
+    bool m_has_attr_type;
+
+    QString m_attr_spread;
+    bool m_has_attr_spread;
+
+    QString m_attr_coordinateMode;
+    bool m_has_attr_coordinateMode;
+
+    // child element data
+    uint m_children;
+    QList<DomGradientStop*> m_gradientStop;
+    enum Child {
+        GradientStop = 1
+    };
+
+    DomGradient(const DomGradient &other);
+    void operator = (const DomGradient&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomBrush {
+public:
+    DomBrush();
+    ~DomBrush();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeBrushStyle() const { return m_has_attr_brushStyle; }
+    inline QString attributeBrushStyle() const { return m_attr_brushStyle; }
+    inline void setAttributeBrushStyle(const QString& a) { m_attr_brushStyle = a; m_has_attr_brushStyle = true; }
+    inline void clearAttributeBrushStyle() { m_has_attr_brushStyle = false; }
+
+    // child element accessors
+    enum Kind { Unknown = 0, Color, Texture, Gradient };
+    inline Kind kind() const { return m_kind; }
+
+    inline DomColor* elementColor() const { return m_color; }
+    DomColor* takeElementColor();
+    void setElementColor(DomColor* a);
+
+    inline DomProperty* elementTexture() const { return m_texture; }
+    DomProperty* takeElementTexture();
+    void setElementTexture(DomProperty* a);
+
+    inline DomGradient* elementGradient() const { return m_gradient; }
+    DomGradient* takeElementGradient();
+    void setElementGradient(DomGradient* a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_brushStyle;
+    bool m_has_attr_brushStyle;
+
+    // child element data
+    Kind m_kind;
+    DomColor* m_color;
+    DomProperty* m_texture;
+    DomGradient* m_gradient;
+
+    DomBrush(const DomBrush &other);
+    void operator = (const DomBrush&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomColorRole {
+public:
+    DomColorRole();
+    ~DomColorRole();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeRole() const { return m_has_attr_role; }
+    inline QString attributeRole() const { return m_attr_role; }
+    inline void setAttributeRole(const QString& a) { m_attr_role = a; m_has_attr_role = true; }
+    inline void clearAttributeRole() { m_has_attr_role = false; }
+
+    // child element accessors
+    inline DomBrush* elementBrush() const { return m_brush; }
+    DomBrush* takeElementBrush();
+    void setElementBrush(DomBrush* a);
+    inline bool hasElementBrush() const { return m_children & Brush; }
+    void clearElementBrush();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_role;
+    bool m_has_attr_role;
+
+    // child element data
+    uint m_children;
+    DomBrush* m_brush;
+    enum Child {
+        Brush = 1
+    };
+
+    DomColorRole(const DomColorRole &other);
+    void operator = (const DomColorRole&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomColorGroup {
+public:
+    DomColorGroup();
+    ~DomColorGroup();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomColorRole*> elementColorRole() const { return m_colorRole; }
+    void setElementColorRole(const QList<DomColorRole*>& a);
+
+    inline QList<DomColor*> elementColor() const { return m_color; }
+    void setElementColor(const QList<DomColor*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomColorRole*> m_colorRole;
+    QList<DomColor*> m_color;
+    enum Child {
+        ColorRole = 1,
+        Color = 2
+    };
+
+    DomColorGroup(const DomColorGroup &other);
+    void operator = (const DomColorGroup&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomPalette {
+public:
+    DomPalette();
+    ~DomPalette();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline DomColorGroup* elementActive() const { return m_active; }
+    DomColorGroup* takeElementActive();
+    void setElementActive(DomColorGroup* a);
+    inline bool hasElementActive() const { return m_children & Active; }
+    void clearElementActive();
+
+    inline DomColorGroup* elementInactive() const { return m_inactive; }
+    DomColorGroup* takeElementInactive();
+    void setElementInactive(DomColorGroup* a);
+    inline bool hasElementInactive() const { return m_children & Inactive; }
+    void clearElementInactive();
+
+    inline DomColorGroup* elementDisabled() const { return m_disabled; }
+    DomColorGroup* takeElementDisabled();
+    void setElementDisabled(DomColorGroup* a);
+    inline bool hasElementDisabled() const { return m_children & Disabled; }
+    void clearElementDisabled();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    DomColorGroup* m_active;
+    DomColorGroup* m_inactive;
+    DomColorGroup* m_disabled;
+    enum Child {
+        Active = 1,
+        Inactive = 2,
+        Disabled = 4
+    };
+
+    DomPalette(const DomPalette &other);
+    void operator = (const DomPalette&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomFont {
+public:
+    DomFont();
+    ~DomFont();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QString elementFamily() const { return m_family; }
+    void setElementFamily(const QString& a);
+    inline bool hasElementFamily() const { return m_children & Family; }
+    void clearElementFamily();
+
+    inline int elementPointSize() const { return m_pointSize; }
+    void setElementPointSize(int a);
+    inline bool hasElementPointSize() const { return m_children & PointSize; }
+    void clearElementPointSize();
+
+    inline int elementWeight() const { return m_weight; }
+    void setElementWeight(int a);
+    inline bool hasElementWeight() const { return m_children & Weight; }
+    void clearElementWeight();
+
+    inline bool elementItalic() const { return m_italic; }
+    void setElementItalic(bool a);
+    inline bool hasElementItalic() const { return m_children & Italic; }
+    void clearElementItalic();
+
+    inline bool elementBold() const { return m_bold; }
+    void setElementBold(bool a);
+    inline bool hasElementBold() const { return m_children & Bold; }
+    void clearElementBold();
+
+    inline bool elementUnderline() const { return m_underline; }
+    void setElementUnderline(bool a);
+    inline bool hasElementUnderline() const { return m_children & Underline; }
+    void clearElementUnderline();
+
+    inline bool elementStrikeOut() const { return m_strikeOut; }
+    void setElementStrikeOut(bool a);
+    inline bool hasElementStrikeOut() const { return m_children & StrikeOut; }
+    void clearElementStrikeOut();
+
+    inline bool elementAntialiasing() const { return m_antialiasing; }
+    void setElementAntialiasing(bool a);
+    inline bool hasElementAntialiasing() const { return m_children & Antialiasing; }
+    void clearElementAntialiasing();
+
+    inline QString elementStyleStrategy() const { return m_styleStrategy; }
+    void setElementStyleStrategy(const QString& a);
+    inline bool hasElementStyleStrategy() const { return m_children & StyleStrategy; }
+    void clearElementStyleStrategy();
+
+    inline bool elementKerning() const { return m_kerning; }
+    void setElementKerning(bool a);
+    inline bool hasElementKerning() const { return m_children & Kerning; }
+    void clearElementKerning();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QString m_family;
+    int m_pointSize;
+    int m_weight;
+    bool m_italic;
+    bool m_bold;
+    bool m_underline;
+    bool m_strikeOut;
+    bool m_antialiasing;
+    QString m_styleStrategy;
+    bool m_kerning;
+    enum Child {
+        Family = 1,
+        PointSize = 2,
+        Weight = 4,
+        Italic = 8,
+        Bold = 16,
+        Underline = 32,
+        StrikeOut = 64,
+        Antialiasing = 128,
+        StyleStrategy = 256,
+        Kerning = 512
+    };
+
+    DomFont(const DomFont &other);
+    void operator = (const DomFont&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomPoint {
+public:
+    DomPoint();
+    ~DomPoint();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementX() const { return m_x; }
+    void setElementX(int a);
+    inline bool hasElementX() const { return m_children & X; }
+    void clearElementX();
+
+    inline int elementY() const { return m_y; }
+    void setElementY(int a);
+    inline bool hasElementY() const { return m_children & Y; }
+    void clearElementY();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_x;
+    int m_y;
+    enum Child {
+        X = 1,
+        Y = 2
+    };
+
+    DomPoint(const DomPoint &other);
+    void operator = (const DomPoint&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomRect {
+public:
+    DomRect();
+    ~DomRect();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementX() const { return m_x; }
+    void setElementX(int a);
+    inline bool hasElementX() const { return m_children & X; }
+    void clearElementX();
+
+    inline int elementY() const { return m_y; }
+    void setElementY(int a);
+    inline bool hasElementY() const { return m_children & Y; }
+    void clearElementY();
+
+    inline int elementWidth() const { return m_width; }
+    void setElementWidth(int a);
+    inline bool hasElementWidth() const { return m_children & Width; }
+    void clearElementWidth();
+
+    inline int elementHeight() const { return m_height; }
+    void setElementHeight(int a);
+    inline bool hasElementHeight() const { return m_children & Height; }
+    void clearElementHeight();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_x;
+    int m_y;
+    int m_width;
+    int m_height;
+    enum Child {
+        X = 1,
+        Y = 2,
+        Width = 4,
+        Height = 8
+    };
+
+    DomRect(const DomRect &other);
+    void operator = (const DomRect&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomLocale {
+public:
+    DomLocale();
+    ~DomLocale();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeLanguage() const { return m_has_attr_language; }
+    inline QString attributeLanguage() const { return m_attr_language; }
+    inline void setAttributeLanguage(const QString& a) { m_attr_language = a; m_has_attr_language = true; }
+    inline void clearAttributeLanguage() { m_has_attr_language = false; }
+
+    inline bool hasAttributeCountry() const { return m_has_attr_country; }
+    inline QString attributeCountry() const { return m_attr_country; }
+    inline void setAttributeCountry(const QString& a) { m_attr_country = a; m_has_attr_country = true; }
+    inline void clearAttributeCountry() { m_has_attr_country = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_language;
+    bool m_has_attr_language;
+
+    QString m_attr_country;
+    bool m_has_attr_country;
+
+    // child element data
+    uint m_children;
+
+    DomLocale(const DomLocale &other);
+    void operator = (const DomLocale&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomSizePolicy {
+public:
+    DomSizePolicy();
+    ~DomSizePolicy();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeHSizeType() const { return m_has_attr_hSizeType; }
+    inline QString attributeHSizeType() const { return m_attr_hSizeType; }
+    inline void setAttributeHSizeType(const QString& a) { m_attr_hSizeType = a; m_has_attr_hSizeType = true; }
+    inline void clearAttributeHSizeType() { m_has_attr_hSizeType = false; }
+
+    inline bool hasAttributeVSizeType() const { return m_has_attr_vSizeType; }
+    inline QString attributeVSizeType() const { return m_attr_vSizeType; }
+    inline void setAttributeVSizeType(const QString& a) { m_attr_vSizeType = a; m_has_attr_vSizeType = true; }
+    inline void clearAttributeVSizeType() { m_has_attr_vSizeType = false; }
+
+    // child element accessors
+    inline int elementHSizeType() const { return m_hSizeType; }
+    void setElementHSizeType(int a);
+    inline bool hasElementHSizeType() const { return m_children & HSizeType; }
+    void clearElementHSizeType();
+
+    inline int elementVSizeType() const { return m_vSizeType; }
+    void setElementVSizeType(int a);
+    inline bool hasElementVSizeType() const { return m_children & VSizeType; }
+    void clearElementVSizeType();
+
+    inline int elementHorStretch() const { return m_horStretch; }
+    void setElementHorStretch(int a);
+    inline bool hasElementHorStretch() const { return m_children & HorStretch; }
+    void clearElementHorStretch();
+
+    inline int elementVerStretch() const { return m_verStretch; }
+    void setElementVerStretch(int a);
+    inline bool hasElementVerStretch() const { return m_children & VerStretch; }
+    void clearElementVerStretch();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_hSizeType;
+    bool m_has_attr_hSizeType;
+
+    QString m_attr_vSizeType;
+    bool m_has_attr_vSizeType;
+
+    // child element data
+    uint m_children;
+    int m_hSizeType;
+    int m_vSizeType;
+    int m_horStretch;
+    int m_verStretch;
+    enum Child {
+        HSizeType = 1,
+        VSizeType = 2,
+        HorStretch = 4,
+        VerStretch = 8
+    };
+
+    DomSizePolicy(const DomSizePolicy &other);
+    void operator = (const DomSizePolicy&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomSize {
+public:
+    DomSize();
+    ~DomSize();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementWidth() const { return m_width; }
+    void setElementWidth(int a);
+    inline bool hasElementWidth() const { return m_children & Width; }
+    void clearElementWidth();
+
+    inline int elementHeight() const { return m_height; }
+    void setElementHeight(int a);
+    inline bool hasElementHeight() const { return m_children & Height; }
+    void clearElementHeight();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_width;
+    int m_height;
+    enum Child {
+        Width = 1,
+        Height = 2
+    };
+
+    DomSize(const DomSize &other);
+    void operator = (const DomSize&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomDate {
+public:
+    DomDate();
+    ~DomDate();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementYear() const { return m_year; }
+    void setElementYear(int a);
+    inline bool hasElementYear() const { return m_children & Year; }
+    void clearElementYear();
+
+    inline int elementMonth() const { return m_month; }
+    void setElementMonth(int a);
+    inline bool hasElementMonth() const { return m_children & Month; }
+    void clearElementMonth();
+
+    inline int elementDay() const { return m_day; }
+    void setElementDay(int a);
+    inline bool hasElementDay() const { return m_children & Day; }
+    void clearElementDay();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_year;
+    int m_month;
+    int m_day;
+    enum Child {
+        Year = 1,
+        Month = 2,
+        Day = 4
+    };
+
+    DomDate(const DomDate &other);
+    void operator = (const DomDate&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomTime {
+public:
+    DomTime();
+    ~DomTime();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementHour() const { return m_hour; }
+    void setElementHour(int a);
+    inline bool hasElementHour() const { return m_children & Hour; }
+    void clearElementHour();
+
+    inline int elementMinute() const { return m_minute; }
+    void setElementMinute(int a);
+    inline bool hasElementMinute() const { return m_children & Minute; }
+    void clearElementMinute();
+
+    inline int elementSecond() const { return m_second; }
+    void setElementSecond(int a);
+    inline bool hasElementSecond() const { return m_children & Second; }
+    void clearElementSecond();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_hour;
+    int m_minute;
+    int m_second;
+    enum Child {
+        Hour = 1,
+        Minute = 2,
+        Second = 4
+    };
+
+    DomTime(const DomTime &other);
+    void operator = (const DomTime&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomDateTime {
+public:
+    DomDateTime();
+    ~DomDateTime();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementHour() const { return m_hour; }
+    void setElementHour(int a);
+    inline bool hasElementHour() const { return m_children & Hour; }
+    void clearElementHour();
+
+    inline int elementMinute() const { return m_minute; }
+    void setElementMinute(int a);
+    inline bool hasElementMinute() const { return m_children & Minute; }
+    void clearElementMinute();
+
+    inline int elementSecond() const { return m_second; }
+    void setElementSecond(int a);
+    inline bool hasElementSecond() const { return m_children & Second; }
+    void clearElementSecond();
+
+    inline int elementYear() const { return m_year; }
+    void setElementYear(int a);
+    inline bool hasElementYear() const { return m_children & Year; }
+    void clearElementYear();
+
+    inline int elementMonth() const { return m_month; }
+    void setElementMonth(int a);
+    inline bool hasElementMonth() const { return m_children & Month; }
+    void clearElementMonth();
+
+    inline int elementDay() const { return m_day; }
+    void setElementDay(int a);
+    inline bool hasElementDay() const { return m_children & Day; }
+    void clearElementDay();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_hour;
+    int m_minute;
+    int m_second;
+    int m_year;
+    int m_month;
+    int m_day;
+    enum Child {
+        Hour = 1,
+        Minute = 2,
+        Second = 4,
+        Year = 8,
+        Month = 16,
+        Day = 32
+    };
+
+    DomDateTime(const DomDateTime &other);
+    void operator = (const DomDateTime&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomStringList {
+public:
+    DomStringList();
+    ~DomStringList();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeNotr() const { return m_has_attr_notr; }
+    inline QString attributeNotr() const { return m_attr_notr; }
+    inline void setAttributeNotr(const QString& a) { m_attr_notr = a; m_has_attr_notr = true; }
+    inline void clearAttributeNotr() { m_has_attr_notr = false; }
+
+    inline bool hasAttributeComment() const { return m_has_attr_comment; }
+    inline QString attributeComment() const { return m_attr_comment; }
+    inline void setAttributeComment(const QString& a) { m_attr_comment = a; m_has_attr_comment = true; }
+    inline void clearAttributeComment() { m_has_attr_comment = false; }
+
+    inline bool hasAttributeExtraComment() const { return m_has_attr_extraComment; }
+    inline QString attributeExtraComment() const { return m_attr_extraComment; }
+    inline void setAttributeExtraComment(const QString& a) { m_attr_extraComment = a; m_has_attr_extraComment = true; }
+    inline void clearAttributeExtraComment() { m_has_attr_extraComment = false; }
+
+    // child element accessors
+    inline QStringList elementString() const { return m_string; }
+    void setElementString(const QStringList& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_notr;
+    bool m_has_attr_notr;
+
+    QString m_attr_comment;
+    bool m_has_attr_comment;
+
+    QString m_attr_extraComment;
+    bool m_has_attr_extraComment;
+
+    // child element data
+    uint m_children;
+    QStringList m_string;
+    enum Child {
+        String = 1
+    };
+
+    DomStringList(const DomStringList &other);
+    void operator = (const DomStringList&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomResourcePixmap {
+public:
+    DomResourcePixmap();
+    ~DomResourcePixmap();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeResource() const { return m_has_attr_resource; }
+    inline QString attributeResource() const { return m_attr_resource; }
+    inline void setAttributeResource(const QString& a) { m_attr_resource = a; m_has_attr_resource = true; }
+    inline void clearAttributeResource() { m_has_attr_resource = false; }
+
+    inline bool hasAttributeAlias() const { return m_has_attr_alias; }
+    inline QString attributeAlias() const { return m_attr_alias; }
+    inline void setAttributeAlias(const QString& a) { m_attr_alias = a; m_has_attr_alias = true; }
+    inline void clearAttributeAlias() { m_has_attr_alias = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_resource;
+    bool m_has_attr_resource;
+
+    QString m_attr_alias;
+    bool m_has_attr_alias;
+
+    // child element data
+    uint m_children;
+
+    DomResourcePixmap(const DomResourcePixmap &other);
+    void operator = (const DomResourcePixmap&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomResourceIcon {
+public:
+    DomResourceIcon();
+    ~DomResourceIcon();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeTheme() const { return m_has_attr_theme; }
+    inline QString attributeTheme() const { return m_attr_theme; }
+    inline void setAttributeTheme(const QString& a) { m_attr_theme = a; m_has_attr_theme = true; }
+    inline void clearAttributeTheme() { m_has_attr_theme = false; }
+
+    inline bool hasAttributeResource() const { return m_has_attr_resource; }
+    inline QString attributeResource() const { return m_attr_resource; }
+    inline void setAttributeResource(const QString& a) { m_attr_resource = a; m_has_attr_resource = true; }
+    inline void clearAttributeResource() { m_has_attr_resource = false; }
+
+    // child element accessors
+    inline DomResourcePixmap* elementNormalOff() const { return m_normalOff; }
+    DomResourcePixmap* takeElementNormalOff();
+    void setElementNormalOff(DomResourcePixmap* a);
+    inline bool hasElementNormalOff() const { return m_children & NormalOff; }
+    void clearElementNormalOff();
+
+    inline DomResourcePixmap* elementNormalOn() const { return m_normalOn; }
+    DomResourcePixmap* takeElementNormalOn();
+    void setElementNormalOn(DomResourcePixmap* a);
+    inline bool hasElementNormalOn() const { return m_children & NormalOn; }
+    void clearElementNormalOn();
+
+    inline DomResourcePixmap* elementDisabledOff() const { return m_disabledOff; }
+    DomResourcePixmap* takeElementDisabledOff();
+    void setElementDisabledOff(DomResourcePixmap* a);
+    inline bool hasElementDisabledOff() const { return m_children & DisabledOff; }
+    void clearElementDisabledOff();
+
+    inline DomResourcePixmap* elementDisabledOn() const { return m_disabledOn; }
+    DomResourcePixmap* takeElementDisabledOn();
+    void setElementDisabledOn(DomResourcePixmap* a);
+    inline bool hasElementDisabledOn() const { return m_children & DisabledOn; }
+    void clearElementDisabledOn();
+
+    inline DomResourcePixmap* elementActiveOff() const { return m_activeOff; }
+    DomResourcePixmap* takeElementActiveOff();
+    void setElementActiveOff(DomResourcePixmap* a);
+    inline bool hasElementActiveOff() const { return m_children & ActiveOff; }
+    void clearElementActiveOff();
+
+    inline DomResourcePixmap* elementActiveOn() const { return m_activeOn; }
+    DomResourcePixmap* takeElementActiveOn();
+    void setElementActiveOn(DomResourcePixmap* a);
+    inline bool hasElementActiveOn() const { return m_children & ActiveOn; }
+    void clearElementActiveOn();
+
+    inline DomResourcePixmap* elementSelectedOff() const { return m_selectedOff; }
+    DomResourcePixmap* takeElementSelectedOff();
+    void setElementSelectedOff(DomResourcePixmap* a);
+    inline bool hasElementSelectedOff() const { return m_children & SelectedOff; }
+    void clearElementSelectedOff();
+
+    inline DomResourcePixmap* elementSelectedOn() const { return m_selectedOn; }
+    DomResourcePixmap* takeElementSelectedOn();
+    void setElementSelectedOn(DomResourcePixmap* a);
+    inline bool hasElementSelectedOn() const { return m_children & SelectedOn; }
+    void clearElementSelectedOn();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_theme;
+    bool m_has_attr_theme;
+
+    QString m_attr_resource;
+    bool m_has_attr_resource;
+
+    // child element data
+    uint m_children;
+    DomResourcePixmap* m_normalOff;
+    DomResourcePixmap* m_normalOn;
+    DomResourcePixmap* m_disabledOff;
+    DomResourcePixmap* m_disabledOn;
+    DomResourcePixmap* m_activeOff;
+    DomResourcePixmap* m_activeOn;
+    DomResourcePixmap* m_selectedOff;
+    DomResourcePixmap* m_selectedOn;
+    enum Child {
+        NormalOff = 1,
+        NormalOn = 2,
+        DisabledOff = 4,
+        DisabledOn = 8,
+        ActiveOff = 16,
+        ActiveOn = 32,
+        SelectedOff = 64,
+        SelectedOn = 128
+    };
+
+    DomResourceIcon(const DomResourceIcon &other);
+    void operator = (const DomResourceIcon&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomString {
+public:
+    DomString();
+    ~DomString();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeNotr() const { return m_has_attr_notr; }
+    inline QString attributeNotr() const { return m_attr_notr; }
+    inline void setAttributeNotr(const QString& a) { m_attr_notr = a; m_has_attr_notr = true; }
+    inline void clearAttributeNotr() { m_has_attr_notr = false; }
+
+    inline bool hasAttributeComment() const { return m_has_attr_comment; }
+    inline QString attributeComment() const { return m_attr_comment; }
+    inline void setAttributeComment(const QString& a) { m_attr_comment = a; m_has_attr_comment = true; }
+    inline void clearAttributeComment() { m_has_attr_comment = false; }
+
+    inline bool hasAttributeExtraComment() const { return m_has_attr_extraComment; }
+    inline QString attributeExtraComment() const { return m_attr_extraComment; }
+    inline void setAttributeExtraComment(const QString& a) { m_attr_extraComment = a; m_has_attr_extraComment = true; }
+    inline void clearAttributeExtraComment() { m_has_attr_extraComment = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_notr;
+    bool m_has_attr_notr;
+
+    QString m_attr_comment;
+    bool m_has_attr_comment;
+
+    QString m_attr_extraComment;
+    bool m_has_attr_extraComment;
+
+    // child element data
+    uint m_children;
+
+    DomString(const DomString &other);
+    void operator = (const DomString&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomPointF {
+public:
+    DomPointF();
+    ~DomPointF();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline double elementX() const { return m_x; }
+    void setElementX(double a);
+    inline bool hasElementX() const { return m_children & X; }
+    void clearElementX();
+
+    inline double elementY() const { return m_y; }
+    void setElementY(double a);
+    inline bool hasElementY() const { return m_children & Y; }
+    void clearElementY();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    double m_x;
+    double m_y;
+    enum Child {
+        X = 1,
+        Y = 2
+    };
+
+    DomPointF(const DomPointF &other);
+    void operator = (const DomPointF&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomRectF {
+public:
+    DomRectF();
+    ~DomRectF();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline double elementX() const { return m_x; }
+    void setElementX(double a);
+    inline bool hasElementX() const { return m_children & X; }
+    void clearElementX();
+
+    inline double elementY() const { return m_y; }
+    void setElementY(double a);
+    inline bool hasElementY() const { return m_children & Y; }
+    void clearElementY();
+
+    inline double elementWidth() const { return m_width; }
+    void setElementWidth(double a);
+    inline bool hasElementWidth() const { return m_children & Width; }
+    void clearElementWidth();
+
+    inline double elementHeight() const { return m_height; }
+    void setElementHeight(double a);
+    inline bool hasElementHeight() const { return m_children & Height; }
+    void clearElementHeight();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    double m_x;
+    double m_y;
+    double m_width;
+    double m_height;
+    enum Child {
+        X = 1,
+        Y = 2,
+        Width = 4,
+        Height = 8
+    };
+
+    DomRectF(const DomRectF &other);
+    void operator = (const DomRectF&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomSizeF {
+public:
+    DomSizeF();
+    ~DomSizeF();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline double elementWidth() const { return m_width; }
+    void setElementWidth(double a);
+    inline bool hasElementWidth() const { return m_children & Width; }
+    void clearElementWidth();
+
+    inline double elementHeight() const { return m_height; }
+    void setElementHeight(double a);
+    inline bool hasElementHeight() const { return m_children & Height; }
+    void clearElementHeight();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    double m_width;
+    double m_height;
+    enum Child {
+        Width = 1,
+        Height = 2
+    };
+
+    DomSizeF(const DomSizeF &other);
+    void operator = (const DomSizeF&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomChar {
+public:
+    DomChar();
+    ~DomChar();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline int elementUnicode() const { return m_unicode; }
+    void setElementUnicode(int a);
+    inline bool hasElementUnicode() const { return m_children & Unicode; }
+    void clearElementUnicode();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    int m_unicode;
+    enum Child {
+        Unicode = 1
+    };
+
+    DomChar(const DomChar &other);
+    void operator = (const DomChar&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomUrl {
+public:
+    DomUrl();
+    ~DomUrl();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline DomString* elementString() const { return m_string; }
+    DomString* takeElementString();
+    void setElementString(DomString* a);
+    inline bool hasElementString() const { return m_children & String; }
+    void clearElementString();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    DomString* m_string;
+    enum Child {
+        String = 1
+    };
+
+    DomUrl(const DomUrl &other);
+    void operator = (const DomUrl&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomProperty {
+public:
+    DomProperty();
+    ~DomProperty();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    inline bool hasAttributeStdset() const { return m_has_attr_stdset; }
+    inline int attributeStdset() const { return m_attr_stdset; }
+    inline void setAttributeStdset(int a) { m_attr_stdset = a; m_has_attr_stdset = true; }
+    inline void clearAttributeStdset() { m_has_attr_stdset = false; }
+
+    // child element accessors
+    enum Kind { Unknown = 0, Bool, Color, Cstring, Cursor, CursorShape, Enum, Font, IconSet, Pixmap, Palette, Point, Rect, Set, Locale, SizePolicy, Size, String, StringList, Number, Float, Double, Date, Time, DateTime, PointF, RectF, SizeF, LongLong, Char, Url, UInt, ULongLong, Brush };
+    inline Kind kind() const { return m_kind; }
+
+    inline QString elementBool() const { return m_bool; }
+    void setElementBool(const QString& a);
+
+    inline DomColor* elementColor() const { return m_color; }
+    DomColor* takeElementColor();
+    void setElementColor(DomColor* a);
+
+    inline QString elementCstring() const { return m_cstring; }
+    void setElementCstring(const QString& a);
+
+    inline int elementCursor() const { return m_cursor; }
+    void setElementCursor(int a);
+
+    inline QString elementCursorShape() const { return m_cursorShape; }
+    void setElementCursorShape(const QString& a);
+
+    inline QString elementEnum() const { return m_enum; }
+    void setElementEnum(const QString& a);
+
+    inline DomFont* elementFont() const { return m_font; }
+    DomFont* takeElementFont();
+    void setElementFont(DomFont* a);
+
+    inline DomResourceIcon* elementIconSet() const { return m_iconSet; }
+    DomResourceIcon* takeElementIconSet();
+    void setElementIconSet(DomResourceIcon* a);
+
+    inline DomResourcePixmap* elementPixmap() const { return m_pixmap; }
+    DomResourcePixmap* takeElementPixmap();
+    void setElementPixmap(DomResourcePixmap* a);
+
+    inline DomPalette* elementPalette() const { return m_palette; }
+    DomPalette* takeElementPalette();
+    void setElementPalette(DomPalette* a);
+
+    inline DomPoint* elementPoint() const { return m_point; }
+    DomPoint* takeElementPoint();
+    void setElementPoint(DomPoint* a);
+
+    inline DomRect* elementRect() const { return m_rect; }
+    DomRect* takeElementRect();
+    void setElementRect(DomRect* a);
+
+    inline QString elementSet() const { return m_set; }
+    void setElementSet(const QString& a);
+
+    inline DomLocale* elementLocale() const { return m_locale; }
+    DomLocale* takeElementLocale();
+    void setElementLocale(DomLocale* a);
+
+    inline DomSizePolicy* elementSizePolicy() const { return m_sizePolicy; }
+    DomSizePolicy* takeElementSizePolicy();
+    void setElementSizePolicy(DomSizePolicy* a);
+
+    inline DomSize* elementSize() const { return m_size; }
+    DomSize* takeElementSize();
+    void setElementSize(DomSize* a);
+
+    inline DomString* elementString() const { return m_string; }
+    DomString* takeElementString();
+    void setElementString(DomString* a);
+
+    inline DomStringList* elementStringList() const { return m_stringList; }
+    DomStringList* takeElementStringList();
+    void setElementStringList(DomStringList* a);
+
+    inline int elementNumber() const { return m_number; }
+    void setElementNumber(int a);
+
+    inline float elementFloat() const { return m_float; }
+    void setElementFloat(float a);
+
+    inline double elementDouble() const { return m_double; }
+    void setElementDouble(double a);
+
+    inline DomDate* elementDate() const { return m_date; }
+    DomDate* takeElementDate();
+    void setElementDate(DomDate* a);
+
+    inline DomTime* elementTime() const { return m_time; }
+    DomTime* takeElementTime();
+    void setElementTime(DomTime* a);
+
+    inline DomDateTime* elementDateTime() const { return m_dateTime; }
+    DomDateTime* takeElementDateTime();
+    void setElementDateTime(DomDateTime* a);
+
+    inline DomPointF* elementPointF() const { return m_pointF; }
+    DomPointF* takeElementPointF();
+    void setElementPointF(DomPointF* a);
+
+    inline DomRectF* elementRectF() const { return m_rectF; }
+    DomRectF* takeElementRectF();
+    void setElementRectF(DomRectF* a);
+
+    inline DomSizeF* elementSizeF() const { return m_sizeF; }
+    DomSizeF* takeElementSizeF();
+    void setElementSizeF(DomSizeF* a);
+
+    inline qlonglong elementLongLong() const { return m_longLong; }
+    void setElementLongLong(qlonglong a);
+
+    inline DomChar* elementChar() const { return m_char; }
+    DomChar* takeElementChar();
+    void setElementChar(DomChar* a);
+
+    inline DomUrl* elementUrl() const { return m_url; }
+    DomUrl* takeElementUrl();
+    void setElementUrl(DomUrl* a);
+
+    inline uint elementUInt() const { return m_UInt; }
+    void setElementUInt(uint a);
+
+    inline qulonglong elementULongLong() const { return m_uLongLong; }
+    void setElementULongLong(qulonglong a);
+
+    inline DomBrush* elementBrush() const { return m_brush; }
+    DomBrush* takeElementBrush();
+    void setElementBrush(DomBrush* a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    int m_attr_stdset;
+    bool m_has_attr_stdset;
+
+    // child element data
+    Kind m_kind;
+    QString m_bool;
+    DomColor* m_color;
+    QString m_cstring;
+    int m_cursor;
+    QString m_cursorShape;
+    QString m_enum;
+    DomFont* m_font;
+    DomResourceIcon* m_iconSet;
+    DomResourcePixmap* m_pixmap;
+    DomPalette* m_palette;
+    DomPoint* m_point;
+    DomRect* m_rect;
+    QString m_set;
+    DomLocale* m_locale;
+    DomSizePolicy* m_sizePolicy;
+    DomSize* m_size;
+    DomString* m_string;
+    DomStringList* m_stringList;
+    int m_number;
+    float m_float;
+    double m_double;
+    DomDate* m_date;
+    DomTime* m_time;
+    DomDateTime* m_dateTime;
+    DomPointF* m_pointF;
+    DomRectF* m_rectF;
+    DomSizeF* m_sizeF;
+    qlonglong m_longLong;
+    DomChar* m_char;
+    DomUrl* m_url;
+    uint m_UInt;
+    qulonglong m_uLongLong;
+    DomBrush* m_brush;
+
+    DomProperty(const DomProperty &other);
+    void operator = (const DomProperty&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomConnections {
+public:
+    DomConnections();
+    ~DomConnections();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomConnection*> elementConnection() const { return m_connection; }
+    void setElementConnection(const QList<DomConnection*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomConnection*> m_connection;
+    enum Child {
+        Connection = 1
+    };
+
+    DomConnections(const DomConnections &other);
+    void operator = (const DomConnections&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomConnection {
+public:
+    DomConnection();
+    ~DomConnection();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QString elementSender() const { return m_sender; }
+    void setElementSender(const QString& a);
+    inline bool hasElementSender() const { return m_children & Sender; }
+    void clearElementSender();
+
+    inline QString elementSignal() const { return m_signal; }
+    void setElementSignal(const QString& a);
+    inline bool hasElementSignal() const { return m_children & Signal; }
+    void clearElementSignal();
+
+    inline QString elementReceiver() const { return m_receiver; }
+    void setElementReceiver(const QString& a);
+    inline bool hasElementReceiver() const { return m_children & Receiver; }
+    void clearElementReceiver();
+
+    inline QString elementSlot() const { return m_slot; }
+    void setElementSlot(const QString& a);
+    inline bool hasElementSlot() const { return m_children & Slot; }
+    void clearElementSlot();
+
+    inline DomConnectionHints* elementHints() const { return m_hints; }
+    DomConnectionHints* takeElementHints();
+    void setElementHints(DomConnectionHints* a);
+    inline bool hasElementHints() const { return m_children & Hints; }
+    void clearElementHints();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QString m_sender;
+    QString m_signal;
+    QString m_receiver;
+    QString m_slot;
+    DomConnectionHints* m_hints;
+    enum Child {
+        Sender = 1,
+        Signal = 2,
+        Receiver = 4,
+        Slot = 8,
+        Hints = 16
+    };
+
+    DomConnection(const DomConnection &other);
+    void operator = (const DomConnection&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomConnectionHints {
+public:
+    DomConnectionHints();
+    ~DomConnectionHints();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomConnectionHint*> elementHint() const { return m_hint; }
+    void setElementHint(const QList<DomConnectionHint*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomConnectionHint*> m_hint;
+    enum Child {
+        Hint = 1
+    };
+
+    DomConnectionHints(const DomConnectionHints &other);
+    void operator = (const DomConnectionHints&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomConnectionHint {
+public:
+    DomConnectionHint();
+    ~DomConnectionHint();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeType() const { return m_has_attr_type; }
+    inline QString attributeType() const { return m_attr_type; }
+    inline void setAttributeType(const QString& a) { m_attr_type = a; m_has_attr_type = true; }
+    inline void clearAttributeType() { m_has_attr_type = false; }
+
+    // child element accessors
+    inline int elementX() const { return m_x; }
+    void setElementX(int a);
+    inline bool hasElementX() const { return m_children & X; }
+    void clearElementX();
+
+    inline int elementY() const { return m_y; }
+    void setElementY(int a);
+    inline bool hasElementY() const { return m_children & Y; }
+    void clearElementY();
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_type;
+    bool m_has_attr_type;
+
+    // child element data
+    uint m_children;
+    int m_x;
+    int m_y;
+    enum Child {
+        X = 1,
+        Y = 2
+    };
+
+    DomConnectionHint(const DomConnectionHint &other);
+    void operator = (const DomConnectionHint&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomScript {
+public:
+    DomScript();
+    ~DomScript();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeSource() const { return m_has_attr_source; }
+    inline QString attributeSource() const { return m_attr_source; }
+    inline void setAttributeSource(const QString& a) { m_attr_source = a; m_has_attr_source = true; }
+    inline void clearAttributeSource() { m_has_attr_source = false; }
+
+    inline bool hasAttributeLanguage() const { return m_has_attr_language; }
+    inline QString attributeLanguage() const { return m_attr_language; }
+    inline void setAttributeLanguage(const QString& a) { m_attr_language = a; m_has_attr_language = true; }
+    inline void clearAttributeLanguage() { m_has_attr_language = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_source;
+    bool m_has_attr_source;
+
+    QString m_attr_language;
+    bool m_has_attr_language;
+
+    // child element data
+    uint m_children;
+
+    DomScript(const DomScript &other);
+    void operator = (const DomScript&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomWidgetData {
+public:
+    DomWidgetData();
+    ~DomWidgetData();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    enum Child {
+        Property = 1
+    };
+
+    DomWidgetData(const DomWidgetData &other);
+    void operator = (const DomWidgetData&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomDesignerData {
+public:
+    DomDesignerData();
+    ~DomDesignerData();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomProperty*> elementProperty() const { return m_property; }
+    void setElementProperty(const QList<DomProperty*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomProperty*> m_property;
+    enum Child {
+        Property = 1
+    };
+
+    DomDesignerData(const DomDesignerData &other);
+    void operator = (const DomDesignerData&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomSlots {
+public:
+    DomSlots();
+    ~DomSlots();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QStringList elementSignal() const { return m_signal; }
+    void setElementSignal(const QStringList& a);
+
+    inline QStringList elementSlot() const { return m_slot; }
+    void setElementSlot(const QStringList& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QStringList m_signal;
+    QStringList m_slot;
+    enum Child {
+        Signal = 1,
+        Slot = 2
+    };
+
+    DomSlots(const DomSlots &other);
+    void operator = (const DomSlots&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomPropertySpecifications {
+public:
+    DomPropertySpecifications();
+    ~DomPropertySpecifications();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    // child element accessors
+    inline QList<DomStringPropertySpecification*> elementStringpropertyspecification() const { return m_stringpropertyspecification; }
+    void setElementStringpropertyspecification(const QList<DomStringPropertySpecification*>& a);
+
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    // child element data
+    uint m_children;
+    QList<DomStringPropertySpecification*> m_stringpropertyspecification;
+    enum Child {
+        Stringpropertyspecification = 1
+    };
+
+    DomPropertySpecifications(const DomPropertySpecifications &other);
+    void operator = (const DomPropertySpecifications&other);
+};
+
+class QDESIGNER_UILIB_EXPORT DomStringPropertySpecification {
+public:
+    DomStringPropertySpecification();
+    ~DomStringPropertySpecification();
+
+    void read(QXmlStreamReader &reader);
+    void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;
+    inline QString text() const { return m_text; }
+    inline void setText(const QString &s) { m_text = s; }
+
+    // attribute accessors
+    inline bool hasAttributeName() const { return m_has_attr_name; }
+    inline QString attributeName() const { return m_attr_name; }
+    inline void setAttributeName(const QString& a) { m_attr_name = a; m_has_attr_name = true; }
+    inline void clearAttributeName() { m_has_attr_name = false; }
+
+    inline bool hasAttributeType() const { return m_has_attr_type; }
+    inline QString attributeType() const { return m_attr_type; }
+    inline void setAttributeType(const QString& a) { m_attr_type = a; m_has_attr_type = true; }
+    inline void clearAttributeType() { m_has_attr_type = false; }
+
+    inline bool hasAttributeNotr() const { return m_has_attr_notr; }
+    inline QString attributeNotr() const { return m_attr_notr; }
+    inline void setAttributeNotr(const QString& a) { m_attr_notr = a; m_has_attr_notr = true; }
+    inline void clearAttributeNotr() { m_has_attr_notr = false; }
+
+    // child element accessors
+private:
+    QString m_text;
+    void clear(bool clear_all = true);
+
+    // attribute data
+    QString m_attr_name;
+    bool m_has_attr_name;
+
+    QString m_attr_type;
+    bool m_has_attr_type;
+
+    QString m_attr_notr;
+    bool m_has_attr_notr;
+
+    // child element data
+    uint m_children;
+
+    DomStringPropertySpecification(const DomStringPropertySpecification &other);
+    void operator = (const DomStringPropertySpecification&other);
+};
+
+
+#ifdef QFORMINTERNAL_NAMESPACE
+}
+#endif
+
+QT_END_NAMESPACE
+
+#endif // UI4_P_H
diff --git a/GUI/coregui/Views/widgetbox/widgetbox.cpp b/GUI/coregui/Views/widgetbox/widgetbox.cpp
new file mode 100644
index 0000000..31ae07b
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetbox.cpp
@@ -0,0 +1,313 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "widgetbox.h"
+#include "widgetboxtreewidget.h"
+#include "widgetbox_dnditem.h"
+
+#include <QtDesigner/QDesignerFormEditorInterface>
+#include <QtDesigner/QDesignerFormWindowManagerInterface>
+
+#include <qdesigner_utils_p.h>
+//#include <filterwidget_p.h>
+
+#include <QtGui/QDropEvent>
+//#include <QtWidgets/QVBoxLayout>
+//#include <QtWidgets/QApplication>
+//#include <QtWidgets/QToolBar>
+#include <QLineEdit>
+#include <QVBoxLayout>
+#include <QApplication>
+#include <QToolBar>
+#include <QDrag>
+
+#include <QtGui/QIcon>
+
+#include "SampleDesigner.h"
+
+#include "DesignerMimeData.h"
+
+#include <iostream>
+QT_BEGIN_NAMESPACE
+
+namespace qdesigner_internal {
+
+class WidgetBoxFilterLineEdit : public QLineEdit {
+public:
+    explicit WidgetBoxFilterLineEdit(QWidget *parent = 0) : QLineEdit(parent), m_defaultFocusPolicy(focusPolicy())
+        { setFocusPolicy(Qt::NoFocus); }
+
+protected:
+    virtual void mousePressEvent(QMouseEvent *event);
+    virtual void focusInEvent(QFocusEvent *e);
+
+private:
+    const Qt::FocusPolicy m_defaultFocusPolicy;
+};
+
+void WidgetBoxFilterLineEdit::mousePressEvent(QMouseEvent *e)
+{
+    if (!hasFocus()) // Explicitly focus on click.
+        setFocus(Qt::OtherFocusReason);
+    QLineEdit::mousePressEvent(e);
+}
+
+void WidgetBoxFilterLineEdit::focusInEvent(QFocusEvent *e)
+{
+    // Refuse the focus if the mouse it outside. In addition to the mouse
+    // press logic, this prevents a re-focussing which occurs once
+    // we actually had focus
+    const Qt::FocusReason reason = e->reason();
+    if (reason == Qt::ActiveWindowFocusReason || reason == Qt::PopupFocusReason) {
+        const QPoint mousePos = mapFromGlobal(QCursor::pos());
+        const bool refuse = !geometry().contains(mousePos);
+        if (refuse) {
+            e->ignore();
+            return;
+        }
+    }
+    QLineEdit::focusInEvent(e);
+}
+
+
+
+
+
+
+
+//WidgetBox::WidgetBox(QDesignerFormEditorInterface *core, QWidget *parent, Qt::WindowFlags flags)
+WidgetBox::WidgetBox(SampleDesignerInterface *core, QWidget *parent, Qt::WindowFlags flags)
+    : QDesignerWidgetBox(parent, flags),
+      m_core(core),
+      m_view(new WidgetBoxTreeWidget(m_core))
+{
+    QVBoxLayout *l = new QVBoxLayout(this);
+    l->setMargin(0);
+    l->setSpacing(0);
+
+    // Prevent the filter from grabbing focus since Our view has Qt::NoFocus
+    QToolBar *toolBar = new QToolBar(this);
+    QLineEdit *filterWidget = new WidgetBoxFilterLineEdit(toolBar);
+    filterWidget->setPlaceholderText("Filter");
+    filterWidget->setClearButtonEnabled(true);
+    connect(filterWidget, SIGNAL(textChanged(QString)), m_view, SLOT(filter(QString)));
+    toolBar->addWidget(filterWidget);
+    l->addWidget(toolBar);
+
+    // View
+    connect(m_view, SIGNAL(pressed(QString,QString,QPoint)),
+            this, SLOT(handleMousePress(QString,QString,QPoint)));
+    l->addWidget(m_view);
+
+    setAcceptDrops (true);
+
+
+//    QVBoxLayout *l = new QVBoxLayout(this);
+//    l->setMargin(0);
+//    l->setSpacing(0);
+
+//    // Prevent the filter from grabbing focus since Our view has Qt::NoFocus
+//    FilterWidget *filterWidget = new FilterWidget(0, FilterWidget::LayoutAlignNone);
+//    filterWidget->setRefuseFocus(true);
+//    connect(filterWidget, SIGNAL(filterChanged(QString)), m_view, SLOT(filter(QString)));
+
+//    QToolBar *toolBar = new QToolBar(this);
+//    toolBar->addWidget(filterWidget);
+//    l->addWidget(toolBar);
+
+//    // View
+//    connect(m_view, SIGNAL(pressed(QString,QString,QPoint)),
+//            this, SLOT(handleMousePress(QString,QString,QPoint)));
+//    l->addWidget(m_view);
+
+//    setAcceptDrops (true);
+}
+
+WidgetBox::~WidgetBox()
+{
+}
+
+//QDesignerFormEditorInterface *WidgetBox::core() const
+//{
+//    return m_core;
+//}
+
+SampleDesignerInterface *WidgetBox::core() const
+{
+    return m_core;
+}
+
+
+void WidgetBox::handleMousePress(const QString &name, const QString &xml, const QPoint &global_mouse_pos)
+{
+    Q_UNUSED(global_mouse_pos);
+    if (QApplication::mouseButtons() != Qt::LeftButton) return;
+
+    //std::cout << "WidgetBox::handleMousePress() -> name:" << name.toStdString() << std::endl;
+    DesignerMimeData::execDrag(name, xml, this );
+}
+
+int WidgetBox::categoryCount() const
+{
+    return m_view->categoryCount();
+}
+
+QDesignerWidgetBoxInterface::Category WidgetBox::category(int cat_idx) const
+{
+    return m_view->category(cat_idx);
+}
+
+void WidgetBox::addCategory(const Category &cat)
+{
+    m_view->addCategory(cat);
+}
+
+void WidgetBox::removeCategory(int cat_idx)
+{
+    m_view->removeCategory(cat_idx);
+}
+
+int WidgetBox::widgetCount(int cat_idx) const
+{
+    return m_view->widgetCount(cat_idx);
+}
+
+QDesignerWidgetBoxInterface::Widget WidgetBox::widget(int cat_idx, int wgt_idx) const
+{
+    return m_view->widget(cat_idx, wgt_idx);
+}
+
+void WidgetBox::addWidget(int cat_idx, const Widget &wgt)
+{
+    m_view->addWidget(cat_idx, wgt);
+}
+
+void WidgetBox::removeWidget(int cat_idx, int wgt_idx)
+{
+    m_view->removeWidget(cat_idx, wgt_idx);
+}
+
+void WidgetBox::dropWidgets(const QList<QDesignerDnDItemInterface*> &item_list, const QPoint&)
+{
+    m_view->dropWidgets(item_list);
+}
+
+void WidgetBox::setFileName(const QString &file_name)
+{
+    m_view->setFileName(file_name);
+}
+
+QString WidgetBox::fileName() const
+{
+    return m_view->fileName();
+}
+
+bool WidgetBox::load()
+{
+    //std::cout << "WidgetBox::load() -> We are here" << std::endl;
+    return m_view->load(loadMode());
+}
+
+bool WidgetBox::loadContents(const QString &contents)
+{
+    return m_view->loadContents(contents);
+}
+
+bool WidgetBox::save()
+{
+    return m_view->save();
+}
+
+static const QDesignerMimeData *checkDragEvent(QDropEvent * event,
+                                               bool acceptEventsFromWidgetBox)
+{
+    //std::cout << "QDesignerMimeData *checkDragEvent() -> ?" << std::endl;
+    const QDesignerMimeData *mimeData = qobject_cast<const QDesignerMimeData *>(event->mimeData());
+    if (!mimeData) {
+        event->ignore();
+        return 0;
+    }
+    // If desired, ignore a widget box drag and drop, where widget==0.
+    if (!acceptEventsFromWidgetBox) {
+        const bool fromWidgetBox = !mimeData->items().first()->widget();
+        if (fromWidgetBox) {
+            event->ignore();
+            return 0;
+        }
+    }
+
+    mimeData->acceptEvent(event);
+    return mimeData;
+}
+
+void WidgetBox::dragEnterEvent (QDragEnterEvent * event)
+{
+    // We accept event originating from the widget box also here,
+    // because otherwise Windows will not show the DnD pixmap.
+    checkDragEvent(event, true);
+}
+
+void WidgetBox::dragMoveEvent(QDragMoveEvent * event)
+{
+    checkDragEvent(event, true);
+}
+
+void WidgetBox::dropEvent(QDropEvent * event)
+{
+    const QDesignerMimeData *mimeData = checkDragEvent(event, false);
+    if (!mimeData)
+        return;
+
+    dropWidgets(mimeData->items(), event->pos());
+    QDesignerMimeData::removeMovedWidgetsFromSourceForm(mimeData->items());
+}
+
+QIcon WidgetBox::iconForWidget(const QString &className, const QString &category) const
+{
+    Widget widgetData;
+    if (!findWidget(this, className, category, &widgetData))
+        return QIcon();
+    return m_view->iconForWidget(widgetData.iconName());
+}
+
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
diff --git a/GUI/coregui/Views/widgetbox/widgetbox.h b/GUI/coregui/Views/widgetbox/widgetbox.h
new file mode 100644
index 0000000..82c6c35
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetbox.h
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WIDGETBOX_H
+#define WIDGETBOX_H
+
+#include "widgetbox_global.h"
+#include <qdesigner_widgetbox_p.h>
+
+QT_BEGIN_NAMESPACE
+
+//class QDesignerFormEditorInterface;
+class QDesignerFormWindowInterface;
+
+class SampleDesignerInterface;
+
+namespace qdesigner_internal {
+
+class WidgetBoxTreeWidget;
+
+class QT_WIDGETBOX_EXPORT WidgetBox : public QDesignerWidgetBox
+{
+    Q_OBJECT
+public:
+//    explicit WidgetBox(QDesignerFormEditorInterface *core, QWidget *parent = 0, Qt::WindowFlags flags = 0);
+    explicit WidgetBox(SampleDesignerInterface *core, QWidget *parent = 0, Qt::WindowFlags flags = 0);
+    virtual ~WidgetBox();
+
+//    QDesignerFormEditorInterface *core() const;
+    SampleDesignerInterface *core() const;
+
+    virtual int categoryCount() const;
+    virtual Category category(int cat_idx) const;
+    virtual void addCategory(const Category &cat);
+    virtual void removeCategory(int cat_idx);
+
+    virtual int widgetCount(int cat_idx) const;
+    virtual Widget widget(int cat_idx, int wgt_idx) const;
+    virtual void addWidget(int cat_idx, const Widget &wgt);
+    virtual void removeWidget(int cat_idx, int wgt_idx);
+
+    void dropWidgets(const QList<QDesignerDnDItemInterface*> &item_list, const QPoint &global_mouse_pos);
+
+    virtual void setFileName(const QString &file_name);
+    virtual QString fileName() const;
+    virtual bool load();
+    virtual bool save();
+
+    virtual bool loadContents(const QString &contents);
+    virtual QIcon iconForWidget(const QString &className, const QString &category = QString()) const;
+
+protected:
+    virtual void dragEnterEvent (QDragEnterEvent * event);
+    virtual void dragMoveEvent(QDragMoveEvent * event);
+    virtual void dropEvent (QDropEvent * event);
+
+private slots:
+    void handleMousePress(const QString &name, const QString &xml, const QPoint &global_mouse_pos);
+
+private:
+    //QDesignerFormEditorInterface *m_core;
+    SampleDesignerInterface *m_core;
+
+    WidgetBoxTreeWidget *m_view;
+};
+
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // WIDGETBOX_H
diff --git a/GUI/coregui/Views/widgetbox/widgetbox.qrc b/GUI/coregui/Views/widgetbox/widgetbox.qrc
new file mode 100644
index 0000000..b93db6b
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetbox.qrc
@@ -0,0 +1,38 @@
+<RCC>
+    <qresource prefix="/widgetbox">
+        <file>widgetbox.xml</file>
+        <file>images/ff_AnisoPyramid_32.png</file>
+        <file>images/ff_Box_32.png</file>
+        <file>images/ff_Cone_32.png</file>
+        <file>images/ff_Cone6_32.png</file>
+        <file>images/ff_Cuboctahedron_32.png</file>
+        <file>images/ff_Cylinder_32.png</file>
+        <file>images/ff_Dodecahedron_32.png</file>
+        <file>images/ff_EllipsoidalCylinder_32.png</file>
+        <file>images/ff_FullSphere_32.png</file>
+        <file>images/ff_FullSpheroid_32.png</file>
+        <file>images/ff_HemiEllipsoid_32.png</file>
+        <file>images/ff_Icosahedron_32.png</file>
+        <file>images/ff_Prism3_32.png</file>
+        <file>images/ff_Prism6_32.png</file>
+        <file>images/ff_Pyramid_32.png</file>
+        <file>images/ff_Ripple1_32.png</file>
+        <file>images/ff_Ripple2_32.png</file>
+        <file>images/ff_Tetrahedron_32.png</file>
+        <file>images/ff_TruncatedCube_32.png</file>
+        <file>images/ff_TruncatedSphere_32.png</file>
+        <file>images/ff_TruncatedSpheroid_32.png</file>
+        <file>images/MultiLayer.png</file>
+        <file>images/Layer.png</file>
+        <file>images/ParaCrystal2D.png</file>
+        <file>images/ParaCrystal1D.png</file>
+        <file>images/ParticleLayout.png</file>
+        <file>images/ParticleCoreShell.png</file>
+        <file>images/Lattice2D.png</file>
+        <file>images/Transformation.png</file>
+        <file>images/ParticleComposition.png</file>
+        <file>images/SizeDistribution.png</file>
+        <file>images/Lattice1D.png</file>
+        <file>images/sample_layers2.png</file>
+    </qresource>
+</RCC>
diff --git a/GUI/coregui/Views/widgetbox/widgetbox.xml b/GUI/coregui/Views/widgetbox/widgetbox.xml
new file mode 100644
index 0000000..fa8986a
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetbox.xml
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widgetbox version="0.5">
+
+    <category name="Layers">
+
+        <categoryentry  name="Multi Layer" icon="images/MultiLayer.png">
+            <widget class="MultiLayer">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Layer" icon="images/Layer.png">
+            <widget class="Layer">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+    </category>
+
+    <category name="Particle layouts">
+
+        <categoryentry name="Basic particle layout" icon="images/ParticleLayout.png">
+            <widget class="ParticleLayout">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+    </category>
+
+    <category name="Interference functions">
+
+        <categoryentry name="Radial paracrystal" icon="images/ParaCrystal1D.png">
+            <widget class="InterferenceRadialParaCrystal">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry  name="2D paracrystal" icon="images/ParaCrystal2D.png">
+            <widget class="Interference2DParaCrystal">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry  name="1D lattice" icon="images/Lattice1D.png">
+            <widget class="Interference1DLattice">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry  name="2D lattice" icon="images/Lattice2D.png">
+            <widget class="Interference2DLattice">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+    </category>
+
+    <category name="Particles">
+
+        <categoryentry name="Anisotropic pyramid" icon="images/ff_AnisoPyramid_32.png">
+            <widget class="FormFactorAnisoPyramid">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Box" icon="images/ff_Box_32.png">
+            <widget class="FormFactorBox">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Cone" icon="images/ff_Cone_32.png">
+            <widget class="FormFactorCone">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Cone6" icon="images/ff_Cone6_32.png">
+            <widget class="FormFactorCone6">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Cuboctahedron" icon="images/ff_Cuboctahedron_32.png">
+            <widget class="FormFactorCuboctahedron">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Cylinder" icon="images/ff_Cylinder_32.png">
+            <widget class="FormFactorCylinder">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Dodecahedron" icon="images/ff_Dodecahedron_32.png">
+            <widget class="FormFactorDodecahedron">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Ellipsoidal cylinder" icon="images/ff_EllipsoidalCylinder_32.png">
+            <widget class="FormFactorEllipsoidalCylinder">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Full sphere" icon="images/ff_FullSphere_32.png">
+            <widget class="FormFactorFullSphere">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Full spheroid" icon="images/ff_FullSpheroid_32.png">
+            <widget class="FormFactorFullSpheroid">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Hemi ellipsoid" icon="images/ff_HemiEllipsoid_32.png">
+            <widget class="FormFactorHemiEllipsoid">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Icosahedron" icon="images/ff_Icosahedron_32.png">
+            <widget class="FormFactorIcosahedron">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Prism3" icon="images/ff_Prism3_32.png">
+            <widget class="FormFactorPrism3">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Prism6" icon="images/ff_Prism6_32.png">
+            <widget class="FormFactorPrism6">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Pyramid" icon="images/ff_Pyramid_32.png">
+            <widget class="FormFactorPyramid">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Ripple1" icon="images/ff_Ripple1_32.png">
+            <widget class="FormFactorRipple1">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Ripple2" icon="images/ff_Ripple2_32.png">
+            <widget class="FormFactorRipple2">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Tetrahedron" icon="images/ff_Tetrahedron_32.png">
+            <widget class="FormFactorTetrahedron">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Truncated cube" icon="images/ff_TruncatedCube_32.png">
+            <widget class="FormFactorTruncatedCube">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Truncated sphere" icon="images/ff_TruncatedSphere_32.png">
+            <widget class="FormFactorTruncatedSphere">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Truncated spheroid" icon="images/ff_TruncatedSpheroid_32.png">
+            <widget class="FormFactorTruncatedSpheroid">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+    </category>
+
+    <category name="Transformations">
+
+        <categoryentry name="Rotation" icon="images/Transformation.png">
+            <widget class="Rotation">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+    </category>
+
+
+    <category name="Particle assemblies">
+
+        <categoryentry name="Core shell particle" icon="images/ParticleCoreShell.png">
+            <widget class="ParticleCoreShell">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Particle Composition" icon="images/ParticleComposition.png">
+            <widget class="ParticleComposition">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Distributed particle" icon="images/SizeDistribution.png">
+            <widget class="ParticleDistribution">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+    </category>
+
+    <category name="Standard samples">
+
+        <categoryentry name="Cylinder and prisms" icon="images/sample_layers2.png">
+            <widget class="example01">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Interference 1D paracrystal" icon="images/sample_layers2.png">
+            <widget class="example02">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Interference 2D paracrystal" icon="images/sample_layers2.png">
+            <widget class="example03">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Core shell particles" icon="images/sample_layers2.png">
+            <widget class="example04">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Multilayer with correlated roughness" icon="images/sample_layers2.png">
+            <widget class="example05">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Interference 2D square lattice" icon="images/sample_layers2.png">
+            <widget class="example06">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Rotated pyramids" icon="images/sample_layers2.png">
+            <widget class="example07">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Cylinders with size distribution" icon="images/sample_layers2.png">
+            <widget class="example08">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+        <categoryentry name="Hexagonal lattice with basis" icon="images/sample_layers2.png">
+            <widget class="example09">
+                <property name="objectName">
+                    <string notr="true">somestring</string>
+                </property>
+            </widget>
+        </categoryentry>
+
+
+    </category>
+
+</widgetbox>
diff --git a/GUI/coregui/Views/widgetbox/widgetbox_dnditem.cpp b/GUI/coregui/Views/widgetbox/widgetbox_dnditem.cpp
new file mode 100644
index 0000000..17a9f0f
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetbox_dnditem.cpp
@@ -0,0 +1,254 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "widgetbox_dnditem.h"
+
+//#include <widgetfactory_p.h>
+#include <spacer_widget_p.h>
+#include <qdesigner_formbuilder_p.h>
+//#include <qtresourcemodel_p.h>
+#include <formwindowbase_p.h>
+#include <qdesigner_utils_p.h>
+//#include <qdesigner_dockwidget_p.h>
+#include <qsimpleresource_p.h>
+
+#include <QtDesigner/QDesignerFormEditorInterface>
+#include <QtDesigner/QDesignerFormWindowManagerInterface>
+
+//#include <QtDesigner/private/ui4_p.h>
+#include <ui4_p.h>
+
+//#include <QtWidgets/QStyle>
+//#include <QtWidgets/QApplication>
+#include <QStyle>
+#include <QApplication>
+
+#include<iostream>
+
+
+#if QT_VERSION < 0x050000
+#define QStringLiteral QString
+#endif
+
+
+QT_BEGIN_NAMESPACE
+
+namespace qdesigner_internal {
+/*******************************************************************************
+** WidgetBoxResource
+*/
+
+static inline DeviceProfile currentDeviceProfile(const QDesignerFormEditorInterface *core)
+{
+    if (QDesignerFormWindowInterface *cfw = core->formWindowManager()->activeFormWindow())
+        if (const FormWindowBase *fwb = qobject_cast<const FormWindowBase *>(cfw))
+            return fwb->deviceProfile();
+    return DeviceProfile();
+}
+
+class WidgetBoxResource : public QDesignerFormBuilder
+{
+public:
+    WidgetBoxResource(QDesignerFormEditorInterface *core);
+
+    // protected->public
+   QWidget *createUI(DomUI *ui, QWidget *parents) { return QDesignerFormBuilder::create(ui, parents); }
+
+protected:
+
+   using QDesignerFormBuilder::createWidget;
+   using QDesignerFormBuilder::create;
+    virtual QWidget *create(DomWidget *ui_widget, QWidget *parents);
+    virtual QWidget *createWidget(const QString &widgetName, QWidget *parentWidget, const QString &name);
+    virtual void createCustomWidgets(DomCustomWidgets *);
+};
+
+
+#if QT_VERSION >= 0x050000
+WidgetBoxResource::WidgetBoxResource(QDesignerFormEditorInterface *core) :
+    QDesignerFormBuilder(core, currentDeviceProfile(core))
+{
+}
+#else
+WidgetBoxResource::WidgetBoxResource(QDesignerFormEditorInterface *core) :
+    QDesignerFormBuilder(core, QDesignerFormBuilder::EnableScripts, currentDeviceProfile(core))
+{
+}
+#endif
+
+
+QWidget *WidgetBoxResource::createWidget(const QString &widgetName, QWidget *parentWidget, const QString &name)
+{
+    if (widgetName == QStringLiteral("Spacer")) {
+        Spacer *spacer = new Spacer(parentWidget);
+        spacer->setObjectName(name);
+        return spacer;
+    }
+
+    return QDesignerFormBuilder::createWidget(widgetName, parentWidget, name);
+}
+
+QWidget *WidgetBoxResource::create(DomWidget *ui_widget, QWidget *parent)
+{
+    QWidget *result = QDesignerFormBuilder::create(ui_widget, parent);
+    // It is possible to have a syntax error or something in custom
+    // widget XML, so, try to recover here by creating an artificial
+    // top level + widget.
+    if (!result) {
+        const QString msg = QApplication::translate("qdesigner_internal::WidgetBox", "Warning: Widget creation failed in the widget box. This could be caused by invalid custom widget XML.");
+        qdesigner_internal::designerWarning(msg);
+        result = new QWidget(parent);
+        new QWidget(result);
+    }
+    result->setFocusPolicy(Qt::NoFocus);
+    result->setObjectName(ui_widget->attributeName());
+    return result;
+}
+
+void WidgetBoxResource::createCustomWidgets(DomCustomWidgets *dc)
+{
+    // Make a promotion entry in  case someone has a promoted widget
+    // in the scratchpad.
+    QSimpleResource::handleDomCustomWidgets(core(), dc);
+
+}
+
+/*******************************************************************************
+** WidgetBoxResource
+*/
+
+//static QSize geometryProp(const DomWidget *dw)
+//{
+//    const QList<DomProperty*> prop_list = dw->elementProperty();
+//    const QString geometry = QStringLiteral("geometry");
+//    foreach (DomProperty *prop, prop_list) {
+//        if (prop->attributeName() !=  geometry)
+//            continue;
+//        DomRect *dr = prop->elementRect();
+//        if (dr == 0)
+//            continue;
+//        return QSize(dr->elementWidth(), dr->elementHeight());
+//    }
+//    return QSize();
+//}
+
+//static QSize domWidgetSize(const DomWidget *dw)
+//{
+//    QSize size = geometryProp(dw);
+//    if (size.isValid())
+//        return size;
+
+//    foreach (const DomWidget *child, dw->elementWidget()) {
+//        size = geometryProp(child);
+//        if (size.isValid())
+//            return size;
+//    }
+
+//    foreach (const DomLayout *dl, dw->elementLayout()) {
+//        foreach (DomLayoutItem *item, dl->elementItem()) {
+//            const DomWidget *child = item->elementWidget();
+//            if (child == 0)
+//                continue;
+//            size = geometryProp(child);
+//            if (size.isValid())
+//                return size;
+//        }
+//    }
+
+//    return QSize();
+//}
+
+
+//static QWidget *decorationFromDomWidget(DomUI *dom_ui, QDesignerFormEditorInterface *core)
+static QWidget *decorationFromDomWidget(DomUI *dom_ui, SampleDesignerInterface *core)
+{
+    std::cout << " widgetbox_dnditem() -> QWidget *decorationFromDomWidget XXX not omplemented" << std::endl;
+    (void) dom_ui;
+    (void) core;
+    return 0;
+
+//    WidgetBoxResource builder(core);
+//    // We have the builder create the articial QWidget fake top level as a tooltip
+//    // because the size algorithm works better at weird DPI settings
+//    // if the actual widget is created as a child of a container
+//    QWidget *fakeTopLevel = builder.createUI(dom_ui, static_cast<QWidget*>(0));
+//    fakeTopLevel->setParent(0, Qt::ToolTip); // Container
+//    // Actual widget
+//    const DomWidget *domW = dom_ui->elementWidget()->elementWidget().front();
+//    QWidget *w = fakeTopLevel->findChildren<QWidget*>().front();
+//    Q_ASSERT(w);
+//    // hack begin;
+//    // We set _q_dockDrag dynamic property which will be detected in drag enter event of form window.
+//    // Dock drop is handled in special way (highlight goes to central widget of main window)
+//    if (qobject_cast<QDesignerDockWidget *>(w))
+//        fakeTopLevel->setProperty("_q_dockDrag", QVariant(true));
+//    // hack end;
+//    w->setAutoFillBackground(true); // Different style for embedded
+//    QSize size = domWidgetSize(domW);
+//    const QSize minimumSize = w->minimumSizeHint();
+//    if (!size.isValid())
+//        size = w->sizeHint();
+//    if (size.width() < minimumSize.width())
+//        size.setWidth(minimumSize.width());
+//    if (size.height() < minimumSize.height())
+//        size.setHeight(minimumSize.height());
+//    // A QWidget might have size -1,-1 if no geometry property is specified in the widget box.
+//    if (size.isEmpty())
+//        size = size.expandedTo(QSize(16, 16));
+//    w->setGeometry(QRect(QPoint(0, 0), size));
+//    fakeTopLevel->resize(size);
+//    return fakeTopLevel;
+}
+
+//WidgetBoxDnDItem::WidgetBoxDnDItem(QDesignerFormEditorInterface *core,
+WidgetBoxDnDItem::WidgetBoxDnDItem(SampleDesignerInterface *core,
+                                   DomUI *dom_ui,
+                                   const QPoint &global_mouse_pos) :
+    QDesignerDnDItem(CopyDrop)
+{
+    QWidget *decoration = decorationFromDomWidget(dom_ui, core);
+    decoration->move(global_mouse_pos - QPoint(5, 5));
+
+    init(dom_ui, 0, decoration, global_mouse_pos);
+}
+}
+
+QT_END_NAMESPACE
diff --git a/GUI/coregui/Views/widgetbox/widgetbox_dnditem.h b/GUI/coregui/Views/widgetbox/widgetbox_dnditem.h
new file mode 100644
index 0000000..771492d
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetbox_dnditem.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WIDGETBOX_DNDITEM_H
+#define WIDGETBOX_DNDITEM_H
+
+#include <qdesigner_dnditem_p.h>
+#include "widgetbox_global.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDesignerFormEditorInterface;
+class DomUI;
+
+class SampleDesignerInterface;
+
+namespace qdesigner_internal {
+
+class QT_WIDGETBOX_EXPORT WidgetBoxDnDItem : public QDesignerDnDItem
+{
+public:
+    WidgetBoxDnDItem(SampleDesignerInterface *core,
+                     DomUI *dom_ui,
+                     const QPoint &global_mouse_pos);
+};
+
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // WIDGETBOX_DNDITEM_H
diff --git a/GUI/coregui/Views/widgetbox/widgetbox_global.h b/GUI/coregui/Views/widgetbox/widgetbox_global.h
new file mode 100644
index 0000000..bc4c0cc
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetbox_global.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WIDGETBOX_GLOBAL_H
+#define WIDGETBOX_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+#ifdef Q_OS_WIN
+#ifdef QT_WIDGETBOX_LIBRARY
+# define QT_WIDGETBOX_EXPORT
+#else
+# define QT_WIDGETBOX_EXPORT
+#endif
+#else
+#define QT_WIDGETBOX_EXPORT
+#endif
+
+#endif // WIDGETBOX_GLOBAL_H
diff --git a/GUI/coregui/Views/widgetbox/widgetboxcategorylistview.cpp b/GUI/coregui/Views/widgetbox/widgetboxcategorylistview.cpp
new file mode 100644
index 0000000..af76398
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetboxcategorylistview.cpp
@@ -0,0 +1,561 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "widgetboxcategorylistview.h"
+#include "tooltipdatabase.h"
+
+#include <QtDesigner/QDesignerFormEditorInterface>
+#include <QtDesigner/QDesignerWidgetDataBaseInterface>
+
+#include <QtXml/QDomDocument>
+
+#include <QtGui/QIcon>
+//#include <QtWidgets/QListView>
+//#include <QtWidgets/QLineEdit>
+//#include <QtWidgets/QItemDelegate>
+//#include <QtCore/QSortFilterProxyModel>
+
+#include <QListView>
+#include <QLineEdit>
+#include <QItemDelegate>
+#include <QSortFilterProxyModel>
+
+#include <QtCore/QAbstractListModel>
+#include <QtCore/QList>
+#include <QtCore/QTextStream>
+#include <QtCore/QRegExp>
+#include <QDebug>
+#include <QXmlStreamReader>
+
+static const char *widgetElementC = "widget";
+static const char *nameAttributeC = "name";
+static const char *uiOpeningTagC = "<ui>";
+static const char *uiClosingTagC = "</ui>";
+
+
+#if QT_VERSION < 0x050000
+#define QStringLiteral QString
+#endif
+
+
+
+QT_BEGIN_NAMESPACE
+
+enum { FILTER_ROLE = Qt::UserRole + 11 };
+
+static QString domToString(const QDomElement &elt)
+{
+    QString result;
+    QTextStream stream(&result, QIODevice::WriteOnly);
+    elt.save(stream, 2);
+    stream.flush();
+    return result;
+}
+
+static QDomDocument stringToDom(const QString &xml)
+{
+    QDomDocument result;
+    result.setContent(xml);
+    return result;
+}
+
+namespace qdesigner_internal {
+
+// Entry of the model list
+
+struct WidgetBoxCategoryEntry {
+    WidgetBoxCategoryEntry();
+    explicit WidgetBoxCategoryEntry(const QDesignerWidgetBoxInterface::Widget &widget,
+                                    const QString &filter,
+                                    const QIcon &icon,
+                                    bool editable);
+
+    QDesignerWidgetBoxInterface::Widget widget;
+    QString toolTip;
+    QString whatsThis;
+    QString filter;
+    QIcon icon;
+    bool editable;
+};
+
+
+WidgetBoxCategoryEntry::WidgetBoxCategoryEntry() :
+    editable(false)
+{
+}
+
+WidgetBoxCategoryEntry::WidgetBoxCategoryEntry(const QDesignerWidgetBoxInterface::Widget &w,
+                                               const QString &filterIn,
+                                               const QIcon &i, bool e) :
+    widget(w),
+    filter(filterIn),
+    icon(i),
+    editable(e)
+{
+}
+
+/* WidgetBoxCategoryModel, representing a list of category entries. Uses a
+ * QAbstractListModel since the behaviour depends on the view mode of the list
+ * view, it does not return text in the case of IconMode. */
+
+class WidgetBoxCategoryModel : public QAbstractListModel {
+public:
+//    explicit WidgetBoxCategoryModel(QDesignerFormEditorInterface *core, QObject *parent = 0);
+    explicit WidgetBoxCategoryModel(SampleDesignerInterface *core, QObject *parent = 0);
+
+    // QAbstractListModel
+    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    virtual bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
+    virtual Qt::ItemFlags flags (const QModelIndex & index ) const;
+    virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
+
+    // The model returns no text in icon mode, so, it also needs to know it
+    QListView::ViewMode viewMode() const;
+    void setViewMode(QListView::ViewMode vm);
+
+    void addWidget(const QDesignerWidgetBoxInterface::Widget &widget, const QIcon &icon, bool editable);
+
+    QDesignerWidgetBoxInterface::Widget widgetAt(const QModelIndex & index) const;
+    QDesignerWidgetBoxInterface::Widget widgetAt(int row) const;
+
+    int indexOfWidget(const QString &name);
+
+    QDesignerWidgetBoxInterface::Category category() const;
+    bool removeCustomWidgets();
+
+private:
+    typedef QList<WidgetBoxCategoryEntry> WidgetBoxCategoryEntrys;
+
+    QRegExp m_classNameRegExp;
+//    QDesignerFormEditorInterface *m_core;
+    //SampleDesignerInterface *m_core;
+    WidgetBoxCategoryEntrys m_items;
+    QListView::ViewMode m_viewMode;
+};
+
+//WidgetBoxCategoryModel::WidgetBoxCategoryModel(QDesignerFormEditorInterface *core, QObject *parent) :
+WidgetBoxCategoryModel::WidgetBoxCategoryModel(SampleDesignerInterface *core, QObject *parent) :
+    QAbstractListModel(parent),
+#if QT_VERSION >= 0x050000
+    m_classNameRegExp( QStringLiteral("<widget +class *= *\"([^\"]+)\"") ),
+#else
+    m_classNameRegExp( QString("<widget +class *= *\"([^\"]+)\"") ),
+#endif
+
+//    m_core(core),
+    m_viewMode(QListView::ListMode)
+{
+    Q_ASSERT(m_classNameRegExp.isValid());
+    Q_UNUSED(core);
+}
+
+QListView::ViewMode WidgetBoxCategoryModel::viewMode() const
+{
+    return m_viewMode;
+}
+
+void WidgetBoxCategoryModel::setViewMode(QListView::ViewMode vm)
+{
+    if (m_viewMode == vm)
+        return;
+    const bool empty = m_items.isEmpty();
+    if (!empty)
+        beginResetModel();
+    m_viewMode = vm;
+    if (!empty)
+        endResetModel();
+}
+
+int WidgetBoxCategoryModel::indexOfWidget(const QString &name)
+{
+    const int count = m_items.size();
+    for (int  i = 0; i < count; i++)
+        if (m_items.at(i).widget.name() == name)
+            return i;
+    return -1;
+}
+
+QDesignerWidgetBoxInterface::Category WidgetBoxCategoryModel::category() const
+{
+    QDesignerWidgetBoxInterface::Category rc;
+    const WidgetBoxCategoryEntrys::const_iterator cend = m_items.constEnd();
+    for (WidgetBoxCategoryEntrys::const_iterator it = m_items.constBegin(); it != cend; ++it)
+        rc.addWidget(it->widget);
+    return rc;
+}
+
+bool WidgetBoxCategoryModel::removeCustomWidgets()
+{
+    // Typically, we are a whole category of custom widgets, so, remove all
+    // and do reset.
+    bool changed = false;
+    for (WidgetBoxCategoryEntrys::iterator it = m_items.begin(); it != m_items.end(); )
+        if (it->widget.type() == QDesignerWidgetBoxInterface::Widget::Custom) {
+            if (!changed)
+                beginResetModel();
+            it = m_items.erase(it);
+            changed = true;
+        } else {
+            ++it;
+        }
+    if (changed)
+        endResetModel();
+    return changed;
+}
+
+void WidgetBoxCategoryModel::addWidget(const QDesignerWidgetBoxInterface::Widget &widget, const QIcon &icon,bool editable)
+{
+    // build item. Filter on name + class name if it is different and not a layout.
+    QString filter = widget.name();
+    if (!filter.contains(QStringLiteral("Layout")) && m_classNameRegExp.indexIn(widget.domXml()) != -1) {
+        const QString className = m_classNameRegExp.cap(1);
+        if (!filter.contains(className))
+            filter += className;
+    }
+    WidgetBoxCategoryEntry item(widget, filter, icon, editable);
+
+    QXmlStreamReader reader(widget.domXml());
+    while (!reader.atEnd()) {
+        switch (reader.readNext()) {
+        case QXmlStreamReader::StartElement: {
+            const QStringRef tag = reader.name();
+            if (tag == "widget") {
+                const QXmlStreamAttributes attributes = reader.attributes();
+                QString className = attributes.value("class").toString();
+                QString toolTip = ToolTipDataBase::getSampleViewWidgetboxToolTip(className);
+                if(!toolTip.isEmpty())
+                    item.toolTip = toolTip;
+            }
+            break;
+        }
+        default: break;
+        }
+    }
+
+
+//    const QDesignerWidgetDataBaseInterface *db = m_core->widgetDataBase();
+//    const int dbIndex = db->indexOfClassName(widget.name());
+//    if (dbIndex != -1) {
+//        const QDesignerWidgetDataBaseItemInterface *dbItem = db->item(dbIndex);
+//        const QString toolTip = dbItem->toolTip();
+//        if (!toolTip.isEmpty())
+//            item.toolTip = toolTip;
+//        const QString whatsThis = dbItem->whatsThis();
+//        if (!whatsThis.isEmpty())
+//            item.whatsThis = whatsThis;
+//    }
+    // insert
+    const int row = m_items.size();
+    beginInsertRows(QModelIndex(), row, row);
+    m_items.push_back(item);
+    endInsertRows();
+}
+
+QVariant WidgetBoxCategoryModel::data(const QModelIndex &index, int role) const
+{
+    const int row = index.row();
+    if (row < 0 || row >=  m_items.size())
+        return QVariant();
+
+    const WidgetBoxCategoryEntry &item = m_items.at(row);
+    switch (role) {
+    case Qt::DisplayRole:
+        // No text in icon mode
+        return QVariant(m_viewMode == QListView::ListMode ? item.widget.name() : QString());
+    case Qt::DecorationRole:
+        return QVariant(item.icon);
+    case Qt::EditRole:
+        return QVariant(item.widget.name());
+    case Qt::ToolTipRole: {
+        if (m_viewMode == QListView::ListMode)
+            return QVariant(item.toolTip);
+        // Icon mode tooltip should contain the  class name
+        QString tt =  item.widget.name();
+        if (!item.toolTip.isEmpty()) {
+            tt += QLatin1Char('\n');
+            tt += item.toolTip;
+        }
+        return QVariant(tt);
+
+    }
+    case Qt::WhatsThisRole:
+        return QVariant(item.whatsThis);
+    case FILTER_ROLE:
+        return item.filter;
+    }
+    return QVariant();
+}
+
+bool WidgetBoxCategoryModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+    const int row = index.row();
+    if (role != Qt::EditRole || row < 0 || row >=  m_items.size() || value.type() != QVariant::String)
+        return false;
+    // Set name and adapt Xml
+    WidgetBoxCategoryEntry &item = m_items[row];
+    const QString newName = value.toString();
+    item.widget.setName(newName);
+
+    const QDomDocument doc = stringToDom(WidgetBoxCategoryListView::widgetDomXml(item.widget));
+    QDomElement widget_elt = doc.firstChildElement(QLatin1String(widgetElementC));
+    if (!widget_elt.isNull()) {
+        widget_elt.setAttribute(QLatin1String(nameAttributeC), newName);
+        item.widget.setDomXml(domToString(widget_elt));
+    }
+    emit dataChanged(index, index);
+    return true;
+}
+
+Qt::ItemFlags WidgetBoxCategoryModel::flags(const QModelIndex &index) const
+{
+    Qt::ItemFlags rc = Qt::ItemIsEnabled;
+    const int row = index.row();
+    if (row >= 0 && row <  m_items.size())
+        if (m_items.at(row).editable) {
+            rc |= Qt::ItemIsSelectable;
+            // Can change name in list mode only
+            if (m_viewMode == QListView::ListMode)
+                rc |= Qt::ItemIsEditable;
+        }
+    return rc;
+}
+
+int WidgetBoxCategoryModel::rowCount(const QModelIndex & /*parent*/) const
+{
+    return m_items.size();
+}
+
+bool WidgetBoxCategoryModel::removeRows(int row, int count, const QModelIndex & parent)
+{
+    if (row < 0 || count < 1)
+        return false;
+    const int size = m_items.size();
+    const int last =  row + count - 1;
+    if (row >= size || last >= size)
+        return false;
+    beginRemoveRows(parent, row, last);
+    for (int r = last; r >= row; r--)
+         m_items.removeAt(r);
+    endRemoveRows();
+    return true;
+}
+
+QDesignerWidgetBoxInterface::Widget WidgetBoxCategoryModel::widgetAt(const QModelIndex & index) const
+{
+    return widgetAt(index.row());
+}
+
+QDesignerWidgetBoxInterface::Widget WidgetBoxCategoryModel::widgetAt(int row) const
+{
+    if (row < 0 || row >=  m_items.size())
+        return QDesignerWidgetBoxInterface::Widget();
+    return m_items.at(row).widget;
+}
+
+/* WidgetSubBoxItemDelegate, ensures a valid name using a regexp validator */
+
+class WidgetBoxCategoryEntryDelegate : public QItemDelegate
+{
+public:
+    explicit WidgetBoxCategoryEntryDelegate(QWidget *parent = 0) : QItemDelegate(parent) {}
+    QWidget *createEditor(QWidget *parent,
+                          const QStyleOptionViewItem &option,
+                          const QModelIndex &index) const;
+};
+
+QWidget *WidgetBoxCategoryEntryDelegate::createEditor(QWidget *parent,
+                                                const QStyleOptionViewItem &option,
+                                                const QModelIndex &index) const
+{
+    QWidget *result = QItemDelegate::createEditor(parent, option, index);
+    if (QLineEdit *line_edit = qobject_cast<QLineEdit*>(result)) {
+        QRegExp re = QRegExp(QStringLiteral("[_a-zA-Z][_a-zA-Z0-9]*"));
+        Q_ASSERT(re.isValid());
+        line_edit->setValidator(new QRegExpValidator(re, line_edit));
+    }
+    return result;
+}
+
+// ----------------------  WidgetBoxCategoryListView
+
+//WidgetBoxCategoryListView::WidgetBoxCategoryListView(QDesignerFormEditorInterface *core, QWidget *parent) :
+WidgetBoxCategoryListView::WidgetBoxCategoryListView(SampleDesignerInterface *core, QWidget *parent) :
+    QListView(parent),
+    m_proxyModel(new QSortFilterProxyModel(this)),
+    m_model(new WidgetBoxCategoryModel(core, this))
+{
+    setFocusPolicy(Qt::NoFocus);
+    setFrameShape(QFrame::NoFrame);
+    //setIconSize(QSize(22, 22));
+    setIconSize(QSize(32, 32));
+    setSpacing(1);
+    setTextElideMode(Qt::ElideMiddle);
+    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    setResizeMode(QListView::Adjust);
+    setUniformItemSizes(true);
+
+    setItemDelegate(new WidgetBoxCategoryEntryDelegate(this));
+
+    connect(this, SIGNAL(pressed(QModelIndex)), this, SLOT(slotPressed(QModelIndex)));
+    setEditTriggers(QAbstractItemView::AnyKeyPressed);
+
+    m_proxyModel->setSourceModel(m_model);
+    m_proxyModel->setFilterRole(FILTER_ROLE);
+    setModel(m_proxyModel);
+    connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SIGNAL(scratchPadChanged()));
+}
+
+void WidgetBoxCategoryListView::setViewMode(ViewMode vm)
+{
+    QListView::setViewMode(vm);
+    m_model->setViewMode(vm);
+}
+
+void WidgetBoxCategoryListView::setCurrentItem(EAccessMode am, int row)
+{
+    const QModelIndex index = am == FILTERED ?
+        m_proxyModel->index(row, 0) :
+        m_proxyModel->mapFromSource(m_model->index(row, 0));
+
+    if (index.isValid())
+        setCurrentIndex(index);
+}
+
+void WidgetBoxCategoryListView::slotPressed(const QModelIndex &index)
+{
+    const QDesignerWidgetBoxInterface::Widget wgt = m_model->widgetAt(m_proxyModel->mapToSource(index));
+    if (wgt.isNull())
+        return;
+    emit pressed(wgt.name(), widgetDomXml(wgt), QCursor::pos());
+}
+
+void WidgetBoxCategoryListView::removeCurrentItem()
+{
+    const QModelIndex index = currentIndex();
+    if (!index.isValid() || !m_proxyModel->removeRow(index.row()))
+        return;
+
+    // We check the unfiltered item count here, we don't want to get removed if the
+    // filtered view is empty
+    if (m_model->rowCount()) {
+        emit itemRemoved();
+    } else {
+        emit lastItemRemoved();
+    }
+}
+
+void WidgetBoxCategoryListView::editCurrentItem()
+{
+    const QModelIndex index = currentIndex();
+    if (index.isValid())
+        edit(index);
+}
+
+int WidgetBoxCategoryListView::count(EAccessMode am) const
+{
+    return am == FILTERED ? m_proxyModel->rowCount() : m_model->rowCount();
+}
+
+int WidgetBoxCategoryListView::mapRowToSource(int filterRow) const
+{
+    const QModelIndex filterIndex = m_proxyModel->index(filterRow, 0);
+    return m_proxyModel->mapToSource(filterIndex).row();
+}
+
+QDesignerWidgetBoxInterface::Widget WidgetBoxCategoryListView::widgetAt(EAccessMode am, const QModelIndex & index) const
+{
+    const QModelIndex unfilteredIndex = am == FILTERED ? m_proxyModel->mapToSource(index) : index;
+    return m_model->widgetAt(unfilteredIndex);
+}
+
+QDesignerWidgetBoxInterface::Widget WidgetBoxCategoryListView::widgetAt(EAccessMode am, int row) const
+{
+    return m_model->widgetAt(am == UNFILTERED ? row : mapRowToSource(row));
+}
+
+void WidgetBoxCategoryListView::removeRow(EAccessMode am, int row)
+{
+    m_model->removeRow(am == UNFILTERED ? row : mapRowToSource(row));
+}
+
+bool WidgetBoxCategoryListView::containsWidget(const QString &name)
+{
+    return m_model->indexOfWidget(name) != -1;
+}
+
+void WidgetBoxCategoryListView::addWidget(const QDesignerWidgetBoxInterface::Widget &widget, const QIcon &icon, bool editable)
+{
+    m_model->addWidget(widget, icon, editable);
+}
+
+QString WidgetBoxCategoryListView::widgetDomXml(const QDesignerWidgetBoxInterface::Widget &widget)
+{
+    QString domXml = widget.domXml();
+
+    if (domXml.isEmpty()) {
+        domXml = QLatin1String(uiOpeningTagC);
+        domXml += QStringLiteral("<widget class=\"");
+        domXml += widget.name();
+        domXml += QStringLiteral("\"/>");
+        domXml += QLatin1String(uiClosingTagC);
+    }
+    return domXml;
+}
+
+void WidgetBoxCategoryListView::filter(const QRegExp &re)
+{
+    m_proxyModel->setFilterRegExp(re);
+}
+
+QDesignerWidgetBoxInterface::Category WidgetBoxCategoryListView::category() const
+{
+    return m_model->category();
+}
+
+bool WidgetBoxCategoryListView::removeCustomWidgets()
+{
+    return m_model->removeCustomWidgets();
+}
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
diff --git a/GUI/coregui/Views/widgetbox/widgetboxcategorylistview.h b/GUI/coregui/Views/widgetbox/widgetboxcategorylistview.h
new file mode 100644
index 0000000..2edb149
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetboxcategorylistview.h
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WIDGETBOXCATEGORYLISTVIEW_H
+#define WIDGETBOXCATEGORYLISTVIEW_H
+
+#include <QtDesigner/QDesignerWidgetBoxInterface>
+
+//#include <QtWidgets/QListView>
+#include <QListView>
+#include <QtCore/QList>
+
+QT_BEGIN_NAMESPACE
+
+class QDesignerFormEditorInterface;
+class QDesignerDnDItemInterface;
+
+class QSortFilterProxyModel;
+class QRegExp;
+
+class SampleDesignerInterface;
+
+namespace qdesigner_internal {
+
+class WidgetBoxCategoryModel;
+
+// List view of a category, switchable between icon and list mode.
+// Provides a filtered view.
+class WidgetBoxCategoryListView : public QListView
+{
+    Q_OBJECT
+public:
+    // Whether to access the filtered or unfiltered view
+    enum EAccessMode { FILTERED, UNFILTERED };
+
+//    explicit WidgetBoxCategoryListView(QDesignerFormEditorInterface *core, QWidget *parent = 0);
+    explicit WidgetBoxCategoryListView(SampleDesignerInterface *core, QWidget *parent = 0);
+    void setViewMode(ViewMode vm);
+
+    void dropWidgets(const QList<QDesignerDnDItemInterface*> &item_list);
+
+    using QListView::contentsSize;
+
+    // These methods operate on the filtered/unfiltered model according to accessmode
+    int count(EAccessMode am) const;
+    QDesignerWidgetBoxInterface::Widget widgetAt(EAccessMode am, const QModelIndex &index) const;
+    QDesignerWidgetBoxInterface::Widget widgetAt(EAccessMode am, int row) const;
+    void removeRow(EAccessMode am, int row);
+    void setCurrentItem(EAccessMode am, int row);
+
+    // These methods operate on the unfiltered model and are used for serialization
+    void addWidget(const QDesignerWidgetBoxInterface::Widget &widget, const QIcon &icon, bool editable);
+    bool containsWidget(const QString &name);
+    QDesignerWidgetBoxInterface::Category category() const;
+    bool removeCustomWidgets();
+
+    // Helper: Ensure a <ui> tag in the case of empty XML
+    static QString widgetDomXml(const QDesignerWidgetBoxInterface::Widget &widget);
+
+signals:
+    void scratchPadChanged();
+    void pressed(const QString &name, const QString &xml, const QPoint &globalPos);
+    void itemRemoved();
+    void lastItemRemoved();
+
+public slots:
+    void filter(const QRegExp &re);
+
+private slots:
+    void slotPressed(const QModelIndex &index);
+    void removeCurrentItem();
+    void editCurrentItem();
+
+private:
+    int mapRowToSource(int filterRow) const;
+    QSortFilterProxyModel *m_proxyModel;
+    WidgetBoxCategoryModel *m_model;
+};
+
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // WIDGETBOXCATEGORYLISTVIEW_H
diff --git a/GUI/coregui/Views/widgetbox/widgetboxtreewidget.cpp b/GUI/coregui/Views/widgetbox/widgetboxtreewidget.cpp
new file mode 100644
index 0000000..4a939f8
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetboxtreewidget.cpp
@@ -0,0 +1,1060 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "widgetboxtreewidget.h"
+#include "widgetboxcategorylistview.h"
+
+// shared
+//#include <iconloader_p.h>
+#include <sheet_delegate_p.h>
+#include <ui4_p.h>
+#include <qdesigner_utils_p.h>
+//#include <pluginmanager_p.h>
+
+// sdk
+#include <QtDesigner/QDesignerFormEditorInterface>
+#include <QtDesigner/QDesignerDnDItemInterface>
+
+#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
+#include <QtDesigner/QDesignerCustomWidgetInterface>
+#else
+#include <QtUiPlugin/QDesignerCustomWidgetInterface>
+#endif
+
+//#include <QtDesigner/QDesignerSettingsInterface>
+
+//#include <QtWidgets/QHeaderView>
+//#include <QtWidgets/QApplication>
+//#include <QtWidgets/QTreeWidgetItem>
+//#include <QtGui/QContextMenuEvent>
+//#include <QtWidgets/QAction>
+//#include <QtWidgets/QActionGroup>
+//#include <QtWidgets/QMenu>
+
+#include <QHeaderView>
+#include <QApplication>
+#include <QTreeWidgetItem>
+#include <QContextMenuEvent>
+#include <QAction>
+#include <QActionGroup>
+#include <QMenu>
+
+
+#include <QtCore/QFile>
+#include <QtCore/QTimer>
+#include <QtCore/QDebug>
+
+#include <iostream>
+
+static const char* widgetBoxRootElementC = "widgetbox";
+static const char* widgetElementC = "widget";
+static const char* uiElementC = "ui";
+static const char* categoryElementC = "category";
+static const char* categoryEntryElementC = "categoryentry";
+static const char* nameAttributeC = "name";
+static const char* typeAttributeC = "type";
+static const char* iconAttributeC = "icon";
+static const char* defaultTypeValueC = "default";
+static const char* customValueC = "custom";
+static const char* iconPrefixC = "__qt_icon__";
+static const char* scratchPadValueC = "scratchpad";
+static const char* qtLogoC = "qtlogo.png";
+static const char* invisibleNameC = "[invisible]";
+
+
+//QDESIGNER_SHARED_EXPORT QIcon createIconSet(const QString& name)
+//{
+//    QStringList candidates = QStringList()
+//        << (QString::fromUtf8(":/qt-project.org/formeditor/images/") + name)
+//#ifdef Q_OS_MAC
+//        << (QString::fromUtf8(":/qt-project.org/formeditor/images/mac/") + name)
+//#else
+//        << (QString::fromUtf8(":/qt-project.org/formeditor/images/win/") + name)
+//#endif
+//        << (QString::fromUtf8(":/qt-project.org/formeditor/images/designer_") + name);
+
+//    foreach (const QString& f, candidates) {
+//        if (QFile::exists(f))
+//            return QIcon(f);
+//    }
+
+//    return QIcon();
+//}
+
+
+QIcon createIconSet(const QString& name)
+{
+    return QIcon(QString::fromUtf8(":/widgetbox/") + name);
+}
+
+
+enum ETopLevelRole  { NORMAL_ITEM, SCRATCHPAD_ITEM, CUSTOM_ITEM };
+
+QT_BEGIN_NAMESPACE
+
+static void setTopLevelRole(ETopLevelRole tlr, QTreeWidgetItem* item)
+{
+    item->setData(0, Qt::UserRole, QVariant(tlr));
+}
+
+static ETopLevelRole topLevelRole(const  QTreeWidgetItem* item)
+{
+    return static_cast<ETopLevelRole>(item->data(0, Qt::UserRole).toInt());
+}
+
+namespace qdesigner_internal {
+
+//WidgetBoxTreeWidget::WidgetBoxTreeWidget(QDesignerFormEditorInterface* core, QWidget* parent) :
+WidgetBoxTreeWidget::WidgetBoxTreeWidget(SampleDesignerInterface* core, QWidget* parent) :
+    QTreeWidget(parent),
+    m_core(core),
+    m_iconMode(false),
+    m_scratchPadDeleteTimer(0)
+{
+    setFocusPolicy(Qt::NoFocus);
+    setIndentation(0);
+    setRootIsDecorated(false);
+    setColumnCount(1);
+    header()->hide();
+#if QT_VERSION >= 0x050000
+    header()->setSectionResizeMode(QHeaderView::Stretch);
+#endif
+    setTextElideMode(Qt::ElideMiddle);
+    setVerticalScrollMode(ScrollPerPixel);
+
+    setItemDelegate(new SheetDelegate(this, this));
+
+    connect(this, SIGNAL(itemPressed(QTreeWidgetItem*,int)),
+            this, SLOT(handleMousePress(QTreeWidgetItem*)));
+}
+
+QIcon WidgetBoxTreeWidget::iconForWidget(QString iconName) const
+{
+    if (iconName.isEmpty())
+        iconName = QLatin1String(qtLogoC);
+
+    if (iconName.startsWith(QLatin1String(iconPrefixC))) {
+        const IconCache::const_iterator it = m_pluginIcons.constFind(iconName);
+        if (it != m_pluginIcons.constEnd())
+            return it.value();
+    }
+    return createIconSet(iconName);
+}
+
+WidgetBoxCategoryListView* WidgetBoxTreeWidget::categoryViewAt(int idx) const
+{
+    WidgetBoxCategoryListView* rc = 0;
+    if (QTreeWidgetItem* cat_item = topLevelItem(idx))
+        if (QTreeWidgetItem* embedItem = cat_item->child(0))
+            rc = qobject_cast<WidgetBoxCategoryListView*>(itemWidget(embedItem, 0));
+    Q_ASSERT(rc);
+    return rc;
+}
+
+void WidgetBoxTreeWidget::saveExpandedState() const
+{
+    qDebug() << "WidgetBoxTreeWidget::saveExpandedState() -> XXX Not implemented.";
+    return;
+
+//    QStringList closedCategories;
+//    if (const int numCategories = categoryCount()) {
+//        for (int i = 0; i < numCategories; ++i) {
+//            const QTreeWidgetItem* cat_item = topLevelItem(i);
+//            if (!isItemExpanded(cat_item))
+//                closedCategories.append(cat_item->text(0));
+//        }
+//    }
+//    QDesignerSettingsInterface* settings = m_core->settingsManager();
+//    settings->beginGroup(QLatin1String(widgetBoxRootElementC));
+//    settings->setValue(QStringLiteral("Closed categories"), closedCategories);
+//    settings->setValue(QStringLiteral("View mode"), m_iconMode);
+//    settings->endGroup();
+}
+
+void  WidgetBoxTreeWidget::restoreExpandedState()
+{
+    std::cout << "WidgetBoxTreeWidget::restoreExpandedState() -> XXX Not implemented." << std::endl;
+    return;
+
+//    typedef QSet<QString> StringSet;
+//    QDesignerSettingsInterface* settings = m_core->settingsManager();
+//    m_iconMode = settings->value(QStringLiteral("WidgetBox/View mode")).toBool();
+//    updateViewMode();
+//    const StringSet closedCategories = settings->value(QStringLiteral("WidgetBox/Closed categories"), QStringList()).toStringList().toSet();
+//    expandAll();
+//    if (closedCategories.empty())
+//        return;
+
+//    if (const int numCategories = categoryCount()) {
+//        for (int i = 0; i < numCategories; ++i) {
+//            QTreeWidgetItem* item = topLevelItem(i);
+//            if (closedCategories.contains(item->text(0)))
+//                item->setExpanded(false);
+//            }
+//    }
+}
+
+WidgetBoxTreeWidget::~WidgetBoxTreeWidget()
+{
+    saveExpandedState();
+}
+
+void WidgetBoxTreeWidget::setFileName(const QString& file_name)
+{
+    m_file_name = file_name;
+}
+
+QString WidgetBoxTreeWidget::fileName() const
+{
+    return m_file_name;
+}
+
+bool WidgetBoxTreeWidget::save()
+{
+    if (fileName().isEmpty())
+        return false;
+
+    QFile file(fileName());
+    if (!file.open(QIODevice::WriteOnly))
+        return false;
+
+    CategoryList cat_list;
+    const int count = categoryCount();
+    for (int i = 0; i < count; ++i)
+        cat_list.append(category(i));
+
+    QXmlStreamWriter writer(&file);
+    writer.setAutoFormatting(true);
+    writer.setAutoFormattingIndent(1);
+    writer.writeStartDocument();
+    writeCategories(writer, cat_list);
+    writer.writeEndDocument();
+
+    return true;
+}
+
+void WidgetBoxTreeWidget::slotSave()
+{
+    save();
+}
+
+void WidgetBoxTreeWidget::handleMousePress(QTreeWidgetItem* item)
+{
+    if (item == 0)
+        return;
+
+    if (QApplication::mouseButtons() != Qt::LeftButton)
+        return;
+
+    if (item->parent() == 0) {
+        setItemExpanded(item, !isItemExpanded(item));
+        return;
+    }
+}
+
+int WidgetBoxTreeWidget::ensureScratchpad()
+{
+    const int existingIndex = indexOfScratchpad();
+    if (existingIndex != -1)
+         return existingIndex;
+
+    QTreeWidgetItem* scratch_item = new QTreeWidgetItem(this);
+    scratch_item->setText(0, "Scratchpad");
+    setTopLevelRole(SCRATCHPAD_ITEM, scratch_item);
+    addCategoryView(scratch_item, false); // Scratchpad in list mode.
+    return categoryCount() - 1;
+}
+
+WidgetBoxCategoryListView* WidgetBoxTreeWidget::addCategoryView(QTreeWidgetItem* parent, bool iconMode)
+{
+    QTreeWidgetItem* embed_item = new QTreeWidgetItem(parent);
+    embed_item->setFlags(Qt::ItemIsEnabled);
+    WidgetBoxCategoryListView* categoryView = new WidgetBoxCategoryListView(m_core, this);
+    categoryView->setViewMode(iconMode ? QListView::IconMode : QListView::ListMode);
+    connect(categoryView, SIGNAL(scratchPadChanged()), this, SLOT(slotSave()));
+    connect(categoryView, SIGNAL(pressed(QString,QString,QPoint)), this, SIGNAL(pressed(QString,QString,QPoint)));
+    connect(categoryView, SIGNAL(itemRemoved()), this, SLOT(slotScratchPadItemDeleted()));
+    connect(categoryView, SIGNAL(lastItemRemoved()), this, SLOT(slotLastScratchPadItemDeleted()));
+    setItemWidget(embed_item, 0, categoryView);
+    return categoryView;
+}
+
+int WidgetBoxTreeWidget::indexOfScratchpad() const
+{
+    if (const int numTopLevels =  topLevelItemCount()) {
+        for (int i = numTopLevels - 1; i >= 0; --i) {
+            if (topLevelRole(topLevelItem(i)) == SCRATCHPAD_ITEM)
+                return i;
+        }
+    }
+    return -1;
+}
+
+int WidgetBoxTreeWidget::indexOfCategory(const QString& name) const
+{
+    const int topLevelCount = topLevelItemCount();
+    for (int i = 0; i < topLevelCount; ++i) {
+        if (topLevelItem(i)->text(0) == name)
+            return i;
+    }
+    return -1;
+}
+
+bool WidgetBoxTreeWidget::load(QDesignerWidgetBox::LoadMode loadMode)
+{
+//    std::cout << "WidgetBoxTreeWidget::load() -> XXX" << loadMode << std::endl;
+    switch (loadMode) {
+    case QDesignerWidgetBox::LoadReplace:
+        clear();
+        break;
+    case QDesignerWidgetBox::LoadCustomWidgetsOnly:
+        addCustomCategories(true);
+        updateGeometries();
+        return true;
+    default:
+        break;
+    }
+
+    const QString name = fileName();
+
+    QFile f(name);
+    if (!f.open(QIODevice::ReadOnly)) // Might not exist at first startup
+        return false;
+
+    const QString contents = QString::fromUtf8(f.readAll());
+    return loadContents(contents);
+}
+
+bool WidgetBoxTreeWidget::loadContents(const QString& contents)
+{
+    QString errorMessage;
+    CategoryList cat_list;
+    if (!readCategories(m_file_name, contents, &cat_list, &errorMessage)) {
+        qdesigner_internal::designerWarning(errorMessage);
+        return false;
+    }
+
+    foreach(const Category& cat, cat_list)
+        addCategory(cat);
+
+    // addCustomCategories(false); // ZZZ
+    // Restore which items are expanded
+    //restoreExpandedState(); ZZZ
+    return true;
+}
+
+void WidgetBoxTreeWidget::addCustomCategories(bool replace)
+{
+    if (replace) {
+        // clear out all existing custom widgets
+        if (const int numTopLevels =  topLevelItemCount()) {
+            for (int t = 0; t < numTopLevels ; ++t)
+                categoryViewAt(t)->removeCustomWidgets();
+        }
+    }
+    // re-add
+    const CategoryList customList = loadCustomCategoryList();
+    const CategoryList::const_iterator cend = customList.constEnd();
+    for (CategoryList::const_iterator it = customList.constBegin(); it != cend; ++it)
+        addCategory(*it);
+}
+
+static inline QString msgXmlError(const QString& fileName, const QXmlStreamReader& r)
+{
+    return QString("An error has been encountered at line %1 of %2: %3")
+            .arg(r.lineNumber()).arg(fileName, r.errorString());
+}
+
+bool WidgetBoxTreeWidget::readCategories(const QString& fileName, const QString& contents,
+                                       CategoryList* cats, QString* errorMessage)
+{
+    // Read widget box XML:
+    //
+    //<widgetbox version="4.5">
+    // <category name="Layouts">
+    //  <categoryentry name="Vertical Layout" icon="win/editvlayout.png" type="default">
+    //   <widget class="QListWidget" ...>
+    // ...
+
+    QXmlStreamReader reader(contents);
+
+
+    // Entries of category with name="invisible" should be ignored
+    bool ignoreEntries = false;
+
+    while (!reader.atEnd()) {
+        switch (reader.readNext()) {
+        case QXmlStreamReader::StartElement: {
+            const QStringRef tag = reader.name();
+            if (tag == QLatin1String(widgetBoxRootElementC)) {
+                //<widgetbox version="4.5">
+                continue;
+            }
+            if (tag == QLatin1String(categoryElementC)) {
+                // <category name="Layouts">
+                const QXmlStreamAttributes attributes = reader.attributes();
+                const QString categoryName = attributes.value(QLatin1String(nameAttributeC)).toString();
+                if (categoryName == QLatin1String(invisibleNameC)) {
+                    ignoreEntries = true;
+                } else {
+                    Category category(categoryName);
+                    if (attributes.value(QLatin1String(typeAttributeC)) == QLatin1String(scratchPadValueC))
+                        category.setType(Category::Scratchpad);
+                    cats->push_back(category);
+                }
+                continue;
+            }
+            if (tag == QLatin1String(categoryEntryElementC)) {
+                //  <categoryentry name="Vertical Layout" icon="win/editvlayout.png" type="default">
+                if (!ignoreEntries) {
+                    QXmlStreamAttributes attr = reader.attributes();
+                    const QString widgetName = attr.value(QLatin1String(nameAttributeC)).toString();
+                    const QString widgetIcon = attr.value(QLatin1String(iconAttributeC)).toString();
+                    const WidgetBoxTreeWidget::Widget::Type widgetType =
+                        attr.value(QLatin1String(typeAttributeC)).toString()
+                            == QLatin1String(customValueC) ?
+                        WidgetBoxTreeWidget::Widget::Custom :
+                        WidgetBoxTreeWidget::Widget::Default;
+
+                    Widget w;
+                    w.setName(widgetName);
+                    w.setIconName(widgetIcon);
+                    w.setType(widgetType);
+                    if (!readWidget(&w, contents, reader))
+                        continue;
+
+                    cats->back().addWidget(w);
+                } // ignoreEntries
+                continue;
+            }
+            break;
+        }
+        case QXmlStreamReader::EndElement: {
+           const QStringRef tag = reader.name();
+           if (tag == QLatin1String(widgetBoxRootElementC)) {
+               continue;
+           }
+           if (tag == QLatin1String(categoryElementC)) {
+               ignoreEntries = false;
+               continue;
+           }
+           if (tag == QLatin1String(categoryEntryElementC)) {
+               continue;
+           }
+           break;
+        }
+        default: break;
+        }
+    }
+
+    if (reader.hasError()) {
+        *errorMessage = msgXmlError(fileName, reader);
+        return false;
+    }
+
+    return true;
+}
+
+/*!
+ * Read out a widget within a category. This can either be
+ * enclosed in a <ui> element or a (legacy) <widget> element which may
+ * contain nested <widget> elements.
+ *
+ * Examples:
+ *
+ * <ui language="c++">
+ *  <widget class="MultiPageWidget" name="multipagewidget"> ... </widget>
+ *  <customwidgets>...</customwidgets>
+ * <ui>
+ *
+ * or
+ *
+ * <widget>
+ *   <widget> ... </widget>
+ *   ...
+ * <widget>
+ *
+ * Returns true on success, false if end was reached or an error has been encountered
+ * in which case the reader has its error flag set. If successful, the current item
+ * of the reader will be the closing element (</ui> or </widget>)
+ */
+bool WidgetBoxTreeWidget::readWidget(Widget* w, const QString& xml, QXmlStreamReader& r)
+{
+    qint64 startTagPosition =0, endTagPosition = 0;
+
+    int nesting = 0;
+    bool endEncountered = false;
+    bool parsedWidgetTag = false;
+    QString outmostElement;
+    while (!endEncountered) {
+        const qint64 currentPosition = r.characterOffset();
+        switch(r.readNext()) {
+        case QXmlStreamReader::StartElement:
+            if (nesting++ == 0) {
+                // First element must be <ui> or (legacy) <widget>
+                const QStringRef name = r.name();
+                if (name == QLatin1String(uiElementC)) {
+                    startTagPosition = currentPosition;
+                } else {
+                    if (name == QLatin1String(widgetElementC)) {
+                        startTagPosition = currentPosition;
+                        parsedWidgetTag = true;
+                    } else {
+                        r.raiseError(QString("Unexpected element <%1> encountered when "
+                                             "parsing for <widget> or <ui>").arg(name.toString()));
+                        return false;
+                    }
+                }
+            } else {
+                // We are within <ui> looking for the first <widget> tag
+                if (!parsedWidgetTag && r.name() == QLatin1String(widgetElementC)) {
+                    parsedWidgetTag = true;
+                }
+            }
+            break;
+        case QXmlStreamReader::EndElement:
+            // Reached end of widget?
+            if (--nesting == 0)  {
+                endTagPosition = r.characterOffset();
+                endEncountered = true;
+            }
+            break;
+        case QXmlStreamReader::EndDocument:
+            r.raiseError("Unexpected end of file encountered when parsing widgets.");
+            return false;
+        case QXmlStreamReader::Invalid:
+            return false;
+        default:
+            break;
+        }
+    }
+    if (!parsedWidgetTag) {
+        r.raiseError("A widget element could not be found.");
+        return false;
+    }
+    // Oddity: Startposition is 1 off
+    QString widgetXml = xml.mid(startTagPosition, endTagPosition - startTagPosition);
+    const QChar lessThan = QLatin1Char('<');
+    if (!widgetXml.startsWith(lessThan))
+        widgetXml.prepend(lessThan);
+    w->setDomXml(widgetXml);
+    return true;
+}
+
+void WidgetBoxTreeWidget::writeCategories(QXmlStreamWriter& writer, const CategoryList& cat_list) const
+{
+    const QString widgetbox = QLatin1String(widgetBoxRootElementC);
+    const QString name = QLatin1String(nameAttributeC);
+    const QString type = QLatin1String(typeAttributeC);
+    const QString icon = QLatin1String(iconAttributeC);
+    const QString defaultType = QLatin1String(defaultTypeValueC);
+    const QString category = QLatin1String(categoryElementC);
+    const QString categoryEntry = QLatin1String(categoryEntryElementC);
+    const QString iconPrefix = QLatin1String(iconPrefixC);
+    const QString widgetTag = QLatin1String(widgetElementC);
+
+    //
+    // <widgetbox>
+    //   <category name="Layouts">
+    //     <categoryEntry name="Vertical Layout" type="default" icon="win/editvlayout.png">
+    //       <ui>
+    //        ...
+    //       </ui>
+    //     </categoryEntry>
+    //     ...
+    //   </category>
+    //   ...
+    // </widgetbox>
+    //
+
+    writer.writeStartElement(widgetbox);
+
+    foreach (const Category& cat, cat_list) {
+        writer.writeStartElement(category);
+        writer.writeAttribute(name, cat.name());
+        if (cat.type() == Category::Scratchpad)
+            writer.writeAttribute(type, QLatin1String(scratchPadValueC));
+
+        const int widgetCount = cat.widgetCount();
+        for (int i = 0; i < widgetCount; ++i) {
+           const  Widget wgt = cat.widget(i);
+            if (wgt.type() == Widget::Custom)
+                continue;
+
+            writer.writeStartElement(categoryEntry);
+            writer.writeAttribute(name, wgt.name());
+            if (!wgt.iconName().startsWith(iconPrefix))
+                writer.writeAttribute(icon, wgt.iconName());
+            writer.writeAttribute(type, defaultType);
+
+            const DomUI* domUI = QDesignerWidgetBox::xmlToUi(wgt.name(), WidgetBoxCategoryListView::widgetDomXml(wgt), false);
+            if (domUI) {
+                domUI->write(writer);
+                delete domUI;
+            }
+
+            writer.writeEndElement(); // categoryEntry
+        }
+        writer.writeEndElement(); // categoryEntry
+    }
+
+    writer.writeEndElement(); // widgetBox
+}
+
+//static int findCategory(const QString& name, const WidgetBoxTreeWidget::CategoryList& list)
+//{
+//    int idx = 0;
+//    foreach (const WidgetBoxTreeWidget::Category& cat, list) {
+//        if (cat.name() == name)
+//            return idx;
+//        ++idx;
+//    }
+//    return -1;
+//}
+
+//static inline bool isValidIcon(const QIcon& icon)
+//{
+//    if (!icon.isNull()) {
+//        const QList<QSize> availableSizes = icon.availableSizes();
+//        if (!availableSizes.empty())
+//            return !availableSizes.front().isEmpty();
+//    }
+//    return false;
+//}
+
+WidgetBoxTreeWidget::CategoryList WidgetBoxTreeWidget::loadCustomCategoryList() const
+{
+    CategoryList result;
+
+    std::cout << "WidgetBoxTreeWidget::loadCustomCategoryList() -> XXX Not implemented." << std::endl;
+    return result;
+
+//    const QDesignerPluginManager* pm = m_core->pluginManager();
+//    const QDesignerPluginManager::CustomWidgetList customWidgets = pm->registeredCustomWidgets();
+//    if (customWidgets.empty())
+//        return result;
+
+//    static const QString customCatName = "Custom Widgets";
+
+//    const QString invisible = QLatin1String(invisibleNameC);
+//    const QString iconPrefix = QLatin1String(iconPrefixC);
+
+//    foreach(QDesignerCustomWidgetInterface* c, customWidgets) {
+//        const QString dom_xml = c->domXml();
+//        if (dom_xml.isEmpty())
+//            continue;
+
+//        const QString pluginName = c->name();
+//        const QDesignerCustomWidgetData data = pm->customWidgetData(c);
+//        QString displayName = data.xmlDisplayName();
+//        if (displayName.isEmpty())
+//            displayName = pluginName;
+
+//        QString cat_name = c->group();
+//        if (cat_name.isEmpty())
+//            cat_name = customCatName;
+//        else if (cat_name == invisible)
+//            continue;
+
+//        int idx = findCategory(cat_name, result);
+//        if (idx == -1) {
+//            result.append(Category(cat_name));
+//            idx = result.size() - 1;
+//        }
+//        Category& cat = result[idx];
+
+//        const QIcon icon = c->icon();
+
+//        QString icon_name;
+//        if (isValidIcon(icon)) {
+//            icon_name = iconPrefix;
+//            std::cout << "YYY " << icon_name.toStdString() << std::endl;
+//            icon_name += pluginName;
+//            m_pluginIcons.insert(icon_name, icon);
+//        } else {
+//            icon_name = QLatin1String(qtLogoC);
+//        }
+
+//        cat.addWidget(Widget(displayName, dom_xml, icon_name, Widget::Custom));
+//    }
+
+//    return result;
+}
+
+void WidgetBoxTreeWidget::adjustSubListSize(QTreeWidgetItem* cat_item)
+{
+    QTreeWidgetItem* embedItem = cat_item->child(0);
+    if (embedItem == 0)
+        return;
+
+    WidgetBoxCategoryListView* list_widget = static_cast<WidgetBoxCategoryListView*>(itemWidget(embedItem, 0));
+    list_widget->setFixedWidth(header()->width());
+    list_widget->doItemsLayout();
+    const int height = qMax(list_widget->contentsSize().height() ,1);
+    list_widget->setFixedHeight(height);
+    embedItem->setSizeHint(0, QSize(-1, height - 1));
+}
+
+int WidgetBoxTreeWidget::categoryCount() const
+{
+    return topLevelItemCount();
+}
+
+WidgetBoxTreeWidget::Category WidgetBoxTreeWidget::category(int cat_idx) const
+{
+    if (cat_idx >= topLevelItemCount())
+        return Category();
+
+    QTreeWidgetItem* cat_item = topLevelItem(cat_idx);
+
+    QTreeWidgetItem* embedItem = cat_item->child(0);
+    WidgetBoxCategoryListView* categoryView = static_cast<WidgetBoxCategoryListView*>(itemWidget(embedItem, 0));
+
+    Category result = categoryView->category();
+    result.setName(cat_item->text(0));
+
+    switch (topLevelRole(cat_item)) {
+    case SCRATCHPAD_ITEM:
+        result.setType(Category::Scratchpad);
+        break;
+    default:
+        result.setType(Category::Default);
+        break;
+    }
+    return result;
+}
+
+void WidgetBoxTreeWidget::addCategory(const Category& cat)
+{
+    if (cat.widgetCount() == 0)
+        return;
+
+    const bool isScratchPad = cat.type() == Category::Scratchpad;
+    WidgetBoxCategoryListView* categoryView;
+    QTreeWidgetItem* cat_item;
+
+    if (isScratchPad) {
+        const int idx = ensureScratchpad();
+        categoryView = categoryViewAt(idx);
+        cat_item = topLevelItem(idx);
+    } else {
+        const int existingIndex = indexOfCategory(cat.name());
+        if (existingIndex == -1) {
+            cat_item = new QTreeWidgetItem();
+            cat_item->setText(0, cat.name());
+            setTopLevelRole(NORMAL_ITEM, cat_item);
+            // insert before scratchpad
+            const int scratchPadIndex = indexOfScratchpad();
+            if (scratchPadIndex == -1) {
+                addTopLevelItem(cat_item);
+            } else {
+                insertTopLevelItem(scratchPadIndex, cat_item);
+            }
+            setItemExpanded(cat_item, true);
+            categoryView = addCategoryView(cat_item, m_iconMode);
+        } else {
+            categoryView = categoryViewAt(existingIndex);
+            cat_item = topLevelItem(existingIndex);
+        }
+    }
+    // The same categories are read from the file $HOME, avoid duplicates
+    const int widgetCount = cat.widgetCount();
+    for (int i = 0; i < widgetCount; ++i) {
+        const Widget w = cat.widget(i);
+        if (!categoryView->containsWidget(w.name()))
+//            std::cout << "XXX 1.7 " << w.iconName().toStdString() << std::endl;
+            categoryView->addWidget(w, iconForWidget(w.iconName()), isScratchPad);
+    }
+    adjustSubListSize(cat_item);
+}
+
+void WidgetBoxTreeWidget::removeCategory(int cat_idx)
+{
+    if (cat_idx >= topLevelItemCount())
+        return;
+    delete takeTopLevelItem(cat_idx);
+}
+
+int WidgetBoxTreeWidget::widgetCount(int cat_idx) const
+{
+    if (cat_idx >= topLevelItemCount())
+        return 0;
+    // SDK functions want unfiltered access
+    return categoryViewAt(cat_idx)->count(WidgetBoxCategoryListView::UNFILTERED);
+}
+
+WidgetBoxTreeWidget::Widget WidgetBoxTreeWidget::widget(int cat_idx, int wgt_idx) const
+{
+    if (cat_idx >= topLevelItemCount())
+        return Widget();
+    // SDK functions want unfiltered access
+    WidgetBoxCategoryListView* categoryView = categoryViewAt(cat_idx);
+    return categoryView->widgetAt(WidgetBoxCategoryListView::UNFILTERED, wgt_idx);
+}
+
+void WidgetBoxTreeWidget::addWidget(int cat_idx, const Widget& wgt)
+{
+    if (cat_idx >= topLevelItemCount())
+        return;
+
+    QTreeWidgetItem* cat_item = topLevelItem(cat_idx);
+    WidgetBoxCategoryListView* categoryView = categoryViewAt(cat_idx);
+
+    const bool scratch = topLevelRole(cat_item) == SCRATCHPAD_ITEM;
+    categoryView->addWidget(wgt, iconForWidget(wgt.iconName()), scratch);
+    adjustSubListSize(cat_item);
+}
+
+void WidgetBoxTreeWidget::removeWidget(int cat_idx, int wgt_idx)
+{
+    if (cat_idx >= topLevelItemCount())
+        return;
+
+    WidgetBoxCategoryListView* categoryView = categoryViewAt(cat_idx);
+
+    // SDK functions want unfiltered access
+    const WidgetBoxCategoryListView::EAccessMode am = WidgetBoxCategoryListView::UNFILTERED;
+    if (wgt_idx >= categoryView->count(am))
+        return;
+
+    categoryView->removeRow(am, wgt_idx);
+}
+
+void WidgetBoxTreeWidget::slotScratchPadItemDeleted()
+{
+    const int scratch_idx = indexOfScratchpad();
+    QTreeWidgetItem* scratch_item = topLevelItem(scratch_idx);
+    adjustSubListSize(scratch_item);
+    save();
+}
+
+void WidgetBoxTreeWidget::slotLastScratchPadItemDeleted()
+{
+    // Remove the scratchpad in the next idle loop
+    if (!m_scratchPadDeleteTimer) {
+        m_scratchPadDeleteTimer = new QTimer(this);
+        m_scratchPadDeleteTimer->setSingleShot(true);
+        m_scratchPadDeleteTimer->setInterval(0);
+        connect(m_scratchPadDeleteTimer, SIGNAL(timeout()), this, SLOT(deleteScratchpad()));
+    }
+    if (!m_scratchPadDeleteTimer->isActive())
+        m_scratchPadDeleteTimer->start();
+}
+
+void WidgetBoxTreeWidget::deleteScratchpad()
+{
+    const int idx = indexOfScratchpad();
+    if (idx == -1)
+        return;
+    delete takeTopLevelItem(idx);
+    save();
+}
+
+
+void WidgetBoxTreeWidget::slotListMode()
+{
+    m_iconMode = false;
+    updateViewMode();
+}
+
+void WidgetBoxTreeWidget::slotIconMode()
+{
+    m_iconMode = true;
+    updateViewMode();
+}
+
+void WidgetBoxTreeWidget::updateViewMode()
+{
+    if (const int numTopLevels = topLevelItemCount()) {
+        for (int i = numTopLevels - 1; i >= 0; --i) {
+            QTreeWidgetItem* topLevel = topLevelItem(i);
+            // Scratch pad stays in list mode.
+            const QListView::ViewMode viewMode  = m_iconMode && (topLevelRole(topLevel) != SCRATCHPAD_ITEM) ? QListView::IconMode : QListView::ListMode;
+            WidgetBoxCategoryListView* categoryView = categoryViewAt(i);
+            if (viewMode != categoryView->viewMode()) {
+                categoryView->setViewMode(viewMode);
+                adjustSubListSize(topLevelItem(i));
+            }
+        }
+    }
+
+    updateGeometries();
+}
+
+void WidgetBoxTreeWidget::resizeEvent(QResizeEvent* e)
+{
+    QTreeWidget::resizeEvent(e);
+    if (const int numTopLevels = topLevelItemCount()) {
+        for (int i = numTopLevels - 1; i >= 0; --i)
+            adjustSubListSize(topLevelItem(i));
+    }
+}
+
+void WidgetBoxTreeWidget::contextMenuEvent(QContextMenuEvent* e)
+{
+    QTreeWidgetItem* item = itemAt(e->pos());
+
+    const bool scratchpad_menu = item != 0
+                            && item->parent() != 0
+                            && topLevelRole(item->parent()) ==  SCRATCHPAD_ITEM;
+
+    QMenu menu;
+    menu.addAction("Expand all", this, SLOT(expandAll()));
+    menu.addAction("Collapse all", this, SLOT(collapseAll()));
+    menu.addSeparator();
+
+    QAction* listModeAction = menu.addAction("List View");
+    QAction* iconModeAction = menu.addAction("Icon View");
+    listModeAction->setCheckable(true);
+    iconModeAction->setCheckable(true);
+    QActionGroup* viewModeGroup = new QActionGroup(&menu);
+    viewModeGroup->addAction(listModeAction);
+    viewModeGroup->addAction(iconModeAction);
+    if (m_iconMode)
+        iconModeAction->setChecked(true);
+    else
+        listModeAction->setChecked(true);
+    connect(listModeAction, SIGNAL(triggered()), SLOT(slotListMode()));
+    connect(iconModeAction, SIGNAL(triggered()), SLOT(slotIconMode()));
+
+    if (scratchpad_menu) {
+        menu.addSeparator();
+        menu.addAction("Remove", itemWidget(item, 0), SLOT(removeCurrentItem()));
+        if (!m_iconMode)
+            menu.addAction("Edit name", itemWidget(item, 0), SLOT(editCurrentItem()));
+    }
+    e->accept();
+    menu.exec(mapToGlobal(e->pos()));
+}
+
+void WidgetBoxTreeWidget::dropWidgets(const QList<QDesignerDnDItemInterface*>& item_list)
+{
+    QTreeWidgetItem* scratch_item = 0;
+    WidgetBoxCategoryListView* categoryView = 0;
+    bool added = false;
+
+    foreach (QDesignerDnDItemInterface* item, item_list) {
+        QWidget* w = item->widget();
+        if (w == 0)
+            continue;
+
+        DomUI* dom_ui = item->domUi();
+        if (dom_ui == 0)
+            continue;
+
+        const int scratch_idx = ensureScratchpad();
+        scratch_item = topLevelItem(scratch_idx);
+        categoryView = categoryViewAt(scratch_idx);
+
+        // Temporarily remove the fake toplevel in-between
+        DomWidget* fakeTopLevel = dom_ui->takeElementWidget();
+        DomWidget* firstWidget = 0;
+        if (fakeTopLevel && !fakeTopLevel->elementWidget().isEmpty()) {
+            firstWidget = fakeTopLevel->elementWidget().first();
+            dom_ui->setElementWidget(firstWidget);
+        } else {
+            dom_ui->setElementWidget(fakeTopLevel);
+            continue;
+        }
+
+        // Serialize to XML
+        QString xml;
+        {
+            QXmlStreamWriter writer(&xml);
+            writer.setAutoFormatting(true);
+            writer.setAutoFormattingIndent(1);
+            writer.writeStartDocument();
+            dom_ui->write(writer);
+            writer.writeEndDocument();
+        }
+
+        // Insert fake toplevel again
+        dom_ui->takeElementWidget();
+        dom_ui->setElementWidget(fakeTopLevel);
+
+        const Widget wgt = Widget(w->objectName(), xml);
+        categoryView->addWidget(wgt, iconForWidget(wgt.iconName()), true);
+        setItemExpanded(scratch_item, true);
+        added = true;
+    }
+
+    if (added) {
+        save();
+        QApplication::setActiveWindow(this);
+        // Is the new item visible in filtered mode?
+        const WidgetBoxCategoryListView::EAccessMode am = WidgetBoxCategoryListView::FILTERED;
+        if (const int count = categoryView->count(am))
+            categoryView->setCurrentItem(am, count - 1);
+        categoryView->adjustSize(); // XXX
+        adjustSubListSize(scratch_item);
+    }
+}
+
+void WidgetBoxTreeWidget::filter(const QString& f)
+{
+    const bool empty = f.isEmpty();
+    QRegExp re = empty ? QRegExp() : QRegExp(f, Qt::CaseInsensitive, QRegExp::FixedString);
+    const int numTopLevels = topLevelItemCount();
+    bool changed = false;
+    for (int i = 0; i < numTopLevels; i++) {
+        QTreeWidgetItem* tl = topLevelItem(i);
+        WidgetBoxCategoryListView* categoryView = categoryViewAt(i);
+        // Anything changed? -> Enable the category
+        const int oldCount = categoryView->count(WidgetBoxCategoryListView::FILTERED);
+        categoryView->filter(re);
+        const int newCount = categoryView->count(WidgetBoxCategoryListView::FILTERED);
+        if (oldCount != newCount) {
+            changed = true;
+            const bool categoryEnabled = newCount > 0 || empty;
+            if (categoryEnabled) {
+                categoryView->adjustSize();
+                adjustSubListSize(tl);
+            }
+            setRowHidden (i, QModelIndex(), !categoryEnabled);
+        }
+    }
+    if (changed)
+        updateGeometries();
+}
+
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
diff --git a/GUI/coregui/Views/widgetbox/widgetboxtreewidget.h b/GUI/coregui/Views/widgetbox/widgetboxtreewidget.h
new file mode 100644
index 0000000..c23e986
--- /dev/null
+++ b/GUI/coregui/Views/widgetbox/widgetboxtreewidget.h
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Designer of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WIDGETBOXTREEWIDGET_H
+#define WIDGETBOXTREEWIDGET_H
+
+#include "qdesigner_widgetbox_p.h"
+
+#include <QTreeWidget>
+#include <QIcon>
+#include <QList>
+#include <QHash>
+#include <QXmlStreamReader> // Cannot forward declare them on Mac
+#include <QXmlStreamWriter>
+
+QT_BEGIN_NAMESPACE
+
+class QDesignerFormEditorInterface;
+class QDesignerDnDItemInterface;
+
+class QTimer;
+
+class SampleDesignerInterface;
+
+namespace qdesigner_internal {
+
+class WidgetBoxCategoryListView;
+
+//! WidgetBoxTreeWidget: A tree of categories
+class WidgetBoxTreeWidget : public QTreeWidget
+{
+    Q_OBJECT
+
+public:
+    typedef QDesignerWidgetBoxInterface::Widget Widget;
+    typedef QDesignerWidgetBoxInterface::Category Category;
+    typedef QDesignerWidgetBoxInterface::CategoryList CategoryList;
+
+    explicit WidgetBoxTreeWidget(SampleDesignerInterface *core, QWidget *parent = 0);
+    virtual ~WidgetBoxTreeWidget();
+
+    int categoryCount() const;
+    Category category(int cat_idx) const;
+    void addCategory(const Category &cat);
+    void removeCategory(int cat_idx);
+
+    int widgetCount(int cat_idx) const;
+    Widget widget(int cat_idx, int wgt_idx) const;
+    void addWidget(int cat_idx, const Widget &wgt);
+    void removeWidget(int cat_idx, int wgt_idx);
+
+    void dropWidgets(const QList<QDesignerDnDItemInterface*> &item_list);
+
+    void setFileName(const QString &file_name);
+    QString fileName() const;
+    bool load(QDesignerWidgetBox::LoadMode loadMode);
+    bool loadContents(const QString &contents);
+    bool save();
+    QIcon iconForWidget(QString iconName) const;
+
+signals:
+    void pressed(const QString name, const QString dom_xml, const QPoint &global_mouse_pos);
+
+public slots:
+    void filter(const QString &);
+
+protected:
+    virtual void contextMenuEvent(QContextMenuEvent *e);
+    virtual void resizeEvent(QResizeEvent *e);
+
+private slots:
+    void slotSave();
+    void slotScratchPadItemDeleted();
+    void slotLastScratchPadItemDeleted();
+
+    void handleMousePress(QTreeWidgetItem *item);
+    void deleteScratchpad();
+    void slotListMode();
+    void slotIconMode();
+
+private:
+    WidgetBoxCategoryListView *addCategoryView(QTreeWidgetItem *parent, bool iconMode);
+    WidgetBoxCategoryListView *categoryViewAt(int idx) const;
+    void adjustSubListSize(QTreeWidgetItem *cat_item);
+
+    static bool readCategories(const QString &fileName, const QString &xml, CategoryList *cats, QString *errorMessage);
+    static bool readWidget(Widget *w, const QString &xml, QXmlStreamReader &r);
+
+    CategoryList loadCustomCategoryList() const;
+    void writeCategories(QXmlStreamWriter &writer, const CategoryList &cat_list) const;
+
+    int indexOfCategory(const QString &name) const;
+    int indexOfScratchpad() const;
+    int ensureScratchpad();
+    void addCustomCategories(bool replace);
+
+    void saveExpandedState() const;
+    void restoreExpandedState();
+    void updateViewMode();
+
+    SampleDesignerInterface *m_core;
+    QString m_file_name;
+    typedef QHash<QString, QIcon> IconCache;
+    mutable IconCache m_pluginIcons;
+    bool m_iconMode;
+    QTimer *m_scratchPadDeleteTimer;
+};
+
+}  // namespace qdesigner_internal
+
+QT_END_NAMESPACE
+
+#endif // WIDGETBOXTREEWIDGET_H
diff --git a/GUI/coregui/coregui.qrc b/GUI/coregui/coregui.qrc
new file mode 100644
index 0000000..a09ce70
--- /dev/null
+++ b/GUI/coregui/coregui.qrc
@@ -0,0 +1,50 @@
+<RCC>
+    <qresource prefix="/">
+        <file>images/mode_script.png</file>
+        <file>images/closebutton.png</file>
+        <file>images/reset.png</file>
+        <file>images/darkclosebutton.png</file>
+        <file>images/gisas_instrument.png</file>
+        <file>images/gisas_instrument_bw.png</file>
+        <file>mainwindow/tooltips.xml</file>
+        <file>images/treeview-branch-closed.png</file>
+        <file>images/treeview-branch-end.png</file>
+        <file>images/treeview-branch-more.png</file>
+        <file>images/treeview-branch-open.png</file>
+        <file>images/treeview-vline.png</file>
+        <file>images/toolbar_newitem.png</file>
+        <file>images/toolbar_newitem_dark.png</file>
+        <file>images/BornAgain.ico</file>
+        <file>images/collapse_arrow.png</file>
+        <file>images/expand_arrow.png</file>
+        <file>images/splashscreen.png</file>
+        <file>images/about_icon.png</file>
+        <file>images/darkarrowdown.png</file>
+        <file>images/darkarrowup.png</file>
+        <file>images/darkclose.png</file>
+        <file>images/warning at 2x.png</file>
+        <file>images/magnifier.png</file>
+        <file>images/warning_64x64.png</file>
+        <file>images/toolbar32dark_cloneitem.svg</file>
+        <file>images/toolbar32dark_newitem.svg</file>
+        <file>images/toolbar32dark_remove.svg</file>
+        <file>images/statusbar_dockmenu.svg</file>
+        <file>images/statusbar_joblist.svg</file>
+        <file>images/main_sessionmodel.svg</file>
+        <file>images/toolbar_expand_collapse_tree.svg</file>
+        <file>images/toolbar16light_recycle.svg</file>
+        <file>images/toolbar16light_newitem.svg</file>
+        <file>images/toolbar16light_cloneitem.svg</file>
+        <file>images/toolbar16light_run.svg</file>
+        <file>images/main_importview.svg</file>
+        <file>images/main_instrumentview.svg</file>
+        <file>images/main_jobview.svg</file>
+        <file>images/main_sampleview.svg</file>
+        <file>images/main_simulationview.svg</file>
+        <file>images/main_welcomeview.svg</file>
+        <file>images/toolbar16light_refresh.svg</file>
+        <file>images/toolbar16light_save.svg</file>
+        <file>images/toolbar16light_projections.svg</file>
+        <file>images/toolbar16light_propertypanel.svg</file>
+    </qresource>
+</RCC>
diff --git a/GUI/coregui/images/BornAgain.ico b/GUI/coregui/images/BornAgain.ico
new file mode 100644
index 0000000..a28a133
Binary files /dev/null and b/GUI/coregui/images/BornAgain.ico differ
diff --git a/GUI/coregui/images/BornAgain_48x48.png b/GUI/coregui/images/BornAgain_48x48.png
new file mode 100644
index 0000000..6c14220
Binary files /dev/null and b/GUI/coregui/images/BornAgain_48x48.png differ
diff --git a/GUI/coregui/images/BornAgain_64x64.png b/GUI/coregui/images/BornAgain_64x64.png
new file mode 100644
index 0000000..ecc33c6
Binary files /dev/null and b/GUI/coregui/images/BornAgain_64x64.png differ
diff --git a/GUI/coregui/images/about_icon.png b/GUI/coregui/images/about_icon.png
new file mode 100644
index 0000000..fd8f127
Binary files /dev/null and b/GUI/coregui/images/about_icon.png differ
diff --git a/GUI/coregui/images/closebutton.png b/GUI/coregui/images/closebutton.png
new file mode 100644
index 0000000..c978cf5
Binary files /dev/null and b/GUI/coregui/images/closebutton.png differ
diff --git a/GUI/coregui/images/collapse_arrow.png b/GUI/coregui/images/collapse_arrow.png
new file mode 100644
index 0000000..a52c731
Binary files /dev/null and b/GUI/coregui/images/collapse_arrow.png differ
diff --git a/GUI/coregui/images/darkarrowdown.png b/GUI/coregui/images/darkarrowdown.png
new file mode 100644
index 0000000..3b07da1
Binary files /dev/null and b/GUI/coregui/images/darkarrowdown.png differ
diff --git a/GUI/coregui/images/darkarrowup.png b/GUI/coregui/images/darkarrowup.png
new file mode 100644
index 0000000..3d751f9
Binary files /dev/null and b/GUI/coregui/images/darkarrowup.png differ
diff --git a/GUI/coregui/images/darkclose.png b/GUI/coregui/images/darkclose.png
new file mode 100644
index 0000000..365fdb8
Binary files /dev/null and b/GUI/coregui/images/darkclose.png differ
diff --git a/GUI/coregui/images/darkclosebutton.png b/GUI/coregui/images/darkclosebutton.png
new file mode 100644
index 0000000..5cc5477
Binary files /dev/null and b/GUI/coregui/images/darkclosebutton.png differ
diff --git a/GUI/coregui/images/expand_arrow.png b/GUI/coregui/images/expand_arrow.png
new file mode 100644
index 0000000..608b77e
Binary files /dev/null and b/GUI/coregui/images/expand_arrow.png differ
diff --git a/GUI/coregui/images/filenew.png b/GUI/coregui/images/filenew.png
new file mode 100644
index 0000000..dd795cf
Binary files /dev/null and b/GUI/coregui/images/filenew.png differ
diff --git a/GUI/coregui/images/gisas_instrument.png b/GUI/coregui/images/gisas_instrument.png
new file mode 100644
index 0000000..ec96431
Binary files /dev/null and b/GUI/coregui/images/gisas_instrument.png differ
diff --git a/GUI/coregui/images/gisas_instrument_bw.png b/GUI/coregui/images/gisas_instrument_bw.png
new file mode 100644
index 0000000..dfa3127
Binary files /dev/null and b/GUI/coregui/images/gisas_instrument_bw.png differ
diff --git a/GUI/coregui/images/magnifier.png b/GUI/coregui/images/magnifier.png
new file mode 100644
index 0000000..0e652c9
Binary files /dev/null and b/GUI/coregui/images/magnifier.png differ
diff --git a/GUI/coregui/images/main_importview.svg b/GUI/coregui/images/main_importview.svg
new file mode 100644
index 0000000..ba27c25
--- /dev/null
+++ b/GUI/coregui/images/main_importview.svg
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="main_importview.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,53.784305,-81.014234)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3943"
+       id="linearGradient3949"
+       x1="25.773111"
+       y1="32.89315"
+       x2="4.6256304"
+       y2="8.9645777"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.19514396,0,0,-0.40471686,37.049492,26.995934)" />
+    <linearGradient
+       id="linearGradient3943">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3945" />
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:1;"
+         offset="1"
+         id="stop3947" />
+    </linearGradient>
+    <filter
+       id="filter3044"
+       style="color-interpolation-filters:sRGB"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood3046"
+         flood-opacity="0.75"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3048"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3050"
+         stdDeviation="0.5"
+         result="blur" />
+      <feOffset
+         id="feOffset3052"
+         dx="0.5"
+         dy="0.5"
+         result="offset" />
+      <feComposite
+         id="feComposite3054"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.3270254,0,0,1.9728073,3.0946231,-1.7145929)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3943"
+       id="linearGradient5136"
+       x1="23.857143"
+       y1="22.080078"
+       x2="8.8571424"
+       y2="7.0556879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.93181818,0.14285714,1.4253818)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3943"
+       id="linearGradient5136-1"
+       x1="23.857143"
+       y1="22.080078"
+       x2="8.8571424"
+       y2="7.0556879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.93181818,-1.4285714e-7,15.139668)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="20.355212"
+     inkscape:cy="-0.87744786"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4759);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00000048;marker:none;visibility:visible;display:inl [...]
+       d="M 7.5605469 2.9863281 C 6.2585053 2.9864591 5.074349 4.1773671 5.0742188 5.4863281 L 5.0742188 42.517578 C 5.0743491 43.826538 6.2585053 45.017448 7.5605469 45.017578 L 40.603516 45.017578 C 41.905558 45.017448 43.091667 43.826538 43.091797 42.517578 L 43.091797 23.925781 L 39.951172 23.925781 L 39.951172 40.611328 C 39.951098 41.348968 39.287792 42.017498 38.552734 42.017578 L 9.3632812 42.017578 C 8.6282227 42.017498 7.9649174 41.348968 7.9648438 40.611328 L 7.9648438 7.51757 [...]
+       id="path4748" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="m 35.660548,23.317399 c 0.344949,-0.03479 0.520577,-0.673162 0.52142,-1.135915 l 0.0099,-4.944056 0.0099,-4.84185 c -8.67e-4,-0.323996 -0.148433,-1.009177 -0.358389,-1.17071 -0.209956,-0.161532 -0.4842,-0.161251 -0.693972,6.75e-4 l -3.370587,2.601296 -3.315576,2.646438 c -0.207937,0.16312 -0.261476,0.455193 -0.261476,0.777655 0,0.322461 0.05354,0.678095 0.261476,0.841215 l 3.315576,2.555835 3.370587,2.601283 c 0.120064,0.0931 0.372829,0.08179 0.511227,0.06812 z"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccscccscccc"
+       id="path2999" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4763-3"
+       d="m 36.045686,14.077885 0,0.986402 0,3.945617 0,0.986399 1.663513,0 6.65405,0 1.663514,0 0,-0.986399 0,-3.945617 0,-0.986402 -1.663514,0 -6.65405,0 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonze [...]
+       d="m 13.143136,11.143695 c -1.051131,0 -1.929687,0.789906 -1.929687,1.737079 l 0,8.238367 c 0,0.947173 0.878556,1.73884 1.929687,1.73884 l 10.142578,0 c 1.051131,0 1.927734,-0.791667 1.927734,-1.73884 l 0,-8.238367 c 0,-0.947173 -0.876603,-1.737079 -1.927734,-1.737079 l -10.142578,0 z m 0.07031,1.802198 10,0 0,8.10989 -10,0 0,-8.10989 z"
+       id="rect5083"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonze [...]
+       d="m 13.000279,24.857981 c -1.051131,0 -1.929687,0.789906 -1.929687,1.737079 l 0,8.238367 c 0,0.947173 0.878556,1.73884 1.929687,1.73884 l 10.142578,0 c 1.051131,0 1.927734,-0.791667 1.927734,-1.73884 l 0,-8.238367 c 0,-0.947173 -0.876603,-1.737079 -1.927734,-1.737079 l -10.142578,0 z m 0.07031,1.802198 10,0 0,8.10989 -10,0 0,-8.10989 z"
+       id="rect5083-6"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/main_instrumentview.svg b/GUI/coregui/images/main_instrumentview.svg
new file mode 100644
index 0000000..ef1aa8a
--- /dev/null
+++ b/GUI/coregui/images/main_instrumentview.svg
@@ -0,0 +1,353 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="main_instrumentview.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient3765">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3767" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3769" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3791"
+       x1="24"
+       y1="41"
+       x2="24"
+       y2="-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99497309,0,0,1.0105658,-0.76877828,0.80217941)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3805"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67450641,0,0,0.72943931,26.606296,35.64014)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3809"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65896376,0,0,0.72943931,47.09621,0.63835421)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3813"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67483679,0,0,0.71519929,40.554,0.77296688)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3817"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67211338,0,0,0.70095926,33.411627,0.93716645)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3821"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62994115,0,0,0.72231931,25.581295,0.80234289)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3825"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.68573034,0,0,0.70095923,33.673184,35.938951)"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3829"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66328251,0,0,0.69383922,40.239082,35.981005)"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3833"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.67450642,0,0,0.69383922,47.567173,35.87999)"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3837"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.68573034,-0.71519927,0,12.306164,28.621054)"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3841"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.67450642,-0.69383922,0,12.070325,35.504275)"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3845"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.66328251,-0.72231929,0,12.348215,42.316066)"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3849"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.65205859,-0.70807925,0,12.15443,48.988589)"
+       x1="-20.608927"
+       y1="4.5766449"
+       x2="-20.608927"
+       y2="15.071053" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3853"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.6296107,-0.70807925,0,47.194573,27.600487)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3857"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.68573029,-0.70807925,0,47.215494,35.649467)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3861"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.68573029,-0.69383922,0,46.988532,42.627059)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3865"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.65205854,-0.71519927,0,47.308054,49.027156)"
+       x1="-21"
+       y1="14"
+       x2="-21"
+       y2="3" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="15.072076"
+     inkscape:cy="24"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3791);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.99999976;marker:none;visibility:visible;display:inl [...]
+       d="m 10.486854,11.034159 c -0.7282412,0.07753 -1.3409106,0.772153 -1.3369945,1.515849 l 0,24.979923 c 7.81e-5,0.793676 0.7110306,1.515771 1.4924595,1.51585 l 24.874327,0 c 0.781428,-7.9e-5 1.492382,-0.722174 1.492459,-1.51585 l 0,-24.979923 c -7.7e-5,-0.793676 -0.711031,-1.515771 -1.492459,-1.515849 l -24.874327,0 c -0.05178,-0.0027 -0.10369,-0.0027 -0.155465,0 z"
+       id="rect3777"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3805);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="m 11.767155,39.948391 c -0.35316,3.8e-5 -0.674472,0.347516 -0.674507,0.729439 l 0,3.715582 c 3.5e-5,0.381922 0.321347,0.729401 0.674507,0.729439 l 1.686266,0 c 0.353161,-3.8e-5 0.674471,-0.347517 0.674506,-0.729439 l 0,-3.715582 c -3.5e-5,-0.381923 -0.321345,-0.729401 -0.674506,-0.729439 z"
+       id="rect3793"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3807"
+       d="m 32.599008,4.9466051 c -0.345023,3.82e-5 -0.658929,0.3475162 -0.658964,0.7294393 l 0,3.7155816 c 3.5e-5,0.3819227 0.313941,0.729402 0.658964,0.729439 l 1.647409,0 c 0.345023,-3.7e-5 0.65893,-0.3475163 0.658964,-0.729439 l 0,-3.7155816 C 34.905347,5.2941213 34.59144,4.9466433 34.246417,4.9466051 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3809);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3813);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="m 25.707591,4.9971126 c -0.353335,3.75e-5 -0.674802,0.3407321 -0.674837,0.7151994 l 0,3.6430464 c 3.5e-5,0.3744669 0.321502,0.7151616 0.674837,0.7151996 l 1.687092,0 c 0.353333,-3.8e-5 0.674801,-0.3407327 0.674836,-0.7151996 l 0,-3.6430464 C 28.069484,5.3378447 27.748016,4.9971501 27.394683,4.9971126 z"
+       id="path3811"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3815"
+       d="m 18.625134,5.077207 c -0.351909,3.67e-5 -0.672079,0.3339479 -0.672114,0.7009593 l 0,3.5705112 c 3.5e-5,0.367011 0.320205,0.7009225 0.672114,0.7009595 l 1.680283,0 c 0.351908,-3.7e-5 0.672078,-0.3339485 0.672113,-0.7009595 l 0,-3.5705112 C 20.977495,5.4111549 20.657325,5.0772437 20.305417,5.077207 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3817);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3821);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="m 11.72259,5.0685412 c -0.329828,3.78e-5 -0.629909,0.3441242 -0.629942,0.7223194 l 0,3.679314 c 3.3e-5,0.3781947 0.300114,0.7222814 0.629942,0.7223194 l 1.574853,0 c 0.329827,-3.8e-5 0.629908,-0.3441247 0.629941,-0.7223194 l 0,-3.679314 C 13.927351,5.4126654 13.62727,5.068579 13.297443,5.0685412 z"
+       id="path3819"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3823"
+       d="m 18.587116,40.078992 c -0.359037,3.7e-5 -0.685695,0.333948 -0.685731,0.700959 l 0,3.570511 c 3.6e-5,0.367011 0.326694,0.700923 0.685731,0.700959 l 1.714326,0 c 0.359038,-3.6e-5 0.685694,-0.333948 0.68573,-0.700959 l 0,-3.570511 c -3.6e-5,-0.367011 -0.326692,-0.700922 -0.68573,-0.700959 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3825);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3829);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="m 25.646866,40.078993 c -0.347284,3.6e-5 -0.663249,0.330556 -0.663283,0.693839 l 0,3.534244 c 3.4e-5,0.363283 0.315999,0.693803 0.663283,0.693839 l 1.658206,0 c 0.347285,-3.6e-5 0.663248,-0.330556 0.663283,-0.693839 l 0,-3.534244 c -3.5e-5,-0.363283 -0.315998,-0.693803 -0.663283,-0.693839 z"
+       id="path3827"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3831"
+       d="m 32.728031,39.977978 c -0.353161,3.6e-5 -0.674472,0.330556 -0.674507,0.693839 l 0,3.534244 c 3.5e-5,0.363283 0.321346,0.693803 0.674507,0.693839 l 1.686266,0 c 0.353161,-3.6e-5 0.674471,-0.330556 0.674506,-0.693839 l 0,-3.534244 c -3.5e-5,-0.363283 -0.321345,-0.693803 -0.674506,-0.693839 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3833);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3835"
+       d="M 8.0820167,13.534986 C 8.0819792,13.175949 7.7412845,12.849291 7.366818,12.849255 l -3.643047,0 c -0.3744665,3.6e-5 -0.7151621,0.326694 -0.7151988,0.685731 l 0,1.714326 c 3.67e-5,0.359038 0.3407323,0.685694 0.7151988,0.68573 l 3.643047,0 c 0.3744665,-3.6e-5 0.7151612,-0.326692 0.7151987,-0.68573 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3837);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       inkscape:transform-center-x="2.1866903"
+       inkscape:transform-center-y="2.2952591" />
+    <path
+       inkscape:transform-center-y="2.2576905"
+       inkscape:transform-center-x="2.1213828"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3841);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="M 7.9723357,20.665133 C 7.9722993,20.311972 7.6417797,19.990661 7.278497,19.990626 l -3.5342442,0 c -0.3632827,3.5e-5 -0.6938031,0.321346 -0.6938387,0.674507 l 0,1.686266 c 3.56e-5,0.353161 0.330556,0.674471 0.6938387,0.674506 l 3.5342442,0 c 0.3632827,-3.5e-5 0.6938023,-0.321345 0.6938387,-0.674506 z"
+       id="path3839"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3843"
+       d="M 8.0820168,27.72385 C 8.0819789,27.376566 7.7378925,27.060601 7.359698,27.060567 l -3.6793145,0 c -0.3781945,3.4e-5 -0.7222817,0.315999 -0.7223188,0.663283 l 0,1.658206 c 3.71e-5,0.347285 0.3441243,0.663248 0.7223188,0.663283 l 3.6793145,0 c 0.3781945,-3.5e-5 0.7222809,-0.315998 0.7223188,-0.663283 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3845);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       inkscape:transform-center-x="2.2084594"
+       inkscape:transform-center-y="2.2201224" />
+    <path
+       inkscape:transform-center-y="2.1825539"
+       inkscape:transform-center-x="2.1649211"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3849);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="M 7.9723357,34.6433 C 7.9722985,34.301893 7.6349956,33.991275 7.264257,33.991241 l -3.6067794,0 C 3.286739,33.991275 2.9494352,34.301893 2.9493989,34.6433 l 0,1.630146 c 3.63e-5,0.341409 0.3373401,0.652025 0.7080787,0.652059 l 3.6067794,0 c 0.3707386,-3.4e-5 0.7080415,-0.31065 0.7080787,-0.652059 z"
+       id="path3847"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3853);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="m 43.01248,13.749052 c -3.7e-5,-0.329655 -0.337341,-0.629578 -0.70808,-0.629611 l -3.606778,0 c -0.370739,3.3e-5 -0.708043,0.299956 -0.708079,0.629611 l 0,1.574026 c 3.6e-5,0.329654 0.33734,0.629578 0.708079,0.629611 l 3.606778,0 c 0.370739,-3.3e-5 0.708043,-0.299957 0.70808,-0.629611 z"
+       id="path3851"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3855"
+       d="m 43.033401,20.563401 c -3.7e-5,-0.359038 -0.337341,-0.685694 -0.70808,-0.68573 l -3.606778,0 c -0.370739,3.6e-5 -0.708043,0.326692 -0.708079,0.68573 l 0,1.714326 c 3.6e-5,0.359037 0.33734,0.685694 0.708079,0.68573 l 3.606778,0 c 0.370739,-3.6e-5 0.708043,-0.326693 0.70808,-0.68573 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3857);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3861);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+       d="m 42.890544,27.540993 c -3.7e-5,-0.359038 -0.330557,-0.685694 -0.69384,-0.68573 l -3.534243,0 c -0.363283,3.6e-5 -0.693803,0.326692 -0.693839,0.68573 l 0,1.714326 c 3.6e-5,0.359037 0.330556,0.685694 0.693839,0.68573 l 3.534243,0 c 0.363283,-3.6e-5 0.693803,-0.326693 0.69384,-0.68573 z"
+       id="path3859"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3863"
+       d="m 43.083908,34.681869 c -3.7e-5,-0.341409 -0.340733,-0.652025 -0.715199,-0.652059 l -3.643046,0 c -0.374467,3.4e-5 -0.715162,0.31065 -0.715199,0.652059 l 0,1.630146 c 3.7e-5,0.341407 0.340732,0.652024 0.715199,0.652058 l 3.643046,0 c 0.374466,-3.4e-5 0.715162,-0.310651 0.715199,-0.652058 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3865);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inl [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/main_jobview.svg b/GUI/coregui/images/main_jobview.svg
new file mode 100644
index 0000000..8b7d5cc
--- /dev/null
+++ b/GUI/coregui/images/main_jobview.svg
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="main_jobview.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,-0.49893682,3.6421611)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.95964496,-0.80812204)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,3.0304576,-18.009648)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,7.0205601,6.7302795)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,10.680337,22.363516)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,14.89975,-6.9297554)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(0.15152288,4.939595)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.15152288,8.8878555)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-31.874979,3.7056015)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-32.309483,7.6451953)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-32.208468,11.275024)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(0.15152293,1.0923495)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,53.784305,-81.014234)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.08009431,12.999894)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-31.874981,15.053608)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.8994949"
+     inkscape:cx="21.676641"
+     inkscape:cy="1.7766441"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4625);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 18.992385,38.042893 0,0.44388 0,1.109701 0,0.443881 0.493451,0 18.04181,0 0.493451,0 0,-0.443881 0,-1.109701 0,-0.44388 -0.493451,0 -18.04181,0 z"
+       id="rect4603"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4656);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 19.852855,29.535628 a 1.0001,1.0001 0 0 0 -0.78125,1 l 0,5.5625 a 1.0001,1.0001 0 0 0 1,1 l 1.0625,0 a 1.0001,1.0001 0 0 0 1,-1 l 0,-5.5625 a 1.0001,1.0001 0 0 0 -1,-1 l -1.0625,0 a 1.0001,1.0001 0 0 0 -0.21875,0 z"
+       id="rect4605"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4666"
+       d="m 23.842957,26.103832 a 1.0001,1.4539366 0 0 0 -0.78125,1.453791 l 0,8.086714 a 1.0001,1.4539366 0 0 0 1,1.453791 l 1.0625,0 a 1.0001,1.4539366 0 0 0 1,-1.453791 l 0,-8.086714 a 1.0001,1.4539366 0 0 0 -1,-1.453791 l -1.0625,0 a 1.0001,1.4539366 0 0 0 -0.21875,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4668);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4672);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 27.83306,30.999149 a 1.0001,0.7998779 0 0 0 -0.78125,0.799798 l 0,4.448876 a 1.0001,0.7998779 0 0 0 1,0.799798 l 1.0625,0 a 1.0001,0.7998779 0 0 0 1,-0.799798 l 0,-4.448876 a 1.0001,0.7998779 0 0 0 -1,-0.799798 l -1.0625,0 a 1.0001,0.7998779 0 0 0 -0.21875,0 z"
+       id="path4670"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4674"
+       d="m 31.836052,34.077632 a 1.0165924,0.38608568 0 0 0 -0.794134,0.386047 l 0,2.147387 a 1.0165924,0.38608568 0 0 0 1.01649,0.386047 l 1.080022,0 a 1.0165924,0.38608568 0 0 0 1.016491,-0.386047 l 0,-2.147387 A 1.0165924,0.38608568 0 0 0 33.13843,34.077632 l -1.080022,0 a 1.0165924,0.38608568 0 0 0 -0.222356,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4676);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path4678"
+       d="M 35.71225,28.273899 A 1.0001,1.1602776 0 0 0 34.931,29.434061 l 0,6.453398 a 1.0001,1.1602776 0 0 0 1,1.160162 l 1.0625,0 a 1.0001,1.1602776 0 0 0 1,-1.160162 l 0,-6.453398 a 1.0001,1.1602776 0 0 0 -1,-1.160162 l -1.0625,0 a 1.0001,1.1602776 0 0 0 -0.21875,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4680);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4696"
+       d="m 10.055584,9.0974258 0,0.5 0,1.9999992 0,0.5 0.5,0 1.999999,0 0.5,0 0,-0.5 0,-1.9999992 0,-0.5 -0.5,0 -1.999999,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4726);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4700);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 10.055584,12.94467 0,0.5 0,2 0,0.5 0.5,0 1.999999,0 0.5,0 0,-0.5 0,-2 0,-0.5 -0.5,0 -1.999999,0 z"
+       id="path4698"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4702"
+       d="m 10.055584,16.892931 0,0.5 0,2 0,0.5 0.5,0 1.999999,0 0.5,0 0,-0.5 0,-2 0,-0.5 -0.5,0 -1.999999,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4704);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4712);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 14.045686,9.0152289 0,0.3316413 0,1.3265648 0,0.33164 2.318275,0 9.273097,0 2.318276,0 0,-0.33164 0,-1.3265648 0,-0.3316413 -2.318276,0 -9.273097,0 z"
+       id="path4710"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4714"
+       d="m 13.94467,12.954824 0,0.331641 0,1.326564 0,0.331641 2.33511,0 9.340441,0 2.335112,0 0,-0.331641 0,-1.326564 0,-0.331641 -2.335112,0 -9.340441,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4716);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4720);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 14.045685,16.965848 0,0.355451 0,1.421803 0,0.355449 2.33511,0 9.340441,0 2.335112,0 0,-0.355449 0,-1.421803 0,-0.355451 -2.335112,0 -9.340441,0 z"
+       id="path4718"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4759);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00000048;marker:none;visibility:visible;display:inl [...]
+       d="m 7.5611959,2.9857658 c -1.3020416,1.31e-4 -2.4866543,1.191039 -2.4867846,2.5 l 0,37.0312502 c 1.303e-4,1.30896 1.184743,2.49987 2.4867846,2.5 l 33.0431511,0 c 1.302042,-1.3e-4 2.486654,-1.19104 2.486784,-2.5 l 0,-37.0312502 c -1.3e-4,-1.308961 -1.184742,-2.499869 -2.486784,-2.5 l -33.0431511,0 z m 1.8029188,3.125 29.1886353,0 c 0.735058,7.4e-5 1.398742,0.668616 1.398816,1.40625 l 0,33.0937502 c -7.4e-5,0.73764 -0.663758,1.40617 -1.398816,1.40625 l -29.1886353,0 c -0.7350587,-8 [...]
+       id="path4748"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4765);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 9.9841554,21.004969 0,0.5 0,2 0,0.5 0.4999996,0 1.999999,0 0.5,0 0,-0.5 0,-2 0,-0.5 -0.5,0 -1.999999,0 z"
+       id="path4761"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4763"
+       d="m 14.045685,20.935029 0,0.367355 0,1.469423 0,0.367354 2.318274,0 9.273098,0 2.318276,0 0,-0.367354 0,-1.469423 0,-0.367355 -2.318276,0 -9.273098,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4767);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/main_sampleview.svg b/GUI/coregui/images/main_sampleview.svg
new file mode 100644
index 0000000..15023de
--- /dev/null
+++ b/GUI/coregui/images/main_sampleview.svg
@@ -0,0 +1,207 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="main_sampleview.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient3934">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3936" />
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop3938" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3926">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3928" />
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:1;"
+         offset="1"
+         id="stop3930" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3926"
+       id="linearGradient3932"
+       x1="21.921103"
+       y1="14.196907"
+       x2="22.007036"
+       y2="9.24716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,2.9294424)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3934"
+       id="linearGradient3940"
+       x1="9.8173399"
+       y1="9.9388962"
+       x2="9.7546148"
+       y2="3.4739203"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,1.9192899)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3926"
+       id="linearGradient3944"
+       gradientUnits="userSpaceOnUse"
+       x1="21.921103"
+       y1="14.196907"
+       x2="22.007036"
+       y2="9.24716"
+       gradientTransform="translate(0,11.111678)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3926"
+       id="linearGradient3948"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.0346452,0.10101525,18.609014)"
+       x1="21.921103"
+       y1="14.196907"
+       x2="22.007036"
+       y2="9.24716" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3926"
+       id="linearGradient3952"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.10101525,27.072088)"
+       x1="21.921103"
+       y1="14.196907"
+       x2="22.007036"
+       y2="9.24716" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3926"
+       id="linearGradient3956"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.10101525,27.981225)"
+       x1="21.921103"
+       y1="14.196907"
+       x2="22.007036"
+       y2="9.24716" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3934"
+       id="linearGradient3960"
+       gradientUnits="userSpaceOnUse"
+       x1="9.8173399"
+       y1="9.9388962"
+       x2="9.7546148"
+       y2="3.4739203"
+       gradientTransform="translate(14.041121,1.9192898)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3934"
+       id="linearGradient3964"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(28.183256,2.1213204)"
+       x1="9.8173399"
+       y1="9.9388962"
+       x2="9.7546148"
+       y2="3.4739203" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="-8.0723434"
+     inkscape:cy="24"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3940);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;ove [...]
+       d="m 9.9374997,6.4505399 c -2.7409756,0 -4.9687497,2.2428958 -4.9687497,4.9999991 0,0.01465 -3.203e-4,0.0358 0,0.0625 l 0,0.5 0.5,0 8.9375,0 0.46875,0 0.03125,-0.5 c 3.22e-4,-0.02673 0,-0.04787 0,-0.0625 0,-2.7571033 -2.227775,-4.9999991 -4.9687503,-4.9999991 z"
+       id="path3871"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ssccccccss" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3932);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988px;marker:none;visibility:visible;display:i [...]
+       d="m 3.03125,13.951238 0,0.452925 0,2.009854 0,0.452925 0.5,0 40.90625,0 0.5,0 0,-0.452925 0,-2.009854 0,-0.452925 -0.5,0 -40.90625,0 z"
+       id="rect3916"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3942"
+       d="m 3.03125,22.133474 0,0.452925 0,2.009854 0,0.452925 0.5,0 40.90625,0 0.5,0 0,-0.452925 0,-2.009854 0,-0.452925 -0.5,0 -40.90625,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3944);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988px;marker:none;visibility:visible;display:i [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3948);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988px;marker:none;visibility:visible;display:i [...]
+       d="m 3.1322653,30.012664 0,0.468617 0,2.079486 0,0.468616 0.5,0 40.9062497,0 0.5,0 0,-0.468616 0,-2.079486 0,-0.468617 -0.5,0 -40.9062497,0 z"
+       id="path3946"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3950"
+       d="m 3.1322653,38.093885 0,0.452925 0,2.009854 0,0.452925 0.5,0 40.9062497,0 0.5,0 0,-0.452925 0,-2.009854 0,-0.452925 -0.5,0 -40.9062497,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3952);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988px;marker:none;visibility:visible;display:i [...]
+    <path
+       sodipodi:nodetypes="ssccccccss"
+       inkscape:connector-curvature="0"
+       id="path3958"
+       d="m 23.978621,6.4505398 c -2.740976,0 -4.96875,2.2428961 -4.96875,5.0000002 0,0.01465 -3.21e-4,0.0358 0,0.0625 l 0,0.5 0.5,0 8.9375,0 0.46875,0 0.03125,-0.5 c 3.22e-4,-0.02673 0,-0.04787 0,-0.0625 0,-2.7571041 -2.227775,-5.0000002 -4.96875,-5.0000002 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3960);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;ove [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3964);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;ove [...]
+       d="m 38.120756,6.6525704 c -2.740976,0 -4.96875,2.2428958 -4.96875,4.9999996 0,0.01465 -3.21e-4,0.0358 0,0.0625 l 0,0.5 0.5,0 8.9375,0 0.46875,0 0.03125,-0.5 c 3.22e-4,-0.02673 0,-0.04787 0,-0.0625 0,-2.7571038 -2.227775,-4.9999996 -4.96875,-4.9999996 z"
+       id="path3962"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ssccccccss" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/main_sessionmodel.svg b/GUI/coregui/images/main_sessionmodel.svg
new file mode 100644
index 0000000..a1e41b5
--- /dev/null
+++ b/GUI/coregui/images/main_sessionmodel.svg
@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="main_sessionmodel.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient3765">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3767" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3769" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient3771"
+       x1="26"
+       y1="43"
+       x2="26.111572"
+       y2="-4.0193973"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.90876041,0,0,1.0336717,-56.997994,-8.8095796)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4505"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4507"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4509"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4511"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4513"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4515"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4517"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4519"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4521"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4523"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4525"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4527"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4529"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4531"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4533"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4535"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4537"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4539"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3765"
+       id="linearGradient4541"
+       gradientUnits="userSpaceOnUse"
+       x1="-255.26595"
+       y1="-109.97279"
+       x2="-287.26593"
+       y2="-146.97279" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="16.581924"
+     inkscape:cy="20.626546"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="m -48.36477,4.1113174 0,0.516836 0,26.8754646 0,0.516836 0.45438,0 27.262813,0 0.45438,0 0,-0.516836 0,-26.8754646 0,-0.516836 -0.45438,0 -27.262813,0 z"
+       id="rect2991"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <g
+       id="g4479"
+       transform="matrix(1.0294216,0,0,1.0294216,295.75276,151.18995)"
+       style="fill:url(#linearGradient4505);fill-opacity:1">
+      <g
+         id="Settings"
+         style="fill:url(#linearGradient4511);fill-opacity:1">
+        <g
+           id="g4439"
+           style="fill:url(#linearGradient4509);fill-opacity:1">
+          <path
+             id="path4441"
+             d="m -247.27788,-125.80737 c -0.0537,-0.47795 -0.61103,-0.83711 -1.09291,-0.83711 -1.55794,0 -2.94043,-0.91478 -3.52022,-2.32953 -0.59231,-1.44903 -0.21038,-3.13892 0.95071,-4.204 0.36549,-0.33411 0.40989,-0.8934 0.10335,-1.28191 -0.79738,-1.01257 -1.70368,-1.92723 -2.69323,-2.71993 -0.38749,-0.31096 -0.95602,-0.2677 -1.29203,0.10436 -1.01333,1.12226 -2.83354,1.53936 -4.24006,0.95249 -1.4637,-0.61572 -2.38671,-2.09891 -2.29638,-3.69102 0.0297,-0.50008 -0.33576,-0.9349 -0.834 [...]
+             style="clip-rule:evenodd;fill:url(#linearGradient4507);fill-opacity:1;fill-rule:evenodd"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+      <g
+         id="g4443"
+         style="fill:url(#linearGradient4513);fill-opacity:1" />
+      <g
+         id="g4445"
+         style="fill:url(#linearGradient4515);fill-opacity:1" />
+      <g
+         id="g4447"
+         style="fill:url(#linearGradient4517);fill-opacity:1" />
+      <g
+         id="g4449"
+         style="fill:url(#linearGradient4519);fill-opacity:1" />
+      <g
+         id="g4451"
+         style="fill:url(#linearGradient4521);fill-opacity:1" />
+      <g
+         id="g4453"
+         style="fill:url(#linearGradient4523);fill-opacity:1" />
+      <g
+         id="g4455"
+         style="fill:url(#linearGradient4525);fill-opacity:1" />
+      <g
+         id="g4457"
+         style="fill:url(#linearGradient4527);fill-opacity:1" />
+      <g
+         id="g4459"
+         style="fill:url(#linearGradient4529);fill-opacity:1" />
+      <g
+         id="g4461"
+         style="fill:url(#linearGradient4531);fill-opacity:1" />
+      <g
+         id="g4463"
+         style="fill:url(#linearGradient4533);fill-opacity:1" />
+      <g
+         id="g4465"
+         style="fill:url(#linearGradient4535);fill-opacity:1" />
+      <g
+         id="g4467"
+         style="fill:url(#linearGradient4537);fill-opacity:1" />
+      <g
+         id="g4469"
+         style="fill:url(#linearGradient4539);fill-opacity:1" />
+      <g
+         id="g4471"
+         style="fill:url(#linearGradient4541);fill-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/GUI/coregui/images/main_simulationview.svg b/GUI/coregui/images/main_simulationview.svg
new file mode 100644
index 0000000..946ffec
--- /dev/null
+++ b/GUI/coregui/images/main_simulationview.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="main_simulationview.svg"
+   inkscape:export-filename="/home/pospelov/development/BornAgain/artwork/icons/mainwindow/simulation/main_simulation1.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient3943">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3945" />
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:1;"
+         offset="1"
+         id="stop3947" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3789">
+      <stop
+         style="stop-color:#bbbbbb;stop-opacity:1;"
+         offset="0"
+         id="stop3791" />
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:1;"
+         offset="1"
+         id="stop3793" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3789"
+       id="linearGradient3795"
+       x1="29"
+       y1="38"
+       x2="5"
+       y2="7"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3943"
+       id="linearGradient3949"
+       x1="25.773111"
+       y1="32.89315"
+       x2="4.6256304"
+       y2="8.9645777"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.0841348,-0.21428572,-2.1013415)" />
+    <filter
+       id="filter3044"
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood3046"
+         flood-opacity="0.75"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3048"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3050"
+         in="composite"
+         stdDeviation="0.5"
+         result="blur" />
+      <feOffset
+         id="feOffset3052"
+         dx="0.5"
+         dy="0.5"
+         result="offset" />
+      <feComposite
+         id="feComposite3054"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="14"
+     inkscape:cx="12.84527"
+     inkscape:cy="24.071429"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="M 6.9032514,7.752531 C 5.1355853,7.84576 4.2355904,9.5557606 4.2312698,10.795361 l -0.050508,13.243882 -0.050508,12.970099 c 0.00432,0.867908 0.7606323,2.703339 1.8365344,3.136041 1.0759021,0.432703 2.4812499,0.431956 3.5562097,-0.0018 L 26.795308,33.175308 43.785715,26.086163 c 1.065558,-0.436955 1.339916,-1.219344 1.339916,-2.083139 0,-0.863793 -0.274358,-1.816445 -1.339916,-2.2534 L 26.795308,14.903181 9.5229987,7.934996 C 8.9077374,7.6856211 7.6124635,7.7159266 6.9032514,7. [...]
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccscccscccc"
+       id="path2999" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/main_welcomeview.svg b/GUI/coregui/images/main_welcomeview.svg
new file mode 100644
index 0000000..c74eaab
--- /dev/null
+++ b/GUI/coregui/images/main_welcomeview.svg
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48px"
+   height="48px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="main_welcomeview.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient3949">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3951" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3953" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3943"
+       is_visible="true" />
+    <linearGradient
+       id="linearGradient3933">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3935" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3937" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3882">
+      <stop
+         style="stop-color:#c3c300;stop-opacity:1;"
+         offset="0"
+         id="stop3884" />
+      <stop
+         style="stop-color:#1a0000;stop-opacity:0;"
+         offset="1"
+         id="stop3886" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3882"
+       id="linearGradient3888"
+       x1="2.3714912"
+       y1="15.73394"
+       x2="44.331604"
+       y2="15.73394"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3933"
+       id="linearGradient3939"
+       x1="23.375"
+       y1="29.21442"
+       x2="24.184053"
+       y2="-2.0712936"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3949"
+       id="linearGradient3955"
+       x1="-23.50675"
+       y1="84.227478"
+       x2="-23.221035"
+       y2="33.013195"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(47.857143,-37.428571)" />
+    <filter
+       id="filter3957"
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood3959"
+         flood-opacity="0.5"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3961"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3963"
+         in="composite"
+         stdDeviation="0.5"
+         result="blur" />
+      <feOffset
+         id="feOffset3965"
+         dx="0"
+         dy="0.5"
+         result="offset" />
+      <feComposite
+         id="feComposite3967"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+    <filter
+       id="filter3969"
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood3971"
+         flood-opacity="0.5"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3973"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3975"
+         in="composite"
+         stdDeviation="0.5"
+         result="blur" />
+      <feOffset
+         id="feOffset3977"
+         dx="0"
+         dy="0.5"
+         result="offset" />
+      <feComposite
+         id="feComposite3979"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.9497475"
+     inkscape:cx="10.277058"
+     inkscape:cy="40.422413"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background: [...]
+       d="m 25.241071,5.5758929 c -0.741297,-0.1866608 -1.593139,-0.1334086 -2.21875,0.25 -0.136056,0.083382 -0.153034,0.1327491 -0.25,0.21875 -0.09697,0.086001 -0.219993,0.2000468 -0.375,0.34375 -0.310013,0.2874063 -0.734511,0.665147 -1.25,1.15625 -1.030979,0.982206 -2.41179,2.3341125 -3.96875,3.8437501 -3.113921,3.019275 -6.890686,6.718509 -9.6874997,9.499999 l -4.53125,4.5 -0.15625,0.15625 0,0.21875 0,0.6875 c 0,0.59595 0.104472,0.994547 0.34375,1.34375 0.178875,0.261049 0.349181,0.48 [...]
+       id="path3880"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="sscsssccccsssscscssssscssssssccsssccccssssss" />
+    <path
+       style="fill:url(#linearGradient3955);fill-opacity:1;fill-rule:evenodd;stroke:none;filter:url(#filter3969)"
+       d="m 33.850384,44.657366 c -1.866071,-0.04881 -3.838434,-0.09196 -4.383029,-0.09589 l -0.990172,-0.0072 0.02589,-5.543201 0.02589,-5.5432 -0.723145,-0.662932 -0.723145,-0.662932 -0.49114,-0.04242 c -0.270128,-0.02333 -1.434542,-0.0633 -2.587587,-0.08882 l -2.096444,-0.04641 -0.635699,0.632753 -0.635698,0.632753 0,5.697918 0,5.697918 -4.625,-0.0038 -4.625,-0.0038 -0.75,-0.896176 -0.75,-0.896176 -0.04407,-1.367902 c -0.02424,-0.752346 -0.04835,-4.344381 -0.05357,-7.9823 l -0.0095,-6 [...]
+       id="path3947"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/mode_script.png b/GUI/coregui/images/mode_script.png
new file mode 100644
index 0000000..e74d73d
Binary files /dev/null and b/GUI/coregui/images/mode_script.png differ
diff --git a/GUI/coregui/images/reset.png b/GUI/coregui/images/reset.png
new file mode 100644
index 0000000..27442ef
Binary files /dev/null and b/GUI/coregui/images/reset.png differ
diff --git a/GUI/coregui/images/splashscreen.png b/GUI/coregui/images/splashscreen.png
new file mode 100644
index 0000000..aedec65
Binary files /dev/null and b/GUI/coregui/images/splashscreen.png differ
diff --git a/GUI/coregui/images/statusbar_dockmenu.svg b/GUI/coregui/images/statusbar_dockmenu.svg
new file mode 100644
index 0000000..8ef6f62
--- /dev/null
+++ b/GUI/coregui/images/statusbar_dockmenu.svg
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="statusbar_dockmenu.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3842"
+       x1="15.25"
+       y1="45.42857"
+       x2="-1.8214296"
+       y2="31.214285"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.180851,0,-7.2519001)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3865"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.62755996,0,0,-0.47506245,26.451121,61.449025)"
+       x1="10.561905"
+       y1="40.022835"
+       x2="72.974625"
+       y2="40.232647" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.5182754,0.47506245,0,-14.41469,55.234524)"
+       x1="49.54509"
+       y1="30.625572"
+       x2="7.64222"
+       y2="54.892372" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3877-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.5182754,0.47506245,0,-7.4788288,55.196725)"
+       x1="49.54509"
+       y1="30.625572"
+       x2="7.64222"
+       y2="54.892372" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28"
+     inkscape:cx="-3.755347"
+     inkscape:cy="13.567461"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <rect
+       style="fill:none;stroke:url(#linearGradient3842);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3066"
+       width="14.071428"
+       height="11.892857"
+       x="0.96428573"
+       y="34.035717" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3865);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 14.056812,43.040356 0,-0.237531 0,-0.593829 0,-0.237531 -0.313782,0 -11.47258,0 -0.3137789,0 0,0.237531 0,0.593829 0,0.237531 0.3137789,0 11.47258,0 z"
+       id="path3863"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:transform-center-x="1.9282711"
+       inkscape:transform-center-y="-1.3571429" />
+    <path
+       inkscape:transform-center-y="-1.592478"
+       inkscape:transform-center-x="-1.3571434"
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3875"
+       d="m 3.9939791,44.998584 0.237531,0 0.593829,0 0.237531,0 0,-0.25914 0,-9.474722 0,-0.259136 -0.237531,0 -0.593829,0 -0.237531,0 0,0.259136 0,9.474722 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3877);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+    <path
+       inkscape:transform-center-y="-1.592478"
+       inkscape:transform-center-x="-1.3571434"
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3875-6"
+       d="m 10.92984,44.960785 0.237531,0 0.593829,0 0.237531,0 0,-0.25914 0,-9.474722 0,-0.259136 -0.237531,0 -0.593829,0 -0.237531,0 0,0.259136 0,9.474722 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/statusbar_joblist.svg b/GUI/coregui/images/statusbar_joblist.svg
new file mode 100644
index 0000000..2aec2b2
--- /dev/null
+++ b/GUI/coregui/images/statusbar_joblist.svg
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="statusbar_joblist.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3842"
+       x1="15.25"
+       y1="45.42857"
+       x2="-1.8214296"
+       y2="31.214285"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.180851,0,-7.2519001)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.5182754,0.47506245,0,-14.41469,55.234524)"
+       x1="49.54509"
+       y1="30.625572"
+       x2="7.64222"
+       y2="54.892372" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28"
+     inkscape:cx="-3.755347"
+     inkscape:cy="13.567461"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <rect
+       style="fill:none;stroke:url(#linearGradient3842);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3066"
+       width="14.071428"
+       height="11.892857"
+       x="0.96428573"
+       y="34.035717" />
+    <path
+       inkscape:transform-center-y="-1.592478"
+       inkscape:transform-center-x="-1.3571434"
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3875"
+       d="m 3.9939791,44.998584 0.237531,0 0.593829,0 0.237531,0 0,-0.25914 0,-9.474722 0,-0.259136 -0.237531,0 -0.593829,0 -0.237531,0 0,0.259136 0,9.474722 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3877);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_cloneitem.svg b/GUI/coregui/images/toolbar16light_cloneitem.svg
new file mode 100644
index 0000000..0714d91
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_cloneitem.svg
@@ -0,0 +1,458 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar16light_cloneitem.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4036">
+      <stop
+         id="stop4038"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4040"
+         offset="1"
+         style="stop-color:#fafafa;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3915"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#3861a5;stop-opacity:1;"
+         offset="0"
+         id="stop3917" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3848">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3850" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3852" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3833"
+       is_visible="true" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31106614,0,0,0.89898439,2.626397,-10.405893)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-26.774162"
+       y1="81.827995"
+       x2="-26.743744"
+       y2="203.22453"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31451541,0,0,0.28466368,35.273649,8.7875589)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3848"
+       id="linearGradient3854"
+       x1="7.2781744"
+       y1="31.824934"
+       x2="7.1922593"
+       y2="42.052731"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3848"
+       id="linearGradient3858"
+       gradientUnits="userSpaceOnUse"
+       x1="7.2781744"
+       y1="31.824934"
+       x2="7.1922593"
+       y2="42.052731"
+       gradientTransform="matrix(0,1,-1,0,48.340927,29.754123)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3872"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,37.027218,27.986356)"
+       x1="3.4395947"
+       y1="39.956661"
+       x2="16.914978"
+       y2="40.158695" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3874"
+       gradientUnits="userSpaceOnUse"
+       x1="7.6822352"
+       y1="39.047523"
+       x2="7.5963202"
+       y2="43.290169"
+       gradientTransform="translate(-15.127034,3.7628182)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3897"
+       gradientUnits="userSpaceOnUse"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientTransform="translate(-10.657109,-15.909903)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3899"
+       gradientUnits="userSpaceOnUse"
+       x1="7.6822352"
+       y1="39.047523"
+       x2="7.5963202"
+       y2="43.290169"
+       gradientTransform="translate(-10.657109,-15.909903)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3901"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,37.355518,16.167571)"
+       x1="3.4395947"
+       y1="39.956661"
+       x2="16.914978"
+       y2="40.158695" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3143"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.30975638,-0.87653693,0,52.266913,15.849803)"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3943"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(22.905208,-2.0203051)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3997"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,0.67452678,2.1207853)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4011"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,0.67452678,-29.879215)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4016"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,11.710443,-3.0562468)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4034"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,0.67452678,-29.879215)"
+       x1="14.786269"
+       y1="45.429859"
+       x2="-6.9746428"
+       y2="26.027195" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4212"
+       x1="18.407694"
+       y1="13.149961"
+       x2="6.4221311"
+       y2="-1.5061263"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4214"
+       gradientUnits="userSpaceOnUse"
+       x1="18.407694"
+       y1="13.149961"
+       x2="6.4221311"
+       y2="-1.5061263" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28"
+     inkscape:cx="0.38261259"
+     inkscape:cy="10.305715"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       style="fill:none;stroke:url(#linearGradient4034);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       d="M 14.030441 10.038565 L 14.030441 13.514452 L 2.081491 13.514452 L 2.081491 3.0554771 L 2.081491 3.0554771 L 6.9298868 3.0554771 "
+       id="path4014"
+       transform="translate(0,32)" />
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Adobe Helvetica';-inkscape-font-specification:'Adobe Helvetica, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4212);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.41975307"
+       id="text5800"
+       transform="matrix(0.86413494,0,0,0.91868209,-2.0608723,27.805825)">
+      <path
+         d="m 16.495026,11.509247 q 0.585937,0 0.952148,-0.322266 0.366211,-0.322265 0.380859,-0.856933 l 1.984864,0 q -0.0073,0.805664 -0.439453,1.479492 -0.432129,0.666504 -1.186524,1.040039 -0.74707,0.366211 -1.655273,0.366211 -1.699219,0 -2.680664,-1.07666 -0.981446,-1.083985 -0.981446,-2.9882816 l 0,-0.1391602 q 0,-1.8310547 0.974121,-2.9223632 0.974122,-1.0913086 2.67334,-1.0913086 1.486817,0 2.380371,0.8496093 0.900879,0.8422852 0.915528,2.2485352 l -1.984864,0 Q 17.813385,7.48092 [...]
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Adobe Helvetica';-inkscape-font-specification:'Adobe Helvetica, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient4214);fill-opacity:1;stroke:none;stroke-opacity:0.41975307"
+         id="path5805"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_newitem.svg b/GUI/coregui/images/toolbar16light_newitem.svg
new file mode 100644
index 0000000..9e4f178
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_newitem.svg
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar16light_newitem.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4036">
+      <stop
+         id="stop4038"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4040"
+         offset="1"
+         style="stop-color:#fafafa;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3915"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#3861a5;stop-opacity:1;"
+         offset="0"
+         id="stop3917" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3848">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3850" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3852" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3833"
+       is_visible="true" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31106614,0,0,0.89898439,2.626397,-10.405893)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38.607952"
+       x2="17.305294"
+       y2="30.0868"
+       gradientTransform="matrix(0.6618396,0,0,1.0574115,-2.2315793,0.90848144)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-26.774162"
+       y1="81.827995"
+       x2="-26.743744"
+       y2="203.22453"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31451541,0,0,0.28466368,35.273649,8.7875589)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3848"
+       id="linearGradient3854"
+       x1="7.2781744"
+       y1="31.824934"
+       x2="7.1922593"
+       y2="42.052731"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3848"
+       id="linearGradient3858"
+       gradientUnits="userSpaceOnUse"
+       x1="7.2781744"
+       y1="31.824934"
+       x2="7.1922593"
+       y2="42.052731"
+       gradientTransform="matrix(0,1,-1,0,48.340927,29.754123)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3872"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,37.027218,27.986356)"
+       x1="3.4395947"
+       y1="39.956661"
+       x2="16.914978"
+       y2="40.158695" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3874"
+       gradientUnits="userSpaceOnUse"
+       x1="7.6822352"
+       y1="39.047523"
+       x2="7.5963202"
+       y2="43.290169"
+       gradientTransform="translate(-15.127034,3.7628182)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3897"
+       gradientUnits="userSpaceOnUse"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientTransform="translate(-10.657109,-15.909903)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3899"
+       gradientUnits="userSpaceOnUse"
+       x1="7.6822352"
+       y1="39.047523"
+       x2="7.5963202"
+       y2="43.290169"
+       gradientTransform="translate(-10.657109,-15.909903)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3901"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,-1,0,37.355518,16.167571)"
+       x1="3.4395947"
+       y1="39.956661"
+       x2="16.914978"
+       y2="40.158695" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3143"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.30975638,-0.87653693,0,52.266913,15.849803)"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3943"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(22.905208,-2.0203051)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3997"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,0.67452678,2.1207853)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4011"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,0.67452678,-29.879215)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4016"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,11.710443,-3.0562468)"
+       x1="7.4656301"
+       y1="45.916565"
+       x2="1.1206665"
+       y2="32.279503" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4020"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.6618396,-1.0526927,0,47.905649,22.75437)"
+       x1="25.291691"
+       y1="29.495218"
+       x2="14.4453"
+       y2="37.945164" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4034"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,0.67452678,-29.879215)"
+       x1="14.786269"
+       y1="45.429859"
+       x2="-6.9746428"
+       y2="26.027195" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28"
+     inkscape:cx="5.4718983"
+     inkscape:cy="10.305715"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       style="fill:none;stroke:url(#linearGradient4034);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       d="M 14.030441 10.038565 L 14.030441 13.514452 L 2.081491 13.514452 L 2.081491 3.0554771 L 2.081491 3.0554771 L 6.9298868 3.0554771 "
+       id="path4014"
+       transform="translate(0,32)" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4666"
+       d="m 11.542957,32.994311 a 0.66190579,1.0575172 0 0 0 -0.517062,1.057411 l 0,5.881852 a 0.66190579,1.0575172 0 0 0 0.66184,1.057411 l 0.703204,0 a 0.66190579,1.0575172 0 0 0 0.66184,-1.057411 l 0,-5.881852 a 0.66190579,1.0575172 0 0 0 -0.66184,-1.057411 l -0.703204,0 a 0.66190579,1.0575172 0 0 0 -0.144778,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4668);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4020);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+       d="m 15.963006,36.528906 a 1.0527979,0.66190579 0 0 0 -1.052691,-0.517062 l -5.8556044,0 a 1.0527979,0.66190579 0 0 0 -1.0526923,0.66184 l 0,0.703204 a 1.0527979,0.66190579 0 0 0 1.0526923,0.66184 l 5.8556044,0 a 1.0527979,0.66190579 0 0 0 1.052691,-0.66184 l 0,-0.703204 a 1.0527979,0.66190579 0 0 0 0,-0.144778 z"
+       id="path4018"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_projections.svg b/GUI/coregui/images/toolbar16light_projections.svg
new file mode 100644
index 0000000..6922868
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_projections.svg
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar16light_projections.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3842"
+       x1="15.25"
+       y1="45.42857"
+       x2="-1.8214296"
+       y2="31.214285"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.180851,0,-7.2519001)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3865"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.62755996,0,0,-0.47506245,26.451121,61.449025)"
+       x1="10.561905"
+       y1="40.022835"
+       x2="72.974625"
+       y2="40.232647" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.5182754,0.47506245,0,-14.41469,55.234524)"
+       x1="49.54509"
+       y1="30.625572"
+       x2="7.64222"
+       y2="54.892372" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.8994949"
+     inkscape:cx="-8.8446327"
+     inkscape:cy="13.567461"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <rect
+       style="fill:none;stroke:url(#linearGradient3842);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3066"
+       width="14.071428"
+       height="11.892857"
+       x="0.96428573"
+       y="34.035717" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3865);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+       d="m 14.056812,43.040356 0,-0.237531 0,-0.593829 0,-0.237531 -0.313782,0 -11.47258,0 -0.3137789,0 0,0.237531 0,0.593829 0,0.237531 0.3137789,0 11.47258,0 z"
+       id="path3863"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:transform-center-x="1.9282711"
+       inkscape:transform-center-y="-1.3571429" />
+    <path
+       inkscape:transform-center-y="-1.592478"
+       inkscape:transform-center-x="-1.3571434"
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3875"
+       d="m 3.9939791,44.998584 0.237531,0 0.593829,0 0.237531,0 0,-0.25914 0,-9.474722 0,-0.259136 -0.237531,0 -0.593829,0 -0.237531,0 0,0.259136 0,9.474722 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3877);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_propertypanel.svg b/GUI/coregui/images/toolbar16light_propertypanel.svg
new file mode 100644
index 0000000..feef1d2
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_propertypanel.svg
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar16light_propertypanel.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3045"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.57754839,-0.47506245,0,29.449857,23.442116)"
+       x1="40.269428"
+       y1="37.76749"
+       x2="7.64222"
+       y2="54.892372" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3842"
+       x1="15.25"
+       y1="45.42857"
+       x2="-1.8214296"
+       y2="31.214285"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.180851,0,-7.2519001)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28"
+     inkscape:cx="9.8913153"
+     inkscape:cy="20.070975"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3043"
+       d="m 11.041187,34.848697 -0.237531,0 -0.593829,0 -0.2375313,0 0,0.288775 0,10.558306 0,0.288774 0.2375313,0 0.593829,0 0.237531,0 0,-0.288774 0,-10.558306 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3045);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+    <rect
+       style="fill:none;stroke:url(#linearGradient3842);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3066"
+       width="14.071428"
+       height="11.892857"
+       x="0.96428573"
+       y="34.035717" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_recycle.svg b/GUI/coregui/images/toolbar16light_recycle.svg
new file mode 100644
index 0000000..fee0bd8
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_recycle.svg
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar24light_recycle.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4824">
+      <stop
+         id="stop4826"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4828"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3138"
+       is_visible="true" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3961"
+       x1="12.772549"
+       y1="46.721195"
+       x2="0.10660861"
+       y2="32.034439"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1003185,0,0,1.0894732,-0.91072949,-4.2002923)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3969"
+       x1="10.956502"
+       y1="34.109333"
+       x2="9.2564144"
+       y2="37.1903"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3994"
+       gradientUnits="userSpaceOnUse"
+       x1="10.956502"
+       y1="34.109333"
+       x2="9.2564144"
+       y2="37.1903"
+       gradientTransform="translate(0,-32)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1208217,0,0,1.1503111,-1.7847932,-5.6626483)"
+       x1="18.527092"
+       y1="39.641716"
+       x2="2.3167071"
+       y2="31.701826" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.899495"
+     inkscape:cx="-18.41048"
+     inkscape:cy="4.2709337"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3961);fill-opacity:1;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enab [...]
+       d="m 12.406072,36.489584 -8.8025482,0.06809 -0.5501593,0 0,0.544737 -0.06877,7.72845 c 0.014455,0.06267 0.017073,0.152855 0.034385,0.204276 0.017312,0.05142 0.048841,0.06267 0.06877,0.102139 0.4635293,0.922955 0.9852587,1.3564 1.8911725,1.770393 0,0 0.062964,0.02823 0.1031545,0.03405 0.04019,0.0058 0.1375397,0 0.1375397,0 l 5.3640536,0 c 0,0 0.09748,0.0068 0.13754,0 0.04006,-0.0068 0.103158,-0.03405 0.103158,-0.03405 1.106752,-0.329151 1.503955,-0.93136 2.063096,-1.872532 0,0 0.02 [...]
+       id="path3136"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4001);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;ove [...]
+       d="m 5.6756762,32.261669 a 1.1835909,0.9360691 0.43620069 0 0 -0.980719,0.467314 l -0.105077,0.251631 a 1.1835909,0.9360691 0.43620069 0 0 0.7705649,1.330047 l 7.7406749,3.307144 a 1.1835909,0.9360691 0.43620069 0 0 1.436053,-0.431367 L 14.64225,36.970755 A 1.1835909,0.9360691 0.43620069 0 0 13.90671,35.640708 L 12.015324,34.849869 C 12.228922,33.994171 11.633257,32.954257 10.579271,32.5133 9.5418654,32.079279 8.5191312,32.413145 8.0924479,33.16035 L 6.13101,32.333564 a 1.1835909, [...]
+       id="rect3946"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_refresh.svg b/GUI/coregui/images/toolbar16light_refresh.svg
new file mode 100644
index 0000000..83381dd
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_refresh.svg
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="toolbar_refresh.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3849"
+       x1="6.7053576"
+       y1="2.4417202"
+       x2="16.750076"
+       y2="16.584578"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0646916,0,0,1.0646916,5.7075434,16.103804)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3857"
+       x1="8.1339283"
+       y1="39.205357"
+       x2="9.6383924"
+       y2="41.88393"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2897384,0,0,1.2897384,3.7451135,-27.058853)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3907"
+       x1="10.138392"
+       y1="3.9216595"
+       x2="16.049644"
+       y2="11.671659"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3942"
+       gradientUnits="userSpaceOnUse"
+       x1="10.138392"
+       y1="3.9216595"
+       x2="16.049644"
+       y2="11.671659"
+       gradientTransform="matrix(0,-1,-1,0,-0.26768743,35.589456)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient5357"
+       x1="15.697366"
+       y1="8.7413301"
+       x2="-1.7544643"
+       y2="-0.75867051"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient5361"
+       gradientUnits="userSpaceOnUse"
+       x1="2.0187941"
+       y1="1.2770442"
+       x2="16.459822"
+       y2="9.9199009"
+       gradientTransform="matrix(-1,0,0,-1,16.121472,48.018373)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7"
+     inkscape:cx="1.0212593"
+     inkscape:cy="-7.4038592"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1866"
+     inkscape:window-height="1129"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient5357);fill-opacity:1;stroke:none;stroke-width:2.39316606999999992;marker:none;visibility:visible;display:inline;overf [...]
+       d="M 6,0.84375 C 5.844669,0.86053995 5.6934609,0.91454283 5.5625,1 l -1.9375,1.125 -2,1.15625 c -0.6177992,0.3453388 -0.6177992,1.4046612 0,1.75 l 2,1.15625 1.96875,1.15625 C 5.9157492,7.5338605 6.3459071,7.5212088 6.65625,7.3125 6.9286777,7.1269396 7.0986982,6.7990429 7.09375,6.46875 L 7.09375,5 10.25,5 c 1.560157,0 2.78125,1.221093 2.78125,2.78125 l 0,0.21875 2,0 0,-0.21875 C 15.03125,5.147687 12.883563,3 10.25,3 l -3.15625,0 0,-1.125 C 7.1130789,1.3073696 6.5635651,0.78925657 6 [...]
+       transform="translate(0,32)"
+       id="path5296"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccssccssccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccssccssccc"
+       inkscape:connector-curvature="0"
+       id="path5359"
+       d="m 10.121472,47.174623 c 0.155331,-0.01679 0.306539,-0.07079 0.4375,-0.15625 l 1.9375,-1.125 2,-1.15625 c 0.617799,-0.345339 0.617799,-1.404661 0,-1.75 l -2,-1.15625 -1.96875,-1.15625 c -0.322,-0.190111 -0.7521575,-0.177459 -1.0625004,0.03125 -0.2724277,0.18556 -0.4424482,0.513457 -0.4375,0.84375 l 0,1.46875 -3.1562496,0 c -1.560157,0 -2.78125,-1.221093 -2.78125,-2.78125 l 0,-0.21875 -2,0 0,0.21875 c 0,2.633563 2.147687,4.78125 4.78125,4.78125 l 3.1562496,0 0,1.125 c -0.019329,0 [...]
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient5361);fill-opacity:1;stroke:none;stroke-width:2.39316606999999992;marker:none;visibility:visible;display:inline;overf [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_run.svg b/GUI/coregui/images/toolbar16light_run.svg
new file mode 100644
index 0000000..25e053a
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_run.svg
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar16light_run.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4824">
+      <stop
+         id="stop4826"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4828"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3138"
+       is_visible="true" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3969"
+       x1="10.956502"
+       y1="34.109333"
+       x2="9.2564144"
+       y2="37.1903"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3994"
+       gradientUnits="userSpaceOnUse"
+       x1="10.956502"
+       y1="34.109333"
+       x2="9.2564144"
+       y2="37.1903"
+       gradientTransform="translate(0,-32)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3943"
+       id="linearGradient3949"
+       x1="25.773111"
+       y1="32.89315"
+       x2="4.6256304"
+       y2="8.9645777"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.34150193,0,0,0.37023412,-0.46255915,31.030441)" />
+    <linearGradient
+       id="linearGradient3943">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3945" />
+      <stop
+         style="stop-color:#f9f9f9;stop-opacity:1;"
+         offset="1"
+         id="stop3947" />
+    </linearGradient>
+    <filter
+       id="filter3044"
+       style="color-interpolation-filters:sRGB"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood3046"
+         flood-opacity="0.75"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3048"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3050"
+         stdDeviation="0.5"
+         result="blur" />
+      <feOffset
+         id="feOffset3052"
+         dx="0.5"
+         dy="0.5"
+         result="offset" />
+      <feComposite
+         id="feComposite3054"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="28"
+     inkscape:cx="-2.4821427"
+     inkscape:cy="2.93477"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="m 1.9680935,34.395558 c -0.6036613,0.03184 -0.9110113,0.615807 -0.9124868,1.039132 l -0.017249,4.522813 -0.017249,4.429313 c 0.00148,0.296392 0.2597574,0.923196 0.6271801,1.070963 0.3674227,0.14777 0.8473516,0.147515 1.2144525,-6.3e-4 l 5.898527,-2.379662 5.8022567,-2.420957 c 0.363889,-0.149222 0.457583,-0.416409 0.457583,-0.711396 0,-0.294987 -0.0937,-0.620321 -0.457583,-0.769542 L 8.7612693,36.83752 2.8627423,34.457871 c -0.210113,-0.08517 -0.6524515,-0.07481 -0.8946488,-0.06231 z"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccscccscccc"
+       id="path2999" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar16light_save.svg b/GUI/coregui/images/toolbar16light_save.svg
new file mode 100644
index 0000000..0d975d0
--- /dev/null
+++ b/GUI/coregui/images/toolbar16light_save.svg
@@ -0,0 +1,482 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="toolbar_save.svg">
+  <defs
+     id="defs2987">
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect4051"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3926"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3922"
+       is_visible="true" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-15.163812,-6.4833842)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1.2915176,0.80407114,0,-15.408859,55.27986)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66328237,0,0,1.1394731,-17.730579,23.913574)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-9.7381059,-18.749028)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66183957,0,0,1.1887523,-6.9359667,-18.60587)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017887,0,0,1.8399477,4.3333226,-36.504531)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-12.940946,-18.75003)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,21.093199,14.975927)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-12.163812,13.403845)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3041"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-1.2915176,1.2004509,0,-28.219842,51.672718)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3045"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.25907572,0.25907572,-0.31584538,-0.31584538,14.14782,40.46799)"
+       x1="71.532593"
+       y1="40.067352"
+       x2="10.606053"
+       y2="40.475281" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3049"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.21079682,-4.0147447,0,176.39826,21.006889)"
+       x1="16.462538"
+       y1="40.980659"
+       x2="45.942516"
+       y2="40.977962" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3053"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.21079682,-2.6972844,0,120.23954,16.042603)"
+       x1="20.528742"
+       y1="40.974152"
+       x2="75.761345"
+       y2="41.011337" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3842"
+       x1="15.25"
+       y1="45.42857"
+       x2="-1.8214296"
+       y2="31.214285"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.180851,-16.821429,-22.180472)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3865"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.62755996,0,0,-0.47506245,9.3082639,54.806168)"
+       x1="10.561905"
+       y1="40.022835"
+       x2="72.974625"
+       y2="40.232647" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3869"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.25907572,0.25907572,-0.31584538,-0.31584538,41.719249,52.21799)"
+       x1="46.09877"
+       y1="38.31469"
+       x2="-59.354187"
+       y2="44.150227" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3873"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.23799509,-0.23475192,0.29014549,-0.28619166,-9.2963524,65.495879)"
+       x1="1.419955"
+       y1="39.402046"
+       x2="71.868683"
+       y2="38.274639" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3877"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.5182754,0.47506245,0,-29.343261,50.841667)"
+       x1="49.54509"
+       y1="30.625572"
+       x2="7.64222"
+       y2="54.892372" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient3946"
+       x1="13.212693"
+       y1="13.353808"
+       x2="0.23667158"
+       y2="-2.303556"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1696428,0,0,1.1666666,-20.589286,30.70238)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4047"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99661579,0,0,1.3418541,-1.8533621,23.186357)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4070"
+       x1="14.897322"
+       y1="14.979911"
+       x2="-2.3214285"
+       y2="-2.4486606"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="19.79899"
+     inkscape:cx="4.4844367"
+     inkscape:cy="13.725908"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1866"
+     inkscape:window-height="1129"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       style="fill:url(#linearGradient4070);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       d="M 3.6875 1.03125 C 2.1837858 1.03125 0.96875 2.2462858 0.96875 3.75 L 0.96875 12.28125 C 0.96875 13.784964 2.1837858 15 3.6875 15 L 12.28125 15 C 13.784964 15 15 13.784964 15 12.28125 L 15 3.75 L 13 1.03125 L 11.96875 1.03125 L 11.96875 5.0625 C 11.96875 5.6000619 11.835808 6.0867263 11.625 6.4375 C 11.414192 6.7882737 11.135565 7 10.8125 7 L 5.25 7 C 4.9269354 7 4.6170584 6.7882737 4.40625 6.4375 C 4.1954416 6.0867263 4.0625 5.6000619 4.0625 5.0625 L 4.0625 1.03125 L 3.6875 1. [...]
+       transform="translate(0,32)"
+       id="path4043" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4045"
+       d="m 8.0171814,33.927999 0,0.670927 0,2.683708 0,0.670926 0.4983091,0 1.9932295,0 0.498308,0 0,-0.670926 0,-2.683708 0,-0.670927 -0.498308,0 -1.9932295,0 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient4047);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overf [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar32dark_cloneitem.svg b/GUI/coregui/images/toolbar32dark_cloneitem.svg
new file mode 100644
index 0000000..7100fa0
--- /dev/null
+++ b/GUI/coregui/images/toolbar32dark_cloneitem.svg
@@ -0,0 +1,583 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="materialeditor_clone.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.94569472,0,0,0.68138399,33.945275,8.7477615)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.96209819,-3.2915854,0,153.92022,-13.373467)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.98087805,0,0,2.904224,45.21041,-75.483853)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99846971,0,0,1.8468808,40.832148,-43.406433)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0041995,0,0,1.8544742,36.566184,-43.708232)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99884484,0,0,1.8639461,32.701441,-44.067296)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.99233754,0,0,1.4501735,27.913663,-23.398288)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.8315569,0,0,1.4306141,39.435999,-29.762744)"
+       y2="52.404518"
+       x2="8.0653534"
+       y1="34.827862"
+       x1="8.0355835"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3061-8"
+       xlink:href="#linearGradient4619-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4036">
+      <stop
+         id="stop4038"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4040"
+         offset="1"
+         style="stop-color:#fafafa;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4036"
+       id="linearGradient4034-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,3.5343517,-8.9661102)"
+       x1="38.771915"
+       y1="57.982292"
+       x2="-8.4399977"
+       y2="28.21237" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4036"
+       id="linearGradient5813"
+       x1="28.98724"
+       y1="20.015377"
+       x2="28.94508"
+       y2="8.5144548"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4036"
+       id="linearGradient5834"
+       gradientUnits="userSpaceOnUse"
+       x1="19.775478"
+       y1="14.097002"
+       x2="10.233688"
+       y2="2.5573981" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.444444"
+     inkscape:cx="36.400287"
+     inkscape:cy="19.195757"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false"
+     showguides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       id="path5728-4"
+       d="m 27.048683,33.090283 -0.04455,6.951136 -21.9737034,-0.04455 -0.089109,-16.028282 0,0 13.0464164,0.133664"
+       style="fill:none;stroke:url(#linearGradient4034-1);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;fill-opacity:1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Adobe Helvetica';-inkscape-font-specification:'Adobe Helvetica, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient5813);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.41975307"
+       id="text5800"
+       transform="matrix(1.083419,0,0,1.1518081,7.4363377,15.815519)">
+      <path
+         d="m 16.495026,11.509247 q 0.585937,0 0.952148,-0.322266 0.366211,-0.322265 0.380859,-0.856933 l 1.984864,0 q -0.0073,0.805664 -0.439453,1.479492 -0.432129,0.666504 -1.186524,1.040039 -0.74707,0.366211 -1.655273,0.366211 -1.699219,0 -2.680664,-1.07666 -0.981446,-1.083985 -0.981446,-2.9882816 l 0,-0.1391602 q 0,-1.8310547 0.974121,-2.9223632 0.974122,-1.0913086 2.67334,-1.0913086 1.486817,0 2.380371,0.8496093 0.900879,0.8422852 0.915528,2.2485352 l -1.984864,0 Q 17.813385,7.48092 [...]
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:'Adobe Helvetica';-inkscape-font-specification:'Adobe Helvetica, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient5834);fill-opacity:1;stroke:none;stroke-opacity:0.41975307"
+         id="path5805"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar32dark_newitem.svg b/GUI/coregui/images/toolbar32dark_newitem.svg
new file mode 100644
index 0000000..21f0987
--- /dev/null
+++ b/GUI/coregui/images/toolbar32dark_newitem.svg
@@ -0,0 +1,584 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="materialeditor_new.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.94569472,0,0,0.68138399,33.945275,8.7477615)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.96209819,-3.2915854,0,153.92022,-13.373467)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.98087805,0,0,2.904224,45.21041,-75.483853)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99846971,0,0,1.8468808,40.832148,-43.406433)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0041995,0,0,1.8544742,36.566184,-43.708232)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99884484,0,0,1.8639461,32.701441,-44.067296)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.99233754,0,0,1.4501735,27.913663,-23.398288)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.8315569,0,0,1.4306141,39.435999,-29.762744)"
+       y2="52.404518"
+       x2="8.0653534"
+       y1="34.827862"
+       x1="8.0355835"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3061-8"
+       xlink:href="#linearGradient4619-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4036">
+      <stop
+         id="stop4038"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4040"
+         offset="1"
+         style="stop-color:#fafafa;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4036"
+       id="linearGradient4034-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.92205073,0,0,0.95393343,3.5343517,-8.9661102)"
+       x1="38.771915"
+       y1="57.982292"
+       x2="-8.4399977"
+       y2="28.21237" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4036"
+       id="linearGradient5790"
+       x1="35.119423"
+       y1="30.445545"
+       x2="16.474638"
+       y2="21.311882"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4036"
+       id="linearGradient5798"
+       x1="24.039349"
+       y1="37.77475"
+       x2="24.03491"
+       y2="19.462872"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="44.888888"
+     inkscape:cx="9.4649656"
+     inkscape:cy="9.4174993"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false"
+     showguides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       id="path5728-4"
+       d="m 27.048683,33.090283 -0.04455,6.951136 -21.9737034,-0.04455 -0.089109,-16.028282 0,0 13.0464164,0.133664"
+       style="fill:none;stroke:url(#linearGradient4034-1);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;fill-opacity:1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient5798);stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 23.925743,23.004194 0.08911,8.065869"
+       id="path5780"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient5790);stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 19.871288,27.059406 8.064356,0"
+       id="path5782"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar32dark_remove.svg b/GUI/coregui/images/toolbar32dark_remove.svg
new file mode 100644
index 0000000..ab1a801
--- /dev/null
+++ b/GUI/coregui/images/toolbar32dark_remove.svg
@@ -0,0 +1,580 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar32dark_remove.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#bebebe;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#5a5a5a;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#969696;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4592"
+       id="linearGradient4598"
+       x1="45"
+       y1="48"
+       x2="2"
+       y2="-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(10.909648,55.154329)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4625"
+       x1="29"
+       y1="43"
+       x2="29"
+       y2="35"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9869024,0,0,0.88776083,14.858206,-1.0006961)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4656"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-12.449527,-7.6976699)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4668"
+       gradientUnits="userSpaceOnUse"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientTransform="matrix(1,0,0,1.4537913,18.3876,-22.652505)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4672"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.79979796,22.377703,2.0874223)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4676"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0164907,0,0,0.3860471,26.03748,17.720659)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.1601616,30.256893,-11.572613)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4700"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,0.29673785)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4704"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.508666,4.2449983)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4712"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="matrix(4.6365492,0,0,0.66328254,-16.517836,-0.93725566)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4716"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.66328257,-16.95234,3.0023381)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6702208,0,0,0.71090166,-16.851325,6.6321668)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4726"
+       gradientUnits="userSpaceOnUse"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6"
+       gradientTransform="translate(15.508666,-3.5505077)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4759"
+       x1="-12"
+       y1="130"
+       x2="-53"
+       y2="80"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99471384,0,0,1,69.141448,-85.657091)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(15.437237,8.3570368)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6365491,0,0,0.7347112,-16.517838,10.410751)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65017886,0,0,1.1934711,-7.0238202,-19.963314)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.66208822,0,0,1.1934971,-10.226661,-19.964316)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.62685746,-0.61777663,0,23.807484,13.761641)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.4762124,-9.4495267,12.189559)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.69005948,-0.67245431,1.4201209,1.4075539,-53.070729,-8.4925184)"
+       x1="21.556009"
+       y1="32.141224"
+       x2="21.209343"
+       y2="43.517174" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3123"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.95335715,0,0,1.1887523,-17.132487,-19.248728)"
+       x1="21.625385"
+       y1="32.712341"
+       x2="21.73777"
+       y2="45.918842" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.95335715,-1.1887523,0,46.986745,-2.2784594)"
+       x1="22.112387"
+       y1="35.53643"
+       x2="22.22477"
+       y2="20.952692" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3071-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.94569472,0,0,0.68138399,33.945275,8.7477615)"
+       x1="21.886053"
+       y1="34.025185"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient4619-3">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-9" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3067-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.96209819,-3.2915854,0,153.92022,-13.373467)"
+       x1="21.943026"
+       y1="41.468658"
+       x2="21.886053"
+       y2="19.814222" />
+    <linearGradient
+       id="linearGradient3054">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3056" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3058" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3060-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.98087805,0,0,2.904224,45.21041,-75.483853)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3061">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3056-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99846971,0,0,1.8468808,40.832148,-43.406433)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3068">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3072" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3052-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0041995,0,0,1.8544742,36.566184,-43.708232)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3075">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3077" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3079" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3063-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99884484,0,0,1.8639461,32.701441,-44.067296)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       id="linearGradient3082">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3084" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3086" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-3"
+       id="linearGradient4656-0"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,0.94809312,-11.485241,9.0523301)" />
+    <linearGradient
+       id="linearGradient3089">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop3091" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop3093" />
+    </linearGradient>
+    <linearGradient
+       y2="26"
+       x2="22"
+       y1="38"
+       x1="22"
+       gradientTransform="matrix(0.99233754,0,0,1.4501735,27.913663,-23.398288)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3102"
+       xlink:href="#linearGradient4619"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619-6"
+       id="linearGradient3829"
+       x1="8.0355835"
+       y1="34.827862"
+       x2="8.0653534"
+       y2="52.404518"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient4619-6">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621-1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623-6" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(1.8315569,0,0,1.4306141,39.435999,-29.762744)"
+       y2="52.404518"
+       x2="8.0653534"
+       y1="34.827862"
+       x1="8.0355835"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3061-8"
+       xlink:href="#linearGradient4619-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4036">
+      <stop
+         id="stop4038"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4040"
+         offset="1"
+         style="stop-color:#fafafa;stop-opacity:0.98039216;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4824"
+       id="linearGradient4001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6164509,0,0,1.6589805,2.8664294,-33.895163)"
+       x1="27.374859"
+       y1="43.40163"
+       x2="0.056529857"
+       y2="30.385857" />
+    <linearGradient
+       id="linearGradient4824">
+      <stop
+         id="stop4826"
+         offset="0"
+         style="stop-color:#0f0f0f;stop-opacity:1;" />
+      <stop
+         id="stop4828"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4824"
+       id="linearGradient3961"
+       x1="19.453007"
+       y1="51.693436"
+       x2="-0.1460821"
+       y2="32.771702"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5868811,0,0,1.57124,4.1270058,-31.786151)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.444444"
+     inkscape:cx="-3.861796"
+     inkscape:cy="25.667978"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false"
+     showguides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-16)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="m 23.332517,26.896853 -12.695049,0.0982 -0.7934381,0 0,0.78562 -0.099184,11.145983 c 0.020847,0.09037 0.024618,0.220448 0.049608,0.294608 0.024969,0.07415 0.070443,0.09037 0.099184,0.147305 0.6685011,1.331086 1.4209401,1.956201 2.7274501,2.553264 0,0 0.0908,0.04072 0.148771,0.04911 0.05796,0.0084 0.198359,0 0.198359,0 l 7.736047,0 c 0,0 0.140586,0.0099 0.198361,0 0.05778,-0.0099 0.148773,-0.04911 0.148773,-0.04911 1.596161,-0.474704 2.169008,-1.34321 2.975401,-2.700569 0,0 0.03 [...]
+       id="path3136"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="m 13.62593,20.799348 a 1.7069767,1.3500003 0.43620069 0 0 -1.414393,0.67396 l -0.151544,0.362903 a 1.7069767,1.3500003 0.43620069 0 0 1.111311,1.918196 l 11.163615,4.769569 a 1.7069767,1.3500003 0.43620069 0 0 2.071077,-0.622119 l 0.151541,-0.311058 a 1.7069767,1.3500003 0.43620069 0 0 -1.060798,-1.918196 l -2.727758,-1.140549 c 0.308051,-1.234089 -0.551019,-2.733855 -2.071078,-3.369804 -1.496148,-0.625946 -2.971139,-0.144443 -3.586501,0.933177 l -2.828789,-1.192392 a 1.7069767 [...]
+       id="rect3946"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar_expand_collapse_tree.svg b/GUI/coregui/images/toolbar_expand_collapse_tree.svg
new file mode 100644
index 0000000..c6e710a
--- /dev/null
+++ b/GUI/coregui/images/toolbar_expand_collapse_tree.svg
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="toolbar_expand_collapse_tree.svg">
+  <defs
+     id="defs2987">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3848">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3850" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3852" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3833"
+       is_visible="true" />
+    <linearGradient
+       id="linearGradient4619">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4621" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="1"
+         id="stop4623" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4592">
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1;"
+         offset="0"
+         id="stop4594" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:0.98039216;"
+         offset="1"
+         id="stop4596" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4708"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.90913729,12.020815)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4724"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.3671751,0,0,0.36023659,-29.207084,18.152322)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.0034693,0,0,0.6589497,-28.754255,27.735252)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.62685746,0,0,1,-8.55667,-29.093836)"
+       x1="22"
+       y1="38"
+       x2="22"
+       y2="26" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3848"
+       id="linearGradient3854"
+       x1="7.2781744"
+       y1="31.824934"
+       x2="7.1922593"
+       y2="42.052731"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3848"
+       id="linearGradient3858"
+       gradientUnits="userSpaceOnUse"
+       x1="7.2781744"
+       y1="31.824934"
+       x2="7.1922593"
+       y2="42.052731"
+       gradientTransform="matrix(0,1,-1,0,48.340927,29.754123)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3412"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.0118872,0,0,0.6589497,-28.837626,31.725355)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3416"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6818531,0,0,0.6589497,-11.700039,35.715457)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3420"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.6734352,0,0,0.6589497,-11.540906,39.70556)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient3437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31814721,0,0,3.8830217,9.8874079,3.1384864)"
+       x1="11"
+       y1="12"
+       x2="11"
+       y2="6" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4474"
+       x1="10.148653"
+       y1="31.140333"
+       x2="16.184389"
+       y2="37.580055"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.02525381,-0.60609152)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4619"
+       id="linearGradient4478"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,-0.01639304,0,-1,27.040149,80.760186)"
+       x1="12.345735"
+       y1="33.665714"
+       x2="19.265354"
+       y2="41.97422" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="9.899495"
+     inkscape:cx="10.914737"
+     inkscape:cy="3.2232233"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="2466"
+     inkscape:window-height="1365"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3012"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,-32)">
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4763"
+       d="m 0.99228782,33.010196 0,0.329474 0,1.3179 0,0.329474 1.50173428,0 6.0069384,0 1.5017355,0 0,-0.329474 0,-1.3179 0,-0.329474 -1.5017355,0 -6.0069384,0 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="m 0.99228782,37.000299 0,0.329474 0,1.3179 0,0.329474 1.50594318,0 6.0237744,0 1.5059446,0 0,-0.329474 0,-1.3179 0,-0.329474 -1.5059446,0 -6.0237744,0 z"
+       id="path3410"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3414"
+       d="m 4.9571365,40.990401 0,0.329474 0,1.3179 0,0.329474 0.8409264,0 3.3637061,0 0.840927,0 0,-0.329474 0,-1.3179 0,-0.329474 -0.840927,0 -3.3637061,0 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+       d="m 5.0328979,44.980504 0,0.329474 0,1.3179 0,0.329474 0.8367174,0 3.3468704,0 0.8367183,0 0,-0.329474 0,-1.3179 0,-0.329474 -0.8367183,0 -3.3468704,0 z"
+       id="path3418"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccccccc"
+       inkscape:connector-curvature="0"
+       id="path3435"
+       d="m 13.038357,34.222379 0,1.941507 0,7.766046 0,1.941505 0.159074,0 0.636294,0 0.159074,0 0,-1.941505 0,-7.766046 0,-1.941507 -0.159074,0 -0.636294,0 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#lin [...]
+    <g
+       id="g4359"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4361"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4363"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4365"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4367"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4369"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4371"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4373"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4375"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4377"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4379"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4381"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4383"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4385"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <g
+       id="g4387"
+       transform="matrix(0.04779299,0,0,0.04779299,-9.1696001,57.289298)" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonze [...]
+       d="m 13.584121,33.028673 a 0.36294993,0.36294993 0 0 0 -0.345703,0.222656 l -1.285156,3.054687 a 0.36294993,0.36294993 0 1 0 0.667968,0.28125 l 0.921875,-2.1875 0.748047,2.128907 a 0.36353463,0.36353463 0 1 0 0.685547,-0.242188 l -1.060547,-3.013672 a 0.36294993,0.36294993 0 0 0 -0.332031,-0.24414 z"
+       id="path4443"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4476"
+       d="m 13.430774,46.902321 a 0.36593705,0.35998719 45.234808 0 0 0.345703,-0.216989 l 1.285156,-3.033619 a 0.36593705,0.35998719 45.234808 1 0 -0.667968,-0.2922 L 13.47179,45.5319 12.723743,43.390731 a 0.3665266,0.36056716 45.234808 0 0 -0.685547,0.23095 l 1.060547,3.031057 a 0.36593705,0.35998719 45.234808 0 0 0.332031,0.249583 z"
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonze [...]
+  </g>
+</svg>
diff --git a/GUI/coregui/images/toolbar_newitem.png b/GUI/coregui/images/toolbar_newitem.png
new file mode 100644
index 0000000..1c393cd
Binary files /dev/null and b/GUI/coregui/images/toolbar_newitem.png differ
diff --git a/GUI/coregui/images/toolbar_newitem_dark.png b/GUI/coregui/images/toolbar_newitem_dark.png
new file mode 100644
index 0000000..2d78483
Binary files /dev/null and b/GUI/coregui/images/toolbar_newitem_dark.png differ
diff --git a/GUI/coregui/images/treeview-branch-closed.png b/GUI/coregui/images/treeview-branch-closed.png
new file mode 100644
index 0000000..213ffdd
Binary files /dev/null and b/GUI/coregui/images/treeview-branch-closed.png differ
diff --git a/GUI/coregui/images/treeview-branch-end.png b/GUI/coregui/images/treeview-branch-end.png
new file mode 100644
index 0000000..54915b3
Binary files /dev/null and b/GUI/coregui/images/treeview-branch-end.png differ
diff --git a/GUI/coregui/images/treeview-branch-more.png b/GUI/coregui/images/treeview-branch-more.png
new file mode 100644
index 0000000..664ad44
Binary files /dev/null and b/GUI/coregui/images/treeview-branch-more.png differ
diff --git a/GUI/coregui/images/treeview-branch-open.png b/GUI/coregui/images/treeview-branch-open.png
new file mode 100644
index 0000000..e8cad95
Binary files /dev/null and b/GUI/coregui/images/treeview-branch-open.png differ
diff --git a/GUI/coregui/images/treeview-vline.png b/GUI/coregui/images/treeview-vline.png
new file mode 100644
index 0000000..8f0c336
Binary files /dev/null and b/GUI/coregui/images/treeview-vline.png differ
diff --git a/GUI/coregui/images/warning at 2x.png b/GUI/coregui/images/warning at 2x.png
new file mode 100644
index 0000000..b362e6c
Binary files /dev/null and b/GUI/coregui/images/warning at 2x.png differ
diff --git a/GUI/coregui/images/warning_64x64.png b/GUI/coregui/images/warning_64x64.png
new file mode 100644
index 0000000..deeb254
Binary files /dev/null and b/GUI/coregui/images/warning_64x64.png differ
diff --git a/GUI/coregui/mainwindow/AppSvc.cpp b/GUI/coregui/mainwindow/AppSvc.cpp
new file mode 100644
index 0000000..e304656
--- /dev/null
+++ b/GUI/coregui/mainwindow/AppSvc.cpp
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/AppSvc.cpp
+//! @brief     Implements class AppSvc
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "AppSvc.h"
+#include "GUIHelpers.h"
+
+ProjectManager *AppSvc::projectManager()
+{
+    return instance().this_projectManager();
+}
+
+void AppSvc::subscribe(ProjectManager *projectManager)
+{
+    return instance().this_subscribe(projectManager);
+}
+
+void AppSvc::unsubscribe(ProjectManager *projectManager)
+{
+    instance().this_unsubscribe(projectManager);
+}
+
+ProjectManager *AppSvc::this_projectManager()
+{
+    if(!m_projectManager) {
+        throw GUIHelpers::Error("AppSvc::projectManager() -> Error. Attempt to access "
+                                "non existing ProjectManager.");
+    }
+    return m_projectManager;
+}
+
+void AppSvc::this_subscribe(ProjectManager *projectManager)
+{
+    if(m_projectManager != nullptr) {
+        throw GUIHelpers::Error("AppSvc::projectManager() -> Error. Attempt to subscribe "
+                                "ProjectManager twice.");
+    }
+    m_projectManager = projectManager;
+}
+
+void AppSvc::this_unsubscribe(ProjectManager *projectManager)
+{
+    if(m_projectManager != projectManager) {
+        throw GUIHelpers::Error("AppSvc::projectManager() -> Error. Attempt to unsubscribe "
+                                "ProjectManager before it was subscribed.");
+    }
+    m_projectManager = nullptr;
+}
diff --git a/GUI/coregui/mainwindow/AppSvc.h b/GUI/coregui/mainwindow/AppSvc.h
new file mode 100644
index 0000000..2dcbf06
--- /dev/null
+++ b/GUI/coregui/mainwindow/AppSvc.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/AppSvc.h
+//! @brief     Defines class AppSvc
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef APPSVC_H
+#define APPSVC_H
+
+#include "ISingleton.h"
+#include "WinDllMacros.h"
+
+class ProjectManager;
+
+//! The AppSvc class provides common access for key components of the GUI.
+
+class BA_CORE_API_ AppSvc : public ISingleton<AppSvc>
+{
+    friend class ISingleton<AppSvc>;
+public:
+    static ProjectManager *projectManager();
+    static void subscribe(ProjectManager *projectManager);
+    static void unsubscribe(ProjectManager *projectManager);
+
+private:
+    AppSvc() {}
+    ProjectManager *this_projectManager();
+    void this_subscribe(ProjectManager *projectManager);
+    void this_unsubscribe(ProjectManager *projectManager);
+
+    ProjectManager *m_projectManager;
+};
+
+#endif // APPSVC_H
diff --git a/GUI/coregui/mainwindow/SplashScreen.cpp b/GUI/coregui/mainwindow/SplashScreen.cpp
new file mode 100644
index 0000000..99cf168
--- /dev/null
+++ b/GUI/coregui/mainwindow/SplashScreen.cpp
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/SplashScreen.cpp
+//! @brief     Implements class SplashScreen
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "SplashScreen.h"
+#include "GUIHelpers.h"
+#include <QStyleOptionProgressBarV2>
+
+SplashScreen::SplashScreen(QWidget *parent) :
+    QSplashScreen(parent),m_percentage_done(0)
+
+{
+    m_width = 480;
+    m_height = 380;
+
+    this->setPixmap(QPixmap(":/images/splashscreen.png"));
+    this->setCursor(Qt::BusyCursor);
+
+    QFont font;
+    font.setPointSize(10);
+    font.setBold(false);
+    this->setFont(font);
+}
+
+void SplashScreen::setProgress(int value)
+{
+    m_percentage_done = value;
+    if (m_percentage_done > 100)
+        m_percentage_done = 100;
+    if (m_percentage_done < 0)
+        m_percentage_done = 0;
+    update();
+}
+
+void SplashScreen::drawContents(QPainter *painter)
+{
+    QSplashScreen::drawContents(painter);
+
+    QRect textRect( 15.0, m_height-40, 100, 30);
+
+    QString versionText = QString("version ").append(GUIHelpers::getBornAgainVersionString());
+    style()->drawItemText(painter, textRect, 0, this->palette(), true, versionText);
+
+    QString loadingText("loading . ");
+    for(size_t i=0; i<size_t(m_percentage_done/20); ++i) {
+        loadingText.append(". ");
+    }
+
+    QRect loadingRect( 380.0, m_height-40, 100, 30);
+    style()->drawItemText(painter, loadingRect, 0, this->palette(), true, loadingText);
+
+}
diff --git a/GUI/coregui/mainwindow/SplashScreen.h b/GUI/coregui/mainwindow/SplashScreen.h
new file mode 100644
index 0000000..1931527
--- /dev/null
+++ b/GUI/coregui/mainwindow/SplashScreen.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/SplashScreen.h
+//! @brief     Defines class SplashScreen
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPLASHSCREEN_H
+#define SPLASHSCREEN_H
+
+#include "WinDllMacros.h"
+#include <QSplashScreen>
+
+class BA_CORE_API_ SplashScreen : public QSplashScreen
+{
+    Q_OBJECT
+public:
+    explicit SplashScreen(QWidget *parent = 0);
+
+
+public slots:
+    void setProgress(int value);
+
+protected:
+    void drawContents(QPainter *painter);
+private:
+    int m_width, m_height;
+    int m_percentage_done;
+
+};
+
+#endif // SPLASHSCREEN_H
diff --git a/GUI/coregui/mainwindow/StyledToolBar.cpp b/GUI/coregui/mainwindow/StyledToolBar.cpp
new file mode 100644
index 0000000..83ef3c4
--- /dev/null
+++ b/GUI/coregui/mainwindow/StyledToolBar.cpp
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/StyledToolBar.cpp
+//! @brief     Implements class StyledToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "StyledToolBar.h"
+#include <QLabel>
+#include <QStyle>
+
+StyledToolBar::StyledToolBar(QWidget *parent)
+    : QToolBar(parent)
+{
+//    setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    setMovable(false);
+    const int size = style()->pixelMetric(QStyle::PM_SmallIconSize);
+    setIconSize(QSize(size, size));
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+    setContentsMargins(0,0,0,0);
+}
+
+void StyledToolBar::addStyledSeparator()
+{
+    addWidget(new QLabel(" "));
+    addSeparator();
+    addWidget(new QLabel(" "));
+}
+
+void StyledToolBar::addStyledExpand()
+{
+    QWidget* empty = new QWidget();
+    empty->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    addWidget(empty);
+}
diff --git a/GUI/coregui/mainwindow/StyledToolBar.h b/GUI/coregui/mainwindow/StyledToolBar.h
new file mode 100644
index 0000000..852b994
--- /dev/null
+++ b/GUI/coregui/mainwindow/StyledToolBar.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/StyledToolBar.h
+//! @brief     Defines class StyledToolBar
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STYLEDTOOLBAR_H
+#define STYLEDTOOLBAR_H
+
+#include "WinDllMacros.h"
+#include <QToolBar>
+
+//! The StyledToolBar class represents our standard narrow toolbar with the height 24 pixels.
+
+class BA_CORE_API_ StyledToolBar : public QToolBar
+{
+    Q_OBJECT
+
+public:
+    explicit StyledToolBar(QWidget *parent = 0);
+    void addStyledSeparator();
+    void addStyledExpand();
+};
+
+#endif // STYLEDTOOLBAR_H
diff --git a/GUI/coregui/mainwindow/UpdateNotifier.cpp b/GUI/coregui/mainwindow/UpdateNotifier.cpp
new file mode 100644
index 0000000..29feb18
--- /dev/null
+++ b/GUI/coregui/mainwindow/UpdateNotifier.cpp
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/UpdateNotifier.cpp
+//! @brief     Implements class UpdateNotifier
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "UpdateNotifier.h"
+#include "GUIHelpers.h"
+#include "mainwindow_constants.h"
+#include <QMessageBox>
+#include <QtNetwork>
+
+UpdateNotifier::UpdateNotifier(QObject *parent)
+    : QObject(parent), m_networkAccessManager(new QNetworkAccessManager(parent))
+{
+    connect(m_networkAccessManager, SIGNAL(finished(QNetworkReply *)), this,
+            SLOT(replyFinished(QNetworkReply *)));
+}
+
+void UpdateNotifier::checkForUpdates()
+{
+    QSettings settings;
+    if (settings.childGroups().contains(Constants::S_UPDATES)) {
+        settings.beginGroup(Constants::S_UPDATES);
+        if (settings.value(Constants::S_CHECKFORUPDATES).toBool()) {
+            QString address(Constants::S_VERSION_URL);
+            QUrl url(address);
+            QNetworkRequest networkRequest(url);
+            networkRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
+            QString text = QString("Mozilla/5.0 (BornAgainGUI-%1)").arg(GUIHelpers::getBornAgainVersionString());
+            networkRequest.setRawHeader(QByteArray("User-Agent"), text.toLatin1());
+            m_networkAccessManager->get(networkRequest);
+        } else
+            emit onUpdateNotification(QString(""));
+    }
+}
+
+void UpdateNotifier::replyFinished(QNetworkReply *reply)
+{
+    QString replyString;
+    if (reply->error() == QNetworkReply::NoError) {
+        if (reply->isReadable()) {
+            // Reading the first line of ChangeLog
+            replyString = QString::fromUtf8(reply->readLine().data());
+            int versionIndex = replyString.indexOf("-") + 1;
+            int versionIndexEnd = replyString.indexOf(",", versionIndex);
+            QString versionString = replyString.mid(versionIndex, versionIndexEnd - versionIndex);
+            QString myVersion = GUIHelpers::getBornAgainVersionString();
+
+            // Testwise degrade version
+            // QString myVersion = QString("1.3.0");
+
+            int compareResult = versionString.compare(myVersion);
+            if (compareResult > 0) {
+                QString message("New version is available: <a href=\"");
+                message.append(Constants::S_DOWNLOAD_LINK);
+                message.append("\">");
+                message.append(replyString);
+                message.append("</a>");
+                emit onUpdateNotification(message);
+            }
+        }
+    };
+    reply->deleteLater();
+}
+
+void UpdateNotifier::askForUpdates()
+{
+    QSettings settings;
+    if (!settings.childGroups().contains(Constants::S_UPDATES)) {
+        QMessageBox msgBox;
+        msgBox.setWindowTitle("Updates");
+        msgBox.setText("Should BornAgain check for updates automatically?\n"
+                       "This setting can be changed later in the main window Settings menu.");
+        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+        msgBox.setDefaultButton(QMessageBox::Yes);
+        int ret = msgBox.exec();
+        settings.beginGroup(Constants::S_UPDATES);
+        settings.setValue(Constants::S_CHECKFORUPDATES, ret == QMessageBox::Yes);
+        settings.endGroup();
+    }
+    this->checkForUpdates();
+}
diff --git a/GUI/coregui/mainwindow/UpdateNotifier.h b/GUI/coregui/mainwindow/UpdateNotifier.h
new file mode 100644
index 0000000..671bab9
--- /dev/null
+++ b/GUI/coregui/mainwindow/UpdateNotifier.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/UpdateNotifier.h
+//! @brief     Implements class UpdateNotifier
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef UPDATENOTIFIER_H
+#define UPDATENOTIFIER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class QNetworkAccessManager;
+class QNetworkReply;
+
+class BA_CORE_API_ UpdateNotifier : public QObject
+{
+    Q_OBJECT
+public:
+    UpdateNotifier(QObject *parent = 0);
+    void checkForUpdates();
+
+public slots:
+    void replyFinished(QNetworkReply *reply);
+    void askForUpdates();
+
+signals:
+    void onUpdateNotification(const QString &text);
+
+private:
+    QNetworkAccessManager *m_networkAccessManager;
+};
+
+
+#endif // UPDATENOTIFIER_H
diff --git a/GUI/coregui/mainwindow/aboutapplicationdialog.cpp b/GUI/coregui/mainwindow/aboutapplicationdialog.cpp
new file mode 100644
index 0000000..53f5433
--- /dev/null
+++ b/GUI/coregui/mainwindow/aboutapplicationdialog.cpp
@@ -0,0 +1,115 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/aboutapplicationdialog.cpp
+//! @brief     Implements class AboutApplicationDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "aboutapplicationdialog.h"
+#include "DesignerHelper.h"
+#include "GUIHelpers.h"
+#include <QDate>
+#include <QLabel>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+
+AboutApplicationDialog::AboutApplicationDialog(QWidget *parent)
+    : QDialog(parent)
+{
+    QColor bgColor(240,240,240,255);
+    QPalette palette;
+    palette.setColor(QPalette::Background, bgColor);
+    setAutoFillBackground(true);
+    setPalette(palette);
+
+    setFixedSize(550, 250);
+    setWindowTitle("About BornAgain");
+
+    //setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
+    setWindowFlags( Qt::Dialog );
+
+
+    QFont titleFont;
+    titleFont.setPointSize(DesignerHelper::getLabelFontSize() + 2);
+    titleFont.setBold(true);
+
+    QFont normalFont;
+    normalFont.setPointSize(DesignerHelper::getLabelFontSize());
+    normalFont.setBold(false);
+
+
+    QPixmap logo(":/images/about_icon.png");
+    QLabel *logoLabel = new QLabel;
+    logoLabel->setPixmap(logo.scaled(120,120,Qt::KeepAspectRatio));
+
+
+    QLabel *aboutTitleLabel = new QLabel(QString("BornAgain version ")
+                                         .append(GUIHelpers::getBornAgainVersionString()));
+    aboutTitleLabel->setFont(titleFont);
+    aboutTitleLabel->setContentsMargins(0,0,0,15);
+
+    QDate date = QDate::currentDate();
+
+    QString copyright = QString("Copyright: Forschungszentrum Jülich GmbH ").append(date.toString("yyyy"));
+    QLabel *copyrightLabel = new QLabel(copyright);
+    copyrightLabel->setFont(normalFont);
+    //copyrightLabel->setWordWrap(true);
+    copyrightLabel->setContentsMargins(0,0,0,15);
+
+    QString description = "A software to simulate and fit grazing-incidence small-angle scattering (GISAS) using distorted wave Born approximation (DWBA).";
+    QLabel *descriptionLabel = new QLabel(description);
+    descriptionLabel->setFont(normalFont);
+    descriptionLabel->setWordWrap(true);
+
+
+    QLabel *linkLabel = new QLabel();
+    linkLabel->setTextFormat(Qt::RichText);
+    linkLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
+    linkLabel->setText("<a href=\"http://www.bornagainproject.org\">www.bornagainproject.org</a>");
+    linkLabel->setOpenExternalLinks(true);
+
+
+    QVBoxLayout *logoLayout = new QVBoxLayout;
+    logoLayout->addWidget(logoLabel);
+    logoLayout->addStretch(1);
+    logoLayout->setContentsMargins(5,5,5,5);
+
+    QVBoxLayout *textLayout = new QVBoxLayout;
+    textLayout->addWidget(aboutTitleLabel);
+    textLayout->addWidget(descriptionLabel);
+    textLayout->addStretch(1);
+    textLayout->addWidget(copyrightLabel);
+    textLayout->addWidget(linkLabel);
+    textLayout->addStretch(1);
+    textLayout->setContentsMargins(0,5,5,5);
+
+
+    QHBoxLayout *detailsLayout = new QHBoxLayout;
+    detailsLayout->addLayout(logoLayout);
+    detailsLayout->addLayout(textLayout);
+
+
+    m_closeButton = new QPushButton("Close");
+    connect(m_closeButton, SIGNAL(clicked()), this, SLOT(reject()));
+
+    QHBoxLayout *buttonsLayout = new QHBoxLayout;
+    buttonsLayout->addStretch(1);
+    buttonsLayout->addWidget(m_closeButton);
+
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addLayout(detailsLayout);
+    mainLayout->addLayout(buttonsLayout);
+
+    setLayout(mainLayout);
+}
diff --git a/GUI/coregui/mainwindow/aboutapplicationdialog.h b/GUI/coregui/mainwindow/aboutapplicationdialog.h
new file mode 100644
index 0000000..5a11b60
--- /dev/null
+++ b/GUI/coregui/mainwindow/aboutapplicationdialog.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/aboutapplicationdialog.h
+//! @brief     Defines class AboutApplicationDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ABOUTAPPLICATIONDIALOG_H
+#define ABOUTAPPLICATIONDIALOG_H
+
+#include "WinDllMacros.h"
+#include <QDialog>
+
+//! new project dialog window
+class BA_CORE_API_ AboutApplicationDialog : public QDialog
+{
+    Q_OBJECT
+public:
+    AboutApplicationDialog(QWidget *parent = 0);
+
+private:
+    QPushButton *m_closeButton;
+};
+
+
+#endif // ABOUTAPPLICATIONDIALOG_H
diff --git a/GUI/coregui/mainwindow/actionmanager.cpp b/GUI/coregui/mainwindow/actionmanager.cpp
new file mode 100644
index 0000000..16c9001
--- /dev/null
+++ b/GUI/coregui/mainwindow/actionmanager.cpp
@@ -0,0 +1,206 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/actionmanager.cpp
+//! @brief     Implements class ActionManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "actionmanager.h"
+#include "UpdateNotifier.h"
+#include "hostosinfo.h"
+#include "mainwindow.h"
+#include "mainwindow_constants.h"
+#include "projectmanager.h"
+#include "qstringutils.h"
+#include <QDebug>
+#include <QDir>
+#include <QMenuBar>
+#include <QSettings>
+#include <QShortcut>
+
+ActionManager::ActionManager(MainWindow *parent)
+    : QObject(parent)
+    , m_mainWindow(parent)
+    , m_newAction(0)
+    , m_openAction(0)
+    , m_saveAction(0)
+    , m_saveAsAction(0)
+    , m_menuBar(0)
+    , m_fileMenu(0)
+    , m_settingsMenu(0)
+    , m_helpMenu(0)
+    , m_runSimulationShortcut(0)
+{
+    setParent(parent);
+    createActions();
+    createMenus();
+    createGlobalShortcuts();
+}
+
+
+
+void ActionManager::createActions()
+{
+    ProjectManager *projectManager = m_mainWindow->projectManager();
+    Q_ASSERT(projectManager);
+
+    // new project action
+//    QIcon icon = QIcon::fromTheme(QLatin1String("document-new"), QIcon(QLatin1String(Constants::ICON_NEWFILE)));
+    m_newAction = new QAction("&New Project", m_mainWindow);
+    m_newAction->setShortcuts(QKeySequence::New);
+    m_newAction->setStatusTip("Create a new project");
+    connect(m_newAction, SIGNAL(triggered()), projectManager, SLOT(newProject()) );
+
+    // open project action
+//    icon = QIcon::fromTheme(QLatin1String("document-open"), QIcon(QLatin1String(Constants::ICON_OPENFILE)));
+    m_openAction = new QAction("&Open Project", m_mainWindow);
+    m_openAction->setShortcuts(QKeySequence::Open);
+    m_openAction->setStatusTip("Open an existing project");
+    connect(m_openAction, SIGNAL(triggered()), projectManager, SLOT(openProject()) );
+
+    // save project action
+//    icon = QIcon::fromTheme(QLatin1String("document-save"), QIcon(QLatin1String(Constants::ICON_SAVEFILE)));
+    m_saveAction = new QAction("&Save Project", m_mainWindow);
+    m_saveAction->setShortcuts(QKeySequence::Save);
+    m_saveAction->setStatusTip("Save project");
+    m_saveAction->setShortcutContext(Qt::ApplicationShortcut);
+    connect(m_saveAction, SIGNAL(triggered()), projectManager, SLOT(saveProject()) );
+
+    // save-as project action
+//    icon = QIcon::fromTheme(QLatin1String("document-save-as"));
+    m_saveAsAction = new QAction("Save &As...", m_mainWindow);
+    m_saveAsAction->setShortcuts(QKeySequence::SaveAs);
+    m_saveAsAction->setStatusTip("Save project under different name");
+    connect(m_saveAsAction, SIGNAL(triggered()), projectManager, SLOT(saveProjectAs()) );
+
+    // exit application action
+//    icon = QIcon::fromTheme(QLatin1String("application-exit"));
+    m_exitAction = new QAction("E&xit Application", this);
+    m_exitAction->setShortcuts(QKeySequence::Quit);
+    m_exitAction->setStatusTip("Exit the application");
+    connect(m_exitAction, SIGNAL(triggered()), m_mainWindow, SLOT(close()));
+
+    // about application action
+//    icon = QIcon::fromTheme(QLatin1String("help-about"));
+    m_aboutAction = new QAction("About &BornAgain", this);
+    //m_aboutAction->setShortcuts(QKeySequence::HelpContents);
+    m_aboutAction->setStatusTip("About the application");
+    connect(m_aboutAction, SIGNAL(triggered()), m_mainWindow, SLOT(onAboutApplication()));
+
+}
+
+
+void ActionManager::createMenus()
+{
+    m_menuBar = new QMenuBar(0); // No parent (System menu bar on Mac OS X)
+
+    if (!Utils::HostOsInfo::isMacHost())
+        m_mainWindow->setMenuBar(m_menuBar);
+
+    // File Menu
+    m_fileMenu = m_menuBar->addMenu("&File");
+    m_fileMenu->addAction(m_newAction);
+    m_fileMenu->addAction(m_openAction);
+    connect(m_fileMenu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowRecentProjects()));
+
+    m_recentProjectsMenu = m_fileMenu->addMenu("Recent Projects");
+
+    m_fileMenu->addSeparator();
+    m_fileMenu->addAction(m_saveAction);
+    m_fileMenu->addAction(m_saveAsAction);
+
+    m_fileMenu->addSeparator();
+    m_fileMenu->addAction(m_exitAction);
+
+    // Settings Menu
+    m_settingsMenu = new QMenu("Settings", m_mainWindow);
+    aboutToShowSettings(); // MacOS feature: action should exist already, otherwise menuBar will not add menu
+    connect(m_settingsMenu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowSettings()));
+    m_menuBar->addMenu(m_settingsMenu);
+
+    // Help Menu
+    m_helpMenu = m_menuBar->addMenu("&Help");
+    m_helpMenu->addAction(m_aboutAction);
+}
+
+
+void ActionManager::createGlobalShortcuts()
+{
+    m_runSimulationShortcut =  new QShortcut(QKeySequence("Ctrl+r"), m_mainWindow);
+    m_runSimulationShortcut->setContext((Qt::ApplicationShortcut));
+    connect(m_runSimulationShortcut, SIGNAL(activated()), m_mainWindow, SLOT(onRunSimulationShortcut()));
+}
+
+
+void ActionManager::aboutToShowRecentProjects()
+{
+    qDebug() << "ActionManager::aboutToShowRecentProjects() ->" << m_mainWindow->projectManager()->getRecentProjects();
+    m_recentProjectsMenu->clear();
+
+    bool hasRecentProjects = false;
+    foreach(QString file, m_mainWindow->projectManager()->getRecentProjects() ) {
+        hasRecentProjects = true;
+        qDebug() << file << QDir::toNativeSeparators(Utils::withTildeHomePath(file));
+        QAction *action = m_recentProjectsMenu->addAction(QDir::toNativeSeparators(Utils::withTildeHomePath(file)));
+        action->setData(qVariantFromValue(file));
+        connect(action, SIGNAL(triggered()), m_mainWindow, SLOT(openRecentProject()));
+
+    }
+
+    m_recentProjectsMenu->setEnabled(hasRecentProjects);
+
+    if (hasRecentProjects) {
+        m_recentProjectsMenu->addSeparator();
+        QAction *action = m_recentProjectsMenu->addAction("Clear Menu");
+        connect(action, SIGNAL(triggered()), m_mainWindow->projectManager(), SLOT(clearRecentProjects()));
+    }
+
+}
+
+void ActionManager::aboutToShowSettings()
+{
+    m_settingsMenu->clear();
+    QSettings settings;
+
+    settings.beginGroup(Constants::S_UPDATES);
+    QAction *action = m_settingsMenu->addAction("Check for Updates");
+    action->setCheckable(true);
+    action->setChecked(settings.value(Constants::S_CHECKFORUPDATES, false).toBool());
+    connect(action, SIGNAL(toggled(bool)), this, SLOT(toggleCheckForUpdates(bool)));
+    settings.endGroup();
+
+    settings.beginGroup(Constants::S_SESSIONMODELVIEW);
+    action = m_settingsMenu->addAction("Model tech view");
+    action->setToolTip("Additional developer's view will appear in left control tab bar");
+    action->setCheckable(true);
+    action->setChecked(settings.value(Constants::S_VIEWISACTIVE, false).toBool());
+    connect(action, SIGNAL(toggled(bool)), this, SLOT(setSessionModelViewActive(bool)));
+    settings.endGroup();
+}
+
+void ActionManager::toggleCheckForUpdates(bool status)
+{
+    QSettings settings;
+    settings.beginGroup(Constants::S_UPDATES);
+    settings.setValue(Constants::S_CHECKFORUPDATES, status);
+    settings.endGroup();
+    m_mainWindow->getUpdateNotifier()->checkForUpdates();
+}
+
+void ActionManager::setSessionModelViewActive(bool status)
+{
+    QSettings settings;
+    settings.beginGroup(Constants::S_SESSIONMODELVIEW);
+    settings.setValue(Constants::S_VIEWISACTIVE, status);
+    settings.endGroup();
+    m_mainWindow->onSessionModelViewActive(status);
+}
diff --git a/GUI/coregui/mainwindow/actionmanager.h b/GUI/coregui/mainwindow/actionmanager.h
new file mode 100644
index 0000000..c250006
--- /dev/null
+++ b/GUI/coregui/mainwindow/actionmanager.h
@@ -0,0 +1,71 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/actionmanager.h
+//! @brief     Defines class ActionManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ACTIONMANAGER_H
+#define ACTIONMANAGER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class QMenu;
+class QAction;
+class QMenuBar;
+class MainWindow;
+class QShortcut;
+
+
+//! Class to handle MainWindow's menu and corresponding actions
+
+class BA_CORE_API_ ActionManager : public QObject
+{
+    Q_OBJECT
+public:
+    ActionManager(MainWindow *parent);
+
+public slots:
+    void aboutToShowRecentProjects();
+    void aboutToShowSettings();
+    void toggleCheckForUpdates(bool status);
+    void setSessionModelViewActive(bool status);
+
+private:
+    MainWindow *m_mainWindow;
+
+    QAction *m_newAction;
+    QAction *m_openAction;
+    QAction *m_saveAction;
+    QAction *m_saveAsAction;
+    QAction *m_exitAction;
+    QAction *m_aboutAction;
+    QList<QAction *> m_recentProjectActions;
+
+    QMenuBar *m_menuBar;
+    QMenu *m_fileMenu;
+    QMenu *m_settingsMenu;
+    QMenu *m_recentProjectsMenu;
+    QMenu *m_helpMenu;
+
+    QShortcut *m_runSimulationShortcut;
+
+    void createActions();
+    void createMenus();
+    void createGlobalShortcuts();
+
+};
+
+
+#endif // ACTIONMANAGER_H
+
diff --git a/GUI/coregui/mainwindow/mainwindow.cpp b/GUI/coregui/mainwindow/mainwindow.cpp
new file mode 100644
index 0000000..81edb18
--- /dev/null
+++ b/GUI/coregui/mainwindow/mainwindow.cpp
@@ -0,0 +1,322 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/mainwindow.cpp
+//! @brief     Implements class MainWindow
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "mainwindow.h"
+#include "ApplicationModels.h"
+#include "GUIHelpers.h"
+#include "ImportDataView.h"
+#include "InstrumentView.h"
+#include "JobModel.h"
+#include "JobView.h"
+#include "SampleView.h"
+#include "SessionModelView.h"
+#include "SimulationView.h"
+#include "UpdateNotifier.h"
+#include "WelcomeView.h"
+#include "aboutapplicationdialog.h"
+#include "actionmanager.h"
+#include "fancytabwidget.h"
+#include "hostosinfo.h"
+#include "mainwindow_constants.h"
+#include "manhattanstyle.h"
+#include "progressbar.h"
+#include "projectmanager.h"
+#include "stylehelper.h"
+#include "tooltipdatabase.h"
+#include <QApplication>
+#include <QCloseEvent>
+#include <QMessageBox>
+#include <QSettings>
+
+MainWindow::MainWindow(QWidget *parent)
+    : Manhattan::FancyMainWindow(parent)
+    , m_tabWidget(new Manhattan::FancyTabWidget(this))
+    , m_progressBar(new Manhattan::ProgressBar(this))
+    , m_applicationModels(new ApplicationModels(this))
+    , m_projectManager(new ProjectManager(this))
+    , m_actionManager(new ActionManager(this))
+    , m_toolTipDataBase(new ToolTipDataBase(this))
+    , m_updateNotifier(new UpdateNotifier(this))
+    , m_welcomeView(0)
+    , m_instrumentView(0)
+    , m_sampleView(0)
+    , m_importDataView(0)
+    , m_simulationView(0)
+    , m_jobView(0)
+    , m_sessionModelView(0)
+{
+    initApplication();
+    readSettings();
+    initProgressBar();
+    initViews();
+    initConnections();
+
+//    m_applicationModels->createTestSample();
+//    m_applicationModels->createTestJob();
+//    m_applicationModels->createTestRealData();
+}
+
+MaterialModel *MainWindow::materialModel()
+{
+    return models()->materialModel();
+}
+
+InstrumentModel *MainWindow::instrumentModel()
+{
+    return models()->instrumentModel();
+}
+
+SampleModel *MainWindow::sampleModel()
+{
+    return models()->sampleModel();
+}
+
+RealDataModel *MainWindow::realDataModel()
+{
+    return models()->realDataModel();
+}
+
+JobModel *MainWindow::jobModel()
+{
+    return models()->jobModel();
+}
+
+ApplicationModels *MainWindow::models()
+{
+    return m_applicationModels;
+}
+
+Manhattan::ProgressBar *MainWindow::progressBar()
+{
+    return m_progressBar;
+}
+
+QStatusBar *MainWindow::statusBar()
+{
+    return m_tabWidget->statusBar();
+}
+
+ActionManager *MainWindow::getActionManager()
+{
+    return m_actionManager;
+}
+
+ProjectManager *MainWindow::projectManager()
+{
+    return m_projectManager;
+}
+
+UpdateNotifier *MainWindow::getUpdateNotifier()
+{
+    return m_updateNotifier;
+}
+
+//! updates views which depend on others
+void MainWindow::onChangeTabWidget(int index)
+{
+    if(index == WELCOME)
+    {
+        m_welcomeView->updateRecentProjectPanel();
+    }
+    else if (index == INSTRUMENT) {
+        m_instrumentView->updateView();
+    }
+    else if(index == SIMULATION) {
+        m_simulationView->updateSimulationViewElements();
+    }
+}
+
+void MainWindow::onFocusRequest(int index)
+{
+    m_tabWidget->setCurrentIndex(index);
+}
+
+void MainWindow::openRecentProject()
+{
+    if (const QAction *action = qobject_cast<const QAction*>(sender())) {
+        QString file = action->data().value<QString>();
+        qDebug() << "MainWindow::openRecentProject() -> " << file;
+        m_projectManager->openProject(file);
+    }
+}
+
+void MainWindow::onRunSimulationShortcut()
+{
+    m_simulationView->onRunSimulationShortcut();
+}
+
+void MainWindow::onAboutApplication()
+{
+    AboutApplicationDialog dialog(this);
+    dialog.exec();
+}
+
+//! Inserts/removes developers SessionModelView on the left fancy tabbar.
+//! This SessionModelView will be known for the tab under MAXVIEWCOUNT id (so it is the last one)
+void MainWindow::onSessionModelViewActive(bool isActive)
+{
+    qDebug() << "MainWindow::onSessionModelViewActive" << isActive;
+
+    if(isActive) {
+        if(m_sessionModelView)
+            return;
+
+        m_sessionModelView = new SessionModelView(this);
+        m_tabWidget->insertTab(MAXVIEWCOUNT, m_sessionModelView, QIcon(":/images/main_sessionmodel.svg"), "Models");
+
+    } else {
+        if(!m_sessionModelView)
+            return;
+
+        if(m_tabWidget->currentIndex() == MAXVIEWCOUNT)
+            m_tabWidget->setCurrentIndex(WELCOME);
+
+        m_tabWidget->removeTab(MAXVIEWCOUNT);
+        delete m_sessionModelView;
+        m_sessionModelView = 0;
+        m_tabWidget->update();
+    }
+
+}
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+    if(jobModel()->hasUnfinishedJobs()) {
+        QMessageBox::warning(this, "Can't quit the application.",
+                             "Can't quit the application while jobs are running.\n"
+                             "Cancel running jobs or wait until they are completed.");
+        event->ignore();
+        return;
+    }
+
+    if(m_projectManager->closeCurrentProject()) {
+        writeSettings();
+        event->accept();
+    } else {
+        event->ignore();
+    }
+}
+
+//! Launch update notifier after main window appears
+void MainWindow::showEvent(QShowEvent *event)
+{
+    QWidget::showEvent( event );
+    QTimer::singleShot(100, m_updateNotifier, SLOT(askForUpdates()));
+}
+
+void MainWindow::initApplication()
+{
+    QCoreApplication::setApplicationName(QLatin1String(Constants::APPLICATION_NAME));
+    QCoreApplication::setApplicationVersion(GUIHelpers::getBornAgainVersionString());
+    QCoreApplication::setOrganizationName(QLatin1String(Constants::APPLICATION_NAME));
+
+    if (!Utils::HostOsInfo::isMacHost())
+        QApplication::setWindowIcon(QIcon(":/images/BornAgain.ico"));
+
+    QString baseName = QApplication::style()->objectName();
+    qApp->setStyle(new ManhattanStyle(baseName));
+    Manhattan::Utils::StyleHelper::setBaseColor(QColor(Constants::MAIN_THEME_COLOR));
+
+    setDockNestingEnabled(true);
+    setAcceptDrops(true);
+
+    setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
+    setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
+}
+
+void MainWindow::initProgressBar()
+{
+    m_tabWidget->addBottomCornerWidget(m_progressBar);
+    m_progressBar->hide();
+}
+
+void MainWindow::initViews()
+{
+    m_welcomeView = new WelcomeView(this);
+    m_instrumentView = new InstrumentView(this);
+    m_sampleView = new SampleView(this);
+    m_importDataView = new ImportDataView(this);
+    m_simulationView = new SimulationView(this);
+
+    m_jobView = new JobView(this);
+//    TestView *testView = new TestView(this);
+//    m_sessionModelView = new SessionModelView(this);
+//    TestFitWidgets *testFitWidgets = new TestFitWidgets(this);
+    //m_fitView = new FitView(this);
+
+    m_tabWidget->insertTab(WELCOME, m_welcomeView, QIcon(":/images/main_welcomeview.svg"), "Welcome");
+    m_tabWidget->setTabToolTip(WELCOME, QStringLiteral("Switch to Welcome View"));
+
+    m_tabWidget->insertTab(INSTRUMENT, m_instrumentView, QIcon(":/images/main_instrumentview.svg"), "Instrument");
+    m_tabWidget->setTabToolTip(INSTRUMENT, QStringLiteral("Define the beam and the detector"));
+
+    m_tabWidget->insertTab(SAMPLE, m_sampleView, QIcon(":/images/main_sampleview.svg"), "Sample");
+    m_tabWidget->setTabToolTip(SAMPLE, QStringLiteral("Build the sample"));
+
+    m_tabWidget->insertTab(IMPORT, m_importDataView, QIcon(":/images/main_importview.svg"), "Import");
+    m_tabWidget->setTabToolTip(IMPORT, QStringLiteral("Import intensity data to fit"));
+
+    m_tabWidget->insertTab(SIMULATION, m_simulationView, QIcon(":/images/main_simulationview.svg"), "Simulation");
+    m_tabWidget->setTabToolTip(SIMULATION, QStringLiteral("Run simulation"));
+
+    m_tabWidget->insertTab(JOB, m_jobView, QIcon(":/images/main_jobview.svg"), "Jobs");
+    m_tabWidget->setTabToolTip(JOB, QStringLiteral("Switch to see job results, tune parameters real time,\nfit the data"));
+
+    //m_tabWidget->insertTab(FIT, m_fitView, QIcon(":/images/main_jobview.svg"), "Fit");
+    //m_tabWidget->insertTab(MODELVIEW, m_sessionModelView, QIcon(":/images/main_sessionmodel.svg"), "Models");
+//    m_tabWidget->insertTab(TESTVIEW, testView, QIcon(":/images/main_jobview.svg"), "TestView");
+
+    m_tabWidget->setCurrentIndex(WELCOME);
+
+    // enabling technical view
+    QSettings settings;
+    settings.beginGroup(Constants::S_SESSIONMODELVIEW);
+    onSessionModelViewActive(settings.value(Constants::S_VIEWISACTIVE, false).toBool());
+    settings.endGroup();
+
+    setCentralWidget(m_tabWidget);
+}
+
+void MainWindow::readSettings()
+{
+    QSettings settings;
+    if(settings.childGroups().contains(Constants::S_MAINWINDOW)) {
+        settings.beginGroup(Constants::S_MAINWINDOW);
+        resize(settings.value(Constants::S_WINDOWSIZE, QSize(400, 400)).toSize());
+        move(settings.value(Constants::S_WINDOWPOSITION, QPoint(200, 200)).toPoint());
+        settings.endGroup();
+    }
+    m_projectManager->readSettings();
+}
+
+void MainWindow::writeSettings()
+{
+    QSettings settings;
+    settings.beginGroup(Constants::S_MAINWINDOW);
+    settings.setValue(Constants::S_WINDOWSIZE, size());
+    settings.setValue(Constants::S_WINDOWPOSITION, pos());
+    settings.endGroup();
+    m_projectManager->writeSettings();
+    settings.sync();
+}
+
+void MainWindow::initConnections()
+{
+    connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(onChangeTabWidget(int)));
+    connect(m_jobView, SIGNAL(focusRequest(int)), this, SLOT(onFocusRequest(int)));
+    connect(m_updateNotifier, SIGNAL(onUpdateNotification(const QString &)),
+            m_welcomeView, SLOT(setNotificationText(const QString &)));
+}
diff --git a/GUI/coregui/mainwindow/mainwindow.h b/GUI/coregui/mainwindow/mainwindow.h
new file mode 100644
index 0000000..75d0fe9
--- /dev/null
+++ b/GUI/coregui/mainwindow/mainwindow.h
@@ -0,0 +1,111 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/mainwindow.h
+//! @brief     Defines class MainWindow
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include "WinDllMacros.h"
+#include "fancymainwindow.h"
+
+namespace Manhattan {
+    class FancyTabWidget;
+    class ProgressBar;
+}
+
+class WelcomeView;
+class InstrumentView;
+class SampleView;
+class ImportDataView;
+class SimulationView;
+class JobView;
+class SessionModelView;
+
+class MaterialModel;
+class SampleModel;
+class InstrumentModel;
+class RealDataModel;
+class JobModel;
+class ApplicationModels;
+class ProjectManager;
+class ActionManager;
+class ToolTipDataBase;
+class UpdateNotifier;
+
+
+class BA_CORE_API_ MainWindow : public Manhattan::FancyMainWindow
+{
+    Q_OBJECT
+
+public:
+    enum ETabViewId {WELCOME, INSTRUMENT, SAMPLE, IMPORT, SIMULATION, JOB, MAXVIEWCOUNT};
+
+    explicit MainWindow(QWidget *parent = 0);
+
+    MaterialModel *materialModel();
+    InstrumentModel *instrumentModel();
+    SampleModel *sampleModel();
+    RealDataModel *realDataModel();
+    JobModel *jobModel();
+    ApplicationModels *models();
+
+    Manhattan::ProgressBar *progressBar();
+    QStatusBar *statusBar();
+
+    ActionManager *getActionManager();
+    ProjectManager *projectManager();
+    UpdateNotifier *getUpdateNotifier();
+
+public slots:
+    void onChangeTabWidget(int index);
+    void onFocusRequest(int index);
+    void openRecentProject();
+    void onRunSimulationShortcut();
+    void onAboutApplication();
+    void onSessionModelViewActive(bool isActive);
+
+protected:
+    virtual void closeEvent(QCloseEvent *event);
+    virtual void showEvent(QShowEvent *event);
+
+private:
+    void initApplication();
+    void initProgressBar();
+    void initViews();
+
+    void readSettings();
+    void writeSettings();
+    void initConnections();
+
+    Manhattan::FancyTabWidget  *m_tabWidget;
+    Manhattan::ProgressBar *m_progressBar;
+
+    ApplicationModels *m_applicationModels;
+    ProjectManager *m_projectManager;
+    ActionManager *m_actionManager;
+    ToolTipDataBase *m_toolTipDataBase;
+    UpdateNotifier *m_updateNotifier;
+
+    WelcomeView *m_welcomeView;
+    InstrumentView *m_instrumentView;
+    SampleView *m_sampleView;
+    ImportDataView *m_importDataView;
+    SimulationView *m_simulationView;
+    JobView *m_jobView;
+    SessionModelView *m_sessionModelView;
+};
+
+#endif // MAINWINDOW_H
+
diff --git a/GUI/coregui/mainwindow/mainwindow_constants.h b/GUI/coregui/mainwindow/mainwindow_constants.h
new file mode 100644
index 0000000..da14e30
--- /dev/null
+++ b/GUI/coregui/mainwindow/mainwindow_constants.h
@@ -0,0 +1,84 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/mainwindow_constants.h
+//! @brief     Defines namespace Constants
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MAINWINDOW_CONSTANTS_H
+#define MAINWINDOW_CONSTANTS_H
+
+#include <QString>
+
+namespace Constants {
+
+// general application settings
+const char APPLICATION_NAME[]     = "BornAgain";
+const char ORGANIZATION_NAME[]    = "Scientific Computing at MLZ";
+
+// Settings groups
+const char S_PROJECTMANAGER[]      = "ProjectManager";
+const char S_MAINWINDOW[]          = "MainWindow";
+const char S_MASKEDITOR[]          = "MaskEditor";
+const char S_UPDATES[]             = "Updates";
+const char S_MATERIALEDITOR[]      = "MaterialEditor";
+const char S_SESSIONMODELVIEW[]    = "SessionModelView";
+
+// Settings keys
+const char S_DEFAULTPROJECTPATH[]  = "DefaultProjectPath";
+const char S_RECENTPROJECTS[]      = "RecentProjects";
+const char S_LASTUSEDIMPORTDIR[]   = "LastUsedImportDir";
+const char S_WINDOWSIZE[]          = "size";
+const char S_WINDOWPOSITION[]      = "pos";
+const char S_SPLITTERSIZE[]        = "SplitterSize";
+const char S_CHECKFORUPDATES[]     = "CheckForUpdates";
+const char S_VIEWISACTIVE[]        = "ViewIsActive";
+
+// Updates
+const char S_VERSION_URL[]         = "http://apps.jcns.fz-juelich.de/src/BornAgain/CHANGELOG";
+const char S_DOWNLOAD_LINK[]       = "http://www.bornagainproject.org/download";
+
+const int MAX_RECENT_PROJECTS = 10;
+
+const char MIME_JOBQUEUE[] = "application/org.bornagainproject.jobqueue";
+
+// Colors
+const unsigned int MAIN_THEME_COLOR    = 0x086FA1;
+const unsigned int BUTTON_COLOR        = 0x044362;
+const unsigned int BUTTON_TEXT_COLOR   = 0xFFFFFF;
+
+const unsigned int REALTIME_WIDGET_WIDTH_HINT = 480;
+const unsigned int FIT_ACTIVITY_PANEL_HEIGHT = 380;
+const unsigned int FIT_SUITE_WIDGET_HEIGHT= 330;
+const unsigned int RUN_FIT_CONTROL_WIDGET_HEIGHT = 50;
+const unsigned int ITEM_SELECTOR_WIDGET_WIDTH = 128;
+const unsigned int ITEM_SELECTOR_WIDGET_HEIGHT = 765;
+
+// Widget names
+
+const QString JobRealTimeWidgetName = "Job Real Time";
+const QString JobPropertiesWidgetName = "Job Properties";
+const QString JobFitPanelName = "Fit Panel";
+const QString JobSelectorWidgetName = "Job Selector";
+const QString JobMessagePanelName = "Message Panel";
+
+const QString JobViewActivityName = "Job View Activity";
+const QString JobRealTimeActivityName = "Real Time Activity";
+const QString JobFittingActivityName = "Fitting Activity";
+
+//
+const QString IntensityDataWidgetName = "Color Map";
+const QString FitComparisonWidgetName = "Fit Data";
+
+}
+
+#endif // MAINWINDOW_CONSTANTS_H
diff --git a/GUI/coregui/mainwindow/newprojectdialog.cpp b/GUI/coregui/mainwindow/newprojectdialog.cpp
new file mode 100644
index 0000000..adea9a0
--- /dev/null
+++ b/GUI/coregui/mainwindow/newprojectdialog.cpp
@@ -0,0 +1,209 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/newprojectdialog.cpp
+//! @brief     Implements class NewProjectDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "newprojectdialog.h"
+#include "projectdocument.h"
+#include <QFileDialog>
+#include <QGroupBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+
+NewProjectDialog::NewProjectDialog(QWidget *parent, const QString &workingDirectory
+                                   , const QString &projectName)
+    : QDialog(parent), m_projectNameEdit(0), m_workDirEdit(0), m_browseButton(0), m_warningLabel(0),
+      m_cancelButton(0), m_createButton(0), m_valid_projectName(true), m_valid_projectPath(true)
+
+{
+    setMinimumSize(480, 280);
+    setWindowTitle("New project");
+
+    QLabel *nameLabel = new QLabel("Project name:");
+    m_projectNameEdit = new QLineEdit;
+    m_projectNameEdit->setText("Untitled");
+    connect(m_projectNameEdit, SIGNAL(textEdited(QString)), this,
+            SLOT(checkIfProjectNameIsValid(QString)));
+    nameLabel->setBuddy(m_projectNameEdit);
+
+    QLabel *parentDirLabel = new QLabel("Create in:");
+    m_workDirEdit = new QLineEdit;
+    m_workDirEdit->setText(QDir::homePath());
+    connect(m_workDirEdit, SIGNAL(textEdited(QString)), this,
+            SLOT(checkIfProjectPathIsValid(QString)));
+    parentDirLabel->setBuddy(m_workDirEdit);
+
+    m_browseButton = new QPushButton("Browse");
+    connect(m_browseButton, SIGNAL(clicked()), this, SLOT(onBrowseDirectory()));
+
+    m_warningLabel = new QLabel();
+
+    m_createButton = new QPushButton("Create");
+    connect(m_createButton, SIGNAL(clicked()), this, SLOT(createProjectDir()));
+    m_createButton->setDefault(true);
+    m_cancelButton = new QPushButton("Cancel");
+    connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
+
+    QGroupBox *projectGroup = new QGroupBox("Project name and location");
+
+    QGridLayout *layout = new QGridLayout;
+    layout->addWidget(nameLabel, 0, 0);
+    layout->addWidget(m_projectNameEdit, 0, 1);
+    layout->addWidget(parentDirLabel, 1, 0);
+    layout->addWidget(m_workDirEdit, 1, 1);
+    layout->addWidget(m_browseButton, 1, 2);
+
+    projectGroup->setLayout(layout);
+
+    QHBoxLayout *buttonsLayout = new QHBoxLayout;
+    buttonsLayout->addStretch(1);
+    buttonsLayout->addWidget(m_createButton);
+    buttonsLayout->addWidget(m_cancelButton);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout;
+    mainLayout->addWidget(projectGroup);
+    mainLayout->addWidget(m_warningLabel);
+    mainLayout->addStretch();
+    mainLayout->addLayout(buttonsLayout);
+
+    setLayout(mainLayout);
+
+    setWorkingDirectory(workingDirectory);
+    setProjectName(projectName);
+}
+
+QString NewProjectDialog::getWorkingDirectory() const
+{
+    return m_workDirEdit->text();
+}
+
+void NewProjectDialog::setWorkingDirectory(const QString &text)
+{
+    return m_workDirEdit->setText(text);
+}
+
+void NewProjectDialog::setProjectName(const QString &text)
+{
+    return m_projectNameEdit->setText(text);
+}
+
+QString NewProjectDialog::getProjectFileName() const
+{
+    QString projectDir = getWorkingDirectory() + QString("/") + getProjectName();
+    QString projectFile = getProjectName() + ProjectDocument::getProjectFileExtension();
+    QString result = projectDir + QString("/") + projectFile;
+    return result;
+}
+
+//! calls directory selection dialog
+void NewProjectDialog::onBrowseDirectory()
+{
+    QString dirname = QFileDialog::getExistingDirectory(
+        this, "Select directory", getWorkingDirectory(),
+        QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly);
+
+    if (!dirname.isEmpty()) {
+        checkIfProjectPathIsValid(dirname);
+        checkIfProjectNameIsValid(getProjectName());
+    }
+}
+
+//! Returns true if ProjectPath is valid. Corresponding directory should exists.
+void NewProjectDialog::checkIfProjectPathIsValid(const QString &dirname)
+{
+    if (QFile::exists(dirname)) {
+        setValidProjectPath(true);
+        m_workDirEdit->setText(dirname);
+    } else {
+        setValidProjectPath(false);
+    }
+    updateWarningStatus();
+}
+
+//! Returns true if project name is valid. There should not be the directory with such
+//! name in ProjectPath
+void NewProjectDialog::checkIfProjectNameIsValid(const QString &projectName)
+{
+    QDir projectDir = getWorkingDirectory() + "/" + projectName;
+    if (projectDir.exists()) {
+        setValidProjectName(false);
+    } else {
+        setValidProjectName(true);
+    }
+    updateWarningStatus();
+}
+
+//! sets flags wether project name is valid and then updates color of LineEdit
+//! and warning message
+void NewProjectDialog::setValidProjectName(bool status)
+{
+    m_valid_projectName = status;
+    QPalette palette;
+    if (m_valid_projectName) {
+        palette.setColor(QPalette::Text, Qt::black);
+    } else {
+        palette.setColor(QPalette::Text, Qt::darkRed);
+    }
+    m_projectNameEdit->setPalette(palette);
+}
+
+//! sets flags wether project path is valid and then updates color of LineEdit
+//! and warning message
+void NewProjectDialog::setValidProjectPath(bool status)
+{
+    m_valid_projectPath = status;
+    QPalette palette;
+    if (m_valid_projectPath) {
+        palette.setColor(QPalette::Text, Qt::black);
+    } else {
+        palette.setColor(QPalette::Text, Qt::darkRed);
+    }
+    m_workDirEdit->setPalette(palette);
+}
+
+//! updates warning label depending on validity of project name and path
+void NewProjectDialog::updateWarningStatus()
+{
+    if (m_valid_projectPath && m_valid_projectName) {
+        m_createButton->setEnabled(true);
+        m_warningLabel->setText("");
+    } else if (!m_valid_projectPath) {
+        m_createButton->setEnabled(false);
+        m_warningLabel->setText("<font color='darkRed'> The path '" + getWorkingDirectory()
+                                + "' does not exist. </font>");
+    } else if (!m_valid_projectName) {
+        m_createButton->setEnabled(false);
+        if (getProjectName().isEmpty()) {
+            m_warningLabel->setText("<font color='darkRed'> Please specify project name. </font>");
+        } else {
+            m_warningLabel->setText("<font color='darkRed'> The directory '" + getProjectName()
+                                    + "' already exists. </font>");
+        }
+    }
+}
+
+//! creates directory with selected ProjectName in selected ProjectPath
+void NewProjectDialog::createProjectDir()
+{
+    QDir parentDir = getWorkingDirectory();
+    if (!parentDir.mkdir(getProjectName())) {
+        m_warningLabel->setText("<font color='darkRed'> Can't make subdirectory' '"
+                                + getProjectName() + "' in '" + getWorkingDirectory()
+                                + "' </font>");
+    } else {
+        accept();
+    }
+}
diff --git a/GUI/coregui/mainwindow/newprojectdialog.h b/GUI/coregui/mainwindow/newprojectdialog.h
new file mode 100644
index 0000000..2e8d4c9
--- /dev/null
+++ b/GUI/coregui/mainwindow/newprojectdialog.h
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/newprojectdialog.h
+//! @brief     Defines class NewProjectDialog
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef NEWPROJECTDIALOG_H
+#define NEWPROJECTDIALOG_H
+
+#include "WinDllMacros.h"
+#include <QDialog>
+#include <QLineEdit>
+
+class QLabel;
+
+//! new project dialog window
+class BA_CORE_API_ NewProjectDialog : public QDialog
+{
+    Q_OBJECT
+public:
+    NewProjectDialog(QWidget *parent = 0, const QString &workingDirectory = QString(),
+                     const QString &projectName = QString());
+
+    QString getWorkingDirectory() const;
+    void setWorkingDirectory(const QString &text);
+
+    void setProjectName(const QString &text);
+
+    QString getProjectFileName() const;
+
+private slots:
+    void onBrowseDirectory();
+    void checkIfProjectPathIsValid(const QString &dirname);
+    void checkIfProjectNameIsValid(const QString &projectName);
+    void createProjectDir();
+
+private:
+    QString getProjectName() const { return m_projectNameEdit->text(); }
+
+    void setValidProjectName(bool status);
+    void setValidProjectPath(bool status);
+    void updateWarningStatus();
+
+    QLineEdit *m_projectNameEdit;
+    QLineEdit *m_workDirEdit;
+    QPushButton *m_browseButton;
+    QLabel *m_warningLabel;
+    QPushButton *m_cancelButton;
+    QPushButton *m_createButton;
+
+    bool m_valid_projectName;
+    bool m_valid_projectPath;
+};
+
+#endif // NEWPROJECTDIALOG_H
diff --git a/GUI/coregui/mainwindow/projectdocument.cpp b/GUI/coregui/mainwindow/projectdocument.cpp
new file mode 100644
index 0000000..efa9f05
--- /dev/null
+++ b/GUI/coregui/mainwindow/projectdocument.cpp
@@ -0,0 +1,283 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/projectdocument.cpp
+//! @brief     Implements class ProjectDocument
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "projectdocument.h"
+#include "ApplicationModels.h"
+#include "GUIHelpers.h"
+#include "WarningMessageService.h"
+#include <QDebug>
+#include <QDir>
+#include <QXmlStreamReader>
+
+namespace {
+const QString OPEN_FILE_ERROR = "OPEN_FILE_ERROR";
+const QString EXCEPTION_THROW = "EXCEPTION_THROW";
+const QString XML_FORMAT_ERROR = "XML_FORMAT_ERROR";
+const QString minimal_supported_version = "1.6.0";
+}
+
+ProjectDocument::ProjectDocument()
+    : m_applicationModels(0)
+    , m_modified(false), m_documentStatus(STATUS_OK), m_messageService(0)
+{
+    setObjectName("ProjectDocument");
+}
+
+ProjectDocument::ProjectDocument(const QString &projectFileName)
+    : m_applicationModels(0)
+    , m_modified(false), m_documentStatus(STATUS_OK), m_messageService(0)
+{
+    setObjectName("ProjectDocument");
+    setProjectFileName(projectFileName);
+}
+
+QString ProjectDocument::getProjectName() const
+{
+    return m_project_name;
+}
+
+void ProjectDocument::setProjectName(const QString &text)
+{
+    m_project_name = text;
+    emit modified();
+}
+
+QString ProjectDocument::getProjectDir() const
+{
+    return m_project_dir;
+}
+
+void ProjectDocument::setProjectDir(const QString &text)
+{
+    m_project_dir = text;
+}
+
+QString ProjectDocument::getProjectFileName() const
+{
+    QString result = getProjectDir() + "/" + getProjectName() + getProjectFileExtension();
+    return result;
+}
+
+void ProjectDocument::setProjectFileName(const QString &projectFileName)
+{
+    QFileInfo info(projectFileName);
+    setProjectName(info.baseName());
+    setProjectDir(info.path());
+}
+
+QString ProjectDocument::getProjectFileExtension()
+{
+    return QString(".pro");
+}
+
+void ProjectDocument::setApplicationModels(ApplicationModels *applicationModels)
+{
+    if (applicationModels != m_applicationModels) {
+        disconnectModels();
+        m_applicationModels = applicationModels;
+        connectModels();
+    }
+}
+
+bool ProjectDocument::save()
+{
+    cleanProjectDir();
+//    reviseOutputData();
+    QString filename = getProjectFileName();
+
+    QFile file(filename);
+    if (!file.open(QFile::ReadWrite | QIODevice::Truncate | QFile::Text)) {
+        qDebug() << "ProjectDocument::save() -> Error! Can't save file";
+        return false;
+    }
+    writeTo(&file);
+    file.close();
+    m_applicationModels->saveNonXMLData(getProjectDir());
+
+    m_modified = false;
+    emit modified();
+
+    return true;
+}
+
+bool ProjectDocument::load(const QString &project_file_name)
+{
+    m_documentStatus = STATUS_OK;
+
+    setProjectFileName(project_file_name);
+
+    QFile file(getProjectFileName());
+    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+        m_messageService->send_message(this, OPEN_FILE_ERROR, file.errorString());
+        m_documentStatus = EDocumentStatus(m_documentStatus|STATUS_FAILED);
+        return false;
+    }
+
+    try {
+        // loading project file
+        disconnectModels();
+        readFrom(&file);
+        file.close();
+        m_applicationModels->loadNonXMLData(getProjectDir());
+        connectModels();
+
+    } catch (const std::exception &ex) {
+        m_documentStatus = EDocumentStatus(m_documentStatus | STATUS_FAILED);
+        m_messageService->send_message(this, EXCEPTION_THROW, QString(ex.what()));
+        return false;
+    }
+
+    return true;
+}
+
+bool ProjectDocument::hasValidNameAndPath()
+{
+    return (!m_project_name.isEmpty() && !m_project_dir.isEmpty());
+}
+
+bool ProjectDocument::isModified()
+{
+    return m_modified;
+}
+
+void ProjectDocument::setLogger(WarningMessageService *messageService)
+{
+    m_messageService = messageService;
+}
+
+ProjectDocument::EDocumentStatus ProjectDocument::getDocumentStatus() const
+{
+    return m_documentStatus;
+}
+
+bool ProjectDocument::isReady() const
+{
+    return (m_documentStatus == STATUS_OK);
+}
+
+bool ProjectDocument::hasWarnings() const
+{
+    return (m_documentStatus & STATUS_WARNING);
+}
+
+bool ProjectDocument::hasErrors() const
+{
+    return (m_documentStatus & STATUS_FAILED);
+}
+
+QString ProjectDocument::getDocumentVersion() const
+{
+    QString result(m_currentVersion);
+    if(result.isEmpty()) result = GUIHelpers::getBornAgainVersionString();
+    return result;
+}
+
+void ProjectDocument::onModelChanged()
+{
+    m_modified = true;
+    emit modified();
+}
+
+void ProjectDocument::readFrom(QIODevice *device)
+{
+    QXmlStreamReader reader(device);
+
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.isStartElement()) {
+            if (reader.name() == ProjectDocumentXML::BornAgainTag) {
+                m_currentVersion = reader.attributes()
+                                            .value(ProjectDocumentXML::BornAgainVersionAttribute)
+                                            .toString();
+                if(!GUIHelpers::isVersionMatchMinimal(m_currentVersion, minimal_supported_version)) {
+                    m_documentStatus = EDocumentStatus(m_documentStatus | STATUS_FAILED);
+                    QString message = QString("Can't open document version '%1', "
+                        "minimal supported version '%2'").arg(m_currentVersion)
+                            .arg(minimal_supported_version);
+                    m_messageService->send_message(this, OPEN_FILE_ERROR, message);
+                    return;
+                }
+
+            }
+
+            else if (reader.name() == ProjectDocumentXML::InfoTag) {
+                //
+            } else {
+                m_applicationModels->readFrom(&reader, m_messageService);
+                if(m_messageService->hasWarnings(m_applicationModels)) {
+                    m_documentStatus = EDocumentStatus(m_documentStatus|STATUS_WARNING);
+                }
+            }
+
+        }
+    }
+
+    if (reader.hasError()) {
+        m_documentStatus = EDocumentStatus(m_documentStatus | STATUS_FAILED);
+        m_messageService->send_message(this, XML_FORMAT_ERROR, reader.errorString());
+        return;
+    }
+}
+
+void ProjectDocument::writeTo(QIODevice *device)
+{
+    QXmlStreamWriter writer(device);
+    writer.setAutoFormatting(true);
+    writer.writeStartDocument();
+    writer.writeStartElement("BornAgain");
+    QString version_string = GUIHelpers::getBornAgainVersionString();
+    writer.writeAttribute("Version", version_string);
+
+    writer.writeStartElement(ProjectDocumentXML::InfoTag);
+    writer.writeAttribute(ProjectDocumentXML::InfoNameAttribute, getProjectName());
+    writer.writeEndElement(); // InfoTag
+
+    m_applicationModels->writeTo(&writer);
+
+    writer.writeEndElement(); // BornAgain tag
+    writer.writeEndDocument();
+}
+
+//! Cleans projectDir from *.int.gz files. Done on project save.
+
+void ProjectDocument::cleanProjectDir()
+{
+    QDir dir(getProjectDir());
+    QStringList filters("*.int.gz");
+    QStringList intensityFiles = dir.entryList(filters);
+    foreach(QString fileName, intensityFiles) {
+        QString filename = getProjectDir() + QStringLiteral("/") + fileName;
+        QFile fin(filename);
+        if (fin.exists())
+            fin.remove();
+    }
+}
+
+void ProjectDocument::disconnectModels()
+{
+    if(m_applicationModels) {
+        disconnect(m_applicationModels, SIGNAL(modelChanged()), this,
+                   SLOT(onModelChanged()));
+    }
+}
+
+void ProjectDocument::connectModels()
+{
+    if(m_applicationModels) {
+        connect(m_applicationModels, SIGNAL(modelChanged()), this,
+                   SLOT(onModelChanged()), Qt::UniqueConnection);
+    }
+}
diff --git a/GUI/coregui/mainwindow/projectdocument.h b/GUI/coregui/mainwindow/projectdocument.h
new file mode 100644
index 0000000..f6c850d
--- /dev/null
+++ b/GUI/coregui/mainwindow/projectdocument.h
@@ -0,0 +1,115 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/projectdocument.h
+//! @brief     Defines class ProjectDocument
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROJECTDOCUMENT_H
+#define PROJECTDOCUMENT_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+class QIODevice;
+class ApplicationModels;
+class WarningMessageService;
+
+namespace ProjectDocumentXML
+{
+const QString BornAgainTag("BornAgain");
+const QString BornAgainVersionAttribute("Version");
+const QString InfoTag("DocumentInfo");
+const QString InfoNameAttribute("ProjectName");
+}
+
+
+//! Project document class handles all data related to the opened project
+//! (sample, jobModel, project specific windows settings)
+//!
+//! e.g. if project file is /home/users/development/Untitled/Untitled.pro
+//! getProjectName()     - 'Untitled'
+//! getProjectDir()      - 'home/users/development/Untitled
+//! getProjectFileName() - '/home/users/development/Untitled/Untitled.pro'
+class BA_CORE_API_ ProjectDocument : public QObject
+{
+    Q_OBJECT
+
+public:
+    enum EDocumentStatus {
+        STATUS_OK = 0x0001,
+        STATUS_WARNING = 0x0002,
+        STATUS_FAILED = 0x0004
+    };
+
+    ProjectDocument();
+    ProjectDocument(const QString &projectFileName);
+
+    QString getProjectName() const;
+    void setProjectName(const QString &text);
+
+    QString getProjectDir() const;
+    void setProjectDir(const QString &text);
+
+    QString getProjectFileName() const;
+    void setProjectFileName(const QString &text);
+
+    static QString getProjectFileExtension();
+
+    void setApplicationModels(ApplicationModels *applicationModels);
+
+    bool save();
+    bool load(const QString &project_file_name);
+
+    bool hasValidNameAndPath();
+
+    bool isModified();
+
+    void setLogger(WarningMessageService *messageService);
+
+    EDocumentStatus getDocumentStatus() const;
+
+    bool isReady() const;
+
+    bool hasWarnings() const;
+
+    bool hasErrors() const;
+
+    QString getDocumentVersion() const;
+
+signals:
+    void modified();
+
+public slots:
+    void onModelChanged();
+
+private:
+    void readFrom(QIODevice *device);
+    void writeTo(QIODevice *device);
+
+    void cleanProjectDir();
+
+    void disconnectModels();
+    void connectModels();
+
+    QString m_project_dir;
+    QString m_project_name;
+    ApplicationModels *m_applicationModels;
+    bool m_modified;
+    EDocumentStatus m_documentStatus;
+    WarningMessageService *m_messageService;
+    QString m_currentVersion;
+};
+
+
+#endif // PROJECTDOCUMENT_H
+
diff --git a/GUI/coregui/mainwindow/projectmanager.cpp b/GUI/coregui/mainwindow/projectmanager.cpp
new file mode 100644
index 0000000..df92d90
--- /dev/null
+++ b/GUI/coregui/mainwindow/projectmanager.cpp
@@ -0,0 +1,362 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/projectmanager.cpp
+//! @brief     Implements class ProjectManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "projectmanager.h"
+#include "AppSvc.h"
+#include "ApplicationModels.h"
+#include "GUIHelpers.h"
+#include "ProjectLoadWarningDialog.h"
+#include "WarningMessageService.h"
+#include "mainwindow.h"
+#include "mainwindow_constants.h"
+#include "newprojectdialog.h"
+#include "projectdocument.h"
+#include <QDebug>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QSettings>
+#include <QStandardPaths>
+
+ProjectManager::ProjectManager(MainWindow *parent)
+    : m_mainWindow(parent)
+    , m_project_document(0)
+    , m_messageService(new WarningMessageService)
+
+{
+    createNewProject();
+    AppSvc::subscribe(this);
+}
+
+
+ProjectManager::~ProjectManager()
+{
+    AppSvc::unsubscribe(this);
+    delete m_project_document;
+    delete m_messageService;
+}
+
+
+//! Close current project. Call save/discard/cancel dialog, if necessary.
+//! Returns false if saving was canceled.
+bool ProjectManager::closeCurrentProject()
+{
+    bool projectWasClosed(true);
+
+    if(m_project_document && m_project_document->isModified()) {
+        QMessageBox msgBox;
+        msgBox.setText("The project has been modified.");
+        msgBox.setInformativeText("Do you want to save your changes?");
+        msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
+        msgBox.setDefaultButton(QMessageBox::Save);
+        int ret = msgBox.exec();
+
+        switch (ret) {
+          case QMessageBox::Save:
+              if(!saveProject()) projectWasClosed = false;
+              break;
+          case QMessageBox::Discard:
+              break;
+          case QMessageBox::Cancel:
+              projectWasClosed = false;
+              break;
+          default:
+              break;
+        }
+    }
+
+    if(projectWasClosed) deleteCurrentProject();
+
+    return projectWasClosed;
+}
+
+
+//! call dialog window to define project path and name
+void ProjectManager::createNewProject()
+{
+    if(m_project_document)
+        throw GUIHelpers::Error("ProjectManager::createNewProject() -> Project already exists");
+
+    m_messageService->clear();
+
+    m_project_document = new ProjectDocument();
+    connect(m_project_document, SIGNAL(modified()), this, SLOT(onDocumentModified()));
+    m_project_document->setProjectName("Untitled");
+    m_project_document->setApplicationModels(m_mainWindow->models());
+    m_project_document->setLogger(m_messageService);
+}
+
+
+void ProjectManager::onDocumentModified()
+{
+    Q_ASSERT(m_project_document);
+    if(m_project_document->isModified()) {
+        m_mainWindow->setWindowTitle("*"+m_project_document->getProjectName());
+    } else {
+        m_mainWindow->setWindowTitle(m_project_document->getProjectName());
+    }
+}
+
+
+void ProjectManager::newProject()
+{
+    if( !closeCurrentProject()) return;
+
+    NewProjectDialog dialog(m_mainWindow, getDefaultWorkingDirectory(), getUntitledProjectName());
+
+    if (dialog.exec() == QDialog::Accepted) {
+        createNewProject();
+        m_defaultWorkingDirectory = dialog.getWorkingDirectory();
+        m_project_document->setProjectFileName(dialog.getProjectFileName());
+        saveProject();
+        emit modified();
+    }
+}
+
+
+bool ProjectManager::saveProject()
+{
+    Q_ASSERT(m_project_document);
+    qDebug() << "ProjectManager::saveProject()";
+
+    if(!m_project_document->hasValidNameAndPath()) {
+        NewProjectDialog dialog(m_mainWindow, getDefaultWorkingDirectory(), getUntitledProjectName());
+
+        if (dialog.exec() == QDialog::Accepted) {
+            m_defaultWorkingDirectory = dialog.getWorkingDirectory();
+            m_project_document->setProjectFileName(dialog.getProjectFileName());
+        } else {
+           return false;
+        }
+    }
+
+    bool success = m_project_document->save();
+    if(success == false) {
+        QMessageBox::warning(m_mainWindow, "Error while saving project",
+                             QString("Failed to save project under '%1'.")
+                             .arg(m_project_document->getProjectDir()));
+        return false;
+
+     }
+
+    addToRecentProjects();
+    modified();
+
+    return true;
+}
+
+bool ProjectManager::saveProjectAs()
+{
+    NewProjectDialog dialog(m_mainWindow, getDefaultWorkingDirectory(), getUntitledProjectName());
+
+    if (dialog.exec() == QDialog::Accepted) {
+        m_defaultWorkingDirectory = dialog.getWorkingDirectory();
+        m_project_document->setProjectFileName(dialog.getProjectFileName());
+        m_project_document->save();
+        addToRecentProjects();
+    } else {
+        return false;
+    }
+
+    modified();
+    return true;
+}
+
+//! Opens existing project. If fileName is empty, will popup file selection dialog
+void ProjectManager::openProject(QString fileName)
+{
+    qDebug() << "ProjectManager::openProject()" << fileName;
+    if( !closeCurrentProject()) return;
+
+    if(fileName.isEmpty()) {
+        fileName = QFileDialog::getOpenFileName(m_mainWindow, "Open project file",
+                                                    getDefaultWorkingDirectory(),
+                                         "BornAgain project Files (*.pro)");
+
+        if(fileName.isEmpty()) return;
+
+    }
+
+    createNewProject();
+
+    m_project_document->load(fileName);
+
+    if(m_project_document->isReady()) {
+        addToRecentProjects();
+
+    } else if (m_project_document->hasErrors()) {
+        riseProjectLoadFailedDialog();
+        deleteCurrentProject();
+        createNewProject();
+
+    } else if(m_project_document->hasWarnings()) {
+        riseProjectLoadWarningDialog();
+        addToRecentProjects();
+    }
+
+    emit projectOpened();
+    emit modified();
+}
+
+//! Add name of the current project to the name of recent projects
+void ProjectManager::addToRecentProjects()
+{
+    QString fileName = m_project_document->getProjectFileName();
+    m_recentProjects.removeAll(fileName);
+    m_recentProjects.prepend(fileName);
+    while (m_recentProjects.size() > Constants::MAX_RECENT_PROJECTS)
+        m_recentProjects.removeLast();
+}
+
+//! read settings of ProjectManager from global settings
+void ProjectManager::readSettings()
+{
+    QSettings settings;
+    m_defaultWorkingDirectory = QDir::homePath();
+    if(settings.childGroups().contains(Constants::S_PROJECTMANAGER)) {
+        settings.beginGroup(Constants::S_PROJECTMANAGER);
+        m_defaultWorkingDirectory = settings.value(Constants::S_DEFAULTPROJECTPATH).toString();
+        m_recentProjects = settings.value(Constants::S_RECENTPROJECTS).toStringList();
+        settings.endGroup();
+    }
+}
+
+//! saves settings of ProjectManager in global settings
+void ProjectManager::writeSettings()
+{
+    QSettings settings;
+    settings.beginGroup(Constants::S_PROJECTMANAGER);
+    settings.setValue(Constants::S_DEFAULTPROJECTPATH, m_defaultWorkingDirectory);
+    settings.setValue(Constants::S_RECENTPROJECTS, m_recentProjects);
+    settings.endGroup();
+}
+
+//! returns list of recent projects, validates if projects still exists on disk
+QStringList ProjectManager::getRecentProjects()
+{
+    QStringList updatedList;
+    foreach(QString fileName, m_recentProjects) {
+        QFile fin(fileName);
+        if(fin.exists()) updatedList.append(fileName);
+    }
+    m_recentProjects = updatedList;
+    return m_recentProjects;
+}
+
+//!returns name of the current project directory
+QString ProjectManager::getProjectDir() const
+{
+    if(m_project_document && m_project_document->hasValidNameAndPath()) {
+        return m_project_document->getProjectDir();
+    }
+    return QString();
+}
+
+//! Returns directory name suitable for saving plots
+QString ProjectManager::userExportDir() const
+{
+    QString result = getProjectDir();
+    if(result.isEmpty()) {
+        result = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
+    }
+    return result;
+}
+
+//! Returns directory name which was used by the user to import files.
+QString ProjectManager::userImportDir() const
+{
+    QString result;
+    QSettings settings;
+    if(settings.childGroups().contains(Constants::S_PROJECTMANAGER)) {
+        settings.beginGroup(Constants::S_PROJECTMANAGER);
+        result = settings.value(Constants::S_LASTUSEDIMPORTDIR, QString()).toString();
+        settings.endGroup();
+    }
+    if(result.isEmpty())
+        result = userExportDir();
+
+    return result;
+}
+
+//! Set user import directory in system settings
+void ProjectManager::setImportDir(const QString &dirname)
+{
+    QSettings settings;
+    if(settings.childGroups().contains(Constants::S_PROJECTMANAGER)) {
+        settings.beginGroup(Constants::S_PROJECTMANAGER);
+        settings.setValue(Constants::S_LASTUSEDIMPORTDIR, dirname);
+        settings.endGroup();
+    }
+}
+
+//! clear list of recent projects
+void ProjectManager::clearRecentProjects()
+{
+    m_recentProjects.clear();
+    modified();
+}
+
+//! returns default project path
+QString ProjectManager::getDefaultWorkingDirectory()
+{
+    return m_defaultWorkingDirectory;
+}
+
+//! Will return 'Untitled' if the directory with such name doesn't exist in project
+//! path. Otherwise will return Untitled1, Untitled2 etc.
+QString ProjectManager::getUntitledProjectName()
+{
+    QString result = "Untitled";
+    QDir projectDir = getDefaultWorkingDirectory() + "/" + result;
+    if(projectDir.exists()) {
+        for(size_t i=1; i<99; ++i) {
+            result = QString("Untitled")+QString::number(i);
+            projectDir = getDefaultWorkingDirectory() + "/" + result;
+            if(!projectDir.exists()) break;
+        }
+    }
+    return result;
+}
+
+void ProjectManager::riseProjectLoadFailedDialog()
+{
+    QString message = QString("Failed to load the project '%1' \n\n")
+            .arg(m_project_document->getProjectFileName());
+
+    QString details = m_messageService->getMessages(m_project_document);
+    message.append(details);
+
+    QMessageBox::warning(m_mainWindow, "Error while opening project file", message);
+}
+
+void ProjectManager::riseProjectLoadWarningDialog()
+{
+    Q_ASSERT(m_project_document);
+    ProjectLoadWarningDialog *warningDialog
+            = new ProjectLoadWarningDialog(m_mainWindow, m_messageService,
+                                           m_project_document->getDocumentVersion());
+
+    warningDialog->show();
+    warningDialog->raise();
+}
+
+void ProjectManager::deleteCurrentProject()
+{
+    delete m_project_document;
+    m_project_document = 0;
+    m_mainWindow->models()->resetModels();
+}
+
+
diff --git a/GUI/coregui/mainwindow/projectmanager.h b/GUI/coregui/mainwindow/projectmanager.h
new file mode 100644
index 0000000..182ef2d
--- /dev/null
+++ b/GUI/coregui/mainwindow/projectmanager.h
@@ -0,0 +1,85 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/projectmanager.h
+//! @brief     Defines class ProjectManager
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PROJECTMANAGER_H
+#define PROJECTMANAGER_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+#include <QStringList>
+
+class MainWindow;
+class ProjectDocument;
+class WarningMessageService;
+
+//! handles activity related to opening/save projects
+class BA_CORE_API_ ProjectManager : public QObject
+{
+    Q_OBJECT
+public:
+    ProjectManager(MainWindow *parent);
+    virtual ~ProjectManager();
+
+    void createNewProject();
+    bool closeCurrentProject();
+
+    void readSettings();
+    void writeSettings();
+
+    QStringList getRecentProjects();
+
+    ProjectDocument *getDocument() { return m_project_document; }
+
+    QString getProjectDir() const;
+
+    QString userExportDir() const;
+    QString userImportDir() const;
+    void setImportDir(const QString &dirname);
+
+signals:
+    void modified();
+    void projectOpened();
+
+public slots:
+    void clearRecentProjects();
+    void onDocumentModified();
+    bool saveProject();
+    bool saveProjectAs();
+    void openProject(QString fileName = QString());
+    void newProject();
+
+private:
+//    ProjectDocument *createNewProject();
+    void addToRecentProjects();
+
+    QString getDefaultWorkingDirectory();
+    QString getUntitledProjectName();
+
+    void riseProjectLoadFailedDialog();
+    void riseProjectLoadWarningDialog();
+
+    void deleteCurrentProject();
+
+    MainWindow *m_mainWindow;
+
+    ProjectDocument *m_project_document;
+
+    QString m_defaultWorkingDirectory;
+    QStringList m_recentProjects;
+    WarningMessageService *m_messageService;
+};
+
+#endif // PROJECTMANAGER_H
diff --git a/GUI/coregui/mainwindow/tooltipdatabase.cpp b/GUI/coregui/mainwindow/tooltipdatabase.cpp
new file mode 100644
index 0000000..7592b3f
--- /dev/null
+++ b/GUI/coregui/mainwindow/tooltipdatabase.cpp
@@ -0,0 +1,148 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/tooltipdatabase.cpp
+//! @brief     Implements class ToolTipDataBase
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "tooltipdatabase.h"
+#include "GUIHelpers.h"
+#include "item_constants.h"
+#include <QDebug>
+#include <QFile>
+#include <QXmlStreamReader>
+
+ToolTipDataBase *ToolTipDataBase::m_instance = 0;
+QMap<QString, QString > ToolTipDataBase::m_tagToToolTip = QMap<QString, QString >();
+
+
+ToolTipDataBase::ToolTipDataBase(QObject *parent)
+    : QObject(parent)
+{
+    Q_ASSERT(!m_instance);
+    m_instance = this;
+
+    initDataBase();
+}
+
+
+ToolTipDataBase::~ToolTipDataBase()
+{
+    m_instance = 0;
+}
+
+
+QString ToolTipDataBase::getSampleViewToolTip(const QString &className, const QString &propertyName)
+{
+    Q_ASSERT(m_instance);
+    return m_instance->this_getToolTip(ToolTipsXML::sampleViewContext, className, propertyName);
+}
+
+QString ToolTipDataBase::getSampleViewWidgetboxToolTip(const QString &className)
+{
+    Q_ASSERT(m_instance);
+    QString modelName(className);
+    modelName.remove(Constants::FormFactorType);
+    return m_instance->this_getToolTip(ToolTipsXML::sampleViewContext, modelName, ToolTipsXML::titleProperty);
+}
+
+QString ToolTipDataBase::getSampleViewDesignerToolTip(const QString &className)
+{
+    Q_ASSERT(m_instance);
+    QString title = m_instance->this_getToolTip(ToolTipsXML::sampleViewContext, className,  ToolTipsXML::titleProperty);
+    QString descr = m_instance->this_getToolTip(ToolTipsXML::sampleViewContext, className,  ToolTipsXML::descriptionProperty);
+    QString result;
+    if(!descr.isEmpty()) {
+        result = QString("%1\n%2\n%3").arg(className, title, descr);
+    } else {
+        result = QString("%1\n%2").arg(className, title);
+    }
+    return result;
+}
+
+
+void ToolTipDataBase::initDataBase()
+{
+    qDebug() << "ToolTipDataBase::initDataBase() ";
+
+    QFile file(":/mainwindow/tooltips.xml");
+    if (!file.open(QIODevice::ReadOnly))
+        throw GUIHelpers::Error(file.errorString());
+
+    QXmlStreamReader reader(&file);
+
+    QString contextName, className, propertyName;
+    while (!reader.atEnd()) {
+        switch (reader.readNext()) {
+        case QXmlStreamReader::StartElement: {
+            const QStringRef tag = reader.name();
+            if (tag == ToolTipsXML::modelTag) {
+                continue;
+            }
+            if (tag == ToolTipsXML::contextTag) {
+                const QXmlStreamAttributes attributes = reader.attributes();
+                contextName = attributes.value(ToolTipsXML::nameAttribute).toString();
+                continue;
+            }
+            if (tag == ToolTipsXML::categoryTag) {
+                const QXmlStreamAttributes attributes = reader.attributes();
+                className = attributes.value(ToolTipsXML::nameAttribute).toString();
+                continue;
+            }
+            if (tag == ToolTipsXML::propertyTag) {
+                const QXmlStreamAttributes attributes = reader.attributes();
+                propertyName = attributes.value(ToolTipsXML::nameAttribute).toString();
+                continue;
+            }
+            if (tag == ToolTipsXML::tooltipTag) {
+                reader.readNext();
+                QString toolTip = reader.text().toString();
+                addToolTip(contextName, className, propertyName, toolTip);
+                continue;
+            }
+            break;
+        }
+        case QXmlStreamReader::EndElement: {
+           break;
+        }
+        default: break;
+        }
+    }
+
+    if (reader.hasError())
+        throw GUIHelpers::Error(reader.errorString());
+}
+
+
+QString ToolTipDataBase::getTag(const QString &contextName, const QString &categoryName, const QString &propertyName)
+{
+    return QString("/%1/%2/%3").arg(contextName, categoryName, propertyName);
+}
+
+
+void ToolTipDataBase::addToolTip(const QString &contextName, const QString &categoryName, const QString &propertyName, const QString &tooltip)
+{
+    if(!tooltip.isEmpty()) {
+//        QString formattedToolTip = QString("<FONT COLOR=black>"); // to have automatic line wrap
+//        formattedToolTip += tooltip;
+//        formattedToolTip += QString("</FONT>");
+        QString formattedToolTip = tooltip;
+        m_tagToToolTip[getTag(contextName, categoryName, propertyName)] = formattedToolTip;
+    }
+}
+
+
+QString ToolTipDataBase::this_getToolTip(const QString &contextName, const QString &categoryName, const QString &propertyName)
+{
+    return m_tagToToolTip[getTag(contextName, categoryName, propertyName)];
+}
+
diff --git a/GUI/coregui/mainwindow/tooltipdatabase.h b/GUI/coregui/mainwindow/tooltipdatabase.h
new file mode 100644
index 0000000..a0a3843
--- /dev/null
+++ b/GUI/coregui/mainwindow/tooltipdatabase.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/mainwindow/tooltipdatabase.h
+//! @brief     Defines class ToolTipDataBase
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef TOOLTIPDATABASE_H
+#define TOOLTIPDATABASE_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+namespace ToolTipsXML {
+const QString modelTag = "ToolTipsData";
+const QString contextTag = "context";
+const QString categoryTag = "category";
+const QString propertyTag = "property";
+const QString tooltipTag = "tooltip";
+const QString whatsthisTag = "whatsthis";
+const QString nameAttribute = "name";
+const QString sampleViewContext = "SampleView";
+const QString titleProperty = "Title";
+const QString descriptionProperty = "Description";
+}
+
+
+//! The MaterialEditor is the main class to access materials.
+class BA_CORE_API_ ToolTipDataBase : public QObject
+{
+    Q_OBJECT
+public:
+    ToolTipDataBase(QObject *parent=0);
+    virtual ~ToolTipDataBase();
+
+    static QString getSampleViewToolTip(const QString &className, const QString &propertyName);
+    static QString getSampleViewWidgetboxToolTip(const QString &className);
+    static QString getSampleViewDesignerToolTip(const QString &className);
+
+private:
+    void initDataBase();
+    QString getTag(const QString &contextName, const QString &categoryName, const QString &propertyName);
+    void addToolTip(const QString &contextName, const QString &categoryName, const QString &propertyName, const QString &tooltip);
+    QString this_getToolTip(const QString &contextName, const QString &categoryName, const QString &propertyName);
+
+    static ToolTipDataBase *m_instance;
+
+    static QMap<QString, QString > m_tagToToolTip;
+};
+
+#endif // TOOLTIPDATABASE_H
diff --git a/GUI/coregui/mainwindow/tooltips.xml b/GUI/coregui/mainwindow/tooltips.xml
new file mode 100644
index 0000000..3dce3cf
--- /dev/null
+++ b/GUI/coregui/mainwindow/tooltips.xml
@@ -0,0 +1,592 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ToolTipsData version="1.0">
+    <context name="SampleView">
+
+        <category name="MultiLayer">
+            <property name="Title">
+                <tooltip>A Multi-Layer with cross correlation length</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+            <property name="Cross Correlation Length">
+                <tooltip>Cross Correlation Length for roughness between interfaces in nm</tooltip>
+            </property>
+        </category>
+
+        <category name="Layer">
+            <property name="Title">
+                <tooltip>A Layer with thickness and material</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+            <property name="Thickness">
+                <tooltip>Thickness of Layer in nm</tooltip>
+            </property>
+            <property name="Top roughness">
+                <tooltip>Is the top interface of the Layer rough or not?</tooltip>
+            </property>
+        </category>
+
+        <category name="ParticleLayout">
+            <property name="Title">
+                <tooltip>A Layout of particles </tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+            <property name="Approximation">
+                <tooltip>Approximation used to distribute the particles: Decoupling, Local Monodisperse or Size Space Coupling</tooltip>
+            </property>
+        </category>
+
+        <category name="InterferenceFunctionRadialParaCrystal">
+            <property name="Title">
+                <tooltip>Interference 1D Paracrystal</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+            <property name="Peak_distance">
+                <tooltip>Distance to the first neighbor peak in nm</tooltip>
+            </property>
+            <property name="Damping_length">
+                <tooltip>Damping length in nm (finite size effects). If non-zero, PDF multiplied by exp(-Peak_distance/Damping_length)</tooltip>
+            </property>
+            <property name="Domain_size">
+                <tooltip>Coherent domain size along the lattice main axis</tooltip>
+            </property>
+            <property name="Size_space_coupling">
+                <tooltip>Size spacing coupling parameter of the Size Spacing Correlation Approximation</tooltip>
+            </property>
+            <property name="PDF">
+                <tooltip>1D Probability Distribution Function</tooltip>
+            </property>
+        </category>
+
+        <category name="InterferenceFunction2DParaCrystal">
+            <property name="Title">
+                <tooltip>Interference 2D Paracrystal</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+            <property name="Lattice_type">
+                <tooltip>Lattice type: Basic, Hexagonal or Square</tooltip>
+            </property>
+            <property name="Rotation_angle">
+                <tooltip>Angle between the first basis vector and the x-axis of the incoming beam, in degrees</tooltip>
+            </property>
+            <property name="Damping_length">
+                <tooltip>Damping length in nm (finite size effects)</tooltip>
+            </property>
+            <property name="Domain_size1">
+                <tooltip>Dimension of the coherent domain along the first basis vector</tooltip>
+            </property>
+            <property name="Domain_size2">
+                <tooltip>Dimension of the coherent domain along the second basis vector</tooltip>
+            </property>
+            <property name="Integration_over_xi">
+                <tooltip>Averaging over the Rotation_angle</tooltip>
+            </property>
+            <property name="PDF1">
+                <tooltip>2D Probability Distribution Function in the first basis direction</tooltip>
+            </property>
+            <property name="PDF2">
+                <tooltip>2D Probability Distribution Function in the second basis direction</tooltip>
+            </property>
+        </category>
+
+        <category name="InterferenceFunction2DLattice">
+            <property name="Title">
+                <tooltip>Interference 2D lattice </tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+            <property name="Lattice_type">
+                <tooltip>Type of lattice: Basic, Hexagonal or Square</tooltip>
+            </property>
+            <property name="Rotation_angle">
+                <tooltip>Angle between the first basis vector and the x-axis of the incoming beam in degrees</tooltip>
+            </property>
+            <property name="PDF">
+                <tooltip>Probability Distribution Function</tooltip>
+            </property>
+        </category>
+
+        <category name="AnisoPyramid">
+            <property name="Title">
+                <tooltip>Pyramid with a rectangular base </tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>to be completed</tooltip>
+            </property>
+            <property name="Length">
+                <tooltip>Length of the rectangular base in nm</tooltip>
+            </property>
+            <property name="Width">
+                <tooltip>Width of the rectangular base in nm</tooltip>
+            </property>
+            <property name="Height">
+                <tooltip>Height of the Anisotropic Pyramid in nm</tooltip>
+            </property>
+            <property name="Alpha">
+                <tooltip>Angle between the base and the middle of side faces in degrees</tooltip>
+            </property>
+        </category>
+
+        <category name="Box">
+            <property name="Title">
+                <tooltip>Rectangular cuboid </tooltip>
+            </property>
+            <property name="Description">
+               <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Length">
+                <tooltip>Length of the base in nm</tooltip>
+            </property>
+            <property name="Width">
+                <tooltip>Width of the base in nm</tooltip>
+            </property>
+            <property name="Height">
+                <tooltip>Height of the Box in nm</tooltip>
+            </property>
+        </category>
+
+        <category name="Cone">
+            <property name="Title">
+                <tooltip>Truncated cone </tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Radius">
+                <tooltip>Radius of the base in nm</tooltip>
+            </property>
+            <property name="Height">
+                <tooltip>Height of the Cone in nm</tooltip>
+            </property>
+            <property name="Alpha">
+                <tooltip>Angle between the base and the side face in degrees</tooltip>
+            </property>
+        </category>
+
+        <category name="Cone6">
+            <property name="Title">
+                <tooltip>Truncated hexagonal pyramid </tooltip>
+            </property>
+            <property name="Description">
+               <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Radius">
+                <tooltip>Radius of the regular hexagonal base in nm</tooltip>
+            </property>
+            <property name="Height">
+                <tooltip>Height of the Cone6 in nm</tooltip>
+            </property>
+            <property name="Alpha">
+                <tooltip>Angle between the base and the middle of side faces in degrees</tooltip>
+            </property>
+        </category>
+
+        <category name="Cuboctahedron">
+            <property name="Title">
+                <tooltip>Combination of two Pyramids of different heights, sharing a common face</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Length">
+                <tooltip>Side length of the common square base in nm</tooltip>
+            </property>
+            <property name="Height">
+                <tooltip>Height of the lower Pyramid in nm</tooltip>
+            </property>
+            <property name="HeightRatio">
+                <tooltip>Height ratio of the upper Pyramid to the lower</tooltip>
+            </property>
+            <property name="Alpha">
+                <tooltip>Angle between the base and the middle of side faces in degrees</tooltip>
+            </property>
+        </category>
+
+        <category name="Cylinder">
+            <property name="Title">
+               <tooltip>Cylinder with a circular base</tooltip>
+            </property>
+            <property name="Description">
+               <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Radius">
+               <tooltip>Radius of the base in nm</tooltip>
+            </property>
+            <property name="Height">
+               <tooltip>Height of the Cylinder in nm</tooltip>
+            </property>
+        </category>
+
+        <category name="Dodecahedron">
+            <property name="Title">
+                <tooltip>Dodecahedron</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Edge">
+                <tooltip>Edge lngth in nm</tooltip>
+            </property>
+        </category>
+
+        <category name="EllipsoidalCylinder">
+            <property name="Title">
+               <tooltip>Cylinder with an ellipse cross section</tooltip>
+            </property>
+            <property name="Description">
+               <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Radius_a">
+               <tooltip>Half length of the ellipse base, in the x-direction, in nm</tooltip>
+            </property>
+               <property name="Radius_b">
+            <tooltip>Half length of the ellipse base, in the y-direction, in nm</tooltip>
+            </property>
+            <property name="Height">
+               <tooltip>Height of the Ellipsoidal Cylindral in nm</tooltip>
+            </property>
+        </category>
+
+        <category name="FullSphere">
+            <property name="Title">
+               <tooltip>Full Sphere</tooltip>
+            </property>
+            <property name="Description">
+               <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Radius">
+              <tooltip>Radius of the Full Sphere in nm</tooltip>
+            </property>
+        </category>
+
+        <category name="FullSpheroid">
+           <property name="Title">
+               <tooltip>Ellipsoid of revolution </tooltip>
+            </property>
+           <property name="Description">
+              <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Radius">
+               <tooltip>Radius of the circular cross section in nm</tooltip>
+           </property>
+           <property name="Height">
+              <tooltip>Height of the Full Spheroid in nm</tooltip>
+           </property>
+        </category>
+
+        <category name="HemiEllipsoid">
+           <property name="Title">
+               <tooltip>Hemi Ellipsoid </tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Radius_a">
+               <tooltip>Half length of the ellipse base, in the x-direction, in nm</tooltip>
+           </property>
+           <property name="Radius_b">
+               <tooltip>Half length of the ellipse base, in the x-direction, in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Hemi Ellipsoid in nm</tooltip>
+           </property>
+        </category>
+
+        <category name="Icosahedron">
+            <property name="Title">
+                <tooltip>Icosahedron</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>to be completed </tooltip>
+            </property>
+            <property name="Edge">
+                <tooltip>Edge lngth in nm</tooltip>
+            </property>
+        </category>
+
+        <category name="Prism3">
+           <property name="Title">
+               <tooltip>Prism with an equilaterial triangle base</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>To be completed </tooltip>
+           </property>
+           <property name="Length">
+               <tooltip>Side length of the triangular base in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Prism3 in nm</tooltip>
+           </property>
+        </category>
+
+        <category name="Prism6">
+           <property name="Title">
+               <tooltip>Prism with a regular hexagonal base </tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Radius">
+               <tooltip>Side length of the hexagonal base in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Prism6 in nm</tooltip>
+           </property>
+        </category>
+
+        <category name="Pyramid">
+           <property name="Title">
+               <tooltip>Truncated pyramid with a square base </tooltip>
+           </property>
+           <property name="Length">
+               <tooltip>Length of the square base in nm</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>To be completed </tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Pyramid in nm</tooltip>
+           </property>
+           <property name="Alpha">
+               <tooltip>Angle between the base and the middle of the lateral faces in degrees</tooltip>
+           </property>
+        </category>
+
+        <category name="Ripple1">
+           <property name="Title">
+               <tooltip>Particle with a cosine profile and a rectangular base </tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>To be completed </tooltip>
+           </property>
+           <property name="Length">
+               <tooltip>Length of the rectangular base in nm</tooltip>
+           </property>
+           <property name="Width">
+               <tooltip>Width of the rectangular base in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Ripple1 in nm</tooltip>
+           </property>
+        </category>
+
+        <category name="Ripple2">
+           <property name="Title">
+               <tooltip>Particle with an asymmetric triangle profile and a rectangular base </tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>To be completed </tooltip>
+           </property>
+           <property name="Length">
+               <tooltip>Length of the rectangular base in nm</tooltip>
+           </property>
+            <property name="Width">
+               <tooltip>Width of the rectangular base in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Ripple2 in nm</tooltip>
+           </property>
+           <property name="Asymmetry">
+               <tooltip>Asymmetry length of the triangular profile in nm</tooltip>
+           </property>
+        </category>
+
+        <category name="Tetrahedron">
+           <property name="Title">
+               <tooltip>Truncated polyhedron with equilateral triangle base and cropped side faces</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Length">
+               <tooltip>Side length of the base in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Tetrahedron in nm</tooltip>
+           </property>
+           <property name="Alpha">
+               <tooltip>Angle between the base and the middle of the side faces in degrees</tooltip>
+           </property>
+        </category>
+
+        <category name="TruncatedSphere">
+           <property name="Title">
+               <tooltip>Spherical dome</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Radius">
+               <tooltip>Radius of the Truncated Sphere in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Truncated Sphere in nm</tooltip>
+           </property>
+        </category>
+
+        <category name="TruncatedSpheroid">
+           <property name="Title">
+               <tooltip>Spheroidal dome </tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Radius">
+               <tooltip>Radius of the Truncated Spheroid in nm</tooltip>
+           </property>
+           <property name="Height">
+               <tooltip>Height of the Truncated Spheroid in nm</tooltip>
+           </property>
+           <property name="Hfc">
+               <tooltip>Ratio of the height of the corresponding full spheroid to its diameter</tooltip>
+           </property>
+        </category>
+
+        <category name="Transformation">
+           <property name="Title">
+               <tooltip>Transformation</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Position">
+               <tooltip>Position of the particle initializing a layer</tooltip>
+           </property>
+           <property name="Rotation">
+               <tooltip>Rotation applied to the particles</tooltip>
+           </property>
+        </category>
+
+        <category name="ParticleCoreShell">
+           <property name="Title">
+               <tooltip>Core Shell particle</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Core Position">
+               <tooltip>Position of the core particle with respect to the shell (measured from the centrest of base faces)</tooltip>
+           </property>
+        </category>
+
+        <category name="ParticleComposition">
+           <property name="Title">
+               <tooltip>Composition of particles with fixed positions</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+        </category>
+
+        <category name="EulerRotation">
+           <property name="Title">
+               <tooltip>Rotation applied to the particle</tooltip>
+           </property>
+           <property name="Description">
+               <tooltip>to be completed </tooltip>
+           </property>
+           <property name="Alpha">
+               <tooltip>First Euler angle in degrees</tooltip>
+           </property>
+           <property name="Beta">
+               <tooltip>Second Euler angle in degrees</tooltip>
+           </property>
+           <property name="Gamma">
+               <tooltip>Third Euler angle in degrees</tooltip>
+           </property>
+        </category>
+
+        <category name="example01">
+            <property name="Title">
+                <tooltip>Mixture of cylinders and prisms without interference</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example02">
+            <property name="Title">
+                <tooltip>Interference 1D radial paracrystal</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example03">
+            <property name="Title">
+                <tooltip>Interference 2D paracrystal</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example04">
+            <property name="Title">
+                <tooltip>Core shell particles</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example05">
+            <property name="Title">
+                <tooltip>Multilayer with correlated roughness</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example06">
+            <property name="Title">
+                <tooltip>Interference 2D lattice</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example07">
+            <property name="Title">
+                <tooltip>Rotated pyramids on top of substrate</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example08">
+            <property name="Title">
+                <tooltip>Cylinders with size distribution</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+        <category name="example09">
+            <property name="Title">
+                <tooltip>Hexagonal lattice with basis to represent two layers of spheres</tooltip>
+            </property>
+            <property name="Description">
+                <tooltip>Some lengthy description here if necessary</tooltip>
+            </property>
+        </category>
+
+    </context>
+
+</ToolTipsData>
diff --git a/GUI/coregui/utils/CustomEventFilters.cpp b/GUI/coregui/utils/CustomEventFilters.cpp
new file mode 100644
index 0000000..72598b4
--- /dev/null
+++ b/GUI/coregui/utils/CustomEventFilters.cpp
@@ -0,0 +1,98 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/CustomEventFilters.cpp
+//! @brief     Defines classes releted to event filtering
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "CustomEventFilters.h"
+#include <QComboBox>
+#include <QKeyEvent>
+
+SpaceKeyEater::SpaceKeyEater(QObject *parent)
+    : QObject(parent)
+{
+
+}
+
+bool SpaceKeyEater::eventFilter(QObject *obj, QEvent *event)
+{
+    if (event->type() == QEvent::KeyPress) {
+        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
+        bool res = QObject::eventFilter(obj, event);
+
+        if (keyEvent->key() == Qt::Key_Space) {
+            return true; /* Always accept space bar */
+        } else {
+            return res;
+        }
+    } else {
+        // standard event processing
+        return QObject::eventFilter(obj, event);
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+WheelEventEater::WheelEventEater(QObject *parent)
+    : QObject(parent)
+{
+
+}
+
+bool WheelEventEater::eventFilter(QObject *obj, QEvent *event)
+{
+    if(QAbstractSpinBox* spinBox = qobject_cast<QAbstractSpinBox*>(obj)) {
+
+        if(event->type() == QEvent::Wheel) {
+            if(spinBox->focusPolicy() == Qt::WheelFocus) {
+                event->accept();
+                return false;
+            } else {
+                event->ignore();
+                return true;
+            }
+        }
+        else if(event->type() == QEvent::FocusIn) {
+            spinBox->setFocusPolicy(Qt::WheelFocus);
+        }
+        else if(event->type() == QEvent::FocusOut) {
+            spinBox->setFocusPolicy(Qt::StrongFocus);
+        }
+    }
+    else if(qobject_cast<QComboBox*>(obj)) {
+        if(event->type() == QEvent::Wheel) {
+            event->ignore();
+            return true;
+        } else {
+            event->accept();
+            return false;
+        }
+    }
+    return QObject::eventFilter(obj, event);
+}
+
+// ----------------------------------------------------------------------------
+
+bool DeleteEventFilter::eventFilter( QObject *dist, QEvent *event )
+{
+    Q_UNUSED(dist);
+    if( event->type() == QEvent::KeyPress )
+    {
+        QKeyEvent *keyEvent = static_cast<QKeyEvent*>( event );
+        if( keyEvent->key() == Qt::Key_Delete ) {
+            emit removeItem();
+        }
+    }
+    return QObject::eventFilter(dist, event);
+}
+
diff --git a/GUI/coregui/utils/CustomEventFilters.h b/GUI/coregui/utils/CustomEventFilters.h
new file mode 100644
index 0000000..63ef9d0
--- /dev/null
+++ b/GUI/coregui/utils/CustomEventFilters.h
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/CustomEventFilters.h
+//! @brief     Defines classes releted to event filtering
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CUSTOMEVENTFILTERS_H
+#define CUSTOMEVENTFILTERS_H
+
+#include "WinDllMacros.h"
+#include <QObject>
+
+//! Filter out space bar key events, which is special case for dialog windows.
+
+class BA_CORE_API_ SpaceKeyEater : public QObject
+{
+    Q_OBJECT
+public:
+
+    SpaceKeyEater(QObject *parent = 0);
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *event);
+};
+
+
+//! Event filter to install on combo boxes and spin boxes to not
+//! to react on wheel events during scrolling of InstrumentComponentWidget.
+
+class BA_CORE_API_ WheelEventEater : public QObject
+{
+    Q_OBJECT
+public:
+
+    WheelEventEater(QObject *parent = 0);
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *event);
+};
+
+//! Lisens for press-del-key events
+
+class DeleteEventFilter : public QObject
+{
+    Q_OBJECT
+public:
+  DeleteEventFilter( QObject *parent = 0 ) : QObject( parent ) {}
+
+protected:
+  bool eventFilter( QObject *dist, QEvent *event );
+
+signals:
+  void removeItem();
+};
+
+
+
+#endif // CUSTOMEVENTFILTERS_H
diff --git a/GUI/coregui/utils/FancyLabel.cpp b/GUI/coregui/utils/FancyLabel.cpp
new file mode 100644
index 0000000..6349a22
--- /dev/null
+++ b/GUI/coregui/utils/FancyLabel.cpp
@@ -0,0 +1,70 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/FancyLabel.cpp
+//! @brief     Implements class FancyLabel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FancyLabel.h"
+#include <QTimer>
+
+FancyLabel::FancyLabel(const QString &text, QWidget *parent)
+    : QLabel(text, parent)
+{
+    init_fancy_label();
+}
+
+FancyLabel::FancyLabel(QWidget *parent)
+    : QLabel(parent)
+{
+    init_fancy_label();
+}
+
+void FancyLabel::setTextAnimated(const QString &animated_text)
+{
+    if(m_timer->isActive()) {
+        m_timer->stop();
+    }
+
+    if(animated_text == text()) return;
+
+    if(animated_text.isEmpty()) {
+        setText(animated_text);
+        return;
+    }
+
+    m_text = animated_text;
+    m_current_index = 0;
+
+    m_timer->setInterval(m_total_effect_duration/m_text.size());
+
+    m_timer->start();
+
+}
+
+void FancyLabel::timeout()
+{
+    if(m_current_index <= m_text.size()) {
+        setText(m_text.left(m_current_index));
+        m_current_index++;
+        return;
+    }
+    m_timer->stop();
+}
+
+void FancyLabel::init_fancy_label()
+{
+    m_total_effect_duration = 200; // in msec
+    m_current_index = 0;
+    m_timer = new QTimer(this);
+    connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout()));
+}
diff --git a/GUI/coregui/utils/FancyLabel.h b/GUI/coregui/utils/FancyLabel.h
new file mode 100644
index 0000000..eae59fd
--- /dev/null
+++ b/GUI/coregui/utils/FancyLabel.h
@@ -0,0 +1,46 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/FancyLabel.h
+//! @brief     Defines class FancyLabel
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FANCYLABEL_H
+#define FANCYLABEL_H
+
+#include "WinDllMacros.h"
+#include <QLabel>
+
+//! The FancyLabel class is QLabel-like class with trivail animation, when text slowly
+//! appears on the screen from left to right pretending to be typed
+class BA_CORE_API_ FancyLabel : public QLabel
+{
+    Q_OBJECT
+public:
+    FancyLabel(const QString &text, QWidget *parent = 0);
+    FancyLabel(QWidget *parent = 0);
+
+    void setTextAnimated(const QString &animated_text);
+
+private slots:
+    void timeout();
+
+private:
+    void init_fancy_label();
+
+    QString m_text;
+    QTimer *m_timer;
+    int m_total_effect_duration;
+    int m_current_index;
+};
+
+#endif // FANCYLABEL_H
diff --git a/GUI/coregui/utils/GUIHelpers.cpp b/GUI/coregui/utils/GUIHelpers.cpp
new file mode 100644
index 0000000..1e0209f
--- /dev/null
+++ b/GUI/coregui/utils/GUIHelpers.cpp
@@ -0,0 +1,240 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/GUIHelpers.cpp
+//! @brief     Implements GUIHelpers functions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUIHelpers.h"
+#include "BAVersion.h"
+#include "JobItem.h"
+#include "RealDataItem.h"
+#include <QApplication>
+#include <QDateTime>
+#include <QDir>
+#include <QMessageBox>
+#include <QPushButton>
+#include <QUuid>
+
+namespace {
+QMap<QString, QString> initializeCharacterMap()
+{
+    QMap<QString, QString> result;
+    result["\\"]= QString("_backslash_");
+    result["/"] = QString("_slash_");
+    result["\""] = QString("_quote_");
+    result["<"] = QString("_lessthan_");
+    result[">"] = QString("_greaterthan_");
+    result["|"] = QString("_pipe_");
+    result["?"] = QString("_questionmark_");
+    return result;
+}
+
+const QMap<QString, QString> invalidCharacterMap = initializeCharacterMap();
+}  // Anonymous namespace
+
+namespace GUIHelpers {
+
+void information(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
+{
+    QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
+    if (parent)
+        messageBox->setWindowModality(Qt::WindowModal);
+    messageBox->setWindowTitle(QString("%1 - %2")
+            .arg(QApplication::applicationName()).arg(title));
+    messageBox->setText(text);
+    if (!detailedText.isEmpty())
+        messageBox->setInformativeText(detailedText);
+    messageBox->setIcon(QMessageBox::Information);
+    messageBox->addButton(QMessageBox::Ok);
+    messageBox->exec();
+}
+
+
+void warning(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
+{
+    QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
+    if (parent)
+        messageBox->setWindowModality(Qt::WindowModal);
+    messageBox->setWindowTitle(QString("%1 - %2")
+            .arg(QApplication::applicationName()).arg(title));
+    messageBox->setText(text);
+    if (!detailedText.isEmpty())
+        messageBox->setInformativeText(detailedText);
+    messageBox->setIcon(QMessageBox::Warning);
+    messageBox->addButton(QMessageBox::Ok);
+    messageBox->exec();
+}
+
+
+bool question(QWidget *parent, const QString &title, const QString &text, const QString &detailedText, const QString &yesText, const QString &noText)
+{
+    QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
+    if (parent)
+        messageBox->setWindowModality(Qt::WindowModal);
+    messageBox->setWindowTitle(QString("%1 - %2")
+            .arg(QApplication::applicationName()).arg(title));
+    messageBox->setText(text);
+    if (!detailedText.isEmpty())
+        messageBox->setInformativeText(detailedText);
+    messageBox->setIcon(QMessageBox::Question);
+    QAbstractButton *yesButton = messageBox->addButton(yesText,
+            QMessageBox::AcceptRole);
+    messageBox->addButton(noText, QMessageBox::RejectRole);
+    messageBox->setDefaultButton(
+            qobject_cast<QPushButton*>(yesButton));
+    messageBox->exec();
+    return messageBox->clickedButton() == yesButton;
+}
+
+
+bool okToDelete(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
+{
+    QScopedPointer<QMessageBox> messageBox(new QMessageBox(parent));
+    if (parent)
+        messageBox->setWindowModality(Qt::WindowModal);
+    messageBox->setIcon(QMessageBox::Question);
+    messageBox->setWindowTitle(QString("%1 - %2")
+            .arg(QApplication::applicationName()).arg(title));
+    messageBox->setText(text);
+    if (!detailedText.isEmpty())
+        messageBox->setInformativeText(detailedText);
+    QAbstractButton *deleteButton = messageBox->addButton("&Delete", QMessageBox::AcceptRole);
+    messageBox->addButton("Do &Not Delete", QMessageBox::RejectRole);
+    messageBox->setDefaultButton(
+            qobject_cast<QPushButton*>(deleteButton));
+    messageBox->exec();
+    return messageBox->clickedButton() == deleteButton;
+}
+
+//! returns type of variant
+int getVariantType(const QVariant &variant)
+{
+    int result = variant.type();
+    if (result == QVariant::UserType)
+        result = variant.userType();
+    return result;
+}
+
+QString getBornAgainVersionString()
+{
+    return QString::fromStdString(BornAgain::GetVersionNumber());
+}
+
+//! Returns valid file name to be saved on disk. This name is constructed from proposed_name
+//! by replacing all special characters with text representation
+//! \ backslash
+//! / slash
+//! " quote
+//! < lessthan
+//! > greaterthan
+//! | pipe
+//! ? questionmark
+QString getValidFileName(const QString &proposed_name)
+{
+    QString result = proposed_name;
+    for(auto it=invalidCharacterMap.begin(); it!=invalidCharacterMap.end(); ++it) {
+        result.replace(it.key(), it.value());
+    }
+    return result;
+}
+
+//! parses version string into 3 numbers, returns true in the case of success
+bool parseVersion(const QString &version, int &major_num, int &minor_num, int &patch_num)
+{
+    major_num = minor_num = patch_num = 0;
+    bool success(true);
+    QStringList nums = version.split(QStringLiteral("."));
+    if(nums.size() != 3) return false;
+
+    bool ok(false);
+    major_num = nums.at(0).toInt(&ok); success &= ok;
+    minor_num = nums.at(1).toInt(&ok); success &= ok;
+    patch_num = nums.at(2).toInt(&ok); success &= ok;
+
+    return success;
+}
+
+
+//! returns true if current BornAgain version match minimal required version
+bool isVersionMatchMinimal(const QString &version, const QString &minimal_version)
+{
+    int ba_major(0), ba_minor(0), ba_patch(0);
+    if(!parseVersion(version, ba_major, ba_minor, ba_patch))
+        return false;
+
+    int minv_major(0), minv_minor(0), minv_patch(0);
+    if(!parseVersion(minimal_version, minv_major, minv_minor, minv_patch))
+        return false;
+
+    int ba = ba_major*10000 + ba_minor*100 + ba_patch;
+    int minv = minv_major*10000 + minv_minor*100 + minv_patch;
+    return ba >= minv;
+}
+
+//! Returns file directory from the full file path
+QString fileDir(const QString &fileName)
+{
+    QFileInfo info(fileName);
+    if(info.exists()) {
+        return info.dir().path();
+    }
+    return QString();
+}
+
+QString currentDateTime()
+{
+    return QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");;
+}
+
+//QStringList fromStdList(const std::list<std::string> &string_list)
+//{
+//    QStringList result;
+//    for(std::string str : string_list) {
+//        result.append(QString::fromStdString(str));
+//    }
+//    return result;
+//}
+
+QVector<double> fromStdVector(const std::vector<double> &data)
+{
+    QVector<double> result;
+    result.reserve(int(data.size())); std::copy(data.begin(), data.end(), std::back_inserter(result));
+    return result;
+}
+
+QStringList fromStdStrings(const std::vector<std::string> &container)
+{
+    QStringList result;
+    for(std::string str : container) {
+        result.append(QString::fromStdString(str));
+    }
+    return result;
+}
+
+QString createUuid()
+{
+    return  QUuid::createUuid().toString();
+}
+
+bool isTheSame(const QStringList &lhs, const QStringList &rhs)
+{
+    if(lhs.size() != rhs.size()) return false;
+    for(int i=0; i<lhs.size(); ++i)
+        if(lhs.at(i) != rhs.at(i))
+            return false;
+
+    return true;
+}
+
+
+} // namespace GUIHelpers
diff --git a/GUI/coregui/utils/GUIHelpers.h b/GUI/coregui/utils/GUIHelpers.h
new file mode 100644
index 0000000..b9d7092
--- /dev/null
+++ b/GUI/coregui/utils/GUIHelpers.h
@@ -0,0 +1,93 @@
+//* ************************************************************************* //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/GUIHelpers.h
+//! @brief     Defines class GUIHelpers functions
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+//* ************************************************************************* //
+
+#ifndef GUIHELPERS_H
+#define GUIHELPERS_H
+
+#include "WinDllMacros.h"
+#include <QStringList>
+#include <QWidget>
+#include <memory>
+#include <sstream>
+
+class JobItem;
+class RealDataItem;
+
+namespace GUIHelpers
+{
+class BA_CORE_API_ Error : public std::exception
+{
+public:
+    explicit Error(const QString& message) throw()
+        : message(message) {}
+    virtual ~Error() throw() {}
+
+    virtual const char* what() const throw() { return message.toLatin1().data(); }
+
+private:
+    QString message;
+};
+
+BA_CORE_API_ void information(QWidget* parent, const QString& title,
+        const QString& text, const QString& detailedText=QString());
+BA_CORE_API_ void warning(QWidget* parent, const QString& title,
+        const QString& text, const QString& detailedText=QString());
+BA_CORE_API_ bool question(QWidget* parent, const QString& title,
+        const QString& text, const QString& detailedText=QString(),
+        const QString& yesText="&Yes",
+        const QString& noText="&No");
+BA_CORE_API_ bool okToDelete(QWidget* parent, const QString& title,
+        const QString& text, const QString& detailedText=QString());
+
+BA_CORE_API_ int getVariantType(const QVariant& variant);
+
+BA_CORE_API_ QString getBornAgainVersionString();
+
+BA_CORE_API_ QString getValidFileName(const QString& proposed_name);
+
+BA_CORE_API_ QString fileDir(const QString& fileName);
+
+BA_CORE_API_ bool parseVersion(
+    const QString& version, int& major_num, int& minor_num, int& patch_num);
+
+BA_CORE_API_ bool isVersionMatchMinimal(const QString& version, const QString& minimal_version);
+
+BA_CORE_API_ QString currentDateTime();
+
+BA_CORE_API_ QStringList fromStdStrings(const std::vector<std::string>& container);
+
+BA_CORE_API_ QVector<double> fromStdVector(const std::vector<double>& data);
+
+template<class T, class... Ts> std::unique_ptr<T> make_unique(Ts&&... params)
+{
+    return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
+}
+
+BA_CORE_API_ QString createUuid();
+
+BA_CORE_API_ bool isTheSame(const QStringList& lhs, const QStringList& rhs);
+
+} // namespace GUIHelpers
+
+inline std::ostream&  operator <<(std::ostream& stream,const QString& str)
+{
+   stream << str.toStdString();
+   return stream;
+}
+
+
+
+#endif // GUIHELPERS_H
diff --git a/GUI/coregui/utils/GUIMessage.cpp b/GUI/coregui/utils/GUIMessage.cpp
new file mode 100644
index 0000000..53467f6
--- /dev/null
+++ b/GUI/coregui/utils/GUIMessage.cpp
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/GUIMessage.cpp
+//! @brief     Implements class GUIMessage.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUIMessage.h"
+
+GUIMessage::GUIMessage(const QString &senderName, const QString &messageType,
+                       const QString &messageDescription)
+    : m_senderName(senderName), m_messageType(messageType), m_messageDescription(messageDescription)
+{
+}
+
+QString GUIMessage::getSenderName() const
+{
+    return m_senderName;
+}
+
+QString GUIMessage::getMessageType() const
+{
+    return m_messageType;
+}
+
+QString GUIMessage::getMessageDescription() const
+{
+    return m_messageDescription;
+}
+
+QString GUIMessage::getText() const
+{
+    QString result
+        = QString("%1 %2 %3").arg(m_senderName).arg(m_messageType).arg(m_messageDescription);
+    return result;
+}
diff --git a/GUI/coregui/utils/GUIMessage.h b/GUI/coregui/utils/GUIMessage.h
new file mode 100644
index 0000000..7c09dd9
--- /dev/null
+++ b/GUI/coregui/utils/GUIMessage.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/GUIMessage.h
+//! @brief     Defines class GUIMessage.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GUIMESSAGE_H
+#define GUIMESSAGE_H
+
+#include <QString>
+
+class GUIMessage
+{
+public:
+    GUIMessage(const QString &senderName, const QString &messageType,
+               const QString &messageDescription);
+
+    QString getSenderName() const;
+    QString getMessageType() const;
+    QString getMessageDescription() const;
+
+    QString getText() const;
+
+private:
+    QString m_senderName;
+    QString m_messageType;
+    QString m_messageDescription;
+};
+
+#endif // GUIMESSAGE_H
+
diff --git a/GUI/coregui/utils/IMessageService.h b/GUI/coregui/utils/IMessageService.h
new file mode 100644
index 0000000..1a3df6b
--- /dev/null
+++ b/GUI/coregui/utils/IMessageService.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/IMessageService.h
+//! @brief     Defines abstract IMessageService interface
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMESSAGESERVICE_H
+#define IMESSAGESERVICE_H
+
+//! @class IMessageService
+//! @brief Abstract class for messaging in our GUI
+
+
+class IMessageService {
+public:
+    IMessageService(){}
+    virtual ~IMessageService(){}
+};
+
+#endif // IMESSAGESERVICE_H
+
diff --git a/GUI/coregui/utils/ItemIDFactory.cpp b/GUI/coregui/utils/ItemIDFactory.cpp
new file mode 100644
index 0000000..48972df
--- /dev/null
+++ b/GUI/coregui/utils/ItemIDFactory.cpp
@@ -0,0 +1,62 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/ItemIDFactory.cpp
+//! @brief     Implements class ItemIDFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemIDFactory.h"
+
+
+ItemIDFactory& ItemIDFactory::instance()
+{
+    static ItemIDFactory instance;
+    return instance;
+}
+
+QString ItemIDFactory::createID(SessionItem *toBeInsertedItem){
+
+    QUuid id = QUuid::createUuid();
+    QString id_String = id.toString();
+
+    // prevent duplicates (very improbable that this ever happens though)
+    while(instance().IDtoItemMap.contains(id_String)) {
+        id = QUuid::createUuid();
+        id_String = id.toString();
+    }
+    instance().ItemtoIDMap.insert(toBeInsertedItem, id_String);
+    instance().IDtoItemMap.insert(id_String, toBeInsertedItem);
+
+    return id_String;
+}
+
+QString ItemIDFactory::getID(SessionItem *existingItem)
+{
+    if(instance().ItemtoIDMap.contains(existingItem))
+        return instance().ItemtoIDMap.value(existingItem);
+    else
+        return QString();
+}
+
+SessionItem* ItemIDFactory::getItem(QString existingID)
+{
+    if(instance().IDtoItemMap.contains(existingID))
+        return instance().IDtoItemMap.value(existingID);
+    else
+        return nullptr;
+}
+
+int ItemIDFactory::IDSize()
+{
+    static QUuid id = QUuid::createUuid();
+    return id.toString().size();
+}
diff --git a/GUI/coregui/utils/ItemIDFactory.h b/GUI/coregui/utils/ItemIDFactory.h
new file mode 100644
index 0000000..cecd98e
--- /dev/null
+++ b/GUI/coregui/utils/ItemIDFactory.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/ItemIDFactory.h
+//! @brief     Defines class ItemIDFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMIDFACTORY_H
+#define ITEMIDFACTORY_H
+
+#include <QMap>
+#include <QUuid>
+
+class SessionItem;
+
+class ItemIDFactory {
+public:
+    // delete copy/move constructor/assignment:
+    ItemIDFactory(const ItemIDFactory&) = delete;
+    ItemIDFactory(ItemIDFactory&&) = delete;
+    ItemIDFactory& operator=(const ItemIDFactory&) = delete;
+    ItemIDFactory& operator=(ItemIDFactory&&) = delete;
+
+    static ItemIDFactory& instance();
+
+    static QString createID(SessionItem* toBeInsertedItem);
+
+    static QString getID(SessionItem* existingItem);
+
+    static SessionItem* getItem(QString existingID);
+
+    static int IDSize();
+
+private:
+    ItemIDFactory() = default;
+
+    QMap<QString, SessionItem*> IDtoItemMap;
+    QMap<SessionItem*, QString> ItemtoIDMap;
+};
+
+#endif // ITEMIDFACTORY_H
diff --git a/GUI/coregui/utils/MessageContainer.cpp b/GUI/coregui/utils/MessageContainer.cpp
new file mode 100644
index 0000000..70e77e8
--- /dev/null
+++ b/GUI/coregui/utils/MessageContainer.cpp
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/MessageContainer.cpp
+//! @brief     Implements class MessageContainer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "MessageContainer.h"
+#include "GUIHelpers.h"
+#include "GUIMessage.h"
+
+namespace {
+int maximum_number_of_messages = 100;
+}
+
+MessageContainer::MessageContainer()
+{
+}
+
+MessageContainer::~MessageContainer()
+{
+    clear();
+}
+
+MessageContainer::iterator MessageContainer::begin()
+{
+    return m_messages.begin();
+}
+
+MessageContainer::const_iterator MessageContainer::begin() const
+{
+    return m_messages.begin();
+}
+
+MessageContainer::iterator MessageContainer::end()
+{
+    return m_messages.end();
+}
+
+MessageContainer::const_iterator MessageContainer::end() const
+{
+    return m_messages.end();
+}
+
+int MessageContainer::size() const
+{
+    return m_messages.size();
+}
+
+void MessageContainer::clear()
+{
+    for(QList<GUIMessage *>::iterator it=m_messages.begin(); it!= m_messages.end(); ++it) {
+        delete (*it);
+    }
+    m_messages.clear();
+}
+
+void MessageContainer::append(GUIMessage *message)
+{
+    if(m_messages.size() < maximum_number_of_messages) {
+        m_messages.append(message);
+    } else {
+        GUIHelpers::Error("MessageContainer::append() -> Error. Stack overflow.");
+    }
+}
diff --git a/GUI/coregui/utils/MessageContainer.h b/GUI/coregui/utils/MessageContainer.h
new file mode 100644
index 0000000..822035b
--- /dev/null
+++ b/GUI/coregui/utils/MessageContainer.h
@@ -0,0 +1,51 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/MessageContainer.h
+//! @brief     Defines class MessageContainer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MESSAGECONTAINER_H
+#define MESSAGECONTAINER_H
+
+#include <QList>
+
+class GUIMessage;
+
+//! @class MessageContainer
+//! @brief The class to hold warning messages
+
+class MessageContainer
+{
+public:
+    MessageContainer();
+    virtual ~MessageContainer();
+
+    typedef QList<GUIMessage *> container_t;
+    typedef container_t::iterator iterator;
+    typedef container_t::const_iterator const_iterator;
+
+    iterator begin();
+    const_iterator begin() const;
+    iterator end();
+    const_iterator end() const;
+    int size() const;
+
+    void clear();
+
+    void append(GUIMessage *message);
+
+private:
+    container_t m_messages;
+};
+
+#endif // MESSAGECONTAINER_H
diff --git a/GUI/coregui/utils/WarningMessageService.cpp b/GUI/coregui/utils/WarningMessageService.cpp
new file mode 100644
index 0000000..01c23f1
--- /dev/null
+++ b/GUI/coregui/utils/WarningMessageService.cpp
@@ -0,0 +1,115 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/WarningMessageService.cpp
+//! @brief     Defines abstract IMessageService interface
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "WarningMessageService.h"
+#include "GUIMessage.h"
+#include "MessageContainer.h"
+#include <QObject>
+
+WarningMessageService::~WarningMessageService()
+{
+    clear();
+}
+
+void WarningMessageService::clear()
+{
+    for(container_t::iterator it=m_messageContainer.begin(); it!=m_messageContainer.end(); ++it) {
+        delete it.value();
+    }
+    m_messageContainer.clear();
+}
+
+WarningMessageService::iterator WarningMessageService::begin()
+{
+    return m_messageContainer.begin();
+}
+
+WarningMessageService::const_iterator WarningMessageService::begin() const
+{
+    return m_messageContainer.begin();
+}
+
+WarningMessageService::iterator WarningMessageService::end()
+{
+    return m_messageContainer.end();
+}
+
+WarningMessageService::const_iterator WarningMessageService::end() const
+{
+    return m_messageContainer.end();
+}
+
+MessageContainer *WarningMessageService::getMessageContainer(QObject *sender)
+{
+    iterator it = m_messageContainer.find(sender);
+    if(it != m_messageContainer.end()) {
+        return it.value();
+    }
+    return 0;
+}
+
+const MessageContainer *WarningMessageService::getMessageContainer(QObject *sender) const
+{
+    const_iterator it = m_messageContainer.find(sender);
+    if(it != m_messageContainer.end()) {
+        return it.value();
+    }
+    return 0;
+}
+
+void WarningMessageService::send_message(QObject *sender, const QString &message_type, const QString &description)
+{
+    MessageContainer *container = getMessageContainer(sender);
+    if(!container) {
+        container = new MessageContainer();
+        m_messageContainer[sender] = container;
+    }
+
+    GUIMessage *message = new GUIMessage(sender->objectName(), message_type, description);
+    container->append(message);
+}
+
+bool WarningMessageService::hasWarnings(QObject *sender)
+{
+    MessageContainer *container = getMessageContainer(sender);
+    if(container && container->size()) return true;
+    return false;
+}
+
+//! Returns list of string with error messages
+QStringList WarningMessageService::getMessageStringList(QObject *sender) const
+{
+    QStringList result;
+    const MessageContainer *container = getMessageContainer(sender);
+    if(container) {
+        for(MessageContainer::const_iterator it=container->begin(); it!=container->end(); ++it) {
+            result.append((*it)->getText());
+        }
+    }
+    return result;
+}
+
+//! Returns multi line string representing all messages
+QString WarningMessageService::getMessages(QObject *sender) const
+{
+    QString result;
+    QStringList messages = getMessageStringList(sender);
+    for(int i=0; i<messages.size(); ++i) {
+        result.append(messages.at(i));
+        result.append("\n");
+    }
+    return result;
+}
diff --git a/GUI/coregui/utils/WarningMessageService.h b/GUI/coregui/utils/WarningMessageService.h
new file mode 100644
index 0000000..92f4cda
--- /dev/null
+++ b/GUI/coregui/utils/WarningMessageService.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/WarningMessageService.h
+//! @brief     Defines abstract IMessageService interface
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef WARNINGMESSAGESERVICE_H
+#define WARNINGMESSAGESERVICE_H
+
+#include "IMessageService.h"
+#include <QMap>
+#include <QStringList> // need detected by TeamCity
+
+class MessageContainer;
+class QObject;
+
+//! @class WarningMessageService
+//! @brief The service to collect warning messages from different senders.
+
+class WarningMessageService : public IMessageService {
+public:
+    typedef QMap<QObject *, MessageContainer *> container_t;
+    typedef container_t::iterator iterator;
+    typedef container_t::const_iterator const_iterator;
+
+    WarningMessageService(){}
+    virtual ~WarningMessageService();
+
+    void clear();
+
+    iterator begin();
+    const_iterator begin() const;
+    iterator end();
+    const_iterator end() const;
+
+    MessageContainer *getMessageContainer(QObject *sender);
+    const MessageContainer *getMessageContainer(QObject *sender) const;
+
+    void send_message(QObject *sender, const QString &message_type, const QString &description);
+
+    bool hasWarnings(QObject *sender);
+
+    QStringList getMessageStringList(QObject *sender) const;
+    QString getMessages(QObject *sender) const;
+
+private:
+    container_t m_messageContainer;
+};
+
+#endif // WARNINGMESSAGESERVICE_H
diff --git a/GUI/coregui/utils/hostosinfo.h b/GUI/coregui/utils/hostosinfo.h
new file mode 100644
index 0000000..49b9981
--- /dev/null
+++ b/GUI/coregui/utils/hostosinfo.h
@@ -0,0 +1,124 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/hostosinfo.h
+//! @brief     Defines Utils namespace
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef HOSTOSINFO_H
+#define HOSTOSINFO_H
+
+#include "WinDllMacros.h"
+#include <QString>
+
+namespace Utils {
+
+#define QTC_WIN_EXE_SUFFIX ".exe"
+
+enum EOsType { WINDOWS_OS, LINUX_OS, MAC_OS, OTHER_UNIX_OS, OTHER_OS };
+
+class BA_CORE_API_ OsSpecificAspects
+{
+public:
+    OsSpecificAspects(EOsType osType) : m_osType(osType) { }
+
+    QString withExecutableSuffix(const QString &executable) const {
+        QString finalName = executable;
+        if (m_osType == WINDOWS_OS)
+            finalName += QLatin1String(QTC_WIN_EXE_SUFFIX);
+        return finalName;
+    }
+
+    Qt::CaseSensitivity fileNameCaseSensitivity() const {
+        return m_osType == WINDOWS_OS ? Qt::CaseInsensitive : Qt::CaseSensitive;
+    }
+
+    QChar pathListSeparator() const {
+        return QLatin1Char(m_osType == WINDOWS_OS ? ';' : ':');
+    }
+
+    Qt::KeyboardModifier controlModifier() const {
+        return m_osType == MAC_OS ? Qt::MetaModifier : Qt::ControlModifier;
+    }
+
+private:
+    const EOsType m_osType;
+};
+
+
+class BA_CORE_API_ HostOsInfo
+{
+public:
+
+    static inline EOsType hostOs();
+
+    enum HostArchitecture { HostArchitectureX86, HostArchitectureAMD64, HostArchitectureItanium,
+                            HostArchitectureArm, HostArchitectureUnknown };
+    static HostArchitecture hostArchitecture();
+
+    static bool isWindowsHost() { return hostOs() == WINDOWS_OS; }
+    static bool isLinuxHost() { return hostOs() == LINUX_OS; }
+    static bool isMacHost() { return hostOs() == MAC_OS; }
+    static inline bool isAnyUnixHost();
+
+    static QString withExecutableSuffix(const QString &executable)
+    {
+        return hostOsAspects().withExecutableSuffix(executable);
+    }
+
+    static Qt::CaseSensitivity fileNameCaseSensitivity()
+    {
+        return hostOsAspects().fileNameCaseSensitivity();
+    }
+
+    static QChar pathListSeparator()
+    {
+        return hostOsAspects().pathListSeparator();
+    }
+
+    static Qt::KeyboardModifier controlModifier()
+    {
+        return hostOsAspects().controlModifier();
+    }
+
+private:
+    static OsSpecificAspects hostOsAspects() { return OsSpecificAspects(hostOs()); }
+};
+
+
+BA_CORE_API_ EOsType HostOsInfo::hostOs()
+{
+#if defined(Q_OS_WIN)
+    return WINDOWS_OS;
+#elif defined(Q_OS_LINUX)
+    return LINUX_OS;
+#elif defined(Q_OS_MAC)
+    return MAC_OS;
+#elif defined(Q_OS_UNIX)
+    return OTHER_UNIX_OS;
+#else
+    return OTHER_OS;
+#endif
+}
+
+BA_CORE_API_ bool HostOsInfo::isAnyUnixHost()
+{
+#ifdef Q_OS_UNIX
+    return true;
+#else
+    return false;
+#endif
+}
+
+} // namespace Utils
+
+#endif // HOSTOSINFO_H
diff --git a/GUI/coregui/utils/qstringutils.cpp b/GUI/coregui/utils/qstringutils.cpp
new file mode 100644
index 0000000..4b5838c
--- /dev/null
+++ b/GUI/coregui/utils/qstringutils.cpp
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/qstringutils.cpp
+//! @brief     Implements functions from Utils namespace
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "qstringutils.h"
+#include "hostosinfo.h"
+#include <QDir>
+
+namespace Utils
+{
+
+QString withTildeHomePath(const QString &path)
+{
+    if (Utils::HostOsInfo::isWindowsHost())
+        return path;
+
+    static const QString homePath = QDir::homePath();
+
+    QFileInfo fi(QDir::cleanPath(path));
+    QString outPath = fi.absoluteFilePath();
+    if (outPath.startsWith(homePath))
+        outPath = QLatin1Char('~') + outPath.mid(homePath.size());
+    else
+        outPath = path;
+    return outPath;
+}
+
+
+} // namespace Utils
diff --git a/GUI/coregui/utils/qstringutils.h b/GUI/coregui/utils/qstringutils.h
new file mode 100644
index 0000000..92c307d
--- /dev/null
+++ b/GUI/coregui/utils/qstringutils.h
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/coregui/utils/qstringutils.h
+//! @brief     Defines functions from Utils namespace
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef QSTRINGUTILS_H
+#define QSTRINGUTILS_H
+
+#include "WinDllMacros.h"
+#include <QString>
+
+namespace Utils
+{
+
+BA_CORE_API_ QString withTildeHomePath(const QString &path);
+
+}
+
+#endif // QSTRINGUTILS_H
diff --git a/GUI/crashhandler/CMakeLists.txt b/GUI/crashhandler/CMakeLists.txt
new file mode 100644
index 0000000..1ad9be7
--- /dev/null
+++ b/GUI/crashhandler/CMakeLists.txt
@@ -0,0 +1,37 @@
+if(POLICY CMP0020)
+cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+cmake_policy(SET CMP0043 NEW)
+endif()
+if(POLICY CMP0028)
+cmake_policy(SET CMP0028 OLD)
+endif()
+
+set(executable_name crashhandler)
+
+
+file(GLOB source_files
+    "*.cpp"
+)
+
+file(GLOB include_files
+    "*.h"
+)
+
+#set(ui_files
+#    crashhandlerdialog.ui
+#)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+
+#qt5_wrap_ui(UI_HDRS ${ui_files})
+
+
+add_executable(${executable_name} ${source_files} ${include_files} ${UI_HDRS})
+
+qt5_use_modules(${executable_name} Widgets Core Gui Script Designer PrintSupport)
+
+
+
diff --git a/GUI/crashhandler/crashhandler.cpp b/GUI/crashhandler/crashhandler.cpp
new file mode 100644
index 0000000..83a1083
--- /dev/null
+++ b/GUI/crashhandler/crashhandler.cpp
@@ -0,0 +1,16 @@
+#include "crashhandler.h"
+#include <QApplication>
+#include <QDebug>
+
+
+
+CrashHandler::CrashHandler(QObject *parent)
+    : QObject(parent)
+{
+
+}
+
+CrashHandler::~CrashHandler()
+{
+
+}
diff --git a/GUI/crashhandler/crashhandler.h b/GUI/crashhandler/crashhandler.h
new file mode 100644
index 0000000..98d5a7e
--- /dev/null
+++ b/GUI/crashhandler/crashhandler.h
@@ -0,0 +1,14 @@
+#ifndef CRASHHANDLER_H
+#define CRASHHANDLER_H
+
+#include <QObject>
+
+class CrashHandler : public QObject
+{
+    Q_OBJECT
+public:
+    explicit CrashHandler(QObject *parent = 0);
+    virtual ~CrashHandler();
+};
+
+#endif // CRASHHANDLER_H
diff --git a/GUI/crashhandler/crashhandlerdialog.cpp b/GUI/crashhandler/crashhandlerdialog.cpp
new file mode 100644
index 0000000..ed18041
--- /dev/null
+++ b/GUI/crashhandler/crashhandlerdialog.cpp
@@ -0,0 +1,66 @@
+#include "crashhandlerdialog.h"
+#include <QClipboard>
+#include <QPushButton>
+#include <QTextEdit>
+#include <QtWidgets>
+
+
+
+CrashHandlerDialog::CrashHandlerDialog(QString errorText, QWidget *parent)
+    : m_errorText(errorText)
+    , QWidget(parent)
+{
+    QVBoxLayout *mainLayout = new QVBoxLayout(this);
+
+    m_clipboard = QApplication::clipboard();
+
+    m_titleLabel = new QLabel("BornAgain has been closed unexpectedly. We appologize for this. \nPlease fill bug report using info provided below.");
+
+    m_errorTextEdit = new QTextEdit();
+    m_errorTextEdit->setText(m_errorText);
+
+    m_copyButton = new QPushButton("Copy to Clipboard");
+    m_reportButton = new QPushButton("Report");
+    m_closeButton = new QPushButton("Close");
+
+    connect(m_copyButton, SIGNAL(clicked()), this, SLOT(onCopyButtonClicked()));
+    connect(m_reportButton, SIGNAL(clicked()), this, SLOT(onReportButtonClicked()));
+    connect(m_closeButton, SIGNAL(clicked()), this, SLOT(onCloseButtonClicked()));
+
+
+    QHBoxLayout *buttonLayout = new QHBoxLayout();
+
+    buttonLayout->addWidget(m_copyButton);
+    buttonLayout->addStretch();
+    buttonLayout->addWidget(m_reportButton);
+    buttonLayout->addStretch();
+    buttonLayout->addWidget(m_closeButton);
+
+
+
+
+    mainLayout->addWidget(m_titleLabel);
+    mainLayout->addWidget(m_errorTextEdit);
+    mainLayout->addLayout(buttonLayout);
+
+    setLayout(mainLayout);
+    setWindowTitle("BornAgain Crash Handler");
+}
+
+void CrashHandlerDialog::onCopyButtonClicked()
+{
+
+    m_clipboard->setText(m_errorTextEdit->toPlainText());
+}
+
+void CrashHandlerDialog::onReportButtonClicked()
+{
+    QUrl url("http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/issues/new");
+    QDesktopServices::openUrl(url);
+}
+
+void CrashHandlerDialog::onCloseButtonClicked()
+{
+    this->close();
+}
+
diff --git a/GUI/crashhandler/crashhandlerdialog.h b/GUI/crashhandler/crashhandlerdialog.h
new file mode 100644
index 0000000..55b5f99
--- /dev/null
+++ b/GUI/crashhandler/crashhandlerdialog.h
@@ -0,0 +1,39 @@
+#ifndef CRASHHANDLERDIALOG_H
+#define CRASHHANDLERDIALOG_H
+
+#include <QWidget>
+
+
+class QLabel;
+class QPushButton;
+class QTextEdit;
+class QClipboard;
+
+
+class CrashHandlerDialog : public QWidget
+{
+    Q_OBJECT
+
+public:
+    CrashHandlerDialog(QString errorText = "", QWidget *parent = 0);
+
+private slots:
+    void onCopyButtonClicked();
+    void onReportButtonClicked();
+    void onCloseButtonClicked();
+
+private:
+
+
+    QLabel *m_titleLabel;
+    QTextEdit *m_errorTextEdit;
+    QPushButton *m_copyButton;
+    QPushButton *m_reportButton;
+    QPushButton *m_closeButton;
+
+    QString m_errorText;
+    QClipboard *m_clipboard;
+
+};
+
+#endif // CRASHHANDLERDIALOG_H
diff --git a/GUI/crashhandler/main.cpp b/GUI/crashhandler/main.cpp
new file mode 100644
index 0000000..2a97018
--- /dev/null
+++ b/GUI/crashhandler/main.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+
+
+
+#include "crashhandlerdialog.h"
+#include "utils.h"
+
+#include <QApplication>
+#include <QFile>
+#include <QProcess>
+#include <QString>
+#include <QStyle>
+#include <QTextStream>
+#include <QDebug>
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+
+#include <iostream>
+
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+
+
+    CrashHandlerDialog dialog("This is the error!!!");
+    dialog.show();
+
+    return app.exec();
+
+
+
+}
+
+
diff --git a/GUI/crashhandler/qtcreatorcrashhandler.qbs b/GUI/crashhandler/qtcreatorcrashhandler.qbs
new file mode 100644
index 0000000..9d0bd45
--- /dev/null
+++ b/GUI/crashhandler/qtcreatorcrashhandler.qbs
@@ -0,0 +1,22 @@
+import qbs 1.0
+import QtcTool
+
+QtcTool {
+    name: "qtcreator_crash_handler"
+    condition: qbs.targetOS.contains("linux") && qbs.buildVariant == "debug"
+
+    Depends { name: "Utils" }
+    Depends { name: "Qt.widgets" }
+    Depends { name: "app_version_header" }
+
+    Group {
+        name: "Crash Handler Sources"
+        files: [
+            "backtracecollector.cpp", "backtracecollector.h",
+            "crashhandler.cpp", "crashhandler.h",
+            "crashhandlerdialog.cpp", "crashhandlerdialog.h", "crashhandlerdialog.ui",
+            "main.cpp",
+            "utils.cpp", "utils.h"
+        ]
+    }
+}
diff --git a/GUI/crashhandler/utils.cpp b/GUI/crashhandler/utils.cpp
new file mode 100644
index 0000000..9f4f0fc
--- /dev/null
+++ b/GUI/crashhandler/utils.cpp
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "utils.h"
+
+#include <QDebug>
+#include <QFile>
+
+QByteArray fileContents(const QString &filePath)
+{
+    QFile file(filePath);
+    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+        qWarning("Warning: Could not open '%s'.", qPrintable(filePath));
+        return QByteArray();
+    }
+    return file.readAll();
+}
diff --git a/GUI/crashhandler/utils.h b/GUI/crashhandler/utils.h
new file mode 100644
index 0000000..4ce0ea4
--- /dev/null
+++ b/GUI/crashhandler/utils.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef UTILS_H
+#define UTILS_H
+
+#include <QByteArray>
+#include <QString>
+
+const char APPLICATION_NAME[] = "Qt Creator Crash Handler";
+const char URL_BUGTRACKER[] = "https://bugreports.qt-project.org/";
+
+QByteArray fileContents(const QString &filePath);
+
+#endif // UTILS_H
diff --git a/GUI/main/BornAgain.icns b/GUI/main/BornAgain.icns
new file mode 100644
index 0000000..b27da1c
Binary files /dev/null and b/GUI/main/BornAgain.icns differ
diff --git a/GUI/main/BornAgain.ico b/GUI/main/BornAgain.ico
new file mode 100644
index 0000000..a28a133
Binary files /dev/null and b/GUI/main/BornAgain.ico differ
diff --git a/GUI/main/CMakeLists.txt b/GUI/main/CMakeLists.txt
new file mode 100644
index 0000000..eecec1f
--- /dev/null
+++ b/GUI/main/CMakeLists.txt
@@ -0,0 +1,133 @@
+###############################################################################
+# Builds BornAgain/GUI main executable
+###############################################################################
+set(executable_name BornAgain)
+
+# -----------------------------------------------------------------------------
+# source files
+# -----------------------------------------------------------------------------
+include_directories(
+    ${BornAgainGUI_INCLUDE_DIRS}
+    ${QtAddOn_INCLUDE_DIRS}
+    ${GSL_INCLUDE_DIR}
+    ${CMAKE_SOURCE_DIR}/Core/Basics
+)
+set(source_files main.cpp appoptions.cpp)
+set(include_files appoptions.h)
+
+
+# -----------------------------------------------------------------------------
+# Qt configuration
+# -----------------------------------------------------------------------------
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+
+
+# -----------------------------------------------------------------------------
+# executable icons
+# -----------------------------------------------------------------------------
+if(WIN32)
+    set(system_addons bornagain.rc)
+    if(NOT win32_console)
+        set(executable_options WIN32)
+    endif()
+endif()
+
+if(APPLE)
+    set(MACOSX_BUNDLE_ICON_FILE BornAgain.icns)
+    set_source_files_properties(${CMAKE_SOURCE_DIR}/GUI/main/BornAgain.icns
+        PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+    if(BORNAGAIN_APPLE_BUNDLE)
+        set(executable_options MACOSX_BUNDLE)
+    endif()
+endif()
+
+
+# -----------------------------------------------------------------------------
+# executable
+# -----------------------------------------------------------------------------
+add_executable(${executable_name}
+               ${executable_options}
+               ${source_files}
+               ${system_addons})
+
+
+# -----------------------------------------------------------------------------
+# dependencies
+# -----------------------------------------------------------------------------
+target_link_libraries(${executable_name} ${BornAgainGUI_LIBRARY})
+
+
+# -----------------------------------------------------------------------------
+# extra target properties
+# -----------------------------------------------------------------------------
+if(WIN32)
+    set_target_properties( ${executable_name} PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup" )
+    if(win32_console)
+        set_target_properties( ${executable_name} PROPERTIES COMPILE_DEFINITIONS "_CONSOLE" )
+    endif()
+endif()
+
+if(APPLE)
+    set(MACOSX_BUNDLE_IDENTIFIER "org.bornagainproject.BornAgain")
+    configure_file("${TEMPLATE_DIR}/MacOSXBundleInfo.plist.in" "${BUILD_VAR_DIR}/Info.plist" @ONLY)
+
+    set_target_properties(${executable_name}
+        PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${BUILD_VAR_DIR}/Info.plist)
+
+    if(BORNAGAIN_APPLE_BUNDLE)
+        # this makes sense only if we build a bundle
+        set(link_flags "-Wl,-rpath, at loader_path/../Frameworks/ \
+  -Wl,-rpath, at loader_path/../lib/BornAgain-${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR}/")
+    else()
+        set(link_flags "-Wl,-rpath, at loader_path/../../../lib/BornAgain-${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR}/")
+    endif()
+    set_target_properties(${executable_name} PROPERTIES LINK_FLAGS ${link_flags})
+endif()
+
+
+# -----------------------------------------------------------------------------
+# installation section
+# -----------------------------------------------------------------------------
+if(BORNAGAIN_APPLE_BUNDLE)
+    set(executable_destination BUNDLE DESTINATION  ".")
+elseif(WIN32)
+    set(executable_destination DESTINATION ${destination_gui})
+else()
+    set(executable_destination DESTINATION "${destination_gui}/exec")
+endif()
+#message(STATUS "Executable destination is ${executable_destination}")
+install (TARGETS ${executable_name} ${executable_destination} COMPONENT Applications)
+
+set(image_files
+    ${CMAKE_SOURCE_DIR}/GUI/main/BornAgain.ico
+    ${CMAKE_SOURCE_DIR}/GUI/main/BornAgain.icns
+    ${CMAKE_SOURCE_DIR}/GUI/coregui/images/BornAgain_48x48.png
+    ${CMAKE_SOURCE_DIR}/GUI/coregui/images/BornAgain_64x64.png)
+install (FILES ${image_files} DESTINATION ${destination_images} COMPONENT Applications)
+
+
+# -----------------------------------------------------------------------------
+# system dependent installation
+# -----------------------------------------------------------------------------
+if(UNIX)
+    if(BORNAGAIN_APPLE_BUNDLE)
+        install( FILES ${CMAKE_SOURCE_DIR}/GUI/main/BornAgain.icns
+            DESTINATION ${destination_bundle}/Contents/Resources/
+        )
+        install( FILES ${CMAKE_SOURCE_DIR}/cmake/bornagain/scripts/qt.conf
+            DESTINATION ${destination_bundle}/Contents/Resources/
+        )
+        configure_file(${CMAKE_SOURCE_DIR}/cmake/bornagain/modules/FixAppleBundle.cmake.in
+                       ${BUILD_VAR_DIR}/FixAppleBundle.cmake @ONLY)
+        install(SCRIPT ${BUILD_VAR_DIR}/FixAppleBundle.cmake COMPONENT Runtime)
+    elseif(WIN32)
+    elseif(NOT BUILD_DEBIAN)
+        # creating link to BornAgain gui in bin directory
+        install(CODE "
+        execute_process(COMMAND \${CMAKE_COMMAND} -E create_symlink
+        \"../${destination_libexec}/exec/BornAgain\" \"bornagain\"
+        WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}/${destination_bin}\")
+        " COMPONENT Runtime)
+    endif()
+endif()
diff --git a/GUI/main/appoptions.cpp b/GUI/main/appoptions.cpp
new file mode 100644
index 0000000..3b82446
--- /dev/null
+++ b/GUI/main/appoptions.cpp
@@ -0,0 +1,93 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/main/appoptions.cpp
+//! @brief     Implements class ProgramOptions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "appoptions.h"
+#include "GUIHelpers.h"
+#include <boost/program_options/config.hpp>
+#include <boost/program_options/parsers.hpp>
+#include <fstream>
+#include <iostream>
+
+
+ApplicationOptions::ApplicationOptions(int argc, char **argv)
+    : m_options_is_consistent(false)
+{
+    m_options.add_options()
+        ("help,h",      "print help message")
+        ("version,v",   "print version number")
+        ("with-debug",  "run application with debug printout")
+        ("no-splash",   "do not show splash screen");
+
+    parseCommandLine(argc, argv);
+
+    processOptions();
+}
+
+//! access variables
+
+const bpo::variable_value& ApplicationOptions::operator[] (const std::string& s) const
+{
+    return m_variables_map[s.c_str()];
+}
+
+//! parse command line arguments
+
+void ApplicationOptions::parseCommandLine(int argc, char **argv)
+{
+    m_options_is_consistent = false;
+    // parsing command line arguments
+    try {
+        // if positional option description is empty, no command line arguments
+        // without '--' or '-' will be accepted
+        // 'store' populates the variable map
+        bpo::store( bpo::command_line_parser( argc, argv).options( m_options ).positional( m_positional_options ).run(), m_variables_map);
+        //bpo::store(bpo::parse_command_line(argc, argv, m_options), m_variables_map);
+
+        // 'notify' raises any errors encountered
+        bpo::notify(m_variables_map);
+
+        m_options_is_consistent = true;
+    }
+    catch(std::exception& e) {
+        // we get here if there is unrecognized options
+        std::cout << "main() ->  " << e.what() << std::endl;
+        std::cout << m_options << std::endl;
+    }
+
+}
+
+void ApplicationOptions::processOptions()
+{
+    if(!m_options_is_consistent) return;
+
+    if (m_variables_map.count("help")) {
+        printHelpMessage();
+        m_options_is_consistent = false;
+    }
+    else if(m_variables_map.count("version")) {
+        std::cout << "BornAgain-"<<GUIHelpers::getBornAgainVersionString().toStdString() << std::endl;
+        m_options_is_consistent = false;
+    }
+
+}
+
+void ApplicationOptions::printHelpMessage() const
+{
+    std::cout << "BornAgain Graphical User Interface" << std::endl;
+    std::cout << m_options << std::endl;
+}
+
+
diff --git a/GUI/main/appoptions.h b/GUI/main/appoptions.h
new file mode 100644
index 0000000..caacbc6
--- /dev/null
+++ b/GUI/main/appoptions.h
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/main/appoptions.h
+//! @brief     Collection of utilities to parse command line options
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef APPOPTIONS_H
+#define APPOPTIONS_H
+
+#include "Macros.h"
+#include "WinDllMacros.h"
+GCC_DIAG_OFF(unused-parameter);
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/positional_options.hpp>
+#include <boost/program_options/variables_map.hpp>
+GCC_DIAG_ON(unused-parameter);
+
+#include <string>
+
+namespace bpo = boost::program_options;
+
+
+//! @class ApplicationOptions
+//! @ingroup tools_internal
+//! @brief Handles command line and config file program options
+
+class ApplicationOptions
+{
+public:
+    ApplicationOptions(int argc = 0, char **argv = 0);
+
+    //! access to variable with given name defined in variables container
+    const bpo::variable_value& operator[] (const std::string& s) const;
+
+    //! Returns true if option with given name has been set
+    bool find(std::string name) const { return (m_variables_map.count(name.c_str()) ? true : false); }
+
+    //! Returns true if options are consistent (no conflicting options, no --help request, config file is parsed)
+    bool isConsistent() const { return m_options_is_consistent; }
+
+    //! Parses command line arguments
+    void parseCommandLine(int argc, char **argv);
+
+    //! Returns reference to the variables container
+    bpo::variables_map& getVariables() { return m_variables_map; }
+
+    //! Returns reference to the options description
+    bpo::options_description& getOptions() { return m_options; }
+
+    void processOptions();
+
+    void printHelpMessage() const;
+
+private:
+    bool m_options_is_consistent;       //! true if options are consistent (no conflicts, no --help request)
+    bpo::options_description m_options; //! options description, to be filled with add() from different program modules
+    bpo::positional_options_description m_positional_options; //! positional options description, to be filled with addPositional() from main module
+    bpo::variables_map m_variables_map; //! parsed variables
+};
+
+
+
+#endif // APPOPTIONS_H
diff --git a/GUI/main/bornagain.rc b/GUI/main/bornagain.rc
new file mode 100644
index 0000000..7d267bd
--- /dev/null
+++ b/GUI/main/bornagain.rc
@@ -0,0 +1 @@
+IDI_ICON1               ICON    DISCARDABLE     "BornAgain.ico"
diff --git a/GUI/main/crashhandlersetup.cpp b/GUI/main/crashhandlersetup.cpp
new file mode 100644
index 0000000..787b5a0
--- /dev/null
+++ b/GUI/main/crashhandlersetup.cpp
@@ -0,0 +1,151 @@
+/**************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "crashhandlersetup.h"
+
+#include <QtGlobal>
+
+//#if !defined(QT_NO_DEBUG) && defined(Q_OS_LINUX)
+#define BUILD_CRASH_HANDLER
+//#endif
+
+#ifdef BUILD_CRASH_HANDLER
+
+#include <QApplication>
+#include <QString>
+#include <QDebug>
+
+#include <stdlib.h>
+
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+//#include <sys/prctl.h>
+
+// Enable compilation with older header that doesn't contain this constant
+// for running on newer libraries that do support it
+#ifndef PR_SET_PTRACER
+#define PR_SET_PTRACER 0x59616d61
+#endif
+
+#ifdef Q_WS_X11
+#include <qx11info_x11.h>
+#include <X11/Xlib.h>
+#endif
+
+static const char *crashHandlerPathC;
+static void *signalHandlerStack;
+
+extern "C" void signalHandler(int signal)
+{
+#ifdef Q_WS_X11
+    // Kill window since it's frozen anyway.
+    if (QX11Info::display())
+        close(ConnectionNumber(QX11Info::display()));
+#endif
+    pid_t pid = fork();
+    switch (pid) {
+    case -1: // error
+        break;
+    case 0: // child
+        execl(crashHandlerPathC, crashHandlerPathC, strsignal(signal), (char *) 0);
+        _exit(EXIT_FAILURE);
+    default: // parent
+//        prctl(PR_SET_PTRACER, pid, 0, 0, 0);
+        waitpid(pid, 0, 0);
+        _exit(EXIT_FAILURE);
+        break;
+    }
+}
+#endif // BUILD_CRASH_HANDLER
+
+void setupCrashHandler()
+{
+//#ifdef BUILD_CRASH_HANDLER
+    qDebug() << "setupCrashHandler()" << qApp->applicationDirPath();
+
+//    if (qgetenv("QTC_USE_CRASH_HANDLER").isEmpty())
+//        return;
+
+    const QString crashHandlerPath = qApp->applicationDirPath()
+        + QLatin1String("/crashhandler");
+    crashHandlerPathC = qstrdup(qPrintable(crashHandlerPath));
+
+    // Setup an alternative stack for the signal handler. This way we are able to handle SIGSEGV
+    // even if the normal process stack is exhausted.
+    stack_t ss;
+    ss.ss_sp = signalHandlerStack = malloc(SIGSTKSZ); // Usual requirements for alternative signal stack.
+    if (ss.ss_sp == 0) {
+        qWarning("Warning: Could not allocate space for alternative signal stack (%s).", Q_FUNC_INFO);
+        return;
+    }
+    ss.ss_size = SIGSTKSZ;
+    ss.ss_flags = 0;
+    if (sigaltstack(&ss, 0) == -1) {
+        qWarning("Warning: Failed to set alternative signal stack (%s).", Q_FUNC_INFO);
+        return;
+    }
+
+    // Install signal handler for calling the crash handler.
+    struct sigaction sa;
+    if (sigemptyset(&sa.sa_mask) == -1) {
+        qWarning("Warning: Failed to empty signal set (%s).", Q_FUNC_INFO);
+        return;
+    }
+    sa.sa_handler = &signalHandler;
+    // SA_RESETHAND - Restore signal action to default after signal handler has been called.
+    // SA_NODEFER - Don't block the signal after it was triggered (otherwise blocked signals get
+    // inherited via fork() and execve()). Without this the signal will not be delivered to the
+    // restarted Qt Creator.
+    // SA_ONSTACK - Use alternative stack.
+    sa.sa_flags = SA_RESETHAND | SA_NODEFER | SA_ONSTACK;
+    // See "man 7 signal" for an overview of signals.
+    // Do not add SIGPIPE here, QProcess and QTcpSocket use it.
+    const int signalsToHandle[] = { SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGBUS, 0 };
+    for (int i = 0; signalsToHandle[i]; ++i) {
+        if (sigaction(signalsToHandle[i], &sa, 0) == -1 ) {
+            qWarning("Warning: Failed to install signal handler for signal \"%s\" (%s).",
+                strsignal(signalsToHandle[i]), Q_FUNC_INFO);
+        }
+    }
+
+    qDebug() << "setupCrashHandler() -> done";
+//#endif // BUILD_CRASH_HANDLER
+}
+
+void cleanupCrashHandler()
+{
+//#ifdef BUILD_CRASH_HANDLER
+    delete[] crashHandlerPathC;
+    free(signalHandlerStack);
+//#endif
+}
diff --git a/GUI/main/crashhandlersetup.h b/GUI/main/crashhandlersetup.h
new file mode 100644
index 0000000..d42d436
--- /dev/null
+++ b/GUI/main/crashhandlersetup.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef CRASHHANDLERSETUP_H
+#define CRASHHANDLERSETUP_H
+
+void setupCrashHandler();
+void cleanupCrashHandler();
+
+#endif // CRASHHANDLERSETUP_H
diff --git a/GUI/main/main.cpp b/GUI/main/main.cpp
new file mode 100644
index 0000000..0b8a99e
--- /dev/null
+++ b/GUI/main/main.cpp
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      GUI/main/main.cpp
+//! @brief     Main function of the whole GUI
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "FitProgressInfo.h"
+#include "SplashScreen.h"
+#include "appoptions.h"
+#include "mainwindow.h"
+#include "ComboProperty.h"
+#include <QApplication>
+#include <QDebug>
+#include <QLocale>
+#include <QMetaType>
+#include <QTime>
+#include <iostream>
+
+void messageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg)
+{
+     Q_UNUSED(type);
+     Q_UNUSED(msg);
+}
+
+int main(int argc, char *argv[])
+{
+    ApplicationOptions options(argc, argv);
+    if(!options.isConsistent()) return 0;
+
+    QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
+    qRegisterMetaType<QVector<double> >("QVector<double>");
+    qRegisterMetaType<FitProgressInfo>("FitProgressInfo");
+//    QMetaType::registerComparators<ComboProperty>();
+
+    QApplication a(argc, argv);
+
+    if(!a.arguments().contains(QLatin1String("--with-debug"))) {
+        qInstallMessageHandler(messageHandler);
+    }
+
+    MainWindow w;
+
+    SplashScreen *splash(0);
+    if(!options.find("no-splash")) {
+        splash = new SplashScreen();
+        splash->show();
+
+        int time(1500);
+        QTime dieTime = QTime::currentTime().addMSecs(time);
+        QTime timer;
+        timer.start();
+        while( QTime::currentTime() < dieTime )
+        {
+            splash->setProgress(timer.elapsed()/(time/100));
+            QCoreApplication::processEvents( QEventLoop::AllEvents, 100 );
+        }
+    }
+
+
+    w.show();
+
+    if(splash)
+        splash->finish(&w);
+
+    return a.exec();
+}
diff --git a/GUI/main/stacktracesetup.cpp b/GUI/main/stacktracesetup.cpp
new file mode 100644
index 0000000..ebd67ef
--- /dev/null
+++ b/GUI/main/stacktracesetup.cpp
@@ -0,0 +1,202 @@
+#include "stacktracesetup.h"
+
+#include <stdio.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <execinfo.h>
+#include <errno.h>
+#include <cxxabi.h>
+
+void abortHandler(int );
+
+StackTraceSetup::StackTraceSetup()
+{
+  signal( SIGABRT, abortHandler );
+  signal( SIGSEGV, abortHandler );
+  signal( SIGILL,  abortHandler );
+  signal( SIGFPE,  abortHandler );
+
+}
+
+//static inline void printStackTrace( FILE *out = stderr, unsigned int max_frames = 63 )
+//{
+//   fprintf(out, "stack trace:\n");
+
+//   // storage array for stack trace address data
+//   void* addrlist[max_frames+1];
+
+//   // retrieve current stack addresses
+//   int addrlen = backtrace( addrlist, sizeof( addrlist ) / sizeof( void* ));
+
+//   if ( addrlen == 0 )
+//   {
+//      fprintf( out, "  \n" );
+//      return;
+//   }
+
+//   // create readable strings to each frame.
+//   char** symbollist = backtrace_symbols( addrlist, addrlen );
+
+//   // print the stack trace.
+//   for ( int i = 4; i < addrlen; i++ )
+//      fprintf( out, "%s\n", symbollist[i]);
+
+//   free(symbollist);
+//}
+
+
+#include <execinfo.h>
+#include <errno.h>
+#include <cxxabi.h>
+
+static inline void printStackTrace( FILE *out = stderr, unsigned int max_frames = 63 )
+{
+   fprintf(out, "stack trace:\n");
+
+   // storage array for stack trace address data
+   void* addrlist[max_frames+1];
+
+   // retrieve current stack addresses
+   unsigned int addrlen = backtrace( addrlist, sizeof( addrlist ) / sizeof( void* ));
+
+   if ( addrlen == 0 )
+   {
+      fprintf( out, "  \n" );
+      return;
+   }
+
+   // resolve addresses into strings containing "filename(function+address)",
+   // Actually it will be ## program address function + offset
+   // this array must be free()-ed
+   char** symbollist = backtrace_symbols( addrlist, addrlen );
+
+   size_t funcnamesize = 1024;
+   char funcname[1024];
+
+   // iterate over the returned symbol lines. skip the first, it is the
+   // address of this function.
+   for ( unsigned int i = 4; i < addrlen; i++ )
+   {
+      char* begin_name   = nullptr;
+      char* begin_offset = nullptr;
+      char* end_offset   = nullptr;
+
+      // find parentheses and +address offset surrounding the mangled name
+#ifdef DARWIN
+      // OSX style stack trace
+      for ( char *p = symbollist[i]; *p; ++p )
+      {
+         if (( *p == '_' ) && ( *(p-1) == ' ' ))
+            begin_name = p-1;
+         else if ( *p == '+' )
+            begin_offset = p-1;
+      }
+
+      if ( begin_name && begin_offset && ( begin_name < begin_offset ))
+      {
+         *begin_name++ = '\0';
+         *begin_offset++ = '\0';
+
+         // mangled name is now in [begin_name, begin_offset) and caller
+         // offset in [begin_offset, end_offset). now apply
+         // __cxa_demangle():
+         int status;
+         char* ret = abi::__cxa_demangle( begin_name, &funcname[0],
+                                          &funcnamesize, &status );
+         if ( status == 0 )
+         {
+            funcname = ret; // use possibly realloc()-ed string
+            fprintf( out, "  %-30s %-40s %s\n",
+                     symbollist[i], funcname, begin_offset );
+         } else {
+            // demangling failed. Output function name as a C function with
+            // no arguments.
+            fprintf( out, "  %-30s %-38s() %s\n",
+                     symbollist[i], begin_name, begin_offset );
+         }
+
+#else // !DARWIN - but is posix
+      // not OSX style
+      // ./module(function+0x15c) [0x8048a6d]
+      for ( char *p = symbollist[i]; *p; ++p )
+      {
+         if ( *p == '(' )
+            begin_name = p;
+         else if ( *p == '+' )
+            begin_offset = p;
+         else if ( *p == ')' && ( begin_offset || begin_name ))
+            end_offset = p;
+      }
+
+      if ( begin_name && end_offset && ( begin_name < end_offset ))
+      {
+         *begin_name++   = '\0';
+         *end_offset++   = '\0';
+         if ( begin_offset )
+            *begin_offset++ = '\0';
+
+         // mangled name is now in [begin_name, begin_offset) and caller
+         // offset in [begin_offset, end_offset). now apply
+         // __cxa_demangle():
+
+         int status = 0;
+         char* ret = abi::__cxa_demangle( begin_name, funcname,
+                                          &funcnamesize, &status );
+         char* fname = begin_name;
+         if ( status == 0 )
+            fname = ret;
+
+         if ( begin_offset )
+         {
+            fprintf( out, "  %-30s ( %-40s  + %-6s) %s\n",
+                     symbollist[i], fname, begin_offset, end_offset );
+         } else {
+            fprintf( out, "  %-30s ( %-40s    %-6s) %s\n",
+                     symbollist[i], fname, "", end_offset );
+         }
+#endif  // !DARWIN - but is posix
+      } else {
+         // couldn't parse the line? print the whole line.
+         fprintf(out, "  %-40s\n", symbollist[i]);
+      }
+   }
+
+   free(symbollist);
+
+}
+
+void abortHandler(int signum )
+{
+   // associate each signal with a signal name string.
+   const char* name = nullptr;
+   switch( signum )
+   {
+   case SIGABRT: name = "SIGABRT";  break;
+   case SIGSEGV: name = "SIGSEGV";  break;
+   case SIGBUS:  name = "SIGBUS";   break;
+   case SIGILL:  name = "SIGILL";   break;
+   case SIGFPE:  name = "SIGFPE";   break;
+   }
+
+   // Notify the user which signal was caught. We use printf, because this is the
+   // most basic output function. Once you get a crash, it is possible that more
+   // complex output systems like streams and the like may be corrupted. So we
+   // make the most basic call possible to the lowest level, most
+   // standard print function.
+   if ( name )
+      fprintf( stderr, "Caught signal %d (%s)\n", signum, name );
+   else
+      fprintf( stderr, "Caught signal %d\n", signum );
+
+   // Dump a stack trace.
+   // This is the function we will be implementing next.
+   printStackTrace();
+
+   // If you caught one of the above signals, it is likely you just
+   // want to quit your program right now.
+   exit( signum );
+}
+
+
+#include <execinfo.h>
+
diff --git a/GUI/main/stacktracesetup.h b/GUI/main/stacktracesetup.h
new file mode 100644
index 0000000..355c297
--- /dev/null
+++ b/GUI/main/stacktracesetup.h
@@ -0,0 +1,11 @@
+#ifndef STACKTRACESETUP_H
+#define STACKTRACESETUP_H
+
+class StackTraceSetup
+{
+public:
+    StackTraceSetup();
+};
+
+
+#endif // STACKTRACESETUP_H
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..4d57783
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,42 @@
+Brief Installation instruction for BornAgain framework
+
+Detailed installation instructions can be found at
+http://www.bornagainproject.org/documentation/installation
+
+-------------------------------------------------------------------------------
+1) Install third party software
+-------------------------------------------------------------------------------
+Required:
+* compiler with C++-11 support (clang versions >= 3.3, GCC versions >= 4.8)
+* cmake >=2.8.12
+* boost library >=1.48
+* eigen3
+* fftw3 library >=3.3
+* gsl (GNU scientific library) >= 1.15
+* python >=2.7, python-devel, python-numpy-devel, python-matplotlib
+* Qt5
+
+-------------------------------------------------------------------------------
+2) Get the source
+-------------------------------------------------------------------------------
+
+download BornAgain-<version>.tar.gz from http://apps.jcns.fz-juelich.de/src/BornAgain/
+or
+git clone git://apps.jcns.fz-juelich.de/BornAgain.git
+
+-------------------------------------------------------------------------------
+3) Build with CMake
+-------------------------------------------------------------------------------
+mkdir <build_dir>
+cd <build_dir>
+cmake <source_dir> -DCMAKE_INSTALL_PREFIX=<install_dir>
+make -j4
+ctest -j4
+make install
+
+-------------------------------------------------------------------------------
+4) Run a first simulation
+-------------------------------------------------------------------------------
+source <install_dir>/bin/thisbornagain.sh
+cd <install_dir>/share/BornAgain-<version>/Examples/python/simulation/ex01_BasicParticles
+python CylindersAndPrisms.py
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2374dce
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+## BornAgain project at GitHub
+
+BornAgain is a software to simulate and fit neutron and x-ray scattering at grazing incidence
+(GISANS and GISAXS), using distorted-wave Born approximation (DWBA).
+
+#### Homepage
+http://bornagainproject.org
+
+#### License
+GNU General Public License v3 or higher (see COPYING)
+
+## CI Status
+
+[![Travis-CI Build Status](https://travis-ci.org/scgmlz/BornAgain.svg?branch=develop)](https://travis-ci.org/scgmlz/BornAgain)
+[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/scgmlz/BornAgain?branch=develop&svg=true)](https://ci.appveyor.com/project/gpospelov/bornagain)
diff --git a/Tests/Functional/CMakeLists.txt b/Tests/Functional/CMakeLists.txt
new file mode 100644
index 0000000..e6900ad
--- /dev/null
+++ b/Tests/Functional/CMakeLists.txt
@@ -0,0 +1,28 @@
+############################################################################
+# Tests/Functional/CMakeLists.txt (called from top-level CMakeLists.txt)
+############################################################################
+
+set(BUILD_REF_DIR ${CMAKE_BINARY_DIR}/ref)
+file(MAKE_DIRECTORY ${BUILD_REF_DIR})
+
+set(BUILD_BIN_DIR ${CMAKE_BINARY_DIR}/bin)
+set(BUILD_LIB_DIR ${CMAKE_BINARY_DIR}/lib)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBUILD_BIN_DIR=\\\"${BUILD_BIN_DIR}\\\"")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBUILD_LIB_DIR=\\\"${BUILD_LIB_DIR}\\\"")
+
+add_subdirectory(TestMachinery)
+add_subdirectory(Core)
+add_subdirectory(Fit)
+
+if(BORNAGAIN_PYTHON)
+    add_subdirectory(PyCore/legacy)
+    add_subdirectory(PyCore/export)
+    add_subdirectory(PyCore/persistence)
+    add_subdirectory(PyFit)
+endif()
+
+if(BORNAGAIN_GUI)
+    add_subdirectory(GUI)
+    add_subdirectory(GUI/GUITranslationTest)
+endif()
diff --git a/Tests/Functional/Core/BatchSimulation.cpp b/Tests/Functional/Core/BatchSimulation.cpp
new file mode 100644
index 0000000..3303ee8
--- /dev/null
+++ b/Tests/Functional/Core/BatchSimulation.cpp
@@ -0,0 +1,49 @@
+#include "GISASSimulation.h"
+#include "SimulationFactory.h"
+#include "IFunctionalTest.h"
+#include "IntensityDataFunctions.h"
+#include "SampleBuilderFactory.h"
+#include <iostream>
+#include <memory>
+
+bool TestBatchSimulation()
+{
+    SimulationFactory sim_registry;
+    const std::unique_ptr<GISASSimulation> simulation(sim_registry.createItem("MiniGISAS"));
+
+    SampleBuilderFactory sampleFactory;
+    std::shared_ptr<class IMultiLayerBuilder> builder(
+        sampleFactory.createItem("CylindersInBABuilder") );
+    simulation->setSampleBuilder(builder);
+    simulation->runSimulation();
+    const std::unique_ptr<OutputData<double>> reference(simulation->getDetectorIntensity());
+    const std::unique_ptr<OutputData<double>> result(reference->clone());
+    result->setAllTo(0.0);
+
+    const int n_batches = 9;
+    const double threshold = 2e-10;
+    for(size_t i_batch=0; i_batch<n_batches; ++i_batch) {
+        const std::unique_ptr<GISASSimulation> batch(simulation->clone());
+        ThreadInfo threadInfo;
+        threadInfo.n_threads = 1;
+        threadInfo.n_batches = n_batches;
+        threadInfo.current_batch = i_batch;
+        batch->getOptions().setThreadInfo(threadInfo);
+        batch->runSimulation();
+        std::unique_ptr<OutputData<double>> batchResult(batch->getDetectorIntensity());
+        *result += *batchResult.get();
+    }
+
+    double diff = IntensityDataFunctions::getRelativeDifference(*result, *reference);
+
+    std::cout << "BatchSimulation" << " " << "Running simulations in batch mode" << " " << diff
+              << " " << (diff>threshold ? "[FAILED]" : "[OK]") << "\n";
+
+    return diff <= threshold;
+}
+
+
+int main(int, char**)
+{
+    return TestBatchSimulation() ? 0 : 1;
+}
diff --git a/Tests/Functional/Core/CMakeLists.txt b/Tests/Functional/Core/CMakeLists.txt
new file mode 100644
index 0000000..963c00b
--- /dev/null
+++ b/Tests/Functional/Core/CMakeLists.txt
@@ -0,0 +1,97 @@
+############################################################################
+# Tests/Functional/Core/CMakeLists.txt
+############################################################################
+
+set(CORE_STD_OUT_DIR     ${BUILD_REF_DIR}/StandardSuite)
+set(CORE_STD_REF_DIR     ${REFERENCE_DIR}/StandardSuite)
+set(CORE_SPECIAL_REF_DIR ${REFERENCE_DIR}/Special)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCORE_STD_OUT_DIR=\\\"${CORE_STD_OUT_DIR}\\\"")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCORE_STD_REF_DIR=\\\"${CORE_STD_REF_DIR}\\\"")
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCORE_SPECIAL_REF_DIR=\\\"${CORE_SPECIAL_REF_DIR}\\\"")
+
+# CoreStandardTest cases:
+set(test_cases
+    ApproximationDA
+    ApproximationLMA
+    ApproximationSSCA
+    Basic2DParaCrystal
+    BeamDivergence
+    BoxCompositionRotateX
+    BoxCompositionRotateY
+    BoxCompositionRotateZ
+    BoxCompositionRotateZandY
+    BoxStackComposition
+    CenteredSquareLattice
+    CoreShellBoxRotateZandY
+    CoreShellParticle
+    CosineRipple
+    CustomMorphology
+    CylindersAndPrisms
+    CylindersInSSCA
+    CylindersWithSizeDistribution
+    DetectorResolution
+    FormFactors
+    FormFactorsAbs
+    HexParaCrystal
+    LargeCylindersMonteCarlo
+    Lattice1D
+    MagneticParticleZeroField
+    MesoCrystal
+    MultiLayerWithRoughness
+    MultipleLayout
+    ParticleComposition
+    RadialParaCrystal
+    RectDetectorGeneric
+    RectDetectorPerpToDirectBeam
+    RectDetectorPerpToReflectedBeam
+    RectDetectorPerpToReflectedBeamDpos
+    RectDetectorPerpToSample
+    RectParaCrystal
+    RotatedPyramids
+    RotatedSquareLattice
+    SimulationWithMasks
+    SquareLattice
+    TransformBox
+    TriangularRipple
+    TwoTypesCylindersDistribution
+    SphericalDetWithRoi
+    RectDetWithRoi
+    )
+
+# Other tests:
+set(other_tests
+    BatchSimulation
+    PolDWBAMagCylinders2
+    )
+
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/../TestMachinery
+    ${CMAKE_SOURCE_DIR}/Core/Simulation
+    )
+
+# for some reason these flags aren't propagated here by SetUpWindows.cmake
+if(MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc ")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHsc ")
+endif()
+
+# Setup CoreStandardTest:
+add_executable(CoreStandardTest CoreStandardTest.cpp CoreTest.h CoreTest.cpp)
+target_link_libraries(CoreStandardTest BornAgainCore BornAgainTestMachinery)
+foreach(test_case ${test_cases})
+    add_test(CoreStandardTest/${test_case}
+        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/CoreStandardTest ${test_case})
+endforeach()
+
+# Setup other tests:
+foreach(test ${other_tests})
+    add_executable(${test} ${test}.cpp)
+    target_link_libraries(${test} BornAgainFit BornAgainCore)
+    add_test(${test} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test})
+endforeach()
diff --git a/Tests/Functional/Core/CoreStandardTest.cpp b/Tests/Functional/Core/CoreStandardTest.cpp
new file mode 100644
index 0000000..7dca9c2
--- /dev/null
+++ b/Tests/Functional/Core/CoreStandardTest.cpp
@@ -0,0 +1,32 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Core/CoreStandardTest.cpp
+//! @brief     Implements program CoreSuite, to run core functional tests
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IStandardTest.h"
+#include "CoreTest.h"
+
+//! Provides a CoreTest through a callback mechanism explained in IStandardTest.h.
+class CoreStandardTest : public IStandardTest
+{
+public:
+    CoreStandardTest() : IStandardTest("CoreStandardTest") {}
+    std::unique_ptr<IFunctionalTest> getTest() const { return std::unique_ptr<IFunctionalTest>
+            (new CoreTest(getName(), getTestDescription(), getSimulation(), getTestThreshold())); }
+};
+
+//! Runs CoreTest on a standard simulation indicated by argv[1].
+int main(int argc, char** argv)
+{
+    return CoreStandardTest().execute(argc, argv) ? 0 : 1;
+}
diff --git a/Tests/Functional/Core/CoreTest.cpp b/Tests/Functional/Core/CoreTest.cpp
new file mode 100644
index 0000000..78e94fb
--- /dev/null
+++ b/Tests/Functional/Core/CoreTest.cpp
@@ -0,0 +1,69 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Core/CoreTest.cpp
+//! @brief     Implements class CoreTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "CoreTest.h"
+#include "FileSystem.h"
+#include "GISASSimulation.h"
+#include "IntensityDataFunctions.h"
+#include "IntensityDataIOFactory.h"
+#include "Utils.h"
+
+CoreTest::CoreTest(
+    const std::string& name, const std::string& description, GISASSimulation* simulation,
+    double threshold)
+    : IReferencedTest(name, description, threshold)
+    , m_simulation(simulation)
+{}
+
+CoreTest::~CoreTest()
+{
+    delete m_simulation;
+    delete m_reference;
+}
+
+bool CoreTest::runTest()
+{
+    // Load reference if available
+    try {
+        m_reference = IntensityDataIOFactory::readOutputData(
+            FileSystem::GetJoinPath(CORE_STD_REF_DIR, getName() + ".int.gz"));
+    } catch(const std::exception& ex) {
+        m_reference = nullptr;
+        std::cout << "No reference found, but we proceed with the simulation to create a new one\n";
+    }
+
+    // Run simulation.
+    assert(m_simulation);
+    m_simulation->runSimulation();
+    const std::unique_ptr<OutputData<double>> result_data(m_simulation->getDetectorIntensity());
+    result_data->setVariability(m_threshold);
+
+    // Compare with reference if available.
+    bool success = false;
+    if (m_reference)
+        success = compareIntensityMaps(*result_data.get(), *m_reference);
+    // Save simulation if different from reference.
+    if (!success) {
+        FileSystem::CreateDirectory(CORE_STD_OUT_DIR);
+        std::string out_fname = FileSystem::GetJoinPath(CORE_STD_OUT_DIR, getName() + ".int");
+        IntensityDataIOFactory::writeOutputData(*result_data, out_fname);
+        std::cout << "New simulation result stored in " << out_fname << ".\n"
+                  << "To visualize an intensity map, use " << BUILD_BIN_DIR << "/view1.py;"
+                  << "   to plot a difference image, use " << BUILD_BIN_DIR << "/view2.py.\n"
+                  << "If the new result is correct, then gzip it and move it to "
+                  << CORE_STD_REF_DIR << "/.\n";
+    }
+    return success;
+}
diff --git a/Tests/Functional/Core/CoreTest.h b/Tests/Functional/Core/CoreTest.h
new file mode 100644
index 0000000..eb184d6
--- /dev/null
+++ b/Tests/Functional/Core/CoreTest.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Core/CoreTest.h
+//! @brief     Defines class CoreTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef CORETEST_H
+#define CORETEST_H
+
+#include "IReferencedTest.h"
+
+template <class T> class OutputData;
+class GISASSimulation;
+
+//! @class CoreTest
+//! @ingroup standard_samples
+//! @brief A functional test of BornAgain/Core.
+//!   Performs a given standard simulation, and compares results with reference data.
+//!   Invoked from CoreStandardTest.
+
+class CoreTest : public IReferencedTest
+{
+public:
+    CoreTest(const std::string& name, const std::string& description,
+             GISASSimulation* simulation, double threshold);
+    ~CoreTest() final;
+
+    bool runTest() final;
+
+private:
+    GISASSimulation* m_simulation;
+    OutputData<double>* m_reference;
+};
+
+#endif // CORETEST_H
diff --git a/Tests/Functional/Core/PolDWBAMagCylinders2.cpp b/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
new file mode 100644
index 0000000..1deb790
--- /dev/null
+++ b/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
@@ -0,0 +1,65 @@
+#include "GISASSimulation.h"
+#include "IntensityDataFunctions.h"
+#include "IntensityDataIOFactory.h"
+#include "SimulationFactory.h"
+#include "FileSystem.h"
+#include <memory>
+
+int main(int, char**)
+{
+    const std::string trunc = FileSystem::GetJoinPath(CORE_SPECIAL_REF_DIR,
+                                                             "/polmagcylinders2_reference_");
+    const std::unique_ptr<OutputData<double> >
+        P_reference00(IntensityDataIOFactory::readOutputData(trunc + "00.int.gz"));
+    const std::unique_ptr<OutputData<double> >
+        P_reference01(IntensityDataIOFactory::readOutputData(trunc + "01.int.gz"));
+    const std::unique_ptr<OutputData<double> >
+        P_reference10(IntensityDataIOFactory::readOutputData(trunc + "10.int.gz"));
+    const std::unique_ptr<OutputData<double> >
+        P_reference11(IntensityDataIOFactory::readOutputData(trunc + "11.int.gz"));
+
+    SimulationFactory sim_registry;
+    GISASSimulation* simulation = sim_registry.createItem("polmagcylinders2");
+    kvector_t zplus(0.0, 0.0, 1.0);
+    kvector_t zmin(0.0, 0.0, -1.0);
+
+    simulation->setBeamPolarization(zplus);
+    simulation->setAnalyzerProperties(zplus, 1.0, 0.5);
+    simulation->runSimulation();
+    const std::unique_ptr<OutputData<double> > P_data00(simulation->getDetectorIntensity());
+
+    simulation->setBeamPolarization(zplus);
+    simulation->setAnalyzerProperties(zplus, -1.0, 0.5);
+    simulation->runSimulation();
+    const std::unique_ptr<OutputData<double> > P_data01(simulation->getDetectorIntensity());
+
+    simulation->setBeamPolarization(zmin);
+    simulation->setAnalyzerProperties(zplus, 1.0, 0.5);
+    simulation->runSimulation();
+    const std::unique_ptr<OutputData<double> > P_data10(simulation->getDetectorIntensity());
+
+    simulation->setBeamPolarization(zmin);
+    simulation->setAnalyzerProperties(zplus, -1.0, 0.5);
+    simulation->runSimulation();
+    const std::unique_ptr<OutputData<double> > P_data11(simulation->getDetectorIntensity());
+
+    const double threshold(2e-10);
+    double diff(0);
+    diff += IntensityDataFunctions::getRelativeDifference(*P_data00, *P_reference00);
+    diff += IntensityDataFunctions::getRelativeDifference(*P_data01, *P_reference01);
+    diff += IntensityDataFunctions::getRelativeDifference(*P_data10, *P_reference10);
+    diff += IntensityDataFunctions::getRelativeDifference(*P_data11, *P_reference11);
+    diff /= 4.;
+
+    delete simulation;
+
+    // Assess result.
+    bool status_ok(true);
+    if( diff > threshold )
+        status_ok=false;
+
+    std::cout << " diff " << diff << std::endl;
+    std::cout << "polmagcylinders2" << " " << "Magnetic cylinders with non-zero magnetic field"
+              << " " << (status_ok ? "[OK]" : "[FAILED]") << std::endl;
+    return status_ok ? 0 : 1;
+}
diff --git a/Tests/Functional/Fit/AdjustMinimizerStrategyTest.cpp b/Tests/Functional/Fit/AdjustMinimizerStrategyTest.cpp
new file mode 100644
index 0000000..fc92b19
--- /dev/null
+++ b/Tests/Functional/Fit/AdjustMinimizerStrategyTest.cpp
@@ -0,0 +1,55 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/AdjustMinimizerStrategyTest.cpp
+//! @brief     Implements class AdjustMinimizerStrategyTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "AdjustMinimizerStrategyTest.h"
+#include "Units.h"
+#include "FitSuite.h"
+#include "MinimizerFactory.h"
+#include "AdjustMinimizerStrategy.h"
+#include "MinimizerConstants.h"
+
+
+AdjustMinimizerStrategyTest::AdjustMinimizerStrategyTest()
+    : IMinimizerTest("undefined", "undefined")
+{}
+
+void AdjustMinimizerStrategyTest::initParameterPlan()
+{
+    m_parameters.clear();
+    m_parameters.push_back(FitParameterPlan("*Height", 2.0 * Units::nanometer,
+                                            5.0 * Units::nanometer,
+                                            AttLimits::limited(0.01, 30.0), 0.05));
+    m_parameters.push_back(FitParameterPlan("*Radius", 10.0 * Units::nanometer,
+                                            5.0 * Units::nanometer,
+                                            AttLimits::limited(0.01, 30.0), 0.05));
+
+}
+
+std::unique_ptr<FitSuite> AdjustMinimizerStrategyTest::createFitSuite() {
+  std::unique_ptr<FitSuite> result(new FitSuite());
+  result->initPrint(50);
+
+  result->addFitStrategy(AdjustMinimizerStrategy(
+      MinimizerNames::Genetic, std::string(), "MaxIterations=2;RandomSeed=1"));
+
+  result->addFitStrategy(AdjustMinimizerStrategy(MinimizerNames::Minuit2,
+                                                    AlgorithmNames::Migrad));
+
+  for (size_t i = 0; i < m_parameters.size(); ++i)
+    result->addFitParameter(m_parameters[i].m_name,
+                            m_parameters[i].m_start_value,
+                            m_parameters[i].m_limits, m_parameters[i].m_step);
+  return result;
+}
diff --git a/Tests/Functional/Fit/AdjustMinimizerStrategyTest.h b/Tests/Functional/Fit/AdjustMinimizerStrategyTest.h
new file mode 100644
index 0000000..6644aa2
--- /dev/null
+++ b/Tests/Functional/Fit/AdjustMinimizerStrategyTest.h
@@ -0,0 +1,35 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/AdjustMinimizerStrategyTest.h
+//! @brief     Declares class MinimizerStrategyTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef EXPERIMENTALFITTEST_H
+#define EXPERIMENTALFITTEST_H
+
+#include "IMinimizerTest.h"
+
+//! @class AdjustMinimizerStrategyTest
+//! @ingroup standard_samples
+//! @brief The AdjustMinimizerStrategyTest verifies fitting with the chain of minimizers.
+
+class AdjustMinimizerStrategyTest : public IMinimizerTest
+{
+public:
+    AdjustMinimizerStrategyTest();
+
+protected:
+    void initParameterPlan() override;
+    std::unique_ptr<FitSuite> createFitSuite() override;
+};
+
+#endif
diff --git a/Tests/Functional/Fit/CMakeLists.txt b/Tests/Functional/Fit/CMakeLists.txt
new file mode 100644
index 0000000..c06585d
--- /dev/null
+++ b/Tests/Functional/Fit/CMakeLists.txt
@@ -0,0 +1,42 @@
+############################################################################
+# Tests/Functional/Fit/CMakeLists.txt
+############################################################################
+
+set(test_cases
+    GSLLevenbergMarquardt
+    GSLMultiMinBFGS
+    GSLMultiMinSteepestDescent
+    GSLSimulatedAnnealing
+    GeneticMinimizer
+    Minuit2_Fumili
+    Minuit2_Migrad
+    RectDetectorFit
+    AdjustMinimizerStrategy
+    StandaloneFit
+)
+
+# for some reason these flags doesn't propagated here by SetUpWindows.cmake
+if(MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc ")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHsc ")
+endif()
+
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${BornAgainFit_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/../TestMachinery
+    ${RootMinimizers_INCLUDE_DIRS}
+)
+
+file(GLOB source_files "*.cpp")
+file(GLOB include_files "*.h")
+
+add_executable(FitTest ${include_files} ${source_files})
+
+target_link_libraries(FitTest BornAgainFit BornAgainCore BornAgainTestMachinery)
+foreach(test_case ${test_cases})
+    add_test(FitTest/${test_case} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FitTest ${test_case})
+endforeach()
diff --git a/Tests/Functional/Fit/FitParameterPlan.cpp b/Tests/Functional/Fit/FitParameterPlan.cpp
new file mode 100644
index 0000000..bdd9156
--- /dev/null
+++ b/Tests/Functional/Fit/FitParameterPlan.cpp
@@ -0,0 +1,40 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/FitParameterPlan.cpp
+//! @brief     Declares class FitParameterPlan.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "FitParameterPlan.h"
+
+FitParameterPlan::FitParameterPlan()
+    : m_name(std::string())
+    , m_start_value(0.0)
+    , m_expected_value(0.0)
+    , m_limits(AttLimits::limitless())
+    , m_step(0.0)
+    , m_threshold(0.0)
+{
+
+}
+
+FitParameterPlan::FitParameterPlan(const std::string &name, double start_value,
+                                   double expected_value,
+                                   const AttLimits &limits, double step)
+    : m_name(name)
+    , m_start_value(start_value)
+    , m_expected_value(expected_value)
+    , m_limits(limits)
+    , m_step(step)
+    , m_threshold(0.01)
+{
+
+}
diff --git a/Tests/Functional/Fit/FitParameterPlan.h b/Tests/Functional/Fit/FitParameterPlan.h
new file mode 100644
index 0000000..9910206
--- /dev/null
+++ b/Tests/Functional/Fit/FitParameterPlan.h
@@ -0,0 +1,41 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/FitParameterPlan.h
+//! @brief     Declares class FitParameterPlan.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef FITPARAMETERPLAN_H
+#define FITPARAMETERPLAN_H
+
+#include "AttLimits.h"
+
+//! @class FitParameterPlan
+//! @ingroup standard_samples
+//! @brief The FitParameterPlan defines fit parameter settings and the value which has to be found
+//! in the course of minimization.
+
+class FitParameterPlan
+{
+public:
+    FitParameterPlan();
+    FitParameterPlan(const std::string &name, double start_value, double expected_value,
+                     const AttLimits &limits, double step);
+
+    std::string m_name;
+    double m_start_value; //!< starting value of fit parameter
+    double m_expected_value; //!< expected value to find in the fit
+    AttLimits m_limits; //!< limits of fit parameter
+    double m_step; //!< step of fit parameter
+    double m_threshold; //!< threshold on found value
+};
+
+#endif
diff --git a/Tests/Functional/Fit/FitTest.cpp b/Tests/Functional/Fit/FitTest.cpp
new file mode 100644
index 0000000..1201dfa
--- /dev/null
+++ b/Tests/Functional/Fit/FitTest.cpp
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/FitTest.cpp
+//! @brief     Implements program FitTest to run fit functional tests
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IFunctionalTest.h"
+#include "StandardFitsFactory.h"
+#include <memory>
+#include <iostream>
+
+//! Runs functional tests.
+
+int main(int argc, char **argv)
+{
+    std::string test_name;
+    if(argc > 1)
+        test_name = std::string(argv[1]);
+
+    StandardFitsFactory catalogue;
+    if (!catalogue.isValidTest(test_name)) {
+        std::cout << "fit_functional_test() -> Non existing test with name '" << test_name << "', "
+                  << "use argument from the list of defined tests" << std::endl;
+        catalogue.printCatalogue(std::cout);
+        return 1;
+    }
+
+    const std::unique_ptr<IFunctionalTest> test(catalogue.createTest(test_name));
+    return test->runTest() ? 0 : 1;
+}
diff --git a/Tests/Functional/Fit/IMinimizerTest.cpp b/Tests/Functional/Fit/IMinimizerTest.cpp
new file mode 100644
index 0000000..3d0b746
--- /dev/null
+++ b/Tests/Functional/Fit/IMinimizerTest.cpp
@@ -0,0 +1,130 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/IMinimizerTest.cpp
+//! @brief     Implements class IMinimizerTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IMinimizerTest.h"
+#include "FitSuite.h"
+#include "GISASSimulation.h"
+#include "MultiLayer.h"
+#include "MinimizerFactory.h"
+#include "SampleBuilderFactory.h"
+#include "SimulationFactory.h"
+#include "FitParameterSet.h"
+#include "Units.h"
+#include <boost/format.hpp>
+#include <memory>
+
+//IMinimizerTest::TestParameter::TestParameter(const std::string &name,
+//                                             double real_value,
+//                                             double start_value)
+//    : m_name(name)
+//    , m_real_value(real_value)
+//    , m_start_value(start_value)
+//    , m_found_value(0.0) {}
+
+IMinimizerTest::IMinimizerTest(const std::string& minimizer_name,
+                               const std::string& minimizer_algorithm)
+    : m_minimizer_name(minimizer_name)
+    , m_minimizer_algorithm(minimizer_algorithm)
+    , m_simulation_name("MiniGISAS")
+    , m_sample_builder_name("CylindersInBABuilder")
+    , m_parameter_tolerance(0.01)
+{
+}
+
+
+bool IMinimizerTest::runTest()
+{
+    initParameterPlan();
+
+    std::unique_ptr<MultiLayer> sample(createSample());
+
+    std::unique_ptr<GISASSimulation> simulation(createSimulation());
+    simulation->setSample(*sample.get());
+    simulation->runSimulation();
+
+    std::unique_ptr<OutputData<double> > real_data(createOutputData(simulation.get()));
+
+    std::unique_ptr<FitSuite> fitSuite(createFitSuite());
+    fitSuite->addSimulationAndRealData(*simulation.get(), *real_data.get());
+
+    // run fit
+    fitSuite->runFit();
+
+    std::vector<double> valuesAtMinimum = fitSuite->fitParameters()->values();
+
+    // analyze results
+    bool success = true;
+    for (size_t i = 0; i < m_parameters.size(); ++i) {
+        double foundValue = valuesAtMinimum[i];
+        double diff = std::abs(foundValue - m_parameters[i].m_expected_value)
+                      / m_parameters[i].m_expected_value;
+        if (diff > m_parameter_tolerance)
+            success = false;
+        std::cout << boost::format("%|12t| %-10s : %-6.4f (diff %6.4g) %s\n") %
+            m_parameters[i].m_name % foundValue % diff %
+            (success ? "OK" : "FAILED");
+    }
+    return success;
+}
+
+//! Creates plan with initial/real values of fit parameters.
+
+void IMinimizerTest::initParameterPlan() {
+  m_parameters.clear();
+  m_parameters.push_back(FitParameterPlan("*Height", 4.5 * Units::nanometer,
+                                          5.0 * Units::nanometer,
+                                          AttLimits::lowerLimited(0.01), 0.01));
+  m_parameters.push_back(FitParameterPlan("*Radius", 5.5 * Units::nanometer,
+                                          5.0 * Units::nanometer,
+                                          AttLimits::lowerLimited(0.01), 0.01));
+}
+
+std::unique_ptr<FitSuite> IMinimizerTest::createFitSuite()
+{
+    std::unique_ptr<FitSuite> result(new FitSuite());
+    result->initPrint(10);
+    IMinimizer* minimizer = MinimizerFactory::createMinimizer(
+                m_minimizer_name, m_minimizer_algorithm);
+    result->setMinimizer(minimizer);
+
+    for (size_t i = 0; i < m_parameters.size(); ++i)
+        result->addFitParameter(
+            m_parameters[i].m_name, m_parameters[i].m_start_value,
+            m_parameters[i].m_limits, m_parameters[i].m_start_value / 100.);
+    return result;
+}
+
+std::unique_ptr<MultiLayer> IMinimizerTest::createSample()
+{
+    SampleBuilderFactory builderFactory;
+    std::unique_ptr<MultiLayer> result(builderFactory.createSample(m_sample_builder_name));
+    for (size_t i = 0; i < m_parameters.size(); ++i)
+        result->setParameterValue(m_parameters[i].m_name, m_parameters[i].m_expected_value);
+    return result;
+}
+
+std::unique_ptr<GISASSimulation> IMinimizerTest::createSimulation()
+{
+    SimulationFactory simRegistry;
+    std::unique_ptr<GISASSimulation> result(simRegistry.createItem(m_simulation_name));
+    return result;
+}
+
+std::unique_ptr<OutputData<double> > IMinimizerTest::createOutputData(
+    const GISASSimulation* simulation)
+{
+    std::unique_ptr<OutputData<double>> result(simulation->getDetectorIntensity());
+    return result;
+}
diff --git a/Tests/Functional/Fit/IMinimizerTest.h b/Tests/Functional/Fit/IMinimizerTest.h
new file mode 100644
index 0000000..af82f67
--- /dev/null
+++ b/Tests/Functional/Fit/IMinimizerTest.h
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/IMinimizerTest.h
+//! @brief     Defines class IMinimizerTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IMINIMIZERTEST_H
+#define IMINIMIZERTEST_H
+
+#include "IFunctionalTest.h"
+#include "OutputData.h"
+#include "FitParameterPlan.h"
+#include <memory>
+
+class FitSuite;
+class MultiLayer;
+class GISASSimulation;
+
+//! @class IMinimizerTest
+//! @ingroup standard_samples
+//! @brief Basic class for all minimizer functional tests
+
+class IMinimizerTest : public IFunctionalTest
+{
+public:
+    IMinimizerTest(const std::string &minimizer_name,
+                   const std::string &minimizer_algorithm = std::string());
+    virtual ~IMinimizerTest(){}
+
+    bool runTest() final;
+
+    void setParameterTolerance(double value) { m_parameter_tolerance = value; }
+
+protected:
+    virtual void initParameterPlan();
+    virtual std::unique_ptr<FitSuite> createFitSuite();
+    virtual std::unique_ptr<MultiLayer> createSample();
+    virtual std::unique_ptr<GISASSimulation> createSimulation();
+    virtual std::unique_ptr<OutputData<double>> createOutputData(const GISASSimulation* simulation);
+
+    std::vector<FitParameterPlan> m_parameters;
+    std::string m_minimizer_name;
+    std::string m_minimizer_algorithm;
+    std::string m_simulation_name;
+    std::string m_sample_builder_name;
+    double m_parameter_tolerance;
+};
+
+#endif // IMINIMIZERTEST_H
diff --git a/Tests/Functional/Fit/MinimizerTests.cpp b/Tests/Functional/Fit/MinimizerTests.cpp
new file mode 100644
index 0000000..ace0cbd
--- /dev/null
+++ b/Tests/Functional/Fit/MinimizerTests.cpp
@@ -0,0 +1,91 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/MinimizerTests.cpp
+//! @brief     Implements classes MinimizerTests.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MinimizerTests.h"
+#include "FitSuite.h"
+#include "MinimizerFactory.h"
+#include "SimAnMinimizer.h"
+#include "GeneticMinimizer.h"
+
+Minuit2MigradTest::Minuit2MigradTest()
+    : IMinimizerTest("Minuit2", "Migrad")
+{}
+
+Minuit2FumiliTest::Minuit2FumiliTest()
+    : IMinimizerTest("Minuit2", "Fumili")
+{}
+
+GSLLevenbergMarquardtTest::GSLLevenbergMarquardtTest()
+    : IMinimizerTest("GSLLMA")
+{}
+
+
+GSLMultiMinBFGSTest::GSLMultiMinBFGSTest()
+    : IMinimizerTest("GSLMultiMin", "BFGS")
+{}
+
+
+GSLMultiMinSteepestDescentTest::GSLMultiMinSteepestDescentTest()
+    : IMinimizerTest("GSLMultiMin", "SteepestDescent")
+{}
+
+
+GSLSimulatedAnnealingTest::GSLSimulatedAnnealingTest()
+    : IMinimizerTest("GSLSimAn")
+{}
+
+std::unique_ptr<FitSuite> GSLSimulatedAnnealingTest::createFitSuite()
+{
+    setParameterTolerance(0.1);
+    std::unique_ptr<FitSuite> result(new FitSuite());
+    result->initPrint(200);
+
+    SimAnMinimizer *minimizer = dynamic_cast<SimAnMinimizer *>
+            (MinimizerFactory::createMinimizer(m_minimizer_name, m_minimizer_algorithm));
+    assert(minimizer);
+    minimizer->setIterationsAtEachTemp(5);
+    minimizer->setMaxIterations(10);
+    minimizer->setBoltzmannMinTemp(1.0);
+
+    result->setMinimizer(minimizer);
+    for (const auto& par: m_parameters)
+        result->addFitParameter(
+            par.m_name, par.m_start_value, AttLimits::limited(4.0, 6.0), par.m_start_value/100.);
+    return result;
+}
+
+
+GeneticTest::GeneticTest()
+    : IMinimizerTest("Genetic")
+{}
+
+std::unique_ptr<FitSuite> GeneticTest::createFitSuite()
+{
+    setParameterTolerance(0.1);
+    std::unique_ptr<FitSuite> result(new FitSuite());
+    result->initPrint(200);
+
+    GeneticMinimizer *minimizer = dynamic_cast<GeneticMinimizer *>
+            (MinimizerFactory::createMinimizer(m_minimizer_name, m_minimizer_algorithm));
+    assert(minimizer);
+    minimizer->setMaxIterations(1);
+    minimizer->setRandomSeed(1);
+
+    result->setMinimizer(minimizer);
+    for (const auto& par: m_parameters)
+        result->addFitParameter(
+            par.m_name, par.m_start_value, AttLimits::limited(4.0, 6.0), par.m_start_value/100.);
+    return result;
+}
diff --git a/Tests/Functional/Fit/MinimizerTests.h b/Tests/Functional/Fit/MinimizerTests.h
new file mode 100644
index 0000000..15e9bbc
--- /dev/null
+++ b/Tests/Functional/Fit/MinimizerTests.h
@@ -0,0 +1,76 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/MinimizerTests.h
+//! @brief     Defines classes MinimizerTests.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERTESTS_H
+#define MINIMIZERTESTS_H
+
+#include "IMinimizerTest.h"
+
+//! basic test of Minuit2/Migrad minimizer
+class Minuit2MigradTest : public IMinimizerTest
+{
+public:
+    Minuit2MigradTest();
+};
+
+//! basic test of Minuit2/Fumili minimizer
+class Minuit2FumiliTest : public IMinimizerTest
+{
+public:
+    Minuit2FumiliTest();
+};
+
+//! basic test of GSL/LMA minimizer
+class GSLLevenbergMarquardtTest : public IMinimizerTest
+{
+public:
+    GSLLevenbergMarquardtTest();
+};
+
+//! basic test of GSL/BFGS minimizer
+class GSLMultiMinBFGSTest : public IMinimizerTest
+{
+public:
+    GSLMultiMinBFGSTest();
+};
+
+//! basic test of GSL/SteepestDescent minimizer
+class GSLMultiMinSteepestDescentTest : public IMinimizerTest
+{
+public:
+    GSLMultiMinSteepestDescentTest();
+};
+
+//! basic test of GSL/SimulatedAnnealing minimizer
+class GSLSimulatedAnnealingTest : public IMinimizerTest
+{
+public:
+    GSLSimulatedAnnealingTest();
+protected:
+    std::unique_ptr<FitSuite> createFitSuite();
+};
+
+//! basic test of Genetic minimizer
+class GeneticTest : public IMinimizerTest
+{
+public:
+    GeneticTest();
+protected:
+    std::unique_ptr<FitSuite> createFitSuite();
+};
+
+#endif // MINIMIZERTESTS_H
+
+
diff --git a/Tests/Functional/Fit/ObjectiveFunctionPlan.cpp b/Tests/Functional/Fit/ObjectiveFunctionPlan.cpp
new file mode 100644
index 0000000..164a609
--- /dev/null
+++ b/Tests/Functional/Fit/ObjectiveFunctionPlan.cpp
@@ -0,0 +1,57 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/ObjectiveFunctionPlan.cpp
+//! @brief     Declares classes to define plans for testing objective functions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ObjectiveFunctionPlan.h"
+#include "ObjectiveTestFunctions.h"
+
+ObjectiveFunctionPlan::ObjectiveFunctionPlan(const std::string &name, objective_function_t func,
+                                             double , double )
+    : m_name(name)
+    , m_objective_function(func)
+{
+
+}
+
+void ObjectiveFunctionPlan::addParameter(double start_value, double expected_value,
+                                         const AttLimits &limits, double step)
+{
+    std::string name = "par"+std::to_string(m_parameters.size());
+    m_parameters.push_back(FitParameterPlan(name, start_value, expected_value, limits, step));
+}
+
+//! Plan for finding rosenbrock function minimum
+//! start point: F(-1.2,1.0) = 24.20
+//! minimum    : F(1.0,1.0)  = 0.
+
+Rosenbrock1::Rosenbrock1()
+    : ObjectiveFunctionPlan("Rosenbrock1", TestFunctions::RosenBrock, 0.0)
+{
+    addParameter(-1.2, 1.0, AttLimits::limited(-5.0, 5.0), 0.01);
+    addParameter(1.0,  1.0, AttLimits::limited(-5.0, 5.0), 0.01);
+}
+
+//! Plan for WoodFour function
+//!   start point: F(-3,-1,-3,-1) = 19192
+//!   minimum    : F(1,1,1,1)  =   0.
+
+WoodFour::WoodFour()
+    : ObjectiveFunctionPlan("WoodFour", TestFunctions::WoodFour, 0.0)
+{
+    addParameter(-3.0, 1.0, AttLimits::limited(-5.0, 5.0), 0.01);
+    addParameter(-1.0, 1.0, AttLimits::limited(-5.0, 5.0), 0.01);
+    addParameter(-3.0, 1.0, AttLimits::limited(-5.0, 5.0), 0.01);
+    addParameter(-1.0, 1.0, AttLimits::limited(-5.0, 5.0), 0.01);
+}
+
diff --git a/Tests/Functional/Fit/ObjectiveFunctionPlan.h b/Tests/Functional/Fit/ObjectiveFunctionPlan.h
new file mode 100644
index 0000000..55e94f2
--- /dev/null
+++ b/Tests/Functional/Fit/ObjectiveFunctionPlan.h
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/ObjectiveFunctionPlan.h
+//! @brief     Declares classes to define plans for testing objective functions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OBJECTIVEFUNCTIONPLAN_H
+#define OBJECTIVEFUNCTIONPLAN_H
+
+#include <memory>
+#include "KernelTypes.h"
+#include "FitParameterPlan.h"
+
+//! @class ObjectiveFunctionPlan
+//! @ingroup standard_samples
+//! @brief The ObjectiveFunctionPlan defines objective function to fit and its fit parameters.
+
+class ObjectiveFunctionPlan
+{
+public:
+    ObjectiveFunctionPlan(const std::string &name, objective_function_t func, double expected_minimum,
+                          double threshold = 0.01);
+
+    void addParameter(double start_value, double expected_value,
+                      const AttLimits &limits, double step);
+
+    objective_function_t objectiveFunction() const { return m_objective_function; }
+
+    const std::vector<FitParameterPlan>& parameterPlan() const { return m_parameters; }
+
+    std::string name() const { return m_name; }
+private:
+    std::string m_name;
+    objective_function_t m_objective_function;
+    std::vector<FitParameterPlan> m_parameters;
+};
+
+//! @class Rosenbrock1
+//! @ingroup standard_samples
+//! @brief Setting for standalone fit of rosenbrock function.
+
+class Rosenbrock1 : public ObjectiveFunctionPlan
+{
+public:
+    Rosenbrock1();
+};
+
+//! @class Rosenbrock1
+//! @ingroup standard_samples
+//! @brief Setting for standalone fit of Wood4 function.
+
+class WoodFour : public ObjectiveFunctionPlan
+{
+public:
+    WoodFour();
+};
+
+#endif
diff --git a/Tests/Functional/Fit/ObjectiveTestFunctions.cpp b/Tests/Functional/Fit/ObjectiveTestFunctions.cpp
new file mode 100644
index 0000000..c7ba01a
--- /dev/null
+++ b/Tests/Functional/Fit/ObjectiveTestFunctions.cpp
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/ObjectiveTestFunctions.cpp
+//! @brief     Implements set of ObjectiveTestFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ObjectiveTestFunctions.h"
+#include <stdexcept>
+#include <iostream>
+#include <string>
+
+//! RosenBrock function: F(x,y) = 100 (y-x^2)^2 + (1-x)^2
+//! start point: F(-1.2,1.0) = 24.20
+//! minimum    : F(1.0,1.0)  = 0.
+
+double TestFunctions::RosenBrock(const std::vector<double> &par)
+{
+    if(par.size() != 2)
+        throw std::runtime_error("ObjectiveFunctions::RosenBrock() -> Error. Expected 2 input "
+                                 "parameters, actual: "+std::to_string(par.size()));
+
+    const double x = par[0];
+    const double y = par[1];
+    const double tmp1 = y-x*x;
+    const double tmp2 = 1-x;
+
+    double value = 100*tmp1*tmp1+tmp2*tmp2;
+    //std::cout << "RosenBrock  x:" << x << " y:" << y << " value:" << value << std::endl;
+
+    return value;
+}
+
+//! Fourth-degree polynomial
+//! F(w,x,y,z) = 100 (y-w^2)^2 + (w-1)^2 + 90 (z-y^2)^2
+//!              + (1-y)^2 + 10.1 [(x-1)^2 + (z-1)^2]
+//!              + 19.8 (x-1)(z-1)
+//!
+//!   start point: F(-3,-1,-3,-1) = 19192
+//!   minimum    : F(1,1,1,1)  =   0.
+
+double TestFunctions::WoodFour(const std::vector<double> &par)
+{
+    if(par.size() != 4)
+        throw std::runtime_error("ObjectiveFunctions::WoodFour() -> Error. Expected 4 input "
+                                 "parameters, actual: "+std::to_string(par.size()));
+    const double w = par[0];
+    const double x = par[1];
+    const double y = par[2];
+    const double z = par[3];
+
+    const double w1 = w-1;
+    const double x1 = x-1;
+    const double y1 = y-1;
+    const double z1 = z-1;
+    const double tmp1 = x-w*w;
+    const double tmp2 = z-y*y;
+
+    return 100*tmp1*tmp1+w1*w1+90*tmp2*tmp2+y1*y1+10.1*(x1*x1+z1*z1)+19.8*x1*z1;
+}
diff --git a/Tests/Functional/Fit/ObjectiveTestFunctions.h b/Tests/Functional/Fit/ObjectiveTestFunctions.h
new file mode 100644
index 0000000..1493ae1
--- /dev/null
+++ b/Tests/Functional/Fit/ObjectiveTestFunctions.h
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/ObjectiveTestFunctions.h
+//! @brief     Declares set of ObjectiveTestFunctions.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OBJECTIVETESTFUNCTIONS_G
+#define OBJECTIVETESTFUNCTIONS_G
+
+#include "WinDllMacros.h"
+#include <vector>
+
+//! @class StandaloneFitTest
+//! @ingroup standard_samples
+//! @brief Collection of objective functions for minimization library testing.
+//! Borrowed from StressFit test framework of http://root.cern.ch.
+
+namespace TestFunctions
+{
+
+BA_CORE_API_ double RosenBrock(const std::vector<double>& par);
+BA_CORE_API_ double WoodFour(const std::vector<double>& par);
+
+}
+
+#endif
+
diff --git a/Tests/Functional/Fit/README b/Tests/Functional/Fit/README
new file mode 100644
index 0000000..19d7783
--- /dev/null
+++ b/Tests/Functional/Fit/README
@@ -0,0 +1,10 @@
+Collection of functional tests (C++)
+
+Collection of fitting tests for libBornAgainFit library.
+Different geometries, number of fit parameters, variety of minimizers
+and minimization strategies.
+
+Tests are compiled and executed automatically when user builds
+the whole project with 'check' target cmake; make check
+
+One can run tests manually by running in the build directory ./bin/FitSuite
diff --git a/Tests/Functional/Fit/RectDetectorFitTest.cpp b/Tests/Functional/Fit/RectDetectorFitTest.cpp
new file mode 100644
index 0000000..eaa7632
--- /dev/null
+++ b/Tests/Functional/Fit/RectDetectorFitTest.cpp
@@ -0,0 +1,58 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/RectDetectorFitTest.cpp
+//! @brief     Implements class RectDetectorFitTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "RectDetectorFitTest.h"
+#include "GISASSimulation.h"
+#include "Histogram2D.h"
+#include "Rectangle.h"
+#include "RectangularDetector.h"
+#include "Units.h"
+
+RectDetectorFitTest::RectDetectorFitTest()
+    : IMinimizerTest("Minuit2", "Migrad")
+{
+}
+
+std::unique_ptr<GISASSimulation> RectDetectorFitTest::createSimulation()
+{
+    std::unique_ptr<GISASSimulation> result(new GISASSimulation());
+
+    double detector_distance(500.0);
+    double width(20.0), height(18.0);
+    RectangularDetector detector(20, width, 18, height);
+//    RectangularDetector detector(500, width, 450, height);
+    detector.setPerpendicularToSampleX(detector_distance, width/2., 0.0);
+
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree, 0.0*Units::degree);
+    result->setDetector(detector);
+    result->setRegionOfInterest(6.0, 6.0, 14.0, 12.0);
+    result->addMask(Geometry::Rectangle(8.0, 8.0, 10.0, 10.0), true);
+
+    return result;
+}
+
+//! Creates cropped output data using histogram machinery
+std::unique_ptr<OutputData<double> >
+RectDetectorFitTest::createOutputData(const GISASSimulation *simulation)
+{
+    std::unique_ptr<GISASSimulation> simWithRoi(simulation->clone());
+    simWithRoi->resetRegionOfInterest();
+    simWithRoi->runSimulation();
+//    std::unique_ptr<Histogram2D> tempHist(simulation->getIntensityData());
+//    std::unique_ptr<Histogram2D> crop(tempHist->crop(2.0, 6.0, 16.0, 14.0));
+//    std::unique_ptr<OutputData<double> > result(crop->createOutputData());
+    std::unique_ptr<OutputData<double>> result(simWithRoi->getDetectorIntensity());
+    return result;
+}
diff --git a/Tests/Functional/Fit/RectDetectorFitTest.h b/Tests/Functional/Fit/RectDetectorFitTest.h
new file mode 100644
index 0000000..9ea4d8a
--- /dev/null
+++ b/Tests/Functional/Fit/RectDetectorFitTest.h
@@ -0,0 +1,37 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/RectDetectorFitTest.h
+//! @brief     Defines class RectDetectorFitTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef RECTDETECTORFITTEST_H
+#define RECTDETECTORFITTEST_H
+
+#include "IMinimizerTest.h"
+
+
+//! @class RectDetectorFitTest
+//! @ingroup standard_samples
+//! @brief Fit of simulation with rectangular detector. The detector is cropped, masks are applied.
+
+class RectDetectorFitTest : public IMinimizerTest
+{
+public:
+    RectDetectorFitTest();
+
+protected:
+    virtual std::unique_ptr<GISASSimulation> createSimulation();
+    virtual std::unique_ptr<OutputData<double> > createOutputData(const GISASSimulation *simulation);
+
+};
+
+#endif // RECTDETECTORFITTEST_H
diff --git a/Tests/Functional/Fit/StandaloneFitPlan.cpp b/Tests/Functional/Fit/StandaloneFitPlan.cpp
new file mode 100644
index 0000000..9ceb912
--- /dev/null
+++ b/Tests/Functional/Fit/StandaloneFitPlan.cpp
@@ -0,0 +1,75 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/StandaloneFitPlan.cpp
+//! @brief     Implements classes to define plans for testing standalone fit.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "StandaloneFitPlan.h"
+#include "ObjectiveFunctionPlan.h"
+#include <iostream>
+#include <boost/format.hpp>
+#include <cmath>
+
+
+StandaloneFitPlan::StandaloneFitPlan(const std::string &minimizerName,
+                                     const std::string &algorithmName,
+                                     ObjectiveFunctionPlan *plan)
+    : m_minimizerName(minimizerName)
+    , m_algorithmName(algorithmName)
+    , m_plan(plan){}
+
+StandaloneFitPlan::~StandaloneFitPlan()
+{
+
+}
+
+std::string StandaloneFitPlan::functionPlanName() const
+{
+    return m_plan->name();
+}
+
+objective_function_t StandaloneFitPlan::objectiveFunction() const
+{
+    return m_plan->objectiveFunction();
+}
+
+const std::vector<FitParameterPlan> &StandaloneFitPlan::parameterPlan() const
+{
+    return m_plan->parameterPlan();
+}
+
+//! Returns true if found values coincide with FitParameterPlan
+
+bool StandaloneFitPlan::planSucceeded(const std::vector<double> &foundParValues)
+{
+    bool success(true);
+
+    if(parameterPlan().size() != foundParValues.size())
+        throw std::runtime_error("StandaloneFitPlan::planSucceeded() -> Error. Sizes differ.");
+
+    for(size_t i=0; i<foundParValues.size(); ++i) {
+        double expected_value = parameterPlan()[i].m_expected_value;
+        double diff = std::abs(foundParValues[i] - expected_value)/expected_value;
+        if (diff > parameterPlan()[i].m_threshold)
+            success = false;
+
+        std::string name = "par"+std::to_string(i);
+        std::cout << boost::format("%|12t| %-10s : %-6.4f (diff %6.4g) %s\n") %
+            name % foundParValues[i] % diff %
+            (success ? "OK" : "FAILED");
+
+    }
+
+    return success;
+}
+
+
diff --git a/Tests/Functional/Fit/StandaloneFitPlan.h b/Tests/Functional/Fit/StandaloneFitPlan.h
new file mode 100644
index 0000000..86b1e64
--- /dev/null
+++ b/Tests/Functional/Fit/StandaloneFitPlan.h
@@ -0,0 +1,52 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/StandaloneFitPlan.h
+//! @brief     Declares classes to define plans for testing standalone fit.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STANDALONEFITPLAN_H
+#define STANDALONEFITPLAN_H
+
+#include "FitParameterPlan.h"
+#include "KernelTypes.h"
+#include <string>
+#include <memory>
+class ObjectiveFunctionPlan;
+
+//! @class StandaloneFitPlan
+//! @ingroup standard_samples
+//! @brief Represent FitKernel setting for testing arbitrary objective functions.
+
+class StandaloneFitPlan
+{
+public:
+    StandaloneFitPlan(const std::string &minimizerName, const std::string &algorithmName,
+                      ObjectiveFunctionPlan *plan);
+    ~StandaloneFitPlan();
+
+    std::string minimizerName() const { return m_minimizerName; }
+    std::string algorithmName() const { return m_algorithmName; }
+    std::string functionPlanName() const;
+
+    objective_function_t objectiveFunction() const;
+
+    const std::vector<FitParameterPlan>& parameterPlan() const;
+
+    bool planSucceeded(const std::vector<double> &foundParValues);
+
+private:
+    std::string m_minimizerName;
+    std::string m_algorithmName;
+    std::unique_ptr<ObjectiveFunctionPlan> m_plan;
+};
+
+#endif
diff --git a/Tests/Functional/Fit/StandaloneFitTest.cpp b/Tests/Functional/Fit/StandaloneFitTest.cpp
new file mode 100644
index 0000000..7f64e80
--- /dev/null
+++ b/Tests/Functional/Fit/StandaloneFitTest.cpp
@@ -0,0 +1,68 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/StandaloneFitTest.cpp
+//! @brief     Implements class StandaloneFitTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "StandaloneFitTest.h"
+#include "FitKernel.h"
+#include "AttLimits.h"
+#include "ObjectiveFunctionPlan.h"
+#include "FitParameterSet.h"
+#include <iostream>
+
+StandaloneFitTest::StandaloneFitTest()
+    : IFunctionalTest("StandaloneFit", "Collection of standalone tests for fitting library")
+{
+    addTest<Rosenbrock1>("Minuit2", "Migrad");
+    addTest<WoodFour>("Minuit2", "Migrad");
+    addTest<Rosenbrock1>("GSLMultiMin", "BFGS2");
+}
+
+bool StandaloneFitTest::runTest()
+{
+    bool success(true);
+    for(auto plan: m_plans) {
+        std::cout << plan->minimizerName()
+                  << " " << plan->algorithmName()
+                  << " " << plan->functionPlanName() << std::endl;
+
+        success &= runPlan(plan);
+    }
+
+    std::cout << "StandaloneFitTest::runTest() -> " << (success ? "OK" : "FAILED") << std::endl;
+
+    return success;
+}
+
+bool StandaloneFitTest::runPlan(std::shared_ptr<StandaloneFitPlan> plan)
+{
+    bool success(true);
+
+    std::unique_ptr<FitKernel> fitKernel(new FitKernel);
+    fitKernel->setMinimizer(plan->minimizerName(), plan->algorithmName());
+
+    int index(0);
+    for(FitParameterPlan p : plan->parameterPlan())
+        fitKernel->addFitParameter("par"+std::to_string(index++), p.m_start_value, p.m_limits, p.m_step);
+
+    fitKernel->setObjectiveFunction(plan->objectiveFunction());
+    fitKernel->minimize();
+    std::cout << fitKernel->reportResults() << std::endl;
+
+    std::vector<double> foundValues = fitKernel->fitParameters()->values();
+
+    if(!plan->planSucceeded(foundValues))
+        success = false;
+
+    return success;
+}
diff --git a/Tests/Functional/Fit/StandaloneFitTest.h b/Tests/Functional/Fit/StandaloneFitTest.h
new file mode 100644
index 0000000..797747c
--- /dev/null
+++ b/Tests/Functional/Fit/StandaloneFitTest.h
@@ -0,0 +1,50 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/StandaloneFitTest.h
+//! @brief     Declares class StandaloneFitTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STANDALONEFITTEST_H
+#define STANDALONEFITTEST_H
+
+#include "IMinimizerTest.h"
+#include "StandaloneFitPlan.h"
+
+//! @class StandaloneFitTest
+//! @ingroup standard_samples
+//! @brief Collection of standalone tests for fitting library.
+
+class StandaloneFitTest : public IFunctionalTest
+{
+public:
+    StandaloneFitTest();
+
+    bool runTest();
+
+    template<typename T>
+    void addTest(const std::string &minimizerName, const std::string &algorithmName);
+
+private:
+    bool runPlan(std::shared_ptr<StandaloneFitPlan> plan);
+
+    std::vector<std::shared_ptr<StandaloneFitPlan>> m_plans;
+};
+
+template<typename T>
+void StandaloneFitTest::addTest(const std::string &minimizerName, const std::string &algorithmName)
+{
+    m_plans.push_back(
+        std::shared_ptr<StandaloneFitPlan>(new StandaloneFitPlan(minimizerName, algorithmName, new T()))
+    );
+}
+
+#endif
diff --git a/Tests/Functional/Fit/StandardFitsFactory.cpp b/Tests/Functional/Fit/StandardFitsFactory.cpp
new file mode 100644
index 0000000..d505c3a
--- /dev/null
+++ b/Tests/Functional/Fit/StandardFitsFactory.cpp
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/StandardFitsFactory.cpp
+//! @brief     Implements class StandardFitsFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "StandardFitsFactory.h"
+#include "MinimizerTests.h"
+#include "RectDetectorFitTest.h"
+#include "AdjustMinimizerStrategyTest.h"
+#include "StandaloneFitTest.h"
+#include <boost/format.hpp>
+
+StandardFitsFactory::StandardFitsFactory()
+{
+    registerItem(
+        "Minuit2_Migrad",
+        create_new<Minuit2MigradTest>,
+        "Functional test of Minuit2/Migrad minimizer");
+
+    registerItem(
+        "Minuit2_Fumili",
+        create_new<Minuit2FumiliTest>,
+        "Functional test of Minuit2/Fumili minimizer");
+
+    registerItem(
+        "GSLLevenbergMarquardt",
+        create_new<GSLLevenbergMarquardtTest>,
+        "Functional test of GSL's LevenbergMarquardt minimizer");
+
+    registerItem(
+        "GSLMultiMinBFGS",
+        create_new<GSLMultiMinBFGSTest>,
+        "Functional test of GSL's MultiMin/BFGS minimizer");
+
+    registerItem(
+        "GSLMultiMinSteepestDescent",
+        create_new<GSLMultiMinSteepestDescentTest>,
+        "Functional test of GSL's MultiMin/SteepestDescent minimizer");
+
+    registerItem(
+        "GSLSimulatedAnnealing",
+        create_new<GSLSimulatedAnnealingTest>,
+        "Functional test of GSL's Simulated Annealing minimizer");
+
+    registerItem(
+        "GeneticMinimizer",
+        create_new<GeneticTest>,
+        "Functional test of TMVA's Genetic minimizer");
+
+    registerItem(
+        "RectDetectorFit",
+        create_new<RectDetectorFitTest>,
+        "Fit of rectangular detector, with crop and masks applied");
+
+    registerItem(
+        "AdjustMinimizerStrategy",
+        create_new<AdjustMinimizerStrategyTest>,
+        "Test of minimizer chain: genetic -> minuit2");
+
+    registerItem(
+        "StandaloneFit",
+        create_new<StandaloneFitTest>,
+        "Test of standalone fit of arbitrary functions");
+
+}
+
+IFunctionalTest* StandardFitsFactory::createTest(const std::string& test_name)
+{
+    IFunctionalTest* result = createItem(test_name);
+    result->setDescription(m_descriptions[test_name]);
+    return result;
+}
+
+bool StandardFitsFactory::isValidTest(const std::string& test_name)
+{
+    return m_callbacks.find(test_name) != m_callbacks.end();
+}
+
+void StandardFitsFactory::printCatalogue(std::ostream& ostr)
+{
+    for(DescriptionMap_t::iterator it=m_descriptions.begin(); it!=m_descriptions.end(); ++it) {
+        ostr << boost::format("%-35s | %-50s\n") % it->first % it->second;
+    }
+}
diff --git a/Tests/Functional/Fit/StandardFitsFactory.h b/Tests/Functional/Fit/StandardFitsFactory.h
new file mode 100644
index 0000000..aba6dde
--- /dev/null
+++ b/Tests/Functional/Fit/StandardFitsFactory.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/Fit/StandardFitsFactory.h
+//! @brief     Defines class StandardFitsFactory
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STANDARDFITSFACTORY_H
+#define STANDARDFITSFACTORY_H
+
+#include "IFactory.h"
+
+class IFunctionalTest;
+
+//! @class StandardFitsFactory
+//! @ingroup standard_samples
+//! @brief Factory to create predefined functional fit tests
+
+class StandardFitsFactory : public IFactory<std::string, IFunctionalTest>
+{
+public:
+    StandardFitsFactory();
+
+    IFunctionalTest *createTest(const std::string &test_name);
+
+    bool isValidTest(const std::string &test_name);
+
+    void printCatalogue(std::ostream &ostr);
+};
+
+#endif // STANDARDFITSFACTORY_H
diff --git a/Tests/Functional/GUI/CMakeLists.txt b/Tests/Functional/GUI/CMakeLists.txt
new file mode 100644
index 0000000..fa44e92
--- /dev/null
+++ b/Tests/Functional/GUI/CMakeLists.txt
@@ -0,0 +1,79 @@
+############################################################################
+# Tests/Functional/GUI/CMakeLists.txt
+############################################################################
+
+set(test_cases
+    ApproximationDA
+    ApproximationLMA
+    ApproximationSSCA
+    Basic2DParaCrystal
+    BeamDivergence
+    BoxCompositionRotateX
+    BoxCompositionRotateY
+    BoxCompositionRotateZ
+    BoxCompositionRotateZandY
+    BoxStackComposition
+    CenteredSquareLattice
+    CoreShellBoxRotateZandY
+    CoreShellParticle
+    CosineRipple
+    CylindersAndPrisms
+#    CylindersInSSCA # no yet implemented (linked parameter)
+    CylindersWithSizeDistribution
+    DetectorResolution
+    FormFactors
+    HexParaCrystal
+    LargeCylindersMonteCarlo
+    Lattice1D
+    MultiLayerWithRoughness
+    MultipleLayout
+    ParticleComposition
+    RadialParaCrystal
+    RectDetectorGeneric
+    RectDetectorPerpToDirectBeam
+    RectDetectorPerpToReflectedBeam
+    RectDetectorPerpToReflectedBeamDpos
+    RectDetectorPerpToSample
+    RectParaCrystal
+    RotatedPyramids
+    RotatedSquareLattice
+    SimulationWithMasks
+    SquareLattice
+    TransformBox
+    TriangularRipple
+    TwoTypesCylindersDistribution
+    SphericalDetWithRoi
+    RectDetWithRoi
+)
+
+
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+
+find_package(Qt5Widgets REQUIRED)
+
+# for some reason these flags doesn't propagated here by SetUpWindows.cmake
+if(MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc ")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHsc ")
+endif()
+
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${BornAgainGUI_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/../TestMachinery
+)
+
+add_executable(GUIStandardTest GUIStandardTest.cpp GUITest.cpp GUITest.h )
+target_link_libraries(GUIStandardTest BornAgainCore BornAgainGUI BornAgainTestMachinery)
+qt5_use_modules(GUIStandardTest Widgets Core Gui Designer PrintSupport Network)
+foreach(test_case ${test_cases})
+    add_test(GUIStandardTest/${test_case} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/GUIStandardTest ${test_case})
+endforeach()
diff --git a/Tests/Functional/GUI/GUIStandardTest.cpp b/Tests/Functional/GUI/GUIStandardTest.cpp
new file mode 100644
index 0000000..5b9cee9
--- /dev/null
+++ b/Tests/Functional/GUI/GUIStandardTest.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/GUI/GUIStandardTest.cpp
+//! @brief     Implements program GUIStandardTest to run gui functional tests
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "IStandardTest.h"
+#include "GUITest.h"
+
+//! Provides a GUITest through a callback mechanism explained in IStandardTest.h.
+class GUIStandardTest : public IStandardTest
+{
+public:
+    GUIStandardTest() : IStandardTest("GUIStandardTest") {}
+    std::unique_ptr<IFunctionalTest> getTest() const { return std::unique_ptr<IFunctionalTest>
+            (new GUITest(getName(), getTestDescription(), getSimulation(), getTestThreshold())); }
+};
+
+//! Runs GUITest on a standard simulation indicated by argv[1].
+int main(int argc, char** argv)
+{
+    return GUIStandardTest().execute(argc, argv) ? 0 : 1;
+}
diff --git a/Tests/Functional/GUI/GUITest.cpp b/Tests/Functional/GUI/GUITest.cpp
new file mode 100644
index 0000000..5459ddf
--- /dev/null
+++ b/Tests/Functional/GUI/GUITest.cpp
@@ -0,0 +1,80 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/GUI/GUITest.cpp
+//! @brief     Implements class GUITest
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUITest.h"
+#include "DocumentModel.h"
+#include "DomainSimulationBuilder.h"
+#include "GISASSimulation.h"
+#include "GUIObjectBuilder.h"
+#include "InstrumentModel.h"
+#include "IntensityDataFunctions.h"
+#include "MaterialModel.h"
+#include "MaterialSvc.h"
+#include "SampleModel.h"
+#include "Utils.h"
+
+GUITest::GUITest(const std::string &name, const std::string &description,
+                 GISASSimulation *reference_simulation, double threshold)
+    : IReferencedTest(name, description, threshold)
+    , m_reference_simulation(reference_simulation)
+    , m_domain_simulation(nullptr)
+{}
+
+GUITest::~GUITest()
+{
+    delete m_reference_simulation;
+    delete m_domain_simulation;
+}
+
+bool GUITest::runTest()
+{
+    if (!m_reference_simulation)
+        throw Exceptions::NullPointerException(
+            "GUITest::runTest() -> Error. Uninitialized simulation object.");
+
+    m_reference_simulation->runSimulation();
+
+    createDomainSimulation();
+    m_domain_simulation->runSimulation();
+
+    const std::unique_ptr<OutputData<double> > P_domain_data(
+                m_domain_simulation->getDetectorIntensity());
+    const std::unique_ptr<OutputData<double> > P_reference_data(
+        m_reference_simulation->getDetectorIntensity());
+    return compareIntensityMaps(*P_domain_data, *P_reference_data);
+}
+
+//! returns new simulation from
+void GUITest::createDomainSimulation()
+{
+    assert(m_reference_simulation->getSample());
+
+    // initializing necessary GUI
+    const std::unique_ptr<DocumentModel> documentModel(new DocumentModel());
+    const std::unique_ptr<SampleModel> sampleModel(new SampleModel());
+    const std::unique_ptr<InstrumentModel> instrumentModel(new InstrumentModel());
+    const std::unique_ptr<MaterialModel> materialModel(new MaterialModel());
+    const std::unique_ptr<MaterialSvc> materialSvc(new MaterialSvc(materialModel.get()));
+
+    // populating GUI models from domain
+    GUIObjectBuilder guiBuilder;
+    guiBuilder.populateSampleModel(sampleModel.get(), *m_reference_simulation);
+    guiBuilder.populateInstrumentModel(instrumentModel.get(), *m_reference_simulation);
+    guiBuilder.populateDocumentModel(documentModel.get(), *m_reference_simulation);
+
+    m_domain_simulation = DomainSimulationBuilder::getSimulation(sampleModel->multiLayerItem(),
+            instrumentModel->instrumentItem(), documentModel->getSimulationOptionsItem());
+}
diff --git a/Tests/Functional/GUI/GUITest.h b/Tests/Functional/GUI/GUITest.h
new file mode 100644
index 0000000..708d690
--- /dev/null
+++ b/Tests/Functional/GUI/GUITest.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/GUI/GUITest.h
+//! @brief     Defines class GUITest
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GUITEST_H
+#define GUITEST_H
+
+#include "IReferencedTest.h"
+#include "OutputData.h"
+
+class GISASSimulation;
+
+//! @class GUITest
+//! @ingroup standard_samples
+//! @brief A functional test of the BornAgain GUI.
+//!   Performs a given standard simulation directly, and through domain->GUI->domain,
+//!   and compares results.
+//!   Invoked by GUIStandardTest.
+
+class GUITest : public IReferencedTest
+{
+public:
+    GUITest(const std::string& name, const std::string& description,
+            GISASSimulation* reference_simulation, double threshold);
+    virtual ~GUITest();
+
+    bool runTest() final;
+
+private:
+    void createDomainSimulation();
+
+    GISASSimulation* m_reference_simulation;
+    GISASSimulation* m_domain_simulation;
+};
+
+#endif // GUITEST_H
diff --git a/Tests/Functional/GUI/GUITranslationTest/CMakeLists.txt b/Tests/Functional/GUI/GUITranslationTest/CMakeLists.txt
new file mode 100644
index 0000000..8da69f9
--- /dev/null
+++ b/Tests/Functional/GUI/GUITranslationTest/CMakeLists.txt
@@ -0,0 +1,29 @@
+set(test_name GUITranslationTest)
+
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+
+find_package(Qt5Widgets REQUIRED)
+
+# for some reason these flags doesn't propagated here by SetUpWindows.cmake
+if(MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc ")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHsc ")
+endif()
+
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${BornAgainGUI_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/../../TestMachinery
+)
+
+add_executable(${test_name} main.cpp GUITranslationTest.cpp GUITranslationTest.h)
+target_link_libraries(${test_name} BornAgainCore BornAgainGUI BornAgainTestMachinery)
+qt5_use_modules(${test_name} Widgets Core Gui Designer PrintSupport Network)
+
+add_test(${test_name} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test_name})
+
diff --git a/Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.cpp b/Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.cpp
new file mode 100644
index 0000000..3e98c71
--- /dev/null
+++ b/Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.cpp
@@ -0,0 +1,188 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.cpp
+//! @brief     Includes GUI translation functional test.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include "GUITranslationTest.h"
+#include "SimulationFactory.h"
+#include "SampleBuilderFactory.h"
+#include "GISASSimulation.h"
+#include "SampleModel.h"
+#include "InstrumentModel.h"
+#include "GUIObjectBuilder.h"
+#include "ApplicationModels.h"
+#include "JobModel.h"
+#include "DocumentModel.h"
+#include "JobItem.h"
+#include "ParameterTreeBuilder.h"
+#include "ParameterTreeItems.h"
+#include "ParameterPool.h"
+#include "GUIHelpers.h"
+#include "StringUtils.h"
+#include <QStack>
+#include <QDebug>
+
+
+GUITranslationTest::GUITranslationTest(const std::string &simName, const std::string &sampleName)
+    : m_models(new ApplicationModels(0))
+    , m_simulationName(simName)
+    , m_sampleName(sampleName)
+{
+    SimulationFactory simFactory;
+    m_simulation.reset(simFactory.createItem(m_simulationName));
+
+    SampleBuilderFactory sampleFactory;
+    m_simulation->setSample(*sampleFactory.createSample(m_sampleName));
+}
+
+GUITranslationTest::~GUITranslationTest()
+{
+
+}
+
+bool GUITranslationTest::runTest()
+{
+    processParameterTree();
+    bool success = checkExistingTranslations();
+
+    // Uncomment line below to check missed translation (i.e. when fit parameter exist in domain
+    // but doesn't exist in GUI (like thickness of top layer)
+    //success &= checkMissedTranslations();
+
+    if(!success) {
+        std::cout << "GUITranslationTest failed: " << m_simulationName
+                  << " " << m_sampleName << std::endl;
+        std::cout << "Available simulation parameters" << std::endl;
+        m_simulation->printParameters();
+    }
+
+    return success;
+}
+
+//! Runs through GUI models and constructs list of available domain fit parameters names.
+
+void GUITranslationTest::processParameterTree()
+{
+    m_models->instrumentModel()->clear();
+    // populating GUI models from domain
+    GUIObjectBuilder guiBuilder;
+    guiBuilder.populateSampleModel(m_models->sampleModel(), *m_simulation);
+    guiBuilder.populateInstrumentModel(m_models->instrumentModel(), *m_simulation);
+    guiBuilder.populateDocumentModel(m_models->documentModel(), *m_simulation);
+
+    JobItem *jobItem = m_models->jobModel()->addJob(
+                m_models->sampleModel()->multiLayerItem(),
+                m_models->instrumentModel()->instrumentItem(),
+                0,
+                m_models->documentModel()->getSimulationOptionsItem());
+
+    ParameterTreeBuilder::populateDomainLinks(jobItem, JobItem::T_PARAMETER_TREE);
+
+    SessionItem *current = jobItem->getItem(JobItem::T_PARAMETER_TREE);
+
+    QStack<SessionItem *> stack;
+    stack.push(current);
+    while (!stack.empty()) {
+        current = stack.pop();
+        if (current->modelType() == Constants::ParameterLabelType
+                || current->modelType() == Constants::ParameterContainerType) {
+            for (SessionItem *child : current->getItems())
+                stack.push(child);
+
+        } else {
+            if (ParameterItem *parItem = dynamic_cast<ParameterItem *>(current)) {
+                if(parItem->isFittable()) {
+                    std::string guiName =
+                            parItem->getItemValue(ParameterItem::P_LINK).toString().toStdString();
+                    std::string domainName = std::string("*") +
+                            parItem->getItemValue(ParameterItem::P_DOMAIN).toString().toStdString();
+                    m_translations.push_back({guiName, domainName});
+                }
+            }
+        }
+    }
+
+}
+
+//! Validates GUI translations against simulation parameters. Tries to retrieve fit parameter
+//! from domain parameter pool using translated name.
+
+bool GUITranslationTest::checkExistingTranslations()
+{
+    if(m_translations.empty())
+        throw GUIHelpers::Error("GUITranslationTest::validateParameterTree() -> Error. "
+                                "Empty list of translations.");
+
+    std::unique_ptr<ParameterPool> pool(m_simulation->createParameterTree());
+    std::vector<name_pair> wrong_translations;
+    for(auto pair : m_translations) {
+        try {
+            pool->getMatchedParameters(pair.translatedName);
+        } catch (const std::runtime_error &/*ex*/) {
+            wrong_translations.push_back(pair);
+        }
+    }
+
+    if(wrong_translations.size() > 0) {
+        std::cout << std::string(80, '-') << std::endl;
+        std::cout << "Translation doesn't match domain parameters:" << std::endl;
+        std::cout << std::string(80, '-') << std::endl;
+        for(auto pair : wrong_translations) {
+            std::cout << "gui         : " << pair.guiName << std::endl;
+            std::cout << "translation : " << pair.translatedName << std::endl;
+            std::cout << std::string(8, '-') << std::endl;
+        }
+    }
+
+    bool isSuccess = (wrong_translations.empty() ? true : false);
+    return isSuccess;
+}
+
+//! Checks if all simulation parameters have translation.
+
+bool GUITranslationTest::checkMissedTranslations()
+{
+    if(m_translations.empty())
+        throw GUIHelpers::Error("GUITranslationTest::validateParameterTree() -> Error. "
+                                "Empty list of translations.");
+
+    std::unique_ptr<ParameterPool> pool(m_simulation->createParameterTree());
+    std::vector<std::string> domainNames = pool->getParameterNames();
+    std::vector<std::string> missedNames;
+    for(auto name : domainNames) {
+        std::string domainName = "*" + Utils::String::removeSubstring(name, "/GISASSimulation");
+        bool translationFound(false);
+        for(auto pair : m_translations) {
+            if(pair.translatedName == domainName) {
+                translationFound = true;
+                break;
+            }
+        }
+        if(!translationFound) {
+            missedNames.push_back(name);
+        }
+    }
+
+    if(missedNames.size() > 1) {
+        std::cout << std::string(80, '-') << std::endl;
+        std::cout << "Translation doesn't exist:" << std::endl;
+        std::cout << std::string(80, '-') << std::endl;
+        for(auto name : missedNames) {
+            std::cout << "domain : " << name << std::endl;
+        }
+    }
+
+    bool isSuccess = (missedNames.empty() ? true : false);
+    return isSuccess;
+}
diff --git a/Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.h b/Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.h
new file mode 100644
index 0000000..b858255
--- /dev/null
+++ b/Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/GUI/GUITranslationTest/GUITranslationTest.h
+//! @brief     Defines GUI translation functional test.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#ifndef GUITRANSLATIONTEST_H
+#define GUITRANSLATIONTEST_H
+
+#include "IFunctionalTest.h"
+#include <memory>
+#include <vector>
+#include <string>
+#include <map>
+
+class GISASSimulation;
+class ApplicationModels;
+
+//! Functional test to validate translation mechanism of GUI names into domain fit parameter names.
+//! * Constructs domain simulation using given sample builder and simulation name.
+//! * Converts domain simulation into GUI model presentation.
+//! * Constructs list of GUI fittable parameters, and then translate their names into domain names.
+//! * Complains, if translated names doesn't match registered parameters of domain simulation.
+//! * Complains, if simulation contains parameters which do not have translations.
+
+class GUITranslationTest : public IFunctionalTest
+{
+public:
+    GUITranslationTest(const std::string &simName, const std::string &sampleName);
+
+    ~GUITranslationTest();
+    bool runTest();
+
+private:
+    struct name_pair {
+        std::string guiName;
+        std::string translatedName;
+    };
+
+    void processParameterTree();
+    bool checkExistingTranslations();
+    bool checkMissedTranslations();
+    std::unique_ptr<GISASSimulation> m_simulation;
+    std::unique_ptr<ApplicationModels> m_models;
+    //!< Vector of GUI parameter names and their translations to domain parameter names.
+    std::vector<name_pair> m_translations;
+    std::string m_simulationName, m_sampleName;
+};
+
+#endif
diff --git a/Tests/Functional/GUI/GUITranslationTest/main.cpp b/Tests/Functional/GUI/GUITranslationTest/main.cpp
new file mode 100644
index 0000000..f89d229
--- /dev/null
+++ b/Tests/Functional/GUI/GUITranslationTest/main.cpp
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/GUI/GUITranslationTest/main.cpp
+//! @brief     Implements main to run GUI translation tests.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   Céline Durniak, Marina Ganeva, David Li, Gennady Pospelov
+//! @authors   Walter Van Herck, Joachim Wuttke
+//
+// ************************************************************************** //
+
+#include <iostream>
+#include "GUITranslationTest.h"
+
+bool run_tests() {
+
+    std::vector<std::pair<std::string, std::string>> conditions = {
+        {"BasicGISAS", "CylindersAndPrismsBuilder"},
+        {"BasicGISAS", "RadialParaCrystalBuilder"},
+        {"BasicGISAS", "Lattice1DBuilder"},
+        //{"BasicGISAS", "Basic2DParaCrystalBuilder"},
+        {"BasicGISAS", "Basic2DLatticeBuilder"},
+        {"BasicGISAS", "SquareLatticeBuilder"},
+    };
+
+    bool success(true);
+    for(auto pair: conditions)
+        success &= GUITranslationTest(pair.first, pair.second).runTest();
+
+    if(!success)
+        std::cout << "Failure!" << std::endl;
+
+    return success;
+}
+
+int main(int , char**)
+{
+    return run_tests() == true ? 0 : 1;
+}
diff --git a/Tests/Functional/PyCore/export/CMakeLists.txt b/Tests/Functional/PyCore/export/CMakeLists.txt
new file mode 100644
index 0000000..0c3ff50
--- /dev/null
+++ b/Tests/Functional/PyCore/export/CMakeLists.txt
@@ -0,0 +1,74 @@
+############################################################################
+# Tests/Functional/PyCore/suite/CMakeLists.txt
+############################################################################
+
+set(PYEXPORT_TMP_DIR ${BUILD_REF_DIR}/PyExport)
+file(MAKE_DIRECTORY ${PYEXPORT_TMP_DIR})
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPYEXPORT_TMP_DIR=\\\"${PYEXPORT_TMP_DIR}\\\"")
+
+set(test_cases
+    ApproximationDA
+    ApproximationLMA
+    ApproximationSSCA
+    Basic2DParaCrystal
+    BeamDivergence
+    BoxCompositionRotateX
+    BoxCompositionRotateY
+    BoxCompositionRotateZ
+    BoxCompositionRotateZandY
+    BoxStackComposition
+    CenteredSquareLattice
+    CoreShellBoxRotateZandY
+    CoreShellParticle
+    CosineRipple
+    CylindersAndPrisms
+    CylindersInSSCA
+    CylindersWithSizeDistribution
+    DetectorResolution
+    FormFactors
+    HexParaCrystal
+    LargeCylindersMonteCarlo
+    Lattice1D
+    MultiLayerWithRoughness
+    MultipleLayout
+    ParticleComposition
+    RadialParaCrystal
+    RectDetectorGeneric
+    RectDetectorPerpToDirectBeam
+    RectDetectorPerpToReflectedBeam
+    RectDetectorPerpToReflectedBeamDpos
+    RectDetectorPerpToSample
+    RectParaCrystal
+    RotatedPyramids
+    RotatedSquareLattice
+    SimulationWithMasks
+    SquareLattice
+    TransformBox
+    TriangularRipple
+    TwoTypesCylindersDistribution
+    SphericalDetWithRoi
+    RectDetWithRoi
+)
+
+# for some reason these flags doesn't propagated here by SetUpWindows.cmake
+if(MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc ")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHsc ")
+endif()
+
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR}
+    ${CMAKE_SOURCE_DIR}/Core/Simulation
+    ${CMAKE_CURRENT_SOURCE_DIR}/../../TestMachinery
+)
+
+add_executable(PyExportStandardTest PyExportStandardTest.cpp PyExportTest.h PyExportTest.cpp)
+target_link_libraries(PyExportStandardTest BornAgainCore BornAgainTestMachinery)
+foreach(test_case ${test_cases})
+    add_test(PyExportStandardTest/${test_case}
+        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/PyExportStandardTest ${test_case})
+endforeach()
diff --git a/Tests/Functional/PyCore/export/PyExportStandardTest.cpp b/Tests/Functional/PyCore/export/PyExportStandardTest.cpp
new file mode 100644
index 0000000..8e25a6e
--- /dev/null
+++ b/Tests/Functional/PyCore/export/PyExportStandardTest.cpp
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/PyCore/export/PyExportStandardTest.cpp
+//! @brief     Implements program PyExportStandardTest, to run functional tests
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IStandardTest.h"
+#include "PyExportTest.h"
+
+//! Provides a PyExportTest through a callback mechanism explained in IStandardTest.h.
+class PyExportStandardTest : public IStandardTest
+{
+public:
+    PyExportStandardTest() : IStandardTest("PyExport") {}
+    std::unique_ptr<IFunctionalTest> getTest() const { return std::unique_ptr<IFunctionalTest>
+            (new PyExportTest(
+                getName(), getTestDescription(), getSimulation(), getTestThreshold())); }
+};
+
+//! Runs PyExportTest on a standard simulation indicated by argv[1].
+int main(int argc, char** argv)
+{
+    return PyExportStandardTest().execute(argc, argv) ? 0 : 1;
+}
diff --git a/Tests/Functional/PyCore/export/PyExportTest.cpp b/Tests/Functional/PyCore/export/PyExportTest.cpp
new file mode 100644
index 0000000..6f9768f
--- /dev/null
+++ b/Tests/Functional/PyCore/export/PyExportTest.cpp
@@ -0,0 +1,74 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/PyCore/export/PyExportTest.cpp
+//! @brief     Implements class PyExportTest
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "PyExportTest.h"
+#include "FileSystem.h"
+#include "GISASSimulation.h"
+#include "IntensityDataFunctions.h"
+#include "IntensityDataIOFactory.h"
+#include "PythonFormatting.h"
+#include "SimulationFactory.h"
+#include "Utils.h"
+#include <cassert>
+#include <cstdio>
+#include <fstream>
+
+PyExportTest::PyExportTest(
+    const std::string& name, const std::string& description,
+    GISASSimulation* reference_simulation, double threshold)
+    : IReferencedTest(name, description, threshold)
+    , m_reference_simulation(reference_simulation)
+    , m_domain_simulation(nullptr)
+{
+}
+
+PyExportTest::~PyExportTest()
+{
+    delete m_reference_simulation;
+    delete m_domain_simulation;
+}
+
+//! Runs simulation via a Python script and directly, and returns true if the results agree.
+bool PyExportTest::runTest()
+{
+    // Set output data filename, and remove old output files
+    std::string output_name = FileSystem::GetJoinPath(PYEXPORT_TMP_DIR, getName());
+    std::string output_path = output_name + ".ref.int";
+    std::remove( output_path.c_str() );
+    std::cout << "Removed old output " << output_path << "n";
+
+    // Generate Python script
+    std::string pyscript_filename = FileSystem::GetJoinPath(PYEXPORT_TMP_DIR, getName() + ".py");
+    std::ofstream pythonFile(pyscript_filename);
+    pythonFile << PythonFormatting::simulationToPython(m_reference_simulation);
+    pythonFile.close();
+
+    // Run Python script
+    assert(std::string(BUILD_LIB_DIR)!="");
+    if (!runPython(pyscript_filename + " " + output_name))
+        return false;
+
+    // Run direct simulation
+    std::cout <<
+        "Now going to directly run the simulation, and to compare with result from Py script\n";
+    m_reference_simulation->runSimulation();
+    const std::unique_ptr<OutputData<double> > P_reference_data(
+        m_reference_simulation->getDetectorIntensity());
+
+    // Compare results
+    const std::unique_ptr<OutputData<double> > P_domain_data(
+        IntensityDataIOFactory::readOutputData(output_path));
+    return compareIntensityMaps(*P_domain_data, *P_reference_data);
+}
diff --git a/Tests/Functional/PyCore/export/PyExportTest.h b/Tests/Functional/PyCore/export/PyExportTest.h
new file mode 100644
index 0000000..e5b9ba1
--- /dev/null
+++ b/Tests/Functional/PyCore/export/PyExportTest.h
@@ -0,0 +1,44 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/PyCore/export/PyExportTest.h
+//! @brief     Defines class PyExportTest
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PYEXPORTTEST_H
+#define PYEXPORTTEST_H
+
+#include "IReferencedTest.h"
+#include "OutputData.h"
+
+//! @class PyExportTest
+//! @ingroup standard_samples
+//! @brief A functional test of PyCore (the Python wrapper of BornAgain/Core).
+//!   Performs a given standard simulation, both directly and from a Python dump.
+//!   Invoked from PyExportStandardTest.
+
+class PyExportTest : public IReferencedTest
+{
+public:
+    PyExportTest(const std::string& name, const std::string& description,
+                 class GISASSimulation* reference_simulation, double threshold);
+    virtual ~PyExportTest();
+
+    bool runTest() final;
+
+private:
+    std::string getPySuiteFileNameAndPath() const;
+
+    class GISASSimulation* m_reference_simulation;
+    class GISASSimulation* m_domain_simulation;
+};
+
+#endif // PYEXPORTTEST_H
diff --git a/Tests/Functional/PyCore/legacy/CMakeLists.txt b/Tests/Functional/PyCore/legacy/CMakeLists.txt
new file mode 100644
index 0000000..3014685
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/CMakeLists.txt
@@ -0,0 +1,20 @@
+############################################################################
+# Tests/Functional/PyCore/scripts/CMakeLists.txt
+############################################################################
+
+file(GLOB sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.py")
+if(NOT BORNAGAIN_TIFF_SUPPORT)
+    list(REMOVE_ITEM sources "intensitydata_io_tiff.py")
+endif()
+
+foreach(_src ${sources})
+    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${_src}
+        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_src} @ONLY)
+endforeach()
+
+set(tests ${sources})
+list(REMOVE_ITEM tests utils.py)
+
+foreach(_test ${tests})
+    add_test(${_test} ${PYTHON_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_test})
+endforeach()
diff --git a/Tests/Functional/PyCore/legacy/README b/Tests/Functional/PyCore/legacy/README
new file mode 100644
index 0000000..47ace38
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/README
@@ -0,0 +1,7 @@
+Collection of functional tests (Python)
+
+Collection contains functional tests for BornAgainCore library.
+Each test defines simple geometry, runs simulation and then compare
+the results of the simulation with reference data.
+
+Tests are executed automatically under the standard build step 'ctest'.
\ No newline at end of file
diff --git a/Tests/Functional/PyCore/legacy/histogram2d.py b/Tests/Functional/PyCore/legacy/histogram2d.py
new file mode 100644
index 0000000..4f1d18f
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/histogram2d.py
@@ -0,0 +1,76 @@
+import sys
+import os
+import numpy
+import unittest
+
+sys.path.append("@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
+import bornagain as ba
+
+class Histogram2DTest(unittest.TestCase):
+
+    def test_constructFromNumpy(self):
+        """
+        Testing construction of 2D histogram from numpy array
+        """
+        arr = numpy.array([[ 1,  2,  3,  4,  5],
+                           [ 6,  7,  8,  9, 10],
+                           [11, 12, 13, 14, 15]])
+        hist = ba.Histogram2D(arr)
+
+        self.assertEqual(hist.getNbinsX(), 5)
+        self.assertEqual(hist.getXmin(), 0.0)
+        self.assertEqual(hist.getXmax(), 5.0)
+
+        self.assertEqual(hist.getNbinsY(), 3)
+        self.assertEqual(hist.getYmin(), 0.0)
+        self.assertEqual(hist.getYmax(), 3.0)
+
+        self.assertEqual(hist.getBinContent(0, 0), 11.0)
+        self.assertEqual(hist.getBinContent(0, 1), 6.0)
+        self.assertEqual(hist.getBinContent(4, 2), 5.0)
+
+        arr_from_hist = hist.getArray()
+
+        for (x, y), element in numpy.ndenumerate(arr):
+            self.assertEqual(element, arr_from_hist[x][y])
+
+    def test_constructFromNumpy(self):
+        """
+        Adding to the histogram content from numpy array
+        """
+        arr = numpy.array([[ 1,  2,  3,  4,  5],
+                           [ 6,  7,  8,  9, 10],
+                           [11, 12, 13, 14, 15]])
+        hist = ba.Histogram2D(arr)
+        # adding same content once again
+        hist.addContent(arr)
+        arr_from_hist = hist.getArray()
+
+        for (x, y), element in numpy.ndenumerate(arr):
+            self.assertEqual(element*2.0, arr_from_hist[x][y])
+
+
+    def create_histogram(self, arr):
+        """
+        Returns newly created object
+        """
+        return ba.IHistogram.createFrom(arr)
+
+
+    def test_createFrom(self):
+        """
+        Testing newly create object
+        """
+        arr = numpy.array([[ 1,  2,  3,  4,  5],
+                           [ 6,  7,  8,  9, 10],
+                           [11, 12, 13, 14, 15]])
+        hist = self.create_histogram(arr)
+        arr_from_hist = hist.getArray()
+
+        for (x, y), element in numpy.ndenumerate(arr):
+            self.assertEqual(element, arr_from_hist[x][y])
+
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/intensitydata.py b/Tests/Functional/PyCore/legacy/intensitydata.py
new file mode 100644
index 0000000..7fec257
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/intensitydata.py
@@ -0,0 +1,66 @@
+# Functional test: tests of IntensityData object
+
+import sys
+import os
+import unittest
+import numpy
+
+sys.path.append("@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
+from libBornAgainCore import *
+
+
+class IntensityDataTest(unittest.TestCase):
+    """
+    Test creation of IntensityData object and different ways of accessing its data
+    """
+    def test_empty_data(self):
+        data = IntensityData()
+        self.assertEqual(1, data.getAllocatedSize())
+        self.assertEqual(0, data.getRank())
+        self.assertEqual(0, data.totalSum())
+
+    def test_create_1d_object(self):
+        axis0 = FixedBinAxis("angle", 20, 0.0, 20.)
+        self.assertEqual(20, axis0.size())
+        self.assertEqual(0.0, axis0.getMin())
+        self.assertEqual(20.0, axis0.getMax())
+        data = IntensityData()
+        data.addAxis(axis0)
+        self.assertEqual(20, data.getAllocatedSize())
+        self.assertEqual(1, data.getRank())
+        self.assertEqual(0, data.totalSum())
+
+    def test_create_2d_object(self):
+        data = IntensityData()
+        data.addAxis("axis0", 10, 0.0, 10.0)
+        data.addAxis("axis1", 20, 0.0, 20.0)
+        self.assertEqual(200, data.getAllocatedSize())
+        self.assertEqual(2, data.getRank())
+        self.assertEqual(0, data.totalSum())
+        data.setAllTo(1.0)
+        self.assertEqual(200.0, data.totalSum())
+        for i in range(0, data.getAllocatedSize()):
+            data[i] = data[i]*-1.0
+        self.assertEqual(-200.0, data.totalSum())
+
+    def test_access_simulation_intensity(self):
+        simulation = GISASSimulation()
+        simulation.setDetectorParameters(10, -1.0, 1.0, 100, 0.0, 2.0)
+        data = simulation.getIntensityData()
+        self.assertEqual(1000, data.getTotalNumberOfBins())
+        self.assertEqual(2, data.getRank())
+        self.assertEqual(0, data.integral())
+        self.assertEqual(10, data.getXaxis().size())
+
+
+    def test_numpy_array(self):
+        data = IntensityData()
+        data.addAxis("axis0", 10, 0.0, 10.0)
+        data.addAxis("axis1", 20, 0.0, 20.0)
+        data.setAllTo(1)
+        self.assertEqual((20, 10), data.getArray().shape)
+        self.assertEqual((data.totalSum()), numpy.sum(data.getArray()))
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/intensitydata_io.py b/Tests/Functional/PyCore/legacy/intensitydata_io.py
new file mode 100644
index 0000000..fc905a5
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/intensitydata_io.py
@@ -0,0 +1,149 @@
+# Functional test: tests of IO operations with the IntensityData object
+
+import sys
+import os
+import unittest
+import numpy
+import math
+import time
+
+sys.path.append("@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
+from libBornAgainCore import *
+
+
+def fill_data(data):
+    """
+    Fills intensity data with some numbers
+    """
+    for i in range(0, data.getAllocatedSize()):
+        data[i] = i
+
+
+def is_the_same_data(data1, data2):
+    """
+    Checks if two data are identical
+    """
+    if data1.getAllocatedSize() != data2.getAllocatedSize():
+        return False
+    if data1.getRank() != data2.getRank():
+        return False
+    for i in range(0, data1.getRank()):
+        if data1.getAxis(i) != data2.getAxis(i):
+            return False
+    for i in range(0, data1.getAllocatedSize()):
+        if data1[i] != data2[i]:
+            return False
+
+    return True
+
+
+def get_boundaries_flat_in_sin(nbins, start, end):
+    """
+    Returns flat_in_sin binning of angle axis
+    """
+    result = []
+    start_sin = math.sin( deg2rad(start))
+    end_sin = math.sin( deg2rad(end))
+    step = (end_sin - start_sin)/nbins
+    for i in range(0, nbins+1):
+        result.append( rad2deg(math.asin(start_sin + step*i)))
+    return result
+
+
+
+
+class OutputDataIOTest(unittest.TestCase):
+    """
+    Test serialization of IntensityData
+    """
+    def test_01_FixedBinAxis_1D(self):
+        data = IntensityData()
+        data.addAxis(FixedBinAxis("axis0", 10, -1.00000001, 1.0))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_02_FixedBinAxis_2D(self):
+        data = IntensityData()
+        data.addAxis(FixedBinAxis("axis0", 9, -1.00000001, 1.0))
+        data.addAxis(FixedBinAxis("axis1", 3, -4.0, 5.0))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_03_FixedBinAxis_3D(self):
+        data = IntensityData()
+        data.addAxis(FixedBinAxis("axis0", 9, -1.00000001, 1.0))
+        data.addAxis(FixedBinAxis("axis1", 1, -4.0, 5.0))
+        data.addAxis(FixedBinAxis("axis2", 3, 0.0, 1.0))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_04_VariableBinAxis_1D(self):
+        data = IntensityData()
+        data.addAxis(VariableBinAxis("axis0", 10, get_boundaries_flat_in_sin(10, -5.0, 5.0)))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_05_VariableBinAxis_2D(self):
+        data = IntensityData()
+        data.addAxis(VariableBinAxis("axis0", 10, get_boundaries_flat_in_sin(10, -5.0, 5.0)))
+        data.addAxis(VariableBinAxis("axis1", 3, get_boundaries_flat_in_sin(3, 0.0, 2.0)))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_06_VariableAndFixedMix(self):
+        data = IntensityData()
+        data.addAxis(FixedBinAxis("axis0", 10, -5.0, 5.0))
+        data.addAxis(VariableBinAxis("axis1", 3, get_boundaries_flat_in_sin(3, 0.0, 2.0)))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_07_ConstKBinAxis_2D(self):
+        data = IntensityData()
+        data.addAxis(ConstKBinAxis("axis0", 9, -1.00000001*degree, 1.0*degree))
+        data.addAxis(ConstKBinAxis("axis1", 3, -4.0*degree, 5.0*degree))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_08_CustomBinAxis_2D(self):
+        data = IntensityData()
+        data.addAxis(CustomBinAxis("axis0", 9, -1.00000001*degree, 1.0*degree))
+        data.addAxis(CustomBinAxis("axis1", 3, -4.0*degree, 5.0*degree))
+        fill_data(data)
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+    def test_SaveToINT(self):
+        data = IntensityData()
+        data.addAxis(FixedBinAxis("x", 10, 0.0, 10.0))
+        data.addAxis(FixedBinAxis("y", 5, 0.0, 5.0))
+        fill_data(data)
+
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int.gz")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int.gz")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+        IntensityDataIOFactory.writeOutputData(data, "tmp.int.bz2")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.int.bz2")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/intensitydata_io_tiff.py b/Tests/Functional/PyCore/legacy/intensitydata_io_tiff.py
new file mode 100644
index 0000000..3230b49
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/intensitydata_io_tiff.py
@@ -0,0 +1,64 @@
+# Functional test: tests of IO operations with the IntensityData object
+
+import sys
+import os
+import unittest
+import numpy
+import math
+import time
+
+sys.path.append("@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
+from libBornAgainCore import *
+
+
+def fill_data(data):
+    """
+    Fills intensity data with some numbers
+    """
+    for i in range(0, data.getAllocatedSize()):
+        data[i] = i
+
+
+def is_the_same_data(data1, data2):
+    """
+    Checks if two data are identical
+    """
+    if data1.getAllocatedSize() != data2.getAllocatedSize():
+        return False
+    if data1.getRank() != data2.getRank():
+        return False
+    for i in range(0, data1.getRank()):
+        if data1.getAxis(i) != data2.getAxis(i):
+            return False
+    for i in range(0, data1.getAllocatedSize()):
+        if data1[i] != data2[i]:
+            return False
+
+    return True
+
+
+class OutputDataIOTiffTest(unittest.TestCase):
+    """
+    Test serialization of IntensityData into TIFF format
+    """
+    def test_SaveToTiff(self):
+        data = IntensityData()
+        data.addAxis(FixedBinAxis("x", 10, 0.0, 10.0))
+        data.addAxis(FixedBinAxis("y", 5, 0.0, 5.0))
+        fill_data(data)
+
+        IntensityDataIOFactory.writeOutputData(data, "tmp.tif")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.tif")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+        IntensityDataIOFactory.writeOutputData(data, "tmp.tif.gz")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.tif.gz")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+        IntensityDataIOFactory.writeOutputData(data, "tmp.tif.bz2")
+        newdata = IntensityDataIOFactory.readOutputData("tmp.tif.bz2")
+        self.assertTrue(is_the_same_data(data, newdata))
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/mesocrystal1.py b/Tests/Functional/PyCore/legacy/mesocrystal1.py
new file mode 100644
index 0000000..68e957d
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/mesocrystal1.py
@@ -0,0 +1,179 @@
+# Functional test: functional test: mesocrystal simulation
+#
+from __future__ import print_function
+import sys
+import os
+import numpy
+import time
+import ctypes
+import math
+from utils import get_reference_data
+
+from libBornAgainCore import *
+
+
+# ----------------------------------------------------------------------------
+# Sample builder to build mixture of cylinders and prisms on top of substrate
+# 5 parameters
+2# ----------------------------------------------------------------------------
+class MySampleBuilder(IMultiLayerBuilder):
+    def __init__(self):
+        IMultiLayerBuilder.__init__(self)
+        self.sample = None
+        # parameters describing the sample
+        self.lattice_length_a = ctypes.c_double(6.2091e+00*nanometer)
+        self.lattice_length_c = ctypes.c_double(6.5677e+00*nanometer)
+        self.nanoparticle_radius = ctypes.c_double(4.6976e+00*nanometer)
+        self.sigma_nanoparticle_radius = ctypes.c_double(3.6720e-01*nanometer)
+        self.meso_height = ctypes.c_double(1.1221e+02*nanometer)
+        self.meso_radius = ctypes.c_double(9.4567e+02*nanometer)
+        self.sigma_meso_height = ctypes.c_double(1.3310e+00*nanometer)
+        self.sigma_meso_radius = ctypes.c_double(1.3863e+00*nanometer)
+        self.sigma_lattice_length_a = ctypes.c_double(1.1601e+00*nanometer)
+        self.surface_filling_ratio = ctypes.c_double(1.7286e-01)
+        self.roughness = ctypes.c_double(2.8746e+01*nanometer)
+        # register parameters
+        self.registerParameter("lattice_length_a", ctypes.addressof(self.lattice_length_a)).setUnit("nm").setNonnegative()
+        self.registerParameter("lattice_length_c", ctypes.addressof(self.lattice_length_c)).setUnit("nm").setNonnegative()
+        self.registerParameter("nanoparticle_radius", ctypes.addressof(self.nanoparticle_radius)).setUnit("nm").setNonnegative()
+        self.registerParameter("sigma_nanoparticle_radius", ctypes.addressof(self.sigma_nanoparticle_radius)).setUnit("nm").setNonnegative()
+        self.registerParameter("meso_height", ctypes.addressof(self.meso_height)).setUnit("nm").setNonnegative()
+        self.registerParameter("meso_radius",  ctypes.addressof(self.meso_radius)).setUnit("nm").setNonnegative()
+        self.registerParameter("sigma_meso_height", ctypes.addressof(self.sigma_meso_height)).setUnit("nm").setNonnegative()
+        self.registerParameter("sigma_meso_radius", ctypes.addressof(self.sigma_meso_radius)).setUnit("nm").setNonnegative()
+        self.registerParameter("sigma_lattice_length_a", ctypes.addressof(self.sigma_lattice_length_a)).setUnit("nm").setNonnegative()
+        self.registerParameter("surface_filling_ratio", ctypes.addressof(self.surface_filling_ratio) ).setNonnegative()
+        self.registerParameter("roughness", ctypes.addressof(self.roughness)).setUnit("nm").setNonnegative()
+
+    # -------------------------------------------------------------------------
+    # constructs the sample for current values of parameters
+    # -------------------------------------------------------------------------
+    def buildSample(self):
+        surface_density = self.surface_filling_ratio.value/numpy.pi/self.meso_radius.value/self.meso_radius.value
+        n_particle = complex(1.0-2.84e-5, 4.7e-7)
+        avg_n_squared_meso = complex(0.7886*n_particle*n_particle + 0.2114)
+        n_avg = complex(numpy.sqrt(self.surface_filling_ratio.value*avg_n_squared_meso + 1.0 - self.surface_filling_ratio.value))
+        n_particle_adapted = complex(numpy.sqrt(n_avg*n_avg + n_particle*n_particle - 1.0))
+        ff_cyl = FormFactorCylinder(self.meso_radius.value, self.meso_height.value)
+        ff_meso = FormFactorDecoratorDebyeWaller(ff_cyl, self.sigma_meso_height.value*self.sigma_meso_height.value/2.0, self.sigma_meso_radius.value*self.sigma_meso_radius.value/2.0)
+
+        # Create multilayer
+        p_multi_layer = MultiLayer()
+        n_air = complex(1.0, 0.0)
+        n_substrate = complex(1.0-7.57e-6, 1.73e-7)
+
+        p_air_material = HomogeneousMaterial("Air", n_air)
+        p_average_layer_material = HomogeneousMaterial("Averagelayer", n_avg)
+        p_substrate_material = HomogeneousMaterial("Substrate", n_substrate)
+        air_layer = Layer(p_air_material)
+        avg_layer = Layer(p_average_layer_material, self.meso_height.value)
+        substrate_layer = Layer(p_substrate_material)
+        p_interference_funtion = InterferenceFunctionNone()
+        particle_layout = ParticleLayout()
+
+        n_max_phi_rotation_steps = 2
+        n_alpha_rotation_steps = 1
+        alpha_step = 5.0*degree/n_alpha_rotation_steps
+        alpha_start = - (n_alpha_rotation_steps/2.0)*alpha_step
+
+        phi_step = 2*numpy.pi/3.0/n_max_phi_rotation_steps
+        phi_start = 0.0
+        for i in range(0, n_max_phi_rotation_steps):
+            for j in range(0, n_alpha_rotation_steps):
+
+                total_transform = RotationZ(phi_start + i*phi_step)
+                meso = self.createMesoCrystal(self.lattice_length_a.value, self.lattice_length_c.value, n_particle_adapted, ff_meso)
+                meso.setPosition(0.0, 0.0, -self.meso_height.value)
+                particle_layout.addParticle(meso, 1.0, kvector_t(0,0,0), total_transform)
+
+        particle_layout.setTotalParticleSurfaceDensity(surface_density)
+        particle_layout.addInterferenceFunction(p_interference_funtion)
+
+        avg_layer.addLayout(particle_layout)
+
+        roughness = LayerRoughness(self.roughness.value, 0.3, 500.0*nanometer)
+
+        p_multi_layer.addLayer(air_layer)
+        p_multi_layer.addLayer(avg_layer)
+        p_multi_layer.addLayerWithTopRoughness(substrate_layer, roughness)
+
+        return p_multi_layer
+
+    # -------------------------------------------------------------------------
+    # building meso crystal
+    # -------------------------------------------------------------------------
+    def createMesoCrystal(self,stacking_radius_a, stacking_radius_c, n_particle, p_meso_form_factor):
+
+        mParticle = HomogeneousMaterial("Particle", n_particle )
+
+        p_lat = self.createLattice(stacking_radius_a, stacking_radius_c)
+        bas_a = p_lat.getBasisVectorA()
+        bas_b = p_lat.getBasisVectorB()
+        bas_c = p_lat.getBasisVectorC()
+        ff_sphere = FormFactorSphereGaussianRadius(self.nanoparticle_radius.value, self.sigma_nanoparticle_radius.value)
+        particle = Particle(mParticle, ff_sphere )
+        position_0 = kvector_t(0.0, 0.0, 0.0)
+        position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c)
+        position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c)
+        positions = [ position_0, position_1, position_2 ]
+        basis = ParticleComposition()
+        basis.addParticles(particle, positions)
+
+        npc = Crystal(basis, p_lat)
+        dw_factor = self.sigma_lattice_length_a.value*self.sigma_lattice_length_a.value/6.0
+        npc.setDWFactor(dw_factor)
+        meso = MesoCrystal(npc, p_meso_form_factor)
+        return meso
+
+    # -------------------------------------------------------------------------
+    # create lattice
+    # -------------------------------------------------------------------------
+    def createLattice(self, stacking_radius_a, stacking_radius_c):
+        lattice = Lattice.createTrigonalLattice(stacking_radius_a*2.0, stacking_radius_c*2.0*2.3)
+        p_result = Lattice(lattice)
+        selection_rule = SimpleSelectionRule(-1, 1, 1, 3)
+        p_result.setSelectionRule( selection_rule )
+        return p_result
+
+
+# -----------------------------------------------------------------------------
+# run mesocrystal simulation
+# -----------------------------------------------------------------------------
+def runTest():
+    # setting simulation
+    sample_builder = MySampleBuilder()
+    simulation = createSimulation()
+    simulation.setSampleBuilder( sample_builder )
+
+    # loading reference data
+    reference = get_reference_data("mesocrystal01_reference.int.gz")
+
+    # running simulation
+    simulation.runSimulation()
+    result = simulation.getIntensityData()
+
+    #IntensityDataIOFactory.writeIntensityData(result, "mesocrystal01_reference.int.gz")
+
+    diff = getRelativeDifference(result, reference)
+
+    status = "OK"
+    if diff > 1e-10 or numpy.isnan(diff):
+        status = "FAILED"
+    return "MesoCrystal1", "Mesocrystal simulation", diff, status
+
+
+# create simulation
+def createSimulation():
+    simulation = GISASSimulation()
+    simulation.setBeamParameters(1.77*angstrom, 0.4*degree, 0.0*degree)
+    simulation.setBeamIntensity(5.0090e+12)
+    simulation.setDetectorParameters(50, 0.2*deg, 2.5*deg, 50, 0.0*deg, 2.5*deg)
+    # simulation.setDetectorResolutionFunction(ResolutionFunction2DGaussian(0.0002, 0.0002))
+    return simulation
+
+
+if __name__ == '__main__':
+    name, description, diff, status = runTest()
+    print(name, description, diff, status)
+    if "FAILED" in status:
+        exit(1)
diff --git a/Tests/Functional/PyCore/legacy/polmagcylinders1.py b/Tests/Functional/PyCore/legacy/polmagcylinders1.py
new file mode 100644
index 0000000..28c66b5
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/polmagcylinders1.py
@@ -0,0 +1,72 @@
+# Functional test: Magnetic cylinders in DWBA with zero magnetic field
+from __future__ import print_function
+import sys
+import os
+import numpy
+import gzip
+from utils import get_difference
+from utils import get_reference_data
+
+from libBornAgainCore import *
+
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+
+    magnetic_field = kvector_t(0, 0, 0)
+
+    magParticle = HomogeneousMagneticMaterial("magParticle", 6e-4, 2e-8, magnetic_field )
+    # collection of particles
+    cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
+    cylinder = Particle(magParticle, cylinder_ff)
+
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+    interference = InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, 0*degree, 2.0*degree, 100, 0.0*degree, 2.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    ## intensity data
+    return simulation.getIntensityData()
+
+
+# --------------------------------------------------------------
+# run test and analyse test results
+# --------------------------------------------------------------
+def run_test():
+    result = RunSimulation()
+    # IntensityDataIOFactory.writeIntensityData(result, 'polmagcylinders1_reference.int')
+
+    reference = get_reference_data('polmagcylinders1_reference.int.gz')
+
+    diff = get_difference(result.getArray(), reference.getArray())
+
+    status = "OK"
+    if diff > 2e-10:
+        status = "FAILED"
+    return "PolarizedDWBAZeroMag", "Polarized DWBA with zero magnetic field", diff, status
+
+
+if __name__ == '__main__':
+    name, description, diff, status = run_test()
+    print(name, description, diff, status)
+    if("FAILED" in status):
+        exit(1)
diff --git a/Tests/Functional/PyCore/legacy/polmagcylinders2.py b/Tests/Functional/PyCore/legacy/polmagcylinders2.py
new file mode 100644
index 0000000..974f905
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/polmagcylinders2.py
@@ -0,0 +1,92 @@
+# Functional test: Magnetic cylinders in DWBA with zero magnetic field
+from __future__ import print_function
+import sys
+import os
+import numpy
+import gzip
+from utils import get_difference
+
+from libBornAgainCore import *
+
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def getSimulationIntensity(rho_beam, efficiency):
+    # defining materials
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 15e-6, 0.0)
+
+    magnetic_field = kvector_t(0, 1, 0)
+
+    magParticle = HomogeneousMagneticMaterial("magParticle", 5e-6, 0.0, magnetic_field )
+    # collection of particles
+    cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
+    cylinder = Particle(magParticle, cylinder_ff)
+
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder, 1.0)
+    interference = InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -1*degree, 1.0*degree, 100, 0.0*degree, 2.0*degree)
+    zplus = kvector_t(0.0, 0.0, 1.0)
+    simulation.setAnalyzerProperties(zplus, efficiency, 0.5)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    simulation.setBeamPolarization(rho_beam)
+    simulation.setSample(multi_layer)
+    simulation.setBeamIntensity(1e7)
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+# TODO: revert to some standard solution. For other tests, get_reference_data comes from utils.py.
+def get_reference_data(filename):
+    """
+    read and return reference data from file
+    """
+    return IntensityDataIOFactory.readIntensityData("@REFERENCE_DIR@/Special/"+filename)
+
+# --------------------------------------------------------------
+# run test and analyse test results
+# --------------------------------------------------------------
+def run_test():
+    zplus = kvector_t(0.0, 0.0, 1.0)
+    zmin = kvector_t(0.0, 0.0, -1.0)
+
+    # IntensityDataIOFactory.writeIntensityData(getSimulationIntensity(zplus, 1.0), 'polmagcylinders2_reference_00.int')
+    # IntensityDataIOFactory.writeIntensityData(getSimulationIntensity(zplus, -1.0), 'polmagcylinders2_reference_01.int')
+    # IntensityDataIOFactory.writeIntensityData(getSimulationIntensity(zmin, 1.0), 'polmagcylinders2_reference_10.int')
+    # IntensityDataIOFactory.writeIntensityData(getSimulationIntensity(zmin, -1.0), 'polmagcylinders2_reference_11.int')
+    diff = 0.0
+    diff += get_difference(getSimulationIntensity(zplus, 1.0).getArray(),
+                           get_reference_data('polmagcylinders2_reference_00.int.gz').getArray())
+    diff += get_difference(getSimulationIntensity(zplus, -1.0).getArray(),
+                           get_reference_data('polmagcylinders2_reference_01.int.gz').getArray())
+    diff += get_difference(getSimulationIntensity(zmin, 1.0).getArray(),
+                           get_reference_data('polmagcylinders2_reference_10.int.gz').getArray())
+    diff += get_difference(getSimulationIntensity(zmin, -1.0).getArray(),
+                           get_reference_data('polmagcylinders2_reference_11.int.gz').getArray())
+
+    diff /= 4.0
+    status = "OK"
+    if diff > 2e-10:
+        status = "FAILED"
+    return "PolarizedDWBAZeroMag", "functional test: polarized DWBA with non-zero magnetic field", diff, status
+
+
+if __name__ == '__main__':
+    name, description, diff, status = run_test()
+    print(name, description, diff, status)
+    if("FAILED" in status):
+        exit(1)
diff --git a/Tests/Functional/PyCore/legacy/ripple1.py b/Tests/Functional/PyCore/legacy/ripple1.py
new file mode 100644
index 0000000..8601626
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/ripple1.py
@@ -0,0 +1,73 @@
+# Functional test: triangular ripple formfactor within the 1D-paracrystal model
+from __future__ import print_function
+import sys
+import os
+import numpy
+
+from utils import get_reference_data
+
+from libBornAgainCore import *
+
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    ripple1_ff = FormFactorRipple1(100 * nanometer, 20 * nanometer, 4 * nanometer)
+    ripple = Particle(mParticle, ripple1_ff)
+
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(ripple, 1.0)
+
+    interference = InterferenceFunctionRadialParaCrystal(20 * nanometer, 1e7 * nanometer)
+    pdf = FTDistribution1DGauss(4 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -1.5 * degree, 1.5 * degree, 100, 0.0 * degree, 2.0 * degree)
+    simulation.setBeamParameters(1.6 * angstrom, 0.3 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # # intensity data
+    return simulation.getIntensityData()
+
+# --------------------------------------------------------------
+# run test and analyse test results
+# --------------------------------------------------------------
+def runTest():
+    result = RunSimulation()
+
+    reference = get_reference_data("ripple1_reference.int.gz")
+
+    diff = getRelativeDifference(result, reference)
+
+    status = "OK"
+    if (diff > 2e-10 or numpy.isnan(diff)):
+        status = "FAILED"
+    return "Ripple1", "Cosine ripple within the 1D-paracrystal model", diff, status
+
+
+# -------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    name, description, diff, status = runTest()
+    print(name, description, diff, status)
+    if("FAILED" in status):
+        exit(1)
diff --git a/Tests/Functional/PyCore/legacy/ripple2_asym.py b/Tests/Functional/PyCore/legacy/ripple2_asym.py
new file mode 100644
index 0000000..fb10b0e
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/ripple2_asym.py
@@ -0,0 +1,73 @@
+# Functional test: triangular asymetric ripple formfactor within the 1D-paracrystal model
+from __future__ import print_function
+import sys
+import os
+import numpy
+from utils import get_reference_data
+
+from libBornAgainCore import *
+
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    ripple2_ff = FormFactorRipple2(100 * nanometer, 20 * nanometer, 4 * nanometer, -3 * nanometer)
+    ripple = Particle(mParticle, ripple2_ff)
+
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(ripple, 1.0)
+
+    interference = InterferenceFunctionRadialParaCrystal(20 * nanometer, 1e7 * nanometer)
+    pdf = FTDistribution1DGauss(4 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -1.5 * degree, 1.5 * degree, 100, 0.0 * degree, 2.0 * degree)
+    simulation.setBeamParameters(1.6 * angstrom, 0.3 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # # intensity data
+    return simulation.getIntensityData()
+
+
+# --------------------------------------------------------------
+# run test and analyse test results
+# --------------------------------------------------------------
+def runTest():
+    result = RunSimulation()
+
+    reference = get_reference_data("ripple2_asym_reference.int.gz")
+
+    diff = getRelativeDifference(result, reference)
+
+    status = "OK"
+    if (diff > 1e-10 or numpy.isnan(diff)):
+        status = "FAILED"
+    return "Ripple2a", "Triangular asymetric ripple within the 1D-paracrystal model", diff, status
+
+
+# -------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    name, description, diff, status = runTest()
+    print(name, description, diff, status)
+    if("FAILED" in status):
+        exit(1)
diff --git a/Tests/Functional/PyCore/legacy/ripple2_sym.py b/Tests/Functional/PyCore/legacy/ripple2_sym.py
new file mode 100644
index 0000000..eb4d371
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/ripple2_sym.py
@@ -0,0 +1,73 @@
+# Functional test: triangular ripple formfactor within the 1D-paracrystal model
+from __future__ import print_function
+import sys
+import os
+import numpy
+from utils import get_reference_data
+
+from libBornAgainCore import *
+
+
+# ----------------------------------
+# describe sample and run simulation
+# ----------------------------------
+def RunSimulation():
+    # defining materials
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+    mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    ripple2_ff = FormFactorRipple2(100 * nanometer, 20 * nanometer, 4 * nanometer, 0 * nanometer)
+    ripple = Particle(mParticle, ripple2_ff)
+
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(ripple, 1.0)
+
+    interference = InterferenceFunctionRadialParaCrystal(20 * nanometer, 1e7 * nanometer)
+    pdf = FTDistribution1DGauss(4 * nanometer)
+    interference.setProbabilityDistribution(pdf)
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(mSubstrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, -1.5 * degree, 1.5 * degree, 100, 0.0 * degree, 2.0 * degree)
+    simulation.setBeamParameters(1.6 * angstrom, 0.3 * degree, 0.0 * degree)
+    simulation.setSample(multi_layer)
+    simulation.runSimulation()
+    # # intensity data
+    return simulation.getIntensityData()
+
+
+# --------------------------------------------------------------
+# run test and analyse test results
+# --------------------------------------------------------------
+def runTest():
+    result = RunSimulation()
+
+    reference = get_reference_data("ripple2_sym_reference.int.gz")
+
+    diff = getRelativeDifference(result, reference)
+
+    status = "OK"
+    if (diff > 1e-10 or numpy.isnan(diff)):
+        status = "FAILED"
+    return "Ripple2", "Triangular ripple within the 1D-paracrystal model", diff, status
+
+
+# -------------------------------------------------------------
+# main()
+#-------------------------------------------------------------
+if __name__ == '__main__':
+    name, description, diff, status = runTest()
+    print(name, description, diff, status)
+    if("FAILED" in status):
+        exit(1)
diff --git a/Tests/Functional/PyCore/legacy/transform_BoxComposition.py b/Tests/Functional/PyCore/legacy/transform_BoxComposition.py
new file mode 100644
index 0000000..3a483d9
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/transform_BoxComposition.py
@@ -0,0 +1,241 @@
+"""
+BornAgain functional test.
+Test of rotation/position of particle composition. The composition consists of two boxes made of the same
+material. It is compared against reference single box made of the same material. Composition might be rotated to
+get reference shape. Both, reference box and composition are placed in the center of middle layer of 3 layers system.
+"""
+from __future__ import print_function
+import unittest
+import utils
+
+import sys
+import os
+
+from libBornAgainCore import *
+
+layer_thickness = 100.0
+comp_length = 50.0
+comp_width = 20.0
+comp_height = 10.0
+particle_material = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7)
+
+class TransformBoxCompositionTest(unittest.TestCase):
+
+    def get_sample(self, particle):
+        mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+        mMiddle= HomogeneousMaterial("Teflon", 2.900e-6, 6.019e-9)
+        mSubstrate = HomogeneousMaterial("Substrate", 3.212e-6, 3.244e-8)
+
+        layout = ParticleLayout()
+        layout.addParticle(particle)
+
+        air_layer = Layer(mAmbience)
+        middle_layer = Layer(mMiddle, layer_thickness)
+        # air_layer.addLayout(layout)
+        middle_layer.addLayout(layout)
+        substrate = Layer(mSubstrate)
+
+        multi_layer = MultiLayer()
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(middle_layer)
+        multi_layer.addLayer(substrate)
+        return multi_layer
+
+    def get_intensity_data(self, particle):
+        sample = self.get_sample(particle)
+        simulation = utils.get_simulation_MiniGISAS(sample)
+        simulation.runSimulation()
+        return simulation.getIntensityData()
+
+    def test_BoxComposition(self):
+        """
+        Compares simple box with the one composed from two smaller boxes of the same material to get same size
+        """
+        # reference box
+        length = 50.0
+        width = 20.0
+        height = 10.0
+        particle = Particle(particle_material, FormFactorBox(length, width, height))
+        particle.setPosition(kvector_t(0, 0, -layer_thickness/2.0 - height/2.0))
+
+        reference_data = self.get_intensity_data(particle)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_BoxComposition.int")
+
+        # composition
+        box = Particle(particle_material, FormFactorBox(comp_length/2.0, comp_width, comp_height))
+        composition = ParticleComposition()
+        # composition = ParticleComposition(box, positions)
+        composition.addParticle(box, kvector_t(0.0, 0.0, 0.0))
+        composition.addParticle(box, kvector_t(comp_length/2.0, 0.0, 0.0))
+        composition.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - comp_height/2.0))
+
+        data = self.get_intensity_data(composition)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_BoxComposition:", diff)
+        self.assertLess(diff, 1e-10)
+        # utils.plot_intensity_data(reference_data)
+
+    def test_BoxCompositionRotateX(self):
+        """
+        Compares simple box with the one composed from two smaller boxes of the same material to get same size.
+        Composed box is rotated around X, to get same orientation as the original box.
+        """
+        # reference box
+        length = 50.0
+        width = 10.0
+        height = 20.0
+        particle = Particle(particle_material, FormFactorBox(length, width, height))
+        particle.setPosition(kvector_t(0, 0, -layer_thickness/2.0 - height/2.0))
+
+        reference_data = self.get_intensity_data(particle)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_BoxCompositionRotateX.int")
+
+        # composition
+        box = Particle(particle_material, FormFactorBox(comp_length/2.0, comp_width, comp_height))
+        composition = ParticleComposition()
+        composition.addParticle(box, kvector_t(0.0, 0.0, 0.0))
+        composition.addParticle(box, kvector_t(comp_length/2.0, 0.0, 0.0))
+        composition.setRotation(RotationX(90*degree))
+        composition.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.))
+
+        data = self.get_intensity_data(composition)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_BoxCompositionRotateX:", diff)
+        self.assertLess(diff, 1e-10)
+
+    def test_BoxCompositionRotateY(self):
+        """
+        Compares simple box with the one composed from two smaller boxes of the same material to get same size.
+        Composed box is rotated around Y, to get same orientation as the original box.
+        """
+        # reference box
+        length = 10.0
+        width = 20.0
+        height = 50.0
+        particle = Particle(particle_material, FormFactorBox(length, width, height))
+        particle.setPosition(kvector_t(0, 0, -layer_thickness/2.0 - height/2.0))
+
+        reference_data = self.get_intensity_data(particle)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_BoxCompositionRotateY.int")
+
+        # composition
+        box = Particle(particle_material, FormFactorBox(comp_length/2.0, comp_width, comp_height))
+        composition = ParticleComposition()
+        composition.addParticle(box, kvector_t(0.0, 0.0, 0.0))
+        composition.addParticle(box, kvector_t(comp_length/2.0, 0.0, 0.0))
+        composition.setRotation(RotationY(90*degree))
+        composition.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2. + comp_length/4.))
+
+        data = self.get_intensity_data(composition)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_BoxCompositionRotateY:", diff)
+        self.assertLess(diff, 1e-10)
+
+    def test_BoxCompositionRotateZ(self):
+        """
+        Compares simple box with the one composed from two smaller boxes of the same material to get same size.
+        Composed box is rotated around Z, to get same orientation as the original box.
+        """
+        # reference box
+        length = 20.0
+        width = 50.0
+        height = 10.0
+        particle = Particle(particle_material, FormFactorBox(length, width, height))
+        particle.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - height/2.0))
+
+        reference_data = self.get_intensity_data(particle)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_BoxCompositionRotateZ.int")
+
+        # composition
+        box = Particle(particle_material, FormFactorBox(comp_length/2.0, comp_width, comp_height))
+        composition = ParticleComposition()
+        composition.addParticle(box, kvector_t(0.0, 0.0, 0.0))
+        composition.addParticle(box, kvector_t(comp_length/2.0, 0.0, 0.0))
+        composition.setRotation(RotationZ(90.0*degree))
+        composition.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - comp_height/2.0))
+
+        data = self.get_intensity_data(composition)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_BoxCompositionRotateZ:", diff)
+        self.assertLess(diff, 1e-10)
+
+    def test_BoxCompositionRotateZandY(self):
+        """
+        Compares simple box with the one composed from two smaller boxes of the same material to get same size.
+        Composed box is rotated around Y, to get same orientation as the original box.
+        """
+        # reference box
+        length = 10.0
+        width = 50.0
+        height = 20.0
+        particle = Particle(particle_material, FormFactorBox(length, width, height))
+        particle.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - height/2.0))
+
+        reference_data = self.get_intensity_data(particle)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_BoxCompositionRotateZandY.int")
+
+        # composition
+        box = Particle(particle_material, FormFactorBox(comp_length/2.0, comp_width, comp_height))
+        composition = ParticleComposition()
+        composition.addParticle(box, kvector_t(0.0, 0.0, 0.0))
+        composition.addParticle(box, kvector_t(comp_length/2.0, 0.0, 0.0))
+        composition.setRotation(RotationZ(90*degree))
+        composition.applyRotation(RotationY(90*degree))
+        composition.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.))
+
+        data = self.get_intensity_data(composition)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_BoxCompositionRotateZandY:", diff)
+        self.assertLess(diff, 1e-10)
+
+    def test_BoxStackComposition(self):
+        """
+        2 different boxes are first rotated and then combined into the composition. Composition is then rotated.
+        Composition is compared against reference box.
+        """
+        # reference box
+        length = 10.0
+        width = 20.0
+        height = 50.0
+        particle = Particle(particle_material, FormFactorBox(length, width, height))
+        particle.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - height/2.0))
+        reference_data = self.get_intensity_data(particle)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_BoxStackComposition.int")
+
+        # composition
+        composition = ParticleComposition()
+
+        # box1 (20,50,5), rotatedZ
+        box1_length = 20.0
+        box1_width = 50.0
+        box1_height = 5.0
+        box1 = Particle(particle_material, FormFactorBox(box1_length, box1_width, box1_height))
+        box1.setRotation(RotationZ(90.*degree))
+
+        # box2 (5,20,50), rotatedY
+        box2_length = 5.0
+        box2_width = 20.0
+        box2_height = 50.0
+        box2 = Particle(particle_material, FormFactorBox(box2_length, box2_width, box2_height))
+        box2.setRotation(RotationY(90.*degree))
+        box2.setPosition(kvector_t(-box2_height/2.0, 0.0, box2_length/2.0))
+
+        composition.addParticle(box1, kvector_t(0.0, 0.0, 0.0))
+        composition.addParticle(box2, kvector_t(0.0, 0.0, box1_height))
+        composition.setRotation(RotationY(90.0*degree))
+        composition.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.))
+
+        data = self.get_intensity_data(composition)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_BoxStackComposition:", diff)
+        self.assertLess(diff, 1e-10)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/transform_CoreShellBox.py b/Tests/Functional/PyCore/legacy/transform_CoreShellBox.py
new file mode 100644
index 0000000..f432419
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/transform_CoreShellBox.py
@@ -0,0 +1,214 @@
+"""
+BornAgain functional test.
+Test of rotation/position of core shell particle. Reference CoreShell particle is compared against the test CoreShell
+which has different dimensions but rotated/translated to be like the reference one.
+Particles are placed in the center of middle layer.
+"""
+from __future__ import print_function
+import unittest
+import utils
+import sys
+import os
+
+from libBornAgainCore import *
+
+layer_thickness = 100.0
+
+class TransformCoreShellBoxTest(unittest.TestCase):
+
+    def get_sample(self, particle):
+        mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+        mMiddle= HomogeneousMaterial("Teflon", 2.900e-6, 6.019e-9)
+        mSubstrate = HomogeneousMaterial("Substrate", 3.212e-6, 3.244e-8)
+
+        layout = ParticleLayout()
+        layout.addParticle(particle)
+
+        air_layer = Layer(mAmbience)
+        middle_layer = Layer(mMiddle, layer_thickness)
+        middle_layer.addLayout(layout)
+        substrate = Layer(mSubstrate)
+
+        multi_layer = MultiLayer()
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(middle_layer)
+        multi_layer.addLayer(substrate)
+        return multi_layer
+
+    def get_intensity_data(self, particle):
+        sample = self.get_sample(particle)
+        simulation = utils.get_simulation_MiniGISAS(sample)
+        simulation.runSimulation()
+        return simulation.getIntensityData()
+
+    def test_SameMaterialCoreShellBox(self):
+        """
+        Box particle placed in the center of the middle layer is compared against CoreShell particle,
+        where core and shell are made of the same material.
+        """
+        mCore = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7)
+
+        shell_length = 50.0
+        shell_width = 20.0
+        shell_height = 10.0
+        particle = Particle(mCore, FormFactorBox(shell_length, shell_width, shell_height))
+        particle.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - shell_height/2.0))
+
+        reference_data = self.get_intensity_data(particle)
+
+        core_length = shell_length/2.0
+        core_width = shell_width/2.0
+        core_height = shell_height/2.0
+        shell = Particle(mCore, FormFactorBox(shell_length, shell_width, shell_height))
+        core = Particle(mCore, FormFactorBox(core_length, core_width, core_height))
+        coreshell = ParticleCoreShell(shell, core, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0))
+        coreshell.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - shell_height/2.0))
+
+        data = self.get_intensity_data(coreshell)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_SameMaterialCoreShell:", diff)
+        self.assertLess(diff, 1e-10)
+
+    def test_CoreShellBoxRotateZ(self):
+        """
+        Two CoreShell particles are compared against each other. Reference CoreShell particle has dimensions (20,50,10)
+        and is placed in the center of middle layer. Second CoreShell particle has dimensions (50,20,10) with one
+        rotationZ to be like the reference one.
+        """
+        mCore = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7)
+        mShell = HomogeneousMaterial("AgO2", 8.600e-6, 3.442e-7)
+
+        # building reference CoreShell particle
+        shell_length = 20.0
+        shell_width = 50.0
+        shell_height = 10.0
+        core_length = shell_length/2.0
+        core_width = shell_width/2.0
+        core_height = shell_height/2.0
+
+        core_ref = Particle(mCore, FormFactorBox(core_length, core_width, core_height))
+        shell_ref = Particle(mShell, FormFactorBox(shell_length, shell_width, shell_height))
+        coreshell_ref = ParticleCoreShell(shell_ref, core_ref, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0))
+        coreshell_ref.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - shell_height/2.0))  # center of coreshell in center of the layer
+
+        reference_data = self.get_intensity_data(coreshell_ref)
+
+        # building second CoreShell particle
+        shell_length = 50.0
+        shell_width = 20.0
+        shell_height = 10.0
+        core_length = shell_length/2.0
+        core_width = shell_width/2.0
+        core_height = shell_height/2.0
+
+        core = Particle(mCore, FormFactorBox(core_length, core_width, core_height))
+        shell = Particle(mShell, FormFactorBox(shell_length, shell_width, shell_height))
+        coreshell = ParticleCoreShell(shell, core, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0))
+        coreshell.setRotation(RotationZ(90.0*degree))
+        coreshell.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - shell_height/2.0))  # center of coreshell  in center of the layer
+
+        data = self.get_intensity_data(coreshell)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_CoreShellBoxRotateZ:", diff)
+        self.assertLess(diff, 1e-10)
+
+
+    def test_CoreShellBoxRotateY(self):
+        """
+        Two CoreShell particles are compared against each other. Reference CoreShell particle has dimensions (10,20,50)
+        and is placed in the center of middle layer. Second CoreShell particle has dimensions (50,20,10) with one
+        rotationZ to be like the reference one.
+        """
+        mCore = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7)
+        mShell = HomogeneousMaterial("AgO2", 8.600e-6, 3.442e-7)
+
+        # building reference CoreShell particle
+        shell_length = 10.0
+        shell_width = 20.0
+        shell_height = 50.0
+        core_length = shell_length/2.0
+        core_width = shell_width/2.0
+        core_height = shell_height/2.0
+
+        core_ref = Particle(mCore, FormFactorBox(core_length, core_width, core_height))
+        shell_ref = Particle(mShell, FormFactorBox(shell_length, shell_width, shell_height))
+        coreshell_ref = ParticleCoreShell(shell_ref, core_ref, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0))
+        coreshell_ref.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - shell_height/2.0))  # center of coreshell in center of the layer
+
+        reference_data = self.get_intensity_data(coreshell_ref)
+
+        # building second CoreShell particle
+        shell_length = 50.0
+        shell_width = 20.0
+        shell_height = 10.0
+        core_length = shell_length/2.0
+        core_width = shell_width/2.0
+        core_height = shell_height/2.0
+
+        core = Particle(mCore, FormFactorBox(core_length, core_width, core_height))
+        shell = Particle(mShell, FormFactorBox(shell_length, shell_width, shell_height))
+        coreshell = ParticleCoreShell(shell, core, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0))
+        coreshell.setRotation(RotationY(90.*degree))
+        coreshell.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0))  # center of coreshell  in center of the layer
+
+        data = self.get_intensity_data(coreshell)
+
+        # utils.plot_intensity_data(data)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_CoreShellBoxRotateY:", diff)
+        self.assertLess(diff, 1e-10)
+
+
+    def test_CoreShellBoxRotateZandY(self):
+        """
+        Two CoreShell particles are compared against each other. Reference CoreShell particle has dimensions (10,50,20)
+        and is placed in the center of middle layer. Second CoreShell particle has dimensions (50,20,10) with two
+        rotations to be like the reference one.
+        """
+        mCore = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7)
+        mShell = HomogeneousMaterial("AgO2", 8.600e-6, 3.442e-7)
+
+        # building reference CoreShell particle
+        shell_length = 10.0
+        shell_width = 50.0
+        shell_height = 20.0
+        core_length = shell_length/2.0
+        core_width = shell_width/2.0
+        core_height = shell_height/2.0
+
+        core_ref = Particle(mCore, FormFactorBox(core_length, core_width, core_height))
+        shell_ref = Particle(mShell, FormFactorBox(shell_length, shell_width, shell_height))
+        coreshell_ref = ParticleCoreShell(shell_ref, core_ref, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0))
+        coreshell_ref.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0 - shell_height/2.0))  # center of coreshell in center of the layer
+
+        reference_data = self.get_intensity_data(coreshell_ref)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_CoreShellBoxRotateZandY.int")
+
+        # building second CoreShell particle
+        shell_length = 50.0
+        shell_width = 20.0
+        shell_height = 10.0
+        core_length = shell_length/2.0
+        core_width = shell_width/2.0
+        core_height = shell_height/2.0
+
+        core = Particle(mCore, FormFactorBox(core_length, core_width, core_height))
+        shell = Particle(mShell, FormFactorBox(shell_length, shell_width, shell_height))
+        coreshell = ParticleCoreShell(shell, core, kvector_t(0.0, 0.0, (shell_height-core_height)/2.0))
+        coreshell.setRotation(RotationZ(90.0*degree))
+        coreshell.applyRotation(RotationY(90.0*degree))
+        # rotation changes reference point, which now coincide with center of the volume
+        coreshell.setPosition(kvector_t(0.0, 0.0, -layer_thickness/2.0))  # center of coreshell  in center of the layer
+
+        data = self.get_intensity_data(coreshell)
+
+        diff = getRelativeDifference(data, reference_data)
+        print("test_CoreShellBoxRotateZandY:", diff)
+        self.assertLess(diff, 1e-10)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/transform_box.py b/Tests/Functional/PyCore/legacy/transform_box.py
new file mode 100644
index 0000000..fdb423b
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/transform_box.py
@@ -0,0 +1,79 @@
+"""
+Test of rotation/position of box in the middle layer of 3 layers system.
+
+FormFactorBox(50, 20, 10), is rotated around Z, then around Y, then shifted up and then
+compared with FormFactorBox(10, 50, 20)
+"""
+from __future__ import print_function
+import unittest
+import utils
+import sys
+import os
+
+from libBornAgainCore import *
+
+layer_thickness = 100
+
+class BoxTransformationsTest(unittest.TestCase):
+
+    def get_sample(self, particle):
+        mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+        mMiddle= HomogeneousMaterial("Teflon", 2.900e-6, 6.019e-9)
+        mSubstrate = HomogeneousMaterial("Substrate", 3.212e-6, 3.244e-8)
+
+        layout = ParticleLayout()
+        layout.addParticle(particle)
+
+        air_layer = Layer(mAmbience)
+        middle_layer = Layer(mMiddle, layer_thickness)
+        middle_layer.addLayout(layout)
+        substrate = Layer(mSubstrate)
+
+        multi_layer = MultiLayer()
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(middle_layer)
+        multi_layer.addLayer(substrate)
+        return multi_layer
+
+    def get_intensity_data(self, particle):
+        sample = self.get_sample(particle)
+        simulation = utils.get_simulation_MiniGISAS(sample)
+        simulation.runSimulation()
+        return simulation.getIntensityData()
+
+    def testBoxTransform(self):
+        """
+        Reference box of (10,50,20) size is compared against the box (50,20,10) with two rotations applied to get
+        reference one
+        """
+        mParticle = HomogeneousMaterial("Ag", 1.245e-5, 5.419e-7)
+
+        # reference box
+        length = 10
+        width = 50
+        height = 20
+
+        box = Particle(mParticle, FormFactorBox(length, width, height))
+        box.setPosition(kvector_t(0, 0, -layer_thickness/2 - height/2))
+        reference_data = self.get_intensity_data(box)
+        #utils.plot_intensity_data(reference_data)
+        #IntensityDataIOFactory.writeIntensityData(reference_data, "ref_TransformBox.int")
+
+        # second box
+        length = 50
+        width = 20
+        height = 10
+        box = Particle(mParticle, FormFactorBox(length, width, height))
+        box.setRotation(RotationZ(90.*degree))
+        box.applyRotation(RotationY(90.*degree))
+        box.setPosition(kvector_t(0, 0, -layer_thickness/2))
+
+        data = self.get_intensity_data(box)
+
+        diff = getRelativeDifference(data, reference_data)
+        print(diff)
+        self.assertLess(diff, 1e-10)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/transform_cube.py b/Tests/Functional/PyCore/legacy/transform_cube.py
new file mode 100644
index 0000000..3ef9d21
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/transform_cube.py
@@ -0,0 +1,173 @@
+"""
+Test of rotation/positioning of simple cubic particle. Original particle is compared with the one obtained
+"""
+from __future__ import print_function
+import unittest
+import utils
+import sys
+import os
+
+from libBornAgainCore import *
+
+
+class RotationsCubeTest(unittest.TestCase):
+    """
+    Test of rotations and translations of simple cube in three layers system
+    """
+    def get_sample(self, formfactor, rot = None, pos = None, layout_rot = None, layout_pos = None, add_to="air"):
+        mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+        mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+        mMiddle= HomogeneousMaterial("MidleLayer", 5e-5, 2e-8)
+        mSubstrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+
+        particle = Particle(mParticle, formfactor)
+        if pos:
+            particle.setPosition(pos)
+        if rot:
+            particle.setRotation(rot)
+
+        layout = ParticleLayout()
+        if layout_rot and layout_pos:
+            layout.addParticle(particle, 1.0, layout_pos, layout_rot)
+        elif layout_rot and not layout_pos:
+            layout.addParticle(particle, 1.0, kvector_t(0, 0, 0), layout_rot)
+        elif not layout_rot and layout_pos:
+            layout.addParticle(particle, 1.0, layout_pos)
+        else:
+            layout.addParticle(particle)
+
+        air_layer = Layer(mAmbience)
+        middle_layer = Layer(mSubstrate, 50.0)
+        substrate = Layer(mSubstrate)
+
+        if add_to == "air":
+            air_layer.addLayout(layout)
+        else:
+            middle_layer.addLayout(layout)
+
+        multi_layer = MultiLayer()
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(middle_layer)
+        multi_layer.addLayer(substrate)
+        return multi_layer
+
+    def get_intensity_data(self, data, add_to="air"):
+        ff = data[0]
+        rot = data[1]
+        pos = data[2]
+        layout_rot = data[3]
+        layout_pos = data[4]
+        sample = self.get_sample(ff, rot, pos, layout_rot, layout_pos, add_to)
+        # simulation = self.get_simulation(sample)
+        simulation = utils.get_simulation_MiniGISAS(sample)
+        simulation.runSimulation()
+        return simulation.getIntensityData()
+
+    def get_difference(self, reference_data, test_data, add_to="air"):
+        intensity = self.get_intensity_data(test_data, add_to)
+        return getRelativeDifference(reference_data, intensity)
+
+    def testRotationZ(self):
+        """
+        Cube is Z-rotated either through setRotation method or through particle layout. The result is compared
+        with unrotated cube.
+        """
+        box = FormFactorBox(10, 10, 10)
+
+        data_to_test = [
+            # ff  rot                     pos                    layout_rot              layout_pos
+            (box, None,                   None,                  None,                   None),  # reference
+            (box, RotationZ(90.*degree),  None,                  None,                   None),  # rotating particle
+            (box, RotationZ(-90.*degree), None,                  None,                   None),
+            (box, RotationZ(180.*degree), None,                  None,                   None),
+            (box, None,                   None,                  RotationZ(90.*degree),  None),  # rotating through layout
+            (box, RotationZ(45.*degree),  None,                  RotationZ(45.*degree),  None),  # cumulative rotation
+        ]
+
+        reference_data = self.get_intensity_data(data_to_test[0])
+
+        isSuccess = True
+        for i in range(1, len(data_to_test)):
+            diff = self.get_difference(reference_data, data_to_test[i])
+            print("{0}    #{1}   diff {2:.2e}".format(self.testRotationZ.__name__, i, diff))
+            if(diff > 1e-10) : isSuccess=False
+
+        self.assertTrue(isSuccess)
+
+    def testRotationY(self):
+        """
+        Cube is Y-rotated either through setRotation method or through particle layout. Additional translation is
+        applied if necessary. The result is compared with unrotated cube.
+        """
+        box = FormFactorBox(10, 10, 10)
+
+        data_to_test = [
+            # ff  rot                     pos                    layout_rot              layout_pos
+            (box, None,                   None,                  None,                   None),  # reference
+            (box, RotationY(90.*degree),  kvector_t(0,0,5.0),    None,                   None),  # rotating and translating
+            (box, None,                   None,                  RotationY(90.*degree),  kvector_t(0,0,5.0)),  # rotating and translating
+            (box, RotationY(90.*degree),  None,                  None,                   kvector_t(0,0,5.0)),  # rotating and translating
+            (box, RotationY(45.*degree),  kvector_t(0,0,0.0),    RotationY(45.*degree),  kvector_t(0,0,5.0)),  # rotating and translating
+        ]
+
+        reference_data = self.get_intensity_data(data_to_test[0])
+
+        isSuccess = True
+        for i in range(1, len(data_to_test)):
+            diff = self.get_difference(reference_data, data_to_test[i])
+            print("{0}    #{1}   diff {2:.2e}".format(self.testRotationY.__name__, i, diff))
+            if(diff > 1e-10) : isSuccess=False
+
+        self.assertTrue(isSuccess)
+
+    def testRotationX(self):
+        """
+        Cube is Z-rotated either through setRotation method or through particle layout. Additional translation is
+        applied if necessary. The result is compared with unrotated cube.
+        """
+        box = FormFactorBox(10, 10, 10)
+
+        data_to_test = [
+            # ff  rot                     pos                    layout_rot              layout_pos
+            (box, None,                   None,                  None,                   None),  # reference
+            (box, RotationX(90.*degree),  kvector_t(0,0,5.0),    None,                   None),  # rotating and translating
+            (box, None,                   None,                  RotationX(90.*degree),  kvector_t(0,0,5.0)),  # rotating and translating
+            (box, RotationX(90.*degree),  None,                  None,                   kvector_t(0,0,5.0)),  # rotating and translating
+            (box, RotationX(45.*degree),  kvector_t(0,0,0.0),    RotationX(45.*degree),  kvector_t(0,0,5.0)),  # rotating and translating
+        ]
+
+        reference_data = self.get_intensity_data(data_to_test[0])
+
+        isSuccess = True
+        for i in range(1, len(data_to_test)):
+            diff = self.get_difference(reference_data, data_to_test[i])
+            print("{0}    #{1}   diff {2:.2e}".format(self.testRotationX.__name__, i, diff))
+            if(diff > 1e-10) : isSuccess=False
+
+        self.assertTrue(isSuccess)
+
+    def testRotationsInMiddleLayer(self):
+        """
+        """
+        box = FormFactorBox(10, 10, 10)
+
+        data_to_test = [
+            # ff  rot                     pos                    layout_rot              layout_pos
+            (box, None,                   kvector_t(0,0,-25.0),  None,                   None),  # reference
+            (box, RotationX(90.*degree),  kvector_t(0,0,-20.0),  None,                   None),  # rotating and translating
+        ]
+
+        reference_data = self.get_intensity_data(data_to_test[0], "add_to_middle")
+
+        isSuccess = True
+        for i in range(1, len(data_to_test)):
+            diff = self.get_difference(reference_data, data_to_test[i], "add_to_middle")
+            print("{0}    #{1}   diff {2:.2e}".format(self.testRotationX.__name__, i, diff))
+            if(diff > 1e-10) : isSuccess=False
+
+        self.assertTrue(isSuccess)
+
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyCore/legacy/utils.py b/Tests/Functional/PyCore/legacy/utils.py
new file mode 100644
index 0000000..f1f6811
--- /dev/null
+++ b/Tests/Functional/PyCore/legacy/utils.py
@@ -0,0 +1,73 @@
+"""
+Collection of utils for testing
+"""
+import gzip, numpy, sys, os
+
+sys.path.append("@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
+
+from libBornAgainCore import *
+
+
+def get_difference(data, reference):
+    """
+    calculate numeric difference between result and reference data
+    """
+    reference = reference.reshape(data.shape)
+    data -= reference
+    diff = 0.0
+    epsilon = sys.float_info.epsilon
+    for x, y in numpy.ndindex(data.shape):
+        v1 = data[x][y]
+        v2 = reference[x][y]
+        if v1 <= epsilon and v2 <= epsilon:
+            diff += 0.0
+        elif v2 <= epsilon:
+            diff += abs(v1/epsilon)
+        else:
+            diff += abs(v1/v2)
+    diff = diff/data.size
+    if numpy.isnan(diff):
+        raise Exception("get_difference", "isnan")
+
+    return diff
+
+
+def get_reference_data(filename):
+    """
+    read and return reference data from file
+    """
+    return IntensityDataIOFactory.readIntensityData("@REFERENCE_DIR@/legacy/"+filename)
+
+
+def get_simulation_MiniGISAS(sample = None):
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(25, -2.0*degree, 2.0*degree, 25, 0.0*degree, 2.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    if sample:
+        simulation.setSample(sample)
+    return simulation
+
+def get_simulation_BasicGISAS(sample = None):
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(100, 0.0*degree, 2.0*degree, 100, 0.0*degree, 2.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    if sample:
+        simulation.setSample(sample)
+    return simulation
+
+def plot_intensity_data(intensity):
+    import matplotlib
+    import pylab
+    data = intensity.getArray() + 1
+    # data = numpy.abs(intensity.getArray())
+    phi_min = rad2deg(intensity.getAxis(0).getMin())
+    phi_max = rad2deg(intensity.getAxis(0).getMax())
+    alpha_min = rad2deg(intensity.getAxis(1).getMin())
+    alpha_max = rad2deg(intensity.getAxis(1).getMax())
+    im = pylab.imshow(data, norm=matplotlib.colors.LogNorm(),
+                      extent=[phi_min, phi_max, alpha_min, alpha_max])
+    cb = pylab.colorbar(im)
+    cb.set_label(r'Intensity (arb. u.)', size=16)
+    pylab.xlabel(r'$\phi_f (^{\circ})$', fontsize=16)
+    pylab.ylabel(r'$\alpha_f (^{\circ})$', fontsize=16)
+    pylab.show()
diff --git a/Tests/Functional/PyCore/persistence/CMakeLists.txt b/Tests/Functional/PyCore/persistence/CMakeLists.txt
new file mode 100644
index 0000000..9d50684
--- /dev/null
+++ b/Tests/Functional/PyCore/persistence/CMakeLists.txt
@@ -0,0 +1,78 @@
+############################################################################
+# Tests/Functional/PyCore/persistence/CMakeLists.txt
+############################################################################
+
+set(PYPERSIST_REF_DIR ${REFERENCE_DIR}/PyPersist)
+set(PYPERSIST_OUT_DIR ${BUILD_REF_DIR}/PyPersist)
+file(MAKE_DIRECTORY ${PYPERSIST_OUT_DIR})
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPYPERSIST_OUT_DIR=\\\"${PYPERSIST_OUT_DIR}\\\"")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPYPERSIST_REF_DIR=\\\"${PYPERSIST_REF_DIR}\\\"")
+
+set(PY_EXAMPLES
+    "simulation/ex01_BasicParticles/AllFormFactorsAvailable.py"
+    "simulation/ex01_BasicParticles/CylindersAndPrisms.py"
+    "simulation/ex01_BasicParticles/CylindersInBA.py"
+    "simulation/ex01_BasicParticles/CylindersInDWBA.py"
+    "simulation/ex01_BasicParticles/CylindersWithSizeDistribution.py"
+    "simulation/ex01_BasicParticles/RotatedPyramids.py"
+    "simulation/ex01_BasicParticles/TwoTypesOfCylindersWithSizeDistribution.py"
+    "simulation/ex02_LayeredStructures/BuriedParticles.py"
+    "simulation/ex02_LayeredStructures/CorrelatedRoughness.py"
+    "simulation/ex03_InterferenceFunctions/ApproximationDA.py"
+    "simulation/ex03_InterferenceFunctions/ApproximationLMA.py"
+    "simulation/ex03_InterferenceFunctions/ApproximationSSCA.py"
+    "simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py"
+    "simulation/ex03_InterferenceFunctions/Interference1DLattice.py"
+    "simulation/ex03_InterferenceFunctions/Interference1DRadialParaCrystal.py"
+    "simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py"
+    "simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py"
+    "simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py"
+    "simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py"
+    "simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py"
+    "simulation/ex03_InterferenceFunctions/RectangularGrating.py"
+    "simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py"
+    "simulation/ex03_InterferenceFunctions/TriangularRipple.py"
+    "simulation/ex04_ComplexShapes/CoreShellNanoparticles.py"
+    "simulation/ex04_ComplexShapes/CustomFormFactor.py"
+    "simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py"
+    "simulation/ex04_ComplexShapes/LargeParticlesFormFactor.py"
+    "simulation/ex05_BeamAndDetector/BeamDivergence.py"
+    "simulation/ex05_BeamAndDetector/DetectorResolutionFunction.py"
+    "simulation/ex05_BeamAndDetector/OffSpecularSimulation.py"
+    "simulation/ex05_BeamAndDetector/RectangularDetector.py"
+    "simulation/ex05_BeamAndDetector/SpecularSimulation.py"
+    "simulation/ex06_Miscellaneous/AxesInDifferentUnits.py"
+    "fitting/ex01_SampleParametersIntro/SampleParametersIntro.py"
+    )
+
+# for some reason these flags aren't propagated here by SetUpWindows.cmake
+if(MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc ")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHsc ")
+	add_definitions(-DYAML_CPP_DLL)
+endif()
+
+include_directories(
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${YAMLCPP_INCLUDE_DIR}
+    ${CMAKE_SOURCE_DIR}/Core/Simulation
+    ${CMAKE_CURRENT_SOURCE_DIR}/../../TestMachinery
+)
+
+add_executable(PyPersistenceTest RunPyPersistenceTest.cpp PyPersistenceTest.h PyPersistenceTest.cpp)
+target_link_libraries(PyPersistenceTest BornAgainCore BornAgainTestMachinery)
+foreach(example ${PY_EXAMPLES})
+    set(script ${PY_EXAMPLES_DIR}/${example})
+    get_filename_component(script_dir  ${script} DIRECTORY)
+    get_filename_component(script_name ${script} NAME_WE)
+    get_filename_component(script_ext  ${script} EXT)
+    if (NOT ${script_ext} STREQUAL ".py" )
+        message(SEND_ERROR
+            "Unexpected file name extension '${script_ext}' in Python script ${script}")
+        continue()
+    endif()
+    add_test(PyPersistenceTest/${script_name}
+        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/PyPersistenceTest ${script_dir} ${script_name})
+endforeach()
diff --git a/Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp b/Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp
new file mode 100644
index 0000000..380b1be
--- /dev/null
+++ b/Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp
@@ -0,0 +1,206 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp
+//! @brief     Implements class PyPersistenceTest
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "PyPersistenceTest.h"
+#include "FileSystem.h"
+#include "GISASSimulation.h"
+#include "IntensityDataFunctions.h"
+#include "IntensityDataIOFactory.h"
+#include "PythonFormatting.h"
+#include "SimulationFactory.h"
+#include "Utils.h"
+#include <yaml-cpp/yaml.h>
+#include <cstdio>
+#include <fstream>
+#include <sstream>
+#include <iomanip>
+
+PyPersistenceTest::PyPersistenceTest(
+    const std::string& directory, const std::string& name)
+    : IReferencedTest(name, "persistence test on script "+name, 2e-10)
+    , m_directory(directory)
+{}
+
+//! Runs a Python script, and returns true if the output of the script agrees with reference data.
+bool PyPersistenceTest::runTest()
+{
+    // Remove old output
+    for (const std::string& fname:
+             FileSystem::reglob(PYPERSIST_OUT_DIR, getName()+"\\.\\w+\\..+")) {
+        std::remove( fname.c_str() );
+        std::cout << "Removed old output " << fname.c_str() << "\n";
+    }
+
+    // Run Python script
+    std::string pyscript_filename = FileSystem::GetJoinPath(m_directory, getName()+".py");
+    std::string dat_stem = FileSystem::GetJoinPath(PYPERSIST_OUT_DIR, getName());
+    if (!runPython(pyscript_filename + " " + dat_stem))
+        return false;
+
+    // Retrieve new output and reference files
+    std::map<const std::string, const std::string> dat = glob2map(PYPERSIST_OUT_DIR, getName());
+    std::map<const std::string, const std::string> ref = glob2map(PYPERSIST_REF_DIR, getName());
+    if (dat.size()==0) {
+        std::cerr << "There is no test output of form " << dat_stem << ".*.*\n";
+        return false;
+    }
+    // Compare the keys in the file names
+    if (!compareFileMaps(dat, ref))
+        return false;
+
+    // Compare files one by one
+    for (auto const& it: dat)
+        if (!compareFilePair(
+                FileSystem::GetJoinPath(PYPERSIST_OUT_DIR, it.second),
+                FileSystem::GetJoinPath(PYPERSIST_REF_DIR, ref[it.first])))
+            return false;
+    return true;
+}
+
+//! Globs for files of form *.<key1>.<key2>[.*], and returns a map with keys of the form
+//! <key1>.<key2>, and values containing full file paths.
+std::map<const std::string, const std::string>
+PyPersistenceTest::glob2map(const std::string& dir, const std::string& stem)
+{
+    std::map<const std::string, const std::string> ret;
+    for (const std::string& fname: FileSystem::reglob(dir, stem+"\\.\\w+\\..+")) {
+        std::vector<std::string> fname_segments =
+            Utils::String::split(FileSystem::filename(fname), ".");
+        ret.insert(make_pair(fname_segments[1]+"."+fname_segments[2], fname));
+    }
+    return ret;
+}
+
+//! Returns true if two file maps have the same set of keys.
+bool PyPersistenceTest::compareFileMaps(
+    const std::map<const std::string, const std::string>& dat,
+    const std::map<const std::string, const std::string>& ref)
+{
+    bool success = true;
+    // All dat files present in ref?
+    for (auto const& it: dat) {
+        if (ref.find(it.first)==ref.end()) {
+            std::cerr << "For test output " << it.second
+                      << " there is no reference file in " << PYPERSIST_REF_DIR << "\n";
+            success = false;
+        }
+    }
+    // All ref files present in dat?
+    for (auto const& it: ref) {
+        if (dat.find(it.first)==dat.end()) {
+            std::cerr << "For reference file " << it.second
+                      << " there is no test output in " << PYPERSIST_OUT_DIR << "\n";
+            success = false;
+        }
+    }
+    return success;
+}
+
+//! Returns true if test output and reference file agree.
+bool PyPersistenceTest::compareFilePair(
+    const std::string& dat_fpath, const std::string& ref_fpath)
+{
+    std::cout << "Comparing dat='" << dat_fpath << "' with ref='" << ref_fpath << "':\n";
+    const std::string extension = Utils::String::split(FileSystem::filename(dat_fpath), ".")[2];
+    if ( extension=="int" )
+        return compareIntensityPair( dat_fpath, ref_fpath );
+    if ( extension=="yaml" )
+        return compareYamlPair( dat_fpath, ref_fpath );
+    std::cerr << "Failed: Unsupported file type '" << extension << "'\n";
+    return false;
+}
+
+//! Returns true if intensity maps from test output and reference file agree reasonably.
+bool PyPersistenceTest::compareIntensityPair(
+    const std::string& dat_fpath, const std::string& ref_fpath)
+{
+    const OutputData<double>* dat = IntensityDataIOFactory::readOutputData( dat_fpath );
+    const OutputData<double>* ref = IntensityDataIOFactory::readOutputData( ref_fpath );
+    return compareIntensityMaps(*dat, *ref);
+}
+
+//! Returns true if YAML files from test output and reference agree.
+bool PyPersistenceTest::compareYamlPair(
+    const std::string& dat_fpath, const std::string& ref_fpath)
+{
+    std::fstream fdat(dat_fpath);
+    std::fstream fref(ref_fpath);
+    return compareYamlNode( YAML::Load(fdat), YAML::Load(fref) );
+}
+
+//! Returns true if all entries of the two YAML files agree.
+//! Floating-point entries must agree within a certain tolerance.
+//! The investigation is performed recursively, iterating over all lists and maps.
+bool PyPersistenceTest::compareYamlNode(const YAML::Node& dat, const YAML::Node& ref)
+{
+    if (dat.Type() != ref.Type()) {
+        std::cerr << "YAML node type differs: " << dat.Type() << " vs " << ref.Type() << "\n";
+        return false;
+    }
+    if      (dat.Type()==YAML::NodeType::Undefined)
+        throw std::runtime_error("Invalid node type 'Undefined' in YAML tree");
+    else if (dat.Type()==YAML::NodeType::Null)
+        throw std::runtime_error("Invalid node type 'Null' in YAML tree");
+    else if (dat.Type()==YAML::NodeType::Sequence) {
+        if (dat.size()!=ref.size()) {
+            std::cerr << "lists have different length\n";
+            return false;
+        }
+        for (size_t i=0; i<dat.size(); ++i) {
+            if (!compareYamlNode(dat[i], ref[i])) {
+                std::cerr << "at list position " << i << "\n";
+                return false;
+            }
+        }
+    } else if (dat.Type()==YAML::NodeType::Map) {
+        for (const auto& it_ref: ref) {
+            const YAML::Node& datval = dat[it_ref.first.as<std::string>()];
+            if (!datval) {
+                std::cerr << "map entry [" << it_ref.first << "] has no correspondence in dat\n";
+                return false;
+            }
+        }
+        for (const auto& it_dat: dat) {
+            const YAML::Node& refval = ref[it_dat.first.as<std::string>()];
+            if (!refval) {
+                std::cerr << "map entry [" << it_dat.first << "] has no correspondence in ref\n";
+                return false;
+            }
+            if (!compareYamlNode(it_dat.second, refval)) {
+                std::cerr << "at map entry [" << it_dat.first << "]\n";
+                return false;
+            }
+        }
+        return true;
+    } else if (dat.Type()==YAML::NodeType::Scalar) {
+        if (dat.as<std::string>() == ref.as<std::string>())
+            return true;
+        try {
+            double d = dat.as<double>();
+            double r = ref.as<double>();
+            const double tol = 1e-1;
+            if (std::abs(d-r)>(std::abs(d)+std::abs(r))*tol) {
+                std::cerr << "numbers differ: " << dat << " vs " << ref << "\n";
+                return false;
+            }
+            return true;
+        } catch(...) {
+            std::cerr << "scalar entries differ: '" << dat << "' vs '" << ref << "'\n";
+            return false;
+        }
+    } else
+        throw std::runtime_error("Bug in PyPersistenceTest::compareYamlNode: unexpected node type");
+    return true;
+}
diff --git a/Tests/Functional/PyCore/persistence/PyPersistenceTest.h b/Tests/Functional/PyCore/persistence/PyPersistenceTest.h
new file mode 100644
index 0000000..5d48ac2
--- /dev/null
+++ b/Tests/Functional/PyCore/persistence/PyPersistenceTest.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/PyCore/persistence/PyPersistenceTest.h
+//! @brief     Defines class PyPersistenceTest
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef PYPERSISTENCETEST_H
+#define PYPERSISTENCETEST_H
+
+#include "IReferencedTest.h"
+#include "OutputData.h"
+#include <map>
+#include <string>
+
+namespace YAML {
+    class Node;
+}
+
+//! @class PyPersistenceTest
+//! @ingroup standard_samples
+//! @brief A functional test that runs a Python script and compares its output with a reference.
+//!   Invoked from RunPyPersistenceTest.
+
+class PyPersistenceTest : public IReferencedTest
+{
+public:
+    PyPersistenceTest(const std::string& directory, const std::string& name);
+    ~PyPersistenceTest() final {}
+
+    bool runTest() final;
+
+private:
+    std::string m_directory;
+
+    static std::map<const std::string, const std::string>
+        glob2map(const std::string& dir, const std::string& stem);
+
+    bool compareFileMaps(
+        const std::map<const std::string, const std::string>& dat,
+        const std::map<const std::string, const std::string>& ref);
+    static bool compareFilePair(
+        const std::string& dat_fname, const std::string& ref_fname);
+    static bool compareIntensityPair(
+        const std::string& dat_fname, const std::string& ref_fname);
+    static bool compareYamlPair(
+        const std::string& dat_fname, const std::string& ref_fname);
+    static bool compareYamlNode(
+        const YAML::Node& dat, const YAML::Node& ref);
+};
+
+#endif // PYPERSISTENCETEST_H
diff --git a/Tests/Functional/PyCore/persistence/RunPyPersistenceTest.cpp b/Tests/Functional/PyCore/persistence/RunPyPersistenceTest.cpp
new file mode 100644
index 0000000..d64b269
--- /dev/null
+++ b/Tests/Functional/PyCore/persistence/RunPyPersistenceTest.cpp
@@ -0,0 +1,32 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/PyCore/persistence/RunPyPersistenceTest.cpp
+//! @brief     Implements program PyPersistenceStandardTest, to run functional tests
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "PyPersistenceTest.h"
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+//! Runs PyPersistenceTest on a standard simulation indicated by argv[1].
+int main(int argc, char** argv)
+{
+    if(argc<3){
+        std::cout
+            << "Usage: " << argv[0] << " <directory> <script name>\n"
+            << "  where <script name> is the stem without extension '.py'\n";
+        std::exit(1);
+    }
+    PyPersistenceTest test(argv[1], argv[2]);
+    return test.runTest() ? 0 : 1;
+}
diff --git a/Tests/Functional/PyFit/CMakeLists.txt b/Tests/Functional/PyFit/CMakeLists.txt
new file mode 100644
index 0000000..009bc0e
--- /dev/null
+++ b/Tests/Functional/PyFit/CMakeLists.txt
@@ -0,0 +1,22 @@
+############################################################################
+# Tests/Functional/PyFit/CMakeLists.txt
+############################################################################
+
+file(GLOB sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.py")
+foreach(_src ${sources})
+    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${_src}
+        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_src} @ONLY)
+endforeach()
+
+set(tests
+    "testfit_UsingBuilder.py"
+    "fitsuite_api.py"
+#    "testfit_GSLLMA.py"
+#    "testfit_GSLMultiMin.py"
+#    "testfit_GSLSimAn.py"
+#    "testfit_Minuit2.py"
+)
+
+foreach(_test ${tests})
+    add_test(${_test} ${PYTHON_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_test})
+endforeach()
diff --git a/Tests/Functional/PyFit/README b/Tests/Functional/PyFit/README
new file mode 100644
index 0000000..4221b4c
--- /dev/null
+++ b/Tests/Functional/PyFit/README
@@ -0,0 +1,8 @@
+Collection of functional tests (Python)
+
+Collection of fitting tests for libBornAgainFit library.
+Different geometries, number of fit parameters, variety
+of minimizers and minimization strategies.
+
+Tests are executed automatically when user builds the
+whole project with 'check' target cmake; make check
diff --git a/Tests/Functional/PyFit/fitsuite_api.py b/Tests/Functional/PyFit/fitsuite_api.py
new file mode 100644
index 0000000..e1e6853
--- /dev/null
+++ b/Tests/Functional/PyFit/fitsuite_api.py
@@ -0,0 +1,73 @@
+"""
+Testing of python specific FitSuite API.
+"""
+import sys
+import os
+import unittest
+
+sys.path.append("@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
+import bornagain as ba
+
+class FitSuiteAPITest(unittest.TestCase):
+
+    def test_FitParameterSetIterator(self):
+        """
+        Testing of python iterator over defined fit parameters.
+        """
+        fitSuite = ba.FitSuite()
+        names = ["par1", "par2", "par3"]
+        values = [1.0, 2.0, 3.0]
+        for name, value in zip(names, values):
+            fitSuite.addFitParameter(name, value)
+
+        nn = 0
+        for par in fitSuite.fitParameters():
+            self.assertTrue(par.name() == names[nn])
+            self.assertTrue(par.value() == values[nn])
+            nn = nn+1
+
+        self.assertTrue(nn == 3)
+
+    def test_addFitParameter(self):
+        fitSuite = ba.FitSuite()
+        fitSuite.addFitParameter("par1", 1.0)
+        fitSuite.addFitParameter("par2", 2.0, ba.AttLimits.limited(10.0, 20.0), 0.02)
+        fitSuite.addFitParameter("par3", 3.0).setLowerLimited(30.0).setStep(0.03)
+        fitSuite.addFitParameter("par4", 4.0).setStep(0.04).setUpperLimited(40.0)
+        fitSuite.addFitParameter("par5", 5.0).setFixed()
+
+        par = fitSuite.fitParameters()[0]
+        self.assertEqual(par.name(), "par1")
+        self.assertEqual(par.value(), 1.0)
+        self.assertEqual(par.step(), 0.01)  # default step is 1% in FitSuite
+        self.assertTrue(par.limits().isLimitless())
+
+        par = fitSuite.fitParameters()[1]
+        self.assertEqual(par.name(), "par2")
+        self.assertEqual(par.value(), 2.0)
+        self.assertEqual(par.step(), 0.02)
+        self.assertTrue(par.limits().isLimited())
+        self.assertEqual(par.limits().lowerLimit(), 10.0)
+        self.assertEqual(par.limits().upperLimit(), 20.0)
+
+        par = fitSuite.fitParameters()[2]
+        self.assertEqual(par.name(), "par3")
+        self.assertEqual(par.value(), 3.0)
+        self.assertEqual(par.step(), 0.03)
+        self.assertTrue(par.limits().isLowerLimited())
+        self.assertEqual(par.limits().lowerLimit(), 30.0)
+
+        par = fitSuite.fitParameters()[3]
+        self.assertEqual(par.name(), "par4")
+        self.assertEqual(par.value(), 4.0)
+        self.assertEqual(par.step(), 0.04)
+        self.assertTrue(par.limits().isUpperLimited())
+        self.assertEqual(par.limits().upperLimit(), 40.0)
+
+        par = fitSuite.fitParameters()[4]
+        self.assertEqual(par.name(), "par5")
+        self.assertEqual(par.value(), 5.0)
+        self.assertTrue(par.limits().isFixed())
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyFit/fitting_utils.py b/Tests/Functional/PyFit/fitting_utils.py
new file mode 100644
index 0000000..6ccc3d5
--- /dev/null
+++ b/Tests/Functional/PyFit/fitting_utils.py
@@ -0,0 +1,89 @@
+import sys
+import os
+from __future__ import print_function
+
+sys.path.append(os.path.abspath(
+                os.path.join(os.path.split(__file__)[0], '..', '..', '..', 'lib')))
+
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+
+CYLINDER_HEIGHT = 5.0
+CYLINDER_RADIUS = 5.0
+
+def getReferenceParameters():
+    return [CYLINDER_HEIGHT, CYLINDER_RADIUS]
+
+
+def get_sample():
+    """
+    Returns test sample
+    """
+    global CYLINDER_HEIGHT
+    global CYLINDER_RADIUS
+    cylinder_ff = FormFactorCylinder(CYLINDER_HEIGHT, CYLINDER_RADIUS)
+    mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+    cylinder = Particle(mParticle, cylinder_ff)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder)
+    mAmbience = HomogeneousMaterial("Air", 0.0, 0.0)
+    air_layer = Layer(mAmbience)
+    air_layer.addLayout(particle_layout)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Returns test simulation
+    """
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(50, 0.0*degree, 2.0*degree, 50, 0.0*degree, 2.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    simulation.setBeamIntensity(1e10)
+    simulation.setSample(get_sample())
+    return simulation
+
+
+def get_real_data():
+    """
+    Returns 'real' data
+    """
+    simulation = get_simulation()
+    simulation.runSimulation()
+    return simulation.getIntensityData()
+
+
+def get_fit_suite(minimizer, algorithm):
+    """
+    Creates FitSuite fully ready for minimization
+    """
+    fit_suite = FitSuite()
+    fit_suite.addFitParameter("*Height", 4.*nanometer, 0.04*nanometer, Limits.limited(2.0, 8.0))
+    fit_suite.addFitParameter("*Radius", 6.*nanometer, 0.06*nanometer, Limits.limited(2.0, 8.0))
+    fit_suite.addSimulationAndRealData(get_simulation(), get_real_data())
+    fit_suite.setMinimizer(MinimizerFactory.createMinimizer(minimizer, algorithm))
+    return fit_suite
+
+
+def print_fit_results(fit_suite):
+    fitpars = fit_suite.getFitParameters()
+    refpars = getReferenceParameters()
+    print("-"*30)
+    print("RealTime  :", fit_suite.getMinimizer().getMinimizerName(),
+          fit_suite.getMinimizer().getAlgorithmName())
+    print("RealTime  : {0:.3f} sec".format(fit_suite.getRunTime()))
+    print("NCalls    : {0:<5d}".format(fit_suite.getNCalls()))
+    for i in range(0, fitpars.size()):
+        print('par{0:2d}     : {1:.4f} ({2:.3g}) '.format(
+            i, fitpars[0].getValue(), fitpars[i].getValue() - refpars[i]))
+
+
+def run_fit_suite(minimizer, algorithm=""):
+    fit_suite = get_fit_suite(minimizer, algorithm)
+    fit_suite.initPrint(100 )
+    fit_suite.runFit()
+    print_fit_results(fit_suite)
+    return fit_suite.getFitParameters().getValues(), getReferenceParameters()
diff --git a/Tests/Functional/PyFit/testfit_GSLLMA.py b/Tests/Functional/PyFit/testfit_GSLLMA.py
new file mode 100644
index 0000000..c86cb2a
--- /dev/null
+++ b/Tests/Functional/PyFit/testfit_GSLLMA.py
@@ -0,0 +1,22 @@
+import sys
+import os
+import fitting_utils
+import unittest
+
+sys.path.append(os.path.abspath(
+                os.path.join(os.path.split(__file__)[0],
+                '..', '..', '..', 'lib')))
+
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+
+class MinimizersTest_GSLLMA(unittest.TestCase):
+    def test_GSLLMA(self):
+        fitpars, refpars = fitting_utils.run_fit_suite("GSLLMA")
+        for i in range(0, len(fitpars)):
+            self.assertAlmostEqual(fitpars[i], refpars[i], delta=1e-3)
+
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
diff --git a/Tests/Functional/PyFit/testfit_GSLMultiMin.py b/Tests/Functional/PyFit/testfit_GSLMultiMin.py
new file mode 100644
index 0000000..85d2986
--- /dev/null
+++ b/Tests/Functional/PyFit/testfit_GSLMultiMin.py
@@ -0,0 +1,28 @@
+import sys
+import os
+import fitting_utils
+import unittest
+
+sys.path.append(os.path.abspath(
+                os.path.join(os.path.split(__file__)[0],
+                '..', '..', '..', 'lib')))
+
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+
+class MinimizersTest_GSLMultiMin(unittest.TestCase):
+
+    def test_GSLMultiMin_BFGS(self):
+        fitpars, refpars = fitting_utils.run_fit_suite("GSLMultiMin", "BFGS")
+        for i in range(0, len(fitpars)):
+            self.assertAlmostEqual(fitpars[i], refpars[i], delta=1e-3)
+
+    #def test_GSLMultiMin_SteepestDescent(self):
+    #    fitpars, refpars = fitting_utils.run_fit_suite("GSLMultiMin", "SteepestDescent")
+    #    for i in range(0, len(fitpars)):
+    #        self.assertAlmostEqual(fitpars[i], refpars[i], delta=1e-3)
+
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
diff --git a/Tests/Functional/PyFit/testfit_GSLSimAn.py b/Tests/Functional/PyFit/testfit_GSLSimAn.py
new file mode 100644
index 0000000..09c785c
--- /dev/null
+++ b/Tests/Functional/PyFit/testfit_GSLSimAn.py
@@ -0,0 +1,23 @@
+import sys
+import os
+import fitting_utils
+import unittest
+
+sys.path.append(os.path.abspath(
+                os.path.join(os.path.split(__file__)[0],
+                '..', '..', '..', 'lib')))
+
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+
+class MinimizersTest_GSLSimAn(unittest.TestCase):
+
+    def test_GSLSimAn(self):
+        fitpars, refpars = fitting_utils.run_fit_suite("GSLSimAn")
+        for i in range(0, len(fitpars)):
+            self.assertAlmostEqual(fitpars[i], refpars[i], delta=0.2)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyFit/testfit_Genetic.py b/Tests/Functional/PyFit/testfit_Genetic.py
new file mode 100644
index 0000000..ec5af05
--- /dev/null
+++ b/Tests/Functional/PyFit/testfit_Genetic.py
@@ -0,0 +1,33 @@
+import sys
+import os
+import fitting_utils
+import unittest
+
+sys.path.append(os.path.abspath(
+                os.path.join(os.path.split(__file__)[0],
+                '..', '..', '..', 'lib')))
+
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+
+
+class MinimizersTest_Genetic(unittest.TestCase):
+
+    def test_Genetic(self):
+        fit_suite = fitting_utils.get_fit_suite("Genetic","")
+        fit_suite.getMinimizer().getOptions().setMaxIterations(5)
+
+        fit_suite.initPrint(100 )
+        fit_suite.runFit()
+        fitting_utils.print_fit_results(fit_suite)
+
+        fitpars = fit_suite.getFitParameters().getValues()
+        refpars = fitting_utils.getReferenceParameters()
+
+        for i in range(0, len(fitpars)):
+            self.assertAlmostEqual(fitpars[i], refpars[i], delta=0.1)
+
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
diff --git a/Tests/Functional/PyFit/testfit_Minuit2.py b/Tests/Functional/PyFit/testfit_Minuit2.py
new file mode 100644
index 0000000..2758202
--- /dev/null
+++ b/Tests/Functional/PyFit/testfit_Minuit2.py
@@ -0,0 +1,28 @@
+import sys
+import os
+import fitting_utils
+import unittest
+
+sys.path.append(os.path.abspath(
+                os.path.join(os.path.split(__file__)[0],
+                '..', '..', '..', 'lib')))
+
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+
+class MinimizersTest_Minuit2(unittest.TestCase):
+
+    def test_minuit2_migrad(self):
+        fitpars, refpars = fitting_utils.run_fit_suite("Minuit2", "Migrad")
+        for i in range(0, len(fitpars)):
+            self.assertAlmostEqual(fitpars[i], refpars[i], delta=1e-3)
+
+    def test_minuit2_fumili(self):
+        fitpars, refpars = fitting_utils.run_fit_suite("Minuit2", "Fumili")
+        for i in range(0, len(fitpars)):
+            self.assertAlmostEqual(fitpars[i], refpars[i], delta=1e-3)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/Tests/Functional/PyFit/testfit_UsingBuilder.py b/Tests/Functional/PyFit/testfit_UsingBuilder.py
new file mode 100644
index 0000000..8e46f7f
--- /dev/null
+++ b/Tests/Functional/PyFit/testfit_UsingBuilder.py
@@ -0,0 +1,156 @@
+# functional test: fitting using sample builder
+#
+# This test shows how to use SampleBuilder class for constructing the sample
+# and running fitting.
+
+from __future__ import print_function
+import sys
+import ctypes
+import math
+
+sys.path.append("@CMAKE_LIBRARY_OUTPUT_DIRECTORY@")
+from bornagain import *
+
+# values we want to find
+cylinder_height = 5.0*nanometer
+cylinder_radius = 5.0*nanometer
+prism3_half_side = 5.0*nanometer
+prism3_height = 5.0*nanometer
+cylinder_ratio = 0.2
+
+
+def runTest():
+    """
+    run minimization using sample builder
+    """
+
+    # setting sample builder to initial values
+    sample_builder = MySampleBuilder()
+    sample_builder.setParameterValue("cylinder_height", cylinder_height)
+    sample_builder.setParameterValue("cylinder_radius", cylinder_radius)
+    sample_builder.setParameterValue("prism3_half_side", prism3_half_side)
+    sample_builder.setParameterValue("prism3_height", prism3_height)
+    sample_builder.setParameterValue("cylinder_ratio", cylinder_ratio)
+
+    simulation = createSimulation()
+    simulation.setSampleBuilder(sample_builder)
+
+    real_data = createRealData(simulation)
+
+    # setting up fitting
+    fitSuite = FitSuite()
+    fitSuite.setMinimizer("Minuit2", "Combined")
+    fitSuite.initPrint(10)
+    fitSuite.addFitParameter(
+        "*SampleBuilder/cylinder_height",  4*nanometer,  AttLimits.lowerLimited(0.01))
+    fitSuite.addFitParameter(
+        "*SampleBuilder/cylinder_radius",  6*nanometer,  AttLimits.lowerLimited(0.01))
+    fitSuite.addFitParameter(
+        "*SampleBuilder/prism3_half_side", 4*nanometer,  AttLimits.lowerLimited(0.01))
+    fitSuite.addFitParameter(
+        "*SampleBuilder/prism3_height",    6*nanometer,  AttLimits.lowerLimited(0.01))
+    fitSuite.addFitParameter(
+        "*SampleBuilder/cylinder_ratio", 0.2, AttLimits.fixed())
+
+    # chiModule = ChiSquaredModule()
+    # chiModule.setChiSquaredFunction( SquaredFunctionMeanSquaredError() )
+
+    # fitSuite.addSimulationAndRealData(simulation, real_data, chiModule)
+    fitSuite.addSimulationAndRealData(simulation, real_data)
+    fitSuite.runFit()
+
+    # analysing fit results
+    initialParameters = [ cylinder_height, cylinder_radius,
+                          prism3_half_side, prism3_height, cylinder_ratio]
+    results = fitSuite.fitParameters().values()
+    threshold = 1.0e-02
+    status = "OK"
+    for i in range(0, len(initialParameters)):
+        diff = abs(results[i] - initialParameters[i])/initialParameters[i]
+        if(diff > threshold): status = "FAILED"
+
+    return "TestFit02", "Fitting using sample builder.", status
+
+
+# create simulation
+def createSimulation():
+    simulation = GISASSimulation()
+    simulation.setDetectorParameters(50, 0.0*degree, 2.0*degree, 50, 0.0*degree, 2.0*degree)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    #simulation.setBeamIntensity(1e10);
+    return simulation
+
+
+# generating "real" data by adding noise to the simulated data
+def createRealData(simulation):
+    simulation.runSimulation()
+    real_data = simulation.getIntensityData()
+    noise_factor = 0.1
+    for i in range(0, real_data.getTotalNumberOfBins()):
+        amplitude = real_data.getBinContent(i)
+        sigma = noise_factor*math.sqrt(amplitude)
+        noisy_amplitude = GenerateNormalRandom(amplitude, sigma)
+        if noisy_amplitude < 0.0:
+            noisy_amplitude = 0.0
+        real_data.setBinContent(i, noisy_amplitude)
+    return real_data
+
+
+# ----------------------------------------------------------------------------
+# Sample builder to build mixture of cylinders and prisms on top of substrate
+# 5 parameters
+# ----------------------------------------------------------------------------
+class MySampleBuilder(IMultiLayerBuilder):
+    def __init__(self):
+        IMultiLayerBuilder.__init__(self)
+        print("MySampleBuilder ctor")
+        self.sample = None
+        # parameters describing the sample
+        self.cylinder_height = ctypes.c_double(5.0*nanometer)
+        self.cylinder_radius = ctypes.c_double(5.0*nanometer)
+        self.prism3_half_side = ctypes.c_double(5.0*nanometer)
+        self.prism3_height = ctypes.c_double(5.0*nanometer)
+        self.cylinder_ratio = ctypes.c_double(0.2)
+        # register parameters
+        self.registerParameter("cylinder_height", ctypes.addressof(self.cylinder_height)).\
+            setUnit("nm").setNonnegative()
+        self.registerParameter("cylinder_radius", ctypes.addressof(self.cylinder_radius)).\
+            setUnit("nm").setNonnegative()
+        self.registerParameter("prism3_half_side", ctypes.addressof(self.prism3_half_side)).\
+            setUnit("nm").setNonnegative()
+        self.registerParameter("prism3_height", ctypes.addressof(self.prism3_height)).\
+            setUnit("nm").setNonnegative()
+        self.registerParameter("cylinder_ratio", ctypes.addressof(self.cylinder_ratio)).\
+            setNonnegative()
+
+    # constructs the sample for current values of parameters
+    def buildSample(self):
+        multi_layer = MultiLayer()
+        air_material = HomogeneousMaterial("Air", 0.0, 0.0)
+        substrate_material = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+        mParticle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+        air_layer = Layer(air_material)
+        substrate_layer = Layer(substrate_material)
+
+        cylinder_ff = FormFactorCylinder(self.cylinder_height.value, self.cylinder_radius.value)
+        prism_ff = FormFactorPrism3(self.prism3_height.value, self.prism3_half_side.value)
+        cylinder = Particle(mParticle, cylinder_ff)
+        prism = Particle(mParticle, prism_ff)
+        interference = InterferenceFunctionNone()
+
+        particle_layout = ParticleLayout()
+        particle_layout.addParticle(cylinder, self.cylinder_ratio.value)
+        particle_layout.addParticle(prism, 1.0 - self.cylinder_ratio.value)
+        particle_layout.addInterferenceFunction(interference)
+
+        air_layer.addLayout(particle_layout)
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(substrate_layer)
+        return multi_layer
+
+
+if __name__ == '__main__':
+    name, description, status = runTest()
+    print(name, description, status)
+    if "FAILED" in status:
+        exit(1)
diff --git a/Tests/Functional/README b/Tests/Functional/README
new file mode 100644
index 0000000..a1a9def
--- /dev/null
+++ b/Tests/Functional/README
@@ -0,0 +1,13 @@
+Collection of C++ and Python functional tests for BornAgain libraries
+
+Content:
+  ./Core    - C++ tests of libBornAgainCore library using variety of
+              scattering geometries and experimental settings
+  ./PyCore  - same for Python
+  ./Fit     - C++ tests of libBornAgainFit library using different
+              fitting strategies
+  ./PyFit   - same for Python
+  ./GUI     - testing of GUI functionality on model side
+
+See also:
+  http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/wiki/Creation_of_new_functional_test
diff --git a/Tests/Functional/TestMachinery/CMakeLists.txt b/Tests/Functional/TestMachinery/CMakeLists.txt
new file mode 100644
index 0000000..c5bc9a8
--- /dev/null
+++ b/Tests/Functional/TestMachinery/CMakeLists.txt
@@ -0,0 +1,59 @@
+############################################################################
+# CMakeLists.txt file for building libBornAgainCore library
+############################################################################
+
+set(library_name BornAgainTestMachinery)
+
+if(POLICY CMP0042)
+    cmake_policy(SET CMP0042 NEW)
+endif()
+
+# --- source and include files ---------
+set(include_dirs ${BUILD_INC_DIR} ${CORE_SOURCE_DIRS} ${GSL_INCLUDE_DIR}
+    ${CMAKE_SOURCE_DIR}/Fit/Parameters # for INamed.h
+    ${CMAKE_SOURCE_DIR}/Fit/Utils
+    )
+
+include_directories(${include_dirs})
+
+file(GLOB source_files "*.cpp")
+file(GLOB include_files "*.h")
+
+if(WIN32)
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBA_CORE_BUILD_DLL")
+endif()
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPYTHON_EXECUTABLE=\\\"${PYTHON_EXECUTABLE}\\\"")
+
+# --- making library ---------
+add_library(
+    ${library_name}
+    SHARED
+    ${source_files} ${include_files}
+    )
+
+set_Target_properties(${library_name} PROPERTIES PREFIX ${libprefix} SUFFIX ${libsuffix})
+set(${library_name}_LIBRARY_TYPE SHARED)
+
+# exposing library name and list of include directories outside
+set(${library_name}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+
+
+# --- external dependencies ---------
+
+target_link_libraries(${library_name}
+    ${BornAgainCore_LIBRARY}
+    ${CMAKE_THREAD_LIBS_INIT}
+    ${YAMLCPP_LIBRARY}
+    )
+
+if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
+    set(link_flags "-Wl,-rpath, at loader_path/../../Frameworks")
+    set_target_properties(${library_name} PROPERTIES LINK_FLAGS ${link_flags})
+endif()
+
+# --- installation ---------
+
+#install (TARGETS ${library_name} DESTINATION ${destination_lib} COMPONENT Libraries)
+#install (FILES ${include_files} DESTINATION ${destination_include} COMPONENT Headers)
diff --git a/Tests/Functional/TestMachinery/IFunctionalTest.h b/Tests/Functional/TestMachinery/IFunctionalTest.h
new file mode 100644
index 0000000..6505504
--- /dev/null
+++ b/Tests/Functional/TestMachinery/IFunctionalTest.h
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/IFunctionalTest.h
+//! @brief     Defines and implements pure virtual base class IFunctionalTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IFUNCTIONALTEST_H
+#define IFUNCTIONALTEST_H
+
+#include "INamed.h"
+#include <map>
+
+//! Base class for all functional tests.
+//! @class IFunctionalTest
+
+class IFunctionalTest : public INamed
+{
+public:
+    IFunctionalTest() {}
+    IFunctionalTest(const std::string& name, const std::string& description)
+        : INamed(name), m_description(description) {}
+    virtual ~IFunctionalTest() {}
+
+    virtual bool runTest() = 0; //!< Returns true when successful
+
+    std::string getDescription() const { return m_description; }
+    void setDescription(const std::string& description) { m_description = description; }
+
+protected:
+    std::string m_description;
+};
+
+#endif // IFUNCTIONALTEST_H
diff --git a/Tests/Functional/TestMachinery/IReferencedTest.cpp b/Tests/Functional/TestMachinery/IReferencedTest.cpp
new file mode 100644
index 0000000..f4c5fb3
--- /dev/null
+++ b/Tests/Functional/TestMachinery/IReferencedTest.cpp
@@ -0,0 +1,65 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/IReferencedTest.cpp
+//! @brief     Implements pure virtual base class IReferencedTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IReferencedTest.h"
+#include "IntensityDataFunctions.h"
+#include <iostream>
+#include <cstdlib>
+
+//! Compares two intensity maps, and returns true unless they disagree beyond thier variability.
+bool IReferencedTest::compareIntensityMaps(
+    const OutputData<double>& dat, const OutputData<double>& ref)
+{
+    if( dat.getVariability() != ref.getVariability() ) {
+        std::cerr << "Failed: reproducibility threshold has changed from "
+                  << ref.getVariability()
+                  << " to " << dat.getVariability() << "\n";
+        return false;
+    }
+    double threshold = ref.getVariability();
+    double diff = IntensityDataFunctions::getRelativeDifference(dat, ref);
+    if ( diff > threshold ) {
+        std::cerr << "Failed: Relative difference between dat and ref = " << diff
+                  << " is above reproducibility threshold = " << threshold << "\n";
+        return false;
+    }
+    std::cout << "Relative difference between dat and ref = " << diff
+              << " is within reproducibility threshold = " << threshold << "\n";
+    return true;
+}
+
+#ifdef PYTHON_EXECUTABLE
+//! Runs a python command, prints messages, returns true unless the system call failed.
+bool IReferencedTest::runPython(const std::string& py_command)
+{
+#ifndef _WIN32
+    std::string sys_command = std::string("PYTHONPATH=") + BUILD_LIB_DIR + " " +
+        PYTHON_EXECUTABLE + " " + py_command;
+#else
+    std::string sys_command = std::string("set PYTHONPATH=") + BUILD_LIB_DIR + " & " +
+        PYTHON_EXECUTABLE + " " + py_command;
+#endif
+
+
+
+    std::cout << sys_command << std::endl/*sic*/; // flush output before calling std::system
+    int ret = std::system(sys_command.c_str());
+    if (ret!=0) {
+        std::cerr << "Command returned non-zero value " << ret << "\n";
+        return false;
+    }
+    return true;
+}
+#endif
diff --git a/Tests/Functional/TestMachinery/IReferencedTest.h b/Tests/Functional/TestMachinery/IReferencedTest.h
new file mode 100644
index 0000000..bf59e9f
--- /dev/null
+++ b/Tests/Functional/TestMachinery/IReferencedTest.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/IReferencedTest.h
+//! @brief     Defines pure virtual base class IReferencedTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IREFERENCEDTEST_H
+#define IREFERENCEDTEST_H
+
+#include "IFunctionalTest.h"
+#include "OutputData.h"
+#include <map>
+#include <string>
+
+//! Base class for tests that compare results with reference data.
+//! @ingroup standard_samples
+
+class BA_CORE_API_ IReferencedTest : public IFunctionalTest
+{
+public:
+    IReferencedTest();
+    IReferencedTest(const std::string& name, const std::string& description, double threshold)
+        : IFunctionalTest(name, description), m_threshold(threshold) {}
+    virtual ~IReferencedTest() {}
+
+    bool runTest() =0;
+
+protected:
+    double m_threshold;
+
+    static bool compareIntensityMaps(const OutputData<double>& dat, const OutputData<double>& ref);
+
+    static bool runPython(const std::string& py_command);
+};
+
+#endif // IREFERENCEDTEST_H
diff --git a/Tests/Functional/TestMachinery/IRegistry.h b/Tests/Functional/TestMachinery/IRegistry.h
new file mode 100644
index 0000000..8cf14b1
--- /dev/null
+++ b/Tests/Functional/TestMachinery/IRegistry.h
@@ -0,0 +1,60 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/IRegistry.h
+//! @brief     Defines templated registry for ICloneable objects
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef IREGISTRY_H
+#define IREGISTRY_H
+
+#include "Exceptions.h"
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+//! @class IRegistry
+//! @ingroup tools_internal
+//! @brief Templated object registry.
+
+template<class ValueType>
+class IRegistry
+{
+public:
+    const ValueType* getItem(const std::string& key) const {
+        auto it = m_data.find(key);
+        if(it == m_data.end())
+            throw Exceptions::UnknownClassRegistrationException(
+                "IRegistry::createItem() -> Error. Not existing item key '" + key + "'");
+        return it->second.get();
+    }
+
+    std::vector<std::string> keys() {
+        std::vector<std::string> result;
+        for( auto it=m_data.begin(); it!=m_data.end(); ++it )
+            result.push_back( it->first );
+        return result;
+    }
+
+protected:
+    void add(const std::string& key, ValueType* item) {
+        if(m_data.find(key) != m_data.end())
+            throw Exceptions::ExistingClassRegistrationException(
+                "IRegistry::createItem() -> Error. Already existing item with key '" + key + "'");
+        m_data[key] = std::unique_ptr<ValueType>(item);
+    }
+
+private:
+    std::map<std::string, std::unique_ptr<ValueType>> m_data;
+};
+
+#endif // IREGISTRY_H
diff --git a/Tests/Functional/TestMachinery/IStandardTest.cpp b/Tests/Functional/TestMachinery/IStandardTest.cpp
new file mode 100644
index 0000000..86cc026
--- /dev/null
+++ b/Tests/Functional/TestMachinery/IStandardTest.cpp
@@ -0,0 +1,106 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/IStandardTest.cpp
+//! @brief     Implements class IStandardTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IStandardTest.h"
+#include "StandardSimulationsRegistry.h"
+#include "GISASSimulation.h"
+#include "IFunctionalTest.h"
+#include "SampleBuilderFactory.h"
+#include "SimulationFactory.h"
+#include "SubtestRegistry.h"
+
+// ************************************************************************** //
+//  Test execution
+// ************************************************************************** //
+
+//! Runs test (name given as command-line argument), and returns true when successful
+
+bool IStandardTest::execute(int argc, char** argv) {
+    // parse command-line arguments and retrieve test info from registry
+    std::string test_name;
+    if(argc > 1)
+        test_name = std::string(argv[1]);
+    m_info = StandardSimulationsRegistry::instance().getItemOrExplain(test_name, getName());
+    if( !m_info )
+        throw Exceptions::RuntimeErrorException("IStandardTest -> Error in look up.");
+
+    if (m_info->m_subtest_type == "None")
+        return execute_onetest();
+    else
+        return execute_subtests();
+}
+
+//! Runs a single test, and returns true when successful
+
+bool IStandardTest::execute_onetest()
+{
+    setName( m_info->m_test_name );
+    return getTest()->runTest();
+}
+
+//! Runs all available subtests, and returns true if all succeed
+
+bool IStandardTest::execute_subtests()
+{
+    // initialize subtest registry
+    std::vector<std::string> subtest_names;
+    ISubtestRegistry* subtest_registry;
+    if       (m_info->m_subtest_type == "FormFactors") {
+        subtest_registry = new SubtestRegistryFormFactor;
+    } else if(m_info->m_subtest_type == "FTDistributions2D") {
+        subtest_registry = new SubtestRegistryFTDistribution2D;
+    } else
+        throw Exceptions::RuntimeErrorException("IStandardTest -> Error. "
+                                    "Unknown factory '"+m_info->m_subtest_type+"'.");
+    subtest_names = subtest_registry->keys();
+    size_t n_subtests = subtest_names.size();
+
+    // run and analyze subtests
+    int number_of_failed_tests = 0;
+    for (size_t i = 0; i < n_subtests; ++i) {
+        setName( m_info->m_test_name + "_" + subtest_names[i] );
+        m_subtest_item = subtest_registry->getItem(subtest_names[i]);
+        std::cout << "IStandardTest::execute() -> " << getName()
+                  << " " << i+1 << "/" << n_subtests << " (" << subtest_names[i] << ")\n";
+        if(!getTest()->runTest())
+            ++number_of_failed_tests;
+    }
+    delete subtest_registry;
+
+    // report overall result
+    std::cout << "summary: " << number_of_failed_tests << " of " << n_subtests <<
+        " subtests failed\n";
+    return number_of_failed_tests==0;
+}
+
+// ************************************************************************** //
+//  Functions called by getTest() in *Suite.cpp
+// ************************************************************************** //
+
+std::string IStandardTest::getTestDescription() const { return m_info->m_test_description; }
+
+double IStandardTest::getTestThreshold() const { return m_info->m_threshold; }
+
+GISASSimulation* IStandardTest::getSimulation() const
+{
+    std::shared_ptr<IMultiLayerBuilder> sample_builder(
+        SampleBuilderFactory().createItem(m_info->m_sample_builder_name) );
+    if(m_subtest_item)
+        sample_builder->set_subtest(m_subtest_item);
+
+    GISASSimulation* result = SimulationFactory().createItem(m_info->m_simulation_name);
+    result->setSampleBuilder(sample_builder);
+    return result;
+}
diff --git a/Tests/Functional/TestMachinery/IStandardTest.h b/Tests/Functional/TestMachinery/IStandardTest.h
new file mode 100644
index 0000000..2e6a6d1
--- /dev/null
+++ b/Tests/Functional/TestMachinery/IStandardTest.h
@@ -0,0 +1,80 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/IStandardTest.h
+//! @brief     Defines class IStandardTest.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ISTANDARDTEST_H
+#define ISTANDARDTEST_H
+
+#include "INamed.h"
+#include <memory>
+
+class GISASSimulation;
+class IFunctionalTest;
+class SimulationInfo;
+class IParameterized;
+
+//! Base class for Core/PyCore/GUI tests that involve standard simulations.
+//! @class IStandardTest
+
+//! For Foo in {Core, PyCore, GUI}, the functional test mechanism is as follows:
+//!
+//! FooStandardTest is the executable obtained from
+//!   main(argv,argc) in FooStandardTest.cpp,
+//! which runs
+//!   FooStandardTest().execute(argv,argc),
+//! which is inherited from here. This function,
+//!   IStandardTest::execute(argv,argc)
+//! uses argv[1] to retrieve a set of parameters from StandardSimulationsRegistry.
+//! Then it bifurcates into
+//!   IStandardTest::execute_onetest(argv,argc) or
+//!   IStandardTest::execute_subtests(argv,argc)
+//! which will call
+//!   IFunctionalTest::getTest(),
+//! which is the only nontrivial member of FooStandardTest, implemented in FooStandardTest.cpp.
+//! The return value
+//!   test = new FooTest( <parameters> )
+//! is provided by FooTest.cpp.
+//! The arguments in this constructor are callback functions provided by IStandardTest;
+//! they contain information gathered from StandardSimulationsRegistry, and possibly from
+//! a subtest registry.
+//! Finally, IStandardTest::execute_... will call
+//!   test->runTest()        // implemented in FooTest
+//!   test->analyseResults() // implemented in FooTest
+//!   test->getTestResult()  // implemented in IFunctionalTest
+
+class BA_CORE_API_ IStandardTest : public INamed
+{
+public:
+IStandardTest(const std::string& name) : INamed(name), m_subtest_item(nullptr) {}
+    virtual ~IStandardTest() {}
+
+    bool execute(int argc, char** argv);
+
+    //! Returns a specific standard functional test kernel like CoreTest, PyExportTest, GUITest.
+    virtual std::unique_ptr<IFunctionalTest> getTest() const = 0;
+
+protected:
+    virtual GISASSimulation* getSimulation() const;
+    std::string getTestDescription() const;
+    virtual double getTestThreshold() const;
+
+private:
+    const SimulationInfo* m_info;
+    const IParameterized* m_subtest_item;
+
+    bool execute_onetest();
+    bool execute_subtests();
+};
+
+#endif // ISTANDARDTEST_H
diff --git a/Tests/Functional/TestMachinery/SimulationInfo.cpp b/Tests/Functional/TestMachinery/SimulationInfo.cpp
new file mode 100644
index 0000000..7071da9
--- /dev/null
+++ b/Tests/Functional/TestMachinery/SimulationInfo.cpp
@@ -0,0 +1,36 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/SimulationInfo.cpp
+//! @brief     Implements class SimulationInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SimulationInfo.h"
+
+SimulationInfo::SimulationInfo()
+    : m_threshold(0.0)
+{
+}
+
+SimulationInfo::SimulationInfo(const std::string& test_name,
+                       const std::string& test_description,
+                       const std::string& simulation_name,
+                       const std::string& sample_builder_name,
+                       const std::string& subtest_type,
+                       double threshold)
+    : m_test_name(test_name)
+    , m_test_description(test_description)
+    , m_simulation_name(simulation_name)
+    , m_sample_builder_name(sample_builder_name)
+    , m_subtest_type(subtest_type)
+    , m_threshold(threshold)
+{
+}
diff --git a/Tests/Functional/TestMachinery/SimulationInfo.h b/Tests/Functional/TestMachinery/SimulationInfo.h
new file mode 100644
index 0000000..c4358ed
--- /dev/null
+++ b/Tests/Functional/TestMachinery/SimulationInfo.h
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/SimulationInfo.h
+//! @brief     Defines class SimulationInfo.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SIMULATIONINFO_H
+#define SIMULATIONINFO_H
+
+#include <string>
+
+//! @class SimulationInfo
+//! @ingroup standard_samples
+//! @brief Parameter set to describe a simulation example.
+//!   Used for communication from StandardSimulationsRegistry to IStandardTest.
+
+class SimulationInfo
+{
+public:
+    SimulationInfo();
+    SimulationInfo(const std::string& test_name,
+                       const std::string& test_description,
+                       const std::string& simulation_name,
+                       const std::string& sample_builder_name,
+                       const std::string& subtest_type,
+                       double threshold);
+
+    std::string m_test_name;
+    std::string m_test_description;
+    std::string m_simulation_name;
+    std::string m_sample_builder_name;
+    std::string m_subtest_type;
+    double m_threshold;
+};
+
+#endif // SIMULATIONINFO_H
diff --git a/Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp b/Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp
new file mode 100644
index 0000000..5528bc3
--- /dev/null
+++ b/Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp
@@ -0,0 +1,389 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp
+//! @brief     Implements class StandardSimulationsRegistry.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "StandardSimulationsRegistry.h"
+#include "Exceptions.h"
+#include "StringUtils.h"
+
+StandardSimulationsRegistry::StandardSimulationsRegistry()
+{
+    add("FormFactors",
+        "Test of all form factors defined",
+        "MiniGISAS",
+        "ParticleInTheAirBuilder",
+        "FormFactors",
+        2e-10);
+
+    add("FormFactorsAbs",
+        "Test of all form factors defined, absorption case",
+        "MiniGISAS_v2",
+        "LayersWithAbsorptionBuilder",
+        "FormFactors",
+        2e-10);
+
+    add("CylindersAndPrisms",
+        "Mixture of cylinders and prisms without interference",
+        "MiniGISAS",
+        "CylindersAndPrismsBuilder",
+        "None",
+        2e-10);
+
+    add("RadialParaCrystal",
+        "Interference function of radial paracrystal",
+        "MiniGISAS",
+        "RadialParaCrystalBuilder",
+        "None",
+        2e-10);
+
+    add("Basic2DParaCrystal",
+        "Interference function of basic 2D paracrystal with variety of FT distributions",
+        "MiniGISAS",
+        "Basic2DParaCrystalBuilder",
+        "FTDistributions2D",
+        2e-10);
+
+    add("HexParaCrystal",
+        "Interference function of 2D hexagonal paracrystal",
+        "MiniGISAS",
+        "HexParaCrystalBuilder",
+        "None",
+        2e-10);
+
+    add("Lattice1D",
+        "Interference function of 21D lattice",
+        "MiniGISAS",
+        "Lattice1DBuilder",
+        "None",
+        2e-10);
+
+    add("RectParaCrystal",
+        "Interference function of 2D rectanguler paracrystal",
+        "MiniGISAS",
+        "RectParaCrystalBuilder",
+        "None",
+        2e-10);
+
+    // --- CoreShell ---
+
+    add("CoreShellParticle",
+        "Core shell particle",
+        "MiniGISAS",
+        "CoreShellParticleBuilder",
+        "None",
+        2e-10);
+
+    add("CoreShellBoxRotateZandY",
+        "Rotation and translation of core shell box particle in 3 layers system",
+        "MiniGISAS",
+        "CoreShellBoxRotateZandYBuilder",
+        "None",
+        2e-10);
+
+    // ---
+
+    add("MultiLayerWithRoughness",
+        "Multilayer with roughness",
+        "MiniGISAS",
+        "MultiLayerWithRoughnessBuilder",
+        "None",
+        2e-10);
+
+    add("SquareLattice",
+        "Interference function of 2D square lattice",
+        "MiniGISAS",
+        "SquareLatticeBuilder",
+        "None",
+        2e-10);
+
+    add("CenteredSquareLattice",
+        "Interference function of 2D square lattice",
+        "MiniGISAS",
+        "CenteredSquareLatticeBuilder",
+        "None",
+        2e-10);
+
+    add("RotatedSquareLattice",
+        "Interference function of rotated 2D square lattice",
+        "MiniGISAS",
+        "RotatedSquareLatticeBuilder",
+        "None",
+        2e-10);
+
+    add("RotatedPyramids",
+        "Interference function of rotated 2D square lattice",
+        "MiniGISAS",
+        "RotatedPyramidsBuilder",
+        "None",
+        2e-10);
+
+    // --- Compositions ---
+
+    add("ParticleComposition",
+        "Two layers of spheres at hex lattice",
+        "MiniGISAS",
+        "ParticleCompositionBuilder",
+        "None",
+        2e-10);
+
+    add("BoxCompositionRotateX",
+        "Two boxes in particle composition rotated in X by 90 degrees",
+        "MiniGISAS",
+        "BoxCompositionRotateXBuilder",
+        "None",
+        2e-10);
+
+    add("BoxCompositionRotateY",
+        "Two boxes in particle composition rotated in Y by 90 degrees",
+        "MiniGISAS",
+        "BoxCompositionRotateYBuilder",
+        "None",
+        2e-10);
+
+    add("BoxCompositionRotateZ",
+        "Two boxes in particle composition rotated in Z by 90 degrees",
+        "MiniGISAS",
+        "BoxCompositionRotateZBuilder",
+        "None",
+        2e-10);
+
+    add("BoxCompositionRotateZandY",
+        "Two boxes in particle composition rotated in Z and Y by 90 degrees",
+        "MiniGISAS",
+        "BoxCompositionRotateZandYBuilder",
+        "None",
+        2e-10);
+
+    add("BoxStackComposition",
+        "Two different boxes are first rotated and then composed, composition is then rotated.",
+        "MiniGISAS",
+        "BoxStackCompositionBuilder",
+        "None",
+        2e-10);
+
+    // ---
+
+    add("CylindersWithSizeDistribution",
+        "Cylinders in BA with size distributions",
+        "MiniGISAS",
+        "CylindersWithSizeDistributionBuilder",
+        "None",
+        2e-10);
+
+    add("TwoTypesCylindersDistribution",
+        "Cylinders in BA with size distributions",
+        "MiniGISAS",
+        "TwoTypesCylindersDistributionBuilder",
+        "None",
+        2e-10);
+
+    add("BeamDivergence",
+        "Cylinders in BA in the presence of beam divergence",
+        "MiniGISASBeamDivergence",
+        "CylindersInBABuilder",
+        "None",
+        2e-10);
+
+    add("DetectorResolution",
+        "Cylinders in BA with detector resolution",
+        "MiniGISASDetectorResolution",
+        "CylindersInBABuilder",
+        "None",
+        2e-10);
+
+    add("MultipleLayout",
+        "Two types of particles in different layouts",
+        "MiniGISAS",
+        "MultipleLayoutBuilder",
+        "None",
+        2e-10);
+
+    add("ApproximationDA",
+        "Size distribution model: decoupling approximation",
+        "MiniGISAS",
+        "SizeDistributionDAModelBuilder",
+        "None",
+        2e-10);
+
+    add("ApproximationLMA",
+        "Size distribution model: local monodisperse approximation",
+        "MiniGISAS",
+        "SizeDistributionLMAModelBuilder",
+        "None",
+        2e-10);
+
+    add("ApproximationSSCA",
+        "Size distribution model: size space coupling approximation",
+        "MiniGISAS",
+        "SizeDistributionSSCAModelBuilder",
+        "None",
+        2e-10);
+
+    add("CylindersInSSCA",
+        "Size spacing correlation approximation",
+        "MiniGISAS",
+        "CylindersInSSCABuilder",
+        "None",
+        2e-10);
+
+    add("CosineRipple",
+        "Cosine ripple within radial paracrystal model",
+        "MiniGISAS",
+        "CosineRippleBuilder",
+        "None",
+        2e-10);
+
+    add("TriangularRipple",
+        "Triangular ripple within radial paracrystal model",
+        "MiniGISAS",
+        "TriangularRippleBuilder",
+        "None",
+        2e-10);
+
+    add("MesoCrystal",
+        "Cylindrical mesocrystal composed of spherical nano particles",
+        "MiniGISAS",
+        "MesoCrystalBuilder",
+        "None",
+        2e-10);
+
+    add("CustomMorphology",
+        "Custom particle mixture a la isgisaxs morphology approach",
+        "MiniGISAS",
+        "CustomMorphologyBuilder",
+        "None",
+        2e-10);
+
+    add("MagneticParticleZeroField",
+        "Magnetic cylinders with zero field",
+        "MiniGISAS",
+        "MagneticParticleZeroFieldBuilder",
+        "None",
+        2e-10);
+
+    add("TransformBox",
+        "Rotated/translated box in 3 layers system",
+        "MiniGISAS",
+        "TransformBoxBuilder",
+        "None",
+        1e-10);
+
+    // Masking
+
+    add("SimulationWithMasks",
+        "Various masks are added to the simulation",
+        "GISASWithMasks",
+        "CylindersAndPrismsBuilder",
+        "None",
+        1e-10);
+
+    // Various rectangular detector alignment
+
+    add("RectDetectorGeneric",
+        "Various masks are added to the simulation",
+        "RectDetectorGeneric",
+        "CylindersInBABuilder",
+        "None",
+        1e-10);
+
+    add("RectDetectorPerpToSample",
+        "Various masks are added to the simulation",
+        "RectDetectorPerpToSample",
+        "CylindersInBABuilder",
+        "None",
+        1e-10);
+
+    add("RectDetectorPerpToDirectBeam",
+        "Various masks are added to the simulation",
+        "RectDetectorPerpToDirectBeam",
+        "CylindersInBABuilder",
+        "None",
+        1e-10);
+
+    add("RectDetectorPerpToReflectedBeam",
+        "Various masks are added to the simulation",
+        "RectDetectorPerpToReflectedBeam",
+        "CylindersInBABuilder",
+        "None",
+        1e-10);
+
+    add("RectDetectorPerpToReflectedBeamDpos",
+        "Various masks are added to the simulation",
+        "RectDetectorPerpToReflectedBeamDpos",
+        "CylindersInBABuilder",
+        "None",
+        1e-10);
+
+    add("LargeCylindersMonteCarlo",
+        "Large cylinders simulated with MonteCarlo integration",
+        "MiniGISASMonteCarlo",
+        "LargeCylindersInDWBABuilder",
+        "None",
+        5e-1);
+
+    add("SphericalDetWithRoi",
+        "Spherical detector with ROI and mask defined",
+        "SphericalDetWithRoi",
+        "CylindersAndPrismsBuilder",
+        "None",
+        1e-10);
+
+    add("RectDetWithRoi",
+        "Rectangular detector with ROI and mask defined",
+        "RectDetWithRoi",
+        "CylindersAndPrismsBuilder",
+        "None",
+        1e-10);
+}
+
+void StandardSimulationsRegistry::add(
+    const std::string& test_name, const std::string& test_description,
+    const std::string& simulation_name, const std::string& sample_builder_name,
+    const std::string& subtest_type, double threshold )
+{
+    if( m_catalogue.find(test_name) != m_catalogue.end() )
+        throw Exceptions::ExistingClassRegistrationException(
+            "StandardSimulationsRegistry::add() -> Error. Existing item " + test_name);
+    m_catalogue[test_name] = SimulationInfo(
+        test_name, test_description, simulation_name,
+        sample_builder_name, subtest_type, threshold);
+}
+
+const SimulationInfo* StandardSimulationsRegistry::getItemOrExplain(
+    const std::string& test_name, const std::string& suite_name) const
+{
+    auto it = m_catalogue.find(test_name);
+    if( it == m_catalogue.end() ) {
+        if(test_name!="")
+            std::cout<<"There is no test named '"<< test_name << "'\n";
+        std::cout << "Usage: "<< suite_name << " <test_name>\n";
+        std::cout << "Available tests:\n";
+        printCatalogue(std::cout);
+        return nullptr;
+    }
+    return &(it->second);
+}
+
+void StandardSimulationsRegistry::printCatalogue(std::ostream& ostr) const
+{
+    for(auto it = m_catalogue.begin(); it != m_catalogue.end(); ++it) {
+        SimulationInfo info = it->second;
+        ostr << Utils::String::padRight(info.m_test_name, 20) << " | ";
+        ostr << Utils::String::padRight(info.m_test_description, 40) << " | ";
+        ostr << info.m_simulation_name << ", ";
+        ostr << info.m_sample_builder_name << ", ";
+        ostr << info.m_subtest_type;
+        ostr << "\n";
+    }
+}
diff --git a/Tests/Functional/TestMachinery/StandardSimulationsRegistry.h b/Tests/Functional/TestMachinery/StandardSimulationsRegistry.h
new file mode 100644
index 0000000..e124317
--- /dev/null
+++ b/Tests/Functional/TestMachinery/StandardSimulationsRegistry.h
@@ -0,0 +1,42 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/StandardSimulationsRegistry.h
+//! @brief     Defines class StandardSimulationsRegistry.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef STANDARDSIMULATIONSREGISTRY_H
+#define STANDARDSIMULATIONSREGISTRY_H
+
+#include "ISingleton.h"
+#include "SimulationInfo.h"
+#include <map>
+
+//! @class StandardSimulationsRegistry
+//! @ingroup standard_samples
+//! @brief Handles simulation infos, and contains hard-coded list of standard simulations.
+
+class StandardSimulationsRegistry : public ISingleton<StandardSimulationsRegistry>
+{
+public:
+    StandardSimulationsRegistry();
+    void add(const std::string& test_name, const std::string& test_description,
+             const std::string& simulation_name, const std::string& sample_builder_name,
+             const std::string& component_registry_name, double threshold);
+    const SimulationInfo* getItemOrExplain(
+        const std::string& test_name, const std::string& suite_name) const;
+    void printCatalogue(std::ostream& ostr) const;
+
+private:
+    std::map<std::string, SimulationInfo> m_catalogue;
+};
+
+#endif // STANDARDSIMULATIONSREGISTRY_H
diff --git a/Tests/Functional/TestMachinery/SubtestRegistry.cpp b/Tests/Functional/TestMachinery/SubtestRegistry.cpp
new file mode 100644
index 0000000..2740d33
--- /dev/null
+++ b/Tests/Functional/TestMachinery/SubtestRegistry.cpp
@@ -0,0 +1,98 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/SubtestRegistry.cpp
+//! @brief     Implements different registries for subtests of functional tests.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "SubtestRegistry.h"
+#include "BornAgainNamespace.h"
+#include "HardParticles.h"
+#include "Units.h"
+
+// ************************************************************************** //
+SubtestRegistryFTDistribution2D::SubtestRegistryFTDistribution2D()
+// ************************************************************************** //
+{
+    add(BornAgain::FTDistribution2DCauchyType, new FTDistribution2DCauchy(0.5, 1.0));
+    add(BornAgain::FTDistribution2DGaussType, new FTDistribution2DGauss(0.5, 1.0));
+    add(BornAgain::FTDistribution2DGateType, new FTDistribution2DGate(0.5, 1.0));
+    add(BornAgain::FTDistribution2DConeType, new FTDistribution2DCone(0.5, 1.0));
+    add(BornAgain::FTDistribution2DVoigtType, new FTDistribution2DVoigt(0.5, 1.0, 0.2));
+}
+
+// ************************************************************************** //
+SubtestRegistryFormFactor::SubtestRegistryFormFactor()
+// ************************************************************************** //
+{
+    add(BornAgain::FFAnisoPyramidType,
+        new FormFactorAnisoPyramid(10.0, 20.0, 5.0, Units::deg2rad(54.73 )));
+
+    add(BornAgain::FFBoxType,
+        new FormFactorBox(10.0, 20.0, 5.0));
+
+    add(BornAgain::FFConeType,
+        new FormFactorCone(5.0, 6.0, Units::deg2rad(54.73 )));
+
+    add(BornAgain::FFCone6Type,
+        new FormFactorCone6(2./sqrt(3.)*5.0, 5.0, Units::deg2rad(54.73)));
+
+    add(BornAgain::FFCuboctahedronType,
+        new FormFactorCuboctahedron(10.0, 5.0, 1.0, Units::deg2rad(54.73 )));
+
+    add(BornAgain::FFCylinderType,
+        new FormFactorCylinder(5.0, 10.0));
+
+    add(BornAgain::FFDodecahedronType,
+        new FormFactorDodecahedron(5.0));
+
+    add(BornAgain::FFEllipsoidalCylinderType,
+        new FormFactorEllipsoidalCylinder(5.0, 10.0, 15.0));
+
+    add(BornAgain::FFFullSphereType,
+        new FormFactorFullSphere(5.0));
+
+    add(BornAgain::FFFullSpheroidType,
+        new FormFactorFullSpheroid(5.0, 10.0));
+
+    add(BornAgain::FFHemiEllipsoidType,
+        new FormFactorHemiEllipsoid(5.0, 10.0, 15.0));
+
+    add(BornAgain::FFIcosahedronType,
+        new FormFactorIcosahedron(10.0));
+
+    add(BornAgain::FFPrism3Type,
+        new FormFactorPrism3(10.0, 5.0));
+
+    add(BornAgain::FFPrism6Type,
+        new FormFactorPrism6(2./sqrt(3.)*5.0, 5.0));
+
+    add(BornAgain::FFPyramidType,
+        new FormFactorPyramid(10.0, 5.0, Units::deg2rad(54.73 )));
+
+    add(BornAgain::FFRipple1Type,
+        new FormFactorRipple1(100.0, 20.0, 4.0));
+
+    add(BornAgain::FFRipple2Type,
+        new FormFactorRipple2(100.0, 20.0, 4.0, 0.0));
+
+    add(BornAgain::FFTetrahedronType,
+        new FormFactorTetrahedron(10.0, 4.0, Units::deg2rad(54.73 )));
+
+    add(BornAgain::FFTruncatedCubeType,
+        new FormFactorTruncatedCube(15.0, 6.0));
+
+    add(BornAgain::FFTruncatedSphereType,
+        new FormFactorTruncatedSphere(5.0, 7.0));
+
+    add(BornAgain::FFTruncatedSpheroidType,
+        new FormFactorTruncatedSpheroid(5.0, 7.0, 1.0));
+}
diff --git a/Tests/Functional/TestMachinery/SubtestRegistry.h b/Tests/Functional/TestMachinery/SubtestRegistry.h
new file mode 100644
index 0000000..159bb4e
--- /dev/null
+++ b/Tests/Functional/TestMachinery/SubtestRegistry.h
@@ -0,0 +1,48 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/Functional/TestMachinery/SubtestRegistry.h
+//! @brief     Defines different registries for subtests of functional tests.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SUBTESTREGISTRY_H
+#define SUBTESTREGISTRY_H
+
+#include "IRegistry.h"
+#include "FTDistributions2D.h"
+
+class ISubtestRegistry : public IRegistry<IParameterized>
+{
+};
+
+// ************************************************************************** //
+//! @class SubtestRegistryFTDistribution2D
+//! @brief Registry with predefined Fourier transformed distributions, for functional tests.
+// ************************************************************************** //
+
+class SubtestRegistryFTDistribution2D : public ISubtestRegistry
+{
+public:
+    SubtestRegistryFTDistribution2D();
+};
+
+// ************************************************************************** //
+//! @class SubtestRegistryFormFactor
+//! @brief Registry with predefined form factors, for functional tests.
+// ************************************************************************** //
+
+class SubtestRegistryFormFactor : public ISubtestRegistry
+{
+public:
+    SubtestRegistryFormFactor();
+};
+
+#endif // SUBTESTREGISTRY_H
diff --git a/Tests/PerformanceTests/README b/Tests/PerformanceTests/README
new file mode 100644
index 0000000..f731484
--- /dev/null
+++ b/Tests/PerformanceTests/README
@@ -0,0 +1,18 @@
+# maintainers, attention: if this page is moved, then update the link at
+# http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/wiki
+
+Example usage:
+
+python2|3 test_performance.py ../../dev-tools/log/perf_history.txt
+
+This will run the performance test suite, and append the outcome
+to the file "perf_history.txt". If the filename argument is left
+blank, the outcome will be written to stdout.
+
+The script runs all of the performance tests in the old App, as well
+as new performance test based on customformfactor.py, which specifically
+measures overhead in the Python bindings. For this reason, the script
+not only records the host operating system and architecture, but also
+the Python version (in many situations, there is a noticeable difference
+in performance between Python 2.7 and 3.x). This script depends only
+on the core library and standard Python modules.
diff --git a/Tests/PerformanceTests/test_performance.py b/Tests/PerformanceTests/test_performance.py
new file mode 100755
index 0000000..e4a5629
--- /dev/null
+++ b/Tests/PerformanceTests/test_performance.py
@@ -0,0 +1,306 @@
+#!/usr/bin/python
+ # -*- coding: utf-8 -*-
+
+## ************************************************************************** ##
+##
+##  BornAgain: simulate and fit scattering at grazing incidence
+##
+##! @file      test_performance.py
+##! @brief     Defines class TestPerformance for logging performance changes
+##!            For explanations, see the README file
+##!
+##! @homepage  http:##www.bornagainproject.org
+##! @license   GNU General Public License v3 or higher (see COPYING)
+##! @copyright Forschungszentrum Jülich GmbH 2016
+##! @authors   Scientific Computing Group at MLZ Garching
+##! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+##
+## ************************************************************************** ##
+
+from __future__ import print_function
+import datetime
+import sys
+import platform
+import timeit
+from collections import OrderedDict
+import math
+from libBornAgainCore import *
+
+# used for logging intermediate output
+logfile = sys.stdout
+
+# for code readability
+get_wall_time = timeit.default_timer
+
+# for code readability and portability, since resource is not guaranteed to be available
+try:
+    import resource
+    record_cpu_time = True
+    get_cpu_time = lambda: resource.getrusage(resource.RUSAGE_SELF)[0]
+except:
+    record_cpu_time = False
+    get_cpu_time = lambda: None
+
+
+# globals used in custom form factor
+phi_min, phi_max = -1.0, 1.0
+alpha_min, alpha_max = 0.0, 2.0
+
+# user-defined custom form factor
+class CustomFormFactor(IFormFactorBorn):
+    """
+    A custom defined form factor
+    The form factor is V sech(q L) with
+    V volume of particle
+    L length scale which defines mean radius
+    """
+    def __init__(self, V, L):
+        IFormFactorBorn.__init__(self)
+        # parameters describing the form factor
+        self.V = V
+        self.L = L
+
+    def clone(self):
+        """
+        IMPORTANT NOTE:
+        The clone method needs to call transferToCPP() on the cloned object
+        to transfer the ownership of the clone to the cpp code
+        """
+        cloned_ff = CustomFormFactor(self.V, self.L)
+        cloned_ff.transferToCPP()
+        return cloned_ff
+
+    def evaluate_for_q(self, q):
+        return self.V*1.0/math.cosh(q.mag()*self.L)
+
+# class for performance test, constructed using sample factories
+class FactoryTest:
+    def __init__(self, name, simulation_name, sample_builder, nrepetitions):
+        self.m_test_name = name
+        self.m_simulation_name = simulation_name
+        self.m_sample_builder_name = sample_builder
+        self.m_nrepetitions = nrepetitions
+        self.m_cpu_time = 0.0
+        self.m_wall_time = 0.0
+
+        self.m_sample = None
+
+        if simulation_name != None and sample_builder != None:
+            self.m_sample_factory = SampleBuilderFactory()
+            self.m_simulation_factory = SimulationFactory()
+            self.m_simulation = self.m_simulation_factory.createItem(self.m_simulation_name)
+            self.m_sample = self.m_sample_factory.createSample(self.m_sample_builder_name)
+        else:
+            self.m_sample_factory = None
+            self.m_simulation_factory = None
+            self.m_simulation = None
+            self.m_sample = None
+
+    def prepare(self):
+        pass
+
+    # do the actual work
+    def run_loop(self):
+        # actual work is done here
+        for i in range(self.m_nrepetitions):
+            self.m_simulation.setSample(self.m_sample)
+            self.m_simulation.runSimulation()
+
+    def run(self):
+
+        self.prepare()
+
+        logfile.write("Running test: %-30s " % self.m_test_name)
+        logfile.flush()
+
+        # resource.getrusage is less accurate but returns user (cpu) time
+        start_wall_time = get_wall_time()
+        start_cpu_time = get_cpu_time()
+
+        self.run_loop()
+
+        end_wall_time = get_wall_time()
+        end_cpu_time = get_cpu_time()
+
+        # note that on multi-core system, cpu time can be higher than wall time
+        self.m_wall_time = end_wall_time - start_wall_time
+
+        if record_cpu_time:
+            self.m_cpu_time = end_cpu_time - start_cpu_time
+            logfile.write("OK: %-6.3f (wall sec), %-6.3f (cpu sec) \n" % (self.m_wall_time, self.m_cpu_time))
+        else:
+            logfile.write("OK: %-6.3f (wall sec)\n" % (self.m_wall_time))
+
+
+
+# special performance test case: custom form factor
+class CustomTest(FactoryTest):
+    def __init__(self, name, nrepetitions):
+        FactoryTest.__init__(self, name, None, None, nrepetitions)
+        self.m_sample = None
+        self.m_simulation = None
+
+    def prepare(self):
+        self.m_sample = self.get_sample()
+        self.m_simulation = self.get_simulation()
+
+    # do the actual work
+    def run_loop(self):
+        for i in range(self.m_nrepetitions):
+            self.m_simulation.setSample(self.m_sample)
+            self.m_simulation.runSimulation()
+
+    def get_sample(self):
+        """
+        Build and return the sample to calculate custom form factor in Distorted Wave Born Approximation.
+        """
+        # defining materials
+        m_ambience = HomogeneousMaterial("Air", 0.0, 0.0)
+        m_substrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+        m_particle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+        # collection of particles
+        ff = CustomFormFactor(343.0*nanometer, 7.0*nanometer)
+        particle = Particle(m_particle, ff)
+        particle_layout = ParticleLayout()
+        particle_layout.addParticle(particle, 1.0)
+        air_layer = Layer(m_ambience)
+        air_layer.addLayout(particle_layout)
+        substrate_layer = Layer(m_substrate)
+
+        # assemble multilayer
+        multi_layer = MultiLayer()
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(substrate_layer)
+        return multi_layer
+
+    def get_simulation(self):
+        """
+        Create and return GISAXS simulation with beam and detector defined
+        IMPORTANT NOTE:
+        Multithreading should be deactivated by putting ThreadInfo.n_threads to -1
+        """
+        simulation = GISASSimulation()
+        simulation.getOptions().setNumberOfThreads(-1)
+        simulation.setDetectorParameters(100, phi_min*degree, phi_max*degree, 100, alpha_min*degree, alpha_max*degree)
+        simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+        return simulation
+
+
+# class for running all of the tests and collecting results
+class PerformanceTests:
+    def __init__(self, filename=None):
+        self.m_tests = []
+        self.m_datime = ""
+        self.m_hostname = ""
+        self.m_sysinfo = ""
+        self.m_pyversion = ""
+        self.m_filename = filename
+
+        self.add("MultiLayer",         "MaxiGISAS",    "MultiLayerWithRoughnessBuilder", 1)
+        self.add("CylindersInDWBA",    "MaxiGISAS",    "CylindersInDWBABuilder", 10)
+        self.add("RotatedPyramids",    "MaxiGISAS",    "RotatedPyramidsBuilder", 10)
+        self.add("CoreShell",          "MaxiGISAS",    "CoreShellParticleBuilder", 10)
+        self.add("SquareLattice",      "MaxiGISAS",    "SquareLatticeBuilder", 10)
+        self.add("RadialParaCrystal",  "MaxiGISAS",    "RadialParaCrystalBuilder", 10)
+        self.add("HexParaCrystal",     "BasicGISAS",   "HexParaCrystalBuilder", 1)
+        self.add("SSCA",               "MaxiGISAS",    "SizeDistributionSSCAModelBuilder", 10)
+        self.add("Mesocrystal",        "MaxiGISAS",    "MesoCrystalBuilder", 2)
+        self.add("PolMagCyl",          "MaxiGISAS00",  "MagneticCylindersBuilder", 10)
+
+        # custom form factor is a special case since it's not in the registry
+        self.m_tests.append(CustomTest("Custom FF", 10))
+
+        logfile.write("\nPreparing to run %d performance tests.\n\n" % len(self.m_tests))
+
+    def add(self, name, simulation_name, sample_builder, nrepetitions):
+        self.m_tests.append(FactoryTest(name, simulation_name, sample_builder, nrepetitions))
+
+    # execute all performance tests
+    def execute(self):
+        self.init_sysinfo()
+        for test in self.m_tests: test.run()
+        self.write_results()
+
+
+    # write out system information and test results to file
+    def write_results(self):
+
+        if ( self.m_filename != None ):
+            try:
+                write_file = open(self.m_filename, "a")
+            except:
+                sys.stderr.write("Could not open filed '%' for writing. Writing to stdout instead.\n" % self.m_filename)
+                write_file = sys.stdout
+                self.m_filename = None
+
+        else:
+            write_file = sys.stdout
+
+        logfile.write("\nWriting output to %s...\n\n" % write_file.name)
+
+        # record results into an ordered dict, which is used by pretty_write() below
+        dictionary = OrderedDict()
+
+        dictionary["date"] = self.m_datime
+        dictionary["hostname"] = self.m_hostname
+        dictionary["sysinfo"] = self.m_sysinfo
+        dictionary["python"] = self.m_pyversion
+
+        sum_wall = 0.0
+        sum_cpu = 0.0
+
+        for test in self.m_tests:
+            sum_wall += test.m_wall_time
+            sum_cpu += test.m_cpu_time
+
+        if record_cpu_time: dictionary["total cpu"] = "%-.4f" % sum_cpu
+        dictionary["total wall"] = "%-.4f" % sum_wall
+
+        for test in self.m_tests:
+            dictionary[test.m_test_name] = "%-.4f" % test.m_wall_time
+
+        write_file.write("\n")
+        pretty_write(dictionary, write_file)
+        write_file.write("\n")
+        write_file.flush()
+
+        if ( self.m_filename != None ):
+            write_file.close()
+
+    # determine platform, architecture, python version, etc.
+    def init_sysinfo(self):
+        system, node, release, version, machine, processor = platform.uname()
+        self.m_datime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
+        self.m_hostname = node
+        self.m_sysinfo = "%s %s" % (system, machine)
+        self.m_pyversion = "%d.%d" % (sys.version_info[:2])
+
+# used for writing the summary with proper formatting
+def pretty_write(dictionary, file):
+    header = "|"
+    footer = "|"
+
+    for key in dictionary:
+        value = dictionary[key]
+        length = max(len(key), len(value))
+        format_str = " {0:" + str(length) + "} |"
+        header += format_str.format(key)
+        footer += format_str.format(value)
+
+    file.write(header + "\n")
+    file.write(footer + "\n")
+
+if __name__ == '__main__':
+
+    if ( len(sys.argv) > 2 ):
+        print("Usage: test_performance.py [output file]")
+        exit(0)
+
+    if (len(sys.argv) == 2):
+        filename = sys.argv[1]
+    else:
+        filename = None
+
+    tests = PerformanceTests(filename)
+    tests.execute()
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_aniso_pyramid_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_aniso_pyramid_BA.ima
new file mode 100644
index 0000000..0859d4b
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_aniso_pyramid_BA.ima
@@ -0,0 +1,100 @@
+    3.9928981885E+04    3.9213131730E+04    3.8294341029E+04    3.7565622290E+04    3.6936288577E+04    3.5595472924E+04    3.5040800272E+04    3.3610170796E+04    3.2508562850E+04    3.2310644026E+04    3.1676239887E+04    2.9603737511E+04    2.8089957147E+04    2.7276112312E+04    2.6129893992E+04    2.4878764281E+04    2.3604568180E+04    2.2455008906E+04    2.1307749357E+04    2.0335587135E+04    1.9118902970E+04    1.8117731302E+04    1.6994451328E+04    1.5929492676E+04    1.493048 [...]
+    3.9361243925E+04    3.8646201712E+04    3.7875415429E+04    3.7052239366E+04    3.6180228290E+04    3.5263115897E+04    3.4304792296E+04    3.3309280717E+04    3.2280713582E+04    3.1223308124E+04    3.0141341732E+04    2.9039127176E+04    2.7920987900E+04    2.6791233555E+04    2.5654135931E+04    2.4513905450E+04    2.3374668398E+04    2.2240445015E+04    2.1115128613E+04    2.0002465844E+04    1.8906038240E+04    1.7829245140E+04    1.6775288111E+04    1.5747156937E+04    1.474761 [...]
+    3.7907401107E+04    3.7217486162E+04    3.6473793256E+04    3.5679560527E+04    3.4838219629E+04    3.3953374921E+04    3.3028781733E+04    3.2068323872E+04    3.1075990514E+04    3.0055852672E+04    2.9012039380E+04    2.7948713778E+04    2.6870049256E+04    2.5780205830E+04    2.4683306900E+04    2.3583416561E+04    2.2484517613E+04    2.1390490412E+04    2.0305092708E+04    1.9231940594E+04    1.8174490683E+04    1.7136023628E+04    1.6119629078E+04    1.5128192160E+04    1.416438 [...]
+    3.5581444655E+04    3.4931844985E+04    3.4231621105E+04    3.3483824609E+04    3.2691689431E+04    3.1858612219E+04    3.0988131854E+04    3.0083908234E+04    2.9149700503E+04    2.8189344858E+04    2.7206732106E+04    2.6205785111E+04    2.5190436318E+04    2.4164605470E+04    2.3132177712E+04    2.2096982197E+04    2.1062771361E+04    2.0033200985E+04    1.9011811197E+04    1.8002008509E+04    1.7007049024E+04    1.6030022900E+04    1.5073840180E+04    1.4141218041E+04    1.323466 [...]
+    3.2520669361E+04    3.1924352239E+04    3.1281577525E+04    3.0595149905E+04    2.9868041606E+04    2.9103374359E+04    2.8304400561E+04    2.7474483771E+04    2.6617078692E+04    2.5735710761E+04    2.4833955517E+04    2.3915417867E+04    2.2983711415E+04    2.2042437981E+04    2.1095167463E+04    2.0145418173E+04    1.9196637781E+04    1.8252184986E+04    1.7315312050E+04    1.6389148284E+04    1.5476684616E+04    1.4580759307E+04    1.3704044922E+04    1.2849036622E+04    1.201804 [...]
+    2.8901370060E+04    2.8368431362E+04    2.7793988719E+04    2.7180552521E+04    2.6530783081E+04    2.5847474476E+04    2.5133537675E+04    2.4391983080E+04    2.3625902587E+04    2.2838451324E+04    2.2032829159E+04    2.1212262146E+04    2.0379984005E+04    1.9539217787E+04    1.8693157843E+04    1.7844952210E+04    1.6997685554E+04    1.6154362757E+04    1.5317893276E+04    1.4491076365E+04    1.3676587249E+04    1.2876964347E+04    1.2094597603E+04    1.1331718008E+04    1.059038 [...]
+    2.4924785127E+04    2.4462010831E+04    2.3963213138E+04    2.3430575793E+04    2.2866412914E+04    2.2273154925E+04    2.1653333879E+04    2.1009568249E+04    2.0344547330E+04    1.9661015331E+04    1.8961755291E+04    1.8249572920E+04    1.7527280491E+04    1.6797680878E+04    1.6063551860E+04    1.5327630801E+04    1.4592599799E+04    1.3861071404E+04    1.3135575011E+04    1.2418543996E+04    1.1712303690E+04    1.1019060257E+04    1.0340890550E+04    9.6797329852E+03    9.037379 [...]
+    2.0801456578E+04    2.0412123437E+04    1.9992498881E+04    1.9544423658E+04    1.9069848379E+04    1.8570821650E+04    1.8049477694E+04    1.7508023530E+04    1.6948725799E+04    1.6373897376E+04    1.5785883778E+04    1.5187049556E+04    1.4579764694E+04    1.3966391160E+04    1.3349269662E+04    1.2730706730E+04    1.2112962193E+04    1.1498237135E+04    1.0888662418E+04    1.0286287837E+04    9.6930719800E+03    9.1108728499E+03    8.5414393084E+03    7.9864033889E+03    7.447273 [...]
+    1.6735463829E+04    1.6419385728E+04    1.6078728197E+04    1.5714988534E+04    1.5329753377E+04    1.4924689051E+04    1.4501531487E+04    1.4062075797E+04    1.3608165555E+04    1.3141681888E+04    1.2664532432E+04    1.2178640247E+04    1.1685932759E+04    1.1188330805E+04    1.0687737865E+04    1.0186029542E+04    9.6850433763E+03    9.1865690444E+03    8.6923390175E+03    8.2040197384E+03    7.7232033679E+03    7.2514001553E+03    6.7900314758E+03    6.3404235757E+03    5.903802 [...]
+    1.2909957214E+04    1.2663763064E+04    1.2398432339E+04    1.2115133171E+04    1.1815103388E+04    1.1499642981E+04    1.1170106239E+04    1.0827893612E+04    1.0474443355E+04    1.0111223007E+04    9.7397207826E+03    9.3614369181E+03    8.9778750422E+03    8.5905336311E+03    8.2008976032E+03    7.8104301130E+03    7.4205645981E+03    7.0326971329E+03    6.6481791384E+03    6.2683104941E+03    5.8943330977E+03    5.5274249082E+03    5.1686945113E+03    4.8191762358E+03    4.479825 [...]
+    9.4752407151E+03    9.2928510691E+03    9.0962873291E+03    8.8864154374E+03    8.6641530165E+03    8.4304637919E+03    8.1863517675E+03    7.9328551962E+03    7.6710403892E+03    7.4019954070E+03    7.1268236774E+03    6.8466375861E+03    6.5625520822E+03    6.2756783458E+03    5.9871175592E+03    5.6979548245E+03    5.4092532686E+03    5.1220483744E+03    4.8373425756E+03    4.5561001487E+03    4.2792424354E+03    4.0076434242E+03    3.7421257163E+03    3.4834569010E+03    3.232346 [...]
+    6.5403540849E+03    6.4136085255E+03    6.2770094149E+03    6.1311574010E+03    5.9766890232E+03    5.8142728550E+03    5.6446054736E+03    5.4684072892E+03    5.2864182607E+03    5.0993935299E+03    4.9080990042E+03    4.7133069195E+03    4.5157914130E+03    4.3163241382E+03    4.1156699498E+03    3.9145826905E+03    3.7138011048E+03    3.5140449099E+03    3.3160110464E+03    3.1203701353E+03    2.9277631611E+03    2.7387984034E+03    2.5540486333E+03    2.3740485916E+03    2.199292 [...]
+    4.1687189045E+03    4.0880960747E+03    4.0011935443E+03    3.9083902771E+03    3.8100879610E+03    3.7067085912E+03    3.5986919462E+03    3.4864929745E+03    3.3705791090E+03    3.2514275305E+03    3.1295223972E+03    3.0053520607E+03    2.8794062878E+03    2.7521735062E+03    2.6241380945E+03    2.4957777321E+03    2.3675608303E+03    2.2399440572E+03    2.1133699762E+03    1.9882648109E+03    1.8650363506E+03    1.7440720096E+03    1.6257370515E+03    1.5103729885E+03    1.398296 [...]
+    2.3779858887E+03    2.3333534936E+03    2.2852227948E+03    2.2337980029E+03    2.1792956968E+03    2.1219435493E+03    2.0619789946E+03    1.9996478484E+03    1.9352028883E+03    1.8689024063E+03    1.8010087419E+03    1.7317868065E+03    1.6615026090E+03    1.5904217927E+03    1.5188081925E+03    1.4469224235E+03    1.3750205083E+03    1.3033525531E+03    1.2321614812E+03    1.1616818305E+03    1.0921386235E+03    1.0237463163E+03    9.5670783250E+02    8.9121368697E+02    8.274412 [...]
+    1.1437999488E+03    1.1251334211E+03    1.1049680945E+03    1.0833803760E+03    1.0604514920E+03    1.0362670529E+03    1.0109165987E+03    9.8449312514E+02    9.5709259574E+02    9.2881344191E+02    8.9975605432E+02    8.7002226896E+02    8.3971485102E+02    8.0893697972E+02    7.7779173737E+02    7.4638160570E+02    7.1480797254E+02    6.8317065176E+02    6.5156741927E+02    6.2009356780E+02    5.8884148300E+02    5.5790024311E+02    5.2735524447E+02    4.9728785478E+02    4.677750 [...]
+    4.0683058211E+02    4.0484592318E+02    4.0264001187E+02    4.0020545967E+02    3.9753477063E+02    3.9462046250E+02    3.9145519127E+02    3.8803187761E+02    3.8434383407E+02    3.8038489156E+02    3.7614952388E+02    3.7163296883E+02    3.6683134475E+02    3.6174176112E+02    3.5636242208E+02    3.5069272165E+02    3.4473332971E+02    3.3848626757E+02    3.3195497249E+02    3.2514435011E+02    3.1806081435E+02    3.1071231406E+02    3.0310834615E+02    2.9525995479E+02    2.871797 [...]
+    8.2135718958E+01    8.8793398323E+01    9.5884407051E+01    1.0335620737E+02    1.1115352335E+02    1.1921876632E+02    1.2749247666E+02    1.3591377846E+02    1.4442084319E+02    1.5295135869E+02    1.6144299951E+02    1.6983389495E+02    1.7806309082E+02    1.8607100131E+02    1.9379984741E+02    2.0119407820E+02    2.0820077186E+02    2.1477001328E+02    2.2085524513E+02    2.2641359004E+02    2.3140614116E+02    2.3579821925E+02    2.3955959420E+02    2.4266466974E+02    2.450926 [...]
+    6.9763020126E+01    7.8614396711E+01    8.8056266974E+01    9.8022493029E+01    1.0844343444E+02    1.1924647093E+02    1.3035654562E+02    1.4169672436E+02    1.5318876668E+02    1.6475370367E+02    1.7631241824E+02    1.8778622303E+02    1.9909743136E+02    2.1016991681E+02    2.2092965690E+02    2.3130525665E+02    2.4122844806E+02    2.5063456153E+02    2.5946296576E+02    2.6765747277E+02    2.7516670518E+02    2.8194442294E+02    2.8794980735E+02    2.9314770049E+02    2.975087 [...]
+    2.6545517523E+02    2.7181910352E+02    2.7857196706E+02    2.8565749990E+02    2.9301654959E+02    3.0058754156E+02    3.0830696142E+02    3.1610985098E+02    3.2393031416E+02    3.3170202836E+02    3.3935875726E+02    3.4683486081E+02    3.5406579819E+02    3.6098861983E+02    3.6754244431E+02    3.7366891650E+02    3.7931264324E+02    3.8442160305E+02    3.8894752684E+02    3.9284624655E+02    3.9607800910E+02    3.9860775342E+02    4.0040534839E+02    4.0144579017E+02    4.017093 [...]
+    5.7041133861E+02    5.7138477481E+02    5.7232567779E+02    5.7320282651E+02    5.7398361318E+02    5.7463434697E+02    5.7512056844E+02    5.7540737198E+02    5.7545973329E+02    5.7524283905E+02    5.7472241587E+02    5.7386505569E+02    5.7263853458E+02    5.7101212238E+02    5.6895688028E+02    5.6644594380E+02    5.6345478882E+02    5.5996147811E+02    5.5594688643E+02    5.5139490229E+02    5.4629260439E+02    5.4063041154E+02    5.3440220468E+02    5.2760541990E+02    5.202411 [...]
+    8.9924790518E+02    8.9356886208E+02    8.8734332885E+02    8.8057247466E+02    8.7325799930E+02    8.6540222450E+02    8.5700818673E+02    8.4807973024E+02    8.3862159921E+02    8.2863952777E+02    8.1814032667E+02    8.0713196553E+02    7.9562364941E+02    7.8362588868E+02    7.7115056114E+02    7.5821096539E+02    7.4482186453E+02    7.3099951946E+02    7.1676171094E+02    7.0212774989E+02    6.8711847544E+02    6.7175624019E+02    6.5606488261E+02    6.4006968629E+02    6.237973 [...]
+    1.1855697474E+03    1.1733625529E+03    1.1601093663E+03    1.1458443102E+03    1.1306039712E+03    1.1144272718E+03    1.0973553340E+03    1.0794313354E+03    1.0607003580E+03    1.0412092312E+03    1.0210063681E+03    1.0001415971E+03    9.7866598893E+02    9.5663167961E+02    9.3409169014E+02    9.1109974391E+02    8.8771008218E+02    8.6397727858E+02    8.3995605330E+02    8.1570108770E+02    7.9126684023E+02    7.6670736420E+02    7.4207612830E+02    7.1742584063E+02    6.928082 [...]
+    1.3848721278E+03    1.3673126898E+03    1.3483026038E+03    1.3279041868E+03    1.3061838574E+03    1.2832118155E+03    1.2590617068E+03    1.2338102716E+03    1.2075369832E+03    1.1803236741E+03    1.1522541560E+03    1.1234138334E+03    1.0938893130E+03    1.0637680134E+03    1.0331377744E+03    1.0020864699E+03    9.7070162640E+02    9.3907004821E+02    9.0727745280E+02    8.7540811698E+02    8.4354453649E+02    8.1176710050E+02    7.8015378271E+02    7.4877985054E+02    7.177175 [...]
+    1.4748057070E+03    1.4537479054E+03    1.4309806658E+03    1.4065861143E+03    1.3806516084E+03    1.3532692792E+03    1.3245355506E+03    1.2945506398E+03    1.2634180411E+03    1.2312439985E+03    1.1981369678E+03    1.1642070733E+03    1.1295655618E+03    1.0943242579E+03    1.0585950228E+03    1.0224892211E+03    9.8611719787E+02    9.4958776980E+02    9.1300773276E+02    8.7648138897E+02    8.4011009626E+02    8.0399184196E+02    7.6822084370E+02    7.3288717910E+02    6.980764 [...]
+    1.4531166454E+03    1.4307200624E+03    1.4065231065E+03    1.3806174443E+03    1.3531004923E+03    1.3240748862E+03    1.2936479246E+03    1.2619309920E+03    1.2290389637E+03    1.1950895975E+03    1.1602029146E+03    1.1245005763E+03    1.0881052573E+03    1.0511400226E+03    1.0137277096E+03    9.7599032079E+02    9.3804842983E+02    9.0002060521E+02    8.6202285466E+02    8.2416809357E+02    7.8656564066E+02    7.4932074354E+02    7.1253413684E+02    6.7630163531E+02    6.407137 [...]
+    1.3337914816E+03    1.3121859046E+03    1.2888529233E+03    1.2638832234E+03    1.2373731364E+03    1.2094241060E+03    1.1801421286E+03    1.1496371736E+03    1.1180225855E+03    1.0854144730E+03    1.0519310885E+03    1.0176922025E+03    9.8281847646E+02    9.4743083863E+02    9.1164986657E+02    8.7559518030E+02    8.3938485001E+02    8.0313482169E+02    7.6695836453E+02    7.3096554301E+02    6.9526271708E+02    6.5995207303E+02    6.2513118782E+02    5.9089262908E+02    5.573235 [...]
+    1.1420725675E+03    1.1230868641E+03    1.1025859461E+03    1.0806501134E+03    1.0573646575E+03    1.0328193869E+03    1.0071081315E+03    9.8032822678E+02    9.5257998359E+02    9.2396614551E+02    8.9459133815E+02    8.6456151371E+02    8.3398339439E+02    8.0296391840E+02    7.7160969200E+02    7.4002645098E+02    7.0831853518E+02    6.7658837898E+02    6.4493602107E+02    6.1345863641E+02    5.8225009297E+02    5.5140053598E+02    5.2099600181E+02    4.9111806366E+02    4.618435 [...]
+    9.0905591988E+02    8.9402908762E+02    8.7779957195E+02    8.6043001631E+02    8.4198698106E+02    8.2254057885E+02    8.0216409285E+02    7.8093358029E+02    7.5892746396E+02    7.3622611420E+02    7.1291142435E+02    6.8906638217E+02    6.6477464011E+02    6.4012008712E+02    6.1518642475E+02    5.9005675010E+02    5.6481314827E+02    5.3953629673E+02    5.1430508404E+02    4.8919624516E+02    4.6428401538E+02    4.3963980489E+02    4.1533189586E+02    3.9142516335E+02    3.679808 [...]
+    6.6654249357E+02    6.5622410845E+02    6.4506986040E+02    6.3312021053E+02    6.2041820670E+02    6.0700926081E+02    5.9294091518E+02    5.7826259956E+02    5.6302538018E+02    5.4728170249E+02    5.3108512909E+02    5.1449007457E+02    4.9755153877E+02    4.8032484015E+02    4.6286535085E+02    4.4522823493E+02    4.2746819151E+02    4.0963920409E+02    3.9179429762E+02    3.7398530466E+02    3.5626264187E+02    3.3867509812E+02    3.2126963523E+02    3.0409120251E+02    2.871825 [...]
+    4.4269935595E+02    4.3723647718E+02    4.3131233797E+02    4.2494363470E+02    4.1814823939E+02    4.1094513195E+02    4.0335432827E+02    3.9539680462E+02    3.8709441855E+02    3.7846982667E+02    3.6954639962E+02    3.6034813473E+02    3.5089956646E+02    3.4122567527E+02    3.3135179522E+02    3.2130352054E+02    3.1110661188E+02    3.0078690229E+02    2.9037020363E+02    2.7988221363E+02    2.6934842404E+02    2.5879403036E+02    2.4824384341E+02    2.3772220315E+02    2.272528 [...]
+    2.5892011666E+02    2.5791898182E+02    2.5679774419E+02    2.5555052108E+02    2.5417127583E+02    2.5265389942E+02    2.5099229465E+02    2.4918046189E+02    2.4721258561E+02    2.4508312081E+02    2.4278687850E+02    2.4031910931E+02    2.3767558455E+02    2.3485267361E+02    2.3184741725E+02    2.2865759573E+02    2.2528179127E+02    2.2171944415E+02    2.1797090175E+02    2.1403746015E+02    2.0992139773E+02    2.0562600044E+02    2.0115557838E+02    1.9651547355E+02    1.917120 [...]
+    1.2807981133E+02    1.3072416255E+02    1.3352444124E+02    1.3645566132E+02    1.3949156697E+02    1.4260484266E+02    1.4576733123E+02    1.4895025819E+02    1.5212446035E+02    1.5526061686E+02    1.5832948083E+02    1.6130210951E+02    1.6415009125E+02    1.6684576730E+02    1.6936244660E+02    1.7167461204E+02    1.7375811623E+02    1.7559036549E+02    1.7715049040E+02    1.7841950179E+02    1.7938043071E+02    1.8001845159E+02    1.8032098755E+02    1.8027779702E+02    1.798810 [...]
+    5.4184760752E+01    5.9388855054E+01    6.4940160507E+01    7.0799667053E+01    7.6926283946E+01    8.3277145702E+01    8.9807930208E+01    9.6473186429E+01    1.0322666907E+02    1.1002167751E+02    1.1681139634E+02    1.2354923477E+02    1.3018916220E+02    1.3668603740E+02    1.4299592862E+02    1.4907642228E+02    1.5488691777E+02    1.6038890609E+02    1.6554623044E+02    1.7032532650E+02    1.7469544099E+02    1.7862882674E+02    1.8210091293E+02    1.8509044948E+02    1.875796 [...]
+    3.3246752849E+01    3.9820159999E+01    4.6840485244E+01    5.4260589156E+01    6.2030789308E+01    7.0099223386E+01    7.8412226891E+01    8.6914722410E+01    9.5550617371E+01    1.0426320713E+02    1.1299558020E+02    1.2169102251E+02    1.3029341739E+02    1.3874763834E+02    1.4699993151E+02    1.5499828485E+02    1.6269278132E+02    1.7003593336E+02    1.7698299622E+02    1.8349225779E+02    1.8952530298E+02    1.9504725062E+02    2.0002696142E+02    2.0443721548E+02    2.082548 [...]
+    5.5081928718E+01    6.1884913783E+01    6.9147996442E+01    7.6821830607E+01    8.4854410999E+01    9.3191453627E+01    1.0177679154E+02    1.1055278273E+02    1.1946072695E+02    1.2844128805E+02    1.3743491873E+02    1.4638228412E+02    1.5522468103E+02    1.6390444966E+02    1.7236537442E+02    1.8055307099E+02    1.8841535659E+02    1.9590260066E+02    2.0296805341E+02    2.0956814986E+02    2.1566278705E+02    2.2121557265E+02    2.2619404318E+02    2.3056985036E+02    2.343189 [...]
+    1.0565947774E+02    1.1173163251E+02    1.1820524474E+02    1.2503401808E+02    1.3216918412E+02    1.3955986415E+02    1.4715344526E+02    1.5489596793E+02    1.6273252198E+02    1.7060764763E+02    1.7846573869E+02    1.8625144447E+02    1.9391006745E+02    2.0138795352E+02    2.0863287170E+02    2.1559438061E+02    2.2222417866E+02    2.2847643549E+02    2.3430810209E+02    2.3967919738E+02    2.4455306906E+02    2.4889662709E+02    2.5268054787E+02    2.5587944816E+02    2.584720 [...]
+    1.6960710830E+02    1.7425726698E+02    1.7919969218E+02    1.8439519554E+02    1.8980253418E+02    1.9537872492E+02    2.0107937091E+02    2.0685899802E+02    2.1267139820E+02    2.1846997719E+02    2.2420810363E+02    2.2983945697E+02    2.3531837116E+02    2.4060017170E+02    2.4564150313E+02    2.5040064462E+02    2.5483781103E+02    2.5891543729E+02    2.6259844383E+02    2.6585448107E+02    2.6865415132E+02    2.7097120619E+02    2.7278271847E+02    2.7406922701E+02    2.748148 [...]
+    2.3251498990E+02    2.3536656575E+02    2.3837500577E+02    2.4151076378E+02    2.4474279610E+02    2.4803880960E+02    2.5136551913E+02    2.5468891252E+02    2.5797452076E+02    2.6118769127E+02    2.6429386196E+02    2.6725883378E+02    2.7004903980E+02    2.7263180824E+02    2.7497561773E+02    2.7705034254E+02    2.7882748579E+02    2.8028039901E+02    2.8138448615E+02    2.8211739047E+02    2.8245916305E+02    2.8239241145E+02    2.8190242754E+02    2.8097729363E+02    2.796079 [...]
+    2.8275677120E+02    2.8374870293E+02    2.8475988257E+02    2.8577131043E+02    2.8676309053E+02    2.8771460428E+02    2.8860469069E+02    2.8941183148E+02    2.9011433946E+02    2.9069054867E+02    2.9111900464E+02    2.9137865308E+02    2.9144902554E+02    2.9131042037E+02    2.9094407748E+02    2.9033234554E+02    2.8945883998E+02    2.8830859085E+02    2.8686817894E+02    2.8512585931E+02    2.8307167117E+02    2.8069753308E+02    2.7799732301E+02    2.7496694232E+02    2.716043 [...]
+    3.1265030282E+02    3.1199910724E+02    3.1124805455E+02    3.1038806820E+02    3.0940973228E+02    3.0830339366E+02    3.0705926761E+02    3.0566754588E+02    3.0411850636E+02    3.0240262317E+02    3.0051067627E+02    2.9843385966E+02    2.9616388694E+02    2.9369309356E+02    2.9101453457E+02    2.8812207713E+02    2.8501048688E+02    2.8167550740E+02    2.7811393191E+02    2.7432366678E+02    2.7030378597E+02    2.6605457619E+02    2.6157757205E+02    2.5687558114E+02    2.519526 [...]
+    3.1889482403E+02    3.1702727733E+02    3.1497458234E+02    3.1273570839E+02    3.1030972728E+02    3.0769585531E+02    3.0489349632E+02    3.0190228532E+02    2.9872213208E+02    2.9535326438E+02    2.9179627027E+02    2.8805213898E+02    2.8412229989E+02    2.8000865920E+02    2.7571363383E+02    2.7124018208E+02    2.6659183072E+02    2.6177269814E+02    2.5678751322E+02    2.5164162966E+02    2.4634103544E+02    2.4089235738E+02    2.3530286043E+02    2.2958044174E+02    2.237336 [...]
+    3.0232913219E+02    2.9979751495E+02    2.9703794889E+02    2.9405471229E+02    2.9085246531E+02    2.8743624988E+02    2.8381148887E+02    2.7998398454E+02    2.7595991605E+02    2.7174583604E+02    2.6734866601E+02    2.6277569049E+02    2.5803454991E+02    2.5313323202E+02    2.4808006171E+02    2.4288368940E+02    2.3755307764E+02    2.3209748602E+02    2.2652645444E+02    2.2084978446E+02    2.1507751905E+02    2.0921992044E+02    2.0328744635E+02    1.9729072449E+02    1.912405 [...]
+    2.6714286091E+02    2.6453539354E+02    2.6170149494E+02    2.5864760923E+02    2.5538065905E+02    2.5190802449E+02    2.4823752079E+02    2.4437737457E+02    2.4033619885E+02    2.3612296697E+02    2.3174698533E+02    2.2721786519E+02    2.2254549356E+02    2.1774000325E+02    2.1281174222E+02    2.0777124238E+02    2.0262918775E+02    1.9739638239E+02    1.9208371791E+02    1.8670214087E+02    1.8126262016E+02    1.7577611434E+02    1.7025353923E+02    1.6470573579E+02    1.591434 [...]
+    2.1973095452E+02    2.1758913012E+02    2.1526235193E+02    2.1275613257E+02    2.1007638266E+02    2.0722939065E+02    2.0422180137E+02    2.0106059352E+02    1.9775305613E+02    1.9430676405E+02    1.9072955263E+02    1.8702949165E+02    1.8321485869E+02    1.7929411188E+02    1.7527586237E+02    1.7116884638E+02    1.6698189721E+02    1.6272391701E+02    1.5840384878E+02    1.5403064835E+02    1.4961325675E+02    1.4516057289E+02    1.4068142669E+02    1.3618455286E+02    1.316785 [...]
+    1.6740539172E+02    1.6615767129E+02    1.6479725059E+02    1.6332605482E+02    1.6174617775E+02    1.6005988151E+02    1.5826959617E+02    1.5637791908E+02    1.5438761381E+02    1.5230160876E+02    1.5012299537E+02    1.4785502584E+02    1.4550111040E+02    1.4306481399E+02    1.4054985239E+02    1.3796008781E+02    1.3529952372E+02    1.3257229914E+02    1.2978268225E+02    1.2693506325E+02    1.2403394657E+02    1.2108394242E+02    1.1808975761E+02    1.1505618571E+02    1.119880 [...]
+    1.1716902143E+02    1.1708721127E+02    1.1698352345E+02    1.1685437842E+02    1.1669603138E+02    1.1650460660E+02    1.1627613310E+02    1.1600658129E+02    1.1569190049E+02    1.1532805673E+02    1.1491107072E+02    1.1443705561E+02    1.1390225422E+02    1.1330307544E+02    1.1263612951E+02    1.1189826188E+02    1.1108658535E+02    1.1019851031E+02    1.0923177269E+02    1.0818445953E+02    1.0705503194E+02    1.0584234514E+02    1.0454566561E+02    1.0316468506E+02    1.016995 [...]
+    7.4719398406E+01    7.5900465731E+01    7.7155780519E+01    7.8475252730E+01    7.9848242363E+01    8.1263636724E+01    8.2709930916E+01    8.4175310936E+01    8.5647738749E+01    8.7115038662E+01    8.8564984365E+01    8.9985385959E+01    9.1364176315E+01    9.2689496116E+01    9.3949776947E+01    9.5133821809E+01    9.6230882463E+01    9.7230733047E+01    9.8123739422E+01    9.8900923761E+01    9.9554023917E+01    1.0007554717E+02    1.0045881799E+02    1.0069801947E+02    1.007882 [...]
+    4.3794397525E+01    4.6166980434E+01    4.8702770329E+01    5.1385112780E+01    5.4196422538E+01    5.7118305549E+01    6.0131686133E+01    6.3216938367E+01    6.6354020665E+01    6.9522612552E+01    7.2702252602E+01    7.5872476499E+01    7.9012954212E+01    8.2103625251E+01    8.5124831033E+01    8.8057443372E+01    9.0882988181E+01    9.3583763502E+01    9.6142951020E+01    9.8544720293E+01    1.0077432499E+02    1.0281819048E+02    1.0466399221E+02    1.0630072437E+02    1.077187 [...]
+    2.5906506019E+01    2.9258364502E+01    3.2845082720E+01    3.6644256318E+01    4.0632221963E+01    4.4784219688E+01    4.9074562114E+01    5.3476809279E+01    5.7963947742E+01    6.2508572625E+01    6.7083071231E+01    7.1659806864E+01    7.6211301494E+01    8.0710415922E+01    8.5130526130E+01    8.9445694536E+01    9.3630834927E+01    9.7661869890E+01    1.0151587965E+02    1.0517124128E+02    1.0860775730E+02    1.1180677292E+02    1.1475128100E+02    1.1742601425E+02    1.198175 [...]
+    2.0449453243E+01    2.4469906383E+01    2.8772794783E+01    3.3331462500E+01    3.8117756596E+01    4.3102220246E+01    4.8254294015E+01    5.3542523775E+01    5.8934773705E+01    6.4398442754E+01    6.9900682957E+01    7.5408617979E+01    8.0889560251E+01    8.6311225123E+01    9.1641940438E+01    9.6850850041E+01    1.0190810973E+02    1.0678507427E+02    1.1145447416E+02    1.1589058092E+02    1.2006935978E+02    1.2396860877E+02    1.2756808324E+02    1.3084960516E+02    1.337971 [...]
+    2.5108199382E+01    2.9438387124E+01    3.4071591406E+01    3.8978834532E+01    4.4129516362E+01    4.9491625125E+01    5.5031957127E+01    6.0716343674E+01    6.6509883509E+01    7.2377178996E+01    7.8282574275E+01    8.4190393626E+01    9.0065178246E+01    9.5871919711E+01    1.0157628840E+02    1.0714485523E+02    1.1254530505E+02    1.1774664033E+02    1.2271937345E+02    1.2743570649E+02    1.3186969723E+02    1.3599741014E+02    1.3979705154E+02    1.4324908796E+02    1.463363 [...]
+    3.6467647675E+01    4.0751284613E+01    4.5332387520E+01    5.0181736119E+01    5.5268480893E+01    6.0560356986E+01    6.6023907111E+01    7.1624711743E+01    7.7327624861E+01    8.3097013453E+01    8.8896998983E+01    9.4691699001E+01    1.0044546711E+02    1.0612312947E+02    1.1169021621E+02    1.1711318587E+02    1.2235964144E+02    1.2739853635E+02    1.3220036896E+02    1.3673736418E+02    1.4098364109E+02    1.4491536525E+02    1.4851088484E+02    1.5175084973E+02    1.546183 [...]
+    5.0699921842E+01    5.4627983931E+01    5.8825915635E+01    6.3266208739E+01    6.7919828256E+01    7.2756415214E+01    7.7744497945E+01    8.2851710263E+01    8.8045014868E+01    9.3290930287E+01    9.8555759631E+01    1.0380581945E+02    1.0900766698E+02    1.1412832410E+02    1.1913549630E+02    1.2399778513E+02    1.2868489255E+02    1.3316781567E+02    1.3741903060E+02    1.4141266398E+02    1.4512465119E+02    1.4853287999E+02    1.5161731876E+02    1.5436012853E+02    1.567457 [...]
+    6.4214482913E+01    6.7558785225E+01    7.1129715526E+01    7.4903075623E+01    7.8853330156E+01    8.2953786182E+01    8.7176780284E+01    9.1493871767E+01    9.5876040464E+01    1.0029388766E+02    1.0471783863E+02    1.0911834519E+02    1.1346608687E+02    1.1773216910E+02    1.2188831699E+02    1.2590706328E+02    1.2976192914E+02    1.3342759632E+02    1.3688006978E+02    1.4009682927E+02    1.4305696905E+02    1.4574132480E+02    1.4813258672E+02    1.5021539829E+02    1.519764 [...]
+    7.4176631766E+01    7.6809243556E+01    7.9617207780E+01    8.2580712144E+01    8.5678853098E+01    8.8889783602E+01    9.2190867089E+01    9.5558836447E+01    9.8969956807E+01    1.0240019091E+02    1.0582536581E+02    1.0922133963E+02    1.1256416715E+02    1.1583026304E+02    1.1899656139E+02    1.2204067054E+02    1.2494102194E+02    1.2767701211E+02    1.3022913652E+02    1.3257911457E+02    1.3471000479E+02    1.3660630944E+02    1.3825406784E+02    1.3964093779E+02    1.407562 [...]
+    7.8832789720E+01    8.0730388968E+01    8.2751721281E+01    8.4881829800E+01    8.7104933882E+01    8.9404540650E+01    9.1763561264E+01    9.4164431014E+01    9.6589232344E+01    9.9019819872E+01    1.0143794647E+02    1.0382538947E+02    1.0616407605E+02    1.0843620687E+02    1.1062437708E+02    1.1271169377E+02    1.1468188908E+02    1.1651942806E+02    1.1820961062E+02    1.1973866679E+02    1.2109384465E+02    1.2226349037E+02    1.2323711970E+02    1.2400548070E+02    1.245606 [...]
+    7.7618979131E+01    7.8853280089E+01    8.0166109935E+01    8.1547230318E+01    8.2985834214E+01    8.4470621306E+01    8.5989876596E+01    8.7531551704E+01    8.9083348223E+01    9.0632802542E+01    9.2167371494E+01    9.3674518222E+01    9.5141797631E+01    9.6556940808E+01    9.7907937804E+01    9.9183118193E+01    1.0037122882E+02    1.0146150824E+02    1.0244375722E+02    1.0330840498E+02    1.0404657056E+02    1.0465011907E+02    1.0511171221E+02    1.0542485307E+02    1.055839 [...]
+    7.1065709149E+01    7.1782757995E+01    7.2544604517E+01    7.3345061612E+01    7.4177587445E+01    7.5035328685E+01    7.5911165726E+01    7.6797759577E+01    7.7687600089E+01    7.8573055202E+01    7.9446420867E+01    8.0299971301E+01    8.1126009239E+01    8.1916915839E+01    8.2665199904E+01    8.3363546092E+01    8.4004861794E+01    8.4582322366E+01    8.5089414416E+01    8.5519976875E+01    8.5868239574E+01    8.6128859081E+01    8.6296951588E+01    8.6368122623E+01    8.633849 [...]
+    6.0542516866E+01    6.0934770460E+01    6.1352462407E+01    6.1792395127E+01    6.2251168446E+01    6.2725197934E+01    6.3210734268E+01    6.3703883508E+01    6.4200628205E+01    6.4696849209E+01    6.5188348082E+01    6.5670869992E+01    6.6140126972E+01    6.6591821420E+01    6.7021669722E+01    6.7425425861E+01    6.7798904900E+01    6.8138006209E+01    6.8438736304E+01    6.8697231181E+01    6.8909778021E+01    6.9072836146E+01    6.9183057108E+01    6.9237303799E+01    6.923266 [...]
+    4.7904900146E+01    4.8180496545E+01    4.8477162621E+01    4.8793407075E+01    4.9127615796E+01    4.9478054515E+01    4.9842871913E+01    5.0220103219E+01    5.0607674342E+01    5.1003406570E+01    5.1405021879E+01    5.1810148873E+01    5.2216329386E+01    5.2621025771E+01    5.3021628879E+01    5.3415466741E+01    5.3799813966E+01    5.4171901818E+01    5.4528928987E+01    5.4868073014E+01    5.5186502338E+01    5.5481388926E+01    5.5749921441E+01    5.5989318882E+01    5.619684 [...]
+    3.5113556159E+01    3.5467057914E+01    3.5850781816E+01    3.6263623023E+01    3.6704361132E+01    3.7171657038E+01    3.7664050069E+01    3.8179955515E+01    3.8717662633E+01    3.9275333253E+01    3.9851001056E+01    4.0442571634E+01    4.1047823408E+01    4.1664409493E+01    4.2289860569E+01    4.2921588823E+01    4.3556893028E+01    4.4192964765E+01    4.4826895854E+01    4.5455686972E+01    4.6076257490E+01    4.6685456487E+01    4.7280074938E+01    4.7856859014E+01    4.841252 [...]
+    2.3891072939E+01    2.4479299260E+01    2.5117307294E+01    2.5803194715E+01    2.6534887620E+01    2.7310140810E+01    2.8126538567E+01    2.8981496001E+01    2.9872261050E+01    3.0795917221E+01    3.1749387147E+01    3.2729437027E+01    3.3732682024E+01    3.4755592676E+01    3.5794502360E+01    3.6845615875E+01    3.7905019139E+01    3.8968690051E+01    4.0032510496E+01    4.1092279518E+01    4.2143727601E+01    4.3182532068E+01    4.4204333512E+01    4.5204753233E+01    4.617941 [...]
+    1.5466697921E+01    1.6392203683E+01    1.7393307203E+01    1.8466400014E+01    1.9607599337E+01    2.0812759266E+01    2.2077482942E+01    2.3397135705E+01    2.4766859238E+01    2.6181586691E+01    2.7636058777E+01    2.9124840833E+01    3.0642340813E+01    3.2182828200E+01    3.3740453789E+01    3.5309270310E+01    3.6883253835E+01    3.8456325913E+01    4.0022376367E+01    4.1575286675E+01    4.3108953860E+01    4.4617314790E+01    4.6094370797E+01    4.7534212493E+01    4.893104 [...]
+    1.0438997507E+01    1.1742485135E+01    1.3149129049E+01    1.4653072908E+01    1.6248057653E+01    1.7927448502E+01    1.9684263611E+01    2.1511204258E+01    2.3400686440E+01    2.5344873744E+01    2.7335711348E+01    2.9364961009E+01    3.1424236890E+01    3.3505042052E+01    3.5598805476E+01    3.7696919420E+01    3.9790776966E+01    4.1871809577E+01    4.3931524483E+01    4.5961541739E+01    4.7953630769E+01    4.9899746222E+01    5.1792062981E+01    5.3623010140E+01    5.538530 [...]
+    8.7631929638E+00    1.0424845029E+01    1.2214719101E+01    1.4124572707E+01    1.6145628969E+01    1.8268621350E+01    2.0483840773E+01    2.2781184869E+01    2.5150209070E+01    2.7580179260E+01    3.0060125695E+01    3.2578897892E+01    3.5125220179E+01    3.7687747612E+01    4.0255121931E+01    4.2816027266E+01    4.5359245285E+01    4.7873709475E+01    5.0348558275E+01    5.2773186769E+01    5.5137296660E+01    5.7430944275E+01    5.9644586324E+01    6.1769123206E+01    6.379593 [...]
+    9.8486679609E+00    1.1797234684E+01    1.3893169566E+01    1.6126090940E+01    1.8484968494E+01    2.0958184705E+01    2.3533599328E+01    2.6198616522E+01    2.8940254221E+01    3.1745215292E+01    3.4599960057E+01    3.7490779734E+01    4.0403870335E+01    4.3325406580E+01    4.6241615385E+01    4.9138848465E+01    5.2003653638E+01    5.4822844394E+01    5.7583567335E+01    6.0273367073E+01    6.2880248246E+01    6.5392734269E+01    6.7799922521E+01    7.0091535646E+01    7.225796 [...]
+    1.2735823462E+01    1.4863423714E+01    1.7149361143E+01    1.9581681035E+01    2.2147699772E+01    2.4834079308E+01    2.7626905203E+01    3.0511767691E+01    3.3473845248E+01    3.6497990127E+01    3.9568815276E+01    4.2670782103E+01    4.5788288506E+01    4.8905756608E+01    5.2007719634E+01    5.5078907390E+01    5.8104329798E+01    6.1069357979E+01    6.3959802376E+01    6.6761987454E+01    6.9462822520E+01    7.2049868254E+01    7.4511398573E+01    7.6836457464E+01    7.901491 [...]
+    1.6312174420E+01    1.8492254344E+01    2.0832538467E+01    2.3320283256E+01    2.5941980593E+01    2.8683439731E+01    3.1529873066E+01    3.4465985136E+01    3.7476064251E+01    4.0544076136E+01    4.3653758948E+01    4.6788719051E+01    4.9932526890E+01    5.3068812353E+01    5.6181358972E+01    5.9254196381E+01    6.2271690402E+01    6.5218630209E+01    6.8080312006E+01    7.0842618707E+01    7.3492095124E+01    7.6016018208E+01    7.8402461941E+01    8.0640356490E+01    8.271954 [...]
+    1.9526037565E+01    2.1631804661E+01    2.3890916600E+01    2.6290722951E+01    2.8817821455E+01    3.1458140827E+01    3.4197027375E+01    3.7019334824E+01    3.9909516729E+01    4.2851720847E+01    4.5829884825E+01    4.8827832548E+01    5.1829370508E+01    5.4818383544E+01    5.7778929308E+01    6.0695330849E+01    6.3552266698E+01    6.6334857867E+01    6.9028751225E+01    7.1620198694E+01    7.4096131809E+01    7.6444231150E+01    7.8652990256E+01    8.0711773648E+01    8.261086 [...]
+    2.1561712130E+01    2.3482598265E+01    2.5542718845E+01    2.7730373523E+01    3.0033168504E+01    3.2438093475E+01    3.4931602071E+01    3.7499695310E+01    4.0128007421E+01    4.2801893484E+01    4.5506518273E+01    4.8226945716E+01    5.0948228342E+01    5.3655496137E+01    5.6334044207E+01    5.8969418671E+01    6.1547500208E+01    6.4054584744E+01    6.6477460725E+01    6.8803482520E+01    7.1020639473E+01    7.3117620188E+01    7.5083871673E+01    7.6909652976E+01    7.858608 [...]
+    2.1950976667E+01    2.3605210481E+01    2.5379569522E+01    2.7264026433E+01    2.9247955944E+01    3.1320199974E+01    3.3469135762E+01    3.5682746541E+01    3.7948694289E+01    4.0254394063E+01    4.2587089419E+01    4.4933928399E+01    4.7282039598E+01    4.9618607793E+01    5.1930948645E+01    5.4206581986E+01    5.6433303202E+01    5.8599252288E+01    6.0692980092E+01    6.2703511383E+01    6.4620404307E+01    6.6433805906E+01    6.8134503356E+01    6.9713970621E+01    7.116441 [...]
+    2.0609593044E+01    2.1951679945E+01    2.3392425424E+01    2.4923981101E+01    2.6538020819E+01    2.8225789458E+01    2.9978154101E+01    3.1785657196E+01    3.3638571396E+01    3.5526955702E+01    3.7440712555E+01    3.9369645519E+01    4.1303517180E+01    4.3232106889E+01    4.5145268003E+01    4.7032984253E+01    4.8885424891E+01    5.0692998277E+01    5.2446403592E+01    5.4136680341E+01    5.5755255378E+01    5.7293987162E+01    5.8745206991E+01    6.0101756986E+01    6.135702 [...]
+    1.7801677304E+01    1.8824379208E+01    1.9924552742E+01    2.1096769332E+01    2.2335252702E+01    2.3633908925E+01    2.4986358039E+01    2.6385967084E+01    2.7825884345E+01    2.9299074626E+01    3.0798355354E+01    3.2316433310E+01    3.3845941785E+01    3.5379477955E+01    3.6909640263E+01    3.8429065613E+01    3.9930466161E+01    4.1406665501E+01    4.2850634064E+01    4.4255523519E+01    4.5614699998E+01    4.6921775977E+01    4.8170640622E+01    4.9355488463E+01    5.047084 [...]
+    1.4046855932E+01    1.4778021418E+01    1.5568037965E+01    1.6413862061E+01    1.7312227833E+01    1.8259658002E+01    1.9252475652E+01    2.0286816804E+01    2.1358643779E+01    2.2463759322E+01    2.3597821457E+01    2.4756359040E+01    2.5934787981E+01    2.7128428092E+01    2.8332520502E+01    2.9542245612E+01    3.0752741512E+01    3.1959122815E+01    3.3156499834E+01    3.4339998035E+01    3.5504777690E+01    3.6646053651E+01    3.7759115160E+01    3.8839345609E+01    3.988224 [...]
+    9.9932742255E+00    1.0488498151E+01    1.1028196568E+01    1.1611426303E+01    1.2237129606E+01    1.2904127757E+01    1.3611114804E+01    1.4356651586E+01    1.5139160169E+01    1.5956918815E+01    1.6808057619E+01    1.7690554941E+01    1.8602234743E+01    1.9540764951E+01    2.0503656933E+01    2.1488266194E+01    2.2491794368E+01    2.3511292572E+01    2.4543666173E+01    2.5585681022E+01    2.6633971162E+01    2.7685048038E+01    2.8735311183E+01    2.9781060376E+01    3.081850 [...]
+    6.2828067013E+00    6.6153294197E+00    6.9831155199E+00    7.3868427973E+00    7.8271552200E+00    8.3046426345E+00    8.8198200898E+00    9.3731070313E+00    9.9648066184E+00    1.0595085423E+01    1.1263953762E+01    1.1971246917E+01    1.2716607478E+01    1.3499469057E+01    1.4319041575E+01    1.5174298356E+01    1.6063965186E+01    1.6986511541E+01    1.7940144115E+01    1.8922802782E+01    1.9932159103E+01    2.0965617449E+01    2.2020318802E+01    2.3093147254E+01    2.418073 [...]
+    3.4332030990E+00    3.6826593075E+00    3.9634691229E+00    4.2773328579E+00    4.6259654759E+00    5.0110670317E+00    5.4342923898E+00    5.8972205515E+00    6.4013239330E+00    6.9479379338E+00    7.5382311367E+00    8.1731764767E+00    8.8535237061E+00    9.5797734742E+00    1.0352153324E+01    1.1170595894E+01    1.2034719582E+01    1.2943811927E+01    1.3896815915E+01    1.4892319394E+01    1.5928547773E+01    1.7003360114E+01    1.8114248724E+01    1.9258342299E+01    2.043241 [...]
+    1.7561855782E+00    1.9977816217E+00    2.2715511061E+00    2.5795838156E+00    2.9239997120E+00    3.3069152500E+00    3.7304088289E+00    4.1964857539E+00    4.7070430847E+00    5.2638347545E+00    5.8684373384E+00    6.5222168496E+00    7.2262969316E+00    7.9815288005E+00    8.7884632814E+00    9.6473252571E+00    1.0557990831E+01    1.1519967478E+01    1.2532377425E+01    1.3593944489E+01    1.4702984533E+01    1.5857399715E+01    1.7054676619E+01    1.8291888354E+01    1.956570 [...]
+    1.3221065565E+00    1.6175728632E+00    1.9496447568E+00    2.3202157821E+00    2.7311957745E+00    3.1844780268E+00    3.6819056416E+00    4.2252374384E+00    4.8161137889E+00    5.4560227566E+00    6.1462669173E+00    6.8879312320E+00    7.6818523339E+00    8.5285895826E+00    9.4283982183E+00    1.0381204934E+01    1.1386586161E+01    1.2443749332E+01    1.3551517368E+01    1.4708316599E+01    1.5912168293E+01    1.7160683939E+01    1.8451064389E+01    1.9780102942E+01    2.114419 [...]
+    1.9724108517E+00    2.3636960420E+00    2.7981827510E+00    3.2770990463E+00    3.8016529085E+00    4.3730044576E+00    4.9922375710E+00    5.6603312170E+00    6.3781308361E+00    7.1463201008E+00    7.9653933870E+00    8.8356292828E+00    9.7570654539E+00    1.0729475173E+01    1.1752345808E+01    1.2824859540E+01    1.3945876573E+01    1.5113921059E+01    1.6327169960E+01    1.7583445003E+01    1.8880207898E+01    2.0214558933E+01    2.1583239015E+01    2.2982635239E+01    2.440878 [...]
+    3.3725401206E+00    3.8787513721E+00    4.4353759119E+00    5.0426721561E+00    5.7008286769E+00    6.4099444657E+00    7.1700088955E+00    7.9808816365E+00    8.8422727853E+00    9.7537234669E+00    1.0714587167E+01    1.1724012048E+01    1.2780924501E+01    1.3884014156E+01    1.5031720594E+01    1.6222221953E+01    1.7453425632E+01    1.8722961252E+01    2.0028176047E+01    2.1366132788E+01    2.2733610364E+01    2.4127107088E+01    2.5542846779E+01    2.6976787649E+01    2.842463 [...]
+    5.0914905644E+00    5.7091102460E+00    6.3835398350E+00    7.1139525129E+00    7.8993984131E+00    8.7387943882E+00    9.6309138279E+00    1.0574376696E+01    1.1567639961E+01    1.2608988588E+01    1.3696527262E+01    1.4828173017E+01    1.6001648915E+01    1.7214478930E+01    1.8463984195E+01    1.9747280712E+01    2.1061278664E+01    2.2402683425E+01    2.3767998345E+01    2.5153529396E+01    2.6555391705E+01    2.7969518028E+01    2.9391669165E+01    3.0817446307E+01    3.224230 [...]
+    6.6908901197E+00    7.3968743840E+00    8.1641101800E+00    8.9907559722E+00    9.8747999221E+00    1.0814059056E+01    1.1806178816E+01    1.2848633080E+01    1.3938724731E+01    1.5073586858E+01    1.6250184675E+01    1.7465318223E+01    1.8715625934E+01    1.9997589115E+01    2.1307537419E+01    2.2641655341E+01    2.3995989785E+01    2.5366458734E+01    2.6748861039E+01    2.8138887342E+01    2.9532132120E+01    3.0924106849E+01    3.2310254245E+01    3.3685963564E+01    3.504658 [...]
+    7.8064812310E+00    8.5635212042E+00    9.3835648118E+00    1.0263986338E+01    1.1201956159E+01    1.2194447771E+01    1.3238245476E+01    1.4329952713E+01    1.5466001060E+01    1.6642659900E+01    1.7856046758E+01    1.9102138306E+01    2.0376782032E+01    2.1675708561E+01    2.2994544612E+01    2.4328826580E+01    2.5674014712E+01    2.7025507842E+01    2.8378658670E+01    2.9728789515E+01    3.1071208525E+01    3.2401226271E+01    3.3714172676E+01    3.5005414217E+01    3.627037 [...]
+    8.2079504194E+00    8.9709812755E+00    9.7957957107E+00    1.0679329948E+01    1.1618301499E+01    1.2609221414E+01    1.3648407322E+01    1.4731997239E+01    1.5855964081E+01    1.7016130838E+01    1.8208186358E+01    1.9427701680E+01    2.0670146861E+01    2.1930908231E+01    2.3205306026E+01    2.4488612309E+01    2.5776069132E+01    2.7062906859E+01    2.8344362581E+01    2.9615698542E+01    3.0872220516E+01    3.2109296041E+01    3.3322372451E+01    3.4506994617E+01    3.565882 [...]
+    7.8283086035E+00    8.5512962013E+00    9.3320257546E+00    1.0167401473E+01    1.1054115040E+01    1.1988659738E+01    1.2967345390E+01    1.3986314072E+01    1.5041556496E+01    1.6128929014E+01    1.7244171143E+01    1.8382923552E+01    1.9540746412E+01    2.0713138030E+01    2.1895553693E+01    2.3083424613E+01    2.4272176909E+01    2.5457250529E+01    2.6634118024E+01    2.7798303096E+01    2.8945398831E+01    3.0071085536E+01    3.1171148099E+01    3.2241492796E+01    3.327816 [...]
+    6.7603595827E+00    7.4024692784E+00    8.0959683857E+00    8.8381362166E+00    9.6260659028E+00    1.0456676873E+01    1.1326728042E+01    1.2232831660E+01    1.3171467747E+01    1.4138999046E+01    1.5131686430E+01    1.6145704688E+01    1.7177158614E+01    1.8222099324E+01    1.9276540731E+01    2.0336476093E+01    2.1397894568E+01    2.2456797688E+01    2.3509215687E+01    2.4551223603E+01    2.5578957082E+01    2.6588627815E+01    2.7576538534E+01    2.8539097509E+01    2.947283 [...]
+    5.2239776433E+00    5.7544104040E+00    6.3283287427E+00    6.9437409407E+00    7.5985121559E+00    8.2903720211E+00    9.0169227317E+00    9.7756475968E+00    1.0563920025E+01    1.1379012914E+01    1.2218108413E+01    1.3078308020E+01    1.3956642988E+01    1.4850084994E+01    1.5755557034E+01    1.6669944515E+01    1.7590106487E+01    1.8512886993E+01    1.9435126470E+01    2.0353673191E+01    2.1265394669E+01    2.2167189007E+01    2.3055996137E+01    2.3928808898E+01    2.478268 [...]
+    3.5128647549E+00    3.9138962443E+00    4.3498372888E+00    4.8196825614E+00    5.3223379737E+00    5.8566208708E+00    6.4212604021E+00    7.0148981021E+00    7.6360887118E+00    8.2833012723E+00    8.9549205222E+00    9.6492486274E+00    1.0364507270E+01    1.1098840123E+01    1.1850315734E+01    1.2616930834E+01    1.3396614096E+01    1.4187230338E+01    1.4986585212E+01    1.5792430339E+01    1.6602468936E+01    1.7414361895E+01    1.8225734325E+01    1.9034182533E+01    1.983728 [...]
+    1.9324031933E+00    2.2004417992E+00    2.4950117461E+00    2.8162276280E+00    3.1641744520E+00    3.5388989035E+00    3.9404004287E+00    4.3686222392E+00    4.8234423484E+00    5.3046647476E+00    5.8120108323E+00    6.3451111846E+00    6.9034978191E+00    7.4865969937E+00    8.0937226822E+00    8.7240708032E+00    9.3767142882E+00    1.0050599071E+01    1.0744541066E+01    1.1457224199E+01    1.2187199542E+01    1.2932885598E+01    1.3692569755E+01    1.4464410951E+01    1.524644 [...]
+    7.4081221844E-01    8.8556285967E-01    1.0494144048E+00    1.2336015655E+00    1.4393868042E+00    1.6680422908E+00    1.9208313122E+00    2.1989893206E+00    2.5037048100E+00    2.8361002130E+00    3.1972130102E+00    3.5879772451E+00    4.0092056311E+00    4.4615724358E+00    4.9455973186E+00    5.4616302924E+00    6.0098379662E+00    6.5901912192E+00    7.2024544396E+00    7.8461764506E+00    8.5206832305E+00    9.2250725149E+00    9.9582103570E+00    1.0718729700E+01    1.150503 [...]
+    1.0415603088E-01    1.4620480897E-01    2.0142064742E-01    2.7203360367E-01    3.6035105099E-01    4.6873108202E-01    5.9955503969E-01    7.5519943537E-01    9.3800752020E-01    1.1502607793E+00    1.3941506198E+00    1.6717505218E+00    1.9849889196E+00    2.3356230704E+00    2.7252141642E+00    3.1551039138E+00    3.6263928516E+00    4.1399205468E+00    4.6962479368E+00    5.2956419495E+00    5.9380625714E+00    6.6231524971E+00    7.3502294688E+00    8.1182813949E+00    8.925964 [...]
+    7.2324698047E-02    3.9621346369E-02    1.5950773244E-02    4.3123550856E-03    7.8200558732E-03    2.9669012724E-02    7.3100995396E-02    1.4136905982E-01    2.3770172341E-01    3.6526699465E-01    5.2713659106E-01    7.2625067830E-01    9.6538345879E-01    1.2471099307E+00    1.5737741282E+00    1.9474591402E+00    2.3699591896E+00    2.8427540363E+00    3.3669859467E+00    3.9434394501E+00    4.5725240750E+00    5.2542602370E+00    5.9882684150E+00    6.7737617292E+00    7.609542 [...]
+    5.7868278629E-01    5.0248105174E-01    4.3302717102E-01    3.7379741091E-01    3.2840495825E-01    3.0056213053E-01    2.9404130210E-01    3.1263490550E-01    3.6011487591E-01    4.4019191210E-01    5.5647492915E-01    7.1243107691E-01    9.1134669290E-01    1.1562895507E+00    1.4500727528E+00    1.7952206029E+00    2.1939367742E+00    2.6480750711E+00    3.1591130564E+00    3.7281287936E+00    4.3557809226E+00    5.0422922607E+00    5.7874370865E+00    6.5905322343E+00    7.450432 [...]
+    1.4615301227E+00    1.3723498016E+00    1.2893043748E+00    1.2160288648E+00    1.1563020156E+00    1.1140069334E+00    1.0930903905E+00    1.0975211650E+00    1.1312477991E+00    1.1981561654E+00    1.3020272304E+00    1.4464954052E+00    1.6350078658E+00    1.8707852203E+00    2.1567838845E+00    2.4956605151E+00    2.8897388299E+00    3.3409791245E+00    3.8509507685E+00    4.4208079407E+00    5.0512688319E+00    5.7425985128E+00    6.4945956344E+00    7.3065830902E+00    8.177402 [...]
+    2.5016740677E+00    2.4257816261E+00    2.3567299623E+00    2.2980099266E+00    2.2532487226E+00    2.2261717778E+00    2.2205633242E+00    2.2402260508E+00    2.2889402013E+00    2.3704224915E+00    2.4882852277E+00    2.6459960024E+00    2.8468383393E+00    3.0938736536E+00    3.3899048780E+00    3.7374420943E+00    4.1386704888E+00    4.5954209334E+00    5.1091434653E+00    5.6808839188E+00    6.3112639289E+00    7.0004645008E+00    7.7482133041E+00    8.5537758211E+00    9.415950 [...]
+    3.4679090411E+00    3.4246934390E+00    3.3898813677E+00    3.3665676954E+00    3.3579650820E+00    3.3673695255E+00    3.3981247506E+00    3.4535857666E+00    3.5370819340E+00    3.6518798807E+00    3.8011466111E+00    3.9879131507E+00    4.2150390643E+00    4.4851781780E+00    4.8007458245E+00    5.1638879184E+00    5.5764521517E+00    6.0399615816E+00    6.5555908599E+00    7.1241453324E+00    7.7460432080E+00    8.4213009742E+00    9.1495222022E+00    9.9298898587E+00    1.076116 [...]
+    4.1613826552E+00    4.1618505411E+00    4.1726424305E+00    4.1962832484E+00    4.2353900288E+00    4.2926429513E+00    4.3707554100E+00    4.4724433936E+00    4.6003944600E+00    4.7572365953E+00    4.9455072466E+00    5.1676228175E+00    5.4258489127E+00    5.7222716091E+00    6.0587700258E+00    6.4369904500E+00    6.8583222654E+00    7.3238759131E+00    7.8344630951E+00    8.3905794153E+00    8.9923896258E+00    9.6397156287E+00    1.0332027355E+01    1.1068436620E+01    1.184769 [...]
+    4.4507152979E+00    4.4971677802E+00    4.5557528694E+00    4.6283442932E+00    4.7168796393E+00    4.8233378832E+00    4.9497161685E+00    5.0980060574E+00    5.2701694696E+00    5.4681145375E+00    5.6936716015E+00    5.9485695721E+00    6.2344128808E+00    6.5526592365E+00    6.9045984011E+00    7.2913321833E+00    7.7137558463E+00    8.1725411058E+00    8.6681208876E+00    9.2006759931E+00    9.7701238097E+00    1.0376109180E+01    1.1017997530E+01    1.1694870335E+01    1.240552 [...]
+    4.2920411123E+00    4.3788437559E+00    4.4790898088E+00    4.5940152554E+00    4.7248935409E+00    4.8730197137E+00    5.0396940381E+00    5.2262052277E+00    5.4338134567E+00    5.6637333066E+00    5.9171168092E+00    6.1950367427E+00    6.4984703418E+00    6.8282835725E+00    7.1852161251E+00    7.5698672666E+00    7.9826826920E+00    8.4239425020E+00    8.8937504270E+00    9.3920244070E+00    9.9184886240E+00    1.0472667073E+01    1.1053878746E+01    1.1661234480E+01    1.229363 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_box_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_box_BA.ima
new file mode 100644
index 0000000..5548098
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_box_BA.ima
@@ -0,0 +1,100 @@
+    1.2836118509E+05    1.2559943760E+05    1.2262672926E+05    1.1945708881E+05    1.1610536281E+05    1.1258712106E+05    1.0891855797E+05    1.0511639064E+05    1.0119775432E+05    9.7180096084E+04    9.3081067485E+04    8.8918416961E+04    8.4709882773E+04    8.0473087242E+04    7.6225433036E+04    7.1984002242E+04    6.7765458913E+04    6.3585955774E+04    5.9461045704E+04    5.5405598597E+04    5.1433724123E+04    4.7558700897E+04    4.3792912483E+04    4.0147790602E+04    3.663376 [...]
+    1.2627573746E+05    1.2355885952E+05    1.2063444857E+05    1.1751630539E+05    1.1421903530E+05    1.1075795510E+05    1.0714899605E+05    1.0340860361E+05    9.9553634591E+04    9.5601252554E+04    9.1568822227E+04    8.7473803649E+04    8.3333646845E+04    7.9165687785E+04    7.4987046362E+04    7.0814527092E+04    6.6664523258E+04    6.2552925121E+04    5.8495032852E+04    5.4505474732E+04    5.0598131176E+04    4.6786065052E+04    4.3081458720E+04    3.9495558171E+04    3.603862 [...]
+    1.2018130666E+05    1.1759555372E+05    1.1481228512E+05    1.1184463549E+05    1.0870650513E+05    1.0541247150E+05    1.0197769684E+05    9.8417832776E+04    9.4748922411E+04    9.0987300815E+04    8.7149494502E+04    8.3252120701E+04    7.9311787113E+04    7.5344992898E+04    7.1368031566E+04    6.7396896489E+04    6.3447189653E+04    5.9534034320E+04    5.5671992145E+04    5.1874985337E+04    4.8156224347E+04    4.4528141549E+04    4.1002331321E+04    3.7589496876E+04    3.429940 [...]
+    1.1054682735E+05    1.0816836542E+05    1.0560822384E+05    1.0287848412E+05    9.9991932070E+04    9.6961976315E+04    9.3802563413E+04    9.0528090036E+04    8.7153312964E+04    8.3693257523E+04    8.0163125140E+04    7.6578200685E+04    7.2953760270E+04    6.9304980176E+04    6.5646847529E+04    6.1994073391E+04    5.8361008833E+04    5.4761564590E+04    5.1209134836E+04    4.7716525579E+04    4.4295888150E+04    4.0958658201E+04    3.7715500590E+04    3.4576260473E+04    3.154992 [...]
+    9.8099874811E+04    9.5989215667E+04    9.3717335491E+04    9.1294955284E+04    8.8733421004E+04    8.6044631306E+04    8.3240962177E+04    8.0335189029E+04    7.7340406829E+04    7.4269948850E+04    7.1137304636E+04    6.7956037782E+04    6.4739704119E+04    6.1501770894E+04    5.8255537518E+04    5.5014058432E+04    5.1790068639E+04    4.8595912410E+04    4.5443475641E+04    4.2344122312E+04    3.9308635467E+04    3.6347163082E+04    3.3469169155E+04    3.0683390309E+04    2.799779 [...]
+    8.3752504516E+04    8.1950536490E+04    8.0010929388E+04    7.7942835994E+04    7.5755942622E+04    7.3460407426E+04    7.1066796064E+04    6.8586015187E+04    6.6029244259E+04    6.3407866186E+04    6.0733397295E+04    5.8017417133E+04    5.5271498631E+04    5.2507139101E+04    4.9735692582E+04    4.6968303991E+04    4.4215845548E+04    4.1488855914E+04    3.8797482440E+04    3.6151426928E+04    3.3559895235E+04    3.1031551068E+04    2.8574474225E+04    2.6196123543E+04    2.390330 [...]
+    6.8510131441E+04    6.7036110749E+04    6.5449503557E+04    6.3757796642E+04    6.1968913185E+04    6.0091162308E+04    5.8133186456E+04    5.6103906995E+04    5.4012468439E+04    5.1868181719E+04    4.9680466899E+04    4.7458795767E+04    4.5212634703E+04    4.2951388248E+04    4.0684343758E+04    3.8420617550E+04    3.6169102898E+04    3.3938420250E+04    3.1736869994E+04    2.9572388084E+04    2.7452504831E+04    2.5384307096E+04    2.3374404137E+04    2.1428897302E+04    1.955335 [...]
+    5.3374131476E+04    5.2225769144E+04    5.0989697476E+04    4.9671748915E+04    4.8278095864E+04    4.6815211377E+04    4.5289828167E+04    4.3708896231E+04    4.2079539402E+04    4.0409011159E+04    3.8704650002E+04    3.6973834731E+04    3.5223939943E+04    3.3462292071E+04    3.1696126272E+04    2.9932544473E+04    2.8178474863E+04    2.6440633109E+04    2.4725485561E+04    2.3039214687E+04    2.1387686966E+04    1.9776423440E+04    1.8210573103E+04    1.6694889293E+04    1.523370 [...]
+    3.9249330734E+04    3.8404869953E+04    3.7495914317E+04    3.6526752514E+04    3.5501923198E+04    3.4426186086E+04    3.3304491818E+04    3.2141950800E+04    3.0943801262E+04    2.9715376762E+04    2.8462073380E+04    2.7189316837E+04    2.5902529771E+04    2.4607099413E+04    2.3308345896E+04    2.2011491399E+04    2.0721630367E+04    1.9443700996E+04    1.8182458174E+04    1.6942448067E+04    1.5727984513E+04    1.4543127365E+04    1.3391662926E+04    1.2277086590E+04    1.120258 [...]
+    2.6866612460E+04    2.6288571105E+04    2.5666385403E+04    2.5002990757E+04    2.4301493644E+04    2.3565151837E+04    2.2797353779E+04    2.2001597263E+04    2.1181467563E+04    2.0340615207E+04    1.9482733516E+04    1.8611536104E+04    1.7730734483E+04    1.6844015946E+04    1.5955021868E+04    1.5067326597E+04    1.4184417070E+04    1.3309673297E+04    1.2446349842E+04    1.1597558430E+04    1.0766251789E+04    9.9552088281E+03    9.1670212448E+03    8.4040816431E+03    7.668573 [...]
+    1.6728671274E+04    1.6368751540E+04    1.5981347862E+04    1.5568287757E+04    1.5131505237E+04    1.4673028498E+04    1.4194967081E+04    1.3699498601E+04    1.3188855135E+04    1.2665309386E+04    1.2131160701E+04    1.1588721067E+04    1.1040301169E+04    1.0488196624E+04    9.9346744740E+03    9.3819600441E+03    8.8322242553E+03    8.2875714739E+03    7.7500279851E+03    7.2215311637E+03    6.7039194153E+03    6.1989229491E+03    5.7081554397E+03    5.2331066286E+03    4.775135 [...]
+    9.0838038270E+03    8.8883657765E+03    8.6780061560E+03    8.4537171220E+03    8.2165486375E+03    7.9676017903E+03    7.7080218239E+03    7.4389909344E+03    7.1617208847E+03    6.8774454920E+03    6.5874130424E+03    6.2928786879E+03    5.9950968811E+03    5.6953139012E+03    5.3947605251E+03    5.0946448936E+03    4.7961456242E+03    4.5004052168E+03    4.2085237960E+03    3.9215532333E+03    3.6404916860E+03    3.3662785884E+03    3.0997901244E+03    2.8418352107E+03    2.593152 [...]
+    3.9289871650E+03    3.8444560288E+03    3.7534728736E+03    3.6564666732E+03    3.5538913868E+03    3.4462230716E+03    3.3339568713E+03    3.2176039032E+03    3.0976880669E+03    2.9747427976E+03    2.8493077881E+03    2.7219257037E+03    2.5931389123E+03    2.4634862549E+03    2.3334998778E+03    2.2037021498E+03    2.0746026856E+03    1.9466954953E+03    1.8204562797E+03    1.6963398898E+03    1.5747779651E+03    1.4561767690E+03    1.3409152306E+03    1.2293432077E+03    1.121779 [...]
+    1.0398591029E+03    1.0174875155E+03    9.9340966865E+02    9.6773898509E+02    9.4059548827E+02    9.1210503993E+02    8.8239854497E+02    8.5161112952E+02    8.1988129832E+02    7.8735007750E+02    7.5416014911E+02    7.2045498355E+02    6.8637797627E+02    6.5207159484E+02    6.1767654241E+02    5.8333094350E+02    5.4916955765E+02    5.1532302648E+02    4.8191715909E+02    4.4907226055E+02    4.1690250796E+02    3.8551537787E+02    3.5501112866E+02    3.2548234092E+02    2.970135 [...]
+    2.2060514866E+01    2.1586079222E+01    2.1075779865E+01    2.0531995663E+01    1.9957242555E+01    1.9354157817E+01    1.8725483654E+01    1.8074050247E+01    1.7402758375E+01    1.6714561729E+01    1.6012449053E+01    1.5299426239E+01    1.4578498499E+01    1.3852652733E+01    1.3124840230E+01    1.2397959807E+01    1.1674841511E+01    1.0958230987E+01    1.0250774619E+01    9.5550055384E+00    8.8733305934E+00    8.2080183579E+00    7.5611882529E+00    6.9348008449E+00    6.330649 [...]
+    3.7612580123E+02    3.6803248238E+02    3.5931946649E+02    3.5002798670E+02    3.4020168616E+02    3.2988633894E+02    3.1912955885E+02    3.0798049850E+02    2.9648954075E+02    2.8470798485E+02    2.7268772953E+02    2.6048095544E+02    2.4813980921E+02    2.3571609135E+02    2.2326095035E+02    2.1082458498E+02    1.9845595701E+02    1.8620251622E+02    1.7410993971E+02    1.6222188704E+02    1.5057977300E+02    1.3922255937E+02    1.2818656688E+02    1.1750530863E+02    1.072093 [...]
+    1.5669762373E+03    1.5332605568E+03    1.4969667096E+03    1.4582661861E+03    1.4173404852E+03    1.3743799567E+03    1.3295825928E+03    1.2831527799E+03    1.2353000182E+03    1.1862376195E+03    1.1361813924E+03    1.0853483245E+03    1.0339552715E+03    9.8221766183E+02    9.3034822687E+02    8.7855576541E+02    8.2704395065E+02    7.7601018837E+02    7.2564453384E+02    6.7612867463E+02    6.2763498605E+02    5.8032566515E+02    5.3435194857E+02    4.8985341888E+02    4.469574 [...]
+    3.0891742342E+03    3.0227074771E+03    2.9511602287E+03    2.8748703911E+03    2.7941955792E+03    2.7095108393E+03    2.6212062717E+03    2.5296845715E+03    2.4353585085E+03    2.3386483629E+03    2.2399793369E+03    2.1397789596E+03    2.0384745059E+03    1.9364904463E+03    1.8342459460E+03    1.7321524317E+03    1.6306112428E+03    1.5300113820E+03    1.4307273823E+03    1.3331173034E+03    1.2375208706E+03    1.1442577689E+03    1.0536261015E+03    9.6590102255E+02    8.813335 [...]
+    4.5203523300E+03    4.4230931992E+03    4.3184015465E+03    4.2067716812E+03    4.0887267421E+03    3.9648153627E+03    3.8356081942E+03    3.7016943098E+03    3.5636775190E+03    3.4221726187E+03    3.2778016072E+03    3.1311898904E+03    2.9829625067E+03    2.8337403978E+03    2.6841367516E+03    2.5347534441E+03    2.3861776034E+03    2.2389783211E+03    2.0937035320E+03    1.9508770836E+03    1.8109960139E+03    1.6745280558E+03    1.5419093823E+03    1.4135426060E+03    1.289795 [...]
+    5.5574005683E+03    5.4378292540E+03    5.3091217334E+03    5.1718855988E+03    5.0267638730E+03    4.8744309115E+03    4.7155881294E+03    4.5509595832E+03    4.3812874423E+03    4.2073273809E+03    4.0298439268E+03    3.8496057991E+03    3.6673812691E+03    3.4839335772E+03    3.3000164397E+03    3.1163696754E+03    2.9337149836E+03    2.7527519019E+03    2.5741539718E+03    2.3985651371E+03    2.2265963977E+03    2.0588227425E+03    1.8957803775E+03    1.7379642665E+03    1.585825 [...]
+    6.0327263457E+03    5.9029287696E+03    5.7632149006E+03    5.6142441892E+03    5.4567145346E+03    5.2913578390E+03    5.1189353698E+03    4.9402329665E+03    4.7560561260E+03    4.5672250030E+03    4.3745693627E+03    4.1789235218E+03    3.9811213145E+03    3.7819911195E+03    3.5823509839E+03    3.3830038778E+03    3.1847331122E+03    2.9882979533E+03    2.7944294605E+03    2.6038265778E+03    2.4171525032E+03    2.2350313586E+03    2.0580451820E+03    1.8867312581E+03    1.721579 [...]
+    5.9107794005E+03    5.7836062427E+03    5.6467184994E+03    5.5007621876E+03    5.3464209850E+03    5.1844118752E+03    5.0154806057E+03    4.8403969936E+03    4.6599501116E+03    4.4749433923E+03    4.2861896838E+03    4.0945062955E+03    3.9007100673E+03    3.7056124994E+03    3.5100149760E+03    3.3147041173E+03    3.1204472920E+03    2.9279883209E+03    2.7380434008E+03    2.5512972754E+03    2.3683996788E+03    2.1899620740E+03    2.0165547053E+03    1.8487039836E+03    1.686890 [...]
+    5.2676521985E+03    5.1543168515E+03    5.0323251245E+03    4.9022526458E+03    4.7647085956E+03    4.6203318273E+03    4.4697868212E+03    4.3137595023E+03    4.1529529523E+03    3.9880830483E+03    3.8198740584E+03    3.6490542276E+03    3.4763513864E+03    3.3024886110E+03    3.1281799693E+03    2.9541263794E+03    2.7810116122E+03    2.6094984634E+03    2.4402251222E+03    2.2738017596E+03    2.1108073599E+03    1.9517868139E+03    1.7972482933E+03    1.6476609200E+03    1.503452 [...]
+    4.2585755777E+03    4.1669514644E+03    4.0683303461E+03    3.9631774885E+03    3.8519852725E+03    3.7352700588E+03    3.6135689190E+03    3.4874362559E+03    3.3574403388E+03    3.2241597794E+03    3.0881799724E+03    2.9500895295E+03    2.8104767303E+03    2.6699260154E+03    2.5290145493E+03    2.3883088732E+03    2.2483616751E+03    2.1097086959E+03    1.9728657949E+03    1.8383261925E+03    1.7065579093E+03    1.5780014172E+03    1.4530675161E+03    1.3321354509E+03    1.215551 [...]
+    3.0792932567E+03    3.0130422104E+03    2.9417328510E+03    2.8657015144E+03    2.7853041330E+03    2.7009139704E+03    2.6129192591E+03    2.5217207585E+03    2.4277292509E+03    2.3313629951E+03    2.2330451546E+03    2.1332012201E+03    2.0322564452E+03    1.9306333124E+03    1.8287490484E+03    1.7270132062E+03    1.6258253300E+03    1.5255727197E+03    1.4266283098E+03    1.3293486765E+03    1.2340721865E+03    1.1411172993E+03    1.0507810322E+03    9.6333759848E+02    8.790372 [...]
+    1.9275163894E+03    1.8860463644E+03    1.8414110303E+03    1.7938208385E+03    1.7434984983E+03    1.6906775600E+03    1.6356009377E+03    1.5785193823E+03    1.5196899153E+03    1.4593742365E+03    1.3978371156E+03    1.3353447803E+03    1.2721633128E+03    1.2085570644E+03    1.1447871025E+03    1.0811096972E+03    1.0177748617E+03    9.5502495336E+02    8.9309334719E+02    8.3220318907E+02    7.7256623760E+02    7.1438180168E+02    6.5783578018E+02    6.0309980962E+02    5.503305 [...]
+    9.6997451911E+02    9.4910621922E+02    9.2664592392E+02    9.0269946655E+02    8.7737884121E+02    8.5080149099E+02    8.2308956567E+02    7.9436915456E+02    7.6476949976E+02    7.3442219606E+02    7.0346038294E+02    6.7201793476E+02    6.4022865484E+02    6.0822547931E+02    5.7613969624E+02    5.4410018562E+02    5.1223268548E+02    4.8065908901E+02    4.4949677771E+02    4.1885799468E+02    3.8884926233E+02    3.5957084816E+02    3.3111628172E+02    3.0357192588E+02    2.770166 [...]
+    3.1916460607E+02    3.1229836272E+02    3.0490895336E+02    2.9703114689E+02    2.8870173340E+02    2.7995929087E+02    2.7084394184E+02    2.6139710197E+02    2.5166122218E+02    2.4167952633E+02    2.3149574643E+02    2.2115385715E+02    2.1069781161E+02    2.0017128037E+02    1.8961739536E+02    1.7907850065E+02    1.6859591173E+02    1.5820968494E+02    1.4795839860E+02    1.3787894737E+02    1.2800635101E+02    1.1837357894E+02    1.0901139150E+02    9.9948198941E+01    9.120993 [...]
+    2.2022768384E+01    2.1549140963E+01    2.1039704417E+01    2.0496834096E+01    1.9923042250E+01    1.9320962305E+01    1.8693332481E+01    1.8042978855E+01    1.7372798001E+01    1.6685739327E+01    1.5984787238E+01    1.5272943247E+01    1.4553208170E+01    1.3828564515E+01    1.3101959206E+01    1.2376286737E+01    1.1654372900E+01    1.0938959168E+01    1.0232687857E+01    9.5380881555E+00    8.8575631085E+00    8.1933776458E+00    7.5476477193E+00    6.9223306168E+00    6.319216 [...]
+    6.0720326897E+01    5.9413560855E+01    5.8006350758E+01    5.6505386126E+01    5.4917749124E+01    5.3250868972E+01    5.1512474384E+01    4.9710544395E+01    4.7853257951E+01    4.5948942627E+01    4.4006022858E+01    4.2032968076E+01    4.0038241107E+01    3.8030247231E+01    3.6017284255E+01    3.4007493953E+01    3.2008815228E+01    3.0028939310E+01    2.8075267298E+01    2.6154870336E+01    2.4274452682E+01    2.2440317898E+01    2.0658338382E+01    1.8933928416E+01    1.727202 [...]
+    3.6393094718E+02    3.5609999796E+02    3.4766937856E+02    3.3867899059E+02    3.2917106813E+02    3.1918990752E+02    3.0878158566E+02    2.9799366864E+02    2.8687491313E+02    2.7547496258E+02    2.6384404050E+02    2.5203264311E+02    2.4009123351E+02    2.2806993966E+02    2.1601825825E+02    2.0398476663E+02    1.9201684472E+02    1.8016040892E+02    1.6845965977E+02    1.5695684497E+02    1.4569203956E+02    1.3470294430E+02    1.2402470375E+02    1.1368974512E+02    1.037276 [...]
+    8.2549390419E+02    8.0773189736E+02    7.8861102105E+02    7.6822167272E+02    7.4665952849E+02    7.2402493213E+02    7.0042225782E+02    6.7595925132E+02    6.5074635458E+02    6.2489601868E+02    5.9852201017E+02    5.7173871588E+02    5.4466045123E+02    5.1740077703E+02    4.9007182956E+02    4.6278366884E+02    4.3564364940E+02    4.0875581806E+02    3.8222034274E+02    3.5613297610E+02    3.3058455754E+02    3.0566055659E+02    2.8144066079E+02    2.5799841007E+02    2.354008 [...]
+    1.3265880617E+03    1.2980446583E+03    1.2673185831E+03    1.2345550197E+03    1.1999076254E+03    1.1635375503E+03    1.1256124149E+03    1.0863052530E+03    1.0457934278E+03    1.0042575292E+03    9.6188026099E+02    9.1884532517E+02    8.7533631183E+02    8.3153560280E+02    7.8762329653E+02    7.4377616197E+02    7.0016662866E+02    6.5696182005E+02    6.1432263650E+02    5.7240289420E+02    5.3134852541E+02    4.9129684536E+02    4.5237589008E+02    4.1470382912E+02    3.783884 [...]
+    1.7574025998E+03    1.7195901000E+03    1.6788870172E+03    1.6354856089E+03    1.5895893492E+03    1.5414116321E+03    1.4911744172E+03    1.4391068311E+03    1.3854437327E+03    1.3304242543E+03    1.2742903281E+03    1.2172852098E+03    1.1596520094E+03    1.1016322403E+03    1.0434643958E+03    9.8538256454E+02    9.2761509402E+02    8.7038331045E+02    8.1390030508E+02    7.5836979401E+02    7.0398505942E+02    6.5092797870E+02    5.9936814755E+02    5.4946210217E+02    5.013526 [...]
+    2.0348033793E+03    1.9910227263E+03    1.9438960543E+03    1.8936458996E+03    1.8405077784E+03    1.7847286862E+03    1.7265655312E+03    1.6662835157E+03    1.6041544766E+03    1.5404551972E+03    1.4754657025E+03    1.4094675510E+03    1.3427421349E+03    1.2755690011E+03    1.2082242041E+03    1.1409787045E+03    1.0740968218E+03    1.0078347533E+03    9.4243916985E+02    8.7814589591E+02    8.1517868448E+02    7.5374809320E+02    6.9405046938E+02    6.3626704945E+02    5.805631 [...]
+    2.1135109308E+03    2.0680372216E+03    2.0190888459E+03    1.9668968837E+03    1.9117058909E+03    1.8537723399E+03    1.7933629951E+03    1.7307532318E+03    1.6662253141E+03    1.6000666426E+03    1.5325679845E+03    1.4640217014E+03    1.3947199837E+03    1.3249531085E+03    1.2550077299E+03    1.1851652162E+03    1.1157000437E+03    1.0468782594E+03    9.7895602289E+02    9.1217823612E+02    8.4677727128E+02    7.8297180389E+02    7.2096575872E+02    6.6094737458E+02    6.030883 [...]
+    1.9896220352E+03    1.9468142734E+03    1.9007362616E+03    1.8516054743E+03    1.7996520645E+03    1.7451173982E+03    1.6882525252E+03    1.6293165980E+03    1.5685752520E+03    1.5062989563E+03    1.4427613494E+03    1.3782375715E+03    1.3130026038E+03    1.2473296293E+03    1.1814884247E+03    1.1157437954E+03    1.0503540645E+03    9.8556962700E+02    9.2163157687E+02    8.5877041835E+02    7.9720486856E+02    7.3714075947E+02    6.7877004573E+02    6.2226992450E+02    5.678020 [...]
+    1.6966855593E+03    1.6601808511E+03    1.6208880876E+03    1.5789926656E+03    1.5346907881E+03    1.4881882144E+03    1.4396989577E+03    1.3894439376E+03    1.3376495995E+03    1.2845465099E+03    1.2303679379E+03    1.1753484338E+03    1.1197224147E+03    1.0637227669E+03    1.0075794758E+03    9.5151829221E+02    8.9575944488E+02    8.4051640760E+02    7.8599472974E+02    7.3239093748E+02    6.7989151327E+02    6.2867195970E+02    5.7889595372E+02    5.3071459609E+02    4.842657 [...]
+    1.2957574552E+03    1.2678791915E+03    1.2378723661E+03    1.2058785114E+03    1.1720474061E+03    1.1365361222E+03    1.0995080308E+03    1.0611317744E+03    1.0215802134E+03    9.8102935418E+02    9.3965726699E+02    8.9764300149E+02    8.5516550734E+02    8.1240256799E+02    7.6952975512E+02    7.2671941103E+02    6.8413966607E+02    6.4195349788E+02    6.0031783878E+02    5.5938273724E+02    5.1929057882E+02    4.8017537163E+02    4.4216210057E+02    4.0536615426E+02    3.698928 [...]
+    8.6172710228E+02    8.4318734599E+02    8.2323264605E+02    8.0195707512E+02    7.7946018455E+02    7.5584637115E+02    7.3122421701E+02    7.0570580693E+02    6.7940602868E+02    6.5244186120E+02    6.2493165586E+02    5.9699441613E+02    5.6874908071E+02    5.4031381535E+02    5.1180531831E+02    4.8333814442E+02    4.5502405237E+02    4.2697137969E+02    3.9928444969E+02    3.7206301431E+02    3.4540173638E+02    3.1938971474E+02    2.9411005496E+02    2.6963948831E+02    2.460480 [...]
+    4.6861569176E+02    4.5853388559E+02    4.4768318316E+02    4.3611469591E+02    4.2388250960E+02    4.1104334078E+02    3.9765617849E+02    3.8378191391E+02    3.6948296068E+02    3.5482286868E+02    3.3986593400E+02    3.2467680807E+02    3.0932010864E+02    2.9386003545E+02    2.7835999328E+02    2.6288222512E+02    2.4748745777E+02    2.3223456259E+02    2.1718023352E+02    2.0237868445E+02    1.8788136807E+02    1.7373671786E+02    1.5998991484E+02    1.4668268041E+02    1.338530 [...]
+    1.7646900661E+02    1.7267269069E+02    1.6858728748E+02    1.6423200659E+02    1.5962717363E+02    1.5479410138E+02    1.4975495560E+02    1.4453261614E+02    1.3915053469E+02    1.3363259004E+02    1.2800294188E+02    1.2228588428E+02    1.1650569989E+02    1.1068651587E+02    1.0485216251E+02    9.9026035668E+01    9.3230963884E+01    8.7489081051E+01    8.1821705589E+01    7.6249226845E+01    7.0790999495E+01    6.5465246596E+01    6.0288971884E+01    5.5277881842E+01    5.044631 [...]
+    2.1955687726E+01    2.1483497049E+01    2.0975595058E+01    2.0434350791E+01    1.9862269862E+01    1.9261978782E+01    1.8636208604E+01    1.7987778022E+01    1.7319576050E+01    1.6634544393E+01    1.5935659652E+01    1.5225915469E+01    1.4508304758E+01    1.3785802142E+01    1.3061346699E+01    1.2337825171E+01    1.1618055714E+01    1.0904772326E+01    1.0200610042E+01    9.5080909928E+00    8.8296114301E+00    8.1674297787E+00    7.5236558061E+00    6.9002409643E+00    6.298969 [...]
+    1.3959093083E+01    1.3658590394E+01    1.3334828502E+01    1.2989359049E+01    1.2623825442E+01    1.2239952148E+01    1.1839533528E+01    1.1424422284E+01    1.0996517622E+01    1.0557753203E+01    1.0110084989E+01    9.6554790663E+00    9.1958995378E+00    8.7332965730E+00    8.2695947063E+00    7.8066814642E+00    7.3463964045E+00    6.8905206440E+00    6.4407669474E+00    5.9987704443E+00    5.5660800365E+00    5.1441505495E+00    4.7343356784E+00    4.3378817694E+00    3.955922 [...]
+    1.3447969651E+02    1.3158577890E+02    1.2846983933E+02    1.2514665766E+02    1.2163187945E+02    1.1794191562E+02    1.1409383768E+02    1.1010526948E+02    1.0599427621E+02    1.0177925150E+02    9.7478803387E+01    9.3111640142E+01    8.8696456604E+01    8.4251821972E+01    7.9796069813E+01    7.5347191063E+01    7.0922730783E+01    6.6539689385E+01    6.2214428994E+01    5.7962585575E+01    5.3798987402E+01    4.9737580386E+01    4.5791360724E+01    4.1972315264E+01    3.829136 [...]
+    3.4422135124E+02    3.3681445366E+02    3.2884026132E+02    3.2033652316E+02    3.1134319517E+02    3.0190218469E+02    2.9205708377E+02    2.8185289353E+02    2.7133574149E+02    2.6055259411E+02    2.4955096650E+02    2.3837863160E+02    2.2708333073E+02    2.1571248782E+02    2.0431292913E+02    1.9293061072E+02    1.8161035526E+02    1.7039560024E+02    1.5932815925E+02    1.4844799773E+02    1.3779302497E+02    1.2739890341E+02    1.1729887653E+02    1.0752361635E+02    9.810109 [...]
+    5.9147638812E+02    5.7874950885E+02    5.6504862856E+02    5.5043854718E+02    5.3498785004E+02    5.1876846954E+02    5.0185522814E+02    4.8432536574E+02    4.6625805524E+02    4.4773390973E+02    4.2883448491E+02    4.0964178046E+02    3.9023774394E+02    3.7070378074E+02    3.5112027361E+02    3.3156611526E+02    3.1211825709E+02    2.9285127732E+02    2.7383697143E+02    2.5514396759E+02    2.3683736954E+02    2.1897842939E+02    2.0162425210E+02    1.8482753355E+02    1.686363 [...]
+    8.2246603109E+02    8.0476927021E+02    7.8571880654E+02    7.6540469099E+02    7.4392223219E+02    7.2137138789E+02    6.9785613035E+02    6.7348379018E+02    6.4836438369E+02    6.2260992864E+02    5.9633375342E+02    5.6964980462E+02    5.4267195821E+02    5.1551333906E+02    4.8828565377E+02    4.6109854148E+02    4.3405894722E+02    4.0727052208E+02    3.8083305424E+02    3.5484193476E+02    3.2938766149E+02    3.0455538425E+02    2.8042449423E+02    2.5706825977E+02    2.345535 [...]
+    9.9118922987E+02    9.6986242158E+02    9.4690481798E+02    9.2242489332E+02    8.9653745267E+02    8.6936289938E+02    8.4102647106E+02    8.1165744974E+02    7.8138835214E+02    7.5035410596E+02    7.1869121821E+02    6.8653694180E+02    6.5402844615E+02    6.2130199803E+02    5.8849215832E+02    5.5573100048E+02    5.2314735592E+02    4.9086609183E+02    4.5900742606E+02    4.2768628370E+02    3.9701169961E+02    3.6708627068E+02    3.3800566104E+02    3.0985816333E+02    2.827243 [...]
+    1.0670754273E+03    1.0441161202E+03    1.0194017301E+03    9.9304898978E+02    9.6518144222E+02    9.3592865315E+02    9.0542538913E+02    8.7381076811E+02    8.4122738854E+02    8.0782044345E+02    7.7373682601E+02    7.3912423307E+02    7.0413027318E+02    6.6890158549E+02    6.3358297578E+02    5.9831657574E+02    5.6324103130E+02    5.2849072571E+02    4.9419504243E+02    4.6047767300E+02    4.2745597407E+02    3.9524037802E+02    3.6393386046E+02    3.3363146800E+02    3.044199 [...]
+    1.0392572099E+03    1.0168967244E+03    9.9282744761E+02    9.6716302483E+02    9.4002372969E+02    9.1153569729E+02    8.8183012468E+02    8.5104244433E+02    8.1931147675E+02    7.8677856844E+02    7.5358672164E+02    7.1987972196E+02    6.8580127054E+02    6.5149412658E+02    6.1709926665E+02    5.8275506656E+02    5.4859651148E+02    5.1475443977E+02    4.8135482564E+02    4.4851810540E+02    4.1635855165E+02    3.8498369944E+02    3.5449382790E+02    3.2498150033E+02    2.965311 [...]
+    9.1696654713E+02    8.9723751681E+02    8.7600128424E+02    8.5335807997E+02    8.2941397819E+02    8.0428022101E+02    7.7807251364E+02    7.5091029593E+02    7.2291599540E+02    6.9421426746E+02    6.6493122830E+02    6.3519368598E+02    6.0512837543E+02    5.7486120258E+02    5.4451650336E+02    5.1421632239E+02    4.8407971667E+02    4.5422208893E+02    4.2475455515E+02    3.9578335047E+02    3.6740927733E+02    3.3972719946E+02    3.1282558455E+02    2.8678609862E+02    2.616832 [...]
+    7.2628169194E+02    7.1065560662E+02    6.9383623490E+02    6.7590292402E+02    6.5693964531E+02    6.3703445961E+02    6.1627895977E+02    5.9476769427E+02    5.7259757644E+02    5.4986728334E+02    5.2667664892E+02    5.0312605577E+02    4.7931582989E+02    4.5534564273E+02    4.3131392486E+02    4.0731729536E+02    3.8345001083E+02    3.5980343783E+02    3.3646555245E+02    3.1352047006E+02    2.9104800859E+02    2.6912328788E+02    2.4781636766E+02    2.2719192635E+02    2.073089 [...]
+    5.0408208932E+02    4.9323691211E+02    4.8156398612E+02    4.6911834511E+02    4.5595822817E+02    4.4214470924E+02    4.2774131080E+02    4.1281360458E+02    3.9742880212E+02    3.8165533830E+02    3.6556245089E+02    3.4921975899E+02    3.3269684371E+02    3.1606283377E+02    2.9938599919E+02    2.8273335581E+02    2.6617028336E+02    2.4976015990E+02    2.3356401473E+02    2.1764020255E+02    2.0204410046E+02    1.8682783022E+02    1.7204000710E+02    1.5772551696E+02    1.439253 [...]
+    2.9050215678E+02    2.8425230971E+02    2.7752585265E+02    2.7035446704E+02    2.6277167778E+02    2.5481264030E+02    2.4651391855E+02    2.3791325546E+02    2.2904933762E+02    2.1996155591E+02    2.1068976381E+02    2.0127403510E+02    1.9175442283E+02    1.8217072109E+02    1.7256223136E+02    1.6296753521E+02    1.5342427462E+02    1.4396894171E+02    1.3463667921E+02    1.2546109282E+02    1.1647407704E+02    1.0770565516E+02    9.9183834707E+01    9.0934479043E+01    8.298119 [...]
+    1.2134919709E+02    1.1873868381E+02    1.1592943536E+02    1.1293465665E+02    1.0976831952E+02    1.0644507422E+02    1.0298015716E+02    9.9389295587E+01    9.5688609764E+01    9.1894513548E+01    8.8023613953E+01    8.4092610482E+01    8.0118194932E+01    7.6116952399E+01    7.2105264162E+01    6.8099213140E+01    6.4114492565E+01    6.0166318505E+01    5.6269346816E+01    5.2437595068E+01    4.8684369968E+01    4.5022200715E+01    4.1462778715E+01    3.8016903990E+01    3.469443 [...]
+    2.1853097741E+01    2.1383105180E+01    2.0877552471E+01    2.0338798866E+01    1.9769339693E+01    1.9171790730E+01    1.8548871905E+01    1.7903390449E+01    1.7238223638E+01    1.6556301220E+01    1.5860587675E+01    1.5154064431E+01    1.4439712149E+01    1.3720493217E+01    1.2999334563E+01    1.2279110918E+01    1.1562628629E+01    1.0852610137E+01    1.0151679231E+01    9.4623471642E+00    8.7869997195E+00    8.1278853190E+00    7.4871042360E+00    6.8665989789E+00    6.268145 [...]
+    2.7815025587E+00    2.7215829114E+00    2.6569501429E+00    2.5879198789E+00    2.5148267354E+00    2.4380220805E+00    2.3578716981E+00    2.2747533706E+00    2.1890544009E+00    2.1011690918E+00    2.0114962034E+00    1.9204364080E+00    1.8283897611E+00    1.7357532096E+00    1.6429181536E+00    1.5502680825E+00    1.4581762998E+00    1.3670037564E+00    1.2770970050E+00    1.1887862907E+00    1.1023837921E+00    1.0181820216E+00    9.3645239804E-01    8.5744399751E-01    7.813824 [...]
+    5.9458673807E+01    5.8179029138E+01    5.6800968876E+01    5.5331048351E+01    5.3776207902E+01    5.2143728159E+01    5.0441183386E+01    4.8676393245E+01    4.6857373343E+01    4.4992284930E+01    4.3089384116E+01    4.1156970992E+01    3.9203339022E+01    3.7236725071E+01    3.5265260439E+01    3.3296923242E+01    3.1339492473E+01    2.9400504071E+01    2.7487209300E+01    2.5606535701E+01    2.3765050893E+01    2.1968929442E+01    2.0223923009E+01    1.8535333946E+01    1.690799 [...]
+    1.7366780829E+02    1.6993063669E+02    1.6590683865E+02    1.6161549324E+02    1.5707679670E+02    1.5231193293E+02    1.4734293834E+02    1.4219256223E+02    1.3688412349E+02    1.3144136501E+02    1.2588830659E+02    1.2024909753E+02    1.1454787009E+02    1.0880859465E+02    1.0305493780E+02    9.7310124298E+01    9.1596803838E+01    8.5936923581E+01    8.0351607321E+01    7.4861042079E+01    6.9484372868E+01    6.4239606304E+01    5.9143523661E+01    5.4211603865E+01    4.945795 [...]
+    3.1789850595E+02    3.1105795178E+02    3.0369335630E+02    2.9583959224E+02    2.8753357175E+02    2.7881401010E+02    2.6972117921E+02    2.6029665293E+02    2.5058304579E+02    2.4062374732E+02    2.3046265378E+02    2.2014389937E+02    2.0971158874E+02    1.9920953287E+02    1.8868099012E+02    1.7816841428E+02    1.6771321143E+02    1.5735550729E+02    1.4713392654E+02    1.3708538574E+02    1.2724490108E+02    1.1764541223E+02    1.0831762337E+02    9.9289862297E+01    9.058795 [...]
+    4.6101315530E+02    4.5109333603E+02    4.4041409523E+02    4.2902596091E+02    4.1698241383E+02    4.0433954550E+02    3.9115570161E+02    3.7749111331E+02    3.6340751920E+02    3.4896778084E+02    3.3423549457E+02    3.1927460243E+02    3.0414900513E+02    2.8892217973E+02    2.7365680480E+02    2.5841439580E+02    2.4325495303E+02    2.2823662481E+02    2.1341538794E+02    1.9884474784E+02    1.8457545999E+02    1.7065527482E+02    1.5712870726E+02    1.4403683258E+02    1.314171 [...]
+    5.7420927412E+02    5.6185401904E+02    5.4855335974E+02    5.3437019112E+02    5.1937108147E+02    5.0362584728E+02    4.8720710967E+02    4.7018983588E+02    4.5265086919E+02    4.3466845075E+02    4.1632173675E+02    3.9769031465E+02    3.7885372172E+02    3.5989096956E+02    3.4088007792E+02    3.2189762107E+02    3.0301828993E+02    2.8431447298E+02    2.6585585880E+02    2.4770906281E+02    2.2993728074E+02    2.1259997102E+02    1.9575256792E+02    1.7944622734E+02    1.637276 [...]
+    6.3617264683E+02    6.2248436171E+02    6.0774910123E+02    5.9203651058E+02    5.7542030079E+02    5.5797777818E+02    5.3978935358E+02    5.2093803502E+02    5.0150890755E+02    4.8158860414E+02    4.6126477149E+02    4.4062553466E+02    4.1975896432E+02    3.9875255065E+02    3.7769268738E+02    3.5666416978E+02    3.3574971008E+02    3.1502947363E+02    2.9458063887E+02    2.7447698421E+02    2.5478850437E+02    2.3558105867E+02    2.1691605338E+02    1.9885016010E+02    1.814350 [...]
+    6.3653208475E+02    6.2283628777E+02    6.0809334694E+02    5.9237291210E+02    5.7574869751E+02    5.5829801154E+02    5.4010126619E+02    5.2124147014E+02    5.0180370890E+02    4.8187461603E+02    4.6154183932E+02    4.4089350571E+02    4.2001768892E+02    3.9900188359E+02    3.7793248957E+02    3.5689431027E+02    3.3597006815E+02    3.1523994114E+02    2.9478112271E+02    2.7466740887E+02    2.5496881451E+02    2.3575122168E+02    2.1707606195E+02    1.9900003466E+02    1.815748 [...]
+    5.7709001470E+02    5.6467340134E+02    5.5130783461E+02    5.3705642711E+02    5.2198597264E+02    5.0616652044E+02    4.8967093108E+02    4.7257441740E+02    4.5495407380E+02    4.3688839750E+02    4.1845680513E+02    3.9973914827E+02    3.8081523134E+02    3.6176433540E+02    3.4266475124E+02    3.2359332494E+02    3.0462501920E+02    2.8583249334E+02    2.6728570492E+02    2.4905153555E+02    2.3119344334E+02    2.1377114418E+02    1.9684032393E+02    1.8045238298E+02    1.646542 [...]
+    4.7073968086E+02    4.6061149373E+02    4.4970961937E+02    4.3808550787E+02    4.2579360872E+02    4.1289102398E+02    3.9943714657E+02    3.8549328633E+02    3.7112228671E+02    3.5638813476E+02    3.4135556743E+02    3.2608967697E+02    3.1065551819E+02    2.9511772064E+02    2.7954010816E+02    2.6398532876E+02    2.4851449715E+02    2.3318685261E+02    2.1805943433E+02    2.0318677648E+02    1.8862062495E+02    1.7440967757E+02    1.6059934939E+02    1.4723156442E+02    1.343445 [...]
+    3.3840650558E+02    3.3112572134E+02    3.2328911267E+02    3.1493363617E+02    3.0609840139E+02    2.9682442202E+02    2.8715435633E+02    2.7713223892E+02    2.6680320567E+02    2.5621321395E+02    2.4540876018E+02    2.3443659660E+02    2.2334344959E+02    2.1217574132E+02    2.0097931675E+02    1.8979917800E+02    1.7867922784E+02    1.6766202404E+02    1.5678854638E+02    1.4609797765E+02    1.3562750030E+02    1.2541210984E+02    1.1548444619E+02    1.0587464405E+02    9.661020 [...]
+    2.0469160176E+02    2.0028785819E+02    1.9554825097E+02    1.9049510638E+02    1.8515204994E+02    1.7954385636E+02    1.7369629303E+02    1.6763595825E+02    1.6139011536E+02    1.5498652401E+02    1.4845326983E+02    1.4181859362E+02    1.3511072147E+02    1.2835769685E+02    1.2158721593E+02    1.1482646736E+02    1.0810197746E+02    1.0143946203E+02    9.4863685643E+01    8.8398329539E+01    8.2065868747E+01    7.5887459407E+01    6.9882836871E+01    6.4070225224E+01    5.846625 [...]
+    9.3092936384E+01    9.1090284375E+01    8.8935174934E+01    8.6637738030E+01    8.4208691940E+01    8.1659275381E+01    7.9001176734E+01    7.6246460893E+01    7.3407494265E+01    7.0496868478E+01    6.7527323339E+01    6.4511669615E+01    6.1462712168E+01    5.8393174014E+01    5.5315621826E+01    5.2242393407E+01    4.9185527630E+01    4.6156697336E+01    4.3167145621E+01    4.0227625946E+01    3.7348346461E+01    3.4538918877E+01    3.1808312218E+01    2.9164811714E+01    2.661598 [...]
+    2.1706526384E+01    2.1239675590E+01    2.0737483091E+01    2.0202293954E+01    1.9636588591E+01    1.9042967201E+01    1.8424133560E+01    1.7782878256E+01    1.7122061516E+01    1.6444595722E+01    1.5753427762E+01    1.5051521330E+01    1.4341839307E+01    1.3627326342E+01    1.2910891755E+01    1.2195392884E+01    1.1483618989E+01    1.0778275808E+01    1.0081970898E+01    9.3971998223E+00    8.7263332959E+00    8.0716053622E+00    7.4351026715E+00    6.8187549268E+00    6.224326 [...]
+    1.7096587652E-01    1.6726929489E-01    1.6325710760E-01    1.5895085404E-01    1.5437347965E-01    1.4954916243E-01    1.4450313128E-01    1.3926147780E-01    1.3385096324E-01    1.2829882238E-01    1.2263256601E-01    1.1687978393E-01    1.1106794995E-01    1.0522423087E-01    9.9375300859E-02    9.3547162917E-02    8.7764978844E-02    8.2052909163E-02    7.6433964204E-02    7.0929867538E-02    6.5560932755E-02    6.0345954448E-02    5.5302114143E-02    5.0444901706E-02    4.578805 [...]
+    2.8347964606E+01    2.7737787600E+01    2.7080529217E+01    2.6379327950E+01    2.5637507283E+01    2.4858554152E+01    2.4046096485E+01    2.3203879961E+01    2.2335744202E+01    2.1445598539E+01    2.0537397564E+01    1.9615116624E+01    1.8682727467E+01    1.7744174184E+01    1.6803349653E+01    1.5864072634E+01    1.4930065685E+01    1.4004934052E+01    1.3092145682E+01    1.2195012483E+01    1.1316672969E+01    1.0460076396E+01    9.6279684726E+00    8.8228787598E+00    8.047109 [...]
+    9.6885820943E+01    9.4800779825E+01    9.2555554829E+01    9.0160812805E+01    8.7627846353E+01    8.4968501189E+01    8.2195100379E+01    7.9320366000E+01    7.6357338829E+01    7.3319296651E+01    7.0219671786E+01    6.7071968454E+01    6.3889680573E+01    6.0686210593E+01    5.7474789943E+01    5.4268401661E+01    5.1079705750E+01    4.7920967786E+01    4.4803991243E+01    4.1740054018E+01    3.8739849553E+01    3.5813432929E+01    3.2970172279E+01    3.0218705790E+01    2.756690 [...]
+    1.8945888403E+02    1.8538189323E+02    1.8099219529E+02    1.7631060562E+02    1.7135915854E+02    1.6616096598E+02    1.6074007000E+02    1.5512129045E+02    1.4933006866E+02    1.4339230851E+02    1.3733421597E+02    1.3118213830E+02    1.2496240406E+02    1.1870116519E+02    1.1242424208E+02    1.0615697299E+02    9.9924068691E+01    9.3749473369E+01    8.7656232792E+01    8.1666370580E+01    7.5800773390E+01    7.0079085756E+01    6.4519615225E+01    5.9139248355E+01    5.395337 [...]
+    2.8617904853E+02    2.8002095975E+02    2.7339097427E+02    2.6632049703E+02    2.5884277017E+02    2.5099266013E+02    2.4280643559E+02    2.3432153789E+02    2.2557634570E+02    2.1660993561E+02    2.0746184040E+02    1.9817180688E+02    1.8877955484E+02    1.7932453914E+02    1.6984571633E+02    1.6038131773E+02    1.5096863035E+02    1.4164378731E+02    1.3244156907E+02    1.2339521689E+02    1.1453625964E+02    1.0589435522E+02    9.7497147370E+01    8.9370138840E+01    8.153658 [...]
+    3.6748641838E+02    3.5957894397E+02    3.5106590328E+02    3.4198759083E+02    3.3238665670E+02    3.2230783370E+02    3.1179765280E+02    3.0090414888E+02    2.8967655919E+02    2.7816501645E+02    2.6642023913E+02    2.5449322102E+02    2.4243492239E+02    2.3029596489E+02    2.1812633259E+02    2.0597508093E+02    1.9389005597E+02    1.8191762560E+02    1.7010242470E+02    1.5848711589E+02    1.4711216744E+02    1.3601564971E+02    1.2523305148E+02    1.1479711714E+02    1.047377 [...]
+    4.1777439392E+02    4.0878503130E+02    3.9910760634E+02    3.8878789714E+02    3.7787435639E+02    3.6641780171E+02    3.5447109262E+02    3.4208879664E+02    3.2932684693E+02    3.1624219409E+02    3.0289245450E+02    2.8933555803E+02    2.7562939745E+02    2.6183148216E+02    2.4799859871E+02    2.3418648051E+02    2.2044948898E+02    2.0684030840E+02    1.9340965657E+02    1.8020601304E+02    1.6727536688E+02    1.5466098544E+02    1.4240320567E+02    1.3053924902E+02    1.191030 [...]
+    4.2809204402E+02    4.1888085724E+02    4.0896496482E+02    3.9839124675E+02    3.8720932059E+02    3.7547122458E+02    3.6323108711E+02    3.5054478513E+02    3.3746959381E+02    3.2406383025E+02    3.1038649377E+02    2.9649690532E+02    2.8245434882E+02    2.6831771678E+02    2.5414516296E+02    2.3999376429E+02    2.2591919460E+02    2.1197541229E+02    1.9821436412E+02    1.8468570701E+02    1.7143654980E+02    1.5851121651E+02    1.4595103248E+02    1.3379413492E+02    1.220753 [...]
+    3.9747059401E+02    3.8891845877E+02    3.7971235852E+02    3.6989579266E+02    3.5951479932E+02    3.4861766167E+02    3.3725460147E+02    3.2547746234E+02    3.1333938509E+02    3.0089447733E+02    2.8819748000E+02    2.7530343313E+02    2.6226734326E+02    2.4914385492E+02    2.3598692853E+02    2.2284952698E+02    2.0978331303E+02    1.9683835969E+02    1.8406287547E+02    1.7150294636E+02    1.5920229628E+02    1.4720206735E+02    1.3554062155E+02    1.2425336471E+02    1.133725 [...]
+    3.3269794822E+02    3.2553965418E+02    3.1783428526E+02    3.0961822598E+02    3.0092998306E+02    2.9180993998E+02    2.8230010093E+02    2.7244382615E+02    2.6228556063E+02    2.5187055809E+02    2.4124460229E+02    2.3045372774E+02    2.1954394180E+02    2.0856095015E+02    1.9754988757E+02    1.8655505602E+02    1.7561967173E+02    1.6478562305E+02    1.5409324082E+02    1.4358108263E+02    1.3328573245E+02    1.2324161692E+02    1.1348083937E+02    1.0403303261E+02    9.492523 [...]
+    2.4666087493E+02    2.4135390451E+02    2.3564163798E+02    2.2955102586E+02    2.2311058935E+02    2.1635023877E+02    2.0930108416E+02    2.0199523953E+02    1.9446562209E+02    1.8674574813E+02    1.7886952687E+02    1.7087105381E+02    1.6278440514E+02    1.5464343466E+02    1.4648157456E+02    1.3833164162E+02    1.3022565004E+02    1.2219463226E+02    1.1426846892E+02    1.0647572920E+02    9.8843522418E+01    9.1397361994E+01    8.4161042467E+01    7.7156530393E+01    7.040386 [...]
+    1.5563355601E+02    1.5228520906E+02    1.4868141767E+02    1.4483916348E+02    1.4077641668E+02    1.3651202179E+02    1.3206557858E+02    1.2745731894E+02    1.2270798065E+02    1.1783867901E+02    1.1287077716E+02    1.0782575613E+02    1.0272508559E+02    9.7590095990E+01    9.2441853363E+01    8.7301037306E+01    8.2187823245E+01    7.7121769651E+01    7.2121711028E+01    6.7205657358E+01    6.2390700669E+01    5.7692929300E+01    5.3127350414E+01    4.8707821188E+01    4.444698 [...]
+    7.6067762380E+01    7.4431348353E+01    7.2670331644E+01    7.0792991842E+01    6.8808089491E+01    6.6724810598E+01    6.4552708766E+01    6.2301645380E+01    5.9981728284E+01    5.7603249399E+01    5.5176621737E+01    5.2712316255E+01    5.0220799015E+01    4.7712469091E+01    4.5197597660E+01    4.2686268705E+01    4.0188321742E+01    3.7713296954E+01    3.5270383111E+01    3.2868368613E+01    3.0515595971E+01    2.8219920028E+01    2.5988670154E+01    2.3828616650E+01    2.174594 [...]
+    2.1505409511E+01    2.1042871448E+01    2.0545294800E+01    2.0015004898E+01    1.9454461374E+01    1.8866242723E+01    1.8253030205E+01    1.7617591204E+01    1.6962762172E+01    1.6291431278E+01    1.5606520884E+01    1.4910969971E+01    1.4207716650E+01    1.3499680870E+01    1.2789747447E+01    1.2080749538E+01    1.1375452659E+01    1.0676539373E+01    9.9865947268E+00    9.3080925634E+00    8.6433827630E+00    7.9946795201E+00    7.3640507135E+00    6.7534084364E+00    6.164500 [...]
+    1.8187305977E-01    1.7797819077E-01    1.7381911585E-01    1.6941288419E-01    1.6477740372E-01    1.5993135111E-01    1.5489407845E-01    1.4968551715E-01    1.4432607944E-01    1.3883655820E-01    1.3323802522E-01    1.2755172884E-01    1.2179899109E-01    1.1600110514E-01    1.1017923332E-01    1.0435430646E-01    9.8546924810E-02    9.2777261284E-02    8.7064967311E-02    8.1429081897E-02    7.5887944324E-02    7.0459110946E-02    6.5159276514E-02    6.0004200445E-02    5.500863 [...]
+    1.3733394155E+01    1.3437732796E+01    1.3119155201E+01    1.2779190642E+01    1.2419458972E+01    1.2041660048E+01    1.1647562695E+01    1.1238993297E+01    1.0817824093E+01    1.0385961280E+01    9.9453329988E+00    9.4978773077E+00    9.0455302179E+00    8.5902138929E+00    8.1338250896E+00    7.6782239280E+00    7.2252230698E+00    6.7765773809E+00    6.3339741512E+00    5.8990239369E+00    5.4732520861E+00    5.0580910029E+00    4.6548731985E+00    4.2648251684E+00    3.889062 [...]
+    5.7197565714E+01    5.5966534382E+01    5.4640736129E+01    5.3226484702E+01    5.1730465055E+01    5.0159690206E+01    4.8521456222E+01    4.6823295686E+01    4.5072929976E+01    4.3278220734E+01    4.1447120874E+01    3.9587625495E+01    3.7707723060E+01    3.5815347191E+01    3.3918329439E+01    3.2024353358E+01    3.0140910207E+01    2.8275256595E+01    2.6434374350E+01    2.4624932895E+01    2.2853254361E+01    2.1125281679E+01    1.9446549831E+01    1.7822160441E+01    1.625675 [...]
+    1.2024689283E+02    1.1765912961E+02    1.1487260135E+02    1.1190054343E+02    1.0875696746E+02    1.0545657124E+02    1.0201464472E+02    9.8446972912E+01    9.4769736209E+01    9.0999409094E+01    8.7152657837E+01    8.3246237998E+01    7.9296892470E+01    7.5321250797E+01    7.1335730497E+01    6.7356441090E+01    6.3399091507E+01    5.9478901521E+01    5.5610517798E+01    5.1807935147E+01    4.8084423470E+01    4.4452460880E+01    4.0923673410E+01    3.7508781655E+01    3.421755 [...]
+    1.8936891941E+02    1.8529382530E+02    1.8090609770E+02    1.7622654828E+02    1.7127720771E+02    1.6608118429E+02    1.6066251652E+02    1.5504602064E+02    1.4925713432E+02    1.4332175770E+02    1.3726609289E+02    1.3111648309E+02    1.2489925267E+02    1.1864054906E+02    1.1236618796E+02    1.0610150265E+02    9.9871198594E+01    9.3699214401E+01    8.7608589944E+01    8.1621342640E+01    7.5758352649E+01    7.0039257721E+01    6.4482358366E+01    5.9104533872E+01    5.392116 [...]
+    2.5054330545E+02    2.4515196046E+02    2.3934733366E+02    2.3315693142E+02    2.2660986983E+02    2.1973668811E+02    2.1256915406E+02    2.0514006277E+02    1.9748303045E+02    1.8963228456E+02    1.8162245199E+02    1.7348834678E+02    1.6526475896E+02    1.5698624597E+02    1.4868692821E+02    1.4040029017E+02    1.3215898843E+02    1.2399466810E+02    1.1593778860E+02    1.0801746024E+02    1.0026129261E+02    9.2695255507E+01    8.5343553680E+01    7.8228515697E+01    7.137049 [...]
+    2.9189390034E+02    2.8561291459E+02    2.7885075524E+02    2.7163944235E+02    2.6401286856E+02    2.5600658213E+02    2.4765756063E+02    2.3900397705E+02    2.3008495994E+02    2.2094034945E+02    2.1161045101E+02    2.0213578851E+02    1.9255685875E+02    1.8291388886E+02    1.7324659856E+02    1.6359396883E+02    1.5399401864E+02    1.4448359135E+02    1.3509815207E+02    1.2587159755E+02    1.1683607959E+02    1.0802184335E+02    9.9457081396E+01    9.1167804289E+01    8.317772 [...]
+    3.0582168742E+02    2.9924115935E+02    2.9215679638E+02    2.8460212201E+02    2.7661261896E+02    2.6822550234E+02    2.5947948294E+02    2.5041452258E+02    2.4107158327E+02    2.3149237207E+02    2.2171908345E+02    2.1179414117E+02    2.0175994139E+02    1.9165859902E+02    1.8153169895E+02    1.7142005409E+02    1.6136347184E+02    1.5140053049E+02    1.4156836728E+02    1.3190247937E+02    1.2243653909E+02    1.1320222461E+02    1.0422906708E+02    9.5544315191E+01    8.717281 [...]
+    2.9024293614E+02    2.8399777306E+02    2.7727472406E+02    2.7010558170E+02    2.6252399545E+02    2.5456525677E+02    2.4626607484E+02    2.3766434482E+02    2.2879891018E+02    2.1970932100E+02    2.1043558990E+02    2.0101794745E+02    1.9149659883E+02    1.8191148344E+02    1.7230203926E+02    1.6270697351E+02    1.5316404134E+02    1.4370983393E+02    1.3437957763E+02    1.2520694521E+02    1.1622388075E+02    1.0746043907E+02    9.8944640707E+01    9.0702343432E+01    8.275713 [...]
+    2.4874009024E+02    2.4338808695E+02    2.3762680332E+02    2.3148346354E+02    2.2498688082E+02    2.1816727348E+02    2.1105607317E+02    2.0368572665E+02    1.9608949252E+02    1.8830123448E+02    1.8035521256E+02    1.7228587393E+02    1.6412764476E+02    1.5591472456E+02    1.4768088461E+02    1.3945927175E+02    1.3128221901E+02    1.2318106435E+02    1.1518597866E+02    1.0732580431E+02    9.9627905203E+01    9.2118029244E+01    8.4820184224E+01    7.7756527687E+01    7.094727 [...]
+    1.8964405572E+02    1.8556372479E+02    1.8117160927E+02    1.7648844421E+02    1.7153617388E+02    1.6633781184E+02    1.6091729515E+02    1.5529933356E+02    1.4950925497E+02    1.4357284814E+02    1.3751620399E+02    1.3136555642E+02    1.2514712405E+02    1.1888695374E+02    1.1261076729E+02    1.0634381217E+02    1.0011071740E+02    9.3935355638E+01    8.7840712304E+01    8.1848762642E+01    7.5980357566E+01    7.0255118947E+01    6.4691345036E+01    5.9305926538E+01    5.411427 [...]
+    1.2426522008E+02    1.2159168976E+02    1.1871410303E+02    1.1564602680E+02    1.1240181817E+02    1.0899653307E+02    1.0544583108E+02    1.0176587692E+02    9.7973239569E+01    9.4084789604E+01    9.0117595507E+01    8.6088819784E+01    8.2015615570E+01    7.7915024485E+01    7.3803876458E+01    6.9698692243E+01    6.5615589266E+01    6.1570191493E+01    5.7577543888E+01    5.3652032054E+01    4.9807307574E+01    4.6056219508E+01    4.2410752496E+01    3.8881971799E+01    3.547997 [...]
+    6.4640324339E+01    6.3249720322E+01    6.1753187171E+01    6.0157764350E+01    5.8470900426E+01    5.6700405849E+01    5.4854403722E+01    5.2941278901E+01    5.0969625827E+01    4.8948195442E+01    4.6885841596E+01    4.4791467324E+01    4.2673971382E+01    4.0542195416E+01    3.8404872145E+01    3.6270574916E+01    3.4147668983E+01    3.2044264840E+01    2.9968173918E+01    2.7926866955E+01    2.5927435284E+01    2.3976555309E+01    2.2080456363E+01    2.0244892158E+01    1.847511 [...]
+    2.1237397045E+01    2.0780608452E+01    2.0289189481E+01    1.9765438810E+01    1.9211787998E+01    1.8630786198E+01    1.8025084220E+01    1.7397418060E+01    1.6750592015E+01    1.6087461502E+01    1.5410915710E+01    1.4723860208E+01    1.4029199628E+01    1.3329820551E+01    1.2628574711E+01    1.1928262636E+01    1.1231617838E+01    1.0541291655E+01    9.8598388559E+00    9.1897040871E+00    8.5332092664E+00    7.8925419870E+00    7.2697450126E+00    6.6667069210E+00    6.085153 [...]
+    1.0504525181E+00    1.0278934283E+00    1.0036876857E+00    9.7794357293E-01    9.5077536360E-01    9.2230265193E-01    8.9264965522E-01    8.6194449351E-01    8.3031845138E-01    7.9790522653E-01    7.6484017020E-01    7.3125952424E-01    6.9729965985E-01    6.6309632275E-01    6.2878388971E-01    5.9449464112E-01    5.6035805413E-01    5.2650012086E-01    4.9304269580E-01    4.6010287644E-01    4.2779242094E-01    3.9621720616E-01    3.6547672935E-01    3.3566365628E-01    3.068634 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_box_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_box_BA.inp
new file mode 100644
index 0000000..3c65f28
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_box_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_box_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+box                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone6_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone6_BA.ima
new file mode 100644
index 0000000..1941b14
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone6_BA.ima
@@ -0,0 +1,100 @@
+    5.2183250482E+03    5.1360872549E+03    5.0473305053E+03    4.9524143636E+03    4.8517191965E+03    4.7456461581E+03    4.6346127988E+03    4.5190519332E+03    4.3994101537E+03    4.2761423573E+03    4.1497124100E+03    4.0205873297E+03    3.8892386610E+03    3.7561364371E+03    3.6217483870E+03    3.4865368426E+03    3.3509573569E+03    3.2154546946E+03    3.0804624371E+03    2.9463997296E+03    2.8136697549E+03    2.6826572744E+03    2.5537286637E+03    2.4272280312E+03    2.303477 [...]
+    5.2073256292E+03    5.1252414512E+03    5.0366503289E+03    4.9419117389E+03    4.8414048631E+03    4.7355297989E+03    4.6247039649E+03    4.5093598282E+03    4.3899425998E+03    4.2669066636E+03    4.1407138670E+03    4.0118321321E+03    3.8807311242E+03    3.7478798647E+03    3.6137458389E+03    3.4787904532E+03    3.3434678017E+03    3.2082225818E+03    3.0734875013E+03    2.9396804898E+03    2.8072040317E+03    2.6764430278E+03    2.5477621286E+03    2.4215050442E+03    2.297993 [...]
+    5.1744511469E+03    5.0928257635E+03    5.0047304631E+03    4.9105217676E+03    4.8105782714E+03    4.7052969273E+03    4.5950931541E+03    4.4803968579E+03    4.3616503110E+03    4.2393066578E+03    4.1138246581E+03    3.9856695275E+03    3.8553088194E+03    3.7232090321E+03    3.5898344518E+03    3.4556443626E+03    3.3210906180E+03    3.1866152152E+03    3.0526484233E+03    2.9196061746E+03    2.7878886081E+03    2.6578782661E+03    2.5299382898E+03    2.4044103137E+03    2.281614 [...]
+    5.1200724488E+03    5.0392071596E+03    4.9519334109E+03    4.8586031294E+03    4.7595915237E+03    4.6552930323E+03    4.5461196464E+03    4.4324961706E+03    4.3148609920E+03    4.1936633889E+03    4.0693590130E+03    3.9424076318E+03    3.8132726866E+03    3.6824166532E+03    3.5502999043E+03    3.4173772529E+03    3.2840967812E+03    3.1508959942E+03    3.0182014815E+03    2.8864253828E+03    2.7559644112E+03    2.6271975800E+03    2.5004841517E+03    2.3761630396E+03    2.254551 [...]
+    5.0448004456E+03    4.9649896493E+03    4.8788545810E+03    4.7867428804E+03    4.6890244081E+03    4.5860891723E+03    4.4783439049E+03    4.3662080505E+03    4.2501144927E+03    4.1305070912E+03    4.0078348712E+03    3.8825526374E+03    3.7551175753E+03    3.6259866425E+03    3.4956137094E+03    3.3644486806E+03    3.2329330681E+03    3.1014997875E+03    2.9705692698E+03    2.8405486542E+03    2.7118294183E+03    2.5847858239E+03    2.4597727415E+03    2.3371246095E+03    2.217154 [...]
+    4.9494768164E+03    4.8710051570E+03    4.7863147028E+03    4.6957500141E+03    4.5996738870E+03    4.4984698586E+03    4.3925376157E+03    4.2822899413E+03    4.1681539236E+03    4.0505646844E+03    3.9299648242E+03    3.8068016449E+03    3.6815244474E+03    3.5545827854E+03    3.4264238377E+03    3.2974893932E+03    3.1682141166E+03    3.0390236713E+03    2.9103317080E+03    2.7825387401E+03    2.6560297572E+03    2.5311729849E+03    2.4083171287E+03    2.2877913822E+03    2.169903 [...]
+    4.8351583193E+03    4.7582973431E+03    4.6753467422E+03    4.5866421979E+03    4.4925422357E+03    4.3934209540E+03    4.2896693688E+03    4.1816943665E+03    4.0699128322E+03    3.9547515756E+03    3.8366443525E+03    3.7160298867E+03    3.5933483949E+03    3.4690403757E+03    3.3435435803E+03    3.2172918981E+03    3.0907109242E+03    2.9642172468E+03    2.8382172258E+03    2.7131024401E+03    2.5892510267E+03    2.4670226829E+03    2.3467601441E+03    2.2287854185E+03    2.113399 [...]
+    4.7030994798E+03    4.6281067052E+03    4.5471732789E+03    4.4606277914E+03    4.3688185416E+03    4.2721122194E+03    4.1708904023E+03    4.0655505349E+03    3.9564986472E+03    3.8441528497E+03    3.7289356337E+03    3.6112758395E+03    3.4916032393E+03    3.3703479976E+03    3.2479376732E+03    3.1247953146E+03    3.0013367670E+03    2.8779691884E+03    2.7550883719E+03    2.6330772977E+03    2.5123044600E+03    2.3931219099E+03    2.2758634397E+03    2.1608435850E+03    2.048356 [...]
+    4.5547353793E+03    4.4818512782E+03    4.4031946139E+03    4.3190851223E+03    4.2298616555E+03    4.1358800181E+03    4.0375135556E+03    3.9351464094E+03    3.8291756233E+03    3.7200058945E+03    3.6080500373E+03    3.4937235385E+03    3.3774456989E+03    3.2596344299E+03    3.1407056421E+03    3.0210703382E+03    2.9011335371E+03    2.7812908874E+03    2.6619274437E+03    2.5434159601E+03    2.4261143922E+03    2.3103651887E+03    2.1964927519E+03    2.0848030132E+03    1.975582 [...]
+    4.3916535721E+03    4.3210992145E+03    4.2449580803E+03    4.1635406223E+03    4.0771739611E+03    3.9862039708E+03    3.8909913712E+03    3.7919088575E+03    3.6893412369E+03    3.5836805485E+03    3.4753268621E+03    3.3646826450E+03    3.2521541219E+03    3.1381460652E+03    3.0230617085E+03    2.9072993785E+03    2.7912510102E+03    2.6753001342E+03    2.5598197811E+03    2.4451706844E+03    2.3317000105E+03    2.2197393978E+03    2.1096027919E+03    2.0015871135E+03    1.895968 [...]
+    4.2155701670E+03    4.1475469325E+03    4.0741389819E+03    3.9956440745E+03    3.9123809145E+03    3.8246812705E+03    3.7328934357E+03    3.6373784693E+03    3.5385063016E+03    3.4366557727E+03    3.3322129111E+03    3.2255665295E+03    3.1171079736E+03    3.0072285361E+03    2.8963166579E+03    2.7847572903E+03    2.6729283955E+03    2.5612001678E+03    2.4499325866E+03    2.3394737718E+03    2.2301583570E+03    2.1223061256E+03    2.0162208498E+03    1.9121880353E+03    1.810474 [...]
+    4.0283050433E+03    3.9629914560E+03    3.8925092066E+03    3.8171439918E+03    3.7372023210E+03    3.6530037093E+03    3.5648822692E+03    3.4731850805E+03    3.3782676370E+03    3.2804951085E+03    3.1802372415E+03    3.0778682194E+03    2.9737644568E+03    2.8683017172E+03    2.7618536655E+03    2.6547898712E+03    2.5474738707E+03    2.4402612338E+03    2.3334979406E+03    2.2275185171E+03    2.1226446543E+03    2.0191838553E+03    1.9174273901E+03    1.8176498816E+03    1.720107 [...]
+    3.8317497918E+03    3.7693011819E+03    3.7019118087E+03    3.6298565875E+03    3.5534263897E+03    3.4729288381E+03    3.3886831495E+03    3.3010216890E+03    3.2102849645E+03    3.1168218223E+03    3.0209869705E+03    2.9231382651E+03    2.8236357218E+03    2.7228394143E+03    2.6211065787E+03    2.5187914305E+03    2.4162415736E+03    2.3137973243E+03    2.2117901175E+03    2.1105396103E+03    2.0103540025E+03    1.9115272186E+03    1.8143383791E+03    1.7190500503E+03    1.625907 [...]
+    3.6278407122E+03    3.5683889069E+03    3.5042345444E+03    3.4356393424E+03    3.3628821495E+03    3.2862539677E+03    3.2060608627E+03    3.1226187184E+03    3.0362521629E+03    2.9472938969E+03    2.8560819766E+03    2.7629572678E+03    2.6682632598E+03    2.5723427934E+03    2.4755366514E+03    2.3781819913E+03    2.2806104914E+03    2.1831463186E+03    2.0861049407E+03    1.9897918033E+03    1.8944997725E+03    1.8005094108E+03    1.7080861933E+03    1.6174807084E+03    1.528926 [...]
+    3.4185293963E+03    3.3621809594E+03    3.3013764470E+03    3.2363648552E+03    3.1674095789E+03    3.0947886237E+03    3.0187904476E+03    2.9397161809E+03    2.8578733552E+03    2.7735776150E+03    2.6871500601E+03    2.5989141453E+03    2.5091953578E+03    2.4183193691E+03    2.3266093564E+03    2.2343855597E+03    2.1419621124E+03    2.0496471808E+03    1.9577398085E+03    1.8665296674E+03    1.7762947053E+03    1.6873011240E+03    1.5998008609E+03    1.5140312950E+03    1.430214 [...]
+    3.2057545383E+03    3.1525909145E+03    3.0952249473E+03    3.0338901356E+03    2.9688365982E+03    2.9003264267E+03    2.8286328593E+03    2.7540391592E+03    2.6768370623E+03    2.5973238441E+03    2.5158027417E+03    2.4325798531E+03    2.3479628189E+03    2.2622582812E+03    2.1757723865E+03    2.0888070050E+03    2.0016593061E+03    1.9146199554E+03    1.8279718058E+03    1.7419880192E+03    1.6569316675E+03    1.5730534492E+03    1.4905915557E+03    1.4097703497E+03    1.330798 [...]
+    2.9914141711E+03    2.9414918538E+03    2.8876245214E+03    2.8300321360E+03    2.7689489942E+03    2.7046217886E+03    2.6373077361E+03    2.5672728114E+03    2.4947907180E+03    2.4201422304E+03    2.3436114340E+03    2.2654864324E+03    2.1860561040E+03    2.1056092383E+03    2.0244331968E+03    1.9428123329E+03    1.8610254451E+03    1.7793458546E+03    1.6980396174E+03    1.6173635947E+03    1.5375645805E+03    1.4588789150E+03    1.3815300712E+03    1.3057288362E+03    1.231671 [...]
+    2.7773387487E+03    2.7306905264E+03    2.6803562162E+03    2.6265423112E+03    2.5694681553E+03    2.5093642331E+03    2.4464707429E+03    2.3810370725E+03    2.3133195839E+03    2.2435801012E+03    2.1720847323E+03    2.0991029212E+03    2.0249052361E+03    1.9497613855E+03    1.8739405302E+03    1.7977079438E+03    1.7213253764E+03    1.6450482234E+03    1.5691249026E+03    1.4937960075E+03    1.4192925849E+03    1.3458354260E+03    1.2736336939E+03    1.2028844141E+03    1.133771 [...]
+    2.5652704866E+03    2.5219037223E+03    2.4751108075E+03    2.4250839117E+03    2.3720272467E+03    2.3161553648E+03    2.2576916466E+03    2.1968684205E+03    2.1339236347E+03    2.0691013487E+03    2.0026496185E+03    1.9348183382E+03    1.8658596969E+03    1.7960247126E+03    1.7255638481E+03    1.6547241015E+03    1.5837488161E+03    1.5128754935E+03    1.4423361077E+03    1.3723536715E+03    1.3031437475E+03    1.2349113713E+03    1.1678518096E+03    1.1021479442E+03    1.037971 [...]
+    2.3568379545E+03    2.3167371395E+03    2.2734687623E+03    2.2272109521E+03    2.1781522372E+03    2.1264911172E+03    2.0724346003E+03    2.0161975725E+03    1.9580002049E+03    1.8980686746E+03    1.8366320041E+03    1.7739218200E+03    1.7101715075E+03    1.6456134905E+03    1.5804792094E+03    1.5149975464E+03    1.4493935658E+03    1.3838875274E+03    1.3186932941E+03    1.2540184048E+03    1.1900614309E+03    1.1270128272E+03    1.0650526299E+03    1.0043510718E+03    9.450662 [...]
+    2.1535398909E+03    2.1166677556E+03    2.0768833346E+03    2.0343505225E+03    1.9892428278E+03    1.9417429246E+03    1.8920411133E+03    1.8403351693E+03    1.7868278265E+03    1.7317265013E+03    1.6752428325E+03    1.6175895702E+03    1.5589810840E+03    1.4996317579E+03    1.4397542625E+03    1.3795594377E+03    1.3192542405E+03    1.2590413590E+03    1.1991176508E+03    1.1396740412E+03    1.0808936033E+03    1.0229513678E+03    9.6601324399E+02    9.1023578169E+02    8.557646 [...]
+    1.9567289055E+03    1.9230270523E+03    1.8866635261E+03    1.8477878005E+03    1.8065589407E+03    1.7631436152E+03    1.7177160882E+03    1.6704566003E+03    1.6215510921E+03    1.5711893611E+03    1.5195639741E+03    1.4668702903E+03    1.4133042811E+03    1.3590617379E+03    1.3043372024E+03    1.2493235532E+03    1.1942099486E+03    1.1391818857E+03    1.0844197089E+03    1.0300976265E+03    9.7638335079E+02    9.2343695169E+02    8.7141051428E+02    8.2044668667E+02    7.706796 [...]
+    1.7675991067E+03    1.7369900155E+03    1.7039633422E+03    1.6686547939E+03    1.6312086927E+03    1.5917763668E+03    1.5505162064E+03    1.5075921540E+03    1.4631725135E+03    1.4174295740E+03    1.3705391240E+03    1.3226777457E+03    1.2740235579E+03    1.2247547464E+03    1.1750478033E+03    1.1250781638E+03    1.0750174346E+03    1.0250345130E+03    9.7529282804E+02    9.2595128190E+02    8.7716185459E+02    8.2907035509E+02    7.8181488101E+02    7.3552560712E+02    6.903238 [...]
+    1.5871768560E+03    1.5595651978E+03    1.5297723764E+03    1.4979204340E+03    1.4641395283E+03    1.4285663214E+03    1.3913433433E+03    1.3526180971E+03    1.3125426880E+03    1.2712726908E+03    1.2289658232E+03    1.1857819626E+03    1.1418815573E+03    1.0974250191E+03    1.0525720309E+03    1.0074804461E+03    9.6230539105E+02    9.1719892468E+02    8.7230874492E+02    8.2777830406E+02    7.8374470484E+02    7.4033958336E+02    6.9768787322E+02    6.5590678093E+02    6.151063 [...]
+    1.4163151163E+03    1.3915898627E+03    1.3649105573E+03    1.3363866862E+03    1.3061343209E+03    1.2742755368E+03    1.2409380692E+03    1.2062534852E+03    1.1703581012E+03    1.1333908889E+03    1.0954927807E+03    1.0568071944E+03    1.0174773143E+03    9.7764674577E+02    9.3745857279E+02    8.9705365390E+02    8.5657133067E+02    8.1614746941E+02    7.7591467264E+02    7.3600084230E+02    6.9652947332E+02    6.5761822319E+02    6.1937890543E+02    5.8191701602E+02    5.453311 [...]
+    1.2556907228E+03    1.2337268773E+03    1.2100264195E+03    1.1846857489E+03    1.1578082570E+03    1.1295015762E+03    1.0998791397E+03    1.0690578902E+03    1.0371581037E+03    1.0043031175E+03    9.7061812847E+02    9.3622983434E+02    9.0126568777E+02    8.6585282970E+02    8.3011811632E+02    7.9418679701E+02    7.5818229684E+02    7.2222534446E+02    6.8643359314E+02    6.5092093876E+02    6.1579677084E+02    5.8116581216E+02    5.4712765445E+02    5.1377600234E+02    4.811986 [...]
+    1.1058056279E+03    1.0864664711E+03    1.0655967795E+03    1.0432811601E+03    1.0196100564E+03    9.9467825757E+02    9.6858488326E+02    9.4143265011E+02    9.1332713402E+02    8.8437652842E+02    8.5469085803E+02    8.2438125212E+02    7.9355942406E+02    7.6233736287E+02    7.3082650393E+02    6.9913659792E+02    6.6737660416E+02    6.3565226658E+02    6.0406738507E+02    5.7272195899E+02    5.4171251756E+02    5.1113125699E+02    4.8106597544E+02    4.5159935152E+02    4.228087 [...]
+    9.6699057505E+02    9.5012949982E+02    9.3193201771E+02    9.1247179060E+02    8.9182687098E+02    8.7007975740E+02    8.4731630539E+02    8.2362546864E+02    7.9909898246E+02    7.7383065725E+02    7.4791582358E+02    7.2145111587E+02    6.9453359098E+02    6.6726041540E+02    6.3972832102E+02    6.1203293864E+02    5.8426878513E+02    5.5652812715E+02    5.2890105309E+02    5.0147480932E+02    4.7433348288E+02    4.4755750755E+02    4.2122350783E+02    3.9540367796E+02    3.701657 [...]
+    8.3941182777E+02    8.2487409016E+02    8.0918208323E+02    7.9239855230E+02    7.7459043312E+02    7.5582807327E+02    7.3618499935E+02    7.1573732679E+02    6.9456354253E+02    6.7274398345E+02    6.5036036783E+02    6.2749534061E+02    6.0423223434E+02    5.8065425996E+02    5.5684441700E+02    5.3288487821E+02    5.0885667317E+02    4.8483918018E+02    4.6090990404E+02    4.3714389685E+02    4.1361349887E+02    3.9038824771E+02    3.6753408266E+02    3.4511345374E+02    3.231850 [...]
+    7.2308026043E+02    7.1070580223E+02    6.9734615688E+02    6.8305422195E+02    6.6788628737E+02    6.5190150992E+02    6.3516172561E+02    6.1773120860E+02    5.9967593523E+02    5.8106366316E+02    5.6196324145E+02    5.4244439968E+02    5.2257750466E+02    5.0243276617E+02    4.8208039765E+02    4.6158987994E+02    4.4102972811E+02    4.2046722368E+02    3.9996802945E+02    3.7959587853E+02    3.5941228573E+02    3.3947625329E+02    3.1984406973E+02    3.0056907202E+02    2.817013 [...]
+    6.1786323222E+02    6.0748797510E+02    5.9628361229E+02    5.8429381942E+02    5.7156499548E+02    5.5814595141E+02    5.4408771744E+02    5.2944333124E+02    5.1426736898E+02    4.9861571842E+02    4.8254547408E+02    4.6611425083E+02    4.4938032397E+02    4.3240196060E+02    4.1523736582E+02    3.9794424235E+02    3.8057958625E+02    3.6319940651E+02    3.4585843995E+02    3.2860978316E+02    3.1150499189E+02    2.9459334061E+02    2.7792219744E+02    2.6153629750E+02    2.454778 [...]
+    5.2349763786E+02    5.1495562927E+02    5.0572754231E+02    4.9584839775E+02    4.8535555314E+02    4.7428824092E+02    4.6268752708E+02    4.5059612168E+02    4.3805798316E+02    4.2511820306E+02    4.1182289619E+02    3.9821863514E+02    3.8435250197E+02    3.7027173076E+02    3.5602346230E+02    3.4165464108E+02    3.2721153169E+02    3.1273982554E+02    2.9828412020E+02    2.8388789240E+02    2.6959330499E+02    2.5544095516E+02    2.4146974555E+02    2.2771663786E+02    2.142167 [...]
+    4.3960474808E+02    4.3273010680E+02    4.2529927653E+02    4.1733942915E+02    4.0887947476E+02    3.9995009160E+02    3.9058308271E+02    3.8081184917E+02    3.7067055404E+02    3.6019446407E+02    3.4941960276E+02    3.3838241381E+02    3.2711984779E+02    3.1566897150E+02    3.0406694154E+02    2.9235070041E+02    2.8055687536E+02    2.6872159154E+02    2.5688025325E+02    2.4506756892E+02    2.3331719304E+02    2.2166159794E+02    2.1013212879E+02    1.9875867708E+02    1.875696 [...]
+    3.6570625288E+02    3.6033477094E+02    3.5452400139E+02    3.4829407974E+02    3.4166633867E+02    3.3466338489E+02    3.2730899994E+02    3.1962778214E+02    3.1164530958E+02    3.0338784214E+02    2.9488222593E+02    2.8615581267E+02    2.7723626591E+02    2.6815159113E+02    2.5892969310E+02    2.4959865976E+02    2.4018620933E+02    2.3071995461E+02    2.2122698743E+02    2.1173391859E+02    2.0226676882E+02    1.9285080427E+02    1.8351038768E+02    1.7426907200E+02    1.651493 [...]
+    3.0124089004E+02    2.9721162725E+02    2.9284740426E+02    2.8816185584E+02    2.8316960249E+02    2.7788620216E+02    2.7232789845E+02    2.6651166477E+02    2.6045525497E+02    2.5417673670E+02    2.4769496325E+02    2.4102895688E+02    2.3419814986E+02    2.2722223093E+02    2.2012112091E+02    2.1291465765E+02    2.0562275293E+02    1.9826530851E+02    1.9086197423E+02    1.8343215688E+02    1.7599504477E+02    1.6856930004E+02    1.6117320832E+02    1.5382452453E+02    1.465404 [...]
+    2.4558117715E+02    2.4273798423E+02    2.3965180349E+02    2.3633067665E+02    2.3278322164E+02    2.2901859821E+02    2.2504656712E+02    2.2087724111E+02    2.1652131269E+02    2.1198986511E+02    2.0729434732E+02    2.0244654404E+02    1.9745856457E+02    1.9234283728E+02    1.8711187965E+02    1.8177849764E+02    1.7635563684E+02    1.7085625000E+02    1.6529343302E+02    1.5968024988E+02    1.5402970636E+02    1.4835477863E+02    1.4266824750E+02    1.3698278238E+02    1.313108 [...]
+    1.9805053610E+02    1.9624314886E+02    1.9427307556E+02    1.9214337900E+02    1.8985740320E+02    1.8741879233E+02    1.8483147629E+02    1.8209969482E+02    1.7922791758E+02    1.7622098863E+02    1.7308400592E+02    1.6982238785E+02    1.6644175571E+02    1.6294813728E+02    1.5934771038E+02    1.5564704475E+02    1.5185291226E+02    1.4797227190E+02    1.4401244466E+02    1.3998088261E+02    1.3588528307E+02    1.3173350094E+02    1.2753360234E+02    1.2329376231E+02    1.190222 [...]
+    1.5793940216E+02    1.5702468933E+02    1.5601646586E+02    1.5491345482E+02    1.5371448236E+02    1.5241838476E+02    1.5102411997E+02    1.4953071986E+02    1.4793740605E+02    1.4624359391E+02    1.4444887280E+02    1.4255312514E+02    1.4055643226E+02    1.3845927463E+02    1.3626235254E+02    1.3396678079E+02    1.3157403228E+02    1.2908593584E+02    1.2650472497E+02    1.2383307510E+02    1.2107403444E+02    1.1823109863E+02    1.1530818133E+02    1.1230959703E+02    1.092400 [...]
+    1.2452101564E+02    1.2436389227E+02    1.2417190830E+02    1.2394018540E+02    1.2366364286E+02    1.2333705543E+02    1.2295514531E+02    1.2251254789E+02    1.2200401070E+02    1.2142431208E+02    1.2076838625E+02    1.2003139510E+02    1.1920873076E+02    1.1829609629E+02    1.1728960107E+02    1.1618569097E+02    1.1498134742E+02    1.1367398372E+02    1.1226157435E+02    1.1074266395E+02    1.0911640234E+02    1.0738251893E+02    1.0554140948E+02    1.0359411430E+02    1.015423 [...]
+    9.7066000939E+01    9.7540134882E+01    9.8028336170E+01    9.8522650926E+01    9.9014795133E+01    9.9496171775E+01    9.9957938085E+01    1.0039113672E+02    1.0078670456E+02    1.0113560156E+02    1.0142890575E+02    1.0165780717E+02    1.0181379391E+02    1.0188863398E+02    1.0187452549E+02    1.0176411179E+02    1.0155054809E+02    1.0122761142E+02    1.0078969400E+02    1.0023192597E+02    9.9550133584E+01    9.8740953790E+01    9.7801828131E+01    9.6731046281E+01    9.552772 [...]
+    7.4855660203E+01    7.5844102888E+01    7.6886511541E+01    7.7972482846E+01    7.9091106567E+01    8.0231056296E+01    8.1380613112E+01    8.2527865140E+01    8.3660704830E+01    8.4766998993E+01    8.5834621911E+01    8.6851634572E+01    8.7806279262E+01    8.8687169819E+01    8.9483299804E+01    9.0184198872E+01    9.0779950290E+01    9.1261338047E+01    9.1619861379E+01    9.1847812406E+01    9.1938368704E+01    9.1885585714E+01    9.1684510246E+01    9.1331154749E+01    9.082255 [...]
+    5.7193847790E+01    5.8589417164E+01    6.0070624449E+01    6.1625163806E+01    6.3240073878E+01    6.4901858461E+01    6.6596603049E+01    6.8310035752E+01    7.0027681909E+01    7.1734953933E+01    7.3417276664E+01    7.5060179421E+01    7.6649404485E+01    7.8171044247E+01    7.9611621364E+01    8.0958162807E+01    8.2198377766E+01    8.3320654239E+01    8.4314177402E+01    8.5169046688E+01    8.5876300908E+01    8.6427971923E+01    8.6817162517E+01    8.7038105023E+01    8.708617 [...]
+    4.3417180356E+01    4.5122706612E+01    4.6938129139E+01    4.8849714721E+01    5.0842992335E+01    5.2902868623E+01    5.5013737651E+01    5.7159613658E+01    5.9324245092E+01    6.1491218136E+01    6.3644103695E+01    6.5766560719E+01    6.7842443879E+01    6.9855957255E+01    7.1791744884E+01    7.3635007185E+01    7.5371578520E+01    7.6988082333E+01    7.8471982393E+01    7.9811664582E+01    8.0996530244E+01    8.2017094642E+01    8.2864970067E+01    8.3532995717E+01    8.401524 [...]
+    3.2903533906E+01    3.4831947415E+01    3.6887915083E+01    3.9056711139E+01    4.1322813466E+01    4.3670041515E+01    4.6081652589E+01    4.8540444702E+01    5.1028958997E+01    5.3529506503E+01    5.6024381743E+01    5.8495931066E+01    6.0926723667E+01    6.3299616841E+01    6.5597959417E+01    6.7805636777E+01    6.9907201167E+01    7.1888005098E+01    7.3734271699E+01    7.5433183072E+01    7.6972982416E+01    7.8343052194E+01    7.9533949500E+01    8.0537479632E+01    8.134677 [...]
+    2.5078801315E+01    2.7153093115E+01    2.9366757848E+01    3.1704501996E+01    3.4150192254E+01    3.6686988110E+01    3.9297465394E+01    4.1963744472E+01    4.4667598987E+01    4.7390599165E+01    5.0114263129E+01    5.2820161564E+01    5.5490034478E+01    5.8105973254E+01    6.0650486456E+01    6.3106657858E+01    6.5458231689E+01    6.7689768465E+01    6.9786695777E+01    7.1735416124E+01    7.3523432143E+01    7.5139373230E+01    7.6573085062E+01    7.7815697051E+01    7.885966 [...]
+    1.9421870019E+01    2.1574880499E+01    2.3874039015E+01    2.6303824982E+01    2.8847883280E+01    3.1489128261E+01    3.4209867747E+01    3.6991938352E+01    3.9816824279E+01    4.2665799616E+01    4.5520048397E+01    4.8360806959E+01    5.1169486740E+01    5.3927803043E+01    5.6617915669E+01    5.9222529416E+01    6.1725015337E+01    6.4109536872E+01    6.6361121328E+01    6.8465806602E+01    7.0410661151E+01    7.2183929505E+01    7.3775073124E+01    7.5174803738E+01    7.637519 [...]
+    1.5467865312E+01    1.7641990277E+01    1.9964717600E+01    2.2420638960E+01    2.4993493603E+01    2.7666301032E+01    3.0421470739E+01    3.3240936299E+01    3.6106272086E+01    3.8998836074E+01    4.1899888716E+01    4.4790728934E+01    4.7652817420E+01    5.0467919910E+01    5.3218203218E+01    5.5886391055E+01    5.8455851577E+01    6.0910701370E+01    6.3235925783E+01    6.5417502495E+01    6.7442405137E+01    6.9298777974E+01    7.0975929978E+01    7.2464444889E+01    7.375621 [...]
+    1.2809779634E+01    1.4956537850E+01    1.7250755572E+01    1.9677396895E+01    2.2220591897E+01    2.4863761901E+01    2.7589729626E+01    3.0380852183E+01    3.3219114839E+01    3.6086308463E+01    3.8964095598E+01    4.1834183199E+01    4.4678432621E+01    4.7478978135E+01    5.0218350086E+01    5.2879581813E+01    5.5446370431E+01    5.7903093324E+01    6.0235014987E+01    6.2428277856E+01    6.4470069474E+01    6.6348645118E+01    6.8053421629E+01    6.9575050226E+01    7.090543 [...]
+    1.1098552676E+01    1.3178096096E+01    1.5401015751E+01    1.7752877184E+01    2.0218441783E+01    2.2781786418E+01    2.5426412312E+01    2.8135358530E+01    3.0891322317E+01    3.3676778211E+01    3.6474107594E+01    3.9265697372E+01    4.2034086474E+01    4.4762058901E+01    4.7432790148E+01    5.0029925251E+01    5.2537710520E+01    5.4941080582E+01    5.7225754694E+01    5.9378352020E+01    6.1386447272E+01    6.3238623958E+01    6.4924607722E+01    6.6435266496E+01    6.776267 [...]
+    1.0041794031E+01    1.2022326658E+01    1.4139828613E+01    1.6380648436E+01    1.8730382444E+01    2.1173964299E+01    2.3695790018E+01    2.6279809304E+01    2.8909644142E+01    3.1568706190E+01    3.4240296435E+01    3.6907737322E+01    3.9554469532E+01    4.2164176293E+01    4.4720878773E+01    4.7209061169E+01    4.9613734147E+01    5.1920597419E+01    5.4116048865E+01    5.6187331249E+01    5.8122586137E+01    5.9910925685E+01    6.1542504732E+01    6.3008559677E+01    6.430147 [...]
+    9.4013020562E+00    1.1258449240E+01    1.3244390593E+01    1.5346410784E+01    1.7551089497E+01    1.9844391608E+01    2.2211772810E+01    2.4638265405E+01    2.7108599152E+01    2.9607296617E+01    3.2118781170E+01    3.4627473552E+01    3.7117908650E+01    3.9574844627E+01    4.1983335592E+01    4.4328856033E+01    4.6597390512E+01    4.8775522046E+01    5.0850495253E+01    5.2810338307E+01    5.4643902539E+01    5.6340928274E+01    5.7892131985E+01    5.9289217487E+01    6.052495 [...]
+    8.9895535957E+00    1.0705684603E+01    1.2541174145E+01    1.4484354477E+01    1.6522907866E+01    1.8643950696E+01    2.0834122166E+01    2.3079677460E+01    2.5366585731E+01    2.7680615257E+01    3.0007441475E+01    3.2332728838E+01    3.4642251823E+01    3.6921955086E+01    3.9158073316E+01    4.1337218550E+01    4.3446433899E+01    4.5473340499E+01    4.7406131195E+01    4.9233723660E+01    5.0945776190E+01    5.2532757507E+01    5.3986036113E+01    5.5297855882E+01    5.646145 [...]
+    8.6653878724E+00    1.0228913250E+01    1.1901550798E+01    1.3672757708E+01    1.5531399354E+01    1.7465825497E+01    1.9463954035E+01    2.1513351051E+01    2.3601309678E+01    2.5714952810E+01    2.7841291953E+01    2.9967340744E+01    3.2080186706E+01    3.4167078902E+01    3.6215515548E+01    3.8213307196E+01    4.0148697193E+01    4.2010365290E+01    4.3787575258E+01    4.5470196775E+01    4.7048751844E+01    4.8514517481E+01    4.9859538033E+01    5.1076694290E+01    5.215971 [...]
+    8.3290651893E+00    9.7337276016E+00    1.1236834388E+01    1.2829012149E+01    1.4500361122E+01    1.6240517172E+01    1.8038726759E+01    1.9883917601E+01    2.1764776129E+01    2.3669808996E+01    2.5587447980E+01    2.7506094121E+01    2.9414213873E+01    3.1300408003E+01    3.3153487211E+01    3.4962541190E+01    3.6717010001E+01    3.8406747667E+01    4.0022073914E+01    4.1553869817E+01    4.2993588606E+01    4.4333320022E+01    4.5565845054E+01    4.6684665023E+01    4.768404 [...]
+    7.9169144750E+00    9.1610724305E+00    1.0492922806E+01    1.1904278736E+01    1.3386491701E+01    1.4930504042E+01    1.6526911935E+01    1.8166027301E+01    1.9837942551E+01    2.1532592187E+01    2.3239826422E+01    2.4949460701E+01    2.6651366156E+01    2.8335519996E+01    2.9992058391E+01    3.1611360893E+01    3.3184104900E+01    3.4701305939E+01    3.6154388074E+01    3.7535241559E+01    3.8836249308E+01    4.0050344630E+01    4.1171051546E+01    4.2192509809E+01    4.310951 [...]
+    7.3957580820E+00    8.4816892653E+00    9.6447515151E+00    1.0877941964E+01    1.2173853960E+01    1.3524732556E+01    1.4922512756E+01    1.6358884859E+01    1.7825335581E+01    1.9313214509E+01    2.0813784104E+01    2.2318276665E+01    2.3817945854E+01    2.5304128654E+01    2.6768296883E+01    2.8202105227E+01    2.9597444921E+01    3.0946497635E+01    3.2241779507E+01    3.3476178564E+01    3.4643000321E+01    3.5736014981E+01    3.6749472938E+01    3.7678144808E+01    3.851735 [...]
+    6.7572912043E+00    7.6905157020E+00    8.6907309524E+00    9.7520883037E+00    1.0868397946E+01    1.2033165847E+01    1.3239644717E+01    1.4480857170E+01    1.5749662726E+01    1.7038787452E+01    1.8340869845E+01    1.9648517066E+01    2.0954337430E+01    2.2250994558E+01    2.3531252084E+01    2.4788004755E+01    2.6014342331E+01    2.7203567973E+01    2.8349249946E+01    2.9445258537E+01    3.0485794314E+01    3.1465427270E+01    3.2379114641E+01    3.3222241623E+01    3.399063 [...]
+    6.0125953941E+00    6.8012333852E+00    7.6473197258E+00    8.5461147456E+00    9.4925917633E+00    1.0481476227E+01    1.1507270820E+01    1.2564289550E+01    1.3646699227E+01    1.4748541389E+01    1.5863787050E+01    1.6986350045E+01    1.8110137251E+01    1.9229087454E+01    2.0337190084E+01    2.1428538451E+01    2.2497353236E+01    2.3538011981E+01    2.4545099006E+01    2.5513409501E+01    2.6437993515E+01    2.7314182602E+01    2.8137612978E+01    2.8904240377E+01    2.961036 [...]
+    5.1869109387E+00    5.8410806034E+00    6.5438886008E+00    7.2916376102E+00    8.0804046453E+00    8.9060604003E+00    9.7642918209E+00    1.0650629143E+01    1.1560471170E+01    1.2489107349E+01    1.3431749460E+01    1.4383551789E+01    1.5339649081E+01    1.6295165707E+01    1.7245262265E+01    1.8185143759E+01    1.9110099818E+01    2.0015525743E+01    2.0896935963E+01    2.1750003454E+01    2.2570580957E+01    2.3354704229E+01    2.4098630142E+01    2.4798857049E+01    2.545212 [...]
+    4.3148099354E+00    4.8460741171E+00    5.4179865463E+00    6.0278215768E+00    6.6726791559E+00    7.3494943867E+00    8.0550547350E+00    8.7860171396E+00    9.5389274800E+00    1.0310227618E+01    1.1096285982E+01    1.1893406248E+01    1.2697852474E+01    1.3505860786E+01    1.4313659644E+01    1.5117496317E+01    1.5913643376E+01    1.6698423798E+01    1.7468227037E+01    1.8219533468E+01    1.8948916148E+01    1.9653067989E+01    2.0328818364E+01    2.0973145203E+01    2.158318 [...]
+    3.4358557178E+00    3.8567174989E+00    4.3111129980E+00    4.7972060882E+00    5.3130286297E+00    5.8564899722E+00    6.4253839754E+00    7.0173978319E+00    7.6301197144E+00    8.2610489978E+00    8.9076076260E+00    9.5671459654E+00    1.0236958850E+01    1.0914291428E+01    1.1596350462E+01    1.2280325902E+01    1.2963384863E+01    1.3642694947E+01    1.4315441608E+01    1.4978818720E+01    1.5630068907E+01    1.6266468566E+01    1.6885360582E+01    1.7484153391E+01    1.806033 [...]
+    2.5908314442E+00    2.9142867298E+00    3.2650586905E+00    3.6421086408E+00    4.0443090515E+00    4.4704441913E+00    4.9192098899E+00    5.3892184500E+00    5.8789958025E+00    6.3869889502E+00    6.9115633383E+00    7.4510094799E+00    8.0035460031E+00    8.5673205773E+00    9.1404191018E+00    9.7208651284E+00    1.0306632248E+01    1.0895642211E+01    1.1485776750E+01    1.2074883438E+01    1.2660781728E+01    1.3241275191E+01    1.3814151253E+01    1.4377201104E+01    1.492821 [...]
+    1.8185792486E+00    2.0577256656E+00    2.3188625178E+00    2.6016551855E+00    2.9057170177E+00    3.2306037819E+00    3.5758085395E+00    3.9407581243E+00    4.3248053317E+00    4.7272309568E+00    5.1472327782E+00    5.5839277801E+00    6.0363468277E+00    6.5034324600E+00    6.9840369340E+00    7.4769257942E+00    7.9807686422E+00    8.4941507942E+00    9.0155682782E+00    9.5434291481E+00    1.0076064355E+01    1.0611724591E+01    1.1148590038E+01    1.1684772458E+01    1.221833 [...]
+    1.1534789082E+00    1.3211817441E+00    1.5064096171E+00    1.7094377248E+00    1.9305197633E+00    2.1698781045E+00    2.4276940525E+00    2.7040977067E+00    2.9991582348E+00    3.3128722798E+00    3.6451586640E+00    3.9958455666E+00    4.3646631430E+00    4.7512379339E+00    5.1550849829E+00    5.5756009102E+00    6.0120609388E+00    6.4636133993E+00    6.9292793533E+00    7.4079501819E+00    7.8983874902E+00    8.3992252285E+00    8.9089713350E+00    9.4260144775E+00    9.948625 [...]
+    6.2356740368E-01    7.3218085357E-01    8.5466832190E-01    9.9181918340E-01    1.1444276626E+00    1.3132791983E+00    1.4991351720E+00    1.7027193758E+00    1.9247023499E+00    2.1656879175E+00    2.4261985402E+00    2.7066619704E+00    3.0073983916E+00    3.3286085409E+00    3.6703616696E+00    4.0325872381E+00    4.4150643091E+00    4.8174157150E+00    5.2391000846E+00    5.6794099687E+00    6.1374675514E+00    6.6122230075E+00    7.1024554452E+00    7.6067754526E+00    8.123631 [...]
+    2.4927500360E-01    3.1042033014E-01    3.8254054135E-01    4.6684660672E-01    5.6457598971E-01    6.7697526870E-01    8.0528144188E-01    9.5070410198E-01    1.1144071495E+00    1.2974898948E+00    1.5009698001E+00    1.7257647172E+00    1.9726757935E+00    2.2423730232E+00    2.5353784575E+00    2.8520548604E+00    3.1925923614E+00    3.5569980401E+00    3.9450872202E+00    4.3564766038E+00    4.7905786841E+00    5.2465987786E+00    5.7235333136E+00    6.2201696859E+00    6.735092 [...]
+    4.2746544422E-02    6.7140262755E-02    1.0028956440E-01    1.4373839174E-01    1.9907405698E-01    2.6790693448E-01    3.5184938256E-01    4.5249446942E-01    5.7139445854E-01    7.1003977348E-01    8.6983747167E-01    1.0520913518E+00    1.2579815122E+00    1.4885464149E+00    1.7446646404E+00    2.0270388251E+00    2.3361813486E+00    2.6724009328E+00    3.0357907195E+00    3.4262211333E+00    3.8433307217E+00    4.2865222094E+00    4.7549590119E+00    5.2475659741E+00    5.763028 [...]
+    7.6891737957E-03    5.0206982549E-03    9.4897742889E-03    2.2889682192E-02    4.7069726479E-02    8.3912737758E-02    1.3531193753E-01    2.0314737184E-01    2.8926225835E-01    3.9543915956E-01    5.2337685670E-01    6.7466748968E-01    8.5077431314E-01    1.0530112379E+00    1.2825225976E+00    1.5402650423E+00    1.8269907538E+00    2.1432326051E+00    2.4892918179E+00    2.8652252332E+00    3.2708399222E+00    3.7056841831E+00    4.1690438265E+00    4.6599443269E+00    5.177145 [...]
+    1.3968413493E-01    1.1853761761E-01    1.0342990051E-01    9.6326259235E-02    9.9256733702E-02    1.1429213816E-01    1.4351946432E-01    1.8901677922E-01    2.5282786130E-01    3.3693701020E-01    4.4324419897E-01    5.7354048641E-01    7.2948455653E-01    9.1258029124E-01    1.1241552824E+00    1.3653412470E+00    1.6370558311E+00    1.9399867370E+00    2.2745774872E+00    2.6410147555E+00    3.0392201662E+00    3.4688418293E+00    3.9292519406E+00    4.4195408252E+00    4.938521 [...]
+    4.2688664460E-01    3.9470264783E-01    3.6789556144E-01    3.4853247590E-01    3.3875032363E-01    3.4073127740E-01    3.5667702870E-01    3.8878309679E-01    4.3921226515E-01    5.1006861637E-01    6.0337170297E-01    7.2103082575E-01    8.6482114859E-01    1.0363596829E+00    1.2370835895E+00    1.4682292065E+00    1.7308133125E+00    2.0256161780E+00    2.3531672923E+00    2.7137311559E+00    3.1072991036E+00    3.5335802186E+00    3.9919974444E+00    4.4816830344E+00    5.001481 [...]
+    8.5103430457E-01    8.1410627894E-01    7.8225006746E-01    7.5757149043E-01    7.4224916086E-01    7.3850780939E-01    7.4859413911E-01    7.7474912186E-01    8.1918252849E-01    8.8404529795E-01    9.7140437781E-01    1.0832163175E+00    1.2213029998E+00    1.3873273886E+00    1.5827708327E+00    1.8089132910E+00    2.0668123944E+00    2.3572880827E+00    2.6809058615E+00    3.0379646572E+00    3.4284866296E+00    3.8522087053E+00    4.3085776881E+00    4.7967469289E+00    5.315577 [...]
+    1.3886815238E+00    1.3521826290E+00    1.3207304755E+00    1.2964156960E+00    1.2814002158E+00    1.2778932343E+00    1.2881241449E+00    1.3143182560E+00    1.3586684997E+00    1.4233103664E+00    1.5102957427E+00    1.6215670353E+00    1.7589326632E+00    1.9240434113E+00    2.1183700762E+00    2.3431826595E+00    2.5995316180E+00    2.8882305023E+00    3.2098400219E+00    3.5646565198E+00    3.9527016124E+00    4.3737136530E+00    4.8271409856E+00    5.3121425637E+00    5.827585 [...]
+    2.0125782417E+00    1.9806125241E+00    1.9538782791E+00    1.9344040301E+00    1.9242870690E+00    1.9256693581E+00    1.9407126294E+00    1.9715726925E+00    2.0203731808E+00    2.0891811714E+00    2.1799808128E+00    2.2946481900E+00    2.4349285441E+00    2.6024117323E+00    2.7985124623E+00    3.0244470102E+00    3.2812176869E+00    3.5695946706E+00    3.8901014520E+00    4.2430018488E+00    4.6282918777E+00    5.0456884892E+00    5.4946287661E+00    5.9742652548E+00    6.483464 [...]
+    2.6931156202E+00    2.6687898108E+00    2.6500257358E+00    2.6387514335E+00    2.6369594229E+00    2.6466838468E+00    2.6699750476E+00    2.7088767201E+00    2.7653998427E+00    2.8414991002E+00    2.9390483179E+00    3.0598154518E+00    3.2054423990E+00    3.3774189264E+00    3.5770649522E+00    3.8055099845E+00    4.0636762613E+00    4.3522609586E+00    4.6717228342E+00    5.0222733330E+00    5.4038617681E+00    5.8161713791E+00    6.2586152647E+00    6.7303315614E+00    7.230184 [...]
+    3.3997655556E+00    3.3852746674E+00    3.3767650651E+00    3.3760343619E+00    3.3849383544E+00    3.4053705160E+00    3.4392359999E+00    3.4884318880E+00    3.5548238440E+00    3.6402189309E+00    3.7463472635E+00    3.8748377722E+00    4.0271939655E+00    4.2047785268E+00    4.4087883063E+00    4.6402386408E+00    4.8999465372E+00    5.1885162126E+00    5.5063243112E+00    5.8535095012E+00    6.2299646852E+00    6.6353287601E+00    7.0689837314E+00    7.5300511235E+00    8.017393 [...]
+    4.1024523062E+00    4.0991769794E+00    4.1023444723E+00    4.1135978384E+00    4.1346331017E+00    4.1671772573E+00    4.2129675157E+00    4.2737287671E+00    4.3511535800E+00    4.4468787720E+00    4.5624666148E+00    4.6993800879E+00    4.8589664448E+00    5.0424345734E+00    5.2508407849E+00    5.4850671816E+00    5.7458109606E+00    6.0335660006E+00    6.3486138435E+00    6.6910125663E+00    7.0605905220E+00    7.4569364894E+00    7.8793991788E+00    8.3270826084E+00    8.798851 [...]
+    4.7727954160E+00    4.7814066905E+00    4.7969225333E+00    4.8208167087E+00    4.8546096041E+00    4.8998452472E+00    4.9580736222E+00    5.0308327054E+00    5.1196244885E+00    5.2258992643E+00    5.3510336884E+00    5.4963112647E+00    5.6629053101E+00    5.8518618360E+00    6.0640796563E+00    6.3002995490E+00    6.5610852463E+00    6.8468145233E+00    7.1576680983E+00    7.4936177545E+00    7.8544223761E+00    8.2396204052E+00    8.6485285439E+00    9.0802387510E+00    9.533618 [...]
+    5.3851949795E+00    5.4057582744E+00    5.4336565816E+00    5.4701876199E+00    5.5166833507E+00    5.5744968148E+00    5.6449820506E+00    5.7294787650E+00    5.8292914656E+00    5.9456722588E+00    6.0798047408E+00    6.2327853694E+00    6.4056065001E+00    6.5991419844E+00    6.8141298009E+00    7.0511626280E+00    7.3106686742E+00    7.5929070131E+00    7.8979529047E+00    8.2256951519E+00    8.5758228314E+00    8.9478274840E+00    9.3409965716E+00    9.7544111996E+00    1.018695 [...]
+    5.9177026680E+00    5.9497846139E+00    5.9895782774E+00    6.0381990509E+00    6.0967898751E+00    6.1665092686E+00    6.2485129777E+00    6.3439379125E+00    6.4538883408E+00    6.5794169921E+00    6.7215136431E+00    6.8810846342E+00    7.0589405706E+00    7.2557830627E+00    7.4721912580E+00    7.7086069708E+00    7.9653261668E+00    8.2424911501E+00    8.5400770712E+00    8.8578878738E+00    9.1955518176E+00    9.5525152246E+00    9.9280431250E+00    1.0321213687E+01    1.073093 [...]
+    6.3526854241E+00    6.3954574971E+00    6.4462451008E+00    6.5059838368E+00    6.5756305927E+00    6.6561509389E+00    6.7485054080E+00    6.8536326191E+00    6.9724384232E+00    7.1057826765E+00    7.2544624221E+00    7.4191979134E+00    7.6006254915E+00    7.7992786977E+00    8.0155788068E+00    8.2498292709E+00    8.5021965449E+00    8.7727108052E+00    9.0612539262E+00    9.3675552078E+00    9.6911831342E+00    1.0031553252E+01    1.0387910987E+01    1.0759341779E+01    1.114477 [...]
+    6.6772527964E+00    6.7295854176E+00    6.7901537700E+00    6.8597221290E+00    6.9390676389E+00    7.0289707059E+00    7.1302023886E+00    7.2435142627E+00    7.3696220895E+00    7.5091984482E+00    7.6628579455E+00    7.8311473667E+00    8.0145339510E+00    8.2133934438E+00    8.4280031373E+00    8.6585304572E+00    8.9050265104E+00    9.1674190826E+00    9.4455053545E+00    9.7389471902E+00    1.0047268093E+01    1.0369850953E+01    1.0705938719E+01    1.1054632247E+01    1.141489 [...]
+    6.8834493657E+00    6.9440025453E+00    7.0129263810E+00    7.0908199692E+00    7.1782922805E+00    7.2759519086E+00    7.3843936344E+00    7.5041904167E+00    7.6358829714E+00    7.7799707403E+00    7.9368991556E+00    8.1070529873E+00    8.2907427946E+00    8.4882034109E+00    8.6995760112E+00    8.9249105424E+00    9.1641524085E+00    9.4171369561E+00    9.6835902912E+00    9.9631167709E+00    1.0255205434E+01    1.0559219945E+01    1.0874406983E+01    1.1199885352E+01    1.153465 [...]
+    6.9682375569E+00    7.0355425179E+00    7.1112629991E+00    7.1958500722E+00    7.2897588530E+00    7.3934374901E+00    7.5073215984E+00    7.6318216443E+00    7.7673204492E+00    7.9141584511E+00    8.0726290389E+00    8.2429711906E+00    8.4253580194E+00    8.6198935935E+00    8.8266035693E+00    9.0454327465E+00    9.2762343179E+00    9.5187680961E+00    9.7726998748E+00    1.0037592705E+01    1.0312906856E+01    1.0598000472E+01    1.0892129191E+01    1.1194443961E+01    1.150399 [...]
+    6.9332711435E+00    7.0058007668E+00    7.0867061067E+00    7.1763054023E+00    7.2749180401E+00    7.3828489940E+00    7.5003919906E+00    7.6278152273E+00    7.7653589554E+00    7.9132268379E+00    8.0715764244E+00    8.2405209716E+00    8.4201123593E+00    8.6103449534E+00    8.8111457633E+00    9.0223682801E+00    9.2437912199E+00    9.4751157260E+00    9.7159585699E+00    9.9658518474E+00    1.0224241459E+01    1.0490492494E+01    1.0763872567E+01    1.1043577758E+01    1.132870 [...]
+    6.7844992309E+00    6.8607258875E+00    6.9452128398E+00    7.0381618754E+00    7.1397721918E+00    7.2502298666E+00    7.3697015591E+00    7.4983366592E+00    7.6362505135E+00    7.7835305228E+00    7.9402228988E+00    8.1063295231E+00    8.2818052053E+00    8.4665516625E+00    8.6604139643E+00    8.8631748885E+00    9.0745561040E+00    9.2942106375E+00    9.5217231943E+00    9.7566091367E+00    9.9983136020E+00    1.0246206508E+01    1.0499594256E+01    1.0757706300E+01    1.101970 [...]
+    6.5316198466E+00    6.6100698742E+00    6.6965954451E+00    6.7913034589E+00    6.8942900708E+00    7.0056405980E+00    7.1254206005E+00    7.2536750796E+00    7.3904235110E+00    7.5356532201E+00    7.6893190596E+00    7.8513374371E+00    8.0215825103E+00    8.1998846797E+00    8.3860251667E+00    8.5797356074E+00    8.7806927324E+00    8.9885202706E+00    9.2027860407E+00    9.4229985766E+00    9.6486096968E+00    9.8790144958E+00    1.0113550286E+01    1.0351496952E+01    1.059208 [...]
+    6.1874254430E+00    6.2667180587E+00    6.3538434162E+00    6.4488311913E+00    6.5516981425E+00    6.6624470212E+00    6.7810633631E+00    6.9075109216E+00    7.0417304635E+00    7.1836361776E+00    7.3331095258E+00    7.4900028133E+00    7.6541301251E+00    7.8252694298E+00    8.0031576500E+00    8.1874911462E+00    8.3779215122E+00    8.5740571451E+00    8.7754586895E+00    8.9816422310E+00    9.1920770211E+00    9.4061882896E+00    9.6233532996E+00    9.8429068501E+00    1.006414 [...]
+    5.7670756128E+00    5.8459507362E+00    5.9323712337E+00    6.0263067483E+00    6.1277138794E+00    6.2365350447E+00    6.3526943851E+00    6.4760959106E+00    6.6066240572E+00    6.7441382292E+00    6.8884713814E+00    7.0394288392E+00    7.1967858978E+00    7.3602862680E+00    7.5296427702E+00    7.7045304982E+00    7.8845908217E+00    8.0694310613E+00    8.2586193892E+00    8.4516886171E+00    8.6481358863E+00    8.8474196427E+00    9.0489652182E+00    9.2521630152E+00    9.456370 [...]
+    5.2873230456E+00    5.3646665448E+00    5.4492341137E+00    5.5409525886E+00    5.6397382311E+00    5.7454915102E+00    5.8580954915E+00    5.9774173780E+00    6.1033019878E+00    6.2355766133E+00    6.3740436824E+00    6.5184821698E+00    6.6686465965E+00    6.8242660536E+00    6.9850414166E+00    7.1506468063E+00    7.3207282946E+00    7.4949003689E+00    7.6727528362E+00    7.8538435193E+00    8.0377020004E+00    8.2238312263E+00    8.4117056921E+00    8.6007722871E+00    8.790455 [...]
+    4.7657426284E+00    4.8405989160E+00    4.9223334534E+00    5.0108500793E+00    5.1060406664E+00    5.2077831816E+00    5.3159391360E+00    5.4303542645E+00    5.5508582202E+00    5.6772605811E+00    5.8093539497E+00    5.9469077133E+00    6.0896751640E+00    6.2373830045E+00    6.3897399844E+00    6.5464304060E+00    6.7071156426E+00    6.8714354975E+00    7.0390052276E+00    7.2094165234E+00    7.3822416922E+00    7.5570268606E+00    7.7333001379E+00    7.9105656806E+00    8.088311 [...]
+    4.2199871620E+00    4.2915639880E+00    4.3696604790E+00    4.4541737139E+00    4.5449878021E+00    4.6419742108E+00    4.7449904727E+00    4.8538799766E+00    4.9684708266E+00    5.0885752860E+00    5.2139906878E+00    5.3444955300E+00    5.4798540199E+00    5.6198088868E+00    5.7640872694E+00    5.9123969562E+00    6.0644272304E+00    6.2198491497E+00    6.3783144261E+00    6.5394561255E+00    6.7028894290E+00    6.8682103125E+00    7.0349997726E+00    7.2028191136E+00    7.371215 [...]
+    3.6670966767E+00    3.7347647563E+00    3.8085928036E+00    3.8884825182E+00    3.9743262433E+00    4.0660028439E+00    4.1633820766E+00    4.2663195174E+00    4.3746592884E+00    4.4882299686E+00    4.6068484231E+00    4.7303170263E+00    4.8584224955E+00    4.9909385353E+00    5.1276212063E+00    5.2682127736E+00    5.4124397100E+00    5.5600114149E+00    5.7106225372E+00    5.8639513252E+00    6.0196612858E+00    6.1773989891E+00    6.3367970042E+00    6.4974730333E+00    6.659030 [...]
+    3.1228894618E+00    3.1861803790E+00    3.2552748394E+00    3.3300946509E+00    3.4105501459E+00    3.4965440678E+00    3.5879699188E+00    3.6847087169E+00    3.7866324058E+00    3.8936016092E+00    4.0054648203E+00    4.1220584763E+00    4.2432061122E+00    4.3687187731E+00    4.4983952120E+00    4.6320180210E+00    4.7693574384E+00    4.9101701890E+00    5.0541968003E+00    5.2011656070E+00    5.3507873726E+00    5.5027619292E+00    5.6567716021E+00    5.8124859663E+00    5.969560 [...]
+    2.6014537138E+00    2.6600472615E+00    2.7241008464E+00    2.7935631636E+00    2.8683780911E+00    2.9484798012E+00    3.0337973970E+00    3.1242492376E+00    3.2197462935E+00    3.3201901788E+00    3.4254720063E+00    3.5354728598E+00    3.6500610369E+00    3.7690950804E+00    3.8924202136E+00    4.0198697729E+00    4.1512627717E+00    4.2864056170E+00    4.4250891961E+00    4.5670919334E+00    4.7121754522E+00    4.8600885997E+00    5.0105635172E+00    5.1633171349E+00    5.318053 [...]
+    2.1147497946E+00    2.1684632688E+00    2.2273095565E+00    2.2912748652E+00    2.3603415154E+00    2.4344869738E+00    2.5136833351E+00    2.5978958705E+00    2.6870829356E+00    2.7811953248E+00    2.8801745529E+00    2.9839533446E+00    3.0924533177E+00    3.2055851173E+00    3.3232478938E+00    3.4453279062E+00    3.5716973015E+00    3.7022148028E+00    3.8367237558E+00    3.9750527831E+00    4.1170136275E+00    4.2624017377E+00    4.4109963959E+00    4.5625580015E+00    4.716831 [...]
+    1.6723335244E+00    1.7211062442E+00    1.7747050201E+00    1.8331598974E+00    1.8964987609E+00    1.9647479281E+00    2.0379298673E+00    2.1160625294E+00    2.1991585310E+00    2.2872236961E+00    2.3802558773E+00    2.4782443670E+00    2.5811685091E+00    2.6889958478E+00    2.8016822034E+00    2.9191694285E+00    3.0413851866E+00    3.1682416742E+00    3.2996339977E+00    3.4354406860E+00    3.5755210026E+00    3.7197158209E+00    3.8678469329E+00    4.0197130428E+00    4.175095 [...]
+    1.2811992902E+00    1.3250770262E+00    1.3734971432E+00    1.4265368589E+00    1.4842752967E+00    1.5467911298E+00    1.6141622449E+00    1.6864630992E+00    1.7637642883E+00    1.8461310040E+00    1.9336210110E+00    2.0262835070E+00    2.1241569443E+00    2.2272687619E+00    2.3356323819E+00    2.4492474218E+00    2.5680960255E+00    2.6921434470E+00    2.8213366012E+00    2.9556010362E+00    3.0948413515E+00    3.2389405072E+00    3.3877566561E+00    3.5411247507E+00    3.698855 [...]
+    9.4574419628E-01    9.8486234959E-01    1.0282624609E+00    1.0760725495E+00    1.1284240614E+00    1.1854514119E+00    1.2472892310E+00    1.3140715636E+00    1.3859286529E+00    1.4629864338E+00    1.5453638033E+00    1.6331708727E+00    1.7265068075E+00    1.8254582308E+00    1.9300968658E+00    2.0404779758E+00    2.1566382124E+00    2.2785944712E+00    2.4063413997E+00    2.5398504521E+00    2.6790677470E+00    2.8239135921E+00    2.9742802846E+00    3.1300319326E+00    3.291002 [...]
+    6.6783991756E-01    7.0240687982E-01    7.4101936162E-01    7.8385564042E-01    8.3110111934E-01    8.8294573585E-01    9.3958180839E-01    1.0012023231E+00    1.0679976853E+00    1.1401542960E+00    1.2178516940E+00    1.3012600338E+00    1.3905376965E+00    1.4858294706E+00    1.5872634701E+00    1.6949489294E+00    1.8089742271E+00    1.9294048206E+00    2.0562805703E+00    2.1896146696E+00    2.3293911058E+00    2.4755633343E+00    2.6280529103E+00    2.7867481307E+00    2.951502 [...]
+    4.4700570481E-01    4.7728685156E-01    5.1139905517E-01    5.4957064246E-01    5.9203928554E-01    6.3904930202E-01    6.9084930272E-01    7.4768947947E-01    8.0981860339E-01    8.7748142941E-01    9.5091573499E-01    1.0303495082E+00    1.1159979417E+00    1.2080608849E+00    1.3067193673E+00    1.4121337906E+00    1.5244406100E+00    1.6437500681E+00    1.7701435753E+00    1.9036715736E+00    2.0443518151E+00    2.1921668672E+00    2.3470625832E+00    2.5089465492E+00    2.677688 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone6_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone6_BA.inp
new file mode 100644
index 0000000..ba23dfb
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone6_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_cone6_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cone6                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone_BA.ima
new file mode 100644
index 0000000..bbfcb22
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone_BA.ima
@@ -0,0 +1,100 @@
+    4.2919003345E+03    4.2242628752E+03    4.1512636110E+03    4.0731977150E+03    3.9903791856E+03    3.9031375836E+03    3.8118160835E+03    3.7167714903E+03    3.6183698085E+03    3.5169860150E+03    3.4130010836E+03    3.3068003681E+03    3.1987707843E+03    3.0892985346E+03    2.9787686639E+03    2.8675619961E+03    2.7560525083E+03    2.6446061807E+03    2.5335799386E+03    2.4233180038E+03    2.3141520455E+03    2.2063992261E+03    2.1003601080E+03    1.9963177829E+03    1.894537 [...]
+    4.2837573490E+03    4.2162335564E+03    4.1433567498E+03    4.0654228448E+03    3.9827436796E+03    3.8956485213E+03    3.8044811132E+03    3.7095963416E+03    3.6113610647E+03    3.5101489619E+03    3.4063399674E+03    3.3003190866E+03    3.1924724801E+03    3.0831863360E+03    2.9728447614E+03    2.8618273861E+03    2.7505078679E+03    2.6392524573E+03    2.5284159793E+03    2.4183437267E+03    2.3093656031E+03    2.2017986316E+03    2.0959428130E+03    1.9920809367E+03    1.890477 [...]
+    4.2594113625E+03    4.1922273784E+03    4.1197175364E+03    4.0421762682E+03    3.9599138140E+03    3.8732583180E+03    3.7825514126E+03    3.6881467206E+03    3.5904078909E+03    3.4897082955E+03    3.3864257927E+03    3.2809436045E+03    3.1736450488E+03    3.0649150231E+03    2.9551358736E+03    2.8446853100E+03    2.7339350107E+03    2.6232497823E+03    2.5129824056E+03    2.4034760399E+03    2.2950602474E+03    2.1880492128E+03    2.0827418252E+03    1.9794200326E+03    1.878346 [...]
+    4.2191080458E+03    4.1524874599E+03    4.0805863929E+03    4.0036957016E+03    3.9221245286E+03    3.8361975099E+03    3.7462531957E+03    3.6526432229E+03    3.5557285109E+03    3.4558785564E+03    3.3534685826E+03    3.2488777062E+03    3.1424875162E+03    3.0346795780E+03    2.9258321497E+03    2.8163209347E+03    2.7065142802E+03    2.5967732817E+03    2.4874490785E+03    2.3788811782E+03    2.2713960530E+03    2.1653065777E+03    2.0609082905E+03    1.9584810056E+03    1.858284 [...]
+    4.1632546599E+03    4.0974156370E+03    4.0263589254E+03    3.9503723412E+03    3.8697599871E+03    3.7848443760E+03    3.6959600067E+03    3.6034530854E+03    3.5076818748E+03    3.4090114680E+03    3.3078119217E+03    3.2044593639E+03    3.0993299658E+03    2.9928014311E+03    2.8852479680E+03    2.7770403222E+03    2.6685429217E+03    2.5601128332E+03    2.4520970442E+03    2.3448310927E+03    2.2386384551E+03    2.1338270928E+03    2.0306903078E+03    1.9295037938E+03    1.830525 [...]
+    4.0924112804E+03    4.0275665847E+03    3.9575836094E+03    3.8827454389E+03    3.8033529410E+03    3.7197227664E+03    3.6321848939E+03    3.5410812119E+03    3.4467633586E+03    3.3495918211E+03    3.2499315968E+03    3.1481526639E+03    3.0446259524E+03    2.9397235473E+03    2.8338146055E+03    2.7272636052E+03    2.6204303222E+03    2.5136660157E+03    2.4073131447E+03    2.3017018684E+03    2.1971509270E+03    2.0939638541E+03    1.9924297536E+03    1.8928198590E+03    1.795388 [...]
+    4.0072836695E+03    3.9436378187E+03    3.8749483030E+03    3.8014947787E+03    3.7235722888E+03    3.6414909967E+03    3.5555761792E+03    3.4661626183E+03    3.3735967371E+03    3.2782311131E+03    3.1804253996E+03    3.0805424532E+03    2.9789472445E+03    2.8760042073E+03    2.7720757487E+03    2.6675207434E+03    2.5626919467E+03    2.4579345318E+03    2.3535843129E+03    2.2499661853E+03    2.1473923248E+03    2.0461615547E+03    1.9465566447E+03    1.8488449610E+03    1.753275 [...]
+    3.9087139038E+03    3.8464600633E+03    3.7792743785E+03    3.7074294816E+03    3.6312146908E+03    3.5509336038E+03    3.4669044312E+03    3.3794547580E+03    3.2889240427E+03    3.1956568420E+03    3.1000058782E+03    3.0023256129E+03    2.9029733693E+03    2.8023061832E+03    2.7006784823E+03    2.5984417620E+03    2.4959408105E+03    2.3935136307E+03    2.2914890615E+03    2.1901849960E+03    2.0899067747E+03    1.9909467820E+03    1.8935822096E+03    1.7980741469E+03    1.704666 [...]
+    3.7976652298E+03    3.7369866570E+03    3.6715020907E+03    3.6014770121E+03    3.5271941373E+03    3.4489490746E+03    3.3670525673E+03    3.2818246982E+03    3.1935954948E+03    3.1027017745E+03    3.0094875461E+03    2.9142983657E+03    2.8174822998E+03    2.7193885782E+03    2.6203625693E+03    2.5207467581E+03    2.4208779146E+03    2.3210851704E+03    2.2216893810E+03    2.1230005315E+03    2.0253169778E+03    1.9289230000E+03    1.8340894326E+03    1.7410707634E+03    1.650104 [...]
+    3.6752100625E+03    3.6162772175E+03    3.5526770684E+03    3.4846685939E+03    3.4125254193E+03    3.3365367197E+03    3.2570028468E+03    3.1742358725E+03    3.0885559674E+03    3.0002917168E+03    2.9097760259E+03    2.8173454533E+03    2.7233389171E+03    2.6280947558E+03    2.5319495725E+03    2.4352355956E+03    2.3382806199E+03    2.2414043545E+03    2.1449185069E+03    2.0491247563E+03    1.9543123644E+03    1.8607583903E+03    1.7687250255E+03    1.6784602947E+03    1.590195 [...]
+    3.5425145925E+03    3.4854831164E+03    3.4239360465E+03    3.3581240472E+03    3.2883128744E+03    3.2147811592E+03    3.1378212596E+03    3.0577344562E+03    2.9748318510E+03    2.8894306991E+03    2.8018539352E+03    2.7124277854E+03    2.6214803627E+03    2.5293390550E+03    2.4363298523E+03    2.3427753561E+03    2.2489922004E+03    2.1552902891E+03    2.0619713453E+03    1.9693275912E+03    1.8776394582E+03    1.7871748377E+03    1.6981881043E+03    1.6109187672E+03    1.525590 [...]
+    3.4008196770E+03    3.3458309813E+03    3.2864897223E+03    3.2230373476E+03    3.1557303837E+03    3.0848385767E+03    3.0106429041E+03    2.9334346565E+03    2.8535142376E+03    2.7711876002E+03    2.6867667699E+03    2.6005665884E+03    2.5129030982E+03    2.4240930062E+03    2.3344504216E+03    2.2442865955E+03    2.1539074762E+03    2.0636120611E+03    1.9736915276E+03    1.8844273811E+03    1.7960904654E+03    1.7089394079E+03    1.6232193906E+03    1.5391615665E+03    1.456981 [...]
+    3.2514265066E+03    3.1986063155E+03    3.1416055567E+03    3.0806575897E+03    3.0160084819E+03    2.9479173180E+03    2.8766548451E+03    2.8025012635E+03    2.7257447636E+03    2.6466800920E+03    2.5656072716E+03    2.4828285690E+03    2.3986486071E+03    2.3133711769E+03    2.2272989588E+03    2.1407307041E+03    2.0539604976E+03    1.9672760890E+03    1.8809575202E+03    1.7952753216E+03    1.7104896686E+03    1.6268491641E+03    1.5445897911E+03    1.4639335214E+03    1.385087 [...]
+    3.0956769355E+03    3.0451333850E+03    2.9905906637E+03    2.9322721830E+03    2.8704139069E+03    2.8052635402E+03    2.7370806961E+03    2.6661337187E+03    2.5926989583E+03    2.5170584555E+03    2.4394996407E+03    2.3603119368E+03    2.2797874675E+03    2.1982170054E+03    2.1158905370E+03    2.0330943022E+03    1.9501098279E+03    1.8672128444E+03    1.7846714138E+03    1.7027447612E+03    1.6216820344E+03    1.5417213967E+03    1.4630886129E+03    1.3859962503E+03    1.310643 [...]
+    2.9349335447E+03    2.8867587008E+03    2.8347732159E+03    2.7791902050E+03    2.7202339914E+03    2.6581423423E+03    2.5931623083E+03    2.5255504124E+03    2.4555692618E+03    2.3834893703E+03    2.3095837103E+03    2.2341293856E+03    2.1574045865E+03    2.0796872331E+03    2.0012532677E+03    1.9223765446E+03    1.8433254173E+03    1.7643628580E+03    1.6857445525E+03    1.6077179551E+03    1.5305207116E+03    1.4543799480E+03    1.3795111245E+03    1.3061171082E+03    1.234387 [...]
+    2.7705651544E+03    2.7248333226E+03    2.6754849956E+03    2.6227224994E+03    2.5667601177E+03    2.5078222009E+03    2.4461446102E+03    2.3819705146E+03    2.3155501926E+03    2.2471401438E+03    2.1770000171E+03    2.1053934981E+03    2.0325843058E+03    1.9588368079E+03    1.8844135530E+03    1.8095742084E+03    1.7345741415E+03    1.6596632379E+03    1.5850845250E+03    1.5110728570E+03    1.4378541243E+03    1.3656442584E+03    1.2946478532E+03    1.2250577000E+03    1.157053 [...]
+    2.6039263123E+03    2.5606942493E+03    2.5140441592E+03    2.4641677910E+03    2.4112675104E+03    2.3555560772E+03    2.2972567275E+03    2.2365991131E+03    2.1738207393E+03    2.1091636037E+03    2.0428741255E+03    1.9752014503E+03    1.9063953960E+03    1.8367058660E+03    1.7663816085E+03    1.6956681564E+03    1.6248072204E+03    1.5540354725E+03    1.4835826071E+03    1.4136709789E+03    1.3445143417E+03    1.2763169939E+03    1.2092723819E+03    1.1435631172E+03    1.079359 [...]
+    2.4363408293E+03    2.3956478111E+03    2.3517386260E+03    2.3047934287E+03    2.2550029229E+03    2.2025682172E+03    2.1476986704E+03    2.0906115352E+03    2.0315300383E+03    1.9706829588E+03    1.9083017972E+03    1.8446212324E+03    1.7798773249E+03    1.7143051701E+03    1.6481390834E+03    1.5816106344E+03    1.5149474269E+03    1.4483724167E+03    1.3821021239E+03    1.3163460622E+03    1.2513056799E+03    1.1871731567E+03    1.1241311746E+03    1.0623514081E+03    1.001994 [...]
+    2.2690871988E+03    2.2309554193E+03    2.1898105367E+03    2.1458214124E+03    2.0991671201E+03    2.0500362585E+03    1.9986254200E+03    1.9451380589E+03    1.8897839014E+03    1.8327771146E+03    1.7743353536E+03    1.7146783576E+03    1.6540274545E+03    1.5926034595E+03    1.5306261863E+03    1.4683127586E+03    1.4058766752E+03    1.3435271264E+03    1.2814669720E+03    1.2198929988E+03    1.1589940777E+03    1.0989505492E+03    1.0399335078E+03    9.8210435020E+02    9.256131 [...]
+    2.1033808802E+03    2.0678157609E+03    2.0294407086E+03    1.9884134020E+03    1.9449013035E+03    1.8990802763E+03    1.8511339709E+03    1.8012520479E+03    1.7496306683E+03    1.6964693482E+03    1.6419715005E+03    1.5863425129E+03    1.5297887321E+03    1.4725163072E+03    1.4147305548E+03    1.3566340086E+03    1.2984260772E+03    1.2403020348E+03    1.1824515352E+03    1.1250580027E+03    1.0682978388E+03    1.0123395526E+03    9.5734276537E+02    9.0345789452E+02    8.508256 [...]
+    1.9403645999E+03    1.9073548783E+03    1.8717375227E+03    1.8336590919E+03    1.7932750107E+03    1.7507485077E+03    1.7062503784E+03    1.6599568014E+03    1.6120496398E+03    1.5627146582E+03    1.5121405785E+03    1.4605182715E+03    1.4080391609E+03    1.3548951014E+03    1.3012763620E+03    1.2473717001E+03    1.1933660036E+03    1.1394405858E+03    1.0857717216E+03    1.0325299710E+03    9.7987905405E+02    9.2797556677E+02    8.7696801131E+02    8.2699591661E+02    7.781899 [...]
+    1.7810937489E+03    1.7506126839E+03    1.7177242960E+03    1.6825635892E+03    1.6452743304E+03    1.6060072853E+03    1.5649200952E+03    1.5221755985E+03    1.4779419014E+03    1.4323905910E+03    1.3856959006E+03    1.3380342437E+03    1.2895826946E+03    1.2405182924E+03    1.1910171561E+03    1.1412532006E+03    1.0913977079E+03    1.0416182069E+03    9.9207750755E+02    9.4293306475E+02    8.9433652734E+02    8.4643252697E+02    7.9935815920E+02    7.5324278354E+02    7.082069 [...]
+    1.6265274651E+03    1.5985341357E+03    1.5683300252E+03    1.5360392870E+03    1.5017936445E+03    1.4657317186E+03    1.4279984068E+03    1.3887432627E+03    1.3481206988E+03    1.3062882571E+03    1.2634061490E+03    1.2196363677E+03    1.1751416650E+03    1.1300845969E+03    1.0846269772E+03    1.0389287843E+03    9.9314735557E+02    9.4743661796E+02    9.0194611008E+02    8.5682076471E+02    8.1219982777E+02    7.6821634422E+02    7.2499633999E+02    6.8265869328E+02    6.413142 [...]
+    1.4775212378E+03    1.4519609817E+03    1.4243816191E+03    1.3948968859E+03    1.3636270688E+03    1.3306985472E+03    1.2962435422E+03    1.2603988670E+03    1.2233051216E+03    1.1851064462E+03    1.1459489854E+03    1.1059807371E+03    1.0653503145E+03    1.0242061881E+03    9.8269603497E+02    9.4096609957E+02    8.9916003617E+02    8.5741837970E+02    8.1587798808E+02    7.7467120632E+02    7.3392522753E+02    6.9376153293E+02    6.5429552382E+02    6.1563586388E+02    5.778839 [...]
+    1.3348203841E+03    1.3116255282E+03    1.2865980917E+03    1.2598411296E+03    1.2314638089E+03    1.2015805504E+03    1.1703115157E+03    1.1377806079E+03    1.1041153852E+03    1.0694464512E+03    1.0339065843E+03    9.9762999939E+02    9.6075119758E+02    9.2340530466E+02    8.8572618807E+02    8.4784637931E+02    8.0989650427E+02    7.7200396284E+02    7.3429319924E+02    6.9688400949E+02    6.5989229239E+02    6.2342814923E+02    5.8759652760E+02    5.5249613323E+02    5.182191 [...]
+    1.1990558531E+03    1.1781474710E+03    1.1555867423E+03    1.1314661904E+03    1.1058839820E+03    1.0789434269E+03    1.0507525907E+03    1.0214227941E+03    9.9106908254E+02    9.5980916159E+02    9.2776227678E+02    8.9504957121E+02    8.6179208554E+02    8.2811158336E+02    7.9412861202E+02    7.5996257254E+02    7.2573130658E+02    6.9154951280E+02    6.5752934662E+02    6.2377915003E+02    5.9040304798E+02    5.5750066458E+02    5.2516651556E+02    4.9348979079E+02    4.625538 [...]
+    1.0707422103E+03    1.0520313566E+03    1.0318409237E+03    1.0102537233E+03    9.8735721909E+02    9.6324369376E+02    9.3800940538E+02    9.1175419171E+02    8.8458052469E+02    8.5659351447E+02    8.2789999699E+02    7.9860773907E+02    7.6882525366E+02    7.3866104157E+02    7.0822327065E+02    6.7761839535E+02    6.4695185389E+02    6.1632636074E+02    5.8584202572E+02    5.5559605906E+02    5.2568149928E+02    4.9618764728E+02    4.6719915901E+02    4.3879608426E+02    4.110528 [...]
+    9.5027782172E+02    9.3366671904E+02    9.1574091057E+02    8.9657370835E+02    8.7624238683E+02    8.5482883711E+02    8.3241808307E+02    8.0909841151E+02    7.8496060620E+02    7.6009766857E+02    7.3460405631E+02    7.0857548815E+02    6.8210784915E+02    6.5529734943E+02    6.2823974394E+02    6.0102959672E+02    5.7376001437E+02    5.4652240123E+02    5.1940550399E+02    4.9249543958E+02    4.6587499965E+02    4.3962347718E+02    4.1381620678E+02    3.8852410421E+02    3.638136 [...]
+    8.3794661320E+02    8.2332972385E+02    8.0755475022E+02    7.9068557454E+02    7.7279020309E+02    7.5393990532E+02    7.3420938617E+02    7.1367596954E+02    6.9241915732E+02    6.7052033475E+02    6.4806236769E+02    6.2512911420E+02    6.0180477108E+02    5.7817361382E+02    5.5431960329E+02    5.3032578675E+02    5.0627395746E+02    4.8224440812E+02    4.5831509753E+02    4.3456165293E+02    4.1105708801E+02    3.8787098465E+02    3.6506987549E+02    3.4271618623E+02    3.208687 [...]
+    7.3392093065E+02    7.2118692010E+02    7.0744221374E+02    6.9274226691E+02    6.7714565696E+02    6.6071430083E+02    6.4351267693E+02    6.2560769516E+02    6.0706817125E+02    5.8796478418E+02    5.6836906664E+02    5.4835366886E+02    5.2799174062E+02    5.0735617834E+02    4.8651991639E+02    4.6555493993E+02    4.4453237593E+02    4.2352189652E+02    4.0259132657E+02    3.8180643194E+02    3.6123067573E+02    3.4092483305E+02    3.2094680077E+02    3.0135122365E+02    2.821893 [...]
+    6.3826735953E+02    6.2729974812E+02    6.1545974004E+02    6.0279451127E+02    5.8935407947E+02    5.7519111991E+02    5.6036074903E+02    5.4491996948E+02    5.2892756096E+02    5.1244379178E+02    4.9552992796E+02    4.7824797962E+02    4.6066042849E+02    4.4282974159E+02    4.2481826758E+02    4.0668771303E+02    3.8849897033E+02    3.7031179001E+02    3.5218445630E+02    3.3417343342E+02    3.1633338651E+02    2.9871654300E+02    2.8137279947E+02    2.6434936129E+02    2.476906 [...]
+    5.5095245551E+02    5.4163153518E+02    5.3156695490E+02    5.2079807180E+02    5.0936686477E+02    4.9731754285E+02    4.8469620314E+02    4.7155068513E+02    4.5793044126E+02    4.4388598348E+02    4.2946868096E+02    4.1473082968E+02    3.9972480512E+02    3.8450334315E+02    3.6911888770E+02    3.5362348723E+02    3.3806849896E+02    3.2250440607E+02    3.0698045216E+02    2.9154453778E+02    2.7624292517E+02    2.6111999801E+02    2.4621816630E+02    2.3157767591E+02    2.172363 [...]
+    4.7185092750E+02    4.6405484012E+02    4.5563398947E+02    4.4662069680E+02    4.3704931243E+02    4.2695610287E+02    4.1637894924E+02    4.0535710591E+02    3.9393113247E+02    3.8214259661E+02    3.7003386824E+02    3.5764782990E+02    3.4502781567E+02    3.3221722867E+02    3.1925935510E+02    3.0619732065E+02    2.9307356533E+02    2.7992998561E+02    2.6680747585E+02    2.5374584133E+02    2.4078356689E+02    2.2795784125E+02    2.1530411186E+02    2.0285609134E+02    1.906456 [...]
+    4.0075424518E+02    3.9436005207E+02    3.8745030450E+02    3.8005077002E+02    3.7218876111E+02    3.6389319423E+02    3.5519429651E+02    3.4612342706E+02    3.3671295861E+02    3.2699618668E+02    3.1700700504E+02    3.0677980537E+02    2.9634933829E+02    2.8575056561E+02    2.7501832703E+02    2.6418735445E+02    2.5329202140E+02    2.4236613146E+02    2.3144295675E+02    2.2055481171E+02    2.0973315764E+02    1.9900829375E+02    1.8840934119E+02    1.7796407743E+02    1.676988 [...]
+    3.3737964919E+02    3.3226481885E+02    3.2673395890E+02    3.2080671158E+02    3.1450407242E+02    3.0784820561E+02    3.0086220440E+02    2.9357024791E+02    2.8599722326E+02    2.7816877924E+02    2.7011105075E+02    2.6185064850E+02    2.5341452691E+02    2.4482975806E+02    2.3612353741E+02    2.2732288417E+02    2.1845465489E+02    2.0954547949E+02    2.0062145142E+02    1.9170807338E+02    1.8283032265E+02    1.7401233494E+02    1.6527733482E+02    1.5664765794E+02    1.481446 [...]
+    2.8138068105E+02    2.7742401502E+02    2.7314125649E+02    2.6854659053E+02    2.6365511528E+02    2.5848282441E+02    2.5304650455E+02    2.4736364673E+02    2.4145233432E+02    2.3533127739E+02    2.2901960431E+02    2.2253677409E+02    2.1590262476E+02    2.0913715272E+02    2.0226042878E+02    1.9529259546E+02    1.8825373701E+02    1.8116374583E+02    1.7404232837E+02    1.6690883596E+02    1.5978227474E+02    1.5268113984E+02    1.4562340276E+02    1.3862646987E+02    1.317070 [...]
+    2.3235739164E+02    2.2944008511E+02    2.2627733337E+02    2.2287829063E+02    2.1925281055E+02    2.1541133637E+02    2.1136486822E+02    2.0712489924E+02    2.0270344408E+02    1.9811284908E+02    1.9336596399E+02    1.8847581367E+02    1.8345582245E+02    1.7831951978E+02    1.7308070364E+02    1.6775319579E+02    1.6235095140E+02    1.5688788768E+02    1.5137792997E+02    1.4583481301E+02    1.4027223331E+02    1.3470364049E+02    1.2914220730E+02    1.2360091574E+02    1.180922 [...]
+    1.8986673920E+02    1.8787338367E+02    1.8570614802E+02    1.8336970562E+02    1.8086923837E+02    1.7821022352E+02    1.7539850241E+02    1.7244022086E+02    1.6934187029E+02    1.6611026627E+02    1.6275251685E+02    1.5927596211E+02    1.5568822635E+02    1.5199719630E+02    1.4821092723E+02    1.4433768652E+02    1.4038593172E+02    1.3636422379E+02    1.3228133546E+02    1.2814602179E+02    1.2396719722E+02    1.1975381840E+02    1.1551481200E+02    1.1125915614E+02    1.069957 [...]
+    1.5343317940E+02    1.5225252556E+02    1.5096080694E+02    1.4955887338E+02    1.4804764685E+02    1.4642826269E+02    1.4470198298E+02    1.4287024264E+02    1.4093468495E+02    1.3889714403E+02    1.3675974663E+02    1.3452473969E+02    1.3219472067E+02    1.2977243548E+02    1.2726099959E+02    1.2466369770E+02    1.2198416083E+02    1.1922624955E+02    1.1639409084E+02    1.1349214434E+02    1.1052506166E+02    1.0749781416E+02    1.0441559932E+02    1.0128387768E+02    9.810831 [...]
+    1.2255878494E+02    1.2208444417E+02    1.2155365165E+02    1.2096376313E+02    1.2031211816E+02    1.1959596931E+02    1.1881261448E+02    1.1795935390E+02    1.1703364005E+02    1.1603295127E+02    1.1495503087E+02    1.1379773316E+02    1.1255917063E+02    1.1123775073E+02    1.0983213423E+02    1.0834133388E+02    1.0676474738E+02    1.0510209240E+02    1.0335356183E+02    1.0151971989E+02    9.9601607757E+01    9.7600670644E+01    9.5518856757E+01    9.3358571067E+01    9.112266 [...]
+    9.6732907838E+01    9.6864079848E+01    9.6985533833E+01    9.7091710096E+01    9.7176765011E+01    9.7234698885E+01    9.7259346539E+01    9.7244513819E+01    9.7183961761E+01    9.7071473465E+01    9.6901007693E+01    9.6666613522E+01    9.6362615926E+01    9.5983602217E+01    9.5524460818E+01    9.4980518805E+01    9.4347504618E+01    9.3621622780E+01    9.2799600121E+01    9.1878723155E+01    9.0856865502E+01    8.9732502699E+01    8.8504755105E+01    8.7173382349E+01    8.573881 [...]
+    7.5441414241E+01    7.6083315796E+01    7.6754908717E+01    7.7448130532E+01    7.8154494931E+01    7.8865217096E+01    7.9571245693E+01    8.0263368137E+01    8.0932272509E+01    8.1568627000E+01    8.2163152232E+01    8.2706724538E+01    8.3190416977E+01    8.3605600439E+01    8.3944005496E+01    8.4197791452E+01    8.4359607151E+01    8.4422680620E+01    8.4380822845E+01    8.4228527262E+01    8.3960977131E+01    8.3574137498E+01    8.3064730885E+01    8.2430296423E+01    8.166920 [...]
+    5.8175058393E+01    5.9239334486E+01    6.0365894874E+01    6.1544615679E+01    6.2764823281E+01    6.4015428684E+01    6.5284981526E+01    6.6561794700E+01    6.7833997413E+01    6.9089658416E+01    7.0316866878E+01    7.1503821581E+01    7.2638944941E+01    7.3710936576E+01    7.4708895584E+01    7.5622366285E+01    7.6441455676E+01    7.7156883619E+01    7.7760075268E+01    7.8243189815E+01    7.8599209527E+01    7.8821992458E+01    7.8906251941E+01    7.8847699555E+01    7.864299 [...]
+    4.4436997803E+01    4.5842037942E+01    4.7335684333E+01    4.8906157287E+01    5.0541023072E+01    5.2227335526E+01    5.3951723404E+01    5.5700499637E+01    5.7459747299E+01    5.9215440132E+01    6.0953545294E+01    6.2660117048E+01    6.4321422360E+01    6.5924010043E+01    6.7454853067E+01    6.8901408532E+01    7.0251698676E+01    7.1494464036E+01    7.2619160637E+01    7.3616075698E+01    7.4476391793E+01    7.5192264713E+01    7.5756801354E+01    7.6164213769E+01    7.640975 [...]
+    3.3749496749E+01    3.5420608010E+01    3.7200939537E+01    3.9077417304E+01    4.1036253734E+01    4.3063072331E+01    4.5143008293E+01    4.7260831446E+01    4.9401031247E+01    5.1547962773E+01    5.3685946066E+01    5.5799367996E+01    5.7872816946E+01    5.9891199318E+01    6.1839803366E+01    6.3704460584E+01    6.5471608335E+01    6.7128381343E+01    6.8662741532E+01    7.0063504793E+01    7.1320445570E+01    7.2424356828E+01    7.3367118493E+01    7.4141730206E+01    7.474235 [...]
+    2.5659546491E+01    2.7529065414E+01    2.9523256939E+01    3.1628109398E+01    3.3828842184E+01    3.6110034058E+01    3.8455728570E+01    4.0849566847E+01    4.3274877065E+01    4.5714814722E+01    4.8152500334E+01    5.0571098125E+01    5.2953966364E+01    5.5284776592E+01    5.7547602199E+01    5.9727054413E+01    6.1808393581E+01    6.3777591867E+01    6.5621460935E+01    6.7327730665E+01    6.8885135964E+01    7.0283450883E+01    7.1513616383E+01    7.2567711963E+01    7.343908 [...]
+    1.9743547490E+01    2.1750822665E+01    2.3893631013E+01    2.6157323642E+01    2.8526469297E+01    3.0984955098E+01    3.3516101247E+01    3.6102791584E+01    3.8727573531E+01    4.1372825019E+01    4.4020831578E+01    4.6653946127E+01    4.9254706603E+01    5.1805945271E+01    5.4290909463E+01    5.6693391051E+01    5.8997826929E+01    6.1189406556E+01    6.3254155696E+01    6.5179049871E+01    6.6952085426E+01    6.8562341242E+01    7.0000072106E+01    7.1256737982E+01    7.232507 [...]
+    1.5610913190E+01    1.7702237928E+01    1.9935887973E+01    2.2296893567E+01    2.4769454015E+01    2.7337084632E+01    2.9982712264E+01    3.2688795238E+01    3.5437474545E+01    3.8210665864E+01    4.0990217036E+01    4.3758021333E+01    4.6496132787E+01    4.9186925609E+01    5.1813170276E+01    5.4358180474E+01    5.6805925770E+01    5.9141122933E+01    6.1349324875E+01    6.3417065146E+01    6.5331876630E+01    6.7082430220E+01    6.8658530687E+01    7.0051260620E+01    7.125294 [...]
+    1.2906715243E+01    1.5035147730E+01    1.7309185387E+01    1.9713766358E+01    2.2233015009E+01    2.4850343122E+01    2.7548574574E+01    3.0310063422E+01    3.3116822774E+01    3.5950654286E+01    3.8793265636E+01    4.1626410730E+01    4.4432004494E+01    4.7192245247E+01    4.9889768753E+01    5.2507705297E+01    5.5029860672E+01    5.7440756775E+01    5.9725779703E+01    6.1871255031E+01    6.3864536956E+01    6.5694086048E+01    6.7349526525E+01    6.8821716322E+01    7.010278 [...]
+    1.1313317339E+01    1.3438464546E+01    1.5709476208E+01    1.8111438862E+01    2.0628618672E+01    2.3244581646E+01    2.5942304788E+01    2.8704302332E+01    3.1512740099E+01    3.4349568298E+01    3.7196641754E+01    4.0035854716E+01    4.2849252487E+01    4.5619178189E+01    4.8328342706E+01    5.0960015439E+01    5.3498052501E+01    5.5927087015E+01    5.8232538470E+01    6.0400783175E+01    6.2419206626E+01    6.4276263242E+01    6.5961565390E+01    6.7465945787E+01    6.878149 [...]
+    1.0551127474E+01    1.2638844793E+01    1.4870155313E+01    1.7230482005E+01    1.9704447139E+01    2.2275982478E+01    2.4928439620E+01    2.7644716624E+01    3.0407370173E+01    3.3198734076E+01    3.6001066581E+01    3.8796625296E+01    4.1567845324E+01    4.4297421926E+01    4.6968428091E+01    4.9564446110E+01    5.2069666483E+01    5.4468995807E+01    5.6748132564E+01    5.8893685133E+01    6.0893248590E+01    6.2735461945E+01    6.4410097378E+01    6.5908101102E+01    6.722163 [...]
+    1.0378483681E+01    1.2400529561E+01    1.4561825602E+01    1.6848290607E+01    1.9245075483E+01    2.1736656912E+01    2.4306952367E+01    2.6939440106E+01    2.9617262481E+01    3.2323351878E+01    3.5040539171E+01    3.7751699631E+01    4.0439822106E+01    4.3088166557E+01    4.5680370731E+01    4.8200537849E+01    5.0633357341E+01    5.2964206686E+01    5.5179223193E+01    5.7265431876E+01    5.9210794677E+01    6.1004265914E+01    6.2635913032E+01    6.4096919715E+01    6.537966 [...]
+    1.0590783635E+01    1.2524442397E+01    1.4591350425E+01    1.6778065034E+01    1.9070401909E+01    2.1453537854E+01    2.3912112848E+01    2.6430343104E+01    2.8992118460E+01    3.1581133672E+01    3.4180983953E+01    3.6775292768E+01    3.9347801869E+01    4.1882510633E+01    4.4363746999E+01    4.6776313343E+01    4.9105565250E+01    5.1337478804E+01    5.3458800264E+01    5.5457085242E+01    5.7320784615E+01    5.9039315601E+01    6.0603126990E+01    6.2003751402E+01    6.323383 [...]
+    1.1018959991E+01    1.2846616643E+01    1.4800256127E+01    1.6867179142E+01    1.9033984233E+01    2.1286667749E+01    2.3610716699E+01    2.5991210446E+01    2.8412932549E+01    3.0860455491E+01    3.3318285480E+01    3.5770921280E+01    3.8202994477E+01    4.0599369587E+01    4.2945219250E+01    4.5226153745E+01    4.7428305904E+01    4.9538412843E+01    5.1543891921E+01    5.3432964784E+01    5.5194668585E+01    5.6818972499E+01    5.8296797336E+01    5.9620086097E+01    6.078186 [...]
+    1.1527372954E+01    1.3236075933E+01    1.5062575606E+01    1.6995003900E+01    1.9020830540E+01    2.1126961118E+01    2.3299825322E+01    2.5525471948E+01    2.7789662495E+01    3.0077975735E+01    3.2375900993E+01    3.4668947129E+01    3.6942723338E+01    3.9183047798E+01    4.1376055644E+01    4.3508259816E+01    4.5566669703E+01    4.7538839753E+01    4.9412997266E+01    5.1178061332E+01    5.2823768756E+01    5.4340683199E+01    5.5720266197E+01    5.6954960897E+01    5.803816 [...]
+    1.2011258920E+01    1.3592259931E+01    1.5282268719E+01    1.7070304988E+01    1.8944775890E+01    2.0893564774E+01    2.2904114388E+01    2.4963508049E+01    2.7058565862E+01    2.9175936482E+01    3.1302179135E+01    3.3423865758E+01    3.5527676263E+01    3.7600462687E+01    3.9629370067E+01    4.1601888635E+01    4.3505969279E+01    4.5330077495E+01    4.7063256581E+01    4.8695241342E+01    5.0216464690E+01    5.1618164231E+01    5.2892393154E+01    5.4032101713E+01    5.503112 [...]
+    1.2393825037E+01    1.3842113458E+01    1.5390292617E+01    1.7028312364E+01    1.8745554900E+01    2.0530924600E+01    2.2372917759E+01    2.4259704891E+01    2.6179209374E+01    2.8119190355E+01    3.0067338728E+01    3.2011334378E+01    3.3938954477E+01    3.5838148601E+01    3.7697109512E+01    3.9504355414E+01    4.1248828154E+01    4.2919907614E+01    4.4507535860E+01    4.6002260809E+01    4.7395275254E+01    4.8678503496E+01    4.9844621522E+01    5.0887096136E+01    5.180024 [...]
+    1.2623088731E+01    1.3936931672E+01    1.5341462132E+01    1.6827569334E+01    1.8385642361E+01    2.0005625140E+01    2.1677093045E+01    2.3389315443E+01    2.5131352939E+01    2.6892101762E+01    2.8660381776E+01    3.0425032260E+01    3.2174944616E+01    3.3899181297E+01    3.5587005263E+01    3.7227997804E+01    3.8812077722E+01    4.0329595056E+01    4.1771386892E+01    4.3128831728E+01    4.4393904151E+01    4.5559220416E+01    4.6618074560E+01    4.7564496317E+01    4.839326 [...]
+    1.2668591278E+01    1.3849074258E+01    1.5111153386E+01    1.6446669308E+01    1.7847009134E+01    1.9303158964E+01    2.0805778549E+01    2.2345246532E+01    2.3911741836E+01    2.5495313119E+01    2.7085925278E+01    2.8673554442E+01    3.0248214056E+01    3.1800080978E+01    3.3319504187E+01    3.4797096758E+01    3.6223784381E+01    3.7590874237E+01    3.8890094220E+01    4.0113666621E+01    4.1254326525E+01    4.2305388398E+01    4.3260783793E+01    4.4115055221E+01    4.486346 [...]
+    1.2518050113E+01    1.3568636085E+01    1.4692010657E+01    1.5880949246E+01    1.7127823908E+01    1.8424654662E+01    1.9763158845E+01    2.1134814992E+01    2.2530912914E+01    2.3942622356E+01    2.5361043841E+01    2.6777262238E+01    2.8182414769E+01    2.9567765059E+01    3.0924720256E+01    3.2244923596E+01    3.3520286732E+01    3.4743054054E+01    3.5905836281E+01    3.7001660589E+01    3.8024034768E+01    3.8966943572E+01    3.9824920273E+01    4.0593066660E+01    4.126705 [...]
+    1.2174056135E+01    1.3100162872E+01    1.4090666070E+01    1.5139251358E+01    1.6239250607E+01    1.7383681860E+01    1.8565302704E+01    1.9776648258E+01    2.1010090412E+01    2.2257889433E+01    2.3512237417E+01    2.4765310201E+01    2.6009328177E+01    2.7236605510E+01    2.8439577644E+01    2.9610894693E+01    3.0743402107E+01    3.1830265712E+01    3.2864939705E+01    3.3841249986E+01    3.4753414221E+01    3.5596095934E+01    3.6364402090E+01    3.7053937667E+01    3.766080 [...]
+    1.1650891322E+01    1.2459483691E+01    1.3324606232E+01    1.4240815509E+01    1.5202362875E+01    1.6203225687E+01    1.7237148546E+01    1.8297688473E+01    1.9378250704E+01    2.0472134722E+01    2.1572586043E+01    2.2672823901E+01    2.3766098928E+01    2.4845732324E+01    2.5905145949E+01    2.6937931706E+01    2.7937864701E+01    2.8898951228E+01    2.9815465791E+01    3.0681988851E+01    3.1493433911E+01    3.2245073812E+01    3.2932578008E+01    3.3552022460E+01    3.409991 [...]
+    1.0971518875E+01    1.1670747489E+01    1.2419235790E+01    1.3212370684E+01    1.4045271257E+01    1.4912821001E+01    1.5809702417E+01    1.6730435285E+01    1.7669398990E+01    1.8620887757E+01    1.9579126773E+01    2.0538327282E+01    2.1492709914E+01    2.2436547203E+01    2.3364193541E+01    2.4270132869E+01    2.5148993614E+01    2.5995600314E+01    2.6804984839E+01    2.7572439306E+01    2.8293516409E+01    2.8964078559E+01    2.9580304132E+01    3.0138716025E+01    3.063619 [...]
+    1.0164830569E+01    1.0763676700E+01    1.1405168555E+01    1.2085460252E+01    1.2800487250E+01    1.3545978769E+01    1.4317493476E+01    1.5110444848E+01    1.5920130303E+01    1.6741759376E+01    1.7570484515E+01    1.8401432215E+01    1.9229729957E+01    2.0050538478E+01    2.0859076074E+01    2.1650657409E+01    2.2420709519E+01    2.3164808127E+01    2.3878692881E+01    2.4558309038E+01    2.5199805214E+01    2.5799583753E+01    2.6354298271E+01    2.6860873675E+01    2.731653 [...]
+    9.2631565543E+00    9.7711300846E+00    1.0315815237E+01    1.0894078704E+01    1.1502601883E+01    1.2137895212E+01    1.2796327645E+01    1.3474135974E+01    1.4167459813E+01    1.4872359419E+01    1.5584834126E+01    1.6300855116E+01    1.7016382858E+01    1.7727396372E+01    1.8429908661E+01    1.9119994644E+01    1.9793810725E+01    2.0447624570E+01    2.1077824666E+01    2.1680951630E+01    2.2253700301E+01    2.2792958375E+01    2.3295809545E+01    2.3759551393E+01    2.418170 [...]
+    8.3001000546E+00    8.7269640825E+00    9.1852923130E+00    9.6726030412E+00    1.0186255662E+01    1.0723476858E+01    1.1281362747E+01    1.1856908377E+01    1.2447015756E+01    1.3048516252E+01    1.3658180678E+01    1.4272752084E+01    1.4888944091E+01    1.5503472401E+01    1.6113074428E+01    1.6714514232E+01    1.7304614214E+01    1.7880260789E+01    1.8438426127E+01    1.8976189710E+01    1.9490740575E+01    1.9979398823E+01    2.0439638358E+01    2.0869077635E+01    2.126551 [...]
+    7.3087041200E+00    7.6642282949E+00    8.0466513789E+00    8.4540733419E+00    8.8844663807E+00    9.3356952317E+00    9.8055182838E+00    1.0291602166E+01    1.0791535696E+01    1.1302840924E+01    1.1822986115E+01    1.2349393132E+01    1.2879457801E+01    1.3410561263E+01    1.3940080007E+01    1.4465396973E+01    1.4983923897E+01    1.5493105326E+01    1.5990433537E+01    1.6473464476E+01    1.6939822461E+01    1.7387216540E+01    1.7813453743E+01    1.8216449419E+01    1.859422 [...]
+    6.3199493434E+00    6.6137041112E+00    6.9304509572E+00    7.2688029855E+00    7.6272786083E+00    8.0043025661E+00    8.3982198164E+00    8.8072930243E+00    9.2297185453E+00    9.6636289664E+00    1.0107102890E+01    1.0558170479E+01    1.1014825853E+01    1.1475032802E+01    1.1936733405E+01    1.2397858680E+01    1.2856336245E+01    1.3310100796E+01    1.3757100158E+01    1.4195307627E+01    1.4622728481E+01    1.5037411710E+01    1.5437456568E+01    1.5821021944E+01    1.618633 [...]
+    5.3615957222E+00    5.6027782106E+00    5.8636695320E+00    6.1433312127E+00    6.4407538681E+00    6.7548544073E+00    7.0844834938E+00    7.4284254429E+00    7.7854045918E+00    8.1540840555E+00    8.5330723829E+00    8.9209299836E+00    9.3161690483E+00    9.7172594711E+00    1.0122636522E+01    1.0530701612E+01    1.0939833101E+01    1.1348385253E+01    1.1754699797E+01    1.2157113215E+01    1.2553956142E+01    1.2943567745E+01    1.3324295536E+01    1.3694509461E+01    1.405260 [...]
+    4.4573400397E+00    4.6546357552E+00    4.8689361401E+00    5.0996868470E+00    5.3462817574E+00    5.6080593188E+00    5.8843043125E+00    6.1742440549E+00    6.4770538742E+00    6.7918509350E+00    7.1176991664E+00    7.4536072346E+00    7.7985296081E+00    8.1513711222E+00    8.5109820315E+00    8.8761684437E+00    9.2456862430E+00    9.6182517764E+00    9.9925420433E+00    1.0367193295E+01    1.0740815552E+01    1.1111989862E+01    1.1479276275E+01    1.1841217503E+01    1.219634 [...]
+    3.6262889388E+00    3.7877594115E+00    3.9640592311E+00    4.1549573273E+00    4.3601840543E+00    4.5794301195E+00    4.8123440222E+00    5.0585250945E+00    5.3175254443E+00    5.5888419732E+00    5.8719176345E+00    6.1661367932E+00    6.4708253428E+00    6.7852460492E+00    7.1086015331E+00    7.4400298023E+00    7.7786068595E+00    8.1233453871E+00    8.4731979248E+00    8.8270596903E+00    9.1837644272E+00    9.5420939419E+00    9.9007820715E+00    1.0258514764E+01    1.061393 [...]
+    2.8826978515E+00    3.0157007872E+00    3.1618324340E+00    3.3211244088E+00    3.4935831603E+00    3.6791870660E+00    3.8778800679E+00    4.0895658461E+00    4.3141027383E+00    4.5512981743E+00    4.8009040108E+00    5.0626116118E+00    5.3360464011E+00    5.6207660909E+00    5.9162571974E+00    6.2219292132E+00    6.5371172105E+00    6.8610752178E+00    7.1929816184E+00    7.5319334317E+00    7.8769514063E+00    8.2269802218E+00    8.5808892589E+00    8.9374795139E+00    9.295486 [...]
+    2.2359620781E+00    2.3470969777E+00    2.4700778464E+00    2.6051417736E+00    2.7525151261E+00    2.9124020556E+00    3.0849805104E+00    3.2703945573E+00    3.4687448994E+00    3.6800834383E+00    3.9044056202E+00    4.1416448271E+00    4.3916650253E+00    4.6542549207E+00    4.9291245645E+00    5.2158983998E+00    5.5141143324E+00    5.8232182366E+00    6.1425632961E+00    6.4714097928E+00    6.8089208098E+00    7.1541680441E+00    7.5061304484E+00    7.8636978109E+00    8.225673 [...]
+    1.6908154752E+00    1.7858948275E+00    1.8918947378E+00    2.0092099044E+00    2.1382301385E+00    2.2793325675E+00    2.4328716716E+00    2.5991720836E+00    2.7785184638E+00    2.9711473546E+00    3.1772393637E+00    3.3969103279E+00    3.6302036128E+00    3.8770837114E+00    4.1374296925E+00    4.4110286366E+00    4.6975719662E+00    4.9966507186E+00    5.3077506780E+00    5.6302537771E+00    5.9634333950E+00    6.3064570663E+00    6.6583837653E+00    7.0181708682E+00    7.384673 [...]
+    1.2477006924E+00    1.3317403761E+00    1.4260766529E+00    1.5312149517E+00    1.6476620931E+00    1.7759162364E+00    1.9164578467E+00    2.0697392026E+00    2.2361758376E+00    2.4161352182E+00    2.6099292476E+00    2.8178032468E+00    3.0399293416E+00    3.2763964781E+00    3.5272039779E+00    3.7922557775E+00    4.0713524506E+00    4.3641874391E+00    4.6703445058E+00    4.9892908756E+00    5.3203804207E+00    5.6628483230E+00    6.0158140237E+00    6.3782825203E+00    6.749146 [...]
+    9.0327217360E-01    9.8050300160E-01    1.0676517423E+00    1.1652941889E+00    1.2740108130E+00    1.3943772743E+00    1.5269533977E+00    1.6722734217E+00    1.8308354809E+00    2.0030918616E+00    2.1894370813E+00    2.3902006899E+00    2.6056370509E+00    2.8359153496E+00    3.0811138145E+00    3.3412109813E+00    3.6160789729E+00    3.9054792695E+00    4.2090583208E+00    4.5263417740E+00    4.8567358274E+00    5.1995229230E+00    5.5538626742E+00    5.9187941632E+00    6.293237 [...]
+    6.5099488408E-01    7.2488857727E-01    8.0851447094E-01    9.0248308850E-01    1.0074117538E+00    1.1239142169E+00    1.2525905317E+00    1.3940162044E+00    1.5487315263E+00    1.7172310245E+00    1.8999529740E+00    2.0972700809E+00    2.3094791246E+00    2.5367921686E+00    2.7793294202E+00    3.0371088533E+00    3.3100429041E+00    3.5979307342E+00    3.9004530079E+00    4.2171711150E+00    4.5475198744E+00    4.8908111036E+00    5.2462304316E+00    5.6128385772E+00    5.989575 [...]
+    4.8180012157E-01    5.5510910454E-01    6.3810887031E-01    7.3141447009E-01    8.3564813117E-01    9.5142941633E-01    1.0793645245E+00    1.2200354701E+00    1.3739902576E+00    1.5417313270E+00    1.7237056403E+00    1.9202949928E+00    2.1318063206E+00    2.3584626673E+00    2.6003946513E+00    2.8576324645E+00    3.1301005198E+00    3.4176107764E+00    3.7198575339E+00    4.0364145626E+00    4.3667318390E+00    4.7101341163E+00    5.0658221637E+00    5.4328702238E+00    5.810232 [...]
+    3.8476608996E-01    4.5957351691E-01    5.4413055032E-01    6.3903154872E-01    7.4487770771E-01    8.6226682190E-01    9.9178334946E-01    1.1339878991E+00    1.2894069177E+00    1.4585225135E+00    1.6417620369E+00    1.8394889186E+00    2.0519935356E+00    2.2794824673E+00    2.5220728861E+00    2.7797847460E+00    3.0525324565E+00    3.3401205070E+00    3.6422393875E+00    3.9584604936E+00    4.2882348271E+00    4.6308903022E+00    4.9856337379E+00    5.3515484875E+00    5.727599 [...]
+    3.4779164980E-01    4.2556935310E-01    5.1321658715E-01    6.1128707909E-01    7.2033947296E-01    8.4092855889E-01    9.7359441106E-01    1.1188537443E+00    1.2771890323E+00    1.4490389909E+00    1.6347891677E+00    1.8347631717E+00    2.0492120189E+00    2.2783078445E+00    2.5221350274E+00    2.7806830968E+00    3.0538414101E+00    3.3413927474E+00    3.6430096127E+00    3.9582508544E+00    4.2865572936E+00    4.6272546965E+00    4.9795483800E+00    5.3425299791E+00    5.715173 [...]
+    3.5823672340E-01    4.3990893834E-01    5.3159766453E-01    6.3380056189E-01    7.4701810748E-01    8.7174492313E-01    1.0084602275E+00    1.1576194587E+00    1.3196436664E+00    1.4949118191E+00    1.6837507778E+00    1.8864267099E+00    2.1031378703E+00    2.3340053070E+00    2.5790670633E+00    2.8382699172E+00    3.1114657901E+00    3.3984051329E+00    3.6987337092E+00    4.0119890267E+00    4.3375985303E+00    4.6748783314E+00    5.0230335739E+00    5.3811584990E+00    5.748240 [...]
+    4.0350835790E-01    4.8951866233E-01    5.8569076338E-01    6.9245541064E-01    8.1024328256E-01    9.3947739544E-01    1.0805640937E+00    1.2338851675E+00    1.3997889840E+00    1.5785821634E+00    1.7705212681E+00    1.9758050427E+00    2.1945669867E+00    2.4268676932E+00    2.6726887749E+00    2.9319268248E+00    3.2043880809E+00    3.4897853990E+00    3.7877308329E+00    4.0977382986E+00    4.4192171078E+00    4.7514731988E+00    5.0937103004E+00    5.4450280730E+00    5.804427 [...]
+    4.7157410508E-01    5.6195347257E-01    6.6261500489E-01    7.7391512913E-01    8.9620804548E-01    1.0298374602E+00    1.1751297027E+00    1.3323856595E+00    1.5018733617E+00    1.6838200443E+00    1.8784054651E+00    2.0857538537E+00    2.3059283342E+00    2.5389230485E+00    2.7846588943E+00    3.0429771624E+00    3.3136361276E+00    3.5963053130E+00    3.8905641841E+00    4.1958990782E+00    4.5117029830E+00    4.8372715764E+00    5.1718076526E+00    5.5144210721E+00    5.864129 [...]
+    5.5139083140E-01    6.4582604670E-01    7.5061988390E-01    8.6605172555E-01    9.9239520563E-01    1.1299122054E+00    1.2788450945E+00    1.4394110272E+00    1.6117946149E+00    1.7961409012E+00    1.9925498638E+00    2.2010692997E+00    2.4216891760E+00    2.6543366147E+00    2.8988696846E+00    3.1550738269E+00    3.4226583224E+00    3.7012510970E+00    3.9903989699E+00    4.2895626300E+00    4.5981185888E+00    4.9153569733E+00    5.2404829388E+00    5.5726170670E+00    5.910799 [...]
+    6.3324124035E-01    7.3114086828E-01    8.3941800922E-01    9.5827477447E-01    1.0879048183E+00    1.2284877802E+00    1.3801831524E+00    1.5431241905E+00    1.7174126421E+00    1.9031128025E+00    2.1002454132E+00    2.3087832902E+00    2.5286449851E+00    2.7596913169E+00    3.0017207537E+00    3.2544645646E+00    3.5175853624E+00    3.7906733374E+00    4.0732438227E+00    4.3647367118E+00    4.6645162659E+00    4.9718691963E+00    5.2860082351E+00    5.6060703760E+00    5.931122 [...]
+    7.0897546462E-01    8.0953310250E-01    9.2041987280E-01    1.0417635101E+00    1.1736810151E+00    1.3162728416E+00    1.4696186276E+00    1.6337717615E+00    1.8087552927E+00    1.9945558553E+00    2.1911200349E+00    2.3983492257E+00    2.6160952557E+00    2.8441582819E+00    3.0822797049E+00    3.3301432978E+00    3.5873694405E+00    3.8535146670E+00    4.1280686825E+00    4.4104563099E+00    4.7000327018E+00    4.9960883931E+00    5.2978475365E+00    5.6044684800E+00    5.915049 [...]
+    7.7215768139E-01    8.7441075144E-01    9.8687192078E-01    1.1095999561E+00    1.2426399766E+00    1.3860195328E+00    1.5397443035E+00    1.7037943483E+00    1.8781199836E+00    2.0626371182E+00    2.2572247390E+00    2.4617199515E+00    2.6759152549E+00    2.8995550481E+00    3.1323332978E+00    3.3738908590E+00    3.6238136452E+00    3.8816309296E+00    4.1468140079E+00    4.4187768817E+00    4.6968747376E+00    4.9804056373E+00    5.2686102086E+00    5.5606758633E+00    5.855735 [...]
+    8.1812334699E-01    9.2100751201E-01    1.0339040493E+00    1.1568095840E+00    1.2897049678E+00    1.4325525798E+00    1.5852925268E+00    1.7478395534E+00    1.9200798139E+00    2.1018682443E+00    2.2930235577E+00    2.4933279377E+00    2.7025228913E+00    2.9203072004E+00    3.1463346177E+00    3.3802121809E+00    3.6214993846E+00    3.8697058520E+00    4.1242923816E+00    4.3846694913E+00    4.6501983395E+00    4.9201909605E+00    5.1939112900E+00    5.4705786520E+00    5.749368 [...]
+    8.4395412252E-01    9.4635215213E-01    1.0584929273E+00    1.1803192698E+00    1.3117571157E+00    1.4527129595E+00    1.6030707672E+00    1.7626903151E+00    1.9314039746E+00    2.1090147590E+00    2.2952929805E+00    2.4899755550E+00    2.6927635535E+00    2.9033192711E+00    3.1212670068E+00    3.3461894227E+00    3.5776281223E+00    3.8150823146E+00    4.0580101565E+00    4.3058261803E+00    4.5579043170E+00    4.8135783026E+00    5.0721403550E+00    5.3328476348E+00    5.594919 [...]
+    8.4838126798E-01    9.4916593023E-01    1.0593530395E+00    1.1788415384E+00    1.3075123785E+00    1.4452265072E+00    1.5918230720E+00    1.7471175576E+00    1.9108998290E+00    2.0829327419E+00    2.2629494193E+00    2.4506527802E+00    2.6457144746E+00    2.8477724279E+00    3.0564297940E+00    3.2712562166E+00    3.4917851373E+00    3.7175150244E+00    3.9479082405E+00    4.1823933235E+00    4.4203634454E+00    4.6611781988E+00    4.9041662398E+00    5.1486258114E+00    5.393825 [...]
+    8.3162821903E-01    9.2969935921E-01    1.0367677661E+00    1.1526984139E+00    1.2773381449E+00    1.4105136585E+00    1.5520307948E+00    1.7016725753E+00    1.8591984084E+00    2.0243432179E+00    2.1968141935E+00    2.3762934432E+00    2.5624331375E+00    2.7548586316E+00    2.9531641274E+00    3.1569152558E+00    3.3656480722E+00    3.5788688757E+00    3.7960535276E+00    4.0166509326E+00    4.2400808355E+00    4.4657364230E+00    4.6929856406E+00    4.9211728203E+00    5.149619 [...]
+    7.9520687530E-01    8.8952286137E-01    9.9237265371E-01    1.1035981991E+00    1.2230230057E+00    1.3504512645E+00    1.4856672986E+00    1.6284338395E+00    1.7784920347E+00    1.9355604400E+00    2.0993340755E+00    2.2694844460E+00    2.4456579086E+00    2.6274764364E+00    2.8145379647E+00    3.0064139845E+00    3.2026521926E+00    3.4027757324E+00    3.6062834292E+00    3.8126506280E+00    4.0213308651E+00    4.2317562255E+00    4.4433390308E+00    4.6554721462E+00    4.867532 [...]
+    7.4168035961E-01    8.3128322666E-01    9.2890645087E-01    1.0343793989E+00    1.1475134777E+00    1.2681020184E+00    1.3959193829E+00    1.5307199676E+00    1.6722391889E+00    1.8201911337E+00    1.9742702109E+00    2.1341488978E+00    2.2994799802E+00    2.4698941928E+00    2.6450009915E+00    2.8243897413E+00    3.0076287088E+00    3.1942661055E+00    3.3838308470E+00    3.5758336718E+00    3.7697658047E+00    3.9651026908E+00    4.1613056898E+00    4.3578189790E+00    4.554076 [...]
+    6.7440598675E-01    7.5844110620E-01    8.4994204561E-01    9.4873596491E-01    1.0546329108E+00    1.1674263255E+00    1.2868918153E+00    1.4127877162E+00    1.5448544517E+00    1.6828142081E+00    1.8263712895E+00    1.9752122705E+00    2.1290051341E+00    2.2874002324E+00    2.4500296460E+00    2.6165086666E+00    2.7864356546E+00    2.9593916845E+00    3.1349426791E+00    3.3126391638E+00    3.4920172033E+00    3.6726003561E+00    3.8538994822E+00    4.0354140605E+00    4.216634 [...]
+    5.9727110202E-01    6.7500199656E-01    7.5961235067E-01    8.5093671897E-01    9.4879417928E-01    1.0529886213E+00    1.1633078569E+00    1.2795246771E+00    1.4013957940E+00    1.5286623406E+00    1.6610494876E+00    1.7982674154E+00    1.9400100565E+00    2.0859567449E+00    2.2357722817E+00    2.3891055195E+00    2.5455920733E+00    2.7048539866E+00    2.8664991689E+00    3.0301248810E+00    3.1953156261E+00    3.3616446592E+00    3.5286761798E+00    3.6959656542E+00    3.863060 [...]
+    5.1443473408E-01    5.8525262880E-01    6.6234111402E-01    7.4555109173E-01    8.3472010084E-01    9.2967197412E-01    1.0302171034E+00    1.1361520367E+00    1.2472601671E+00    1.3633111128E+00    1.4840609381E+00    1.6092526443E+00    1.7386155718E+00    1.8718671348E+00    2.0087108424E+00    2.1488380499E+00    2.2919289510E+00    2.4376513690E+00    2.5856613982E+00    2.7356064339E+00    2.8871214477E+00    3.0398349303E+00    3.1933642540E+00    3.3473211199E+00    3.501309 [...]
+    4.3008450594E-01    4.9351345482E-01    5.6259085340E-01    6.3719220338E-01    7.1718152511E-01    8.0241143412E-01    8.9272316787E-01    9.8794662726E-01    1.0879004027E+00    1.1923910894E+00    1.3012145171E+00    1.4141545431E+00    1.5309843834E+00    1.6514651670E+00    1.7753484721E+00    1.9023734726E+00    2.0322693866E+00    2.1647558679E+00    2.2995417121E+00    2.4363263788E+00    2.5748000423E+00    2.7146446003E+00    2.8555337154E+00    2.9971332359E+00    3.139102 [...]
+    3.4821764314E-01    4.0391629368E-01    4.6463682555E-01    5.3028602635E-01    6.0076184381E-01    6.7595316183E-01    7.5573968555E-01    8.3999210855E-01    9.2857155617E-01    1.0213297554E+00    1.1181085540E+00    1.2187404955E+00    1.3230481263E+00    1.4308442794E+00    1.5419321896E+00    1.6561048093E+00    1.7731455582E+00    1.8928287243E+00    2.0149185782E+00    2.1391696437E+00    2.2653280346E+00    2.3931310064E+00    2.5223063341E+00    2.6525748903E+00    2.783648 [...]
+    2.7245436678E-01    3.2021390970E-01    3.7237240676E-01    4.2887382574E-01    4.8965592875E-01    5.5465018691E-01    6.2378104855E-01    6.9696598133E-01    7.7411508121E-01    8.5513090936E-01    9.3990772570E-01    1.0283316689E+00    1.1202802912E+00    1.2156224803E+00    1.3142178562E+00    1.4159169356E+00    1.5205602058E+00    1.6279792848E+00    1.7379958849E+00    1.8504213565E+00    1.9650575460E+00    2.0816969596E+00    2.2001208269E+00    2.3201025247E+00    2.441404 [...]
+    2.0588701826E-01    2.4562638578E-01    2.8915289508E-01    3.3645231705E-01    3.8750719133E-01    4.4229597437E-01    5.0079295857E-01    5.6296730231E-01    6.2878283266E-01    6.9819720136E-01    7.7116173058E-01    8.4762023473E-01    9.2750917642E-01    1.0107565069E+00    1.0972816806E+00    1.1869947329E+00    1.2797958978E+00    1.3755752517E+00    1.4742128929E+00    1.5755766460E+00    1.6795249362E+00    1.7859026692E+00    1.8945450517E+00    2.0052739809E+00    2.117899 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone_BA.inp
new file mode 100644
index 0000000..b309423
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cone_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_cone_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cone                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cuboctahedron_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cuboctahedron_BA.ima
new file mode 100644
index 0000000..317dbed
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cuboctahedron_BA.ima
@@ -0,0 +1,100 @@
+    2.4410992660E+04    2.2868344620E+04    2.2408651602E+04    2.0645902142E+04    2.0273007723E+04    1.8566965582E+04    1.7144114506E+04    1.6373352216E+04    1.5234895829E+04    1.3627021365E+04    1.0293525304E+04    1.0789027075E+04    9.9584082894E+03    9.3449797606E+03    8.4603037767E+03    7.6118548477E+03    6.7615810323E+03    5.9087528508E+03    5.1893946530E+03    4.5625671726E+03    3.9369614143E+03    3.4157816782E+03    2.9236309103E+03    2.5005802344E+03    2.111751 [...]
+    2.4237134511E+04    2.3169808484E+04    2.2050247712E+04    2.0889832210E+04    1.9699977130E+04    1.8491957307E+04    1.7276740459E+04    1.6064832273E+04    1.4866136225E+04    1.3689830560E+04    1.2544264364E+04    1.1436874143E+04    1.0374121774E+04    9.3614541787E+03    8.4032844954E+03    7.5029940578E+03    6.6629539909E+03    5.8845648344E+03    5.1683122383E+03    4.5138364859E+03    3.9200133855E+03    3.3850439302E+03    2.9065500626E+03    2.4816738944E+03    2.107177 [...]
+    2.4045882992E+04    2.2985008843E+04    2.1872281134E+04    2.0719023579E+04    1.9536593858E+04    1.8336208890E+04    1.7128778752E+04    1.5924752446E+04    1.4733978371E+04    1.3565581901E+04    1.2427861996E+04    1.1328208254E+04    1.0273039277E+04    9.2677626690E+03    8.3167564682E+03    7.4233713038E+03    6.5899520961E+03    5.8178777099E+03    5.1076166094E+03    4.4587962772E+03    3.8702839417E+03    3.3402760210E+03    2.8663936261E+03    2.4457814829E+03    2.075207 [...]
+    2.3729947683E+04    2.2679754378E+04    2.1578338024E+04    2.0436929025E+04    1.9266789810E+04    1.8079041325E+04    1.6884498131E+04    1.5693515315E+04    1.4515850034E+04    1.3360540081E+04    1.2235801397E+04    1.1148945910E+04    1.0106320576E+04    9.1132679221E+03    8.1741079103E+03    7.2921403850E+03    6.4696669454E+03    5.7080306475E+03    5.0076715917E+03    4.3681961658E+03    3.7884575000E+03    3.2666445506E+03    2.8003771691E+03    2.3868045288E+03    2.022704 [...]
+    2.3293498949E+04    2.2258108128E+04    2.1172366980E+04    2.0047376361E+04    1.8894266479E+04    1.7724025063E+04    1.6547334116E+04    1.5374418407E+04    1.4214908501E+04    1.3077720709E+04    1.1970955841E+04    1.0901818142E+04    9.8765552630E+03    8.9004195754E+03    7.9776506122E+03    7.1114779305E+03    6.3041432177E+03    5.5569400571E+03    4.8702694194E+03    4.2437086597E+03    3.6760915897E+03    3.1655970586E+03    2.7098434171E+03    2.3059862521E+03    1.950816 [...]
+    2.2742265666E+04    2.1725650891E+04    2.0659790914E+04    1.9555621885E+04    1.8424105921E+04    1.7276061430E+04    1.6122001958E+04    1.4971986692E+04    1.3835485394E+04    1.2721260100E+04    1.1637265456E+04    1.0590569047E+04    9.5872925539E+03    8.6325740347E+03    7.7305511111E+03    6.8843643474E+03    6.0961796511E+03    5.3672281159E+03    4.6978613859E+03    4.0876203341E+03    3.5353146431E+03    3.0391107416E+03    2.5966254923E+03    2.2050230437E+03    1.861112 [...]
+    2.2083428574E+04    2.1089376712E+04    2.0047404833E+04    1.8968250579E+04    1.7862673514E+04    1.6741288049E+04    1.5614404817E+04    1.4491883614E+04    1.3383000616E+04    1.2296332194E+04    1.1239657160E+04    1.0219878773E+04    9.2429673201E+03    8.3139235663E+03    7.4367628297E+03    6.6145189810E+03    5.8492671908E+03    5.1421638606E+03    4.4935018255E+03    3.9027786410E+03    3.3687755633E+03    2.8896447011E+03    2.4630017600E+03    2.0860218219E+03    1.755535 [...]
+    2.1325487357E+04    2.0357562638E+04    1.9343248461E+04    1.8293051780E+04    1.7217496825E+04    1.6126961047E+04    1.5031519447E+04    1.3940800345E+04    1.2863855261E+04    1.1809045193E+04    1.0783945075E+04    9.7952677366E+03    8.8488081405E+03    7.9494081758E+03    7.1009417685E+03    6.3063195907E+03    5.5675122050E+03    4.8855900865E+03    4.2607786276E+03    3.6925259588E+03    3.1795812205E+03    2.7200807900E+03    2.3116399198E+03    1.9514472582E+03    1.636359 [...]
+    2.0478104426E+04    1.9539615679E+04    1.8556456597E+04    1.7538873144E+04    1.6497123370E+04    1.5441316780E+04    1.4381262018E+04    1.3326325835E+04    1.2285306000E+04    1.1266320356E+04    1.0276713792E+04    9.3229844060E+03    8.4107296093E+03    7.5446124436E+03    6.7283478481E+03    5.9647081643E+03    5.2555467174E+03    4.6018379293E+03    4.0037320853E+03    3.4606226136E+03    2.9712235390E+03    2.5336546495E+03    2.1455318670E+03    1.8040603306E+03    1.506127 [...]
+    1.9551928926E+04    1.8645900420E+04    1.7697090599E+04    1.6715456236E+04    1.5710960523E+04    1.4693416248E+04    1.3672337202E+04    1.2656800711E+04    1.1655323899E+04    1.0675755836E+04    9.7251872907E+03    8.8098793343E+03    7.9352115136E+03    7.1056498424E+03    6.3247343437E+03    5.5950854237E+03    4.9184279223E+03    4.2956313107E+03    3.7267641767E+03    3.2111608848E+03    2.7474981047E+03    2.3338787833E+03    1.9679210910E+03    1.6468498933E+03    1.367588 [...]
+    1.8558404854E+04    1.7687551135E+04    1.6775954772E+04    1.5833257449E+04    1.4869101198E+04    1.3892975745E+04    1.2914073977E+04    1.1941158380E+04    1.0982440955E+04    1.0045478738E+04    9.1370865927E+03    8.2632684625E+03    7.4291677963E+03    6.6390373546E+03    5.8962281286E+03    5.2031966445E+03    4.5615295090E+03    3.9719836767E+03    3.4345406080E+03    2.9484722306E+03    2.5124164353E+03    2.1244597225E+03    1.7822245722E+03    1.4829591372E+03    1.223626 [...]
+    1.7509567540E+04    1.6676272562E+04    1.5804401741E+04    1.4903258256E+04    1.3982139232E+04    1.3050187591E+04    1.2116251901E+04    1.1188757009E+04    1.0275587904E+04    9.3839888678E+03    8.5204795201E+03    7.6907889283E+03    6.8998084373E+03    6.1515634184E+03    5.4492036502E+03    4.7950116052E+03    4.1904275032E+03    3.6360896312E+03    3.1318881208E+03    2.6770301315E+03    2.2701142084E+03    1.9092114740E+03    1.5919512762E+03    1.3156089425E+03    1.077193 [...]
+    1.6417832922E+04    1.5624133705E+04    1.4794131105E+04    1.3936769001E+04    1.3060978574E+04    1.2175534959E+04    1.1288921761E+04    1.0409206170E+04    9.5439270114E+03    8.6999977572E+03    7.8836260374E+03    7.1002507681E+03    6.3544975302E+03    5.6501523647E+03    4.9901536886E+03    4.3766016008E+03    3.8107834494E+03    3.2932141763E+03    2.8236896607E+03    2.4013510414E+03    2.0247578314E+03    1.6919675316E+03    1.4006194165E+03    1.1480201961E+03    9.312293 [...]
+    1.5295784153E+04    1.4543359128E+04    1.3756985741E+04    1.2945230518E+04    1.2116640486E+04    1.1279604882E+04    1.0442224613E+04    9.6121920724E+03    8.7966836204E+03    8.0022666510E+03    7.2348227424E+03    6.4994879555E+03    5.8006108778E+03    5.1417285527E+03    4.5255599860E+03    3.9540164961E+03    3.4282277901E+03    2.9485823011E+03    2.5147800365E+03    2.1258959587E+03    1.7804517526E+03    1.4764937410E+03    1.2116746742E+03    9.8333715661E+02    7.885965 [...]
+    1.4155960074E+04    1.3446122186E+04    1.2704750129E+04    1.1940017852E+04    1.1160072924E+04    1.0372903547E+04    9.5862131676E+03    8.8073052215E+03    8.0429802291E+03    7.2994470919E+03    6.5822500320E+03    5.8962121840E+03    5.2453963990E+03    4.6330833769E+03    4.0617668019E+03    3.5331647500E+03    3.0482462582E+03    2.6072716143E+03    2.2098446482E+03    1.8549750860E+03    1.5411488709E+03    1.2664042637E+03    1.0284115102E+03    8.2455389785E+02    6.520081 [...]
+    1.3010649952E+04    1.2344344522E+04    1.1648954938E+04    1.0932250227E+04    1.0201966167E+04    9.4656777982E+03    8.7306793860E+03    8.0038742650E+03    7.2916767130E+03    6.5999276215E+03    5.9338253446E+03    5.2978726814E+03    4.6958405152E+03    4.1307481952E+03    3.6048603255E+03    3.1196992275E+03    2.6760719779E+03    2.2741106042E+03    1.9133237522E+03    1.5926579302E+03    1.3105662842E+03    1.0650827738E+03    8.5389959798E+02    6.7444575718E+02    5.239647 [...]
+    1.1871698665E+04    1.1249505927E+04    1.0600691881E+04    9.9326111925E+03    9.2525785028E+03    8.5677466055E+03    7.8849919111E+03    7.2108095441E+03    6.5512201211E+03    5.9116899092E+03    5.2970656767E+03    4.7115251395E+03    4.1585434850E+03    3.6408760328E+03    3.1605566831E+03    2.7189114203E+03    2.3165857844E+03    1.9535849191E+03    1.6293245466E+03    1.3426910176E+03    1.0921084446E+03    8.7561084984E+02    6.9091723786E+02    5.3550754885E+02    4.066975 [...]
+    1.0750326175E+04    1.0172468335E+04    9.5704425413E+03    8.9511825589E+03    8.3215755232E+03    7.6883459174E+03    7.0579466637E+03    6.4364595806E+03    5.8295071657E+03    5.2421773236E+03    4.6789622838E+03    4.1437125583E+03    3.6396063778E+03    3.1691346407E+03    2.7341010120E+03    2.3356364393E+03    1.9742270148E+03    1.6497538172E+03    1.3615431197E+03    1.1084251637E+03    8.8879955845E+02    7.0070530131E+02    5.4189339612E+02    4.0990009409E+02    3.021188 [...]
+    9.6569647364E+03    9.1233173239E+03    8.5679244595E+03    7.9972953249E+03    7.4178861192E+03    6.8359899315E+03    6.2576335482E+03    5.6884833487E+03    5.1337621592E+03    4.5981786019E+03    4.0858701182E+03    3.6003604583E+03    3.1445320368E+03    2.7206131592E+03    2.3301797462E+03    1.9741708225E+03    1.6529167165E+03    1.3661786303E+03    1.1131980083E+03    8.9275395037E+02    7.0322679082E+02    5.4266589913E+02    4.0885975085E+02    2.9940636450E+02    2.117823 [...]
+    8.6011167716E+03    8.1112239967E+03    7.6019572821E+03    7.0794003371E+03    6.5495778593E+03    6.0183513636E+03    5.4913217609E+03    4.9737407380E+03    4.4704327159E+03    3.9857288444E+03    3.5234141395E+03    3.0866885033E+03    2.6781419821E+03    2.2997442430E+03    1.9528478820E+03    1.6382048357E+03    1.3559948556E+03    1.1058647380E+03    8.8697677634E+02    6.9806473364E+02    5.3749551641E+02    4.0333467198E+02    2.9341382873E+02    2.0539824867E+02    1.368527 [...]
+    7.5912358170E+03    7.1443295812E+03    6.6803512562E+03    6.2049608896E+03    5.7237538776E+03    5.2421627803E+03    4.7653656926E+03    4.2982031218E+03    3.8451050546E+03    3.4100295897E+03    2.9964141747E+03    2.6071401286E+03    2.2445107663E+03    1.9102430788E+03    1.6054725710E+03    1.3307705324E+03    1.0861727183E+03    8.7121816586E+02    6.8499665239E+02    5.2620314901E+02    3.9319751074E+02    2.8406759391E+02    1.9669399243E+02    1.2881463822E+02    7.808761 [...]
+    6.6346323298E+03    6.2296544916E+03    5.8098197547E+03    5.3803688950E+03    4.9464728480E+03    4.5131405064E+03    4.0851328722E+03    3.6668854138E+03    3.2624402158E+03    2.8753892166E+03    2.5088295018E+03    2.1653312805E+03    1.8469188202E+03    1.5550642667E+03    1.2906939440E+03    1.0542064109E+03    8.4550127476E+02    6.6401751452E+02    5.0877986955E+02    3.7845169770E+02    2.7139260908E+02    1.8571913489E+02    1.1936669729E+02    7.0151201937E+01    3.582867 [...]
+    5.7374055249E+03    5.3730329794E+03    4.9959169148E+03    4.6108856628E+03    4.2226930302E+03    3.8359320417E+03    3.4549548326E+03    3.0838004370E+03    2.7261319658E+03    2.3851843890E+03    2.0637238200E+03    1.7640188747E+03    1.4878243405E+03    1.2363770596E+03    1.0104036080E+03    8.1013905866E+02    6.3535584405E+02    4.8540150866E+02    3.5924395008E+02    2.5552260994E+02    1.7260398434E+02    1.0863978450E+02    6.1626088219E+01    2.9461881874E+01    1.000549 [...]
+    4.9044017695E+03    4.5790738674E+03    4.2430008506E+03    3.9006077092E+03    3.5562407725E+03    3.2140873325E+03    2.8781012053E+03    2.5519358733E+03    2.2388866111E+03    1.9418427266E+03    1.6632507469E+03    1.4050890702E+03    1.1688542763E+03    9.5555897930E+02    7.6574079581E+02    5.9948172305E+02    4.5643696602E+02    3.3587203668E+02    2.3670677265E+02    1.5756479243E+02    9.6826822838E+01    5.2686300448E+01    2.3205664187E+01    6.3718164762E+00    1.493332 [...]
+    4.1391994283E+03    3.8511472377E+03    3.5542222859E+03    3.2524574172E+03    2.9498032659E+03    2.6500536659E+03    2.3567767820E+03    2.0732535027E+03    1.8024244069E+03    1.5468463553E+03    1.3086594691E+03    1.0895649631E+03    8.9081399118E+02    7.1320736203E+02    5.5710569501E+02    4.2244931724E+02    3.0878696487E+02    2.1531214751E+02    1.4090587092E+02    8.4184293400E+01    4.3549817216E+01    1.7244089760E+01    3.4014076845E+00    1.0108011688E-01    5.417409 [...]
+    3.4441194391E+03    3.1913963394E+03    2.9315378574E+03    2.6681977852E+03    2.4049447706E+03    2.1451933926E+03    1.8921407368E+03    1.6487099110E+03    1.4175017229E+03    1.2007554909E+03    1.0003196870E+03    8.1763282505E+02    6.5371471762E+02    5.0916793902E+02    3.8418905815E+02    2.7858895291E+02    1.9182129329E+02    1.2301808911E+02    7.1031046539E+01    3.4477367532E+01    1.1788560427E+01    1.2608091008E+00    1.1054707371E+00    9.4983367709E+00    2.462639 [...]
+    2.8202603187E+03    2.6007734119E+03    2.3757467832E+03    2.1484699544E+03    1.9221450046E+03    1.6998231658E+03    1.4843466928E+03    1.2782973507E+03    1.0839526522E+03    9.0325073891E+02    7.3776454082E+02    5.8868557901E+02    4.5681749914E+02    3.4257915471E+02    2.4601680011E+02    1.6682471652E+02    1.0437338293E+02    5.7744126630E+01    2.5769047017E+01    7.0749062064E+00    1.2962194194E-01    3.2899831493E+00    1.4849234884E+01    3.3083245466E+01    5.629407 [...]
+    2.2675557733E+03    2.0790976066E+03    1.8865490834E+03    1.6928517095E+03    1.5008578965E+03    1.3132729089E+03    1.1326018580E+03    9.6110298992E+02    8.0074831182E+02    6.5319237643E+02    5.1974979701E+02    4.0138180937E+02    2.9869193688E+02    2.1193055925E+02    1.4100794347E+02    8.5515072368E+01    4.4751409493E+01    1.7758574108E+01    3.3587702273E+00    1.9672314788E-01    6.7838263708E+00    2.1543192111E+01    4.2854328517E+01    6.9096234040E+01    9.868780 [...]
+    1.7848526267E+03    1.6251327304E+03    1.4626230955E+03    1.2999347147E+03    1.1395884841E+03    9.8396231355E+02    8.3524305513E+02    6.9538440085E+02    5.6607171110E+02    4.4869451995E+02    3.4432723058E+02    2.5371827134E+02    1.7728773797E+02    1.1513330699E+02    6.7043978262E+01    3.2520995905E+01    1.0805114102E+01    9.0922127261E-01    1.6552176538E+00    1.1713959685E+01    2.9647041475E+01    5.3949179130E+01    8.3089996774E+01    1.1555408154E+02    1.498782 [...]
+    1.3700063835E+03    1.2366821568E+03    1.1017196547E+03    9.6741788140E+02    8.3598538567E+02    7.0949232873E+02    5.8982713950E+02    4.7865881654E+02    3.7740575679E+02    2.8721178666E+02    2.0892985188E+02    1.4311359320E+02    9.0016804739E+01    4.9600546545E+01    2.1547470038E+01    5.2827210885E+00    6.1559608281E-04    4.6961418071E+00    1.8200235627E+01    3.9217702451E+01    6.6366622844E+01    9.8218079862E+01    1.3333508172E+02    1.7030962275E+02    2.077969 [...]
+    1.0199914432E+03    9.1069794865E+02    8.0077001622E+02    6.9221398252E+02    5.8694599884E+02    4.8674883616E+02    3.9323304515E+02    3.0780344326E+02    2.3163172958E+02    1.6563583624E+02    1.1046641785E+02    6.6500665408E+01    3.3843414924E+01    1.2335310636E+01    1.5675840062E+00    9.0282977553E-01    9.5010034247E+00    2.6349735485E+01    5.0297960404E+01    8.0091793459E+01    1.1441155962E+02    1.5190888333E+02    1.9124278673E+02    2.3111381349E+02    2.702952 [...]
+    7.3102275439E+02    6.4340102039E+02    5.5600439160E+02    4.7056642963E+02    3.8873138904E+02    3.1201552512E+02    2.4177252519E+02    1.7916395025E+02    1.2513541254E+02    8.0399033294E+01    4.5422530284E+01    2.0425083677E+01    5.3799260515E+00    2.3406559747E-02    3.8700947572E+00    1.6233322980E+01    3.6250421945E+01    6.2911786658E+01    9.5092821824E+01    1.3158775986E+02    1.7114432131E+02    2.1249819680E+02    2.5440637037E+02    2.9567837412E+02    3.352046 [...]
+    4.9868556915E+02    4.3040904530E+02    3.6307784919E+02    2.9817301441E+02    2.3708772501E+02    1.8109288188E+02    1.3130656192E+02    8.8668175559E+01    5.3917976000E+01    2.7582403304E+01    9.9655643940E+00    1.1469615477E+00    9.8539366779E-01    9.1287722435E+00    2.5029423330E+01    4.7964293264E+01    7.7059343805E+01    1.1131731572E+02    1.4964796137E+02    1.9089979851E+02    2.3389242006E+02    2.7744840783E+02    3.2042394098E+02    3.6173725984E+02    4.003942 [...]
+    3.1806991818E+02    2.6686877501E+02    2.1720030084E+02    1.7031339243E+02    1.2737109881E+02    8.9420194065E+01    5.7364414053E+01    3.1942084821E+01    1.3708727523E+01    3.0250653257E+00    5.0687534075E-02    4.7434507070E+00    1.6864521548E+01    3.5988797503E+01    6.1520283670E+01    9.2711863648E+01    1.2868878163E+02    1.6847505688E+02    2.1102198218E+02    2.5523781691E+02    3.0001777328E+02    3.4427341127E+02    3.8696060197E+02    4.2710528872E+02    4.638263 [...]
+    1.8390647237E+02    1.4758949089E+02    1.1326734997E+02    8.1977145426E+01    5.4672630674E+01    3.2197538443E+01    1.5262339954E+01    4.4250954997E+00    7.6916399984E-02    2.4324095179E+00    1.1525316982E+01    2.7209400783E+01    4.9164459914E+01    7.6907211926E+01    1.0980662624E+02    1.4710316773E+02    1.8793130000E+02    2.3134451161E+02    2.7634206746E+02    3.2189665348E+02    3.6698207575E+02    4.1060019531E+02    4.5180632546E+02    4.8973238743E+02    5.236072 [...]
+    9.0700589734E+01    6.7174440189E+01    4.5988913246E+01    2.7989397094E+01    1.3940900788E+01    4.5048643393E+00    2.1918292772E-01    1.4820294316E+00    8.5399342246E+00    2.1480442656E+01    4.0229523434E+01    6.4553750275E+01    9.4067129735E+01    1.2824230491E+02    1.6642573247E+02    2.0785631327E+02    2.5168685862E+02    2.9700769711E+02    3.4287167468E+02    3.8831977205E+02    4.3240656216E+02    4.7422475243E+02    5.1292810372E+02    5.4775208597E+02    5.780317 [...]
+    3.2861554061E+01    2.0147319525E+01    1.0012738705E+01    3.1311697188E+00    9.8963269001E-02    1.4154995802E+00    7.4662201189E+00    1.8509172541E+01    3.4665470702E+01    5.5913942925E+01    8.2090105535E+01    1.1288945951E+02    1.4787497072E+02    1.8648846301E+02    2.2806553323E+02    2.7185349072E+02    3.1703173623E+02    3.6273392700E+02    4.0807122959E+02    4.5215594024E+02    4.9412475446E+02    5.3316099284E+02    5.6851513737E+02    5.9952309972E+02    6.256217 [...]
+    4.8242885168E+00    1.0711448665E+00    4.0219551136E-02    2.2519450028E+00    8.1534736439E+00    1.8101681485E+01    3.2348951767E+01    5.1032195522E+01    7.4165457674E+01    1.0163633824E+02    1.3320633260E+02    1.6851506701E+02    2.0708827945E+02    2.4834927680E+02    2.9163348959E+02    3.3620565063E+02    3.8127904484E+02    4.2603621859E+02    4.6965049844E+02    5.1130765283E+02    5.5022703617E+02    5.8568158191E+02    6.1701605916E+02    6.4366307287E+02    6.651563 [...]
+    1.1611618375E+00    4.6571804413E+00    1.0932235218E+01    2.0372223405E+01    3.3293790343E+01    4.9930042818E+01    7.0418832971E+01    9.4794012300E+01    1.2297995503E+02    1.5478954038E+02    1.8992566785E+02    2.2798626257E+02    2.6847261295E+02    3.1080077454E+02    3.5431567520E+02    3.9830747154E+02    4.4202963691E+02    4.8471820986E+02    5.2561160039E+02    5.6397033981E+02    5.9909616922E+02    6.3034989094E+02    6.5716745455E+02    6.7907381374E+02    6.956941 [...]
+    1.6681885723E+01    2.5861977895E+01    3.7803127401E+01    5.2774249846E+01    7.0979281422E+01    9.2545350171E+01    1.1751331428E+02    1.4583101367E+02    1.7734948883E+02    2.1182231974E+02    2.4890813248E+02    2.8817621393E+02    3.2911507106E+02    3.7114367328E+02    4.1362502773E+02    4.5588166155E+02    4.9721252416E+02    5.3691077869E+02    5.7428192561E+02    6.0866169545E+02    6.3943315893E+02    6.6604253402E+02    6.8801321623E+02    7.0495762147E+02    7.165865 [...]
+    4.6519916840E+01    5.9970988613E+01    7.6101327100E+01    9.5079478134E+01    1.1701346813E+02    1.4194118829E+02    1.6982294874E+02    2.0053649983E+02    2.3387473297E+02    2.6954618080E+02    3.0717834055E+02    3.4632374709E+02    3.8646862847E+02    4.2704388818E+02    4.6743807995E+02    5.0701197333E+02    5.4511425570E+02    5.8109787884E+02    6.1433653834E+02    6.4424077095E+02    6.7027317038E+02    6.9196225283E+02    7.0891455106E+02    7.2082457595E+02    7.274823 [...]
+    8.6204212710E+01    1.0266764398E+02    1.2167557613E+02    1.4331176913E+02    1.6760405455E+02    1.9451669597E+02    2.2394472941E+02    2.5571053568E+02    2.8956281954E+02    3.2517808569E+02    3.6216461456E+02    4.0006885321E+02    4.3838405189E+02    4.7656089808E+02    5.1401983008E+02    5.5016465304E+02    5.8439703509E+02    6.1613143009E+02    6.4480995842E+02    6.6991677812E+02    6.9099149578E+02    7.0764119861E+02    7.1955073525E+02    7.2649093140E+02    7.283244 [...]
+    1.3171563452E+02    1.5008723734E+02    1.7082612043E+02    1.9394574604E+02    2.1940831474E+02    2.4711887508E+02    2.7692123052E+02    3.0859585506E+02    3.4185995769E+02    3.7636975982E+02    4.1172497042E+02    4.4747536514E+02    4.8312929974E+02    5.1816391828E+02    5.5203675502E+02    5.8419837768E+02    6.1410568114E+02    6.4123541531E+02    6.6509752048E+02    6.8524784733E+02    7.0129985783E+02    7.1293493556E+02    7.1991097916E+02    7.2206900890E+02    7.193375 [...]
+    1.7952772897E+02    1.9885537531E+02    2.2034068038E+02    2.4394015172E+02    2.6956372412E+02    2.9707040222E+02    3.2626552588E+02    3.5689983231E+02    3.8867042494E+02    4.2122368954E+02    4.5416012740E+02    4.8704100475E+02    5.1939665013E+02    5.5073616995E+02    5.8055829850E+02    6.0836305471E+02    6.3366384551E+02    6.5599963569E+02    6.7494679752E+02    6.9013026042E+02    7.0123360099E+02    7.0800774651E+02    7.1027800878E+02    7.0794921887E+02    7.010087 [...]
+    2.2663204360E+02    2.4611118222E+02    2.6751541365E+02    2.9075645663E+02    3.1570411746E+02    3.4218326109E+02    3.6997223864E+02    3.9880291207E+02    4.2836235868E+02    4.5829627591E+02    4.8821404347E+02    5.1769533699E+02    5.4629812801E+02    5.7356785099E+02    5.9904747141E+02    6.2228815157E+02    6.4286018417E+02    6.6036384809E+02    6.7443983824E+02    6.8477893038E+02    6.9113056309E+02    6.9331005153E+02    6.9120419017E+02    6.8477505263E+02    6.740618 [...]
+    2.7054852424E+02    2.8951583028E+02    3.1016146764E+02    3.3236334030E+02    3.5596202376E+02    3.8075887272E+02    4.0651542742E+02    4.3295422977E+02    4.5976110784E+02    4.8658893218E+02    5.1306279027E+02    5.3878647075E+02    5.6335009612E+02    5.8633869611E+02    6.0734147380E+02    6.2596148512E+02    6.4182543082E+02    6.5459324904E+02    6.6396719660E+02    6.6970011865E+02    6.7160262788E+02    6.6954894717E+02    6.6348120953E+02    6.5341205843E+02    6.394254 [...]
+    3.0932190054E+02    3.2724731819E+02    3.4659806260E+02    3.6722800614E+02    3.8895815640E+02    4.1157572160E+02    4.3483432590E+02    4.5845545922E+02    4.8213119968E+02    5.0552819720E+02    5.2829285673E+02    5.5005761124E+02    5.7044812888E+02    5.8909125826E+02    6.0562348218E+02    6.1969962382E+02    6.3100153290E+02    6.3924647168E+02    6.4419492374E+02    6.4565756122E+02    6.4350112882E+02    6.3765303385E+02    6.2810447109E+02    6.1491195653E+02    5.981971 [...]
+    3.4150527603E+02    3.5798272616E+02    3.7563334454E+02    3.9429558016E+02    4.1377932079E+02    4.3386575092E+02    4.5430821976E+02    4.7483418103E+02    4.9514822458E+02    5.1493617652E+02    5.3387020021E+02    5.5161478853E+02    5.6783349833E+02    5.8219624351E+02    5.9438693508E+02    6.0411123526E+02    6.1110418006E+02    6.1513742084E+02    6.1602584045E+02    6.1363331350E+02    6.0787740319E+02    5.9873281740E+02    5.8623348391E+02    5.7047314729E+02    5.516044 [...]
+    3.6613239859E+02    3.8086942761E+02    3.9653449305E+02    4.1295808309E+02    4.2994623286E+02    4.4728102345E+02    4.6472196030E+02    4.8200827287E+02    4.9886214057E+02    5.1499281168E+02    5.3010154377E+02    5.4388725750E+02    5.5605276215E+02    5.6631138229E+02    5.7439379152E+02    5.8005484299E+02    5.8308017678E+02    5.8329238376E+02    5.8055651194E+02    5.7478471683E+02    5.6593987952E+02    5.5403804581E+02    5.3914957459E+02    5.2139892374E+02    5.009630 [...]
+    3.8268028857E+02    3.9548693423E+02    4.0898875895E+02    4.2301464849E+02    4.3737291785E+02    4.5185231368E+02    4.6622377469E+02    4.8024297507E+02    4.9365364312E+02    5.0619161437E+02    5.1758954532E+02    5.2758218244E+02    5.3591205313E+02    5.4233542089E+02    5.4662832837E+02    5.4859253934E+02    5.4806118468E+02    5.4490391889E+02    5.3903140203E+02    5.3039893783E+02    5.1900912083E+02    5.0491337336E+02    4.8821228651E+02    4.6905471582E+02    4.476356 [...]
+    3.9102404450E+02    4.0180118759E+02    4.1305723761E+02    4.2462478414E+02    4.3631947678E+02    4.4794140711E+02    4.5927713667E+02    4.7010238140E+02    4.8018533470E+02    4.8929058277E+02    4.9718353735E+02    5.0363528472E+02    5.0842772616E+02    5.1135886528E+02    5.1224808329E+02    5.1094123361E+02    5.0731538455E+02    5.0128304198E+02    4.9279569364E+02    4.8184653275E+02    4.6847224030E+02    4.5275373197E+02    4.3481580670E+02    4.1482566759E+02    3.929903 [...]
+    3.9138572775E+02    4.0011318732E+02    4.0912325506E+02    4.1825653944E+02    4.2734006760E+02    4.3618893673E+02    4.4460850853E+02    4.5239714529E+02    4.5934946200E+02    4.6526004387E+02    4.6992755537E+02    4.7315914414E+02    4.7477502430E+02    4.7461310776E+02    4.7253354102E+02    4.6842299886E+02    4.6219858555E+02    4.5381119934E+02    4.4324822655E+02    4.3053544760E+02    4.1573805837E+02    3.9896073540E+02    3.8034670216E+02    3.6007578443E+02    3.383614 [...]
+    3.8427925019E+02    3.9100386389E+02    3.9783725728E+02    4.0463144991E+02    4.1122795106E+02    4.1745958353E+02    4.2315275661E+02    4.2813017737E+02    4.3221396844E+02    4.3522913964E+02    4.3700734095E+02    4.3739080617E+02    4.3623638089E+02    4.3341951664E+02    4.2883810458E+02    4.2241601896E+02    4.1410624162E+02    4.0389344534E+02    3.9179592498E+02    3.7786678126E+02    3.6219428210E+02    3.4490135014E+02    3.2614415122E+02    3.0610978695E+02    2.850131 [...]
+    3.7045315431E+02    3.7527706577E+02    3.8006005075E+02    3.8466808332E+02    3.8895940022E+02    3.9278641266E+02    3.9599798265E+02    3.9844204510E+02    3.9996853975E+02    4.0043259950E+02    3.9969792524E+02    3.9764026274E+02    3.9415088498E+02    3.8913997437E+02    3.8253979366E+02    3.7430753345E+02    3.6442772677E+02    3.5291412891E+02    3.3981097199E+02    3.2519351952E+02    3.0916786496E+02    2.9186994060E+02    2.7346372678E+02    2.5413867726E+02    2.341064 [...]
+    3.5083308850E+02    3.5390244096E+02    3.5680614934E+02    3.5942591533E+02    3.6163817217E+02    3.6331601259E+02    3.6433140497E+02    3.6455767366E+02    3.6387220444E+02    3.6215932238E+02    3.5931327547E+02    3.5524124658E+02    3.4986630661E+02    3.4313021556E+02    3.3499597519E+02    3.2545003756E+02    3.1450407776E+02    3.0219624764E+02    2.8859183858E+02    2.7378329679E+02    2.5788955206E+02    2.4105464167E+02    2.2344563233E+02    2.0524986638E+02    1.866715 [...]
+    3.2646564721E+02    3.2795985697E+02    3.2918884401E+02    3.3005112135E+02    3.3044209715E+02    3.3025595830E+02    3.2938777455E+02    3.2773579491E+02    3.2520389649E+02    3.2170413379E+02    3.1715932683E+02    3.1150561697E+02    3.0469491343E+02    2.9669714879E+02    2.8750226119E+02    2.7712182280E+02    2.6559023921E+02    2.5296545355E+02    2.3932909991E+02    2.2478606572E+02    2.0946343893E+02    1.9350883452E+02    1.7708811432E+02    1.6038253447E+02    1.435853 [...]
+    2.9846507186E+02    2.9858682858E+02    2.9836843544E+02    2.9772569327E+02    2.9657315939E+02    2.9482593724E+02    2.9240162685E+02    2.8922240570E+02    2.8521719962E+02    2.8032389449E+02    2.7449153147E+02    2.6768242233E+02    2.5987411681E+02    2.5106115204E+02    2.4125651457E+02    2.3049274869E+02    2.1882265085E+02    2.0631949885E+02    1.9307677548E+02    1.7920736025E+02    1.6484217770E+02    1.5012830802E+02    1.3522658264E+02    1.2030870543E+02    1.055539 [...]
+    2.6796410349E+02    2.6693021617E+02    2.6550486193E+02    2.6362108079E+02    2.6121223527E+02    2.5821366648E+02    2.5456445927E+02    2.5020928473E+02    2.4510028072E+02    2.3919892417E+02    2.3247784304E+02    2.2492251196E+02    2.1653277239E+02    2.0732411840E+02    1.9732869039E+02    1.8659592368E+02    1.7519280511E+02    1.6320369991E+02    1.5072972151E+02    1.3788763009E+02    1.2480825931E+02    1.1163448570E+02    9.8518770596E+01    8.5620319642E+01    7.310191 [...]
+    2.3607004838E+02    2.3410322774E+02    2.3171572535E+02    2.2885732735E+02    2.2547942353E+02    2.2153649956E+02    2.1698769390E+02    2.1179838767E+02    2.0594178978E+02    1.9940047479E+02    1.9216782701E+02    1.8424934173E+02    1.7566373373E+02    1.6644380380E+02    1.5663701711E+02    1.4630575192E+02    1.3552718401E+02    1.2439278074E+02    1.1300738910E+02    1.0148791351E+02    8.9961592027E+01    7.8563892547E+01    6.7436064116E+01    5.6722391258E+01    4.656721 [...]
+    2.0382687307E+02    2.0114851318E+02    1.9804047356E+02    1.9446842710E+02    1.9040066019E+02    1.8580937924E+02    1.8067204445E+02    1.7497270003E+02    1.6870326574E+02    1.6186475113E+02    1.5446835174E+02    1.4653638533E+02    1.3810302642E+02    1.2921479970E+02    1.1993079587E+02    1.1032257939E+02    1.0047376394E+02    9.0479240035E+01    8.0444048638E+01    7.0481905351E+01    6.0713390904E+01    5.1263835182E+01    4.2260933431E+01    3.3832144069E+01    2.610192 [...]
+    1.7218389372E+02    1.6900788887E+02    1.6541124838E+02    1.6137438083E+02    1.5688106323E+02    1.5191954728E+02    1.4648366240E+02    1.4057388583E+02    1.3419834802E+02    1.2737373902E+02    1.2012608087E+02    1.1249133078E+02    1.0451578158E+02    9.6256228325E+01    8.7779874198E+01    7.9163954337E+01    7.0495062830E+01    6.1868176158E+01    5.3385375096E+01    4.5154276579E+01    3.7286196927E+01    2.9894077650E+01    2.3090214621E+01    1.6983840222E+01    1.167861 [...]
+    1.4197137380E+02    1.3849898122E+02    1.3463066057E+02    1.3036018368E+02    1.2568520920E+02    1.2060818110E+02    1.1513719917E+02    1.0928683435E+02    1.0307886035E+02    9.6542871989E+01    8.9716760766E+01    8.2647019327E+01    7.5388848361E+01    6.8006042944E+01    6.0570639652E+01    5.3162311300E+01    4.5867502649E+01    3.8778307766E+01    3.1991097699E+01    2.5604915481E+01    1.9719663996E+01    1.4434120526E+01    9.8438196022E+00    6.0388528031E+00    3.101639 [...]
+    1.1388310314E+02    1.1029883891E+02    1.0635651643E+02    1.0206174218E+02    9.7424311589E+01    9.2458897966E+01    8.7185694338E+01    8.1630983923E+01    7.5827614397E+01    6.9815351136E+01    6.3641085491E+01    5.7358875872E+01    5.1029802131E+01    4.4721617302E+01    3.8508185338E+01    3.2468698846E+01    2.6686676928E+01    2.1248749963E+01    1.6243245213E+01    1.1758594412E+01    7.8815916606E+00    4.6955367456E+00    2.2783052385E+00    7.0039200807E-01    2.297898 [...]
+    8.8465805888E+01    8.4934340077E+01    8.1093299833E+01    7.6958501021E+01    7.2550055969E+01    6.7892855970E+01    6.3016992787E+01    5.7958098146E+01    5.2757580305E+01    4.7462737579E+01    4.2126730197E+01    3.6808394109E+01    3.1571883415E+01    2.6486131843E+01    2.1624128246E+01    1.7062006176E+01    1.2877953254E+01    9.1509520340E+00    5.9593702153E+00    3.3794242199E+00    1.4835460197E+00    3.3868853192E-01    4.6096094801E-03    5.3217845185E-01    1.961750 [...]
+    6.6115021372E+01    6.2779020426E+01    5.9190016040E+01    5.5372365115E+01    5.1354656363E+01    4.7169993709E+01    4.2856209525E+01    3.8455990129E+01    3.4016896720E+01    2.9591266214E+01    2.5235978413E+01    2.1012078525E+01    1.6984247251E+01    1.3220114480E+01    9.7894169255E+00    6.7630048374E+00    4.2117079599E+00    2.2050761508E+00    8.1001531510E-01    8.9344350710E-02    1.0030348713E-01    8.9304851120E-01    2.5091687340E+00    4.9802689866E+00    8.326657 [...]
+    4.7076926069E+01    4.4055774651E+01    4.0843833282E+01    3.7472335682E+01    3.3976533456E+01    3.0395791155E+01    2.6773606229E+01    2.3157539911E+01    1.9599046253E+01    1.6153188262E+01    1.2878232277E+01    9.8351145232E+00    7.0867769895E+00    4.6973734705E+00    2.7313506441E+00    1.2524133521E+00    3.2238769559E-01    4.1059421423E-10    3.3959401235E-01    1.3898126839E+00    3.1922744493E+00    5.7802767974E+00    9.1775620884E+00    1.3397181790E+01    1.844049 [...]
+    3.1455419145E+01    2.8844741289E+01    2.6108819039E+01    2.3284143631E+01    2.0410883899E+01    1.7532806480E+01    1.4697119700E+01    1.1954230865E+01    9.3574081850E+00    6.9623405014E+00    4.8265903518E+00    3.0089386934E+00    1.5686227401E+00    5.6447180501E-01    5.3949687237E-02    9.2115904982E-02    7.3052184493E-01    2.0160615405E+00    3.9898001811E+00    6.6858064511E+00    1.0130017271E+01    1.4339165327E+01    1.9319800823E+01    2.5067439070E+01    3.156586 [...]
+    1.9223682293E+01    1.7095572188E+01    1.4908962307E+01    1.2704061328E+01    1.0524311469E+01    8.4161493441E+00    6.4286925710E+00    4.6133455172E+00    3.0233192968E+00    1.7130631483E+00    7.3760671810E-01    1.5181545371E-01    9.5642308874E-03    3.6283743480E-01    1.2607668958E+00    2.7486222552E+00    4.8667714007E+00    7.6496314473E+00    1.1124633245E+01    1.5311224446E+01    2.0219937642E+01    2.5851550939E+01    3.2196368398E+01    3.9233647072E+01    4.693119 [...]
+    1.0239347286E+01    8.6432135441E+00    7.0546021813E+00    5.5160064428E+00    4.0726271908E+00    2.7719913453E+00    1.6635009479E+00    7.9790986627E-01    2.2672691061E-01    1.5461728441E-03    1.7330767935E-01    7.9149392630E-01    1.9032704766E+00    3.5525814715E+00    5.7792135628E+00    8.6178443212E+00    1.2097093517E+01    1.6238597717E+01    2.1056130301E+01    2.6554790151E+01    3.2730282886E+01    3.9568318452E+01    4.7044148166E+01    5.5122262814E+01    6.375627 [...]
+    4.2623622999E+00    3.2262859755E+00    2.2613467215E+00    1.4110185030E+00    7.2089605130E-01    2.3818866412E-01    1.1151902024E-02    8.8457666512E-02    5.1850487954E-01    1.3486749134E+00    2.6245380036E+00    4.3890190626E+00    6.6815335311E+00    9.5371060976E+00    1.2985487195E+01    1.7050284080E+01    2.1748124927E+01    2.7087875637E+01    3.3069929922E+01    3.9685593574E+01    4.6916583610E+01    5.4734662227E+01    6.3101424001E+01    7.1968252758E+01    8.127646 [...]
+    9.7463933057E-01    5.0714511319E-01    1.7056302903E-01    8.1889368967E-03    6.4811375415E-02    3.8609886548E-01    1.0179343492E+00    2.0057005412E+00    3.3935215910E+00    5.2234681935E+00    7.5347350879E+00    1.0362801704E+01    1.3738588486E+01    1.7687623082E+01    2.2229232065E+01    2.7375775097E+01    3.3131939328E+01    3.9494112411E+01    4.6449852562E+01    5.3977473741E+01    6.2045763114E+01    7.0613846503E+01    7.9631215516E+01    8.9037927521E+01    9.876498 [...]
+    5.8799363528E-04    9.2729629476E-02    3.7054758390E-01    8.7615633327E-01    1.6525119579E+00    2.7427110103E+00    4.1892473359E+00    6.0332336916E+00    8.3135964485E+00    1.1066253138E+01    1.4323284061E+01    1.8112110564E+01    2.2454693877E+01    2.7366769480E+01    3.2857132853E+01    3.8926992996E+01    4.5569410377E+01    5.2768835770E+01    6.0500765867E+01    6.8731530500E+01    7.7418224798E+01    8.6508797599E+01    9.5942304984E+01    1.0564933491E+02    1.155526 [...]
+    9.2769240664E-01    1.5553572896E+00    2.4175419528E+00    3.5543372781E+00    5.0060183082E+00    6.8122722916E+00    9.0113967009E+00    1.1639476891E+01    1.4729554260E+01    1.8310796927E+01    2.2407685991E+01    2.7039231383E+01    3.2218232022E+01    3.7950595550E+01    4.4234733111E+01    5.1061044580E+01    5.8411509219E+01    6.6259395911E+01    7.4569105910E+01    8.3296159423E+01    9.2387335304E+01    1.0178097070E+02    1.1140742470E+02    1.2118970697E+02    1.310442 [...]
+    3.3263640360E+00    4.4527077079E+00    5.8558391324E+00    7.5731454375E+00    9.6415489717E+00    1.2096681371E+01    1.4972040476E+01    1.8298142329E+01    2.2101681356E+01    2.6404712643E+01    3.1223870818E+01    3.6569640475E+01    4.2445693275E+01    4.8848306756E+01    5.5765879526E+01    6.3178556783E+01    7.1057979070E+01    7.9367165724E+01    8.8060542762E+01    9.7084122746E+01    1.0637584178E+02    1.1586605596E+02    1.2547819668E+02    1.3512958079E+02    1.447323 [...]
+    6.7683998490E+00    8.3463285501E+00    1.0236325550E+01    1.2472553104E+01    1.5088081288E+01    1.8114023901E+01    2.1578670649E+01    2.5506630102E+01    2.9917998460E+01    3.4827569570E+01    4.0244101750E+01    4.6169656899E+01    5.2599026981E+01    5.9519262319E+01    6.6909315113E+01    7.4739810335E+01    8.2972954466E+01    9.1562590621E+01    1.0045440633E+02    1.0958629767E+02    1.1888889075E+02    1.2828621831E+02    1.3769654647E+02    1.4703334286E+02    1.562063 [...]
+    1.0843487059E+01    1.2818115129E+01    1.5132918269E+01    1.7818465332E+01    2.0903638273E+01    2.4414744495E+01    2.8374639140E+01    3.2801873824E+01    3.7709888458E+01    4.3106262756E+01    4.8992043697E+01    5.5361164559E+01    6.2199970213E+01    6.9486862112E+01    7.7192074835E+01    8.5277594184E+01    9.3697224644E+01    1.0239681160E+02    1.1131462099E+02    1.2038187619E+02    1.2952344894E+02    1.3865869788E+02    1.4770244514E+02    1.5656607828E+02    1.651587 [...]
+    1.5173318152E+01    1.7484336650E+01    2.0156481225E+01    2.3216502026E+01    2.6688909546E+01    3.0595076611E+01    3.4952364015E+01    3.9773287950E+01    4.5064747198E+01    5.0827327522E+01    5.7054699867E+01    6.3733127797E+01    7.0841098134E+01    7.8349086897E+01    8.6219470577E+01    9.4406590337E+01    1.0285697411E+02    1.1150971866E+02    1.2029703073E+02    1.2914492304E+02    1.3797405805E+02    1.4670072873E+02    1.5523796288E+02    1.6349673433E+02    1.713872 [...]
+    1.9423007682E+01    2.2006910747E+01    2.4965933245E+01    2.8322912882E+01    3.2097944296E+01    3.6307482444E+01    4.0963483090E+01    4.6072599935E+01    5.1635457361E+01    5.7646016756E+01    6.4091053058E+01    7.0949756469E+01    7.8193472248E+01    8.5785589142E+01    9.3681584372E+01    1.0182923023E+02    1.1016896423E+02    1.1863442157E+02    1.2715312531E+02    1.3564732636E+02    1.4403498199E+02    1.5223085857E+02    1.6014774104E+02    1.6769772894E+02    1.747935 [...]
+    2.3309630609E+01    2.6101756466E+01    2.9276389414E+01    3.2852479055E+01    3.6845783463E+01    4.1267984184E+01    4.6125851360E+01    5.1420479653E+01    5.7146614622E+01    6.3292087788E+01    6.9837376763E+01    7.6755304652E+01    8.4010890344E+01    9.1561358465E+01    9.9356314665E+01    1.0733808859E+02    1.1544224342E+02    1.2359824736E+02    1.3173029890E+02    1.3975829425E+02    1.4759892196E+02    1.5516686672E+02    1.6237610151E+02    1.6914124471E+02    1.753789 [...]
+    2.6607826150E+01    2.9544180038E+01    3.2864301376E+01    3.6583379345E+01    4.0713021966E+01    4.5260391394E+01    5.0227401752E+01    5.5610001058E+01    6.1397557311E+01    6.7572366978E+01    7.4109301745E+01    8.0975606761E+01    8.8130860503E+01    9.5527103094E+01    1.0310913636E+02    1.1081499520E+02    1.1857658606E+02    1.2632048463E+02    1.3396888102E+02    1.4144065728E+02    1.4865257899E+02    1.5552057925E+02    1.6196111149E+02    1.6789254479E+02    1.732365 [...]
+    2.9152527065E+01    3.2171363381E+01    3.5569677431E+01    3.9359113478E+01    4.3547406102E+01    4.8137542931E+01    5.3127001617E+01    5.8507083169E+01    6.4262361937E+01    7.0370270212E+01    7.6800832620E+01    8.3516562317E+01    9.0472527516E+01    9.7616593071E+01    1.0488983797E+02    1.1222714551E+02    1.1955795888E+02    1.2680719103E+02    1.3389627381E+02    1.4074432785E+02    1.4726943170E+02    1.5338996565E+02    1.5902600381E+02    1.6410072601E+02    1.685418 [...]
+    3.0838978475E+01    3.3882128901E+01    3.7295566251E+01    4.1087677330E+01    4.5262672648E+01    4.9819782283E+01    5.4752536804E+01    6.0048155755E+01    6.5687063957E+01    7.1642553114E+01    7.7880603024E+01    8.4359873059E+01    9.1031870675E+01    9.7841299544E+01    1.0472658565E+02    1.1162057537E+02    1.1845139526E+02    1.2514345935E+02    1.3161860575E+02    1.3779734102E+02    1.4360016778E+02    1.4894896858E+02    1.5376841691E+02    1.5798738544E+02    1.615403 [...]
+    3.1620299767E+01    3.4634242897E+01    3.8005075918E+01    4.1738271821E+01    4.5834922082E+01    5.0290969939E+01    5.5096538606E+01    6.0235377094E+01    6.5684443631E+01    7.1413643561E+01    7.7385734939E+01    8.3556411058E+01    8.9874564792E+01    9.6282735200E+01    1.0271773222E+02    1.0911143075E+02    1.1539172105E+02    1.2148359818E+02    1.2731036948E+02    1.3279495573E+02    1.3786125877E+02    1.4243556633E+02    1.4644796319E+02    1.4983371699E+02    1.525346 [...]
+    3.1502915794E+01    3.4439591559E+01    3.7716270682E+01    4.1335896826E+01    4.5296886617E+01    4.9592403313E+01    5.4209734306E+01    5.9129795030E+01    6.4326778904E+01    6.9767969360E+01    7.5413726016E+01    8.1217652683E+01    8.7126950199E+01    9.3082952345E+01    9.9021838234E+01    1.0487550986E+02    1.1057261900E+02    1.1603972345E+02    1.2120254893E+02    1.2598732972E+02    1.3032219864E+02    1.3413859509E+02    1.3737265872E+02    1.3996657617E+02    1.418698 [...]
+    3.0540237920E+01    3.3357616902E+01    3.6495340016E+01    3.9954232334E+01    4.3730503350E+01    4.7815062866E+01    5.2192948513E+01    5.6842887291E+01    6.1737010152E+01    6.6840734797E+01    7.2112827454E+01    7.7505649726E+01    8.2965591619E+01    8.8433686818E+01    9.3846401267E+01    9.9136581233E+01    1.0423454249E+02    1.0906927808E+02    1.1356975863E+02    1.1766629591E+02    1.2129193848E+02    1.2438386648E+02    1.2688475198E+02    1.2874405167E+02    1.299191 [...]
+    2.8825010935E+01    3.1487434333E+01    3.4448467703E+01    3.7707240907E+01    4.1258233143E+01    4.5090631778E+01    4.9187809571E+01    5.3526942269E+01    5.8078784925E+01    6.2807621068E+01    6.7671394174E+01    7.2622025898E+01    7.7605920279E+01    8.2564647908E+01    8.7435798836E+01    9.2153988073E+01    9.6651992955E+01    1.0086199757E+02    1.0471691597E+02    1.0815176319E+02    1.1110504102E+02    1.1352010452E+02    1.1534647499E+02    1.1654106570E+02    1.170692 [...]
+    2.6480758524E+01    2.8959069069E+01    3.1712842914E+01    3.4739938381E+01    3.8033577252E+01    4.1581746386E+01    4.5366723380E+01    4.9364747752E+01    5.3545855190E+01    5.7873887902E+01    6.2306689151E+01    6.6796484797E+01    7.1290449224E+01    7.5731447613E+01    8.0058941227E+01    8.4210037382E+01    8.8120661233E+01    9.1726822545E+01    9.4965947306E+01    9.7778241585E+01    1.0010805338E+02    1.0190519751E+02    1.0312620882E+02    1.0373549014E+02    1.037063 [...]
+    2.3652758616E+01    2.5924246087E+01    2.8447251515E+01    3.1218774603E+01    3.4231237128E+01    3.7471926368E+01    4.0922567164E+01    4.4559043475E+01    4.8351286066E+01    5.2263338235E+01    5.6253606269E+01    6.0275295836E+01    6.4277029933E+01    6.8203638419E+01    7.1997103840E+01    7.5597643234E+01    7.8944901128E+01    8.1979225110E+01    8.4642992295E+01    8.6881952767E+01    8.8646554826E+01    8.9893216537E+01    9.0585508767E+01    9.0695216541E+01    9.020324 [...]
+    2.0498961940E+01    2.2547149250E+01    2.4822665488E+01    2.7322044401E+01    3.0037339799E+01    3.2955609184E+01    3.6058529553E+01    3.9322165521E+01    4.2716905455E+01    4.6207576342E+01    4.9753742706E+01    5.3310189216E+01    5.6827580903E+01    6.0253289254E+01    6.3532367054E+01    6.6608649898E+01    6.9425957903E+01    7.1929367493E+01    7.4066520288E+01    7.5788934216E+01    7.7053281033E+01    7.7822594541E+01    7.8067374878E+01    7.7766556438E+01    7.690830 [...]
+    1.7181234496E+01    1.8995531459E+01    2.1013213525E+01    2.3230712866E+01    2.5640113784E+01    2.8228674396E+01    3.0978483042E+01    3.3866268753E+01    3.6863380487E+01    3.9935944660E+01    4.3045204928E+01    4.6148042364E+01    4.9197668363E+01    5.2144476891E+01    5.4937037316E+01    5.7523204176E+01    5.9851315974E+01    6.1871451632E+01    6.3536710631E+01    6.4804481280E+01    6.5637660978E+01    6.6005792811E+01    6.5886084401E+01    6.5264277449E+01    6.413533 [...]
+    1.3857259545E+01    1.5432511774E+01    1.7187868791E+01    1.9119990875E+01    2.1221351173E+01    2.3479792921E+01    2.5878222974E+01    2.8394460132E+01    3.1001251936E+01    3.3666468302E+01    3.6353474592E+01    3.9021680895E+01    4.1627258328E+01    4.4124007514E+01    4.6464359003E+01    4.8600480651E+01    5.0485462852E+01    5.2074549255E+01    5.3326378294E+01    5.4204199568E+01    5.4677028891E+01    5.4720706709E+01    5.4318826550E+01    5.3463503145E+01    5.215595 [...]
+    1.0673380103E+01    1.2009339797E+01    1.3503133381E+01    1.5151939307E+01    1.6948932957E+01    1.8882876602E+01    2.0937846365E+01    2.3093113768E+01    2.5323194524E+01    2.7598071738E+01    2.9883594902E+01    3.2142050090E+01    3.4332890836E+01    3.6413613493E+01    3.8340755618E+01    4.0070991220E+01    4.1562292837E+01    4.2775127335E+01    4.3673650311E+01    4.4226863014E+01    4.4409695800E+01    4.4203983459E+01    4.3599300031E+01    4.2593624157E+01    4.119381 [...]
+    7.7586012730E+00    8.8593453753E+00    1.0096935875E+01    1.1469316447E+01    1.2970629863E+01    1.4590837749E+01    1.6315477191E+01    1.8125570867E+01    1.9997702320E+01    2.1904262414E+01    2.3813867155E+01    2.5691941066E+01    2.7501454360E+01    2.9203796576E+01    3.0759764109E+01    3.2130634592E+01    3.3279297349E+01    3.4171406342E+01    3.4776520302E+01    3.5069194051E+01    3.5029985545E+01    3.4646344762E+01    3.3913353258E+01    3.2834286994E+01    3.142097 [...]
+    5.2199062813E+00    6.0932254920E+00    7.0838916340E+00    8.1908156196E+00    9.4093227706E+00    1.0730799358E+01    1.2142475087E+01    1.3627357264E+01    1.5164327234E+01    1.6728404060E+01    1.8291174496E+01    1.9821382321E+01    2.1285664214E+01    2.2649413805E+01    2.3877750487E+01    2.4936565219E+01    2.5793612043E+01    2.6419611510E+01    2.6789330724E+01    2.6882604388E+01    2.6685262047E+01    2.6189928689E+01    2.5396668906E+01    2.4313448887E+01    2.295639 [...]
+    3.1389734304E+00    3.7957531659E+00    4.5520078738E+00    5.4077719891E+00    6.3597181517E+00    7.4008275573E+00    8.5201946546E+00    9.7029809841E+00    1.0930527756E+01    1.2180631097E+01    1.3427978000E+01    1.4644735011E+01    1.5801275928E+01    1.6867029273E+01    1.7811421467E+01    1.8604887405E+01    1.9219916912E+01    1.9632103204E+01    1.9821158369E+01    1.9771860796E+01    1.9474900630E+01    1.8927591627E+01    1.8134421115E+01    1.7107414133E+01    1.586629 [...]
+    1.5703162067E+00    2.0239278204E+00    2.5608498949E+00    3.1823514146E+00    3.8865675676E+00    4.6681910433E+00    5.5182954569E+00    6.4243047679E+00    7.3701173215E+00    8.3363874802E+00    9.3009619204E+00    1.0239461757E+01    1.1125995946E+01    1.1933986080E+01    1.2637077978E+01    1.3210111486E+01    1.3630116853E+01    1.3877304044E+01    1.3936010418E+01    1.3795572490E+01    1.3451088903E+01    1.2904044325E+01    1.2162767615E+01    1.1242702219E+01    1.016647 [...]
+    5.4080782179E-01    8.0652544641E-01    1.1411234618E+00    1.5471726877E+00    2.0243384914E+00    2.5690903378E+00    3.1745407036E+00    3.8304263088E+00    4.5232393686E+00    5.2365109303E+00    5.9512425139E+00    6.6464764472E+00    7.2999896812E+00    7.8890906970E+00    8.3914945621E+00    8.7862474391E+00    9.0546690306E+00    9.1812796822E+00    9.1546782358E+00    8.9683372631E+00    8.6212840229E+00    8.1186383237E+00    7.4719823594E+00    6.6995424071E+00    5.826167 [...]
+    5.0496745747E-02    1.4495206534E-01    2.9557345930E-01    5.0625954077E-01    7.7822875442E-01    1.1097447046E+00    1.4959676185E+00    1.9289439989E+00    2.3977412944E+00    2.8887288150E+00    3.3860003510E+00    3.8719282287E+00    4.3278330625E+00    4.7347484569E+00    5.0742555505E+00    5.3293587550E+00    5.4853714683E+00    5.5307790273E+00    5.4580458036E+00    5.2643341470E+00    4.9521048493E+00    4.5295718813E+00    4.0109882563E+00    3.4167448710E+00    2.773269 [...]
+    7.4572994922E-02    1.5257233673E-02    1.0522238395E-03    3.7172160244E-02    1.2637035742E-01    2.6867814385E-01    4.6126626191E-01    6.9843996044E-01    9.7177377909E-01    1.2703864891E+00    1.5813509806E+00    1.8902282841E+00    2.1817095941E+00    2.4403453323E+00    2.6513361334E+00    2.8013573189E+00    2.8793860888E+00    2.8774994007E+00    2.7916103903E+00    2.6221122382E+00    2.3744005879E+00    2.0592489123E+00    1.6930155060E+00    1.2976659238E+00    9.006005 [...]
+    5.6630740288E-01    3.7112692244E-01    2.1157369714E-01    9.4130870627E-02    2.3031541293E-02    9.2951457972E-06    2.4167285621E-02    9.1976211209E-02    1.9740641303E-01    3.3219386666E-01    4.8623428161E-01    6.4809406029E-01    8.0562171646E-01    9.4663871286E-01    1.0596847329E+00    1.1347893127E+00    1.1642396596E+00    1.1433134638E+00    1.0709456323E+00    9.5029915503E-01    7.8921271762E-01    6.0050115465E-01    4.0208926292E-01    2.1696474484E-01    7.294194 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cylinder_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cylinder_BA.ima
new file mode 100644
index 0000000..a85d20d
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cylinder_BA.ima
@@ -0,0 +1,100 @@
+    1.9794914125E+04    1.9369017701E+04    1.8910588231E+04    1.8421789162E+04    1.7904910074E+04    1.7362352090E+04    1.6796612664E+04    1.6210269858E+04    1.5605966222E+04    1.4986392389E+04    1.4354270522E+04    1.3712337720E+04    1.3063329498E+04    1.2409963484E+04    1.1754923415E+04    1.1100843577E+04    1.0450293772E+04    9.8057649308E+03    9.1696554653E+03    8.5442584436E+03    7.9317496823E+03    7.3341768246E+03    6.7534494726E+03    6.1913304324E+03    5.649428 [...]
+    1.9734295799E+04    1.9309703610E+04    1.8852678007E+04    1.8365375815E+04    1.7850079599E+04    1.7309183129E+04    1.6745176211E+04    1.6160629011E+04    1.5558175984E+04    1.4940499524E+04    1.4310313458E+04    1.3670346500E+04    1.3023325789E+04    1.2371960628E+04    1.1718926537E+04    1.1066849733E+04    1.0418292147E+04    9.7757370842E+03    9.1415756086E+03    8.5180937669E+03    7.9074607124E+03    7.3117178176E+03    6.7327688368E+03    6.1723711780E+03    5.632128 [...]
+    1.9553368014E+04    1.9132668579E+04    1.8679833107E+04    1.8196998648E+04    1.7686426837E+04    1.7150489496E+04    1.6591653600E+04    1.6012465751E+04    1.5415536246E+04    1.4803522884E+04    1.4179114609E+04    1.3545015115E+04    1.2903926535E+04    1.2258533331E+04    1.1611486489E+04    1.0965388149E+04    1.0322776751E+04    9.6861128295E+03    9.0577655279E+03    8.4399999321E+03    7.8349653078E+03    7.2446843113E+03    6.6710432429E+03    6.1157833987E+03    5.580493 [...]
+    1.9254892506E+04    1.8840614923E+04    1.8394691886E+04    1.7919227818E+04    1.7416449830E+04    1.6888693533E+04    1.6338388242E+04    1.5768041679E+04    1.5180224294E+04    1.4577553311E+04    1.3962676622E+04    1.3338256646E+04    1.2706954266E+04    1.2071412961E+04    1.1434243249E+04    1.0798007543E+04    1.0165205534E+04    9.5382601940E+03    8.9195045002E+03    8.3111689611E+03    7.7153700336E+03    7.1340994984E+03    6.5692148621E+03    6.0224308409E+03    5.495311 [...]
+    1.8843406532E+04    1.8437982280E+04    1.8001588900E+04    1.7536285841E+04    1.7044252614E+04    1.6527774911E+04    1.5989230125E+04    1.5431072383E+04    1.4855817196E+04    1.4266025850E+04    1.3664289646E+04    1.3053214097E+04    1.2435403218E+04    1.1813443990E+04    1.1189891136E+04    1.0567252307E+04    9.9479737696E+03    9.3344267121E+03    8.7288942518E+03    8.1335592284E+03    7.5504928678E+03    6.9816443846E+03    6.4288315895E+03    5.8937325552E+03    5.377878 [...]
+    1.8325126195E+04    1.7930853006E+04    1.7506462548E+04    1.7053957616E+04    1.6575457769E+04    1.6073185827E+04    1.5549453786E+04    1.5006648264E+04    1.4447215578E+04    1.3873646559E+04    1.3288461225E+04    1.2694193422E+04    1.2093375532E+04    1.1488523376E+04    1.0882121405E+04    1.0276608291E+04    9.6743630124E+03    9.0776915346E+03    8.4888141752E+03    7.9098537330E+03    7.3428244639E+03    6.7896219692E+03    6.2520140616E+03    5.7316326596E+03    5.229966 [...]
+    1.7707814564E+04    1.7326823147E+04    1.6916729085E+04    1.6479467699E+04    1.6017087141E+04    1.5531735341E+04    1.5025646406E+04    1.4501126547E+04    1.3960539663E+04    1.3406292667E+04    1.2840820680E+04    1.2266572179E+04    1.1685994231E+04    1.1101517900E+04    1.0515543936E+04    9.9304288525E+03    9.3484714831E+03    8.7719001080E+03    8.2028602453E+03    7.6434031808E+03    7.0954753146E+03    6.5609083906E+03    6.0414106699E+03    5.5385590981E+03    5.053792 [...]
+    1.7000617987E+04    1.6634842261E+04    1.6241126247E+04    1.5821327969E+04    1.5377413773E+04    1.4911445798E+04    1.4425568917E+04    1.3921997229E+04    1.3403000214E+04    1.2870888651E+04    1.2328000397E+04    1.1776686135E+04    1.1219295193E+04    1.0658161536E+04    1.0095590028E+04    9.5338430610E+03    8.9751276533E+03    8.4215830888E+03    7.8752691949E+03    7.3381553319E+03    6.8121101640E+03    6.2988922797E+03    5.8001417170E+03    5.3173724446E+03    4.851965 [...]
+    1.6213874721E+04    1.5865026171E+04    1.5489530431E+04    1.5089159533E+04    1.4665788815E+04    1.4221384977E+04    1.3757993622E+04    1.3277726373E+04    1.2782747674E+04    1.2275261355E+04    1.1757497071E+04    1.1231696710E+04    1.0700100869E+04    1.0164935492E+04    9.6283987691E+03    9.0926483881E+03    8.5597892235E+03    8.0318615521E+03    7.5108298729E+03    6.9985724052E+03    6.4968713337E+03    6.0074038629E+03    5.5317341342E+03    5.0713060550E+03    4.627437 [...]
+    1.5358900732E+04    1.5028447373E+04    1.4672752063E+04    1.4293493384E+04    1.3892447774E+04    1.3471478217E+04    1.3032522435E+04    1.2577580693E+04    1.2108703287E+04    1.1627977824E+04    1.1137516374E+04    1.0639442595E+04    1.0135878924E+04    9.6289339147E+03    9.1206898359E+03    8.6131905876E+03    8.1084300438E+03    7.6083408883E+03    7.1147840241E+03    6.6295386257E+03    6.1542928984E+03    5.6906356046E+03    5.2400484070E+03    4.8038990757E+03    4.383435 [...]
+    1.4447758019E+04    1.4136908348E+04    1.3802314277E+04    1.3445554800E+04    1.3068300960E+04    1.2672305210E+04    1.2259390307E+04    1.1831437839E+04    1.1390376458E+04    1.0938169912E+04    1.0476804963E+04    1.0008279273E+04    9.5345893529E+03    9.0577186601E+03    8.5796259229E+03    8.1022337802E+03    7.6274178134E+03    7.1569960451E+03    6.6927189768E+03    6.2362602316E+03    5.7892078615E+03    5.3530563764E+03    4.9291995417E+03    4.5189239885E+03    4.123403 [...]
+    1.3493011230E+04    1.3202703405E+04    1.2890220395E+04    1.2557036837E+04    1.2204713336E+04    1.1834886526E+04    1.1449258697E+04    1.1049587082E+04    1.0637672868E+04    1.0215350019E+04    9.7844739903E+03    9.3469104183E+03    8.9045238661E+03    8.4591667054E+03    8.0126682142E+03    7.5668239674E+03    7.1233855930E+03    6.6840509656E+03    6.2504549023E+03    5.8241604237E+03    5.4066506356E+03    4.9993212851E+03    4.6034740340E+03    4.2203104909E+03    3.850927 [...]
+    1.2507478524E+04    1.2238374916E+04    1.1948715929E+04    1.1639868480E+04    1.1313279176E+04    1.0970465096E+04    1.0613004182E+04    1.0242525302E+04    9.8606980689E+03    9.4692224773E+03    9.0698184445E+03    8.6642153252E+03    8.2541414797E+03    7.8413139684E+03    7.4274284456E+03    7.0141493255E+03    6.6031002868E+03    6.1958551824E+03    5.7939294150E+03    5.3987718365E+03    5.0117572231E+03    4.6341793744E+03    4.2672448786E+03    3.9120675805E+03    3.569663 [...]
+    1.1503982740E+04    1.1256469829E+04    1.0990050859E+04    1.0705983068E+04    1.0405596985E+04    1.0090287957E+04    9.7615073107E+03    9.4207532123E+03    9.0695613025E+03    8.7094951666E+03    8.3421367139E+03    7.9690765346E+03    7.5919043047E+03    7.2121993077E+03    6.8315211398E+03    6.4514006645E+03    6.0733312798E+03    5.6987605569E+03    5.3290823081E+03    4.9656291362E+03    4.6096655133E+03    4.2623814337E+03    3.9248866792E+03    3.5982057307E+03    3.283273 [...]
+    1.0495108773E+04    1.0269302269E+04    1.0026247856E+04    9.7670925039E+03    9.4930500451E+03    9.2053934441E+03    8.9054467330E+03    8.5945766770E+03    8.2741842280E+03    7.9456958319E+03    7.6105546518E+03    7.2702117704E+03    6.9261174376E+03    6.5797124225E+03    6.2324195349E+03    5.8856353729E+03    5.5407223561E+03    5.1990010980E+03    4.8617431695E+03    4.5301643016E+03    4.2054180714E+03    3.8885901116E+03    3.5806928788E+03    3.2826610113E+03    2.995347 [...]
+    9.4929728322E+03    9.2887277571E+03    9.0688818392E+03    8.8344725169E+03    8.5865977061E+03    8.3264088064E+03    8.0551034083E+03    7.7739177538E+03    7.4841190073E+03    7.1869973924E+03    6.8838582537E+03    6.5760140998E+03    6.2647766864E+03    5.9514491949E+03    5.6373185630E+03    5.3236480212E+03    5.0116698865E+03    4.7025786632E+03    4.3975244976E+03    4.0976070301E+03    3.8038696839E+03    3.5172944272E+03    3.2387970414E+03    2.9692229220E+03    2.709343 [...]
+    8.5090088029E+03    8.3259341736E+03    8.1288758896E+03    7.9187638455E+03    7.6965821432E+03    7.4633628232E+03    7.2201793284E+03    6.9681397460E+03    6.7083798799E+03    6.4420562030E+03    6.1703387421E+03    5.8944039457E+03    5.6154275881E+03    5.3345777589E+03    5.0530079889E+03    4.7718505603E+03    4.4922100474E+03    4.2151571331E+03    3.9417227416E+03    3.6728925282E+03    3.4096017597E+03    3.1527306202E+03    2.9030999688E+03    2.6614675762E+03    2.428524 [...]
+    7.5537764002E+03    7.3912540360E+03    7.2163179714E+03    7.0297936985E+03    6.8325548295E+03    6.6255175329E+03    6.4096347299E+03    6.1858900968E+03    5.9552919142E+03    5.7188668113E+03    5.4776534496E+03    5.2326961921E+03    4.9850388037E+03    4.7357182282E+03    4.4857584862E+03    4.2361647364E+03    3.9879175416E+03    3.7419673795E+03    3.4992294342E+03    3.2605787048E+03    3.0268454605E+03    2.7988110730E+03    2.5772042512E+03    2.3626976996E+03    2.155905 [...]
+    6.6367951139E+03    6.4940020175E+03    6.3403022954E+03    6.1764212187E+03    6.0031263359E+03    5.8212225843E+03    5.6315471917E+03    5.4349644063E+03    5.2323600936E+03    5.0246362404E+03    4.8127054048E+03    4.5974851549E+03    4.3798925338E+03    4.1608385928E+03    3.9412230295E+03    3.7219289707E+03    3.5038179347E+03    3.2877250083E+03    3.0744542712E+03    2.8647744977E+03    2.6594151642E+03    2.4590627874E+03    2.2643576157E+03    2.0758906937E+03    1.894201 [...]
+    5.7664071780E+03    5.6423408654E+03    5.5087984110E+03    5.3664099589E+03    5.2158423844E+03    5.0577950468E+03    4.8929953605E+03    4.7221942157E+03    4.5461612849E+03    4.3656802468E+03    4.1815439657E+03    3.9945496592E+03    3.8054940890E+03    3.6151688120E+03    3.4243555215E+03    3.2338215142E+03    3.0443153138E+03    2.8565624806E+03    2.6712616357E+03    2.4890807269E+03    2.3106535595E+03    2.1365766150E+03    1.9674061766E+03    1.8036557778E+03    1.645793 [...]
+    4.9496719571E+03    4.8431780588E+03    4.7285503104E+03    4.6063295937E+03    4.4770883178E+03    4.3414267741E+03    4.1999693340E+03    4.0533605194E+03    3.9022609732E+03    3.7473433613E+03    3.5892882340E+03    3.4287798783E+03    3.2665021911E+03    3.1031346022E+03    2.9393480759E+03    2.7758012204E+03    2.6131365312E+03    2.4519767943E+03    2.2929216739E+03    2.1365445068E+03    1.9833893254E+03    1.8339681262E+03    1.6887584025E+03    1.5482009549E+03    1.412697 [...]
+    4.1922932483E+03    4.1020946754E+03    4.0050069779E+03    3.9014882640E+03    3.7920233434E+03    3.6771206406E+03    3.5573089745E+03    3.4331342307E+03    3.3051559486E+03    3.1739438505E+03    3.0400743368E+03    2.9041269736E+03    2.7666809967E+03    2.6283118593E+03    2.4895878456E+03    2.3510667756E+03    2.2132928233E+03    2.0767934707E+03    1.9420766175E+03    1.8096278663E+03    1.6799080010E+03    1.5533506732E+03    1.4303603127E+03    1.3113102728E+03    1.196541 [...]
+    3.4985800911E+03    3.4233070443E+03    3.3422849514E+03    3.2558961060E+03    3.1645450839E+03    3.0686561664E+03    2.9686706541E+03    2.8650440892E+03    2.7582434082E+03    2.6487440453E+03    2.5370270080E+03    2.4235759456E+03    2.3088742328E+03    2.1934020882E+03    2.0776337487E+03    1.9620347196E+03    1.8470591196E+03    1.7331471392E+03    1.6207226280E+03    1.5101908302E+03    1.4019362793E+03    1.2963208680E+03    1.1936821044E+03    1.0943315639E+03    9.985535 [...]
+    2.8714407772E+03    2.8096608847E+03    2.7431625990E+03    2.6722596763E+03    2.5972841594E+03    2.5185842635E+03    2.4365221713E+03    2.3514717536E+03    2.2638162327E+03    2.1739458053E+03    2.0822552421E+03    1.9891414829E+03    1.8950012423E+03    1.8002286455E+03    1.7052129089E+03    1.6103360839E+03    1.5159708778E+03    1.4224785671E+03    1.3302070189E+03    1.2394888308E+03    1.1506396043E+03    1.0639563599E+03    9.7971610610E+02    8.9817456875E+02    8.195650 [...]
+    2.3124088842E+03    2.2626567794E+03    2.2091049897E+03    2.1520061786E+03    2.0916277345E+03    2.0282500688E+03    1.9621648404E+03    1.8936731202E+03    1.8230835094E+03    1.7507102259E+03    1.6768711712E+03    1.6018859938E+03    1.5260741615E+03    1.4497530572E+03    1.3732361123E+03    1.2968309884E+03    1.2208378236E+03    1.1455475523E+03    1.0712403109E+03    9.9818394114E+02    9.2663259847E+02    8.5682547670E+02    7.8898565498E+02    7.2331907468E+02    6.600136 [...]
+    1.8216993473E+03    1.7825050399E+03    1.7403174602E+03    1.6953356464E+03    1.6477702361E+03    1.5978421252E+03    1.5457810696E+03    1.4918242394E+03    1.4362147367E+03    1.3792000883E+03    1.3210307229E+03    1.2619584460E+03    1.2022349209E+03    1.1421101696E+03    1.0818311014E+03    1.0216400817E+03    9.6177354963E+02    9.0246069517E+02    8.4392220303E+02    7.8636907342E+02    7.3000152620E+02    6.7500799580E+02    6.2156422302E+02    5.6983244897E+02    5.199607 [...]
+    1.3982918577E+03    1.3682073111E+03    1.3358252875E+03    1.3012985563E+03    1.2647887891E+03    1.2264655308E+03    1.1865051262E+03    1.1450896107E+03    1.1024055728E+03    1.0586429968E+03    1.0139940948E+03    9.6865213589E+02    9.2281028056E+02    8.7666042994E+02    8.3039209683E+02    7.8419130714E+02    7.3823953907E+02    6.9271270747E+02    6.4778020012E+02    6.0360397241E+02    5.6033770631E+02    5.1812603886E+02    4.7710386504E+02    4.3739571902E+02    3.991152 [...]
+    1.0400382475E+03    1.0176616449E+03    9.9357627597E+02    9.6789576244E+02    9.4074034653E+02    9.1223612567E+02    8.8251425442E+02    8.5171011943E+02    8.1996249361E+02    7.8741267570E+02    7.5420362150E+02    7.2047907311E+02    6.8638269245E+02    6.5205720525E+02    6.1764356157E+02    5.8328011878E+02    5.4910185268E+02    5.1523960213E+02    4.8181935235E+02    4.4896156157E+02    4.1678053547E+02    3.8538385342E+02    3.5487184985E+02    3.2533715404E+02    2.968642 [...]
+    7.4379000571E+02    7.2778727290E+02    7.1056257657E+02    6.9219716770E+02    6.7277703107E+02    6.5239233814E+02    6.3113687643E+02    6.0910745963E+02    5.8640332291E+02    5.6312550770E+02    5.3937624056E+02    5.1525831066E+02    4.9087445019E+02    4.6632672237E+02    4.4171592119E+02    4.1714098726E+02    3.9269844374E+02    3.6848185616E+02    3.4458131999E+02    3.2108297909E+02    2.9806857839E+02    2.7561505352E+02    2.5379415994E+02    2.3267214372E+02    2.123094 [...]
+    5.0554168930E+02    4.9466493209E+02    4.8295769123E+02    4.7047518594E+02    4.5727585214E+02    4.4342097070E+02    4.2897427973E+02    4.1400157383E+02    3.9857029318E+02    3.8274910560E+02    3.6660748447E+02    3.5021528582E+02    3.3364232727E+02    3.1695797228E+02    3.0023072224E+02    2.8352781952E+02    2.6691486421E+02    2.5045544703E+02    2.3421080107E+02    2.1823947456E+02    2.0259702683E+02    1.8733574941E+02    1.7250441389E+02    1.5814804817E+02    1.443077 [...]
+    3.2058573935E+02    3.1368834982E+02    3.0626437239E+02    2.9834881885E+02    2.8997874014E+02    2.8119299069E+02    2.7203198271E+02    2.6253743218E+02    2.5275209842E+02    2.4271951917E+02    2.3248374310E+02    2.2208906170E+02    2.1157974246E+02    2.0099976530E+02    1.9039256400E+02    1.7980077460E+02    1.6926599238E+02    1.5882853924E+02    1.4852724278E+02    1.3839922893E+02    1.2847972909E+02    1.1880190328E+02    1.0939668026E+02    1.0029261557E+02    9.151576 [...]
+    1.8367410201E+02    1.7972238739E+02    1.7546902350E+02    1.7093406530E+02    1.6613873540E+02    1.6110528919E+02    1.5585687414E+02    1.5041738440E+02    1.4481131169E+02    1.3906359369E+02    1.3319946084E+02    1.2724428288E+02    1.2122341610E+02    1.1516205242E+02    1.0908507131E+02    1.0301689578E+02    9.6981353203E+01    9.1001542030E+01    8.5099705362E+01    7.9297112088E+01    7.3613946451E+01    6.8069206703E+01    6.2680613488E+01    5.7464528479E+01    5.243588 [...]
+    8.9182077558E+01    8.7263363821E+01    8.5198228143E+01    8.2996404346E+01    8.0668192675E+01    7.8224394388E+01    7.5676243544E+01    7.3035336495E+01    7.0313559601E+01    6.7523015690E+01    6.4675949807E+01    6.1784674782E+01    5.8861497152E+01    5.5918643969E+01    5.2968191005E+01    5.0021992863E+01    4.7091615474E+01    4.4188271443E+01    4.1322758678E+01    3.8505402711E+01    3.5746003089E+01    3.3053784159E+01    3.0437350574E+01    2.7904647762E+01    2.546292 [...]
+    3.1269977014E+01    3.0597234375E+01    2.9873184701E+01    2.9101238041E+01    2.8285002630E+01    2.7428262032E+01    2.6534951288E+01    2.5609132279E+01    2.4654968453E+01    2.3676699122E+01    2.2678613507E+01    2.1665024710E+01    2.0640243823E+01    1.9608554321E+01    1.8574186959E+01    1.7541295315E+01    1.6513932172E+01    1.5496026885E+01    1.4491363889E+01    1.3503562494E+01    1.2536058097E+01    1.1592084926E+01    1.0674660424E+01    9.7865713660E+00    8.930361 [...]
+    4.0384434688E+00    3.9515699941E+00    3.8580886687E+00    3.7584382632E+00    3.6530829131E+00    3.5425092046E+00    3.4272231355E+00    3.3077469761E+00    3.1846160489E+00    3.0583754540E+00    2.9295767601E+00    2.7987746863E+00    2.6665237976E+00    2.5333752367E+00    2.3998735155E+00    2.2665533872E+00    2.1339368222E+00    2.0025301050E+00    1.8728210758E+00    1.7452765303E+00    1.6203397981E+00    1.4984285131E+00    1.3799325902E+00    1.2652124208E+00    1.154597 [...]
+    1.6736818814E+00    1.6376624425E+00    1.5988743840E+00    1.5575022234E+00    1.5137413699E+00    1.4677968533E+00    1.4198819975E+00    1.3702170484E+00    1.3190277675E+00    1.2665440014E+00    1.2129982389E+00    1.1586241657E+00    1.1036552286E+00    1.0483232190E+00    9.9285688658E-01    9.3748059364E-01    8.8241301886E-01    8.2786592040E-01    7.7404296650E-01    7.2113864162E-01    6.6933723526E-01    6.1881191981E-01    5.6972392309E-01    5.2222180032E-01    4.764408 [...]
+    1.8579321202E+01    1.8179549339E+01    1.7749186263E+01    1.7290267576E+01    1.6804947982E+01    1.6295487479E+01    1.5764236956E+01    1.5213623293E+01    1.4646134097E+01    1.4064302166E+01    1.3470689812E+01    1.2867873156E+01    1.2258426493E+01    1.1644906874E+01    1.1029838977E+01    1.0415700408E+01    9.8049075119E+00    9.1998018058E+00    8.6026371173E+00    8.0155675213E+00    7.4406361496E+00    6.8797649450E+00    6.3347454232E+00    5.8072304956E+00    5.298727 [...]
+    4.9492187403E+01    4.8427296279E+01    4.7280979740E+01    4.6058654559E+01    4.4766053973E+01    4.3409191030E+01    4.1994320358E+01    4.0527898640E+01    3.9016544090E+01    3.7466995238E+01    3.5886069317E+01    3.4280620567E+01    3.2657498749E+01    3.1023508182E+01    2.9385367585E+01    2.7749671010E+01    2.6122850145E+01    2.4511138241E+01    2.2920535915E+01    2.1356779042E+01    1.9825308970E+01    1.8331245214E+01    1.6879360833E+01    1.5474060600E+01    1.411936 [...]
+    8.9579875707E+01    8.7652469762E+01    8.5577734537E+01    8.3365469923E+01    8.1026047996E+01    7.8570346775E+01    7.6009681124E+01    7.3355731336E+01    7.0620469903E+01    6.7816087026E+01    6.4954915421E+01    6.2049354957E+01    5.9111797682E+01    5.6154553775E+01    5.3189778949E+01    5.0229403831E+01    4.7285065793E+01    4.4368043719E+01    4.1489196148E+01    3.8658903191E+01    3.5887012629E+01    3.3182790494E+01    3.0554876475E+01    2.8011244382E+01    2.555916 [...]
+    1.3451865383E+02    1.3162436433E+02    1.2850887767E+02    1.2518690631E+02    1.2167402139E+02    1.1798655339E+02    1.1414148845E+02    1.1015636119E+02    1.0604914490E+02    1.0183813973E+02    9.7541859895E+01    9.3178920590E+01    8.8767925505E+01    8.4327355708E+01    7.9875460712E+01    7.5430152484E+01    7.1008903145E+01    6.6628647059E+01    6.2305687974E+01    5.8055611837E+01    5.3893205844E+01    4.9832384247E+01    4.5886121361E+01    4.2066392178E+01    3.838412 [...]
+    1.8055088407E+02    1.7666618916E+02    1.7248464028E+02    1.6802598121E+02    1.6331110785E+02    1.5836193488E+02    1.5320125672E+02    1.4785260376E+02    1.4234009501E+02    1.3668828817E+02    1.3092202831E+02    1.2506629614E+02    1.1914605715E+02    1.1318611251E+02    1.0721095296E+02    1.0124461655E+02    9.5310551474E+01    8.9431484613E+01    8.3629296975E+01    7.7924906681E+01    7.2338160331E+01    6.6887733417E+01    6.1591040397E+01    5.6464154963E+01    5.152174 [...]
+    2.2452179954E+02    2.1969105317E+02    2.1449119103E+02    2.0894676235E+02    2.0308374862E+02    1.9692939789E+02    1.9051205194E+02    1.8386096756E+02    1.7700613340E+02    1.6997808361E+02    1.6280770968E+02    1.5552607196E+02    1.4816421198E+02    1.4075296724E+02    1.3332278945E+02    1.2590356783E+02    1.1852445840E+02    1.1121372073E+02    1.0399856292E+02    9.6904996218E+01    8.9957699877E+01    8.3179897340E+01    7.6593244398E+01    7.0217730020E+01    6.407159 [...]
+    2.6389608934E+02    2.5821819322E+02    2.5210648037E+02    2.4558980248E+02    2.3869869436E+02    2.3146517918E+02    2.2392256539E+02    2.1610523675E+02    2.0804843711E+02    1.9978805144E+02    1.9136038480E+02    1.8280194074E+02    1.7414920093E+02    1.6543840739E+02    1.5670534901E+02    1.4798515384E+02    1.3931208856E+02    1.3071936653E+02    1.2223896574E+02    1.1390145782E+02    1.0573584932E+02    9.7769436092E+01    9.0027671890E+01    8.2534051760E+01    7.531001 [...]
+    2.9675531981E+02    2.9037045103E+02    2.8349777713E+02    2.7616973981E+02    2.6842067308E+02    2.6028658440E+02    2.5180492628E+02    2.4301436032E+02    2.3395451516E+02    2.2466574039E+02    2.1518885798E+02    2.0556491325E+02    1.9583492701E+02    1.8603965082E+02    1.7621932692E+02    1.6641345473E+02    1.5666056538E+02    1.4699800589E+02    1.3746173447E+02    1.2808612829E+02    1.1890380495E+02    1.0994545879E+02    1.0123971308E+02    9.2812988900E+01    8.468939 [...]
+    3.2177772989E+02    3.1485450316E+02    3.0740236659E+02    2.9945649503E+02    2.9105411489E+02    2.8223426681E+02    2.7303755820E+02    2.6350590730E+02    2.5368228088E+02    2.4361042737E+02    2.3333460748E+02    2.2289932414E+02    2.1234905390E+02    2.0172798146E+02    1.9107973955E+02    1.8044715569E+02    1.6987200778E+02    1.5939479011E+02    1.4905449140E+02    1.3888838642E+02    1.2893184237E+02    1.1921814144E+02    1.0977832046E+02    1.0064102880E+02    9.183240 [...]
+    3.3820237270E+02    3.3092577415E+02    3.2309329411E+02    3.1474190061E+02    3.0591071772E+02    2.9664077609E+02    2.8697475291E+02    2.7695670296E+02    2.6663178300E+02    2.5604597132E+02    2.4524578463E+02    2.3427799433E+02    2.2318934417E+02    2.1202627138E+02    2.0083463323E+02    1.8965944094E+02    1.7854460280E+02    1.6753267832E+02    1.5666464490E+02    1.4597967888E+02    1.3551495202E+02    1.2530544497E+02    1.1538377886E+02    1.0578006576E+02    9.652177 [...]
+    3.4577992468E+02    3.3834030412E+02    3.3033237194E+02    3.2179392234E+02    3.1276495356E+02    3.0328741296E+02    2.9340493108E+02    2.8316254685E+02    2.7260642573E+02    2.6178357311E+02    2.5074154490E+02    2.3952815743E+02    2.2819119890E+02    2.1677814428E+02    2.0533587579E+02    1.9391041086E+02    1.8254663957E+02    1.7128807327E+02    1.6017660611E+02    1.4925229112E+02    1.3855313219E+02    1.2811489337E+02    1.1797092665E+02    1.0815201907E+02    9.868626 [...]
+    3.4471273927E+02    3.3729609216E+02    3.2931291107E+02    3.2080087155E+02    3.1179984608E+02    3.0235165005E+02    2.9249977666E+02    2.8228912302E+02    2.7176570921E+02    2.6097639263E+02    2.4996857948E+02    2.3878993568E+02    2.2748809920E+02    2.1611039589E+02    2.0470356085E+02    1.9331346732E+02    1.8198486489E+02    1.7076112897E+02    1.5968402306E+02    1.4879347551E+02    1.3812737222E+02    1.2772136648E+02    1.1760870724E+02    1.0782008683E+02    9.838350 [...]
+    3.3558688156E+02    3.2836659331E+02    3.2059479224E+02    3.1230815451E+02    3.0354549484E+02    2.9434751918E+02    2.8475656673E+02    2.7481634330E+02    2.6457164788E+02    2.5406809455E+02    2.4335183170E+02    2.3246926063E+02    2.2146675550E+02    2.1039038675E+02    1.9928564993E+02    1.8819720170E+02    1.7716860510E+02    1.6624208562E+02    1.5545829977E+02    1.4485611785E+02    1.3447242203E+02    1.2434192132E+02    1.1449698436E+02    1.0496749112E+02    9.578070 [...]
+    3.1929894279E+02    3.1242910777E+02    3.0503455006E+02    2.9715016383E+02    2.8881287778E+02    2.8006141987E+02    2.7093607184E+02    2.6147841562E+02    2.5173107319E+02    2.4173744201E+02    2.3154142795E+02    2.2118717755E+02    2.1071881161E+02    2.0018016213E+02    1.8961451423E+02    1.7906435510E+02    1.6857113160E+02    1.5817501819E+02    1.4791469681E+02    1.3782715013E+02    1.2794746951E+02    1.1830867891E+02    1.0894157581E+02    9.9874590093E+01    9.113366 [...]
+    2.9698040272E+02    2.9059077058E+02    2.8371311446E+02    2.7637988767E+02    2.6862543562E+02    2.6048577698E+02    2.5199837549E+02    2.4320190407E+02    2.3413600290E+02    2.2484103343E+02    2.1535782999E+02    2.0572745079E+02    1.9599093021E+02    1.8618903412E+02    1.7636201990E+02    1.6654940298E+02    1.5678973136E+02    1.4712036984E+02    1.3757729529E+02    1.2819490434E+02    1.1900583478E+02    1.1004080182E+02    1.0132845009E+02    9.2895222420E+01    8.476524 [...]
+    2.6992218840E+02    2.6411473358E+02    2.5786373983E+02    2.5119870184E+02    2.4415083381E+02    2.3675287056E+02    2.2903886019E+02    2.2104394965E+02    2.1280416502E+02    2.0435618787E+02    1.9573712956E+02    1.8698430501E+02    1.7813500754E+02    1.6922628656E+02    1.6029472945E+02    1.5137624944E+02    1.4250588066E+02    1.3371758208E+02    1.2504405143E+02    1.1651655045E+02    1.0816474257E+02    1.0001654404E+02    9.2097989495E+01    8.4433112626E+01    7.704384 [...]
+    2.3950187996E+02    2.3434893743E+02    2.2880246284E+02    2.2288862515E+02    2.1663511880E+02    2.1007098733E+02    2.0322643940E+02    1.9613265859E+02    1.8882160845E+02    1.8132583412E+02    1.7367826211E+02    1.6591199958E+02    1.5806013461E+02    1.5015553896E+02    1.4223067459E+02    1.3431740544E+02    1.2644681564E+02    1.1864903553E+02    1.1095307660E+02    1.0338667640E+02    9.5976154604E+01    8.8746280851E+01    8.1720155486E+01    7.4919103680E+01    6.836258 [...]
+    2.0711574721E+02    2.0265961045E+02    1.9786317532E+02    1.9274907051E+02    1.8734124374E+02    1.8166480920E+02    1.7574588855E+02    1.6961144643E+02    1.6328912188E+02    1.5680705691E+02    1.5019372331E+02    1.4347774912E+02    1.3668774599E+02    1.2985213858E+02    1.2299899732E+02    1.1615587562E+02    1.0934965272E+02    1.0260638328E+02    9.5951154594E+01    8.9407952542E+01    8.2999537073E+01    7.6747327983E+01    7.0671301736E+01    6.4789899915E+01    5.911994 [...]
+    1.7411747874E+02    1.7037131598E+02    1.6633909050E+02    1.6203982420E+02    1.5749364762E+02    1.5272167181E+02    1.4774585462E+02    1.4258886248E+02    1.3727392875E+02    1.3182470955E+02    1.2626513827E+02    1.2061927969E+02    1.1491118488E+02    1.0916474781E+02    1.0340356479E+02    9.7650797619E+01    9.1929041553E+01    8.6260198796E+01    8.0665358541E+01    7.5164684277E+01    6.9777309104E+01    6.4521239730E+01    5.9413269724E+01    5.4468902557E+01    4.970228 [...]
+    1.4176510110E+02    1.3871501362E+02    1.3543203363E+02    1.3193164711E+02    1.2823024254E+02    1.2434500658E+02    1.2029381519E+02    1.1609512122E+02    1.1176783899E+02    1.0733122705E+02    1.0280476967E+02    9.8208058150E+01    9.3560672697E+01    8.8882065697E+01    8.4191447301E+01    7.9507674048E+01    7.4849141345E+01    7.0233680521E+01    6.5678461158E+01    6.1199899349E+01    5.6813572474E+01    5.2534141039E+01    4.8375278054E+01    4.4349606363E+01    4.046864 [...]
+    1.1117719493E+02    1.0878521744E+02    1.0621061403E+02    1.0346552798E+02    1.0056281014E+02    9.7515937173E+01    9.4338926235E+01    9.1046246771E+01    8.7652730107E+01    8.4173477478E+01    8.0623767155E+01    7.7018961381E+01    7.3374413748E+01    6.9705377706E+01    6.6026916848E+01    6.2353817589E+01    5.8700504866E+01    5.5080961421E+01    5.1508651221E+01    4.7996447524E+01    4.4556566047E+01    4.1200503677E+01    3.7938983090E+01    3.4781903596E+01    3.173829 [...]
+    8.3299111787E+01    8.1506939514E+01    7.9577951106E+01    7.7521243535E+01    7.5346443787E+01    7.3063647594E+01    7.0683355537E+01    6.8216406999E+01    6.5673912450E+01    6.3067184559E+01    6.0407668650E+01    5.7706872987E+01    5.4976299416E+01    5.2227374834E+01    4.9471383994E+01    4.6719404107E+01    4.3982241692E+01    4.1270372123E+01    3.8593882260E+01    3.5962416566E+01    3.3385127043E+01    3.0870627314E+01    2.8426951127E+01    2.6061515532E+01    2.378108 [...]
+    5.8879494760E+01    5.7612715851E+01    5.6249243878E+01    5.4795507753E+01    5.3258310876E+01    5.1644787854E+01    4.9962359359E+01    4.8218685471E+01    4.6421617833E+01    4.4579150992E+01    4.2699373264E+01    4.0790417485E+01    3.8860412007E+01    3.6917432282E+01    3.4969453392E+01    3.3024303834E+01    3.1089620909E+01    2.9172808004E+01    2.7280994052E+01    2.5420995457E+01    2.3599280716E+01    2.1821937959E+01    2.0094645631E+01    1.8422646450E+01    1.681072 [...]
+    3.8457021955E+01    3.7629634976E+01    3.6739106605E+01    3.5789634737E+01    3.4785661731E+01    3.3731846154E+01    3.2633033327E+01    3.1494224871E+01    3.0320547479E+01    2.9117221163E+01    2.7889527183E+01    2.6642775903E+01    2.5382274809E+01    2.4113296908E+01    2.2841049741E+01    2.1570645218E+01    2.0307070499E+01    1.9055160100E+01    1.7819569437E+01    1.6604749956E+01    1.5414926040E+01    1.4254073810E+01    1.3125901974E+01    1.2033834822E+01    1.098099 [...]
+    2.2356935858E+01    2.1875941990E+01    2.1358253136E+01    2.0806308712E+01    2.0222690130E+01    1.9610104393E+01    1.8971366990E+01    1.8309384208E+01    1.7627135011E+01    1.6927652590E+01    1.6214005747E+01    1.5489280230E+01    1.4756560155E+01    1.4018909663E+01    1.3279354914E+01    1.2540866577E+01    1.1806342910E+01    1.1078593561E+01    1.0360324194E+01    9.6541220438E+00    8.9624424950E+00    8.2875967620E+00    7.6317407564E+00    6.9968651998E+00    6.384787 [...]
+    1.0696605589E+01    1.0466481127E+01    1.0218810613E+01    9.9547602911E+00    9.6755642357E+00    9.3825165217E+00    9.0769630556E+00    8.7602931340E+00    8.4339307881E+00    8.0993259797E+00    7.7579457102E+00    7.4112651095E+00    7.0607585673E+00    6.7078909700E+00    6.3541091063E+00    6.0008332999E+00    5.6494493295E+00    5.3013006887E+00    4.9576812405E+00    4.6198283130E+00    4.2889162825E+00    3.9660506838E+00    3.6522628838E+00    3.3485053502E+00    3.055647 [...]
+    3.3991009564E+00    3.3259777404E+00    3.2472870502E+00    3.1633987977E+00    3.0747043676E+00    2.9816141412E+00    2.8845549147E+00    2.7839672306E+00    2.6803026420E+00    2.5740209295E+00    2.4655872904E+00    2.3554695215E+00    2.2441352146E+00    2.1320489851E+00    2.0196697532E+00    1.9074480963E+00    1.7958236912E+00    1.6852228637E+00    1.5760562610E+00    1.4687166641E+00    1.3635769522E+00    1.2609882340E+00    1.1612781557E+00    1.0647493964E+00    9.716783 [...]
+    2.1354416035E-01    2.0895211422E-01    2.0401377558E-01    1.9875209143E-01    1.9319132288E-01    1.8735689507E-01    1.8127524070E-01    1.7497363834E-01    1.6848004671E-01    1.6182293609E-01    1.5503111785E-01    1.4813357360E-01    1.4115928481E-01    1.3413706431E-01    1.2709539068E-01    1.2006224670E-01    1.1306496288E-01    1.0613006726E-01    9.9283142268E-02    9.2548689676E-02    8.5950004519E-02    7.9509058724E-02    7.3246395179E-02    6.7181032875E-02    6.133038 [...]
+    7.4085110763E-01    7.2490693111E-01    7.0773672092E-01    6.8942215935E-01    6.7004973526E-01    6.4971018477E-01    6.2849790773E-01    6.0651036422E-01    5.8384745597E-01    5.6061089710E-01    5.3690357908E-01    5.1282893457E-01    4.8849030487E-01    4.6399031561E-01    4.3943026528E-01    4.1490953089E-01    3.9052499509E-01    3.6637049863E-01    3.4253632211E-01    3.1910870025E-01    2.9616937213E-01    2.7379517005E-01    2.5205764968E-01    2.3102276359E-01    2.107505 [...]
+    4.4633816047E+00    4.3673395159E+00    4.2639419649E+00    4.1536784527E+00    4.0370671262E+00    3.9146514571E+00    3.7869967778E+00    3.6546866995E+00    3.5183194403E+00    3.3785040903E+00    3.2358568411E+00    3.0909972072E+00    2.9445442684E+00    2.7971129580E+00    2.6493104256E+00    2.5017324992E+00    2.3549602712E+00    2.2095568337E+00    2.0660641822E+00    1.9250003117E+00    1.7868565220E+00    1.6520949500E+00    1.5211463438E+00    1.3944080929E+00    1.272242 [...]
+    1.0776985776E+01    1.0545098753E+01    1.0295470464E+01    1.0029281251E+01    9.7477804288E+00    9.4522783050E+00    9.1441378400E+00    8.8247660341E+00    8.4956050943E+00    8.1581234492E+00    7.8138066793E+00    7.4641484265E+00    7.1106413522E+00    6.7547682057E+00    6.3979930701E+00    6.0417528456E+00    5.6874490302E+00    5.3364398546E+00    4.9900328253E+00    4.6494777246E+00    4.3159601135E+00    3.9905953792E+00    3.6744233629E+00    3.3684035999E+00    3.073411 [...]
+    1.9023960377E+01    1.8614632322E+01    1.8174002040E+01    1.7704151823E+01    1.7207285570E+01    1.6685714707E+01    1.6141843507E+01    1.5578153904E+01    1.4997189927E+01    1.4401541872E+01    1.3793830313E+01    1.3176690089E+01    1.2552754362E+01    1.1924638878E+01    1.1294926538E+01    1.0666152386E+01    1.0040789113E+01    9.4212331977E+00    8.8097917496E+00    8.2086701674E+00    7.6199606762E+00    7.0456318249E+00    6.4875190039E+00    5.9473160417E+00    5.426567 [...]
+    2.8525508657E+01    2.7911748171E+01    2.7251065105E+01    2.6546580608E+01    2.5801598043E+01    2.5019581889E+01    2.4204135748E+01    2.3358979603E+01    2.2487926504E+01    2.1594858851E+01    2.0683704450E+01    1.9758412521E+01    1.8822929823E+01    1.7881177070E+01    1.6937025822E+01    1.5994275984E+01    1.5056634101E+01    1.4127692576E+01    1.3210909968E+01    1.2309592484E+01    1.1426876805E+01    1.0565714338E+01    9.7288570040E+00    8.9188446301E+00    8.137994 [...]
+    3.8612424813E+01    3.7781638781E+01    3.6887350304E+01    3.5933783157E+01    3.4925407634E+01    3.3866912016E+01    3.2763172815E+01    3.1619224015E+01    3.0440225535E+01    2.9231431149E+01    2.7998156094E+01    2.6745744620E+01    2.5479537687E+01    2.4204841073E+01    2.2926894098E+01    2.1650839194E+01    2.0381692533E+01    1.9124315918E+01    1.7883390113E+01    1.6663389812E+01    1.5468560389E+01    1.4302896590E+01    1.3170123294E+01    1.2073678449E+01    1.101669 [...]
+    4.8652891160E+01    4.7606080268E+01    4.6479265878E+01    4.5277769105E+01    4.4007221571E+01    4.2673529472E+01    4.1282836101E+01    3.9841483114E+01    3.8355970807E+01    3.6832917719E+01    3.5279019841E+01    3.3701009738E+01    3.2105615878E+01    3.0499522455E+01    2.8889330001E+01    2.7281517065E+01    2.5682403210E+01    2.4098113606E+01    2.2534545444E+01    2.0997336396E+01    1.9491835329E+01    1.8023075461E+01    1.6595750114E+01    1.5214191219E+01    1.388235 [...]
+    5.8076474186E+01    5.6826912159E+01    5.5481861720E+01    5.4047673716E+01    5.2531069524E+01    5.0939098192E+01    4.9279091711E+01    4.7558618800E+01    4.5785437511E+01    4.3967447022E+01    4.2112638970E+01    4.0229048669E+01    3.8324706580E+01    3.6407590376E+01    3.4485577937E+01    3.2566401616E+01    3.0657604092E+01    2.8766496112E+01    2.6900116408E+01    2.5065194059E+01    2.3268113536E+01    2.1514882662E+01    1.9811103672E+01    1.8161947551E+01    1.657213 [...]
+    6.6393625265E+01    6.4965118541E+01    6.3427458943E+01    6.1787905943E+01    6.0054142512E+01    5.8234226123E+01    5.6336537648E+01    5.4369728531E+01    5.2342666631E+01    5.0264381128E+01    4.8144006901E+01    4.5990728785E+01    4.3813726105E+01    4.1622117886E+01    3.9424909143E+01    3.7230938607E+01    3.5048828267E+01    3.2886935070E+01    3.0753305114E+01    2.8655630619E+01    2.6601209976E+01    2.4596911121E+01    2.2649138452E+01    2.0763803491E+01    1.894629 [...]
+    7.3210223270E+01    7.1635057800E+01    6.9939542834E+01    6.8131682330E+01    6.6219947124E+01    6.4213220921E+01    6.2120743962E+01    5.9952054786E+01    5.7716930537E+01    5.5425326223E+01    5.3087313408E+01    5.0713018758E+01    4.8312562898E+01    4.5896000017E+01    4.3473258653E+01    4.1054084065E+01    3.8647982612E+01    3.6264168504E+01    3.3911513293E+01    3.1598498443E+01    2.9333171279E+01    2.7123104601E+01    2.4975360210E+01    2.2896456554E+01    2.089234 [...]
+    7.8236930059E+01    7.6553616823E+01    7.4741700439E+01    7.2809733615E+01    7.0766767900E+01    6.8622295978E+01    6.6386191483E+01    6.4068646784E+01    6.1680109201E+01    5.9231216120E+01    5.6732729482E+01    5.4195470136E+01    5.1630252507E+01    4.9047820073E+01    4.6458782094E+01    4.3873552047E+01    4.1302288193E+01    3.8754836681E+01    3.6240677585E+01    3.3768874219E+01    3.1348026067E+01    2.8986225633E+01    2.6691019456E+01    2.4469373539E+01    2.232764 [...]
+    8.1293356665E+01    7.9544287561E+01    7.7661600662E+01    7.5654182011E+01    7.3531435891E+01    7.1303224874E+01    6.8979807302E+01    6.6571772658E+01    6.4089975303E+01    6.1545467074E+01    5.8949429235E+01    5.6313104270E+01    5.3647728025E+01    5.0964462673E+01    4.8274330987E+01    4.5588152382E+01    4.2916481171E+01    4.0269547459E+01    3.7657201075E+01    3.5088858918E+01    3.2573456053E+01    3.0119400874E+01    2.7734534604E+01    2.5426095367E+01    2.320068 [...]
+    8.2307249622E+01    8.0536370880E+01    7.8630216995E+01    7.6597784076E+01    7.4448592844E+01    7.2192627949E+01    6.9840274688E+01    6.7402253584E+01    6.4889553308E+01    6.2313362459E+01    5.9685000676E+01    5.7015849600E+01    5.4317284181E+01    5.1600604823E+01    4.8876970851E+01    4.6157335765E+01    4.3452384742E+01    4.0772474795E+01    3.8127578021E+01    3.5527228292E+01    3.2980471749E+01    3.0495821408E+01    2.8081216153E+01    2.5743984366E+01    2.349081 [...]
+    8.1309095968E+01    7.9559697639E+01    7.7676673574E+01    7.5668910039E+01    7.3545811468E+01    7.1317240524E+01    6.8993455599E+01    6.6585046201E+01    6.4102866705E+01    6.1557968977E+01    5.8961534331E+01    5.6324805350E+01    5.3659018037E+01    5.0975334797E+01    4.8284778722E+01    4.5598169647E+01    4.2926062413E+01    4.0278687770E+01    3.7665896314E+01    3.5097105834E+01    3.2581252411E+01    3.0126745576E+01    2.7741427805E+01    2.5432538586E+01    2.320668 [...]
+    7.8422705939E+01    7.6735414025E+01    7.4919248629E+01    7.2982779842E+01    7.0935077443E+01    6.8785653102E+01    6.6544400114E+01    6.4221531091E+01    6.1827514084E+01    5.9373007606E+01    5.6868795027E+01    5.4325718825E+01    5.1754615160E+01    4.9166249251E+01    4.6571252003E+01    4.3980058347E+01    4.1402847703E+01    3.8849486991E+01    3.6329476567E+01    3.3851899444E+01    3.1425374130E+01    2.9058011385E+01    2.6757375153E+01    2.4530447902E+01    2.238360 [...]
+    7.3852459772E+01    7.2263502743E+01    7.0553191062E+01    6.8729594676E+01    6.6801254017E+01    6.4777125589E+01    6.2666525224E+01    6.0479069420E+01    5.8224615200E+01    5.5913198937E+01    5.3554974586E+01    5.1160151776E+01    4.8738934220E+01    4.6301458859E+01    4.3857736206E+01    4.1417592284E+01    3.8990612568E+01    3.6586088331E+01    3.4212965733E+01    3.1879798010E+01    2.9594701067E+01    2.7365312752E+01    2.5198756071E+01    2.3101606551E+01    2.107986 [...]
+    6.7867996243E+01    6.6407801004E+01    6.4836093048E+01    6.3160287706E+01    6.1388232591E+01    5.9528157606E+01    5.7588622810E+01    5.5578464525E+01    5.3506740079E+01    5.1382671605E+01    4.9215589287E+01    4.7014874491E+01    4.4789903168E+01    4.2549989953E+01    4.0304333345E+01    3.8061962368E+01    3.5831685062E+01    3.3622039184E+01    3.1441245433E+01    2.9297163519E+01    2.7197251357E+01    2.5148527645E+01    2.3157538061E+01    2.1230325270E+01    1.937240 [...]
+    6.0787174233E+01    5.9479328683E+01    5.8071612803E+01    5.6570667600E+01    5.4983521184E+01    5.3317544007E+01    5.1580402177E+01    4.9780009202E+01    4.7924476514E+01    4.6022063139E+01    4.4081124885E+01    4.2110063413E+01    4.0117275561E+01    3.8111103288E+01    3.6099784581E+01    3.4091405696E+01    3.2093855030E+01    3.0114778976E+01    2.8161540032E+01    2.6241177463E+01    2.4360370753E+01    2.2525406093E+01    2.0742146107E+01    1.9016002984E+01    1.735191 [...]
+    5.2958154796E+01    5.1818755903E+01    5.0592357144E+01    4.9284743559E+01    4.7902037360E+01    4.6450658947E+01    4.4937286246E+01    4.3368812682E+01    4.1752304085E+01    4.0094954861E+01    3.8404043730E+01    3.6686889373E+01    3.4950806296E+01    3.3203061229E+01    3.1450830372E+01    2.9701157792E+01    2.7960915249E+01    2.6236763742E+01    2.4535117023E+01    2.2862107330E+01    2.1223553549E+01    1.9624932023E+01    1.8071350177E+01    1.6567523112E+01    1.511775 [...]
+    4.4741431585E+01    4.3778820087E+01    4.2742714701E+01    4.1638002263E+01    4.0469854401E+01    3.9243694599E+01    3.7965163865E+01    3.6640085233E+01    3.5274427368E+01    3.3874267548E+01    3.2445754285E+01    3.0995069864E+01    2.9528393067E+01    2.8051862348E+01    2.6571539725E+01    2.5093375639E+01    2.3623175023E+01    2.2166564825E+01    2.0728963185E+01    1.9315550493E+01    1.7931242495E+01    1.6580665634E+01    1.5268134767E+01    1.3997633392E+01    1.277279 [...]
+    3.6492584962E+01    3.5707451121E+01    3.4862380476E+01    3.3961358291E+01    3.3008602046E+01    3.2008534586E+01    3.0965756130E+01    2.9885015325E+01    2.8771179577E+01    2.7629204870E+01    2.6464105287E+01    2.5280922470E+01    2.4084695227E+01    2.2880429509E+01    2.1673068965E+01    2.0467466294E+01    1.9268355577E+01    1.8080325791E+01    1.6907795686E+01    1.5754990169E+01    1.4625918385E+01    1.3524353603E+01    1.2453815039E+01    1.1417551736E+01    1.041852 [...]
+    2.8546453817E+01    2.7932283725E+01    2.7271234776E+01    2.6566423886E+01    2.5821149550E+01    2.5038870861E+01    2.4223185614E+01    2.3377807681E+01    2.2506543810E+01    2.1613270028E+01    2.0701907810E+01    1.9776400202E+01    1.8840688054E+01    1.7898686546E+01    1.6954262166E+01    1.6011210306E+01    1.5073233630E+01    1.4143921360E+01    1.3226729629E+01    1.2324963017E+01    1.1441757404E+01    1.0580064239E+01    9.7426363250E+00    8.9320152047E+00    8.150520 [...]
+    2.1203314050E+01    2.0747133298E+01    2.0256139142E+01    1.9732646168E+01    1.9179103778E+01    1.8598080604E+01    1.7992248260E+01    1.7364364544E+01    1.6717256219E+01    1.6053801493E+01    1.5376912335E+01    1.4689516745E+01    1.3994541112E+01    1.3294892790E+01    1.2593443008E+01    1.1893010234E+01    1.1196344120E+01    1.0506110118E+01    9.8248748985E+00    9.1550926361E+00    8.4990922790E+00    7.8590658671E+00    7.2370579750E+00    6.6349563423E+00    6.054483 [...]
+    1.4717529524E+01    1.4400891062E+01    1.4060094299E+01    1.3696745311E+01    1.3312543689E+01    1.2909271738E+01    1.2488783201E+01    1.2052991613E+01    1.1603858360E+01    1.1143380524E+01    1.0673578623E+01    1.0196484311E+01    9.7141281447E+00    9.2285274978E+00    8.7416747055E+00    8.2555255283E+00    7.7719880122E+00    7.2929118211E+00    6.8200781157E+00    6.3551900432E+00    5.8998639021E+00    5.4556210365E+00    5.0238805096E+00    4.6059526002E+00    4.203033 [...]
+    9.2890062785E+00    9.0891621178E+00    8.8740761199E+00    8.6447614879E+00    8.4022903934E+00    8.1477871655E+00    7.8824211860E+00    7.6073995464E+00    7.3239595190E+00    7.0333608988E+00    6.7368782704E+00    6.4357932575E+00    6.1313868094E+00    5.8249315814E+00    5.5176844612E+00    5.2108792949E+00    4.9057198625E+00    4.6033731516E+00    4.3049629742E+00    4.0115639684E+00    3.7241960258E+00    3.4438191767E+00    3.1713289683E+00    2.9075523593E+00    2.653244 [...]
+    5.0576400105E+00    4.9488323957E+00    4.8317311364E+00    4.7068874682E+00    4.5748846854E+00    4.4363344388E+00    4.2918728760E+00    4.1421566516E+00    3.9878588355E+00    3.8296647525E+00    3.6682677801E+00    3.5043651365E+00    3.3386536895E+00    3.1718258153E+00    3.0045653365E+00    2.8375435683E+00    2.6714155004E+00    2.5068161395E+00    2.3443570387E+00    2.1846230355E+00    2.0281692201E+00    1.8755181531E+00    1.7271573493E+00    1.5835370434E+00    1.445068 [...]
+    2.1008066618E+00    2.0556132222E+00    2.0069792012E+00    1.9551332041E+00    1.9003171114E+00    1.8427845472E+00    1.7827992825E+00    1.7206335848E+00    1.6565665258E+00    1.5908822606E+00    1.5238682889E+00    1.4558137130E+00    1.3870075036E+00    1.3177367862E+00    1.2482851600E+00    1.1789310616E+00    1.1099461837E+00    1.0415939610E+00    9.7412813207E-01    9.0779138798E-01    8.4281411511E-01    7.7941324133E-01    7.1779119179E-01    6.5813496073E-01    6.006153 [...]
+    4.3381198580E-01    4.2448120672E-01    4.1444294054E-01    4.0374414614E-01    3.9243449555E-01    3.8056606197E-01    3.6819299456E-01    3.5537118236E-01    3.4215790974E-01    3.2861150579E-01    3.1479099033E-01    3.0075571894E-01    2.8656502949E-01    2.7227789280E-01    2.5795256972E-01    2.4364627707E-01    2.2941486473E-01    2.1531250599E-01    2.0139140335E-01    1.8770151153E-01    1.7429027966E-01    1.6120241409E-01    1.4847966342E-01    1.3616062691E-01    1.242805 [...]
+    1.3093584918E-02    1.2811377573E-02    1.2506711904E-02    1.2181097076E-02    1.1836134661E-02    1.1473507618E-02    1.1094968777E-02    1.0702328925E-02    1.0297444588E-02    9.8822056062E-03    9.4585226126E-03    9.0283145145E-03    8.5934960725E-03    8.1559656825E-03    7.7175934525E-03    7.2802096698E-03    6.8455937432E-03    6.4154637049E-03    5.9914663486E-03    5.5751680722E-03    5.1680464895E-03    4.7714828657E-03    4.3867554222E-03    4.0150335520E-03    3.657372 [...]
+    7.4186250766E-01    7.2589739107E-01    7.0870613840E-01    6.9037040357E-01    6.7097663375E-01    6.5061551256E-01    6.2938137931E-01    6.0737162839E-01    5.8468609363E-01    5.6142642200E-01    5.3769544153E-01    5.1359652786E-01    4.8923297442E-01    4.6470737045E-01    4.4012099165E-01    4.1557320768E-01    3.9116091066E-01    3.6697796874E-01    3.4311470842E-01    3.1965742903E-01    2.9668795276E-01    2.7428321281E-01    2.5251488248E-01    2.3144904713E-01    2.111459 [...]
+    2.4777846640E+00    2.4244676711E+00    2.3670663364E+00    2.3058524757E+00    2.2411138109E+00    2.1731521259E+00    2.1022813439E+00    2.0288255380E+00    1.9531168936E+00    1.8754936340E+00    1.7962979273E+00    1.7158737888E+00    1.6345649940E+00    1.5527130180E+00    1.4706550157E+00    1.3887218569E+00    1.3072362307E+00    1.2265108315E+00    1.1468466400E+00    1.0685313094E+00    9.9183766847E-01    9.1702235022E-01    8.4432455521E-01    7.7396495616E-01    7.061447 [...]
+    5.0422376191E+00    4.9337430332E+00    4.8169451465E+00    4.6923964138E+00    4.5606815802E+00    4.4224139413E+00    4.2782314415E+00    4.1287926405E+00    3.9747725784E+00    3.8168585695E+00    3.6557459557E+00    3.4921338511E+00    3.3267209087E+00    3.1602011388E+00    2.9932598107E+00    2.8265694651E+00    2.6607860663E+00    2.4965453191E+00    2.3344591782E+00    2.1751125703E+00    2.0190603521E+00    1.8668245232E+00    1.7188917109E+00    1.5757109413E+00    1.437691 [...]
+    8.2306372642E+00    8.0535411690E+00    7.8628984515E+00    7.6596103089E+00    7.4446305805E+00    7.2189596514E+00    6.9836380955E+00    6.7397401029E+00    6.4883667416E+00    6.2306391035E+00    5.9676913845E+00    5.7006639497E+00    5.4306964341E+00    5.1589209287E+00    4.8864552997E+00    4.6143966893E+00    4.3438152427E+00    4.0757481050E+00    3.8111937277E+00    3.5511065246E+00    3.2963919103E+00    3.0479017529E+00    2.8064302700E+00    2.5727103904E+00    2.347410 [...]
+    1.1823311880E+01    1.1568916747E+01    1.1295068436E+01    1.1003060977E+01    1.0694263952E+01    1.0370113758E+01    1.0032104479E+01    9.6817784578E+00    9.3207166248E+00    8.9505286643E+00    8.5728430844E+00    8.1892972664E+00    7.8015275634E+00    7.4111595223E+00    7.0197982962E+00    6.6290193167E+00    6.2403592906E+00    5.8553075829E+00    5.4752980445E+00    5.1017013400E+00    4.7358178236E+00    4.3788710102E+00    4.0320016809E+00    3.6962626570E+00    3.372614 [...]
+    1.5596407602E+01    1.5260832238E+01    1.4899601854E+01    1.4514422925E+01    1.4107101536E+01    1.3679531855E+01    1.3233684112E+01    1.2771592160E+01    1.2295340738E+01    1.1807052505E+01    1.1308874949E+01    1.0802967274E+01    1.0291487347E+01    9.7765788082E+00    9.2603584350E+00    8.7449038422E+00    8.2322416149E+00    7.7243359472E+00    7.2230778683E+00    6.7302751250E+00    6.2476427888E+00    5.7767946451E+00    5.3192354192E+00    4.8763538827E+00    4.449416 [...]
+    1.9332337713E+01    1.8916382391E+01    1.8468632504E+01    1.7991202810E+01    1.7486331485E+01    1.6956365840E+01    1.6403747426E+01    1.5830996638E+01    1.5240696918E+01    1.4635478706E+01    1.4018003219E+01    1.3390946204E+01    1.2756981769E+01    1.2118766417E+01    1.1478923386E+01    1.0840027415E+01    1.0204590038E+01    9.5750455117E+00    8.9537374599E+00    8.3429063418E+00    7.7446778099E+00    7.1610520395E+00    6.5938940937E+00    6.0449253786E+00    5.515716 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cylinder_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cylinder_BA.inp
new file mode 100755
index 0000000..ad8022c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_cylinder_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_cylinder_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_ellipsoid_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_ellipsoid_BA.ima
new file mode 100644
index 0000000..46eba5d
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_ellipsoid_BA.ima
@@ -0,0 +1,100 @@
+    7.9179656500E+04    7.7476070806E+04    7.5642352923E+04    7.3687156648E+04    7.1619640297E+04    6.9449408360E+04    6.7186450656E+04    6.4841079434E+04    6.2423864887E+04    5.9945569554E+04    5.7417082089E+04    5.4849350878E+04    5.2253317993E+04    4.9639853936E+04    4.7019693661E+04    4.4403374308E+04    4.1801175087E+04    3.9223059723E+04    3.6678621861E+04    3.4177033774E+04    3.1726998729E+04    2.9336707298E+04    2.7013797890E+04    2.4765321729E+04    2.259771 [...]
+    7.8213467777E+04    7.6530670170E+04    7.4719328511E+04    7.2787990982E+04    7.0745704126E+04    6.8601955212E+04    6.6366612138E+04    6.4049861294E+04    6.1662143868E+04    5.9214091043E+04    5.6716458581E+04    5.4180061249E+04    5.1615707572E+04    4.9034135385E+04    4.6445948630E+04    4.3861555847E+04    4.1291110797E+04    3.8744455611E+04    3.6231066852E+04    3.3760004861E+04    3.1339866696E+04    2.8978742979E+04    2.6684178908E+04    2.4463139668E+04    2.232198 [...]
+    7.5373610831E+04    7.3751914319E+04    7.2006341650E+04    7.0145130583E+04    6.8176999132E+04    6.6111090034E+04    6.3956912828E+04    6.1724283977E+04    5.9423265491E+04    5.7064102475E+04    5.4657160088E+04    5.2212860355E+04    4.9741619287E+04    4.7253784776E+04    4.4759575684E+04    4.2269022574E+04    3.9791910484E+04    3.7337724144E+04    3.4915595998E+04    3.2534257384E+04    3.0201993189E+04    2.7926600260E+04    2.5715349829E+04    2.3574954184E+04    2.151153 [...]
+    7.0831230208E+04    6.9307265508E+04    6.7666890963E+04    6.5917847803E+04    6.4068328565E+04    6.2126924905E+04    6.0102573165E+04    5.8004498116E+04    5.5842155270E+04    5.3625172201E+04    5.1363289302E+04    4.9066300404E+04    4.6743993694E+04    4.4406093349E+04    4.2062202297E+04    3.9721746525E+04    3.7393921300E+04    3.5087639687E+04    3.2811483709E+04    3.0573658466E+04    2.8381949524E+04    2.6243683831E+04    2.4165694414E+04    2.2154289046E+04    2.021522 [...]
+    6.4855463271E+04    6.3460070437E+04    6.1958090046E+04    6.0356610126E+04    5.8663131925E+04    5.6885522125E+04    5.5031963009E+04    5.3110900946E+04    5.1130993574E+04    4.9101056080E+04    4.7030006947E+04    4.4926813594E+04    4.2800438275E+04    4.0659784642E+04    3.8513645335E+04    3.6370650992E+04    3.4239221008E+04    3.2127516397E+04    3.0043395074E+04    2.7994369846E+04    2.5987569397E+04    2.4029702500E+04    2.2127025693E+04    2.0285314590E+04    1.850983 [...]
+    5.7791001095E+04    5.6547603928E+04    5.5209230841E+04    5.3782197666E+04    5.2273188429E+04    5.0689212775E+04    4.9037561561E+04    4.7325760954E+04    4.5561525379E+04    4.3752709638E+04    4.1907260585E+04    4.0033168680E+04    3.8138419786E+04    3.6230947554E+04    3.4318586730E+04    3.2409027712E+04    3.0509772682E+04    2.8628093599E+04    2.6770992358E+04    2.4945163353E+04    2.3156958716E+04    2.1412356426E+04    1.9716931506E+04    1.8075830461E+04    1.649374 [...]
+    5.0029905123E+04    4.8953491977E+04    4.7794859402E+04    4.6559474905E+04    4.5253124720E+04    4.3881876958E+04    4.2452043165E+04    4.0970138589E+04    3.9442841444E+04    3.7876951472E+04    3.6279348102E+04    3.4656948516E+04    3.3016665926E+04    3.1365368349E+04    2.9709838193E+04    2.8056732918E+04    2.6412547058E+04    2.4783575863E+04    2.3175880802E+04    2.1595257164E+04    2.0047203955E+04    1.8536896304E+04    1.7069160516E+04    1.5648451947E+04    1.427883 [...]
+    4.1980467235E+04    4.1077241814E+04    4.0105027155E+04    3.9068410939E+04    3.7972248280E+04    3.6821630795E+04    3.5621854363E+04    3.4378385780E+04    3.3096828582E+04    3.1782888278E+04    3.0442337243E+04    2.9080979535E+04    2.7704615888E+04    2.6319009123E+04    2.4929850234E+04    2.3542725390E+04    2.2163084060E+04    2.0796208513E+04    1.9447184871E+04    1.8120875923E+04    1.6821895866E+04    1.5554587153E+04    1.4322999557E+04    1.3130871609E+04    1.198161 [...]
+    3.4036124943E+04    3.3303825912E+04    3.2515594816E+04    3.1675151020E+04    3.0786430698E+04    2.9853561757E+04    2.8880837698E+04    2.7872690585E+04    2.6833663343E+04    2.5768381568E+04    2.4681525068E+04    2.3577799346E+04    2.2461907212E+04    2.1338520750E+04    2.0212253824E+04    1.9087635320E+04    1.7969083314E+04    1.6860880339E+04    1.5767149922E+04    1.4691834539E+04    1.3638675144E+04    1.2611192390E+04    1.1612669662E+04    1.0646138023E+04    9.714363 [...]
+    2.6547337285E+04    2.5976162995E+04    2.5361364742E+04    2.4705843401E+04    2.4012668929E+04    2.3285060818E+04    2.2526367706E+04    2.1740046302E+04    2.0929639774E+04    2.0098755768E+04    1.9251044221E+04    1.8390175108E+04    1.7519816316E+04    1.6643611771E+04    1.5765160005E+04    1.4887993282E+04    1.4015557455E+04    1.3151192672E+04    1.2298115084E+04    1.1459399645E+04    1.0637964151E+04    9.8365545874E+03    9.0577319018E+03    8.3038602575E+03    7.577096 [...]
+    1.9798910998E+04    1.9372932041E+04    1.8914420054E+04    1.8425538365E+04    1.7908576388E+04    1.7365935046E+04    1.6800111566E+04    1.6213683766E+04    1.5609293940E+04    1.4989632468E+04    1.4357421268E+04    1.3715397211E+04    1.3066295611E+04    1.2412833928E+04    1.1757695773E+04    1.1103515351E+04    1.0452862436E+04    9.8082279891E+03    9.1720105087E+03    8.5465032123E+03    7.9338821276E+03    7.3361951701E+03    6.7553522736E+03    6.1931166324E+03    5.651097 [...]
+    1.3994597387E+04    1.3693500566E+04    1.3369409630E+04    1.3023853579E+04    1.2658450518E+04    1.2274897356E+04    1.1874959069E+04    1.1460457583E+04    1.1033260399E+04    1.0595269001E+04    1.0148407169E+04    9.6946092526E+03    9.2358085100E+03    8.7739255847E+03    8.3108572072E+03    7.8484651981E+03    7.3885658506E+03    6.9329197650E+03    6.4832222038E+03    6.0410940308E+03    5.6080732950E+03    5.1856075096E+03    4.7750466769E+03    4.3776370969E+03    3.994515 [...]
+    9.2499430509E+03    9.0509291638E+03    8.8367182207E+03    8.6083207291E+03    8.3668060801E+03    8.1132957411E+03    7.8489561574E+03    7.5749914132E+03    7.2926357090E+03    7.0031457074E+03    6.7077928067E+03    6.4078553955E+03    6.1046111456E+03    5.7993293989E+03    5.4932637008E+03    5.1876445337E+03    4.8836723011E+03    4.5825106092E+03    4.2852798938E+03    3.9930514318E+03    3.7068417790E+03    3.4276076673E+03    3.1562413940E+03    2.8935667296E+03    2.640335 [...]
+    5.5934743740E+03    5.4731305094E+03    5.3435979961E+03    5.2054878003E+03    5.0594464843E+03    4.9061520914E+03    4.7463098551E+03    4.5806477642E+03    4.4099120147E+03    4.2348623846E+03    4.0562675628E+03    3.8749004680E+03    3.6915335901E+03    3.5069343882E+03    3.3218607772E+03    3.1370567357E+03    2.9532480643E+03    2.7711383243E+03    2.5914049849E+03    2.4146958027E+03    2.2416254583E+03    2.0727724712E+03    1.9086764115E+03    1.7498354251E+03    1.596704 [...]
+    2.9754326462E+03    2.9114165299E+03    2.8425134084E+03    2.7690482089E+03    2.6913647845E+03    2.6098237264E+03    2.5248000836E+03    2.4366810045E+03    2.3458633205E+03    2.2527510860E+03    2.1577530965E+03    2.0612803995E+03    1.9637438182E+03    1.8655515052E+03    1.7671065425E+03    1.6688046070E+03    1.5710317146E+03    1.4741620615E+03    1.3785559750E+03    1.2845579881E+03    1.1924950510E+03    1.1026748899E+03    1.0153845240E+03    9.3088894849E+02    8.494299 [...]
+    1.2825507833E+03    1.2549571916E+03    1.2252577411E+03    1.1935924332E+03    1.1601094201E+03    1.1249640625E+03    1.0883179483E+03    1.0503378773E+03    1.0111948207E+03    9.7106286237E+02    9.3011813010E+02    8.8853772416E+02    8.4649865114E+02    8.0417677049E+02    7.6174576140E+02    7.1937611716E+02    6.7723417398E+02    6.3548118092E+02    5.9427241726E+02    5.5375636314E+02    5.1407392870E+02    4.7535774695E+02    4.3773153431E+02    4.0130952286E+02    3.661959 [...]
+    3.5684990544E+02    3.4917265392E+02    3.4090993321E+02    3.3210065761E+02    3.2278600417E+02    3.1300915151E+02    3.0281500748E+02    2.9224992759E+02    2.8136142645E+02    2.7019788411E+02    2.5880824959E+02    2.4724174367E+02    2.3554756310E+02    2.2377458829E+02    2.1197109665E+02    2.0018448337E+02    1.8846099187E+02    1.7684545549E+02    1.6538105229E+02    1.5410907462E+02    1.4306871481E+02    1.3229686848E+02    1.2182795660E+02    1.1169376738E+02    1.019233 [...]
+    1.6181179729E+01    1.5833139194E+01    1.5458704172E+01    1.5059626026E+01    1.4637757032E+01    1.4195038800E+01    1.3733490219E+01    1.3255194989E+01    1.2762288846E+01    1.2256946558E+01    1.1741368795E+01    1.1217768951E+01    1.0688360025E+01    1.0155341640E+01    9.6208872917E+00    9.0871319253E+00    8.5561599032E+00    8.0299934639E+00    7.5105817382E+00    6.9997903967E+00    6.4993919961E+00    6.0110570842E+00    5.5363461186E+00    5.0767022477E+00    4.633444 [...]
+    7.4258162072E+01    7.2660265475E+01    7.0939946499E+01    6.9105353760E+01    6.7165113290E+01    6.5128273138E+01    6.3004245576E+01    6.0802747337E+01    5.8533738365E+01    5.6207359495E+01    5.3833869559E+01    5.1423582366E+01    4.8986804023E+01    4.6533771053E+01    4.4074589756E+01    4.1619177240E+01    3.9177204551E+01    3.6758042277E+01    3.4370709015E+01    3.2023823030E+01    2.9725557441E+01    2.7483599191E+01    2.5305112088E+01    2.3196704089E+01    2.116439 [...]
+    3.5819645581E+02    3.5048932982E+02    3.4219280385E+02    3.3334608738E+02    3.2399068038E+02    3.1417010803E+02    3.0392964410E+02    2.9331602487E+02    2.8237715597E+02    2.7116181404E+02    2.5971934567E+02    2.4809936558E+02    2.3635145643E+02    2.2452487236E+02    2.1266824828E+02    2.0082931715E+02    1.8905463707E+02    1.7738933015E+02    1.6587683489E+02    1.5455867376E+02    1.4347423740E+02    1.3266058701E+02    1.2215227581E+02    1.1198119102E+02    1.021764 [...]
+    7.2205061300E+02    7.0651495770E+02    6.8979182175E+02    6.7196018950E+02    6.5310365554E+02    6.3330989116E+02    6.1267008776E+02    5.9127838154E+02    5.6923126369E+02    5.4662698037E+02    5.2356492692E+02    5.0014504089E+02    4.7646719796E+02    4.5263061544E+02    4.2873326736E+02    4.0487131543E+02    3.8113855974E+02    3.5762591306E+02    3.3442090225E+02    3.1160720012E+02    2.8926419074E+02    2.6746657111E+02    2.4628399136E+02    2.2578073589E+02    2.060154 [...]
+    1.0554412738E+03    1.0327326284E+03    1.0082886856E+03    9.8222485837E+02    9.5466329342E+02    9.2573209224E+02    8.9556449832E+02    8.6429805713E+02    8.3207375484E+02    7.9903514225E+02    7.6532745026E+02    7.3109670340E+02    6.9648883787E+02    6.6164883034E+02    6.2671984379E+02    5.9184239637E+02    5.5715355911E+02    5.2278618803E+02    4.8886819567E+02    4.5552186718E+02    4.2286322516E+02    3.9100144738E+02    3.6003834097E+02    3.3006787611E+02    3.011757 [...]
+    1.2870160190E+03    1.2593250703E+03    1.2295184790E+03    1.1977369472E+03    1.1641293839E+03    1.1288519560E+03    1.0920670976E+03    1.0539424868E+03    1.0146499959E+03    9.7436462398E+02    9.3326341897E+02    8.9152439754E+02    8.4932547026E+02    8.0684337993E+02    7.6425266062E+02    7.2172462479E+02    6.7942638542E+02    6.3751992003E+02    5.9616118285E+02    5.5549927099E+02    5.1567565017E+02    4.7682344473E+02    4.3906679651E+02    4.0252029609E+02    3.672884 [...]
+    1.3831029372E+03    1.3533448021E+03    1.3213134224E+03    1.2871599751E+03    1.2510444536E+03    1.2131346479E+03    1.1736050806E+03    1.1326359082E+03    1.0904117930E+03    1.0471207573E+03    1.0029530253E+03    9.5809986309E+02    9.1275242385E+02    8.6710060792E+02    8.2133194444E+02    7.7563050339E+02    7.3017584512E+02    6.8514201490E+02    6.4069658907E+02    5.9699977923E+02    5.5420360032E+02    5.1245110772E+02    4.7187570827E+02    4.3260054901E+02    3.947379 [...]
+    1.3424248126E+03    1.3135420530E+03    1.2824532223E+03    1.2493050247E+03    1.2142527185E+03    1.1774591261E+03    1.1390936029E+03    1.0993309706E+03    1.0583504233E+03    1.0163344156E+03    9.7346753950E+02    9.2993539862E+02    8.8592348849E+02    8.4161609016E+02    7.9719518540E+02    7.5283940112E+02    7.0872299026E+02    6.6501485616E+02    6.2187762709E+02    5.7946678700E+02    5.3792986821E+02    4.9740571105E+02    4.5802379519E+02    4.1990364627E+02    3.831543 [...]
+    1.1880916100E+03    1.1625295373E+03    1.1350153055E+03    1.1056787288E+03    1.0746571888E+03    1.0420947594E+03    1.0081412946E+03    9.7295148448E+02    9.3668388813E+02    8.9949994978E+02    8.6156300533E+02    8.2303728666E+02    7.8408693094E+02    7.4487500197E+02    7.0556253056E+02    6.6630758063E+02    6.2726434766E+02    5.8858229552E+02    5.5040533762E+02    5.1287106787E+02    4.7611004625E+02    4.4024514373E+02    4.0539095042E+02    3.7165325052E+02    3.391285 [...]
+    9.5825158766E+02    9.3763471626E+02    9.1544360120E+02    8.9178292155E+02    8.6676345738E+02    8.4050138436E+02    8.1311753801E+02    7.8473665327E+02    7.5548658472E+02    7.2549751351E+02    6.9490114650E+02    6.6382991374E+02    6.3241616977E+02    6.0079140475E+02    5.6908547084E+02    5.3742582933E+02    5.0593682380E+02    4.7473898424E+02    4.4394836685E+02    4.1367593387E+02    3.8402697764E+02    3.5510059222E+02    3.2698919616E+02    2.9977810892E+02    2.735451 [...]
+    6.9675525432E+02    6.8176462593E+02    6.6562958618E+02    6.4842622850E+02    6.3023508010E+02    6.1114058944E+02    5.9123059164E+02    5.7059575592E+02    5.4932901908E+02    5.2752500918E+02    5.0527946367E+02    4.8268864628E+02    4.5984876661E+02    4.3685540696E+02    4.1380296012E+02    3.9078408230E+02    3.6788916492E+02    3.4520582883E+02    3.2281844455E+02    3.0080768149E+02    2.7925008927E+02    2.5821771365E+02    2.3777774955E+02    2.1799223309E+02    1.989177 [...]
+    4.4499429343E+02    4.3542039055E+02    4.2511580072E+02    4.1412910475E+02    4.0251171314E+02    3.9031753906E+02    3.7760265724E+02    3.6442495140E+02    3.5084375281E+02    3.3691947254E+02    3.2271323023E+02    3.0828648197E+02    2.9370065000E+02    2.7901675694E+02    2.6429506704E+02    2.4959473704E+02    2.3497347910E+02    2.2048723798E+02    2.0618988484E+02    1.9213292945E+02    1.7836525294E+02    1.6493286260E+02    1.5187867029E+02    1.3924229571E+02    1.270598 [...]
+    2.3576177360E+02    2.3068953169E+02    2.2523034375E+02    2.1940993347E+02    2.1325552204E+02    2.0679565515E+02    2.0006002253E+02    1.9307927145E+02    1.8588481551E+02    1.7850864012E+02    1.7098310611E+02    1.6334075285E+02    1.5561410239E+02    1.4783546590E+02    1.4003675386E+02    1.3224929137E+02    1.2450363971E+02    1.1682942554E+02    1.0925517879E+02    1.0180818039E+02    9.4514320686E+01    8.7397969651E+01    8.0481859496E+01    7.3786980469E+01    6.733249 [...]
+    8.9594900994E+01    8.7667405173E+01    8.5592999713E+01    8.3381448670E+01    8.1043083855E+01    7.8588739294E+01    7.6029682867E+01    7.3377545657E+01    7.0644249514E+01    6.7841933363E+01    6.4982878803E+01    6.2079435525E+01    5.9143947086E+01    5.6188677574E+01    5.3225739679E+01    5.0267024668E+01    4.7324134761E+01    4.4408318359E+01    4.1530408565E+01    3.8700765407E+01    3.5929222130E+01    3.3225035907E+01    3.0596843260E+01    2.8052620460E+01    2.559964 [...]
+    1.3665563504E+01    1.3371612139E+01    1.3055333422E+01    1.2718209956E+01    1.2361810176E+01    1.1987778471E+01    1.1597824876E+01    1.1193714433E+01    1.0777256266E+01    1.0350292479E+01    9.9146869444E+00    9.4723140531E+00    9.0250475245E+00    8.5747493415E+00    8.1232588938E+00    7.6723824039E+00    7.2238827070E+00    6.7794694561E+00    6.3407898164E+00    5.9094197108E+00    5.4868556723E+00    5.0745073554E+00    4.6736907521E+00    4.2856221516E+00    3.911412 [...]
+    2.9308947279E+00    2.8678046946E+00    2.7998395917E+00    2.7273245929E+00    2.6506041083E+00    2.5700395387E+00    2.4860069323E+00    2.3988945612E+00    2.3091004372E+00    2.2170297842E+00    2.1230924887E+00    2.0277005460E+00    1.9312655208E+00    1.8341960433E+00    1.7368953563E+00    1.6397589336E+00    1.5431721848E+00    1.4475082641E+00    1.3531259978E+00    1.2603679438E+00    1.1695585974E+00    1.0810027538E+00    9.9498403706E-01    9.1176360589E-01    8.315790 [...]
+    4.2988651428E+01    4.2063625577E+01    4.1067746181E+01    4.0005728489E+01    3.8882563651E+01    3.7703486740E+01    3.6473943389E+01    3.5199555305E+01    3.3886084902E+01    3.2539399342E+01    3.1165434217E+01    2.9770157171E+01    2.8359531699E+01    2.6939481410E+01    2.5515854985E+01    2.4094392107E+01    2.2680690571E+01    2.1280174827E+01    1.9898066160E+01    1.8539354699E+01    1.7208773452E+01    1.5910774521E+01    1.4649507649E+01    1.3428801218E+01    1.225214 [...]
+    1.1392680656E+02    1.1147547337E+02    1.0883662094E+02    1.0602272431E+02    1.0304698725E+02    9.9923257954E+01    9.6665940929E+01    9.3289906066E+01    8.9810395322E+01    8.6242927834E+01    8.2603204115E+01    7.8907010041E+01    7.5170121339E+01    7.1408209245E+01    6.7636748019E+01    6.3870924970E+01    6.0125553610E+01    5.6414990549E+01    5.2753056684E+01    4.9152963218E+01    4.5627242977E+01    4.2187687471E+01    3.8845290087E+01    3.5610195734E+01    3.249165 [...]
+    1.9442158084E+02    1.9023836214E+02    1.8573532219E+02    1.8093373448E+02    1.7585611438E+02    1.7052607536E+02    1.6496817915E+02    1.5920778065E+02    1.5327086916E+02    1.4718390664E+02    1.4097366461E+02    1.3466706058E+02    1.2829099537E+02    1.2187219237E+02    1.1543704000E+02    1.0901143841E+02    1.0262065151E+02    9.6289165320E+01    9.0040553650E+01    8.3897352004E+01    7.7880940453E+01    7.2011436312E+01    6.6307597217E+01    6.0786735203E+01    5.546464 [...]
+    2.6541365855E+02    2.5970304209E+02    2.5355598290E+02    2.4700150911E+02    2.4007034270E+02    2.3279470343E+02    2.2520810450E+02    2.1734514118E+02    2.0924127418E+02    2.0093260928E+02    1.9245567481E+02    1.8384719868E+02    1.7514388652E+02    1.6638220252E+02    1.5759815456E+02    1.4882708514E+02    1.4010346961E+02    1.3146072289E+02    1.2293101636E+02    1.1454510572E+02    1.0633217124E+02    9.8319671315E+01    9.0533210155E+01    8.2996420510E+01    7.573086 [...]
+    3.1285443557E+02    3.0612316210E+02    2.9887757679E+02    2.9115188459E+02    2.8298228567E+02    2.7440674462E+02    2.6546474971E+02    2.5619706398E+02    2.4664547020E+02    2.3685251121E+02    2.2686122797E+02    2.1671489692E+02    2.0645676868E+02    1.9612980992E+02    1.8577645036E+02    1.7543833642E+02    1.6515609358E+02    1.5496909876E+02    1.4491526451E+02    1.3503083628E+02    1.2535020418E+02    1.1590573037E+02    1.0672759319E+02    9.7843648899E+01    8.927931 [...]
+    3.2922897563E+02    3.2214546099E+02    3.1452084549E+02    3.0639111360E+02    2.9779434821E+02    2.8877048797E+02    2.7936107408E+02    2.6960898866E+02    2.5955818644E+02    2.4925342183E+02    2.3873997342E+02    2.2806336781E+02    2.1726910483E+02    2.0640238613E+02    1.9550784903E+02    1.8462930756E+02    1.7380950246E+02    1.6308986180E+02    1.5251027399E+02    1.4210887455E+02    1.3192184805E+02    1.2198324656E+02    1.1232482565E+02    1.0297589884E+02    9.396321 [...]
+    3.1379216257E+02    3.0704084117E+02    2.9977390997E+02    2.9202565627E+02    2.8383236630E+02    2.7523209403E+02    2.6626442014E+02    2.5697020273E+02    2.4739132182E+02    2.3757041946E+02    2.2755063725E+02    2.1737535338E+02    2.0708792089E+02    1.9673140919E+02    1.8634835053E+02    1.7598049334E+02    1.6566856409E+02    1.5545203930E+02    1.4536892924E+02    1.3545557481E+02    1.2574645887E+02    1.1627403321E+02    1.0706856224E+02    9.8157984351E+01    8.956779 [...]
+    2.7166357504E+02    2.6581871985E+02    2.5952759019E+02    2.5281986085E+02    2.4572693615E+02    2.3828174997E+02    2.3051855716E+02    2.2247271798E+02    2.1418047707E+02    2.0567873855E+02    1.9700483907E+02    1.8819632025E+02    1.7929070229E+02    1.7032526033E+02    1.6133680514E+02    1.5236146971E+02    1.4343450322E+02    1.3459007373E+02    1.2586108110E+02    1.1727898113E+02    1.0887362238E+02    1.0067309631E+02    9.2703602103E+01    8.4989326526E+01    7.755233 [...]
+    2.1208614870E+02    2.0752315869E+02    2.0261186755E+02    1.9737543372E+02    1.9183836494E+02    1.8602636223E+02    1.7996615727E+02    1.7368534422E+02    1.6721220729E+02    1.6057554542E+02    1.5380449522E+02    1.4692835343E+02    1.3997640042E+02    1.3297772569E+02    1.2596105683E+02    1.1895459300E+02    1.1198584425E+02    1.0508147757E+02    9.8267170929E+01    9.1567476073E+01    8.5005691141E+01    7.8603743790E+01    7.2382085606E+01    6.6359598389E+01    6.055351 [...]
+    1.4624556544E+02    1.4309917092E+02    1.3971269585E+02    1.3610210161E+02    1.3228427915E+02    1.2827694152E+02    1.2409851189E+02    1.1976800769E+02    1.1530492191E+02    1.1072910228E+02    1.0606062938E+02    1.0131969437E+02    9.6526477366E+01    9.1701027318E+01    8.6863144138E+01    8.2032264048E+01    7.7227348838E+01    7.2466779848E+01    6.7768257370E+01    6.3148706134E+01    5.8624187508E+01    5.4209818952E+01    4.9919701226E+01    4.5766853776E+01    4.176315 [...]
+    8.5065557224E+01    8.3235460492E+01    8.1265799590E+01    7.9165851918E+01    7.6945434809E+01    7.4614843154E+01    7.2184784358E+01    6.9666311099E+01    6.7070752400E+01    6.4409643500E+01    6.1694655052E+01    5.8937522163E+01    5.6149973762E+01    5.3343662838E+01    5.0530098014E+01    4.7720576942E+01    4.4926121997E+01    4.2157418689E+01    3.9424757222E+01    3.6737977581E+01    3.4106418512E+01    3.1538870698E+01    2.9043534445E+01    2.6627982105E+01    2.429912 [...]
+    3.7344824754E+01    3.6541425108E+01    3.5676822327E+01    3.4755083756E+01    3.3780513154E+01    3.2757623410E+01    3.1691108086E+01    3.0585811997E+01    2.9446701057E+01    2.8278831601E+01    2.7087319405E+01    2.5877308639E+01    2.4653940967E+01    2.3422325011E+01    2.2187506405E+01    2.0954438648E+01    1.9727954940E+01    1.8512741225E+01    1.7313310585E+01    1.6133979189E+01    1.4978843933E+01    1.3851761908E+01    1.2756331845E+01    1.1695877619E+01    1.067343 [...]
+    8.4996872768E+00    8.3168573283E+00    8.1201431090E+00    7.9104665866E+00    7.6888031190E+00    7.4561753061E+00    7.2136465796E+00    6.9623145769E+00    6.7033043490E+00    6.4377614503E+00    6.1668449602E+00    5.8917204873E+00    5.6135532057E+00    5.3335009718E+00    5.0527075717E+00    4.7722961444E+00    4.4933628262E+00    4.2169706606E+00    3.9441438134E+00    3.6758621311E+00    3.4130560783E+00    3.1566020850E+00    2.9073183333E+00    2.6659610075E+00    2.433221 [...]
+    4.4902538781E-02    4.3933260659E-02    4.2884128130E-02    4.1760550785E-02    4.0568281203E-02    3.9313373239E-02    3.8002138377E-02    3.6641100532E-02    3.5236949698E-02    3.3796494844E-02    3.2326616470E-02    3.0834219236E-02    2.9326185053E-02    2.7809327047E-02    2.6290344763E-02    2.4775780994E-02    2.3271980559E-02    2.1785051371E-02    2.0320828091E-02    1.8884838625E-02    1.7482273715E-02    1.6117959830E-02    1.4796335516E-02    1.3521431358E-02    1.229685 [...]
+    9.8076429057E+00    9.5965831933E+00    9.3693209659E+00    9.1269350631E+00    8.8705676031E+00    8.6014166365E+00    8.3207284837E+00    8.0297898116E+00    7.7299195116E+00    7.4224604369E+00    7.1087710622E+00    6.7902171275E+00    6.4681633252E+00    6.1439650938E+00    5.8189605744E+00    5.4944627897E+00    5.1717520991E+00    4.8520689826E+00    4.5366072034E+00    4.2265073936E+00    3.9228511072E+00    3.6266553757E+00    3.3388678019E+00    3.0603622196E+00    2.791934 [...]
+    3.2749005224E+01    3.2044324833E+01    3.1285686234E+01    3.0476679915E+01    2.9621106331E+01    2.8722951574E+01    2.7786361996E+01    2.6815617978E+01    2.5815107031E+01    2.4789296437E+01    2.3742705632E+01    2.2679878524E+01    2.1605355957E+01    2.0523648523E+01    1.9439209897E+01    1.8356410913E+01    1.7279514533E+01    1.6212651902E+01    1.5159799650E+01    1.4124758574E+01    1.3111133871E+01    1.2122317011E+01    1.1161469396E+01    1.0231507872E+01    9.335092 [...]
+    6.2181210766E+01    6.0843273632E+01    5.9402987881E+01    5.7867162348E+01    5.6243003590E+01    5.4538069832E+01    5.2760222937E+01    5.0917578750E+01    4.9018456193E+01    4.7071325480E+01    4.5084755836E+01    4.3067363111E+01    4.1027757646E+01    3.8974492796E+01    3.6916014454E+01    3.4860611951E+01    3.2816370651E+01    3.0791126600E+01    2.8792423506E+01    2.6827472359E+01    2.4903113937E+01    2.3025784447E+01    2.1201484515E+01    1.9435751689E+01    1.773363 [...]
+    9.1127022064E+01    8.9166310753E+01    8.7055693287E+01    8.4805140927E+01    8.2425207005E+01    7.9926959546E+01    7.7321911013E+01    7.4621945663E+01    7.1839245081E+01    6.8986212428E+01    6.6075395963E+01    6.3119412391E+01    6.0130870611E+01    5.7122296391E+01    5.4106058519E+01    5.1094296946E+01    4.8098853433E+01    4.5131205163E+01    4.2202401780E+01    3.9323006271E+01    3.6503040072E+01    3.3751932755E+01    3.1078476593E+01    2.8490786278E+01    2.599626 [...]
+    1.1357283618E+02    1.1112921569E+02    1.0849884219E+02    1.0569413665E+02    1.0272824476E+02    9.9614953094E+01    9.6368601632E+01    9.3003993364E+01    8.9536301591E+01    8.5980975638E+01    8.2353645657E+01    7.8670027222E+01    7.4945826408E+01    7.1196646019E+01    6.7437893662E+01    6.3684692291E+01    5.9951793854E+01    5.6253496633E+01    5.2603566850E+01    4.9015165039E+01    4.5500777680E+01    4.2072154521E+01    3.8740251977E+01    3.5515182927E+01    3.240617 [...]
+    1.2541264006E+02    1.2271431276E+02    1.1980983438E+02    1.1671291494E+02    1.1343806406E+02    1.1000049854E+02    1.0641604580E+02    1.0270104423E+02    9.8872240868E+01    9.4946687462E+01    9.0941635417E+01    8.6874430573E+01    8.2762408484E+01    7.8622790985E+01    7.4472584771E+01    7.0328482707E+01    6.6206768554E+01    6.2123225771E+01    5.8093051005E+01    5.4130772843E+01    5.0250176359E+01    4.6464233936E+01    4.2785042774E+01    3.9223769469E+01    3.579060 [...]
+    1.2495470782E+02    1.2226626771E+02    1.1937249502E+02    1.1628704426E+02    1.1302436609E+02    1.0959961518E+02    1.0602855424E+02    1.0232745473E+02    9.8512995084E+01    9.4602157184E+01    9.0612121860E+01    8.6560164117E+01    8.2463548909E+01    7.8339428170E+01    7.4204739862E+01    7.0076109722E+01    6.5969756418E+01    6.1901400749E+01    5.7886179506E+01    5.3938564578E+01    5.0072287808E+01    4.6300272094E+01    4.2634569149E+01    3.9086304279E+01    3.566562 [...]
+    1.1295120051E+02    1.1052105192E+02    1.0790535702E+02    1.0511645359E+02    1.0216739847E+02    9.9071884456E+01    9.5844153558E+01    9.2498907367E+01    8.9051215160E+01    8.5516420417E+01    8.1910046434E+01    7.8247701729E+01    7.4544985911E+01    7.0817396698E+01    6.7080238739E+01    6.3348534886E+01    5.9636940525E+01    5.5959661564E+01    5.2330376629E+01    4.8762163977E+01    4.5267433616E+01    4.1857865047E+01    3.8544351017E+01    3.5336947614E+01    3.224483 [...]
+    9.2196603287E+01    9.0213020517E+01    8.8078042449E+01    8.5801735105E+01    8.3394750933E+01    8.0868261023E+01    7.8233884409E+01    7.5503614984E+01    7.2689746583E+01    6.9804796758E+01    6.6861429832E+01    6.3872379769E+01    6.0850373429E+01    5.7808054753E+01    5.4757910414E+01    5.1712197467E+01    4.8682873491E+01    4.5681529699E+01    4.2719327486E+01    3.9806938815E+01    3.6954490840E+01    3.4171515115E+01    3.1466901699E+01    2.8848858423E+01    2.632487 [...]
+    6.6810101414E+01    6.5372729324E+01    6.3825701427E+01    6.2176307723E+01    6.0432262689E+01    5.8601656232E+01    5.6692902526E+01    5.4714687138E+01    5.2675912815E+01    5.0585644332E+01    4.8453052815E+01    4.6287359927E+01    4.4097782337E+01    4.1893476854E+01    3.9683486623E+01    3.7476688764E+01    3.5281743804E+01    3.3107047271E+01    3.0960683750E+01    2.8850383727E+01    2.6783483493E+01    2.4766888361E+01    2.2807039418E+01    2.0909884019E+01    1.908085 [...]
+    4.1359578873E+01    4.0469781459E+01    3.9512147346E+01    3.8491185625E+01    3.7411667740E+01    3.6278597181E+01    3.5097177891E+01    3.3872781592E+01    3.2610914304E+01    3.1317182271E+01    2.9997257569E+01    2.8656843626E+01    2.7301640913E+01    2.5937313048E+01    2.4569453553E+01    2.3203553493E+01    2.1844970236E+01    2.0498897524E+01    1.9170337078E+01    1.7864071922E+01    1.6584641581E+01    1.5336319331E+01    1.4123091637E+01    1.2948639883E+01    1.181632 [...]
+    1.9996337662E+01    1.9566163511E+01    1.9103231958E+01    1.8609719750E+01    1.8087930112E+01    1.7540278148E+01    1.6969275627E+01    1.6377515244E+01    1.5767654492E+01    1.5142399254E+01    1.4504487235E+01    1.3856671354E+01    1.3201703214E+01    1.2542316774E+01    1.1881212332E+01    1.1221040926E+01    1.0564389278E+01    9.9137653686E+00    9.2715847400E+00    8.6401576299E+00    8.0216770057E+00    7.4182075830E+00    6.8316758924E+00    6.2638614534E+00    5.716389 [...]
+    5.7509588627E+00    5.6272559900E+00    5.4941615500E+00    5.3522991513E+00    5.2023285108E+00    5.0449412957E+00    4.8808567883E+00    4.7108174050E+00    4.5355841022E+00    4.3559317034E+00    4.1726441796E+00    3.9865099182E+00    3.7983170133E+00    3.6088486113E+00    3.4188783445E+00    3.2291658826E+00    3.0404526365E+00    2.8534576389E+00    2.6688736333E+00    2.4873633941E+00    2.3095563042E+00    2.1360452088E+00    1.9673835667E+00    1.8040829155E+00    1.646610 [...]
+    9.8001301612E-02    9.5896885578E-02    9.3639264492E-02    9.1238504188E-02    8.8705224614E-02    8.6050538074E-02    8.3285984973E-02    8.0423467489E-02    7.7475181579E-02    7.4453547784E-02    7.1371141248E-02    6.8240621411E-02    6.5074661813E-02    6.1885880457E-02    5.8686771168E-02    5.5489636367E-02    5.2306521690E-02    4.9149152845E-02    4.6028875102E-02    4.2956595770E-02    3.9942730025E-02    3.6997150395E-02    3.4129140204E-02    3.1347351253E-02    2.865976 [...]
+    2.8400135675E+00    2.7788882314E+00    2.7130549809E+00    2.6428275394E+00    2.5685380977E+00    2.4905351653E+00    2.4091813291E+00    2.3248509355E+00    2.2379277144E+00    2.1488023621E+00    2.0578701016E+00    1.9655282389E+00    1.8721737323E+00    1.7782007930E+00    1.6839985348E+00    1.5899486890E+00    1.4964234013E+00    1.4037831257E+00    1.3123746298E+00    1.2225291256E+00    1.1345605372E+00    1.0487639169E+00    9.6541402014E-01    8.8476404584E-01    8.070445 [...]
+    1.2300764763E+01    1.2036068454E+01    1.1751079853E+01    1.1447149635E+01    1.1125707564E+01    1.0788253320E+01    1.0436346931E+01    1.0071598890E+01    9.6956600048E+00    9.3102110942E+00    8.9169525693E+00    8.5175940024E+00    8.1138437479E+00    7.7073986925E+00    7.2999342097E+00    6.8930943881E+00    6.4884826029E+00    6.0876524963E+00    5.6920994272E+00    5.3032524479E+00    4.9224668605E+00    4.5510173996E+00    4.1900920843E+00    3.8407867739E+00    3.504100 [...]
+    2.5764394211E+01    2.5210012809E+01    2.4613194265E+01    2.3976762203E+01    2.3303705301E+01    2.2597158172E+01    2.1860381418E+01    2.1096741020E+01    2.0309687197E+01    1.9502732907E+01    1.8679432138E+01    1.7843358161E+01    1.6998081885E+01    1.6147150487E+01    1.5294066455E+01    1.4442267213E+01    1.3595105439E+01    1.2755830250E+01    1.1927569344E+01    1.1113312252E+01    1.0315894779E+01    9.5379847574E+00    8.7820691880E+00    8.0504428408E+00    7.345198 [...]
+    4.0059847790E+01    3.9197894853E+01    3.8270013064E+01    3.7280588244E+01    3.6234262352E+01    3.5135903836E+01    3.3990576694E+01    3.2803508510E+01    3.1580057670E+01    3.0325680013E+01    2.9045895174E+01    2.7746252839E+01    2.6432299184E+01    2.5109543718E+01    2.3783426784E+01    2.2459287929E+01    2.1142335386E+01    1.9837616858E+01    1.8549991815E+01    1.7284105480E+01    1.6044364682E+01    1.4834915725E+01    1.3659624400E+01    1.2522058281E+01    1.142547 [...]
+    5.2173550910E+01    5.1050977421E+01    4.9842587465E+01    4.8554089092E+01    4.7191523504E+01    4.5761226501E+01    4.4269788268E+01    4.2724011803E+01    4.1130870305E+01    3.9497463813E+01    3.7830975444E+01    3.6138627523E+01    3.4427637942E+01    3.2705177050E+01    3.0978325388E+01    2.9254032563E+01    2.7539077552E+01    2.5840030701E+01    2.4163217692E+01    2.2514685699E+01    2.0900171967E+01    1.9325075005E+01    1.7794428579E+01    1.6312878647E+01    1.488466 [...]
+    5.9778775668E+01    5.8492590509E+01    5.7108124223E+01    5.5631913240E+01    5.4070875300E+01    5.2432265343E+01    5.0723629491E+01    4.8952757494E+01    4.7127633961E+01    4.5256388759E+01    4.3347246934E+01    4.1408478518E+01    3.9448348593E+01    3.7475067960E+01    3.5496744771E+01    3.3521337471E+01    3.1556609359E+01    2.9610085103E+01    2.7689009486E+01    2.5800308666E+01    2.3950554201E+01    2.2145930065E+01    2.0392202858E+01    1.8694695383E+01    1.705826 [...]
+    6.1594735332E+01    6.0269500275E+01    5.8843040106E+01    5.7322086397E+01    5.5713763240E+01    5.4025541846E+01    5.2265193200E+01    5.0440739110E+01    4.8560402032E+01    4.6632554021E+01    4.4665665195E+01    4.2668252084E+01    4.0648826234E+01    3.8615843441E+01    3.6577653972E+01    3.4542454121E+01    3.2518239449E+01    3.0512760012E+01    2.8533477895E+01    2.6587527326E+01    2.4681677635E+01    2.2822299281E+01    2.1015333173E+01    1.9266263449E+01    1.758009 [...]
+    5.7526169076E+01    5.6288491308E+01    5.4956313746E+01    5.3535920110E+01    5.2033960357E+01    5.0457408338E+01    4.8813517631E+01    4.7109775884E+01    4.5353858012E+01    4.3553578580E+01    4.1716843736E+01    3.9851603025E+01    3.7965801449E+01    3.6067332111E+01    3.4163989774E+01    3.2263425670E+01    3.0373103868E+01    2.8500259505E+01    2.6651859159E+01    2.4834563625E+01    2.3054693344E+01    2.1318196694E+01    1.9630621345E+01    1.7997088843E+01    1.642227 [...]
+    4.8577361330E+01    4.7532236676E+01    4.6407349191E+01    4.5208002094E+01    4.3939807542E+01    4.2608650918E+01    4.1220653587E+01    3.9782134404E+01    3.8299570235E+01    3.6779555815E+01    3.5228763205E+01    3.3653901164E+01    3.2061674721E+01    3.0458745231E+01    2.8851691215E+01    2.7246970243E+01    2.5650882130E+01    2.4069533703E+01    2.2508805370E+01    2.0974319717E+01    1.9471412334E+01    1.8005105057E+01    1.6580081787E+01    1.5200667033E+01    1.387080 [...]
+    3.6575156296E+01    3.5788272569E+01    3.4941367161E+01    3.4038430224E+01    3.3083684211E+01    3.2081557036E+01    3.1036654080E+01    2.9953729256E+01    2.8837655339E+01    2.7693393792E+01    2.6525964296E+01    2.5340414205E+01    2.4141788162E+01    2.2935098074E+01    2.1725293666E+01    2.0517233831E+01    1.9315658956E+01    1.8125164425E+01    1.6950175488E+01    1.5794923632E+01    1.4663424641E+01    1.3559458463E+01    1.2486551014E+01    1.1447958024E+01    1.044665 [...]
+    2.3766660818E+01    2.3255357199E+01    2.2705081960E+01    2.2118425396E+01    2.1498128475E+01    2.0847065440E+01    2.0168225659E+01    1.9464694872E+01    1.8739635958E+01    1.7996269371E+01    1.7237853391E+01    1.6467664322E+01    1.5688976793E+01    1.4905044292E+01    1.4119080072E+01    1.3334238576E+01    1.2553597484E+01    1.1780140535E+01    1.1016741213E+01    1.0266147428E+01    9.5309672687E+00    8.8136559392E+00    8.1165039402E+00    7.4416265781E+00    6.790954 [...]
+    1.2374271679E+01    1.2108072002E+01    1.1821608140E+01    1.1516226559E+01    1.1193351932E+01    1.0854478120E+01    1.0501158759E+01    1.0134997534E+01    9.7576382064E+00    9.3707544689E+00    8.9760397043E+00    8.5751967162E+00    8.1699275110E+00    7.7619232008E+00    7.3528540999E+00    6.9443600833E+00    6.5380412743E+00    6.1354491247E+00    5.7380779476E+00    5.3473569585E+00    4.9646428762E+00    4.5912131311E+00    4.2282597204E+00    3.8768837488E+00    3.538090 [...]
+    4.1915683954E+00    4.1014087999E+00    4.0044058241E+00    3.9010138543E+00    3.7917135829E+00    3.6770089789E+00    3.5574241300E+00    3.4334999782E+00    3.3057909734E+00    3.1748616691E+00    3.0412832845E+00    2.9056302580E+00    2.7684768165E+00    2.6303935847E+00    2.4919442583E+00    2.3536823646E+00    2.2161481315E+00    2.0798654876E+00    1.9453392128E+00    1.8130522579E+00    1.6834632510E+00    1.5570042059E+00    1.4340784469E+00    1.3150587620E+00    1.200285 [...]
+    2.8959070751E-01    2.8336641701E-01    2.7667834410E-01    2.6955714188E-01    2.6203520031E-01    2.5414644886E-01    2.4592615104E-01    2.3741069201E-01    2.2863736098E-01    2.1964412973E-01    2.1046942882E-01    2.0115192307E-01    1.9173028778E-01    1.8224298721E-01    1.7272805684E-01    1.6322289081E-01    1.5376403594E-01    1.4438699383E-01    1.3512603199E-01    1.2601400556E-01    1.1708219051E-01    1.0836012938E-01    9.9875490587E-02    9.1653941990E-02    8.371903 [...]
+    8.7772124759E-01    8.5882591628E-01    8.3846753478E-01    8.1674372123E-01    7.9375787321E-01    7.6961849306E-01    7.4443848374E-01    7.1833442078E-01    6.9142580575E-01    6.6383430700E-01    6.3568299340E-01    6.0709556689E-01    5.7819559939E-01    5.4910577999E-01    5.1994717767E-01    4.9083852505E-01    4.6189552825E-01    4.3323020771E-01    4.0495027457E-01    3.7715854680E-01    3.4995240901E-01    3.2342331938E-01    2.9765636668E-01    2.7272988023E-01    2.487150 [...]
+    5.3321759225E+00    5.2174273503E+00    5.0938687916E+00    4.9620868575E+00    4.8227025628E+00    4.6763673328E+00    4.5237588379E+00    4.3655766862E+00    4.2025380081E+00    4.0353729649E+00    3.8648202147E+00    3.6916223692E+00    3.5165214750E+00    3.3402545514E+00    3.1635492177E+00    2.9871194402E+00    2.8116614301E+00    2.6378497190E+00    2.4663334407E+00    2.2977328427E+00    2.1326360512E+00    1.9715961099E+00    1.8151283100E+00    1.6637078292E+00    1.517767 [...]
+    1.2373964585E+01    1.2107700958E+01    1.1821039229E+01    1.1515336872E+01    1.1192030783E+01    1.0852628070E+01    1.0498696457E+01    1.0131854353E+01    9.7537606790E+00    9.3661045175E+00    8.9705946609E+00    8.5689491403E+00    8.1628848081E+00    7.7541070497E+00    7.3442996983E+00    6.9351152253E+00    6.5281652729E+00    6.1250115960E+00    5.7271574750E+00    5.3360396552E+00    4.9530208678E+00    4.5793829778E+00    4.2163208025E+00    3.8649366362E+00    3.526235 [...]
+    2.0352657349E+01    1.9914727731E+01    1.9443285372E+01    1.8940559923E+01    1.8408911319E+01    1.7850814691E+01    1.7268844630E+01    1.6665658917E+01    1.6043981843E+01    1.5406587242E+01    1.4756281362E+01    1.4095885697E+01    1.3428219913E+01    1.2756084974E+01    1.2082246612E+01    1.1409419234E+01    1.0740250399E+01    1.0077305953E+01    9.4230559431E+00    8.7798613880E+00    8.1499619964E+00    7.5354649158E+00    6.9383345751E+00    6.3603836833E+00    5.803265 [...]
+    2.7576508144E+01    2.6983160057E+01    2.6344438058E+01    2.5663360411E+01    2.4943121606E+01    2.4187071958E+01    2.3398696333E+01    2.2581592153E+01    2.1739446848E+01    2.0876014920E+01    1.9995094780E+01    1.9100505549E+01    1.8196063958E+01    1.7285561549E+01    1.6372742311E+01    1.5461280926E+01    1.4554761766E+01    1.3656658798E+01    1.2770316519E+01    1.1898932059E+01    1.1045538563E+01    1.0212989960E+01    9.4039472086E+00    8.6208661046E+00    7.865986 [...]
+    3.2625545808E+01    3.1923576630E+01    3.1167956783E+01    3.0362254618E+01    2.9510246698E+01    2.8615893706E+01    2.7683315320E+01    2.6716764235E+01    2.5720599532E+01    2.4699259591E+01    2.3657234740E+01    2.2599039845E+01    2.1529187036E+01    2.0452158772E+01    1.9372381424E+01    1.8294199579E+01    1.7221851226E+01    1.6159444015E+01    1.5110932727E+01    1.4080098122E+01    1.3070527302E+01    1.2085595700E+01    1.1128450820E+01    1.0201997812E+01    9.308886 [...]
+    3.4591985559E+01    3.3847721690E+01    3.3046602237E+01    3.2192408264E+01    3.1289141336E+01    3.0340998017E+01    2.9352343267E+01    2.8327682945E+01    2.7271635617E+01    2.6188903875E+01    2.5084245388E+01    2.3962443878E+01    2.2828280251E+01    2.1686504071E+01    2.0541805599E+01    1.9398788577E+01    1.8261943958E+01    1.7135624755E+01    1.6024022186E+01    1.4931143268E+01    1.3860790012E+01    1.2816540338E+01    1.1801730844E+01    1.0819441522E+01    9.872482 [...]
+    3.3209511836E+01    3.2495006772E+01    3.1725945406E+01    3.0905955467E+01    3.0038876136E+01    2.9128733589E+01    2.8179715502E+01    2.7196144689E+01    2.6182452079E+01    2.5143149225E+01    2.4082800547E+01    2.3005995516E+01    2.1917320974E+01    2.0821333793E+01    1.9722534056E+01    1.8625338976E+01    1.7534057697E+01    1.6452867180E+01    1.5385789327E+01    1.4336669491E+01    1.3309156511E+01    1.2306684414E+01    1.1332455873E+01    1.0389427533E+01    9.480297 [...]
+    2.8855879840E+01    2.8235056816E+01    2.7566854996E+01    2.6854424446E+01    2.6101098729E+01    2.5310373701E+01    2.4485885384E+01    2.3631387101E+01    2.2750726037E+01    2.1847819385E+01    2.0926630273E+01    1.9991143628E+01    1.9045342164E+01    1.8093182662E+01    1.7138572702E+01    1.6185348028E+01    1.5237250689E+01    1.4297908106E+01    1.3370813222E+01    1.2459305845E+01    1.1566555319E+01    1.0695544635E+01    9.8490560612E+00    9.0296584041E+00    8.239695 [...]
+    2.2437365002E+01    2.1954646248E+01    2.1435110996E+01    2.0881206687E+01    2.0295523235E+01    1.9680776562E+01    1.9039791435E+01    1.8375483717E+01    1.7690842177E+01    1.6988909981E+01    1.6272766005E+01    1.5545506113E+01    1.4810224508E+01    1.4069995333E+01    1.3327854603E+01    1.2586782639E+01    1.1849687096E+01    1.1119386713E+01    1.0398595895E+01    9.6899102269E+00    8.9957930156E+00    8.3185629399E+00    7.6603828908E+00    7.0232500628E+00    6.408987 [...]
+    1.5184444709E+01    1.4857777066E+01    1.4506215587E+01    1.4131414796E+01    1.3735125439E+01    1.3319183375E+01    1.2885497985E+01    1.2436040202E+01    1.1972830221E+01    1.1497925019E+01    1.1013405733E+01    1.0521365024E+01    1.0023894493E+01    9.5230722543E+00    9.0209507413E+00    8.5195448436E+00    8.0208204463E+00    7.5266834562E+00    7.0389693867E+00    6.5594335710E+00    6.0897420661E+00    5.6314633066E+00    5.1860605575E+00    4.7548852115E+00    4.339170 [...]
+    8.4021925866E+00    8.2214436641E+00    8.0269390597E+00    7.8195927211E+00    7.6003716692E+00    7.3702898744E+00    7.1304018731E+00    6.8817961671E+00    6.6255884585E+00    6.3629147665E+00    6.0949244778E+00    5.8227733800E+00    5.5476167286E+00    5.2706023956E+00    4.9928641505E+00    4.7155151174E+00    4.4396414570E+00    4.1662963130E+00    3.8964940667E+00    3.6312049358E+00    3.3713499530E+00    3.1177963559E+00    2.8713534168E+00    2.6327687359E+00    2.402725 [...]
+    3.2241223674E+00    3.1547728061E+00    3.0801603423E+00    3.0006344090E+00    2.9165646663E+00    2.8283386722E+00    2.7363594545E+00    2.6410430009E+00    2.5428156864E+00    2.4421116558E+00    2.3393701800E+00    2.2350330069E+00    2.1295417233E+00    2.0233351478E+00    1.9168467735E+00    1.8105022767E+00    1.7047171098E+00    1.5998941952E+00    1.4964217338E+00    1.3946711446E+00    1.2949951468E+00    1.1977259985E+00    1.1031739001E+00    1.0116255748E+00    9.233430 [...]
+    4.1428298952E-01    4.0537648543E-01    3.9580240345E-01    3.8560493237E-01    3.7483078271E-01    3.6352889889E-01    3.5175015940E-01    3.3954706695E-01    3.2697343085E-01    3.1408404386E-01    3.0093435570E-01    2.8758014562E-01    2.7407719614E-01    2.6048097029E-01    2.4684629459E-01    2.3322704974E-01    2.1967587134E-01    2.0624386237E-01    1.9298031947E-01    1.7993247475E-01    1.6714525468E-01    1.5466105764E-01    1.4251955152E-01    1.3075749232E-01    1.194085 [...]
+    2.5060330760E-01    2.4520613335E-01    2.3938693300E-01    2.3317393156E-01    2.2659704287E-01    2.1968767123E-01    2.1247850422E-01    2.0500329850E-01    1.9729666011E-01    1.8939382106E-01    1.8133041395E-01    1.7314224628E-01    1.6486507624E-01    1.5653439162E-01    1.4818519350E-01    1.3985178636E-01    1.3156757604E-01    1.2336487715E-01    1.1527473114E-01    1.0732673634E-01    9.9548891178E-02    9.1967451431E-02    8.4606802604E-02    7.7489348024E-02    7.063541 [...]
+    2.5054680810E+00    2.4515460684E+00    2.3934763067E+00    2.3315350981E+00    2.2660149827E+00    2.1972228516E+00    2.1254779781E+00    2.0511099819E+00    1.9744567426E+00    1.8958622766E+00    1.8156745944E+00    1.7342435537E+00    1.6519187243E+00    1.5690472800E+00    1.4859719330E+00    1.4030289255E+00    1.3205460927E+00    1.2388410107E+00    1.1582192418E+00    1.0789726894E+00    1.0013780728E+00    9.2569553220E-01    8.5216737163E-01    7.8101694836E-01    7.124477 [...]
+    6.5206988276E+00    6.3803806723E+00    6.2293030323E+00    6.0681821005E+00    5.8977760126E+00    5.7188799829E+00    5.5323212304E+00    5.3389537340E+00    5.1396528541E+00    4.9353098624E+00    4.7268264199E+00    4.5151090429E+00    4.3010635983E+00    4.0855898676E+00    3.8695762189E+00    3.6538944243E+00    3.4393946590E+00    3.2269007180E+00    3.0172054812E+00    2.8110666578E+00    2.6092028389E+00    2.4122898821E+00    2.2209576504E+00    2.0357871259E+00    1.857307 [...]
+    1.1357039246E+01    1.1112663239E+01    1.0849575721E+01    1.0569021764E+01    1.0272319239E+01    9.9608503803E+00    9.6360529882E+00    9.2994113374E+00    8.9524468510E+00    8.5967086167E+00    8.2337638118E+00    7.8651881084E+00    7.4925561265E+00    7.1174320071E+00    6.7413601697E+00    6.3658563215E+00    5.9923987803E+00    5.6224201714E+00    5.2572995551E+00    4.8983550362E+00    4.5468369058E+00    4.2039213564E+00    3.8707048111E+00    3.5481988989E+00    3.237326 [...]
+    1.5985892867E+01    1.5641928137E+01    1.5271650322E+01    1.4876809919E+01    1.4459259675E+01    1.4020942741E+01    1.3563880330E+01    1.3090158953E+01    1.2601917328E+01    1.2101333072E+01    1.1590609261E+01    1.1071960959E+01    1.0547601821E+01    1.0019730855E+01    9.4905194489E+00    8.9620987450E+00    8.4365474549E+00    7.9158801981E+00    7.4020364422E+00    6.8968701206E+00    6.4021399921E+00    5.9195008070E+00    5.4504953314E+00    4.9965472778E+00    4.558955 [...]
+    1.9485375417E+01    1.9066125037E+01    1.8614824029E+01    1.8133604233E+01    1.7624721914E+01    1.7090543364E+01    1.6533529882E+01    1.5956222251E+01    1.5361224819E+01    1.4751189307E+01    1.4128798463E+01    1.3496749682E+01    1.2857738701E+01    1.2214443502E+01    1.1569508527E+01    1.0925529315E+01    1.0285037678E+01    9.6504875099E+00    9.0242413270E+00    8.4085576265E+00    7.8055791526E+00    7.2173221379E+00    6.6456665880E+00    6.0923476677E+00    5.558948 [...]
+    2.1204342040E+01    2.0748117204E+01    2.0257035431E+01    1.9733414894E+01    1.9179708976E+01    1.8598490634E+01    1.7992436080E+01    1.7364307921E+01    1.6716937870E+01    1.6053209156E+01    1.5376038767E+01    1.4688359658E+01    1.3993103042E+01    1.3293180896E+01    1.2591468818E+01    1.1890789331E+01    1.1193895783E+01    1.0503456913E+01    9.8220422357E+00    9.1521082924E+00    8.4959858995E+00    7.8558684479E+00    7.2338013378E+00    6.6316726069E+00    6.051204 [...]
+    2.0866187432E+01    2.0417248646E+01    1.9934028690E+01    1.9418807137E+01    1.8873996433E+01    1.8302126541E+01    1.7705828909E+01    1.7087819907E+01    1.6450883845E+01    1.5797855691E+01    1.5131603636E+01    1.4455011603E+01    1.3770961860E+01    1.3082317829E+01    1.2391907243E+01    1.1702505744E+01    1.1016821057E+01    1.0337477830E+01    9.6670032615E+00    9.0078135936E+00    8.3622015701E+00    7.7323249341E+00    7.1201960364E+00    6.5276726159E+00    5.956449 [...]
+    1.8597010688E+01    1.8196903369E+01    1.7766261652E+01    1.7307115670E+01    1.6821613813E+01    1.6312009067E+01    1.5780644749E+01    1.5229939773E+01    1.4662373545E+01    1.4080470589E+01    1.3486785033E+01    1.2883885054E+01    1.2274337402E+01    1.1660692114E+01    1.1045467520E+01    1.0431135654E+01    9.8201081644E+00    9.2147228278E+00    8.6172307526E+00    8.0297843571E+00    7.4544262018E+00    6.8930787467E+00    6.3475350951E+00    5.8194507793E+00    5.310336 [...]
+    1.4877570156E+01    1.4557494326E+01    1.4213008566E+01    1.3845735540E+01    1.3457392363E+01    1.3049779687E+01    1.2624770326E+01    1.2184297486E+01    1.1730342709E+01    1.1264923602E+01    1.0790081451E+01    1.0307868805E+01    9.8203371219E+00    9.3295245601E+00    8.8374440110E+00    8.3460714478E+00    7.8573346753E+00    7.3731025584E+00    6.8951747999E+00    6.4252723373E+00    5.9650284189E+00    5.5159804176E+00    5.0795624314E+00    4.6570987136E+00    4.249797 [...]
+    1.0432496708E+01    1.0208060604E+01    9.9665238464E+00    9.7090229605E+00    9.4367605564E+00    9.1509977012E+00    8.8530459611E+00    8.5442591757E+00    8.2260250258E+00    7.8997564545E+00    7.5668830061E+00    7.2288421439E+00    6.8870706106E+00    6.5429958916E+00    6.1980278439E+00    5.8535505456E+00    5.5109144270E+00    5.1714287328E+00    4.8363543689E+00    4.5068971810E+00    4.1842017062E+00    3.8693454406E+00    3.5633336546E+00    3.2670947887E+00    2.981476 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_ellipsoid_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_ellipsoid_BA.inp
new file mode 100644
index 0000000..ba3b4a0
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_ellipsoid_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_ellipsoid_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+ellipsoid                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_sphere_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_sphere_BA.ima
new file mode 100644
index 0000000..4092612
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_sphere_BA.ima
@@ -0,0 +1,100 @@
+    3.0484756332E+04    2.8908400179E+04    2.7260636541E+04    2.5559539667E+04    2.3823218240E+04    2.2069528983E+04    2.0315803010E+04    1.8578590206E+04    1.6873426397E+04    1.5214627420E+04    1.3615113522E+04    1.2086266707E+04    1.0637822839E+04    9.2777994600E+03    8.0124594500E+03    6.8463098100E+03    5.7821340932E+03    4.8210562807E+03    3.9626332630E+03    3.2049725446E+03    2.5448713452E+03    1.9779729466E+03    1.4989359188E+03    1.1016117666E+03    7.792265 [...]
+    3.0407346352E+04    2.8834409660E+04    2.7190244646E+04    2.5492890880E+04    2.3760421892E+04    2.2010659269E+04    2.0260899486E+04    1.8527658746E+04    1.6826440577E+04    1.5171530302E+04    1.3575819780E+04    1.2050665064E+04    1.0605778747E+04    9.2491579862E+03    7.9870482999E+03    6.8239424359E+03    5.7626128337E+03    4.8041754754E+03    3.9481822932E+03    3.1927387512E+03    2.5346427824E+03    1.9695409343E+03    1.4920973612E+03    1.0961712125E+03    7.749979 [...]
+    3.0176119617E+04    2.8613403152E+04    2.6979993641E+04    2.5293826969E+04    2.3572871558E+04    2.1834843941E+04    2.0096937031E+04    1.8375566337E+04    1.6686138840E+04    1.5042848640E+04    1.3458502751E+04    1.1944379655E+04    1.0510122411E+04    9.1636672620E+03    7.9112078575E+03    6.7571943765E+03    5.7043660775E+03    4.7538150774E+03    3.9050785344E+03    3.1562558640E+03    2.5041471844E+03    1.9444088570E+03    1.4717217813E+03    1.0799680092E+03    7.624112 [...]
+    2.9794067143E+04    2.8248257820E+04    2.6632640249E+04    2.4964978655E+04    2.3263067451E+04    2.1544449264E+04    1.9826145587E+04    1.8124405263E+04    1.6454475496E+04    1.4830399437E+04    1.3264843721E+04    1.1768958516E+04    1.0352271882E+04    9.0226193491E+03    7.7861088397E+03    6.6471202133E+03    5.6083379589E+03    4.6708148524E+03    3.8340637650E+03    3.0961742721E+03    2.4539502801E+03    1.9030645646E+03    1.4382259070E+03    1.0533544254E+03    7.417607 [...]
+    2.9266112393E+04    2.7743709421E+04    2.6152721668E+04    2.4510675420E+04    2.2835123923E+04    2.1143368803E+04    1.9452194022E+04    1.7777617518E+04    1.6134665163E+04    1.4537171050E+04    1.2997607432E+04    1.1526946857E+04    1.0134558242E+04    8.8281378066E+03    7.6136749587E+03    6.4954524177E+03    5.4760791022E+03    4.5565536140E+03    3.7363555217E+03    3.0135611232E+03    2.3849799323E+03    1.8463078219E+03    1.3922925497E+03    1.0169073054E+03    7.135279 [...]
+    2.8599020387E+04    2.7106264453E+04    2.5546470935E+04    2.3936864254E+04    2.2294691730E+04    2.0636949315E+04    1.8980119749E+04    1.7339928203E+04    1.5731119978E+04    1.4167264223E+04    1.2660586925E+04    1.1221835675E+04    9.8601779286E+03    8.5831336509E+03    7.3965424190E+03    6.3045642717E+03    5.3097128389E+03    4.4129185966E+03    3.6136194773E+03    2.9098755477E+03    2.2985040406E+03    1.7752307192E+03    1.3348533493E+03    9.7141297527E+02    6.783687 [...]
+    2.7801273353E+04    2.6344079952E+04    2.4821701142E+04    2.3250998510E+04    2.1648851714E+04    2.0031889420E+04    1.8416232494E+04    1.6817254474E+04    1.5249363773E+04    1.3725811511E+04    1.2258528177E+04    1.0857991559E+04    9.5331276280E+03    8.2912452278E+03    7.1380046352E+03    6.0774192751E+03    5.1118891277E+03    4.2422636957E+03    3.4679317924E+03    2.7869349024E+03    2.1961004502E+03    1.6911910117E+03    1.2670653058E+03    9.1784672666E+02    6.370952 [...]
+    2.6882915695E+04    2.5466813670E+04    2.3987661136E+04    2.2461899405E+04    2.0905982351E+04    1.9336113370E+04    1.7767994440E+04    1.6216592169E+04    1.4695925233E+04    1.3218876979E+04    1.1797036328E+04    1.0440569381E+04    9.1581233218E+03    7.9567634749E+03    6.8419435435E+03    5.8175083101E+03    4.8857273508E+03    4.0473576523E+03    3.3017324287E+03    2.6468729369E+03    2.0796196836E+03    1.5957791233E+03    1.1902817573E+03    8.5734746925E+02    5.906539 [...]
+    2.5855371767E+04    2.4485447985E+04    2.3054865950E+04    2.1579593306E+04    2.0075604156E+04    1.8558622819E+04    1.7043879520E+04    1.5545882739E+04    1.4078212543E+04    1.2653338577E+04    1.1282465750E+04    9.9754099678E+03    8.7405054431E+03    7.5845444042E+03    6.5127492087E+03    5.5287761384E+03    4.6347494386E+03    3.8313235173E+03    3.1177706426E+03    2.4920909907E+03    1.9511415030E+03    1.4907797253E+03    1.1060186209E+03    7.9118828052E+02    5.401004 [...]
+    2.4731240497E+04    2.3412091488E+04    2.2034905782E+04    2.0615128472E+04    1.9168204503E+04    1.7709329962E+04    1.6253215082E+04    1.4813863564E+04    1.3404372425E+04    1.2036755918E+04    1.0721796519E+04    9.4689251865E+03    8.2861324323E+03    7.1799109350E+03    6.1552297048E+03    5.2155390625E+03    4.3628050112E+03    3.5975709442E+03    2.9190440769E+03    2.3252035119E+03    1.8129264697E+03    1.3781289410E+03    1.0159168427E+03    7.2074369691E+02    4.865708 [...]
+    2.3524071408E+04    2.2259762647E+04    2.0940237773E+04    1.9580375348E+04    1.8195046785E+04    1.6798875835E+04    1.5406009530E+04    1.4029905090E+04    1.2683136835E+04    1.1377226557E+04    1.0122500227E+04    8.9279731812E+03    7.8012652381E+03    6.7485464519E+03    5.7745134747E+03    4.8823957907E+03    4.0739904151E+03    3.3497230342E+03    2.7087330248E+03    2.1489793293E+03    1.6673637982E+03    1.2598683457E+03    9.2170210101E+02    6.4745467844E+02    4.312517 [...]
+    2.2248126933E+04    2.1042160303E+04    1.9783965181E+04    1.8487814853E+04    1.7167968179E+04    1.5838437847E+04    1.4512769844E+04    1.3203838475E+04    1.1923660833E+04    1.0683234076E+04    9.4923982406E+03    8.3597266823E+03    7.2924455046E+03    6.2963826411E+03    5.3759465379E+03    4.5341336943E+03    3.7725636712E+03    3.0915395808E+03    2.4901315502E+03    1.9662802074E+03    1.5169168883E+03    1.1380970067E+03    8.2514287909E+02    5.7279223969E+02    3.753487 [...]
+    2.0918136194E+04    1.9773425996E+04    1.8579608783E+04    1.7350319315E+04    1.6099170473E+04    1.4839530811E+04    1.3584313043E+04    1.2345777637E+04    1.1135355285E+04    9.9634914578E+03    8.8395156718E+03    7.7715374548E+03    6.7663703069E+03    5.8294842682E+03    4.9649870151E+03    4.1756327378E+03    3.4628574285E+03    2.8268386328E+03    2.2665772165E+03    1.7799982745E+03    1.3640679693E+03    1.0149228508E+03    7.2800805894E+02    4.9822077017E+02    3.200552 [...]
+    1.9549045486E+04    1.8467903225E+04    1.7340875438E+04    1.6180930783E+04    1.5001008531E+04    1.3813805858E+04    1.2631575767E+04    1.1465939657E+04    1.0327718157E+04    9.2267832729E+03    8.1719343929E+03    7.1707999998E+03    6.2297663407E+03    5.3539335998E+03    4.5470994725E+03    3.8117693904E+03    3.1491920462E+03    2.5594183151E+03    2.0413811876E+03    1.5929939210E+03    1.2112632984E+03    8.9241465342E+02    6.3202518759E+02    4.2516206595E+02    2.665218 [...]
+    1.8155770749E+04    1.7139898729E+04    1.6081428718E+04    1.4992641472E+04    1.3885780918E+04    1.2772851542E+04    1.1665426092E+04    1.0574467451E+04    9.5101681097E+03    8.4818101900E+03    7.4976483814E+03    6.5648175900E+03    5.6892664408E+03    4.8757171385E+03    4.1276515552E+03    3.4473227927E+03    2.8357908886E+03    2.2929808126E+03    1.8177604305E+03    1.4080357331E+03    1.0608603188E+03    7.7255590765E+02    5.3884053719E+02    3.5496106343E+02    2.158266 [...]
+    1.6752957125E+04    1.5803450757E+04    1.4814666397E+04    1.3798180920E+04    1.2765527101E+04    1.1728001379E+04    1.0696481619E+04    9.6812585271E+03    8.6918840000E+03    7.7370391959E+03    6.8244245781E+03    5.9606736141E+03    5.1512911968E+03    4.4006172390E+03    3.7118152813E+03    3.0868853597E+03    2.5266998292E+03    2.0310603330E+03    1.5987736707E+03    1.2277439492E+03    9.1507811469E+02    6.5720176326E+02    4.4998201382E+02    2.8885420465E+02    1.689492 [...]
+    1.5354750453E+04    1.4472108989E+04    1.3553509317E+04    1.2609814221E+04    1.1651835392E+04    1.0690151777E+04    9.7349375839E+03    8.7958034187E+03    7.8816536613E+03    7.0005627128E+03    6.1596722441E+03    5.3651110155E+03    4.6219382566E+03    3.9341110037E+03    3.3044752056E+03    2.7347798483E+03    2.2257128161E+03    1.7769567348E+03    1.3872626195E+03    1.0545388072E+03    7.7595238307E+02    5.4804012332E+02    3.6682587481E+02    2.2794127576E+02    1.267467 [...]
+    1.3974585192E+04    1.3158730479E+04    1.2310205807E+04    1.1439155325E+04    1.0555665467E+04    9.6695940212E+03    8.7904084917E+03    7.9270370617E+03    7.0877350737E+03    6.2799695200E+03    5.5103235362E+03    4.7844223605E+03    4.1068816687E+03    3.4812786274E+03    2.9101454510E+03    2.3949847129E+03    1.9363051595E+03    1.5336763223E+03    1.1857998297E+03    8.9059499532E+02    6.4529600433E+02    4.4655785173E+02    2.9056809143E+02    1.7316144736E+02    8.993440 [...]
+    1.2624992744E+04    1.1875295433E+04    1.1096155364E+04    1.0296998981E+04    9.4871888598E+03    8.6758635480E+03    7.8717863290E+03    7.0832060341E+03    6.3177326477E+03    5.5822300397E+03    4.8827276890E+03    4.2243527532E+03    3.6112833129E+03    3.0467230801E+03    2.5328973325E+03    2.0710693272E+03    1.6615759702E+03    1.3038810950E+03    9.9664433056E+02    7.3780323174E+02    5.2466611586E+02    3.5401288654E+02    2.2220104848E+02    1.2527411271E+02    5.906966 [...]
+    1.1317433632E+04    1.0632746176E+04    9.9217547828E+03    9.1931743568E+03    8.4556503355E+03    7.7176092702E+03    6.9871179667E+03    6.2717541068E+03    5.5784909275E+03    4.9135981377E+03    4.2825608031E+03    3.6900174484E+03    3.1397181259E+03    2.6345026876E+03    2.1762990000E+03    1.7661403575E+03    1.4042009070E+03    1.0898474897E+03    8.2170596429E+02    5.9773978529E+02    4.1533839922E+02    2.7141287378E+02    1.6249610749E+02    8.4844970269E+01    3.454180 [...]
+    1.0062156314E+04    9.4408519606E+03    8.7962692998E+03    8.1364228008E+03    7.4692524853E+03    6.8024851621E+03    6.1435038420E+03    5.4992280646E+03    4.8760075412E+03    4.2795311398E+03    3.7147528117E+03    3.1858356061E+03    2.6961144396E+03    2.2480778116E+03    1.8433681798E+03    1.4828002610E+03    1.1663961002E+03    8.9343537689E+02    6.6251909234E+02    4.7164451654E+02    3.1828907724E+02    1.9950074174E+02    1.1199238362E+02    5.2237636703E+01    1.656581 [...]
+    8.8680847417E+03    8.3081016573E+03    7.7277306932E+03    7.1343015723E+03    6.5350652686E+03    5.9370657376E+03    5.3470194425E+03    4.7712052195E+03    4.2153667157E+03    3.6846292733E+03    3.1834327330E+03    2.7154811968E+03    2.2837103441E+03    1.8902724415E+03    1.5365387417E+03    1.2231185451E+03    9.4989380267E+02    7.1606778903E+02    5.2022607365E+02    3.6040777405E+02    2.3418489376E+02    1.3874743179E+02    7.0991901076E+01    2.7610909694E+01    5.181538 [...]
+    7.7427360332E+03    7.2416256258E+03    6.7228635674E+03    6.1931147150E+03    5.6589616002E+03    5.1267864364E+03    4.6026605333E+03    4.0922434761E+03    3.6006941372E+03    3.1325952420E+03    2.6918928392E+03    2.2818516132E+03    1.9050265596E+03    1.5632511179E+03    1.2576414398E+03    9.8861607674E+02    7.5593000205E+02    5.5872155863E+02    3.9557064550E+02    2.6456623158E+02    1.6338112160E+02    8.9351795753E+01    3.9561105841E+01    1.0921632258E+01    2.575885 [...]
+    6.6921689165E+03    6.2471473702E+03    5.7870403763E+03    5.3178715661E+03    4.8455794284E+03    4.3759093163E+03    3.9143124718E+03    3.4658542444E+03    3.0351334036E+03    2.6262141273E+03    2.2425718895E+03    1.8870540896E+03    1.5618558743E+03    1.2685112012E+03    1.0078988087E+03    7.8026238740E+02    5.8524390674E+02    4.2192875162E+02    2.8890106716E+02    1.8430750543E+02    1.0592742033E+02    5.1247467003E+01    1.7538531857E+01    1.9329469586E+00    1.500026 [...]
+    5.7209628321E+03    5.3289648552E+03    4.9242650404E+03    4.5122727370E+03    4.0983101122E+03    3.6875138321E+03    3.2847433686E+03    2.8944979333E+03    2.5208437790E+03    2.1673533088E+03    1.8370570990E+03    1.5324095847E+03    1.2552687904E+03    1.0068901166E+03    7.8793383218E+02    5.9848558303E+02    4.3808891032E+02    3.0578849721E+02    2.0018262745E+02    1.1948315502E+02    6.1581151373E+01    2.4116319718E+01    4.5482441713E+00    2.2757448663E-01    8.465331 [...]
+    4.8322269002E+03    4.4899606768E+03    4.1371843503E+03    3.7787227545E+03    3.4193122880E+03    3.0635118961E+03    2.7156202886E+03    2.3796012256E+03    2.0590184561E+03    1.7569816141E+03    1.4761040645E+03    1.2184733592E+03    9.8563462136E+02    7.7858683180E+02    5.9779165821E+02    4.4319415177E+02    3.1425434731E+02    2.0998854951E+02    1.2901887457E+02    6.9629450276E+01    2.9827560329E+01    7.4079534831E+00    1.8524454284E-02    5.2256110924E+00    2.057723 [...]
+    4.0276372770E+03    3.7316396369E+03    3.4271257224E+03    3.1183679531E+03    2.8095498406E+03    2.5046858581E+03    2.2075471623E+03    1.9215948314E+03    1.6499220572E+03    1.3952064654E+03    1.1596734487E+03    9.4507108789E+02    7.5265691898E+02    5.8319648768E+02    4.3697332341E+02    3.1380967553E+02    2.1309709036E+02    1.3383567598E+02    7.4680709598E+01    3.3995093145E+01    9.9060602537E+00    3.6448358778E-01    3.2051256479E+00    1.6206217567E+01    3.714683 [...]
+    3.3075008196E+03    3.0541916749E+03    2.7941593063E+03    2.5311576612E+03    2.2688520671E+03    2.0107475460E+03    1.7601225996E+03    1.5199699709E+03    1.2929456811E+03    1.0813273879E+03    8.8698285080E+02    7.1134899611E+02    5.5542178617E+02    4.1975680287E+02    3.0448017302E+02    2.0930919795E+02    1.3358180879E+02    7.6293759484E+01    3.6142296569E+01    1.1574912470E+01    8.4170046973E-01    2.0497856105E+00    1.3218307055E+01    3.2332472266E+01    5.739528 [...]
+    2.6708424409E+03    2.4565775973E+03    2.2371819422E+03    2.0159262432E+03    1.7959936683E+03    1.5804160739E+03    1.3720153875E+03    1.1733514440E+03    9.8667743468E+02    8.1390390281E+02    6.5657196984E+02    5.1583621419E+02    3.9245735413E+02    2.8680461856E+02    1.9886743118E+02    1.2827579146E+02    7.4328517833E+01    3.6028329643E+01    1.2122590158E+01    1.1484164920E+00    1.4807866122E+00    1.1382239497E+01    2.9052772142E+01    5.2678584848E+01    8.047841 [...]
+    2.1155130856E+03    1.9366346076E+03    1.7540200502E+03    1.5704931657E+03    1.3887918191E+03    1.2115117581E+03    1.0410551099E+03    8.7958482386E+02    7.2898608800E+02    5.9083554628E+02    4.6637890792E+02    3.5651730224E+02    2.6180248403E+02    1.8244075039E+02    1.1830519437E+02    6.8955701944E+01    3.3665901898E+01    1.1456109445E+01    1.1311674492E+00    1.3219878694E+00    1.0529532364E+01    2.7169945941E+01    4.9619570819E+01    7.6258617809E+01    1.055123 [...]
+    1.6383148992E+03    1.4911982955E+03    1.3415482030E+03    1.1917779348E+03    1.0442172716E+03    9.0106320763E+02    7.6433506633E+02    6.3583506819E+02    5.1711526294E+02    4.0945154559E+02    3.1382526611E+02    2.3091272123E+02    1.6108259219E+02    1.0440116946E+02    6.0644992632E+01    2.9320336213E+01    9.6887955967E+00    7.9807734699E-01    1.5169775924E+00    1.0573445120E+01    2.6594573280E+01    4.8147347981E+01    7.3778997340E+01    1.0205584062E+02    1.315996 [...]
+    1.2351399063E+03    1.1162375002E+03    9.9581990229E+02    8.7592653787E+02    7.5851624007E+02    6.4542445729E+02    5.3832448413E+02    4.3869367113E+02    3.4778541395E+02    2.6660754525E+02    1.9590756163E+02    1.3616491578E+02    8.7590400566E+01    5.0132449900E+01    2.3489989833E+01    7.1312959089E+00    3.1815596282E-01    2.1345047548E+00    1.1518592140E+01    2.7297672235E+01    4.8224158944E+01    7.3012183748E+01    1.0037351439E+02    1.2905184636E+02    1.578545 [...]
+    9.0111835802E+02    8.0699831471E+02    7.1220694048E+02    6.1844589346E+02    5.2733969987E+02    4.4039890755E+02    3.5898692715E+02    2.8429139940E+02    2.1730078503E+02    1.5878671211E+02    1.0929244171E+02    6.9127629861E+01    3.8369379422E+01    1.6869394433E+01    4.2668774118E+00    6.6523725406E-03    3.3618573023E+00    1.3460433634E+01    2.9314549908E+01    4.9852034665E+01    7.3948860912E+01    1.0046172171E+02    1.2825976283E+02    1.5625459255E+02    1.834277 [...]
+    6.3077286324E+02    5.5815345890E+02    4.8554369666E+02    4.1434278393E+02    3.4587670763E+02    2.8136682035E+02    2.2190179099E+02    1.6841365024E+02    1.2165853122E+02    8.2202559060E+01    5.0413185430E+01    2.6456098994E+01    1.0297677238E+01    1.7127826990E+00    2.9755355782E-01    5.4866987501E+00    1.6574685686E+01    3.2740107719E+01    5.3072441512E+01    7.6600353311E+01    1.0232068901E+02    1.2922728587E+02    1.5633877332E+02    1.8272458467E+02    2.075284 [...]
+    4.1817446523E+02    3.6395330106E+02    3.1027277039E+02    2.5826380832E+02    2.0898841864E+02    1.6341318707E+02    1.2238584941E+02    8.6615545490E+01    5.6657271067E+01    3.2900907790E+01    1.5565068601E+01    4.6958482137E+00    1.7041988447E-01    1.7052753552E+00    8.8687691591E+00    2.1097505572E+01    3.7716000084E+01    5.7958960461E+01    8.0995467687E+01    1.0595429600E+02    1.3194959473E+02    1.5810616271E+02    1.8358357802E+02    2.0759850022E+02    2.294445 [...]
+    2.5709697861E+02    2.1837495821E+02    1.8058850946E+02    1.4463304186E+02    1.1133962506E+02    8.1452935869E+01    5.5611965270E+01    3.4334024835E+01    1.8002484953E+01    6.8585580920E+00    9.9731237612E-01    3.6796877222E-01    4.7784031316E+00    1.3903646633E+01    2.7298058785E+01    4.4410739848E+01    6.4603657612E+01    8.7171889613E+01    1.1136532827E+02    1.3641116436E+02    1.6153645453E+02    1.8599009090E+02    2.0906352484E+02    2.3010965041E+02    2.485593 [...]
+    1.4116613554E+02    1.1526614036E+02    9.0575218569E+01    6.7784318503E+01    4.7524865970E+01    3.0350668390E+01    1.6722298865E+01    6.9944167565E+00    1.4063850808E+00    7.6438029864E-02    2.9995378678E+00    1.0048943128E+01    2.0981393309E+01    3.5445702948E+01    5.2994453692E+01    7.3098380074E+01    9.5162966026E+01    1.1854670719E+02    1.4258045052E+02    1.6658719868E+02    1.8990176299E+02    2.1188966465E+02    2.3196471915E+02    2.4960479149E+02    2.643652 [...]
+    6.4000406935E+01    4.8480714444E+01    3.4337142207E+01    2.2085352899E+01    1.2186454262E+01    5.0324035797E+00    9.3362753042E-01    1.0923938444E-01    2.6801491775E+00    8.6652670637E+00    1.7980898816E+01    3.0443328806E+01    4.5774483238E+01    6.3610468324E+01    8.3512687744E+01    1.0498116396E+02    1.2746962147E+02    1.5040183869E+02    1.7318874077E+02    1.9524568876E+02    2.1600942170E+02    2.3495412752E+02    2.5160615424E+02    2.6555692442E+02    2.764736 [...]
+    1.9340746588E+01    1.2003338960E+01    6.1176823006E+00    2.0512777965E+00    1.2211599990E-01    5.8714774814E-01    3.6327218687E+00    9.3673048571E+00    1.7816720697E+01    2.8922064350E+01    4.2540353103E+01    5.8447888996E+01    7.6346216049E+01    9.5870471002E+01    1.1659984864E+02    1.3806983505E+02    1.5978580652E+02    1.8123755022E+02    2.0191423620E+02    2.2131935968E+02    2.3898517843E+02    2.5448619091E+02    2.6745123749E+02    2.7757385647E+02    2.846205 [...]
+    1.1669413376E+00    6.0946885387E-02    4.0572800983E-01    2.4455786758E+00    6.3803328304E+00    1.2356493319E+01    2.0460095187E+01    3.0711559277E+01    4.3062723717E+01    5.7396166246E+01    7.3526851958E+01    9.1206061760E+01    1.1012747928E+02    1.2993524095E+02    1.5023368782E+02    1.7059850086E+02    1.9058885582E+02    2.0976020038E+02    2.2767723717E+02    2.4392669096E+02    2.5812944739E+02    2.6995167386E+02    2.7911456903E+02    2.8540243518E+02    2.886688 [...]
+    3.7987254073E+00    7.2193180356E+00    1.2027427097E+01    1.8366847428E+01    2.6341904772E+01    3.6010861610E+01    4.7380841264E+01    6.0404474084E+01    7.4978409196E+01    9.0943769917E+01    1.0808856267E+02    1.2615198056E+02    1.4483047624E+02    1.6378541635E+02    1.8265207429E+02    2.0104967098E+02    2.1859213606E+02    2.3489923687E+02    2.4960770884E+02    2.6238202063E+02    2.7292441923E+02    2.8098392471E+02    2.8636397932E+02    2.8892850166E+02    2.886061 [...]
+    2.1980315386E+01    2.8463468672E+01    3.6222201686E+01    4.5320236194E+01    5.5786695403E+01    6.7611434391E+01    8.0741689013E+01    9.5080201654E+01    1.1048492934E+02    1.2677038280E+02    1.4371058596E+02    1.6104358652E+02    1.7847739150E+02    1.9569714913E+02    2.1237335230E+02    2.2817080037E+02    2.4275802677E+02    2.5581688110E+02    2.6705194641E+02    2.7619947535E+02    2.8303554362E+02    2.8738314361E+02    2.8911797600E+02    2.8817273985E+02    2.845397 [...]
+    5.0947530345E+01    5.9261080698E+01    6.8702291705E+01    7.9272957965E+01    9.0944971086E+01    1.0365725208E+02    1.1731381862E+02    1.3178310628E+02    1.4689861718E+02    1.6246091964E+02    1.7824097258E+02    1.9398469746E+02    2.0941867342E+02    2.2425678713E+02    2.3820763109E+02    2.5098241360E+02    2.6230312076E+02    2.7191065820E+02    2.7957269619E+02    2.8509094852E+02    2.8830763151E+02    2.8911087424E+02    2.8743888506E+02    2.8328271913E+02    2.766875 [...]
+    8.6477163952E+01    9.5608681393E+01    1.0569558302E+02    1.1669363854E+02    1.2853318742E+02    1.4111738075E+02    1.5432139020E+02    1.6799267000E+02    1.8195231796E+02    1.9599753947E+02    2.0990517520E+02    2.2343621112E+02    2.3634114958E+02    2.4836608414E+02    2.5925929054E+02    2.6877812209E+02    2.7669598122E+02    2.8280913062E+02    2.8694310774E+02    2.8895851500E+02    2.8875597544E+02    2.8628006845E+02    2.8152209181E+02    2.7452153434E+02    2.653661 [...]
+    1.2491875867E+02    1.3406075370E+02    1.4397193129E+02    1.5457576248E+02    1.6577449733E+02    1.7744845390E+02    1.8945612202E+02    2.0163513998E+02    2.1380416773E+02    2.2576564441E+02    2.3730938199E+02    2.4821691111E+02    2.5826646310E+02    2.6723844245E+02    2.7492122053E+02    2.8111706286E+02    2.8564799077E+02    2.8836137435E+02    2.8913505651E+02    2.8788181889E+02    2.8455301805E+02    2.7914124501E+02    2.7168189107E+02    2.6225353783E+02    2.509771 [...]
+    1.6320938341E+02    1.7174239439E+02    1.8085361490E+02    1.9044586219E+02    2.0040464524E+02    2.1059826795E+02    2.2087861020E+02    2.3108262149E+02    2.4103453281E+02    2.5054876224E+02    2.5943345966E+02    2.6749460667E+02    2.7454056186E+02    2.8038691803E+02    2.8486151978E+02    2.8780947677E+02    2.8909800066E+02    2.8862089292E+02    2.8630251644E+02    2.8210109585E+02    2.7601120960E+02    2.6806536048E+02    2.5833453944E+02    2.4692772966E+02    2.339903 [...]
+    1.9887242434E+02    2.0634653213E+02    2.1421093051E+02    2.2235746437E+02    2.3066426081E+02    2.3899644270E+02    2.4720739766E+02    2.5514061823E+02    2.6263210475E+02    2.6951329737E+02    2.7561447865E+02    2.8076856475E+02    2.8481518249E+02    2.8760491120E+02    2.8900355528E+02    2.8889630394E+02    2.8719163135E+02    2.8382479225E+02    2.7876077538E+02    2.7199659036E+02    2.6356278130E+02    2.5352408339E+02    2.4197916448E+02    2.2905942323E+02    2.149268 [...]
+    2.3000175445E+02    2.3611706067E+02    2.4244427450E+02    2.4887212308E+02    2.5527886593E+02    2.6153344287E+02    2.6749706855E+02    2.7302527479E+02    2.7797038128E+02    2.8218435478E+02    2.8552199662E+02    2.8784437996E+02    2.8902244164E+02    2.8894062041E+02    2.8750042349E+02    2.8462379845E+02    2.8025618627E+02    2.7436913599E+02    2.6696236958E+02    2.5806519974E+02    2.4773722049E+02    2.3606821181E+02    2.2317722386E+02    2.0921083249E+02    1.943405 [...]
+    2.5523294351E+02    2.5981952657E+02    2.6445432510E+02    2.6902912749E+02    2.7342815374E+02    2.7752948783E+02    2.8120686132E+02    2.8433177783E+02    2.8677595123E+02    2.8841401372E+02    2.8912643393E+02    2.8880257077E+02    2.8734377637E+02    2.8466645211E+02    2.8070495543E+02    2.7541425289E+02    2.6877221637E+02    2.6078146512E+02    2.5147066614E+02    2.4089521874E+02    2.2913726620E+02    2.1630499740E+02    2.0253122304E+02    1.8797123491E+02    1.727999 [...]
+    2.7370340116E+02    2.7670123166E+02    2.7960214985E+02    2.8230567045E+02    2.8470628429E+02    2.8669505005E+02    2.8816145421E+02    2.8899552045E+02    2.8909013619E+02    2.8834355034E+02    2.8666198442E+02    2.8396228783E+02    2.8017455956E+02    2.7524465197E+02    2.6913646937E+02    2.6183397361E+02    2.5334281275E+02    2.4369149536E+02    2.3293204356E+02    2.2114007103E+02    2.0841424845E+02    1.9487513707E+02    1.8066339104E+02    1.6593734993E+02    1.508700 [...]
+    2.8500350887E+02    2.8644276427E+02    2.8766120734E+02    2.8856939826E+02    2.8907506588E+02    2.8908475655E+02    2.8850567986E+02    2.8724772660E+02    2.8522562357E+02    2.8236117919E+02    2.7858556500E+02    2.7384156973E+02    2.6808575700E+02    2.6129045388E+02    2.5344549649E+02    2.4455966063E+02    2.3466171021E+02    2.2380100392E+02    2.1204761080E+02    1.9949189858E+02    1.8624357352E+02    1.7243016726E+02    1.5819498389E+02    1.4369453884E+02    1.290955 [...]
+    2.8912089018E+02    2.8910305981E+02    2.8876329097E+02    2.8802533303E+02    2.8681195332E+02    2.8504656175E+02    2.8265497180E+02    2.7956726954E+02    2.7571975393E+02    2.7105690375E+02    2.6553331993E+02    2.5911558642E+02    2.5178398933E+02    2.4353403239E+02    2.3437768757E+02    2.2434432285E+02    2.1348125496E+02    2.0185388271E+02    1.8954536718E+02    1.7665583701E+02    1.6330111122E+02    1.4961094678E+02    1.3572683416E+02    1.2179937947E+02    1.079853 [...]
+    2.8637999480E+02    2.8506011181E+02    2.8334047728E+02    2.8115916759E+02    2.7845479712E+02    2.7516805616E+02    2.7124333468E+02    2.6663040165E+02    2.6128610327E+02    2.5517603799E+02    2.4827616142E+02    2.4057427084E+02    2.3207131762E+02    2.2278249559E+02    2.1273805584E+02    2.0198380247E+02    1.9058123015E+02    1.7860727239E+02    1.6615363977E+02    1.5332573849E+02    1.4024117255E+02    1.2702784610E+02    1.1382169630E+02    1.0076410050E+02    8.799901 [...]
+    2.7737913377E+02    2.7494941212E+02    2.7206509468E+02    2.6867888222E+02    2.6474522266E+02    2.6022171680E+02    2.5507056822E+02    2.4926004679E+02    2.4276593057E+02    2.3557288702E+02    2.2767575152E+02    2.1908065964E+02    2.0980598938E+02    1.9988307100E+02    1.8935662515E+02    1.7828489501E+02    1.6673944457E+02    1.5480460329E+02    1.4257654707E+02    1.3016201575E+02    1.1767667914E+02    1.0524317492E+02    9.2988853813E+01    8.1043278753E+01    6.953553 [...]
+    2.6292700447E+02    2.5960209867E+02    2.5578962659E+02    2.5145652845E+02    2.4657241240E+02    2.4111079693E+02    2.3505036424E+02    2.2837619452E+02    2.2108094829E+02    2.1316596138E+02    2.0464221576E+02    1.9553114906E+02    1.8586526662E+02    1.7568852236E+02    1.6505643836E+02    1.5403593850E+02    1.4270487811E+02    1.3115125914E+02    1.1947212964E+02    1.0777217556E+02    9.6162023252E+01    8.4756281111E+01    7.3671358709E+01    6.3023111255E+01    5.292436 [...]
+    2.4398059329E+02    2.3998463802E+02    2.3548831072E+02    2.3047187303E+02    2.2491891196E+02    2.1881740092E+02    2.1216074540E+02    2.0494878529E+02    1.9718872367E+02    1.8889595082E+02    1.8009473180E+02    1.7081872673E+02    1.6111131459E+02    1.5102569460E+02    1.4062474329E+02    1.2998061087E+02    1.1917404689E+02    1.0829345264E+02    9.7433665899E+01    8.6694491992E+01    7.6179004288E+01    6.5991645617E+01    5.6236170537E+01    4.7013475816E+01    3.841937 [...]
+    2.2158614739E+02    2.1714167404E+02    2.1220200277E+02    2.0675940290E+02    2.0080989089E+02    1.9435410220E+02    1.8739812819E+02    1.7995429232E+02    1.7204183883E+02    1.6368750689E+02    1.5492596369E+02    1.4580007140E+02    1.3636096535E+02    1.2666792440E+02    1.1678801859E+02    1.0679552466E+02    9.6771106420E+01    8.6800763291E+01    7.6974558113E+01    6.7385142603E+01    5.8126106475E+01    4.9290183501E+01    4.0967354463E+01    3.3242892818E+01    2.619540 [...]
+    1.9682467396E+02    1.9214344477E+02    1.8698764551E+02    1.8135996861E+02    1.7526706854E+02    1.6872024563E+02    1.6173608087E+02    1.5433699878E+02    1.4655173511E+02    1.3841568646E+02    1.2997112040E+02    1.2126722627E+02    1.1235999009E+02    1.0331188010E+02    9.4191334556E+01    8.5072047941E+01    7.6032057978E+01    6.7152641674E+01    5.8517035349E+01    5.0208999958E+01    4.2311259457E+01    3.4903845849E+01    2.8062389852E+01    2.1856400493E+01    1.634758 [...]
+    1.7076316567E+02    1.6603891284E+02    1.6087343272E+02    1.5527809622E+02    1.4926827387E+02    1.4286383967E+02    1.3608961667E+02    1.2897574457E+02    1.2155794944E+02    1.1387769715E+02    1.0598221343E+02    9.7924355809E+01    8.9762325904E+01    8.1559213911E+01    7.3382371771E+01    6.5302616105E+01    5.7393267358E+01    4.9729037087E+01    4.2384780932E+01    3.5434140359E+01    2.8948101433E+01    2.2993503655E+01    1.7631535856E+01    1.2916259265E+01    8.893199 [...]
+    1.4441247375E+02    1.3981548324E+02    1.3482049093E+02    1.2944573768E+02    1.2371335380E+02    1.1764969618E+02    1.1128562232E+02    1.0465668408E+02    9.7803225373E+01    9.0770369064E+01    8.3607880206E+01    7.6369895435E+01    6.9114511248E+01    6.1903227595E+01    5.4800247213E+01    4.7871635615E+01    4.1184351329E+01    3.4805160778E+01    2.8799456995E+01    2.3230005902E+01    1.8155648085E+01    1.3629987589E+01    9.7001021450E+00    6.4053112271E+00    3.776039 [...]
+    1.1869246553E+02    1.1436590328E+02    1.0969162948E+02    1.0469296390E+02    9.9396886535E+01    9.3834225465E+01    8.8039779651E+01    8.2052363001E+01    7.5914757119E+01    6.9673561685E+01    6.3378933504E+01    5.7084207788E+01    5.0845398261E+01    4.4720576065E+01    3.8769131214E+01    3.3050924304E+01    2.7625340316E+01    2.2550260450E+01    1.7880971884E+01    1.3669039044E+01    9.9611631704E+00    6.7980596175E+00    4.2133841937E+00    2.2327409034E+00    8.728035 [...]
+    9.4404820032E+01    9.0462663171E+01    8.6227440413E+01    8.1725843315E+01    7.6987903153E+01    7.2047049098E+01    6.6940102317E+01    6.1707195343E+01    5.6391607302E+01    5.1039507250E+01    4.5699600032E+01    4.0422671497E+01    3.5261032827E+01    3.0267866834E+01    2.5496482460E+01    2.0999487225E+01    1.6827890862E+01    1.3030156828E+01    9.6512215464E+00    6.7315041292E+00    4.3059316463E+00    2.4030068187E+00    1.0439460263E+00    2.4191578042E-01    1.395155 [...]
+    7.2213543279E+01    6.8739950574E+01    6.5029771733E+01    6.1111499208E+01    5.7016579220E+01    5.2779361272E+01    4.8436986746E+01    4.4029208686E+01    3.9598136255E+01    3.5187899062E+01    3.0844228622E+01    2.6613956577E+01    2.2544431930E+01    1.8682862392E+01    1.5075587871E+01    1.1767297162E+01    8.8002017979E+00    6.2131838202E+00    4.0409367009E+00    2.3131207683E+00    1.0535560903E+00    2.7947679413E-01    8.7113364995E-04    2.1993121142E-01    9.306350 [...]
+    5.2633030684E+01    4.9682965607E+01    4.6552359035E+01    4.3270108272E+01    3.9867636748E+01    3.6378756257E+01    3.2839473024E+01    2.9287732225E+01    2.5763097022E+01    2.2306359816E+01    1.8959085409E+01    1.5763087924E+01    1.2759845706E+01    9.9898609070E+00    7.4919730010E+00    5.3026379666E+00    3.4551872488E+00    1.9790827835E+00    8.9918621335E-01    2.3506186913E-01    3.3404978872E-04    2.0211951952E-01    8.4055589661E-01    1.9084456857E+00    3.391034 [...]
+    3.6023275728E+01    3.3624181651E+01    3.1098186645E+01    2.8473397670E+01    2.5779999808E+01    2.3050052123E+01    2.0317233212E+01    1.7616533313E+01    1.4983891237E+01    1.2455775949E+01    1.0068714431E+01    7.8587694267E+00    5.8609727280E+00    4.1087217890E+00    2.6331495787E+00    1.4624795896E+00    6.2137978246E-01    1.3033085332E-01    5.0254841008E-03    2.5581611204E-01    8.8722915137E-01    1.8975634675E+00    3.2785901958E+00    5.0153696836E+00    7.086199 [...]
+    2.2591626276E+01    2.0745946645E+01    1.8822966486E+01    1.6849022621E+01    1.4852080305E+01    1.2861482446E+01    1.0907655085E+01    9.0217679396E+00    7.2353501092E+00    5.5798624763E+00    4.0862299793E+00    2.7843386199E+00    1.7025038485E+00    8.6691873495E-01    3.0109203420E-01    2.5287834797E-02    5.5979849807E-02    4.0533452195E-01    1.0807378899E+00    2.0843815451E+00    3.4129229473E+00    5.0572348132E+00    7.0022572340E+00    9.2269645823E+00    1.170445 [...]
+    1.2400327631E+01    1.1088663737E+01    9.7439740084E+00    8.3900651518E+00    7.0519368116E+00    5.7555022185E+00    4.5272720333E+00    3.3940017818E+00    2.3823044529E+00    1.5182311419E+00    8.2682402593E-01    3.3164740820E-01    5.4304040298E-02    1.3945344926E-02    2.2678548645E-01    7.0563039806E-01    1.4594338217E+00    2.4928930906E+00    3.8060977326E+00    5.3942439479E+00    7.2474275800E+00    9.3505273289E+00    1.1683188632E+01    1.4219916874E+01    1.693028 [...]
+    5.3789669570E+00    4.5636718130E+00    3.7533685905E+00    2.9687894274E+00    2.2314511109E+00    1.5633632080E+00    9.8670637324E-01    5.2348249935E-01    1.9513942871E-01    2.2174083010E-02    2.3719055333E-02    2.1711891049E-01    6.1750360976E-01    1.2373675708E+00    2.0861638420E+00    3.1699236660E+00    4.4909122753E+00    6.0473320682E+00    7.8330843003E+00    9.8376000774E+00    1.2045750712E+01    1.4437846400E+01    1.6989730689E+01    1.9672976332E+01    2.245518 [...]
+    1.3408487787E+00    9.6986673972E-01    6.3505178544E-01    3.5372099044E-01    1.4360519221E-01    2.2558389453E-02    8.2440999244E-03    1.1780130857E-01    3.6749355206E-01    7.7234564686E-01    1.3457735427E+00    2.0992137381E+00    3.0417595889E+00    4.1798126380E+00    5.5167577449E+00    7.0526712693E+00    8.7840718068E+00    1.0703722971E+01    1.2800497414E+01    1.5059310674E+01    1.7461132508E+01    1.9983082092E+01    2.2598611918E+01    2.5277783282E+01    2.798763 [...]
+    2.2856817672E-03    1.3063154301E-02    8.4080530693E-02    2.2908595197E-01    4.6191529358E-01    7.9621423224E-01    1.2451436578E+00    1.8210717435E+00    2.5352567607E+00    3.3975255065E+00    4.4159529867E+00    5.5965497154E+00    6.9429636400E+00    8.4562042241E+00    1.0134396602E+01    1.1972573912E+01    1.3962515897E+01    1.6092641601E+01    1.8347963468E+01    2.0710109365E+01    2.3157417957E+01    2.5665111529E+01    2.8205548741E+01    3.0748557928E+01    3.326184 [...]
+    1.0037809029E+00    1.3270928092E+00    1.7276524715E+00    2.2156501833E+00    2.8010876734E+00    3.4935218381E+00    4.3017976567E+00    5.2337740335E+00    6.2960469351E+00    7.4936748069E+00    8.8299118361E+00    1.0305955134E+01    1.1920712337E+01    1.3670596404E+01    1.5549354564E+01    1.7547938286E+01    1.9654420957E+01    2.1853969458E+01    2.4128875181E+01    2.6458649079E+01    2.8820184197E+01    3.1187987764E+01    3.3534483318E+01    3.5830381590E+01    3.804511 [...]
+    3.9321076543E+00    4.4956663727E+00    5.1467142703E+00    5.8920352114E+00    6.7380004200E+00    7.6903405331E+00    8.7539120269E+00    9.9324619615E+00    1.1228395475E+01    1.2642550927E+01    1.4173987977E+01    1.5819794240E+01    1.7574916341E+01    1.9432021326E+01    2.1381394322E+01    2.3410878099E+01    2.5505859832E+01    2.7649309715E+01    2.9821875321E+01    3.2002034588E+01    3.4166309139E+01    3.6289538261E+01    3.8345212399E+01    4.0305863333E+01    4.214350 [...]
+    8.3423502133E+00    9.0740875903E+00    9.8973076400E+00    1.0815653257E+01    1.1832183200E+01    1.2949176920E+01    1.4167938243E+01    1.5488601835E+01    1.6909946804E+01    1.8429222036E+01    2.0041988181E+01    2.1741981308E+01    2.3521003357E+01    2.5368844401E+01    2.7273241577E+01    2.9219879129E+01    3.1192433537E+01    3.3172666974E+01    3.5140571506E+01    3.7074565395E+01    3.8951741733E+01    4.0748168314E+01    4.2439236224E+01    4.4000053210E+01    4.540587 [...]
+    1.3779059646E+01    1.4609997449E+01    1.5530857472E+01    1.6542494333E+01    1.7645058100E+01    1.8837834340E+01    2.0119086748E+01    2.1485906132E+01    2.2934069847E+01    2.4457915892E+01    2.6050236051E+01    2.7702192469E+01    2.9403261956E+01    3.1141212151E+01    3.2902113331E+01    3.4670389201E+01    3.6428909382E+01    3.8159125591E+01    3.9841252620E+01    4.1454494182E+01    4.2977312638E+01    4.4387740328E+01    4.5663729026E+01    4.6783532685E+01    4.772611 [...]
+    1.9795787425E+01    2.0662436444E+01    2.1612716850E+01    2.2645108622E+01    2.3757314787E+01    2.4946137374E+01    2.6207358884E+01    2.7535632850E+01    2.8924387146E+01    3.0365743819E+01    3.1850459224E+01    3.3367888133E+01    3.4905975327E+01    3.6451277882E+01    3.7989020949E+01    3.9503189305E+01    4.0976656299E+01    4.2391351061E+01    4.3728463973E+01    4.4968689430E+01    4.6092503879E+01    4.7080476033E+01    4.7913605023E+01    4.8573681136E+01    4.904366 [...]
+    2.5972387671E+01    2.6818639773E+01    2.7738409619E+01    2.8728252207E+01    2.9783916896E+01    3.0900258380E+01    3.2071155454E+01    3.3289440710E+01    3.4546844438E+01    3.5833955931E+01    3.7140205347E+01    3.8453869096E+01    3.9762101463E+01    4.1050994804E+01    4.2305670216E+01    4.3510399987E+01    4.4648762509E+01    4.5703829558E+01    4.6658385019E+01    4.7495173262E+01    4.8197174388E+01    4.8747902637E+01    4.9131723272E+01    4.9334182300E+01    4.934234 [...]
+    3.1929617504E+01    3.2708117623E+01    3.3547146895E+01    3.4441798200E+01    3.5386368521E+01    3.6374302859E+01    3.7398147474E+01    3.8449515211E+01    3.9519065639E+01    4.0596502674E+01    4.1670592181E+01    4.2729201825E+01    4.3759365124E+01    4.4747371257E+01    4.5678881673E+01    4.6539074019E+01    4.7312813211E+01    4.7984848782E+01    4.8540036879E+01    4.8963584445E+01    4.9241312315E+01    4.9359933118E+01    4.9307339067E+01    4.9072893977E+01    4.864772 [...]
+    3.7340709378E+01    3.8013715064E+01    3.8732334041E+01    3.9490652927E+01    4.0282004712E+01    4.1098942531E+01    4.1933223689E+01    4.2775806233E+01    4.3616860289E+01    4.4445796260E+01    4.5251311761E+01    4.6021458884E+01    4.6743733065E+01    4.7405184374E+01    4.7992551570E+01    4.8492418713E+01    4.8891393501E+01    4.9176305844E+01    4.9334424500E+01    4.9353688871E+01    4.9222952368E+01    4.8932233056E+01    4.8472966635E+01    4.7838256267E+01    4.702311 [...]
+    4.1939733606E+01    4.2479487927E+01    4.3048923727E+01    4.3641553035E+01    4.4250202763E+01    4.4867014561E+01    4.5483455282E+01    4.6090339888E+01    4.6677868519E+01    4.7235679232E+01    4.7752917733E+01    4.8218325058E+01    4.8620343867E+01    4.8947243535E+01    4.9187263788E+01    4.9328776078E+01    4.9360461355E+01    4.9271502285E+01    4.9051787350E+01    4.8692123689E+01    4.8184454922E+01    4.7522079677E+01    4.6699866029E+01    4.5714456669E+01    4.456445 [...]
+    4.5526708523E+01    4.5915367373E+01    4.6317603947E+01    4.6726749223E+01    4.7135537444E+01    4.7536127803E+01    4.7920136638E+01    4.8278681496E+01    4.8602438281E+01    4.8881712499E+01    4.9106525356E+01    4.9266715158E+01    4.9352054092E+01    4.9352380085E+01    4.9257742962E+01    4.9058563672E+01    4.8745804832E+01    4.8311150329E+01    4.7747191204E+01    4.7047614562E+01    4.6207391756E+01    4.5222961719E+01    4.4092404937E+01    4.2815603318E+01    4.139438 [...]
+    4.7969545104E+01    4.8198712207E+01    4.8425932815E+01    4.8644701670E+01    4.8848018754E+01    4.9028428364E+01    4.9178068178E+01    4.9288729246E+01    4.9351927660E+01    4.9358988443E+01    4.9301141951E+01    4.9169632743E+01    4.8955840574E+01    4.8651412755E+01    4.8248406740E+01    4.7739441360E+01    4.7117854707E+01    4.6377866219E+01    4.5514740120E+01    4.4524946959E+01    4.3406319661E+01    4.2158200213E+01    4.0781572876E+01    3.9279179711E+01    3.765561 [...]
+    4.9203028460E+01    4.9272960320E+01    4.9326640891E+01    4.9358017438E+01    4.9360652120E+01    4.9327773980E+01    4.9252340092E+01    4.9127106416E+01    4.8944708696E+01    4.8697753529E+01    4.8378919494E+01    4.7981067910E+01    4.7497362509E+01    4.6921396942E+01    4.6247328706E+01    4.5470017692E+01    4.4585167207E+01    4.3589464970E+01    4.2480721263E+01    4.1258001114E+01    3.9921747171E+01    3.8473889743E+01    3.6917940376E+01    3.5259065340E+01    3.350413 [...]
+    4.9225137214E+01    4.9143686089E+01    4.9033413708E+01    4.8888948406E+01    4.8704645311E+01    4.8474646927E+01    4.8192951824E+01    4.7853491623E+01    4.7450216253E+01    4.6977187269E+01    4.6428678775E+01    4.5799285233E+01    4.5084035137E+01    4.4278509277E+01    4.3378961964E+01    4.2382443332E+01    4.1286920515E+01    4.0091395234E+01    3.8796015118E+01    3.7402175845E+01    3.5912611091E+01    3.4331467187E+01    3.2664359366E+01    3.0918406601E+01    2.910224 [...]
+    4.8091080977E+01    4.7872446632E+01    4.7614539999E+01    4.7312837551E+01    4.6962651881E+01    4.6559196873E+01    4.6097659775E+01    4.5573280037E+01    4.4981434615E+01    4.4317729244E+01    4.3578094961E+01    4.2758888929E+01    4.1856998362E+01    4.0869946111E+01    3.9795996217E+01    3.8634257505E+01    3.7384783066E+01    3.6048663300E+01    3.4628110020E+01    3.3126529026E+01    3.1548578495E+01    2.9900210546E+01    2.8188693434E+01    2.6422611956E+01    2.461184 [...]
+    4.5905494438E+01    4.5568855265E+01    4.5184863431E+01    4.4749950441E+01    4.4260486589E+01    4.3712847128E+01    4.3103484043E+01    4.2429003033E+01    4.1686245189E+01    4.0872372629E+01    3.9984957213E+01    3.9022071206E+01    3.7982378605E+01    3.6865225593E+01    3.5670728449E+01    3.4399857011E+01    3.3054511677E+01    3.1637591795E+01    3.0153053213E+01    2.8605952728E+01    2.7002477194E+01    2.5349955138E+01    2.3656848865E+01    2.1932725278E+01    2.018820 [...]
+    4.2813263393E+01    4.2381354707E+01    4.1896507083E+01    4.1356157310E+01    4.0757773659E+01    4.0098919965E+01    3.9377323975E+01    3.8590949400E+01    3.7738070954E+01    3.6817351535E+01    3.5827920498E+01    3.4769451851E+01    3.3642241013E+01    3.2447278619E+01    3.1186319743E+01    2.9861946767E+01    2.8477624048E+01    2.7037742460E+01    2.5547651911E+01    2.4013679914E+01    2.2443134417E+01    2.0844289205E+01    1.9226350416E+01    1.7599402928E+01    1.597433 [...]
+    3.8989473493E+01    3.8487175761E+01    3.7928850725E+01    3.7312939384E+01    3.6637994431E+01    3.5902739698E+01    3.5106132569E+01    3.4247428655E+01    3.3326247926E+01    3.2342641323E+01    3.1297156786E+01    3.0190903473E+01    2.9025612823E+01    2.7803695049E+01    2.6528289492E+01    2.5203307258E+01    2.3833464501E+01    2.2424304701E+01    2.0982208353E+01    1.9514388533E+01    1.8028870969E+01    1.6534457395E+01    1.5040671221E+01    1.3557684827E+01    1.209622 [...]
+    3.4628967625E+01    3.4081960520E+01    3.3478232273E+01    3.2817182399E+01    3.2098388121E+01    3.1321657207E+01    3.0487082540E+01    2.9595097648E+01    2.8646532323E+01    2.7642667310E+01    2.6585287006E+01    2.5476728960E+01    2.4319928912E+01    2.3118460036E+01    2.1876565002E+01    2.0599179467E+01    1.9291945580E+01    1.7961214180E+01    1.6614034402E+01    1.5258129549E+01    1.3901858258E+01    1.2554160182E+01    1.1224485668E+01    9.9227092204E+00    8.659026 [...]
+    2.9935974346E+01    2.9369504175E+01    2.8747818360E+01    2.8071192261E+01    2.7340129824E+01    2.6555408386E+01    2.5718124112E+01    2.4829737239E+01    2.3892116240E+01    2.2907579905E+01    2.1878936324E+01    2.0809517614E+01    1.9703209261E+01    1.8564472865E+01    1.7398361103E+01    1.6210523713E+01    1.5007203384E+01    1.3795220489E+01    1.2581945723E+01    1.1375259860E+01    1.0183500032E+01    9.0153921543E+00    7.8799693810E+00    6.7864767814E+00    5.744262 [...]
+    2.5114229835E+01    2.4552028602E+01    2.3938047017E+01    2.3273324832E+01    2.2559165878E+01    2.1797173980E+01    2.0989288525E+01    2.0137818869E+01    1.9245476710E+01    1.8315405501E+01    1.7351205909E+01    1.6356956343E+01    1.5337227488E+01    1.4297089846E+01    1.3242113279E+01    1.2178357607E+01    1.1112353383E+01    1.0051072093E+01    9.0018851509E+00    7.9725112253E+00    6.9709516566E+00    6.0054139274E+00    5.0842234282E+00    4.2157240334E+00    3.408168 [...]
+    2.0357962305E+01    1.9821346806E+01    1.9237990821E+01    1.8609566605E+01    1.7938030997E+01    1.7225652080E+01    1.6475034673E+01    1.5689143876E+01    1.4871325862E+01    1.4025325061E+01    1.3155296858E+01    1.2265814939E+01    1.1361872402E+01    1.0448875803E+01    9.5326313415E+00    8.6193224719E+00    7.7154783328E+00    6.8279324928E+00    5.9637716855E+00    5.1302743704E+00    4.3348391677E+00    3.5849034380E+00    2.8878525282E+00    2.2509204660E+00    1.681083 [...]
+    1.5844043641E+01    1.5351212980E+01    1.4817924442E+01    1.4246338613E+01    1.3638907126E+01    1.2998390141E+01    1.2327872003E+01    1.1630774375E+01    1.0910866096E+01    1.0172269036E+01    9.4194591893E+00    8.6572622757E+00    7.8908431482E+00    7.1256883568E+00    6.3675812865E+00    5.6225693812E+00    4.8969230782E+00    4.1970862164E+00    3.5296178367E+00    2.9011254771E+00    2.3181902594E+00    1.7872842836E+00    1.3146810728E+00    9.0636005008E-01    5.679062 [...]
+    1.1725541541E+01    1.1291081735E+01    1.0823309616E+01    1.0324725333E+01    9.7981138748E+00    9.2465538415E+00    8.6734239032E+00    8.0824063249E+00    7.4774869268E+00    6.8629508498E+00    6.2433735183E+00    5.6236062184E+00    5.0087557637E+00    4.4041577813E+00    3.8153432393E+00    3.2479979367E+00    2.7079147994E+00    2.2009389685E+00    1.7329058211E+00    1.3095722416E+00    9.3654164532E-01    6.1918345676E-01    3.6254794844E-01    1.7127755331E-01    4.951596 [...]
+    8.1268300022E+00    7.7614251603E+00    7.3703363855E+00    6.9562569492E+00    6.5221478248E+00    6.0712385187E+00    5.6070252647E+00    5.1332660584E+00    4.6539720128E+00    4.1733945350E+00    3.6960078541E+00    3.2264864766E+00    2.7696772047E+00    2.3305654316E+00    1.9142355159E+00    1.5258251503E+00    1.1704737587E+00    8.5326509802E-01    5.7916438933E-01    3.5295046693E-01    1.7914360379E-01    6.1929847523E-02    5.0828781323E-03    1.1884572699E-02    8.504562 [...]
+    5.1403397230E+00    4.8506810643E+00    4.5430850769E+00    4.2203000750E+00    3.8853159656E+00    3.5413581493E+00    3.1918786127E+00    2.8405437946E+00    2.4912188260E+00    2.1479477727E+00    1.8149295506E+00    1.4964892393E+00    1.1970445874E+00    9.2106758419E-01    6.7304106748E-01    4.5741044774E-01    2.7853074607E-01    1.4060927662E-01    4.7644443089E-02    3.3612655999E-03    1.1144403868E-02    7.3969593355E-02    1.9433455776E-01    3.7419060069E-01    6.148762 [...]
+    2.8249561615E+00    2.6138329542E+00    2.3923019891E+00    2.1630418676E+00    1.9289398017E+00    1.6930797584E+00    1.4587277604E+00    1.2293140359E+00    1.0084117347E+00    7.9971196484E-01    6.0699495346E-01    4.3409719631E-01    2.8487453088E-01    1.6316115273E-01    7.2724687813E-02    1.7217538392E-02    1.2483244958E-04    2.4709426687E-02    9.3954537915E-02    2.1050470504E-01    3.7660591081E-01    5.9404581581E-01    8.6409517337E-01    1.1874515990E+00    1.564186 [...]
+    1.2060041754E+00    1.0725548548E+00    9.3571567661E-01    7.9798793179E-01    6.6204380511E-01    5.3071002648E-01    4.0694876729E-01    2.9383557813E-01    1.9453419801E-01    1.1226810749E-01    5.0288751348E-02    1.1840418690E-02    1.2184085411E-04    1.8244648491E-02    6.9188918741E-02    1.5575613990E-01    2.8052002301E-01    4.4577569571E-01    6.5348792087E-01    9.0523908920E-01    1.2021778375E+00    1.5449692403E+00    1.9337476076E+00    2.3680729952E+00    2.846892 [...]
+    2.7669689167E-01    2.1679415897E-01    1.5976235655E-01    1.0783770411E-01    6.3386949558E-02    2.8887821568E-02    6.9069152413E-03    7.4906662237E-05    1.1059029463E-02    4.2532792251E-02    9.7142969768E-02    1.7747396271E-01    2.8600969061E-01    4.2509325849E-01    5.9688471982E-01    8.0331734459E-01    1.0460528903E+00    1.3264364634E+00    1.6454516473E+00    2.0036766574E+00    2.4012423623E+00    2.8377930782E+00    3.3124511024E+00    3.8237859897E+00    4.369789 [...]
+    8.7458532670E-04    7.6152937717E-03    2.2540130677E-02    4.7553861375E-02    8.4650727776E-02    1.3589296571E-01    2.0338702377E-01    2.8925746856E-01    3.9561860103E-01    5.2454385422E-01    6.7803309630E-01    8.5797802153E-01    1.0661258760E+00    1.3040418348E+00    1.5730704178E+00    1.8742964086E+00    2.2085058108E+00    2.5761474539E+00    2.9772959251E+00    3.4116165708E+00    3.8783333609E+00    4.3762004583E+00    4.9034783599E+00    5.4579154952E+00    6.036736 [...]
+    3.1681834714E-01    3.8108742410E-01    4.5777370260E-01    5.4840595975E-01    6.5456248500E-01    7.7784884738E-01    9.1987369139E-01    1.0822226237E+00    1.2664302919E+00    1.4739508026E+00    1.7061266746E+00    1.9641565771E+00    2.2490621626E+00    2.5616543610E+00    2.9024995645E+00    3.2718861948E+00    3.6697922005E+00    4.0958540896E+00    4.5493381531E+00    5.0291145746E+00    5.5336351554E+00    6.0609154037E+00    6.6085217435E+00    7.1735645865E+00    7.752697 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_sphere_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_sphere_BA.inp
new file mode 100644
index 0000000..dbad9b1
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_sphere_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_full_sphere_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+full_sphere                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_spheroid_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_spheroid_BA.ima
new file mode 100644
index 0000000..413cc6c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_full_spheroid_BA.ima
@@ -0,0 +1,100 @@
+    9.1645639531E+03    9.0472700331E+03    8.9201800386E+03    8.7836794577E+03    8.6381855991E+03    8.4841341798E+03    8.3219878685E+03    8.1522295029E+03    7.9753603526E+03    7.7918951237E+03    7.6023665858E+03    7.4073156840E+03    7.2072960128E+03    7.0028671696E+03    6.7945914431E+03    6.5830379588E+03    6.3687732744E+03    6.1523611869E+03    5.9343638016E+03    5.7153354789E+03    5.4958232891E+03    5.2763626657E+03    5.0574772714E+03    4.8396755995E+03    4.623450 [...]
+    9.1419108242E+03    9.0248671191E+03    8.8980459015E+03    8.7618354997E+03    8.6166491991E+03    8.4629270852E+03    8.3011277353E+03    8.1317332423E+03    7.9552440963E+03    7.7721741952E+03    7.5830554656E+03    7.3884264331E+03    7.1888429230E+03    6.9848590218E+03    6.7770391928E+03    6.5659501422E+03    6.3521575323E+03    6.1362242560E+03    5.9187128940E+03    5.7001740833E+03    5.4811547185E+03    5.2621893529E+03    5.0438007712E+03    4.8264959679E+03    4.610767 [...]
+    9.0742418177E+03    8.9579395702E+03    8.8319239163E+03    8.6965813640E+03    8.5523199047E+03    8.3995792769E+03    8.2388159078E+03    8.0705096139E+03    7.8951552906E+03    7.7132660586E+03    7.5253697543E+03    7.3320054721E+03    7.1337201797E+03    6.9310684400E+03    6.7246119791E+03    6.5149117998E+03    6.3025308826E+03    6.0880308230E+03    5.8719686132E+03    5.6548929084E+03    5.4373472134E+03    5.2198621006E+03    5.0029571281E+03    4.7871367686E+03    4.572890 [...]
+    8.9624115589E+03    8.8473368936E+03    8.7226544251E+03    8.5887443037E+03    8.4460163802E+03    8.2949003039E+03    8.1358506372E+03    7.9693418397E+03    7.7958649592E+03    7.6159306721E+03    7.4300594669E+03    7.2387831099E+03    7.0426473613E+03    6.8422008144E+03    6.6379977296E+03    6.4305946649E+03    6.2205515072E+03    6.0084210035E+03    5.7947556839E+03    5.5800997339E+03    5.3649901723E+03    5.1499525601E+03    4.9355021413E+03    4.7221378668E+03    4.510343 [...]
+    8.8078292545E+03    8.6944552926E+03    8.5716196451E+03    8.4396949933E+03    8.2990867763E+03    8.1502199803E+03    7.9935425895E+03    7.8295238903E+03    7.6586495281E+03    7.4814182654E+03    7.2983496102E+03    7.1099663160E+03    6.9168065801E+03    6.7194114060E+03    6.5183274141E+03    6.3141063777E+03    6.1072961264E+03    5.8984460336E+03    5.6880981615E+03    5.4767911942E+03    5.2650539523E+03    5.0534046127E+03    4.8423511463E+03    4.6323847858E+03    4.423983 [...]
+    8.6124353465E+03    8.5012162427E+03    8.3807174326E+03    8.2513080693E+03    8.1133862880E+03    7.9673695006E+03    7.8136978131E+03    7.6528339329E+03    7.4852535088E+03    7.3114498275E+03    7.1319304001E+03    6.9472120923E+03    6.7578209072E+03    6.5642901535E+03    6.3671571429E+03    6.1669642580E+03    5.9642499637E+03    5.7595528607E+03    5.5534070985E+03    5.3463400718E+03    5.1388721590E+03    4.9315125247E+03    4.7247583760E+03    4.5190935740E+03    4.314986 [...]
+    8.3786584436E+03    8.2700254463E+03    8.1523322693E+03    8.0259417809E+03    7.8912421003E+03    7.7486451174E+03    7.5985801941E+03    7.4415005372E+03    7.2778720559E+03    7.1081795188E+03    6.9329185815E+03    6.7525941448E+03    6.5677245421E+03    6.3788293229E+03    6.1864363687E+03    5.9910742304E+03    5.7932704863E+03    5.5935541610E+03    5.3924464380E+03    5.1904632531E+03    4.9881142792E+03    4.7858962279E+03    4.5842972100E+03    4.3837878596E+03    4.184827 [...]
+    8.1093803312E+03    8.0037364649E+03    7.8892858689E+03    7.7663841097E+03    7.6354098725E+03    7.4967651356E+03    7.3508689767E+03    7.1981623101E+03    7.0391030768E+03    6.8741600580E+03    6.7038187987E+03    6.5285737888E+03    6.3489268147E+03    6.1653881253E+03    5.9784703365E+03    5.7886882016E+03    5.5965589233E+03    5.4025949450E+03    5.2073051350E+03    5.0111937839E+03    4.8147551535E+03    4.6184752609E+03    4.4228267019E+03    4.2282698599E+03    4.035250 [...]
+    7.8078795071E+03    7.7055947725E+03    7.5947900222E+03    7.4758109527E+03    7.3490258303E+03    7.2148225951E+03    7.0736135728E+03    6.9258247063E+03    6.7718986645E+03    6.6122961366E+03    6.4474852394E+03    6.2779458516E+03    6.1041692308E+03    5.9266477262E+03    5.7458816441E+03    5.5623698439E+03    5.3766142914E+03    5.1891122918E+03    5.0003582933E+03    4.8108409667E+03    4.6210398324E+03    4.4314263485E+03    4.2424594320E+03    4.0545842795E+03    3.868232 [...]
+    7.4777730387E+03    7.3791848421E+03    7.2723924044E+03    7.1577291706E+03    7.0355505920E+03    6.9062343043E+03    6.7701801379E+03    6.6277981814E+03    6.4795192588E+03    6.3257873284E+03    6.1670578960E+03    6.0037949852E+03    5.8364723286E+03    5.6655674934E+03    5.4915630412E+03    5.3149434729E+03    5.1361922907E+03    4.9557917373E+03    4.7742192844E+03    4.5919467918E+03    4.4094384163E+03    4.2271480309E+03    4.0455191268E+03    3.8649817911E+03    3.685952 [...]
+    7.1229574245E+03    7.0283650094E+03    6.9259073997E+03    6.8159066428E+03    6.6987075994E+03    6.5746721885E+03    6.4441868583E+03    6.3076479305E+03    6.1654689841E+03    6.0180806148E+03    5.8659203292E+03    5.7094360019E+03    5.5490828656E+03    5.3853232348E+03    5.2186202103E+03    5.0494420737E+03    4.8782534816E+03    4.7055185319E+03    4.5316972901E+03    4.3572437234E+03    4.1826031404E+03    4.0082138083E+03    3.8345003988E+03    3.6618774376E+03    3.490743 [...]
+    6.7475356151E+03    6.6571968223E+03    6.5593553421E+03    6.4543182114E+03    6.3424189257E+03    6.2240059508E+03    6.0994472311E+03    5.9691259257E+03    5.8334403955E+03    5.6928019949E+03    5.5476308396E+03    5.3983570553E+03    5.2454191618E+03    5.0892591965E+03    4.9303231850E+03    4.7690576762E+03    4.6059101380E+03    4.4413249433E+03    4.2757431701E+03    4.1095993832E+03    3.9433209122E+03    3.7773254199E+03    3.6120219035E+03    3.4478045391E+03    3.285055 [...]
+    6.3557534636E+03    6.2698850206E+03    6.1768924205E+03    6.0770729637E+03    5.9707409864E+03    5.8582336831E+03    5.7399020877E+03    5.6161125913E+03    5.4872462297E+03    5.3536958828E+03    5.2158641726E+03    5.0741626598E+03    4.9290096864E+03    4.7808276183E+03    4.6300420296E+03    4.4770814210E+03    4.3223714592E+03    4.1663372365E+03    4.0093988621E+03    3.8519707571E+03    3.6944603557E+03    3.5372668296E+03    3.3807782643E+03    3.2253711379E+03    3.071408 [...]
+    5.9519238195E+03    5.8706991840E+03    5.7827447953E+03    5.6883413803E+03    5.5877935184E+03    5.4814182170E+03    5.3695518625E+03    5.2525435336E+03    5.1307563586E+03    5.0045635303E+03    4.8743501420E+03    4.7405066472E+03    4.6034312826E+03    4.4635267159E+03    4.3211974298E+03    4.1768501322E+03    4.0308905408E+03    3.8837220371E+03    3.7357443294E+03    3.5873499635E+03    3.4389269468E+03    3.2908526310E+03    3.1434958377E+03    2.9972121706E+03    2.852346 [...]
+    5.5403614569E+03    5.4639086893E+03    5.3811312216E+03    5.2922963378E+03    5.1976902358E+03    5.0976162223E+03    4.9923928708E+03    4.8823508924E+03    4.7678356975E+03    4.6492003995E+03    4.5268101353E+03    4.4010357241E+03    4.2722536000E+03    4.1408462043E+03    4.0071959001E+03    3.8716883223E+03    3.7347069779E+03    3.5966331370E+03    3.4578456137E+03    3.3187152237E+03    3.1796079286E+03    3.0408810041E+03    2.9028815130E+03    2.7659458323E+03    2.630397 [...]
+    5.1253071372E+03    5.0537134889E+03    4.9762057908E+03    4.8930369798E+03    4.8044792685E+03    4.7108173868E+03    4.6123531313E+03    4.5093991990E+03    4.4022810828E+03    4.2913327908E+03    4.1768985879E+03    4.0593287117E+03    3.9389787019E+03    3.8162086609E+03    3.6913791498E+03    3.5648538223E+03    3.4369937145E+03    3.3081587517E+03    3.1787038733E+03    3.0489794655E+03    2.9193286977E+03    2.7900874577E+03    2.6615813876E+03    2.5341268550E+03    2.408026 [...]
+    4.7108719467E+03    4.6441794796E+03    4.5719869756E+03    4.4945340773E+03    4.4120756888E+03    4.3248803902E+03    4.2332311849E+03    4.1374231734E+03    4.0377612526E+03    3.9345612568E+03    3.8281452935E+03    3.7188422786E+03    3.6069866785E+03    3.4929156255E+03    3.3769693231E+03    3.2594876696E+03    3.1408096288E+03    3.0212720512E+03    2.9012075293E+03    2.7809447651E+03    2.6608041121E+03    2.5410994938E+03    2.4221355265E+03    2.3042075285E+03    2.187597 [...]
+    4.3009683016E+03    4.2391781458E+03    4.1723023895E+03    4.1005654533E+03    4.0242056105E+03    3.9434752048E+03    3.8586396225E+03    3.7699739901E+03    3.6777643643E+03    3.5823060189E+03    3.4839006632E+03    3.3828558661E+03    3.2794833776E+03    3.1740995162E+03    3.0670213854E+03    2.9585662849E+03    2.8490501064E+03    2.7387876774E+03    2.6280892362E+03    2.5172599250E+03    2.4065983566E+03    2.2963974296E+03    2.1869394276E+03    2.0784978869E+03    1.971335 [...]
+    3.8992607162E+03    3.8423338248E+03    3.7807316549E+03    3.7146645959E+03    3.6443533029E+03    3.5700338940E+03    3.4919536596E+03    3.4103685053E+03    3.3255462018E+03    3.2377600271E+03    3.1472919057E+03    3.0544276898E+03    2.9594581328E+03    2.8626762786E+03    2.7643773556E+03    2.6648562306E+03    2.5644063858E+03    2.4633193492E+03    2.3618831997E+03    2.2603802776E+03    2.1590884438E+03    2.0582767380E+03    1.9582071337E+03    1.8591324547E+03    1.761294 [...]
+    3.5091127291E+03    3.4569729364E+03    3.4005620544E+03    3.3400738634E+03    3.2757143701E+03    3.2077025183E+03    3.1362667028E+03    3.0616459059E+03    2.9840871958E+03    2.9038442723E+03    2.8211774647E+03    2.7363531484E+03    2.6496389037E+03    2.5613072515E+03    2.4716299302E+03    2.3808796965E+03    2.2893283731E+03    2.1972441487E+03    2.1048936571E+03    2.0125363959E+03    1.9204280789E+03    1.8288172685E+03    1.7379438768E+03    1.6480400130E+03    1.559327 [...]
+    3.1335502114E+03    3.0860864629E+03    3.0347451798E+03    2.9797049621E+03    2.9211568065E+03    2.8593023111E+03    2.7943528474E+03    2.7265282195E+03    2.6560562513E+03    2.5831718456E+03    2.5081146522E+03    2.4311290600E+03    2.3524627736E+03    2.2723658459E+03    2.1910884307E+03    2.1088815746E+03    2.0259945625E+03    1.9426744513E+03    1.8591640035E+03    1.7757032154E+03    1.6925249665E+03    1.6098562466E+03    1.5279173689E+03    1.4469194877E+03    1.367065 [...]
+    2.7752251746E+03    2.7322947005E+03    2.6858671183E+03    2.6361071777E+03    2.5831902101E+03    2.5273013917E+03    2.4686345161E+03    2.4073916455E+03    2.3437822572E+03    2.2780210613E+03    2.2103280263E+03    2.1409274721E+03    2.0700459084E+03    1.9979124064E+03    1.9247556622E+03    1.8508055525E+03    1.7762890842E+03    1.7014323119E+03    1.6264568251E+03    1.5515805067E+03    1.4770156739E+03    1.4029694234E+03    1.3296407080E+03    1.2572214706E+03    1.185895 [...]
+    2.4363929051E+03    2.3978241875E+03    2.3561243281E+03    2.3114432509E+03    2.2639419751E+03    2.2137893065E+03    2.1611624363E+03    2.1062461738E+03    2.0492309168E+03    1.9903131121E+03    1.9296932069E+03    1.8675756386E+03    1.8041668132E+03    1.7396746981E+03    1.6743079962E+03    1.6082749535E+03    1.5417825633E+03    1.4750350796E+03    1.4082339877E+03    1.3415764009E+03    1.2752545606E+03    1.2094548574E+03    1.1443572293E+03    1.0801345832E+03    1.016951 [...]
+    2.1188949079E+03    2.0844914116E+03    2.0473057743E+03    2.0074740796E+03    1.9651422360E+03    1.9204641021E+03    1.8736004329E+03    1.8247185953E+03    1.7739922249E+03    1.7215989470E+03    1.6677204228E+03    1.6125423104E+03    1.5562512812E+03    1.4990354019E+03    1.4410833657E+03    1.3825835509E+03    1.3237226042E+03    1.2646845969E+03    1.2056509962E+03    1.1467993322E+03    1.0883019690E+03    1.0303265837E+03    9.7303395987E+02    9.1657866880E+02    8.611078 [...]
+    1.8241514135E+03    1.7936966010E+03    1.7607891982E+03    1.7255520457E+03    1.6881177311E+03    1.6486242363E+03    1.6072176891E+03    1.5640487661E+03    1.5192738744E+03    1.4730533873E+03    1.4255514861E+03    1.3769344274E+03    1.3273705469E+03    1.2770290521E+03    1.2260796556E+03    1.1746910810E+03    1.1230305779E+03    1.0712634209E+03    1.0195518177E+03    9.6805403118E+02    9.1692424339E+02    8.6631143762E+02    8.1635890516E+02    7.6720352319E+02    7.189755 [...]
+    1.5531635887E+03    1.5264230863E+03    1.4975392332E+03    1.4666229518E+03    1.4337924846E+03    1.3991723371E+03    1.3628932275E+03    1.3250906521E+03    1.2859047909E+03    1.2454792317E+03    1.2039608342E+03    1.1614984540E+03    1.1182426253E+03    1.0743446104E+03    1.0299556218E+03    9.8522606133E+02    9.4030491847E+02    8.9533930703E+02    8.5047293419E+02    8.0584651823E+02    7.6159632758E+02    7.1785409332E+02    6.7474605289E+02    6.3239278291E+02    5.909085 [...]
+    1.3065213807E+03    1.2832481935E+03    1.2581192503E+03    1.2312339616E+03    1.2026978675E+03    1.1726221542E+03    1.1411231448E+03    1.1083217643E+03    1.0743425378E+03    1.0393136300E+03    1.0033652360E+03    9.6663017089E+02    9.2924156786E+02    8.9133373216E+02    8.5304071177E+02    8.1449548402E+02    7.7582993604E+02    7.3717354852E+02    6.9865327393E+02    6.6039278621E+02    6.2251166816E+02    5.8512543907E+02    5.4834435252E+02    5.1227358511E+02    4.770123 [...]
+    1.0844208635E+03    1.0643579737E+03    1.0427054099E+03    1.0195510966E+03    9.9498846422E+02    9.6911628689E+02    9.4203736264E+02    9.1385874282E+02    8.8469067142E+02    8.5464621785E+02    8.2384049281E+02    7.9239026216E+02    7.6041341221E+02    7.2802779751E+02    6.9535123742E+02    6.6250063261E+02    6.2959147309E+02    5.9673723998E+02    5.6404883154E+02    5.3163401636E+02    4.9959691661E+02    4.6803771928E+02    4.3705200521E+02    4.0673051814E+02    3.771585 [...]
+    8.8668688480E+02    8.6957226880E+02    8.5111135333E+02    8.3138134125E+02    8.1046473281E+02    7.8844826001E+02    7.6542222276E+02    7.4148069015E+02    7.1672029481E+02    6.9124039089E+02    6.6514173612E+02    6.3852651280E+02    6.1149761574E+02    5.8415807196E+02    5.5661057892E+02    5.2895704210E+02    5.0129760789E+02    4.7373076674E+02    4.4635261551E+02    4.1925608604E+02    3.9253115038E+02    3.6626380694E+02    3.4053591607E+02    3.1542486387E+02    2.910032 [...]
+    7.1280252711E+02    6.9837215582E+02    6.8281612703E+02    6.6620205014E+02    6.4860174911E+02    6.3009089866E+02    6.1074830444E+02    5.9065596501E+02    5.6989799494E+02    5.4856066102E+02    5.2673163353E+02    5.0449946814E+02    4.8195329315E+02    4.5918238198E+02    4.3627543888E+02    4.1332011176E+02    3.9040296939E+02    3.6760846769E+02    3.4501887112E+02    3.2271381028E+02    3.0076982604E+02    2.7925998795E+02    2.5825361570E+02    2.3781598015E+02    2.180078 [...]
+    5.6194341799E+02    5.4993481823E+02    5.3699881548E+02    5.2319381648E+02    5.0858223024E+02    4.9322951343E+02    4.7720364515E+02    4.6057548064E+02    4.4341759118E+02    4.2580438887E+02    4.0781118173E+02    3.8951418334E+02    3.7098994605E+02    3.5231485723E+02    3.3356485985E+02    3.1481475873E+02    2.9613824636E+02    2.7760715289E+02    2.5929117501E+02    2.4125757054E+02    2.2357076098E+02    2.0629209774E+02    1.8947944600E+02    1.7318694105E+02    1.574648 [...]
+    4.3301591204E+02    4.2317119257E+02    4.1257529958E+02    4.0127840318E+02    3.8933405232E+02    3.7679815983E+02    3.6372924577E+02    3.5018768300E+02    3.3623559893E+02    3.2193637701E+02    3.0735420984E+02    2.9255401035E+02    2.7760075639E+02    2.6255913520E+02    2.4749340710E+02    2.3246675543E+02    2.1754116366E+02    2.0277690955E+02    1.8823235364E+02    1.7396357224E+02    1.6002402009E+02    1.4646436191E+02    1.3333219593E+02    1.2067173004E+02    1.085236 [...]
+    3.2469830116E+02    3.1676701176E+02    3.0823947558E+02    2.9915847121E+02    2.8956931649E+02    2.7951953845E+02    2.6905864863E+02    2.5823779288E+02    2.4710943464E+02    2.3572706850E+02    2.2414479098E+02    2.1241718255E+02    2.0059874279E+02    1.8874370830E+02    1.7690570301E+02    1.6513737177E+02    1.5349020263E+02    1.4201409191E+02    1.3075710759E+02    1.1976533404E+02    1.0908239778E+02    9.8749473894E+01    8.8804907581E+01    7.9284073074E+01    7.021924 [...]
+    2.3548352227E+02    2.2922521415E+02    2.2250527675E+02    2.1535970861E+02    2.0782651751E+02    1.9994556817E+02    1.9175828576E+02    1.8330747891E+02    1.7463693589E+02    1.6579117986E+02    1.5681533174E+02    1.4775456422E+02    1.3865408050E+02    1.2955863933E+02    1.2051239429E+02    1.1155859878E+02    1.0273927860E+02    9.4095106713E+01    8.5665029701E+01    7.7486160942E+01    6.9593477917E+01    6.2019677562E+01    5.4794993033E+01    4.7947006682E+01    4.150055 [...]
+    1.6372314320E+02    1.5890954652E+02    1.5374972691E+02    1.4827350526E+02    1.4251240086E+02    1.3649941024E+02    1.3026875329E+02    1.2385576836E+02    1.1729644135E+02    1.1062746739E+02    1.0388568556E+02    9.7108149474E+01    9.0331647225E+01    8.3592570536E+01    7.6926658566E+01    7.0368771750E+01    6.3952682279E+01    5.7710827862E+01    5.1674143312E+01    4.5871864691E+01    4.0331334216E+01    3.5077873979E+01    3.0134600402E+01    2.5522334054E+01    2.125945 [...]
+    1.0767092482E+02    1.0408771643E+02    1.0025562181E+02    9.6199095836E+01    9.1943818171E+01    8.7516696776E+01    8.2945613512E+01    7.8259202728E+01    7.3486678762E+01    6.8657618832E+01    6.3801783409E+01    5.8948879259E+01    5.4128347368E+01    4.9369212297E+01    4.4699824628E+01    4.0147711181E+01    3.5739359965E+01    3.1500054734E+01    2.7453728444E+01    2.3622770040E+01    2.0027900887E+01    1.6688054724E+01    1.3620233966E+01    1.0839425883E+01    8.358511 [...]
+    6.5524987879E+01    6.2973175253E+01    6.0253234029E+01    5.7384773111E+01    5.4388438588E+01    5.1285770342E+01    4.8099035466E+01    4.4851050511E+01    4.1565032188E+01    3.8264413937E+01    3.4972677468E+01    3.1713170876E+01    2.8508943036E+01    2.5382568152E+01    2.2356000996E+01    1.9450388051E+01    1.6685930651E+01    1.4081746239E+01    1.1655711661E+01    9.4243557336E+00    7.4027313828E+00    5.6043165475E+00    4.0409198866E+00    2.7226039505E+00    1.657617 [...]
+    3.5468014706E+01    3.3765079223E+01    3.1959552496E+01    3.0066864595E+01    2.8103255955E+01    2.6085592671E+01    2.4031282583E+01    2.1958099663E+01    1.9884057327E+01    1.7827267177E+01    1.5805789708E+01    1.3837487182E+01    1.1939891549E+01    1.0130053338E+01    8.4244142504E+00    6.8386739846E+00    5.3876642074E+00    4.0852340579E+00    2.9441376439E+00    1.9759334184E+00    1.1908951374E+00    5.9792774236E-01    2.0449932310E-01    1.6581159128E-02    3.860101 [...]
+    1.5704590676E+01    1.4685126053E+01    1.3614902571E+01    1.2505780369E+01    1.1370175638E+01    1.0220969893E+01    9.0713850454E+00    7.9348690123E+00    6.8249915697E+00    5.7553093353E+00    4.7392575061E+00    3.7900309356E+00    2.9204647749E+00    2.1429237608E+00    1.4691912405E+00    9.1036577590E-01    4.7675978228E-01    1.7780772428E-01    2.1979189017E-02    1.6700567831E-02    1.6828520436E-01    4.8187233695E-01    9.6137574034E-01    1.6094420084E+00    2.427419 [...]
+    4.4948877898E+00    4.0109595634E+00    3.5159412664E+00    3.0186421784E+00    2.5282524053E+00    2.0542564073E+00    1.6063393220E+00    1.1942958648E+00    8.2793290031E-01    5.1697500152E-01    2.7096788225E-01    9.9183836718E-02    1.0528744195E-02    1.3451807540E-02    1.1585854375E-01    3.2502816163E-01    6.4753581522E-01    1.0891803145E+00    1.6549187919E+00    2.3488069308E+00    3.1739479597E+00    4.1324492318E+00    5.2253848158E+00    6.4527719617E+00    7.813547 [...]
+    1.8429669875E-01    1.0547192529E-01    4.4571967146E-02    7.8532222820E-03    1.8038206946E-03    3.3072548449E-02    1.0839544844E-01    2.3452079460E-01    4.1813285422E-01    6.6577572550E-01    9.8377722299E-01    1.3781741682E+00    1.8546392386E+00    2.4184109401E+00    3.0742260771E+00    3.8262553509E+00    4.6780472783E+00    5.6324712939E+00    6.6916692788E+00    7.8570148678E+00    9.1290783956E+00    1.0507593324E+01    1.1991437452E+01    1.3578616848E+01    1.526626 [...]
+    1.2285375872E+00    1.4416072791E+00    1.6924528316E+00    1.9852275706E+00    2.3241968077E+00    2.7136817591E+00    3.1580006343E+00    3.6614111761E+00    4.2280498042E+00    4.8618737187E+00    5.5665995638E+00    6.3456477269E+00    7.2020892040E+00    8.1385835608E+00    9.1573384443E+00    1.0260055626E+01    1.1447894333E+01    1.2721425035E+01    1.4080602218E+01    1.5524728930E+01    1.7052440925E+01    1.8661689014E+01    2.0349721995E+01    2.2113082067E+01    2.394761 [...]
+    6.2139926951E+00    6.6224324456E+00    7.0807712938E+00    7.5914604533E+00    8.1569760354E+00    8.7797653355E+00    9.4622084434E+00    1.0206571412E+01    1.1014954850E+01    1.1889262591E+01    1.2831141900E+01    1.3841950351E+01    1.4922715799E+01    1.6074089507E+01    1.7296311609E+01    1.8589189718E+01    1.9952048164E+01    2.1383725771E+01    2.2882531609E+01    2.4446250393E+01    2.6072099600E+01    2.7756765572E+01    2.9496358200E+01    3.1286438128E+01    3.312202 [...]
+    1.3873145394E+01    1.4396344038E+01    1.4975191769E+01    1.5610804891E+01    1.6304249473E+01    1.7056504772E+01    1.7868437060E+01    1.8740754330E+01    1.9673991644E+01    2.0668453327E+01    2.1724207244E+01    2.2841035616E+01    2.4018409256E+01    2.5255475495E+01    2.6551001130E+01    2.7903396341E+01    2.9310647685E+01    3.0770334451E+01    3.2279621305E+01    3.3835222258E+01    3.5433411415E+01    3.7070033132E+01    3.8740496603E+01    4.0439773249E+01    4.216243 [...]
+    2.3095128980E+01    2.3667414255E+01    2.4296001501E+01    2.4980983193E+01    2.5722356065E+01    2.6519981550E+01    2.7373585424E+01    2.8282711332E+01    2.9246708710E+01    3.0264715967E+01    3.1335613359E+01    3.2458051344E+01    3.3630361096E+01    3.4850612255E+01    3.6116551871E+01    3.7425588736E+01    3.8774815023E+01    4.0160976777E+01    4.1580473914E+01    4.3029371121E+01    4.4503375491E+01    4.5997868488E+01    4.7507905089E+01    4.9028215275E+01    5.055324 [...]
+    3.2931501996E+01    3.3501009767E+01    3.4123539952E+01    3.4798444800E+01    3.5524921266E+01    3.6302036182E+01    3.7128691784E+01    3.8003589909E+01    3.8925251234E+01    3.9891980356E+01    4.0901858920E+01    4.1952732853E+01    4.3042193325E+01    4.4167580988E+01    4.5325962506E+01    4.6514161562E+01    4.7728701143E+01    4.8965838533E+01    5.0221581496E+01    5.1491643186E+01    5.2771510684E+01    5.4056396307E+01    5.5341288068E+01    5.6620971662E+01    5.789000 [...]
+    4.2597544713E+01    4.3124972467E+01    4.3699263191E+01    4.4319250150E+01    4.4983604421E+01    4.5690849533E+01    4.6439323214E+01    4.7227176563E+01    4.8052397324E+01    4.8912748438E+01    4.9805799978E+01    5.0728915801E+01    5.1679240818E+01    5.2653705413E+01    5.3649006851E+01    5.4661658060E+01    5.5687922874E+01    5.6723868351E+01    5.7765361676E+01    5.8808077179E+01    5.9847487864E+01    6.0878928550E+01    6.1897548253E+01    6.2898368981E+01    6.387630 [...]
+    5.1469363716E+01    5.1926617067E+01    5.2422634645E+01    5.2955926097E+01    5.3524839371E+01    5.4127558172E+01    5.4762099456E+01    5.5426302733E+01    5.6117844788E+01    5.6834195964E+01    5.7572678275E+01    5.8330414520E+01    5.9104345768E+01    5.9891250567E+01    6.0687704442E+01    6.1490145200E+01    6.2294835076E+01    6.3097858488E+01    6.3895184145E+01    6.4682630870E+01    6.5455915551E+01    6.6210621315E+01    6.6942267366E+01    6.7646289369E+01    6.831808 [...]
+    5.9077282087E+01    5.9446098546E+01    5.9844456782E+01    6.0270694733E+01    6.0722991619E+01    6.1199396212E+01    6.1697767223E+01    6.2215828233E+01    6.2751134886E+01    6.3301086598E+01    6.3862930072E+01    6.4433745403E+01    6.5010505339E+01    6.5589990596E+01    6.6168878238E+01    6.6743722603E+01    6.7310927353E+01    6.7866829401E+01    6.8407645786E+01    6.8929504585E+01    6.9428496340E+01    6.9900633117E+01    7.0341892839E+01    7.0748265398E+01    7.111571 [...]
+    6.5096003809E+01    6.5366565792E+01    6.5656992641E+01    6.5965578405E+01    6.6290497125E+01    6.6629762242E+01    6.6981259469E+01    6.7342715524E+01    6.7711740991E+01    6.8085790387E+01    6.8462206101E+01    6.8838197988E+01    6.9210879545E+01    6.9577239377E+01    6.9934178954E+01    7.0278494869E+01    7.0606918498E+01    7.0916109429E+01    7.1202687675E+01    7.1463209780E+01    7.1694231478E+01    7.1892285572E+01    7.2053937029E+01    7.2175733624E+01    7.225432 [...]
+    6.9332111671E+01    6.9501647745E+01    6.9681475883E+01    6.9869983433E+01    7.0065408798E+01    7.0265858458E+01    7.0469324293E+01    7.0673691803E+01    7.0876701155E+01    7.1076012951E+01    7.1269170089E+01    7.1453617022E+01    7.1626738772E+01    7.1785824208E+01    7.1928087090E+01    7.2050716597E+01    7.2150823216E+01    7.2225509762E+01    7.2271856902E+01    7.2286947644E+01    7.2267854088E+01    7.2211691998E+01    7.2115618340E+01    7.1976858131E+01    7.179269 [...]
+    7.1709491279E+01    7.1780926052E+01    7.1853669377E+01    7.1926229290E+01    7.1997015013E+01    7.2064308074E+01    7.2126291098E+01    7.2181057738E+01    7.2226594129E+01    7.2260818235E+01    7.2281571627E+01    7.2286621237E+01    7.2273680763E+01    7.2240403722E+01    7.2184434576E+01    7.2103364341E+01    7.1994773091E+01    7.1856244106E+01    7.1685378478E+01    7.1479800568E+01    7.1237154400E+01    7.0955148200E+01    7.0631570458E+01    7.0264287268E+01    6.985124 [...]
+    7.2253187650E+01    7.2233897023E+01    7.2207834774E+01    7.2173709553E+01    7.2130107784E+01    7.2075561789E+01    7.2008483852E+01    7.1927253950E+01    7.1830144814E+01    7.1715391023E+01    7.1581172175E+01    7.1425625120E+01    7.1246837458E+01    7.1042898608E+01    7.0811874856E+01    7.0551813497E+01    7.0260804212E+01    6.9936917359E+01    6.9578303678E+01    6.9183114472E+01    6.8749582705E+01    6.8276019102E+01    6.7760799355E+01    6.7202426072E+01    6.659946 [...]
+    7.1072462237E+01    7.0973078251E+01    7.0859999916E+01    7.0732130089E+01    7.0588323255E+01    7.0427339709E+01    7.0247885476E+01    7.0048642768E+01    6.9828196668E+01    6.9585122933E+01    6.9317981259E+01    6.9025280755E+01    6.8705530451E+01    6.8357233501E+01    6.7978909755E+01    6.7569081198E+01    6.7126322798E+01    6.6649211322E+01    6.6136394994E+01    6.5586597956E+01    6.4998597570E+01    6.4371257006E+01    6.3703530213E+01    6.2994502868E+01    6.224334 [...]
+    6.8343426821E+01    6.8176764603E+01    6.7990770889E+01    6.7784596131E+01    6.7557321870E+01    6.7307981467E+01    6.7035590137E+01    6.6739110293E+01    6.6417472831E+01    6.6069616801E+01    6.5694446358E+01    6.5290870852E+01    6.4857799066E+01    6.4394161066E+01    6.3898902821E+01    6.3371026222E+01    6.2809538904E+01    6.2213530408E+01    6.1582140194E+01    6.0914570901E+01    6.0210127795E+01    5.9468196111E+01    5.8688262653E+01    5.7869910993E+01    5.701286 [...]
+    6.4291867287E+01    6.4071976923E+01    6.3828492003E+01    6.3560784364E+01    6.3268174516E+01    6.2949987811E+01    6.2605493852E+01    6.2233980759E+01    6.1834712955E+01    6.1406943079E+01    6.0949932778E+01    6.0462973328E+01    5.9945353543E+01    5.9396407092E+01    5.8815489543E+01    5.8202016618E+01    5.7555441562E+01    5.6875293087E+01    5.6161152991E+01    5.5412693648E+01    5.4629664142E+01    5.3811918533E+01    5.2959401903E+01    5.2072169728E+01    5.115039 [...]
+    5.9176783304E+01    5.8918124276E+01    5.8632966273E+01    5.8320876995E+01    5.7981441595E+01    5.7614221473E+01    5.7218765262E+01    5.6794645396E+01    5.6341426259E+01    5.5858667060E+01    5.5345983726E+01    5.4802983919E+01    5.4229312245E+01    5.3624677807E+01    5.2988798801E+01    5.2321471770E+01    5.1622541164E+01    5.0891918550E+01    5.0129593203E+01    4.9335618555E+01    4.8510162322E+01    4.7653445062E+01    4.6765828722E+01    4.5847747398E+01    4.489974 [...]
+    5.3274966215E+01    5.2991708527E+01    5.2680321005E+01    5.2340601874E+01    5.1972338842E+01    5.1575327390E+01    5.1149372695E+01    5.0694283664E+01    5.0209907326E+01    4.9696090795E+01    4.9152731638E+01    4.8579748123E+01    4.7977097550E+01    4.7344794133E+01    4.6682895443E+01    4.5991520163E+01    4.5270834825E+01    4.4521101559E+01    4.3742626472E+01    4.2935814321E+01    4.2101147017E+01    4.1239185040E+01    4.0350590309E+01    3.9436119150E+01    3.849662 [...]
+    4.6867030465E+01    4.6572460482E+01    4.6249342518E+01    4.5897655952E+01    4.5517375698E+01    4.5108496885E+01    4.4671043980E+01    4.4205057248E+01    4.3710594700E+01    4.3187771285E+01    4.2636723064E+01    4.2057624090E+01    4.1450702795E+01    4.0816236133E+01    4.0154551204E+01    3.9466033996E+01    3.8751144794E+01    3.8010397938E+01    3.7244370312E+01    3.6453743488E+01    3.5639248718E+01    3.4801702039E+01    3.3942023796E+01    3.3061191521E+01    3.216028 [...]
+    4.0225139037E+01    3.9931257205E+01    3.9609467609E+01    3.9259889214E+01    3.8882670239E+01    3.8477975204E+01    3.8045993386E+01    3.7586967926E+01    3.7101148286E+01    3.6588840259E+01    3.6050393068E+01    3.5486193744E+01    3.4896675204E+01    3.4282330633E+01    3.3643707485E+01    3.2981401804E+01    3.2296084988E+01    3.1588478113E+01    3.0859378016E+01    3.0109650586E+01    2.9340224342E+01    2.8552102489E+01    2.7746373852E+01    2.6924175696E+01    2.608675 [...]
+    3.3602648621E+01    3.3319836058E+01    3.3010647489E+01    3.2675320840E+01    3.2314125431E+01    3.1927375566E+01    3.1515399282E+01    3.1078571345E+01    3.0617320014E+01    3.0132096278E+01    2.9623399899E+01    2.9091785993E+01    2.8537853124E+01    2.7962249953E+01    2.7365687432E+01    2.6748915095E+01    2.6112756615E+01    2.5458091500E+01    2.4785849184E+01    2.4097036757E+01    2.3392704131E+01    2.2673987263E+01    2.1942057253E+01    2.1198175359E+01    2.044364 [...]
+    2.7225780496E+01    2.6962600866E+01    2.6675289913E+01    2.6364175790E+01    2.6029630763E+01    2.5672059964E+01    2.5291907645E+01    2.4889657569E+01    2.4465838995E+01    2.4021021278E+01    2.3555825200E+01    2.3070911929E+01    2.2566994054E+01    2.2044832630E+01    2.1505236941E+01    2.0949074541E+01    2.0377257445E+01    1.9790754383E+01    1.9190589501E+01    1.8577836047E+01    1.7953622357E+01    1.7319127571E+01    1.6675584359E+01    1.6024276437E+01    1.536653 [...]
+    2.1287373191E+01    2.1050471560E+01    2.0792214281E+01    2.0513002061E+01    2.0213263143E+01    1.9893476492E+01    1.9554153943E+01    1.9195857847E+01    1.8819183443E+01    1.8424778559E+01    1.8013328506E+01    1.7585567912E+01    1.7142272961E+01    1.6684267926E+01    1.6212424249E+01    1.5727659517E+01    1.5230936329E+01    1.4723261069E+01    1.4205688945E+01    1.3679321957E+01    1.3145296464E+01    1.2604801926E+01    1.2059061677E+01    1.1509340499E+01    1.095694 [...]
+    1.5942676773E+01    1.5736775780E+01    1.5512654458E+01    1.5270741637E+01    1.5011516012E+01    1.4735488155E+01    1.4443211338E+01    1.4135283211E+01    1.3812340974E+01    1.3475060930E+01    1.3124166171E+01    1.2760419418E+01    1.2384620257E+01    1.1997616185E+01    1.1600291292E+01    1.1193574689E+01    1.0778429282E+01    1.0355859655E+01    9.9269045294E+00    9.4926454267E+00    9.0541899981E+00    8.6126820089E+00    8.1692965521E+00    7.7252337794E+00    7.281722 [...]
+    1.1307149006E+01    1.1135110950E+01    1.0948172799E+01    1.0746777659E+01    1.0531414448E+01    1.0302606204E+01    1.0060916945E+01    9.8069526822E+00    9.5413552265E+00    9.2648049516E+00    8.9780215006E+00    8.6817609192E+00    8.3768161363E+00    8.0640171823E+00    7.7442248359E+00    7.4183401359E+00    7.0872913397E+00    6.7520398123E+00    6.4135747391E+00    6.0729137251E+00    5.7311001127E+00    5.3891988556E+00    5.0482950527E+00    4.7094921151E+00    4.373909 [...]
+    7.4560340879E+00    7.3190037065E+00    7.1704230141E+00    7.0107316505E+00    6.8404059222E+00    6.6599610323E+00    6.4699458211E+00    6.2709491188E+00    6.0635900625E+00    5.8485241918E+00    5.6264420478E+00    5.3980630683E+00    5.1641415229E+00    4.9254601389E+00    4.6828297373E+00    4.4370885981E+00    4.1891009520E+00    3.9397541402E+00    3.6899568528E+00    3.4406361072E+00    3.1927372633E+00    2.9472189904E+00    2.7050513781E+00    2.4672132626E+00    2.234689 [...]
+    4.4256216258E+00    4.3232009699E+00    4.2124786473E+00    4.0938711499E+00    3.9678276827E+00    3.8348332422E+00    3.6954030743E+00    3.5500849748E+00    3.3994574920E+00    3.2441286113E+00    3.0847348477E+00    2.9219387250E+00    2.7564296092E+00    2.5889199475E+00    2.4201452662E+00    2.2508611767E+00    2.0818416886E+00    1.9138777258E+00    1.7477734762E+00    1.5843454465E+00    1.4244196516E+00    1.2688275891E+00    1.1184055121E+00    9.7398965525E-01    8.364140 [...]
+    2.2158927697E+00    2.1463657130E+00    2.0715696533E+00    1.9918844967E+00    1.9077190459E+00    1.8195119967E+00    1.7277296136E+00    1.6328649302E+00    1.5354371577E+00    1.4359891818E+00    1.3350876251E+00    1.2333199891E+00    1.1312937712E+00    1.0296347265E+00    9.2898458902E-01    8.2999917523E-01    7.3334696564E-01    6.3970585194E-01    5.4976138661E-01    4.6420423019E-01    3.8372760496E-01    3.0902454116E-01    2.4078501590E-01    1.7969326372E-01    1.264246 [...]
+    7.9433738781E-01    7.5491143171E-01    7.1294337809E-01    6.6876613977E-01    6.2273811136E-01    5.7524161636E-01    5.2668219009E-01    4.7748698704E-01    4.2810402232E-01    3.7900018543E-01    3.3065989631E-01    2.8358369016E-01    2.3828626535E-01    1.9529473976E-01    1.5514668582E-01    1.1838813563E-01    8.5571467706E-02    5.7253107574E-02    3.3991293436E-02    1.6343579610E-02    4.8644067596E-03    1.0249725974E-04    2.5982055495E-03    1.2880808068E-02    3.146571 [...]
+    1.0066503129E-01    8.7724580869E-02    7.4596405441E-02    6.1560742097E-02    4.8918141961E-02    3.6988335685E-02    2.6109054579E-02    1.6634786098E-02    8.9353704465E-03    3.3945710262E-03    4.0851069673E-04    3.8403820610E-04    3.7369970274E-03    1.0890408970E-02    2.2272573537E-02    3.8315073821E-02    5.9450727891E-02    8.6111447038E-02    1.1872601791E-01    1.5771779555E-01    2.0350247282E-01    2.5648560119E-01    3.1706012936E-01    3.8560409397E-01    4.624778 [...]
+    5.2134553570E-02    6.1494213852E-02    7.2605046611E-02    8.5691441441E-02    1.0099309983E-01    1.1876390627E-01    1.3927082718E-01    1.6279262518E-01    1.8961839673E-01    2.2004638590E-01    2.5438223443E-01    2.9293748851E-01    3.3602799984E-01    3.8397210483E-01    4.3708873977E-01    4.9569595797E-01    5.6010853681E-01    6.3063611658E-01    7.0758152626E-01    7.9123818687E-01    8.8188820578E-01    9.7980066254E-01    1.0852285337E+00    1.1984077671E+00    1.319553 [...]
+    5.4923699545E-01    5.7638461924E-01    6.0678593994E-01    6.4060928127E-01    6.7803313464E-01    7.1924567824E-01    7.6444345940E-01    8.1383009266E-01    8.6761499607E-01    9.2601219464E-01    9.8923894561E-01    1.0575137244E+00    1.1310553877E+00    1.2100814964E+00    1.2948060815E+00    1.3854387291E+00    1.4821818987E+00    1.5852303088E+00    1.6947679644E+00    1.8109675640E+00    1.9339875949E+00    2.0639708084E+00    2.2010431804E+00    2.3453108694E+00    2.496858 [...]
+    1.4814747103E+00    1.5217967633E+00    1.5664382684E+00    1.6155128410E+00    1.6691405279E+00    1.7274465166E+00    1.7905604994E+00    1.8586137104E+00    1.9317403896E+00    2.0100750982E+00    2.0937518404E+00    2.1829019317E+00    2.2776538428E+00    2.3781314186E+00    2.4844515607E+00    2.5967240328E+00    2.7150490857E+00    2.8395163645E+00    2.9702033709E+00    3.1071729162E+00    3.2504739931E+00    3.4001377801E+00    3.5561764987E+00    3.7185839789E+00    3.887331 [...]
+    2.7330040701E+00    2.7819868655E+00    2.8359337380E+00    2.8949097504E+00    2.9589792236E+00    3.0282106221E+00    3.1026698474E+00    3.1824246358E+00    3.2675396202E+00    3.3580767223E+00    3.4540940442E+00    3.5556452514E+00    3.6627773450E+00    3.7755294044E+00    3.8939335236E+00    4.0180102722E+00    4.1477701454E+00    4.2832111773E+00    4.4243170300E+00    4.5710568287E+00    4.7233845001E+00    4.8812363091E+00    5.0445295555E+00    5.2131619318E+00    5.387012 [...]
+    4.1879310597E+00    4.2413320866E+00    4.2999542759E+00    4.3638176538E+00    4.4329391180E+00    4.5073352198E+00    4.5870172143E+00    4.6719949975E+00    4.7622720241E+00    4.8578486554E+00    4.9587156712E+00    5.0648601090E+00    5.1762573850E+00    5.2928759258E+00    5.4146729660E+00    5.5415954303E+00    5.6735762336E+00    5.8105378715E+00    5.9523846406E+00    6.0990117959E+00    6.2502907762E+00    6.4060834227E+00    6.5662298779E+00    6.7305532434E+00    6.898854 [...]
+    5.7350906530E+00    5.7890785019E+00    5.8482006084E+00    5.9124378474E+00    5.9817667355E+00    6.0561587974E+00    6.1355812917E+00    6.2199923239E+00    6.3093485155E+00    6.4035930047E+00    6.5026659546E+00    6.6064937910E+00    6.7149984292E+00    6.8280863266E+00    6.9456563561E+00    7.0675946139E+00    7.1937735397E+00    7.3240510360E+00    7.4582773002E+00    7.5962787501E+00    7.7378740945E+00    7.8828628390E+00    8.0310276090E+00    8.1821350619E+00    8.335935 [...]
+    7.2721654433E+00    7.3234261360E+00    7.3794426287E+00    7.4401624116E+00    7.5055292047E+00    7.5754809479E+00    7.6499461647E+00    7.7288449163E+00    7.8120897727E+00    7.8995884007E+00    7.9912318832E+00    8.0869067196E+00    8.1864878810E+00    8.2898365063E+00    8.3968073452E+00    8.5072384018E+00    8.6209584345E+00    8.7377814385E+00    8.8575093429E+00    8.9799297857E+00    9.1048138404E+00    9.2319239886E+00    9.3610017497E+00    9.4917791955E+00    9.623969 [...]
+    8.7090455423E+00    8.7548572615E+00    8.8048076313E+00    8.8588250356E+00    8.9168274204E+00    8.9787235500E+00    9.0444142706E+00    9.1137920871E+00    9.1867407259E+00    9.2631329674E+00    9.3428318771E+00    9.4256938051E+00    9.5115558058E+00    9.6002542117E+00    9.6916068322E+00    9.7854246902E+00    9.8815010493E+00    9.9796251134E+00    1.0079567486E+01    1.0181088641E+01    1.0283936831E+01    1.0387847777E+01    1.0492542569E+01    1.0597734737E+01    1.070312 [...]
+    9.9703707930E+00    1.0008637280E+01    1.0050255742E+01    1.0095135352E+01    1.0143176835E+01    1.0194272183E+01    1.0248302554E+01    1.0305143371E+01    1.0364654970E+01    1.0426693136E+01    1.0491099712E+01    1.0557707722E+01    1.0626342909E+01    1.0696816093E+01    1.0768928352E+01    1.0842470750E+01    1.0917227811E+01    1.0992964240E+01    1.1069443326E+01    1.1146411829E+01    1.1223607276E+01    1.1300759753E+01    1.1377582337E+01    1.1453786212E+01    1.152906 [...]
+    1.0997215692E+01    1.1026483314E+01    1.1058200316E+01    1.1092266136E+01    1.1128570856E+01    1.1166998780E+01    1.1207420706E+01    1.1249697479E+01    1.1293683571E+01    1.1339223116E+01    1.1386149695E+01    1.1434286145E+01    1.1483452009E+01    1.1533448094E+01    1.1584071590E+01    1.1635108289E+01    1.1686336298E+01    1.1737522097E+01    1.1788428181E+01    1.1838799479E+01    1.1888382701E+01    1.1936906956E+01    1.1984101296E+01    1.2029683131E+01    1.207336 [...]
+    1.1747953802E+01    1.1767388234E+01    1.1788311876E+01    1.1810623879E+01    1.1834209653E+01    1.1858948515E+01    1.1884711650E+01    1.1911358119E+01    1.1938738633E+01    1.1966697421E+01    1.1995066287E+01    1.2023674293E+01    1.2052335974E+01    1.2080861053E+01    1.2109048534E+01    1.2136690601E+01    1.2163572621E+01    1.2189471202E+01    1.2214156204E+01    1.2237390813E+01    1.2258933616E+01    1.2278534782E+01    1.2295940170E+01    1.2310889545E+01    1.232312 [...]
+    1.2198309338E+01    1.2207657626E+01    1.2217532438E+01    1.2227833722E+01    1.2238451406E+01    1.2249269317E+01    1.2260159218E+01    1.2270990672E+01    1.2281615202E+01    1.2291888037E+01    1.2301648338E+01    1.2310731072E+01    1.2318963090E+01    1.2326165142E+01    1.2332151937E+01    1.2336730240E+01    1.2339700939E+01    1.2340861156E+01    1.2339998426E+01    1.2336900777E+01    1.2331350971E+01    1.2323124724E+01    1.2311996900E+01    1.2297741773E+01    1.228012 [...]
+    1.2340696541E+01    1.2340222534E+01    1.2339355860E+01    1.2338003353E+01    1.2336061981E+01    1.2333424814E+01    1.2329975113E+01    1.2325588345E+01    1.2320134222E+01    1.2313476754E+01    1.2305472343E+01    1.2295969866E+01    1.2284814737E+01    1.2271847032E+01    1.2256901623E+01    1.2239806346E+01    1.2220386124E+01    1.2198465113E+01    1.2173859016E+01    1.2146385166E+01    1.2115854891E+01    1.2082081646E+01    1.2044875403E+01    1.2004044928E+01    1.195940 [...]
+    1.2182912195E+01    1.2173325190E+01    1.2162511340E+01    1.2150383727E+01    1.2136851884E+01    1.2121821850E+01    1.2105192317E+01    1.2086850794E+01    1.2066689415E+01    1.2044583455E+01    1.2020413037E+01    1.1994049532E+01    1.1965357683E+01    1.1934203587E+01    1.1900445097E+01    1.1863939835E+01    1.1824543435E+01    1.1782107829E+01    1.1736481502E+01    1.1687519425E+01    1.1635065922E+01    1.1578974282E+01    1.1519091647E+01    1.1455274705E+01    1.138737 [...]
+    1.1746312901E+01    1.1728688179E+01    1.1709108010E+01    1.1687503985E+01    1.1663800775E+01    1.1637918167E+01    1.1609771169E+01    1.1579270138E+01    1.1546320906E+01    1.1510826852E+01    1.1472687127E+01    1.1431798743E+01    1.1388052932E+01    1.1341341076E+01    1.1291552991E+01    1.1238577146E+01    1.1182299006E+01    1.1122605073E+01    1.1059381249E+01    1.0992516865E+01    1.0921897460E+01    1.0847416317E+01    1.0768961701E+01    1.0686433928E+01    1.059972 [...]
+    1.1063592943E+01    1.1039267068E+01    1.1012399201E+01    1.0982931377E+01    1.0950808795E+01    1.0915964957E+01    1.0878336760E+01    1.0837853427E+01    1.0794445979E+01    1.0748038092E+01    1.0698555562E+01    1.0645919071E+01    1.0590049937E+01    1.0530870303E+01    1.0468299668E+01    1.0402255156E+01    1.0332660865E+01    1.0259435352E+01    1.0182502815E+01    1.0101787901E+01    1.0017217805E+01    9.9287261065E+00    9.8362423652E+00    9.7397102175E+00    9.639069 [...]
+    1.0176261376E+01    1.0146755319E+01    1.0114266440E+01    1.0078755532E+01    1.0040179793E+01    9.9984965297E+00    9.9536614924E+00    9.9056236826E+00    9.8543362085E+00    9.7997493133E+00    9.7418123383E+00    9.6804739128E+00    9.6156839080E+00    9.5473918777E+00    9.4755490229E+00    9.4001066677E+00    9.3210182353E+00    9.2382411932E+00    9.1517321293E+00    9.0614555795E+00    8.9673740166E+00    8.8694600224E+00    8.7676846801E+00    8.6620313011E+00    8.552482 [...]
+    9.1319972939E+00    9.0989204921E+00    9.0625738814E+00    9.0229384668E+00    8.9799856162E+00    8.9336924742E+00    8.8840302318E+00    8.8309744108E+00    8.7744982576E+00    8.7145746030E+00    8.6511777046E+00    8.5842850622E+00    8.5138709639E+00    8.4399133277E+00    8.3623938564E+00    8.2812933215E+00    8.1965983143E+00    8.1082981623E+00    8.0163835511E+00    7.9208499796E+00    7.8216995324E+00    7.7189378879E+00    7.6125745684E+00    7.5026278402E+00    7.389118 [...]
+    7.9819587349E+00    7.9469283866E+00    7.9084976364E+00    7.8666569614E+00    7.8214011117E+00    7.7727197198E+00    7.7206053511E+00    7.6650504722E+00    7.6060522774E+00    7.5436050071E+00    7.4777048170E+00    7.4083530043E+00    7.3355515070E+00    7.2593015824E+00    7.1796131406E+00    7.0964957333E+00    7.0099633101E+00    6.9200343677E+00    6.8267291495E+00    6.7300757625E+00    6.6301058699E+00    6.5268577902E+00    6.4203723093E+00    6.3106986381E+00    6.197893 [...]
+    6.7781899094E+00    6.7427567208E+00    6.7039339479E+00    6.6617299358E+00    6.6161487809E+00    6.5671992035E+00    6.5148888323E+00    6.4592315454E+00    6.4002374931E+00    6.3379247219E+00    6.2723092664E+00    6.2034138312E+00    6.1312608252E+00    6.0558781470E+00    5.9772951115E+00    5.8955481376E+00    5.8106753241E+00    5.7227180157E+00    5.6317276776E+00    5.5377538405E+00    5.4408556974E+00    5.3410968061E+00    5.2385465328E+00    5.1332807818E+00    5.025380 [...]
+    5.5712053625E+00    5.5367913264E+00    5.4991311866E+00    5.4582421731E+00    5.4141435448E+00    5.3668566714E+00    5.3164044702E+00    5.2628141078E+00    5.2061151186E+00    5.1463395084E+00    5.0835218652E+00    5.0177020055E+00    4.9489225003E+00    4.8772287971E+00    4.8026718250E+00    4.7253061902E+00    4.6451902853E+00    4.5623882118E+00    4.4769680197E+00    4.3890041881E+00    4.2985746942E+00    4.2057640532E+00    4.1106627341E+00    4.0133660401E+00    3.913975 [...]
+    4.4078577891E+00    4.3757056425E+00    4.3405618457E+00    4.3024517822E+00    4.2614067418E+00    4.2174575269E+00    4.1706409440E+00    4.1209957742E+00    4.0685634403E+00    4.0133897919E+00    3.9555245771E+00    3.8950209382E+00    3.8319354862E+00    3.7663300228E+00    3.6982693769E+00    3.6278241978E+00    3.5550688024E+00    3.4800817819E+00    3.4029470965E+00    3.3237540689E+00    3.2425963537E+00    3.1595729868E+00    3.0747888575E+00    2.9883531811E+00    2.900380 [...]
+    3.3295391014E+00    3.3006744968E+00    3.2691614639E+00    3.2350344239E+00    3.1983309503E+00    3.1590913057E+00    3.1173609934E+00    3.0731867763E+00    3.0266217055E+00    2.9777211592E+00    2.9265438956E+00    2.8731540200E+00    2.8176190527E+00    2.7600104488E+00    2.7004050191E+00    2.6388830444E+00    2.5755287792E+00    2.5104322649E+00    2.4436874693E+00    2.3753931733E+00    2.3056520638E+00    2.2345728560E+00    2.1622676409E+00    2.0888547776E+00    2.014456 [...]
+    2.3707719406E+00    2.3459788293E+00    2.3189481477E+00    2.2897186041E+00    2.2583334509E+00    2.2248392027E+00    2.1892864975E+00    2.1517292615E+00    2.1122251472E+00    2.0708367635E+00    2.0276296122E+00    1.9826741256E+00    1.9360436400E+00    1.8878163872E+00    1.8380750408E+00    1.7869059077E+00    1.7343989244E+00    1.6806494817E+00    1.6257561101E+00    1.5698222644E+00    1.5129547921E+00    1.4552656140E+00    1.3968696950E+00    1.3378866613E+00    1.278440 [...]
+    1.5582174742E+00    1.5380280914E+00    1.5160539202E+00    1.4923368085E+00    1.4669229079E+00    1.4398616235E+00    1.4112059594E+00    1.3810136756E+00    1.3493455773E+00    1.3162665043E+00    1.2818452907E+00    1.2461544038E+00    1.2092705382E+00    1.1712736215E+00    1.1322480067E+00    1.0922814728E+00    1.0514657620E+00    1.0098961942E+00    9.6767186577E-01    9.2489539814E-01    8.8167309629E-01    8.3811441463E-01    7.9433248181E-01    7.5044341479E-01    7.065666 [...]
+    9.1010844097E-01    8.9480327054E-01    8.7818531159E-01    8.6029713519E-01    8.4118504102E-01    8.2089902649E-01    7.9949275265E-01    7.7702375569E-01    7.5355301997E-01    7.2914518323E-01    7.0386847816E-01    6.7779455302E-01    6.5099898478E-01    6.2356026747E-01    5.9556076278E-01    5.6708570319E-01    5.3822386740E-01    5.0906723031E-01    4.7971063762E-01    4.5025188856E-01    4.2079195962E-01    3.9143399515E-01    3.6228416486E-01    3.3345078641E-01    3.050444 [...]
+    4.3609523371E-01    4.2571587462E-01    4.1449237963E-01    4.0246579624E-01    3.8968114569E-01    3.7618647237E-01    3.6203359297E-01    3.4727750671E-01    3.3197655274E-01    3.1619237793E-01    2.9998977722E-01    2.8343672887E-01    2.6660425904E-01    2.4956634212E-01    2.3239979527E-01    2.1518426534E-01    1.9800199785E-01    1.8093786314E-01    1.6407901969E-01    1.4751497422E-01    1.3133729170E-01    1.1563950191E-01    1.0051688096E-01    8.6066276061E-02    7.238589 [...]
+    1.3748351903E-01    1.3185324688E-01    1.2582412481E-01    1.1943446727E-01    1.1272573999E-01    1.0574249918E-01    9.8532325466E-02    9.1145774042E-02    8.3636324514E-02    7.6060209419E-02    6.8476435256E-02    6.0946599737E-02    5.3534841853E-02    4.6307728689E-02    3.9334089894E-02    3.2684940249E-02    2.6433324251E-02    2.0654152184E-02    1.5424066034E-02    1.0821254447E-02    6.9252904065E-03    3.8169318878E-03    1.5779288787E-03    2.9081176964E-04    3.867168 [...]
+    7.8180753822E-03    6.5706419410E-03    5.3295456584E-03    4.1287808687E-03    3.0050471197E-03    1.9976846167E-03    1.1485944307E-03    5.0215655688E-04    1.0513956686E-04    6.6024705792E-06    2.5779004111E-04    9.1201976907E-04    2.0245613724E-03    3.6525070102E-03    5.8546361364E-03    8.6912666333E-03    1.2224102327E-02    1.6516073493E-02    2.1631155517E-02    2.7634198663E-02    3.4590726626E-02    4.2566759976E-02    5.1628562174E-02    6.1842482210E-02    7.327468 [...]
+    3.3763500374E-02    3.6377431401E-02    3.9349039435E-02    4.2707009550E-02    4.6482203303E-02    5.0707616403E-02    5.5418281810E-02    6.0651171491E-02    6.6445089723E-02    7.2840576635E-02    7.9879798049E-02    8.7606398009E-02    9.6065391317E-02    1.0530303271E-01    1.1536663227E-01    1.2630441465E-01    1.3816541438E-01    1.5099921488E-01    1.6485582516E-01    1.7978547521E-01    1.9583849190E-01    2.1306492483E-01    2.3151459365E-01    2.5123666569E-01    2.722794 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_hemi_ellipsoid_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_hemi_ellipsoid_BA.ima
new file mode 100644
index 0000000..9af4f65
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_hemi_ellipsoid_BA.ima
@@ -0,0 +1,100 @@
+    3.6243797396E+04    3.5692824242E+04    3.5097185715E+04    3.4459039563E+04    3.3780683420E+04    3.3064548301E+04    3.2313181999E+04    3.1529224455E+04    3.0715412980E+04    2.9874549640E+04    2.9009505284E+04    2.8123195647E+04    2.7218564926E+04    2.6298578577E+04    2.5366203000E+04    2.4424396511E+04    2.3476090847E+04    2.2524185593E+04    2.1571522537E+04    2.0620884406E+04    1.9674975984E+04    1.8736422499E+04    1.7807741187E+04    1.6891347552E+04    1.598954 [...]
+    3.5887440815E+04    3.5341411063E+04    3.4751115663E+04    3.4118700003E+04    3.3446442739E+04    3.2736757784E+04    3.1992161859E+04    3.1215278417E+04    3.0408817262E+04    2.9575564992E+04    2.8718360581E+04    2.7840096167E+04    2.6943691480E+04    2.6032086520E+04    2.5108221986E+04    2.4175032437E+04    2.3235422397E+04    2.2292266333E+04    2.1348381746E+04    2.0406527774E+04    1.9469387193E+04    1.8539554440E+04    1.7619530190E+04    1.6711711821E+04    1.581837 [...]
+    3.4836338428E+04    3.4304905877E+04    3.3730406893E+04    3.3114927566E+04    3.2460693089E+04    3.1770054270E+04    3.1045465443E+04    3.0289483109E+04    2.9504747642E+04    2.8693972868E+04    2.7859930215E+04    2.7005437026E+04    2.6133336434E+04    2.5246495628E+04    2.4347774165E+04    2.3440037226E+04    2.2526114039E+04    2.1608801760E+04    2.0690844884E+04    1.9774929833E+04    1.8863673960E+04    1.7959598839E+04    1.7065145234E+04    1.6182638384E+04    1.531429 [...]
+    3.3143089047E+04    3.2635264305E+04    3.2086302304E+04    3.1498206613E+04    3.0873107473E+04    3.0213259218E+04    2.9521012404E+04    2.8798817719E+04    2.8049198847E+04    2.7274761286E+04    2.6478155147E+04    2.5662077067E+04    2.4829252077E+04    2.3982421338E+04    2.3124331707E+04    2.2257718215E+04    2.1385289646E+04    2.0509721442E+04    1.9633645731E+04    1.8759629117E+04    1.7890169430E+04    1.7027689128E+04    1.6174513980E+04    1.5332870737E+04    1.450487 [...]
+    3.0891137231E+04    3.0414878434E+04    2.9900066338E+04    2.9348595431E+04    2.8762463116E+04    2.8143787666E+04    2.7494784814E+04    2.6817757109E+04    2.6115090488E+04    2.5389221499E+04    2.4642652975E+04    2.3877916751E+04    2.3097578231E+04    2.2304215453E+04    2.1500410624E+04    2.0688730497E+04    1.9871727124E+04    1.9051914947E+04    1.8231763656E+04    1.7413683109E+04    1.6600026574E+04    1.5793058579E+04    1.4994967175E+04    1.4207841556E+04    1.343367 [...]
+    2.8188828738E+04    2.7750743283E+04    2.7277229535E+04    2.6770030646E+04    2.6231001297E+04    2.5662094812E+04    2.5065361111E+04    2.4442926738E+04    2.3796989243E+04    2.3129811380E+04    2.2443693016E+04    2.1740978560E+04    2.1024035198E+04    2.0295240546E+04    1.9556978806E+04    1.8811622482E+04    1.8061520247E+04    1.7308991742E+04    1.6556316803E+04    1.5805716731E+04    1.5059354341E+04    1.4319326261E+04    1.3587637933E+04    1.2866216437E+04    1.215688 [...]
+    2.5161858134E+04    2.4766947346E+04    2.4340136891E+04    2.3883009229E+04    2.3397240681E+04    2.2884608838E+04    2.2346964836E+04    2.1786239200E+04    2.1204423212E+04    2.0603565705E+04    1.9985751292E+04    1.9353103824E+04    1.8707762713E+04    1.8051887771E+04    1.7387629531E+04    1.6717135984E+04    1.6042535703E+04    1.5365925432E+04    1.4689362635E+04    1.4014859238E+04    1.3344369501E+04    1.2679780840E+04    1.2022908624E+04    1.1375489288E+04    1.073916 [...]
+    2.1944692861E+04    2.1596224363E+04    2.1219649078E+04    2.0816365993E+04    2.0387871915E+04    1.9935740826E+04    1.9461620412E+04    1.8967221334E+04    1.8454313060E+04    1.7924714397E+04    1.7380274224E+04    1.6822878141E+04    1.6254425415E+04    1.5676826162E+04    1.5091993778E+04    1.4501831622E+04    1.3908220589E+04    1.3313021304E+04    1.2718054369E+04    1.2125102491E+04    1.1535890762E+04    1.0952093393E+04    1.0375309840E+04    9.8070759257E+03    9.248842 [...]
+    1.8671786547E+04    1.8371254371E+04    1.8046521799E+04    1.7698804422E+04    1.7329400071E+04    1.6939679525E+04    1.6531074628E+04    1.6105070828E+04    1.5663206295E+04    1.5207055315E+04    1.4738231308E+04    1.4258362724E+04    1.3769102980E+04    1.3272107480E+04    1.2769035180E+04    1.2261533969E+04    1.1751239800E+04    1.1239758200E+04    1.0728669780E+04    1.0219513281E+04    9.7137837048E+03    9.2129271403E+03    8.7183274713E+03    8.2313058443E+03    7.753116 [...]
+    1.5469220852E+04    1.5216411249E+04    1.4943278080E+04    1.4650858884E+04    1.4340251601E+04    1.4012620766E+04    1.3669178500E+04    1.3311186964E+04    1.2939948080E+04    1.2556800518E+04    1.2163106038E+04    1.1760250257E+04    1.1349627569E+04    1.0932646400E+04    1.0510705076E+04    1.0085201839E+04    9.6575158013E+03    9.2290093738E+03    8.8010146838E+03    8.3748315087E+03    7.9517244817E+03    7.5329088888E+03    7.1195508567E+03    6.7127660525E+03    6.313609 [...]
+    1.2447477761E+04    1.2240619207E+04    1.2017165835E+04    1.1777973252E+04    1.1523949882E+04    1.1256054704E+04    1.0975292463E+04    1.0682704562E+04    1.0379364318E+04    1.0066375908E+04    9.7448647934E+03    9.4159710945E+03    9.0808479035E+03    8.7406515658E+03    8.3965380591E+03    8.0496558865E+03    7.7011410895E+03    7.3521150645E+03    7.0036723611E+03    6.6568816165E+03    6.3127795488E+03    5.9723640648E+03    5.6365920186E+03    5.3063753455E+03    4.982577 [...]
+    9.6958336082E+03    9.5318315593E+03    9.3547007302E+03    9.1651263136E+03    8.9638400281E+03    8.7516062019E+03    8.5292300938E+03    8.2975444819E+03    8.0574091173E+03    7.8097080198E+03    7.5553402479E+03    7.2952172163E+03    7.0302618916E+03    6.7613963358E+03    6.4895437945E+03    6.2156215008E+03    5.9405372402E+03    5.6651816381E+03    5.3904294543E+03    5.1171308149E+03    4.8461101397E+03    4.5781605116E+03    4.3140432483E+03    4.0544802690E+03    3.800155 [...]
+    7.2787517221E+03    7.1534672262E+03    7.0181769916E+03    6.8734115596E+03    6.7197307372E+03    6.5577290748E+03    6.3880251189E+03    6.2112626587E+03    6.0281049326E+03    5.8392322687E+03    5.6453374092E+03    5.4471246792E+03    5.2453025130E+03    5.0405815046E+03    4.8336726348E+03    4.6252806250E+03    4.4161025002E+03    4.2068244486E+03    3.9981159945E+03    3.7906304016E+03    3.5849996029E+03    3.3818299353E+03    3.1817046157E+03    2.9851751335E+03    2.792763 [...]
+    5.2344015651E+03    5.1429714819E+03    5.0442561280E+03    4.9386441741E+03    4.8265504875E+03    4.7084124630E+03    4.5846854012E+03    4.4558428223E+03    4.3223737324E+03    4.1847786104E+03    4.0435675683E+03    3.8992573511E+03    3.7523696026E+03    3.6034264124E+03    3.4529504032E+03    3.3014580376E+03    3.1494616370E+03    2.9974637977E+03    2.8459552768E+03    2.6954150977E+03    2.5463042665E+03    2.3990675050E+03    2.2541299418E+03    2.1118945423E+03    1.972741 [...]
+    3.5752787518E+03    3.5124351382E+03    3.4445917215E+03    3.3720177401E+03    3.2950006015E+03    3.2138421338E+03    3.1288578535E+03    3.0403749887E+03    2.9487315855E+03    2.8542742290E+03    2.7573543119E+03    2.6583295861E+03    2.5575601446E+03    2.4554062994E+03    2.3522285612E+03    2.2483836232E+03    2.1442248663E+03    2.0400977712E+03    1.9363414279E+03    1.8332848227E+03    1.7312455629E+03    1.6305295230E+03    1.5314279561E+03    1.4342182134E+03    1.339160 [...]
+    2.2906767096E+03    2.2510553835E+03    2.2082811650E+03    2.1625234182E+03    2.1139627165E+03    2.0627890594E+03    2.0092009114E+03    1.9534044691E+03    1.8956116893E+03    1.8360407907E+03    1.7749128488E+03    1.7124530010E+03    1.6488875151E+03    1.5844427925E+03    1.5193452094E+03    1.4538197263E+03    1.3880875776E+03    1.3223667213E+03    1.2568696104E+03    1.1918032003E+03    1.1273671390E+03    1.0637530821E+03    1.0011446097E+03    9.3971524239E+02    8.796285 [...]
+    1.3506372105E+03    1.3290549488E+03    1.3057443357E+03    1.2807951954E+03    1.2543027001E+03    1.2263672506E+03    1.1970935997E+03    1.1665910132E+03    1.1349716509E+03    1.1023507713E+03    1.0688458754E+03    1.0345758220E+03    9.9966061838E+02    9.6422090085E+02    9.2837682509E+02    8.9224767564E+02    8.5595143172E+02    8.1960436436E+02    7.8331975079E+02    7.4720826024E+02    7.1137665607E+02    6.7592798976E+02    6.4096078271E+02    6.0656854136E+02    5.728397 [...]
+    7.1089792757E+02    7.0257871408E+02    6.9356967471E+02    6.8389947031E+02    6.7359827528E+02    6.6269824948E+02    6.5123306758E+02    6.3923769566E+02    6.2674844560E+02    6.1380282552E+02    6.0043909547E+02    5.8669618873E+02    5.7261387511E+02    5.5823191047E+02    5.4359065659E+02    5.2873022880E+02    5.1369072904E+02    4.9851195728E+02    4.8323312373E+02    4.6789287213E+02    4.5252921080E+02    4.3717893575E+02    4.2187800293E+02    4.0666097418E+02    3.915612 [...]
+    3.1830298339E+02    3.1904828642E+02    3.1980514272E+02    3.2055815633E+02    3.2129121575E+02    3.2198745015E+02    3.2262948440E+02    3.2319963542E+02    3.2367985597E+02    3.2405214365E+02    3.2429842543E+02    3.2440092815E+02    3.2434213459E+02    3.2410504504E+02    3.2367333534E+02    3.2303134016E+02    3.2216433721E+02    3.2105855300E+02    3.1970147354E+02    3.1808160656E+02    3.1618898174E+02    3.1401488872E+02    3.1155213344E+02    3.0879511702E+02    3.057398 [...]
+    1.1615852185E+02    1.2245471805E+02    1.2918420088E+02    1.3630273951E+02    1.4376368334E+02    1.5151819926E+02    1.5951561758E+02    1.6770373840E+02    1.7602920497E+02    1.8443788547E+02    1.9287521871E+02    2.0128659878E+02    2.0961765148E+02    2.1781470458E+02    2.2582503639E+02    2.3359732118E+02    2.4108189300E+02    2.4823104222E+02    2.5499933572E+02    2.6134392715E+02    2.6722482591E+02    2.7260503341E+02    2.7745089768E+02    2.8173221405E+02    2.854223 [...]
+    4.9069922118E+01    5.8135236406E+01    6.7836586670E+01    7.8113615511E+01    8.8902494793E+01    1.0013644747E+02    1.1174614309E+02    1.2366015117E+02    1.3580546024E+02    1.4810793440E+02    1.6049280591E+02    1.7288517395E+02    1.8521052907E+02    1.9739511990E+02    2.0936659032E+02    2.2105429117E+02    2.3238984043E+02    2.4330747716E+02    2.5374450525E+02    2.6364167505E+02    2.7294347482E+02    2.8159856417E+02    2.8955997134E+02    2.9678541601E+02    3.032374 [...]
+    6.6900619209E+01    7.6676442955E+01    8.7131676375E+01    9.8199671631E+01    1.0981002872E+02    1.2188905904E+02    1.3436037608E+02    1.4714530648E+02    1.6016343138E+02    1.7333324465E+02    1.8657256596E+02    1.9979916345E+02    2.1293124581E+02    2.2588807957E+02    2.3859047656E+02    2.5096120925E+02    2.6292572981E+02    2.7441243012E+02    2.8535318309E+02    2.9568372064E+02    3.0534418028E+02    3.1427922974E+02    3.2243848654E+02    3.2977689699E+02    3.362548 [...]
+    1.2761629723E+02    1.3671273381E+02    1.4642691628E+02    1.5669323885E+02    1.6744252836E+02    1.7860237876E+02    1.9009780228E+02    2.0185170639E+02    2.1378535618E+02    2.2581903446E+02    2.3787249718E+02    2.4986555137E+02    2.6171864456E+02    2.7335336733E+02    2.8469294671E+02    2.9566281463E+02    3.0619111292E+02    3.1620908648E+02    3.2565156530E+02    3.3445745806E+02    3.4256996511E+02    3.4993707430E+02    3.5651192791E+02    3.6225282678E+02    3.671237 [...]
+    1.9891633150E+02    2.0652331182E+02    2.1462785158E+02    2.2317044264E+02    2.3208831725E+02    2.4131586985E+02    2.5078530254E+02    2.6042684107E+02    2.7016951354E+02    2.7994151031E+02    2.8967071232E+02    2.9928520829E+02    3.0871382333E+02    3.1788653798E+02    3.2673514756E+02    3.3519349737E+02    3.4319821833E+02    3.5068886501E+02    3.5760858678E+02    3.6390429820E+02    3.6952717901E+02    3.7443289817E+02    3.7858190736E+02    3.8193975744E+02    3.844771 [...]
+    2.5868587473E+02    2.6446261227E+02    2.7059541837E+02    2.7703365067E+02    2.8372400126E+02    2.9061091324E+02    2.9763685758E+02    3.0474299363E+02    3.1186942971E+02    3.1895567172E+02    3.2594122319E+02    3.3276585298E+02    3.3937012878E+02    3.4569590784E+02    3.5168659060E+02    3.5728777106E+02    3.6244734463E+02    3.6711618194E+02    3.7124825902E+02    3.7480107575E+02    3.7773590196E+02    3.8001813464E+02    3.8161743420E+02    3.8250796878E+02    3.826685 [...]
+    2.9441523729E+02    2.9837075984E+02    3.0254647685E+02    3.0690187131E+02    3.1139432104E+02    3.1597943445E+02    3.2061150101E+02    3.2524366732E+02    3.2982850609E+02    3.3431815787E+02    3.3866497574E+02    3.4282160716E+02    3.4674160152E+02    3.5037963734E+02    3.5369190984E+02    3.5663648624E+02    3.5917361834E+02    3.6126594480E+02    3.6287905005E+02    3.6398131010E+02    3.6454456468E+02    3.6454407656E+02    3.6395868936E+02    3.6277122524E+02    3.609683 [...]
+    3.0181741894E+02    3.0419333411E+02    3.0667649149E+02    3.0923638013E+02    3.1184098402E+02    3.1445692887E+02    3.1704995024E+02    3.1958510307E+02    3.2202698409E+02    3.2434015654E+02    3.2648932737E+02    3.2843966676E+02    3.3015710708E+02    3.3160871471E+02    3.3276279785E+02    3.3358917975E+02    3.3405966454E+02    3.3414806354E+02    3.3383036048E+02    3.3308526170E+02    3.3189388695E+02    3.3024036622E+02    3.2811163324E+02    3.2549785987E+02    3.223921 [...]
+    2.8292382571E+02    2.8408842914E+02    2.8527901342E+02    2.8647401618E+02    2.8765081920E+02    2.8878603521E+02    2.8985557141E+02    2.9083501179E+02    2.9169977206E+02    2.9242516031E+02    2.9298692029E+02    2.9336107528E+02    2.9352447234E+02    2.9345479655E+02    2.9313072713E+02    2.9253232262E+02    2.9164111602E+02    2.9044015780E+02    2.8891431624E+02    2.8705053480E+02    2.8483755559E+02    2.8226647031E+02    2.7933059910E+02    2.7602553771E+02    2.723492 [...]
+    2.4395014590E+02    2.4431084457E+02    2.4464949790E+02    2.4495199683E+02    2.4520348340E+02    2.4538874287E+02    2.4549206244E+02    2.4549766058E+02    2.4538966059E+02    2.4515225247E+02    2.4476988737E+02    2.4422744240E+02    2.4351037893E+02    2.4260477332E+02    2.4149755016E+02    2.4017663211E+02    2.3863095784E+02    2.3685072044E+02    2.3482739631E+02    2.3255382498E+02    2.3002444601E+02    2.2723506687E+02    2.2418322939E+02    2.2086814670E+02    2.172906 [...]
+    1.9320410462E+02    1.9314131996E+02    1.9303827394E+02    1.9288649098E+02    1.9267709608E+02    1.9240093361E+02    1.9204873189E+02    1.9161112810E+02    1.9107872974E+02    1.9044227933E+02    1.8969278721E+02    1.8882145882E+02    1.8781999744E+02    1.8668055899E+02    1.8539585253E+02    1.8395924423E+02    1.8236485854E+02    1.8060762967E+02    1.7868330864E+02    1.7658860261E+02    1.7432124286E+02    1.7187986984E+02    1.6926427778E+02    1.6647531335E+02    1.635148 [...]
+    1.3925647645E+02    1.3908049708E+02    1.3886915967E+02    1.3861786106E+02    1.3832185190E+02    1.3797620469E+02    1.3757594863E+02    1.3711608392E+02    1.3659161968E+02    1.3599765959E+02    1.3532942075E+02    1.3458233694E+02    1.3375207992E+02    1.3283457907E+02    1.3182612895E+02    1.3072338934E+02    1.2952348002E+02    1.2822395015E+02    1.2682284642E+02    1.2531876702E+02    1.2371088670E+02    1.2199893125E+02    1.2018320909E+02    1.1826469151E+02    1.162449 [...]
+    8.9531771921E+01    8.9460943654E+01    8.9374642584E+01    8.9270645306E+01    8.9146670831E+01    8.9000330370E+01    8.8829220676E+01    8.8630863774E+01    8.8402814467E+01    8.8142633049E+01    8.7847907935E+01    8.7516309904E+01    8.7145597699E+01    8.6733627390E+01    8.6278410874E+01    8.5778090352E+01    8.5231003968E+01    8.4635663925E+01    8.3990796203E+01    8.3295354878E+01    8.2548537692E+01    8.1749788489E+01    8.0898788684E+01    7.9995529544E+01    7.904023 [...]
+    4.9398696678E+01    4.9555788917E+01    4.9724229504E+01    4.9902984734E+01    5.0090934630E+01    5.0286888814E+01    5.0489590446E+01    5.0697706920E+01    5.0909856308E+01    5.1124584164E+01    5.1340392996E+01    5.1555733452E+01    5.1769012127E+01    5.1978602941E+01    5.2182845208E+01    5.2380060978E+01    5.2568544328E+01    5.2746583943E+01    5.2912472307E+01    5.3064498639E+01    5.3200945656E+01    5.3320149224E+01    5.3420442225E+01    5.3500198901E+01    5.355783 [...]
+    2.1767637830E+01    2.2190016578E+01    2.2650657716E+01    2.3148803127E+01    2.3683598947E+01    2.4254085764E+01    2.4859181459E+01    2.5497692398E+01    2.6168291803E+01    2.6869519129E+01    2.7599783596E+01    2.8357337782E+01    2.9140306772E+01    2.9946654745E+01    3.0774190428E+01    3.1620591226E+01    3.2483364660E+01    3.3359886948E+01    3.4247385617E+01    3.5142940580E+01    3.6043514755E+01    3.6945941078E+01    3.7846934579E+01    3.8743106393E+01    3.963097 [...]
+    7.1399548114E+00    7.7987774599E+00    8.5177863291E+00    9.2959661262E+00    1.0132159077E+01    1.1025057124E+01    1.1973180777E+01    1.2974875570E+01    1.4028303766E+01    1.5131427038E+01    1.6282007863E+01    1.7477594322E+01    1.8715514477E+01    1.9992876627E+01    2.1306563744E+01    2.2653230302E+01    2.4029308087E+01    2.5430997657E+01    2.6854290655E+01    2.8294959012E+01    2.9748571763E+01    3.1210508584E+01    3.2675970076E+01    3.4139993041E+01    3.559746 [...]
+    4.0073481118E+00    4.8309058605E+00    5.7286102740E+00    6.6989409833E+00    7.7401847274E+00    8.8504315148E+00    1.0027559005E+01    1.1269224789E+01    1.2572854537E+01    1.3935635910E+01    1.5354508541E+01    1.6826158705E+01    1.8347017930E+01    1.9913255127E+01    2.1520779056E+01    2.3165236611E+01    2.4842022157E+01    2.6546269993E+01    2.8272881075E+01    3.0016516336E+01    3.1771621145E+01    3.3532437898E+01    3.5293014217E+01    3.7047237996E+01    3.878885 [...]
+    9.4734893427E+00    1.0370623973E+01    1.1346930500E+01    1.2400355125E+01    1.3528618229E+01    1.4729212180E+01    1.5999380585E+01    1.7336123857E+01    1.8736186407E+01    2.0196053688E+01    2.1711941613E+01    2.3279805940E+01    2.4895332165E+01    2.6553931748E+01    2.8250767518E+01    2.9980731581E+01    3.1738467968E+01    3.3518369683E+01    3.5314622999E+01    3.7121172161E+01    3.8931776918E+01    4.0740016728E+01    4.2539311748E+01    4.4322956655E+01    4.608412 [...]
+    1.9964475615E+01    2.0844863447E+01    2.1801196398E+01    2.2831021592E+01    2.3931638829E+01    2.5100100131E+01    2.6333210591E+01    2.7627509833E+01    2.8979281877E+01    3.0384557868E+01    3.1839110224E+01    3.3338435959E+01    3.4877801134E+01    3.6452212719E+01    3.8056431215E+01    3.9684987840E+01    4.1332199557E+01    4.2992159380E+01    4.4658787885E+01    4.6325811003E+01    4.7986807682E+01    4.9635227696E+01    5.1264414691E+01    5.2867606056E+01    5.443802 [...]
+    3.1907180687E+01    3.2696414243E+01    3.3551979806E+01    3.4471236575E+01    3.5451292086E+01    3.6489005582E+01    3.7580996236E+01    3.8723649146E+01    3.9913090877E+01    4.1145202551E+01    4.2415660721E+01    4.3719874055E+01    4.5053054065E+01    4.6410189069E+01    4.7786059306E+01    4.9175263185E+01    5.0572213673E+01    5.1971159616E+01    5.3366207874E+01    5.4751349740E+01    5.6120465910E+01    5.7467346084E+01    5.8785747594E+01    6.0069389284E+01    6.131199 [...]
+    4.2281064596E+01    4.2929655611E+01    4.3631070146E+01    4.4382695086E+01    4.5181698342E+01    4.6025007943E+01    4.6909349527E+01    4.7831212422E+01    4.8786889342E+01    4.9772459892E+01    5.0783787626E+01    5.1816572063E+01    5.2866321052E+01    5.3928349273E+01    5.4997847970E+01    5.6069831015E+01    5.7139210580E+01    5.8200764063E+01    5.9249195211E+01    6.0279111651E+01    6.1285085723E+01    6.2261658795E+01    6.3203350739E+01    6.4104713385E+01    6.496034 [...]
+    4.8984008850E+01    4.9470396206E+01    4.9994782904E+01    5.0554806889E+01    5.1147890837E+01    5.1771266693E+01    5.2421988831E+01    5.3096922888E+01    5.3792754490E+01    5.4506011761E+01    5.5233067983E+01    5.5970138835E+01    5.6713301531E+01    5.7458518042E+01    5.8201616132E+01    5.8938356235E+01    5.9664377249E+01    6.0375282872E+01    6.1066612488E+01    6.1733873365E+01    6.2372567793E+01    6.2978192760E+01    6.3546304498E+01    6.4072481237E+01    6.455240 [...]
+    5.0989979152E+01    5.1318465419E+01    5.1671119591E+01    5.2045949324E+01    5.2440787708E+01    5.2853327260E+01    5.3281114991E+01    5.3721544627E+01    5.4171895269E+01    5.4629306828E+01    5.5090802400E+01    5.5553311987E+01    5.6013652509E+01    5.6468571257E+01    5.6914729908E+01    5.7348739321E+01    5.7767165499E+01    5.8166520192E+01    5.8543337211E+01    5.8894122652E+01    5.9215407733E+01    5.9503760187E+01    5.9755801157E+01    5.9968218500E+01    6.013779 [...]
+    4.8310917431E+01    4.8505992720E+01    4.8714043795E+01    4.8933540116E+01    4.9162809084E+01    4.9400067028E+01    4.9643424473E+01    4.9890904500E+01    5.0140423816E+01    5.0389806006E+01    5.0636812262E+01    5.0879128943E+01    5.1114373093E+01    5.1340117538E+01    5.1553888159E+01    5.1753201692E+01    5.1935516945E+01    5.2098331649E+01    5.2239110141E+01    5.2355351871E+01    5.2444594550E+01    5.2504414717E+01    5.2532448299E+01    5.2526395515E+01    5.248405 [...]
+    4.1802160553E+01    4.1900765336E+01    4.2004775740E+01    4.2113099991E+01    4.2224555152E+01    4.2337901366E+01    4.2451804193E+01    4.2564892824E+01    4.2675715006E+01    4.2782763134E+01    4.2884486521E+01    4.2979301928E+01    4.3065573287E+01    4.3141649369E+01    4.3205856575E+01    4.3256511755E+01    4.3291930037E+01    4.3310416640E+01    4.3310316777E+01    4.3289982517E+01    4.3247806680E+01    4.3182222178E+01    4.3091718736E+01    4.2974847479E+01    4.283023 [...]
+    3.2867851762E+01    3.2911307059E+01    3.2956392025E+01    3.3002407719E+01    3.3048622839E+01    3.3094259263E+01    3.3138487571E+01    3.3180434299E+01    3.3219215685E+01    3.3253892271E+01    3.3283501374E+01    3.3307060643E+01    3.3323579741E+01    3.3332036433E+01    3.3331412371E+01    3.3320682211E+01    3.3298827753E+01    3.3264832169E+01    3.3217694504E+01    3.3156441993E+01    3.3080115560E+01    3.2987800758E+01    3.2878610772E+01    3.2751703544E+01    3.260629 [...]
+    2.3128858916E+01    2.3155646868E+01    2.3183664786E+01    2.3212545084E+01    2.3241890428E+01    2.3271282572E+01    2.3300279015E+01    2.3328412858E+01    2.3355200513E+01    2.3380143566E+01    2.3402722311E+01    2.3422406277E+01    2.3438659605E+01    2.3450930606E+01    2.3458665508E+01    2.3461310706E+01    2.3458302173E+01    2.3449096092E+01    2.3433136234E+01    2.3409887685E+01    2.3378821315E+01    2.3339426456E+01    2.3291208127E+01    2.3233689116E+01    2.316642 [...]
+    1.4111430021E+01    1.4151859872E+01    1.4195653960E+01    1.4242655370E+01    1.4292701718E+01    1.4345610375E+01    1.4401189510E+01    1.4459237670E+01    1.4519536003E+01    1.4581859777E+01    1.4645970749E+01    1.4711616808E+01    1.4778541504E+01    1.4846472602E+01    1.4915131605E+01    1.4984235050E+01    1.5053480615E+01    1.5122570735E+01    1.5191192229E+01    1.5259030639E+01    1.5325762713E+01    1.5391064202E+01    1.5454604272E+01    1.5516050291E+01    1.557507 [...]
+    7.0026536553E+00    7.0758417658E+00    7.1559750420E+00    7.2430109822E+00    7.3368991677E+00    7.4375824627E+00    7.5449936781E+00    7.6590554826E+00    7.7796786884E+00    7.9067635556E+00    8.0401961086E+00    8.1798478141E+00    8.3255756048E+00    8.4772218298E+00    8.6346097602E+00    8.7975435033E+00    8.9658107970E+00    9.1391794992E+00    9.3173967562E+00    9.5001855434E+00    9.6872490662E+00    9.8782713459E+00    1.0072908288E+01    1.0270794074E+01    1.047154 [...]
+    2.5011498958E+00    2.6143379090E+00    2.7384144259E+00    2.8733606223E+00    3.0191497903E+00    3.1757445396E+00    3.3430967733E+00    3.5211444129E+00    3.7098100693E+00    3.9090005854E+00    4.1186024529E+00    4.3384828056E+00    4.5684859509E+00    4.8084315648E+00    5.0581136056E+00    5.3172968295E+00    5.5857178685E+00    5.8630806321E+00    6.1490579425E+00    6.4432870354E+00    6.7453696223E+00    7.0548716886E+00    7.3713196758E+00    7.6942036244E+00    8.022973 [...]
+    7.7221052905E-01    9.2210426280E-01    1.0862692191E+00    1.2646468721E+00    1.4571652340E+00    1.6637369778E+00    1.8842578020E+00    2.1186041080E+00    2.3666298373E+00    2.6281670636E+00    2.9030203032E+00    3.1909674096E+00    3.4917548764E+00    3.8050980923E+00    4.1306763427E+00    4.4681343786E+00    4.8170767455E+00    5.1770694078E+00    5.5476344397E+00    5.9282516253E+00    6.3183571347E+00    6.7173394959E+00    7.1245409884E+00    7.5392572467E+00    7.960736 [...]
+    1.4987238906E+00    1.6742602592E+00    1.8662483263E+00    2.0745538883E+00    2.2990232241E+00    2.5394799956E+00    2.7957240388E+00    3.0675292904E+00    3.3546424704E+00    3.6567782740E+00    3.9736203141E+00    4.3048180876E+00    4.6499836691E+00    5.0086908850E+00    5.3804741709E+00    5.7648243454E+00    6.1611893039E+00    6.5689719824E+00    6.9875254799E+00    7.4161608645E+00    7.8541349485E+00    8.3006568456E+00    8.7548869358E+00    9.2159334812E+00    9.682856 [...]
+    4.0051975707E+00    4.1910439933E+00    4.3940106720E+00    4.6138795424E+00    4.8504059834E+00    5.1033176005E+00    5.3723100336E+00    5.6570510628E+00    5.9571709689E+00    6.2722690716E+00    6.6019061371E+00    6.9456015315E+00    7.3028396255E+00    7.6730586422E+00    8.0556581469E+00    8.4499897617E+00    8.8553593487E+00    9.2710311034E+00    9.6962160232E+00    1.0130079833E+01    1.0571742320E+01    1.1020272324E+01    1.1474690963E+01    1.1933972716E+01    1.239704 [...]
+    7.4237703448E+00    7.6038676875E+00    7.8002543527E+00    8.0126427863E+00    8.2407101727E+00    8.4841050740E+00    8.7424395389E+00    9.0152922361E+00    9.3022065728E+00    9.6026849699E+00    9.9161966056E+00    1.0242165824E+01    1.0579979319E+01    1.0928982556E+01    1.1288475475E+01    1.1657718988E+01    1.2035927903E+01    1.2422274804E+01    1.2815885534E+01    1.3215844080E+01    1.3621191112E+01    1.4030927955E+01    1.4444007858E+01    1.4859346930E+01    1.527582 [...]
+    1.0868756580E+01    1.1029326773E+01    1.1204134880E+01    1.1392844559E+01    1.1595090731E+01    1.1810469987E+01    1.2038547803E+01    1.2278852245E+01    1.2530876808E+01    1.2794077351E+01    1.3067874203E+01    1.3351644391E+01    1.3644733163E+01    1.3946443085E+01    1.4256039117E+01    1.4572750777E+01    1.4895762117E+01    1.5224223167E+01    1.5557249512E+01    1.5893910057E+01    1.6233248356E+01    1.6574267267E+01    1.6915938301E+01    1.7257198459E+01    1.759696 [...]
+    1.3589558876E+01    1.3721200092E+01    1.3864244118E+01    1.4018348821E+01    1.4183132999E+01    1.4358188095E+01    1.4543073120E+01    1.4737307237E+01    1.4940384940E+01    1.5151761678E+01    1.5370859244E+01    1.5597070909E+01    1.5829748251E+01    1.6068215897E+01    1.6311765047E+01    1.6559651672E+01    1.6811100294E+01    1.7065308555E+01    1.7321437552E+01    1.7578625748E+01    1.7835981506E+01    1.8092588560E+01    1.8347504599E+01    1.8599765984E+01    1.884839 [...]
+    1.5079511109E+01    1.5178171034E+01    1.5285137793E+01    1.5400082720E+01    1.5522656759E+01    1.5652475847E+01    1.5789129054E+01    1.5932178576E+01    1.6081155362E+01    1.6235561181E+01    1.6394870728E+01    1.6558534182E+01    1.6725969891E+01    1.6896574016E+01    1.7069708778E+01    1.7244721245E+01    1.7420927452E+01    1.7597625197E+01    1.7774084614E+01    1.7949560227E+01    1.8123285583E+01    1.8294477670E+01    1.8462340959E+01    1.8626060498E+01    1.878481 [...]
+    1.5128447156E+01    1.5195339182E+01    1.5267654268E+01    1.5345112133E+01    1.5427413170E+01    1.5514229295E+01    1.5605216742E+01    1.5700001879E+01    1.5798190270E+01    1.5899368682E+01    1.6003095603E+01    1.6108914694E+01    1.6216344391E+01    1.6324889175E+01    1.6434028634E+01    1.6543227163E+01    1.6651930751E+01    1.6759573556E+01    1.6865570724E+01    1.6969327195E+01    1.7070236304E+01    1.7167681700E+01    1.7261034384E+01    1.7349666908E+01    1.743294 [...]
+    1.3817762432E+01    1.3858394161E+01    1.3902153130E+01    1.3948822724E+01    1.3998172810E+01    1.4049950660E+01    1.4103890587E+01    1.4159707796E+01    1.4217099475E+01    1.4275751186E+01    1.4335329552E+01    1.4395487267E+01    1.4455865687E+01    1.4516088314E+01    1.4575769565E+01    1.4634510764E+01    1.4691903830E+01    1.4747528799E+01    1.4800959724E+01    1.4851760802E+01    1.4899492069E+01    1.4943709588E+01    1.4983962552E+01    1.5019804964E+01    1.505078 [...]
+    1.1466407424E+01    1.1489026518E+01    1.1513289678E+01    1.1539050481E+01    1.1566149321E+01    1.1594413233E+01    1.1623660311E+01    1.1653694918E+01    1.1684314610E+01    1.1715304615E+01    1.1746437689E+01    1.1777481564E+01    1.1808193574E+01    1.1838322570E+01    1.1867609337E+01    1.1895788955E+01    1.1922590651E+01    1.1947736107E+01    1.1970943748E+01    1.1991931129E+01    1.2010406456E+01    1.2026084205E+01    1.2038671266E+01    1.2047879092E+01    1.205341 [...]
+    8.5433067046E+00    8.5571344450E+00    8.5719931579E+00    8.5877951780E+00    8.6044491437E+00    8.6218521076E+00    8.6399010956E+00    8.6584827386E+00    8.6774774051E+00    8.6967598659E+00    8.7162015600E+00    8.7356639561E+00    8.7550102932E+00    8.7740920402E+00    8.7927611410E+00    8.8108631243E+00    8.8282420135E+00    8.8447369311E+00    8.8601859186E+00    8.8744233219E+00    8.8872840855E+00    8.8986004904E+00    8.9082030912E+00    8.9159279830E+00    8.921605 [...]
+    5.5653886979E+00    5.5789565274E+00    5.5937105509E+00    5.6096140929E+00    5.6266265750E+00    5.6447036652E+00    5.6637998120E+00    5.6838640674E+00    5.7048434189E+00    5.7266824666E+00    5.7493210473E+00    5.7726979304E+00    5.7967464830E+00    5.8214006184E+00    5.8465885488E+00    5.8722369947E+00    5.8982702883E+00    5.9246094245E+00    5.9511735875E+00    5.9778799836E+00    6.0046424019E+00    6.0313742381E+00    6.0579866846E+00    6.0843873037E+00    6.110485 [...]
+    3.0003757952E+00    3.0202242585E+00    3.0419797483E+00    3.0656371392E+00    3.0911896489E+00    3.1186291060E+00    3.1479465935E+00    3.1791314131E+00    3.2121705173E+00    3.2470509349E+00    3.2837553295E+00    3.3222659810E+00    3.3625613198E+00    3.4046187039E+00    3.4484118882E+00    3.4939114201E+00    3.5410849693E+00    3.5898973203E+00    3.6403088891E+00    3.6922771248E+00    3.7457547415E+00    3.8006912452E+00    3.8570310708E+00    3.9147145958E+00    3.973677 [...]
+    1.1903238929E+00    1.2202412597E+00    1.2530827031E+00    1.2888565549E+00    1.3275703542E+00    1.3692311346E+00    1.4138446305E+00    1.4614158226E+00    1.5119478214E+00    1.5654414733E+00    1.6218955940E+00    1.6813067454E+00    1.7436674684E+00    1.8089677493E+00    1.8771933340E+00    1.9483258164E+00    2.0223422467E+00    2.0992140762E+00    2.1789078214E+00    2.2613836580E+00    2.3465963240E+00    2.4344934072E+00    2.5250142395E+00    2.6180927085E+00    2.713653 [...]
+    3.0645615937E-01    3.4729156134E-01    3.9209022608E-01    4.4085805429E-01    4.9360003874E-01    5.5031965227E-01    6.1101880239E-01    6.7569725832E-01    7.4435193447E-01    8.1697716117E-01    8.9356335329E-01    9.7409714051E-01    1.0585605910E+00    1.1469308343E+00    1.2391795024E+00    1.3352723230E+00    1.4351681671E+00    1.5388188889E+00    1.6461689596E+00    1.7571545118E+00    1.8717032129E+00    1.9897332154E+00    2.1111535173E+00    2.2358625186E+00    2.363748 [...]
+    3.3924473221E-01    3.8924855485E-01    4.4404333087E-01    5.0362132245E-01    5.6797251910E-01    6.3708405189E-01    7.1093999629E-01    7.8952077770E-01    8.7280243909E-01    9.6075655811E-01    1.0533498868E+00    1.1505432049E+00    1.2522911627E+00    1.3585417332E+00    1.4692355009E+00    1.5843055247E+00    1.7036761128E+00    1.8272631131E+00    1.9549724999E+00    2.0867003036E+00    2.2223321277E+00    2.3617429230E+00    2.5047958505E+00    2.6513421607E+00    2.801220 [...]
+    1.1212387315E+00    1.1767938288E+00    1.2375973640E+00    1.3036216942E+00    1.3748355151E+00    1.4512028742E+00    1.5326831903E+00    1.6192299475E+00    1.7107921305E+00    1.8073106233E+00    1.9087215925E+00    2.0149522049E+00    2.1259235285E+00    2.2415475218E+00    2.3617272640E+00    2.4863572949E+00    2.6153213703E+00    2.7484948256E+00    2.8857408621E+00    3.0269118877E+00    3.1718486880E+00    3.3203808506E+00    3.4723247680E+00    3.6274847248E+00    3.785652 [...]
+    2.3748397657E+00    2.4314042202E+00    2.4932357129E+00    2.5602865202E+00    2.6325031256E+00    2.7098261077E+00    2.7921895626E+00    2.8795214228E+00    2.9717413928E+00    3.0687626248E+00    3.1704900526E+00    3.2768205802E+00    3.3876422538E+00    3.5028327919E+00    3.6222622463E+00    3.7457898953E+00    3.8732641089E+00    4.0045232869E+00    4.1393951158E+00    4.2776950996E+00    4.4192272393E+00    4.5637847062E+00    4.7111467978E+00    4.8610817392E+00    5.013345 [...]
+    3.7738540117E+00    3.8269248781E+00    3.8848642303E+00    3.9476066077E+00    4.0150812476E+00    4.0872102192E+00    4.1639075993E+00    4.2450803080E+00    4.3306266298E+00    4.4204381549E+00    4.5143970128E+00    4.6123759442E+00    4.7142389037E+00    4.8198422803E+00    4.9290298838E+00    5.0416376877E+00    5.1574910594E+00    5.2764044037E+00    5.3981819767E+00    5.5226178843E+00    5.6494942405E+00    5.7785828266E+00    5.9096449766E+00    6.0424297384E+00    6.176676 [...]
+    5.0065592196E+00    5.0524909736E+00    5.1025674455E+00    5.1567138089E+00    5.2148499516E+00    5.2768855873E+00    5.3427249786E+00    5.4122626178E+00    5.4853872224E+00    5.5619779515E+00    5.6419043206E+00    5.7250301235E+00    5.8112086243E+00    5.9002844989E+00    5.9920925988E+00    6.0864604534E+00    6.1832044219E+00    6.2821337203E+00    6.3830463984E+00    6.4857322141E+00    6.5899691259E+00    6.6955279973E+00    6.8021726127E+00    6.9096515753E+00    7.017709 [...]
+    5.8291392324E+00    5.8656957394E+00    5.9054889042E+00    5.9484430541E+00    5.9944768434E+00    6.0434986659E+00    6.0954115498E+00    6.1501097266E+00    6.2074821269E+00    6.2674074767E+00    6.3297589005E+00    6.3944018185E+00    6.4611912711E+00    6.5299781026E+00    6.6006034013E+00    6.6729002161E+00    6.7466933801E+00    6.8218025666E+00    6.8980363867E+00    6.9751979001E+00    7.0530828713E+00    7.1314791072E+00    7.2101655802E+00    7.2889170756E+00    7.367499 [...]
+    6.1012365529E+00    6.1278191478E+00    6.1567034791E+00    6.1878208348E+00    6.2210935184E+00    6.2564396277E+00    6.2937711572E+00    6.3329902461E+00    6.3739981918E+00    6.4166847362E+00    6.4609372396E+00    6.5066333127E+00    6.5536447389E+00    6.6018411377E+00    6.6510794858E+00    6.7012150849E+00    6.7520956943E+00    6.8035634982E+00    6.8554543414E+00    6.9075982122E+00    6.9598202831E+00    7.0119401699E+00    7.0637719202E+00    7.1151259465E+00    7.165806 [...]
+    5.7993679134E+00    5.8169289631E+00    5.8359712936E+00    5.8564361166E+00    5.8782610105E+00    5.9013771184E+00    5.9257126377E+00    5.9511882334E+00    5.9777215095E+00    6.0052234461E+00    6.0336017699E+00    6.0627583941E+00    6.0925910243E+00    6.1229912107E+00    6.1538484646E+00    6.1850455970E+00    6.2164622096E+00    6.2479727897E+00    6.2794495142E+00    6.3107584129E+00    6.3417632058E+00    6.3723235334E+00    6.4022972728E+00    6.4315370417E+00    6.459895 [...]
+    5.0082552226E+00    5.0189461584E+00    5.0305161432E+00    5.0429223975E+00    5.0561188678E+00    5.0700566478E+00    5.0846806165E+00    5.0999350483E+00    5.1157597070E+00    5.1320897965E+00    5.1488581670E+00    5.1659951437E+00    5.1834265152E+00    5.2010749107E+00    5.2188606951E+00    5.2367003856E+00    5.2545096611E+00    5.2721986309E+00    5.2896772937E+00    5.3068517237E+00    5.3236269168E+00    5.3399045924E+00    5.3555857431E+00    5.3705690268E+00    5.384751 [...]
+    3.8939357838E+00    3.9005913144E+00    3.9077982699E+00    3.9155303905E+00    3.9237593795E+00    3.9324533762E+00    3.9415802400E+00    3.9511038046E+00    3.9609872746E+00    3.9711902009E+00    3.9816719133E+00    3.9923885347E+00    4.0032947751E+00    4.0143428392E+00    4.0254838090E+00    4.0366668496E+00    4.0478391215E+00    4.0589462703E+00    4.0699330450E+00    4.0807423813E+00    4.0913154865E+00    4.1015934654E+00    4.1115150692E+00    4.1210194604E+00    4.130044 [...]
+    2.6653150920E+00    2.6708829148E+00    2.6769509131E+00    2.6835069698E+00    2.6905370228E+00    2.6980268469E+00    2.7059614061E+00    2.7143236184E+00    2.7230960912E+00    2.7322600932E+00    2.7417958828E+00    2.7516825050E+00    2.7618985354E+00    2.7724207625E+00    2.7832252193E+00    2.7942875613E+00    2.8055817107E+00    2.8170809404E+00    2.8287576598E+00    2.8405828579E+00    2.8525278574E+00    2.8645616765E+00    2.8766538524E+00    2.8887719685E+00    2.900883 [...]
+    1.5321211985E+00    1.5391446274E+00    1.5468461101E+00    1.5552236669E+00    1.5642754630E+00    1.5739990830E+00    1.5843918913E+00    1.5954507325E+00    1.6071723602E+00    1.6195527133E+00    1.6325872640E+00    1.6462714814E+00    1.6605998081E+00    1.6755661180E+00    1.6911636329E+00    1.7073850087E+00    1.7242221767E+00    1.7416660213E+00    1.7597069766E+00    1.7783343458E+00    1.7975365907E+00    1.8173009535E+00    1.8376136260E+00    1.8584604997E+00    1.879825 [...]
+    6.6705711859E-01    6.7728955692E-01    6.8852847032E-01    7.0077771951E-01    7.1404161854E-01    7.2832442898E-01    7.4363023479E-01    7.5996324455E-01    7.7732743886E-01    7.9572653087E-01    8.1516384178E-01    8.3564241882E-01    8.5716469480E-01    8.7973245600E-01    9.0334700559E-01    9.2800854066E-01    9.5371661640E-01    9.8046966751E-01    1.0082649878E+00    1.0370985993E+00    1.0669653049E+00    1.0978583316E+00    1.1297694599E+00    1.1626884529E+00    1.196603 [...]
+    1.7840384439E-01    1.9261196549E-01    2.0821048996E-01    2.2520455695E-01    2.4359950109E-01    2.6340061716E-01    2.8461312495E-01    3.0724202413E-01    3.3129202475E-01    3.5676753786E-01    3.8367222417E-01    4.1200931969E-01    4.4178116450E-01    4.7298925586E-01    5.0563381466E-01    5.3971420402E-01    5.7522824374E-01    6.1217229159E-01    6.5054088057E-01    6.9032717962E-01    7.3152207842E-01    7.7411420557E-01    8.1809033246E-01    8.6343443969E-01    9.101282 [...]
+    9.6881753295E-02    1.1484401066E-01    1.3454452893E-01    1.5598563554E-01    1.7916943955E-01    2.0409776199E-01    2.3077189562E-01    2.5919263728E-01    2.8936007365E-01    3.2127343103E-01    3.5493108472E-01    3.9033015179E-01    4.2746660108E-01    4.6633494651E-01    5.0692816779E-01    5.4923745054E-01    5.9325211280E-01    6.3895937410E-01    6.8634424726E-01    7.3538920150E-01    7.8607430770E-01    8.3837680859E-01    8.9227083364E-01    9.4772742563E-01    1.004714 [...]
+    3.7768164493E-01    3.9836076070E-01    4.2101680182E-01    4.4564653485E-01    4.7224602438E-01    5.0081042435E-01    5.3133423475E-01    5.6381055810E-01    5.9823133638E-01    6.3458714733E-01    6.7286727289E-01    7.1305916701E-01    7.5514844600E-01    7.9911891186E-01    8.4495224233E-01    8.9262765630E-01    9.4212214459E-01    9.9340993830E-01    1.0464625074E+00    1.1012484281E+00    1.1577332568E+00    1.2158788593E+00    1.2756441878E+00    1.3369842618E+00    1.399850 [...]
+    9.1582078098E-01    9.3765867971E-01    9.6155867805E-01    9.8751137530E-01    1.0155053498E+00    1.0455282574E+00    1.0775661266E+00    1.1116034813E+00    1.1476227479E+00    1.1856049624E+00    1.2255288559E+00    1.2673709587E+00    1.3111058748E+00    1.3567054519E+00    1.4041393616E+00    1.4533740357E+00    1.5043734128E+00    1.5570986822E+00    1.6115069485E+00    1.6675533666E+00    1.7251885142E+00    1.7843599877E+00    1.8450114749E+00    1.9070832747E+00    1.970510 [...]
+    1.5708026673E+00    1.5920709452E+00    1.6153234221E+00    1.6405433908E+00    1.6677140609E+00    1.6968152946E+00    1.7278253671E+00    1.7607213187E+00    1.7954770583E+00    1.8320644066E+00    1.8704534263E+00    1.9106108169E+00    1.9525013567E+00    1.9960874366E+00    2.0413273437E+00    2.0881779090E+00    2.1365919540E+00    2.1865188991E+00    2.2379066419E+00    2.2906971872E+00    2.3448313847E+00    2.4002453184E+00    2.4568712351E+00    2.5146380729E+00    2.573471 [...]
+    2.1952990355E+00    2.2144379869E+00    2.2353401545E+00    2.2579839706E+00    2.2823481939E+00    2.3084067693E+00    2.3361334187E+00    2.3654990038E+00    2.3964714575E+00    2.4290169091E+00    2.4630992040E+00    2.4986784035E+00    2.5357132830E+00    2.5741589530E+00    2.6139680034E+00    2.6550902890E+00    2.6974722328E+00    2.7410570206E+00    2.7857857071E+00    2.8315955015E+00    2.8784199035E+00    2.9261901053E+00    2.9748333339E+00    3.0242737025E+00    3.074431 [...]
+    2.6623541876E+00    2.6782426242E+00    2.6955740461E+00    2.7143260827E+00    2.7344741614E+00    2.7559909390E+00    2.7788466330E+00    2.8030107806E+00    2.8284483148E+00    2.8551232376E+00    2.8829963861E+00    2.9120273273E+00    2.9421706565E+00    2.9733811516E+00    3.0056094426E+00    3.0388030269E+00    3.0729080299E+00    3.1078666474E+00    3.1436191977E+00    3.1801021983E+00    3.2172509133E+00    3.2549954924E+00    3.2932659050E+00    3.3319872968E+00    3.371082 [...]
+    2.8863983115E+00    2.8985103425E+00    2.9117064520E+00    2.9259631387E+00    2.9412569906E+00    2.9575617405E+00    2.9748485026E+00    2.9930866071E+00    3.0122438699E+00    3.0322849024E+00    3.0531729463E+00    3.0748689551E+00    3.0973304701E+00    3.1205146791E+00    3.1443751945E+00    3.1688632422E+00    3.1939291404E+00    3.2195196142E+00    3.2455794922E+00    3.2720508620E+00    3.2988749284E+00    3.3259890718E+00    3.3533295945E+00    3.3808304275E+00    3.408422 [...]
+    2.8348703169E+00    2.8433124382E+00    2.8524976635E+00    2.8624059076E+00    2.8730156513E+00    2.8843046782E+00    2.8962474839E+00    2.9088184799E+00    2.9219883783E+00    2.9357276556E+00    2.9500041902E+00    2.9647850605E+00    2.9800339682E+00    2.9957144809E+00    3.0117867275E+00    3.0282109560E+00    3.0449442031E+00    3.0619423484E+00    3.0791594581E+00    3.0965480734E+00    3.1140588046E+00    3.1316407276E+00    3.1492415320E+00    3.1668070257E+00    3.184282 [...]
+    2.5292380291E+00    2.5346654989E+00    2.5405635618E+00    2.5469172900E+00    2.5537097244E+00    2.5609233110E+00    2.5685389599E+00    2.5765365764E+00    2.5848940546E+00    2.5935887972E+00    2.6025963870E+00    2.6118910902E+00    2.6214460282E+00    2.6312334011E+00    2.6412233446E+00    2.6513856340E+00    2.6616877625E+00    2.6720976413E+00    2.6825802952E+00    2.6931009720E+00    2.7036225899E+00    2.7141076343E+00    2.7245184450E+00    2.7348145657E+00    2.744956 [...]
+    2.0361815204E+00    2.0396261925E+00    2.0433709173E+00    2.0474052566E+00    2.0517186345E+00    2.0562992414E+00    2.0611350656E+00    2.0662121495E+00    2.0715163087E+00    2.0770331529E+00    2.0827458185E+00    2.0886382569E+00    2.0946930781E+00    2.1008911802E+00    2.1072143042E+00    2.1136421017E+00    2.1201538170E+00    2.1267286363E+00    2.1333437787E+00    2.1399769924E+00    2.1466046363E+00    2.1532025486E+00    2.1597464094E+00    2.1662104344E+00    2.172569 [...]
+    1.4514034398E+00    1.4540530166E+00    1.4569447862E+00    1.4600735636E+00    1.4634341296E+00    1.4670206697E+00    1.4708267261E+00    1.4748458428E+00    1.4790705239E+00    1.4834934684E+00    1.4881066174E+00    1.4929013675E+00    1.4978688178E+00    1.5029998782E+00    1.5082844286E+00    1.5137125606E+00    1.5192737527E+00    1.5249566092E+00    1.5307501776E+00    1.5366420930E+00    1.5426206943E+00    1.5486730504E+00    1.5547862702E+00    1.5609469829E+00    1.567141 [...]
+    8.7962293694E-01    8.8259640235E-01    8.8585755019E-01    8.8940574379E-01    8.9323975522E-01    8.9735847620E-01    9.0176066160E-01    9.0644497811E-01    9.1140973620E-01    9.1665340449E-01    9.2217386626E-01    9.2796933060E-01    9.3403733986E-01    9.4037560393E-01    9.4698139888E-01    9.5385179565E-01    9.6098380370E-01    9.6837397667E-01    9.7601854682E-01    9.8391391053E-01    9.9205557031E-01    1.0004392855E+00    1.0090599417E+00    1.0179126140E+00    1.026991 [...]
+    4.1469118589E-01    4.1884950212E-01    4.2341811238E-01    4.2839861496E-01    4.3379292602E-01    4.3960279908E-01    4.4583013532E-01    4.5247688614E-01    4.5954492651E-01    4.6703617486E-01    4.7495241389E-01    4.8329551278E-01    4.9206715555E-01    5.0126885829E-01    5.1090209694E-01    5.2096804960E-01    5.3146779805E-01    5.4240218016E-01    5.5377155513E-01    5.6557627471E-01    5.7781616352E-01    5.9049072271E-01    6.0359892716E-01    6.1713946491E-01    6.311105 [...]
+    1.2339396354E-01    1.2921726031E-01    1.3561288452E-01    1.4258350807E-01    1.5013187828E-01    1.5826093210E-01    1.6697358382E-01    1.7627287164E-01    1.8616177681E-01    1.9664334327E-01    2.0772043860E-01    2.1939594316E-01    2.3167256380E-01    2.4455280966E-01    2.5803900977E-01    2.7213321157E-01    2.8683714427E-01    3.0215220905E-01    3.1807938942E-01    3.3461914395E-01    3.5177153196E-01    3.6953601137E-01    3.8791147466E-01    4.0689590850E-01    4.264869 [...]
+    3.5548321055E-02    4.3093681255E-02    5.1373071639E-02    6.0388553556E-02    7.0142245799E-02    8.0636291923E-02    9.1872791405E-02    1.0385382053E-01    1.1658132939E-01    1.3005715004E-01    1.4428290562E-01    1.5926000760E-01    1.7498960047E-01    1.9147250195E-01    2.0870910598E-01    2.2669940407E-01    2.4544289896E-01    2.6493852731E-01    2.8518464567E-01    3.0617892251E-01    3.2791827612E-01    3.5039884635E-01    3.7361597318E-01    3.9756391734E-01    4.222361 [...]
+    1.4164826951E-01    1.5058768781E-01    1.6038708556E-01    1.7104677197E-01    1.8256691779E-01    1.9494756708E-01    2.0818850844E-01    2.2228935377E-01    2.3724942770E-01    2.5306769035E-01    2.6974274116E-01    2.8727282805E-01    3.0565560367E-01    3.2488822735E-01    3.4496733595E-01    3.6588885060E-01    3.8764800003E-01    4.1023927342E-01    4.3365629445E-01    4.5789175441E-01    4.8293760425E-01    5.0878439528E-01    5.3542207238E-01    5.6283893720E-01    5.910224 [...]
+    3.9785161363E-01    4.0757495909E-01    4.1822357944E-01    4.2979530215E-01    4.4228774604E-01    4.5569803883E-01    4.7002291124E-01    4.8525879478E-01    5.0140134244E-01    5.1844610316E-01    5.3638743847E-01    5.5521971886E-01    5.7493631444E-01    5.9552967115E-01    6.1699184445E-01    6.3931373097E-01    6.6248561224E-01    6.8649657707E-01    7.1133473006E-01    7.3698727882E-01    7.6343992362E-01    7.9067765937E-01    8.1868376787E-01    8.4744063376E-01    8.769289 [...]
+    7.3679821546E-01    7.4655600828E-01    7.5723264523E-01    7.6882335819E-01    7.8132319004E-01    7.9472612722E-01    8.0902596518E-01    8.2421568257E-01    8.4028755782E-01    8.5723329196E-01    8.7504361097E-01    8.9370864376E-01    9.1321751455E-01    9.3355858977E-01    9.5471905102E-01    9.7668541403E-01    9.9944309386E-01    1.0229760810E+00    1.0472676015E+00    1.0722995090E+00    1.0980525113E+00    1.1245062649E+00    1.1516385627E+00    1.1794261354E+00    1.207844 [...]
+    1.0818216111E+00    1.0908785962E+00    1.1007794795E+00    1.1115173919E+00    1.1230849852E+00    1.1354742757E+00    1.1486760292E+00    1.1626809423E+00    1.1774782775E+00    1.1930567336E+00    1.2094041283E+00    1.2265073659E+00    1.2443523983E+00    1.2629241962E+00    1.2822065302E+00    1.3021824194E+00    1.3228337257E+00    1.3441409780E+00    1.3660837198E+00    1.3886401663E+00    1.4117875864E+00    1.4355016972E+00    1.4597570753E+00    1.4845267197E+00    1.509783 [...]
+    1.3617055677E+00    1.3694753822E+00    1.3779614766E+00    1.3871555012E+00    1.3970488607E+00    1.4076320417E+00    1.4188943961E+00    1.4308246214E+00    1.4434110544E+00    1.4566402923E+00    1.4704986677E+00    1.4849713214E+00    1.5000421857E+00    1.5156945749E+00    1.5319111242E+00    1.5486726979E+00    1.5659593344E+00    1.5837501047E+00    1.6020231073E+00    1.6207556482E+00    1.6399226871E+00    1.6594989031E+00    1.6794582080E+00    1.6997723924E+00    1.720412 [...]
+    1.5232618965E+00    1.5294022909E+00    1.5361023631E+00    1.5433531552E+00    1.5511463721E+00    1.5594719124E+00    1.5683185028E+00    1.5776754031E+00    1.5875298858E+00    1.5978689862E+00    1.6086786479E+00    1.6199437355E+00    1.6316489286E+00    1.6437769842E+00    1.6563110067E+00    1.6692319464E+00    1.6825205541E+00    1.6961566461E+00    1.7101185179E+00    1.7243843774E+00    1.7389306302E+00    1.7537328545E+00    1.7687664381E+00    1.7840048467E+00    1.799420 [...]
+    1.5396234713E+00    1.5440769471E+00    1.5489316109E+00    1.5541798395E+00    1.5598127129E+00    1.5658220808E+00    1.5721973450E+00    1.5789285252E+00    1.5860041292E+00    1.5934128094E+00    1.6011411496E+00    1.6091764480E+00    1.6175044883E+00    1.6261101437E+00    1.6349778806E+00    1.6440911593E+00    1.6534334513E+00    1.6629862552E+00    1.6727312580E+00    1.6826489156E+00    1.6927191758E+00    1.7029210733E+00    1.7132328363E+00    1.7236325096E+00    1.734096 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_parallelepiped_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_parallelepiped_BA.ima
new file mode 100644
index 0000000..addee05
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_parallelepiped_BA.ima
@@ -0,0 +1,100 @@
+    3.2090296272E+04    3.1399859401E+04    3.0656682316E+04    2.9864272203E+04    2.9026340703E+04    2.8146780264E+04    2.7229639492E+04    2.6279097660E+04    2.5299438580E+04    2.4295024021E+04    2.3270266871E+04    2.2229604240E+04    2.1177470693E+04    2.0118271810E+04    1.9056358259E+04    1.7996000561E+04    1.6941364728E+04    1.5896488943E+04    1.4865261426E+04    1.3851399649E+04    1.2858431031E+04    1.1889675224E+04    1.0948228121E+04    1.0036947651E+04    9.158441 [...]
+    3.1959315557E+04    3.1271696802E+04    3.0531553114E+04    2.9742377364E+04    2.8907866039E+04    2.8031895701E+04    2.7118498428E+04    2.6171836434E+04    2.5196176044E+04    2.4195861222E+04    2.3175286843E+04    2.2138871903E+04    2.1091032867E+04    2.0036157331E+04    1.8978578203E+04    1.7922548572E+04    1.6872217446E+04    1.5831606522E+04    1.4804588150E+04    1.3794864629E+04    1.2805948977E+04    1.1841147298E+04    1.0903542848E+04    9.9959818898E+03    9.121061 [...]
+    3.1568936663E+04    3.0889717106E+04    3.0158614246E+04    2.9379078286E+04    2.8554760556E+04    2.7689490263E+04    2.6787250229E+04    2.5852151820E+04    2.4888409246E+04    2.3900313403E+04    2.2892205479E+04    2.1868450488E+04    2.0833410942E+04    1.9791420839E+04    1.8746760155E+04    1.7703630027E+04    1.6666128776E+04    1.5638228975E+04    1.4623755667E+04    1.3626365926E+04    1.2649529859E+04    1.1696513184E+04    1.0770361492E+04    9.8738862811E+03    9.009652 [...]
+    3.0926782197E+04    3.0261378914E+04    2.9545147780E+04    2.8781468808E+04    2.7973919051E+04    2.7126249813E+04    2.6242362896E+04    2.5326286027E+04    2.4382147682E+04    2.3414151469E+04    2.2426550259E+04    2.1423620270E+04    2.0409635265E+04    1.9388841074E+04    1.8365430608E+04    1.7343519536E+04    1.6327122812E+04    1.5320132190E+04    1.4326294907E+04    1.3349193640E+04    1.2392227906E+04    1.1458596991E+04    1.0551284535E+04    9.6730448447E+03    8.826391 [...]
+    3.0045334730E+04    2.9398896231E+04    2.8703078634E+04    2.7961165610E+04    2.7176632252E+04    2.6353122940E+04    2.5494428256E+04    2.4604461123E+04    2.3687232339E+04    2.2746825693E+04    2.1787372832E+04    2.0813028085E+04    1.9827943396E+04    1.8836243576E+04    1.7842002020E+04    1.6849217088E+04    1.5861789293E+04    1.4883499463E+04    1.3917988026E+04    1.2968735544E+04    1.2039044638E+04    1.1132023410E+04    1.0250570458E+04    9.3973615875E+03    8.574838 [...]
+    2.8941611229E+04    2.8318919892E+04    2.7648663544E+04    2.6934005218E+04    2.6178292337E+04    2.5385035390E+04    2.4557885697E+04    2.3700612426E+04    2.2817079021E+04    2.1911219236E+04    2.0987012927E+04    2.0048461798E+04    1.9099565256E+04    1.8144296570E+04    1.7186579486E+04    1.6230265469E+04    1.5279111736E+04    1.4336760215E+04    1.3406717591E+04    1.2492336562E+04    1.1596798419E+04    1.0723097082E+04    9.8740246648E+03    9.0521586766E+03    8.259850 [...]
+    2.7636721159E+04    2.7042105183E+04    2.6402068917E+04    2.5719632771E+04    2.4997993228E+04    2.4240502483E+04    2.3450647215E+04    2.2632026630E+04    2.1788329967E+04    2.0923313599E+04    2.0040777924E+04    1.9144544203E+04    1.8238431505E+04    1.7326233939E+04    1.6411698324E+04    1.5498502461E+04    1.4590234150E+04    1.3690371105E+04    1.2802261893E+04    1.1929108039E+04    1.1073947394E+04    1.0239638884E+04    9.4288487329E+03    8.6440382345E+03    7.887453 [...]
+    2.6155321644E+04    2.5592578715E+04    2.4986850325E+04    2.4340994969E+04    2.3658037772E+04    2.2941151225E+04    2.2193635092E+04    2.1418895633E+04    2.0620424313E+04    1.9801776132E+04    1.8966547757E+04    1.8118355597E+04    1.7260813990E+04    1.6397513650E+04    1.5532000540E+04    1.4667755303E+04    1.3808173406E+04    1.2956546136E+04    1.2116042556E+04    1.1289692571E+04    1.0480371184E+04    9.6907840706E+03    8.9234545342E+03    8.1807119350E+03    7.464681 [...]
+    2.4524986062E+04    2.3997320610E+04    2.3429349314E+04    2.2823752472E+04    2.2183366625E+04    2.1511166495E+04    2.0810246139E+04    2.0083799473E+04    1.9335100304E+04    1.8567482017E+04    1.7784317062E+04    1.6988996405E+04    1.6184909067E+04    1.5375421923E+04    1.4563859882E+04    1.3753486610E+04    1.2947485909E+04    1.2148943890E+04    1.1360832069E+04    1.0585991474E+04    9.8271178924E+03    9.0867483405E+03    8.3672488313E+03    7.6708035279E+03    6.999405 [...]
+    2.2775504996E+04    2.2285480491E+04    2.1758025579E+04    2.1195629339E+04    2.0600925949E+04    1.9976677907E+04    1.9325758530E+04    1.8651133874E+04    1.7955844183E+04    1.7242985029E+04    1.6515688265E+04    1.5777102935E+04    1.5030376280E+04    1.4278634976E+04    1.3524966727E+04    1.2772402365E+04    1.2023898556E+04    1.1282321248E+04    1.0550429966E+04    9.8308630631E+03    9.1261240134E+03    8.4385688470E+03    7.7703947934E+03    7.1236302067E+03    6.500125 [...]
+    2.0938140311E+04    2.0487647609E+04    2.0002744371E+04    1.9485718855E+04    1.8938992710E+04    1.8365105548E+04    1.7766698863E+04    1.7146499403E+04    1.6507302117E+04    1.5851952820E+04    1.5183330680E+04    1.4504330670E+04    1.3817846107E+04    1.3126751400E+04    1.2433885136E+04    1.1742033616E+04    1.1053914960E+04    1.0372163894E+04    9.6993173066E+03    9.0378006928E+03    8.3899155528E+03    7.7578278402E+03    7.1435575222E+03    6.5489693171E+03    5.975764 [...]
+    1.9044854341E+04    1.8635096609E+04    1.8194040114E+04    1.7723766180E+04    1.7226477458E+04    1.6704483895E+04    1.6160188106E+04    1.5596070246E+04    1.5014672508E+04    1.4418583349E+04    1.3810421562E+04    1.3192820319E+04    1.2568411283E+04    1.1939808923E+04    1.1309595125E+04    1.0680304218E+04    1.0054408519E+04    9.4343044938E+03    8.8222996197E+03    8.2206000554E+03    7.6312991806E+03    7.0563670878E+03    6.4976410871E+03    5.9568172807E+03    5.435443 [...]
+    1.7127536643E+04    1.6759030928E+04    1.6362377707E+04    1.5939448745E+04    1.5492224917E+04    1.5022783591E+04    1.4533285469E+04    1.4025960991E+04    1.3503096382E+04    1.2967019477E+04    1.2420085393E+04    1.1864662175E+04    1.1303116517E+04    1.0737799647E+04    1.0171033493E+04    9.6050972172E+03    9.0422142143E+03    8.4845396644E+03    7.9341487241E+03    7.3930254326E+03    6.8630524079E+03    6.3460013958E+03    5.8435247308E+03    5.3571477593E+03    4.888262 [...]
+    1.5217250534E+04    1.4889845541E+04    1.4537432723E+04    1.4161675059E+04    1.3764332463E+04    1.3347250577E+04    1.2912349082E+04    1.2461609615E+04    1.1997063379E+04    1.1520778543E+04    1.1034847514E+04    1.0541374190E+04    1.0042461264E+04    9.5401976938E+03    9.0366464035E+03    8.5338323250E+03    8.0337308446E+03    7.5382567451E+03    7.0492537136E+03    6.5684844862E+03    6.0976216926E+03    5.6382394600E+03    5.1918058261E+03    4.7596760077E+03    4.343086 [...]
+    1.3343520686E+04    1.3056429877E+04    1.2747410826E+04    1.2417921717E+04    1.2069505735E+04    1.1703781232E+04    1.1322431483E+04    1.0927194086E+04    1.0519850104E+04    1.0102213009E+04    9.6761175328E+03    9.2434084774E+03    8.8059295934E+03    8.3655125861E+03    7.9239663368E+03    7.4830664130E+03    7.0445449405E+03    6.6100809063E+03    6.1812909594E+03    5.7597207683E+03    5.3468369942E+03    4.9440199277E+03    4.5525568373E+03    4.1736360659E+03    3.808341 [...]
+    1.1533681405E+04    1.1285530134E+04    1.1018425170E+04    1.0733626893E+04    1.0432469147E+04    1.0116350749E+04    9.7867266298E+03    9.4450986735E+03    9.0930063319E+03    8.7320170722E+03    8.3637167341E+03    7.9896998654E+03    7.6115601042E+03    7.2308806787E+03    6.8492250908E+03    6.4681280493E+03    6.0890867158E+03    5.7135523239E+03    5.3429222271E+03    4.9785324297E+03    4.6216506481E+03    4.2734699469E+03    3.9351029895E+03    3.6075769354E+03    3.291829 [...]
+    9.8123030342E+03    9.6011880088E+03    9.3739484258E+03    9.1316565275E+03    8.8754470549E+03    8.6065100215E+03    8.3260831768E+03    8.0354442159E+03    7.7359027926E+03    7.4287923946E+03    7.1154621401E+03    6.7972685556E+03    6.4755673953E+03    6.1517055581E+03    5.8270131627E+03    5.5027958341E+03    5.1803272569E+03    4.8608420449E+03    4.5455289769E+03    4.2355246423E+03    3.9319075378E+03    3.6356926544E+03    3.3478265850E+03    3.0691831843E+03    2.800559 [...]
+    8.2007111141E+03    8.0242702128E+03    7.8343534216E+03    7.6318568478E+03    7.4177288297E+03    7.1929638972E+03    6.9585964739E+03    6.7156943669E+03    6.4653520918E+03    6.2086840829E+03    5.9468178377E+03    5.6808870460E+03    5.4120247527E+03    5.1413566035E+03    4.8699942215E+03    4.5990287615E+03    4.3295246865E+03    4.0625138086E+03    3.7989896364E+03    3.5399020642E+03    3.2861524389E+03    3.0385890356E+03    2.7980029696E+03    2.5651245683E+03    2.340620 [...]
+    6.7166098074E+03    6.5720999946E+03    6.4165533935E+03    6.2507039130E+03    6.0753282377E+03    5.8912408818E+03    5.6992890314E+03    5.5003472132E+03    5.2953118274E+03    5.0850955880E+03    4.8706219079E+03    4.6528192722E+03    4.4326156383E+03    4.2109329055E+03    3.9886814896E+03    3.7667550448E+03    3.5460253664E+03    3.3273375110E+03    3.1115051667E+03    2.8993063040E+03    2.6914791354E+03    2.4887184102E+03    2.2916720660E+03    2.1009382578E+03    1.917062 [...]
+    5.3738175698E+03    5.2581984990E+03    5.1337494637E+03    5.0010576213E+03    4.8607443501E+03    4.7134612927E+03    4.5598862295E+03    4.4007188141E+03    4.2366761996E+03    4.0684885906E+03    3.8968947517E+03    3.7226375061E+03    3.5464592560E+03    3.3690975574E+03    3.1912807811E+03    3.0137238891E+03    2.8371243575E+03    2.6621582721E+03    2.4894766249E+03    2.3197018343E+03    2.1534245132E+03    1.9912005042E+03    1.8335482010E+03    1.6809461715E+03    1.533831 [...]
+    4.1821193879E+03    4.0921401843E+03    3.9952894804E+03    3.8920241985E+03    3.7828278898E+03    3.6682076562E+03    3.5486909390E+03    3.4248222001E+03    3.2971595198E+03    3.1662711345E+03    3.0327319427E+03    2.8971200015E+03    2.7600130413E+03    2.6219850228E+03    2.4836027596E+03    2.3454226327E+03    2.2079874173E+03    2.0718232448E+03    1.9374367207E+03    1.8053122172E+03    1.6759093576E+03    1.5496607094E+03    1.4269697001E+03    1.3082087666E+03    1.193717 [...]
+    3.1472361626E+03    3.0795228642E+03    3.0066387688E+03    2.9289277050E+03    2.8467535381E+03    2.7604978538E+03    2.6705575421E+03    2.5773423007E+03    2.4812720740E+03    2.3827744494E+03    2.2822820275E+03    2.1802297863E+03    2.0770524590E+03    1.9731819429E+03    1.8690447589E+03    1.7650595790E+03    1.6616348385E+03    1.5591664506E+03    1.4580356373E+03    1.3586068926E+03    1.2612260891E+03    1.1662187429E+03    1.0738884443E+03    9.8451546590E+02    8.983555 [...]
+    2.2709081414E+03    2.2220493450E+03    2.1694598361E+03    2.1133876811E+03    2.0540954011E+03    1.9918583015E+03    1.9269627284E+03    1.8597042680E+03    1.7903858992E+03    1.7193161151E+03    1.6468070261E+03    1.5731724583E+03    1.4987260622E+03    1.4237794431E+03    1.3486403289E+03    1.2736107857E+03    1.1989854962E+03    1.1250501100E+03    1.0520796796E+03    9.8033719014E+02    9.1007219415E+02    8.4151955915E+02    7.7489833575E+02    7.1041075331E+02    6.482413 [...]
+    1.5510858204E+03    1.5177142206E+03    1.4817947452E+03    1.4434968058E+03    1.4029996843E+03    1.3604913919E+03    1.3161674797E+03    1.2702298083E+03    1.2228852868E+03    1.1743445900E+03    1.1248208636E+03    1.0745284254E+03    1.0236814741E+03    9.7249281258E+02    9.2117259704E+02    8.6992711859E+02    8.1895762739E+02    7.6845920658E+02    7.1861970388E+02    6.6961872794E+02    6.2162671586E+02    5.7480407783E+02    5.2930042428E+02    4.8525387977E+02    4.427904 [...]
+    9.8221855407E+02    9.6108627206E+02    9.3834083073E+02    9.1408948688E+02    8.8844574532E+02    8.6152863668E+02    8.3346196434E+02    8.0437352592E+02    7.7439431513E+02    7.4365770991E+02    7.1229865259E+02    6.8045282831E+02    6.4825584734E+02    6.1584243742E+02    5.8334565155E+02    5.5089609711E+02    5.1862119145E+02    4.8664444909E+02    4.5508480541E+02    4.2405598130E+02    3.9366589285E+02    3.6401610982E+02    3.3520136628E+02    3.0730912624E+02    2.804192 [...]
+    5.5562833429E+02    5.4367420514E+02    5.3080777939E+02    5.1708971059E+02    5.0258418455E+02    4.8735851107E+02    4.7148269833E+02    4.5502901282E+02    4.3807152825E+02    4.2068566659E+02    4.0294773473E+02    3.8493446007E+02    3.6672252835E+02    3.4838812708E+02    3.3000649773E+02    3.1165149999E+02    2.9339519092E+02    2.7530742198E+02    2.5745545672E+02    2.3990361148E+02    2.2271292168E+02    2.0594083556E+02    1.8964093743E+02    1.7386270202E+02    1.586512 [...]
+    2.5995391223E+02    2.5436121634E+02    2.4834191100E+02    2.4192435581E+02    2.3513856105E+02    2.2801599699E+02    2.2058939499E+02    2.1289254201E+02    2.0496006979E+02    1.9682724053E+02    1.8852973039E+02    1.8010341252E+02    1.7158414120E+02    1.6300753844E+02    1.5440878487E+02    1.4582241605E+02    1.3728212584E+02    1.2882057811E+02    1.2046922804E+02    1.1225815421E+02    1.0421590257E+02    9.6369343289E+01    8.8743541305E+01    8.1361641449E+01    7.424476 [...]
+    8.1648705859E+01    7.9892187663E+01    7.8001841743E+01    7.5986561973E+01    7.3855759212E+01    7.1619301632E+01    6.9287452487E+01    6.6870805787E+01    6.4380220356E+01    6.1826752744E+01    5.9221589487E+01    5.6575979212E+01    5.3901165056E+01    5.1208317906E+01    4.8508470905E+01    4.5812455703E+01    4.3130840886E+01    4.0473872998E+01    3.7851420566E+01    3.5272921486E+01    3.2747334121E+01    3.0283092410E+01    2.7888065267E+01    2.5569520519E+01    2.333409 [...]
+    5.5148058204E+00    5.3962030477E+00    5.2686333359E+00    5.1326914925E+00    4.9890066049E+00    4.8382381037E+00    4.6810716603E+00    4.5182149459E+00    4.3503932846E+00    4.1783452307E+00    4.0028181019E+00    3.8245635008E+00    3.6443328551E+00    3.4628730093E+00    3.2809218973E+00    3.0992043256E+00    2.9184278973E+00    2.7392791029E+00    2.5624196039E+00    2.3884827345E+00    2.2180702431E+00    2.0517492938E+00    1.8900497464E+00    1.7334617309E+00    1.582433 [...]
+    1.5254887980E+01    1.4926586141E+01    1.4573048747E+01    1.4195956483E+01    1.3797088690E+01    1.3378311902E+01    1.2941567905E+01    1.2488861373E+01    1.2022247211E+01    1.1543817661E+01    1.1055689303E+01    1.0559990020E+01    1.0058846032E+01    9.5543690999E+00    9.0486439772E+00    8.5437162136E+00    8.0415803838E+00    7.5441688323E+00    7.0533410054E+00    6.5708734460E+00    6.0984505139E+00    5.6376558923E+00    5.1899649330E+00    4.7567378841E+00    4.339214 [...]
+    9.4023961467E+01    9.2000777123E+01    8.9822650797E+01    8.7499892423E+01    8.5043414651E+01    8.2464663043E+01    7.9775543249E+01    7.6988345734E+01    7.4115668595E+01    7.1170339057E+01    6.8165334213E+01    6.5113701591E+01    6.2028480130E+01    5.8922622126E+01    5.5808916709E+01    5.2699915404E+01    4.9607860266E+01    4.6544615123E+01    4.3521600365E+01    4.0549731724E+01    3.7639363449E+01    3.4800236230E+01    3.2041430193E+01    2.9371323249E+01    2.679755 [...]
+    2.2496360599E+02    2.2012307555E+02    2.1491217228E+02    2.0935553570E+02    2.0347924435E+02    1.9731064920E+02    1.9087819993E+02    1.8421126528E+02    1.7733994894E+02    1.7029490222E+02    1.6310713493E+02    1.5580782585E+02    1.4842813416E+02    1.4099901316E+02    1.3355102765E+02    1.2611417623E+02    1.1871771979E+02    1.1139001733E+02    1.0415837023E+02    9.7048876069E+01    9.0086292850E+01    8.3293914571E+01    7.6693458863E+01    7.0304967377E+01    6.414671 [...]
+    3.9170263833E+02    3.8327453466E+02    3.7420181501E+02    3.6452735909E+02    3.5429654981E+02    3.4355698356E+02    3.3235816811E+02    3.2075121022E+02    3.0878849543E+02    2.9652336234E+02    2.8400977371E+02    2.7130198684E+02    2.5845422563E+02    2.4552035665E+02    2.3255357152E+02    2.1960607779E+02    2.0672880068E+02    1.9397109743E+02    1.8138048645E+02    1.6900239295E+02    1.5687991273E+02    1.4505359562E+02    1.3356124996E+02    1.2243776916E+02    1.117149 [...]
+    5.7880993433E+02    5.6635604059E+02    5.5294984182E+02    5.3865468160E+02    5.2353760038E+02    5.0766890774E+02    4.9112173616E+02    4.7397157990E+02    4.5629582208E+02    4.3817325374E+02    4.1968358815E+02    4.0090697415E+02    3.8192351185E+02    3.6281277428E+02    3.4365333834E+02    3.2452232840E+02    3.0549497568E+02    2.8664419653E+02    2.6804019234E+02    2.4975007382E+02    2.3183751214E+02    2.1436241902E+02    1.9738065785E+02    1.8094378746E+02    1.650988 [...]
+    7.7218734128E+02    7.5557277099E+02    7.3768793546E+02    7.1861732465E+02    6.9845035873E+02    6.7728081763E+02    6.5520624614E+02    6.3232733888E+02    6.0874730977E+02    5.8457125067E+02    5.5990548375E+02    5.3485691254E+02    5.0953237608E+02    4.8403801107E+02    4.5847862639E+02    4.3295709444E+02    4.0757376357E+02    3.8242589562E+02    3.5760713239E+02    3.3320699454E+02    3.0931041626E+02    2.8599731865E+02    2.6334222430E+02    2.4141391554E+02    2.202751 [...]
+    9.5939315626E+02    9.3875071344E+02    9.1653022533E+02    8.9283665072E+02    8.6778107227E+02    8.4147998807E+02    8.1405457264E+02    7.8562991317E+02    7.5633422635E+02    7.2629806174E+02    6.9565349748E+02    6.6453333422E+02    6.3307029300E+02    6.0139622295E+02    5.6964132446E+02    5.3793339316E+02    5.0639709010E+02    4.7515324313E+02    4.4431818416E+02    4.1400312674E+02    3.8431358800E+02    3.5534885869E+02    3.2720152437E+02    2.9995704087E+02    2.736933 [...]
+    1.1298894175E+03    1.1055786362E+03    1.0794095311E+03    1.0515057001E+03    1.0219979524E+03    9.9102347344E+02    9.5872495522E+02    9.2524969704E+02    8.9074868331E+02    8.5537564563E+02    8.1928611580E+02    7.8263647669E+02    7.4558301789E+02    7.0828100279E+02    6.7088375389E+02    6.3354176266E+02    5.9640183023E+02    5.5960624469E+02    5.2329200079E+02    4.8759006701E+02    4.5262470490E+02    4.1851284492E+02    3.8536352271E+02    3.5327737904E+02    3.223462 [...]
+    1.2752091538E+03    1.2477717393E+03    1.2182371399E+03    1.1867448385E+03    1.1534424545E+03    1.1184848031E+03    1.0820329134E+03    1.0442530134E+03    1.0053154899E+03    9.6539382980E+02    9.2466355191E+02    8.8330113560E+02    8.4148295539E+02    7.9938422824E+02    7.5717798140E+02    7.1503404794E+02    6.7311809709E+02    6.3159070595E+02    5.9060647887E+02    5.5031322042E+02    5.1085116723E+02    4.7235228370E+02    4.3493962575E+02    3.9872677645E+02    3.638173 [...]
+    1.3890426535E+03    1.3591560668E+03    1.3269852216E+03    1.2926820408E+03    1.2564073090E+03    1.2183296481E+03    1.1786244475E+03    1.1374727591E+03    1.0950601644E+03    1.0515756216E+03    1.0072103017E+03    9.6215642284E+02    9.1660608884E+02    8.7075014339E+02    8.2477704570E+02    7.7887177656E+02    7.3321478231E+02    6.8798096378E+02    6.4333871721E+02    5.9944903349E+02    5.5646466151E+02    5.1452934107E+02    4.7377710984E+02    4.3433168871E+02    3.963059 [...]
+    1.4672446434E+03    1.4356755321E+03    1.4016936868E+03    1.3654595729E+03    1.3271430160E+03    1.2869221185E+03    1.2449821310E+03    1.2015142848E+03    1.1567145950E+03    1.1107826436E+03    1.0639203502E+03    1.0163307400E+03    9.6821671838E+02    9.1977985989E+02    8.7121922108E+02    8.2273018515E+02    7.7450334650E+02    7.2672344298E+02    6.7956834286E+02    6.3320809348E+02    5.8780403759E+02    5.4350800309E+02    5.0046157105E+02    4.5879542646E+02    4.186287 [...]
+    1.5077669166E+03    1.4753259947E+03    1.4404058243E+03    1.4031712929E+03    1.3637969051E+03    1.3224656706E+03    1.2793679434E+03    1.2347002231E+03    1.1886639250E+03    1.1414641291E+03    1.0933083181E+03    1.0444051105E+03    9.9496300232E+02    9.4518912238E+02    8.9528801262E+02    8.4546044099E+02    7.9590225535E+02    7.4680328631E+02    6.9834630637E+02    6.5070605236E+02    6.0404831749E+02    5.5852911868E+02    5.1429394452E+02    4.7147708801E+02    4.302010 [...]
+    1.5105233178E+03    1.4780231506E+03    1.4430393189E+03    1.4057370021E+03    1.3662910133E+03    1.3248846852E+03    1.2817087077E+03    1.2369599269E+03    1.1908401131E+03    1.1435547081E+03    1.0953115604E+03    1.0463196569E+03    9.9678786180E+02    9.4692367020E+02    8.9693198626E+02    8.4701393401E+02    7.9736570930E+02    7.4817748076E+02    6.9963234718E+02    6.5190535819E+02    6.0516260473E+02    5.5956038500E+02    5.1524445094E+02    4.7234933987E+02    4.309977 [...]
+    1.4771960207E+03    1.4454129781E+03    1.4112011832E+03    1.3747221619E+03    1.3361468598E+03    1.2956545534E+03    1.2534317135E+03    1.2096708304E+03    1.1645692100E+03    1.1183277484E+03    1.0711496948E+03    1.0232394125E+03    9.7480114470E+02    9.2603779637E+02    8.7714973924E+02    8.2833364909E+02    7.7978138319E+02    7.3167890556E+02    6.8420526747E+02    6.3753164986E+02    5.9182047391E+02    5.4722458541E+02    5.0388651798E+02    4.6193783943E+02    4.214985 [...]
+    1.4109936478E+03    1.3806350612E+03    1.3479566836E+03    1.3131127923E+03    1.2762666616E+03    1.2375895223E+03    1.1972594764E+03    1.1554603752E+03    1.1123806691E+03    1.0682122379E+03    1.0231492091E+03    9.7738677406E+02    9.3112001023E+02    8.8454271698E+02    8.3784627472E+02    7.9121853426E+02    7.4484274475E+02    6.9889652722E+02    6.5355090086E+02    6.0896936846E+02    5.6530706686E+02    5.2270998802E+02    4.8131427520E+02    4.4124559866E+02    4.026186 [...]
+    1.3163729416E+03    1.2880502503E+03    1.2575634464E+03    1.2250564519E+03    1.1906815819E+03    1.1545985731E+03    1.1169735722E+03    1.0779780889E+03    1.0377879236E+03    9.9658207551E+02    9.5454164096E+02    9.1184870906E+02    8.6868526273E+02    8.2523209315E+02    7.8166773532E+02    7.3816743213E+02    6.9490213427E+02    6.5203754274E+02    6.0973320055E+02    5.6814163955E+02    5.2740758795E+02    4.8766724361E+02    4.4904761756E+02    4.1166595148E+02    3.756292 [...]
+    1.1987363870E+03    1.1729447896E+03    1.1451825889E+03    1.1155808362E+03    1.0842782244E+03    1.0514202042E+03    1.0171580626E+03    9.8164797010E+02    9.4505000368E+02    9.0752715329E+02    8.6924431860E+02    8.3036730341E+02    7.9106181515E+02    7.5149247650E+02    7.1182185619E+02    6.7220952584E+02    6.3281114933E+02    5.9377761101E+02    5.5525418869E+02    5.1737977674E+02    4.8028616459E+02    4.4409737495E+02    4.0892906604E+02    3.7488800116E+02    3.420715 [...]
+    1.0641183795E+03    1.0412232380E+03    1.0165789088E+03    9.9030171652E+02    9.6251476824E+02    9.3334716912E+02    9.0293320440E+02    8.7141149377E+02    8.3892412447E+02    8.0561576932E+02    7.7163279636E+02    7.3712237639E+02    7.0223159501E+02    6.6710657532E+02    6.3189161783E+02    5.9672836324E+02    5.6175498430E+02    5.2710541202E+02    4.9290860162E+02    4.5928784297E+02    4.2636012018E+02    3.9423552423E+02    3.6301672231E+02    3.3279848703E+02    3.036672 [...]
+    9.1887226606E+02    8.9910224362E+02    8.7782190648E+02    8.5513169187E+02    8.3113789264E+02    8.0595198015E+02    7.7968989803E+02    7.5247133221E+02    7.2441896243E+02    6.9565770094E+02    6.6631392377E+02    6.3651470030E+02    6.0638702664E+02    5.7605706832E+02    5.4564941764E+02    5.1528637099E+02    4.8508723107E+02    4.5516763890E+02    4.2563893998E+02    3.9660758906E+02    3.6817459715E+02    3.4043502436E+02    3.1347752174E+02    2.8738392476E+02    2.622289 [...]
+    7.6936987088E+02    7.5281653465E+02    7.3499873534E+02    7.1600055899E+02    6.9591099345E+02    6.7482336162E+02    6.5283473029E+02    6.3004529907E+02    6.0655777393E+02    5.8247672988E+02    5.5790796754E+02    5.3295786823E+02    5.0773275224E+02    4.8233824490E+02    4.5687865497E+02    4.3145636963E+02    4.0617127043E+02    3.8112017402E+02    3.5639630165E+02    3.3208878081E+02    3.0828218227E+02    2.8505609556E+02    2.6248474534E+02    2.4063665106E+02    2.195743 [...]
+    6.2172400536E+02    6.0834739950E+02    5.9394910854E+02    5.7859707205E+02    5.6236318966E+02    5.4532286322E+02    5.2755451923E+02    5.0913911525E+02    4.9015963382E+02    4.7070056764E+02    4.5084739977E+02    4.3068608271E+02    4.1030251996E+02    3.8978205395E+02    3.6920896383E+02    3.4866597678E+02    3.2823379611E+02    3.0799064950E+02    2.8801186039E+02    2.6836944535E+02    2.4913174005E+02    2.3036305623E+02    2.1212337178E+02    1.9446805567E+02    1.774476 [...]
+    4.8154300935E+02    4.7118250950E+02    4.6003080664E+02    4.4814051197E+02    4.3556730279E+02    4.2236956804E+02    4.0860803861E+02    3.9434540520E+02    3.7964592649E+02    3.6457503064E+02    3.4919891284E+02    3.3358413203E+02    3.1779720952E+02    3.0190423258E+02    2.8597046558E+02    2.7005997167E+02    2.5423524740E+02    2.3855687299E+02    2.2308318038E+02    2.0786994154E+02    1.9297007884E+02    1.7843339942E+02    1.6430635515E+02    1.5063182966E+02    1.374489 [...]
+    3.5372464923E+02    3.4611425145E+02    3.3792278360E+02    3.2918888219E+02    3.1995343492E+02    3.1025932047E+02    3.0015113708E+02    2.8967492201E+02    2.7887786396E+02    2.6780801045E+02    2.5651397242E+02    2.4504462815E+02    2.3344882862E+02    2.2177510648E+02    2.1007139055E+02    1.9838472808E+02    1.8676101651E+02    1.7524474666E+02    1.6387875904E+02    1.5270401493E+02    1.4175938375E+02    1.3108144799E+02    1.2070432687E+02    1.1065951999E+02    1.009757 [...]
+    2.4229478148E+02    2.3708186243E+02    2.3147103815E+02    2.2548876435E+02    2.1916303772E+02    2.1252321785E+02    2.0559984147E+02    1.9842443047E+02    1.9102929509E+02    1.8344733360E+02    1.7571183021E+02    1.6785625241E+02    1.5991404929E+02    1.5191845237E+02    1.4390228022E+02    1.3589774833E+02    1.2793628549E+02    1.2004835804E+02    1.1226330302E+02    1.0460917150E+02    9.7112582919E+01    8.9798591600E+01    8.2690565974E+01    7.5810081463E+01    6.917682 [...]
+    1.5029416177E+02    1.4706067437E+02    1.4358047994E+02    1.3986997968E+02    1.3594652968E+02    1.3182833055E+02    1.2753431242E+02    1.2308401598E+02    1.1849747052E+02    1.1379506997E+02    1.0899744757E+02    1.0412535041E+02    9.9199514472E+01    9.4240541246E+01    8.9268776675E+01    8.4304193361E+01    7.9366276809E+01    7.4473916498E+01    6.9645302507E+01    6.4897828398E+01    6.0248000966E+01    5.5711357445E+01    5.1302390661E+01    4.7034482588E+01    4.291984 [...]
+    7.9714722016E+01    7.7999762078E+01    7.6154053343E+01    7.4186286469E+01    7.2105657664E+01    6.9921810303E+01    6.7644774044E+01    6.5284901899E+01    6.2852805714E+01    6.0359290532E+01    5.7815288328E+01    5.5231791578E+01    5.2619787155E+01    4.9990191014E+01    4.7353784135E+01    4.4721150171E+01    4.2102615224E+01    3.9508190181E+01    3.6947515976E+01    3.4429812155E+01    3.1963829077E+01    2.9557804042E+01    2.7219421629E+01    2.4955778464E+01    2.277335 [...]
+    3.1484630244E+01    3.0807324608E+01    3.0078464821E+01    2.9301476256E+01    2.8479983185E+01    2.7617785838E+01    2.6718836475E+01    2.5787214660E+01    2.4827101904E+01    2.3842755873E+01    2.2838484351E+01    2.1818619125E+01    2.0787490009E+01    1.9749399169E+01    1.8708595934E+01    1.7669252280E+01    1.6635439147E+01    1.5611103746E+01    1.4600048023E+01    1.3605908409E+01    1.2632136994E+01    1.1681984240E+01    1.0758483342E+01    9.8644363245E+00    9.002401 [...]
+    5.4995685307E+00    5.3812901547E+00    5.2540633268E+00    5.1184817254E+00    4.9751732690E+00    4.8247961830E+00    4.6680348994E+00    4.5055958188E+00    4.3382029662E+00    4.1665935712E+00    3.9915136041E+00    3.8137133005E+00    3.6339427052E+00    3.4529472666E+00    3.2714635134E+00    3.0902148418E+00    2.9099074435E+00    2.7312264004E+00    2.5548319737E+00    2.3813561098E+00    2.2113991870E+00    2.0455270225E+00    1.8842681577E+00    1.7281114385E+00    1.577503 [...]
+    6.9597789673E-01    6.8098499524E-01    6.6481276301E-01    6.4754017729E-01    6.2925096726E-01    6.1003305401E-01    5.8997796586E-01    5.6918023358E-01    5.4773677013E-01    5.2574624007E-01    5.0330842324E-01    4.8052357785E-01    4.5749180778E-01    4.3431243887E-01    4.1108340894E-01    3.8790067614E-01    3.6485764978E-01    3.4204464802E-01    3.1954838600E-01    2.9745149821E-01    2.7583209814E-01    2.5476337822E-01    2.3431325246E-01    2.1454404405E-01    1.955122 [...]
+    1.5160585473E+01    1.4834304033E+01    1.4482925712E+01    1.4108122228E+01    1.3711663497E+01    1.3295406225E+01    1.2861282009E+01    1.2411285029E+01    1.1947459439E+01    1.1471886534E+01    1.0986671797E+01    1.0493931918E+01    9.9957818920E+00    9.4943222675E+00    8.9916266589E+00    8.4897296001E+00    7.9906148282E+00    7.4962040793E+00    7.0083464714E+00    6.5288085471E+00    6.0592650417E+00    5.6012904336E+00    5.1563513321E+00    4.7257997447E+00    4.310867 [...]
+    4.6269392393E+01    4.5273708179E+01    4.4201641648E+01    4.3058277410E+01    4.1848997877E+01    4.0579448731E+01    3.9255502898E+01    3.7883223313E+01    3.6468824736E+01    3.5018634909E+01    3.3539055357E+01    3.2036522089E+01    3.0517466515E+01    2.8988276848E+01    2.7455260263E+01    2.5924606098E+01    2.4402350337E+01    2.2894341631E+01    2.1406209090E+01    1.9943332055E+01    1.8510812047E+01    1.7113447082E+01    1.5755708499E+01    1.4441720441E+01    1.317524 [...]
+    9.0848493098E+01    8.8893583421E+01    8.6788861200E+01    8.4544296649E+01    8.2170443267E+01    7.9678370247E+01    7.7079591974E+01    7.4385995139E+01    7.1609764012E+01    6.8763304430E+01    6.5859167056E+01    6.2909970478E+01    5.9928324697E+01    5.6926755570E+01    5.3917630729E+01    5.0913087523E+01    4.7924963476E+01    4.4964729728E+01    4.2043427946E+01    3.9171611089E+01    3.6359288439E+01    3.3615875234E+01    3.0950147227E+01    2.8370200415E+01    2.588341 [...]
+    1.4534863538E+02    1.4222104497E+02    1.3885390722E+02    1.3526316219E+02    1.3146568189E+02    1.2747916235E+02    1.2332201103E+02    1.1901323037E+02    1.1457229847E+02    1.1001904767E+02    1.0537354199E+02    1.0065595431E+02    9.5886444150E+01    9.1085036969E+01    8.6271505850E+01    8.1465256375E+01    7.6685215517E+01    7.1949725306E+01    6.7276442006E+01    6.2682241457E+01    5.8183131210E+01    5.3794170013E+01    4.9529395143E+01    4.5401758007E+01    4.142306 [...]
+    2.0602531834E+02    2.0159216020E+02    1.9681957641E+02    1.9173015128E+02    1.8634778905E+02    1.8069756106E+02    1.7480554625E+02    1.6869866641E+02    1.6240451713E+02    1.5595119590E+02    1.4936712862E+02    1.4268089561E+02    1.3592105861E+02    1.2911598982E+02    1.2229370442E+02    1.1548169745E+02    1.0870678654E+02    1.0199496126E+02    9.5371240352E+01    8.8859537606E+01    8.2482537436E+01    7.6261580785E+01    7.0216562165E+01    6.4365838393E+01    5.872614 [...]
+    2.6911645176E+02    2.6332578538E+02    2.5709186115E+02    2.5044417033E+02    2.4341392737E+02    2.3603387034E+02    2.2833805285E+02    2.2036162888E+02    2.1214063223E+02    2.0371175212E+02    1.9511210667E+02    1.8637901591E+02    1.7754977585E+02    1.6866143544E+02    1.5975057782E+02    1.5085310748E+02    1.4200404493E+02    1.3323733000E+02    1.2458563548E+02    1.1608019202E+02    1.0775062565E+02    9.9624808775E+01    9.1728725768E+01    8.4086353735E+01    7.671955 [...]
+    3.3101013996E+02    3.2388773953E+02    3.1622023725E+02    3.0804389884E+02    2.9939710859E+02    2.9032012409E+02    2.8085482041E+02    2.7104442559E+02    2.6093324948E+02    2.5056640796E+02    2.3998954442E+02    2.2924855070E+02    2.1838928942E+02    2.0745731969E+02    1.9649762824E+02    1.8555436777E+02    1.7467060443E+02    1.6388807611E+02    1.5324696317E+02    1.4278567326E+02    1.3254064144E+02    1.2254614707E+02    1.1283414836E+02    1.0343413589E+02    9.437300 [...]
+    3.8839597173E+02    3.8003883905E+02    3.7104219449E+02    3.6144858345E+02    3.5130303640E+02    3.4065278117E+02    3.2954694291E+02    3.1803623384E+02    3.0617263530E+02    2.9400907420E+02    2.8159909639E+02    2.6899653939E+02    2.5625520665E+02    2.4342854589E+02    2.3056933374E+02    2.1772936881E+02    2.0495917551E+02    1.9230772053E+02    1.7982214395E+02    1.6754750673E+02    1.5552655632E+02    1.4379951179E+02    1.3240386980E+02    1.2137423263E+02    1.107421 [...]
+    4.3839424723E+02    4.2896134420E+02    4.1880668995E+02    4.0797829978E+02    3.9652699321E+02    3.8450606932E+02    3.7197096825E+02    3.5897892112E+02    3.4558859123E+02    3.3185970906E+02    3.1785270369E+02    3.0362833350E+02    2.8924731866E+02    2.7476997819E+02    2.6025587405E+02    2.4576346491E+02    2.3134977185E+02    2.1707005847E+02    2.0297752743E+02    1.8912303557E+02    1.7555482933E+02    1.6231830227E+02    1.4945577611E+02    1.3700630661E+02    1.250055 [...]
+    4.7865880211E+02    4.6835957080E+02    4.5727237820E+02    4.4544964309E+02    4.3294684529E+02    4.1982217136E+02    4.0613614501E+02    3.9195124511E+02    3.7733151397E+02    3.6234215893E+02    3.4704915011E+02    3.3151881726E+02    3.1581744866E+02    3.0001089488E+02    2.8416418039E+02    2.6834112550E+02    2.5260398158E+02    2.3701308180E+02    2.2162650986E+02    2.0649978906E+02    1.9168559339E+02    1.7723348291E+02    1.6318966463E+02    1.4959678061E+02    1.364937 [...]
+    5.0745043766E+02    4.9653174042E+02    4.8477776073E+02    4.7224406423E+02    4.5898946104E+02    4.4507563028E+02    4.3056672835E+02    4.1552898401E+02    4.0003028330E+02    3.8413974724E+02    3.6792730547E+02    3.5146326901E+02    3.3481790509E+02    3.1806101727E+02    3.0126153366E+02    2.8448710637E+02    2.6780372471E+02    2.5127534512E+02    2.3496354002E+02    2.1892716814E+02    2.0322206844E+02    1.8790077947E+02    1.7301228594E+02    1.5860179411E+02    1.447105 [...]
+    5.2367937420E+02    5.1241152037E+02    5.0028174268E+02    4.8734737791E+02    4.7366911049E+02    4.5931058501E+02    4.4433800214E+02    4.2881970087E+02    4.1282573020E+02    3.9642741350E+02    3.7969690861E+02    3.6270676702E+02    3.4552949527E+02    3.2823712165E+02    3.1090077143E+02    2.9359025354E+02    2.7637366151E+02    2.5931699162E+02    2.4248378060E+02    2.2593476545E+02    2.0972756765E+02    1.9391640352E+02    1.7855182279E+02    1.6368047673E+02    1.493449 [...]
+    5.2691655100E+02    5.1557908049E+02    5.0337442795E+02    4.9036027886E+02    4.7659768644E+02    4.6215068182E+02    4.4708586758E+02    4.3147199750E+02    4.1537954575E+02    3.9888026858E+02    3.8204676188E+02    3.6495201773E+02    3.4766898313E+02    3.3027012420E+02    3.1282699883E+02    2.9540984089E+02    2.7808715883E+02    2.6092535147E+02    2.4398834358E+02    2.2733724364E+02    2.1103002612E+02    1.9512124009E+02    1.7966174622E+02    1.6469848343E+02    1.502742 [...]
+    5.1737494228E+02    5.0624281116E+02    4.9425927003E+02    4.8148095416E+02    4.6796780493E+02    4.5378268720E+02    4.3899099030E+02    4.2366021548E+02    4.0785955297E+02    3.9165945180E+02    3.7513118538E+02    3.5834641623E+02    3.4137676281E+02    3.2429337167E+02    3.0716649799E+02    2.9006509734E+02    2.7305643166E+02    2.5620569208E+02    2.3957564114E+02    2.2322627686E+02    2.0721452070E+02    1.9159393162E+02    1.7641444774E+02    1.6172215730E+02    1.475591 [...]
+    4.9586329041E+02    4.8519405206E+02    4.7370887247E+02    4.6146202649E+02    4.4851095701E+02    4.3491590834E+02    4.2073954386E+02    4.0604655071E+02    3.9090323462E+02    3.7537710762E+02    3.5953647185E+02    3.4345000245E+02    3.2718633253E+02    3.1081364322E+02    2.9439926167E+02    2.7800926995E+02    2.6170812746E+02    2.4555830947E+02    2.2961996435E+02    2.1395059158E+02    1.9860474280E+02    1.8363374771E+02    1.6908546656E+02    1.5500407063E+02    1.414298 [...]
+    4.6371572930E+02    4.5373822981E+02    4.4299775663E+02    4.3154506025E+02    4.1943385318E+02    4.0672046723E+02    3.9346349601E+02    3.7972342539E+02    3.6556225463E+02    3.5104311097E+02    3.3622986057E+02    3.2118671844E+02    3.0597786050E+02    2.9066704027E+02    2.7531721305E+02    2.5999017023E+02    2.4474618625E+02    2.2964368073E+02    2.1473889785E+02    2.0008560541E+02    1.8573481521E+02    1.7173452684E+02    1.5812949617E+02    1.4496103008E+02    1.322668 [...]
+    4.2270164333E+02    4.1360665649E+02    4.0381624816E+02    3.9337667440E+02    3.8233689069E+02    3.7074823962E+02    3.5866412509E+02    3.4613967558E+02    3.3323139886E+02    3.1999683083E+02    3.0649418088E+02    2.9278197655E+02    2.7891870990E+02    2.6496248826E+02    2.5097069170E+02    2.3699963981E+02    2.2310426995E+02    2.0933782933E+02    1.9575158280E+02    1.8239453862E+02    1.6931319357E+02    1.5655129946E+02    1.4414965210E+02    1.3214590422E+02    1.205744 [...]
+    3.7492075307E+02    3.6685387275E+02    3.5817025023E+02    3.4891090708E+02    3.3911925859E+02    3.2884083674E+02    3.1812300139E+02    3.0701464171E+02    2.9556587001E+02    2.8382771039E+02    2.7185178432E+02    2.5968999553E+02    2.4739421646E+02    2.3501597863E+02    2.2260616889E+02    2.1021473394E+02    1.9789039509E+02    1.8568037515E+02    1.7363013936E+02    1.6178315220E+02    1.5018065134E+02    1.3886144059E+02    1.2786170277E+02    1.1721483373E+02    1.069512 [...]
+    3.2268882023E+02    3.1574581203E+02    3.0827205511E+02    3.0030285025E+02    2.9187555776E+02    2.8302935923E+02    2.7380500905E+02    2.6424457750E+02    2.5439118739E+02    2.4428874613E+02    2.3398167530E+02    2.2351463948E+02    2.1293227656E+02    2.0227893126E+02    1.9159839385E+02    1.8093364595E+02    1.7032661502E+02    1.5981793946E+02    1.4944674567E+02    1.3925043875E+02    1.2926450806E+02    1.1952234902E+02    1.1005510202E+02    1.0089150966E+02    9.205779 [...]
+    2.6841951450E+02    2.6264420925E+02    2.5642748929E+02    2.4979871255E+02    2.4278894946E+02    2.3543078487E+02    2.2775811148E+02    2.1980591621E+02    2.1161006125E+02    2.0320706137E+02    1.9463385894E+02    1.8592759862E+02    1.7712540303E+02    1.6826415125E+02    1.5938026158E+02    1.5050948010E+02    1.4168667668E+02    1.3294564949E+02    1.2431893978E+02    1.1583765771E+02    1.0753132074E+02    9.9427705380E+01    9.1552713252E+01    8.3930252323E+01    7.658213 [...]
+    2.1450788875E+02    2.0989258325E+02    2.0492459485E+02    1.9962737888E+02    1.9402575856E+02    1.8814576683E+02    1.8201448128E+02    1.7565985367E+02    1.6911053494E+02    1.6239569742E+02    1.5554485515E+02    1.4858768394E+02    1.4155384217E+02    1.3447279391E+02    1.2737363540E+02    1.2028492618E+02    1.1323452615E+02    1.0624943943E+02    9.9355666379E+01    9.2578064500E+01    8.5940219318E+01    7.9464325926E+01    7.3171081999E+01    6.7079592870E+01    6.120728 [...]
+    1.6322058028E+02    1.5970880061E+02    1.5592873661E+02    1.5189822949E+02    1.4763616065E+02    1.4316233138E+02    1.3849733742E+02    1.3366243930E+02    1.2867942933E+02    1.2357049642E+02    1.1835808948E+02    1.1306478058E+02    1.0771312876E+02    1.0232554551E+02    9.6924162842E+01    9.1530704903E+01    8.6166364041E+01    8.0851682124E+01    7.5606437966E+01    7.0449541573E+01    6.5398935919E+01    6.0471506860E+01    5.5683001745E+01    5.1047957199E+01    4.657963 [...]
+    1.1659732005E+02    1.1408870401E+02    1.1138851183E+02    1.0850948239E+02    1.0546509699E+02    1.0226949350E+02    9.8937376834E+01    9.5483926457E+01    9.1924701489E+01    8.8275544217E+01    8.4552482656E+01    8.0771632892E+01    7.6949101911E+01    7.3100891593E+01    6.9242804583E+01    6.5390352664E+01    6.1558668304E+01    5.7762419959E+01    5.4015731715E+01    5.0332107806E+01    4.6724362483E+01    4.3204555704E+01    3.9783935009E+01    3.6472883947E+01    3.328087 [...]
+    7.6367618816E+01    7.4724591069E+01    7.2956158828E+01    7.1070659776E+01    6.9076917205E+01    6.6984183901E+01    6.4802083610E+01    6.2540550544E+01    6.0209767349E+01    5.7820102010E+01    5.5382044147E+01    5.2906141152E+01    5.0402934655E+01    4.7882897745E+01    4.5356373410E+01    4.2833514618E+01    4.0324226461E+01    3.7838110760E+01    3.5384413492E+01    3.2971975412E+01    3.0609186159E+01    2.8303942171E+01    2.6063608634E+01    2.3894985715E+01    2.180427 [...]
+    4.3885649253E+01    4.2941497579E+01    4.1925348545E+01    4.0841987940E+01    3.9696480010E+01    3.8494135300E+01    3.7240477116E+01    3.5941206851E+01    3.4602168449E+01    3.3229312241E+01    3.1828658443E+01    3.0406260559E+01    2.8968168968E+01    2.7520394940E+01    2.6068875356E+01    2.4619438353E+01    2.3177770162E+01    2.1749383334E+01    2.0339586599E+01    1.8953456537E+01    1.7595811247E+01    1.6271186192E+01    1.4983812357E+01    1.3737596852E+01    1.253610 [...]
+    2.0085397392E+01    1.9653313941E+01    1.9188339775E+01    1.8692660257E+01    1.8168587656E+01    1.7618546504E+01    1.7045058334E+01    1.6450725902E+01    1.5838217006E+01    1.5210248030E+01    1.4569567331E+01    1.3918938579E+01    1.3261124178E+01    1.2598868886E+01    1.1934883745E+01    1.1271830438E+01    1.0612306174E+01    9.9588292169E+00    9.3138251376E+00    8.6796138981E+00    8.0583978383E+00    7.4522506477E+00    6.8631073876E+00    6.2927556218E+00    5.742827 [...]
+    5.4571612335E+00    5.3397894387E+00    5.2135277787E+00    5.0789662056E+00    4.9367287396E+00    4.7874695520E+00    4.6318688825E+00    4.4706288187E+00    4.3044689708E+00    4.1341220693E+00    3.9603295211E+00    3.7838369524E+00    3.6053897724E+00    3.4257287871E+00    3.2455858954E+00    3.0656798964E+00    2.8867124365E+00    2.7093641237E+00    2.5342908359E+00    2.3621202461E+00    2.1934485871E+00    2.0288376771E+00    1.8688122224E+00    1.7138574153E+00    1.564416 [...]
+    4.5474012228E-02    4.4500172483E-02    4.3460274026E-02    4.2358579599E-02    4.1199566656E-02    3.9987904850E-02    3.8728432703E-02    3.7426133579E-02    3.6086111068E-02    3.4713563918E-02    3.3313760626E-02    3.1892013825E-02    3.0453654579E-02    2.9004006733E-02    2.7548361431E-02    2.6091951931E-02    2.4639928852E-02    2.3197335968E-02    2.1769086675E-02    2.0359941253E-02    1.8974485043E-02    1.7617107637E-02    1.6291983213E-02    1.5003052098E-02    1.375400 [...]
+    3.4675686766E+00    3.3929162229E+00    3.3124768447E+00    3.2266367338E+00    3.1358049592E+00    3.0404107963E+00    2.9409009394E+00    2.8377366192E+00    2.7313906473E+00    2.6223444103E+00    2.5110848361E+00    2.3981013549E+00    2.2838828783E+00    2.1689148183E+00    2.0536761673E+00    1.9386366619E+00    1.8242540501E+00    1.7109714795E+00    1.5992150281E+00    1.4893913907E+00    1.3818857394E+00    1.2770597694E+00    1.1752499448E+00    1.0767659522E+00    9.818893 [...]
+    1.4950619032E+01    1.4628841453E+01    1.4282286045E+01    1.3912603715E+01    1.3521542462E+01    1.3110936093E+01    1.2682692439E+01    1.2238781191E+01    1.1781221410E+01    1.1312068832E+01    1.0833403052E+01    1.0347314681E+01    9.8558925761E+00    9.3612112302E+00    8.8653184161E+00    8.3702231737E+00    7.8778842231E+00    7.3901988860E+00    6.9089925904E+00    6.4360090293E+00    5.9729010394E+00    5.5212222558E+00    5.0824195966E+00    4.6578266199E+00    4.248657 [...]
+    3.3385227227E+01    3.2666750076E+01    3.1893062936E+01    3.1067842519E+01    3.0194981276E+01    2.9278562360E+01    2.8322833488E+01    2.7332179936E+01    2.6311096842E+01    2.5264161034E+01    2.4196002594E+01    2.3111276360E+01    2.2014633586E+01    2.0910693946E+01    1.9804018113E+01    1.8699081075E+01    1.7600246402E+01    1.6511741631E+01    1.5437634934E+01    1.4381813236E+01    1.3347961917E+01    1.2339546236E+01    1.1359794577E+01    1.0411683638E+01    9.497925 [...]
+    5.7392005990E+01    5.6156936221E+01    5.4827056297E+01    5.3408678554E+01    5.1908485316E+01    5.0333485964E+01    4.8690972169E+01    4.6988471594E+01    4.5233700440E+01    4.3434515170E+01    4.1598863773E+01    3.9734736926E+01    3.7850119421E+01    3.5952942185E+01    3.4051035266E+01    3.2152082093E+01    3.0263575354E+01    2.8392774778E+01    2.6546667122E+01    2.4731928627E+01    2.2954890187E+01    2.1221505457E+01    1.9537322090E+01    1.7907456279E+01    1.633657 [...]
+    8.5397648972E+01    8.3559947429E+01    8.1581259965E+01    7.9470971874E+01    7.7239018178E+01    7.4895819887E+01    7.2452217491E+01    6.9919402214E+01    6.7308845533E+01    6.4632227472E+01    6.1901364228E+01    5.9128135636E+01    5.6324413011E+01    5.3501987899E+01    5.0672502220E+01    4.7847380338E+01    4.5037763496E+01    4.2254447095E+01    3.9507821236E+01    3.6807814922E+01    3.4163844282E+01    3.1584765160E+01    2.9078830344E+01    2.6653651697E+01    2.431616 [...]
+    1.1571660717E+02    1.1322650361E+02    1.1054543980E+02    1.0768612653E+02    1.0466201878E+02    1.0148722947E+02    9.8176439389E+01    9.4744804249E+01    9.1207859225E+01    8.7581421953E+01    8.3881494569E+01    8.0124165544E+01    7.6325512028E+01    7.2501503410E+01    6.8667906782E+01    6.4840194975E+01    6.1033457818E+01    5.7262317229E+01    5.3540846721E+01    4.9882495851E+01    4.6300020117E+01    4.2805416745E+01    3.9409866759E+01    3.6123683681E+01    3.295626 [...]
+    1.4663439909E+02    1.4347901460E+02    1.4008172136E+02    1.3645862029E+02    1.3262675470E+02    1.2860400101E+02    1.2440895489E+02    1.2006081338E+02    1.1557925417E+02    1.1098431277E+02    1.0629625845E+02    1.0153546999E+02    9.6722312006E+01    9.1877012891E+01    8.7019545080E+01    8.2169508621E+01    7.7346018808E+01    7.2567598660E+01    6.7852076981E+01    6.3216492684E+01    5.8677006003E+01    5.4248817154E+01    4.9946092948E+01    4.5781901795E+01    4.176815 [...]
+    1.7648867360E+02    1.7269089874E+02    1.6860203072E+02    1.6424144303E+02    1.5962964280E+02    1.5478813943E+02    1.4973930750E+02    1.4450624516E+02    1.3911262883E+02    1.3358256545E+02    1.2794044334E+02    1.2221078267E+02    1.1641808681E+02    1.1058669540E+02    1.0474064039E+02    9.8903506008E+01    9.3098293537E+01    8.7347292013E+01    8.1671955579E+01    7.6092788381E+01    7.0629237740E+01    6.5299596292E+01    6.0120913675E+01    5.5108918309E+01    5.027794 [...]
+    2.0374440662E+02    1.9936016151E+02    1.9463993115E+02    1.8960607583E+02    1.8428226400E+02    1.7869332067E+02    1.7286506929E+02    1.6682416830E+02    1.6059794350E+02    1.5421421763E+02    1.4770113821E+02    1.4108700510E+02    1.3440009890E+02    1.2766851145E+02    1.2091997977E+02    1.1418172439E+02    1.0748029337E+02    1.0084141312E+02    9.4289846782E+01    8.7849261490E+01    8.1542105026E+01    7.5389492893E+01    6.9411106384E+01    6.3625102286E+01    5.804803 [...]
+    2.2706002701E+02    2.2217409857E+02    2.1691379441E+02    2.1130402885E+02    2.0537117358E+02    1.9914288871E+02    1.9264794675E+02    1.8591605043E+02    1.7897764606E+02    1.7186373361E+02    1.6460567503E+02    1.5723500210E+02    1.4978322528E+02    1.4228164495E+02    1.3476116635E+02    1.2725211952E+02    1.1978408558E+02    1.1238573042E+02    1.0508464708E+02    9.7907207722E+01    9.0878426302E+01    8.4021832707E+01    7.7359359185E+01    7.0911239725E+01    6.469592 [...]
+    2.4534180987E+02    2.4006251870E+02    2.3437876366E+02    2.2831746058E+02    2.2190709946E+02    2.1517756212E+02    2.0815993191E+02    2.0088629711E+02    1.9338954924E+02    1.8570317800E+02    1.7786106415E+02    1.6989727205E+02    1.6184584318E+02    1.5374059225E+02    1.4561490732E+02    1.3750155530E+02    1.2943249432E+02    1.2143869408E+02    1.1354996556E+02    1.0579480119E+02    9.8200226416E+01    9.0791663776E+01    8.3592810184E+01    7.6625528226E+01    6.990975 [...]
+    2.5778451695E+02    2.5223750966E+02    2.4626557794E+02    2.3989699839E+02    2.3316170119E+02    2.2609107847E+02    2.1871778457E+02    2.1107552944E+02    2.0319886684E+02    1.9512297895E+02    1.8688345886E+02    1.7851609264E+02    1.7005664242E+02    1.6154063233E+02    1.5300313845E+02    1.4447858460E+02    1.3600054518E+02    1.2760155653E+02    1.1931293799E+02    1.1116462405E+02    1.0318500838E+02    9.5400801076E+01    8.7836899703E+01    8.0516275104E+01    7.345987 [...]
+    2.6389697163E+02    2.5821846291E+02    2.5210500442E+02    2.4558553913E+02    2.3869070232E+02    2.3145262554E+02    2.2390473215E+02    2.1608152591E+02    2.0801837425E+02    1.9975128783E+02    1.9131669794E+02    1.8275123348E+02    1.7409149904E+02    1.6537385570E+02    1.5663420619E+02    1.4790778586E+02    1.3922896086E+02    1.3063103512E+02    1.2214606725E+02    1.1380469865E+02    1.0563599396E+02    9.7667294891E+01    8.9924088270E+01    8.2429889105E+01    7.520613 [...]
+    2.6351199638E+02    2.5784179727E+02    2.5173733195E+02    2.4522749716E+02    2.3834287901E+02    2.3111555737E+02    2.2357890168E+02    2.1576736002E+02    2.0771624269E+02    1.9946150220E+02    1.9103951108E+02    1.8248683925E+02    1.7384003246E+02    1.6513539354E+02    1.5640876790E+02    1.4769533486E+02    1.3902940623E+02    1.3044423354E+02    1.2197182534E+02    1.1364277553E+02    1.0548610412E+02    9.7529111260E+01    8.9797245509E+01    8.2313987084E+01    7.510074 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_parallelepiped_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_parallelepiped_BA.inp
new file mode 100644
index 0000000..80f2c04
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_parallelepiped_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_parallelepiped_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+parallelepiped                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism3_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism3_BA.ima
new file mode 100644
index 0000000..00c1199
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism3_BA.ima
@@ -0,0 +1,100 @@
+    6.0169342252E+03    5.8874771592E+03    5.7481311631E+03    5.5995538579E+03    5.4424412088E+03    5.2775230880E+03    5.1055586525E+03    4.9273315617E+03    4.7436450853E+03    4.5553170936E+03    4.3631757095E+03    4.1680509378E+03    3.9707762882E+03    3.7721771705E+03    3.5730693508E+03    3.3742535587E+03    3.1765109195E+03    2.9805985789E+03    2.7872455546E+03    2.5971488389E+03    2.4109697787E+03    2.2293307569E+03    2.0528121928E+03    1.8819498819E+03    1.717232 [...]
+    6.0046459862E+03    5.8754533088E+03    5.7363918979E+03    5.5881180321E+03    5.4313262547E+03    5.2667449481E+03    5.0951317186E+03    4.9172686259E+03    4.7339572912E+03    4.5460139222E+03    4.3542642891E+03    4.1595386900E+03    3.9626669406E+03    3.7644734259E+03    3.5657722470E+03    3.3673624989E+03    3.1700237111E+03    2.9745114832E+03    2.7815533439E+03    2.5918448619E+03    2.4060460336E+03    2.2247779705E+03    2.0486199067E+03    1.8781065434E+03    1.713725 [...]
+    5.9679166783E+03    5.8395142509E+03    5.7013034594E+03    5.5539365680E+03    5.3981038710E+03    5.2345292950E+03    5.0639658118E+03    4.8871906967E+03    4.7050006672E+03    4.5182069379E+03    4.3276302272E+03    4.1340957541E+03    3.9384282580E+03    3.7414470807E+03    3.5439613432E+03    3.3467652522E+03    3.1506335687E+03    2.9563172699E+03    2.7645394342E+03    2.5759913754E+03    2.3913290526E+03    2.2111697781E+03    2.0360892427E+03    1.8666188772E+03    1.703243 [...]
+    5.9071503910E+03    5.7800553814E+03    5.6432518854E+03    5.4973855249E+03    5.3431395648E+03    5.1812305599E+03    5.0124038143E+03    4.8374286883E+03    4.6570937862E+03    4.4722020616E+03    4.2835658758E+03    4.0920020440E+03    3.8983269075E+03    3.7033514645E+03    3.5078765967E+03    3.3126884234E+03    3.1185538162E+03    2.9262161054E+03    2.7363910062E+03    2.5497627931E+03    2.3669807458E+03    2.1886558909E+03    2.0153580573E+03    1.8476132645E+03    1.685901 [...]
+    5.8230135467E+03    5.6977287845E+03    5.5628738259E+03    5.4190850962E+03    5.2670361276E+03    5.1074332678E+03    4.9410112042E+03    4.7685283379E+03    4.5907620396E+03    4.4085038254E+03    4.2225544845E+03    4.0337191970E+03    3.8428026757E+03    3.6506043666E+03    3.4579137432E+03    3.2655057270E+03    3.0741362660E+03    2.8845381025E+03    2.6974167568E+03    2.5134467567E+03    2.3332681339E+03    2.1574832114E+03    1.9866537019E+03    1.8212981328E+03    1.661889 [...]
+    5.7164244495E+03    5.5934330064E+03    5.4610465599E+03    5.3198898847E+03    5.1706241830E+03    5.0139428714E+03    4.8505671880E+03    4.6812416498E+03    4.5067293966E+03    4.3278074543E+03    4.1452619525E+03    3.9598833312E+03    3.7724615715E+03    3.5837814844E+03    3.3946180911E+03    3.2057321271E+03    3.0178657018E+03    2.8317381438E+03    2.6480420585E+03    2.4674396257E+03    2.2905591609E+03    2.1179919617E+03    1.9502894583E+03    1.7879606868E+03    1.631470 [...]
+    5.5885389332E+03    5.4682990124E+03    5.3388742844E+03    5.2008755455E+03    5.0549492041E+03    4.9017731628E+03    4.7420525226E+03    4.5765151428E+03    4.4059070889E+03    4.2309880015E+03    4.0525264216E+03    3.8712951039E+03    3.6880663548E+03    3.5036074262E+03    3.3186759992E+03    3.1340157891E+03    2.9503523020E+03    2.7683887727E+03    2.5888023110E+03    2.4122402820E+03    2.2393169441E+03    2.0706103663E+03    1.9066596422E+03    1.7479624200E+03    1.594972 [...]
+    5.4407323794E+03    5.3236725920E+03    5.1976709360E+03    5.0633220518E+03    4.9212552499E+03    4.7721305017E+03    4.6166342579E+03    4.4554751251E+03    4.2893794347E+03    4.1190867344E+03    3.9453452364E+03    3.7689072555E+03    3.5905246701E+03    3.4109444377E+03    3.2309041986E+03    3.0511279963E+03    2.8723221474E+03    2.6951712859E+03    2.5203346124E+03    2.3484423695E+03    2.1800925689E+03    2.0158479902E+03    1.8562334689E+03    1.7017334911E+03    1.552790 [...]
+    5.2745784461E+03    5.1610935451E+03    5.0389398697E+03    4.9086938990E+03    4.7709657235E+03    4.6263951575E+03    4.4756476862E+03    4.3194102741E+03    4.1583870687E+03    3.9932950306E+03    3.8248595199E+03    3.6538098745E+03    3.4808750088E+03    3.3067790673E+03    3.1322371612E+03    2.9579512209E+03    2.7846059912E+03    2.6128651969E+03    2.4433679057E+03    2.2767251126E+03    2.1135165659E+03    1.9542878580E+03    1.7995477964E+03    1.6497660713E+03    1.505371 [...]
+    5.0918249051E+03    4.9822720390E+03    4.8643507757E+03    4.7386176186E+03    4.6056615175E+03    4.4661001167E+03    4.3205758409E+03    4.1697518504E+03    4.0143078929E+03    3.8549360851E+03    3.6923366523E+03    3.5272136599E+03    3.3602707644E+03    3.1922070177E+03    3.0237127518E+03    2.8554655747E+03    2.6881265042E+03    2.5223362667E+03    2.3587117865E+03    2.1978428874E+03    2.0402892300E+03    1.8865775024E+03    1.7371988826E+03    1.5926067872E+03    1.453214 [...]
+    4.8943670406E+03    4.7890625801E+03    4.6757142669E+03    4.5548570215E+03    4.4270569527E+03    4.2929077502E+03    4.1530269237E+03    4.0080519136E+03    3.8586361048E+03    3.7054447713E+03    3.5491509815E+03    3.3904314946E+03    3.2299626773E+03    3.0684164701E+03    2.9064564320E+03    2.7447338917E+03    2.5838842310E+03    2.4245233278E+03    2.2672441809E+03    2.1126137400E+03    1.9611699615E+03    1.8134191082E+03    1.6698333104E+03    1.5308484015E+03    1.396862 [...]
+    4.6842191033E+03    4.5834360811E+03    4.4749546072E+03    4.3592866326E+03    4.2369739566E+03    4.1085847756E+03    3.9747100825E+03    3.8359599455E+03    3.6929596923E+03    3.5463460292E+03    3.3967631226E+03    3.2448586707E+03    3.0912799967E+03    2.9366701874E+03    2.7816643083E+03    2.6268857198E+03    2.4729425207E+03    2.3204241431E+03    2.1698981229E+03    2.0219070656E+03    1.8769658287E+03    1.7355589372E+03    1.5981382492E+03    1.4651208849E+03    1.336887 [...]
+    4.4634843438E+03    4.3674505401E+03    4.2640810852E+03    4.1538638031E+03    4.0373149597E+03    3.9149759734E+03    3.7874099848E+03    3.6551983110E+03    3.5189368092E+03    3.3792321792E+03    3.2366982290E+03    3.0919521325E+03    2.9456107058E+03    2.7982867288E+03    2.6505853383E+03    2.5031005175E+03    2.3564117075E+03    2.2110805627E+03    2.0676478735E+03    1.9266306748E+03    1.7885195615E+03    1.6537762255E+03    1.5228312319E+03    1.3960820449E+03    1.273891 [...]
+    4.2343241751E+03    4.1432208659E+03    4.0451585528E+03    3.9406000119E+03    3.8300350010E+03    3.7139771386E+03    3.5929606504E+03    3.4675370046E+03    3.3382714635E+03    3.2057395750E+03    3.0705236303E+03    2.9332091138E+03    2.7943811706E+03    2.6546211168E+03    2.5145030182E+03    2.3745903596E+03    2.2354328309E+03    2.0975632486E+03    1.9614946365E+03    1.8277174832E+03    1.6966971947E+03    1.5688717589E+03    1.4446496347E+03    1.3244078800E+03    1.208490 [...]
+    3.9989270172E+03    3.9128883937E+03    3.8202776629E+03    3.7215318717E+03    3.6171135482E+03    3.5075077550E+03    3.3932190155E+03    3.2747681374E+03    3.1526889553E+03    3.0275250174E+03    2.8998262407E+03    2.7701455577E+03    2.6390355807E+03    2.5070453060E+03    2.3747168826E+03    2.2425824674E+03    2.1111611890E+03    1.9809562416E+03    1.8524521268E+03    1.7261120643E+03    1.6023755861E+03    1.4816563304E+03    1.3643400486E+03    1.2507828372E+03    1.141309 [...]
+    3.7594773811E+03    3.6785906334E+03    3.5915253337E+03    3.4986923570E+03    3.4005265334E+03    3.2974838775E+03    3.1900386999E+03    3.0786806197E+03    2.9639115030E+03    2.8462423481E+03    2.7261901402E+03    2.6042746999E+03    2.4810155468E+03    2.3569288010E+03    2.2325241458E+03    2.1083018707E+03    1.9847500175E+03    1.8623416476E+03    1.7415322500E+03    1.6227573060E+03    1.5064300282E+03    1.3929392862E+03    1.2826477328E+03    1.1758901421E+03    1.072971 [...]
+    3.5181257313E+03    3.4424317810E+03    3.3609559583E+03    3.2740827582E+03    3.1822190929E+03    3.0857916991E+03    2.9852444340E+03    2.8810354812E+03    2.7736344846E+03    2.6635196337E+03    2.5511747212E+03    2.4370861927E+03    2.3217402124E+03    2.2056197635E+03    2.0892018058E+03    1.9729545084E+03    1.8573345795E+03    1.7427847089E+03    1.6297311422E+03    1.5185814024E+03    1.4097221736E+03    1.3035173599E+03    1.2003063325E+03    1.1004023735E+03    1.004091 [...]
+    3.2769596457E+03    3.2064544992E+03    3.1305638524E+03    3.0496458411E+03    2.9640794814E+03    2.8742622542E+03    2.7806075878E+03    2.6835422541E+03    2.5835036999E+03    2.4809373317E+03    2.3762937751E+03    2.2700261269E+03    2.1625872217E+03    2.0544269317E+03    1.9459895181E+03    1.8377110551E+03    1.7300169412E+03    1.6233195182E+03    1.5180158110E+03    1.4144854059E+03    1.3130884790E+03    1.2141639883E+03    1.1180280410E+03    1.0249724442E+03    9.352634 [...]
+    3.0379767550E+03    2.9726134384E+03    2.9022574030E+03    2.8272406643E+03    2.7479145945E+03    2.6646476844E+03    2.5778232087E+03    2.4878368125E+03    2.3950940372E+03    2.3000078033E+03    2.2029958699E+03    2.1044782871E+03    2.0048748621E+03    1.9046026556E+03    1.8040735273E+03    1.7036917464E+03    1.6038516860E+03    1.5049356145E+03    1.4073116009E+03    1.3113315478E+03    1.2173293632E+03    1.1256192853E+03    1.0364943677E+03    9.5022513684E+02    8.670584 [...]
+    2.8030599018E+03    2.7427509310E+03    2.6778353374E+03    2.6086194606E+03    2.5354275000E+03    2.4585994496E+03    2.3784889437E+03    2.2954610305E+03    2.2098898891E+03    2.1221565072E+03    2.0326463369E+03    1.9417469440E+03    1.8498456705E+03    1.7573273245E+03    1.6645719152E+03    1.5719524489E+03    1.4798328007E+03    1.3885656778E+03    1.2984906862E+03    1.2099325157E+03    1.1231992537E+03    1.0385808386E+03    9.5634766339E+02    8.7674933548E+02    8.000136 [...]
+    2.5739549066E+03    2.5185752352E+03    2.4589654820E+03    2.3954069463E+03    2.3281973270E+03    2.2576488266E+03    2.1840861728E+03    2.1078445742E+03    2.0292676238E+03    1.9487051668E+03    1.8665111478E+03    1.7830414525E+03    1.6986517613E+03    1.6136954277E+03    1.5285213988E+03    1.4434721915E+03    1.3588819381E+03    1.2750745159E+03    1.1923617722E+03    1.1110418578E+03    1.0313976779E+03    9.5369547291E+02    8.7818353534E+02    8.0509107159E+02    7.346272 [...]
+    2.3522512702E+03    2.3016416529E+03    2.2471663273E+03    2.1890823615E+03    2.1276618105E+03    2.0631899833E+03    1.9959636351E+03    1.9262890993E+03    1.8544803714E+03    1.7808571604E+03    1.7057429216E+03    1.6294628846E+03    1.5523420910E+03    1.4747034565E+03    1.3968658700E+03    1.3191423441E+03    1.2418382294E+03    1.1652495050E+03    1.0896611565E+03    1.0153456528E+03    9.4256153126E+02    8.7155209955E+02    8.0254426387E+02    7.3574748860E+02    6.713528 [...]
+    2.1393660766E+03    2.0933367789E+03    2.0437916497E+03    1.9909644901E+03    1.9351027314E+03    1.8764658593E+03    1.8153237695E+03    1.7519550689E+03    1.6866453332E+03    1.6196853344E+03    1.5513692516E+03    1.4819928780E+03    1.4118518357E+03    1.3412398133E+03    1.2704468375E+03    1.1997575906E+03    1.1294497865E+03    1.0597926160E+03    9.9104527182E+02    9.2345556285E+02    8.5725862743E+02    7.9267575315E+02    7.2991331062E+02    6.6916180742E+02    6.105950 [...]
+    1.9365312926E+03    1.8948660735E+03    1.8500183784E+03    1.8021998400E+03    1.7516344288E+03    1.6985570264E+03    1.6432119378E+03    1.5858513527E+03    1.5267337690E+03    1.4661223882E+03    1.4042834961E+03    1.3414848391E+03    1.2779940093E+03    1.2140768487E+03    1.1499958845E+03    1.0860088064E+03    1.0223669969E+03    9.5931412347E+02    8.9708480364E+02    8.3590335077E+02    7.7598260921E+02    7.1752288600E+02    6.6071098573E+02    6.0571935421E+02    5.527053 [...]
+    1.7447845883E+03    1.7072448810E+03    1.6668378264E+03    1.6237541008E+03    1.5781954968E+03    1.5303736377E+03    1.4805086364E+03    1.4288277105E+03    1.3755637604E+03    1.3209539250E+03    1.2652381216E+03    1.2086575839E+03    1.1514534066E+03    1.0938651074E+03    1.0361292179E+03    9.7847791130E+02    9.2113767817E+02    8.6432805827E+02    8.0826043765E+02    7.5313691871E+02    6.9914927069E+02    6.4647796710E+02    5.9529131620E+02    5.4574468941E+02    4.979798 [...]
+    1.5649637325E+03    1.5312929453E+03    1.4950503357E+03    1.4564069276E+03    1.4155437154E+03    1.3726505107E+03    1.3279247399E+03    1.2815702016E+03    1.2337957918E+03    1.1848142076E+03    1.1348406387E+03    1.0840914554E+03    1.0327829033E+03    9.8112981379E+02    9.2934433992E+02    8.7763472578E+02    8.2620411854E+02    7.7524943116E+02    7.2496026341E+02    6.7551788839E+02    6.2709431115E+02    5.7985140541E+02    5.3394013353E+02    4.8949985454E+02    4.466577 [...]
+    1.3977045425E+03    1.3676324037E+03    1.3352633190E+03    1.3007500331E+03    1.2642541953E+03    1.2259453298E+03    1.1859997617E+03    1.1445995069E+03    1.1019311342E+03    1.0581846071E+03    1.0135521155E+03    9.6822690351E+02    9.2240210401E+02    8.7626958705E+02    8.3001883057E+02    7.8383582147E+02    7.3790199461E+02    6.9239321710E+02    6.4747882460E+02    6.0332071618E+02    5.6007251358E+02    5.1787879014E+02    4.7687437415E+02    4.3718373085E+02    3.989204 [...]
+    1.2434423011E+03    1.2166891739E+03    1.1878926137E+03    1.1571885067E+03    1.1247206607E+03    1.0906398892E+03    1.0551030563E+03    1.0182720884E+03    9.8031296238E+02    9.4139467537E+02    9.0168820483E+02    8.6136546641E+02    8.2059827677E+02    7.7955732919E+02    7.3841118893E+02    6.9732531562E+02    6.5646111934E+02    6.1597505705E+02    5.7601777520E+02    5.3673330456E+02    4.9825831221E+02    4.6072141558E+02    4.2424256269E+02    3.8893248232E+02    3.548922 [...]
+    1.1024164873E+03    1.0786975827E+03    1.0531670008E+03    1.0259452163E+03    9.9715972702E+02    9.6694424172E+02    9.3543783339E+02    9.0278406350E+02    8.6913008439E+02    8.3462572613E+02    7.9942257462E+02    7.6367304752E+02    7.2752947480E+02    6.9114319050E+02    6.5466364208E+02    6.1823752361E+02    5.8200793902E+02    5.4611360091E+02    5.1068807047E+02    4.7585904357E+02    4.4174768761E+02    4.0846803335E+02    3.7612642542E+02    3.4482103484E+02    3.146414 [...]
+    9.7467860534E+02    9.5370802609E+02    9.3113568412E+02    9.0706809492E+02    8.8161798338E+02    8.5490356577E+02    8.2704780092E+02    7.9817761610E+02    7.6842311338E+02    7.3791676232E+02    7.0679258488E+02    6.7518533842E+02    6.4322970285E+02    6.1105947753E+02    5.7880679389E+02    5.4660134908E+02    5.1456966609E+02    4.8283438545E+02    4.5151359321E+02    4.2072018972E+02    3.9056130335E+02    3.6113775272E+02    3.3254356091E+02    3.0486552446E+02    2.781828 [...]
+    8.6010284346E+02    8.4159739953E+02    8.2167847316E+02    8.0044005946E+02    7.7798163305E+02    7.5440751444E+02    7.2982620922E+02    7.0434972495E+02    6.7809287083E+02    6.5117254528E+02    6.2370701662E+02    5.9581520220E+02    5.6761595098E+02    5.3922733497E+02    5.1076595427E+02    4.8234626087E+02    4.5407990575E+02    4.2607511378E+02    3.9843609074E+02    3.7126246625E+02    3.4464877640E+02    3.1868398921E+02    2.9345107594E+02    2.6902663066E+02    2.454805 [...]
+    7.5839924607E+02    7.4208198610E+02    7.2451836671E+02    7.0579126959E+02    6.8598840816E+02    6.6520176875E+02    6.4352702799E+02    6.2106295045E+02    5.9791077108E+02    5.7417356704E+02    5.4995562346E+02    5.2536179774E+02    5.0049688702E+02    4.7546500331E+02    4.5036896078E+02    4.2530967944E+02    4.0038560946E+02    3.7569217998E+02    3.5132127617E+02    3.2736074813E+02    3.0389395456E+02    2.8099934442E+02    2.5875007883E+02    2.3721369567E+02    2.164518 [...]
+    6.6912904403E+02    6.5473245724E+02    6.3923619823E+02    6.2271339438E+02    6.0524143610E+02    5.8690148394E+02    5.6777795442E+02    5.4795798859E+02    5.2753090719E+02    5.0658765634E+02    4.8522024800E+02    4.6352119902E+02    4.4158297307E+02    4.1949742934E+02    3.9735528186E+02    3.7524557344E+02    3.5325516765E+02    3.3146826255E+02    3.0996592925E+02    2.8882567863E+02    2.6812105867E+02    2.4792128536E+02    2.2829090909E+02    2.0928951870E+02    1.909714 [...]
+    5.9172175727E+02    5.7899060721E+02    5.6528697440E+02    5.5067552848E+02    5.3522470916E+02    5.1900629026E+02    5.0209492504E+02    4.8456767622E+02    4.6650353410E+02    4.4798292642E+02    4.2908722344E+02    4.0989824194E+02    3.9049775165E+02    3.7096698767E+02    3.5138617237E+02    3.3183405012E+02    3.1238743803E+02    2.9312079590E+02    2.7410581819E+02    2.5541105073E+02    2.3710153475E+02    2.1923848035E+02    2.0187897154E+02    1.8507570449E+02    1.688767 [...]
+    5.2549366267E+02    5.1418742373E+02    5.0201751789E+02    4.8904137894E+02    4.7531978899E+02    4.6091649125E+02    4.4589778626E+02    4.3033211444E+02    4.1428962818E+02    3.9784175642E+02    3.8106076522E+02    3.6401931712E+02    3.4679003287E+02    3.2944505836E+02    3.1205563999E+02    2.9469171144E+02    2.7742149470E+02    2.6031111810E+02    2.4342425390E+02    2.2682177793E+02    2.1056145339E+02    1.9469764086E+02    1.7928103636E+02    1.6435843885E+02    1.499725 [...]
+    4.6966720872E+02    4.5956208489E+02    4.4868501475E+02    4.3708733309E+02    4.2482336755E+02    4.1195009250E+02    3.9852676813E+02    3.8461456733E+02    3.7027619315E+02    3.5557548969E+02    3.4057704921E+02    3.2534581837E+02    3.0994670637E+02    2.9444419795E+02    2.7890197378E+02    2.6338254110E+02    2.4794687713E+02    2.3265408760E+02    2.1756108287E+02    2.0272227364E+02    1.8818928836E+02    1.7401071403E+02    1.6023186204E+02    1.4689456036E+02    1.340369 [...]
+    4.2339095576E+02    4.1428147037E+02    4.0447606378E+02    3.9402101553E+02    3.8296530339E+02    3.7136029135E+02    3.5925940416E+02    3.4671779096E+02    3.3379198041E+02    3.2053952984E+02    3.0701867106E+02    2.9328795533E+02    2.7940590010E+02    2.6543064004E+02    2.5141958487E+02    2.3742908628E+02    2.2351411649E+02    2.0972796036E+02    1.9612192340E+02    1.8274505746E+02    1.6964390591E+02    1.5686226999E+02    1.4444099767E+02    1.3241779637E+02    1.208270 [...]
+    3.8575962770E+02    3.7745978171E+02    3.6852583238E+02    3.5899994880E+02    3.4892675875E+02    3.3835306438E+02    3.2732754565E+02    3.1590045383E+02    3.0412329718E+02    2.9204852129E+02    2.7972918627E+02    2.6721864330E+02    2.5457021266E+02    2.4183686577E+02    2.2907091333E+02    2.1632370191E+02    2.0364532092E+02    1.9108432214E+02    1.7868745360E+02    1.6649940963E+02    1.5456259869E+02    1.4291693043E+02    1.3159962332E+02    1.2064503401E+02    1.100845 [...]
+    3.5583387623E+02    3.4817788131E+02    3.3993693788E+02    3.3114994667E+02    3.2185807664E+02    3.1210450271E+02    3.0193413216E+02    2.9139332181E+02    2.8052958810E+02    2.6939131215E+02    2.5802744197E+02    2.4648719397E+02    2.3481975603E+02    2.2307399407E+02    2.1129816441E+02    1.9953963380E+02    1.8784460910E+02    1.7625787853E+02    1.6482256617E+02    1.5357990138E+02    1.4256900457E+02    1.3182669081E+02    1.2138729235E+02    1.1128250120E+02    1.015412 [...]
+    3.3265938257E+02    3.2550198317E+02    3.1779769587E+02    3.0958289076E+02    3.0089605876E+02    2.9177756637E+02    2.8226939980E+02    2.7241490059E+02    2.6225849448E+02    2.5184541564E+02    2.4122142821E+02    2.3043254724E+02    2.1952476101E+02    2.0854375669E+02    1.9753465136E+02    1.8654173026E+02    1.7560819402E+02    1.6477591673E+02    1.5408521641E+02    1.4357463938E+02    1.3328076000E+02    1.2323799705E+02    1.1347844775E+02    1.0403174062E+02    9.492490 [...]
+    3.1528495245E+02    3.0850135856E+02    3.0119940675E+02    2.9341357026E+02    2.8518033268E+02    2.7653795543E+02    2.6752623530E+02    2.5818625374E+02    2.4856011989E+02    2.3869070916E+02    2.2862139927E+02    2.1839580568E+02    2.0805751842E+02    1.9764984200E+02    1.8721554044E+02    1.7679658917E+02    1.6643393538E+02    1.5616726877E+02    1.4603480387E+02    1.3607307574E+02    1.2631675011E+02    1.1679844933E+02    1.0754859506E+02    9.8595268791E+01    8.996409 [...]
+    3.0277929719E+02    2.9626475605E+02    2.8925238719E+02    2.8177529897E+02    2.7386853061E+02    2.6556882888E+02    2.5691441517E+02    2.4794474475E+02    2.3870025992E+02    2.2922213888E+02    2.1955204223E+02    2.0973185887E+02    1.9980345317E+02    1.8980841520E+02    1.7978781581E+02    1.6978196832E+02    1.5983019842E+02    1.4997062386E+02    1.4023994547E+02    1.3067325091E+02    1.2130383233E+02    1.1216301917E+02    1.0328002715E+02    9.4681824270E+01    8.639301 [...]
+    2.9424623652E+02    2.8791527719E+02    2.8110049369E+02    2.7383406349E+02    2.6615004070E+02    2.5808413911E+02    2.4967350571E+02    2.4095648673E+02    2.3197238768E+02    2.2276122928E+02    2.1336350110E+02    2.0381991449E+02    1.9417115690E+02    1.8445764912E+02    1.7471930718E+02    1.6499531077E+02    1.5532387956E+02    1.4574205907E+02    1.3628551761E+02    1.2698835548E+02    1.1788292775E+02    1.0899968182E+02    1.0036701062E+02    9.2011122353E+01    8.395592 [...]
+    2.8883810511E+02    2.8262349465E+02    2.7593393023E+02    2.6880099974E+02    2.6125813346E+02    2.5334039096E+02    2.4508423887E+02    2.3652732107E+02    2.2770822320E+02    2.1866623301E+02    2.0944109844E+02    2.0007278514E+02    1.9060123523E+02    1.8106612894E+02    1.7150665093E+02    1.6196126286E+02    1.5246748384E+02    1.4306168023E+02    1.3377886624E+02    1.2465251662E+02    1.1571439278E+02    1.0699438320E+02    9.8520359377E+01    9.0318048004E+01    8.241092 [...]
+    2.8576719455E+02    2.7961864797E+02    2.7300017904E+02    2.6594304128E+02    2.5848031122E+02    2.5064667750E+02    2.4247822097E+02    2.3401218731E+02    2.2528675401E+02    2.1634079322E+02    2.0721363239E+02    1.9794481435E+02    1.8857385856E+02    1.7914002534E+02    1.6968208455E+02    1.6023809064E+02    1.5084516534E+02    1.4153928974E+02    1.3235510695E+02    1.2332573680E+02    1.1448260376E+02    1.0585527906E+02    9.7471338207E+01    8.9356234433E+01    8.153318 [...]
+    2.8431511337E+02    2.7819780225E+02    2.7161294248E+02    2.6459162997E+02    2.5716677450E+02    2.4937288986E+02    2.4124587509E+02    2.3282278824E+02    2.2414161441E+02    2.1524102993E+02    2.0616016406E+02    1.9693836035E+02    1.8761493906E+02    1.7822896249E+02    1.6881900497E+02    1.5942292887E+02    1.5007766852E+02    1.4081902319E+02    1.3168146086E+02    1.2269793382E+02    1.1389970738E+02    1.0531620293E+02    9.6974856031E+01    8.8900990609E+01    8.111770 [...]
+    2.8383999953E+02    2.7773290539E+02    2.7115903335E+02    2.6414942824E+02    2.5673694584E+02    2.4895604337E+02    2.4084256104E+02    2.3243349616E+02    2.2376677165E+02    2.1488100043E+02    2.0581524768E+02    1.9660879241E+02    1.8730089039E+02    1.7793053980E+02    1.6853625156E+02    1.5915582576E+02    1.4982613589E+02    1.4058292218E+02    1.3146059564E+02    1.2249205402E+02    1.1370851079E+02    1.0513933839E+02    9.6811926658E+01    8.8751557181E+01    8.098129 [...]
+    2.8378157026E+02    2.7767572933E+02    2.7110319906E+02    2.6409501853E+02    2.5668403749E+02    2.4890470685E+02    2.4079286028E+02    2.3238548838E+02    2.2372050715E+02    2.1483652251E+02    2.0577259249E+02    1.9656798894E+02    1.8726196038E+02    1.7789349782E+02    1.6850110499E+02    1.5912257493E+02    1.4979477412E+02    1.4055343598E+02    1.3143296490E+02    1.2246625218E+02    1.1368450510E+02    1.0511709022E+02    9.6791391773E+01    8.8732686072E+01    8.096403 [...]
+    2.8366404283E+02    2.7756072797E+02    2.7099091199E+02    2.6398562157E+02    2.5657769334E+02    2.4880156449E+02    2.4069305445E+02    2.3228913909E+02    2.2362771936E+02    2.1474738581E+02    2.0568718094E+02    1.9648636094E+02    1.8718415869E+02    1.7781954958E+02    1.6843102194E+02    1.5905635359E+02    1.4973239618E+02    1.4049486866E+02    1.3137816145E+02    1.2241515242E+02    1.1363703609E+02    1.0507316688E+02    9.6750917697E+01    8.8695554296E+01    8.093012 [...]
+    2.8309700578E+02    2.7700588963E+02    2.7044920177E+02    2.6345790711E+02    2.5606477697E+02    2.4830418007E+02    2.4021186459E+02    2.3182473291E+02    2.2318061061E+02    2.1431801153E+02    2.0527590052E+02    1.9609345570E+02    1.8680983190E+02    1.7746392696E+02    1.6809415259E+02    1.5873821138E+02    1.4943288156E+02    1.4021381087E+02    1.3111532113E+02    1.2217022461E+02    1.1340965350E+02    1.0486290357E+02    9.6557292940E+01    8.8518036775E+01    8.076813 [...]
+    2.8177436128E+02    2.7571170224E+02    2.6918564491E+02    2.6222700973E+02    2.5486841508E+02    2.4714406932E+02    2.3908955384E+02    2.3074159887E+02    2.2213785350E+02    2.1331665187E+02    2.0431677704E+02    1.9517722434E+02    1.8593696586E+02    1.7663471793E+02    1.6730871297E+02    1.5799647758E+02    1.4873461827E+02    1.3955861635E+02    1.3050263335E+02    1.2159932825E+02    1.1287968779E+02    1.0437287084E+02    9.6106067815E+01    8.8104375987E+01    8.039069 [...]
+    2.7947149654E+02    2.7345838552E+02    2.6698566262E+02    2.6008389647E+02    2.5278543898E+02    2.4512421904E+02    2.3713552740E+02    2.2885579420E+02    2.2032236099E+02    2.1157324876E+02    2.0264692374E+02    1.9358206266E+02    1.8441731927E+02    1.7519109354E+02    1.6594130553E+02    1.5670517521E+02    1.4751900998E+02    1.3841800119E+02    1.2943603117E+02    1.2060549200E+02    1.1195711712E+02    1.0351982705E+02    9.5320589906E+01    8.7384297756E+01    7.973365 [...]
+    2.7604087323E+02    2.7010157536E+02    2.6370830721E+02    2.5689126221E+02    2.4968239517E+02    2.4211521858E+02    2.3422459003E+02    2.2604649256E+02    2.1761780939E+02    2.0897609488E+02    2.0015934312E+02    1.9120575616E+02    1.8215351329E+02    1.7304054317E+02    1.6390430040E+02    1.5478154811E+02    1.4570814799E+02    1.3671885941E+02    1.2784714876E+02    1.1912501047E+02    1.1058280067E+02    1.0224908480E+02    9.4150499864E+01    8.6311632298E+01    7.875491 [...]
+    2.7140624919E+02    2.6556666983E+02    2.5928074200E+02    2.5257815221E+02    2.4549031882E+02    2.3805019169E+02    2.3029204320E+02    2.2225125229E+02    2.1396408302E+02    2.0546745923E+02    1.9679873718E+02    1.8799547755E+02    1.7909521865E+02    1.7013525238E+02    1.6115240450E+02    1.5218282091E+02    1.4326176120E+02    1.3442340114E+02    1.2570064522E+02    1.1712495063E+02    1.0872616383E+02    1.0053237059E+02    9.2569760633E+01    8.4862507534E+01    7.743266 [...]
+    2.6555576551E+02    2.5984206502E+02    2.5369163727E+02    2.4713352889E+02    2.4019848101E+02    2.3291873327E+02    2.2532781934E+02    2.1746035559E+02    2.0935182441E+02    2.0103835379E+02    1.9255649477E+02    1.8394299844E+02    1.7523459398E+02    1.6646776945E+02    1.5767855684E+02    1.4890232290E+02    1.4017356720E+02    1.3152572880E+02    1.2299100290E+02    1.1460016859E+02    1.0638242893E+02    9.8365264227E+01    9.0574299632E+01    8.3033187576E+01    7.576350 [...]
+    2.5853414482E+02    2.5297152117E+02    2.4698371705E+02    2.4059901115E+02    2.3384733185E+02    2.2676006642E+02    2.1936986195E+02    2.1171041963E+02    2.0381628375E+02    1.9572262713E+02    1.8746503448E+02    1.7907928523E+02    1.7060113751E+02    1.6206611467E+02    1.5350929606E+02    1.4496511335E+02    1.3646715398E+02    1.2804797287E+02    1.1973891400E+02    1.1156994263E+02    1.0356948967E+02    9.5764308824E+01    8.8179347657E+01    8.0837633177E+01    7.376017 [...]
+    2.5043425170E+02    2.4504590466E+02    2.3924569663E+02    2.3306102042E+02    2.2652086690E+02    2.1965564012E+02    2.1249696452E+02    2.0507748558E+02    1.9743066549E+02    1.8959057529E+02    1.8159168499E+02    1.7346865322E+02    1.6525611796E+02    1.5698848980E+02    1.4869974918E+02    1.4042324918E+02    1.3219152504E+02    1.2403611186E+02    1.1598737168E+02    1.0807433104E+02    1.0032453015E+02    9.2763884559E+01    8.5416560234E+01    7.8304862745E+01    7.144914 [...]
+    2.4138826635E+02    2.3619455165E+02    2.3060385052E+02    2.2464256651E+02    2.1833864353E+02    2.1172138764E+02    2.0482128119E+02    1.9766979074E+02    1.9029917004E+02    1.8274225971E+02    1.7503228495E+02    1.6720265273E+02    1.5928675014E+02    1.5131774504E+02    1.4332839072E+02    1.3535083571E+02    1.2741644024E+02    1.1955560051E+02    1.1179758200E+02    1.0417036290E+02    9.6700488750E+01    8.9412939063E+01    8.2331006956E+01    7.5476192312E+01    6.886810 [...]
+    2.3155871543E+02    2.2657649177E+02    2.2121344397E+02    2.1549490069E+02    2.0944766823E+02    2.0309985959E+02    1.9648071623E+02    1.8962042370E+02    1.8254992274E+02    1.7530071706E+02    1.6790467924E+02    1.6039385631E+02    1.5280027615E+02    1.4515575637E+02    1.3749171684E+02    1.2983899728E+02    1.2222768122E+02    1.1468692734E+02    1.0724480965E+02    9.9928167235E+01    9.2762464824E+01    8.5771664874E+01    7.8978112064E+01    7.2402430824E+01    6.606343 [...]
+    2.2112959182E+02    2.1637175910E+02    2.1125024959E+02    2.0578925152E+02    2.0001436429E+02    1.9395243516E+02    1.8763138905E+02    1.8108005249E+02    1.7432797316E+02    1.6740523640E+02    1.6034227982E+02    1.5316970756E+02    1.4591810551E+02    1.3861785873E+02    1.3129897243E+02    1.2399089779E+02    1.1672236378E+02    1.0952121619E+02    1.0241426491E+02    9.5427140498E+01    8.8584161003E+01    8.1908209816E+01    7.5420625353E+01    6.9141103212E+01    6.308761 [...]
+    2.1029777803E+02    2.0577300000E+02    2.0090235375E+02    1.9570884314E+02    1.9021681413E+02    1.8445179946E+02    1.7844035675E+02    1.7220990110E+02    1.6578853350E+02    1.5920486620E+02    1.5248784652E+02    1.4566658012E+02    1.3877015532E+02    1.3182746940E+02    1.2486705836E+02    1.1791693130E+02    1.1100441044E+02    1.0415597802E+02    9.7397131081E+01    9.0752245042E+01    8.4244447041E+01    7.7895499771E+01    7.1725696564E+01    6.5753768336E+01    5.999680 [...]
+    1.9926496578E+02    1.9497756658E+02    1.9036243728E+02    1.8544137546E+02    1.8023745046E+02    1.7477485617E+02    1.6907875767E+02    1.6317513254E+02    1.5709060829E+02    1.5085229690E+02    1.4448762781E+02    1.3802418053E+02    1.3148951808E+02    1.2491102246E+02    1.1831573333E+02    1.1173019100E+02    1.0518028492E+02    9.8691108555E+01    9.2286821801E+01    8.5990521706E+01    7.9824122445E+01    7.3808245253E+01    6.7962119011E+01    6.2303492068E+01    5.684855 [...]
+    1.8823023934E+02    1.8418025965E+02    1.7982069014E+02    1.7517212198E+02    1.7025634776E+02    1.6509622240E+02    1.5971551828E+02    1.5413877531E+02    1.4839114740E+02    1.4249824607E+02    1.3648598277E+02    1.3038041067E+02    1.2420756736E+02    1.1799331938E+02    1.1176320988E+02    1.0554231024E+02    9.9355076974E+01    9.3225214609E+01    8.7175545727E+01    8.1227888840E+01    7.5402945000E+01    6.9720193825E+01    6.4197799586E+01    5.8852527909E+01    5.369967 [...]
+    1.7738346207E+02    1.7356685750E+02    1.6945849336E+02    1.6507777508E+02    1.6044524031E+02    1.5558242793E+02    1.5051174142E+02    1.4525630765E+02    1.3983983211E+02    1.3428645157E+02    1.2862058543E+02    1.2286678665E+02    1.1704959348E+02    1.1119338295E+02    1.0532222725E+02    9.9459753980E+01    9.3629011185E+01    8.7852338213E+01    8.2151243180E+01    7.6546287899E+01    7.1056981009E+01    6.5701679996E+01    6.0497502678E+01    5.5460248713E+01    5.060433 [...]
+    1.6689957543E+02    1.6330853758E+02    1.5944297281E+02    1.5532114053E+02    1.5096236555E+02    1.4638691483E+02    1.4161586889E+02    1.3667098894E+02    1.3157458063E+02    1.2634935545E+02    1.2101829079E+02    1.1560448971E+02    1.1013104140E+02    1.0462088332E+02    9.9096666050E+01    9.3580621791E+01    8.8094437360E+01    8.2659132668E+01    7.7294945419E+01    7.2021222835E+01    6.6856321092E+01    6.1817513120E+01    5.6920905324E+01    5.2181363722E+01    4.761244 [...]
+    1.5693388879E+02    1.5355726770E+02    1.4992249938E+02    1.4604675400E+02    1.4194820359E+02    1.3764590614E+02    1.3315968474E+02    1.2851000255E+02    1.2371783472E+02    1.1880453802E+02    1.1379171926E+02    1.0870110339E+02    1.0355440228E+02    9.8373185109E+01    9.3178751238E+01    8.7992006534E+01    8.2833343972E+01    7.7722529334E+01    7.2678592789E+01    6.7719727066E+01    6.2863192895E+01    5.8125232300E+01    5.3520990291E+01    4.9064445409E+01    4.476834 [...]
+    1.4761840713E+02    1.4444221267E+02    1.4102318079E+02    1.3737746356E+02    1.3352215555E+02    1.2947518482E+02    1.2525519915E+02    1.2088144850E+02    1.1637366445E+02    1.1175193759E+02    1.0703659369E+02    1.0224806965E+02    9.7406790036E+01    9.2533045131E+01    8.7646871351E+01    8.2767934892E+01    7.7915419403E+01    7.3107918458E+01    6.8363333553E+01    6.3698778322E+01    5.9130489573E+01    5.4673745728E+01    5.0342793156E+01    4.6150780833E+01    4.210970 [...]
+    1.3905921292E+02    1.3606717256E+02    1.3284636039E+02    1.2941199312E+02    1.2578017545E+02    1.2196779736E+02    1.1799242689E+02    1.1387219944E+02    1.0962570412E+02    1.0527186827E+02    1.0082984077E+02    9.6318875208E+01    9.1758213475E+01    8.7166970926E+01    8.2564023698E+01    7.7967899079E+01    7.3396669683E+01    6.8867852138E+01    6.4398310990E+01    6.0004168453E+01    5.5700720603E+01    5.1502360533E+01    4.7422508952E+01    4.3473552638E+01    3.966679 [...]
+    1.3133488942E+02    1.2850903993E+02    1.2546711092E+02    1.2222347509E+02    1.1879334397E+02    1.1519267082E+02    1.1143804943E+02    1.0754660946E+02    1.0353590916E+02    9.9423826232E+01    9.5228447646E+01    9.0967959199E+01    8.6660535647E+01    8.2324232159E+01    7.7976877898E+01    7.3635972462E+01    6.9318585915E+01    6.5041263088E+01    6.0819932810E+01    5.6669822658E+01    5.2605379792E+01    4.8640198376E+01    4.4786954026E+01    4.1057345676E+01    3.746204 [...]
+    1.2449594535E+02    1.2181723682E+02    1.1893368484E+02    1.1585891497E+02    1.1260734805E+02    1.0919410815E+02    1.0563492660E+02    1.0194604279E+02    9.8144102410E+01    9.4246054007E+01    9.0269044496E+01    8.6230314465E+01    8.2147093990E+01    7.8036499727E+01    7.3915434015E+01    6.9800486688E+01    6.5707840296E+01    6.1653179371E+01    5.7651604371E+01    5.3717550858E+01    4.9864714445E+01    4.6105981989E+01    4.2453369446E+01    3.8917966757E+01    3.550989 [...]
+    1.1856517644E+02    1.1601406857E+02    1.1326785976E+02    1.1033952777E+02    1.0724280789E+02    1.0399210525E+02    1.0060240342E+02    9.7089169871E+01    9.3468259110E+01    8.9755814075E+01    8.5968166636E+01    8.2121737852E+01    7.8232938732E+01    7.4318072205E+01    7.0393237012E+01    6.6474234171E+01    6.2576476701E+01    5.8714903191E+01    5.4903895829E+01    5.1157203419E+01    4.7487869894E+01    4.3908168775E+01    4.0429543988E+01    3.7062557367E+01    3.381684 [...]
+    1.1353887828E+02    1.1109591054E+02    1.0846609707E+02    1.0566186674E+02    1.0269637396E+02    9.9583414737E+01    9.6337339063E+01    9.2972960409E+01    8.9505462905E+01    8.5950306926E+01    8.2323133772E+01    7.8639670130E+01    7.4915633024E+01    7.1166635919E+01    6.7408096662E+01    6.3655147902E+01    5.9922550611E+01    5.6224611315E+01    5.2575103572E+01    4.8987194247E+01    4.5473375045E+01    4.2045399739E+01    3.8714227490E+01    3.5489972576E+01    3.238186 [...]
+    1.0938880704E+02    1.0703512669E+02    1.0450141509E+02    1.0179964803E+02    9.8942500485E+01    9.5943265660E+01    9.2815770599E+01    8.9574288955E+01    8.6233451537E+01    8.2808155332E+01    7.9313471639E+01    7.5764554007E+01    7.2176546635E+01    6.8564493887E+01    6.4943251581E+01    6.1327400659E+01    5.7731163859E+01    5.4168325948E+01    5.0652158066E+01    4.7195346675E+01    4.3809927589E+01    4.0507225493E+01    3.7297799322E+01    3.4191393834E+01    3.119689 [...]
+    1.0606477118E+02    1.0378260547E+02    1.0132586492E+02    9.8706162607E+01    9.5935789621E+01    9.3027636619E+01    8.9995111967E+01    8.6852057128E+01    8.3612659919E+01    8.0291366270E+01    7.6902791127E+01    7.3461629175E+01    6.9982565988E+01    6.6480190286E+01    6.2968907892E+01    5.9462858015E+01    5.5975832431E+01    5.2521198130E+01    4.9111823945E+01    4.5760011648E+01    4.2477431979E+01    3.9275065991E+01    3.6163152089E+01    3.3151139069E+01    3.024764 [...]
+    1.0349772735E+02    1.0127078911E+02    9.8873488089E+01    9.6317157359E+01    9.3613791731E+01    9.0775971163E+01    8.7816780873E+01    8.4749728758E+01    8.1588660729E+01    7.8347674581E+01    7.5041033045E+01    7.1683076635E+01    6.8288136948E+01    6.4870451012E+01    6.1444077313E+01    5.8022814087E+01    5.4620120448E+01    5.1249040883E+01    4.7922133653E+01    4.4651403544E+01    4.1448239437E+01    3.8323357065E+01    3.5286747331E+01    3.2347630482E+01    2.951441 [...]
+    1.0160324826E+02    9.9417066930E+01    9.7063629445E+01    9.4554062397E+01    9.1900142111E+01    8.9114219434E+01    8.6209141303E+01    8.3198169650E+01    8.0094898270E+01    7.6913168257E+01    7.3666982617E+01    7.0370420708E+01    6.7037553094E+01    6.3682357455E+01    6.0318636133E+01    5.6959935903E+01    5.3619470528E+01    5.0310046635E+01    4.7043993403E+01    4.3833096545E+01    4.0688537009E+01    3.7620834781E+01    3.4639798141E+01    3.1754478678E+01    2.897313 [...]
+    1.0028522880E+02    9.8127401658E+01    9.5804477707E+01    9.3327440048E+01    9.0707913183E+01    8.7958088766E+01    8.5090648166E+01    8.2118682414E+01    7.9055610135E+01    7.5915094059E+01    7.2710956733E+01    6.9457096048E+01    6.6167401188E+01    6.2855669613E+01    5.9535525660E+01    5.6220341347E+01    5.2923159913E+01    4.9656622649E+01    4.6432899490E+01    4.3263623845E+01    4.0159832084E+01    3.7131908068E+01    3.4189533062E+01    3.1341641327E+01    2.859638 [...]
+    9.9439698866E+01    9.7300060261E+01    9.4996707958E+01    9.2540533190E+01    8.9943063260E+01    8.7216387910E+01    8.4373082523E+01    8.1426128733E+01    7.8388833035E+01    7.5274743985E+01    7.2097568612E+01    6.8871088636E+01    6.5609077125E+01    6.2325216151E+01    5.9033016076E+01    5.5745737006E+01    5.2476312971E+01    4.9237279357E+01    4.6040704082E+01    4.2898122963E+01    3.9820479711E+01    3.6818070927E+01    3.3900496430E+01    3.1076615227E+01    2.835450 [...]
+    9.8958617468E+01    9.6829326374E+01    9.4537106205E+01    9.2092796113E+01    8.9507868315E+01    8.6794354799E+01    8.3964770895E+01    8.1032036255E+01    7.8009393842E+01    7.4910327522E+01    7.1748478869E+01    6.8537563776E+01    6.5291289500E+01    6.2023272715E+01    5.8746959168E+01    5.5475545509E+01    5.2221903828E+01    4.8998509432E+01    4.5817372344E+01    4.2689972981E+01    3.9627202432E+01    3.6639307716E+01    3.3735842355E+01    3.0925622548E+01    2.821668 [...]
+    9.8733531547E+01    9.6609080437E+01    9.4322064771E+01    9.1883299551E+01    8.9304231457E+01    8.6596865718E+01    8.3773689843E+01    8.0847594771E+01    7.7831794041E+01    7.4739741554E+01    7.1585048559E+01    6.8381400450E+01    6.5142473983E+01    6.1881855509E+01    5.8612960806E+01    5.5348957076E+01    5.2102687649E+01    4.8886599917E+01    4.5712676983E+01    4.2592373481E+01    3.9536555986E+01    3.6555448398E+01    3.3658582617E+01    3.0854754827E+01    2.815198 [...]
+    9.8658995147E+01    9.6536145275E+01    9.4250848690E+01    9.1813912635E+01    8.9236775599E+01    8.6531434240E+01    8.3710367159E+01    8.0786456114E+01    7.7772905227E+01    7.4683158813E+01    7.1530818418E+01    6.8329559665E+01    6.5093049530E+01    6.1834864633E+01    5.8568411116E+01    5.5306846698E+01    5.2063005429E+01    4.8849325673E+01    4.5677781800E+01    4.2559820060E+01    3.9506299028E+01    3.6527435029E+01    3.3632752850E+01    3.0831042057E+01    2.813031 [...]
+    9.8635658526E+01    9.6513308753E+01    9.4228546812E+01    9.1792177713E+01    8.9215637600E+01    8.6510920685E+01    8.3690503037E+01    8.0767263801E+01    7.7754404426E+01    7.4665366505E+01    7.1513748818E+01    6.8313224204E+01    6.5077456844E+01    6.1820020560E+01    5.8554318718E+01    5.5293506286E+01    5.2050414608E+01    4.8837479393E+01    4.5666672432E+01    4.2549437469E+01    3.9496630667E+01    3.6518466044E+01    3.3624466196E+01    3.0823418621E+01    2.812333 [...]
+    9.8572952910E+01    9.6451950759E+01    9.4168636607E+01    9.1733808854E+01    8.9158896660E+01    8.6455886926E+01    8.3637248124E+01    8.0715851559E+01    7.7704890649E+01    7.4617798804E+01    7.1468166526E+01    6.8269658317E+01    6.5035930019E+01    6.1780547159E+01    5.8516904891E+01    5.5258150112E+01    5.2017106265E+01    4.8806201385E+01    4.5637399845E+01    4.2522138273E+01    3.9471266055E+01    3.6494990794E+01    3.3602829079E+01    3.0803562825E+01    2.810520 [...]
+    9.8391313681E+01    9.6274218564E+01    9.3995108040E+01    9.1564760819E+01    8.8994585236E+01    8.6296546358E+01    8.3483089953E+01    8.0567063895E+01    7.7561637581E+01    7.4480219965E+01    7.1336376801E+01    6.8143747706E+01    6.4915963638E+01    6.1666565398E+01    5.8408923710E+01    5.5156161476E+01    5.1921078722E+01    4.8716080766E+01    4.5553110090E+01    4.2443582374E+01    3.9398327108E+01    3.6427533152E+01    3.3540699588E+01    3.0746592149E+01    2.805320 [...]
+    9.8023902652E+01    9.5914712039E+01    9.3644108897E+01    9.1222831863E+01    8.8662246870E+01    8.5974274522E+01    8.3171314344E+01    8.0266166474E+01    7.7271951384E+01    7.4202028207E+01    7.1069912293E+01    6.7889192572E+01    6.4673449344E+01    6.1436173072E+01    5.8190684768E+01    5.4950058529E+01    5.1727046759E+01    4.8534008609E+01    4.5382842097E+01    4.2284920383E+01    3.9251032597E+01    3.6291329605E+01    3.3415275043E+01    3.0631601912E+01    2.794827 [...]
+    9.7417807957E+01    9.5321657732E+01    9.3065091076E+01    9.0658780392E+01    8.8114021518E+01    8.5442661549E+01    8.2657023551E+01    7.9769828740E+01    7.6794116688E+01    7.3743164157E+01    7.0630403159E+01    6.7469338829E+01    6.4273467715E+01    6.1056197078E+01    5.7830765760E+01    5.4610167198E+01    5.1407075111E+01    4.8233772372E+01    4.5102083555E+01    4.2023311596E+01    3.9008178988E+01    3.6066773882E+01    3.3208501424E+01    3.0442040618E+01    2.777530 [...]
+    9.6534717567E+01    9.4457567885E+01    9.2221454013E+01    8.9836951769E+01    8.7315254775E+01    8.4668102927E+01    8.1907707795E+01    7.9046675493E+01    7.6097927616E+01    7.3074620801E+01    6.9990065526E+01    6.6857644726E+01    6.3690732823E+01    6.0502615748E+01    5.7306412529E+01    5.4114998997E+01    5.0940934149E+01    4.7796389657E+01    4.4693083028E+01    4.1642214836E+01    3.8654410452E+01    3.5739666630E+01    3.2907303288E+01    3.0165920756E+01    2.752336 [...]
+    9.5351078976E+01    9.3299396698E+01    9.1090697243E+01    8.8735426929E+01    8.6244642325E+01    8.3629939592E+01    8.0903380792E+01    7.8077417710E+01    7.5164813743E+01    7.2178564458E+01    6.9131817374E+01    6.6037791575E+01    6.2909697729E+01    5.9760659089E+01    5.6603634039E+01    5.3451340732E+01    5.0316184352E+01    4.7210187489E+01    4.4144924112E+01    4.1131457574E+01    3.8180283052E+01    3.5301274787E+01    3.2503638456E+01    2.9795868949E+01    2.718571 [...]
+    9.3857772803E+01    9.1838220944E+01    8.9664108584E+01    8.7345718640E+01    8.4893934739E+01    8.2320171672E+01    7.9636302852E+01    7.6854585318E+01    7.3987582852E+01    7.1048087773E+01    6.8049041971E+01    6.5003457780E+01    6.1924339240E+01    5.8824604334E+01    5.5717008745E+01    5.2614071668E+01    4.9528004214E+01    4.6470640865E+01    4.3453374488E+01    4.0487095302E+01    3.7582134217E+01    3.4748210910E+01    3.1994386930E+01    2.9329024142E+01    2.675974 [...]
+    9.2059341483E+01    9.0078485265E+01    8.7946027303E+01    8.5672053711E+01    8.3267239832E+01    8.0742782013E+01    7.8110326454E+01    7.5381895643E+01    7.2569812946E+01    6.9686625888E+01    6.6745028702E+01    6.3757784708E+01    6.0737649085E+01    5.7697292593E+01    5.4649226783E+01    5.1605731232E+01    4.8578783311E+01    4.5579990956E+01    4.2620528920E+01    3.9711078906E+01    3.6861774000E+01    3.4082147727E+01    3.1381088064E+01    2.8766796675E+01    2.624675 [...]
+    8.9972825638E+01    8.8036863576E+01    8.5952732470E+01    8.3730290106E+01    8.1379970175E+01    7.8912715589E+01    7.6339908939E+01    7.3673300591E+01    7.0924934979E+01    6.8107075622E+01    6.5232129422E+01    6.2312570800E+01    5.9360866209E+01    5.6389399582E+01    5.3410399233E+01    5.0435866741E+01    4.7477508296E+01    4.4546669001E+01    4.1654270556E+01    3.8810752756E+01    3.6026019172E+01    3.3309387365E+01    3.0669543941E+01    2.8114504705E+01    2.565158 [...]
+    8.7626269843E+01    8.5740796987E+01    8.3711015494E+01    8.1546526374E+01    7.9257491558E+01    7.6854568950E+01    7.4348844683E+01    7.1751763098E+01    6.9075054946E+01    6.6330664354E+01    6.3530675095E+01    6.0687236694E+01    5.7812490906E+01    5.4918499102E+01    5.2017171072E+01    4.9120195754E+01    4.6238974376E+01    4.3384556455E+01    4.0567579117E+01    3.7798210103E+01    3.5086094874E+01    3.2440308119E+01    2.9869309980E+01    2.7380907247E+01    2.498221 [...]
+    8.5056966203E+01    8.3226775169E+01    8.1256502173E+01    7.9155467092E+01    7.6933534314E+01    7.4601049694E+01    7.2168774790E+01    6.9647818884E+01    6.7049569283E+01    6.4385620427E+01    6.1667702306E+01    5.8907608726E+01    5.6117125944E+01    5.3307962165E+01    5.0491678438E+01    4.7679621402E+01    4.4882858387E+01    4.2112115286E+01    3.9377717644E+01    3.6689535340E+01    3.4056931233E+01    3.1488714096E+01    2.8993096114E+01    2.6577655225E+01    2.424930 [...]
+    8.2309508378E+01    8.0538432249E+01    7.8631793665E+01    7.6598611893E+01    7.4448433172E+01    7.2191269691E+01    6.9837535950E+01    6.7397982967E+01    6.4883630820E+01    6.2305700038E+01    5.9675542324E+01    5.7004571131E+01    5.4304192588E+01    5.1585737277E+01    4.8860393345E+01    4.6139141422E+01    4.3432691811E+01    4.0751424357E+01    3.8105331440E+01    3.5503964439E+01    3.2956384028E+01    3.0471114632E+01    2.8056103299E+01    2.5718683250E+01    2.346554 [...]
+    7.9433730384E+01    7.7724529969E+01    7.5884497386E+01    7.3922337280E+01    7.1847262905E+01    6.9668937233E+01    6.7397411528E+01    6.5043061840E+01    6.2616523901E+01    6.0128626899E+01    5.7590326617E+01    5.5012638421E+01    5.2406570594E+01    4.9783058488E+01    4.7152899963E+01    4.4526692576E+01    4.1914772948E+01    3.9327158745E+01    3.6773493640E+01    3.4262995651E+01    3.1804409174E+01    2.9405961015E+01    2.7075320709E+01    2.4819565338E+01    2.264514 [...]
+    7.6482603846E+01    7.4836900170E+01    7.3065218202E+01    7.1175939746E+01    6.9177936380E+01    6.7080512744E+01    6.4893347382E+01    6.2626431592E+01    6.0290006728E+01    5.7894500424E+01    5.5450462208E+01    5.2968498967E+01    5.0459210756E+01    4.7933127376E+01    4.5400646212E+01    4.2871971738E+01    4.0357057143E+01    3.7865548443E+01    3.5406731497E+01    3.2989482248E+01    3.0622220541E+01    2.8312867784E+01    2.6068808733E+01    2.3896857624E+01    2.180322 [...]
+    7.3510164366E+01    7.1928415790E+01    7.0225577452E+01    6.8409706016E+01    6.6489328954E+01    6.4473390022E+01    6.2371192397E+01    6.0192339888E+01    5.7946676667E+01    5.5644225960E+01    5.3295128150E+01    5.0909578745E+01    4.8497766662E+01    4.6069813268E+01    4.3635712617E+01    4.1205273306E+01    3.8788062351E+01    3.6393351469E+01    3.4030066145E+01    3.1706737805E+01    2.9431459414E+01    2.7211844790E+01    2.5054991869E+01    2.2967450142E+01    2.095519 [...]
+    7.0569532726E+01    6.9051054638E+01    6.7416322558E+01    6.5673071528E+01    6.3829488634E+01    6.1894160657E+01    5.9876019467E+01    5.7784285581E+01    5.5628410290E+01    5.3418016788E+01    5.1162840745E+01    4.8872670739E+01    4.6557289000E+01    4.4226412878E+01    4.1889637461E+01    3.9556379742E+01    3.7235824736E+01    3.4936873904E+01    3.2668096242E+01    3.0437682370E+01    2.8253401896E+01    2.6122564353E+01    2.4051983933E+01    2.2047948228E+01    2.011619 [...]
+    6.7711089800E+01    6.6254113572E+01    6.4685583473E+01    6.3012921953E+01    6.1243985271E+01    5.9387013254E+01    5.7450576900E+01    5.5443524196E+01    5.3374924590E+01    5.1254012481E+01    4.9090130193E+01    4.6892670804E+01    4.4671021278E+01    4.2434506291E+01    4.0192333164E+01    3.7953538282E+01    3.5726935376E+01    3.3521066036E+01    3.1344152771E+01    2.9204054942E+01    2.7108227864E+01    2.5063685307E+01    2.3076965660E+01    2.1154101939E+01    1.930059 [...]
+    6.4980855792E+01    6.3582622617E+01    6.2077324341E+01    6.0472084885E+01    5.8774444568E+01    5.6992311883E+01    5.5133913191E+01    5.3207740725E+01    5.1222499269E+01    4.9187051934E+01    4.7110365398E+01    4.5001455040E+01    4.2869330346E+01    4.0722940989E+01    3.8571123971E+01    3.6422552187E+01    3.4285684786E+01    3.2168719670E+01    3.0079548435E+01    2.8025714077E+01    2.6014371736E+01    2.4052252702E+01    2.2145631947E+01    2.0300299333E+01    1.852153 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism3_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism3_BA.inp
new file mode 100644
index 0000000..0b41e73
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism3_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_prism3_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+prism3                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism6_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism6_BA.ima
new file mode 100644
index 0000000..f9e31fd
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism6_BA.ima
@@ -0,0 +1,100 @@
+    2.4067727101E+04    2.3549899246E+04    2.2992516043E+04    2.2398207912E+04    2.1769758630E+04    2.1110087583E+04    2.0422231283E+04    1.9709324248E+04    1.8974579393E+04    1.8221268095E+04    1.7452702721E+04    1.6672203369E+04    1.5883103725E+04    1.5088705465E+04    1.4292271597E+04    1.3497005026E+04    1.2706030257E+04    1.1922375910E+04    1.1148958119E+04    1.0388564943E+04    9.6438418870E+03    8.9172786213E+03    8.2111969841E+03    7.5277403345E+03    6.868864 [...]
+    2.3985846829E+04    2.3469780670E+04    2.2914293742E+04    2.2322007519E+04    2.1695696301E+04    2.1038269546E+04    2.0352753432E+04    1.9642271813E+04    1.8910026677E+04    1.8159278284E+04    1.7393325095E+04    1.6615483673E+04    1.5829068670E+04    1.5037373063E+04    1.4243648773E+04    1.3451087804E+04    1.2662804033E+04    1.1881815772E+04    1.1111029235E+04    1.0353222995E+04    9.6110335576E+03    8.8869421219E+03    8.1832626271E+03    7.5021311410E+03    6.845496 [...]
+    2.3741601662E+04    2.3230790561E+04    2.2680960139E+04    2.2094705172E+04    2.1474771707E+04    2.0824039572E+04    2.0145504127E+04    1.9442257410E+04    1.8717468804E+04    1.7974365362E+04    1.7216211957E+04    1.6446291375E+04    1.5667884510E+04    1.4884250807E+04    1.4098609067E+04    1.3314118790E+04    1.2533862139E+04    1.1760826693E+04    1.0997889068E+04    1.0247799543E+04    9.5131677740E+03    8.7964496957E+03    8.0999356840E+03    7.4257400559E+03    6.775791 [...]
+    2.3339145249E+04    2.2836993202E+04    2.2296483320E+04    2.1720166389E+04    2.1110741903E+04    2.0471040864E+04    1.9804007854E+04    1.9112682489E+04    1.8400180419E+04    1.7669673989E+04    1.6924372720E+04    1.6167503744E+04    1.5402292335E+04    1.4631942677E+04    1.3859619005E+04    1.3088427253E+04    1.2321397337E+04    1.1561466186E+04    1.0811461650E+04    1.0074087385E+04    9.3519088091E+03    8.6473402233E+03    7.9626331786E+03    7.2998661517E+03    6.660935 [...]
+    2.2785290300E+04    2.2295054723E+04    2.1767371638E+04    2.1204731292E+04    2.0609769113E+04    1.9985248913E+04    1.9334045389E+04    1.8659126017E+04    1.7963532502E+04    1.7250361899E+04    1.6522747555E+04    1.5783840013E+04    1.5036788000E+04    1.4284719655E+04    1.3530724117E+04    1.2777833609E+04    1.2029006136E+04    1.1287108930E+04    1.0554902729E+04    9.8350270274E+03    9.1299863610E+03    8.4421377377E+03    7.7736792775E+03    7.1266401343E+03    6.502871 [...]
+    2.2089346815E+04    2.1614084814E+04    2.1102519168E+04    2.0557064059E+04    1.9980274407E+04    1.9374829602E+04    1.8743516525E+04    1.8089212007E+04    1.7414864837E+04    1.6723477463E+04    1.6018087520E+04    1.5301749310E+04    1.4577515379E+04    1.3848418310E+04    1.3117452882E+04    1.2387558694E+04    1.1661603397E+04    1.0942366641E+04    1.0232524838E+04    9.5346368576E+03    8.8511307374E+03    8.1842914923E+03    7.5362501041E+03    6.9089737506E+03    6.304257 [...]
+    2.1262902082E+04    2.0805421455E+04    2.0312995539E+04    1.9787948182E+04    1.9232738707E+04    1.8649946246E+04    1.8042253402E+04    1.7412429359E+04    1.6763312568E+04    1.6097793133E+04    1.5418795027E+04    1.4729258268E+04    1.4032121180E+04    1.3330302877E+04    1.2626686081E+04    1.1924100401E+04    1.1225306191E+04    1.0532979094E+04    9.8496953852E+03    9.1779181922E+03    8.5199847075E+03    7.8780944543E+03    7.2542986864E+03    6.6504909838E+03    6.068399 [...]
+    2.0319548672E+04    1.9882364767E+04    1.9411786076E+04    1.8910033338E+04    1.8379456754E+04    1.7822521016E+04    1.7241789697E+04    1.6639909110E+04    1.6019591761E+04    1.5383599516E+04    1.4734726607E+04    1.4075782601E+04    1.3409575447E+04    1.2738894736E+04    1.2066495283E+04    1.1395081147E+04    1.0727290206E+04    1.0065679390E+04    9.4127106648E+03    8.7707378756E+03    8.1419945192E+03    7.5285825329E+03    6.9324621647E+03    6.3554429854E+03    5.799176 [...]
+    1.9274568100E+04    1.8859867473E+04    1.8413489594E+04    1.7937540984E+04    1.7434250966E+04    1.6905957467E+04    1.6355092206E+04    1.5784165389E+04    1.5195750007E+04    1.4592465876E+04    1.3976963512E+04    1.3351907976E+04    1.2719962798E+04    1.2083774094E+04    1.1445954991E+04    1.0809070475E+04    1.0175622755E+04    9.5480372543E+03    8.9286493211E+03    8.3196917426E+03    7.7232831495E+03    7.1414173804E+03    6.5759538734E+03    6.0286091399E+03    5.500949 [...]
+    1.8144579000E+04    1.7754190648E+04    1.7333982292E+04    1.6885936943E+04    1.6412153215E+04    1.5914831957E+04    1.5396262310E+04    1.4858807299E+04    1.4304889054E+04    1.3736973785E+04    1.3157556600E+04    1.2569146302E+04    1.1974250254E+04    1.1375359423E+04    1.0774933727E+04    1.0175387764E+04    9.5790770367E+03    8.9882847670E+03    8.4052093831E+03    7.8319527675E+03    7.2705093406E+03    6.7227560490E+03    6.1904433196E+03    5.6751870342E+03    5.178461 [...]
+    1.6947159597E+04    1.6582534313E+04    1.6190057092E+04    1.5771580068E+04    1.5329063345E+04    1.4864562515E+04    1.4380215634E+04    1.3878229765E+04    1.3360867175E+04    1.2830431302E+04    1.2289252575E+04    1.1739674216E+04    1.1184038099E+04    1.0624670790E+04    1.0063869852E+04    9.5038905229E+03    8.9469328460E+03    8.3951293559E+03    7.8505333913E+03    7.3151081187E+03    6.7907163365E+03    6.2791111236E+03    5.7819273912E+03    5.3006743863E+03    4.836729 [...]
+    1.5700454870E+04    1.5362653045E+04    1.4999048348E+04    1.4611356646E+04    1.4201393835E+04    1.3771064271E+04    1.3322348708E+04    1.2857291829E+04    1.2377989460E+04    1.1886575567E+04    1.1385209124E+04    1.0876060956E+04    1.0361300641E+04    9.8430835745E+03    9.3235382864E+03    8.8047540941E+03    8.2887691847E+03    7.7775592035E+03    7.2730264286E+03    6.7769896014E+03    6.2911744809E+03    5.8172051804E+03    5.3565963407E+03    4.9107461848E+03    4.480930 [...]
+    1.4422779057E+04    1.4112467045E+04    1.3778452116E+04    1.3422310489E+04    1.3045710270E+04    1.2650400823E+04    1.2238201694E+04    1.1810991153E+04    1.1370694449E+04    1.0919271872E+04    1.0458706680E+04    9.9909930213E+03    9.5181238969E+03    9.0420792829E+03    8.5648144762E+03    8.0882487542E+03    7.6142544270E+03    7.1446463543E+03    6.6811720012E+03    6.2255020968E+03    5.7792219566E+03    5.3438235248E+03    4.9206981840E+03    4.5111303751E+03    4.116292 [...]
+    1.3132224174E+04    1.2849679068E+04    1.2545552155E+04    1.2221278600E+04    1.1878377229E+04    1.1518440855E+04    1.1143126191E+04    1.0754143418E+04    1.0353245493E+04    9.9422172762E+03    9.5228645437E+03    9.0970029846E+03    8.6664472471E+03    8.2330001197E+03    7.7984419217E+03    7.3645201778E+03    6.9329396496E+03    6.5053527917E+03    6.0833506964E+03    5.6684545889E+03    5.2621079262E+03    4.8656691510E+03    4.4804051453E+03    4.1074854210E+03    3.747977 [...]
+    1.1846284799E+04    1.1591407286E+04    1.1317061477E+04    1.1024541988E+04    1.0715218900E+04    1.0390529037E+04    1.0051966861E+04    9.7010750687E+03    9.3394349426E+03    8.9686565423E+03    8.5903687974E+03    8.2062095796E+03    7.8178158223E+03    7.4268137621E+03    7.0348093678E+03    6.6433790269E+03    6.2540605532E+03    5.8683445775E+03    5.4876663798E+03    5.1133982165E+03    4.7468421936E+03    4.3892237305E+03    4.0416856536E+03    3.7052829567E+03    3.380978 [...]
+    1.0581508746E+04    1.0353843480E+04    1.0108788630E+04    9.8475005766E+03    9.5712031083E+03    9.2811796259E+03    8.9787650156E+03    8.6653372455E+03    8.3423087507E+03    8.0111176703E+03    7.6732189991E+03    7.3300757194E+03    6.9831499768E+03    6.6338943629E+03    6.2837433672E+03    5.9341050577E+03    5.5863530492E+03    5.2418188133E+03    4.9017843824E+03    4.5674754966E+03    4.2400552379E+03    3.9206181913E+03    3.6101851699E+03    3.3096985334E+03    3.020018 [...]
+    9.3531822922E+03    9.1519450329E+03    8.9353369800E+03    8.7043802637E+03    8.4601565951E+03    8.2038003771E+03    7.9364915195E+03    7.6594480120E+03    7.3739183102E+03    7.0811735892E+03    6.7824999236E+03    6.4791904486E+03    6.1725375610E+03    5.8638252136E+03    5.5543213599E+03    5.2452706012E+03    4.9378870864E+03    4.6333477158E+03    4.3327856917E+03    4.0372844611E+03    3.7478720889E+03    3.4655160968E+03    3.1911188004E+03    2.9255131716E+03    2.669459 [...]
+    8.1750574179E+03    7.9991680467E+03    7.8098441462E+03    7.6079790849E+03    7.3945183055E+03    7.1704533040E+03    6.9368153498E+03    6.6946689949E+03    6.4451054189E+03    6.1892356592E+03    5.9281837760E+03    5.6630800013E+03    5.3950539226E+03    5.1252277482E+03    4.8547097041E+03    4.5845876065E+03    4.3159226580E+03    4.0497435057E+03    3.7870406056E+03    3.5287609280E+03    3.2758030391E+03    3.0290125908E+03    2.7891782441E+03    2.5570280537E+03    2.333226 [...]
+    7.0591271429E+03    6.9072475053E+03    6.7437673662E+03    6.5694581316E+03    6.3851361717E+03    6.1916576215E+03    5.9899129591E+03    5.7808214012E+03    5.5653251565E+03    5.3443835809E+03    5.1189672753E+03    4.8900521709E+03    4.6586136428E+03    4.4256206956E+03    4.1920302615E+03    3.9587816510E+03    3.7267911953E+03    3.4969471165E+03    3.2701046611E+03    3.0470815281E+03    2.8286536221E+03    2.6155511587E+03    2.4084551450E+03    2.2079942562E+03    2.014742 [...]
+    6.0154534611E+03    5.8860289142E+03    5.7467191207E+03    5.5981814231E+03    5.4411114779E+03    5.2762388263E+03    5.1043222734E+03    4.9261451133E+03    4.7425102323E+03    4.5542351285E+03    4.3621468826E+03    4.1670771181E+03    3.9698569853E+03    3.7713122073E+03    3.5722582208E+03    3.3734954479E+03    3.1758047306E+03    2.9799429601E+03    2.7866389289E+03    2.5965894359E+03    2.4104556672E+03    2.2288598769E+03    2.0523823885E+03    1.8815589326E+03    1.716878 [...]
+    5.0520507368E+03    4.9433542057E+03    4.8263557394E+03    4.7016073910E+03    4.5696933902E+03    4.4312264226E+03    4.2868437503E+03    4.1372032011E+03    3.9829790569E+03    3.8248578711E+03    3.6635342452E+03    3.4997065963E+03    3.3340729450E+03    3.1673267550E+03    3.0001528524E+03    2.8332234549E+03    2.6671943378E+03    2.5027011631E+03    2.3403559969E+03    2.1807440373E+03    2.0244205755E+03    1.8719082082E+03    1.7236943186E+03    1.5802288414E+03    1.441922 [...]
+    4.1748257151E+03    4.0850030395E+03    3.9883200898E+03    3.8852330505E+03    3.7762246933E+03    3.6618013036E+03    3.5424894748E+03    3.4188327942E+03    3.2913884456E+03    3.1607237536E+03    3.0274126933E+03    2.8920323935E+03    2.7551596564E+03    2.6173675190E+03    2.4792218823E+03    2.3412782296E+03    2.2040784584E+03    2.0681478474E+03    1.9339921784E+03    1.8020950324E+03    1.6729152789E+03    1.5468847717E+03    1.4244062676E+03    1.3058515793E+03    1.191559 [...]
+    3.3875736002E+03    3.3146889651E+03    3.2362378321E+03    3.1525903510E+03    3.0641382439E+03    2.9712923113E+03    2.8744798310E+03    2.7741418695E+03    2.6707305255E+03    2.5647061258E+03    2.4565343941E+03    2.3466836134E+03    2.2356218025E+03    2.1238139260E+03    2.0117191592E+03    1.8997882260E+03    1.7884608277E+03    1.6781631825E+03    1.5693056900E+03    1.4622807378E+03    1.3574606633E+03    1.2551958849E+03    1.1558132126E+03    1.0596143495E+03    9.668745 [...]
+    2.6920280260E+03    2.6341083179E+03    2.5717651559E+03    2.5052926791E+03    2.4350021686E+03    2.3612200649E+03    2.2842859021E+03    2.2045501710E+03    2.1223721289E+03    2.0381175719E+03    1.9521565848E+03    1.8648612871E+03    1.7766035885E+03    1.6877529728E+03    1.5986743245E+03    1.5097258129E+03    1.4212568498E+03    1.3336061337E+03    1.2470997945E+03    1.1620496497E+03    1.0787515857E+03    9.9748407173E+02    9.1850681823E+02    8.4205958506E+02    7.683611 [...]
+    2.0879612226E+03    2.0430382302E+03    1.9946844726E+03    1.9431280776E+03    1.8886104665E+03    1.8313848177E+03    1.7717144638E+03    1.7098712350E+03    1.6461337608E+03    1.5807857418E+03    1.5141142053E+03    1.4464077568E+03    1.3779548402E+03    1.3090420186E+03    1.2399522886E+03    1.1709634401E+03    1.1023464719E+03    1.0343640749E+03    9.6726919336E+02    9.0130367249E+02    8.3669700273E+02    7.7366516755E+02    7.1240960233E+02    6.5311627031E+02    5.959548 [...]
+    1.5733293271E+03    1.5394788150E+03    1.5030432339E+03    1.4641944748E+03    1.4231144447E+03    1.3799939088E+03    1.3350312826E+03    1.2884313847E+03    1.2404041564E+03    1.1911633600E+03    1.1409252650E+03    1.0899073306E+03    1.0383268944E+03    9.8639987772E+02    9.3433951578E+02    8.8235512122E+02    8.3065089082E+02    7.7942476269E+02    7.2886733193E+02    6.7916083194E+02    6.3047818800E+02    5.8298214911E+02    5.3682450346E+02    4.9214538200E+02    4.490726 [...]
+    1.1444566287E+03    1.1198334480E+03    1.0933299456E+03    1.0650711493E+03    1.0351893712E+03    1.0038233661E+03    9.7111745309E+02    9.3722060823E+02    9.0228553362E+02    8.6646771090E+02    8.2992444542E+02    7.9281390822E+02    7.5529418264E+02    7.1752232254E+02    6.7965342862E+02    6.4183974946E+02    6.0422981348E+02    5.6696759775E+02    5.3019173933E+02    4.9403479430E+02    4.5862254932E+02    4.2407339014E+02    3.9049773085E+02    3.5799750724E+02    3.266657 [...]
+    7.9625161844E+02    7.7912016791E+02    7.6068056550E+02    7.4101979194E+02    7.2022989511E+02    6.9840740438E+02    6.7565271991E+02    6.5206948131E+02    6.2776392037E+02    6.0284420269E+02    5.7741976280E+02    5.5160063786E+02    5.2549680455E+02    4.9921752394E+02    4.7287069903E+02    4.4656224945E+02    4.2039550760E+02    3.9447064046E+02    3.6888410097E+02    3.4372811249E+02    3.1909018986E+02    2.9505270003E+02    2.7169246491E+02    2.4908040881E+02    2.272812 [...]
+    5.2244704597E+02    5.1120656862E+02    4.9910783497E+02    4.8620790998E+02    4.7256718238E+02    4.5824898063E+02    4.4331917235E+02    4.2784575023E+02    4.1189840757E+02    3.9554810640E+02    3.7886664152E+02    3.6192620338E+02    3.4479894321E+02    3.2755654334E+02    3.1026979573E+02    2.9300819187E+02    2.7583952664E+02    2.5882951902E+02    2.4204145215E+02    2.2553583517E+02    2.0937008891E+02    1.9359825763E+02    1.7827074834E+02    1.6343409949E+02    1.491307 [...]
+    3.1585579244E+02    3.0906016691E+02    3.0174572137E+02    2.9394695042E+02    2.8570035733E+02    2.7704422198E+02    2.6801835882E+02    2.5866386671E+02    2.4902287242E+02    2.3913826975E+02    2.2905345601E+02    2.1881206805E+02    2.0845771934E+02    1.9803374045E+02    1.8758292428E+02    1.7714727827E+02    1.6676778499E+02    1.5648417289E+02    1.4633469872E+02    1.3635594315E+02    1.2658262074E+02    1.1704740561E+02    1.0778077389E+02    9.8810863750E+01    9.016335 [...]
+    1.6863425104E+02    1.6500611603E+02    1.6110103157E+02    1.5693740989E+02    1.5253473496E+02    1.4791343870E+02    1.4309477191E+02    1.3810067082E+02    1.3295362029E+02    1.2767651465E+02    1.2229251717E+02    1.1682491918E+02    1.1129699995E+02    1.0573188811E+02    1.0015242581E+02    9.4581036484E+01    8.9039597120E+01    8.3549315897E+01    7.8130616089E+01    7.2803026931E+01    6.7585082192E+01    6.2494227092E+01    5.7546734120E+01    5.2757628280E+01    4.814062 [...]
+    7.2545057953E+01    7.0984283865E+01    6.9304405511E+01    6.7513340226E+01    6.5619465856E+01    6.3631567594E+01    6.1558782550E+01    5.9410542458E+01    5.7196514931E+01    5.4926543702E+01    5.2610588281E+01    5.0258663462E+01    4.7880779116E+01    4.5486880695E+01    4.3086790865E+01    4.0690152687E+01    3.8306374724E+01    3.5944578456E+01    3.3613548360E+01    3.1321684983E+01    2.9076961304E+01    2.6886882681E+01    2.4758450607E+01    2.2698130510E+01    2.071182 [...]
+    1.9211426911E+01    1.8798115356E+01    1.8353288347E+01    1.7879040147E+01    1.7377586585E+01    1.6851251041E+01    1.6302449844E+01    1.5733677172E+01    1.5147489572E+01    1.4546490213E+01    1.3933312983E+01    1.3310606540E+01    1.2681018442E+01    1.2047179451E+01    1.1411688136E+01    1.0777095875E+01    1.0145892360E+01    9.5204917024E+00    8.9032192325E+00    8.2962990856E+00    7.7018426461E+00    7.1218379290E+00    6.5581399628E+00    6.0124622306E+00    5.486369 [...]
+    3.5598419674E-01    3.4832881883E-01    3.4009555521E-01    3.3132264210E-01    3.2205047618E-01    3.1232137091E-01    3.0217930297E-01    2.9166965042E-01    2.8083892430E-01    2.6973449523E-01    2.5840431689E-01    2.4689664813E-01    2.3525977533E-01    2.2354173691E-01    2.1179005166E-01    2.0005145265E-01    1.8837162840E-01    1.7679497283E-01    1.6536434585E-01    1.5412084584E-01    1.4310359562E-01    1.3234954318E-01    1.2189327863E-01    1.1176686823E-01    1.019997 [...]
+    8.0178493098E+00    7.8453260100E+00    7.6595955729E+00    7.4615371229E+00    7.2520813451E+00    7.0322044951E+00    6.8029221484E+00    6.5652827382E+00    6.3203609298E+00    6.0692508823E+00    5.8130594478E+00    5.5528993591E+00    5.2898824554E+00    5.0251129969E+00    4.7596811160E+00    4.4946564521E+00    4.2310820153E+00    3.9699683218E+00    3.7122878405E+00    3.4589697890E+00    3.2108953114E+00    2.9688930706E+00    2.7337352796E+00    2.5061341956E+00    2.286739 [...]
+    3.4742723270E+01    3.3995190588E+01    3.3190506001E+01    3.2332471716E+01    3.1425112209E+01    3.0472648459E+01    2.9479471087E+01    2.8450112573E+01    2.7389218781E+01    2.6301519991E+01    2.5191801660E+01    2.4064875120E+01    2.2925548435E+01    2.1778597622E+01    2.0628738446E+01    1.9480598983E+01    1.8338693158E+01    1.7207395420E+01    1.6090916746E+01    1.4993282121E+01    1.3918309644E+01    1.2869591396E+01    1.1850476181E+01    1.0864054247E+01    9.913144 [...]
+    7.3741890896E+01    7.2155269394E+01    7.0447392569E+01    6.8626325982E+01    6.6700606215E+01    6.4679186322E+01    6.2571378939E+01    6.0386797474E+01    5.8135295804E+01    5.5826906946E+01    5.3471781134E+01    5.1080123776E+01    4.8662133721E+01    4.6227942304E+01    4.3787553586E+01    4.1350786220E+01    3.8927217356E+01    3.6526128955E+01    3.4156456896E+01    3.1826743197E+01    2.9545091675E+01    2.7319127315E+01    2.5155959604E+01    2.3062150041E+01    2.104368 [...]
+    1.1901727146E+02    1.1645653259E+02    1.1370013328E+02    1.1076108724E+02    1.0765316777E+02    1.0439081989E+02    1.0098906856E+02    9.7463423899E+01    9.3829784005E+01    9.0104336052E+01    8.6303456487E+01    8.2443610997E+01    7.8541254990E+01    7.4612735305E+01    7.0674193855E+01    6.6741473879E+01    6.2830029466E+01    5.8954838963E+01    5.5130322864E+01    5.1370266722E+01    4.7687749584E+01    4.4095078406E+01    4.0603728845E+01    3.7224292773E+01    3.396643 [...]
+    1.6545091850E+02    1.6189114790E+02    1.5805942000E+02    1.5397382221E+02    1.4965349737E+02    1.4511852164E+02    1.4038977705E+02    1.3548881985E+02    1.3043774547E+02    1.2525905116E+02    1.1997549737E+02    1.1460996876E+02    1.0918533595E+02    1.0372431900E+02    9.8249353478E+01    9.2782460266E+01    8.7345119807E+01    8.1958151788E+01    7.6641601023E+01    7.1414630309E+01    6.6295420945E+01    6.1301081554E+01    5.6447565755E+01    5.1749599166E+01    4.722061 [...]
+    2.0885862926E+02    2.0436493660E+02    1.9952797301E+02    1.9437056799E+02    1.8891688292E+02    1.8319225692E+02    1.7722304614E+02    1.7103645760E+02    1.6466037882E+02    1.5812320454E+02    1.5145366179E+02    1.4468063453E+02    1.3783298926E+02    1.3093940267E+02    1.2402819272E+02    1.1712715433E+02    1.1026340066E+02    1.0346321131E+02    9.6751888253E+01    9.0153620636E+01    8.3691359193E+01    7.7386701139E+01    7.1259786229E+01    6.5329204589E+01    5.961191 [...]
+    2.4600853367E+02    2.4071556263E+02    2.3501829972E+02    2.2894363190E+02    2.2252001443E+02    2.1577728945E+02    2.0874649674E+02    2.0145967804E+02    1.9394967654E+02    1.8624993282E+02    1.7839427888E+02    1.7041673171E+02    1.6235128790E+02    1.5423172078E+02    1.4609138147E+02    1.3796300540E+02    1.2987852545E+02    1.2186889315E+02    1.1396390906E+02    1.0619206349E+02    9.8580388637E+01    9.1154322978E+01    8.3937588840E+01    7.6952083810E+01    7.021778 [...]
+    2.7460665210E+02    2.6869840113E+02    2.6233889784E+02    2.5555815148E+02    2.4838792148E+02    2.4086151499E+02    2.3301357575E+02    2.2487986574E+02    2.1649704139E+02    2.0790242594E+02    1.9913377960E+02    1.9022906914E+02    1.8122623879E+02    1.7216298376E+02    1.6307652836E+02    1.5400340997E+02    1.4497927056E+02    1.3603865712E+02    1.2721483240E+02    1.1853959711E+02    1.1004312486E+02    1.0175381083E+02    9.3698135077E+01    8.5900541335E+01    7.838333 [...]
+    2.9325240552E+02    2.8694300582E+02    2.8015175322E+02    2.7291069121E+02    2.6525373188E+02    2.5721643981E+02    2.4883580656E+02    2.4015001772E+02    2.3119821390E+02    2.2202024775E+02    2.1265643856E+02    2.0314732634E+02    1.9353342715E+02    1.8385499143E+02    1.7415176699E+02    1.6446276844E+02    1.5482605461E+02    1.4527851545E+02    1.3585566995E+02    1.2659147629E+02    1.1751815564E+02    1.0866603049E+02    1.0006337873E+02    9.1736304144E+01    8.370862 [...]
+    3.0136790039E+02    2.9488391548E+02    2.8790478416E+02    2.8046343319E+02    2.7259470925E+02    2.6433515682E+02    2.5572278665E+02    2.4679683625E+02    2.3759752453E+02    2.2816580203E+02    2.1854309887E+02    2.0877107210E+02    1.9889135431E+02    1.8894530534E+02    1.7897376878E+02    1.6901683511E+02    1.5911361296E+02    1.4930201018E+02    1.3961852620E+02    1.3009805697E+02    1.2077371386E+02    1.1167665760E+02    1.0283594824E+02    9.4278412138E+01    8.602852 [...]
+    2.9910547257E+02    2.9267018708E+02    2.8574351589E+02    2.7835813495E+02    2.7054862522E+02    2.6235125244E+02    2.5380373724E+02    2.4494501764E+02    2.3581500550E+02    2.2645433878E+02    2.1690413142E+02    2.0720572267E+02    1.9740042765E+02    1.8752929101E+02    1.7763284532E+02    1.6775087602E+02    1.5792219446E+02    1.4818442070E+02    1.3857377742E+02    1.2912489638E+02    1.1987063868E+02    1.1084192999E+02    1.0206761161E+02    9.3574308472E+01    8.538631 [...]
+    2.8723844271E+02    2.8105850170E+02    2.7440671665E+02    2.6731446327E+02    2.5981494628E+02    2.5194298793E+02    2.4373480739E+02    2.3522779265E+02    2.2646026678E+02    2.1747125005E+02    2.0830021984E+02    1.9898686996E+02    1.8957087122E+02    1.8009163489E+02    1.7058808076E+02    1.6109841150E+02    1.5165989471E+02    1.4230865442E+02    1.3307947321E+02    1.2400560638E+02    1.1511860937E+02    1.0644817951E+02    9.8022013091E+01    8.9865678498E+01    8.200250 [...]
+    2.6704030317E+02    2.6129495085E+02    2.5511098200E+02    2.4851756205E+02    2.4154555641E+02    2.3422733387E+02    2.2659656162E+02    2.1868799325E+02    2.1053725151E+02    2.0218060725E+02    1.9365475629E+02    1.8499659571E+02    1.7624300139E+02    1.6743060809E+02    1.5859559397E+02    1.4977347082E+02    1.4099888152E+02    1.3230540626E+02    1.2372537857E+02    1.1528971265E+02    1.0702774291E+02    9.8967076927E+01    9.1133462478E+01    8.3550669700E+01    7.624038 [...]
+    2.4015762272E+02    2.3499067571E+02    2.2942931759E+02    2.2349977360E+02    2.1722979738E+02    2.1064849422E+02    2.0378613676E+02    1.9667397446E+02    1.8934403828E+02    1.8182894192E+02    1.7416168129E+02    1.6637543338E+02    1.5850335620E+02    1.5057839119E+02    1.4263306941E+02    1.3469932297E+02    1.2680830297E+02    1.1899020523E+02    1.1127410494E+02    1.0368780134E+02    9.6257673543E+01    8.9008548194E+01    8.1963580014E+01    7.5144145767E+01    6.856975 [...]
+    2.0848182755E+02    2.0399640683E+02    1.9916864837E+02    1.9402131416E+02    1.8857849250E+02    1.8286544469E+02    1.7690844509E+02    1.7073461580E+02    1.6437175714E+02    1.5784817529E+02    1.5119250815E+02    1.4443355089E+02    1.3760008239E+02    1.3072069368E+02    1.2382361987E+02    1.1693657642E+02    1.1008660124E+02    1.0329990340E+02    9.6601719643E+01    9.0016179627E+01    8.3566180743E+01    7.7273273304E+01    7.1157556832E+01    6.5237588021E+01    5.953030 [...]
+    1.7402470930E+02    1.7028065073E+02    1.6625088840E+02    1.6195441787E+02    1.5741134138E+02    1.5264273990E+02    1.4767053969E+02    1.4251737439E+02    1.3720644360E+02    1.3176136906E+02    1.2620604941E+02    1.2056451464E+02    1.1486078124E+02    1.0911870915E+02    1.0336186146E+02    9.7613367902E+01    9.1895792990E+01    8.6231009872E+01    8.0640080589E+01    7.5143143622E+01    6.9759309434E+01    6.4506564666E+01    5.9401685576E+01    5.4460161233E+01    4.969612 [...]
+    1.3880204328E+02    1.3581581217E+02    1.3260175835E+02    1.2917502824E+02    1.2555165048E+02    1.2174843392E+02    1.1778286132E+02    1.1367297935E+02    1.0943728596E+02    1.0509461567E+02    1.0066402385E+02    9.6164670697E+01    9.1615705770E+01    8.7036153981E+01    8.2444803756E+01    7.7860098206E+01    7.3300030055E+01    6.8782041047E+01    6.4322926502E+01    5.9938745662E+01    5.5644738417E+01    5.1455248908E+01    4.7383656519E+01    4.3442314616E+01    3.964249 [...]
+    1.0472909773E+02    1.0247595148E+02    1.0005096285E+02    9.7465555704E+01    9.4731819073E+01    9.1862430284E+01    8.8870574799E+01    8.5769863340E+01    8.2574246924E+01    7.9297930440E+01    7.5955285382E+01    7.2560762395E+01    6.9128804242E+01    6.5673759839E+01    6.2209799944E+01    5.8750835113E+01    5.5310436478E+01    5.1901759908E+01    4.8537474036E+01    4.5229692667E+01    4.1989911969E+01    3.8828952868E+01    3.5756908993E+01    3.2783100469E+01    2.991603 [...]
+    7.3531106695E+01    7.1949183706E+01    7.0246662924E+01    6.8431560736E+01    6.6512360096E+01    6.4497956617E+01    6.2397602354E+01    6.0220847692E+01    5.7977481768E+01    5.5677471865E+01    5.3330902224E+01    5.0947912710E+01    4.8538637788E+01    4.6113146230E+01    4.3681381994E+01    4.1253106683E+01    3.8837843987E+01    3.6444826482E+01    3.4082945153E+01    3.1760701977E+01    2.9486165862E+01    2.7266932226E+01    2.5110086473E+01    2.3022171559E+01    2.100915 [...]
+    4.6670997728E+01    4.5666961313E+01    4.4586432399E+01    4.3434494839E+01    4.2216528179E+01    4.0938173509E+01    3.9605297846E+01    3.8223957322E+01    3.6800359441E+01    3.5340824683E+01    3.3851747744E+01    3.2339558674E+01    3.0810684222E+01    2.9271509632E+01    2.7728341188E+01    2.6187369751E+01    2.4654635555E+01    2.3135994494E+01    2.1637086129E+01    2.0163303635E+01    1.8719765866E+01    1.7311291732E+01    1.5942377029E+01    1.4617173876E+01    1.333947 [...]
+    2.5295843267E+01    2.4751677584E+01    2.4166101397E+01    2.3541866225E+01    2.2881883445E+01    2.2189205844E+01    2.1467008372E+01    2.0718568260E+01    1.9947244625E+01    1.9156457733E+01    1.8349668051E+01    1.7530355260E+01    1.6701997364E+01    1.5868050048E+01    1.5031926441E+01    1.4196977412E+01    1.3366472536E+01    1.2543581881E+01    1.1731358704E+01    1.0932723203E+01    1.0150447409E+01    9.3871413217E+00    8.6452403746E+00    7.9269942959E+00    7.234457 [...]
+    1.0202674819E+01    9.9832163426E+00    9.7470976639E+00    9.4954251579E+00    9.2293693236E+00    8.9501573931E+00    8.6590656249E+00    8.3574113379E+00    8.0465447449E+00    7.7278406453E+00    7.4026900363E+00    7.0724917047E+00    6.7386438581E+00    6.4025358561E+00    6.0655400986E+00    5.7290041291E+00    5.3942430065E+00    5.0625319975E+00    4.7350996391E+00    4.4131212164E+00    4.0977126972E+00    3.7899251632E+00    3.4907397696E+00    3.2010632636E+00    2.921724 [...]
+    1.8234945617E+00    1.7842859893E+00    1.7421276266E+00    1.6972149602E+00    1.6497547051E+00    1.5999635175E+00    1.5480666525E+00    1.4942965775E+00    1.4388915501E+00    1.3820941715E+00    1.3241499261E+00    1.2653057168E+00    1.2058084066E+00    1.1459033773E+00    1.0858331145E+00    1.0258358293E+00    9.6614412546E-01    9.0698372165E-01    8.4857223645E-01    7.9111804469E-01    7.3481921208E-01    6.7986251464E-01    6.2642254904E-01    5.7466093889E-01    5.247256 [...]
+    2.2856852067E-01    2.2364178914E-01    2.1832229442E-01    2.1263640719E-01    2.0661209991E-01    2.0027875732E-01    1.9366697846E-01    1.8680837189E-01    1.7973534569E-01    1.7248089386E-01    1.6507838083E-01    1.5756132579E-01    1.4996318837E-01    1.4231715742E-01    1.3465594448E-01    1.2701158341E-01    1.1941523778E-01    1.1189701728E-01    1.0448580465E-01    9.7209094172E-02    9.0092842978E-02    8.3161336056E-02    7.6437065916E-02    6.9940627602E-02    6.369062 [...]
+    5.1464158466E+00    5.0356450243E+00    4.9163333565E+00    4.7890500269E+00    4.6543977145E+00    4.5130086984E+00    4.3655407957E+00    4.2126731605E+00    4.0551019777E+00    3.8935360818E+00    3.7286925349E+00    3.5612921958E+00    3.3920553124E+00    3.2216971706E+00    3.0509238299E+00    2.8804279771E+00    2.7108849266E+00    2.5429487956E+00    2.3772488811E+00    2.2143862609E+00    2.0549306441E+00    1.8994174888E+00    1.7483454057E+00    1.6021738636E+00    1.461321 [...]
+    1.5998341527E+01    1.5654052676E+01    1.5283322994E+01    1.4887912985E+01    1.4469686353E+01    1.4030598030E+01    1.3572681691E+01    1.3098036834E+01    1.2608815552E+01    1.2107209063E+01    1.1595434118E+01    1.1075719377E+01    1.0550291862E+01    1.0021363570E+01    9.4911183593E+00    8.9616991885E+00    8.4351958061E+00    7.9136329714E+00    7.3989592893E+00    6.8930367332E+00    6.3976309243E+00    5.9144022300E+00    5.4448977355E+00    4.9905441368E+00    4.552641 [...]
+    3.1944912071E+01    3.1257493120E+01    3.0517363121E+01    2.9728030489E+01    2.8893208990E+01    2.8016793940E+01    2.7102837376E+01    2.6155522390E+01    2.5179136814E+01    2.4178046452E+01    2.3156668057E+01    2.2119442248E+01    2.1070806568E+01    2.0015168877E+01    1.8956881266E+01    1.7900214682E+01    1.6849334437E+01    1.5808276782E+01    1.4780926679E+01    1.3770996959E+01    1.2782008959E+01    1.1817274797E+01    1.0879881373E+01    9.9726761986E+00    9.098255 [...]
+    5.1941456663E+01    5.0823773109E+01    4.9620456897E+01    4.8337206611E+01    4.6980054106E+01    4.5555325899E+01    4.4069602893E+01    4.2529678742E+01    4.0942517172E+01    3.9315208553E+01    3.7654926067E+01    3.5968881777E+01    3.4264282917E+01    3.2548288731E+01    3.0827968150E+01    2.9110258619E+01    2.7401926368E+01    2.5709528376E+01    2.4039376324E+01    2.2397502736E+01    2.0789629564E+01    1.9221139399E+01    1.7697049487E+01    1.6221988705E+01    1.480017 [...]
+    7.4799495720E+01    7.3189984623E+01    7.1457222848E+01    6.9609411369E+01    6.7655230532E+01    6.5603784536E+01    6.3464543519E+01    6.1247283697E+01    5.8962025981E+01    5.6618973542E+01    5.4228448781E+01    5.1800830156E+01    4.9346489332E+01    4.6875729109E+01    4.4398722560E+01    4.1925453823E+01    3.9465660953E+01    3.7028781229E+01    3.4623899285E+01    3.2259698423E+01    2.9944415402E+01    2.7685799021E+01    2.5491072724E+01    2.3366901459E+01    2.131936 [...]
+    9.9250954733E+01    9.7115337100E+01    9.4816239879E+01    9.2364539944E+01    8.9771749730E+01    8.7049943635E+01    8.4211681261E+01    8.1269928060E+01    7.8237973973E+01    7.5129350676E+01    7.1957748024E+01    6.8736930314E+01    6.5480652979E+01    6.2202580298E+01    5.8916204724E+01    5.5634768391E+01    5.2371187351E+01    4.9137979064E+01    4.5947193633E+01    4.2810349241E+01    3.9738372212E+01    3.6741542076E+01    3.3829441978E+01    3.1010914719E+01    2.829402 [...]
+    1.2401210838E+02    1.2134372572E+02    1.1847113461E+02    1.1540792092E+02    1.1216846418E+02    1.0876784569E+02    1.0522175265E+02    1.0154637910E+02    9.7758324371E+01    9.3874489702E+01    8.9911973971E+01    8.5887969129E+01    8.1819656183E+01    7.7724102455E+01    7.3618160857E+01    6.9518371880E+01    6.5440868995E+01    6.1401288109E+01    5.7414681693E+01    5.3495438160E+01    4.9657207004E+01    4.5912830193E+01    4.2274280224E+01    3.8752605211E+01    3.535788 [...]
+    1.4784440761E+02    1.4466324978E+02    1.4123869098E+02    1.3758692378E+02    1.3372508650E+02    1.2967115367E+02    1.2544382191E+02    1.2106239182E+02    1.1654664699E+02    1.1191673089E+02    1.0719302256E+02    1.0239601207E+02    9.7546176561E+01    9.2663857840E+01    8.7769142361E+01    8.2881744440E+01    7.8020893535E+01    7.3205226354E+01    6.8452684529E+01    6.3780418533E+01    5.9204698479E+01    5.4740832341E+01    5.0403092133E+01    4.6204648451E+01    4.215751 [...]
+    1.6960965629E+02    1.6596020215E+02    1.6203156188E+02    1.5784230803E+02    1.5341209766E+02    1.4876154685E+02    1.4391209975E+02    1.3888589320E+02    1.3370561799E+02    1.2839437767E+02    1.2297554603E+02    1.1747262429E+02    1.1190909896E+02    1.0630830145E+02    1.0069327050E+02    9.5086618211E+01    8.9510400803E+01    8.3985994886E+01    7.8533980115E+01    7.3174028997E+01    6.7924804586E+01    6.2803866695E+01    5.7827587219E+01    5.3011075051E+01    4.836811 [...]
+    1.8831740513E+02    1.8426544348E+02    1.7990354575E+02    1.7525232943E+02    1.7033361578E+02    1.6517029053E+02    1.5978615855E+02    1.5420579360E+02    1.4845438435E+02    1.4255757768E+02    1.3654132050E+02    1.3043170124E+02    1.2425479213E+02    1.1803649338E+02    1.1180238042E+02    1.0557755530E+02    9.9386503202E+01    9.3252955113E+01    8.7199757568E+01    8.1248750347E+01    7.5420652912E+01    6.9734960296E+01    6.4209849102E+01    5.8862094147E+01    5.370699 [...]
+    2.0316289864E+02    1.9879153278E+02    1.9408583833E+02    1.8906805480E+02    1.8376172003E+02    1.7819151994E+02    1.7238313179E+02    1.6636306217E+02    1.6015848092E+02    1.5379705214E+02    1.4730676360E+02    1.4071575581E+02    1.3405215186E+02    1.2734388946E+02    1.2061855614E+02    1.1390322898E+02    1.0722431989E+02    1.0060742744E+02    9.4077196438E+01    8.7657185988E+01    8.1369746987E+01    7.5235909843E+01    6.9275283073E+01    6.3505963385E+01    5.794445 [...]
+    2.1355442248E+02    2.0895948634E+02    2.0401315832E+02    1.9873881243E+02    1.9316118708E+02    1.8730622719E+02    1.8120091953E+02    1.7487312243E+02    1.6835139128E+02    1.6166480093E+02    1.5484276647E+02    1.4791486357E+02    1.4091064970E+02    1.3385948758E+02    1.2679037207E+02    1.1973176171E+02    1.1271141611E+02    1.0575624029E+02    9.8892137053E+01    9.2143868361E+01    8.5534926579E+01    7.9087416465E+01    7.2821948598E+01    6.6757544862E+01    6.091155 [...]
+    2.1912943037E+02    2.1441455769E+02    2.0933915393E+02    2.0392720048E+02    1.9820407848E+02    1.9219640684E+02    1.8593187326E+02    1.7943905963E+02    1.7274726298E+02    1.6588631329E+02    1.5888638967E+02    1.5177783602E+02    1.4459097768E+02    1.3735594028E+02    1.3010247218E+02    1.2285977162E+02    1.1565631995E+02    1.0851972192E+02    1.0147655421E+02    9.4552223251E+01    8.7770833091E+01    8.1155064352E+01    7.4726064871E+01    6.8503352726E+01    6.250473 [...]
+    2.1975935860E+02    2.1503094858E+02    2.0994100236E+02    2.0451356773E+02    1.9877409595E+02    1.9274927936E+02    1.8646688200E+02    1.7995556451E+02    1.7324470461E+02    1.6636421447E+02    1.5934435638E+02    1.5221555792E+02    1.4500822816E+02    1.3775257600E+02    1.3047843217E+02    1.2321507590E+02    1.1599106770E+02    1.0883408924E+02    1.0177079150E+02    9.4826652142E+01    8.8025843058E+01    8.1391108990E+01    7.4943657852E+01    6.8703063498E+01    6.268718 [...]
+    2.1554354006E+02    2.1090585393E+02    2.0591359591E+02    2.0059035010E+02    1.9496107691E+02    1.8905195378E+02    1.8289020915E+02    1.7650395070E+02    1.6992198932E+02    1.6317366011E+02    1.5628864150E+02    1.4929677412E+02    1.4222788051E+02    1.3511158700E+02    1.2797714915E+02    1.2085328182E+02    1.1376799515E+02    1.0674843756E+02    9.9820746821E+01    9.3009910202E+01    8.6339634591E+01    7.9832227418E+01    7.3508489120E+01    6.7387617762E+01    6.148712 [...]
+    2.0679308846E+02    2.0234369289E+02    1.9755414625E+02    1.9244707303E+02    1.8704641794E+02    1.8137729310E+02    1.7546581879E+02    1.6933895872E+02    1.6302435121E+02    1.5655013739E+02    1.4994478783E+02    1.4323692876E+02    1.3645516908E+02    1.2962792960E+02    1.2278327555E+02    1.1594875356E+02    1.0915123441E+02    1.0241676234E+02    9.5770412241E+01    8.9236155505E+01    8.2836735401E+01    7.6593552870E+01    7.0526563350E+01    6.4654185283E+01    5.899322 [...]
+    1.9400602008E+02    1.8983176583E+02    1.8533841772E+02    1.8054719929E+02    1.7548057241E+02    1.7016209405E+02    1.6461626681E+02    1.5886838445E+02    1.5294437355E+02    1.4687063239E+02    1.4067386830E+02    1.3438093467E+02    1.2801866871E+02    1.2161373129E+02    1.1519244978E+02    1.0878066525E+02    1.0240358483E+02    9.6085640502E+01    8.9850355053E+01    8.3720216256E+01    7.7716559989E+01    7.1859463085E+01    6.6167646545E+01    6.0658389707E+01    5.534745 [...]
+    1.7783520090E+02    1.7400889118E+02    1.6989010659E+02    1.6549829985E+02    1.6085405858E+02    1.5597897405E+02    1.5089550420E+02    1.4562683210E+02    1.4019672080E+02    1.3462936570E+02    1.2894924551E+02    1.2318097281E+02    1.1734914546E+02    1.1147819976E+02    1.0559226643E+02    9.9715030576E+01    9.3869596401E+01    8.8078357751E+01    8.2362875300E+01    7.6743761210E+01    7.1240572013E+01    6.5871710399E+01    6.0654336507E+01    5.5604289243E+01    5.073601 [...]
+    1.5905094195E+02    1.5562880558E+02    1.5194510757E+02    1.4801724424E+02    1.4386362679E+02    1.3950356386E+02    1.3495713911E+02    1.3024508464E+02    1.2538865119E+02    1.2040947617E+02    1.1532945034E+02    1.1017058427E+02    1.0495487539E+02    9.9704176711E+01    9.4440068105E+01    8.9183731007E+01    8.3955827490E+01    7.8776384486E+01    7.3664683967E+01    6.8639159799E+01    6.3717301958E+01    5.8915568689E+01    5.4249307180E+01    4.9732683188E+01    4.537862 [...]
+    1.3850020859E+02    1.3552025081E+02    1.3231254546E+02    1.2889223960E+02    1.2527536387E+02    1.2147873028E+02    1.1751982557E+02    1.1341670106E+02    1.0918785965E+02    1.0485214089E+02    1.0042860498E+02    9.5936416440E+01    9.1394728437E+01    8.6822568455E+01    8.2238726231E+01    7.7661644685E+01    7.3109314636E+01    6.8599173998E+01    6.4148012171E+01    5.9771880234E+01    5.5486007544E+01    5.1304725260E+01    4.7241397260E+01    4.3308358869E+01    3.951686 [...]
+    1.1706445897E+02    1.1454571943E+02    1.1183449731E+02    1.0894359403E+02    1.0588655762E+02    1.0267759643E+02    9.9331489020E+01    9.5863491059E+01    9.2289239849E+01    8.8624657222E+01    8.4885851495E+01    8.1089019205E+01    7.7250347329E+01    7.3385916699E+01    6.9511607297E+01    6.5643006088E+01    6.1795318048E+01    5.7983280983E+01    5.4221084728E+01    5.0522295254E+01    4.6899784184E+01    4.3365664156E+01    3.9931230441E+01    3.6606909150E+01    3.340221 [...]
+    9.5618085502E+01    9.3560790377E+01    9.1346290601E+01    8.8985041100E+01    8.6488106524E+01    8.3867090729E+01    8.1134063227E+01    7.8301483151E+01    7.5382121311E+01    7.2388980894E+01    6.9335217409E+01    6.6234058447E+01    6.3098723842E+01    5.9942346800E+01    5.6777896566E+01    5.3618103165E+01    5.0475384741E+01    4.7361778004E+01    4.4288872238E+01    4.1267747329E+01    3.8308916199E+01    3.5422272014E+01    3.2617040503E+01    2.9901737653E+01    2.728413 [...]
+    7.4989306659E+01    7.3375862277E+01    7.1639142181E+01    6.9787344618E+01    6.7829145888E+01    6.5773645056E+01    6.3630306294E+01    6.1408899272E+01    5.9119438048E+01    5.6772118904E+01    5.4377257585E+01    5.1945226388E+01    4.9486391576E+01    4.7011051537E+01    4.4529376158E+01    4.2051347820E+01    3.9586704429E+01    3.7144884881E+01    3.4734977323E+01    3.2365670555E+01    3.0045208894E+01    2.7781350776E+01    2.5581331365E+01    2.3451829368E+01    2.139893 [...]
+    5.5925154541E+01    5.4721894275E+01    5.3426710078E+01    5.2045714991E+01    5.0585378456E+01    4.9052485107E+01    4.7454091780E+01    4.5797483085E+01    4.4090125853E+01    4.2339622793E+01    4.0553665705E+01    3.8739988593E+01    3.6906320997E+01    3.5060341905E+01    3.3209634545E+01    3.1361642407E+01    2.9523626766E+01    2.7702626025E+01    2.5905417140E+01    2.4138479387E+01    2.2407960704E+01    2.0719646823E+01    1.9078933387E+01    1.7490801198E+01    1.595979 [...]
+    3.9061938654E+01    3.8221505328E+01    3.7316876789E+01    3.6352321901E+01    3.5332358358E+01    3.4261723913E+01    3.3145346371E+01    3.1988312577E+01    3.0795836614E+01    2.9573227454E+01    2.8325856304E+01    2.7059123864E+01    2.5778427758E+01    2.4489130355E+01    2.3196527213E+01    2.1905816372E+01    2.0622068700E+01    1.9350199508E+01    1.8094941615E+01    1.6860820046E+01    1.5652128532E+01    1.4472907952E+01    1.3326926856E+01    1.2217664180E+01    1.114829 [...]
+    2.4902252847E+01    2.4366475830E+01    2.3789783394E+01    2.3174896173E+01    2.2524693334E+01    2.1842194255E+01    2.1130539409E+01    2.0392970610E+01    1.9632810753E+01    1.8853443215E+01    1.8058291046E+01    1.7250796121E+01    1.6434398386E+01    1.5612515366E+01    1.4788522054E+01    1.3965731355E+01    1.3147375188E+01    1.2336586405E+01    1.1536381623E+01    1.0749645107E+01    9.9791137856E+00    9.2273635158E+00    8.4967966655E+00    7.7896310940E+00    7.107890 [...]
+    1.3799246163E+01    1.3502356886E+01    1.3182803071E+01    1.2842091629E+01    1.2481817240E+01    1.2103652206E+01    1.1709335879E+01    1.1300663722E+01    1.0879476105E+01    1.0447646896E+01    1.0007071955E+01    9.5596575865E+00    9.1073090593E+00    8.6519192604E+00    8.1953575673E+00    7.7394590186E+00    7.2860138552E+00    6.8367575072E+00    6.3933610897E+00    5.9574224754E+00    5.5304579977E+00    5.1138948400E+00    4.7090641557E+00    4.3171949609E+00    3.939408 [...]
+    5.9485164172E+00    5.8205382743E+00    5.6827967433E+00    5.5359408475E+00    5.3806573757E+00    5.2176665202E+00    5.0477173292E+00    4.8715830053E+00    4.6900560858E+00    4.5039435395E+00    4.3140618158E+00    4.1212318821E+00    3.9262742852E+00    3.7300042711E+00    3.5332269990E+00    3.3367328822E+00    3.1412930881E+00    2.9476552286E+00    2.7565392693E+00    2.5686336859E+00    2.3845918903E+00    2.2050289524E+00    2.0305186339E+00    1.8615907553E+00    1.698728 [...]
+    1.3876240486E+00    1.3577727447E+00    1.3256485776E+00    1.2914025520E+00    1.2551944340E+00    1.2171917414E+00    1.1775686907E+00    1.1365051088E+00    1.0941853173E+00    1.0507969971E+00    1.0065300426E+00    9.6157541208E-01    9.1612398386E-01    8.7036542579E-01    8.2448708580E-01    7.7867291164E-01    7.3310240699E-01    6.8794963113E-01    6.4338224883E-01    5.9956063677E-01    5.5663705234E-01    5.1475486983E-01    4.7404788902E-01    4.3463972001E-01    3.966432 [...]
+    2.8793755921E-03    2.8172128980E-03    2.7499151102E-03    2.6778311659E-03    2.6013325859E-03    2.5208106830E-03    2.4366736358E-03    2.3493434567E-03    2.2592528832E-03    2.1668422215E-03    2.0725561722E-03    1.9768406679E-03    1.8801397514E-03    1.7828925233E-03    1.6855301857E-03    1.5884732068E-03    1.4921286326E-03    1.3968875650E-03    1.3031228289E-03    1.2111868434E-03    1.1214097136E-03    1.0340975553E-03    9.4953106148E-04    8.6796431833E-04    7.896238 [...]
+    1.5427431185E+00    1.5095449388E+00    1.4738010264E+00    1.4356808582E+00    1.3953638468E+00    1.3530381870E+00    1.3088996530E+00    1.2631503543E+00    1.2159974603E+00    1.1676519034E+00    1.1183270694E+00    1.0682374856E+00    1.0175975159E+00    9.6662007276E-01    9.1551535464E-01    8.6448961842E-01    8.1374399545E-01    7.6347335921E-01    7.1386525249E-01    6.6509888114E-01    6.1734418111E-01    5.7076096461E-01    5.2549815061E-01    4.8169308426E-01    4.394709 [...]
+    5.6369106594E+00    5.5156191489E+00    5.3850426759E+00    5.2457990662E+00    5.0985422768E+00    4.9439582086E+00    4.7827603394E+00    4.6156852083E+00    4.4434877873E+00    4.2669367721E+00    4.0868098291E+00    3.9038888319E+00    3.7189551230E+00    3.5327848339E+00    3.3461442988E+00    3.1597855923E+00    2.9744422241E+00    2.7908250197E+00    2.6096182148E+00    2.4314757906E+00    2.2570180723E+00    2.0868286138E+00    1.9214513870E+00    1.7613882920E+00    1.607097 [...]
+    1.1819934945E+01    1.1565607653E+01    1.1291823570E+01    1.0999877134E+01    1.0691138413E+01    1.0367044353E+01    1.0029089634E+01    9.6788172281E+00    9.3178087171E+00    8.9476744409E+00    8.5700435537E+00    8.1865540589E+00    7.7988428948E+00    7.4085361427E+00    7.0172394287E+00    6.6265285852E+00    6.2379406383E+00    5.8529651838E+00    5.4730362092E+00    5.0995244171E+00    4.7337300995E+00    4.3768766086E+00    4.0301044636E+00    3.6944661288E+00    3.370921 [...]
+    1.9558088573E+01    1.9137266951E+01    1.8684262284E+01    1.8201215469E+01    1.7690392431E+01    1.7154169653E+01    1.6595019074E+01    1.6015492482E+01    1.5418205509E+01    1.4805821357E+01    1.4181034363E+01    1.3546553531E+01    1.2905086142E+01    1.2259321577E+01    1.1611915451E+01    1.0965474172E+01    1.0322540048E+01    9.6855770269E+00    9.0569571736E+00    8.4389479783E+00    7.8337005704E+00    7.2432389176E+00    6.6694500761E+00    6.1140755485E+00    5.578703 [...]
+    2.8278076678E+01    2.7669637324E+01    2.7014677319E+01    2.6316291134E+01    2.5577753908E+01    2.4802500530E+01    2.3994103828E+01    2.3156252024E+01    2.2292725614E+01    2.1407373853E+01    2.0504091016E+01    1.9586792603E+01    1.8659391669E+01    1.7725775447E+01    1.6789782417E+01    1.5855180013E+01    1.4925643089E+01    1.4004733321E+01    1.3095879661E+01    1.2202359996E+01    1.1327284111E+01    1.0473578081E+01    9.6439701695E+00    8.8409783339E+00    8.066899 [...]
+    3.7396190005E+01    3.6591568644E+01    3.5725437688E+01    3.4801888453E+01    3.3825251061E+01    3.2800066804E+01    3.1731059313E+01    3.0623104766E+01    2.9481201326E+01    2.8310438072E+01    2.7115963620E+01    2.5902954677E+01    2.4676584756E+01    2.3441993278E+01    2.2204255269E+01    2.0968351887E+01    1.9739141965E+01    1.8521334775E+01    1.7319464201E+01    1.6137864481E+01    1.4980647692E+01    1.3851683100E+01    1.2754578529E+01    1.1692663828E+01    1.066897 [...]
+    4.6346530165E+01    4.5349338333E+01    4.4275927167E+01    4.3131366201E+01    4.1921020819E+01    4.0650518016E+01    3.9325710692E+01    3.7952640737E+01    3.6537501194E+01    3.5086597755E+01    3.3606309900E+01    3.2103051948E+01    3.0583234297E+01    2.9053225152E+01    2.7519312988E+01    2.5987670035E+01    2.4464317028E+01    2.2955089462E+01    2.1465605597E+01    2.0001236400E+01    1.8567077648E+01    1.7167924345E+01    1.5808247624E+01    1.4492174264E+01    1.322346 [...]
+    5.4607041992E+01    5.3432123609E+01    5.2167413614E+01    5.0818884060E+01    4.9392855455E+01    4.7895956449E+01    4.6335081777E+01    4.4717348788E+01    4.3050052880E+01    4.1340622161E+01    3.9596571678E+01    3.7825457546E+01    3.6034831303E+01    3.4232194833E+01    3.2424956157E+01    3.0620386428E+01    2.8825578410E+01    2.7047406738E+01    2.5292490220E+01    2.3567156445E+01    2.1877408909E+01    2.0228896884E+01    1.8626888202E+01    1.7076245122E+01    1.558140 [...]
+    6.1722243910E+01    6.0394242797E+01    5.8964763862E+01    5.7440556188E+01    5.5828762592E+01    5.4136874073E+01    5.2372682300E+01    5.0544230498E+01    4.8659763093E+01    4.6727674492E+01    4.4756457370E+01    4.2754650841E+01    4.0730788890E+01    3.8693349439E+01    3.6650704399E+01    3.4611071079E+01    3.2582465268E+01    3.0572656336E+01    2.8589124632E+01    2.6639021491E+01    2.4729132085E+01    2.2865841373E+01    2.1055103335E+01    1.9302413706E+01    1.761278 [...]
+    6.7321747247E+01    6.5873276188E+01    6.4314135682E+01    6.2651685893E+01    6.0893716306E+01    5.9048396059E+01    5.7124222142E+01    5.5129965857E+01    5.3074617908E+01    5.0967332566E+01    4.8817371282E+01    4.6634046181E+01    4.4426663840E+01    4.2204469749E+01    3.9976593861E+01    3.7751997600E+01    3.5539422717E+01    3.3347342318E+01    3.1183914422E+01    2.9056938347E+01    2.6973814195E+01    2.4941505722E+01    2.2966506791E+01    2.1054811617E+01    1.921188 [...]
+    7.1133888472E+01    6.9603404981E+01    6.7956001042E+01    6.6199452296E+01    6.4341987870E+01    6.2392237920E+01    6.0359178922E+01    5.8252077117E+01    5.6080430525E+01    5.3853909964E+01    5.1582299502E+01    4.9275436775E+01    4.6943153600E+01    4.4595217322E+01    4.2241273293E+01    3.9890788910E+01    3.7552999581E+01    3.5236857008E+01    3.2950980123E+01    3.0703609014E+01    2.8502562132E+01    2.6355197061E+01    2.4268375071E+01    2.2248429690E+01    2.030113 [...]
+    7.2994052709E+01    7.1423555725E+01    6.9733097816E+01    6.7930656558E+01    6.6024674714E+01    6.4024006435E+01    6.1937861140E+01    5.9775745507E+01    5.7547403999E+01    5.5262758372E+01    5.2931846586E+01    5.0564761594E+01    4.8171590430E+01    4.5762354041E+01    4.3346948292E+01    4.0935086554E+01    3.8536244284E+01    3.6159605968E+01    3.3814014791E+01    3.1507925372E+01    2.9249359863E+01    2.7045867693E+01    2.4904489211E+01    2.2831723428E+01    2.083350 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism6_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism6_BA.inp
new file mode 100644
index 0000000..6d3f090
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_prism6_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_prism6_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+prism6                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_pyramid_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_pyramid_BA.ima
new file mode 100644
index 0000000..a8580bf
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_pyramid_BA.ima
@@ -0,0 +1,100 @@
+    6.9921172670E+03    6.7458117734E+03    6.7475689440E+03    6.5470244057E+03    6.5823098821E+03    6.3541730354E+03    6.2303889078E+03    6.1453394424E+03    5.7357379801E+03    5.5014098311E+03    3.8447832116E+03    5.4409765891E+03    4.9600354042E+03    5.0284096665E+03    4.9079466795E+03    4.7020434095E+03    4.4955591252E+03    4.2852877954E+03    4.0530102978E+03    3.9554044995E+03    3.7397302811E+03    3.5903654748E+03    3.4114699491E+03    3.2232858138E+03    3.065034 [...]
+    6.9401687137E+03    6.8307641452E+03    6.7126874069E+03    6.5864161706E+03    6.4524572685E+03    6.3113437565E+03    6.1636318441E+03    6.0098977129E+03    5.8507342450E+03    5.6867476840E+03    5.5185542519E+03    5.3467767452E+03    5.1720411306E+03    4.9949731680E+03    4.8161950784E+03    4.6363222815E+03    4.4559602227E+03    4.2757013109E+03    4.0961219855E+03    3.9177799310E+03    3.7412114565E+03    3.5669290549E+03    3.3954191560E+03    3.2271400861E+03    3.062520 [...]
+    6.8876053838E+03    6.7789348108E+03    6.6616506866E+03    6.5362275879E+03    6.4031690614E+03    6.2630047066E+03    6.1162871254E+03    5.9635887606E+03    5.8054986454E+03    5.6426190861E+03    5.4755623004E+03    5.3049470350E+03    5.1313951842E+03    4.9555284335E+03    4.7779649496E+03    4.5993161382E+03    4.4201834923E+03    4.2411555488E+03    4.0628049750E+03    3.8856858009E+03    3.7103308154E+03    3.5372491413E+03    3.3669240033E+03    3.1998107001E+03    3.036334 [...]
+    6.8007538338E+03    6.6932979683E+03    6.5773255492E+03    6.4533060272E+03    6.3217375092E+03    6.1831438712E+03    6.0380717411E+03    5.8870873708E+03    5.7307734206E+03    5.5697256771E+03    5.4045497277E+03    5.2358576139E+03    5.0642644869E+03    4.8903852863E+03    4.7148314656E+03    4.5382077853E+03    4.3611091944E+03    4.1841178199E+03    4.0078000839E+03    3.8327039664E+03    3.6593564292E+03    3.4882610165E+03    3.3198956473E+03    3.1547106093E+03    2.993126 [...]
+    6.6807304732E+03    6.5749572347E+03    6.4608017792E+03    6.3387264510E+03    6.2092218145E+03    6.0728038109E+03    5.9300107856E+03    5.7814004078E+03    5.6275465024E+03    5.4690358179E+03    5.3064647492E+03    5.1404360437E+03    4.9715555041E+03    4.8004287191E+03    4.6276578367E+03    4.4538384064E+03    4.2795563064E+03    4.1053847793E+03    3.9318815920E+03    3.7595863399E+03    3.5890179090E+03    3.4206721133E+03    3.2550195200E+03    3.0925034738E+03    2.933538 [...]
+    6.5290694327E+03    6.4254290973E+03    6.3135767874E+03    6.1939658285E+03    6.0670772130E+03    5.9334168119E+03    5.7935124600E+03    5.6479109343E+03    5.4971748481E+03    5.3418794798E+03    5.1826095613E+03    5.0199560450E+03    4.8545128726E+03    4.6868737677E+03    4.5176290721E+03    4.3473626485E+03    4.1766488680E+03    4.0060497022E+03    3.8361119390E+03    3.6673645378E+03    3.5003161422E+03    3.3354527624E+03    3.1732356423E+03    3.0140993232E+03    2.858449 [...]
+    6.3476944994E+03    6.2466151099E+03    6.1375280892E+03    6.0208759176E+03    5.8971280775E+03    5.7667783314E+03    5.6303418758E+03    5.4883523915E+03    5.3413590110E+03    5.1899232229E+03    5.0346157361E+03    4.8760133232E+03    4.7146956667E+03    4.5512422267E+03    4.3862291533E+03    4.2202262617E+03    4.0537940917E+03    3.8874810692E+03    3.7218207871E+03    3.5573294247E+03    3.3945033181E+03    3.2338166985E+03    3.0757196104E+03    2.9206360203E+03    2.768962 [...]
+    6.1388841233E+03    6.0407672266E+03    5.9348789923E+03    5.8216493322E+03    5.7015343907E+03    5.5750138984E+03    5.4425884068E+03    5.3047764210E+03    5.1621114538E+03    5.0151390151E+03    4.8644135664E+03    4.7104954521E+03    4.5539478347E+03    4.3953336507E+03    4.2352126101E+03    4.0741382568E+03    3.9126551105E+03    3.7512959088E+03    3.5905789644E+03    3.4310056575E+03    3.2730580745E+03    3.1171968107E+03    2.9638589464E+03    2.8134562102E+03    2.666373 [...]
+    5.9052302735E+03    5.8104470451E+03    5.7081582593E+03    5.5987796556E+03    5.4827523374E+03    5.3605402134E+03    5.2326273217E+03    5.0995150570E+03    4.9617193198E+03    4.8197676064E+03    4.6741960608E+03    4.5255465074E+03    4.3743634863E+03    4.2211913089E+03    4.0665711550E+03    3.9110382300E+03    3.7551190003E+03    3.5993285248E+03    3.4441678999E+03    3.2901218330E+03    3.1376563590E+03    2.9872167148E+03    2.8392253822E+03    2.6940803107E+03    2.552153 [...]
+    5.6495920542E+03    5.5584798635E+03    5.4601546428E+03    5.3550164870E+03    5.2434898973E+03    5.1260213179E+03    5.0030765606E+03    4.8751381351E+03    4.7427025045E+03    4.6062772846E+03    4.4663784052E+03    4.3235272544E+03    4.1782478241E+03    4.0310638758E+03    3.8824961460E+03    3.7330596098E+03    3.5832608195E+03    3.4335953361E+03    3.2845452692E+03    3.1365769417E+03    2.9901386918E+03    2.8456588265E+03    2.7035437381E+03    2.5641761935E+03    2.427913 [...]
+    5.3750450996E+03    5.2879045623E+03    5.1938672932E+03    5.0933164152E+03    4.9866584197E+03    4.8743208065E+03    4.7567496166E+03    4.6344068757E+03    4.5077679654E+03    4.3773189394E+03    4.2435538059E+03    4.1069717914E+03    3.9680746062E+03    3.8273637306E+03    3.6853377373E+03    3.5424896706E+03    3.3993044970E+03    3.2562566451E+03    3.1138076494E+03    2.9724039128E+03    2.8324746019E+03    2.6944296865E+03    2.5586581356E+03    2.4255262788E+03    2.295376 [...]
+    5.0848278507E+03    5.0019204043E+03    4.9124531254E+03    4.8167909935E+03    4.7153212467E+03    4.6084511336E+03    4.4966055619E+03    4.3802246625E+03    4.2597612841E+03    4.1356784366E+03    4.0084467004E+03    3.8785416199E+03    3.7464410975E+03    3.6126228072E+03    3.4775616437E+03    3.3417272246E+03    3.2055814610E+03    3.0695762133E+03    2.9341510459E+03    2.7997310953E+03    2.6667250638E+03    2.5355233520E+03    2.4064963392E+03    2.2799928225E+03    2.156338 [...]
+    4.7822858698E+03    4.7038319004E+03    4.6191722824E+03    4.5286528429E+03    4.4326404976E+03    4.3315211198E+03    4.2256973123E+03    4.1155860983E+03    4.0016165472E+03    3.8842273513E+03    3.7638643710E+03    3.6409781636E+03    3.5160215140E+03    3.3894469831E+03    3.2617044904E+03    3.1332389459E+03    3.0044879485E+03    2.8758795633E+03    2.7478301939E+03    2.6207425614E+03    2.4950038034E+03    2.3709837031E+03    2.2490330600E+03    2.1294822100E+03    2.012639 [...]
+    4.4708153799E+03    4.3969929190E+03    4.3173328600E+03    4.2321610388E+03    4.1418231596E+03    4.0466827865E+03    3.9471192437E+03    3.8435254399E+03    3.7363056303E+03    3.6258731338E+03    3.5126480186E+03    3.3970547743E+03    3.2795199840E+03    3.1604700146E+03    3.0403287380E+03    2.9195152996E+03    2.7984419490E+03    2.6775119454E+03    2.5571175520E+03    2.4376381315E+03    2.3194383538E+03    2.2028665278E+03    2.0882530647E+03    1.9759090834E+03    1.866125 [...]
+    4.1538072100E+03    4.0847512092E+03    4.0102360562E+03    3.9305669311E+03    3.8460676222E+03    3.7570786448E+03    3.6639552745E+03    3.5670655090E+03    3.4667879721E+03    3.3635097750E+03    3.2576243487E+03    3.1495292627E+03    3.0396240456E+03    2.9283080199E+03    2.8159781680E+03    2.7030270421E+03    2.5898407308E+03    2.4767968977E+03    2.3642629022E+03    2.2525940145E+03    2.1421317375E+03    2.0332022421E+03    1.9261149288E+03    1.8211611199E+03    1.718612 [...]
+    3.8345922990E+03    3.7703944816E+03    3.7011228761E+03    3.6270615182E+03    3.5485117632E+03    3.4657905349E+03    3.3792284956E+03    3.2891681488E+03    3.1959618890E+03    3.0999700107E+03    3.0015586910E+03    2.9010979595E+03    2.7989596694E+03    2.6955154826E+03    2.5911348830E+03    2.4861832308E+03    2.3810198699E+03    2.2759963018E+03    2.1714544359E+03    2.0677249279E+03    1.9651256173E+03    1.8639600705E+03    1.7645162409E+03    1.6670652515E+03    1.571860 [...]
+    3.5163898533E+03    3.4570991316E+03    3.3931234673E+03    3.3247254394E+03    3.2521836394E+03    3.1757910541E+03    3.0958533731E+03    3.0126872359E+03    2.9266184291E+03    2.8379800457E+03    2.7471106210E+03    2.6543522559E+03    2.5600487406E+03    2.4645436929E+03    2.3681787211E+03    2.2712916250E+03    2.1742146466E+03    2.0772727808E+03    1.9807821581E+03    1.8850485081E+03    1.7903657136E+03    1.6970144643E+03    1.6052610161E+03    1.5153560656E+03    1.427533 [...]
+    3.2022591680E+03    3.1478826068E+03    3.0892100779E+03    3.0264825647E+03    2.9599557498E+03    2.8898985312E+03    2.8165914698E+03    2.7403251812E+03    2.6613986821E+03    2.5801177015E+03    2.4967929703E+03    2.4117384994E+03    2.3252698588E+03    2.2377024681E+03    2.1493499116E+03    2.0605222872E+03    1.9715246005E+03    1.8826552148E+03    1.7942043661E+03    1.7064527527E+03    1.6196702077E+03    1.5341144625E+03    1.4500300075E+03    1.3676470580E+03    1.287180 [...]
+    2.8950560175E+03    2.8455603144E+03    2.7921545224E+03    2.7350580610E+03    2.6745037385E+03    2.6107364022E+03    2.5440115263E+03    2.4745937481E+03    2.4027553638E+03    2.3287747917E+03    2.2529350157E+03    2.1755220186E+03    2.0968232154E+03    2.0171258981E+03    1.9367157013E+03    1.8558750997E+03    1.7748819457E+03    1.6940080583E+03    1.6135178711E+03    1.5336671469E+03    1.4547017694E+03    1.3768566158E+03    1.3003545193E+03    1.2254053257E+03    1.152205 [...]
+    2.5973943933E+03    2.5527078395E+03    2.5044909201E+03    2.4529416859E+03    2.3982702797E+03    2.3406977195E+03    2.2804546253E+03    2.2177798998E+03    2.1529193716E+03    2.0861244102E+03    2.0176505218E+03    1.9477559366E+03    1.8767001959E+03    1.8047427494E+03    1.7321415708E+03    1.6591518021E+03    1.5860244346E+03    1.5130050348E+03    1.4403325244E+03    1.3682380198E+03    1.2969437406E+03    1.2266619917E+03    1.1575942256E+03    1.0899301898E+03    1.023847 [...]
+    2.3116142265E+03    2.2716291042E+03    2.2284843254E+03    2.1823569235E+03    2.1334347504E+03    2.0819153902E+03    2.0280050234E+03    1.9719172500E+03    1.9138718780E+03    1.8540936876E+03    1.7928111781E+03    1.7302553066E+03    1.6666582263E+03    1.6022520345E+03    1.5372675358E+03    1.4719330319E+03    1.4064731422E+03    1.3411076664E+03    1.2760504933E+03    1.2115085638E+03    1.1476808943E+03    1.0847576667E+03    1.0229193885E+03    9.6233612932E+02    9.031668 [...]
+    2.0397555767E+03    2.0043309432E+03    1.9661057208E+03    1.9252364243E+03    1.8818891444E+03    1.8362385909E+03    1.7884670902E+03    1.7387635480E+03    1.6873223807E+03    1.6343424251E+03    1.5800258332E+03    1.5245769589E+03    1.4682012449E+03    1.4111041175E+03    1.3534898948E+03    1.2955607177E+03    1.2375155088E+03    1.1795489670E+03    1.1218506032E+03    1.0646038233E+03    1.0079850652E+03    9.5216299205E+02    8.9729774983E+02    8.4354029033E+02    7.910317 [...]
+    1.7835396079E+03    1.7525044109E+03    1.7190136826E+03    1.6832040531E+03    1.6452205269E+03    1.6052156495E+03    1.5633486373E+03    1.5197844739E+03    1.4746929811E+03    1.4282478701E+03    1.3806257794E+03    1.3320053064E+03    1.2825660376E+03    1.2324875864E+03    1.1819486422E+03    1.1311260384E+03    1.0801938456E+03    1.0293224942E+03    9.7867793349E+02    9.2842083146E+02    8.7870582038E+02    8.2968079259E+02    7.8148625038E+02    7.3425471374E+02    6.881101 [...]
+    1.5443565059E+03    1.5175129717E+03    1.4885428643E+03    1.4575636875E+03    1.4247001645E+03    1.3900835263E+03    1.3538507660E+03    1.3161438665E+03    1.2771090049E+03    1.2368957408E+03    1.1956561921E+03    1.1535442058E+03    1.1107145273E+03    1.0673219753E+03    1.0235206271E+03    9.7946301897E+02    9.3529936781E+02    8.9117681823E+02    8.4723871986E+02    8.0362393949E+02    7.6046621198E+02    7.1789353375E+02    6.7602760234E+02    6.3498330498E+02    5.948682 [...]
+    1.3232603260E+03    1.3003875590E+03    1.2756992836E+03    1.2492947458E+03    1.2212793112E+03    1.1917638678E+03    1.1608642016E+03    1.1287003486E+03    1.0953959279E+03    1.0610774606E+03    1.0258736779E+03    9.8991482524E+02    9.5333196438E+02    9.1625628018E+02    8.7881839538E+02    8.4114769818E+02    8.0337168681E+02    7.6561533522E+02    7.2800048380E+02    6.9064525874E+02    6.5366352359E+02    6.1716436614E+02    5.8125162347E+02    5.4602344783E+02    5.115719 [...]
+    1.1209706030E+03    1.1018283325E+03    1.0811622376E+03    1.0590542724E+03    1.0355914702E+03    1.0108654559E+03    9.8497193617E+02    9.5801017005E+02    9.3008242397E+02    9.0129341469E+02    8.7174974379E+02    8.4155932751E+02    8.1083082558E+02    7.7967307294E+02    7.4819451770E+02    7.1650266921E+02    6.8470355947E+02    6.5290122139E+02    6.2119718699E+02    5.8969000853E+02    5.5847480552E+02    5.2764284004E+02    4.9728112280E+02    4.6747205217E+02    4.382930 [...]
+    9.3788040052E+02    9.2221281203E+02    9.0529252729E+02    8.8718525648E+02    8.6796081304E+02    8.4769272974E+02    8.2645785667E+02    8.0433594374E+02    7.8140921060E+02    7.5776190666E+02    7.3347986411E+02    7.0865004694E+02    6.8336009870E+02    6.5769789203E+02    6.3175108276E+02    6.0560667128E+02    5.7935057409E+02    5.5306720795E+02    5.2683908927E+02    5.0074645099E+02    4.7486687929E+02    4.4927497210E+02    4.2404202133E+02    3.9923572049E+02    3.749198 [...]
+    7.7407034322E+02    7.6160993164E+02    7.4814653384E+02    7.3373073093E+02    7.1841630009E+02    7.0225992731E+02    6.8532090627E+02    6.6766082547E+02    6.4934324538E+02    6.3043336800E+02    6.1099770065E+02    5.9110371626E+02    5.7081951227E+02    5.5021347027E+02    5.2935391843E+02    5.0830879882E+02    4.8714534167E+02    4.6592974841E+02    4.4472688546E+02    4.2359999043E+02    4.0261039250E+02    3.8181724846E+02    3.6127729583E+02    3.4104462442E+02    3.211704 [...]
+    6.2932805114E+02    6.1979943498E+02    6.0949557036E+02    5.9845307616E+02    5.8671093171E+02    5.7431027900E+02    5.6129421514E+02    5.4770757618E+02    5.3359671383E+02    5.1900926630E+02    5.0399392473E+02    4.8860019649E+02    4.7287816701E+02    4.5687826128E+02    4.4065100660E+02    4.2424679793E+02    4.0771566714E+02    3.9110705758E+02    3.7446960512E+02    3.5785092693E+02    3.4129741916E+02    3.2485406462E+02    3.0856425133E+02    2.9246960305E+02    2.766098 [...]
+    5.0317229312E+02    4.9629593256E+02    4.8884983389E+02    4.8085785744E+02    4.7234546185E+02    4.6333958843E+02    4.5386853931E+02    4.4396185020E+02    4.3365015821E+02    4.2296506571E+02    4.1193900079E+02    4.0060507514E+02    3.8899694011E+02    3.7714864165E+02    3.6509447504E+02    3.5286883998E+02    3.4050609698E+02    3.2804042568E+02    3.1550568580E+02    3.0293528156E+02    2.9036203005E+02    2.7781803444E+02    2.6533456237E+02    2.5294193029E+02    2.406693 [...]
+    3.9488109461E+02    3.9037685966E+02    3.8548620003E+02    3.8022144301E+02    3.7459582665E+02    3.6862345865E+02    3.6231927237E+02    3.5569898013E+02    3.4877902388E+02    3.4157652335E+02    3.3410922190E+02    3.2639543009E+02    3.1845396729E+02    3.1030410139E+02    3.0196548685E+02    2.9345810121E+02    2.8480218045E+02    2.7601815317E+02    2.6712657400E+02    2.5814805647E+02    2.4910320541E+02    2.4001254943E+02    2.3089647342E+02    2.2177515159E+02    2.126684 [...]
+    3.0352297460E+02    3.0111351499E+02    2.9847904580E+02    2.9562159420E+02    2.9254348529E+02    2.8924736789E+02    2.8573624036E+02    2.8201347614E+02    2.7808284866E+02    2.7394855509E+02    2.6961523873E+02    2.6508800941E+02    2.6037246178E+02    2.5547469094E+02    2.5040130517E+02    2.4515943542E+02    2.3975674132E+02    2.3420141337E+02    2.2850217118E+02    2.2266825755E+02    2.1670942825E+02    2.1063593741E+02    2.0445851841E+02    1.9818836041E+02    1.918370 [...]
+    2.2799045033E+02    2.2740432405E+02    2.2673325086E+02    2.2597018421E+02    2.2510783682E+02    2.2413876554E+02    2.2305545899E+02    2.2185042701E+02    2.2051629118E+02    2.1904587554E+02    2.1743229651E+02    2.1566905140E+02    2.1375010436E+02    2.1166996919E+02    2.0942378810E+02    2.0700740564E+02    2.0441743717E+02    2.0165133111E+02    1.9870742446E+02    1.9558499092E+02    1.9228428124E+02    1.8880655538E+02    1.8515410604E+02    1.8133027344E+02    1.773394 [...]
+    1.6703493477E+02    1.6800945847E+02    1.6901851494E+02    1.7004719081E+02    1.7107986594E+02    1.7210034981E+02    1.7309202287E+02    1.7403798167E+02    1.7492118658E+02    1.7572461062E+02    1.7643138842E+02    1.7702496374E+02    1.7748923449E+02    1.7780869393E+02    1.7796856686E+02    1.7795493964E+02    1.7775488296E+02    1.7735656637E+02    1.7674936347E+02    1.7592394714E+02    1.7487237376E+02    1.7358815595E+02    1.7206632315E+02    1.7030346959E+02    1.682977 [...]
+    1.1930216138E+02    1.2158595242E+02    1.2400413985E+02    1.2653511874E+02    1.2915618181E+02    1.3184369984E+02    1.3457330897E+02    1.3732010332E+02    1.4005883155E+02    1.4276409542E+02    1.4541054902E+02    1.4797309685E+02    1.5042708916E+02    1.5274851305E+02    1.5491417766E+02    1.5690189209E+02    1.5869063455E+02    1.6026071137E+02    1.6159390474E+02    1.6267360798E+02    1.6348494722E+02    1.6401488874E+02    1.6425233110E+02    1.6418818134E+02    1.638154 [...]
+    8.3367301675E+01    8.6722488561E+01    9.0293456009E+01    9.4053040055E+01    9.7972646513E+01    1.0202246802E+02    1.0617170966E+02    1.1038882127E+02    1.1464173468E+02    1.1889810380E+02    1.2312554574E+02    1.2729188105E+02    1.3136537107E+02    1.3531495061E+02    1.3911045404E+02    1.4272283309E+02    1.4612436468E+02    1.4928884707E+02    1.5219178298E+02    1.5481054828E+02    1.5712454485E+02    1.5911533679E+02    1.6076676870E+02    1.6206506554E+02    1.629989 [...]
+    5.7768992288E+01    6.1973077162E+01    6.6457124635E+01    7.1189491725E+01    7.6136841538E+01    8.1264390005E+01    8.6536162481E+01    9.1915258162E+01    9.7364120201E+01    1.0284480938E+02    1.0831927919E+02    1.1374965008E+02    1.1909848084E+02    1.2432903488E+02    1.2940553941E+02    1.3429343554E+02    1.3895961731E+02    1.4337265796E+02    1.4750302164E+02    1.5132325906E+02    1.5480818568E+02    1.5793504114E+02    1.6068362880E+02    1.6303643459E+02    1.649787 [...]
+    4.1041557033E+01    4.5888920978E+01    5.1064615955E+01    5.6533538782E+01    6.2258688993E+01    6.8201438579E+01    7.4321812607E+01    8.0578778494E+01    8.6930541658E+01    9.3334845198E+01    9.9749271264E+01    1.0613154176E+02    1.1243981603E+02    1.1863298326E+02    1.2467094730E+02    1.3051490177E+02    1.3612759341E+02    1.4147357159E+02    1.4651942225E+02    1.5123398456E+02    1.5558854865E+02    1.5955703311E+02    1.6311614108E+02    1.6624549381E+02    1.689277 [...]
+    3.1744793548E+01    3.7047842291E+01    4.2713247099E+01    4.8703394942E+01    5.4978628125E+01    6.1497530731E+01    6.8217226702E+01    7.5093687179E+01    8.2082044713E+01    8.9136911856E+01    9.6212701663E+01    1.0326394762E+02    1.1024562050E+02    1.1711343974E+02    1.2382417698E+02    1.3033594938E+02    1.3660850065E+02    1.4260346756E+02    1.4828463011E+02    1.5361814344E+02    1.5857274992E+02    1.6311996987E+02    1.6723426969E+02    1.7089320625E+02    1.740775 [...]
+    2.8490790490E+01    3.4080744642E+01    4.0054259401E+01    4.6372087851E+01    5.2992842348E+01    5.9873291824E+01    6.6968671200E+01    7.4233000486E+01    8.1619411051E+01    8.9080476531E+01    9.6568545791E+01    1.0403607537E+02    1.1143595887E+02    1.1872185069E+02    1.2584848182E+02    1.3277196504E+02    1.3945008756E+02    1.4584258871E+02    1.5191142066E+02    1.5762099050E+02    1.6293838172E+02    1.6783355365E+02    1.7227951764E+02    1.7625248858E+02    1.797320 [...]
+    2.9967346653E+01    3.5694686778E+01    4.1815519263E+01    4.8289760307E+01    5.5075135742E+01    6.2127483808E+01    6.9401070280E+01    7.6848913503E+01    8.4423116770E+01    9.2075205465E+01    9.9756466363E+01    1.0741828645E+02    1.1501248869E+02    1.2249166213E+02    1.2980948393E+02    1.3692103077E+02    1.4378307742E+02    1.5035438023E+02    1.5659594350E+02    1.6247126673E+02    1.6794657115E+02    1.7299100384E+02    1.7757681814E+02    1.8167952915E+02    1.852780 [...]
+    3.4957674660E+01    4.0692257084E+01    4.6820536916E+01    5.3302308310E+01    6.0095166786E+01    6.7154812568E+01    7.4435366336E+01    8.1889694905E+01    8.9469744310E+01    9.7126877676E+01    1.0481221529E+02    1.1247697425E+02    1.2007280503E+02    1.2755212252E+02    1.3486842887E+02    1.4197662591E+02    1.4883331461E+02    1.5539707957E+02    1.6162875632E+02    1.6749167961E+02    1.7295191090E+02    1.7797844346E+02    1.8254338379E+02    1.8662210809E+02    1.901933 [...]
+    4.2356185552E+01    4.7987049867E+01    5.4003609886E+01    6.0366168541E+01    6.7032858086E+01    7.3959939636E+01    8.1102114964E+01    8.8412848118E+01    9.5844694363E+01    1.0334963388E+02    1.1087940762E+02    1.1838585282E+02    1.2582123544E+02    1.3313857720E+02    1.4029197455E+02    1.4723690733E+02    1.5393053472E+02    1.6033197637E+02    1.6640257663E+02    1.7210615000E+02    1.7740920608E+02    1.8228115241E+02    1.8669447399E+02    1.9062488809E+02    1.940514 [...]
+    5.1180263572E+01    5.6615157091E+01    6.2421009431E+01    6.8559178516E+01    7.4988910652E+01    8.1667632408E+01    8.8551254443E+01    9.5594484925E+01    1.0275115007E+02    1.0997451935E+02    1.1721763280E+02    1.2443362797E+02    1.3157606400E+02    1.3859924027E+02    1.4545850737E+02    1.5211056789E+02    1.5851376498E+02    1.6462835635E+02    1.7041677187E+02    1.7584385288E+02    1.8087707150E+02    1.8548672847E+02    1.8964612811E+02    1.9333172944E+02    1.965232 [...]
+    6.0578049442E+01    6.5742697468E+01    7.1258235714E+01    7.7087539341E+01    8.3191456997E+01    8.9529091717E+01    9.6058093331E+01    1.0273496009E+02    1.0951534719E+02    1.1635437971E+02    1.2320696768E+02    1.3002812071E+02    1.3677325992E+02    1.4339852462E+02    1.4986107161E+02    1.5611936472E+02    1.6213345246E+02    1.6786523182E+02    1.7327869618E+02    1.7834016563E+02    1.8301849807E+02    1.8728527960E+02    1.9111499294E+02    1.9448516279E+02    1.973764 [...]
+    6.9832352712E+01    7.4669506319E+01    7.9833468164E+01    8.5289010700E+01    9.0998986094E+01    9.6924593364E+01    1.0302565646E+02    1.0926091113E+02    1.1558829827E+02    1.2196526160E+02    1.2834904723E+02    1.3469700293E+02    1.4096687470E+02    1.4711709851E+02    1.5310708483E+02    1.5889749406E+02    1.6445050050E+02    1.6973004325E+02    1.7470206190E+02    1.7933471558E+02    1.8359858363E+02    1.8746684662E+02    1.9091544648E+02    1.9392322460E+02    1.964720 [...]
+    7.8360906842E+01    8.2829201840E+01    8.7597428827E+01    9.2632558195E+01    9.7899762708E+01    1.0336266860E+02    1.0898361697E+02    1.1472393340E+02    1.2054420374E+02    1.2640455389E+02    1.3226493137E+02    1.3808538666E+02    1.4382635193E+02    1.4944891526E+02    1.5491508812E+02    1.6018806421E+02    1.6523246758E+02    1.7001458844E+02    1.7450260469E+02    1.7866678774E+02    1.8247969110E+02    1.8591632049E+02    1.8895428422E+02    1.9157392297E+02    1.937584 [...]
+    8.5713262207E+01    8.9785924260E+01    9.4129956465E+01    9.8714752151E+01    1.0350804165E+02    1.0847612557E+02    1.1358411771E+02    1.1879619551E+02    1.2407585633E+02    1.2938617733E+02    1.3469007721E+02    1.3995057747E+02    1.4513106148E+02    1.5019552922E+02    1.5510884583E+02    1.5983698205E+02    1.6434724485E+02    1.6860849639E+02    1.7259135995E+02    1.7626841105E+02    1.7961435274E+02    1.8260617351E+02    1.8522328704E+02    1.8744765269E+02    1.892638 [...]
+    9.1564680801E+01    9.5228112050E+01    9.9133656074E+01    1.0325328301E+02    1.0755744247E+02    1.1201527770E+02    1.1659484863E+02    1.2126336185E+02    1.2598740591E+02    1.3073319003E+02    1.3546678428E+02    1.4015435967E+02    1.4476242595E+02    1.4925806556E+02    1.5360916190E+02    1.5778462012E+02    1.6175457895E+02    1.6549061176E+02    1.6896591572E+02    1.7215548732E+02    1.7503628333E+02    1.7758736587E+02    1.7979003075E+02    1.8162791808E+02    1.830871 [...]
+    9.5707450478E+01    9.8959732794E+01    1.0242504105E+02    1.0607801018E+02    1.0989190107E+02    1.1383879484E+02    1.1788979508E+02    1.2201523654E+02    1.2618489848E+02    1.3036822128E+02    1.3453452433E+02    1.3865322379E+02    1.4269404839E+02    1.4662725168E+02    1.5042381918E+02    1.5405566874E+02    1.5749584275E+02    1.6071869066E+02    1.6370004067E+02    1.6641735906E+02    1.6884989634E+02    1.7097881897E+02    1.7278732590E+02    1.7426074906E+02    1.753866 [...]
+    9.8040075636E+01    1.0088942461E+02    1.0392362281E+02    1.0711999786E+02    1.1045465041E+02    1.1390262809E+02    1.1743810663E+02    1.2103457666E+02    1.2466503486E+02    1.2830217786E+02    1.3191859750E+02    1.3548697582E+02    1.3898027845E+02    1.4237194474E+02    1.4563607341E+02    1.4874760214E+02    1.5168247982E+02    1.5441783026E+02    1.5693210611E+02    1.5920523178E+02    1.6121873460E+02    1.6295586303E+02    1.6440169131E+02    1.6554320976E+02    1.663694 [...]
+    9.8554824872E+01    1.0101802708E+02    1.0363942510E+02    1.0639901324E+02    1.0927570349E+02    1.1224747909E+02    1.1529155451E+02    1.1838454038E+02    1.2150261240E+02    1.2462168256E+02    1.2771757172E+02    1.3076618188E+02    1.3374366714E+02    1.3662660181E+02    1.3939214454E+02    1.4201819717E+02    1.4448355717E+02    1.4676806253E+02    1.4885272803E+02    1.5071987189E+02    1.5235323196E+02    1.5373807066E+02    1.5486126779E+02    1.5571140085E+02    1.562788 [...]
+    9.7324124567E+01    9.9424988437E+01    1.0165940730E+02    1.0400996879E+02    1.0645831777E+02    1.0898528992E+02    1.1157105084E+02    1.1419523958E+02    1.1683711550E+02    1.1947570740E+02    1.2208996366E+02    1.2465890230E+02    1.2716175986E+02    1.2957813787E+02    1.3188814594E+02    1.3407254030E+02    1.3611285677E+02    1.3799153727E+02    1.3969204884E+02    1.4119899441E+02    1.4249821444E+02    1.4357687887E+02    1.4442356857E+02    1.4502834589E+02    1.453828 [...]
+    9.4486281297E+01    9.6254129311E+01    9.8133274224E+01    1.0010878291E+02    1.0216491177E+02    1.0428522092E+02    1.0645269310E+02    1.0864985644E+02    1.1085891014E+02    1.1306185204E+02    1.1524060717E+02    1.1737715634E+02    1.1945366367E+02    1.2145260219E+02    1.2335687664E+02    1.2514994235E+02    1.2681591956E+02    1.2833970221E+02    1.2970706036E+02    1.3090473575E+02    1.3192052952E+02    1.3274338169E+02    1.3336344184E+02    1.3377213044E+02    1.339621 [...]
+    9.0230996360E+01    9.1699223307E+01    9.3259129306E+01    9.4898112458E+01    9.6602883590E+01    9.8359561932E+01    1.0015377481E+02    1.0197076062E+02    1.0379547425E+02    1.0561269420E+02    1.0740713064E+02    1.0916353337E+02    1.1086679924E+02    1.1250207785E+02    1.1405487501E+02    1.1551115312E+02    1.1685742768E+02    1.1808085932E+02    1.1916934064E+02    1.2011157725E+02    1.2089716248E+02    1.2151664516E+02    1.2196159015E+02    1.2222463109E+02    1.222995 [...]
+    8.4785104029E+01    8.5989822658E+01    8.7269395910E+01    8.8613377816E+01    9.0010747825E+01    9.1449989107E+01    9.2919170195E+01    9.4406029362E+01    9.5898061088E+01    9.7382603992E+01    9.8846929552E+01    1.0027833098E+02    1.0166421158E+02    1.0299217194E+02    1.0425009536E+02    1.0542623081E+02    1.0650927295E+02    1.0748843851E+02    1.0835353856E+02    1.0909504621E+02    1.0970415913E+02    1.1017285665E+02    1.1049395085E+02    1.1066113157E+02    1.106690 [...]
+    7.8398923087E+01    7.9377715027E+01    8.0417388906E+01    8.1509458610E+01    8.2644964614E+01    8.3814536213E+01    8.5008456479E+01    8.6216729452E+01    8.7429149096E+01    8.8635369490E+01    8.9824975775E+01    9.0987555322E+01    9.2112768619E+01    9.3190419372E+01    9.4210523313E+01    9.5163375235E+01    9.6039613781E+01    9.6830283529E+01    9.7526893963E+01    9.8121474899E+01    9.8606628022E+01    9.8975574162E+01    9.9222196025E+01    9.9341076095E+01    9.932752 [...]
+    7.1333560617E+01    7.2124346789E+01    7.2964867958E+01    7.3848387258E+01    7.4767783400E+01    7.5715598285E+01    7.6684086776E+01    7.7665268274E+01    7.8650979742E+01    7.9632929798E+01    8.0602753515E+01    8.1552067534E+01    8.2472525113E+01    8.3355870739E+01    8.4193993923E+01    8.4978981814E+01    8.5703170276E+01    8.6359193089E+01    8.6940028933E+01    8.7439045864E+01    8.7850042978E+01    8.8167288997E+01    8.8385557535E+01    8.8500158825E+01    8.850696 [...]
+    6.3849450076E+01    6.4489491147E+01    6.5170846889E+01    6.5888310427E+01    6.6636366960E+01    6.7409228297E+01    6.8200869059E+01    6.9005064299E+01    6.9815428300E+01    7.0625454304E+01    7.1428554910E+01    7.2218102872E+01    7.2987472058E+01    7.3730078281E+01    7.4439419757E+01    7.5109116926E+01    7.5732951388E+01    7.6304903704E+01    7.6819189826E+01    7.7270295934E+01    7.7653011454E+01    7.7962460070E+01    7.8194128526E+01    7.8343893055E+01    7.840804 [...]
+    5.6196344424E+01    5.6721378279E+01    5.7281872418E+01    5.7873927524E+01    5.8493400350E+01    5.9135926795E+01    5.9796946196E+01    6.0471726725E+01    6.1155391735E+01    6.1842946907E+01    6.2529308059E+01    6.3209329449E+01    6.3877832426E+01    6.4529634253E+01    6.5159576958E+01    6.5762556038E+01    6.6333548863E+01    6.6867642617E+01    6.7360061618E+01    6.7806193866E+01    6.8201616665E+01    6.8542121186E+01    6.8823735813E+01    6.9042748159E+01    6.919572 [...]
+    4.8604921767E+01    4.9048441493E+01    4.9523922506E+01    5.0028552420E+01    5.0559326696E+01    5.1113061879E+01    5.1686409690E+01    5.2275871943E+01    5.2877816225E+01    5.3488492295E+01    5.4104049123E+01    5.4720552529E+01    5.5334003338E+01    5.5940355984E+01    5.6535537493E+01    5.7115466756E+01    5.7676074022E+01    5.8213320516E+01    5.8723218096E+01    5.9201848863E+01    5.9645384624E+01    6.0050106120E+01    6.0412421914E+01    6.0728886848E+01    6.099621 [...]
+    4.1280097628E+01    4.1672770247E+01    4.2096011636E+01    4.2547881974E+01    4.3026289364E+01    4.3528994848E+01    4.4053617982E+01    4.4597643023E+01    4.5158425714E+01    4.5733200734E+01    4.6319089794E+01    4.6913110411E+01    4.7512185368E+01    4.8113152862E+01    4.8712777335E+01    4.9307760981E+01    4.9894755918E+01    5.0470376996E+01    5.1031215210E+01    5.1573851686E+01    5.2094872190E+01    5.2590882105E+01    5.3058521816E+01    5.3494482439E+01    5.389552 [...]
+    3.4396076583E+01    3.4765299786E+01    3.5165529546E+01    3.5595494397E+01    3.6053799896E+01    3.6538926995E+01    3.7049230755E+01    3.7582939477E+01    3.8138154351E+01    3.8712849688E+01    3.9304873847E+01    3.9911950908E+01    4.0531683172E+01    4.1161554560E+01    4.1798934963E+01    4.2441085587E+01    4.3085165338E+01    4.3728238276E+01    4.4367282148E+01    4.4999198009E+01    4.5620820924E+01    4.6228931727E+01    4.6820269804E+01    4.7391546858E+01    4.793946 [...]
+    2.8093118405E+01    2.8462709832E+01    2.8865282960E+01    2.9300043919E+01    2.9766094882E+01    3.0262427313E+01    3.0787915383E+01    3.1341309679E+01    3.1921231355E+01    3.2526166848E+01    3.3154463299E+01    3.3804324805E+01    3.4473809627E+01    3.5160828463E+01    3.5863143892E+01    3.6578371084E+01    3.7303979855E+01    3.8037298141E+01    3.8775516926E+01    3.9515696693E+01    4.0254775385E+01    4.0989577905E+01    4.1716827131E+01    4.2433156427E+01    4.313512 [...]
+    2.2475941550E+01    2.2865952854E+01    2.3292158318E+01    2.3754067075E+01    2.4251094269E+01    2.4782550607E+01    2.5347631955E+01    2.5945409153E+01    2.6574818220E+01    2.7234651118E+01    2.7923547254E+01    2.8639985885E+01    2.9382279571E+01    3.0148568847E+01    3.0936818239E+01    3.1744813752E+01    3.2570161944E+01    3.3410290691E+01    3.4262451709E+01    3.5123724900E+01    3.5991024574E+01    3.6861107557E+01    3.7730583190E+01    3.8595925213E+01    3.945348 [...]
+    1.7613641175E+01    1.8040287112E+01    1.8507278612E+01    1.9014271487E+01    1.9560829606E+01    2.0146412070E+01    2.0770360350E+01    2.1431885615E+01    2.2130056413E+01    2.2863786942E+01    2.3631826076E+01    2.4432747358E+01    2.5264940136E+01    2.6126602009E+01    2.7015732765E+01    2.7930129941E+01    2.8867386149E+01    2.9824888279E+01    3.0799818682E+01    3.1789158407E+01    3.2789692552E+01    3.3798017755E+01    3.4810551848E+01    3.5823545656E+01    3.683309 [...]
+    1.3540960811E+01    1.4016652056E+01    1.4537490213E+01    1.5103141241E+01    1.5713174483E+01    1.6367048637E+01    1.7064097686E+01    1.7803516987E+01    1.8584349740E+01    1.9405474051E+01    2.0265590795E+01    2.1163212496E+01    2.2096653408E+01    2.3064020999E+01    2.4063209000E+01    2.5091892196E+01    2.6147523091E+01    2.7227330580E+01    2.8328320736E+01    2.9447279796E+01    3.0580779408E+01    3.1725184186E+01    3.2876661575E+01    3.4031194033E+01    3.518459 [...]
+    1.0260727081E+01    1.0794194284E+01    1.1377986648E+01    1.2011664514E+01    1.2694681429E+01    1.3426369970E+01    1.4205927547E+01    1.5032402375E+01    1.5904679867E+01    1.6821469638E+01    1.7781293353E+01    1.8782473625E+01    1.9823124168E+01    2.0901141395E+01    2.2014197641E+01    2.3159736176E+01    2.4334968163E+01    2.5536871679E+01    2.6762192920E+01    2.8007449668E+01    2.9268937089E+01    3.0542735906E+01    3.1824722954E+01    3.3110584112E+01    3.439582 [...]
+    7.7472358036E+00    8.3437316128E+00    8.9958560665E+00    9.7029693232E+00    1.0464310287E+01    1.1278983196E+01    1.2145944224E+01    1.3063988311E+01    1.4031736439E+01    1.5047623569E+01    1.6109887453E+01    1.7216558521E+01    1.8365451054E+01    1.9554155821E+01    2.0780034365E+01    2.2040215085E+01    2.3331591281E+01    2.4650821260E+01    2.5994330633E+01    2.7358316868E+01    2.8738756176E+01    3.0131412743E+01    3.1531850347E+01    3.2935446327E+01    3.433740 [...]
+    5.9503654904E+00    6.6119308744E+00    7.3343275858E+00    8.1166421792E+00    8.9578224140E+00    9.8566653535E+00    1.0811805552E+01    1.1821703533E+01    1.2884634766E+01    1.3998679342E+01    1.5161712558E+01    1.6371396598E+01    1.7625173502E+01    1.8920259604E+01    2.0253641592E+01    2.1622074362E+01    2.3022080773E+01    2.4449953442E+01    2.5901758664E+01    2.7373342525E+01    2.8860339277E+01    3.0358181989E+01    3.1862115478E+01    3.3367211515E+01    3.486838 [...]
+    4.8001904839E+00    5.5259716233E+00    6.3174886689E+00    7.1735017936E+00    8.0926128961E+00    9.0732558119E+00    1.0113686705E+01    1.1211974827E+01    1.2365993835E+01    1.3573413850E+01    1.4831694452E+01    1.6138078777E+01    1.7489588899E+01    1.8883022647E+01    2.0314952016E+01    2.1781723295E+01    2.3279459044E+01    2.4804062009E+01    2.6351221061E+01    2.7916419223E+01    2.9494943824E+01    3.1081898793E+01    3.2672219093E+01    3.4260687266E+01    3.584195 [...]
+    4.2118701749E+00    4.9984724759E+00    5.8552505819E+00    6.7806052508E+00    7.7727586213E+00    8.8297469864E+00    9.9494138527E+00    1.1129403451E+01    1.2367154872E+01    1.3659896980E+01    1.5004644288E+01    1.6398193933E+01    1.7837123903E+01    1.9317792671E+01    2.0836340340E+01    2.2388691434E+01    2.3970559420E+01    2.5577453052E+01    2.7204684598E+01    2.8847379999E+01    3.0500490978E+01    3.2158809115E+01    3.3816981863E+01    3.5469530467E+01    3.711086 [...]
+    4.0906022615E+00    4.9324686046E+00    5.8483510848E+00    6.8362765129E+00    7.8940728536E+00    9.0193648641E+00    1.0209570132E+01    1.1461895653E+01    1.2773335098E+01    1.4140666899E+01    1.5560453304E+01    1.7029040526E+01    1.8542560106E+01    2.0096931616E+01    2.1687866797E+01    2.3310875222E+01    2.4961271569E+01    2.6634184564E+01    2.8324567628E+01    3.0027211276E+01    3.1736757256E+01    3.3447714442E+01    3.5154476423E+01    3.6851340776E+01    3.853252 [...]
+    4.3364458540E+00    5.2262470068E+00    6.1932018786E+00    7.2349657733E+00    8.3489759174E+00    9.5324501297E+00    1.0782386004E+01    1.2095560720E+01    1.3468531608E+01    1.4897637559E+01    1.6379001420E+01    1.7908533451E+01    1.9481935959E+01    2.1094709186E+01    2.2742158536E+01    2.4419403201E+01    2.6121386248E+01    2.7842886194E+01    2.9578530110E+01    3.1322808247E+01    3.3070090191E+01    3.4814642507E+01    3.6550647850E+01    3.8272225466E+01    3.997345 [...]
+    4.8488433400E+00    5.7778694861E+00    6.7864118758E+00    7.8717719556E+00    9.0310156247E+00    1.0260974971E+01    1.1558250630E+01    1.2919214862E+01    1.4340015428E+01    1.5816580352E+01    1.7344623654E+01    1.8919652124E+01    2.0536973211E+01    2.2191704079E+01    2.3878781889E+01    2.5592975347E+01    2.7328897541E+01    2.9081020090E+01    3.0843688605E+01    3.2611139461E+01    3.4377517834E+01    3.6136896995E+01    3.7883298776E+01    3.9610715169E+01    4.131313 [...]
+    5.5306970980E+00    6.4892406221E+00    7.5288448694E+00    8.6464883521E+00    9.8388989699E+00    1.1102558730E+01    1.2433709194E+01    1.3828357722E+01    1.5282284553E+01    1.6791050811E+01    1.8350007453E+01    1.9954305231E+01    2.1598905695E+01    2.3278593282E+01    2.4987988499E+01    2.6721562227E+01    2.8473651153E+01    3.0238474316E+01    3.2010150750E+01    3.3782718207E+01    3.5550152909E+01    3.7306390276E+01    3.9045346569E+01    4.0760941370E+01    4.244712 [...]
+    6.2918871328E+00    7.2696081063E+00    8.3291004077E+00    9.4670617553E+00    1.0679927114E+01    1.1963876212E+01    1.3314841879E+01    1.4728519239E+01    1.6200375796E+01    1.7725662434E+01    1.9299425357E+01    2.0916518996E+01    2.2571619880E+01    2.4259241498E+01    2.5973750133E+01    2.7709381667E+01    2.9460259342E+01    3.1220412441E+01    3.2983795867E+01    3.4744310553E+01    3.6495824671E+01    3.8232195555E+01    3.9947292275E+01    4.1635018763E+01    4.328933 [...]
+    7.0521472336E+00    8.0384144272E+00    9.1063383626E+00    1.0252387200E+01    1.1472757526E+01    1.2763384383E+01    1.4119952210E+01    1.5537906685E+01    1.7012467482E+01    1.8538641958E+01    2.0111239739E+01    2.1724888238E+01    2.3374049051E+01    2.5053035246E+01    2.6756029504E+01    2.8477103083E+01    3.0210235571E+01    3.1949335370E+01    3.3688260878E+01    3.5420842280E+01    3.7140903908E+01    3.8842287063E+01    4.0518873241E+01    4.2164607647E+01    4.377352 [...]
+    7.7432490963E+00    8.7274507592E+00    9.7923995858E+00    1.0934392374E+01    1.2149449113E+01    1.3433325182E+01    1.4781524515E+01    1.6189313702E+01    1.7651737035E+01    1.9163632457E+01    2.0719648396E+01    2.2314261459E+01    2.3941794940E+01    2.5596438120E+01    2.7272266292E+01    2.8963261475E+01    3.0663333757E+01    3.2366343196E+01    3.4066122219E+01    3.5756498443E+01    3.7431317829E+01    3.9084468093E+01    4.0709902271E+01    4.2301662347E+01    4.385390 [...]
+    8.3104748427E+00    9.2822948960E+00    1.0333206022E+01    1.1459396700E+01    1.2656777114E+01    1.3920993095E+01    1.5247441080E+01    1.6631284033E+01    1.8067468299E+01    1.9550741358E+01    2.1075670421E+01    2.2636661820E+01    2.4227981152E+01    2.5843774101E+01    2.7478087882E+01    2.9124893243E+01    3.0778106947E+01    3.2431614654E+01    3.4079294130E+01    3.5715038692E+01    3.7332780795E+01    3.8926515678E+01    4.0490324958E+01    4.2018400084E+01    4.350506 [...]
+    8.7133874620E+00    9.6630441191E+00    1.0689452648E+01    1.1788759073E+01    1.2956833417E+01    1.4189284936E+01    1.5481478388E+01    1.6828551273E+01    1.8225431998E+01    1.9666858904E+01    2.1147400100E+01    2.2661474036E+01    2.4203370736E+01    2.5767273642E+01    2.7347281957E+01    2.8937433440E+01    3.0531727541E+01    3.2124148811E+01    3.3708690470E+01    3.5279378072E+01    3.6830293134E+01    3.8355596660E+01    3.9849552447E+01    4.1306550069E+01    4.272112 [...]
+    8.9259349858E+00    9.8443801076E+00    1.0836629748E+01    1.1898854230E+01    1.3026953891E+01    1.4216575125E+01    1.5463127449E+01    1.6761801535E+01    1.8107588140E+01    1.9495297866E+01    2.0919581676E+01    2.2374952084E+01    2.3855804944E+01    2.5356441753E+01    2.6871092374E+01    2.8393938097E+01    2.9919134938E+01    3.1440837086E+01    3.2953220400E+01    3.4450505850E+01    3.5926982814E+01    3.7377032124E+01    3.8795148753E+01    4.0175964063E+01    4.151426 [...]
+    8.9359469446E+00    9.8150256285E+00    1.0764436547E+01    1.1780440180E+01    1.2859036611E+01    1.3995981871E+01    1.5186805276E+01    1.6426827714E+01    1.7711180779E+01    1.9034826704E+01    2.0392578990E+01    2.1779123648E+01    2.3189040980E+01    2.4616827793E+01    2.6056919952E+01    2.7503715195E+01    2.8951596089E+01    3.0394953039E+01    3.1828207258E+01    3.3245833581E+01    3.4642383034E+01    3.6012505058E+01    3.7350969281E+01    3.8652686747E+01    3.991273 [...]
+    8.7441002690E+00    9.5766712472E+00    1.0475665601E+01    1.1437497310E+01    1.2458332894E+01    1.3534107541E+01    1.4660542199E+01    1.5833161562E+01    1.7047312874E+01    1.8298185457E+01    1.9580830891E+01    2.0890183756E+01    2.2221082832E+01    2.3568292686E+01    2.4926525526E+01    2.6290463245E+01    2.7654779549E+01    2.9014162066E+01    3.0363334345E+01    3.1697077647E+01    3.3010252418E+01    3.4297819360E+01    3.5554860002E+01    3.6776596671E+01    3.795841 [...]
+    8.3624459296E+00    9.1424642892E+00    9.9846511769E+00    1.0885633479E+01    1.1841806593E+01    1.2849349853E+01    1.3904242862E+01    1.5002282651E+01    1.6139101602E+01    1.7310186039E+01    1.8510895407E+01    1.9736481960E+01    2.0982110859E+01    2.2242880585E+01    2.3513843595E+01    2.4790027102E+01    2.6066453898E+01    2.7338163125E+01    2.8600230898E+01    2.9847790678E+01    3.1076053320E+01    3.2280326687E+01    3.3456034751E+01    3.4598736091E+01    3.570414 [...]
+    7.8125970616E+00    8.5351615893E+00    9.3153840170E+00    1.0150158370E+01    1.1036165841E+01    1.1969889046E+01    1.2947627095E+01    1.3965511440E+01    1.5019522395E+01    1.6105506273E+01    1.7219193051E+01    1.8356214486E+01    1.9512122600E+01    2.0682408436E+01    2.1862521023E+01    2.3047886434E+01    2.4233926876E+01    2.5416079707E+01    2.6589816296E+01    2.7750660652E+01    2.8894207718E+01    3.0016141260E+01    3.1112251276E+01    3.2178450817E+01    3.321079 [...]
+    7.1236840988E+00    7.7850521930E+00    8.4993993112E+00    9.2639346642E+00    1.0075675575E+01    1.0931460118E+01    1.1827960497E+01    1.2761697096E+01    1.3729053133E+01    1.4726289869E+01    1.5749562277E+01    1.6794935114E+01    1.7858399328E+01    1.8935888707E+01    2.0023296709E+01    2.1116493391E+01    2.2211342359E+01    2.3303717668E+01    2.4389520587E+01    2.5464696160E+01    2.6525249486E+01    2.7567261651E+01    2.8586905227E+01    2.9580459289E+01    3.054432 [...]
+    6.3301827227E+00    6.9277563021E+00    7.5735446995E+00    8.2651133717E+00    8.9998586882E+00    9.7750185691E+00    1.0587683750E+01    1.1434809626E+01    1.2313228620E+01    1.3219663026E+01    1.4150738259E+01    1.5102996469E+01    1.6072910449E+01    1.7056897773E+01    1.8051335114E+01    1.9052572665E+01    2.0056948616E+01    2.1060803608E+01    2.2060495107E+01    2.3052411645E+01    2.4032986851E+01    2.4998713222E+01    2.5946155569E+01    2.6871964087E+01    2.777288 [...]
+    5.4697165449E+00    6.0020027190E+00    6.5777308997E+00    7.1948562800E+00    7.8511891784E+00    8.5444033307E+00    9.2720446911E+00    1.0031540707E+01    1.0820210028E+01    1.1635272623E+01    1.2473860239E+01    1.3333027192E+01    1.4209761424E+01    1.5100995787E+01    1.6003619522E+01    1.6914489860E+01    1.7830443731E+01    1.8748309510E+01    1.9664918761E+01    2.0577117936E+01    2.1481779974E+01    2.2375815761E+01    2.3256185401E+01    2.4119909251E+01    2.496407 [...]
+    4.5809288503E+00    5.0474793116E+00    5.5527596813E+00    6.0951404352E+00    6.6728723468E+00    7.2840921476E+00    7.9268285688E+00    8.5990087451E+00    9.2984649642E+00    1.0022941741E+01    1.0770103195E+01    1.1537540712E+01    1.2322780863E+01    1.3123293559E+01    1.3936500412E+01    1.4759783283E+01    1.5590492985E+01    1.6425958107E+01    1.7263493944E+01    1.8100411490E+01    1.8934026472E+01    1.9761668384E+01    2.0580689502E+01    2.1388473838E+01    2.218244 [...]
+    3.7015070015E+00    4.1028401652E+00    4.5383129054E+00    5.0067284125E+00    5.5067958584E+00    6.0371332009E+00    6.5962702337E+00    7.1826518841E+00    7.7946417622E+00    8.4305259617E+00    9.0885171141E+00    9.7667586960E+00    1.0463329589E+01    1.1176248888E+01    1.1903480959E+01    1.2642940731E+01    1.3392499233E+01    1.4149989350E+01    1.4913211798E+01    1.5679941305E+01    1.6447932987E+01    1.7214928899E+01    1.7978664745E+01    1.8736876736E+01    1.948730 [...]
+    2.8664299053E+00    3.2039397658E+00    3.5711729024E+00    3.9673745542E+00    4.3917217048E+00    4.8433228686E+00    5.3212179829E+00    5.8243784327E+00    6.3517072307E+00    6.9020393787E+00    7.4741424351E+00    8.0667173109E+00    8.6783993187E+00    9.3077594956E+00    9.9533062189E+00    1.0613487134E+01    1.1286691412E+01    1.1971252342E+01    1.2665450288E+01    1.3367515990E+01    1.4075634248E+01    1.4787947959E+01    1.5502562531E+01    1.6217550652E+01    1.693095 [...]
+    2.1064939522E+00    2.3823494727E+00    2.6837292608E+00    3.0103220347E+00    3.3617736873E+00    3.7376839577E+00    4.1376030682E+00    4.5610283757E+00    5.0074010863E+00    5.4761030828E+00    5.9664539132E+00    6.4777079910E+00    7.0090520535E+00    7.5596029258E+00    8.1284056343E+00    8.7144319123E+00    9.3165791365E+00    9.9336697310E+00    1.0564451071E+01    1.1207595913E+01    1.1861703382E+01    1.2525300522E+01    1.3196844441E+01    1.3874725046E+01    1.455726 [...]
+    1.4471567993E+00    1.6641954052E+00    1.9028108805E+00    2.1631292956E+00    2.4452586140E+00    2.7492822148E+00    3.0752522427E+00    3.4231828570E+00    3.7930434532E+00    4.1847519321E+00    4.5981680912E+00    5.0330872128E+00    5.4892339226E+00    5.9662563921E+00    6.4637209522E+00    6.9811071864E+00    7.5178035663E+00    8.0731036882E+00    8.6462031644E+00    9.2361972188E+00    9.8420790293E+00    1.0462738854E+01    1.1096963973E+01    1.1743439462E+01    1.240074 [...]
+    9.0772196991E-01    1.0693404112E+00    1.2488656059E+00    1.4468477805E+00    1.6638427146E+00    1.9004021450E+00    2.1570638619E+00    2.4343415915E+00    2.7327147669E+00    3.0526182827E+00    3.3944323385E+00    3.7584724688E+00    4.1449798602E+00    4.5541120535E+00    4.9859341252E+00    5.4404104403E+00    5.9173970618E+00    6.4166349002E+00    6.9377436775E+00    7.4802167748E+00    8.0434170256E+00    8.6265735083E+00    9.2287793840E+00    9.8489908159E+00    1.048602 [...]
+    5.0087118200E-01    6.1091666369E-01    7.3549358938E-01    8.7555667601E-01    1.0320884924E+00    1.2060868336E+00    1.3985516576E+00    1.6104717038E+00    1.8428109160E+00    2.0964947953E+00    2.3723968084E+00    2.6713249784E+00    2.9940087817E+00    3.3410864749E+00    3.7130929710E+00    4.1104483796E+00    4.5334473218E+00    4.9822491225E+00    5.4568689782E+00    5.9571701870E+00    6.4828575222E+00    7.0334718190E+00    7.6083858350E+00    8.2068014339E+00    8.827748 [...]
+    2.3253619370E-01    2.9520028363E-01    3.6932534224E-01    4.5624513981E-01    5.5734197505E-01    6.7403116484E-01    8.0774497419E-01    9.5991612902E-01    1.1319610582E+00    1.3252630140E+00    1.5411552211E+00    1.7809042059E+00    2.0456934532E+00    2.3366075402E+00    2.6546168882E+00    3.0005632721E+00    3.3751462191E+00    3.7789104212E+00    4.2122342785E+00    4.6753196807E+00    5.1681831227E+00    5.6906482418E+00    6.2423398492E+00    6.8226795190E+00    7.430882 [...]
+    1.0208831702E-01    1.2180572390E-01    1.5022175887E-01    1.8901880585E-01    2.3994661789E-01    3.0480411735E-01    3.8542052413E-01    4.8363597589E-01    6.0128180889E-01    7.4016067153E-01    9.0202664366E-01    1.0885655355E+00    1.3013755386E+00    1.5419483979E+00    1.8116512712E+00    2.1117094348E+00    2.4431899887E+00    2.8069867061E+00    3.2038061622E+00    3.6341552663E+00    4.0983303113E+00    4.5964076406E+00    5.1282360182E+00    5.6934307770E+00    6.291369 [...]
+    1.0281203505E-01    8.4165936526E-02    7.1761678651E-02    6.7595638127E-02    7.3748398516E-02    9.2364101108E-02    1.2562902242E-01    1.7574956227E-01    2.4492983148E-01    3.3534903193E-01    4.4913882330E-01    5.8836087141E-01    7.5498477152E-01    9.5086653673E-01    1.1777278375E+00    1.4371361714E+00    1.7304861355E+00    2.0589819630E+00    2.4236214775E+00    2.8251816045E+00    3.2642055679E+00    3.7409918845E+00    4.2555852559E+00    4.8077694401E+00    5.397062 [...]
+    2.2261970318E-01    1.7025489721E-01    1.2197311897E-01    8.0046787835E-02    4.6847244881E-02    2.4821932861E-02    1.6470713751E-02    2.4321525535E-02    5.0905585538E-02    9.8732351501E-02    1.7026445369E-01    2.6789281167E-01    3.9391214778E-01    5.5049710623E-01    7.3967918151E-01    9.6332465313E-01    1.2231137155E+00    1.5205209812E+00    1.8567975257E+00    2.2329546266E+00    2.6497493389E+00    3.1076720308E+00    3.6069359886E+00    4.1474691823E+00    4.728908 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_pyramid_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_pyramid_BA.inp
new file mode 100644
index 0000000..cfd0d4b
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_pyramid_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_pyramid_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+pyramid                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_sphere_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_sphere_BA.ima
new file mode 100644
index 0000000..d38850c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_sphere_BA.ima
@@ -0,0 +1,100 @@
+    9.0609493491E+03    8.9232060605E+03    8.7742964289E+03    8.6147598908E+03    8.4451708549E+03    8.2661370752E+03    8.0782954999E+03    7.8823061137E+03    7.6788532450E+03    7.4686374100E+03    7.2523763211E+03    7.0307989119E+03    6.8046412315E+03    6.5746446443E+03    6.3415507500E+03    6.1060991277E+03    5.8690227118E+03    5.6310463983E+03    5.3928806342E+03    5.1552211016E+03    4.9187439959E+03    4.6841056247E+03    4.4519352968E+03    4.2228368879E+03    3.997385 [...]
+    9.0386066273E+03    8.9011735112E+03    8.7525981639E+03    8.5934206623E+03    8.4242144249E+03    8.2455842393E+03    8.0581674193E+03    7.8626211190E+03    7.6596291302E+03    7.4498905749E+03    7.2341209640E+03    7.0130476051E+03    6.7874055539E+03    6.5579336114E+03    6.3253735204E+03    6.0904618869E+03    5.8539306417E+03    5.6165031229E+03    5.3788873305E+03    5.1417784119E+03    4.9058511745E+03    4.6717589856E+03    4.4401315776E+03    4.2115708660E+03    3.986650 [...]
+    8.9718602038E+03    8.8353527658E+03    8.6877789159E+03    8.5296750008E+03    8.3616106847E+03    8.1841894459E+03    7.9980404648E+03    7.8038196044E+03    7.6022043155E+03    7.3938912480E+03    7.1795901453E+03    6.9600234723E+03    6.7359228699E+03    6.5080216299E+03    6.2770554965E+03    6.0437575131E+03    5.8088554287E+03    5.5730664276E+03    5.3370952954E+03    5.1016312233E+03    4.8673460969E+03    4.6348878290E+03    4.4048818004E+03    4.1779272792E+03    3.954592 [...]
+    8.8615568527E+03    8.7265797915E+03    8.5806619617E+03    8.4243333926E+03    8.2581600193E+03    8.0827353750E+03    7.8986843530E+03    7.7066550491E+03    7.5073182971E+03    7.3013624371E+03    7.0894903274E+03    6.8724164304E+03    6.6508636923E+03    6.4255593458E+03    6.1972301624E+03    5.9666014980E+03    5.7343931324E+03    5.5013146310E+03    5.2680624410E+03    5.0353192336E+03    4.8037484964E+03    4.5739920707E+03    4.3466683331E+03    4.1223682009E+03    3.901655 [...]
+    8.7090863208E+03    8.5762283397E+03    8.4326035773E+03    8.2787337248E+03    8.1151743979E+03    7.9425146898E+03    7.7613663609E+03    7.5723707772E+03    7.3761869104E+03    7.1734932170E+03    6.9649825539E+03    6.7513592565E+03    6.5333336537E+03    6.3116229039E+03    6.0869425629E+03    5.8600079905E+03    5.6315268290E+03    5.4021980608E+03    5.1727089045E+03    4.9437300843E+03    4.7159155091E+03    4.4898968343E+03    4.2662824524E+03    4.0456558267E+03    3.828570 [...]
+    8.5163602065E+03    8.3861851063E+03    8.2454626995E+03    8.0947055252E+03    7.9344596545E+03    7.7652992552E+03    7.5878288648E+03    7.4026740493E+03    7.2104825688E+03    7.0119194900E+03    6.8076647681E+03    6.5984086209E+03    6.3848483948E+03    6.1676867211E+03    5.9476264869E+03    5.7253678909E+03    5.5016048905E+03    5.2770230109E+03    5.0522957721E+03    4.8280817887E+03    4.6050204341E+03    4.3837321197E+03    4.1648129726E+03    3.9488335239E+03    3.736337 [...]
+    8.2857756041E+03    8.1588179006E+03    8.0215773842E+03    7.8745534409E+03    7.7182786310E+03    7.5533158996E+03    7.3802543268E+03    7.1997044297E+03    7.0123002227E+03    6.8186897958E+03    6.6195377480E+03    6.4155172263E+03    6.2073110201E+03    5.9956029693E+03    5.7810800689E+03    5.5644258473E+03    5.3463182390E+03    5.1274254333E+03    4.9084059500E+03    4.6899008305E+03    4.4725361009E+03    4.2569155741E+03    4.0436208325E+03    3.8332097109E+03    3.626210 [...]
+    8.0201737169E+03    7.8969326465E+03    7.7637133204E+03    7.6210015046E+03    7.4693143886E+03    7.3091997619E+03    7.1412296712E+03    6.9659991834E+03    6.7841220946E+03    6.5962314630E+03    6.4029719568E+03    6.2049973860E+03    6.0029714652E+03    5.7975605170E+03    5.5894306243E+03    5.3792467115E+03    5.1676665889E+03    4.9553413399E+03    4.7429090578E+03    4.5309939778E+03    4.3202024214E+03    4.1111213142E+03    3.9043168023E+03    3.7003289831E+03    3.499672 [...]
+    7.7227876934E+03    7.6037227833E+03    7.4750200751E+03    7.3371516443E+03    7.1906179007E+03    7.0359485892E+03    6.8736972549E+03    6.7044403199E+03    6.5287720861E+03    6.3473043570E+03    6.1606612401E+03    5.9694762367E+03    5.7743907039E+03    5.5760491567E+03    5.3750965986E+03    5.1721758246E+03    4.9679244573E+03    4.7629700912E+03    4.5579307445E+03    4.3534101341E+03    4.1499951559E+03    3.9482523763E+03    3.7487288882E+03    3.5519468318E+03    3.358402 [...]
+    7.3971865033E+03    7.2827105926E+03    7.1589727334E+03    7.0264263893E+03    6.8855558366E+03    6.7368702085E+03    6.5809031130E+03    6.4182097934E+03    6.2493636070E+03    6.0749523099E+03    5.8955783985E+03    5.7118515625E+03    5.5243895618E+03    5.3338134540E+03    5.1407439512E+03    4.9457998648E+03    4.7495947429E+03    4.5527340764E+03    4.3558119197E+03    4.1594088096E+03    3.9640900331E+03    3.7704011249E+03    3.5788675380E+03    3.3899920207E+03    3.204252 [...]
+    7.0472104182E+03    6.9376883443E+03    6.8193097040E+03    6.6925099405E+03    6.5577519477E+03    6.4155247135E+03    6.2663402778E+03    6.1107301536E+03    5.9492453412E+03    5.7824494490E+03    5.6109189764E+03    5.4352385852E+03    5.2560014532E+03    5.0738020660E+03    4.8892350934E+03    4.7028943706E+03    4.5153676232E+03    4.3272341369E+03    4.1390638644E+03    3.9514125327E+03    3.7648213377E+03    3.5798127191E+03    3.3968902065E+03    3.2165334820E+03    3.039200 [...]
+    6.6769082678E+03    6.5726537976E+03    6.4599730413E+03    6.3392812831E+03    6.2110213938E+03    6.0756602035E+03    5.9336852215E+03    5.7856049764E+03    5.6319440418E+03    5.4732402269E+03    5.3100451982E+03    5.1429155610E+03    4.9724170408E+03    4.7991168385E+03    4.6235828131E+03    4.4463802346E+03    4.2680698102E+03    4.0892041777E+03    3.9103267604E+03    3.7319668824E+03    3.5546398378E+03    3.3788439882E+03    3.2050583484E+03    3.0337404444E+03    2.865326 [...]
+    6.2904651868E+03    6.1917376313E+03    6.0850348384E+03    5.9707523073E+03    5.8493092113E+03    5.7211507041E+03    5.5867382578E+03    5.4465559741E+03    5.3011011304E+03    5.1508850242E+03    4.9964297619E+03    4.8382658312E+03    4.6769294322E+03    4.5129584359E+03    4.3468922487E+03    4.1792674690E+03    4.0106158128E+03    3.8414614079E+03    3.6723189931E+03    3.5036917515E+03    3.3360679361E+03    3.1699195174E+03    3.0057004059E+03    2.8438441884E+03    2.684763 [...]
+    5.8921350559E+03    5.7991381050E+03    5.6986346636E+03    5.5909968603E+03    5.4766224837E+03    5.3559303290E+03    5.2293582688E+03    5.0973624097E+03    4.9604126075E+03    4.8189923249E+03    4.6735950777E+03    4.5247214517E+03    4.3728770493E+03    4.2185713185E+03    4.0623121709E+03    3.9046063410E+03    3.7459566739E+03    3.5868566829E+03    3.4277927628E+03    3.2692394022E+03    3.1116568759E+03    2.9554899780E+03    2.8011668788E+03    2.6490965288E+03    2.499667 [...]
+    5.4861697554E+03    5.3990525313E+03    5.3049085962E+03    5.2040871461E+03    5.0969631606E+03    4.9839292115E+03    4.8653978320E+03    4.7417964499E+03    4.6135682675E+03    4.4811666771E+03    4.3450551725E+03    4.2057039822E+03    4.0635892800E+03    3.9191877057E+03    3.7729778028E+03    3.6254349419E+03    3.4770303472E+03    3.3282285996E+03    3.1794850747E+03    3.0312455467E+03    2.8839412296E+03    2.7379901828E+03    2.5937931988E+03    2.4517329635E+03    2.312173 [...]
+    5.0767534544E+03    4.9956094331E+03    4.9079245958E+03    4.8140270978E+03    4.7142661613E+03    4.6090100659E+03    4.4986435497E+03    4.3835658780E+03    4.2641925628E+03    4.1409453533E+03    4.0142594680E+03    3.8845731223E+03    3.7523308452E+03    3.6179790252E+03    3.4819635940E+03    3.3447284054E+03    3.2067140726E+03    3.0683541515E+03    2.9300732736E+03    2.7922870674E+03    2.6553986355E+03    2.5197969227E+03    2.3858557241E+03    2.2539327004E+03    2.124365 [...]
+    4.6679373706E+03    4.5928042937E+03    4.5116204433E+03    4.4246905741E+03    4.3323393245E+03    4.2349079049E+03    4.1327553496E+03    4.0262530194E+03    3.9157855782E+03    3.8017461980E+03    3.6845378618E+03    3.5645692560E+03    3.4422519425E+03    3.3180012426E+03    3.1922310434E+03    3.0653540018E+03    2.9377781850E+03    2.8099059755E+03    2.6821316264E+03    2.5548409839E+03    2.4284072285E+03    2.3031915261E+03    2.1795398287E+03    2.0577832628E+03    1.938235 [...]
+    4.2635785845E+03    4.1944429320E+03    4.1197442858E+03    4.0397644504E+03    3.9548031367E+03    3.8651762333E+03    3.7712151715E+03    3.6732629644E+03    3.5716743485E+03    3.4668137511E+03    3.3590520589E+03    3.2487674873E+03    3.1363400208E+03    3.0221527319E+03    2.9065876495E+03    2.7900253353E+03    2.6728422392E+03    2.5554105674E+03    2.4380930558E+03    2.3212452192E+03    2.2052109736E+03    2.0903238230E+03    1.9769017964E+03    1.8652498863E+03    1.755656 [...]
+    3.8672883538E+03    3.8040860287E+03    3.7358025566E+03    3.6626971084E+03    3.5850446682E+03    3.5031360459E+03    3.4172741792E+03    3.3277748820E+03    3.2349638134E+03    3.1391751070E+03    3.0407495384E+03    2.9400335725E+03    2.8373763922E+03    2.7331289287E+03    2.6276416815E+03    2.5212636886E+03    2.4143405534E+03    2.3072118074E+03    2.2002115568E+03    2.0936644182E+03    1.9878857034E+03    1.8831804961E+03    1.7798398718E+03    1.6781427523E+03    1.578352 [...]
+    3.4823833092E+03    3.4250021648E+03    3.3630127603E+03    3.2966510952E+03    3.2261687515E+03    3.1518294061E+03    3.0739106380E+03    2.9926998893E+03    2.9084947213E+03    2.8215990308E+03    2.7323240352E+03    2.6409848830E+03    2.5478997227E+03    2.4533890517E+03    2.3577715231E+03    2.2613653484E+03    2.1644850297E+03    2.0674399434E+03    1.9705334170E+03    1.8740614141E+03    1.7783107717E+03    1.6835580032E+03    1.5900685814E+03    1.4980949968E+03    1.407877 [...]
+    3.1118437227E+03    3.0601295155E+03    3.0042660384E+03    2.9444672162E+03    2.8809607222E+03    2.8139865310E+03    2.7437948578E+03    2.6706465249E+03    2.5948101534E+03    2.5165614785E+03    2.4361820696E+03    2.3539569024E+03    2.2701744648E+03    2.1851238606E+03    2.0990937349E+03    2.0123713136E+03    1.9252408846E+03    1.8379828831E+03    1.7508705170E+03    1.6641717330E+03    1.5781450044E+03    1.4930397605E+03    1.4090957719E+03    1.3265409827E+03    1.245590 [...]
+    2.7582838395E+03    2.7120413677E+03    2.6620926204E+03    2.6086302610E+03    2.5518584157E+03    2.4919925883E+03    2.4292582738E+03    2.3638890427E+03    2.2961267293E+03    2.2262191597E+03    2.1544184678E+03    2.0809813465E+03    2.0061661295E+03    1.9302325275E+03    1.8534395212E+03    1.7760451555E+03    1.6983041904E+03    1.6204679271E+03    1.5427815521E+03    1.4654846856E+03    1.3888093855E+03    1.3129790384E+03    1.2382077303E+03    1.1646995285E+03    1.092647 [...]
+    2.4239247954E+03    2.3829242246E+03    2.3386417291E+03    2.2912483121E+03    2.2409259673E+03    2.1878668966E+03    2.1322720062E+03    2.0743496538E+03    2.0143147661E+03    1.9523882347E+03    1.8887947756E+03    1.8237628993E+03    1.7575224704E+03    1.6903045399E+03    1.6223400315E+03    1.5538582581E+03    1.4850856503E+03    1.4162456162E+03    1.3475562737E+03    1.2792305436E+03    1.2114745025E+03    1.1444864316E+03    1.0784564886E+03    1.0135653025E+03    9.499840 [...]
+    2.1105794686E+03    2.0745614114E+03    2.0356634427E+03    1.9940367058E+03    1.9498419930E+03    1.9032488503E+03    1.8544347615E+03    1.8035834631E+03    1.7508849137E+03    1.6965339933E+03    1.6407290257E+03    1.5836713962E+03    1.5255640778E+03    1.4666107161E+03    1.4070150022E+03    1.3469789053E+03    1.2867023395E+03    1.2263815955E+03    1.1662092906E+03    1.1063724250E+03    1.0470525301E+03    9.8842409593E+02    9.3065411367E+02    8.7390154348E+02    8.183164 [...]
+    1.8196469053E+03    1.7883263923E+03    1.7545042592E+03    1.7183126390E+03    1.6798923236E+03    1.6393915415E+03    1.5969651973E+03    1.5527738862E+03    1.5069836813E+03    1.4597645347E+03    1.4112899088E+03    1.3617356714E+03    1.3112790247E+03    1.2600977698E+03    1.2083694141E+03    1.1562704305E+03    1.1039750813E+03    1.0516546557E+03    9.9947680832E+02    9.4760486702E+02    8.9619652185E+02    8.4540391386E+02    7.9537242662E+02    7.4624006069E+02    6.981374 [...]
+    1.5521121026E+03    1.5251836599E+03    1.4961067150E+03    1.4649957608E+03    1.4319720641E+03    1.3971638662E+03    1.3607048152E+03    1.3227339774E+03    1.2833945159E+03    1.2428333003E+03    1.2012002812E+03    1.1586468635E+03    1.1153263120E+03    1.0713918786E+03    1.0269968938E+03    9.8229335581E+02    9.3743169193E+02    8.9255936202E+02    8.4782107127E+02    8.0335716569E+02    7.5930388864E+02    7.1579172896E+02    6.7294606586E+02    6.3088540981E+02    5.897219 [...]
+    1.3085548006E+03    1.2856979573E+03    1.2610195052E+03    1.2346167985E+03    1.2065935342E+03    1.1770588739E+03    1.1461268611E+03    1.1139158751E+03    1.0805481943E+03    1.0461488543E+03    1.0108454446E+03    9.7476731018E+02    9.3804475425E+02    9.0080834033E+02    8.6318872881E+02    8.2531505194E+02    7.8731551569E+02    7.4931564874E+02    7.1143826975E+02    6.7380301499E+02    6.3652525030E+02    5.9971626150E+02    5.6348209986E+02    5.2792361337E+02    4.931358 [...]
+    1.0891664913E+03    1.0700507229E+03    1.0494130048E+03    1.0273349873E+03    1.0039035772E+03    9.7921060619E+02    9.5335174856E+02    9.2642653055E+02    8.9853720846E+02    8.6978898455E+02    8.4028891716E+02    8.1014541988E+02    7.7946779652E+02    7.4836556016E+02    7.1694823444E+02    6.8532413877E+02    6.5360058627E+02    6.2188273390E+02    5.9027369702E+02    5.5887334252E+02    5.2777850096E+02    4.9708203176E+02    4.6687279097E+02    4.3723500020E+02    4.082481 [...]
+    8.9377277806E+02    8.7806251050E+02    8.6110216028E+02    8.4295921609E+02    8.2370512685E+02    8.0341562477E+02    7.8216958598E+02    7.6004891508E+02    7.3713796301E+02    7.1352336243E+02    6.8929314249E+02    6.6453684224E+02    6.3934422407E+02    6.1380552183E+02    5.8801094079E+02    5.6204967772E+02    5.3600976750E+02    5.0997810951E+02    4.8403916262E+02    4.5827517540E+02    4.3276574216E+02    4.0758722672E+02    3.8281243773E+02    3.5851074612E+02    3.347471 [...]
+    7.2186325870E+02    7.0922209953E+02    6.9557537082E+02    6.8097718619E+02    6.6548541760E+02    6.4916076179E+02    6.3206686829E+02    6.1426957592E+02    5.9583691913E+02    5.7683850372E+02    5.5734533801E+02    5.3742924700E+02    5.1716268182E+02    4.9661822225E+02    4.7586841972E+02    4.5498493046E+02    4.3403877072E+02    4.1309968589E+02    3.9223554869E+02    3.7151272580E+02    3.5099495186E+02    3.3074372581E+02    3.1081762799E+02    2.9127217652E+02    2.721597 [...]
+    5.7262430024E+02    5.6271970169E+02    5.5202678246E+02    5.4058784670E+02    5.2844808665E+02    5.1565504399E+02    5.0225827467E+02    4.8830933580E+02    4.7386132149E+02    4.5896874042E+02    4.4368687621E+02    4.2807204059E+02    4.1218069622E+02    3.9606971518E+02    3.7979551688E+02    3.6341439098E+02    3.4698169211E+02    3.3055182749E+02    3.1417803364E+02    2.9791196583E+02    2.8180361042E+02    2.6590087440E+02    2.5024961069E+02    2.3489326204E+02    2.198726 [...]
+    4.4497748256E+02    4.3748456102E+02    4.2939413031E+02    4.2073790076E+02    4.1154982943E+02    4.0186544559E+02    3.9172200546E+02    3.8115811156E+02    3.7021361254E+02    3.5892935700E+02    3.4734687399E+02    3.3550835730E+02    3.2345621638E+02    3.1123307814E+02    2.9888139350E+02    2.8644331970E+02    2.7396054088E+02    2.6147387900E+02    2.4902336939E+02    2.3664781739E+02    2.2438482644E+02    2.1227051099E+02    2.0033935090E+02    1.8862405602E+02    1.771555 [...]
+    3.3761984943E+02    3.3222497086E+02    3.2639798801E+02    3.2016126304E+02    3.1353863509E+02    3.0655520069E+02    2.9923724659E+02    2.9161198899E+02    2.8370750907E+02    2.7555263958E+02    2.6717674138E+02    2.5860960167E+02    2.4988118950E+02    2.4102167218E+02    2.3206109463E+02    2.2302931348E+02    2.1395582366E+02    2.0486965996E+02    1.9579920373E+02    1.8677209008E+02    1.7781502995E+02    1.6895378933E+02    1.6021300791E+02    1.5161604335E+02    1.431850 [...]
+    2.4906635054E+02    2.4547036085E+02    2.4158345528E+02    2.3741980221E+02    2.3299452223E+02    2.2832352885E+02    2.2342349431E+02    2.1831169056E+02    2.1300606409E+02    2.0752488837E+02    2.0188692175E+02    1.9611115862E+02    1.9021675612E+02    1.8422306277E+02    1.7814927160E+02    1.7201463550E+02    1.6583814638E+02    1.5963847032E+02    1.5343404224E+02    1.4724271446E+02    1.4108194312E+02    1.3496851694E+02    1.2891854125E+02    1.2294747616E+02    1.170699 [...]
+    1.7769314231E+02    1.7561396515E+02    1.7336231161E+02    1.7094532204E+02    1.6837055033E+02    1.6564604098E+02    1.6278023168E+02    1.5978187035E+02    1.5666003222E+02    1.5342409159E+02    1.5008362592E+02    1.4664842628E+02    1.4312832962E+02    1.3953341370E+02    1.3587366309E+02    1.3215918654E+02    1.2840000648E+02    1.2460602449E+02    1.2078708743E+02    1.1695289223E+02    1.1311286044E+02    1.0927624943E+02    1.0545202727E+02    1.0164884509E+02    9.787505 [...]
+    1.2178045376E+02    1.2095524923E+02    1.2005490071E+02    1.1908056503E+02    1.1803346362E+02    1.1691494323E+02    1.1572644608E+02    1.1446953797E+02    1.1314586302E+02    1.1175716530E+02    1.1030535751E+02    1.0879241612E+02    1.0722038620E+02    1.0559151281E+02    1.0390803100E+02    1.0217237594E+02    1.0038704796E+02    9.8554619336E+01    9.6677779835E+01    9.4759317713E+01    9.2802081343E+01    9.0809021752E+01    8.8783157672E+01    8.6727581507E+01    8.464543 [...]
+    7.9554256353E+01    7.9741080292E+01    7.9930794460E+01    8.0119535667E+01    8.0303273022E+01    8.0477791164E+01    8.0638769695E+01    8.0781774729E+01    8.0902308525E+01    8.0995864053E+01    8.1057936162E+01    8.1084073824E+01    8.1069918831E+01    8.1011213836E+01    8.0903883624E+01    8.0744013011E+01    8.0527921461E+01    8.0252178855E+01    7.9913645656E+01    7.9509460731E+01    7.9037118324E+01    7.8494444718E+01    7.7879649242E+01    7.7191318964E+01    7.642844 [...]
+    4.9225801839E+01    5.0204884946E+01    5.1247363205E+01    5.2345360528E+01    5.3490550666E+01    5.4674257014E+01    5.5887461627E+01    5.7120903701E+01    5.8365134458E+01    5.9610561300E+01    6.0847559481E+01    6.2066500558E+01    6.3257834714E+01    6.4412134400E+01    6.5520202265E+01    6.6573101947E+01    6.7562206137E+01    6.8479293559E+01    6.9316560226E+01    7.0066692142E+01    7.0722944219E+01    7.1279103237E+01    7.1729606250E+01    7.2069528285E+01    7.229461 [...]
+    2.9028437951E+01    3.0602836387E+01    3.2285551216E+01    3.4065538497E+01    3.5931126221E+01    3.7870122077E+01    3.9869847553E+01    4.1917254166E+01    4.3999005818E+01    4.6101584490E+01    4.8211340959E+01    5.0314619309E+01    5.2397832101E+01    5.4447571139E+01    5.6450650921E+01    5.8394236010E+01    6.0265913701E+01    6.2053754167E+01    6.3746408950E+01    6.5333163870E+01    6.6804011268E+01    6.8149700492E+01    6.9361829429E+01    7.0432823128E+01    7.135605 [...]
+    1.7250748406E+01    1.9246631493E+01    2.1382074811E+01    2.3643652945E+01    2.6017193607E+01    2.8487844323E+01    3.1040200649E+01    3.3658375539E+01    3.6326145973E+01    3.9027030667E+01    4.1744412397E+01    4.4461626239E+01    4.7162115296E+01    4.9829485857E+01    5.2447646747E+01    5.5000884686E+01    5.7474001320E+01    5.9852364819E+01    6.2122044782E+01    6.4269854502E+01    6.6283460927E+01    6.8151443821E+01    6.9863352971E+01    7.1409791928E+01    7.278243 [...]
+    1.2265709238E+01    1.4532205490E+01    1.6957722781E+01    1.9527164847E+01    2.2224583345E+01    2.5033278984E+01    2.7935918820E+01    3.0914649213E+01    3.3951211517E+01    3.7027079546E+01    4.0123556900E+01    4.3221924778E+01    4.6303545600E+01    4.9349988969E+01    5.2343156258E+01    5.5265395937E+01    5.8099610395E+01    6.0829350646E+01    6.3438948382E+01    6.5913589524E+01    6.8239392338E+01    7.0403526663E+01    7.2394234797E+01    7.4200949928E+01    7.581431 [...]
+    1.2555353734E+01    1.4964021939E+01    1.7541227787E+01    2.0270818919E+01    2.3135735341E+01    2.6118118870E+01    2.9199441417E+01    3.2360612578E+01    3.5582128721E+01    3.8844189722E+01    4.2126828930E+01    4.5410067214E+01    4.8674007555E+01    5.1898995733E+01    5.5065736231E+01    5.8155422751E+01    6.1149828403E+01    6.4031467338E+01    6.6783677949E+01    6.9390715570E+01    7.1837852579E+01    7.4111488695E+01    7.6199205375E+01    7.8089813418E+01    7.977347 [...]
+    1.6730747979E+01    1.9174697881E+01    2.1788510174E+01    2.4555519160E+01    2.7458128794E+01    3.0477915669E+01    3.3595777651E+01    3.6792052490E+01    4.0046629967E+01    4.3339139990E+01    4.6649024641E+01    4.9955732374E+01    5.3238823559E+01    5.6478098307E+01    5.9653757933E+01    6.2746520673E+01    6.5737712415E+01    6.8609446202E+01    7.1344696502E+01    7.3927393042E+01    7.6342556261E+01    7.8576368388E+01    8.0616216391E+01    8.2450850526E+01    8.407034 [...]
+    2.3547112042E+01    2.5939833965E+01    2.8497211428E+01    3.1202517940E+01    3.4038101275E+01    3.6985500988E+01    4.0025562620E+01    4.3138590280E+01    4.6304456023E+01    4.9502762813E+01    5.2712974179E+01    5.5914542234E+01    5.9087052004E+01    6.2210381470E+01    6.5264781842E+01    6.8231063673E+01    7.1090681526E+01    7.3825878742E+01    7.6419778047E+01    7.8856507063E+01    8.1121295252E+01    8.3200545605E+01    8.5081935807E+01    8.6754455392E+01    8.820851 [...]
+    3.1914128323E+01    3.4188077273E+01    3.6616470538E+01    3.9182899803E+01    4.1870064088E+01    4.4659883119E+01    4.7533595455E+01    5.0471919578E+01    5.3455187125E+01    5.6463452013E+01    5.9476660607E+01    6.2474763793E+01    6.5437872320E+01    6.8346382451E+01    7.1181099306E+01    7.3923377104E+01    7.6555260236E+01    7.9059546073E+01    8.1419948358E+01    8.3621198392E+01    8.5649083228E+01    8.7490615570E+01    8.9134063020E+01    9.0569005754E+01    9.178644 [...]
+    4.0901529828E+01    4.3006531968E+01    4.5252130823E+01    4.7622574580E+01    5.0101233278E+01    5.2670735018E+01    5.5313074162E+01    5.8009774094E+01    6.0741957731E+01    6.3490537449E+01    6.6236325945E+01    6.8960162144E+01    7.1643046333E+01    7.4266291109E+01    7.6811631548E+01    7.9261334401E+01    8.1598362653E+01    8.3806446690E+01    8.5870201033E+01    8.7775236872E+01    8.9508267492E+01    9.1057136708E+01    9.2410960404E+01    9.3560138937E+01    9.449644 [...]
+    4.9740296882E+01    5.1641768385E+01    5.3667628140E+01    5.5802990032E+01    5.8032169613E+01    6.0338756277E+01    6.2705799085E+01    6.5115871511E+01    6.7551220482E+01    6.9993884082E+01    7.2425848594E+01    7.4829116390E+01    7.7185891056E+01    7.9478694910E+01    8.1690446110E+01    8.3804641133E+01    8.5805393448E+01    8.7677622465E+01    8.9407106620E+01    9.0980574277E+01    9.2385809523E+01    9.3611750240E+01    9.4648504053E+01    9.5487455362E+01    9.612129 [...]
+    5.7819699360E+01    5.9496819626E+01    6.1280829018E+01    6.3157883281E+01    6.5113415345E+01    6.7132215117E+01    6.9198537406E+01    7.1296237428E+01    7.3408895104E+01    7.5519898053E+01    7.7612592117E+01    7.9670394677E+01    8.1676908455E+01    8.3616054142E+01    8.5472156849E+01    8.7230104164E+01    8.8875387312E+01    9.0394262370E+01    9.1773831720E+01    9.3002087743E+01    9.4068073492E+01    9.4961872580E+01    9.5674745816E+01    9.6199119582E+01    9.652870 [...]
+    6.4680672850E+01    6.6124516077E+01    6.7657353106E+01    6.9266540710E+01    7.0938741061E+01    7.2660063339E+01    7.4416135294E+01    7.6192233740E+01    7.7973394696E+01    7.9744492216E+01    8.1490392272E+01    8.3196044045E+01    8.4846605593E+01    8.6427511172E+01    8.7924645515E+01    8.9324365174E+01    9.0613679943E+01    9.1780308308E+01    9.2812712621E+01    9.3700298503E+01    9.4433365577E+01    9.5003284473E+01    9.5402460225E+01    9.5624431686E+01    9.566393 [...]
+    7.0006118212E+01    7.1217715296E+01    7.2500818905E+01    7.3844025379E+01    7.5235333858E+01    7.6662228048E+01    7.8111799175E+01    7.9570811739E+01    8.1025847228E+01    8.2463343095E+01    8.3869769551E+01    8.5231681604E+01    8.6535833773E+01    8.7769275054E+01    8.8919473446E+01    8.9974365266E+01    9.0922493121E+01    9.1753033902E+01    9.2455955731E+01    9.3021985355E+01    9.3442806763E+01    9.3711001148E+01    9.3820161830E+01    9.3764932368E+01    9.354102 [...]
+    7.3608431888E+01    7.4596950883E+01    7.5640490402E+01    7.6728920753E+01    7.7851602901E+01    7.8997428306E+01    8.0154968440E+01    8.1312527527E+01    8.2458217402E+01    8.3580098880E+01    8.4666240013E+01    8.5704832310E+01    8.6684236414E+01    8.7593144257E+01    8.8420586466E+01    8.9156099058E+01    8.9789722958E+01    9.0312142585E+01    9.0714736883E+01    9.0989620414E+01    9.1129745527E+01    9.1128924405E+01    9.0981888846E+01    9.0684324858E+01    9.023289 [...]
+    7.5415092186E+01    7.6196061891E+01    7.7017039963E+01    7.7869164339E+01    7.8743116971E+01    7.9629221209E+01    8.0517498941E+01    8.1397749403E+01    8.2259653344E+01    8.3092837591E+01    8.3886939313E+01    8.4631760297E+01    8.5317247234E+01    8.5933657985E+01    8.6471595802E+01    8.6922102029E+01    8.7276726043E+01    8.7527546760E+01    8.7667334457E+01    8.7689512344E+01    8.7588255034E+01    8.7358523725E+01    8.6996113266E+01    8.6497663956E+01    8.586073 [...]
+    7.5452783281E+01    7.6046413336E+01    7.6666842777E+01    7.7306422769E+01    7.7957154855E+01    7.8610688323E+01    7.9258481115E+01    7.9891779370E+01    8.0501736957E+01    8.1079502842E+01    8.1616241475E+01    8.2103253507E+01    8.2532032747E+01    8.2894333635E+01    8.3182226255E+01    8.3388203105E+01    8.3505188070E+01    8.3526629740E+01    8.3446560942E+01    8.3259627039E+01    8.2961135479E+01    8.2547095422E+01    8.2014280099E+01    8.1360192545E+01    8.058315 [...]
+    7.3830559444E+01    7.4260233767E+01    7.4705487922E+01    7.5159848544E+01    7.5616533706E+01    7.6068505109E+01    7.6508505740E+01    7.6929182235E+01    7.7323084106E+01    7.7682753110E+01    7.8000810349E+01    7.8269975229E+01    7.8483150710E+01    7.8633489286E+01    7.8714429806E+01    7.8719801427E+01    7.8643806121E+01    7.8481126809E+01    7.8226964929E+01    7.7877048662E+01    7.7427721727E+01    7.6875932895E+01    7.6219279662E+01    7.5456046195E+01    7.458520 [...]
+    7.0722760390E+01    7.1013631009E+01    7.1310972829E+01    7.1609385554E+01    7.1903230358E+01    7.2186648898E+01    7.2453630186E+01    7.2698061544E+01    7.2913800529E+01    7.3094685758E+01    7.3234638374E+01    7.3327677713E+01    7.3368019754E+01    7.3350066514E+01    7.3268522459E+01    7.3118382358E+01    7.2895027571E+01    7.2594240052E+01    7.2212250025E+01    7.1745749426E+01    7.1191977171E+01    7.0548683623E+01    6.9814200015E+01    6.8987443485E+01    6.806790 [...]
+    6.6352104381E+01    6.6529898487E+01    6.6707153623E+01    6.6879455548E+01    6.7042182921E+01    6.7190570692E+01    6.7319705694E+01    6.7424643610E+01    6.7500370153E+01    6.7541914426E+01    6.7544366731E+01    6.7502930858E+01    6.7412940653E+01    6.7269960781E+01    6.7069778295E+01    6.6808446146E+01    6.6482362241E+01    6.6088262027E+01    6.5623259637E+01    6.5084898428E+01    6.4471145591E+01    6.3780446321E+01    6.3011717771E+01    6.2164374768E+01    6.123833 [...]
+    6.0973471382E+01    6.1063448684E+01    6.1147899413E+01    6.1223276146E+01    6.1285890024E+01    6.1331911198E+01    6.1357443011E+01    6.1358519660E+01    6.1331174165E+01    6.1271471238E+01    6.1175515240E+01    6.1039536190E+01    6.0859877497E+01    6.0633082107E+01    6.0355886712E+01    6.0025252822E+01    5.9638444486E+01    5.9192994938E+01    5.8686779247E+01    5.8118020121E+01    5.7485314451E+01    5.6787626271E+01    5.6024346668E+01    5.5195279232E+01    5.430062 [...]
+    5.4858679435E+01    5.4884791292E+01    5.4902261534E+01    5.4908301692E+01    5.4900033234E+01    5.4874449027E+01    5.4828513018E+01    5.4759135801E+01    5.4663227730E+01    5.4537747504E+01    5.4379691839E+01    5.4186150925E+01    5.3954338142E+01    5.3681605881E+01    5.3365503785E+01    5.3003748854E+01    5.2594314196E+01    5.2135396775E+01    5.1625486261E+01    5.1063348863E+01    5.0448047119E+01    4.9778974063E+01    4.9055853153E+01    4.8278741324E+01    4.744804 [...]
+    4.8282833937E+01    4.8267035110E+01    4.8241163425E+01    4.8203083900E+01    4.8150583264E+01    4.8081377433E+01    4.7993148101E+01    4.7883548137E+01    4.7750238120E+01    4.7590920226E+01    4.7403321237E+01    4.7185265336E+01    4.6934672503E+01    4.6649584434E+01    4.6328176993E+01    4.5968808764E+01    4.5569994602E+01    4.5130483978E+01    4.4649207499E+01    4.4125358143E+01    4.3558357677E+01    4.2947878282E+01    4.2293870628E+01    4.1596537556E+01    4.085636 [...]
+    4.1512222635E+01    4.1473997467E+01    4.1425708139E+01    4.1365768114E+01    4.1292527167E+01    4.1204290781E+01    4.1099343651E+01    4.0975938417E+01    4.0832354817E+01    4.0666891296E+01    4.0477885246E+01    4.0263740802E+01    4.0022949061E+01    3.9754078729E+01    3.9455827794E+01    3.9127023807E+01    3.8766620631E+01    3.8373752347E+01    3.7947703732E+01    3.7487940290E+01    3.6994126643E+01    3.6466123777E+01    3.5903981386E+01    3.5307965447E+01    3.467856 [...]
+    3.4794209764E+01    3.4750215001E+01    3.4697358042E+01    3.4634503771E+01    3.4560461833E+01    3.4474002218E+01    3.4373882233E+01    3.4258849896E+01    3.4127664127E+01    3.3979101419E+01    3.3811970662E+01    3.3625130349E+01    3.3417493092E+01    3.3188055183E+01    3.2935888477E+01    3.2660155061E+01    3.2360141925E+01    3.2035233682E+01    3.1684953821E+01    3.1308943140E+01    3.0907005481E+01    3.0479067148E+01    3.0025216825E+01    2.9545689958E+01    2.904088 [...]
+    2.8349083594E+01    2.8312962145E+01    2.8270137545E+01    2.8219802117E+01    2.8161124803E+01    2.8093239749E+01    2.8015277204E+01    2.7926350858E+01    2.7825588599E+01    2.7712126404E+01    2.7585121991E+01    2.7443768414E+01    2.7287293310E+01    2.7114979273E+01    2.6926164040E+01    2.6720254264E+01    2.6496722537E+01    2.6255129062E+01    2.5995118385E+01    2.5716422529E+01    2.5418874223E+01    2.5102404263E+01    2.4767054743E+01    2.4412960351E+01    2.404037 [...]
+    2.2363955847E+01    2.2346317546E+01    2.2324802375E+01    2.2298860910E+01    2.2267919282E+01    2.2231384750E+01    2.2188654921E+01    2.2139114310E+01    2.2082150033E+01    2.2017155982E+01    2.1943530626E+01    2.1860691449E+01    2.1768082765E+01    2.1665166060E+01    2.1551449079E+01    2.1426467753E+01    2.1289807852E+01    2.1141100300E+01    2.0980027356E+01    2.0806331469E+01    2.0619812287E+01    2.0420327233E+01    2.0207808276E+01    1.9982244107E+01    1.974369 [...]
+    1.6988738030E+01    1.6997206266E+01    1.7005053504E+01    1.7011910233E+01    1.7017382637E+01    1.7021066285E+01    1.7022535518E+01    1.7021359701E+01    1.7017092788E+01    1.7009291305E+01    1.6997508995E+01    1.6981296170E+01    1.6960214753E+01    1.6933830872E+01    1.6901720647E+01    1.6863482435E+01    1.6818725569E+01    1.6767079507E+01    1.6708199741E+01    1.6641768430E+01    1.6567493245E+01    1.6485114241E+01    1.6394403233E+01    1.6295163276E+01    1.618723 [...]
+    1.2333999685E+01    1.2373385736E+01    1.2415610429E+01    1.2460411235E+01    1.2507515253E+01    1.2556622139E+01    1.2607419330E+01    1.2659576750E+01    1.2712744812E+01    1.2766564346E+01    1.2820661722E+01    1.2874651969E+01    1.2928133964E+01    1.2980704390E+01    1.3031950670E+01    1.3081451564E+01    1.3128784525E+01    1.3173521596E+01    1.3215233358E+01    1.3253497561E+01    1.3287885953E+01    1.3317979191E+01    1.3343365196E+01    1.3363637500E+01    1.337840 [...]
+    8.4706650037E+00    8.5432198580E+00    8.6220670433E+00    8.7070057312E+00    8.7978130268E+00    8.8942438707E+00    8.9960320593E+00    9.1028857989E+00    9.2144907604E+00    9.3305105569E+00    9.4505802466E+00    9.5743136520E+00    9.7012999450E+00    9.8311041174E+00    9.9632635396E+00    1.0097296097E+01    1.0232694346E+01    1.0368933499E+01    1.0505463652E+01    1.0641715347E+01    1.0777106176E+01    1.0911033010E+01    1.1042879722E+01    1.1172021925E+01    1.129782 [...]
+    5.4313051589E+00    5.5370276761E+00    5.6523195691E+00    5.7769934420E+00    5.9108353896E+00    6.0536055236E+00    6.2050357281E+00    6.3648258648E+00    6.5326454551E+00    6.7081307966E+00    6.8908837957E+00    7.0804679621E+00    7.2764161875E+00    7.4782179947E+00    7.6853284837E+00    7.8971651205E+00    8.1131089919E+00    8.3325003225E+00    8.5546481921E+00    8.7788231734E+00    9.0042662318E+00    9.2301836190E+00    9.4557577471E+00    9.6801396203E+00    9.902459 [...]
+    3.2128288987E+00    3.3498152006E+00    3.4993280250E+00    3.6611586150E+00    3.8350678993E+00    4.0207847971E+00    4.2180031129E+00    4.4263779001E+00    4.6455271019E+00    4.8750250993E+00    5.1144028771E+00    5.3631483999E+00    5.6206999919E+00    5.8864508326E+00    6.1597444148E+00    6.4398763806E+00    6.7260937300E+00    7.0175952792E+00    7.3135322535E+00    7.6130099116E+00    7.9150902228E+00    8.2187936530E+00    8.5231020143E+00    8.8269612065E+00    9.129283 [...]
+    1.7803000481E+00    1.9451179992E+00    2.1249889867E+00    2.3196601964E+00    2.5288420768E+00    2.7522069827E+00    2.9893856217E+00    3.2399645152E+00    3.5034842849E+00    3.7794358675E+00    4.0672592004E+00    4.3663416800E+00    4.6760153796E+00    4.9955578335E+00    5.3241892005E+00    5.6610740644E+00    6.0053187852E+00    6.3559748719E+00    6.7120387453E+00    7.0724537341E+00    7.4361133518E+00    7.8018598352E+00    8.1684940492E+00    8.5347754587E+00    8.899425 [...]
+    1.0716327472E+00    1.2597014788E+00    1.4648438699E+00    1.6867470854E+00    1.9250555275E+00    2.1793705249E+00    2.4492442755E+00    2.7341808203E+00    3.0336297505E+00    3.3469863425E+00    3.6735889807E+00    4.0127164183E+00    4.3635868193E+00    4.7253584137E+00    5.0971250397E+00    5.4779209701E+00    5.8667163142E+00    6.2624227353E+00    6.6638906128E+00    7.0699148839E+00    7.4792344564E+00    7.8905386123E+00    8.3024690643E+00    8.7136260517E+00    9.122569 [...]
+    1.0028891685E+00    1.2088517742E+00    1.4333577851E+00    1.6760265353E+00    1.9364302340E+00    2.2140904369E+00    2.5084772263E+00    2.8190038430E+00    3.1450270879E+00    3.4858435357E+00    3.8406882621E+00    4.2087319470E+00    4.5890823513E+00    4.9807816769E+00    5.3828063310E+00    5.7940684402E+00    6.2134147800E+00    6.6396303138E+00    7.0714382688E+00    7.5075045900E+00    7.9464397989E+00    8.3868039333E+00    8.8271084276E+00    9.2658228670E+00    9.701386 [...]
+    1.4739114793E+00    1.6919868645E+00    1.9295093440E+00    2.1860301287E+00    2.4610473959E+00    2.7540050042E+00    3.0642902611E+00    3.3912303957E+00    3.7340910115E+00    4.0920758799E+00    4.4643225507E+00    4.8499039233E+00    5.2478256441E+00    5.6570275314E+00    6.0763813119E+00    6.5046938105E+00    6.9407086803E+00    7.3831021895E+00    7.8304966204E+00    8.2814542670E+00    8.7344824120E+00    9.1880432646E+00    9.6405519076E+00    1.0090386127E+01    1.053589 [...]
+    2.3740415922E+00    2.5983446834E+00    2.8424448592E+00    3.1058279429E+00    3.3879251678E+00    3.6881070351E+00    4.0056857726E+00    4.3399110985E+00    4.6899682952E+00    5.0549773599E+00    5.4339942739E+00    5.8260049535E+00    6.2299320286E+00    6.6446269517E+00    7.0688805117E+00    7.5014140497E+00    7.9408899276E+00    8.3859061381E+00    8.8350040584E+00    9.2866740447E+00    9.7393555097E+00    1.0191438996E+01    1.0641283904E+01    1.1087207230E+01    1.152750 [...]
+    3.5876911016E+00    3.8125164098E+00    4.0569678875E+00    4.3204754671E+00    4.6024103385E+00    4.9020834636E+00    5.2187428990E+00    5.5515730022E+00    5.8996925400E+00    6.2621568411E+00    6.6379532889E+00    7.0260035826E+00    7.4251624643E+00    7.8342217321E+00    8.2519090833E+00    8.6768855974E+00    9.1077604725E+00    9.5430771495E+00    9.9813353305E+00    1.0420976596E+01    1.0860400249E+01    1.1297972529E+01    1.1732016305E+01    1.2160836008E+01    1.258270 [...]
+    4.9995650984E+00    5.2196232112E+00    5.4586676617E+00    5.7160845037E+00    5.9911993065E+00    6.2832743706E+00    6.5915109698E+00    6.9150425168E+00    7.2529399188E+00    7.6042108849E+00    7.9677968291E+00    8.3425750539E+00    8.7273570531E+00    9.1208958830E+00    9.5218830708E+00    9.9289493402E+00    1.0340671641E+01    1.0755576141E+01    1.1172138640E+01    1.1588793432E+01    1.2003934289E+01    1.2415922457E+01    1.2823090553E+01    1.3223754092E+01    1.361621 [...]
+    6.4993604075E+00    6.7099674448E+00    6.9385194273E+00    7.1843716367E+00    7.4468182299E+00    7.7250903660E+00    8.0183551901E+00    8.3257189989E+00    8.6462218224E+00    8.9788425007E+00    9.3225001196E+00    9.6760495159E+00    1.0038284250E+01    1.0407940866E+01    1.0783702546E+01    1.1164192820E+01    1.1547992364E+01    1.1933631150E+01    1.2319594886E+01    1.2704334983E+01    1.3086271706E+01    1.3463794476E+01    1.3835276383E+01    1.4199074621E+01    1.455354 [...]
+    7.9858083250E+00    8.1830261168E+00    8.3968224623E+00    8.6265370304E+00    8.8714448846E+00    9.1307623423E+00    9.4036457532E+00    9.6891860618E+00    9.9864181015E+00    1.0294311957E+01    1.0611782856E+01    1.0937688013E+01    1.1270826268E+01    1.1609946094E+01    1.1953740111E+01    1.2300859060E+01    1.2649903508E+01    1.2999438856E+01    1.3347990531E+01    1.3694055479E+01    1.4036102220E+01    1.4372579442E+01    1.4701928535E+01    1.5022575488E+01    1.533295 [...]
+    9.3699634416E+00    9.5506901280E+00    9.7463875013E+00    9.9563866535E+00    1.0179968135E+01    1.0416346894E+01    1.0664681116E+01    1.0924073602E+01    1.1193563087E+01    1.1472140622E+01    1.1758733987E+01    1.2052224470E+01    1.2351439539E+01    1.2655158554E+01    1.2962117293E+01    1.3271005572E+01    1.3580477584E+01    1.3889152264E+01    1.4195618684E+01    1.4498444774E+01    1.4796174281E+01    1.5087340066E+01    1.5370466194E+01    1.5644080355E+01    1.590671 [...]
+    1.0577669965E+01    1.0739687834E+01    1.0914904932E+01    1.1102664018E+01    1.1302258673E+01    1.1512922476E+01    1.1733832794E+01    1.1964117248E+01    1.2202843030E+01    1.2449033510E+01    1.2701653966E+01    1.2959628828E+01    1.3221830352E+01    1.3487094811E+01    1.3754214726E+01    1.4021947171E+01    1.4289017162E+01    1.4554119853E+01    1.4815930322E+01    1.5073103070E+01    1.5324277701E+01    1.5568090425E+01    1.5803174747E+01    1.6028165868E+01    1.624171 [...]
+    1.1551195327E+01    1.1693170190E+01    1.1846491314E+01    1.2010529953E+01    1.2184603722E+01    1.2367977122E+01    1.2559864871E+01    1.2759430985E+01    1.2965791276E+01    1.3178012378E+01    1.3395121273E+01    1.3616095470E+01    1.3839878137E+01    1.4065372284E+01    1.4291448510E+01    1.4516945408E+01    1.4740677114E+01    1.4961434533E+01    1.5177989232E+01    1.5389104688E+01    1.5593531670E+01    1.5790021003E+01    1.5977328772E+01    1.6154217578E+01    1.631946 [...]
+    1.2250027706E+01    1.2371476086E+01    1.2502413730E+01    1.2642247931E+01    1.2790337927E+01    1.2945987304E+01    1.3108461238E+01    1.3276975738E+01    1.3450705763E+01    1.3628780460E+01    1.3810292954E+01    1.3994298296E+01    1.4179815222E+01    1.4365832811E+01    1.4551310124E+01    1.4735188149E+01    1.4916374408E+01    1.5093772377E+01    1.5266266959E+01    1.5432732850E+01    1.5592049464E+01    1.5743091182E+01    1.5884744051E+01    1.6015905452E+01    1.613549 [...]
+    1.2650899350E+01    1.2752116847E+01    1.2861034094E+01    1.2977099933E+01    1.3099719341E+01    1.3228255034E+01    1.3362025947E+01    1.3500315159E+01    1.3642358901E+01    1.3787367996E+01    1.3934511200E+01    1.4082926015E+01    1.4231722080E+01    1.4379986817E+01    1.4526778797E+01    1.4671138671E+01    1.4812091331E+01    1.4948653491E+01    1.5079827664E+01    1.5204618026E+01    1.5322025349E+01    1.5431063273E+01    1.5530746993E+01    1.5620118738E+01    1.569823 [...]
+    1.2747076969E+01    1.2829052091E+01    1.2917057208E+01    1.3010593768E+01    1.3109119669E+01    1.3212057513E+01    1.3318795759E+01    1.3428683887E+01    1.3541037444E+01    1.3655146780E+01    1.3770267162E+01    1.3885627793E+01    1.4000436087E+01    1.4113878679E+01    1.4225121741E+01    1.4333316740E+01    1.4437606234E+01    1.4537122731E+01    1.4630995156E+01    1.4718352027E+01    1.4798329186E+01    1.4870066038E+01    1.4932720456E+01    1.4985464163E+01    1.502749 [...]
+    1.2547044797E+01    1.2611344511E+01    1.2680174230E+01    1.2753087496E+01    1.2829608146E+01    1.2909221748E+01    1.2991384738E+01    1.3075523632E+01    1.3161037374E+01    1.3247298815E+01    1.3333652924E+01    1.3419426407E+01    1.3503925779E+01    1.3586440452E+01    1.3666246578E+01    1.3742609821E+01    1.3814786942E+01    1.3882030753E+01    1.3943592523E+01    1.3998729796E+01    1.4046700848E+01    1.4086780320E+01    1.4118251576E+01    1.4140425676E+01    1.415262 [...]
+    1.2072663348E+01    1.2121306832E+01    1.2173185097E+01    1.2227909706E+01    1.2285065539E+01    1.2344208305E+01    1.2404865063E+01    1.2466538750E+01    1.2528714375E+01    1.2590844291E+01    1.2652372705E+01    1.2712716667E+01    1.2771284710E+01    1.2827471063E+01    1.2880657022E+01    1.2930218897E+01    1.2975528947E+01    1.3015955197E+01    1.3050869879E+01    1.3079646684E+01    1.3101670172E+01    1.3116335337E+01    1.3123052317E+01    1.3121250473E+01    1.311037 [...]
+    1.1356929863E+01    1.1392261791E+01    1.1429763670E+01    1.1469101522E+01    1.1509924996E+01    1.1551854298E+01    1.1594492242E+01    1.1637418958E+01    1.1680194593E+01    1.1722362659E+01    1.1763450704E+01    1.1802976081E+01    1.1840440205E+01    1.1875336117E+01    1.1907150682E+01    1.1935365803E+01    1.1959459037E+01    1.1978910065E+01    1.1993202157E+01    1.2001822824E+01    1.2004270967E+01    1.2000052658E+01    1.1988690691E+01    1.1969727494E+01    1.194272 [...]
+    1.0441481725E+01    1.0466045587E+01    1.0491949622E+01    1.0518920556E+01    1.0546665778E+01    1.0574874782E+01    1.0603215068E+01    1.0631342247E+01    1.0658893325E+01    1.0685495012E+01    1.0710758682E+01    1.0734288012E+01    1.0755676568E+01    1.0774511881E+01    1.0790377435E+01    1.0802849190E+01    1.0811507938E+01    1.0815934849E+01    1.0815712557E+01    1.0810432067E+01    1.0799692012E+01    1.0783102156E+01    1.0760285389E+01    1.0730881030E+01    1.069454 [...]
+    9.3739462740E+00    9.3903527599E+00    9.4075136249E+00    9.4252086234E+00    9.4432012860E+00    9.4612411011E+00    9.4790629518E+00    9.4963893611E+00    9.5129304683E+00    9.5283868279E+00    9.5424512011E+00    9.5548048114E+00    9.5651243636E+00    9.5730824624E+00    9.5783504330E+00    9.5805935115E+00    9.5794804772E+00    9.5746813434E+00    9.5658709151E+00    9.5527289737E+00    9.5349415352E+00    9.5122090628E+00    9.4842385159E+00    9.4507537685E+00    9.411493 [...]
+    8.2052786772E+00    8.2160971017E+00    8.2273155370E+00    8.2387604743E+00    8.2502486270E+00    8.2615848105E+00    8.2725644036E+00    8.2829704687E+00    8.2925776530E+00    8.3011543410E+00    8.3084623515E+00    8.3142553581E+00    8.3182848218E+00    8.3202983939E+00    8.3200401302E+00    8.3172561531E+00    8.3116911799E+00    8.3030930958E+00    8.2912125070E+00    8.2758060624E+00    8.2566360110E+00    8.2334732054E+00    8.2060972849E+00    8.1743018762E+00    8.137887 [...]
+    6.9871760508E+00    6.9948329085E+00    7.0027487759E+00    7.0107920989E+00    7.0188247632E+00    7.0267039046E+00    7.0342722905E+00    7.0413700004E+00    7.0478280355E+00    7.0534729169E+00    7.0581265522E+00    7.0616054722E+00    7.0637228199E+00    7.0642906730E+00    7.0631183556E+00    7.0600161273E+00    7.0547925945E+00    7.0472603115E+00    7.0372338164E+00    7.0245308778E+00    7.0089744120E+00    6.9903937335E+00    6.9686252669E+00    6.9435120072E+00    6.914909 [...]
+    5.7697043773E+00    5.7763994798E+00    5.7833979868E+00    5.7906086325E+00    5.7979330767E+00    5.8052667657E+00    5.8124987764E+00    5.8195136141E+00    5.8261919241E+00    5.8324069935E+00    5.8380319794E+00    5.8429337814E+00    5.8469780943E+00    5.8500289034E+00    5.8519481904E+00    5.8525978434E+00    5.8518385485E+00    5.8495337018E+00    5.8455462279E+00    5.8397421656E+00    5.8319898337E+00    5.8221634216E+00    5.8101386627E+00    5.7957979079E+00    5.779030 [...]
+    4.5991836653E+00    4.6068198250E+00    4.6149654015E+00    4.6235591575E+00    4.6325340418E+00    4.6418202210E+00    4.6513424881E+00    4.6610221966E+00    4.6707767534E+00    4.6805208175E+00    4.6901653193E+00    4.6996187226E+00    4.7087877238E+00    4.7175750113E+00    4.7258843474E+00    4.7336158671E+00    4.7406695863E+00    4.7469459229E+00    4.7523438282E+00    4.7567643886E+00    4.7601077537E+00    4.7622761795E+00    4.7631732256E+00    4.7627066835E+00    4.760783 [...]
+    3.5164185133E+00    3.5265595324E+00    3.5375404769E+00    3.5493241407E+00    3.5618692178E+00    3.5751304397E+00    3.5890609240E+00    3.6036097392E+00    3.6187234758E+00    3.6343454031E+00    3.6504167215E+00    3.6668751881E+00    3.6836568746E+00    3.7006947440E+00    3.7179189147E+00    3.7352590592E+00    3.7526408051E+00    3.7699894206E+00    3.7872276476E+00    3.8042769607E+00    3.8210574281E+00    3.8374884841E+00    3.8534874073E+00    3.8689731395E+00    3.883861 [...]
+    2.5553215788E+00    2.5691606839E+00    2.5842618268E+00    2.6006038894E+00    2.6181633089E+00    2.6369143135E+00    2.6568283266E+00    2.6778745944E+00    2.7000195669E+00    2.7232268134E+00    2.7474566726E+00    2.7726675358E+00    2.7988137759E+00    2.8258468435E+00    2.8537158021E+00    2.8823645540E+00    2.9117359742E+00    2.9417680078E+00    2.9723952096E+00    3.0035491492E+00    3.0351582167E+00    3.0671463553E+00    3.0994352980E+00    3.1319428576E+00    3.164582 [...]
+    1.7419428853E+00    1.7602954480E+00    1.7803866714E+00    1.8022065723E+00    1.8257426014E+00    1.8509807409E+00    1.8779045358E+00    1.9064944005E+00    1.9367286250E+00    1.9685826565E+00    2.0020276928E+00    2.0370326300E+00    2.0735618016E+00    2.1115756295E+00    2.1510305962E+00    2.1918779317E+00    2.2340647503E+00    2.2775334803E+00    2.3222209306E+00    2.3680581859E+00    2.4149717669E+00    2.4628824343E+00    2.5117038141E+00    2.5613462320E+00    2.611712 [...]
+    1.0939296091E+00    1.1172387170E+00    1.1427850865E+00    1.1705636114E+00    1.2005676880E+00    1.2327880316E+00    1.2672133088E+00    1.3038292016E+00    1.3426183516E+00    1.3835596892E+00    1.4266285407E+00    1.4717954883E+00    1.5190272510E+00    1.5682842293E+00    1.6195226990E+00    1.6726926189E+00    1.7277378169E+00    1.7845958758E+00    1.8431971147E+00    1.9034649362E+00    1.9653164652E+00    2.0286595874E+00    2.0933961310E+00    2.1594183465E+00    2.226612 [...]
+    6.2039225110E-01    6.4875159070E-01    6.7983750559E-01    7.1364519416E-01    7.5016803205E-01    7.8939693692E-01    8.3131981428E-01    8.7592129827E-01    9.2318209850E-01    9.7307894657E-01    1.0255838878E+00    1.0806633807E+00    1.1382786957E+00    1.1983849237E+00    1.2609305268E+00    1.3258569296E+00    1.3930983213E+00    1.4625808010E+00    1.5342221930E+00    1.6079322616E+00    1.6836113485E+00    1.7611507405E+00    1.8404324398E+00    1.9213285012E+00    2.003701 [...]
+    3.2215833877E-01    3.5534716862E-01    3.9171501105E-01    4.3125385442E-01    4.7395303588E-01    5.1979861733E-01    5.6877331847E-01    6.2085578176E-01    6.7602010737E-01    7.3423552374E-01    7.9546523914E-01    8.5966696808E-01    9.2679130348E-01    9.9678196130E-01    1.0695748820E+00    1.1450980095E+00    1.2232706851E+00    1.3040029548E+00    1.3871956540E+00    1.4727395341E+00    1.5605153277E+00    1.6503933816E+00    1.7422327473E+00    1.8358818895E+00    1.931178 [...]
+    1.9236962413E-01    2.2989719718E-01    2.7099719394E-01    3.1565497995E-01    3.6385251025E-01    4.1556793440E-01    4.7077512908E-01    5.2944304873E-01    5.9153534057E-01    6.5700966009E-01    7.2581745804E-01    7.9790271583E-01    8.7320229141E-01    9.5164483273E-01    1.0331501384E+00    1.1176289862E+00    1.2049827845E+00    1.2951026335E+00    1.3878690541E+00    1.4831518455E+00    1.5808096802E+00    1.6806896817E+00    1.7826271763E+00    1.8864457212E+00    1.991956 [...]
+    2.1737115170E-01    2.5852882276E-01    3.0357555089E-01    3.5248784723E-01    4.0523807704E-01    4.6179388658E-01    5.2211790040E-01    5.8616685014E-01    6.5389153256E-01    7.2523571578E-01    8.0013605529E-01    8.7852109530E-01    9.6031119496E-01    1.0454178088E+00    1.1337425580E+00    1.2251774570E+00    1.3196040629E+00    1.4168930296E+00    1.5169038924E+00    1.6194842815E+00    1.7244704957E+00    1.8316861295E+00    1.9409427592E+00    2.0520402031E+00    2.164764 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_sphere_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_sphere_BA.inp
new file mode 100644
index 0000000..6b9d064
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_sphere_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_sphere_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+sphere                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_spheroid_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_spheroid_BA.ima
new file mode 100644
index 0000000..d38850c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_spheroid_BA.ima
@@ -0,0 +1,100 @@
+    9.0609493491E+03    8.9232060605E+03    8.7742964289E+03    8.6147598908E+03    8.4451708549E+03    8.2661370752E+03    8.0782954999E+03    7.8823061137E+03    7.6788532450E+03    7.4686374100E+03    7.2523763211E+03    7.0307989119E+03    6.8046412315E+03    6.5746446443E+03    6.3415507500E+03    6.1060991277E+03    5.8690227118E+03    5.6310463983E+03    5.3928806342E+03    5.1552211016E+03    4.9187439959E+03    4.6841056247E+03    4.4519352968E+03    4.2228368879E+03    3.997385 [...]
+    9.0386066273E+03    8.9011735112E+03    8.7525981639E+03    8.5934206623E+03    8.4242144249E+03    8.2455842393E+03    8.0581674193E+03    7.8626211190E+03    7.6596291302E+03    7.4498905749E+03    7.2341209640E+03    7.0130476051E+03    6.7874055539E+03    6.5579336114E+03    6.3253735204E+03    6.0904618869E+03    5.8539306417E+03    5.6165031229E+03    5.3788873305E+03    5.1417784119E+03    4.9058511745E+03    4.6717589856E+03    4.4401315776E+03    4.2115708660E+03    3.986650 [...]
+    8.9718602038E+03    8.8353527658E+03    8.6877789159E+03    8.5296750008E+03    8.3616106847E+03    8.1841894459E+03    7.9980404648E+03    7.8038196044E+03    7.6022043155E+03    7.3938912480E+03    7.1795901453E+03    6.9600234723E+03    6.7359228699E+03    6.5080216299E+03    6.2770554965E+03    6.0437575131E+03    5.8088554287E+03    5.5730664276E+03    5.3370952954E+03    5.1016312233E+03    4.8673460969E+03    4.6348878290E+03    4.4048818004E+03    4.1779272792E+03    3.954592 [...]
+    8.8615568527E+03    8.7265797915E+03    8.5806619617E+03    8.4243333926E+03    8.2581600193E+03    8.0827353750E+03    7.8986843530E+03    7.7066550491E+03    7.5073182971E+03    7.3013624371E+03    7.0894903274E+03    6.8724164304E+03    6.6508636923E+03    6.4255593458E+03    6.1972301624E+03    5.9666014980E+03    5.7343931324E+03    5.5013146310E+03    5.2680624410E+03    5.0353192336E+03    4.8037484964E+03    4.5739920707E+03    4.3466683331E+03    4.1223682009E+03    3.901655 [...]
+    8.7090863208E+03    8.5762283397E+03    8.4326035773E+03    8.2787337248E+03    8.1151743979E+03    7.9425146898E+03    7.7613663609E+03    7.5723707772E+03    7.3761869104E+03    7.1734932170E+03    6.9649825539E+03    6.7513592565E+03    6.5333336537E+03    6.3116229039E+03    6.0869425629E+03    5.8600079905E+03    5.6315268290E+03    5.4021980608E+03    5.1727089045E+03    4.9437300843E+03    4.7159155091E+03    4.4898968343E+03    4.2662824524E+03    4.0456558267E+03    3.828570 [...]
+    8.5163602065E+03    8.3861851063E+03    8.2454626995E+03    8.0947055252E+03    7.9344596545E+03    7.7652992552E+03    7.5878288648E+03    7.4026740493E+03    7.2104825688E+03    7.0119194900E+03    6.8076647681E+03    6.5984086209E+03    6.3848483948E+03    6.1676867211E+03    5.9476264869E+03    5.7253678909E+03    5.5016048905E+03    5.2770230109E+03    5.0522957721E+03    4.8280817887E+03    4.6050204341E+03    4.3837321197E+03    4.1648129726E+03    3.9488335239E+03    3.736337 [...]
+    8.2857756041E+03    8.1588179006E+03    8.0215773842E+03    7.8745534409E+03    7.7182786310E+03    7.5533158996E+03    7.3802543268E+03    7.1997044297E+03    7.0123002227E+03    6.8186897958E+03    6.6195377480E+03    6.4155172263E+03    6.2073110201E+03    5.9956029693E+03    5.7810800689E+03    5.5644258473E+03    5.3463182390E+03    5.1274254333E+03    4.9084059500E+03    4.6899008305E+03    4.4725361009E+03    4.2569155741E+03    4.0436208325E+03    3.8332097109E+03    3.626210 [...]
+    8.0201737169E+03    7.8969326465E+03    7.7637133204E+03    7.6210015046E+03    7.4693143886E+03    7.3091997619E+03    7.1412296712E+03    6.9659991834E+03    6.7841220946E+03    6.5962314630E+03    6.4029719568E+03    6.2049973860E+03    6.0029714652E+03    5.7975605170E+03    5.5894306243E+03    5.3792467115E+03    5.1676665889E+03    4.9553413399E+03    4.7429090578E+03    4.5309939778E+03    4.3202024214E+03    4.1111213142E+03    3.9043168023E+03    3.7003289831E+03    3.499672 [...]
+    7.7227876934E+03    7.6037227833E+03    7.4750200751E+03    7.3371516443E+03    7.1906179007E+03    7.0359485892E+03    6.8736972549E+03    6.7044403199E+03    6.5287720861E+03    6.3473043570E+03    6.1606612401E+03    5.9694762367E+03    5.7743907039E+03    5.5760491567E+03    5.3750965986E+03    5.1721758246E+03    4.9679244573E+03    4.7629700912E+03    4.5579307445E+03    4.3534101341E+03    4.1499951559E+03    3.9482523763E+03    3.7487288882E+03    3.5519468318E+03    3.358402 [...]
+    7.3971865033E+03    7.2827105926E+03    7.1589727334E+03    7.0264263893E+03    6.8855558366E+03    6.7368702085E+03    6.5809031130E+03    6.4182097934E+03    6.2493636070E+03    6.0749523099E+03    5.8955783985E+03    5.7118515625E+03    5.5243895618E+03    5.3338134540E+03    5.1407439512E+03    4.9457998648E+03    4.7495947429E+03    4.5527340764E+03    4.3558119197E+03    4.1594088096E+03    3.9640900331E+03    3.7704011249E+03    3.5788675380E+03    3.3899920207E+03    3.204252 [...]
+    7.0472104182E+03    6.9376883443E+03    6.8193097040E+03    6.6925099405E+03    6.5577519477E+03    6.4155247135E+03    6.2663402778E+03    6.1107301536E+03    5.9492453412E+03    5.7824494490E+03    5.6109189764E+03    5.4352385852E+03    5.2560014532E+03    5.0738020660E+03    4.8892350934E+03    4.7028943706E+03    4.5153676232E+03    4.3272341369E+03    4.1390638644E+03    3.9514125327E+03    3.7648213377E+03    3.5798127191E+03    3.3968902065E+03    3.2165334820E+03    3.039200 [...]
+    6.6769082678E+03    6.5726537976E+03    6.4599730413E+03    6.3392812831E+03    6.2110213938E+03    6.0756602035E+03    5.9336852215E+03    5.7856049764E+03    5.6319440418E+03    5.4732402269E+03    5.3100451982E+03    5.1429155610E+03    4.9724170408E+03    4.7991168385E+03    4.6235828131E+03    4.4463802346E+03    4.2680698102E+03    4.0892041777E+03    3.9103267604E+03    3.7319668824E+03    3.5546398378E+03    3.3788439882E+03    3.2050583484E+03    3.0337404444E+03    2.865326 [...]
+    6.2904651868E+03    6.1917376313E+03    6.0850348384E+03    5.9707523073E+03    5.8493092113E+03    5.7211507041E+03    5.5867382578E+03    5.4465559741E+03    5.3011011304E+03    5.1508850242E+03    4.9964297619E+03    4.8382658312E+03    4.6769294322E+03    4.5129584359E+03    4.3468922487E+03    4.1792674690E+03    4.0106158128E+03    3.8414614079E+03    3.6723189931E+03    3.5036917515E+03    3.3360679361E+03    3.1699195174E+03    3.0057004059E+03    2.8438441884E+03    2.684763 [...]
+    5.8921350559E+03    5.7991381050E+03    5.6986346636E+03    5.5909968603E+03    5.4766224837E+03    5.3559303290E+03    5.2293582688E+03    5.0973624097E+03    4.9604126075E+03    4.8189923249E+03    4.6735950777E+03    4.5247214517E+03    4.3728770493E+03    4.2185713185E+03    4.0623121709E+03    3.9046063410E+03    3.7459566739E+03    3.5868566829E+03    3.4277927628E+03    3.2692394022E+03    3.1116568759E+03    2.9554899780E+03    2.8011668788E+03    2.6490965288E+03    2.499667 [...]
+    5.4861697554E+03    5.3990525313E+03    5.3049085962E+03    5.2040871461E+03    5.0969631606E+03    4.9839292115E+03    4.8653978320E+03    4.7417964499E+03    4.6135682675E+03    4.4811666771E+03    4.3450551725E+03    4.2057039822E+03    4.0635892800E+03    3.9191877057E+03    3.7729778028E+03    3.6254349419E+03    3.4770303472E+03    3.3282285996E+03    3.1794850747E+03    3.0312455467E+03    2.8839412296E+03    2.7379901828E+03    2.5937931988E+03    2.4517329635E+03    2.312173 [...]
+    5.0767534544E+03    4.9956094331E+03    4.9079245958E+03    4.8140270978E+03    4.7142661613E+03    4.6090100659E+03    4.4986435497E+03    4.3835658780E+03    4.2641925628E+03    4.1409453533E+03    4.0142594680E+03    3.8845731223E+03    3.7523308452E+03    3.6179790252E+03    3.4819635940E+03    3.3447284054E+03    3.2067140726E+03    3.0683541515E+03    2.9300732736E+03    2.7922870674E+03    2.6553986355E+03    2.5197969227E+03    2.3858557241E+03    2.2539327004E+03    2.124365 [...]
+    4.6679373706E+03    4.5928042937E+03    4.5116204433E+03    4.4246905741E+03    4.3323393245E+03    4.2349079049E+03    4.1327553496E+03    4.0262530194E+03    3.9157855782E+03    3.8017461980E+03    3.6845378618E+03    3.5645692560E+03    3.4422519425E+03    3.3180012426E+03    3.1922310434E+03    3.0653540018E+03    2.9377781850E+03    2.8099059755E+03    2.6821316264E+03    2.5548409839E+03    2.4284072285E+03    2.3031915261E+03    2.1795398287E+03    2.0577832628E+03    1.938235 [...]
+    4.2635785845E+03    4.1944429320E+03    4.1197442858E+03    4.0397644504E+03    3.9548031367E+03    3.8651762333E+03    3.7712151715E+03    3.6732629644E+03    3.5716743485E+03    3.4668137511E+03    3.3590520589E+03    3.2487674873E+03    3.1363400208E+03    3.0221527319E+03    2.9065876495E+03    2.7900253353E+03    2.6728422392E+03    2.5554105674E+03    2.4380930558E+03    2.3212452192E+03    2.2052109736E+03    2.0903238230E+03    1.9769017964E+03    1.8652498863E+03    1.755656 [...]
+    3.8672883538E+03    3.8040860287E+03    3.7358025566E+03    3.6626971084E+03    3.5850446682E+03    3.5031360459E+03    3.4172741792E+03    3.3277748820E+03    3.2349638134E+03    3.1391751070E+03    3.0407495384E+03    2.9400335725E+03    2.8373763922E+03    2.7331289287E+03    2.6276416815E+03    2.5212636886E+03    2.4143405534E+03    2.3072118074E+03    2.2002115568E+03    2.0936644182E+03    1.9878857034E+03    1.8831804961E+03    1.7798398718E+03    1.6781427523E+03    1.578352 [...]
+    3.4823833092E+03    3.4250021648E+03    3.3630127603E+03    3.2966510952E+03    3.2261687515E+03    3.1518294061E+03    3.0739106380E+03    2.9926998893E+03    2.9084947213E+03    2.8215990308E+03    2.7323240352E+03    2.6409848830E+03    2.5478997227E+03    2.4533890517E+03    2.3577715231E+03    2.2613653484E+03    2.1644850297E+03    2.0674399434E+03    1.9705334170E+03    1.8740614141E+03    1.7783107717E+03    1.6835580032E+03    1.5900685814E+03    1.4980949968E+03    1.407877 [...]
+    3.1118437227E+03    3.0601295155E+03    3.0042660384E+03    2.9444672162E+03    2.8809607222E+03    2.8139865310E+03    2.7437948578E+03    2.6706465249E+03    2.5948101534E+03    2.5165614785E+03    2.4361820696E+03    2.3539569024E+03    2.2701744648E+03    2.1851238606E+03    2.0990937349E+03    2.0123713136E+03    1.9252408846E+03    1.8379828831E+03    1.7508705170E+03    1.6641717330E+03    1.5781450044E+03    1.4930397605E+03    1.4090957719E+03    1.3265409827E+03    1.245590 [...]
+    2.7582838395E+03    2.7120413677E+03    2.6620926204E+03    2.6086302610E+03    2.5518584157E+03    2.4919925883E+03    2.4292582738E+03    2.3638890427E+03    2.2961267293E+03    2.2262191597E+03    2.1544184678E+03    2.0809813465E+03    2.0061661295E+03    1.9302325275E+03    1.8534395212E+03    1.7760451555E+03    1.6983041904E+03    1.6204679271E+03    1.5427815521E+03    1.4654846856E+03    1.3888093855E+03    1.3129790384E+03    1.2382077303E+03    1.1646995285E+03    1.092647 [...]
+    2.4239247954E+03    2.3829242246E+03    2.3386417291E+03    2.2912483121E+03    2.2409259673E+03    2.1878668966E+03    2.1322720062E+03    2.0743496538E+03    2.0143147661E+03    1.9523882347E+03    1.8887947756E+03    1.8237628993E+03    1.7575224704E+03    1.6903045399E+03    1.6223400315E+03    1.5538582581E+03    1.4850856503E+03    1.4162456162E+03    1.3475562737E+03    1.2792305436E+03    1.2114745025E+03    1.1444864316E+03    1.0784564886E+03    1.0135653025E+03    9.499840 [...]
+    2.1105794686E+03    2.0745614114E+03    2.0356634427E+03    1.9940367058E+03    1.9498419930E+03    1.9032488503E+03    1.8544347615E+03    1.8035834631E+03    1.7508849137E+03    1.6965339933E+03    1.6407290257E+03    1.5836713962E+03    1.5255640778E+03    1.4666107161E+03    1.4070150022E+03    1.3469789053E+03    1.2867023395E+03    1.2263815955E+03    1.1662092906E+03    1.1063724250E+03    1.0470525301E+03    9.8842409593E+02    9.3065411367E+02    8.7390154348E+02    8.183164 [...]
+    1.8196469053E+03    1.7883263923E+03    1.7545042592E+03    1.7183126390E+03    1.6798923236E+03    1.6393915415E+03    1.5969651973E+03    1.5527738862E+03    1.5069836813E+03    1.4597645347E+03    1.4112899088E+03    1.3617356714E+03    1.3112790247E+03    1.2600977698E+03    1.2083694141E+03    1.1562704305E+03    1.1039750813E+03    1.0516546557E+03    9.9947680832E+02    9.4760486702E+02    8.9619652185E+02    8.4540391386E+02    7.9537242662E+02    7.4624006069E+02    6.981374 [...]
+    1.5521121026E+03    1.5251836599E+03    1.4961067150E+03    1.4649957608E+03    1.4319720641E+03    1.3971638662E+03    1.3607048152E+03    1.3227339774E+03    1.2833945159E+03    1.2428333003E+03    1.2012002812E+03    1.1586468635E+03    1.1153263120E+03    1.0713918786E+03    1.0269968938E+03    9.8229335581E+02    9.3743169193E+02    8.9255936202E+02    8.4782107127E+02    8.0335716569E+02    7.5930388864E+02    7.1579172896E+02    6.7294606586E+02    6.3088540981E+02    5.897219 [...]
+    1.3085548006E+03    1.2856979573E+03    1.2610195052E+03    1.2346167985E+03    1.2065935342E+03    1.1770588739E+03    1.1461268611E+03    1.1139158751E+03    1.0805481943E+03    1.0461488543E+03    1.0108454446E+03    9.7476731018E+02    9.3804475425E+02    9.0080834033E+02    8.6318872881E+02    8.2531505194E+02    7.8731551569E+02    7.4931564874E+02    7.1143826975E+02    6.7380301499E+02    6.3652525030E+02    5.9971626150E+02    5.6348209986E+02    5.2792361337E+02    4.931358 [...]
+    1.0891664913E+03    1.0700507229E+03    1.0494130048E+03    1.0273349873E+03    1.0039035772E+03    9.7921060619E+02    9.5335174856E+02    9.2642653055E+02    8.9853720846E+02    8.6978898455E+02    8.4028891716E+02    8.1014541988E+02    7.7946779652E+02    7.4836556016E+02    7.1694823444E+02    6.8532413877E+02    6.5360058627E+02    6.2188273390E+02    5.9027369702E+02    5.5887334252E+02    5.2777850096E+02    4.9708203176E+02    4.6687279097E+02    4.3723500020E+02    4.082481 [...]
+    8.9377277806E+02    8.7806251050E+02    8.6110216028E+02    8.4295921609E+02    8.2370512685E+02    8.0341562477E+02    7.8216958598E+02    7.6004891508E+02    7.3713796301E+02    7.1352336243E+02    6.8929314249E+02    6.6453684224E+02    6.3934422407E+02    6.1380552183E+02    5.8801094079E+02    5.6204967772E+02    5.3600976750E+02    5.0997810951E+02    4.8403916262E+02    4.5827517540E+02    4.3276574216E+02    4.0758722672E+02    3.8281243773E+02    3.5851074612E+02    3.347471 [...]
+    7.2186325870E+02    7.0922209953E+02    6.9557537082E+02    6.8097718619E+02    6.6548541760E+02    6.4916076179E+02    6.3206686829E+02    6.1426957592E+02    5.9583691913E+02    5.7683850372E+02    5.5734533801E+02    5.3742924700E+02    5.1716268182E+02    4.9661822225E+02    4.7586841972E+02    4.5498493046E+02    4.3403877072E+02    4.1309968589E+02    3.9223554869E+02    3.7151272580E+02    3.5099495186E+02    3.3074372581E+02    3.1081762799E+02    2.9127217652E+02    2.721597 [...]
+    5.7262430024E+02    5.6271970169E+02    5.5202678246E+02    5.4058784670E+02    5.2844808665E+02    5.1565504399E+02    5.0225827467E+02    4.8830933580E+02    4.7386132149E+02    4.5896874042E+02    4.4368687621E+02    4.2807204059E+02    4.1218069622E+02    3.9606971518E+02    3.7979551688E+02    3.6341439098E+02    3.4698169211E+02    3.3055182749E+02    3.1417803364E+02    2.9791196583E+02    2.8180361042E+02    2.6590087440E+02    2.5024961069E+02    2.3489326204E+02    2.198726 [...]
+    4.4497748256E+02    4.3748456102E+02    4.2939413031E+02    4.2073790076E+02    4.1154982943E+02    4.0186544559E+02    3.9172200546E+02    3.8115811156E+02    3.7021361254E+02    3.5892935700E+02    3.4734687399E+02    3.3550835730E+02    3.2345621638E+02    3.1123307814E+02    2.9888139350E+02    2.8644331970E+02    2.7396054088E+02    2.6147387900E+02    2.4902336939E+02    2.3664781739E+02    2.2438482644E+02    2.1227051099E+02    2.0033935090E+02    1.8862405602E+02    1.771555 [...]
+    3.3761984943E+02    3.3222497086E+02    3.2639798801E+02    3.2016126304E+02    3.1353863509E+02    3.0655520069E+02    2.9923724659E+02    2.9161198899E+02    2.8370750907E+02    2.7555263958E+02    2.6717674138E+02    2.5860960167E+02    2.4988118950E+02    2.4102167218E+02    2.3206109463E+02    2.2302931348E+02    2.1395582366E+02    2.0486965996E+02    1.9579920373E+02    1.8677209008E+02    1.7781502995E+02    1.6895378933E+02    1.6021300791E+02    1.5161604335E+02    1.431850 [...]
+    2.4906635054E+02    2.4547036085E+02    2.4158345528E+02    2.3741980221E+02    2.3299452223E+02    2.2832352885E+02    2.2342349431E+02    2.1831169056E+02    2.1300606409E+02    2.0752488837E+02    2.0188692175E+02    1.9611115862E+02    1.9021675612E+02    1.8422306277E+02    1.7814927160E+02    1.7201463550E+02    1.6583814638E+02    1.5963847032E+02    1.5343404224E+02    1.4724271446E+02    1.4108194312E+02    1.3496851694E+02    1.2891854125E+02    1.2294747616E+02    1.170699 [...]
+    1.7769314231E+02    1.7561396515E+02    1.7336231161E+02    1.7094532204E+02    1.6837055033E+02    1.6564604098E+02    1.6278023168E+02    1.5978187035E+02    1.5666003222E+02    1.5342409159E+02    1.5008362592E+02    1.4664842628E+02    1.4312832962E+02    1.3953341370E+02    1.3587366309E+02    1.3215918654E+02    1.2840000648E+02    1.2460602449E+02    1.2078708743E+02    1.1695289223E+02    1.1311286044E+02    1.0927624943E+02    1.0545202727E+02    1.0164884509E+02    9.787505 [...]
+    1.2178045376E+02    1.2095524923E+02    1.2005490071E+02    1.1908056503E+02    1.1803346362E+02    1.1691494323E+02    1.1572644608E+02    1.1446953797E+02    1.1314586302E+02    1.1175716530E+02    1.1030535751E+02    1.0879241612E+02    1.0722038620E+02    1.0559151281E+02    1.0390803100E+02    1.0217237594E+02    1.0038704796E+02    9.8554619336E+01    9.6677779835E+01    9.4759317713E+01    9.2802081343E+01    9.0809021752E+01    8.8783157672E+01    8.6727581507E+01    8.464543 [...]
+    7.9554256353E+01    7.9741080292E+01    7.9930794460E+01    8.0119535667E+01    8.0303273022E+01    8.0477791164E+01    8.0638769695E+01    8.0781774729E+01    8.0902308525E+01    8.0995864053E+01    8.1057936162E+01    8.1084073824E+01    8.1069918831E+01    8.1011213836E+01    8.0903883624E+01    8.0744013011E+01    8.0527921461E+01    8.0252178855E+01    7.9913645656E+01    7.9509460731E+01    7.9037118324E+01    7.8494444718E+01    7.7879649242E+01    7.7191318964E+01    7.642844 [...]
+    4.9225801839E+01    5.0204884946E+01    5.1247363205E+01    5.2345360528E+01    5.3490550666E+01    5.4674257014E+01    5.5887461627E+01    5.7120903701E+01    5.8365134458E+01    5.9610561300E+01    6.0847559481E+01    6.2066500558E+01    6.3257834714E+01    6.4412134400E+01    6.5520202265E+01    6.6573101947E+01    6.7562206137E+01    6.8479293559E+01    6.9316560226E+01    7.0066692142E+01    7.0722944219E+01    7.1279103237E+01    7.1729606250E+01    7.2069528285E+01    7.229461 [...]
+    2.9028437951E+01    3.0602836387E+01    3.2285551216E+01    3.4065538497E+01    3.5931126221E+01    3.7870122077E+01    3.9869847553E+01    4.1917254166E+01    4.3999005818E+01    4.6101584490E+01    4.8211340959E+01    5.0314619309E+01    5.2397832101E+01    5.4447571139E+01    5.6450650921E+01    5.8394236010E+01    6.0265913701E+01    6.2053754167E+01    6.3746408950E+01    6.5333163870E+01    6.6804011268E+01    6.8149700492E+01    6.9361829429E+01    7.0432823128E+01    7.135605 [...]
+    1.7250748406E+01    1.9246631493E+01    2.1382074811E+01    2.3643652945E+01    2.6017193607E+01    2.8487844323E+01    3.1040200649E+01    3.3658375539E+01    3.6326145973E+01    3.9027030667E+01    4.1744412397E+01    4.4461626239E+01    4.7162115296E+01    4.9829485857E+01    5.2447646747E+01    5.5000884686E+01    5.7474001320E+01    5.9852364819E+01    6.2122044782E+01    6.4269854502E+01    6.6283460927E+01    6.8151443821E+01    6.9863352971E+01    7.1409791928E+01    7.278243 [...]
+    1.2265709238E+01    1.4532205490E+01    1.6957722781E+01    1.9527164847E+01    2.2224583345E+01    2.5033278984E+01    2.7935918820E+01    3.0914649213E+01    3.3951211517E+01    3.7027079546E+01    4.0123556900E+01    4.3221924778E+01    4.6303545600E+01    4.9349988969E+01    5.2343156258E+01    5.5265395937E+01    5.8099610395E+01    6.0829350646E+01    6.3438948382E+01    6.5913589524E+01    6.8239392338E+01    7.0403526663E+01    7.2394234797E+01    7.4200949928E+01    7.581431 [...]
+    1.2555353734E+01    1.4964021939E+01    1.7541227787E+01    2.0270818919E+01    2.3135735341E+01    2.6118118870E+01    2.9199441417E+01    3.2360612578E+01    3.5582128721E+01    3.8844189722E+01    4.2126828930E+01    4.5410067214E+01    4.8674007555E+01    5.1898995733E+01    5.5065736231E+01    5.8155422751E+01    6.1149828403E+01    6.4031467338E+01    6.6783677949E+01    6.9390715570E+01    7.1837852579E+01    7.4111488695E+01    7.6199205375E+01    7.8089813418E+01    7.977347 [...]
+    1.6730747979E+01    1.9174697881E+01    2.1788510174E+01    2.4555519160E+01    2.7458128794E+01    3.0477915669E+01    3.3595777651E+01    3.6792052490E+01    4.0046629967E+01    4.3339139990E+01    4.6649024641E+01    4.9955732374E+01    5.3238823559E+01    5.6478098307E+01    5.9653757933E+01    6.2746520673E+01    6.5737712415E+01    6.8609446202E+01    7.1344696502E+01    7.3927393042E+01    7.6342556261E+01    7.8576368388E+01    8.0616216391E+01    8.2450850526E+01    8.407034 [...]
+    2.3547112042E+01    2.5939833965E+01    2.8497211428E+01    3.1202517940E+01    3.4038101275E+01    3.6985500988E+01    4.0025562620E+01    4.3138590280E+01    4.6304456023E+01    4.9502762813E+01    5.2712974179E+01    5.5914542234E+01    5.9087052004E+01    6.2210381470E+01    6.5264781842E+01    6.8231063673E+01    7.1090681526E+01    7.3825878742E+01    7.6419778047E+01    7.8856507063E+01    8.1121295252E+01    8.3200545605E+01    8.5081935807E+01    8.6754455392E+01    8.820851 [...]
+    3.1914128323E+01    3.4188077273E+01    3.6616470538E+01    3.9182899803E+01    4.1870064088E+01    4.4659883119E+01    4.7533595455E+01    5.0471919578E+01    5.3455187125E+01    5.6463452013E+01    5.9476660607E+01    6.2474763793E+01    6.5437872320E+01    6.8346382451E+01    7.1181099306E+01    7.3923377104E+01    7.6555260236E+01    7.9059546073E+01    8.1419948358E+01    8.3621198392E+01    8.5649083228E+01    8.7490615570E+01    8.9134063020E+01    9.0569005754E+01    9.178644 [...]
+    4.0901529828E+01    4.3006531968E+01    4.5252130823E+01    4.7622574580E+01    5.0101233278E+01    5.2670735018E+01    5.5313074162E+01    5.8009774094E+01    6.0741957731E+01    6.3490537449E+01    6.6236325945E+01    6.8960162144E+01    7.1643046333E+01    7.4266291109E+01    7.6811631548E+01    7.9261334401E+01    8.1598362653E+01    8.3806446690E+01    8.5870201033E+01    8.7775236872E+01    8.9508267492E+01    9.1057136708E+01    9.2410960404E+01    9.3560138937E+01    9.449644 [...]
+    4.9740296882E+01    5.1641768385E+01    5.3667628140E+01    5.5802990032E+01    5.8032169613E+01    6.0338756277E+01    6.2705799085E+01    6.5115871511E+01    6.7551220482E+01    6.9993884082E+01    7.2425848594E+01    7.4829116390E+01    7.7185891056E+01    7.9478694910E+01    8.1690446110E+01    8.3804641133E+01    8.5805393448E+01    8.7677622465E+01    8.9407106620E+01    9.0980574277E+01    9.2385809523E+01    9.3611750240E+01    9.4648504053E+01    9.5487455362E+01    9.612129 [...]
+    5.7819699360E+01    5.9496819626E+01    6.1280829018E+01    6.3157883281E+01    6.5113415345E+01    6.7132215117E+01    6.9198537406E+01    7.1296237428E+01    7.3408895104E+01    7.5519898053E+01    7.7612592117E+01    7.9670394677E+01    8.1676908455E+01    8.3616054142E+01    8.5472156849E+01    8.7230104164E+01    8.8875387312E+01    9.0394262370E+01    9.1773831720E+01    9.3002087743E+01    9.4068073492E+01    9.4961872580E+01    9.5674745816E+01    9.6199119582E+01    9.652870 [...]
+    6.4680672850E+01    6.6124516077E+01    6.7657353106E+01    6.9266540710E+01    7.0938741061E+01    7.2660063339E+01    7.4416135294E+01    7.6192233740E+01    7.7973394696E+01    7.9744492216E+01    8.1490392272E+01    8.3196044045E+01    8.4846605593E+01    8.6427511172E+01    8.7924645515E+01    8.9324365174E+01    9.0613679943E+01    9.1780308308E+01    9.2812712621E+01    9.3700298503E+01    9.4433365577E+01    9.5003284473E+01    9.5402460225E+01    9.5624431686E+01    9.566393 [...]
+    7.0006118212E+01    7.1217715296E+01    7.2500818905E+01    7.3844025379E+01    7.5235333858E+01    7.6662228048E+01    7.8111799175E+01    7.9570811739E+01    8.1025847228E+01    8.2463343095E+01    8.3869769551E+01    8.5231681604E+01    8.6535833773E+01    8.7769275054E+01    8.8919473446E+01    8.9974365266E+01    9.0922493121E+01    9.1753033902E+01    9.2455955731E+01    9.3021985355E+01    9.3442806763E+01    9.3711001148E+01    9.3820161830E+01    9.3764932368E+01    9.354102 [...]
+    7.3608431888E+01    7.4596950883E+01    7.5640490402E+01    7.6728920753E+01    7.7851602901E+01    7.8997428306E+01    8.0154968440E+01    8.1312527527E+01    8.2458217402E+01    8.3580098880E+01    8.4666240013E+01    8.5704832310E+01    8.6684236414E+01    8.7593144257E+01    8.8420586466E+01    8.9156099058E+01    8.9789722958E+01    9.0312142585E+01    9.0714736883E+01    9.0989620414E+01    9.1129745527E+01    9.1128924405E+01    9.0981888846E+01    9.0684324858E+01    9.023289 [...]
+    7.5415092186E+01    7.6196061891E+01    7.7017039963E+01    7.7869164339E+01    7.8743116971E+01    7.9629221209E+01    8.0517498941E+01    8.1397749403E+01    8.2259653344E+01    8.3092837591E+01    8.3886939313E+01    8.4631760297E+01    8.5317247234E+01    8.5933657985E+01    8.6471595802E+01    8.6922102029E+01    8.7276726043E+01    8.7527546760E+01    8.7667334457E+01    8.7689512344E+01    8.7588255034E+01    8.7358523725E+01    8.6996113266E+01    8.6497663956E+01    8.586073 [...]
+    7.5452783281E+01    7.6046413336E+01    7.6666842777E+01    7.7306422769E+01    7.7957154855E+01    7.8610688323E+01    7.9258481115E+01    7.9891779370E+01    8.0501736957E+01    8.1079502842E+01    8.1616241475E+01    8.2103253507E+01    8.2532032747E+01    8.2894333635E+01    8.3182226255E+01    8.3388203105E+01    8.3505188070E+01    8.3526629740E+01    8.3446560942E+01    8.3259627039E+01    8.2961135479E+01    8.2547095422E+01    8.2014280099E+01    8.1360192545E+01    8.058315 [...]
+    7.3830559444E+01    7.4260233767E+01    7.4705487922E+01    7.5159848544E+01    7.5616533706E+01    7.6068505109E+01    7.6508505740E+01    7.6929182235E+01    7.7323084106E+01    7.7682753110E+01    7.8000810349E+01    7.8269975229E+01    7.8483150710E+01    7.8633489286E+01    7.8714429806E+01    7.8719801427E+01    7.8643806121E+01    7.8481126809E+01    7.8226964929E+01    7.7877048662E+01    7.7427721727E+01    7.6875932895E+01    7.6219279662E+01    7.5456046195E+01    7.458520 [...]
+    7.0722760390E+01    7.1013631009E+01    7.1310972829E+01    7.1609385554E+01    7.1903230358E+01    7.2186648898E+01    7.2453630186E+01    7.2698061544E+01    7.2913800529E+01    7.3094685758E+01    7.3234638374E+01    7.3327677713E+01    7.3368019754E+01    7.3350066514E+01    7.3268522459E+01    7.3118382358E+01    7.2895027571E+01    7.2594240052E+01    7.2212250025E+01    7.1745749426E+01    7.1191977171E+01    7.0548683623E+01    6.9814200015E+01    6.8987443485E+01    6.806790 [...]
+    6.6352104381E+01    6.6529898487E+01    6.6707153623E+01    6.6879455548E+01    6.7042182921E+01    6.7190570692E+01    6.7319705694E+01    6.7424643610E+01    6.7500370153E+01    6.7541914426E+01    6.7544366731E+01    6.7502930858E+01    6.7412940653E+01    6.7269960781E+01    6.7069778295E+01    6.6808446146E+01    6.6482362241E+01    6.6088262027E+01    6.5623259637E+01    6.5084898428E+01    6.4471145591E+01    6.3780446321E+01    6.3011717771E+01    6.2164374768E+01    6.123833 [...]
+    6.0973471382E+01    6.1063448684E+01    6.1147899413E+01    6.1223276146E+01    6.1285890024E+01    6.1331911198E+01    6.1357443011E+01    6.1358519660E+01    6.1331174165E+01    6.1271471238E+01    6.1175515240E+01    6.1039536190E+01    6.0859877497E+01    6.0633082107E+01    6.0355886712E+01    6.0025252822E+01    5.9638444486E+01    5.9192994938E+01    5.8686779247E+01    5.8118020121E+01    5.7485314451E+01    5.6787626271E+01    5.6024346668E+01    5.5195279232E+01    5.430062 [...]
+    5.4858679435E+01    5.4884791292E+01    5.4902261534E+01    5.4908301692E+01    5.4900033234E+01    5.4874449027E+01    5.4828513018E+01    5.4759135801E+01    5.4663227730E+01    5.4537747504E+01    5.4379691839E+01    5.4186150925E+01    5.3954338142E+01    5.3681605881E+01    5.3365503785E+01    5.3003748854E+01    5.2594314196E+01    5.2135396775E+01    5.1625486261E+01    5.1063348863E+01    5.0448047119E+01    4.9778974063E+01    4.9055853153E+01    4.8278741324E+01    4.744804 [...]
+    4.8282833937E+01    4.8267035110E+01    4.8241163425E+01    4.8203083900E+01    4.8150583264E+01    4.8081377433E+01    4.7993148101E+01    4.7883548137E+01    4.7750238120E+01    4.7590920226E+01    4.7403321237E+01    4.7185265336E+01    4.6934672503E+01    4.6649584434E+01    4.6328176993E+01    4.5968808764E+01    4.5569994602E+01    4.5130483978E+01    4.4649207499E+01    4.4125358143E+01    4.3558357677E+01    4.2947878282E+01    4.2293870628E+01    4.1596537556E+01    4.085636 [...]
+    4.1512222635E+01    4.1473997467E+01    4.1425708139E+01    4.1365768114E+01    4.1292527167E+01    4.1204290781E+01    4.1099343651E+01    4.0975938417E+01    4.0832354817E+01    4.0666891296E+01    4.0477885246E+01    4.0263740802E+01    4.0022949061E+01    3.9754078729E+01    3.9455827794E+01    3.9127023807E+01    3.8766620631E+01    3.8373752347E+01    3.7947703732E+01    3.7487940290E+01    3.6994126643E+01    3.6466123777E+01    3.5903981386E+01    3.5307965447E+01    3.467856 [...]
+    3.4794209764E+01    3.4750215001E+01    3.4697358042E+01    3.4634503771E+01    3.4560461833E+01    3.4474002218E+01    3.4373882233E+01    3.4258849896E+01    3.4127664127E+01    3.3979101419E+01    3.3811970662E+01    3.3625130349E+01    3.3417493092E+01    3.3188055183E+01    3.2935888477E+01    3.2660155061E+01    3.2360141925E+01    3.2035233682E+01    3.1684953821E+01    3.1308943140E+01    3.0907005481E+01    3.0479067148E+01    3.0025216825E+01    2.9545689958E+01    2.904088 [...]
+    2.8349083594E+01    2.8312962145E+01    2.8270137545E+01    2.8219802117E+01    2.8161124803E+01    2.8093239749E+01    2.8015277204E+01    2.7926350858E+01    2.7825588599E+01    2.7712126404E+01    2.7585121991E+01    2.7443768414E+01    2.7287293310E+01    2.7114979273E+01    2.6926164040E+01    2.6720254264E+01    2.6496722537E+01    2.6255129062E+01    2.5995118385E+01    2.5716422529E+01    2.5418874223E+01    2.5102404263E+01    2.4767054743E+01    2.4412960351E+01    2.404037 [...]
+    2.2363955847E+01    2.2346317546E+01    2.2324802375E+01    2.2298860910E+01    2.2267919282E+01    2.2231384750E+01    2.2188654921E+01    2.2139114310E+01    2.2082150033E+01    2.2017155982E+01    2.1943530626E+01    2.1860691449E+01    2.1768082765E+01    2.1665166060E+01    2.1551449079E+01    2.1426467753E+01    2.1289807852E+01    2.1141100300E+01    2.0980027356E+01    2.0806331469E+01    2.0619812287E+01    2.0420327233E+01    2.0207808276E+01    1.9982244107E+01    1.974369 [...]
+    1.6988738030E+01    1.6997206266E+01    1.7005053504E+01    1.7011910233E+01    1.7017382637E+01    1.7021066285E+01    1.7022535518E+01    1.7021359701E+01    1.7017092788E+01    1.7009291305E+01    1.6997508995E+01    1.6981296170E+01    1.6960214753E+01    1.6933830872E+01    1.6901720647E+01    1.6863482435E+01    1.6818725569E+01    1.6767079507E+01    1.6708199741E+01    1.6641768430E+01    1.6567493245E+01    1.6485114241E+01    1.6394403233E+01    1.6295163276E+01    1.618723 [...]
+    1.2333999685E+01    1.2373385736E+01    1.2415610429E+01    1.2460411235E+01    1.2507515253E+01    1.2556622139E+01    1.2607419330E+01    1.2659576750E+01    1.2712744812E+01    1.2766564346E+01    1.2820661722E+01    1.2874651969E+01    1.2928133964E+01    1.2980704390E+01    1.3031950670E+01    1.3081451564E+01    1.3128784525E+01    1.3173521596E+01    1.3215233358E+01    1.3253497561E+01    1.3287885953E+01    1.3317979191E+01    1.3343365196E+01    1.3363637500E+01    1.337840 [...]
+    8.4706650037E+00    8.5432198580E+00    8.6220670433E+00    8.7070057312E+00    8.7978130268E+00    8.8942438707E+00    8.9960320593E+00    9.1028857989E+00    9.2144907604E+00    9.3305105569E+00    9.4505802466E+00    9.5743136520E+00    9.7012999450E+00    9.8311041174E+00    9.9632635396E+00    1.0097296097E+01    1.0232694346E+01    1.0368933499E+01    1.0505463652E+01    1.0641715347E+01    1.0777106176E+01    1.0911033010E+01    1.1042879722E+01    1.1172021925E+01    1.129782 [...]
+    5.4313051589E+00    5.5370276761E+00    5.6523195691E+00    5.7769934420E+00    5.9108353896E+00    6.0536055236E+00    6.2050357281E+00    6.3648258648E+00    6.5326454551E+00    6.7081307966E+00    6.8908837957E+00    7.0804679621E+00    7.2764161875E+00    7.4782179947E+00    7.6853284837E+00    7.8971651205E+00    8.1131089919E+00    8.3325003225E+00    8.5546481921E+00    8.7788231734E+00    9.0042662318E+00    9.2301836190E+00    9.4557577471E+00    9.6801396203E+00    9.902459 [...]
+    3.2128288987E+00    3.3498152006E+00    3.4993280250E+00    3.6611586150E+00    3.8350678993E+00    4.0207847971E+00    4.2180031129E+00    4.4263779001E+00    4.6455271019E+00    4.8750250993E+00    5.1144028771E+00    5.3631483999E+00    5.6206999919E+00    5.8864508326E+00    6.1597444148E+00    6.4398763806E+00    6.7260937300E+00    7.0175952792E+00    7.3135322535E+00    7.6130099116E+00    7.9150902228E+00    8.2187936530E+00    8.5231020143E+00    8.8269612065E+00    9.129283 [...]
+    1.7803000481E+00    1.9451179992E+00    2.1249889867E+00    2.3196601964E+00    2.5288420768E+00    2.7522069827E+00    2.9893856217E+00    3.2399645152E+00    3.5034842849E+00    3.7794358675E+00    4.0672592004E+00    4.3663416800E+00    4.6760153796E+00    4.9955578335E+00    5.3241892005E+00    5.6610740644E+00    6.0053187852E+00    6.3559748719E+00    6.7120387453E+00    7.0724537341E+00    7.4361133518E+00    7.8018598352E+00    8.1684940492E+00    8.5347754587E+00    8.899425 [...]
+    1.0716327472E+00    1.2597014788E+00    1.4648438699E+00    1.6867470854E+00    1.9250555275E+00    2.1793705249E+00    2.4492442755E+00    2.7341808203E+00    3.0336297505E+00    3.3469863425E+00    3.6735889807E+00    4.0127164183E+00    4.3635868193E+00    4.7253584137E+00    5.0971250397E+00    5.4779209701E+00    5.8667163142E+00    6.2624227353E+00    6.6638906128E+00    7.0699148839E+00    7.4792344564E+00    7.8905386123E+00    8.3024690643E+00    8.7136260517E+00    9.122569 [...]
+    1.0028891685E+00    1.2088517742E+00    1.4333577851E+00    1.6760265353E+00    1.9364302340E+00    2.2140904369E+00    2.5084772263E+00    2.8190038430E+00    3.1450270879E+00    3.4858435357E+00    3.8406882621E+00    4.2087319470E+00    4.5890823513E+00    4.9807816769E+00    5.3828063310E+00    5.7940684402E+00    6.2134147800E+00    6.6396303138E+00    7.0714382688E+00    7.5075045900E+00    7.9464397989E+00    8.3868039333E+00    8.8271084276E+00    9.2658228670E+00    9.701386 [...]
+    1.4739114793E+00    1.6919868645E+00    1.9295093440E+00    2.1860301287E+00    2.4610473959E+00    2.7540050042E+00    3.0642902611E+00    3.3912303957E+00    3.7340910115E+00    4.0920758799E+00    4.4643225507E+00    4.8499039233E+00    5.2478256441E+00    5.6570275314E+00    6.0763813119E+00    6.5046938105E+00    6.9407086803E+00    7.3831021895E+00    7.8304966204E+00    8.2814542670E+00    8.7344824120E+00    9.1880432646E+00    9.6405519076E+00    1.0090386127E+01    1.053589 [...]
+    2.3740415922E+00    2.5983446834E+00    2.8424448592E+00    3.1058279429E+00    3.3879251678E+00    3.6881070351E+00    4.0056857726E+00    4.3399110985E+00    4.6899682952E+00    5.0549773599E+00    5.4339942739E+00    5.8260049535E+00    6.2299320286E+00    6.6446269517E+00    7.0688805117E+00    7.5014140497E+00    7.9408899276E+00    8.3859061381E+00    8.8350040584E+00    9.2866740447E+00    9.7393555097E+00    1.0191438996E+01    1.0641283904E+01    1.1087207230E+01    1.152750 [...]
+    3.5876911016E+00    3.8125164098E+00    4.0569678875E+00    4.3204754671E+00    4.6024103385E+00    4.9020834636E+00    5.2187428990E+00    5.5515730022E+00    5.8996925400E+00    6.2621568411E+00    6.6379532889E+00    7.0260035826E+00    7.4251624643E+00    7.8342217321E+00    8.2519090833E+00    8.6768855974E+00    9.1077604725E+00    9.5430771495E+00    9.9813353305E+00    1.0420976596E+01    1.0860400249E+01    1.1297972529E+01    1.1732016305E+01    1.2160836008E+01    1.258270 [...]
+    4.9995650984E+00    5.2196232112E+00    5.4586676617E+00    5.7160845037E+00    5.9911993065E+00    6.2832743706E+00    6.5915109698E+00    6.9150425168E+00    7.2529399188E+00    7.6042108849E+00    7.9677968291E+00    8.3425750539E+00    8.7273570531E+00    9.1208958830E+00    9.5218830708E+00    9.9289493402E+00    1.0340671641E+01    1.0755576141E+01    1.1172138640E+01    1.1588793432E+01    1.2003934289E+01    1.2415922457E+01    1.2823090553E+01    1.3223754092E+01    1.361621 [...]
+    6.4993604075E+00    6.7099674448E+00    6.9385194273E+00    7.1843716367E+00    7.4468182299E+00    7.7250903660E+00    8.0183551901E+00    8.3257189989E+00    8.6462218224E+00    8.9788425007E+00    9.3225001196E+00    9.6760495159E+00    1.0038284250E+01    1.0407940866E+01    1.0783702546E+01    1.1164192820E+01    1.1547992364E+01    1.1933631150E+01    1.2319594886E+01    1.2704334983E+01    1.3086271706E+01    1.3463794476E+01    1.3835276383E+01    1.4199074621E+01    1.455354 [...]
+    7.9858083250E+00    8.1830261168E+00    8.3968224623E+00    8.6265370304E+00    8.8714448846E+00    9.1307623423E+00    9.4036457532E+00    9.6891860618E+00    9.9864181015E+00    1.0294311957E+01    1.0611782856E+01    1.0937688013E+01    1.1270826268E+01    1.1609946094E+01    1.1953740111E+01    1.2300859060E+01    1.2649903508E+01    1.2999438856E+01    1.3347990531E+01    1.3694055479E+01    1.4036102220E+01    1.4372579442E+01    1.4701928535E+01    1.5022575488E+01    1.533295 [...]
+    9.3699634416E+00    9.5506901280E+00    9.7463875013E+00    9.9563866535E+00    1.0179968135E+01    1.0416346894E+01    1.0664681116E+01    1.0924073602E+01    1.1193563087E+01    1.1472140622E+01    1.1758733987E+01    1.2052224470E+01    1.2351439539E+01    1.2655158554E+01    1.2962117293E+01    1.3271005572E+01    1.3580477584E+01    1.3889152264E+01    1.4195618684E+01    1.4498444774E+01    1.4796174281E+01    1.5087340066E+01    1.5370466194E+01    1.5644080355E+01    1.590671 [...]
+    1.0577669965E+01    1.0739687834E+01    1.0914904932E+01    1.1102664018E+01    1.1302258673E+01    1.1512922476E+01    1.1733832794E+01    1.1964117248E+01    1.2202843030E+01    1.2449033510E+01    1.2701653966E+01    1.2959628828E+01    1.3221830352E+01    1.3487094811E+01    1.3754214726E+01    1.4021947171E+01    1.4289017162E+01    1.4554119853E+01    1.4815930322E+01    1.5073103070E+01    1.5324277701E+01    1.5568090425E+01    1.5803174747E+01    1.6028165868E+01    1.624171 [...]
+    1.1551195327E+01    1.1693170190E+01    1.1846491314E+01    1.2010529953E+01    1.2184603722E+01    1.2367977122E+01    1.2559864871E+01    1.2759430985E+01    1.2965791276E+01    1.3178012378E+01    1.3395121273E+01    1.3616095470E+01    1.3839878137E+01    1.4065372284E+01    1.4291448510E+01    1.4516945408E+01    1.4740677114E+01    1.4961434533E+01    1.5177989232E+01    1.5389104688E+01    1.5593531670E+01    1.5790021003E+01    1.5977328772E+01    1.6154217578E+01    1.631946 [...]
+    1.2250027706E+01    1.2371476086E+01    1.2502413730E+01    1.2642247931E+01    1.2790337927E+01    1.2945987304E+01    1.3108461238E+01    1.3276975738E+01    1.3450705763E+01    1.3628780460E+01    1.3810292954E+01    1.3994298296E+01    1.4179815222E+01    1.4365832811E+01    1.4551310124E+01    1.4735188149E+01    1.4916374408E+01    1.5093772377E+01    1.5266266959E+01    1.5432732850E+01    1.5592049464E+01    1.5743091182E+01    1.5884744051E+01    1.6015905452E+01    1.613549 [...]
+    1.2650899350E+01    1.2752116847E+01    1.2861034094E+01    1.2977099933E+01    1.3099719341E+01    1.3228255034E+01    1.3362025947E+01    1.3500315159E+01    1.3642358901E+01    1.3787367996E+01    1.3934511200E+01    1.4082926015E+01    1.4231722080E+01    1.4379986817E+01    1.4526778797E+01    1.4671138671E+01    1.4812091331E+01    1.4948653491E+01    1.5079827664E+01    1.5204618026E+01    1.5322025349E+01    1.5431063273E+01    1.5530746993E+01    1.5620118738E+01    1.569823 [...]
+    1.2747076969E+01    1.2829052091E+01    1.2917057208E+01    1.3010593768E+01    1.3109119669E+01    1.3212057513E+01    1.3318795759E+01    1.3428683887E+01    1.3541037444E+01    1.3655146780E+01    1.3770267162E+01    1.3885627793E+01    1.4000436087E+01    1.4113878679E+01    1.4225121741E+01    1.4333316740E+01    1.4437606234E+01    1.4537122731E+01    1.4630995156E+01    1.4718352027E+01    1.4798329186E+01    1.4870066038E+01    1.4932720456E+01    1.4985464163E+01    1.502749 [...]
+    1.2547044797E+01    1.2611344511E+01    1.2680174230E+01    1.2753087496E+01    1.2829608146E+01    1.2909221748E+01    1.2991384738E+01    1.3075523632E+01    1.3161037374E+01    1.3247298815E+01    1.3333652924E+01    1.3419426407E+01    1.3503925779E+01    1.3586440452E+01    1.3666246578E+01    1.3742609821E+01    1.3814786942E+01    1.3882030753E+01    1.3943592523E+01    1.3998729796E+01    1.4046700848E+01    1.4086780320E+01    1.4118251576E+01    1.4140425676E+01    1.415262 [...]
+    1.2072663348E+01    1.2121306832E+01    1.2173185097E+01    1.2227909706E+01    1.2285065539E+01    1.2344208305E+01    1.2404865063E+01    1.2466538750E+01    1.2528714375E+01    1.2590844291E+01    1.2652372705E+01    1.2712716667E+01    1.2771284710E+01    1.2827471063E+01    1.2880657022E+01    1.2930218897E+01    1.2975528947E+01    1.3015955197E+01    1.3050869879E+01    1.3079646684E+01    1.3101670172E+01    1.3116335337E+01    1.3123052317E+01    1.3121250473E+01    1.311037 [...]
+    1.1356929863E+01    1.1392261791E+01    1.1429763670E+01    1.1469101522E+01    1.1509924996E+01    1.1551854298E+01    1.1594492242E+01    1.1637418958E+01    1.1680194593E+01    1.1722362659E+01    1.1763450704E+01    1.1802976081E+01    1.1840440205E+01    1.1875336117E+01    1.1907150682E+01    1.1935365803E+01    1.1959459037E+01    1.1978910065E+01    1.1993202157E+01    1.2001822824E+01    1.2004270967E+01    1.2000052658E+01    1.1988690691E+01    1.1969727494E+01    1.194272 [...]
+    1.0441481725E+01    1.0466045587E+01    1.0491949622E+01    1.0518920556E+01    1.0546665778E+01    1.0574874782E+01    1.0603215068E+01    1.0631342247E+01    1.0658893325E+01    1.0685495012E+01    1.0710758682E+01    1.0734288012E+01    1.0755676568E+01    1.0774511881E+01    1.0790377435E+01    1.0802849190E+01    1.0811507938E+01    1.0815934849E+01    1.0815712557E+01    1.0810432067E+01    1.0799692012E+01    1.0783102156E+01    1.0760285389E+01    1.0730881030E+01    1.069454 [...]
+    9.3739462740E+00    9.3903527599E+00    9.4075136249E+00    9.4252086234E+00    9.4432012860E+00    9.4612411011E+00    9.4790629518E+00    9.4963893611E+00    9.5129304683E+00    9.5283868279E+00    9.5424512011E+00    9.5548048114E+00    9.5651243636E+00    9.5730824624E+00    9.5783504330E+00    9.5805935115E+00    9.5794804772E+00    9.5746813434E+00    9.5658709151E+00    9.5527289737E+00    9.5349415352E+00    9.5122090628E+00    9.4842385159E+00    9.4507537685E+00    9.411493 [...]
+    8.2052786772E+00    8.2160971017E+00    8.2273155370E+00    8.2387604743E+00    8.2502486270E+00    8.2615848105E+00    8.2725644036E+00    8.2829704687E+00    8.2925776530E+00    8.3011543410E+00    8.3084623515E+00    8.3142553581E+00    8.3182848218E+00    8.3202983939E+00    8.3200401302E+00    8.3172561531E+00    8.3116911799E+00    8.3030930958E+00    8.2912125070E+00    8.2758060624E+00    8.2566360110E+00    8.2334732054E+00    8.2060972849E+00    8.1743018762E+00    8.137887 [...]
+    6.9871760508E+00    6.9948329085E+00    7.0027487759E+00    7.0107920989E+00    7.0188247632E+00    7.0267039046E+00    7.0342722905E+00    7.0413700004E+00    7.0478280355E+00    7.0534729169E+00    7.0581265522E+00    7.0616054722E+00    7.0637228199E+00    7.0642906730E+00    7.0631183556E+00    7.0600161273E+00    7.0547925945E+00    7.0472603115E+00    7.0372338164E+00    7.0245308778E+00    7.0089744120E+00    6.9903937335E+00    6.9686252669E+00    6.9435120072E+00    6.914909 [...]
+    5.7697043773E+00    5.7763994798E+00    5.7833979868E+00    5.7906086325E+00    5.7979330767E+00    5.8052667657E+00    5.8124987764E+00    5.8195136141E+00    5.8261919241E+00    5.8324069935E+00    5.8380319794E+00    5.8429337814E+00    5.8469780943E+00    5.8500289034E+00    5.8519481904E+00    5.8525978434E+00    5.8518385485E+00    5.8495337018E+00    5.8455462279E+00    5.8397421656E+00    5.8319898337E+00    5.8221634216E+00    5.8101386627E+00    5.7957979079E+00    5.779030 [...]
+    4.5991836653E+00    4.6068198250E+00    4.6149654015E+00    4.6235591575E+00    4.6325340418E+00    4.6418202210E+00    4.6513424881E+00    4.6610221966E+00    4.6707767534E+00    4.6805208175E+00    4.6901653193E+00    4.6996187226E+00    4.7087877238E+00    4.7175750113E+00    4.7258843474E+00    4.7336158671E+00    4.7406695863E+00    4.7469459229E+00    4.7523438282E+00    4.7567643886E+00    4.7601077537E+00    4.7622761795E+00    4.7631732256E+00    4.7627066835E+00    4.760783 [...]
+    3.5164185133E+00    3.5265595324E+00    3.5375404769E+00    3.5493241407E+00    3.5618692178E+00    3.5751304397E+00    3.5890609240E+00    3.6036097392E+00    3.6187234758E+00    3.6343454031E+00    3.6504167215E+00    3.6668751881E+00    3.6836568746E+00    3.7006947440E+00    3.7179189147E+00    3.7352590592E+00    3.7526408051E+00    3.7699894206E+00    3.7872276476E+00    3.8042769607E+00    3.8210574281E+00    3.8374884841E+00    3.8534874073E+00    3.8689731395E+00    3.883861 [...]
+    2.5553215788E+00    2.5691606839E+00    2.5842618268E+00    2.6006038894E+00    2.6181633089E+00    2.6369143135E+00    2.6568283266E+00    2.6778745944E+00    2.7000195669E+00    2.7232268134E+00    2.7474566726E+00    2.7726675358E+00    2.7988137759E+00    2.8258468435E+00    2.8537158021E+00    2.8823645540E+00    2.9117359742E+00    2.9417680078E+00    2.9723952096E+00    3.0035491492E+00    3.0351582167E+00    3.0671463553E+00    3.0994352980E+00    3.1319428576E+00    3.164582 [...]
+    1.7419428853E+00    1.7602954480E+00    1.7803866714E+00    1.8022065723E+00    1.8257426014E+00    1.8509807409E+00    1.8779045358E+00    1.9064944005E+00    1.9367286250E+00    1.9685826565E+00    2.0020276928E+00    2.0370326300E+00    2.0735618016E+00    2.1115756295E+00    2.1510305962E+00    2.1918779317E+00    2.2340647503E+00    2.2775334803E+00    2.3222209306E+00    2.3680581859E+00    2.4149717669E+00    2.4628824343E+00    2.5117038141E+00    2.5613462320E+00    2.611712 [...]
+    1.0939296091E+00    1.1172387170E+00    1.1427850865E+00    1.1705636114E+00    1.2005676880E+00    1.2327880316E+00    1.2672133088E+00    1.3038292016E+00    1.3426183516E+00    1.3835596892E+00    1.4266285407E+00    1.4717954883E+00    1.5190272510E+00    1.5682842293E+00    1.6195226990E+00    1.6726926189E+00    1.7277378169E+00    1.7845958758E+00    1.8431971147E+00    1.9034649362E+00    1.9653164652E+00    2.0286595874E+00    2.0933961310E+00    2.1594183465E+00    2.226612 [...]
+    6.2039225110E-01    6.4875159070E-01    6.7983750559E-01    7.1364519416E-01    7.5016803205E-01    7.8939693692E-01    8.3131981428E-01    8.7592129827E-01    9.2318209850E-01    9.7307894657E-01    1.0255838878E+00    1.0806633807E+00    1.1382786957E+00    1.1983849237E+00    1.2609305268E+00    1.3258569296E+00    1.3930983213E+00    1.4625808010E+00    1.5342221930E+00    1.6079322616E+00    1.6836113485E+00    1.7611507405E+00    1.8404324398E+00    1.9213285012E+00    2.003701 [...]
+    3.2215833877E-01    3.5534716862E-01    3.9171501105E-01    4.3125385442E-01    4.7395303588E-01    5.1979861733E-01    5.6877331847E-01    6.2085578176E-01    6.7602010737E-01    7.3423552374E-01    7.9546523914E-01    8.5966696808E-01    9.2679130348E-01    9.9678196130E-01    1.0695748820E+00    1.1450980095E+00    1.2232706851E+00    1.3040029548E+00    1.3871956540E+00    1.4727395341E+00    1.5605153277E+00    1.6503933816E+00    1.7422327473E+00    1.8358818895E+00    1.931178 [...]
+    1.9236962413E-01    2.2989719718E-01    2.7099719394E-01    3.1565497995E-01    3.6385251025E-01    4.1556793440E-01    4.7077512908E-01    5.2944304873E-01    5.9153534057E-01    6.5700966009E-01    7.2581745804E-01    7.9790271583E-01    8.7320229141E-01    9.5164483273E-01    1.0331501384E+00    1.1176289862E+00    1.2049827845E+00    1.2951026335E+00    1.3878690541E+00    1.4831518455E+00    1.5808096802E+00    1.6806896817E+00    1.7826271763E+00    1.8864457212E+00    1.991956 [...]
+    2.1737115170E-01    2.5852882276E-01    3.0357555089E-01    3.5248784723E-01    4.0523807704E-01    4.6179388658E-01    5.2211790040E-01    5.8616685014E-01    6.5389153256E-01    7.2523571578E-01    8.0013605529E-01    8.7852109530E-01    9.6031119496E-01    1.0454178088E+00    1.1337425580E+00    1.2251774570E+00    1.3196040629E+00    1.4168930296E+00    1.5169038924E+00    1.6194842815E+00    1.7244704957E+00    1.8316861295E+00    1.9409427592E+00    2.0520402031E+00    2.164764 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_tetrahedron_BA.ima b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_tetrahedron_BA.ima
new file mode 100644
index 0000000..64c51b2
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_tetrahedron_BA.ima
@@ -0,0 +1,100 @@
+    4.7838210091E+02    4.7534355673E+02    4.7203551011E+02    4.6846400624E+02    4.6463554505E+02    4.6055706421E+02    4.5623591822E+02    4.5167985922E+02    4.4689701732E+02    4.4189586882E+02    4.3668541478E+02    4.3127423803E+02    4.2567226599E+02    4.1988899245E+02    4.1393430115E+02    4.0781829052E+02    4.0155123535E+02    3.9514356200E+02    3.8860582247E+02    3.8194866649E+02    3.7518281471E+02    3.6831903163E+02    3.6136809898E+02    3.5434078915E+02    3.472478 [...]
+    4.7779277484E+02    4.7475739209E+02    4.7145279245E+02    4.6788501525E+02    4.6406055432E+02    4.5998634002E+02    4.5566972002E+02    4.5111843901E+02    4.4634061743E+02    4.4134472926E+02    4.3613957893E+02    4.3073427745E+02    4.2513821789E+02    4.1936105015E+02    4.1341265532E+02    4.0730311952E+02    4.0104270740E+02    3.9464183539E+02    3.8811104478E+02    3.8146097465E+02    3.7470233495E+02    3.6784587946E+02    3.6090237913E+02    3.5388259556E+02    3.467972 [...]
+    4.7602744734E+02    4.7300137817E+02    4.6970695084E+02    4.6615018703E+02    4.6233756163E+02    4.5827598470E+02    4.5397278231E+02    4.4943567639E+02    4.4467276348E+02    4.3969249253E+02    4.3450364195E+02    4.2911529581E+02    4.2353681932E+02    4.1777783375E+02    4.1184819084E+02    4.0575794668E+02    3.9951733533E+02    3.9313674213E+02    3.8662667688E+02    3.7999774682E+02    3.7326062978E+02    3.6642604727E+02    3.5950473786E+02    3.5250743072E+02    3.454448 [...]
+    4.7309644579E+02    4.7008556338E+02    4.6680775364E+02    4.6326900947E+02    4.5947577462E+02    4.5543492583E+02    4.5115375373E+02    4.4663994278E+02    4.4190155011E+02    4.3694698347E+02    4.3178497835E+02    4.2642457430E+02    4.2087509054E+02    4.1514610101E+02    4.0924740885E+02    4.0318902049E+02    3.9698111932E+02    3.9063403919E+02    3.8415823764E+02    3.7756426913E+02    3.7086275820E+02    3.6406437278E+02    3.5717979763E+02    3.5021970806E+02    3.431947 [...]
+    4.6901846916E+02    4.6602833700E+02    4.6277327635E+02    4.5925924055E+02    4.5549263062E+02    4.5148027742E+02    4.4722942276E+02    4.4274769941E+02    4.3804311011E+02    4.3312400565E+02    4.2799906221E+02    4.2267725770E+02    4.1716784765E+02    4.1148034039E+02    4.0562447173E+02    3.9961017914E+02    3.9344757571E+02    3.8714692373E+02    3.8071860819E+02    3.7417311011E+02    3.6752097993E+02    3.6077281102E+02    3.5393921324E+02    3.4703078690E+02    3.400580 [...]
+    4.6382038798E+02    4.6085623355E+02    4.5762970989E+02    4.5414672063E+02    4.5041361294E+02    4.4643715983E+02    4.4222454145E+02    4.3778332522E+02    4.3312144507E+02    4.2824717965E+02    4.2316912989E+02    4.1789619555E+02    4.1243755134E+02    4.0680262222E+02    4.0100105839E+02    3.9504270967E+02    3.8893759965E+02    3.8269589957E+02    3.7632790196E+02    3.6984399427E+02    3.6325463250E+02    3.5657031487E+02    3.4980155571E+02    3.4295885955E+02    3.360526 [...]
+    4.5753695516E+02    4.5460364761E+02    4.5141107964E+02    4.4796509559E+02    4.4427197827E+02    4.4033843147E+02    4.3617156145E+02    4.3177885724E+02    4.2716817011E+02    4.2234769207E+02    4.1732593349E+02    4.1211170009E+02    4.0671406917E+02    4.0114236525E+02    3.9540613527E+02    3.8951512327E+02    3.8347924480E+02    3.7730856106E+02    3.7101325287E+02    3.6460359455E+02    3.5808992781E+02    3.5148263575E+02    3.4479211701E+02    3.3802876013E+02    3.312029 [...]
+    4.5021043115E+02    4.4731246322E+02    4.4415887915E+02    4.4075545498E+02    4.3710839930E+02    4.3322433596E+02    4.2911028574E+02    4.2477364699E+02    4.2022217500E+02    4.1546396140E+02    4.1050741144E+02    4.0536122153E+02    4.0003435574E+02    3.9453602172E+02    3.8887564621E+02    3.8306285002E+02    3.7710742282E+02    3.7101929750E+02    3.6480852457E+02    3.5848524630E+02    3.5205967097E+02    3.4554204721E+02    3.3894263844E+02    3.3227169763E+02    3.255394 [...]
+    4.4189012876E+02    4.3903160308E+02    4.3592162372E+02    4.3256589012E+02    4.2897052744E+02    4.2514206954E+02    4.2108744087E+02    4.1681393732E+02    4.1232920618E+02    4.0764122517E+02    4.0275828073E+02    3.9768894551E+02    3.9244205527E+02    3.8702668515E+02    3.8145212551E+02    3.7572785731E+02    3.6986352719E+02    3.6386892228E+02    3.5775394492E+02    3.5152858719E+02    3.4520290555E+02    3.3878699552E+02    3.3229096654E+02    3.2572491711E+02    3.190989 [...]
+    4.3263188407E+02    4.2981650368E+02    4.2675433003E+02    4.2345097831E+02    4.1991248177E+02    4.1614527491E+02    4.1215617577E+02    4.0795236692E+02    4.0354137582E+02    3.9893105420E+02    3.9412955657E+02    3.8914531819E+02    3.8398703225E+02    3.7866362660E+02    3.7318423988E+02    3.6755819738E+02    3.6179498649E+02    3.5590423193E+02    3.4989567087E+02    3.4377912791E+02    3.3756449011E+02    3.3126168212E+02    3.2488064145E+02    3.1843129401E+02    3.119235 [...]
+    4.2249746060E+02    4.1972852381E+02    4.1671792909E+02    4.1347120042E+02    4.0999427133E+02    4.0629346845E+02    4.0237549397E+02    3.9824740710E+02    3.9391660468E+02    3.8939080088E+02    3.8467800619E+02    3.7978650568E+02    3.7472483665E+02    3.6950176569E+02    3.6412626535E+02    3.5860749035E+02    3.5295475349E+02    3.4717750136E+02    3.4128528991E+02    3.3528775986E+02    3.2919461224E+02    3.2301558395E+02    3.1676042352E+02    3.1043886710E+02    3.040606 [...]
+    4.1155389513E+02    4.0883429452E+02    4.0587862058E+02    4.0269229975E+02    3.9928115884E+02    3.9565140875E+02    3.9180962732E+02    3.8776274109E+02    3.8351800632E+02    3.7908298902E+02    3.7446554439E+02    3.6967379546E+02    3.6471611119E+02    3.5960108400E+02    3.5433750685E+02    3.4893434998E+02    3.4340073726E+02    3.3774592244E+02    3.3197926512E+02    3.2611020678E+02    3.2014824677E+02    3.1410291836E+02    3.0798376502E+02    3.0180031692E+02    2.955620 [...]
+    3.9987279401E+02    3.9720501951E+02    3.9430717742E+02    3.9118459114E+02    3.8784297438E+02    3.8428841530E+02    3.8052735962E+02    3.7656659283E+02    3.7241322148E+02    3.6807465374E+02    3.6355857915E+02    3.5887294783E+02    3.5402594894E+02    3.4902598874E+02    3.4388166819E+02    3.3860176013E+02    3.3319518619E+02    3.2767099356E+02    3.2203833152E+02    3.1630642795E+02    3.1048456589E+02    3.0458206017E+02    2.9860823419E+02    2.9257239698E+02    2.864838 [...]
+    3.8752958952E+02    3.8491573530E+02    3.8207821017E+02    3.7902222957E+02    3.7575338857E+02    3.7227764633E+02    3.6860130954E+02    3.6473101504E+02    3.6067371151E+02    3.5643664043E+02    3.5202731638E+02    3.4745350658E+02    3.4272320998E+02    3.3784463575E+02    3.3282618141E+02    3.2767641057E+02    3.2240403041E+02    3.1701786895E+02    3.1152685220E+02    3.0593998123E+02    3.0026630929E+02    2.9451491904E+02    2.8869489990E+02    2.8281532570E+02    2.768852 [...]
+    3.7460276641E+02    3.7204454141E+02    3.6926940092E+02    3.6628244825E+02    3.6308915501E+02    3.5969534587E+02    3.5610718240E+02    3.5233114608E+02    3.4837402041E+02    3.4424287236E+02    3.3994503310E+02    3.3548807806E+02    3.3087980654E+02    3.2612822073E+02    3.2124150440E+02    3.1622800120E+02    3.1109619271E+02    3.0585467633E+02    3.0051214301E+02    2.9507735490E+02    2.8955912316E+02    2.8396628571E+02    2.7830768525E+02    2.7259214752E+02    2.668284 [...]
+    3.6117306875E+02    3.5867181048E+02    3.5596071709E+02    3.5304477626E+02    3.4992933203E+02    3.4662006987E+02    3.4312300095E+02    3.3944444554E+02    3.3559101560E+02    3.3156959664E+02    3.2738732899E+02    3.2305158841E+02    3.1856996615E+02    3.1395024862E+02    3.0920039659E+02    3.0432852413E+02    2.9934287727E+02    2.9425181247E+02    2.8906377497E+02    2.8378727716E+02    2.7843087692E+02    2.7300315611E+02    2.6751269916E+02    2.6196807202E+02    2.563778 [...]
+    3.4732269756E+02    3.4487938900E+02    3.4223361545E+02    3.3939024614E+02    3.3635449411E+02    3.3313190171E+02    3.2972832525E+02    3.2614991879E+02    3.2240311723E+02    3.1849461868E+02    3.1443136619E+02    3.1022052891E+02    3.0586948275E+02    3.0138579058E+02    2.9677718209E+02    2.9205153327E+02    2.8721684577E+02    2.8228122596E+02    2.7725286400E+02    2.7214001280E+02    2.6695096708E+02    2.6169404246E+02    2.5637755485E+02    2.5100979993E+02    2.455990 [...]
+    3.3313450967E+02    3.3074979877E+02    3.2817024654E+02    3.2540060154E+02    3.2244594311E+02    3.1931166728E+02    3.1600347180E+02    3.1252734037E+02    3.0888952626E+02    3.0509653511E+02    3.0115510721E+02    2.9707219923E+02    2.9285496547E+02    2.8851073861E+02    2.8404701023E+02    2.7947141094E+02    2.7479169033E+02    2.7001569678E+02    2.6515135712E+02    2.6020665635E+02    2.5518961733E+02    2.5010828063E+02    2.4497068453E+02    2.3978484530E+02    2.345587 [...]
+    3.1869122783E+02    3.1636544939E+02    3.1385266979E+02    3.1115751527E+02    3.0828492947E+02    3.0524015958E+02    3.0202874188E+02    2.9865648643E+02    2.9512946109E+02    2.9145397490E+02    2.8763656090E+02    2.8368395841E+02    2.7960309485E+02    2.7540106718E+02    2.7108512295E+02    2.6666264121E+02    2.6214111302E+02    2.5752812199E+02    2.5283132466E+02    2.4805843089E+02    2.4321718428E+02    2.3831534271E+02    2.3336065912E+02    2.2836086241E+02    2.233236 [...]
+    3.0407467209E+02    3.0180787154E+02    2.9936208897E+02    2.9674182731E+02    2.9395189300E+02    2.9099738266E+02    2.8788366893E+02    2.8461638566E+02    2.8120141244E+02    2.7764485847E+02    2.7395304598E+02    2.7013249303E+02    2.6618989597E+02    2.6213211150E+02    2.5796613842E+02    2.5369909909E+02    2.4933822075E+02    2.4489081670E+02    2.4036426742E+02    2.3576600162E+02    2.3110347749E+02    2.2638416390E+02    2.2161552193E+02    2.1680498655E+02    2.119599 [...]
+    2.8936502153E+02    2.8715698029E+02    2.8477811744E+02    2.8223281209E+02    2.7952573270E+02    2.7666182413E+02    2.7364629394E+02    2.7048459801E+02    2.6718242559E+02    2.6374568370E+02    2.6018048106E+02    2.5649311156E+02    2.5269003728E+02    2.4877787123E+02    2.4476335969E+02    2.4065336443E+02    2.3645484471E+02    2.3217483914E+02    2.2782044753E+02    2.2339881275E+02    2.1891710263E+02    2.1438249196E+02    2.0980214476E+02    2.0518319673E+02    2.005327 [...]
+    2.7464011533E+02    2.7249037729E+02    2.7017808172E+02    2.6770748389E+02    2.6508311403E+02    2.6230976473E+02    2.5939247768E+02    2.5633652976E+02    2.5314741858E+02    2.4983084744E+02    2.4639270983E+02    2.4283907344E+02    2.3917616388E+02    2.3541034798E+02    2.3154811689E+02    2.2759606894E+02    2.2356089236E+02    2.1944934784E+02    2.1526825118E+02    2.1102445584E+02    2.0672483559E+02    2.0237626735E+02    1.9798561414E+02    1.9355970832E+02    1.891053 [...]
+    2.5997480088E+02    2.5788269965E+02    2.5563637140E+02    2.5323994805E+02    2.5069782184E+02    2.4801463313E+02    2.4519525759E+02    2.4224479278E+02    2.3916854414E+02    2.3597201051E+02    2.3266086921E+02    2.2924096066E+02    2.2571827268E+02    2.2209892451E+02    2.1838915053E+02    2.1459528384E+02    2.1072373968E+02    2.0678099878E+02    2.0277359068E+02    1.9870807706E+02    1.9459103518E+02    1.9042904148E+02    1.8622865529E+02    1.8199640285E+02    1.777387 [...]
+    2.4544033610E+02    2.4340502262E+02    2.4122384253E+02    2.3890080525E+02    2.3644016574E+02    2.3384641276E+02    2.3112425640E+02    2.2827861518E+02    2.2531460255E+02    2.2223751293E+02    2.1905280736E+02    2.1576609873E+02    2.1238313672E+02    2.0890979243E+02    2.0535204286E+02    2.0171595512E+02    1.9800767061E+02    1.9423338906E+02    1.9039935267E+02    1.8651183014E+02    1.8257710093E+02    1.7860143959E+02    1.7459110029E+02    1.7055230160E+02    1.664912 [...]
+    2.3110385213E+02    2.2912432232E+02    2.2700728053E+02    2.2475661493E+02    2.2237644439E+02    2.1987110711E+02    2.1724514863E+02    2.1450330933E+02    2.1165051149E+02    2.0869184586E+02    2.0563255785E+02    2.0247803339E+02    1.9923378449E+02    1.9590543454E+02    1.9249870343E+02    1.8901939253E+02    1.8547336951E+02    1.8186655321E+02    1.7820489844E+02    1.7449438087E+02    1.7074098197E+02    1.6695067417E+02    1.6312940620E+02    1.5928308858E+02    1.554175 [...]
+    2.1702788147E+02    2.1510300344E+02    2.1304892782E+02    2.1086942310E+02    2.0856847360E+02    2.0615026848E+02    2.0361919022E+02    2.0097980257E+02    1.9823683806E+02    1.9539518516E+02    1.9245987503E+02    1.8943606797E+02    1.8632903962E+02    1.8314416690E+02    1.7988691381E+02    1.7656281711E+02    1.7317747191E+02    1.6973651720E+02    1.6624562145E+02    1.6271046823E+02    1.5913674199E+02    1.5553011395E+02    1.5189622819E+02    1.4824068803E+02    1.445690 [...]
+    2.0326995555E+02    2.0139849616E+02    1.9940608026E+02    1.9729635847E+02    1.9507318246E+02    1.9274059431E+02    1.9030281535E+02    1.8776423468E+02    1.8512939710E+02    1.8240299081E+02    1.7958983478E+02    1.7669486570E+02    1.7372312488E+02    1.7067974484E+02    1.6756993574E+02    1.6439897180E+02    1.6117217757E+02    1.5789491423E+02    1.5457256592E+02    1.5121052616E+02    1.4781418431E+02    1.4438891233E+02    1.4094005162E+02    1.3747290017E+02    1.339926 [...]
+    1.8988227472E+02    1.8806292513E+02    1.8613075527E+02    1.8408930003E+02    1.8194228059E+02    1.7969359419E+02    1.7734730343E+02    1.7490762515E+02    1.7237891895E+02    1.6976567536E+02    1.6707250376E+02    1.6430411997E+02    1.6146533373E+02    1.5856103594E+02    1.5559618577E+02    1.5257579777E+02    1.4950492885E+02    1.4638866531E+02    1.4323210992E+02    1.4004036906E+02    1.3681854002E+02    1.3357169845E+02    1.3030488602E+02    1.2702309838E+02    1.237312 [...]
+    1.7691145235E+02    1.7514285223E+02    1.7326943360E+02    1.7129461786E+02    1.6922199815E+02    1.6705532945E+02    1.6479851832E+02    1.6245561223E+02    1.6003078851E+02    1.5752834314E+02    1.5495267910E+02    1.5230829465E+02    1.4959977137E+02    1.4683176201E+02    1.4400897836E+02    1.4113617892E+02    1.3821815668E+02    1.3525972683E+02    1.3226571457E+02    1.2924094305E+02    1.2619022134E+02    1.2311833273E+02    1.2003002313E+02    1.1692998976E+02    1.138228 [...]
+    1.6439833379E+02    1.6267909403E+02    1.6086287529E+02    1.5895298791E+02    1.5695289962E+02    1.5486622597E+02    1.5269672053E+02    1.5044826455E+02    1.4812485653E+02    1.4573060139E+02    1.4326969945E+02    1.4074643527E+02    1.3816516623E+02    1.3553031109E+02    1.3284633846E+02    1.3011775519E+02    1.2734909478E+02    1.2454490587E+02    1.2170974074E+02    1.1884814397E+02    1.1596464121E+02    1.1306372819E+02    1.1014985990E+02    1.0722744002E+02    1.043008 [...]
+    1.5237788959E+02    1.5070661328E+02    1.4894600963E+02    1.4709928048E+02    1.4516977094E+02    1.4316096021E+02    1.4107645209E+02    1.3891996518E+02    1.3669532287E+02    1.3440644296E+02    1.3205732729E+02    1.2965205099E+02    1.2719475183E+02    1.2468961925E+02    1.2214088353E+02    1.1955280487E+02    1.1692966244E+02    1.1427574357E+02    1.1159533300E+02    1.0889270221E+02    1.0617209900E+02    1.0343773718E+02    1.0069378650E+02    9.7944362898E+01    9.519351 [...]
+    1.4087918171E+02    1.3925448310E+02    1.3754789749E+02    1.3576252086E+02    1.3390157860E+02    1.3196841677E+02    1.2996649293E+02    1.2789936678E+02    1.2577069062E+02    1.2358419946E+02    1.2134370115E+02    1.1905306624E+02    1.1671621780E+02    1.1433712120E+02    1.1191977381E+02    1.0946819471E+02    1.0698641452E+02    1.0447846516E+02    1.0194836988E+02    9.9400133257E+01    9.6837731515E+01    9.4265102931E+01    9.1686138523E+01    8.9104672984E+01    8.652447 [...]
+    1.2992539985E+02    1.2834592132E+02    1.2669176373E+02    1.2496591984E+02    1.2317149836E+02    1.2131171552E+02    1.1938988630E+02    1.1740941552E+02    1.1537378865E+02    1.1328656252E+02    1.1115135587E+02    1.0897183977E+02    1.0675172807E+02    1.0449476766E+02    1.0220472888E+02    9.9885395836E+01    9.7540556852E+01    9.5173994966E+01    9.2789478562E+01    9.0390752147E+01    8.7981527308E+01    8.5565473868E+01    8.3146211280E+01    8.0727300275E+01    7.831223 [...]
+    1.1953396479E+02    1.1799839160E+02    1.1639509617E+02    1.1472697069E+02    1.1299701023E+02    1.1120830463E+02    1.0936403009E+02    1.0746744069E+02    1.0552185958E+02    1.0353067023E+02    1.0149730742E+02    9.9425248240E+01    9.7318003024E+01    9.5179106263E+01    9.3012107553E+01    9.0820562572E+01    8.8608024143E+01    8.6378033399E+01    8.4134111074E+01    8.1879748964E+01    7.9618401565E+01    7.7353477927E+01    7.5088333743E+01    7.2826263697E+01    7.057049 [...]
+    1.0971669417E+02    1.0822376704E+02    1.0666980701E+02    1.0505760839E+02    1.0339005566E+02    1.0167011575E+02    9.9900829970E+01    9.8085305902E+01    9.6226709081E+01    9.4328254614E+01    9.2393198722E+01    9.0424830222E+01    8.8426462002E+01    8.6401422507E+01    8.4353047255E+01    8.2284670428E+01    8.0199616551E+01    7.8101192287E+01    7.5992678387E+01    7.3877321801E+01    7.1758327986E+01    6.9638853435E+01    6.7521998442E+01    6.5410800131E+01    6.330822 [...]
+    1.0048002582E+02    9.9028551150E+01    9.7522451631E+01    9.5964426228E+01    9.4357251922E+01    9.2703776208E+01    9.1006909448E+01    8.9269617096E+01    8.7494911819E+01    8.5685845557E+01    8.3845501526E+01    8.1976986206E+01    8.0083421336E+01    7.8167935943E+01    7.6233658427E+01    7.4283708734E+01    7.2321190637E+01    7.0349184148E+01    6.8370738093E+01    6.6388862865E+01    6.4406523377E+01    6.2426632243E+01    6.0452043199E+01    5.8485544791E+01    5.652985 [...]
+    9.1825292832E+01    9.0414150786E+01    8.8954499167E+01    8.7448944148E+01    8.5900158193E+01    8.4310872863E+01    8.2683871511E+01    8.1021981873E+01    7.9328068599E+01    7.7605025736E+01    7.5855769190E+01    7.4083229198E+01    7.2290342830E+01    7.0480046540E+01    6.8655268805E+01    6.6818922858E+01    6.4973899555E+01    6.3123060381E+01    6.1269230630E+01    5.9415192777E+01    5.7563680056E+01    5.5717370269E+01    5.3878879845E+01    5.2050758155E+01    5.023548 [...]
+    8.3749044231E+01    8.2377194534E+01    8.0962648748E+01    7.9507922688E+01    7.8015587241E+01    7.6488261481E+01    7.4928605683E+01    7.3339314286E+01    7.1723108805E+01    7.0082730733E+01    6.8420934450E+01    6.6740480156E+01    6.5044126863E+01    6.3334625458E+01    6.1614711870E+01    5.9887100348E+01    5.8154476890E+01    5.6419492822E+01    5.4684758565E+01    5.2952837600E+01    5.1226240648E+01    4.9507420086E+01    4.7798764612E+01    4.6102594178E+01    4.442115 [...]
+    7.6243404555E+01    7.4909890199E+01    7.3539184773E+01    7.2133716057E+01    7.0695956223E+01    6.9228415234E+01    6.7733634185E+01    6.6214178608E+01    6.4672631774E+01    6.3111587988E+01    6.1533645925E+01    5.9941402022E+01    5.8337443934E+01    5.6724344094E+01    5.5104653385E+01    5.3480894948E+01    5.1855558147E+01    5.0231092703E+01    4.8609903023E+01    4.6994342734E+01    4.5386709446E+01    4.3789239742E+01    4.2204104437E+01    4.0633404087E+01    3.907916 [...]
+    6.9296465452E+01    6.8000414370E+01    6.6672364386E+01    6.5314657455E+01    6.3929669786E+01    6.2519805526E+01    6.1087490418E+01    5.9635165440E+01    5.8165280471E+01    5.6680287980E+01    5.5182636776E+01    5.3674765824E+01    5.2159098168E+01    5.0638034957E+01    4.9113949610E+01    4.7589182127E+01    4.6066033572E+01    4.4546760740E+01    4.3033571022E+01    4.1528617489E+01    4.0033994204E+01    3.8551731776E+01    3.7083793169E+01    3.5632069778E+01    3.419837 [...]
+    6.2892702217E+01    6.1633327065E+01    6.0346830147E+01    5.9035469668E+01    5.7701528515E+01    5.6347308216E+01    5.4975122900E+01    5.3587293268E+01    5.2186140610E+01    5.0773980867E+01    4.9353118782E+01    4.7925842137E+01    4.6494416107E+01    4.5061077745E+01    4.3628030612E+01    4.2197439579E+01    4.0771425802E+01    3.9352061896E+01    3.7941367318E+01    3.6541303973E+01    3.5153772052E+01    3.3780606118E+01    3.2423571452E+01    3.1084360656E+01    2.976459 [...]
+    5.7013408156E+01    5.5790004352E+01    5.4544040801E+01    5.3277693898E+01    5.1993155723E+01    5.0692628266E+01    4.9378317679E+01    4.8052428571E+01    4.6717158358E+01    4.5374691694E+01    4.4027195002E+01    4.2676811114E+01    4.1325654042E+01    3.9975803902E+01    3.8629301996E+01    3.7288146070E+01    3.5954285769E+01    3.4629618294E+01    3.3315984276E+01    3.2015163877E+01    3.0728873139E+01    2.9458760569E+01    2.8206403990E+01    2.6973307652E+01    2.576089 [...]
+    5.1637139733E+01    5.0449081929E+01    4.9242713168E+01    4.8020129844E+01    4.6783435610E+01    4.5534735875E+01    4.4276132336E+01    4.3009717581E+01    4.1737569766E+01    4.0461747404E+01    3.9184284254E+01    3.7907184351E+01    3.6632417183E+01    3.5361913026E+01    3.4097558459E+01    3.2841192063E+01    3.1594600331E+01    3.0359513781E+01    2.9137603301E+01    2.7930476726E+01    2.6739675656E+01    2.5566672526E+01    2.4412867936E+01    2.3279588240E+01    2.216808 [...]
+    4.6740165667E+01    4.5586902829E+01    4.4419268338E+01    4.3239280248E+01    4.2048956040E+01    4.0850307364E+01    3.9645334853E+01    3.8436023022E+01    3.7224335265E+01    3.6012208978E+01    3.4801550802E+01    3.3594232025E+01    3.2392084143E+01    3.1196894592E+01    3.0010402673E+01    2.8834295677E+01    2.7670205219E+01    2.6519703792E+01    2.5384301553E+01    2.4265443354E+01    2.3164506003E+01    2.2082795795E+01    2.1021546288E+01    1.9981916345E+01    1.896498 [...]
+    4.2296913424E+01    4.1177962727E+01    4.0048275634E+01    3.8909793396E+01    3.7764449430E+01    3.6614164319E+01    3.5460840885E+01    3.4306359387E+01    3.3152572815E+01    3.2001302341E+01    3.0854332903E+01    2.9713408960E+01    2.8580230418E+01    2.7456448746E+01    2.6343663293E+01    2.5243417806E+01    2.4157197178E+01    2.3086424416E+01    2.2032457848E+01    2.0996588571E+01    1.9980038146E+01    1.8983956550E+01    1.8009420378E+01    1.7057431313E+01    1.612891 [...]
+    3.8280406946E+01    3.7195346681E+01    3.6102888227E+01    3.5004897433E+01    3.3903225637E+01    3.2799704901E+01    3.1696143359E+01    3.0594320677E+01    2.9495983661E+01    2.8402842005E+01    2.7316564206E+01    2.6238773662E+01    2.5171044940E+01    2.4114900265E+01    2.3071806197E+01    2.2043170538E+01    2.1030339462E+01    2.0034594874E+01    1.9057152016E+01    1.8099157313E+01    1.7161686467E+01    1.6245742810E+01    1.5352255905E+01    1.4482080410E+01    1.363599 [...]
+    3.4662689934E+01    3.3611151633E+01    3.2555264690E+01    3.1496820836E+01    3.0437591179E+01    2.9379321679E+01    2.8323728754E+01    2.7272495003E+01    2.6227265107E+01    2.5189641871E+01    2.4161182454E+01    2.3143394787E+01    2.2137734186E+01    2.1145600171E+01    2.0168333505E+01    1.9207213459E+01    1.8263455305E+01    1.7338208047E+01    1.6432552396E+01    1.5547498995E+01    1.4683986885E+01    1.3842882233E+01    1.3024977307E+01    1.2230989707E+01    1.146156 [...]
+    3.1415229539E+01    3.0396889523E+01    2.9376971383E+01    2.8357193894E+01    2.7339249666E+01    2.6324800845E+01    2.5315474961E+01    2.4312860927E+01    2.3318505196E+01    2.2333908110E+01    2.1360520417E+01    2.0399740001E+01    1.9452908817E+01    1.8521310034E+01    1.7606165407E+01    1.6708632887E+01    1.5829804449E+01    1.4970704181E+01    1.4132286603E+01    1.3315435238E+01    1.2520961441E+01    1.1749603465E+01    1.1002025788E+01    1.0278818683E+01    9.580498 [...]
+    2.8509295928E+01    2.7523866489E+01    2.6539361104E+01    2.5557426664E+01    2.4579678896E+01    2.3607698290E+01    2.2643026187E+01    2.1687161034E+01    2.0741554807E+01    1.9807609632E+01    1.8886674594E+01    1.7980042760E+01    1.7088948416E+01    1.6214564521E+01    1.5358000399E+01    1.4520299661E+01    1.3702438365E+01    1.2905323425E+01    1.2129791259E+01    1.1376606694E+01    1.0646462109E+01    9.9399768334E+00    9.2576967936E+00    8.6000943992E+00    7.967568 [...]
+    2.5916313833E+01    2.4963534231E+01    2.4013924122E+01    2.3069059496E+01    2.2130480709E+01    2.1199688635E+01    2.0278140993E+01    1.9367248842E+01    1.8468373266E+01    1.7582822255E+01    1.6711847792E+01    1.5856643158E+01    1.5018340454E+01    1.4198008354E+01    1.3396650091E+01    1.2615201681E+01    1.1854530388E+01    1.1115433439E+01    1.0398636976E+01    9.7047952666E+00    9.0344901473E+00    8.3882307266E+00    7.7664533219E+00    7.1695216408E+00    6.597727 [...]
+    2.3608182883E+01    2.2687810346E+01    2.1772608351E+01    2.0864082888E+01    1.9963700363E+01    1.9072883970E+01    1.8193010245E+01    1.7325405797E+01    1.6471344243E+01    1.5632043347E+01    1.4808662367E+01    1.4002299624E+01    1.3213990307E+01    1.2444704497E+01    1.1695345437E+01    1.0966748038E+01    1.0259677633E+01    9.5748289684E+00    8.9128254514E+00    8.2742186314E+00    7.6594879337E+00    7.0690406315E+00    6.5032120579E+00    5.9622660527E+00    5.446395 [...]
+    2.1557564190E+01    2.0669365104E+01    1.9788106140E+01    1.8915224137E+01    1.8052112893E+01    1.7200119757E+01    1.6360542404E+01    1.5534625797E+01    1.4723559366E+01    1.3928474383E+01    1.3150441569E+01    1.2390468917E+01    1.1649499751E+01    1.0928411021E+01    1.0228011832E+01    9.5490422199E+00    8.8921721682E+00    8.2580008685E+00    7.6470562264E+00    7.0597946093E+00    6.4966008348E+00    5.9577883975E+00    5.4435999284E+00    4.9542078844E+00    4.489715 [...]
+    1.9738131414E+01    1.8881872835E+01    1.8034105851E+01    1.7196198944E+01    1.6369474584E+01    1.5555206023E+01    1.4754614292E+01    1.3968865389E+01    1.3199067682E+01    1.2446269528E+01    1.1711457115E+01    1.0995552533E+01    1.0299412076E+01    9.6238247847E+00    8.9695112290E+00    8.3371225279E+00    7.7272396171E+00    7.1403727557E+00    6.5769612759E+00    6.0373735711E+00    5.5219073214E+00    5.0307899509E+00    4.5641793134E+00    4.1221646011E+00    3.704767 [...]
+    1.8124785163E+01    1.7300226816E+01    1.6485507062E+01    1.5681926800E+01    1.4890738392E+01    1.4113142672E+01    1.3350286146E+01    1.2603258407E+01    1.1873089756E+01    1.1160749049E+01    1.0467141769E+01    9.7931083280E+00    9.1394226059E+00    8.5067907239E+00    7.8958500610E+00    7.3071685090E+00    6.7412439695E+00    6.1985040894E+00    5.6793062354E+00    5.1839377032E+00    4.7126161587E+00    4.2654903055E+00    3.8426407751E+00    3.4440812320E+00    3.069759 [...]
+    1.6693830309E+01    1.5900717181E+01    1.5118598949E+01    1.4348709681E+01    1.3592232821E+01    1.2850298395E+01    1.2123980425E+01    1.1414294551E+01    1.0722195871E+01    1.0048577004E+01    9.3942663825E+00    8.7600267768E+00    8.1465540514E+00    7.5544761630E+00    6.9843523943E+00    6.4366728270E+00    5.9118580527E+00    5.4102591202E+00    4.9321577164E+00    4.4777665775E+00    4.0472301259E+00    3.6406253291E+00    3.2579627716E+00    2.8991879372E+00    2.564182 [...]
+    1.5423116425E+01    1.4661172063E+01    1.3911201989E+01    1.3174374197E+01    1.2451804373E+01    1.1744553302E+01    1.1053624486E+01    1.0379961972E+01    9.7244483975E+00    9.0879032679E+00    8.4710814555E+00    7.8746719346E+00    7.2992967489E+00    6.7455102157E+00    6.2137983657E+00    5.7045786183E+00    5.2181996917E+00    4.7549417443E+00    4.3150167452E+00    3.8985690688E+00    3.5056763105E+00    3.1363503144E+00    2.7905384109E+00    2.4681248524E+00    2.168932 [...]
+    1.4292142128E+01    1.3561062724E+01    1.2842773765E+01    1.2138377937E+01    1.1448924320E+01    1.0775405990E+01    1.0118757832E+01    9.4798545722E+00    8.8595090271E+00    8.2584705762E+00    7.6774238661E+00    7.1169877445E+00    6.5777144256E+00    6.0600888898E+00    5.5645285158E+00    5.0913829443E+00    4.6409341714E+00    4.2133968692E+00    3.8089189291E+00    3.4275822230E+00    3.0694035784E+00    2.7343359594E+00    2.4222698482E+00    2.1330348175E+00    1.866401 [...]
+    1.3282124706E+01    1.2581574033E+01    1.1894480177E+01    1.1221881311E+01    1.0564761061E+01    9.9240462998E+00    9.3006051546E+00    8.6952452325E+00    8.1087120641E+00    7.5416877719E+00    6.9947899648E+00    6.4685708629E+00    5.9635166499E+00    5.4800470564E+00    5.0185151716E+00    4.5792074821E+00    4.1623441346E+00    3.7680794201E+00    3.3965024745E+00    3.0476381904E+00    2.7214483346E+00    2.4178328646E+00    2.1366314365E+00    1.8776250965E+00    1.640538 [...]
+    1.2376036847E+01    1.1705642094E+01    1.1049233869E+01    1.0407786669E+01    9.7822198330E+00    9.1733955260E+00    8.5821169374E+00    8.0091266941E+00    7.4551054928E+00    6.9206709541E+00    6.4063767021E+00    5.9127116676E+00    5.4400996194E+00    4.9888989188E+00    4.5594024992E+00    4.1518380669E+00    3.7663685199E+00    3.4030925814E+00    3.0620456425E+00    2.7432008096E+00    2.4464701482E+00    2.1717061184E+00    1.9187031928E+00    1.6871996491E+00    1.476879 [...]
+    1.1558612752E+01    1.0917961275E+01    1.0291702093E+01    9.6807469115E+00    9.0859519756E+00    8.5081162383E+00    7.9479797454E+00    7.4062222321E+00    6.8834619362E+00    6.3802546322E+00    5.8970928851E+00    5.4344055265E+00    4.9925573516E+00    4.5718490360E+00    4.1725172717E+00    3.7947351168E+00    3.4386125585E+00    3.1041972816E+00    2.7914756404E+00    2.5003738255E+00    2.2307592205E+00    1.9824419400E+00    1.7551765424E+00    1.5486639067E+00    1.362553 [...]
+    1.0816326255E+01    1.0204963261E+01    9.6082866086E+00    9.0271461615E+00    8.4623362970E+00    7.9145942629E+00    7.3845987410E+00    6.8729686224E+00    6.3802619962E+00    5.9069753554E+00    5.4535430180E+00    5.0203367662E+00    4.6076657002E+00    4.2157763077E+00    3.8448527437E+00    3.4950173197E+00    3.1663311964E+00    2.8587952768E+00    2.5723512919E+00    2.3068830750E+00    2.0622180160E+00    1.8381286880E+00    1.6343346399E+00    1.4505043430E+00    1.286257 [...]
+    1.0137343858E+01    9.5547709991E+00    8.9870784861E+00    8.4350553525E+00    7.8994353817E+00    7.3808956417E+00    6.8800552245E+00    6.3974741945E+00    5.9336527470E+00    5.4890305781E+00    5.0639864664E+00    4.6588380660E+00    4.2738419092E+00    3.9091936173E+00    3.5650283154E+00    3.2414212486E+00    2.9383885949E+00    2.6558884684E+00    2.3938221088E+00    2.1520352487E+00    1.9303196526E+00    1.7284148191E+00    1.5460098387E+00    1.3827453972E+00    1.238215 [...]
+    9.5114558031E+00    8.9571306695E+00    8.4177909080E+00    7.8941658144E+00    7.3869299027E+00    6.8967016140E+00    6.4240422281E+00    5.9694549789E+00    5.5333843766E+00    5.1162157355E+00    4.7182749078E+00    4.3398282236E+00    3.9810826323E+00    3.6421860465E+00    3.3232278813E+00    3.0242397879E+00    2.7451965743E+00    2.4860173092E+00    2.2465666021E+00    2.0266560520E+00    1.8260458593E+00    1.6444465902E+00    1.4815210875E+00    1.3368865169E+00    1.210116 [...]
+    8.9299884570E+00    8.4033249115E+00    7.8916732064E+00    7.3957040738E+00    6.9160341411E+00    6.4532248104E+00    6.0077813371E+00    5.5801521079E+00    5.1707281196E+00    4.7798426586E+00    4.4077711802E+00    4.0547313859E+00    3.7208834976E+00    3.4063307234E+00    3.1111199135E+00    2.8352424004E+00    2.5786350181E+00    2.3411812950E+00    2.1227128140E+00    1.9230107322E+00    1.7418074526E+00    1.5787884404E+00    1.4335941740E+00    1.3058222227E+00    1.195029 [...]
+    8.3857013313E+00    7.8860706404E+00    7.4014094422E+00    6.9323311655E+00    6.4793959966E+00    6.0431099268E+00    5.6239239922E+00    5.2222337091E+00    4.8383787037E+00    4.4726425363E+00    4.1252527190E+00    3.7963809236E+00    3.4861433787E+00    3.1946014506E+00    2.9217624061E+00    2.6675803499E+00    2.4319573324E+00    2.2147446225E+00    2.0157441367E+00    1.8347100189E+00    1.6713503625E+00    1.5253290661E+00    1.3962678151E+00    1.2837481793E+00    1.187313 [...]
+    7.8726720816E+00    7.3994047751E+00    6.9410048428E+00    6.4980297575E+00    6.0709847775E+00    5.6603221553E+00    5.2664405353E+00    4.8896845404E+00    4.5303445463E+00    4.1886566448E+00    3.8648027920E+00    3.5589111398E+00    3.2710565483E+00    3.0012612734E+00    2.7494958276E+00    2.5156800061E+00    2.2996840747E+00    2.1013301115E+00    1.9203934966E+00    1.7566045424E+00    1.6096502547E+00    1.4791762198E+00    1.3647886050E+00    1.2660562660E+00    1.182512 [...]
+    7.3861727604E+00    6.9385611468E+00    6.5056633544E+00    6.0879823378E+00    5.6859700076E+00    5.3000265978E+00    4.9305002146E+00    4.5776865690E+00    4.2418288905E+00    3.9231180219E+00    3.6216926916E+00    3.3376399618E+00    3.0709958481E+00    2.8217461063E+00    2.5898271830E+00    2.3751273219E+00    2.1774878226E+00    1.9967044436E+00    1.8325289431E+00    1.6846707493E+00    1.5527987542E+00    1.4365432198E+00    1.3354977902E+00    1.2492215993E+00    1.177241 [...]
+    6.9225404812E+00    6.4998417362E+00    6.0916594536E+00    5.6984435956E+00    5.3205943755E+00    4.9584617774E+00    4.6123452517E+00    4.2824935880E+00    3.9691049617E+00    3.6723271544E+00    3.3922579433E+00    3.1289456588E+00    2.8823899043E+00    2.6525424348E+00    2.4393081886E+00    2.2425464667E+00    2.0620722544E+00    1.8976576763E+00    1.7490335805E+00    1.6158912413E+00    1.4978841751E+00    1.3946300592E+00    1.3057127458E+00    1.2306843623E+00    1.169067 [...]
+    6.4790454793E+00    6.0804852219E+00    5.6962071902E+00    5.3266099671E+00    4.9720437864E+00    4.6328102002E+00    4.3091619160E+00    4.0013028038E+00    3.7093880692E+00    3.4335245930E+00    3.1737714317E+00    2.9301404768E+00    2.7025972682E+00    2.4910619564E+00    2.2954104093E+00    2.1154754561E+00    1.9510482636E+00    1.8018798368E+00    1.6676826371E+00    1.5481323106E+00    1.4428695179E+00    1.3515018578E+00    1.2736058757E+00    1.2087291480E+00    1.156392 [...]
+    6.0537593392E+00    5.6785356061E+00    5.3173292274E+00    4.9704891021E+00    4.6383172687E+00    4.3210687139E+00    4.0189513456E+00    3.7321261283E+00    3.4607073769E+00    3.2047632088E+00    2.9643161487E+00    2.7393438834E+00    2.5297801611E+00    2.3355158309E+00    2.1564000167E+00    1.9922414189E+00    1.8428097383E+00    1.7078372141E+00    1.5870202699E+00    1.4800212594E+00    1.3864703035E+00    1.3059672116E+00    1.2380834768E+00    1.1823643387E+00    1.138330 [...]
+    5.6454259027E+00    5.2927134312E+00    4.9537283871E+00    4.6287717609E+00    4.3180992418E+00    4.0219211638E+00    3.7404026084E+00    3.4736636617E+00    3.2217798232E+00    2.9847825637E+00    2.7626600281E+00    2.5553578784E+00    2.3627802729E+00    2.1847909759E+00    2.0212145915E+00    1.8718379164E+00    1.7364114043E+00    1.6146507349E+00    1.5062384805E+00    1.4108258624E+00    1.3280345888E+00    1.2574587666E+00    1.1986668784E+00    1.1512038163E+00    1.114592 [...]
+    5.2533370908E+00    4.9222918193E+00    4.6046639368E+00    4.3007083728E+00    4.0106363720E+00    3.7346155715E+00    3.4727702268E+00    3.2251815852E+00    2.9918884027E+00    2.7728876018E+00    2.5681350651E+00    2.3775465605E+00    2.2009987934E+00    2.0383305797E+00    1.8893441336E+00    1.7538064640E+00    1.6314508738E+00    1.5219785523E+00    1.4250602572E+00    1.3403380746E+00    1.2674272518E+00    1.2059180945E+00    1.1553779185E+00    1.1153530500E+00    1.085370 [...]
+    4.8772155634E+00    4.5669792625E+00    4.2698345419E+00    3.9859921839E+00    3.7156209461E+00    3.4588477629E+00    3.2157580893E+00    2.9863963837E+00    2.7707667272E+00    2.5688335738E+00    2.3805226294E+00    2.2057218522E+00    2.0442825716E+00    1.8960207176E+00    1.7607181565E+00    1.6381241249E+00    1.5279567568E+00    1.4299046947E+00    1.3436287792E+00    1.2687638085E+00    1.2049203599E+00    1.1516866667E+00    1.1086305400E+00    1.0753013302E+00    1.051231 [...]
+    4.5171058208E+00    4.2268107714E+00    3.9492694980E+00    3.6846506082E+00    3.4330823761E+00    3.1946530611E+00    2.9694113639E+00    2.7573670122E+00    2.5584914750E+00    2.3727188003E+00    2.1999465719E+00    2.0400369789E+00    1.8928179946E+00    1.7580846569E+00    1.6356004447E+00    1.5250987443E+00    1.4262843976E+00    1.3388353267E+00    1.2624042256E+00    1.1966203132E+00    1.1410911395E+00    1.0954044359E+00    1.0591300041E+00    1.0318216334E+00    1.013019 [...]
+    4.1732750251E+00    3.9020486648E+00    3.6432295280E+00    3.3969460712E+00    3.1632881270E+00    2.9423073358E+00    2.7340177060E+00    2.5383962971E+00    2.3553840221E+00    2.1848865664E+00    2.0267754153E+00    1.8808889873E+00    1.7470338662E+00    1.6249861262E+00    1.5144927436E+00    1.4152730888E+00    1.3270204914E+00    1.2494038713E+00    1.1820694285E+00    1.1246423847E+00    1.0767287680E+00    1.0379172346E+00    1.0077809186E+00    9.8587930229E-01    9.717601 [...]
+    3.8461244929E+00    3.5930939566E+00    3.3521181067E+00    3.1232873125E+00    2.9066550389E+00    2.7022383840E+00    2.5100187372E+00    2.3299425520E+00    2.1619222319E+00    2.0058371218E+00    1.8615346018E+00    1.7288312766E+00    1.6075142554E+00    1.4973425154E+00    1.3980483430E+00    1.3093388466E+00    1.2308975318E+00    1.1623859353E+00    1.1034453070E+00    1.0536983358E+00    1.0127509095E+00    9.8019390222E-01    9.5560498288E-01    9.3855043511E-01    9.285869 [...]
+    3.5361124890E+00    3.3004089810E+00    3.0764039584E+00    2.8641517994E+00    2.6636716982E+00    2.4749483013E+00    2.2979324565E+00    2.1325420703E+00    1.9786630683E+00    1.8361504550E+00    1.7048294657E+00    1.5844968071E+00    1.4749219781E+00    1.3758486664E+00    1.2869962139E+00    1.2080611433E+00    1.1387187406E+00    1.0786246850E+00    1.0274167204E+00    9.8471635982E-01    9.5013061707E-01    9.2325375711E-01    9.0366905873E-01    8.9095058192E-01    8.846649 [...]
+    3.2436886515E+00    3.0244515886E+00    2.8165550691E+00    2.6200195986E+00    2.4348322118E+00    2.2609472005E+00    2.0982869476E+00    1.9467428606E+00    1.8061764021E+00    1.6764202096E+00    1.5572793007E+00    1.4485323574E+00    1.3499330833E+00    1.2612116267E+00    1.1820760643E+00    1.1122139382E+00    1.0512938391E+00    9.9896702867E-01    9.5486909531E-01    9.1862163437E-01    8.8983394725E-01    8.6810475162E-01    8.5302389592E-01    8.4417407131E-01    8.411325 [...]
+    2.9692400863E+00    2.7656209647E+00    2.5729842717E+00    2.3913187711E+00    2.2205814549E+00    2.0606983563E+00    1.9115654608E+00    1.7730497106E+00    1.6449900970E+00    1.5271988350E+00    1.4194626150E+00    1.3215439252E+00    1.2331824384E+00    1.1540964570E+00    1.0839844099E+00    1.0225263941E+00    9.6938575432E-01    9.2421069385E-01    8.8663591014E-01    8.5628424741E-01    8.3276836003E-01    8.1569237956E-01    8.0465357881E-01    7.9924402618E-01    7.990522 [...]
+    2.7130489129E+00    2.5242148567E+00    2.3460061980E+00    2.1783820923E+00    2.0212716025E+00    1.8745745894E+00    1.7381626939E+00    1.6118804049E+00    1.4955462072E+00    1.3889538047E+00    1.2918734120E+00    1.2040531093E+00    1.1252202530E+00    1.0550829377E+00    9.9333150010E-01    9.3964006136E-01    8.9366809838E-01    8.5506203913E-01    8.2345687432E-01    7.9847777904E-01    7.7974173753E-01    7.6685916449E-01    7.5943551654E-01    7.5707288729E-01    7.593715 [...]
+    2.4752608064E+00    2.3003977667E+00    2.1358051634E+00    1.9814146703E+00    1.8371295220E+00    1.7028254762E+00    1.5783518596E+00    1.4635326925E+00    1.3581678857E+00    1.2620345061E+00    1.1748881019E+00    1.0964640842E+00    1.0264791564E+00    9.6463278668E-01    9.1060871555E-01    8.6407649313E-01    8.2469303861E-01    7.9210421570E-01    7.6594641730E-01    7.4584815285E-01    7.3143163190E-01    7.2231433749E-01    7.1811058309E-01    7.1843304705E-01    7.228942 [...]
+    2.2558638781E+00    2.0941794592E+00    1.9424133418E+00    1.8004718269E+00    1.6682344015E+00    1.5455547642E+00    1.4322619286E+00    1.3281613971E+00    1.2330364021E+00    1.1466492056E+00    1.0687424537E+00    9.9904057807E-01    9.3725123939E-01    8.8306680496E-01    8.3616585510E-01    7.9621471113E-01    7.6286897877E-01    7.3577510016E-01    7.1457190831E-01    6.9889217728E-01    6.8836416218E-01    6.8261312256E-01    6.8126282334E-01    6.8393700751E-01    6.902608 [...]
+    2.0546770699E+00    1.9054029678E+00    1.7656984210E+00    1.6354464417E+00    1.5145048197E+00    1.4027072058E+00    1.2998642649E+00    1.2057648939E+00    1.1201774982E+00    1.0428513220E+00    9.7351782409E-01    9.1189209516E-01    8.5767430861E-01    8.1055119940E-01    7.7019756407E-01    7.3627777560E-01    7.0844730669E-01    6.8635425504E-01    6.6964086437E-01    6.5794503507E-01    6.5090181823E-01    6.4814488739E-01    6.4930798216E-01    6.5402631827E-01    6.619379 [...]
+    1.8713470978E+00    1.7337411442E+00    1.6053597938E+00    1.4860648181E+00    1.3756943234E+00    1.2740638833E+00    1.1809677360E+00    1.0961800385E+00    1.0194561743E+00    9.5053410549E-01    8.8913576661E-01    8.3496849059E-01    7.8772646292E-01    7.4709219642E-01    7.1273802063E-01    6.8432757946E-01    6.6151733072E-01    6.4395804140E-01    6.3129627255E-01    6.2317584778E-01    6.1923929958E-01    6.1912928779E-01    6.2248998486E-01    6.2896842259E-01    6.382157 [...]
+    1.7053528837E+00    1.5787006969E+00    1.4609322339E+00    1.3518900313E+00    1.2513944796E+00    1.1592449990E+00    1.0752212732E+00    9.9908453465E-01    9.3057889558E-01    8.6943271838E-01    8.1536001953E-01    7.6806190053E-01    7.2722799970E-01    6.9253795849E-01    6.6366289594E-01    6.4026688530E-01    6.2200842634E-01    6.0854190762E-01    5.9951905251E-01    5.9459034348E-01    5.9340641885E-01    5.9561943672E-01    6.0088440097E-01    6.0886044430E-01    6.192120 [...]
+    1.5560163440E+00    1.4396325936E+00    1.3317959425E+00    1.2323316474E+00    1.1410442985E+00    1.0577190319E+00    9.8212279413E-01    9.1400565128E-01    8.5310213806E-01    7.9913263998E-01    7.5180480271E-01    7.1081496230E-01    6.7584959011E-01    6.4658674608E-01    6.2269753434E-01    6.0384755503E-01    5.8969834620E-01    5.7990881012E-01    5.7413661816E-01    5.7203958875E-01    5.7327703300E-01    5.7751106306E-01    5.8440785811E-01    5.9363888349E-01    6.048820 [...]
+    1.4225183715E+00    1.3157476719E+00    1.2171918133E+00    1.1266606693E+00    1.0439448866E+00    9.6881712682E-01    9.0103335539E-01    8.4033416868E-01    7.8644615524E-01    7.3908328413E-01    6.9794831454E-01    6.6273422027E-01    6.3312562321E-01    6.0880022939E-01    5.8943026184E-01    5.7468388412E-01    5.6422660877E-01    5.5772268501E-01    5.5483646016E-01    5.5523370954E-01    5.5858292965E-01    5.6455658982E-01    5.7283233786E-01    5.8309415514E-01    5.950334 [...]
+    1.3039188449E+00    1.2061362963E+00    1.1162407593E+00    1.0340285579E+00    9.5927818650E-01    8.9175157660E-01    8.3119540259E-01    7.7734242158E-01    7.2991284098E-01    6.8861570767E-01    6.5315031272E-01    6.2320760555E-01    5.9847161142E-01    5.7862084632E-01    5.6332972332E-01    5.5226994464E-01    5.4511187367E-01    5.4152588167E-01    5.4118366367E-01    5.4375951864E-01    5.4893158902E-01    5.5638305504E-01    5.6580327949E-01    5.7688889899E-01    5.893448 [...]
+    1.1991795237E+00    1.1097909248E+00    1.0279659716E+00    9.5348920147E-01    8.8612867878E-01    8.2563727820E-01    7.7175400287E-01    7.2420533073E-01    6.8270658309E-01    6.4696330943E-01    6.1667268247E-01    5.9152489735E-01    5.7120456909E-01    5.5539212237E-01    5.4376516799E-01    5.3599986033E-01    5.3177223034E-01    5.3075948892E-01    5.3264129543E-01    5.3710098674E-01    5.4382676202E-01    5.5251281911E-01    5.6286043835E-01    5.7457901015E-01    5.873870 [...]
+    1.1071887399E+00    1.0256304999E+00    9.5131702501E-01    8.8402275553E-01    8.2350697238E-01    7.6951509256E-01    7.2177999334E-01    6.8002335967E-01    6.4395704854E-01    6.1328446459E-01    5.8770194079E-01    5.6690011841E-01    5.5056532041E-01    5.3838091258E-01    5.3002864683E-01    5.2518998117E-01    5.2354737122E-01    5.2478552810E-01    5.2859263800E-01    5.3466153874E-01    5.4269084899E-01    5.5238604628E-01    5.6346048981E-01    5.7563638471E-01    5.886456 [...]
+    1.0267868693E+00    9.5252564957E-01    8.8519482345E-01    8.2456034445E-01    7.7037427888E-01    7.2237610690E-01    6.8029404761E-01    6.4384640220E-01    6.1274290930E-01    5.8668610652E-01    5.6537269248E-01    5.4849488347E-01    5.3574175908E-01    5.2680059125E-01    5.2135815138E-01    5.1910199024E-01    5.1972168559E-01    5.2291005291E-01    5.2836431428E-01    5.3578722152E-01    5.4488812914E-01    5.5538401364E-01    5.6700043537E-01    5.7947244013E-01    5.925453 [...]
+    9.5679165860E-01    8.8932377701E-01    8.2847646148E-01    7.7400870791E-01    7.2566685511E-01    6.8318588627E-01    6.4629074970E-01    6.1469769281E-01    5.8811560362E-01    5.6624735393E-01    5.4879113855E-01    5.3544180480E-01    5.2589216687E-01    5.1983429974E-01    5.1696080718E-01    5.1696605923E-01    5.1954739389E-01    5.2440627883E-01    5.3124942854E-01    5.3978987290E-01    5.4974797343E-01    5.6085238365E-01    5.7284095040E-01    5.8546155321E-01    5.984728 [...]
+    8.9602259067E-01    8.3487322129E-01    7.8003918927E-01    7.3127397790E-01    6.8831960189E-01    6.5090790419E-01    6.1876186737E-01    5.9159693381E-01    5.6912232895E-01    5.5104238194E-01    5.3705783816E-01    5.2686715804E-01    5.2016779697E-01    5.1665746101E-01    5.1603533343E-01    5.1800326735E-01    5.2226693977E-01    5.2853696277E-01    5.3652994766E-01    5.4596951842E-01    5.5658727074E-01    5.6812367355E-01    5.8032891001E-01    5.9296365546E-01    6.057997 [...]
+    8.4332358761E-01    7.8804579031E-01    7.3878278047E-01    6.9528388802E-01    6.5728812165E-01    6.2452545608E-01    5.9671812954E-01    5.7358194570E-01    5.5482757460E-01    5.4016184683E-01    5.2928903581E-01    5.2191212264E-01    5.1773403852E-01    5.1645887968E-01    5.1779309003E-01    5.2144660707E-01    5.2713396655E-01    5.3457536184E-01    5.4349765429E-01    5.5363533076E-01    5.6473140539E-01    5.7653826231E-01    5.8881843691E-01    6.0134533313E-01    6.139038 [...]
+    7.9758347595E-01    7.4775708922E-01    7.0364972715E-01    6.6500783888E-01    6.3156865888E-01    6.0306148016E-01    5.7920893355E-01    5.5972826729E-01    5.4433262169E-01    5.3273229344E-01    5.2463598418E-01    5.1975202846E-01    5.1778959588E-01    5.1845986289E-01    5.2147714948E-01    5.2656001653E-01    5.3343231969E-01    5.4182421591E-01    5.5147311909E-01    5.6212460152E-01    5.7353323809E-01    5.8546339061E-01    5.9768992982E-01    6.0999889311E-01    6.221880 [...]
+    7.5775376598E-01    7.1298419557E-01    6.7364281201E-01    6.3947436924E-01    6.1021547285E-01    5.8559583501E-01    5.6533953147E-01    5.4916625508E-01    5.3679256072E-01    5.2793309628E-01    5.2230181467E-01    5.1961316202E-01    5.1958323722E-01    5.2193091832E-01    5.2637895147E-01    5.3265499817E-01    5.4049263721E-01    5.4963231738E-01    5.5982225795E-01    5.7081929364E-01    5.8238966149E-01    5.9430972711E-01    6.0636664823E-01    6.1835897377E-01    6.300971 [...]
+    7.2286342434E-01    6.8278035859E-01    6.4783973392E-01    6.1778570812E-01    5.9235531712E-01    5.7127970781E-01    5.5428536903E-01    5.4109535559E-01    5.3143050018E-01    5.2501060807E-01    5.2155562983E-01    5.2078680731E-01    5.2242778838E-01    5.2620570611E-01    5.3185221826E-01    5.3910450325E-01    5.4770620903E-01    5.5740835141E-01    5.6797015892E-01    5.7915986127E-01    5.9075541908E-01    6.0254519261E-01    6.1432854770E-01    6.2591639730E-01    6.371316 [...]
+    6.9203044294E-01    6.5628652377E-01    6.2540458623E-01    5.9912920543E-01    5.7719882182E-01    5.5934694822E-01    5.4530337156E-01    5.3479534416E-01    5.2754875972E-01    5.2328930909E-01    5.2174361119E-01    5.2264031471E-01    5.2571116604E-01    5.3069203964E-01    5.3732392674E-01    5.4535387895E-01    5.5453590332E-01    5.6463180575E-01    5.7541198005E-01    5.8665614000E-01    5.9815399232E-01    6.0970584857E-01    6.2112317433E-01    6.3222907451E-01    6.428587 [...]
+    6.6447012447E-01    6.3273960023E-01    6.0559610300E-01    5.8278555468E-01    5.6404869077E-01    5.4912223848E-01    5.3774008605E-01    5.2963443854E-01    5.2453695525E-01    5.2217986417E-01    5.2229704904E-01    5.2462510474E-01    5.2890435692E-01    5.3487984208E-01    5.4230224446E-01    5.5092878640E-01    5.6052406904E-01    5.7086086056E-01    5.8172082938E-01    5.9289522013E-01    6.0418547036E-01    6.1540376632E-01    6.2637353661E-01    6.3692988243E-01    6.469199 [...]
+    6.3950011260E-01    6.1147749659E-01    5.8777269652E-01    5.6813382854E-01    5.5230473219E-01    5.4002611663E-01    5.3103669484E-01    5.2507430141E-01    5.2187698904E-01    5.2118409967E-01    5.2273730574E-01    5.2628161770E-01    5.3156635400E-01    5.3834606975E-01    5.4638144096E-01    5.5544010098E-01    5.6529742660E-01    5.7573727093E-01    5.8655264100E-01    5.9754631798E-01    6.0853141830E-01    6.1933189437E-01    6.2978297362E-01    6.3973153528E-01    6.490364 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_tetrahedron_BA.inp b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_tetrahedron_BA.inp
new file mode 100644
index 0000000..c0f6570
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/FormFactors/isgi_tetrahedron_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_tetrahedron_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+tetrahedron                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/README b/Tests/ReferenceData/IsGISAXS/README
new file mode 100644
index 0000000..0dc0ccc
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/README
@@ -0,0 +1,27 @@
+This folder contains example data from IsGISAXS for comparison with BornAgain
+
+In each subdirectory, one finds:
+- one or multiple .inp files, containing IsGISAXS model description
+- isgi_*.ima files with simulated intensity produced by IsGISAXS
+
+List of examples:
+ex-1   Mixture of cylinders and prisms without interference.
+ex-2   Two gaussian size cylinder distribution.
+ex-3   Cylinder formfactor in BA and DWBA.
+ex-4   1D and 2D paracrystal.
+ex-5   radial paracrystal fit example.
+ex-6   2D lattice with different disorders.
+ex-7   Mixture of different particles defined in morphology file.
+ex-8   2DDL paracrystal 
+ex-9   Rotated pyramids on top of substrate.
+ex-10  Cylinders with interference on top of substrate.
+ex-11  Core shell nano particles.
+ex-12  Constrained fit example: mixture of two cylinder types
+ex-13  Simulated annealing fit example.
+ex-14  Layered spheres on graded interface.
+ex-15  Size spacing correlation approximation
+
+Some notes:
+-Since polarization (x-ray) is not yet included in BornAgain, this feature should be disabled in IsGISAXS by returning 1._wp from function PolFac in Reflectivity_mod.f90
+-IsGISAXS initializes the arrays of outgoing angles such that their sines are evenly spaced. This necessitates a different initialization in BornAgain too: see GISASExperiment::setDetectorParameters function
+
diff --git a/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands-ewald.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands-ewald.ima.gz
new file mode 100644
index 0000000..81dda3b
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands-ewald.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands-ewald.inp b/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands-ewald.inp
new file mode 100644
index 0000000..2639702
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands-ewald.inp
@@ -0,0 +1,82 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_2-types-of-islands-ewald
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         DA               0             25               ss
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0.              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             -1     1       0   2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -2  2      -2   2      0   0         100   100    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+2
+# Particle type,     Probability
+cylinder                  0.5
+prism3                    0.5
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,   dW
+                            0    0     0
+                            0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5         none            0.1       0.1         11       25   2
+                           5         none            0.1       0.1         11       25   2
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2       0
+                           1          none            0.1       0.1         11       25   2       0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,  rho_W
+                            3          none                0.4        1         300       15   2   0
+                            3          none                0.4        1         300       15   2   0 
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Particle distribution  : type
+                         none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1. 
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        90           none          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      T                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.869  0.5   0.05  0.05   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands.inp b/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands.inp
new file mode 100755
index 0000000..d7d41e3
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-1/isgi_2-types-of-islands.inp
@@ -0,0 +1,82 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_2-types-of-particles
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         DA               0             25               ss
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0.              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  F
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             -1.     1       0.  2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -2  2      -2   2      0   0         100   100    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+2
+# Particle type,     Probability
+cylinder                  0.5
+prism3                    0.5
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,   dW
+                            0    0     0
+                            0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5         none            0.1       0.1         11       25   2
+                           5         none            0.1       0.1         11       25   2
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2       0
+                           1          none            0.1       0.1         11       25   2       0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,  rho_W
+                            3          none                0.4        1         300       15   2   0
+                            3          none                0.4        1         300       15   2   0 
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Particle distribution  : type
+                         none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1. 
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        90           none          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      T                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.869  0.5   0.05  0.05   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-10/isgi_para1dcyl.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-10/isgi_para1dcyl.ima.gz
new file mode 100644
index 0000000..c979f35
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-10/isgi_para1dcyl.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-10/isgi_para1dcyl.inp b/Tests/ReferenceData/IsGISAXS/ex-10/isgi_para1dcyl.inp
new file mode 100644
index 0000000..dc35076
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-10/isgi_para1dcyl.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_para1dcyl
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA         0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         5.E-06        2.e-8         0.                6.E-05          2.e-8          0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            5.E-05          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.      2      0    2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm), Rmax(nm), nR, xR
+                          5          none            0.25       0.1        11      150   6
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,  Hmax/R,   nH, xH,   rho_H
+                           1           none            0.1          0.1        11      25   2    0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,    Wmax/R,   nW, xW,   rho_W
+                            2          none              0.4        1         300      15   2     0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          1DDL 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-11/core_shell_qxqy.inp b/Tests/ReferenceData/IsGISAXS/ex-11/core_shell_qxqy.inp
new file mode 100644
index 0000000..def0d47
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-11/core_shell_qxqy.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+core_shell_qxqy
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA              0             100                ss
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-05          2.e-8         0         1e-4          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+ T 
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+parallelepiped                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,   dW
+                           2    1     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           8           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-11/isgi_core_shell_qxqy.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-11/isgi_core_shell_qxqy.ima.gz
new file mode 100644
index 0000000..13e81b5
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-11/isgi_core_shell_qxqy.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.dat b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.dat
new file mode 100644
index 0000000..32a93e1
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.dat
@@ -0,0 +1,819 @@
+################################################################################################     
+# Parallel cut at alphaf=0.2deg
+# fit-example
+# Weight,   Scale factor,   Shift factor
+  1.        1.   F			0.   F	      
+            0  1e5          0   1e5
+             F  F           F  F
+# DeltaOmega(deg), DeltaOmega(deg)
+	 0.                0 
+# Fitted, Sin(2Thetaf), Sin(Alphaf), Intensity, Error bars
+T	8.74674e-05	0.00349065	23199.7
+T	0.000174935	0.00349065	23180.5
+T	0.000262402	0.00349065	23148.7
+T	0.00034987	0.00349065	23104.3
+T	0.000437337	0.00349065	23047.5
+T	0.000524805	0.00349065	22978.6
+T	0.000612272	0.00349065	22897.6
+T	0.000699739	0.00349065	22804.9
+T	0.000787207	0.00349065	22700.9
+T	0.000874674	0.00349065	22586
+T	0.000962142	0.00349065	22460.5
+T	0.00104961	0.00349065	22324.9
+T	0.00113708	0.00349065	22179.7
+T	0.00122454	0.00349065	22025.5
+T	0.00131201	0.00349065	21862.8
+T	0.00139948	0.00349065	21692.3
+T	0.00148695	0.00349065	21514.7
+T	0.00157441	0.00349065	21330.8
+T	0.00166188	0.00349065	21141.2
+T	0.00174935	0.00349065	20946.7
+T	0.00183682	0.00349065	20748.3
+T	0.00192428	0.00349065	20546.9
+T	0.00201175	0.00349065	20343.4
+T	0.00209922	0.00349065	20138.8
+T	0.00218669	0.00349065	19934.2
+T	0.00227415	0.00349065	19730.7
+T	0.00236162	0.00349065	19529.4
+T	0.00244909	0.00349065	19331.6
+T	0.00253656	0.00349065	19138.7
+T	0.00262402	0.00349065	18951.9
+T	0.00271149	0.00349065	18772.8
+T	0.00279896	0.00349065	18602.8
+T	0.00288643	0.00349065	18443.8
+T	0.00297389	0.00349065	18297.3
+T	0.00306136	0.00349065	18165.3
+T	0.00314883	0.00349065	18049.7
+T	0.00323629	0.00349065	17952.9
+T	0.00332376	0.00349065	17877.1
+T	0.00341123	0.00349065	17824.8
+T	0.0034987	0.00349065	17798.9
+T	0.00358616	0.00349065	17802.4
+T	0.00367363	0.00349065	17838.7
+T	0.0037611	0.00349065	17911.6
+T	0.00384857	0.00349065	18025.1
+T	0.00393603	0.00349065	18183.9
+T	0.0040235	0.00349065	18393.3
+T	0.00411097	0.00349065	18659.1
+T	0.00419844	0.00349065	18987.9
+T	0.0042859	0.00349065	19387.4
+T	0.00437337	0.00349065	19866.3
+T	0.00446084	0.00349065	20434.4
+T	0.00454831	0.00349065	21103.3
+T	0.00463577	0.00349065	21886
+T	0.00472324	0.00349065	22798
+T	0.00481071	0.00349065	23856.8
+T	0.00489818	0.00349065	25082.9
+T	0.00498564	0.00349065	26500
+T	0.00507311	0.00349065	28135
+T	0.00516058	0.00349065	30018.9
+T	0.00524805	0.00349065	32186.4
+T	0.00533551	0.00349065	34675.9
+T	0.00542298	0.00349065	37527.9
+T	0.00551045	0.00349065	40783
+T	0.00559792	0.00349065	44477.4
+T	0.00568538	0.00349065	48634.8
+T	0.00577285	0.00349065	53254.5
+T	0.00586032	0.00349065	58293.5
+T	0.00594779	0.00349065	63642.3
+T	0.00603525	0.00349065	69098.1
+T	0.00612272	0.00349065	74343.8
+T	0.00621019	0.00349065	78947.2
+T	0.00629766	0.00349065	82403
+T	0.00638512	0.00349065	84224.9
+T	0.00647259	0.00349065	84075.3
+T	0.00656006	0.00349065	81877.3
+T	0.00664753	0.00349065	77850.5
+T	0.00673499	0.00349065	72445.7
+T	0.00682246	0.00349065	66214.3
+T	0.00690993	0.00349065	59678.8
+T	0.0069974	0.00349065	53250
+T	0.00708486	0.00349065	47201.7
+T	0.00717233	0.00349065	41684.8
+T	0.0072598	0.00349065	36758.1
+T	0.00734727	0.00349065	32419.8
+T	0.00743473	0.00349065	28633.9
+T	0.0075222	0.00349065	25347.5
+T	0.00760967	0.00349065	22502.3
+T	0.00769714	0.00349065	20041.2
+T	0.0077846	0.00349065	17911.4
+T	0.00787207	0.00349065	16066.1
+T	0.00795954	0.00349065	14464.2
+T	0.00804701	0.00349065	13070.7
+T	0.00813447	0.00349065	11855.4
+T	0.00822194	0.00349065	10792.8
+T	0.00830941	0.00349065	9861.35
+T	0.00839687	0.00349065	9042.77
+T	0.00848434	0.00349065	8321.49
+T	0.00857181	0.00349065	7684.34
+T	0.00865927	0.00349065	7120.09
+T	0.00874674	0.00349065	6619.17
+T	0.00883421	0.00349065	6173.37
+T	0.00892168	0.00349065	5775.65
+T	0.00900914	0.00349065	5419.95
+T	0.00909661	0.00349065	5101.03
+T	0.00918408	0.00349065	4814.36
+T	0.00927154	0.00349065	4556
+T	0.00935901	0.00349065	4322.51
+T	0.00944648	0.00349065	4110.92
+T	0.00953394	0.00349065	3918.6
+T	0.00962141	0.00349065	3743.28
+T	0.00970888	0.00349065	3582.94
+T	0.00979635	0.00349065	3435.84
+T	0.00988381	0.00349065	3300.45
+T	0.00997128	0.00349065	3175.43
+T	0.0100587	0.00349065	3059.61
+T	0.0101462	0.00349065	2951.98
+T	0.0102337	0.00349065	2851.67
+T	0.0103211	0.00349065	2757.92
+T	0.0104086	0.00349065	2670.09
+T	0.0104961	0.00349065	2587.64
+T	0.0105835	0.00349065	2510.13
+T	0.010671	0.00349065	2437.2
+T	0.0107585	0.00349065	2368.53
+T	0.0108459	0.00349065	2303.91
+T	0.0109334	0.00349065	2243.17
+T	0.0110209	0.00349065	2186.17
+T	0.0111084	0.00349065	2132.84
+T	0.0111958	0.00349065	2083.11
+T	0.0112833	0.00349065	2036.95
+T	0.0113708	0.00349065	1994.34
+T	0.0114582	0.00349065	1955.26
+T	0.0115457	0.00349065	1919.71
+T	0.0116332	0.00349065	1887.64
+T	0.0117206	0.00349065	1859.02
+T	0.0118081	0.00349065	1833.76
+T	0.0118956	0.00349065	1811.78
+T	0.011983	0.00349065	1792.95
+T	0.0120705	0.00349065	1777.09
+T	0.012158	0.00349065	1764.03
+T	0.0122454	0.00349065	1753.54
+T	0.0123329	0.00349065	1745.36
+T	0.0124204	0.00349065	1739.23
+T	0.0125078	0.00349065	1734.86
+T	0.0125953	0.00349065	1731.95
+T	0.0126828	0.00349065	1730.2
+T	0.0127702	0.00349065	1729.31
+T	0.0128577	0.00349065	1728.99
+T	0.0129452	0.00349065	1728.96
+T	0.0130326	0.00349065	1728.97
+T	0.0131201	0.00349065	1728.79
+T	0.0132076	0.00349065	1728.2
+T	0.013295	0.00349065	1727.02
+T	0.0133825	0.00349065	1725.11
+T	0.01347	0.00349065	1722.34
+T	0.0135574	0.00349065	1718.61
+T	0.0136449	0.00349065	1713.85
+T	0.0137324	0.00349065	1708.01
+T	0.0138198	0.00349065	1701.07
+T	0.0139073	0.00349065	1693.02
+T	0.0139948	0.00349065	1683.86
+T	0.0140822	0.00349065	1673.62
+T	0.0141697	0.00349065	1662.34
+T	0.0142572	0.00349065	1650.06
+T	0.0143446	0.00349065	1636.83
+T	0.0144321	0.00349065	1622.71
+T	0.0145196	0.00349065	1607.77
+T	0.014607	0.00349065	1592.05
+T	0.0146945	0.00349065	1575.64
+T	0.014782	0.00349065	1558.58
+T	0.0148694	0.00349065	1540.95
+T	0.0149569	0.00349065	1522.81
+T	0.0150444	0.00349065	1504.2
+T	0.0151318	0.00349065	1485.2
+T	0.0152193	0.00349065	1465.84
+T	0.0153068	0.00349065	1446.19
+T	0.0153942	0.00349065	1426.27
+T	0.0154817	0.00349065	1406.15
+T	0.0155692	0.00349065	1385.85
+T	0.0156566	0.00349065	1365.41
+T	0.0157441	0.00349065	1344.87
+T	0.0158316	0.00349065	1324.25
+T	0.015919	0.00349065	1303.59
+T	0.0160065	0.00349065	1282.91
+T	0.016094	0.00349065	1262.23
+T	0.0161814	0.00349065	1241.57
+T	0.0162689	0.00349065	1220.97
+T	0.0163564	0.00349065	1200.42
+T	0.0164438	0.00349065	1179.97
+T	0.0165313	0.00349065	1159.61
+T	0.0166188	0.00349065	1139.37
+T	0.0167063	0.00349065	1119.27
+T	0.0167937	0.00349065	1099.32
+T	0.0168812	0.00349065	1079.53
+T	0.0169687	0.00349065	1059.93
+T	0.0170561	0.00349065	1040.52
+T	0.0171436	0.00349065	1021.32
+T	0.0172311	0.00349065	1002.34
+T	0.0173185	0.00349065	983.608
+T	0.017406	0.00349065	965.125
+T	0.0174935	0.00349065	946.907
+T	0.0175809	0.00349065	928.968
+T	0.0176684	0.00349065	911.317
+T	0.0177559	0.00349065	893.97
+T	0.0178433	0.00349065	876.935
+T	0.0179308	0.00349065	860.221
+T	0.0180183	0.00349065	843.839
+T	0.0181057	0.00349065	827.797
+T	0.0181932	0.00349065	812.102
+T	0.0182807	0.00349065	796.76
+T	0.0183681	0.00349065	781.776
+T	0.0184556	0.00349065	767.154
+T	0.0185431	0.00349065	752.898
+T	0.0186305	0.00349065	739.009
+T	0.018718	0.00349065	725.488
+T	0.0188055	0.00349065	712.335
+T	0.018893	0.00349065	699.547
+T	0.0189804	0.00349065	687.124
+T	0.0190679	0.00349065	675.061
+T	0.0191554	0.00349065	663.355
+T	0.0192428	0.00349065	652
+T	0.0193303	0.00349065	640.99
+T	0.0194178	0.00349065	630.32
+T	0.0195052	0.00349065	619.981
+T	0.0195927	0.00349065	609.967
+T	0.0196802	0.00349065	600.268
+T	0.0197676	0.00349065	590.877
+T	0.0198551	0.00349065	581.783
+T	0.0199426	0.00349065	572.979
+T	0.02003	0.00349065	564.453
+T	0.0201175	0.00349065	556.197
+T	0.020205	0.00349065	548.2
+T	0.0202924	0.00349065	540.453
+T	0.0203799	0.00349065	532.945
+T	0.0204674	0.00349065	525.667
+T	0.0205548	0.00349065	518.609
+T	0.0206423	0.00349065	511.761
+T	0.0207298	0.00349065	505.114
+T	0.0208172	0.00349065	498.658
+T	0.0209047	0.00349065	492.384
+T	0.0209922	0.00349065	486.283
+T	0.0210797	0.00349065	480.346
+T	0.0211671	0.00349065	474.566
+T	0.0212546	0.00349065	468.934
+T	0.0213421	0.00349065	463.441
+T	0.0214295	0.00349065	458.082
+T	0.021517	0.00349065	452.848
+T	0.0216045	0.00349065	447.732
+T	0.0216919	0.00349065	442.729
+T	0.0217794	0.00349065	437.831
+T	0.0218669	0.00349065	433.033
+T	0.0219543	0.00349065	428.329
+T	0.0220418	0.00349065	423.714
+T	0.0221293	0.00349065	419.183
+T	0.0222167	0.00349065	414.731
+T	0.0223042	0.00349065	410.354
+T	0.0223917	0.00349065	406.047
+T	0.0224791	0.00349065	401.807
+T	0.0225666	0.00349065	397.631
+T	0.0226541	0.00349065	393.514
+T	0.0227415	0.00349065	389.454
+T	0.022829	0.00349065	385.447
+T	0.0229165	0.00349065	381.492
+T	0.0230039	0.00349065	377.586
+T	0.0230914	0.00349065	373.727
+T	0.0231789	0.00349065	369.912
+T	0.0232663	0.00349065	366.139
+T	0.0233538	0.00349065	362.409
+T	0.0234413	0.00349065	358.717
+T	0.0235288	0.00349065	355.065
+T	0.0236162	0.00349065	351.449
+T	0.0237037	0.00349065	347.87
+T	0.0237912	0.00349065	344.327
+T	0.0238786	0.00349065	340.817
+T	0.0239661	0.00349065	337.342
+T	0.0240536	0.00349065	333.9
+T	0.024141	0.00349065	330.492
+T	0.0242285	0.00349065	327.115
+T	0.024316	0.00349065	323.771
+T	0.0244034	0.00349065	320.459
+T	0.0244909	0.00349065	317.179
+T	0.0245784	0.00349065	313.931
+T	0.0246658	0.00349065	310.714
+T	0.0247533	0.00349065	307.528
+T	0.0248408	0.00349065	304.374
+T	0.0249282	0.00349065	301.251
+T	0.0250157	0.00349065	298.16
+T	0.0251032	0.00349065	295.101
+T	0.0251906	0.00349065	292.073
+T	0.0252781	0.00349065	289.077
+T	0.0253656	0.00349065	286.112
+T	0.025453	0.00349065	283.179
+T	0.0255405	0.00349065	280.278
+T	0.025628	0.00349065	277.409
+T	0.0257155	0.00349065	274.572
+T	0.0258029	0.00349065	271.767
+T	0.0258904	0.00349065	268.994
+T	0.0259779	0.00349065	266.253
+T	0.0260653	0.00349065	263.544
+T	0.0261528	0.00349065	260.866
+T	0.0262403	0.00349065	258.221
+T	0.0263277	0.00349065	255.608
+T	0.0264152	0.00349065	253.026
+T	0.0265027	0.00349065	250.476
+T	0.0265901	0.00349065	247.958
+T	0.0266776	0.00349065	245.471
+T	0.0267651	0.00349065	243.015
+T	0.0268525	0.00349065	240.591
+T	0.02694	0.00349065	238.197
+T	0.0270275	0.00349065	235.834
+T	0.0271149	0.00349065	233.502
+T	0.0272024	0.00349065	231.2
+T	0.0272899	0.00349065	228.927
+T	0.0273773	0.00349065	226.685
+T	0.0274648	0.00349065	224.472
+T	0.0275523	0.00349065	222.288
+T	0.0276397	0.00349065	220.133
+T	0.0277272	0.00349065	218.006
+T	0.0278147	0.00349065	215.907
+T	0.0279022	0.00349065	213.837
+T	0.0279896	0.00349065	211.793
+T	0.0280771	0.00349065	209.777
+T	0.0281646	0.00349065	207.787
+T	0.028252	0.00349065	205.824
+T	0.0283395	0.00349065	203.887
+T	0.028427	0.00349065	201.975
+T	0.0285144	0.00349065	200.089
+T	0.0286019	0.00349065	198.227
+T	0.0286894	0.00349065	196.389
+T	0.0287768	0.00349065	194.576
+T	0.0288643	0.00349065	192.786
+T	0.0289518	0.00349065	191.02
+T	0.0290392	0.00349065	189.276
+T	0.0291267	0.00349065	187.555
+T	0.0292142	0.00349065	185.856
+T	0.0293016	0.00349065	184.179
+T	0.0293891	0.00349065	182.522
+T	0.0294766	0.00349065	180.887
+T	0.029564	0.00349065	179.273
+T	0.0296515	0.00349065	177.678
+T	0.029739	0.00349065	176.104
+T	0.0298264	0.00349065	174.549
+T	0.0299139	0.00349065	173.013
+T	0.0300014	0.00349065	171.496
+T	0.0300888	0.00349065	169.998
+T	0.0301763	0.00349065	168.517
+T	0.0302638	0.00349065	167.055
+T	0.0303513	0.00349065	165.61
+T	0.0304387	0.00349065	164.182
+T	0.0305262	0.00349065	162.771
+T	0.0306137	0.00349065	161.377
+T	0.0307011	0.00349065	159.999
+T	0.0307886	0.00349065	158.637
+T	0.0308761	0.00349065	157.291
+T	0.0309635	0.00349065	155.961
+T	0.031051	0.00349065	154.646
+T	0.0311385	0.00349065	153.345
+T	0.0312259	0.00349065	152.06
+T	0.0313134	0.00349065	150.789
+T	0.0314009	0.00349065	149.532
+T	0.0314883	0.00349065	148.29
+T	0.0315758	0.00349065	147.061
+T	0.0316633	0.00349065	145.846
+T	0.0317507	0.00349065	144.644
+T	0.0318382	0.00349065	143.456
+T	0.0319257	0.00349065	142.28
+T	0.0320131	0.00349065	141.117
+T	0.0321006	0.00349065	139.967
+T	0.0321881	0.00349065	138.83
+T	0.0322755	0.00349065	137.704
+T	0.032363	0.00349065	136.591
+T	0.0324505	0.00349065	135.49
+T	0.0325379	0.00349065	134.4
+T	0.0326254	0.00349065	133.322
+T	0.0327129	0.00349065	132.255
+T	0.0328003	0.00349065	131.2
+T	0.0328878	0.00349065	130.156
+T	0.0329753	0.00349065	129.122
+T	0.0330627	0.00349065	128.1
+T	0.0331502	0.00349065	127.088
+T	0.0332377	0.00349065	126.087
+T	0.0333251	0.00349065	125.096
+T	0.0334126	0.00349065	124.115
+T	0.0335001	0.00349065	123.144
+T	0.0335875	0.00349065	122.184
+T	0.033675	0.00349065	121.233
+T	0.0337625	0.00349065	120.292
+T	0.0338499	0.00349065	119.361
+T	0.0339374	0.00349065	118.439
+T	0.0340248	0.00349065	117.527
+T	0.0341123	0.00349065	116.623
+T	0.0341998	0.00349065	115.729
+T	0.0342872	0.00349065	114.844
+T	0.0343747	0.00349065	113.968
+T	0.0344622	0.00349065	113.101
+T	0.0345496	0.00349065	112.243
+T	0.0346371	0.00349065	111.393
+T	0.0347246	0.00349065	110.551
+T	0.034812	0.00349065	109.718
+T	0.0348995	0.00349065	108.893
+################################################################################################
+# Perpendicular cut at 2thetaf=0.368deg
+# fit-example
+# Weight,   Scale factor,   Shift factor
+  1.        1.   F			0.   F	      
+            0  1e5          0   1e5
+             F  F           F  F
+# DeltaOmega(deg), DeltaOmega(deg)
+	 0.                0 
+# Fitted, Sin(2Thetaf), Sin(Alphaf), Intensity, Error bars
+T	0.00642277	8.74674e-05	201.859
+T	0.00642277	0.000174935	805.406
+T	0.00642277	0.000262402	1810.9
+T	0.00642277	0.00034987	3211.92
+T	0.00642277	0.000437337	4998.82
+T	0.00642277	0.000524805	7158.23
+T	0.00642277	0.000612272	9706.18
+T	0.00642277	0.000699739	12608.5
+T	0.00642277	0.000787207	15844.6
+T	0.00642277	0.000874674	19390.6
+T	0.00642277	0.000962142	23297.4
+T	0.00642277	0.00104961	27483.9
+T	0.00642277	0.00113708	31919.8
+T	0.00642277	0.00122454	36571.8
+T	0.00642277	0.00131201	41539.5
+T	0.00642277	0.00139948	46681.1
+T	0.00642277	0.00148695	51957.6
+T	0.00642277	0.00157441	57328.8
+T	0.00642277	0.00166188	62948
+T	0.00642277	0.00174935	68396.7
+T	0.00642277	0.00183682	74257.3
+T	0.00642277	0.00192428	79856.3
+T	0.00642277	0.00201175	85357.4
+T	0.00642277	0.00209922	90969.8
+T	0.00642277	0.00218669	96409.1
+T	0.00642277	0.00227415	101893
+T	0.00642277	0.00236162	106840
+T	0.00642277	0.00244909	111733
+T	0.00642277	0.00253656	116247
+T	0.00642277	0.00262402	120328
+T	0.00642277	0.00271149	124153
+T	0.00642277	0.00279896	127384
+T	0.00642277	0.00288643	129939
+T	0.00642277	0.00297389	131725
+T	0.00642277	0.00306136	132699
+T	0.00642277	0.00314883	132502
+T	0.00642277	0.00323629	130889
+T	0.00642277	0.00332376	126781
+T	0.00642277	0.00341123	118794
+T	0.00642277	0.0034987	81074.7
+T	0.00642277	0.00358616	64918.4
+T	0.00642277	0.00367363	57378.1
+T	0.00642277	0.0037611	52126.4
+T	0.00642277	0.00384857	48403.2
+T	0.00642277	0.00393603	45566.2
+T	0.00642277	0.0040235	43302.6
+T	0.00642277	0.00411097	41436.3
+T	0.00642277	0.00419844	39748.2
+T	0.00642277	0.0042859	38313.3
+T	0.00642277	0.00437337	37070.6
+T	0.00642277	0.00446084	35912.7
+T	0.00642277	0.00454831	34892.8
+T	0.00642277	0.00463577	33982.6
+T	0.00642277	0.00472324	33161
+T	0.00642277	0.00481071	32411.8
+T	0.00642277	0.00489818	31693.2
+T	0.00642277	0.00498564	31032.8
+T	0.00642277	0.00507311	30420.7
+T	0.00642277	0.00516058	29831.4
+T	0.00642277	0.00524805	29296.7
+T	0.00642277	0.00533551	28778.1
+T	0.00642277	0.00542298	28278.1
+T	0.00642277	0.00551045	27814.3
+T	0.00642277	0.00559792	27364.6
+T	0.00642277	0.00568538	26935.4
+T	0.00642277	0.00577285	26523.7
+T	0.00642277	0.00586032	26126.9
+T	0.00642277	0.00594779	25742
+T	0.00642277	0.00603525	25369.9
+T	0.00642277	0.00612272	25008.8
+T	0.00642277	0.00621019	24658.9
+T	0.00642277	0.00629766	24316
+T	0.00642277	0.00638512	23983
+T	0.00642277	0.00647259	23657
+T	0.00642277	0.00656006	23341.1
+T	0.00642277	0.00664753	23031.2
+T	0.00642277	0.00673499	22721.4
+T	0.00642277	0.00682246	22425.7
+T	0.00642277	0.00690993	22128.8
+T	0.00642277	0.0069974	21840.9
+T	0.00642277	0.00708486	21556
+T	0.00642277	0.00717233	21273.8
+T	0.00642277	0.0072598	20993.7
+T	0.00642277	0.00734727	20722.1
+T	0.00642277	0.00743473	20452.2
+T	0.00642277	0.0075222	20183.8
+T	0.00642277	0.00760967	19916.7
+T	0.00642277	0.00769714	19657.4
+T	0.00642277	0.0077846	19399.1
+T	0.00642277	0.00787207	19141.5
+T	0.00642277	0.00795954	18884.5
+T	0.00642277	0.00804701	18634.9
+T	0.00642277	0.00813447	18385.7
+T	0.00642277	0.00822194	18136.8
+T	0.00642277	0.00830941	17894.9
+T	0.00642277	0.00839687	17646.3
+T	0.00642277	0.00848434	17404.6
+T	0.00642277	0.00857181	17163
+T	0.00642277	0.00865927	16927.9
+T	0.00642277	0.00874674	16686.2
+T	0.00642277	0.00883421	16450.9
+T	0.00642277	0.00892168	16215.5
+T	0.00642277	0.00900914	15980.1
+T	0.00642277	0.00909661	15750.7
+T	0.00642277	0.00918408	15521.1
+T	0.00642277	0.00927154	15291.5
+T	0.00642277	0.00935901	15061.7
+T	0.00642277	0.00944648	14837.7
+T	0.00642277	0.00953394	14613.5
+T	0.00642277	0.00962141	14389.2
+T	0.00642277	0.00970888	14164.9
+T	0.00642277	0.00979635	13945.9
+T	0.00642277	0.00988381	13726.9
+T	0.00642277	0.00997128	13507.9
+T	0.00642277	0.0100587	13289
+T	0.00642277	0.0101462	13075
+T	0.00642277	0.0102337	12856.5
+T	0.00642277	0.0103211	12647.4
+T	0.00642277	0.0104086	12434
+T	0.00642277	0.0104961	12220.9
+T	0.00642277	0.0105835	12012.4
+T	0.00642277	0.010671	11804.2
+T	0.00642277	0.0107585	11600.4
+T	0.00642277	0.0108459	11393.1
+T	0.00642277	0.0109334	11190.1
+T	0.00642277	0.0110209	10987.6
+T	0.00642277	0.0111084	10785.7
+T	0.00642277	0.0111958	10587.9
+T	0.00642277	0.0112833	10390.6
+T	0.00642277	0.0113708	10194.1
+T	0.00642277	0.0114582	9998.35
+T	0.00642277	0.0115457	9806.39
+T	0.00642277	0.0116332	9612.44
+T	0.00642277	0.0117206	9422.27
+T	0.00642277	0.0118081	9235.67
+T	0.00642277	0.0118956	9047.46
+T	0.00642277	0.011983	8862.82
+T	0.00642277	0.0120705	8679.25
+T	0.00642277	0.012158	8496.83
+T	0.00642277	0.0122454	8317.81
+T	0.00642277	0.0123329	8139.95
+T	0.00642277	0.0124204	7963.33
+T	0.00642277	0.0125078	7788.04
+T	0.00642277	0.0125953	7614.16
+T	0.00642277	0.0126828	7443.5
+T	0.00642277	0.0127702	7274.25
+T	0.00642277	0.0128577	7106.47
+T	0.00642277	0.0129452	6941.79
+T	0.00642277	0.0130326	6778.6
+T	0.00642277	0.0131201	6616.96
+T	0.00642277	0.0132076	6456.94
+T	0.00642277	0.013295	6298.62
+T	0.00642277	0.0133825	6143.25
+T	0.00642277	0.01347	5989.58
+T	0.00642277	0.0135574	5837.66
+T	0.00642277	0.0136449	5688.59
+T	0.00642277	0.0137324	5540.27
+T	0.00642277	0.0138198	5394.82
+T	0.00642277	0.0139073	5252.13
+T	0.00642277	0.0139948	5110.4
+T	0.00642277	0.0140822	4971.42
+T	0.00642277	0.0141697	4834.36
+T	0.00642277	0.0142572	4699.25
+T	0.00642277	0.0143446	4566.12
+T	0.00642277	0.0144321	4435.67
+T	0.00642277	0.0145196	4307.22
+T	0.00642277	0.014607	4180.78
+T	0.00642277	0.0146945	4056.96
+T	0.00642277	0.014782	3934.62
+T	0.00642277	0.0148694	3814.9
+T	0.00642277	0.0149569	3697.24
+T	0.00642277	0.0150444	3582.14
+T	0.00642277	0.0151318	3469.1
+T	0.00642277	0.0152193	3357.75
+T	0.00642277	0.0153068	3249.32
+T	0.00642277	0.0153942	3142.61
+T	0.00642277	0.0154817	3038.37
+T	0.00642277	0.0155692	2936.26
+T	0.00642277	0.0156566	2836.26
+T	0.00642277	0.0157441	2738.41
+T	0.00642277	0.0158316	2642.97
+T	0.00642277	0.015919	2549.65
+T	0.00642277	0.0160065	2458.45
+T	0.00642277	0.016094	2369.39
+T	0.00642277	0.0161814	2282.67
+T	0.00642277	0.0162689	2198.06
+T	0.00642277	0.0163564	2115.57
+T	0.00642277	0.0164438	2035.18
+T	0.00642277	0.0165313	1957.07
+T	0.00642277	0.0166188	1881.04
+T	0.00642277	0.0167063	1807.09
+T	0.00642277	0.0167937	1735.35
+T	0.00642277	0.0168812	1665.54
+T	0.00642277	0.0169687	1597.9
+T	0.00642277	0.0170561	1532.3
+T	0.00642277	0.0171436	1468.83
+T	0.00642277	0.0172311	1407.26
+T	0.00642277	0.0173185	1347.78
+T	0.00642277	0.017406	1290.28
+T	0.00642277	0.0174935	1234.75
+T	0.00642277	0.0175809	1181.23
+T	0.00642277	0.0176684	1129.64
+T	0.00642277	0.0177559	1079.95
+T	0.00642277	0.0178433	1032.15
+T	0.00642277	0.0179308	986.284
+T	0.00642277	0.0180183	942.257
+T	0.00642277	0.0181057	900.053
+T	0.00642277	0.0181932	859.65
+T	0.00642277	0.0182807	821.08
+T	0.00642277	0.0183681	784.265
+T	0.00642277	0.0184556	749.178
+T	0.00642277	0.0185431	715.799
+T	0.00642277	0.0186305	684.149
+T	0.00642277	0.018718	654.154
+T	0.00642277	0.0188055	625.789
+T	0.00642277	0.018893	599.029
+T	0.00642277	0.0189804	573.848
+T	0.00642277	0.0190679	550.259
+T	0.00642277	0.0191554	528.193
+T	0.00642277	0.0192428	507.659
+T	0.00642277	0.0193303	488.557
+T	0.00642277	0.0194178	470.931
+T	0.00642277	0.0195052	454.716
+T	0.00642277	0.0195927	439.884
+T	0.00642277	0.0196802	426.438
+T	0.00642277	0.0197676	414.315
+T	0.00642277	0.0198551	403.488
+T	0.00642277	0.0199426	393.926
+T	0.00642277	0.02003	385.629
+T	0.00642277	0.0201175	378.508
+T	0.00642277	0.020205	372.592
+T	0.00642277	0.0202924	367.85
+T	0.00642277	0.0203799	364.194
+T	0.00642277	0.0204674	361.651
+T	0.00642277	0.0205548	360.161
+T	0.00642277	0.0206423	359.696
+T	0.00642277	0.0207298	360.251
+T	0.00642277	0.0208172	361.769
+T	0.00642277	0.0209047	364.219
+T	0.00642277	0.0209922	367.572
+T	0.00642277	0.0210797	371.797
+T	0.00642277	0.0211671	376.888
+T	0.00642277	0.0212546	382.792
+T	0.00642277	0.0213421	389.478
+T	0.00642277	0.0214295	396.938
+T	0.00642277	0.021517	405.121
+T	0.00642277	0.0216045	413.996
+T	0.00642277	0.0216919	423.535
+T	0.00642277	0.0217794	433.709
+T	0.00642277	0.0218669	444.509
+T	0.00642277	0.0219543	455.886
+T	0.00642277	0.0220418	467.81
+T	0.00642277	0.0221293	480.274
+T	0.00642277	0.0222167	493.209
+T	0.00642277	0.0223042	506.628
+T	0.00642277	0.0223917	520.502
+T	0.00642277	0.0224791	534.765
+T	0.00642277	0.0225666	549.429
+T	0.00642277	0.0226541	564.448
+T	0.00642277	0.0227415	579.795
+T	0.00642277	0.022829	595.445
+T	0.00642277	0.0229165	611.391
+T	0.00642277	0.0230039	627.587
+T	0.00642277	0.0230914	644.01
+T	0.00642277	0.0231789	660.653
+T	0.00642277	0.0232663	677.455
+T	0.00642277	0.0233538	694.429
+T	0.00642277	0.0234413	711.551
+T	0.00642277	0.0235288	728.761
+T	0.00642277	0.0236162	746.074
+T	0.00642277	0.0237037	763.449
+T	0.00642277	0.0237912	780.864
+T	0.00642277	0.0238786	798.297
+T	0.00642277	0.0239661	815.746
+T	0.00642277	0.0240536	833.171
+T	0.00642277	0.024141	850.553
+T	0.00642277	0.0242285	867.872
+T	0.00642277	0.024316	885.128
+T	0.00642277	0.0244034	902.282
+T	0.00642277	0.0244909	919.317
+T	0.00642277	0.0245784	936.213
+T	0.00642277	0.0246658	952.975
+T	0.00642277	0.0247533	969.565
+T	0.00642277	0.0248408	985.965
+T	0.00642277	0.0249282	1002.18
+T	0.00642277	0.0250157	1018.16
+T	0.00642277	0.0251032	1033.92
+T	0.00642277	0.0251906	1049.43
+T	0.00642277	0.0252781	1064.7
+T	0.00642277	0.0253656	1079.67
+T	0.00642277	0.025453	1094.37
+T	0.00642277	0.0255405	1108.76
+T	0.00642277	0.025628	1122.87
+T	0.00642277	0.0257155	1136.62
+T	0.00642277	0.0258029	1150.05
+T	0.00642277	0.0258904	1163.14
+T	0.00642277	0.0259779	1175.89
+T	0.00642277	0.0260653	1188.24
+T	0.00642277	0.0261528	1200.24
+T	0.00642277	0.0262403	1211.85
+T	0.00642277	0.0263277	1223.06
+T	0.00642277	0.0264152	1233.89
+T	0.00642277	0.0265027	1244.32
+T	0.00642277	0.0265901	1254.31
+T	0.00642277	0.0266776	1263.88
+T	0.00642277	0.0267651	1273.05
+T	0.00642277	0.0268525	1281.78
+T	0.00642277	0.02694	1290.07
+T	0.00642277	0.0270275	1297.9
+T	0.00642277	0.0271149	1305.31
+T	0.00642277	0.0272024	1312.26
+T	0.00642277	0.0272899	1318.75
+T	0.00642277	0.0273773	1324.78
+T	0.00642277	0.0274648	1330.37
+T	0.00642277	0.0275523	1335.45
+T	0.00642277	0.0276397	1340.1
+T	0.00642277	0.0277272	1344.31
+T	0.00642277	0.0278147	1348
+T	0.00642277	0.0279022	1351.26
+T	0.00642277	0.0279896	1354.04
+T	0.00642277	0.0280771	1356.34
+T	0.00642277	0.0281646	1358.21
+T	0.00642277	0.028252	1359.6
+T	0.00642277	0.0283395	1360.52
+T	0.00642277	0.028427	1360.96
+T	0.00642277	0.0285144	1360.97
+T	0.00642277	0.0286019	1360.47
+T	0.00642277	0.0286894	1359.55
+T	0.00642277	0.0287768	1358.2
+T	0.00642277	0.0288643	1356.35
+T	0.00642277	0.0289518	1354.08
+T	0.00642277	0.0290392	1351.36
+T	0.00642277	0.0291267	1348.19
+T	0.00642277	0.0292142	1344.62
+T	0.00642277	0.0293016	1340.61
+T	0.00642277	0.0293891	1336.16
+T	0.00642277	0.0294766	1331.28
+T	0.00642277	0.029564	1325.98
+T	0.00642277	0.0296515	1320.3
+T	0.00642277	0.029739	1314.2
+T	0.00642277	0.0298264	1307.7
+T	0.00642277	0.0299139	1300.85
+T	0.00642277	0.0300014	1293.6
+T	0.00642277	0.0300888	1285.96
+T	0.00642277	0.0301763	1277.94
+T	0.00642277	0.0302638	1269.55
+T	0.00642277	0.0303513	1260.84
+T	0.00642277	0.0304387	1251.77
+T	0.00642277	0.0305262	1242.35
+T	0.00642277	0.0306137	1232.64
+T	0.00642277	0.0307011	1222.59
+T	0.00642277	0.0307886	1212.18
+T	0.00642277	0.0308761	1201.53
+T	0.00642277	0.0309635	1190.54
+T	0.00642277	0.031051	1179.29
+T	0.00642277	0.0311385	1167.75
+T	0.00642277	0.0312259	1155.94
+T	0.00642277	0.0313134	1143.89
+T	0.00642277	0.0314009	1131.54
+T	0.00642277	0.0314883	1118.98
+T	0.00642277	0.0315758	1106.19
+T	0.00642277	0.0316633	1093.19
+T	0.00642277	0.0317507	1079.94
+T	0.00642277	0.0318382	1066.51
+T	0.00642277	0.0319257	1052.92
+T	0.00642277	0.0320131	1039.1
+T	0.00642277	0.0321006	1025.13
+T	0.00642277	0.0321881	1010.99
+T	0.00642277	0.0322755	996.689
+T	0.00642277	0.032363	982.237
+T	0.00642277	0.0324505	967.674
+T	0.00642277	0.0325379	952.981
+T	0.00642277	0.0326254	938.166
+T	0.00642277	0.0327129	923.243
+T	0.00642277	0.0328003	908.246
+T	0.00642277	0.0328878	893.158
+T	0.00642277	0.0329753	877.99
+T	0.00642277	0.0330627	862.777
+T	0.00642277	0.0331502	847.48
+T	0.00642277	0.0332377	832.157
+T	0.00642277	0.0333251	816.793
+T	0.00642277	0.0334126	801.422
+T	0.00642277	0.0335001	786.008
+T	0.00642277	0.0335875	770.605
+T	0.00642277	0.033675	755.202
+T	0.00642277	0.0337625	739.826
+T	0.00642277	0.0338499	724.448
+T	0.00642277	0.0339374	709.117
+T	0.00642277	0.0340248	693.822
+T	0.00642277	0.0341123	678.59
+T	0.00642277	0.0341998	663.396
+T	0.00642277	0.0342872	648.282
+T	0.00642277	0.0343747	633.24
+T	0.00642277	0.0344622	618.293
+T	0.00642277	0.0345496	603.423
+T	0.00642277	0.0346371	588.664
+T	0.00642277	0.0347246	574.012
+T	0.00642277	0.034812	559.485
+T	0.00642277	0.0348995	545.07
+################################################################################################
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.fit b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.fit
new file mode 100644
index 0000000..61271bc
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.fit
@@ -0,0 +1,129 @@
+###########################################                                                                                  
+#	GISAXS FIT : FIT PARAMETERS                                                                                                
+###########################################                                                                                  
+                                                                                                                             
+# Cuts :   Number of cuts,  Number of points per cut, Fit type,  Error Bar, Epsilon for standard errors, Number of cycles    
+                2                    100                 0          1                0.08                     10             
+# Scale and shift factor :      A       LA     S     LS                                                                      
+                            1.E+05    T        10    T
+                             1e4   2e5         2  20                                                                         
+                              F    F           F  F                                                                          
+# Reciprocal space origin : St(deg)   LSt   Sa(deg)    LSa                                                                   
+                             0.0        F      0.0      F                                                                    
+                             0  0             0  0                                                                           
+                             F  F             F  F                                                                           
+############################  Framework and beam  parameters ##############################################                  
+# Beam Wavelenght  : Lambda (nm),  Sig_Wl                                                                                    
+                        F           F                                                                                        
+                      0  0         0  0                                                                                      
+                      F  F         F  F                                                                                      
+# Alpha_i,2Theta_i  : Alpha_i,  Sig_Ai, 2Theta_i,  Sig_Ti                                                                    
+                        F         F       F         F                                                                        
+                      0  0     0  0    0  0       0  0                                                                       
+                      F  F       F  F    F  F       F  F                                                                     
+# Substrate :    n_delta_S,   n_beta_S,  Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm)                      
+	             F            F            F                    F              F            F                                   
+                 0  0          0  0         0  0                 0  0           0  0         0  0                            
+                 F  F          F  F         F  F                 F  F           F  F         F  F                            
+# Particle : n-delta_I, n-beta_I, Depth,  n-delta_SH, n-beta_SH                                                                
+              F         F        F        F        F                                                                         
+             0  0      0  0     0  0     0  0     0  0                                                                       
+             F  F      F  F     F  F     F  F     F  F                                                                       
+##################################   Particle parameters #################################################                   
+# Probability of particle type                                                                                                 
+	T                                                                                                                           
+	0  1                                                                                                                        
+	T  T  
+	T                                                                                                                           
+	0  1                                                                                                                        
+	T  T                                                                                                                         
+# Fixed geometrical parameters : Base angle,   Height ratio,  Flattening,  FS-radii/R                                                     
+	                               F             F               F          F      F                                                          
+                                   0  0          0  0          0  0        0  0    0  0                                                   
+                                   F  F          F  F          F  F        F  F     F  F 
+	                               F             F               F          F      F                                                          
+                                   0  0          0  0          0  0        0  0    0  0                                                   
+                                   F  F          F  F          F  F        F  F     F  F                                                
+# Shell thicknesses :   dR,      dH,      dW                                                                                 
+	     	            F         F        F                                                                                      
+                       0  0      0  0     0  0                                                                               
+                       F  F      F  F     F  F
+	     	            F         F        F                                                                                      
+                       0  0      0  0     0  0                                                                               
+                       F  F      F  F     F  F                                                                                
+# Size of particle		: Radius(nm), SigmaR/R                                                                                     
+                          T            T                                                                                     
+                         0  10       0  1                                                                                   
+                         F  F        F  F  
+                          T            T                                                                                     
+                         0  10       0  1                                                                                   
+                         F  F        F  F                                                                                    
+# Heigth apect ratio	: Height/R, SigmaH/H, rho_H                                                                                    
+                          T             F       F                                                                             
+                         0  10        0  0     0  0                                                                               
+                         F  F        F  F      F  F
+                          T             F       F                                                                             
+                         0  10        0  0    0  0                                                                                
+                         F  F        F  F     F  F                                                                               
+# Width apect ratio	: Width/R, SigmaW/W, rho_W                                                                                      
+                          F             F      F                                                                               
+                         0  0        0  0     0  0                                                                               
+                         F  F        F  F     F  F
+                          F             F      F                                                                              
+                         0  0        0  0     0  0                                                                               
+                         F  F        F  F     F  F                                                                                
+# Orientation of particle : Zeta(deg), SigmaZ(deg)                                                                             
+                          F           F                                                                                      
+                         0  0        0  0                                                                                    
+                         F  F        F  F 
+                          F           F                                                                                      
+                         0  0        0  0                                                                                    
+                         F  F        F  F                                                                                    
+#################################### Lattice parameters #################################################                    
+#  Interference function :   Peak position D,    w,     Eta_voigt,  Size-Distance coupling,  Cut-off                                                            
+                                   T             T         F                   F               F                                              
+                                  0  50         0  10    0  0                 0  0           0  0                                   
+                                  F  F          F  F     F  F                 F  F           F  F                                               
+# Pair correlation function :   Density,    D1,    HC coverage, CxR
+                                  F         F        F           F
+                                 0  0      0  0     0  0        0  1
+                                 F  F      F  F     F  F        T  T                                                                   
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg)                                                                        
+                         F        F           F                                                                              
+                         0  0     0  0      0  0                                                                             
+                         F  F     F  F      F  F                                                                             
+                       Xi(deg),   sigmaXi(deg)                                                                               
+                         F            F                                                                                      
+                         0  0       0  0                                                                                     
+                         F  F       F  F                                                                                     
+                       Domain sizes DL(nm), SigmaDL/DL                                                                       
+			      F        F           F      F                                                                                       
+                       0  0     0  0        0  0   0  0                                                                      
+                       F  F     F  F        F  F   F  F                                                                      
+# Imperfect lattice :  Correlation lenghts (nm), Rod orientation(deg)                                                        
+                         F        F                F      F                                                                  
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+# Paracrystal :   Disorder factors w/L and Rod orientation (deg)                                                             
+			      F    F                     F     F                                                                                  
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+                        F    F                     F     F                                                                   
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+# Pattern :   Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1                                                      
+			      F         F        F       F       F                                                                                
+                       0  0     0  0     0  0    0  0    0  0                                                                
+                       F  F     F  F     F  F    F  F    F  F                                                                
+			      F         F        F       F       F                                                                                
+                       0  0     0  0     0  0    0  0    0  0                                                                
+                       F  F     F  F     F  F    F  F    F  F                                                                
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.ima b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.ima
new file mode 100644
index 0000000..cf2f785
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.ima
@@ -0,0 +1,100 @@
+    2.7555757744E-29    4.0897532184E+02    1.6392616667E+03    3.7105120695E+03    6.6929860381E+03    1.0802308585E+04    1.6686128741E+04    2.6495252908E+04    4.9649290817E+04    1.7026787542E+05    7.5876162233E+06    4.3025705232E+04    1.3376891771E+04    8.0480008590E+03    6.1848957854E+03    5.2889756027E+03    4.7667032202E+03    4.4200243611E+03    4.1673658030E+03    3.9698952958E+03    3.8070650480E+03    3.6670943145E+03    3.5427943076E+03    3.4295571006E+03    3.324311 [...]
+    2.2829081466E-29    3.1710139501E+02    1.2527768348E+03    2.7605764991E+03    4.7626424697E+03    7.1476581121E+03    9.7658209308E+03    1.2415946634E+04    1.4807236176E+04    1.6396207766E+04    1.0569938494E+04    6.9631589355E+03    5.8362080596E+03    5.2192141560E+03    4.8153137818E+03    4.5229686481E+03    4.2964977348E+03    4.1119864849E+03    3.9556227358E+03    3.8188567583E+03    3.6961170265E+03    3.5836268881E+03    3.4787464005E+03    3.3795850870E+03    3.284763 [...]
+    4.3739351920E-29    3.1695078118E+02    1.2521817995E+03    2.7592652880E+03    4.7603802969E+03    7.1442630530E+03    9.7611822076E+03    1.2410049032E+04    1.4800202624E+04    1.6388419378E+04    1.0564917639E+04    6.9598513650E+03    5.8334358461E+03    5.2167350876E+03    4.8130266638E+03    4.5208205214E+03    4.2944573432E+03    4.1100339357E+03    3.9537447010E+03    3.8170439748E+03    3.6943628811E+03    3.5819265647E+03    3.4770963397E+03    3.3779826300E+03    3.283206 [...]
+    3.3646548706E-29    3.1687442776E+02    1.2518801462E+03    2.7586005652E+03    4.7592334721E+03    7.1425418874E+03    9.7588305280E+03    1.2407059112E+04    1.4796636775E+04    1.6384470815E+04    1.0562372151E+04    6.9581744820E+03    5.8320303875E+03    5.2154782635E+03    4.8118671783E+03    4.5197315344E+03    4.2934230184E+03    4.1090441993E+03    3.9527928084E+03    3.8161252435E+03    3.6934739731E+03    3.5810650541E+03    3.4762604388E+03    3.3771710083E+03    3.282418 [...]
+    1.7186883408E-29    3.1707578925E+02    1.2526756636E+03    2.7603535255E+03    4.7622577060E+03    7.1470805237E+03    9.7650315612E+03    1.2414942788E+04    1.4806038704E+04    1.6394881552E+04    1.0569083463E+04    6.9625956875E+03    5.8357360682E+03    5.2187922408E+03    4.8149247846E+03    4.5226036345E+03    4.2961514764E+03    4.1116556992E+03    3.9553052683E+03    3.8185511568E+03    3.6958222997E+03    3.5833423594E+03    3.4784716155E+03    3.3793197515E+03    3.284507 [...]
+    2.6525463813E-29    3.1785693883E+02    1.2557617558E+03    2.7671539116E+03    4.7739899180E+03    7.1646878521E+03    9.7890882565E+03    1.2445527505E+04    1.4842513774E+04    1.6435270573E+04    1.0595120445E+04    6.9797480347E+03    5.8501124012E+03    5.2316487760E+03    4.8267864751E+03    4.5337453178E+03    4.3067354689E+03    4.1217854133E+03    3.9650500984E+03    3.8279594422E+03    3.7049286599E+03    3.5921721159E+03    3.4870435908E+03    3.3876481154E+03    3.292602 [...]
+    1.2663011720E-29    3.1960384763E+02    1.2626632838E+03    2.7823618535E+03    4.8002271162E+03    7.2040638719E+03    9.8428873783E+03    1.2513925685E+04    1.4924085001E+04    1.6525594909E+04    1.0653348520E+04    7.0181068561E+03    5.8822630105E+03    5.2604004904E+03    4.8533132396E+03    4.5586617239E+03    4.3304044644E+03    4.1444382112E+03    3.9868418292E+03    3.8489981435E+03    3.7252916832E+03    3.6119160132E+03    3.5062103768E+03    3.4062693950E+03    3.310702 [...]
+    2.6780359922E-29    3.2277416524E+02    1.2751882894E+03    2.8099614889E+03    4.8478428687E+03    7.2755242580E+03    9.9405231817E+03    1.2638056282E+04    1.5072122460E+04    1.6689517826E+04    1.0759022356E+04    7.0877214455E+03    5.9406107406E+03    5.3125797559E+03    4.9014545162E+03    4.6038803538E+03    4.3733590966E+03    4.1855484140E+03    4.0263890903E+03    3.8871784816E+03    3.7622454223E+03    3.6477457271E+03    3.5409922523E+03    3.4400607247E+03    3.343546 [...]
+    1.2271825858E-29    3.2786979906E+02    1.2953196648E+03    2.8543222502E+03    4.9243754683E+03    7.3903822897E+03    1.0097452949E+04    1.2837571158E+04    1.5310062901E+04    1.6952991042E+04    1.0928871891E+04    7.1996129610E+03    6.0343930085E+03    5.3964474002E+03    4.9788318226E+03    4.6765599813E+03    4.4423996572E+03    4.2516242419E+03    4.0899525787E+03    3.9485446457E+03    3.8216397560E+03    3.7053330447E+03    3.5968949540E+03    3.4943708387E+03    3.396334 [...]
+    3.3828018937E-29    3.3537839081E+02    1.3249839430E+03    2.9196893801E+03    5.0371489554E+03    7.5596297087E+03    1.0328694658E+04    1.3131563679E+04    1.5660677026E+04    1.7341228774E+04    1.1179151642E+04    7.3644893750E+03    6.1725847387E+03    5.5200295122E+03    5.0928501055E+03    4.7836559568E+03    4.5441331973E+03    4.3489889670E+03    4.1836150673E+03    4.0389690407E+03    3.9091582843E+03    3.7901885159E+03    3.6792676761E+03    3.5743963633E+03    3.474115 [...]
+    1.5749739999E-29    3.4565976521E+02    1.3656026894E+03    3.0091953959E+03    5.1915676663E+03    7.7913772275E+03    1.0645329971E+04    1.3534122739E+04    1.6140767264E+04    1.7872836565E+04    1.1521855831E+04    7.5902521285E+03    6.3618085649E+03    5.6892485851E+03    5.2489735182E+03    4.9303006735E+03    4.6834350927E+03    4.4823085523E+03    4.3118650364E+03    4.1627848920E+03    4.0289948816E+03    3.9063782826E+03    3.7920574496E+03    3.6839716940E+03    3.580617 [...]
+    2.6407918445E-29    3.5874801928E+02    1.4173106145E+03    3.1231371514E+03    5.3881437682E+03    8.0863935394E+03    1.1048409223E+04    1.4046583802E+04    1.6751926413E+04    1.8549578282E+04    1.1958121638E+04    7.8776504170E+03    6.6026924696E+03    5.9046662398E+03    5.4477202349E+03    5.1169808488E+03    4.8607676779E+03    4.6520254492E+03    4.4751280667E+03    4.3204030006E+03    4.1815470594E+03    4.0542876488E+03    3.9356381680E+03    3.8234599060E+03    3.716192 [...]
+    2.4777102709E-29    3.7405365143E+02    1.4777787719E+03    3.2563826799E+03    5.6180234622E+03    8.4313911690E+03    1.1519777928E+04    1.4645866054E+04    1.7466628607E+04    1.9340974560E+04    1.2468300521E+04    8.2137405077E+03    6.8843877060E+03    6.1565807317E+03    5.6801393749E+03    5.3352890785E+03    5.0681445530E+03    4.8504962430E+03    4.6660513828E+03    4.5047247752E+03    4.3599443103E+03    4.2272551088E+03    4.1035431501E+03    3.9865784785E+03    3.874733 [...]
+    2.1806767748E-29    3.9001511317E+02    1.5408379392E+03    3.3953377242E+03    5.8577535387E+03    8.7911722510E+03    1.2011345593E+04    1.5270829143E+04    1.8211958410E+04    2.0166285902E+04    1.3000343514E+04    8.5642343416E+03    7.1781557623E+03    6.4192919145E+03    5.9225198123E+03    5.5629539124E+03    5.2844095427E+03    5.0574733913E+03    4.8651574449E+03    4.6969461466E+03    4.5459869363E+03    4.4076348307E+03    4.2786429226E+03    4.1566860947E+03    4.040067 [...]
+    1.0096387038E-29    4.0389264434E+02    1.5956641184E+03    3.5161509258E+03    6.0661848924E+03    9.1039813728E+03    1.2438736278E+04    1.5814200646E+04    1.8859983452E+04    2.0883852100E+04    1.3462928752E+04    8.8689721229E+03    7.4335736663E+03    6.6477076985E+03    6.1332592440E+03    5.7608990087E+03    5.4724431145E+03    5.2374316335E+03    5.0382720597E+03    4.8640746489E+03    4.7077429934E+03    4.5644668137E+03    4.4308836552E+03    4.3045856537E+03    4.183815 [...]
+    9.3458586583E-30    4.1205393080E+02    1.6279070822E+03    3.5872006338E+03    6.1887628072E+03    9.2879442477E+03    1.2690085603E+04    1.6133760100E+04    1.9241092230E+04    2.1305861029E+04    1.3734982076E+04    9.0481940731E+03    7.5837905745E+03    6.7820448249E+03    6.2572011002E+03    5.8773166726E+03    5.5830318933E+03    5.3432712913E+03    5.1400868343E+03    4.9623686976E+03    4.8028770472E+03    4.6567043755E+03    4.5204202578E+03    4.3915681523E+03    4.268355 [...]
+    1.3540247229E-29    4.1101169272E+02    1.6237895822E+03    3.5781277563E+03    6.1731106891E+03    9.2644552947E+03    1.2657994935E+04    1.6092964262E+04    1.9192443372E+04    2.1251996597E+04    1.3700261298E+04    9.0253232981E+03    7.5646231700E+03    6.7649053615E+03    6.2413893786E+03    5.8624660410E+03    5.5689257413E+03    5.3297715406E+03    5.1271007494E+03    4.9498315976E+03    4.7907425226E+03    4.6449383929E+03    4.5089974274E+03    4.3804692680E+03    4.257565 [...]
+    1.6123279555E-29    3.9889195160E+02    1.5759080495E+03    3.4726179817E+03    5.9910823821E+03    8.9912731861E+03    1.2284749676E+04    1.5618436068E+04    1.8626526738E+04    2.0625356996E+04    1.3296297336E+04    8.7592066405E+03    7.3415783982E+03    6.5654425355E+03    6.0573642381E+03    5.6896149523E+03    5.4047309065E+03    5.1726291113E+03    4.9759347261E+03    4.8038927068E+03    4.6494943942E+03    4.5079889639E+03    4.3760555004E+03    4.2513158696E+03    4.132034 [...]
+    1.0102907873E-29    3.7634791637E+02    1.4868431046E+03    3.2763578012E+03    5.6524882364E+03    8.4831207132E+03    1.1590464963E+04    1.4735748435E+04    1.7573839464E+04    1.9459710723E+04    1.2544858419E+04    8.2641837503E+03    6.9266745936E+03    6.1944036617E+03    5.7150408736E+03    5.3680762645E+03    5.0992936173E+03    4.8803100634E+03    4.6947326774E+03    4.5324142108E+03    4.3867420726E+03    4.2532339053E+03    4.1287564495E+03    4.0110659479E+03    3.898525 [...]
+    1.7758743920E-29    3.4616814118E+02    1.3676115118E+03    3.0136233287E+03    5.1992101174E+03    7.8028529145E+03    1.0661019014E+04    1.3554083530E+04    1.6164591197E+04    1.7899239294E+04    1.1538891545E+04    7.6014848352E+03    6.3712317396E+03    5.6976828562E+03    5.2567613972E+03    4.9376210642E+03    4.6903932156E+03    4.4889709828E+03    4.3182759672E+03    4.1689746064E+03    4.0349845516E+03    3.9121828649E+03    3.7976875232E+03    3.6894346774E+03    3.585918 [...]
+    1.0814308497E-29    3.1194622822E+02    1.2324105613E+03    2.7156992174E+03    4.6852213637E+03    7.0314716025E+03    9.6070842230E+03    1.2214146460E+04    1.4566586365E+04    1.6129753996E+04    1.0398181122E+04    6.8500200972E+03    5.7413886620E+03    5.1344266859E+03    4.7370950037E+03    4.4495053697E+03    4.2267190538E+03    4.0452100525E+03    3.8913905771E+03    3.7568497503E+03    3.6361064998E+03    3.5254454602E+03    3.4222695070E+03    3.3247188070E+03    3.231436 [...]
+    8.9295264293E-30    2.7683178738E+02    1.0936834651E+03    2.4100049253E+03    4.1578270194E+03    6.2399711171E+03    8.5256600381E+03    1.0839259340E+04    1.2926898924E+04    1.4314111611E+04    9.2277141520E+03    6.0789519206E+03    5.0951142402E+03    4.5564757023E+03    4.2038704700E+03    3.9486541952E+03    3.7509466624E+03    3.5898700612E+03    3.4533661025E+03    3.3339706699E+03    3.2268196586E+03    3.1286159146E+03    3.0370546501E+03    2.9504853755E+03    2.867703 [...]
+    1.4974812290E-29    2.4296295522E+02    9.5987739653E+02    2.1151543859E+03    3.6491405578E+03    5.4765467083E+03    7.4825956747E+03    9.5131410202E+03    1.1345372224E+04    1.2562870189E+04    8.0987630266E+03    5.3352326331E+03    4.4717619869E+03    3.9990231813E+03    3.6895576894E+03    3.4655662412E+03    3.2920477125E+03    3.1506785584E+03    3.0308757413E+03    2.9260883282E+03    2.8320473021E+03    2.7458588900E+03    2.6655002754E+03    2.5895228909E+03    2.516869 [...]
+    1.2681564149E-29    2.1149720552E+02    8.3556521034E+02    1.8412242120E+03    3.1765465621E+03    4.7672888513E+03    6.5135386478E+03    8.2811128620E+03    9.8760568031E+03    1.0935880897E+04    7.0499115463E+03    4.6442802907E+03    3.8926363525E+03    3.4811214588E+03    3.2117347312E+03    3.0167525105E+03    2.8657065892E+03    2.7426464624E+03    2.6383596757E+03    2.5471436899E+03    2.4652823561E+03    2.3902566641E+03    2.3203057645E+03    2.2541686874E+03    2.190925 [...]
+    9.8947880761E-30    1.8289960741E+02    7.2258426615E+02    1.5922631642E+03    2.7470301360E+03    4.1226806981E+03    5.6328121802E+03    7.1613851325E+03    8.5406704451E+03    9.4571923666E+03    6.0966630539E+03    4.0163081778E+03    3.3662977824E+03    3.0104261010E+03    2.7774648265E+03    2.6088475145E+03    2.4782256978E+03    2.3718056080E+03    2.2816204457E+03    2.2027387354E+03    2.1319468025E+03    2.0670662410E+03    2.0065742915E+03    1.9493804825E+03    1.894689 [...]
+    7.6269402730E-30    1.5723982903E+02    6.2120980552E+02    1.3688777649E+03    2.3616376962E+03    3.5442927294E+03    4.8425620864E+03    6.1566860569E+03    7.3424669697E+03    8.1304077626E+03    5.2413404791E+03    3.4528466574E+03    2.8940290346E+03    2.5880843261E+03    2.3878064812E+03    2.2428455603E+03    2.1305496203E+03    2.0390600709E+03    1.9615278034E+03    1.8937131956E+03    1.8328534294E+03    1.7770757136E+03    1.7250709202E+03    1.6759015619E+03    1.628883 [...]
+    2.9271876076E-30    1.3440294371E+02    5.3098778727E+02    1.1700675090E+03    2.0186431468E+03    3.0295344827E+03    4.1392490603E+03    5.2625159268E+03    6.2760801012E+03    6.9495850363E+03    4.4801132959E+03    2.9513723368E+03    2.4737151534E+03    2.2122048050E+03    2.0410147668E+03    1.9171076921E+03    1.8211215007E+03    1.7429198885E+03    1.6766484781E+03    1.6186833890E+03    1.5666630606E+03    1.5189866952E+03    1.4745352947E+03    1.4325075262E+03    1.392318 [...]
+    3.4856333501E-30    1.1420949018E+02    4.5120921171E+02    9.9427007039E+02    1.7153511124E+03    2.5743608117E+03    3.5173462447E+03    4.4718480952E+03    5.3331298989E+03    5.9054450253E+03    3.8069996470E+03    2.5079445657E+03    2.1020532789E+03    1.8798338671E+03    1.7343646062E+03    1.6290742938E+03    1.5475099045E+03    1.4810580616E+03    1.4247439776E+03    1.3754882401E+03    1.3312840997E+03    1.2907712689E+03    1.2529988716E+03    1.2172859694E+03    1.183135 [...]
+    4.8552233757E-30    9.6470749892E+01    3.8112850600E+02    8.3984253038E+02    1.4489271738E+03    2.1745178907E+03    2.9710416555E+03    3.7772934001E+03    4.5048040698E+03    4.9882297961E+03    3.2157090161E+03    2.1184193473E+03    1.7755701055E+03    1.5878654060E+03    1.4649902736E+03    1.3760536310E+03    1.3071578852E+03    1.2510274616E+03    1.2034602401E+03    1.1618550918E+03    1.1245169480E+03    1.0902967955E+03    1.0583914437E+03    1.0282257139E+03    9.993798 [...]
+    1.6623180380E-30    8.1006698707E+01    3.2003444631E+02    7.0521766044E+02    1.2166674941E+03    1.8259478676E+03    2.4947910644E+03    3.1718030928E+03    3.7826962918E+03    4.1886309460E+03    2.7002406759E+03    1.7788435859E+03    1.4909523294E+03    1.3333363995E+03    1.2301580518E+03    1.1554779607E+03    1.0976262769E+03    1.0504936790E+03    1.0105516338E+03    9.7561596499E+02    9.4426331730E+02    9.1552885982E+02    8.8873814990E+02    8.6340820701E+02    8.391865 [...]
+    2.8256867494E-30    6.7646633433E+01    2.6725263328E+02    5.8890937723E+02    1.0160082312E+03    1.5248029918E+03    2.0833373052E+03    2.6486933866E+03    3.1588354983E+03    3.4978220365E+03    2.2549046025E+03    1.4854688690E+03    1.2450582039E+03    1.1134372456E+03    1.0272757720E+03    9.6491249463E+02    9.1660221113E+02    8.7724317812E+02    8.4388880419E+02    8.1471513706E+02    7.8853356711E+02    7.6453838696E+02    7.4216638528E+02    7.2101423595E+02    7.007876 [...]
+    1.6524276226E-30    5.6224417847E+01    2.2212671036E+02    4.8947135621E+02    8.4445413696E+02    1.2673384576E+03    1.7315638662E+03    2.2014593216E+03    2.6254638938E+03    2.9072127905E+03    1.8741630176E+03    1.2346470806E+03    1.0348300476E+03    9.2543352266E+02    8.5382062832E+02    8.0198759763E+02    7.6183471132E+02    7.2912165807E+02    7.0139937970E+02    6.7715189884E+02    6.5539130267E+02    6.3544792731E+02    6.1685365928E+02    5.9927327355E+02    5.824621 [...]
+    2.4247377186E-30    4.6574163502E+01    1.8400129995E+02    4.0545943018E+02    6.9951368541E+02    1.0498150463E+03    1.4343618709E+03    1.8236056458E+03    2.1748352631E+03    2.4082257570E+03    1.5524864135E+03    1.0227355541E+03    8.5721474820E+02    7.6659489529E+02    7.0727358622E+02    6.6433717786E+02    6.3107616751E+02    6.0397804068E+02    5.8101408951E+02    5.6092853509E+02    5.4290302727E+02    5.2638284131E+02    5.1098020917E+02    4.9641744260E+02    4.824919 [...]
+    1.3482619866E-30    3.8528297466E+01    1.5221436954E+02    3.3541476744E+02    5.7867005106E+02    8.6845557065E+02    1.1865705662E+03    1.5085711544E+03    1.7991247362E+03    1.9921963900E+03    1.2842891362E+03    8.4605463653E+02    7.0912819271E+02    6.3416330552E+02    5.8509003404E+02    5.4957111921E+02    5.2205614850E+02    4.9963940664E+02    4.8064265214E+02    4.6402704627E+02    4.4911561165E+02    4.3544945407E+02    4.2270779365E+02    4.1066091357E+02    3.991411 [...]
+    2.7575530198E-30    3.1917972099E+01    1.2609885063E+02    2.7786743908E+02    4.7938726299E+02    7.1945410990E+02    9.8298994086E+02    1.2497447298E+03    1.4904479168E+03    1.6503942286E+03    1.0639430390E+03    7.0089668065E+02    5.8746280453E+02    5.2535971158E+02    4.8470599964E+02    4.5528111995E+02    4.3248694745E+02    4.1391630221E+02    3.9817887977E+02    3.8441407572E+02    3.7206106224E+02    3.6073967801E+02    3.5018417965E+02    3.4020426307E+02    3.306610 [...]
+    1.0569594477E-30    2.6575032024E+01    1.0499040958E+02    2.3135354259E+02    3.9913974700E+02    5.9902034615E+02    8.1844130046E+02    1.0405423552E+03    1.2409527268E+03    1.3741245960E+03    8.8584304139E+02    5.8356923381E+02    4.8912374121E+02    4.3741645854E+02    4.0356801547E+02    3.7906874408E+02    3.6009022810E+02    3.4462824069E+02    3.3152520944E+02    3.2006459223E+02    3.0977944208E+02    3.0035323563E+02    2.9156471428E+02    2.8325543046E+02    2.753097 [...]
+    1.0882131598E-30    2.2334698391E+01    8.8238052433E+01    1.9443857013E+02    3.3545264122E+02    5.0344006853E+02    6.8784993434E+02    8.7451221317E+02    1.0429447466E+03    1.1548673893E+03    7.4449660159E+02    4.9045397879E+02    4.1107829587E+02    3.6762145678E+02    3.3917387785E+02    3.1858370573E+02    3.0263339200E+02    2.8963850752E+02    2.7862618433E+02    2.6899421336E+02    2.6035015496E+02    2.5242799125E+02    2.4504176857E+02    2.3805832201E+02    2.313804 [...]
+    3.8124239411E-31    1.9038345991E+01    7.5215096445E+01    1.6574158509E+02    2.8594350634E+02    4.2913777104E+02    5.8633064256E+02    7.4544342249E+02    8.8901689416E+02    9.8442067417E+02    6.3461628498E+02    4.1806771511E+02    3.5040700891E+02    3.1336389015E+02    2.8911481774E+02    2.7156347964E+02    2.5796720541E+02    2.4689017121E+02    2.3750309522E+02    2.2929264908E+02    2.2192431399E+02    2.1517133440E+02    2.0887520223E+02    2.0292240709E+02    1.972301 [...]
+    1.0714503248E-30    1.6536000370E+01    6.5329035503E+01    1.4395696117E+02    2.4835983062E+02    3.7273293905E+02    5.0926464005E+02    6.4746381112E+02    7.7216602885E+02    8.5502980174E+02    5.5120300067E+02    3.6311719288E+02    3.0434962721E+02    2.7217531643E+02    2.5111342067E+02    2.3586891879E+02    2.2405963362E+02    2.1443846465E+02    2.0628513047E+02    1.9915377468E+02    1.9275384803E+02    1.8688840024E+02    1.8141975815E+02    1.7624933183E+02    1.713051 [...]
+    2.9710246088E-31    1.4688374971E+01    5.8029588255E+01    1.2787211696E+02    2.2060962629E+02    3.3108596774E+02    4.5236229480E+02    5.7511967990E+02    6.8588807772E+02    7.5949274301E+02    4.8961390620E+02    3.2254384641E+02    2.7034259806E+02    2.4176319758E+02    2.2305456216E+02    2.0951331191E+02    1.9902344354E+02    1.9047720241E+02    1.8323478879E+02    1.7690016504E+02    1.7121524740E+02    1.6600509278E+02    1.6114741184E+02    1.5655463149E+02    1.521628 [...]
+    8.2173615827E-31    1.3368387983E+01    5.2814690794E+01    1.1638072125E+02    2.0078421180E+02    3.0133235320E+02    4.1170984332E+02    5.2343519509E+02    6.2424886722E+02    6.9123852201E+02    4.4561297027E+02    2.9355710366E+02    2.4604698770E+02    2.2003586692E+02    2.0300844300E+02    1.9068402029E+02    1.8113675726E+02    1.7335845179E+02    1.6676680249E+02    1.6100136369E+02    1.5582724598E+02    1.5108522890E+02    1.4666401389E+02    1.4248389870E+02    1.384867 [...]
+    6.7892394611E-31    1.2462162843E+01    4.9234449324E+01    1.0849140303E+02    1.8717323863E+02    2.8090524445E+02    3.8380020341E+02    4.8795156310E+02    5.8193084324E+02    6.4437894967E+02    4.1540432367E+02    2.7365635700E+02    2.2936689650E+02    2.0511899768E+02    1.8924578343E+02    1.7775674974E+02    1.6885660964E+02    1.6160550833E+02    1.5546061969E+02    1.5008593365E+02    1.4526248482E+02    1.4084184720E+02    1.3672026796E+02    1.3282344868E+02    1.290971 [...]
+    8.0051508197E-31    1.1869547427E+01    4.6893191357E+01    1.0333227143E+02    1.7827248936E+02    2.6754714666E+02    3.6554896447E+02    4.6474736021E+02    5.5425731659E+02    6.1373547160E+02    3.9564956725E+02    2.6064236541E+02    2.1845901591E+02    1.9536414978E+02    1.8024570880E+02    1.6930295763E+02    1.6082598459E+02    1.5391963013E+02    1.4806688281E+02    1.4294771208E+02    1.3835356609E+02    1.3414307783E+02    1.3021742908E+02    1.2650585528E+02    1.229567 [...]
+    5.5554995334E-31    1.1504201537E+01    4.5449811362E+01    1.0015167738E+02    1.7278519181E+02    2.5931189345E+02    3.5429708242E+02    4.5044195906E+02    5.3719654986E+02    5.9484369393E+02    3.8347068977E+02    2.5261917690E+02    2.1173423999E+02    1.8935021122E+02    1.7469707950E+02    1.6409110236E+02    1.5587500219E+02    1.4918117423E+02    1.4350852187E+02    1.3854686606E+02    1.3409407498E+02    1.3001313358E+02    1.2620826590E+02    1.2261088608E+02    1.191709 [...]
+    2.5268897651E-31    1.1293309314E+01    4.4616634580E+01    9.8315710057E+01    1.6961769973E+02    2.5455816471E+02    3.4780202326E+02    4.4218426913E+02    5.2734832961E+02    5.8393851496E+02    3.7644048329E+02    2.4798781472E+02    2.0785237365E+02    1.8587866592E+02    1.7149412533E+02    1.6108254289E+02    1.5301702376E+02    1.4644586906E+02    1.4087716898E+02    1.3600643122E+02    1.3163522991E+02    1.2762906221E+02    1.2389390831E+02    1.2036244004E+02    1.169855 [...]
+    3.7022835870E-31    1.1176976743E+01    4.4157036759E+01    9.7302951739E+01    1.6787044387E+02    2.5193590630E+02    3.4421920852E+02    4.3762914735E+02    5.2191583404E+02    5.7792297441E+02    3.7256246185E+02    2.4543304852E+02    2.0571104507E+02    1.8396367852E+02    1.6972729769E+02    1.5942294656E+02    1.5144049011E+02    1.4493700350E+02    1.3942564455E+02    1.3460505792E+02    1.3027886203E+02    1.2631393983E+02    1.2261724025E+02    1.1912212890E+02    1.157799 [...]
+    3.1373474165E-31    1.1107375848E+01    4.3882063107E+01    9.6697027525E+01    1.6682507850E+02    2.5036703989E+02    3.4207565930E+02    4.3490389020E+02    5.1866567188E+02    5.7432400433E+02    3.7024233630E+02    2.4390460311E+02    2.0442995586E+02    1.8281800977E+02    1.6867027517E+02    1.5843008374E+02    1.5049732746E+02    1.4403433080E+02    1.3855728340E+02    1.3376670666E+02    1.2946744201E+02    1.2552720145E+02    1.2185351345E+02    1.1838015865E+02    1.150588 [...]
+    2.9891724423E-31    1.1047696725E+01    4.3646288089E+01    9.6177482120E+01    1.6592874172E+02    2.4902184137E+02    3.4023772238E+02    4.3256720190E+02    5.1587894812E+02    5.7123824415E+02    3.6825308372E+02    2.4259414734E+02    2.0333159440E+02    1.8183576893E+02    1.6776405088E+02    1.5757888141E+02    1.4968874963E+02    1.4326048070E+02    1.3781286372E+02    1.3304802910E+02    1.2877186683E+02    1.2485279966E+02    1.2119885287E+02    1.1774416288E+02    1.144406 [...]
+    9.6627940413E-32    1.0970966392E+01    4.3343149044E+01    9.5509497161E+01    1.6477631557E+02    2.4729231723E+02    3.3787469445E+02    4.2956294762E+02    5.1229611046E+02    5.6727096878E+02    3.6569557724E+02    2.4090935844E+02    2.0191949776E+02    1.8057297402E+02    1.6659899719E+02    1.5648457691E+02    1.4864925539E+02    1.4226564419E+02    1.3685587435E+02    1.3212414495E+02    1.2787769399E+02    1.2398585793E+02    1.2035730077E+02    1.1692661624E+02    1.136460 [...]
+    6.5411759075E-31    1.0858789630E+01    4.2899971594E+01    9.4532929403E+01    1.6309151423E+02    2.4476382233E+02    3.3442004379E+02    4.2517085214E+02    5.0705815279E+02    5.6147098283E+02    3.6195661527E+02    2.3844627299E+02    1.9985507775E+02    1.7872682785E+02    1.6489574561E+02    1.5488475879E+02    1.4712956873E+02    1.4081124644E+02    1.3545680875E+02    1.3077347902E+02    1.2657046599E+02    1.2271844194E+02    1.1912700460E+02    1.1573141631E+02    1.124844 [...]
+    6.6458335943E-31    1.0700061821E+01    4.2272884466E+01    9.3151105186E+01    1.6070755198E+02    2.4118604680E+02    3.2953176972E+02    4.1895610227E+02    4.9964651123E+02    5.5326406711E+02    3.5666601738E+02    2.3496102308E+02    1.9693393150E+02    1.7611453307E+02    1.6248564145E+02    1.5262100813E+02    1.4497919947E+02    1.3875325649E+02    1.3347710943E+02    1.2886226095E+02    1.2472070840E+02    1.2092501429E+02    1.1738609755E+02    1.1404016663E+02    1.108406 [...]
+    2.9095606046E-31    1.0489697625E+01    4.1441796837E+01    9.1319752703E+01    1.5754804870E+02    2.3644435959E+02    3.2305324950E+02    4.1071956885E+02    4.8982369913E+02    5.4238724321E+02    3.4965424759E+02    2.3034191992E+02    1.9306244318E+02    1.7265236763E+02    1.5929143859E+02    1.4962076548E+02    1.4212921822E+02    1.3602570202E+02    1.3085330963E+02    1.2632921524E+02    1.2226911205E+02    1.1854806772E+02    1.1507875231E+02    1.1179862818E+02    1.086620 [...]
+    6.1849982032E-31    1.0227412416E+01    4.0405584156E+01    8.9036393637E+01    1.5360872800E+02    2.3053234141E+02    3.1497571019E+02    4.0045009485E+02    4.7757640595E+02    5.2882576639E+02    3.4091179643E+02    2.2458269593E+02    1.8823535683E+02    1.6833562857E+02    1.5530879542E+02    1.4587995021E+02    1.3857574604E+02    1.3262486805E+02    1.2758183301E+02    1.2317088654E+02    1.1921232996E+02    1.1558435448E+02    1.1220181350E+02    1.0900373286E+02    1.059456 [...]
+    5.1972834095E-31    9.9165862008E+00    3.9177599795E+01    8.6330452782E+01    1.4894035399E+02    2.2352617669E+02    3.0540324048E+02    3.8828001247E+02    4.6306244707E+02    5.1275438256E+02    3.3055131177E+02    2.1775755770E+02    1.8251486691E+02    1.6321993310E+02    1.5058902296E+02    1.4144675604E+02    1.3436456144E+02    1.2859456498E+02    1.2370482186E+02    1.1942795790E+02    1.1558973543E+02    1.1207204733E+02    1.0879233450E+02    1.0569147564E+02    1.027263 [...]
+    5.1898396907E-32    9.5632324450E+00    3.7781601184E+01    8.3254281027E+01    1.4363324378E+02    2.1556141034E+02    2.9452103351E+02    3.7444476815E+02    4.4656261260E+02    4.9448400995E+02    3.1877322681E+02    2.0999854277E+02    1.7601163962E+02    1.5740424636E+02    1.4522342607E+02    1.3640694295E+02    1.2957712863E+02    1.2401275694E+02    1.1929727394E+02    1.1517283233E+02    1.1147140269E+02    1.0807908612E+02    1.0491626505E+02    1.0192592464E+02    9.906645 [...]
+    6.7843931070E-31    9.1750872401E+00    3.6248151372E+01    7.9875225938E+01    1.3780358745E+02    2.0681241698E+02    2.8256733573E+02    3.5924725916E+02    4.2843813528E+02    4.7441464279E+02    3.0583539901E+02    2.0147551856E+02    1.6886804904E+02    1.5101588968E+02    1.3932947191E+02    1.3087084532E+02    1.2431825621E+02    1.1897975036E+02    1.1445568019E+02    1.1049866337E+02    1.0694749005E+02    1.0369288394E+02    1.0065845872E+02    9.7789513412E+01    9.504613 [...]
+    3.9031519495E-31    8.7608276821E+00    3.4611531059E+01    7.6268827223E+01    1.3158170851E+02    1.9747478264E+02    2.6980937505E+02    3.4302722945E+02    4.0909419185E+02    4.5299493595E+02    2.9202705593E+02    1.9237901871E+02    1.6124379115E+02    1.4419767555E+02    1.3303892034E+02    1.2496222291E+02    1.1870550639E+02    1.1360805805E+02    1.0928827419E+02    1.0550994162E+02    1.0211912895E+02    9.9011493530E+01    9.6114097744E+01    9.3374710194E+01    9.075521 [...]
+    3.4219070394E-31    8.3294224460E+00    3.2907172904E+01    7.2513163050E+01    1.2510231006E+02    1.8775066624E+02    2.5652336025E+02    3.2613584142E+02    3.8894957738E+02    4.3068862486E+02    2.7764714757E+02    1.8290598212E+02    1.5330393098E+02    1.3709721822E+02    1.2648796183E+02    1.1880899751E+02    1.1286039539E+02    1.0801397738E+02    1.0390693057E+02    1.0031467324E+02    9.7090853753E+01    9.4136267377E+01    9.1381567944E+01    8.8777095905E+01    8.628661 [...]
+    1.9232101670E-31    7.8896124409E+00    3.1169609735E+01    6.8684328787E+01    1.1849667446E+02    1.7783709319E+02    2.4297848646E+02    3.0891534099E+02    3.6841245376E+02    4.0794767141E+02    2.6298703456E+02    1.7324834844E+02    1.4520934372E+02    1.2985838543E+02    1.1980933054E+02    1.1253584477E+02    1.0690135614E+02    1.0231085519E+02    9.8420685955E+01    9.5018124858E+01    9.1964547732E+01    8.9165987888E+01    8.6556760628E+01    8.4089828390E+01    8.173086 [...]
+    6.9019633908E-31    7.4495151900E+00    2.9430911572E+01    6.4852992870E+01    1.1188672143E+02    1.6791703777E+02    2.2942475103E+02    2.9168356701E+02    3.4786187550E+02    3.8519180724E+02    2.4831730043E+02    1.6358437029E+02    1.3710943300E+02    1.2261478636E+02    1.1312629629E+02    1.0625855082E+02    1.0093837745E+02    9.6603957113E+01    9.2930803353E+01    8.9718058532E+01    8.6834831046E+01    8.4192395711E+01    8.1728731724E+01    7.9399425253E+01    7.717206 [...]
+    2.4100149186E-31    7.0163432541E+00    2.7719573191E+01    6.1081945475E+01    1.0538077888E+02    1.5815307614E+02    2.1608428164E+02    2.7472292596E+02    3.2763464090E+02    3.6279397366E+02    2.3387836537E+02    1.5407242982E+02    1.2913694813E+02    1.1548513676E+02    1.0654838819E+02    1.0007999556E+02    9.5069188355E+01    9.0986815690E+01    8.7527259055E+01    8.4501340069E+01    8.1785778051E+01    7.9297006876E+01    7.6976612012E+01    7.4782762099E+01    7.268493 [...]
+    4.2791178713E-31    6.5962245755E+00    2.6059804359E+01    5.7424534488E+01    9.9070884619E+01    1.4868333669E+02    2.0314580319E+02    2.5827335735E+02    3.0801690252E+02    3.4107103177E+02    2.1987449722E+02    1.4484709328E+02    1.2140467717E+02    1.0857030154E+02    1.0016866612E+02    9.4087589655E+01    8.9376823358E+01    8.5538900166E+01    8.2286500998E+01    7.9441774830E+01    7.6888822589E+01    7.4549081778E+01    7.2367635489E+01    7.0305157041E+01    6.833294 [...]
+    2.6026745094E-31    6.1941110426E+00    2.4471168589E+01    5.3923869489E+01    9.3031412976E+01    1.3961943902E+02    1.9076182174E+02    2.4252875334E+02    2.8923989707E+02    3.2027903398E+02    2.0647076325E+02    1.3601710286E+02    1.1400376369E+02    1.0195178946E+02    9.4062331791E+01    8.8351969938E+01    8.3928383121E+01    8.0324430308E+01    7.7270307629E+01    7.4599005993E+01    7.2201691612E+01    7.0004591197E+01    6.7956135595E+01    6.6019395481E+01    6.416742 [...]
+    2.4611770650E-31    5.8137607753E+00    2.2968513161E+01    5.0612667521E+01    8.7318808740E+01    1.3104609447E+02    1.7904807880E+02    2.2763626491E+02    2.7147911789E+02    3.0061230761E+02    1.9379243922E+02    1.2766498735E+02    1.0700338043E+02    9.5691461200E+01    8.8286459445E+01    8.2926746329E+01    7.8774794014E+01    7.5392146246E+01    7.2525566445E+01    7.0018300700E+01    6.7768198142E+01    6.5706015516E+01    6.3783350251E+01    6.1965540651E+01    6.022729 [...]
+    2.9776228623E-31    5.4577795245E+00    2.1562132675E+01    4.7513613501E+01    8.1972208923E+01    1.2302203932E+02    1.6808482621E+02    2.1369792261E+02    2.5485624782E+02    2.8220559504E+02    1.8192638904E+02    1.1984797099E+02    1.0045149099E+02    8.9832210509E+01    8.2880624157E+01    7.7849092012E+01    7.3951368684E+01    7.0775844922E+01    6.8084790007E+01    6.5731048182E+01    6.3618723351E+01    6.1682812070E+01    5.9877875490E+01    5.8171374272E+01    5.653956 [...]
+    1.2492678662E-31    5.1277070569E+00    2.0258110330E+01    4.4640112245E+01    7.7014740177E+01    1.1558198188E+02    1.5791948643E+02    2.0077401879E+02    2.3944319271E+02    2.6513852001E+02    1.7092394394E+02    1.1259987009E+02    9.4376439469E+01    8.4399385742E+01    7.7868213392E+01    7.3140975306E+01    6.9478976218E+01    6.6495499963E+01    6.3967193179E+01    6.1755799721E+01    5.9771223054E+01    5.7952390982E+01    5.6256612689E+01    5.4653316740E+01    5.312019 [...]
+    1.9155228557E-31    4.8241353436E+00    1.9058784855E+01    4.1997317371E+01    7.2455293890E+01    1.0873926648E+02    1.4857029237E+02    1.8888773506E+02    2.2526760011E+02    2.4944169843E+02    1.6080484176E+02    1.0593368815E+02    8.8789125532E+01    7.9402734972E+01    7.3258221531E+01    6.8810845216E+01    6.5365643262E+01    6.2558794017E+01    6.0180167176E+01    5.8099691698E+01    5.6232604988E+01    5.4521450484E+01    5.2926064784E+01    5.1417686366E+01    4.997532 [...]
+    1.8434454630E-31    4.5468466676E+00    1.7963296132E+01    3.9583333619E+01    6.8290600452E+01    1.0248898647E+02    1.4003054064E+02    1.7803054970E+02    2.1231930811E+02    2.3510387929E+02    1.5156183043E+02    9.9844648406E+01    8.3685546150E+01    7.4838678974E+01    6.9047346948E+01    6.4855601177E+01    6.1608425117E+01    5.8962909469E+01    5.6721002160E+01    5.4760108607E+01    5.3000338361E+01    5.1387537464E+01    4.9883851114E+01    4.8462171015E+01    4.710271 [...]
+    5.0992862193E-32    4.2949613092E+00    1.6968168656E+01    3.7390502541E+01    6.4507447382E+01    9.6811313159E+01    1.3227313977E+02    1.6816802020E+02    2.0055724156E+02    2.2207958076E+02    1.4316559056E+02    9.4313436728E+01    7.9049513622E+01    7.0692741912E+01    6.5222234573E+01    6.1262699450E+01    5.8195406654E+01    5.5696443414E+01    5.3578729379E+01    5.1726461492E+01    5.0064175105E+01    4.8540716312E+01    4.7120327420E+01    4.5777401905E+01    4.449325 [...]
+    1.2071752489E-31    4.0670861415E+00    1.6067898592E+01    3.5406696122E+01    6.1084911121E+01    9.1674845189E+01    1.2525518658E+02    1.5924560136E+02    1.8991635068E+02    2.1029677348E+02    1.3556968856E+02    8.9309464539E+01    7.4855390418E+01    6.6941997041E+01    6.1761732321E+01    5.8012272552E+01    5.5107715613E+01    5.2741334491E+01    5.0735974722E+01    4.8981977402E+01    4.7407881815E+01    4.5965248142E+01    4.4620215904E+01    4.3348537204E+01    4.213251 [...]
+    1.2849648691E-32    3.8614571871E+00    1.5255516981E+01    3.3616557836E+01    5.7996498144E+01    8.7039821884E+01    1.1892235646E+02    1.5119422709E+02    1.8031426794E+02    1.9966425173E+02    1.2871532847E+02    8.4793999196E+01    7.1070712912E+01    6.3557413061E+01    5.8639055874E+01    5.5079162610E+01    5.2321454141E+01    5.0074711467E+01    4.8170737007E+01    4.6505416196E+01    4.5010901371E+01    4.3641201841E+01    4.2364169130E+01    4.1156781335E+01    4.000223 [...]
+    6.5996186349E-32    3.6760708712E+00    1.4523108281E+01    3.2002645285E+01    5.5212116276E+01    8.2861081761E+01    1.1321294563E+02    1.4393544948E+02    1.7165743690E+02    1.9007841999E+02    1.2253572704E+02    8.0723046156E+01    6.7658607088E+01    6.0506014450E+01    5.5823781822E+01    5.2434793503E+01    4.9809477195E+01    4.7670595272E+01    4.5858025298E+01    4.4272651249E+01    4.2849882841E+01    4.1545937411E+01    4.0330209954E+01    3.9180783874E+01    3.808166 [...]
+    1.9410583797E-32    3.5088002830E+00    1.3862269678E+01    3.0546442333E+01    5.2699820875E+01    7.9090683148E+01    1.0806145166E+02    1.3738599107E+02    1.6384654126E+02    1.8142930459E+02    1.1695998913E+02    7.7049901986E+01    6.4579928370E+01    5.7752795074E+01    5.3283613204E+01    5.0048829210E+01    4.7542967869E+01    4.5501406677E+01    4.3771309256E+01    4.2258069667E+01    4.0900036697E+01    3.9655419947E+01    3.8495007057E+01    3.7397878724E+01    3.634876 [...]
+    7.5020405221E-32    3.3574941914E+00    1.3264502277E+01    2.9229221108E+01    5.0427301986E+01    7.5680136079E+01    1.0340162293E+02    1.3146162178E+02    1.5678112849E+02    1.7360567352E+02    1.1191640830E+02    7.3727328700E+01    6.1795084059E+01    5.5262347969E+01    5.0985883168E+01    4.7890586203E+01    4.5492779062E+01    4.3539250364E+01    4.1883754388E+01    4.0435764835E+01    3.9136289049E+01    3.7945338753E+01    3.6834961308E+01    3.5785139527E+01    3.478126 [...]
+    1.8984893960E-31    3.2200578065E+00    1.2721530162E+01    2.8032745084E+01    4.8363097314E+01    7.2582222704E+01    9.9168945851E+01    1.2608032113E+02    1.5036338109E+02    1.6649921245E+02    1.0733515888E+02    7.0709327239E+01    5.9265519800E+01    5.3000194681E+01    4.8898781446E+01    4.5930185461E+01    4.3630527838E+01    4.1756962287E+01    4.0169229599E+01    3.8780509143E+01    3.7534223118E+01    3.6392020166E+01    3.5327091900E+01    3.4320240545E+01    3.335745 [...]
+    4.8578924272E-32    3.0945153187E+00    1.2225547474E+01    2.6939813525E+01    4.6477531539E+01    6.9752406994E+01    9.5302570943E+01    1.2116472700E+02    1.4450103702E+02    1.6000775851E+02    1.0315038074E+02    6.7952510849E+01    5.6954870698E+01    5.0933814689E+01    4.6992304134E+01    4.4139444608E+01    4.1929442889E+01    4.0128920763E+01    3.8603087448E+01    3.7268507280E+01    3.6070808325E+01    3.4973134482E+01    3.3949722583E+01    3.2982123353E+01    3.205687 [...]
+    1.0947898003E-31    2.9790550823E+00    1.1769396916E+01    2.5934654845E+01    4.4743394944E+01    6.7149853215E+01    9.1746704397E+01    1.1664390482E+02    1.3910949969E+02    1.5403763678E+02    9.9301685462E+01    6.5417097336E+01    5.4829792995E+01    4.9033389178E+01    4.5238939912E+01    4.2492522477E+01    4.0364976849E+01    3.8631632503E+01    3.7162727906E+01    3.5877940513E+01    3.4724927099E+01    3.3668206731E+01    3.2682977517E+01    3.1751478564E+01    3.086074 [...]
+    1.0989875602E-31    2.8720589321E+00    1.1346685576E+01    2.5003181826E+01    4.3136383737E+01    6.4738086757E+01    8.8451510965E+01    1.1245449552E+02    1.3411320692E+02    1.4850517619E+02    9.5735133661E+01    6.3067552902E+01    5.2860503714E+01    4.7272283646E+01    4.3614115315E+01    4.0966337367E+01    3.8915203617E+01    3.7244112878E+01    3.5827964179E+01    3.4589319871E+01    3.3477716716E+01    3.2458948132E+01    3.1509103031E+01    3.0611058437E+01    2.975231 [...]
+    6.2515490878E-32    2.7721175503E+00    1.0951845639E+01    2.4133125402E+01    4.1635330861E+01    6.2485340539E+01    8.5373587263E+01    1.0854131725E+02    1.2944634869E+02    1.4333750428E+02    9.2403747320E+01    6.0872929661E+01    5.1021063566E+01    4.5627300909E+01    4.2096428176E+01    3.9540786318E+01    3.7561026661E+01    3.5948085297E+01    3.4581214512E+01    3.3385671336E+01    3.2312748550E+01    3.1329429901E+01    3.0412636363E+01    2.9545840810E+01    2.871698 [...]
+    1.3464822090E-31    2.6780340553E+00    1.0580148563E+01    2.3314065902E+01    4.0222259892E+01    6.0364635899E+01    8.2476072301E+01    1.0485750595E+02    1.2505303471E+02    1.3847273280E+02    8.9267629465E+01    5.8806944499E+01    4.9289443057E+01    4.4078740232E+01    4.0667702184E+01    3.8198796372E+01    3.6286227730E+01    3.4728027829E+01    3.3407547053E+01    3.2252579155E+01    3.1216070011E+01    3.0266123918E+01    2.9380445141E+01    2.8543067479E+01    2.774233 [...]
+    1.8425039066E-31    2.5888180791E+00    1.0227681683E+01    2.2537381494E+01    3.8882296103E+01    5.8353649126E+01    7.9728465133E+01    1.0136428351E+02    1.2088701799E+02    1.3385965163E+02    8.6293766848E+01    5.6847849097E+01    4.7647413550E+01    4.2610299917E+01    3.9312897024E+01    3.6926240173E+01    3.5077386678E+01    3.3571096491E+01    3.2294606059E+01    3.1178114621E+01    3.0176135613E+01    2.9257835910E+01    2.8401662538E+01    2.7592181196E+01    2.681812 [...]
+    1.7229222933E-31    2.5036725778E+00    9.8912961021E+00    2.1796133356E+01    3.7603468359E+01    5.6434414153E+01    7.7106218650E+01    9.8030441326E+01    1.1691107896E+02    1.2945704679E+02    8.3455590332E+01    5.4978140325E+01    4.6080304547E+01    4.1208860250E+01    3.8019908126E+01    3.5711747884E+01    3.3923702817E+01    3.2466954263E+01    3.1232447433E+01    3.0152677290E+01    2.9183653312E+01    2.8295556466E+01    2.7467542649E+01    2.6684685190E+01    2.593609 [...]
+    9.0125929285E-32    2.4219754852E+00    9.5685342110E+00    2.1084905969E+01    3.6376433580E+01    5.4592909039E+01    7.4590174604E+01    9.4831622051E+01    1.1309616882E+02    1.2523275194E+02    8.0732363420E+01    5.3184157437E+01    4.4576666072E+01    3.9864181584E+01    3.6779288117E+01    3.4546445555E+01    3.2816746380E+01    3.1407533247E+01    3.0213309918E+01    2.9168774102E+01    2.8231370725E+01    2.7372253774E+01    2.6571259304E+01    2.5813947714E+01    2.508978 [...]
+    1.3504177368E-31    2.3432581243E+00    9.2575443964E+00    2.0399619166E+01    3.5194152488E+01    5.2818569343E+01    7.2165898723E+01    9.1749474262E+01    1.0942040147E+02    1.2116253211E+02    7.8108462647E+01    5.1455608019E+01    4.3127871352E+01    3.8568549023E+01    3.5583919010E+01    3.3423647213E+01    3.1750166042E+01    3.0386754741E+01    2.9231345831E+01    2.8220759423E+01    2.7313823536E+01    2.6482629682E+01    2.5707669271E+01    2.4974972002E+01    2.427434 [...]
+    9.3322117122E-32    2.2671820342E+00    8.9569894938E+00    1.9737326407E+01    3.4051541577E+01    5.1103765805E+01    6.9822967085E+01    8.8770745180E+01    1.0586797149E+02    1.1722888552E+02    7.5572605203E+01    4.9785059166E+01    4.1727690345E+01    3.7316391046E+01    3.4428660336E+01    3.2338524365E+01    3.0719374966E+01    2.9400228777E+01    2.8282332022E+01    2.7304556004E+01    2.6427065420E+01    2.5622857855E+01    2.4873058077E+01    2.4164149340E+01    2.348626 [...]
+    4.5140707977E-33    2.1935155988E+00    8.6659544507E+00    1.9096011301E+01    3.2945122079E+01    4.9443277529E+01    6.7554246319E+01    8.5886365557E+01    1.0242806274E+02    1.1341983517E+02    7.3117069871E+01    4.8167424270E+01    4.0371859588E+01    3.6103894823E+01    3.3309994240E+01    3.1287772638E+01    2.9721234142E+01    2.8444951051E+01    2.7363378338E+01    2.6417373521E+01    2.5568395639E+01    2.4790319649E+01    2.4064883617E+01    2.3379009985E+01    2.272315 [...]
+    1.0388505732E-31    2.1221115714E+00    8.3838575361E+00    1.8474391959E+01    3.1872682413E+01    4.7833785391E+01    6.5355201455E+01    8.3090569686E+01    9.9093798927E+01    1.0972776670E+02    7.0736947888E+01    4.6599469500E+01    3.9057668554E+01    3.4928636306E+01    3.2225684190E+01    3.0269291212E+01    2.8753747867E+01    2.7519011492E+01    2.6472647262E+01    2.5557437912E+01    2.4736097073E+01    2.3983350126E+01    2.3281529599E+01    2.2617983636E+01    2.198347 [...]
+    1.5277574797E-31    2.0528863176E+00    8.1103683324E+00    1.7871740277E+01    3.0832966415E+01    4.6273404145E+01    6.3223256644E+01    8.0380082646E+01    9.5861274293E+01    1.0614835511E+02    6.8429451016E+01    4.5079357989E+01    3.7783577605E+01    3.3789238569E+01    3.1174459763E+01    2.9281886737E+01    2.7815782487E+01    2.6621325074E+01    2.5609094972E+01    2.4723741389E+01    2.3929194264E+01    2.3201003455E+01    2.2522077815E+01    2.1880178198E+01    2.126637 [...]
+    1.0106203318E-31    1.9858013355E+00    7.8453347287E+00    1.7287721065E+01    2.9825395794E+01    4.4761265883E+01    6.1157226031E+01    7.7753396733E+01    9.2728690683E+01    1.0267960920E+02    6.6193295558E+01    4.3606244029E+01    3.6548877869E+01    3.2685067643E+01    3.0155736011E+01    2.8325009741E+01    2.6906816003E+01    2.5751392175E+01    2.4772240804E+01    2.3915819864E+01    2.3147238000E+01    2.2442844055E+01    2.1786105389E+01    2.1165182804E+01    2.057143 [...]
+    8.2412342367E-32    1.9208473851E+00    7.5887202196E+00    1.6722253878E+01    2.8849831756E+01    4.3297162296E+01    5.9156824986E+01    7.5210150047E+01    8.9695616454E+01    9.9321050945E+01    6.4028173318E+01    4.2179924564E+01    3.5353399125E+01    3.1615971279E+01    2.9169372445E+01    2.7398528237E+01    2.6026723015E+01    2.4909092755E+01    2.3961969257E+01    2.3133561805E+01    2.2390120308E+01    2.1708767212E+01    2.1073510643E+01    2.0472898651E+01    1.989857 [...]
+    5.4681295590E-32    1.8580313608E+00    7.3405520422E+00    1.6175398734E+01    2.7906377844E+01    4.1881248772E+01    5.7222265804E+01    7.2750612475E+01    8.6762373453E+01    9.6073036712E+01    6.1934314007E+01    4.0800550908E+01    3.4197268188E+01    3.0582062870E+01    2.8215473670E+01    2.6502540471E+01    2.5175596835E+01    2.4094516106E+01    2.3178366217E+01    2.2377050116E+01    2.1657921413E+01    2.0998850697E+01    2.0384369061E+01    1.9803399055E+01    1.924785 [...]
+    1.0198516495E-31    1.7973658806E+00    7.1008800473E+00    1.5647265481E+01    2.6995223572E+01    4.0513809729E+01    5.5353937082E+01    7.0375278067E+01    8.3929550878E+01    9.2936218920E+01    5.9912138209E+01    3.9468400125E+01    3.3080717277E+01    2.9583550088E+01    2.7294231284E+01    2.5637226404E+01    2.4353608413E+01    2.3307825837E+01    2.2421589066E+01    2.1646436736E+01    2.0950788369E+01    2.0313237086E+01    1.9718819043E+01    1.9156818470E+01    1.861941 [...]
+    1.1078849167E-31    1.7388614426E+00    6.8697457095E+00    1.5137945513E+01    2.6116526615E+01    3.9195081804E+01    5.3552162142E+01    6.8084557891E+01    8.1197638978E+01    8.9911140440E+01    5.7961995900E+01    3.8183702776E+01    3.2003939645E+01    2.8620605756E+01    2.6405804743E+01    2.4802735819E+01    2.3560900036E+01    2.2549158128E+01    2.1691768815E+01    2.0941848151E+01    2.0268843603E+01    1.9652045086E+01    1.9076975829E+01    1.8533268859E+01    1.801335 [...]
+    1.1663691883E-31    1.6825209072E+00    6.6471603300E+00    1.4647463733E+01    2.5270329942E+01    3.7925129490E+01    5.1817029109E+01    6.5878563999E+01    7.8566771407E+01    8.6997949290E+01    5.6083982518E+01    3.6946521745E+01    3.0966988009E+01    2.7693277034E+01    2.5550237566E+01    2.3999109603E+01    2.2797510556E+01    2.1818550175E+01    2.0988941256E+01    2.0263318928E+01    1.9612120583E+01    1.9015307160E+01    1.8458870943E+01    1.7932780858E+01    1.742971 [...]
+    3.2036099201E-32    1.6283360096E+00    6.4330912569E+00    1.4175748194E+01    2.4456509428E+01    3.6703766510E+01    5.0148283486E+01    6.3756972851E+01    7.6036562335E+01    8.4196218270E+01    5.4277822688E+01    3.5756675640E+01    2.9969710349E+01    2.6801427985E+01    2.4727404354E+01    2.3226229984E+01    2.2063328114E+01    2.1115894937E+01    2.0313003433E+01    1.9610749686E+01    1.8980523140E+01    1.8402930080E+01    1.7864413903E+01    1.7355266581E+01    1.686840 [...]
+    3.0491440566E-32    1.5762855727E+00    6.2274548267E+00    1.3722614537E+01    2.3674747019E+01    3.5530515544E+01    4.8545273128E+01    6.1718955350E+01    7.3606023012E+01    8.1504852563E+01    5.2542810653E+01    3.4613699548E+01    2.9011717015E+01    2.5944710170E+01    2.3936983646E+01    2.2483795035E+01    2.1358065916E+01    2.0440917955E+01    1.9663691342E+01    1.8983885568E+01    1.8373804622E+01    1.7814674721E+01    1.7293372601E+01    1.6800500556E+01    1.632920 [...]
+    7.3989763853E-32    1.5263350878E+00    6.0301147056E+00    1.3287762345E+01    2.2924524427E+01    3.4404598767E+01    4.7006935307E+01    5.9763160402E+01    7.1273542155E+01    7.8922068015E+01    5.0877796272E+01    3.3516835810E+01    2.8092372987E+01    2.5122555718E+01    2.3178451537E+01    2.1771312675E+01    2.0681256539E+01    1.9793171895E+01    1.9040574677E+01    1.8382311162E+01    1.7791562992E+01    1.7250151298E+01    1.6745368679E+01    1.6268115227E+01    1.581175 [...]
+    7.5277050717E-33    1.4784373374E+00    5.8408843512E+00    1.2870780562E+01    2.2205132487E+01    3.3324951890E+01    4.5531815903E+01    5.7887739307E+01    6.9036915036E+01    7.6445423342E+01    4.9281205778E+01    3.2465047694E+01    2.7210809341E+01    2.4334187584E+01    2.2451091129E+01    2.1088109547E+01    2.0032260357E+01    1.9172044619E+01    1.8443064594E+01    1.7805458002E+01    1.7233248069E+01    1.6708826396E+01    1.6219884350E+01    1.5757607589E+01    1.531556 [...]
+    2.6668301386E-32    1.4325337627E+00    5.6595324148E+00    1.2471159395E+01    2.1515691693E+01    3.2290254981E+01    4.4118111510E+01    5.6090399291E+01    6.6893407323E+01    7.4071890823E+01    4.7751087352E+01    3.1457049416E+01    2.6365948405E+01    2.3578642041E+01    2.1754013291E+01    2.0433350516E+01    1.9410284067E+01    1.8576776905E+01    1.7870430759E+01    1.7252621022E+01    1.6698177465E+01    1.6190038409E+01    1.5716277390E+01    1.5268353738E+01    1.484003 [...]
+    5.0167012609E-32    1.3885563101E+00    5.4857900366E+00    1.2088306397E+01    2.0855179938E+01    3.1298974089E+01    4.2763726308E+01    5.4368475812E+01    6.4839841310E+01    7.1797951778E+01    4.6285172670E+01    3.0491346689E+01    2.5556537749E+01    2.2854799074E+01    2.1086184697E+01    1.9806065003E+01    1.8814405702E+01    1.8006486394E+01    1.7321824378E+01    1.6722980788E+01    1.6185558099E+01    1.5693018410E+01    1.5233801388E+01    1.4799628556E+01    1.438445 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.inp b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.inp
new file mode 100755
index 0000000..e0f9c6d
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.inp
@@ -0,0 +1,82 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_fitconstraints
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         DA               0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2       0   2        100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+2
+# Particle type,     Probability
+cylinder                0.4
+cylinder                0.6
+# Geometrical parameters : Base angle (deg),  Height ratio,  Flattening,  FS-radii/R
+	                       54.73               1.		       1.         0.8    0.8
+	                       54.73              1.		       1.         0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           4          gaussian           0.2       0.1         11       20   4
+                           4          gaussian           0.2       0.1         11       20   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           0.8          none            0.1       0.1         11       25   2    0
+                           0.8          none            0.1       0.1         11       25   2    0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+                            2          none                0.4        1         300       15   2   0 
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          1DDL 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               12                     6      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1. 
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.ki2 b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.ki2
new file mode 100644
index 0000000..6ea7819
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.ki2
@@ -0,0 +1,1319 @@
+==================================================
+Number of cuts :                              2
+Number of points per cut :                  100
+Number of fitted parameters :                12
+Number of independent parameters :           12
+Excluded area in cut( 1) :                   F
+Excluded area in cut( 2) :                   F
+  1  1  # Global scale factor :               1.00000E+05
+  2  2  # Global shift factor :               1.00000E+01
+  3  3  # ( 1) Particle probability :         4.00000E-01
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  1.00000E+00
+  4  4  # ( 1) Particle radius (nm) :         4.00000E+00
+  5  5  # ( 1) Dispersion of radius:          2.00000E-01
+  6  6  # ( 1) Height aspect ratio :          8.00000E-01
+  7  7  # ( 2) Particle probability :         6.00000E-01
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  1.00000E+00
+  8  8  # ( 2) Particle radius (nm) :         4.00000E+00
+  9  9  # ( 2) Dispersion of radius:          2.00000E-01
+ 10 10  # ( 2) Height aspect ratio :          8.00000E-01
+ 11 11  # D (nm) :                            1.20000E+01
+ 12 12  # w (nm) :                            6.00000E+00
+ 
+==================================================
+Iteration # =                     0
+Cycle duration (sec) =  1.12500E+00
+Lambda =                1.00000E-04
+Best Chi2 so far =      1.87551E+01
+Current Chi2 =          1.87551E+01
+Chi2( 1) =              1.76985E+00
+Chi2( 2) =              1.69853E+01
+==================================================
+  1  1  # Global scale factor :               3.78601E+04
+  2  2  # Global shift factor :               9.23136E+01
+  3  3  # ( 1) Particle probability :         3.46278E-01
+  4  4  # ( 1) Particle radius (nm) :         4.03737E+00
+  5  5  # ( 1) Dispersion of radius:          2.55529E-01
+  6  6  # ( 1) Height aspect ratio :          8.56620E-01
+  7  7  # ( 2) Particle probability :         5.46277E-01
+  8  8  # ( 2) Particle radius (nm) :         4.02646E+00
+  9  9  # ( 2) Dispersion of radius:          2.37009E-01
+ 10 10  # ( 2) Height aspect ratio :          8.38280E-01
+ 11 11  # D (nm) :                            1.36273E+01
+ 12 12  # w (nm) :                            5.15502E+00
+ 
+==================================================
+Iteration # =                     1
+Cycle duration (sec) =  6.25000E-02
+Lambda =                5.00000E-03
+Best Chi2 so far =      1.87551E+01
+Current Chi2 =          3.55847E+01
+Chi2( 1) =              1.67240E+01
+Chi2( 2) =              1.88607E+01
+==================================================
+  1  1  # Global scale factor :               3.78601E+04
+  2  2  # Global shift factor :               9.23136E+01
+  3  3  # ( 1) Particle probability :         3.46278E-01
+  4  4  # ( 1) Particle radius (nm) :         4.03737E+00
+  5  5  # ( 1) Dispersion of radius:          2.55529E-01
+  6  6  # ( 1) Height aspect ratio :          8.56620E-01
+  7  7  # ( 2) Particle probability :         5.46277E-01
+  8  8  # ( 2) Particle radius (nm) :         4.02646E+00
+  9  9  # ( 2) Dispersion of radius:          2.37009E-01
+ 10 10  # ( 2) Height aspect ratio :          8.38280E-01
+ 11 11  # D (nm) :                            1.36273E+01
+ 12 12  # w (nm) :                            5.15502E+00
+ 
+==================================================
+Iteration # =                     2
+Cycle duration (sec) =  6.25000E-02
+Lambda =                2.50000E-01
+Best Chi2 so far =      1.87551E+01
+Current Chi2 =          2.45577E+01
+Chi2( 1) =              9.20369E+00
+Chi2( 2) =              1.53540E+01
+==================================================
+  1  1  # Global scale factor :               3.78601E+04
+  2  2  # Global shift factor :               9.23136E+01
+  3  3  # ( 1) Particle probability :         3.46278E-01
+  4  4  # ( 1) Particle radius (nm) :         4.03737E+00
+  5  5  # ( 1) Dispersion of radius:          2.55529E-01
+  6  6  # ( 1) Height aspect ratio :          8.56620E-01
+  7  7  # ( 2) Particle probability :         5.46277E-01
+  8  8  # ( 2) Particle radius (nm) :         4.02646E+00
+  9  9  # ( 2) Dispersion of radius:          2.37009E-01
+ 10 10  # ( 2) Height aspect ratio :          8.38280E-01
+ 11 11  # D (nm) :                            1.36273E+01
+ 12 12  # w (nm) :                            5.15502E+00
+ 
+==================================================
+Iteration # =                     3
+Cycle duration (sec) =  5.93750E-01
+Lambda =                2.50000E-02
+Best Chi2 so far =      8.68930E+00
+Current Chi2 =          8.68930E+00
+Chi2( 1) =              9.61891E-01
+Chi2( 2) =              7.72741E+00
+==================================================
+  1  1  # Global scale factor :               3.88803E+04
+  2  2  # Global shift factor :               8.81260E+01
+  3  3  # ( 1) Particle probability :         4.63171E-01
+  4  4  # ( 1) Particle radius (nm) :         4.39393E+00
+  5  5  # ( 1) Dispersion of radius:          3.11604E-01
+  6  6  # ( 1) Height aspect ratio :          9.45405E-01
+  7  7  # ( 2) Particle probability :         6.13732E-01
+  8  8  # ( 2) Particle radius (nm) :         4.19284E+00
+  9  9  # ( 2) Dispersion of radius:          2.90385E-01
+ 10 10  # ( 2) Height aspect ratio :          8.76816E-01
+ 11 11  # D (nm) :                            1.38183E+01
+ 12 12  # w (nm) :                            4.75092E+00
+ 
+==================================================
+Iteration # =                     4
+Cycle duration (sec) =  7.81250E-02
+Lambda =                1.25000E+00
+Best Chi2 so far =      8.68930E+00
+Current Chi2 =          2.02926E+01
+Chi2( 1) =              6.23632E+00
+Chi2( 2) =              1.40563E+01
+==================================================
+  1  1  # Global scale factor :               3.88803E+04
+  2  2  # Global shift factor :               8.81260E+01
+  3  3  # ( 1) Particle probability :         4.63171E-01
+  4  4  # ( 1) Particle radius (nm) :         4.39393E+00
+  5  5  # ( 1) Dispersion of radius:          3.11604E-01
+  6  6  # ( 1) Height aspect ratio :          9.45405E-01
+  7  7  # ( 2) Particle probability :         6.13732E-01
+  8  8  # ( 2) Particle radius (nm) :         4.19284E+00
+  9  9  # ( 2) Dispersion of radius:          2.90385E-01
+ 10 10  # ( 2) Height aspect ratio :          8.76816E-01
+ 11 11  # D (nm) :                            1.38183E+01
+ 12 12  # w (nm) :                            4.75092E+00
+ 
+==================================================
+Iteration # =                     5
+Cycle duration (sec) =  5.62500E-01
+Lambda =                1.25000E-01
+Best Chi2 so far =      7.35053E+00
+Current Chi2 =          7.35053E+00
+Chi2( 1) =              8.79444E-01
+Chi2( 2) =              6.47109E+00
+==================================================
+  1  1  # Global scale factor :               4.18646E+04
+  2  2  # Global shift factor :               8.59068E+01
+  3  3  # ( 1) Particle probability :         4.94570E-01
+  4  4  # ( 1) Particle radius (nm) :         4.55662E+00
+  5  5  # ( 1) Dispersion of radius:          3.01675E-01
+  6  6  # ( 1) Height aspect ratio :          9.92086E-01
+  7  7  # ( 2) Particle probability :         6.16901E-01
+  8  8  # ( 2) Particle radius (nm) :         4.26598E+00
+  9  9  # ( 2) Dispersion of radius:          2.92565E-01
+ 10 10  # ( 2) Height aspect ratio :          8.89964E-01
+ 11 11  # D (nm) :                            1.39177E+01
+ 12 12  # w (nm) :                            4.66638E+00
+ 
+==================================================
+Iteration # =                     6
+Cycle duration (sec) =  5.62500E-01
+Lambda =                1.25000E-02
+Best Chi2 so far =      6.21495E+00
+Current Chi2 =          6.21495E+00
+Chi2( 1) =              1.34216E+00
+Chi2( 2) =              4.87279E+00
+==================================================
+  1  1  # Global scale factor :               7.13956E+04
+  2  2  # Global shift factor :               5.50672E+01
+  3  3  # ( 1) Particle probability :         5.52762E-01
+  4  4  # ( 1) Particle radius (nm) :         5.16843E+00
+  5  5  # ( 1) Dispersion of radius:          2.41093E-01
+  6  6  # ( 1) Height aspect ratio :          1.13799E+00
+  7  7  # ( 2) Particle probability :         5.95281E-01
+  8  8  # ( 2) Particle radius (nm) :         4.46290E+00
+  9  9  # ( 2) Dispersion of radius:          2.93728E-01
+ 10 10  # ( 2) Height aspect ratio :          8.84786E-01
+ 11 11  # D (nm) :                            1.58041E+01
+ 12 12  # w (nm) :                            3.45322E+00
+ 
+==================================================
+Iteration # =                     7
+Cycle duration (sec) =  5.78125E-01
+Lambda =                1.25000E-03
+Best Chi2 so far =      4.47702E+00
+Current Chi2 =          4.47702E+00
+Chi2( 1) =              3.65099E+00
+Chi2( 2) =              8.26024E-01
+==================================================
+  1  1  # Global scale factor :               1.35852E+05
+  2  2  # Global shift factor :               1.18732E+01
+  3  3  # ( 1) Particle probability :         5.37992E-01
+  4  4  # ( 1) Particle radius (nm) :         4.91099E+00
+  5  5  # ( 1) Dispersion of radius:          1.29231E-01
+  6  6  # ( 1) Height aspect ratio :          9.65897E-01
+  7  7  # ( 2) Particle probability :         3.34293E-01
+  8  8  # ( 2) Particle radius (nm) :         4.92140E+00
+  9  9  # ( 2) Dispersion of radius:          2.36286E-01
+ 10 10  # ( 2) Height aspect ratio :          9.81356E-01
+ 11 11  # D (nm) :                            1.45266E+01
+ 12 12  # w (nm) :                            3.04020E+00
+ 
+==================================================
+Iteration # =                     8
+Cycle duration (sec) =  5.78125E-01
+Lambda =                1.25000E-04
+Best Chi2 so far =      4.00779E-01
+Current Chi2 =          4.00779E-01
+Chi2( 1) =              8.07307E-02
+Chi2( 2) =              3.20049E-01
+==================================================
+  1  1  # Global scale factor :               1.31899E+05
+  2  2  # Global shift factor :              -3.95830E-01
+  3  3  # ( 1) Particle probability :         5.68995E-01
+  4  4  # ( 1) Particle radius (nm) :         4.91068E+00
+  5  5  # ( 1) Dispersion of radius:          1.53513E-01
+  6  6  # ( 1) Height aspect ratio :          9.41486E-01
+  7  7  # ( 2) Particle probability :         4.21812E-01
+  8  8  # ( 2) Particle radius (nm) :         5.21691E+00
+  9  9  # ( 2) Dispersion of radius:          2.20875E-01
+ 10 10  # ( 2) Height aspect ratio :          1.06666E+00
+ 11 11  # D (nm) :                            1.49247E+01
+ 12 12  # w (nm) :                            3.09173E+00
+ 
+==================================================
+Iteration # =                     9
+Cycle duration (sec) =  5.78125E-01
+Lambda =                1.25000E-05
+Best Chi2 so far =      2.33665E-02
+Current Chi2 =          2.33665E-02
+Chi2( 1) =              2.83621E-03
+Chi2( 2) =              2.05303E-02
+==================================================
+  1  1  # Global scale factor :               1.31728E+05
+  2  2  # Global shift factor :               5.90612E-01
+  3  3  # ( 1) Particle probability :         6.60819E-01
+  4  4  # ( 1) Particle radius (nm) :         4.92536E+00
+  5  5  # ( 1) Dispersion of radius:          1.86101E-01
+  6  6  # ( 1) Height aspect ratio :          9.84164E-01
+  7  7  # ( 2) Particle probability :         3.44720E-01
+  8  8  # ( 2) Particle radius (nm) :         5.26120E+00
+  9  9  # ( 2) Dispersion of radius:          2.16915E-01
+ 10 10  # ( 2) Height aspect ratio :          1.00898E+00
+ 11 11  # D (nm) :                            1.49763E+01
+ 12 12  # w (nm) :                            3.02653E+00
+ 
+==================================================
+Iteration # =                    10
+Cycle duration (sec) =  6.25000E-02
+Lambda =                6.25000E-04
+Best Chi2 so far =      2.33665E-02
+Current Chi2 =          3.38691E-02
+Chi2( 1) =              1.43168E-03
+Chi2( 2) =              3.24374E-02
+==================================================
+  1  1  # Global scale factor :               1.31728E+05
+  2  2  # Global shift factor :               5.90612E-01
+  3  3  # ( 1) Particle probability :         6.60819E-01
+  4  4  # ( 1) Particle radius (nm) :         4.92536E+00
+  5  5  # ( 1) Dispersion of radius:          1.86101E-01
+  6  6  # ( 1) Height aspect ratio :          9.84164E-01
+  7  7  # ( 2) Particle probability :         3.44720E-01
+  8  8  # ( 2) Particle radius (nm) :         5.26120E+00
+  9  9  # ( 2) Dispersion of radius:          2.16915E-01
+ 10 10  # ( 2) Height aspect ratio :          1.00898E+00
+ 11 11  # D (nm) :                            1.49763E+01
+ 12 12  # w (nm) :                            3.02653E+00
+ 
+==================================================
+Iteration # =                    11
+Cycle duration (sec) =  6.40625E-01
+Lambda =                6.25000E-05
+Best Chi2 so far =      2.27172E-03
+Current Chi2 =          2.27172E-03
+Chi2( 1) =              4.45512E-04
+Chi2( 2) =              1.82621E-03
+==================================================
+  1  1  # Global scale factor :               1.31083E+05
+  2  2  # Global shift factor :               1.06347E-01
+  3  3  # ( 1) Particle probability :         6.54787E-01
+  4  4  # ( 1) Particle radius (nm) :         4.94407E+00
+  5  5  # ( 1) Dispersion of radius:          1.90080E-01
+  6  6  # ( 1) Height aspect ratio :          9.89113E-01
+  7  7  # ( 2) Particle probability :         3.50232E-01
+  8  8  # ( 2) Particle radius (nm) :         5.18450E+00
+  9  9  # ( 2) Dispersion of radius:          2.11598E-01
+ 10 10  # ( 2) Height aspect ratio :          9.89641E-01
+ 11 11  # D (nm) :                            1.49679E+01
+ 12 12  # w (nm) :                            3.03311E+00
+ 
+==================================================
+Iteration # =                    12
+Cycle duration (sec) =  5.78125E-01
+Lambda =                6.25000E-06
+Best Chi2 so far =      9.63377E-04
+Current Chi2 =          9.63377E-04
+Chi2( 1) =              3.27146E-04
+Chi2( 2) =              6.36231E-04
+==================================================
+  1  1  # Global scale factor :               1.31143E+05
+  2  2  # Global shift factor :              -6.84983E-02
+  3  3  # ( 1) Particle probability :         6.35084E-01
+  4  4  # ( 1) Particle radius (nm) :         4.93766E+00
+  5  5  # ( 1) Dispersion of radius:          1.91575E-01
+  6  6  # ( 1) Height aspect ratio :          9.96736E-01
+  7  7  # ( 2) Particle probability :         3.69896E-01
+  8  8  # ( 2) Particle radius (nm) :         5.18766E+00
+  9  9  # ( 2) Dispersion of radius:          2.06599E-01
+ 10 10  # ( 2) Height aspect ratio :          9.78283E-01
+ 11 11  # D (nm) :                            1.49683E+01
+ 12 12  # w (nm) :                            3.03330E+00
+ 
+==================================================
+Iteration # =                    13
+Cycle duration (sec) =  6.09375E-01
+Lambda =                6.25000E-07
+Best Chi2 so far =      9.04840E-04
+Current Chi2 =          9.04840E-04
+Chi2( 1) =              3.27463E-04
+Chi2( 2) =              5.77377E-04
+==================================================
+  1  1  # Global scale factor :               1.31164E+05
+  2  2  # Global shift factor :              -7.47430E-02
+  3  3  # ( 1) Particle probability :         5.50463E-01
+  4  4  # ( 1) Particle radius (nm) :         4.91162E+00
+  5  5  # ( 1) Dispersion of radius:          1.90914E-01
+  6  6  # ( 1) Height aspect ratio :          1.00089E+00
+  7  7  # ( 2) Particle probability :         4.54302E-01
+  8  8  # ( 2) Particle radius (nm) :         5.17680E+00
+  9  9  # ( 2) Dispersion of radius:          2.03656E-01
+ 10 10  # ( 2) Height aspect ratio :          9.76461E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    14
+Cycle duration (sec) =  6.25000E-02
+Lambda =                3.12500E-05
+Best Chi2 so far =      9.04840E-04
+Current Chi2 =          1.60638E-01
+Chi2( 1) =              1.59564E-01
+Chi2( 2) =              1.07398E-03
+==================================================
+  1  1  # Global scale factor :               1.31164E+05
+  2  2  # Global shift factor :              -7.47430E-02
+  3  3  # ( 1) Particle probability :         5.50463E-01
+  4  4  # ( 1) Particle radius (nm) :         4.91162E+00
+  5  5  # ( 1) Dispersion of radius:          1.90914E-01
+  6  6  # ( 1) Height aspect ratio :          1.00089E+00
+  7  7  # ( 2) Particle probability :         4.54302E-01
+  8  8  # ( 2) Particle radius (nm) :         5.17680E+00
+  9  9  # ( 2) Dispersion of radius:          2.03656E-01
+ 10 10  # ( 2) Height aspect ratio :          9.76461E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    15
+Cycle duration (sec) =  6.09375E-01
+Lambda =                3.12500E-06
+Best Chi2 so far =      8.78262E-04
+Current Chi2 =          8.78262E-04
+Chi2( 1) =              3.29313E-04
+Chi2( 2) =              5.48949E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.03994E-02
+  3  3  # ( 1) Particle probability :         5.36639E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90827E+00
+  5  5  # ( 1) Dispersion of radius:          1.90684E-01
+  6  6  # ( 1) Height aspect ratio :          1.00191E+00
+  7  7  # ( 2) Particle probability :         4.68199E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16912E+00
+  9  9  # ( 2) Dispersion of radius:          2.03990E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77279E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03316E+00
+ 
+==================================================
+Iteration # =                    16
+Cycle duration (sec) =  4.68750E-02
+Lambda =                1.56250E-04
+Best Chi2 so far =      8.78262E-04
+Current Chi2 =          9.35034E-04
+Chi2( 1) =              3.73197E-04
+Chi2( 2) =              5.61838E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.03994E-02
+  3  3  # ( 1) Particle probability :         5.36639E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90827E+00
+  5  5  # ( 1) Dispersion of radius:          1.90684E-01
+  6  6  # ( 1) Height aspect ratio :          1.00191E+00
+  7  7  # ( 2) Particle probability :         4.68199E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16912E+00
+  9  9  # ( 2) Dispersion of radius:          2.03990E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77279E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03316E+00
+ 
+==================================================
+Iteration # =                    17
+Cycle duration (sec) =  6.87500E-01
+Lambda =                1.56250E-05
+Best Chi2 so far =      8.77715E-04
+Current Chi2 =          8.77715E-04
+Chi2( 1) =              3.29054E-04
+Chi2( 2) =              5.48661E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.06775E-02
+  3  3  # ( 1) Particle probability :         5.34054E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90653E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70780E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16802E+00
+  9  9  # ( 2) Dispersion of radius:          2.03911E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77404E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    18
+Cycle duration (sec) =  6.25000E-02
+Lambda =                7.81250E-04
+Best Chi2 so far =      8.77715E-04
+Current Chi2 =          8.77955E-04
+Chi2( 1) =              3.29622E-04
+Chi2( 2) =              5.48333E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.06775E-02
+  3  3  # ( 1) Particle probability :         5.34054E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90653E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70780E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16802E+00
+  9  9  # ( 2) Dispersion of radius:          2.03911E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77404E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    19
+Cycle duration (sec) =  6.25000E-02
+Lambda =                3.90625E-02
+Best Chi2 so far =      8.77715E-04
+Current Chi2 =          8.77716E-04
+Chi2( 1) =              3.29088E-04
+Chi2( 2) =              5.48628E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.06775E-02
+  3  3  # ( 1) Particle probability :         5.34054E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90653E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70780E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16802E+00
+  9  9  # ( 2) Dispersion of radius:          2.03911E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77404E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    20
+Cycle duration (sec) =  6.25000E-02
+Lambda =                1.95312E+00
+Best Chi2 so far =      8.77715E-04
+Current Chi2 =          8.77720E-04
+Chi2( 1) =              3.29112E-04
+Chi2( 2) =              5.48607E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.06775E-02
+  3  3  # ( 1) Particle probability :         5.34054E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90653E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70780E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16802E+00
+  9  9  # ( 2) Dispersion of radius:          2.03911E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77404E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    21
+Cycle duration (sec) =  6.09375E-01
+Lambda =                1.95312E-01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29082E-04
+Chi2( 2) =              5.48630E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.08380E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90652E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70781E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16802E+00
+  9  9  # ( 2) Dispersion of radius:          2.03910E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    22
+Cycle duration (sec) =  6.25000E-02
+Lambda =                9.76562E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77713E-04
+Chi2( 1) =              3.29102E-04
+Chi2( 2) =              5.48612E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.08380E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90652E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70781E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16802E+00
+  9  9  # ( 2) Dispersion of radius:          2.03910E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    23
+Cycle duration (sec) =  5.93750E-01
+Lambda =                9.76562E-01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29085E-04
+Chi2( 2) =              5.48628E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.08526E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90652E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70781E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16802E+00
+  9  9  # ( 2) Dispersion of radius:          2.03909E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    24
+Cycle duration (sec) =  5.78125E-01
+Lambda =                9.76563E-02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29084E-04
+Chi2( 2) =              5.48628E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09185E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70782E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03909E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    25
+Cycle duration (sec) =  4.68750E-02
+Lambda =                4.88281E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77716E-04
+Chi2( 1) =              3.29113E-04
+Chi2( 2) =              5.48603E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09185E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70782E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03909E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    26
+Cycle duration (sec) =  6.56250E-01
+Lambda =                4.88281E-01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29084E-04
+Chi2( 2) =              5.48628E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09343E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70782E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03909E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    27
+Cycle duration (sec) =  6.25000E-02
+Lambda =                2.44141E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29097E-04
+Chi2( 2) =              5.48615E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09343E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70782E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03909E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    28
+Cycle duration (sec) =  5.78125E-01
+Lambda =                2.44141E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29084E-04
+Chi2( 2) =              5.48628E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09376E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70782E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03909E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    29
+Cycle duration (sec) =  5.62500E-01
+Lambda =                2.44141E-01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29086E-04
+Chi2( 2) =              5.48626E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09762E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    30
+Cycle duration (sec) =  6.25000E-02
+Lambda =                1.22070E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77713E-04
+Chi2( 1) =              3.29108E-04
+Chi2( 2) =              5.48606E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09762E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90800E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    31
+Cycle duration (sec) =  5.62500E-01
+Lambda =                1.22070E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29086E-04
+Chi2( 2) =              5.48625E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09844E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    32
+Cycle duration (sec) =  4.68750E-02
+Lambda =                6.10352E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29093E-04
+Chi2( 2) =              5.48619E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09844E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    33
+Cycle duration (sec) =  5.62500E-01
+Lambda =                6.10352E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29086E-04
+Chi2( 2) =              5.48625E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09860E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    34
+Cycle duration (sec) =  6.25000E-02
+Lambda =                3.05176E+02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29088E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09860E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    35
+Cycle duration (sec) =  5.62500E-01
+Lambda =                3.05176E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29086E-04
+Chi2( 2) =              5.48625E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09864E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77403E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    36
+Cycle duration (sec) =  5.62500E-01
+Lambda =                3.05176E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48625E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09897E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    37
+Cycle duration (sec) =  6.25000E-02
+Lambda =                1.52588E+02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29089E-04
+Chi2( 2) =              5.48622E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09897E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    38
+Cycle duration (sec) =  5.46875E-01
+Lambda =                1.52588E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48625E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09904E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    39
+Cycle duration (sec) =  5.62500E-01
+Lambda =                1.52588E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09972E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    40
+Cycle duration (sec) =  6.25000E-02
+Lambda =                7.62939E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29093E-04
+Chi2( 2) =              5.48619E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09972E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    41
+Cycle duration (sec) =  5.46875E-01
+Lambda =                7.62939E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09986E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    42
+Cycle duration (sec) =  6.25000E-02
+Lambda =                3.81470E+02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29088E-04
+Chi2( 2) =              5.48623E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09986E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    43
+Cycle duration (sec) =  5.62500E-01
+Lambda =                3.81470E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09988E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    44
+Cycle duration (sec) =  6.25000E-02
+Lambda =                1.90735E+03
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29088E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09988E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    45
+Cycle duration (sec) =  5.46875E-01
+Lambda =                1.90735E+02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09989E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    46
+Cycle duration (sec) =  5.62500E-01
+Lambda =                1.90735E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09994E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    47
+Cycle duration (sec) =  6.25000E-02
+Lambda =                9.53674E+02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29088E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09994E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    48
+Cycle duration (sec) =  5.62500E-01
+Lambda =                9.53674E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.09995E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    49
+Cycle duration (sec) =  5.62500E-01
+Lambda =                9.53674E+00
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.10006E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    50
+Cycle duration (sec) =  6.25000E-02
+Lambda =                4.76837E+02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29088E-04
+Chi2( 2) =              5.48623E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.10006E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    51
+Cycle duration (sec) =  5.46875E-01
+Lambda =                4.76837E+01
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.10009E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    52
+Cycle duration (sec) =  6.25000E-02
+Lambda =                2.38419E+03
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29088E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.10009E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    53
+Cycle duration (sec) =  5.78125E-01
+Lambda =                2.38419E+02
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.10009E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+Iteration # =                    54
+Cycle duration (sec) =  4.68750E-02
+Lambda =                1.19209E+04
+Best Chi2 so far =      8.77712E-04
+Current Chi2 =          8.77712E-04
+Chi2( 1) =              3.29087E-04
+Chi2( 2) =              5.48624E-04
+==================================================
+  1  1  # Global scale factor :               1.31159E+05
+  2  2  # Global shift factor :              -8.10009E-02
+  3  3  # ( 1) Particle probability :         5.34055E-01
+  4  4  # ( 1) Particle radius (nm) :         4.90801E+00
+  5  5  # ( 1) Dispersion of radius:          1.90651E-01
+  6  6  # ( 1) Height aspect ratio :          1.00193E+00
+  7  7  # ( 2) Particle probability :         4.70783E-01
+  8  8  # ( 2) Particle radius (nm) :         5.16801E+00
+  9  9  # ( 2) Dispersion of radius:          2.03908E-01
+ 10 10  # ( 2) Height aspect ratio :          9.77402E-01
+ 11 11  # D (nm) :                            1.49681E+01
+ 12 12  # w (nm) :                            3.03315E+00
+ 
+==================================================
+        Diverging Lambda ! STOP !
+ 
+==================================================
+ Chi2 and RBragg without an with excluded areas
+ Chi2 ( 1)     =                 3.291E-04   3.291E-04
+ RBragg( 1)    =                 7.239E-03   7.239E-03
+ RBraggexp( 1) =                 8.447E-02   8.447E-02
+ Goodness( 1)  =                 2.928E-01   2.928E-01
+ Chi2 ( 2)     =                 5.486E-04   5.486E-04
+ RBragg( 2)    =                 3.115E-03   3.115E-03
+ RBraggexp( 2) =                 7.901E-02   7.901E-02
+ Goodness( 2)  =                 1.985E-01   1.985E-01
+ Chi2 tot      =                 8.777E-04   8.777E-04
+ RBragg tot    =                 5.177E-03   5.177E-03
+ RBraggexp tot =                 8.174E-02   8.174E-02
+ Goodness tot  =                 2.456E-01   2.456E-01
+ 
+==================================================
+                   Covariance matrix
+                1             2             3             4             5             6             7             8             9            10            11            12
+     ========================================================================================================================================================================
+  1 = 1.45851E+09  -5.62650E+05  -4.91177E+06  -5.98602E+05  -1.18315E+05  -5.12253E+04   4.90625E+06  -2.10553E+06   4.71071E+04   3.18846E+05   1.70708E+04  -1.89710E+04
+  2 =-5.62650E+05   1.35479E+04  -1.03372E+04  -8.26045E+02  -2.58391E+02  -1.85314E+02   1.03180E+04  -5.07133E+03   1.55811E+02   7.79415E+02   7.55813E+01  -4.77083E+01
+  3 =-4.91177E+06  -1.03372E+04   6.95501E+04   8.22055E+03   1.69874E+03   7.59385E+02  -6.94766E+04   3.00314E+04  -7.11805E+02  -4.52186E+03  -1.41308E+02   1.72320E+02
+  4 =-5.98602E+05  -8.26045E+02   8.22055E+03   2.04599E+03   1.41877E+02  -1.25910E+02  -8.20903E+03   2.18786E+03   6.86761E+01  -2.74597E+02   7.92408E+00   1.35237E+01
+  5 =-1.18315E+05  -2.58391E+02   1.69874E+03   1.41877E+02   4.58732E+01   3.03771E+01  -1.69736E+03   8.02794E+02  -2.64691E+01  -1.23684E+02  -4.21152E+00   4.32468E+00
+  6 =-5.12253E+04  -1.85314E+02   7.59385E+02  -1.25910E+02   3.03771E+01   5.18406E+01  -7.59167E+02   6.01268E+02  -3.84471E+01  -1.01807E+02  -6.44580E+00   3.24993E+00
+  7 = 4.90625E+06   1.03180E+04  -6.94766E+04  -8.20903E+03  -1.69736E+03  -7.59167E+02   6.94034E+04  -3.00018E+04   7.11651E+02   4.51750E+03   1.41079E+02  -1.72010E+02
+  8 =-2.10553E+06  -5.07133E+03   3.00314E+04   2.18786E+03   8.02794E+02   6.01268E+02  -3.00018E+04   1.47280E+04  -4.98458E+02  -2.28848E+03  -9.64907E+01   8.46714E+01
+  9 = 4.71071E+04   1.55811E+02  -7.11805E+02   6.86761E+01  -2.64691E+01  -3.84471E+01   7.11651E+02  -4.98458E+02   2.95797E+01   8.27563E+01   4.74424E+00  -2.62412E+00
+ 10 = 3.18846E+05   7.79415E+02  -4.52186E+03  -2.74597E+02  -1.23684E+02  -1.01807E+02   4.51750E+03  -2.28848E+03   8.27563E+01   3.58390E+02   1.59093E+01  -1.31643E+01
+ 11 = 1.70708E+04   7.55813E+01  -1.41308E+02   7.92408E+00  -4.21152E+00  -6.44580E+00   1.41079E+02  -9.64907E+01   4.74424E+00   1.59093E+01   3.81700E+00   1.12717E-01
+ 12 =-1.89710E+04  -4.77083E+01   1.72320E+02   1.35237E+01   4.32468E+00   3.24993E+00  -1.72010E+02   8.46714E+01  -2.62412E+00  -1.31643E+01   1.12717E-01   1.44441E+00
+ 
+==================================================
+                   Correlation matrix
+                1             2             3             4             5             6             7             8             9            10            11            12
+     ========================================================================================================================================================================
+  1 = 1.00000E+00  -1.26575E-01  -4.87680E-01  -3.46523E-01  -4.57408E-01  -1.86292E-01   4.87646E-01  -4.54291E-01   2.26796E-01   4.41009E-01   2.28790E-01  -4.13324E-01
+  2 =-1.26575E-01   1.00000E+00  -3.36759E-01  -1.56898E-01  -3.27764E-01  -2.21125E-01   3.36486E-01  -3.59016E-01   2.46131E-01   3.53716E-01   3.32366E-01  -3.41046E-01
+  3 =-4.87680E-01  -3.36759E-01   1.00000E+00   6.89129E-01   9.51041E-01   3.99925E-01  -9.99999E-01   9.38328E-01  -4.96267E-01  -9.05712E-01  -2.74256E-01   5.43678E-01
+  4 =-3.46523E-01  -1.56898E-01   6.89129E-01   1.00000E+00   4.63107E-01  -3.86610E-01  -6.88890E-01   3.98562E-01   2.79162E-01  -3.20676E-01   8.96678E-02   2.48771E-01
+  5 =-4.57408E-01  -3.27764E-01   9.51041E-01   4.63107E-01   1.00000E+00   6.22920E-01  -9.51272E-01   9.76679E-01  -7.18558E-01  -9.64620E-01  -3.18272E-01   5.31286E-01
+  6 =-1.86292E-01  -2.21125E-01   3.99925E-01  -3.86610E-01   6.22920E-01   1.00000E+00  -4.00232E-01   6.88115E-01  -9.81820E-01  -7.46902E-01  -4.58227E-01   3.75572E-01
+  7 = 4.87646E-01   3.36486E-01  -9.99999E-01  -6.88890E-01  -9.51272E-01  -4.00232E-01   1.00000E+00  -9.38394E-01   4.96683E-01   9.05795E-01   2.74100E-01  -5.43273E-01
+  8 =-4.54291E-01  -3.59016E-01   9.38328E-01   3.98562E-01   9.76679E-01   6.88115E-01  -9.38394E-01   1.00000E+00  -7.55195E-01  -9.96084E-01  -4.06960E-01   5.80522E-01
+  9 = 2.26796E-01   2.46131E-01  -4.96267E-01   2.79162E-01  -7.18558E-01  -9.81820E-01   4.96683E-01  -7.55195E-01   1.00000E+00   8.03759E-01   4.46487E-01  -4.01459E-01
+ 10 = 4.41009E-01   3.53716E-01  -9.05712E-01  -3.20676E-01  -9.64620E-01  -7.46902E-01   9.05795E-01  -9.96084E-01   8.03759E-01   1.00000E+00   4.30141E-01  -5.78594E-01
+ 11 = 2.28790E-01   3.32366E-01  -2.74256E-01   8.96678E-02  -3.18272E-01  -4.58227E-01   2.74100E-01  -4.06960E-01   4.46487E-01   4.30141E-01   1.00000E+00   4.80046E-02
+ 12 =-4.13324E-01  -3.41046E-01   5.43678E-01   2.48771E-01   5.31286E-01   3.75572E-01  -5.43273E-01   5.80522E-01  -4.01459E-01  -5.78594E-01   4.80046E-02   1.00000E+00
+ 
+==================================================
+                   Curvature matrix
+                1             2             3             4             5             6             7             8             9            10            11            12
+     ========================================================================================================================================================================
+  1 = 2.04345E-09   3.12807E-07  -1.74141E-04  -2.20802E-05   1.45114E-04  -1.08968E-04  -1.73080E-04  -7.83117E-06   1.70882E-04  -1.01305E-04  -3.31781E-05   6.71408E-05
+  2 = 3.12807E-07   1.51916E-04  -1.75127E-02  -1.76407E-03   1.75987E-02  -6.45085E-03  -1.72394E-02   2.13083E-04   2.03750E-02  -3.90062E-03  -7.44516E-03   1.33184E-02
+  3 =-1.74141E-04  -1.75127E-02   8.50911E+01  -8.68790E-01  -5.87786E+01   3.60535E+00   8.17104E+01  -6.11448E+00  -6.90883E+01  -6.58713E-03   6.00846E+00  -1.53212E+01
+  4 =-2.20802E-05  -1.76407E-03  -8.68790E-01   3.99663E+00   9.71856E-01   1.82002E+01   2.14110E-01   3.43555E+00  -2.00191E-01   1.68903E+01   2.74310E-01  -3.22337E-01
+  5 = 1.45114E-04   1.75987E-02  -5.87786E+01   9.71856E-01   5.55298E+01  -3.78569E+00  -5.56574E+01   5.26827E+00   6.01982E+01  -1.00852E+00  -4.81599E+00   1.16743E+01
+  6 =-1.08968E-04  -6.45085E-03   3.60535E+00   1.82002E+01  -3.78569E+00   8.99628E+01   7.99267E+00   1.54275E+01  -6.36582E+00   8.29230E+01   9.66397E-01  -1.67584E+00
+  7 =-1.73080E-04  -1.72394E-02   8.17104E+01   2.14110E-01  -5.56574E+01   7.99267E+00   7.87768E+01  -4.94345E+00  -6.60385E+01   4.26628E+00   5.86581E+00  -1.48439E+01
+  8 =-7.83117E-06   2.13083E-04  -6.11448E+00   3.43555E+00   5.26827E+00   1.54275E+01  -4.94345E+00   3.50040E+00   5.13924E+00   1.52049E+01  -1.81742E-01   7.51794E-01
+  9 = 1.70882E-04   2.03750E-02  -6.90883E+01  -2.00191E-01   6.01982E+01  -6.36582E+00  -6.60385E+01   5.13924E+00   6.94954E+01  -3.13390E+00  -5.75797E+00   1.37655E+01
+ 10 =-1.01305E-04  -3.90062E-03  -6.58713E-03   1.68903E+01  -1.00852E+00   8.29230E+01   4.26628E+00   1.52049E+01  -3.13390E+00   8.01309E+01   7.66223E-01  -1.06971E+00
+ 11 =-3.31781E-05  -7.44516E-03   6.00846E+00   2.74310E-01  -4.81599E+00   9.66397E-01   5.86581E+00  -1.81742E-01  -5.75797E+00   7.66223E-01   1.37389E+00  -2.21258E+00
+ 12 = 6.71408E-05   1.33184E-02  -1.53212E+01  -3.22337E-01   1.16743E+01  -1.67584E+00  -1.48439E+01   7.51794E-01   1.37655E+01  -1.06971E+00  -2.21258E+00   5.34809E+00
+ 
+==================================================
+Absolute-relative errors in the fitted parameters
+Error( 1) =  3.81904E+04   2.91176E-01
+Error( 2) =  1.16395E+02   1.43697E+03
+Error( 3) =  2.63724E+02   4.93813E+02
+Error( 4) =  4.52326E+01   9.21608E+00
+Error( 5) =  6.77298E+00   3.55255E+01
+Error( 6) =  7.20004E+00   7.18616E+00
+Error( 7) =  2.63445E+02   5.59590E+02
+Error( 8) =  1.21359E+02   2.34827E+01
+Error( 9) =  5.43873E+00   2.66724E+01
+Error(10) =  1.89312E+01   1.93689E+01
+Error(11) =  1.95372E+00   1.30525E-01
+Error(12) =  1.20184E+00   3.96233E-01
+==================================================
+ 
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.mat b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.mat
new file mode 100644
index 0000000..82d730d
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.mat
@@ -0,0 +1,31 @@
+#================================================================================================
+#                                 MATRIX OF CONSTRAINTS
+#================================================================================================
+ 
+          Shift                   1              2              3              4              5              6              7              8              9             10             11             12
+    0.00000E+00         1    1.00000E+00
+    0.00000E+00         2    0.00000E+00    1.00000E+00
+    0.00000E+00         3    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00         4    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00         5    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00         6    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00         7    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00         8    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00         9    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00        10    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00        11    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+    0.00000E+00        12    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00    1.00000E+00
+ 
+#================================================================================================
+  1  1  # Scale factor :                      1.00000E+05
+  2  2  # Shift factor :                      1.00000E+01
+  3  3  # ( 1) Particle probability :           4.00000E-01
+  4  4  # ( 1) Particle radius (nm) :           4.00000E+00
+  5  5  # ( 1) Dispersion in particle radius :  2.00000E-01
+  6  6  # ( 1) Height aspect ratio :          8.00000E-01
+  7  7  # ( 2) Particle probability :           6.00000E-01
+  8  8  # ( 2) Particle radius (nm) :           4.00000E+00
+  9  9  # ( 2) Dispersion in particle radius :  2.00000E-01
+ 10 10  # ( 2) Height aspect ratio :          8.00000E-01
+ 11 11  # D (nm) :                            1.20000E+01
+ 12 12  # w (nm) :                            6.00000E+00
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.out b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.out
new file mode 100644
index 0000000..5a7664b
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints.out
@@ -0,0 +1,319 @@
+#================================================================================================
+#                                     GISAXS OUTPUT FILE
+#================================================================================================
+# Date and time :                                   Mon Dec 03 15:03:14 2012
+# Input filename :                                  C:\Program Files\IsGISAXS\examples\ex-12\lin\fit-constraints.inp
+# Fit filename :                                    C:\Program Files\IsGISAXS\examples\ex-12\lin\fit-constraints.fit
+# Fit with constraints :                             F
+# Matrix of constraints filename :                  C:\Program Files\IsGISAXS\examples\ex-12\lin\fit-constraints.mat
+# Data filename :                                   C:\Program Files\IsGISAXS\examples\ex-12\lin\fit-constraints.dat
+# Base filename :                                   fit-example
+# Type of calculation :                             fit
+# Ewald construction :                               T
+# Framework :                                       DWBA                
+# Treatment of the diffuse scattering :             DA        
+# Multilayer wavefields (Parratt-like) :                0
+# Required number of slices  :                         25
+# Actual number of slices in z  :                       2
+# Type of chi2 :                                        0
+# Error bar type :                                      1
+# Number of cuts :                                      2
+# Number of points per cut :                          100
+# Number of fitted parameters :                        12
+# Number of independent parameters :                   12
+# Systematic error :                                    8.00000E-02
+# Global scale and shift factors :                      1.31159E+05   -8.10009E-02
+# Offset factors on alphaf and 2theta (deg) :                    0.00000E+00    0.00000E+00
+#=====================================Beam and substrate parameters==============================
+# Incident and scattered beam polarizations :       ss
+# Distribution of wavelength :                      none           
+# Wl0 - sigWl/Wl - FWHM-Wl (nm) :                       1.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Wl (nm), width and # of points :            1.00000E-01    1.00000E-01    0.00000E+00    1
+# Distribution of incident angle :                  none           
+# Alphai - sigAlphai - FWHM-Ai (deg) :                  2.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Alphai (deg), width and # of points :       2.00000E-01    2.00000E-01    0.00000E+00    1
+# Distribution of 2Theta incident angle :           none           
+# 2Thetai - sig2Thetai - FWHM (deg) :                   0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of 2Thetai (deg), width and # of points:       0.00000E+00    0.00000E+00    0.00000E+00    1
+# Substrate index of refraction (delta,beta):           6.00000E-06    2.00000E-08
+# Particle index of refraction (delta,beta):            6.00000E-04    2.00000E-08
+# Substrate roughness (nm) :                            0.00000E+00
+# Layer thickness (nm) :                                0.00000E+00
+# Layer index of refraction (delta,beta) :              1.00000E-05    5.00000E-07
+# Depth for the buried particle layer (nm):             0.00000E+00
+# Shell index of refraction (delta,beta) :              8.00000E-04    2.00000E-08
+#========================================Particle parameters=====================================
+# Number of different particle type :                  2
+#-------------------------------------------------------------------------------------------------
+# Angle between base and facets (deg) :                 5.47300E+01
+# Ratio between height for a cubooctahedron :           1.00000E+00
+# Flattening parameter of spheroid :                    1.00000E+00
+# Truncation parameters for a facetted sphere :         8.00000E-01    8.00000E-01
+# Particle shell thickness dR-dH-dW(nnm) :              0.00000E+00    0.00000E+00    0.00000E+00
+# H uncoupled :                                         T
+# W uncoupled :                                         F
+# Particle type - Probability :                      cylinder           5.34055E-01
+# Distribution of radius R :                        gaussian       
+# R0 - sigR/R0 - FWHM (nm) :                            4.90801E+00    1.90651E-01    2.20345E+00
+# Ranges of R (nm), width and # of points :             5.01110E-01    9.31490E+00    4.00000E+00   20
+# Distribution of height H :                        none           
+# H0/R0 - sigH/H0 - FWHM - rho_H :                      1.00193E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of H/H0, width and  # of points :              1.00193E+00    1.00193E+00    0.00000E+00    1
+# Distribution of height W :                        none           
+# W0/R0 - sigW/W0 - FWHM - rho_W :                      1.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of W/W0, width and  # of points :              1.00000E+00    1.00000E+00    0.00000E+00    1
+# Distribution of orientations Z :                  none           
+# Z0 - sigZ - FWHM (deg) :                              0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of Z (deg), width and # of points :            0.00000E+00    0.00000E+00    0.00000E+00    1
+#-------------------------------------------------------------------------------------------------
+# Angle between base and facets (deg) :                 5.47300E+01
+# Ratio between height for a cubooctahedron :           1.00000E+00
+# Flattening parameter of spheroid :                    1.00000E+00
+# Truncation parameters for a facetted sphere :         8.00000E-01    8.00000E-01
+# Particle shell thickness dR-dH-dW(nnm) :              0.00000E+00    0.00000E+00    0.00000E+00
+# H uncoupled :                                         T
+# W uncoupled :                                         F
+# Particle type - Probability :                      cylinder           4.70783E-01
+# Distribution of radius R :                        gaussian       
+# R0 - sigR/R0 - FWHM (nm) :                            5.16801E+00    2.03908E-01    2.48151E+00
+# Ranges of R (nm), width and # of points :             2.04991E-01    1.01310E+01    4.00000E+00   20
+# Distribution of height H :                        none           
+# H0/R0 - sigH/H0 - FWHM - rho_H :                      9.77402E-01    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of H/H0, width and  # of points :              9.77402E-01    9.77402E-01    0.00000E+00    1
+# Distribution of height W :                        none           
+# W0/R0 - sigW/W0 - FWHM - rho_W :                      1.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of W/W0, width and  # of points :              1.00000E+00    1.00000E+00    0.00000E+00    1
+# Distribution of orientations Z :                  none           
+# Z0 - sigZ - FWHM (deg) :                              0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of Z (deg), width and # of points :            0.00000E+00    0.00000E+00    0.00000E+00    1
+#======================================Particle position parameters===============================
+# Distribution of particles :                       1DDL                     
+# Density of particles (nm-2) - L(nm) :                 4.46340E-03    1.49681E+01
+# Size-distance coupling parameter :                    0.00000E+00
+# Cut-off value for finite size effects :               1.00000E+07
+# Correlation function parameters (D,w,D1) :            1.49681E+01    3.03315E+00    2.50000E+01
+# Hard core parameters (sig(nm), eta) :                 3.00000E-01    3.15499E-04
+# Statistical distribution  :                       gau
+# Pseudo Voigt parameter :                              5.00000E-01
+#=========================================Derived parameters======================================
+# Mean wavelength (nm) :                                1.00000E-01
+# Mean incident angle Alphai (deg) :                    2.00000E-01
+# Mean incident angle 2Thetai (deg) :                   0.00000E+00
+# Mean radius (nm) :                                    5.05416E+00
+# Mean gyration radius (nm) :                           5.05416E+00
+# Mean height (nm) :                                    5.00424E+00
+# Mean width (nm) :                                     5.05416E+00
+# Mean height aspect ratio :                            1.03962E+00
+# Mean width aspect ratio :                             1.00484E+00
+# Mean volumes <V>, Sqrt(<V^2>) (nm^3) :                4.13794E+02    4.43267E+02
+# Mean particle orientationn (deg) :                    0.00000E+00
+# Coverage :                                            3.70589E-01
+# Mean thickness (nm) :                                 1.84693E+00
+# Magic size coupling parameter :                       2.76452E+00
+ 
+#==========================================Data file============================================
+#       Sin(twotheta)         Sin(alphaf)            Qx(nm-1)            Qy(nm-1)            Qz(nm-1)              GISAXS            Data2fit           Error bar        Iobs - Icalc              Fitted
+# Cut # =   1       Weight =  5.00000E-01        Scale =  1.00000E+00        Shift =  0.00000E+00   DeltaOmega =  0.00000E+00  DeltaAlphai =  0.00000E+00
+# Excluded area :    F
+          8.74674E-05         3.49065E-03        -2.40037E-07         5.49571E-03         4.38648E-01         2.32790E+04         2.31997E+04         1.86222E+03        -7.93024E+01                   1
+          4.37337E-04         3.49065E-03        -6.00838E-06         2.74785E-02         4.38648E-01         2.30705E+04         2.30475E+04         1.85004E+03        -2.30224E+01                   1
+          7.87207E-04         3.49065E-03        -1.94679E-05         4.94614E-02         4.38648E-01         2.27143E+04         2.27009E+04         1.82231E+03        -1.33961E+01                   1
+          1.13708E-03         3.49065E-03        -4.06187E-05         7.14444E-02         4.38648E-01         2.21811E+04         2.21797E+04         1.78062E+03        -1.36760E+00                   1
+          1.48695E-03         3.49065E-03        -6.94606E-05         9.34273E-02         4.38648E-01         2.15024E+04         2.15147E+04         1.72741E+03         1.23358E+01                   1
+          1.83682E-03         3.49065E-03        -1.05994E-04         1.15410E-01         4.38648E-01         2.07221E+04         2.07483E+04         1.66610E+03         2.62238E+01                   1
+          2.18669E-03         3.49065E-03        -1.50218E-04         1.37393E-01         4.38648E-01         1.98961E+04         1.99342E+04         1.60097E+03         3.81497E+01                   1
+          2.53656E-03         3.49065E-03        -2.02133E-04         1.59376E-01         4.38648E-01         1.90931E+04         1.91387E+04         1.53733E+03         4.55984E+01                   1
+          2.88643E-03         3.49065E-03        -2.61740E-04         1.81359E-01         4.38648E-01         1.83977E+04         1.84438E+04         1.48174E+03         4.60764E+01                   1
+          3.23629E-03         3.49065E-03        -3.29036E-04         2.03341E-01         4.38648E-01         1.79159E+04         1.79529E+04         1.44247E+03         3.70471E+01                   1
+          3.58616E-03         3.49065E-03        -4.04024E-04         2.25324E-01         4.38648E-01         1.77862E+04         1.78024E+04         1.43043E+03         1.62131E+01                   1
+          3.93603E-03         3.49065E-03        -4.86705E-04         2.47307E-01         4.38648E-01         1.82022E+04         1.81839E+04         1.46095E+03        -1.82878E+01                   1
+          4.28590E-03         3.49065E-03        -5.77076E-04         2.69289E-01         4.38648E-01         1.94542E+04         1.93874E+04         1.55723E+03        -6.68283E+01                   1
+          4.63577E-03         3.49065E-03        -6.75139E-04         2.91272E-01         4.38648E-01         2.20113E+04         2.18860E+04         1.75712E+03        -1.25266E+02                   1
+          4.98564E-03         3.49065E-03        -7.80893E-04         3.13255E-01         4.38648E-01         2.66753E+04         2.65000E+04         2.12624E+03        -1.75326E+02                   1
+          5.33551E-03         3.49065E-03        -8.94339E-04         3.35238E-01         4.38648E-01         3.48308E+04         3.46759E+04         2.78031E+03        -1.54948E+02                   1
+          5.68538E-03         3.49065E-03        -1.01548E-03         3.57221E-01         4.38648E-01         4.85141E+04         4.86348E+04         3.89703E+03         1.20716E+02                   1
+          6.03525E-03         3.49065E-03        -1.14430E-03         3.79204E-01         4.38648E-01         6.81121E+04         6.90981E+04         5.53409E+03         9.86026E+02                   1
+          6.38512E-03         3.49065E-03        -1.28082E-03         4.01186E-01         4.38648E-01         8.22802E+04         8.42249E+04         6.74424E+03         1.94469E+03                   1
+          6.73499E-03         3.49065E-03        -1.42504E-03         4.23169E-01         4.38648E-01         7.12116E+04         7.24457E+04         5.80190E+03         1.23408E+03                   1
+          7.08486E-03         3.49065E-03        -1.57694E-03         4.45152E-01         4.38648E-01         4.69798E+04         4.72017E+04         3.78238E+03         2.21868E+02                   1
+          7.43473E-03         3.49065E-03        -1.73654E-03         4.67135E-01         4.38648E-01         2.87131E+04         2.86339E+04         2.29695E+03        -7.92388E+01                   1
+          7.78460E-03         3.49065E-03        -1.90382E-03         4.89118E-01         4.38648E-01         1.80084E+04         1.79114E+04         1.43915E+03        -9.70096E+01                   1
+          8.13447E-03         3.49065E-03        -2.07880E-03         5.11101E-01         4.38648E-01         1.19221E+04         1.18554E+04         9.54662E+02        -6.66648E+01                   1
+          8.48434E-03         3.49065E-03        -2.26147E-03         5.33084E-01         4.38648E-01         8.36250E+03         8.32149E+03         6.71940E+02        -4.10052E+01                   1
+          8.92168E-03         3.49065E-03        -2.50063E-03         5.60562E-01         4.38648E-01         5.79750E+03         5.77565E+03         4.68260E+02        -2.18544E+01                   1
+          9.27154E-03         3.49065E-03        -2.70060E-03         5.82544E-01         4.38648E-01         4.56900E+03         4.55600E+03         3.70677E+02        -1.30013E+01                   1
+          9.62141E-03         3.49065E-03        -2.90827E-03         6.04527E-01         4.38648E-01         3.75013E+03         3.74328E+03         3.05649E+02        -6.85285E+00                   1
+          9.97128E-03         3.49065E-03        -3.12363E-03         6.26510E-01         4.38648E-01         3.17762E+03         3.17543E+03         2.60209E+02        -2.18765E+00                   1
+          1.03211E-02         3.49065E-03        -3.34665E-03         6.48490E-01         4.38648E-01         2.75675E+03         2.75792E+03         2.26797E+02         1.17137E+00                   1
+          1.06710E-02         3.49065E-03        -3.57742E-03         6.70475E-01         4.38648E-01         2.43421E+03         2.43720E+03         2.01129E+02         2.99081E+00                   1
+          1.10209E-02         3.49065E-03        -3.81588E-03         6.92459E-01         4.38648E-01         2.18339E+03         2.18617E+03         1.81036E+02         2.78221E+00                   1
+          1.13708E-02         3.49065E-03        -4.06203E-03         7.14444E-01         4.38648E-01         1.99368E+03         1.99434E+03         1.65679E+02         6.58001E-01                   1
+          1.17206E-02         3.49065E-03        -4.31580E-03         7.36423E-01         4.38648E-01         1.86165E+03         1.85902E+03         1.54846E+02        -2.62892E+00                   1
+          1.20705E-02         3.49065E-03        -4.57734E-03         7.58407E-01         4.38648E-01         1.78281E+03         1.77709E+03         1.48286E+02        -5.71699E+00                   1
+          1.24204E-02         3.49065E-03        -4.84658E-03         7.80392E-01         4.38648E-01         1.74674E+03         1.73923E+03         1.45254E+02        -7.50660E+00                   1
+          1.27702E-02         3.49065E-03        -5.12342E-03         8.02370E-01         4.38648E-01         1.73690E+03         1.72931E+03         1.44460E+02        -7.59333E+00                   1
+          1.31201E-02         3.49065E-03        -5.40804E-03         8.24355E-01         4.38648E-01         1.73512E+03         1.72879E+03         1.44418E+02        -6.33089E+00                   1
+          1.34700E-02         3.49065E-03        -5.70036E-03         8.46340E-01         4.38648E-01         1.72679E+03         1.72234E+03         1.43902E+02        -4.45395E+00                   1
+          1.38198E-02         3.49065E-03        -6.00028E-03         8.68318E-01         4.38648E-01         1.70367E+03         1.70107E+03         1.42198E+02        -2.59608E+00                   1
+          1.41697E-02         3.49065E-03        -6.30798E-03         8.90303E-01         4.38648E-01         1.66347E+03         1.66234E+03         1.39097E+02        -1.12678E+00                   1
+          1.45196E-02         3.49065E-03        -6.62338E-03         9.12288E-01         4.38648E-01         1.60793E+03         1.60777E+03         1.34727E+02        -1.62919E-01                   1
+          1.48694E-02         3.49065E-03        -6.94637E-03         9.34266E-01         4.38648E-01         1.54063E+03         1.54095E+03         1.29375E+02         3.15852E-01                   1
+          1.52193E-02         3.49065E-03        -7.27716E-03         9.56251E-01         4.38648E-01         1.46535E+03         1.46584E+03         1.23359E+02         4.91515E-01                   1
+          1.55692E-02         3.49065E-03        -7.61564E-03         9.78236E-01         4.38648E-01         1.38538E+03         1.38585E+03         1.16951E+02         4.71591E-01                   1
+          1.59190E-02         3.49065E-03        -7.96171E-03         1.00021E+00         4.38648E-01         1.30326E+03         1.30359E+03         1.10360E+02         3.26916E-01                   1
+          1.62689E-02         3.49065E-03        -8.31558E-03         1.02220E+00         4.38648E-01         1.22079E+03         1.22097E+03         1.03739E+02         1.80367E-01                   1
+          1.66188E-02         3.49065E-03        -8.67714E-03         1.04418E+00         4.38648E-01         1.13935E+03         1.13937E+03         9.71989E+01         2.10238E-02                   1
+          1.69687E-02         3.49065E-03        -9.04640E-03         1.06617E+00         4.38648E-01         1.06005E+03         1.05993E+03         9.08296E+01        -1.19363E-01                   1
+          1.73185E-02         3.49065E-03        -9.42324E-03         1.08815E+00         4.38648E-01         9.83892E+02         9.83608E+02         8.47084E+01        -2.83982E-01                   1
+          1.76684E-02         3.49065E-03        -9.80789E-03         1.11013E+00         4.38648E-01         9.11723E+02         9.11317E+02         7.89082E+01        -4.06078E-01                   1
+          1.80183E-02         3.49065E-03        -1.02002E-02         1.13212E+00         4.38648E-01         8.44332E+02         8.43839E+02         7.34918E+01        -4.93360E-01                   1
+          1.83681E-02         3.49065E-03        -1.06002E-02         1.15409E+00         4.38648E-01         7.82318E+02         7.81776E+02         6.85076E+01        -5.42232E-01                   1
+          1.87180E-02         3.49065E-03        -1.10079E-02         1.17608E+00         4.38648E-01         7.25985E+02         7.25488E+02         6.39845E+01        -4.97499E-01                   1
+          1.90679E-02         3.49065E-03        -1.14233E-02         1.19806E+00         4.38648E-01         6.75429E+02         6.75061E+02         5.99299E+01        -3.68332E-01                   1
+          1.94178E-02         3.49065E-03        -1.18464E-02         1.22005E+00         4.38648E-01         6.30479E+02         6.30320E+02         5.63299E+01        -1.58862E-01                   1
+          1.97676E-02         3.49065E-03        -1.22771E-02         1.24203E+00         4.38648E-01         5.90773E+02         5.90877E+02         5.31540E+01         1.03838E-01                   1
+          2.01175E-02         3.49065E-03        -1.27157E-02         1.26401E+00         4.38648E-01         5.55780E+02         5.56197E+02         5.03594E+01         4.16953E-01                   1
+          2.04674E-02         3.49065E-03        -1.31619E-02         1.28600E+00         4.38648E-01         5.24928E+02         5.25667E+02         4.78973E+01         7.38961E-01                   1
+          2.08172E-02         3.49065E-03        -1.36157E-02         1.30798E+00         4.38648E-01         4.97622E+02         4.98658E+02         4.57174E+01         1.03562E+00                   1
+          2.11671E-02         3.49065E-03        -1.40773E-02         1.32996E+00         4.38648E-01         4.73269E+02         4.74566E+02         4.37713E+01         1.29718E+00                   1
+          2.15170E-02         3.49065E-03        -1.45466E-02         1.35194E+00         4.38648E-01         4.51348E+02         4.52848E+02         4.20155E+01         1.50007E+00                   1
+          2.18669E-02         3.49065E-03        -1.50236E-02         1.37393E+00         4.38648E-01         4.31399E+02         4.33033E+02         4.04122E+01         1.63440E+00                   1
+          2.22167E-02         3.49065E-03        -1.55081E-02         1.39591E+00         4.38648E-01         4.13038E+02         4.14731E+02         3.89300E+01         1.69339E+00                   1
+          2.25666E-02         3.49065E-03        -1.60005E-02         1.41789E+00         4.38648E-01         3.95939E+02         3.97631E+02         3.75438E+01         1.69238E+00                   1
+          2.29165E-02         3.49065E-03        -1.65006E-02         1.43988E+00         4.38648E-01         3.79859E+02         3.81492E+02         3.62343E+01         1.63303E+00                   1
+          2.32663E-02         3.49065E-03        -1.70083E-02         1.46186E+00         4.38648E-01         3.64615E+02         3.66139E+02         3.49873E+01         1.52367E+00                   1
+          2.36162E-02         3.49065E-03        -1.75238E-02         1.48384E+00         4.38648E-01         3.50063E+02         3.51449E+02         3.37928E+01         1.38569E+00                   1
+          2.39661E-02         3.49065E-03        -1.80470E-02         1.50583E+00         4.38648E-01         3.36114E+02         3.37342E+02         3.26444E+01         1.22761E+00                   1
+          2.43160E-02         3.49065E-03        -1.85779E-02         1.52781E+00         4.38648E-01         3.22709E+02         3.23771E+02         3.15384E+01         1.06188E+00                   1
+          2.46658E-02         3.49065E-03        -1.91163E-02         1.54979E+00         4.38648E-01         3.09817E+02         3.10714E+02         3.04728E+01         8.97273E-01                   1
+          2.50157E-02         3.49065E-03        -1.96626E-02         1.57177E+00         4.38648E-01         2.97413E+02         2.98160E+02         2.94468E+01         7.47175E-01                   1
+          2.53656E-02         3.49065E-03        -2.02166E-02         1.59376E+00         4.38648E-01         2.85495E+02         2.86112E+02         2.84608E+01         6.16927E-01                   1
+          2.57155E-02         3.49065E-03        -2.07783E-02         1.61574E+00         4.38648E-01         2.74063E+02         2.74572E+02         2.75148E+01         5.08938E-01                   1
+          2.60653E-02         3.49065E-03        -2.13475E-02         1.63772E+00         4.38648E-01         2.63121E+02         2.63544E+02         2.66094E+01         4.22830E-01                   1
+          2.65027E-02         3.49065E-03        -2.20701E-02         1.66520E+00         4.38648E-01         2.50124E+02         2.50476E+02         2.55343E+01         3.51847E-01                   1
+          2.68525E-02         3.49065E-03        -2.26566E-02         1.68718E+00         4.38648E-01         2.40274E+02         2.40591E+02         2.47194E+01         3.16733E-01                   1
+          2.72024E-02         3.49065E-03        -2.32510E-02         1.70917E+00         4.38648E-01         2.30898E+02         2.31200E+02         2.39437E+01         3.02267E-01                   1
+          2.75523E-02         3.49065E-03        -2.38531E-02         1.73115E+00         4.38648E-01         2.21986E+02         2.22288E+02         2.32061E+01         3.01851E-01                   1
+          2.79022E-02         3.49065E-03        -2.44629E-02         1.75314E+00         4.38648E-01         2.13525E+02         2.13837E+02         2.25052E+01         3.12435E-01                   1
+          2.82520E-02         3.49065E-03        -2.50803E-02         1.77511E+00         4.38648E-01         2.05497E+02         2.05824E+02         2.18392E+01         3.26813E-01                   1
+          2.86019E-02         3.49065E-03        -2.57055E-02         1.79710E+00         4.38648E-01         1.97879E+02         1.98227E+02         2.12063E+01         3.47928E-01                   1
+          2.89518E-02         3.49065E-03        -2.63384E-02         1.81908E+00         4.38648E-01         1.90651E+02         1.91020E+02         2.06045E+01         3.69333E-01                   1
+          2.93016E-02         3.49065E-03        -2.69788E-02         1.84106E+00         4.38648E-01         1.83791E+02         1.84179E+02         2.00320E+01         3.87817E-01                   1
+          2.96515E-02         3.49065E-03        -2.76271E-02         1.86305E+00         4.38648E-01         1.77274E+02         1.77678E+02         1.94865E+01         4.04113E-01                   1
+          3.00014E-02         3.49065E-03        -2.82832E-02         1.88503E+00         4.38648E-01         1.71078E+02         1.71496E+02         1.89664E+01         4.17580E-01                   1
+          3.03513E-02         3.49065E-03        -2.89469E-02         1.90702E+00         4.38648E-01         1.65183E+02         1.65610E+02         1.84700E+01         4.26705E-01                   1
+          3.07011E-02         3.49065E-03        -2.96181E-02         1.92900E+00         4.38648E-01         1.59570E+02         1.59999E+02         1.79955E+01         4.29208E-01                   1
+          3.10510E-02         3.49065E-03        -3.02972E-02         1.95098E+00         4.38648E-01         1.54216E+02         1.54646E+02         1.75415E+01         4.30185E-01                   1
+          3.14009E-02         3.49065E-03        -3.09841E-02         1.97296E+00         4.38648E-01         1.49106E+02         1.49532E+02         1.71066E+01         4.26385E-01                   1
+          3.17507E-02         3.49065E-03        -3.16784E-02         1.99494E+00         4.38648E-01         1.44225E+02         1.44644E+02         1.66896E+01         4.19328E-01                   1
+          3.21006E-02         3.49065E-03        -3.23806E-02         2.01693E+00         4.38648E-01         1.39556E+02         1.39967E+02         1.62895E+01         4.11218E-01                   1
+          3.24505E-02         3.49065E-03        -3.30906E-02         2.03891E+00         4.38648E-01         1.35087E+02         1.35490E+02         1.59053E+01         4.02670E-01                   1
+          3.28003E-02         3.49065E-03        -3.38080E-02         2.06089E+00         4.38648E-01         1.30809E+02         1.31200E+02         1.55360E+01         3.91274E-01                   1
+          3.31502E-02         3.49065E-03        -3.45334E-02         2.08288E+00         4.38648E-01         1.26707E+02         1.27088E+02         1.51808E+01         3.81142E-01                   1
+          3.35001E-02         3.49065E-03        -3.52664E-02         2.10486E+00         4.38648E-01         1.22773E+02         1.23144E+02         1.48390E+01         3.70705E-01                   1
+          3.38499E-02         3.49065E-03        -3.60070E-02         2.12684E+00         4.38648E-01         1.19000E+02         1.19361E+02         1.45101E+01         3.60737E-01                   1
+          3.41998E-02         3.49065E-03        -3.67554E-02         2.14882E+00         4.38648E-01         1.15378E+02         1.15729E+02         1.41931E+01         3.51491E-01                   1
+          3.45496E-02         3.49065E-03        -3.75114E-02         2.17080E+00         4.38648E-01         1.11900E+02         1.12243E+02         1.38879E+01         3.43368E-01                   1
+          3.48995E-02         3.49065E-03        -3.82752E-02         2.19279E+00         4.38648E-01         1.08558E+02         1.08893E+02         1.35935E+01         3.35301E-01                   1
+# Cut # =   2       Weight =  5.00000E-01        Scale =  1.00000E+00        Shift =  0.00000E+00   DeltaOmega =  0.00000E+00  DeltaAlphai =  0.00000E+00
+# Excluded area :    F
+          6.42277E-03         8.74674E-05        -9.13430E-04         4.03555E-01         2.24820E-01         2.02525E+02         2.01859E+02         2.15091E+01        -6.66359E-01                   1
+          6.42277E-03         4.37337E-04        -9.19198E-04         4.03555E-01         2.46803E-01         5.01680E+03         4.99882E+03         4.06108E+02        -1.79781E+01                   1
+          6.42277E-03         7.87207E-04        -9.32657E-04         4.03554E-01         2.68786E-01         1.58985E+04         1.58446E+04         1.27380E+03        -5.38976E+01                   1
+          6.42277E-03         1.13708E-03        -9.53808E-04         4.03554E-01         2.90769E-01         3.20185E+04         3.19198E+04         2.55983E+03        -9.86650E+01                   1
+          6.42277E-03         1.48695E-03        -9.82649E-04         4.03554E-01         3.12752E-01         5.20975E+04         5.19576E+04         4.16285E+03        -1.39918E+02                   1
+          6.42277E-03         1.83682E-03        -1.01918E-03         4.03554E-01         3.34735E-01         7.44239E+04         7.42573E+04         5.94683E+03        -1.66612E+02                   1
+          6.42277E-03         2.18669E-03        -1.06341E-03         4.03554E-01         3.56718E-01         9.68475E+04         9.64091E+04         7.71898E+03        -4.38370E+02                   1
+          6.42277E-03         2.53656E-03        -1.11532E-03         4.03553E-01         3.78701E-01         1.16692E+05         1.16247E+05         9.30601E+03        -4.44875E+02                   1
+          6.42277E-03         2.88643E-03        -1.17493E-03         4.03553E-01         4.00684E-01         1.30359E+05         1.29939E+05         1.04014E+04        -4.20103E+02                   1
+          6.42277E-03         3.23629E-03        -1.24222E-03         4.03552E-01         4.22666E-01         1.31159E+05         1.30889E+05         1.04774E+04        -2.70073E+02                   1
+          6.42277E-03         3.58616E-03        -1.31721E-03         4.03552E-01         4.44649E-01         6.45814E+04         6.49184E+04         5.19972E+03         3.36993E+02                   1
+          6.42277E-03         3.93603E-03        -1.39989E-03         4.03551E-01         4.66632E-01         4.56319E+04         4.55662E+04         3.65154E+03        -6.57319E+01                   1
+          6.42277E-03         4.28590E-03        -1.49026E-03         4.03551E-01         4.88615E-01         3.83036E+04         3.83133E+04         3.07131E+03         9.73817E+00                   1
+          6.42277E-03         4.63577E-03        -1.58832E-03         4.03550E-01         5.10598E-01         3.39985E+04         3.39826E+04         2.72485E+03        -1.58768E+01                   1
+          6.42277E-03         4.98564E-03        -1.69407E-03         4.03550E-01         5.32581E-01         3.10208E+04         3.10328E+04         2.48887E+03         1.20221E+01                   1
+          6.42277E-03         5.33551E-03        -1.80752E-03         4.03549E-01         5.54564E-01         2.87527E+04         2.87781E+04         2.30849E+03         2.53580E+01                   1
+          6.42277E-03         5.68538E-03        -1.92865E-03         4.03548E-01         5.76547E-01         2.69078E+04         2.69354E+04         2.16107E+03         2.75778E+01                   1
+          6.42277E-03         6.03525E-03        -2.05748E-03         4.03547E-01         5.98530E-01         2.53335E+04         2.53699E+04         2.03583E+03         3.64262E+01                   1
+          6.42277E-03         6.38512E-03        -2.19400E-03         4.03546E-01         6.20513E-01         2.39409E+04         2.39830E+04         1.92488E+03         4.21096E+01                   1
+          6.42277E-03         6.73499E-03        -2.33821E-03         4.03545E-01         6.42496E-01         2.26751E+04         2.27214E+04         1.82395E+03         4.63230E+01                   1
+          6.42277E-03         7.08486E-03        -2.49011E-03         4.03544E-01         6.64479E-01         2.15005E+04         2.15560E+04         1.73072E+03         5.55405E+01                   1
+          6.42277E-03         7.43473E-03        -2.64970E-03         4.03543E-01         6.86462E-01         2.03933E+04         2.04522E+04         1.64241E+03         5.88761E+01                   1
+          6.42277E-03         7.78460E-03        -2.81698E-03         4.03542E-01         7.08445E-01         1.93376E+04         1.93991E+04         1.55817E+03         6.15399E+01                   1
+          6.42277E-03         8.13447E-03        -2.99196E-03         4.03541E-01         7.30428E-01         1.83221E+04         1.83857E+04         1.47709E+03         6.35683E+01                   1
+          6.42277E-03         8.48434E-03        -3.17463E-03         4.03540E-01         7.52411E-01         1.73395E+04         1.74046E+04         1.39860E+03         6.51003E+01                   1
+          6.42277E-03         8.92168E-03        -3.41378E-03         4.03538E-01         7.79890E-01         1.61498E+04         1.62155E+04         1.30348E+03         6.57100E+01                   1
+          6.42277E-03         9.27154E-03        -3.61375E-03         4.03537E-01         8.01872E-01         1.52252E+04         1.52915E+04         1.22955E+03         6.63467E+01                   1
+          6.42277E-03         9.62141E-03        -3.82142E-03         4.03536E-01         8.23855E-01         1.43227E+04         1.43892E+04         1.15737E+03         6.65184E+01                   1
+          6.42277E-03         9.97128E-03        -4.03678E-03         4.03534E-01         8.45838E-01         1.34416E+04         1.35079E+04         1.08686E+03         6.62650E+01                   1
+          6.42277E-03         1.03211E-02        -4.25979E-03         4.03533E-01         8.67818E-01         1.25820E+04         1.26474E+04         1.01802E+03         6.53517E+01                   1
+          6.42277E-03         1.06710E-02        -4.49056E-03         4.03532E-01         8.89803E-01         1.17440E+04         1.18042E+04         9.50565E+02         6.01768E+01                   1
+          6.42277E-03         1.10209E-02        -4.72901E-03         4.03530E-01         9.11788E-01         1.09285E+04         1.09876E+04         8.85236E+02         5.90539E+01                   1
+          6.42277E-03         1.13708E-02        -4.97516E-03         4.03528E-01         9.33773E-01         1.01367E+04         1.01941E+04         8.21754E+02         5.74357E+01                   1
+          6.42277E-03         1.17206E-02        -5.22893E-03         4.03527E-01         9.55751E-01         9.36981E+03         9.42227E+03         7.60006E+02         5.24575E+01                   1
+          6.42277E-03         1.20705E-02        -5.49047E-03         4.03525E-01         9.77736E-01         8.62887E+03         8.67925E+03         7.00562E+02         5.03800E+01                   1
+          6.42277E-03         1.24204E-02        -5.75970E-03         4.03523E-01         9.99721E-01         7.91542E+03         7.96333E+03         6.43286E+02         4.79145E+01                   1
+          6.42277E-03         1.27702E-02        -6.03654E-03         4.03522E-01         1.02170E+00         7.23098E+03         7.27425E+03         5.88157E+02         4.32672E+01                   1
+          6.42277E-03         1.31201E-02        -6.32115E-03         4.03520E-01         1.04368E+00         6.57647E+03         6.61696E+03         5.35570E+02         4.04947E+01                   1
+          6.42277E-03         1.34700E-02        -6.61346E-03         4.03518E-01         1.06567E+00         5.95325E+03         5.98958E+03         4.85376E+02         3.63256E+01                   1
+          6.42277E-03         1.38198E-02        -6.91338E-03         4.03516E-01         1.08765E+00         5.36258E+03         5.39482E+03         4.37791E+02         3.22390E+01                   1
+          6.42277E-03         1.41697E-02        -7.22108E-03         4.03514E-01         1.10963E+00         4.80502E+03         4.83436E+03         3.92949E+02         2.93363E+01                   1
+          6.42277E-03         1.45196E-02        -7.53647E-03         4.03512E-01         1.13162E+00         4.28150E+03         4.30722E+03         3.50772E+02         2.57178E+01                   1
+          6.42277E-03         1.48694E-02        -7.85946E-03         4.03510E-01         1.15360E+00         3.79271E+03         3.81490E+03         3.11379E+02         2.21892E+01                   1
+          6.42277E-03         1.52193E-02        -8.19024E-03         4.03508E-01         1.17558E+00         3.33873E+03         3.35775E+03         2.74799E+02         1.90185E+01                   1
+          6.42277E-03         1.55692E-02        -8.52871E-03         4.03506E-01         1.19757E+00         2.91986E+03         2.93626E+03         2.41070E+02         1.63950E+01                   1
+          6.42277E-03         1.59190E-02        -8.87478E-03         4.03503E-01         1.21954E+00         2.53616E+03         2.54965E+03         2.10129E+02         1.34877E+01                   1
+          6.42277E-03         1.62689E-02        -9.22864E-03         4.03501E-01         1.24153E+00         2.18714E+03         2.19806E+03         1.81988E+02         1.09190E+01                   1
+          6.42277E-03         1.66188E-02        -9.59020E-03         4.03499E-01         1.26351E+00         1.87245E+03         1.88104E+03         1.56609E+02         8.59408E+00                   1
+          6.42277E-03         1.69687E-02        -9.95945E-03         4.03496E-01         1.28550E+00         1.59141E+03         1.59790E+03         1.33936E+02         6.49326E+00                   1
+          6.42277E-03         1.73185E-02        -1.03363E-02         4.03494E-01         1.30748E+00         1.34323E+03         1.34778E+03         1.13901E+02         4.55245E+00                   1
+          6.42277E-03         1.76684E-02        -1.07209E-02         4.03492E-01         1.32946E+00         1.12672E+03         1.12964E+03         9.64188E+01         2.91618E+00                   1
+          6.42277E-03         1.80183E-02        -1.11133E-02         4.03489E-01         1.35145E+00         9.40761E+02         9.42257E+02         8.13909E+01         1.49617E+00                   1
+          6.42277E-03         1.83681E-02        -1.15132E-02         4.03486E-01         1.37343E+00         7.84017E+02         7.84265E+02         6.87075E+01         2.48293E-01                   1
+          6.42277E-03         1.87180E-02        -1.19209E-02         4.03484E-01         1.39541E+00         6.54904E+02         6.54154E+02         5.82480E+01        -7.49599E-01                   1
+          6.42277E-03         1.90679E-02        -1.23363E-02         4.03481E-01         1.41740E+00         5.51854E+02         5.50259E+02         4.98807E+01        -1.59455E+00                   1
+          6.42277E-03         1.94178E-02        -1.27595E-02         4.03478E-01         1.43938E+00         4.73150E+02         4.70931E+02         4.34776E+01        -2.21878E+00                   1
+          6.42277E-03         1.97676E-02        -1.31902E-02         4.03476E-01         1.46136E+00         4.17007E+02         4.14315E+02         3.88963E+01        -2.69247E+00                   1
+          6.42277E-03         2.01175E-02        -1.36287E-02         4.03473E-01         1.48334E+00         3.81535E+02         3.78508E+02         3.59920E+01        -3.02724E+00                   1
+          6.42277E-03         2.04674E-02        -1.40749E-02         4.03470E-01         1.50533E+00         3.64850E+02         3.61651E+02         3.46225E+01        -3.19862E+00                   1
+          6.42277E-03         2.08172E-02        -1.45287E-02         4.03467E-01         1.52731E+00         3.65021E+02         3.61769E+02         3.46321E+01        -3.25241E+00                   1
+          6.42277E-03         2.11671E-02        -1.49903E-02         4.03464E-01         1.54929E+00         3.80118E+02         3.76888E+02         3.58605E+01        -3.23007E+00                   1
+          6.42277E-03         2.15170E-02        -1.54596E-02         4.03461E-01         1.57128E+00         4.08220E+02         4.05121E+02         3.81511E+01        -3.09890E+00                   1
+          6.42277E-03         2.18669E-02        -1.59366E-02         4.03458E-01         1.59326E+00         4.47432E+02         4.44509E+02         4.13409E+01        -2.92346E+00                   1
+          6.42277E-03         2.22167E-02        -1.64211E-02         4.03455E-01         1.61524E+00         4.95889E+02         4.93209E+02         4.52774E+01        -2.68001E+00                   1
+          6.42277E-03         2.25666E-02        -1.69135E-02         4.03452E-01         1.63723E+00         5.51823E+02         5.49429E+02         4.98138E+01        -2.39374E+00                   1
+          6.42277E-03         2.29165E-02        -1.74136E-02         4.03449E-01         1.65921E+00         6.13496E+02         6.11391E+02         5.48061E+01        -2.10453E+00                   1
+          6.42277E-03         2.32663E-02        -1.79212E-02         4.03445E-01         1.68119E+00         6.79243E+02         6.77455E+02         6.01224E+01        -1.78840E+00                   1
+          6.42277E-03         2.36162E-02        -1.84367E-02         4.03442E-01         1.70317E+00         7.47550E+02         7.46074E+02         6.56390E+01        -1.47624E+00                   1
+          6.42277E-03         2.39661E-02        -1.89599E-02         4.03439E-01         1.72516E+00         8.16943E+02         8.15746E+02         7.12360E+01        -1.19672E+00                   1
+          6.42277E-03         2.43160E-02        -1.94908E-02         4.03435E-01         1.74714E+00         8.86072E+02         8.85128E+02         7.68064E+01        -9.43884E-01                   1
+          6.42277E-03         2.46658E-02        -2.00292E-02         4.03432E-01         1.76912E+00         9.53681E+02         9.52975E+02         8.22509E+01        -7.06394E-01                   1
+          6.42277E-03         2.50157E-02        -2.05755E-02         4.03428E-01         1.79111E+00         1.01869E+03         1.01816E+03         8.74798E+01        -5.28657E-01                   1
+          6.42277E-03         2.53656E-02        -2.11295E-02         4.03425E-01         1.81309E+00         1.08007E+03         1.07967E+03         9.24125E+01        -4.01226E-01                   1
+          6.42277E-03         2.57155E-02        -2.16911E-02         4.03421E-01         1.83508E+00         1.13695E+03         1.13662E+03         9.69784E+01        -3.26543E-01                   1
+          6.42277E-03         2.60653E-02        -2.22604E-02         4.03417E-01         1.85706E+00         1.18854E+03         1.18824E+03         1.01116E+02        -2.98821E-01                   1
+          6.42277E-03         2.65027E-02        -2.29829E-02         4.03413E-01         1.88454E+00         1.24468E+03         1.24432E+03         1.05611E+02        -3.55544E-01                   1
+          6.42277E-03         2.68525E-02        -2.35695E-02         4.03409E-01         1.90652E+00         1.28225E+03         1.28178E+03         1.08613E+02        -4.71165E-01                   1
+          6.42277E-03         2.72024E-02        -2.41639E-02         4.03405E-01         1.92850E+00         1.31291E+03         1.31226E+03         1.11055E+02        -6.51918E-01                   1
+          6.42277E-03         2.75523E-02        -2.47660E-02         4.03401E-01         1.95049E+00         1.33638E+03         1.33545E+03         1.12913E+02        -9.27661E-01                   1
+          6.42277E-03         2.79022E-02        -2.53758E-02         4.03397E-01         1.97247E+00         1.35249E+03         1.35126E+03         1.14180E+02        -1.22664E+00                   1
+          6.42277E-03         2.82520E-02        -2.59931E-02         4.03393E-01         1.99445E+00         1.36118E+03         1.35960E+03         1.14848E+02        -1.57724E+00                   1
+          6.42277E-03         2.86019E-02        -2.66183E-02         4.03389E-01         2.01643E+00         1.36249E+03         1.36047E+03         1.14918E+02        -2.02015E+00                   1
+          6.42277E-03         2.89518E-02        -2.72512E-02         4.03385E-01         2.03842E+00         1.35655E+03         1.35408E+03         1.14406E+02        -2.46721E+00                   1
+          6.42277E-03         2.93016E-02        -2.78916E-02         4.03381E-01         2.06040E+00         1.34356E+03         1.34061E+03         1.13327E+02        -2.95162E+00                   1
+          6.42277E-03         2.96515E-02        -2.85399E-02         4.03377E-01         2.08238E+00         1.32381E+03         1.32030E+03         1.11699E+02        -3.51053E+00                   1
+          6.42277E-03         3.00014E-02        -2.91959E-02         4.03373E-01         2.10437E+00         1.29765E+03         1.29360E+03         1.09560E+02        -4.05016E+00                   1
+          6.42277E-03         3.03513E-02        -2.98597E-02         4.03369E-01         2.12635E+00         1.26550E+03         1.26084E+03         1.06935E+02        -4.65540E+00                   1
+          6.42277E-03         3.07011E-02        -3.05309E-02         4.03364E-01         2.14833E+00         1.22783E+03         1.22259E+03         1.03869E+02        -5.23644E+00                   1
+          6.42277E-03         3.10510E-02        -3.12100E-02         4.03360E-01         2.17032E+00         1.18514E+03         1.17929E+03         1.00399E+02        -5.84634E+00                   1
+          6.42277E-03         3.14009E-02        -3.18968E-02         4.03356E-01         2.19230E+00         1.13799E+03         1.13154E+03         9.65712E+01        -6.44803E+00                   1
+          6.42277E-03         3.17507E-02        -3.25911E-02         4.03351E-01         2.21428E+00         1.08698E+03         1.07994E+03         9.24341E+01        -7.04001E+00                   1
+          6.42277E-03         3.21006E-02        -3.32934E-02         4.03347E-01         2.23626E+00         1.03269E+03         1.02513E+03         8.80388E+01        -7.55919E+00                   1
+          6.42277E-03         3.24505E-02        -3.40033E-02         4.03342E-01         2.25825E+00         9.75751E+02         9.67674E+02         8.34301E+01        -8.07700E+00                   1
+          6.42277E-03         3.28003E-02        -3.47207E-02         4.03337E-01         2.28023E+00         9.16812E+02         9.08246E+02         7.86618E+01        -8.56571E+00                   1
+          6.42277E-03         3.31502E-02        -3.54461E-02         4.03333E-01         2.30221E+00         8.56467E+02         8.47480E+02         7.37842E+01        -8.98724E+00                   1
+          6.42277E-03         3.35001E-02        -3.61791E-02         4.03328E-01         2.32420E+00         7.95358E+02         7.86008E+02         6.88475E+01        -9.34966E+00                   1
+          6.42277E-03         3.38499E-02        -3.69196E-02         4.03323E-01         2.34618E+00         7.34111E+02         7.24448E+02         6.39009E+01        -9.66301E+00                   1
+          6.42277E-03         3.41998E-02        -3.76681E-02         4.03318E-01         2.36816E+00         6.73284E+02         6.63396E+02         5.89915E+01        -9.88757E+00                   1
+          6.42277E-03         3.45496E-02        -3.84240E-02         4.03314E-01         2.39014E+00         6.13476E+02         6.03423E+02         5.41644E+01        -1.00533E+01                   1
+          6.42277E-03         3.48995E-02        -3.91879E-02         4.03309E-01         2.41212E+00         5.55191E+02         5.45070E+02         4.94623E+01        -1.01211E+01                   1
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints_optimal.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints_optimal.ima.gz
new file mode 100644
index 0000000..c9c70ab
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints_optimal.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints_optimal.inp b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints_optimal.inp
new file mode 100755
index 0000000..b99b6de
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-12/isgi_fitconstraints_optimal.inp
@@ -0,0 +1,82 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_fitconstraints_optimal
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         DA               0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2       0   2        100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+2
+# Particle type,     Probability
+cylinder                5.34055E-01 
+cylinder                4.70783E-01
+# Geometrical parameters : Base angle (deg),  Height ratio,  Flattening,  FS-radii/R
+	                       54.73               1.		       1.         0.8    0.8
+	                       54.73              1.		       1.         0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           4.90801E+00         gaussian          1.90651E-01     0.1         11       20   4
+                           5.16801E+00     gaussian           2.03908E-01       0.1         11       20   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1.00193E+00         none            0.1       0.1         11       25   2    0
+                           9.77402E-01        none            0.1       0.1         11       25   2    0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+                            2          none                0.4        1         300       15   2   0 
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          1DDL 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               1.49681E+01                  3.03315E+00     gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1. 
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-13/README b/Tests/ReferenceData/IsGISAXS/ex-13/README
new file mode 100644
index 0000000..9e8b011
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-13/README
@@ -0,0 +1,17 @@
+IsGISAXS ex-13 example
+Simulated annealing fitting: cylinders with size distribution and radial paracrystal inderference function.
+(Same model as in ex-5 example)
+
+Directory content:
+
+isgi_simulated_annealing.inp
+IsGISAXS file with model description. Modified to have 100x100 points 2D output data.
+
+isgi_simulated_annealing.dat
+IsGISAXS data files with points to fit
+
+isgi_simulated_annealing.fit
+IsGISAXS fit settings
+
+isgi_simulated_annealing.out
+IsGISAXS fit output
diff --git a/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.dat b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.dat
new file mode 100644
index 0000000..32a93e1
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.dat
@@ -0,0 +1,819 @@
+################################################################################################     
+# Parallel cut at alphaf=0.2deg
+# fit-example
+# Weight,   Scale factor,   Shift factor
+  1.        1.   F			0.   F	      
+            0  1e5          0   1e5
+             F  F           F  F
+# DeltaOmega(deg), DeltaOmega(deg)
+	 0.                0 
+# Fitted, Sin(2Thetaf), Sin(Alphaf), Intensity, Error bars
+T	8.74674e-05	0.00349065	23199.7
+T	0.000174935	0.00349065	23180.5
+T	0.000262402	0.00349065	23148.7
+T	0.00034987	0.00349065	23104.3
+T	0.000437337	0.00349065	23047.5
+T	0.000524805	0.00349065	22978.6
+T	0.000612272	0.00349065	22897.6
+T	0.000699739	0.00349065	22804.9
+T	0.000787207	0.00349065	22700.9
+T	0.000874674	0.00349065	22586
+T	0.000962142	0.00349065	22460.5
+T	0.00104961	0.00349065	22324.9
+T	0.00113708	0.00349065	22179.7
+T	0.00122454	0.00349065	22025.5
+T	0.00131201	0.00349065	21862.8
+T	0.00139948	0.00349065	21692.3
+T	0.00148695	0.00349065	21514.7
+T	0.00157441	0.00349065	21330.8
+T	0.00166188	0.00349065	21141.2
+T	0.00174935	0.00349065	20946.7
+T	0.00183682	0.00349065	20748.3
+T	0.00192428	0.00349065	20546.9
+T	0.00201175	0.00349065	20343.4
+T	0.00209922	0.00349065	20138.8
+T	0.00218669	0.00349065	19934.2
+T	0.00227415	0.00349065	19730.7
+T	0.00236162	0.00349065	19529.4
+T	0.00244909	0.00349065	19331.6
+T	0.00253656	0.00349065	19138.7
+T	0.00262402	0.00349065	18951.9
+T	0.00271149	0.00349065	18772.8
+T	0.00279896	0.00349065	18602.8
+T	0.00288643	0.00349065	18443.8
+T	0.00297389	0.00349065	18297.3
+T	0.00306136	0.00349065	18165.3
+T	0.00314883	0.00349065	18049.7
+T	0.00323629	0.00349065	17952.9
+T	0.00332376	0.00349065	17877.1
+T	0.00341123	0.00349065	17824.8
+T	0.0034987	0.00349065	17798.9
+T	0.00358616	0.00349065	17802.4
+T	0.00367363	0.00349065	17838.7
+T	0.0037611	0.00349065	17911.6
+T	0.00384857	0.00349065	18025.1
+T	0.00393603	0.00349065	18183.9
+T	0.0040235	0.00349065	18393.3
+T	0.00411097	0.00349065	18659.1
+T	0.00419844	0.00349065	18987.9
+T	0.0042859	0.00349065	19387.4
+T	0.00437337	0.00349065	19866.3
+T	0.00446084	0.00349065	20434.4
+T	0.00454831	0.00349065	21103.3
+T	0.00463577	0.00349065	21886
+T	0.00472324	0.00349065	22798
+T	0.00481071	0.00349065	23856.8
+T	0.00489818	0.00349065	25082.9
+T	0.00498564	0.00349065	26500
+T	0.00507311	0.00349065	28135
+T	0.00516058	0.00349065	30018.9
+T	0.00524805	0.00349065	32186.4
+T	0.00533551	0.00349065	34675.9
+T	0.00542298	0.00349065	37527.9
+T	0.00551045	0.00349065	40783
+T	0.00559792	0.00349065	44477.4
+T	0.00568538	0.00349065	48634.8
+T	0.00577285	0.00349065	53254.5
+T	0.00586032	0.00349065	58293.5
+T	0.00594779	0.00349065	63642.3
+T	0.00603525	0.00349065	69098.1
+T	0.00612272	0.00349065	74343.8
+T	0.00621019	0.00349065	78947.2
+T	0.00629766	0.00349065	82403
+T	0.00638512	0.00349065	84224.9
+T	0.00647259	0.00349065	84075.3
+T	0.00656006	0.00349065	81877.3
+T	0.00664753	0.00349065	77850.5
+T	0.00673499	0.00349065	72445.7
+T	0.00682246	0.00349065	66214.3
+T	0.00690993	0.00349065	59678.8
+T	0.0069974	0.00349065	53250
+T	0.00708486	0.00349065	47201.7
+T	0.00717233	0.00349065	41684.8
+T	0.0072598	0.00349065	36758.1
+T	0.00734727	0.00349065	32419.8
+T	0.00743473	0.00349065	28633.9
+T	0.0075222	0.00349065	25347.5
+T	0.00760967	0.00349065	22502.3
+T	0.00769714	0.00349065	20041.2
+T	0.0077846	0.00349065	17911.4
+T	0.00787207	0.00349065	16066.1
+T	0.00795954	0.00349065	14464.2
+T	0.00804701	0.00349065	13070.7
+T	0.00813447	0.00349065	11855.4
+T	0.00822194	0.00349065	10792.8
+T	0.00830941	0.00349065	9861.35
+T	0.00839687	0.00349065	9042.77
+T	0.00848434	0.00349065	8321.49
+T	0.00857181	0.00349065	7684.34
+T	0.00865927	0.00349065	7120.09
+T	0.00874674	0.00349065	6619.17
+T	0.00883421	0.00349065	6173.37
+T	0.00892168	0.00349065	5775.65
+T	0.00900914	0.00349065	5419.95
+T	0.00909661	0.00349065	5101.03
+T	0.00918408	0.00349065	4814.36
+T	0.00927154	0.00349065	4556
+T	0.00935901	0.00349065	4322.51
+T	0.00944648	0.00349065	4110.92
+T	0.00953394	0.00349065	3918.6
+T	0.00962141	0.00349065	3743.28
+T	0.00970888	0.00349065	3582.94
+T	0.00979635	0.00349065	3435.84
+T	0.00988381	0.00349065	3300.45
+T	0.00997128	0.00349065	3175.43
+T	0.0100587	0.00349065	3059.61
+T	0.0101462	0.00349065	2951.98
+T	0.0102337	0.00349065	2851.67
+T	0.0103211	0.00349065	2757.92
+T	0.0104086	0.00349065	2670.09
+T	0.0104961	0.00349065	2587.64
+T	0.0105835	0.00349065	2510.13
+T	0.010671	0.00349065	2437.2
+T	0.0107585	0.00349065	2368.53
+T	0.0108459	0.00349065	2303.91
+T	0.0109334	0.00349065	2243.17
+T	0.0110209	0.00349065	2186.17
+T	0.0111084	0.00349065	2132.84
+T	0.0111958	0.00349065	2083.11
+T	0.0112833	0.00349065	2036.95
+T	0.0113708	0.00349065	1994.34
+T	0.0114582	0.00349065	1955.26
+T	0.0115457	0.00349065	1919.71
+T	0.0116332	0.00349065	1887.64
+T	0.0117206	0.00349065	1859.02
+T	0.0118081	0.00349065	1833.76
+T	0.0118956	0.00349065	1811.78
+T	0.011983	0.00349065	1792.95
+T	0.0120705	0.00349065	1777.09
+T	0.012158	0.00349065	1764.03
+T	0.0122454	0.00349065	1753.54
+T	0.0123329	0.00349065	1745.36
+T	0.0124204	0.00349065	1739.23
+T	0.0125078	0.00349065	1734.86
+T	0.0125953	0.00349065	1731.95
+T	0.0126828	0.00349065	1730.2
+T	0.0127702	0.00349065	1729.31
+T	0.0128577	0.00349065	1728.99
+T	0.0129452	0.00349065	1728.96
+T	0.0130326	0.00349065	1728.97
+T	0.0131201	0.00349065	1728.79
+T	0.0132076	0.00349065	1728.2
+T	0.013295	0.00349065	1727.02
+T	0.0133825	0.00349065	1725.11
+T	0.01347	0.00349065	1722.34
+T	0.0135574	0.00349065	1718.61
+T	0.0136449	0.00349065	1713.85
+T	0.0137324	0.00349065	1708.01
+T	0.0138198	0.00349065	1701.07
+T	0.0139073	0.00349065	1693.02
+T	0.0139948	0.00349065	1683.86
+T	0.0140822	0.00349065	1673.62
+T	0.0141697	0.00349065	1662.34
+T	0.0142572	0.00349065	1650.06
+T	0.0143446	0.00349065	1636.83
+T	0.0144321	0.00349065	1622.71
+T	0.0145196	0.00349065	1607.77
+T	0.014607	0.00349065	1592.05
+T	0.0146945	0.00349065	1575.64
+T	0.014782	0.00349065	1558.58
+T	0.0148694	0.00349065	1540.95
+T	0.0149569	0.00349065	1522.81
+T	0.0150444	0.00349065	1504.2
+T	0.0151318	0.00349065	1485.2
+T	0.0152193	0.00349065	1465.84
+T	0.0153068	0.00349065	1446.19
+T	0.0153942	0.00349065	1426.27
+T	0.0154817	0.00349065	1406.15
+T	0.0155692	0.00349065	1385.85
+T	0.0156566	0.00349065	1365.41
+T	0.0157441	0.00349065	1344.87
+T	0.0158316	0.00349065	1324.25
+T	0.015919	0.00349065	1303.59
+T	0.0160065	0.00349065	1282.91
+T	0.016094	0.00349065	1262.23
+T	0.0161814	0.00349065	1241.57
+T	0.0162689	0.00349065	1220.97
+T	0.0163564	0.00349065	1200.42
+T	0.0164438	0.00349065	1179.97
+T	0.0165313	0.00349065	1159.61
+T	0.0166188	0.00349065	1139.37
+T	0.0167063	0.00349065	1119.27
+T	0.0167937	0.00349065	1099.32
+T	0.0168812	0.00349065	1079.53
+T	0.0169687	0.00349065	1059.93
+T	0.0170561	0.00349065	1040.52
+T	0.0171436	0.00349065	1021.32
+T	0.0172311	0.00349065	1002.34
+T	0.0173185	0.00349065	983.608
+T	0.017406	0.00349065	965.125
+T	0.0174935	0.00349065	946.907
+T	0.0175809	0.00349065	928.968
+T	0.0176684	0.00349065	911.317
+T	0.0177559	0.00349065	893.97
+T	0.0178433	0.00349065	876.935
+T	0.0179308	0.00349065	860.221
+T	0.0180183	0.00349065	843.839
+T	0.0181057	0.00349065	827.797
+T	0.0181932	0.00349065	812.102
+T	0.0182807	0.00349065	796.76
+T	0.0183681	0.00349065	781.776
+T	0.0184556	0.00349065	767.154
+T	0.0185431	0.00349065	752.898
+T	0.0186305	0.00349065	739.009
+T	0.018718	0.00349065	725.488
+T	0.0188055	0.00349065	712.335
+T	0.018893	0.00349065	699.547
+T	0.0189804	0.00349065	687.124
+T	0.0190679	0.00349065	675.061
+T	0.0191554	0.00349065	663.355
+T	0.0192428	0.00349065	652
+T	0.0193303	0.00349065	640.99
+T	0.0194178	0.00349065	630.32
+T	0.0195052	0.00349065	619.981
+T	0.0195927	0.00349065	609.967
+T	0.0196802	0.00349065	600.268
+T	0.0197676	0.00349065	590.877
+T	0.0198551	0.00349065	581.783
+T	0.0199426	0.00349065	572.979
+T	0.02003	0.00349065	564.453
+T	0.0201175	0.00349065	556.197
+T	0.020205	0.00349065	548.2
+T	0.0202924	0.00349065	540.453
+T	0.0203799	0.00349065	532.945
+T	0.0204674	0.00349065	525.667
+T	0.0205548	0.00349065	518.609
+T	0.0206423	0.00349065	511.761
+T	0.0207298	0.00349065	505.114
+T	0.0208172	0.00349065	498.658
+T	0.0209047	0.00349065	492.384
+T	0.0209922	0.00349065	486.283
+T	0.0210797	0.00349065	480.346
+T	0.0211671	0.00349065	474.566
+T	0.0212546	0.00349065	468.934
+T	0.0213421	0.00349065	463.441
+T	0.0214295	0.00349065	458.082
+T	0.021517	0.00349065	452.848
+T	0.0216045	0.00349065	447.732
+T	0.0216919	0.00349065	442.729
+T	0.0217794	0.00349065	437.831
+T	0.0218669	0.00349065	433.033
+T	0.0219543	0.00349065	428.329
+T	0.0220418	0.00349065	423.714
+T	0.0221293	0.00349065	419.183
+T	0.0222167	0.00349065	414.731
+T	0.0223042	0.00349065	410.354
+T	0.0223917	0.00349065	406.047
+T	0.0224791	0.00349065	401.807
+T	0.0225666	0.00349065	397.631
+T	0.0226541	0.00349065	393.514
+T	0.0227415	0.00349065	389.454
+T	0.022829	0.00349065	385.447
+T	0.0229165	0.00349065	381.492
+T	0.0230039	0.00349065	377.586
+T	0.0230914	0.00349065	373.727
+T	0.0231789	0.00349065	369.912
+T	0.0232663	0.00349065	366.139
+T	0.0233538	0.00349065	362.409
+T	0.0234413	0.00349065	358.717
+T	0.0235288	0.00349065	355.065
+T	0.0236162	0.00349065	351.449
+T	0.0237037	0.00349065	347.87
+T	0.0237912	0.00349065	344.327
+T	0.0238786	0.00349065	340.817
+T	0.0239661	0.00349065	337.342
+T	0.0240536	0.00349065	333.9
+T	0.024141	0.00349065	330.492
+T	0.0242285	0.00349065	327.115
+T	0.024316	0.00349065	323.771
+T	0.0244034	0.00349065	320.459
+T	0.0244909	0.00349065	317.179
+T	0.0245784	0.00349065	313.931
+T	0.0246658	0.00349065	310.714
+T	0.0247533	0.00349065	307.528
+T	0.0248408	0.00349065	304.374
+T	0.0249282	0.00349065	301.251
+T	0.0250157	0.00349065	298.16
+T	0.0251032	0.00349065	295.101
+T	0.0251906	0.00349065	292.073
+T	0.0252781	0.00349065	289.077
+T	0.0253656	0.00349065	286.112
+T	0.025453	0.00349065	283.179
+T	0.0255405	0.00349065	280.278
+T	0.025628	0.00349065	277.409
+T	0.0257155	0.00349065	274.572
+T	0.0258029	0.00349065	271.767
+T	0.0258904	0.00349065	268.994
+T	0.0259779	0.00349065	266.253
+T	0.0260653	0.00349065	263.544
+T	0.0261528	0.00349065	260.866
+T	0.0262403	0.00349065	258.221
+T	0.0263277	0.00349065	255.608
+T	0.0264152	0.00349065	253.026
+T	0.0265027	0.00349065	250.476
+T	0.0265901	0.00349065	247.958
+T	0.0266776	0.00349065	245.471
+T	0.0267651	0.00349065	243.015
+T	0.0268525	0.00349065	240.591
+T	0.02694	0.00349065	238.197
+T	0.0270275	0.00349065	235.834
+T	0.0271149	0.00349065	233.502
+T	0.0272024	0.00349065	231.2
+T	0.0272899	0.00349065	228.927
+T	0.0273773	0.00349065	226.685
+T	0.0274648	0.00349065	224.472
+T	0.0275523	0.00349065	222.288
+T	0.0276397	0.00349065	220.133
+T	0.0277272	0.00349065	218.006
+T	0.0278147	0.00349065	215.907
+T	0.0279022	0.00349065	213.837
+T	0.0279896	0.00349065	211.793
+T	0.0280771	0.00349065	209.777
+T	0.0281646	0.00349065	207.787
+T	0.028252	0.00349065	205.824
+T	0.0283395	0.00349065	203.887
+T	0.028427	0.00349065	201.975
+T	0.0285144	0.00349065	200.089
+T	0.0286019	0.00349065	198.227
+T	0.0286894	0.00349065	196.389
+T	0.0287768	0.00349065	194.576
+T	0.0288643	0.00349065	192.786
+T	0.0289518	0.00349065	191.02
+T	0.0290392	0.00349065	189.276
+T	0.0291267	0.00349065	187.555
+T	0.0292142	0.00349065	185.856
+T	0.0293016	0.00349065	184.179
+T	0.0293891	0.00349065	182.522
+T	0.0294766	0.00349065	180.887
+T	0.029564	0.00349065	179.273
+T	0.0296515	0.00349065	177.678
+T	0.029739	0.00349065	176.104
+T	0.0298264	0.00349065	174.549
+T	0.0299139	0.00349065	173.013
+T	0.0300014	0.00349065	171.496
+T	0.0300888	0.00349065	169.998
+T	0.0301763	0.00349065	168.517
+T	0.0302638	0.00349065	167.055
+T	0.0303513	0.00349065	165.61
+T	0.0304387	0.00349065	164.182
+T	0.0305262	0.00349065	162.771
+T	0.0306137	0.00349065	161.377
+T	0.0307011	0.00349065	159.999
+T	0.0307886	0.00349065	158.637
+T	0.0308761	0.00349065	157.291
+T	0.0309635	0.00349065	155.961
+T	0.031051	0.00349065	154.646
+T	0.0311385	0.00349065	153.345
+T	0.0312259	0.00349065	152.06
+T	0.0313134	0.00349065	150.789
+T	0.0314009	0.00349065	149.532
+T	0.0314883	0.00349065	148.29
+T	0.0315758	0.00349065	147.061
+T	0.0316633	0.00349065	145.846
+T	0.0317507	0.00349065	144.644
+T	0.0318382	0.00349065	143.456
+T	0.0319257	0.00349065	142.28
+T	0.0320131	0.00349065	141.117
+T	0.0321006	0.00349065	139.967
+T	0.0321881	0.00349065	138.83
+T	0.0322755	0.00349065	137.704
+T	0.032363	0.00349065	136.591
+T	0.0324505	0.00349065	135.49
+T	0.0325379	0.00349065	134.4
+T	0.0326254	0.00349065	133.322
+T	0.0327129	0.00349065	132.255
+T	0.0328003	0.00349065	131.2
+T	0.0328878	0.00349065	130.156
+T	0.0329753	0.00349065	129.122
+T	0.0330627	0.00349065	128.1
+T	0.0331502	0.00349065	127.088
+T	0.0332377	0.00349065	126.087
+T	0.0333251	0.00349065	125.096
+T	0.0334126	0.00349065	124.115
+T	0.0335001	0.00349065	123.144
+T	0.0335875	0.00349065	122.184
+T	0.033675	0.00349065	121.233
+T	0.0337625	0.00349065	120.292
+T	0.0338499	0.00349065	119.361
+T	0.0339374	0.00349065	118.439
+T	0.0340248	0.00349065	117.527
+T	0.0341123	0.00349065	116.623
+T	0.0341998	0.00349065	115.729
+T	0.0342872	0.00349065	114.844
+T	0.0343747	0.00349065	113.968
+T	0.0344622	0.00349065	113.101
+T	0.0345496	0.00349065	112.243
+T	0.0346371	0.00349065	111.393
+T	0.0347246	0.00349065	110.551
+T	0.034812	0.00349065	109.718
+T	0.0348995	0.00349065	108.893
+################################################################################################
+# Perpendicular cut at 2thetaf=0.368deg
+# fit-example
+# Weight,   Scale factor,   Shift factor
+  1.        1.   F			0.   F	      
+            0  1e5          0   1e5
+             F  F           F  F
+# DeltaOmega(deg), DeltaOmega(deg)
+	 0.                0 
+# Fitted, Sin(2Thetaf), Sin(Alphaf), Intensity, Error bars
+T	0.00642277	8.74674e-05	201.859
+T	0.00642277	0.000174935	805.406
+T	0.00642277	0.000262402	1810.9
+T	0.00642277	0.00034987	3211.92
+T	0.00642277	0.000437337	4998.82
+T	0.00642277	0.000524805	7158.23
+T	0.00642277	0.000612272	9706.18
+T	0.00642277	0.000699739	12608.5
+T	0.00642277	0.000787207	15844.6
+T	0.00642277	0.000874674	19390.6
+T	0.00642277	0.000962142	23297.4
+T	0.00642277	0.00104961	27483.9
+T	0.00642277	0.00113708	31919.8
+T	0.00642277	0.00122454	36571.8
+T	0.00642277	0.00131201	41539.5
+T	0.00642277	0.00139948	46681.1
+T	0.00642277	0.00148695	51957.6
+T	0.00642277	0.00157441	57328.8
+T	0.00642277	0.00166188	62948
+T	0.00642277	0.00174935	68396.7
+T	0.00642277	0.00183682	74257.3
+T	0.00642277	0.00192428	79856.3
+T	0.00642277	0.00201175	85357.4
+T	0.00642277	0.00209922	90969.8
+T	0.00642277	0.00218669	96409.1
+T	0.00642277	0.00227415	101893
+T	0.00642277	0.00236162	106840
+T	0.00642277	0.00244909	111733
+T	0.00642277	0.00253656	116247
+T	0.00642277	0.00262402	120328
+T	0.00642277	0.00271149	124153
+T	0.00642277	0.00279896	127384
+T	0.00642277	0.00288643	129939
+T	0.00642277	0.00297389	131725
+T	0.00642277	0.00306136	132699
+T	0.00642277	0.00314883	132502
+T	0.00642277	0.00323629	130889
+T	0.00642277	0.00332376	126781
+T	0.00642277	0.00341123	118794
+T	0.00642277	0.0034987	81074.7
+T	0.00642277	0.00358616	64918.4
+T	0.00642277	0.00367363	57378.1
+T	0.00642277	0.0037611	52126.4
+T	0.00642277	0.00384857	48403.2
+T	0.00642277	0.00393603	45566.2
+T	0.00642277	0.0040235	43302.6
+T	0.00642277	0.00411097	41436.3
+T	0.00642277	0.00419844	39748.2
+T	0.00642277	0.0042859	38313.3
+T	0.00642277	0.00437337	37070.6
+T	0.00642277	0.00446084	35912.7
+T	0.00642277	0.00454831	34892.8
+T	0.00642277	0.00463577	33982.6
+T	0.00642277	0.00472324	33161
+T	0.00642277	0.00481071	32411.8
+T	0.00642277	0.00489818	31693.2
+T	0.00642277	0.00498564	31032.8
+T	0.00642277	0.00507311	30420.7
+T	0.00642277	0.00516058	29831.4
+T	0.00642277	0.00524805	29296.7
+T	0.00642277	0.00533551	28778.1
+T	0.00642277	0.00542298	28278.1
+T	0.00642277	0.00551045	27814.3
+T	0.00642277	0.00559792	27364.6
+T	0.00642277	0.00568538	26935.4
+T	0.00642277	0.00577285	26523.7
+T	0.00642277	0.00586032	26126.9
+T	0.00642277	0.00594779	25742
+T	0.00642277	0.00603525	25369.9
+T	0.00642277	0.00612272	25008.8
+T	0.00642277	0.00621019	24658.9
+T	0.00642277	0.00629766	24316
+T	0.00642277	0.00638512	23983
+T	0.00642277	0.00647259	23657
+T	0.00642277	0.00656006	23341.1
+T	0.00642277	0.00664753	23031.2
+T	0.00642277	0.00673499	22721.4
+T	0.00642277	0.00682246	22425.7
+T	0.00642277	0.00690993	22128.8
+T	0.00642277	0.0069974	21840.9
+T	0.00642277	0.00708486	21556
+T	0.00642277	0.00717233	21273.8
+T	0.00642277	0.0072598	20993.7
+T	0.00642277	0.00734727	20722.1
+T	0.00642277	0.00743473	20452.2
+T	0.00642277	0.0075222	20183.8
+T	0.00642277	0.00760967	19916.7
+T	0.00642277	0.00769714	19657.4
+T	0.00642277	0.0077846	19399.1
+T	0.00642277	0.00787207	19141.5
+T	0.00642277	0.00795954	18884.5
+T	0.00642277	0.00804701	18634.9
+T	0.00642277	0.00813447	18385.7
+T	0.00642277	0.00822194	18136.8
+T	0.00642277	0.00830941	17894.9
+T	0.00642277	0.00839687	17646.3
+T	0.00642277	0.00848434	17404.6
+T	0.00642277	0.00857181	17163
+T	0.00642277	0.00865927	16927.9
+T	0.00642277	0.00874674	16686.2
+T	0.00642277	0.00883421	16450.9
+T	0.00642277	0.00892168	16215.5
+T	0.00642277	0.00900914	15980.1
+T	0.00642277	0.00909661	15750.7
+T	0.00642277	0.00918408	15521.1
+T	0.00642277	0.00927154	15291.5
+T	0.00642277	0.00935901	15061.7
+T	0.00642277	0.00944648	14837.7
+T	0.00642277	0.00953394	14613.5
+T	0.00642277	0.00962141	14389.2
+T	0.00642277	0.00970888	14164.9
+T	0.00642277	0.00979635	13945.9
+T	0.00642277	0.00988381	13726.9
+T	0.00642277	0.00997128	13507.9
+T	0.00642277	0.0100587	13289
+T	0.00642277	0.0101462	13075
+T	0.00642277	0.0102337	12856.5
+T	0.00642277	0.0103211	12647.4
+T	0.00642277	0.0104086	12434
+T	0.00642277	0.0104961	12220.9
+T	0.00642277	0.0105835	12012.4
+T	0.00642277	0.010671	11804.2
+T	0.00642277	0.0107585	11600.4
+T	0.00642277	0.0108459	11393.1
+T	0.00642277	0.0109334	11190.1
+T	0.00642277	0.0110209	10987.6
+T	0.00642277	0.0111084	10785.7
+T	0.00642277	0.0111958	10587.9
+T	0.00642277	0.0112833	10390.6
+T	0.00642277	0.0113708	10194.1
+T	0.00642277	0.0114582	9998.35
+T	0.00642277	0.0115457	9806.39
+T	0.00642277	0.0116332	9612.44
+T	0.00642277	0.0117206	9422.27
+T	0.00642277	0.0118081	9235.67
+T	0.00642277	0.0118956	9047.46
+T	0.00642277	0.011983	8862.82
+T	0.00642277	0.0120705	8679.25
+T	0.00642277	0.012158	8496.83
+T	0.00642277	0.0122454	8317.81
+T	0.00642277	0.0123329	8139.95
+T	0.00642277	0.0124204	7963.33
+T	0.00642277	0.0125078	7788.04
+T	0.00642277	0.0125953	7614.16
+T	0.00642277	0.0126828	7443.5
+T	0.00642277	0.0127702	7274.25
+T	0.00642277	0.0128577	7106.47
+T	0.00642277	0.0129452	6941.79
+T	0.00642277	0.0130326	6778.6
+T	0.00642277	0.0131201	6616.96
+T	0.00642277	0.0132076	6456.94
+T	0.00642277	0.013295	6298.62
+T	0.00642277	0.0133825	6143.25
+T	0.00642277	0.01347	5989.58
+T	0.00642277	0.0135574	5837.66
+T	0.00642277	0.0136449	5688.59
+T	0.00642277	0.0137324	5540.27
+T	0.00642277	0.0138198	5394.82
+T	0.00642277	0.0139073	5252.13
+T	0.00642277	0.0139948	5110.4
+T	0.00642277	0.0140822	4971.42
+T	0.00642277	0.0141697	4834.36
+T	0.00642277	0.0142572	4699.25
+T	0.00642277	0.0143446	4566.12
+T	0.00642277	0.0144321	4435.67
+T	0.00642277	0.0145196	4307.22
+T	0.00642277	0.014607	4180.78
+T	0.00642277	0.0146945	4056.96
+T	0.00642277	0.014782	3934.62
+T	0.00642277	0.0148694	3814.9
+T	0.00642277	0.0149569	3697.24
+T	0.00642277	0.0150444	3582.14
+T	0.00642277	0.0151318	3469.1
+T	0.00642277	0.0152193	3357.75
+T	0.00642277	0.0153068	3249.32
+T	0.00642277	0.0153942	3142.61
+T	0.00642277	0.0154817	3038.37
+T	0.00642277	0.0155692	2936.26
+T	0.00642277	0.0156566	2836.26
+T	0.00642277	0.0157441	2738.41
+T	0.00642277	0.0158316	2642.97
+T	0.00642277	0.015919	2549.65
+T	0.00642277	0.0160065	2458.45
+T	0.00642277	0.016094	2369.39
+T	0.00642277	0.0161814	2282.67
+T	0.00642277	0.0162689	2198.06
+T	0.00642277	0.0163564	2115.57
+T	0.00642277	0.0164438	2035.18
+T	0.00642277	0.0165313	1957.07
+T	0.00642277	0.0166188	1881.04
+T	0.00642277	0.0167063	1807.09
+T	0.00642277	0.0167937	1735.35
+T	0.00642277	0.0168812	1665.54
+T	0.00642277	0.0169687	1597.9
+T	0.00642277	0.0170561	1532.3
+T	0.00642277	0.0171436	1468.83
+T	0.00642277	0.0172311	1407.26
+T	0.00642277	0.0173185	1347.78
+T	0.00642277	0.017406	1290.28
+T	0.00642277	0.0174935	1234.75
+T	0.00642277	0.0175809	1181.23
+T	0.00642277	0.0176684	1129.64
+T	0.00642277	0.0177559	1079.95
+T	0.00642277	0.0178433	1032.15
+T	0.00642277	0.0179308	986.284
+T	0.00642277	0.0180183	942.257
+T	0.00642277	0.0181057	900.053
+T	0.00642277	0.0181932	859.65
+T	0.00642277	0.0182807	821.08
+T	0.00642277	0.0183681	784.265
+T	0.00642277	0.0184556	749.178
+T	0.00642277	0.0185431	715.799
+T	0.00642277	0.0186305	684.149
+T	0.00642277	0.018718	654.154
+T	0.00642277	0.0188055	625.789
+T	0.00642277	0.018893	599.029
+T	0.00642277	0.0189804	573.848
+T	0.00642277	0.0190679	550.259
+T	0.00642277	0.0191554	528.193
+T	0.00642277	0.0192428	507.659
+T	0.00642277	0.0193303	488.557
+T	0.00642277	0.0194178	470.931
+T	0.00642277	0.0195052	454.716
+T	0.00642277	0.0195927	439.884
+T	0.00642277	0.0196802	426.438
+T	0.00642277	0.0197676	414.315
+T	0.00642277	0.0198551	403.488
+T	0.00642277	0.0199426	393.926
+T	0.00642277	0.02003	385.629
+T	0.00642277	0.0201175	378.508
+T	0.00642277	0.020205	372.592
+T	0.00642277	0.0202924	367.85
+T	0.00642277	0.0203799	364.194
+T	0.00642277	0.0204674	361.651
+T	0.00642277	0.0205548	360.161
+T	0.00642277	0.0206423	359.696
+T	0.00642277	0.0207298	360.251
+T	0.00642277	0.0208172	361.769
+T	0.00642277	0.0209047	364.219
+T	0.00642277	0.0209922	367.572
+T	0.00642277	0.0210797	371.797
+T	0.00642277	0.0211671	376.888
+T	0.00642277	0.0212546	382.792
+T	0.00642277	0.0213421	389.478
+T	0.00642277	0.0214295	396.938
+T	0.00642277	0.021517	405.121
+T	0.00642277	0.0216045	413.996
+T	0.00642277	0.0216919	423.535
+T	0.00642277	0.0217794	433.709
+T	0.00642277	0.0218669	444.509
+T	0.00642277	0.0219543	455.886
+T	0.00642277	0.0220418	467.81
+T	0.00642277	0.0221293	480.274
+T	0.00642277	0.0222167	493.209
+T	0.00642277	0.0223042	506.628
+T	0.00642277	0.0223917	520.502
+T	0.00642277	0.0224791	534.765
+T	0.00642277	0.0225666	549.429
+T	0.00642277	0.0226541	564.448
+T	0.00642277	0.0227415	579.795
+T	0.00642277	0.022829	595.445
+T	0.00642277	0.0229165	611.391
+T	0.00642277	0.0230039	627.587
+T	0.00642277	0.0230914	644.01
+T	0.00642277	0.0231789	660.653
+T	0.00642277	0.0232663	677.455
+T	0.00642277	0.0233538	694.429
+T	0.00642277	0.0234413	711.551
+T	0.00642277	0.0235288	728.761
+T	0.00642277	0.0236162	746.074
+T	0.00642277	0.0237037	763.449
+T	0.00642277	0.0237912	780.864
+T	0.00642277	0.0238786	798.297
+T	0.00642277	0.0239661	815.746
+T	0.00642277	0.0240536	833.171
+T	0.00642277	0.024141	850.553
+T	0.00642277	0.0242285	867.872
+T	0.00642277	0.024316	885.128
+T	0.00642277	0.0244034	902.282
+T	0.00642277	0.0244909	919.317
+T	0.00642277	0.0245784	936.213
+T	0.00642277	0.0246658	952.975
+T	0.00642277	0.0247533	969.565
+T	0.00642277	0.0248408	985.965
+T	0.00642277	0.0249282	1002.18
+T	0.00642277	0.0250157	1018.16
+T	0.00642277	0.0251032	1033.92
+T	0.00642277	0.0251906	1049.43
+T	0.00642277	0.0252781	1064.7
+T	0.00642277	0.0253656	1079.67
+T	0.00642277	0.025453	1094.37
+T	0.00642277	0.0255405	1108.76
+T	0.00642277	0.025628	1122.87
+T	0.00642277	0.0257155	1136.62
+T	0.00642277	0.0258029	1150.05
+T	0.00642277	0.0258904	1163.14
+T	0.00642277	0.0259779	1175.89
+T	0.00642277	0.0260653	1188.24
+T	0.00642277	0.0261528	1200.24
+T	0.00642277	0.0262403	1211.85
+T	0.00642277	0.0263277	1223.06
+T	0.00642277	0.0264152	1233.89
+T	0.00642277	0.0265027	1244.32
+T	0.00642277	0.0265901	1254.31
+T	0.00642277	0.0266776	1263.88
+T	0.00642277	0.0267651	1273.05
+T	0.00642277	0.0268525	1281.78
+T	0.00642277	0.02694	1290.07
+T	0.00642277	0.0270275	1297.9
+T	0.00642277	0.0271149	1305.31
+T	0.00642277	0.0272024	1312.26
+T	0.00642277	0.0272899	1318.75
+T	0.00642277	0.0273773	1324.78
+T	0.00642277	0.0274648	1330.37
+T	0.00642277	0.0275523	1335.45
+T	0.00642277	0.0276397	1340.1
+T	0.00642277	0.0277272	1344.31
+T	0.00642277	0.0278147	1348
+T	0.00642277	0.0279022	1351.26
+T	0.00642277	0.0279896	1354.04
+T	0.00642277	0.0280771	1356.34
+T	0.00642277	0.0281646	1358.21
+T	0.00642277	0.028252	1359.6
+T	0.00642277	0.0283395	1360.52
+T	0.00642277	0.028427	1360.96
+T	0.00642277	0.0285144	1360.97
+T	0.00642277	0.0286019	1360.47
+T	0.00642277	0.0286894	1359.55
+T	0.00642277	0.0287768	1358.2
+T	0.00642277	0.0288643	1356.35
+T	0.00642277	0.0289518	1354.08
+T	0.00642277	0.0290392	1351.36
+T	0.00642277	0.0291267	1348.19
+T	0.00642277	0.0292142	1344.62
+T	0.00642277	0.0293016	1340.61
+T	0.00642277	0.0293891	1336.16
+T	0.00642277	0.0294766	1331.28
+T	0.00642277	0.029564	1325.98
+T	0.00642277	0.0296515	1320.3
+T	0.00642277	0.029739	1314.2
+T	0.00642277	0.0298264	1307.7
+T	0.00642277	0.0299139	1300.85
+T	0.00642277	0.0300014	1293.6
+T	0.00642277	0.0300888	1285.96
+T	0.00642277	0.0301763	1277.94
+T	0.00642277	0.0302638	1269.55
+T	0.00642277	0.0303513	1260.84
+T	0.00642277	0.0304387	1251.77
+T	0.00642277	0.0305262	1242.35
+T	0.00642277	0.0306137	1232.64
+T	0.00642277	0.0307011	1222.59
+T	0.00642277	0.0307886	1212.18
+T	0.00642277	0.0308761	1201.53
+T	0.00642277	0.0309635	1190.54
+T	0.00642277	0.031051	1179.29
+T	0.00642277	0.0311385	1167.75
+T	0.00642277	0.0312259	1155.94
+T	0.00642277	0.0313134	1143.89
+T	0.00642277	0.0314009	1131.54
+T	0.00642277	0.0314883	1118.98
+T	0.00642277	0.0315758	1106.19
+T	0.00642277	0.0316633	1093.19
+T	0.00642277	0.0317507	1079.94
+T	0.00642277	0.0318382	1066.51
+T	0.00642277	0.0319257	1052.92
+T	0.00642277	0.0320131	1039.1
+T	0.00642277	0.0321006	1025.13
+T	0.00642277	0.0321881	1010.99
+T	0.00642277	0.0322755	996.689
+T	0.00642277	0.032363	982.237
+T	0.00642277	0.0324505	967.674
+T	0.00642277	0.0325379	952.981
+T	0.00642277	0.0326254	938.166
+T	0.00642277	0.0327129	923.243
+T	0.00642277	0.0328003	908.246
+T	0.00642277	0.0328878	893.158
+T	0.00642277	0.0329753	877.99
+T	0.00642277	0.0330627	862.777
+T	0.00642277	0.0331502	847.48
+T	0.00642277	0.0332377	832.157
+T	0.00642277	0.0333251	816.793
+T	0.00642277	0.0334126	801.422
+T	0.00642277	0.0335001	786.008
+T	0.00642277	0.0335875	770.605
+T	0.00642277	0.033675	755.202
+T	0.00642277	0.0337625	739.826
+T	0.00642277	0.0338499	724.448
+T	0.00642277	0.0339374	709.117
+T	0.00642277	0.0340248	693.822
+T	0.00642277	0.0341123	678.59
+T	0.00642277	0.0341998	663.396
+T	0.00642277	0.0342872	648.282
+T	0.00642277	0.0343747	633.24
+T	0.00642277	0.0344622	618.293
+T	0.00642277	0.0345496	603.423
+T	0.00642277	0.0346371	588.664
+T	0.00642277	0.0347246	574.012
+T	0.00642277	0.034812	559.485
+T	0.00642277	0.0348995	545.07
+################################################################################################
diff --git a/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.fit b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.fit
new file mode 100644
index 0000000..6c21b32
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.fit
@@ -0,0 +1,108 @@
+###########################################                                                                                  
+#	GISAXS FIT : FIT PARAMETERS                                                                                                
+###########################################                                                                                  
+                                                                                                                             
+# Cuts :   Number of cuts,  Number of points per cut, Fit type,  Error Bar, Epsilon for standard errors, Number of cycles    
+                2                    100                 0          1                0.08                     10             
+# Scale and shift factor :      A       LA     S     LS                                                                      
+                            1.E+05    T        10    T
+                             1e4   2e5         0  20                                                                         
+                              T    T           T  T                                                                          
+# Reciprocal space origin : St(deg)   LSt   Sa(deg)    LSa                                                                   
+                             0.0        F      0.0      F                                                                    
+                             0  0             0  0                                                                           
+                             F  F             F  F                                                                           
+############################  Framework and beam  parameters ##############################################                  
+# Beam Wavelenght  : Lambda (nm),  Sig_Wl                                                                                    
+                        F           F                                                                                        
+                      0  0         0  0                                                                                      
+                      F  F         F  F                                                                                      
+# Alpha_i,2Theta_i  : Alpha_i,  Sig_Ai, 2Theta_i,  Sig_Ti                                                                    
+                        F         F       F         F                                                                        
+                      0  0     0  0    0  0       0  0                                                                       
+                      F  F       F  F    F  F       F  F                                                                     
+# Substrate :    n_delta_S,   n_beta_S,  Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm)                      
+	             F            F            F                    F              F            F                                   
+                 0  0          0  0         0  0                 0  0           0  0         0  0                            
+                 F  F          F  F         F  F                 F  F           F  F         F  F                            
+# Particle : n-delta_I, n-beta_I, Depth,  n-delta_SH, n-beta_SH                                                                
+              F         F        F        F        F                                                                         
+             0  0      0  0     0  0     0  0     0  0                                                                       
+             F  F      F  F     F  F     F  F     F  F                                                                       
+##################################   Particle parameters #################################################                   
+# Probability of particle type                                                                                                 
+	F                                                                                                                           
+	0  1                                                                                                                        
+	F  F                                                                                                                        
+# Fixed geometrical parameters : Base angle,   Height ratio,  Flattening,  FS-radii/R                                                     
+	                               F             F               F          F      F                                                          
+                                   0  0          0  0          0  0        0  0    0  0                                                   
+                                   F  F          F  F          F  F        F  F     F  F                                                 
+# Shell thicknesses :   dR,      dH,      dW                                                                                 
+	     	            F         F        F                                                                                      
+                       0  0      0  0     0  0                                                                               
+                       F  F      F  F     F  F                                                                               
+# Size of particle		: Radius(nm), SigmaR/R                                                                                   
+                          T            T                                                                                    
+                         0  10       0  1                                                                                 
+                         T  T        T  T                                                                                 
+# Heigth apect ratio	: Height/R, SigmaH/H, rho_H                                                                                    
+                          T             F      F                                                                              
+                         0  10        0  0   0  0                                                                                 
+                         T  T        F  F    F  F                                                                                
+# Width apect ratio	: Width/R, SigmaW/W, rho_W                                                                                      
+                          F             F    F                                                                                
+                         0  0        0  0   0  0                                                                                 
+                         F  F        F  F   F  F                                                                                 
+# Orientation of particle : Zeta(deg), SigmaZ(deg)                                                                             
+                          F           F                                                                                      
+                         0  0        0  0                                                                                    
+                         F  F        F  F                                                                                    
+#################################### Lattice parameters #################################################                    
+#  Interference function :   Peak position D,    w,     Eta_voigt,  Size-Distance coupling,  Cut-off                                                            
+                                   T             T         F               F                  F                                                  
+                                  0  50         0  10    0  0            0   0              0   0                                                    
+                                  T  T          T  T     F  F            F   F              F   F                                                    
+# Pair correlation function :   Density,    D1,    sigma                                                                     
+                                  F         F        F                                                                       
+                                 0  0      0  0     0  0                                                                     
+                                 F  F      F  F     F  F                                                                     
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg)                                                                        
+                         F        F           F                                                                              
+                         0  0     0  0      0  0                                                                             
+                         F  F     F  F      F  F                                                                             
+                       Xi(deg),   sigmaXi(deg)                                                                               
+                         F            F                                                                                      
+                         0  0       0  0                                                                                     
+                         F  F       F  F                                                                                     
+                       Domain sizes DL(nm), SigmaDL/DL                                                                       
+			      F        F           F      F                                                                                       
+                       0  0     0  0        0  0   0  0                                                                      
+                       F  F     F  F        F  F   F  F                                                                      
+# Imperfect lattice :  Correlation lenghts (nm), Rod orientation(deg)                                                        
+                         F        F                F      F                                                                  
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+# Paracrystal :   Disorder factors w/L and Rod orientation (deg)                                                             
+			      F    F                     F     F                                                                                  
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+                        F    F                     F     F                                                                   
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+# Pattern :   Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1                                                      
+			      F         F        F       F       F                                                                                
+                       0  0     0  0     0  0    0  0    0  0                                                                
+                       F  F     F  F     F  F    F  F    F  F                                                                
+			      F         F        F       F       F                                                                                
+                       0  0     0  0     0  0    0  0    0  0                                                                
+                       F  F     F  F     F  F    F  F    F  F                                                                
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
diff --git a/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.inp b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.inp
new file mode 100644
index 0000000..9837ff3
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+fit-example
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         DA               0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2       0   0.2        400      1
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio,  Flattening,  FS-radii/R
+	                       54.73               1.		       1.         0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          gaussian           0.2       0.1         11       20   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2     0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          1DDL 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               15                     3      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  sigma(nm)
+                                   0.007         25      100   
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.ki2 b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.ki2
new file mode 100644
index 0000000..8fdbdd7
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.ki2
@@ -0,0 +1,869 @@
+==================================================
+Number of cuts :                                    2
+Number of points :                                100
+Number of free parameters :                         7
+Number of independent parameters :                  7
+Excluded area in cut( 1) :           F
+Excluded area in cut( 2) :           F
+Initial temperature :                       2.00000E+01
+Temperature reduction factor :              8.50000E-01
+# of cyles before step lenght adjustment :         15
+# of iterations before T reduction :               25
+Error tolerance for termination :           1.00000E-01
+# of final function before termination :            3
+Maximum number of function evaluations :        20000
+Minimal function value :                    3.00000E+00
+Final temperature :                         1.00000E+00
+Function to be minimized : Chi2
+Printing option :                                   2
+ 
+  1  1  # Global scale factor :               1.00000E+05
+  Activated lower bound :  1.00000E+04
+  Activated upper bound :  2.00000E+05
+  2  2  # Global shift factor :               1.00000E+01
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  1.00000E+01
+  6  6  # D (nm) :                            1.50000E+01
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  5.00000E+01
+  7  7  # w (nm) :                            3.00000E+00
+  Activated lower bound :  0.00000E+00
+  Activated upper bound :  1.00000E+01
+ 
+==================================================
+ 
+Initial vector of parameters
+  1  1  # Global scale factor :               1.00000E+05
+  2  2  # Global shift factor :               1.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+Initial function value :  1.92261E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.00373E+05
+  2  2  # Global shift factor :               2.26804E+00
+  3  3  # ( 1) Particle radius (nm) :         2.16911E+00
+  4  4  # ( 1) Dispersion of radius:          5.88289E-01
+  5  5  # ( 1) Height aspect ratio :          6.70767E+00
+  6  6  # D (nm) :                            3.94044E+01
+  7  7  # w (nm) :                            3.37838E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.08576E+05
+  2  2  # Global shift factor :               3.36745E+00
+  3  3  # ( 1) Particle radius (nm) :         7.99036E+00
+  4  4  # ( 1) Dispersion of radius:          1.17468E-01
+  5  5  # ( 1) Height aspect ratio :          1.31468E+00
+  6  6  # D (nm) :                            4.40077E+01
+  7  7  # w (nm) :                            6.78923E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.31104E+05
+  2  2  # Global shift factor :               3.33331E+00
+  3  3  # ( 1) Particle radius (nm) :         2.85583E+00
+  4  4  # ( 1) Dispersion of radius:          8.35562E-01
+  5  5  # ( 1) Height aspect ratio :          6.88525E+00
+  6  6  # D (nm) :                            5.50124E+00
+  7  7  # w (nm) :                            5.78976E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.61900E+05
+  2  2  # Global shift factor :               4.83642E+00
+  3  3  # ( 1) Particle radius (nm) :         8.40236E+00
+  4  4  # ( 1) Dispersion of radius:          4.72950E-01
+  5  5  # ( 1) Height aspect ratio :          9.25256E+00
+  6  6  # D (nm) :                            6.60998E-01
+  7  7  # w (nm) :                            7.05753E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.00992E+05
+  2  2  # Global shift factor :               1.24967E+01
+  3  3  # ( 1) Particle radius (nm) :         7.60751E+00
+  4  4  # ( 1) Dispersion of radius:          4.12040E-02
+  5  5  # ( 1) Height aspect ratio :          6.39139E+00
+  6  6  # D (nm) :                            2.92678E+01
+  7  7  # w (nm) :                            7.40894E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               4.64347E+04
+  2  2  # Global shift factor :               8.81174E+00
+  3  3  # ( 1) Particle radius (nm) :         3.26068E+00
+  4  4  # ( 1) Dispersion of radius:          3.94888E-01
+  5  5  # ( 1) Height aspect ratio :          2.20596E+00
+  6  6  # D (nm) :                            4.30666E+01
+  7  7  # w (nm) :                            4.30631E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.99953E+04
+  2  2  # Global shift factor :               4.76811E-01
+  3  3  # ( 1) Particle radius (nm) :         8.80040E+00
+  4  4  # ( 1) Dispersion of radius:          5.99012E-01
+  5  5  # ( 1) Height aspect ratio :          5.69542E+00
+  6  6  # D (nm) :                            4.72518E+01
+  7  7  # w (nm) :                            3.77020E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               5.72584E+04
+  2  2  # Global shift factor :               8.32529E+00
+  3  3  # ( 1) Particle radius (nm) :         3.07263E+00
+  4  4  # ( 1) Dispersion of radius:          2.41564E-01
+  5  5  # ( 1) Height aspect ratio :          2.49849E+00
+  6  6  # D (nm) :                            2.22255E+01
+  7  7  # w (nm) :                            7.40811E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               3.64970E+04
+  2  2  # Global shift factor :               1.13220E+01
+  3  3  # ( 1) Particle radius (nm) :         8.40346E+00
+  4  4  # ( 1) Dispersion of radius:          9.07505E-01
+  5  5  # ( 1) Height aspect ratio :          8.55625E-03
+  6  6  # D (nm) :                            3.31491E+01
+  7  7  # w (nm) :                            2.54771E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               8.24398E+04
+  2  2  # Global shift factor :               1.60627E+01
+  3  3  # ( 1) Particle radius (nm) :         3.19385E+00
+  4  4  # ( 1) Dispersion of radius:          7.17142E-01
+  5  5  # ( 1) Height aspect ratio :          6.74956E+00
+  6  6  # D (nm) :                            1.85091E+01
+  7  7  # w (nm) :                            1.81155E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.77483E+05
+  2  2  # Global shift factor :               1.30162E+01
+  3  3  # ( 1) Particle radius (nm) :         7.65928E+00
+  4  4  # ( 1) Dispersion of radius:          4.41423E-02
+  5  5  # ( 1) Height aspect ratio :          9.95309E-01
+  6  6  # D (nm) :                            4.21957E+01
+  7  7  # w (nm) :                            5.36192E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               4.91334E+04
+  2  2  # Global shift factor :               1.42172E+01
+  3  3  # ( 1) Particle radius (nm) :         9.84537E+00
+  4  4  # ( 1) Dispersion of radius:          3.54321E-01
+  5  5  # ( 1) Height aspect ratio :          5.86850E+00
+  6  6  # D (nm) :                            4.43121E+01
+  7  7  # w (nm) :                            8.75468E-01
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               9.96059E+04
+  2  2  # Global shift factor :               2.11829E+00
+  3  3  # ( 1) Particle radius (nm) :         8.15282E+00
+  4  4  # ( 1) Dispersion of radius:          5.82735E-01
+  5  5  # ( 1) Height aspect ratio :          8.12813E+00
+  6  6  # D (nm) :                            2.10381E+00
+  7  7  # w (nm) :                            5.00436E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               8.49461E+04
+  2  2  # Global shift factor :               1.65376E+01
+  3  3  # ( 1) Particle radius (nm) :         9.07769E+00
+  4  4  # ( 1) Dispersion of radius:          3.89364E-01
+  5  5  # ( 1) Height aspect ratio :          1.47312E+00
+  6  6  # D (nm) :                            2.50524E+01
+  7  7  # w (nm) :                            7.29378E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               8.92666E+04
+  2  2  # Global shift factor :               1.39923E+00
+  3  3  # ( 1) Particle radius (nm) :         9.27971E+00
+  4  4  # ( 1) Dispersion of radius:          7.87549E-01
+  5  5  # ( 1) Height aspect ratio :          1.56356E+00
+  6  6  # D (nm) :                            9.59655E+00
+  7  7  # w (nm) :                            6.11066E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               3.06923E+04
+  2  2  # Global shift factor :               1.98448E+01
+  3  3  # ( 1) Particle radius (nm) :         9.62664E+00
+  4  4  # ( 1) Dispersion of radius:          4.92965E-01
+  5  5  # ( 1) Height aspect ratio :          9.84149E+00
+  6  6  # D (nm) :                            3.88454E+01
+  7  7  # w (nm) :                            1.27137E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               6.12279E+04
+  2  2  # Global shift factor :               6.47248E+00
+  3  3  # ( 1) Particle radius (nm) :         2.57217E+00
+  4  4  # ( 1) Dispersion of radius:          2.53177E-01
+  5  5  # ( 1) Height aspect ratio :          4.95974E+00
+  6  6  # D (nm) :                            1.26840E+01
+  7  7  # w (nm) :                            1.06657E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               3.13487E+04
+  2  2  # Global shift factor :               1.88056E+01
+  3  3  # ( 1) Particle radius (nm) :         2.94016E+00
+  4  4  # ( 1) Dispersion of radius:          9.74963E-02
+  5  5  # ( 1) Height aspect ratio :          8.92929E-01
+  6  6  # D (nm) :                            3.42285E+01
+  7  7  # w (nm) :                            3.08110E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.66034E+05
+  2  2  # Global shift factor :               1.17387E+01
+  3  3  # ( 1) Particle radius (nm) :         2.27149E+00
+  4  4  # ( 1) Dispersion of radius:          9.76578E-01
+  5  5  # ( 1) Height aspect ratio :          2.16346E+00
+  6  6  # D (nm) :                            2.29224E+01
+  7  7  # w (nm) :                            1.63215E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.31261E+04
+  2  2  # Global shift factor :               1.73979E+01
+  3  3  # ( 1) Particle radius (nm) :         1.98559E+00
+  4  4  # ( 1) Dispersion of radius:          1.84021E-01
+  5  5  # ( 1) Height aspect ratio :          3.93096E+00
+  6  6  # D (nm) :                            2.55453E+01
+  7  7  # w (nm) :                            6.39751E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               6.23523E+04
+  2  2  # Global shift factor :               5.67579E+00
+  3  3  # ( 1) Particle radius (nm) :         5.51456E+00
+  4  4  # ( 1) Dispersion of radius:          4.07893E-01
+  5  5  # ( 1) Height aspect ratio :          1.16167E+00
+  6  6  # D (nm) :                            1.84122E+01
+  7  7  # w (nm) :                            4.36226E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               6.65498E+04
+  2  2  # Global shift factor :               1.06401E+00
+  3  3  # ( 1) Particle radius (nm) :         3.61233E+00
+  4  4  # ( 1) Dispersion of radius:          4.27285E-01
+  5  5  # ( 1) Height aspect ratio :          5.88782E+00
+  6  6  # D (nm) :                            2.42329E+01
+  7  7  # w (nm) :                            7.75411E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               9.95917E+04
+  2  2  # Global shift factor :               8.81703E+00
+  3  3  # ( 1) Particle radius (nm) :         6.18518E+00
+  4  4  # ( 1) Dispersion of radius:          9.07738E-01
+  5  5  # ( 1) Height aspect ratio :          3.06319E+00
+  6  6  # D (nm) :                            2.30055E+01
+  7  7  # w (nm) :                            6.04675E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               5.42862E+04
+  2  2  # Global shift factor :               1.19373E+01
+  3  3  # ( 1) Particle radius (nm) :         6.19328E+00
+  4  4  # ( 1) Dispersion of radius:          4.70473E-01
+  5  5  # ( 1) Height aspect ratio :          6.81362E+00
+  6  6  # D (nm) :                            1.40322E+01
+  7  7  # w (nm) :                            4.79666E+00
+ 
+==================================================
+Intermediate results after step length adjustement
+ 
+New step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Current vector of parameters
+  1  1  # Global scale factor :               1.87118E+05
+  2  2  # Global shift factor :               1.77271E+01
+  3  3  # ( 1) Particle radius (nm) :         7.81584E+00
+  4  4  # ( 1) Dispersion of radius:          1.49652E-01
+  5  5  # ( 1) Height aspect ratio :          6.25187E+00
+  6  6  # D (nm) :                            1.68175E+01
+  7  7  # w (nm) :                            1.01517E+00
+ 
+==================================================
+Intermediate results before next temperature reduction
+ 
+ Current temperature :                      20.000    
+ Total number of functions evaluations  :       2626
+ Total time (s) for this cycle :           6.57500E+01
+ Min function value so far :               1.00876E+00
+ Total moves :                                  2625
+ Downhill :                                     1106
+ Accepted uphill :                              1129
+ Rejected uphill :                               390
+ Out of bounds trials :                         1273
+ New minima at this temperature :                  2
+ 
+Current optimal vector of parameters
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
+Step length
+  1  1  # Global scale factor :               1.90000E+05
+  2  2  # Global shift factor :               2.00000E+01
+  3  3  # ( 1) Particle radius (nm) :         1.00000E+01
+  4  4  # ( 1) Dispersion of radius:          1.00000E+00
+  5  5  # ( 1) Height aspect ratio :          1.00000E+01
+  6  6  # D (nm) :                            5.00000E+01
+  7  7  # w (nm) :                            1.00000E+01
+ 
+==================================================
+ SA achieved termination criteria !
+ 
+ Minimum value reached !
+ 
+==================================================
+ Total time (sec)                       =  6.58750E+01
+ Final temperature at completion        =  2.00000E+01
+ Number of accepted evaluations         =       2235
+ Total number of function evaluations   =       2626
+ Out of bounds function evaluations     =       1273
+==================================================
+ Chi2 and RBragg without an with excluded areas
+ Chi2 ( 1)     =                 4.885E-01   4.885E-01
+ RBragg( 1)    =                 2.374E-01   2.374E-01
+ ExpRBragg( 1) =                 8.684E-02   8.684E-02
+ Goodness( 1)  =                 1.653E+00   1.653E+00
+ Chi2 ( 2)     =                 5.202E-01   5.202E-01
+ RBragg( 2)    =                 2.096E-01   2.096E-01
+ ExpRBragg( 2) =                 8.122E-02   8.122E-02
+ Goodness( 2)  =                 1.607E+00   1.607E+00
+ Chi2 tot      =                1.009E+00   1.009E+00
+ RBragg tot    =                2.235E-01   2.235E-01
+ ExpRBragg tot =                8.403E-02   8.403E-02
+ Goodness tot  =                1.630E+00   1.630E+00
+==================================================
+  1  1  # Global scale factor :               1.08444E+05
+  2  2  # Global shift factor :               1.22237E+01
+  3  3  # ( 1) Particle radius (nm) :         5.00000E+00
+  4  4  # ( 1) Dispersion of radius:          2.00000E-01
+  5  5  # ( 1) Height aspect ratio :          1.00000E+00
+  6  6  # D (nm) :                            1.50000E+01
+  7  7  # w (nm) :                            3.00000E+00
+ 
diff --git a/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.out b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.out
new file mode 100644
index 0000000..2ac351c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-13/isgi_simulated_annealing.out
@@ -0,0 +1,298 @@
+#================================================================================================
+#                                     GISAXS OUTPUT FILE
+#================================================================================================
+# Date and time :                                   Thu Jan 17 18:26:46 2013
+# Input filename :                                  C:\Program Files\IsGISAXS\examples\ex-13\simulated-annealing-example-solution.inp
+# Fit filename :                                    C:\Program Files\IsGISAXS\examples\ex-13\simulated-annealing-example.fit
+# Fit with constraints :                             F
+# Matrix of constraints filename :                  C:\Program Files\IsGISAXS\examples\ex-13\simulated-annealing-example.mat
+# Data filename :                                   C:\Program Files\IsGISAXS\examples\ex-13\simulated-annealing-example.dat
+# Base filename :                                   fit-example
+# Type of calculation :                             simulated annealing
+# Ewald construction :                               T
+# Framework :                                       DWBA                
+# Treatment of the diffuse scattering :             DA        
+# Multilayer wavefields (Parratt-like) :                0
+# Required number of slices  :                         25
+# Actual number of slices in z  :                       1
+# Type of chi2 :                                        0
+# Error bar type :                                      1
+# Number of cuts :                                      2
+# Number of points per cut :                          100
+# Number of fitted parameters :                         7
+# Number of independent parameters :                    7
+# Systematic error :                                    8.00000E-02
+# Global scale and shift factors :                      1.08444E+05    1.22237E+01
+# Offset factors on alphaf and 2theta (deg) :                    0.00000E+00    0.00000E+00
+#=====================================Beam and substrate parameters==============================
+# Incident and scattered beam polarizations :       ss
+# Distribution of wavelength :                      none           
+# Wl0 - sigWl/Wl - FWHM-Wl (nm) :                       1.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Wl (nm), width and # of points :            1.00000E-01    1.00000E-01    0.00000E+00    1
+# Distribution of incident angle :                  none           
+# Alphai - sigAlphai - FWHM-Ai (deg) :                  2.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Alphai (deg), width and # of points :       2.00000E-01    2.00000E-01    0.00000E+00    1
+# Distribution of 2Theta incident angle :           none           
+# 2Thetai - sig2Thetai - FWHM (deg) :                   0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of 2Thetai (deg), width and # of points:       0.00000E+00    0.00000E+00    0.00000E+00    1
+# Substrate index of refraction (delta,beta):           6.00000E-06    2.00000E-08
+# Particle index of refraction (delta,beta):            6.00000E-04    2.00000E-08
+# Substrate roughness (nm) :                            0.00000E+00
+# Layer thickness (nm) :                                0.00000E+00
+# Layer index of refraction (delta,beta) :              1.00000E-05    5.00000E-07
+# Depth for the buried particle layer (nm):             0.00000E+00
+# Shell index of refraction (delta,beta) :              8.00000E-04    2.00000E-08
+#========================================Particle parameters=====================================
+# Number of different particle type :                  1
+#-------------------------------------------------------------------------------------------------
+# Angle between base and facets (deg) :                 5.47300E+01
+# Ratio between height for a cubooctahedron :           1.00000E+00
+# Flattening parameter of spheroid :                    1.00000E+00
+# Truncation parameters for a facetted sphere :         8.00000E-01    8.00000E-01
+# Particle shell thickness dR-dH-dW(nnm) :              0.00000E+00    0.00000E+00    0.00000E+00
+# H uncoupled :                                         T
+# W uncoupled :                                         F
+# Particle type - Probability :                      cylinder           1.00000E+00
+# Distribution of radius R :                        gaussian       
+# R0 - sigR/R0 - FWHM (nm) :                            5.00000E+00    2.00000E-01    2.35482E+00
+# Ranges of R (nm), width and # of points :             2.90360E-01    9.70964E+00    4.00000E+00   20
+# Distribution of height H :                        none           
+# H0/R0 - sigH/H0 - FWHM - rho_H :                      1.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of H/H0, width and  # of points :              1.00000E+00    1.00000E+00    0.00000E+00    1
+# Distribution of height W :                        none           
+# W0/R0 - sigW/W0 - FWHM - rho_W :                      1.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of W/W0, width and  # of points :              1.00000E+00    1.00000E+00    0.00000E+00    1
+# Distribution of orientations Z :                  none           
+# Z0 - sigZ - FWHM (deg) :                              0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of Z (deg), width and # of points :            0.00000E+00    0.00000E+00    0.00000E+00    1
+#======================================Particle position parameters===============================
+# Distribution of particles :                       1DDL                     
+# Density of particles (nm-2) - L(nm) :                 4.44444E-03    1.50000E+01
+# Size-distance coupling parameter :                    0.00000E+00
+# Cut-off value for finite size effects :               1.00000E+07
+# Correlation function parameters (D,w,D1) :            1.50000E+01    3.00000E+00    2.50000E+01
+# Hard core parameters (sig(nm), eta) :                 1.00000E+02    3.49066E+01
+# Statistical distribution  :                       gau
+# Pseudo Voigt parameter :                              5.00000E-01
+#=========================================Derived parameters======================================
+# Mean wavelength (nm) :                                1.00000E-01
+# Mean incident angle Alphai (deg) :                    2.00000E-01
+# Mean incident angle 2Thetai (deg) :                   0.00000E+00
+# Mean radius (nm) :                                    5.00000E+00
+# Mean gyration radius (nm) :                           5.00000E+00
+# Mean height (nm) :                                    5.00000E+00
+# Mean width (nm) :                                     5.00000E+00
+# Mean height aspect ratio :                            1.04623E+00
+# Mean width aspect ratio :                             1.00000E+00
+# Mean volumes <V>, Sqrt(<V^2>) (nm^3) :                4.08407E+02    4.38136E+02
+# Mean particle orientationn (deg) :                    0.00000E+00
+# Coverage :                                            3.63028E-01
+# Mean thickness (nm) :                                 1.81514E+00
+# Magic size coupling parameter :                       2.88462E+00
+ 
+#==========================================Data file============================================
+#       Sin(twotheta)         Sin(alphaf)            Qx(nm-1)            Qy(nm-1)            Qz(nm-1)              GISAXS            Data2fit           Error bar        Iobs - Icalc              Fitted
+# Cut # =   1       Weight =  5.00000E-01        Scale =  1.00000E+00        Shift =  0.00000E+00   DeltaOmega =  0.00000E+00  DeltaAlphai =  0.00000E+00
+# Excluded area :    F
+          8.74674E-05         3.49065E-03        -2.40037E-07         5.49571E-03         4.38648E-01         1.87690E+04         2.31997E+04         1.86222E+03         4.43070E+03                   1
+          4.37337E-04         3.49065E-03        -6.00838E-06         2.74785E-02         4.38648E-01         1.86047E+04         2.30475E+04         1.85004E+03         4.44275E+03                   1
+          7.87207E-04         3.49065E-03        -1.94679E-05         4.94614E-02         4.38648E-01         1.83240E+04         2.27009E+04         1.82231E+03         4.37694E+03                   1
+          1.13708E-03         3.49065E-03        -4.06187E-05         7.14444E-02         4.38648E-01         1.79032E+04         2.21797E+04         1.78062E+03         4.27651E+03                   1
+          1.48695E-03         3.49065E-03        -6.94606E-05         9.34273E-02         4.38648E-01         1.73667E+04         2.15147E+04         1.72741E+03         4.14798E+03                   1
+          1.83682E-03         3.49065E-03        -1.05994E-04         1.15410E-01         4.38648E-01         1.67484E+04         2.07483E+04         1.66610E+03         3.99985E+03                   1
+          2.18669E-03         3.49065E-03        -1.50218E-04         1.37393E-01         4.38648E-01         1.60917E+04         1.99342E+04         1.60097E+03         3.84254E+03                   1
+          2.53656E-03         3.49065E-03        -2.02133E-04         1.59376E-01         4.38648E-01         1.54499E+04         1.91387E+04         1.53733E+03         3.68876E+03                   1
+          2.88643E-03         3.49065E-03        -2.61740E-04         1.81359E-01         4.38648E-01         1.48894E+04         1.84438E+04         1.48174E+03         3.55442E+03                   1
+          3.23629E-03         3.49065E-03        -3.29036E-04         2.03341E-01         4.38648E-01         1.44934E+04         1.79529E+04         1.44247E+03         3.45948E+03                   1
+          3.58616E-03         3.49065E-03        -4.04024E-04         2.25324E-01         4.38648E-01         1.43720E+04         1.78024E+04         1.43043E+03         3.43039E+03                   1
+          3.93603E-03         3.49065E-03        -4.86705E-04         2.47307E-01         4.38648E-01         1.46797E+04         1.81839E+04         1.46095E+03         3.50420E+03                   1
+          4.28590E-03         3.49065E-03        -5.77076E-04         2.69289E-01         4.38648E-01         1.56504E+04         1.93874E+04         1.55723E+03         3.73700E+03                   1
+          4.63577E-03         3.49065E-03        -6.75139E-04         2.91272E-01         4.38648E-01         1.76657E+04         2.18860E+04         1.75712E+03         4.22027E+03                   1
+          4.98564E-03         3.49065E-03        -7.80893E-04         3.13255E-01         4.38648E-01         2.13873E+04         2.65000E+04         2.12624E+03         5.11273E+03                   1
+          5.33551E-03         3.49065E-03        -8.94339E-04         3.35238E-01         4.38648E-01         2.79819E+04         3.46759E+04         2.78031E+03         6.69402E+03                   1
+          5.68538E-03         3.49065E-03        -1.01548E-03         3.57221E-01         4.38648E-01         3.92409E+04         4.86348E+04         3.89703E+03         9.39388E+03                   1
+          6.03525E-03         3.49065E-03        -1.14430E-03         3.79204E-01         4.38648E-01         5.57464E+04         6.90981E+04         5.53409E+03         1.33517E+04                   1
+          6.38512E-03         3.49065E-03        -1.28082E-03         4.01186E-01         4.38648E-01         6.79474E+04         8.42249E+04         6.74424E+03         1.62775E+04                   1
+          6.73499E-03         3.49065E-03        -1.42504E-03         4.23169E-01         4.38648E-01         5.84464E+04         7.24457E+04         5.80190E+03         1.39993E+04                   1
+          7.08486E-03         3.49065E-03        -1.57694E-03         4.45152E-01         4.38648E-01         3.80847E+04         4.72017E+04         3.78238E+03         9.11703E+03                   1
+          7.43473E-03         3.49065E-03        -1.73654E-03         4.67135E-01         4.38648E-01         2.31080E+04         2.86339E+04         2.29695E+03         5.52590E+03                   1
+          7.78460E-03         3.49065E-03        -1.90382E-03         4.89118E-01         4.38648E-01         1.44593E+04         1.79114E+04         1.43915E+03         3.45213E+03                   1
+          8.13447E-03         3.49065E-03        -2.07880E-03         5.11101E-01         4.38648E-01         9.57447E+03         1.18554E+04         9.54662E+02         2.28093E+03                   1
+          8.48434E-03         3.49065E-03        -2.26147E-03         5.33084E-01         4.38648E-01         6.72409E+03         8.32149E+03         6.71940E+02         1.59740E+03                   1
+          8.92168E-03         3.49065E-03        -2.50063E-03         5.60562E-01         4.38648E-01         4.67064E+03         5.77565E+03         4.68260E+02         1.10501E+03                   1
+          9.27154E-03         3.49065E-03        -2.70060E-03         5.82544E-01         4.38648E-01         3.68691E+03         4.55600E+03         3.70677E+02         8.69091E+02                   1
+          9.62141E-03         3.49065E-03        -2.90827E-03         6.04527E-01         4.38648E-01         3.03138E+03         3.74328E+03         3.05649E+02         7.11904E+02                   1
+          9.97128E-03         3.49065E-03        -3.12363E-03         6.26510E-01         4.38648E-01         2.57336E+03         3.17543E+03         2.60209E+02         6.02069E+02                   1
+          1.03211E-02         3.49065E-03        -3.34665E-03         6.48490E-01         4.38648E-01         2.23664E+03         2.75792E+03         2.26797E+02         5.21282E+02                   1
+          1.06710E-02         3.49065E-03        -3.57742E-03         6.70475E-01         4.38648E-01         1.97792E+03         2.43720E+03         2.01129E+02         4.59281E+02                   1
+          1.10209E-02         3.49065E-03        -3.81588E-03         6.92459E-01         4.38648E-01         1.77543E+03         2.18617E+03         1.81036E+02         4.10742E+02                   1
+          1.13708E-02         3.49065E-03        -4.06203E-03         7.14444E-01         4.38648E-01         1.62068E+03         1.99434E+03         1.65679E+02         3.73655E+02                   1
+          1.17206E-02         3.49065E-03        -4.31580E-03         7.36423E-01         4.38648E-01         1.51156E+03         1.85902E+03         1.54846E+02         3.47463E+02                   1
+          1.20705E-02         3.49065E-03        -4.57734E-03         7.58407E-01         4.38648E-01         1.44547E+03         1.77709E+03         1.48286E+02         3.31625E+02                   1
+          1.24204E-02         3.49065E-03        -4.84658E-03         7.80392E-01         4.38648E-01         1.41492E+03         1.73923E+03         1.45254E+02         3.24313E+02                   1
+          1.27702E-02         3.49065E-03        -5.12342E-03         8.02370E-01         4.38648E-01         1.40690E+03         1.72931E+03         1.44460E+02         3.22405E+02                   1
+          1.31201E-02         3.49065E-03        -5.40804E-03         8.24355E-01         4.38648E-01         1.40647E+03         1.72879E+03         1.44418E+02         3.22321E+02                   1
+          1.34700E-02         3.49065E-03        -5.70036E-03         8.46340E-01         4.38648E-01         1.40126E+03         1.72234E+03         1.43902E+02         3.21081E+02                   1
+          1.38198E-02         3.49065E-03        -6.00028E-03         8.68318E-01         4.38648E-01         1.38409E+03         1.70107E+03         1.42198E+02         3.16977E+02                   1
+          1.41697E-02         3.49065E-03        -6.30798E-03         8.90303E-01         4.38648E-01         1.35284E+03         1.66234E+03         1.39097E+02         3.09498E+02                   1
+          1.45196E-02         3.49065E-03        -6.62338E-03         9.12288E-01         4.38648E-01         1.30881E+03         1.60777E+03         1.34727E+02         2.98957E+02                   1
+          1.48694E-02         3.49065E-03        -6.94637E-03         9.34266E-01         4.38648E-01         1.25493E+03         1.54095E+03         1.29375E+02         2.86021E+02                   1
+          1.52193E-02         3.49065E-03        -7.27716E-03         9.56251E-01         4.38648E-01         1.19434E+03         1.46584E+03         1.23359E+02         2.71502E+02                   1
+          1.55692E-02         3.49065E-03        -7.61564E-03         9.78236E-01         4.38648E-01         1.12981E+03         1.38585E+03         1.16951E+02         2.56040E+02                   1
+          1.59190E-02         3.49065E-03        -7.96171E-03         1.00021E+00         4.38648E-01         1.06348E+03         1.30359E+03         1.10360E+02         2.40114E+02                   1
+          1.62689E-02         3.49065E-03        -8.31558E-03         1.02220E+00         4.38648E-01         9.96830E+02         1.22097E+03         1.03739E+02         2.24140E+02                   1
+          1.66188E-02         3.49065E-03        -8.67714E-03         1.04418E+00         4.38648E-01         9.31017E+02         1.13937E+03         9.71989E+01         2.08353E+02                   1
+          1.69687E-02         3.49065E-03        -9.04640E-03         1.06617E+00         4.38648E-01         8.66935E+02         1.05993E+03         9.08296E+01         1.92995E+02                   1
+          1.73185E-02         3.49065E-03        -9.42324E-03         1.08815E+00         4.38648E-01         8.05396E+02         9.83608E+02         8.47084E+01         1.78212E+02                   1
+          1.76684E-02         3.49065E-03        -9.80789E-03         1.11013E+00         4.38648E-01         7.47088E+02         9.11317E+02         7.89082E+01         1.64229E+02                   1
+          1.80183E-02         3.49065E-03        -1.02002E-02         1.13212E+00         4.38648E-01         6.92662E+02         8.43839E+02         7.34918E+01         1.51177E+02                   1
+          1.83681E-02         3.49065E-03        -1.06002E-02         1.15409E+00         4.38648E-01         6.42619E+02         7.81776E+02         6.85076E+01         1.39157E+02                   1
+          1.87180E-02         3.49065E-03        -1.10079E-02         1.17608E+00         4.38648E-01         5.97219E+02         7.25488E+02         6.39845E+01         1.28269E+02                   1
+          1.90679E-02         3.49065E-03        -1.14233E-02         1.19806E+00         4.38648E-01         5.56547E+02         6.75061E+02         5.99299E+01         1.18514E+02                   1
+          1.94178E-02         3.49065E-03        -1.18464E-02         1.22005E+00         4.38648E-01         5.20461E+02         6.30320E+02         5.63299E+01         1.09859E+02                   1
+          1.97676E-02         3.49065E-03        -1.22771E-02         1.24203E+00         4.38648E-01         4.88657E+02         5.90877E+02         5.31540E+01         1.02220E+02                   1
+          2.01175E-02         3.49065E-03        -1.27157E-02         1.26401E+00         4.38648E-01         4.60686E+02         5.56197E+02         5.03594E+01         9.55110E+01                   1
+          2.04674E-02         3.49065E-03        -1.31619E-02         1.28600E+00         4.38648E-01         4.36062E+02         5.25667E+02         4.78973E+01         8.96049E+01                   1
+          2.08172E-02         3.49065E-03        -1.36157E-02         1.30798E+00         4.38648E-01         4.14283E+02         4.98658E+02         4.57174E+01         8.43748E+01                   1
+          2.11671E-02         3.49065E-03        -1.40773E-02         1.32996E+00         4.38648E-01         3.94851E+02         4.74566E+02         4.37713E+01         7.97148E+01                   1
+          2.15170E-02         3.49065E-03        -1.45466E-02         1.35194E+00         4.38648E-01         3.77334E+02         4.52848E+02         4.20155E+01         7.55145E+01                   1
+          2.18669E-02         3.49065E-03        -1.50236E-02         1.37393E+00         4.38648E-01         3.61351E+02         4.33033E+02         4.04122E+01         7.16820E+01                   1
+          2.22167E-02         3.49065E-03        -1.55081E-02         1.39591E+00         4.38648E-01         3.46593E+02         4.14731E+02         3.89300E+01         6.81380E+01                   1
+          2.25666E-02         3.49065E-03        -1.60005E-02         1.41789E+00         4.38648E-01         3.32800E+02         3.97631E+02         3.75438E+01         6.48313E+01                   1
+          2.29165E-02         3.49065E-03        -1.65006E-02         1.43988E+00         4.38648E-01         3.19782E+02         3.81492E+02         3.62343E+01         6.17099E+01                   1
+          2.32663E-02         3.49065E-03        -1.70083E-02         1.46186E+00         4.38648E-01         3.07402E+02         3.66139E+02         3.49873E+01         5.87371E+01                   1
+          2.36162E-02         3.49065E-03        -1.75238E-02         1.48384E+00         4.38648E-01         2.95553E+02         3.51449E+02         3.37928E+01         5.58958E+01                   1
+          2.39661E-02         3.49065E-03        -1.80470E-02         1.50583E+00         4.38648E-01         2.84175E+02         3.37342E+02         3.26444E+01         5.31668E+01                   1
+          2.43160E-02         3.49065E-03        -1.85779E-02         1.52781E+00         4.38648E-01         2.73230E+02         3.23771E+02         3.15384E+01         5.05408E+01                   1
+          2.46658E-02         3.49065E-03        -1.91163E-02         1.54979E+00         4.38648E-01         2.62702E+02         3.10714E+02         3.04728E+01         4.80121E+01                   1
+          2.50157E-02         3.49065E-03        -1.96626E-02         1.57177E+00         4.38648E-01         2.52578E+02         2.98160E+02         2.94468E+01         4.55823E+01                   1
+          2.53656E-02         3.49065E-03        -2.02166E-02         1.59376E+00         4.38648E-01         2.42861E+02         2.86112E+02         2.84608E+01         4.32513E+01                   1
+          2.57155E-02         3.49065E-03        -2.07783E-02         1.61574E+00         4.38648E-01         2.33554E+02         2.74572E+02         2.75148E+01         4.10183E+01                   1
+          2.60653E-02         3.49065E-03        -2.13475E-02         1.63772E+00         4.38648E-01         2.24662E+02         2.63544E+02         2.66094E+01         3.88824E+01                   1
+          2.65027E-02         3.49065E-03        -2.20701E-02         1.66520E+00         4.38648E-01         2.14122E+02         2.50476E+02         2.55343E+01         3.63540E+01                   1
+          2.68525E-02         3.49065E-03        -2.26566E-02         1.68718E+00         4.38648E-01         2.06152E+02         2.40591E+02         2.47194E+01         3.44393E+01                   1
+          2.72024E-02         3.49065E-03        -2.32510E-02         1.70917E+00         4.38648E-01         1.98578E+02         2.31200E+02         2.39437E+01         3.26222E+01                   1
+          2.75523E-02         3.49065E-03        -2.38531E-02         1.73115E+00         4.38648E-01         1.91391E+02         2.22288E+02         2.32061E+01         3.08974E+01                   1
+          2.79022E-02         3.49065E-03        -2.44629E-02         1.75314E+00         4.38648E-01         1.84575E+02         2.13837E+02         2.25052E+01         2.92621E+01                   1
+          2.82520E-02         3.49065E-03        -2.50803E-02         1.77511E+00         4.38648E-01         1.78115E+02         2.05824E+02         2.18392E+01         2.77091E+01                   1
+          2.86019E-02         3.49065E-03        -2.57055E-02         1.79710E+00         4.38648E-01         1.71988E+02         1.98227E+02         2.12063E+01         2.62391E+01                   1
+          2.89518E-02         3.49065E-03        -2.63384E-02         1.81908E+00         4.38648E-01         1.66176E+02         1.91020E+02         2.06045E+01         2.48441E+01                   1
+          2.93016E-02         3.49065E-03        -2.69788E-02         1.84106E+00         4.38648E-01         1.60660E+02         1.84179E+02         2.00320E+01         2.35188E+01                   1
+          2.96515E-02         3.49065E-03        -2.76271E-02         1.86305E+00         4.38648E-01         1.55418E+02         1.77678E+02         1.94865E+01         2.22599E+01                   1
+          3.00014E-02         3.49065E-03        -2.82832E-02         1.88503E+00         4.38648E-01         1.50432E+02         1.71496E+02         1.89664E+01         2.10636E+01                   1
+          3.03513E-02         3.49065E-03        -2.89469E-02         1.90702E+00         4.38648E-01         1.45685E+02         1.65610E+02         1.84700E+01         1.99246E+01                   1
+          3.07011E-02         3.49065E-03        -2.96181E-02         1.92900E+00         4.38648E-01         1.41162E+02         1.59999E+02         1.79955E+01         1.88370E+01                   1
+          3.10510E-02         3.49065E-03        -3.02972E-02         1.95098E+00         4.38648E-01         1.36845E+02         1.54646E+02         1.75415E+01         1.78013E+01                   1
+          3.14009E-02         3.49065E-03        -3.09841E-02         1.97296E+00         4.38648E-01         1.32721E+02         1.49532E+02         1.71066E+01         1.68108E+01                   1
+          3.17507E-02         3.49065E-03        -3.16784E-02         1.99494E+00         4.38648E-01         1.28780E+02         1.44644E+02         1.66896E+01         1.58636E+01                   1
+          3.21006E-02         3.49065E-03        -3.23806E-02         2.01693E+00         4.38648E-01         1.25009E+02         1.39967E+02         1.62895E+01         1.49581E+01                   1
+          3.24505E-02         3.49065E-03        -3.30906E-02         2.03891E+00         4.38648E-01         1.21398E+02         1.35490E+02         1.59053E+01         1.40920E+01                   1
+          3.28003E-02         3.49065E-03        -3.38080E-02         2.06089E+00         4.38648E-01         1.17940E+02         1.31200E+02         1.55360E+01         1.32604E+01                   1
+          3.31502E-02         3.49065E-03        -3.45334E-02         2.08288E+00         4.38648E-01         1.14624E+02         1.27088E+02         1.51808E+01         1.24644E+01                   1
+          3.35001E-02         3.49065E-03        -3.52664E-02         2.10486E+00         4.38648E-01         1.11443E+02         1.23144E+02         1.48390E+01         1.17005E+01                   1
+          3.38499E-02         3.49065E-03        -3.60070E-02         2.12684E+00         4.38648E-01         1.08393E+02         1.19361E+02         1.45101E+01         1.09677E+01                   1
+          3.41998E-02         3.49065E-03        -3.67554E-02         2.14882E+00         4.38648E-01         1.05465E+02         1.15729E+02         1.41931E+01         1.02642E+01                   1
+          3.45496E-02         3.49065E-03        -3.75114E-02         2.17080E+00         4.38648E-01         1.02654E+02         1.12243E+02         1.38879E+01         9.58913E+00                   1
+          3.48995E-02         3.49065E-03        -3.82752E-02         2.19279E+00         4.38648E-01         9.99532E+01         1.08893E+02         1.35935E+01         8.93977E+00                   1
+# Cut # =   2       Weight =  5.00000E-01        Scale =  1.00000E+00        Shift =  0.00000E+00   DeltaOmega =  0.00000E+00  DeltaAlphai =  0.00000E+00
+# Excluded area :    F
+          6.42277E-03         8.74674E-05        -9.13430E-04         4.03555E-01         2.24820E-01         1.80160E+02         2.01859E+02         2.15091E+01         2.16987E+01                   1
+          6.42277E-03         4.37337E-04        -9.19198E-04         4.03555E-01         2.46803E-01         4.17049E+03         4.99882E+03         4.06108E+02         8.28333E+02                   1
+          6.42277E-03         7.87207E-04        -9.32657E-04         4.03554E-01         2.68786E-01         1.31888E+04         1.58446E+04         1.27380E+03         2.65576E+03                   1
+          6.42277E-03         1.13708E-03        -9.53808E-04         4.03554E-01         2.90769E-01         2.65457E+04         3.19198E+04         2.55983E+03         5.37407E+03                   1
+          6.42277E-03         1.48695E-03        -9.82649E-04         4.03554E-01         3.12752E-01         4.31778E+04         5.19576E+04         4.16285E+03         8.77985E+03                   1
+          6.42277E-03         1.83682E-03        -1.01918E-03         4.03554E-01         3.34735E-01         6.16625E+04         7.42573E+04         5.94683E+03         1.25948E+04                   1
+          6.42277E-03         2.18669E-03        -1.06341E-03         4.03554E-01         3.56718E-01         8.02141E+04         9.64091E+04         7.71898E+03         1.61950E+04                   1
+          6.42277E-03         2.53656E-03        -1.11532E-03         4.03553E-01         3.78701E-01         9.66119E+04         1.16247E+05         9.30601E+03         1.96351E+04                   1
+          6.42277E-03         2.88643E-03        -1.17493E-03         4.03553E-01         4.00684E-01         1.07873E+05         1.29939E+05         1.04014E+04         2.20662E+04                   1
+          6.42277E-03         3.23629E-03        -1.24222E-03         4.03552E-01         4.22666E-01         1.08456E+05         1.30889E+05         1.04774E+04         2.24332E+04                   1
+          6.42277E-03         3.58616E-03        -1.31721E-03         4.03552E-01         4.44649E-01         5.33356E+04         6.49184E+04         5.19972E+03         1.15828E+04                   1
+          6.42277E-03         3.93603E-03        -1.39989E-03         4.03551E-01         4.66632E-01         3.76816E+04         4.55662E+04         3.65154E+03         7.88462E+03                   1
+          6.42277E-03         4.28590E-03        -1.49026E-03         4.03551E-01         4.88615E-01         3.16265E+04         3.83133E+04         3.07131E+03         6.68676E+03                   1
+          6.42277E-03         4.63577E-03        -1.58832E-03         4.03550E-01         5.10598E-01         2.80686E+04         3.39826E+04         2.72485E+03         5.91403E+03                   1
+          6.42277E-03         4.98564E-03        -1.69407E-03         4.03550E-01         5.32581E-01         2.56069E+04         3.10328E+04         2.48887E+03         5.42590E+03                   1
+          6.42277E-03         5.33551E-03        -1.80752E-03         4.03549E-01         5.54564E-01         2.37313E+04         2.87781E+04         2.30849E+03         5.04678E+03                   1
+          6.42277E-03         5.68538E-03        -1.92865E-03         4.03548E-01         5.76547E-01         2.22052E+04         2.69354E+04         2.16107E+03         4.73023E+03                   1
+          6.42277E-03         6.03525E-03        -2.05748E-03         4.03547E-01         5.98530E-01         2.09025E+04         2.53699E+04         2.03583E+03         4.46745E+03                   1
+          6.42277E-03         6.38512E-03        -2.19400E-03         4.03546E-01         6.20513E-01         1.97498E+04         2.39830E+04         1.92488E+03         4.23316E+03                   1
+          6.42277E-03         6.73499E-03        -2.33821E-03         4.03545E-01         6.42496E-01         1.87019E+04         2.27214E+04         1.82395E+03         4.01948E+03                   1
+          6.42277E-03         7.08486E-03        -2.49011E-03         4.03544E-01         6.64479E-01         1.77293E+04         2.15560E+04         1.73072E+03         3.82666E+03                   1
+          6.42277E-03         7.43473E-03        -2.64970E-03         4.03543E-01         6.86462E-01         1.68125E+04         2.04522E+04         1.64241E+03         3.63969E+03                   1
+          6.42277E-03         7.78460E-03        -2.81698E-03         4.03542E-01         7.08445E-01         1.59382E+04         1.93991E+04         1.55817E+03         3.46094E+03                   1
+          6.42277E-03         8.13447E-03        -2.99196E-03         4.03541E-01         7.30428E-01         1.50972E+04         1.83857E+04         1.47709E+03         3.28851E+03                   1
+          6.42277E-03         8.48434E-03        -3.17463E-03         4.03540E-01         7.52411E-01         1.42834E+04         1.74046E+04         1.39860E+03         3.12121E+03                   1
+          6.42277E-03         8.92168E-03        -3.41378E-03         4.03538E-01         7.79890E-01         1.32982E+04         1.62155E+04         1.30348E+03         2.91734E+03                   1
+          6.42277E-03         9.27154E-03        -3.61375E-03         4.03537E-01         8.01872E-01         1.25325E+04         1.52915E+04         1.22955E+03         2.75895E+03                   1
+          6.42277E-03         9.62141E-03        -3.82142E-03         4.03536E-01         8.23855E-01         1.17854E+04         1.43892E+04         1.15737E+03         2.60380E+03                   1
+          6.42277E-03         9.97128E-03        -4.03678E-03         4.03534E-01         8.45838E-01         1.10561E+04         1.35079E+04         1.08686E+03         2.45176E+03                   1
+          6.42277E-03         1.03211E-02        -4.25979E-03         4.03533E-01         8.67818E-01         1.03448E+04         1.26474E+04         1.01802E+03         2.30259E+03                   1
+          6.42277E-03         1.06710E-02        -4.49056E-03         4.03532E-01         8.89803E-01         9.65151E+03         1.18042E+04         9.50565E+02         2.15269E+03                   1
+          6.42277E-03         1.10209E-02        -4.72901E-03         4.03530E-01         9.11788E-01         8.97709E+03         1.09876E+04         8.85236E+02         2.01051E+03                   1
+          6.42277E-03         1.13708E-02        -4.97516E-03         4.03528E-01         9.33773E-01         8.32243E+03         1.01941E+04         8.21754E+02         1.87167E+03                   1
+          6.42277E-03         1.17206E-02        -5.22893E-03         4.03527E-01         9.55751E-01         7.68872E+03         9.42227E+03         7.60006E+02         1.73355E+03                   1
+          6.42277E-03         1.20705E-02        -5.49047E-03         4.03525E-01         9.77736E-01         7.07670E+03         8.67925E+03         7.00562E+02         1.60255E+03                   1
+          6.42277E-03         1.24204E-02        -5.75970E-03         4.03523E-01         9.99721E-01         6.48769E+03         7.96333E+03         6.43286E+02         1.47564E+03                   1
+          6.42277E-03         1.27702E-02        -6.03654E-03         4.03522E-01         1.02170E+00         5.92296E+03         7.27425E+03         5.88157E+02         1.35129E+03                   1
+          6.42277E-03         1.31201E-02        -6.32115E-03         4.03520E-01         1.04368E+00         5.38326E+03         6.61696E+03         5.35570E+02         1.23370E+03                   1
+          6.42277E-03         1.34700E-02        -6.61346E-03         4.03518E-01         1.06567E+00         4.86972E+03         5.98958E+03         4.85376E+02         1.11986E+03                   1
+          6.42277E-03         1.38198E-02        -6.91338E-03         4.03516E-01         1.08765E+00         4.38336E+03         5.39482E+03         4.37791E+02         1.01146E+03                   1
+          6.42277E-03         1.41697E-02        -7.22108E-03         4.03514E-01         1.10963E+00         3.92466E+03         4.83436E+03         3.92949E+02         9.09701E+02                   1
+          6.42277E-03         1.45196E-02        -7.53647E-03         4.03512E-01         1.13162E+00         3.49436E+03         4.30722E+03         3.50772E+02         8.12865E+02                   1
+          6.42277E-03         1.48694E-02        -7.85946E-03         4.03510E-01         1.15360E+00         3.09301E+03         3.81490E+03         3.11379E+02         7.21891E+02                   1
+          6.42277E-03         1.52193E-02        -8.19024E-03         4.03508E-01         1.17558E+00         2.72067E+03         3.35775E+03         2.74799E+02         6.37079E+02                   1
+          6.42277E-03         1.55692E-02        -8.52871E-03         4.03506E-01         1.19757E+00         2.37757E+03         2.93626E+03         2.41070E+02         5.58693E+02                   1
+          6.42277E-03         1.59190E-02        -8.87478E-03         4.03503E-01         1.21954E+00         2.06371E+03         2.54965E+03         2.10129E+02         4.85935E+02                   1
+          6.42277E-03         1.62689E-02        -9.22864E-03         4.03501E-01         1.24153E+00         1.77869E+03         2.19806E+03         1.81988E+02         4.19369E+02                   1
+          6.42277E-03         1.66188E-02        -9.59020E-03         4.03499E-01         1.26351E+00         1.52217E+03         1.88104E+03         1.56609E+02         3.58868E+02                   1
+          6.42277E-03         1.69687E-02        -9.95945E-03         4.03496E-01         1.28550E+00         1.29357E+03         1.59790E+03         1.33936E+02         3.04326E+02                   1
+          6.42277E-03         1.73185E-02        -1.03363E-02         4.03494E-01         1.30748E+00         1.09221E+03         1.34778E+03         1.13901E+02         2.55573E+02                   1
+          6.42277E-03         1.76684E-02        -1.07209E-02         4.03492E-01         1.32946E+00         9.17062E+02         1.12964E+03         9.64188E+01         2.12578E+02                   1
+          6.42277E-03         1.80183E-02        -1.11133E-02         4.03489E-01         1.35145E+00         7.67168E+02         9.42257E+02         8.13909E+01         1.75089E+02                   1
+          6.42277E-03         1.83681E-02        -1.15132E-02         4.03486E-01         1.37343E+00         6.41398E+02         7.84265E+02         6.87075E+01         1.42867E+02                   1
+          6.42277E-03         1.87180E-02        -1.19209E-02         4.03484E-01         1.39541E+00         5.38412E+02         6.54154E+02         5.82480E+01         1.15742E+02                   1
+          6.42277E-03         1.90679E-02        -1.23363E-02         4.03481E-01         1.41740E+00         4.56881E+02         5.50259E+02         4.98807E+01         9.33776E+01                   1
+          6.42277E-03         1.94178E-02        -1.27595E-02         4.03478E-01         1.43938E+00         3.95357E+02         4.70931E+02         4.34776E+01         7.55737E+01                   1
+          6.42277E-03         1.97676E-02        -1.31902E-02         4.03476E-01         1.46136E+00         3.52336E+02         4.14315E+02         3.88963E+01         6.19788E+01                   1
+          6.42277E-03         2.01175E-02        -1.36287E-02         4.03473E-01         1.48334E+00         3.26231E+02         3.78508E+02         3.59920E+01         5.22772E+01                   1
+          6.42277E-03         2.04674E-02        -1.40749E-02         4.03470E-01         1.50533E+00         3.15460E+02         3.61651E+02         3.46225E+01         4.61914E+01                   1
+          6.42277E-03         2.08172E-02        -1.45287E-02         4.03467E-01         1.52731E+00         3.18406E+02         3.61769E+02         3.46321E+01         4.33627E+01                   1
+          6.42277E-03         2.11671E-02        -1.49903E-02         4.03464E-01         1.54929E+00         3.33457E+02         3.76888E+02         3.58605E+01         4.34314E+01                   1
+          6.42277E-03         2.15170E-02        -1.54596E-02         4.03461E-01         1.57128E+00         3.59007E+02         4.05121E+02         3.81511E+01         4.61138E+01                   1
+          6.42277E-03         2.18669E-02        -1.59366E-02         4.03458E-01         1.59326E+00         3.93479E+02         4.44509E+02         4.13409E+01         5.10296E+01                   1
+          6.42277E-03         2.22167E-02        -1.64211E-02         4.03455E-01         1.61524E+00         4.35320E+02         4.93209E+02         4.52774E+01         5.78890E+01                   1
+          6.42277E-03         2.25666E-02        -1.69135E-02         4.03452E-01         1.63723E+00         4.83063E+02         5.49429E+02         4.98138E+01         6.63662E+01                   1
+          6.42277E-03         2.29165E-02        -1.74136E-02         4.03449E-01         1.65921E+00         5.35267E+02         6.11391E+02         5.48061E+01         7.61244E+01                   1
+          6.42277E-03         2.32663E-02        -1.79212E-02         4.03445E-01         1.68119E+00         5.90555E+02         6.77455E+02         6.01224E+01         8.68999E+01                   1
+          6.42277E-03         2.36162E-02        -1.84367E-02         4.03442E-01         1.70317E+00         6.47677E+02         7.46074E+02         6.56390E+01         9.83968E+01                   1
+          6.42277E-03         2.39661E-02        -1.89599E-02         4.03439E-01         1.72516E+00         7.05420E+02         8.15746E+02         7.12360E+01         1.10326E+02                   1
+          6.42277E-03         2.43160E-02        -1.94908E-02         4.03435E-01         1.74714E+00         7.62675E+02         8.85128E+02         7.68064E+01         1.22453E+02                   1
+          6.42277E-03         2.46658E-02        -2.00292E-02         4.03432E-01         1.76912E+00         8.18413E+02         9.52975E+02         8.22509E+01         1.34562E+02                   1
+          6.42277E-03         2.50157E-02        -2.05755E-02         4.03428E-01         1.79111E+00         8.71753E+02         1.01816E+03         8.74798E+01         1.46407E+02                   1
+          6.42277E-03         2.53656E-02        -2.11295E-02         4.03425E-01         1.81309E+00         9.21861E+02         1.07967E+03         9.24125E+01         1.57809E+02                   1
+          6.42277E-03         2.57155E-02        -2.16911E-02         4.03421E-01         1.83508E+00         9.68026E+02         1.13662E+03         9.69784E+01         1.68594E+02                   1
+          6.42277E-03         2.60653E-02        -2.22604E-02         4.03417E-01         1.85706E+00         1.00962E+03         1.18824E+03         1.01116E+02         1.78618E+02                   1
+          6.42277E-03         2.65027E-02        -2.29829E-02         4.03413E-01         1.88454E+00         1.05446E+03         1.24432E+03         1.05611E+02         1.89862E+02                   1
+          6.42277E-03         2.68525E-02        -2.35695E-02         4.03409E-01         1.90652E+00         1.08409E+03         1.28178E+03         1.08613E+02         1.97693E+02                   1
+          6.42277E-03         2.72024E-02        -2.41639E-02         4.03405E-01         1.92850E+00         1.10786E+03         1.31226E+03         1.11055E+02         2.04397E+02                   1
+          6.42277E-03         2.75523E-02        -2.47660E-02         4.03401E-01         1.95049E+00         1.12558E+03         1.33545E+03         1.12913E+02         2.09873E+02                   1
+          6.42277E-03         2.79022E-02        -2.53758E-02         4.03397E-01         1.97247E+00         1.13712E+03         1.35126E+03         1.14180E+02         2.14142E+02                   1
+          6.42277E-03         2.82520E-02        -2.59931E-02         4.03393E-01         1.99445E+00         1.14246E+03         1.35960E+03         1.14848E+02         2.17142E+02                   1
+          6.42277E-03         2.86019E-02        -2.66183E-02         4.03389E-01         2.01643E+00         1.14165E+03         1.36047E+03         1.14918E+02         2.18818E+02                   1
+          6.42277E-03         2.89518E-02        -2.72512E-02         4.03385E-01         2.03842E+00         1.13482E+03         1.35408E+03         1.14406E+02         2.19257E+02                   1
+          6.42277E-03         2.93016E-02        -2.78916E-02         4.03381E-01         2.06040E+00         1.12217E+03         1.34061E+03         1.13327E+02         2.18439E+02                   1
+          6.42277E-03         2.96515E-02        -2.85399E-02         4.03377E-01         2.08238E+00         1.10394E+03         1.32030E+03         1.11699E+02         2.16355E+02                   1
+          6.42277E-03         3.00014E-02        -2.91959E-02         4.03373E-01         2.10437E+00         1.08046E+03         1.29360E+03         1.09560E+02         2.13140E+02                   1
+          6.42277E-03         3.03513E-02        -2.98597E-02         4.03369E-01         2.12635E+00         1.05208E+03         1.26084E+03         1.06935E+02         2.08761E+02                   1
+          6.42277E-03         3.07011E-02        -3.05309E-02         4.03364E-01         2.14833E+00         1.01922E+03         1.22259E+03         1.03869E+02         2.03371E+02                   1
+          6.42277E-03         3.10510E-02        -3.12100E-02         4.03360E-01         2.17032E+00         9.82304E+02         1.17929E+03         1.00399E+02         1.96986E+02                   1
+          6.42277E-03         3.14009E-02        -3.18968E-02         4.03356E-01         2.19230E+00         9.41815E+02         1.13154E+03         9.65712E+01         1.89725E+02                   1
+          6.42277E-03         3.17507E-02        -3.25911E-02         4.03351E-01         2.21428E+00         8.98263E+02         1.07994E+03         9.24341E+01         1.81677E+02                   1
+          6.42277E-03         3.21006E-02        -3.32934E-02         4.03347E-01         2.23626E+00         8.52136E+02         1.02513E+03         8.80388E+01         1.72994E+02                   1
+          6.42277E-03         3.24505E-02        -3.40033E-02         4.03342E-01         2.25825E+00         8.03972E+02         9.67674E+02         8.34301E+01         1.63702E+02                   1
+          6.42277E-03         3.28003E-02        -3.47207E-02         4.03337E-01         2.28023E+00         7.54314E+02         9.08246E+02         7.86618E+01         1.53932E+02                   1
+          6.42277E-03         3.31502E-02        -3.54461E-02         4.03333E-01         2.30221E+00         7.03664E+02         8.47480E+02         7.37842E+01         1.43816E+02                   1
+          6.42277E-03         3.35001E-02        -3.61791E-02         4.03328E-01         2.32420E+00         6.52555E+02         7.86008E+02         6.88475E+01         1.33453E+02                   1
+          6.42277E-03         3.38499E-02        -3.69196E-02         4.03323E-01         2.34618E+00         6.01512E+02         7.24448E+02         6.39009E+01         1.22936E+02                   1
+          6.42277E-03         3.41998E-02        -3.76681E-02         4.03318E-01         2.36816E+00         5.50995E+02         6.63396E+02         5.89915E+01         1.12401E+02                   1
+          6.42277E-03         3.45496E-02        -3.84240E-02         4.03314E-01         2.39014E+00         5.01503E+02         6.03423E+02         5.41644E+01         1.01920E+02                   1
+          6.42277E-03         3.48995E-02        -3.91879E-02         4.03309E-01         2.41212E+00         4.53447E+02         5.45070E+02         4.94623E+01         9.16231E+01                   1
diff --git a/Tests/ReferenceData/IsGISAXS/ex-15/SSCA-25.out b/Tests/ReferenceData/IsGISAXS/ex-15/SSCA-25.out
new file mode 100755
index 0000000..9d98655
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-15/SSCA-25.out
@@ -0,0 +1,22583 @@
+#================================================================================================
+#                                     GISAXS OUTPUT FILE
+#================================================================================================
+# Date and time :                                   Wed Apr 30 22:15:53 2008
+# Input filename :                                  C:\Documents and Settings\Lazzari\Mes documents\Fortran\IsGISAXS\IsGISAXS_new\examples\ex-15\SSCA.inp
+# Base filename :                                   SSCA
+# Type of calculation :                             simulation
+# Ewald construction :                               T
+# Framework :                                       BA                            
+# Treatment of the diffuse scattering :             SSCA                          
+# Multilayer wavefields (Parratt-like) :                0
+# Required number of slices  :                         25
+# Actual number of slices in z  :                      14
+# Grid sizes (#) and limits (deg) :                   150  150    5.00000E-02    1.50000E+00    5.00000E-02    1.50000E+00
+#=====================================Beam and substrate parameters==============================
+# Incident and scattered beam polarizations :       ss
+# Distribution of wavelength :                      none                          
+# Wl0 - sigWl/Wl - FWHM-Wl (nm) :                       1.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Wl (nm), width and # of points :            1.00000E-01    1.00000E-01    0.00000E+00    1
+# Distribution of incident angle :                  none                          
+# Alphai - sigAlphai - FWHM-Ai (deg) :                  2.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Alphai (deg), width and # of points :       2.00000E-01    2.00000E-01    0.00000E+00    1
+# Distribution of 2Theta incident angle :           none                          
+# 2Thetai - sig2Thetai - FWHM (deg) :                   0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of 2Thetai (deg), width and # of points:       0.00000E+00    0.00000E+00    0.00000E+00    1
+# Substrate index of refraction (delta,beta):           6.00000E-06    2.00000E-08
+# Particle index of refraction (delta,beta):            6.00000E-04    2.00000E-08
+# Substrate roughness (nm) :                            0.00000E+00
+# Layer thickness (nm) :                                0.00000E+00
+# Layer index of refraction (delta,beta) :              1.00000E-05    5.00000E-07
+# Depth for the buried particle layer (nm):             0.00000E+00
+# Shell index of refraction (delta,beta) :              8.00000E-04    2.00000E-08
+#========================================Particle parameters=====================================
+# Number of different particle type :                  1
+#-------------------------------------------------------------------------------------------------
+# Angle between base and facets (deg) :                 5.47300E+01
+# Ratio between height for a cubooctahedron :           1.00000E+00
+# Flattening parameter of spheroid :                    1.00000E+00
+# Truncation parameters :                               8.00000E-01    8.00000E-01
+# Particle shell thickness dR-dH-dW(nnm) :              0.00000E+00    0.00000E+00    0.00000E+00
+# H uncoupled :                                         F
+# W uncoupled :                                         F
+# Particle type - Probability :                      cylinder                          1.00000E+00
+# Distribution of radius R :                        gaussian                      
+# R0 - sigR/R0 - FWHM (nm) :                            5.00000E+00    2.50000E-01    2.94353E+00
+# Ranges of R (nm), width and # of points :             1.00000E-05    1.08871E+01    4.00000E+00   30
+# Distribution of height H :                        none                          
+# H0/R0 - sigH/H0 - FWHM - rho_H :                      1.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of H/H0, width and  # of points :              1.00000E+00    1.00000E+00    0.00000E+00    1
+# Distribution of height W :                        none                          
+# W0/R0 - sigW/W0 - FWHM - rho_W :                      1.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of W/W0, width and  # of points :              1.00000E+00    1.00000E+00    0.00000E+00    1
+# Distribution of orientations Z :                  none                          
+# Z0 - sigZ - FWHM (deg) :                              0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of Z (deg), width and # of points :            0.00000E+00    0.00000E+00    0.00000E+00    1
+#======================================Particle position parameters===============================
+# Distribution of particles :                       1DDL                          
+# Density of particles (nm-2) - L(nm) :                 4.44444E-03    1.50000E+01
+# Size-distance coupling parameter :                    4.02698E+00
+# Cut-off value for finite size effects :               1.00000E+03
+# Correlation function parameters (D,w,D1) :            1.50000E+01    5.00000E+00    2.50000E+01
+# Hard core parameters (eta, CxR, sigma(nm)) :          3.00000E-01    1.00000E+00    1.00002E+01
+# Statistical distribution  :                       gau                           
+# Pseudo Voigt parameter :                              5.00000E-01
+#=========================================Derived parameters======================================
+# Mean wavelength (nm) :                                1.00000E-01
+# Mean incident angle Alphai (deg) :                    2.00000E-01
+# Mean incident angle 2Thetai (deg) :                   0.00000E+00
+# Mean radius (nm) :                                    5.00008E+00
+# Mean gyration radius (nm) :                           5.00008E+00
+# Mean height (nm) :                                    5.00008E+00
+# Mean width (nm) :                                     5.00008E+00
+# Mean height aspect ratio :                            1.00000E+00
+# Mean width aspect ratio :                             1.00000E+00
+# Mean volumes 
+, Sqrt(<V^2>) (nm^3) :                4.66335E+02    5.71361E+02
+# Mean particle orientationn (deg) :                    0.00000E+00
+# Coverage :                                            3.70887E-01
+# Mean thickness (nm) :                                 2.07260E+00
+# Magic size coupling parameter :                       4.02698E+00
+ 
+#==========================================Data file============================================
+#       Sin(twotheta)         Sin(alphaf)            Qx(nm-1)            Qy(nm-1)            Qz(nm-1)          Qpar(nm-1)              GISAXS               IntFU    Structure factor              MFF(1)              MFF(2)  Diffuse Scattering
+          8.72665E-04         8.72665E-04         3.34944E-04         5.48311E-02         2.74155E-01         5.48321E-02         6.07117E+03         5.74522E-01         2.19346E+04         3.40965E+04         2.34096E+04         1.06870E+04
+          8.72665E-04         1.04249E-03         3.24726E-04         5.48311E-02         2.84826E-01         5.48321E-02         5.97366E+03         5.74522E-01         2.14973E+04         3.33493E+04         2.29413E+04         1.04080E+04
+          8.72665E-04         1.21232E-03         3.12696E-04         5.48311E-02         2.95496E-01         5.48320E-02         5.87436E+03         5.74523E-01         2.10515E+04         3.25891E+04         2.24639E+04         1.01252E+04
+          8.72665E-04         1.38215E-03         2.98854E-04         5.48311E-02         3.06167E-01         5.48319E-02         5.77348E+03         5.74523E-01         2.05979E+04         3.18173E+04         2.19782E+04         9.83911E+03
+          8.72665E-04         1.55197E-03         2.83199E-04         5.48311E-02         3.16838E-01         5.48318E-02         5.67117E+03         5.74523E-01         2.01373E+04         3.10353E+04         2.14850E+04         9.55034E+03
+          8.72665E-04         1.72180E-03         2.65733E-04         5.48310E-02         3.27508E-01         5.48317E-02         5.56763E+03         5.74523E-01         1.96705E+04         3.02446E+04         2.09851E+04         9.25951E+03
+          8.72665E-04         1.89163E-03         2.46454E-04         5.48310E-02         3.38179E-01         5.48316E-02         5.46303E+03         5.74524E-01         1.91983E+04         2.94467E+04         2.04795E+04         8.96722E+03
+          8.72665E-04         2.06146E-03         2.25363E-04         5.48310E-02         3.48849E-01         5.48315E-02         5.35755E+03         5.74524E-01         1.87214E+04         2.86429E+04         1.99689E+04         8.67407E+03
+          8.72665E-04         2.23128E-03         2.02460E-04         5.48310E-02         3.59520E-01         5.48314E-02         5.25135E+03         5.74524E-01         1.82407E+04         2.78348E+04         1.94541E+04         8.38065E+03
+          8.72665E-04         2.40111E-03         1.77745E-04         5.48310E-02         3.70190E-01         5.48313E-02         5.14461E+03         5.74525E-01         1.77569E+04         2.70236E+04         1.89361E+04         8.08754E+03
+          8.72665E-04         2.57094E-03         1.51218E-04         5.48309E-02         3.80861E-01         5.48312E-02         5.03751E+03         5.74525E-01         1.72707E+04         2.62109E+04         1.84155E+04         7.79531E+03
+          8.72665E-04         2.74077E-03         1.22878E-04         5.48309E-02         3.91532E-01         5.48311E-02         4.93020E+03         5.74525E-01         1.67830E+04         2.53978E+04         1.78933E+04         7.50451E+03
+          8.72665E-04         2.91059E-03         9.27264E-05         5.48309E-02         4.02202E-01         5.48310E-02         4.82285E+03         5.74525E-01         1.62944E+04         2.45859E+04         1.73703E+04         7.21567E+03
+          8.72665E-04         3.08042E-03         6.07625E-05         5.48309E-02         4.12873E-01         5.48309E-02         4.71562E+03         5.74525E-01         1.58057E+04         2.37764E+04         1.68471E+04         6.92932E+03
+          8.72665E-04         3.25025E-03         2.69864E-05         5.48308E-02         4.23543E-01         5.48308E-02         4.60865E+03         5.74526E-01         1.53177E+04         2.29705E+04         1.63246E+04         6.64596E+03
+          8.72665E-04         3.42008E-03        -8.60187E-06         5.48308E-02         4.34214E-01         5.48308E-02         4.50210E+03         5.74526E-01         1.48309E+04         2.21696E+04         1.58035E+04         6.36608E+03
+          8.72665E-04         3.58990E-03        -4.60023E-05         5.48308E-02         4.44884E-01         5.48308E-02         4.39611E+03         5.74526E-01         1.43462E+04         2.13748E+04         1.52846E+04         6.09013E+03
+          8.72665E-04         3.75973E-03        -8.52150E-05         5.48307E-02         4.55555E-01         5.48308E-02         4.29082E+03         5.74526E-01         1.38642E+04         2.05872E+04         1.47686E+04         5.81857E+03
+          8.72665E-04         3.92956E-03        -1.26240E-04         5.48307E-02         4.66225E-01         5.48309E-02         4.18636E+03         5.74526E-01         1.33854E+04         1.98080E+04         1.42562E+04         5.55181E+03
+          8.72665E-04         4.09939E-03        -1.69077E-04         5.48307E-02         4.76896E-01         5.48309E-02         4.08285E+03         5.74525E-01         1.29107E+04         1.90382E+04         1.37480E+04         5.29025E+03
+          8.72665E-04         4.26921E-03        -2.13726E-04         5.48306E-02         4.87567E-01         5.48310E-02         3.98042E+03         5.74525E-01         1.24405E+04         1.82790E+04         1.32447E+04         5.03426E+03
+          8.72665E-04         4.43904E-03        -2.60188E-04         5.48306E-02         4.98237E-01         5.48312E-02         3.87918E+03         5.74525E-01         1.19754E+04         1.75311E+04         1.27469E+04         4.78419E+03
+          8.72665E-04         4.60887E-03        -3.08461E-04         5.48305E-02         5.08908E-01         5.48314E-02         3.77923E+03         5.74524E-01         1.15160E+04         1.67956E+04         1.22553E+04         4.54035E+03
+          8.72665E-04         4.77869E-03        -3.58547E-04         5.48305E-02         5.19578E-01         5.48317E-02         3.68068E+03         5.74523E-01         1.10628E+04         1.60733E+04         1.17703E+04         4.30306E+03
+          8.72665E-04         4.94852E-03        -4.10445E-04         5.48305E-02         5.30249E-01         5.48320E-02         3.58362E+03         5.74523E-01         1.06164E+04         1.53651E+04         1.12925E+04         4.07257E+03
+          8.72665E-04         5.11835E-03        -4.64155E-04         5.48304E-02         5.40919E-01         5.48324E-02         3.48814E+03         5.74522E-01         1.01771E+04         1.46717E+04         1.08225E+04         3.84913E+03
+          8.72665E-04         5.28818E-03        -5.19678E-04         5.48304E-02         5.51590E-01         5.48328E-02         3.39431E+03         5.74520E-01         9.74554E+03         1.39937E+04         1.03607E+04         3.63296E+03
+          8.72665E-04         5.45800E-03        -5.77013E-04         5.48303E-02         5.62261E-01         5.48333E-02         3.30221E+03         5.74519E-01         9.32204E+03         1.33319E+04         9.90762E+03         3.42425E+03
+          8.72665E-04         5.62783E-03        -6.36160E-04         5.48303E-02         5.72931E-01         5.48340E-02         3.21191E+03         5.74518E-01         8.90700E+03         1.26867E+04         9.46359E+03         3.22315E+03
+          8.72665E-04         5.79766E-03        -6.97119E-04         5.48302E-02         5.83602E-01         5.48346E-02         3.12347E+03         5.74516E-01         8.50080E+03         1.20589E+04         9.02906E+03         3.02982E+03
+          8.72665E-04         5.96749E-03        -7.59890E-04         5.48302E-02         5.94272E-01         5.48354E-02         3.03693E+03         5.74514E-01         8.10378E+03         1.14487E+04         8.60437E+03         2.84436E+03
+          8.72665E-04         6.13731E-03        -8.24474E-04         5.48301E-02         6.04943E-01         5.48363E-02         2.95235E+03         5.74511E-01         7.71623E+03         1.08567E+04         8.18986E+03         2.66685E+03
+          8.72665E-04         6.30714E-03        -8.90870E-04         5.48300E-02         6.15613E-01         5.48373E-02         2.86976E+03         5.74509E-01         7.33845E+03         1.02832E+04         7.78582E+03         2.49736E+03
+          8.72665E-04         6.47697E-03        -9.59078E-04         5.48300E-02         6.26284E-01         5.48384E-02         2.78919E+03         5.74506E-01         6.97066E+03         9.72844E+03         7.39253E+03         2.33591E+03
+          8.72665E-04         6.64680E-03        -1.02910E-03         5.48299E-02         6.36955E-01         5.48396E-02         2.71068E+03         5.74503E-01         6.61311E+03         9.19273E+03         7.01021E+03         2.18252E+03
+          8.72665E-04         6.81662E-03        -1.10093E-03         5.48299E-02         6.47625E-01         5.48409E-02         2.63425E+03         5.74499E-01         6.26596E+03         8.67625E+03         6.63907E+03         2.03718E+03
+          8.72665E-04         6.98645E-03        -1.17458E-03         5.48298E-02         6.58296E-01         5.48424E-02         2.55989E+03         5.74496E-01         5.92940E+03         8.17914E+03         6.27929E+03         1.89985E+03
+          8.72665E-04         7.15628E-03        -1.25003E-03         5.48297E-02         6.68966E-01         5.48440E-02         2.48764E+03         5.74491E-01         5.60354E+03         7.70147E+03         5.93101E+03         1.77047E+03
+          8.72665E-04         7.32611E-03        -1.32730E-03         5.48297E-02         6.79637E-01         5.48457E-02         2.41748E+03         5.74487E-01         5.28849E+03         7.24329E+03         5.59434E+03         1.64895E+03
+          8.72665E-04         7.49593E-03        -1.40639E-03         5.48296E-02         6.90307E-01         5.48476E-02         2.34943E+03         5.74482E-01         4.98434E+03         6.80458E+03         5.26937E+03         1.53521E+03
+          8.72665E-04         7.66576E-03        -1.48728E-03         5.48295E-02         7.00978E-01         5.48497E-02         2.28346E+03         5.74476E-01         4.69114E+03         6.38527E+03         4.95615E+03         1.42911E+03
+          8.72665E-04         7.83559E-03        -1.56999E-03         5.48294E-02         7.11649E-01         5.48519E-02         2.21956E+03         5.74471E-01         4.40890E+03         5.98526E+03         4.65473E+03         1.33053E+03
+          8.72665E-04         8.00542E-03        -1.65451E-03         5.48294E-02         7.22319E-01         5.48543E-02         2.15773E+03         5.74464E-01         4.13763E+03         5.60438E+03         4.36508E+03         1.23930E+03
+          8.72665E-04         8.17524E-03        -1.74084E-03         5.48293E-02         7.32990E-01         5.48569E-02         2.09794E+03         5.74458E-01         3.87730E+03         5.24246E+03         4.08720E+03         1.15526E+03
+          8.72665E-04         8.34507E-03        -1.82898E-03         5.48292E-02         7.43660E-01         5.48597E-02         2.04016E+03         5.74450E-01         3.62786E+03         4.89924E+03         3.82103E+03         1.07821E+03
+          8.72665E-04         8.51490E-03        -1.91894E-03         5.48291E-02         7.54331E-01         5.48627E-02         1.98436E+03         5.74442E-01         3.38925E+03         4.57446E+03         3.56650E+03         1.00796E+03
+          8.72665E-04         8.68473E-03        -2.01070E-03         5.48291E-02         7.65001E-01         5.48659E-02         1.93052E+03         5.74434E-01         3.16136E+03         4.26780E+03         3.32351E+03         9.44288E+02
+          8.72665E-04         8.85455E-03        -2.10428E-03         5.48290E-02         7.75672E-01         5.48693E-02         1.87859E+03         5.74425E-01         2.94409E+03         3.97892E+03         3.09195E+03         8.86976E+02
+          8.72665E-04         9.02438E-03        -2.19968E-03         5.48289E-02         7.86343E-01         5.48730E-02         1.82854E+03         5.74416E-01         2.73729E+03         3.70745E+03         2.87166E+03         8.35786E+02
+          8.72665E-04         9.19421E-03        -2.29688E-03         5.48288E-02         7.97013E-01         5.48769E-02         1.78032E+03         5.74405E-01         2.54080E+03         3.45297E+03         2.66250E+03         7.90474E+02
+          8.72665E-04         9.36403E-03        -2.39590E-03         5.48287E-02         8.07684E-01         5.48810E-02         1.73390E+03         5.74395E-01         2.35446E+03         3.21506E+03         2.46428E+03         7.50787E+02
+          8.72665E-04         9.53386E-03        -2.49673E-03         5.48286E-02         8.18354E-01         5.48855E-02         1.68922E+03         5.74383E-01         2.17808E+03         2.99326E+03         2.27680E+03         7.16467E+02
+          8.72665E-04         9.70369E-03        -2.59937E-03         5.48285E-02         8.29025E-01         5.48901E-02         1.64625E+03         5.74371E-01         2.01143E+03         2.78710E+03         2.09985E+03         6.87249E+02
+          8.72665E-04         9.87352E-03        -2.70383E-03         5.48285E-02         8.39695E-01         5.48951E-02         1.60492E+03         5.74358E-01         1.85431E+03         2.59606E+03         1.93320E+03         6.62863E+02
+          8.72665E-04         1.00433E-02        -2.81010E-03         5.48284E-02         8.50366E-01         5.49003E-02         1.56519E+03         5.74344E-01         1.70647E+03         2.41964E+03         1.77660E+03         6.43039E+02
+          8.72665E-04         1.02132E-02        -2.91818E-03         5.48283E-02         8.61037E-01         5.49059E-02         1.52701E+03         5.74330E-01         1.56766E+03         2.25731E+03         1.62981E+03         6.27501E+02
+          8.72665E-04         1.03830E-02        -3.02807E-03         5.48282E-02         8.71707E-01         5.49117E-02         1.49032E+03         5.74315E-01         1.43762E+03         2.10852E+03         1.49255E+03         6.15975E+02
+          8.72665E-04         1.05528E-02        -3.13977E-03         5.48281E-02         8.82378E-01         5.49179E-02         1.45507E+03         5.74299E-01         1.31608E+03         1.97272E+03         1.36454E+03         6.08184E+02
+          8.72665E-04         1.07227E-02        -3.25329E-03         5.48280E-02         8.93048E-01         5.49244E-02         1.42122E+03         5.74282E-01         1.20274E+03         1.84935E+03         1.24549E+03         6.03856E+02
+          8.72665E-04         1.08925E-02        -3.36862E-03         5.48279E-02         9.03719E-01         5.49313E-02         1.38870E+03         5.74264E-01         1.09731E+03         1.73783E+03         1.13511E+03         6.02718E+02
+          8.72665E-04         1.10623E-02        -3.48576E-03         5.48278E-02         9.14389E-01         5.49385E-02         1.35746E+03         5.74245E-01         9.99506E+02         1.63760E+03         1.03310E+03         6.04500E+02
+          8.72665E-04         1.12321E-02        -3.60472E-03         5.48277E-02         9.25060E-01         5.49460E-02         1.32745E+03         5.74225E-01         9.09005E+02         1.54808E+03         9.39139E+02         6.08939E+02
+          8.72665E-04         1.14020E-02        -3.72548E-03         5.48276E-02         9.35731E-01         5.49540E-02         1.29862E+03         5.74205E-01         8.25500E+02         1.46869E+03         8.52919E+02         6.15772E+02
+          8.72665E-04         1.15718E-02        -3.84806E-03         5.48275E-02         9.46401E-01         5.49623E-02         1.27091E+03         5.74183E-01         7.48676E+02         1.39887E+03         7.74123E+02         6.24745E+02
+          8.72665E-04         1.17416E-02        -3.97245E-03         5.48273E-02         9.57072E-01         5.49711E-02         1.24428E+03         5.74160E-01         6.78219E+02         1.33804E+03         7.02429E+02         6.35610E+02
+          8.72665E-04         1.19114E-02        -4.09866E-03         5.48272E-02         9.67742E-01         5.49802E-02         1.21867E+03         5.74136E-01         6.13817E+02         1.28564E+03         6.37516E+02         6.48124E+02
+          8.72665E-04         1.20813E-02        -4.22668E-03         5.48271E-02         9.78413E-01         5.49898E-02         1.19403E+03         5.74112E-01         5.55162E+02         1.24111E+03         5.79061E+02         6.62053E+02
+          8.72665E-04         1.22511E-02        -4.35651E-03         5.48270E-02         9.89083E-01         5.49998E-02         1.17033E+03         5.74085E-01         5.01958E+02         1.20391E+03         5.26743E+02         6.77170E+02
+          8.72665E-04         1.24209E-02        -4.48815E-03         5.48269E-02         9.99754E-01         5.50103E-02         1.14750E+03         5.74058E-01         4.53919E+02         1.17350E+03         4.80241E+02         6.93259E+02
+          8.72665E-04         1.25908E-02        -4.62160E-03         5.48268E-02         1.01042E+00         5.50212E-02         1.12551E+03         5.74030E-01         4.10782E+02         1.14935E+03         4.39237E+02         7.10110E+02
+          8.72665E-04         1.27606E-02        -4.75687E-03         5.48267E-02         1.02110E+00         5.50326E-02         1.10432E+03         5.74000E-01         3.72304E+02         1.13094E+03         4.03416E+02         7.27525E+02
+          8.72665E-04         1.29304E-02        -4.89395E-03         5.48265E-02         1.03177E+00         5.50445E-02         1.08387E+03         5.73969E-01         3.38276E+02         1.11778E+03         3.72467E+02         7.45315E+02
+          8.72665E-04         1.31002E-02        -5.03284E-03         5.48264E-02         1.04244E+00         5.50569E-02         1.06413E+03         5.73937E-01         3.08520E+02         1.10938E+03         3.46082E+02         7.63300E+02
+          8.72665E-04         1.32701E-02        -5.17355E-03         5.48263E-02         1.05311E+00         5.50699E-02         1.04507E+03         5.73904E-01         2.82897E+02         1.10527E+03         3.23962E+02         7.81311E+02
+          8.72665E-04         1.34399E-02        -5.31607E-03         5.48262E-02         1.06378E+00         5.50833E-02         1.02664E+03         5.73869E-01         2.61300E+02         1.10500E+03         3.05811E+02         7.99191E+02
+          8.72665E-04         1.36097E-02        -5.46040E-03         5.48261E-02         1.07445E+00         5.50973E-02         1.00881E+03         5.73833E-01         2.43647E+02         1.10813E+03         2.91340E+02         8.16792E+02
+          8.72665E-04         1.37795E-02        -5.60654E-03         5.48259E-02         1.08512E+00         5.51118E-02         9.91545E+02         5.73795E-01         2.29863E+02         1.11425E+03         2.80268E+02         8.33978E+02
+          8.72665E-04         1.39494E-02        -5.75450E-03         5.48258E-02         1.09579E+00         5.51270E-02         9.74815E+02         5.73756E-01         2.19851E+02         1.12294E+03         2.72321E+02         8.50622E+02
+          8.72665E-04         1.41192E-02        -5.90427E-03         5.48257E-02         1.10646E+00         5.51427E-02         9.58590E+02         5.73715E-01         2.13472E+02         1.13384E+03         2.67235E+02         8.66609E+02
+          8.72665E-04         1.42890E-02        -6.05585E-03         5.48255E-02         1.11713E+00         5.51590E-02         9.42841E+02         5.73673E-01         2.10518E+02         1.14659E+03         2.64751E+02         8.81835E+02
+          8.72665E-04         1.44589E-02        -6.20924E-03         5.48254E-02         1.12780E+00         5.51759E-02         9.27542E+02         5.73629E-01         2.10711E+02         1.16083E+03         2.64623E+02         8.96206E+02
+          8.72665E-04         1.46287E-02        -6.36445E-03         5.48253E-02         1.13847E+00         5.51934E-02         9.12667E+02         5.73584E-01         2.13715E+02         1.17625E+03         2.66610E+02         9.09639E+02
+          8.72665E-04         1.47985E-02        -6.52147E-03         5.48251E-02         1.14914E+00         5.52116E-02         8.98194E+02         5.73537E-01         2.19157E+02         1.19254E+03         2.70485E+02         9.22060E+02
+          8.72665E-04         1.49683E-02        -6.68030E-03         5.48250E-02         1.15981E+00         5.52305E-02         8.84102E+02         5.73488E-01         2.26659E+02         1.20943E+03         2.76028E+02         9.33406E+02
+          8.72665E-04         1.51382E-02        -6.84094E-03         5.48248E-02         1.17048E+00         5.52500E-02         8.70370E+02         5.73438E-01         2.35859E+02         1.22665E+03         2.83028E+02         9.43624E+02
+          8.72665E-04         1.53080E-02        -7.00340E-03         5.48247E-02         1.18115E+00         5.52702E-02         8.56979E+02         5.73386E-01         2.46426E+02         1.24396E+03         2.91287E+02         9.52670E+02
+          8.72665E-04         1.54778E-02        -7.16767E-03         5.48246E-02         1.19182E+00         5.52911E-02         8.43913E+02         5.73332E-01         2.58066E+02         1.26112E+03         3.00615E+02         9.60509E+02
+          8.72665E-04         1.56476E-02        -7.33376E-03         5.48244E-02         1.20249E+00         5.53128E-02         8.31157E+02         5.73276E-01         2.70523E+02         1.27795E+03         3.10833E+02         9.67115E+02
+          8.72665E-04         1.58175E-02        -7.50165E-03         5.48243E-02         1.21317E+00         5.53351E-02         8.18695E+02         5.73218E-01         2.83576E+02         1.29424E+03         3.21771E+02         9.72471E+02
+          8.72665E-04         1.59873E-02        -7.67136E-03         5.48241E-02         1.22384E+00         5.53582E-02         8.06514E+02         5.73159E-01         2.97034E+02         1.30984E+03         3.33272E+02         9.76567E+02
+          8.72665E-04         1.61571E-02        -7.84288E-03         5.48240E-02         1.23451E+00         5.53821E-02         7.94604E+02         5.73097E-01         3.10732E+02         1.32459E+03         3.45185E+02         9.79400E+02
+          8.72665E-04         1.63270E-02        -8.01622E-03         5.48238E-02         1.24518E+00         5.54068E-02         7.82952E+02         5.73034E-01         3.24524E+02         1.33835E+03         3.57374E+02         9.80978E+02
+          8.72665E-04         1.64968E-02        -8.19136E-03         5.48237E-02         1.25585E+00         5.54322E-02         7.71549E+02         5.72969E-01         3.38285E+02         1.35102E+03         3.69708E+02         9.81311E+02
+          8.72665E-04         1.66666E-02        -8.36832E-03         5.48235E-02         1.26652E+00         5.54585E-02         7.60387E+02         5.72901E-01         3.51904E+02         1.36249E+03         3.82069E+02         9.80418E+02
+          8.72665E-04         1.68364E-02        -8.54710E-03         5.48234E-02         1.27719E+00         5.54856E-02         7.49457E+02         5.72832E-01         3.65282E+02         1.37267E+03         3.94348E+02         9.78323E+02
+          8.72665E-04         1.70063E-02        -8.72768E-03         5.48232E-02         1.28786E+00         5.55136E-02         7.38752E+02         5.72760E-01         3.78332E+02         1.38150E+03         4.06443E+02         9.75056E+02
+          8.72665E-04         1.71761E-02        -8.91008E-03         5.48230E-02         1.29853E+00         5.55424E-02         7.28266E+02         5.72686E-01         3.90978E+02         1.38892E+03         4.18265E+02         9.70653E+02
+          8.72665E-04         1.73459E-02        -9.09430E-03         5.48229E-02         1.30920E+00         5.55721E-02         7.17994E+02         5.72610E-01         4.03153E+02         1.39488E+03         4.29731E+02         9.65151E+02
+          8.72665E-04         1.75158E-02        -9.28032E-03         5.48227E-02         1.31987E+00         5.56026E-02         7.07930E+02         5.72532E-01         4.14795E+02         1.39936E+03         4.40768E+02         9.58594E+02
+          8.72665E-04         1.76856E-02        -9.46816E-03         5.48226E-02         1.33054E+00         5.56341E-02         6.98069E+02         5.72452E-01         4.25855E+02         1.40234E+03         4.51310E+02         9.51029E+02
+          8.72665E-04         1.78554E-02        -9.65781E-03         5.48224E-02         1.34121E+00         5.56666E-02         6.88408E+02         5.72369E-01         4.36286E+02         1.40381E+03         4.61301E+02         9.42507E+02
+          8.72665E-04         1.80252E-02        -9.84927E-03         5.48222E-02         1.35188E+00         5.56999E-02         6.78943E+02         5.72284E-01         4.46052E+02         1.40377E+03         4.70690E+02         9.33079E+02
+          8.72665E-04         1.81951E-02        -1.00426E-02         5.48221E-02         1.36255E+00         5.57343E-02         6.69671E+02         5.72196E-01         4.55121E+02         1.40224E+03         4.79437E+02         9.22801E+02
+          8.72665E-04         1.83649E-02        -1.02376E-02         5.48219E-02         1.37322E+00         5.57696E-02         6.60589E+02         5.72106E-01         4.63466E+02         1.39923E+03         4.87504E+02         9.11730E+02
+          8.72665E-04         1.85347E-02        -1.04345E-02         5.48217E-02         1.38389E+00         5.58059E-02         6.51693E+02         5.72014E-01         4.71069E+02         1.39479E+03         4.94865E+02         8.99923E+02
+          8.72665E-04         1.87045E-02        -1.06333E-02         5.48215E-02         1.39457E+00         5.58432E-02         6.42982E+02         5.71919E-01         4.77915E+02         1.38894E+03         5.01496E+02         8.87441E+02
+          8.72665E-04         1.88744E-02        -1.08338E-02         5.48214E-02         1.40524E+00         5.58816E-02         6.34452E+02         5.71822E-01         4.83995E+02         1.38173E+03         5.07382E+02         8.74343E+02
+          8.72665E-04         1.90442E-02        -1.10361E-02         5.48212E-02         1.41591E+00         5.59210E-02         6.26103E+02         5.71722E-01         4.89302E+02         1.37320E+03         5.12513E+02         8.60690E+02
+          8.72665E-04         1.92140E-02        -1.12403E-02         5.48210E-02         1.42658E+00         5.59615E-02         6.17930E+02         5.71619E-01         4.93839E+02         1.36342E+03         5.16882E+02         8.46543E+02
+          8.72665E-04         1.93839E-02        -1.14463E-02         5.48208E-02         1.43725E+00         5.60030E-02         6.09933E+02         5.71514E-01         4.97607E+02         1.35245E+03         5.20489E+02         8.31961E+02
+          8.72665E-04         1.95537E-02        -1.16540E-02         5.48206E-02         1.44792E+00         5.60457E-02         6.02109E+02         5.71406E-01         5.00615E+02         1.34034E+03         5.23339E+02         8.17004E+02
+          8.72665E-04         1.97235E-02        -1.18636E-02         5.48205E-02         1.45859E+00         5.60895E-02         5.94455E+02         5.71296E-01         5.02875E+02         1.32717E+03         5.25439E+02         8.01730E+02
+          8.72665E-04         1.98933E-02        -1.20750E-02         5.48203E-02         1.46926E+00         5.61344E-02         5.86969E+02         5.71183E-01         5.04399E+02         1.31300E+03         5.26802E+02         7.86198E+02
+          8.72665E-04         2.00632E-02        -1.22883E-02         5.48201E-02         1.47993E+00         5.61805E-02         5.79650E+02         5.71067E-01         5.05206E+02         1.29791E+03         5.27443E+02         7.70463E+02
+          8.72665E-04         2.02330E-02        -1.25033E-02         5.48199E-02         1.49060E+00         5.62277E-02         5.72493E+02         5.70948E-01         5.05316E+02         1.28196E+03         5.27380E+02         7.54580E+02
+          8.72665E-04         2.04028E-02        -1.27201E-02         5.48197E-02         1.50127E+00         5.62761E-02         5.65498E+02         5.70826E-01         5.04751E+02         1.26524E+03         5.26636E+02         7.38601E+02
+          8.72665E-04         2.05726E-02        -1.29388E-02         5.48195E-02         1.51194E+00         5.63258E-02         5.58660E+02         5.70702E-01         5.03535E+02         1.24781E+03         5.25234E+02         7.22577E+02
+          8.72665E-04         2.07425E-02        -1.31593E-02         5.48193E-02         1.52261E+00         5.63766E-02         5.51978E+02         5.70574E-01         5.01696E+02         1.22976E+03         5.23200E+02         7.06558E+02
+          8.72665E-04         2.09123E-02        -1.33816E-02         5.48191E-02         1.53328E+00         5.64288E-02         5.45447E+02         5.70444E-01         4.99260E+02         1.21115E+03         5.20562E+02         6.90588E+02
+          8.72665E-04         2.10821E-02        -1.36057E-02         5.48189E-02         1.54395E+00         5.64821E-02         5.39066E+02         5.70310E-01         4.96257E+02         1.19206E+03         5.17351E+02         6.74712E+02
+          8.72665E-04         2.12520E-02        -1.38316E-02         5.48187E-02         1.55462E+00         5.65368E-02         5.32830E+02         5.70174E-01         4.92717E+02         1.17257E+03         5.13596E+02         6.58971E+02
+          8.72665E-04         2.14218E-02        -1.40593E-02         5.48185E-02         1.56529E+00         5.65927E-02         5.26736E+02         5.70035E-01         4.88672E+02         1.15273E+03         5.09330E+02         6.43404E+02
+          8.72665E-04         2.15916E-02        -1.42889E-02         5.48183E-02         1.57596E+00         5.66500E-02         5.20780E+02         5.69892E-01         4.84153E+02         1.13263E+03         5.04586E+02         6.28048E+02
+          8.72665E-04         2.17614E-02        -1.45202E-02         5.48181E-02         1.58664E+00         5.67086E-02         5.14960E+02         5.69747E-01         4.79193E+02         1.11233E+03         4.99398E+02         6.12936E+02
+          8.72665E-04         2.19313E-02        -1.47534E-02         5.48179E-02         1.59731E+00         5.67686E-02         5.09270E+02         5.69598E-01         4.73823E+02         1.09190E+03         4.93799E+02         5.98097E+02
+          8.72665E-04         2.21011E-02        -1.49884E-02         5.48177E-02         1.60798E+00         5.68299E-02         5.03708E+02         5.69446E-01         4.68078E+02         1.07138E+03         4.87822E+02         5.83562E+02
+          8.72665E-04         2.22709E-02        -1.52252E-02         5.48175E-02         1.61865E+00         5.68926E-02         4.98268E+02         5.69291E-01         4.61989E+02         1.05086E+03         4.81503E+02         5.69354E+02
+          8.72665E-04         2.24407E-02        -1.54638E-02         5.48173E-02         1.62932E+00         5.69567E-02         4.92947E+02         5.69133E-01         4.55588E+02         1.03037E+03         4.74874E+02         5.55497E+02
+          8.72665E-04         2.26106E-02        -1.57042E-02         5.48171E-02         1.63999E+00         5.70223E-02         4.87741E+02         5.68971E-01         4.48908E+02         1.00998E+03         4.67970E+02         5.42010E+02
+          8.72665E-04         2.27804E-02        -1.59464E-02         5.48169E-02         1.65066E+00         5.70892E-02         4.82644E+02         5.68806E-01         4.41979E+02         9.89733E+02         4.60822E+02         5.28911E+02
+          8.72665E-04         2.29502E-02        -1.61905E-02         5.48167E-02         1.66133E+00         5.71577E-02         4.77654E+02         5.68638E-01         4.34833E+02         9.69678E+02         4.53464E+02         5.16214E+02
+          8.72665E-04         2.31201E-02        -1.64363E-02         5.48165E-02         1.67200E+00         5.72276E-02         4.72765E+02         5.68467E-01         4.27498E+02         9.49859E+02         4.45926E+02         5.03933E+02
+          8.72665E-04         2.32899E-02        -1.66840E-02         5.48163E-02         1.68267E+00         5.72990E-02         4.67974E+02         5.68292E-01         4.20005E+02         9.30314E+02         4.38239E+02         4.92075E+02
+          8.72665E-04         2.34597E-02        -1.69335E-02         5.48160E-02         1.69334E+00         5.73720E-02         4.63274E+02         5.68113E-01         4.12382E+02         9.11082E+02         4.30432E+02         4.80650E+02
+          8.72665E-04         2.36295E-02        -1.71848E-02         5.48158E-02         1.70401E+00         5.74464E-02         4.58664E+02         5.67932E-01         4.04654E+02         8.92196E+02         4.22533E+02         4.69663E+02
+          8.72665E-04         2.37994E-02        -1.74379E-02         5.48156E-02         1.71468E+00         5.75224E-02         4.54137E+02         5.67747E-01         3.96849E+02         8.73686E+02         4.14571E+02         4.59116E+02
+          8.72665E-04         2.39692E-02        -1.76929E-02         5.48154E-02         1.72535E+00         5.76000E-02         4.49690E+02         5.67558E-01         3.88991E+02         8.55579E+02         4.06569E+02         4.49010E+02
+          8.72665E-04         2.41390E-02        -1.79496E-02         5.48152E-02         1.73602E+00         5.76792E-02         4.45318E+02         5.67366E-01         3.81104E+02         8.37899E+02         3.98554E+02         4.39345E+02
+          8.72665E-04         2.43088E-02        -1.82082E-02         5.48149E-02         1.74669E+00         5.77600E-02         4.41017E+02         5.67171E-01         3.73210E+02         8.20666E+02         3.90549E+02         4.30118E+02
+          8.72665E-04         2.44787E-02        -1.84685E-02         5.48147E-02         1.75736E+00         5.78424E-02         4.36784E+02         5.66971E-01         3.65331E+02         8.03898E+02         3.82574E+02         4.21324E+02
+          8.72665E-04         2.46485E-02        -1.87307E-02         5.48145E-02         1.76804E+00         5.79264E-02         4.32613E+02         5.66769E-01         3.57486E+02         7.87609E+02         3.74652E+02         4.12958E+02
+          8.72665E-04         2.48183E-02        -1.89947E-02         5.48142E-02         1.77871E+00         5.80121E-02         4.28502E+02         5.66563E-01         3.49694E+02         7.71811E+02         3.66800E+02         4.05012E+02
+          8.72665E-04         2.49882E-02        -1.92605E-02         5.48140E-02         1.78938E+00         5.80994E-02         4.24446E+02         5.66353E-01         3.41973E+02         7.56513E+02         3.59036E+02         3.97477E+02
+          8.72665E-04         2.51580E-02        -1.95282E-02         5.48138E-02         1.80005E+00         5.81885E-02         4.20442E+02         5.66139E-01         3.34339E+02         7.41721E+02         3.51378E+02         3.90343E+02
+          8.72665E-04         2.53278E-02        -1.97976E-02         5.48135E-02         1.81072E+00         5.82792E-02         4.16487E+02         5.65922E-01         3.26806E+02         7.27438E+02         3.43839E+02         3.83599E+02
+          8.72665E-04         2.54976E-02        -2.00689E-02         5.48133E-02         1.82139E+00         5.83717E-02         4.12576E+02         5.65702E-01         3.19388E+02         7.13666E+02         3.36433E+02         3.77234E+02
+          8.72665E-04         2.56675E-02        -2.03419E-02         5.48131E-02         1.83206E+00         5.84659E-02         4.08708E+02         5.65477E-01         3.12099E+02         7.00405E+02         3.29171E+02         3.71233E+02
+          8.72665E-04         2.58373E-02        -2.06168E-02         5.48128E-02         1.84273E+00         5.85619E-02         4.04878E+02         5.65249E-01         3.04948E+02         6.87650E+02         3.22066E+02         3.65584E+02
+          8.72665E-04         2.60071E-02        -2.08935E-02         5.48126E-02         1.85340E+00         5.86597E-02         4.01085E+02         5.65017E-01         2.97947E+02         6.75398E+02         3.15126E+02         3.60272E+02
+          8.72665E-04         2.61769E-02        -2.11720E-02         5.48123E-02         1.86407E+00         5.87592E-02         3.97325E+02         5.64782E-01         2.91105E+02         6.63642E+02         3.08360E+02         3.55282E+02
+          1.04249E-03         8.72665E-04         3.24726E-04         6.55017E-02         2.74155E-01         6.55025E-02         6.05929E+03         5.49890E-01         2.10966E+04         3.36389E+04         2.31487E+04         1.04902E+04
+          1.04249E-03         1.04249E-03         3.14508E-04         6.55017E-02         2.84826E-01         6.55024E-02         5.95487E+03         5.49890E-01         2.06770E+04         3.29030E+04         2.26860E+04         1.02169E+04
+          1.04249E-03         1.21232E-03         3.02478E-04         6.55017E-02         2.95496E-01         6.55023E-02         5.84868E+03         5.49890E-01         2.02492E+04         3.21542E+04         2.22143E+04         9.93983E+03
+          1.04249E-03         1.38215E-03         2.88636E-04         6.55016E-02         3.06167E-01         6.55023E-02         5.74094E+03         5.49890E-01         1.98139E+04         3.13939E+04         2.17344E+04         9.65949E+03
+          1.04249E-03         1.55197E-03         2.72981E-04         6.55016E-02         3.16838E-01         6.55022E-02         5.63183E+03         5.49890E-01         1.93719E+04         3.06236E+04         2.12471E+04         9.37653E+03
+          1.04249E-03         1.72180E-03         2.55515E-04         6.55016E-02         3.27508E-01         6.55021E-02         5.52157E+03         5.49891E-01         1.89239E+04         2.98448E+04         2.07532E+04         9.09154E+03
+          1.04249E-03         1.89163E-03         2.36236E-04         6.55016E-02         3.38179E-01         6.55020E-02         5.41036E+03         5.49891E-01         1.84708E+04         2.90587E+04         2.02536E+04         8.80511E+03
+          1.04249E-03         2.06146E-03         2.15145E-04         6.55016E-02         3.48849E-01         6.55019E-02         5.29838E+03         5.49891E-01         1.80131E+04         2.82669E+04         1.97491E+04         8.51782E+03
+          1.04249E-03         2.23128E-03         1.92242E-04         6.55015E-02         3.59520E-01         6.55018E-02         5.18585E+03         5.49891E-01         1.75517E+04         2.74707E+04         1.92405E+04         8.23026E+03
+          1.04249E-03         2.40111E-03         1.67527E-04         6.55015E-02         3.70190E-01         6.55017E-02         5.07294E+03         5.49891E-01         1.70874E+04         2.66716E+04         1.87286E+04         7.94299E+03
+          1.04249E-03         2.57094E-03         1.41000E-04         6.55015E-02         3.80861E-01         6.55016E-02         4.95984E+03         5.49892E-01         1.66207E+04         2.58708E+04         1.82142E+04         7.65656E+03
+          1.04249E-03         2.74077E-03         1.12660E-04         6.55015E-02         3.91532E-01         6.55016E-02         4.84675E+03         5.49892E-01         1.61526E+04         2.50697E+04         1.76982E+04         7.37152E+03
+          1.04249E-03         2.91059E-03         8.25085E-05         6.55014E-02         4.02202E-01         6.55015E-02         4.73383E+03         5.49892E-01         1.56836E+04         2.42696E+04         1.71813E+04         7.08839E+03
+          1.04249E-03         3.08042E-03         5.05446E-05         6.55014E-02         4.12873E-01         6.55014E-02         4.62127E+03         5.49892E-01         1.52146E+04         2.34719E+04         1.66642E+04         6.80769E+03
+          1.04249E-03         3.25025E-03         1.67685E-05         6.55014E-02         4.23543E-01         6.55014E-02         4.50922E+03         5.49892E-01         1.47461E+04         2.26778E+04         1.61479E+04         6.52990E+03
+          1.04249E-03         3.42008E-03        -1.88197E-05         6.55013E-02         4.34214E-01         6.55013E-02         4.39786E+03         5.49892E-01         1.42788E+04         2.18884E+04         1.56329E+04         6.25550E+03
+          1.04249E-03         3.58990E-03        -5.62202E-05         6.55013E-02         4.44884E-01         6.55013E-02         4.28734E+03         5.49892E-01         1.38135E+04         2.11050E+04         1.51201E+04         5.98495E+03
+          1.04249E-03         3.75973E-03        -9.54328E-05         6.55012E-02         4.55555E-01         6.55013E-02         4.17780E+03         5.49892E-01         1.33507E+04         2.03288E+04         1.46101E+04         5.71867E+03
+          1.04249E-03         3.92956E-03        -1.36458E-04         6.55012E-02         4.66225E-01         6.55013E-02         4.06939E+03         5.49892E-01         1.28911E+04         1.95607E+04         1.41036E+04         5.45709E+03
+          1.04249E-03         4.09939E-03        -1.79295E-04         6.55011E-02         4.76896E-01         6.55014E-02         3.96225E+03         5.49892E-01         1.24352E+04         1.88019E+04         1.36014E+04         5.20059E+03
+          1.04249E-03         4.26921E-03        -2.23944E-04         6.55011E-02         4.87567E-01         6.55015E-02         3.85650E+03         5.49892E-01         1.19838E+04         1.80534E+04         1.31039E+04         4.94953E+03
+          1.04249E-03         4.43904E-03        -2.70405E-04         6.55011E-02         4.98237E-01         6.55016E-02         3.75226E+03         5.49892E-01         1.15372E+04         1.73161E+04         1.26119E+04         4.70426E+03
+          1.04249E-03         4.60887E-03        -3.18679E-04         6.55010E-02         5.08908E-01         6.55018E-02         3.64964E+03         5.49891E-01         1.10960E+04         1.65910E+04         1.21259E+04         4.46509E+03
+          1.04249E-03         4.77869E-03        -3.68765E-04         6.55010E-02         5.19578E-01         6.55020E-02         3.54875E+03         5.49891E-01         1.06609E+04         1.58788E+04         1.16465E+04         4.23231E+03
+          1.04249E-03         4.94852E-03        -4.20663E-04         6.55009E-02         5.30249E-01         6.55022E-02         3.44968E+03         5.49890E-01         1.02321E+04         1.51804E+04         1.11742E+04         4.00618E+03
+          1.04249E-03         5.11835E-03        -4.74373E-04         6.55008E-02         5.40919E-01         6.55026E-02         3.35252E+03         5.49890E-01         9.81026E+03         1.44965E+04         1.07096E+04         3.78696E+03
+          1.04249E-03         5.28818E-03        -5.29896E-04         6.55008E-02         5.51590E-01         6.55029E-02         3.25736E+03         5.49889E-01         9.39573E+03         1.38279E+04         1.02531E+04         3.57485E+03
+          1.04249E-03         5.45800E-03        -5.87230E-04         6.55007E-02         5.62261E-01         6.55034E-02         3.16425E+03         5.49888E-01         8.98894E+03         1.31751E+04         9.80509E+03         3.37003E+03
+          1.04249E-03         5.62783E-03        -6.46377E-04         6.55007E-02         5.72931E-01         6.55039E-02         3.07327E+03         5.49887E-01         8.59026E+03         1.25388E+04         9.36610E+03         3.17267E+03
+          1.04249E-03         5.79766E-03        -7.07337E-04         6.55006E-02         5.83602E-01         6.55044E-02         2.98447E+03         5.49886E-01         8.20004E+03         1.19194E+04         8.93647E+03         2.98291E+03
+          1.04249E-03         5.96749E-03        -7.70108E-04         6.55005E-02         5.94272E-01         6.55051E-02         2.89790E+03         5.49885E-01         7.81860E+03         1.13174E+04         8.51656E+03         2.80085E+03
+          1.04249E-03         6.13731E-03        -8.34692E-04         6.55005E-02         6.04943E-01         6.55058E-02         2.81360E+03         5.49883E-01         7.44624E+03         1.07333E+04         8.10669E+03         2.62658E+03
+          1.04249E-03         6.30714E-03        -9.01088E-04         6.55004E-02         6.15613E-01         6.55066E-02         2.73159E+03         5.49881E-01         7.08323E+03         1.01673E+04         7.70716E+03         2.46015E+03
+          1.04249E-03         6.47697E-03        -9.69296E-04         6.55003E-02         6.26284E-01         6.55075E-02         2.65191E+03         5.49879E-01         6.72980E+03         9.61985E+03         7.31824E+03         2.30161E+03
+          1.04249E-03         6.64680E-03        -1.03932E-03         6.55003E-02         6.36955E-01         6.55085E-02         2.57457E+03         5.49877E-01         6.38616E+03         9.09112E+03         6.94016E+03         2.15096E+03
+          1.04249E-03         6.81662E-03        -1.11115E-03         6.55002E-02         6.47625E-01         6.55096E-02         2.49958E+03         5.49875E-01         6.05250E+03         8.58130E+03         6.57312E+03         2.00819E+03
+          1.04249E-03         6.98645E-03        -1.18479E-03         6.55001E-02         6.58296E-01         6.55108E-02         2.42695E+03         5.49873E-01         5.72897E+03         8.09055E+03         6.21729E+03         1.87326E+03
+          1.04249E-03         7.15628E-03        -1.26025E-03         6.55000E-02         6.68966E-01         6.55121E-02         2.35667E+03         5.49870E-01         5.41570E+03         7.61894E+03         5.87281E+03         1.74613E+03
+          1.04249E-03         7.32611E-03        -1.33752E-03         6.54999E-02         6.79637E-01         6.55136E-02         2.28873E+03         5.49867E-01         5.11279E+03         7.16650E+03         5.53981E+03         1.62670E+03
+          1.04249E-03         7.49593E-03        -1.41660E-03         6.54999E-02         6.90307E-01         6.55152E-02         2.22312E+03         5.49864E-01         4.82031E+03         6.73324E+03         5.21835E+03         1.51489E+03
+          1.04249E-03         7.66576E-03        -1.49750E-03         6.54998E-02         7.00978E-01         6.55169E-02         2.15981E+03         5.49860E-01         4.53832E+03         6.31908E+03         4.90851E+03         1.41057E+03
+          1.04249E-03         7.83559E-03        -1.58020E-03         6.54997E-02         7.11649E-01         6.55187E-02         2.09878E+03         5.49856E-01         4.26684E+03         5.92393E+03         4.61031E+03         1.31362E+03
+          1.04249E-03         8.00542E-03        -1.66472E-03         6.54996E-02         7.22319E-01         6.55208E-02         2.03999E+03         5.49852E-01         4.00586E+03         5.54763E+03         4.32376E+03         1.22387E+03
+          1.04249E-03         8.17524E-03        -1.75105E-03         6.54995E-02         7.32990E-01         6.55229E-02         1.98342E+03         5.49847E-01         3.75537E+03         5.18999E+03         4.04882E+03         1.14118E+03
+          1.04249E-03         8.34507E-03        -1.83920E-03         6.54994E-02         7.43660E-01         6.55252E-02         1.92902E+03         5.49843E-01         3.51531E+03         4.85079E+03         3.78545E+03         1.06534E+03
+          1.04249E-03         8.51490E-03        -1.92915E-03         6.54993E-02         7.54331E-01         6.55277E-02         1.87675E+03         5.49837E-01         3.28561E+03         4.52975E+03         3.53358E+03         9.96165E+02
+          1.04249E-03         8.68473E-03        -2.02092E-03         6.54992E-02         7.65001E-01         6.55304E-02         1.82655E+03         5.49832E-01         3.06619E+03         4.22657E+03         3.29312E+03         9.33450E+02
+          1.04249E-03         8.85455E-03        -2.11450E-03         6.54991E-02         7.75672E-01         6.55333E-02         1.77838E+03         5.49826E-01         2.85693E+03         3.94091E+03         3.06394E+03         8.76972E+02
+          1.04249E-03         9.02438E-03        -2.20990E-03         6.54990E-02         7.86343E-01         6.55363E-02         1.73218E+03         5.49820E-01         2.65769E+03         3.67241E+03         2.84591E+03         8.26501E+02
+          1.04249E-03         9.19421E-03        -2.30710E-03         6.54989E-02         7.97013E-01         6.55396E-02         1.68789E+03         5.49813E-01         2.46834E+03         3.42067E+03         2.63887E+03         7.81799E+02
+          1.04249E-03         9.36403E-03        -2.40612E-03         6.54988E-02         8.07684E-01         6.55430E-02         1.64546E+03         5.49806E-01         2.28869E+03         3.18526E+03         2.44264E+03         7.42619E+02
+          1.04249E-03         9.53386E-03        -2.50695E-03         6.54987E-02         8.18354E-01         6.55467E-02         1.60482E+03         5.49798E-01         2.11856E+03         2.96574E+03         2.25703E+03         7.08708E+02
+          1.04249E-03         9.70369E-03        -2.60959E-03         6.54986E-02         8.29025E-01         6.55506E-02         1.56592E+03         5.49790E-01         1.95776E+03         2.76164E+03         2.08183E+03         6.79808E+02
+          1.04249E-03         9.87352E-03        -2.71405E-03         6.54985E-02         8.39695E-01         6.55547E-02         1.52868E+03         5.49781E-01         1.80606E+03         2.57247E+03         1.91681E+03         6.55655E+02
+          1.04249E-03         1.00433E-02        -2.82031E-03         6.54984E-02         8.50366E-01         6.55591E-02         1.49305E+03         5.49772E-01         1.66323E+03         2.39772E+03         1.76173E+03         6.35982E+02
+          1.04249E-03         1.02132E-02        -2.92839E-03         6.54983E-02         8.61037E-01         6.55637E-02         1.45895E+03         5.49763E-01         1.52902E+03         2.23687E+03         1.61634E+03         6.20523E+02
+          1.04249E-03         1.03830E-02        -3.03829E-03         6.54982E-02         8.71707E-01         6.55686E-02         1.42633E+03         5.49753E-01         1.40319E+03         2.08938E+03         1.48038E+03         6.09006E+02
+          1.04249E-03         1.05528E-02        -3.14999E-03         6.54981E-02         8.82378E-01         6.55738E-02         1.39511E+03         5.49742E-01         1.28546E+03         1.95473E+03         1.35356E+03         6.01164E+02
+          1.04249E-03         1.07227E-02        -3.26351E-03         6.54979E-02         8.93048E-01         6.55792E-02         1.36523E+03         5.49731E-01         1.17556E+03         1.83234E+03         1.23561E+03         5.96727E+02
+          1.04249E-03         1.08925E-02        -3.37884E-03         6.54978E-02         9.03719E-01         6.55849E-02         1.33663E+03         5.49719E-01         1.07319E+03         1.72166E+03         1.12623E+03         5.95430E+02
+          1.04249E-03         1.10623E-02        -3.49598E-03         6.54977E-02         9.14389E-01         6.55909E-02         1.30923E+03         5.49706E-01         9.78070E+02         1.62213E+03         1.02512E+03         5.97008E+02
+          1.04249E-03         1.12321E-02        -3.61493E-03         6.54976E-02         9.25060E-01         6.55972E-02         1.28299E+03         5.49693E-01         8.89891E+02         1.53318E+03         9.31979E+02         6.01201E+02
+          1.04249E-03         1.14020E-02        -3.73570E-03         6.54974E-02         9.35731E-01         6.56039E-02         1.25783E+03         5.49679E-01         8.08350E+02         1.45425E+03         8.46495E+02         6.07755E+02
+          1.04249E-03         1.15718E-02        -3.85828E-03         6.54973E-02         9.46401E-01         6.56109E-02         1.23369E+03         5.49665E-01         7.33140E+02         1.38477E+03         7.68355E+02         6.16420E+02
+          1.04249E-03         1.17416E-02        -3.98267E-03         6.54972E-02         9.57072E-01         6.56182E-02         1.21052E+03         5.49650E-01         6.63953E+02         1.32419E+03         6.97242E+02         6.26951E+02
+          1.04249E-03         1.19114E-02        -4.10888E-03         6.54971E-02         9.67742E-01         6.56258E-02         1.18825E+03         5.49634E-01         6.00482E+02         1.27195E+03         6.32838E+02         6.39111E+02
+          1.04249E-03         1.20813E-02        -4.23689E-03         6.54969E-02         9.78413E-01         6.56338E-02         1.16684E+03         5.49617E-01         5.42429E+02         1.22750E+03         5.74826E+02         6.52671E+02
+          1.04249E-03         1.22511E-02        -4.36672E-03         6.54968E-02         9.89083E-01         6.56422E-02         1.14622E+03         5.49600E-01         4.89504E+02         1.19030E+03         5.22888E+02         6.67408E+02
+          1.04249E-03         1.24209E-02        -4.49837E-03         6.54966E-02         9.99754E-01         6.56509E-02         1.12635E+03         5.49582E-01         4.41433E+02         1.15982E+03         4.76707E+02         6.83109E+02
+          1.04249E-03         1.25908E-02        -4.63182E-03         6.54965E-02         1.01042E+00         6.56601E-02         1.10718E+03         5.49563E-01         3.97964E+02         1.13554E+03         4.35969E+02         6.99570E+02
+          1.04249E-03         1.27606E-02        -4.76709E-03         6.54964E-02         1.02110E+00         6.56696E-02         1.08865E+03         5.49543E-01         3.58873E+02         1.11696E+03         4.00363E+02         7.16594E+02
+          1.04249E-03         1.29304E-02        -4.90417E-03         6.54962E-02         1.03177E+00         6.56796E-02         1.07073E+03         5.49523E-01         3.23973E+02         1.10358E+03         3.69581E+02         7.33996E+02
+          1.04249E-03         1.31002E-02        -5.04306E-03         6.54961E-02         1.04244E+00         6.56899E-02         1.05337E+03         5.49501E-01         2.93122E+02         1.09492E+03         3.43321E+02         7.51600E+02
+          1.04249E-03         1.32701E-02        -5.18377E-03         6.54959E-02         1.05311E+00         6.57007E-02         1.03652E+03         5.49479E-01         2.66227E+02         1.09053E+03         3.21284E+02         7.69241E+02
+          1.04249E-03         1.34399E-02        -5.32628E-03         6.54958E-02         1.06378E+00         6.57120E-02         1.02016E+03         5.49455E-01         2.43248E+02         1.08994E+03         3.03180E+02         7.86763E+02
+          1.04249E-03         1.36097E-02        -5.47061E-03         6.54956E-02         1.07445E+00         6.57237E-02         1.00425E+03         5.49431E-01         2.24193E+02         1.09274E+03         2.88723E+02         8.04020E+02
+          1.04249E-03         1.37795E-02        -5.61676E-03         6.54955E-02         1.08512E+00         6.57359E-02         9.88750E+02         5.49406E-01         2.09090E+02         1.09851E+03         2.77636E+02         8.20878E+02
+          1.04249E-03         1.39494E-02        -5.76471E-03         6.54953E-02         1.09579E+00         6.57485E-02         9.73633E+02         5.49380E-01         1.97961E+02         1.10686E+03         2.69646E+02         8.37214E+02
+          1.04249E-03         1.41192E-02        -5.91448E-03         6.54952E-02         1.10646E+00         6.57617E-02         9.58870E+02         5.49353E-01         1.90767E+02         1.11741E+03         2.64493E+02         8.52914E+02
+          1.04249E-03         1.42890E-02        -6.06606E-03         6.54950E-02         1.11713E+00         6.57753E-02         9.44435E+02         5.49324E-01         1.87366E+02         1.12980E+03         2.61922E+02         8.67874E+02
+          1.04249E-03         1.44589E-02        -6.21946E-03         6.54949E-02         1.12780E+00         6.57895E-02         9.30304E+02         5.49295E-01         1.87491E+02         1.14369E+03         2.61689E+02         8.82003E+02
+          1.04249E-03         1.46287E-02        -6.37466E-03         6.54947E-02         1.13847E+00         6.58042E-02         9.16456E+02         5.49265E-01         1.90764E+02         1.15877E+03         2.63555E+02         8.95217E+02
+          1.04249E-03         1.47985E-02        -6.53168E-03         6.54945E-02         1.14914E+00         6.58194E-02         9.02871E+02         5.49233E-01         1.96736E+02         1.17474E+03         2.67296E+02         9.07445E+02
+          1.04249E-03         1.49683E-02        -6.69052E-03         6.54944E-02         1.15981E+00         6.58352E-02         8.89531E+02         5.49201E-01         2.04937E+02         1.19132E+03         2.72694E+02         9.18623E+02
+          1.04249E-03         1.51382E-02        -6.85116E-03         6.54942E-02         1.17048E+00         6.58516E-02         8.76421E+02         5.49167E-01         2.14925E+02         1.20824E+03         2.79541E+02         9.28700E+02
+          1.04249E-03         1.53080E-02        -7.01362E-03         6.54940E-02         1.18115E+00         6.58685E-02         8.63527E+02         5.49132E-01         2.26300E+02         1.22527E+03         2.87641E+02         9.37631E+02
+          1.04249E-03         1.54778E-02        -7.17789E-03         6.54939E-02         1.19182E+00         6.58860E-02         8.50837E+02         5.49096E-01         2.38723E+02         1.24219E+03         2.96805E+02         9.45381E+02
+          1.04249E-03         1.56476E-02        -7.34397E-03         6.54937E-02         1.20249E+00         6.59041E-02         8.38341E+02         5.49058E-01         2.51909E+02         1.25878E+03         3.06856E+02         9.51924E+02
+          1.04249E-03         1.58175E-02        -7.51187E-03         6.54935E-02         1.21317E+00         6.59229E-02         8.26030E+02         5.49019E-01         2.65618E+02         1.27487E+03         3.17627E+02         9.57244E+02
+          1.04249E-03         1.59873E-02        -7.68158E-03         6.54933E-02         1.22384E+00         6.59423E-02         8.13897E+02         5.48979E-01         2.79654E+02         1.29029E+03         3.28961E+02         9.61329E+02
+          1.04249E-03         1.61571E-02        -7.85310E-03         6.54931E-02         1.23451E+00         6.59623E-02         8.01937E+02         5.48938E-01         2.93849E+02         1.30489E+03         3.40710E+02         9.64177E+02
+          1.04249E-03         1.63270E-02        -8.02643E-03         6.54930E-02         1.24518E+00         6.59830E-02         7.90143E+02         5.48895E-01         3.08063E+02         1.31853E+03         3.52738E+02         9.65793E+02
+          1.04249E-03         1.64968E-02        -8.20158E-03         6.54928E-02         1.25585E+00         6.60043E-02         7.78514E+02         5.48851E-01         3.22175E+02         1.33110E+03         3.64915E+02         9.66189E+02
+          1.04249E-03         1.66666E-02        -8.37854E-03         6.54926E-02         1.26652E+00         6.60264E-02         7.67046E+02         5.48806E-01         3.36082E+02         1.34251E+03         3.77125E+02         9.65381E+02
+          1.04249E-03         1.68364E-02        -8.55731E-03         6.54924E-02         1.27719E+00         6.60491E-02         7.55738E+02         5.48759E-01         3.49692E+02         1.35265E+03         3.89258E+02         9.63394E+02
+          1.04249E-03         1.70063E-02        -8.73790E-03         6.54922E-02         1.28786E+00         6.60726E-02         7.44590E+02         5.48711E-01         3.62926E+02         1.36147E+03         4.01217E+02         9.60255E+02
+          1.04249E-03         1.71761E-02        -8.92030E-03         6.54920E-02         1.29853E+00         6.60967E-02         7.33601E+02         5.48661E-01         3.75716E+02         1.36891E+03         4.12909E+02         9.56000E+02
+          1.04249E-03         1.73459E-02        -9.10451E-03         6.54918E-02         1.30920E+00         6.61217E-02         7.22772E+02         5.48610E-01         3.87999E+02         1.37492E+03         4.24254E+02         9.50664E+02
+          1.04249E-03         1.75158E-02        -9.29054E-03         6.54917E-02         1.31987E+00         6.61473E-02         7.12104E+02         5.48557E-01         3.99724E+02         1.37947E+03         4.35179E+02         9.44292E+02
+          1.04249E-03         1.76856E-02        -9.47838E-03         6.54915E-02         1.33054E+00         6.61738E-02         7.01600E+02         5.48503E-01         4.10843E+02         1.38255E+03         4.45619E+02         9.36927E+02
+          1.04249E-03         1.78554E-02        -9.66803E-03         6.54913E-02         1.34121E+00         6.62010E-02         6.91260E+02         5.48447E-01         4.21318E+02         1.38414E+03         4.55517E+02         9.28620E+02
+          1.04249E-03         1.80252E-02        -9.85949E-03         6.54911E-02         1.35188E+00         6.62291E-02         6.81088E+02         5.48389E-01         4.31116E+02         1.38424E+03         4.64824E+02         9.19420E+02
+          1.04249E-03         1.81951E-02        -1.00528E-02         6.54909E-02         1.36255E+00         6.62579E-02         6.71086E+02         5.48330E-01         4.40210E+02         1.38288E+03         4.73498E+02         9.09383E+02
+          1.04249E-03         1.83649E-02        -1.02479E-02         6.54907E-02         1.37322E+00         6.62876E-02         6.61255E+02         5.48269E-01         4.48577E+02         1.38007E+03         4.81504E+02         8.98563E+02
+          1.04249E-03         1.85347E-02        -1.04448E-02         6.54904E-02         1.38389E+00         6.63181E-02         6.51600E+02         5.48206E-01         4.56201E+02         1.37583E+03         4.88813E+02         8.87018E+02
+          1.04249E-03         1.87045E-02        -1.06435E-02         6.54902E-02         1.39457E+00         6.63495E-02         6.42122E+02         5.48142E-01         4.63070E+02         1.37021E+03         4.95404E+02         8.74805E+02
+          1.04249E-03         1.88744E-02        -1.08440E-02         6.54900E-02         1.40524E+00         6.63817E-02         6.32823E+02         5.48076E-01         4.69177E+02         1.36324E+03         5.01259E+02         8.61983E+02
+          1.04249E-03         1.90442E-02        -1.10464E-02         6.54898E-02         1.41591E+00         6.64149E-02         6.23706E+02         5.48008E-01         4.74519E+02         1.35498E+03         5.06368E+02         8.48612E+02
+          1.04249E-03         1.92140E-02        -1.12505E-02         6.54896E-02         1.42658E+00         6.64489E-02         6.14774E+02         5.47938E-01         4.79098E+02         1.34548E+03         5.10726E+02         8.34751E+02
+          1.04249E-03         1.93839E-02        -1.14565E-02         6.54894E-02         1.43725E+00         6.64839E-02         6.06028E+02         5.47867E-01         4.82918E+02         1.33479E+03         5.14331E+02         8.20458E+02
+          1.04249E-03         1.95537E-02        -1.16643E-02         6.54892E-02         1.44792E+00         6.65198E-02         5.97469E+02         5.47793E-01         4.85988E+02         1.32298E+03         5.17189E+02         8.05793E+02
+          1.04249E-03         1.97235E-02        -1.18739E-02         6.54890E-02         1.45859E+00         6.65567E-02         5.89098E+02         5.47718E-01         4.88320E+02         1.31012E+03         5.19305E+02         7.90812E+02
+          1.04249E-03         1.98933E-02        -1.20853E-02         6.54887E-02         1.46926E+00         6.65945E-02         5.80918E+02         5.47641E-01         4.89929E+02         1.29627E+03         5.20693E+02         7.75572E+02
+          1.04249E-03         2.00632E-02        -1.22985E-02         6.54885E-02         1.47993E+00         6.66333E-02         5.72927E+02         5.47561E-01         4.90832E+02         1.28150E+03         5.21367E+02         7.60129E+02
+          1.04249E-03         2.02330E-02        -1.25135E-02         6.54883E-02         1.49060E+00         6.66731E-02         5.65127E+02         5.47480E-01         4.91049E+02         1.26588E+03         5.21345E+02         7.44535E+02
+          1.04249E-03         2.04028E-02        -1.27304E-02         6.54881E-02         1.50127E+00         6.67139E-02         5.57517E+02         5.47397E-01         4.90602E+02         1.24949E+03         5.20649E+02         7.28842E+02
+          1.04249E-03         2.05726E-02        -1.29490E-02         6.54878E-02         1.51194E+00         6.67558E-02         5.50096E+02         5.47312E-01         4.89516E+02         1.23240E+03         5.19302E+02         7.13101E+02
+          1.04249E-03         2.07425E-02        -1.31695E-02         6.54876E-02         1.52261E+00         6.67987E-02         5.42863E+02         5.47224E-01         4.87816E+02         1.21469E+03         5.17329E+02         6.97359E+02
+          1.04249E-03         2.09123E-02        -1.33918E-02         6.54874E-02         1.53328E+00         6.68426E-02         5.35818E+02         5.47135E-01         4.85529E+02         1.19642E+03         5.14759E+02         6.81661E+02
+          1.04249E-03         2.10821E-02        -1.36159E-02         6.54871E-02         1.54395E+00         6.68877E-02         5.28957E+02         5.47043E-01         4.82685E+02         1.17767E+03         5.11620E+02         6.66051E+02
+          1.04249E-03         2.12520E-02        -1.38418E-02         6.54869E-02         1.55462E+00         6.69338E-02         5.22278E+02         5.46949E-01         4.79312E+02         1.15851E+03         5.07943E+02         6.50570E+02
+          1.04249E-03         2.14218E-02        -1.40695E-02         6.54867E-02         1.56529E+00         6.69810E-02         5.15780E+02         5.46853E-01         4.75441E+02         1.13902E+03         5.03759E+02         6.35256E+02
+          1.04249E-03         2.15916E-02        -1.42991E-02         6.54864E-02         1.57596E+00         6.70294E-02         5.09458E+02         5.46755E-01         4.71104E+02         1.11925E+03         4.99101E+02         6.20145E+02
+          1.04249E-03         2.17614E-02        -1.45304E-02         6.54862E-02         1.58664E+00         6.70789E-02         5.03310E+02         5.46655E-01         4.66330E+02         1.09927E+03         4.94002E+02         6.05269E+02
+          1.04249E-03         2.19313E-02        -1.47636E-02         6.54859E-02         1.59731E+00         6.71295E-02         4.97331E+02         5.46552E-01         4.61152E+02         1.07915E+03         4.88495E+02         5.90659E+02
+          1.04249E-03         2.21011E-02        -1.49986E-02         6.54857E-02         1.60798E+00         6.71814E-02         4.91518E+02         5.46447E-01         4.55602E+02         1.05896E+03         4.82614E+02         5.76343E+02
+          1.04249E-03         2.22709E-02        -1.52354E-02         6.54855E-02         1.61865E+00         6.72344E-02         4.85865E+02         5.46340E-01         4.49710E+02         1.03874E+03         4.76392E+02         5.62346E+02
+          1.04249E-03         2.24407E-02        -1.54740E-02         6.54852E-02         1.62932E+00         6.72886E-02         4.80369E+02         5.46230E-01         4.43509E+02         1.01855E+03         4.69863E+02         5.48691E+02
+          1.04249E-03         2.26106E-02        -1.57144E-02         6.54850E-02         1.63999E+00         6.73441E-02         4.75025E+02         5.46118E-01         4.37028E+02         9.98455E+02         4.63059E+02         5.35396E+02
+          1.04249E-03         2.27804E-02        -1.59566E-02         6.54847E-02         1.65066E+00         6.74007E-02         4.69826E+02         5.46004E-01         4.30299E+02         9.78494E+02         4.56013E+02         5.22480E+02
+          1.04249E-03         2.29502E-02        -1.62007E-02         6.54844E-02         1.66133E+00         6.74587E-02         4.64769E+02         5.45887E-01         4.23352E+02         9.58715E+02         4.48757E+02         5.09958E+02
+          1.04249E-03         2.31201E-02        -1.64466E-02         6.54842E-02         1.67200E+00         6.75179E-02         4.59846E+02         5.45767E-01         4.16214E+02         9.39162E+02         4.41321E+02         4.97841E+02
+          1.04249E-03         2.32899E-02        -1.66942E-02         6.54839E-02         1.68267E+00         6.75784E-02         4.55054E+02         5.45645E-01         4.08914E+02         9.19875E+02         4.33736E+02         4.86139E+02
+          1.04249E-03         2.34597E-02        -1.69437E-02         6.54837E-02         1.69334E+00         6.76402E-02         4.50385E+02         5.45521E-01         4.01480E+02         9.00891E+02         4.26031E+02         4.74860E+02
+          1.04249E-03         2.36295E-02        -1.71950E-02         6.54834E-02         1.70401E+00         6.77034E-02         4.45834E+02         5.45394E-01         3.93938E+02         8.82244E+02         4.18234E+02         4.64010E+02
+          1.04249E-03         2.37994E-02        -1.74481E-02         6.54831E-02         1.71468E+00         6.77678E-02         4.41396E+02         5.45265E-01         3.86313E+02         8.63962E+02         4.10372E+02         4.53591E+02
+          1.04249E-03         2.39692E-02        -1.77031E-02         6.54829E-02         1.72535E+00         6.78337E-02         4.37064E+02         5.45132E-01         3.78629E+02         8.46074E+02         4.02469E+02         4.43605E+02
+          1.04249E-03         2.41390E-02        -1.79598E-02         6.54826E-02         1.73602E+00         6.79009E-02         4.32832E+02         5.44998E-01         3.70910E+02         8.28603E+02         3.94552E+02         4.34051E+02
+          1.04249E-03         2.43088E-02        -1.82184E-02         6.54823E-02         1.74669E+00         6.79695E-02         4.28695E+02         5.44860E-01         3.63177E+02         8.11570E+02         3.86642E+02         4.24928E+02
+          1.04249E-03         2.44787E-02        -1.84788E-02         6.54821E-02         1.75736E+00         6.80394E-02         4.24646E+02         5.44720E-01         3.55451E+02         7.94991E+02         3.78761E+02         4.16230E+02
+          1.04249E-03         2.46485E-02        -1.87409E-02         6.54818E-02         1.76804E+00         6.81109E-02         4.20680E+02         5.44577E-01         3.47752E+02         7.78882E+02         3.70931E+02         4.07952E+02
+          1.04249E-03         2.48183E-02        -1.90049E-02         6.54815E-02         1.77871E+00         6.81837E-02         4.16792E+02         5.44432E-01         3.40098E+02         7.63255E+02         3.63169E+02         4.00087E+02
+          1.04249E-03         2.49882E-02        -1.92708E-02         6.54812E-02         1.78938E+00         6.82580E-02         4.12975E+02         5.44284E-01         3.32506E+02         7.48119E+02         3.55493E+02         3.92626E+02
+          1.04249E-03         2.51580E-02        -1.95384E-02         6.54810E-02         1.80005E+00         6.83338E-02         4.09225E+02         5.44133E-01         3.24993E+02         7.33479E+02         3.47919E+02         3.85560E+02
+          1.04249E-03         2.53278E-02        -1.98078E-02         6.54807E-02         1.81072E+00         6.84110E-02         4.05536E+02         5.43979E-01         3.17573E+02         7.19340E+02         3.40462E+02         3.78878E+02
+          1.04249E-03         2.54976E-02        -2.00791E-02         6.54804E-02         1.82139E+00         6.84898E-02         4.01904E+02         5.43822E-01         3.10260E+02         7.05704E+02         3.33136E+02         3.72568E+02
+          1.04249E-03         2.56675E-02        -2.03522E-02         6.54801E-02         1.83206E+00         6.85701E-02         3.98322E+02         5.43663E-01         3.03066E+02         6.92571E+02         3.25952E+02         3.66618E+02
+          1.04249E-03         2.58373E-02        -2.06270E-02         6.54798E-02         1.84273E+00         6.86519E-02         3.94788E+02         5.43500E-01         2.96003E+02         6.79936E+02         3.18921E+02         3.61015E+02
+          1.04249E-03         2.60071E-02        -2.09037E-02         6.54795E-02         1.85340E+00         6.87353E-02         3.91296E+02         5.43335E-01         2.89082E+02         6.67797E+02         3.12053E+02         3.55744E+02
+          1.04249E-03         2.61769E-02        -2.11822E-02         6.54793E-02         1.86407E+00         6.88202E-02         3.87843E+02         5.43167E-01         2.82311E+02         6.56146E+02         3.05355E+02         3.50791E+02
+          1.21232E-03         8.72665E-04         3.12696E-04         7.61722E-02         2.74155E-01         7.61729E-02         6.26590E+03         5.29250E-01         2.01512E+04         3.31074E+04         2.28448E+04         1.02626E+04
+          1.21232E-03         1.04249E-03         3.02478E-04         7.61722E-02         2.84826E-01         7.61728E-02         6.14907E+03         5.29250E-01         1.97515E+04         3.23846E+04         2.23887E+04         9.99584E+03
+          1.21232E-03         1.21232E-03         2.90448E-04         7.61722E-02         2.95496E-01         7.61728E-02         6.03041E+03         5.29250E-01         1.93440E+04         3.16490E+04         2.19237E+04         9.72534E+03
+          1.21232E-03         1.38215E-03         2.76606E-04         7.61722E-02         3.06167E-01         7.61727E-02         5.91014E+03         5.29250E-01         1.89293E+04         3.09022E+04         2.14505E+04         9.45167E+03
+          1.21232E-03         1.55197E-03         2.60951E-04         7.61722E-02         3.16838E-01         7.61726E-02         5.78851E+03         5.29250E-01         1.85083E+04         3.01455E+04         2.09701E+04         9.17542E+03
+          1.21232E-03         1.72180E-03         2.43485E-04         7.61722E-02         3.27508E-01         7.61725E-02         5.66575E+03         5.29250E-01         1.80815E+04         2.93803E+04         2.04832E+04         8.89718E+03
+          1.21232E-03         1.89163E-03         2.24206E-04         7.61721E-02         3.38179E-01         7.61725E-02         5.54210E+03         5.29250E-01         1.76497E+04         2.86081E+04         1.99906E+04         8.61752E+03
+          1.21232E-03         2.06146E-03         2.03115E-04         7.61721E-02         3.48849E-01         7.61724E-02         5.41778E+03         5.29251E-01         1.72137E+04         2.78301E+04         1.94931E+04         8.33701E+03
+          1.21232E-03         2.23128E-03         1.80212E-04         7.61721E-02         3.59520E-01         7.61723E-02         5.29303E+03         5.29251E-01         1.67741E+04         2.70478E+04         1.89916E+04         8.05622E+03
+          1.21232E-03         2.40111E-03         1.55497E-04         7.61721E-02         3.70190E-01         7.61722E-02         5.16806E+03         5.29251E-01         1.63317E+04         2.62625E+04         1.84868E+04         7.77569E+03
+          1.21232E-03         2.57094E-03         1.28970E-04         7.61720E-02         3.80861E-01         7.61721E-02         5.04309E+03         5.29251E-01         1.58870E+04         2.54756E+04         1.79796E+04         7.49597E+03
+          1.21232E-03         2.74077E-03         1.00630E-04         7.61720E-02         3.91532E-01         7.61721E-02         4.91834E+03         5.29251E-01         1.54410E+04         2.46884E+04         1.74708E+04         7.21759E+03
+          1.21232E-03         2.91059E-03         7.04785E-05         7.61719E-02         4.02202E-01         7.61720E-02         4.79400E+03         5.29251E-01         1.49941E+04         2.39021E+04         1.69611E+04         6.94106E+03
+          1.21232E-03         3.08042E-03         3.85146E-05         7.61719E-02         4.12873E-01         7.61719E-02         4.67029E+03         5.29251E-01         1.45471E+04         2.31181E+04         1.64512E+04         6.66688E+03
+          1.21232E-03         3.25025E-03         4.73853E-06         7.61719E-02         4.23543E-01         7.61719E-02         4.54739E+03         5.29252E-01         1.41006E+04         2.23375E+04         1.59420E+04         6.39553E+03
+          1.21232E-03         3.42008E-03        -3.08497E-05         7.61718E-02         4.34214E-01         7.61718E-02         4.42549E+03         5.29252E-01         1.36553E+04         2.15616E+04         1.54342E+04         6.12748E+03
+          1.21232E-03         3.58990E-03        -6.82502E-05         7.61718E-02         4.44884E-01         7.61718E-02         4.30477E+03         5.29252E-01         1.32118E+04         2.07916E+04         1.49284E+04         5.86316E+03
+          1.21232E-03         3.75973E-03        -1.07463E-04         7.61717E-02         4.55555E-01         7.61718E-02         4.18539E+03         5.29252E-01         1.27707E+04         2.00284E+04         1.44254E+04         5.60300E+03
+          1.21232E-03         3.92956E-03        -1.48488E-04         7.61717E-02         4.66225E-01         7.61718E-02         4.06752E+03         5.29252E-01         1.23326E+04         1.92733E+04         1.39259E+04         5.34740E+03
+          1.21232E-03         4.09939E-03        -1.91325E-04         7.61716E-02         4.76896E-01         7.61719E-02         3.95130E+03         5.29252E-01         1.18981E+04         1.85272E+04         1.34305E+04         5.09675E+03
+          1.21232E-03         4.26921E-03        -2.35974E-04         7.61716E-02         4.87567E-01         7.61719E-02         3.83689E+03         5.29251E-01         1.14677E+04         1.77912E+04         1.29398E+04         4.85139E+03
+          1.21232E-03         4.43904E-03        -2.82435E-04         7.61715E-02         4.98237E-01         7.61720E-02         3.72441E+03         5.29251E-01         1.10419E+04         1.70662E+04         1.24545E+04         4.61167E+03
+          1.21232E-03         4.60887E-03        -3.30709E-04         7.61715E-02         5.08908E-01         7.61722E-02         3.61398E+03         5.29251E-01         1.06214E+04         1.63530E+04         1.19751E+04         4.37789E+03
+          1.21232E-03         4.77869E-03        -3.80795E-04         7.61714E-02         5.19578E-01         7.61724E-02         3.50573E+03         5.29251E-01         1.02064E+04         1.56526E+04         1.15022E+04         4.15033E+03
+          1.21232E-03         4.94852E-03        -4.32693E-04         7.61713E-02         5.30249E-01         7.61726E-02         3.39975E+03         5.29250E-01         9.79762E+03         1.49656E+04         1.10363E+04         3.92926E+03
+          1.21232E-03         5.11835E-03        -4.86403E-04         7.61713E-02         5.40919E-01         7.61728E-02         3.29613E+03         5.29250E-01         9.39535E+03         1.42929E+04         1.05780E+04         3.71492E+03
+          1.21232E-03         5.28818E-03        -5.41926E-04         7.61712E-02         5.51590E-01         7.61731E-02         3.19497E+03         5.29249E-01         9.00004E+03         1.36351E+04         1.01276E+04         3.50750E+03
+          1.21232E-03         5.45800E-03        -5.99260E-04         7.61711E-02         5.62261E-01         7.61735E-02         3.09634E+03         5.29249E-01         8.61208E+03         1.29928E+04         9.68559E+03         3.30719E+03
+          1.21232E-03         5.62783E-03        -6.58407E-04         7.61711E-02         5.72931E-01         7.61739E-02         3.00030E+03         5.29248E-01         8.23182E+03         1.23666E+04         9.25245E+03         3.11415E+03
+          1.21232E-03         5.79766E-03        -7.19366E-04         7.61710E-02         5.83602E-01         7.61744E-02         2.90690E+03         5.29247E-01         7.85960E+03         1.17571E+04         8.82853E+03         2.92852E+03
+          1.21232E-03         5.96749E-03        -7.82138E-04         7.61709E-02         5.94272E-01         7.61749E-02         2.81620E+03         5.29246E-01         7.49573E+03         1.11646E+04         8.41419E+03         2.75040E+03
+          1.21232E-03         6.13731E-03        -8.46722E-04         7.61708E-02         6.04943E-01         7.61755E-02         2.72822E+03         5.29245E-01         7.14048E+03         1.05896E+04         8.00973E+03         2.57987E+03
+          1.21232E-03         6.30714E-03        -9.13118E-04         7.61708E-02         6.15613E-01         7.61762E-02         2.64300E+03         5.29244E-01         6.79412E+03         1.00325E+04         7.61546E+03         2.41700E+03
+          1.21232E-03         6.47697E-03        -9.81326E-04         7.61707E-02         6.26284E-01         7.61770E-02         2.56054E+03         5.29242E-01         6.45687E+03         9.49345E+03         7.23163E+03         2.26182E+03
+          1.21232E-03         6.64680E-03        -1.05135E-03         7.61706E-02         6.36955E-01         7.61778E-02         2.48087E+03         5.29241E-01         6.12892E+03         8.97282E+03         6.85848E+03         2.11433E+03
+          1.21232E-03         6.81662E-03        -1.12318E-03         7.61705E-02         6.47625E-01         7.61788E-02         2.40398E+03         5.29239E-01         5.81046E+03         8.47075E+03         6.49621E+03         1.97454E+03
+          1.21232E-03         6.98645E-03        -1.19682E-03         7.61704E-02         6.58296E-01         7.61798E-02         2.32987E+03         5.29237E-01         5.50164E+03         7.98738E+03         6.14498E+03         1.84240E+03
+          1.21232E-03         7.15628E-03        -1.27228E-03         7.61703E-02         6.68966E-01         7.61809E-02         2.25851E+03         5.29235E-01         5.20256E+03         7.52281E+03         5.80494E+03         1.71787E+03
+          1.21232E-03         7.32611E-03        -1.34955E-03         7.61702E-02         6.79637E-01         7.61822E-02         2.18989E+03         5.29233E-01         4.91334E+03         7.07706E+03         5.47621E+03         1.60086E+03
+          1.21232E-03         7.49593E-03        -1.42863E-03         7.61701E-02         6.90307E-01         7.61835E-02         2.12397E+03         5.29230E-01         4.63404E+03         6.65014E+03         5.15885E+03         1.49128E+03
+          1.21232E-03         7.66576E-03        -1.50953E-03         7.61700E-02         7.00978E-01         7.61850E-02         2.06073E+03         5.29228E-01         4.36470E+03         6.24197E+03         4.85294E+03         1.38903E+03
+          1.21232E-03         7.83559E-03        -1.59223E-03         7.61699E-02         7.11649E-01         7.61866E-02         2.00011E+03         5.29225E-01         4.10535E+03         5.85247E+03         4.55851E+03         1.29397E+03
+          1.21232E-03         8.00542E-03        -1.67675E-03         7.61698E-02         7.22319E-01         7.61883E-02         1.94208E+03         5.29222E-01         3.85600E+03         5.48149E+03         4.27554E+03         1.20595E+03
+          1.21232E-03         8.17524E-03        -1.76308E-03         7.61697E-02         7.32990E-01         7.61901E-02         1.88657E+03         5.29218E-01         3.61661E+03         5.12884E+03         4.00404E+03         1.12481E+03
+          1.21232E-03         8.34507E-03        -1.85123E-03         7.61696E-02         7.43660E-01         7.61921E-02         1.83353E+03         5.29215E-01         3.38714E+03         4.79431E+03         3.74393E+03         1.05038E+03
+          1.21232E-03         8.51490E-03        -1.94118E-03         7.61695E-02         7.54331E-01         7.61942E-02         1.78289E+03         5.29211E-01         3.16752E+03         4.47762E+03         3.49517E+03         9.82456E+02
+          1.21232E-03         8.68473E-03        -2.03295E-03         7.61694E-02         7.65001E-01         7.61965E-02         1.73459E+03         5.29207E-01         2.95766E+03         4.17849E+03         3.25764E+03         9.20848E+02
+          1.21232E-03         8.85455E-03        -2.12653E-03         7.61693E-02         7.75672E-01         7.61990E-02         1.68856E+03         5.29202E-01         2.75746E+03         3.89659E+03         3.03125E+03         8.65339E+02
+          1.21232E-03         9.02438E-03        -2.22192E-03         7.61692E-02         7.86343E-01         7.62016E-02         1.64472E+03         5.29198E-01         2.56679E+03         3.63155E+03         2.81585E+03         8.15704E+02
+          1.21232E-03         9.19421E-03        -2.31913E-03         7.61691E-02         7.97013E-01         7.62043E-02         1.60300E+03         5.29193E-01         2.38550E+03         3.38299E+03         2.61128E+03         7.71712E+02
+          1.21232E-03         9.36403E-03        -2.41815E-03         7.61689E-02         8.07684E-01         7.62073E-02         1.56332E+03         5.29187E-01         2.21344E+03         3.15050E+03         2.41738E+03         7.33122E+02
+          1.21232E-03         9.53386E-03        -2.51898E-03         7.61688E-02         8.18354E-01         7.62104E-02         1.52560E+03         5.29181E-01         2.05041E+03         2.93364E+03         2.23395E+03         6.99689E+02
+          1.21232E-03         9.70369E-03        -2.62162E-03         7.61687E-02         8.29025E-01         7.62138E-02         1.48975E+03         5.29175E-01         1.89623E+03         2.73195E+03         2.06079E+03         6.71159E+02
+          1.21232E-03         9.87352E-03        -2.72608E-03         7.61686E-02         8.39695E-01         7.62173E-02         1.45569E+03         5.29169E-01         1.75069E+03         2.54495E+03         1.89768E+03         6.47277E+02
+          1.21232E-03         1.00433E-02        -2.83234E-03         7.61684E-02         8.50366E-01         7.62211E-02         1.42335E+03         5.29162E-01         1.61356E+03         2.37215E+03         1.74437E+03         6.27784E+02
+          1.21232E-03         1.02132E-02        -2.94042E-03         7.61683E-02         8.61037E-01         7.62250E-02         1.39263E+03         5.29155E-01         1.48461E+03         2.21303E+03         1.60061E+03         6.12418E+02
+          1.21232E-03         1.03830E-02        -3.05031E-03         7.61682E-02         8.71707E-01         7.62292E-02         1.36345E+03         5.29147E-01         1.36359E+03         2.06708E+03         1.46616E+03         6.00917E+02
+          1.21232E-03         1.05528E-02        -3.16202E-03         7.61680E-02         8.82378E-01         7.62336E-02         1.33573E+03         5.29139E-01         1.25024E+03         1.93375E+03         1.34074E+03         5.93017E+02
+          1.21232E-03         1.07227E-02        -3.27554E-03         7.61679E-02         8.93048E-01         7.62383E-02         1.30938E+03         5.29131E-01         1.14429E+03         1.81252E+03         1.22406E+03         5.88457E+02
+          1.21232E-03         1.08925E-02        -3.39087E-03         7.61678E-02         9.03719E-01         7.62432E-02         1.28432E+03         5.29122E-01         1.04546E+03         1.70282E+03         1.11585E+03         5.86977E+02
+          1.21232E-03         1.10623E-02        -3.50801E-03         7.61676E-02         9.14389E-01         7.62483E-02         1.26048E+03         5.29113E-01         9.53473E+02         1.60412E+03         1.01580E+03         5.88321E+02
+          1.21232E-03         1.12321E-02        -3.62696E-03         7.61675E-02         9.25060E-01         7.62538E-02         1.23777E+03         5.29103E-01         8.68026E+02         1.51584E+03         9.23611E+02         5.92233E+02
+          1.21232E-03         1.14020E-02        -3.74773E-03         7.61673E-02         9.35731E-01         7.62595E-02         1.21612E+03         5.29092E-01         7.88826E+02         1.43745E+03         8.38986E+02         5.98466E+02
+          1.21232E-03         1.15718E-02        -3.87031E-03         7.61672E-02         9.46401E-01         7.62654E-02         1.19545E+03         5.29082E-01         7.15575E+02         1.36839E+03         7.61612E+02         6.06774E+02
+          1.21232E-03         1.17416E-02        -3.99470E-03         7.61670E-02         9.57072E-01         7.62717E-02         1.17569E+03         5.29070E-01         6.47972E+02         1.30810E+03         6.91178E+02         6.16921E+02
+          1.21232E-03         1.19114E-02        -4.12091E-03         7.61669E-02         9.67742E-01         7.62783E-02         1.15677E+03         5.29058E-01         5.85719E+02         1.25604E+03         6.27370E+02         6.28673E+02
+          1.21232E-03         1.20813E-02        -4.24892E-03         7.61667E-02         9.78413E-01         7.62851E-02         1.13862E+03         5.29046E-01         5.28525E+02         1.21168E+03         5.69877E+02         6.41806E+02
+          1.21232E-03         1.22511E-02        -4.37875E-03         7.61666E-02         9.89083E-01         7.62923E-02         1.12118E+03         5.29033E-01         4.76108E+02         1.17449E+03         5.18383E+02         6.56104E+02
+          1.21232E-03         1.24209E-02        -4.51039E-03         7.61664E-02         9.99754E-01         7.62998E-02         1.10439E+03         5.29019E-01         4.28201E+02         1.14394E+03         4.72578E+02         6.71357E+02
+          1.21232E-03         1.25908E-02        -4.64385E-03         7.61662E-02         1.01042E+00         7.63077E-02         1.08819E+03         5.29005E-01         3.84561E+02         1.11952E+03         4.32152E+02         6.87365E+02
+          1.21232E-03         1.27606E-02        -4.77912E-03         7.61661E-02         1.02110E+00         7.63159E-02         1.07251E+03         5.28990E-01         3.44973E+02         1.10074E+03         3.96798E+02         7.03937E+02
+          1.21232E-03         1.29304E-02        -4.91620E-03         7.61659E-02         1.03177E+00         7.63244E-02         1.05732E+03         5.28975E-01         3.09265E+02         1.08710E+03         3.66214E+02         7.20891E+02
+          1.21232E-03         1.31002E-02        -5.05509E-03         7.61657E-02         1.04244E+00         7.63333E-02         1.04256E+03         5.28958E-01         2.77315E+02         1.07815E+03         3.40099E+02         7.38055E+02
+          1.21232E-03         1.32701E-02        -5.19579E-03         7.61656E-02         1.05311E+00         7.63426E-02         1.02819E+03         5.28942E-01         2.49064E+02         1.07343E+03         3.18162E+02         7.55266E+02
+          1.21232E-03         1.34399E-02        -5.33831E-03         7.61654E-02         1.06378E+00         7.63522E-02         1.01416E+03         5.28924E-01         2.24529E+02         1.07249E+03         3.00115E+02         7.72372E+02
+          1.21232E-03         1.36097E-02        -5.48264E-03         7.61652E-02         1.07445E+00         7.63623E-02         1.00044E+03         5.28906E-01         2.03803E+02         1.07491E+03         2.85675E+02         7.89231E+02
+          1.21232E-03         1.37795E-02        -5.62879E-03         7.61650E-02         1.08512E+00         7.63727E-02         9.86980E+02         5.28887E-01         1.87041E+02         1.08028E+03         2.74570E+02         8.05710E+02
+          1.21232E-03         1.39494E-02        -5.77674E-03         7.61649E-02         1.09579E+00         7.63836E-02         9.73760E+02         5.28867E-01         1.74421E+02         1.08822E+03         2.66533E+02         8.21688E+02
+          1.21232E-03         1.41192E-02        -5.92651E-03         7.61647E-02         1.10646E+00         7.63949E-02         9.60746E+02         5.28847E-01         1.66072E+02         1.09836E+03         2.61304E+02         8.37054E+02
+          1.21232E-03         1.42890E-02        -6.07809E-03         7.61645E-02         1.11713E+00         7.64066E-02         9.47911E+02         5.28826E-01         1.61979E+02         1.11034E+03         2.58632E+02         8.51705E+02
+          1.21232E-03         1.44589E-02        -6.23149E-03         7.61643E-02         1.12780E+00         7.64188E-02         9.35232E+02         5.28803E-01         1.61922E+02         1.12383E+03         2.58276E+02         8.65551E+02
+          1.21232E-03         1.46287E-02        -6.38669E-03         7.61641E-02         1.13847E+00         7.64314E-02         9.22689E+02         5.28781E-01         1.65476E+02         1.13851E+03         2.60003E+02         8.78511E+02
+          1.21232E-03         1.47985E-02        -6.54371E-03         7.61639E-02         1.14914E+00         7.64445E-02         9.10263E+02         5.28757E-01         1.72079E+02         1.15410E+03         2.63589E+02         8.90514E+02
+          1.21232E-03         1.49683E-02        -6.70254E-03         7.61637E-02         1.15981E+00         7.64581E-02         8.97939E+02         5.28732E-01         1.81127E+02         1.17032E+03         2.68819E+02         9.01497E+02
+          1.21232E-03         1.51382E-02        -6.86319E-03         7.61635E-02         1.17048E+00         7.64721E-02         8.85705E+02         5.28707E-01         1.92055E+02         1.18690E+03         2.75488E+02         9.11408E+02
+          1.21232E-03         1.53080E-02        -7.02565E-03         7.61633E-02         1.18115E+00         7.64867E-02         8.73549E+02         5.28680E-01         2.04376E+02         1.20361E+03         2.83403E+02         9.20204E+02
+          1.21232E-03         1.54778E-02        -7.18992E-03         7.61631E-02         1.19182E+00         7.65018E-02         8.61464E+02         5.28653E-01         2.17694E+02         1.22023E+03         2.92376E+02         9.27849E+02
+          1.21232E-03         1.56476E-02        -7.35600E-03         7.61629E-02         1.20249E+00         7.65173E-02         8.49444E+02         5.28625E-01         2.31689E+02         1.23655E+03         3.02234E+02         9.34319E+02
+          1.21232E-03         1.58175E-02        -7.52390E-03         7.61627E-02         1.21317E+00         7.65335E-02         8.37485E+02         5.28596E-01         2.46110E+02         1.25240E+03         3.12811E+02         9.39594E+02
+          1.21232E-03         1.59873E-02        -7.69361E-03         7.61625E-02         1.22384E+00         7.65501E-02         8.25585E+02         5.28566E-01         2.60755E+02         1.26762E+03         3.23950E+02         9.43665E+02
+          1.21232E-03         1.61571E-02        -7.86513E-03         7.61623E-02         1.23451E+00         7.65674E-02         8.13743E+02         5.28534E-01         2.75461E+02         1.28204E+03         3.35508E+02         9.46528E+02
+          1.21232E-03         1.63270E-02        -8.03846E-03         7.61621E-02         1.24518E+00         7.65851E-02         8.01960E+02         5.28502E-01         2.90095E+02         1.29553E+03         3.47347E+02         9.48187E+02
+          1.21232E-03         1.64968E-02        -8.21361E-03         7.61619E-02         1.25585E+00         7.66035E-02         7.90239E+02         5.28469E-01         3.04547E+02         1.30800E+03         3.59342E+02         9.48654E+02
+          1.21232E-03         1.66666E-02        -8.39057E-03         7.61617E-02         1.26652E+00         7.66225E-02         7.78584E+02         5.28435E-01         3.18721E+02         1.31932E+03         3.71375E+02         9.47943E+02
+          1.21232E-03         1.68364E-02        -8.56934E-03         7.61615E-02         1.27719E+00         7.66420E-02         7.66999E+02         5.28399E-01         3.32537E+02         1.32942E+03         3.83340E+02         9.46079E+02
+          1.21232E-03         1.70063E-02        -8.74993E-03         7.61613E-02         1.28786E+00         7.66622E-02         7.55491E+02         5.28363E-01         3.45925E+02         1.33823E+03         3.95138E+02         9.43087E+02
+          1.21232E-03         1.71761E-02        -8.93233E-03         7.61610E-02         1.29853E+00         7.66830E-02         7.44065E+02         5.28325E-01         3.58825E+02         1.34568E+03         4.06679E+02         9.39001E+02
+          1.21232E-03         1.73459E-02        -9.11654E-03         7.61608E-02         1.30920E+00         7.67045E-02         7.32729E+02         5.28286E-01         3.71184E+02         1.35174E+03         4.17883E+02         9.33857E+02
+          1.21232E-03         1.75158E-02        -9.30257E-03         7.61606E-02         1.31987E+00         7.67266E-02         7.21492E+02         5.28247E-01         3.82956E+02         1.35637E+03         4.28678E+02         9.27696E+02
+          1.21232E-03         1.76856E-02        -9.49040E-03         7.61604E-02         1.33054E+00         7.67494E-02         7.10360E+02         5.28205E-01         3.94103E+02         1.35956E+03         4.38998E+02         9.20562E+02
+          1.21232E-03         1.78554E-02        -9.68005E-03         7.61601E-02         1.34121E+00         7.67728E-02         6.99344E+02         5.28163E-01         4.04590E+02         1.36129E+03         4.48788E+02         9.12502E+02
+          1.21232E-03         1.80252E-02        -9.87152E-03         7.61599E-02         1.35188E+00         7.67970E-02         6.88450E+02         5.28119E-01         4.14389E+02         1.36157E+03         4.57999E+02         9.03566E+02
+          1.21232E-03         1.81951E-02        -1.00648E-02         7.61597E-02         1.36255E+00         7.68218E-02         6.77689E+02         5.28075E-01         4.23479E+02         1.36039E+03         4.66588E+02         8.93806E+02
+          1.21232E-03         1.83649E-02        -1.02599E-02         7.61594E-02         1.37322E+00         7.68474E-02         6.67069E+02         5.28028E-01         4.31841E+02         1.35780E+03         4.74522E+02         8.83277E+02
+          1.21232E-03         1.85347E-02        -1.04568E-02         7.61592E-02         1.38389E+00         7.68737E-02         6.56599E+02         5.27981E-01         4.39463E+02         1.35380E+03         4.81770E+02         8.72033E+02
+          1.21232E-03         1.87045E-02        -1.06555E-02         7.61589E-02         1.39457E+00         7.69007E-02         6.46286E+02         5.27932E-01         4.46334E+02         1.34844E+03         4.88312E+02         8.60131E+02
+          1.21232E-03         1.88744E-02        -1.08560E-02         7.61587E-02         1.40524E+00         7.69285E-02         6.36140E+02         5.27882E-01         4.52451E+02         1.34176E+03         4.94131E+02         8.47629E+02
+          1.21232E-03         1.90442E-02        -1.10584E-02         7.61585E-02         1.41591E+00         7.69571E-02         6.26167E+02         5.27831E-01         4.57812E+02         1.33380E+03         4.99215E+02         8.34584E+02
+          1.21232E-03         1.92140E-02        -1.12625E-02         7.61582E-02         1.42658E+00         7.69865E-02         6.16375E+02         5.27778E-01         4.62421E+02         1.32461E+03         5.03559E+02         8.21054E+02
+          1.21232E-03         1.93839E-02        -1.14685E-02         7.61580E-02         1.43725E+00         7.70166E-02         6.06771E+02         5.27723E-01         4.66283E+02         1.31426E+03         5.07162E+02         8.07096E+02
+          1.21232E-03         1.95537E-02        -1.16763E-02         7.61577E-02         1.44792E+00         7.70476E-02         5.97361E+02         5.27668E-01         4.69409E+02         1.30280E+03         5.10028E+02         7.92768E+02
+          1.21232E-03         1.97235E-02        -1.18859E-02         7.61575E-02         1.45859E+00         7.70794E-02         5.88151E+02         5.27610E-01         4.71811E+02         1.29029E+03         5.12163E+02         7.78126E+02
+          1.21232E-03         1.98933E-02        -1.20973E-02         7.61572E-02         1.46926E+00         7.71120E-02         5.79145E+02         5.27552E-01         4.73503E+02         1.27680E+03         5.13579E+02         7.63225E+02
+          1.21232E-03         2.00632E-02        -1.23105E-02         7.61569E-02         1.47993E+00         7.71455E-02         5.70349E+02         5.27491E-01         4.74503E+02         1.26241E+03         5.14291E+02         7.48119E+02
+          1.21232E-03         2.02330E-02        -1.25255E-02         7.61567E-02         1.49060E+00         7.71798E-02         5.61765E+02         5.27430E-01         4.74832E+02         1.24718E+03         5.14316E+02         7.32860E+02
+          1.21232E-03         2.04028E-02        -1.27424E-02         7.61564E-02         1.50127E+00         7.72151E-02         5.53396E+02         5.27366E-01         4.74511E+02         1.23117E+03         5.13676E+02         7.17499E+02
+          1.21232E-03         2.05726E-02        -1.29611E-02         7.61561E-02         1.51194E+00         7.72512E-02         5.45245E+02         5.27301E-01         4.73564E+02         1.21448E+03         5.12392E+02         7.02085E+02
+          1.21232E-03         2.07425E-02        -1.31815E-02         7.61559E-02         1.52261E+00         7.72882E-02         5.37314E+02         5.27235E-01         4.72016E+02         1.19716E+03         5.10490E+02         6.86665E+02
+          1.21232E-03         2.09123E-02        -1.34038E-02         7.61556E-02         1.53328E+00         7.73262E-02         5.29602E+02         5.27167E-01         4.69894E+02         1.17928E+03         5.07998E+02         6.71283E+02
+          1.21232E-03         2.10821E-02        -1.36279E-02         7.61553E-02         1.54395E+00         7.73651E-02         5.22111E+02         5.27097E-01         4.67225E+02         1.16093E+03         5.04943E+02         6.55982E+02
+          1.21232E-03         2.12520E-02        -1.38538E-02         7.61551E-02         1.55462E+00         7.74049E-02         5.14839E+02         5.27025E-01         4.64038E+02         1.14216E+03         5.01356E+02         6.40803E+02
+          1.21232E-03         2.14218E-02        -1.40816E-02         7.61548E-02         1.56529E+00         7.74457E-02         5.07786E+02         5.26952E-01         4.60362E+02         1.12305E+03         4.97267E+02         6.25782E+02
+          1.21232E-03         2.15916E-02        -1.43111E-02         7.61545E-02         1.57596E+00         7.74875E-02         5.00948E+02         5.26877E-01         4.56227E+02         1.10366E+03         4.92709E+02         6.10954E+02
+          1.21232E-03         2.17614E-02        -1.45425E-02         7.61542E-02         1.58664E+00         7.75303E-02         4.94325E+02         5.26800E-01         4.51664E+02         1.08407E+03         4.87714E+02         5.96354E+02
+          1.21232E-03         2.19313E-02        -1.47756E-02         7.61539E-02         1.59731E+00         7.75741E-02         4.87912E+02         5.26722E-01         4.46702E+02         1.06432E+03         4.82315E+02         5.82009E+02
+          1.21232E-03         2.21011E-02        -1.50106E-02         7.61537E-02         1.60798E+00         7.76189E-02         4.81705E+02         5.26642E-01         4.41372E+02         1.04449E+03         4.76544E+02         5.67949E+02
+          1.21232E-03         2.22709E-02        -1.52474E-02         7.61534E-02         1.61865E+00         7.76648E-02         4.75702E+02         5.26560E-01         4.35706E+02         1.02463E+03         4.70436E+02         5.54197E+02
+          1.21232E-03         2.24407E-02        -1.54860E-02         7.61531E-02         1.62932E+00         7.77117E-02         4.69895E+02         5.26476E-01         4.29732E+02         1.00480E+03         4.64022E+02         5.40776E+02
+          1.21232E-03         2.26106E-02        -1.57264E-02         7.61528E-02         1.63999E+00         7.77597E-02         4.64281E+02         5.26390E-01         4.23480E+02         9.85040E+02         4.57335E+02         5.27705E+02
+          1.21232E-03         2.27804E-02        -1.59687E-02         7.61525E-02         1.65066E+00         7.78088E-02         4.58854E+02         5.26302E-01         4.16980E+02         9.65410E+02         4.50407E+02         5.15003E+02
+          1.21232E-03         2.29502E-02        -1.62127E-02         7.61522E-02         1.66133E+00         7.78589E-02         4.53608E+02         5.26212E-01         4.10260E+02         9.45952E+02         4.43269E+02         5.02682E+02
+          1.21232E-03         2.31201E-02        -1.64586E-02         7.61519E-02         1.67200E+00         7.79102E-02         4.48535E+02         5.26121E-01         4.03349E+02         9.26710E+02         4.35953E+02         4.90757E+02
+          1.21232E-03         2.32899E-02        -1.67063E-02         7.61516E-02         1.68267E+00         7.79626E-02         4.43630E+02         5.26027E-01         3.96273E+02         9.07723E+02         4.28487E+02         4.79236E+02
+          1.21232E-03         2.34597E-02        -1.69558E-02         7.61513E-02         1.69334E+00         7.80161E-02         4.38886E+02         5.25932E-01         3.89059E+02         8.89028E+02         4.20900E+02         4.68128E+02
+          1.21232E-03         2.36295E-02        -1.72071E-02         7.61510E-02         1.70401E+00         7.80709E-02         4.34295E+02         5.25834E-01         3.81732E+02         8.70658E+02         4.13221E+02         4.57437E+02
+          1.21232E-03         2.37994E-02        -1.74602E-02         7.61507E-02         1.71468E+00         7.81267E-02         4.29850E+02         5.25735E-01         3.74316E+02         8.52644E+02         4.05475E+02         4.47168E+02
+          1.21232E-03         2.39692E-02        -1.77151E-02         7.61504E-02         1.72535E+00         7.81838E-02         4.25544E+02         5.25633E-01         3.66836E+02         8.35011E+02         3.97688E+02         4.37322E+02
+          1.21232E-03         2.41390E-02        -1.79719E-02         7.61501E-02         1.73602E+00         7.82421E-02         4.21369E+02         5.25529E-01         3.59313E+02         8.17783E+02         3.89884E+02         4.27899E+02
+          1.21232E-03         2.43088E-02        -1.82304E-02         7.61498E-02         1.74669E+00         7.83016E-02         4.17317E+02         5.25423E-01         3.51769E+02         8.00982E+02         3.82086E+02         4.18896E+02
+          1.21232E-03         2.44787E-02        -1.84908E-02         7.61494E-02         1.75736E+00         7.83623E-02         4.13381E+02         5.25315E-01         3.44224E+02         7.84625E+02         3.74315E+02         4.10310E+02
+          1.21232E-03         2.46485E-02        -1.87530E-02         7.61491E-02         1.76804E+00         7.84243E-02         4.09554E+02         5.25205E-01         3.36698E+02         7.68727E+02         3.66591E+02         4.02135E+02
+          1.21232E-03         2.48183E-02        -1.90170E-02         7.61488E-02         1.77871E+00         7.84875E-02         4.05827E+02         5.25093E-01         3.29208E+02         7.53299E+02         3.58934E+02         3.94365E+02
+          1.21232E-03         2.49882E-02        -1.92828E-02         7.61485E-02         1.78938E+00         7.85520E-02         4.02194E+02         5.24978E-01         3.21770E+02         7.38351E+02         3.51360E+02         3.86991E+02
+          1.21232E-03         2.51580E-02        -1.95504E-02         7.61482E-02         1.80005E+00         7.86178E-02         3.98648E+02         5.24862E-01         3.14402E+02         7.23890E+02         3.43885E+02         3.80004E+02
+          1.21232E-03         2.53278E-02        -1.98199E-02         7.61478E-02         1.81072E+00         7.86849E-02         3.95181E+02         5.24743E-01         3.07118E+02         7.09919E+02         3.36525E+02         3.73395E+02
+          1.21232E-03         2.54976E-02        -2.00911E-02         7.61475E-02         1.82139E+00         7.87534E-02         3.91786E+02         5.24621E-01         2.99931E+02         6.96442E+02         3.29291E+02         3.67151E+02
+          1.21232E-03         2.56675E-02        -2.03642E-02         7.61472E-02         1.83206E+00         7.88232E-02         3.88457E+02         5.24498E-01         2.92854E+02         6.83457E+02         3.22197E+02         3.61260E+02
+          1.21232E-03         2.58373E-02        -2.06391E-02         7.61468E-02         1.84273E+00         7.88943E-02         3.85187E+02         5.24372E-01         2.85899E+02         6.70963E+02         3.15253E+02         3.55710E+02
+          1.21232E-03         2.60071E-02        -2.09158E-02         7.61465E-02         1.85340E+00         7.89668E-02         3.81970E+02         5.24244E-01         2.79075E+02         6.58956E+02         3.08469E+02         3.50487E+02
+          1.21232E-03         2.61769E-02        -2.11943E-02         7.61462E-02         1.86407E+00         7.90407E-02         3.78801E+02         5.24113E-01         2.72394E+02         6.47428E+02         3.01851E+02         3.45577E+02
+          1.38215E-03         8.72665E-04         2.98854E-04         8.68428E-02         2.74155E-01         8.68433E-02         6.65197E+03         5.10820E-01         1.91162E+04         3.25056E+04         2.24996E+04         1.00060E+04
+          1.38215E-03         1.04249E-03         2.88636E-04         8.68428E-02         2.84826E-01         8.68433E-02         6.51814E+03         5.10820E-01         1.87382E+04         3.17975E+04         2.20509E+04         9.74659E+03
+          1.38215E-03         1.21232E-03         2.76606E-04         8.68428E-02         2.95496E-01         8.68432E-02         6.38233E+03         5.10820E-01         1.83528E+04         3.10769E+04         2.15934E+04         9.48351E+03
+          1.38215E-03         1.38215E-03         2.62764E-04         8.68428E-02         3.06167E-01         8.68432E-02         6.24481E+03         5.10820E-01         1.79607E+04         3.03453E+04         2.11280E+04         9.21735E+03
+          1.38215E-03         1.55197E-03         2.47109E-04         8.68427E-02         3.16838E-01         8.68431E-02         6.10587E+03         5.10821E-01         1.75625E+04         2.96040E+04         2.06553E+04         8.94866E+03
+          1.38215E-03         1.72180E-03         2.29643E-04         8.68427E-02         3.27508E-01         8.68430E-02         5.96578E+03         5.10821E-01         1.71588E+04         2.88543E+04         2.01762E+04         8.67802E+03
+          1.38215E-03         1.89163E-03         2.10364E-04         8.68427E-02         3.38179E-01         8.68429E-02         5.82482E+03         5.10821E-01         1.67505E+04         2.80976E+04         1.96916E+04         8.40598E+03
+          1.38215E-03         2.06146E-03         1.89273E-04         8.68427E-02         3.48849E-01         8.68429E-02         5.68327E+03         5.10821E-01         1.63381E+04         2.73353E+04         1.92022E+04         8.13310E+03
+          1.38215E-03         2.23128E-03         1.66370E-04         8.68426E-02         3.59520E-01         8.68428E-02         5.54138E+03         5.10821E-01         1.59223E+04         2.65687E+04         1.87087E+04         7.85993E+03
+          1.38215E-03         2.40111E-03         1.41655E-04         8.68426E-02         3.70190E-01         8.68427E-02         5.39943E+03         5.10821E-01         1.55037E+04         2.57991E+04         1.82121E+04         7.58700E+03
+          1.38215E-03         2.57094E-03         1.15128E-04         8.68426E-02         3.80861E-01         8.68426E-02         5.25767E+03         5.10821E-01         1.50831E+04         2.50279E+04         1.77131E+04         7.31484E+03
+          1.38215E-03         2.74077E-03         8.67880E-05         8.68425E-02         3.91532E-01         8.68426E-02         5.11634E+03         5.10821E-01         1.46611E+04         2.42563E+04         1.72124E+04         7.04396E+03
+          1.38215E-03         2.91059E-03         5.66363E-05         8.68425E-02         4.02202E-01         8.68425E-02         4.97570E+03         5.10821E-01         1.42384E+04         2.34857E+04         1.67108E+04         6.77486E+03
+          1.38215E-03         3.08042E-03         2.46724E-05         8.68424E-02         4.12873E-01         8.68424E-02         4.83596E+03         5.10822E-01         1.38155E+04         2.27171E+04         1.62091E+04         6.50803E+03
+          1.38215E-03         3.25025E-03        -9.10363E-06         8.68424E-02         4.23543E-01         8.68424E-02         4.69738E+03         5.10822E-01         1.33930E+04         2.19519E+04         1.57080E+04         6.24393E+03
+          1.38215E-03         3.42008E-03        -4.46919E-05         8.68423E-02         4.34214E-01         8.68423E-02         4.56014E+03         5.10822E-01         1.29717E+04         2.11912E+04         1.52082E+04         5.98302E+03
+          1.38215E-03         3.58990E-03        -8.20923E-05         8.68423E-02         4.44884E-01         8.68423E-02         4.42447E+03         5.10822E-01         1.25521E+04         2.04362E+04         1.47105E+04         5.72572E+03
+          1.38215E-03         3.75973E-03        -1.21305E-04         8.68422E-02         4.55555E-01         8.68423E-02         4.29057E+03         5.10822E-01         1.21347E+04         1.96879E+04         1.42155E+04         5.47245E+03
+          1.38215E-03         3.92956E-03        -1.62330E-04         8.68422E-02         4.66225E-01         8.68423E-02         4.15861E+03         5.10822E-01         1.17201E+04         1.89475E+04         1.37239E+04         5.22359E+03
+          1.38215E-03         4.09939E-03        -2.05167E-04         8.68421E-02         4.76896E-01         8.68424E-02         4.02877E+03         5.10822E-01         1.13088E+04         1.82158E+04         1.32363E+04         4.97953E+03
+          1.38215E-03         4.26921E-03        -2.49816E-04         8.68420E-02         4.87567E-01         8.68424E-02         3.90121E+03         5.10822E-01         1.09015E+04         1.74939E+04         1.27533E+04         4.74060E+03
+          1.38215E-03         4.43904E-03        -2.96277E-04         8.68420E-02         4.98237E-01         8.68425E-02         3.77610E+03         5.10821E-01         1.04985E+04         1.67827E+04         1.22756E+04         4.50714E+03
+          1.38215E-03         4.60887E-03        -3.44551E-04         8.68419E-02         5.08908E-01         8.68426E-02         3.65356E+03         5.10821E-01         1.01004E+04         1.60831E+04         1.18037E+04         4.27943E+03
+          1.38215E-03         4.77869E-03        -3.94637E-04         8.68418E-02         5.19578E-01         8.68427E-02         3.53373E+03         5.10821E-01         9.70764E+03         1.53960E+04         1.13382E+04         4.05776E+03
+          1.38215E-03         4.94852E-03        -4.46535E-04         8.68418E-02         5.30249E-01         8.68429E-02         3.41673E+03         5.10821E-01         9.32061E+03         1.47219E+04         1.08795E+04         3.84239E+03
+          1.38215E-03         5.11835E-03        -5.00245E-04         8.68417E-02         5.40919E-01         8.68431E-02         3.30266E+03         5.10820E-01         8.93975E+03         1.40618E+04         1.04283E+04         3.63354E+03
+          1.38215E-03         5.28818E-03        -5.55768E-04         8.68416E-02         5.51590E-01         8.68434E-02         3.19161E+03         5.10820E-01         8.56544E+03         1.34163E+04         9.98484E+03         3.43141E+03
+          1.38215E-03         5.45800E-03        -6.13102E-04         8.68415E-02         5.62261E-01         8.68437E-02         3.08366E+03         5.10819E-01         8.19806E+03         1.27859E+04         9.54968E+03         3.23618E+03
+          1.38215E-03         5.62783E-03        -6.72249E-04         8.68415E-02         5.72931E-01         8.68441E-02         2.97889E+03         5.10819E-01         7.83795E+03         1.21712E+04         9.12320E+03         3.04802E+03
+          1.38215E-03         5.79766E-03        -7.33208E-04         8.68414E-02         5.83602E-01         8.68445E-02         2.87735E+03         5.10818E-01         7.48541E+03         1.15728E+04         8.70577E+03         2.86705E+03
+          1.38215E-03         5.96749E-03        -7.95980E-04         8.68413E-02         5.94272E-01         8.68449E-02         2.77908E+03         5.10817E-01         7.14075E+03         1.09911E+04         8.29775E+03         2.69337E+03
+          1.38215E-03         6.13731E-03        -8.60564E-04         8.68412E-02         6.04943E-01         8.68455E-02         2.68412E+03         5.10817E-01         6.80422E+03         1.04265E+04         7.89944E+03         2.52707E+03
+          1.38215E-03         6.30714E-03        -9.26960E-04         8.68411E-02         6.15613E-01         8.68461E-02         2.59250E+03         5.10816E-01         6.47607E+03         9.87934E+03         7.51114E+03         2.36820E+03
+          1.38215E-03         6.47697E-03        -9.95168E-04         8.68410E-02         6.26284E-01         8.68467E-02         2.50422E+03         5.10815E-01         6.15652E+03         9.34991E+03         7.13310E+03         2.21681E+03
+          1.38215E-03         6.64680E-03        -1.06519E-03         8.68409E-02         6.36955E-01         8.68475E-02         2.41930E+03         5.10813E-01         5.84574E+03         8.83846E+03         6.76556E+03         2.07290E+03
+          1.38215E-03         6.81662E-03        -1.13702E-03         8.68408E-02         6.47625E-01         8.68483E-02         2.33771E+03         5.10812E-01         5.54392E+03         8.34517E+03         6.40870E+03         1.93647E+03
+          1.38215E-03         6.98645E-03        -1.21067E-03         8.68407E-02         6.58296E-01         8.68492E-02         2.25945E+03         5.10811E-01         5.25118E+03         7.87018E+03         6.06271E+03         1.80748E+03
+          1.38215E-03         7.15628E-03        -1.28612E-03         8.68406E-02         6.68966E-01         8.68501E-02         2.18448E+03         5.10809E-01         4.96764E+03         7.41359E+03         5.72771E+03         1.68588E+03
+          1.38215E-03         7.32611E-03        -1.36339E-03         8.68405E-02         6.79637E-01         8.68512E-02         2.11277E+03         5.10807E-01         4.69340E+03         6.97542E+03         5.40382E+03         1.57160E+03
+          1.38215E-03         7.49593E-03        -1.44247E-03         8.68404E-02         6.90307E-01         8.68524E-02         2.04428E+03         5.10805E-01         4.42852E+03         6.55569E+03         5.09113E+03         1.46455E+03
+          1.38215E-03         7.66576E-03        -1.52337E-03         8.68403E-02         7.00978E-01         8.68536E-02         1.97895E+03         5.10803E-01         4.17304E+03         6.15432E+03         4.78969E+03         1.36463E+03
+          1.38215E-03         7.83559E-03        -1.60608E-03         8.68402E-02         7.11649E-01         8.68550E-02         1.91672E+03         5.10801E-01         3.92699E+03         5.77123E+03         4.49953E+03         1.27170E+03
+          1.38215E-03         8.00542E-03        -1.69059E-03         8.68401E-02         7.22319E-01         8.68565E-02         1.85753E+03         5.10798E-01         3.69037E+03         5.40629E+03         4.22066E+03         1.18563E+03
+          1.38215E-03         8.17524E-03        -1.77693E-03         8.68399E-02         7.32990E-01         8.68581E-02         1.80131E+03         5.10796E-01         3.46315E+03         5.05931E+03         3.95305E+03         1.10626E+03
+          1.38215E-03         8.34507E-03        -1.86507E-03         8.68398E-02         7.43660E-01         8.68598E-02         1.74797E+03         5.10793E-01         3.24528E+03         4.73007E+03         3.69666E+03         1.03341E+03
+          1.38215E-03         8.51490E-03        -1.95502E-03         8.68397E-02         7.54331E-01         8.68617E-02         1.69744E+03         5.10790E-01         3.03672E+03         4.41833E+03         3.45142E+03         9.66910E+02
+          1.38215E-03         8.68473E-03        -2.04679E-03         8.68396E-02         7.65001E-01         8.68637E-02         1.64962E+03         5.10787E-01         2.83736E+03         4.12380E+03         3.21724E+03         9.06557E+02
+          1.38215E-03         8.85455E-03        -2.14037E-03         8.68394E-02         7.75672E-01         8.68658E-02         1.60442E+03         5.10783E-01         2.64711E+03         3.84616E+03         2.99402E+03         8.52145E+02
+          1.38215E-03         9.02438E-03        -2.23577E-03         8.68393E-02         7.86343E-01         8.68681E-02         1.56174E+03         5.10779E-01         2.46584E+03         3.58506E+03         2.78160E+03         8.03458E+02
+          1.38215E-03         9.19421E-03        -2.33297E-03         8.68392E-02         7.97013E-01         8.68705E-02         1.52150E+03         5.10775E-01         2.29342E+03         3.34013E+03         2.57986E+03         7.60271E+02
+          1.38215E-03         9.36403E-03        -2.43199E-03         8.68390E-02         8.07684E-01         8.68731E-02         1.48358E+03         5.10771E-01         2.12969E+03         3.11095E+03         2.38860E+03         7.22352E+02
+          1.38215E-03         9.53386E-03        -2.53282E-03         8.68389E-02         8.18354E-01         8.68758E-02         1.44788E+03         5.10767E-01         1.97449E+03         2.89712E+03         2.20766E+03         6.89461E+02
+          1.38215E-03         9.70369E-03        -2.63546E-03         8.68388E-02         8.29025E-01         8.68787E-02         1.41429E+03         5.10762E-01         1.82761E+03         2.69817E+03         2.03682E+03         6.61354E+02
+          1.38215E-03         9.87352E-03        -2.73992E-03         8.68386E-02         8.39695E-01         8.68818E-02         1.38272E+03         5.10757E-01         1.68887E+03         2.51365E+03         1.87586E+03         6.37784E+02
+          1.38215E-03         1.00433E-02        -2.84618E-03         8.68385E-02         8.50366E-01         8.68851E-02         1.35305E+03         5.10752E-01         1.55805E+03         2.34306E+03         1.72457E+03         6.18497E+02
+          1.38215E-03         1.02132E-02        -2.95426E-03         8.68383E-02         8.61037E-01         8.68885E-02         1.32517E+03         5.10746E-01         1.43492E+03         2.18592E+03         1.58268E+03         6.03240E+02
+          1.38215E-03         1.03830E-02        -3.06416E-03         8.68382E-02         8.71707E-01         8.68922E-02         1.29899E+03         5.10740E-01         1.31925E+03         2.04171E+03         1.44995E+03         5.91759E+02
+          1.38215E-03         1.05528E-02        -3.17586E-03         8.68380E-02         8.82378E-01         8.68961E-02         1.27439E+03         5.10733E-01         1.21078E+03         1.90991E+03         1.32611E+03         5.83798E+02
+          1.38215E-03         1.07227E-02        -3.28938E-03         8.68378E-02         8.93048E-01         8.69001E-02         1.25127E+03         5.10727E-01         1.10926E+03         1.78999E+03         1.21089E+03         5.79103E+02
+          1.38215E-03         1.08925E-02        -3.40471E-03         8.68377E-02         9.03719E-01         8.69044E-02         1.22954E+03         5.10720E-01         1.01441E+03         1.68142E+03         1.10400E+03         5.77421E+02
+          1.38215E-03         1.10623E-02        -3.52185E-03         8.68375E-02         9.14389E-01         8.69089E-02         1.20907E+03         5.10712E-01         9.25969E+02         1.58366E+03         1.00516E+03         5.78502E+02
+          1.38215E-03         1.12321E-02        -3.64080E-03         8.68374E-02         9.25060E-01         8.69137E-02         1.18979E+03         5.10705E-01         8.43649E+02         1.49616E+03         9.14063E+02         5.82100E+02
+          1.38215E-03         1.14020E-02        -3.76157E-03         8.68372E-02         9.35731E-01         8.69186E-02         1.17159E+03         5.10696E-01         7.67163E+02         1.41839E+03         8.30417E+02         5.87973E+02
+          1.38215E-03         1.15718E-02        -3.88415E-03         8.68370E-02         9.46401E-01         8.69239E-02         1.15438E+03         5.10688E-01         6.96224E+02         1.34980E+03         7.53918E+02         5.95882E+02
+          1.38215E-03         1.17416E-02        -4.00854E-03         8.68369E-02         9.57072E-01         8.69293E-02         1.13808E+03         5.10679E-01         6.30540E+02         1.28985E+03         6.84258E+02         6.05596E+02
+          1.38215E-03         1.19114E-02        -4.13475E-03         8.68367E-02         9.67742E-01         8.69351E-02         1.12259E+03         5.10669E-01         5.69823E+02         1.23802E+03         6.21132E+02         6.16889E+02
+          1.38215E-03         1.20813E-02        -4.26276E-03         8.68365E-02         9.78413E-01         8.69411E-02         1.10783E+03         5.10660E-01         5.13791E+02         1.19377E+03         5.64230E+02         6.29543E+02
+          1.38215E-03         1.22511E-02        -4.39259E-03         8.68363E-02         9.89083E-01         8.69474E-02         1.09373E+03         5.10649E-01         4.62168E+02         1.15659E+03         5.13244E+02         6.43346E+02
+          1.38215E-03         1.24209E-02        -4.52424E-03         8.68361E-02         9.99754E-01         8.69539E-02         1.08020E+03         5.10638E-01         4.14695E+02         1.12596E+03         4.67870E+02         6.58094E+02
+          1.38215E-03         1.25908E-02        -4.65769E-03         8.68360E-02         1.01042E+00         8.69608E-02         1.06718E+03         5.10627E-01         3.71131E+02         1.10139E+03         4.27801E+02         6.73593E+02
+          1.38215E-03         1.27606E-02        -4.79296E-03         8.68358E-02         1.02110E+00         8.69679E-02         1.05460E+03         5.10615E-01         3.31266E+02         1.08239E+03         3.92736E+02         6.89655E+02
+          1.38215E-03         1.29304E-02        -4.93004E-03         8.68356E-02         1.03177E+00         8.69754E-02         1.04241E+03         5.10603E-01         2.94927E+02         1.06848E+03         3.62377E+02         7.06104E+02
+          1.38215E-03         1.31002E-02        -5.06893E-03         8.68354E-02         1.04244E+00         8.69832E-02         1.03053E+03         5.10590E-01         2.61998E+02         1.05920E+03         3.36431E+02         7.22770E+02
+          1.38215E-03         1.32701E-02        -5.20964E-03         8.68352E-02         1.05311E+00         8.69913E-02         1.01891E+03         5.10577E-01         2.32429E+02         1.05411E+03         3.14609E+02         7.39497E+02
+          1.38215E-03         1.34399E-02        -5.35215E-03         8.68350E-02         1.06378E+00         8.69998E-02         1.00752E+03         5.10563E-01         2.06265E+02         1.05276E+03         2.96628E+02         7.56133E+02
+          1.38215E-03         1.36097E-02        -5.49648E-03         8.68348E-02         1.07445E+00         8.70086E-02         9.96291E+02         5.10549E-01         1.83659E+02         1.05475E+03         2.82211E+02         7.72541E+02
+          1.38215E-03         1.37795E-02        -5.64263E-03         8.68346E-02         1.08512E+00         8.70177E-02         9.85194E+02         5.10534E-01         1.64886E+02         1.05968E+03         2.71088E+02         7.88591E+02
+          1.38215E-03         1.39494E-02        -5.79058E-03         8.68344E-02         1.09579E+00         8.70273E-02         9.74188E+02         5.10518E-01         1.50318E+02         1.06716E+03         2.62997E+02         8.04164E+02
+          1.38215E-03         1.41192E-02        -5.94035E-03         8.68342E-02         1.10646E+00         8.70371E-02         9.63241E+02         5.10502E-01         1.40334E+02         1.07683E+03         2.57683E+02         8.19151E+02
+          1.38215E-03         1.42890E-02        -6.09193E-03         8.68340E-02         1.11713E+00         8.70474E-02         9.52323E+02         5.10485E-01         1.35168E+02         1.08835E+03         2.54898E+02         8.33453E+02
+          1.38215E-03         1.44589E-02        -6.24533E-03         8.68338E-02         1.12780E+00         8.70581E-02         9.41409E+02         5.10468E-01         1.34734E+02         1.10138E+03         2.54405E+02         8.46979E+02
+          1.38215E-03         1.46287E-02        -6.40053E-03         8.68335E-02         1.13847E+00         8.70691E-02         9.30477E+02         5.10450E-01         1.38567E+02         1.11562E+03         2.55974E+02         8.59650E+02
+          1.38215E-03         1.47985E-02        -6.55755E-03         8.68333E-02         1.14914E+00         8.70806E-02         9.19508E+02         5.10431E-01         1.45928E+02         1.13078E+03         2.59384E+02         8.71397E+02
+          1.38215E-03         1.49683E-02        -6.71638E-03         8.68331E-02         1.15981E+00         8.70925E-02         9.08489E+02         5.10411E-01         1.56002E+02         1.14658E+03         2.64425E+02         8.82157E+02
+          1.38215E-03         1.51382E-02        -6.87703E-03         8.68329E-02         1.17048E+00         8.71048E-02         8.97408E+02         5.10391E-01         1.68044E+02         1.16277E+03         2.70893E+02         8.91879E+02
+          1.38215E-03         1.53080E-02        -7.03949E-03         8.68327E-02         1.18115E+00         8.71175E-02         8.86256E+02         5.10370E-01         1.81450E+02         1.17912E+03         2.78598E+02         9.00520E+02
+          1.38215E-03         1.54778E-02        -7.20376E-03         8.68324E-02         1.19182E+00         8.71307E-02         8.75028E+02         5.10348E-01         1.95754E+02         1.19540E+03         2.87355E+02         9.08045E+02
+          1.38215E-03         1.56476E-02        -7.36984E-03         8.68322E-02         1.20249E+00         8.71444E-02         8.63722E+02         5.10326E-01         2.10610E+02         1.21142E+03         2.96994E+02         9.14429E+02
+          1.38215E-03         1.58175E-02        -7.53774E-03         8.68320E-02         1.21317E+00         8.71585E-02         8.52337E+02         5.10303E-01         2.25760E+02         1.22700E+03         3.07350E+02         9.19652E+02
+          1.38215E-03         1.59873E-02        -7.70745E-03         8.68317E-02         1.22384E+00         8.71731E-02         8.40876E+02         5.10279E-01         2.41005E+02         1.24197E+03         3.18269E+02         9.23705E+02
+          1.38215E-03         1.61571E-02        -7.87897E-03         8.68315E-02         1.23451E+00         8.71882E-02         8.29343E+02         5.10254E-01         2.56195E+02         1.25619E+03         3.29609E+02         9.26582E+02
+          1.38215E-03         1.63270E-02        -8.05230E-03         8.68313E-02         1.24518E+00         8.72038E-02         8.17744E+02         5.10229E-01         2.71210E+02         1.26952E+03         3.41235E+02         9.28288E+02
+          1.38215E-03         1.64968E-02        -8.22745E-03         8.68310E-02         1.25585E+00         8.72199E-02         8.06088E+02         5.10202E-01         2.85953E+02         1.28185E+03         3.53022E+02         9.28832E+02
+          1.38215E-03         1.66666E-02        -8.40441E-03         8.68308E-02         1.26652E+00         8.72366E-02         7.94383E+02         5.10175E-01         3.00341E+02         1.29308E+03         3.64855E+02         9.28229E+02
+          1.38215E-03         1.68364E-02        -8.58318E-03         8.68305E-02         1.27719E+00         8.72537E-02         7.82642E+02         5.10147E-01         3.14307E+02         1.30313E+03         3.76627E+02         9.26501E+02
+          1.38215E-03         1.70063E-02        -8.76377E-03         8.68303E-02         1.28786E+00         8.72714E-02         7.70877E+02         5.10118E-01         3.27792E+02         1.31192E+03         3.88243E+02         9.23673E+02
+          1.38215E-03         1.71761E-02        -8.94617E-03         8.68300E-02         1.29853E+00         8.72897E-02         7.59100E+02         5.10088E-01         3.40746E+02         1.31939E+03         3.99612E+02         9.19777E+02
+          1.38215E-03         1.73459E-02        -9.13038E-03         8.68298E-02         1.30920E+00         8.73085E-02         7.47326E+02         5.10057E-01         3.53125E+02         1.32550E+03         4.10655E+02         9.14847E+02
+          1.38215E-03         1.75158E-02        -9.31641E-03         8.68295E-02         1.31987E+00         8.73279E-02         7.35570E+02         5.10026E-01         3.64893E+02         1.33022E+03         4.21301E+02         9.08923E+02
+          1.38215E-03         1.76856E-02        -9.50424E-03         8.68293E-02         1.33054E+00         8.73479E-02         7.23847E+02         5.09993E-01         3.76015E+02         1.33353E+03         4.31485E+02         9.02047E+02
+          1.38215E-03         1.78554E-02        -9.69389E-03         8.68290E-02         1.34121E+00         8.73685E-02         7.12172E+02         5.09959E-01         3.86467E+02         1.33542E+03         4.41152E+02         8.94265E+02
+          1.38215E-03         1.80252E-02        -9.88536E-03         8.68287E-02         1.35188E+00         8.73896E-02         7.00561E+02         5.09925E-01         3.96224E+02         1.33588E+03         4.50252E+02         8.85625E+02
+          1.38215E-03         1.81951E-02        -1.00786E-02         8.68285E-02         1.36255E+00         8.74114E-02         6.89030E+02         5.09889E-01         4.05270E+02         1.33492E+03         4.58745E+02         8.76177E+02
+          1.38215E-03         1.83649E-02        -1.02737E-02         8.68282E-02         1.37322E+00         8.74339E-02         6.77594E+02         5.09852E-01         4.13589E+02         1.33257E+03         4.66595E+02         8.65973E+02
+          1.38215E-03         1.85347E-02        -1.04706E-02         8.68279E-02         1.38389E+00         8.74570E-02         6.66269E+02         5.09815E-01         4.21174E+02         1.32884E+03         4.73775E+02         8.55069E+02
+          1.38215E-03         1.87045E-02        -1.06693E-02         8.68276E-02         1.39457E+00         8.74807E-02         6.55070E+02         5.09776E-01         4.28017E+02         1.32378E+03         4.80261E+02         8.43517E+02
+          1.38215E-03         1.88744E-02        -1.08699E-02         8.68274E-02         1.40524E+00         8.75051E-02         6.44011E+02         5.09736E-01         4.34117E+02         1.31741E+03         4.86037E+02         8.31374E+02
+          1.38215E-03         1.90442E-02        -1.10722E-02         8.68271E-02         1.41591E+00         8.75302E-02         6.33106E+02         5.09695E-01         4.39474E+02         1.30979E+03         4.91092E+02         8.18696E+02
+          1.38215E-03         1.92140E-02        -1.12764E-02         8.68268E-02         1.42658E+00         8.75560E-02         6.22369E+02         5.09653E-01         4.44094E+02         1.30096E+03         4.95420E+02         8.05539E+02
+          1.38215E-03         1.93839E-02        -1.14823E-02         8.68265E-02         1.43725E+00         8.75825E-02         6.11812E+02         5.09610E-01         4.47982E+02         1.29098E+03         4.99020E+02         7.91959E+02
+          1.38215E-03         1.95537E-02        -1.16901E-02         8.68262E-02         1.44792E+00         8.76097E-02         6.01446E+02         5.09565E-01         4.51151E+02         1.27991E+03         5.01894E+02         7.78012E+02
+          1.38215E-03         1.97235E-02        -1.18997E-02         8.68259E-02         1.45859E+00         8.76376E-02         5.91284E+02         5.09520E-01         4.53612E+02         1.26780E+03         5.04049E+02         7.63752E+02
+          1.38215E-03         1.98933E-02        -1.21111E-02         8.68257E-02         1.46926E+00         8.76663E-02         5.81333E+02         5.09473E-01         4.55381E+02         1.25473E+03         5.05497E+02         7.49233E+02
+          1.38215E-03         2.00632E-02        -1.23243E-02         8.68254E-02         1.47993E+00         8.76957E-02         5.71605E+02         5.09425E-01         4.56476E+02         1.24076E+03         5.06252E+02         7.34508E+02
+          1.38215E-03         2.02330E-02        -1.25394E-02         8.68251E-02         1.49060E+00         8.77259E-02         5.62106E+02         5.09376E-01         4.56917E+02         1.22596E+03         5.06330E+02         7.19627E+02
+          1.38215E-03         2.04028E-02        -1.27562E-02         8.68248E-02         1.50127E+00         8.77568E-02         5.52843E+02         5.09326E-01         4.56724E+02         1.21039E+03         5.05752E+02         7.04641E+02
+          1.38215E-03         2.05726E-02        -1.29749E-02         8.68245E-02         1.51194E+00         8.77886E-02         5.43823E+02         5.09274E-01         4.55921E+02         1.19414E+03         5.04540E+02         6.89597E+02
+          1.38215E-03         2.07425E-02        -1.31954E-02         8.68242E-02         1.52261E+00         8.78211E-02         5.35050E+02         5.09221E-01         4.54532E+02         1.17726E+03         5.02718E+02         6.74541E+02
+          1.38215E-03         2.09123E-02        -1.34177E-02         8.68238E-02         1.53328E+00         8.78545E-02         5.26529E+02         5.09167E-01         4.52584E+02         1.15983E+03         5.00313E+02         6.59516E+02
+          1.38215E-03         2.10821E-02        -1.36418E-02         8.68235E-02         1.54395E+00         8.78887E-02         5.18261E+02         5.09111E-01         4.50102E+02         1.14192E+03         4.97353E+02         6.44565E+02
+          1.38215E-03         2.12520E-02        -1.38677E-02         8.68232E-02         1.55462E+00         8.79237E-02         5.10250E+02         5.09054E-01         4.47115E+02         1.12359E+03         4.93868E+02         6.29726E+02
+          1.38215E-03         2.14218E-02        -1.40954E-02         8.68229E-02         1.56529E+00         8.79596E-02         5.02495E+02         5.08995E-01         4.43650E+02         1.10492E+03         4.89887E+02         6.15037E+02
+          1.38215E-03         2.15916E-02        -1.43249E-02         8.68226E-02         1.57596E+00         8.79964E-02         4.94996E+02         5.08936E-01         4.39736E+02         1.08597E+03         4.85442E+02         6.00532E+02
+          1.38215E-03         2.17614E-02        -1.45563E-02         8.68223E-02         1.58664E+00         8.80340E-02         4.87753E+02         5.08875E-01         4.35402E+02         1.06681E+03         4.80565E+02         5.86242E+02
+          1.38215E-03         2.19313E-02        -1.47895E-02         8.68220E-02         1.59731E+00         8.80726E-02         4.80763E+02         5.08812E-01         4.30678E+02         1.04749E+03         4.75287E+02         5.72199E+02
+          1.38215E-03         2.21011E-02        -1.50244E-02         8.68216E-02         1.60798E+00         8.81120E-02         4.74023E+02         5.08748E-01         4.25592E+02         1.02807E+03         4.69642E+02         5.58428E+02
+          1.38215E-03         2.22709E-02        -1.52612E-02         8.68213E-02         1.61865E+00         8.81524E-02         4.67530E+02         5.08682E-01         4.20173E+02         1.00862E+03         4.63662E+02         5.44954E+02
+          1.38215E-03         2.24407E-02        -1.54999E-02         8.68210E-02         1.62932E+00         8.81937E-02         4.61280E+02         5.08615E-01         4.14451E+02         9.89177E+02         4.57378E+02         5.31799E+02
+          1.38215E-03         2.26106E-02        -1.57403E-02         8.68206E-02         1.63999E+00         8.82359E-02         4.55266E+02         5.08547E-01         4.08454E+02         9.69806E+02         4.50824E+02         5.18982E+02
+          1.38215E-03         2.27804E-02        -1.59825E-02         8.68203E-02         1.65066E+00         8.82791E-02         4.49484E+02         5.08477E-01         4.02209E+02         9.50552E+02         4.44030E+02         5.06522E+02
+          1.38215E-03         2.29502E-02        -1.62266E-02         8.68200E-02         1.66133E+00         8.83233E-02         4.43927E+02         5.08405E-01         3.95744E+02         9.31458E+02         4.37027E+02         4.94431E+02
+          1.38215E-03         2.31201E-02        -1.64724E-02         8.68196E-02         1.67200E+00         8.83685E-02         4.38587E+02         5.08332E-01         3.89087E+02         9.12569E+02         4.29846E+02         4.82723E+02
+          1.38215E-03         2.32899E-02        -1.67201E-02         8.68193E-02         1.68267E+00         8.84146E-02         4.33458E+02         5.08257E-01         3.82262E+02         8.93923E+02         4.22515E+02         4.71408E+02
+          1.38215E-03         2.34597E-02        -1.69696E-02         8.68189E-02         1.69334E+00         8.84618E-02         4.28532E+02         5.08181E-01         3.75296E+02         8.75557E+02         4.15063E+02         4.60494E+02
+          1.38215E-03         2.36295E-02        -1.72209E-02         8.68186E-02         1.70401E+00         8.85100E-02         4.23799E+02         5.08103E-01         3.68212E+02         8.57503E+02         4.07518E+02         4.49985E+02
+          1.38215E-03         2.37994E-02        -1.74740E-02         8.68182E-02         1.71468E+00         8.85593E-02         4.19252E+02         5.08023E-01         3.61035E+02         8.39791E+02         3.99904E+02         4.39887E+02
+          1.38215E-03         2.39692E-02        -1.77289E-02         8.68179E-02         1.72535E+00         8.86096E-02         4.14881E+02         5.07942E-01         3.53786E+02         8.22448E+02         3.92248E+02         4.30200E+02
+          1.38215E-03         2.41390E-02        -1.79857E-02         8.68175E-02         1.73602E+00         8.86610E-02         4.10678E+02         5.07859E-01         3.46488E+02         8.05498E+02         3.84573E+02         4.20925E+02
+          1.38215E-03         2.43088E-02        -1.82442E-02         8.68172E-02         1.74669E+00         8.87134E-02         4.06633E+02         5.07774E-01         3.39161E+02         7.88962E+02         3.76902E+02         4.12060E+02
+          1.38215E-03         2.44787E-02        -1.85046E-02         8.68168E-02         1.75736E+00         8.87670E-02         4.02738E+02         5.07688E-01         3.31824E+02         7.72857E+02         3.69255E+02         4.03601E+02
+          1.38215E-03         2.46485E-02        -1.87668E-02         8.68165E-02         1.76804E+00         8.88217E-02         3.98982E+02         5.07600E-01         3.24497E+02         7.57198E+02         3.61653E+02         3.95544E+02
+          1.38215E-03         2.48183E-02        -1.90308E-02         8.68161E-02         1.77871E+00         8.88775E-02         3.95356E+02         5.07510E-01         3.17196E+02         7.41997E+02         3.54115E+02         3.87882E+02
+          1.38215E-03         2.49882E-02        -1.92966E-02         8.68157E-02         1.78938E+00         8.89344E-02         3.91851E+02         5.07418E-01         3.09939E+02         7.27264E+02         3.46657E+02         3.80608E+02
+          1.38215E-03         2.51580E-02        -1.95642E-02         8.68154E-02         1.80005E+00         8.89925E-02         3.88457E+02         5.07324E-01         3.02741E+02         7.13006E+02         3.39295E+02         3.73712E+02
+          1.38215E-03         2.53278E-02        -1.98337E-02         8.68150E-02         1.81072E+00         8.90518E-02         3.85167E+02         5.07229E-01         2.95617E+02         6.99228E+02         3.32043E+02         3.67185E+02
+          1.38215E-03         2.54976E-02        -2.01049E-02         8.68146E-02         1.82139E+00         8.91122E-02         3.81970E+02         5.07132E-01         2.88579E+02         6.85932E+02         3.24916E+02         3.61016E+02
+          1.38215E-03         2.56675E-02        -2.03780E-02         8.68142E-02         1.83206E+00         8.91738E-02         3.78858E+02         5.07033E-01         2.81640E+02         6.73117E+02         3.17924E+02         3.55193E+02
+          1.38215E-03         2.58373E-02        -2.06529E-02         8.68138E-02         1.84273E+00         8.92367E-02         3.75823E+02         5.06932E-01         2.74813E+02         6.60783E+02         3.11079E+02         3.49704E+02
+          1.38215E-03         2.60071E-02        -2.09296E-02         8.68135E-02         1.85340E+00         8.93008E-02         3.72857E+02         5.06829E-01         2.68108E+02         6.48926E+02         3.04390E+02         3.44536E+02
+          1.38215E-03         2.61769E-02        -2.12081E-02         8.68131E-02         1.86407E+00         8.93661E-02         3.69951E+02         5.06724E-01         2.61534E+02         6.37540E+02         2.97864E+02         3.39676E+02
+          1.55197E-03         8.72665E-04         2.83199E-04         9.75134E-02         2.74155E-01         9.75138E-02         7.20777E+03         4.94195E-01         1.80102E+04         3.18372E+04         2.21147E+04         9.72255E+03
+          1.55197E-03         1.04249E-03         2.72981E-04         9.75134E-02         2.84826E-01         9.75137E-02         7.05273E+03         4.94195E-01         1.76554E+04         3.11455E+04         2.16743E+04         9.47122E+03
+          1.55197E-03         1.21232E-03         2.60951E-04         9.75133E-02         2.95496E-01         9.75137E-02         6.89548E+03         4.94195E-01         1.72935E+04         3.04415E+04         2.12252E+04         9.21633E+03
+          1.55197E-03         1.38215E-03         2.47109E-04         9.75133E-02         3.06167E-01         9.75136E-02         6.73635E+03         4.94195E-01         1.69254E+04         2.97267E+04         2.07683E+04         8.95844E+03
+          1.55197E-03         1.55197E-03         2.31455E-04         9.75133E-02         3.16838E-01         9.75136E-02         6.57569E+03         4.94195E-01         1.65515E+04         2.90024E+04         2.03043E+04         8.69809E+03
+          1.55197E-03         1.72180E-03         2.13988E-04         9.75133E-02         3.27508E-01         9.75135E-02         6.41382E+03         4.94196E-01         1.61725E+04         2.82699E+04         1.98340E+04         8.43583E+03
+          1.55197E-03         1.89163E-03         1.94710E-04         9.75132E-02         3.38179E-01         9.75134E-02         6.25106E+03         4.94196E-01         1.57891E+04         2.75305E+04         1.93583E+04         8.17221E+03
+          1.55197E-03         2.06146E-03         1.73619E-04         9.75132E-02         3.48849E-01         9.75134E-02         6.08774E+03         4.94196E-01         1.54018E+04         2.67855E+04         1.88778E+04         7.90774E+03
+          1.55197E-03         2.23128E-03         1.50716E-04         9.75132E-02         3.59520E-01         9.75133E-02         5.92418E+03         4.94196E-01         1.50114E+04         2.60363E+04         1.83934E+04         7.64298E+03
+          1.55197E-03         2.40111E-03         1.26001E-04         9.75131E-02         3.70190E-01         9.75132E-02         5.76068E+03         4.94196E-01         1.46183E+04         2.52842E+04         1.79058E+04         7.37843E+03
+          1.55197E-03         2.57094E-03         9.94732E-05         9.75131E-02         3.80861E-01         9.75131E-02         5.59755E+03         4.94196E-01         1.42234E+04         2.45304E+04         1.74158E+04         7.11461E+03
+          1.55197E-03         2.74077E-03         7.11337E-05         9.75130E-02         3.91532E-01         9.75131E-02         5.43509E+03         4.94196E-01         1.38270E+04         2.37762E+04         1.69242E+04         6.85200E+03
+          1.55197E-03         2.91059E-03         4.09820E-05         9.75130E-02         4.02202E-01         9.75130E-02         5.27357E+03         4.94196E-01         1.34300E+04         2.30228E+04         1.64317E+04         6.59111E+03
+          1.55197E-03         3.08042E-03         9.01812E-06         9.75129E-02         4.12873E-01         9.75129E-02         5.11329E+03         4.94196E-01         1.30327E+04         2.22715E+04         1.59391E+04         6.33238E+03
+          1.55197E-03         3.25025E-03        -2.47579E-05         9.75129E-02         4.23543E-01         9.75129E-02         4.95449E+03         4.94196E-01         1.26359E+04         2.15233E+04         1.54470E+04         6.07629E+03
+          1.55197E-03         3.42008E-03        -6.03462E-05         9.75128E-02         4.34214E-01         9.75129E-02         4.79745E+03         4.94196E-01         1.22402E+04         2.07795E+04         1.49563E+04         5.82326E+03
+          1.55197E-03         3.58990E-03        -9.77466E-05         9.75128E-02         4.44884E-01         9.75128E-02         4.64240E+03         4.94196E-01         1.18459E+04         2.00412E+04         1.44675E+04         5.57371E+03
+          1.55197E-03         3.75973E-03        -1.36959E-04         9.75127E-02         4.55555E-01         9.75128E-02         4.48956E+03         4.94197E-01         1.14538E+04         1.93094E+04         1.39813E+04         5.32804E+03
+          1.55197E-03         3.92956E-03        -1.77984E-04         9.75127E-02         4.66225E-01         9.75128E-02         4.33917E+03         4.94197E-01         1.10643E+04         1.85851E+04         1.34985E+04         5.08663E+03
+          1.55197E-03         4.09939E-03        -2.20821E-04         9.75126E-02         4.76896E-01         9.75128E-02         4.19143E+03         4.94196E-01         1.06779E+04         1.78694E+04         1.30196E+04         4.84984E+03
+          1.55197E-03         4.26921E-03        -2.65470E-04         9.75125E-02         4.87567E-01         9.75129E-02         4.04652E+03         4.94196E-01         1.02951E+04         1.71633E+04         1.25452E+04         4.61801E+03
+          1.55197E-03         4.43904E-03        -3.11932E-04         9.75125E-02         4.98237E-01         9.75129E-02         3.90463E+03         4.94196E-01         9.91641E+03         1.64675E+04         1.20760E+04         4.39145E+03
+          1.55197E-03         4.60887E-03        -3.60205E-04         9.75124E-02         5.08908E-01         9.75130E-02         3.76591E+03         4.94196E-01         9.54226E+03         1.57829E+04         1.16125E+04         4.17046E+03
+          1.55197E-03         4.77869E-03        -4.10291E-04         9.75123E-02         5.19578E-01         9.75132E-02         3.63052E+03         4.94196E-01         9.17308E+03         1.51105E+04         1.11552E+04         3.95529E+03
+          1.55197E-03         4.94852E-03        -4.62189E-04         9.75122E-02         5.30249E-01         9.75133E-02         3.49860E+03         4.94196E-01         8.80928E+03         1.44508E+04         1.07046E+04         3.74621E+03
+          1.55197E-03         5.11835E-03        -5.15899E-04         9.75121E-02         5.40919E-01         9.75135E-02         3.37026E+03         4.94196E-01         8.45125E+03         1.38047E+04         1.02613E+04         3.54343E+03
+          1.55197E-03         5.28818E-03        -5.71422E-04         9.75120E-02         5.51590E-01         9.75137E-02         3.24560E+03         4.94195E-01         8.09935E+03         1.31727E+04         9.82559E+03         3.34714E+03
+          1.55197E-03         5.45800E-03        -6.28756E-04         9.75120E-02         5.62261E-01         9.75140E-02         3.12473E+03         4.94195E-01         7.75393E+03         1.25556E+04         9.39802E+03         3.15754E+03
+          1.55197E-03         5.62783E-03        -6.87903E-04         9.75119E-02         5.72931E-01         9.75143E-02         3.00772E+03         4.94194E-01         7.41530E+03         1.19537E+04         8.97895E+03         2.97476E+03
+          1.55197E-03         5.79766E-03        -7.48863E-04         9.75118E-02         5.83602E-01         9.75146E-02         2.89463E+03         4.94194E-01         7.08377E+03         1.13677E+04         8.56876E+03         2.79893E+03
+          1.55197E-03         5.96749E-03        -8.11634E-04         9.75117E-02         5.94272E-01         9.75151E-02         2.78550E+03         4.94193E-01         6.75960E+03         1.07979E+04         8.16778E+03         2.63016E+03
+          1.55197E-03         6.13731E-03        -8.76218E-04         9.75116E-02         6.04943E-01         9.75155E-02         2.68039E+03         4.94193E-01         6.44305E+03         1.02449E+04         7.77633E+03         2.46853E+03
+          1.55197E-03         6.30714E-03        -9.42614E-04         9.75115E-02         6.15613E-01         9.75160E-02         2.57930E+03         4.94192E-01         6.13434E+03         9.70879E+03         7.39469E+03         2.31410E+03
+          1.55197E-03         6.47697E-03        -1.01082E-03         9.75114E-02         6.26284E-01         9.75166E-02         2.48224E+03         4.94191E-01         5.83368E+03         9.19001E+03         7.02311E+03         2.16690E+03
+          1.55197E-03         6.64680E-03        -1.08084E-03         9.75113E-02         6.36955E-01         9.75172E-02         2.38923E+03         4.94190E-01         5.54123E+03         8.68876E+03         6.66181E+03         2.02695E+03
+          1.55197E-03         6.81662E-03        -1.15267E-03         9.75111E-02         6.47625E-01         9.75180E-02         2.30022E+03         4.94189E-01         5.25717E+03         8.20523E+03         6.31100E+03         1.89423E+03
+          1.55197E-03         6.98645E-03        -1.22632E-03         9.75110E-02         6.58296E-01         9.75187E-02         2.21521E+03         4.94188E-01         4.98161E+03         7.73956E+03         5.97084E+03         1.76872E+03
+          1.55197E-03         7.15628E-03        -1.30178E-03         9.75109E-02         6.68966E-01         9.75196E-02         2.13415E+03         4.94187E-01         4.71467E+03         7.29184E+03         5.64147E+03         1.65037E+03
+          1.55197E-03         7.32611E-03        -1.37905E-03         9.75108E-02         6.79637E-01         9.75205E-02         2.05700E+03         4.94185E-01         4.45644E+03         6.86211E+03         5.32299E+03         1.53912E+03
+          1.55197E-03         7.49593E-03        -1.45813E-03         9.75107E-02         6.90307E-01         9.75216E-02         1.98369E+03         4.94184E-01         4.20697E+03         6.45036E+03         5.01550E+03         1.43487E+03
+          1.55197E-03         7.66576E-03        -1.53902E-03         9.75105E-02         7.00978E-01         9.75227E-02         1.91415E+03         4.94182E-01         3.96631E+03         6.05656E+03         4.71904E+03         1.33752E+03
+          1.55197E-03         7.83559E-03        -1.62173E-03         9.75104E-02         7.11649E-01         9.75239E-02         1.84831E+03         4.94180E-01         3.73448E+03         5.68061E+03         4.43365E+03         1.24696E+03
+          1.55197E-03         8.00542E-03        -1.70625E-03         9.75103E-02         7.22319E-01         9.75252E-02         1.78609E+03         4.94178E-01         3.51147E+03         5.32239E+03         4.15934E+03         1.16305E+03
+          1.55197E-03         8.17524E-03        -1.79258E-03         9.75102E-02         7.32990E-01         9.75266E-02         1.72738E+03         4.94176E-01         3.29727E+03         4.98171E+03         3.89608E+03         1.08563E+03
+          1.55197E-03         8.34507E-03        -1.88072E-03         9.75100E-02         7.43660E-01         9.75282E-02         1.67209E+03         4.94174E-01         3.09183E+03         4.65838E+03         3.64383E+03         1.01455E+03
+          1.55197E-03         8.51490E-03        -1.97068E-03         9.75099E-02         7.54331E-01         9.75298E-02         1.62012E+03         4.94172E-01         2.89510E+03         4.35215E+03         3.40253E+03         9.49622E+02
+          1.55197E-03         8.68473E-03        -2.06245E-03         9.75097E-02         7.65001E-01         9.75315E-02         1.57134E+03         4.94169E-01         2.70698E+03         4.06275E+03         3.17209E+03         8.90661E+02
+          1.55197E-03         8.85455E-03        -2.15603E-03         9.75096E-02         7.75672E-01         9.75334E-02         1.52565E+03         4.94166E-01         2.52739E+03         3.78986E+03         2.95239E+03         8.37468E+02
+          1.55197E-03         9.02438E-03        -2.25142E-03         9.75094E-02         7.86343E-01         9.75354E-02         1.48293E+03         4.94163E-01         2.35622E+03         3.53315E+03         2.74332E+03         7.89835E+02
+          1.55197E-03         9.19421E-03        -2.34863E-03         9.75093E-02         7.97013E-01         9.75376E-02         1.44304E+03         4.94160E-01         2.19332E+03         3.29226E+03         2.54471E+03         7.47544E+02
+          1.55197E-03         9.36403E-03        -2.44764E-03         9.75091E-02         8.07684E-01         9.75399E-02         1.40587E+03         4.94157E-01         2.03855E+03         3.06679E+03         2.35642E+03         7.10372E+02
+          1.55197E-03         9.53386E-03        -2.54847E-03         9.75090E-02         8.18354E-01         9.75423E-02         1.37127E+03         4.94153E-01         1.89175E+03         2.85633E+03         2.17824E+03         6.78086E+02
+          1.55197E-03         9.70369E-03        -2.65112E-03         9.75088E-02         8.29025E-01         9.75449E-02         1.33913E+03         4.94150E-01         1.75274E+03         2.66045E+03         2.01000E+03         6.50453E+02
+          1.55197E-03         9.87352E-03        -2.75557E-03         9.75087E-02         8.39695E-01         9.75476E-02         1.30930E+03         4.94145E-01         1.62134E+03         2.47869E+03         1.85146E+03         6.27231E+02
+          1.55197E-03         1.00433E-02        -2.86184E-03         9.75085E-02         8.50366E-01         9.75505E-02         1.28166E+03         4.94141E-01         1.49733E+03         2.31059E+03         1.70241E+03         6.08177E+02
+          1.55197E-03         1.02132E-02        -2.96992E-03         9.75083E-02         8.61037E-01         9.75535E-02         1.25607E+03         4.94137E-01         1.38050E+03         2.15566E+03         1.56261E+03         5.93047E+02
+          1.55197E-03         1.03830E-02        -3.07981E-03         9.75082E-02         8.71707E-01         9.75568E-02         1.23240E+03         4.94132E-01         1.27063E+03         2.01340E+03         1.43181E+03         5.81593E+02
+          1.55197E-03         1.05528E-02        -3.19151E-03         9.75080E-02         8.82378E-01         9.75602E-02         1.21052E+03         4.94127E-01         1.16748E+03         1.88331E+03         1.30974E+03         5.73569E+02
+          1.55197E-03         1.07227E-02        -3.30503E-03         9.75078E-02         8.93048E-01         9.75638E-02         1.19030E+03         4.94122E-01         1.07080E+03         1.76487E+03         1.19614E+03         5.68728E+02
+          1.55197E-03         1.08925E-02        -3.42036E-03         9.75076E-02         9.03719E-01         9.75676E-02         1.17161E+03         4.94116E-01         9.80332E+02         1.65757E+03         1.09074E+03         5.66827E+02
+          1.55197E-03         1.10623E-02        -3.53750E-03         9.75074E-02         9.14389E-01         9.75716E-02         1.15433E+03         4.94110E-01         8.95821E+02         1.56087E+03         9.93244E+02         5.67623E+02
+          1.55197E-03         1.12321E-02        -3.65646E-03         9.75073E-02         9.25060E-01         9.75758E-02         1.13833E+03         4.94104E-01         8.16996E+02         1.47425E+03         9.03369E+02         5.70876E+02
+          1.55197E-03         1.14020E-02        -3.77722E-03         9.75071E-02         9.35731E-01         9.75802E-02         1.12350E+03         4.94098E-01         7.43582E+02         1.39717E+03         8.20819E+02         5.76354E+02
+          1.55197E-03         1.15718E-02        -3.89980E-03         9.75069E-02         9.46401E-01         9.75848E-02         1.10973E+03         4.94091E-01         6.75304E+02         1.32912E+03         7.45299E+02         5.83824E+02
+          1.55197E-03         1.17416E-02        -4.02420E-03         9.75067E-02         9.57072E-01         9.75897E-02         1.09689E+03         4.94084E-01         6.11882E+02         1.26957E+03         6.76507E+02         5.93063E+02
+          1.55197E-03         1.19114E-02        -4.15040E-03         9.75065E-02         9.67742E-01         9.75948E-02         1.08489E+03         4.94076E-01         5.53040E+02         1.21799E+03         6.14143E+02         6.03851E+02
+          1.55197E-03         1.20813E-02        -4.27842E-03         9.75063E-02         9.78413E-01         9.76001E-02         1.07363E+03         4.94068E-01         4.98504E+02         1.17388E+03         5.57904E+02         6.15976E+02
+          1.55197E-03         1.22511E-02        -4.40825E-03         9.75061E-02         9.89083E-01         9.76057E-02         1.06300E+03         4.94060E-01         4.48009E+02         1.13672E+03         5.07490E+02         6.29233E+02
+          1.55197E-03         1.24209E-02        -4.53989E-03         9.75059E-02         9.99754E-01         9.76115E-02         1.05292E+03         4.94052E-01         4.01300E+02         1.10602E+03         4.62598E+02         6.43424E+02
+          1.55197E-03         1.25908E-02        -4.67334E-03         9.75057E-02         1.01042E+00         9.76176E-02         1.04329E+03         4.94043E-01         3.58140E+02         1.08129E+03         4.22931E+02         6.58360E+02
+          1.55197E-03         1.27606E-02        -4.80861E-03         9.75055E-02         1.02110E+00         9.76240E-02         1.03405E+03         4.94033E-01         3.18316E+02         1.06205E+03         3.88192E+02         6.73859E+02
+          1.55197E-03         1.29304E-02        -4.94569E-03         9.75053E-02         1.03177E+00         9.76306E-02         1.02510E+03         4.94024E-01         2.81647E+02         1.04784E+03         3.58088E+02         6.89749E+02
+          1.55197E-03         1.31002E-02        -5.08458E-03         9.75050E-02         1.04244E+00         9.76375E-02         1.01638E+03         4.94014E-01         2.48003E+02         1.03820E+03         3.32333E+02         7.05865E+02
+          1.55197E-03         1.32701E-02        -5.22529E-03         9.75048E-02         1.05311E+00         9.76447E-02         1.00782E+03         4.94003E-01         2.17318E+02         1.03270E+03         3.10642E+02         7.22055E+02
+          1.55197E-03         1.34399E-02        -5.36781E-03         9.75046E-02         1.06378E+00         9.76522E-02         9.99364E+02         4.93992E-01         1.89621E+02         1.03091E+03         2.92737E+02         7.38171E+02
+          1.55197E-03         1.36097E-02        -5.51214E-03         9.75044E-02         1.07445E+00         9.76601E-02         9.90957E+02         4.93981E-01         1.65071E+02         1.03243E+03         2.78347E+02         7.54080E+02
+          1.55197E-03         1.37795E-02        -5.65828E-03         9.75042E-02         1.08512E+00         9.76682E-02         9.82546E+02         4.93969E-01         1.44007E+02         1.03686E+03         2.67207E+02         7.69654E+02
+          1.55197E-03         1.39494E-02        -5.80624E-03         9.75039E-02         1.09579E+00         9.76766E-02         9.74089E+02         4.93956E-01         1.26975E+02         1.04384E+03         2.59059E+02         7.84778E+02
+          1.55197E-03         1.41192E-02        -5.95600E-03         9.75037E-02         1.10646E+00         9.76854E-02         9.65546E+02         4.93943E-01         1.14693E+02         1.05300E+03         2.53652E+02         7.99345E+02
+          1.55197E-03         1.42890E-02        -6.10759E-03         9.75035E-02         1.11713E+00         9.76946E-02         9.56882E+02         4.93930E-01         1.07843E+02         1.06400E+03         2.50743E+02         8.13257E+02
+          1.55197E-03         1.44589E-02        -6.26098E-03         9.75032E-02         1.12780E+00         9.77040E-02         9.48067E+02         4.93916E-01         1.06687E+02         1.07653E+03         2.50098E+02         8.26427E+02
+          1.55197E-03         1.46287E-02        -6.41619E-03         9.75030E-02         1.13847E+00         9.77139E-02         9.39078E+02         4.93902E-01         1.10777E+02         1.09027E+03         2.51492E+02         8.38777E+02
+          1.55197E-03         1.47985E-02        -6.57321E-03         9.75027E-02         1.14914E+00         9.77241E-02         9.29894E+02         4.93887E-01         1.19085E+02         1.10495E+03         2.54708E+02         8.50238E+02
+          1.55197E-03         1.49683E-02        -6.73204E-03         9.75025E-02         1.15981E+00         9.77346E-02         9.20499E+02         4.93871E-01         1.30428E+02         1.12029E+03         2.59538E+02         8.60749E+02
+          1.55197E-03         1.51382E-02        -6.89268E-03         9.75022E-02         1.17048E+00         9.77456E-02         9.10881E+02         4.93855E-01         1.43788E+02         1.13604E+03         2.65783E+02         8.70259E+02
+          1.55197E-03         1.53080E-02        -7.05514E-03         9.75020E-02         1.18115E+00         9.77569E-02         9.01033E+02         4.93839E-01         1.58406E+02         1.15198E+03         2.73255E+02         8.78727E+02
+          1.55197E-03         1.54778E-02        -7.21941E-03         9.75017E-02         1.19182E+00         9.77686E-02         8.90951E+02         4.93822E-01         1.73757E+02         1.16789E+03         2.81773E+02         8.86116E+02
+          1.55197E-03         1.56476E-02        -7.38549E-03         9.75015E-02         1.20249E+00         9.77808E-02         8.80633E+02         4.93804E-01         1.89478E+02         1.18357E+03         2.91167E+02         8.92402E+02
+          1.55197E-03         1.58175E-02        -7.55339E-03         9.75012E-02         1.21317E+00         9.77934E-02         8.70083E+02         4.93786E-01         2.05320E+02         1.19884E+03         3.01277E+02         8.97565E+02
+          1.55197E-03         1.59873E-02        -7.72310E-03         9.75009E-02         1.22384E+00         9.78063E-02         8.59307E+02         4.93767E-01         2.21105E+02         1.21355E+03         3.11951E+02         9.01594E+02
+          1.55197E-03         1.61571E-02        -7.89462E-03         9.75007E-02         1.23451E+00         9.78198E-02         8.48312E+02         4.93747E-01         2.36703E+02         1.22753E+03         3.23048E+02         9.04485E+02
+          1.55197E-03         1.63270E-02        -8.06795E-03         9.75004E-02         1.24518E+00         9.78336E-02         8.37110E+02         4.93727E-01         2.52013E+02         1.24068E+03         3.34436E+02         9.06239E+02
+          1.55197E-03         1.64968E-02        -8.24310E-03         9.75001E-02         1.25585E+00         9.78480E-02         8.25714E+02         4.93706E-01         2.66957E+02         1.25286E+03         3.45992E+02         9.06866E+02
+          1.55197E-03         1.66666E-02        -8.42006E-03         9.74999E-02         1.26652E+00         9.78628E-02         8.14140E+02         4.93684E-01         2.81469E+02         1.26398E+03         3.57601E+02         9.06379E+02
+          1.55197E-03         1.68364E-02        -8.59884E-03         9.74996E-02         1.27719E+00         9.78780E-02         8.02403E+02         4.93662E-01         2.95497E+02         1.27396E+03         3.69159E+02         9.04799E+02
+          1.55197E-03         1.70063E-02        -8.77942E-03         9.74993E-02         1.28786E+00         9.78938E-02         7.90524E+02         4.93639E-01         3.08995E+02         1.28272E+03         3.80571E+02         9.02149E+02
+          1.55197E-03         1.71761E-02        -8.96182E-03         9.74990E-02         1.29853E+00         9.79100E-02         7.78521E+02         4.93615E-01         3.21922E+02         1.29021E+03         3.91748E+02         8.98460E+02
+          1.55197E-03         1.73459E-02        -9.14603E-03         9.74987E-02         1.30920E+00         9.79268E-02         7.66416E+02         4.93591E-01         3.34246E+02         1.29638E+03         4.02611E+02         8.93764E+02
+          1.55197E-03         1.75158E-02        -9.33206E-03         9.74985E-02         1.31987E+00         9.79440E-02         7.54231E+02         4.93565E-01         3.45936E+02         1.30119E+03         4.13090E+02         8.88100E+02
+          1.55197E-03         1.76856E-02        -9.51990E-03         9.74982E-02         1.33054E+00         9.79618E-02         7.41988E+02         4.93539E-01         3.56969E+02         1.30463E+03         4.23122E+02         8.81507E+02
+          1.55197E-03         1.78554E-02        -9.70955E-03         9.74979E-02         1.34121E+00         9.79801E-02         7.29709E+02         4.93513E-01         3.67323E+02         1.30668E+03         4.32651E+02         8.74031E+02
+          1.55197E-03         1.80252E-02        -9.90101E-03         9.74976E-02         1.35188E+00         9.79990E-02         7.17419E+02         4.93485E-01         3.76981E+02         1.30734E+03         4.41628E+02         8.65715E+02
+          1.55197E-03         1.81951E-02        -1.00943E-02         9.74973E-02         1.36255E+00         9.80184E-02         7.05139E+02         4.93457E-01         3.85930E+02         1.30662E+03         4.50012E+02         8.56611E+02
+          1.55197E-03         1.83649E-02        -1.02894E-02         9.74970E-02         1.37322E+00         9.80384E-02         6.92894E+02         4.93428E-01         3.94160E+02         1.30454E+03         4.57769E+02         8.46767E+02
+          1.55197E-03         1.85347E-02        -1.04863E-02         9.74967E-02         1.38389E+00         9.80590E-02         6.80705E+02         4.93398E-01         4.01665E+02         1.30111E+03         4.64870E+02         8.36236E+02
+          1.55197E-03         1.87045E-02        -1.06850E-02         9.74964E-02         1.39457E+00         9.80801E-02         6.68596E+02         4.93367E-01         4.08442E+02         1.29636E+03         4.71293E+02         8.25070E+02
+          1.55197E-03         1.88744E-02        -1.08855E-02         9.74960E-02         1.40524E+00         9.81018E-02         6.56587E+02         4.93335E-01         4.14490E+02         1.29034E+03         4.77021E+02         8.13324E+02
+          1.55197E-03         1.90442E-02        -1.10879E-02         9.74957E-02         1.41591E+00         9.81242E-02         6.44699E+02         4.93303E-01         4.19813E+02         1.28309E+03         4.82043E+02         8.01051E+02
+          1.55197E-03         1.92140E-02        -1.12920E-02         9.74954E-02         1.42658E+00         9.81472E-02         6.32953E+02         4.93269E-01         4.24417E+02         1.27466E+03         4.86352E+02         7.88306E+02
+          1.55197E-03         1.93839E-02        -1.14980E-02         9.74951E-02         1.43725E+00         9.81708E-02         6.21368E+02         4.93235E-01         4.28309E+02         1.26509E+03         4.89947E+02         7.75143E+02
+          1.55197E-03         1.95537E-02        -1.17058E-02         9.74948E-02         1.44792E+00         9.81950E-02         6.09962E+02         4.93200E-01         4.31501E+02         1.25445E+03         4.92830E+02         7.61617E+02
+          1.55197E-03         1.97235E-02        -1.19154E-02         9.74944E-02         1.45859E+00         9.82199E-02         5.98752E+02         4.93163E-01         4.34007E+02         1.24279E+03         4.95007E+02         7.47779E+02
+          1.55197E-03         1.98933E-02        -1.21268E-02         9.74941E-02         1.46926E+00         9.82454E-02         5.87753E+02         4.93126E-01         4.35841E+02         1.23017E+03         4.96490E+02         7.33683E+02
+          1.55197E-03         2.00632E-02        -1.23400E-02         9.74938E-02         1.47993E+00         9.82716E-02         5.76980E+02         4.93088E-01         4.37022E+02         1.21667E+03         4.97291E+02         7.19379E+02
+          1.55197E-03         2.02330E-02        -1.25550E-02         9.74934E-02         1.49060E+00         9.82985E-02         5.66446E+02         4.93049E-01         4.37568E+02         1.20234E+03         4.97427E+02         7.04917E+02
+          1.55197E-03         2.04028E-02        -1.27719E-02         9.74931E-02         1.50127E+00         9.83261E-02         5.56164E+02         4.93009E-01         4.37500E+02         1.18726E+03         4.96918E+02         6.90346E+02
+          1.55197E-03         2.05726E-02        -1.29905E-02         9.74928E-02         1.51194E+00         9.83544E-02         5.46143E+02         4.92968E-01         4.36841E+02         1.17150E+03         4.95784E+02         6.75712E+02
+          1.55197E-03         2.07425E-02        -1.32110E-02         9.74924E-02         1.52261E+00         9.83835E-02         5.36392E+02         4.92926E-01         4.35615E+02         1.15511E+03         4.94051E+02         6.61059E+02
+          1.55197E-03         2.09123E-02        -1.34333E-02         9.74921E-02         1.53328E+00         9.84132E-02         5.26920E+02         4.92883E-01         4.33845E+02         1.13817E+03         4.91743E+02         6.46430E+02
+          1.55197E-03         2.10821E-02        -1.36574E-02         9.74917E-02         1.54395E+00         9.84437E-02         5.17733E+02         4.92838E-01         4.31558E+02         1.12076E+03         4.88889E+02         6.31866E+02
+          1.55197E-03         2.12520E-02        -1.38833E-02         9.74914E-02         1.55462E+00         9.84750E-02         5.08836E+02         4.92793E-01         4.28780E+02         1.10292E+03         4.85516E+02         6.17406E+02
+          1.55197E-03         2.14218E-02        -1.41111E-02         9.74910E-02         1.56529E+00         9.85070E-02         5.00232E+02         4.92747E-01         4.25537E+02         1.08474E+03         4.81655E+02         6.03085E+02
+          1.55197E-03         2.15916E-02        -1.43406E-02         9.74907E-02         1.57596E+00         9.85398E-02         4.91924E+02         4.92699E-01         4.21858E+02         1.06627E+03         4.77335E+02         5.88937E+02
+          1.55197E-03         2.17614E-02        -1.45719E-02         9.74903E-02         1.58664E+00         9.85733E-02         4.83912E+02         4.92650E-01         4.17769E+02         1.04758E+03         4.72588E+02         5.74994E+02
+          1.55197E-03         2.19313E-02        -1.48051E-02         9.74900E-02         1.59731E+00         9.86077E-02         4.76197E+02         4.92601E-01         4.13299E+02         1.02873E+03         4.67446E+02         5.61285E+02
+          1.55197E-03         2.21011E-02        -1.50401E-02         9.74896E-02         1.60798E+00         9.86429E-02         4.68778E+02         4.92550E-01         4.08475E+02         1.00978E+03         4.61940E+02         5.47835E+02
+          1.55197E-03         2.22709E-02        -1.52769E-02         9.74892E-02         1.61865E+00         9.86789E-02         4.61651E+02         4.92498E-01         4.03324E+02         9.90773E+02         4.56103E+02         5.34670E+02
+          1.55197E-03         2.24407E-02        -1.55155E-02         9.74889E-02         1.62932E+00         9.87158E-02         4.54813E+02         4.92444E-01         3.97875E+02         9.71776E+02         4.49965E+02         5.21811E+02
+          1.55197E-03         2.26106E-02        -1.57559E-02         9.74885E-02         1.63999E+00         9.87535E-02         4.48260E+02         4.92390E-01         3.92154E+02         9.52835E+02         4.43558E+02         5.09278E+02
+          1.55197E-03         2.27804E-02        -1.59982E-02         9.74881E-02         1.65066E+00         9.87921E-02         4.41986E+02         4.92334E-01         3.86187E+02         9.33999E+02         4.36913E+02         4.97087E+02
+          1.55197E-03         2.29502E-02        -1.62422E-02         9.74877E-02         1.66133E+00         9.88315E-02         4.35985E+02         4.92277E-01         3.80002E+02         9.15312E+02         4.30060E+02         4.85252E+02
+          1.55197E-03         2.31201E-02        -1.64881E-02         9.74873E-02         1.67200E+00         9.88718E-02         4.30250E+02         4.92219E-01         3.73622E+02         8.96816E+02         4.23029E+02         4.73787E+02
+          1.55197E-03         2.32899E-02        -1.67358E-02         9.74870E-02         1.68267E+00         9.89131E-02         4.24772E+02         4.92160E-01         3.67074E+02         8.78550E+02         4.15849E+02         4.62701E+02
+          1.55197E-03         2.34597E-02        -1.69852E-02         9.74866E-02         1.69334E+00         9.89552E-02         4.19543E+02         4.92099E-01         3.60382E+02         8.60550E+02         4.08547E+02         4.52003E+02
+          1.55197E-03         2.36295E-02        -1.72365E-02         9.74862E-02         1.70401E+00         9.89983E-02         4.14554E+02         4.92037E-01         3.53568E+02         8.42848E+02         4.01150E+02         4.41698E+02
+          1.55197E-03         2.37994E-02        -1.74897E-02         9.74858E-02         1.71468E+00         9.90423E-02         4.09794E+02         4.91974E-01         3.46655E+02         8.25474E+02         3.93684E+02         4.31790E+02
+          1.55197E-03         2.39692E-02        -1.77446E-02         9.74854E-02         1.72535E+00         9.90872E-02         4.05256E+02         4.91909E-01         3.39664E+02         8.08455E+02         3.86174E+02         4.22281E+02
+          1.55197E-03         2.41390E-02        -1.80013E-02         9.74850E-02         1.73602E+00         9.91331E-02         4.00926E+02         4.91843E-01         3.32617E+02         7.91815E+02         3.78643E+02         4.13172E+02
+          1.55197E-03         2.43088E-02        -1.82599E-02         9.74846E-02         1.74669E+00         9.91800E-02         3.96795E+02         4.91776E-01         3.25534E+02         7.75574E+02         3.71113E+02         4.04461E+02
+          1.55197E-03         2.44787E-02        -1.85203E-02         9.74842E-02         1.75736E+00         9.92279E-02         3.92853E+02         4.91707E-01         3.18432E+02         7.59750E+02         3.63605E+02         3.96145E+02
+          1.55197E-03         2.46485E-02        -1.87825E-02         9.74838E-02         1.76804E+00         9.92767E-02         3.89087E+02         4.91637E-01         3.11330E+02         7.44359E+02         3.56139E+02         3.88220E+02
+          1.55197E-03         2.48183E-02        -1.90465E-02         9.74834E-02         1.77871E+00         9.93266E-02         3.85486E+02         4.91565E-01         3.04246E+02         7.29412E+02         3.48733E+02         3.80679E+02
+          1.55197E-03         2.49882E-02        -1.93123E-02         9.74830E-02         1.78938E+00         9.93775E-02         3.82039E+02         4.91492E-01         2.97195E+02         7.14920E+02         3.41404E+02         3.73516E+02
+          1.55197E-03         2.51580E-02        -1.95799E-02         9.74825E-02         1.80005E+00         9.94295E-02         3.78735E+02         4.91418E-01         2.90192E+02         7.00889E+02         3.34168E+02         3.66722E+02
+          1.55197E-03         2.53278E-02        -1.98493E-02         9.74821E-02         1.81072E+00         9.94825E-02         3.75564E+02         4.91342E-01         2.83251E+02         6.87326E+02         3.27039E+02         3.60287E+02
+          1.55197E-03         2.54976E-02        -2.01206E-02         9.74817E-02         1.82139E+00         9.95365E-02         3.72513E+02         4.91265E-01         2.76387E+02         6.74232E+02         3.20030E+02         3.54203E+02
+          1.55197E-03         2.56675E-02        -2.03937E-02         9.74813E-02         1.83206E+00         9.95917E-02         3.69572E+02         4.91186E-01         2.69610E+02         6.61609E+02         3.13152E+02         3.48457E+02
+          1.55197E-03         2.58373E-02        -2.06685E-02         9.74809E-02         1.84273E+00         9.96479E-02         3.66730E+02         4.91106E-01         2.62933E+02         6.49454E+02         3.06417E+02         3.43037E+02
+          1.55197E-03         2.60071E-02        -2.09452E-02         9.74804E-02         1.85340E+00         9.97053E-02         3.63978E+02         4.91024E-01         2.56367E+02         6.37765E+02         2.99834E+02         3.37931E+02
+          1.55197E-03         2.61769E-02        -2.12238E-02         9.74800E-02         1.86407E+00         9.97637E-02         3.61304E+02         4.90940E-01         2.49922E+02         6.26537E+02         2.93411E+02         3.33127E+02
+          1.72180E-03         8.72665E-04         2.65733E-04         1.08184E-01         2.74155E-01         1.08184E-01         7.93458E+03         4.79696E-01         1.68522E+04         3.11066E+04         2.16921E+04         9.41449E+03
+          1.72180E-03         1.04249E-03         2.55515E-04         1.08184E-01         2.84826E-01         1.08184E-01         7.75433E+03         4.79696E-01         1.65215E+04         3.04327E+04         2.12608E+04         9.17194E+03
+          1.72180E-03         1.21232E-03         2.43485E-04         1.08184E-01         2.95496E-01         1.08184E-01         7.57158E+03         4.79696E-01         1.61843E+04         2.97469E+04         2.08209E+04         8.92595E+03
+          1.72180E-03         1.38215E-03         2.29643E-04         1.08184E-01         3.06167E-01         1.08184E-01         7.38672E+03         4.79696E-01         1.58411E+04         2.90504E+04         2.03734E+04         8.67703E+03
+          1.72180E-03         1.55197E-03         2.13988E-04         1.08184E-01         3.16838E-01         1.08184E-01         7.20014E+03         4.79696E-01         1.54926E+04         2.83447E+04         1.99189E+04         8.42573E+03
+          1.72180E-03         1.72180E-03         1.96522E-04         1.08184E-01         3.27508E-01         1.08184E-01         7.01224E+03         4.79696E-01         1.51394E+04         2.76309E+04         1.94583E+04         8.17256E+03
+          1.72180E-03         1.89163E-03         1.77243E-04         1.08184E-01         3.38179E-01         1.08184E-01         6.82339E+03         4.79696E-01         1.47820E+04         2.69103E+04         1.89923E+04         7.91806E+03
+          1.72180E-03         2.06146E-03         1.56152E-04         1.08184E-01         3.48849E-01         1.08184E-01         6.63398E+03         4.79696E-01         1.44210E+04         2.61843E+04         1.85216E+04         7.66273E+03
+          1.72180E-03         2.23128E-03         1.33249E-04         1.08184E-01         3.59520E-01         1.08184E-01         6.44438E+03         4.79696E-01         1.40570E+04         2.54541E+04         1.80470E+04         7.40709E+03
+          1.72180E-03         2.40111E-03         1.08534E-04         1.08184E-01         3.70190E-01         1.08184E-01         6.25495E+03         4.79696E-01         1.36905E+04         2.47210E+04         1.75694E+04         7.15163E+03
+          1.72180E-03         2.57094E-03         8.20067E-05         1.08184E-01         3.80861E-01         1.08184E-01         6.06607E+03         4.79696E-01         1.33223E+04         2.39862E+04         1.70893E+04         6.89686E+03
+          1.72180E-03         2.74077E-03         5.36672E-05         1.08184E-01         3.91532E-01         1.08184E-01         5.87806E+03         4.79696E-01         1.29527E+04         2.32509E+04         1.66077E+04         6.64324E+03
+          1.72180E-03         2.91059E-03         2.35155E-05         1.08184E-01         4.02202E-01         1.08184E-01         5.69128E+03         4.79697E-01         1.25825E+04         2.25164E+04         1.61252E+04         6.39124E+03
+          1.72180E-03         3.08042E-03        -8.44835E-06         1.08183E-01         4.12873E-01         1.08183E-01         5.50604E+03         4.79697E-01         1.22121E+04         2.17838E+04         1.56425E+04         6.14132E+03
+          1.72180E-03         3.25025E-03        -4.22244E-05         1.08183E-01         4.23543E-01         1.08183E-01         5.32266E+03         4.79697E-01         1.18421E+04         2.10543E+04         1.51604E+04         5.89391E+03
+          1.72180E-03         3.42008E-03        -7.78126E-05         1.08183E-01         4.34214E-01         1.08183E-01         5.14144E+03         4.79697E-01         1.14729E+04         2.03289E+04         1.46795E+04         5.64943E+03
+          1.72180E-03         3.58990E-03        -1.15213E-04         1.08183E-01         4.44884E-01         1.08183E-01         4.96267E+03         4.79697E-01         1.11052E+04         1.96088E+04         1.42005E+04         5.40830E+03
+          1.72180E-03         3.75973E-03        -1.54426E-04         1.08183E-01         4.55555E-01         1.08183E-01         4.78661E+03         4.79697E-01         1.07395E+04         1.88950E+04         1.37241E+04         5.17089E+03
+          1.72180E-03         3.92956E-03        -1.95450E-04         1.08183E-01         4.66225E-01         1.08183E-01         4.61353E+03         4.79697E-01         1.03761E+04         1.81885E+04         1.32509E+04         4.93756E+03
+          1.72180E-03         4.09939E-03        -2.38287E-04         1.08183E-01         4.76896E-01         1.08183E-01         4.44367E+03         4.79697E-01         1.00157E+04         1.74902E+04         1.27816E+04         4.70868E+03
+          1.72180E-03         4.26921E-03        -2.82937E-04         1.08183E-01         4.87567E-01         1.08183E-01         4.27725E+03         4.79697E-01         9.65855E+03         1.68012E+04         1.23166E+04         4.48455E+03
+          1.72180E-03         4.43904E-03        -3.29398E-04         1.08183E-01         4.98237E-01         1.08183E-01         4.11447E+03         4.79697E-01         9.30522E+03         1.61222E+04         1.18567E+04         4.26549E+03
+          1.72180E-03         4.60887E-03        -3.77672E-04         1.08183E-01         5.08908E-01         1.08183E-01         3.95554E+03         4.79697E-01         8.95609E+03         1.54541E+04         1.14024E+04         4.05178E+03
+          1.72180E-03         4.77869E-03        -4.27757E-04         1.08183E-01         5.19578E-01         1.08184E-01         3.80063E+03         4.79696E-01         8.61158E+03         1.47978E+04         1.09541E+04         3.84368E+03
+          1.72180E-03         4.94852E-03        -4.79655E-04         1.08183E-01         5.30249E-01         1.08184E-01         3.64989E+03         4.79696E-01         8.27205E+03         1.41538E+04         1.05124E+04         3.64143E+03
+          1.72180E-03         5.11835E-03        -5.33366E-04         1.08183E-01         5.40919E-01         1.08184E-01         3.50346E+03         4.79696E-01         7.93787E+03         1.35230E+04         1.00777E+04         3.44525E+03
+          1.72180E-03         5.28818E-03        -5.88888E-04         1.08182E-01         5.51590E-01         1.08184E-01         3.36148E+03         4.79696E-01         7.60938E+03         1.29059E+04         9.65056E+03         3.25532E+03
+          1.72180E-03         5.45800E-03        -6.46223E-04         1.08182E-01         5.62261E-01         1.08184E-01         3.22404E+03         4.79696E-01         7.28691E+03         1.23031E+04         9.23132E+03         3.07182E+03
+          1.72180E-03         5.62783E-03        -7.05370E-04         1.08182E-01         5.72931E-01         1.08185E-01         3.09123E+03         4.79695E-01         6.97074E+03         1.17153E+04         8.82040E+03         2.89489E+03
+          1.72180E-03         5.79766E-03        -7.66329E-04         1.08182E-01         5.83602E-01         1.08185E-01         2.96313E+03         4.79695E-01         6.66116E+03         1.11428E+04         8.41815E+03         2.72466E+03
+          1.72180E-03         5.96749E-03        -8.29100E-04         1.08182E-01         5.94272E-01         1.08185E-01         2.83979E+03         4.79694E-01         6.35842E+03         1.05861E+04         8.02491E+03         2.56124E+03
+          1.72180E-03         6.13731E-03        -8.93684E-04         1.08182E-01         6.04943E-01         1.08186E-01         2.72125E+03         4.79694E-01         6.06275E+03         1.00457E+04         7.64098E+03         2.40469E+03
+          1.72180E-03         6.30714E-03        -9.60080E-04         1.08182E-01         6.15613E-01         1.08186E-01         2.60754E+03         4.79693E-01         5.77436E+03         9.52172E+03         7.26664E+03         2.25507E+03
+          1.72180E-03         6.47697E-03        -1.02829E-03         1.08182E-01         6.26284E-01         1.08187E-01         2.49866E+03         4.79693E-01         5.49345E+03         9.01459E+03         6.90215E+03         2.11243E+03
+          1.72180E-03         6.64680E-03        -1.09831E-03         1.08182E-01         6.36955E-01         1.08187E-01         2.39461E+03         4.79692E-01         5.22019E+03         8.52450E+03         6.54772E+03         1.97678E+03
+          1.72180E-03         6.81662E-03        -1.17014E-03         1.08181E-01         6.47625E-01         1.08188E-01         2.29537E+03         4.79691E-01         4.95470E+03         8.05166E+03         6.20355E+03         1.84811E+03
+          1.72180E-03         6.98645E-03        -1.24379E-03         1.08181E-01         6.58296E-01         1.08188E-01         2.20089E+03         4.79690E-01         4.69712E+03         7.59618E+03         5.86979E+03         1.72639E+03
+          1.72180E-03         7.15628E-03        -1.31924E-03         1.08181E-01         6.68966E-01         1.08189E-01         2.11113E+03         4.79689E-01         4.44755E+03         7.15817E+03         5.54659E+03         1.61158E+03
+          1.72180E-03         7.32611E-03        -1.39651E-03         1.08181E-01         6.79637E-01         1.08190E-01         2.02603E+03         4.79688E-01         4.20607E+03         6.73768E+03         5.23406E+03         1.50362E+03
+          1.72180E-03         7.49593E-03        -1.47559E-03         1.08181E-01         6.90307E-01         1.08191E-01         1.94552E+03         4.79687E-01         3.97274E+03         6.33469E+03         4.93228E+03         1.40242E+03
+          1.72180E-03         7.66576E-03        -1.55649E-03         1.08181E-01         7.00978E-01         1.08192E-01         1.86951E+03         4.79686E-01         3.74760E+03         5.94918E+03         4.64130E+03         1.30788E+03
+          1.72180E-03         7.83559E-03        -1.63920E-03         1.08181E-01         7.11649E-01         1.08193E-01         1.79791E+03         4.79685E-01         3.53066E+03         5.58106E+03         4.36115E+03         1.21990E+03
+          1.72180E-03         8.00542E-03        -1.72371E-03         1.08181E-01         7.22319E-01         1.08194E-01         1.73060E+03         4.79683E-01         3.32192E+03         5.23019E+03         4.09185E+03         1.13834E+03
+          1.72180E-03         8.17524E-03        -1.81005E-03         1.08180E-01         7.32990E-01         1.08196E-01         1.66749E+03         4.79682E-01         3.12137E+03         4.89643E+03         3.83337E+03         1.06306E+03
+          1.72180E-03         8.34507E-03        -1.89819E-03         1.08180E-01         7.43660E-01         1.08197E-01         1.60843E+03         4.79680E-01         2.92896E+03         4.57958E+03         3.58568E+03         9.93901E+02
+          1.72180E-03         8.51490E-03        -1.98814E-03         1.08180E-01         7.54331E-01         1.08198E-01         1.55331E+03         4.79678E-01         2.74464E+03         4.27940E+03         3.34870E+03         9.30691E+02
+          1.72180E-03         8.68473E-03        -2.07991E-03         1.08180E-01         7.65001E-01         1.08200E-01         1.50199E+03         4.79676E-01         2.56833E+03         3.99562E+03         3.12236E+03         8.73252E+02
+          1.72180E-03         8.85455E-03        -2.17349E-03         1.08180E-01         7.75672E-01         1.08202E-01         1.45432E+03         4.79674E-01         2.39995E+03         3.72795E+03         2.90655E+03         8.21392E+02
+          1.72180E-03         9.02438E-03        -2.26889E-03         1.08180E-01         7.86343E-01         1.08203E-01         1.41016E+03         4.79672E-01         2.23937E+03         3.47606E+03         2.70115E+03         7.74912E+02
+          1.72180E-03         9.19421E-03        -2.36609E-03         1.08179E-01         7.97013E-01         1.08205E-01         1.36936E+03         4.79670E-01         2.08649E+03         3.23961E+03         2.50600E+03         7.33603E+02
+          1.72180E-03         9.36403E-03        -2.46511E-03         1.08179E-01         8.07684E-01         1.08207E-01         1.33175E+03         4.79667E-01         1.94115E+03         3.01821E+03         2.32096E+03         6.97250E+02
+          1.72180E-03         9.53386E-03        -2.56594E-03         1.08179E-01         8.18354E-01         1.08209E-01         1.29719E+03         4.79664E-01         1.80321E+03         2.81146E+03         2.14583E+03         6.65631E+02
+          1.72180E-03         9.70369E-03        -2.66858E-03         1.08179E-01         8.29025E-01         1.08212E-01         1.26550E+03         4.79662E-01         1.67251E+03         2.61896E+03         1.98044E+03         6.38519E+02
+          1.72180E-03         9.87352E-03        -2.77304E-03         1.08179E-01         8.39695E-01         1.08214E-01         1.23653E+03         4.79659E-01         1.54886E+03         2.44024E+03         1.82456E+03         6.15683E+02
+          1.72180E-03         1.00433E-02        -2.87930E-03         1.08179E-01         8.50366E-01         1.08217E-01         1.21013E+03         4.79655E-01         1.43206E+03         2.27488E+03         1.67799E+03         5.96890E+02
+          1.72180E-03         1.02132E-02        -2.98738E-03         1.08178E-01         8.61037E-01         1.08220E-01         1.18611E+03         4.79652E-01         1.32193E+03         2.12238E+03         1.54048E+03         5.81903E+02
+          1.72180E-03         1.03830E-02        -3.09728E-03         1.08178E-01         8.71707E-01         1.08222E-01         1.16433E+03         4.79648E-01         1.21823E+03         1.98228E+03         1.41180E+03         5.70484E+02
+          1.72180E-03         1.05528E-02        -3.20898E-03         1.08178E-01         8.82378E-01         1.08226E-01         1.14462E+03         4.79645E-01         1.12076E+03         1.85408E+03         1.29168E+03         5.62397E+02
+          1.72180E-03         1.07227E-02        -3.32250E-03         1.08178E-01         8.93048E-01         1.08229E-01         1.12683E+03         4.79641E-01         1.02927E+03         1.73728E+03         1.17988E+03         5.57404E+02
+          1.72180E-03         1.08925E-02        -3.43783E-03         1.08178E-01         9.03719E-01         1.08232E-01         1.11080E+03         4.79636E-01         9.43533E+02         1.63137E+03         1.07611E+03         5.55269E+02
+          1.72180E-03         1.10623E-02        -3.55497E-03         1.08177E-01         9.14389E-01         1.08236E-01         1.09637E+03         4.79632E-01         8.63292E+02         1.53585E+03         9.80097E+02         5.55758E+02
+          1.72180E-03         1.12321E-02        -3.67392E-03         1.08177E-01         9.25060E-01         1.08240E-01         1.08341E+03         4.79627E-01         7.88296E+02         1.45021E+03         8.91565E+02         5.58642E+02
+          1.72180E-03         1.14020E-02        -3.79469E-03         1.08177E-01         9.35731E-01         1.08243E-01         1.07176E+03         4.79622E-01         7.18286E+02         1.37392E+03         8.10225E+02         5.63693E+02
+          1.72180E-03         1.15718E-02        -3.91727E-03         1.08177E-01         9.46401E-01         1.08248E-01         1.06128E+03         4.79617E-01         6.53000E+02         1.30647E+03         7.35784E+02         5.70689E+02
+          1.72180E-03         1.17416E-02        -4.04166E-03         1.08177E-01         9.57072E-01         1.08252E-01         1.05184E+03         4.79612E-01         5.92175E+02         1.24736E+03         6.67950E+02         5.79414E+02
+          1.72180E-03         1.19114E-02        -4.16787E-03         1.08176E-01         9.67742E-01         1.08257E-01         1.04331E+03         4.79606E-01         5.35549E+02         1.19608E+03         6.06429E+02         5.89655E+02
+          1.72180E-03         1.20813E-02        -4.29588E-03         1.08176E-01         9.78413E-01         1.08261E-01         1.03557E+03         4.79600E-01         4.82859E+02         1.15213E+03         5.50923E+02         6.01207E+02
+          1.72180E-03         1.22511E-02        -4.42571E-03         1.08176E-01         9.89083E-01         1.08266E-01         1.02849E+03         4.79594E-01         4.33853E+02         1.11501E+03         5.01140E+02         6.13872E+02
+          1.72180E-03         1.24209E-02        -4.55735E-03         1.08176E-01         9.99754E-01         1.08272E-01         1.02196E+03         4.79588E-01         3.88282E+02         1.08424E+03         4.56783E+02         6.27459E+02
+          1.72180E-03         1.25908E-02        -4.69081E-03         1.08175E-01         1.01042E+00         1.08277E-01         1.01588E+03         4.79581E-01         3.45912E+02         1.05934E+03         4.17560E+02         6.41784E+02
+          1.72180E-03         1.27606E-02        -4.82608E-03         1.08175E-01         1.02110E+00         1.08283E-01         1.01014E+03         4.79574E-01         3.06530E+02         1.03985E+03         3.83183E+02         6.56670E+02
+          1.72180E-03         1.29304E-02        -4.96316E-03         1.08175E-01         1.03177E+00         1.08289E-01         1.00466E+03         4.79567E-01         2.69942E+02         1.02532E+03         3.53364E+02         6.71952E+02
+          1.72180E-03         1.31002E-02        -5.10205E-03         1.08175E-01         1.04244E+00         1.08295E-01         9.99339E+02         4.79559E-01         2.35995E+02         1.01529E+03         3.27822E+02         6.87470E+02
+          1.72180E-03         1.32701E-02        -5.24275E-03         1.08174E-01         1.05311E+00         1.08301E-01         9.94102E+02         4.79551E-01         2.04586E+02         1.00935E+03         3.06278E+02         7.03075E+02
+          1.72180E-03         1.34399E-02        -5.38527E-03         1.08174E-01         1.06378E+00         1.08308E-01         9.88875E+02         4.79543E-01         1.75688E+02         1.00709E+03         2.88461E+02         7.18625E+02
+          1.72180E-03         1.36097E-02        -5.52960E-03         1.08174E-01         1.07445E+00         1.08315E-01         9.83589E+02         4.79534E-01         1.49394E+02         1.00809E+03         2.74104E+02         7.33989E+02
+          1.72180E-03         1.37795E-02        -5.67575E-03         1.08174E-01         1.08512E+00         1.08323E-01         9.78185E+02         4.79525E-01         1.25992E+02         1.01199E+03         2.62947E+02         7.49044E+02
+          1.72180E-03         1.39494E-02        -5.82370E-03         1.08173E-01         1.09579E+00         1.08330E-01         9.72606E+02         4.79515E-01         1.06069E+02         1.01842E+03         2.54738E+02         7.63678E+02
+          1.72180E-03         1.41192E-02        -5.97347E-03         1.08173E-01         1.10646E+00         1.08338E-01         9.66806E+02         4.79506E-01         9.06404E+01         1.02702E+03         2.49231E+02         7.77785E+02
+          1.72180E-03         1.42890E-02        -6.12505E-03         1.08173E-01         1.11713E+00         1.08346E-01         9.60741E+02         4.79496E-01         8.10917E+01         1.03746E+03         2.46188E+02         7.91271E+02
+          1.72180E-03         1.44589E-02        -6.27844E-03         1.08173E-01         1.12780E+00         1.08355E-01         9.54376E+02         4.79485E-01         7.85522E+01         1.04943E+03         2.45380E+02         8.04051E+02
+          1.72180E-03         1.46287E-02        -6.43365E-03         1.08172E-01         1.13847E+00         1.08364E-01         9.47681E+02         4.79474E-01         8.28528E+01         1.06263E+03         2.46584E+02         8.16049E+02
+          1.72180E-03         1.47985E-02        -6.59067E-03         1.08172E-01         1.14914E+00         1.08373E-01         9.40631E+02         4.79463E-01         9.24331E+01         1.07678E+03         2.49588E+02         8.27195E+02
+          1.72180E-03         1.49683E-02        -6.74950E-03         1.08172E-01         1.15981E+00         1.08382E-01         9.33207E+02         4.79451E-01         1.05402E+02         1.09162E+03         2.54188E+02         8.37432E+02
+          1.72180E-03         1.51382E-02        -6.91015E-03         1.08172E-01         1.17048E+00         1.08392E-01         9.25394E+02         4.79439E-01         1.20311E+02         1.10690E+03         2.60190E+02         8.46709E+02
+          1.72180E-03         1.53080E-02        -7.07260E-03         1.08171E-01         1.18115E+00         1.08402E-01         9.17185E+02         4.79426E-01         1.36237E+02         1.12239E+03         2.67406E+02         8.54984E+02
+          1.72180E-03         1.54778E-02        -7.23687E-03         1.08171E-01         1.19182E+00         1.08413E-01         9.08574E+02         4.79413E-01         1.52626E+02         1.13788E+03         2.75661E+02         8.62222E+02
+          1.72180E-03         1.56476E-02        -7.40296E-03         1.08171E-01         1.20249E+00         1.08424E-01         8.99561E+02         4.79400E-01         1.69139E+02         1.15319E+03         2.84788E+02         8.68398E+02
+          1.72180E-03         1.58175E-02        -7.57085E-03         1.08170E-01         1.21317E+00         1.08435E-01         8.90151E+02         4.79386E-01         1.85563E+02         1.16812E+03         2.94629E+02         8.73491E+02
+          1.72180E-03         1.59873E-02        -7.74056E-03         1.08170E-01         1.22384E+00         1.08447E-01         8.80351E+02         4.79372E-01         2.01758E+02         1.18253E+03         3.05034E+02         8.77491E+02
+          1.72180E-03         1.61571E-02        -7.91208E-03         1.08170E-01         1.23451E+00         1.08459E-01         8.70173E+02         4.79357E-01         2.17627E+02         1.19626E+03         3.15865E+02         8.80393E+02
+          1.72180E-03         1.63270E-02        -8.08542E-03         1.08170E-01         1.24518E+00         1.08471E-01         8.59631E+02         4.79341E-01         2.33095E+02         1.20919E+03         3.26992E+02         8.82196E+02
+          1.72180E-03         1.64968E-02        -8.26057E-03         1.08169E-01         1.25585E+00         1.08484E-01         8.48743E+02         4.79326E-01         2.48107E+02         1.22120E+03         3.38293E+02         8.82910E+02
+          1.72180E-03         1.66666E-02        -8.43753E-03         1.08169E-01         1.26652E+00         1.08498E-01         8.37529E+02         4.79309E-01         2.62618E+02         1.23220E+03         3.49657E+02         8.82546E+02
+          1.72180E-03         1.68364E-02        -8.61630E-03         1.08169E-01         1.27719E+00         1.08511E-01         8.26011E+02         4.79292E-01         2.76589E+02         1.24210E+03         3.60979E+02         8.81123E+02
+          1.72180E-03         1.70063E-02        -8.79689E-03         1.08168E-01         1.28786E+00         1.08525E-01         8.14214E+02         4.79275E-01         2.89987E+02         1.25083E+03         3.72167E+02         8.78664E+02
+          1.72180E-03         1.71761E-02        -8.97928E-03         1.08168E-01         1.29853E+00         1.08540E-01         8.02164E+02         4.79257E-01         3.02784E+02         1.25833E+03         3.83132E+02         8.75197E+02
+          1.72180E-03         1.73459E-02        -9.16350E-03         1.08168E-01         1.30920E+00         1.08555E-01         7.89888E+02         4.79238E-01         3.14956E+02         1.26455E+03         3.93797E+02         8.70753E+02
+          1.72180E-03         1.75158E-02        -9.34952E-03         1.08167E-01         1.31987E+00         1.08571E-01         7.77416E+02         4.79219E-01         3.26481E+02         1.26946E+03         4.04093E+02         8.65369E+02
+          1.72180E-03         1.76856E-02        -9.53736E-03         1.08167E-01         1.33054E+00         1.08587E-01         7.64776E+02         4.79200E-01         3.37342E+02         1.27304E+03         4.13956E+02         8.59082E+02
+          1.72180E-03         1.78554E-02        -9.72701E-03         1.08167E-01         1.34121E+00         1.08603E-01         7.51999E+02         4.79179E-01         3.47524E+02         1.27527E+03         4.23332E+02         8.51935E+02
+          1.72180E-03         1.80252E-02        -9.91847E-03         1.08166E-01         1.35188E+00         1.08620E-01         7.39116E+02         4.79159E-01         3.57015E+02         1.27614E+03         4.32173E+02         8.43971E+02
+          1.72180E-03         1.81951E-02        -1.01118E-02         1.08166E-01         1.36255E+00         1.08638E-01         7.26158E+02         4.79137E-01         3.65806E+02         1.27567E+03         4.40437E+02         8.35238E+02
+          1.72180E-03         1.83649E-02        -1.03068E-02         1.08166E-01         1.37322E+00         1.08656E-01         7.13155E+02         4.79115E-01         3.73890E+02         1.27387E+03         4.48091E+02         8.25783E+02
+          1.72180E-03         1.85347E-02        -1.05037E-02         1.08165E-01         1.38389E+00         1.08674E-01         7.00138E+02         4.79092E-01         3.81265E+02         1.27076E+03         4.55105E+02         8.15657E+02
+          1.72180E-03         1.87045E-02        -1.07025E-02         1.08165E-01         1.39457E+00         1.08693E-01         6.87136E+02         4.79069E-01         3.87929E+02         1.26637E+03         4.61457E+02         8.04909E+02
+          1.72180E-03         1.88744E-02        -1.09030E-02         1.08165E-01         1.40524E+00         1.08713E-01         6.74179E+02         4.79045E-01         3.93885E+02         1.26072E+03         4.67132E+02         7.93593E+02
+          1.72180E-03         1.90442E-02        -1.11053E-02         1.08164E-01         1.41591E+00         1.08733E-01         6.61296E+02         4.79021E-01         3.99138E+02         1.25388E+03         4.72116E+02         7.81760E+02
+          1.72180E-03         1.92140E-02        -1.13095E-02         1.08164E-01         1.42658E+00         1.08754E-01         6.48514E+02         4.78995E-01         4.03693E+02         1.24587E+03         4.76403E+02         7.69463E+02
+          1.72180E-03         1.93839E-02        -1.15155E-02         1.08164E-01         1.43725E+00         1.08775E-01         6.35860E+02         4.78969E-01         4.07561E+02         1.23674E+03         4.79991E+02         7.56754E+02
+          1.72180E-03         1.95537E-02        -1.17232E-02         1.08163E-01         1.44792E+00         1.08797E-01         6.23358E+02         4.78943E-01         4.10753E+02         1.22657E+03         4.82883E+02         7.43684E+02
+          1.72180E-03         1.97235E-02        -1.19328E-02         1.08163E-01         1.45859E+00         1.08819E-01         6.11033E+02         4.78915E-01         4.13283E+02         1.21539E+03         4.85083E+02         7.30306E+02
+          1.72180E-03         1.98933E-02        -1.21442E-02         1.08163E-01         1.46926E+00         1.08842E-01         5.98906E+02         4.78887E-01         4.15165E+02         1.20327E+03         4.86603E+02         7.16670E+02
+          1.72180E-03         2.00632E-02        -1.23575E-02         1.08162E-01         1.47993E+00         1.08866E-01         5.86999E+02         4.78858E-01         4.16418E+02         1.19028E+03         4.87454E+02         7.02825E+02
+          1.72180E-03         2.02330E-02        -1.25725E-02         1.08162E-01         1.49060E+00         1.08890E-01         5.75331E+02         4.78829E-01         4.17059E+02         1.17647E+03         4.87653E+02         6.88819E+02
+          1.72180E-03         2.04028E-02        -1.27893E-02         1.08161E-01         1.50127E+00         1.08915E-01         5.63919E+02         4.78798E-01         4.17109E+02         1.16192E+03         4.87218E+02         6.74700E+02
+          1.72180E-03         2.05726E-02        -1.30080E-02         1.08161E-01         1.51194E+00         1.08940E-01         5.52780E+02         4.78767E-01         4.16589E+02         1.14668E+03         4.86170E+02         6.60512E+02
+          1.72180E-03         2.07425E-02        -1.32285E-02         1.08161E-01         1.52261E+00         1.08967E-01         5.41928E+02         4.78735E-01         4.15523E+02         1.13083E+03         4.84533E+02         6.46299E+02
+          1.72180E-03         2.09123E-02        -1.34508E-02         1.08160E-01         1.53328E+00         1.08993E-01         5.31375E+02         4.78703E-01         4.13932E+02         1.11443E+03         4.82331E+02         6.32103E+02
+          1.72180E-03         2.10821E-02        -1.36749E-02         1.08160E-01         1.54395E+00         1.09021E-01         5.21131E+02         4.78669E-01         4.11843E+02         1.09755E+03         4.79592E+02         6.17962E+02
+          1.72180E-03         2.12520E-02        -1.39008E-02         1.08160E-01         1.55462E+00         1.09049E-01         5.11207E+02         4.78635E-01         4.09279E+02         1.08026E+03         4.76342E+02         6.03915E+02
+          1.72180E-03         2.14218E-02        -1.41285E-02         1.08159E-01         1.56529E+00         1.09078E-01         5.01609E+02         4.78600E-01         4.06266E+02         1.06261E+03         4.72610E+02         5.89996E+02
+          1.72180E-03         2.15916E-02        -1.43581E-02         1.08159E-01         1.57596E+00         1.09108E-01         4.92342E+02         4.78564E-01         4.02830E+02         1.04467E+03         4.68428E+02         5.76239E+02
+          1.72180E-03         2.17614E-02        -1.45894E-02         1.08158E-01         1.58664E+00         1.09138E-01         4.83412E+02         4.78527E-01         3.98997E+02         1.02650E+03         4.63824E+02         5.62674E+02
+          1.72180E-03         2.19313E-02        -1.48226E-02         1.08158E-01         1.59731E+00         1.09169E-01         4.74820E+02         4.78490E-01         3.94793E+02         1.00816E+03         4.58830E+02         5.49330E+02
+          1.72180E-03         2.21011E-02        -1.50576E-02         1.08158E-01         1.60798E+00         1.09201E-01         4.66567E+02         4.78451E-01         3.90245E+02         9.89709E+02         4.53476E+02         5.36233E+02
+          1.72180E-03         2.22709E-02        -1.52944E-02         1.08157E-01         1.61865E+00         1.09233E-01         4.58653E+02         4.78412E-01         3.85378E+02         9.71200E+02         4.47794E+02         5.23406E+02
+          1.72180E-03         2.24407E-02        -1.55330E-02         1.08157E-01         1.62932E+00         1.09266E-01         4.51075E+02         4.78372E-01         3.80219E+02         9.52687E+02         4.41816E+02         5.10871E+02
+          1.72180E-03         2.26106E-02        -1.57734E-02         1.08156E-01         1.63999E+00         1.09300E-01         4.43831E+02         4.78330E-01         3.74792E+02         9.34218E+02         4.35570E+02         4.98648E+02
+          1.72180E-03         2.27804E-02        -1.60156E-02         1.08156E-01         1.65066E+00         1.09335E-01         4.36915E+02         4.78288E-01         3.69124E+02         9.15840E+02         4.29088E+02         4.86752E+02
+          1.72180E-03         2.29502E-02        -1.62597E-02         1.08155E-01         1.66133E+00         1.09371E-01         4.30323E+02         4.78245E-01         3.63238E+02         8.97599E+02         4.22400E+02         4.75199E+02
+          1.72180E-03         2.31201E-02        -1.65055E-02         1.08155E-01         1.67200E+00         1.09407E-01         4.24047E+02         4.78201E-01         3.57158E+02         8.79534E+02         4.15534E+02         4.64000E+02
+          1.72180E-03         2.32899E-02        -1.67532E-02         1.08155E-01         1.68267E+00         1.09444E-01         4.18078E+02         4.78157E-01         3.50910E+02         8.61684E+02         4.08518E+02         4.53166E+02
+          1.72180E-03         2.34597E-02        -1.70027E-02         1.08154E-01         1.69334E+00         1.09483E-01         4.12409E+02         4.78111E-01         3.44514E+02         8.44086E+02         4.01381E+02         4.42705E+02
+          1.72180E-03         2.36295E-02        -1.72540E-02         1.08154E-01         1.70401E+00         1.09521E-01         4.07030E+02         4.78064E-01         3.37993E+02         8.26771E+02         3.94147E+02         4.32624E+02
+          1.72180E-03         2.37994E-02        -1.75071E-02         1.08153E-01         1.71468E+00         1.09561E-01         4.01931E+02         4.78016E-01         3.31368E+02         8.09769E+02         3.86844E+02         4.22925E+02
+          1.72180E-03         2.39692E-02        -1.77621E-02         1.08153E-01         1.72535E+00         1.09602E-01         3.97099E+02         4.77968E-01         3.24661E+02         7.93106E+02         3.79494E+02         4.13612E+02
+          1.72180E-03         2.41390E-02        -1.80188E-02         1.08152E-01         1.73602E+00         1.09643E-01         3.92525E+02         4.77918E-01         3.17891E+02         7.76806E+02         3.72120E+02         4.04686E+02
+          1.72180E-03         2.43088E-02        -1.82774E-02         1.08152E-01         1.74669E+00         1.09686E-01         3.88195E+02         4.77867E-01         3.11076E+02         7.60890E+02         3.64746E+02         3.96145E+02
+          1.72180E-03         2.44787E-02        -1.85377E-02         1.08152E-01         1.75736E+00         1.09729E-01         3.84097E+02         4.77815E-01         3.04234E+02         7.45376E+02         3.57390E+02         3.87986E+02
+          1.72180E-03         2.46485E-02        -1.87999E-02         1.08151E-01         1.76804E+00         1.09773E-01         3.80219E+02         4.77762E-01         2.97384E+02         7.30280E+02         3.50073E+02         3.80206E+02
+          1.72180E-03         2.48183E-02        -1.90639E-02         1.08151E-01         1.77871E+00         1.09818E-01         3.76547E+02         4.77708E-01         2.90541E+02         7.15612E+02         3.42813E+02         3.72799E+02
+          1.72180E-03         2.49882E-02        -1.93297E-02         1.08150E-01         1.78938E+00         1.09864E-01         3.73069E+02         4.77654E-01         2.83721E+02         7.01385E+02         3.35626E+02         3.65759E+02
+          1.72180E-03         2.51580E-02        -1.95974E-02         1.08150E-01         1.80005E+00         1.09911E-01         3.69771E+02         4.77597E-01         2.76938E+02         6.87606E+02         3.28528E+02         3.59078E+02
+          1.72180E-03         2.53278E-02        -1.98668E-02         1.08149E-01         1.81072E+00         1.09959E-01         3.66639E+02         4.77540E-01         2.70207E+02         6.74280E+02         3.21533E+02         3.52747E+02
+          1.72180E-03         2.54976E-02        -2.01381E-02         1.08149E-01         1.82139E+00         1.10008E-01         3.63662E+02         4.77482E-01         2.63540E+02         6.61409E+02         3.14654E+02         3.46755E+02
+          1.72180E-03         2.56675E-02        -2.04111E-02         1.08148E-01         1.83206E+00         1.10058E-01         3.60826E+02         4.77423E-01         2.56949E+02         6.48996E+02         3.07902E+02         3.41094E+02
+          1.72180E-03         2.58373E-02        -2.06860E-02         1.08148E-01         1.84273E+00         1.10108E-01         3.58117E+02         4.77363E-01         2.50446E+02         6.37040E+02         3.01289E+02         3.35751E+02
+          1.72180E-03         2.60071E-02        -2.09627E-02         1.08147E-01         1.85340E+00         1.10160E-01         3.55525E+02         4.77301E-01         2.44042E+02         6.25537E+02         2.94823E+02         3.30715E+02
+          1.72180E-03         2.61769E-02        -2.12412E-02         1.08147E-01         1.86407E+00         1.10213E-01         3.53036E+02         4.77238E-01         2.37747E+02         6.14484E+02         2.88512E+02         3.25972E+02
+          1.89163E-03         8.72665E-04         2.46454E-04         1.18855E-01         2.74155E-01         1.18855E-01         8.83536E+03         4.68116E-01         1.56612E+04         3.03183E+04         2.12340E+04         9.08432E+03
+          1.89163E-03         1.04249E-03         2.36236E-04         1.18854E-01         2.84826E-01         1.18855E-01         8.62619E+03         4.68116E-01         1.53552E+04         2.96636E+04         2.08124E+04         8.85116E+03
+          1.89163E-03         1.21232E-03         2.24206E-04         1.18854E-01         2.95496E-01         1.18855E-01         8.41415E+03         4.68116E-01         1.50432E+04         2.89973E+04         2.03826E+04         8.61467E+03
+          1.89163E-03         1.38215E-03         2.10364E-04         1.18854E-01         3.06167E-01         1.18855E-01         8.19969E+03         4.68116E-01         1.47256E+04         2.83206E+04         1.99452E+04         8.37536E+03
+          1.89163E-03         1.55197E-03         1.94710E-04         1.18854E-01         3.16838E-01         1.18855E-01         7.98326E+03         4.68116E-01         1.44032E+04         2.76348E+04         1.95011E+04         8.13373E+03
+          1.89163E-03         1.72180E-03         1.77243E-04         1.18854E-01         3.27508E-01         1.18855E-01         7.76534E+03         4.68116E-01         1.40763E+04         2.69412E+04         1.90509E+04         7.89029E+03
+          1.89163E-03         1.89163E-03         1.57964E-04         1.18854E-01         3.38179E-01         1.18854E-01         7.54636E+03         4.68116E-01         1.37455E+04         2.62409E+04         1.85954E+04         7.64555E+03
+          1.89163E-03         2.06146E-03         1.36874E-04         1.18854E-01         3.48849E-01         1.18854E-01         7.32677E+03         4.68116E-01         1.34114E+04         2.55353E+04         1.81353E+04         7.39999E+03
+          1.89163E-03         2.23128E-03         1.13971E-04         1.18854E-01         3.59520E-01         1.18854E-01         7.10701E+03         4.68116E-01         1.30745E+04         2.48256E+04         1.76715E+04         7.15411E+03
+          1.89163E-03         2.40111E-03         8.92554E-05         1.18854E-01         3.70190E-01         1.18854E-01         6.88750E+03         4.68116E-01         1.27354E+04         2.41129E+04         1.72045E+04         6.90838E+03
+          1.89163E-03         2.57094E-03         6.27281E-05         1.18854E-01         3.80861E-01         1.18854E-01         6.66867E+03         4.68116E-01         1.23945E+04         2.33986E+04         1.67353E+04         6.66329E+03
+          1.89163E-03         2.74077E-03         3.43886E-05         1.18854E-01         3.91532E-01         1.18854E-01         6.45093E+03         4.68116E-01         1.20524E+04         2.26837E+04         1.62644E+04         6.41928E+03
+          1.89163E-03         2.91059E-03         4.23689E-06         1.18854E-01         4.02202E-01         1.18854E-01         6.23465E+03         4.68116E-01         1.17097E+04         2.19695E+04         1.57927E+04         6.17681E+03
+          1.89163E-03         3.08042E-03        -2.77270E-05         1.18854E-01         4.12873E-01         1.18854E-01         6.02024E+03         4.68116E-01         1.13667E+04         2.12571E+04         1.53208E+04         5.93630E+03
+          1.89163E-03         3.25025E-03        -6.15030E-05         1.18854E-01         4.23543E-01         1.18854E-01         5.80805E+03         4.68117E-01         1.10241E+04         2.05476E+04         1.48494E+04         5.69820E+03
+          1.89163E-03         3.42008E-03        -9.70912E-05         1.18854E-01         4.34214E-01         1.18854E-01         5.59845E+03         4.68117E-01         1.06823E+04         1.98421E+04         1.43792E+04         5.46288E+03
+          1.89163E-03         3.58990E-03        -1.34492E-04         1.18854E-01         4.44884E-01         1.18854E-01         5.39175E+03         4.68117E-01         1.03419E+04         1.91416E+04         1.39109E+04         5.23075E+03
+          1.89163E-03         3.75973E-03        -1.73704E-04         1.18854E-01         4.55555E-01         1.18854E-01         5.18829E+03         4.68117E-01         1.00031E+04         1.84472E+04         1.34450E+04         5.00218E+03
+          1.89163E-03         3.92956E-03        -2.14729E-04         1.18854E-01         4.66225E-01         1.18854E-01         4.98836E+03         4.68117E-01         9.66661E+03         1.77598E+04         1.29823E+04         4.77751E+03
+          1.89163E-03         4.09939E-03        -2.57566E-04         1.18854E-01         4.76896E-01         1.18854E-01         4.79225E+03         4.68117E-01         9.33275E+03         1.70804E+04         1.25233E+04         4.55709E+03
+          1.89163E-03         4.26921E-03        -3.02215E-04         1.18853E-01         4.87567E-01         1.18854E-01         4.60022E+03         4.68117E-01         9.00195E+03         1.64098E+04         1.20686E+04         4.34122E+03
+          1.89163E-03         4.43904E-03        -3.48676E-04         1.18853E-01         4.98237E-01         1.18854E-01         4.41252E+03         4.68117E-01         8.67463E+03         1.57489E+04         1.16188E+04         4.13019E+03
+          1.89163E-03         4.60887E-03        -3.96950E-04         1.18853E-01         5.08908E-01         1.18854E-01         4.22937E+03         4.68117E-01         8.35118E+03         1.50986E+04         1.11743E+04         3.92429E+03
+          1.89163E-03         4.77869E-03        -4.47036E-04         1.18853E-01         5.19578E-01         1.18854E-01         4.05098E+03         4.68116E-01         8.03196E+03         1.44596E+04         1.07358E+04         3.72376E+03
+          1.89163E-03         4.94852E-03        -4.98934E-04         1.18853E-01         5.30249E-01         1.18854E-01         3.87753E+03         4.68116E-01         7.71734E+03         1.38326E+04         1.03037E+04         3.52883E+03
+          1.89163E-03         5.11835E-03        -5.52644E-04         1.18853E-01         5.40919E-01         1.18854E-01         3.70920E+03         4.68116E-01         7.40763E+03         1.32182E+04         9.87849E+03         3.33972E+03
+          1.89163E-03         5.28818E-03        -6.08167E-04         1.18853E-01         5.51590E-01         1.18854E-01         3.54611E+03         4.68116E-01         7.10317E+03         1.26172E+04         9.46057E+03         3.15660E+03
+          1.89163E-03         5.45800E-03        -6.65501E-04         1.18853E-01         5.62261E-01         1.18855E-01         3.38841E+03         4.68116E-01         6.80424E+03         1.20300E+04         9.05037E+03         2.97964E+03
+          1.89163E-03         5.62783E-03        -7.24648E-04         1.18853E-01         5.72931E-01         1.18855E-01         3.23620E+03         4.68116E-01         6.51112E+03         1.14573E+04         8.64827E+03         2.80899E+03
+          1.89163E-03         5.79766E-03        -7.85607E-04         1.18853E-01         5.83602E-01         1.18855E-01         3.08956E+03         4.68115E-01         6.22408E+03         1.08994E+04         8.25463E+03         2.64476E+03
+          1.89163E-03         5.96749E-03        -8.48379E-04         1.18852E-01         5.94272E-01         1.18855E-01         2.94855E+03         4.68115E-01         5.94333E+03         1.03568E+04         7.86978E+03         2.48706E+03
+          1.89163E-03         6.13731E-03        -9.12962E-04         1.18852E-01         6.04943E-01         1.18856E-01         2.81323E+03         4.68115E-01         5.66911E+03         9.82997E+03         7.49401E+03         2.33596E+03
+          1.89163E-03         6.30714E-03        -9.79358E-04         1.18852E-01         6.15613E-01         1.18856E-01         2.68363E+03         4.68114E-01         5.40160E+03         9.31912E+03         7.12760E+03         2.19152E+03
+          1.89163E-03         6.47697E-03        -1.04757E-03         1.18852E-01         6.26284E-01         1.18857E-01         2.55974E+03         4.68114E-01         5.14099E+03         8.82457E+03         6.77079E+03         2.05378E+03
+          1.89163E-03         6.64680E-03        -1.11759E-03         1.18852E-01         6.36955E-01         1.18857E-01         2.44157E+03         4.68114E-01         4.88742E+03         8.34654E+03         6.42381E+03         1.92274E+03
+          1.89163E-03         6.81662E-03        -1.18942E-03         1.18852E-01         6.47625E-01         1.18858E-01         2.32910E+03         4.68113E-01         4.64102E+03         7.88524E+03         6.08683E+03         1.79841E+03
+          1.89163E-03         6.98645E-03        -1.26306E-03         1.18852E-01         6.58296E-01         1.18858E-01         2.22227E+03         4.68112E-01         4.40193E+03         7.44078E+03         5.76002E+03         1.68076E+03
+          1.89163E-03         7.15628E-03        -1.33852E-03         1.18852E-01         6.68966E-01         1.18859E-01         2.12103E+03         4.68112E-01         4.17021E+03         7.01327E+03         5.44352E+03         1.56975E+03
+          1.89163E-03         7.32611E-03        -1.41579E-03         1.18851E-01         6.79637E-01         1.18860E-01         2.02531E+03         4.68111E-01         3.94596E+03         6.60276E+03         5.13743E+03         1.46533E+03
+          1.89163E-03         7.49593E-03        -1.49487E-03         1.18851E-01         6.90307E-01         1.18861E-01         1.93503E+03         4.68110E-01         3.72923E+03         6.20925E+03         4.84184E+03         1.36741E+03
+          1.89163E-03         7.66576E-03        -1.57577E-03         1.18851E-01         7.00978E-01         1.18862E-01         1.85008E+03         4.68110E-01         3.52005E+03         5.83270E+03         4.55680E+03         1.27590E+03
+          1.89163E-03         7.83559E-03        -1.65847E-03         1.18851E-01         7.11649E-01         1.18862E-01         1.77035E+03         4.68109E-01         3.31844E+03         5.47304E+03         4.28235E+03         1.19069E+03
+          1.89163E-03         8.00542E-03        -1.74299E-03         1.18851E-01         7.22319E-01         1.18864E-01         1.69571E+03         4.68108E-01         3.12439E+03         5.13015E+03         4.01848E+03         1.11166E+03
+          1.89163E-03         8.17524E-03        -1.82932E-03         1.18851E-01         7.32990E-01         1.18865E-01         1.62604E+03         4.68107E-01         2.93790E+03         4.80387E+03         3.76519E+03         1.03868E+03
+          1.89163E-03         8.34507E-03        -1.91747E-03         1.18850E-01         7.43660E-01         1.18866E-01         1.56118E+03         4.68106E-01         2.75892E+03         4.49403E+03         3.52244E+03         9.71588E+02
+          1.89163E-03         8.51490E-03        -2.00742E-03         1.18850E-01         7.54331E-01         1.18867E-01         1.50099E+03         4.68104E-01         2.58740E+03         4.20039E+03         3.29016E+03         9.10229E+02
+          1.89163E-03         8.68473E-03        -2.09919E-03         1.18850E-01         7.65001E-01         1.18869E-01         1.44530E+03         4.68103E-01         2.42326E+03         3.92271E+03         3.06828E+03         8.54431E+02
+          1.89163E-03         8.85455E-03        -2.19277E-03         1.18850E-01         7.75672E-01         1.18870E-01         1.39393E+03         4.68102E-01         2.26644E+03         3.66070E+03         2.85669E+03         8.04010E+02
+          1.89163E-03         9.02438E-03        -2.28816E-03         1.18850E-01         7.86343E-01         1.18872E-01         1.34673E+03         4.68100E-01         2.11681E+03         3.41404E+03         2.65527E+03         7.58776E+02
+          1.89163E-03         9.19421E-03        -2.38537E-03         1.18850E-01         7.97013E-01         1.18873E-01         1.30349E+03         4.68099E-01         1.97428E+03         3.18241E+03         2.46388E+03         7.18529E+02
+          1.89163E-03         9.36403E-03        -2.48439E-03         1.18849E-01         8.07684E-01         1.18875E-01         1.26405E+03         4.68097E-01         1.83871E+03         2.96543E+03         2.28236E+03         6.83063E+02
+          1.89163E-03         9.53386E-03        -2.58522E-03         1.18849E-01         8.18354E-01         1.18877E-01         1.22821E+03         4.68095E-01         1.70995E+03         2.76272E+03         2.11055E+03         6.52166E+02
+          1.89163E-03         9.70369E-03        -2.68786E-03         1.18849E-01         8.29025E-01         1.18879E-01         1.19578E+03         4.68093E-01         1.58786E+03         2.57388E+03         1.94825E+03         6.25622E+02
+          1.89163E-03         9.87352E-03        -2.79231E-03         1.18849E-01         8.39695E-01         1.18882E-01         1.16656E+03         4.68091E-01         1.47226E+03         2.39848E+03         1.79527E+03         6.03209E+02
+          1.89163E-03         1.00433E-02        -2.89858E-03         1.18849E-01         8.50366E-01         1.18884E-01         1.14037E+03         4.68089E-01         1.36298E+03         2.23609E+03         1.65138E+03         5.84702E+02
+          1.89163E-03         1.02132E-02        -3.00666E-03         1.18848E-01         8.61037E-01         1.18886E-01         1.11701E+03         4.68087E-01         1.25982E+03         2.08625E+03         1.51637E+03         5.69877E+02
+          1.89163E-03         1.03830E-02        -3.11655E-03         1.18848E-01         8.71707E-01         1.18889E-01         1.09629E+03         4.68084E-01         1.16259E+03         1.94849E+03         1.38999E+03         5.58504E+02
+          1.89163E-03         1.05528E-02        -3.22826E-03         1.18848E-01         8.82378E-01         1.18892E-01         1.07801E+03         4.68082E-01         1.07108E+03         1.82236E+03         1.27200E+03         5.50355E+02
+          1.89163E-03         1.07227E-02        -3.34177E-03         1.18848E-01         8.93048E-01         1.18895E-01         1.06198E+03         4.68079E-01         9.85068E+02         1.70735E+03         1.16214E+03         5.45204E+02
+          1.89163E-03         1.08925E-02        -3.45710E-03         1.18848E-01         9.03719E-01         1.18898E-01         1.04803E+03         4.68076E-01         9.04335E+02         1.60298E+03         1.06015E+03         5.42824E+02
+          1.89163E-03         1.10623E-02        -3.57425E-03         1.18847E-01         9.14389E-01         1.18901E-01         1.03596E+03         4.68073E-01         8.28646E+02         1.50875E+03         9.65761E+02         5.42991E+02
+          1.89163E-03         1.12321E-02        -3.69320E-03         1.18847E-01         9.25060E-01         1.18904E-01         1.02560E+03         4.68070E-01         7.57766E+02         1.42418E+03         8.78694E+02         5.45482E+02
+          1.89163E-03         1.14020E-02        -3.81397E-03         1.18847E-01         9.35731E-01         1.18908E-01         1.01677E+03         4.68067E-01         6.91453E+02         1.34875E+03         7.98670E+02         5.50081E+02
+          1.89163E-03         1.15718E-02        -3.93655E-03         1.18847E-01         9.46401E-01         1.18912E-01         1.00931E+03         4.68064E-01         6.29462E+02         1.28198E+03         7.25407E+02         5.56573E+02
+          1.89163E-03         1.17416E-02        -4.06094E-03         1.18846E-01         9.57072E-01         1.18916E-01         1.00304E+03         4.68060E-01         5.71547E+02         1.22337E+03         6.58617E+02         5.64750E+02
+          1.89163E-03         1.19114E-02        -4.18714E-03         1.18846E-01         9.67742E-01         1.18920E-01         9.97822E+02         4.68056E-01         5.17463E+02         1.17242E+03         5.98015E+02         5.74407E+02
+          1.89163E-03         1.20813E-02        -4.31516E-03         1.18846E-01         9.78413E-01         1.18924E-01         9.93493E+02         4.68052E-01         4.66963E+02         1.12866E+03         5.43310E+02         5.85347E+02
+          1.89163E-03         1.22511E-02        -4.44499E-03         1.18846E-01         9.89083E-01         1.18929E-01         9.89911E+02         4.68048E-01         4.19808E+02         1.09160E+03         4.94216E+02         5.97379E+02
+          1.89163E-03         1.24209E-02        -4.57663E-03         1.18845E-01         9.99754E-01         1.18933E-01         9.86939E+02         4.68044E-01         3.75763E+02         1.06076E+03         4.50444E+02         6.10319E+02
+          1.89163E-03         1.25908E-02        -4.71009E-03         1.18845E-01         1.01042E+00         1.18938E-01         9.84448E+02         4.68039E-01         3.34602E+02         1.03570E+03         4.11710E+02         6.23989E+02
+          1.89163E-03         1.27606E-02        -4.84535E-03         1.18845E-01         1.02110E+00         1.18944E-01         9.82316E+02         4.68035E-01         2.96110E+02         1.01595E+03         3.77729E+02         6.38219E+02
+          1.89163E-03         1.29304E-02        -4.98243E-03         1.18845E-01         1.03177E+00         1.18949E-01         9.80427E+02         4.68030E-01         2.60091E+02         1.00107E+03         3.48223E+02         6.52849E+02
+          1.89163E-03         1.31002E-02        -5.12133E-03         1.18844E-01         1.04244E+00         1.18955E-01         9.78675E+02         4.68025E-01         2.26369E+02         9.90641E+02         3.22916E+02         6.67725E+02
+          1.89163E-03         1.32701E-02        -5.26203E-03         1.18844E-01         1.05311E+00         1.18961E-01         9.76961E+02         4.68019E-01         1.94801E+02         9.84238E+02         3.01536E+02         6.82701E+02
+          1.89163E-03         1.34399E-02        -5.40455E-03         1.18844E-01         1.06378E+00         1.18967E-01         9.75193E+02         4.68014E-01         1.65292E+02         9.81460E+02         2.83818E+02         6.97642E+02
+          1.89163E-03         1.36097E-02        -5.54888E-03         1.18844E-01         1.07445E+00         1.18973E-01         9.73288E+02         4.68008E-01         1.37821E+02         9.81921E+02         2.69500E+02         7.12420E+02
+          1.89163E-03         1.37795E-02        -5.69502E-03         1.18843E-01         1.08512E+00         1.18980E-01         9.71171E+02         4.68002E-01         1.12504E+02         9.85246E+02         2.58330E+02         7.26917E+02
+          1.89163E-03         1.39494E-02        -5.84298E-03         1.18843E-01         1.09579E+00         1.18987E-01         9.68773E+02         4.67995E-01         8.97230E+01         9.91079E+02         2.50058E+02         7.41021E+02
+          1.89163E-03         1.41192E-02        -5.99275E-03         1.18843E-01         1.10646E+00         1.18994E-01         9.66035E+02         4.67989E-01         7.04055E+01         9.99079E+02         2.44446E+02         7.54633E+02
+          1.89163E-03         1.42890E-02        -6.14433E-03         1.18842E-01         1.11713E+00         1.19001E-01         9.62903E+02         4.67982E-01         5.65350E+01         1.00892E+03         2.41260E+02         7.67660E+02
+          1.89163E-03         1.44589E-02        -6.29772E-03         1.18842E-01         1.12780E+00         1.19009E-01         9.59332E+02         4.67975E-01         5.11447E+01         1.02029E+03         2.40276E+02         7.80018E+02
+          1.89163E-03         1.46287E-02        -6.45293E-03         1.18842E-01         1.13847E+00         1.19017E-01         9.55284E+02         4.67968E-01         5.55582E+01         1.03291E+03         2.41277E+02         7.91633E+02
+          1.89163E-03         1.47985E-02        -6.60995E-03         1.18842E-01         1.14914E+00         1.19025E-01         9.50727E+02         4.67960E-01         6.70713E+01         1.04649E+03         2.44053E+02         8.02439E+02
+          1.89163E-03         1.49683E-02        -6.76878E-03         1.18841E-01         1.15981E+00         1.19034E-01         9.45636E+02         4.67952E-01         8.21906E+01         1.06078E+03         2.48406E+02         8.12378E+02
+          1.89163E-03         1.51382E-02        -6.92942E-03         1.18841E-01         1.17048E+00         1.19043E-01         9.39993E+02         4.67944E-01         9.88523E+01         1.07554E+03         2.54144E+02         8.21400E+02
+          1.89163E-03         1.53080E-02        -7.09188E-03         1.18841E-01         1.18115E+00         1.19052E-01         9.33784E+02         4.67936E-01         1.16065E+02         1.09055E+03         2.61086E+02         8.29464E+02
+          1.89163E-03         1.54778E-02        -7.25615E-03         1.18840E-01         1.19182E+00         1.19062E-01         9.27004E+02         4.67927E-01         1.33348E+02         1.10559E+03         2.69058E+02         8.36536E+02
+          1.89163E-03         1.56476E-02        -7.42223E-03         1.18840E-01         1.20249E+00         1.19072E-01         9.19650E+02         4.67918E-01         1.50455E+02         1.12048E+03         2.77895E+02         8.42589E+02
+          1.89163E-03         1.58175E-02        -7.59013E-03         1.18840E-01         1.21317E+00         1.19082E-01         9.11727E+02         4.67909E-01         1.67246E+02         1.13505E+03         2.87444E+02         8.47604E+02
+          1.89163E-03         1.59873E-02        -7.75984E-03         1.18839E-01         1.22384E+00         1.19092E-01         9.03242E+02         4.67899E-01         1.83637E+02         1.14913E+03         2.97559E+02         8.51569E+02
+          1.89163E-03         1.61571E-02        -7.93136E-03         1.18839E-01         1.23451E+00         1.19103E-01         8.94208E+02         4.67889E-01         1.99570E+02         1.16258E+03         3.08102E+02         8.54477E+02
+          1.89163E-03         1.63270E-02        -8.10469E-03         1.18839E-01         1.24518E+00         1.19115E-01         8.84642E+02         4.67879E-01         2.15004E+02         1.17527E+03         3.18945E+02         8.56329E+02
+          1.89163E-03         1.64968E-02        -8.27984E-03         1.18838E-01         1.25585E+00         1.19126E-01         8.74565E+02         4.67868E-01         2.29908E+02         1.18710E+03         3.29970E+02         8.57131E+02
+          1.89163E-03         1.66666E-02        -8.45680E-03         1.18838E-01         1.26652E+00         1.19139E-01         8.64001E+02         4.67858E-01         2.44254E+02         1.19796E+03         3.41067E+02         8.56895E+02
+          1.89163E-03         1.68364E-02        -8.63558E-03         1.18838E-01         1.27719E+00         1.19151E-01         8.52975E+02         4.67846E-01         2.58019E+02         1.20777E+03         3.52134E+02         8.55637E+02
+          1.89163E-03         1.70063E-02        -8.81616E-03         1.18837E-01         1.28786E+00         1.19164E-01         8.41518E+02         4.67835E-01         2.71182E+02         1.21646E+03         3.63078E+02         8.53379E+02
+          1.89163E-03         1.71761E-02        -8.99856E-03         1.18837E-01         1.29853E+00         1.19177E-01         8.29661E+02         4.67823E-01         2.83726E+02         1.22396E+03         3.73813E+02         8.50147E+02
+          1.89163E-03         1.73459E-02        -9.18277E-03         1.18837E-01         1.30920E+00         1.19191E-01         8.17438E+02         4.67810E-01         2.95634E+02         1.23023E+03         3.84263E+02         8.45970E+02
+          1.89163E-03         1.75158E-02        -9.36880E-03         1.18836E-01         1.31987E+00         1.19205E-01         8.04883E+02         4.67797E-01         3.06893E+02         1.23524E+03         3.94359E+02         8.40882E+02
+          1.89163E-03         1.76856E-02        -9.55664E-03         1.18836E-01         1.33054E+00         1.19220E-01         7.92034E+02         4.67784E-01         3.17490E+02         1.23896E+03         4.04039E+02         8.34920E+02
+          1.89163E-03         1.78554E-02        -9.74629E-03         1.18836E-01         1.34121E+00         1.19235E-01         7.78927E+02         4.67771E-01         3.27416E+02         1.24137E+03         4.13248E+02         8.28124E+02
+          1.89163E-03         1.80252E-02        -9.93775E-03         1.18835E-01         1.35188E+00         1.19250E-01         7.65602E+02         4.67757E-01         3.36663E+02         1.24247E+03         4.21940E+02         8.20534E+02
+          1.89163E-03         1.81951E-02        -1.01310E-02         1.18835E-01         1.36255E+00         1.19266E-01         7.52095E+02         4.67743E-01         3.45226E+02         1.24227E+03         4.30073E+02         8.12197E+02
+          1.89163E-03         1.83649E-02        -1.03261E-02         1.18835E-01         1.37322E+00         1.19282E-01         7.38446E+02         4.67728E-01         3.53102E+02         1.24077E+03         4.37613E+02         8.03158E+02
+          1.89163E-03         1.85347E-02        -1.05230E-02         1.18834E-01         1.38389E+00         1.19299E-01         7.24693E+02         4.67713E-01         3.60290E+02         1.23800E+03         4.44532E+02         7.93464E+02
+          1.89163E-03         1.87045E-02        -1.07217E-02         1.18834E-01         1.39457E+00         1.19316E-01         7.10874E+02         4.67697E-01         3.66791E+02         1.23397E+03         4.50807E+02         7.83164E+02
+          1.89163E-03         1.88744E-02        -1.09223E-02         1.18833E-01         1.40524E+00         1.19334E-01         6.97027E+02         4.67681E-01         3.72610E+02         1.22873E+03         4.56421E+02         7.72308E+02
+          1.89163E-03         1.90442E-02        -1.11246E-02         1.18833E-01         1.41591E+00         1.19353E-01         6.83188E+02         4.67665E-01         3.77751E+02         1.22231E+03         4.61363E+02         7.60946E+02
+          1.89163E-03         1.92140E-02        -1.13288E-02         1.18833E-01         1.42658E+00         1.19371E-01         6.69392E+02         4.67648E-01         3.82222E+02         1.21475E+03         4.65625E+02         7.49128E+02
+          1.89163E-03         1.93839E-02        -1.15347E-02         1.18832E-01         1.43725E+00         1.19391E-01         6.55673E+02         4.67630E-01         3.86034E+02         1.20611E+03         4.69205E+02         7.36904E+02
+          1.89163E-03         1.95537E-02        -1.17425E-02         1.18832E-01         1.44792E+00         1.19411E-01         6.42065E+02         4.67613E-01         3.89198E+02         1.19643E+03         4.72104E+02         7.24325E+02
+          1.89163E-03         1.97235E-02        -1.19521E-02         1.18831E-01         1.45859E+00         1.19431E-01         6.28599E+02         4.67594E-01         3.91727E+02         1.18577E+03         4.74329E+02         7.11440E+02
+          1.89163E-03         1.98933E-02        -1.21635E-02         1.18831E-01         1.46926E+00         1.19452E-01         6.15304E+02         4.67576E-01         3.93636E+02         1.17418E+03         4.75887E+02         6.98297E+02
+          1.89163E-03         2.00632E-02        -1.23767E-02         1.18831E-01         1.47993E+00         1.19473E-01         6.02209E+02         4.67556E-01         3.94943E+02         1.16174E+03         4.76791E+02         6.84945E+02
+          1.89163E-03         2.02330E-02        -1.25918E-02         1.18830E-01         1.49060E+00         1.19496E-01         5.89339E+02         4.67537E-01         3.95665E+02         1.14849E+03         4.77056E+02         6.71429E+02
+          1.89163E-03         2.04028E-02        -1.28086E-02         1.18830E-01         1.50127E+00         1.19518E-01         5.76719E+02         4.67517E-01         3.95821E+02         1.13450E+03         4.76701E+02         6.57796E+02
+          1.89163E-03         2.05726E-02        -1.30273E-02         1.18829E-01         1.51194E+00         1.19541E-01         5.64371E+02         4.67496E-01         3.95432E+02         1.11983E+03         4.75745E+02         6.44089E+02
+          1.89163E-03         2.07425E-02        -1.32478E-02         1.18829E-01         1.52261E+00         1.19565E-01         5.52315E+02         4.67475E-01         3.94519E+02         1.10456E+03         4.74211E+02         6.30349E+02
+          1.89163E-03         2.09123E-02        -1.34700E-02         1.18829E-01         1.53328E+00         1.19590E-01         5.40569E+02         4.67453E-01         3.93104E+02         1.08874E+03         4.72123E+02         6.16617E+02
+          1.89163E-03         2.10821E-02        -1.36941E-02         1.18828E-01         1.54395E+00         1.19615E-01         5.29150E+02         4.67431E-01         3.91210E+02         1.07244E+03         4.69507E+02         6.02932E+02
+          1.89163E-03         2.12520E-02        -1.39201E-02         1.18828E-01         1.55462E+00         1.19640E-01         5.18071E+02         4.67408E-01         3.88861E+02         1.05572E+03         4.66389E+02         5.89330E+02
+          1.89163E-03         2.14218E-02        -1.41478E-02         1.18827E-01         1.56529E+00         1.19667E-01         5.07343E+02         4.67385E-01         3.86080E+02         1.03864E+03         4.62798E+02         5.75845E+02
+          1.89163E-03         2.15916E-02        -1.43773E-02         1.18827E-01         1.57596E+00         1.19693E-01         4.96978E+02         4.67361E-01         3.82893E+02         1.02127E+03         4.58763E+02         5.62509E+02
+          1.89163E-03         2.17614E-02        -1.46087E-02         1.18826E-01         1.58664E+00         1.19721E-01         4.86983E+02         4.67337E-01         3.79322E+02         1.00367E+03         4.54313E+02         5.49353E+02
+          1.89163E-03         2.19313E-02        -1.48419E-02         1.18826E-01         1.59731E+00         1.19749E-01         4.77364E+02         4.67312E-01         3.75393E+02         9.85882E+02         4.49478E+02         5.36403E+02
+          1.89163E-03         2.21011E-02        -1.50768E-02         1.18826E-01         1.60798E+00         1.19778E-01         4.68124E+02         4.67286E-01         3.71131E+02         9.67976E+02         4.44290E+02         5.23686E+02
+          1.89163E-03         2.22709E-02        -1.53136E-02         1.18825E-01         1.61865E+00         1.19808E-01         4.59266E+02         4.67260E-01         3.66560E+02         9.50002E+02         4.38776E+02         5.11225E+02
+          1.89163E-03         2.24407E-02        -1.55522E-02         1.18825E-01         1.62932E+00         1.19838E-01         4.50790E+02         4.67233E-01         3.61703E+02         9.32011E+02         4.32969E+02         4.99041E+02
+          1.89163E-03         2.26106E-02        -1.57927E-02         1.18824E-01         1.63999E+00         1.19869E-01         4.42695E+02         4.67206E-01         3.56586E+02         9.14051E+02         4.26899E+02         4.87153E+02
+          1.89163E-03         2.27804E-02        -1.60349E-02         1.18824E-01         1.65066E+00         1.19901E-01         4.34978E+02         4.67178E-01         3.51230E+02         8.96170E+02         4.20593E+02         4.75577E+02
+          1.89163E-03         2.29502E-02        -1.62789E-02         1.18823E-01         1.66133E+00         1.19933E-01         4.27635E+02         4.67150E-01         3.45661E+02         8.78410E+02         4.14083E+02         4.64328E+02
+          1.89163E-03         2.31201E-02        -1.65248E-02         1.18823E-01         1.67200E+00         1.19966E-01         4.20659E+02         4.67121E-01         3.39900E+02         8.60813E+02         4.07395E+02         4.53418E+02
+          1.89163E-03         2.32899E-02        -1.67725E-02         1.18822E-01         1.68267E+00         1.20000E-01         4.14044E+02         4.67091E-01         3.33969E+02         8.43415E+02         4.00558E+02         4.42857E+02
+          1.89163E-03         2.34597E-02        -1.70220E-02         1.18822E-01         1.69334E+00         1.20035E-01         4.07781E+02         4.67061E-01         3.27890E+02         8.26252E+02         3.93598E+02         4.32654E+02
+          1.89163E-03         2.36295E-02        -1.72733E-02         1.18821E-01         1.70401E+00         1.20070E-01         4.01860E+02         4.67030E-01         3.21683E+02         8.09357E+02         3.86542E+02         4.22815E+02
+          1.89163E-03         2.37994E-02        -1.75264E-02         1.18821E-01         1.71468E+00         1.20107E-01         3.96271E+02         4.66998E-01         3.15369E+02         7.92758E+02         3.79414E+02         4.13344E+02
+          1.89163E-03         2.39692E-02        -1.77813E-02         1.18820E-01         1.72535E+00         1.20144E-01         3.91003E+02         4.66966E-01         3.08967E+02         7.76481E+02         3.72237E+02         4.04244E+02
+          1.89163E-03         2.41390E-02        -1.80381E-02         1.18820E-01         1.73602E+00         1.20181E-01         3.86042E+02         4.66934E-01         3.02496E+02         7.60551E+02         3.65035E+02         3.95517E+02
+          1.89163E-03         2.43088E-02        -1.82966E-02         1.18819E-01         1.74669E+00         1.20220E-01         3.81377E+02         4.66900E-01         2.95973E+02         7.44989E+02         3.57829E+02         3.87160E+02
+          1.89163E-03         2.44787E-02        -1.85570E-02         1.18819E-01         1.75736E+00         1.20259E-01         3.76994E+02         4.66866E-01         2.89417E+02         7.29812E+02         3.50638E+02         3.79173E+02
+          1.89163E-03         2.46485E-02        -1.88192E-02         1.18818E-01         1.76804E+00         1.20300E-01         3.72878E+02         4.66831E-01         2.82842E+02         7.15035E+02         3.43483E+02         3.71552E+02
+          1.89163E-03         2.48183E-02        -1.90832E-02         1.18818E-01         1.77871E+00         1.20341E-01         3.69015E+02         4.66796E-01         2.76265E+02         7.00673E+02         3.36381E+02         3.64291E+02
+          1.89163E-03         2.49882E-02        -1.93490E-02         1.18817E-01         1.78938E+00         1.20383E-01         3.65390E+02         4.66760E-01         2.69701E+02         6.86734E+02         3.29348E+02         3.57386E+02
+          1.89163E-03         2.51580E-02        -1.96166E-02         1.18817E-01         1.80005E+00         1.20425E-01         3.61989E+02         4.66723E-01         2.63163E+02         6.73228E+02         3.22400E+02         3.50828E+02
+          1.89163E-03         2.53278E-02        -1.98861E-02         1.18816E-01         1.81072E+00         1.20469E-01         3.58795E+02         4.66686E-01         2.56665E+02         6.60160E+02         3.15551E+02         3.44609E+02
+          1.89163E-03         2.54976E-02        -2.01573E-02         1.18816E-01         1.82139E+00         1.20514E-01         3.55795E+02         4.66647E-01         2.50220E+02         6.47533E+02         3.08813E+02         3.38720E+02
+          1.89163E-03         2.56675E-02        -2.04304E-02         1.18815E-01         1.83206E+00         1.20559E-01         3.52973E+02         4.66609E-01         2.43840E+02         6.35350E+02         3.02198E+02         3.33152E+02
+          1.89163E-03         2.58373E-02        -2.07053E-02         1.18815E-01         1.84273E+00         1.20605E-01         3.50315E+02         4.66569E-01         2.37535E+02         6.23609E+02         2.95716E+02         3.27893E+02
+          1.89163E-03         2.60071E-02        -2.09820E-02         1.18814E-01         1.85340E+00         1.20653E-01         3.47804E+02         4.66529E-01         2.31316E+02         6.12309E+02         2.89377E+02         3.22932E+02
+          1.89163E-03         2.61769E-02        -2.12605E-02         1.18814E-01         1.86407E+00         1.20701E-01         3.45428E+02         4.66488E-01         2.25194E+02         6.01447E+02         2.83188E+02         3.18258E+02
+          2.06146E-03         8.72665E-04         2.25363E-04         1.29525E-01         2.74155E-01         1.29525E-01         9.90811E+03         4.60595E-01         1.44553E+04         2.94772E+04         2.07426E+04         8.73464E+03
+          2.06146E-03         1.04249E-03         2.15145E-04         1.29525E-01         2.84826E-01         1.29525E-01         9.66678E+03         4.60595E-01         1.41743E+04         2.88430E+04         2.03316E+04         8.51140E+03
+          2.06146E-03         1.21232E-03         2.03115E-04         1.29525E-01         2.95496E-01         1.29525E-01         9.42213E+03         4.60595E-01         1.38877E+04         2.81974E+04         1.99124E+04         8.28495E+03
+          2.06146E-03         1.38215E-03         1.89273E-04         1.29525E-01         3.06167E-01         1.29525E-01         9.17467E+03         4.60595E-01         1.35960E+04         2.75417E+04         1.94860E+04         8.05579E+03
+          2.06146E-03         1.55197E-03         1.73619E-04         1.29525E-01         3.16838E-01         1.29525E-01         8.92494E+03         4.60595E-01         1.32997E+04         2.68772E+04         1.90528E+04         7.82438E+03
+          2.06146E-03         1.72180E-03         1.56152E-04         1.29525E-01         3.27508E-01         1.29525E-01         8.67347E+03         4.60595E-01         1.29994E+04         2.62050E+04         1.86138E+04         7.59123E+03
+          2.06146E-03         1.89163E-03         1.36874E-04         1.29525E-01         3.38179E-01         1.29525E-01         8.42077E+03         4.60595E-01         1.26955E+04         2.55264E+04         1.81696E+04         7.35679E+03
+          2.06146E-03         2.06146E-03         1.15783E-04         1.29525E-01         3.48849E-01         1.29525E-01         8.16737E+03         4.60595E-01         1.23885E+04         2.48425E+04         1.77209E+04         7.12156E+03
+          2.06146E-03         2.23128E-03         9.28798E-05         1.29525E-01         3.59520E-01         1.29525E-01         7.91376E+03         4.60595E-01         1.20790E+04         2.41545E+04         1.72685E+04         6.88600E+03
+          2.06146E-03         2.40111E-03         6.81646E-05         1.29525E-01         3.70190E-01         1.29525E-01         7.66043E+03         4.60595E-01         1.17673E+04         2.34637E+04         1.68131E+04         6.65056E+03
+          2.06146E-03         2.57094E-03         4.16373E-05         1.29525E-01         3.80861E-01         1.29525E-01         7.40789E+03         4.60595E-01         1.14541E+04         2.27711E+04         1.63554E+04         6.41570E+03
+          2.06146E-03         2.74077E-03         1.32978E-05         1.29525E-01         3.91532E-01         1.29525E-01         7.15659E+03         4.60595E-01         1.11397E+04         2.20780E+04         1.58961E+04         6.18185E+03
+          2.06146E-03         2.91059E-03        -1.68539E-05         1.29525E-01         4.02202E-01         1.29525E-01         6.90700E+03         4.60595E-01         1.08247E+04         2.13854E+04         1.54360E+04         5.94945E+03
+          2.06146E-03         3.08042E-03        -4.88177E-05         1.29525E-01         4.12873E-01         1.29525E-01         6.65956E+03         4.60596E-01         1.05095E+04         2.06945E+04         1.49756E+04         5.71891E+03
+          2.06146E-03         3.25025E-03        -8.25938E-05         1.29524E-01         4.23543E-01         1.29524E-01         6.41469E+03         4.60596E-01         1.01945E+04         2.00064E+04         1.45157E+04         5.49063E+03
+          2.06146E-03         3.42008E-03        -1.18182E-04         1.29524E-01         4.34214E-01         1.29524E-01         6.17281E+03         4.60596E-01         9.88032E+03         1.93220E+04         1.40570E+04         5.26501E+03
+          2.06146E-03         3.58990E-03        -1.55582E-04         1.29524E-01         4.44884E-01         1.29524E-01         5.93430E+03         4.60596E-01         9.56728E+03         1.86425E+04         1.36000E+04         5.04241E+03
+          2.06146E-03         3.75973E-03        -1.94795E-04         1.29524E-01         4.55555E-01         1.29524E-01         5.69954E+03         4.60596E-01         9.25583E+03         1.79687E+04         1.31455E+04         4.82318E+03
+          2.06146E-03         3.92956E-03        -2.35820E-04         1.29524E-01         4.66225E-01         1.29524E-01         5.46888E+03         4.60596E-01         8.94639E+03         1.73016E+04         1.26940E+04         4.60768E+03
+          2.06146E-03         4.09939E-03        -2.78657E-04         1.29524E-01         4.76896E-01         1.29524E-01         5.24264E+03         4.60596E-01         8.63936E+03         1.66423E+04         1.22460E+04         4.39620E+03
+          2.06146E-03         4.26921E-03        -3.23306E-04         1.29524E-01         4.87567E-01         1.29524E-01         5.02114E+03         4.60596E-01         8.33513E+03         1.59914E+04         1.18023E+04         4.18907E+03
+          2.06146E-03         4.43904E-03        -3.69767E-04         1.29524E-01         4.98237E-01         1.29524E-01         4.80467E+03         4.60596E-01         8.03406E+03         1.53498E+04         1.13633E+04         3.98655E+03
+          2.06146E-03         4.60887E-03        -4.18041E-04         1.29524E-01         5.08908E-01         1.29524E-01         4.59349E+03         4.60596E-01         7.73652E+03         1.47184E+04         1.09295E+04         3.78891E+03
+          2.06146E-03         4.77869E-03        -4.68126E-04         1.29524E-01         5.19578E-01         1.29524E-01         4.38783E+03         4.60596E-01         7.44284E+03         1.40979E+04         1.05015E+04         3.59639E+03
+          2.06146E-03         4.94852E-03        -5.20024E-04         1.29524E-01         5.30249E-01         1.29525E-01         4.18793E+03         4.60595E-01         7.15335E+03         1.34889E+04         1.00797E+04         3.40922E+03
+          2.06146E-03         5.11835E-03        -5.73735E-04         1.29523E-01         5.40919E-01         1.29525E-01         3.99397E+03         4.60595E-01         6.86836E+03         1.28921E+04         9.66455E+03         3.22759E+03
+          2.06146E-03         5.28818E-03        -6.29257E-04         1.29523E-01         5.51590E-01         1.29525E-01         3.80613E+03         4.60595E-01         6.58816E+03         1.23082E+04         9.25653E+03         3.05169E+03
+          2.06146E-03         5.45800E-03        -6.86592E-04         1.29523E-01         5.62261E-01         1.29525E-01         3.62456E+03         4.60595E-01         6.31301E+03         1.17377E+04         8.85601E+03         2.88166E+03
+          2.06146E-03         5.62783E-03        -7.45739E-04         1.29523E-01         5.72931E-01         1.29525E-01         3.44937E+03         4.60595E-01         6.04318E+03         1.11810E+04         8.46338E+03         2.71766E+03
+          2.06146E-03         5.79766E-03        -8.06698E-04         1.29523E-01         5.83602E-01         1.29525E-01         3.28069E+03         4.60595E-01         5.77890E+03         1.06388E+04         8.07897E+03         2.55979E+03
+          2.06146E-03         5.96749E-03        -8.69469E-04         1.29523E-01         5.94272E-01         1.29526E-01         3.11858E+03         4.60595E-01         5.52038E+03         1.01113E+04         7.70311E+03         2.40816E+03
+          2.06146E-03         6.13731E-03        -9.34053E-04         1.29523E-01         6.04943E-01         1.29526E-01         2.96310E+03         4.60595E-01         5.26783E+03         9.59893E+03         7.33609E+03         2.26284E+03
+          2.06146E-03         6.30714E-03        -1.00045E-03         1.29523E-01         6.15613E-01         1.29526E-01         2.81430E+03         4.60595E-01         5.02143E+03         9.10206E+03         6.97818E+03         2.12388E+03
+          2.06146E-03         6.47697E-03        -1.06866E-03         1.29522E-01         6.26284E-01         1.29527E-01         2.67218E+03         4.60594E-01         4.78133E+03         8.62094E+03         6.62962E+03         1.99132E+03
+          2.06146E-03         6.64680E-03        -1.13868E-03         1.29522E-01         6.36955E-01         1.29527E-01         2.53674E+03         4.60594E-01         4.54767E+03         8.15580E+03         6.29062E+03         1.86518E+03
+          2.06146E-03         6.81662E-03        -1.21051E-03         1.29522E-01         6.47625E-01         1.29528E-01         2.40796E+03         4.60594E-01         4.32059E+03         7.70683E+03         5.96137E+03         1.74546E+03
+          2.06146E-03         6.98645E-03        -1.28415E-03         1.29522E-01         6.58296E-01         1.29528E-01         2.28579E+03         4.60594E-01         4.10018E+03         7.27415E+03         5.64202E+03         1.63213E+03
+          2.06146E-03         7.15628E-03        -1.35961E-03         1.29522E-01         6.68966E-01         1.29529E-01         2.17017E+03         4.60593E-01         3.88654E+03         6.85786E+03         5.33270E+03         1.52516E+03
+          2.06146E-03         7.32611E-03        -1.43688E-03         1.29522E-01         6.79637E-01         1.29530E-01         2.06102E+03         4.60593E-01         3.67973E+03         6.45803E+03         5.03353E+03         1.42449E+03
+          2.06146E-03         7.49593E-03        -1.51596E-03         1.29521E-01         6.90307E-01         1.29530E-01         1.95824E+03         4.60593E-01         3.47980E+03         6.07464E+03         4.74459E+03         1.33005E+03
+          2.06146E-03         7.66576E-03        -1.59686E-03         1.29521E-01         7.00978E-01         1.29531E-01         1.86171E+03         4.60592E-01         3.28678E+03         5.70768E+03         4.46593E+03         1.24175E+03
+          2.06146E-03         7.83559E-03        -1.67956E-03         1.29521E-01         7.11649E-01         1.29532E-01         1.77132E+03         4.60592E-01         3.10070E+03         5.35708E+03         4.19758E+03         1.15950E+03
+          2.06146E-03         8.00542E-03        -1.76408E-03         1.29521E-01         7.22319E-01         1.29533E-01         1.68691E+03         4.60592E-01         2.92154E+03         5.02272E+03         3.93955E+03         1.08316E+03
+          2.06146E-03         8.17524E-03        -1.85041E-03         1.29521E-01         7.32990E-01         1.29534E-01         1.60834E+03         4.60591E-01         2.74930E+03         4.70446E+03         3.69184E+03         1.01262E+03
+          2.06146E-03         8.34507E-03        -1.93856E-03         1.29521E-01         7.43660E-01         1.29535E-01         1.53544E+03         4.60590E-01         2.58394E+03         4.40213E+03         3.45439E+03         9.47739E+02
+          2.06146E-03         8.51490E-03        -2.02851E-03         1.29520E-01         7.54331E-01         1.29536E-01         1.46802E+03         4.60590E-01         2.42541E+03         4.11551E+03         3.22716E+03         8.88353E+02
+          2.06146E-03         8.68473E-03        -2.12028E-03         1.29520E-01         7.65001E-01         1.29538E-01         1.40591E+03         4.60589E-01         2.27364E+03         3.84436E+03         3.01006E+03         8.34305E+02
+          2.06146E-03         8.85455E-03        -2.21386E-03         1.29520E-01         7.75672E-01         1.29539E-01         1.34890E+03         4.60589E-01         2.12856E+03         3.58842E+03         2.80300E+03         7.85419E+02
+          2.06146E-03         9.02438E-03        -2.30925E-03         1.29520E-01         7.86343E-01         1.29540E-01         1.29680E+03         4.60588E-01         1.99007E+03         3.34737E+03         2.60586E+03         7.41515E+02
+          2.06146E-03         9.19421E-03        -2.40646E-03         1.29520E-01         7.97013E-01         1.29542E-01         1.24940E+03         4.60587E-01         1.85807E+03         3.12091E+03         2.41851E+03         7.02404E+02
+          2.06146E-03         9.36403E-03        -2.50548E-03         1.29519E-01         8.07684E-01         1.29544E-01         1.20647E+03         4.60586E-01         1.73245E+03         2.90868E+03         2.24079E+03         6.67890E+02
+          2.06146E-03         9.53386E-03        -2.60631E-03         1.29519E-01         8.18354E-01         1.29545E-01         1.16780E+03         4.60586E-01         1.61305E+03         2.71030E+03         2.07253E+03         6.37769E+02
+          2.06146E-03         9.70369E-03        -2.70895E-03         1.29519E-01         8.29025E-01         1.29547E-01         1.13317E+03         4.60585E-01         1.49976E+03         2.52541E+03         1.91357E+03         6.11836E+02
+          2.06146E-03         9.87352E-03        -2.81340E-03         1.29519E-01         8.39695E-01         1.29549E-01         1.10236E+03         4.60584E-01         1.39240E+03         2.35357E+03         1.76369E+03         5.89881E+02
+          2.06146E-03         1.00433E-02        -2.91967E-03         1.29519E-01         8.50366E-01         1.29551E-01         1.07513E+03         4.60583E-01         1.29081E+03         2.19439E+03         1.62270E+03         5.71688E+02
+          2.06146E-03         1.02132E-02        -3.02775E-03         1.29518E-01         8.61037E-01         1.29554E-01         1.05125E+03         4.60582E-01         1.19483E+03         2.04741E+03         1.49037E+03         5.57042E+02
+          2.06146E-03         1.03830E-02        -3.13764E-03         1.29518E-01         8.71707E-01         1.29556E-01         1.03051E+03         4.60581E-01         1.10426E+03         1.91220E+03         1.36647E+03         5.45725E+02
+          2.06146E-03         1.05528E-02        -3.24935E-03         1.29518E-01         8.82378E-01         1.29559E-01         1.01268E+03         4.60579E-01         1.01891E+03         1.78829E+03         1.25077E+03         5.37520E+02
+          2.06146E-03         1.07227E-02        -3.36286E-03         1.29518E-01         8.93048E-01         1.29561E-01         9.97533E+02         4.60578E-01         9.38577E+02         1.67522E+03         1.14301E+03         5.32210E+02
+          2.06146E-03         1.08925E-02        -3.47819E-03         1.29517E-01         9.03719E-01         1.29564E-01         9.84849E+02         4.60577E-01         8.63062E+02         1.57251E+03         1.04293E+03         5.29577E+02
+          2.06146E-03         1.10623E-02        -3.59534E-03         1.29517E-01         9.14389E-01         1.29567E-01         9.74413E+02         4.60575E-01         7.92148E+02         1.47969E+03         9.50287E+02         5.29408E+02
+          2.06146E-03         1.12321E-02        -3.71429E-03         1.29517E-01         9.25060E-01         1.29570E-01         9.66014E+02         4.60574E-01         7.25616E+02         1.39629E+03         8.64798E+02         5.31489E+02
+          2.06146E-03         1.14020E-02        -3.83506E-03         1.29517E-01         9.35731E-01         1.29573E-01         9.59444E+02         4.60572E-01         6.63244E+02         1.32181E+03         7.86194E+02         5.35614E+02
+          2.06146E-03         1.15718E-02        -3.95764E-03         1.29516E-01         9.46401E-01         1.29577E-01         9.54504E+02         4.60571E-01         6.04807E+02         1.25578E+03         7.14201E+02         5.41576E+02
+          2.06146E-03         1.17416E-02        -4.08203E-03         1.29516E-01         9.57072E-01         1.29581E-01         9.50998E+02         4.60569E-01         5.50078E+02         1.19772E+03         6.48540E+02         5.49176E+02
+          2.06146E-03         1.19114E-02        -4.20823E-03         1.29516E-01         9.67742E-01         1.29584E-01         9.48740E+02         4.60567E-01         4.98829E+02         1.14715E+03         5.88930E+02         5.58218E+02
+          2.06146E-03         1.20813E-02        -4.33625E-03         1.29516E-01         9.78413E-01         1.29588E-01         9.47547E+02         4.60565E-01         4.50837E+02         1.10360E+03         5.35092E+02         5.68512E+02
+          2.06146E-03         1.22511E-02        -4.46608E-03         1.29515E-01         9.89083E-01         1.29592E-01         9.47249E+02         4.60564E-01         4.05877E+02         1.06662E+03         4.86743E+02         5.79876E+02
+          2.06146E-03         1.24209E-02        -4.59772E-03         1.29515E-01         9.99754E-01         1.29597E-01         9.47680E+02         4.60561E-01         3.63731E+02         1.03574E+03         4.43606E+02         5.92131E+02
+          2.06146E-03         1.25908E-02        -4.73118E-03         1.29515E-01         1.01042E+00         1.29601E-01         9.48684E+02         4.60559E-01         3.24187E+02         1.01051E+03         4.05400E+02         6.05108E+02
+          2.06146E-03         1.27606E-02        -4.86644E-03         1.29515E-01         1.02110E+00         1.29606E-01         9.50113E+02         4.60557E-01         2.87042E+02         9.90495E+02         3.71852E+02         6.18643E+02
+          2.06146E-03         1.29304E-02        -5.00352E-03         1.29514E-01         1.03177E+00         1.29611E-01         9.51828E+02         4.60555E-01         2.52101E+02         9.75269E+02         3.42687E+02         6.32582E+02
+          2.06146E-03         1.31002E-02        -5.14242E-03         1.29514E-01         1.04244E+00         1.29616E-01         9.53699E+02         4.60552E-01         2.19184E+02         9.64413E+02         3.17637E+02         6.46776E+02
+          2.06146E-03         1.32701E-02        -5.28312E-03         1.29514E-01         1.05311E+00         1.29621E-01         9.55606E+02         4.60550E-01         1.88125E+02         9.57524E+02         2.96438E+02         6.61086E+02
+          2.06146E-03         1.34399E-02        -5.42564E-03         1.29513E-01         1.06378E+00         1.29627E-01         9.57437E+02         4.60547E-01         1.58781E+02         9.54210E+02         2.78830E+02         6.75380E+02
+          2.06146E-03         1.36097E-02        -5.56997E-03         1.29513E-01         1.07445E+00         1.29633E-01         9.59089E+02         4.60545E-01         1.31038E+02         9.54094E+02         2.64559E+02         6.89535E+02
+          2.06146E-03         1.37795E-02        -5.71611E-03         1.29513E-01         1.08512E+00         1.29639E-01         9.60469E+02         4.60542E-01         1.04830E+02         9.56813E+02         2.53377E+02         7.03436E+02
+          2.06146E-03         1.39494E-02        -5.86407E-03         1.29513E-01         1.09579E+00         1.29645E-01         9.61492E+02         4.60539E-01         8.01953E+01         9.62020E+02         2.45043E+02         7.16977E+02
+          2.06146E-03         1.41192E-02        -6.01383E-03         1.29512E-01         1.10646E+00         1.29652E-01         9.62083E+02         4.60536E-01         5.74272E+01         9.69382E+02         2.39322E+02         7.30060E+02
+          2.06146E-03         1.42890E-02        -6.16542E-03         1.29512E-01         1.11713E+00         1.29659E-01         9.62176E+02         4.60533E-01         3.77023E+01         9.78582E+02         2.35986E+02         7.42596E+02
+          2.06146E-03         1.44589E-02        -6.31881E-03         1.29512E-01         1.12780E+00         1.29666E-01         9.61712E+02         4.60529E-01         2.56870E+01         9.89319E+02         2.34816E+02         7.54503E+02
+          2.06146E-03         1.46287E-02        -6.47402E-03         1.29511E-01         1.13847E+00         1.29673E-01         9.60641E+02         4.60526E-01         2.98571E+01         1.00131E+03         2.35600E+02         7.65709E+02
+          2.06146E-03         1.47985E-02        -6.63104E-03         1.29511E-01         1.14914E+00         1.29681E-01         9.58922E+02         4.60522E-01         4.48487E+01         1.01429E+03         2.38135E+02         7.76150E+02
+          2.06146E-03         1.49683E-02        -6.78987E-03         1.29511E-01         1.15981E+00         1.29688E-01         9.56522E+02         4.60519E-01         6.26721E+01         1.02799E+03         2.42225E+02         7.85768E+02
+          2.06146E-03         1.51382E-02        -6.95051E-03         1.29510E-01         1.17048E+00         1.29697E-01         9.53415E+02         4.60515E-01         8.09862E+01         1.04220E+03         2.47683E+02         7.94516E+02
+          2.06146E-03         1.53080E-02        -7.11297E-03         1.29510E-01         1.18115E+00         1.29705E-01         9.49581E+02         4.60511E-01         9.91468E+01         1.05668E+03         2.54331E+02         8.02352E+02
+          2.06146E-03         1.54778E-02        -7.27724E-03         1.29510E-01         1.19182E+00         1.29714E-01         9.45008E+02         4.60507E-01         1.16932E+02         1.07124E+03         2.62000E+02         8.09242E+02
+          2.06146E-03         1.56476E-02        -7.44332E-03         1.29509E-01         1.20249E+00         1.29723E-01         9.39693E+02         4.60503E-01         1.34251E+02         1.08569E+03         2.70528E+02         8.15160E+02
+          2.06146E-03         1.58175E-02        -7.61122E-03         1.29509E-01         1.21317E+00         1.29732E-01         9.33634E+02         4.60498E-01         1.51060E+02         1.09985E+03         2.79765E+02         8.20086E+02
+          2.06146E-03         1.59873E-02        -7.78093E-03         1.29509E-01         1.22384E+00         1.29742E-01         9.26840E+02         4.60494E-01         1.67333E+02         1.11358E+03         2.89568E+02         8.24008E+02
+          2.06146E-03         1.61571E-02        -7.95245E-03         1.29508E-01         1.23451E+00         1.29752E-01         9.19322E+02         4.60489E-01         1.83055E+02         1.12672E+03         2.99802E+02         8.26919E+02
+          2.06146E-03         1.63270E-02        -8.12578E-03         1.29508E-01         1.24518E+00         1.29763E-01         9.11097E+02         4.60484E-01         1.98210E+02         1.13916E+03         3.10342E+02         8.28817E+02
+          2.06146E-03         1.64968E-02        -8.30093E-03         1.29507E-01         1.25585E+00         1.29773E-01         9.02186E+02         4.60479E-01         2.12788E+02         1.15078E+03         3.21071E+02         8.29708E+02
+          2.06146E-03         1.66666E-02        -8.47789E-03         1.29507E-01         1.26652E+00         1.29784E-01         8.92617E+02         4.60474E-01         2.26776E+02         1.16148E+03         3.31882E+02         8.29603E+02
+          2.06146E-03         1.68364E-02        -8.65666E-03         1.29507E-01         1.27719E+00         1.29796E-01         8.82417E+02         4.60469E-01         2.40163E+02         1.17119E+03         3.42674E+02         8.28515E+02
+          2.06146E-03         1.70063E-02        -8.83725E-03         1.29506E-01         1.28786E+00         1.29808E-01         8.71621E+02         4.60464E-01         2.52939E+02         1.17982E+03         3.53355E+02         8.26465E+02
+          2.06146E-03         1.71761E-02        -9.01965E-03         1.29506E-01         1.29853E+00         1.29820E-01         8.60263E+02         4.60458E-01         2.65092E+02         1.18732E+03         3.63843E+02         8.23477E+02
+          2.06146E-03         1.73459E-02        -9.20386E-03         1.29506E-01         1.30920E+00         1.29832E-01         8.48384E+02         4.60452E-01         2.76613E+02         1.19364E+03         3.74061E+02         8.19579E+02
+          2.06146E-03         1.75158E-02        -9.38988E-03         1.29505E-01         1.31987E+00         1.29845E-01         8.36022E+02         4.60446E-01         2.87494E+02         1.19874E+03         3.83942E+02         8.14802E+02
+          2.06146E-03         1.76856E-02        -9.57772E-03         1.29505E-01         1.33054E+00         1.29859E-01         8.23221E+02         4.60440E-01         2.97728E+02         1.20260E+03         3.93424E+02         8.09181E+02
+          2.06146E-03         1.78554E-02        -9.76737E-03         1.29504E-01         1.34121E+00         1.29872E-01         8.10025E+02         4.60434E-01         3.07308E+02         1.20521E+03         4.02453E+02         8.02753E+02
+          2.06146E-03         1.80252E-02        -9.95884E-03         1.29504E-01         1.35188E+00         1.29886E-01         7.96478E+02         4.60428E-01         3.16231E+02         1.20654E+03         4.10984E+02         7.95558E+02
+          2.06146E-03         1.81951E-02        -1.01521E-02         1.29504E-01         1.36255E+00         1.29901E-01         7.82626E+02         4.60421E-01         3.24494E+02         1.20661E+03         4.18975E+02         7.87637E+02
+          2.06146E-03         1.83649E-02        -1.03472E-02         1.29503E-01         1.37322E+00         1.29916E-01         7.68515E+02         4.60414E-01         3.32095E+02         1.20543E+03         4.26392E+02         7.79036E+02
+          2.06146E-03         1.85347E-02        -1.05441E-02         1.29503E-01         1.38389E+00         1.29931E-01         7.54191E+02         4.60407E-01         3.39037E+02         1.20300E+03         4.33207E+02         7.69798E+02
+          2.06146E-03         1.87045E-02        -1.07428E-02         1.29502E-01         1.39457E+00         1.29947E-01         7.39700E+02         4.60400E-01         3.45322E+02         1.19937E+03         4.39397E+02         7.59970E+02
+          2.06146E-03         1.88744E-02        -1.09434E-02         1.29502E-01         1.40524E+00         1.29964E-01         7.25087E+02         4.60393E-01         3.50954E+02         1.19455E+03         4.44946E+02         7.49601E+02
+          2.06146E-03         1.90442E-02        -1.11457E-02         1.29502E-01         1.41591E+00         1.29980E-01         7.10398E+02         4.60385E-01         3.55941E+02         1.18858E+03         4.49841E+02         7.38736E+02
+          2.06146E-03         1.92140E-02        -1.13499E-02         1.29501E-01         1.42658E+00         1.29998E-01         6.95675E+02         4.60377E-01         3.60289E+02         1.18150E+03         4.54075E+02         7.27425E+02
+          2.06146E-03         1.93839E-02        -1.15558E-02         1.29501E-01         1.43725E+00         1.30015E-01         6.80960E+02         4.60369E-01         3.64010E+02         1.17336E+03         4.57644E+02         7.15716E+02
+          2.06146E-03         1.95537E-02        -1.17636E-02         1.29500E-01         1.44792E+00         1.30034E-01         6.66296E+02         4.60361E-01         3.67115E+02         1.16421E+03         4.60550E+02         7.03656E+02
+          2.06146E-03         1.97235E-02        -1.19732E-02         1.29500E-01         1.45859E+00         1.30052E-01         6.51721E+02         4.60353E-01         3.69617E+02         1.15409E+03         4.62798E+02         6.91294E+02
+          2.06146E-03         1.98933E-02        -1.21846E-02         1.29499E-01         1.46926E+00         1.30071E-01         6.37272E+02         4.60344E-01         3.71530E+02         1.14307E+03         4.64396E+02         6.78675E+02
+          2.06146E-03         2.00632E-02        -1.23978E-02         1.29499E-01         1.47993E+00         1.30091E-01         6.22986E+02         4.60335E-01         3.72870E+02         1.13120E+03         4.65356E+02         6.65846E+02
+          2.06146E-03         2.02330E-02        -1.26129E-02         1.29499E-01         1.49060E+00         1.30111E-01         6.08896E+02         4.60326E-01         3.73654E+02         1.11854E+03         4.65691E+02         6.52851E+02
+          2.06146E-03         2.04028E-02        -1.28297E-02         1.29498E-01         1.50127E+00         1.30132E-01         5.95033E+02         4.60317E-01         3.73902E+02         1.10515E+03         4.65420E+02         6.39734E+02
+          2.06146E-03         2.05726E-02        -1.30484E-02         1.29498E-01         1.51194E+00         1.30153E-01         5.81427E+02         4.60308E-01         3.73630E+02         1.09110E+03         4.64561E+02         6.26537E+02
+          2.06146E-03         2.07425E-02        -1.32688E-02         1.29497E-01         1.52261E+00         1.30175E-01         5.68105E+02         4.60298E-01         3.72861E+02         1.07644E+03         4.63136E+02         6.13301E+02
+          2.06146E-03         2.09123E-02        -1.34911E-02         1.29497E-01         1.53328E+00         1.30198E-01         5.55090E+02         4.60288E-01         3.71614E+02         1.06123E+03         4.61169E+02         6.00064E+02
+          2.06146E-03         2.10821E-02        -1.37152E-02         1.29496E-01         1.54395E+00         1.30221E-01         5.42407E+02         4.60278E-01         3.69911E+02         1.04555E+03         4.58684E+02         5.86864E+02
+          2.06146E-03         2.12520E-02        -1.39411E-02         1.29496E-01         1.55462E+00         1.30244E-01         5.30073E+02         4.60268E-01         3.67773E+02         1.02944E+03         4.55707E+02         5.73736E+02
+          2.06146E-03         2.14218E-02        -1.41689E-02         1.29495E-01         1.56529E+00         1.30268E-01         5.18107E+02         4.60257E-01         3.65224E+02         1.01298E+03         4.52265E+02         5.60713E+02
+          2.06146E-03         2.15916E-02        -1.43984E-02         1.29495E-01         1.57596E+00         1.30293E-01         5.06523E+02         4.60246E-01         3.62285E+02         9.96213E+02         4.48387E+02         5.47826E+02
+          2.06146E-03         2.17614E-02        -1.46298E-02         1.29494E-01         1.58664E+00         1.30318E-01         4.95335E+02         4.60235E-01         3.58979E+02         9.79207E+02         4.44101E+02         5.35105E+02
+          2.06146E-03         2.19313E-02        -1.48629E-02         1.29494E-01         1.59731E+00         1.30344E-01         4.84552E+02         4.60224E-01         3.55330E+02         9.62014E+02         4.39437E+02         5.22577E+02
+          2.06146E-03         2.21011E-02        -1.50979E-02         1.29493E-01         1.60798E+00         1.30371E-01         4.74182E+02         4.60213E-01         3.51359E+02         9.44690E+02         4.34424E+02         5.10266E+02
+          2.06146E-03         2.22709E-02        -1.53347E-02         1.29493E-01         1.61865E+00         1.30398E-01         4.64232E+02         4.60201E-01         3.47091E+02         9.27287E+02         4.29091E+02         4.98196E+02
+          2.06146E-03         2.24407E-02        -1.55733E-02         1.29493E-01         1.62932E+00         1.30426E-01         4.54704E+02         4.60189E-01         3.42546E+02         9.09855E+02         4.23467E+02         4.86387E+02
+          2.06146E-03         2.26106E-02        -1.58137E-02         1.29492E-01         1.63999E+00         1.30454E-01         4.45601E+02         4.60177E-01         3.37748E+02         8.92441E+02         4.17583E+02         4.74858E+02
+          2.06146E-03         2.27804E-02        -1.60560E-02         1.29492E-01         1.65066E+00         1.30483E-01         4.36922E+02         4.60164E-01         3.32718E+02         8.75091E+02         4.11467E+02         4.63624E+02
+          2.06146E-03         2.29502E-02        -1.63000E-02         1.29491E-01         1.66133E+00         1.30513E-01         4.28664E+02         4.60152E-01         3.27478E+02         8.57847E+02         4.05146E+02         4.52701E+02
+          2.06146E-03         2.31201E-02        -1.65459E-02         1.29491E-01         1.67200E+00         1.30543E-01         4.20824E+02         4.60139E-01         3.22049E+02         8.40750E+02         3.98649E+02         4.42100E+02
+          2.06146E-03         2.32899E-02        -1.67936E-02         1.29490E-01         1.68267E+00         1.30574E-01         4.13396E+02         4.60126E-01         3.16452E+02         8.23836E+02         3.92004E+02         4.31833E+02
+          2.06146E-03         2.34597E-02        -1.70431E-02         1.29489E-01         1.69334E+00         1.30606E-01         4.06373E+02         4.60112E-01         3.10706E+02         8.07141E+02         3.85235E+02         4.21906E+02
+          2.06146E-03         2.36295E-02        -1.72944E-02         1.29489E-01         1.70401E+00         1.30639E-01         3.99745E+02         4.60099E-01         3.04831E+02         7.90695E+02         3.78368E+02         4.12328E+02
+          2.06146E-03         2.37994E-02        -1.75475E-02         1.29488E-01         1.71468E+00         1.30672E-01         3.93503E+02         4.60085E-01         2.98846E+02         7.74529E+02         3.71427E+02         4.03102E+02
+          2.06146E-03         2.39692E-02        -1.78024E-02         1.29488E-01         1.72535E+00         1.30706E-01         3.87636E+02         4.60071E-01         2.92769E+02         7.58668E+02         3.64437E+02         3.94231E+02
+          2.06146E-03         2.41390E-02        -1.80592E-02         1.29487E-01         1.73602E+00         1.30741E-01         3.82130E+02         4.60056E-01         2.86618E+02         7.43135E+02         3.57418E+02         3.85717E+02
+          2.06146E-03         2.43088E-02        -1.83177E-02         1.29487E-01         1.74669E+00         1.30776E-01         3.76973E+02         4.60041E-01         2.80409E+02         7.27953E+02         3.50392E+02         3.77560E+02
+          2.06146E-03         2.44787E-02        -1.85781E-02         1.29486E-01         1.75736E+00         1.30812E-01         3.72151E+02         4.60027E-01         2.74158E+02         7.13138E+02         3.43379E+02         3.69758E+02
+          2.06146E-03         2.46485E-02        -1.88403E-02         1.29486E-01         1.76804E+00         1.30849E-01         3.67649E+02         4.60011E-01         2.67882E+02         6.98706E+02         3.36398E+02         3.62308E+02
+          2.06146E-03         2.48183E-02        -1.91043E-02         1.29485E-01         1.77871E+00         1.30887E-01         3.63451E+02         4.59996E-01         2.61594E+02         6.84671E+02         3.29466E+02         3.55206E+02
+          2.06146E-03         2.49882E-02        -1.93701E-02         1.29485E-01         1.78938E+00         1.30925E-01         3.59541E+02         4.59980E-01         2.55309E+02         6.71044E+02         3.22598E+02         3.48445E+02
+          2.06146E-03         2.51580E-02        -1.96377E-02         1.29484E-01         1.80005E+00         1.30965E-01         3.55902E+02         4.59965E-01         2.49040E+02         6.57832E+02         3.15811E+02         3.42021E+02
+          2.06146E-03         2.53278E-02        -1.99072E-02         1.29484E-01         1.81072E+00         1.31005E-01         3.52519E+02         4.59948E-01         2.42800E+02         6.45042E+02         3.09119E+02         3.35924E+02
+          2.06146E-03         2.54976E-02        -2.01784E-02         1.29483E-01         1.82139E+00         1.31046E-01         3.49374E+02         4.59932E-01         2.36601E+02         6.32678E+02         3.02532E+02         3.30146E+02
+          2.06146E-03         2.56675E-02        -2.04515E-02         1.29482E-01         1.83206E+00         1.31088E-01         3.46450E+02         4.59915E-01         2.30455E+02         6.20743E+02         2.96064E+02         3.24679E+02
+          2.06146E-03         2.58373E-02        -2.07264E-02         1.29482E-01         1.84273E+00         1.31130E-01         3.43730E+02         4.59899E-01         2.24372E+02         6.09236E+02         2.89724E+02         3.19511E+02
+          2.06146E-03         2.60071E-02        -2.10031E-02         1.29481E-01         1.85340E+00         1.31174E-01         3.41199E+02         4.59881E-01         2.18363E+02         5.98155E+02         2.83522E+02         3.14634E+02
+          2.06146E-03         2.61769E-02        -2.12816E-02         1.29481E-01         1.86407E+00         1.31218E-01         3.38838E+02         4.59864E-01         2.12437E+02         5.87499E+02         2.77465E+02         3.10034E+02
+          2.23128E-03         8.72665E-04         2.02460E-04         1.40196E-01         2.74155E-01         1.40196E-01         1.11401E+04         4.58514E-01         1.32519E+04         2.85885E+04         2.02203E+04         8.36816E+03
+          2.23128E-03         1.04249E-03         1.92242E-04         1.40196E-01         2.84826E-01         1.40196E-01         1.08642E+04         4.58514E-01         1.29956E+04         2.79758E+04         1.98205E+04         8.15528E+03
+          2.23128E-03         1.21232E-03         1.80212E-04         1.40196E-01         2.95496E-01         1.40196E-01         1.05844E+04         4.58514E-01         1.27342E+04         2.73521E+04         1.94127E+04         7.93934E+03
+          2.23128E-03         1.38215E-03         1.66370E-04         1.40196E-01         3.06167E-01         1.40196E-01         1.03013E+04         4.58514E-01         1.24682E+04         2.67186E+04         1.89978E+04         7.72078E+03
+          2.23128E-03         1.55197E-03         1.50716E-04         1.40196E-01         3.16838E-01         1.40196E-01         1.00156E+04         4.58514E-01         1.21980E+04         2.60764E+04         1.85764E+04         7.50006E+03
+          2.23128E-03         1.72180E-03         1.33249E-04         1.40195E-01         3.27508E-01         1.40196E-01         9.72783E+03         4.58514E-01         1.19241E+04         2.54269E+04         1.81492E+04         7.27765E+03
+          2.23128E-03         1.89163E-03         1.13971E-04         1.40195E-01         3.38179E-01         1.40195E-01         9.43861E+03         4.58514E-01         1.16469E+04         2.47710E+04         1.77170E+04         7.05401E+03
+          2.23128E-03         2.06146E-03         9.28798E-05         1.40195E-01         3.48849E-01         1.40195E-01         9.14852E+03         4.58514E-01         1.13669E+04         2.41099E+04         1.72804E+04         6.82957E+03
+          2.23128E-03         2.23128E-03         6.99768E-05         1.40195E-01         3.59520E-01         1.40195E-01         8.85813E+03         4.58514E-01         1.10845E+04         2.34449E+04         1.68401E+04         6.60480E+03
+          2.23128E-03         2.40111E-03         4.52616E-05         1.40195E-01         3.70190E-01         1.40195E-01         8.56802E+03         4.58514E-01         1.08001E+04         2.27771E+04         1.63969E+04         6.38012E+03
+          2.23128E-03         2.57094E-03         1.87343E-05         1.40195E-01         3.80861E-01         1.40195E-01         8.27873E+03         4.58514E-01         1.05143E+04         2.21075E+04         1.59515E+04         6.15596E+03
+          2.23128E-03         2.74077E-03        -9.60519E-06         1.40195E-01         3.91532E-01         1.40195E-01         7.99080E+03         4.58514E-01         1.02275E+04         2.14373E+04         1.55045E+04         5.93274E+03
+          2.23128E-03         2.91059E-03        -3.97569E-05         1.40195E-01         4.02202E-01         1.40195E-01         7.70476E+03         4.58514E-01         9.94000E+03         2.07675E+04         1.50566E+04         5.71088E+03
+          2.23128E-03         3.08042E-03        -7.17207E-05         1.40195E-01         4.12873E-01         1.40195E-01         7.42113E+03         4.58514E-01         9.65234E+03         2.00993E+04         1.46085E+04         5.49076E+03
+          2.23128E-03         3.25025E-03        -1.05497E-04         1.40195E-01         4.23543E-01         1.40195E-01         7.14038E+03         4.58514E-01         9.36491E+03         1.94337E+04         1.41609E+04         5.27278E+03
+          2.23128E-03         3.42008E-03        -1.41085E-04         1.40195E-01         4.34214E-01         1.40195E-01         6.86298E+03         4.58514E-01         9.07812E+03         1.87716E+04         1.37143E+04         5.05729E+03
+          2.23128E-03         3.58990E-03        -1.78485E-04         1.40195E-01         4.44884E-01         1.40195E-01         6.58940E+03         4.58514E-01         8.79237E+03         1.81141E+04         1.32695E+04         4.84466E+03
+          2.23128E-03         3.75973E-03        -2.17698E-04         1.40195E-01         4.55555E-01         1.40195E-01         6.32005E+03         4.58514E-01         8.50805E+03         1.74621E+04         1.28269E+04         4.63522E+03
+          2.23128E-03         3.92956E-03        -2.58723E-04         1.40195E-01         4.66225E-01         1.40195E-01         6.05534E+03         4.58514E-01         8.22553E+03         1.68166E+04         1.23873E+04         4.42930E+03
+          2.23128E-03         4.09939E-03        -3.01560E-04         1.40195E-01         4.76896E-01         1.40195E-01         5.79566E+03         4.58514E-01         7.94519E+03         1.61783E+04         1.19511E+04         4.22720E+03
+          2.23128E-03         4.26921E-03        -3.46209E-04         1.40194E-01         4.87567E-01         1.40195E-01         5.54136E+03         4.58514E-01         7.66737E+03         1.55482E+04         1.15190E+04         4.02921E+03
+          2.23128E-03         4.43904E-03        -3.92670E-04         1.40194E-01         4.98237E-01         1.40195E-01         5.29277E+03         4.58514E-01         7.39241E+03         1.49271E+04         1.10915E+04         3.83560E+03
+          2.23128E-03         4.60887E-03        -4.40944E-04         1.40194E-01         5.08908E-01         1.40195E-01         5.05020E+03         4.58514E-01         7.12064E+03         1.43156E+04         1.06690E+04         3.64662E+03
+          2.23128E-03         4.77869E-03        -4.91029E-04         1.40194E-01         5.19578E-01         1.40195E-01         4.81394E+03         4.58514E-01         6.85237E+03         1.37146E+04         1.02521E+04         3.46250E+03
+          2.23128E-03         4.94852E-03        -5.42927E-04         1.40194E-01         5.30249E-01         1.40195E-01         4.58424E+03         4.58514E-01         6.58790E+03         1.31247E+04         9.84126E+03         3.28345E+03
+          2.23128E-03         5.11835E-03        -5.96637E-04         1.40194E-01         5.40919E-01         1.40195E-01         4.36133E+03         4.58514E-01         6.32750E+03         1.25465E+04         9.43686E+03         3.10966E+03
+          2.23128E-03         5.28818E-03        -6.52160E-04         1.40194E-01         5.51590E-01         1.40195E-01         4.14541E+03         4.58514E-01         6.07144E+03         1.19807E+04         9.03936E+03         2.94132E+03
+          2.23128E-03         5.45800E-03        -7.09494E-04         1.40194E-01         5.62261E-01         1.40195E-01         3.93667E+03         4.58514E-01         5.81997E+03         1.14277E+04         8.64914E+03         2.77856E+03
+          2.23128E-03         5.62783E-03        -7.68641E-04         1.40193E-01         5.72931E-01         1.40196E-01         3.73524E+03         4.58514E-01         5.57332E+03         1.08881E+04         8.26656E+03         2.62153E+03
+          2.23128E-03         5.79766E-03        -8.29600E-04         1.40193E-01         5.83602E-01         1.40196E-01         3.54127E+03         4.58514E-01         5.33170E+03         1.03623E+04         7.89196E+03         2.47033E+03
+          2.23128E-03         5.96749E-03        -8.92372E-04         1.40193E-01         5.94272E-01         1.40196E-01         3.35484E+03         4.58514E-01         5.09532E+03         9.85072E+03         7.52566E+03         2.32506E+03
+          2.23128E-03         6.13731E-03        -9.56955E-04         1.40193E-01         6.04943E-01         1.40196E-01         3.17603E+03         4.58514E-01         4.86436E+03         9.35374E+03         7.16794E+03         2.18580E+03
+          2.23128E-03         6.30714E-03        -1.02335E-03         1.40193E-01         6.15613E-01         1.40197E-01         3.00489E+03         4.58514E-01         4.63897E+03         8.87167E+03         6.81907E+03         2.05260E+03
+          2.23128E-03         6.47697E-03        -1.09156E-03         1.40193E-01         6.26284E-01         1.40197E-01         2.84145E+03         4.58514E-01         4.41931E+03         8.40476E+03         6.47927E+03         1.92549E+03
+          2.23128E-03         6.64680E-03        -1.16158E-03         1.40193E-01         6.36955E-01         1.40197E-01         2.68570E+03         4.58514E-01         4.20551E+03         7.95325E+03         6.14876E+03         1.80449E+03
+          2.23128E-03         6.81662E-03        -1.23341E-03         1.40192E-01         6.47625E-01         1.40198E-01         2.53762E+03         4.58514E-01         3.99767E+03         7.51732E+03         5.82772E+03         1.68961E+03
+          2.23128E-03         6.98645E-03        -1.30706E-03         1.40192E-01         6.58296E-01         1.40198E-01         2.39718E+03         4.58514E-01         3.79590E+03         7.09711E+03         5.51629E+03         1.58082E+03
+          2.23128E-03         7.15628E-03        -1.38251E-03         1.40192E-01         6.68966E-01         1.40199E-01         2.26430E+03         4.58514E-01         3.60028E+03         6.69271E+03         5.21462E+03         1.47809E+03
+          2.23128E-03         7.32611E-03        -1.45978E-03         1.40192E-01         6.79637E-01         1.40200E-01         2.13890E+03         4.58514E-01         3.41086E+03         6.30418E+03         4.92281E+03         1.38136E+03
+          2.23128E-03         7.49593E-03        -1.53887E-03         1.40192E-01         6.90307E-01         1.40200E-01         2.02088E+03         4.58514E-01         3.22770E+03         5.93152E+03         4.64094E+03         1.29059E+03
+          2.23128E-03         7.66576E-03        -1.61976E-03         1.40192E-01         7.00978E-01         1.40201E-01         1.91011E+03         4.58514E-01         3.05082E+03         5.57473E+03         4.36906E+03         1.20567E+03
+          2.23128E-03         7.83559E-03        -1.70247E-03         1.40191E-01         7.11649E-01         1.40202E-01         1.80645E+03         4.58514E-01         2.88024E+03         5.23372E+03         4.10721E+03         1.12651E+03
+          2.23128E-03         8.00542E-03        -1.78698E-03         1.40191E-01         7.22319E-01         1.40203E-01         1.70975E+03         4.58515E-01         2.71596E+03         4.90841E+03         3.85539E+03         1.05302E+03
+          2.23128E-03         8.17524E-03        -1.87332E-03         1.40191E-01         7.32990E-01         1.40204E-01         1.61982E+03         4.58515E-01         2.55797E+03         4.59866E+03         3.61360E+03         9.85054E+02
+          2.23128E-03         8.34507E-03        -1.96146E-03         1.40191E-01         7.43660E-01         1.40205E-01         1.53650E+03         4.58515E-01         2.40622E+03         4.30430E+03         3.38181E+03         9.22492E+02
+          2.23128E-03         8.51490E-03        -2.05142E-03         1.40191E-01         7.54331E-01         1.40206E-01         1.45958E+03         4.58515E-01         2.26068E+03         4.02513E+03         3.15994E+03         8.65188E+02
+          2.23128E-03         8.68473E-03        -2.14318E-03         1.40190E-01         7.65001E-01         1.40207E-01         1.38884E+03         4.58515E-01         2.12130E+03         3.76093E+03         2.94794E+03         8.12986E+02
+          2.23128E-03         8.85455E-03        -2.23676E-03         1.40190E-01         7.75672E-01         1.40208E-01         1.32407E+03         4.58515E-01         1.98798E+03         3.51143E+03         2.74570E+03         7.65723E+02
+          2.23128E-03         9.02438E-03        -2.33216E-03         1.40190E-01         7.86343E-01         1.40209E-01         1.26505E+03         4.58515E-01         1.86066E+03         3.27635E+03         2.55312E+03         7.23228E+02
+          2.23128E-03         9.19421E-03        -2.42936E-03         1.40190E-01         7.97013E-01         1.40211E-01         1.21152E+03         4.58515E-01         1.73924E+03         3.05539E+03         2.37007E+03         6.85320E+02
+          2.23128E-03         9.36403E-03        -2.52838E-03         1.40190E-01         8.07684E-01         1.40212E-01         1.16325E+03         4.58516E-01         1.62360E+03         2.84821E+03         2.19639E+03         6.51815E+02
+          2.23128E-03         9.53386E-03        -2.62921E-03         1.40189E-01         8.18354E-01         1.40214E-01         1.12000E+03         4.58516E-01         1.51363E+03         2.65445E+03         2.03193E+03         6.22520E+02
+          2.23128E-03         9.70369E-03        -2.73185E-03         1.40189E-01         8.29025E-01         1.40216E-01         1.08149E+03         4.58516E-01         1.40919E+03         2.47376E+03         1.87652E+03         5.97240E+02
+          2.23128E-03         9.87352E-03        -2.83631E-03         1.40189E-01         8.39695E-01         1.40218E-01         1.04749E+03         4.58516E-01         1.31014E+03         2.30573E+03         1.72996E+03         5.75775E+02
+          2.23128E-03         1.00433E-02        -2.94257E-03         1.40189E-01         8.50366E-01         1.40220E-01         1.01772E+03         4.58516E-01         1.21633E+03         2.14997E+03         1.59205E+03         5.57921E+02
+          2.23128E-03         1.02132E-02        -3.05065E-03         1.40188E-01         8.61037E-01         1.40222E-01         9.91934E+02         4.58517E-01         1.12761E+03         2.00605E+03         1.46258E+03         5.43474E+02
+          2.23128E-03         1.03830E-02        -3.16054E-03         1.40188E-01         8.71707E-01         1.40224E-01         9.69863E+02         4.58517E-01         1.04380E+03         1.87356E+03         1.34133E+03         5.32227E+02
+          2.23128E-03         1.05528E-02        -3.27225E-03         1.40188E-01         8.82378E-01         1.40226E-01         9.51250E+02         4.58517E-01         9.64726E+02         1.75203E+03         1.22806E+03         5.23972E+02
+          2.23128E-03         1.07227E-02        -3.38577E-03         1.40188E-01         8.93048E-01         1.40229E-01         9.35838E+02         4.58517E-01         8.90206E+02         1.64104E+03         1.12254E+03         5.18503E+02
+          2.23128E-03         1.08925E-02        -3.50110E-03         1.40187E-01         9.03719E-01         1.40231E-01         9.23372E+02         4.58518E-01         8.20051E+02         1.54013E+03         1.02451E+03         5.15613E+02
+          2.23128E-03         1.10623E-02        -3.61824E-03         1.40187E-01         9.14389E-01         1.40234E-01         9.13603E+02         4.58518E-01         7.54066E+02         1.44883E+03         9.33727E+02         5.15099E+02
+          2.23128E-03         1.12321E-02        -3.73719E-03         1.40187E-01         9.25060E-01         1.40237E-01         9.06284E+02         4.58518E-01         6.92052E+02         1.36668E+03         8.49925E+02         5.16757E+02
+          2.23128E-03         1.14020E-02        -3.85796E-03         1.40187E-01         9.35731E-01         1.40240E-01         9.01175E+02         4.58519E-01         6.33809E+02         1.29323E+03         7.72840E+02         5.20390E+02
+          2.23128E-03         1.15718E-02        -3.98054E-03         1.40186E-01         9.46401E-01         1.40243E-01         8.98040E+02         4.58519E-01         5.79130E+02         1.22801E+03         7.02205E+02         5.25802E+02
+          2.23128E-03         1.17416E-02        -4.10493E-03         1.40186E-01         9.57072E-01         1.40246E-01         8.96654E+02         4.58519E-01         5.27811E+02         1.17055E+03         6.37751E+02         5.32802E+02
+          2.23128E-03         1.19114E-02        -4.23113E-03         1.40186E-01         9.67742E-01         1.40250E-01         8.96794E+02         4.58520E-01         4.79646E+02         1.12041E+03         5.79205E+02         5.41202E+02
+          2.23128E-03         1.20813E-02        -4.35915E-03         1.40185E-01         9.78413E-01         1.40253E-01         8.98250E+02         4.58520E-01         4.34432E+02         1.07712E+03         5.26294E+02         5.50823E+02
+          2.23128E-03         1.22511E-02        -4.48898E-03         1.40185E-01         9.89083E-01         1.40257E-01         9.00818E+02         4.58520E-01         3.91966E+02         1.04023E+03         4.78747E+02         5.61487E+02
+          2.23128E-03         1.24209E-02        -4.62062E-03         1.40185E-01         9.99754E-01         1.40261E-01         9.04302E+02         4.58521E-01         3.52051E+02         1.00932E+03         4.36291E+02         5.73027E+02
+          2.23128E-03         1.25908E-02        -4.75408E-03         1.40185E-01         1.01042E+00         1.40265E-01         9.08518E+02         4.58521E-01         3.14495E+02         9.83933E+02         3.98655E+02         5.85278E+02
+          2.23128E-03         1.27606E-02        -4.88934E-03         1.40184E-01         1.02110E+00         1.40270E-01         9.13288E+02         4.58522E-01         2.79113E+02         9.63657E+02         3.65572E+02         5.98085E+02
+          2.23128E-03         1.29304E-02        -5.02642E-03         1.40184E-01         1.03177E+00         1.40274E-01         9.18448E+02         4.58522E-01         2.45726E+02         9.48075E+02         3.36776E+02         6.11299E+02
+          2.23128E-03         1.31002E-02        -5.16532E-03         1.40184E-01         1.04244E+00         1.40279E-01         9.23842E+02         4.58523E-01         2.14165E+02         9.36784E+02         3.12007E+02         6.24777E+02
+          2.23128E-03         1.32701E-02        -5.30602E-03         1.40183E-01         1.05311E+00         1.40284E-01         9.29323E+02         4.58523E-01         1.84271E+02         9.29392E+02         2.91005E+02         6.38386E+02
+          2.23128E-03         1.34399E-02        -5.44854E-03         1.40183E-01         1.06378E+00         1.40289E-01         9.34756E+02         4.58524E-01         1.55896E+02         9.25520E+02         2.73520E+02         6.52000E+02
+          2.23128E-03         1.36097E-02        -5.59287E-03         1.40183E-01         1.07445E+00         1.40294E-01         9.40017E+02         4.58525E-01         1.28903E+02         9.24803E+02         2.59304E+02         6.65499E+02
+          2.23128E-03         1.37795E-02        -5.73901E-03         1.40182E-01         1.08512E+00         1.40300E-01         9.44990E+02         4.58525E-01         1.03167E+02         9.26888E+02         2.48115E+02         6.78773E+02
+          2.23128E-03         1.39494E-02        -5.88697E-03         1.40182E-01         1.09579E+00         1.40306E-01         9.49573E+02         4.58526E-01         7.85746E+01         9.31438E+02         2.39718E+02         6.91720E+02
+          2.23128E-03         1.41192E-02        -6.03674E-03         1.40182E-01         1.10646E+00         1.40312E-01         9.53670E+02         4.58526E-01         5.50255E+01         9.38129E+02         2.33885E+02         7.04245E+02
+          2.23128E-03         1.42890E-02        -6.18832E-03         1.40181E-01         1.11713E+00         1.40318E-01         9.57198E+02         4.58527E-01         3.24321E+01         9.46655E+02         2.30393E+02         7.16261E+02
+          2.23128E-03         1.44589E-02        -6.34171E-03         1.40181E-01         1.12780E+00         1.40324E-01         9.60084E+02         4.58528E-01         1.07319E+01         9.56721E+02         2.29030E+02         7.27691E+02
+          2.23128E-03         1.46287E-02        -6.49692E-03         1.40181E-01         1.13847E+00         1.40331E-01         9.62262E+02         4.58529E-01         1.02488E+01         9.68051E+02         2.29587E+02         7.38464E+02
+          2.23128E-03         1.47985E-02        -6.65394E-03         1.40180E-01         1.14914E+00         1.40338E-01         9.63680E+02         4.58530E-01         3.03861E+01         9.80383E+02         2.31868E+02         7.48516E+02
+          2.23128E-03         1.49683E-02        -6.81277E-03         1.40180E-01         1.15981E+00         1.40345E-01         9.64290E+02         4.58530E-01         4.98352E+01         9.93473E+02         2.35680E+02         7.57793E+02
+          2.23128E-03         1.51382E-02        -6.97341E-03         1.40180E-01         1.17048E+00         1.40353E-01         9.64058E+02         4.58531E-01         6.86178E+01         1.00709E+03         2.40842E+02         7.66246E+02
+          2.23128E-03         1.53080E-02        -7.13587E-03         1.40179E-01         1.18115E+00         1.40361E-01         9.62954E+02         4.58532E-01         8.67617E+01         1.02102E+03         2.47180E+02         7.73837E+02
+          2.23128E-03         1.54778E-02        -7.30014E-03         1.40179E-01         1.19182E+00         1.40369E-01         9.60959E+02         4.58533E-01         1.04289E+02         1.03506E+03         2.54528E+02         7.80531E+02
+          2.23128E-03         1.56476E-02        -7.46622E-03         1.40179E-01         1.20249E+00         1.40377E-01         9.58062E+02         4.58534E-01         1.21215E+02         1.04903E+03         2.62730E+02         7.86301E+02
+          2.23128E-03         1.58175E-02        -7.63412E-03         1.40178E-01         1.21317E+00         1.40386E-01         9.54257E+02         4.58535E-01         1.37552E+02         1.06276E+03         2.71636E+02         7.91129E+02
+          2.23128E-03         1.59873E-02        -7.80383E-03         1.40178E-01         1.22384E+00         1.40395E-01         9.49547E+02         4.58536E-01         1.53305E+02         1.07611E+03         2.81108E+02         7.95000E+02
+          2.23128E-03         1.61571E-02        -7.97535E-03         1.40177E-01         1.23451E+00         1.40404E-01         9.43940E+02         4.58537E-01         1.68476E+02         1.08892E+03         2.91014E+02         7.97907E+02
+          2.23128E-03         1.63270E-02        -8.14868E-03         1.40177E-01         1.24518E+00         1.40414E-01         9.37453E+02         4.58538E-01         1.83067E+02         1.10108E+03         3.01232E+02         7.99848E+02
+          2.23128E-03         1.64968E-02        -8.32383E-03         1.40177E-01         1.25585E+00         1.40424E-01         9.30104E+02         4.58540E-01         1.97073E+02         1.11247E+03         3.11646E+02         8.00827E+02
+          2.23128E-03         1.66666E-02        -8.50079E-03         1.40176E-01         1.26652E+00         1.40434E-01         9.21921E+02         4.58541E-01         2.10491E+02         1.12301E+03         3.22152E+02         8.00853E+02
+          2.23128E-03         1.68364E-02        -8.67956E-03         1.40176E-01         1.27719E+00         1.40444E-01         9.12933E+02         4.58542E-01         2.23315E+02         1.13259E+03         3.32651E+02         7.99938E+02
+          2.23128E-03         1.70063E-02        -8.86015E-03         1.40175E-01         1.28786E+00         1.40455E-01         9.03175E+02         4.58543E-01         2.35540E+02         1.14116E+03         3.43054E+02         7.98102E+02
+          2.23128E-03         1.71761E-02        -9.04255E-03         1.40175E-01         1.29853E+00         1.40466E-01         8.92685E+02         4.58545E-01         2.47158E+02         1.14864E+03         3.53278E+02         7.95366E+02
+          2.23128E-03         1.73459E-02        -9.22676E-03         1.40175E-01         1.30920E+00         1.40478E-01         8.81506E+02         4.58546E-01         2.58166E+02         1.15500E+03         3.63249E+02         7.91755E+02
+          2.23128E-03         1.75158E-02        -9.41278E-03         1.40174E-01         1.31987E+00         1.40490E-01         8.69682E+02         4.58548E-01         2.68556E+02         1.16020E+03         3.72899E+02         7.87300E+02
+          2.23128E-03         1.76856E-02        -9.60062E-03         1.40174E-01         1.33054E+00         1.40502E-01         8.57260E+02         4.58549E-01         2.78325E+02         1.16420E+03         3.82170E+02         7.82032E+02
+          2.23128E-03         1.78554E-02        -9.79027E-03         1.40173E-01         1.34121E+00         1.40515E-01         8.44289E+02         4.58551E-01         2.87469E+02         1.16699E+03         3.91007E+02         7.75986E+02
+          2.23128E-03         1.80252E-02        -9.98174E-03         1.40173E-01         1.35188E+00         1.40528E-01         8.30820E+02         4.58552E-01         2.95986E+02         1.16857E+03         3.99364E+02         7.69201E+02
+          2.23128E-03         1.81951E-02        -1.01750E-02         1.40172E-01         1.36255E+00         1.40541E-01         8.16904E+02         4.58554E-01         3.03875E+02         1.16892E+03         4.07202E+02         7.61715E+02
+          2.23128E-03         1.83649E-02        -1.03701E-02         1.40172E-01         1.37322E+00         1.40555E-01         8.02595E+02         4.58556E-01         3.11137E+02         1.16806E+03         4.14487E+02         7.53569E+02
+          2.23128E-03         1.85347E-02        -1.05670E-02         1.40172E-01         1.38389E+00         1.40569E-01         7.87946E+02         4.58558E-01         3.17773E+02         1.16600E+03         4.21190E+02         7.44808E+02
+          2.23128E-03         1.87045E-02        -1.07657E-02         1.40171E-01         1.39457E+00         1.40584E-01         7.73009E+02         4.58560E-01         3.23788E+02         1.16276E+03         4.27289E+02         7.35474E+02
+          2.23128E-03         1.88744E-02        -1.09663E-02         1.40171E-01         1.40524E+00         1.40599E-01         7.57837E+02         4.58562E-01         3.29186E+02         1.15838E+03         4.32766E+02         7.25612E+02
+          2.23128E-03         1.90442E-02        -1.11686E-02         1.40170E-01         1.41591E+00         1.40615E-01         7.42484E+02         4.58564E-01         3.33974E+02         1.15288E+03         4.37609E+02         7.15268E+02
+          2.23128E-03         1.92140E-02        -1.13727E-02         1.40170E-01         1.42658E+00         1.40630E-01         7.27000E+02         4.58566E-01         3.38161E+02         1.14630E+03         4.41811E+02         7.04489E+02
+          2.23128E-03         1.93839E-02        -1.15787E-02         1.40169E-01         1.43725E+00         1.40647E-01         7.11437E+02         4.58568E-01         3.41755E+02         1.13869E+03         4.45367E+02         6.93318E+02
+          2.23128E-03         1.95537E-02        -1.17865E-02         1.40169E-01         1.44792E+00         1.40664E-01         6.95842E+02         4.58570E-01         3.44769E+02         1.13008E+03         4.48279E+02         6.81803E+02
+          2.23128E-03         1.97235E-02        -1.19961E-02         1.40168E-01         1.45859E+00         1.40681E-01         6.80264E+02         4.58572E-01         3.47215E+02         1.12054E+03         4.50550E+02         6.69989E+02
+          2.23128E-03         1.98933E-02        -1.22075E-02         1.40168E-01         1.46926E+00         1.40699E-01         6.64748E+02         4.58575E-01         3.49106E+02         1.11011E+03         4.52189E+02         6.57920E+02
+          2.23128E-03         2.00632E-02        -1.24207E-02         1.40167E-01         1.47993E+00         1.40717E-01         6.49339E+02         4.58577E-01         3.50457E+02         1.09885E+03         4.53205E+02         6.45640E+02
+          2.23128E-03         2.02330E-02        -1.26358E-02         1.40167E-01         1.49060E+00         1.40735E-01         6.34076E+02         4.58580E-01         3.51285E+02         1.08681E+03         4.53614E+02         6.33192E+02
+          2.23128E-03         2.04028E-02        -1.28526E-02         1.40167E-01         1.50127E+00         1.40755E-01         6.19001E+02         4.58583E-01         3.51606E+02         1.07405E+03         4.53430E+02         6.20618E+02
+          2.23128E-03         2.05726E-02        -1.30713E-02         1.40166E-01         1.51194E+00         1.40774E-01         6.04148E+02         4.58585E-01         3.51438E+02         1.06063E+03         4.52673E+02         6.07958E+02
+          2.23128E-03         2.07425E-02        -1.32917E-02         1.40166E-01         1.52261E+00         1.40794E-01         5.89554E+02         4.58588E-01         3.50799E+02         1.04661E+03         4.51362E+02         5.95252E+02
+          2.23128E-03         2.09123E-02        -1.35140E-02         1.40165E-01         1.53328E+00         1.40815E-01         5.75249E+02         4.58591E-01         3.49709E+02         1.03206E+03         4.49522E+02         5.82537E+02
+          2.23128E-03         2.10821E-02        -1.37381E-02         1.40165E-01         1.54395E+00         1.40836E-01         5.61263E+02         4.58594E-01         3.48188E+02         1.01702E+03         4.47174E+02         5.69848E+02
+          2.23128E-03         2.12520E-02        -1.39640E-02         1.40164E-01         1.55462E+00         1.40858E-01         5.47622E+02         4.58597E-01         3.46256E+02         1.00157E+03         4.44345E+02         5.57220E+02
+          2.23128E-03         2.14218E-02        -1.41918E-02         1.40164E-01         1.56529E+00         1.40880E-01         5.34350E+02         4.58601E-01         3.43932E+02         9.85746E+02         4.41061E+02         5.44685E+02
+          2.23128E-03         2.15916E-02        -1.44213E-02         1.40163E-01         1.57596E+00         1.40903E-01         5.21467E+02         4.58604E-01         3.41239E+02         9.69622E+02         4.37349E+02         5.32273E+02
+          2.23128E-03         2.17614E-02        -1.46527E-02         1.40162E-01         1.58664E+00         1.40926E-01         5.08993E+02         4.58608E-01         3.38197E+02         9.53249E+02         4.33237E+02         5.20012E+02
+          2.23128E-03         2.19313E-02        -1.48858E-02         1.40162E-01         1.59731E+00         1.40950E-01         4.96942E+02         4.58611E-01         3.34827E+02         9.36682E+02         4.28753E+02         5.07929E+02
+          2.23128E-03         2.21011E-02        -1.51208E-02         1.40161E-01         1.60798E+00         1.40975E-01         4.85327E+02         4.58615E-01         3.31151E+02         9.19973E+02         4.23925E+02         4.96048E+02
+          2.23128E-03         2.22709E-02        -1.53576E-02         1.40161E-01         1.61865E+00         1.41000E-01         4.74159E+02         4.58619E-01         3.27188E+02         9.03174E+02         4.18782E+02         4.84392E+02
+          2.23128E-03         2.24407E-02        -1.55962E-02         1.40160E-01         1.62932E+00         1.41025E-01         4.63447E+02         4.58623E-01         3.22960E+02         8.86333E+02         4.13354E+02         4.72980E+02
+          2.23128E-03         2.26106E-02        -1.58366E-02         1.40160E-01         1.63999E+00         1.41052E-01         4.53194E+02         4.58627E-01         3.18488E+02         8.69497E+02         4.07667E+02         4.61830E+02
+          2.23128E-03         2.27804E-02        -1.60789E-02         1.40159E-01         1.65066E+00         1.41079E-01         4.43404E+02         4.58631E-01         3.13791E+02         8.52710E+02         4.01750E+02         4.50960E+02
+          2.23128E-03         2.29502E-02        -1.63229E-02         1.40159E-01         1.66133E+00         1.41106E-01         4.34078E+02         4.58636E-01         3.08890E+02         8.36014E+02         3.95631E+02         4.40383E+02
+          2.23128E-03         2.31201E-02        -1.65688E-02         1.40158E-01         1.67200E+00         1.41134E-01         4.25215E+02         4.58640E-01         3.03804E+02         8.19448E+02         3.89337E+02         4.30111E+02
+          2.23128E-03         2.32899E-02        -1.68165E-02         1.40158E-01         1.68267E+00         1.41163E-01         4.16812E+02         4.58645E-01         2.98552E+02         8.03048E+02         3.82894E+02         4.20155E+02
+          2.23128E-03         2.34597E-02        -1.70660E-02         1.40157E-01         1.69334E+00         1.41192E-01         4.08862E+02         4.58650E-01         2.93153E+02         7.86849E+02         3.76327E+02         4.10522E+02
+          2.23128E-03         2.36295E-02        -1.73173E-02         1.40157E-01         1.70401E+00         1.41222E-01         4.01359E+02         4.58655E-01         2.87624E+02         7.70883E+02         3.69661E+02         4.01221E+02
+          2.23128E-03         2.37994E-02        -1.75704E-02         1.40156E-01         1.71468E+00         1.41253E-01         3.94294E+02         4.58660E-01         2.81983E+02         7.55177E+02         3.62921E+02         3.92256E+02
+          2.23128E-03         2.39692E-02        -1.78253E-02         1.40155E-01         1.72535E+00         1.41284E-01         3.87657E+02         4.58666E-01         2.76247E+02         7.39757E+02         3.56128E+02         3.83630E+02
+          2.23128E-03         2.41390E-02        -1.80821E-02         1.40155E-01         1.73602E+00         1.41316E-01         3.81436E+02         4.58671E-01         2.70433E+02         7.24648E+02         3.49304E+02         3.75344E+02
+          2.23128E-03         2.43088E-02        -1.83406E-02         1.40154E-01         1.74669E+00         1.41349E-01         3.75619E+02         4.58677E-01         2.64556E+02         7.09870E+02         3.42470E+02         3.67400E+02
+          2.23128E-03         2.44787E-02        -1.86010E-02         1.40154E-01         1.75736E+00         1.41383E-01         3.70190E+02         4.58683E-01         2.58630E+02         6.95441E+02         3.35646E+02         3.59796E+02
+          2.23128E-03         2.46485E-02        -1.88632E-02         1.40153E-01         1.76804E+00         1.41417E-01         3.65136E+02         4.58689E-01         2.52672E+02         6.81378E+02         3.28849E+02         3.52529E+02
+          2.23128E-03         2.48183E-02        -1.91272E-02         1.40153E-01         1.77871E+00         1.41452E-01         3.60440E+02         4.58695E-01         2.46694E+02         6.67693E+02         3.22097E+02         3.45596E+02
+          2.23128E-03         2.49882E-02        -1.93930E-02         1.40152E-01         1.78938E+00         1.41487E-01         3.56085E+02         4.58702E-01         2.40709E+02         6.54397E+02         3.15406E+02         3.38991E+02
+          2.23128E-03         2.51580E-02        -1.96606E-02         1.40151E-01         1.80005E+00         1.41524E-01         3.52054E+02         4.58709E-01         2.34731E+02         6.41500E+02         3.08790E+02         3.32709E+02
+          2.23128E-03         2.53278E-02        -1.99301E-02         1.40151E-01         1.81072E+00         1.41561E-01         3.48329E+02         4.58716E-01         2.28772E+02         6.29008E+02         3.02264E+02         3.26743E+02
+          2.23128E-03         2.54976E-02        -2.02013E-02         1.40150E-01         1.82139E+00         1.41599E-01         3.44892E+02         4.58723E-01         2.22842E+02         6.16925E+02         2.95839E+02         3.21086E+02
+          2.23128E-03         2.56675E-02        -2.04744E-02         1.40150E-01         1.83206E+00         1.41637E-01         3.41725E+02         4.58731E-01         2.16954E+02         6.05255E+02         2.89528E+02         3.15727E+02
+          2.23128E-03         2.58373E-02        -2.07493E-02         1.40149E-01         1.84273E+00         1.41677E-01         3.38809E+02         4.58738E-01         2.11116E+02         5.93997E+02         2.83339E+02         3.10658E+02
+          2.23128E-03         2.60071E-02        -2.10260E-02         1.40148E-01         1.85340E+00         1.41717E-01         3.36125E+02         4.58746E-01         2.05340E+02         5.83152E+02         2.77282E+02         3.05870E+02
+          2.23128E-03         2.61769E-02        -2.13045E-02         1.40148E-01         1.86407E+00         1.41758E-01         3.33655E+02         4.58755E-01         1.99635E+02         5.72716E+02         2.71365E+02         3.01350E+02
+          2.40111E-03         8.72665E-04         1.77745E-04         1.50866E-01         2.74155E-01         1.50866E-01         1.25025E+04         4.63354E-01         1.20667E+04         2.76575E+04         1.96698E+04         7.98766E+03
+          2.40111E-03         1.04249E-03         1.67527E-04         1.50866E-01         2.84826E-01         1.50866E-01         1.21907E+04         4.63354E-01         1.18346E+04         2.70672E+04         1.92817E+04         7.78552E+03
+          2.40111E-03         1.21232E-03         1.55497E-04         1.50866E-01         2.95496E-01         1.50866E-01         1.18744E+04         4.63354E-01         1.15980E+04         2.64663E+04         1.88859E+04         7.58045E+03
+          2.40111E-03         1.38215E-03         1.41655E-04         1.50866E-01         3.06167E-01         1.50866E-01         1.15544E+04         4.63354E-01         1.13571E+04         2.58560E+04         1.84831E+04         7.37287E+03
+          2.40111E-03         1.55197E-03         1.26001E-04         1.50866E-01         3.16838E-01         1.50866E-01         1.12312E+04         4.63354E-01         1.11124E+04         2.52373E+04         1.80740E+04         7.16322E+03
+          2.40111E-03         1.72180E-03         1.08534E-04         1.50866E-01         3.27508E-01         1.50866E-01         1.09056E+04         4.63354E-01         1.08644E+04         2.46113E+04         1.76593E+04         6.95194E+03
+          2.40111E-03         1.89163E-03         8.92554E-05         1.50866E-01         3.38179E-01         1.50866E-01         1.05783E+04         4.63353E-01         1.06133E+04         2.39792E+04         1.72397E+04         6.73947E+03
+          2.40111E-03         2.06146E-03         6.81646E-05         1.50866E-01         3.48849E-01         1.50866E-01         1.02498E+04         4.63353E-01         1.03597E+04         2.33420E+04         1.68158E+04         6.52621E+03
+          2.40111E-03         2.23128E-03         4.52616E-05         1.50866E-01         3.59520E-01         1.50866E-01         9.92095E+03         4.63353E-01         1.01039E+04         2.27010E+04         1.63884E+04         6.31261E+03
+          2.40111E-03         2.40111E-03         2.05465E-05         1.50866E-01         3.70190E-01         1.50866E-01         9.59225E+03         4.63353E-01         9.84639E+03         2.20571E+04         1.59581E+04         6.09907E+03
+          2.40111E-03         2.57094E-03        -5.98084E-06         1.50866E-01         3.80861E-01         1.50866E-01         9.26436E+03         4.63353E-01         9.58748E+03         2.14115E+04         1.55255E+04         5.88601E+03
+          2.40111E-03         2.74077E-03        -3.43203E-05         1.50866E-01         3.91532E-01         1.50866E-01         8.93789E+03         4.63353E-01         9.32760E+03         2.07653E+04         1.50915E+04         5.67380E+03
+          2.40111E-03         2.91059E-03        -6.44720E-05         1.50866E-01         4.02202E-01         1.50866E-01         8.61343E+03         4.63353E-01         9.06715E+03         2.01194E+04         1.46565E+04         5.46286E+03
+          2.40111E-03         3.08042E-03        -9.64358E-05         1.50866E-01         4.12873E-01         1.50866E-01         8.29155E+03         4.63353E-01         8.80650E+03         1.94749E+04         1.42214E+04         5.25354E+03
+          2.40111E-03         3.25025E-03        -1.30212E-04         1.50865E-01         4.23543E-01         1.50866E-01         7.97282E+03         4.63353E-01         8.54604E+03         1.88328E+04         1.37866E+04         5.04622E+03
+          2.40111E-03         3.42008E-03        -1.65800E-04         1.50865E-01         4.34214E-01         1.50865E-01         7.65777E+03         4.63353E-01         8.28614E+03         1.81941E+04         1.33528E+04         4.84124E+03
+          2.40111E-03         3.58990E-03        -2.03200E-04         1.50865E-01         4.44884E-01         1.50865E-01         7.34690E+03         4.63353E-01         8.02715E+03         1.75596E+04         1.29207E+04         4.63895E+03
+          2.40111E-03         3.75973E-03        -2.42413E-04         1.50865E-01         4.55555E-01         1.50865E-01         7.04070E+03         4.63353E-01         7.76944E+03         1.69305E+04         1.24908E+04         4.43966E+03
+          2.40111E-03         3.92956E-03        -2.83438E-04         1.50865E-01         4.66225E-01         1.50865E-01         6.73963E+03         4.63353E-01         7.51333E+03         1.63074E+04         1.20637E+04         4.24368E+03
+          2.40111E-03         4.09939E-03        -3.26275E-04         1.50865E-01         4.76896E-01         1.50865E-01         6.44414E+03         4.63353E-01         7.25917E+03         1.56912E+04         1.16399E+04         4.05130E+03
+          2.40111E-03         4.26921E-03        -3.70924E-04         1.50865E-01         4.87567E-01         1.50865E-01         6.15462E+03         4.63353E-01         7.00726E+03         1.50829E+04         1.12201E+04         3.86280E+03
+          2.40111E-03         4.43904E-03        -4.17385E-04         1.50865E-01         4.98237E-01         1.50865E-01         5.87147E+03         4.63353E-01         6.75793E+03         1.44831E+04         1.08046E+04         3.67843E+03
+          2.40111E-03         4.60887E-03        -4.65658E-04         1.50865E-01         5.08908E-01         1.50865E-01         5.59504E+03         4.63353E-01         6.51145E+03         1.38925E+04         1.03941E+04         3.49842E+03
+          2.40111E-03         4.77869E-03        -5.15744E-04         1.50865E-01         5.19578E-01         1.50865E-01         5.32564E+03         4.63353E-01         6.26812E+03         1.33119E+04         9.98892E+03         3.32301E+03
+          2.40111E-03         4.94852E-03        -5.67642E-04         1.50864E-01         5.30249E-01         1.50865E-01         5.06359E+03         4.63353E-01         6.02820E+03         1.27420E+04         9.58958E+03         3.15239E+03
+          2.40111E-03         5.11835E-03        -6.21352E-04         1.50864E-01         5.40919E-01         1.50866E-01         4.80915E+03         4.63353E-01         5.79195E+03         1.21832E+04         9.19650E+03         2.98675E+03
+          2.40111E-03         5.28818E-03        -6.76875E-04         1.50864E-01         5.51590E-01         1.50866E-01         4.56255E+03         4.63353E-01         5.55960E+03         1.16363E+04         8.81008E+03         2.82625E+03
+          2.40111E-03         5.45800E-03        -7.34209E-04         1.50864E-01         5.62261E-01         1.50866E-01         4.32400E+03         4.63353E-01         5.33137E+03         1.11017E+04         8.43070E+03         2.67104E+03
+          2.40111E-03         5.62783E-03        -7.93356E-04         1.50864E-01         5.72931E-01         1.50866E-01         4.09369E+03         4.63353E-01         5.10749E+03         1.05800E+04         8.05872E+03         2.52125E+03
+          2.40111E-03         5.79766E-03        -8.54315E-04         1.50864E-01         5.83602E-01         1.50866E-01         3.87177E+03         4.63354E-01         4.88815E+03         1.00714E+04         7.69446E+03         2.37698E+03
+          2.40111E-03         5.96749E-03        -9.17087E-04         1.50864E-01         5.94272E-01         1.50866E-01         3.65836E+03         4.63354E-01         4.67352E+03         9.57656E+03         7.33824E+03         2.23833E+03
+          2.40111E-03         6.13731E-03        -9.81670E-04         1.50863E-01         6.04943E-01         1.50867E-01         3.45354E+03         4.63354E-01         4.46376E+03         9.09569E+03         6.99032E+03         2.10536E+03
+          2.40111E-03         6.30714E-03        -1.04807E-03         1.50863E-01         6.15613E-01         1.50867E-01         3.25740E+03         4.63354E-01         4.25904E+03         8.62911E+03         6.65097E+03         1.97814E+03
+          2.40111E-03         6.47697E-03        -1.11627E-03         1.50863E-01         6.26284E-01         1.50867E-01         3.06997E+03         4.63354E-01         4.05948E+03         8.17711E+03         6.32042E+03         1.85670E+03
+          2.40111E-03         6.64680E-03        -1.18629E-03         1.50863E-01         6.36955E-01         1.50868E-01         2.89125E+03         4.63355E-01         3.86519E+03         7.73991E+03         5.99886E+03         1.74105E+03
+          2.40111E-03         6.81662E-03        -1.25813E-03         1.50863E-01         6.47625E-01         1.50868E-01         2.72124E+03         4.63355E-01         3.67629E+03         7.31767E+03         5.68647E+03         1.63120E+03
+          2.40111E-03         6.98645E-03        -1.33177E-03         1.50863E-01         6.58296E-01         1.50868E-01         2.55990E+03         4.63355E-01         3.49286E+03         6.91054E+03         5.38341E+03         1.52713E+03
+          2.40111E-03         7.15628E-03        -1.40723E-03         1.50862E-01         6.68966E-01         1.50869E-01         2.40716E+03         4.63356E-01         3.31497E+03         6.51862E+03         5.08980E+03         1.42882E+03
+          2.40111E-03         7.32611E-03        -1.48450E-03         1.50862E-01         6.79637E-01         1.50870E-01         2.26293E+03         4.63356E-01         3.14268E+03         6.14196E+03         4.80575E+03         1.33621E+03
+          2.40111E-03         7.49593E-03        -1.56358E-03         1.50862E-01         6.90307E-01         1.50870E-01         2.12712E+03         4.63357E-01         2.97603E+03         5.78058E+03         4.53133E+03         1.24925E+03
+          2.40111E-03         7.66576E-03        -1.64447E-03         1.50862E-01         7.00978E-01         1.50871E-01         1.99959E+03         4.63357E-01         2.81505E+03         5.43446E+03         4.26661E+03         1.16785E+03
+          2.40111E-03         7.83559E-03        -1.72718E-03         1.50862E-01         7.11649E-01         1.50872E-01         1.88019E+03         4.63358E-01         2.65975E+03         5.10355E+03         4.01162E+03         1.09193E+03
+          2.40111E-03         8.00542E-03        -1.81170E-03         1.50861E-01         7.22319E-01         1.50872E-01         1.76876E+03         4.63359E-01         2.51013E+03         4.78775E+03         3.76636E+03         1.02140E+03
+          2.40111E-03         8.17524E-03        -1.89803E-03         1.50861E-01         7.32990E-01         1.50873E-01         1.66510E+03         4.63359E-01         2.36619E+03         4.48695E+03         3.53083E+03         9.56124E+02
+          2.40111E-03         8.34507E-03        -1.98617E-03         1.50861E-01         7.43660E-01         1.50874E-01         1.56902E+03         4.63360E-01         2.22788E+03         4.20098E+03         3.30499E+03         8.95991E+02
+          2.40111E-03         8.51490E-03        -2.07613E-03         1.50861E-01         7.54331E-01         1.50875E-01         1.48030E+03         4.63361E-01         2.09517E+03         3.92966E+03         3.08879E+03         8.40862E+02
+          2.40111E-03         8.68473E-03        -2.16790E-03         1.50861E-01         7.65001E-01         1.50876E-01         1.39872E+03         4.63362E-01         1.96802E+03         3.67277E+03         2.88217E+03         7.90593E+02
+          2.40111E-03         8.85455E-03        -2.26148E-03         1.50860E-01         7.75672E-01         1.50877E-01         1.32403E+03         4.63363E-01         1.84634E+03         3.43006E+03         2.68503E+03         7.45031E+02
+          2.40111E-03         9.02438E-03        -2.35687E-03         1.50860E-01         7.86343E-01         1.50879E-01         1.25597E+03         4.63364E-01         1.73007E+03         3.20128E+03         2.49727E+03         7.04012E+02
+          2.40111E-03         9.19421E-03        -2.45408E-03         1.50860E-01         7.97013E-01         1.50880E-01         1.19429E+03         4.63365E-01         1.61912E+03         2.98612E+03         2.31875E+03         6.67368E+02
+          2.40111E-03         9.36403E-03        -2.55309E-03         1.50860E-01         8.07684E-01         1.50881E-01         1.13871E+03         4.63366E-01         1.51338E+03         2.78427E+03         2.14935E+03         6.34925E+02
+          2.40111E-03         9.53386E-03        -2.65392E-03         1.50859E-01         8.18354E-01         1.50883E-01         1.08897E+03         4.63367E-01         1.41276E+03         2.59540E+03         1.98890E+03         6.06502E+02
+          2.40111E-03         9.70369E-03        -2.75657E-03         1.50859E-01         8.29025E-01         1.50884E-01         1.04476E+03         4.63369E-01         1.31712E+03         2.41915E+03         1.83724E+03         5.81914E+02
+          2.40111E-03         9.87352E-03        -2.86102E-03         1.50859E-01         8.39695E-01         1.50886E-01         1.00582E+03         4.63370E-01         1.22635E+03         2.25515E+03         1.69418E+03         5.60971E+02
+          2.40111E-03         1.00433E-02        -2.96729E-03         1.50859E-01         8.50366E-01         1.50888E-01         9.71841E+02         4.63371E-01         1.14031E+03         2.10302E+03         1.55954E+03         5.43483E+02
+          2.40111E-03         1.02132E-02        -3.07537E-03         1.50858E-01         8.61037E-01         1.50890E-01         9.42538E+02         4.63373E-01         1.05884E+03         1.96235E+03         1.43310E+03         5.29254E+02
+          2.40111E-03         1.03830E-02        -3.18526E-03         1.50858E-01         8.71707E-01         1.50892E-01         9.17615E+02         4.63375E-01         9.81805E+02         1.83273E+03         1.31465E+03         5.18089E+02
+          2.40111E-03         1.05528E-02        -3.29696E-03         1.50858E-01         8.82378E-01         1.50894E-01         8.96782E+02         4.63376E-01         9.09038E+02         1.71375E+03         1.20396E+03         5.09793E+02
+          2.40111E-03         1.07227E-02        -3.41048E-03         1.50858E-01         8.93048E-01         1.50896E-01         8.79747E+02         4.63378E-01         8.40375E+02         1.60498E+03         1.10081E+03         5.04169E+02
+          2.40111E-03         1.08925E-02        -3.52581E-03         1.50857E-01         9.03719E-01         1.50899E-01         8.66221E+02         4.63380E-01         7.75645E+02         1.50597E+03         1.00495E+03         5.01021E+02
+          2.40111E-03         1.10623E-02        -3.64295E-03         1.50857E-01         9.14389E-01         1.50901E-01         8.55919E+02         4.63382E-01         7.14674E+02         1.41630E+03         9.16139E+02         5.00157E+02
+          2.40111E-03         1.12321E-02        -3.76191E-03         1.50857E-01         9.25060E-01         1.50904E-01         8.48562E+02         4.63384E-01         6.57283E+02         1.33551E+03         8.34125E+02         5.01384E+02
+          2.40111E-03         1.14020E-02        -3.88267E-03         1.50856E-01         9.35731E-01         1.50906E-01         8.43874E+02         4.63387E-01         6.03291E+02         1.26316E+03         7.58651E+02         5.04513E+02
+          2.40111E-03         1.15718E-02        -4.00525E-03         1.50856E-01         9.46401E-01         1.50909E-01         8.41588E+02         4.63389E-01         5.52515E+02         1.19882E+03         6.89458E+02         5.09359E+02
+          2.40111E-03         1.17416E-02        -4.12964E-03         1.50856E-01         9.57072E-01         1.50912E-01         8.41441E+02         4.63392E-01         5.04772E+02         1.14203E+03         6.26286E+02         5.15741E+02
+          2.40111E-03         1.19114E-02        -4.25585E-03         1.50856E-01         9.67742E-01         1.50916E-01         8.43180E+02         4.63394E-01         4.59879E+02         1.09235E+03         5.68871E+02         5.23479E+02
+          2.40111E-03         1.20813E-02        -4.38386E-03         1.50855E-01         9.78413E-01         1.50919E-01         8.46560E+02         4.63397E-01         4.17656E+02         1.04935E+03         5.16948E+02         5.32403E+02
+          2.40111E-03         1.22511E-02        -4.51369E-03         1.50855E-01         9.89083E-01         1.50922E-01         8.51344E+02         4.63400E-01         3.77923E+02         1.01260E+03         4.70254E+02         5.42345E+02
+          2.40111E-03         1.24209E-02        -4.64534E-03         1.50855E-01         9.99754E-01         1.50926E-01         8.57306E+02         4.63403E-01         3.40508E+02         9.81667E+02         4.28524E+02         5.53143E+02
+          2.40111E-03         1.25908E-02        -4.77879E-03         1.50854E-01         1.01042E+00         1.50930E-01         8.64230E+02         4.63406E-01         3.05242E+02         9.56139E+02         3.91497E+02         5.64642E+02
+          2.40111E-03         1.27606E-02        -4.91406E-03         1.50854E-01         1.02110E+00         1.50934E-01         8.71910E+02         4.63410E-01         2.71964E+02         9.35606E+02         3.58913E+02         5.76693E+02
+          2.40111E-03         1.29304E-02        -5.05114E-03         1.50854E-01         1.03177E+00         1.50938E-01         8.80149E+02         4.63413E-01         2.40521E+02         9.19667E+02         3.30514E+02         5.89153E+02
+          2.40111E-03         1.31002E-02        -5.19003E-03         1.50853E-01         1.04244E+00         1.50943E-01         8.88765E+02         4.63417E-01         2.10770E+02         9.07933E+02         3.06047E+02         6.01887E+02
+          2.40111E-03         1.32701E-02        -5.33073E-03         1.50853E-01         1.05311E+00         1.50947E-01         8.97583E+02         4.63420E-01         1.82582E+02         9.00027E+02         2.85261E+02         6.14766E+02
+          2.40111E-03         1.34399E-02        -5.47325E-03         1.50853E-01         1.06378E+00         1.50952E-01         9.06443E+02         4.63424E-01         1.55838E+02         8.95582E+02         2.67912E+02         6.27670E+02
+          2.40111E-03         1.36097E-02        -5.61758E-03         1.50852E-01         1.07445E+00         1.50957E-01         9.15195E+02         4.63429E-01         1.30443E+02         8.94244E+02         2.53759E+02         6.40485E+02
+          2.40111E-03         1.37795E-02        -5.76372E-03         1.50852E-01         1.08512E+00         1.50962E-01         9.23699E+02         4.63433E-01         1.06330E+02         8.95672E+02         2.42568E+02         6.53105E+02
+          2.40111E-03         1.39494E-02        -5.91168E-03         1.50852E-01         1.09579E+00         1.50967E-01         9.31830E+02         4.63437E-01         8.34847E+01         8.99540E+02         2.34110E+02         6.65430E+02
+          2.40111E-03         1.41192E-02        -6.06145E-03         1.50851E-01         1.10646E+00         1.50973E-01         9.39473E+02         4.63442E-01         6.20135E+01         9.05534E+02         2.28163E+02         6.77371E+02
+          2.40111E-03         1.42890E-02        -6.21303E-03         1.50851E-01         1.11713E+00         1.50979E-01         9.46522E+02         4.63447E-01         4.23824E+01         9.13355E+02         2.24512E+02         6.88843E+02
+          2.40111E-03         1.44589E-02        -6.36642E-03         1.50850E-01         1.12780E+00         1.50985E-01         9.52886E+02         4.63452E-01         2.65093E+01         9.22720E+02         2.22948E+02         6.99772E+02
+          2.40111E-03         1.46287E-02        -6.52163E-03         1.50850E-01         1.13847E+00         1.50991E-01         9.58483E+02         4.63457E-01         2.14965E+01         9.33358E+02         2.23270E+02         7.10088E+02
+          2.40111E-03         1.47985E-02        -6.67865E-03         1.50850E-01         1.14914E+00         1.50998E-01         9.63243E+02         4.63462E-01         3.13702E+01         9.45016E+02         2.25286E+02         7.19731E+02
+          2.40111E-03         1.49683E-02        -6.83748E-03         1.50849E-01         1.15981E+00         1.51004E-01         9.67104E+02         4.63468E-01         4.67842E+01         9.57455E+02         2.28808E+02         7.28646E+02
+          2.40111E-03         1.51382E-02        -6.99812E-03         1.50849E-01         1.17048E+00         1.51011E-01         9.70017E+02         4.63474E-01         6.32796E+01         9.70450E+02         2.33661E+02         7.36789E+02
+          2.40111E-03         1.53080E-02        -7.16058E-03         1.50849E-01         1.18115E+00         1.51018E-01         9.71943E+02         4.63480E-01         7.97832E+01         9.83792E+02         2.39674E+02         7.44118E+02
+          2.40111E-03         1.54778E-02        -7.32485E-03         1.50848E-01         1.19182E+00         1.51026E-01         9.72849E+02         4.63486E-01         9.59764E+01         9.97287E+02         2.46686E+02         7.50601E+02
+          2.40111E-03         1.56476E-02        -7.49093E-03         1.50848E-01         1.20249E+00         1.51034E-01         9.72715E+02         4.63492E-01         1.11741E+02         1.01076E+03         2.54544E+02         7.56212E+02
+          2.40111E-03         1.58175E-02        -7.65883E-03         1.50847E-01         1.21317E+00         1.51042E-01         9.71527E+02         4.63499E-01         1.27025E+02         1.02403E+03         2.63103E+02         7.60930E+02
+          2.40111E-03         1.59873E-02        -7.82854E-03         1.50847E-01         1.22384E+00         1.51050E-01         9.69280E+02         4.63506E-01         1.41802E+02         1.03697E+03         2.72227E+02         7.64741E+02
+          2.40111E-03         1.61571E-02        -8.00006E-03         1.50847E-01         1.23451E+00         1.51059E-01         9.65978E+02         4.63513E-01         1.56057E+02         1.04943E+03         2.81788E+02         7.67638E+02
+          2.40111E-03         1.63270E-02        -8.17339E-03         1.50846E-01         1.24518E+00         1.51067E-01         9.61630E+02         4.63521E-01         1.69780E+02         1.06128E+03         2.91665E+02         7.69617E+02
+          2.40111E-03         1.64968E-02        -8.34854E-03         1.50846E-01         1.25585E+00         1.51077E-01         9.56253E+02         4.63528E-01         1.82961E+02         1.07243E+03         3.01748E+02         7.70681E+02
+          2.40111E-03         1.66666E-02        -8.52550E-03         1.50845E-01         1.26652E+00         1.51086E-01         9.49870E+02         4.63536E-01         1.95593E+02         1.08277E+03         3.11933E+02         7.70837E+02
+          2.40111E-03         1.68364E-02        -8.70427E-03         1.50845E-01         1.27719E+00         1.51096E-01         9.42511E+02         4.63545E-01         2.07669E+02         1.09222E+03         3.22123E+02         7.70096E+02
+          2.40111E-03         1.70063E-02        -8.88486E-03         1.50844E-01         1.28786E+00         1.51106E-01         9.34208E+02         4.63553E-01         2.19182E+02         1.10071E+03         3.32230E+02         7.68476E+02
+          2.40111E-03         1.71761E-02        -9.06726E-03         1.50844E-01         1.29853E+00         1.51116E-01         9.25001E+02         4.63562E-01         2.30127E+02         1.10817E+03         3.42175E+02         7.65995E+02
+          2.40111E-03         1.73459E-02        -9.25147E-03         1.50844E-01         1.30920E+00         1.51127E-01         9.14933E+02         4.63571E-01         2.40497E+02         1.11456E+03         3.51884E+02         7.62678E+02
+          2.40111E-03         1.75158E-02        -9.43750E-03         1.50843E-01         1.31987E+00         1.51138E-01         9.04049E+02         4.63580E-01         2.50287E+02         1.11984E+03         3.61290E+02         7.58552E+02
+          2.40111E-03         1.76856E-02        -9.62533E-03         1.50843E-01         1.33054E+00         1.51149E-01         8.92401E+02         4.63590E-01         2.59495E+02         1.12398E+03         3.70336E+02         7.53646E+02
+          2.40111E-03         1.78554E-02        -9.81498E-03         1.50842E-01         1.34121E+00         1.51161E-01         8.80040E+02         4.63600E-01         2.68117E+02         1.12696E+03         3.78969E+02         7.47994E+02
+          2.40111E-03         1.80252E-02        -1.00064E-02         1.50842E-01         1.35188E+00         1.51173E-01         8.67022E+02         4.63610E-01         2.76151E+02         1.12877E+03         3.87143E+02         7.41630E+02
+          2.40111E-03         1.81951E-02        -1.01997E-02         1.50841E-01         1.36255E+00         1.51186E-01         8.53402E+02         4.63620E-01         2.83597E+02         1.12941E+03         3.94818E+02         7.34591E+02
+          2.40111E-03         1.83649E-02        -1.03948E-02         1.50841E-01         1.37322E+00         1.51199E-01         8.39240E+02         4.63631E-01         2.90457E+02         1.12888E+03         4.01961E+02         7.26917E+02
+          2.40111E-03         1.85347E-02        -1.05917E-02         1.50840E-01         1.38389E+00         1.51212E-01         8.24594E+02         4.63642E-01         2.96731E+02         1.12719E+03         4.08544E+02         7.18647E+02
+          2.40111E-03         1.87045E-02        -1.07904E-02         1.50840E-01         1.39457E+00         1.51225E-01         8.09523E+02         4.63654E-01         3.02425E+02         1.12437E+03         4.14544E+02         7.09824E+02
+          2.40111E-03         1.88744E-02        -1.09910E-02         1.50839E-01         1.40524E+00         1.51239E-01         7.94087E+02         4.63666E-01         3.07542E+02         1.12043E+03         4.19944E+02         7.00488E+02
+          2.40111E-03         1.90442E-02        -1.11933E-02         1.50839E-01         1.41591E+00         1.51254E-01         7.78346E+02         4.63678E-01         3.12091E+02         1.11542E+03         4.24731E+02         6.90684E+02
+          2.40111E-03         1.92140E-02        -1.13975E-02         1.50838E-01         1.42658E+00         1.51268E-01         7.62358E+02         4.63691E-01         3.16077E+02         1.10935E+03         4.28897E+02         6.80455E+02
+          2.40111E-03         1.93839E-02        -1.16034E-02         1.50838E-01         1.43725E+00         1.51284E-01         7.46181E+02         4.63704E-01         3.19511E+02         1.10228E+03         4.32437E+02         6.69844E+02
+          2.40111E-03         1.95537E-02        -1.18112E-02         1.50837E-01         1.44792E+00         1.51299E-01         7.29873E+02         4.63717E-01         3.22403E+02         1.09425E+03         4.35353E+02         6.58895E+02
+          2.40111E-03         1.97235E-02        -1.20208E-02         1.50837E-01         1.45859E+00         1.51315E-01         7.13487E+02         4.63731E-01         3.24765E+02         1.08530E+03         4.37646E+02         6.47650E+02
+          2.40111E-03         1.98933E-02        -1.22322E-02         1.50836E-01         1.46926E+00         1.51332E-01         6.97079E+02         4.63745E-01         3.26608E+02         1.07548E+03         4.39326E+02         6.36153E+02
+          2.40111E-03         2.00632E-02        -1.24454E-02         1.50836E-01         1.47993E+00         1.51348E-01         6.80700E+02         4.63759E-01         3.27948E+02         1.06484E+03         4.40400E+02         6.24444E+02
+          2.40111E-03         2.02330E-02        -1.26605E-02         1.50835E-01         1.49060E+00         1.51366E-01         6.64398E+02         4.63774E-01         3.28798E+02         1.05345E+03         4.40883E+02         6.12566E+02
+          2.40111E-03         2.04028E-02        -1.28773E-02         1.50835E-01         1.50127E+00         1.51384E-01         6.48222E+02         4.63789E-01         3.29174E+02         1.04135E+03         4.40790E+02         6.00558E+02
+          2.40111E-03         2.05726E-02        -1.30960E-02         1.50834E-01         1.51194E+00         1.51402E-01         6.32216E+02         4.63805E-01         3.29092E+02         1.02860E+03         4.40138E+02         5.88459E+02
+          2.40111E-03         2.07425E-02        -1.33165E-02         1.50834E-01         1.52261E+00         1.51420E-01         6.16422E+02         4.63821E-01         3.28570E+02         1.01525E+03         4.38946E+02         5.76306E+02
+          2.40111E-03         2.09123E-02        -1.35387E-02         1.50833E-01         1.53328E+00         1.51440E-01         6.00879E+02         4.63838E-01         3.27624E+02         1.00137E+03         4.37237E+02         5.64134E+02
+          2.40111E-03         2.10821E-02        -1.37628E-02         1.50833E-01         1.54395E+00         1.51459E-01         5.85624E+02         4.63855E-01         3.26274E+02         9.87013E+02         4.35034E+02         5.51980E+02
+          2.40111E-03         2.12520E-02        -1.39888E-02         1.50832E-01         1.55462E+00         1.51479E-01         5.70691E+02         4.63872E-01         3.24537E+02         9.72234E+02         4.32359E+02         5.39874E+02
+          2.40111E-03         2.14218E-02        -1.42165E-02         1.50832E-01         1.56529E+00         1.51500E-01         5.56110E+02         4.63890E-01         3.22432E+02         9.57089E+02         4.29240E+02         5.27849E+02
+          2.40111E-03         2.15916E-02        -1.44460E-02         1.50831E-01         1.57596E+00         1.51521E-01         5.41909E+02         4.63909E-01         3.19978E+02         9.41635E+02         4.25701E+02         5.15934E+02
+          2.40111E-03         2.17614E-02        -1.46774E-02         1.50831E-01         1.58664E+00         1.51543E-01         5.28112E+02         4.63927E-01         3.17195E+02         9.25926E+02         4.21771E+02         5.04155E+02
+          2.40111E-03         2.19313E-02        -1.49105E-02         1.50830E-01         1.59731E+00         1.51565E-01         5.14741E+02         4.63947E-01         3.14101E+02         9.10014E+02         4.17475E+02         4.92539E+02
+          2.40111E-03         2.21011E-02        -1.51455E-02         1.50829E-01         1.60798E+00         1.51588E-01         5.01816E+02         4.63967E-01         3.10717E+02         8.93951E+02         4.12842E+02         4.81109E+02
+          2.40111E-03         2.22709E-02        -1.53823E-02         1.50829E-01         1.61865E+00         1.51611E-01         4.89351E+02         4.63987E-01         3.07060E+02         8.77785E+02         4.07899E+02         4.69887E+02
+          2.40111E-03         2.24407E-02        -1.56209E-02         1.50828E-01         1.62932E+00         1.51635E-01         4.77360E+02         4.64008E-01         3.03150E+02         8.61565E+02         4.02674E+02         4.58892E+02
+          2.40111E-03         2.26106E-02        -1.58614E-02         1.50828E-01         1.63999E+00         1.51659E-01         4.65853E+02         4.64030E-01         2.99006E+02         8.45336E+02         3.97194E+02         4.48142E+02
+          2.40111E-03         2.27804E-02        -1.61036E-02         1.50827E-01         1.65066E+00         1.51684E-01         4.54838E+02         4.64052E-01         2.94646E+02         8.29141E+02         3.91488E+02         4.37654E+02
+          2.40111E-03         2.29502E-02        -1.63476E-02         1.50827E-01         1.66133E+00         1.51710E-01         4.44319E+02         4.64074E-01         2.90089E+02         8.13021E+02         3.85581E+02         4.27440E+02
+          2.40111E-03         2.31201E-02        -1.65935E-02         1.50826E-01         1.67200E+00         1.51736E-01         4.34298E+02         4.64097E-01         2.85352E+02         7.97014E+02         3.79499E+02         4.17515E+02
+          2.40111E-03         2.32899E-02        -1.68412E-02         1.50825E-01         1.68267E+00         1.51763E-01         4.24777E+02         4.64121E-01         2.80453E+02         7.81156E+02         3.73269E+02         4.07887E+02
+          2.40111E-03         2.34597E-02        -1.70907E-02         1.50825E-01         1.69334E+00         1.51790E-01         4.15752E+02         4.64145E-01         2.75409E+02         7.65480E+02         3.66915E+02         3.98565E+02
+          2.40111E-03         2.36295E-02        -1.73420E-02         1.50824E-01         1.70401E+00         1.51818E-01         4.07219E+02         4.64170E-01         2.70237E+02         7.50018E+02         3.60462E+02         3.89557E+02
+          2.40111E-03         2.37994E-02        -1.75951E-02         1.50824E-01         1.71468E+00         1.51846E-01         3.99171E+02         4.64196E-01         2.64952E+02         7.34798E+02         3.53931E+02         3.80867E+02
+          2.40111E-03         2.39692E-02        -1.78500E-02         1.50823E-01         1.72535E+00         1.51876E-01         3.91601E+02         4.64222E-01         2.59570E+02         7.19845E+02         3.47346E+02         3.72499E+02
+          2.40111E-03         2.41390E-02        -1.81068E-02         1.50822E-01         1.73602E+00         1.51905E-01         3.84498E+02         4.64249E-01         2.54107E+02         7.05183E+02         3.40728E+02         3.64455E+02
+          2.40111E-03         2.43088E-02        -1.83653E-02         1.50822E-01         1.74669E+00         1.51936E-01         3.77850E+02         4.64276E-01         2.48576E+02         6.90833E+02         3.34096E+02         3.56736E+02
+          2.40111E-03         2.44787E-02        -1.86257E-02         1.50821E-01         1.75736E+00         1.51967E-01         3.71644E+02         4.64304E-01         2.42992E+02         6.76812E+02         3.27470E+02         3.49342E+02
+          2.40111E-03         2.46485E-02        -1.88879E-02         1.50820E-01         1.76804E+00         1.51999E-01         3.65866E+02         4.64333E-01         2.37369E+02         6.63138E+02         3.20869E+02         3.42270E+02
+          2.40111E-03         2.48183E-02        -1.91519E-02         1.50820E-01         1.77871E+00         1.52031E-01         3.60500E+02         4.64362E-01         2.31718E+02         6.49823E+02         3.14307E+02         3.35516E+02
+          2.40111E-03         2.49882E-02        -1.94177E-02         1.50819E-01         1.78938E+00         1.52064E-01         3.55529E+02         4.64392E-01         2.26054E+02         6.36880E+02         3.07802E+02         3.29078E+02
+          2.40111E-03         2.51580E-02        -1.96853E-02         1.50819E-01         1.80005E+00         1.52098E-01         3.50936E+02         4.64423E-01         2.20386E+02         6.24316E+02         3.01367E+02         3.22948E+02
+          2.40111E-03         2.53278E-02        -1.99548E-02         1.50818E-01         1.81072E+00         1.52132E-01         3.46703E+02         4.64455E-01         2.14728E+02         6.12139E+02         2.95017E+02         3.17122E+02
+          2.40111E-03         2.54976E-02        -2.02260E-02         1.50817E-01         1.82139E+00         1.52167E-01         3.42811E+02         4.64487E-01         2.09089E+02         6.00355E+02         2.88763E+02         3.11592E+02
+          2.40111E-03         2.56675E-02        -2.04991E-02         1.50817E-01         1.83206E+00         1.52203E-01         3.39240E+02         4.64520E-01         2.03479E+02         5.88966E+02         2.82617E+02         3.06350E+02
+          2.40111E-03         2.58373E-02        -2.07740E-02         1.50816E-01         1.84273E+00         1.52240E-01         3.35971E+02         4.64554E-01         1.97910E+02         5.77974E+02         2.76588E+02         3.01387E+02
+          2.40111E-03         2.60071E-02        -2.10507E-02         1.50815E-01         1.85340E+00         1.52277E-01         3.32984E+02         4.64588E-01         1.92390E+02         5.67378E+02         2.70685E+02         2.96694E+02
+          2.40111E-03         2.61769E-02        -2.13292E-02         1.50815E-01         1.86407E+00         1.52315E-01         3.30258E+02         4.64624E-01         1.86928E+02         5.57177E+02         2.64916E+02         2.92261E+02
+          2.57094E-03         8.72665E-04         1.51218E-04         1.61537E-01         2.74155E-01         1.61537E-01         1.39466E+04         4.76498E-01         1.09136E+04         2.66896E+04         1.90936E+04         7.59600E+03
+          2.57094E-03         1.04249E-03         1.41000E-04         1.61537E-01         2.84826E-01         1.61537E-01         1.35992E+04         4.76498E-01         1.07050E+04         2.61227E+04         1.87178E+04         7.40487E+03
+          2.57094E-03         1.21232E-03         1.28970E-04         1.61537E-01         2.95496E-01         1.61537E-01         1.32468E+04         4.76498E-01         1.04922E+04         2.55454E+04         1.83345E+04         7.21095E+03
+          2.57094E-03         1.38215E-03         1.15128E-04         1.61537E-01         3.06167E-01         1.61537E-01         1.28899E+04         4.76498E-01         1.02757E+04         2.49591E+04         1.79444E+04         7.01464E+03
+          2.57094E-03         1.55197E-03         9.94732E-05         1.61537E-01         3.16838E-01         1.61537E-01         1.25295E+04         4.76498E-01         1.00557E+04         2.43646E+04         1.75482E+04         6.81635E+03
+          2.57094E-03         1.72180E-03         8.20067E-05         1.61537E-01         3.27508E-01         1.61537E-01         1.21663E+04         4.76498E-01         9.83272E+03         2.37631E+04         1.71466E+04         6.61650E+03
+          2.57094E-03         1.89163E-03         6.27281E-05         1.61537E-01         3.38179E-01         1.61537E-01         1.18009E+04         4.76498E-01         9.60700E+03         2.31556E+04         1.67401E+04         6.41548E+03
+          2.57094E-03         2.06146E-03         4.16373E-05         1.61536E-01         3.48849E-01         1.61536E-01         1.14341E+04         4.76498E-01         9.37894E+03         2.25432E+04         1.63295E+04         6.21371E+03
+          2.57094E-03         2.23128E-03         1.87343E-05         1.61536E-01         3.59520E-01         1.61536E-01         1.10667E+04         4.76498E-01         9.14892E+03         2.19270E+04         1.59154E+04         6.01159E+03
+          2.57094E-03         2.40111E-03        -5.98084E-06         1.61536E-01         3.70190E-01         1.61536E-01         1.06993E+04         4.76498E-01         8.91730E+03         2.13081E+04         1.54986E+04         5.80949E+03
+          2.57094E-03         2.57094E-03        -3.25081E-05         1.61536E-01         3.80861E-01         1.61536E-01         1.03326E+04         4.76497E-01         8.68443E+03         2.06873E+04         1.50795E+04         5.60781E+03
+          2.57094E-03         2.74077E-03        -6.08476E-05         1.61536E-01         3.91532E-01         1.61536E-01         9.96729E+03         4.76497E-01         8.45067E+03         2.00659E+04         1.46590E+04         5.40692E+03
+          2.57094E-03         2.91059E-03        -9.09992E-05         1.61536E-01         4.02202E-01         1.61536E-01         9.60406E+03         4.76497E-01         8.21637E+03         1.94447E+04         1.42376E+04         5.20718E+03
+          2.57094E-03         3.08042E-03        -1.22963E-04         1.61536E-01         4.12873E-01         1.61536E-01         9.24353E+03         4.76497E-01         7.98188E+03         1.88248E+04         1.38159E+04         5.00896E+03
+          2.57094E-03         3.25025E-03        -1.56739E-04         1.61536E-01         4.23543E-01         1.61536E-01         8.88631E+03         4.76497E-01         7.74753E+03         1.82071E+04         1.33945E+04         4.81260E+03
+          2.57094E-03         3.42008E-03        -1.92327E-04         1.61536E-01         4.34214E-01         1.61536E-01         8.53301E+03         4.76497E-01         7.51366E+03         1.75926E+04         1.29742E+04         4.61842E+03
+          2.57094E-03         3.58990E-03        -2.29728E-04         1.61536E-01         4.44884E-01         1.61536E-01         8.18418E+03         4.76497E-01         7.28060E+03         1.69821E+04         1.25554E+04         4.42675E+03
+          2.57094E-03         3.75973E-03        -2.68940E-04         1.61536E-01         4.55555E-01         1.61536E-01         7.84038E+03         4.76497E-01         7.04865E+03         1.63766E+04         1.21387E+04         4.23788E+03
+          2.57094E-03         3.92956E-03        -3.09965E-04         1.61536E-01         4.66225E-01         1.61536E-01         7.50213E+03         4.76497E-01         6.81813E+03         1.57768E+04         1.17247E+04         4.05212E+03
+          2.57094E-03         4.09939E-03        -3.52802E-04         1.61535E-01         4.76896E-01         1.61536E-01         7.16991E+03         4.76497E-01         6.58933E+03         1.51836E+04         1.13139E+04         3.86974E+03
+          2.57094E-03         4.26921E-03        -3.97451E-04         1.61535E-01         4.87567E-01         1.61536E-01         6.84419E+03         4.76497E-01         6.36253E+03         1.45978E+04         1.09069E+04         3.69099E+03
+          2.57094E-03         4.43904E-03        -4.43912E-04         1.61535E-01         4.98237E-01         1.61536E-01         6.52539E+03         4.76497E-01         6.13802E+03         1.40202E+04         1.05041E+04         3.51612E+03
+          2.57094E-03         4.60887E-03        -4.92186E-04         1.61535E-01         5.08908E-01         1.61536E-01         6.21393E+03         4.76497E-01         5.91606E+03         1.34513E+04         1.01060E+04         3.34535E+03
+          2.57094E-03         4.77869E-03        -5.42271E-04         1.61535E-01         5.19578E-01         1.61536E-01         5.91017E+03         4.76497E-01         5.69690E+03         1.28920E+04         9.71307E+03         3.17890E+03
+          2.57094E-03         4.94852E-03        -5.94169E-04         1.61535E-01         5.30249E-01         1.61536E-01         5.61445E+03         4.76497E-01         5.48078E+03         1.23427E+04         9.32579E+03         3.01696E+03
+          2.57094E-03         5.11835E-03        -6.47879E-04         1.61535E-01         5.40919E-01         1.61536E-01         5.32708E+03         4.76497E-01         5.26794E+03         1.18042E+04         8.94453E+03         2.85970E+03
+          2.57094E-03         5.28818E-03        -7.03402E-04         1.61535E-01         5.51590E-01         1.61536E-01         5.04833E+03         4.76497E-01         5.05858E+03         1.12770E+04         8.56971E+03         2.70727E+03
+          2.57094E-03         5.45800E-03        -7.60736E-04         1.61534E-01         5.62261E-01         1.61536E-01         4.77846E+03         4.76497E-01         4.85290E+03         1.07615E+04         8.20168E+03         2.55983E+03
+          2.57094E-03         5.62783E-03        -8.19883E-04         1.61534E-01         5.72931E-01         1.61536E-01         4.51767E+03         4.76498E-01         4.65111E+03         1.02583E+04         7.84078E+03         2.41750E+03
+          2.57094E-03         5.79766E-03        -8.80842E-04         1.61534E-01         5.83602E-01         1.61537E-01         4.26614E+03         4.76498E-01         4.45337E+03         9.76771E+03         7.48735E+03         2.28036E+03
+          2.57094E-03         5.96749E-03        -9.43613E-04         1.61534E-01         5.94272E-01         1.61537E-01         4.02403E+03         4.76498E-01         4.25984E+03         9.29019E+03         7.14167E+03         2.14853E+03
+          2.57094E-03         6.13731E-03        -1.00820E-03         1.61534E-01         6.04943E-01         1.61537E-01         3.79144E+03         4.76499E-01         4.07068E+03         8.82607E+03         6.80401E+03         2.02205E+03
+          2.57094E-03         6.30714E-03        -1.07459E-03         1.61534E-01         6.15613E-01         1.61537E-01         3.56847E+03         4.76499E-01         3.88601E+03         8.37563E+03         6.47463E+03         1.90100E+03
+          2.57094E-03         6.47697E-03        -1.14280E-03         1.61533E-01         6.26284E-01         1.61537E-01         3.35518E+03         4.76499E-01         3.70596E+03         7.93914E+03         6.15375E+03         1.78540E+03
+          2.57094E-03         6.64680E-03        -1.21282E-03         1.61533E-01         6.36955E-01         1.61538E-01         3.15158E+03         4.76500E-01         3.53063E+03         7.51682E+03         5.84156E+03         1.67526E+03
+          2.57094E-03         6.81662E-03        -1.28465E-03         1.61533E-01         6.47625E-01         1.61538E-01         2.95768E+03         4.76501E-01         3.36012E+03         7.10884E+03         5.53824E+03         1.57061E+03
+          2.57094E-03         6.98645E-03        -1.35830E-03         1.61533E-01         6.58296E-01         1.61539E-01         2.77346E+03         4.76501E-01         3.19451E+03         6.71535E+03         5.24393E+03         1.47142E+03
+          2.57094E-03         7.15628E-03        -1.43376E-03         1.61533E-01         6.68966E-01         1.61539E-01         2.59885E+03         4.76502E-01         3.03386E+03         6.33642E+03         4.95876E+03         1.37766E+03
+          2.57094E-03         7.32611E-03        -1.51103E-03         1.61533E-01         6.79637E-01         1.61540E-01         2.43377E+03         4.76503E-01         2.87822E+03         5.97214E+03         4.68284E+03         1.28930E+03
+          2.57094E-03         7.49593E-03        -1.59011E-03         1.61532E-01         6.90307E-01         1.61540E-01         2.27811E+03         4.76504E-01         2.72763E+03         5.62252E+03         4.41624E+03         1.20628E+03
+          2.57094E-03         7.66576E-03        -1.67100E-03         1.61532E-01         7.00978E-01         1.61541E-01         2.13176E+03         4.76505E-01         2.58212E+03         5.28754E+03         4.15901E+03         1.12853E+03
+          2.57094E-03         7.83559E-03        -1.75371E-03         1.61532E-01         7.11649E-01         1.61541E-01         1.99454E+03         4.76506E-01         2.44169E+03         4.96716E+03         3.91120E+03         1.05596E+03
+          2.57094E-03         8.00542E-03        -1.83823E-03         1.61532E-01         7.22319E-01         1.61542E-01         1.86630E+03         4.76507E-01         2.30636E+03         4.66130E+03         3.67281E+03         9.88485E+02
+          2.57094E-03         8.17524E-03        -1.92456E-03         1.61531E-01         7.32990E-01         1.61543E-01         1.74683E+03         4.76508E-01         2.17610E+03         4.36984E+03         3.44384E+03         9.25998E+02
+          2.57094E-03         8.34507E-03        -2.01270E-03         1.61531E-01         7.43660E-01         1.61544E-01         1.63593E+03         4.76510E-01         2.05089E+03         4.09263E+03         3.22425E+03         8.68382E+02
+          2.57094E-03         8.51490E-03        -2.10266E-03         1.61531E-01         7.54331E-01         1.61545E-01         1.53337E+03         4.76511E-01         1.93070E+03         3.82951E+03         3.01400E+03         8.15510E+02
+          2.57094E-03         8.68473E-03        -2.19442E-03         1.61531E-01         7.65001E-01         1.61546E-01         1.43890E+03         4.76513E-01         1.81548E+03         3.58027E+03         2.81302E+03         7.67249E+02
+          2.57094E-03         8.85455E-03        -2.28800E-03         1.61531E-01         7.75672E-01         1.61547E-01         1.35226E+03         4.76515E-01         1.70517E+03         3.34468E+03         2.62123E+03         7.23453E+02
+          2.57094E-03         9.02438E-03        -2.38340E-03         1.61530E-01         7.86343E-01         1.61548E-01         1.27318E+03         4.76517E-01         1.59970E+03         3.12248E+03         2.43851E+03         6.83971E+02
+          2.57094E-03         9.19421E-03        -2.48060E-03         1.61530E-01         7.97013E-01         1.61549E-01         1.20139E+03         4.76519E-01         1.49900E+03         2.91341E+03         2.26476E+03         6.48646E+02
+          2.57094E-03         9.36403E-03        -2.57962E-03         1.61530E-01         8.07684E-01         1.61550E-01         1.13658E+03         4.76521E-01         1.40297E+03         2.71716E+03         2.09984E+03         6.17313E+02
+          2.57094E-03         9.53386E-03        -2.68045E-03         1.61529E-01         8.18354E-01         1.61552E-01         1.07845E+03         4.76523E-01         1.31151E+03         2.53341E+03         1.94360E+03         5.89802E+02
+          2.57094E-03         9.70369E-03        -2.78309E-03         1.61529E-01         8.29025E-01         1.61553E-01         1.02671E+03         4.76525E-01         1.22452E+03         2.36182E+03         1.79588E+03         5.65941E+02
+          2.57094E-03         9.87352E-03        -2.88755E-03         1.61529E-01         8.39695E-01         1.61555E-01         9.81026E+02         4.76528E-01         1.14189E+03         2.20206E+03         1.65651E+03         5.45551E+02
+          2.57094E-03         1.00433E-02        -2.99381E-03         1.61529E-01         8.50366E-01         1.61556E-01         9.41090E+02         4.76531E-01         1.06349E+03         2.05374E+03         1.52529E+03         5.28452E+02
+          2.57094E-03         1.02132E-02        -3.10189E-03         1.61528E-01         8.61037E-01         1.61558E-01         9.06578E+02         4.76534E-01         9.89188E+02         1.91649E+03         1.40203E+03         5.14461E+02
+          2.57094E-03         1.03830E-02        -3.21178E-03         1.61528E-01         8.71707E-01         1.61560E-01         8.77169E+02         4.76537E-01         9.18855E+02         1.78992E+03         1.28652E+03         5.03395E+02
+          2.57094E-03         1.05528E-02        -3.32349E-03         1.61528E-01         8.82378E-01         1.61562E-01         8.52539E+02         4.76540E-01         8.52344E+02         1.67362E+03         1.17855E+03         4.95067E+02
+          2.57094E-03         1.07227E-02        -3.43701E-03         1.61528E-01         8.93048E-01         1.61564E-01         8.32365E+02         4.76544E-01         7.89509E+02         1.56719E+03         1.07789E+03         4.89295E+02
+          2.57094E-03         1.08925E-02        -3.55233E-03         1.61527E-01         9.03719E-01         1.61566E-01         8.16329E+02         4.76547E-01         7.30199E+02         1.47021E+03         9.84315E+02         4.85892E+02
+          2.57094E-03         1.10623E-02        -3.66948E-03         1.61527E-01         9.14389E-01         1.61569E-01         8.04111E+02         4.76551E-01         6.74257E+02         1.38226E+03         8.97582E+02         4.84677E+02
+          2.57094E-03         1.12321E-02        -3.78843E-03         1.61527E-01         9.25060E-01         1.61571E-01         7.95401E+02         4.76555E-01         6.21525E+02         1.30292E+03         8.17451E+02         4.85468E+02
+          2.57094E-03         1.14020E-02        -3.90920E-03         1.61526E-01         9.35731E-01         1.61574E-01         7.89889E+02         4.76559E-01         5.71843E+02         1.23176E+03         7.43674E+02         4.88086E+02
+          2.57094E-03         1.15718E-02        -4.03178E-03         1.61526E-01         9.46401E-01         1.61576E-01         7.87276E+02         4.76564E-01         5.25050E+02         1.16836E+03         6.76003E+02         4.92356E+02
+          2.57094E-03         1.17416E-02        -4.15617E-03         1.61526E-01         9.57072E-01         1.61579E-01         7.87265E+02         4.76569E-01         4.80984E+02         1.11229E+03         6.14184E+02         4.98107E+02
+          2.57094E-03         1.19114E-02        -4.28237E-03         1.61525E-01         9.67742E-01         1.61582E-01         7.89572E+02         4.76573E-01         4.39487E+02         1.06313E+03         5.57963E+02         5.05169E+02
+          2.57094E-03         1.20813E-02        -4.41039E-03         1.61525E-01         9.78413E-01         1.61585E-01         7.93917E+02         4.76579E-01         4.00399E+02         1.02046E+03         5.07085E+02         5.13379E+02
+          2.57094E-03         1.22511E-02        -4.54022E-03         1.61525E-01         9.89083E-01         1.61589E-01         8.00033E+02         4.76584E-01         3.63568E+02         9.83873E+02         4.61293E+02         5.22580E+02
+          2.57094E-03         1.24209E-02        -4.67186E-03         1.61524E-01         9.99754E-01         1.61592E-01         8.07661E+02         4.76590E-01         3.28844E+02         9.52950E+02         4.20334E+02         5.32616E+02
+          2.57094E-03         1.25908E-02        -4.80532E-03         1.61524E-01         1.01042E+00         1.61595E-01         8.16554E+02         4.76596E-01         2.96087E+02         9.27295E+02         3.83953E+02         5.43342E+02
+          2.57094E-03         1.27606E-02        -4.94058E-03         1.61524E-01         1.02110E+00         1.61599E-01         8.26474E+02         4.76602E-01         2.65160E+02         9.06514E+02         3.51900E+02         5.54614E+02
+          2.57094E-03         1.29304E-02        -5.07766E-03         1.61523E-01         1.03177E+00         1.61603E-01         8.37195E+02         4.76608E-01         2.35942E+02         8.90223E+02         3.23924E+02         5.66298E+02
+          2.57094E-03         1.31002E-02        -5.21655E-03         1.61523E-01         1.04244E+00         1.61607E-01         8.48505E+02         4.76615E-01         2.08320E+02         8.78046E+02         2.99781E+02         5.78265E+02
+          2.57094E-03         1.32701E-02        -5.35726E-03         1.61523E-01         1.05311E+00         1.61611E-01         8.60202E+02         4.76622E-01         1.82202E+02         8.69620E+02         2.79229E+02         5.90391E+02
+          2.57094E-03         1.34399E-02        -5.49978E-03         1.61522E-01         1.06378E+00         1.61616E-01         8.72095E+02         4.76630E-01         1.57517E+02         8.64591E+02         2.62029E+02         6.02562E+02
+          2.57094E-03         1.36097E-02        -5.64411E-03         1.61522E-01         1.07445E+00         1.61620E-01         8.84010E+02         4.76637E-01         1.34228E+02         8.62618E+02         2.47949E+02         6.14669E+02
+          2.57094E-03         1.37795E-02        -5.79025E-03         1.61521E-01         1.08512E+00         1.61625E-01         8.95781E+02         4.76645E-01         1.12354E+02         8.63372E+02         2.36762E+02         6.26610E+02
+          2.57094E-03         1.39494E-02        -5.93821E-03         1.61521E-01         1.09579E+00         1.61630E-01         9.07258E+02         4.76653E-01         9.20123E+01         8.66538E+02         2.28246E+02         6.38292E+02
+          2.57094E-03         1.41192E-02        -6.08797E-03         1.61521E-01         1.10646E+00         1.61635E-01         9.18300E+02         4.76662E-01         7.35141E+01         8.71812E+02         2.22186E+02         6.49626E+02
+          2.57094E-03         1.42890E-02        -6.23955E-03         1.61520E-01         1.11713E+00         1.61641E-01         9.28782E+02         4.76671E-01         5.75795E+01         8.78905E+02         2.18372E+02         6.60532E+02
+          2.57094E-03         1.44589E-02        -6.39295E-03         1.61520E-01         1.12780E+00         1.61646E-01         9.38590E+02         4.76680E-01         4.57544E+01         8.87542E+02         2.16603E+02         6.70938E+02
+          2.57094E-03         1.46287E-02        -6.54815E-03         1.61520E-01         1.13847E+00         1.61652E-01         9.47622E+02         4.76690E-01         4.05699E+01         8.97462E+02         2.16684E+02         6.80778E+02
+          2.57094E-03         1.47985E-02        -6.70517E-03         1.61519E-01         1.14914E+00         1.61658E-01         9.55789E+02         4.76700E-01         4.34871E+01         9.08418E+02         2.18425E+02         6.89993E+02
+          2.57094E-03         1.49683E-02        -6.86400E-03         1.61519E-01         1.15981E+00         1.61665E-01         9.63012E+02         4.76711E-01         5.25015E+01         9.20178E+02         2.21648E+02         6.98530E+02
+          2.57094E-03         1.51382E-02        -7.02465E-03         1.61518E-01         1.17048E+00         1.61671E-01         9.69224E+02         4.76721E-01         6.46239E+01         9.32523E+02         2.26179E+02         7.06344E+02
+          2.57094E-03         1.53080E-02        -7.18711E-03         1.61518E-01         1.18115E+00         1.61678E-01         9.74371E+02         4.76733E-01         7.80443E+01         9.45251E+02         2.31854E+02         7.13397E+02
+          2.57094E-03         1.54778E-02        -7.35138E-03         1.61517E-01         1.19182E+00         1.61685E-01         9.78408E+02         4.76744E-01         9.18973E+01         9.58172E+02         2.38516E+02         7.19655E+02
+          2.57094E-03         1.56476E-02        -7.51746E-03         1.61517E-01         1.20249E+00         1.61692E-01         9.81300E+02         4.76756E-01         1.05769E+02         9.71110E+02         2.46016E+02         7.25094E+02
+          2.57094E-03         1.58175E-02        -7.68535E-03         1.61517E-01         1.21317E+00         1.61699E-01         9.83023E+02         4.76769E-01         1.19450E+02         9.83904E+02         2.54213E+02         7.29692E+02
+          2.57094E-03         1.59873E-02        -7.85506E-03         1.61516E-01         1.22384E+00         1.61707E-01         9.83562E+02         4.76782E-01         1.32821E+02         9.96408E+02         2.62973E+02         7.33435E+02
+          2.57094E-03         1.61571E-02        -8.02658E-03         1.61516E-01         1.23451E+00         1.61715E-01         9.82909E+02         4.76795E-01         1.45816E+02         1.00849E+03         2.72174E+02         7.36313E+02
+          2.57094E-03         1.63270E-02        -8.19992E-03         1.61515E-01         1.24518E+00         1.61723E-01         9.81069E+02         4.76809E-01         1.58388E+02         1.02002E+03         2.81696E+02         7.38324E+02
+          2.57094E-03         1.64968E-02        -8.37507E-03         1.61515E-01         1.25585E+00         1.61732E-01         9.78050E+02         4.76823E-01         1.70510E+02         1.03090E+03         2.91432E+02         7.39468E+02
+          2.57094E-03         1.66666E-02        -8.55203E-03         1.61514E-01         1.26652E+00         1.61741E-01         9.73870E+02         4.76838E-01         1.82158E+02         1.04103E+03         3.01279E+02         7.39750E+02
+          2.57094E-03         1.68364E-02        -8.73080E-03         1.61514E-01         1.27719E+00         1.61750E-01         9.68553E+02         4.76853E-01         1.93317E+02         1.05033E+03         3.11145E+02         7.39182E+02
+          2.57094E-03         1.70063E-02        -8.91138E-03         1.61513E-01         1.28786E+00         1.61759E-01         9.62130E+02         4.76869E-01         2.03974E+02         1.05872E+03         3.20943E+02         7.37777E+02
+          2.57094E-03         1.71761E-02        -9.09378E-03         1.61513E-01         1.29853E+00         1.61769E-01         9.54637E+02         4.76885E-01         2.14117E+02         1.06615E+03         3.30594E+02         7.35554E+02
+          2.57094E-03         1.73459E-02        -9.27799E-03         1.61513E-01         1.30920E+00         1.61779E-01         9.46115E+02         4.76902E-01         2.23739E+02         1.07256E+03         3.40028E+02         7.32533E+02
+          2.57094E-03         1.75158E-02        -9.46402E-03         1.61512E-01         1.31987E+00         1.61789E-01         9.36611E+02         4.76919E-01         2.32833E+02         1.07792E+03         3.49178E+02         7.28740E+02
+          2.57094E-03         1.76856E-02        -9.65186E-03         1.61512E-01         1.33054E+00         1.61800E-01         9.26175E+02         4.76937E-01         2.41393E+02         1.08219E+03         3.57987E+02         7.24203E+02
+          2.57094E-03         1.78554E-02        -9.84151E-03         1.61511E-01         1.34121E+00         1.61811E-01         9.14860E+02         4.76955E-01         2.49416E+02         1.08535E+03         3.66404E+02         7.18951E+02
+          2.57094E-03         1.80252E-02        -1.00330E-02         1.61511E-01         1.35188E+00         1.61822E-01         9.02723E+02         4.76974E-01         2.56899E+02         1.08740E+03         3.74383E+02         7.13017E+02
+          2.57094E-03         1.81951E-02        -1.02262E-02         1.61510E-01         1.36255E+00         1.61834E-01         8.89824E+02         4.76994E-01         2.63841E+02         1.08832E+03         3.81886E+02         7.06435E+02
+          2.57094E-03         1.83649E-02        -1.04213E-02         1.61510E-01         1.37322E+00         1.61845E-01         8.76224E+02         4.77014E-01         2.70243E+02         1.08812E+03         3.88879E+02         6.99242E+02
+          2.57094E-03         1.85347E-02        -1.06182E-02         1.61509E-01         1.38389E+00         1.61858E-01         8.61986E+02         4.77034E-01         2.76105E+02         1.08681E+03         3.95334E+02         6.91476E+02
+          2.57094E-03         1.87045E-02        -1.08170E-02         1.61509E-01         1.39457E+00         1.61870E-01         8.47174E+02         4.77056E-01         2.81433E+02         1.08440E+03         4.01228E+02         6.83176E+02
+          2.57094E-03         1.88744E-02        -1.10175E-02         1.61508E-01         1.40524E+00         1.61883E-01         8.31852E+02         4.77078E-01         2.86229E+02         1.08093E+03         4.06545E+02         6.74380E+02
+          2.57094E-03         1.90442E-02        -1.12198E-02         1.61508E-01         1.41591E+00         1.61897E-01         8.16087E+02         4.77100E-01         2.90500E+02         1.07640E+03         4.11270E+02         6.65130E+02
+          2.57094E-03         1.92140E-02        -1.14240E-02         1.61507E-01         1.42658E+00         1.61911E-01         7.99942E+02         4.77123E-01         2.94252E+02         1.07086E+03         4.15396E+02         6.55467E+02
+          2.57094E-03         1.93839E-02        -1.16300E-02         1.61506E-01         1.43725E+00         1.61925E-01         7.83483E+02         4.77147E-01         2.97494E+02         1.06435E+03         4.18918E+02         6.45432E+02
+          2.57094E-03         1.95537E-02        -1.18377E-02         1.61506E-01         1.44792E+00         1.61939E-01         7.66772E+02         4.77172E-01         3.00235E+02         1.05690E+03         4.21835E+02         6.35064E+02
+          2.57094E-03         1.97235E-02        -1.20473E-02         1.61505E-01         1.45859E+00         1.61954E-01         7.49872E+02         4.77197E-01         3.02486E+02         1.04856E+03         4.24150E+02         6.24407E+02
+          2.57094E-03         1.98933E-02        -1.22587E-02         1.61505E-01         1.46926E+00         1.61969E-01         7.32844E+02         4.77223E-01         3.04258E+02         1.03937E+03         4.25869E+02         6.13499E+02
+          2.57094E-03         2.00632E-02        -1.24720E-02         1.61504E-01         1.47993E+00         1.61985E-01         7.15747E+02         4.77250E-01         3.05563E+02         1.02938E+03         4.27002E+02         6.02381E+02
+          2.57094E-03         2.02330E-02        -1.26870E-02         1.61504E-01         1.49060E+00         1.62001E-01         6.98638E+02         4.77277E-01         3.06414E+02         1.01865E+03         4.27561E+02         5.91091E+02
+          2.57094E-03         2.04028E-02        -1.29038E-02         1.61503E-01         1.50127E+00         1.62018E-01         6.81571E+02         4.77305E-01         3.06826E+02         1.00723E+03         4.27560E+02         5.79667E+02
+          2.57094E-03         2.05726E-02        -1.31225E-02         1.61503E-01         1.51194E+00         1.62035E-01         6.64600E+02         4.77334E-01         3.06814E+02         9.95163E+02         4.27016E+02         5.68147E+02
+          2.57094E-03         2.07425E-02        -1.33430E-02         1.61502E-01         1.52261E+00         1.62052E-01         6.47774E+02         4.77364E-01         3.06392E+02         9.82514E+02         4.25947E+02         5.56567E+02
+          2.57094E-03         2.09123E-02        -1.35653E-02         1.61502E-01         1.53328E+00         1.62070E-01         6.31140E+02         4.77394E-01         3.05576E+02         9.69333E+02         4.24374E+02         5.44959E+02
+          2.57094E-03         2.10821E-02        -1.37894E-02         1.61501E-01         1.54395E+00         1.62089E-01         6.14741E+02         4.77425E-01         3.04383E+02         9.55677E+02         4.22319E+02         5.33358E+02
+          2.57094E-03         2.12520E-02        -1.40153E-02         1.61500E-01         1.55462E+00         1.62107E-01         5.98620E+02         4.77457E-01         3.02830E+02         9.41600E+02         4.19805E+02         5.21795E+02
+          2.57094E-03         2.14218E-02        -1.42430E-02         1.61500E-01         1.56529E+00         1.62127E-01         5.82813E+02         4.77490E-01         3.00933E+02         9.27155E+02         4.16856E+02         5.10299E+02
+          2.57094E-03         2.15916E-02        -1.44725E-02         1.61499E-01         1.57596E+00         1.62146E-01         5.67356E+02         4.77524E-01         2.98710E+02         9.12396E+02         4.13497E+02         4.98899E+02
+          2.57094E-03         2.17614E-02        -1.47039E-02         1.61499E-01         1.58664E+00         1.62167E-01         5.52281E+02         4.77558E-01         2.96178E+02         8.97376E+02         4.09755E+02         4.87622E+02
+          2.57094E-03         2.19313E-02        -1.49371E-02         1.61498E-01         1.59731E+00         1.62187E-01         5.37616E+02         4.77594E-01         2.93354E+02         8.82146E+02         4.05655E+02         4.76491E+02
+          2.57094E-03         2.21011E-02        -1.51720E-02         1.61497E-01         1.60798E+00         1.62208E-01         5.23386E+02         4.77630E-01         2.90256E+02         8.66754E+02         4.01224E+02         4.65530E+02
+          2.57094E-03         2.22709E-02        -1.54088E-02         1.61497E-01         1.61865E+00         1.62230E-01         5.09613E+02         4.77667E-01         2.86901E+02         8.51248E+02         3.96489E+02         4.54759E+02
+          2.57094E-03         2.24407E-02        -1.56475E-02         1.61496E-01         1.62932E+00         1.62252E-01         4.96316E+02         4.77705E-01         2.83307E+02         8.35676E+02         3.91477E+02         4.44199E+02
+          2.57094E-03         2.26106E-02        -1.58879E-02         1.61496E-01         1.63999E+00         1.62275E-01         4.83511E+02         4.77744E-01         2.79490E+02         8.20080E+02         3.86213E+02         4.33866E+02
+          2.57094E-03         2.27804E-02        -1.61301E-02         1.61495E-01         1.65066E+00         1.62298E-01         4.71211E+02         4.77784E-01         2.75467E+02         8.04502E+02         3.80726E+02         4.23776E+02
+          2.57094E-03         2.29502E-02        -1.63742E-02         1.61494E-01         1.66133E+00         1.62322E-01         4.59426E+02         4.77825E-01         2.71255E+02         7.88983E+02         3.75039E+02         4.13944E+02
+          2.57094E-03         2.31201E-02        -1.66200E-02         1.61494E-01         1.67200E+00         1.62347E-01         4.48162E+02         4.77867E-01         2.66870E+02         7.73560E+02         3.69180E+02         4.04380E+02
+          2.57094E-03         2.32899E-02        -1.68677E-02         1.61493E-01         1.68267E+00         1.62372E-01         4.37425E+02         4.77910E-01         2.62328E+02         7.58268E+02         3.63173E+02         3.95095E+02
+          2.57094E-03         2.34597E-02        -1.71172E-02         1.61492E-01         1.69334E+00         1.62397E-01         4.27215E+02         4.77954E-01         2.57644E+02         7.43140E+02         3.57041E+02         3.86099E+02
+          2.57094E-03         2.36295E-02        -1.73685E-02         1.61492E-01         1.70401E+00         1.62423E-01         4.17532E+02         4.77999E-01         2.52834E+02         7.28206E+02         3.50809E+02         3.77397E+02
+          2.57094E-03         2.37994E-02        -1.76216E-02         1.61491E-01         1.71468E+00         1.62450E-01         4.08372E+02         4.78045E-01         2.47913E+02         7.13494E+02         3.44498E+02         3.68996E+02
+          2.57094E-03         2.39692E-02        -1.78765E-02         1.61490E-01         1.72535E+00         1.62477E-01         3.99731E+02         4.78093E-01         2.42894E+02         6.99030E+02         3.38130E+02         3.60900E+02
+          2.57094E-03         2.41390E-02        -1.81333E-02         1.61490E-01         1.73602E+00         1.62505E-01         3.91601E+02         4.78141E-01         2.37791E+02         6.84837E+02         3.31727E+02         3.53110E+02
+          2.57094E-03         2.43088E-02        -1.83918E-02         1.61489E-01         1.74669E+00         1.62533E-01         3.83972E+02         4.78190E-01         2.32619E+02         6.70936E+02         3.25307E+02         3.45629E+02
+          2.57094E-03         2.44787E-02        -1.86522E-02         1.61488E-01         1.75736E+00         1.62562E-01         3.76832E+02         4.78241E-01         2.27389E+02         6.57344E+02         3.18889E+02         3.38455E+02
+          2.57094E-03         2.46485E-02        -1.89144E-02         1.61488E-01         1.76804E+00         1.62592E-01         3.70170E+02         4.78292E-01         2.22114E+02         6.44079E+02         3.12491E+02         3.31588E+02
+          2.57094E-03         2.48183E-02        -1.91784E-02         1.61487E-01         1.77871E+00         1.62622E-01         3.63971E+02         4.78345E-01         2.16806E+02         6.31154E+02         3.06129E+02         3.25024E+02
+          2.57094E-03         2.49882E-02        -1.94442E-02         1.61486E-01         1.78938E+00         1.62653E-01         3.58218E+02         4.78399E-01         2.11477E+02         6.18580E+02         2.99819E+02         3.18761E+02
+          2.57094E-03         2.51580E-02        -1.97118E-02         1.61486E-01         1.80005E+00         1.62684E-01         3.52896E+02         4.78454E-01         2.06137E+02         6.06368E+02         2.93574E+02         3.12793E+02
+          2.57094E-03         2.53278E-02        -1.99813E-02         1.61485E-01         1.81072E+00         1.62717E-01         3.47986E+02         4.78511E-01         2.00797E+02         5.94524E+02         2.87409E+02         3.07115E+02
+          2.57094E-03         2.54976E-02        -2.02525E-02         1.61484E-01         1.82139E+00         1.62749E-01         3.43469E+02         4.78568E-01         1.95467E+02         5.83054E+02         2.81334E+02         3.01720E+02
+          2.57094E-03         2.56675E-02        -2.05256E-02         1.61484E-01         1.83206E+00         1.62783E-01         3.39327E+02         4.78627E-01         1.90157E+02         5.71962E+02         2.75361E+02         2.96601E+02
+          2.57094E-03         2.58373E-02        -2.08005E-02         1.61483E-01         1.84273E+00         1.62817E-01         3.35538E+02         4.78687E-01         1.84876E+02         5.61250E+02         2.69499E+02         2.91751E+02
+          2.57094E-03         2.60071E-02        -2.10772E-02         1.61482E-01         1.85340E+00         1.62852E-01         3.32083E+02         4.78749E-01         1.79633E+02         5.50918E+02         2.63758E+02         2.87160E+02
+          2.57094E-03         2.61769E-02        -2.13557E-02         1.61481E-01         1.86407E+00         1.62887E-01         3.28940E+02         4.78812E-01         1.74436E+02         5.40965E+02         2.58146E+02         2.82819E+02
+          2.74077E-03         8.72665E-04         1.22878E-04         1.72207E-01         2.74155E-01         1.72207E-01         1.54024E+04         4.98967E-01         9.80464E+03         2.56906E+04         1.84945E+04         7.19602E+03
+          2.74077E-03         1.04249E-03         1.12660E-04         1.72207E-01         2.84826E-01         1.72207E-01         1.50218E+04         4.98966E-01         9.61849E+03         2.51475E+04         1.81314E+04         7.01610E+03
+          2.74077E-03         1.21232E-03         1.00630E-04         1.72207E-01         2.95496E-01         1.72207E-01         1.46354E+04         4.98966E-01         9.42862E+03         2.45946E+04         1.77611E+04         6.83353E+03
+          2.74077E-03         1.38215E-03         8.67880E-05         1.72207E-01         3.06167E-01         1.72207E-01         1.42441E+04         4.98966E-01         9.23535E+03         2.40329E+04         1.73842E+04         6.64869E+03
+          2.74077E-03         1.55197E-03         7.11337E-05         1.72207E-01         3.16838E-01         1.72207E-01         1.38487E+04         4.98966E-01         9.03901E+03         2.34634E+04         1.70014E+04         6.46196E+03
+          2.74077E-03         1.72180E-03         5.36672E-05         1.72207E-01         3.27508E-01         1.72207E-01         1.34500E+04         4.98966E-01         8.83991E+03         2.28870E+04         1.66133E+04         6.27374E+03
+          2.74077E-03         1.89163E-03         3.43886E-05         1.72207E-01         3.38179E-01         1.72207E-01         1.30488E+04         4.98966E-01         8.63839E+03         2.23049E+04         1.62205E+04         6.08440E+03
+          2.74077E-03         2.06146E-03         1.32978E-05         1.72207E-01         3.48849E-01         1.72207E-01         1.26458E+04         4.98966E-01         8.43478E+03         2.17180E+04         1.58237E+04         5.89432E+03
+          2.74077E-03         2.23128E-03        -9.60519E-06         1.72207E-01         3.59520E-01         1.72207E-01         1.22418E+04         4.98965E-01         8.22939E+03         2.11274E+04         1.54235E+04         5.70387E+03
+          2.74077E-03         2.40111E-03        -3.43203E-05         1.72207E-01         3.70190E-01         1.72207E-01         1.18377E+04         4.98965E-01         8.02256E+03         2.05340E+04         1.50206E+04         5.51343E+03
+          2.74077E-03         2.57094E-03        -6.08476E-05         1.72207E-01         3.80861E-01         1.72207E-01         1.14341E+04         4.98965E-01         7.81459E+03         1.99389E+04         1.46156E+04         5.32335E+03
+          2.74077E-03         2.74077E-03        -8.91871E-05         1.72207E-01         3.91532E-01         1.72207E-01         1.10319E+04         4.98965E-01         7.60581E+03         1.93430E+04         1.42090E+04         5.13398E+03
+          2.74077E-03         2.91059E-03        -1.19339E-04         1.72207E-01         4.02202E-01         1.72207E-01         1.06316E+04         4.98965E-01         7.39654E+03         1.87473E+04         1.38016E+04         4.94567E+03
+          2.74077E-03         3.08042E-03        -1.51302E-04         1.72207E-01         4.12873E-01         1.72207E-01         1.02341E+04         4.98965E-01         7.18707E+03         1.81527E+04         1.33940E+04         4.75875E+03
+          2.74077E-03         3.25025E-03        -1.85078E-04         1.72206E-01         4.23543E-01         1.72207E-01         9.83994E+03         4.98965E-01         6.97771E+03         1.75602E+04         1.29866E+04         4.57355E+03
+          2.74077E-03         3.42008E-03        -2.20667E-04         1.72206E-01         4.34214E-01         1.72207E-01         9.44983E+03         4.98964E-01         6.76875E+03         1.69705E+04         1.25802E+04         4.39038E+03
+          2.74077E-03         3.58990E-03        -2.58067E-04         1.72206E-01         4.44884E-01         1.72206E-01         9.06440E+03         4.98964E-01         6.56049E+03         1.63847E+04         1.21752E+04         4.20953E+03
+          2.74077E-03         3.75973E-03        -2.97279E-04         1.72206E-01         4.55555E-01         1.72206E-01         8.68423E+03         4.98964E-01         6.35321E+03         1.58035E+04         1.17722E+04         4.03130E+03
+          2.74077E-03         3.92956E-03        -3.38304E-04         1.72206E-01         4.66225E-01         1.72206E-01         8.30990E+03         4.98964E-01         6.14717E+03         1.52278E+04         1.13718E+04         3.85596E+03
+          2.74077E-03         4.09939E-03        -3.81141E-04         1.72206E-01         4.76896E-01         1.72206E-01         7.94195E+03         4.98964E-01         5.94265E+03         1.46583E+04         1.09745E+04         3.68377E+03
+          2.74077E-03         4.26921E-03        -4.25790E-04         1.72206E-01         4.87567E-01         1.72206E-01         7.58089E+03         4.98964E-01         5.73990E+03         1.40957E+04         1.05808E+04         3.51497E+03
+          2.74077E-03         4.43904E-03        -4.72251E-04         1.72206E-01         4.98237E-01         1.72206E-01         7.22721E+03         4.98964E-01         5.53916E+03         1.35409E+04         1.01911E+04         3.34979E+03
+          2.74077E-03         4.60887E-03        -5.20525E-04         1.72206E-01         5.08908E-01         1.72206E-01         6.88135E+03         4.98964E-01         5.34068E+03         1.29944E+04         9.80598E+03         3.18845E+03
+          2.74077E-03         4.77869E-03        -5.70611E-04         1.72205E-01         5.19578E-01         1.72206E-01         6.54373E+03         4.98964E-01         5.14467E+03         1.24570E+04         9.42582E+03         3.03114E+03
+          2.74077E-03         4.94852E-03        -6.22508E-04         1.72205E-01         5.30249E-01         1.72206E-01         6.21473E+03         4.98964E-01         4.95135E+03         1.19291E+04         9.05106E+03         2.87805E+03
+          2.74077E-03         5.11835E-03        -6.76219E-04         1.72205E-01         5.40919E-01         1.72206E-01         5.89470E+03         4.98964E-01         4.76093E+03         1.14115E+04         8.68211E+03         2.72935E+03
+          2.74077E-03         5.28818E-03        -7.31741E-04         1.72205E-01         5.51590E-01         1.72207E-01         5.58395E+03         4.98964E-01         4.57360E+03         1.09045E+04         8.31933E+03         2.58518E+03
+          2.74077E-03         5.45800E-03        -7.89075E-04         1.72205E-01         5.62261E-01         1.72207E-01         5.28276E+03         4.98965E-01         4.38954E+03         1.04088E+04         7.96309E+03         2.44567E+03
+          2.74077E-03         5.62783E-03        -8.48222E-04         1.72205E-01         5.72931E-01         1.72207E-01         4.99139E+03         4.98965E-01         4.20892E+03         9.92467E+03         7.61372E+03         2.31095E+03
+          2.74077E-03         5.79766E-03        -9.09181E-04         1.72205E-01         5.83602E-01         1.72207E-01         4.71003E+03         4.98965E-01         4.03189E+03         9.45265E+03         7.27153E+03         2.18111E+03
+          2.74077E-03         5.96749E-03        -9.71953E-04         1.72204E-01         5.94272E-01         1.72207E-01         4.43887E+03         4.98966E-01         3.85860E+03         8.99306E+03         6.93682E+03         2.05624E+03
+          2.74077E-03         6.13731E-03        -1.03654E-03         1.72204E-01         6.04943E-01         1.72207E-01         4.17806E+03         4.98966E-01         3.68918E+03         8.54624E+03         6.60983E+03         1.93640E+03
+          2.74077E-03         6.30714E-03        -1.10293E-03         1.72204E-01         6.15613E-01         1.72208E-01         3.92770E+03         4.98967E-01         3.52376E+03         8.11247E+03         6.29082E+03         1.82166E+03
+          2.74077E-03         6.47697E-03        -1.17114E-03         1.72204E-01         6.26284E-01         1.72208E-01         3.68787E+03         4.98968E-01         3.36243E+03         7.69202E+03         5.97999E+03         1.71203E+03
+          2.74077E-03         6.64680E-03        -1.24116E-03         1.72204E-01         6.36955E-01         1.72208E-01         3.45862E+03         4.98968E-01         3.20531E+03         7.28509E+03         5.67755E+03         1.60754E+03
+          2.74077E-03         6.81662E-03        -1.31299E-03         1.72203E-01         6.47625E-01         1.72208E-01         3.23997E+03         4.98969E-01         3.05246E+03         6.89186E+03         5.38365E+03         1.50821E+03
+          2.74077E-03         6.98645E-03        -1.38664E-03         1.72203E-01         6.58296E-01         1.72209E-01         3.03190E+03         4.98970E-01         2.90395E+03         6.51246E+03         5.09845E+03         1.41401E+03
+          2.74077E-03         7.15628E-03        -1.46209E-03         1.72203E-01         6.68966E-01         1.72209E-01         2.83436E+03         4.98971E-01         2.75986E+03         6.14700E+03         4.82207E+03         1.32492E+03
+          2.74077E-03         7.32611E-03        -1.53936E-03         1.72203E-01         6.79637E-01         1.72210E-01         2.64729E+03         4.98972E-01         2.62022E+03         5.79552E+03         4.55461E+03         1.24092E+03
+          2.74077E-03         7.49593E-03        -1.61845E-03         1.72203E-01         6.90307E-01         1.72210E-01         2.47058E+03         4.98974E-01         2.48508E+03         5.45808E+03         4.29614E+03         1.16194E+03
+          2.74077E-03         7.66576E-03        -1.69934E-03         1.72202E-01         7.00978E-01         1.72211E-01         2.30412E+03         4.98975E-01         2.35444E+03         5.13464E+03         4.04672E+03         1.08792E+03
+          2.74077E-03         7.83559E-03        -1.78205E-03         1.72202E-01         7.11649E-01         1.72211E-01         2.14774E+03         4.98977E-01         2.22833E+03         4.82518E+03         3.80638E+03         1.01879E+03
+          2.74077E-03         8.00542E-03        -1.86656E-03         1.72202E-01         7.22319E-01         1.72212E-01         2.00128E+03         4.98978E-01         2.10674E+03         4.52961E+03         3.57515E+03         9.54466E+02
+          2.74077E-03         8.17524E-03        -1.95290E-03         1.72202E-01         7.32990E-01         1.72213E-01         1.86454E+03         4.98980E-01         1.98967E+03         4.24785E+03         3.35300E+03         8.94843E+02
+          2.74077E-03         8.34507E-03        -2.04104E-03         1.72201E-01         7.43660E-01         1.72214E-01         1.73731E+03         4.98982E-01         1.87709E+03         3.97974E+03         3.13992E+03         8.39816E+02
+          2.74077E-03         8.51490E-03        -2.13099E-03         1.72201E-01         7.54331E-01         1.72214E-01         1.61934E+03         4.98984E-01         1.76896E+03         3.72513E+03         2.93587E+03         7.89269E+02
+          2.74077E-03         8.68473E-03        -2.22276E-03         1.72201E-01         7.65001E-01         1.72215E-01         1.51039E+03         4.98987E-01         1.66526E+03         3.48384E+03         2.74076E+03         7.43076E+02
+          2.74077E-03         8.85455E-03        -2.31634E-03         1.72201E-01         7.75672E-01         1.72216E-01         1.41019E+03         4.98989E-01         1.56593E+03         3.25564E+03         2.55454E+03         7.01104E+02
+          2.74077E-03         9.02438E-03        -2.41174E-03         1.72200E-01         7.86343E-01         1.72217E-01         1.31846E+03         4.98992E-01         1.47089E+03         3.04030E+03         2.37709E+03         6.63210E+02
+          2.74077E-03         9.19421E-03        -2.50894E-03         1.72200E-01         7.97013E-01         1.72218E-01         1.23489E+03         4.98995E-01         1.38010E+03         2.83756E+03         2.20831E+03         6.29250E+02
+          2.74077E-03         9.36403E-03        -2.60796E-03         1.72200E-01         8.07684E-01         1.72220E-01         1.15917E+03         4.98998E-01         1.29346E+03         2.64713E+03         2.04806E+03         5.99068E+02
+          2.74077E-03         9.53386E-03        -2.70879E-03         1.72200E-01         8.18354E-01         1.72221E-01         1.09100E+03         4.99001E-01         1.21089E+03         2.46872E+03         1.89621E+03         5.72508E+02
+          2.74077E-03         9.70369E-03        -2.81143E-03         1.72199E-01         8.29025E-01         1.72222E-01         1.03004E+03         4.99005E-01         1.13230E+03         2.30201E+03         1.75260E+03         5.49406E+02
+          2.74077E-03         9.87352E-03        -2.91588E-03         1.72199E-01         8.39695E-01         1.72224E-01         9.75957E+02         4.99008E-01         1.05758E+03         2.14666E+03         1.61707E+03         5.29597E+02
+          2.74077E-03         1.00433E-02        -3.02215E-03         1.72199E-01         8.50366E-01         1.72225E-01         9.28412E+02         4.99012E-01         9.86617E+02         2.00234E+03         1.48942E+03         5.12911E+02
+          2.74077E-03         1.02132E-02        -3.13023E-03         1.72198E-01         8.61037E-01         1.72227E-01         8.87059E+02         4.99016E-01         9.19308E+02         1.86866E+03         1.36949E+03         4.99178E+02
+          2.74077E-03         1.03830E-02        -3.24012E-03         1.72198E-01         8.71707E-01         1.72229E-01         8.51552E+02         4.99021E-01         8.55528E+02         1.74528E+03         1.25705E+03         4.88226E+02
+          2.74077E-03         1.05528E-02        -3.35183E-03         1.72198E-01         8.82378E-01         1.72230E-01         8.21542E+02         4.99026E-01         7.95150E+02         1.63180E+03         1.15192E+03         4.79880E+02
+          2.74077E-03         1.07227E-02        -3.46534E-03         1.72198E-01         8.93048E-01         1.72232E-01         7.96681E+02         4.99031E-01         7.38044E+02         1.52784E+03         1.05387E+03         4.73968E+02
+          2.74077E-03         1.08925E-02        -3.58067E-03         1.72197E-01         9.03719E-01         1.72234E-01         7.76620E+02         4.99036E-01         6.84077E+02         1.43299E+03         9.62677E+02         4.70317E+02
+          2.74077E-03         1.10623E-02        -3.69781E-03         1.72197E-01         9.14389E-01         1.72237E-01         7.61015E+02         4.99041E-01         6.33112E+02         1.34687E+03         8.78118E+02         4.68753E+02
+          2.74077E-03         1.12321E-02        -3.81677E-03         1.72197E-01         9.25060E-01         1.72239E-01         7.49525E+02         4.99047E-01         5.85010E+02         1.26907E+03         7.99958E+02         4.69108E+02
+          2.74077E-03         1.14020E-02        -3.93754E-03         1.72196E-01         9.35731E-01         1.72241E-01         7.41811E+02         4.99053E-01         5.39631E+02         1.19917E+03         7.27960E+02         4.71213E+02
+          2.74077E-03         1.15718E-02        -4.06011E-03         1.72196E-01         9.46401E-01         1.72244E-01         7.37544E+02         4.99060E-01         4.96835E+02         1.13679E+03         6.61883E+02         4.74903E+02
+          2.74077E-03         1.17416E-02        -4.18451E-03         1.72196E-01         9.57072E-01         1.72246E-01         7.36399E+02         4.99066E-01         4.56483E+02         1.08150E+03         6.01484E+02         4.80015E+02
+          2.74077E-03         1.19114E-02        -4.31071E-03         1.72195E-01         9.67742E-01         1.72249E-01         7.38059E+02         4.99073E-01         4.18437E+02         1.03291E+03         5.46516E+02         4.86392E+02
+          2.74077E-03         1.20813E-02        -4.43873E-03         1.72195E-01         9.78413E-01         1.72252E-01         7.42216E+02         4.99081E-01         3.82561E+02         9.90613E+02         4.96735E+02         4.93878E+02
+          2.74077E-03         1.22511E-02        -4.56856E-03         1.72194E-01         9.89083E-01         1.72255E-01         7.48572E+02         4.99089E-01         3.48727E+02         9.54218E+02         4.51894E+02         5.02324E+02
+          2.74077E-03         1.24209E-02        -4.70020E-03         1.72194E-01         9.99754E-01         1.72258E-01         7.56838E+02         4.99097E-01         3.16809E+02         9.23332E+02         4.11747E+02         5.11586E+02
+          2.74077E-03         1.25908E-02        -4.83365E-03         1.72194E-01         1.01042E+00         1.72262E-01         7.66736E+02         4.99105E-01         2.86690E+02         8.97571E+02         3.76049E+02         5.21522E+02
+          2.74077E-03         1.27606E-02        -4.96892E-03         1.72193E-01         1.02110E+00         1.72265E-01         7.77999E+02         4.99114E-01         2.58263E+02         8.76558E+02         3.44557E+02         5.32000E+02
+          2.74077E-03         1.29304E-02        -5.10600E-03         1.72193E-01         1.03177E+00         1.72269E-01         7.90372E+02         4.99124E-01         2.31433E+02         8.59923E+02         3.17032E+02         5.42891E+02
+          2.74077E-03         1.31002E-02        -5.24489E-03         1.72193E-01         1.04244E+00         1.72272E-01         8.03613E+02         4.99133E-01         2.06118E+02         8.47307E+02         2.93235E+02         5.54072E+02
+          2.74077E-03         1.32701E-02        -5.38560E-03         1.72192E-01         1.05311E+00         1.72276E-01         8.17492E+02         4.99144E-01         1.82261E+02         8.38360E+02         2.72933E+02         5.65427E+02
+          2.74077E-03         1.34399E-02        -5.52811E-03         1.72192E-01         1.06378E+00         1.72281E-01         8.31792E+02         4.99154E-01         1.59830E+02         8.32743E+02         2.55897E+02         5.76847E+02
+          2.74077E-03         1.36097E-02        -5.67244E-03         1.72191E-01         1.07445E+00         1.72285E-01         8.46309E+02         4.99165E-01         1.38834E+02         8.30127E+02         2.41900E+02         5.88227E+02
+          2.74077E-03         1.37795E-02        -5.81859E-03         1.72191E-01         1.08512E+00         1.72289E-01         8.60852E+02         4.99177E-01         1.19348E+02         8.30196E+02         2.30725E+02         5.99471E+02
+          2.74077E-03         1.39494E-02        -5.96654E-03         1.72191E-01         1.09579E+00         1.72294E-01         8.75245E+02         4.99189E-01         1.01542E+02         8.32645E+02         2.22155E+02         6.10489E+02
+          2.74077E-03         1.41192E-02        -6.11631E-03         1.72190E-01         1.10646E+00         1.72299E-01         8.89323E+02         4.99201E-01         8.57480E+01         8.37181E+02         2.15983E+02         6.21198E+02
+          2.74077E-03         1.42890E-02        -6.26789E-03         1.72190E-01         1.11713E+00         1.72304E-01         9.02936E+02         4.99214E-01         7.25477E+01         8.43527E+02         2.12006E+02         6.31520E+02
+          2.74077E-03         1.44589E-02        -6.42128E-03         1.72189E-01         1.12780E+00         1.72309E-01         9.15947E+02         4.99227E-01         6.28399E+01         8.51415E+02         2.10029E+02         6.41386E+02
+          2.74077E-03         1.46287E-02        -6.57649E-03         1.72189E-01         1.13847E+00         1.72315E-01         9.28233E+02         4.99241E-01         5.76874E+01         8.60594E+02         2.09862E+02         6.50732E+02
+          2.74077E-03         1.47985E-02        -6.73351E-03         1.72189E-01         1.14914E+00         1.72320E-01         9.39683E+02         4.99256E-01         5.76845E+01         8.70825E+02         2.11323E+02         6.59502E+02
+          2.74077E-03         1.49683E-02        -6.89234E-03         1.72188E-01         1.15981E+00         1.72326E-01         9.50200E+02         4.99271E-01         6.23131E+01         8.81882E+02         2.14237E+02         6.67644E+02
+          2.74077E-03         1.51382E-02        -7.05299E-03         1.72188E-01         1.17048E+00         1.72332E-01         9.59697E+02         4.99286E-01         7.02521E+01         8.93553E+02         2.18438E+02         6.75116E+02
+          2.74077E-03         1.53080E-02        -7.21544E-03         1.72187E-01         1.18115E+00         1.72338E-01         9.68101E+02         4.99303E-01         8.01943E+01         9.05642E+02         2.23764E+02         6.81878E+02
+          2.74077E-03         1.54778E-02        -7.37971E-03         1.72187E-01         1.19182E+00         1.72345E-01         9.75352E+02         4.99319E-01         9.12172E+01         9.17963E+02         2.30064E+02         6.87899E+02
+          2.74077E-03         1.56476E-02        -7.54580E-03         1.72186E-01         1.20249E+00         1.72352E-01         9.81400E+02         4.99337E-01         1.02749E+02         9.30346E+02         2.37193E+02         6.93153E+02
+          2.74077E-03         1.58175E-02        -7.71369E-03         1.72186E-01         1.21317E+00         1.72359E-01         9.86206E+02         4.99355E-01         1.14445E+02         9.42634E+02         2.45015E+02         6.97619E+02
+          2.74077E-03         1.59873E-02        -7.88340E-03         1.72185E-01         1.22384E+00         1.72366E-01         9.89741E+02         4.99373E-01         1.26094E+02         9.54682E+02         2.53399E+02         7.01284E+02
+          2.74077E-03         1.61571E-02        -8.05492E-03         1.72185E-01         1.23451E+00         1.72373E-01         9.91987E+02         4.99392E-01         1.37563E+02         9.66360E+02         2.62224E+02         7.04135E+02
+          2.74077E-03         1.63270E-02        -8.22825E-03         1.72184E-01         1.24518E+00         1.72381E-01         9.92935E+02         4.99412E-01         1.48765E+02         9.77548E+02         2.71378E+02         7.06170E+02
+          2.74077E-03         1.64968E-02        -8.40340E-03         1.72184E-01         1.25585E+00         1.72389E-01         9.92587E+02         4.99433E-01         1.59640E+02         9.88140E+02         2.80752E+02         7.07388E+02
+          2.74077E-03         1.66666E-02        -8.58036E-03         1.72183E-01         1.26652E+00         1.72397E-01         9.90950E+02         4.99454E-01         1.70146E+02         9.98041E+02         2.90249E+02         7.07792E+02
+          2.74077E-03         1.68364E-02        -8.75913E-03         1.72183E-01         1.27719E+00         1.72406E-01         9.88041E+02         4.99476E-01         1.80252E+02         1.00717E+03         2.99777E+02         7.07392E+02
+          2.74077E-03         1.70063E-02        -8.93972E-03         1.72183E-01         1.28786E+00         1.72414E-01         9.83885E+02         4.99498E-01         1.89934E+02         1.01545E+03         3.09253E+02         7.06201E+02
+          2.74077E-03         1.71761E-02        -9.12212E-03         1.72182E-01         1.29853E+00         1.72423E-01         9.78512E+02         4.99522E-01         1.99174E+02         1.02283E+03         3.18598E+02         7.04233E+02
+          2.74077E-03         1.73459E-02        -9.30633E-03         1.72181E-01         1.30920E+00         1.72433E-01         9.71959E+02         4.99546E-01         2.07958E+02         1.02925E+03         3.27743E+02         7.01508E+02
+          2.74077E-03         1.75158E-02        -9.49235E-03         1.72181E-01         1.31987E+00         1.72442E-01         9.64270E+02         4.99571E-01         2.16276E+02         1.03467E+03         3.36625E+02         6.98050E+02
+          2.74077E-03         1.76856E-02        -9.68019E-03         1.72180E-01         1.33054E+00         1.72452E-01         9.55491E+02         4.99596E-01         2.24119E+02         1.03907E+03         3.45186E+02         6.93883E+02
+          2.74077E-03         1.78554E-02        -9.86984E-03         1.72180E-01         1.34121E+00         1.72463E-01         9.45674E+02         4.99623E-01         2.31480E+02         1.04241E+03         3.53377E+02         6.89034E+02
+          2.74077E-03         1.80252E-02        -1.00613E-02         1.72179E-01         1.35188E+00         1.72473E-01         9.34877E+02         4.99650E-01         2.38356E+02         1.04469E+03         3.61152E+02         6.83534E+02
+          2.74077E-03         1.81951E-02        -1.02546E-02         1.72179E-01         1.36255E+00         1.72484E-01         9.23158E+02         4.99678E-01         2.44744E+02         1.04589E+03         3.68473E+02         6.77416E+02
+          2.74077E-03         1.83649E-02        -1.04497E-02         1.72178E-01         1.37322E+00         1.72495E-01         9.10580E+02         4.99707E-01         2.50643E+02         1.04602E+03         3.75307E+02         6.70711E+02
+          2.74077E-03         1.85347E-02        -1.06466E-02         1.72178E-01         1.38389E+00         1.72507E-01         8.97208E+02         4.99737E-01         2.56053E+02         1.04508E+03         3.81627E+02         6.63456E+02
+          2.74077E-03         1.87045E-02        -1.08453E-02         1.72177E-01         1.39457E+00         1.72519E-01         8.83107E+02         4.99767E-01         2.60977E+02         1.04310E+03         3.87409E+02         6.55687E+02
+          2.74077E-03         1.88744E-02        -1.10458E-02         1.72177E-01         1.40524E+00         1.72531E-01         8.68347E+02         4.99799E-01         2.65417E+02         1.04008E+03         3.92636E+02         6.47441E+02
+          2.74077E-03         1.90442E-02        -1.12482E-02         1.72176E-01         1.41591E+00         1.72543E-01         8.52994E+02         4.99831E-01         2.69379E+02         1.03605E+03         3.97295E+02         6.38756E+02
+          2.74077E-03         1.92140E-02        -1.14523E-02         1.72176E-01         1.42658E+00         1.72556E-01         8.37120E+02         4.99864E-01         2.72868E+02         1.03105E+03         4.01377E+02         6.29670E+02
+          2.74077E-03         1.93839E-02        -1.16583E-02         1.72175E-01         1.43725E+00         1.72569E-01         8.20792E+02         4.99899E-01         2.75891E+02         1.02510E+03         4.04876E+02         6.20221E+02
+          2.74077E-03         1.95537E-02        -1.18661E-02         1.72174E-01         1.44792E+00         1.72583E-01         8.04080E+02         4.99934E-01         2.78456E+02         1.01824E+03         4.07792E+02         6.10449E+02
+          2.74077E-03         1.97235E-02        -1.20757E-02         1.72174E-01         1.45859E+00         1.72597E-01         7.87051E+02         4.99970E-01         2.80572E+02         1.01052E+03         4.10126E+02         6.00392E+02
+          2.74077E-03         1.98933E-02        -1.22871E-02         1.72173E-01         1.46926E+00         1.72611E-01         7.69773E+02         5.00007E-01         2.82250E+02         1.00197E+03         4.11885E+02         5.90087E+02
+          2.74077E-03         2.00632E-02        -1.25003E-02         1.72173E-01         1.47993E+00         1.72626E-01         7.52309E+02         5.00046E-01         2.83499E+02         9.92649E+02         4.13077E+02         5.79573E+02
+          2.74077E-03         2.02330E-02        -1.27153E-02         1.72172E-01         1.49060E+00         1.72641E-01         7.34726E+02         5.00085E-01         2.84333E+02         9.82598E+02         4.13712E+02         5.68886E+02
+          2.74077E-03         2.04028E-02        -1.29322E-02         1.72172E-01         1.50127E+00         1.72657E-01         7.17083E+02         5.00125E-01         2.84763E+02         9.71866E+02         4.13804E+02         5.58062E+02
+          2.74077E-03         2.05726E-02        -1.31508E-02         1.72171E-01         1.51194E+00         1.72672E-01         6.99440E+02         5.00167E-01         2.84802E+02         9.60506E+02         4.13370E+02         5.47137E+02
+          2.74077E-03         2.07425E-02        -1.33713E-02         1.72170E-01         1.52261E+00         1.72689E-01         6.81854E+02         5.00209E-01         2.84464E+02         9.48569E+02         4.12426E+02         5.36143E+02
+          2.74077E-03         2.09123E-02        -1.35936E-02         1.72170E-01         1.53328E+00         1.72706E-01         6.64379E+02         5.00253E-01         2.83763E+02         9.36107E+02         4.10992E+02         5.25115E+02
+          2.74077E-03         2.10821E-02        -1.38177E-02         1.72169E-01         1.54395E+00         1.72723E-01         6.47067E+02         5.00297E-01         2.82714E+02         9.23173E+02         4.09089E+02         5.14084E+02
+          2.74077E-03         2.12520E-02        -1.40436E-02         1.72169E-01         1.55462E+00         1.72740E-01         6.29965E+02         5.00343E-01         2.81332E+02         9.09818E+02         4.06740E+02         5.03078E+02
+          2.74077E-03         2.14218E-02        -1.42713E-02         1.72168E-01         1.56529E+00         1.72758E-01         6.13120E+02         5.00390E-01         2.79631E+02         8.96094E+02         4.03966E+02         4.92128E+02
+          2.74077E-03         2.15916E-02        -1.45009E-02         1.72167E-01         1.57596E+00         1.72777E-01         5.96572E+02         5.00438E-01         2.77627E+02         8.82052E+02         4.00793E+02         4.81260E+02
+          2.74077E-03         2.17614E-02        -1.47322E-02         1.72167E-01         1.58664E+00         1.72796E-01         5.80361E+02         5.00488E-01         2.75336E+02         8.67743E+02         3.97244E+02         4.70499E+02
+          2.74077E-03         2.19313E-02        -1.49654E-02         1.72166E-01         1.59731E+00         1.72815E-01         5.64523E+02         5.00538E-01         2.72773E+02         8.53216E+02         3.93347E+02         4.59869E+02
+          2.74077E-03         2.21011E-02        -1.52004E-02         1.72165E-01         1.60798E+00         1.72835E-01         5.49089E+02         5.00590E-01         2.69953E+02         8.38517E+02         3.89125E+02         4.49393E+02
+          2.74077E-03         2.22709E-02        -1.54372E-02         1.72165E-01         1.61865E+00         1.72855E-01         5.34088E+02         5.00644E-01         2.66893E+02         8.23694E+02         3.84604E+02         4.39090E+02
+          2.74077E-03         2.24407E-02        -1.56758E-02         1.72164E-01         1.62932E+00         1.72876E-01         5.19545E+02         5.00698E-01         2.63608E+02         8.08791E+02         3.79812E+02         4.28979E+02
+          2.74077E-03         2.26106E-02        -1.59162E-02         1.72163E-01         1.63999E+00         1.72898E-01         5.05483E+02         5.00754E-01         2.60113E+02         7.93850E+02         3.74772E+02         4.19078E+02
+          2.74077E-03         2.27804E-02        -1.61584E-02         1.72163E-01         1.65066E+00         1.72919E-01         4.91920E+02         5.00811E-01         2.56423E+02         7.78913E+02         3.69511E+02         4.09402E+02
+          2.74077E-03         2.29502E-02        -1.64025E-02         1.72162E-01         1.66133E+00         1.72942E-01         4.78872E+02         5.00869E-01         2.52554E+02         7.64017E+02         3.64054E+02         3.99963E+02
+          2.74077E-03         2.31201E-02        -1.66484E-02         1.72161E-01         1.67200E+00         1.72964E-01         4.66352E+02         5.00929E-01         2.48519E+02         7.49200E+02         3.58425E+02         3.90775E+02
+          2.74077E-03         2.32899E-02        -1.68960E-02         1.72161E-01         1.68267E+00         1.72988E-01         4.54368E+02         5.00991E-01         2.44334E+02         7.34495E+02         3.52648E+02         3.81848E+02
+          2.74077E-03         2.34597E-02        -1.71455E-02         1.72160E-01         1.69334E+00         1.73012E-01         4.42928E+02         5.01053E-01         2.40012E+02         7.19936E+02         3.46747E+02         3.73189E+02
+          2.74077E-03         2.36295E-02        -1.73968E-02         1.72159E-01         1.70401E+00         1.73036E-01         4.32035E+02         5.01118E-01         2.35567E+02         7.05551E+02         3.40744E+02         3.64807E+02
+          2.74077E-03         2.37994E-02        -1.76499E-02         1.72159E-01         1.71468E+00         1.73061E-01         4.21690E+02         5.01183E-01         2.31012E+02         6.91369E+02         3.34661E+02         3.56708E+02
+          2.74077E-03         2.39692E-02        -1.79049E-02         1.72158E-01         1.72535E+00         1.73087E-01         4.11892E+02         5.01250E-01         2.26361E+02         6.77414E+02         3.28520E+02         3.48894E+02
+          2.74077E-03         2.41390E-02        -1.81616E-02         1.72157E-01         1.73602E+00         1.73113E-01         4.02637E+02         5.01319E-01         2.21625E+02         6.63710E+02         3.22340E+02         3.41370E+02
+          2.74077E-03         2.43088E-02        -1.84202E-02         1.72157E-01         1.74669E+00         1.73139E-01         3.93918E+02         5.01389E-01         2.16818E+02         6.50277E+02         3.16140E+02         3.34137E+02
+          2.74077E-03         2.44787E-02        -1.86805E-02         1.72156E-01         1.75736E+00         1.73166E-01         3.85727E+02         5.01461E-01         2.11950E+02         6.37133E+02         3.09939E+02         3.27194E+02
+          2.74077E-03         2.46485E-02        -1.89427E-02         1.72155E-01         1.76804E+00         1.73194E-01         3.78054E+02         5.01534E-01         2.07034E+02         6.24295E+02         3.03753E+02         3.20542E+02
+          2.74077E-03         2.48183E-02        -1.92067E-02         1.72154E-01         1.77871E+00         1.73222E-01         3.70886E+02         5.01609E-01         2.02080E+02         6.11777E+02         2.97599E+02         3.14178E+02
+          2.74077E-03         2.49882E-02        -1.94725E-02         1.72154E-01         1.78938E+00         1.73251E-01         3.64211E+02         5.01686E-01         1.97098E+02         5.99590E+02         2.91491E+02         3.08099E+02
+          2.74077E-03         2.51580E-02        -1.97402E-02         1.72153E-01         1.80005E+00         1.73281E-01         3.58013E+02         5.01764E-01         1.92099E+02         5.87745E+02         2.85444E+02         3.02301E+02
+          2.74077E-03         2.53278E-02        -2.00096E-02         1.72152E-01         1.81072E+00         1.73311E-01         3.52275E+02         5.01844E-01         1.87092E+02         5.76249E+02         2.79471E+02         2.96778E+02
+          2.74077E-03         2.54976E-02        -2.02809E-02         1.72151E-01         1.82139E+00         1.73342E-01         3.46979E+02         5.01926E-01         1.82087E+02         5.65109E+02         2.73582E+02         2.91526E+02
+          2.74077E-03         2.56675E-02        -2.05539E-02         1.72151E-01         1.83206E+00         1.73373E-01         3.42107E+02         5.02010E-01         1.77093E+02         5.54328E+02         2.67790E+02         2.86538E+02
+          2.74077E-03         2.58373E-02        -2.08288E-02         1.72150E-01         1.84273E+00         1.73405E-01         3.37639E+02         5.02095E-01         1.72117E+02         5.43910E+02         2.62104E+02         2.81806E+02
+          2.74077E-03         2.60071E-02        -2.11055E-02         1.72149E-01         1.85340E+00         1.73438E-01         3.33555E+02         5.02182E-01         1.67169E+02         5.33855E+02         2.56531E+02         2.77323E+02
+          2.74077E-03         2.61769E-02        -2.13840E-02         1.72148E-01         1.86407E+00         1.73471E-01         3.29834E+02         5.02271E-01         1.62257E+02         5.24162E+02         2.51081E+02         2.73081E+02
+          2.91059E-03         8.72665E-04         9.27264E-05         1.82878E-01         2.74155E-01         1.82878E-01         1.67822E+04         5.31114E-01         8.74987E+03         2.46659E+04         1.78753E+04         6.79057E+03
+          2.91059E-03         1.04249E-03         8.25085E-05         1.82878E-01         2.84826E-01         1.82878E-01         1.63728E+04         5.31114E-01         8.58492E+03         2.41473E+04         1.75254E+04         6.62197E+03
+          2.91059E-03         1.21232E-03         7.04785E-05         1.82878E-01         2.95496E-01         1.82878E-01         1.59572E+04         5.31114E-01         8.41665E+03         2.36193E+04         1.71684E+04         6.45086E+03
+          2.91059E-03         1.38215E-03         5.66363E-05         1.82878E-01         3.06167E-01         1.82878E-01         1.55360E+04         5.31114E-01         8.24536E+03         2.30827E+04         1.68051E+04         6.27761E+03
+          2.91059E-03         1.55197E-03         4.09820E-05         1.82878E-01         3.16838E-01         1.82878E-01         1.51101E+04         5.31113E-01         8.07134E+03         2.25387E+04         1.64361E+04         6.10256E+03
+          2.91059E-03         1.72180E-03         2.35155E-05         1.82878E-01         3.27508E-01         1.82878E-01         1.46805E+04         5.31113E-01         7.89487E+03         2.19880E+04         1.60619E+04         5.92608E+03
+          2.91059E-03         1.89163E-03         4.23689E-06         1.82878E-01         3.38179E-01         1.82878E-01         1.42479E+04         5.31113E-01         7.71623E+03         2.14318E+04         1.56833E+04         5.74854E+03
+          2.91059E-03         2.06146E-03        -1.68539E-05         1.82878E-01         3.48849E-01         1.82878E-01         1.38132E+04         5.31113E-01         7.53572E+03         2.08710E+04         1.53007E+04         5.57027E+03
+          2.91059E-03         2.23128E-03        -3.97569E-05         1.82878E-01         3.59520E-01         1.82878E-01         1.33772E+04         5.31113E-01         7.35363E+03         2.03065E+04         1.49149E+04         5.39163E+03
+          2.91059E-03         2.40111E-03        -6.44720E-05         1.82877E-01         3.70190E-01         1.82877E-01         1.29407E+04         5.31112E-01         7.17023E+03         1.97393E+04         1.45263E+04         5.21296E+03
+          2.91059E-03         2.57094E-03        -9.09992E-05         1.82877E-01         3.80861E-01         1.82877E-01         1.25045E+04         5.31112E-01         6.98582E+03         1.91704E+04         1.41358E+04         5.03460E+03
+          2.91059E-03         2.74077E-03        -1.19339E-04         1.82877E-01         3.91532E-01         1.82877E-01         1.20695E+04         5.31112E-01         6.80066E+03         1.86006E+04         1.37437E+04         4.85688E+03
+          2.91059E-03         2.91059E-03        -1.49490E-04         1.82877E-01         4.02202E-01         1.82877E-01         1.16364E+04         5.31112E-01         6.61505E+03         1.80309E+04         1.33508E+04         4.68012E+03
+          2.91059E-03         3.08042E-03        -1.81454E-04         1.82877E-01         4.12873E-01         1.82877E-01         1.12059E+04         5.31111E-01         6.42925E+03         1.74622E+04         1.29576E+04         4.50463E+03
+          2.91059E-03         3.25025E-03        -2.15230E-04         1.82877E-01         4.23543E-01         1.82877E-01         1.07787E+04         5.31111E-01         6.24352E+03         1.68954E+04         1.25647E+04         4.33072E+03
+          2.91059E-03         3.42008E-03        -2.50818E-04         1.82877E-01         4.34214E-01         1.82877E-01         1.03556E+04         5.31111E-01         6.05814E+03         1.63312E+04         1.21726E+04         4.15868E+03
+          2.91059E-03         3.58990E-03        -2.88218E-04         1.82877E-01         4.44884E-01         1.82877E-01         9.93722E+03         5.31111E-01         5.87335E+03         1.57706E+04         1.17819E+04         3.98879E+03
+          2.91059E-03         3.75973E-03        -3.27431E-04         1.82877E-01         4.55555E-01         1.82877E-01         9.52422E+03         5.31111E-01         5.68940E+03         1.52144E+04         1.13931E+04         3.82132E+03
+          2.91059E-03         3.92956E-03        -3.68456E-04         1.82877E-01         4.66225E-01         1.82877E-01         9.11721E+03         5.31111E-01         5.50654E+03         1.46632E+04         1.10067E+04         3.65652E+03
+          2.91059E-03         4.09939E-03        -4.11292E-04         1.82876E-01         4.76896E-01         1.82877E-01         8.71678E+03         5.31110E-01         5.32500E+03         1.41179E+04         1.06233E+04         3.49464E+03
+          2.91059E-03         4.26921E-03        -4.55942E-04         1.82876E-01         4.87567E-01         1.82877E-01         8.32349E+03         5.31110E-01         5.14501E+03         1.35792E+04         1.02433E+04         3.33591E+03
+          2.91059E-03         4.43904E-03        -5.02403E-04         1.82876E-01         4.98237E-01         1.82877E-01         7.93786E+03         5.31110E-01         4.96678E+03         1.30478E+04         9.86721E+03         3.18055E+03
+          2.91059E-03         4.60887E-03        -5.50676E-04         1.82876E-01         5.08908E-01         1.82877E-01         7.56038E+03         5.31110E-01         4.79053E+03         1.25242E+04         9.49545E+03         3.02875E+03
+          2.91059E-03         4.77869E-03        -6.00762E-04         1.82876E-01         5.19578E-01         1.82877E-01         7.19151E+03         5.31110E-01         4.61644E+03         1.20092E+04         9.12846E+03         2.88071E+03
+          2.91059E-03         4.94852E-03        -6.52660E-04         1.82876E-01         5.30249E-01         1.82877E-01         6.83167E+03         5.31110E-01         4.44473E+03         1.15032E+04         8.76663E+03         2.73659E+03
+          2.91059E-03         5.11835E-03        -7.06370E-04         1.82876E-01         5.40919E-01         1.82877E-01         6.48124E+03         5.31111E-01         4.27556E+03         1.10069E+04         8.41038E+03         2.59656E+03
+          2.91059E-03         5.28818E-03        -7.61892E-04         1.82875E-01         5.51590E-01         1.82877E-01         6.14057E+03         5.31111E-01         4.10910E+03         1.05208E+04         8.06005E+03         2.46075E+03
+          2.91059E-03         5.45800E-03        -8.19227E-04         1.82875E-01         5.62261E-01         1.82877E-01         5.80999E+03         5.31111E-01         3.94552E+03         1.00453E+04         7.71599E+03         2.32929E+03
+          2.91059E-03         5.62783E-03        -8.78373E-04         1.82875E-01         5.72931E-01         1.82877E-01         5.48977E+03         5.31111E-01         3.78496E+03         9.58082E+03         7.37853E+03         2.20229E+03
+          2.91059E-03         5.79766E-03        -9.39332E-04         1.82875E-01         5.83602E-01         1.82877E-01         5.18015E+03         5.31112E-01         3.62757E+03         9.12782E+03         7.04796E+03         2.07985E+03
+          2.91059E-03         5.96749E-03        -1.00210E-03         1.82875E-01         5.94272E-01         1.82877E-01         4.88135E+03         5.31112E-01         3.47348E+03         8.68662E+03         6.72457E+03         1.96205E+03
+          2.91059E-03         6.13731E-03        -1.06669E-03         1.82875E-01         6.04943E-01         1.82878E-01         4.59353E+03         5.31113E-01         3.32279E+03         8.25757E+03         6.40861E+03         1.84895E+03
+          2.91059E-03         6.30714E-03        -1.13308E-03         1.82874E-01         6.15613E-01         1.82878E-01         4.31683E+03         5.31114E-01         3.17562E+03         7.84092E+03         6.10032E+03         1.74061E+03
+          2.91059E-03         6.47697E-03        -1.20129E-03         1.82874E-01         6.26284E-01         1.82878E-01         4.05136E+03         5.31115E-01         3.03207E+03         7.43694E+03         5.79989E+03         1.63705E+03
+          2.91059E-03         6.64680E-03        -1.27131E-03         1.82874E-01         6.36955E-01         1.82878E-01         3.79718E+03         5.31115E-01         2.89221E+03         7.04582E+03         5.50752E+03         1.53830E+03
+          2.91059E-03         6.81662E-03        -1.34314E-03         1.82874E-01         6.47625E-01         1.82879E-01         3.55433E+03         5.31117E-01         2.75613E+03         6.66775E+03         5.22338E+03         1.44437E+03
+          2.91059E-03         6.98645E-03        -1.41679E-03         1.82874E-01         6.58296E-01         1.82879E-01         3.32281E+03         5.31118E-01         2.62388E+03         6.30284E+03         4.94760E+03         1.35525E+03
+          2.91059E-03         7.15628E-03        -1.49225E-03         1.82873E-01         6.68966E-01         1.82879E-01         3.10260E+03         5.31119E-01         2.49553E+03         5.95121E+03         4.68030E+03         1.27092E+03
+          2.91059E-03         7.32611E-03        -1.56951E-03         1.82873E-01         6.79637E-01         1.82880E-01         2.89364E+03         5.31120E-01         2.37110E+03         5.61292E+03         4.42158E+03         1.19134E+03
+          2.91059E-03         7.49593E-03        -1.64860E-03         1.82873E-01         6.90307E-01         1.82880E-01         2.69584E+03         5.31122E-01         2.25063E+03         5.28800E+03         4.17153E+03         1.11648E+03
+          2.91059E-03         7.66576E-03        -1.72949E-03         1.82873E-01         7.00978E-01         1.82881E-01         2.50909E+03         5.31124E-01         2.13414E+03         4.97645E+03         3.93018E+03         1.04627E+03
+          2.91059E-03         7.83559E-03        -1.81220E-03         1.82872E-01         7.11649E-01         1.82881E-01         2.33324E+03         5.31126E-01         2.02165E+03         4.67823E+03         3.69759E+03         9.80645E+02
+          2.91059E-03         8.00542E-03        -1.89672E-03         1.82872E-01         7.22319E-01         1.82882E-01         2.16813E+03         5.31128E-01         1.91315E+03         4.39328E+03         3.47375E+03         9.19528E+02
+          2.91059E-03         8.17524E-03        -1.98305E-03         1.82872E-01         7.32990E-01         1.82883E-01         2.01357E+03         5.31130E-01         1.80864E+03         4.12151E+03         3.25868E+03         8.62829E+02
+          2.91059E-03         8.34507E-03        -2.07119E-03         1.82872E-01         7.43660E-01         1.82883E-01         1.86935E+03         5.31133E-01         1.70809E+03         3.86279E+03         3.05234E+03         8.10448E+02
+          2.91059E-03         8.51490E-03        -2.16114E-03         1.82871E-01         7.54331E-01         1.82884E-01         1.73522E+03         5.31135E-01         1.61147E+03         3.61697E+03         2.85469E+03         7.62278E+02
+          2.91059E-03         8.68473E-03        -2.25291E-03         1.82871E-01         7.65001E-01         1.82885E-01         1.61094E+03         5.31138E-01         1.51876E+03         3.38388E+03         2.66568E+03         7.18203E+02
+          2.91059E-03         8.85455E-03        -2.34649E-03         1.82871E-01         7.75672E-01         1.82886E-01         1.49623E+03         5.31141E-01         1.42991E+03         3.16332E+03         2.48522E+03         6.78099E+02
+          2.91059E-03         9.02438E-03        -2.44189E-03         1.82871E-01         7.86343E-01         1.82887E-01         1.39081E+03         5.31145E-01         1.34485E+03         2.95507E+03         2.31323E+03         6.41837E+02
+          2.91059E-03         9.19421E-03        -2.53909E-03         1.82870E-01         7.97013E-01         1.82888E-01         1.29437E+03         5.31148E-01         1.26354E+03         2.75888E+03         2.14960E+03         6.09280E+02
+          2.91059E-03         9.36403E-03        -2.63811E-03         1.82870E-01         8.07684E-01         1.82889E-01         1.20659E+03         5.31152E-01         1.18590E+03         2.57448E+03         1.99420E+03         5.80285E+02
+          2.91059E-03         9.53386E-03        -2.73894E-03         1.82870E-01         8.18354E-01         1.82890E-01         1.12715E+03         5.31156E-01         1.11185E+03         2.40161E+03         1.84690E+03         5.54707E+02
+          2.91059E-03         9.70369E-03        -2.84158E-03         1.82869E-01         8.29025E-01         1.82891E-01         1.05570E+03         5.31161E-01         1.04131E+03         2.23995E+03         1.70756E+03         5.32394E+02
+          2.91059E-03         9.87352E-03        -2.94603E-03         1.82869E-01         8.39695E-01         1.82893E-01         9.91902E+02         5.31165E-01         9.74195E+02         2.08920E+03         1.57601E+03         5.13191E+02
+          2.91059E-03         1.00433E-02        -3.05230E-03         1.82869E-01         8.50366E-01         1.82894E-01         9.35396E+02         5.31170E-01         9.10404E+02         1.94902E+03         1.45208E+03         4.96942E+02
+          2.91059E-03         1.02132E-02        -3.16038E-03         1.82868E-01         8.61037E-01         1.82896E-01         8.85823E+02         5.31176E-01         8.49838E+02         1.81907E+03         1.33559E+03         4.83488E+02
+          2.91059E-03         1.03830E-02        -3.27027E-03         1.82868E-01         8.71707E-01         1.82897E-01         8.42818E+02         5.31181E-01         7.92392E+02         1.69901E+03         1.22635E+03         4.72667E+02
+          2.91059E-03         1.05528E-02        -3.38198E-03         1.82868E-01         8.82378E-01         1.82899E-01         8.06015E+02         5.31187E-01         7.37954E+02         1.58848E+03         1.12416E+03         4.64317E+02
+          2.91059E-03         1.07227E-02        -3.49549E-03         1.82867E-01         8.93048E-01         1.82901E-01         7.75043E+02         5.31193E-01         6.86412E+02         1.48710E+03         1.02882E+03         4.58277E+02
+          2.91059E-03         1.08925E-02        -3.61082E-03         1.82867E-01         9.03719E-01         1.82903E-01         7.49536E+02         5.31200E-01         6.37650E+02         1.39449E+03         9.40109E+02         4.54386E+02
+          2.91059E-03         1.10623E-02        -3.72796E-03         1.82867E-01         9.14389E-01         1.82905E-01         7.29127E+02         5.31207E-01         5.91547E+02         1.31029E+03         8.57812E+02         4.52481E+02
+          2.91059E-03         1.12321E-02        -3.84692E-03         1.82866E-01         9.25060E-01         1.82907E-01         7.13450E+02         5.31214E-01         5.47984E+02         1.23411E+03         7.81705E+02         4.52404E+02
+          2.91059E-03         1.14020E-02        -3.96769E-03         1.82866E-01         9.35731E-01         1.82909E-01         7.02146E+02         5.31222E-01         5.06841E+02         1.16556E+03         7.11560E+02         4.53998E+02
+          2.91059E-03         1.15718E-02        -4.09026E-03         1.82866E-01         9.46401E-01         1.82911E-01         6.94860E+02         5.31230E-01         4.67996E+02         1.10425E+03         6.47144E+02         4.57107E+02
+          2.91059E-03         1.17416E-02        -4.21466E-03         1.82865E-01         9.57072E-01         1.82914E-01         6.91242E+02         5.31239E-01         4.31331E+02         1.04981E+03         5.88226E+02         4.61580E+02
+          2.91059E-03         1.19114E-02        -4.34086E-03         1.82865E-01         9.67742E-01         1.82917E-01         6.90951E+02         5.31247E-01         3.96728E+02         1.00184E+03         5.34568E+02         4.67267E+02
+          2.91059E-03         1.20813E-02        -4.46888E-03         1.82865E-01         9.78413E-01         1.82919E-01         6.93652E+02         5.31257E-01         3.64075E+02         9.59958E+02         4.85934E+02         4.74024E+02
+          2.91059E-03         1.22511E-02        -4.59871E-03         1.82864E-01         9.89083E-01         1.82922E-01         6.99021E+02         5.31267E-01         3.33262E+02         9.23797E+02         4.42087E+02         4.81710E+02
+          2.91059E-03         1.24209E-02        -4.73035E-03         1.82864E-01         9.99754E-01         1.82925E-01         7.06743E+02         5.31277E-01         3.04188E+02         8.92980E+02         4.02791E+02         4.90188E+02
+          2.91059E-03         1.25908E-02        -4.86380E-03         1.82863E-01         1.01042E+00         1.82928E-01         7.16513E+02         5.31288E-01         2.76757E+02         8.67138E+02         3.67811E+02         4.99327E+02
+          2.91059E-03         1.27606E-02        -4.99907E-03         1.82863E-01         1.02110E+00         1.82931E-01         7.28038E+02         5.31299E-01         2.50886E+02         8.45911E+02         3.36911E+02         5.09000E+02
+          2.91059E-03         1.29304E-02        -5.13615E-03         1.82863E-01         1.03177E+00         1.82935E-01         7.41036E+02         5.31311E-01         2.26504E+02         8.28948E+02         3.09861E+02         5.19086E+02
+          2.91059E-03         1.31002E-02        -5.27504E-03         1.82862E-01         1.04244E+00         1.82938E-01         7.55239E+02         5.31323E-01         2.03555E+02         8.15902E+02         2.86433E+02         5.29470E+02
+          2.91059E-03         1.32701E-02        -5.41575E-03         1.82862E-01         1.05311E+00         1.82942E-01         7.70390E+02         5.31336E-01         1.82005E+02         8.06440E+02         2.66400E+02         5.40041E+02
+          2.91059E-03         1.34399E-02        -5.55826E-03         1.82861E-01         1.06378E+00         1.82946E-01         7.86246E+02         5.31349E-01         1.61850E+02         8.00236E+02         2.49541E+02         5.50695E+02
+          2.91059E-03         1.36097E-02        -5.70259E-03         1.82861E-01         1.07445E+00         1.82950E-01         8.02576E+02         5.31363E-01         1.43124E+02         7.96974E+02         2.35640E+02         5.61334E+02
+          2.91059E-03         1.37795E-02        -5.84874E-03         1.82861E-01         1.08512E+00         1.82954E-01         8.19166E+02         5.31378E-01         1.25915E+02         7.96350E+02         2.24484E+02         5.71867E+02
+          2.91059E-03         1.39494E-02        -5.99669E-03         1.82860E-01         1.09579E+00         1.82958E-01         8.35813E+02         5.31393E-01         1.10387E+02         7.98073E+02         2.15866E+02         5.82207E+02
+          2.91059E-03         1.41192E-02        -6.14646E-03         1.82860E-01         1.10646E+00         1.82963E-01         8.52329E+02         5.31408E-01         9.68076E+01         8.01861E+02         2.09585E+02         5.92275E+02
+          2.91059E-03         1.42890E-02        -6.29804E-03         1.82859E-01         1.11713E+00         1.82968E-01         8.68539E+02         5.31425E-01         8.55692E+01         8.07444E+02         2.05446E+02         6.01999E+02
+          2.91059E-03         1.44589E-02        -6.45143E-03         1.82859E-01         1.12780E+00         1.82973E-01         8.84284E+02         5.31442E-01         7.71732E+01         8.14568E+02         2.03258E+02         6.11310E+02
+          2.91059E-03         1.46287E-02        -6.60664E-03         1.82858E-01         1.13847E+00         1.82978E-01         8.99418E+02         5.31459E-01         7.21193E+01         8.22988E+02         2.02841E+02         6.20148E+02
+          2.91059E-03         1.47985E-02        -6.76366E-03         1.82858E-01         1.14914E+00         1.82983E-01         9.13807E+02         5.31478E-01         7.06759E+01         8.32474E+02         2.04016E+02         6.28458E+02
+          2.91059E-03         1.49683E-02        -6.92249E-03         1.82857E-01         1.15981E+00         1.82988E-01         9.27334E+02         5.31497E-01         7.26655E+01         8.42808E+02         2.06616E+02         6.36192E+02
+          2.91059E-03         1.51382E-02        -7.08313E-03         1.82857E-01         1.17048E+00         1.82994E-01         9.39892E+02         5.31516E-01         7.74923E+01         8.53784E+02         2.10478E+02         6.43307E+02
+          2.91059E-03         1.53080E-02        -7.24559E-03         1.82857E-01         1.18115E+00         1.83000E-01         9.51390E+02         5.31537E-01         8.43921E+01         8.65212E+02         2.15447E+02         6.49765E+02
+          2.91059E-03         1.54778E-02        -7.40986E-03         1.82856E-01         1.19182E+00         1.83006E-01         9.61747E+02         5.31558E-01         9.26679E+01         8.76912E+02         2.21376E+02         6.55536E+02
+          2.91059E-03         1.56476E-02        -7.57594E-03         1.82856E-01         1.20249E+00         1.83012E-01         9.70897E+02         5.31580E-01         1.01784E+02         8.88718E+02         2.28124E+02         6.60594E+02
+          2.91059E-03         1.58175E-02        -7.74384E-03         1.82855E-01         1.21317E+00         1.83019E-01         9.78785E+02         5.31602E-01         1.11362E+02         9.00477E+02         2.35559E+02         6.64918E+02
+          2.91059E-03         1.59873E-02        -7.91355E-03         1.82855E-01         1.22384E+00         1.83026E-01         9.85366E+02         5.31626E-01         1.21142E+02         9.12048E+02         2.43555E+02         6.68493E+02
+          2.91059E-03         1.61571E-02        -8.08507E-03         1.82854E-01         1.23451E+00         1.83033E-01         9.90608E+02         5.31650E-01         1.30944E+02         9.23303E+02         2.51994E+02         6.71309E+02
+          2.91059E-03         1.63270E-02        -8.25840E-03         1.82854E-01         1.24518E+00         1.83040E-01         9.94489E+02         5.31675E-01         1.40644E+02         9.34125E+02         2.60766E+02         6.73359E+02
+          2.91059E-03         1.64968E-02        -8.43355E-03         1.82853E-01         1.25585E+00         1.83047E-01         9.96996E+02         5.31701E-01         1.50157E+02         9.44409E+02         2.69767E+02         6.74642E+02
+          2.91059E-03         1.66666E-02        -8.61051E-03         1.82853E-01         1.26652E+00         1.83055E-01         9.98128E+02         5.31728E-01         1.59417E+02         9.54063E+02         2.78901E+02         6.75162E+02
+          2.91059E-03         1.68364E-02        -8.78928E-03         1.82852E-01         1.27719E+00         1.83063E-01         9.97889E+02         5.31756E-01         1.68378E+02         9.63004E+02         2.88080E+02         6.74924E+02
+          2.91059E-03         1.70063E-02        -8.96987E-03         1.82852E-01         1.28786E+00         1.83071E-01         9.96296E+02         5.31784E-01         1.77006E+02         9.71161E+02         2.97220E+02         6.73941E+02
+          2.91059E-03         1.71761E-02        -9.15227E-03         1.82851E-01         1.29853E+00         1.83080E-01         9.93371E+02         5.31814E-01         1.85272E+02         9.78472E+02         3.06248E+02         6.72225E+02
+          2.91059E-03         1.73459E-02        -9.33648E-03         1.82850E-01         1.30920E+00         1.83089E-01         9.89143E+02         5.31844E-01         1.93157E+02         9.84887E+02         3.15094E+02         6.69793E+02
+          2.91059E-03         1.75158E-02        -9.52250E-03         1.82850E-01         1.31987E+00         1.83098E-01         9.83648E+02         5.31876E-01         2.00643E+02         9.90364E+02         3.23696E+02         6.66667E+02
+          2.91059E-03         1.76856E-02        -9.71034E-03         1.82849E-01         1.33054E+00         1.83107E-01         9.76930E+02         5.31908E-01         2.07720E+02         9.94869E+02         3.32000E+02         6.62869E+02
+          2.91059E-03         1.78554E-02        -9.89999E-03         1.82849E-01         1.34121E+00         1.83117E-01         9.69035E+02         5.31941E-01         2.14376E+02         9.98378E+02         3.39954E+02         6.58424E+02
+          2.91059E-03         1.80252E-02        -1.00915E-02         1.82848E-01         1.35188E+00         1.83127E-01         9.60015E+02         5.31976E-01         2.20605E+02         1.00088E+03         3.47516E+02         6.53360E+02
+          2.91059E-03         1.81951E-02        -1.02847E-02         1.82848E-01         1.36255E+00         1.83137E-01         9.49929E+02         5.32011E-01         2.26403E+02         1.00235E+03         3.54647E+02         6.47705E+02
+          2.91059E-03         1.83649E-02        -1.04798E-02         1.82847E-01         1.37322E+00         1.83147E-01         9.38836E+02         5.32048E-01         2.31767E+02         1.00281E+03         3.61315E+02         6.41492E+02
+          2.91059E-03         1.85347E-02        -1.06767E-02         1.82847E-01         1.38389E+00         1.83158E-01         9.26800E+02         5.32085E-01         2.36694E+02         1.00224E+03         3.67491E+02         6.34752E+02
+          2.91059E-03         1.87045E-02        -1.08754E-02         1.82846E-01         1.39457E+00         1.83169E-01         9.13888E+02         5.32124E-01         2.41187E+02         1.00067E+03         3.73155E+02         6.27519E+02
+          2.91059E-03         1.88744E-02        -1.10760E-02         1.82845E-01         1.40524E+00         1.83181E-01         9.00167E+02         5.32164E-01         2.45246E+02         9.98114E+02         3.78287E+02         6.19827E+02
+          2.91059E-03         1.90442E-02        -1.12783E-02         1.82845E-01         1.41591E+00         1.83192E-01         8.85707E+02         5.32205E-01         2.48874E+02         9.94586E+02         3.82874E+02         6.11712E+02
+          2.91059E-03         1.92140E-02        -1.14825E-02         1.82844E-01         1.42658E+00         1.83204E-01         8.70580E+02         5.32247E-01         2.52077E+02         9.90116E+02         3.86907E+02         6.03210E+02
+          2.91059E-03         1.93839E-02        -1.16884E-02         1.82844E-01         1.43725E+00         1.83217E-01         8.54857E+02         5.32290E-01         2.54859E+02         9.84736E+02         3.90380E+02         5.94356E+02
+          2.91059E-03         1.95537E-02        -1.18962E-02         1.82843E-01         1.44792E+00         1.83230E-01         8.38610E+02         5.32335E-01         2.57227E+02         9.78478E+02         3.93292E+02         5.85187E+02
+          2.91059E-03         1.97235E-02        -1.21058E-02         1.82842E-01         1.45859E+00         1.83243E-01         8.21910E+02         5.32380E-01         2.59190E+02         9.71382E+02         3.95643E+02         5.75738E+02
+          2.91059E-03         1.98933E-02        -1.23172E-02         1.82842E-01         1.46926E+00         1.83256E-01         8.04829E+02         5.32427E-01         2.60754E+02         9.63486E+02         3.97440E+02         5.66046E+02
+          2.91059E-03         2.00632E-02        -1.25304E-02         1.82841E-01         1.47993E+00         1.83270E-01         7.87436E+02         5.32476E-01         2.61931E+02         9.54835E+02         3.98689E+02         5.56146E+02
+          2.91059E-03         2.02330E-02        -1.27455E-02         1.82841E-01         1.49060E+00         1.83284E-01         7.69799E+02         5.32525E-01         2.62729E+02         9.45472E+02         3.99400E+02         5.46072E+02
+          2.91059E-03         2.04028E-02        -1.29623E-02         1.82840E-01         1.50127E+00         1.83299E-01         7.51987E+02         5.32576E-01         2.63160E+02         9.35446E+02         3.99587E+02         5.35859E+02
+          2.91059E-03         2.05726E-02        -1.31810E-02         1.82839E-01         1.51194E+00         1.83314E-01         7.34063E+02         5.32628E-01         2.63234E+02         9.24803E+02         3.99263E+02         5.25540E+02
+          2.91059E-03         2.07425E-02        -1.34015E-02         1.82839E-01         1.52261E+00         1.83329E-01         7.16090E+02         5.32682E-01         2.62965E+02         9.13592E+02         3.98446E+02         5.15146E+02
+          2.91059E-03         2.09123E-02        -1.36237E-02         1.82838E-01         1.53328E+00         1.83345E-01         6.98130E+02         5.32737E-01         2.62364E+02         9.01862E+02         3.97153E+02         5.04709E+02
+          2.91059E-03         2.10821E-02        -1.38478E-02         1.82837E-01         1.54395E+00         1.83361E-01         6.80239E+02         5.32793E-01         2.61443E+02         8.89664E+02         3.95406E+02         4.94259E+02
+          2.91059E-03         2.12520E-02        -1.40738E-02         1.82837E-01         1.55462E+00         1.83378E-01         6.62472E+02         5.32851E-01         2.60217E+02         8.77047E+02         3.93223E+02         4.83824E+02
+          2.91059E-03         2.14218E-02        -1.43015E-02         1.82836E-01         1.56529E+00         1.83394E-01         6.44882E+02         5.32910E-01         2.58699E+02         8.64060E+02         3.90629E+02         4.73432E+02
+          2.91059E-03         2.15916E-02        -1.45310E-02         1.82835E-01         1.57596E+00         1.83412E-01         6.27517E+02         5.32971E-01         2.56901E+02         8.50753E+02         3.87645E+02         4.63108E+02
+          2.91059E-03         2.17614E-02        -1.47624E-02         1.82835E-01         1.58664E+00         1.83430E-01         6.10423E+02         5.33033E-01         2.54839E+02         8.37172E+02         3.84296E+02         4.52876E+02
+          2.91059E-03         2.19313E-02        -1.49955E-02         1.82834E-01         1.59731E+00         1.83448E-01         5.93641E+02         5.33097E-01         2.52525E+02         8.23366E+02         3.80605E+02         4.42761E+02
+          2.91059E-03         2.21011E-02        -1.52305E-02         1.82833E-01         1.60798E+00         1.83467E-01         5.77211E+02         5.33163E-01         2.49973E+02         8.09379E+02         3.76597E+02         4.32781E+02
+          2.91059E-03         2.22709E-02        -1.54673E-02         1.82833E-01         1.61865E+00         1.83486E-01         5.61167E+02         5.33230E-01         2.47198E+02         7.95257E+02         3.72298E+02         4.22959E+02
+          2.91059E-03         2.24407E-02        -1.57059E-02         1.82832E-01         1.62932E+00         1.83505E-01         5.45543E+02         5.33298E-01         2.44214E+02         7.81042E+02         3.67731E+02         4.13311E+02
+          2.91059E-03         2.26106E-02        -1.59463E-02         1.82831E-01         1.63999E+00         1.83525E-01         5.30366E+02         5.33369E-01         2.41033E+02         7.66775E+02         3.62921E+02         4.03854E+02
+          2.91059E-03         2.27804E-02        -1.61886E-02         1.82831E-01         1.65066E+00         1.83546E-01         5.15662E+02         5.33441E-01         2.37669E+02         7.52496E+02         3.57893E+02         3.94603E+02
+          2.91059E-03         2.29502E-02        -1.64326E-02         1.82830E-01         1.66133E+00         1.83567E-01         5.01452E+02         5.33514E-01         2.34136E+02         7.38243E+02         3.52671E+02         3.85571E+02
+          2.91059E-03         2.31201E-02        -1.66785E-02         1.82829E-01         1.67200E+00         1.83588E-01         4.87756E+02         5.33590E-01         2.30446E+02         7.24050E+02         3.47279E+02         3.76771E+02
+          2.91059E-03         2.32899E-02        -1.69262E-02         1.82828E-01         1.68267E+00         1.83610E-01         4.74587E+02         5.33667E-01         2.26614E+02         7.09953E+02         3.41740E+02         3.68212E+02
+          2.91059E-03         2.34597E-02        -1.71757E-02         1.82828E-01         1.69334E+00         1.83633E-01         4.61958E+02         5.33746E-01         2.22650E+02         6.95981E+02         3.36077E+02         3.59904E+02
+          2.91059E-03         2.36295E-02        -1.74270E-02         1.82827E-01         1.70401E+00         1.83656E-01         4.49878E+02         5.33827E-01         2.18568E+02         6.82164E+02         3.30311E+02         3.51852E+02
+          2.91059E-03         2.37994E-02        -1.76801E-02         1.82826E-01         1.71468E+00         1.83679E-01         4.38354E+02         5.33909E-01         2.14380E+02         6.68529E+02         3.24464E+02         3.44065E+02
+          2.91059E-03         2.39692E-02        -1.79350E-02         1.82825E-01         1.72535E+00         1.83703E-01         4.27388E+02         5.33994E-01         2.10097E+02         6.55101E+02         3.18556E+02         3.36545E+02
+          2.91059E-03         2.41390E-02        -1.81918E-02         1.82825E-01         1.73602E+00         1.83728E-01         4.16980E+02         5.34080E-01         2.05731E+02         6.41903E+02         3.12606E+02         3.29296E+02
+          2.91059E-03         2.43088E-02        -1.84503E-02         1.82824E-01         1.74669E+00         1.83753E-01         4.07130E+02         5.34168E-01         2.01292E+02         6.28955E+02         3.06634E+02         3.22321E+02
+          2.91059E-03         2.44787E-02        -1.87107E-02         1.82823E-01         1.75736E+00         1.83778E-01         3.97832E+02         5.34258E-01         1.96791E+02         6.16275E+02         3.00656E+02         3.15619E+02
+          2.91059E-03         2.46485E-02        -1.89729E-02         1.82822E-01         1.76804E+00         1.83804E-01         3.89079E+02         5.34351E-01         1.92239E+02         6.03881E+02         2.94690E+02         3.09191E+02
+          2.91059E-03         2.48183E-02        -1.92369E-02         1.82822E-01         1.77871E+00         1.83831E-01         3.80864E+02         5.34445E-01         1.87645E+02         5.91785E+02         2.88751E+02         3.03035E+02
+          2.91059E-03         2.49882E-02        -1.95027E-02         1.82821E-01         1.78938E+00         1.83858E-01         3.73174E+02         5.34541E-01         1.83019E+02         5.80001E+02         2.82853E+02         2.97148E+02
+          2.91059E-03         2.51580E-02        -1.97703E-02         1.82820E-01         1.80005E+00         1.83886E-01         3.65998E+02         5.34639E-01         1.78370E+02         5.68538E+02         2.77011E+02         2.91527E+02
+          2.91059E-03         2.53278E-02        -2.00398E-02         1.82819E-01         1.81072E+00         1.83914E-01         3.59320E+02         5.34740E-01         1.73707E+02         5.57405E+02         2.71236E+02         2.86168E+02
+          2.91059E-03         2.54976E-02        -2.03110E-02         1.82819E-01         1.82139E+00         1.83943E-01         3.53127E+02         5.34842E-01         1.69038E+02         5.46608E+02         2.65542E+02         2.81066E+02
+          2.91059E-03         2.56675E-02        -2.05841E-02         1.82818E-01         1.83206E+00         1.83973E-01         3.47400E+02         5.34947E-01         1.64373E+02         5.36152E+02         2.59937E+02         2.76215E+02
+          2.91059E-03         2.58373E-02        -2.08590E-02         1.82817E-01         1.84273E+00         1.84003E-01         3.42121E+02         5.35054E-01         1.59717E+02         5.26040E+02         2.54431E+02         2.71609E+02
+          2.91059E-03         2.60071E-02        -2.11357E-02         1.82816E-01         1.85340E+00         1.84034E-01         3.37271E+02         5.35163E-01         1.55080E+02         5.16274E+02         2.49034E+02         2.67239E+02
+          2.91059E-03         2.61769E-02        -2.14142E-02         1.82815E-01         1.86407E+00         1.84065E-01         3.32830E+02         5.35275E-01         1.50468E+02         5.06853E+02         2.43753E+02         2.63100E+02
+          3.08042E-03         8.72665E-04         6.07625E-05         1.93548E-01         2.74155E-01         1.93548E-01         1.79896E+04         5.72379E-01         7.75705E+03         2.36213E+04         1.72389E+04         6.38245E+03
+          3.08042E-03         1.04249E-03         5.05446E-05         1.93548E-01         2.84826E-01         1.93548E-01         1.75582E+04         5.72379E-01         7.61190E+03         2.31276E+04         1.69024E+04         6.22519E+03
+          3.08042E-03         1.21232E-03         3.85146E-05         1.93548E-01         2.95496E-01         1.93548E-01         1.71199E+04         5.72378E-01         7.46384E+03         2.26248E+04         1.65592E+04         6.06558E+03
+          3.08042E-03         1.38215E-03         2.46724E-05         1.93548E-01         3.06167E-01         1.93548E-01         1.66755E+04         5.72378E-01         7.31310E+03         2.21138E+04         1.62098E+04         5.90393E+03
+          3.08042E-03         1.55197E-03         9.01812E-06         1.93548E-01         3.16838E-01         1.93548E-01         1.62260E+04         5.72378E-01         7.15994E+03         2.15955E+04         1.58549E+04         5.74060E+03
+          3.08042E-03         1.72180E-03        -8.44835E-06         1.93548E-01         3.27508E-01         1.93548E-01         1.57723E+04         5.72378E-01         7.00462E+03         2.10710E+04         1.54951E+04         5.57591E+03
+          3.08042E-03         1.89163E-03        -2.77270E-05         1.93548E-01         3.38179E-01         1.93548E-01         1.53151E+04         5.72378E-01         6.84738E+03         2.05411E+04         1.51309E+04         5.41018E+03
+          3.08042E-03         2.06146E-03        -4.88177E-05         1.93548E-01         3.48849E-01         1.93548E-01         1.48555E+04         5.72377E-01         6.68848E+03         2.00067E+04         1.47629E+04         5.24376E+03
+          3.08042E-03         2.23128E-03        -7.17207E-05         1.93548E-01         3.59520E-01         1.93548E-01         1.43942E+04         5.72377E-01         6.52816E+03         1.94688E+04         1.43918E+04         5.07697E+03
+          3.08042E-03         2.40111E-03        -9.64358E-05         1.93548E-01         3.70190E-01         1.93548E-01         1.39321E+04         5.72377E-01         6.36669E+03         1.89282E+04         1.40180E+04         4.91011E+03
+          3.08042E-03         2.57094E-03        -1.22963E-04         1.93548E-01         3.80861E-01         1.93548E-01         1.34701E+04         5.72377E-01         6.20431E+03         1.83858E+04         1.36423E+04         4.74352E+03
+          3.08042E-03         2.74077E-03        -1.51302E-04         1.93548E-01         3.91532E-01         1.93548E-01         1.30089E+04         5.72376E-01         6.04126E+03         1.78426E+04         1.32651E+04         4.57749E+03
+          3.08042E-03         2.91059E-03        -1.81454E-04         1.93548E-01         4.02202E-01         1.93548E-01         1.25494E+04         5.72376E-01         5.87778E+03         1.72994E+04         1.28870E+04         4.41232E+03
+          3.08042E-03         3.08042E-03        -2.13418E-04         1.93548E-01         4.12873E-01         1.93548E-01         1.20923E+04         5.72376E-01         5.71413E+03         1.67570E+04         1.25087E+04         4.24831E+03
+          3.08042E-03         3.25025E-03        -2.47194E-04         1.93548E-01         4.23543E-01         1.93548E-01         1.16384E+04         5.72375E-01         5.55052E+03         1.62163E+04         1.21305E+04         4.08574E+03
+          3.08042E-03         3.42008E-03        -2.82782E-04         1.93547E-01         4.34214E-01         1.93548E-01         1.11885E+04         5.72375E-01         5.38719E+03         1.56781E+04         1.17532E+04         3.92488E+03
+          3.08042E-03         3.58990E-03        -3.20182E-04         1.93547E-01         4.44884E-01         1.93548E-01         1.07433E+04         5.72375E-01         5.22437E+03         1.51431E+04         1.13771E+04         3.76599E+03
+          3.08042E-03         3.75973E-03        -3.59395E-04         1.93547E-01         4.55555E-01         1.93548E-01         1.03033E+04         5.72375E-01         5.06227E+03         1.46122E+04         1.10029E+04         3.60932E+03
+          3.08042E-03         3.92956E-03        -4.00419E-04         1.93547E-01         4.66225E-01         1.93547E-01         9.86938E+03         5.72374E-01         4.90111E+03         1.40861E+04         1.06310E+04         3.45512E+03
+          3.08042E-03         4.09939E-03        -4.43256E-04         1.93547E-01         4.76896E-01         1.93547E-01         9.44204E+03         5.72374E-01         4.74109E+03         1.35654E+04         1.02618E+04         3.30360E+03
+          3.08042E-03         4.26921E-03        -4.87905E-04         1.93547E-01         4.87567E-01         1.93547E-01         9.02192E+03         5.72374E-01         4.58241E+03         1.30509E+04         9.89595E+03         3.15500E+03
+          3.08042E-03         4.43904E-03        -5.34366E-04         1.93547E-01         4.98237E-01         1.93547E-01         8.60955E+03         5.72374E-01         4.42526E+03         1.25433E+04         9.53378E+03         3.00950E+03
+          3.08042E-03         4.60887E-03        -5.82640E-04         1.93546E-01         5.08908E-01         1.93547E-01         8.20547E+03         5.72374E-01         4.26983E+03         1.20430E+04         9.17575E+03         2.86730E+03
+          3.08042E-03         4.77869E-03        -6.32725E-04         1.93546E-01         5.19578E-01         1.93547E-01         7.81017E+03         5.72374E-01         4.11629E+03         1.15508E+04         8.82227E+03         2.72857E+03
+          3.08042E-03         4.94852E-03        -6.84623E-04         1.93546E-01         5.30249E-01         1.93547E-01         7.42410E+03         5.72374E-01         3.96482E+03         1.10672E+04         8.47374E+03         2.59348E+03
+          3.08042E-03         5.11835E-03        -7.38333E-04         1.93546E-01         5.40919E-01         1.93547E-01         7.04768E+03         5.72374E-01         3.81556E+03         1.05927E+04         8.13052E+03         2.46217E+03
+          3.08042E-03         5.28818E-03        -7.93856E-04         1.93546E-01         5.51590E-01         1.93547E-01         6.68130E+03         5.72374E-01         3.66867E+03         1.01278E+04         7.79298E+03         2.33478E+03
+          3.08042E-03         5.45800E-03        -8.51190E-04         1.93546E-01         5.62261E-01         1.93548E-01         6.32530E+03         5.72375E-01         3.52429E+03         9.67286E+03         7.46144E+03         2.21142E+03
+          3.08042E-03         5.62783E-03        -9.10337E-04         1.93545E-01         5.72931E-01         1.93548E-01         5.97999E+03         5.72375E-01         3.38256E+03         9.22842E+03         7.13621E+03         2.09220E+03
+          3.08042E-03         5.79766E-03        -9.71296E-04         1.93545E-01         5.83602E-01         1.93548E-01         5.64565E+03         5.72376E-01         3.24359E+03         8.79481E+03         6.81759E+03         1.97722E+03
+          3.08042E-03         5.96749E-03        -1.03407E-03         1.93545E-01         5.94272E-01         1.93548E-01         5.32251E+03         5.72376E-01         3.10750E+03         8.37238E+03         6.50585E+03         1.86654E+03
+          3.08042E-03         6.13731E-03        -1.09865E-03         1.93545E-01         6.04943E-01         1.93548E-01         5.01077E+03         5.72377E-01         2.97439E+03         7.96145E+03         6.20122E+03         1.76023E+03
+          3.08042E-03         6.30714E-03        -1.16505E-03         1.93545E-01         6.15613E-01         1.93548E-01         4.71060E+03         5.72378E-01         2.84436E+03         7.56227E+03         5.90394E+03         1.65834E+03
+          3.08042E-03         6.47697E-03        -1.23325E-03         1.93544E-01         6.26284E-01         1.93548E-01         4.42212E+03         5.72379E-01         2.71749E+03         7.17510E+03         5.61420E+03         1.56090E+03
+          3.08042E-03         6.64680E-03        -1.30327E-03         1.93544E-01         6.36955E-01         1.93549E-01         4.14543E+03         5.72380E-01         2.59386E+03         6.80014E+03         5.33219E+03         1.46794E+03
+          3.08042E-03         6.81662E-03        -1.37511E-03         1.93544E-01         6.47625E-01         1.93549E-01         3.88059E+03         5.72381E-01         2.47352E+03         6.43754E+03         5.05807E+03         1.37947E+03
+          3.08042E-03         6.98645E-03        -1.44875E-03         1.93544E-01         6.58296E-01         1.93549E-01         3.62761E+03         5.72382E-01         2.35655E+03         6.08746E+03         4.79198E+03         1.29548E+03
+          3.08042E-03         7.15628E-03        -1.52421E-03         1.93544E-01         6.68966E-01         1.93550E-01         3.38651E+03         5.72384E-01         2.24298E+03         5.74997E+03         4.53403E+03         1.21595E+03
+          3.08042E-03         7.32611E-03        -1.60148E-03         1.93543E-01         6.79637E-01         1.93550E-01         3.15722E+03         5.72385E-01         2.13286E+03         5.42516E+03         4.28431E+03         1.14085E+03
+          3.08042E-03         7.49593E-03        -1.68056E-03         1.93543E-01         6.90307E-01         1.93550E-01         2.93970E+03         5.72387E-01         2.02620E+03         5.11306E+03         4.04291E+03         1.07015E+03
+          3.08042E-03         7.66576E-03        -1.76145E-03         1.93543E-01         7.00978E-01         1.93551E-01         2.73383E+03         5.72389E-01         1.92303E+03         4.81368E+03         3.80988E+03         1.00380E+03
+          3.08042E-03         7.83559E-03        -1.84416E-03         1.93543E-01         7.11649E-01         1.93551E-01         2.53949E+03         5.72391E-01         1.82337E+03         4.52697E+03         3.58525E+03         9.41723E+02
+          3.08042E-03         8.00542E-03        -1.92868E-03         1.93542E-01         7.22319E-01         1.93552E-01         2.35652E+03         5.72394E-01         1.72719E+03         4.25290E+03         3.36904E+03         8.83860E+02
+          3.08042E-03         8.17524E-03        -2.01501E-03         1.93542E-01         7.32990E-01         1.93553E-01         2.18475E+03         5.72396E-01         1.63452E+03         3.99137E+03         3.16124E+03         8.30126E+02
+          3.08042E-03         8.34507E-03        -2.10315E-03         1.93542E-01         7.43660E-01         1.93553E-01         2.02397E+03         5.72399E-01         1.54531E+03         3.74227E+03         2.96184E+03         7.80431E+02
+          3.08042E-03         8.51490E-03        -2.19311E-03         1.93542E-01         7.54331E-01         1.93554E-01         1.87396E+03         5.72402E-01         1.45956E+03         3.50548E+03         2.77080E+03         7.34676E+02
+          3.08042E-03         8.68473E-03        -2.28488E-03         1.93541E-01         7.65001E-01         1.93555E-01         1.73447E+03         5.72405E-01         1.37723E+03         3.28082E+03         2.58806E+03         6.92756E+02
+          3.08042E-03         8.85455E-03        -2.37846E-03         1.93541E-01         7.75672E-01         1.93556E-01         1.60522E+03         5.72409E-01         1.29828E+03         3.06810E+03         2.41355E+03         6.54557E+02
+          3.08042E-03         9.02438E-03        -2.47385E-03         1.93541E-01         7.86343E-01         1.93556E-01         1.48594E+03         5.72413E-01         1.22266E+03         2.86714E+03         2.24718E+03         6.19958E+02
+          3.08042E-03         9.19421E-03        -2.57105E-03         1.93540E-01         7.97013E-01         1.93557E-01         1.37632E+03         5.72417E-01         1.15033E+03         2.67769E+03         2.08885E+03         5.88836E+02
+          3.08042E-03         9.36403E-03        -2.67007E-03         1.93540E-01         8.07684E-01         1.93558E-01         1.27605E+03         5.72421E-01         1.08121E+03         2.49951E+03         1.93846E+03         5.61058E+02
+          3.08042E-03         9.53386E-03        -2.77090E-03         1.93540E-01         8.18354E-01         1.93560E-01         1.18479E+03         5.72426E-01         1.01524E+03         2.33234E+03         1.79585E+03         5.36489E+02
+          3.08042E-03         9.70369E-03        -2.87354E-03         1.93539E-01         8.29025E-01         1.93561E-01         1.10221E+03         5.72431E-01         9.52360E+02         2.17590E+03         1.66091E+03         5.14990E+02
+          3.08042E-03         9.87352E-03        -2.97800E-03         1.93539E-01         8.39695E-01         1.93562E-01         1.02795E+03         5.72436E-01         8.92478E+02         2.02989E+03         1.53347E+03         4.96418E+02
+          3.08042E-03         1.00433E-02        -3.08426E-03         1.93539E-01         8.50366E-01         1.93563E-01         9.61642E+02         5.72442E-01         8.35515E+02         1.89400E+03         1.41337E+03         4.80628E+02
+          3.08042E-03         1.02132E-02        -3.19234E-03         1.93538E-01         8.61037E-01         1.93565E-01         9.02931E+02         5.72448E-01         7.81384E+02         1.76792E+03         1.30045E+03         4.67471E+02
+          3.08042E-03         1.03830E-02        -3.30223E-03         1.93538E-01         8.71707E-01         1.93566E-01         8.51440E+02         5.72454E-01         7.29993E+02         1.65131E+03         1.19451E+03         4.56799E+02
+          3.08042E-03         1.05528E-02        -3.41394E-03         1.93538E-01         8.82378E-01         1.93568E-01         8.06791E+02         5.72461E-01         6.81246E+02         1.54383E+03         1.09537E+03         4.48461E+02
+          3.08042E-03         1.07227E-02        -3.52746E-03         1.93537E-01         8.93048E-01         1.93570E-01         7.68604E+02         5.72468E-01         6.35046E+02         1.44514E+03         1.00283E+03         4.42308E+02
+          3.08042E-03         1.08925E-02        -3.64278E-03         1.93537E-01         9.03719E-01         1.93571E-01         7.36499E+02         5.72476E-01         5.91292E+02         1.35487E+03         9.16686E+02         4.38188E+02
+          3.08042E-03         1.10623E-02        -3.75993E-03         1.93537E-01         9.14389E-01         1.93573E-01         7.10094E+02         5.72484E-01         5.49882E+02         1.27268E+03         8.36731E+02         4.35953E+02
+          3.08042E-03         1.12321E-02        -3.87888E-03         1.93536E-01         9.25060E-01         1.93575E-01         6.89012E+02         5.72492E-01         5.10713E+02         1.19820E+03         7.62750E+02         4.35454E+02
+          3.08042E-03         1.14020E-02        -3.99965E-03         1.93536E-01         9.35731E-01         1.93577E-01         6.72876E+02         5.72501E-01         4.73681E+02         1.13107E+03         6.94525E+02         4.36543E+02
+          3.08042E-03         1.15718E-02        -4.12223E-03         1.93536E-01         9.46401E-01         1.93579E-01         6.61314E+02         5.72511E-01         4.38686E+02         1.07091E+03         6.31834E+02         4.39077E+02
+          3.08042E-03         1.17416E-02        -4.24662E-03         1.93535E-01         9.57072E-01         1.93582E-01         6.53959E+02         5.72520E-01         4.05625E+02         1.01737E+03         5.74452E+02         4.42914E+02
+          3.08042E-03         1.19114E-02        -4.37282E-03         1.93535E-01         9.67742E-01         1.93584E-01         6.50451E+02         5.72531E-01         3.74400E+02         9.70069E+02         5.22155E+02         4.47914E+02
+          3.08042E-03         1.20813E-02        -4.50084E-03         1.93534E-01         9.78413E-01         1.93587E-01         6.50436E+02         5.72542E-01         3.44918E+02         9.28657E+02         4.74715E+02         4.53942E+02
+          3.08042E-03         1.22511E-02        -4.63067E-03         1.93534E-01         9.89083E-01         1.93589E-01         6.53571E+02         5.72553E-01         3.17089E+02         8.92771E+02         4.31905E+02         4.60866E+02
+          3.08042E-03         1.24209E-02        -4.76231E-03         1.93534E-01         9.99754E-01         1.93592E-01         6.59520E+02         5.72565E-01         2.90830E+02         8.62057E+02         3.93497E+02         4.68559E+02
+          3.08042E-03         1.25908E-02        -4.89576E-03         1.93533E-01         1.01042E+00         1.93595E-01         6.67956E+02         5.72577E-01         2.66066E+02         8.36163E+02         3.59267E+02         4.76897E+02
+          3.08042E-03         1.27606E-02        -5.03103E-03         1.93533E-01         1.02110E+00         1.93598E-01         6.78566E+02         5.72590E-01         2.42732E+02         8.14748E+02         3.28988E+02         4.85760E+02
+          3.08042E-03         1.29304E-02        -5.16811E-03         1.93532E-01         1.03177E+00         1.93601E-01         6.91045E+02         5.72604E-01         2.20775E+02         7.97475E+02         3.02439E+02         4.95036E+02
+          3.08042E-03         1.31002E-02        -5.30700E-03         1.93532E-01         1.04244E+00         1.93605E-01         7.05104E+02         5.72618E-01         2.00159E+02         7.84015E+02         2.79400E+02         5.04615E+02
+          3.08042E-03         1.32701E-02        -5.44771E-03         1.93532E-01         1.05311E+00         1.93608E-01         7.20462E+02         5.72633E-01         1.80865E+02         7.74047E+02         2.59654E+02         5.14394E+02
+          3.08042E-03         1.34399E-02        -5.59022E-03         1.93531E-01         1.06378E+00         1.93612E-01         7.36855E+02         5.72648E-01         1.62902E+02         7.67262E+02         2.42988E+02         5.24274E+02
+          3.08042E-03         1.36097E-02        -5.73455E-03         1.93531E-01         1.07445E+00         1.93616E-01         7.54030E+02         5.72664E-01         1.46310E+02         7.63357E+02         2.29193E+02         5.34164E+02
+          3.08042E-03         1.37795E-02        -5.88070E-03         1.93530E-01         1.08512E+00         1.93619E-01         7.71748E+02         5.72681E-01         1.31170E+02         7.62041E+02         2.18066E+02         5.43975E+02
+          3.08042E-03         1.39494E-02        -6.02865E-03         1.93530E-01         1.09579E+00         1.93624E-01         7.89785E+02         5.72698E-01         1.17612E+02         7.63034E+02         2.09407E+02         5.53627E+02
+          3.08042E-03         1.41192E-02        -6.17842E-03         1.93529E-01         1.10646E+00         1.93628E-01         8.07930E+02         5.72717E-01         1.05829E+02         7.66066E+02         2.03022E+02         5.63044E+02
+          3.08042E-03         1.42890E-02        -6.33000E-03         1.93529E-01         1.11713E+00         1.93632E-01         8.25988E+02         5.72735E-01         9.60687E+01         7.70879E+02         1.98722E+02         5.72157E+02
+          3.08042E-03         1.44589E-02        -6.48339E-03         1.93528E-01         1.12780E+00         1.93637E-01         8.43776E+02         5.72755E-01         8.86110E+01         7.77227E+02         1.96325E+02         5.80902E+02
+          3.08042E-03         1.46287E-02        -6.63860E-03         1.93528E-01         1.13847E+00         1.93642E-01         8.61126E+02         5.72775E-01         8.37073E+01         7.84875E+02         1.95656E+02         5.89220E+02
+          3.08042E-03         1.47985E-02        -6.79562E-03         1.93527E-01         1.14914E+00         1.93647E-01         8.77885E+02         5.72796E-01         8.14835E+01         7.93602E+02         1.96543E+02         5.97059E+02
+          3.08042E-03         1.49683E-02        -6.95445E-03         1.93527E-01         1.15981E+00         1.93652E-01         8.93914E+02         5.72818E-01         8.18569E+01         8.03196E+02         1.98823E+02         6.04372E+02
+          3.08042E-03         1.51382E-02        -7.11509E-03         1.93526E-01         1.17048E+00         1.93657E-01         9.09086E+02         5.72841E-01         8.45287E+01         8.13460E+02         2.02341E+02         6.11118E+02
+          3.08042E-03         1.53080E-02        -7.27755E-03         1.93526E-01         1.18115E+00         1.93663E-01         9.23291E+02         5.72865E-01         8.90622E+01         8.24208E+02         2.06946E+02         6.17261E+02
+          3.08042E-03         1.54778E-02        -7.44182E-03         1.93525E-01         1.19182E+00         1.93668E-01         9.36430E+02         5.72889E-01         9.49916E+01         8.35267E+02         2.12496E+02         6.22771E+02
+          3.08042E-03         1.56476E-02        -7.60790E-03         1.93525E-01         1.20249E+00         1.93674E-01         9.48417E+02         5.72915E-01         1.01900E+02         8.46476E+02         2.18855E+02         6.27621E+02
+          3.08042E-03         1.58175E-02        -7.77580E-03         1.93524E-01         1.21317E+00         1.93680E-01         9.59179E+02         5.72941E-01         1.09449E+02         8.57686E+02         2.25894E+02         6.31792E+02
+          3.08042E-03         1.59873E-02        -7.94551E-03         1.93524E-01         1.22384E+00         1.93687E-01         9.68656E+02         5.72968E-01         1.17381E+02         8.68760E+02         2.33493E+02         6.35267E+02
+          3.08042E-03         1.61571E-02        -8.11703E-03         1.93523E-01         1.23451E+00         1.93693E-01         9.76800E+02         5.72996E-01         1.25503E+02         8.79572E+02         2.41536E+02         6.38036E+02
+          3.08042E-03         1.63270E-02        -8.29036E-03         1.93523E-01         1.24518E+00         1.93700E-01         9.83572E+02         5.73025E-01         1.33673E+02         8.90008E+02         2.49916E+02         6.40092E+02
+          3.08042E-03         1.64968E-02        -8.46551E-03         1.93522E-01         1.25585E+00         1.93707E-01         9.88946E+02         5.73055E-01         1.41785E+02         8.99965E+02         2.58533E+02         6.41432E+02
+          3.08042E-03         1.66666E-02        -8.64247E-03         1.93522E-01         1.26652E+00         1.93715E-01         9.92906E+02         5.73086E-01         1.49760E+02         9.09353E+02         2.67294E+02         6.42058E+02
+          3.08042E-03         1.68364E-02        -8.82124E-03         1.93521E-01         1.27719E+00         1.93722E-01         9.95447E+02         5.73118E-01         1.57539E+02         9.18088E+02         2.76113E+02         6.41975E+02
+          3.08042E-03         1.70063E-02        -9.00183E-03         1.93521E-01         1.28786E+00         1.93730E-01         9.96570E+02         5.73151E-01         1.65075E+02         9.26100E+02         2.84908E+02         6.41192E+02
+          3.08042E-03         1.71761E-02        -9.18422E-03         1.93520E-01         1.29853E+00         1.93738E-01         9.96287E+02         5.73185E-01         1.72334E+02         9.33329E+02         2.93608E+02         6.39721E+02
+          3.08042E-03         1.73459E-02        -9.36844E-03         1.93519E-01         1.30920E+00         1.93746E-01         9.94618E+02         5.73220E-01         1.79289E+02         9.39722E+02         3.02145E+02         6.37577E+02
+          3.08042E-03         1.75158E-02        -9.55446E-03         1.93519E-01         1.31987E+00         1.93755E-01         9.91590E+02         5.73257E-01         1.85916E+02         9.45237E+02         3.10458E+02         6.34778E+02
+          3.08042E-03         1.76856E-02        -9.74230E-03         1.93518E-01         1.33054E+00         1.93763E-01         9.87237E+02         5.73294E-01         1.92200E+02         9.49839E+02         3.18494E+02         6.31345E+02
+          3.08042E-03         1.78554E-02        -9.93195E-03         1.93518E-01         1.34121E+00         1.93772E-01         9.81599E+02         5.73333E-01         1.98128E+02         9.53503E+02         3.26203E+02         6.27300E+02
+          3.08042E-03         1.80252E-02        -1.01234E-02         1.93517E-01         1.35188E+00         1.93782E-01         9.74723E+02         5.73372E-01         2.03690E+02         9.56211E+02         3.33543E+02         6.22668E+02
+          3.08042E-03         1.81951E-02        -1.03167E-02         1.93517E-01         1.36255E+00         1.93791E-01         9.66659E+02         5.73413E-01         2.08878E+02         9.57952E+02         3.40476E+02         6.17476E+02
+          3.08042E-03         1.83649E-02        -1.05118E-02         1.93516E-01         1.37322E+00         1.93801E-01         9.57464E+02         5.73456E-01         2.13687E+02         9.58722E+02         3.46970E+02         6.11752E+02
+          3.08042E-03         1.85347E-02        -1.07087E-02         1.93515E-01         1.38389E+00         1.93811E-01         9.47197E+02         5.73499E-01         2.18115E+02         9.58523E+02         3.52997E+02         6.05526E+02
+          3.08042E-03         1.87045E-02        -1.09074E-02         1.93515E-01         1.39457E+00         1.93822E-01         9.35921E+02         5.73544E-01         2.22159E+02         9.57364E+02         3.58535E+02         5.98829E+02
+          3.08042E-03         1.88744E-02        -1.11079E-02         1.93514E-01         1.40524E+00         1.93833E-01         9.23702E+02         5.73590E-01         2.25821E+02         9.55259E+02         3.63566E+02         5.91693E+02
+          3.08042E-03         1.90442E-02        -1.13103E-02         1.93513E-01         1.41591E+00         1.93844E-01         9.10609E+02         5.73637E-01         2.29100E+02         9.52227E+02         3.68076E+02         5.84151E+02
+          3.08042E-03         1.92140E-02        -1.15144E-02         1.93513E-01         1.42658E+00         1.93855E-01         8.96711E+02         5.73686E-01         2.32002E+02         9.48291E+02         3.72056E+02         5.76235E+02
+          3.08042E-03         1.93839E-02        -1.17204E-02         1.93512E-01         1.43725E+00         1.93867E-01         8.82080E+02         5.73736E-01         2.34528E+02         9.43478E+02         3.75499E+02         5.67979E+02
+          3.08042E-03         1.95537E-02        -1.19282E-02         1.93512E-01         1.44792E+00         1.93879E-01         8.66789E+02         5.73787E-01         2.36685E+02         9.37820E+02         3.78403E+02         5.59417E+02
+          3.08042E-03         1.97235E-02        -1.21378E-02         1.93511E-01         1.45859E+00         1.93891E-01         8.50910E+02         5.73840E-01         2.38479E+02         9.31351E+02         3.80769E+02         5.50582E+02
+          3.08042E-03         1.98933E-02        -1.23492E-02         1.93510E-01         1.46926E+00         1.93904E-01         8.34516E+02         5.73894E-01         2.39916E+02         9.24109E+02         3.82601E+02         5.41508E+02
+          3.08042E-03         2.00632E-02        -1.25624E-02         1.93510E-01         1.47993E+00         1.93917E-01         8.17678E+02         5.73950E-01         2.41004E+02         9.16133E+02         3.83906E+02         5.32227E+02
+          3.08042E-03         2.02330E-02        -1.27774E-02         1.93509E-01         1.49060E+00         1.93930E-01         8.00470E+02         5.74007E-01         2.41752E+02         9.07466E+02         3.84692E+02         5.22773E+02
+          3.08042E-03         2.04028E-02        -1.29943E-02         1.93508E-01         1.50127E+00         1.93944E-01         7.82960E+02         5.74066E-01         2.42169E+02         8.98150E+02         3.84973E+02         5.13177E+02
+          3.08042E-03         2.05726E-02        -1.32129E-02         1.93508E-01         1.51194E+00         1.93958E-01         7.65217E+02         5.74127E-01         2.42264E+02         8.88231E+02         3.84760E+02         5.03471E+02
+          3.08042E-03         2.07425E-02        -1.34334E-02         1.93507E-01         1.52261E+00         1.93973E-01         7.47310E+02         5.74188E-01         2.42048E+02         8.77755E+02         3.84070E+02         4.93685E+02
+          3.08042E-03         2.09123E-02        -1.36557E-02         1.93506E-01         1.53328E+00         1.93987E-01         7.29301E+02         5.74252E-01         2.41532E+02         8.66768E+02         3.82920E+02         4.83847E+02
+          3.08042E-03         2.10821E-02        -1.38798E-02         1.93506E-01         1.54395E+00         1.94003E-01         7.11255E+02         5.74317E-01         2.40726E+02         8.55316E+02         3.81329E+02         4.73987E+02
+          3.08042E-03         2.12520E-02        -1.41057E-02         1.93505E-01         1.55462E+00         1.94018E-01         6.93231E+02         5.74384E-01         2.39642E+02         8.43449E+02         3.79317E+02         4.64132E+02
+          3.08042E-03         2.14218E-02        -1.43334E-02         1.93504E-01         1.56529E+00         1.94034E-01         6.75287E+02         5.74452E-01         2.38291E+02         8.31211E+02         3.76904E+02         4.54307E+02
+          3.08042E-03         2.15916E-02        -1.45630E-02         1.93503E-01         1.57596E+00         1.94051E-01         6.57477E+02         5.74523E-01         2.36687E+02         8.18649E+02         3.74113E+02         4.44536E+02
+          3.08042E-03         2.17614E-02        -1.47943E-02         1.93503E-01         1.58664E+00         1.94067E-01         6.39852E+02         5.74595E-01         2.34839E+02         8.05810E+02         3.70966E+02         4.34844E+02
+          3.08042E-03         2.19313E-02        -1.50275E-02         1.93502E-01         1.59731E+00         1.94085E-01         6.22461E+02         5.74668E-01         2.32761E+02         7.92739E+02         3.67486E+02         4.25252E+02
+          3.08042E-03         2.21011E-02        -1.52625E-02         1.93501E-01         1.60798E+00         1.94102E-01         6.05348E+02         5.74744E-01         2.30465E+02         7.79478E+02         3.63697E+02         4.15781E+02
+          3.08042E-03         2.22709E-02        -1.54993E-02         1.93501E-01         1.61865E+00         1.94120E-01         5.88555E+02         5.74821E-01         2.27963E+02         7.66071E+02         3.59622E+02         4.06448E+02
+          3.08042E-03         2.24407E-02        -1.57379E-02         1.93500E-01         1.62932E+00         1.94139E-01         5.72120E+02         5.74901E-01         2.25267E+02         7.52559E+02         3.55286E+02         3.97273E+02
+          3.08042E-03         2.26106E-02        -1.59783E-02         1.93499E-01         1.63999E+00         1.94158E-01         5.56079E+02         5.74982E-01         2.22389E+02         7.38981E+02         3.50711E+02         3.88270E+02
+          3.08042E-03         2.27804E-02        -1.62205E-02         1.93498E-01         1.65066E+00         1.94177E-01         5.40462E+02         5.75065E-01         2.19341E+02         7.25377E+02         3.45922E+02         3.79455E+02
+          3.08042E-03         2.29502E-02        -1.64646E-02         1.93498E-01         1.66133E+00         1.94197E-01         5.25297E+02         5.75150E-01         2.16135E+02         7.11782E+02         3.40941E+02         3.70841E+02
+          3.08042E-03         2.31201E-02        -1.67105E-02         1.93497E-01         1.67200E+00         1.94217E-01         5.10609E+02         5.75237E-01         2.12782E+02         6.98230E+02         3.35792E+02         3.62438E+02
+          3.08042E-03         2.32899E-02        -1.69581E-02         1.93496E-01         1.68267E+00         1.94238E-01         4.96418E+02         5.75326E-01         2.09295E+02         6.84754E+02         3.30496E+02         3.54258E+02
+          3.08042E-03         2.34597E-02        -1.72076E-02         1.93495E-01         1.69334E+00         1.94259E-01         4.82744E+02         5.75417E-01         2.05683E+02         6.71385E+02         3.25077E+02         3.46309E+02
+          3.08042E-03         2.36295E-02        -1.74589E-02         1.93495E-01         1.70401E+00         1.94281E-01         4.69600E+02         5.75510E-01         2.01959E+02         6.58152E+02         3.19554E+02         3.38598E+02
+          3.08042E-03         2.37994E-02        -1.77120E-02         1.93494E-01         1.71468E+00         1.94303E-01         4.56998E+02         5.75605E-01         1.98133E+02         6.45080E+02         3.13948E+02         3.31132E+02
+          3.08042E-03         2.39692E-02        -1.79670E-02         1.93493E-01         1.72535E+00         1.94325E-01         4.44946E+02         5.75702E-01         1.94214E+02         6.32194E+02         3.08280E+02         3.23915E+02
+          3.08042E-03         2.41390E-02        -1.82237E-02         1.93492E-01         1.73602E+00         1.94348E-01         4.33450E+02         5.75802E-01         1.90214E+02         6.19518E+02         3.02567E+02         3.16951E+02
+          3.08042E-03         2.43088E-02        -1.84823E-02         1.93491E-01         1.74669E+00         1.94372E-01         4.22514E+02         5.75904E-01         1.86143E+02         6.07070E+02         2.96828E+02         3.10242E+02
+          3.08042E-03         2.44787E-02        -1.87426E-02         1.93491E-01         1.75736E+00         1.94396E-01         4.12136E+02         5.76008E-01         1.82009E+02         5.94870E+02         2.91080E+02         3.03789E+02
+          3.08042E-03         2.46485E-02        -1.90048E-02         1.93490E-01         1.76804E+00         1.94421E-01         4.02315E+02         5.76114E-01         1.77822E+02         5.82933E+02         2.85340E+02         2.97593E+02
+          3.08042E-03         2.48183E-02        -1.92688E-02         1.93489E-01         1.77871E+00         1.94446E-01         3.93046E+02         5.76222E-01         1.73591E+02         5.71274E+02         2.79622E+02         2.91653E+02
+          3.08042E-03         2.49882E-02        -1.95346E-02         1.93488E-01         1.78938E+00         1.94472E-01         3.84321E+02         5.76333E-01         1.69325E+02         5.59906E+02         2.73940E+02         2.85966E+02
+          3.08042E-03         2.51580E-02        -1.98023E-02         1.93487E-01         1.80005E+00         1.94498E-01         3.76133E+02         5.76446E-01         1.65031E+02         5.48839E+02         2.68309E+02         2.80530E+02
+          3.08042E-03         2.53278E-02        -2.00717E-02         1.93486E-01         1.81072E+00         1.94525E-01         3.68469E+02         5.76562E-01         1.60718E+02         5.38081E+02         2.62740E+02         2.75342E+02
+          3.08042E-03         2.54976E-02        -2.03430E-02         1.93486E-01         1.82139E+00         1.94552E-01         3.61318E+02         5.76680E-01         1.56394E+02         5.27640E+02         2.57244E+02         2.70396E+02
+          3.08042E-03         2.56675E-02        -2.06160E-02         1.93485E-01         1.83206E+00         1.94580E-01         3.54665E+02         5.76801E-01         1.52066E+02         5.17521E+02         2.51832E+02         2.65688E+02
+          3.08042E-03         2.58373E-02        -2.08909E-02         1.93484E-01         1.84273E+00         1.94608E-01         3.48493E+02         5.76924E-01         1.47741E+02         5.07727E+02         2.46514E+02         2.61213E+02
+          3.08042E-03         2.60071E-02        -2.11676E-02         1.93483E-01         1.85340E+00         1.94638E-01         3.42787E+02         5.77049E-01         1.43426E+02         4.98260E+02         2.41298E+02         2.56963E+02
+          3.08042E-03         2.61769E-02        -2.14461E-02         1.93482E-01         1.86407E+00         1.94667E-01         3.37528E+02         5.77177E-01         1.39127E+02         4.89123E+02         2.36191E+02         2.52932E+02
+          3.25025E-03         8.72665E-04         2.69864E-05         2.04219E-01         2.74155E-01         2.04219E-01         1.89336E+04         6.21169E-01         6.83188E+03         2.25624E+04         1.65880E+04         5.97437E+03
+          3.25025E-03         1.04249E-03         1.67685E-05         2.04219E-01         2.84826E-01         2.04219E-01         1.84884E+04         6.21169E-01         6.70506E+03         2.20937E+04         1.62653E+04         5.82841E+03
+          3.25025E-03         1.21232E-03         4.73853E-06         2.04219E-01         2.95496E-01         2.04219E-01         1.80359E+04         6.21169E-01         6.57568E+03         2.16163E+04         1.59361E+04         5.68024E+03
+          3.25025E-03         1.38215E-03        -9.10363E-06         2.04219E-01         3.06167E-01         2.04219E-01         1.75769E+04         6.21169E-01         6.44395E+03         2.11311E+04         1.56010E+04         5.53016E+03
+          3.25025E-03         1.55197E-03        -2.47579E-05         2.04219E-01         3.16838E-01         2.04219E-01         1.71123E+04         6.21169E-01         6.31010E+03         2.06390E+04         1.52605E+04         5.37848E+03
+          3.25025E-03         1.72180E-03        -4.22244E-05         2.04219E-01         3.27508E-01         2.04219E-01         1.66431E+04         6.21168E-01         6.17434E+03         2.01408E+04         1.49153E+04         5.22552E+03
+          3.25025E-03         1.89163E-03        -6.15030E-05         2.04219E-01         3.38179E-01         2.04219E-01         1.61702E+04         6.21168E-01         6.03690E+03         1.96374E+04         1.45659E+04         5.07158E+03
+          3.25025E-03         2.06146E-03        -8.25938E-05         2.04219E-01         3.48849E-01         2.04219E-01         1.56943E+04         6.21168E-01         5.89799E+03         1.91297E+04         1.42128E+04         4.91696E+03
+          3.25025E-03         2.23128E-03        -1.05497E-04         2.04219E-01         3.59520E-01         2.04219E-01         1.52164E+04         6.21167E-01         5.75784E+03         1.86186E+04         1.38566E+04         4.76196E+03
+          3.25025E-03         2.40111E-03        -1.30212E-04         2.04219E-01         3.70190E-01         2.04219E-01         1.47374E+04         6.21167E-01         5.61666E+03         1.81049E+04         1.34980E+04         4.60688E+03
+          3.25025E-03         2.57094E-03        -1.56739E-04         2.04218E-01         3.80861E-01         2.04219E-01         1.42581E+04         6.21167E-01         5.47467E+03         1.75894E+04         1.31374E+04         4.45201E+03
+          3.25025E-03         2.74077E-03        -1.85078E-04         2.04218E-01         3.91532E-01         2.04218E-01         1.37794E+04         6.21167E-01         5.33208E+03         1.70730E+04         1.27753E+04         4.29763E+03
+          3.25025E-03         2.91059E-03        -2.15230E-04         2.04218E-01         4.02202E-01         2.04218E-01         1.33020E+04         6.21166E-01         5.18910E+03         1.65565E+04         1.24124E+04         4.14402E+03
+          3.25025E-03         3.08042E-03        -2.47194E-04         2.04218E-01         4.12873E-01         2.04218E-01         1.28268E+04         6.21166E-01         5.04595E+03         1.60407E+04         1.20492E+04         3.99145E+03
+          3.25025E-03         3.25025E-03        -2.80970E-04         2.04218E-01         4.23543E-01         2.04218E-01         1.23546E+04         6.21166E-01         4.90283E+03         1.55264E+04         1.16862E+04         3.84018E+03
+          3.25025E-03         3.42008E-03        -3.16558E-04         2.04218E-01         4.34214E-01         2.04218E-01         1.18860E+04         6.21165E-01         4.75993E+03         1.50144E+04         1.13239E+04         3.69047E+03
+          3.25025E-03         3.58990E-03        -3.53958E-04         2.04218E-01         4.44884E-01         2.04218E-01         1.14220E+04         6.21165E-01         4.61746E+03         1.45054E+04         1.09628E+04         3.54255E+03
+          3.25025E-03         3.75973E-03        -3.93170E-04         2.04218E-01         4.55555E-01         2.04218E-01         1.09630E+04         6.21165E-01         4.47560E+03         1.40001E+04         1.06034E+04         3.39667E+03
+          3.25025E-03         3.92956E-03        -4.34195E-04         2.04218E-01         4.66225E-01         2.04218E-01         1.05099E+04         6.21164E-01         4.33454E+03         1.34992E+04         1.02462E+04         3.25303E+03
+          3.25025E-03         4.09939E-03        -4.77032E-04         2.04217E-01         4.76896E-01         2.04218E-01         1.00633E+04         6.21164E-01         4.19446E+03         1.30035E+04         9.89165E+03         3.11187E+03
+          3.25025E-03         4.26921E-03        -5.21681E-04         2.04217E-01         4.87567E-01         2.04218E-01         9.62376E+03         6.21164E-01         4.05553E+03         1.25136E+04         9.54019E+03         2.97337E+03
+          3.25025E-03         4.43904E-03        -5.68142E-04         2.04217E-01         4.98237E-01         2.04218E-01         9.19188E+03         6.21164E-01         3.91793E+03         1.20300E+04         9.19225E+03         2.83772E+03
+          3.25025E-03         4.60887E-03        -6.16416E-04         2.04217E-01         5.08908E-01         2.04218E-01         8.76823E+03         6.21164E-01         3.78180E+03         1.15534E+04         8.84825E+03         2.70511E+03
+          3.25025E-03         4.77869E-03        -6.66501E-04         2.04217E-01         5.19578E-01         2.04218E-01         8.35331E+03         6.21164E-01         3.64732E+03         1.10843E+04         8.50858E+03         2.57569E+03
+          3.25025E-03         4.94852E-03        -7.18399E-04         2.04217E-01         5.30249E-01         2.04218E-01         7.94761E+03         6.21164E-01         3.51461E+03         1.06232E+04         8.17363E+03         2.44961E+03
+          3.25025E-03         5.11835E-03        -7.72109E-04         2.04216E-01         5.40919E-01         2.04218E-01         7.55157E+03         6.21164E-01         3.38382E+03         1.01708E+04         7.84374E+03         2.32702E+03
+          3.25025E-03         5.28818E-03        -8.27631E-04         2.04216E-01         5.51590E-01         2.04218E-01         7.16560E+03         6.21164E-01         3.25509E+03         9.72731E+03         7.51927E+03         2.20804E+03
+          3.25025E-03         5.45800E-03        -8.84966E-04         2.04216E-01         5.62261E-01         2.04218E-01         6.79007E+03         6.21164E-01         3.12853E+03         9.29331E+03         7.20052E+03         2.09279E+03
+          3.25025E-03         5.62783E-03        -9.44112E-04         2.04216E-01         5.72931E-01         2.04218E-01         6.42531E+03         6.21165E-01         3.00426E+03         8.86915E+03         6.88780E+03         1.98135E+03
+          3.25025E-03         5.79766E-03        -1.00507E-03         2.04216E-01         5.83602E-01         2.04218E-01         6.07163E+03         6.21165E-01         2.88240E+03         8.45521E+03         6.58139E+03         1.87382E+03
+          3.25025E-03         5.96749E-03        -1.06784E-03         2.04215E-01         5.94272E-01         2.04218E-01         5.72929E+03         6.21166E-01         2.76303E+03         8.05182E+03         6.28155E+03         1.77027E+03
+          3.25025E-03         6.13731E-03        -1.13243E-03         2.04215E-01         6.04943E-01         2.04218E-01         5.39851E+03         6.21166E-01         2.64624E+03         7.65927E+03         5.98851E+03         1.67076E+03
+          3.25025E-03         6.30714E-03        -1.19882E-03         2.04215E-01         6.15613E-01         2.04219E-01         5.07948E+03         6.21167E-01         2.53213E+03         7.27783E+03         5.70249E+03         1.57534E+03
+          3.25025E-03         6.47697E-03        -1.26703E-03         2.04215E-01         6.26284E-01         2.04219E-01         4.77236E+03         6.21168E-01         2.42077E+03         6.90773E+03         5.42369E+03         1.48404E+03
+          3.25025E-03         6.64680E-03        -1.33705E-03         2.04215E-01         6.36955E-01         2.04219E-01         4.47725E+03         6.21169E-01         2.31222E+03         6.54917E+03         5.15228E+03         1.39689E+03
+          3.25025E-03         6.81662E-03        -1.40888E-03         2.04214E-01         6.47625E-01         2.04219E-01         4.19425E+03         6.21170E-01         2.20653E+03         6.20231E+03         4.88842E+03         1.31388E+03
+          3.25025E-03         6.98645E-03        -1.48253E-03         2.04214E-01         6.58296E-01         2.04220E-01         3.92339E+03         6.21172E-01         2.10377E+03         5.86728E+03         4.63224E+03         1.23504E+03
+          3.25025E-03         7.15628E-03        -1.55798E-03         2.04214E-01         6.68966E-01         2.04220E-01         3.66471E+03         6.21173E-01         2.00397E+03         5.54418E+03         4.38385E+03         1.16033E+03
+          3.25025E-03         7.32611E-03        -1.63525E-03         2.04214E-01         6.79637E-01         2.04220E-01         3.41817E+03         6.21175E-01         1.90715E+03         5.23308E+03         4.14335E+03         1.08973E+03
+          3.25025E-03         7.49593E-03        -1.71433E-03         2.04213E-01         6.90307E-01         2.04221E-01         3.18374E+03         6.21177E-01         1.81336E+03         4.93403E+03         3.91081E+03         1.02322E+03
+          3.25025E-03         7.66576E-03        -1.79523E-03         2.04213E-01         7.00978E-01         2.04221E-01         2.96132E+03         6.21179E-01         1.72260E+03         4.64702E+03         3.68629E+03         9.60736E+02
+          3.25025E-03         7.83559E-03        -1.87793E-03         2.04213E-01         7.11649E-01         2.04221E-01         2.75082E+03         6.21181E-01         1.63488E+03         4.37205E+03         3.46982E+03         9.02235E+02
+          3.25025E-03         8.00542E-03        -1.96245E-03         2.04213E-01         7.22319E-01         2.04222E-01         2.55209E+03         6.21184E-01         1.55021E+03         4.10906E+03         3.26141E+03         8.47649E+02
+          3.25025E-03         8.17524E-03        -2.04878E-03         2.04212E-01         7.32990E-01         2.04223E-01         2.36498E+03         6.21187E-01         1.46858E+03         3.85798E+03         3.06107E+03         7.96904E+02
+          3.25025E-03         8.34507E-03        -2.13693E-03         2.04212E-01         7.43660E-01         2.04223E-01         2.18929E+03         6.21190E-01         1.38997E+03         3.61870E+03         2.86879E+03         7.49919E+02
+          3.25025E-03         8.51490E-03        -2.22688E-03         2.04212E-01         7.54331E-01         2.04224E-01         2.02482E+03         6.21193E-01         1.31436E+03         3.39112E+03         2.68451E+03         7.06604E+02
+          3.25025E-03         8.68473E-03        -2.31865E-03         2.04211E-01         7.65001E-01         2.04225E-01         1.87133E+03         6.21196E-01         1.24173E+03         3.17506E+03         2.50820E+03         6.66863E+02
+          3.25025E-03         8.85455E-03        -2.41223E-03         2.04211E-01         7.75672E-01         2.04225E-01         1.72856E+03         6.21200E-01         1.17205E+03         2.97038E+03         2.33979E+03         6.30592E+02
+          3.25025E-03         9.02438E-03        -2.50762E-03         2.04211E-01         7.86343E-01         2.04226E-01         1.59624E+03         6.21204E-01         1.10527E+03         2.77687E+03         2.17919E+03         5.97681E+02
+          3.25025E-03         9.19421E-03        -2.60483E-03         2.04210E-01         7.97013E-01         2.04227E-01         1.47408E+03         6.21209E-01         1.04134E+03         2.59432E+03         2.02631E+03         5.68017E+02
+          3.25025E-03         9.36403E-03        -2.70385E-03         2.04210E-01         8.07684E-01         2.04228E-01         1.36178E+03         6.21213E-01         9.80225E+02         2.42252E+03         1.88104E+03         5.41479E+02
+          3.25025E-03         9.53386E-03        -2.80467E-03         2.04210E-01         8.18354E-01         2.04229E-01         1.25900E+03         6.21218E-01         9.21852E+02         2.26120E+03         1.74326E+03         5.17943E+02
+          3.25025E-03         9.70369E-03        -2.90732E-03         2.04210E-01         8.29025E-01         2.04230E-01         1.16541E+03         6.21224E-01         8.66163E+02         2.11011E+03         1.61283E+03         4.97280E+02
+          3.25025E-03         9.87352E-03        -3.01177E-03         2.04209E-01         8.39695E-01         2.04231E-01         1.08067E+03         6.21229E-01         8.13092E+02         1.96898E+03         1.48962E+03         4.79360E+02
+          3.25025E-03         1.00433E-02        -3.11804E-03         2.04209E-01         8.50366E-01         2.04233E-01         1.00441E+03         6.21235E-01         7.62566E+02         1.83751E+03         1.37346E+03         4.64048E+02
+          3.25025E-03         1.02132E-02        -3.22612E-03         2.04208E-01         8.61037E-01         2.04234E-01         9.36282E+02         6.21242E-01         7.14510E+02         1.71540E+03         1.26419E+03         4.51208E+02
+          3.25025E-03         1.03830E-02        -3.33601E-03         2.04208E-01         8.71707E-01         2.04235E-01         8.75899E+02         6.21249E-01         6.68847E+02         1.60235E+03         1.16165E+03         4.40704E+02
+          3.25025E-03         1.05528E-02        -3.44771E-03         2.04208E-01         8.82378E-01         2.04237E-01         8.22888E+02         6.21256E-01         6.25493E+02         1.49804E+03         1.06564E+03         4.32396E+02
+          3.25025E-03         1.07227E-02        -3.56123E-03         2.04207E-01         8.93048E-01         2.04238E-01         7.76867E+02         6.21264E-01         5.84365E+02         1.40213E+03         9.75984E+02         4.26145E+02
+          3.25025E-03         1.08925E-02        -3.67656E-03         2.04207E-01         9.03719E-01         2.04240E-01         7.37453E+02         6.21272E-01         5.45377E+02         1.31430E+03         8.92485E+02         4.21813E+02
+          3.25025E-03         1.10623E-02        -3.79370E-03         2.04207E-01         9.14389E-01         2.04242E-01         7.04261E+02         6.21280E-01         5.08443E+02         1.23420E+03         8.14943E+02         4.19260E+02
+          3.25025E-03         1.12321E-02        -3.91265E-03         2.04206E-01         9.25060E-01         2.04244E-01         6.76906E+02         6.21289E-01         4.73474E+02         1.16151E+03         7.43155E+02         4.18351E+02
+          3.25025E-03         1.14020E-02        -4.03342E-03         2.04206E-01         9.35731E-01         2.04246E-01         6.55005E+02         6.21299E-01         4.40385E+02         1.09586E+03         6.76910E+02         4.18947E+02
+          3.25025E-03         1.15718E-02        -4.15600E-03         2.04205E-01         9.46401E-01         2.04248E-01         6.38179E+02         6.21309E-01         4.09088E+02         1.03692E+03         6.15999E+02         4.20916E+02
+          3.25025E-03         1.17416E-02        -4.28039E-03         2.04205E-01         9.57072E-01         2.04250E-01         6.26052E+02         6.21319E-01         3.79499E+02         9.84332E+02         5.60207E+02         4.24125E+02
+          3.25025E-03         1.19114E-02        -4.40660E-03         2.04205E-01         9.67742E-01         2.04252E-01         6.18254E+02         6.21330E-01         3.51538E+02         9.37763E+02         5.09318E+02         4.28446E+02
+          3.25025E-03         1.20813E-02        -4.53461E-03         2.04204E-01         9.78413E-01         2.04255E-01         6.14420E+02         6.21342E-01         3.25126E+02         8.96865E+02         4.63114E+02         4.33751E+02
+          3.25025E-03         1.22511E-02        -4.66444E-03         2.04204E-01         9.89083E-01         2.04257E-01         6.14193E+02         6.21354E-01         3.00190E+02         8.61298E+02         4.21379E+02         4.39919E+02
+          3.25025E-03         1.24209E-02        -4.79608E-03         2.04203E-01         9.99754E-01         2.04260E-01         6.17226E+02         6.21367E-01         2.76664E+02         8.30724E+02         3.83895E+02         4.46830E+02
+          3.25025E-03         1.25908E-02        -4.92954E-03         2.04203E-01         1.01042E+00         2.04262E-01         6.23179E+02         6.21380E-01         2.54488E+02         8.04813E+02         3.50445E+02         4.54368E+02
+          3.25025E-03         1.27606E-02        -5.06480E-03         2.04202E-01         1.02110E+00         2.04265E-01         6.31722E+02         6.21394E-01         2.33613E+02         7.83238E+02         3.20815E+02         4.62423E+02
+          3.25025E-03         1.29304E-02        -5.20188E-03         2.04202E-01         1.03177E+00         2.04268E-01         6.42538E+02         6.21408E-01         2.13999E+02         7.65679E+02         2.94791E+02         4.70888E+02
+          3.25025E-03         1.31002E-02        -5.34077E-03         2.04202E-01         1.04244E+00         2.04271E-01         6.55318E+02         6.21424E-01         1.95620E+02         7.51824E+02         2.72162E+02         4.79662E+02
+          3.25025E-03         1.32701E-02        -5.48148E-03         2.04201E-01         1.05311E+00         2.04275E-01         6.69768E+02         6.21440E-01         1.78470E+02         7.41367E+02         2.52721E+02         4.88646E+02
+          3.25025E-03         1.34399E-02        -5.62400E-03         2.04201E-01         1.06378E+00         2.04278E-01         6.85604E+02         6.21456E-01         1.62559E+02         7.34012E+02         2.36263E+02         4.97749E+02
+          3.25025E-03         1.36097E-02        -5.76833E-03         2.04200E-01         1.07445E+00         2.04282E-01         7.02558E+02         6.21473E-01         1.47923E+02         7.29472E+02         2.22588E+02         5.06884E+02
+          3.25025E-03         1.37795E-02        -5.91447E-03         2.04200E-01         1.08512E+00         2.04285E-01         7.20372E+02         6.21491E-01         1.34626E+02         7.27469E+02         2.11500E+02         5.15969E+02
+          3.25025E-03         1.39494E-02        -6.06242E-03         2.04199E-01         1.09579E+00         2.04289E-01         7.38804E+02         6.21510E-01         1.22764E+02         7.27733E+02         2.02807E+02         5.24926E+02
+          3.25025E-03         1.41192E-02        -6.21219E-03         2.04199E-01         1.10646E+00         2.04293E-01         7.57624E+02         6.21530E-01         1.12465E+02         7.30009E+02         1.96323E+02         5.33685E+02
+          3.25025E-03         1.42890E-02        -6.36377E-03         2.04198E-01         1.11713E+00         2.04297E-01         7.76619E+02         6.21550E-01         1.03881E+02         7.34048E+02         1.91867E+02         5.42180E+02
+          3.25025E-03         1.44589E-02        -6.51717E-03         2.04198E-01         1.12780E+00         2.04302E-01         7.95586E+02         6.21571E-01         9.71699E+01         7.39613E+02         1.89263E+02         5.50350E+02
+          3.25025E-03         1.46287E-02        -6.67237E-03         2.04197E-01         1.13847E+00         2.04306E-01         8.14340E+02         6.21593E-01         9.24611E+01         7.46481E+02         1.88342E+02         5.58139E+02
+          3.25025E-03         1.47985E-02        -6.82939E-03         2.04197E-01         1.14914E+00         2.04311E-01         8.32708E+02         6.21616E-01         8.98120E+01         7.54438E+02         1.88940E+02         5.65498E+02
+          3.25025E-03         1.49683E-02        -6.98822E-03         2.04196E-01         1.15981E+00         2.04316E-01         8.50532E+02         6.21639E-01         8.91715E+01         7.63280E+02         1.90899E+02         5.72381E+02
+          3.25025E-03         1.51382E-02        -7.14887E-03         2.04196E-01         1.17048E+00         2.04321E-01         8.67669E+02         6.21664E-01         9.03713E+01         7.72818E+02         1.94070E+02         5.78748E+02
+          3.25025E-03         1.53080E-02        -7.31132E-03         2.04195E-01         1.18115E+00         2.04326E-01         8.83987E+02         6.21689E-01         9.31525E+01         7.82872E+02         1.98306E+02         5.84565E+02
+          3.25025E-03         1.54778E-02        -7.47559E-03         2.04195E-01         1.19182E+00         2.04331E-01         8.99371E+02         6.21715E-01         9.72126E+01         7.93274E+02         2.03472E+02         5.89802E+02
+          3.25025E-03         1.56476E-02        -7.64168E-03         2.04194E-01         1.20249E+00         2.04337E-01         9.13717E+02         6.21742E-01         1.02251E+02         8.03869E+02         2.09435E+02         5.94434E+02
+          3.25025E-03         1.58175E-02        -7.80957E-03         2.04194E-01         1.21317E+00         2.04343E-01         9.26934E+02         6.21771E-01         1.08000E+02         8.14513E+02         2.16072E+02         5.98441E+02
+          3.25025E-03         1.59873E-02        -7.97928E-03         2.04193E-01         1.22384E+00         2.04349E-01         9.38946E+02         6.21800E-01         1.14234E+02         8.25071E+02         2.23265E+02         6.01806E+02
+          3.25025E-03         1.61571E-02        -8.15080E-03         2.04192E-01         1.23451E+00         2.04355E-01         9.49687E+02         6.21830E-01         1.20771E+02         8.35421E+02         2.30904E+02         6.04517E+02
+          3.25025E-03         1.63270E-02        -8.32413E-03         2.04192E-01         1.24518E+00         2.04361E-01         9.59105E+02         6.21861E-01         1.27470E+02         8.45452E+02         2.38884E+02         6.06568E+02
+          3.25025E-03         1.64968E-02        -8.49928E-03         2.04191E-01         1.25585E+00         2.04368E-01         9.67156E+02         6.21893E-01         1.34219E+02         8.55064E+02         2.47109E+02         6.07955E+02
+          3.25025E-03         1.66666E-02        -8.67624E-03         2.04191E-01         1.26652E+00         2.04375E-01         9.73810E+02         6.21927E-01         1.40932E+02         8.64165E+02         2.55488E+02         6.08677E+02
+          3.25025E-03         1.68364E-02        -8.85501E-03         2.04190E-01         1.27719E+00         2.04382E-01         9.79047E+02         6.21961E-01         1.47542E+02         8.72676E+02         2.63937E+02         6.08739E+02
+          3.25025E-03         1.70063E-02        -9.03560E-03         2.04190E-01         1.28786E+00         2.04389E-01         9.82856E+02         6.21997E-01         1.53995E+02         8.80526E+02         2.72379E+02         6.08147E+02
+          3.25025E-03         1.71761E-02        -9.21800E-03         2.04189E-01         1.29853E+00         2.04397E-01         9.85236E+02         6.22034E-01         1.60251E+02         8.87654E+02         2.80741E+02         6.06912E+02
+          3.25025E-03         1.73459E-02        -9.40221E-03         2.04188E-01         1.30920E+00         2.04405E-01         9.86194E+02         6.22071E-01         1.66275E+02         8.94008E+02         2.88960E+02         6.05047E+02
+          3.25025E-03         1.75158E-02        -9.58823E-03         2.04188E-01         1.31987E+00         2.04413E-01         9.85747E+02         6.22110E-01         1.72044E+02         8.99544E+02         2.96976E+02         6.02567E+02
+          3.25025E-03         1.76856E-02        -9.77607E-03         2.04187E-01         1.33054E+00         2.04421E-01         9.83917E+02         6.22151E-01         1.77535E+02         9.04227E+02         3.04736E+02         5.99491E+02
+          3.25025E-03         1.78554E-02        -9.96572E-03         2.04187E-01         1.34121E+00         2.04430E-01         9.80736E+02         6.22192E-01         1.82732E+02         9.08031E+02         3.12192E+02         5.95839E+02
+          3.25025E-03         1.80252E-02        -1.01572E-02         2.04186E-01         1.35188E+00         2.04438E-01         9.76240E+02         6.22235E-01         1.87623E+02         9.10936E+02         3.19302E+02         5.91633E+02
+          3.25025E-03         1.81951E-02        -1.03505E-02         2.04185E-01         1.36255E+00         2.04447E-01         9.70472E+02         6.22279E-01         1.92198E+02         9.12928E+02         3.26030E+02         5.86898E+02
+          3.25025E-03         1.83649E-02        -1.05455E-02         2.04185E-01         1.37322E+00         2.04457E-01         9.63481E+02         6.22325E-01         1.96449E+02         9.14001E+02         3.32342E+02         5.81659E+02
+          3.25025E-03         1.85347E-02        -1.07425E-02         2.04184E-01         1.38389E+00         2.04466E-01         9.55319E+02         6.22371E-01         2.00372E+02         9.14156E+02         3.38213E+02         5.75943E+02
+          3.25025E-03         1.87045E-02        -1.09412E-02         2.04183E-01         1.39457E+00         2.04476E-01         9.46044E+02         6.22419E-01         2.03963E+02         9.13399E+02         3.43620E+02         5.69779E+02
+          3.25025E-03         1.88744E-02        -1.11417E-02         2.04183E-01         1.40524E+00         2.04487E-01         9.35716E+02         6.22469E-01         2.07221E+02         9.11739E+02         3.48544E+02         5.63196E+02
+          3.25025E-03         1.90442E-02        -1.13440E-02         2.04182E-01         1.41591E+00         2.04497E-01         9.24401E+02         6.22520E-01         2.10145E+02         9.09195E+02         3.52972E+02         5.56223E+02
+          3.25025E-03         1.92140E-02        -1.15482E-02         2.04181E-01         1.42658E+00         2.04508E-01         9.12163E+02         6.22572E-01         2.12738E+02         9.05785E+02         3.56893E+02         5.48892E+02
+          3.25025E-03         1.93839E-02        -1.17542E-02         2.04181E-01         1.43725E+00         2.04519E-01         8.99072E+02         6.22626E-01         2.15001E+02         9.01535E+02         3.60302E+02         5.41233E+02
+          3.25025E-03         1.95537E-02        -1.19619E-02         2.04180E-01         1.44792E+00         2.04530E-01         8.85198E+02         6.22681E-01         2.16937E+02         8.96473E+02         3.63195E+02         5.33278E+02
+          3.25025E-03         1.97235E-02        -1.21715E-02         2.04179E-01         1.45859E+00         2.04542E-01         8.70612E+02         6.22738E-01         2.18553E+02         8.90629E+02         3.65573E+02         5.25057E+02
+          3.25025E-03         1.98933E-02        -1.23829E-02         2.04179E-01         1.46926E+00         2.04554E-01         8.55386E+02         6.22797E-01         2.19852E+02         8.84039E+02         3.67437E+02         5.16601E+02
+          3.25025E-03         2.00632E-02        -1.25962E-02         2.04178E-01         1.47993E+00         2.04566E-01         8.39591E+02         6.22857E-01         2.20841E+02         8.76738E+02         3.68796E+02         5.07943E+02
+          3.25025E-03         2.02330E-02        -1.28112E-02         2.04177E-01         1.49060E+00         2.04579E-01         8.23301E+02         6.22918E-01         2.21527E+02         8.68766E+02         3.69656E+02         4.99110E+02
+          3.25025E-03         2.04028E-02        -1.30280E-02         2.04177E-01         1.50127E+00         2.04592E-01         8.06585E+02         6.22982E-01         2.21918E+02         8.60164E+02         3.70029E+02         4.90135E+02
+          3.25025E-03         2.05726E-02        -1.32467E-02         2.04176E-01         1.51194E+00         2.04605E-01         7.89515E+02         6.23046E-01         2.22021E+02         8.50972E+02         3.69926E+02         4.81045E+02
+          3.25025E-03         2.07425E-02        -1.34672E-02         2.04175E-01         1.52261E+00         2.04619E-01         7.72159E+02         6.23113E-01         2.21845E+02         8.41234E+02         3.69364E+02         4.71870E+02
+          3.25025E-03         2.09123E-02        -1.36895E-02         2.04174E-01         1.53328E+00         2.04633E-01         7.54586E+02         6.23181E-01         2.21400E+02         8.30993E+02         3.68357E+02         4.62637E+02
+          3.25025E-03         2.10821E-02        -1.39136E-02         2.04174E-01         1.54395E+00         2.04647E-01         7.36860E+02         6.23251E-01         2.20695E+02         8.20295E+02         3.66923E+02         4.53372E+02
+          3.25025E-03         2.12520E-02        -1.41395E-02         2.04173E-01         1.55462E+00         2.04662E-01         7.19044E+02         6.23323E-01         2.19739E+02         8.09183E+02         3.65082E+02         4.44101E+02
+          3.25025E-03         2.14218E-02        -1.43672E-02         2.04172E-01         1.56529E+00         2.04677E-01         7.01201E+02         6.23397E-01         2.18542E+02         7.97701E+02         3.62852E+02         4.34849E+02
+          3.25025E-03         2.15916E-02        -1.45967E-02         2.04172E-01         1.57596E+00         2.04693E-01         6.83389E+02         6.23473E-01         2.17115E+02         7.85895E+02         3.60256E+02         4.25639E+02
+          3.25025E-03         2.17614E-02        -1.48281E-02         2.04171E-01         1.58664E+00         2.04709E-01         6.65663E+02         6.23550E-01         2.15468E+02         7.73806E+02         3.57313E+02         4.16493E+02
+          3.25025E-03         2.19313E-02        -1.50613E-02         2.04170E-01         1.59731E+00         2.04725E-01         6.48076E+02         6.23629E-01         2.13612E+02         7.61478E+02         3.54047E+02         4.07431E+02
+          3.25025E-03         2.21011E-02        -1.52962E-02         2.04169E-01         1.60798E+00         2.04741E-01         6.30679E+02         6.23710E-01         2.11557E+02         7.48954E+02         3.50479E+02         3.98474E+02
+          3.25025E-03         2.22709E-02        -1.55330E-02         2.04168E-01         1.61865E+00         2.04758E-01         6.13518E+02         6.23794E-01         2.09313E+02         7.36273E+02         3.46633E+02         3.89640E+02
+          3.25025E-03         2.24407E-02        -1.57717E-02         2.04168E-01         1.62932E+00         2.04776E-01         5.96636E+02         6.23879E-01         2.06892E+02         7.23475E+02         3.42530E+02         3.80945E+02
+          3.25025E-03         2.26106E-02        -1.60121E-02         2.04167E-01         1.63999E+00         2.04794E-01         5.80074E+02         6.23966E-01         2.04304E+02         7.10598E+02         3.38194E+02         3.72404E+02
+          3.25025E-03         2.27804E-02        -1.62543E-02         2.04166E-01         1.65066E+00         2.04812E-01         5.63869E+02         6.24055E-01         2.01559E+02         6.97680E+02         3.33647E+02         3.64033E+02
+          3.25025E-03         2.29502E-02        -1.64984E-02         2.04165E-01         1.66133E+00         2.04831E-01         5.48054E+02         6.24147E-01         1.98668E+02         6.84755E+02         3.28912E+02         3.55843E+02
+          3.25025E-03         2.31201E-02        -1.67442E-02         2.04165E-01         1.67200E+00         2.04850E-01         5.32659E+02         6.24240E-01         1.95641E+02         6.71856E+02         3.24010E+02         3.47846E+02
+          3.25025E-03         2.32899E-02        -1.69919E-02         2.04164E-01         1.68267E+00         2.04870E-01         5.17711E+02         6.24336E-01         1.92487E+02         6.59015E+02         3.18963E+02         3.40053E+02
+          3.25025E-03         2.34597E-02        -1.72414E-02         2.04163E-01         1.69334E+00         2.04890E-01         5.03234E+02         6.24433E-01         1.89218E+02         6.46262E+02         3.13791E+02         3.32471E+02
+          3.25025E-03         2.36295E-02        -1.74927E-02         2.04162E-01         1.70401E+00         2.04910E-01         4.89248E+02         6.24533E-01         1.85842E+02         6.33625E+02         3.08516E+02         3.25109E+02
+          3.25025E-03         2.37994E-02        -1.77458E-02         2.04161E-01         1.71468E+00         2.04931E-01         4.75770E+02         6.24636E-01         1.82369E+02         6.21129E+02         3.03157E+02         3.17972E+02
+          3.25025E-03         2.39692E-02        -1.80007E-02         2.04160E-01         1.72535E+00         2.04952E-01         4.62814E+02         6.24740E-01         1.78808E+02         6.08799E+02         2.97733E+02         3.11066E+02
+          3.25025E-03         2.41390E-02        -1.82575E-02         2.04160E-01         1.73602E+00         2.04974E-01         4.50391E+02         6.24847E-01         1.75168E+02         5.96657E+02         2.92263E+02         3.04394E+02
+          3.25025E-03         2.43088E-02        -1.85160E-02         2.04159E-01         1.74669E+00         2.04997E-01         4.38509E+02         6.24956E-01         1.71459E+02         5.84722E+02         2.86763E+02         2.97959E+02
+          3.25025E-03         2.44787E-02        -1.87764E-02         2.04158E-01         1.75736E+00         2.05020E-01         4.27173E+02         6.25068E-01         1.67688E+02         5.73014E+02         2.81250E+02         2.91764E+02
+          3.25025E-03         2.46485E-02        -1.90386E-02         2.04157E-01         1.76804E+00         2.05043E-01         4.16385E+02         6.25182E-01         1.63863E+02         5.61548E+02         2.75741E+02         2.85807E+02
+          3.25025E-03         2.48183E-02        -1.93026E-02         2.04156E-01         1.77871E+00         2.05067E-01         4.06146E+02         6.25299E-01         1.59993E+02         5.50338E+02         2.70249E+02         2.80089E+02
+          3.25025E-03         2.49882E-02        -1.95684E-02         2.04155E-01         1.78938E+00         2.05091E-01         3.96453E+02         6.25417E-01         1.56086E+02         5.39398E+02         2.64789E+02         2.74610E+02
+          3.25025E-03         2.51580E-02        -1.98360E-02         2.04154E-01         1.80005E+00         2.05116E-01         3.87301E+02         6.25539E-01         1.52148E+02         5.28738E+02         2.59373E+02         2.69365E+02
+          3.25025E-03         2.53278E-02        -2.01055E-02         2.04154E-01         1.81072E+00         2.05141E-01         3.78683E+02         6.25663E-01         1.48188E+02         5.18368E+02         2.54014E+02         2.64353E+02
+          3.25025E-03         2.54976E-02        -2.03767E-02         2.04153E-01         1.82139E+00         2.05167E-01         3.70591E+02         6.25790E-01         1.44211E+02         5.08294E+02         2.48723E+02         2.59570E+02
+          3.25025E-03         2.56675E-02        -2.06498E-02         2.04152E-01         1.83206E+00         2.05194E-01         3.63013E+02         6.25919E-01         1.40225E+02         4.98522E+02         2.43510E+02         2.55012E+02
+          3.25025E-03         2.58373E-02        -2.09247E-02         2.04151E-01         1.84273E+00         2.05220E-01         3.55937E+02         6.26051E-01         1.36236E+02         4.89057E+02         2.38384E+02         2.50673E+02
+          3.25025E-03         2.60071E-02        -2.12014E-02         2.04150E-01         1.85340E+00         2.05248E-01         3.49350E+02         6.26186E-01         1.32250E+02         4.79901E+02         2.33353E+02         2.46548E+02
+          3.25025E-03         2.61769E-02        -2.14799E-02         2.04149E-01         1.86407E+00         2.05276E-01         3.43235E+02         6.26323E-01         1.28273E+02         4.71055E+02         2.28425E+02         2.42630E+02
+          3.42008E-03         8.72665E-04        -8.60187E-06         2.14890E-01         2.74155E-01         2.14890E-01         1.95438E+04         6.74977E-01         5.97806E+03         2.14946E+04         1.59257E+04         5.56897E+03
+          3.42008E-03         1.04249E-03        -1.88197E-05         2.14890E-01         2.84826E-01         2.14890E-01         1.90941E+04         6.74977E-01         5.86802E+03         2.10510E+04         1.56169E+04         5.43418E+03
+          3.42008E-03         1.21232E-03        -3.08497E-05         2.14890E-01         2.95496E-01         2.14890E-01         1.86368E+04         6.74976E-01         5.75574E+03         2.05992E+04         1.53019E+04         5.29732E+03
+          3.42008E-03         1.38215E-03        -4.46919E-05         2.14889E-01         3.06167E-01         2.14889E-01         1.81727E+04         6.74976E-01         5.64143E+03         2.01399E+04         1.49812E+04         5.15867E+03
+          3.42008E-03         1.55197E-03        -6.03462E-05         2.14889E-01         3.16838E-01         2.14889E-01         1.77027E+04         6.74976E-01         5.52526E+03         1.96739E+04         1.46554E+04         5.01853E+03
+          3.42008E-03         1.72180E-03        -7.78126E-05         2.14889E-01         3.27508E-01         2.14889E-01         1.72278E+04         6.74976E-01         5.40743E+03         1.92022E+04         1.43250E+04         4.87717E+03
+          3.42008E-03         1.89163E-03        -9.70912E-05         2.14889E-01         3.38179E-01         2.14889E-01         1.67487E+04         6.74975E-01         5.28812E+03         1.87255E+04         1.39906E+04         4.73488E+03
+          3.42008E-03         2.06146E-03        -1.18182E-04         2.14889E-01         3.48849E-01         2.14889E-01         1.62664E+04         6.74975E-01         5.16753E+03         1.82446E+04         1.36527E+04         4.59194E+03
+          3.42008E-03         2.23128E-03        -1.41085E-04         2.14889E-01         3.59520E-01         2.14889E-01         1.57818E+04         6.74975E-01         5.04584E+03         1.77604E+04         1.33118E+04         4.44862E+03
+          3.42008E-03         2.40111E-03        -1.65800E-04         2.14889E-01         3.70190E-01         2.14889E-01         1.52958E+04         6.74974E-01         4.92326E+03         1.72736E+04         1.29684E+04         4.30519E+03
+          3.42008E-03         2.57094E-03        -1.92327E-04         2.14889E-01         3.80861E-01         2.14889E-01         1.48091E+04         6.74974E-01         4.79995E+03         1.67851E+04         1.26232E+04         4.16192E+03
+          3.42008E-03         2.74077E-03        -2.20667E-04         2.14889E-01         3.91532E-01         2.14889E-01         1.43226E+04         6.74974E-01         4.67611E+03         1.62956E+04         1.22765E+04         4.01907E+03
+          3.42008E-03         2.91059E-03        -2.50818E-04         2.14889E-01         4.02202E-01         2.14889E-01         1.38371E+04         6.74973E-01         4.55193E+03         1.58060E+04         1.19291E+04         3.87690E+03
+          3.42008E-03         3.08042E-03        -2.82782E-04         2.14889E-01         4.12873E-01         2.14889E-01         1.33535E+04         6.74973E-01         4.42757E+03         1.53169E+04         1.15812E+04         3.73566E+03
+          3.42008E-03         3.25025E-03        -3.16558E-04         2.14889E-01         4.23543E-01         2.14889E-01         1.28725E+04         6.74973E-01         4.30322E+03         1.48291E+04         1.12336E+04         3.59559E+03
+          3.42008E-03         3.42008E-03        -3.52146E-04         2.14888E-01         4.34214E-01         2.14889E-01         1.23950E+04         6.74972E-01         4.17906E+03         1.43435E+04         1.08865E+04         3.45692E+03
+          3.42008E-03         3.58990E-03        -3.89546E-04         2.14888E-01         4.44884E-01         2.14889E-01         1.19215E+04         6.74972E-01         4.05525E+03         1.38605E+04         1.05406E+04         3.31988E+03
+          3.42008E-03         3.75973E-03        -4.28759E-04         2.14888E-01         4.55555E-01         2.14889E-01         1.14529E+04         6.74972E-01         3.93195E+03         1.33810E+04         1.01963E+04         3.18468E+03
+          3.42008E-03         3.92956E-03        -4.69783E-04         2.14888E-01         4.66225E-01         2.14889E-01         1.09897E+04         6.74971E-01         3.80933E+03         1.29056E+04         9.85411E+03         3.05152E+03
+          3.42008E-03         4.09939E-03        -5.12620E-04         2.14888E-01         4.76896E-01         2.14888E-01         1.05328E+04         6.74971E-01         3.68755E+03         1.24350E+04         9.51437E+03         2.92061E+03
+          3.42008E-03         4.26921E-03        -5.57269E-04         2.14888E-01         4.87567E-01         2.14888E-01         1.00827E+04         6.74971E-01         3.56675E+03         1.19697E+04         9.17756E+03         2.79214E+03
+          3.42008E-03         4.43904E-03        -6.03730E-04         2.14888E-01         4.98237E-01         2.14888E-01         9.63992E+03         6.74971E-01         3.44708E+03         1.15103E+04         8.84408E+03         2.66626E+03
+          3.42008E-03         4.60887E-03        -6.52003E-04         2.14887E-01         5.08908E-01         2.14888E-01         9.20513E+03         6.74971E-01         3.32867E+03         1.10575E+04         8.51434E+03         2.54316E+03
+          3.42008E-03         4.77869E-03        -7.02089E-04         2.14887E-01         5.19578E-01         2.14888E-01         8.77883E+03         6.74971E-01         3.21167E+03         1.06117E+04         8.18872E+03         2.42298E+03
+          3.42008E-03         4.94852E-03        -7.53987E-04         2.14887E-01         5.30249E-01         2.14888E-01         8.36151E+03         6.74970E-01         3.09620E+03         1.01734E+04         7.86757E+03         2.30585E+03
+          3.42008E-03         5.11835E-03        -8.07697E-04         2.14887E-01         5.40919E-01         2.14888E-01         7.95364E+03         6.74971E-01         2.98238E+03         9.74316E+03         7.55124E+03         2.19192E+03
+          3.42008E-03         5.28818E-03        -8.63219E-04         2.14887E-01         5.51590E-01         2.14888E-01         7.55563E+03         6.74971E-01         2.87032E+03         9.32135E+03         7.24005E+03         2.08130E+03
+          3.42008E-03         5.45800E-03        -9.20554E-04         2.14886E-01         5.62261E-01         2.14888E-01         7.16787E+03         6.74971E-01         2.76014E+03         8.90841E+03         6.93432E+03         1.97409E+03
+          3.42008E-03         5.62783E-03        -9.79700E-04         2.14886E-01         5.72931E-01         2.14889E-01         6.79073E+03         6.74971E-01         2.65192E+03         8.50471E+03         6.63432E+03         1.87039E+03
+          3.42008E-03         5.79766E-03        -1.04066E-03         2.14886E-01         5.83602E-01         2.14889E-01         6.42452E+03         6.74972E-01         2.54577E+03         8.11061E+03         6.34034E+03         1.77027E+03
+          3.42008E-03         5.96749E-03        -1.10343E-03         2.14886E-01         5.94272E-01         2.14889E-01         6.06951E+03         6.74972E-01         2.44178E+03         7.72642E+03         6.05261E+03         1.67382E+03
+          3.42008E-03         6.13731E-03        -1.16801E-03         2.14886E-01         6.04943E-01         2.14889E-01         5.72597E+03         6.74973E-01         2.34001E+03         7.35243E+03         5.77136E+03         1.58107E+03
+          3.42008E-03         6.30714E-03        -1.23441E-03         2.14885E-01         6.15613E-01         2.14889E-01         5.39409E+03         6.74973E-01         2.24054E+03         6.98890E+03         5.49681E+03         1.49209E+03
+          3.42008E-03         6.47697E-03        -1.30262E-03         2.14885E-01         6.26284E-01         2.14889E-01         5.07404E+03         6.74974E-01         2.14345E+03         6.63604E+03         5.22914E+03         1.40690E+03
+          3.42008E-03         6.64680E-03        -1.37264E-03         2.14885E-01         6.36955E-01         2.14889E-01         4.76598E+03         6.74975E-01         2.04878E+03         6.29405E+03         4.96852E+03         1.32552E+03
+          3.42008E-03         6.81662E-03        -1.44447E-03         2.14885E-01         6.47625E-01         2.14890E-01         4.47000E+03         6.74977E-01         1.95658E+03         5.96308E+03         4.71510E+03         1.24798E+03
+          3.42008E-03         6.98645E-03        -1.51811E-03         2.14884E-01         6.58296E-01         2.14890E-01         4.18618E+03         6.74978E-01         1.86690E+03         5.64328E+03         4.46902E+03         1.17426E+03
+          3.42008E-03         7.15628E-03        -1.59357E-03         2.14884E-01         6.68966E-01         2.14890E-01         3.91454E+03         6.74979E-01         1.77978E+03         5.33473E+03         4.23037E+03         1.10436E+03
+          3.42008E-03         7.32611E-03        -1.67084E-03         2.14884E-01         6.79637E-01         2.14890E-01         3.65511E+03         6.74981E-01         1.69524E+03         5.03751E+03         3.99926E+03         1.03826E+03
+          3.42008E-03         7.49593E-03        -1.74992E-03         2.14884E-01         6.90307E-01         2.14891E-01         3.40784E+03         6.74983E-01         1.61331E+03         4.75167E+03         3.77575E+03         9.75922E+02
+          3.42008E-03         7.66576E-03        -1.83082E-03         2.14883E-01         7.00978E-01         2.14891E-01         3.17269E+03         6.74985E-01         1.53399E+03         4.47721E+03         3.55989E+03         9.17315E+02
+          3.42008E-03         7.83559E-03        -1.91352E-03         2.14883E-01         7.11649E-01         2.14892E-01         2.94957E+03         6.74987E-01         1.45731E+03         4.21412E+03         3.35174E+03         8.62387E+02
+          3.42008E-03         8.00542E-03        -1.99804E-03         2.14883E-01         7.22319E-01         2.14892E-01         2.73836E+03         6.74990E-01         1.38325E+03         3.96237E+03         3.15129E+03         8.11081E+02
+          3.42008E-03         8.17524E-03        -2.08437E-03         2.14883E-01         7.32990E-01         2.14893E-01         2.53892E+03         6.74992E-01         1.31182E+03         3.72189E+03         2.95856E+03         7.63331E+02
+          3.42008E-03         8.34507E-03        -2.17251E-03         2.14882E-01         7.43660E-01         2.14893E-01         2.35109E+03         6.74995E-01         1.24301E+03         3.49259E+03         2.77352E+03         7.19064E+02
+          3.42008E-03         8.51490E-03        -2.26247E-03         2.14882E-01         7.54331E-01         2.14894E-01         2.17467E+03         6.74999E-01         1.17679E+03         3.27435E+03         2.59615E+03         6.78199E+02
+          3.42008E-03         8.68473E-03        -2.35424E-03         2.14882E-01         7.65001E-01         2.14894E-01         2.00946E+03         6.75002E-01         1.11315E+03         3.06705E+03         2.42640E+03         6.40649E+02
+          3.42008E-03         8.85455E-03        -2.44782E-03         2.14881E-01         7.75672E-01         2.14895E-01         1.85520E+03         6.75006E-01         1.05205E+03         2.87053E+03         2.26421E+03         6.06320E+02
+          3.42008E-03         9.02438E-03        -2.54321E-03         2.14881E-01         7.86343E-01         2.14896E-01         1.71166E+03         6.75010E-01         9.93460E+02         2.68461E+03         2.10950E+03         5.75112E+02
+          3.42008E-03         9.19421E-03        -2.64041E-03         2.14881E-01         7.97013E-01         2.14897E-01         1.57855E+03         6.75014E-01         9.37342E+02         2.50910E+03         1.96218E+03         5.46923E+02
+          3.42008E-03         9.36403E-03        -2.73943E-03         2.14880E-01         8.07684E-01         2.14898E-01         1.45558E+03         6.75019E-01         8.83652E+02         2.34379E+03         1.82215E+03         5.21641E+02
+          3.42008E-03         9.53386E-03        -2.84026E-03         2.14880E-01         8.18354E-01         2.14899E-01         1.34245E+03         6.75024E-01         8.32338E+02         2.18845E+03         1.68929E+03         4.99155E+02
+          3.42008E-03         9.70369E-03        -2.94290E-03         2.14880E-01         8.29025E-01         2.14900E-01         1.23883E+03         6.75029E-01         7.83348E+02         2.04283E+03         1.56349E+03         4.79346E+02
+          3.42008E-03         9.87352E-03        -3.04736E-03         2.14879E-01         8.39695E-01         2.14901E-01         1.14440E+03         6.75035E-01         7.36625E+02         1.90669E+03         1.44459E+03         4.62096E+02
+          3.42008E-03         1.00433E-02        -3.15362E-03         2.14879E-01         8.50366E-01         2.14902E-01         1.05879E+03         6.75041E-01         6.92108E+02         1.77975E+03         1.33246E+03         4.47282E+02
+          3.42008E-03         1.02132E-02        -3.26170E-03         2.14878E-01         8.61037E-01         2.14903E-01         9.81674E+02         6.75047E-01         6.49732E+02         1.66172E+03         1.22694E+03         4.34778E+02
+          3.42008E-03         1.03830E-02        -3.37160E-03         2.14878E-01         8.71707E-01         2.14905E-01         9.12673E+02         6.75054E-01         6.09430E+02         1.55233E+03         1.12787E+03         4.24460E+02
+          3.42008E-03         1.05528E-02        -3.48330E-03         2.14878E-01         8.82378E-01         2.14906E-01         8.51423E+02         6.75062E-01         5.71133E+02         1.45128E+03         1.03507E+03         4.16200E+02
+          3.42008E-03         1.07227E-02        -3.59682E-03         2.14877E-01         8.93048E-01         2.14907E-01         7.97549E+02         6.75069E-01         5.34770E+02         1.35824E+03         9.48374E+02         4.09871E+02
+          3.42008E-03         1.08925E-02        -3.71215E-03         2.14877E-01         9.03719E-01         2.14909E-01         7.50675E+02         6.75077E-01         5.00269E+02         1.27293E+03         8.67586E+02         4.05343E+02
+          3.42008E-03         1.10623E-02        -3.82929E-03         2.14877E-01         9.14389E-01         2.14911E-01         7.10421E+02         6.75086E-01         4.67555E+02         1.19501E+03         7.92519E+02         4.02491E+02
+          3.42008E-03         1.12321E-02        -3.94824E-03         2.14876E-01         9.25060E-01         2.14912E-01         6.76407E+02         6.75095E-01         4.36557E+02         1.12417E+03         7.22981E+02         4.01187E+02
+          3.42008E-03         1.14020E-02        -4.06901E-03         2.14876E-01         9.35731E-01         2.14914E-01         6.48253E+02         6.75105E-01         4.07200E+02         1.06008E+03         6.58772E+02         4.01306E+02
+          3.42008E-03         1.15718E-02        -4.19159E-03         2.14875E-01         9.46401E-01         2.14916E-01         6.25580E+02         6.75115E-01         3.79413E+02         1.00242E+03         5.99691E+02         4.02724E+02
+          3.42008E-03         1.17416E-02        -4.31598E-03         2.14875E-01         9.57072E-01         2.14918E-01         6.08013E+02         6.75125E-01         3.53126E+02         9.50854E+02         5.45534E+02         4.05320E+02
+          3.42008E-03         1.19114E-02        -4.44218E-03         2.14874E-01         9.67742E-01         2.14920E-01         5.95180E+02         6.75136E-01         3.28272E+02         9.05068E+02         4.96095E+02         4.08973E+02
+          3.42008E-03         1.20813E-02        -4.57020E-03         2.14874E-01         9.78413E-01         2.14923E-01         5.86717E+02         6.75148E-01         3.04788E+02         8.64734E+02         4.51167E+02         4.13567E+02
+          3.42008E-03         1.22511E-02        -4.70003E-03         2.14874E-01         9.89083E-01         2.14925E-01         5.82261E+02         6.75160E-01         2.82613E+02         8.29531E+02         4.10542E+02         4.18988E+02
+          3.42008E-03         1.24209E-02        -4.83167E-03         2.14873E-01         9.99754E-01         2.14927E-01         5.81462E+02         6.75173E-01         2.61695E+02         7.99140E+02         3.74014E+02         4.25126E+02
+          3.42008E-03         1.25908E-02        -4.96512E-03         2.14873E-01         1.01042E+00         2.14930E-01         5.83973E+02         6.75186E-01         2.41987E+02         7.73247E+02         3.41374E+02         4.31873E+02
+          3.42008E-03         1.27606E-02        -5.10039E-03         2.14872E-01         1.02110E+00         2.14933E-01         5.89459E+02         6.75200E-01         2.23450E+02         7.51545E+02         3.12419E+02         4.39126E+02
+          3.42008E-03         1.29304E-02        -5.23747E-03         2.14872E-01         1.03177E+00         2.14936E-01         5.97595E+02         6.75215E-01         2.06054E+02         7.33729E+02         2.86943E+02         4.46786E+02
+          3.42008E-03         1.31002E-02        -5.37636E-03         2.14871E-01         1.04244E+00         2.14939E-01         6.08063E+02         6.75230E-01         1.89782E+02         7.19503E+02         2.64745E+02         4.54758E+02
+          3.42008E-03         1.32701E-02        -5.51706E-03         2.14871E-01         1.05311E+00         2.14942E-01         6.20560E+02         6.75246E-01         1.74629E+02         7.08577E+02         2.45627E+02         4.62950E+02
+          3.42008E-03         1.34399E-02        -5.65958E-03         2.14870E-01         1.06378E+00         2.14945E-01         6.34792E+02         6.75263E-01         1.60606E+02         7.00670E+02         2.29393E+02         4.71278E+02
+          3.42008E-03         1.36097E-02        -5.80391E-03         2.14870E-01         1.07445E+00         2.14948E-01         6.50479E+02         6.75280E-01         1.47740E+02         6.95509E+02         2.15851E+02         4.79658E+02
+          3.42008E-03         1.37795E-02        -5.95005E-03         2.14869E-01         1.08512E+00         2.14952E-01         6.67352E+02         6.75299E-01         1.36077E+02         6.92828E+02         2.04813E+02         4.88015E+02
+          3.42008E-03         1.39494E-02        -6.09801E-03         2.14869E-01         1.09579E+00         2.14955E-01         6.85155E+02         6.75317E-01         1.25684E+02         6.92372E+02         1.96096E+02         4.96276E+02
+          3.42008E-03         1.41192E-02        -6.24778E-03         2.14868E-01         1.10646E+00         2.14959E-01         7.03647E+02         6.75337E-01         1.16641E+02         6.93895E+02         1.89520E+02         5.04374E+02
+          3.42008E-03         1.42890E-02        -6.39936E-03         2.14868E-01         1.11713E+00         2.14963E-01         7.22600E+02         6.75357E-01         1.09039E+02         6.97160E+02         1.84913E+02         5.12247E+02
+          3.42008E-03         1.44589E-02        -6.55275E-03         2.14867E-01         1.12780E+00         2.14967E-01         7.41797E+02         6.75379E-01         1.02968E+02         7.01943E+02         1.82106E+02         5.19837E+02
+          3.42008E-03         1.46287E-02        -6.70796E-03         2.14867E-01         1.13847E+00         2.14971E-01         7.61038E+02         6.75401E-01         9.84918E+01         7.08027E+02         1.80936E+02         5.27091E+02
+          3.42008E-03         1.47985E-02        -6.86497E-03         2.14866E-01         1.14914E+00         2.14976E-01         7.80135E+02         6.75424E-01         9.56345E+01         7.15207E+02         1.81245E+02         5.33962E+02
+          3.42008E-03         1.49683E-02        -7.02381E-03         2.14866E-01         1.15981E+00         2.14980E-01         7.98915E+02         6.75447E-01         9.43574E+01         7.23290E+02         1.82883E+02         5.40407E+02
+          3.42008E-03         1.51382E-02        -7.18445E-03         2.14865E-01         1.17048E+00         2.14985E-01         8.17219E+02         6.75472E-01         9.45557E+01         7.32091E+02         1.85704E+02         5.46387E+02
+          3.42008E-03         1.53080E-02        -7.34691E-03         2.14865E-01         1.18115E+00         2.14990E-01         8.34901E+02         6.75498E-01         9.60672E+01         7.41439E+02         1.89570E+02         5.51870E+02
+          3.42008E-03         1.54778E-02        -7.51118E-03         2.14864E-01         1.19182E+00         2.14995E-01         8.51827E+02         6.75524E-01         9.86936E+01         7.51172E+02         1.94347E+02         5.56825E+02
+          3.42008E-03         1.56476E-02        -7.67726E-03         2.14863E-01         1.20249E+00         2.15000E-01         8.67880E+02         6.75552E-01         1.02224E+02         7.61139E+02         1.99911E+02         5.61228E+02
+          3.42008E-03         1.58175E-02        -7.84515E-03         2.14863E-01         1.21317E+00         2.15006E-01         8.82952E+02         6.75580E-01         1.06458E+02         7.71200E+02         2.06140E+02         5.65060E+02
+          3.42008E-03         1.59873E-02        -8.01486E-03         2.14862E-01         1.22384E+00         2.15012E-01         8.96951E+02         6.75610E-01         1.11211E+02         7.81226E+02         2.12923E+02         5.68303E+02
+          3.42008E-03         1.61571E-02        -8.18638E-03         2.14862E-01         1.23451E+00         2.15018E-01         9.09796E+02         6.75640E-01         1.16330E+02         7.91098E+02         2.20151E+02         5.70947E+02
+          3.42008E-03         1.63270E-02        -8.35972E-03         2.14861E-01         1.24518E+00         2.15024E-01         9.21418E+02         6.75672E-01         1.21683E+02         8.00706E+02         2.27725E+02         5.72981E+02
+          3.42008E-03         1.64968E-02        -8.53486E-03         2.14860E-01         1.25585E+00         2.15030E-01         9.31761E+02         6.75704E-01         1.27165E+02         8.09954E+02         2.35551E+02         5.74403E+02
+          3.42008E-03         1.66666E-02        -8.71182E-03         2.14860E-01         1.26652E+00         2.15036E-01         9.40778E+02         6.75738E-01         1.32690E+02         8.18751E+02         2.43541E+02         5.75210E+02
+          3.42008E-03         1.68364E-02        -8.89060E-03         2.14859E-01         1.27719E+00         2.15043E-01         9.48435E+02         6.75773E-01         1.38188E+02         8.27018E+02         2.51613E+02         5.75405E+02
+          3.42008E-03         1.70063E-02        -9.07118E-03         2.14859E-01         1.28786E+00         2.15050E-01         9.54706E+02         6.75809E-01         1.43605E+02         8.34687E+02         2.59693E+02         5.74993E+02
+          3.42008E-03         1.71761E-02        -9.25358E-03         2.14858E-01         1.29853E+00         2.15057E-01         9.59578E+02         6.75846E-01         1.48895E+02         8.41695E+02         2.67712E+02         5.73984E+02
+          3.42008E-03         1.73459E-02        -9.43779E-03         2.14857E-01         1.30920E+00         2.15065E-01         9.63044E+02         6.75884E-01         1.54022E+02         8.47991E+02         2.75605E+02         5.72386E+02
+          3.42008E-03         1.75158E-02        -9.62381E-03         2.14857E-01         1.31987E+00         2.15072E-01         9.65107E+02         6.75923E-01         1.58956E+02         8.53531E+02         2.83316E+02         5.70215E+02
+          3.42008E-03         1.76856E-02        -9.81165E-03         2.14856E-01         1.33054E+00         2.15080E-01         9.65780E+02         6.75964E-01         1.63676E+02         8.58279E+02         2.90793E+02         5.67486E+02
+          3.42008E-03         1.78554E-02        -1.00013E-02         2.14855E-01         1.34121E+00         2.15088E-01         9.65081E+02         6.76006E-01         1.68160E+02         8.62205E+02         2.97988E+02         5.64217E+02
+          3.42008E-03         1.80252E-02        -1.01928E-02         2.14855E-01         1.35188E+00         2.15096E-01         9.63036E+02         6.76049E-01         1.72396E+02         8.65289E+02         3.04862E+02         5.60427E+02
+          3.42008E-03         1.81951E-02        -1.03860E-02         2.14854E-01         1.36255E+00         2.15105E-01         9.59679E+02         6.76094E-01         1.76369E+02         8.67516E+02         3.11376E+02         5.56140E+02
+          3.42008E-03         1.83649E-02        -1.05811E-02         2.14853E-01         1.37322E+00         2.15114E-01         9.55047E+02         6.76140E-01         1.80073E+02         8.68878E+02         3.17501E+02         5.51377E+02
+          3.42008E-03         1.85347E-02        -1.07780E-02         2.14853E-01         1.38389E+00         2.15123E-01         9.49184E+02         6.76187E-01         1.83499E+02         8.69373E+02         3.23210E+02         5.46163E+02
+          3.42008E-03         1.87045E-02        -1.09767E-02         2.14852E-01         1.39457E+00         2.15132E-01         9.42141E+02         6.76235E-01         1.86642E+02         8.69003E+02         3.28479E+02         5.40524E+02
+          3.42008E-03         1.88744E-02        -1.11773E-02         2.14851E-01         1.40524E+00         2.15142E-01         9.33970E+02         6.76285E-01         1.89501E+02         8.67777E+02         3.33291E+02         5.34487E+02
+          3.42008E-03         1.90442E-02        -1.13796E-02         2.14851E-01         1.41591E+00         2.15152E-01         9.24728E+02         6.76337E-01         1.92072E+02         8.65709E+02         3.37631E+02         5.28078E+02
+          3.42008E-03         1.92140E-02        -1.15838E-02         2.14850E-01         1.42658E+00         2.15162E-01         9.14475E+02         6.76390E-01         1.94356E+02         8.62816E+02         3.41490E+02         5.21326E+02
+          3.42008E-03         1.93839E-02        -1.17897E-02         2.14849E-01         1.43725E+00         2.15173E-01         9.03275E+02         6.76444E-01         1.96354E+02         8.59119E+02         3.44860E+02         5.14259E+02
+          3.42008E-03         1.95537E-02        -1.19975E-02         2.14849E-01         1.44792E+00         2.15183E-01         8.91193E+02         6.76500E-01         1.98068E+02         8.54644E+02         3.47738E+02         5.06906E+02
+          3.42008E-03         1.97235E-02        -1.22071E-02         2.14848E-01         1.45859E+00         2.15194E-01         8.78297E+02         6.76558E-01         1.99501E+02         8.49419E+02         3.50123E+02         4.99296E+02
+          3.42008E-03         1.98933E-02        -1.24185E-02         2.14847E-01         1.46926E+00         2.15206E-01         8.64653E+02         6.76617E-01         2.00657E+02         8.43474E+02         3.52017E+02         4.91456E+02
+          3.42008E-03         2.00632E-02        -1.26317E-02         2.14846E-01         1.47993E+00         2.15217E-01         8.50333E+02         6.76677E-01         2.01540E+02         8.36843E+02         3.53427E+02         4.83417E+02
+          3.42008E-03         2.02330E-02        -1.28468E-02         2.14846E-01         1.49060E+00         2.15229E-01         8.35405E+02         6.76739E-01         2.02156E+02         8.29563E+02         3.54358E+02         4.75205E+02
+          3.42008E-03         2.04028E-02        -1.30636E-02         2.14845E-01         1.50127E+00         2.15242E-01         8.19939E+02         6.76803E-01         2.02511E+02         8.21670E+02         3.54821E+02         4.66849E+02
+          3.42008E-03         2.05726E-02        -1.32823E-02         2.14844E-01         1.51194E+00         2.15254E-01         8.04005E+02         6.76869E-01         2.02612E+02         8.13203E+02         3.54827E+02         4.58376E+02
+          3.42008E-03         2.07425E-02        -1.35028E-02         2.14843E-01         1.52261E+00         2.15267E-01         7.87671E+02         6.76936E-01         2.02466E+02         8.04203E+02         3.54391E+02         4.49812E+02
+          3.42008E-03         2.09123E-02        -1.37250E-02         2.14843E-01         1.53328E+00         2.15281E-01         7.71006E+02         6.77005E-01         2.02079E+02         7.94710E+02         3.53526E+02         4.41184E+02
+          3.42008E-03         2.10821E-02        -1.39491E-02         2.14842E-01         1.54395E+00         2.15294E-01         7.54075E+02         6.77076E-01         2.01461E+02         7.84765E+02         3.52250E+02         4.32516E+02
+          3.42008E-03         2.12520E-02        -1.41751E-02         2.14841E-01         1.55462E+00         2.15308E-01         7.36944E+02         6.77149E-01         2.00619E+02         7.74411E+02         3.50579E+02         4.23832E+02
+          3.42008E-03         2.14218E-02        -1.44028E-02         2.14840E-01         1.56529E+00         2.15323E-01         7.19674E+02         6.77223E-01         1.99562E+02         7.63689E+02         3.48534E+02         4.15155E+02
+          3.42008E-03         2.15916E-02        -1.46323E-02         2.14840E-01         1.57596E+00         2.15337E-01         7.02328E+02         6.77299E-01         1.98299E+02         7.52640E+02         3.46132E+02         4.06508E+02
+          3.42008E-03         2.17614E-02        -1.48637E-02         2.14839E-01         1.58664E+00         2.15352E-01         6.84962E+02         6.77377E-01         1.96837E+02         7.41307E+02         3.43396E+02         3.97911E+02
+          3.42008E-03         2.19313E-02        -1.50968E-02         2.14838E-01         1.59731E+00         2.15368E-01         6.67635E+02         6.77457E-01         1.95187E+02         7.29729E+02         3.40344E+02         3.89384E+02
+          3.42008E-03         2.21011E-02        -1.53318E-02         2.14837E-01         1.60798E+00         2.15384E-01         6.50397E+02         6.77539E-01         1.93358E+02         7.17946E+02         3.37000E+02         3.80946E+02
+          3.42008E-03         2.22709E-02        -1.55686E-02         2.14836E-01         1.61865E+00         2.15400E-01         6.33301E+02         6.77623E-01         1.91358E+02         7.05998E+02         3.33384E+02         3.72614E+02
+          3.42008E-03         2.24407E-02        -1.58072E-02         2.14836E-01         1.62932E+00         2.15416E-01         6.16393E+02         6.77709E-01         1.89196E+02         6.93922E+02         3.29517E+02         3.64404E+02
+          3.42008E-03         2.26106E-02        -1.60477E-02         2.14835E-01         1.63999E+00         2.15433E-01         5.99717E+02         6.77798E-01         1.86882E+02         6.81754E+02         3.25423E+02         3.56331E+02
+          3.42008E-03         2.27804E-02        -1.62899E-02         2.14834E-01         1.65066E+00         2.15451E-01         5.83316E+02         6.77888E-01         1.84426E+02         6.69530E+02         3.21121E+02         3.48409E+02
+          3.42008E-03         2.29502E-02        -1.65339E-02         2.14833E-01         1.66133E+00         2.15468E-01         5.67228E+02         6.77980E-01         1.81834E+02         6.57284E+02         3.16634E+02         3.40650E+02
+          3.42008E-03         2.31201E-02        -1.67798E-02         2.14832E-01         1.67200E+00         2.15487E-01         5.51486E+02         6.78074E-01         1.79118E+02         6.45048E+02         3.11982E+02         3.33065E+02
+          3.42008E-03         2.32899E-02        -1.70275E-02         2.14831E-01         1.68267E+00         2.15505E-01         5.36124E+02         6.78171E-01         1.76285E+02         6.32851E+02         3.07187E+02         3.25665E+02
+          3.42008E-03         2.34597E-02        -1.72770E-02         2.14831E-01         1.69334E+00         2.15524E-01         5.21169E+02         6.78269E-01         1.73344E+02         6.20724E+02         3.02267E+02         3.18457E+02
+          3.42008E-03         2.36295E-02        -1.75283E-02         2.14830E-01         1.70401E+00         2.15544E-01         5.06648E+02         6.78370E-01         1.70304E+02         6.08693E+02         2.97244E+02         3.11449E+02
+          3.42008E-03         2.37994E-02        -1.77814E-02         2.14829E-01         1.71468E+00         2.15563E-01         4.92581E+02         6.78474E-01         1.67173E+02         5.96784E+02         2.92135E+02         3.04649E+02
+          3.42008E-03         2.39692E-02        -1.80363E-02         2.14828E-01         1.72535E+00         2.15584E-01         4.78989E+02         6.78579E-01         1.63959E+02         5.85020E+02         2.86960E+02         2.98060E+02
+          3.42008E-03         2.41390E-02        -1.82931E-02         2.14827E-01         1.73602E+00         2.15605E-01         4.65888E+02         6.78687E-01         1.60669E+02         5.73422E+02         2.81736E+02         2.91687E+02
+          3.42008E-03         2.43088E-02        -1.85516E-02         2.14826E-01         1.74669E+00         2.15626E-01         4.53290E+02         6.78797E-01         1.57313E+02         5.62012E+02         2.76479E+02         2.85533E+02
+          3.42008E-03         2.44787E-02        -1.88120E-02         2.14825E-01         1.75736E+00         2.15647E-01         4.41205E+02         6.78910E-01         1.53896E+02         5.50806E+02         2.71205E+02         2.79600E+02
+          3.42008E-03         2.46485E-02        -1.90742E-02         2.14824E-01         1.76804E+00         2.15670E-01         4.29642E+02         6.79025E-01         1.50427E+02         5.39821E+02         2.65931E+02         2.73890E+02
+          3.42008E-03         2.48183E-02        -1.93382E-02         2.14823E-01         1.77871E+00         2.15692E-01         4.18605E+02         6.79142E-01         1.46912E+02         5.29071E+02         2.60670E+02         2.68401E+02
+          3.42008E-03         2.49882E-02        -1.96040E-02         2.14823E-01         1.78938E+00         2.15715E-01         4.08097E+02         6.79262E-01         1.43359E+02         5.18570E+02         2.55435E+02         2.63134E+02
+          3.42008E-03         2.51580E-02        -1.98716E-02         2.14822E-01         1.80005E+00         2.15739E-01         3.98116E+02         6.79385E-01         1.39774E+02         5.08327E+02         2.50240E+02         2.58087E+02
+          3.42008E-03         2.53278E-02        -2.01410E-02         2.14821E-01         1.81072E+00         2.15763E-01         3.88661E+02         6.79510E-01         1.36163E+02         4.98354E+02         2.45096E+02         2.53258E+02
+          3.42008E-03         2.54976E-02        -2.04123E-02         2.14820E-01         1.82139E+00         2.15787E-01         3.79726E+02         6.79637E-01         1.32532E+02         4.88657E+02         2.40013E+02         2.48644E+02
+          3.42008E-03         2.56675E-02        -2.06854E-02         2.14819E-01         1.83206E+00         2.15813E-01         3.71306E+02         6.79768E-01         1.28888E+02         4.79242E+02         2.35002E+02         2.44240E+02
+          3.42008E-03         2.58373E-02        -2.09603E-02         2.14818E-01         1.84273E+00         2.15838E-01         3.63392E+02         6.79901E-01         1.25237E+02         4.70115E+02         2.30072E+02         2.40043E+02
+          3.42008E-03         2.60071E-02        -2.12369E-02         2.14817E-01         1.85340E+00         2.15864E-01         3.55973E+02         6.80036E-01         1.21582E+02         4.61278E+02         2.25231E+02         2.36047E+02
+          3.42008E-03         2.61769E-02        -2.15155E-02         2.14816E-01         1.86407E+00         2.15891E-01         3.49037E+02         6.80175E-01         1.17932E+02         4.52734E+02         2.20486E+02         2.32248E+02
+          3.58990E-03         8.72665E-04        -4.60023E-05         2.25560E-01         2.74155E-01         2.25560E-01         1.97833E+04         7.30717E-01         5.19743E+03         2.04234E+04         1.52546E+04         5.16875E+03
+          3.58990E-03         1.04249E-03        -5.62202E-05         2.25560E-01         2.84826E-01         2.25560E-01         1.93383E+04         7.30717E-01         5.10260E+03         2.00049E+04         1.49599E+04         5.04492E+03
+          3.58990E-03         1.21232E-03        -6.82502E-05         2.25560E-01         2.95496E-01         2.25560E-01         1.88856E+04         7.30717E-01         5.00584E+03         1.95785E+04         1.46593E+04         4.91917E+03
+          3.58990E-03         1.38215E-03        -8.20923E-05         2.25560E-01         3.06167E-01         2.25560E-01         1.84260E+04         7.30717E-01         4.90731E+03         1.91450E+04         1.43532E+04         4.79176E+03
+          3.58990E-03         1.55197E-03        -9.77466E-05         2.25560E-01         3.16838E-01         2.25560E-01         1.79603E+04         7.30716E-01         4.80718E+03         1.87052E+04         1.40423E+04         4.66295E+03
+          3.58990E-03         1.72180E-03        -1.15213E-04         2.25560E-01         3.27508E-01         2.25560E-01         1.74894E+04         7.30716E-01         4.70560E+03         1.82599E+04         1.37269E+04         4.53299E+03
+          3.58990E-03         1.89163E-03        -1.34492E-04         2.25560E-01         3.38179E-01         2.25560E-01         1.70141E+04         7.30716E-01         4.60274E+03         1.78098E+04         1.34076E+04         4.40215E+03
+          3.58990E-03         2.06146E-03        -1.55582E-04         2.25560E-01         3.48849E-01         2.25560E-01         1.65354E+04         7.30715E-01         4.49877E+03         1.73556E+04         1.30850E+04         4.27068E+03
+          3.58990E-03         2.23128E-03        -1.78485E-04         2.25560E-01         3.59520E-01         2.25560E-01         1.60541E+04         7.30715E-01         4.39384E+03         1.68983E+04         1.27594E+04         4.13884E+03
+          3.58990E-03         2.40111E-03        -2.03200E-04         2.25560E-01         3.70190E-01         2.25560E-01         1.55710E+04         7.30715E-01         4.28812E+03         1.64384E+04         1.24316E+04         4.00686E+03
+          3.58990E-03         2.57094E-03        -2.29728E-04         2.25560E-01         3.80861E-01         2.25560E-01         1.50870E+04         7.30714E-01         4.18178E+03         1.59769E+04         1.21019E+04         3.87500E+03
+          3.58990E-03         2.74077E-03        -2.58067E-04         2.25559E-01         3.91532E-01         2.25560E-01         1.46028E+04         7.30714E-01         4.07496E+03         1.55143E+04         1.17708E+04         3.74350E+03
+          3.58990E-03         2.91059E-03        -2.88218E-04         2.25559E-01         4.02202E-01         2.25559E-01         1.41193E+04         7.30714E-01         3.96782E+03         1.50515E+04         1.14389E+04         3.61259E+03
+          3.58990E-03         3.08042E-03        -3.20182E-04         2.25559E-01         4.12873E-01         2.25559E-01         1.36373E+04         7.30713E-01         3.86053E+03         1.45891E+04         1.11067E+04         3.48249E+03
+          3.58990E-03         3.25025E-03        -3.53958E-04         2.25559E-01         4.23543E-01         2.25559E-01         1.31575E+04         7.30713E-01         3.75323E+03         1.41279E+04         1.07745E+04         3.35344E+03
+          3.58990E-03         3.42008E-03        -3.89546E-04         2.25559E-01         4.34214E-01         2.25559E-01         1.26807E+04         7.30713E-01         3.64608E+03         1.36686E+04         1.04429E+04         3.22564E+03
+          3.58990E-03         3.58990E-03        -4.26946E-04         2.25559E-01         4.44884E-01         2.25559E-01         1.22077E+04         7.30712E-01         3.53921E+03         1.32117E+04         1.01124E+04         3.09930E+03
+          3.58990E-03         3.75973E-03        -4.66159E-04         2.25559E-01         4.55555E-01         2.25559E-01         1.17390E+04         7.30712E-01         3.43277E+03         1.27580E+04         9.78339E+03         2.97461E+03
+          3.58990E-03         3.92956E-03        -5.07183E-04         2.25559E-01         4.66225E-01         2.25559E-01         1.12755E+04         7.30712E-01         3.32691E+03         1.23081E+04         9.45629E+03         2.85178E+03
+          3.58990E-03         4.09939E-03        -5.50020E-04         2.25558E-01         4.76896E-01         2.25559E-01         1.08177E+04         7.30711E-01         3.22174E+03         1.18625E+04         9.13155E+03         2.73098E+03
+          3.58990E-03         4.26921E-03        -5.94669E-04         2.25558E-01         4.87567E-01         2.25559E-01         1.03663E+04         7.30711E-01         3.11741E+03         1.14219E+04         8.80956E+03         2.61237E+03
+          3.58990E-03         4.43904E-03        -6.41130E-04         2.25558E-01         4.98237E-01         2.25559E-01         9.92183E+03         7.30711E-01         3.01404E+03         1.09868E+04         8.49072E+03         2.49613E+03
+          3.58990E-03         4.60887E-03        -6.89404E-04         2.25558E-01         5.08908E-01         2.25559E-01         9.48491E+03         7.30711E-01         2.91175E+03         1.05578E+04         8.17541E+03         2.38240E+03
+          3.58990E-03         4.77869E-03        -7.39489E-04         2.25558E-01         5.19578E-01         2.25559E-01         9.05604E+03         7.30711E-01         2.81065E+03         1.01353E+04         7.86400E+03         2.27133E+03
+          3.58990E-03         4.94852E-03        -7.91387E-04         2.25557E-01         5.30249E-01         2.25559E-01         8.63572E+03         7.30711E-01         2.71085E+03         9.71986E+03         7.55682E+03         2.16304E+03
+          3.58990E-03         5.11835E-03        -8.45097E-04         2.25557E-01         5.40919E-01         2.25559E-01         8.22444E+03         7.30711E-01         2.61246E+03         9.31186E+03         7.25421E+03         2.05765E+03
+          3.58990E-03         5.28818E-03        -9.00619E-04         2.25557E-01         5.51590E-01         2.25559E-01         7.82260E+03         7.30711E-01         2.51557E+03         8.91176E+03         6.95648E+03         1.95528E+03
+          3.58990E-03         5.45800E-03        -9.57953E-04         2.25557E-01         5.62261E-01         2.25559E-01         7.43062E+03         7.30711E-01         2.42028E+03         8.51994E+03         6.66392E+03         1.85601E+03
+          3.58990E-03         5.62783E-03        -1.01710E-03         2.25557E-01         5.72931E-01         2.25559E-01         7.04886E+03         7.30711E-01         2.32668E+03         8.13676E+03         6.37681E+03         1.75995E+03
+          3.58990E-03         5.79766E-03        -1.07806E-03         2.25556E-01         5.83602E-01         2.25559E-01         6.67764E+03         7.30711E-01         2.23484E+03         7.76257E+03         6.09541E+03         1.66716E+03
+          3.58990E-03         5.96749E-03        -1.14083E-03         2.25556E-01         5.94272E-01         2.25559E-01         6.31727E+03         7.30712E-01         2.14484E+03         7.39766E+03         5.81995E+03         1.57771E+03
+          3.58990E-03         6.13731E-03        -1.20541E-03         2.25556E-01         6.04943E-01         2.25559E-01         5.96799E+03         7.30712E-01         2.05675E+03         7.04230E+03         5.55065E+03         1.49166E+03
+          3.58990E-03         6.30714E-03        -1.27181E-03         2.25556E-01         6.15613E-01         2.25559E-01         5.63005E+03         7.30713E-01         1.97063E+03         6.69675E+03         5.28771E+03         1.40904E+03
+          3.58990E-03         6.47697E-03        -1.34002E-03         2.25556E-01         6.26284E-01         2.25560E-01         5.30362E+03         7.30714E-01         1.88654E+03         6.36122E+03         5.03132E+03         1.32990E+03
+          3.58990E-03         6.64680E-03        -1.41004E-03         2.25555E-01         6.36955E-01         2.25560E-01         4.98887E+03         7.30715E-01         1.80452E+03         6.03588E+03         4.78164E+03         1.25425E+03
+          3.58990E-03         6.81662E-03        -1.48187E-03         2.25555E-01         6.47625E-01         2.25560E-01         4.68592E+03         7.30716E-01         1.72463E+03         5.72091E+03         4.53881E+03         1.18210E+03
+          3.58990E-03         6.98645E-03        -1.55551E-03         2.25555E-01         6.58296E-01         2.25560E-01         4.39486E+03         7.30717E-01         1.64689E+03         5.41642E+03         4.30295E+03         1.11347E+03
+          3.58990E-03         7.15628E-03        -1.63097E-03         2.25554E-01         6.68966E-01         2.25560E-01         4.11576E+03         7.30718E-01         1.57134E+03         5.12252E+03         4.07418E+03         1.04834E+03
+          3.58990E-03         7.32611E-03        -1.70824E-03         2.25554E-01         6.79637E-01         2.25561E-01         3.84862E+03         7.30720E-01         1.49800E+03         4.83928E+03         3.85259E+03         9.86695E+02
+          3.58990E-03         7.49593E-03        -1.78732E-03         2.25554E-01         6.90307E-01         2.25561E-01         3.59347E+03         7.30722E-01         1.42690E+03         4.56675E+03         3.63824E+03         9.28511E+02
+          3.58990E-03         7.66576E-03        -1.86822E-03         2.25554E-01         7.00978E-01         2.25561E-01         3.35025E+03         7.30723E-01         1.35805E+03         4.30494E+03         3.43118E+03         8.73754E+02
+          3.58990E-03         7.83559E-03        -1.95092E-03         2.25553E-01         7.11649E-01         2.25562E-01         3.11890E+03         7.30726E-01         1.29145E+03         4.05384E+03         3.23146E+03         8.22380E+02
+          3.58990E-03         8.00542E-03        -2.03544E-03         2.25553E-01         7.22319E-01         2.25562E-01         2.89935E+03         7.30728E-01         1.22711E+03         3.81343E+03         3.03909E+03         7.74339E+02
+          3.58990E-03         8.17524E-03        -2.12177E-03         2.25553E-01         7.32990E-01         2.25563E-01         2.69146E+03         7.30730E-01         1.16502E+03         3.58365E+03         2.85408E+03         7.29573E+02
+          3.58990E-03         8.34507E-03        -2.20991E-03         2.25552E-01         7.43660E-01         2.25563E-01         2.49510E+03         7.30733E-01         1.10518E+03         3.36443E+03         2.67641E+03         6.88017E+02
+          3.58990E-03         8.51490E-03        -2.29987E-03         2.25552E-01         7.54331E-01         2.25564E-01         2.31010E+03         7.30736E-01         1.04756E+03         3.15565E+03         2.50605E+03         6.49598E+02
+          3.58990E-03         8.68473E-03        -2.39164E-03         2.25552E-01         7.65001E-01         2.25564E-01         2.13626E+03         7.30739E-01         9.92154E+02         2.95721E+03         2.34297E+03         6.14239E+02
+          3.58990E-03         8.85455E-03        -2.48522E-03         2.25551E-01         7.75672E-01         2.25565E-01         1.97339E+03         7.30743E-01         9.38933E+02         2.76896E+03         2.18710E+03         5.81854E+02
+          3.58990E-03         9.02438E-03        -2.58061E-03         2.25551E-01         7.86343E-01         2.25566E-01         1.82124E+03         7.30747E-01         8.87869E+02         2.59073E+03         2.03838E+03         5.52356E+02
+          3.58990E-03         9.19421E-03        -2.67781E-03         2.25551E-01         7.97013E-01         2.25567E-01         1.67957E+03         7.30751E-01         8.38929E+02         2.42236E+03         1.89671E+03         5.25648E+02
+          3.58990E-03         9.36403E-03        -2.77683E-03         2.25550E-01         8.07684E-01         2.25567E-01         1.54810E+03         7.30755E-01         7.92074E+02         2.26364E+03         1.76201E+03         5.01634E+02
+          3.58990E-03         9.53386E-03        -2.87766E-03         2.25550E-01         8.18354E-01         2.25568E-01         1.42655E+03         7.30760E-01         7.47262E+02         2.11437E+03         1.63416E+03         4.80210E+02
+          3.58990E-03         9.70369E-03        -2.98030E-03         2.25550E-01         8.29025E-01         2.25569E-01         1.31462E+03         7.30765E-01         7.04450E+02         1.97432E+03         1.51305E+03         4.61270E+02
+          3.58990E-03         9.87352E-03        -3.08476E-03         2.25549E-01         8.39695E-01         2.25570E-01         1.21200E+03         7.30770E-01         6.63587E+02         1.84326E+03         1.39856E+03         4.44706E+02
+          3.58990E-03         1.00433E-02        -3.19102E-03         2.25549E-01         8.50366E-01         2.25571E-01         1.11837E+03         7.30776E-01         6.24623E+02         1.72094E+03         1.29053E+03         4.30407E+02
+          3.58990E-03         1.02132E-02        -3.29910E-03         2.25548E-01         8.61037E-01         2.25573E-01         1.03338E+03         7.30782E-01         5.87504E+02         1.60709E+03         1.18883E+03         4.18258E+02
+          3.58990E-03         1.03830E-02        -3.40899E-03         2.25548E-01         8.71707E-01         2.25574E-01         9.56699E+02         7.30789E-01         5.52172E+02         1.50144E+03         1.09330E+03         4.08145E+02
+          3.58990E-03         1.05528E-02        -3.52070E-03         2.25548E-01         8.82378E-01         2.25575E-01         8.87973E+02         7.30795E-01         5.18570E+02         1.40373E+03         1.00377E+03         3.99952E+02
+          3.58990E-03         1.07227E-02        -3.63421E-03         2.25547E-01         8.93048E-01         2.25577E-01         8.26843E+02         7.30803E-01         4.86638E+02         1.31365E+03         9.20089E+02         3.93563E+02
+          3.58990E-03         1.08925E-02        -3.74954E-03         2.25547E-01         9.03719E-01         2.25578E-01         7.72948E+02         7.30810E-01         4.56315E+02         1.23093E+03         8.42067E+02         3.88861E+02
+          3.58990E-03         1.10623E-02        -3.86668E-03         2.25546E-01         9.14389E-01         2.25580E-01         7.25922E+02         7.30819E-01         4.27540E+02         1.15526E+03         7.69530E+02         3.85728E+02
+          3.58990E-03         1.12321E-02        -3.98564E-03         2.25546E-01         9.25060E-01         2.25581E-01         6.85398E+02         7.30827E-01         4.00251E+02         1.08634E+03         7.02292E+02         3.84050E+02
+          3.58990E-03         1.14020E-02        -4.10640E-03         2.25546E-01         9.35731E-01         2.25583E-01         6.51008E+02         7.30836E-01         3.74389E+02         1.02388E+03         6.40165E+02         3.83711E+02
+          3.58990E-03         1.15718E-02        -4.22898E-03         2.25545E-01         9.46401E-01         2.25585E-01         6.22383E+02         7.30846E-01         3.49893E+02         9.67556E+02         5.82959E+02         3.84598E+02
+          3.58990E-03         1.17416E-02        -4.35338E-03         2.25545E-01         9.57072E-01         2.25587E-01         5.99158E+02         7.30856E-01         3.26706E+02         9.17075E+02         5.30478E+02         3.86597E+02
+          3.58990E-03         1.19114E-02        -4.47958E-03         2.25544E-01         9.67742E-01         2.25589E-01         5.80969E+02         7.30866E-01         3.04773E+02         8.72128E+02         4.82527E+02         3.89601E+02
+          3.58990E-03         1.20813E-02        -4.60760E-03         2.25544E-01         9.78413E-01         2.25591E-01         5.67457E+02         7.30877E-01         2.84042E+02         8.32409E+02         4.38910E+02         3.93500E+02
+          3.58990E-03         1.22511E-02        -4.73742E-03         2.25543E-01         9.89083E-01         2.25593E-01         5.58267E+02         7.30889E-01         2.64466E+02         7.97618E+02         3.99428E+02         3.98190E+02
+          3.58990E-03         1.24209E-02        -4.86907E-03         2.25543E-01         9.99754E-01         2.25595E-01         5.53052E+02         7.30901E-01         2.46001E+02         7.67453E+02         3.63885E+02         4.03568E+02
+          3.58990E-03         1.25908E-02        -5.00252E-03         2.25542E-01         1.01042E+00         2.25598E-01         5.51468E+02         7.30914E-01         2.28610E+02         7.41620E+02         3.32083E+02         4.09537E+02
+          3.58990E-03         1.27606E-02        -5.13779E-03         2.25542E-01         1.02110E+00         2.25600E-01         5.53182E+02         7.30927E-01         2.12263E+02         7.19826E+02         3.03827E+02         4.16000E+02
+          3.58990E-03         1.29304E-02        -5.27487E-03         2.25541E-01         1.03177E+00         2.25603E-01         5.57868E+02         7.30941E-01         1.96937E+02         7.01786E+02         2.78921E+02         4.22865E+02
+          3.58990E-03         1.31002E-02        -5.41376E-03         2.25541E-01         1.04244E+00         2.25606E-01         5.65210E+02         7.30955E-01         1.82619E+02         6.87219E+02         2.57175E+02         4.30044E+02
+          3.58990E-03         1.32701E-02        -5.55446E-03         2.25540E-01         1.05311E+00         2.25609E-01         5.74901E+02         7.30971E-01         1.69304E+02         6.75850E+02         2.38398E+02         4.37452E+02
+          3.58990E-03         1.34399E-02        -5.69698E-03         2.25540E-01         1.06378E+00         2.25612E-01         5.86645E+02         7.30987E-01         1.56999E+02         6.67413E+02         2.22403E+02         4.45010E+02
+          3.58990E-03         1.36097E-02        -5.84131E-03         2.25539E-01         1.07445E+00         2.25615E-01         6.00157E+02         7.31003E-01         1.45725E+02         6.61649E+02         2.09007E+02         4.52642E+02
+          3.58990E-03         1.37795E-02        -5.98745E-03         2.25539E-01         1.08512E+00         2.25618E-01         6.15164E+02         7.31020E-01         1.35512E+02         6.58306E+02         1.98032E+02         4.60275E+02
+          3.58990E-03         1.39494E-02        -6.13541E-03         2.25538E-01         1.09579E+00         2.25622E-01         6.31405E+02         7.31038E-01         1.26402E+02         6.57142E+02         1.89300E+02         4.67841E+02
+          3.58990E-03         1.41192E-02        -6.28517E-03         2.25538E-01         1.10646E+00         2.25625E-01         6.48630E+02         7.31057E-01         1.18445E+02         6.57921E+02         1.82642E+02         4.75279E+02
+          3.58990E-03         1.42890E-02        -6.43675E-03         2.25537E-01         1.11713E+00         2.25629E-01         6.66602E+02         7.31076E-01         1.11694E+02         6.60420E+02         1.77891E+02         4.82529E+02
+          3.58990E-03         1.44589E-02        -6.59015E-03         2.25537E-01         1.12780E+00         2.25633E-01         6.85098E+02         7.31097E-01         1.06197E+02         6.64423E+02         1.74886E+02         4.89537E+02
+          3.58990E-03         1.46287E-02        -6.74535E-03         2.25536E-01         1.13847E+00         2.25637E-01         7.03907E+02         7.31118E-01         1.01985E+02         6.69723E+02         1.73471E+02         4.96253E+02
+          3.58990E-03         1.47985E-02        -6.90237E-03         2.25536E-01         1.14914E+00         2.25641E-01         7.22833E+02         7.31139E-01         9.90633E+01         6.76126E+02         1.73494E+02         5.02632E+02
+          3.58990E-03         1.49683E-02        -7.06120E-03         2.25535E-01         1.15981E+00         2.25646E-01         7.41690E+02         7.31162E-01         9.74002E+01         6.83446E+02         1.74812E+02         5.08633E+02
+          3.58990E-03         1.51382E-02        -7.22185E-03         2.25534E-01         1.17048E+00         2.25650E-01         7.60307E+02         7.31186E-01         9.69248E+01         6.91505E+02         1.77285E+02         5.14220E+02
+          3.58990E-03         1.53080E-02        -7.38430E-03         2.25534E-01         1.18115E+00         2.25655E-01         7.78526E+02         7.31210E-01         9.75300E+01         7.00139E+02         1.80779E+02         5.19360E+02
+          3.58990E-03         1.54778E-02        -7.54857E-03         2.25533E-01         1.19182E+00         2.25660E-01         7.96204E+02         7.31235E-01         9.90824E+01         7.09193E+02         1.85168E+02         5.24025E+02
+          3.58990E-03         1.56476E-02        -7.71465E-03         2.25533E-01         1.20249E+00         2.25665E-01         8.13208E+02         7.31261E-01         1.01435E+02         7.18520E+02         1.90329E+02         5.28191E+02
+          3.58990E-03         1.58175E-02        -7.88255E-03         2.25532E-01         1.21317E+00         2.25670E-01         8.29418E+02         7.31288E-01         1.04439E+02         7.27986E+02         1.96149E+02         5.31838E+02
+          3.58990E-03         1.59873E-02        -8.05226E-03         2.25531E-01         1.22384E+00         2.25675E-01         8.44728E+02         7.31317E-01         1.07953E+02         7.37466E+02         2.02517E+02         5.34949E+02
+          3.58990E-03         1.61571E-02        -8.22378E-03         2.25531E-01         1.23451E+00         2.25681E-01         8.59045E+02         7.31346E-01         1.11852E+02         7.46843E+02         2.09331E+02         5.37512E+02
+          3.58990E-03         1.63270E-02        -8.39711E-03         2.25530E-01         1.24518E+00         2.25686E-01         8.72285E+02         7.31376E-01         1.16023E+02         7.56013E+02         2.16494E+02         5.39519E+02
+          3.58990E-03         1.64968E-02        -8.57226E-03         2.25530E-01         1.25585E+00         2.25692E-01         8.84378E+02         7.31407E-01         1.20372E+02         7.64878E+02         2.23915E+02         5.40963E+02
+          3.58990E-03         1.66666E-02        -8.74922E-03         2.25529E-01         1.26652E+00         2.25699E-01         8.95265E+02         7.31439E-01         1.24819E+02         7.73353E+02         2.31510E+02         5.41842E+02
+          3.58990E-03         1.68364E-02        -8.92799E-03         2.25528E-01         1.27719E+00         2.25705E-01         9.04896E+02         7.31472E-01         1.29298E+02         7.81359E+02         2.39201E+02         5.42158E+02
+          3.58990E-03         1.70063E-02        -9.10858E-03         2.25528E-01         1.28786E+00         2.25712E-01         9.13234E+02         7.31506E-01         1.33755E+02         7.88827E+02         2.46913E+02         5.41913E+02
+          3.58990E-03         1.71761E-02        -9.29097E-03         2.25527E-01         1.29853E+00         2.25718E-01         9.20250E+02         7.31541E-01         1.38145E+02         7.95696E+02         2.54581E+02         5.41115E+02
+          3.58990E-03         1.73459E-02        -9.47518E-03         2.25526E-01         1.30920E+00         2.25725E-01         9.25926E+02         7.31578E-01         1.42429E+02         8.01915E+02         2.62143E+02         5.39772E+02
+          3.58990E-03         1.75158E-02        -9.66121E-03         2.25526E-01         1.31987E+00         2.25732E-01         9.30252E+02         7.31615E-01         1.46578E+02         8.07439E+02         2.69543E+02         5.37897E+02
+          3.58990E-03         1.76856E-02        -9.84905E-03         2.25525E-01         1.33054E+00         2.25740E-01         9.33226E+02         7.31654E-01         1.50566E+02         8.12231E+02         2.76730E+02         5.35501E+02
+          3.58990E-03         1.78554E-02        -1.00387E-02         2.25524E-01         1.34121E+00         2.25748E-01         9.34857E+02         7.31694E-01         1.54374E+02         8.16261E+02         2.83658E+02         5.32602E+02
+          3.58990E-03         1.80252E-02        -1.02302E-02         2.25524E-01         1.35188E+00         2.25756E-01         9.35157E+02         7.31735E-01         1.57985E+02         8.19506E+02         2.90289E+02         5.29217E+02
+          3.58990E-03         1.81951E-02        -1.04234E-02         2.25523E-01         1.36255E+00         2.25764E-01         9.34149E+02         7.31778E-01         1.61384E+02         8.21949E+02         2.96585E+02         5.25365E+02
+          3.58990E-03         1.83649E-02        -1.06185E-02         2.25522E-01         1.37322E+00         2.25772E-01         9.31860E+02         7.31822E-01         1.64562E+02         8.23582E+02         3.02516E+02         5.21066E+02
+          3.58990E-03         1.85347E-02        -1.08154E-02         2.25522E-01         1.38389E+00         2.25781E-01         9.28323E+02         7.31867E-01         1.67511E+02         8.24398E+02         3.08056E+02         5.16343E+02
+          3.58990E-03         1.87045E-02        -1.10141E-02         2.25521E-01         1.39457E+00         2.25790E-01         9.23579E+02         7.31913E-01         1.70223E+02         8.24400E+02         3.13182E+02         5.11218E+02
+          3.58990E-03         1.88744E-02        -1.12147E-02         2.25520E-01         1.40524E+00         2.25799E-01         9.17670E+02         7.31961E-01         1.72695E+02         8.23592E+02         3.17876E+02         5.05716E+02
+          3.58990E-03         1.90442E-02        -1.14170E-02         2.25519E-01         1.41591E+00         2.25808E-01         9.10646E+02         7.32010E-01         1.74924E+02         8.21985E+02         3.22124E+02         4.99861E+02
+          3.58990E-03         1.92140E-02        -1.16212E-02         2.25519E-01         1.42658E+00         2.25818E-01         9.02558E+02         7.32060E-01         1.76907E+02         8.19594E+02         3.25915E+02         4.93679E+02
+          3.58990E-03         1.93839E-02        -1.18271E-02         2.25518E-01         1.43725E+00         2.25828E-01         8.93462E+02         7.32112E-01         1.78646E+02         8.16437E+02         3.29242E+02         4.87196E+02
+          3.58990E-03         1.95537E-02        -1.20349E-02         2.25517E-01         1.44792E+00         2.25838E-01         8.83416E+02         7.32165E-01         1.80140E+02         8.12537E+02         3.32100E+02         4.80437E+02
+          3.58990E-03         1.97235E-02        -1.22445E-02         2.25516E-01         1.45859E+00         2.25849E-01         8.72481E+02         7.32220E-01         1.81391E+02         8.07918E+02         3.34488E+02         4.73429E+02
+          3.58990E-03         1.98933E-02        -1.24559E-02         2.25516E-01         1.46926E+00         2.25859E-01         8.60720E+02         7.32277E-01         1.82402E+02         8.02608E+02         3.36409E+02         4.66199E+02
+          3.58990E-03         2.00632E-02        -1.26691E-02         2.25515E-01         1.47993E+00         2.25870E-01         8.48197E+02         7.32334E-01         1.83177E+02         7.96639E+02         3.37866E+02         4.58773E+02
+          3.58990E-03         2.02330E-02        -1.28842E-02         2.25514E-01         1.49060E+00         2.25882E-01         8.34978E+02         7.32394E-01         1.83718E+02         7.90041E+02         3.38865E+02         4.51176E+02
+          3.58990E-03         2.04028E-02        -1.31010E-02         2.25513E-01         1.50127E+00         2.25894E-01         8.21128E+02         7.32455E-01         1.84032E+02         7.82851E+02         3.39416E+02         4.43435E+02
+          3.58990E-03         2.05726E-02        -1.33197E-02         2.25513E-01         1.51194E+00         2.25906E-01         8.06713E+02         7.32517E-01         1.84122E+02         7.75103E+02         3.39529E+02         4.35574E+02
+          3.58990E-03         2.07425E-02        -1.35402E-02         2.25512E-01         1.52261E+00         2.25918E-01         7.91799E+02         7.32581E-01         1.83995E+02         7.66835E+02         3.39217E+02         4.27618E+02
+          3.58990E-03         2.09123E-02        -1.37624E-02         2.25511E-01         1.53328E+00         2.25930E-01         7.76453E+02         7.32647E-01         1.83658E+02         7.58084E+02         3.38492E+02         4.19592E+02
+          3.58990E-03         2.10821E-02        -1.39865E-02         2.25510E-01         1.54395E+00         2.25943E-01         7.60739E+02         7.32715E-01         1.83115E+02         7.48890E+02         3.37372E+02         4.11519E+02
+          3.58990E-03         2.12520E-02        -1.42125E-02         2.25509E-01         1.55462E+00         2.25957E-01         7.44721E+02         7.32784E-01         1.82375E+02         7.39292E+02         3.35871E+02         4.03420E+02
+          3.58990E-03         2.14218E-02        -1.44402E-02         2.25509E-01         1.56529E+00         2.25970E-01         7.28461E+02         7.32855E-01         1.81443E+02         7.29327E+02         3.34009E+02         3.95319E+02
+          3.58990E-03         2.15916E-02        -1.46697E-02         2.25508E-01         1.57596E+00         2.25984E-01         7.12020E+02         7.32928E-01         1.80329E+02         7.19037E+02         3.31802E+02         3.87234E+02
+          3.58990E-03         2.17614E-02        -1.49011E-02         2.25507E-01         1.58664E+00         2.25999E-01         6.95457E+02         7.33002E-01         1.79038E+02         7.08459E+02         3.29271E+02         3.79187E+02
+          3.58990E-03         2.19313E-02        -1.51342E-02         2.25506E-01         1.59731E+00         2.26013E-01         6.78830E+02         7.33078E-01         1.77578E+02         6.97632E+02         3.26436E+02         3.71196E+02
+          3.58990E-03         2.21011E-02        -1.53692E-02         2.25505E-01         1.60798E+00         2.26028E-01         6.62193E+02         7.33157E-01         1.75958E+02         6.86593E+02         3.23315E+02         3.63279E+02
+          3.58990E-03         2.22709E-02        -1.56060E-02         2.25504E-01         1.61865E+00         2.26044E-01         6.45598E+02         7.33237E-01         1.74185E+02         6.75381E+02         3.19930E+02         3.55451E+02
+          3.58990E-03         2.24407E-02        -1.58446E-02         2.25503E-01         1.62932E+00         2.26059E-01         6.29096E+02         7.33319E-01         1.72266E+02         6.64030E+02         3.16301E+02         3.47729E+02
+          3.58990E-03         2.26106E-02        -1.60850E-02         2.25503E-01         1.63999E+00         2.26076E-01         6.12732E+02         7.33403E-01         1.70210E+02         6.52575E+02         3.12449E+02         3.40126E+02
+          3.58990E-03         2.27804E-02        -1.63273E-02         2.25502E-01         1.65066E+00         2.26092E-01         5.96552E+02         7.33488E-01         1.68024E+02         6.41051E+02         3.08394E+02         3.32657E+02
+          3.58990E-03         2.29502E-02        -1.65713E-02         2.25501E-01         1.66133E+00         2.26109E-01         5.80597E+02         7.33576E-01         1.65717E+02         6.29489E+02         3.04157E+02         3.25332E+02
+          3.58990E-03         2.31201E-02        -1.68172E-02         2.25500E-01         1.67200E+00         2.26126E-01         5.64906E+02         7.33666E-01         1.63295E+02         6.17921E+02         2.99758E+02         3.18163E+02
+          3.58990E-03         2.32899E-02        -1.70649E-02         2.25499E-01         1.68267E+00         2.26144E-01         5.49514E+02         7.33758E-01         1.60766E+02         6.06376E+02         2.95216E+02         3.11160E+02
+          3.58990E-03         2.34597E-02        -1.73144E-02         2.25498E-01         1.69334E+00         2.26162E-01         5.34453E+02         7.33852E-01         1.58138E+02         5.94882E+02         2.90551E+02         3.04331E+02
+          3.58990E-03         2.36295E-02        -1.75657E-02         2.25497E-01         1.70401E+00         2.26180E-01         5.19754E+02         7.33949E-01         1.55419E+02         5.83465E+02         2.85782E+02         2.97683E+02
+          3.58990E-03         2.37994E-02        -1.78188E-02         2.25496E-01         1.71468E+00         2.26199E-01         5.05442E+02         7.34047E-01         1.52615E+02         5.72149E+02         2.80926E+02         2.91223E+02
+          3.58990E-03         2.39692E-02        -1.80737E-02         2.25495E-01         1.72535E+00         2.26219E-01         4.91542E+02         7.34147E-01         1.49733E+02         5.60959E+02         2.76002E+02         2.84957E+02
+          3.58990E-03         2.41390E-02        -1.83304E-02         2.25495E-01         1.73602E+00         2.26238E-01         4.78073E+02         7.34250E-01         1.46780E+02         5.49915E+02         2.71027E+02         2.78888E+02
+          3.58990E-03         2.43088E-02        -1.85890E-02         2.25494E-01         1.74669E+00         2.26259E-01         4.65055E+02         7.34355E-01         1.43764E+02         5.39036E+02         2.66016E+02         2.73020E+02
+          3.58990E-03         2.44787E-02        -1.88494E-02         2.25493E-01         1.75736E+00         2.26279E-01         4.52501E+02         7.34463E-01         1.40690E+02         5.28341E+02         2.60985E+02         2.67356E+02
+          3.58990E-03         2.46485E-02        -1.91116E-02         2.25492E-01         1.76804E+00         2.26300E-01         4.40423E+02         7.34572E-01         1.37565E+02         5.17846E+02         2.55949E+02         2.61897E+02
+          3.58990E-03         2.48183E-02        -1.93756E-02         2.25491E-01         1.77871E+00         2.26322E-01         4.28832E+02         7.34684E-01         1.34396E+02         5.07564E+02         2.50922E+02         2.56643E+02
+          3.58990E-03         2.49882E-02        -1.96414E-02         2.25490E-01         1.78938E+00         2.26344E-01         4.17734E+02         7.34798E-01         1.31188E+02         4.97510E+02         2.45916E+02         2.51594E+02
+          3.58990E-03         2.51580E-02        -1.99090E-02         2.25489E-01         1.80005E+00         2.26366E-01         4.07133E+02         7.34915E-01         1.27947E+02         4.87694E+02         2.40944E+02         2.46750E+02
+          3.58990E-03         2.53278E-02        -2.01784E-02         2.25488E-01         1.81072E+00         2.26389E-01         3.97032E+02         7.35034E-01         1.24679E+02         4.78127E+02         2.36018E+02         2.42109E+02
+          3.58990E-03         2.54976E-02        -2.04497E-02         2.25487E-01         1.82139E+00         2.26412E-01         3.87430E+02         7.35156E-01         1.21389E+02         4.68815E+02         2.31147E+02         2.37668E+02
+          3.58990E-03         2.56675E-02        -2.07228E-02         2.25486E-01         1.83206E+00         2.26436E-01         3.78325E+02         7.35280E-01         1.18082E+02         4.59766E+02         2.26342E+02         2.33424E+02
+          3.58990E-03         2.58373E-02        -2.09976E-02         2.25485E-01         1.84273E+00         2.26461E-01         3.69712E+02         7.35406E-01         1.14765E+02         4.50985E+02         2.21612E+02         2.29373E+02
+          3.58990E-03         2.60071E-02        -2.12743E-02         2.25484E-01         1.85340E+00         2.26485E-01         3.61585E+02         7.35536E-01         1.11440E+02         4.42476E+02         2.16963E+02         2.25512E+02
+          3.58990E-03         2.61769E-02        -2.15528E-02         2.25483E-01         1.86407E+00         2.26511E-01         3.53937E+02         7.35667E-01         1.08114E+02         4.34241E+02         2.12405E+02         2.21836E+02
+          3.75973E-03         8.72665E-04        -8.52150E-05         2.36231E-01         2.74155E-01         2.36231E-01         1.96536E+04         7.85221E-01         4.49016E+03         1.93539E+04         1.45778E+04         4.77607E+03
+          3.75973E-03         1.04249E-03        -9.54328E-05         2.36231E-01         2.84826E-01         2.36231E-01         1.92218E+04         7.85220E-01         4.40899E+03         1.89602E+04         1.42973E+04         4.66293E+03
+          3.75973E-03         1.21232E-03        -1.07463E-04         2.36231E-01         2.95496E-01         2.36231E-01         1.87822E+04         7.85220E-01         4.32617E+03         1.85591E+04         1.40111E+04         4.54802E+03
+          3.75973E-03         1.38215E-03        -1.21305E-04         2.36231E-01         3.06167E-01         2.36231E-01         1.83357E+04         7.85220E-01         4.24182E+03         1.81513E+04         1.37197E+04         4.43157E+03
+          3.75973E-03         1.55197E-03        -1.36959E-04         2.36231E-01         3.16838E-01         2.36231E-01         1.78830E+04         7.85220E-01         4.15609E+03         1.77374E+04         1.34236E+04         4.31382E+03
+          3.75973E-03         1.72180E-03        -1.54426E-04         2.36230E-01         3.27508E-01         2.36231E-01         1.74251E+04         7.85219E-01         4.06912E+03         1.73183E+04         1.31233E+04         4.19499E+03
+          3.75973E-03         1.89163E-03        -1.73704E-04         2.36230E-01         3.38179E-01         2.36230E-01         1.69627E+04         7.85219E-01         3.98104E+03         1.68946E+04         1.28193E+04         4.07533E+03
+          3.75973E-03         2.06146E-03        -1.94795E-04         2.36230E-01         3.48849E-01         2.36230E-01         1.64966E+04         7.85219E-01         3.89200E+03         1.64671E+04         1.25120E+04         3.95507E+03
+          3.75973E-03         2.23128E-03        -2.17698E-04         2.36230E-01         3.59520E-01         2.36230E-01         1.60277E+04         7.85218E-01         3.80213E+03         1.60365E+04         1.22020E+04         3.83443E+03
+          3.75973E-03         2.40111E-03        -2.42413E-04         2.36230E-01         3.70190E-01         2.36230E-01         1.55568E+04         7.85218E-01         3.71157E+03         1.56034E+04         1.18897E+04         3.71364E+03
+          3.75973E-03         2.57094E-03        -2.68940E-04         2.36230E-01         3.80861E-01         2.36230E-01         1.50847E+04         7.85218E-01         3.62047E+03         1.51686E+04         1.15757E+04         3.59293E+03
+          3.75973E-03         2.74077E-03        -2.97279E-04         2.36230E-01         3.91532E-01         2.36230E-01         1.46121E+04         7.85217E-01         3.52895E+03         1.47328E+04         1.12603E+04         3.47251E+03
+          3.75973E-03         2.91059E-03        -3.27431E-04         2.36230E-01         4.02202E-01         2.36230E-01         1.41399E+04         7.85217E-01         3.43714E+03         1.42967E+04         1.09441E+04         3.35259E+03
+          3.75973E-03         3.08042E-03        -3.59395E-04         2.36230E-01         4.12873E-01         2.36230E-01         1.36687E+04         7.85217E-01         3.34520E+03         1.38609E+04         1.06275E+04         3.23339E+03
+          3.75973E-03         3.25025E-03        -3.93170E-04         2.36230E-01         4.23543E-01         2.36230E-01         1.31994E+04         7.85216E-01         3.25323E+03         1.34261E+04         1.03109E+04         3.11511E+03
+          3.75973E-03         3.42008E-03        -4.28759E-04         2.36229E-01         4.34214E-01         2.36230E-01         1.27327E+04         7.85216E-01         3.16137E+03         1.29929E+04         9.99494E+03         2.99794E+03
+          3.75973E-03         3.58990E-03        -4.66159E-04         2.36229E-01         4.44884E-01         2.36230E-01         1.22692E+04         7.85216E-01         3.06975E+03         1.25620E+04         9.67991E+03         2.88207E+03
+          3.75973E-03         3.75973E-03        -5.05371E-04         2.36229E-01         4.55555E-01         2.36230E-01         1.18097E+04         7.85215E-01         2.97848E+03         1.21339E+04         9.36625E+03         2.76768E+03
+          3.75973E-03         3.92956E-03        -5.46396E-04         2.36229E-01         4.66225E-01         2.36230E-01         1.13548E+04         7.85215E-01         2.88769E+03         1.17093E+04         9.05440E+03         2.65495E+03
+          3.75973E-03         4.09939E-03        -5.89232E-04         2.36229E-01         4.76896E-01         2.36230E-01         1.09051E+04         7.85215E-01         2.79749E+03         1.12888E+04         8.74475E+03         2.54403E+03
+          3.75973E-03         4.26921E-03        -6.33881E-04         2.36229E-01         4.87567E-01         2.36230E-01         1.04613E+04         7.85214E-01         2.70799E+03         1.08728E+04         8.43769E+03         2.43510E+03
+          3.75973E-03         4.43904E-03        -6.80342E-04         2.36229E-01         4.98237E-01         2.36229E-01         1.00239E+04         7.85214E-01         2.61929E+03         1.04619E+04         8.13359E+03         2.32829E+03
+          3.75973E-03         4.60887E-03        -7.28616E-04         2.36228E-01         5.08908E-01         2.36229E-01         9.59341E+03         7.85214E-01         2.53150E+03         1.00566E+04         7.83283E+03         2.22374E+03
+          3.75973E-03         4.77869E-03        -7.78701E-04         2.36228E-01         5.19578E-01         2.36229E-01         9.17046E+03         7.85214E-01         2.44472E+03         9.65732E+03         7.53573E+03         2.12159E+03
+          3.75973E-03         4.94852E-03        -8.30599E-04         2.36228E-01         5.30249E-01         2.36229E-01         8.75549E+03         7.85214E-01         2.35904E+03         9.26459E+03         7.24264E+03         2.02196E+03
+          3.75973E-03         5.11835E-03        -8.84309E-04         2.36228E-01         5.40919E-01         2.36229E-01         8.34897E+03         7.85214E-01         2.27455E+03         8.87880E+03         6.95386E+03         1.92495E+03
+          3.75973E-03         5.28818E-03        -9.39831E-04         2.36228E-01         5.51590E-01         2.36229E-01         7.95133E+03         7.85214E-01         2.19134E+03         8.50035E+03         6.66969E+03         1.83067E+03
+          3.75973E-03         5.45800E-03        -9.97165E-04         2.36227E-01         5.62261E-01         2.36229E-01         7.56297E+03         7.85214E-01         2.10948E+03         8.12961E+03         6.39041E+03         1.73920E+03
+          3.75973E-03         5.62783E-03        -1.05631E-03         2.36227E-01         5.72931E-01         2.36229E-01         7.18424E+03         7.85214E-01         2.02905E+03         7.76693E+03         6.11629E+03         1.65063E+03
+          3.75973E-03         5.79766E-03        -1.11727E-03         2.36227E-01         5.83602E-01         2.36230E-01         6.81549E+03         7.85214E-01         1.95012E+03         7.41261E+03         5.84757E+03         1.56504E+03
+          3.75973E-03         5.96749E-03        -1.18004E-03         2.36227E-01         5.94272E-01         2.36230E-01         6.45701E+03         7.85215E-01         1.87275E+03         7.06696E+03         5.58448E+03         1.48248E+03
+          3.75973E-03         6.13731E-03        -1.24463E-03         2.36226E-01         6.04943E-01         2.36230E-01         6.10907E+03         7.85215E-01         1.79700E+03         6.73023E+03         5.32724E+03         1.40300E+03
+          3.75973E-03         6.30714E-03        -1.31102E-03         2.36226E-01         6.15613E-01         2.36230E-01         5.77191E+03         7.85216E-01         1.72293E+03         6.40266E+03         5.07602E+03         1.32664E+03
+          3.75973E-03         6.47697E-03        -1.37923E-03         2.36226E-01         6.26284E-01         2.36230E-01         5.44573E+03         7.85216E-01         1.65057E+03         6.08445E+03         4.83101E+03         1.25344E+03
+          3.75973E-03         6.64680E-03        -1.44925E-03         2.36226E-01         6.36955E-01         2.36230E-01         5.13071E+03         7.85217E-01         1.57999E+03         5.77579E+03         4.59236E+03         1.18343E+03
+          3.75973E-03         6.81662E-03        -1.52108E-03         2.36225E-01         6.47625E-01         2.36230E-01         4.82697E+03         7.85218E-01         1.51121E+03         5.47682E+03         4.36021E+03         1.11661E+03
+          3.75973E-03         6.98645E-03        -1.59473E-03         2.36225E-01         6.58296E-01         2.36230E-01         4.53463E+03         7.85219E-01         1.44426E+03         5.18767E+03         4.13469E+03         1.05298E+03
+          3.75973E-03         7.15628E-03        -1.67018E-03         2.36225E-01         6.68966E-01         2.36231E-01         4.25377E+03         7.85220E-01         1.37918E+03         4.90845E+03         3.91589E+03         9.92555E+02
+          3.75973E-03         7.32611E-03        -1.74745E-03         2.36224E-01         6.79637E-01         2.36231E-01         3.98443E+03         7.85222E-01         1.31598E+03         4.63922E+03         3.70391E+03         9.35309E+02
+          3.75973E-03         7.49593E-03        -1.82653E-03         2.36224E-01         6.90307E-01         2.36231E-01         3.72662E+03         7.85223E-01         1.25468E+03         4.38003E+03         3.49881E+03         8.81223E+02
+          3.75973E-03         7.66576E-03        -1.90743E-03         2.36224E-01         7.00978E-01         2.36232E-01         3.48035E+03         7.85225E-01         1.19530E+03         4.13091E+03         3.30064E+03         8.30269E+02
+          3.75973E-03         7.83559E-03        -1.99013E-03         2.36224E-01         7.11649E-01         2.36232E-01         3.24555E+03         7.85227E-01         1.13784E+03         3.89185E+03         3.10944E+03         7.82409E+02
+          3.75973E-03         8.00542E-03        -2.07465E-03         2.36223E-01         7.22319E-01         2.36232E-01         3.02218E+03         7.85229E-01         1.08230E+03         3.66284E+03         2.92524E+03         7.37600E+02
+          3.75973E-03         8.17524E-03        -2.16098E-03         2.36223E-01         7.32990E-01         2.36233E-01         2.81014E+03         7.85231E-01         1.02868E+03         3.44382E+03         2.74803E+03         6.95791E+02
+          3.75973E-03         8.34507E-03        -2.24912E-03         2.36223E-01         7.43660E-01         2.36233E-01         2.60930E+03         7.85233E-01         9.76974E+02         3.23473E+03         2.57781E+03         6.56923E+02
+          3.75973E-03         8.51490E-03        -2.33908E-03         2.36222E-01         7.54331E-01         2.36234E-01         2.41954E+03         7.85236E-01         9.27169E+02         3.03548E+03         2.41454E+03         6.20934E+02
+          3.75973E-03         8.68473E-03        -2.43085E-03         2.36222E-01         7.65001E-01         2.36234E-01         2.24068E+03         7.85239E-01         8.79248E+02         2.84596E+03         2.25820E+03         5.87753E+02
+          3.75973E-03         8.85455E-03        -2.52443E-03         2.36222E-01         7.75672E-01         2.36235E-01         2.07254E+03         7.85242E-01         8.33192E+02         2.66604E+03         2.10873E+03         5.57306E+02
+          3.75973E-03         9.02438E-03        -2.61982E-03         2.36221E-01         7.86343E-01         2.36236E-01         1.91492E+03         7.85245E-01         7.88976E+02         2.49558E+03         1.96606E+03         5.29512E+02
+          3.75973E-03         9.19421E-03        -2.71702E-03         2.36221E-01         7.97013E-01         2.36236E-01         1.76758E+03         7.85249E-01         7.46572E+02         2.33441E+03         1.83012E+03         5.04289E+02
+          3.75973E-03         9.36403E-03        -2.81604E-03         2.36220E-01         8.07684E-01         2.36237E-01         1.63030E+03         7.85253E-01         7.05948E+02         2.18236E+03         1.70082E+03         4.81546E+02
+          3.75973E-03         9.53386E-03        -2.91687E-03         2.36220E-01         8.18354E-01         2.36238E-01         1.50281E+03         7.85257E-01         6.67070E+02         2.03924E+03         1.57805E+03         4.61192E+02
+          3.75973E-03         9.70369E-03        -3.01951E-03         2.36220E-01         8.29025E-01         2.36239E-01         1.38483E+03         7.85261E-01         6.29900E+02         1.90484E+03         1.46170E+03         4.43131E+02
+          3.75973E-03         9.87352E-03        -3.12397E-03         2.36219E-01         8.39695E-01         2.36240E-01         1.27609E+03         7.85266E-01         5.94398E+02         1.77893E+03         1.35167E+03         4.27266E+02
+          3.75973E-03         1.00433E-02        -3.23023E-03         2.36219E-01         8.50366E-01         2.36241E-01         1.17628E+03         7.85271E-01         5.60519E+02         1.66130E+03         1.24780E+03         4.13496E+02
+          3.75973E-03         1.02132E-02        -3.33831E-03         2.36219E-01         8.61037E-01         2.36242E-01         1.08510E+03         7.85277E-01         5.28219E+02         1.55169E+03         1.14997E+03         4.01719E+02
+          3.75973E-03         1.03830E-02        -3.44820E-03         2.36218E-01         8.71707E-01         2.36243E-01         1.00222E+03         7.85283E-01         4.97450E+02         1.44987E+03         1.05804E+03         3.91830E+02
+          3.75973E-03         1.05528E-02        -3.55991E-03         2.36218E-01         8.82378E-01         2.36245E-01         9.27313E+02         7.85289E-01         4.68164E+02         1.35556E+03         9.71839E+02         3.83725E+02
+          3.75973E-03         1.07227E-02        -3.67342E-03         2.36217E-01         8.93048E-01         2.36246E-01         8.60054E+02         7.85295E-01         4.40310E+02         1.26852E+03         8.91218E+02         3.77298E+02
+          3.75973E-03         1.08925E-02        -3.78875E-03         2.36217E-01         9.03719E-01         2.36247E-01         8.00097E+02         7.85302E-01         4.13840E+02         1.18845E+03         8.16011E+02         3.72442E+02
+          3.75973E-03         1.10623E-02        -3.90589E-03         2.36216E-01         9.14389E-01         2.36249E-01         7.47100E+02         7.85309E-01         3.88700E+02         1.11510E+03         7.46047E+02         3.69052E+02
+          3.75973E-03         1.12321E-02        -4.02485E-03         2.36216E-01         9.25060E-01         2.36250E-01         7.00715E+02         7.85317E-01         3.64842E+02         1.04818E+03         6.81152E+02         3.67023E+02
+          3.75973E-03         1.14020E-02        -4.14562E-03         2.36215E-01         9.35731E-01         2.36252E-01         6.60594E+02         7.85325E-01         3.42215E+02         9.87396E+02         6.21148E+02         3.66248E+02
+          3.75973E-03         1.15718E-02        -4.26819E-03         2.36215E-01         9.46401E-01         2.36254E-01         6.26385E+02         7.85334E-01         3.20770E+02         9.32479E+02         5.65853E+02         3.66625E+02
+          3.75973E-03         1.17416E-02        -4.39259E-03         2.36215E-01         9.57072E-01         2.36255E-01         5.97742E+02         7.85343E-01         3.00460E+02         8.83136E+02         5.15084E+02         3.68052E+02
+          3.75973E-03         1.19114E-02        -4.51879E-03         2.36214E-01         9.67742E-01         2.36257E-01         5.74315E+02         7.85352E-01         2.81241E+02         8.39082E+02         4.68655E+02         3.70427E+02
+          3.75973E-03         1.20813E-02        -4.64681E-03         2.36214E-01         9.78413E-01         2.36259E-01         5.55759E+02         7.85362E-01         2.63069E+02         8.00032E+02         4.26380E+02         3.73652E+02
+          3.75973E-03         1.22511E-02        -4.77663E-03         2.36213E-01         9.89083E-01         2.36261E-01         5.41735E+02         7.85372E-01         2.45907E+02         7.65701E+02         3.88071E+02         3.77631E+02
+          3.75973E-03         1.24209E-02        -4.90828E-03         2.36213E-01         9.99754E-01         2.36264E-01         5.31904E+02         7.85383E-01         2.29720E+02         7.35809E+02         3.53540E+02         3.82270E+02
+          3.75973E-03         1.25908E-02        -5.04173E-03         2.36212E-01         1.01042E+00         2.36266E-01         5.25936E+02         7.85395E-01         2.14478E+02         7.10078E+02         3.22600E+02         3.87478E+02
+          3.75973E-03         1.27606E-02        -5.17700E-03         2.36212E-01         1.02110E+00         2.36268E-01         5.23506E+02         7.85407E-01         2.00157E+02         6.88233E+02         2.95066E+02         3.93167E+02
+          3.75973E-03         1.29304E-02        -5.31408E-03         2.36211E-01         1.03177E+00         2.36271E-01         5.24296E+02         7.85419E-01         1.86738E+02         6.70005E+02         2.70753E+02         3.99253E+02
+          3.75973E-03         1.31002E-02        -5.45297E-03         2.36211E-01         1.04244E+00         2.36273E-01         5.27997E+02         7.85432E-01         1.74210E+02         6.55130E+02         2.49477E+02         4.05653E+02
+          3.75973E-03         1.32701E-02        -5.59367E-03         2.36210E-01         1.05311E+00         2.36276E-01         5.34307E+02         7.85446E-01         1.62570E+02         6.43348E+02         2.31058E+02         4.12290E+02
+          3.75973E-03         1.34399E-02        -5.73619E-03         2.36209E-01         1.06378E+00         2.36279E-01         5.42935E+02         7.85460E-01         1.51821E+02         6.34408E+02         2.15319E+02         4.19090E+02
+          3.75973E-03         1.36097E-02        -5.88052E-03         2.36209E-01         1.07445E+00         2.36282E-01         5.53599E+02         7.85475E-01         1.41974E+02         6.28065E+02         2.02084E+02         4.25981E+02
+          3.75973E-03         1.37795E-02        -6.02666E-03         2.36208E-01         1.08512E+00         2.36285E-01         5.66026E+02         7.85491E-01         1.33049E+02         6.24081E+02         1.91183E+02         4.32897E+02
+          3.75973E-03         1.39494E-02        -6.17461E-03         2.36208E-01         1.09579E+00         2.36289E-01         5.79957E+02         7.85507E-01         1.25071E+02         6.22225E+02         1.82449E+02         4.39776E+02
+          3.75973E-03         1.41192E-02        -6.32438E-03         2.36207E-01         1.10646E+00         2.36292E-01         5.95140E+02         7.85524E-01         1.18069E+02         6.22275E+02         1.75718E+02         4.46557E+02
+          3.75973E-03         1.42890E-02        -6.47596E-03         2.36207E-01         1.11713E+00         2.36295E-01         6.11338E+02         7.85541E-01         1.12073E+02         6.24018E+02         1.70831E+02         4.53187E+02
+          3.75973E-03         1.44589E-02        -6.62936E-03         2.36206E-01         1.12780E+00         2.36299E-01         6.28324E+02         7.85560E-01         1.07106E+02         6.27250E+02         1.67635E+02         4.59615E+02
+          3.75973E-03         1.46287E-02        -6.78456E-03         2.36206E-01         1.13847E+00         2.36303E-01         6.45884E+02         7.85578E-01         1.03182E+02         6.31773E+02         1.65980E+02         4.65793E+02
+          3.75973E-03         1.47985E-02        -6.94158E-03         2.36205E-01         1.14914E+00         2.36307E-01         6.63815E+02         7.85598E-01         1.00295E+02         6.37402E+02         1.65723E+02         4.71678E+02
+          3.75973E-03         1.49683E-02        -7.10041E-03         2.36204E-01         1.15981E+00         2.36311E-01         6.81928E+02         7.85619E-01         9.84192E+01         6.43958E+02         1.66725E+02         4.77233E+02
+          3.75973E-03         1.51382E-02        -7.26105E-03         2.36204E-01         1.17048E+00         2.36315E-01         7.00044E+02         7.85640E-01         9.75035E+01         6.51273E+02         1.68852E+02         4.82422E+02
+          3.75973E-03         1.53080E-02        -7.42351E-03         2.36203E-01         1.18115E+00         2.36320E-01         7.17998E+02         7.85662E-01         9.74736E+01         6.59189E+02         1.71976E+02         4.87213E+02
+          3.75973E-03         1.54778E-02        -7.58778E-03         2.36203E-01         1.19182E+00         2.36324E-01         7.35637E+02         7.85685E-01         9.82374E+01         6.67557E+02         1.75977E+02         4.91581E+02
+          3.75973E-03         1.56476E-02        -7.75386E-03         2.36202E-01         1.20249E+00         2.36329E-01         7.52821E+02         7.85708E-01         9.96907E+01         6.76237E+02         1.80736E+02         4.95500E+02
+          3.75973E-03         1.58175E-02        -7.92176E-03         2.36201E-01         1.21317E+00         2.36334E-01         7.69420E+02         7.85733E-01         1.01725E+02         6.85097E+02         1.86144E+02         4.98953E+02
+          3.75973E-03         1.59873E-02        -8.09147E-03         2.36201E-01         1.22384E+00         2.36339E-01         7.85319E+02         7.85758E-01         1.04234E+02         6.94018E+02         1.92097E+02         5.01922E+02
+          3.75973E-03         1.61571E-02        -8.26299E-03         2.36200E-01         1.23451E+00         2.36344E-01         8.00413E+02         7.85784E-01         1.07117E+02         7.02888E+02         1.98494E+02         5.04394E+02
+          3.75973E-03         1.63270E-02        -8.43632E-03         2.36199E-01         1.24518E+00         2.36350E-01         8.14608E+02         7.85811E-01         1.10283E+02         7.11603E+02         2.05243E+02         5.06360E+02
+          3.75973E-03         1.64968E-02        -8.61147E-03         2.36199E-01         1.25585E+00         2.36356E-01         8.27821E+02         7.85839E-01         1.13651E+02         7.20071E+02         2.12257E+02         5.07814E+02
+          3.75973E-03         1.66666E-02        -8.78843E-03         2.36198E-01         1.26652E+00         2.36361E-01         8.39983E+02         7.85868E-01         1.17152E+02         7.28206E+02         2.19454E+02         5.08752E+02
+          3.75973E-03         1.68364E-02        -8.96720E-03         2.36197E-01         1.27719E+00         2.36368E-01         8.51033E+02         7.85898E-01         1.20725E+02         7.35932E+02         2.26758E+02         5.09174E+02
+          3.75973E-03         1.70063E-02        -9.14778E-03         2.36197E-01         1.28786E+00         2.36374E-01         8.60920E+02         7.85929E-01         1.24320E+02         7.43180E+02         2.34099E+02         5.09082E+02
+          3.75973E-03         1.71761E-02        -9.33018E-03         2.36196E-01         1.29853E+00         2.36380E-01         8.69604E+02         7.85961E-01         1.27894E+02         7.49892E+02         2.41411E+02         5.08480E+02
+          3.75973E-03         1.73459E-02        -9.51439E-03         2.36195E-01         1.30920E+00         2.36387E-01         8.77054E+02         7.85994E-01         1.31409E+02         7.56013E+02         2.48636E+02         5.07377E+02
+          3.75973E-03         1.75158E-02        -9.70042E-03         2.36195E-01         1.31987E+00         2.36394E-01         8.83249E+02         7.86028E-01         1.34837E+02         7.61501E+02         2.55719E+02         5.05781E+02
+          3.75973E-03         1.76856E-02        -9.88825E-03         2.36194E-01         1.33054E+00         2.36401E-01         8.88174E+02         7.86063E-01         1.38151E+02         7.66316E+02         2.62611E+02         5.03704E+02
+          3.75973E-03         1.78554E-02        -1.00779E-02         2.36193E-01         1.34121E+00         2.36408E-01         8.91826E+02         7.86099E-01         1.41332E+02         7.70428E+02         2.69268E+02         5.01160E+02
+          3.75973E-03         1.80252E-02        -1.02694E-02         2.36192E-01         1.35188E+00         2.36416E-01         8.94207E+02         7.86136E-01         1.44361E+02         7.73813E+02         2.75650E+02         4.98163E+02
+          3.75973E-03         1.81951E-02        -1.04626E-02         2.36192E-01         1.36255E+00         2.36423E-01         8.95325E+02         7.86175E-01         1.47224E+02         7.76453E+02         2.81722E+02         4.94731E+02
+          3.75973E-03         1.83649E-02        -1.06577E-02         2.36191E-01         1.37322E+00         2.36431E-01         8.95199E+02         7.86214E-01         1.49910E+02         7.78335E+02         2.87454E+02         4.90881E+02
+          3.75973E-03         1.85347E-02        -1.08546E-02         2.36190E-01         1.38389E+00         2.36440E-01         8.93850E+02         7.86255E-01         1.52410E+02         7.79454E+02         2.92820E+02         4.86634E+02
+          3.75973E-03         1.87045E-02        -1.10533E-02         2.36190E-01         1.39457E+00         2.36448E-01         8.91307E+02         7.86297E-01         1.54716E+02         7.79806E+02         2.97797E+02         4.82009E+02
+          3.75973E-03         1.88744E-02        -1.12539E-02         2.36189E-01         1.40524E+00         2.36457E-01         8.87604E+02         7.86340E-01         1.56822E+02         7.79397E+02         3.02369E+02         4.77028E+02
+          3.75973E-03         1.90442E-02        -1.14562E-02         2.36188E-01         1.41591E+00         2.36466E-01         8.82778E+02         7.86384E-01         1.58726E+02         7.78233E+02         3.06519E+02         4.71714E+02
+          3.75973E-03         1.92140E-02        -1.16604E-02         2.36187E-01         1.42658E+00         2.36475E-01         8.76874E+02         7.86430E-01         1.60423E+02         7.76326E+02         3.10237E+02         4.66089E+02
+          3.75973E-03         1.93839E-02        -1.18663E-02         2.36186E-01         1.43725E+00         2.36484E-01         8.69937E+02         7.86477E-01         1.61913E+02         7.73692E+02         3.13516E+02         4.60176E+02
+          3.75973E-03         1.95537E-02        -1.20741E-02         2.36186E-01         1.44792E+00         2.36494E-01         8.62018E+02         7.86525E-01         1.63196E+02         7.70350E+02         3.16350E+02         4.54000E+02
+          3.75973E-03         1.97235E-02        -1.22837E-02         2.36185E-01         1.45859E+00         2.36504E-01         8.53169E+02         7.86574E-01         1.64271E+02         7.66322E+02         3.18737E+02         4.47584E+02
+          3.75973E-03         1.98933E-02        -1.24951E-02         2.36184E-01         1.46926E+00         2.36514E-01         8.43445E+02         7.86625E-01         1.65141E+02         7.61633E+02         3.20680E+02         4.40953E+02
+          3.75973E-03         2.00632E-02        -1.27083E-02         2.36183E-01         1.47993E+00         2.36525E-01         8.32904E+02         7.86678E-01         1.65807E+02         7.56310E+02         3.22180E+02         4.34130E+02
+          3.75973E-03         2.02330E-02        -1.29234E-02         2.36182E-01         1.49060E+00         2.36536E-01         8.21605E+02         7.86731E-01         1.66273E+02         7.50383E+02         3.23244E+02         4.27139E+02
+          3.75973E-03         2.04028E-02        -1.31402E-02         2.36182E-01         1.50127E+00         2.36547E-01         8.09608E+02         7.86786E-01         1.66541E+02         7.43884E+02         3.23880E+02         4.20004E+02
+          3.75973E-03         2.05726E-02        -1.33589E-02         2.36181E-01         1.51194E+00         2.36558E-01         7.96974E+02         7.86843E-01         1.66615E+02         7.36844E+02         3.24096E+02         4.12748E+02
+          3.75973E-03         2.07425E-02        -1.35794E-02         2.36180E-01         1.52261E+00         2.36570E-01         7.83765E+02         7.86901E-01         1.66501E+02         7.29299E+02         3.23905E+02         4.05394E+02
+          3.75973E-03         2.09123E-02        -1.38016E-02         2.36179E-01         1.53328E+00         2.36582E-01         7.70041E+02         7.86960E-01         1.66203E+02         7.21282E+02         3.23318E+02         3.97964E+02
+          3.75973E-03         2.10821E-02        -1.40257E-02         2.36178E-01         1.54395E+00         2.36594E-01         7.55865E+02         7.87021E-01         1.65725E+02         7.12831E+02         3.22351E+02         3.90480E+02
+          3.75973E-03         2.12520E-02        -1.42517E-02         2.36177E-01         1.55462E+00         2.36607E-01         7.41298E+02         7.87084E-01         1.65075E+02         7.03981E+02         3.21019E+02         3.82962E+02
+          3.75973E-03         2.14218E-02        -1.44794E-02         2.36177E-01         1.56529E+00         2.36620E-01         7.26399E+02         7.87148E-01         1.64256E+02         6.94769E+02         3.19338E+02         3.75431E+02
+          3.75973E-03         2.15916E-02        -1.47089E-02         2.36176E-01         1.57596E+00         2.36633E-01         7.11227E+02         7.87214E-01         1.63276E+02         6.85232E+02         3.17325E+02         3.67907E+02
+          3.75973E-03         2.17614E-02        -1.49403E-02         2.36175E-01         1.58664E+00         2.36647E-01         6.95840E+02         7.87281E-01         1.62141E+02         6.75406E+02         3.14999E+02         3.60407E+02
+          3.75973E-03         2.19313E-02        -1.51734E-02         2.36174E-01         1.59731E+00         2.36661E-01         6.80295E+02         7.87350E-01         1.60856E+02         6.65327E+02         3.12377E+02         3.52950E+02
+          3.75973E-03         2.21011E-02        -1.54084E-02         2.36173E-01         1.60798E+00         2.36675E-01         6.64645E+02         7.87421E-01         1.59429E+02         6.55032E+02         3.09480E+02         3.45552E+02
+          3.75973E-03         2.22709E-02        -1.56452E-02         2.36172E-01         1.61865E+00         2.36690E-01         6.48943E+02         7.87493E-01         1.57865E+02         6.44554E+02         3.06326E+02         3.38228E+02
+          3.75973E-03         2.24407E-02        -1.58838E-02         2.36171E-01         1.62932E+00         2.36705E-01         6.33239E+02         7.87567E-01         1.56172E+02         6.33928E+02         3.02934E+02         3.30994E+02
+          3.75973E-03         2.26106E-02        -1.61242E-02         2.36170E-01         1.63999E+00         2.36720E-01         6.17582E+02         7.87643E-01         1.54356E+02         6.23187E+02         2.99325E+02         3.23862E+02
+          3.75973E-03         2.27804E-02        -1.63665E-02         2.36170E-01         1.65066E+00         2.36736E-01         6.02017E+02         7.87721E-01         1.52424E+02         6.12364E+02         2.95517E+02         3.16847E+02
+          3.75973E-03         2.29502E-02        -1.66105E-02         2.36169E-01         1.66133E+00         2.36752E-01         5.86587E+02         7.87800E-01         1.50381E+02         6.01489E+02         2.91531E+02         3.09958E+02
+          3.75973E-03         2.31201E-02        -1.68564E-02         2.36168E-01         1.67200E+00         2.36768E-01         5.71333E+02         7.87881E-01         1.48236E+02         5.90592E+02         2.87385E+02         3.03207E+02
+          3.75973E-03         2.32899E-02        -1.71041E-02         2.36167E-01         1.68267E+00         2.36785E-01         5.56293E+02         7.87965E-01         1.45993E+02         5.79701E+02         2.83098E+02         2.96603E+02
+          3.75973E-03         2.34597E-02        -1.73536E-02         2.36166E-01         1.69334E+00         2.36803E-01         5.41502E+02         7.88050E-01         1.43660E+02         5.68844E+02         2.78688E+02         2.90155E+02
+          3.75973E-03         2.36295E-02        -1.76049E-02         2.36165E-01         1.70401E+00         2.36820E-01         5.26993E+02         7.88137E-01         1.41244E+02         5.58045E+02         2.74175E+02         2.83870E+02
+          3.75973E-03         2.37994E-02        -1.78580E-02         2.36164E-01         1.71468E+00         2.36838E-01         5.12795E+02         7.88225E-01         1.38749E+02         5.47329E+02         2.69574E+02         2.77755E+02
+          3.75973E-03         2.39692E-02        -1.81129E-02         2.36163E-01         1.72535E+00         2.36857E-01         4.98935E+02         7.88316E-01         1.36183E+02         5.36718E+02         2.64903E+02         2.71815E+02
+          3.75973E-03         2.41390E-02        -1.83696E-02         2.36162E-01         1.73602E+00         2.36875E-01         4.85438E+02         7.88409E-01         1.33551E+02         5.26232E+02         2.60178E+02         2.66054E+02
+          3.75973E-03         2.43088E-02        -1.86282E-02         2.36161E-01         1.74669E+00         2.36895E-01         4.72325E+02         7.88504E-01         1.30859E+02         5.15892E+02         2.55415E+02         2.60477E+02
+          3.75973E-03         2.44787E-02        -1.88886E-02         2.36160E-01         1.75736E+00         2.36914E-01         4.59615E+02         7.88601E-01         1.28113E+02         5.05714E+02         2.50629E+02         2.55085E+02
+          3.75973E-03         2.46485E-02        -1.91508E-02         2.36159E-01         1.76804E+00         2.36934E-01         4.47323E+02         7.88700E-01         1.25319E+02         4.95715E+02         2.45833E+02         2.49882E+02
+          3.75973E-03         2.48183E-02        -1.94148E-02         2.36158E-01         1.77871E+00         2.36955E-01         4.35465E+02         7.88801E-01         1.22481E+02         4.85909E+02         2.41042E+02         2.44867E+02
+          3.75973E-03         2.49882E-02        -1.96806E-02         2.36157E-01         1.78938E+00         2.36976E-01         4.24050E+02         7.88904E-01         1.19606E+02         4.76309E+02         2.36268E+02         2.40042E+02
+          3.75973E-03         2.51580E-02        -1.99482E-02         2.36156E-01         1.80005E+00         2.36997E-01         4.13087E+02         7.89009E-01         1.16697E+02         4.66927E+02         2.31522E+02         2.35405E+02
+          3.75973E-03         2.53278E-02        -2.02176E-02         2.36155E-01         1.81072E+00         2.37019E-01         4.02583E+02         7.89117E-01         1.13761E+02         4.57772E+02         2.26816E+02         2.30956E+02
+          3.75973E-03         2.54976E-02        -2.04889E-02         2.36154E-01         1.82139E+00         2.37041E-01         3.92541E+02         7.89227E-01         1.10802E+02         4.48853E+02         2.22160E+02         2.26693E+02
+          3.75973E-03         2.56675E-02        -2.07620E-02         2.36153E-01         1.83206E+00         2.37064E-01         3.82964E+02         7.89339E-01         1.07824E+02         4.40176E+02         2.17563E+02         2.22613E+02
+          3.75973E-03         2.58373E-02        -2.10368E-02         2.36152E-01         1.84273E+00         2.37087E-01         3.73850E+02         7.89453E-01         1.04833E+02         4.31749E+02         2.13035E+02         2.18714E+02
+          3.75973E-03         2.60071E-02        -2.13135E-02         2.36151E-01         1.85340E+00         2.37111E-01         3.65198E+02         7.89570E-01         1.01832E+02         4.23574E+02         2.08582E+02         2.14992E+02
+          3.75973E-03         2.61769E-02        -2.15920E-02         2.36150E-01         1.86407E+00         2.37135E-01         3.57004E+02         7.89689E-01         9.88256E+01         4.15655E+02         2.04212E+02         2.11443E+02
+          3.92956E-03         8.72665E-04        -1.26240E-04         2.46901E-01         2.74155E-01         2.46901E-01         1.91913E+04         8.35715E-01         3.85498E+03         1.82910E+04         1.38979E+04         4.39311E+03
+          3.92956E-03         1.04249E-03        -1.36458E-04         2.46901E-01         2.84826E-01         2.46901E-01         1.87793E+04         8.35715E-01         3.78597E+03         1.79219E+04         1.36316E+04         4.29034E+03
+          3.92956E-03         1.21232E-03        -1.48488E-04         2.46901E-01         2.95496E-01         2.46901E-01         1.83597E+04         8.35715E-01         3.71554E+03         1.75458E+04         1.33598E+04         4.18594E+03
+          3.92956E-03         1.38215E-03        -1.62330E-04         2.46901E-01         3.06167E-01         2.46901E-01         1.79334E+04         8.35715E-01         3.64382E+03         1.71633E+04         1.30832E+04         4.08012E+03
+          3.92956E-03         1.55197E-03        -1.77984E-04         2.46901E-01         3.16838E-01         2.46901E-01         1.75009E+04         8.35715E-01         3.57091E+03         1.67751E+04         1.28020E+04         3.97308E+03
+          3.92956E-03         1.72180E-03        -1.95450E-04         2.46901E-01         3.27508E-01         2.46901E-01         1.70632E+04         8.35714E-01         3.49693E+03         1.63819E+04         1.25168E+04         3.86505E+03
+          3.92956E-03         1.89163E-03        -2.14729E-04         2.46901E-01         3.38179E-01         2.46901E-01         1.66210E+04         8.35714E-01         3.42201E+03         1.59843E+04         1.22281E+04         3.75623E+03
+          3.92956E-03         2.06146E-03        -2.35820E-04         2.46901E-01         3.48849E-01         2.46901E-01         1.61751E+04         8.35714E-01         3.34626E+03         1.55831E+04         1.19362E+04         3.64684E+03
+          3.92956E-03         2.23128E-03        -2.58723E-04         2.46901E-01         3.59520E-01         2.46901E-01         1.57262E+04         8.35714E-01         3.26980E+03         1.51788E+04         1.16418E+04         3.53707E+03
+          3.92956E-03         2.40111E-03        -2.83438E-04         2.46901E-01         3.70190E-01         2.46901E-01         1.52751E+04         8.35713E-01         3.19275E+03         1.47722E+04         1.13451E+04         3.42714E+03
+          3.92956E-03         2.57094E-03        -3.09965E-04         2.46901E-01         3.80861E-01         2.46901E-01         1.48225E+04         8.35713E-01         3.11522E+03         1.43639E+04         1.10467E+04         3.31725E+03
+          3.92956E-03         2.74077E-03        -3.38304E-04         2.46900E-01         3.91532E-01         2.46901E-01         1.43693E+04         8.35713E-01         3.03732E+03         1.39546E+04         1.07470E+04         3.20759E+03
+          3.92956E-03         2.91059E-03        -3.68456E-04         2.46900E-01         4.02202E-01         2.46901E-01         1.39160E+04         8.35712E-01         2.95918E+03         1.35449E+04         1.04465E+04         3.09836E+03
+          3.92956E-03         3.08042E-03        -4.00419E-04         2.46900E-01         4.12873E-01         2.46901E-01         1.34636E+04         8.35712E-01         2.88090E+03         1.31353E+04         1.01456E+04         2.98974E+03
+          3.92956E-03         3.25025E-03        -4.34195E-04         2.46900E-01         4.23543E-01         2.46900E-01         1.30125E+04         8.35712E-01         2.80260E+03         1.27267E+04         9.84474E+03         2.88192E+03
+          3.92956E-03         3.42008E-03        -4.69783E-04         2.46900E-01         4.34214E-01         2.46900E-01         1.25636E+04         8.35711E-01         2.72438E+03         1.23194E+04         9.54435E+03         2.77508E+03
+          3.92956E-03         3.58990E-03        -5.07183E-04         2.46900E-01         4.44884E-01         2.46900E-01         1.21175E+04         8.35711E-01         2.64634E+03         1.19142E+04         9.24483E+03         2.66938E+03
+          3.92956E-03         3.75973E-03        -5.46396E-04         2.46900E-01         4.55555E-01         2.46900E-01         1.16749E+04         8.35711E-01         2.56860E+03         1.15116E+04         8.94659E+03         2.56500E+03
+          3.92956E-03         3.92956E-03        -5.87420E-04         2.46899E-01         4.66225E-01         2.46900E-01         1.12363E+04         8.35710E-01         2.49125E+03         1.11121E+04         8.65003E+03         2.46208E+03
+          3.92956E-03         4.09939E-03        -6.30257E-04         2.46899E-01         4.76896E-01         2.46900E-01         1.08024E+04         8.35710E-01         2.41439E+03         1.07163E+04         8.35552E+03         2.36079E+03
+          3.92956E-03         4.26921E-03        -6.74906E-04         2.46899E-01         4.87567E-01         2.46900E-01         1.03737E+04         8.35710E-01         2.33811E+03         1.03247E+04         8.06343E+03         2.26126E+03
+          3.92956E-03         4.43904E-03        -7.21367E-04         2.46899E-01         4.98237E-01         2.46900E-01         9.95090E+03         8.35710E-01         2.26250E+03         9.93776E+03         7.77413E+03         2.16363E+03
+          3.92956E-03         4.60887E-03        -7.69640E-04         2.46899E-01         5.08908E-01         2.46900E-01         9.53440E+03         8.35709E-01         2.18766E+03         9.55598E+03         7.48795E+03         2.06803E+03
+          3.92956E-03         4.77869E-03        -8.19726E-04         2.46899E-01         5.19578E-01         2.46900E-01         9.12475E+03         8.35709E-01         2.11366E+03         9.17979E+03         7.20522E+03         1.97457E+03
+          3.92956E-03         4.94852E-03        -8.71623E-04         2.46898E-01         5.30249E-01         2.46900E-01         8.72242E+03         8.35709E-01         2.04058E+03         8.80962E+03         6.92625E+03         1.88337E+03
+          3.92956E-03         5.11835E-03        -9.25333E-04         2.46898E-01         5.40919E-01         2.46900E-01         8.32786E+03         8.35709E-01         1.96851E+03         8.44587E+03         6.65135E+03         1.79452E+03
+          3.92956E-03         5.28818E-03        -9.80855E-04         2.46898E-01         5.51590E-01         2.46900E-01         7.94148E+03         8.35709E-01         1.89751E+03         8.08892E+03         6.38079E+03         1.70813E+03
+          3.92956E-03         5.45800E-03        -1.03819E-03         2.46898E-01         5.62261E-01         2.46900E-01         7.56368E+03         8.35709E-01         1.82765E+03         7.73912E+03         6.11485E+03         1.62427E+03
+          3.92956E-03         5.62783E-03        -1.09734E-03         2.46897E-01         5.72931E-01         2.46900E-01         7.19482E+03         8.35709E-01         1.75899E+03         7.39679E+03         5.85377E+03         1.54302E+03
+          3.92956E-03         5.79766E-03        -1.15830E-03         2.46897E-01         5.83602E-01         2.46900E-01         6.83521E+03         8.35709E-01         1.69159E+03         7.06224E+03         5.59779E+03         1.46444E+03
+          3.92956E-03         5.96749E-03        -1.22107E-03         2.46897E-01         5.94272E-01         2.46900E-01         6.48518E+03         8.35710E-01         1.62551E+03         6.73573E+03         5.34713E+03         1.38860E+03
+          3.92956E-03         6.13731E-03        -1.28565E-03         2.46897E-01         6.04943E-01         2.46900E-01         6.14497E+03         8.35710E-01         1.56080E+03         6.41753E+03         5.10198E+03         1.31555E+03
+          3.92956E-03         6.30714E-03        -1.35204E-03         2.46896E-01         6.15613E-01         2.46900E-01         5.81484E+03         8.35710E-01         1.49750E+03         6.10785E+03         4.86254E+03         1.24531E+03
+          3.92956E-03         6.47697E-03        -1.42025E-03         2.46896E-01         6.26284E-01         2.46900E-01         5.49499E+03         8.35711E-01         1.43565E+03         5.80689E+03         4.62896E+03         1.17793E+03
+          3.92956E-03         6.64680E-03        -1.49027E-03         2.46896E-01         6.36955E-01         2.46900E-01         5.18560E+03         8.35711E-01         1.37530E+03         5.51483E+03         4.40140E+03         1.11343E+03
+          3.92956E-03         6.81662E-03        -1.56210E-03         2.46896E-01         6.47625E-01         2.46901E-01         4.88682E+03         8.35712E-01         1.31647E+03         5.23181E+03         4.17999E+03         1.05181E+03
+          3.92956E-03         6.98645E-03        -1.63575E-03         2.46895E-01         6.58296E-01         2.46901E-01         4.59877E+03         8.35713E-01         1.25919E+03         4.95796E+03         3.96486E+03         9.93100E+02
+          3.92956E-03         7.15628E-03        -1.71121E-03         2.46895E-01         6.68966E-01         2.46901E-01         4.32154E+03         8.35714E-01         1.20348E+03         4.69337E+03         3.75609E+03         9.37281E+02
+          3.92956E-03         7.32611E-03        -1.78848E-03         2.46895E-01         6.79637E-01         2.46901E-01         4.05519E+03         8.35715E-01         1.14937E+03         4.43812E+03         3.55377E+03         8.84349E+02
+          3.92956E-03         7.49593E-03        -1.86756E-03         2.46894E-01         6.90307E-01         2.46902E-01         3.79975E+03         8.35716E-01         1.09687E+03         4.19226E+03         3.35797E+03         8.34286E+02
+          3.92956E-03         7.66576E-03        -1.94845E-03         2.46894E-01         7.00978E-01         2.46902E-01         3.55524E+03         8.35718E-01         1.04598E+03         3.95581E+03         3.16875E+03         7.87068E+02
+          3.92956E-03         7.83559E-03        -2.03116E-03         2.46894E-01         7.11649E-01         2.46902E-01         3.32164E+03         8.35719E-01         9.96724E+02         3.72879E+03         2.98613E+03         7.42664E+02
+          3.92956E-03         8.00542E-03        -2.11567E-03         2.46893E-01         7.22319E-01         2.46903E-01         3.09889E+03         8.35721E-01         9.49093E+02         3.51118E+03         2.81014E+03         7.01035E+02
+          3.92956E-03         8.17524E-03        -2.20201E-03         2.46893E-01         7.32990E-01         2.46903E-01         2.88694E+03         8.35723E-01         9.03087E+02         3.30293E+03         2.64079E+03         6.62139E+02
+          3.92956E-03         8.34507E-03        -2.29015E-03         2.46893E-01         7.43660E-01         2.46903E-01         2.68569E+03         8.35725E-01         8.58700E+02         3.10399E+03         2.47806E+03         6.25924E+02
+          3.92956E-03         8.51490E-03        -2.38010E-03         2.46892E-01         7.54331E-01         2.46904E-01         2.49502E+03         8.35727E-01         8.15924E+02         2.91428E+03         2.32195E+03         5.92334E+02
+          3.92956E-03         8.68473E-03        -2.47187E-03         2.46892E-01         7.65001E-01         2.46904E-01         2.31480E+03         8.35729E-01         7.74744E+02         2.73371E+03         2.17240E+03         5.61309E+02
+          3.92956E-03         8.85455E-03        -2.56545E-03         2.46892E-01         7.75672E-01         2.46905E-01         2.14486E+03         8.35732E-01         7.35143E+02         2.56216E+03         2.02938E+03         5.32781E+02
+          3.92956E-03         9.02438E-03        -2.66084E-03         2.46891E-01         7.86343E-01         2.46906E-01         1.98504E+03         8.35735E-01         6.97103E+02         2.39950E+03         1.89282E+03         5.06682E+02
+          3.92956E-03         9.19421E-03        -2.75805E-03         2.46891E-01         7.97013E-01         2.46906E-01         1.83514E+03         8.35738E-01         6.60599E+02         2.24558E+03         1.76265E+03         4.82934E+02
+          3.92956E-03         9.36403E-03        -2.85706E-03         2.46891E-01         8.07684E-01         2.46907E-01         1.69494E+03         8.35741E-01         6.25606E+02         2.10025E+03         1.63879E+03         4.61461E+02
+          3.92956E-03         9.53386E-03        -2.95789E-03         2.46890E-01         8.18354E-01         2.46908E-01         1.56421E+03         8.35745E-01         5.92094E+02         1.96332E+03         1.52114E+03         4.42179E+02
+          3.92956E-03         9.70369E-03        -3.06054E-03         2.46890E-01         8.29025E-01         2.46909E-01         1.44272E+03         8.35749E-01         5.60032E+02         1.83461E+03         1.40961E+03         4.25005E+02
+          3.92956E-03         9.87352E-03        -3.16499E-03         2.46889E-01         8.39695E-01         2.46910E-01         1.33019E+03         8.35753E-01         5.29386E+02         1.71392E+03         1.30407E+03         4.09849E+02
+          3.92956E-03         1.00433E-02        -3.27126E-03         2.46889E-01         8.50366E-01         2.46911E-01         1.22638E+03         8.35757E-01         5.00120E+02         1.60104E+03         1.20442E+03         3.96622E+02
+          3.92956E-03         1.02132E-02        -3.37934E-03         2.46889E-01         8.61037E-01         2.46912E-01         1.13098E+03         8.35762E-01         4.72197E+02         1.49574E+03         1.11051E+03         3.85232E+02
+          3.92956E-03         1.03830E-02        -3.48923E-03         2.46888E-01         8.71707E-01         2.46913E-01         1.04372E+03         8.35767E-01         4.45578E+02         1.39779E+03         1.02220E+03         3.75585E+02
+          3.92956E-03         1.05528E-02        -3.60093E-03         2.46888E-01         8.82378E-01         2.46914E-01         9.64298E+02         8.35772E-01         4.20222E+02         1.30696E+03         9.39371E+02         3.67588E+02
+          3.92956E-03         1.07227E-02        -3.71445E-03         2.46887E-01         8.93048E-01         2.46915E-01         8.92401E+02         8.35777E-01         3.96087E+02         1.22300E+03         8.61854E+02         3.61145E+02
+          3.92956E-03         1.08925E-02        -3.82978E-03         2.46887E-01         9.03719E-01         2.46916E-01         8.27719E+02         8.35783E-01         3.73133E+02         1.14566E+03         7.89498E+02         3.56160E+02
+          3.92956E-03         1.10623E-02        -3.94692E-03         2.46886E-01         9.14389E-01         2.46918E-01         7.69934E+02         8.35789E-01         3.51318E+02         1.07468E+03         7.22144E+02         3.52537E+02
+          3.92956E-03         1.12321E-02        -4.06587E-03         2.46886E-01         9.25060E-01         2.46919E-01         7.18725E+02         8.35796E-01         3.30600E+02         1.00981E+03         6.59626E+02         3.50181E+02
+          3.92956E-03         1.14020E-02        -4.18664E-03         2.46885E-01         9.35731E-01         2.46921E-01         6.73768E+02         8.35803E-01         3.10937E+02         9.50775E+02         6.01777E+02         3.48997E+02
+          3.92956E-03         1.15718E-02        -4.30922E-03         2.46885E-01         9.46401E-01         2.46922E-01         6.34737E+02         8.35810E-01         2.92291E+02         8.97317E+02         5.48426E+02         3.48891E+02
+          3.92956E-03         1.17416E-02        -4.43361E-03         2.46884E-01         9.57072E-01         2.46924E-01         6.01305E+02         8.35818E-01         2.74623E+02         8.49169E+02         4.99399E+02         3.49770E+02
+          3.92956E-03         1.19114E-02        -4.55981E-03         2.46884E-01         9.67742E-01         2.46926E-01         5.73146E+02         8.35826E-01         2.57896E+02         8.06063E+02         4.54520E+02         3.51543E+02
+          3.92956E-03         1.20813E-02        -4.68783E-03         2.46883E-01         9.78413E-01         2.46928E-01         5.49937E+02         8.35834E-01         2.42076E+02         7.67733E+02         4.13614E+02         3.54119E+02
+          3.92956E-03         1.22511E-02        -4.81766E-03         2.46883E-01         9.89083E-01         2.46930E-01         5.31354E+02         8.35843E-01         2.27132E+02         7.33914E+02         3.76503E+02         3.57412E+02
+          3.92956E-03         1.24209E-02        -4.94930E-03         2.46882E-01         9.99754E-01         2.46932E-01         5.17081E+02         8.35852E-01         2.13035E+02         7.04343E+02         3.43009E+02         3.61335E+02
+          3.92956E-03         1.25908E-02        -5.08275E-03         2.46882E-01         1.01042E+00         2.46934E-01         5.06801E+02         8.35862E-01         1.99763E+02         6.78760E+02         3.12955E+02         3.65805E+02
+          3.92956E-03         1.27606E-02        -5.21802E-03         2.46881E-01         1.02110E+00         2.46936E-01         5.00207E+02         8.35872E-01         1.87295E+02         6.56907E+02         2.86164E+02         3.70742E+02
+          3.92956E-03         1.29304E-02        -5.35510E-03         2.46881E-01         1.03177E+00         2.46939E-01         4.96994E+02         8.35883E-01         1.75616E+02         6.38531E+02         2.62463E+02         3.76068E+02
+          3.92956E-03         1.31002E-02        -5.49399E-03         2.46880E-01         1.04244E+00         2.46941E-01         4.96867E+02         8.35894E-01         1.64716E+02         6.23384E+02         2.41676E+02         3.81708E+02
+          3.92956E-03         1.32701E-02        -5.63469E-03         2.46880E-01         1.05311E+00         2.46944E-01         4.99536E+02         8.35906E-01         1.54590E+02         6.11224E+02         2.23633E+02         3.87591E+02
+          3.92956E-03         1.34399E-02        -5.77721E-03         2.46879E-01         1.06378E+00         2.46947E-01         5.04718E+02         8.35918E-01         1.45239E+02         6.01812E+02         2.08165E+02         3.93647E+02
+          3.92956E-03         1.36097E-02        -5.92154E-03         2.46879E-01         1.07445E+00         2.46950E-01         5.12142E+02         8.35931E-01         1.36670E+02         5.94918E+02         1.95106E+02         3.99812E+02
+          3.92956E-03         1.37795E-02        -6.06768E-03         2.46878E-01         1.08512E+00         2.46953E-01         5.21543E+02         8.35944E-01         1.28892E+02         5.90317E+02         1.84293E+02         4.06024E+02
+          3.92956E-03         1.39494E-02        -6.21564E-03         2.46877E-01         1.09579E+00         2.46956E-01         5.32667E+02         8.35958E-01         1.21919E+02         5.87792E+02         1.75568E+02         4.12224E+02
+          3.92956E-03         1.41192E-02        -6.36540E-03         2.46877E-01         1.10646E+00         2.46959E-01         5.45268E+02         8.35973E-01         1.15768E+02         5.87133E+02         1.68775E+02         4.18358E+02
+          3.92956E-03         1.42890E-02        -6.51698E-03         2.46876E-01         1.11713E+00         2.46962E-01         5.59113E+02         8.35988E-01         1.10452E+02         5.88137E+02         1.63762E+02         4.24375E+02
+          3.92956E-03         1.44589E-02        -6.67038E-03         2.46876E-01         1.12780E+00         2.46966E-01         5.73978E+02         8.36003E-01         1.05982E+02         5.90610E+02         1.60384E+02         4.30226E+02
+          3.92956E-03         1.46287E-02        -6.82558E-03         2.46875E-01         1.13847E+00         2.46969E-01         5.89649E+02         8.36020E-01         1.02361E+02         5.94366E+02         1.58498E+02         4.35868E+02
+          3.92956E-03         1.47985E-02        -6.98260E-03         2.46874E-01         1.14914E+00         2.46973E-01         6.05925E+02         8.36036E-01         9.95786E+01         5.99227E+02         1.57966E+02         4.41261E+02
+          3.92956E-03         1.49683E-02        -7.14143E-03         2.46874E-01         1.15981E+00         2.46977E-01         6.22615E+02         8.36054E-01         9.76132E+01         6.05025E+02         1.58657E+02         4.46368E+02
+          3.92956E-03         1.51382E-02        -7.30207E-03         2.46873E-01         1.17048E+00         2.46981E-01         6.39539E+02         8.36072E-01         9.64260E+01         6.11598E+02         1.60442E+02         4.51156E+02
+          3.92956E-03         1.53080E-02        -7.46453E-03         2.46872E-01         1.18115E+00         2.46985E-01         6.56529E+02         8.36091E-01         9.59640E+01         6.18796E+02         1.63201E+02         4.55595E+02
+          3.92956E-03         1.54778E-02        -7.62880E-03         2.46872E-01         1.19182E+00         2.46990E-01         6.73428E+02         8.36110E-01         9.61614E+01         6.26475E+02         1.66815E+02         4.59659E+02
+          3.92956E-03         1.56476E-02        -7.79488E-03         2.46871E-01         1.20249E+00         2.46994E-01         6.90091E+02         8.36131E-01         9.69436E+01         6.34501E+02         1.71175E+02         4.63326E+02
+          3.92956E-03         1.58175E-02        -7.96278E-03         2.46871E-01         1.21317E+00         2.46999E-01         7.06384E+02         8.36152E-01         9.82312E+01         6.42748E+02         1.76173E+02         4.66575E+02
+          3.92956E-03         1.59873E-02        -8.13249E-03         2.46870E-01         1.22384E+00         2.47004E-01         7.22184E+02         8.36173E-01         9.99439E+01         6.51101E+02         1.81710E+02         4.69391E+02
+          3.92956E-03         1.61571E-02        -8.30401E-03         2.46869E-01         1.23451E+00         2.47009E-01         7.37379E+02         8.36196E-01         1.02004E+02         6.59452E+02         1.87690E+02         4.71761E+02
+          3.92956E-03         1.63270E-02        -8.47734E-03         2.46868E-01         1.24518E+00         2.47014E-01         7.51869E+02         8.36219E-01         1.04339E+02         6.67700E+02         1.94025E+02         4.73675E+02
+          3.92956E-03         1.64968E-02        -8.65249E-03         2.46868E-01         1.25585E+00         2.47019E-01         7.65562E+02         8.36243E-01         1.06883E+02         6.75755E+02         2.00630E+02         4.75125E+02
+          3.92956E-03         1.66666E-02        -8.82944E-03         2.46867E-01         1.26652E+00         2.47025E-01         7.78378E+02         8.36268E-01         1.09576E+02         6.83534E+02         2.07426E+02         4.76108E+02
+          3.92956E-03         1.68364E-02        -9.00822E-03         2.46866E-01         1.27719E+00         2.47031E-01         7.90249E+02         8.36294E-01         1.12366E+02         6.90962E+02         2.14342E+02         4.76620E+02
+          3.92956E-03         1.70063E-02        -9.18880E-03         2.46866E-01         1.28786E+00         2.47037E-01         8.01115E+02         8.36320E-01         1.15207E+02         6.97972E+02         2.21308E+02         4.76665E+02
+          3.92956E-03         1.71761E-02        -9.37120E-03         2.46865E-01         1.29853E+00         2.47043E-01         8.10924E+02         8.36348E-01         1.18060E+02         7.04505E+02         2.28262E+02         4.76244E+02
+          3.92956E-03         1.73459E-02        -9.55541E-03         2.46864E-01         1.30920E+00         2.47049E-01         8.19636E+02         8.36376E-01         1.20892E+02         7.10509E+02         2.35146E+02         4.75363E+02
+          3.92956E-03         1.75158E-02        -9.74143E-03         2.46864E-01         1.31987E+00         2.47056E-01         8.27217E+02         8.36405E-01         1.23674E+02         7.15938E+02         2.41909E+02         4.74030E+02
+          3.92956E-03         1.76856E-02        -9.92927E-03         2.46863E-01         1.33054E+00         2.47062E-01         8.33646E+02         8.36435E-01         1.26382E+02         7.20755E+02         2.48501E+02         4.72254E+02
+          3.92956E-03         1.78554E-02        -1.01189E-02         2.46862E-01         1.34121E+00         2.47069E-01         8.38904E+02         8.36466E-01         1.28994E+02         7.24927E+02         2.54881E+02         4.70046E+02
+          3.92956E-03         1.80252E-02        -1.03104E-02         2.46861E-01         1.35188E+00         2.47077E-01         8.42984E+02         8.36498E-01         1.31494E+02         7.28430E+02         2.61010E+02         4.67420E+02
+          3.92956E-03         1.81951E-02        -1.05037E-02         2.46861E-01         1.36255E+00         2.47084E-01         8.45886E+02         8.36531E-01         1.33868E+02         7.31243E+02         2.66853E+02         4.64390E+02
+          3.92956E-03         1.83649E-02        -1.06987E-02         2.46860E-01         1.37322E+00         2.47091E-01         8.47613E+02         8.36565E-01         1.36103E+02         7.33353E+02         2.72381E+02         4.60972E+02
+          3.92956E-03         1.85347E-02        -1.08957E-02         2.46859E-01         1.38389E+00         2.47099E-01         8.48179E+02         8.36600E-01         1.38190E+02         7.34750E+02         2.77568E+02         4.57182E+02
+          3.92956E-03         1.87045E-02        -1.10944E-02         2.46858E-01         1.39457E+00         2.47107E-01         8.47602E+02         8.36636E-01         1.40121E+02         7.35432E+02         2.82392E+02         4.53040E+02
+          3.92956E-03         1.88744E-02        -1.12949E-02         2.46857E-01         1.40524E+00         2.47116E-01         8.45904E+02         8.36673E-01         1.41889E+02         7.35399E+02         2.86835E+02         4.48563E+02
+          3.92956E-03         1.90442E-02        -1.14972E-02         2.46857E-01         1.41591E+00         2.47124E-01         8.43114E+02         8.36711E-01         1.43491E+02         7.34655E+02         2.90883E+02         4.43772E+02
+          3.92956E-03         1.92140E-02        -1.17014E-02         2.46856E-01         1.42658E+00         2.47133E-01         8.39265E+02         8.36751E-01         1.44921E+02         7.33211E+02         2.94524E+02         4.38688E+02
+          3.92956E-03         1.93839E-02        -1.19074E-02         2.46855E-01         1.43725E+00         2.47142E-01         8.34394E+02         8.36791E-01         1.46179E+02         7.31079E+02         2.97749E+02         4.33330E+02
+          3.92956E-03         1.95537E-02        -1.21151E-02         2.46854E-01         1.44792E+00         2.47151E-01         8.28541E+02         8.36832E-01         1.47263E+02         7.28276E+02         3.00554E+02         4.27722E+02
+          3.92956E-03         1.97235E-02        -1.23247E-02         2.46853E-01         1.45859E+00         2.47161E-01         8.21751E+02         8.36875E-01         1.48172E+02         7.24820E+02         3.02936E+02         4.21883E+02
+          3.92956E-03         1.98933E-02        -1.25361E-02         2.46853E-01         1.46926E+00         2.47171E-01         8.14071E+02         8.36919E-01         1.48907E+02         7.20733E+02         3.04896E+02         4.15837E+02
+          3.92956E-03         2.00632E-02        -1.27494E-02         2.46852E-01         1.47993E+00         2.47181E-01         8.05549E+02         8.36963E-01         1.49469E+02         7.16040E+02         3.06436E+02         4.09604E+02
+          3.92956E-03         2.02330E-02        -1.29644E-02         2.46851E-01         1.49060E+00         2.47191E-01         7.96238E+02         8.37010E-01         1.49859E+02         7.10767E+02         3.07560E+02         4.03206E+02
+          3.92956E-03         2.04028E-02        -1.31812E-02         2.46850E-01         1.50127E+00         2.47202E-01         7.86190E+02         8.37057E-01         1.50081E+02         7.04942E+02         3.08276E+02         3.96666E+02
+          3.92956E-03         2.05726E-02        -1.33999E-02         2.46849E-01         1.51194E+00         2.47213E-01         7.75460E+02         8.37105E-01         1.50137E+02         6.98596E+02         3.08592E+02         3.90004E+02
+          3.92956E-03         2.07425E-02        -1.36204E-02         2.46848E-01         1.52261E+00         2.47224E-01         7.64103E+02         8.37155E-01         1.50030E+02         6.91759E+02         3.08518E+02         3.83241E+02
+          3.92956E-03         2.09123E-02        -1.38427E-02         2.46847E-01         1.53328E+00         2.47235E-01         7.52175E+02         8.37206E-01         1.49764E+02         6.84464E+02         3.08067E+02         3.76398E+02
+          3.92956E-03         2.10821E-02        -1.40668E-02         2.46847E-01         1.54395E+00         2.47247E-01         7.39732E+02         8.37259E-01         1.49343E+02         6.76744E+02         3.07250E+02         3.69494E+02
+          3.92956E-03         2.12520E-02        -1.42927E-02         2.46846E-01         1.55462E+00         2.47259E-01         7.26832E+02         8.37313E-01         1.48771E+02         6.68633E+02         3.06083E+02         3.62550E+02
+          3.92956E-03         2.14218E-02        -1.45204E-02         2.46845E-01         1.56529E+00         2.47271E-01         7.13529E+02         8.37368E-01         1.48054E+02         6.60164E+02         3.04580E+02         3.55583E+02
+          3.92956E-03         2.15916E-02        -1.47499E-02         2.46844E-01         1.57596E+00         2.47284E-01         6.99879E+02         8.37424E-01         1.47195E+02         6.51371E+02         3.02759E+02         3.48612E+02
+          3.92956E-03         2.17614E-02        -1.49813E-02         2.46843E-01         1.58664E+00         2.47297E-01         6.85937E+02         8.37482E-01         1.46201E+02         6.42289E+02         3.00635E+02         3.41655E+02
+          3.92956E-03         2.19313E-02        -1.52145E-02         2.46842E-01         1.59731E+00         2.47310E-01         6.71757E+02         8.37541E-01         1.45075E+02         6.32952E+02         2.98226E+02         3.34727E+02
+          3.92956E-03         2.21011E-02        -1.54494E-02         2.46841E-01         1.60798E+00         2.47324E-01         6.57390E+02         8.37602E-01         1.43825E+02         6.23393E+02         2.95550E+02         3.27844E+02
+          3.92956E-03         2.22709E-02        -1.56862E-02         2.46840E-01         1.61865E+00         2.47338E-01         6.42888E+02         8.37664E-01         1.42453E+02         6.13646E+02         2.92625E+02         3.21021E+02
+          3.92956E-03         2.24407E-02        -1.59248E-02         2.46839E-01         1.62932E+00         2.47352E-01         6.28299E+02         8.37728E-01         1.40968E+02         6.03741E+02         2.89469E+02         3.14272E+02
+          3.92956E-03         2.26106E-02        -1.61653E-02         2.46838E-01         1.63999E+00         2.47367E-01         6.13672E+02         8.37793E-01         1.39373E+02         5.93712E+02         2.86102E+02         3.07610E+02
+          3.92956E-03         2.27804E-02        -1.64075E-02         2.46837E-01         1.65066E+00         2.47382E-01         5.99051E+02         8.37860E-01         1.37675E+02         5.83587E+02         2.82541E+02         3.01047E+02
+          3.92956E-03         2.29502E-02        -1.66515E-02         2.46836E-01         1.66133E+00         2.47397E-01         5.84480E+02         8.37928E-01         1.35879E+02         5.73398E+02         2.78804E+02         2.94594E+02
+          3.92956E-03         2.31201E-02        -1.68974E-02         2.46835E-01         1.67200E+00         2.47413E-01         5.70000E+02         8.37998E-01         1.33990E+02         5.63172E+02         2.74911E+02         2.88261E+02
+          3.92956E-03         2.32899E-02        -1.71451E-02         2.46834E-01         1.68267E+00         2.47429E-01         5.55651E+02         8.38070E-01         1.32014E+02         5.52936E+02         2.70879E+02         2.82057E+02
+          3.92956E-03         2.34597E-02        -1.73946E-02         2.46833E-01         1.69334E+00         2.47446E-01         5.41467E+02         8.38143E-01         1.29957E+02         5.42717E+02         2.66725E+02         2.75992E+02
+          3.92956E-03         2.36295E-02        -1.76459E-02         2.46832E-01         1.70401E+00         2.47462E-01         5.27485E+02         8.38217E-01         1.27824E+02         5.32538E+02         2.62467E+02         2.70071E+02
+          3.92956E-03         2.37994E-02        -1.78990E-02         2.46831E-01         1.71468E+00         2.47480E-01         5.13734E+02         8.38294E-01         1.25619E+02         5.22423E+02         2.58121E+02         2.64302E+02
+          3.92956E-03         2.39692E-02        -1.81539E-02         2.46830E-01         1.72535E+00         2.47497E-01         5.00245E+02         8.38372E-01         1.23350E+02         5.12394E+02         2.53704E+02         2.58690E+02
+          3.92956E-03         2.41390E-02        -1.84107E-02         2.46829E-01         1.73602E+00         2.47515E-01         4.87045E+02         8.38452E-01         1.21020E+02         5.02471E+02         2.49231E+02         2.53241E+02
+          3.92956E-03         2.43088E-02        -1.86692E-02         2.46828E-01         1.74669E+00         2.47533E-01         4.74157E+02         8.38533E-01         1.18634E+02         4.92673E+02         2.44717E+02         2.47956E+02
+          3.92956E-03         2.44787E-02        -1.89296E-02         2.46827E-01         1.75736E+00         2.47552E-01         4.61603E+02         8.38616E-01         1.16198E+02         4.83017E+02         2.40176E+02         2.42841E+02
+          3.92956E-03         2.46485E-02        -1.91918E-02         2.46826E-01         1.76804E+00         2.47571E-01         4.49402E+02         8.38701E-01         1.13717E+02         4.73519E+02         2.35622E+02         2.37897E+02
+          3.92956E-03         2.48183E-02        -1.94558E-02         2.46825E-01         1.77871E+00         2.47591E-01         4.37572E+02         8.38788E-01         1.11194E+02         4.64193E+02         2.31068E+02         2.33125E+02
+          3.92956E-03         2.49882E-02        -1.97216E-02         2.46824E-01         1.78938E+00         2.47611E-01         4.26126E+02         8.38877E-01         1.08636E+02         4.55053E+02         2.26526E+02         2.28526E+02
+          3.92956E-03         2.51580E-02        -1.99892E-02         2.46823E-01         1.80005E+00         2.47631E-01         4.15077E+02         8.38967E-01         1.06045E+02         4.46109E+02         2.22008E+02         2.24101E+02
+          3.92956E-03         2.53278E-02        -2.02586E-02         2.46822E-01         1.81072E+00         2.47652E-01         4.04435E+02         8.39060E-01         1.03426E+02         4.37372E+02         2.17524E+02         2.19849E+02
+          3.92956E-03         2.54976E-02        -2.05299E-02         2.46821E-01         1.82139E+00         2.47673E-01         3.94207E+02         8.39154E-01         1.00785E+02         4.28851E+02         2.13084E+02         2.15767E+02
+          3.92956E-03         2.56675E-02        -2.08030E-02         2.46820E-01         1.83206E+00         2.47695E-01         3.84398E+02         8.39250E-01         9.81234E+01         4.20554E+02         2.08697E+02         2.11856E+02
+          3.92956E-03         2.58373E-02        -2.10779E-02         2.46819E-01         1.84273E+00         2.47717E-01         3.75013E+02         8.39349E-01         9.54468E+01         4.12485E+02         2.04373E+02         2.08112E+02
+          3.92956E-03         2.60071E-02        -2.13545E-02         2.46818E-01         1.85340E+00         2.47740E-01         3.66053E+02         8.39449E-01         9.27585E+01         4.04650E+02         2.00118E+02         2.04533E+02
+          3.92956E-03         2.61769E-02        -2.16331E-02         2.46817E-01         1.86407E+00         2.47763E-01         3.57518E+02         8.39551E-01         9.00622E+01         3.97054E+02         1.95939E+02         2.01115E+02
+          4.09939E-03         8.72665E-04        -1.69077E-04         2.57572E-01         2.74155E-01         2.57572E-01         1.84572E+04         8.80176E-01         3.28940E+03         1.72395E+04         1.32176E+04         4.02188E+03
+          4.09939E-03         1.04249E-03        -1.79295E-04         2.57572E-01         2.84826E-01         2.57572E-01         1.80699E+04         8.80176E-01         3.23111E+03         1.68946E+04         1.29655E+04         3.92910E+03
+          4.09939E-03         1.21232E-03        -1.91325E-04         2.57572E-01         2.95496E-01         2.57572E-01         1.76754E+04         8.80176E-01         3.17162E+03         1.65430E+04         1.27082E+04         3.83482E+03
+          4.09939E-03         1.38215E-03        -2.05167E-04         2.57572E-01         3.06167E-01         2.57572E-01         1.72742E+04         8.80176E-01         3.11102E+03         1.61854E+04         1.24462E+04         3.73923E+03
+          4.09939E-03         1.55197E-03        -2.20821E-04         2.57572E-01         3.16838E-01         2.57572E-01         1.68671E+04         8.80176E-01         3.04942E+03         1.58224E+04         1.21799E+04         3.64252E+03
+          4.09939E-03         1.72180E-03        -2.38287E-04         2.57572E-01         3.27508E-01         2.57572E-01         1.64549E+04         8.80175E-01         2.98692E+03         1.54547E+04         1.19098E+04         3.54489E+03
+          4.09939E-03         1.89163E-03        -2.57566E-04         2.57572E-01         3.38179E-01         2.57572E-01         1.60383E+04         8.80175E-01         2.92360E+03         1.50828E+04         1.16363E+04         3.44652E+03
+          4.09939E-03         2.06146E-03        -2.78657E-04         2.57571E-01         3.48849E-01         2.57572E-01         1.56179E+04         8.80175E-01         2.85958E+03         1.47074E+04         1.13598E+04         3.34760E+03
+          4.09939E-03         2.23128E-03        -3.01560E-04         2.57571E-01         3.59520E-01         2.57572E-01         1.51945E+04         8.80175E-01         2.79496E+03         1.43292E+04         1.10808E+04         3.24832E+03
+          4.09939E-03         2.40111E-03        -3.26275E-04         2.57571E-01         3.70190E-01         2.57571E-01         1.47688E+04         8.80174E-01         2.72982E+03         1.39486E+04         1.07997E+04         3.14886E+03
+          4.09939E-03         2.57094E-03        -3.52802E-04         2.57571E-01         3.80861E-01         2.57571E-01         1.43415E+04         8.80174E-01         2.66427E+03         1.35664E+04         1.05170E+04         3.04940E+03
+          4.09939E-03         2.74077E-03        -3.81141E-04         2.57571E-01         3.91532E-01         2.57571E-01         1.39133E+04         8.80174E-01         2.59840E+03         1.31831E+04         1.02330E+04         2.95012E+03
+          4.09939E-03         2.91059E-03        -4.11292E-04         2.57571E-01         4.02202E-01         2.57571E-01         1.34848E+04         8.80174E-01         2.53232E+03         1.27994E+04         9.94817E+03         2.85119E+03
+          4.09939E-03         3.08042E-03        -4.43256E-04         2.57571E-01         4.12873E-01         2.57571E-01         1.30568E+04         8.80173E-01         2.46611E+03         1.24157E+04         9.66294E+03         2.75278E+03
+          4.09939E-03         3.25025E-03        -4.77032E-04         2.57571E-01         4.23543E-01         2.57571E-01         1.26299E+04         8.80173E-01         2.39987E+03         1.20328E+04         9.37772E+03         2.65506E+03
+          4.09939E-03         3.42008E-03        -5.12620E-04         2.57570E-01         4.34214E-01         2.57571E-01         1.22047E+04         8.80173E-01         2.33369E+03         1.16511E+04         9.09290E+03         2.55819E+03
+          4.09939E-03         3.58990E-03        -5.50020E-04         2.57570E-01         4.44884E-01         2.57571E-01         1.17818E+04         8.80172E-01         2.26766E+03         1.12712E+04         8.80888E+03         2.46233E+03
+          4.09939E-03         3.75973E-03        -5.89232E-04         2.57570E-01         4.55555E-01         2.57571E-01         1.13619E+04         8.80172E-01         2.20187E+03         1.08936E+04         8.52604E+03         2.36761E+03
+          4.09939E-03         3.92956E-03        -6.30257E-04         2.57570E-01         4.66225E-01         2.57571E-01         1.09455E+04         8.80172E-01         2.13640E+03         1.05189E+04         8.24474E+03         2.27418E+03
+          4.09939E-03         4.09939E-03        -6.73094E-04         2.57570E-01         4.76896E-01         2.57571E-01         1.05333E+04         8.80172E-01         2.07133E+03         1.01475E+04         7.96535E+03         2.18219E+03
+          4.09939E-03         4.26921E-03        -7.17742E-04         2.57570E-01         4.87567E-01         2.57571E-01         1.01257E+04         8.80171E-01         2.00674E+03         9.77999E+03         7.68823E+03         2.09176E+03
+          4.09939E-03         4.43904E-03        -7.64204E-04         2.57569E-01         4.98237E-01         2.57571E-01         9.72325E+03         8.80171E-01         1.94271E+03         9.41671E+03         7.41370E+03         2.00301E+03
+          4.09939E-03         4.60887E-03        -8.12477E-04         2.57569E-01         5.08908E-01         2.57571E-01         9.32652E+03         8.80171E-01         1.87931E+03         9.05815E+03         7.14209E+03         1.91606E+03
+          4.09939E-03         4.77869E-03        -8.62562E-04         2.57569E-01         5.19578E-01         2.57570E-01         8.93594E+03         8.80171E-01         1.81662E+03         8.70473E+03         6.87372E+03         1.83101E+03
+          4.09939E-03         4.94852E-03        -9.14460E-04         2.57569E-01         5.30249E-01         2.57570E-01         8.55198E+03         8.80171E-01         1.75469E+03         8.35685E+03         6.60887E+03         1.74797E+03
+          4.09939E-03         5.11835E-03        -9.68170E-04         2.57569E-01         5.40919E-01         2.57570E-01         8.17506E+03         8.80170E-01         1.69360E+03         8.01488E+03         6.34784E+03         1.66703E+03
+          4.09939E-03         5.28818E-03        -1.02369E-03         2.57568E-01         5.51590E-01         2.57570E-01         7.80557E+03         8.80170E-01         1.63341E+03         7.67918E+03         6.09090E+03         1.58828E+03
+          4.09939E-03         5.45800E-03        -1.08103E-03         2.57568E-01         5.62261E-01         2.57570E-01         7.44390E+03         8.80170E-01         1.57417E+03         7.35008E+03         5.83828E+03         1.51179E+03
+          4.09939E-03         5.62783E-03        -1.14017E-03         2.57568E-01         5.72931E-01         2.57570E-01         7.09038E+03         8.80170E-01         1.51594E+03         7.02788E+03         5.59025E+03         1.43763E+03
+          4.09939E-03         5.79766E-03        -1.20113E-03         2.57568E-01         5.83602E-01         2.57570E-01         6.74535E+03         8.80171E-01         1.45876E+03         6.71288E+03         5.34701E+03         1.36587E+03
+          4.09939E-03         5.96749E-03        -1.26390E-03         2.57567E-01         5.94272E-01         2.57570E-01         6.40908E+03         8.80171E-01         1.40268E+03         6.40533E+03         5.10877E+03         1.29656E+03
+          4.09939E-03         6.13731E-03        -1.32849E-03         2.57567E-01         6.04943E-01         2.57571E-01         6.08186E+03         8.80171E-01         1.34775E+03         6.10547E+03         4.87574E+03         1.22974E+03
+          4.09939E-03         6.30714E-03        -1.39488E-03         2.57567E-01         6.15613E-01         2.57571E-01         5.76390E+03         8.80171E-01         1.29401E+03         5.81352E+03         4.64807E+03         1.16545E+03
+          4.09939E-03         6.47697E-03        -1.46309E-03         2.57567E-01         6.26284E-01         2.57571E-01         5.45542E+03         8.80172E-01         1.24148E+03         5.52966E+03         4.42593E+03         1.10372E+03
+          4.09939E-03         6.64680E-03        -1.53311E-03         2.57566E-01         6.36955E-01         2.57571E-01         5.15661E+03         8.80172E-01         1.19020E+03         5.25405E+03         4.20948E+03         1.04458E+03
+          4.09939E-03         6.81662E-03        -1.60494E-03         2.57566E-01         6.47625E-01         2.57571E-01         4.86762E+03         8.80173E-01         1.14020E+03         4.98686E+03         3.99882E+03         9.88037E+02
+          4.09939E-03         6.98645E-03        -1.67859E-03         2.57566E-01         6.58296E-01         2.57571E-01         4.58857E+03         8.80173E-01         1.09151E+03         4.72818E+03         3.79408E+03         9.34103E+02
+          4.09939E-03         7.15628E-03        -1.75404E-03         2.57565E-01         6.68966E-01         2.57571E-01         4.31957E+03         8.80174E-01         1.04413E+03         4.47813E+03         3.59535E+03         8.82776E+02
+          4.09939E-03         7.32611E-03        -1.83131E-03         2.57565E-01         6.79637E-01         2.57572E-01         4.06068E+03         8.80175E-01         9.98097E+02         4.23677E+03         3.40272E+03         8.34052E+02
+          4.09939E-03         7.49593E-03        -1.91039E-03         2.57565E-01         6.90307E-01         2.57572E-01         3.81196E+03         8.80176E-01         9.53412E+02         4.00416E+03         3.21624E+03         7.87915E+02
+          4.09939E-03         7.66576E-03        -1.99129E-03         2.57564E-01         7.00978E-01         2.57572E-01         3.57344E+03         8.80177E-01         9.10088E+02         3.78033E+03         3.03598E+03         7.44348E+02
+          4.09939E-03         7.83559E-03        -2.07399E-03         2.57564E-01         7.11649E-01         2.57572E-01         3.34511E+03         8.80178E-01         8.68129E+02         3.56528E+03         2.86196E+03         7.03322E+02
+          4.09939E-03         8.00542E-03        -2.15851E-03         2.57564E-01         7.22319E-01         2.57573E-01         3.12694E+03         8.80179E-01         8.27539E+02         3.35902E+03         2.69421E+03         6.64808E+02
+          4.09939E-03         8.17524E-03        -2.24484E-03         2.57563E-01         7.32990E-01         2.57573E-01         2.91889E+03         8.80181E-01         7.88315E+02         3.16151E+03         2.53274E+03         6.28766E+02
+          4.09939E-03         8.34507E-03        -2.33298E-03         2.57563E-01         7.43660E-01         2.57574E-01         2.72089E+03         8.80183E-01         7.50454E+02         2.97269E+03         2.37754E+03         5.95153E+02
+          4.09939E-03         8.51490E-03        -2.42294E-03         2.57563E-01         7.54331E-01         2.57574E-01         2.53284E+03         8.80184E-01         7.13947E+02         2.79251E+03         2.22859E+03         5.63922E+02
+          4.09939E-03         8.68473E-03        -2.51471E-03         2.57562E-01         7.65001E-01         2.57575E-01         2.35464E+03         8.80186E-01         6.78784E+02         2.62088E+03         2.08586E+03         5.35018E+02
+          4.09939E-03         8.85455E-03        -2.60829E-03         2.57562E-01         7.75672E-01         2.57575E-01         2.18615E+03         8.80188E-01         6.44951E+02         2.45770E+03         1.94931E+03         5.08384E+02
+          4.09939E-03         9.02438E-03        -2.70368E-03         2.57561E-01         7.86343E-01         2.57576E-01         2.02722E+03         8.80191E-01         6.12432E+02         2.30285E+03         1.81889E+03         4.83957E+02
+          4.09939E-03         9.19421E-03        -2.80088E-03         2.57561E-01         7.97013E-01         2.57576E-01         1.87769E+03         8.80193E-01         5.81207E+02         2.15619E+03         1.69452E+03         4.61673E+02
+          4.09939E-03         9.36403E-03        -2.89990E-03         2.57561E-01         8.07684E-01         2.57577E-01         1.73737E+03         8.80196E-01         5.51256E+02         2.01760E+03         1.57613E+03         4.41461E+02
+          4.09939E-03         9.53386E-03        -3.00073E-03         2.57560E-01         8.18354E-01         2.57578E-01         1.60607E+03         8.80199E-01         5.22553E+02         1.88689E+03         1.46364E+03         4.23249E+02
+          4.09939E-03         9.70369E-03        -3.10337E-03         2.57560E-01         8.29025E-01         2.57579E-01         1.48356E+03         8.80202E-01         4.95074E+02         1.76391E+03         1.35694E+03         4.06962E+02
+          4.09939E-03         9.87352E-03        -3.20783E-03         2.57559E-01         8.39695E-01         2.57579E-01         1.36962E+03         8.80205E-01         4.68790E+02         1.64846E+03         1.25594E+03         3.92522E+02
+          4.09939E-03         1.00433E-02        -3.31409E-03         2.57559E-01         8.50366E-01         2.57580E-01         1.26401E+03         8.80208E-01         4.43672E+02         1.54037E+03         1.16052E+03         3.79849E+02
+          4.09939E-03         1.02132E-02        -3.42217E-03         2.57559E-01         8.61037E-01         2.57581E-01         1.16649E+03         8.80212E-01         4.19689E+02         1.43941E+03         1.07055E+03         3.68861E+02
+          4.09939E-03         1.03830E-02        -3.53206E-03         2.57558E-01         8.71707E-01         2.57582E-01         1.07678E+03         8.80216E-01         3.96808E+02         1.34539E+03         9.85913E+02         3.59475E+02
+          4.09939E-03         1.05528E-02        -3.64377E-03         2.57558E-01         8.82378E-01         2.57583E-01         9.94631E+02         8.80220E-01         3.74998E+02         1.25808E+03         9.06472E+02         3.51606E+02
+          4.09939E-03         1.07227E-02        -3.75728E-03         2.57557E-01         8.93048E-01         2.57585E-01         9.19756E+02         8.80225E-01         3.54222E+02         1.17726E+03         8.32086E+02         3.45170E+02
+          4.09939E-03         1.08925E-02        -3.87261E-03         2.57557E-01         9.03719E-01         2.57586E-01         8.51874E+02         8.80230E-01         3.34449E+02         1.10269E+03         7.62610E+02         3.40080E+02
+          4.09939E-03         1.10623E-02        -3.98975E-03         2.57556E-01         9.14389E-01         2.57587E-01         7.90698E+02         8.80235E-01         3.15643E+02         1.03414E+03         6.97892E+02         3.36251E+02
+          4.09939E-03         1.12321E-02        -4.10871E-03         2.57556E-01         9.25060E-01         2.57588E-01         7.35933E+02         8.80240E-01         2.97771E+02         9.71375E+02         6.37778E+02         3.33597E+02
+          4.09939E-03         1.14020E-02        -4.22947E-03         2.57555E-01         9.35731E-01         2.57590E-01         6.87283E+02         8.80246E-01         2.80798E+02         9.14142E+02         5.82110E+02         3.32032E+02
+          4.09939E-03         1.15718E-02        -4.35205E-03         2.57555E-01         9.46401E-01         2.57591E-01         6.44450E+02         8.80251E-01         2.64694E+02         8.62200E+02         5.30728E+02         3.31472E+02
+          4.09939E-03         1.17416E-02        -4.47644E-03         2.57554E-01         9.57072E-01         2.57593E-01         6.07134E+02         8.80258E-01         2.49426E+02         8.15300E+02         4.83467E+02         3.31834E+02
+          4.09939E-03         1.19114E-02        -4.60264E-03         2.57554E-01         9.67742E-01         2.57595E-01         5.75035E+02         8.80264E-01         2.34964E+02         7.73196E+02         4.40163E+02         3.33033E+02
+          4.09939E-03         1.20813E-02        -4.73066E-03         2.57553E-01         9.78413E-01         2.57597E-01         5.47852E+02         8.80271E-01         2.21283E+02         7.35639E+02         4.00649E+02         3.34990E+02
+          4.09939E-03         1.22511E-02        -4.86049E-03         2.57553E-01         9.89083E-01         2.57599E-01         5.25287E+02         8.80278E-01         2.08355E+02         7.02383E+02         3.64758E+02         3.37625E+02
+          4.09939E-03         1.24209E-02        -4.99213E-03         2.57552E-01         9.99754E-01         2.57600E-01         5.07044E+02         8.80286E-01         1.96158E+02         6.73182E+02         3.32322E+02         3.40860E+02
+          4.09939E-03         1.25908E-02        -5.12558E-03         2.57552E-01         1.01042E+00         2.57603E-01         4.92830E+02         8.80294E-01         1.84674E+02         6.47793E+02         3.03174E+02         3.44619E+02
+          4.09939E-03         1.27606E-02        -5.26085E-03         2.57551E-01         1.02110E+00         2.57605E-01         4.82356E+02         8.80302E-01         1.73885E+02         6.25977E+02         2.77148E+02         3.48830E+02
+          4.09939E-03         1.29304E-02        -5.39793E-03         2.57550E-01         1.03177E+00         2.57607E-01         4.75338E+02         8.80311E-01         1.63778E+02         6.07497E+02         2.54076E+02         3.53421E+02
+          4.09939E-03         1.31002E-02        -5.53682E-03         2.57550E-01         1.04244E+00         2.57609E-01         4.71496E+02         8.80320E-01         1.54345E+02         5.92120E+02         2.33797E+02         3.58323E+02
+          4.09939E-03         1.32701E-02        -5.67753E-03         2.57549E-01         1.05311E+00         2.57612E-01         4.70558E+02         8.80330E-01         1.45581E+02         5.79619E+02         2.16147E+02         3.63473E+02
+          4.09939E-03         1.34399E-02        -5.82004E-03         2.57549E-01         1.06378E+00         2.57614E-01         4.72258E+02         8.80340E-01         1.37483E+02         5.69771E+02         2.00966E+02         3.68805E+02
+          4.09939E-03         1.36097E-02        -5.96437E-03         2.57548E-01         1.07445E+00         2.57617E-01         4.76335E+02         8.80350E-01         1.30054E+02         5.62359E+02         1.88097E+02         3.74261E+02
+          4.09939E-03         1.37795E-02        -6.11051E-03         2.57548E-01         1.08512E+00         2.57620E-01         4.82539E+02         8.80361E-01         1.23299E+02         5.57171E+02         1.77387E+02         3.79784E+02
+          4.09939E-03         1.39494E-02        -6.25847E-03         2.57547E-01         1.09579E+00         2.57623E-01         4.90626E+02         8.80372E-01         1.17222E+02         5.54004E+02         1.68684E+02         3.85320E+02
+          4.09939E-03         1.41192E-02        -6.40824E-03         2.57546E-01         1.10646E+00         2.57626E-01         5.00362E+02         8.80384E-01         1.11833E+02         5.52658E+02         1.61840E+02         3.90818E+02
+          4.09939E-03         1.42890E-02        -6.55982E-03         2.57546E-01         1.11713E+00         2.57629E-01         5.11520E+02         8.80396E-01         1.07136E+02         5.52943E+02         1.56713E+02         3.96230E+02
+          4.09939E-03         1.44589E-02        -6.71321E-03         2.57545E-01         1.12780E+00         2.57633E-01         5.23885E+02         8.80409E-01         1.03134E+02         5.54675E+02         1.53163E+02         4.01513E+02
+          4.09939E-03         1.46287E-02        -6.86841E-03         2.57544E-01         1.13847E+00         2.57636E-01         5.37249E+02         8.80422E-01         9.98233E+01         5.57679E+02         1.51054E+02         4.06625E+02
+          4.09939E-03         1.47985E-02        -7.02543E-03         2.57544E-01         1.14914E+00         2.57640E-01         5.51415E+02         8.80436E-01         9.71943E+01         5.61785E+02         1.50256E+02         4.11529E+02
+          4.09939E-03         1.49683E-02        -7.18426E-03         2.57543E-01         1.15981E+00         2.57643E-01         5.66197E+02         8.80450E-01         9.52270E+01         5.66832E+02         1.50643E+02         4.16190E+02
+          4.09939E-03         1.51382E-02        -7.34491E-03         2.57542E-01         1.17048E+00         2.57647E-01         5.81416E+02         8.80465E-01         9.38918E+01         5.72670E+02         1.52093E+02         4.20576E+02
+          4.09939E-03         1.53080E-02        -7.50736E-03         2.57542E-01         1.18115E+00         2.57651E-01         5.96907E+02         8.80481E-01         9.31494E+01         5.79151E+02         1.54491E+02         4.24660E+02
+          4.09939E-03         1.54778E-02        -7.67163E-03         2.57541E-01         1.19182E+00         2.57655E-01         6.12514E+02         8.80497E-01         9.29521E+01         5.86142E+02         1.57725E+02         4.28417E+02
+          4.09939E-03         1.56476E-02        -7.83771E-03         2.57540E-01         1.20249E+00         2.57660E-01         6.28089E+02         8.80513E-01         9.32454E+01         5.93512E+02         1.61688E+02         4.31824E+02
+          4.09939E-03         1.58175E-02        -8.00561E-03         2.57540E-01         1.21317E+00         2.57664E-01         6.43498E+02         8.80530E-01         9.39708E+01         6.01142E+02         1.66279E+02         4.34863E+02
+          4.09939E-03         1.59873E-02        -8.17532E-03         2.57539E-01         1.22384E+00         2.57669E-01         6.58614E+02         8.80548E-01         9.50681E+01         6.08920E+02         1.71403E+02         4.37517E+02
+          4.09939E-03         1.61571E-02        -8.34684E-03         2.57538E-01         1.23451E+00         2.57674E-01         6.73323E+02         8.80566E-01         9.64778E+01         6.16741E+02         1.76968E+02         4.39774E+02
+          4.09939E-03         1.63270E-02        -8.52017E-03         2.57538E-01         1.24518E+00         2.57679E-01         6.87520E+02         8.80585E-01         9.81429E+01         6.24511E+02         1.82889E+02         4.41622E+02
+          4.09939E-03         1.64968E-02        -8.69532E-03         2.57537E-01         1.25585E+00         2.57684E-01         7.01108E+02         8.80605E-01         1.00010E+02         6.32140E+02         1.89085E+02         4.43055E+02
+          4.09939E-03         1.66666E-02        -8.87228E-03         2.57536E-01         1.26652E+00         2.57689E-01         7.14002E+02         8.80625E-01         1.02030E+02         6.39548E+02         1.95481E+02         4.44067E+02
+          4.09939E-03         1.68364E-02        -9.05105E-03         2.57535E-01         1.27719E+00         2.57694E-01         7.26126E+02         8.80647E-01         1.04159E+02         6.46661E+02         2.02006E+02         4.44655E+02
+          4.09939E-03         1.70063E-02        -9.23163E-03         2.57535E-01         1.28786E+00         2.57700E-01         7.37414E+02         8.80668E-01         1.06357E+02         6.53415E+02         2.08596E+02         4.44819E+02
+          4.09939E-03         1.71761E-02        -9.41403E-03         2.57534E-01         1.29853E+00         2.57706E-01         7.47806E+02         8.80691E-01         1.08590E+02         6.59750E+02         2.15189E+02         4.44561E+02
+          4.09939E-03         1.73459E-02        -9.59824E-03         2.57533E-01         1.30920E+00         2.57712E-01         7.57254E+02         8.80714E-01         1.10829E+02         6.65615E+02         2.21731E+02         4.43884E+02
+          4.09939E-03         1.75158E-02        -9.78426E-03         2.57532E-01         1.31987E+00         2.57718E-01         7.65717E+02         8.80738E-01         1.13046E+02         6.70965E+02         2.28170E+02         4.42795E+02
+          4.09939E-03         1.76856E-02        -9.97210E-03         2.57532E-01         1.33054E+00         2.57725E-01         7.73163E+02         8.80762E-01         1.15219E+02         6.75760E+02         2.34461E+02         4.41300E+02
+          4.09939E-03         1.78554E-02        -1.01618E-02         2.57531E-01         1.34121E+00         2.57731E-01         7.79565E+02         8.80788E-01         1.17329E+02         6.79969E+02         2.40560E+02         4.39409E+02
+          4.09939E-03         1.80252E-02        -1.03532E-02         2.57530E-01         1.35188E+00         2.57738E-01         7.84907E+02         8.80814E-01         1.19359E+02         6.83565E+02         2.46432E+02         4.37133E+02
+          4.09939E-03         1.81951E-02        -1.05465E-02         2.57529E-01         1.36255E+00         2.57745E-01         7.89178E+02         8.80841E-01         1.21295E+02         6.86527E+02         2.52042E+02         4.34485E+02
+          4.09939E-03         1.83649E-02        -1.07416E-02         2.57529E-01         1.37322E+00         2.57752E-01         7.92373E+02         8.80869E-01         1.23126E+02         6.88839E+02         2.57362E+02         4.31478E+02
+          4.09939E-03         1.85347E-02        -1.09385E-02         2.57528E-01         1.38389E+00         2.57760E-01         7.94496E+02         8.80897E-01         1.24841E+02         6.90491E+02         2.62365E+02         4.28126E+02
+          4.09939E-03         1.87045E-02        -1.11372E-02         2.57527E-01         1.39457E+00         2.57768E-01         7.95554E+02         8.80927E-01         1.26433E+02         6.91477E+02         2.67032E+02         4.24445E+02
+          4.09939E-03         1.88744E-02        -1.13377E-02         2.57526E-01         1.40524E+00         2.57776E-01         7.95560E+02         8.80957E-01         1.27895E+02         6.91795E+02         2.71342E+02         4.20453E+02
+          4.09939E-03         1.90442E-02        -1.15401E-02         2.57525E-01         1.41591E+00         2.57784E-01         7.94533E+02         8.80988E-01         1.29221E+02         6.91448E+02         2.75282E+02         4.16166E+02
+          4.09939E-03         1.92140E-02        -1.17442E-02         2.57524E-01         1.42658E+00         2.57792E-01         7.92498E+02         8.81020E-01         1.30408E+02         6.90443E+02         2.78840E+02         4.11603E+02
+          4.09939E-03         1.93839E-02        -1.19502E-02         2.57524E-01         1.43725E+00         2.57801E-01         7.89480E+02         8.81053E-01         1.31453E+02         6.88789E+02         2.82007E+02         4.06782E+02
+          4.09939E-03         1.95537E-02        -1.21580E-02         2.57523E-01         1.44792E+00         2.57810E-01         7.85512E+02         8.81087E-01         1.32354E+02         6.86501E+02         2.84778E+02         4.01722E+02
+          4.09939E-03         1.97235E-02        -1.23676E-02         2.57522E-01         1.45859E+00         2.57819E-01         7.80630E+02         8.81122E-01         1.33109E+02         6.83593E+02         2.87150E+02         3.96443E+02
+          4.09939E-03         1.98933E-02        -1.25790E-02         2.57521E-01         1.46926E+00         2.57828E-01         7.74870E+02         8.81158E-01         1.33718E+02         6.80087E+02         2.89123E+02         3.90964E+02
+          4.09939E-03         2.00632E-02        -1.27922E-02         2.57520E-01         1.47993E+00         2.57838E-01         7.68274E+02         8.81195E-01         1.34183E+02         6.76002E+02         2.90697E+02         3.85305E+02
+          4.09939E-03         2.02330E-02        -1.30072E-02         2.57519E-01         1.49060E+00         2.57848E-01         7.60885E+02         8.81233E-01         1.34502E+02         6.71362E+02         2.91877E+02         3.79485E+02
+          4.09939E-03         2.04028E-02        -1.32241E-02         2.57518E-01         1.50127E+00         2.57858E-01         7.52749E+02         8.81271E-01         1.34679E+02         6.66193E+02         2.92669E+02         3.73524E+02
+          4.09939E-03         2.05726E-02        -1.34427E-02         2.57517E-01         1.51194E+00         2.57868E-01         7.43912E+02         8.81311E-01         1.34714E+02         6.60522E+02         2.93079E+02         3.67442E+02
+          4.09939E-03         2.07425E-02        -1.36632E-02         2.57517E-01         1.52261E+00         2.57879E-01         7.34424E+02         8.81352E-01         1.34611E+02         6.54376E+02         2.93119E+02         3.61257E+02
+          4.09939E-03         2.09123E-02        -1.38855E-02         2.57516E-01         1.53328E+00         2.57890E-01         7.24333E+02         8.81394E-01         1.34372E+02         6.47786E+02         2.92798E+02         3.54988E+02
+          4.09939E-03         2.10821E-02        -1.41096E-02         2.57515E-01         1.54395E+00         2.57901E-01         7.13689E+02         8.81437E-01         1.34000E+02         6.40781E+02         2.92127E+02         3.48654E+02
+          4.09939E-03         2.12520E-02        -1.43355E-02         2.57514E-01         1.55462E+00         2.57913E-01         7.02544E+02         8.81481E-01         1.33498E+02         6.33394E+02         2.91122E+02         3.42272E+02
+          4.09939E-03         2.14218E-02        -1.45632E-02         2.57513E-01         1.56529E+00         2.57924E-01         6.90948E+02         8.81526E-01         1.32871E+02         6.25654E+02         2.89794E+02         3.35859E+02
+          4.09939E-03         2.15916E-02        -1.47928E-02         2.57512E-01         1.57596E+00         2.57936E-01         6.78952E+02         8.81572E-01         1.32121E+02         6.17594E+02         2.88160E+02         3.29433E+02
+          4.09939E-03         2.17614E-02        -1.50241E-02         2.57511E-01         1.58664E+00         2.57949E-01         6.66606E+02         8.81620E-01         1.31254E+02         6.09245E+02         2.86235E+02         3.23010E+02
+          4.09939E-03         2.19313E-02        -1.52573E-02         2.57510E-01         1.59731E+00         2.57962E-01         6.53959E+02         8.81668E-01         1.30273E+02         6.00639E+02         2.84036E+02         3.16603E+02
+          4.09939E-03         2.21011E-02        -1.54923E-02         2.57509E-01         1.60798E+00         2.57975E-01         6.41061E+02         8.81718E-01         1.29182E+02         5.91808E+02         2.81578E+02         3.10230E+02
+          4.09939E-03         2.22709E-02        -1.57291E-02         2.57508E-01         1.61865E+00         2.57988E-01         6.27960E+02         8.81769E-01         1.27986E+02         5.82782E+02         2.78880E+02         3.03902E+02
+          4.09939E-03         2.24407E-02        -1.59677E-02         2.57507E-01         1.62932E+00         2.58002E-01         6.14701E+02         8.81821E-01         1.26690E+02         5.73592E+02         2.75958E+02         2.97634E+02
+          4.09939E-03         2.26106E-02        -1.62081E-02         2.57506E-01         1.63999E+00         2.58016E-01         6.01331E+02         8.81875E-01         1.25298E+02         5.64267E+02         2.72830E+02         2.91437E+02
+          4.09939E-03         2.27804E-02        -1.64503E-02         2.57505E-01         1.65066E+00         2.58030E-01         5.87893E+02         8.81929E-01         1.23815E+02         5.54837E+02         2.69514E+02         2.85323E+02
+          4.09939E-03         2.29502E-02        -1.66944E-02         2.57504E-01         1.66133E+00         2.58045E-01         5.74430E+02         8.81985E-01         1.22245E+02         5.45329E+02         2.66026E+02         2.79303E+02
+          4.09939E-03         2.31201E-02        -1.69402E-02         2.57503E-01         1.67200E+00         2.58060E-01         5.60981E+02         8.82043E-01         1.20593E+02         5.35770E+02         2.62384E+02         2.73386E+02
+          4.09939E-03         2.32899E-02        -1.71879E-02         2.57502E-01         1.68267E+00         2.58075E-01         5.47586E+02         8.82101E-01         1.18863E+02         5.26187E+02         2.58605E+02         2.67582E+02
+          4.09939E-03         2.34597E-02        -1.74374E-02         2.57501E-01         1.69334E+00         2.58091E-01         5.34280E+02         8.82161E-01         1.17061E+02         5.16604E+02         2.54706E+02         2.61898E+02
+          4.09939E-03         2.36295E-02        -1.76887E-02         2.57500E-01         1.70401E+00         2.58107E-01         5.21098E+02         8.82222E-01         1.15190E+02         5.07044E+02         2.50703E+02         2.56342E+02
+          4.09939E-03         2.37994E-02        -1.79418E-02         2.57499E-01         1.71468E+00         2.58123E-01         5.08073E+02         8.82285E-01         1.13256E+02         4.97531E+02         2.46611E+02         2.50920E+02
+          4.09939E-03         2.39692E-02        -1.81967E-02         2.57498E-01         1.72535E+00         2.58140E-01         4.95234E+02         8.82349E-01         1.11262E+02         4.88084E+02         2.42447E+02         2.45637E+02
+          4.09939E-03         2.41390E-02        -1.84535E-02         2.57497E-01         1.73602E+00         2.58157E-01         4.82610E+02         8.82414E-01         1.09214E+02         4.78725E+02         2.38225E+02         2.40500E+02
+          4.09939E-03         2.43088E-02        -1.87120E-02         2.57496E-01         1.74669E+00         2.58175E-01         4.70226E+02         8.82481E-01         1.07114E+02         4.69470E+02         2.33960E+02         2.35510E+02
+          4.09939E-03         2.44787E-02        -1.89724E-02         2.57495E-01         1.75736E+00         2.58193E-01         4.58107E+02         8.82549E-01         1.04969E+02         4.60338E+02         2.29664E+02         2.30673E+02
+          4.09939E-03         2.46485E-02        -1.92346E-02         2.57494E-01         1.76804E+00         2.58211E-01         4.46272E+02         8.82619E-01         1.02781E+02         4.51343E+02         2.25352E+02         2.25991E+02
+          4.09939E-03         2.48183E-02        -1.94986E-02         2.57493E-01         1.77871E+00         2.58230E-01         4.34742E+02         8.82690E-01         1.00555E+02         4.42501E+02         2.21036E+02         2.21464E+02
+          4.09939E-03         2.49882E-02        -1.97644E-02         2.57492E-01         1.78938E+00         2.58249E-01         4.23533E+02         8.82762E-01         9.82939E+01         4.33823E+02         2.16727E+02         2.17095E+02
+          4.09939E-03         2.51580E-02        -2.00320E-02         2.57490E-01         1.80005E+00         2.58268E-01         4.12660E+02         8.82837E-01         9.60028E+01         4.25322E+02         2.12437E+02         2.12885E+02
+          4.09939E-03         2.53278E-02        -2.03015E-02         2.57489E-01         1.81072E+00         2.58288E-01         4.02136E+02         8.82912E-01         9.36849E+01         4.17008E+02         2.08176E+02         2.08832E+02
+          4.09939E-03         2.54976E-02        -2.05727E-02         2.57488E-01         1.82139E+00         2.58309E-01         3.91971E+02         8.82989E-01         9.13439E+01         4.08889E+02         2.03953E+02         2.04936E+02
+          4.09939E-03         2.56675E-02        -2.08458E-02         2.57487E-01         1.83206E+00         2.58330E-01         3.82174E+02         8.83068E-01         8.89833E+01         4.00974E+02         1.99777E+02         2.01197E+02
+          4.09939E-03         2.58373E-02        -2.11207E-02         2.57486E-01         1.84273E+00         2.58351E-01         3.72752E+02         8.83149E-01         8.66065E+01         3.93269E+02         1.95658E+02         1.97612E+02
+          4.09939E-03         2.60071E-02        -2.13974E-02         2.57485E-01         1.85340E+00         2.58372E-01         3.63709E+02         8.83231E-01         8.42168E+01         3.85779E+02         1.91601E+02         1.94179E+02
+          4.09939E-03         2.61769E-02        -2.16759E-02         2.57484E-01         1.86407E+00         2.58394E-01         3.55049E+02         8.83314E-01         8.18174E+01         3.78509E+02         1.87614E+02         1.90895E+02
+          4.26921E-03         8.72665E-04        -2.13726E-04         2.68242E-01         2.74155E-01         2.68243E-01         1.75238E+04         9.17463E-01         2.78998E+03         1.62038E+04         1.25396E+04         3.66419E+03
+          4.26921E-03         1.04249E-03        -2.23944E-04         2.68242E-01         2.84826E-01         2.68242E-01         1.71641E+04         9.17463E-01         2.74106E+03         1.58825E+04         1.23015E+04         3.58096E+03
+          4.26921E-03         1.21232E-03        -2.35974E-04         2.68242E-01         2.95496E-01         2.68242E-01         1.67975E+04         9.17463E-01         2.69113E+03         1.55549E+04         1.20586E+04         3.49636E+03
+          4.26921E-03         1.38215E-03        -2.49816E-04         2.68242E-01         3.06167E-01         2.68242E-01         1.64246E+04         9.17462E-01         2.64027E+03         1.52217E+04         1.18112E+04         3.41056E+03
+          4.26921E-03         1.55197E-03        -2.65470E-04         2.68242E-01         3.16838E-01         2.68242E-01         1.60460E+04         9.17462E-01         2.58855E+03         1.48834E+04         1.15597E+04         3.32374E+03
+          4.26921E-03         1.72180E-03        -2.82937E-04         2.68242E-01         3.27508E-01         2.68242E-01         1.56626E+04         9.17462E-01         2.53607E+03         1.45406E+04         1.13046E+04         3.23606E+03
+          4.26921E-03         1.89163E-03        -3.02215E-04         2.68242E-01         3.38179E-01         2.68242E-01         1.52748E+04         9.17462E-01         2.48291E+03         1.41939E+04         1.10462E+04         3.14770E+03
+          4.26921E-03         2.06146E-03        -3.23306E-04         2.68242E-01         3.48849E-01         2.68242E-01         1.48833E+04         9.17462E-01         2.42915E+03         1.38438E+04         1.07850E+04         3.05881E+03
+          4.26921E-03         2.23128E-03        -3.46209E-04         2.68242E-01         3.59520E-01         2.68242E-01         1.44889E+04         9.17462E-01         2.37487E+03         1.34910E+04         1.05214E+04         2.96957E+03
+          4.26921E-03         2.40111E-03        -3.70924E-04         2.68242E-01         3.70190E-01         2.68242E-01         1.40921E+04         9.17461E-01         2.32015E+03         1.31360E+04         1.02558E+04         2.88013E+03
+          4.26921E-03         2.57094E-03        -3.97451E-04         2.68242E-01         3.80861E-01         2.68242E-01         1.36936E+04         9.17461E-01         2.26509E+03         1.27793E+04         9.98861E+03         2.79067E+03
+          4.26921E-03         2.74077E-03        -4.25790E-04         2.68242E-01         3.91532E-01         2.68242E-01         1.32941E+04         9.17461E-01         2.20975E+03         1.24215E+04         9.72019E+03         2.70134E+03
+          4.26921E-03         2.91059E-03        -4.55942E-04         2.68241E-01         4.02202E-01         2.68242E-01         1.28941E+04         9.17461E-01         2.15422E+03         1.20632E+04         9.45096E+03         2.61229E+03
+          4.26921E-03         3.08042E-03        -4.87905E-04         2.68241E-01         4.12873E-01         2.68242E-01         1.24942E+04         9.17460E-01         2.09858E+03         1.17050E+04         9.18132E+03         2.52367E+03
+          4.26921E-03         3.25025E-03        -5.21681E-04         2.68241E-01         4.23543E-01         2.68242E-01         1.20951E+04         9.17460E-01         2.04290E+03         1.13473E+04         8.91165E+03         2.43564E+03
+          4.26921E-03         3.42008E-03        -5.57269E-04         2.68241E-01         4.34214E-01         2.68242E-01         1.16974E+04         9.17460E-01         1.98727E+03         1.09907E+04         8.64232E+03         2.34834E+03
+          4.26921E-03         3.58990E-03        -5.94669E-04         2.68241E-01         4.44884E-01         2.68241E-01         1.13016E+04         9.17460E-01         1.93175E+03         1.06356E+04         8.37371E+03         2.26190E+03
+          4.26921E-03         3.75973E-03        -6.33881E-04         2.68241E-01         4.55555E-01         2.68241E-01         1.09084E+04         9.17459E-01         1.87642E+03         1.02826E+04         8.10618E+03         2.17646E+03
+          4.26921E-03         3.92956E-03        -6.74906E-04         2.68240E-01         4.66225E-01         2.68241E-01         1.05181E+04         9.17459E-01         1.82135E+03         9.93222E+03         7.84007E+03         2.09215E+03
+          4.26921E-03         4.09939E-03        -7.17742E-04         2.68240E-01         4.76896E-01         2.68241E-01         1.01315E+04         9.17459E-01         1.76661E+03         9.58482E+03         7.57573E+03         2.00909E+03
+          4.26921E-03         4.26921E-03        -7.62391E-04         2.68240E-01         4.87567E-01         2.68241E-01         9.74888E+03         9.17459E-01         1.71227E+03         9.24088E+03         7.31349E+03         1.92740E+03
+          4.26921E-03         4.43904E-03        -8.08852E-04         2.68240E-01         4.98237E-01         2.68241E-01         9.37086E+03         9.17458E-01         1.65839E+03         8.90084E+03         7.05366E+03         1.84718E+03
+          4.26921E-03         4.60887E-03        -8.57126E-04         2.68240E-01         5.08908E-01         2.68241E-01         8.99788E+03         9.17458E-01         1.60503E+03         8.56510E+03         6.79656E+03         1.76854E+03
+          4.26921E-03         4.77869E-03        -9.07211E-04         2.68239E-01         5.19578E-01         2.68241E-01         8.63037E+03         9.17458E-01         1.55225E+03         8.23406E+03         6.54247E+03         1.69159E+03
+          4.26921E-03         4.94852E-03        -9.59109E-04         2.68239E-01         5.30249E-01         2.68241E-01         8.26877E+03         9.17458E-01         1.50010E+03         7.90809E+03         6.29169E+03         1.61641E+03
+          4.26921E-03         5.11835E-03        -1.01282E-03         2.68239E-01         5.40919E-01         2.68241E-01         7.91347E+03         9.17458E-01         1.44865E+03         7.58755E+03         6.04447E+03         1.54308E+03
+          4.26921E-03         5.28818E-03        -1.06834E-03         2.68239E-01         5.51590E-01         2.68241E-01         7.56485E+03         9.17458E-01         1.39795E+03         7.27276E+03         5.80107E+03         1.47169E+03
+          4.26921E-03         5.45800E-03        -1.12567E-03         2.68239E-01         5.62261E-01         2.68241E-01         7.22326E+03         9.17458E-01         1.34803E+03         6.96403E+03         5.56173E+03         1.40230E+03
+          4.26921E-03         5.62783E-03        -1.18482E-03         2.68238E-01         5.72931E-01         2.68241E-01         6.88904E+03         9.17458E-01         1.29895E+03         6.66167E+03         5.32669E+03         1.33498E+03
+          4.26921E-03         5.79766E-03        -1.24578E-03         2.68238E-01         5.83602E-01         2.68241E-01         6.56249E+03         9.17458E-01         1.25074E+03         6.36593E+03         5.09614E+03         1.26979E+03
+          4.26921E-03         5.96749E-03        -1.30855E-03         2.68238E-01         5.94272E-01         2.68241E-01         6.24388E+03         9.17458E-01         1.20346E+03         6.07706E+03         4.87029E+03         1.20677E+03
+          4.26921E-03         6.13731E-03        -1.37313E-03         2.68237E-01         6.04943E-01         2.68241E-01         5.93348E+03         9.17458E-01         1.15712E+03         5.79528E+03         4.64932E+03         1.14597E+03
+          4.26921E-03         6.30714E-03        -1.43953E-03         2.68237E-01         6.15613E-01         2.68241E-01         5.63152E+03         9.17458E-01         1.11177E+03         5.52081E+03         4.43339E+03         1.08742E+03
+          4.26921E-03         6.47697E-03        -1.50774E-03         2.68237E-01         6.26284E-01         2.68241E-01         5.33819E+03         9.17459E-01         1.06744E+03         5.25382E+03         4.22266E+03         1.03116E+03
+          4.26921E-03         6.64680E-03        -1.57776E-03         2.68237E-01         6.36955E-01         2.68241E-01         5.05368E+03         9.17459E-01         1.02415E+03         4.99447E+03         4.01727E+03         9.77202E+02
+          4.26921E-03         6.81662E-03        -1.64959E-03         2.68236E-01         6.47625E-01         2.68241E-01         4.77814E+03         9.17459E-01         9.81924E+02         4.74290E+03         3.81734E+03         9.25566E+02
+          4.26921E-03         6.98645E-03        -1.72323E-03         2.68236E-01         6.58296E-01         2.68242E-01         4.51171E+03         9.17460E-01         9.40784E+02         4.49923E+03         3.62297E+03         8.76260E+02
+          4.26921E-03         7.15628E-03        -1.79869E-03         2.68236E-01         6.68966E-01         2.68242E-01         4.25449E+03         9.17460E-01         9.00746E+02         4.26355E+03         3.43426E+03         8.29286E+02
+          4.26921E-03         7.32611E-03        -1.87596E-03         2.68235E-01         6.79637E-01         2.68242E-01         4.00656E+03         9.17461E-01         8.61825E+02         4.03593E+03         3.25129E+03         7.84642E+02
+          4.26921E-03         7.49593E-03        -1.95504E-03         2.68235E-01         6.90307E-01         2.68242E-01         3.76799E+03         9.17462E-01         8.24032E+02         3.81644E+03         3.07412E+03         7.42317E+02
+          4.26921E-03         7.66576E-03        -2.03593E-03         2.68235E-01         7.00978E-01         2.68242E-01         3.53880E+03         9.17462E-01         7.87374E+02         3.60510E+03         2.90280E+03         7.02296E+02
+          4.26921E-03         7.83559E-03        -2.11864E-03         2.68234E-01         7.11649E-01         2.68243E-01         3.31901E+03         9.17463E-01         7.51857E+02         3.40193E+03         2.73737E+03         6.64556E+02
+          4.26921E-03         8.00542E-03        -2.20316E-03         2.68234E-01         7.22319E-01         2.68243E-01         3.10861E+03         9.17464E-01         7.17483E+02         3.20693E+03         2.57785E+03         6.29073E+02
+          4.26921E-03         8.17524E-03        -2.28949E-03         2.68234E-01         7.32990E-01         2.68243E-01         2.90757E+03         9.17465E-01         6.84250E+02         3.02007E+03         2.42425E+03         5.95814E+02
+          4.26921E-03         8.34507E-03        -2.37763E-03         2.68233E-01         7.43660E-01         2.68244E-01         2.71585E+03         9.17467E-01         6.52156E+02         2.84131E+03         2.27657E+03         5.64741E+02
+          4.26921E-03         8.51490E-03        -2.46759E-03         2.68233E-01         7.54331E-01         2.68244E-01         2.53336E+03         9.17468E-01         6.21195E+02         2.67061E+03         2.13479E+03         5.35815E+02
+          4.26921E-03         8.68473E-03        -2.55935E-03         2.68232E-01         7.65001E-01         2.68245E-01         2.36003E+03         9.17469E-01         5.91357E+02         2.50787E+03         1.99888E+03         5.08988E+02
+          4.26921E-03         8.85455E-03        -2.65293E-03         2.68232E-01         7.75672E-01         2.68245E-01         2.19574E+03         9.17471E-01         5.62632E+02         2.35302E+03         1.86881E+03         4.84211E+02
+          4.26921E-03         9.02438E-03        -2.74833E-03         2.68232E-01         7.86343E-01         2.68246E-01         2.04036E+03         9.17473E-01         5.35007E+02         2.20596E+03         1.74453E+03         4.61429E+02
+          4.26921E-03         9.19421E-03        -2.84553E-03         2.68231E-01         7.97013E-01         2.68246E-01         1.89377E+03         9.17475E-01         5.08465E+02         2.06655E+03         1.62597E+03         4.40587E+02
+          4.26921E-03         9.36403E-03        -2.94455E-03         2.68231E-01         8.07684E-01         2.68247E-01         1.75579E+03         9.17477E-01         4.82990E+02         1.93468E+03         1.51306E+03         4.21623E+02
+          4.26921E-03         9.53386E-03        -3.04538E-03         2.68230E-01         8.18354E-01         2.68248E-01         1.62627E+03         9.17479E-01         4.58562E+02         1.81020E+03         1.40573E+03         4.04473E+02
+          4.26921E-03         9.70369E-03        -3.14802E-03         2.68230E-01         8.29025E-01         2.68248E-01         1.50500E+03         9.17481E-01         4.35159E+02         1.69295E+03         1.30388E+03         3.89073E+02
+          4.26921E-03         9.87352E-03        -3.25247E-03         2.68229E-01         8.39695E-01         2.68249E-01         1.39181E+03         9.17484E-01         4.12758E+02         1.58277E+03         1.20742E+03         3.75352E+02
+          4.26921E-03         1.00433E-02        -3.35874E-03         2.68229E-01         8.50366E-01         2.68250E-01         1.28647E+03         9.17486E-01         3.91337E+02         1.47948E+03         1.11624E+03         3.63241E+02
+          4.26921E-03         1.02132E-02        -3.46682E-03         2.68229E-01         8.61037E-01         2.68251E-01         1.18876E+03         9.17489E-01         3.70869E+02         1.38290E+03         1.03023E+03         3.52668E+02
+          4.26921E-03         1.03830E-02        -3.57671E-03         2.68228E-01         8.71707E-01         2.68252E-01         1.09846E+03         9.17492E-01         3.51328E+02         1.29284E+03         9.49277E+02         3.43559E+02
+          4.26921E-03         1.05528E-02        -3.68841E-03         2.68228E-01         8.82378E-01         2.68253E-01         1.01533E+03         9.17496E-01         3.32687E+02         1.20908E+03         8.73245E+02         3.35839E+02
+          4.26921E-03         1.07227E-02        -3.80193E-03         2.68227E-01         8.93048E-01         2.68254E-01         9.39121E+02         9.17499E-01         3.14918E+02         1.13144E+03         8.02007E+02         3.29433E+02
+          4.26921E-03         1.08925E-02        -3.91726E-03         2.68227E-01         9.03719E-01         2.68255E-01         8.69580E+02         9.17503E-01         2.97994E+02         1.05969E+03         7.35427E+02         3.24264E+02
+          4.26921E-03         1.10623E-02        -4.03440E-03         2.68226E-01         9.14389E-01         2.68256E-01         8.06449E+02         9.17507E-01         2.81888E+02         9.93620E+02         6.73363E+02         3.20257E+02
+          4.26921E-03         1.12321E-02        -4.15335E-03         2.68226E-01         9.25060E-01         2.68258E-01         7.49464E+02         9.17511E-01         2.66570E+02         9.33006E+02         6.15672E+02         3.17334E+02
+          4.26921E-03         1.14020E-02        -4.27412E-03         2.68225E-01         9.35731E-01         2.68259E-01         6.98359E+02         9.17515E-01         2.52016E+02         8.77624E+02         5.62204E+02         3.15419E+02
+          4.26921E-03         1.15718E-02        -4.39670E-03         2.68225E-01         9.46401E-01         2.68261E-01         6.52864E+02         9.17520E-01         2.38197E+02         8.27247E+02         5.12810E+02         3.14438E+02
+          4.26921E-03         1.17416E-02        -4.52109E-03         2.68224E-01         9.57072E-01         2.68262E-01         6.12706E+02         9.17525E-01         2.25089E+02         7.81648E+02         4.67335E+02         3.14313E+02
+          4.26921E-03         1.19114E-02        -4.64729E-03         2.68224E-01         9.67742E-01         2.68264E-01         5.77612E+02         9.17530E-01         2.12668E+02         7.40597E+02         4.25624E+02         3.14973E+02
+          4.26921E-03         1.20813E-02        -4.77531E-03         2.68223E-01         9.78413E-01         2.68265E-01         5.47309E+02         9.17535E-01         2.00911E+02         7.03865E+02         3.87522E+02         3.16343E+02
+          4.26921E-03         1.22511E-02        -4.90514E-03         2.68222E-01         9.89083E-01         2.68267E-01         5.21525E+02         9.17541E-01         1.89799E+02         6.71222E+02         3.52870E+02         3.18352E+02
+          4.26921E-03         1.24209E-02        -5.03678E-03         2.68222E-01         9.99754E-01         2.68269E-01         4.99989E+02         9.17546E-01         1.79312E+02         6.42441E+02         3.21511E+02         3.20930E+02
+          4.26921E-03         1.25908E-02        -5.17023E-03         2.68221E-01         1.01042E+00         2.68271E-01         4.82430E+02         9.17553E-01         1.69435E+02         6.17297E+02         2.93287E+02         3.24010E+02
+          4.26921E-03         1.27606E-02        -5.30550E-03         2.68221E-01         1.02110E+00         2.68273E-01         4.68583E+02         9.17559E-01         1.60154E+02         5.95566E+02         2.68042E+02         3.27523E+02
+          4.26921E-03         1.29304E-02        -5.44258E-03         2.68220E-01         1.03177E+00         2.68275E-01         4.58185E+02         9.17566E-01         1.51458E+02         5.77027E+02         2.45619E+02         3.31408E+02
+          4.26921E-03         1.31002E-02        -5.58147E-03         2.68220E-01         1.04244E+00         2.68278E-01         4.50979E+02         9.17573E-01         1.43339E+02         5.61464E+02         2.25864E+02         3.35600E+02
+          4.26921E-03         1.32701E-02        -5.72217E-03         2.68219E-01         1.05311E+00         2.68280E-01         4.46709E+02         9.17580E-01         1.35791E+02         5.48664E+02         2.08623E+02         3.40041E+02
+          4.26921E-03         1.34399E-02        -5.86469E-03         2.68218E-01         1.06378E+00         2.68282E-01         4.45130E+02         9.17588E-01         1.28811E+02         5.38418E+02         1.93745E+02         3.44673E+02
+          4.26921E-03         1.36097E-02        -6.00902E-03         2.68218E-01         1.07445E+00         2.68285E-01         4.45997E+02         9.17596E-01         1.22398E+02         5.30524E+02         1.81082E+02         3.49442E+02
+          4.26921E-03         1.37795E-02        -6.15516E-03         2.68217E-01         1.08512E+00         2.68288E-01         4.49076E+02         9.17605E-01         1.16552E+02         5.24783E+02         1.70488E+02         3.54295E+02
+          4.26921E-03         1.39494E-02        -6.30311E-03         2.68216E-01         1.09579E+00         2.68290E-01         4.54139E+02         9.17614E-01         1.11277E+02         5.21004E+02         1.61821E+02         3.59183E+02
+          4.26921E-03         1.41192E-02        -6.45288E-03         2.68216E-01         1.10646E+00         2.68293E-01         4.60963E+02         9.17623E-01         1.06572E+02         5.19000E+02         1.54940E+02         3.64060E+02
+          4.26921E-03         1.42890E-02        -6.60446E-03         2.68215E-01         1.11713E+00         2.68296E-01         4.69335E+02         9.17632E-01         1.02440E+02         5.18591E+02         1.49710E+02         3.68881E+02
+          4.26921E-03         1.44589E-02        -6.75785E-03         2.68215E-01         1.12780E+00         2.68300E-01         4.79050E+02         9.17642E-01         9.88777E+01         5.19605E+02         1.45999E+02         3.73606E+02
+          4.26921E-03         1.46287E-02        -6.91306E-03         2.68214E-01         1.13847E+00         2.68303E-01         4.89911E+02         9.17653E-01         9.58798E+01         5.21874E+02         1.43678E+02         3.78196E+02
+          4.26921E-03         1.47985E-02        -7.07008E-03         2.68213E-01         1.14914E+00         2.68306E-01         5.01729E+02         9.17663E-01         9.34357E+01         5.25240E+02         1.42624E+02         3.82617E+02
+          4.26921E-03         1.49683E-02        -7.22891E-03         2.68212E-01         1.15981E+00         2.68310E-01         5.14324E+02         9.17674E-01         9.15286E+01         5.29551E+02         1.42716E+02         3.86835E+02
+          4.26921E-03         1.51382E-02        -7.38955E-03         2.68212E-01         1.17048E+00         2.68314E-01         5.27525E+02         9.17686E-01         9.01353E+01         5.34661E+02         1.43840E+02         3.90822E+02
+          4.26921E-03         1.53080E-02        -7.55201E-03         2.68211E-01         1.18115E+00         2.68317E-01         5.41171E+02         9.17698E-01         8.92261E+01         5.40434E+02         1.45884E+02         3.94550E+02
+          4.26921E-03         1.54778E-02        -7.71628E-03         2.68210E-01         1.19182E+00         2.68321E-01         5.55109E+02         9.17710E-01         8.87656E+01         5.46739E+02         1.48743E+02         3.97996E+02
+          4.26921E-03         1.56476E-02        -7.88236E-03         2.68210E-01         1.20249E+00         2.68326E-01         5.69196E+02         9.17723E-01         8.87135E+01         5.53454E+02         1.52315E+02         4.01139E+02
+          4.26921E-03         1.58175E-02        -8.05025E-03         2.68209E-01         1.21317E+00         2.68330E-01         5.83298E+02         9.17737E-01         8.90263E+01         5.60465E+02         1.56505E+02         4.03960E+02
+          4.26921E-03         1.59873E-02        -8.21996E-03         2.68208E-01         1.22384E+00         2.68334E-01         5.97290E+02         9.17751E-01         8.96589E+01         5.67663E+02         1.61219E+02         4.06444E+02
+          4.26921E-03         1.61571E-02        -8.39148E-03         2.68208E-01         1.23451E+00         2.68339E-01         6.11056E+02         9.17765E-01         9.05659E+01         5.74949E+02         1.66372E+02         4.08577E+02
+          4.26921E-03         1.63270E-02        -8.56481E-03         2.68207E-01         1.24518E+00         2.68344E-01         6.24491E+02         9.17780E-01         9.17027E+01         5.82231E+02         1.71882E+02         4.10349E+02
+          4.26921E-03         1.64968E-02        -8.73996E-03         2.68206E-01         1.25585E+00         2.68348E-01         6.37497E+02         9.17795E-01         9.30272E+01         5.89422E+02         1.77671E+02         4.11751E+02
+          4.26921E-03         1.66666E-02        -8.91692E-03         2.68205E-01         1.26652E+00         2.68353E-01         6.49985E+02         9.17811E-01         9.44996E+01         5.96445E+02         1.83668E+02         4.12777E+02
+          4.26921E-03         1.68364E-02        -9.09569E-03         2.68205E-01         1.27719E+00         2.68359E-01         6.61875E+02         9.17828E-01         9.60836E+01         6.03228E+02         1.89804E+02         4.13425E+02
+          4.26921E-03         1.70063E-02        -9.27628E-03         2.68204E-01         1.28786E+00         2.68364E-01         6.73097E+02         9.17845E-01         9.77462E+01         6.09708E+02         1.96017E+02         4.13691E+02
+          4.26921E-03         1.71761E-02        -9.45867E-03         2.68203E-01         1.29853E+00         2.68370E-01         6.83587E+02         9.17862E-01         9.94578E+01         6.15826E+02         2.02250E+02         4.13577E+02
+          4.26921E-03         1.73459E-02        -9.64288E-03         2.68202E-01         1.30920E+00         2.68375E-01         6.93290E+02         9.17880E-01         1.01192E+02         6.21532E+02         2.08448E+02         4.13084E+02
+          4.26921E-03         1.75158E-02        -9.82891E-03         2.68201E-01         1.31987E+00         2.68381E-01         7.02161E+02         9.17899E-01         1.02926E+02         6.26780E+02         2.14562E+02         4.12218E+02
+          4.26921E-03         1.76856E-02        -1.00167E-02         2.68201E-01         1.33054E+00         2.68388E-01         7.10158E+02         9.17918E-01         1.04639E+02         6.31531E+02         2.20548E+02         4.10983E+02
+          4.26921E-03         1.78554E-02        -1.02064E-02         2.68200E-01         1.34121E+00         2.68394E-01         7.17250E+02         9.17938E-01         1.06313E+02         6.35752E+02         2.26365E+02         4.09388E+02
+          4.26921E-03         1.80252E-02        -1.03979E-02         2.68199E-01         1.35188E+00         2.68400E-01         7.23412E+02         9.17958E-01         1.07933E+02         6.39417E+02         2.31976E+02         4.07440E+02
+          4.26921E-03         1.81951E-02        -1.05911E-02         2.68198E-01         1.36255E+00         2.68407E-01         7.28626E+02         9.17979E-01         1.09487E+02         6.42502E+02         2.37350E+02         4.05151E+02
+          4.26921E-03         1.83649E-02        -1.07862E-02         2.68197E-01         1.37322E+00         2.68414E-01         7.32879E+02         9.18001E-01         1.10962E+02         6.44990E+02         2.42458E+02         4.02532E+02
+          4.26921E-03         1.85347E-02        -1.09831E-02         2.68196E-01         1.38389E+00         2.68421E-01         7.36165E+02         9.18024E-01         1.12349E+02         6.46869E+02         2.47274E+02         3.99595E+02
+          4.26921E-03         1.87045E-02        -1.11818E-02         2.68196E-01         1.39457E+00         2.68429E-01         7.38484E+02         9.18047E-01         1.13640E+02         6.48132E+02         2.51778E+02         3.96354E+02
+          4.26921E-03         1.88744E-02        -1.13824E-02         2.68195E-01         1.40524E+00         2.68436E-01         7.39841E+02         9.18070E-01         1.14829E+02         6.48774E+02         2.55951E+02         3.92823E+02
+          4.26921E-03         1.90442E-02        -1.15847E-02         2.68194E-01         1.41591E+00         2.68444E-01         7.40246E+02         9.18095E-01         1.15911E+02         6.48797E+02         2.59779E+02         3.89018E+02
+          4.26921E-03         1.92140E-02        -1.17889E-02         2.68193E-01         1.42658E+00         2.68452E-01         7.39714E+02         9.18120E-01         1.16880E+02         6.48203E+02         2.63249E+02         3.84954E+02
+          4.26921E-03         1.93839E-02        -1.19948E-02         2.68192E-01         1.43725E+00         2.68460E-01         7.38263E+02         9.18146E-01         1.17734E+02         6.47001E+02         2.66354E+02         3.80647E+02
+          4.26921E-03         1.95537E-02        -1.22026E-02         2.68191E-01         1.44792E+00         2.68469E-01         7.35916E+02         9.18172E-01         1.18469E+02         6.45201E+02         2.69086E+02         3.76115E+02
+          4.26921E-03         1.97235E-02        -1.24122E-02         2.68190E-01         1.45859E+00         2.68477E-01         7.32700E+02         9.18199E-01         1.19086E+02         6.42817E+02         2.71442E+02         3.71375E+02
+          4.26921E-03         1.98933E-02        -1.26236E-02         2.68189E-01         1.46926E+00         2.68486E-01         7.28645E+02         9.18227E-01         1.19582E+02         6.39865E+02         2.73422E+02         3.66443E+02
+          4.26921E-03         2.00632E-02        -1.28368E-02         2.68189E-01         1.47993E+00         2.68496E-01         7.23783E+02         9.18256E-01         1.19956E+02         6.36364E+02         2.75025E+02         3.61339E+02
+          4.26921E-03         2.02330E-02        -1.30519E-02         2.68188E-01         1.49060E+00         2.68505E-01         7.18150E+02         9.18286E-01         1.20211E+02         6.32333E+02         2.76256E+02         3.56078E+02
+          4.26921E-03         2.04028E-02        -1.32687E-02         2.68187E-01         1.50127E+00         2.68515E-01         7.11783E+02         9.18316E-01         1.20345E+02         6.27797E+02         2.77118E+02         3.50679E+02
+          4.26921E-03         2.05726E-02        -1.34874E-02         2.68186E-01         1.51194E+00         2.68525E-01         7.04721E+02         9.18347E-01         1.20361E+02         6.22778E+02         2.77619E+02         3.45159E+02
+          4.26921E-03         2.07425E-02        -1.37078E-02         2.68185E-01         1.52261E+00         2.68535E-01         6.97007E+02         9.18379E-01         1.20259E+02         6.17302E+02         2.77767E+02         3.39536E+02
+          4.26921E-03         2.09123E-02        -1.39301E-02         2.68184E-01         1.53328E+00         2.68545E-01         6.88681E+02         9.18412E-01         1.20043E+02         6.11397E+02         2.77571E+02         3.33826E+02
+          4.26921E-03         2.10821E-02        -1.41542E-02         2.68183E-01         1.54395E+00         2.68556E-01         6.79789E+02         9.18445E-01         1.19713E+02         6.05088E+02         2.77042E+02         3.28046E+02
+          4.26921E-03         2.12520E-02        -1.43801E-02         2.68182E-01         1.55462E+00         2.68567E-01         6.70374E+02         9.18480E-01         1.19273E+02         5.98406E+02         2.76193E+02         3.22213E+02
+          4.26921E-03         2.14218E-02        -1.46079E-02         2.68181E-01         1.56529E+00         2.68579E-01         6.60481E+02         9.18515E-01         1.18726E+02         5.91378E+02         2.75036E+02         3.16342E+02
+          4.26921E-03         2.15916E-02        -1.48374E-02         2.68180E-01         1.57596E+00         2.68590E-01         6.50156E+02         9.18551E-01         1.18074E+02         5.84034E+02         2.73585E+02         3.10449E+02
+          4.26921E-03         2.17614E-02        -1.50688E-02         2.68179E-01         1.58664E+00         2.68602E-01         6.39442E+02         9.18588E-01         1.17320E+02         5.76404E+02         2.71855E+02         3.04549E+02
+          4.26921E-03         2.19313E-02        -1.53019E-02         2.68178E-01         1.59731E+00         2.68614E-01         6.28387E+02         9.18626E-01         1.16469E+02         5.68516E+02         2.69861E+02         2.98655E+02
+          4.26921E-03         2.21011E-02        -1.55369E-02         2.68177E-01         1.60798E+00         2.68627E-01         6.17033E+02         9.18665E-01         1.15523E+02         5.60399E+02         2.67618E+02         2.92781E+02
+          4.26921E-03         2.22709E-02        -1.57737E-02         2.68176E-01         1.61865E+00         2.68640E-01         6.05425E+02         9.18705E-01         1.14486E+02         5.52084E+02         2.65143E+02         2.86941E+02
+          4.26921E-03         2.24407E-02        -1.60123E-02         2.68175E-01         1.62932E+00         2.68653E-01         5.93606E+02         9.18746E-01         1.13362E+02         5.43597E+02         2.62452E+02         2.81146E+02
+          4.26921E-03         2.26106E-02        -1.62527E-02         2.68174E-01         1.63999E+00         2.68666E-01         5.81618E+02         9.18788E-01         1.12154E+02         5.34968E+02         2.59560E+02         2.75408E+02
+          4.26921E-03         2.27804E-02        -1.64950E-02         2.68173E-01         1.65066E+00         2.68680E-01         5.69502E+02         9.18831E-01         1.10866E+02         5.26223E+02         2.56485E+02         2.69738E+02
+          4.26921E-03         2.29502E-02        -1.67390E-02         2.68172E-01         1.66133E+00         2.68694E-01         5.57299E+02         9.18874E-01         1.09502E+02         5.17389E+02         2.53243E+02         2.64146E+02
+          4.26921E-03         2.31201E-02        -1.69849E-02         2.68171E-01         1.67200E+00         2.68708E-01         5.45046E+02         9.18919E-01         1.08066E+02         5.08492E+02         2.49850E+02         2.58642E+02
+          4.26921E-03         2.32899E-02        -1.72325E-02         2.68170E-01         1.68267E+00         2.68723E-01         5.32780E+02         9.18965E-01         1.06562E+02         4.99555E+02         2.46322E+02         2.53234E+02
+          4.26921E-03         2.34597E-02        -1.74820E-02         2.68169E-01         1.69334E+00         2.68738E-01         5.20537E+02         9.19012E-01         1.04994E+02         4.90604E+02         2.42675E+02         2.47929E+02
+          4.26921E-03         2.36295E-02        -1.77333E-02         2.68168E-01         1.70401E+00         2.68753E-01         5.08351E+02         9.19060E-01         1.03364E+02         4.81660E+02         2.38924E+02         2.42736E+02
+          4.26921E-03         2.37994E-02        -1.79864E-02         2.68167E-01         1.71468E+00         2.68769E-01         4.96253E+02         9.19109E-01         1.01678E+02         4.72745E+02         2.35086E+02         2.37659E+02
+          4.26921E-03         2.39692E-02        -1.82414E-02         2.68165E-01         1.72535E+00         2.68785E-01         4.84273E+02         9.19159E-01         9.99389E+01         4.63879E+02         2.31173E+02         2.32706E+02
+          4.26921E-03         2.41390E-02        -1.84981E-02         2.68164E-01         1.73602E+00         2.68802E-01         4.72439E+02         9.19210E-01         9.81501E+01         4.55081E+02         2.27201E+02         2.27880E+02
+          4.26921E-03         2.43088E-02        -1.87567E-02         2.68163E-01         1.74669E+00         2.68818E-01         4.60778E+02         9.19262E-01         9.63154E+01         4.46370E+02         2.23183E+02         2.23187E+02
+          4.26921E-03         2.44787E-02        -1.90170E-02         2.68162E-01         1.75736E+00         2.68836E-01         4.49314E+02         9.19315E-01         9.44386E+01         4.37761E+02         2.19132E+02         2.18629E+02
+          4.26921E-03         2.46485E-02        -1.92792E-02         2.68161E-01         1.76804E+00         2.68853E-01         4.38069E+02         9.19370E-01         9.25230E+01         4.29271E+02         2.15062E+02         2.14209E+02
+          4.26921E-03         2.48183E-02        -1.95432E-02         2.68160E-01         1.77871E+00         2.68871E-01         4.27064E+02         9.19425E-01         9.05721E+01         4.20913E+02         2.10982E+02         2.09930E+02
+          4.26921E-03         2.49882E-02        -1.98090E-02         2.68159E-01         1.78938E+00         2.68889E-01         4.16318E+02         9.19482E-01         8.85893E+01         4.12700E+02         2.06906E+02         2.05793E+02
+          4.26921E-03         2.51580E-02        -2.00767E-02         2.68158E-01         1.80005E+00         2.68908E-01         4.05846E+02         9.19540E-01         8.65779E+01         4.04643E+02         2.02844E+02         2.01799E+02
+          4.26921E-03         2.53278E-02        -2.03461E-02         2.68156E-01         1.81072E+00         2.68927E-01         3.95663E+02         9.19599E-01         8.45411E+01         3.96754E+02         1.98805E+02         1.97949E+02
+          4.26921E-03         2.54976E-02        -2.06174E-02         2.68155E-01         1.82139E+00         2.68947E-01         3.85783E+02         9.19660E-01         8.24819E+01         3.89041E+02         1.94799E+02         1.94241E+02
+          4.26921E-03         2.56675E-02        -2.08904E-02         2.68154E-01         1.83206E+00         2.68967E-01         3.76215E+02         9.19721E-01         8.04035E+01         3.81511E+02         1.90835E+02         1.90677E+02
+          4.26921E-03         2.58373E-02        -2.11653E-02         2.68153E-01         1.84273E+00         2.68987E-01         3.66970E+02         9.19784E-01         7.83088E+01         3.74173E+02         1.86920E+02         1.87253E+02
+          4.26921E-03         2.60071E-02        -2.14420E-02         2.68152E-01         1.85340E+00         2.69008E-01         3.58053E+02         9.19848E-01         7.62006E+01         3.67032E+02         1.83062E+02         1.83970E+02
+          4.26921E-03         2.61769E-02        -2.17205E-02         2.68151E-01         1.86407E+00         2.69029E-01         3.49472E+02         9.19914E-01         7.40818E+01         3.60092E+02         1.79268E+02         1.80824E+02
+          4.43904E-03         8.72665E-04        -2.60188E-04         2.78913E-01         2.74155E-01         2.78913E-01         1.64629E+04         9.47271E-01         2.35255E+03         1.51881E+04         1.18664E+04         3.32164E+03
+          4.43904E-03         1.04249E-03        -2.70405E-04         2.78913E-01         2.84826E-01         2.78913E-01         1.61319E+04         9.47271E-01         2.31175E+03         1.48898E+04         1.16423E+04         3.24747E+03
+          4.43904E-03         1.21232E-03        -2.82435E-04         2.78913E-01         2.95496E-01         2.78913E-01         1.57945E+04         9.47271E-01         2.27010E+03         1.45856E+04         1.14135E+04         3.17207E+03
+          4.43904E-03         1.38215E-03        -2.96277E-04         2.78913E-01         3.06167E-01         2.78913E-01         1.54511E+04         9.47271E-01         2.22767E+03         1.42761E+04         1.11805E+04         3.09559E+03
+          4.43904E-03         1.55197E-03        -3.11932E-04         2.78913E-01         3.16838E-01         2.78913E-01         1.51025E+04         9.47271E-01         2.18453E+03         1.39618E+04         1.09437E+04         3.01816E+03
+          4.43904E-03         1.72180E-03        -3.29398E-04         2.78913E-01         3.27508E-01         2.78913E-01         1.47491E+04         9.47271E-01         2.14074E+03         1.36433E+04         1.07034E+04         2.93995E+03
+          4.43904E-03         1.89163E-03        -3.48676E-04         2.78913E-01         3.38179E-01         2.78913E-01         1.43917E+04         9.47270E-01         2.09638E+03         1.33211E+04         1.04600E+04         2.86110E+03
+          4.43904E-03         2.06146E-03        -3.69767E-04         2.78913E-01         3.48849E-01         2.78913E-01         1.40307E+04         9.47270E-01         2.05151E+03         1.29957E+04         1.02140E+04         2.78175E+03
+          4.43904E-03         2.23128E-03        -3.92670E-04         2.78912E-01         3.59520E-01         2.78913E-01         1.36668E+04         9.47270E-01         2.00621E+03         1.26677E+04         9.96560E+03         2.70206E+03
+          4.43904E-03         2.40111E-03        -4.17385E-04         2.78912E-01         3.70190E-01         2.78913E-01         1.33006E+04         9.47270E-01         1.96053E+03         1.23375E+04         9.71531E+03         2.62217E+03
+          4.43904E-03         2.57094E-03        -4.43912E-04         2.78912E-01         3.80861E-01         2.78913E-01         1.29326E+04         9.47270E-01         1.91456E+03         1.20057E+04         9.46349E+03         2.54222E+03
+          4.43904E-03         2.74077E-03        -4.72251E-04         2.78912E-01         3.91532E-01         2.78912E-01         1.25634E+04         9.47269E-01         1.86836E+03         1.16729E+04         9.21050E+03         2.46236E+03
+          4.43904E-03         2.91059E-03        -5.02403E-04         2.78912E-01         4.02202E-01         2.78912E-01         1.21936E+04         9.47269E-01         1.82198E+03         1.13394E+04         8.95672E+03         2.38272E+03
+          4.43904E-03         3.08042E-03        -5.34366E-04         2.78912E-01         4.12873E-01         2.78912E-01         1.18238E+04         9.47269E-01         1.77551E+03         1.10059E+04         8.70251E+03         2.30343E+03
+          4.43904E-03         3.25025E-03        -5.68142E-04         2.78912E-01         4.23543E-01         2.78912E-01         1.14545E+04         9.47269E-01         1.72900E+03         1.06729E+04         8.44824E+03         2.22463E+03
+          4.43904E-03         3.42008E-03        -6.03730E-04         2.78911E-01         4.34214E-01         2.78912E-01         1.10863E+04         9.47269E-01         1.68252E+03         1.03407E+04         8.19425E+03         2.14645E+03
+          4.43904E-03         3.58990E-03        -6.41130E-04         2.78911E-01         4.44884E-01         2.78912E-01         1.07196E+04         9.47268E-01         1.63613E+03         1.00099E+04         7.94091E+03         2.06900E+03
+          4.43904E-03         3.75973E-03        -6.80342E-04         2.78911E-01         4.55555E-01         2.78912E-01         1.03550E+04         9.47268E-01         1.58990E+03         9.68096E+03         7.68855E+03         1.99241E+03
+          4.43904E-03         3.92956E-03        -7.21367E-04         2.78911E-01         4.66225E-01         2.78912E-01         9.99301E+03         9.47268E-01         1.54387E+03         9.35428E+03         7.43749E+03         1.91679E+03
+          4.43904E-03         4.09939E-03        -7.64204E-04         2.78911E-01         4.76896E-01         2.78912E-01         9.63408E+03         9.47268E-01         1.49810E+03         9.03031E+03         7.18806E+03         1.84226E+03
+          4.43904E-03         4.26921E-03        -8.08852E-04         2.78911E-01         4.87567E-01         2.78912E-01         9.27870E+03         9.47268E-01         1.45266E+03         8.70947E+03         6.94057E+03         1.76891E+03
+          4.43904E-03         4.43904E-03        -8.55313E-04         2.78910E-01         4.98237E-01         2.78912E-01         8.92730E+03         9.47268E-01         1.40760E+03         8.39215E+03         6.69531E+03         1.69684E+03
+          4.43904E-03         4.60887E-03        -9.03587E-04         2.78910E-01         5.08908E-01         2.78912E-01         8.58032E+03         9.47267E-01         1.36296E+03         8.07874E+03         6.45259E+03         1.62615E+03
+          4.43904E-03         4.77869E-03        -9.53672E-04         2.78910E-01         5.19578E-01         2.78912E-01         8.23818E+03         9.47267E-01         1.31880E+03         7.76961E+03         6.21267E+03         1.55693E+03
+          4.43904E-03         4.94852E-03        -1.00557E-03         2.78910E-01         5.30249E-01         2.78912E-01         7.90126E+03         9.47267E-01         1.27517E+03         7.46509E+03         5.97583E+03         1.48926E+03
+          4.43904E-03         5.11835E-03        -1.05928E-03         2.78909E-01         5.40919E-01         2.78911E-01         7.56994E+03         9.47267E-01         1.23210E+03         7.16552E+03         5.74231E+03         1.42321E+03
+          4.43904E-03         5.28818E-03        -1.11480E-03         2.78909E-01         5.51590E-01         2.78911E-01         7.24457E+03         9.47267E-01         1.18965E+03         6.87121E+03         5.51235E+03         1.35886E+03
+          4.43904E-03         5.45800E-03        -1.17214E-03         2.78909E-01         5.62261E-01         2.78911E-01         6.92548E+03         9.47267E-01         1.14784E+03         6.58246E+03         5.28619E+03         1.29628E+03
+          4.43904E-03         5.62783E-03        -1.23128E-03         2.78909E-01         5.72931E-01         2.78911E-01         6.61297E+03         9.47267E-01         1.10673E+03         6.29953E+03         5.06403E+03         1.23551E+03
+          4.43904E-03         5.79766E-03        -1.29224E-03         2.78908E-01         5.83602E-01         2.78911E-01         6.30735E+03         9.47267E-01         1.06634E+03         6.02268E+03         4.84608E+03         1.17661E+03
+          4.43904E-03         5.96749E-03        -1.35501E-03         2.78908E-01         5.94272E-01         2.78911E-01         6.00886E+03         9.47267E-01         1.02671E+03         5.75214E+03         4.63252E+03         1.11963E+03
+          4.43904E-03         6.13731E-03        -1.41959E-03         2.78908E-01         6.04943E-01         2.78911E-01         5.71775E+03         9.47267E-01         9.87868E+02         5.48813E+03         4.42352E+03         1.06460E+03
+          4.43904E-03         6.30714E-03        -1.48599E-03         2.78908E-01         6.15613E-01         2.78912E-01         5.43424E+03         9.47267E-01         9.49841E+02         5.23083E+03         4.21926E+03         1.01157E+03
+          4.43904E-03         6.47697E-03        -1.55420E-03         2.78907E-01         6.26284E-01         2.78912E-01         5.15854E+03         9.47267E-01         9.12653E+02         4.98042E+03         4.01986E+03         9.60557E+02
+          4.43904E-03         6.64680E-03        -1.62422E-03         2.78907E-01         6.36955E-01         2.78912E-01         4.89080E+03         9.47268E-01         8.76328E+02         4.73705E+03         3.82546E+03         9.11584E+02
+          4.43904E-03         6.81662E-03        -1.69605E-03         2.78907E-01         6.47625E-01         2.78912E-01         4.63119E+03         9.47268E-01         8.40885E+02         4.50085E+03         3.63618E+03         8.64667E+02
+          4.43904E-03         6.98645E-03        -1.76969E-03         2.78906E-01         6.58296E-01         2.78912E-01         4.37984E+03         9.47268E-01         8.06342E+02         4.27194E+03         3.45212E+03         8.19817E+02
+          4.43904E-03         7.15628E-03        -1.84515E-03         2.78906E-01         6.68966E-01         2.78912E-01         4.13685E+03         9.47269E-01         7.72712E+02         4.05041E+03         3.27337E+03         7.77038E+02
+          4.43904E-03         7.32611E-03        -1.92242E-03         2.78906E-01         6.79637E-01         2.78912E-01         3.90231E+03         9.47269E-01         7.40008E+02         3.83634E+03         3.10001E+03         7.36328E+02
+          4.43904E-03         7.49593E-03        -2.00150E-03         2.78905E-01         6.90307E-01         2.78912E-01         3.67629E+03         9.47269E-01         7.08239E+02         3.62978E+03         2.93209E+03         6.97681E+02
+          4.43904E-03         7.66576E-03        -2.08239E-03         2.78905E-01         7.00978E-01         2.78913E-01         3.45883E+03         9.47270E-01         6.77412E+02         3.43076E+03         2.76968E+03         6.61086E+02
+          4.43904E-03         7.83559E-03        -2.16510E-03         2.78905E-01         7.11649E-01         2.78913E-01         3.24995E+03         9.47271E-01         6.47531E+02         3.23931E+03         2.61279E+03         6.26525E+02
+          4.43904E-03         8.00542E-03        -2.24962E-03         2.78904E-01         7.22319E-01         2.78913E-01         3.04965E+03         9.47271E-01         6.18598E+02         3.05544E+03         2.46146E+03         5.93977E+02
+          4.43904E-03         8.17524E-03        -2.33595E-03         2.78904E-01         7.32990E-01         2.78914E-01         2.85793E+03         9.47272E-01         5.90614E+02         2.87911E+03         2.31570E+03         5.63415E+02
+          4.43904E-03         8.34507E-03        -2.42409E-03         2.78903E-01         7.43660E-01         2.78914E-01         2.67475E+03         9.47273E-01         5.63576E+02         2.71031E+03         2.17550E+03         5.34808E+02
+          4.43904E-03         8.51490E-03        -2.51405E-03         2.78903E-01         7.54331E-01         2.78914E-01         2.50006E+03         9.47274E-01         5.37478E+02         2.54899E+03         2.04086E+03         5.08123E+02
+          4.43904E-03         8.68473E-03        -2.60581E-03         2.78903E-01         7.65001E-01         2.78915E-01         2.33377E+03         9.47275E-01         5.12315E+02         2.39507E+03         1.91175E+03         4.83319E+02
+          4.43904E-03         8.85455E-03        -2.69939E-03         2.78902E-01         7.75672E-01         2.78915E-01         2.17582E+03         9.47276E-01         4.88077E+02         2.24849E+03         1.78814E+03         4.60354E+02
+          4.43904E-03         9.02438E-03        -2.79479E-03         2.78902E-01         7.86343E-01         2.78916E-01         2.02609E+03         9.47278E-01         4.64753E+02         2.10915E+03         1.66997E+03         4.39183E+02
+          4.43904E-03         9.19421E-03        -2.89199E-03         2.78901E-01         7.97013E-01         2.78916E-01         1.88448E+03         9.47279E-01         4.42331E+02         1.97696E+03         1.55720E+03         4.19755E+02
+          4.43904E-03         9.36403E-03        -2.99101E-03         2.78901E-01         8.07684E-01         2.78917E-01         1.75083E+03         9.47280E-01         4.20796E+02         1.85178E+03         1.44976E+03         4.02019E+02
+          4.43904E-03         9.53386E-03        -3.09184E-03         2.78900E-01         8.18354E-01         2.78918E-01         1.62502E+03         9.47282E-01         4.00134E+02         1.73350E+03         1.34758E+03         3.85920E+02
+          4.43904E-03         9.70369E-03        -3.19448E-03         2.78900E-01         8.29025E-01         2.78918E-01         1.50687E+03         9.47284E-01         3.80326E+02         1.62198E+03         1.25058E+03         3.71399E+02
+          4.43904E-03         9.87352E-03        -3.29893E-03         2.78900E-01         8.39695E-01         2.78919E-01         1.39623E+03         9.47286E-01         3.61354E+02         1.51706E+03         1.15866E+03         3.58399E+02
+          4.43904E-03         1.00433E-02        -3.40520E-03         2.78899E-01         8.50366E-01         2.78920E-01         1.29290E+03         9.47288E-01         3.43199E+02         1.41858E+03         1.07173E+03         3.46857E+02
+          4.43904E-03         1.02132E-02        -3.51328E-03         2.78899E-01         8.61037E-01         2.78921E-01         1.19670E+03         9.47290E-01         3.25839E+02         1.32639E+03         9.89680E+02         3.36709E+02
+          4.43904E-03         1.03830E-02        -3.62317E-03         2.78898E-01         8.71707E-01         2.78922E-01         1.10742E+03         9.47292E-01         3.09255E+02         1.24030E+03         9.12406E+02         3.27893E+02
+          4.43904E-03         1.05528E-02        -3.73487E-03         2.78898E-01         8.82378E-01         2.78923E-01         1.02486E+03         9.47294E-01         2.93424E+02         1.16013E+03         8.39789E+02         3.20342E+02
+          4.43904E-03         1.07227E-02        -3.84839E-03         2.78897E-01         8.93048E-01         2.78924E-01         9.48798E+02         9.47297E-01         2.78323E+02         1.08569E+03         7.71706E+02         3.13989E+02
+          4.43904E-03         1.08925E-02        -3.96372E-03         2.78897E-01         9.03719E-01         2.78925E-01         8.79009E+02         9.47300E-01         2.63930E+02         1.01680E+03         7.08030E+02         3.08768E+02
+          4.43904E-03         1.10623E-02        -4.08086E-03         2.78896E-01         9.14389E-01         2.78926E-01         8.15264E+02         9.47302E-01         2.50223E+02         9.53241E+02         6.48630E+02         3.04611E+02
+          4.43904E-03         1.12321E-02        -4.19981E-03         2.78896E-01         9.25060E-01         2.78927E-01         7.57330E+02         9.47305E-01         2.37179E+02         8.94822E+02         5.93372E+02         3.01450E+02
+          4.43904E-03         1.14020E-02        -4.32058E-03         2.78895E-01         9.35731E-01         2.78928E-01         7.04968E+02         9.47309E-01         2.24777E+02         8.41335E+02         5.42117E+02         2.99219E+02
+          4.43904E-03         1.15718E-02        -4.44315E-03         2.78894E-01         9.46401E-01         2.78930E-01         6.57937E+02         9.47312E-01         2.12995E+02         7.92572E+02         4.94723E+02         2.97849E+02
+          4.43904E-03         1.17416E-02        -4.56755E-03         2.78894E-01         9.57072E-01         2.78931E-01         6.15992E+02         9.47316E-01         2.01813E+02         7.48321E+02         4.51047E+02         2.97274E+02
+          4.43904E-03         1.19114E-02        -4.69375E-03         2.78893E-01         9.67742E-01         2.78933E-01         5.78887E+02         9.47319E-01         1.91212E+02         7.08373E+02         4.10944E+02         2.97429E+02
+          4.43904E-03         1.20813E-02        -4.82176E-03         2.78893E-01         9.78413E-01         2.78934E-01         5.46377E+02         9.47323E-01         1.81173E+02         6.72516E+02         3.74268E+02         2.98248E+02
+          4.43904E-03         1.22511E-02        -4.95159E-03         2.78892E-01         9.89083E-01         2.78936E-01         5.18215E+02         9.47327E-01         1.71681E+02         6.40538E+02         3.40871E+02         2.99667E+02
+          4.43904E-03         1.24209E-02        -5.08323E-03         2.78892E-01         9.99754E-01         2.78938E-01         4.94155E+02         9.47332E-01         1.62719E+02         6.12228E+02         3.10605E+02         3.01624E+02
+          4.43904E-03         1.25908E-02        -5.21669E-03         2.78891E-01         1.01042E+00         2.78940E-01         4.73954E+02         9.47336E-01         1.54275E+02         5.87378E+02         2.83322E+02         3.04057E+02
+          4.43904E-03         1.27606E-02        -5.35195E-03         2.78890E-01         1.02110E+00         2.78942E-01         4.57368E+02         9.47341E-01         1.46338E+02         5.65781E+02         2.58874E+02         3.06907E+02
+          4.43904E-03         1.29304E-02        -5.48903E-03         2.78890E-01         1.03177E+00         2.78944E-01         4.44158E+02         9.47346E-01         1.38898E+02         5.47231E+02         2.37115E+02         3.10116E+02
+          4.43904E-03         1.31002E-02        -5.62792E-03         2.78889E-01         1.04244E+00         2.78946E-01         4.34088E+02         9.47351E-01         1.31946E+02         5.31528E+02         2.17900E+02         3.13629E+02
+          4.43904E-03         1.32701E-02        -5.76863E-03         2.78889E-01         1.05311E+00         2.78948E-01         4.26925E+02         9.47357E-01         1.25479E+02         5.18473E+02         2.01083E+02         3.17390E+02
+          4.43904E-03         1.34399E-02        -5.91114E-03         2.78888E-01         1.06378E+00         2.78951E-01         4.22441E+02         9.47363E-01         1.19491E+02         5.07873E+02         1.86524E+02         3.21349E+02
+          4.43904E-03         1.36097E-02        -6.05547E-03         2.78887E-01         1.07445E+00         2.78953E-01         4.20414E+02         9.47369E-01         1.13979E+02         4.99537E+02         1.74082E+02         3.25455E+02
+          4.43904E-03         1.37795E-02        -6.20162E-03         2.78887E-01         1.08512E+00         2.78956E-01         4.20625E+02         9.47375E-01         1.08944E+02         4.93281E+02         1.63620E+02         3.29661E+02
+          4.43904E-03         1.39494E-02        -6.34957E-03         2.78886E-01         1.09579E+00         2.78958E-01         4.22863E+02         9.47382E-01         1.04383E+02         4.88925E+02         1.55002E+02         3.33922E+02
+          4.43904E-03         1.41192E-02        -6.49934E-03         2.78885E-01         1.10646E+00         2.78961E-01         4.26921E+02         9.47388E-01         1.00294E+02         4.86294E+02         1.48098E+02         3.38196E+02
+          4.43904E-03         1.42890E-02        -6.65092E-03         2.78885E-01         1.11713E+00         2.78964E-01         4.32602E+02         9.47395E-01         9.66770E+01         4.85221E+02         1.42779E+02         3.42442E+02
+          4.43904E-03         1.44589E-02        -6.80431E-03         2.78884E-01         1.12780E+00         2.78967E-01         4.39712E+02         9.47403E-01         9.35266E+01         4.85541E+02         1.38919E+02         3.46622E+02
+          4.43904E-03         1.46287E-02        -6.95952E-03         2.78883E-01         1.13847E+00         2.78970E-01         4.48067E+02         9.47411E-01         9.08363E+01         4.87100E+02         1.36398E+02         3.50701E+02
+          4.43904E-03         1.47985E-02        -7.11653E-03         2.78883E-01         1.14914E+00         2.78973E-01         4.57489E+02         9.47419E-01         8.85961E+01         4.89745E+02         1.35099E+02         3.54647E+02
+          4.43904E-03         1.49683E-02        -7.27536E-03         2.78882E-01         1.15981E+00         2.78977E-01         4.67808E+02         9.47427E-01         8.67919E+01         4.93335E+02         1.34907E+02         3.58429E+02
+          4.43904E-03         1.51382E-02        -7.43601E-03         2.78881E-01         1.17048E+00         2.78980E-01         4.78863E+02         9.47435E-01         8.54052E+01         4.97732E+02         1.35713E+02         3.62019E+02
+          4.43904E-03         1.53080E-02        -7.59846E-03         2.78880E-01         1.18115E+00         2.78984E-01         4.90498E+02         9.47444E-01         8.44132E+01         5.02806E+02         1.37413E+02         3.65393E+02
+          4.43904E-03         1.54778E-02        -7.76273E-03         2.78880E-01         1.19182E+00         2.78988E-01         5.02569E+02         9.47454E-01         8.37894E+01         5.08433E+02         1.39906E+02         3.68528E+02
+          4.43904E-03         1.56476E-02        -7.92881E-03         2.78879E-01         1.20249E+00         2.78992E-01         5.14937E+02         9.47463E-01         8.35035E+01         5.14498E+02         1.43095E+02         3.71403E+02
+          4.43904E-03         1.58175E-02        -8.09671E-03         2.78878E-01         1.21317E+00         2.78996E-01         5.27473E+02         9.47473E-01         8.35230E+01         5.20890E+02         1.46889E+02         3.74001E+02
+          4.43904E-03         1.59873E-02        -8.26642E-03         2.78877E-01         1.22384E+00         2.79000E-01         5.40055E+02         9.47484E-01         8.38139E+01         5.27506E+02         1.51200E+02         3.76306E+02
+          4.43904E-03         1.61571E-02        -8.43794E-03         2.78877E-01         1.23451E+00         2.79004E-01         5.52571E+02         9.47494E-01         8.43414E+01         5.34252E+02         1.55946E+02         3.78306E+02
+          4.43904E-03         1.63270E-02        -8.61127E-03         2.78876E-01         1.24518E+00         2.79009E-01         5.64915E+02         9.47505E-01         8.50714E+01         5.41038E+02         1.61049E+02         3.79989E+02
+          4.43904E-03         1.64968E-02        -8.78642E-03         2.78875E-01         1.25585E+00         2.79014E-01         5.76991E+02         9.47517E-01         8.59705E+01         5.47782E+02         1.66435E+02         3.81347E+02
+          4.43904E-03         1.66666E-02        -8.96337E-03         2.78874E-01         1.26652E+00         2.79018E-01         5.88710E+02         9.47529E-01         8.70072E+01         5.54408E+02         1.72035E+02         3.82373E+02
+          4.43904E-03         1.68364E-02        -9.14215E-03         2.78874E-01         1.27719E+00         2.79023E-01         5.99992E+02         9.47541E-01         8.81519E+01         5.60847E+02         1.77784E+02         3.83062E+02
+          4.43904E-03         1.70063E-02        -9.32273E-03         2.78873E-01         1.28786E+00         2.79029E-01         6.10762E+02         9.47554E-01         8.93774E+01         5.67036E+02         1.83623E+02         3.83413E+02
+          4.43904E-03         1.71761E-02        -9.50513E-03         2.78872E-01         1.29853E+00         2.79034E-01         6.20956E+02         9.47567E-01         9.06590E+01         5.72918E+02         1.89495E+02         3.83423E+02
+          4.43904E-03         1.73459E-02        -9.68934E-03         2.78871E-01         1.30920E+00         2.79039E-01         6.30515E+02         9.47580E-01         9.19741E+01         5.78444E+02         1.95349E+02         3.83095E+02
+          4.43904E-03         1.75158E-02        -9.87536E-03         2.78870E-01         1.31987E+00         2.79045E-01         6.39390E+02         9.47594E-01         9.33027E+01         5.83568E+02         2.01138E+02         3.82430E+02
+          4.43904E-03         1.76856E-02        -1.00632E-02         2.78869E-01         1.33054E+00         2.79051E-01         6.47535E+02         9.47608E-01         9.46271E+01         5.88252E+02         2.06818E+02         3.81433E+02
+          4.43904E-03         1.78554E-02        -1.02528E-02         2.78869E-01         1.34121E+00         2.79057E-01         6.54914E+02         9.47623E-01         9.59315E+01         5.92461E+02         2.12351E+02         3.80110E+02
+          4.43904E-03         1.80252E-02        -1.04443E-02         2.78868E-01         1.35188E+00         2.79063E-01         6.61496E+02         9.47638E-01         9.72020E+01         5.96168E+02         2.17701E+02         3.78467E+02
+          4.43904E-03         1.81951E-02        -1.06376E-02         2.78867E-01         1.36255E+00         2.79070E-01         6.67257E+02         9.47654E-01         9.84268E+01         5.99349E+02         2.22836E+02         3.76514E+02
+          4.43904E-03         1.83649E-02        -1.08327E-02         2.78866E-01         1.37322E+00         2.79076E-01         6.72179E+02         9.47670E-01         9.95954E+01         6.01986E+02         2.27728E+02         3.74258E+02
+          4.43904E-03         1.85347E-02        -1.10296E-02         2.78865E-01         1.38389E+00         2.79083E-01         6.76248E+02         9.47687E-01         1.00699E+02         6.04065E+02         2.32354E+02         3.71711E+02
+          4.43904E-03         1.87045E-02        -1.12283E-02         2.78864E-01         1.39457E+00         2.79090E-01         6.79458E+02         9.47704E-01         1.01729E+02         6.05576E+02         2.36691E+02         3.68885E+02
+          4.43904E-03         1.88744E-02        -1.14288E-02         2.78863E-01         1.40524E+00         2.79098E-01         6.81806E+02         9.47722E-01         1.02681E+02         6.06513E+02         2.40723E+02         3.65791E+02
+          4.43904E-03         1.90442E-02        -1.16312E-02         2.78863E-01         1.41591E+00         2.79105E-01         6.83296E+02         9.47740E-01         1.03548E+02         6.06876E+02         2.44434E+02         3.62442E+02
+          4.43904E-03         1.92140E-02        -1.18353E-02         2.78862E-01         1.42658E+00         2.79113E-01         6.83933E+02         9.47759E-01         1.04326E+02         6.06665E+02         2.47812E+02         3.58852E+02
+          4.43904E-03         1.93839E-02        -1.20413E-02         2.78861E-01         1.43725E+00         2.79121E-01         6.83730E+02         9.47778E-01         1.05011E+02         6.05885E+02         2.50849E+02         3.55036E+02
+          4.43904E-03         1.95537E-02        -1.22491E-02         2.78860E-01         1.44792E+00         2.79129E-01         6.82703E+02         9.47798E-01         1.05602E+02         6.04545E+02         2.53537E+02         3.51008E+02
+          4.43904E-03         1.97235E-02        -1.24587E-02         2.78859E-01         1.45859E+00         2.79137E-01         6.80868E+02         9.47818E-01         1.06095E+02         6.02655E+02         2.55873E+02         3.46783E+02
+          4.43904E-03         1.98933E-02        -1.26701E-02         2.78858E-01         1.46926E+00         2.79146E-01         6.78250E+02         9.47839E-01         1.06490E+02         6.00230E+02         2.57854E+02         3.42376E+02
+          4.43904E-03         2.00632E-02        -1.28833E-02         2.78857E-01         1.47993E+00         2.79154E-01         6.74872E+02         9.47860E-01         1.06786E+02         5.97284E+02         2.59481E+02         3.37804E+02
+          4.43904E-03         2.02330E-02        -1.30983E-02         2.78856E-01         1.49060E+00         2.79163E-01         6.70763E+02         9.47882E-01         1.06981E+02         5.93837E+02         2.60756E+02         3.33081E+02
+          4.43904E-03         2.04028E-02        -1.33152E-02         2.78855E-01         1.50127E+00         2.79173E-01         6.65953E+02         9.47905E-01         1.07078E+02         5.89906E+02         2.61683E+02         3.28223E+02
+          4.43904E-03         2.05726E-02        -1.35338E-02         2.78854E-01         1.51194E+00         2.79182E-01         6.60474E+02         9.47928E-01         1.07075E+02         5.85514E+02         2.62269E+02         3.23246E+02
+          4.43904E-03         2.07425E-02        -1.37543E-02         2.78853E-01         1.52261E+00         2.79192E-01         6.54361E+02         9.47952E-01         1.06975E+02         5.80684E+02         2.62519E+02         3.18165E+02
+          4.43904E-03         2.09123E-02        -1.39766E-02         2.78852E-01         1.53328E+00         2.79202E-01         6.47648E+02         9.47977E-01         1.06778E+02         5.75439E+02         2.62443E+02         3.12996E+02
+          4.43904E-03         2.10821E-02        -1.42007E-02         2.78851E-01         1.54395E+00         2.79212E-01         6.40374E+02         9.48002E-01         1.06486E+02         5.69804E+02         2.62050E+02         3.07754E+02
+          4.43904E-03         2.12520E-02        -1.44266E-02         2.78850E-01         1.55462E+00         2.79223E-01         6.32575E+02         9.48027E-01         1.06101E+02         5.63806E+02         2.61352E+02         3.02454E+02
+          4.43904E-03         2.14218E-02        -1.46543E-02         2.78849E-01         1.56529E+00         2.79234E-01         6.24291E+02         9.48054E-01         1.05624E+02         5.57470E+02         2.60360E+02         2.97109E+02
+          4.43904E-03         2.15916E-02        -1.48839E-02         2.78848E-01         1.57596E+00         2.79245E-01         6.15561E+02         9.48081E-01         1.05059E+02         5.50823E+02         2.59087E+02         2.91735E+02
+          4.43904E-03         2.17614E-02        -1.51152E-02         2.78847E-01         1.58664E+00         2.79256E-01         6.06425E+02         9.48109E-01         1.04407E+02         5.43892E+02         2.57547E+02         2.86344E+02
+          4.43904E-03         2.19313E-02        -1.53484E-02         2.78846E-01         1.59731E+00         2.79268E-01         5.96922E+02         9.48137E-01         1.03672E+02         5.36704E+02         2.55754E+02         2.80950E+02
+          4.43904E-03         2.21011E-02        -1.55834E-02         2.78845E-01         1.60798E+00         2.79280E-01         5.87093E+02         9.48166E-01         1.02856E+02         5.29287E+02         2.53721E+02         2.75566E+02
+          4.43904E-03         2.22709E-02        -1.58201E-02         2.78844E-01         1.61865E+00         2.79292E-01         5.76976E+02         9.48196E-01         1.01961E+02         5.21666E+02         2.51464E+02         2.70202E+02
+          4.43904E-03         2.24407E-02        -1.60588E-02         2.78843E-01         1.62932E+00         2.79305E-01         5.66611E+02         9.48226E-01         1.00992E+02         5.13870E+02         2.48998E+02         2.64872E+02
+          4.43904E-03         2.26106E-02        -1.62992E-02         2.78842E-01         1.63999E+00         2.79318E-01         5.56036E+02         9.48257E-01         9.99496E+01         5.05924E+02         2.46339E+02         2.59585E+02
+          4.43904E-03         2.27804E-02        -1.65414E-02         2.78841E-01         1.65066E+00         2.79331E-01         5.45289E+02         9.48289E-01         9.88385E+01         4.97853E+02         2.43501E+02         2.54352E+02
+          4.43904E-03         2.29502E-02        -1.67855E-02         2.78840E-01         1.66133E+00         2.79344E-01         5.34407E+02         9.48322E-01         9.76614E+01         4.89682E+02         2.40501E+02         2.49182E+02
+          4.43904E-03         2.31201E-02        -1.70313E-02         2.78839E-01         1.67200E+00         2.79358E-01         5.23425E+02         9.48355E-01         9.64213E+01         4.81437E+02         2.37353E+02         2.44084E+02
+          4.43904E-03         2.32899E-02        -1.72790E-02         2.78837E-01         1.68267E+00         2.79372E-01         5.12377E+02         9.48390E-01         9.51216E+01         4.73139E+02         2.34072E+02         2.39067E+02
+          4.43904E-03         2.34597E-02        -1.75285E-02         2.78836E-01         1.69334E+00         2.79387E-01         5.01297E+02         9.48424E-01         9.37652E+01         4.64812E+02         2.30675E+02         2.34138E+02
+          4.43904E-03         2.36295E-02        -1.77798E-02         2.78835E-01         1.70401E+00         2.79402E-01         4.90217E+02         9.48460E-01         9.23554E+01         4.56478E+02         2.27174E+02         2.29303E+02
+          4.43904E-03         2.37994E-02        -1.80329E-02         2.78834E-01         1.71468E+00         2.79417E-01         4.79168E+02         9.48497E-01         9.08954E+01         4.48156E+02         2.23585E+02         2.24570E+02
+          4.43904E-03         2.39692E-02        -1.82878E-02         2.78833E-01         1.72535E+00         2.79432E-01         4.68178E+02         9.48534E-01         8.93882E+01         4.39866E+02         2.19922E+02         2.19944E+02
+          4.43904E-03         2.41390E-02        -1.85446E-02         2.78832E-01         1.73602E+00         2.79448E-01         4.57275E+02         9.48572E-01         8.78369E+01         4.31627E+02         2.16197E+02         2.15430E+02
+          4.43904E-03         2.43088E-02        -1.88031E-02         2.78831E-01         1.74669E+00         2.79464E-01         4.46484E+02         9.48611E-01         8.62446E+01         4.23456E+02         2.12425E+02         2.11031E+02
+          4.43904E-03         2.44787E-02        -1.90635E-02         2.78830E-01         1.75736E+00         2.79480E-01         4.35830E+02         9.48651E-01         8.46143E+01         4.15369E+02         2.08617E+02         2.06752E+02
+          4.43904E-03         2.46485E-02        -1.93257E-02         2.78828E-01         1.76804E+00         2.79497E-01         4.25336E+02         9.48692E-01         8.29489E+01         4.07381E+02         2.04785E+02         2.02596E+02
+          4.43904E-03         2.48183E-02        -1.95897E-02         2.78827E-01         1.77871E+00         2.79515E-01         4.15022E+02         9.48733E-01         8.12515E+01         3.99507E+02         2.00942E+02         1.98565E+02
+          4.43904E-03         2.49882E-02        -1.98555E-02         2.78826E-01         1.78938E+00         2.79532E-01         4.04907E+02         9.48776E-01         7.95247E+01         3.91758E+02         1.97097E+02         1.94661E+02
+          4.43904E-03         2.51580E-02        -2.01231E-02         2.78825E-01         1.80005E+00         2.79550E-01         3.95008E+02         9.48819E-01         7.77715E+01         3.84146E+02         1.93261E+02         1.90886E+02
+          4.43904E-03         2.53278E-02        -2.03926E-02         2.78824E-01         1.81072E+00         2.79568E-01         3.85342E+02         9.48863E-01         7.59945E+01         3.76683E+02         1.89444E+02         1.87239E+02
+          4.43904E-03         2.54976E-02        -2.06638E-02         2.78822E-01         1.82139E+00         2.79587E-01         3.75923E+02         9.48908E-01         7.41965E+01         3.69376E+02         1.85654E+02         1.83722E+02
+          4.43904E-03         2.56675E-02        -2.09369E-02         2.78821E-01         1.83206E+00         2.79606E-01         3.66762E+02         9.48954E-01         7.23800E+01         3.62235E+02         1.81900E+02         1.80335E+02
+          4.43904E-03         2.58373E-02        -2.12118E-02         2.78820E-01         1.84273E+00         2.79626E-01         3.57870E+02         9.49001E-01         7.05476E+01         3.55266E+02         1.78190E+02         1.77076E+02
+          4.43904E-03         2.60071E-02        -2.14884E-02         2.78819E-01         1.85340E+00         2.79646E-01         3.49258E+02         9.49049E-01         6.87018E+01         3.48475E+02         1.74531E+02         1.73944E+02
+          4.43904E-03         2.61769E-02        -2.17670E-02         2.78818E-01         1.86407E+00         2.79666E-01         3.40931E+02         9.49098E-01         6.68449E+01         3.41868E+02         1.70929E+02         1.70939E+02
+          4.60887E-03         8.72665E-04        -3.08461E-04         2.89584E-01         2.74155E-01         2.89584E-01         1.53373E+04         9.69960E-01         1.97242E+03         1.41961E+04         1.12005E+04         2.99560E+03
+          4.60887E-03         1.04249E-03        -3.18679E-04         2.89584E-01         2.84826E-01         2.89584E-01         1.50349E+04         9.69960E-01         1.93859E+03         1.39200E+04         1.09900E+04         2.93000E+03
+          4.60887E-03         1.21232E-03        -3.30709E-04         2.89583E-01         2.95496E-01         2.89584E-01         1.47266E+04         9.69960E-01         1.90407E+03         1.36385E+04         1.07752E+04         2.86328E+03
+          4.60887E-03         1.38215E-03        -3.44551E-04         2.89583E-01         3.06167E-01         2.89584E-01         1.44127E+04         9.69960E-01         1.86888E+03         1.33520E+04         1.05565E+04         2.79558E+03
+          4.60887E-03         1.55197E-03        -3.60205E-04         2.89583E-01         3.16838E-01         2.89584E-01         1.40939E+04         9.69960E-01         1.83311E+03         1.30611E+04         1.03341E+04         2.72702E+03
+          4.60887E-03         1.72180E-03        -3.77672E-04         2.89583E-01         3.27508E-01         2.89584E-01         1.37707E+04         9.69959E-01         1.79680E+03         1.27661E+04         1.01084E+04         2.65775E+03
+          4.60887E-03         1.89163E-03        -3.96950E-04         2.89583E-01         3.38179E-01         2.89583E-01         1.34436E+04         9.69959E-01         1.76000E+03         1.24677E+04         9.87979E+03         2.58788E+03
+          4.60887E-03         2.06146E-03        -4.18041E-04         2.89583E-01         3.48849E-01         2.89583E-01         1.31131E+04         9.69959E-01         1.72279E+03         1.21662E+04         9.64865E+03         2.51755E+03
+          4.60887E-03         2.23128E-03        -4.40944E-04         2.89583E-01         3.59520E-01         2.89583E-01         1.27799E+04         9.69959E-01         1.68520E+03         1.18622E+04         9.41531E+03         2.44689E+03
+          4.60887E-03         2.40111E-03        -4.65658E-04         2.89583E-01         3.70190E-01         2.89583E-01         1.24443E+04         9.69959E-01         1.64731E+03         1.15562E+04         9.18014E+03         2.37602E+03
+          4.60887E-03         2.57094E-03        -4.92186E-04         2.89583E-01         3.80861E-01         2.89583E-01         1.21070E+04         9.69959E-01         1.60916E+03         1.12486E+04         8.94350E+03         2.30507E+03
+          4.60887E-03         2.74077E-03        -5.20525E-04         2.89583E-01         3.91532E-01         2.89583E-01         1.17685E+04         9.69959E-01         1.57081E+03         1.09399E+04         8.70572E+03         2.23416E+03
+          4.60887E-03         2.91059E-03        -5.50676E-04         2.89582E-01         4.02202E-01         2.89583E-01         1.14293E+04         9.69959E-01         1.53232E+03         1.06306E+04         8.46717E+03         2.16342E+03
+          4.60887E-03         3.08042E-03        -5.82640E-04         2.89582E-01         4.12873E-01         2.89583E-01         1.10899E+04         9.69958E-01         1.49374E+03         1.03211E+04         8.22819E+03         2.09295E+03
+          4.60887E-03         3.25025E-03        -6.16416E-04         2.89582E-01         4.23543E-01         2.89583E-01         1.07507E+04         9.69958E-01         1.45512E+03         1.00120E+04         7.98912E+03         2.02289E+03
+          4.60887E-03         3.42008E-03        -6.52003E-04         2.89582E-01         4.34214E-01         2.89583E-01         1.04124E+04         9.69958E-01         1.41653E+03         9.70362E+03         7.75028E+03         1.95334E+03
+          4.60887E-03         3.58990E-03        -6.89404E-04         2.89582E-01         4.44884E-01         2.89583E-01         1.00753E+04         9.69958E-01         1.37800E+03         9.39641E+03         7.51200E+03         1.88441E+03
+          4.60887E-03         3.75973E-03        -7.28616E-04         2.89582E-01         4.55555E-01         2.89583E-01         9.73996E+03         9.69958E-01         1.33958E+03         9.09081E+03         7.27461E+03         1.81621E+03
+          4.60887E-03         3.92956E-03        -7.69640E-04         2.89581E-01         4.66225E-01         2.89582E-01         9.40680E+03         9.69958E-01         1.30134E+03         8.78723E+03         7.03841E+03         1.74883E+03
+          4.60887E-03         4.09939E-03        -8.12477E-04         2.89581E-01         4.76896E-01         2.89582E-01         9.07627E+03         9.69957E-01         1.26331E+03         8.48607E+03         6.80370E+03         1.68237E+03
+          4.60887E-03         4.26921E-03        -8.57126E-04         2.89581E-01         4.87567E-01         2.89582E-01         8.74880E+03         9.69957E-01         1.22554E+03         8.18771E+03         6.57077E+03         1.61694E+03
+          4.60887E-03         4.43904E-03        -9.03587E-04         2.89581E-01         4.98237E-01         2.89582E-01         8.42479E+03         9.69957E-01         1.18808E+03         7.89251E+03         6.33991E+03         1.55260E+03
+          4.60887E-03         4.60887E-03        -9.51860E-04         2.89581E-01         5.08908E-01         2.89582E-01         8.10464E+03         9.69957E-01         1.15097E+03         7.60085E+03         6.11139E+03         1.48946E+03
+          4.60887E-03         4.77869E-03        -1.00195E-03         2.89580E-01         5.19578E-01         2.89582E-01         7.78873E+03         9.69957E-01         1.11424E+03         7.31305E+03         5.88547E+03         1.42758E+03
+          4.60887E-03         4.94852E-03        -1.05384E-03         2.89580E-01         5.30249E-01         2.89582E-01         7.47743E+03         9.69957E-01         1.07794E+03         7.02944E+03         5.66240E+03         1.36705E+03
+          4.60887E-03         5.11835E-03        -1.10755E-03         2.89580E-01         5.40919E-01         2.89582E-01         7.17106E+03         9.69957E-01         1.04211E+03         6.75033E+03         5.44241E+03         1.30792E+03
+          4.60887E-03         5.28818E-03        -1.16307E-03         2.89580E-01         5.51590E-01         2.89582E-01         6.86996E+03         9.69957E-01         1.00678E+03         6.47601E+03         5.22574E+03         1.25027E+03
+          4.60887E-03         5.45800E-03        -1.22041E-03         2.89579E-01         5.62261E-01         2.89582E-01         6.57443E+03         9.69957E-01         9.71983E+02         6.20674E+03         5.01259E+03         1.19415E+03
+          4.60887E-03         5.62783E-03        -1.27955E-03         2.89579E-01         5.72931E-01         2.89582E-01         6.28477E+03         9.69957E-01         9.37751E+02         5.94279E+03         4.80318E+03         1.13962E+03
+          4.60887E-03         5.79766E-03        -1.34051E-03         2.89579E-01         5.83602E-01         2.89582E-01         6.00122E+03         9.69957E-01         9.04114E+02         5.68439E+03         4.59768E+03         1.08672E+03
+          4.60887E-03         5.96749E-03        -1.40328E-03         2.89579E-01         5.94272E-01         2.89582E-01         5.72405E+03         9.69957E-01         8.71098E+02         5.43177E+03         4.39628E+03         1.03549E+03
+          4.60887E-03         6.13731E-03        -1.46787E-03         2.89578E-01         6.04943E-01         2.89582E-01         5.45348E+03         9.69957E-01         8.38730E+02         5.18511E+03         4.19913E+03         9.85974E+02
+          4.60887E-03         6.30714E-03        -1.53426E-03         2.89578E-01         6.15613E-01         2.89582E-01         5.18972E+03         9.69957E-01         8.07032E+02         4.94460E+03         4.00640E+03         9.38203E+02
+          4.60887E-03         6.47697E-03        -1.60247E-03         2.89578E-01         6.26284E-01         2.89582E-01         4.93295E+03         9.69957E-01         7.76025E+02         4.71041E+03         3.81821E+03         8.92201E+02
+          4.60887E-03         6.64680E-03        -1.67249E-03         2.89577E-01         6.36955E-01         2.89582E-01         4.68334E+03         9.69957E-01         7.45727E+02         4.48269E+03         3.63470E+03         8.47990E+02
+          4.60887E-03         6.81662E-03        -1.74432E-03         2.89577E-01         6.47625E-01         2.89582E-01         4.44103E+03         9.69957E-01         7.16155E+02         4.26155E+03         3.45596E+03         8.05587E+02
+          4.60887E-03         6.98645E-03        -1.81797E-03         2.89577E-01         6.58296E-01         2.89582E-01         4.20617E+03         9.69957E-01         6.87324E+02         4.04711E+03         3.28211E+03         7.65001E+02
+          4.60887E-03         7.15628E-03        -1.89342E-03         2.89576E-01         6.68966E-01         2.89582E-01         3.97884E+03         9.69958E-01         6.59245E+02         3.83946E+03         3.11322E+03         7.26239E+02
+          4.60887E-03         7.32611E-03        -1.97069E-03         2.89576E-01         6.79637E-01         2.89583E-01         3.75914E+03         9.69958E-01         6.31928E+02         3.63868E+03         2.94938E+03         6.89301E+02
+          4.60887E-03         7.49593E-03        -2.04977E-03         2.89576E-01         6.90307E-01         2.89583E-01         3.54714E+03         9.69958E-01         6.05382E+02         3.44482E+03         2.79063E+03         6.54184E+02
+          4.60887E-03         7.66576E-03        -2.13067E-03         2.89575E-01         7.00978E-01         2.89583E-01         3.34289E+03         9.69959E-01         5.79613E+02         3.25792E+03         2.63704E+03         6.20880E+02
+          4.60887E-03         7.83559E-03        -2.21337E-03         2.89575E-01         7.11649E-01         2.89583E-01         3.14642E+03         9.69959E-01         5.54625E+02         3.07800E+03         2.48862E+03         5.89375E+02
+          4.60887E-03         8.00542E-03        -2.29789E-03         2.89574E-01         7.22319E-01         2.89584E-01         2.95775E+03         9.69959E-01         5.30418E+02         2.90507E+03         2.34541E+03         5.59653E+02
+          4.60887E-03         8.17524E-03        -2.38422E-03         2.89574E-01         7.32990E-01         2.89584E-01         2.77686E+03         9.69960E-01         5.06995E+02         2.73912E+03         2.20743E+03         5.31692E+02
+          4.60887E-03         8.34507E-03        -2.47236E-03         2.89574E-01         7.43660E-01         2.89584E-01         2.60373E+03         9.69961E-01         4.84351E+02         2.58013E+03         2.07466E+03         5.05467E+02
+          4.60887E-03         8.51490E-03        -2.56232E-03         2.89573E-01         7.54331E-01         2.89585E-01         2.43834E+03         9.69961E-01         4.62485E+02         2.42806E+03         1.94711E+03         4.80949E+02
+          4.60887E-03         8.68473E-03        -2.65409E-03         2.89573E-01         7.65001E-01         2.89585E-01         2.28062E+03         9.69962E-01         4.41391E+02         2.28285E+03         1.82475E+03         4.58106E+02
+          4.60887E-03         8.85455E-03        -2.74767E-03         2.89572E-01         7.75672E-01         2.89585E-01         2.13051E+03         9.69963E-01         4.21061E+02         2.14444E+03         1.70754E+03         4.36902E+02
+          4.60887E-03         9.02438E-03        -2.84306E-03         2.89572E-01         7.86343E-01         2.89586E-01         1.98792E+03         9.69964E-01         4.01487E+02         2.01276E+03         1.59546E+03         4.17297E+02
+          4.60887E-03         9.19421E-03        -2.94026E-03         2.89571E-01         7.97013E-01         2.89586E-01         1.85276E+03         9.69965E-01         3.82660E+02         1.88770E+03         1.48845E+03         3.99251E+02
+          4.60887E-03         9.36403E-03        -3.03928E-03         2.89571E-01         8.07684E-01         2.89587E-01         1.72491E+03         9.69966E-01         3.64566E+02         1.76917E+03         1.38645E+03         3.82718E+02
+          4.60887E-03         9.53386E-03        -3.14011E-03         2.89571E-01         8.18354E-01         2.89588E-01         1.60425E+03         9.69967E-01         3.47195E+02         1.65705E+03         1.28940E+03         3.67651E+02
+          4.60887E-03         9.70369E-03        -3.24275E-03         2.89570E-01         8.29025E-01         2.89588E-01         1.49064E+03         9.69968E-01         3.30531E+02         1.55121E+03         1.19721E+03         3.54002E+02
+          4.60887E-03         9.87352E-03        -3.34720E-03         2.89570E-01         8.39695E-01         2.89589E-01         1.38395E+03         9.69969E-01         3.14561E+02         1.45153E+03         1.10981E+03         3.41718E+02
+          4.60887E-03         1.00433E-02        -3.45347E-03         2.89569E-01         8.50366E-01         2.89590E-01         1.28400E+03         9.69971E-01         2.99268E+02         1.35786E+03         1.02711E+03         3.30748E+02
+          4.60887E-03         1.02132E-02        -3.56155E-03         2.89569E-01         8.61037E-01         2.89590E-01         1.19065E+03         9.69972E-01         2.84635E+02         1.27005E+03         9.49013E+02         3.21036E+02
+          4.60887E-03         1.03830E-02        -3.67144E-03         2.89568E-01         8.71707E-01         2.89591E-01         1.10370E+03         9.69974E-01         2.70647E+02         1.18794E+03         8.75413E+02         3.12527E+02
+          4.60887E-03         1.05528E-02        -3.78314E-03         2.89568E-01         8.82378E-01         2.89592E-01         1.02298E+03         9.69975E-01         2.57284E+02         1.11137E+03         8.06203E+02         3.05163E+02
+          4.60887E-03         1.07227E-02        -3.89666E-03         2.89567E-01         8.93048E-01         2.89593E-01         9.48294E+02         9.69977E-01         2.44530E+02         1.04016E+03         7.41271E+02         2.98886E+02
+          4.60887E-03         1.08925E-02        -4.01199E-03         2.89567E-01         9.03719E-01         2.89594E-01         8.79451E+02         9.69979E-01         2.32365E+02         9.74138E+02         6.80498E+02         2.93639E+02
+          4.60887E-03         1.10623E-02        -4.12913E-03         2.89566E-01         9.14389E-01         2.89595E-01         8.16247E+02         9.69981E-01         2.20773E+02         9.13126E+02         6.23764E+02         2.89362E+02
+          4.60887E-03         1.12321E-02        -4.24808E-03         2.89565E-01         9.25060E-01         2.89597E-01         7.58474E+02         9.69983E-01         2.09734E+02         8.56938E+02         5.70942E+02         2.85996E+02
+          4.60887E-03         1.14020E-02        -4.36885E-03         2.89565E-01         9.35731E-01         2.89598E-01         7.05921E+02         9.69985E-01         1.99232E+02         8.05385E+02         5.21903E+02         2.83482E+02
+          4.60887E-03         1.15718E-02        -4.49143E-03         2.89564E-01         9.46401E-01         2.89599E-01         6.58373E+02         9.69988E-01         1.89249E+02         7.58277E+02         4.76517E+02         2.81760E+02
+          4.60887E-03         1.17416E-02        -4.61582E-03         2.89564E-01         9.57072E-01         2.89601E-01         6.15614E+02         9.69990E-01         1.79770E+02         7.15421E+02         4.34649E+02         2.80772E+02
+          4.60887E-03         1.19114E-02        -4.74202E-03         2.89563E-01         9.67742E-01         2.89602E-01         5.77423E+02         9.69993E-01         1.70778E+02         6.76624E+02         3.96164E+02         2.80460E+02
+          4.60887E-03         1.20813E-02        -4.87004E-03         2.89563E-01         9.78413E-01         2.89604E-01         5.43581E+02         9.69996E-01         1.62258E+02         6.41690E+02         3.60925E+02         2.80765E+02
+          4.60887E-03         1.22511E-02        -4.99986E-03         2.89562E-01         9.89083E-01         2.89605E-01         5.13867E+02         9.69999E-01         1.54199E+02         6.10427E+02         3.28794E+02         2.81633E+02
+          4.60887E-03         1.24209E-02        -5.13150E-03         2.89561E-01         9.99754E-01         2.89607E-01         4.88060E+02         9.70002E-01         1.46586E+02         5.82639E+02         2.99633E+02         2.83006E+02
+          4.60887E-03         1.25908E-02        -5.26496E-03         2.89561E-01         1.01042E+00         2.89609E-01         4.65941E+02         9.70005E-01         1.39410E+02         5.58134E+02         2.73304E+02         2.84830E+02
+          4.60887E-03         1.27606E-02        -5.40022E-03         2.89560E-01         1.02110E+00         2.89610E-01         4.47289E+02         9.70008E-01         1.32661E+02         5.36720E+02         2.49668E+02         2.87053E+02
+          4.60887E-03         1.29304E-02        -5.53730E-03         2.89559E-01         1.03177E+00         2.89612E-01         4.31890E+02         9.70012E-01         1.26330E+02         5.18210E+02         2.28588E+02         2.89622E+02
+          4.60887E-03         1.31002E-02        -5.67619E-03         2.89559E-01         1.04244E+00         2.89614E-01         4.19528E+02         9.70016E-01         1.20410E+02         5.02415E+02         2.09927E+02         2.92488E+02
+          4.60887E-03         1.32701E-02        -5.81690E-03         2.89558E-01         1.05311E+00         2.89617E-01         4.09994E+02         9.70020E-01         1.14897E+02         4.89152E+02         1.93551E+02         2.95602E+02
+          4.60887E-03         1.34399E-02        -5.95941E-03         2.89558E-01         1.06378E+00         2.89619E-01         4.03078E+02         9.70024E-01         1.09785E+02         4.78242E+02         1.79325E+02         2.98917E+02
+          4.60887E-03         1.36097E-02        -6.10374E-03         2.89557E-01         1.07445E+00         2.89621E-01         3.98578E+02         9.70028E-01         1.05072E+02         4.69507E+02         1.67119E+02         3.02388E+02
+          4.60887E-03         1.37795E-02        -6.24988E-03         2.89556E-01         1.08512E+00         2.89624E-01         3.96294E+02         9.70032E-01         1.00754E+02         4.62777E+02         1.56803E+02         3.05973E+02
+          4.60887E-03         1.39494E-02        -6.39784E-03         2.89556E-01         1.09579E+00         2.89626E-01         3.96032E+02         9.70037E-01         9.68289E+01         4.57882E+02         1.48250E+02         3.09631E+02
+          4.60887E-03         1.41192E-02        -6.54761E-03         2.89555E-01         1.10646E+00         2.89629E-01         3.97604E+02         9.70042E-01         9.32937E+01         4.54660E+02         1.41337E+02         3.13323E+02
+          4.60887E-03         1.42890E-02        -6.69919E-03         2.89554E-01         1.11713E+00         2.89632E-01         4.00825E+02         9.70047E-01         9.01448E+01         4.52954E+02         1.35943E+02         3.17012E+02
+          4.60887E-03         1.44589E-02        -6.85258E-03         2.89553E-01         1.12780E+00         2.89634E-01         4.05518E+02         9.70052E-01         8.73773E+01         4.52612E+02         1.31948E+02         3.20663E+02
+          4.60887E-03         1.46287E-02        -7.00778E-03         2.89553E-01         1.13847E+00         2.89637E-01         4.11512E+02         9.70057E-01         8.49844E+01         4.53486E+02         1.29241E+02         3.24245E+02
+          4.60887E-03         1.47985E-02        -7.16480E-03         2.89552E-01         1.14914E+00         2.89641E-01         4.18641E+02         9.70063E-01         8.29571E+01         4.55435E+02         1.27708E+02         3.27726E+02
+          4.60887E-03         1.49683E-02        -7.32363E-03         2.89551E-01         1.15981E+00         2.89644E-01         4.26748E+02         9.70069E-01         8.12834E+01         4.58324E+02         1.27244E+02         3.31080E+02
+          4.60887E-03         1.51382E-02        -7.48428E-03         2.89551E-01         1.17048E+00         2.89647E-01         4.35680E+02         9.70075E-01         7.99486E+01         4.62024E+02         1.27744E+02         3.34280E+02
+          4.60887E-03         1.53080E-02        -7.64673E-03         2.89550E-01         1.18115E+00         2.89651E-01         4.45293E+02         9.70081E-01         7.89353E+01         4.66413E+02         1.29111E+02         3.37302E+02
+          4.60887E-03         1.54778E-02        -7.81100E-03         2.89549E-01         1.19182E+00         2.89654E-01         4.55449E+02         9.70088E-01         7.82229E+01         4.71372E+02         1.31247E+02         3.40126E+02
+          4.60887E-03         1.56476E-02        -7.97708E-03         2.89548E-01         1.20249E+00         2.89658E-01         4.66018E+02         9.70095E-01         7.77888E+01         4.76793E+02         1.34062E+02         3.42731E+02
+          4.60887E-03         1.58175E-02        -8.14498E-03         2.89547E-01         1.21317E+00         2.89662E-01         4.76876E+02         9.70102E-01         7.76084E+01         4.82571E+02         1.37469E+02         3.45102E+02
+          4.60887E-03         1.59873E-02        -8.31468E-03         2.89547E-01         1.22384E+00         2.89666E-01         4.87909E+02         9.70109E-01         7.76559E+01         4.88607E+02         1.41384E+02         3.47222E+02
+          4.60887E-03         1.61571E-02        -8.48620E-03         2.89546E-01         1.23451E+00         2.89670E-01         4.99006E+02         9.70117E-01         7.79049E+01         4.94810E+02         1.45731E+02         3.49080E+02
+          4.60887E-03         1.63270E-02        -8.65954E-03         2.89545E-01         1.24518E+00         2.89675E-01         5.10068E+02         9.70124E-01         7.83289E+01         5.01096E+02         1.50433E+02         3.50663E+02
+          4.60887E-03         1.64968E-02        -8.83468E-03         2.89544E-01         1.25585E+00         2.89679E-01         5.20999E+02         9.70133E-01         7.89022E+01         5.07384E+02         1.55421E+02         3.51964E+02
+          4.60887E-03         1.66666E-02        -9.01164E-03         2.89543E-01         1.26652E+00         2.89684E-01         5.31713E+02         9.70141E-01         7.95996E+01         5.13603E+02         1.60628E+02         3.52974E+02
+          4.60887E-03         1.68364E-02        -9.19041E-03         2.89543E-01         1.27719E+00         2.89688E-01         5.42129E+02         9.70150E-01         8.03976E+01         5.19684E+02         1.65994E+02         3.53689E+02
+          4.60887E-03         1.70063E-02        -9.37100E-03         2.89542E-01         1.28786E+00         2.89693E-01         5.52176E+02         9.70159E-01         8.12741E+01         5.25567E+02         1.71461E+02         3.54106E+02
+          4.60887E-03         1.71761E-02        -9.55339E-03         2.89541E-01         1.29853E+00         2.89699E-01         5.61787E+02         9.70168E-01         8.22085E+01         5.31196E+02         1.76975E+02         3.54221E+02
+          4.60887E-03         1.73459E-02        -9.73760E-03         2.89540E-01         1.30920E+00         2.89704E-01         5.70903E+02         9.70177E-01         8.31823E+01         5.36523E+02         1.82487E+02         3.54036E+02
+          4.60887E-03         1.75158E-02        -9.92363E-03         2.89539E-01         1.31987E+00         2.89709E-01         5.79472E+02         9.70187E-01         8.41783E+01         5.41502E+02         1.87951E+02         3.53551E+02
+          4.60887E-03         1.76856E-02        -1.01115E-02         2.89538E-01         1.33054E+00         2.89715E-01         5.87446E+02         9.70197E-01         8.51814E+01         5.46094E+02         1.93325E+02         3.52769E+02
+          4.60887E-03         1.78554E-02        -1.03011E-02         2.89538E-01         1.34121E+00         2.89721E-01         5.94785E+02         9.70208E-01         8.61779E+01         5.50266E+02         1.98573E+02         3.51693E+02
+          4.60887E-03         1.80252E-02        -1.04926E-02         2.89537E-01         1.35188E+00         2.89727E-01         6.01456E+02         9.70219E-01         8.71555E+01         5.53990E+02         2.03659E+02         3.50330E+02
+          4.60887E-03         1.81951E-02        -1.06859E-02         2.89536E-01         1.36255E+00         2.89733E-01         6.07431E+02         9.70230E-01         8.81038E+01         5.57240E+02         2.08554E+02         3.48686E+02
+          4.60887E-03         1.83649E-02        -1.08809E-02         2.89535E-01         1.37322E+00         2.89739E-01         6.12685E+02         9.70241E-01         8.90131E+01         5.59997E+02         2.13229E+02         3.46768E+02
+          4.60887E-03         1.85347E-02        -1.10778E-02         2.89534E-01         1.38389E+00         2.89746E-01         6.17202E+02         9.70253E-01         8.98755E+01         5.62246E+02         2.17661E+02         3.44585E+02
+          4.60887E-03         1.87045E-02        -1.12766E-02         2.89533E-01         1.39457E+00         2.89753E-01         6.20969E+02         9.70266E-01         9.06839E+01         5.63975E+02         2.21829E+02         3.42147E+02
+          4.60887E-03         1.88744E-02        -1.14771E-02         2.89532E-01         1.40524E+00         2.89759E-01         6.23979E+02         9.70278E-01         9.14321E+01         5.65177E+02         2.25715E+02         3.39462E+02
+          4.60887E-03         1.90442E-02        -1.16794E-02         2.89531E-01         1.41591E+00         2.89767E-01         6.26227E+02         9.70291E-01         9.21152E+01         5.65849E+02         2.29305E+02         3.36543E+02
+          4.60887E-03         1.92140E-02        -1.18836E-02         2.89530E-01         1.42658E+00         2.89774E-01         6.27716E+02         9.70304E-01         9.27288E+01         5.65989E+02         2.32587E+02         3.33402E+02
+          4.60887E-03         1.93839E-02        -1.20895E-02         2.89529E-01         1.43725E+00         2.89782E-01         6.28449E+02         9.70318E-01         9.32695E+01         5.65600E+02         2.35551E+02         3.30050E+02
+          4.60887E-03         1.95537E-02        -1.22973E-02         2.89528E-01         1.44792E+00         2.89789E-01         6.28437E+02         9.70332E-01         9.37343E+01         5.64689E+02         2.38189E+02         3.26499E+02
+          4.60887E-03         1.97235E-02        -1.25069E-02         2.89527E-01         1.45859E+00         2.89797E-01         6.27691E+02         9.70346E-01         9.41211E+01         5.63263E+02         2.40499E+02         3.22764E+02
+          4.60887E-03         1.98933E-02        -1.27183E-02         2.89526E-01         1.46926E+00         2.89806E-01         6.26227E+02         9.70361E-01         9.44283E+01         5.61333E+02         2.42476E+02         3.18857E+02
+          4.60887E-03         2.00632E-02        -1.29315E-02         2.89525E-01         1.47993E+00         2.89814E-01         6.24063E+02         9.70376E-01         9.46548E+01         5.58913E+02         2.44121E+02         3.14792E+02
+          4.60887E-03         2.02330E-02        -1.31466E-02         2.89524E-01         1.49060E+00         2.89823E-01         6.21220E+02         9.70392E-01         9.47998E+01         5.56018E+02         2.45435E+02         3.10583E+02
+          4.60887E-03         2.04028E-02        -1.33634E-02         2.89523E-01         1.50127E+00         2.89832E-01         6.17722E+02         9.70408E-01         9.48632E+01         5.52664E+02         2.46421E+02         3.06243E+02
+          4.60887E-03         2.05726E-02        -1.35821E-02         2.89522E-01         1.51194E+00         2.89841E-01         6.13595E+02         9.70425E-01         9.48450E+01         5.48871E+02         2.47085E+02         3.01787E+02
+          4.60887E-03         2.07425E-02        -1.38026E-02         2.89521E-01         1.52261E+00         2.89850E-01         6.08866E+02         9.70442E-01         9.47458E+01         5.44659E+02         2.47431E+02         2.97228E+02
+          4.60887E-03         2.09123E-02        -1.40248E-02         2.89520E-01         1.53328E+00         2.89860E-01         6.03565E+02         9.70459E-01         9.45662E+01         5.40048E+02         2.47469E+02         2.92579E+02
+          4.60887E-03         2.10821E-02        -1.42489E-02         2.89519E-01         1.54395E+00         2.89870E-01         5.97722E+02         9.70477E-01         9.43074E+01         5.35061E+02         2.47206E+02         2.87855E+02
+          4.60887E-03         2.12520E-02        -1.44749E-02         2.89518E-01         1.55462E+00         2.89880E-01         5.91369E+02         9.70495E-01         9.39707E+01         5.29722E+02         2.46653E+02         2.83069E+02
+          4.60887E-03         2.14218E-02        -1.47026E-02         2.89517E-01         1.56529E+00         2.89890E-01         5.84539E+02         9.70514E-01         9.35574E+01         5.24053E+02         2.45820E+02         2.78233E+02
+          4.60887E-03         2.15916E-02        -1.49321E-02         2.89516E-01         1.57596E+00         2.89901E-01         5.77266E+02         9.70533E-01         9.30694E+01         5.18080E+02         2.44719E+02         2.73361E+02
+          4.60887E-03         2.17614E-02        -1.51635E-02         2.89515E-01         1.58664E+00         2.89912E-01         5.69585E+02         9.70553E-01         9.25084E+01         5.11828E+02         2.43362E+02         2.68465E+02
+          4.60887E-03         2.19313E-02        -1.53966E-02         2.89514E-01         1.59731E+00         2.89923E-01         5.61529E+02         9.70573E-01         9.18764E+01         5.05320E+02         2.41763E+02         2.63557E+02
+          4.60887E-03         2.21011E-02        -1.56316E-02         2.89513E-01         1.60798E+00         2.89935E-01         5.53133E+02         9.70593E-01         9.11757E+01         4.98582E+02         2.39935E+02         2.58648E+02
+          4.60887E-03         2.22709E-02        -1.58684E-02         2.89512E-01         1.61865E+00         2.89946E-01         5.44433E+02         9.70615E-01         9.04083E+01         4.91640E+02         2.37891E+02         2.53749E+02
+          4.60887E-03         2.24407E-02        -1.61070E-02         2.89511E-01         1.62932E+00         2.89958E-01         5.35462E+02         9.70636E-01         8.95767E+01         4.84517E+02         2.35645E+02         2.48871E+02
+          4.60887E-03         2.26106E-02        -1.63474E-02         2.89510E-01         1.63999E+00         2.89971E-01         5.26256E+02         9.70658E-01         8.86832E+01         4.77238E+02         2.33213E+02         2.44025E+02
+          4.60887E-03         2.27804E-02        -1.65897E-02         2.89509E-01         1.65066E+00         2.89983E-01         5.16848E+02         9.70681E-01         8.77303E+01         4.69827E+02         2.30608E+02         2.39219E+02
+          4.60887E-03         2.29502E-02        -1.68337E-02         2.89507E-01         1.66133E+00         2.89996E-01         5.07271E+02         9.70704E-01         8.67205E+01         4.62307E+02         2.27844E+02         2.34462E+02
+          4.60887E-03         2.31201E-02        -1.70796E-02         2.89506E-01         1.67200E+00         2.90010E-01         4.97558E+02         9.70728E-01         8.56564E+01         4.54701E+02         2.24937E+02         2.29764E+02
+          4.60887E-03         2.32899E-02        -1.73273E-02         2.89505E-01         1.68267E+00         2.90023E-01         4.87740E+02         9.70752E-01         8.45404E+01         4.47031E+02         2.21899E+02         2.25132E+02
+          4.60887E-03         2.34597E-02        -1.75767E-02         2.89504E-01         1.69334E+00         2.90037E-01         4.77848E+02         9.70777E-01         8.33752E+01         4.39319E+02         2.18747E+02         2.20572E+02
+          4.60887E-03         2.36295E-02        -1.78280E-02         2.89503E-01         1.70401E+00         2.90051E-01         4.67912E+02         9.70802E-01         8.21634E+01         4.31585E+02         2.15492E+02         2.16093E+02
+          4.60887E-03         2.37994E-02        -1.80812E-02         2.89502E-01         1.71468E+00         2.90066E-01         4.57960E+02         9.70828E-01         8.09076E+01         4.23848E+02         2.12149E+02         2.11699E+02
+          4.60887E-03         2.39692E-02        -1.83361E-02         2.89500E-01         1.72535E+00         2.90081E-01         4.48019E+02         9.70855E-01         7.96103E+01         4.16128E+02         2.08731E+02         2.07396E+02
+          4.60887E-03         2.41390E-02        -1.85928E-02         2.89499E-01         1.73602E+00         2.90096E-01         4.38116E+02         9.70882E-01         7.82741E+01         4.08441E+02         2.05251E+02         2.03190E+02
+          4.60887E-03         2.43088E-02        -1.88514E-02         2.89498E-01         1.74669E+00         2.90111E-01         4.28275E+02         9.70910E-01         7.69015E+01         4.00806E+02         2.01721E+02         1.99085E+02
+          4.60887E-03         2.44787E-02        -1.91118E-02         2.89497E-01         1.75736E+00         2.90127E-01         4.18519E+02         9.70938E-01         7.54951E+01         3.93236E+02         1.98153E+02         1.95084E+02
+          4.60887E-03         2.46485E-02        -1.93739E-02         2.89496E-01         1.76804E+00         2.90143E-01         4.08871E+02         9.70967E-01         7.40574E+01         3.85748E+02         1.94558E+02         1.91190E+02
+          4.60887E-03         2.48183E-02        -1.96379E-02         2.89494E-01         1.77871E+00         2.90160E-01         3.99351E+02         9.70996E-01         7.25907E+01         3.78355E+02         1.90948E+02         1.87407E+02
+          4.60887E-03         2.49882E-02        -1.99037E-02         2.89493E-01         1.78938E+00         2.90177E-01         3.89978E+02         9.71026E-01         7.10975E+01         3.71068E+02         1.87332E+02         1.83737E+02
+          4.60887E-03         2.51580E-02        -2.01714E-02         2.89492E-01         1.80005E+00         2.90194E-01         3.80769E+02         9.71057E-01         6.95802E+01         3.63901E+02         1.83721E+02         1.80180E+02
+          4.60887E-03         2.53278E-02        -2.04408E-02         2.89491E-01         1.81072E+00         2.90212E-01         3.71740E+02         9.71089E-01         6.80411E+01         3.56862E+02         1.80123E+02         1.76739E+02
+          4.60887E-03         2.54976E-02        -2.07121E-02         2.89490E-01         1.82139E+00         2.90230E-01         3.62907E+02         9.71121E-01         6.64823E+01         3.49962E+02         1.76548E+02         1.73414E+02
+          4.60887E-03         2.56675E-02        -2.09851E-02         2.89488E-01         1.83206E+00         2.90248E-01         3.54282E+02         9.71153E-01         6.49063E+01         3.43209E+02         1.73003E+02         1.70205E+02
+          4.60887E-03         2.58373E-02        -2.12600E-02         2.89487E-01         1.84273E+00         2.90267E-01         3.45878E+02         9.71187E-01         6.33151E+01         3.36609E+02         1.69496E+02         1.67113E+02
+          4.60887E-03         2.60071E-02        -2.15367E-02         2.89486E-01         1.85340E+00         2.90286E-01         3.37703E+02         9.71221E-01         6.17108E+01         3.30171E+02         1.66035E+02         1.64136E+02
+          4.60887E-03         2.61769E-02        -2.18152E-02         2.89484E-01         1.86407E+00         2.90305E-01         3.29768E+02         9.71255E-01         6.00955E+01         3.23898E+02         1.62624E+02         1.61274E+02
+          4.77869E-03         8.72665E-04        -3.58547E-04         3.00254E-01         2.74155E-01         3.00254E-01         1.41968E+04         9.86331E-01         1.64461E+03         1.32312E+04         1.05440E+04         2.68723E+03
+          4.77869E-03         1.04249E-03        -3.68765E-04         3.00254E-01         2.84826E-01         3.00254E-01         1.39220E+04         9.86331E-01         1.61673E+03         1.29767E+04         1.03470E+04         2.62965E+03
+          4.77869E-03         1.21232E-03        -3.80795E-04         3.00254E-01         2.95496E-01         3.00254E-01         1.36417E+04         9.86331E-01         1.58827E+03         1.27170E+04         1.01460E+04         2.57107E+03
+          4.77869E-03         1.38215E-03        -3.94637E-04         3.00254E-01         3.06167E-01         3.00254E-01         1.33563E+04         9.86331E-01         1.55927E+03         1.24527E+04         9.94115E+03         2.51160E+03
+          4.77869E-03         1.55197E-03        -4.10291E-04         3.00254E-01         3.16838E-01         3.00254E-01         1.30663E+04         9.86331E-01         1.52978E+03         1.21843E+04         9.73291E+03         2.45136E+03
+          4.77869E-03         1.72180E-03        -4.27757E-04         3.00254E-01         3.27508E-01         3.00254E-01         1.27722E+04         9.86330E-01         1.49984E+03         1.19121E+04         9.52159E+03         2.39046E+03
+          4.77869E-03         1.89163E-03        -4.47036E-04         3.00254E-01         3.38179E-01         3.00254E-01         1.24745E+04         9.86330E-01         1.46950E+03         1.16365E+04         9.30751E+03         2.32902E+03
+          4.77869E-03         2.06146E-03        -4.68126E-04         3.00254E-01         3.48849E-01         3.00254E-01         1.21736E+04         9.86330E-01         1.43881E+03         1.13582E+04         9.09102E+03         2.26715E+03
+          4.77869E-03         2.23128E-03        -4.91029E-04         3.00254E-01         3.59520E-01         3.00254E-01         1.18700E+04         9.86330E-01         1.40781E+03         1.10774E+04         8.87245E+03         2.20496E+03
+          4.77869E-03         2.40111E-03        -5.15744E-04         3.00253E-01         3.70190E-01         3.00254E-01         1.15643E+04         9.86330E-01         1.37655E+03         1.07947E+04         8.65213E+03         2.14255E+03
+          4.77869E-03         2.57094E-03        -5.42271E-04         3.00253E-01         3.80861E-01         3.00254E-01         1.12568E+04         9.86330E-01         1.34508E+03         1.05104E+04         8.43040E+03         2.08005E+03
+          4.77869E-03         2.74077E-03        -5.70611E-04         3.00253E-01         3.91532E-01         3.00254E-01         1.09481E+04         9.86330E-01         1.31344E+03         1.02251E+04         8.20758E+03         2.01755E+03
+          4.77869E-03         2.91059E-03        -6.00762E-04         3.00253E-01         4.02202E-01         3.00254E-01         1.06387E+04         9.86330E-01         1.28168E+03         9.93917E+03         7.98400E+03         1.95517E+03
+          4.77869E-03         3.08042E-03        -6.32725E-04         3.00253E-01         4.12873E-01         3.00253E-01         1.03289E+04         9.86330E-01         1.24983E+03         9.65299E+03         7.75998E+03         1.89301E+03
+          4.77869E-03         3.25025E-03        -6.66501E-04         3.00253E-01         4.23543E-01         3.00253E-01         1.00192E+04         9.86330E-01         1.21796E+03         9.36700E+03         7.53584E+03         1.83116E+03
+          4.77869E-03         3.42008E-03        -7.02089E-04         3.00252E-01         4.34214E-01         3.00253E-01         9.71011E+03         9.86329E-01         1.18609E+03         9.08162E+03         7.31189E+03         1.76973E+03
+          4.77869E-03         3.58990E-03        -7.39489E-04         3.00252E-01         4.44884E-01         3.00253E-01         9.40203E+03         9.86329E-01         1.15428E+03         8.79724E+03         7.08843E+03         1.70881E+03
+          4.77869E-03         3.75973E-03        -7.78701E-04         3.00252E-01         4.55555E-01         3.00253E-01         9.09537E+03         9.86329E-01         1.12255E+03         8.51425E+03         6.86576E+03         1.64849E+03
+          4.77869E-03         3.92956E-03        -8.19726E-04         3.00252E-01         4.66225E-01         3.00253E-01         8.79056E+03         9.86329E-01         1.09096E+03         8.23304E+03         6.64417E+03         1.58887E+03
+          4.77869E-03         4.09939E-03        -8.62562E-04         3.00252E-01         4.76896E-01         3.00253E-01         8.48799E+03         9.86329E-01         1.05955E+03         7.95397E+03         6.42394E+03         1.53003E+03
+          4.77869E-03         4.26921E-03        -9.07211E-04         3.00252E-01         4.87567E-01         3.00253E-01         8.18804E+03         9.86329E-01         1.02834E+03         7.67739E+03         6.20534E+03         1.47204E+03
+          4.77869E-03         4.43904E-03        -9.53672E-04         3.00251E-01         4.98237E-01         3.00253E-01         7.89110E+03         9.86329E-01         9.97375E+02         7.40365E+03         5.98865E+03         1.41500E+03
+          4.77869E-03         4.60887E-03        -1.00195E-03         3.00251E-01         5.08908E-01         3.00253E-01         7.59752E+03         9.86329E-01         9.66694E+02         7.13307E+03         5.77410E+03         1.35897E+03
+          4.77869E-03         4.77869E-03        -1.05203E-03         3.00251E-01         5.19578E-01         3.00253E-01         7.30764E+03         9.86329E-01         9.36328E+02         6.86598E+03         5.56195E+03         1.30402E+03
+          4.77869E-03         4.94852E-03        -1.10393E-03         3.00251E-01         5.30249E-01         3.00253E-01         7.02180E+03         9.86329E-01         9.06309E+02         6.60266E+03         5.35244E+03         1.25022E+03
+          4.77869E-03         5.11835E-03        -1.15764E-03         3.00250E-01         5.40919E-01         3.00253E-01         6.74031E+03         9.86328E-01         8.76669E+02         6.34341E+03         5.14577E+03         1.19763E+03
+          4.77869E-03         5.28818E-03        -1.21316E-03         3.00250E-01         5.51590E-01         3.00253E-01         6.46346E+03         9.86328E-01         8.47436E+02         6.08849E+03         4.94218E+03         1.14631E+03
+          4.77869E-03         5.45800E-03        -1.27049E-03         3.00250E-01         5.62261E-01         3.00252E-01         6.19154E+03         9.86328E-01         8.18638E+02         5.83817E+03         4.74186E+03         1.09631E+03
+          4.77869E-03         5.62783E-03        -1.32964E-03         3.00250E-01         5.72931E-01         3.00252E-01         5.92480E+03         9.86328E-01         7.90300E+02         5.59267E+03         4.54499E+03         1.04767E+03
+          4.77869E-03         5.79766E-03        -1.39060E-03         3.00249E-01         5.83602E-01         3.00252E-01         5.66350E+03         9.86328E-01         7.62448E+02         5.35221E+03         4.35177E+03         1.00045E+03
+          4.77869E-03         5.96749E-03        -1.45337E-03         3.00249E-01         5.94272E-01         3.00252E-01         5.40787E+03         9.86328E-01         7.35103E+02         5.11701E+03         4.16234E+03         9.54668E+02
+          4.77869E-03         6.13731E-03        -1.51795E-03         3.00249E-01         6.04943E-01         3.00252E-01         5.15811E+03         9.86328E-01         7.08286E+02         4.88725E+03         3.97688E+03         9.10373E+02
+          4.77869E-03         6.30714E-03        -1.58435E-03         3.00248E-01         6.15613E-01         3.00252E-01         4.91442E+03         9.86328E-01         6.82017E+02         4.66311E+03         3.79552E+03         8.67591E+02
+          4.77869E-03         6.47697E-03        -1.65255E-03         3.00248E-01         6.26284E-01         3.00253E-01         4.67697E+03         9.86328E-01         6.56313E+02         4.44473E+03         3.61838E+03         8.26345E+02
+          4.77869E-03         6.64680E-03        -1.72257E-03         3.00248E-01         6.36955E-01         3.00253E-01         4.44593E+03         9.86329E-01         6.31188E+02         4.23226E+03         3.44560E+03         7.86658E+02
+          4.77869E-03         6.81662E-03        -1.79441E-03         3.00247E-01         6.47625E-01         3.00253E-01         4.22142E+03         9.86329E-01         6.06658E+02         4.02581E+03         3.27727E+03         7.48544E+02
+          4.77869E-03         6.98645E-03        -1.86805E-03         3.00247E-01         6.58296E-01         3.00253E-01         4.00358E+03         9.86329E-01         5.82733E+02         3.82550E+03         3.11349E+03         7.12015E+02
+          4.77869E-03         7.15628E-03        -1.94351E-03         3.00247E-01         6.68966E-01         3.00253E-01         3.79251E+03         9.86329E-01         5.59424E+02         3.63141E+03         2.95434E+03         6.77077E+02
+          4.77869E-03         7.32611E-03        -2.02078E-03         3.00246E-01         6.79637E-01         3.00253E-01         3.58829E+03         9.86329E-01         5.36740E+02         3.44362E+03         2.79989E+03         6.43735E+02
+          4.77869E-03         7.49593E-03        -2.09986E-03         3.00246E-01         6.90307E-01         3.00253E-01         3.39099E+03         9.86329E-01         5.14688E+02         3.26218E+03         2.65019E+03         6.11986E+02
+          4.77869E-03         7.66576E-03        -2.18075E-03         3.00245E-01         7.00978E-01         3.00253E-01         3.20067E+03         9.86330E-01         4.93272E+02         3.08713E+03         2.50531E+03         5.81825E+02
+          4.77869E-03         7.83559E-03        -2.26346E-03         3.00245E-01         7.11649E-01         3.00254E-01         3.01736E+03         9.86330E-01         4.72495E+02         2.91851E+03         2.36526E+03         5.53243E+02
+          4.77869E-03         8.00542E-03        -2.34797E-03         3.00245E-01         7.22319E-01         3.00254E-01         2.84109E+03         9.86330E-01         4.52361E+02         2.75631E+03         2.23008E+03         5.26227E+02
+          4.77869E-03         8.17524E-03        -2.43430E-03         3.00244E-01         7.32990E-01         3.00254E-01         2.67185E+03         9.86330E-01         4.32868E+02         2.60054E+03         2.09978E+03         5.00760E+02
+          4.77869E-03         8.34507E-03        -2.52245E-03         3.00244E-01         7.43660E-01         3.00254E-01         2.50964E+03         9.86331E-01         4.14016E+02         2.45119E+03         1.97437E+03         4.76822E+02
+          4.77869E-03         8.51490E-03        -2.61240E-03         3.00243E-01         7.54331E-01         3.00255E-01         2.35443E+03         9.86331E-01         3.95803E+02         2.30821E+03         1.85382E+03         4.54390E+02
+          4.77869E-03         8.68473E-03        -2.70417E-03         3.00243E-01         7.65001E-01         3.00255E-01         2.20618E+03         9.86332E-01         3.78222E+02         2.17157E+03         1.73814E+03         4.33436E+02
+          4.77869E-03         8.85455E-03        -2.79775E-03         3.00242E-01         7.75672E-01         3.00256E-01         2.06483E+03         9.86332E-01         3.61271E+02         2.04122E+03         1.62728E+03         4.13932E+02
+          4.77869E-03         9.02438E-03        -2.89314E-03         3.00242E-01         7.86343E-01         3.00256E-01         1.93033E+03         9.86333E-01         3.44940E+02         1.91707E+03         1.52123E+03         3.95845E+02
+          4.77869E-03         9.19421E-03        -2.99035E-03         3.00242E-01         7.97013E-01         3.00256E-01         1.80257E+03         9.86333E-01         3.29223E+02         1.79906E+03         1.41992E+03         3.79141E+02
+          4.77869E-03         9.36403E-03        -3.08936E-03         3.00241E-01         8.07684E-01         3.00257E-01         1.68148E+03         9.86334E-01         3.14110E+02         1.68709E+03         1.32331E+03         3.63780E+02
+          4.77869E-03         9.53386E-03        -3.19019E-03         3.00241E-01         8.18354E-01         3.00258E-01         1.56695E+03         9.86335E-01         2.99592E+02         1.58106E+03         1.23134E+03         3.49725E+02
+          4.77869E-03         9.70369E-03        -3.29283E-03         3.00240E-01         8.29025E-01         3.00258E-01         1.45887E+03         9.86336E-01         2.85657E+02         1.48087E+03         1.14394E+03         3.36933E+02
+          4.77869E-03         9.87352E-03        -3.39729E-03         3.00240E-01         8.39695E-01         3.00259E-01         1.35711E+03         9.86336E-01         2.72293E+02         1.38639E+03         1.06103E+03         3.25361E+02
+          4.77869E-03         1.00433E-02        -3.50355E-03         3.00239E-01         8.50366E-01         3.00260E-01         1.26153E+03         9.86337E-01         2.59487E+02         1.29749E+03         9.82527E+02         3.14964E+02
+          4.77869E-03         1.02132E-02        -3.61163E-03         3.00239E-01         8.61037E-01         3.00260E-01         1.17199E+03         9.86338E-01         2.47227E+02         1.21404E+03         9.08351E+02         3.05694E+02
+          4.77869E-03         1.03830E-02        -3.72152E-03         3.00238E-01         8.71707E-01         3.00261E-01         1.08834E+03         9.86339E-01         2.35499E+02         1.13591E+03         8.38403E+02         2.97504E+02
+          4.77869E-03         1.05528E-02        -3.83323E-03         3.00238E-01         8.82378E-01         3.00262E-01         1.01043E+03         9.86340E-01         2.24288E+02         1.06293E+03         7.72584E+02         2.90346E+02
+          4.77869E-03         1.07227E-02        -3.94674E-03         3.00237E-01         8.93048E-01         3.00263E-01         9.38076E+02         9.86342E-01         2.13580E+02         9.94958E+02         7.10789E+02         2.84169E+02
+          4.77869E-03         1.08925E-02        -4.06207E-03         3.00236E-01         9.03719E-01         3.00264E-01         8.71117E+02         9.86343E-01         2.03361E+02         9.31832E+02         6.52910E+02         2.78922E+02
+          4.77869E-03         1.10623E-02        -4.17921E-03         3.00236E-01         9.14389E-01         3.00265E-01         8.09373E+02         9.86344E-01         1.93616E+02         8.73388E+02         5.98833E+02         2.74555E+02
+          4.77869E-03         1.12321E-02        -4.29816E-03         3.00235E-01         9.25060E-01         3.00266E-01         7.52663E+02         9.86346E-01         1.84331E+02         8.19459E+02         5.48443E+02         2.71016E+02
+          4.77869E-03         1.14020E-02        -4.41893E-03         3.00235E-01         9.35731E-01         3.00267E-01         7.00799E+02         9.86347E-01         1.75492E+02         7.69874E+02         5.01620E+02         2.68254E+02
+          4.77869E-03         1.15718E-02        -4.54151E-03         3.00234E-01         9.46401E-01         3.00268E-01         6.53592E+02         9.86349E-01         1.67085E+02         7.24459E+02         4.58242E+02         2.66217E+02
+          4.77869E-03         1.17416E-02        -4.66590E-03         3.00234E-01         9.57072E-01         3.00270E-01         6.10850E+02         9.86350E-01         1.59097E+02         6.83038E+02         4.18184E+02         2.64854E+02
+          4.77869E-03         1.19114E-02        -4.79210E-03         3.00233E-01         9.67742E-01         3.00271E-01         5.72378E+02         9.86352E-01         1.51516E+02         6.45436E+02         3.81322E+02         2.64114E+02
+          4.77869E-03         1.20813E-02        -4.92012E-03         3.00232E-01         9.78413E-01         3.00273E-01         5.37980E+02         9.86354E-01         1.44330E+02         6.11473E+02         3.47526E+02         2.63947E+02
+          4.77869E-03         1.22511E-02        -5.04995E-03         3.00232E-01         9.89083E-01         3.00274E-01         5.07459E+02         9.86356E-01         1.37527E+02         5.80973E+02         3.16670E+02         2.64302E+02
+          4.77869E-03         1.24209E-02        -5.18159E-03         3.00231E-01         9.99754E-01         3.00276E-01         4.80618E+02         9.86358E-01         1.31098E+02         5.53757E+02         2.88625E+02         2.65132E+02
+          4.77869E-03         1.25908E-02        -5.31504E-03         3.00230E-01         1.01042E+00         3.00277E-01         4.57261E+02         9.86360E-01         1.25034E+02         5.29647E+02         2.63260E+02         2.66387E+02
+          4.77869E-03         1.27606E-02        -5.45031E-03         3.00230E-01         1.02110E+00         3.00279E-01         4.37191E+02         9.86362E-01         1.19327E+02         5.08469E+02         2.40448E+02         2.68021E+02
+          4.77869E-03         1.29304E-02        -5.58738E-03         3.00229E-01         1.03177E+00         3.00281E-01         4.20213E+02         9.86365E-01         1.13970E+02         4.90048E+02         2.20059E+02         2.69988E+02
+          4.77869E-03         1.31002E-02        -5.72628E-03         3.00228E-01         1.04244E+00         3.00283E-01         4.06135E+02         9.86367E-01         1.08956E+02         4.74211E+02         2.01967E+02         2.72244E+02
+          4.77869E-03         1.32701E-02        -5.86698E-03         3.00228E-01         1.05311E+00         3.00285E-01         3.94767E+02         9.86370E-01         1.04281E+02         4.60790E+02         1.86045E+02         2.74745E+02
+          4.77869E-03         1.34399E-02        -6.00950E-03         3.00227E-01         1.06378E+00         3.00287E-01         3.85921E+02         9.86373E-01         9.99394E+01         4.49617E+02         1.72168E+02         2.77449E+02
+          4.77869E-03         1.36097E-02        -6.15382E-03         3.00226E-01         1.07445E+00         3.00290E-01         3.79412E+02         9.86375E-01         9.59284E+01         4.40530E+02         1.60213E+02         2.80317E+02
+          4.77869E-03         1.37795E-02        -6.29997E-03         3.00226E-01         1.08512E+00         3.00292E-01         3.75060E+02         9.86378E-01         9.22443E+01         4.33368E+02         1.50058E+02         2.83309E+02
+          4.77869E-03         1.39494E-02        -6.44792E-03         3.00225E-01         1.09579E+00         3.00294E-01         3.72688E+02         9.86381E-01         8.88836E+01         4.27976E+02         1.41586E+02         2.86390E+02
+          4.77869E-03         1.41192E-02        -6.59769E-03         3.00224E-01         1.10646E+00         3.00297E-01         3.72123E+02         9.86385E-01         8.58428E+01         4.24202E+02         1.34679E+02         2.89524E+02
+          4.77869E-03         1.42890E-02        -6.74927E-03         3.00224E-01         1.11713E+00         3.00299E-01         3.73199E+02         9.86388E-01         8.31178E+01         4.21900E+02         1.29223E+02         2.92677E+02
+          4.77869E-03         1.44589E-02        -6.90266E-03         3.00223E-01         1.12780E+00         3.00302E-01         3.75752E+02         9.86391E-01         8.07035E+01         4.20927E+02         1.25109E+02         2.95818E+02
+          4.77869E-03         1.46287E-02        -7.05786E-03         3.00222E-01         1.13847E+00         3.00305E-01         3.79626E+02         9.86395E-01         7.85935E+01         4.21147E+02         1.22229E+02         2.98918E+02
+          4.77869E-03         1.47985E-02        -7.21488E-03         3.00221E-01         1.14914E+00         3.00308E-01         3.84667E+02         9.86399E-01         7.67799E+01         4.22426E+02         1.20477E+02         3.01948E+02
+          4.77869E-03         1.49683E-02        -7.37371E-03         3.00221E-01         1.15981E+00         3.00311E-01         3.90731E+02         9.86403E-01         7.52528E+01         4.24638E+02         1.19754E+02         3.04884E+02
+          4.77869E-03         1.51382E-02        -7.53436E-03         3.00220E-01         1.17048E+00         3.00314E-01         3.97675E+02         9.86407E-01         7.40004E+01         4.27662E+02         1.19962E+02         3.07700E+02
+          4.77869E-03         1.53080E-02        -7.69681E-03         3.00219E-01         1.18115E+00         3.00318E-01         4.05367E+02         9.86411E-01         7.30091E+01         4.31382E+02         1.21006E+02         3.10376E+02
+          4.77869E-03         1.54778E-02        -7.86108E-03         3.00218E-01         1.19182E+00         3.00321E-01         4.13678E+02         9.86416E-01         7.22631E+01         4.35688E+02         1.22797E+02         3.12891E+02
+          4.77869E-03         1.56476E-02        -8.02716E-03         3.00217E-01         1.20249E+00         3.00325E-01         4.22486E+02         9.86420E-01         7.17453E+01         4.40475E+02         1.25249E+02         3.15226E+02
+          4.77869E-03         1.58175E-02        -8.19506E-03         3.00217E-01         1.21317E+00         3.00329E-01         4.31675E+02         9.86425E-01         7.14368E+01         4.45645E+02         1.28279E+02         3.17366E+02
+          4.77869E-03         1.59873E-02        -8.36476E-03         3.00216E-01         1.22384E+00         3.00332E-01         4.41136E+02         9.86430E-01         7.13182E+01         4.51104E+02         1.31808E+02         3.19296E+02
+          4.77869E-03         1.61571E-02        -8.53628E-03         3.00215E-01         1.23451E+00         3.00336E-01         4.50767E+02         9.86435E-01         7.13693E+01         4.56766E+02         1.35762E+02         3.21004E+02
+          4.77869E-03         1.63270E-02        -8.70962E-03         3.00214E-01         1.24518E+00         3.00341E-01         4.60471E+02         9.86440E-01         7.15698E+01         4.62548E+02         1.40071E+02         3.22477E+02
+          4.77869E-03         1.64968E-02        -8.88476E-03         3.00213E-01         1.25585E+00         3.00345E-01         4.70158E+02         9.86445E-01         7.18995E+01         4.68376E+02         1.44668E+02         3.23708E+02
+          4.77869E-03         1.66666E-02        -9.06172E-03         3.00213E-01         1.26652E+00         3.00349E-01         4.79744E+02         9.86451E-01         7.23389E+01         4.74178E+02         1.49489E+02         3.24689E+02
+          4.77869E-03         1.68364E-02        -9.24049E-03         3.00212E-01         1.27719E+00         3.00354E-01         4.89153E+02         9.86457E-01         7.28693E+01         4.79890E+02         1.54477E+02         3.25414E+02
+          4.77869E-03         1.70063E-02        -9.42108E-03         3.00211E-01         1.28786E+00         3.00359E-01         4.98312E+02         9.86463E-01         7.34728E+01         4.85453E+02         1.59576E+02         3.25878E+02
+          4.77869E-03         1.71761E-02        -9.60347E-03         3.00210E-01         1.29853E+00         3.00364E-01         5.07158E+02         9.86469E-01         7.41329E+01         4.90813E+02         1.64735E+02         3.26079E+02
+          4.77869E-03         1.73459E-02        -9.78768E-03         3.00209E-01         1.30920E+00         3.00369E-01         5.15632E+02         9.86476E-01         7.48342E+01         4.95922E+02         1.69907E+02         3.26015E+02
+          4.77869E-03         1.75158E-02        -9.97371E-03         3.00208E-01         1.31987E+00         3.00374E-01         5.23679E+02         9.86482E-01         7.55625E+01         5.00735E+02         1.75048E+02         3.25687E+02
+          4.77869E-03         1.76856E-02        -1.01615E-02         3.00207E-01         1.33054E+00         3.00379E-01         5.31254E+02         9.86489E-01         7.63050E+01         5.05213E+02         1.80118E+02         3.25095E+02
+          4.77869E-03         1.78554E-02        -1.03512E-02         3.00206E-01         1.34121E+00         3.00385E-01         5.38315E+02         9.86496E-01         7.70500E+01         5.09324E+02         1.85081E+02         3.24243E+02
+          4.77869E-03         1.80252E-02        -1.05427E-02         3.00205E-01         1.35188E+00         3.00391E-01         5.44825E+02         9.86503E-01         7.77871E+01         5.13038E+02         1.89904E+02         3.23134E+02
+          4.77869E-03         1.81951E-02        -1.07359E-02         3.00205E-01         1.36255E+00         3.00396E-01         5.50754E+02         9.86511E-01         7.85070E+01         5.16329E+02         1.94556E+02         3.21773E+02
+          4.77869E-03         1.83649E-02        -1.09310E-02         3.00204E-01         1.37322E+00         3.00403E-01         5.56075E+02         9.86518E-01         7.92013E+01         5.19177E+02         1.99012E+02         3.20165E+02
+          4.77869E-03         1.85347E-02        -1.11279E-02         3.00203E-01         1.38389E+00         3.00409E-01         5.60768E+02         9.86526E-01         7.98629E+01         5.21566E+02         2.03248E+02         3.18318E+02
+          4.77869E-03         1.87045E-02        -1.13266E-02         3.00202E-01         1.39457E+00         3.00415E-01         5.64816E+02         9.86535E-01         8.04853E+01         5.23483E+02         2.07244E+02         3.16239E+02
+          4.77869E-03         1.88744E-02        -1.15272E-02         3.00201E-01         1.40524E+00         3.00422E-01         5.68208E+02         9.86543E-01         8.10631E+01         5.24918E+02         2.10982E+02         3.13936E+02
+          4.77869E-03         1.90442E-02        -1.17295E-02         3.00200E-01         1.41591E+00         3.00429E-01         5.70935E+02         9.86552E-01         8.15914E+01         5.25866E+02         2.14447E+02         3.11419E+02
+          4.77869E-03         1.92140E-02        -1.19337E-02         3.00199E-01         1.42658E+00         3.00436E-01         5.72994E+02         9.86561E-01         8.20663E+01         5.26325E+02         2.17628E+02         3.08697E+02
+          4.77869E-03         1.93839E-02        -1.21396E-02         3.00198E-01         1.43725E+00         3.00443E-01         5.74386E+02         9.86570E-01         8.24843E+01         5.26294E+02         2.20514E+02         3.05781E+02
+          4.77869E-03         1.95537E-02        -1.23474E-02         3.00197E-01         1.44792E+00         3.00451E-01         5.75113E+02         9.86579E-01         8.28427E+01         5.25778E+02         2.23098E+02         3.02680E+02
+          4.77869E-03         1.97235E-02        -1.25570E-02         3.00196E-01         1.45859E+00         3.00458E-01         5.75183E+02         9.86589E-01         8.31393E+01         5.24783E+02         2.25376E+02         2.99407E+02
+          4.77869E-03         1.98933E-02        -1.27684E-02         3.00195E-01         1.46926E+00         3.00466E-01         5.74605E+02         9.86599E-01         8.33722E+01         5.23316E+02         2.27343E+02         2.95973E+02
+          4.77869E-03         2.00632E-02        -1.29816E-02         3.00194E-01         1.47993E+00         3.00474E-01         5.73393E+02         9.86609E-01         8.35401E+01         5.21389E+02         2.29000E+02         2.92389E+02
+          4.77869E-03         2.02330E-02        -1.31967E-02         3.00193E-01         1.49060E+00         3.00483E-01         5.71561E+02         9.86619E-01         8.36422E+01         5.19014E+02         2.30347E+02         2.88668E+02
+          4.77869E-03         2.04028E-02        -1.34135E-02         3.00192E-01         1.50127E+00         3.00491E-01         5.69129E+02         9.86630E-01         8.36779E+01         5.16206E+02         2.31385E+02         2.84821E+02
+          4.77869E-03         2.05726E-02        -1.36322E-02         3.00191E-01         1.51194E+00         3.00500E-01         5.66115E+02         9.86641E-01         8.36471E+01         5.12980E+02         2.32120E+02         2.80860E+02
+          4.77869E-03         2.07425E-02        -1.38526E-02         3.00190E-01         1.52261E+00         3.00509E-01         5.62541E+02         9.86653E-01         8.35497E+01         5.09355E+02         2.32556E+02         2.76799E+02
+          4.77869E-03         2.09123E-02        -1.40749E-02         3.00189E-01         1.53328E+00         3.00518E-01         5.58432E+02         9.86664E-01         8.33862E+01         5.05349E+02         2.32700E+02         2.72648E+02
+          4.77869E-03         2.10821E-02        -1.42990E-02         3.00188E-01         1.54395E+00         3.00528E-01         5.53812E+02         9.86676E-01         8.31572E+01         5.00981E+02         2.32561E+02         2.68421E+02
+          4.77869E-03         2.12520E-02        -1.45249E-02         3.00186E-01         1.55462E+00         3.00538E-01         5.48707E+02         9.86689E-01         8.28636E+01         4.96273E+02         2.32145E+02         2.64128E+02
+          4.77869E-03         2.14218E-02        -1.47527E-02         3.00185E-01         1.56529E+00         3.00548E-01         5.43146E+02         9.86701E-01         8.25063E+01         4.91246E+02         2.31465E+02         2.59782E+02
+          4.77869E-03         2.15916E-02        -1.49822E-02         3.00184E-01         1.57596E+00         3.00558E-01         5.37157E+02         9.86714E-01         8.20865E+01         4.85922E+02         2.30529E+02         2.55393E+02
+          4.77869E-03         2.17614E-02        -1.52135E-02         3.00183E-01         1.58664E+00         3.00568E-01         5.30768E+02         9.86727E-01         8.16057E+01         4.80323E+02         2.29349E+02         2.50974E+02
+          4.77869E-03         2.19313E-02        -1.54467E-02         3.00182E-01         1.59731E+00         3.00579E-01         5.24010E+02         9.86741E-01         8.10653E+01         4.74473E+02         2.27938E+02         2.46535E+02
+          4.77869E-03         2.21011E-02        -1.56817E-02         3.00181E-01         1.60798E+00         3.00590E-01         5.16913E+02         9.86755E-01         8.04670E+01         4.68393E+02         2.26307E+02         2.42086E+02
+          4.77869E-03         2.22709E-02        -1.59185E-02         3.00180E-01         1.61865E+00         3.00602E-01         5.09506E+02         9.86769E-01         7.98123E+01         4.62107E+02         2.24470E+02         2.37637E+02
+          4.77869E-03         2.24407E-02        -1.61571E-02         3.00179E-01         1.62932E+00         3.00613E-01         5.01820E+02         9.86783E-01         7.91033E+01         4.55638E+02         2.22438E+02         2.33200E+02
+          4.77869E-03         2.26106E-02        -1.63975E-02         3.00177E-01         1.63999E+00         3.00625E-01         4.93885E+02         9.86798E-01         7.83416E+01         4.49008E+02         2.20227E+02         2.28781E+02
+          4.77869E-03         2.27804E-02        -1.66397E-02         3.00176E-01         1.65066E+00         3.00637E-01         4.85732E+02         9.86813E-01         7.75294E+01         4.42239E+02         2.17848E+02         2.24391E+02
+          4.77869E-03         2.29502E-02        -1.68838E-02         3.00175E-01         1.66133E+00         3.00650E-01         4.77389E+02         9.86829E-01         7.66684E+01         4.35354E+02         2.15315E+02         2.20039E+02
+          4.77869E-03         2.31201E-02        -1.71296E-02         3.00174E-01         1.67200E+00         3.00662E-01         4.68886E+02         9.86845E-01         7.57609E+01         4.28373E+02         2.12643E+02         2.15730E+02
+          4.77869E-03         2.32899E-02        -1.73773E-02         3.00173E-01         1.68267E+00         3.00675E-01         4.60252E+02         9.86861E-01         7.48089E+01         4.21318E+02         2.09843E+02         2.11474E+02
+          4.77869E-03         2.34597E-02        -1.76268E-02         3.00172E-01         1.69334E+00         3.00689E-01         4.51513E+02         9.86878E-01         7.38144E+01         4.14208E+02         2.06930E+02         2.07278E+02
+          4.77869E-03         2.36295E-02        -1.78781E-02         3.00170E-01         1.70401E+00         3.00702E-01         4.42698E+02         9.86895E-01         7.27796E+01         4.07063E+02         2.03917E+02         2.03146E+02
+          4.77869E-03         2.37994E-02        -1.81312E-02         3.00169E-01         1.71468E+00         3.00716E-01         4.33832E+02         9.86912E-01         7.17065E+01         3.99902E+02         2.00815E+02         1.99086E+02
+          4.77869E-03         2.39692E-02        -1.83862E-02         3.00168E-01         1.72535E+00         3.00731E-01         4.24940E+02         9.86930E-01         7.05973E+01         3.92742E+02         1.97638E+02         1.95103E+02
+          4.77869E-03         2.41390E-02        -1.86429E-02         3.00167E-01         1.73602E+00         3.00745E-01         4.16047E+02         9.86948E-01         6.94541E+01         3.85600E+02         1.94398E+02         1.91202E+02
+          4.77869E-03         2.43088E-02        -1.89015E-02         3.00166E-01         1.74669E+00         3.00760E-01         4.07176E+02         9.86967E-01         6.82790E+01         3.78493E+02         1.91107E+02         1.87386E+02
+          4.77869E-03         2.44787E-02        -1.91618E-02         3.00164E-01         1.75736E+00         3.00775E-01         3.98348E+02         9.86986E-01         6.70740E+01         3.71435E+02         1.87775E+02         1.83661E+02
+          4.77869E-03         2.46485E-02        -1.94240E-02         3.00163E-01         1.76804E+00         3.00791E-01         3.89585E+02         9.87005E-01         6.58412E+01         3.64442E+02         1.84413E+02         1.80028E+02
+          4.77869E-03         2.48183E-02        -1.96880E-02         3.00162E-01         1.77871E+00         3.00807E-01         3.80907E+02         9.87025E-01         6.45827E+01         3.57525E+02         1.81033E+02         1.76492E+02
+          4.77869E-03         2.49882E-02        -1.99538E-02         3.00161E-01         1.78938E+00         3.00823E-01         3.72330E+02         9.87045E-01         6.33005E+01         3.50697E+02         1.77643E+02         1.73054E+02
+          4.77869E-03         2.51580E-02        -2.02214E-02         3.00159E-01         1.80005E+00         3.00840E-01         3.63873E+02         9.87066E-01         6.19965E+01         3.43971E+02         1.74254E+02         1.69717E+02
+          4.77869E-03         2.53278E-02        -2.04909E-02         3.00158E-01         1.81072E+00         3.00857E-01         3.55552E+02         9.87087E-01         6.06727E+01         3.37355E+02         1.70873E+02         1.66482E+02
+          4.77869E-03         2.54976E-02        -2.07621E-02         3.00157E-01         1.82139E+00         3.00874E-01         3.47381E+02         9.87108E-01         5.93310E+01         3.30860E+02         1.67510E+02         1.63349E+02
+          4.77869E-03         2.56675E-02        -2.10352E-02         3.00155E-01         1.83206E+00         3.00892E-01         3.39373E+02         9.87130E-01         5.79733E+01         3.24493E+02         1.64173E+02         1.60321E+02
+          4.77869E-03         2.58373E-02        -2.13101E-02         3.00154E-01         1.84273E+00         3.00910E-01         3.31541E+02         9.87153E-01         5.66014E+01         3.18263E+02         1.60867E+02         1.57396E+02
+          4.77869E-03         2.60071E-02        -2.15868E-02         3.00153E-01         1.85340E+00         3.00928E-01         3.23895E+02         9.87175E-01         5.52172E+01         3.12176E+02         1.57601E+02         1.54575E+02
+          4.77869E-03         2.61769E-02        -2.18653E-02         3.00151E-01         1.86407E+00         3.00947E-01         3.16445E+02         9.87199E-01         5.38223E+01         3.06238E+02         1.54380E+02         1.51858E+02
+          4.94852E-03         8.72665E-04        -4.10445E-04         3.10925E-01         2.74155E-01         3.10925E-01         1.30773E+04         9.97418E-01         1.36401E+03         1.22966E+04         9.89916E+03         2.39747E+03
+          4.94852E-03         1.04249E-03        -4.20663E-04         3.10925E-01         2.84826E-01         3.10925E-01         1.28285E+04         9.97418E-01         1.34117E+03         1.20627E+04         9.71536E+03         2.34734E+03
+          4.94852E-03         1.21232E-03        -4.32693E-04         3.10925E-01         2.95496E-01         3.10925E-01         1.25746E+04         9.97418E-01         1.31784E+03         1.18241E+04         9.52773E+03         2.29632E+03
+          4.94852E-03         1.38215E-03        -4.46535E-04         3.10925E-01         3.06167E-01         3.10925E-01         1.23160E+04         9.97418E-01         1.29407E+03         1.15811E+04         9.33657E+03         2.24452E+03
+          4.94852E-03         1.55197E-03        -4.62189E-04         3.10924E-01         3.16838E-01         3.10925E-01         1.20532E+04         9.97418E-01         1.26989E+03         1.13342E+04         9.14220E+03         2.19202E+03
+          4.94852E-03         1.72180E-03        -4.79655E-04         3.10924E-01         3.27508E-01         3.10925E-01         1.17867E+04         9.97418E-01         1.24535E+03         1.10838E+04         8.94492E+03         2.13892E+03
+          4.94852E-03         1.89163E-03        -4.98934E-04         3.10924E-01         3.38179E-01         3.10925E-01         1.15167E+04         9.97418E-01         1.22047E+03         1.08304E+04         8.74505E+03         2.08532E+03
+          4.94852E-03         2.06146E-03        -5.20024E-04         3.10924E-01         3.48849E-01         3.10925E-01         1.12438E+04         9.97418E-01         1.19530E+03         1.05742E+04         8.54290E+03         2.03133E+03
+          4.94852E-03         2.23128E-03        -5.42927E-04         3.10924E-01         3.59520E-01         3.10925E-01         1.09684E+04         9.97418E-01         1.16988E+03         1.03158E+04         8.33878E+03         1.97702E+03
+          4.94852E-03         2.40111E-03        -5.67642E-04         3.10924E-01         3.70190E-01         3.10924E-01         1.06909E+04         9.97418E-01         1.14424E+03         1.00555E+04         8.13299E+03         1.92251E+03
+          4.94852E-03         2.57094E-03        -5.94169E-04         3.10924E-01         3.80861E-01         3.10924E-01         1.04117E+04         9.97418E-01         1.11842E+03         9.79374E+03         7.92586E+03         1.86788E+03
+          4.94852E-03         2.74077E-03        -6.22508E-04         3.10924E-01         3.91532E-01         3.10924E-01         1.01313E+04         9.97417E-01         1.09246E+03         9.53091E+03         7.71768E+03         1.81323E+03
+          4.94852E-03         2.91059E-03        -6.52660E-04         3.10924E-01         4.02202E-01         3.10924E-01         9.85011E+03         9.97417E-01         1.06639E+03         9.26741E+03         7.50876E+03         1.75864E+03
+          4.94852E-03         3.08042E-03        -6.84623E-04         3.10923E-01         4.12873E-01         3.10924E-01         9.56851E+03         9.97417E-01         1.04026E+03         9.00362E+03         7.29940E+03         1.70422E+03
+          4.94852E-03         3.25025E-03        -7.18399E-04         3.10923E-01         4.23543E-01         3.10924E-01         9.28691E+03         9.97417E-01         1.01409E+03         8.73992E+03         7.08989E+03         1.65003E+03
+          4.94852E-03         3.42008E-03        -7.53987E-04         3.10923E-01         4.34214E-01         3.10924E-01         9.00571E+03         9.97417E-01         9.87929E+02         8.47670E+03         6.88052E+03         1.59618E+03
+          4.94852E-03         3.58990E-03        -7.91387E-04         3.10923E-01         4.44884E-01         3.10924E-01         8.72531E+03         9.97417E-01         9.61805E+02         8.21432E+03         6.67157E+03         1.54275E+03
+          4.94852E-03         3.75973E-03        -8.30599E-04         3.10923E-01         4.55555E-01         3.10924E-01         8.44607E+03         9.97417E-01         9.35752E+02         7.95313E+03         6.46333E+03         1.48980E+03
+          4.94852E-03         3.92956E-03        -8.71623E-04         3.10922E-01         4.66225E-01         3.10924E-01         8.16839E+03         9.97417E-01         9.09804E+02         7.69349E+03         6.25605E+03         1.43743E+03
+          4.94852E-03         4.09939E-03        -9.14460E-04         3.10922E-01         4.76896E-01         3.10924E-01         7.89261E+03         9.97417E-01         8.83992E+02         7.43572E+03         6.05001E+03         1.38571E+03
+          4.94852E-03         4.26921E-03        -9.59109E-04         3.10922E-01         4.87567E-01         3.10923E-01         7.61908E+03         9.97417E-01         8.58347E+02         7.18016E+03         5.84546E+03         1.33470E+03
+          4.94852E-03         4.43904E-03        -1.00557E-03         3.10922E-01         4.98237E-01         3.10923E-01         7.34815E+03         9.97417E-01         8.32900E+02         6.92713E+03         5.64265E+03         1.28448E+03
+          4.94852E-03         4.60887E-03        -1.05384E-03         3.10922E-01         5.08908E-01         3.10923E-01         7.08013E+03         9.97417E-01         8.07678E+02         6.67691E+03         5.44180E+03         1.23511E+03
+          4.94852E-03         4.77869E-03        -1.10393E-03         3.10921E-01         5.19578E-01         3.10923E-01         6.81535E+03         9.97417E-01         7.82711E+02         6.42982E+03         5.24316E+03         1.18666E+03
+          4.94852E-03         4.94852E-03        -1.15583E-03         3.10921E-01         5.30249E-01         3.10923E-01         6.55410E+03         9.97417E-01         7.58024E+02         6.18611E+03         5.04694E+03         1.13917E+03
+          4.94852E-03         5.11835E-03        -1.20953E-03         3.10921E-01         5.40919E-01         3.10923E-01         6.29667E+03         9.97417E-01         7.33642E+02         5.94607E+03         4.85335E+03         1.09271E+03
+          4.94852E-03         5.28818E-03        -1.26506E-03         3.10920E-01         5.51590E-01         3.10923E-01         6.04332E+03         9.97416E-01         7.09589E+02         5.70992E+03         4.66259E+03         1.04733E+03
+          4.94852E-03         5.45800E-03        -1.32239E-03         3.10920E-01         5.62261E-01         3.10923E-01         5.79432E+03         9.97416E-01         6.85889E+02         5.47792E+03         4.47485E+03         1.00307E+03
+          4.94852E-03         5.62783E-03        -1.38154E-03         3.10920E-01         5.72931E-01         3.10923E-01         5.54990E+03         9.97416E-01         6.62562E+02         5.25028E+03         4.29031E+03         9.59975E+02
+          4.94852E-03         5.79766E-03        -1.44250E-03         3.10920E-01         5.83602E-01         3.10923E-01         5.31030E+03         9.97416E-01         6.39628E+02         5.02721E+03         4.10912E+03         9.18085E+02
+          4.94852E-03         5.96749E-03        -1.50527E-03         3.10919E-01         5.94272E-01         3.10923E-01         5.07571E+03         9.97416E-01         6.17106E+02         4.80890E+03         3.93146E+03         8.77434E+02
+          4.94852E-03         6.13731E-03        -1.56985E-03         3.10919E-01         6.04943E-01         3.10923E-01         4.84634E+03         9.97416E-01         5.95013E+02         4.59552E+03         3.75747E+03         8.38055E+02
+          4.94852E-03         6.30714E-03        -1.63624E-03         3.10919E-01         6.15613E-01         3.10923E-01         4.62237E+03         9.97416E-01         5.73364E+02         4.38725E+03         3.58727E+03         7.99973E+02
+          4.94852E-03         6.47697E-03        -1.70445E-03         3.10918E-01         6.26284E-01         3.10923E-01         4.40395E+03         9.97416E-01         5.52175E+02         4.18421E+03         3.42100E+03         7.63214E+02
+          4.94852E-03         6.64680E-03        -1.77447E-03         3.10918E-01         6.36955E-01         3.10923E-01         4.19124E+03         9.97416E-01         5.31457E+02         3.98656E+03         3.25876E+03         7.27795E+02
+          4.94852E-03         6.81662E-03        -1.84630E-03         3.10918E-01         6.47625E-01         3.10923E-01         3.98437E+03         9.97416E-01         5.11222E+02         3.79439E+03         3.10066E+03         6.93732E+02
+          4.94852E-03         6.98645E-03        -1.91995E-03         3.10917E-01         6.58296E-01         3.10923E-01         3.78344E+03         9.97417E-01         4.91480E+02         3.60782E+03         2.94678E+03         6.61039E+02
+          4.94852E-03         7.15628E-03        -1.99540E-03         3.10917E-01         6.68966E-01         3.10923E-01         3.58858E+03         9.97417E-01         4.72240E+02         3.42692E+03         2.79720E+03         6.29721E+02
+          4.94852E-03         7.32611E-03        -2.07267E-03         3.10916E-01         6.79637E-01         3.10923E-01         3.39984E+03         9.97417E-01         4.53508E+02         3.25178E+03         2.65200E+03         5.99784E+02
+          4.94852E-03         7.49593E-03        -2.15175E-03         3.10916E-01         6.90307E-01         3.10924E-01         3.21732E+03         9.97417E-01         4.35290E+02         3.08244E+03         2.51121E+03         5.71229E+02
+          4.94852E-03         7.66576E-03        -2.23265E-03         3.10916E-01         7.00978E-01         3.10924E-01         3.04105E+03         9.97417E-01         4.17592E+02         2.91896E+03         2.37490E+03         5.44053E+02
+          4.94852E-03         7.83559E-03        -2.31535E-03         3.10915E-01         7.11649E-01         3.10924E-01         2.87109E+03         9.97417E-01         4.00415E+02         2.76135E+03         2.24310E+03         5.18250E+02
+          4.94852E-03         8.00542E-03        -2.39987E-03         3.10915E-01         7.22319E-01         3.10924E-01         2.70744E+03         9.97417E-01         3.83761E+02         2.60963E+03         2.11583E+03         4.93810E+02
+          4.94852E-03         8.17524E-03        -2.48620E-03         3.10914E-01         7.32990E-01         3.10924E-01         2.55014E+03         9.97418E-01         3.67631E+02         2.46382E+03         1.99310E+03         4.70721E+02
+          4.94852E-03         8.34507E-03        -2.57434E-03         3.10914E-01         7.43660E-01         3.10925E-01         2.39916E+03         9.97418E-01         3.52024E+02         2.32389E+03         1.87492E+03         4.48967E+02
+          4.94852E-03         8.51490E-03        -2.66430E-03         3.10914E-01         7.54331E-01         3.10925E-01         2.25449E+03         9.97418E-01         3.36938E+02         2.18982E+03         1.76129E+03         4.28530E+02
+          4.94852E-03         8.68473E-03        -2.75607E-03         3.10913E-01         7.65001E-01         3.10925E-01         2.11611E+03         9.97418E-01         3.22370E+02         2.06158E+03         1.65219E+03         4.09389E+02
+          4.94852E-03         8.85455E-03        -2.84965E-03         3.10913E-01         7.75672E-01         3.10926E-01         1.98397E+03         9.97419E-01         3.08315E+02         1.93912E+03         1.54760E+03         3.91520E+02
+          4.94852E-03         9.02438E-03        -2.94504E-03         3.10912E-01         7.86343E-01         3.10926E-01         1.85802E+03         9.97419E-01         2.94768E+02         1.82238E+03         1.44749E+03         3.74895E+02
+          4.94852E-03         9.19421E-03        -3.04224E-03         3.10912E-01         7.97013E-01         3.10927E-01         1.73819E+03         9.97419E-01         2.81722E+02         1.71130E+03         1.35181E+03         3.59487E+02
+          4.94852E-03         9.36403E-03        -3.14126E-03         3.10911E-01         8.07684E-01         3.10927E-01         1.62440E+03         9.97420E-01         2.69171E+02         1.60580E+03         1.26053E+03         3.45265E+02
+          4.94852E-03         9.53386E-03        -3.24209E-03         3.10911E-01         8.18354E-01         3.10928E-01         1.51657E+03         9.97420E-01         2.57107E+02         1.50578E+03         1.17358E+03         3.32196E+02
+          4.94852E-03         9.70369E-03        -3.34473E-03         3.10910E-01         8.29025E-01         3.10928E-01         1.41460E+03         9.97421E-01         2.45520E+02         1.41115E+03         1.09091E+03         3.20244E+02
+          4.94852E-03         9.87352E-03        -3.44918E-03         3.10910E-01         8.39695E-01         3.10929E-01         1.31838E+03         9.97421E-01         2.34402E+02         1.32181E+03         1.01244E+03         3.09374E+02
+          4.94852E-03         1.00433E-02        -3.55545E-03         3.10909E-01         8.50366E-01         3.10929E-01         1.22780E+03         9.97422E-01         2.23741E+02         1.23765E+03         9.38100E+02         2.99547E+02
+          4.94852E-03         1.02132E-02        -3.66353E-03         3.10909E-01         8.61037E-01         3.10930E-01         1.14273E+03         9.97422E-01         2.13528E+02         1.15853E+03         8.67810E+02         2.90725E+02
+          4.94852E-03         1.03830E-02        -3.77342E-03         3.10908E-01         8.71707E-01         3.10931E-01         1.06304E+03         9.97423E-01         2.03752E+02         1.08435E+03         8.01483E+02         2.82866E+02
+          4.94852E-03         1.05528E-02        -3.88512E-03         3.10908E-01         8.82378E-01         3.10932E-01         9.88602E+02         9.97424E-01         1.94401E+02         1.01496E+03         7.39027E+02         2.75929E+02
+          4.94852E-03         1.07227E-02        -3.99864E-03         3.10907E-01         8.93048E-01         3.10933E-01         9.19258E+02         9.97424E-01         1.85465E+02         9.50219E+02         6.80346E+02         2.69872E+02
+          4.94852E-03         1.08925E-02        -4.11396E-03         3.10906E-01         9.03719E-01         3.10934E-01         8.54864E+02         9.97425E-01         1.76930E+02         8.89993E+02         6.25341E+02         2.64652E+02
+          4.94852E-03         1.10623E-02        -4.23111E-03         3.10906E-01         9.14389E-01         3.10935E-01         7.95263E+02         9.97426E-01         1.68787E+02         8.34131E+02         5.73907E+02         2.60224E+02
+          4.94852E-03         1.12321E-02        -4.35006E-03         3.10905E-01         9.25060E-01         3.10936E-01         7.40296E+02         9.97427E-01         1.61023E+02         7.82483E+02         5.25937E+02         2.56545E+02
+          4.94852E-03         1.14020E-02        -4.47082E-03         3.10905E-01         9.35731E-01         3.10937E-01         6.89800E+02         9.97428E-01         1.53628E+02         7.34892E+02         4.81321E+02         2.53571E+02
+          4.94852E-03         1.15718E-02        -4.59340E-03         3.10904E-01         9.46401E-01         3.10938E-01         6.43607E+02         9.97429E-01         1.46590E+02         6.91203E+02         4.39946E+02         2.51257E+02
+          4.94852E-03         1.17416E-02        -4.71779E-03         3.10903E-01         9.57072E-01         3.10939E-01         6.01546E+02         9.97430E-01         1.39898E+02         6.51255E+02         4.01696E+02         2.49559E+02
+          4.94852E-03         1.19114E-02        -4.84400E-03         3.10903E-01         9.67742E-01         3.10941E-01         5.63447E+02         9.97431E-01         1.33544E+02         6.14889E+02         3.66457E+02         2.48432E+02
+          4.94852E-03         1.20813E-02        -4.97201E-03         3.10902E-01         9.78413E-01         3.10942E-01         5.29135E+02         9.97432E-01         1.27517E+02         5.81942E+02         3.34108E+02         2.47834E+02
+          4.94852E-03         1.22511E-02        -5.10184E-03         3.10901E-01         9.89083E-01         3.10943E-01         4.98435E+02         9.97433E-01         1.21808E+02         5.52251E+02         3.04531E+02         2.47720E+02
+          4.94852E-03         1.24209E-02        -5.23348E-03         3.10901E-01         9.99754E-01         3.10945E-01         4.71172E+02         9.97434E-01         1.16410E+02         5.25655E+02         2.77608E+02         2.48048E+02
+          4.94852E-03         1.25908E-02        -5.36693E-03         3.10900E-01         1.01042E+00         3.10947E-01         4.47170E+02         9.97436E-01         1.11315E+02         5.01992E+02         2.53216E+02         2.48775E+02
+          4.94852E-03         1.27606E-02        -5.50220E-03         3.10900E-01         1.02110E+00         3.10948E-01         4.26255E+02         9.97437E-01         1.06516E+02         4.81099E+02         2.31237E+02         2.49862E+02
+          4.94852E-03         1.29304E-02        -5.63928E-03         3.10899E-01         1.03177E+00         3.10950E-01         4.08252E+02         9.97439E-01         1.02007E+02         4.62819E+02         2.11552E+02         2.51267E+02
+          4.94852E-03         1.31002E-02        -5.77817E-03         3.10898E-01         1.04244E+00         3.10952E-01         3.92989E+02         9.97440E-01         9.77828E+01         4.46991E+02         1.94041E+02         2.52951E+02
+          4.94852E-03         1.32701E-02        -5.91887E-03         3.10897E-01         1.05311E+00         3.10954E-01         3.80294E+02         9.97442E-01         9.38389E+01         4.33462E+02         1.78586E+02         2.54876E+02
+          4.94852E-03         1.34399E-02        -6.06139E-03         3.10897E-01         1.06378E+00         3.10956E-01         3.69999E+02         9.97444E-01         9.01709E+01         4.22076E+02         1.65071E+02         2.57004E+02
+          4.94852E-03         1.36097E-02        -6.20572E-03         3.10896E-01         1.07445E+00         3.10958E-01         3.61938E+02         9.97445E-01         8.67750E+01         4.12683E+02         1.53382E+02         2.59302E+02
+          4.94852E-03         1.37795E-02        -6.35186E-03         3.10895E-01         1.08512E+00         3.10960E-01         3.55947E+02         9.97447E-01         8.36477E+01         4.05137E+02         1.43404E+02         2.61733E+02
+          4.94852E-03         1.39494E-02        -6.49981E-03         3.10895E-01         1.09579E+00         3.10963E-01         3.51867E+02         9.97449E-01         8.07855E+01         3.99291E+02         1.35027E+02         2.64265E+02
+          4.94852E-03         1.41192E-02        -6.64958E-03         3.10894E-01         1.10646E+00         3.10965E-01         3.49542E+02         9.97451E-01         7.81845E+01         3.95007E+02         1.28141E+02         2.66866E+02
+          4.94852E-03         1.42890E-02        -6.80116E-03         3.10893E-01         1.11713E+00         3.10967E-01         3.48819E+02         9.97453E-01         7.58408E+01         3.92148E+02         1.22641E+02         2.69507E+02
+          4.94852E-03         1.44589E-02        -6.95455E-03         3.10892E-01         1.12780E+00         3.10970E-01         3.49550E+02         9.97455E-01         7.37493E+01         3.90582E+02         1.18423E+02         2.72159E+02
+          4.94852E-03         1.46287E-02        -7.10976E-03         3.10892E-01         1.13847E+00         3.10973E-01         3.51592E+02         9.97458E-01         7.19044E+01         3.90180E+02         1.15385E+02         2.74795E+02
+          4.94852E-03         1.47985E-02        -7.26677E-03         3.10891E-01         1.14914E+00         3.10976E-01         3.54806E+02         9.97460E-01         7.02992E+01         3.90819E+02         1.13429E+02         2.77390E+02
+          4.94852E-03         1.49683E-02        -7.42560E-03         3.10890E-01         1.15981E+00         3.10979E-01         3.59058E+02         9.97462E-01         6.89258E+01         3.92381E+02         1.12461E+02         2.79920E+02
+          4.94852E-03         1.51382E-02        -7.58625E-03         3.10889E-01         1.17048E+00         3.10982E-01         3.64219E+02         9.97465E-01         6.77746E+01         3.94753E+02         1.12390E+02         2.82363E+02
+          4.94852E-03         1.53080E-02        -7.74870E-03         3.10888E-01         1.18115E+00         3.10985E-01         3.70164E+02         9.97468E-01         6.68349E+01         3.97824E+02         1.13126E+02         2.84698E+02
+          4.94852E-03         1.54778E-02        -7.91297E-03         3.10888E-01         1.19182E+00         3.10988E-01         3.76777E+02         9.97470E-01         6.60945E+01         4.01493E+02         1.14585E+02         2.86908E+02
+          4.94852E-03         1.56476E-02        -8.07905E-03         3.10887E-01         1.20249E+00         3.10992E-01         3.83943E+02         9.97473E-01         6.55404E+01         4.05660E+02         1.16685E+02         2.88975E+02
+          4.94852E-03         1.58175E-02        -8.24695E-03         3.10886E-01         1.21317E+00         3.10995E-01         3.91555E+02         9.97476E-01         6.51582E+01         4.10232E+02         1.19349E+02         2.90882E+02
+          4.94852E-03         1.59873E-02        -8.41665E-03         3.10885E-01         1.22384E+00         3.10999E-01         3.99512E+02         9.97479E-01         6.49331E+01         4.15121E+02         1.22503E+02         2.92618E+02
+          4.94852E-03         1.61571E-02        -8.58817E-03         3.10884E-01         1.23451E+00         3.11003E-01         4.07717E+02         9.97482E-01         6.48496E+01         4.20243E+02         1.26075E+02         2.94168E+02
+          4.94852E-03         1.63270E-02        -8.76151E-03         3.10883E-01         1.24518E+00         3.11007E-01         4.16080E+02         9.97486E-01         6.48920E+01         4.25523E+02         1.30000E+02         2.95523E+02
+          4.94852E-03         1.64968E-02        -8.93665E-03         3.10883E-01         1.25585E+00         3.11011E-01         4.24515E+02         9.97489E-01         6.50450E+01         4.30886E+02         1.34213E+02         2.96673E+02
+          4.94852E-03         1.66666E-02        -9.11361E-03         3.10882E-01         1.26652E+00         3.11015E-01         4.32944E+02         9.97492E-01         6.52931E+01         4.36265E+02         1.38656E+02         2.97610E+02
+          4.94852E-03         1.68364E-02        -9.29238E-03         3.10881E-01         1.27719E+00         3.11020E-01         4.41293E+02         9.97496E-01         6.56216E+01         4.41599E+02         1.43271E+02         2.98328E+02
+          4.94852E-03         1.70063E-02        -9.47297E-03         3.10880E-01         1.28786E+00         3.11024E-01         4.49493E+02         9.97500E-01         6.60165E+01         4.46830E+02         1.48008E+02         2.98822E+02
+          4.94852E-03         1.71761E-02        -9.65536E-03         3.10879E-01         1.29853E+00         3.11029E-01         4.57482E+02         9.97504E-01         6.64642E+01         4.51906E+02         1.52817E+02         2.99089E+02
+          4.94852E-03         1.73459E-02        -9.83957E-03         3.10878E-01         1.30920E+00         3.11034E-01         4.65203E+02         9.97508E-01         6.69525E+01         4.56778E+02         1.57653E+02         2.99125E+02
+          4.94852E-03         1.75158E-02        -1.00256E-02         3.10877E-01         1.31987E+00         3.11039E-01         4.72603E+02         9.97512E-01         6.74696E+01         4.61405E+02         1.62474E+02         2.98931E+02
+          4.94852E-03         1.76856E-02        -1.02134E-02         3.10876E-01         1.33054E+00         3.11044E-01         4.79637E+02         9.97516E-01         6.80048E+01         4.65749E+02         1.67242E+02         2.98507E+02
+          4.94852E-03         1.78554E-02        -1.04031E-02         3.10875E-01         1.34121E+00         3.11049E-01         4.86261E+02         9.97520E-01         6.85485E+01         4.69774E+02         1.71922E+02         2.97852E+02
+          4.94852E-03         1.80252E-02        -1.05945E-02         3.10874E-01         1.35188E+00         3.11055E-01         4.92439E+02         9.97525E-01         6.90917E+01         4.73452E+02         1.76481E+02         2.96971E+02
+          4.94852E-03         1.81951E-02        -1.07878E-02         3.10873E-01         1.36255E+00         3.11060E-01         4.98140E+02         9.97530E-01         6.96266E+01         4.76756E+02         1.80891E+02         2.95865E+02
+          4.94852E-03         1.83649E-02        -1.09829E-02         3.10872E-01         1.37322E+00         3.11066E-01         5.03335E+02         9.97534E-01         7.01458E+01         4.79667E+02         1.85127E+02         2.94540E+02
+          4.94852E-03         1.85347E-02        -1.11798E-02         3.10871E-01         1.38389E+00         3.11072E-01         5.08001E+02         9.97539E-01         7.06432E+01         4.82166E+02         1.89166E+02         2.93000E+02
+          4.94852E-03         1.87045E-02        -1.13785E-02         3.10870E-01         1.39457E+00         3.11079E-01         5.12119E+02         9.97545E-01         7.11130E+01         4.84238E+02         1.92987E+02         2.91251E+02
+          4.94852E-03         1.88744E-02        -1.15790E-02         3.10869E-01         1.40524E+00         3.11085E-01         5.15675E+02         9.97550E-01         7.15503E+01         4.85874E+02         1.96573E+02         2.89301E+02
+          4.94852E-03         1.90442E-02        -1.17814E-02         3.10868E-01         1.41591E+00         3.11092E-01         5.18658E+02         9.97555E-01         7.19508E+01         4.87065E+02         1.99910E+02         2.87156E+02
+          4.94852E-03         1.92140E-02        -1.19855E-02         3.10867E-01         1.42658E+00         3.11098E-01         5.21060E+02         9.97561E-01         7.23108E+01         4.87808E+02         2.02985E+02         2.84823E+02
+          4.94852E-03         1.93839E-02        -1.21915E-02         3.10866E-01         1.43725E+00         3.11105E-01         5.22879E+02         9.97566E-01         7.26272E+01         4.88102E+02         2.05789E+02         2.82313E+02
+          4.94852E-03         1.95537E-02        -1.23993E-02         3.10865E-01         1.44792E+00         3.11113E-01         5.24112E+02         9.97572E-01         7.28973E+01         4.87947E+02         2.08314E+02         2.79633E+02
+          4.94852E-03         1.97235E-02        -1.26089E-02         3.10864E-01         1.45859E+00         3.11120E-01         5.24763E+02         9.97578E-01         7.31189E+01         4.87347E+02         2.10554E+02         2.76793E+02
+          4.94852E-03         1.98933E-02        -1.28203E-02         3.10863E-01         1.46926E+00         3.11128E-01         5.24838E+02         9.97585E-01         7.32902E+01         4.86309E+02         2.12507E+02         2.73802E+02
+          4.94852E-03         2.00632E-02        -1.30335E-02         3.10862E-01         1.47993E+00         3.11135E-01         5.24344E+02         9.97591E-01         7.34098E+01         4.84840E+02         2.14169E+02         2.70671E+02
+          4.94852E-03         2.02330E-02        -1.32485E-02         3.10861E-01         1.49060E+00         3.11143E-01         5.23293E+02         9.97598E-01         7.34767E+01         4.82951E+02         2.15541E+02         2.67410E+02
+          4.94852E-03         2.04028E-02        -1.34654E-02         3.10860E-01         1.50127E+00         3.11152E-01         5.21698E+02         9.97604E-01         7.34901E+01         4.80655E+02         2.16626E+02         2.64029E+02
+          4.94852E-03         2.05726E-02        -1.36840E-02         3.10859E-01         1.51194E+00         3.11160E-01         5.19573E+02         9.97611E-01         7.34497E+01         4.77963E+02         2.17425E+02         2.60538E+02
+          4.94852E-03         2.07425E-02        -1.39045E-02         3.10858E-01         1.52261E+00         3.11169E-01         5.16936E+02         9.97618E-01         7.33553E+01         4.74893E+02         2.17944E+02         2.56949E+02
+          4.94852E-03         2.09123E-02        -1.41268E-02         3.10857E-01         1.53328E+00         3.11178E-01         5.13805E+02         9.97626E-01         7.32069E+01         4.71459E+02         2.18187E+02         2.53272E+02
+          4.94852E-03         2.10821E-02        -1.43509E-02         3.10856E-01         1.54395E+00         3.11187E-01         5.10201E+02         9.97633E-01         7.30048E+01         4.67680E+02         2.18163E+02         2.49517E+02
+          4.94852E-03         2.12520E-02        -1.45768E-02         3.10855E-01         1.55462E+00         3.11196E-01         5.06145E+02         9.97641E-01         7.27496E+01         4.63573E+02         2.17878E+02         2.45695E+02
+          4.94852E-03         2.14218E-02        -1.48045E-02         3.10853E-01         1.56529E+00         3.11206E-01         5.01660E+02         9.97649E-01         7.24418E+01         4.59158E+02         2.17342E+02         2.41816E+02
+          4.94852E-03         2.15916E-02        -1.50341E-02         3.10852E-01         1.57596E+00         3.11216E-01         4.96770E+02         9.97657E-01         7.20824E+01         4.54455E+02         2.16564E+02         2.37891E+02
+          4.94852E-03         2.17614E-02        -1.52654E-02         3.10851E-01         1.58664E+00         3.11226E-01         4.91499E+02         9.97665E-01         7.16723E+01         4.49483E+02         2.15554E+02         2.33929E+02
+          4.94852E-03         2.19313E-02        -1.54986E-02         3.10850E-01         1.59731E+00         3.11236E-01         4.85872E+02         9.97673E-01         7.12125E+01         4.44264E+02         2.14323E+02         2.29941E+02
+          4.94852E-03         2.21011E-02        -1.57336E-02         3.10849E-01         1.60798E+00         3.11247E-01         4.79915E+02         9.97682E-01         7.07043E+01         4.38817E+02         2.12883E+02         2.25935E+02
+          4.94852E-03         2.22709E-02        -1.59704E-02         3.10848E-01         1.61865E+00         3.11258E-01         4.73654E+02         9.97691E-01         7.01489E+01         4.33165E+02         2.11244E+02         2.21921E+02
+          4.94852E-03         2.24407E-02        -1.62090E-02         3.10847E-01         1.62932E+00         3.11269E-01         4.67116E+02         9.97700E-01         6.95478E+01         4.27327E+02         2.09420E+02         2.17907E+02
+          4.94852E-03         2.26106E-02        -1.64494E-02         3.10845E-01         1.63999E+00         3.11280E-01         4.60325E+02         9.97709E-01         6.89024E+01         4.21325E+02         2.07422E+02         2.13903E+02
+          4.94852E-03         2.27804E-02        -1.66916E-02         3.10844E-01         1.65066E+00         3.11292E-01         4.53310E+02         9.97719E-01         6.82142E+01         4.15180E+02         2.05263E+02         2.09917E+02
+          4.94852E-03         2.29502E-02        -1.69357E-02         3.10843E-01         1.66133E+00         3.11304E-01         4.46095E+02         9.97728E-01         6.74847E+01         4.08910E+02         2.02955E+02         2.05956E+02
+          4.94852E-03         2.31201E-02        -1.71815E-02         3.10842E-01         1.67200E+00         3.11316E-01         4.38706E+02         9.97738E-01         6.67157E+01         4.02538E+02         2.00511E+02         2.02027E+02
+          4.94852E-03         2.32899E-02        -1.74292E-02         3.10840E-01         1.68267E+00         3.11329E-01         4.31170E+02         9.97749E-01         6.59086E+01         3.96081E+02         1.97943E+02         1.98138E+02
+          4.94852E-03         2.34597E-02        -1.76787E-02         3.10839E-01         1.69334E+00         3.11342E-01         4.23510E+02         9.97759E-01         6.50652E+01         3.89559E+02         1.95264E+02         1.94295E+02
+          4.94852E-03         2.36295E-02        -1.79300E-02         3.10838E-01         1.70401E+00         3.11355E-01         4.15751E+02         9.97770E-01         6.41873E+01         3.82990E+02         1.92485E+02         1.90505E+02
+          4.94852E-03         2.37994E-02        -1.81831E-02         3.10837E-01         1.71468E+00         3.11368E-01         4.07916E+02         9.97780E-01         6.32764E+01         3.76392E+02         1.89620E+02         1.86772E+02
+          4.94852E-03         2.39692E-02        -1.84380E-02         3.10835E-01         1.72535E+00         3.11382E-01         4.00029E+02         9.97792E-01         6.23342E+01         3.69781E+02         1.86679E+02         1.83102E+02
+          4.94852E-03         2.41390E-02        -1.86948E-02         3.10834E-01         1.73602E+00         3.11396E-01         3.92112E+02         9.97803E-01         6.13626E+01         3.63174E+02         1.83674E+02         1.79500E+02
+          4.94852E-03         2.43088E-02        -1.89533E-02         3.10833E-01         1.74669E+00         3.11410E-01         3.84185E+02         9.97815E-01         6.03633E+01         3.56586E+02         1.80616E+02         1.75971E+02
+          4.94852E-03         2.44787E-02        -1.92137E-02         3.10832E-01         1.75736E+00         3.11425E-01         3.76270E+02         9.97826E-01         5.93378E+01         3.50032E+02         1.77515E+02         1.72517E+02
+          4.94852E-03         2.46485E-02        -1.94759E-02         3.10830E-01         1.76804E+00         3.11440E-01         3.68385E+02         9.97839E-01         5.82880E+01         3.43526E+02         1.74383E+02         1.69143E+02
+          4.94852E-03         2.48183E-02        -1.97399E-02         3.10829E-01         1.77871E+00         3.11455E-01         3.60549E+02         9.97851E-01         5.72155E+01         3.37080E+02         1.71228E+02         1.65851E+02
+          4.94852E-03         2.49882E-02        -2.00057E-02         3.10828E-01         1.78938E+00         3.11471E-01         3.52779E+02         9.97863E-01         5.61219E+01         3.30706E+02         1.68061E+02         1.62645E+02
+          4.94852E-03         2.51580E-02        -2.02733E-02         3.10826E-01         1.80005E+00         3.11487E-01         3.45092E+02         9.97876E-01         5.50090E+01         3.24416E+02         1.64890E+02         1.59526E+02
+          4.94852E-03         2.53278E-02        -2.05428E-02         3.10825E-01         1.81072E+00         3.11503E-01         3.37502E+02         9.97890E-01         5.38783E+01         3.18219E+02         1.61723E+02         1.56496E+02
+          4.94852E-03         2.54976E-02        -2.08140E-02         3.10824E-01         1.82139E+00         3.11520E-01         3.30025E+02         9.97903E-01         5.27314E+01         3.12126E+02         1.58570E+02         1.53556E+02
+          4.94852E-03         2.56675E-02        -2.10871E-02         3.10822E-01         1.83206E+00         3.11537E-01         3.22672E+02         9.97917E-01         5.15700E+01         3.06144E+02         1.55436E+02         1.50708E+02
+          4.94852E-03         2.58373E-02        -2.13620E-02         3.10821E-01         1.84273E+00         3.11554E-01         3.15457E+02         9.97931E-01         5.03955E+01         3.00282E+02         1.52330E+02         1.47952E+02
+          4.94852E-03         2.60071E-02        -2.16387E-02         3.10820E-01         1.85340E+00         3.11572E-01         3.08389E+02         9.97945E-01         4.92095E+01         2.94545E+02         1.49257E+02         1.45288E+02
+          4.94852E-03         2.61769E-02        -2.19172E-02         3.10818E-01         1.86407E+00         3.11590E-01         3.01480E+02         9.97959E-01         4.80135E+01         2.88941E+02         1.46224E+02         1.42717E+02
+          5.11835E-03         8.72665E-04        -4.64155E-04         3.21595E-01         2.74155E-01         3.21596E-01         1.20023E+04         1.00432E+00         1.12556E+03         1.13950E+04         9.26797E+03         2.12700E+03
+          5.11835E-03         1.04249E-03        -4.74373E-04         3.21595E-01         2.84826E-01         3.21596E-01         1.17776E+04         1.00432E+00         1.10694E+03         1.11808E+04         9.09701E+03         2.08376E+03
+          5.11835E-03         1.21232E-03        -4.86403E-04         3.21595E-01         2.95496E-01         3.21596E-01         1.15482E+04         1.00432E+00         1.08792E+03         1.09622E+04         8.92246E+03         2.03972E+03
+          5.11835E-03         1.38215E-03        -5.00245E-04         3.21595E-01         3.06167E-01         3.21595E-01         1.13146E+04         1.00432E+00         1.06854E+03         1.07396E+04         8.74462E+03         1.99499E+03
+          5.11835E-03         1.55197E-03        -5.15899E-04         3.21595E-01         3.16838E-01         3.21595E-01         1.10771E+04         1.00432E+00         1.04882E+03         1.05134E+04         8.56376E+03         1.94963E+03
+          5.11835E-03         1.72180E-03        -5.33366E-04         3.21595E-01         3.27508E-01         3.21595E-01         1.08361E+04         1.00432E+00         1.02881E+03         1.02839E+04         8.38017E+03         1.90374E+03
+          5.11835E-03         1.89163E-03        -5.52644E-04         3.21595E-01         3.38179E-01         3.21595E-01         1.05919E+04         1.00432E+00         1.00852E+03         1.00515E+04         8.19415E+03         1.85739E+03
+          5.11835E-03         2.06146E-03        -5.73735E-04         3.21595E-01         3.48849E-01         3.21595E-01         1.03451E+04         1.00432E+00         9.87985E+02         9.81665E+03         8.00598E+03         1.81067E+03
+          5.11835E-03         2.23128E-03        -5.96637E-04         3.21595E-01         3.59520E-01         3.21595E-01         1.00959E+04         1.00432E+00         9.67244E+02         9.57961E+03         7.81594E+03         1.76367E+03
+          5.11835E-03         2.40111E-03        -6.21352E-04         3.21594E-01         3.70190E-01         3.21595E-01         9.84471E+03         1.00432E+00         9.46323E+02         9.34078E+03         7.62434E+03         1.71645E+03
+          5.11835E-03         2.57094E-03        -6.47879E-04         3.21594E-01         3.80861E-01         3.21595E-01         9.59197E+03         1.00432E+00         9.25254E+02         9.10054E+03         7.43144E+03         1.66910E+03
+          5.11835E-03         2.74077E-03        -6.76219E-04         3.21594E-01         3.91532E-01         3.21595E-01         9.33802E+03         1.00432E+00         9.04066E+02         8.85925E+03         7.23755E+03         1.62170E+03
+          5.11835E-03         2.91059E-03        -7.06370E-04         3.21594E-01         4.02202E-01         3.21595E-01         9.08325E+03         1.00432E+00         8.82790E+02         8.61727E+03         7.04293E+03         1.57434E+03
+          5.11835E-03         3.08042E-03        -7.38333E-04         3.21594E-01         4.12873E-01         3.21595E-01         8.82801E+03         1.00432E+00         8.61456E+02         8.37494E+03         6.84787E+03         1.52708E+03
+          5.11835E-03         3.25025E-03        -7.72109E-04         3.21594E-01         4.23543E-01         3.21595E-01         8.57269E+03         1.00432E+00         8.40092E+02         8.13263E+03         6.65263E+03         1.48000E+03
+          5.11835E-03         3.42008E-03        -8.07697E-04         3.21594E-01         4.34214E-01         3.21595E-01         8.31763E+03         1.00432E+00         8.18727E+02         7.89066E+03         6.45749E+03         1.43317E+03
+          5.11835E-03         3.58990E-03        -8.45097E-04         3.21593E-01         4.44884E-01         3.21594E-01         8.06318E+03         1.00432E+00         7.97390E+02         7.64938E+03         6.26271E+03         1.38667E+03
+          5.11835E-03         3.75973E-03        -8.84309E-04         3.21593E-01         4.55555E-01         3.21594E-01         7.80969E+03         1.00432E+00         7.76107E+02         7.40911E+03         6.06854E+03         1.34057E+03
+          5.11835E-03         3.92956E-03        -9.25333E-04         3.21593E-01         4.66225E-01         3.21594E-01         7.55750E+03         1.00432E+00         7.54906E+02         7.17017E+03         5.87525E+03         1.29492E+03
+          5.11835E-03         4.09939E-03        -9.68170E-04         3.21593E-01         4.76896E-01         3.21594E-01         7.30692E+03         1.00432E+00         7.33813E+02         6.93287E+03         5.68306E+03         1.24981E+03
+          5.11835E-03         4.26921E-03        -1.01282E-03         3.21592E-01         4.87567E-01         3.21594E-01         7.05827E+03         1.00432E+00         7.12852E+02         6.69751E+03         5.49223E+03         1.20528E+03
+          5.11835E-03         4.43904E-03        -1.05928E-03         3.21592E-01         4.98237E-01         3.21594E-01         6.81186E+03         1.00432E+00         6.92049E+02         6.46437E+03         5.30297E+03         1.16140E+03
+          5.11835E-03         4.60887E-03        -1.10755E-03         3.21592E-01         5.08908E-01         3.21594E-01         6.56799E+03         1.00432E+00         6.71426E+02         6.23374E+03         5.11551E+03         1.11823E+03
+          5.11835E-03         4.77869E-03        -1.15764E-03         3.21592E-01         5.19578E-01         3.21594E-01         6.32693E+03         1.00432E+00         6.51006E+02         6.00589E+03         4.93007E+03         1.07581E+03
+          5.11835E-03         4.94852E-03        -1.20953E-03         3.21591E-01         5.30249E-01         3.21594E-01         6.08895E+03         1.00432E+00         6.30811E+02         5.78105E+03         4.74685E+03         1.03421E+03
+          5.11835E-03         5.11835E-03        -1.26324E-03         3.21591E-01         5.40919E-01         3.21594E-01         5.85432E+03         1.00432E+00         6.10862E+02         5.55949E+03         4.56603E+03         9.93459E+02
+          5.11835E-03         5.28818E-03        -1.31877E-03         3.21591E-01         5.51590E-01         3.21594E-01         5.62328E+03         1.00432E+00         5.91178E+02         5.34143E+03         4.38782E+03         9.53611E+02
+          5.11835E-03         5.45800E-03        -1.37610E-03         3.21591E-01         5.62261E-01         3.21594E-01         5.39607E+03         1.00432E+00         5.71777E+02         5.12709E+03         4.21238E+03         9.14707E+02
+          5.11835E-03         5.62783E-03        -1.43525E-03         3.21590E-01         5.72931E-01         3.21594E-01         5.17290E+03         1.00432E+00         5.52676E+02         4.91667E+03         4.03988E+03         8.76784E+02
+          5.11835E-03         5.79766E-03        -1.49621E-03         3.21590E-01         5.83602E-01         3.21593E-01         4.95398E+03         1.00432E+00         5.33893E+02         4.71036E+03         3.87049E+03         8.39877E+02
+          5.11835E-03         5.96749E-03        -1.55898E-03         3.21590E-01         5.94272E-01         3.21593E-01         4.73951E+03         1.00432E+00         5.15442E+02         4.50835E+03         3.70433E+03         8.04018E+02
+          5.11835E-03         6.13731E-03        -1.62356E-03         3.21589E-01         6.04943E-01         3.21593E-01         4.52965E+03         1.00432E+00         4.97338E+02         4.31080E+03         3.54156E+03         7.69235E+02
+          5.11835E-03         6.30714E-03        -1.68995E-03         3.21589E-01         6.15613E-01         3.21593E-01         4.32459E+03         1.00432E+00         4.79593E+02         4.11785E+03         3.38230E+03         7.35554E+02
+          5.11835E-03         6.47697E-03        -1.75816E-03         3.21589E-01         6.26284E-01         3.21593E-01         4.12446E+03         1.00432E+00         4.62218E+02         3.92966E+03         3.22666E+03         7.02996E+02
+          5.11835E-03         6.64680E-03        -1.82818E-03         3.21588E-01         6.36955E-01         3.21593E-01         3.92941E+03         1.00432E+00         4.45225E+02         3.74633E+03         3.07475E+03         6.71579E+02
+          5.11835E-03         6.81662E-03        -1.90001E-03         3.21588E-01         6.47625E-01         3.21594E-01         3.73956E+03         1.00432E+00         4.28623E+02         3.56798E+03         2.92666E+03         6.41320E+02
+          5.11835E-03         6.98645E-03        -1.97366E-03         3.21588E-01         6.58296E-01         3.21594E-01         3.55501E+03         1.00432E+00         4.12420E+02         3.39472E+03         2.78249E+03         6.12228E+02
+          5.11835E-03         7.15628E-03        -2.04911E-03         3.21587E-01         6.68966E-01         3.21594E-01         3.37587E+03         1.00432E+00         3.96623E+02         3.22661E+03         2.64229E+03         5.84315E+02
+          5.11835E-03         7.32611E-03        -2.12638E-03         3.21587E-01         6.79637E-01         3.21594E-01         3.20220E+03         1.00432E+00         3.81238E+02         3.06373E+03         2.50615E+03         5.57584E+02
+          5.11835E-03         7.49593E-03        -2.20546E-03         3.21586E-01         6.90307E-01         3.21594E-01         3.03409E+03         1.00432E+00         3.66270E+02         2.90614E+03         2.37410E+03         5.32040E+02
+          5.11835E-03         7.66576E-03        -2.28636E-03         3.21586E-01         7.00978E-01         3.21594E-01         2.87158E+03         1.00432E+00         3.51722E+02         2.75389E+03         2.24620E+03         5.07680E+02
+          5.11835E-03         7.83559E-03        -2.36906E-03         3.21586E-01         7.11649E-01         3.21594E-01         2.71472E+03         1.00432E+00         3.37598E+02         2.60699E+03         2.12249E+03         4.84503E+02
+          5.11835E-03         8.00542E-03        -2.45358E-03         3.21585E-01         7.22319E-01         3.21594E-01         2.56353E+03         1.00432E+00         3.23898E+02         2.46548E+03         2.00297E+03         4.62502E+02
+          5.11835E-03         8.17524E-03        -2.53991E-03         3.21585E-01         7.32990E-01         3.21595E-01         2.41802E+03         1.00432E+00         3.10623E+02         2.32935E+03         1.88768E+03         4.41667E+02
+          5.11835E-03         8.34507E-03        -2.62805E-03         3.21584E-01         7.43660E-01         3.21595E-01         2.27820E+03         1.00432E+00         2.97772E+02         2.19861E+03         1.77662E+03         4.21988E+02
+          5.11835E-03         8.51490E-03        -2.71801E-03         3.21584E-01         7.54331E-01         3.21595E-01         2.14406E+03         1.00432E+00         2.85345E+02         2.07323E+03         1.66978E+03         4.03450E+02
+          5.11835E-03         8.68473E-03        -2.80977E-03         3.21583E-01         7.65001E-01         3.21596E-01         2.01558E+03         1.00432E+00         2.73338E+02         1.95319E+03         1.56715E+03         3.86037E+02
+          5.11835E-03         8.85455E-03        -2.90335E-03         3.21583E-01         7.75672E-01         3.21596E-01         1.89273E+03         1.00432E+00         2.61748E+02         1.83845E+03         1.46872E+03         3.69729E+02
+          5.11835E-03         9.02438E-03        -2.99875E-03         3.21582E-01         7.86343E-01         3.21596E-01         1.77545E+03         1.00432E+00         2.50572E+02         1.72897E+03         1.37446E+03         3.54507E+02
+          5.11835E-03         9.19421E-03        -3.09595E-03         3.21582E-01         7.97013E-01         3.21597E-01         1.66371E+03         1.00432E+00         2.39803E+02         1.62468E+03         1.28433E+03         3.40347E+02
+          5.11835E-03         9.36403E-03        -3.19497E-03         3.21581E-01         8.07684E-01         3.21597E-01         1.55743E+03         1.00432E+00         2.29437E+02         1.52551E+03         1.19829E+03         3.27223E+02
+          5.11835E-03         9.53386E-03        -3.29579E-03         3.21581E-01         8.18354E-01         3.21598E-01         1.45654E+03         1.00432E+00         2.19468E+02         1.43140E+03         1.11629E+03         3.15109E+02
+          5.11835E-03         9.70369E-03        -3.39844E-03         3.21580E-01         8.29025E-01         3.21598E-01         1.36096E+03         1.00432E+00         2.09887E+02         1.34226E+03         1.03828E+03         3.03978E+02
+          5.11835E-03         9.87352E-03        -3.50289E-03         3.21580E-01         8.39695E-01         3.21599E-01         1.27059E+03         1.00432E+00         2.00688E+02         1.25799E+03         9.64191E+02         2.93797E+02
+          5.11835E-03         1.00433E-02        -3.60916E-03         3.21579E-01         8.50366E-01         3.21599E-01         1.18534E+03         1.00432E+00         1.91863E+02         1.17849E+03         8.93956E+02         2.84537E+02
+          5.11835E-03         1.02132E-02        -3.71723E-03         3.21579E-01         8.61037E-01         3.21600E-01         1.10511E+03         1.00432E+00         1.83403E+02         1.10367E+03         8.27504E+02         2.76164E+02
+          5.11835E-03         1.03830E-02        -3.82712E-03         3.21578E-01         8.71707E-01         3.21601E-01         1.02977E+03         1.00432E+00         1.75300E+02         1.03340E+03         7.64754E+02         2.68646E+02
+          5.11835E-03         1.05528E-02        -3.93883E-03         3.21577E-01         8.82378E-01         3.21602E-01         9.59218E+02         1.00432E+00         1.67545E+02         9.67569E+02         7.05623E+02         2.61946E+02
+          5.11835E-03         1.07227E-02        -4.05234E-03         3.21577E-01         8.93048E-01         3.21602E-01         8.93315E+02         1.00432E+00         1.60129E+02         9.06054E+02         6.50024E+02         2.56029E+02
+          5.11835E-03         1.08925E-02        -4.16767E-03         3.21576E-01         9.03719E-01         3.21603E-01         8.31935E+02         1.00432E+00         1.53042E+02         8.48726E+02         5.97866E+02         2.50860E+02
+          5.11835E-03         1.10623E-02        -4.28481E-03         3.21576E-01         9.14389E-01         3.21604E-01         7.74942E+02         1.00432E+00         1.46276E+02         7.95452E+02         5.49051E+02         2.46401E+02
+          5.11835E-03         1.12321E-02        -4.40377E-03         3.21575E-01         9.25060E-01         3.21605E-01         7.22196E+02         1.00432E+00         1.39821E+02         7.46098E+02         5.03483E+02         2.42615E+02
+          5.11835E-03         1.14020E-02        -4.52453E-03         3.21574E-01         9.35731E-01         3.21606E-01         6.73552E+02         1.00433E+00         1.33669E+02         7.00523E+02         4.61059E+02         2.39464E+02
+          5.11835E-03         1.15718E-02        -4.64711E-03         3.21574E-01         9.46401E-01         3.21607E-01         6.28864E+02         1.00433E+00         1.27810E+02         6.58587E+02         4.21676E+02         2.36911E+02
+          5.11835E-03         1.17416E-02        -4.77150E-03         3.21573E-01         9.57072E-01         3.21609E-01         5.87983E+02         1.00433E+00         1.22237E+02         6.20145E+02         3.85227E+02         2.34917E+02
+          5.11835E-03         1.19114E-02        -4.89770E-03         3.21573E-01         9.67742E-01         3.21610E-01         5.50755E+02         1.00433E+00         1.16941E+02         5.85051E+02         3.51606E+02         2.33445E+02
+          5.11835E-03         1.20813E-02        -5.02572E-03         3.21572E-01         9.78413E-01         3.21611E-01         5.17028E+02         1.00433E+00         1.11915E+02         5.53161E+02         3.20703E+02         2.32458E+02
+          5.11835E-03         1.22511E-02        -5.15555E-03         3.21571E-01         9.89083E-01         3.21613E-01         4.86645E+02         1.00433E+00         1.07151E+02         5.24325E+02         2.92407E+02         2.31918E+02
+          5.11835E-03         1.24209E-02        -5.28719E-03         3.21571E-01         9.99754E-01         3.21614E-01         4.59453E+02         1.00433E+00         1.02644E+02         4.98396E+02         2.66609E+02         2.31787E+02
+          5.11835E-03         1.25908E-02        -5.42064E-03         3.21570E-01         1.01042E+00         3.21616E-01         4.35294E+02         1.00433E+00         9.83858E+01         4.75228E+02         2.43197E+02         2.32031E+02
+          5.11835E-03         1.27606E-02        -5.55591E-03         3.21569E-01         1.02110E+00         3.21617E-01         4.14012E+02         1.00433E+00         9.43723E+01         4.54672E+02         2.22059E+02         2.32612E+02
+          5.11835E-03         1.29304E-02        -5.69298E-03         3.21569E-01         1.03177E+00         3.21619E-01         3.95453E+02         1.00433E+00         9.05978E+01         4.36583E+02         2.03086E+02         2.33497E+02
+          5.11835E-03         1.31002E-02        -5.83187E-03         3.21568E-01         1.04244E+00         3.21621E-01         3.79462E+02         1.00433E+00         8.70579E+01         4.20817E+02         1.86167E+02         2.34650E+02
+          5.11835E-03         1.32701E-02        -5.97258E-03         3.21567E-01         1.05311E+00         3.21623E-01         3.65885E+02         1.00433E+00         8.37484E+01         4.07230E+02         1.71192E+02         2.36038E+02
+          5.11835E-03         1.34399E-02        -6.11509E-03         3.21566E-01         1.06378E+00         3.21624E-01         3.54573E+02         1.00433E+00         8.06653E+01         3.95682E+02         1.58053E+02         2.37629E+02
+          5.11835E-03         1.36097E-02        -6.25942E-03         3.21566E-01         1.07445E+00         3.21627E-01         3.45374E+02         1.00433E+00         7.78052E+01         3.86034E+02         1.46643E+02         2.39390E+02
+          5.11835E-03         1.37795E-02        -6.40556E-03         3.21565E-01         1.08512E+00         3.21629E-01         3.38143E+02         1.00434E+00         7.51646E+01         3.78150E+02         1.36857E+02         2.41293E+02
+          5.11835E-03         1.39494E-02        -6.55352E-03         3.21564E-01         1.09579E+00         3.21631E-01         3.32736E+02         1.00434E+00         7.27400E+01         3.71898E+02         1.28591E+02         2.43307E+02
+          5.11835E-03         1.41192E-02        -6.70329E-03         3.21563E-01         1.10646E+00         3.21633E-01         3.29011E+02         1.00434E+00         7.05280E+01         3.67148E+02         1.21743E+02         2.45405E+02
+          5.11835E-03         1.42890E-02        -6.85486E-03         3.21563E-01         1.11713E+00         3.21636E-01         3.26831E+02         1.00434E+00         6.85246E+01         3.63773E+02         1.16214E+02         2.47559E+02
+          5.11835E-03         1.44589E-02        -7.00826E-03         3.21562E-01         1.12780E+00         3.21638E-01         3.26062E+02         1.00434E+00         6.67254E+01         3.61652E+02         1.11907E+02         2.49745E+02
+          5.11835E-03         1.46287E-02        -7.16346E-03         3.21561E-01         1.13847E+00         3.21641E-01         3.26573E+02         1.00434E+00         6.51255E+01         3.60665E+02         1.08727E+02         2.51937E+02
+          5.11835E-03         1.47985E-02        -7.32048E-03         3.21560E-01         1.14914E+00         3.21643E-01         3.28238E+02         1.00434E+00         6.37190E+01         3.60697E+02         1.06584E+02         2.54113E+02
+          5.11835E-03         1.49683E-02        -7.47931E-03         3.21559E-01         1.15981E+00         3.21646E-01         3.30934E+02         1.00434E+00         6.24994E+01         3.61639E+02         1.05387E+02         2.56252E+02
+          5.11835E-03         1.51382E-02        -7.63995E-03         3.21559E-01         1.17048E+00         3.21649E-01         3.34545E+02         1.00435E+00         6.14592E+01         3.63385E+02         1.05052E+02         2.58333E+02
+          5.11835E-03         1.53080E-02        -7.80241E-03         3.21558E-01         1.18115E+00         3.21652E-01         3.38956E+02         1.00435E+00         6.05899E+01         3.65831E+02         1.05494E+02         2.60337E+02
+          5.11835E-03         1.54778E-02        -7.96668E-03         3.21557E-01         1.19182E+00         3.21656E-01         3.44059E+02         1.00435E+00         5.98821E+01         3.68882E+02         1.06635E+02         2.62247E+02
+          5.11835E-03         1.56476E-02        -8.13276E-03         3.21556E-01         1.20249E+00         3.21659E-01         3.49751E+02         1.00435E+00         5.93257E+01         3.72445E+02         1.08398E+02         2.64047E+02
+          5.11835E-03         1.58175E-02        -8.30065E-03         3.21555E-01         1.21317E+00         3.21662E-01         3.55931E+02         1.00435E+00         5.89098E+01         3.76432E+02         1.10709E+02         2.65723E+02
+          5.11835E-03         1.59873E-02        -8.47036E-03         3.21554E-01         1.22384E+00         3.21666E-01         3.62505E+02         1.00435E+00         5.86230E+01         3.80759E+02         1.13499E+02         2.67260E+02
+          5.11835E-03         1.61571E-02        -8.64188E-03         3.21553E-01         1.23451E+00         3.21670E-01         3.69384E+02         1.00436E+00         5.84534E+01         3.85349E+02         1.16701E+02         2.68648E+02
+          5.11835E-03         1.63270E-02        -8.81521E-03         3.21553E-01         1.24518E+00         3.21673E-01         3.76485E+02         1.00436E+00         5.83891E+01         3.90127E+02         1.20251E+02         2.69876E+02
+          5.11835E-03         1.64968E-02        -8.99036E-03         3.21552E-01         1.25585E+00         3.21677E-01         3.83726E+02         1.00436E+00         5.84182E+01         3.95025E+02         1.24091E+02         2.70934E+02
+          5.11835E-03         1.66666E-02        -9.16731E-03         3.21551E-01         1.26652E+00         3.21681E-01         3.91035E+02         1.00436E+00         5.85287E+01         3.99978E+02         1.28163E+02         2.71815E+02
+          5.11835E-03         1.68364E-02        -9.34608E-03         3.21550E-01         1.27719E+00         3.21686E-01         3.98341E+02         1.00436E+00         5.87090E+01         4.04926E+02         1.32414E+02         2.72511E+02
+          5.11835E-03         1.70063E-02        -9.52667E-03         3.21549E-01         1.28786E+00         3.21690E-01         4.05580E+02         1.00437E+00         5.89481E+01         4.09814E+02         1.36796E+02         2.73018E+02
+          5.11835E-03         1.71761E-02        -9.70907E-03         3.21548E-01         1.29853E+00         3.21695E-01         4.12691E+02         1.00437E+00         5.92353E+01         4.14592E+02         1.41260E+02         2.73332E+02
+          5.11835E-03         1.73459E-02        -9.89328E-03         3.21547E-01         1.30920E+00         3.21699E-01         4.19621E+02         1.00437E+00         5.95605E+01         4.19213E+02         1.45765E+02         2.73448E+02
+          5.11835E-03         1.75158E-02        -1.00793E-02         3.21546E-01         1.31987E+00         3.21704E-01         4.26319E+02         1.00437E+00         5.99143E+01         4.23636E+02         1.50270E+02         2.73365E+02
+          5.11835E-03         1.76856E-02        -1.02671E-02         3.21545E-01         1.33054E+00         3.21709E-01         4.32739E+02         1.00437E+00         6.02881E+01         4.27822E+02         1.54739E+02         2.73083E+02
+          5.11835E-03         1.78554E-02        -1.04568E-02         3.21544E-01         1.34121E+00         3.21714E-01         4.38841E+02         1.00438E+00         6.06736E+01         4.31738E+02         1.59137E+02         2.72601E+02
+          5.11835E-03         1.80252E-02        -1.06482E-02         3.21543E-01         1.35188E+00         3.21719E-01         4.44587E+02         1.00438E+00         6.10636E+01         4.35355E+02         1.63435E+02         2.71920E+02
+          5.11835E-03         1.81951E-02        -1.08415E-02         3.21542E-01         1.36255E+00         3.21725E-01         4.49945E+02         1.00438E+00         6.14514E+01         4.38646E+02         1.67604E+02         2.71043E+02
+          5.11835E-03         1.83649E-02        -1.10366E-02         3.21541E-01         1.37322E+00         3.21731E-01         4.54887E+02         1.00438E+00         6.18307E+01         4.41590E+02         1.71619E+02         2.69971E+02
+          5.11835E-03         1.85347E-02        -1.12335E-02         3.21540E-01         1.38389E+00         3.21736E-01         4.59388E+02         1.00439E+00         6.21963E+01         4.44168E+02         1.75459E+02         2.68709E+02
+          5.11835E-03         1.87045E-02        -1.14322E-02         3.21539E-01         1.39457E+00         3.21742E-01         4.63429E+02         1.00439E+00         6.25431E+01         4.46365E+02         1.79103E+02         2.67262E+02
+          5.11835E-03         1.88744E-02        -1.16327E-02         3.21538E-01         1.40524E+00         3.21748E-01         4.66993E+02         1.00439E+00         6.28669E+01         4.48168E+02         1.82535E+02         2.65633E+02
+          5.11835E-03         1.90442E-02        -1.18351E-02         3.21537E-01         1.41591E+00         3.21755E-01         4.70065E+02         1.00440E+00         6.31639E+01         4.49569E+02         1.85741E+02         2.63829E+02
+          5.11835E-03         1.92140E-02        -1.20392E-02         3.21536E-01         1.42658E+00         3.21761E-01         4.72638E+02         1.00440E+00         6.34307E+01         4.50563E+02         1.88707E+02         2.61856E+02
+          5.11835E-03         1.93839E-02        -1.22452E-02         3.21535E-01         1.43725E+00         3.21768E-01         4.74704E+02         1.00440E+00         6.36645E+01         4.51145E+02         1.91424E+02         2.59720E+02
+          5.11835E-03         1.95537E-02        -1.24530E-02         3.21534E-01         1.44792E+00         3.21775E-01         4.76259E+02         1.00441E+00         6.38627E+01         4.51315E+02         1.93885E+02         2.57430E+02
+          5.11835E-03         1.97235E-02        -1.26626E-02         3.21533E-01         1.45859E+00         3.21782E-01         4.77304E+02         1.00441E+00         6.40234E+01         4.51075E+02         1.96082E+02         2.54992E+02
+          5.11835E-03         1.98933E-02        -1.28740E-02         3.21532E-01         1.46926E+00         3.21789E-01         4.77840E+02         1.00441E+00         6.41448E+01         4.50429E+02         1.98013E+02         2.52415E+02
+          5.11835E-03         2.00632E-02        -1.30872E-02         3.21531E-01         1.47993E+00         3.21797E-01         4.77871E+02         1.00442E+00         6.42255E+01         4.49382E+02         1.99675E+02         2.49707E+02
+          5.11835E-03         2.02330E-02        -1.33022E-02         3.21530E-01         1.49060E+00         3.21805E-01         4.77406E+02         1.00442E+00         6.42644E+01         4.47944E+02         2.01067E+02         2.46877E+02
+          5.11835E-03         2.04028E-02        -1.35191E-02         3.21528E-01         1.50127E+00         3.21813E-01         4.76452E+02         1.00442E+00         6.42607E+01         4.46123E+02         2.02190E+02         2.43933E+02
+          5.11835E-03         2.05726E-02        -1.37377E-02         3.21527E-01         1.51194E+00         3.21821E-01         4.75021E+02         1.00443E+00         6.42139E+01         4.43931E+02         2.03046E+02         2.40885E+02
+          5.11835E-03         2.07425E-02        -1.39582E-02         3.21526E-01         1.52261E+00         3.21829E-01         4.73126E+02         1.00443E+00         6.41235E+01         4.41381E+02         2.03640E+02         2.37741E+02
+          5.11835E-03         2.09123E-02        -1.41805E-02         3.21525E-01         1.53328E+00         3.21838E-01         4.70782E+02         1.00444E+00         6.39894E+01         4.38486E+02         2.03975E+02         2.34511E+02
+          5.11835E-03         2.10821E-02        -1.44046E-02         3.21524E-01         1.54395E+00         3.21846E-01         4.68005E+02         1.00444E+00         6.38118E+01         4.35262E+02         2.04059E+02         2.31204E+02
+          5.11835E-03         2.12520E-02        -1.46305E-02         3.21523E-01         1.55462E+00         3.21855E-01         4.64811E+02         1.00444E+00         6.35909E+01         4.31725E+02         2.03897E+02         2.27828E+02
+          5.11835E-03         2.14218E-02        -1.48582E-02         3.21522E-01         1.56529E+00         3.21865E-01         4.61221E+02         1.00445E+00         6.33270E+01         4.27891E+02         2.03497E+02         2.24394E+02
+          5.11835E-03         2.15916E-02        -1.50878E-02         3.21520E-01         1.57596E+00         3.21874E-01         4.57253E+02         1.00445E+00         6.30206E+01         4.23777E+02         2.02868E+02         2.20909E+02
+          5.11835E-03         2.17614E-02        -1.53191E-02         3.21519E-01         1.58664E+00         3.21884E-01         4.52927E+02         1.00446E+00         6.26725E+01         4.19403E+02         2.02020E+02         2.17384E+02
+          5.11835E-03         2.19313E-02        -1.55523E-02         3.21518E-01         1.59731E+00         3.21894E-01         4.48265E+02         1.00446E+00         6.22833E+01         4.14787E+02         2.00961E+02         2.13826E+02
+          5.11835E-03         2.21011E-02        -1.57873E-02         3.21517E-01         1.60798E+00         3.21904E-01         4.43289E+02         1.00447E+00         6.18540E+01         4.09947E+02         1.99703E+02         2.10244E+02
+          5.11835E-03         2.22709E-02        -1.60241E-02         3.21516E-01         1.61865E+00         3.21915E-01         4.38021E+02         1.00447E+00         6.13856E+01         4.04902E+02         1.98256E+02         2.06646E+02
+          5.11835E-03         2.24407E-02        -1.62627E-02         3.21514E-01         1.62932E+00         3.21925E-01         4.32484E+02         1.00448E+00         6.08789E+01         3.99671E+02         1.96631E+02         2.03041E+02
+          5.11835E-03         2.26106E-02        -1.65031E-02         3.21513E-01         1.63999E+00         3.21936E-01         4.26699E+02         1.00448E+00         6.03352E+01         3.94274E+02         1.94839E+02         1.99436E+02
+          5.11835E-03         2.27804E-02        -1.67453E-02         3.21512E-01         1.65066E+00         3.21948E-01         4.20691E+02         1.00449E+00         5.97556E+01         3.88730E+02         1.92892E+02         1.95838E+02
+          5.11835E-03         2.29502E-02        -1.69894E-02         3.21511E-01         1.66133E+00         3.21959E-01         4.14481E+02         1.00449E+00         5.91414E+01         3.83056E+02         1.90801E+02         1.92255E+02
+          5.11835E-03         2.31201E-02        -1.72352E-02         3.21509E-01         1.67200E+00         3.21971E-01         4.08092E+02         1.00450E+00         5.84937E+01         3.77272E+02         1.88578E+02         1.88694E+02
+          5.11835E-03         2.32899E-02        -1.74829E-02         3.21508E-01         1.68267E+00         3.21983E-01         4.01547E+02         1.00451E+00         5.78138E+01         3.71396E+02         1.86235E+02         1.85161E+02
+          5.11835E-03         2.34597E-02        -1.77324E-02         3.21507E-01         1.69334E+00         3.21996E-01         3.94867E+02         1.00451E+00         5.71032E+01         3.65445E+02         1.83783E+02         1.81662E+02
+          5.11835E-03         2.36295E-02        -1.79837E-02         3.21506E-01         1.70401E+00         3.22008E-01         3.88074E+02         1.00452E+00         5.63630E+01         3.59436E+02         1.81233E+02         1.78203E+02
+          5.11835E-03         2.37994E-02        -1.82368E-02         3.21504E-01         1.71468E+00         3.22021E-01         3.81190E+02         1.00452E+00         5.55948E+01         3.53387E+02         1.78597E+02         1.74790E+02
+          5.11835E-03         2.39692E-02        -1.84917E-02         3.21503E-01         1.72535E+00         3.22034E-01         3.74235E+02         1.00453E+00         5.47998E+01         3.47312E+02         1.75886E+02         1.71426E+02
+          5.11835E-03         2.41390E-02        -1.87485E-02         3.21502E-01         1.73602E+00         3.22048E-01         3.67229E+02         1.00454E+00         5.39795E+01         3.41228E+02         1.73110E+02         1.68118E+02
+          5.11835E-03         2.43088E-02        -1.90070E-02         3.21500E-01         1.74669E+00         3.22062E-01         3.60191E+02         1.00454E+00         5.31351E+01         3.35148E+02         1.70280E+02         1.64869E+02
+          5.11835E-03         2.44787E-02        -1.92674E-02         3.21499E-01         1.75736E+00         3.22076E-01         3.53140E+02         1.00455E+00         5.22683E+01         3.29088E+02         1.67406E+02         1.61683E+02
+          5.11835E-03         2.46485E-02        -1.95296E-02         3.21498E-01         1.76804E+00         3.22090E-01         3.46093E+02         1.00456E+00         5.13802E+01         3.23060E+02         1.64497E+02         1.58563E+02
+          5.11835E-03         2.48183E-02        -1.97936E-02         3.21496E-01         1.77871E+00         3.22105E-01         3.39068E+02         1.00456E+00         5.04722E+01         3.17077E+02         1.61564E+02         1.55513E+02
+          5.11835E-03         2.49882E-02        -2.00594E-02         3.21495E-01         1.78938E+00         3.22120E-01         3.32080E+02         1.00457E+00         4.95459E+01         3.11150E+02         1.58614E+02         1.52536E+02
+          5.11835E-03         2.51580E-02        -2.03270E-02         3.21494E-01         1.80005E+00         3.22136E-01         3.25146E+02         1.00458E+00         4.86024E+01         3.05290E+02         1.55657E+02         1.49633E+02
+          5.11835E-03         2.53278E-02        -2.05965E-02         3.21492E-01         1.81072E+00         3.22151E-01         3.18278E+02         1.00458E+00         4.76432E+01         2.99508E+02         1.52701E+02         1.46807E+02
+          5.11835E-03         2.54976E-02        -2.08677E-02         3.21491E-01         1.82139E+00         3.22167E-01         3.11491E+02         1.00459E+00         4.66696E+01         2.93812E+02         1.49753E+02         1.44060E+02
+          5.11835E-03         2.56675E-02        -2.11408E-02         3.21489E-01         1.83206E+00         3.22184E-01         3.04798E+02         1.00460E+00         4.56828E+01         2.88212E+02         1.46820E+02         1.41392E+02
+          5.11835E-03         2.58373E-02        -2.14157E-02         3.21488E-01         1.84273E+00         3.22201E-01         2.98209E+02         1.00461E+00         4.46842E+01         2.82714E+02         1.43909E+02         1.38805E+02
+          5.11835E-03         2.60071E-02        -2.16923E-02         3.21487E-01         1.85340E+00         3.22218E-01         2.91736E+02         1.00462E+00         4.36751E+01         2.77326E+02         1.41026E+02         1.36299E+02
+          5.11835E-03         2.61769E-02        -2.19709E-02         3.21485E-01         1.86407E+00         3.22235E-01         2.85388E+02         1.00462E+00         4.26567E+01         2.72053E+02         1.38178E+02         1.33875E+02
+          5.28818E-03         8.72665E-04        -5.19678E-04         3.32266E-01         2.74155E-01         3.32266E-01         1.09851E+04         1.00808E+00         9.24328E+02         1.05286E+04         8.65226E+03         1.87633E+03
+          5.28818E-03         1.04249E-03        -5.29896E-04         3.32266E-01         2.84826E-01         3.32266E-01         1.07826E+04         1.00808E+00         9.09223E+02         1.03331E+04         8.49376E+03         1.83938E+03
+          5.28818E-03         1.21232E-03        -5.41926E-04         3.32266E-01         2.95496E-01         3.32266E-01         1.05758E+04         1.00808E+00         8.93796E+02         1.01337E+04         8.33192E+03         1.80173E+03
+          5.28818E-03         1.38215E-03        -5.55768E-04         3.32266E-01         3.06167E-01         3.32266E-01         1.03652E+04         1.00808E+00         8.78072E+02         9.93048E+03         8.16700E+03         1.76347E+03
+          5.28818E-03         1.55197E-03        -5.71422E-04         3.32266E-01         3.16838E-01         3.32266E-01         1.01509E+04         1.00808E+00         8.62076E+02         9.72393E+03         7.99927E+03         1.72466E+03
+          5.28818E-03         1.72180E-03        -5.88888E-04         3.32265E-01         3.27508E-01         3.32266E-01         9.93349E+03         1.00808E+00         8.45832E+02         9.51435E+03         7.82898E+03         1.68537E+03
+          5.28818E-03         1.89163E-03        -6.08167E-04         3.32265E-01         3.38179E-01         3.32266E-01         9.71318E+03         1.00808E+00         8.29366E+02         9.30207E+03         7.65641E+03         1.64566E+03
+          5.28818E-03         2.06146E-03        -6.29257E-04         3.32265E-01         3.48849E-01         3.32266E-01         9.49035E+03         1.00808E+00         8.12702E+02         9.08743E+03         7.48182E+03         1.60561E+03
+          5.28818E-03         2.23128E-03        -6.52160E-04         3.32265E-01         3.59520E-01         3.32266E-01         9.26534E+03         1.00808E+00         7.95866E+02         8.87077E+03         7.30547E+03         1.56529E+03
+          5.28818E-03         2.40111E-03        -6.76875E-04         3.32265E-01         3.70190E-01         3.32266E-01         9.03848E+03         1.00808E+00         7.78881E+02         8.65241E+03         7.12764E+03         1.52477E+03
+          5.28818E-03         2.57094E-03        -7.03402E-04         3.32265E-01         3.80861E-01         3.32266E-01         8.81013E+03         1.00808E+00         7.61774E+02         8.43269E+03         6.94859E+03         1.48410E+03
+          5.28818E-03         2.74077E-03        -7.31741E-04         3.32265E-01         3.91532E-01         3.32266E-01         8.58062E+03         1.00808E+00         7.44569E+02         8.21194E+03         6.76857E+03         1.44337E+03
+          5.28818E-03         2.91059E-03        -7.61892E-04         3.32265E-01         4.02202E-01         3.32265E-01         8.35028E+03         1.00808E+00         7.27289E+02         7.99048E+03         6.58785E+03         1.40263E+03
+          5.28818E-03         3.08042E-03        -7.93856E-04         3.32264E-01         4.12873E-01         3.32265E-01         8.11946E+03         1.00808E+00         7.09960E+02         7.76864E+03         6.40669E+03         1.36195E+03
+          5.28818E-03         3.25025E-03        -8.27631E-04         3.32264E-01         4.23543E-01         3.32265E-01         7.88846E+03         1.00808E+00         6.92603E+02         7.54673E+03         6.22533E+03         1.32140E+03
+          5.28818E-03         3.42008E-03        -8.63219E-04         3.32264E-01         4.34214E-01         3.32265E-01         7.65762E+03         1.00808E+00         6.75244E+02         7.32506E+03         6.04403E+03         1.28103E+03
+          5.28818E-03         3.58990E-03        -9.00619E-04         3.32264E-01         4.44884E-01         3.32265E-01         7.42725E+03         1.00808E+00         6.57904E+02         7.10394E+03         5.86302E+03         1.24092E+03
+          5.28818E-03         3.75973E-03        -9.39831E-04         3.32264E-01         4.55555E-01         3.32265E-01         7.19765E+03         1.00808E+00         6.40605E+02         6.88366E+03         5.68256E+03         1.20111E+03
+          5.28818E-03         3.92956E-03        -9.80855E-04         3.32263E-01         4.66225E-01         3.32265E-01         6.96913E+03         1.00808E+00         6.23370E+02         6.66452E+03         5.50286E+03         1.16166E+03
+          5.28818E-03         4.09939E-03        -1.02369E-03         3.32263E-01         4.76896E-01         3.32265E-01         6.74198E+03         1.00808E+00         6.06219E+02         6.44679E+03         5.32415E+03         1.12263E+03
+          5.28818E-03         4.26921E-03        -1.06834E-03         3.32263E-01         4.87567E-01         3.32265E-01         6.51649E+03         1.00808E+00         5.89173E+02         6.23075E+03         5.14667E+03         1.08408E+03
+          5.28818E-03         4.43904E-03        -1.11480E-03         3.32263E-01         4.98237E-01         3.32265E-01         6.29292E+03         1.00808E+00         5.72252E+02         6.01666E+03         4.97061E+03         1.04605E+03
+          5.28818E-03         4.60887E-03        -1.16307E-03         3.32262E-01         5.08908E-01         3.32264E-01         6.07154E+03         1.00808E+00         5.55474E+02         5.80477E+03         4.79618E+03         1.00859E+03
+          5.28818E-03         4.77869E-03        -1.21316E-03         3.32262E-01         5.19578E-01         3.32264E-01         5.85261E+03         1.00808E+00         5.38858E+02         5.59534E+03         4.62359E+03         9.71752E+02
+          5.28818E-03         4.94852E-03        -1.26506E-03         3.32262E-01         5.30249E-01         3.32264E-01         5.63638E+03         1.00808E+00         5.22422E+02         5.38859E+03         4.45302E+03         9.35577E+02
+          5.28818E-03         5.11835E-03        -1.31877E-03         3.32262E-01         5.40919E-01         3.32264E-01         5.42307E+03         1.00808E+00         5.06181E+02         5.18476E+03         4.28465E+03         9.00107E+02
+          5.28818E-03         5.28818E-03        -1.37429E-03         3.32261E-01         5.51590E-01         3.32264E-01         5.21292E+03         1.00808E+00         4.90153E+02         4.98404E+03         4.11866E+03         8.65381E+02
+          5.28818E-03         5.45800E-03        -1.43162E-03         3.32261E-01         5.62261E-01         3.32264E-01         5.00612E+03         1.00808E+00         4.74351E+02         4.78664E+03         3.95521E+03         8.31435E+02
+          5.28818E-03         5.62783E-03        -1.49077E-03         3.32261E-01         5.72931E-01         3.32264E-01         4.80289E+03         1.00808E+00         4.58791E+02         4.59276E+03         3.79445E+03         7.98303E+02
+          5.28818E-03         5.79766E-03        -1.55173E-03         3.32260E-01         5.83602E-01         3.32264E-01         4.60341E+03         1.00808E+00         4.43486E+02         4.40256E+03         3.63654E+03         7.66017E+02
+          5.28818E-03         5.96749E-03        -1.61450E-03         3.32260E-01         5.94272E-01         3.32264E-01         4.40786E+03         1.00808E+00         4.28447E+02         4.21621E+03         3.48161E+03         7.34604E+02
+          5.28818E-03         6.13731E-03        -1.67908E-03         3.32260E-01         6.04943E-01         3.32264E-01         4.21640E+03         1.00808E+00         4.13686E+02         4.03387E+03         3.32978E+03         7.04091E+02
+          5.28818E-03         6.30714E-03        -1.74548E-03         3.32259E-01         6.15613E-01         3.32264E-01         4.02918E+03         1.00808E+00         3.99214E+02         3.85568E+03         3.18119E+03         6.74499E+02
+          5.28818E-03         6.47697E-03        -1.81368E-03         3.32259E-01         6.26284E-01         3.32264E-01         3.84634E+03         1.00808E+00         3.85040E+02         3.68177E+03         3.03592E+03         6.45850E+02
+          5.28818E-03         6.64680E-03        -1.88370E-03         3.32259E-01         6.36955E-01         3.32264E-01         3.66801E+03         1.00808E+00         3.71174E+02         3.51225E+03         2.89409E+03         6.18160E+02
+          5.28818E-03         6.81662E-03        -1.95553E-03         3.32258E-01         6.47625E-01         3.32264E-01         3.49431E+03         1.00808E+00         3.57621E+02         3.34723E+03         2.75579E+03         5.91445E+02
+          5.28818E-03         6.98645E-03        -2.02918E-03         3.32258E-01         6.58296E-01         3.32264E-01         3.32532E+03         1.00808E+00         3.44391E+02         3.18680E+03         2.62108E+03         5.65716E+02
+          5.28818E-03         7.15628E-03        -2.10463E-03         3.32257E-01         6.68966E-01         3.32264E-01         3.16115E+03         1.00808E+00         3.31487E+02         3.03104E+03         2.49005E+03         5.40983E+02
+          5.28818E-03         7.32611E-03        -2.18190E-03         3.32257E-01         6.79637E-01         3.32264E-01         3.00187E+03         1.00808E+00         3.18916E+02         2.88001E+03         2.36276E+03         5.17251E+02
+          5.28818E-03         7.49593E-03        -2.26098E-03         3.32257E-01         6.90307E-01         3.32264E-01         2.84754E+03         1.00808E+00         3.06680E+02         2.73378E+03         2.23926E+03         4.94526E+02
+          5.28818E-03         7.66576E-03        -2.34188E-03         3.32256E-01         7.00978E-01         3.32264E-01         2.69822E+03         1.00808E+00         2.94784E+02         2.59239E+03         2.11958E+03         4.72808E+02
+          5.28818E-03         7.83559E-03        -2.42458E-03         3.32256E-01         7.11649E-01         3.32265E-01         2.55395E+03         1.00808E+00         2.83229E+02         2.45587E+03         2.00377E+03         4.52097E+02
+          5.28818E-03         8.00542E-03        -2.50910E-03         3.32255E-01         7.22319E-01         3.32265E-01         2.41476E+03         1.00808E+00         2.72017E+02         2.32424E+03         1.89185E+03         4.32390E+02
+          5.28818E-03         8.17524E-03        -2.59543E-03         3.32255E-01         7.32990E-01         3.32265E-01         2.28066E+03         1.00808E+00         2.61148E+02         2.19751E+03         1.78384E+03         4.13679E+02
+          5.28818E-03         8.34507E-03        -2.68357E-03         3.32254E-01         7.43660E-01         3.32265E-01         2.15167E+03         1.00808E+00         2.50622E+02         2.07569E+03         1.67973E+03         3.95959E+02
+          5.28818E-03         8.51490E-03        -2.77353E-03         3.32254E-01         7.54331E-01         3.32265E-01         2.02777E+03         1.00808E+00         2.40438E+02         1.95876E+03         1.57955E+03         3.79217E+02
+          5.28818E-03         8.68473E-03        -2.86529E-03         3.32253E-01         7.65001E-01         3.32266E-01         1.90896E+03         1.00808E+00         2.30594E+02         1.84671E+03         1.48327E+03         3.63443E+02
+          5.28818E-03         8.85455E-03        -2.95887E-03         3.32253E-01         7.75672E-01         3.32266E-01         1.79521E+03         1.00808E+00         2.21087E+02         1.73949E+03         1.39087E+03         3.48621E+02
+          5.28818E-03         9.02438E-03        -3.05427E-03         3.32252E-01         7.86343E-01         3.32266E-01         1.68648E+03         1.00808E+00         2.11915E+02         1.63708E+03         1.30235E+03         3.34735E+02
+          5.28818E-03         9.19421E-03        -3.15147E-03         3.32252E-01         7.97013E-01         3.32267E-01         1.58273E+03         1.00808E+00         2.03073E+02         1.53943E+03         1.21766E+03         3.21768E+02
+          5.28818E-03         9.36403E-03        -3.25049E-03         3.32251E-01         8.07684E-01         3.32267E-01         1.48392E+03         1.00808E+00         1.94557E+02         1.44646E+03         1.13677E+03         3.09700E+02
+          5.28818E-03         9.53386E-03        -3.35131E-03         3.32251E-01         8.18354E-01         3.32268E-01         1.38997E+03         1.00808E+00         1.86362E+02         1.35814E+03         1.05963E+03         2.98509E+02
+          5.28818E-03         9.70369E-03        -3.45396E-03         3.32250E-01         8.29025E-01         3.32268E-01         1.30081E+03         1.00808E+00         1.78482E+02         1.27437E+03         9.86195E+02         2.88173E+02
+          5.28818E-03         9.87352E-03        -3.55841E-03         3.32250E-01         8.39695E-01         3.32269E-01         1.21638E+03         1.00808E+00         1.70912E+02         1.19508E+03         9.16412E+02         2.78667E+02
+          5.28818E-03         1.00433E-02        -3.66468E-03         3.32249E-01         8.50366E-01         3.32269E-01         1.13659E+03         1.00808E+00         1.63646E+02         1.12018E+03         8.50215E+02         2.69966E+02
+          5.28818E-03         1.02132E-02        -3.77275E-03         3.32249E-01         8.61037E-01         3.32270E-01         1.06133E+03         1.00808E+00         1.56676E+02         1.04958E+03         7.87540E+02         2.62043E+02
+          5.28818E-03         1.03830E-02        -3.88264E-03         3.32248E-01         8.71707E-01         3.32271E-01         9.90531E+02         1.00808E+00         1.49996E+02         9.83186E+02         7.28314E+02         2.54871E+02
+          5.28818E-03         1.05528E-02        -3.99435E-03         3.32247E-01         8.82378E-01         3.32271E-01         9.24070E+02         1.00808E+00         1.43600E+02         9.20884E+02         6.72462E+02         2.48422E+02
+          5.28818E-03         1.07227E-02        -4.10786E-03         3.32247E-01         8.93048E-01         3.32272E-01         8.61843E+02         1.00808E+00         1.37478E+02         8.62569E+02         6.19904E+02         2.42665E+02
+          5.28818E-03         1.08925E-02        -4.22319E-03         3.32246E-01         9.03719E-01         3.32273E-01         8.03737E+02         1.00808E+00         1.31626E+02         8.08126E+02         5.70556E+02         2.37570E+02
+          5.28818E-03         1.10623E-02        -4.34033E-03         3.32246E-01         9.14389E-01         3.32274E-01         7.49632E+02         1.00808E+00         1.26035E+02         7.57439E+02         5.24331E+02         2.33108E+02
+          5.28818E-03         1.12321E-02        -4.45928E-03         3.32245E-01         9.25060E-01         3.32275E-01         6.99406E+02         1.00808E+00         1.20698E+02         7.10385E+02         4.81139E+02         2.29246E+02
+          5.28818E-03         1.14020E-02        -4.58005E-03         3.32244E-01         9.35731E-01         3.32276E-01         6.52933E+02         1.00808E+00         1.15607E+02         6.66841E+02         4.40886E+02         2.25954E+02
+          5.28818E-03         1.15718E-02        -4.70263E-03         3.32244E-01         9.46401E-01         3.32277E-01         6.10084E+02         1.00808E+00         1.10758E+02         6.26679E+02         4.03479E+02         2.23200E+02
+          5.28818E-03         1.17416E-02        -4.82702E-03         3.32243E-01         9.57072E-01         3.32278E-01         5.70726E+02         1.00808E+00         1.06141E+02         5.89770E+02         3.68818E+02         2.20951E+02
+          5.28818E-03         1.19114E-02        -4.95322E-03         3.32242E-01         9.67742E-01         3.32279E-01         5.34726E+02         1.00808E+00         1.01752E+02         5.55983E+02         3.36807E+02         2.19176E+02
+          5.28818E-03         1.20813E-02        -5.08124E-03         3.32242E-01         9.78413E-01         3.32281E-01         5.01947E+02         1.00808E+00         9.75830E+01         5.25186E+02         3.07343E+02         2.17843E+02
+          5.28818E-03         1.22511E-02        -5.21106E-03         3.32241E-01         9.89083E-01         3.32282E-01         4.72254E+02         1.00808E+00         9.36296E+01         4.97247E+02         2.80326E+02         2.16920E+02
+          5.28818E-03         1.24209E-02        -5.34270E-03         3.32240E-01         9.99754E-01         3.32283E-01         4.45507E+02         1.00808E+00         8.98860E+01         4.72031E+02         2.55654E+02         2.16376E+02
+          5.28818E-03         1.25908E-02        -5.47616E-03         3.32240E-01         1.01042E+00         3.32285E-01         4.21567E+02         1.00808E+00         8.63471E+01         4.49405E+02         2.33225E+02         2.16180E+02
+          5.28818E-03         1.27606E-02        -5.61142E-03         3.32239E-01         1.02110E+00         3.32286E-01         4.00298E+02         1.00808E+00         8.30084E+01         4.29235E+02         2.12935E+02         2.16300E+02
+          5.28818E-03         1.29304E-02        -5.74850E-03         3.32238E-01         1.03177E+00         3.32288E-01         3.81559E+02         1.00809E+00         7.98654E+01         4.11389E+02         1.94682E+02         2.16707E+02
+          5.28818E-03         1.31002E-02        -5.88739E-03         3.32237E-01         1.04244E+00         3.32290E-01         3.65213E+02         1.00809E+00         7.69144E+01         3.95735E+02         1.78364E+02         2.17371E+02
+          5.28818E-03         1.32701E-02        -6.02810E-03         3.32237E-01         1.05311E+00         3.32291E-01         3.51124E+02         1.00809E+00         7.41516E+01         3.82143E+02         1.63880E+02         2.18263E+02
+          5.28818E-03         1.34399E-02        -6.17061E-03         3.32236E-01         1.06378E+00         3.32293E-01         3.39156E+02         1.00809E+00         7.15736E+01         3.70484E+02         1.51130E+02         2.19354E+02
+          5.28818E-03         1.36097E-02        -6.31494E-03         3.32235E-01         1.07445E+00         3.32295E-01         3.29176E+02         1.00809E+00         6.91773E+01         3.60631E+02         1.40013E+02         2.20618E+02
+          5.28818E-03         1.37795E-02        -6.46108E-03         3.32234E-01         1.08512E+00         3.32297E-01         3.21051E+02         1.00809E+00         6.69595E+01         3.52460E+02         1.30433E+02         2.22027E+02
+          5.28818E-03         1.39494E-02        -6.60904E-03         3.32234E-01         1.09579E+00         3.32299E-01         3.14652E+02         1.00809E+00         6.49170E+01         3.45849E+02         1.22293E+02         2.23556E+02
+          5.28818E-03         1.41192E-02        -6.75880E-03         3.32233E-01         1.10646E+00         3.32302E-01         3.09852E+02         1.00809E+00         6.30466E+01         3.40679E+02         1.15499E+02         2.25180E+02
+          5.28818E-03         1.42890E-02        -6.91038E-03         3.32232E-01         1.11713E+00         3.32304E-01         3.06527E+02         1.00809E+00         6.13447E+01         3.36833E+02         1.09957E+02         2.26875E+02
+          5.28818E-03         1.44589E-02        -7.06377E-03         3.32231E-01         1.12780E+00         3.32306E-01         3.04556E+02         1.00809E+00         5.98077E+01         3.34198E+02         1.05579E+02         2.28619E+02
+          5.28818E-03         1.46287E-02        -7.21898E-03         3.32230E-01         1.13847E+00         3.32309E-01         3.03821E+02         1.00809E+00         5.84311E+01         3.32664E+02         1.02275E+02         2.30390E+02
+          5.28818E-03         1.47985E-02        -7.37600E-03         3.32230E-01         1.14914E+00         3.32311E-01         3.04206E+02         1.00809E+00         5.72103E+01         3.32126E+02         9.99598E+01         2.32166E+02
+          5.28818E-03         1.49683E-02        -7.53483E-03         3.32229E-01         1.15981E+00         3.32314E-01         3.05602E+02         1.00809E+00         5.61399E+01         3.32481E+02         9.85509E+01         2.33930E+02
+          5.28818E-03         1.51382E-02        -7.69547E-03         3.32228E-01         1.17048E+00         3.32317E-01         3.07900E+02         1.00809E+00         5.52137E+01         3.33629E+02         9.79676E+01         2.35661E+02
+          5.28818E-03         1.53080E-02        -7.85792E-03         3.32227E-01         1.18115E+00         3.32320E-01         3.10998E+02         1.00809E+00         5.44253E+01         3.35477E+02         9.81324E+01         2.37344E+02
+          5.28818E-03         1.54778E-02        -8.02219E-03         3.32226E-01         1.19182E+00         3.32323E-01         3.14796E+02         1.00809E+00         5.37674E+01         3.37933E+02         9.89705E+01         2.38962E+02
+          5.28818E-03         1.56476E-02        -8.18827E-03         3.32225E-01         1.20249E+00         3.32326E-01         3.19198E+02         1.00809E+00         5.32320E+01         3.40910E+02         1.00410E+02         2.40500E+02
+          5.28818E-03         1.58175E-02        -8.35617E-03         3.32224E-01         1.21317E+00         3.32329E-01         3.24114E+02         1.00809E+00         5.28109E+01         3.44327E+02         1.02382E+02         2.41945E+02
+          5.28818E-03         1.59873E-02        -8.52587E-03         3.32224E-01         1.22384E+00         3.32333E-01         3.29456E+02         1.00810E+00         5.24953E+01         3.48105E+02         1.04822E+02         2.43283E+02
+          5.28818E-03         1.61571E-02        -8.69739E-03         3.32223E-01         1.23451E+00         3.32336E-01         3.35143E+02         1.00810E+00         5.22762E+01         3.52170E+02         1.07665E+02         2.44505E+02
+          5.28818E-03         1.63270E-02        -8.87073E-03         3.32222E-01         1.24518E+00         3.32340E-01         3.41096E+02         1.00810E+00         5.21444E+01         3.56452E+02         1.10854E+02         2.45598E+02
+          5.28818E-03         1.64968E-02        -9.04587E-03         3.32221E-01         1.25585E+00         3.32344E-01         3.47241E+02         1.00810E+00         5.20906E+01         3.60886E+02         1.14330E+02         2.46555E+02
+          5.28818E-03         1.66666E-02        -9.22283E-03         3.32220E-01         1.26652E+00         3.32348E-01         3.53509E+02         1.00810E+00         5.21056E+01         3.65409E+02         1.18042E+02         2.47368E+02
+          5.28818E-03         1.68364E-02        -9.40160E-03         3.32219E-01         1.27719E+00         3.32352E-01         3.59835E+02         1.00810E+00         5.21805E+01         3.69966E+02         1.21938E+02         2.48029E+02
+          5.28818E-03         1.70063E-02        -9.58218E-03         3.32218E-01         1.28786E+00         3.32356E-01         3.66158E+02         1.00810E+00         5.23065E+01         3.74504E+02         1.25972E+02         2.48532E+02
+          5.28818E-03         1.71761E-02        -9.76458E-03         3.32217E-01         1.29853E+00         3.32360E-01         3.72421E+02         1.00810E+00         5.24752E+01         3.78972E+02         1.30099E+02         2.48873E+02
+          5.28818E-03         1.73459E-02        -9.94879E-03         3.32216E-01         1.30920E+00         3.32365E-01         3.78574E+02         1.00810E+00         5.26785E+01         3.83328E+02         1.34279E+02         2.49049E+02
+          5.28818E-03         1.75158E-02        -1.01348E-02         3.32215E-01         1.31987E+00         3.32370E-01         3.84566E+02         1.00810E+00         5.29090E+01         3.87529E+02         1.38473E+02         2.49056E+02
+          5.28818E-03         1.76856E-02        -1.03226E-02         3.32214E-01         1.33054E+00         3.32374E-01         3.90356E+02         1.00811E+00         5.31595E+01         3.91538E+02         1.42646E+02         2.48892E+02
+          5.28818E-03         1.78554E-02        -1.05123E-02         3.32213E-01         1.34121E+00         3.32379E-01         3.95903E+02         1.00811E+00         5.34234E+01         3.95324E+02         1.46766E+02         2.48557E+02
+          5.28818E-03         1.80252E-02        -1.07038E-02         3.32212E-01         1.35188E+00         3.32384E-01         4.01170E+02         1.00811E+00         5.36947E+01         3.98855E+02         1.50804E+02         2.48051E+02
+          5.28818E-03         1.81951E-02        -1.08970E-02         3.32211E-01         1.36255E+00         3.32390E-01         4.06127E+02         1.00811E+00         5.39677E+01         4.02107E+02         1.54733E+02         2.47374E+02
+          5.28818E-03         1.83649E-02        -1.10921E-02         3.32210E-01         1.37322E+00         3.32395E-01         4.10745E+02         1.00811E+00         5.42375E+01         4.05056E+02         1.58528E+02         2.46527E+02
+          5.28818E-03         1.85347E-02        -1.12890E-02         3.32209E-01         1.38389E+00         3.32401E-01         4.15000E+02         1.00811E+00         5.44993E+01         4.07683E+02         1.62169E+02         2.45514E+02
+          5.28818E-03         1.87045E-02        -1.14877E-02         3.32208E-01         1.39457E+00         3.32406E-01         4.18869E+02         1.00811E+00         5.47489E+01         4.09972E+02         1.65635E+02         2.44337E+02
+          5.28818E-03         1.88744E-02        -1.16883E-02         3.32207E-01         1.40524E+00         3.32412E-01         4.22336E+02         1.00811E+00         5.49828E+01         4.11910E+02         1.68911E+02         2.42999E+02
+          5.28818E-03         1.90442E-02        -1.18906E-02         3.32206E-01         1.41591E+00         3.32418E-01         4.25386E+02         1.00812E+00         5.51975E+01         4.13487E+02         1.71982E+02         2.41505E+02
+          5.28818E-03         1.92140E-02        -1.20948E-02         3.32205E-01         1.42658E+00         3.32425E-01         4.28008E+02         1.00812E+00         5.53901E+01         4.14695E+02         1.74836E+02         2.39859E+02
+          5.28818E-03         1.93839E-02        -1.23007E-02         3.32204E-01         1.43725E+00         3.32431E-01         4.30192E+02         1.00812E+00         5.55580E+01         4.15530E+02         1.77463E+02         2.38068E+02
+          5.28818E-03         1.95537E-02        -1.25085E-02         3.32202E-01         1.44792E+00         3.32438E-01         4.31934E+02         1.00812E+00         5.56991E+01         4.15990E+02         1.79854E+02         2.36135E+02
+          5.28818E-03         1.97235E-02        -1.27181E-02         3.32201E-01         1.45859E+00         3.32445E-01         4.33229E+02         1.00812E+00         5.58114E+01         4.16073E+02         1.82004E+02         2.34069E+02
+          5.28818E-03         1.98933E-02        -1.29295E-02         3.32200E-01         1.46926E+00         3.32452E-01         4.34079E+02         1.00812E+00         5.58934E+01         4.15782E+02         1.83907E+02         2.31874E+02
+          5.28818E-03         2.00632E-02        -1.31427E-02         3.32199E-01         1.47993E+00         3.32459E-01         4.34484E+02         1.00812E+00         5.59436E+01         4.15121E+02         1.85562E+02         2.29559E+02
+          5.28818E-03         2.02330E-02        -1.33577E-02         3.32198E-01         1.49060E+00         3.32466E-01         4.34448E+02         1.00813E+00         5.59611E+01         4.14096E+02         1.86966E+02         2.27129E+02
+          5.28818E-03         2.04028E-02        -1.35746E-02         3.32197E-01         1.50127E+00         3.32474E-01         4.33978E+02         1.00813E+00         5.59449E+01         4.12714E+02         1.88121E+02         2.24593E+02
+          5.28818E-03         2.05726E-02        -1.37933E-02         3.32196E-01         1.51194E+00         3.32482E-01         4.33081E+02         1.00813E+00         5.58944E+01         4.10985E+02         1.89027E+02         2.21957E+02
+          5.28818E-03         2.07425E-02        -1.40137E-02         3.32194E-01         1.52261E+00         3.32490E-01         4.31766E+02         1.00813E+00         5.58091E+01         4.08919E+02         1.89688E+02         2.19231E+02
+          5.28818E-03         2.09123E-02        -1.42360E-02         3.32193E-01         1.53328E+00         3.32498E-01         4.30046E+02         1.00813E+00         5.56889E+01         4.06527E+02         1.90107E+02         2.16420E+02
+          5.28818E-03         2.10821E-02        -1.44601E-02         3.32192E-01         1.54395E+00         3.32507E-01         4.27933E+02         1.00814E+00         5.55336E+01         4.03823E+02         1.90290E+02         2.13533E+02
+          5.28818E-03         2.12520E-02        -1.46860E-02         3.32191E-01         1.55462E+00         3.32515E-01         4.25441E+02         1.00814E+00         5.53432E+01         4.00821E+02         1.90242E+02         2.10578E+02
+          5.28818E-03         2.14218E-02        -1.49137E-02         3.32190E-01         1.56529E+00         3.32524E-01         4.22584E+02         1.00814E+00         5.51179E+01         3.97534E+02         1.89971E+02         2.07564E+02
+          5.28818E-03         2.15916E-02        -1.51433E-02         3.32189E-01         1.57596E+00         3.32533E-01         4.19379E+02         1.00814E+00         5.48581E+01         3.93979E+02         1.89483E+02         2.04496E+02
+          5.28818E-03         2.17614E-02        -1.53746E-02         3.32187E-01         1.58664E+00         3.32543E-01         4.15843E+02         1.00814E+00         5.45641E+01         3.90172E+02         1.88787E+02         2.01384E+02
+          5.28818E-03         2.19313E-02        -1.56078E-02         3.32186E-01         1.59731E+00         3.32553E-01         4.11994E+02         1.00815E+00         5.42365E+01         3.86128E+02         1.87892E+02         1.98235E+02
+          5.28818E-03         2.21011E-02        -1.58428E-02         3.32185E-01         1.60798E+00         3.32562E-01         4.07850E+02         1.00815E+00         5.38759E+01         3.81865E+02         1.86808E+02         1.95057E+02
+          5.28818E-03         2.22709E-02        -1.60796E-02         3.32184E-01         1.61865E+00         3.32573E-01         4.03429E+02         1.00815E+00         5.34829E+01         3.77400E+02         1.85543E+02         1.91857E+02
+          5.28818E-03         2.24407E-02        -1.63182E-02         3.32182E-01         1.62932E+00         3.32583E-01         3.98752E+02         1.00815E+00         5.30584E+01         3.72750E+02         1.84108E+02         1.88641E+02
+          5.28818E-03         2.26106E-02        -1.65586E-02         3.32181E-01         1.63999E+00         3.32593E-01         3.93837E+02         1.00816E+00         5.26031E+01         3.67933E+02         1.82514E+02         1.85418E+02
+          5.28818E-03         2.27804E-02        -1.68008E-02         3.32180E-01         1.65066E+00         3.32604E-01         3.88705E+02         1.00816E+00         5.21179E+01         3.62965E+02         1.80771E+02         1.82194E+02
+          5.28818E-03         2.29502E-02        -1.70449E-02         3.32178E-01         1.66133E+00         3.32615E-01         3.83374E+02         1.00816E+00         5.16038E+01         3.57864E+02         1.78889E+02         1.78975E+02
+          5.28818E-03         2.31201E-02        -1.72907E-02         3.32177E-01         1.67200E+00         3.32627E-01         3.77866E+02         1.00816E+00         5.10617E+01         3.52647E+02         1.76880E+02         1.75768E+02
+          5.28818E-03         2.32899E-02        -1.75384E-02         3.32176E-01         1.68267E+00         3.32639E-01         3.72199E+02         1.00817E+00         5.04925E+01         3.47331E+02         1.74753E+02         1.72578E+02
+          5.28818E-03         2.34597E-02        -1.77879E-02         3.32175E-01         1.69334E+00         3.32650E-01         3.66392E+02         1.00817E+00         4.98975E+01         3.41932E+02         1.72521E+02         1.69412E+02
+          5.28818E-03         2.36295E-02        -1.80392E-02         3.32173E-01         1.70401E+00         3.32663E-01         3.60466E+02         1.00817E+00         4.92775E+01         3.36466E+02         1.70192E+02         1.66274E+02
+          5.28818E-03         2.37994E-02        -1.82923E-02         3.32172E-01         1.71468E+00         3.32675E-01         3.54438E+02         1.00817E+00         4.86337E+01         3.30949E+02         1.67779E+02         1.63170E+02
+          5.28818E-03         2.39692E-02        -1.85472E-02         3.32171E-01         1.72535E+00         3.32688E-01         3.48327E+02         1.00818E+00         4.79672E+01         3.25396E+02         1.65290E+02         1.60105E+02
+          5.28818E-03         2.41390E-02        -1.88040E-02         3.32169E-01         1.73602E+00         3.32701E-01         3.42152E+02         1.00818E+00         4.72790E+01         3.19820E+02         1.62737E+02         1.57083E+02
+          5.28818E-03         2.43088E-02        -1.90625E-02         3.32168E-01         1.74669E+00         3.32714E-01         3.35929E+02         1.00818E+00         4.65704E+01         3.14237E+02         1.60129E+02         1.54108E+02
+          5.28818E-03         2.44787E-02        -1.93229E-02         3.32166E-01         1.75736E+00         3.32728E-01         3.29675E+02         1.00819E+00         4.58423E+01         3.08659E+02         1.57475E+02         1.51184E+02
+          5.28818E-03         2.46485E-02        -1.95851E-02         3.32165E-01         1.76804E+00         3.32742E-01         3.23406E+02         1.00819E+00         4.50959E+01         3.03099E+02         1.54785E+02         1.48314E+02
+          5.28818E-03         2.48183E-02        -1.98491E-02         3.32164E-01         1.77871E+00         3.32756E-01         3.17138E+02         1.00819E+00         4.43324E+01         2.97569E+02         1.52067E+02         1.45502E+02
+          5.28818E-03         2.49882E-02        -2.01149E-02         3.32162E-01         1.78938E+00         3.32771E-01         3.10886E+02         1.00820E+00         4.35529E+01         2.92081E+02         1.49330E+02         1.42751E+02
+          5.28818E-03         2.51580E-02        -2.03825E-02         3.32161E-01         1.80005E+00         3.32786E-01         3.04664E+02         1.00820E+00         4.27584E+01         2.86644E+02         1.46582E+02         1.40062E+02
+          5.28818E-03         2.53278E-02        -2.06520E-02         3.32159E-01         1.81072E+00         3.32801E-01         2.98484E+02         1.00820E+00         4.19500E+01         2.81269E+02         1.43831E+02         1.37438E+02
+          5.28818E-03         2.54976E-02        -2.09232E-02         3.32158E-01         1.82139E+00         3.32816E-01         2.92361E+02         1.00821E+00         4.11290E+01         2.75965E+02         1.41084E+02         1.34881E+02
+          5.28818E-03         2.56675E-02        -2.11963E-02         3.32156E-01         1.83206E+00         3.32832E-01         2.86305E+02         1.00821E+00         4.02962E+01         2.70741E+02         1.38348E+02         1.32393E+02
+          5.28818E-03         2.58373E-02        -2.14712E-02         3.32155E-01         1.84273E+00         3.32848E-01         2.80327E+02         1.00821E+00         3.94529E+01         2.65603E+02         1.35629E+02         1.29975E+02
+          5.28818E-03         2.60071E-02        -2.17479E-02         3.32154E-01         1.85340E+00         3.32865E-01         2.74438E+02         1.00822E+00         3.86001E+01         2.60560E+02         1.32933E+02         1.27627E+02
+          5.28818E-03         2.61769E-02        -2.20264E-02         3.32152E-01         1.86407E+00         3.32882E-01         2.68647E+02         1.00822E+00         3.77388E+01         2.55617E+02         1.30266E+02         1.25351E+02
+          5.45800E-03         8.72665E-04        -5.77013E-04         3.42936E-01         2.74155E-01         3.42937E-01         1.00320E+04         1.00962E+00         7.55637E+02         9.69942E+03         8.05371E+03         1.64571E+03
+          5.45800E-03         1.04249E-03        -5.87230E-04         3.42936E-01         2.84826E-01         3.42937E-01         9.84978E+03         1.00962E+00         7.43442E+02         9.52174E+03         7.90727E+03         1.61446E+03
+          5.45800E-03         1.21232E-03        -5.99260E-04         3.42936E-01         2.95496E-01         3.42937E-01         9.66368E+03         1.00962E+00         7.30986E+02         9.34035E+03         7.75773E+03         1.58262E+03
+          5.45800E-03         1.38215E-03        -6.13102E-04         3.42936E-01         3.06167E-01         3.42937E-01         9.47404E+03         1.00962E+00         7.18289E+02         9.15555E+03         7.60532E+03         1.55023E+03
+          5.45800E-03         1.55197E-03        -6.28756E-04         3.42936E-01         3.16838E-01         3.42937E-01         9.28115E+03         1.00962E+00         7.05370E+02         8.96764E+03         7.45028E+03         1.51736E+03
+          5.45800E-03         1.72180E-03        -6.46223E-04         3.42936E-01         3.27508E-01         3.42937E-01         9.08532E+03         1.00962E+00         6.92251E+02         8.77692E+03         7.29286E+03         1.48405E+03
+          5.45800E-03         1.89163E-03        -6.65501E-04         3.42936E-01         3.38179E-01         3.42937E-01         8.88685E+03         1.00962E+00         6.78950E+02         8.58369E+03         7.13331E+03         1.45038E+03
+          5.45800E-03         2.06146E-03        -6.86592E-04         3.42936E-01         3.48849E-01         3.42936E-01         8.68606E+03         1.00962E+00         6.65488E+02         8.38825E+03         6.97186E+03         1.41640E+03
+          5.45800E-03         2.23128E-03        -7.09494E-04         3.42936E-01         3.59520E-01         3.42936E-01         8.48324E+03         1.00962E+00         6.51885E+02         8.19092E+03         6.80876E+03         1.38215E+03
+          5.45800E-03         2.40111E-03        -7.34209E-04         3.42936E-01         3.70190E-01         3.42936E-01         8.27870E+03         1.00962E+00         6.38160E+02         7.99198E+03         6.64427E+03         1.34771E+03
+          5.45800E-03         2.57094E-03        -7.60736E-04         3.42935E-01         3.80861E-01         3.42936E-01         8.07275E+03         1.00962E+00         6.24335E+02         7.79174E+03         6.47861E+03         1.31313E+03
+          5.45800E-03         2.74077E-03        -7.89075E-04         3.42935E-01         3.91532E-01         3.42936E-01         7.86570E+03         1.00962E+00         6.10429E+02         7.59049E+03         6.31203E+03         1.27846E+03
+          5.45800E-03         2.91059E-03        -8.19227E-04         3.42935E-01         4.02202E-01         3.42936E-01         7.65783E+03         1.00962E+00         5.96460E+02         7.38853E+03         6.14478E+03         1.24375E+03
+          5.45800E-03         3.08042E-03        -8.51190E-04         3.42935E-01         4.12873E-01         3.42936E-01         7.44945E+03         1.00962E+00         5.82450E+02         7.18615E+03         5.97708E+03         1.20907E+03
+          5.45800E-03         3.25025E-03        -8.84966E-04         3.42935E-01         4.23543E-01         3.42936E-01         7.24084E+03         1.00962E+00         5.68415E+02         6.98363E+03         5.80916E+03         1.17447E+03
+          5.45800E-03         3.42008E-03        -9.20554E-04         3.42935E-01         4.34214E-01         3.42936E-01         7.03230E+03         1.00962E+00         5.54376E+02         6.78126E+03         5.64127E+03         1.13999E+03
+          5.45800E-03         3.58990E-03        -9.57953E-04         3.42934E-01         4.44884E-01         3.42936E-01         6.82411E+03         1.00962E+00         5.40350E+02         6.57931E+03         5.47361E+03         1.10570E+03
+          5.45800E-03         3.75973E-03        -9.97165E-04         3.42934E-01         4.55555E-01         3.42936E-01         6.61654E+03         1.00962E+00         5.26356E+02         6.37805E+03         5.30642E+03         1.07163E+03
+          5.45800E-03         3.92956E-03        -1.03819E-03         3.42934E-01         4.66225E-01         3.42935E-01         6.40986E+03         1.00962E+00         5.12411E+02         6.17775E+03         5.13990E+03         1.03784E+03
+          5.45800E-03         4.09939E-03        -1.08103E-03         3.42934E-01         4.76896E-01         3.42935E-01         6.20433E+03         1.00962E+00         4.98531E+02         5.97865E+03         4.97427E+03         1.00438E+03
+          5.45800E-03         4.26921E-03        -1.12567E-03         3.42933E-01         4.87567E-01         3.42935E-01         6.00021E+03         1.00962E+00         4.84734E+02         5.78101E+03         4.80972E+03         9.71288E+02
+          5.45800E-03         4.43904E-03        -1.17214E-03         3.42933E-01         4.98237E-01         3.42935E-01         5.79775E+03         1.00962E+00         4.71035E+02         5.58507E+03         4.64646E+03         9.38608E+02
+          5.45800E-03         4.60887E-03        -1.22041E-03         3.42933E-01         5.08908E-01         3.42935E-01         5.59719E+03         1.00962E+00         4.57449E+02         5.39106E+03         4.48468E+03         9.06384E+02
+          5.45800E-03         4.77869E-03        -1.27049E-03         3.42933E-01         5.19578E-01         3.42935E-01         5.39875E+03         1.00962E+00         4.43992E+02         5.19921E+03         4.32455E+03         8.74654E+02
+          5.45800E-03         4.94852E-03        -1.32239E-03         3.42932E-01         5.30249E-01         3.42935E-01         5.20265E+03         1.00962E+00         4.30678E+02         5.00972E+03         4.16626E+03         8.43457E+02
+          5.45800E-03         5.11835E-03        -1.37610E-03         3.42932E-01         5.40919E-01         3.42935E-01         5.00912E+03         1.00962E+00         4.17519E+02         4.82280E+03         4.00997E+03         8.12830E+02
+          5.45800E-03         5.28818E-03        -1.43162E-03         3.42932E-01         5.51590E-01         3.42935E-01         4.81834E+03         1.00962E+00         4.04529E+02         4.63865E+03         3.85584E+03         7.82805E+02
+          5.45800E-03         5.45800E-03        -1.48896E-03         3.42931E-01         5.62261E-01         3.42935E-01         4.63052E+03         1.00962E+00         3.91721E+02         4.45744E+03         3.70403E+03         7.53414E+02
+          5.45800E-03         5.62783E-03        -1.54810E-03         3.42931E-01         5.72931E-01         3.42935E-01         4.44583E+03         1.00962E+00         3.79105E+02         4.27937E+03         3.55468E+03         7.24688E+02
+          5.45800E-03         5.79766E-03        -1.60906E-03         3.42931E-01         5.83602E-01         3.42935E-01         4.26445E+03         1.00962E+00         3.66692E+02         4.10458E+03         3.40793E+03         6.96653E+02
+          5.45800E-03         5.96749E-03        -1.67183E-03         3.42930E-01         5.94272E-01         3.42935E-01         4.08653E+03         1.00962E+00         3.54492E+02         3.93323E+03         3.26390E+03         6.69335E+02
+          5.45800E-03         6.13731E-03        -1.73641E-03         3.42930E-01         6.04943E-01         3.42934E-01         3.91222E+03         1.00962E+00         3.42515E+02         3.76547E+03         3.12271E+03         6.42757E+02
+          5.45800E-03         6.30714E-03        -1.80281E-03         3.42930E-01         6.15613E-01         3.42934E-01         3.74167E+03         1.00962E+00         3.30769E+02         3.60142E+03         2.98448E+03         6.16939E+02
+          5.45800E-03         6.47697E-03        -1.87102E-03         3.42929E-01         6.26284E-01         3.42934E-01         3.57500E+03         1.00962E+00         3.19262E+02         3.44120E+03         2.84930E+03         5.91900E+02
+          5.45800E-03         6.64680E-03        -1.94104E-03         3.42929E-01         6.36955E-01         3.42934E-01         3.41233E+03         1.00962E+00         3.08000E+02         3.28493E+03         2.71728E+03         5.67657E+02
+          5.45800E-03         6.81662E-03        -2.01287E-03         3.42929E-01         6.47625E-01         3.42934E-01         3.25376E+03         1.00962E+00         2.96991E+02         3.13271E+03         2.58848E+03         5.44222E+02
+          5.45800E-03         6.98645E-03        -2.08651E-03         3.42928E-01         6.58296E-01         3.42935E-01         3.09939E+03         1.00962E+00         2.86239E+02         2.98461E+03         2.46300E+03         5.21609E+02
+          5.45800E-03         7.15628E-03        -2.16197E-03         3.42928E-01         6.68966E-01         3.42935E-01         2.94930E+03         1.00962E+00         2.75750E+02         2.84072E+03         2.34089E+03         4.99826E+02
+          5.45800E-03         7.32611E-03        -2.23924E-03         3.42927E-01         6.79637E-01         3.42935E-01         2.80357E+03         1.00962E+00         2.65527E+02         2.70110E+03         2.22222E+03         4.78880E+02
+          5.45800E-03         7.49593E-03        -2.31832E-03         3.42927E-01         6.90307E-01         3.42935E-01         2.66226E+03         1.00962E+00         2.55574E+02         2.56581E+03         2.10703E+03         4.58778E+02
+          5.45800E-03         7.66576E-03        -2.39921E-03         3.42926E-01         7.00978E-01         3.42935E-01         2.52541E+03         1.00962E+00         2.45894E+02         2.43490E+03         1.99537E+03         4.39521E+02
+          5.45800E-03         7.83559E-03        -2.48192E-03         3.42926E-01         7.11649E-01         3.42935E-01         2.39307E+03         1.00962E+00         2.36487E+02         2.30838E+03         1.88727E+03         4.21112E+02
+          5.45800E-03         8.00542E-03        -2.56643E-03         3.42926E-01         7.22319E-01         3.42935E-01         2.26527E+03         1.00962E+00         2.27356E+02         2.18630E+03         1.78275E+03         4.03548E+02
+          5.45800E-03         8.17524E-03        -2.65276E-03         3.42925E-01         7.32990E-01         3.42935E-01         2.14203E+03         1.00962E+00         2.18501E+02         2.06866E+03         1.68184E+03         3.86827E+02
+          5.45800E-03         8.34507E-03        -2.74091E-03         3.42925E-01         7.43660E-01         3.42936E-01         2.02336E+03         1.00962E+00         2.09921E+02         1.95548E+03         1.58453E+03         3.70944E+02
+          5.45800E-03         8.51490E-03        -2.83086E-03         3.42924E-01         7.54331E-01         3.42936E-01         1.90926E+03         1.00962E+00         2.01616E+02         1.84673E+03         1.49084E+03         3.55892E+02
+          5.45800E-03         8.68473E-03        -2.92263E-03         3.42924E-01         7.65001E-01         3.42936E-01         1.79972E+03         1.00962E+00         1.93586E+02         1.74241E+03         1.40075E+03         3.41663E+02
+          5.45800E-03         8.85455E-03        -3.01621E-03         3.42923E-01         7.75672E-01         3.42936E-01         1.69472E+03         1.00962E+00         1.85826E+02         1.64250E+03         1.31426E+03         3.28245E+02
+          5.45800E-03         9.02438E-03        -3.11160E-03         3.42923E-01         7.86343E-01         3.42937E-01         1.59424E+03         1.00962E+00         1.78336E+02         1.54697E+03         1.23134E+03         3.15627E+02
+          5.45800E-03         9.19421E-03        -3.20880E-03         3.42922E-01         7.97013E-01         3.42937E-01         1.49824E+03         1.00962E+00         1.71112E+02         1.45577E+03         1.15197E+03         3.03796E+02
+          5.45800E-03         9.36403E-03        -3.30782E-03         3.42922E-01         8.07684E-01         3.42937E-01         1.40668E+03         1.00962E+00         1.64151E+02         1.36885E+03         1.07611E+03         2.92736E+02
+          5.45800E-03         9.53386E-03        -3.40865E-03         3.42921E-01         8.18354E-01         3.42938E-01         1.31951E+03         1.00962E+00         1.57449E+02         1.28617E+03         1.00374E+03         2.82431E+02
+          5.45800E-03         9.70369E-03        -3.51129E-03         3.42920E-01         8.29025E-01         3.42938E-01         1.23666E+03         1.00962E+00         1.51002E+02         1.20765E+03         9.34790E+02         2.72863E+02
+          5.45800E-03         9.87352E-03        -3.61574E-03         3.42920E-01         8.39695E-01         3.42939E-01         1.15808E+03         1.00962E+00         1.44804E+02         1.13324E+03         8.69227E+02         2.64014E+02
+          5.45800E-03         1.00433E-02        -3.72201E-03         3.42919E-01         8.50366E-01         3.42939E-01         1.08369E+03         1.00962E+00         1.38852E+02         1.06285E+03         8.06991E+02         2.55862E+02
+          5.45800E-03         1.02132E-02        -3.83009E-03         3.42919E-01         8.61037E-01         3.42940E-01         1.01341E+03         1.00962E+00         1.33139E+02         9.96410E+02         7.48023E+02         2.48387E+02
+          5.45800E-03         1.03830E-02        -3.93998E-03         3.42918E-01         8.71707E-01         3.42941E-01         9.47162E+02         1.00962E+00         1.27661E+02         9.33826E+02         6.92259E+02         2.41567E+02
+          5.45800E-03         1.05528E-02        -4.05168E-03         3.42917E-01         8.82378E-01         3.42941E-01         8.84852E+02         1.00962E+00         1.22412E+02         8.75008E+02         6.39629E+02         2.35379E+02
+          5.45800E-03         1.07227E-02        -4.16519E-03         3.42917E-01         8.93048E-01         3.42942E-01         8.26385E+02         1.00962E+00         1.17386E+02         8.19860E+02         5.90062E+02         2.29798E+02
+          5.45800E-03         1.08925E-02        -4.28052E-03         3.42916E-01         9.03719E-01         3.42943E-01         7.71664E+02         1.00962E+00         1.12578E+02         7.68282E+02         5.43481E+02         2.24801E+02
+          5.45800E-03         1.10623E-02        -4.39766E-03         3.42916E-01         9.14389E-01         3.42944E-01         7.20585E+02         1.00962E+00         1.07982E+02         7.20170E+02         4.99808E+02         2.20362E+02
+          5.45800E-03         1.12321E-02        -4.51662E-03         3.42915E-01         9.25060E-01         3.42945E-01         6.73041E+02         1.00962E+00         1.03593E+02         6.75416E+02         4.58960E+02         2.16457E+02
+          5.45800E-03         1.14020E-02        -4.63738E-03         3.42914E-01         9.35731E-01         3.42946E-01         6.28920E+02         1.00962E+00         9.94036E+01         6.33910E+02         4.20852E+02         2.13058E+02
+          5.45800E-03         1.15718E-02        -4.75996E-03         3.42914E-01         9.46401E-01         3.42947E-01         5.88111E+02         1.00962E+00         9.54099E+01         5.95538E+02         3.85398E+02         2.10139E+02
+          5.45800E-03         1.17416E-02        -4.88435E-03         3.42913E-01         9.57072E-01         3.42948E-01         5.50496E+02         1.00962E+00         9.16060E+01         5.60185E+02         3.52509E+02         2.07675E+02
+          5.45800E-03         1.19114E-02        -5.01055E-03         3.42912E-01         9.67742E-01         3.42949E-01         5.15958E+02         1.00962E+00         8.79870E+01         5.27733E+02         3.22094E+02         2.05639E+02
+          5.45800E-03         1.20813E-02        -5.13857E-03         3.42912E-01         9.78413E-01         3.42950E-01         4.84377E+02         1.00962E+00         8.45478E+01         4.98065E+02         2.94061E+02         2.04004E+02
+          5.45800E-03         1.22511E-02        -5.26839E-03         3.42911E-01         9.89083E-01         3.42951E-01         4.55631E+02         1.00962E+00         8.12840E+01         4.71060E+02         2.68318E+02         2.02743E+02
+          5.45800E-03         1.24209E-02        -5.40004E-03         3.42910E-01         9.99754E-01         3.42953E-01         4.29599E+02         1.00962E+00         7.81911E+01         4.46599E+02         2.44770E+02         2.01829E+02
+          5.45800E-03         1.25908E-02        -5.53349E-03         3.42909E-01         1.01042E+00         3.42954E-01         4.06157E+02         1.00962E+00         7.52650E+01         4.24561E+02         2.23323E+02         2.01237E+02
+          5.45800E-03         1.27606E-02        -5.66875E-03         3.42909E-01         1.02110E+00         3.42955E-01         3.85182E+02         1.00962E+00         7.25019E+01         4.04825E+02         2.03884E+02         2.00941E+02
+          5.45800E-03         1.29304E-02        -5.80583E-03         3.42908E-01         1.03177E+00         3.42957E-01         3.66551E+02         1.00962E+00         6.98982E+01         3.87271E+02         1.86357E+02         2.00914E+02
+          5.45800E-03         1.31002E-02        -5.94472E-03         3.42907E-01         1.04244E+00         3.42959E-01         3.50141E+02         1.00962E+00         6.74507E+01         3.71781E+02         1.70649E+02         2.01132E+02
+          5.45800E-03         1.32701E-02        -6.08543E-03         3.42906E-01         1.05311E+00         3.42960E-01         3.35831E+02         1.00962E+00         6.51561E+01         3.58235E+02         1.56666E+02         2.01569E+02
+          5.45800E-03         1.34399E-02        -6.22794E-03         3.42906E-01         1.06378E+00         3.42962E-01         3.23499E+02         1.00962E+00         6.30116E+01         3.46517E+02         1.44316E+02         2.02202E+02
+          5.45800E-03         1.36097E-02        -6.37227E-03         3.42905E-01         1.07445E+00         3.42964E-01         3.13026E+02         1.00962E+00         6.10143E+01         3.36511E+02         1.33506E+02         2.03005E+02
+          5.45800E-03         1.37795E-02        -6.51841E-03         3.42904E-01         1.08512E+00         3.42966E-01         3.04294E+02         1.00962E+00         5.91614E+01         3.28104E+02         1.24146E+02         2.03957E+02
+          5.45800E-03         1.39494E-02        -6.66636E-03         3.42903E-01         1.09579E+00         3.42968E-01         2.97185E+02         1.00962E+00         5.74502E+01         3.21183E+02         1.16148E+02         2.05035E+02
+          5.45800E-03         1.41192E-02        -6.81613E-03         3.42902E-01         1.10646E+00         3.42970E-01         2.91587E+02         1.00962E+00         5.58778E+01         3.15640E+02         1.09423E+02         2.06217E+02
+          5.45800E-03         1.42890E-02        -6.96771E-03         3.42902E-01         1.11713E+00         3.42972E-01         2.87387E+02         1.00962E+00         5.44411E+01         3.11369E+02         1.03886E+02         2.07483E+02
+          5.45800E-03         1.44589E-02        -7.12110E-03         3.42901E-01         1.12780E+00         3.42975E-01         2.84476E+02         1.00962E+00         5.31369E+01         3.08264E+02         9.94525E+01         2.08811E+02
+          5.45800E-03         1.46287E-02        -7.27631E-03         3.42900E-01         1.13847E+00         3.42977E-01         2.82747E+02         1.00962E+00         5.19616E+01         3.06225E+02         9.60412E+01         2.10184E+02
+          5.45800E-03         1.47985E-02        -7.43332E-03         3.42899E-01         1.14914E+00         3.42980E-01         2.82097E+02         1.00962E+00         5.09113E+01         3.05154E+02         9.35722E+01         2.11581E+02
+          5.45800E-03         1.49683E-02        -7.59215E-03         3.42898E-01         1.15981E+00         3.42982E-01         2.82425E+02         1.00962E+00         4.99815E+01         3.04956E+02         9.19682E+01         2.12987E+02
+          5.45800E-03         1.51382E-02        -7.75280E-03         3.42897E-01         1.17048E+00         3.42985E-01         2.83632E+02         1.00962E+00         4.91677E+01         3.05539E+02         9.11544E+01         2.14385E+02
+          5.45800E-03         1.53080E-02        -7.91525E-03         3.42896E-01         1.18115E+00         3.42988E-01         2.85626E+02         1.00962E+00         4.84645E+01         3.06816E+02         9.10582E+01         2.15758E+02
+          5.45800E-03         1.54778E-02        -8.07952E-03         3.42895E-01         1.19182E+00         3.42991E-01         2.88316E+02         1.00962E+00         4.78662E+01         3.08702E+02         9.16098E+01         2.17092E+02
+          5.45800E-03         1.56476E-02        -8.24560E-03         3.42895E-01         1.20249E+00         3.42994E-01         2.91614E+02         1.00962E+00         4.73669E+01         3.11116E+02         9.27421E+01         2.18374E+02
+          5.45800E-03         1.58175E-02        -8.41349E-03         3.42894E-01         1.21317E+00         3.42997E-01         2.95438E+02         1.00962E+00         4.69602E+01         3.13982E+02         9.43908E+01         2.19591E+02
+          5.45800E-03         1.59873E-02        -8.58320E-03         3.42893E-01         1.22384E+00         3.43000E-01         2.99707E+02         1.00962E+00         4.66392E+01         3.17225E+02         9.64940E+01         2.20731E+02
+          5.45800E-03         1.61571E-02        -8.75472E-03         3.42892E-01         1.23451E+00         3.43004E-01         3.04345E+02         1.00962E+00         4.63972E+01         3.20775E+02         9.89931E+01         2.21782E+02
+          5.45800E-03         1.63270E-02        -8.92805E-03         3.42891E-01         1.24518E+00         3.43007E-01         3.09280E+02         1.00962E+00         4.62270E+01         3.24569E+02         1.01832E+02         2.22737E+02
+          5.45800E-03         1.64968E-02        -9.10320E-03         3.42890E-01         1.25585E+00         3.43011E-01         3.14445E+02         1.00962E+00         4.61215E+01         3.28542E+02         1.04957E+02         2.23584E+02
+          5.45800E-03         1.66666E-02        -9.28016E-03         3.42889E-01         1.26652E+00         3.43014E-01         3.19774E+02         1.00962E+00         4.60736E+01         3.32637E+02         1.08319E+02         2.24318E+02
+          5.45800E-03         1.68364E-02        -9.45893E-03         3.42888E-01         1.27719E+00         3.43018E-01         3.25208E+02         1.00962E+00         4.60764E+01         3.36800E+02         1.11870E+02         2.24930E+02
+          5.45800E-03         1.70063E-02        -9.63951E-03         3.42887E-01         1.28786E+00         3.43022E-01         3.30688E+02         1.00962E+00         4.61229E+01         3.40980E+02         1.15566E+02         2.25414E+02
+          5.45800E-03         1.71761E-02        -9.82191E-03         3.42886E-01         1.29853E+00         3.43027E-01         3.36163E+02         1.00962E+00         4.62067E+01         3.45130E+02         1.19363E+02         2.25766E+02
+          5.45800E-03         1.73459E-02        -1.00061E-02         3.42885E-01         1.30920E+00         3.43031E-01         3.41583E+02         1.00962E+00         4.63213E+01         3.49207E+02         1.23225E+02         2.25982E+02
+          5.45800E-03         1.75158E-02        -1.01921E-02         3.42884E-01         1.31987E+00         3.43035E-01         3.46904E+02         1.00962E+00         4.64607E+01         3.53171E+02         1.27114E+02         2.26057E+02
+          5.45800E-03         1.76856E-02        -1.03800E-02         3.42883E-01         1.33054E+00         3.43040E-01         3.52082E+02         1.00962E+00         4.66192E+01         3.56986E+02         1.30997E+02         2.25989E+02
+          5.45800E-03         1.78554E-02        -1.05696E-02         3.42882E-01         1.34121E+00         3.43045E-01         3.57080E+02         1.00962E+00         4.67916E+01         3.60620E+02         1.34844E+02         2.25776E+02
+          5.45800E-03         1.80252E-02        -1.07611E-02         3.42881E-01         1.35188E+00         3.43050E-01         3.61864E+02         1.00962E+00         4.69728E+01         3.64043E+02         1.38625E+02         2.25418E+02
+          5.45800E-03         1.81951E-02        -1.09544E-02         3.42880E-01         1.36255E+00         3.43055E-01         3.66402E+02         1.00962E+00         4.71583E+01         3.67229E+02         1.42315E+02         2.24914E+02
+          5.45800E-03         1.83649E-02        -1.11494E-02         3.42879E-01         1.37322E+00         3.43060E-01         3.70667E+02         1.00962E+00         4.73438E+01         3.70155E+02         1.45891E+02         2.24264E+02
+          5.45800E-03         1.85347E-02        -1.13463E-02         3.42878E-01         1.38389E+00         3.43065E-01         3.74634E+02         1.00962E+00         4.75255E+01         3.72802E+02         1.49333E+02         2.23469E+02
+          5.45800E-03         1.87045E-02        -1.15451E-02         3.42877E-01         1.39457E+00         3.43071E-01         3.78281E+02         1.00962E+00         4.76999E+01         3.75153E+02         1.52621E+02         2.22532E+02
+          5.45800E-03         1.88744E-02        -1.17456E-02         3.42875E-01         1.40524E+00         3.43077E-01         3.81591E+02         1.00962E+00         4.78639E+01         3.77194E+02         1.55739E+02         2.21455E+02
+          5.45800E-03         1.90442E-02        -1.19479E-02         3.42874E-01         1.41591E+00         3.43082E-01         3.84548E+02         1.00963E+00         4.80144E+01         3.78913E+02         1.58674E+02         2.20239E+02
+          5.45800E-03         1.92140E-02        -1.21521E-02         3.42873E-01         1.42658E+00         3.43089E-01         3.87140E+02         1.00963E+00         4.81492E+01         3.80301E+02         1.61412E+02         2.18890E+02
+          5.45800E-03         1.93839E-02        -1.23580E-02         3.42872E-01         1.43725E+00         3.43095E-01         3.89356E+02         1.00963E+00         4.82658E+01         3.81354E+02         1.63944E+02         2.17410E+02
+          5.45800E-03         1.95537E-02        -1.25658E-02         3.42871E-01         1.44792E+00         3.43101E-01         3.91189E+02         1.00963E+00         4.83624E+01         3.82065E+02         1.66261E+02         2.15804E+02
+          5.45800E-03         1.97235E-02        -1.27754E-02         3.42870E-01         1.45859E+00         3.43108E-01         3.92635E+02         1.00963E+00         4.84373E+01         3.82434E+02         1.68358E+02         2.14076E+02
+          5.45800E-03         1.98933E-02        -1.29868E-02         3.42869E-01         1.46926E+00         3.43115E-01         3.93691E+02         1.00963E+00         4.84889E+01         3.82461E+02         1.70228E+02         2.12232E+02
+          5.45800E-03         2.00632E-02        -1.32000E-02         3.42868E-01         1.47993E+00         3.43122E-01         3.94357E+02         1.00963E+00         4.85160E+01         3.82147E+02         1.71870E+02         2.10277E+02
+          5.45800E-03         2.02330E-02        -1.34151E-02         3.42866E-01         1.49060E+00         3.43129E-01         3.94633E+02         1.00963E+00         4.85177E+01         3.81497E+02         1.73280E+02         2.08217E+02
+          5.45800E-03         2.04028E-02        -1.36319E-02         3.42865E-01         1.50127E+00         3.43136E-01         3.94525E+02         1.00963E+00         4.84930E+01         3.80517E+02         1.74459E+02         2.06058E+02
+          5.45800E-03         2.05726E-02        -1.38506E-02         3.42864E-01         1.51194E+00         3.43144E-01         3.94036E+02         1.00963E+00         4.84413E+01         3.79213E+02         1.75408E+02         2.03805E+02
+          5.45800E-03         2.07425E-02        -1.40710E-02         3.42863E-01         1.52261E+00         3.43151E-01         3.93174E+02         1.00963E+00         4.83621E+01         3.77594E+02         1.76128E+02         2.01466E+02
+          5.45800E-03         2.09123E-02        -1.42933E-02         3.42862E-01         1.53328E+00         3.43159E-01         3.91947E+02         1.00963E+00         4.82551E+01         3.75668E+02         1.76622E+02         1.99046E+02
+          5.45800E-03         2.10821E-02        -1.45174E-02         3.42860E-01         1.54395E+00         3.43168E-01         3.90366E+02         1.00963E+00         4.81200E+01         3.73448E+02         1.76896E+02         1.96552E+02
+          5.45800E-03         2.12520E-02        -1.47433E-02         3.42859E-01         1.55462E+00         3.43176E-01         3.88440E+02         1.00963E+00         4.79568E+01         3.70945E+02         1.76954E+02         1.93992E+02
+          5.45800E-03         2.14218E-02        -1.49711E-02         3.42858E-01         1.56529E+00         3.43185E-01         3.86183E+02         1.00963E+00         4.77656E+01         3.68172E+02         1.76801E+02         1.91370E+02
+          5.45800E-03         2.15916E-02        -1.52006E-02         3.42857E-01         1.57596E+00         3.43193E-01         3.83608E+02         1.00963E+00         4.75463E+01         3.65141E+02         1.76445E+02         1.88695E+02
+          5.45800E-03         2.17614E-02        -1.54320E-02         3.42855E-01         1.58664E+00         3.43202E-01         3.80728E+02         1.00963E+00         4.72994E+01         3.61867E+02         1.75893E+02         1.85973E+02
+          5.45800E-03         2.19313E-02        -1.56651E-02         3.42854E-01         1.59731E+00         3.43212E-01         3.77558E+02         1.00963E+00         4.70251E+01         3.58364E+02         1.75153E+02         1.83211E+02
+          5.45800E-03         2.21011E-02        -1.59001E-02         3.42853E-01         1.60798E+00         3.43221E-01         3.74114E+02         1.00963E+00         4.67239E+01         3.54647E+02         1.74233E+02         1.80414E+02
+          5.45800E-03         2.22709E-02        -1.61369E-02         3.42851E-01         1.61865E+00         3.43231E-01         3.70412E+02         1.00963E+00         4.63962E+01         3.50732E+02         1.73142E+02         1.77591E+02
+          5.45800E-03         2.24407E-02        -1.63755E-02         3.42850E-01         1.62932E+00         3.43241E-01         3.66468E+02         1.00963E+00         4.60425E+01         3.46635E+02         1.71889E+02         1.74746E+02
+          5.45800E-03         2.26106E-02        -1.66159E-02         3.42849E-01         1.63999E+00         3.43251E-01         3.62298E+02         1.00964E+00         4.56635E+01         3.42370E+02         1.70483E+02         1.71887E+02
+          5.45800E-03         2.27804E-02        -1.68582E-02         3.42848E-01         1.65066E+00         3.43262E-01         3.57921E+02         1.00964E+00         4.52598E+01         3.37953E+02         1.68935E+02         1.69018E+02
+          5.45800E-03         2.29502E-02        -1.71022E-02         3.42846E-01         1.66133E+00         3.43273E-01         3.53353E+02         1.00964E+00         4.48321E+01         3.33400E+02         1.67253E+02         1.66147E+02
+          5.45800E-03         2.31201E-02        -1.73481E-02         3.42845E-01         1.67200E+00         3.43283E-01         3.48610E+02         1.00964E+00         4.43811E+01         3.28728E+02         1.65448E+02         1.63279E+02
+          5.45800E-03         2.32899E-02        -1.75957E-02         3.42844E-01         1.68267E+00         3.43295E-01         3.43712E+02         1.00964E+00         4.39076E+01         3.23950E+02         1.63530E+02         1.60419E+02
+          5.45800E-03         2.34597E-02        -1.78452E-02         3.42842E-01         1.69334E+00         3.43306E-01         3.38673E+02         1.00964E+00         4.34124E+01         3.19082E+02         1.61509E+02         1.57573E+02
+          5.45800E-03         2.36295E-02        -1.80965E-02         3.42841E-01         1.70401E+00         3.43318E-01         3.33512E+02         1.00964E+00         4.28964E+01         3.14140E+02         1.59394E+02         1.54746E+02
+          5.45800E-03         2.37994E-02        -1.83496E-02         3.42839E-01         1.71468E+00         3.43330E-01         3.28244E+02         1.00964E+00         4.23603E+01         3.09137E+02         1.57195E+02         1.51941E+02
+          5.45800E-03         2.39692E-02        -1.86046E-02         3.42838E-01         1.72535E+00         3.43342E-01         3.22887E+02         1.00964E+00         4.18050E+01         3.04087E+02         1.54922E+02         1.49165E+02
+          5.45800E-03         2.41390E-02        -1.88613E-02         3.42837E-01         1.73602E+00         3.43355E-01         3.17456E+02         1.00964E+00         4.12314E+01         2.99005E+02         1.52585E+02         1.46420E+02
+          5.45800E-03         2.43088E-02        -1.91199E-02         3.42835E-01         1.74669E+00         3.43368E-01         3.11967E+02         1.00964E+00         4.06404E+01         2.93903E+02         1.50191E+02         1.43712E+02
+          5.45800E-03         2.44787E-02        -1.93802E-02         3.42834E-01         1.75736E+00         3.43381E-01         3.06435E+02         1.00964E+00         4.00328E+01         2.88794E+02         1.47751E+02         1.41043E+02
+          5.45800E-03         2.46485E-02        -1.96424E-02         3.42832E-01         1.76804E+00         3.43395E-01         3.00875E+02         1.00964E+00         3.94096E+01         2.83690E+02         1.45272E+02         1.38418E+02
+          5.45800E-03         2.48183E-02        -1.99064E-02         3.42831E-01         1.77871E+00         3.43408E-01         2.95300E+02         1.00964E+00         3.87717E+01         2.78603E+02         1.42764E+02         1.35839E+02
+          5.45800E-03         2.49882E-02        -2.01722E-02         3.42829E-01         1.78938E+00         3.43422E-01         2.89724E+02         1.00965E+00         3.81199E+01         2.73543E+02         1.40234E+02         1.33309E+02
+          5.45800E-03         2.51580E-02        -2.04398E-02         3.42828E-01         1.80005E+00         3.43437E-01         2.84160E+02         1.00965E+00         3.74552E+01         2.68521E+02         1.37690E+02         1.30831E+02
+          5.45800E-03         2.53278E-02        -2.07093E-02         3.42827E-01         1.81072E+00         3.43451E-01         2.78621E+02         1.00965E+00         3.67784E+01         2.63545E+02         1.35139E+02         1.28407E+02
+          5.45800E-03         2.54976E-02        -2.09805E-02         3.42825E-01         1.82139E+00         3.43466E-01         2.73117E+02         1.00965E+00         3.60905E+01         2.58626E+02         1.32588E+02         1.26039E+02
+          5.45800E-03         2.56675E-02        -2.12536E-02         3.42824E-01         1.83206E+00         3.43482E-01         2.67661E+02         1.00965E+00         3.53923E+01         2.53772E+02         1.30043E+02         1.23728E+02
+          5.45800E-03         2.58373E-02        -2.15285E-02         3.42822E-01         1.84273E+00         3.43497E-01         2.62262E+02         1.00965E+00         3.46848E+01         2.48989E+02         1.27512E+02         1.21477E+02
+          5.45800E-03         2.60071E-02        -2.18052E-02         3.42821E-01         1.85340E+00         3.43513E-01         2.56929E+02         1.00965E+00         3.39687E+01         2.44286E+02         1.24999E+02         1.19287E+02
+          5.45800E-03         2.61769E-02        -2.20837E-02         3.42819E-01         1.86407E+00         3.43530E-01         2.51673E+02         1.00965E+00         3.32451E+01         2.39668E+02         1.22509E+02         1.17158E+02
+          5.62783E-03         8.72665E-04        -6.36160E-04         3.53607E-01         2.74155E-01         3.53608E-01         9.14426E+03         1.00968E+00         6.15130E+02         8.90904E+03         7.47385E+03         1.43519E+03
+          5.62783E-03         1.04249E-03        -6.46377E-04         3.53607E-01         2.84826E-01         3.53608E-01         8.98055E+03         1.00968E+00         6.05326E+02         8.74811E+03         7.33903E+03         1.40908E+03
+          5.62783E-03         1.21232E-03        -6.58407E-04         3.53607E-01         2.95496E-01         3.53607E-01         8.81335E+03         1.00968E+00         5.95312E+02         8.58377E+03         7.20133E+03         1.38244E+03
+          5.62783E-03         1.38215E-03        -6.72249E-04         3.53607E-01         3.06167E-01         3.53607E-01         8.64293E+03         1.00968E+00         5.85102E+02         8.41630E+03         7.06097E+03         1.35533E+03
+          5.62783E-03         1.55197E-03        -6.87903E-04         3.53607E-01         3.16838E-01         3.53607E-01         8.46954E+03         1.00968E+00         5.74714E+02         8.24597E+03         6.91818E+03         1.32780E+03
+          5.62783E-03         1.72180E-03        -7.05370E-04         3.53607E-01         3.27508E-01         3.53607E-01         8.29346E+03         1.00968E+00         5.64162E+02         8.07305E+03         6.77316E+03         1.29988E+03
+          5.62783E-03         1.89163E-03        -7.24648E-04         3.53606E-01         3.38179E-01         3.53607E-01         8.11497E+03         1.00968E+00         5.53464E+02         7.89780E+03         6.62616E+03         1.27164E+03
+          5.62783E-03         2.06146E-03        -7.45739E-04         3.53606E-01         3.48849E-01         3.53607E-01         7.93433E+03         1.00968E+00         5.42635E+02         7.72050E+03         6.47739E+03         1.24311E+03
+          5.62783E-03         2.23128E-03        -7.68641E-04         3.53606E-01         3.59520E-01         3.53607E-01         7.75183E+03         1.00968E+00         5.31691E+02         7.54141E+03         6.32707E+03         1.21434E+03
+          5.62783E-03         2.40111E-03        -7.93356E-04         3.53606E-01         3.70190E-01         3.53607E-01         7.56773E+03         1.00968E+00         5.20649E+02         7.36082E+03         6.17544E+03         1.18538E+03
+          5.62783E-03         2.57094E-03        -8.19883E-04         3.53606E-01         3.80861E-01         3.53607E-01         7.38230E+03         1.00968E+00         5.09524E+02         7.17898E+03         6.02271E+03         1.15627E+03
+          5.62783E-03         2.74077E-03        -8.48222E-04         3.53606E-01         3.91532E-01         3.53607E-01         7.19581E+03         1.00968E+00         4.98332E+02         6.99617E+03         5.86910E+03         1.12707E+03
+          5.62783E-03         2.91059E-03        -8.78373E-04         3.53606E-01         4.02202E-01         3.53607E-01         7.00853E+03         1.00968E+00         4.87089E+02         6.81264E+03         5.71483E+03         1.09781E+03
+          5.62783E-03         3.08042E-03        -9.10337E-04         3.53605E-01         4.12873E-01         3.53607E-01         6.82073E+03         1.00968E+00         4.75810E+02         6.62866E+03         5.56012E+03         1.06854E+03
+          5.62783E-03         3.25025E-03        -9.44112E-04         3.53605E-01         4.23543E-01         3.53607E-01         6.63267E+03         1.00968E+00         4.64510E+02         6.44450E+03         5.40519E+03         1.03931E+03
+          5.62783E-03         3.42008E-03        -9.79700E-04         3.53605E-01         4.34214E-01         3.53606E-01         6.44459E+03         1.00968E+00         4.53205E+02         6.26039E+03         5.25023E+03         1.01016E+03
+          5.62783E-03         3.58990E-03        -1.01710E-03         3.53605E-01         4.44884E-01         3.53606E-01         6.25676E+03         1.00968E+00         4.41910E+02         6.07659E+03         5.09547E+03         9.81127E+02
+          5.62783E-03         3.75973E-03        -1.05631E-03         3.53605E-01         4.55555E-01         3.53606E-01         6.06942E+03         1.00968E+00         4.30637E+02         5.89335E+03         4.94109E+03         9.52258E+02
+          5.62783E-03         3.92956E-03        -1.09734E-03         3.53604E-01         4.66225E-01         3.53606E-01         5.88281E+03         1.00968E+00         4.19402E+02         5.71090E+03         4.78730E+03         9.23591E+02
+          5.62783E-03         4.09939E-03        -1.14017E-03         3.53604E-01         4.76896E-01         3.53606E-01         5.69716E+03         1.00968E+00         4.08219E+02         5.52947E+03         4.63430E+03         8.95167E+02
+          5.62783E-03         4.26921E-03        -1.18482E-03         3.53604E-01         4.87567E-01         3.53606E-01         5.51272E+03         1.00968E+00         3.97099E+02         5.34928E+03         4.48226E+03         8.67023E+02
+          5.62783E-03         4.43904E-03        -1.23128E-03         3.53604E-01         4.98237E-01         3.53606E-01         5.32969E+03         1.00968E+00         3.86057E+02         5.17056E+03         4.33137E+03         8.39196E+02
+          5.62783E-03         4.60887E-03        -1.27955E-03         3.53603E-01         5.08908E-01         3.53606E-01         5.14829E+03         1.00968E+00         3.75105E+02         4.99352E+03         4.18180E+03         8.11720E+02
+          5.62783E-03         4.77869E-03        -1.32964E-03         3.53603E-01         5.19578E-01         3.53606E-01         4.96873E+03         1.00968E+00         3.64254E+02         4.81835E+03         4.03372E+03         7.84631E+02
+          5.62783E-03         4.94852E-03        -1.38154E-03         3.53603E-01         5.30249E-01         3.53605E-01         4.79121E+03         1.00968E+00         3.53515E+02         4.64526E+03         3.88730E+03         7.57959E+02
+          5.62783E-03         5.11835E-03        -1.43525E-03         3.53602E-01         5.40919E-01         3.53605E-01         4.61592E+03         1.00968E+00         3.42900E+02         4.47443E+03         3.74269E+03         7.31736E+02
+          5.62783E-03         5.28818E-03        -1.49077E-03         3.53602E-01         5.51590E-01         3.53605E-01         4.44305E+03         1.00968E+00         3.32420E+02         4.30604E+03         3.60004E+03         7.05991E+02
+          5.62783E-03         5.45800E-03        -1.54810E-03         3.53602E-01         5.62261E-01         3.53605E-01         4.27276E+03         1.00968E+00         3.22083E+02         4.14025E+03         3.45949E+03         6.80751E+02
+          5.62783E-03         5.62783E-03        -1.60725E-03         3.53602E-01         5.72931E-01         3.53605E-01         4.10521E+03         1.00968E+00         3.11899E+02         3.97722E+03         3.32118E+03         6.56042E+02
+          5.62783E-03         5.79766E-03        -1.66821E-03         3.53601E-01         5.83602E-01         3.53605E-01         3.94058E+03         1.00968E+00         3.01876E+02         3.81711E+03         3.18523E+03         6.31888E+02
+          5.62783E-03         5.96749E-03        -1.73098E-03         3.53601E-01         5.94272E-01         3.53605E-01         3.77900E+03         1.00968E+00         2.92024E+02         3.66006E+03         3.05175E+03         6.08311E+02
+          5.62783E-03         6.13731E-03        -1.79556E-03         3.53600E-01         6.04943E-01         3.53605E-01         3.62060E+03         1.00968E+00         2.82348E+02         3.50620E+03         2.92087E+03         5.85332E+02
+          5.62783E-03         6.30714E-03        -1.86195E-03         3.53600E-01         6.15613E-01         3.53605E-01         3.46552E+03         1.00968E+00         2.72857E+02         3.35565E+03         2.79268E+03         5.62969E+02
+          5.62783E-03         6.47697E-03        -1.93016E-03         3.53600E-01         6.26284E-01         3.53605E-01         3.31387E+03         1.00968E+00         2.63556E+02         3.20852E+03         2.66728E+03         5.41239E+02
+          5.62783E-03         6.64680E-03        -2.00018E-03         3.53599E-01         6.36955E-01         3.53605E-01         3.16576E+03         1.00968E+00         2.54451E+02         3.06492E+03         2.54476E+03         5.20157E+02
+          5.62783E-03         6.81662E-03        -2.07201E-03         3.53599E-01         6.47625E-01         3.53605E-01         3.02129E+03         1.00968E+00         2.45548E+02         2.92493E+03         2.42519E+03         4.99737E+02
+          5.62783E-03         6.98645E-03        -2.14566E-03         3.53598E-01         6.58296E-01         3.53605E-01         2.88055E+03         1.00968E+00         2.36850E+02         2.78864E+03         2.30865E+03         4.79989E+02
+          5.62783E-03         7.15628E-03        -2.22111E-03         3.53598E-01         6.68966E-01         3.53605E-01         2.74360E+03         1.00968E+00         2.28362E+02         2.65612E+03         2.19520E+03         4.60923E+02
+          5.62783E-03         7.32611E-03        -2.29838E-03         3.53598E-01         6.79637E-01         3.53605E-01         2.61053E+03         1.00968E+00         2.20087E+02         2.52744E+03         2.08489E+03         4.42547E+02
+          5.62783E-03         7.49593E-03        -2.37746E-03         3.53597E-01         6.90307E-01         3.53605E-01         2.48140E+03         1.00968E+00         2.12027E+02         2.40265E+03         1.97778E+03         4.24868E+02
+          5.62783E-03         7.66576E-03        -2.45836E-03         3.53597E-01         7.00978E-01         3.53605E-01         2.35624E+03         1.00968E+00         2.04185E+02         2.28179E+03         1.87390E+03         4.07889E+02
+          5.62783E-03         7.83559E-03        -2.54106E-03         3.53596E-01         7.11649E-01         3.53605E-01         2.23510E+03         1.00968E+00         1.96562E+02         2.16490E+03         1.77329E+03         3.91612E+02
+          5.62783E-03         8.00542E-03        -2.62558E-03         3.53596E-01         7.22319E-01         3.53606E-01         2.11801E+03         1.00968E+00         1.89160E+02         2.05200E+03         1.67597E+03         3.76039E+02
+          5.62783E-03         8.17524E-03        -2.71191E-03         3.53595E-01         7.32990E-01         3.53606E-01         2.00500E+03         1.00968E+00         1.81978E+02         1.94312E+03         1.58195E+03         3.61169E+02
+          5.62783E-03         8.34507E-03        -2.80005E-03         3.53595E-01         7.43660E-01         3.53606E-01         1.89607E+03         1.00968E+00         1.75018E+02         1.83825E+03         1.49125E+03         3.46999E+02
+          5.62783E-03         8.51490E-03        -2.89000E-03         3.53594E-01         7.54331E-01         3.53606E-01         1.79123E+03         1.00968E+00         1.68277E+02         1.73740E+03         1.40388E+03         3.33526E+02
+          5.62783E-03         8.68473E-03        -2.98177E-03         3.53594E-01         7.65001E-01         3.53606E-01         1.69047E+03         1.00968E+00         1.61756E+02         1.64057E+03         1.31982E+03         3.20744E+02
+          5.62783E-03         8.85455E-03        -3.07535E-03         3.53593E-01         7.75672E-01         3.53607E-01         1.59379E+03         1.00968E+00         1.55453E+02         1.54772E+03         1.23908E+03         3.08646E+02
+          5.62783E-03         9.02438E-03        -3.17074E-03         3.53593E-01         7.86343E-01         3.53607E-01         1.50117E+03         1.00968E+00         1.49365E+02         1.45884E+03         1.16162E+03         2.97223E+02
+          5.62783E-03         9.19421E-03        -3.26795E-03         3.53592E-01         7.97013E-01         3.53607E-01         1.41257E+03         1.00968E+00         1.43491E+02         1.37390E+03         1.08744E+03         2.86467E+02
+          5.62783E-03         9.36403E-03        -3.36696E-03         3.53592E-01         8.07684E-01         3.53608E-01         1.32795E+03         1.00968E+00         1.37828E+02         1.29286E+03         1.01649E+03         2.76365E+02
+          5.62783E-03         9.53386E-03        -3.46779E-03         3.53591E-01         8.18354E-01         3.53608E-01         1.24729E+03         1.00968E+00         1.32373E+02         1.21567E+03         9.48760E+02         2.66907E+02
+          5.62783E-03         9.70369E-03        -3.57043E-03         3.53590E-01         8.29025E-01         3.53608E-01         1.17053E+03         1.00968E+00         1.27123E+02         1.14227E+03         8.84195E+02         2.58077E+02
+          5.62783E-03         9.87352E-03        -3.67489E-03         3.53590E-01         8.39695E-01         3.53609E-01         1.09760E+03         1.00968E+00         1.22073E+02         1.07262E+03         8.22756E+02         2.49863E+02
+          5.62783E-03         1.00433E-02        -3.78115E-03         3.53589E-01         8.50366E-01         3.53609E-01         1.02847E+03         1.00968E+00         1.17221E+02         1.00664E+03         7.64393E+02         2.42248E+02
+          5.62783E-03         1.02132E-02        -3.88923E-03         3.53589E-01         8.61037E-01         3.53610E-01         9.63044E+02         1.00968E+00         1.12561E+02         9.44269E+02         7.09052E+02         2.35217E+02
+          5.62783E-03         1.03830E-02        -3.99912E-03         3.53588E-01         8.71707E-01         3.53611E-01         9.01265E+02         1.00968E+00         1.08091E+02         8.85428E+02         6.56677E+02         2.28751E+02
+          5.62783E-03         1.05528E-02        -4.11082E-03         3.53587E-01         8.82378E-01         3.53611E-01         8.43052E+02         1.00968E+00         1.03805E+02         8.30039E+02         6.07205E+02         2.22833E+02
+          5.62783E-03         1.07227E-02        -4.22434E-03         3.53587E-01         8.93048E-01         3.53612E-01         7.88324E+02         1.00968E+00         9.96992E+01         7.78016E+02         5.60572E+02         2.17445E+02
+          5.62783E-03         1.08925E-02        -4.33967E-03         3.53586E-01         9.03719E-01         3.53613E-01         7.36995E+02         1.00968E+00         9.57690E+01         7.29273E+02         5.16708E+02         2.12565E+02
+          5.62783E-03         1.10623E-02        -4.45681E-03         3.53585E-01         9.14389E-01         3.53614E-01         6.88974E+02         1.00968E+00         9.20100E+01         6.83718E+02         4.75542E+02         2.08176E+02
+          5.62783E-03         1.12321E-02        -4.57576E-03         3.53585E-01         9.25060E-01         3.53614E-01         6.44168E+02         1.00968E+00         8.84176E+01         6.41255E+02         4.37000E+02         2.04255E+02
+          5.62783E-03         1.14020E-02        -4.69652E-03         3.53584E-01         9.35731E-01         3.53615E-01         6.02480E+02         1.00968E+00         8.49874E+01         6.01788E+02         4.01005E+02         2.00783E+02
+          5.62783E-03         1.15718E-02        -4.81910E-03         3.53583E-01         9.46401E-01         3.53616E-01         5.63812E+02         1.00968E+00         8.17152E+01         5.65215E+02         3.67478E+02         1.97737E+02
+          5.62783E-03         1.17416E-02        -4.94349E-03         3.53583E-01         9.57072E-01         3.53617E-01         5.28061E+02         1.00968E+00         7.85967E+01         5.31435E+02         3.36337E+02         1.95097E+02
+          5.62783E-03         1.19114E-02        -5.06969E-03         3.53582E-01         9.67742E-01         3.53618E-01         4.95123E+02         1.00968E+00         7.56278E+01         5.00342E+02         3.07502E+02         1.92840E+02
+          5.62783E-03         1.20813E-02        -5.19771E-03         3.53581E-01         9.78413E-01         3.53620E-01         4.64893E+02         1.00968E+00         7.28048E+01         4.71832E+02         2.80887E+02         1.90945E+02
+          5.62783E-03         1.22511E-02        -5.32754E-03         3.53581E-01         9.89083E-01         3.53621E-01         4.37264E+02         1.00968E+00         7.01237E+01         4.45797E+02         2.56407E+02         1.89390E+02
+          5.62783E-03         1.24209E-02        -5.45918E-03         3.53580E-01         9.99754E-01         3.53622E-01         4.12127E+02         1.00968E+00         6.75812E+01         4.22130E+02         2.33978E+02         1.88152E+02
+          5.62783E-03         1.25908E-02        -5.59263E-03         3.53579E-01         1.01042E+00         3.53623E-01         3.89374E+02         1.00968E+00         6.51739E+01         4.00723E+02         2.13513E+02         1.87210E+02
+          5.62783E-03         1.27606E-02        -5.72790E-03         3.53578E-01         1.02110E+00         3.53625E-01         3.68896E+02         1.00968E+00         6.28986E+01         3.81467E+02         1.94926E+02         1.86541E+02
+          5.62783E-03         1.29304E-02        -5.86497E-03         3.53578E-01         1.03177E+00         3.53626E-01         3.50582E+02         1.00968E+00         6.07524E+01         3.64255E+02         1.78129E+02         1.86125E+02
+          5.62783E-03         1.31002E-02        -6.00386E-03         3.53577E-01         1.04244E+00         3.53628E-01         3.34324E+02         1.00968E+00         5.87325E+01         3.48978E+02         1.63037E+02         1.85940E+02
+          5.62783E-03         1.32701E-02        -6.14457E-03         3.53576E-01         1.05311E+00         3.53629E-01         3.20014E+02         1.00968E+00         5.68364E+01         3.35530E+02         1.49564E+02         1.85965E+02
+          5.62783E-03         1.34399E-02        -6.28708E-03         3.53575E-01         1.06378E+00         3.53631E-01         3.07542E+02         1.00968E+00         5.50614E+01         3.23804E+02         1.37625E+02         1.86179E+02
+          5.62783E-03         1.36097E-02        -6.43141E-03         3.53574E-01         1.07445E+00         3.53633E-01         2.96803E+02         1.00968E+00         5.34052E+01         3.13696E+02         1.27134E+02         1.86563E+02
+          5.62783E-03         1.37795E-02        -6.57755E-03         3.53574E-01         1.08512E+00         3.53635E-01         2.87690E+02         1.00968E+00         5.18654E+01         3.05103E+02         1.18009E+02         1.87095E+02
+          5.62783E-03         1.39494E-02        -6.72551E-03         3.53573E-01         1.09579E+00         3.53637E-01         2.80099E+02         1.00968E+00         5.04395E+01         2.97924E+02         1.10167E+02         1.87757E+02
+          5.62783E-03         1.41192E-02        -6.87527E-03         3.53572E-01         1.10646E+00         3.53639E-01         2.73928E+02         1.00968E+00         4.91251E+01         2.92057E+02         1.03527E+02         1.88530E+02
+          5.62783E-03         1.42890E-02        -7.02685E-03         3.53571E-01         1.11713E+00         3.53641E-01         2.69076E+02         1.00968E+00         4.79196E+01         2.87407E+02         9.80112E+01         1.89395E+02
+          5.62783E-03         1.44589E-02        -7.18024E-03         3.53570E-01         1.12780E+00         3.53643E-01         2.65444E+02         1.00968E+00         4.68203E+01         2.83877E+02         9.35405E+01         1.90336E+02
+          5.62783E-03         1.46287E-02        -7.33545E-03         3.53569E-01         1.13847E+00         3.53645E-01         2.62936E+02         1.00968E+00         4.58241E+01         2.81375E+02         9.00395E+01         1.91336E+02
+          5.62783E-03         1.47985E-02        -7.49246E-03         3.53568E-01         1.14914E+00         3.53648E-01         2.61459E+02         1.00968E+00         4.49279E+01         2.79811E+02         8.74343E+01         1.92377E+02
+          5.62783E-03         1.49683E-02        -7.65129E-03         3.53567E-01         1.15981E+00         3.53650E-01         2.60921E+02         1.00968E+00         4.41283E+01         2.79098E+02         8.56532E+01         1.93445E+02
+          5.62783E-03         1.51382E-02        -7.81194E-03         3.53567E-01         1.17048E+00         3.53653E-01         2.61234E+02         1.00968E+00         4.34214E+01         2.79151E+02         8.46265E+01         1.94524E+02
+          5.62783E-03         1.53080E-02        -7.97439E-03         3.53566E-01         1.18115E+00         3.53656E-01         2.62312E+02         1.00968E+00         4.28031E+01         2.79888E+02         8.42869E+01         1.95601E+02
+          5.62783E-03         1.54778E-02        -8.13866E-03         3.53565E-01         1.19182E+00         3.53658E-01         2.64073E+02         1.00968E+00         4.22690E+01         2.81232E+02         8.45692E+01         1.96662E+02
+          5.62783E-03         1.56476E-02        -8.30474E-03         3.53564E-01         1.20249E+00         3.53661E-01         2.66438E+02         1.00968E+00         4.18145E+01         2.83106E+02         8.54110E+01         1.97695E+02
+          5.62783E-03         1.58175E-02        -8.47263E-03         3.53563E-01         1.21317E+00         3.53664E-01         2.69329E+02         1.00968E+00         4.14346E+01         2.85441E+02         8.67521E+01         1.98689E+02
+          5.62783E-03         1.59873E-02        -8.64234E-03         3.53562E-01         1.22384E+00         3.53668E-01         2.72675E+02         1.00968E+00         4.11242E+01         2.88165E+02         8.85347E+01         1.99631E+02
+          5.62783E-03         1.61571E-02        -8.81386E-03         3.53561E-01         1.23451E+00         3.53671E-01         2.76405E+02         1.00968E+00         4.08780E+01         2.91216E+02         9.07040E+01         2.00512E+02
+          5.62783E-03         1.63270E-02        -8.98719E-03         3.53560E-01         1.24518E+00         3.53674E-01         2.80453E+02         1.00968E+00         4.06905E+01         2.94530E+02         9.32072E+01         2.01323E+02
+          5.62783E-03         1.64968E-02        -9.16234E-03         3.53559E-01         1.25585E+00         3.53678E-01         2.84756E+02         1.00968E+00         4.05563E+01         2.98049E+02         9.59947E+01         2.02054E+02
+          5.62783E-03         1.66666E-02        -9.33929E-03         3.53558E-01         1.26652E+00         3.53681E-01         2.89255E+02         1.00968E+00         4.04700E+01         3.01718E+02         9.90191E+01         2.02699E+02
+          5.62783E-03         1.68364E-02        -9.51806E-03         3.53557E-01         1.27719E+00         3.53685E-01         2.93892E+02         1.00968E+00         4.04260E+01         3.05486E+02         1.02236E+02         2.03251E+02
+          5.62783E-03         1.70063E-02        -9.69865E-03         3.53556E-01         1.28786E+00         3.53689E-01         2.98616E+02         1.00968E+00         4.04191E+01         3.09305E+02         1.05603E+02         2.03702E+02
+          5.62783E-03         1.71761E-02        -9.88104E-03         3.53555E-01         1.29853E+00         3.53693E-01         3.03377E+02         1.00968E+00         4.04441E+01         3.13129E+02         1.09080E+02         2.04049E+02
+          5.62783E-03         1.73459E-02        -1.00653E-02         3.53554E-01         1.30920E+00         3.53697E-01         3.08129E+02         1.00968E+00         4.04960E+01         3.16917E+02         1.12632E+02         2.04285E+02
+          5.62783E-03         1.75158E-02        -1.02513E-02         3.53553E-01         1.31987E+00         3.53701E-01         3.12828E+02         1.00968E+00         4.05701E+01         3.20630E+02         1.16223E+02         2.04408E+02
+          5.62783E-03         1.76856E-02        -1.04391E-02         3.53552E-01         1.33054E+00         3.53706E-01         3.17436E+02         1.00968E+00         4.06618E+01         3.24235E+02         1.19822E+02         2.04413E+02
+          5.62783E-03         1.78554E-02        -1.06288E-02         3.53551E-01         1.34121E+00         3.53710E-01         3.21916E+02         1.00968E+00         4.07669E+01         3.27698E+02         1.23399E+02         2.04299E+02
+          5.62783E-03         1.80252E-02        -1.08202E-02         3.53550E-01         1.35188E+00         3.53715E-01         3.26236E+02         1.00968E+00         4.08813E+01         3.30990E+02         1.26927E+02         2.04063E+02
+          5.62783E-03         1.81951E-02        -1.10135E-02         3.53549E-01         1.36255E+00         3.53720E-01         3.30364E+02         1.00968E+00         4.10014E+01         3.34087E+02         1.30382E+02         2.03705E+02
+          5.62783E-03         1.83649E-02        -1.12086E-02         3.53547E-01         1.37322E+00         3.53725E-01         3.34275E+02         1.00968E+00         4.11236E+01         3.36965E+02         1.33741E+02         2.03224E+02
+          5.62783E-03         1.85347E-02        -1.14055E-02         3.53546E-01         1.38389E+00         3.53730E-01         3.37943E+02         1.00968E+00         4.12448E+01         3.39604E+02         1.36984E+02         2.02620E+02
+          5.62783E-03         1.87045E-02        -1.16042E-02         3.53545E-01         1.39457E+00         3.53736E-01         3.41349E+02         1.00968E+00         4.13621E+01         3.41987E+02         1.40094E+02         2.01893E+02
+          5.62783E-03         1.88744E-02        -1.18047E-02         3.53544E-01         1.40524E+00         3.53741E-01         3.44473E+02         1.00968E+00         4.14728E+01         3.44098E+02         1.43053E+02         2.01045E+02
+          5.62783E-03         1.90442E-02        -1.20071E-02         3.53543E-01         1.41591E+00         3.53747E-01         3.47299E+02         1.00968E+00         4.15745E+01         3.45926E+02         1.45849E+02         2.00077E+02
+          5.62783E-03         1.92140E-02        -1.22112E-02         3.53542E-01         1.42658E+00         3.53753E-01         3.49815E+02         1.00968E+00         4.16651E+01         3.47460E+02         1.48469E+02         1.98991E+02
+          5.62783E-03         1.93839E-02        -1.24172E-02         3.53541E-01         1.43725E+00         3.53759E-01         3.52010E+02         1.00968E+00         4.17426E+01         3.48694E+02         1.50903E+02         1.97791E+02
+          5.62783E-03         1.95537E-02        -1.26250E-02         3.53540E-01         1.44792E+00         3.53765E-01         3.53874E+02         1.00968E+00         4.18054E+01         3.49621E+02         1.53142E+02         1.96479E+02
+          5.62783E-03         1.97235E-02        -1.28346E-02         3.53538E-01         1.45859E+00         3.53771E-01         3.55403E+02         1.00968E+00         4.18519E+01         3.50239E+02         1.55180E+02         1.95058E+02
+          5.62783E-03         1.98933E-02        -1.30460E-02         3.53537E-01         1.46926E+00         3.53778E-01         3.56592E+02         1.00968E+00         4.18809E+01         3.50545E+02         1.57012E+02         1.93533E+02
+          5.62783E-03         2.00632E-02        -1.32592E-02         3.53536E-01         1.47993E+00         3.53784E-01         3.57438E+02         1.00968E+00         4.18911E+01         3.50541E+02         1.58634E+02         1.91907E+02
+          5.62783E-03         2.02330E-02        -1.34742E-02         3.53535E-01         1.49060E+00         3.53791E-01         3.57942E+02         1.00968E+00         4.18818E+01         3.50229E+02         1.60044E+02         1.90185E+02
+          5.62783E-03         2.04028E-02        -1.36911E-02         3.53534E-01         1.50127E+00         3.53799E-01         3.58105E+02         1.00968E+00         4.18519E+01         3.49611E+02         1.61240E+02         1.88371E+02
+          5.62783E-03         2.05726E-02        -1.39097E-02         3.53532E-01         1.51194E+00         3.53806E-01         3.57931E+02         1.00968E+00         4.18011E+01         3.48693E+02         1.62223E+02         1.86471E+02
+          5.62783E-03         2.07425E-02        -1.41302E-02         3.53531E-01         1.52261E+00         3.53813E-01         3.57423E+02         1.00968E+00         4.17286E+01         3.47483E+02         1.62994E+02         1.84489E+02
+          5.62783E-03         2.09123E-02        -1.43525E-02         3.53530E-01         1.53328E+00         3.53821E-01         3.56589E+02         1.00968E+00         4.16341E+01         3.45986E+02         1.63556E+02         1.82430E+02
+          5.62783E-03         2.10821E-02        -1.45766E-02         3.53529E-01         1.54395E+00         3.53829E-01         3.55435E+02         1.00967E+00         4.15175E+01         3.44213E+02         1.63912E+02         1.80301E+02
+          5.62783E-03         2.12520E-02        -1.48025E-02         3.53527E-01         1.55462E+00         3.53837E-01         3.53971E+02         1.00967E+00         4.13784E+01         3.42172E+02         1.64066E+02         1.78106E+02
+          5.62783E-03         2.14218E-02        -1.50302E-02         3.53526E-01         1.56529E+00         3.53845E-01         3.52206E+02         1.00967E+00         4.12169E+01         3.39875E+02         1.64023E+02         1.75852E+02
+          5.62783E-03         2.15916E-02        -1.52597E-02         3.53525E-01         1.57596E+00         3.53854E-01         3.50150E+02         1.00967E+00         4.10329E+01         3.37333E+02         1.63790E+02         1.73543E+02
+          5.62783E-03         2.17614E-02        -1.54911E-02         3.53523E-01         1.58664E+00         3.53863E-01         3.47816E+02         1.00967E+00         4.08267E+01         3.34559E+02         1.63372E+02         1.71186E+02
+          5.62783E-03         2.19313E-02        -1.57243E-02         3.53522E-01         1.59731E+00         3.53872E-01         3.45216E+02         1.00967E+00         4.05983E+01         3.31563E+02         1.62777E+02         1.68786E+02
+          5.62783E-03         2.21011E-02        -1.59592E-02         3.53521E-01         1.60798E+00         3.53881E-01         3.42362E+02         1.00967E+00         4.03481E+01         3.28361E+02         1.62012E+02         1.66349E+02
+          5.62783E-03         2.22709E-02        -1.61960E-02         3.53519E-01         1.61865E+00         3.53890E-01         3.39268E+02         1.00967E+00         4.00764E+01         3.24965E+02         1.61084E+02         1.63881E+02
+          5.62783E-03         2.24407E-02        -1.64346E-02         3.53518E-01         1.62932E+00         3.53900E-01         3.35948E+02         1.00967E+00         3.97834E+01         3.21389E+02         1.60003E+02         1.61386E+02
+          5.62783E-03         2.26106E-02        -1.66750E-02         3.53517E-01         1.63999E+00         3.53910E-01         3.32416E+02         1.00967E+00         3.94698E+01         3.17648E+02         1.58777E+02         1.58871E+02
+          5.62783E-03         2.27804E-02        -1.69173E-02         3.53515E-01         1.65066E+00         3.53920E-01         3.28687E+02         1.00967E+00         3.91358E+01         3.13755E+02         1.57414E+02         1.56341E+02
+          5.62783E-03         2.29502E-02        -1.71613E-02         3.53514E-01         1.66133E+00         3.53930E-01         3.24777E+02         1.00967E+00         3.87822E+01         3.09724E+02         1.55923E+02         1.53801E+02
+          5.62783E-03         2.31201E-02        -1.74072E-02         3.53513E-01         1.67200E+00         3.53941E-01         3.20699E+02         1.00967E+00         3.84093E+01         3.05570E+02         1.54314E+02         1.51256E+02
+          5.62783E-03         2.32899E-02        -1.76549E-02         3.53511E-01         1.68267E+00         3.53952E-01         3.16468E+02         1.00967E+00         3.80178E+01         3.01307E+02         1.52596E+02         1.48711E+02
+          5.62783E-03         2.34597E-02        -1.79043E-02         3.53510E-01         1.69334E+00         3.53963E-01         3.12101E+02         1.00967E+00         3.76082E+01         2.96948E+02         1.50777E+02         1.46172E+02
+          5.62783E-03         2.36295E-02        -1.81556E-02         3.53508E-01         1.70401E+00         3.53974E-01         3.07611E+02         1.00967E+00         3.71813E+01         2.92508E+02         1.48867E+02         1.43641E+02
+          5.62783E-03         2.37994E-02        -1.84088E-02         3.53507E-01         1.71468E+00         3.53986E-01         3.03013E+02         1.00967E+00         3.67376E+01         2.87999E+02         1.46874E+02         1.41125E+02
+          5.62783E-03         2.39692E-02        -1.86637E-02         3.53506E-01         1.72535E+00         3.53998E-01         2.98322E+02         1.00967E+00         3.62779E+01         2.83436E+02         1.44809E+02         1.38627E+02
+          5.62783E-03         2.41390E-02        -1.89204E-02         3.53504E-01         1.73602E+00         3.54010E-01         2.93553E+02         1.00967E+00         3.58028E+01         2.78830E+02         1.42679E+02         1.36151E+02
+          5.62783E-03         2.43088E-02        -1.91790E-02         3.53503E-01         1.74669E+00         3.54023E-01         2.88718E+02         1.00967E+00         3.53129E+01         2.74193E+02         1.40492E+02         1.33701E+02
+          5.62783E-03         2.44787E-02        -1.94394E-02         3.53501E-01         1.75736E+00         3.54035E-01         2.83832E+02         1.00967E+00         3.48091E+01         2.69539E+02         1.38258E+02         1.31280E+02
+          5.62783E-03         2.46485E-02        -1.97015E-02         3.53500E-01         1.76804E+00         3.54048E-01         2.78907E+02         1.00967E+00         3.42920E+01         2.64877E+02         1.35985E+02         1.28893E+02
+          5.62783E-03         2.48183E-02        -1.99655E-02         3.53498E-01         1.77871E+00         3.54062E-01         2.73958E+02         1.00966E+00         3.37624E+01         2.60220E+02         1.33679E+02         1.26541E+02
+          5.62783E-03         2.49882E-02        -2.02313E-02         3.53497E-01         1.78938E+00         3.54075E-01         2.68995E+02         1.00966E+00         3.32209E+01         2.55577E+02         1.31349E+02         1.24228E+02
+          5.62783E-03         2.51580E-02        -2.04990E-02         3.53495E-01         1.80005E+00         3.54089E-01         2.64030E+02         1.00966E+00         3.26683E+01         2.50959E+02         1.29003E+02         1.21956E+02
+          5.62783E-03         2.53278E-02        -2.07684E-02         3.53494E-01         1.81072E+00         3.54103E-01         2.59076E+02         1.00966E+00         3.21053E+01         2.46374E+02         1.26646E+02         1.19728E+02
+          5.62783E-03         2.54976E-02        -2.10397E-02         3.53492E-01         1.82139E+00         3.54118E-01         2.54142E+02         1.00966E+00         3.15326E+01         2.41831E+02         1.24285E+02         1.17546E+02
+          5.62783E-03         2.56675E-02        -2.13127E-02         3.53491E-01         1.83206E+00         3.54133E-01         2.49238E+02         1.00966E+00         3.09510E+01         2.37339E+02         1.21928E+02         1.15411E+02
+          5.62783E-03         2.58373E-02        -2.15876E-02         3.53489E-01         1.84273E+00         3.54148E-01         2.44375E+02         1.00966E+00         3.03611E+01         2.32905E+02         1.19579E+02         1.13327E+02
+          5.62783E-03         2.60071E-02        -2.18643E-02         3.53488E-01         1.85340E+00         3.54163E-01         2.39562E+02         1.00966E+00         2.97637E+01         2.28536E+02         1.17243E+02         1.11293E+02
+          5.62783E-03         2.61769E-02        -2.21428E-02         3.53486E-01         1.86407E+00         3.54179E-01         2.34806E+02         1.00966E+00         2.91596E+01         2.24238E+02         1.14927E+02         1.09311E+02
+          5.79766E-03         8.72665E-04        -6.97119E-04         3.64278E-01         2.74155E-01         3.64278E-01         8.32026E+03         1.00888E+00         4.98810E+02         8.15866E+03         6.91400E+03         1.24465E+03
+          5.79766E-03         1.04249E-03        -7.07337E-04         3.64277E-01         2.84826E-01         3.64278E-01         8.17348E+03         1.00888E+00         4.90958E+02         8.01343E+03         6.79034E+03         1.22309E+03
+          5.79766E-03         1.21232E-03        -7.19366E-04         3.64277E-01         2.95496E-01         3.64278E-01         8.02353E+03         1.00888E+00         4.82937E+02         7.86510E+03         6.66402E+03         1.20108E+03
+          5.79766E-03         1.38215E-03        -7.33208E-04         3.64277E-01         3.06167E-01         3.64278E-01         7.87065E+03         1.00888E+00         4.74759E+02         7.71390E+03         6.53524E+03         1.17867E+03
+          5.79766E-03         1.55197E-03        -7.48863E-04         3.64277E-01         3.16838E-01         3.64278E-01         7.71507E+03         1.00888E+00         4.66438E+02         7.56008E+03         6.40420E+03         1.15588E+03
+          5.79766E-03         1.72180E-03        -7.66329E-04         3.64277E-01         3.27508E-01         3.64278E-01         7.55705E+03         1.00888E+00         4.57984E+02         7.40386E+03         6.27110E+03         1.13276E+03
+          5.79766E-03         1.89163E-03        -7.85607E-04         3.64277E-01         3.38179E-01         3.64278E-01         7.39681E+03         1.00888E+00         4.49413E+02         7.24550E+03         6.13615E+03         1.10935E+03
+          5.79766E-03         2.06146E-03        -8.06698E-04         3.64277E-01         3.48849E-01         3.64278E-01         7.23461E+03         1.00888E+00         4.40735E+02         7.08524E+03         5.99956E+03         1.08568E+03
+          5.79766E-03         2.23128E-03        -8.29600E-04         3.64277E-01         3.59520E-01         3.64278E-01         7.07068E+03         1.00888E+00         4.31965E+02         6.92331E+03         5.86152E+03         1.06179E+03
+          5.79766E-03         2.40111E-03        -8.54315E-04         3.64277E-01         3.70190E-01         3.64278E-01         6.90526E+03         1.00888E+00         4.23115E+02         6.75997E+03         5.72225E+03         1.03772E+03
+          5.79766E-03         2.57094E-03        -8.80842E-04         3.64276E-01         3.80861E-01         3.64278E-01         6.73861E+03         1.00888E+00         4.14197E+02         6.59544E+03         5.58194E+03         1.01350E+03
+          5.79766E-03         2.74077E-03        -9.09181E-04         3.64276E-01         3.91532E-01         3.64277E-01         6.57095E+03         1.00888E+00         4.05225E+02         6.42997E+03         5.44079E+03         9.89174E+02
+          5.79766E-03         2.91059E-03        -9.39332E-04         3.64276E-01         4.02202E-01         3.64277E-01         6.40253E+03         1.00888E+00         3.96210E+02         6.26379E+03         5.29902E+03         9.64778E+02
+          5.79766E-03         3.08042E-03        -9.71296E-04         3.64276E-01         4.12873E-01         3.64277E-01         6.23357E+03         1.00888E+00         3.87166E+02         6.09715E+03         5.15680E+03         9.40347E+02
+          5.79766E-03         3.25025E-03        -1.00507E-03         3.64276E-01         4.23543E-01         3.64277E-01         6.06432E+03         1.00888E+00         3.78104E+02         5.93026E+03         5.01435E+03         9.15919E+02
+          5.79766E-03         3.42008E-03        -1.04066E-03         3.64276E-01         4.34214E-01         3.64277E-01         5.89500E+03         1.00888E+00         3.69036E+02         5.76337E+03         4.87184E+03         8.91527E+02
+          5.79766E-03         3.58990E-03        -1.07806E-03         3.64275E-01         4.44884E-01         3.64277E-01         5.72584E+03         1.00888E+00         3.59974E+02         5.59668E+03         4.72947E+03         8.67207E+02
+          5.79766E-03         3.75973E-03        -1.11727E-03         3.64275E-01         4.55555E-01         3.64277E-01         5.55705E+03         1.00888E+00         3.50930E+02         5.43043E+03         4.58743E+03         8.42993E+02
+          5.79766E-03         3.92956E-03        -1.15830E-03         3.64275E-01         4.66225E-01         3.64277E-01         5.38886E+03         1.00888E+00         3.41915E+02         5.26482E+03         4.44590E+03         8.18918E+02
+          5.79766E-03         4.09939E-03        -1.20113E-03         3.64275E-01         4.76896E-01         3.64277E-01         5.22147E+03         1.00888E+00         3.32939E+02         5.10006E+03         4.30504E+03         7.95014E+02
+          5.79766E-03         4.26921E-03        -1.24578E-03         3.64274E-01         4.87567E-01         3.64276E-01         5.05508E+03         1.00888E+00         3.24013E+02         4.93636E+03         4.16504E+03         7.71313E+02
+          5.79766E-03         4.43904E-03        -1.29224E-03         3.64274E-01         4.98237E-01         3.64276E-01         4.88991E+03         1.00888E+00         3.15148E+02         4.77391E+03         4.02606E+03         7.47845E+02
+          5.79766E-03         4.60887E-03        -1.34051E-03         3.64274E-01         5.08908E-01         3.64276E-01         4.72613E+03         1.00888E+00         3.06353E+02         4.61290E+03         3.88826E+03         7.24640E+02
+          5.79766E-03         4.77869E-03        -1.39060E-03         3.64274E-01         5.19578E-01         3.64276E-01         4.56394E+03         1.00888E+00         2.97637E+02         4.45352E+03         3.75179E+03         7.01725E+02
+          5.79766E-03         4.94852E-03        -1.44250E-03         3.64273E-01         5.30249E-01         3.64276E-01         4.40351E+03         1.00888E+00         2.89011E+02         4.29594E+03         3.61681E+03         6.79128E+02
+          5.79766E-03         5.11835E-03        -1.49621E-03         3.64273E-01         5.40919E-01         3.64276E-01         4.24502E+03         1.00888E+00         2.80483E+02         4.14034E+03         3.48346E+03         6.56875E+02
+          5.79766E-03         5.28818E-03        -1.55173E-03         3.64273E-01         5.51590E-01         3.64276E-01         4.08864E+03         1.00888E+00         2.72060E+02         3.98686E+03         3.35187E+03         6.34991E+02
+          5.79766E-03         5.45800E-03        -1.60906E-03         3.64272E-01         5.62261E-01         3.64276E-01         3.93451E+03         1.00888E+00         2.63751E+02         3.83568E+03         3.22218E+03         6.13499E+02
+          5.79766E-03         5.62783E-03        -1.66821E-03         3.64272E-01         5.72931E-01         3.64276E-01         3.78278E+03         1.00888E+00         2.55564E+02         3.68693E+03         3.09451E+03         5.92422E+02
+          5.79766E-03         5.79766E-03        -1.72916E-03         3.64272E-01         5.83602E-01         3.64276E-01         3.63361E+03         1.00888E+00         2.47504E+02         3.54076E+03         2.96898E+03         5.71779E+02
+          5.79766E-03         5.96749E-03        -1.79194E-03         3.64271E-01         5.94272E-01         3.64276E-01         3.48711E+03         1.00888E+00         2.39579E+02         3.39728E+03         2.84569E+03         5.51591E+02
+          5.79766E-03         6.13731E-03        -1.85652E-03         3.64271E-01         6.04943E-01         3.64276E-01         3.34342E+03         1.00888E+00         2.31795E+02         3.25662E+03         2.72475E+03         5.31875E+02
+          5.79766E-03         6.30714E-03        -1.92291E-03         3.64270E-01         6.15613E-01         3.64276E-01         3.20265E+03         1.00888E+00         2.24157E+02         3.11890E+03         2.60626E+03         5.12648E+02
+          5.79766E-03         6.47697E-03        -1.99112E-03         3.64270E-01         6.26284E-01         3.64275E-01         3.06491E+03         1.00888E+00         2.16670E+02         2.98422E+03         2.49030E+03         4.93926E+02
+          5.79766E-03         6.64680E-03        -2.06114E-03         3.64270E-01         6.36955E-01         3.64275E-01         2.93030E+03         1.00888E+00         2.09340E+02         2.85267E+03         2.37695E+03         4.75721E+02
+          5.79766E-03         6.81662E-03        -2.13297E-03         3.64269E-01         6.47625E-01         3.64275E-01         2.79890E+03         1.00888E+00         2.02169E+02         2.72435E+03         2.26630E+03         4.58047E+02
+          5.79766E-03         6.98645E-03        -2.20661E-03         3.64269E-01         6.58296E-01         3.64275E-01         2.67080E+03         1.00888E+00         1.95162E+02         2.59931E+03         2.15840E+03         4.40914E+02
+          5.79766E-03         7.15628E-03        -2.28207E-03         3.64268E-01         6.68966E-01         3.64276E-01         2.54608E+03         1.00888E+00         1.88321E+02         2.47765E+03         2.05332E+03         4.24332E+02
+          5.79766E-03         7.32611E-03        -2.35934E-03         3.64268E-01         6.79637E-01         3.64276E-01         2.42479E+03         1.00888E+00         1.81650E+02         2.35941E+03         1.95110E+03         4.08309E+02
+          5.79766E-03         7.49593E-03        -2.43842E-03         3.64267E-01         6.90307E-01         3.64276E-01         2.30698E+03         1.00888E+00         1.75151E+02         2.24466E+03         1.85181E+03         3.92850E+02
+          5.79766E-03         7.66576E-03        -2.51931E-03         3.64267E-01         7.00978E-01         3.64276E-01         2.19272E+03         1.00888E+00         1.68825E+02         2.13342E+03         1.75546E+03         3.77962E+02
+          5.79766E-03         7.83559E-03        -2.60202E-03         3.64266E-01         7.11649E-01         3.64276E-01         2.08204E+03         1.00888E+00         1.62674E+02         2.02574E+03         1.66210E+03         3.63648E+02
+          5.79766E-03         8.00542E-03        -2.68654E-03         3.64266E-01         7.22319E-01         3.64276E-01         1.97496E+03         1.00888E+00         1.56699E+02         1.92165E+03         1.57174E+03         3.49911E+02
+          5.79766E-03         8.17524E-03        -2.77287E-03         3.64266E-01         7.32990E-01         3.64276E-01         1.87152E+03         1.00888E+00         1.50900E+02         1.82117E+03         1.48441E+03         3.36751E+02
+          5.79766E-03         8.34507E-03        -2.86101E-03         3.64265E-01         7.43660E-01         3.64276E-01         1.77172E+03         1.00888E+00         1.45277E+02         1.72429E+03         1.40012E+03         3.24168E+02
+          5.79766E-03         8.51490E-03        -2.95096E-03         3.64264E-01         7.54331E-01         3.64276E-01         1.67558E+03         1.00888E+00         1.39829E+02         1.63104E+03         1.31888E+03         3.12161E+02
+          5.79766E-03         8.68473E-03        -3.04273E-03         3.64264E-01         7.65001E-01         3.64277E-01         1.58309E+03         1.00888E+00         1.34557E+02         1.54140E+03         1.24067E+03         3.00726E+02
+          5.79766E-03         8.85455E-03        -3.13631E-03         3.64263E-01         7.75672E-01         3.64277E-01         1.49425E+03         1.00888E+00         1.29459E+02         1.45537E+03         1.16550E+03         2.89861E+02
+          5.79766E-03         9.02438E-03        -3.23170E-03         3.64263E-01         7.86343E-01         3.64277E-01         1.40903E+03         1.00888E+00         1.24533E+02         1.37292E+03         1.09336E+03         2.79558E+02
+          5.79766E-03         9.19421E-03        -3.32890E-03         3.64262E-01         7.97013E-01         3.64277E-01         1.32743E+03         1.00888E+00         1.19778E+02         1.29403E+03         1.02421E+03         2.69813E+02
+          5.79766E-03         9.36403E-03        -3.42792E-03         3.64262E-01         8.07684E-01         3.64278E-01         1.24940E+03         1.00888E+00         1.15191E+02         1.21866E+03         9.58047E+02         2.60617E+02
+          5.79766E-03         9.53386E-03        -3.52875E-03         3.64261E-01         8.18354E-01         3.64278E-01         1.17493E+03         1.00888E+00         1.10771E+02         1.14679E+03         8.94832E+02         2.51962E+02
+          5.79766E-03         9.70369E-03        -3.63139E-03         3.64261E-01         8.29025E-01         3.64279E-01         1.10396E+03         1.00888E+00         1.06515E+02         1.07837E+03         8.34533E+02         2.43839E+02
+          5.79766E-03         9.87352E-03        -3.73584E-03         3.64260E-01         8.39695E-01         3.64279E-01         1.03645E+03         1.00888E+00         1.02419E+02         1.01335E+03         7.77111E+02         2.36237E+02
+          5.79766E-03         1.00433E-02        -3.84211E-03         3.64259E-01         8.50366E-01         3.64280E-01         9.72350E+02         1.00888E+00         9.84816E+01         9.51667E+02         7.22523E+02         2.29144E+02
+          5.79766E-03         1.02132E-02        -3.95019E-03         3.64259E-01         8.61037E-01         3.64280E-01         9.11601E+02         1.00888E+00         9.46987E+01         8.93270E+02         6.70721E+02         2.22549E+02
+          5.79766E-03         1.03830E-02        -4.06008E-03         3.64258E-01         8.71707E-01         3.64281E-01         8.54142E+02         1.00888E+00         9.10672E+01         8.38092E+02         6.21655E+02         2.16438E+02
+          5.79766E-03         1.05528E-02        -4.17178E-03         3.64257E-01         8.82378E-01         3.64281E-01         7.99907E+02         1.00888E+00         8.75839E+01         7.86066E+02         5.75268E+02         2.10798E+02
+          5.79766E-03         1.07227E-02        -4.28529E-03         3.64257E-01         8.93048E-01         3.64282E-01         7.48825E+02         1.00888E+00         8.42451E+01         7.37117E+02         5.31504E+02         2.05614E+02
+          5.79766E-03         1.08925E-02        -4.40062E-03         3.64256E-01         9.03719E-01         3.64283E-01         7.00822E+02         1.00888E+00         8.10474E+01         6.91170E+02         4.90299E+02         2.00871E+02
+          5.79766E-03         1.10623E-02        -4.51776E-03         3.64255E-01         9.14389E-01         3.64283E-01         6.55820E+02         1.00888E+00         7.79873E+01         6.48145E+02         4.51591E+02         1.96554E+02
+          5.79766E-03         1.12321E-02        -4.63671E-03         3.64255E-01         9.25060E-01         3.64284E-01         6.13738E+02         1.00888E+00         7.50613E+01         6.07958E+02         4.15311E+02         1.92647E+02
+          5.79766E-03         1.14020E-02        -4.75748E-03         3.64254E-01         9.35731E-01         3.64285E-01         5.74492E+02         1.00888E+00         7.22658E+01         5.70523E+02         3.81390E+02         1.89133E+02
+          5.79766E-03         1.15718E-02        -4.88006E-03         3.64253E-01         9.46401E-01         3.64286E-01         5.37993E+02         1.00888E+00         6.95975E+01         5.35753E+02         3.49758E+02         1.85995E+02
+          5.79766E-03         1.17416E-02        -5.00445E-03         3.64253E-01         9.57072E-01         3.64287E-01         5.04155E+02         1.00888E+00         6.70530E+01         5.03557E+02         3.20340E+02         1.83217E+02
+          5.79766E-03         1.19114E-02        -5.13065E-03         3.64252E-01         9.67742E-01         3.64288E-01         4.72884E+02         1.00888E+00         6.46292E+01         4.73842E+02         2.93063E+02         1.80780E+02
+          5.79766E-03         1.20813E-02        -5.25866E-03         3.64251E-01         9.78413E-01         3.64289E-01         4.44089E+02         1.00888E+00         6.23228E+01         4.46515E+02         2.67849E+02         1.78667E+02
+          5.79766E-03         1.22511E-02        -5.38849E-03         3.64250E-01         9.89083E-01         3.64290E-01         4.17675E+02         1.00888E+00         6.01310E+01         4.21482E+02         2.44622E+02         1.76860E+02
+          5.79766E-03         1.24209E-02        -5.52013E-03         3.64250E-01         9.99754E-01         3.64291E-01         3.93547E+02         1.00888E+00         5.80509E+01         3.98645E+02         2.23304E+02         1.75341E+02
+          5.79766E-03         1.25908E-02        -5.65358E-03         3.64249E-01         1.01042E+00         3.64293E-01         3.71608E+02         1.00888E+00         5.60798E+01         3.77909E+02         2.03816E+02         1.74093E+02
+          5.79766E-03         1.27606E-02        -5.78885E-03         3.64248E-01         1.02110E+00         3.64294E-01         3.51761E+02         1.00887E+00         5.42151E+01         3.59177E+02         1.86079E+02         1.73098E+02
+          5.79766E-03         1.29304E-02        -5.92593E-03         3.64247E-01         1.03177E+00         3.64295E-01         3.33910E+02         1.00887E+00         5.24545E+01         3.42352E+02         1.70015E+02         1.72337E+02
+          5.79766E-03         1.31002E-02        -6.06482E-03         3.64246E-01         1.04244E+00         3.64297E-01         3.17958E+02         1.00887E+00         5.07956E+01         3.27337E+02         1.55544E+02         1.71793E+02
+          5.79766E-03         1.32701E-02        -6.20552E-03         3.64246E-01         1.05311E+00         3.64298E-01         3.03808E+02         1.00887E+00         4.92363E+01         3.14036E+02         1.42588E+02         1.71448E+02
+          5.79766E-03         1.34399E-02        -6.34804E-03         3.64245E-01         1.06378E+00         3.64300E-01         2.91363E+02         1.00887E+00         4.77744E+01         3.02354E+02         1.31069E+02         1.71285E+02
+          5.79766E-03         1.36097E-02        -6.49237E-03         3.64244E-01         1.07445E+00         3.64302E-01         2.80528E+02         1.00887E+00         4.64079E+01         2.92196E+02         1.20909E+02         1.71287E+02
+          5.79766E-03         1.37795E-02        -6.63851E-03         3.64243E-01         1.08512E+00         3.64304E-01         2.71209E+02         1.00887E+00         4.51347E+01         2.83468E+02         1.12031E+02         1.71438E+02
+          5.79766E-03         1.39494E-02        -6.78646E-03         3.64242E-01         1.09579E+00         3.64305E-01         2.63312E+02         1.00887E+00         4.39529E+01         2.76080E+02         1.04360E+02         1.71720E+02
+          5.79766E-03         1.41192E-02        -6.93623E-03         3.64241E-01         1.10646E+00         3.64307E-01         2.56745E+02         1.00887E+00         4.28602E+01         2.69939E+02         9.78220E+01         1.72117E+02
+          5.79766E-03         1.42890E-02        -7.08780E-03         3.64240E-01         1.11713E+00         3.64309E-01         2.51418E+02         1.00887E+00         4.18547E+01         2.64958E+02         9.23433E+01         1.72615E+02
+          5.79766E-03         1.44589E-02        -7.24120E-03         3.64240E-01         1.12780E+00         3.64312E-01         2.47242E+02         1.00887E+00         4.09339E+01         2.61050E+02         8.78526E+01         1.73197E+02
+          5.79766E-03         1.46287E-02        -7.39640E-03         3.64239E-01         1.13847E+00         3.64314E-01         2.44131E+02         1.00887E+00         4.00955E+01         2.58129E+02         8.42798E+01         1.73849E+02
+          5.79766E-03         1.47985E-02        -7.55342E-03         3.64238E-01         1.14914E+00         3.64316E-01         2.41999E+02         1.00887E+00         3.93369E+01         2.56114E+02         8.15567E+01         1.74557E+02
+          5.79766E-03         1.49683E-02        -7.71225E-03         3.64237E-01         1.15981E+00         3.64319E-01         2.40765E+02         1.00887E+00         3.86553E+01         2.54924E+02         7.96168E+01         1.75308E+02
+          5.79766E-03         1.51382E-02        -7.87289E-03         3.64236E-01         1.17048E+00         3.64321E-01         2.40348E+02         1.00887E+00         3.80476E+01         2.54482E+02         7.83957E+01         1.76087E+02
+          5.79766E-03         1.53080E-02        -8.03534E-03         3.64235E-01         1.18115E+00         3.64324E-01         2.40670E+02         1.00887E+00         3.75108E+01         2.54713E+02         7.78308E+01         1.76882E+02
+          5.79766E-03         1.54778E-02        -8.19961E-03         3.64234E-01         1.19182E+00         3.64326E-01         2.41657E+02         1.00887E+00         3.70413E+01         2.55544E+02         7.78619E+01         1.77682E+02
+          5.79766E-03         1.56476E-02        -8.36569E-03         3.64233E-01         1.20249E+00         3.64329E-01         2.43237E+02         1.00887E+00         3.66356E+01         2.56906E+02         7.84306E+01         1.78476E+02
+          5.79766E-03         1.58175E-02        -8.53359E-03         3.64232E-01         1.21317E+00         3.64332E-01         2.45339E+02         1.00887E+00         3.62899E+01         2.58732E+02         7.94810E+01         1.79251E+02
+          5.79766E-03         1.59873E-02        -8.70329E-03         3.64231E-01         1.22384E+00         3.64335E-01         2.47897E+02         1.00887E+00         3.60002E+01         2.60958E+02         8.09594E+01         1.79999E+02
+          5.79766E-03         1.61571E-02        -8.87481E-03         3.64230E-01         1.23451E+00         3.64338E-01         2.50847E+02         1.00887E+00         3.57624E+01         2.63524E+02         8.28144E+01         1.80709E+02
+          5.79766E-03         1.63270E-02        -9.04814E-03         3.64229E-01         1.24518E+00         3.64341E-01         2.54127E+02         1.00887E+00         3.55724E+01         2.66371E+02         8.49970E+01         1.81374E+02
+          5.79766E-03         1.64968E-02        -9.22329E-03         3.64228E-01         1.25585E+00         3.64345E-01         2.57681E+02         1.00887E+00         3.54260E+01         2.69445E+02         8.74603E+01         1.81985E+02
+          5.79766E-03         1.66666E-02        -9.40024E-03         3.64227E-01         1.26652E+00         3.64348E-01         2.61452E+02         1.00887E+00         3.53189E+01         2.72694E+02         9.01602E+01         1.82533E+02
+          5.79766E-03         1.68364E-02        -9.57902E-03         3.64226E-01         1.27719E+00         3.64352E-01         2.65389E+02         1.00887E+00         3.52470E+01         2.76068E+02         9.30547E+01         1.83014E+02
+          5.79766E-03         1.70063E-02        -9.75960E-03         3.64225E-01         1.28786E+00         3.64356E-01         2.69443E+02         1.00887E+00         3.52062E+01         2.79524E+02         9.61042E+01         1.83420E+02
+          5.79766E-03         1.71761E-02        -9.94199E-03         3.64224E-01         1.29853E+00         3.64360E-01         2.73566E+02         1.00887E+00         3.51925E+01         2.83017E+02         9.92715E+01         1.83745E+02
+          5.79766E-03         1.73459E-02        -1.01262E-02         3.64223E-01         1.30920E+00         3.64364E-01         2.77718E+02         1.00887E+00         3.52018E+01         2.86507E+02         1.02522E+02         1.83985E+02
+          5.79766E-03         1.75158E-02        -1.03122E-02         3.64222E-01         1.31987E+00         3.64368E-01         2.81856E+02         1.00887E+00         3.52306E+01         2.89959E+02         1.05823E+02         1.84136E+02
+          5.79766E-03         1.76856E-02        -1.05001E-02         3.64221E-01         1.33054E+00         3.64372E-01         2.85945E+02         1.00887E+00         3.52751E+01         2.93338E+02         1.09144E+02         1.84194E+02
+          5.79766E-03         1.78554E-02        -1.06897E-02         3.64220E-01         1.34121E+00         3.64376E-01         2.89949E+02         1.00887E+00         3.53321E+01         2.96613E+02         1.12457E+02         1.84156E+02
+          5.79766E-03         1.80252E-02        -1.08812E-02         3.64218E-01         1.35188E+00         3.64381E-01         2.93837E+02         1.00887E+00         3.53983E+01         2.99756E+02         1.15737E+02         1.84018E+02
+          5.79766E-03         1.81951E-02        -1.10744E-02         3.64217E-01         1.36255E+00         3.64386E-01         2.97580E+02         1.00887E+00         3.54706E+01         3.02741E+02         1.18960E+02         1.83781E+02
+          5.79766E-03         1.83649E-02        -1.12695E-02         3.64216E-01         1.37322E+00         3.64391E-01         3.01152E+02         1.00887E+00         3.55463E+01         3.05545E+02         1.22105E+02         1.83441E+02
+          5.79766E-03         1.85347E-02        -1.14664E-02         3.64215E-01         1.38389E+00         3.64396E-01         3.04530E+02         1.00886E+00         3.56228E+01         3.08149E+02         1.25151E+02         1.82998E+02
+          5.79766E-03         1.87045E-02        -1.16651E-02         3.64214E-01         1.39457E+00         3.64401E-01         3.07693E+02         1.00886E+00         3.56977E+01         3.10534E+02         1.28082E+02         1.82452E+02
+          5.79766E-03         1.88744E-02        -1.18657E-02         3.64213E-01         1.40524E+00         3.64406E-01         3.10623E+02         1.00886E+00         3.57689E+01         3.12686E+02         1.30882E+02         1.81803E+02
+          5.79766E-03         1.90442E-02        -1.20680E-02         3.64212E-01         1.41591E+00         3.64411E-01         3.13304E+02         1.00886E+00         3.58342E+01         3.14590E+02         1.33538E+02         1.81052E+02
+          5.79766E-03         1.92140E-02        -1.22722E-02         3.64210E-01         1.42658E+00         3.64417E-01         3.15721E+02         1.00886E+00         3.58918E+01         3.16237E+02         1.36037E+02         1.80200E+02
+          5.79766E-03         1.93839E-02        -1.24781E-02         3.64209E-01         1.43725E+00         3.64423E-01         3.17864E+02         1.00886E+00         3.59403E+01         3.17617E+02         1.38370E+02         1.79247E+02
+          5.79766E-03         1.95537E-02        -1.26859E-02         3.64208E-01         1.44792E+00         3.64429E-01         3.19724E+02         1.00886E+00         3.59780E+01         3.18724E+02         1.40527E+02         1.78197E+02
+          5.79766E-03         1.97235E-02        -1.28955E-02         3.64207E-01         1.45859E+00         3.64435E-01         3.21293E+02         1.00886E+00         3.60038E+01         3.19554E+02         1.42503E+02         1.77051E+02
+          5.79766E-03         1.98933E-02        -1.31069E-02         3.64206E-01         1.46926E+00         3.64441E-01         3.22565E+02         1.00886E+00         3.60164E+01         3.20103E+02         1.44291E+02         1.75812E+02
+          5.79766E-03         2.00632E-02        -1.33201E-02         3.64204E-01         1.47993E+00         3.64448E-01         3.23539E+02         1.00886E+00         3.60148E+01         3.20370E+02         1.45887E+02         1.74483E+02
+          5.79766E-03         2.02330E-02        -1.35352E-02         3.64203E-01         1.49060E+00         3.64455E-01         3.24211E+02         1.00886E+00         3.59983E+01         3.20356E+02         1.47289E+02         1.73066E+02
+          5.79766E-03         2.04028E-02        -1.37520E-02         3.64202E-01         1.50127E+00         3.64461E-01         3.24582E+02         1.00886E+00         3.59661E+01         3.20062E+02         1.48495E+02         1.71567E+02
+          5.79766E-03         2.05726E-02        -1.39707E-02         3.64201E-01         1.51194E+00         3.64468E-01         3.24654E+02         1.00886E+00         3.59175E+01         3.19493E+02         1.49505E+02         1.69988E+02
+          5.79766E-03         2.07425E-02        -1.41911E-02         3.64199E-01         1.52261E+00         3.64476E-01         3.24429E+02         1.00886E+00         3.58521E+01         3.18652E+02         1.50319E+02         1.68333E+02
+          5.79766E-03         2.09123E-02        -1.44134E-02         3.64198E-01         1.53328E+00         3.64483E-01         3.23911E+02         1.00886E+00         3.57695E+01         3.17546E+02         1.50940E+02         1.66606E+02
+          5.79766E-03         2.10821E-02        -1.46375E-02         3.64197E-01         1.54395E+00         3.64491E-01         3.23107E+02         1.00885E+00         3.56695E+01         3.16181E+02         1.51369E+02         1.64812E+02
+          5.79766E-03         2.12520E-02        -1.48634E-02         3.64195E-01         1.55462E+00         3.64499E-01         3.22022E+02         1.00885E+00         3.55517E+01         3.14566E+02         1.51611E+02         1.62955E+02
+          5.79766E-03         2.14218E-02        -1.50911E-02         3.64194E-01         1.56529E+00         3.64507E-01         3.20665E+02         1.00885E+00         3.54161E+01         3.12709E+02         1.51669E+02         1.61040E+02
+          5.79766E-03         2.15916E-02        -1.53207E-02         3.64193E-01         1.57596E+00         3.64515E-01         3.19044E+02         1.00885E+00         3.52626E+01         3.10620E+02         1.51548E+02         1.59071E+02
+          5.79766E-03         2.17614E-02        -1.55520E-02         3.64191E-01         1.58664E+00         3.64523E-01         3.17168E+02         1.00885E+00         3.50913E+01         3.08308E+02         1.51255E+02         1.57054E+02
+          5.79766E-03         2.19313E-02        -1.57852E-02         3.64190E-01         1.59731E+00         3.64532E-01         3.15048E+02         1.00885E+00         3.49023E+01         3.05786E+02         1.50795E+02         1.54992E+02
+          5.79766E-03         2.21011E-02        -1.60202E-02         3.64189E-01         1.60798E+00         3.64541E-01         3.12694E+02         1.00885E+00         3.46956E+01         3.03065E+02         1.50174E+02         1.52890E+02
+          5.79766E-03         2.22709E-02        -1.62570E-02         3.64187E-01         1.61865E+00         3.64550E-01         3.10118E+02         1.00885E+00         3.44715E+01         3.00155E+02         1.49401E+02         1.50754E+02
+          5.79766E-03         2.24407E-02        -1.64956E-02         3.64186E-01         1.62932E+00         3.64559E-01         3.07332E+02         1.00885E+00         3.42303E+01         2.97070E+02         1.48482E+02         1.48589E+02
+          5.79766E-03         2.26106E-02        -1.67360E-02         3.64185E-01         1.63999E+00         3.64569E-01         3.04348E+02         1.00885E+00         3.39723E+01         2.93822E+02         1.47424E+02         1.46398E+02
+          5.79766E-03         2.27804E-02        -1.69782E-02         3.64183E-01         1.65066E+00         3.64579E-01         3.01178E+02         1.00885E+00         3.36977E+01         2.90424E+02         1.46237E+02         1.44187E+02
+          5.79766E-03         2.29502E-02        -1.72223E-02         3.64182E-01         1.66133E+00         3.64589E-01         2.97836E+02         1.00884E+00         3.34070E+01         2.86887E+02         1.44928E+02         1.41959E+02
+          5.79766E-03         2.31201E-02        -1.74681E-02         3.64180E-01         1.67200E+00         3.64599E-01         2.94334E+02         1.00884E+00         3.31005E+01         2.83226E+02         1.43505E+02         1.39721E+02
+          5.79766E-03         2.32899E-02        -1.77158E-02         3.64179E-01         1.68267E+00         3.64610E-01         2.90686E+02         1.00884E+00         3.27787E+01         2.79452E+02         1.41976E+02         1.37476E+02
+          5.79766E-03         2.34597E-02        -1.79653E-02         3.64177E-01         1.69334E+00         3.64620E-01         2.86905E+02         1.00884E+00         3.24420E+01         2.75578E+02         1.40350E+02         1.35228E+02
+          5.79766E-03         2.36295E-02        -1.82166E-02         3.64176E-01         1.70401E+00         3.64631E-01         2.83003E+02         1.00884E+00         3.20909E+01         2.71618E+02         1.38636E+02         1.32982E+02
+          5.79766E-03         2.37994E-02        -1.84697E-02         3.64175E-01         1.71468E+00         3.64643E-01         2.78994E+02         1.00884E+00         3.17260E+01         2.67582E+02         1.36841E+02         1.30741E+02
+          5.79766E-03         2.39692E-02        -1.87246E-02         3.64173E-01         1.72535E+00         3.64654E-01         2.74890E+02         1.00884E+00         3.13477E+01         2.63484E+02         1.34974E+02         1.28510E+02
+          5.79766E-03         2.41390E-02        -1.89814E-02         3.64172E-01         1.73602E+00         3.64666E-01         2.70705E+02         1.00884E+00         3.09565E+01         2.59336E+02         1.33043E+02         1.26292E+02
+          5.79766E-03         2.43088E-02        -1.92399E-02         3.64170E-01         1.74669E+00         3.64678E-01         2.66451E+02         1.00884E+00         3.05530E+01         2.55147E+02         1.31056E+02         1.24091E+02
+          5.79766E-03         2.44787E-02        -1.95003E-02         3.64169E-01         1.75736E+00         3.64690E-01         2.62140E+02         1.00883E+00         3.01378E+01         2.50931E+02         1.29021E+02         1.21910E+02
+          5.79766E-03         2.46485E-02        -1.97625E-02         3.64167E-01         1.76804E+00         3.64703E-01         2.57784E+02         1.00883E+00         2.97114E+01         2.46697E+02         1.26944E+02         1.19753E+02
+          5.79766E-03         2.48183E-02        -2.00265E-02         3.64165E-01         1.77871E+00         3.64716E-01         2.53394E+02         1.00883E+00         2.92744E+01         2.42456E+02         1.24834E+02         1.17622E+02
+          5.79766E-03         2.49882E-02        -2.02923E-02         3.64164E-01         1.78938E+00         3.64729E-01         2.48982E+02         1.00883E+00         2.88272E+01         2.38218E+02         1.22698E+02         1.15520E+02
+          5.79766E-03         2.51580E-02        -2.05599E-02         3.64162E-01         1.80005E+00         3.64742E-01         2.44558E+02         1.00883E+00         2.83707E+01         2.33992E+02         1.20542E+02         1.13449E+02
+          5.79766E-03         2.53278E-02        -2.08293E-02         3.64161E-01         1.81072E+00         3.64756E-01         2.40132E+02         1.00883E+00         2.79052E+01         2.29787E+02         1.18373E+02         1.11413E+02
+          5.79766E-03         2.54976E-02        -2.11006E-02         3.64159E-01         1.82139E+00         3.64770E-01         2.35715E+02         1.00883E+00         2.74314E+01         2.25611E+02         1.16197E+02         1.09414E+02
+          5.79766E-03         2.56675E-02        -2.13737E-02         3.64158E-01         1.83206E+00         3.64784E-01         2.31316E+02         1.00882E+00         2.69499E+01         2.21473E+02         1.14021E+02         1.07452E+02
+          5.79766E-03         2.58373E-02        -2.16485E-02         3.64156E-01         1.84273E+00         3.64799E-01         2.26944E+02         1.00882E+00         2.64612E+01         2.17380E+02         1.11848E+02         1.05531E+02
+          5.79766E-03         2.60071E-02        -2.19252E-02         3.64154E-01         1.85340E+00         3.64814E-01         2.22607E+02         1.00882E+00         2.59659E+01         2.13338E+02         1.09686E+02         1.03652E+02
+          5.79766E-03         2.61769E-02        -2.22037E-02         3.64153E-01         1.86407E+00         3.64829E-01         2.18312E+02         1.00882E+00         2.54646E+01         2.09355E+02         1.07539E+02         1.01816E+02
+          5.96749E-03         8.72665E-04        -7.59890E-04         3.74948E-01         2.74155E-01         3.74949E-01         7.55694E+03         1.00763E+00         4.03066E+02         7.44911E+03         6.37534E+03         1.07376E+03
+          5.96749E-03         1.04249E-03        -7.70108E-04         3.74948E-01         2.84826E-01         3.74949E-01         7.42561E+03         1.00763E+00         3.96799E+02         7.31855E+03         6.26235E+03         1.05620E+03
+          5.96749E-03         1.21232E-03        -7.82138E-04         3.74948E-01         2.95496E-01         3.74949E-01         7.29142E+03         1.00763E+00         3.90397E+02         7.18517E+03         6.14691E+03         1.03825E+03
+          5.96749E-03         1.38215E-03        -7.95980E-04         3.74948E-01         3.06167E-01         3.74949E-01         7.15456E+03         1.00763E+00         3.83868E+02         7.04917E+03         6.02921E+03         1.01996E+03
+          5.96749E-03         1.55197E-03        -8.11634E-04         3.74948E-01         3.16838E-01         3.74949E-01         7.01526E+03         1.00763E+00         3.77225E+02         6.91077E+03         5.90941E+03         1.00135E+03
+          5.96749E-03         1.72180E-03        -8.29100E-04         3.74948E-01         3.27508E-01         3.74949E-01         6.87373E+03         1.00763E+00         3.70475E+02         6.77018E+03         5.78772E+03         9.82452E+02
+          5.96749E-03         1.89163E-03        -8.48379E-04         3.74948E-01         3.38179E-01         3.74949E-01         6.73018E+03         1.00763E+00         3.63631E+02         6.62761E+03         5.66432E+03         9.63291E+02
+          5.96749E-03         2.06146E-03        -8.69469E-04         3.74947E-01         3.48849E-01         3.74948E-01         6.58482E+03         1.00763E+00         3.56701E+02         6.48328E+03         5.53938E+03         9.43899E+02
+          5.96749E-03         2.23128E-03        -8.92372E-04         3.74947E-01         3.59520E-01         3.74948E-01         6.43788E+03         1.00763E+00         3.49696E+02         6.33740E+03         5.41310E+03         9.24305E+02
+          5.96749E-03         2.40111E-03        -9.17087E-04         3.74947E-01         3.70190E-01         3.74948E-01         6.28956E+03         1.00763E+00         3.42627E+02         6.19020E+03         5.28566E+03         9.04540E+02
+          5.96749E-03         2.57094E-03        -9.43613E-04         3.74947E-01         3.80861E-01         3.74948E-01         6.14008E+03         1.00763E+00         3.35503E+02         6.04188E+03         5.15724E+03         8.84633E+02
+          5.96749E-03         2.74077E-03        -9.71953E-04         3.74947E-01         3.91532E-01         3.74948E-01         5.98965E+03         1.00763E+00         3.28335E+02         5.89265E+03         5.02803E+03         8.64614E+02
+          5.96749E-03         2.91059E-03        -1.00210E-03         3.74947E-01         4.02202E-01         3.74948E-01         5.83848E+03         1.00763E+00         3.21132E+02         5.74273E+03         4.89822E+03         8.44511E+02
+          5.96749E-03         3.08042E-03        -1.03407E-03         3.74946E-01         4.12873E-01         3.74948E-01         5.68678E+03         1.00763E+00         3.13905E+02         5.59233E+03         4.76797E+03         8.24355E+02
+          5.96749E-03         3.25025E-03        -1.06784E-03         3.74946E-01         4.23543E-01         3.74948E-01         5.53477E+03         1.00763E+00         3.06662E+02         5.44165E+03         4.63747E+03         8.04173E+02
+          5.96749E-03         3.42008E-03        -1.10343E-03         3.74946E-01         4.34214E-01         3.74948E-01         5.38263E+03         1.00763E+00         2.99414E+02         5.29089E+03         4.50690E+03         7.83995E+02
+          5.96749E-03         3.58990E-03        -1.14083E-03         3.74946E-01         4.44884E-01         3.74948E-01         5.23058E+03         1.00763E+00         2.92170E+02         5.14027E+03         4.37642E+03         7.63847E+02
+          5.96749E-03         3.75973E-03        -1.18004E-03         3.74946E-01         4.55555E-01         3.74947E-01         5.07880E+03         1.00763E+00         2.84938E+02         4.98996E+03         4.24620E+03         7.43758E+02
+          5.96749E-03         3.92956E-03        -1.22107E-03         3.74945E-01         4.66225E-01         3.74947E-01         4.92750E+03         1.00763E+00         2.77729E+02         4.84017E+03         4.11641E+03         7.23754E+02
+          5.96749E-03         4.09939E-03        -1.26390E-03         3.74945E-01         4.76896E-01         3.74947E-01         4.77685E+03         1.00763E+00         2.70550E+02         4.69108E+03         3.98721E+03         7.03862E+02
+          5.96749E-03         4.26921E-03        -1.30855E-03         3.74945E-01         4.87567E-01         3.74947E-01         4.62705E+03         1.00763E+00         2.63411E+02         4.54287E+03         3.85876E+03         6.84108E+02
+          5.96749E-03         4.43904E-03        -1.35501E-03         3.74945E-01         4.98237E-01         3.74947E-01         4.47827E+03         1.00763E+00         2.56318E+02         4.39572E+03         3.73120E+03         6.64515E+02
+          5.96749E-03         4.60887E-03        -1.40328E-03         3.74944E-01         5.08908E-01         3.74947E-01         4.33068E+03         1.00763E+00         2.49281E+02         4.24980E+03         3.60469E+03         6.45109E+02
+          5.96749E-03         4.77869E-03        -1.45337E-03         3.74944E-01         5.19578E-01         3.74947E-01         4.18445E+03         1.00763E+00         2.42306E+02         4.10528E+03         3.47937E+03         6.25913E+02
+          5.96749E-03         4.94852E-03        -1.50527E-03         3.74944E-01         5.30249E-01         3.74947E-01         4.03974E+03         1.00763E+00         2.35401E+02         3.96232E+03         3.35537E+03         6.06949E+02
+          5.96749E-03         5.11835E-03        -1.55898E-03         3.74943E-01         5.40919E-01         3.74947E-01         3.89670E+03         1.00763E+00         2.28573E+02         3.82107E+03         3.23283E+03         5.88239E+02
+          5.96749E-03         5.28818E-03        -1.61450E-03         3.74943E-01         5.51590E-01         3.74946E-01         3.75549E+03         1.00763E+00         2.21829E+02         3.68167E+03         3.11187E+03         5.69804E+02
+          5.96749E-03         5.45800E-03        -1.67183E-03         3.74943E-01         5.62261E-01         3.74946E-01         3.61624E+03         1.00763E+00         2.15175E+02         3.54427E+03         2.99261E+03         5.51664E+02
+          5.96749E-03         5.62783E-03        -1.73098E-03         3.74942E-01         5.72931E-01         3.74946E-01         3.47909E+03         1.00763E+00         2.08616E+02         3.40900E+03         2.87517E+03         5.33837E+02
+          5.96749E-03         5.79766E-03        -1.79194E-03         3.74942E-01         5.83602E-01         3.74946E-01         3.34417E+03         1.00763E+00         2.02158E+02         3.27599E+03         2.75965E+03         5.16341E+02
+          5.96749E-03         5.96749E-03        -1.85471E-03         3.74942E-01         5.94272E-01         3.74946E-01         3.21160E+03         1.00763E+00         1.95807E+02         3.14535E+03         2.64615E+03         4.99193E+02
+          5.96749E-03         6.13731E-03        -1.91929E-03         3.74941E-01         6.04943E-01         3.74946E-01         3.08148E+03         1.00763E+00         1.89568E+02         3.01719E+03         2.53478E+03         4.82409E+02
+          5.96749E-03         6.30714E-03        -1.98568E-03         3.74941E-01         6.15613E-01         3.74946E-01         2.95393E+03         1.00763E+00         1.83444E+02         2.89162E+03         2.42561E+03         4.66004E+02
+          5.96749E-03         6.47697E-03        -2.05389E-03         3.74940E-01         6.26284E-01         3.74946E-01         2.82904E+03         1.00763E+00         1.77440E+02         2.76873E+03         2.31874E+03         4.49990E+02
+          5.96749E-03         6.64680E-03        -2.12391E-03         3.74940E-01         6.36955E-01         3.74946E-01         2.70691E+03         1.00763E+00         1.71559E+02         2.64861E+03         2.21423E+03         4.34381E+02
+          5.96749E-03         6.81662E-03        -2.19574E-03         3.74940E-01         6.47625E-01         3.74946E-01         2.58761E+03         1.00763E+00         1.65805E+02         2.53135E+03         2.11216E+03         4.19188E+02
+          5.96749E-03         6.98645E-03        -2.26938E-03         3.74939E-01         6.58296E-01         3.74946E-01         2.47123E+03         1.00763E+00         1.60181E+02         2.41701E+03         2.01259E+03         4.04421E+02
+          5.96749E-03         7.15628E-03        -2.34484E-03         3.74939E-01         6.68966E-01         3.74946E-01         2.35783E+03         1.00763E+00         1.54690E+02         2.30566E+03         1.91557E+03         3.90089E+02
+          5.96749E-03         7.32611E-03        -2.42211E-03         3.74938E-01         6.79637E-01         3.74946E-01         2.24746E+03         1.00763E+00         1.49333E+02         2.19736E+03         1.82116E+03         3.76201E+02
+          5.96749E-03         7.49593E-03        -2.50119E-03         3.74938E-01         6.90307E-01         3.74946E-01         2.14019E+03         1.00763E+00         1.44112E+02         2.09215E+03         1.72939E+03         3.62762E+02
+          5.96749E-03         7.66576E-03        -2.58208E-03         3.74937E-01         7.00978E-01         3.74946E-01         2.03606E+03         1.00763E+00         1.39029E+02         1.99009E+03         1.64031E+03         3.49780E+02
+          5.96749E-03         7.83559E-03        -2.66479E-03         3.74937E-01         7.11649E-01         3.74946E-01         1.93511E+03         1.00763E+00         1.34084E+02         1.89120E+03         1.55395E+03         3.37258E+02
+          5.96749E-03         8.00542E-03        -2.74931E-03         3.74936E-01         7.22319E-01         3.74946E-01         1.83736E+03         1.00763E+00         1.29280E+02         1.79552E+03         1.47032E+03         3.25200E+02
+          5.96749E-03         8.17524E-03        -2.83563E-03         3.74936E-01         7.32990E-01         3.74946E-01         1.74284E+03         1.00763E+00         1.24615E+02         1.70306E+03         1.38945E+03         3.13608E+02
+          5.96749E-03         8.34507E-03        -2.92378E-03         3.74935E-01         7.43660E-01         3.74947E-01         1.65157E+03         1.00763E+00         1.20091E+02         1.61384E+03         1.31135E+03         3.02484E+02
+          5.96749E-03         8.51490E-03        -3.01373E-03         3.74935E-01         7.54331E-01         3.74947E-01         1.56356E+03         1.00763E+00         1.15706E+02         1.52786E+03         1.23603E+03         2.91828E+02
+          5.96749E-03         8.68473E-03        -3.10550E-03         3.74934E-01         7.65001E-01         3.74947E-01         1.47881E+03         1.00763E+00         1.11460E+02         1.44513E+03         1.16349E+03         2.81640E+02
+          5.96749E-03         8.85455E-03        -3.19908E-03         3.74934E-01         7.75672E-01         3.74947E-01         1.39731E+03         1.00763E+00         1.07353E+02         1.36563E+03         1.09372E+03         2.71918E+02
+          5.96749E-03         9.02438E-03        -3.29447E-03         3.74933E-01         7.86343E-01         3.74947E-01         1.31906E+03         1.00763E+00         1.03383E+02         1.28937E+03         1.02671E+03         2.62658E+02
+          5.96749E-03         9.19421E-03        -3.39167E-03         3.74932E-01         7.97013E-01         3.74948E-01         1.24404E+03         1.00763E+00         9.95497E+01         1.21630E+03         9.62445E+02         2.53859E+02
+          5.96749E-03         9.36403E-03        -3.49069E-03         3.74932E-01         8.07684E-01         3.74948E-01         1.17223E+03         1.00763E+00         9.58502E+01         1.14642E+03         9.00910E+02         2.45514E+02
+          5.96749E-03         9.53386E-03        -3.59152E-03         3.74931E-01         8.18354E-01         3.74948E-01         1.10359E+03         1.00763E+00         9.22834E+01         1.07970E+03         8.42077E+02         2.37618E+02
+          5.96749E-03         9.70369E-03        -3.69416E-03         3.74931E-01         8.29025E-01         3.74949E-01         1.03811E+03         1.00763E+00         8.88471E+01         1.01608E+03         7.85918E+02         2.30166E+02
+          5.96749E-03         9.87352E-03        -3.79861E-03         3.74930E-01         8.39695E-01         3.74949E-01         9.75733E+02         1.00763E+00         8.55392E+01         9.55547E+02         7.32397E+02         2.23150E+02
+          5.96749E-03         1.00433E-02        -3.90488E-03         3.74929E-01         8.50366E-01         3.74950E-01         9.16423E+02         1.00763E+00         8.23573E+01         8.98040E+02         6.81478E+02         2.16562E+02
+          5.96749E-03         1.02132E-02        -4.01295E-03         3.74929E-01         8.61037E-01         3.74950E-01         8.60131E+02         1.00763E+00         7.92990E+01         8.43511E+02         6.33118E+02         2.10394E+02
+          5.96749E-03         1.03830E-02        -4.12284E-03         3.74928E-01         8.71707E-01         3.74951E-01         8.06805E+02         1.00763E+00         7.63617E+01         7.91907E+02         5.87272E+02         2.04636E+02
+          5.96749E-03         1.05528E-02        -4.23455E-03         3.74927E-01         8.82378E-01         3.74951E-01         7.56388E+02         1.00763E+00         7.35428E+01         7.43169E+02         5.43891E+02         1.99278E+02
+          5.96749E-03         1.07227E-02        -4.34806E-03         3.74927E-01         8.93048E-01         3.74952E-01         7.08819E+02         1.00763E+00         7.08396E+01         6.97234E+02         5.02924E+02         1.94310E+02
+          5.96749E-03         1.08925E-02        -4.46339E-03         3.74926E-01         9.03719E-01         3.74953E-01         6.64035E+02         1.00762E+00         6.82492E+01         6.54036E+02         4.64315E+02         1.89721E+02
+          5.96749E-03         1.10623E-02        -4.58053E-03         3.74925E-01         9.14389E-01         3.74953E-01         6.21969E+02         1.00762E+00         6.57690E+01         6.13505E+02         4.28007E+02         1.85498E+02
+          5.96749E-03         1.12321E-02        -4.69948E-03         3.74925E-01         9.25060E-01         3.74954E-01         5.82550E+02         1.00762E+00         6.33962E+01         5.75571E+02         3.93940E+02         1.81630E+02
+          5.96749E-03         1.14020E-02        -4.82025E-03         3.74924E-01         9.35731E-01         3.74955E-01         5.45704E+02         1.00762E+00         6.11280E+01         5.40157E+02         3.62052E+02         1.78104E+02
+          5.96749E-03         1.15718E-02        -4.94282E-03         3.74923E-01         9.46401E-01         3.74956E-01         5.11357E+02         1.00762E+00         5.89618E+01         5.07186E+02         3.32278E+02         1.74908E+02
+          5.96749E-03         1.17416E-02        -5.06721E-03         3.74922E-01         9.57072E-01         3.74957E-01         4.79430E+02         1.00762E+00         5.68950E+01         4.76580E+02         3.04552E+02         1.72027E+02
+          5.96749E-03         1.19114E-02        -5.19342E-03         3.74922E-01         9.67742E-01         3.74958E-01         4.49844E+02         1.00762E+00         5.49249E+01         4.48256E+02         2.78808E+02         1.69449E+02
+          5.96749E-03         1.20813E-02        -5.32143E-03         3.74921E-01         9.78413E-01         3.74959E-01         4.22517E+02         1.00762E+00         5.30491E+01         4.22134E+02         2.54975E+02         1.67159E+02
+          5.96749E-03         1.22511E-02        -5.45126E-03         3.74920E-01         9.89083E-01         3.74960E-01         3.97367E+02         1.00762E+00         5.12653E+01         3.98128E+02         2.32985E+02         1.65143E+02
+          5.96749E-03         1.24209E-02        -5.58290E-03         3.74919E-01         9.99754E-01         3.74961E-01         3.74309E+02         1.00762E+00         4.95711E+01         3.76154E+02         2.12767E+02         1.63387E+02
+          5.96749E-03         1.25908E-02        -5.71635E-03         3.74919E-01         1.01042E+00         3.74962E-01         3.53259E+02         1.00762E+00         4.79645E+01         3.56126E+02         1.94249E+02         1.61877E+02
+          5.96749E-03         1.27606E-02        -5.85162E-03         3.74918E-01         1.02110E+00         3.74963E-01         3.34131E+02         1.00762E+00         4.64433E+01         3.37958E+02         1.77361E+02         1.60598E+02
+          5.96749E-03         1.29304E-02        -5.98869E-03         3.74917E-01         1.03177E+00         3.74965E-01         3.16839E+02         1.00762E+00         4.50055E+01         3.21564E+02         1.62029E+02         1.59535E+02
+          5.96749E-03         1.31002E-02        -6.12758E-03         3.74916E-01         1.04244E+00         3.74966E-01         3.01298E+02         1.00762E+00         4.36494E+01         3.06858E+02         1.48183E+02         1.58676E+02
+          5.96749E-03         1.32701E-02        -6.26829E-03         3.74915E-01         1.05311E+00         3.74968E-01         2.87421E+02         1.00762E+00         4.23730E+01         2.93753E+02         1.35750E+02         1.58004E+02
+          5.96749E-03         1.34399E-02        -6.41080E-03         3.74914E-01         1.06378E+00         3.74969E-01         2.75122E+02         1.00762E+00         4.11746E+01         2.82164E+02         1.24659E+02         1.57505E+02
+          5.96749E-03         1.36097E-02        -6.55513E-03         3.74914E-01         1.07445E+00         3.74971E-01         2.64317E+02         1.00762E+00         4.00525E+01         2.72006E+02         1.14840E+02         1.57167E+02
+          5.96749E-03         1.37795E-02        -6.70127E-03         3.74913E-01         1.08512E+00         3.74973E-01         2.54922E+02         1.00762E+00         3.90050E+01         2.63195E+02         1.06222E+02         1.56973E+02
+          5.96749E-03         1.39494E-02        -6.84922E-03         3.74912E-01         1.09579E+00         3.74974E-01         2.46853E+02         1.00762E+00         3.80304E+01         2.55648E+02         9.87364E+01         1.56912E+02
+          5.96749E-03         1.41192E-02        -6.99899E-03         3.74911E-01         1.10646E+00         3.74976E-01         2.40026E+02         1.00762E+00         3.71270E+01         2.49283E+02         9.23148E+01         1.56968E+02
+          5.96749E-03         1.42890E-02        -7.15057E-03         3.74910E-01         1.11713E+00         3.74978E-01         2.34363E+02         1.00762E+00         3.62930E+01         2.44020E+02         8.68902E+01         1.57130E+02
+          5.96749E-03         1.44589E-02        -7.30396E-03         3.74909E-01         1.12780E+00         3.74980E-01         2.29782E+02         1.00762E+00         3.55264E+01         2.39780E+02         8.23967E+01         1.57383E+02
+          5.96749E-03         1.46287E-02        -7.45916E-03         3.74908E-01         1.13847E+00         3.74982E-01         2.26206E+02         1.00762E+00         3.48255E+01         2.36486E+02         7.87701E+01         1.57716E+02
+          5.96749E-03         1.47985E-02        -7.61618E-03         3.74907E-01         1.14914E+00         3.74985E-01         2.23558E+02         1.00762E+00         3.41880E+01         2.34062E+02         7.59474E+01         1.58115E+02
+          5.96749E-03         1.49683E-02        -7.77501E-03         3.74906E-01         1.15981E+00         3.74987E-01         2.21765E+02         1.00762E+00         3.36118E+01         2.32437E+02         7.38675E+01         1.58569E+02
+          5.96749E-03         1.51382E-02        -7.93565E-03         3.74905E-01         1.17048E+00         3.74989E-01         2.20752E+02         1.00762E+00         3.30945E+01         2.31538E+02         7.24707E+01         1.59067E+02
+          5.96749E-03         1.53080E-02        -8.09811E-03         3.74904E-01         1.18115E+00         3.74992E-01         2.20452E+02         1.00762E+00         3.26336E+01         2.31297E+02         7.16994E+01         1.59598E+02
+          5.96749E-03         1.54778E-02        -8.26238E-03         3.74903E-01         1.19182E+00         3.74994E-01         2.20794E+02         1.00762E+00         3.22264E+01         2.31647E+02         7.14976E+01         1.60149E+02
+          5.96749E-03         1.56476E-02        -8.42846E-03         3.74902E-01         1.20249E+00         3.74997E-01         2.21713E+02         1.00762E+00         3.18701E+01         2.32524E+02         7.18114E+01         1.60713E+02
+          5.96749E-03         1.58175E-02        -8.59635E-03         3.74901E-01         1.21317E+00         3.75000E-01         2.23146E+02         1.00762E+00         3.15618E+01         2.33867E+02         7.25889E+01         1.61278E+02
+          5.96749E-03         1.59873E-02        -8.76606E-03         3.74900E-01         1.22384E+00         3.75003E-01         2.25032E+02         1.00762E+00         3.12985E+01         2.35616E+02         7.37802E+01         1.61836E+02
+          5.96749E-03         1.61571E-02        -8.93757E-03         3.74899E-01         1.23451E+00         3.75006E-01         2.27312E+02         1.00762E+00         3.10771E+01         2.37715E+02         7.53374E+01         1.62378E+02
+          5.96749E-03         1.63270E-02        -9.11091E-03         3.74898E-01         1.24518E+00         3.75009E-01         2.29930E+02         1.00762E+00         3.08943E+01         2.40110E+02         7.72148E+01         1.62895E+02
+          5.96749E-03         1.64968E-02        -9.28605E-03         3.74897E-01         1.25585E+00         3.75012E-01         2.32833E+02         1.00762E+00         3.07470E+01         2.42750E+02         7.93688E+01         1.63381E+02
+          5.96749E-03         1.66666E-02        -9.46301E-03         3.74896E-01         1.26652E+00         3.75016E-01         2.35970E+02         1.00762E+00         3.06319E+01         2.45585E+02         8.17580E+01         1.63827E+02
+          5.96749E-03         1.68364E-02        -9.64178E-03         3.74895E-01         1.27719E+00         3.75019E-01         2.39293E+02         1.00762E+00         3.05458E+01         2.48571E+02         8.43432E+01         1.64228E+02
+          5.96749E-03         1.70063E-02        -9.82236E-03         3.74894E-01         1.28786E+00         3.75023E-01         2.42755E+02         1.00762E+00         3.04854E+01         2.51664E+02         8.70872E+01         1.64576E+02
+          5.96749E-03         1.71761E-02        -1.00048E-02         3.74893E-01         1.29853E+00         3.75026E-01         2.46315E+02         1.00762E+00         3.04477E+01         2.54822E+02         8.99550E+01         1.64867E+02
+          5.96749E-03         1.73459E-02        -1.01890E-02         3.74892E-01         1.30920E+00         3.75030E-01         2.49932E+02         1.00762E+00         3.04296E+01         2.58010E+02         9.29139E+01         1.65096E+02
+          5.96749E-03         1.75158E-02        -1.03750E-02         3.74891E-01         1.31987E+00         3.75034E-01         2.53569E+02         1.00761E+00         3.04283E+01         2.61191E+02         9.59332E+01         1.65257E+02
+          5.96749E-03         1.76856E-02        -1.05628E-02         3.74890E-01         1.33054E+00         3.75038E-01         2.57190E+02         1.00761E+00         3.04407E+01         2.64332E+02         9.89842E+01         1.65348E+02
+          5.96749E-03         1.78554E-02        -1.07525E-02         3.74888E-01         1.34121E+00         3.75043E-01         2.60762E+02         1.00761E+00         3.04644E+01         2.67404E+02         1.02040E+02         1.65363E+02
+          5.96749E-03         1.80252E-02        -1.09439E-02         3.74887E-01         1.35188E+00         3.75047E-01         2.64257E+02         1.00761E+00         3.04967E+01         2.70379E+02         1.05077E+02         1.65301E+02
+          5.96749E-03         1.81951E-02        -1.11372E-02         3.74886E-01         1.36255E+00         3.75052E-01         2.67646E+02         1.00761E+00         3.05352E+01         2.73231E+02         1.08073E+02         1.65159E+02
+          5.96749E-03         1.83649E-02        -1.13323E-02         3.74885E-01         1.37322E+00         3.75056E-01         2.70904E+02         1.00761E+00         3.05777E+01         2.75940E+02         1.11005E+02         1.64934E+02
+          5.96749E-03         1.85347E-02        -1.15292E-02         3.74884E-01         1.38389E+00         3.75061E-01         2.74009E+02         1.00761E+00         3.06220E+01         2.78483E+02         1.13857E+02         1.64626E+02
+          5.96749E-03         1.87045E-02        -1.17279E-02         3.74883E-01         1.39457E+00         3.75066E-01         2.76940E+02         1.00761E+00         3.06663E+01         2.80844E+02         1.16611E+02         1.64233E+02
+          5.96749E-03         1.88744E-02        -1.19284E-02         3.74881E-01         1.40524E+00         3.75071E-01         2.79680E+02         1.00761E+00         3.07087E+01         2.83006E+02         1.19252E+02         1.63754E+02
+          5.96749E-03         1.90442E-02        -1.21308E-02         3.74880E-01         1.41591E+00         3.75076E-01         2.82212E+02         1.00761E+00         3.07475E+01         2.84956E+02         1.21767E+02         1.63189E+02
+          5.96749E-03         1.92140E-02        -1.23349E-02         3.74879E-01         1.42658E+00         3.75082E-01         2.84522E+02         1.00761E+00         3.07813E+01         2.86682E+02         1.24143E+02         1.62539E+02
+          5.96749E-03         1.93839E-02        -1.25409E-02         3.74878E-01         1.43725E+00         3.75088E-01         2.86600E+02         1.00761E+00         3.08087E+01         2.88175E+02         1.26372E+02         1.61803E+02
+          5.96749E-03         1.95537E-02        -1.27487E-02         3.74877E-01         1.44792E+00         3.75093E-01         2.88434E+02         1.00761E+00         3.08284E+01         2.89427E+02         1.28444E+02         1.60983E+02
+          5.96749E-03         1.97235E-02        -1.29583E-02         3.74875E-01         1.45859E+00         3.75099E-01         2.90017E+02         1.00761E+00         3.08394E+01         2.90433E+02         1.30352E+02         1.60080E+02
+          5.96749E-03         1.98933E-02        -1.31697E-02         3.74874E-01         1.46926E+00         3.75105E-01         2.91344E+02         1.00761E+00         3.08407E+01         2.91187E+02         1.32091E+02         1.59095E+02
+          5.96749E-03         2.00632E-02        -1.33829E-02         3.74873E-01         1.47993E+00         3.75112E-01         2.92408E+02         1.00760E+00         3.08314E+01         2.91688E+02         1.33656E+02         1.58031E+02
+          5.96749E-03         2.02330E-02        -1.35979E-02         3.74871E-01         1.49060E+00         3.75118E-01         2.93209E+02         1.00760E+00         3.08108E+01         2.91934E+02         1.35044E+02         1.56889E+02
+          5.96749E-03         2.04028E-02        -1.38148E-02         3.74870E-01         1.50127E+00         3.75125E-01         2.93743E+02         1.00760E+00         3.07781E+01         2.91926E+02         1.36253E+02         1.55673E+02
+          5.96749E-03         2.05726E-02        -1.40334E-02         3.74869E-01         1.51194E+00         3.75131E-01         2.94012E+02         1.00760E+00         3.07330E+01         2.91666E+02         1.37282E+02         1.54383E+02
+          5.96749E-03         2.07425E-02        -1.42539E-02         3.74868E-01         1.52261E+00         3.75138E-01         2.94017E+02         1.00760E+00         3.06748E+01         2.91156E+02         1.38131E+02         1.53025E+02
+          5.96749E-03         2.09123E-02        -1.44762E-02         3.74866E-01         1.53328E+00         3.75146E-01         2.93761E+02         1.00760E+00         3.06033E+01         2.90402E+02         1.38802E+02         1.51600E+02
+          5.96749E-03         2.10821E-02        -1.47003E-02         3.74865E-01         1.54395E+00         3.75153E-01         2.93247E+02         1.00760E+00         3.05181E+01         2.89407E+02         1.39296E+02         1.50112E+02
+          5.96749E-03         2.12520E-02        -1.49262E-02         3.74864E-01         1.55462E+00         3.75161E-01         2.92480E+02         1.00760E+00         3.04190E+01         2.88179E+02         1.39615E+02         1.48564E+02
+          5.96749E-03         2.14218E-02        -1.51539E-02         3.74862E-01         1.56529E+00         3.75168E-01         2.91466E+02         1.00760E+00         3.03058E+01         2.86725E+02         1.39764E+02         1.46960E+02
+          5.96749E-03         2.15916E-02        -1.53834E-02         3.74861E-01         1.57596E+00         3.75176E-01         2.90213E+02         1.00760E+00         3.01785E+01         2.85051E+02         1.39747E+02         1.45304E+02
+          5.96749E-03         2.17614E-02        -1.56148E-02         3.74859E-01         1.58664E+00         3.75185E-01         2.88727E+02         1.00760E+00         3.00370E+01         2.83168E+02         1.39568E+02         1.43600E+02
+          5.96749E-03         2.19313E-02        -1.58480E-02         3.74858E-01         1.59731E+00         3.75193E-01         2.87017E+02         1.00759E+00         2.98814E+01         2.81084E+02         1.39233E+02         1.41851E+02
+          5.96749E-03         2.21011E-02        -1.60829E-02         3.74857E-01         1.60798E+00         3.75202E-01         2.85093E+02         1.00759E+00         2.97117E+01         2.78809E+02         1.38747E+02         1.40061E+02
+          5.96749E-03         2.22709E-02        -1.63197E-02         3.74855E-01         1.61865E+00         3.75210E-01         2.82963E+02         1.00759E+00         2.95280E+01         2.76352E+02         1.38117E+02         1.38235E+02
+          5.96749E-03         2.24407E-02        -1.65583E-02         3.74854E-01         1.62932E+00         3.75219E-01         2.80638E+02         1.00759E+00         2.93305E+01         2.73726E+02         1.37350E+02         1.36376E+02
+          5.96749E-03         2.26106E-02        -1.67987E-02         3.74852E-01         1.63999E+00         3.75229E-01         2.78127E+02         1.00759E+00         2.91194E+01         2.70940E+02         1.36452E+02         1.34488E+02
+          5.96749E-03         2.27804E-02        -1.70410E-02         3.74851E-01         1.65066E+00         3.75238E-01         2.75443E+02         1.00759E+00         2.88949E+01         2.68005E+02         1.35430E+02         1.32576E+02
+          5.96749E-03         2.29502E-02        -1.72850E-02         3.74849E-01         1.66133E+00         3.75248E-01         2.72596E+02         1.00759E+00         2.86573E+01         2.64934E+02         1.34291E+02         1.30643E+02
+          5.96749E-03         2.31201E-02        -1.75309E-02         3.74848E-01         1.67200E+00         3.75258E-01         2.69598E+02         1.00759E+00         2.84069E+01         2.61737E+02         1.33044E+02         1.28693E+02
+          5.96749E-03         2.32899E-02        -1.77786E-02         3.74847E-01         1.68267E+00         3.75268E-01         2.66459E+02         1.00758E+00         2.81439E+01         2.58427E+02         1.31696E+02         1.26731E+02
+          5.96749E-03         2.34597E-02        -1.80280E-02         3.74845E-01         1.69334E+00         3.75278E-01         2.63191E+02         1.00758E+00         2.78688E+01         2.55013E+02         1.30253E+02         1.24760E+02
+          5.96749E-03         2.36295E-02        -1.82793E-02         3.74844E-01         1.70401E+00         3.75289E-01         2.59806E+02         1.00758E+00         2.75818E+01         2.51508E+02         1.28725E+02         1.22783E+02
+          5.96749E-03         2.37994E-02        -1.85325E-02         3.74842E-01         1.71468E+00         3.75300E-01         2.56316E+02         1.00758E+00         2.72834E+01         2.47924E+02         1.27119E+02         1.20805E+02
+          5.96749E-03         2.39692E-02        -1.87874E-02         3.74841E-01         1.72535E+00         3.75311E-01         2.52732E+02         1.00758E+00         2.69739E+01         2.44270E+02         1.25441E+02         1.18829E+02
+          5.96749E-03         2.41390E-02        -1.90441E-02         3.74839E-01         1.73602E+00         3.75322E-01         2.49064E+02         1.00758E+00         2.66538E+01         2.40559E+02         1.23701E+02         1.16858E+02
+          5.96749E-03         2.43088E-02        -1.93027E-02         3.74837E-01         1.74669E+00         3.75334E-01         2.45325E+02         1.00758E+00         2.63234E+01         2.36800E+02         1.21904E+02         1.14896E+02
+          5.96749E-03         2.44787E-02        -1.95630E-02         3.74836E-01         1.75736E+00         3.75346E-01         2.41526E+02         1.00757E+00         2.59833E+01         2.33004E+02         1.20059E+02         1.12945E+02
+          5.96749E-03         2.46485E-02        -1.98252E-02         3.74834E-01         1.76804E+00         3.75358E-01         2.37676E+02         1.00757E+00         2.56337E+01         2.29182E+02         1.18172E+02         1.11010E+02
+          5.96749E-03         2.48183E-02        -2.00892E-02         3.74833E-01         1.77871E+00         3.75371E-01         2.33787E+02         1.00757E+00         2.52753E+01         2.25342E+02         1.16250E+02         1.09092E+02
+          5.96749E-03         2.49882E-02        -2.03550E-02         3.74831E-01         1.78938E+00         3.75383E-01         2.29868E+02         1.00757E+00         2.49083E+01         2.21494E+02         1.14299E+02         1.07195E+02
+          5.96749E-03         2.51580E-02        -2.06227E-02         3.74830E-01         1.80005E+00         3.75396E-01         2.25930E+02         1.00757E+00         2.45333E+01         2.17648E+02         1.12327E+02         1.05320E+02
+          5.96749E-03         2.53278E-02        -2.08921E-02         3.74828E-01         1.81072E+00         3.75410E-01         2.21981E+02         1.00757E+00         2.41508E+01         2.13811E+02         1.10340E+02         1.03471E+02
+          5.96749E-03         2.54976E-02        -2.11633E-02         3.74826E-01         1.82139E+00         3.75423E-01         2.18031E+02         1.00756E+00         2.37611E+01         2.09992E+02         1.08342E+02         1.01650E+02
+          5.96749E-03         2.56675E-02        -2.14364E-02         3.74825E-01         1.83206E+00         3.75437E-01         2.14089E+02         1.00756E+00         2.33648E+01         2.06198E+02         1.06340E+02         9.98582E+01
+          5.96749E-03         2.58373E-02        -2.17113E-02         3.74823E-01         1.84273E+00         3.75451E-01         2.10162E+02         1.00756E+00         2.29624E+01         2.02437E+02         1.04339E+02         9.80982E+01
+          5.96749E-03         2.60071E-02        -2.19880E-02         3.74821E-01         1.85340E+00         3.75466E-01         2.06259E+02         1.00756E+00         2.25542E+01         1.98715E+02         1.02344E+02         9.63714E+01
+          5.96749E-03         2.61769E-02        -2.22665E-02         3.74820E-01         1.86407E+00         3.75481E-01         2.02386E+02         1.00756E+00         2.21408E+01         1.95039E+02         1.00359E+02         9.46795E+01
+          6.13731E-03         8.72665E-04        -8.24474E-04         3.85619E-01         2.74155E-01         3.85620E-01         6.85069E+03         1.00623E+00         3.24684E+02         6.78090E+03         5.85887E+03         9.22027E+02
+          6.13731E-03         1.04249E-03        -8.34692E-04         3.85619E-01         2.84826E-01         3.85620E-01         6.73347E+03         1.00623E+00         3.19696E+02         6.66397E+03         5.75604E+03         9.07924E+02
+          6.13731E-03         1.21232E-03        -8.46722E-04         3.85619E-01         2.95496E-01         3.85619E-01         6.61365E+03         1.00623E+00         3.14600E+02         6.54448E+03         5.65097E+03         8.93503E+02
+          6.13731E-03         1.38215E-03        -8.60564E-04         3.85618E-01         3.06167E-01         3.85619E-01         6.49144E+03         1.00623E+00         3.09403E+02         6.42261E+03         5.54382E+03         8.78787E+02
+          6.13731E-03         1.55197E-03        -8.76218E-04         3.85618E-01         3.16838E-01         3.85619E-01         6.36700E+03         1.00623E+00         3.04114E+02         6.29855E+03         5.43475E+03         8.63798E+02
+          6.13731E-03         1.72180E-03        -8.93684E-04         3.85618E-01         3.27508E-01         3.85619E-01         6.24054E+03         1.00623E+00         2.98741E+02         6.17249E+03         5.32393E+03         8.48557E+02
+          6.13731E-03         1.89163E-03        -9.12962E-04         3.85618E-01         3.38179E-01         3.85619E-01         6.11224E+03         1.00623E+00         2.93291E+02         6.04462E+03         5.21153E+03         8.33088E+02
+          6.13731E-03         2.06146E-03        -9.34053E-04         3.85618E-01         3.48849E-01         3.85619E-01         5.98229E+03         1.00623E+00         2.87773E+02         5.91512E+03         5.09771E+03         8.17413E+02
+          6.13731E-03         2.23128E-03        -9.56955E-04         3.85618E-01         3.59520E-01         3.85619E-01         5.85087E+03         1.00623E+00         2.82195E+02         5.78419E+03         4.98264E+03         8.01556E+02
+          6.13731E-03         2.40111E-03        -9.81670E-04         3.85618E-01         3.70190E-01         3.85619E-01         5.71818E+03         1.00623E+00         2.76565E+02         5.65202E+03         4.86648E+03         7.85538E+02
+          6.13731E-03         2.57094E-03        -1.00820E-03         3.85618E-01         3.80861E-01         3.85619E-01         5.58441E+03         1.00623E+00         2.70891E+02         5.51880E+03         4.74941E+03         7.69384E+02
+          6.13731E-03         2.74077E-03        -1.03654E-03         3.85617E-01         3.91532E-01         3.85619E-01         5.44975E+03         1.00623E+00         2.65181E+02         5.38471E+03         4.63160E+03         7.53116E+02
+          6.13731E-03         2.91059E-03        -1.06669E-03         3.85617E-01         4.02202E-01         3.85619E-01         5.31437E+03         1.00623E+00         2.59443E+02         5.24995E+03         4.51320E+03         7.36757E+02
+          6.13731E-03         3.08042E-03        -1.09865E-03         3.85617E-01         4.12873E-01         3.85619E-01         5.17848E+03         1.00623E+00         2.53685E+02         5.11470E+03         4.39437E+03         7.20329E+02
+          6.13731E-03         3.25025E-03        -1.13243E-03         3.85617E-01         4.23543E-01         3.85618E-01         5.04225E+03         1.00623E+00         2.47913E+02         4.97915E+03         4.27529E+03         7.03856E+02
+          6.13731E-03         3.42008E-03        -1.16801E-03         3.85617E-01         4.34214E-01         3.85618E-01         4.90585E+03         1.00623E+00         2.42137E+02         4.84347E+03         4.15611E+03         6.87359E+02
+          6.13731E-03         3.58990E-03        -1.20541E-03         3.85616E-01         4.44884E-01         3.85618E-01         4.76948E+03         1.00623E+00         2.36363E+02         4.70784E+03         4.03698E+03         6.70861E+02
+          6.13731E-03         3.75973E-03        -1.24463E-03         3.85616E-01         4.55555E-01         3.85618E-01         4.63330E+03         1.00623E+00         2.30599E+02         4.57244E+03         3.91805E+03         6.54383E+02
+          6.13731E-03         3.92956E-03        -1.28565E-03         3.85616E-01         4.66225E-01         3.85618E-01         4.49749E+03         1.00623E+00         2.24852E+02         4.43743E+03         3.79949E+03         6.37947E+02
+          6.13731E-03         4.09939E-03        -1.32849E-03         3.85616E-01         4.76896E-01         3.85618E-01         4.36220E+03         1.00623E+00         2.19128E+02         4.30300E+03         3.68142E+03         6.21573E+02
+          6.13731E-03         4.26921E-03        -1.37313E-03         3.85615E-01         4.87567E-01         3.85618E-01         4.22762E+03         1.00623E+00         2.13434E+02         4.16929E+03         3.56401E+03         6.05283E+02
+          6.13731E-03         4.43904E-03        -1.41959E-03         3.85615E-01         4.98237E-01         3.85618E-01         4.09389E+03         1.00623E+00         2.07777E+02         4.03647E+03         3.44737E+03         5.89096E+02
+          6.13731E-03         4.60887E-03        -1.46787E-03         3.85615E-01         5.08908E-01         3.85618E-01         3.96116E+03         1.00623E+00         2.02164E+02         3.90469E+03         3.33166E+03         5.73031E+02
+          6.13731E-03         4.77869E-03        -1.51795E-03         3.85614E-01         5.19578E-01         3.85617E-01         3.82960E+03         1.00623E+00         1.96599E+02         3.77410E+03         3.21699E+03         5.57109E+02
+          6.13731E-03         4.94852E-03        -1.56985E-03         3.85614E-01         5.30249E-01         3.85617E-01         3.69933E+03         1.00623E+00         1.91090E+02         3.64485E+03         3.10350E+03         5.41347E+02
+          6.13731E-03         5.11835E-03        -1.62356E-03         3.85614E-01         5.40919E-01         3.85617E-01         3.57051E+03         1.00623E+00         1.85640E+02         3.51706E+03         2.99130E+03         5.25764E+02
+          6.13731E-03         5.28818E-03        -1.67908E-03         3.85613E-01         5.51590E-01         3.85617E-01         3.44326E+03         1.00623E+00         1.80257E+02         3.39089E+03         2.88051E+03         5.10376E+02
+          6.13731E-03         5.45800E-03        -1.73641E-03         3.85613E-01         5.62261E-01         3.85617E-01         3.31771E+03         1.00623E+00         1.74944E+02         3.26644E+03         2.77124E+03         4.95200E+02
+          6.13731E-03         5.62783E-03        -1.79556E-03         3.85613E-01         5.72931E-01         3.85617E-01         3.19399E+03         1.00623E+00         1.69707E+02         3.14384E+03         2.66359E+03         4.80252E+02
+          6.13731E-03         5.79766E-03        -1.85652E-03         3.85612E-01         5.83602E-01         3.85617E-01         3.07220E+03         1.00623E+00         1.64550E+02         3.02321E+03         2.55766E+03         4.65547E+02
+          6.13731E-03         5.96749E-03        -1.91929E-03         3.85612E-01         5.94272E-01         3.85617E-01         2.95245E+03         1.00623E+00         1.59476E+02         2.90465E+03         2.45355E+03         4.51099E+02
+          6.13731E-03         6.13731E-03        -1.98387E-03         3.85612E-01         6.04943E-01         3.85617E-01         2.83486E+03         1.00623E+00         1.54491E+02         2.78826E+03         2.35134E+03         4.36922E+02
+          6.13731E-03         6.30714E-03        -2.05027E-03         3.85611E-01         6.15613E-01         3.85617E-01         2.71951E+03         1.00623E+00         1.49597E+02         2.67415E+03         2.25112E+03         4.23029E+02
+          6.13731E-03         6.47697E-03        -2.11847E-03         3.85611E-01         6.26284E-01         3.85617E-01         2.60649E+03         1.00623E+00         1.44798E+02         2.56239E+03         2.15296E+03         4.09431E+02
+          6.13731E-03         6.64680E-03        -2.18849E-03         3.85610E-01         6.36955E-01         3.85617E-01         2.49589E+03         1.00623E+00         1.40096E+02         2.45307E+03         2.05693E+03         3.96141E+02
+          6.13731E-03         6.81662E-03        -2.26032E-03         3.85610E-01         6.47625E-01         3.85616E-01         2.38779E+03         1.00623E+00         1.35495E+02         2.34626E+03         1.96309E+03         3.83167E+02
+          6.13731E-03         6.98645E-03        -2.33397E-03         3.85609E-01         6.58296E-01         3.85616E-01         2.28225E+03         1.00623E+00         1.30996E+02         2.24203E+03         1.87151E+03         3.70521E+02
+          6.13731E-03         7.15628E-03        -2.40942E-03         3.85609E-01         6.68966E-01         3.85616E-01         2.17933E+03         1.00623E+00         1.26602E+02         2.14045E+03         1.78224E+03         3.58210E+02
+          6.13731E-03         7.32611E-03        -2.48669E-03         3.85608E-01         6.79637E-01         3.85616E-01         2.07910E+03         1.00623E+00         1.22315E+02         2.04156E+03         1.69532E+03         3.46242E+02
+          6.13731E-03         7.49593E-03        -2.56577E-03         3.85608E-01         6.90307E-01         3.85617E-01         1.98159E+03         1.00623E+00         1.18135E+02         1.94542E+03         1.61079E+03         3.34624E+02
+          6.13731E-03         7.66576E-03        -2.64666E-03         3.85607E-01         7.00978E-01         3.85617E-01         1.88687E+03         1.00623E+00         1.14065E+02         1.85206E+03         1.52870E+03         3.23363E+02
+          6.13731E-03         7.83559E-03        -2.72937E-03         3.85607E-01         7.11649E-01         3.85617E-01         1.79495E+03         1.00623E+00         1.10104E+02         1.76153E+03         1.44907E+03         3.12463E+02
+          6.13731E-03         8.00542E-03        -2.81389E-03         3.85606E-01         7.22319E-01         3.85617E-01         1.70588E+03         1.00623E+00         1.06254E+02         1.67384E+03         1.37191E+03         3.01929E+02
+          6.13731E-03         8.17524E-03        -2.90022E-03         3.85606E-01         7.32990E-01         3.85617E-01         1.61968E+03         1.00623E+00         1.02515E+02         1.58903E+03         1.29726E+03         2.91764E+02
+          6.13731E-03         8.34507E-03        -2.98836E-03         3.85605E-01         7.43660E-01         3.85617E-01         1.53635E+03         1.00623E+00         9.88877E+01         1.50710E+03         1.22513E+03         2.81971E+02
+          6.13731E-03         8.51490E-03        -3.07831E-03         3.85605E-01         7.54331E-01         3.85617E-01         1.45593E+03         1.00623E+00         9.53707E+01         1.42807E+03         1.15552E+03         2.72553E+02
+          6.13731E-03         8.68473E-03        -3.17008E-03         3.85604E-01         7.65001E-01         3.85617E-01         1.37840E+03         1.00623E+00         9.19643E+01         1.35194E+03         1.08843E+03         2.63509E+02
+          6.13731E-03         8.85455E-03        -3.26366E-03         3.85604E-01         7.75672E-01         3.85618E-01         1.30377E+03         1.00623E+00         8.86678E+01         1.27870E+03         1.02386E+03         2.54840E+02
+          6.13731E-03         9.02438E-03        -3.35905E-03         3.85603E-01         7.86343E-01         3.85618E-01         1.23204E+03         1.00623E+00         8.54802E+01         1.20836E+03         9.61812E+02         2.46545E+02
+          6.13731E-03         9.19421E-03        -3.45625E-03         3.85603E-01         7.97013E-01         3.85618E-01         1.16320E+03         1.00623E+00         8.24007E+01         1.14089E+03         9.02265E+02         2.38624E+02
+          6.13731E-03         9.36403E-03        -3.55527E-03         3.85602E-01         8.07684E-01         3.85618E-01         1.09722E+03         1.00623E+00         7.94279E+01         1.07628E+03         8.45204E+02         2.31073E+02
+          6.13731E-03         9.53386E-03        -3.65610E-03         3.85601E-01         8.18354E-01         3.85619E-01         1.03408E+03         1.00623E+00         7.65604E+01         1.01450E+03         7.90609E+02         2.23891E+02
+          6.13731E-03         9.70369E-03        -3.75874E-03         3.85601E-01         8.29025E-01         3.85619E-01         9.73768E+02         1.00623E+00         7.37968E+01         9.55528E+02         7.38455E+02         2.17073E+02
+          6.13731E-03         9.87352E-03        -3.86319E-03         3.85600E-01         8.39695E-01         3.85619E-01         9.16239E+02         1.00623E+00         7.11352E+01         8.99327E+02         6.88711E+02         2.10615E+02
+          6.13731E-03         1.00433E-02        -3.96946E-03         3.85599E-01         8.50366E-01         3.85620E-01         8.61463E+02         1.00623E+00         6.85740E+01         8.45859E+02         6.41347E+02         2.04513E+02
+          6.13731E-03         1.02132E-02        -4.07753E-03         3.85599E-01         8.61037E-01         3.85620E-01         8.09398E+02         1.00623E+00         6.61111E+01         7.95084E+02         5.96324E+02         1.98760E+02
+          6.13731E-03         1.03830E-02        -4.18742E-03         3.85598E-01         8.71707E-01         3.85621E-01         7.60000E+02         1.00623E+00         6.37446E+01         7.46954E+02         5.53604E+02         1.93350E+02
+          6.13731E-03         1.05528E-02        -4.29913E-03         3.85597E-01         8.82378E-01         3.85621E-01         7.13223E+02         1.00623E+00         6.14724E+01         7.01420E+02         5.13143E+02         1.88278E+02
+          6.13731E-03         1.07227E-02        -4.41264E-03         3.85597E-01         8.93048E-01         3.85622E-01         6.69014E+02         1.00623E+00         5.92924E+01         6.58430E+02         4.74895E+02         1.83534E+02
+          6.13731E-03         1.08925E-02        -4.52797E-03         3.85596E-01         9.03719E-01         3.85623E-01         6.27318E+02         1.00623E+00         5.72024E+01         6.17925E+02         4.38813E+02         1.79112E+02
+          6.13731E-03         1.10623E-02        -4.64511E-03         3.85595E-01         9.14389E-01         3.85623E-01         5.88079E+02         1.00623E+00         5.52003E+01         5.79847E+02         4.04844E+02         1.75003E+02
+          6.13731E-03         1.12321E-02        -4.76406E-03         3.85594E-01         9.25060E-01         3.85624E-01         5.51235E+02         1.00623E+00         5.32839E+01         5.44134E+02         3.72936E+02         1.71199E+02
+          6.13731E-03         1.14020E-02        -4.88483E-03         3.85594E-01         9.35731E-01         3.85625E-01         5.16723E+02         1.00623E+00         5.14511E+01         5.10721E+02         3.43032E+02         1.67690E+02
+          6.13731E-03         1.15718E-02        -5.00740E-03         3.85593E-01         9.46401E-01         3.85626E-01         4.84478E+02         1.00623E+00         4.96997E+01         4.79541E+02         3.15075E+02         1.64466E+02
+          6.13731E-03         1.17416E-02        -5.13179E-03         3.85592E-01         9.57072E-01         3.85626E-01         4.54432E+02         1.00623E+00         4.80277E+01         4.50524E+02         2.89007E+02         1.61517E+02
+          6.13731E-03         1.19114E-02        -5.25800E-03         3.85591E-01         9.67742E-01         3.85627E-01         4.26515E+02         1.00623E+00         4.64331E+01         4.23601E+02         2.64767E+02         1.58834E+02
+          6.13731E-03         1.20813E-02        -5.38601E-03         3.85591E-01         9.78413E-01         3.85628E-01         4.00657E+02         1.00623E+00         4.49138E+01         3.98698E+02         2.42292E+02         1.56406E+02
+          6.13731E-03         1.22511E-02        -5.51584E-03         3.85590E-01         9.89083E-01         3.85629E-01         3.76785E+02         1.00623E+00         4.34681E+01         3.75742E+02         2.21521E+02         1.54221E+02
+          6.13731E-03         1.24209E-02        -5.64748E-03         3.85589E-01         9.99754E-01         3.85630E-01         3.54826E+02         1.00623E+00         4.20941E+01         3.54659E+02         2.02389E+02         1.52270E+02
+          6.13731E-03         1.25908E-02        -5.78093E-03         3.85588E-01         1.01042E+00         3.85632E-01         3.34704E+02         1.00623E+00         4.07900E+01         3.35372E+02         1.84832E+02         1.50540E+02
+          6.13731E-03         1.27606E-02        -5.91620E-03         3.85587E-01         1.02110E+00         3.85633E-01         3.16345E+02         1.00623E+00         3.95543E+01         3.17807E+02         1.68786E+02         1.49021E+02
+          6.13731E-03         1.29304E-02        -6.05327E-03         3.85587E-01         1.03177E+00         3.85634E-01         2.99673E+02         1.00623E+00         3.83852E+01         3.01885E+02         1.54185E+02         1.47700E+02
+          6.13731E-03         1.31002E-02        -6.19216E-03         3.85586E-01         1.04244E+00         3.85635E-01         2.84612E+02         1.00623E+00         3.72813E+01         2.87532E+02         1.40965E+02         1.46567E+02
+          6.13731E-03         1.32701E-02        -6.33287E-03         3.85585E-01         1.05311E+00         3.85637E-01         2.71086E+02         1.00623E+00         3.62410E+01         2.74669E+02         1.29059E+02         1.45610E+02
+          6.13731E-03         1.34399E-02        -6.47538E-03         3.85584E-01         1.06378E+00         3.85638E-01         2.59018E+02         1.00623E+00         3.52630E+01         2.63222E+02         1.18404E+02         1.44817E+02
+          6.13731E-03         1.36097E-02        -6.61971E-03         3.85583E-01         1.07445E+00         3.85640E-01         2.48334E+02         1.00623E+00         3.43458E+01         2.53113E+02         1.08936E+02         1.44178E+02
+          6.13731E-03         1.37795E-02        -6.76585E-03         3.85582E-01         1.08512E+00         3.85642E-01         2.38958E+02         1.00623E+00         3.34881E+01         2.44268E+02         1.00590E+02         1.43679E+02
+          6.13731E-03         1.39494E-02        -6.91380E-03         3.85581E-01         1.09579E+00         3.85643E-01         2.30816E+02         1.00623E+00         3.26883E+01         2.36613E+02         9.33024E+01         1.43310E+02
+          6.13731E-03         1.41192E-02        -7.06357E-03         3.85580E-01         1.10646E+00         3.85645E-01         2.23834E+02         1.00623E+00         3.19451E+01         2.30073E+02         8.70122E+01         1.43061E+02
+          6.13731E-03         1.42890E-02        -7.21515E-03         3.85579E-01         1.11713E+00         3.85647E-01         2.17939E+02         1.00623E+00         3.12571E+01         2.24576E+02         8.16577E+01         1.42918E+02
+          6.13731E-03         1.44589E-02        -7.36854E-03         3.85579E-01         1.12780E+00         3.85649E-01         2.13061E+02         1.00623E+00         3.06227E+01         2.20052E+02         7.71787E+01         1.42873E+02
+          6.13731E-03         1.46287E-02        -7.52374E-03         3.85578E-01         1.13847E+00         3.85651E-01         2.09129E+02         1.00623E+00         3.00403E+01         2.16430E+02         7.35161E+01         1.42914E+02
+          6.13731E-03         1.47985E-02        -7.68076E-03         3.85577E-01         1.14914E+00         3.85653E-01         2.06075E+02         1.00623E+00         2.95083E+01         2.13642E+02         7.06124E+01         1.43030E+02
+          6.13731E-03         1.49683E-02        -7.83959E-03         3.85576E-01         1.15981E+00         3.85655E-01         2.03831E+02         1.00623E+00         2.90249E+01         2.11622E+02         6.84112E+01         1.43211E+02
+          6.13731E-03         1.51382E-02        -8.00023E-03         3.85575E-01         1.17048E+00         3.85658E-01         2.02332E+02         1.00623E+00         2.85883E+01         2.10305E+02         6.68579E+01         1.43447E+02
+          6.13731E-03         1.53080E-02        -8.16268E-03         3.85574E-01         1.18115E+00         3.85660E-01         2.01514E+02         1.00622E+00         2.81964E+01         2.09628E+02         6.58991E+01         1.43729E+02
+          6.13731E-03         1.54778E-02        -8.32695E-03         3.85573E-01         1.19182E+00         3.85663E-01         2.01316E+02         1.00622E+00         2.78473E+01         2.09531E+02         6.54835E+01         1.44048E+02
+          6.13731E-03         1.56476E-02        -8.49303E-03         3.85572E-01         1.20249E+00         3.85665E-01         2.01678E+02         1.00622E+00         2.75388E+01         2.09954E+02         6.55611E+01         1.44393E+02
+          6.13731E-03         1.58175E-02        -8.66092E-03         3.85571E-01         1.21317E+00         3.85668E-01         2.02542E+02         1.00622E+00         2.72685E+01         2.10841E+02         6.60839E+01         1.44757E+02
+          6.13731E-03         1.59873E-02        -8.83063E-03         3.85570E-01         1.22384E+00         3.85671E-01         2.03852E+02         1.00622E+00         2.70343E+01         2.12137E+02         6.70057E+01         1.45131E+02
+          6.13731E-03         1.61571E-02        -9.00215E-03         3.85568E-01         1.23451E+00         3.85674E-01         2.05554E+02         1.00622E+00         2.68337E+01         2.13789E+02         6.82821E+01         1.45507E+02
+          6.13731E-03         1.63270E-02        -9.17548E-03         3.85567E-01         1.24518E+00         3.85677E-01         2.07598E+02         1.00622E+00         2.66642E+01         2.15749E+02         6.98707E+01         1.45878E+02
+          6.13731E-03         1.64968E-02        -9.35062E-03         3.85566E-01         1.25585E+00         3.85680E-01         2.09934E+02         1.00622E+00         2.65233E+01         2.17968E+02         7.17310E+01         1.46237E+02
+          6.13731E-03         1.66666E-02        -9.52758E-03         3.85565E-01         1.26652E+00         3.85683E-01         2.12516E+02         1.00622E+00         2.64087E+01         2.20400E+02         7.38242E+01         1.46576E+02
+          6.13731E-03         1.68364E-02        -9.70635E-03         3.85564E-01         1.27719E+00         3.85686E-01         2.15299E+02         1.00622E+00         2.63177E+01         2.23003E+02         7.61137E+01         1.46889E+02
+          6.13731E-03         1.70063E-02        -9.88694E-03         3.85563E-01         1.28786E+00         3.85690E-01         2.18240E+02         1.00622E+00         2.62480E+01         2.25735E+02         7.85648E+01         1.47171E+02
+          6.13731E-03         1.71761E-02        -1.00693E-02         3.85562E-01         1.29853E+00         3.85693E-01         2.21301E+02         1.00622E+00         2.61972E+01         2.28560E+02         8.11447E+01         1.47415E+02
+          6.13731E-03         1.73459E-02        -1.02535E-02         3.85561E-01         1.30920E+00         3.85697E-01         2.24442E+02         1.00622E+00         2.61627E+01         2.31440E+02         8.38227E+01         1.47618E+02
+          6.13731E-03         1.75158E-02        -1.04396E-02         3.85560E-01         1.31987E+00         3.85701E-01         2.27630E+02         1.00622E+00         2.61425E+01         2.34343E+02         8.65698E+01         1.47773E+02
+          6.13731E-03         1.76856E-02        -1.06274E-02         3.85559E-01         1.33054E+00         3.85705E-01         2.30831E+02         1.00622E+00         2.61342E+01         2.37237E+02         8.93590E+01         1.47878E+02
+          6.13731E-03         1.78554E-02        -1.08170E-02         3.85557E-01         1.34121E+00         3.85709E-01         2.34015E+02         1.00622E+00         2.61358E+01         2.40092E+02         9.21652E+01         1.47927E+02
+          6.13731E-03         1.80252E-02        -1.10085E-02         3.85556E-01         1.35188E+00         3.85713E-01         2.37153E+02         1.00622E+00         2.61452E+01         2.42884E+02         9.49651E+01         1.47919E+02
+          6.13731E-03         1.81951E-02        -1.12018E-02         3.85555E-01         1.36255E+00         3.85718E-01         2.40218E+02         1.00622E+00         2.61605E+01         2.45586E+02         9.77375E+01         1.47848E+02
+          6.13731E-03         1.83649E-02        -1.13969E-02         3.85554E-01         1.37322E+00         3.85722E-01         2.43188E+02         1.00622E+00         2.61799E+01         2.48177E+02         1.00462E+02         1.47715E+02
+          6.13731E-03         1.85347E-02        -1.15938E-02         3.85553E-01         1.38389E+00         3.85727E-01         2.46040E+02         1.00622E+00         2.62018E+01         2.50637E+02         1.03122E+02         1.47515E+02
+          6.13731E-03         1.87045E-02        -1.17925E-02         3.85551E-01         1.39457E+00         3.85732E-01         2.48754E+02         1.00622E+00         2.62245E+01         2.52947E+02         1.05701E+02         1.47247E+02
+          6.13731E-03         1.88744E-02        -1.19930E-02         3.85550E-01         1.40524E+00         3.85737E-01         2.51313E+02         1.00621E+00         2.62466E+01         2.55093E+02         1.08183E+02         1.46910E+02
+          6.13731E-03         1.90442E-02        -1.21953E-02         3.85549E-01         1.41591E+00         3.85742E-01         2.53701E+02         1.00621E+00         2.62667E+01         2.57059E+02         1.10556E+02         1.46503E+02
+          6.13731E-03         1.92140E-02        -1.23995E-02         3.85548E-01         1.42658E+00         3.85747E-01         2.55903E+02         1.00621E+00         2.62837E+01         2.58833E+02         1.12809E+02         1.46024E+02
+          6.13731E-03         1.93839E-02        -1.26055E-02         3.85546E-01         1.43725E+00         3.85752E-01         2.57909E+02         1.00621E+00         2.62963E+01         2.60406E+02         1.14931E+02         1.45475E+02
+          6.13731E-03         1.95537E-02        -1.28132E-02         3.85545E-01         1.44792E+00         3.85758E-01         2.59707E+02         1.00621E+00         2.63036E+01         2.61769E+02         1.16915E+02         1.44855E+02
+          6.13731E-03         1.97235E-02        -1.30228E-02         3.85544E-01         1.45859E+00         3.85764E-01         2.61290E+02         1.00621E+00         2.63046E+01         2.62915E+02         1.18752E+02         1.44163E+02
+          6.13731E-03         1.98933E-02        -1.32342E-02         3.85543E-01         1.46926E+00         3.85770E-01         2.62650E+02         1.00621E+00         2.62984E+01         2.63839E+02         1.20437E+02         1.43402E+02
+          6.13731E-03         2.00632E-02        -1.34475E-02         3.85541E-01         1.47993E+00         3.85776E-01         2.63783E+02         1.00621E+00         2.62845E+01         2.64536E+02         1.21965E+02         1.42571E+02
+          6.13731E-03         2.02330E-02        -1.36625E-02         3.85540E-01         1.49060E+00         3.85782E-01         2.64683E+02         1.00621E+00         2.62620E+01         2.65005E+02         1.23332E+02         1.41673E+02
+          6.13731E-03         2.04028E-02        -1.38793E-02         3.85539E-01         1.50127E+00         3.85788E-01         2.65350E+02         1.00621E+00         2.62305E+01         2.65245E+02         1.24537E+02         1.40708E+02
+          6.13731E-03         2.05726E-02        -1.40980E-02         3.85537E-01         1.51194E+00         3.85795E-01         2.65782E+02         1.00621E+00         2.61894E+01         2.65256E+02         1.25578E+02         1.39678E+02
+          6.13731E-03         2.07425E-02        -1.43185E-02         3.85536E-01         1.52261E+00         3.85802E-01         2.65978E+02         1.00621E+00         2.61383E+01         2.65039E+02         1.26454E+02         1.38585E+02
+          6.13731E-03         2.09123E-02        -1.45407E-02         3.85534E-01         1.53328E+00         3.85809E-01         2.65941E+02         1.00621E+00         2.60769E+01         2.64598E+02         1.27166E+02         1.37432E+02
+          6.13731E-03         2.10821E-02        -1.47648E-02         3.85533E-01         1.54395E+00         3.85816E-01         2.65673E+02         1.00620E+00         2.60049E+01         2.63936E+02         1.27715E+02         1.36220E+02
+          6.13731E-03         2.12520E-02        -1.49907E-02         3.85532E-01         1.55462E+00         3.85823E-01         2.65177E+02         1.00620E+00         2.59220E+01         2.63057E+02         1.28104E+02         1.34953E+02
+          6.13731E-03         2.14218E-02        -1.52185E-02         3.85530E-01         1.56529E+00         3.85831E-01         2.64458E+02         1.00620E+00         2.58282E+01         2.61967E+02         1.28334E+02         1.33633E+02
+          6.13731E-03         2.15916E-02        -1.54480E-02         3.85529E-01         1.57596E+00         3.85838E-01         2.63521E+02         1.00620E+00         2.57232E+01         2.60672E+02         1.28410E+02         1.32262E+02
+          6.13731E-03         2.17614E-02        -1.56794E-02         3.85528E-01         1.58664E+00         3.85846E-01         2.62372E+02         1.00620E+00         2.56070E+01         2.59180E+02         1.28336E+02         1.30844E+02
+          6.13731E-03         2.19313E-02        -1.59125E-02         3.85526E-01         1.59731E+00         3.85854E-01         2.61018E+02         1.00620E+00         2.54796E+01         2.57498E+02         1.28116E+02         1.29383E+02
+          6.13731E-03         2.21011E-02        -1.61475E-02         3.85525E-01         1.60798E+00         3.85863E-01         2.59467E+02         1.00620E+00         2.53410E+01         2.55634E+02         1.27754E+02         1.27880E+02
+          6.13731E-03         2.22709E-02        -1.63843E-02         3.85523E-01         1.61865E+00         3.85871E-01         2.57725E+02         1.00620E+00         2.51913E+01         2.53597E+02         1.27258E+02         1.26339E+02
+          6.13731E-03         2.24407E-02        -1.66229E-02         3.85522E-01         1.62932E+00         3.85880E-01         2.55803E+02         1.00620E+00         2.50305E+01         2.51396E+02         1.26631E+02         1.24764E+02
+          6.13731E-03         2.26106E-02        -1.68633E-02         3.85520E-01         1.63999E+00         3.85889E-01         2.53707E+02         1.00619E+00         2.48587E+01         2.49040E+02         1.25881E+02         1.23158E+02
+          6.13731E-03         2.27804E-02        -1.71055E-02         3.85519E-01         1.65066E+00         3.85898E-01         2.51449E+02         1.00619E+00         2.46763E+01         2.46539E+02         1.25014E+02         1.21525E+02
+          6.13731E-03         2.29502E-02        -1.73496E-02         3.85517E-01         1.66133E+00         3.85907E-01         2.49037E+02         1.00619E+00         2.44832E+01         2.43903E+02         1.24036E+02         1.19867E+02
+          6.13731E-03         2.31201E-02        -1.75955E-02         3.85516E-01         1.67200E+00         3.85917E-01         2.46481E+02         1.00619E+00         2.42797E+01         2.41142E+02         1.22955E+02         1.18188E+02
+          6.13731E-03         2.32899E-02        -1.78431E-02         3.85514E-01         1.68267E+00         3.85927E-01         2.43792E+02         1.00619E+00         2.40660E+01         2.38267E+02         1.21776E+02         1.16491E+02
+          6.13731E-03         2.34597E-02        -1.80926E-02         3.85513E-01         1.69334E+00         3.85937E-01         2.40979E+02         1.00619E+00         2.38424E+01         2.35287E+02         1.20507E+02         1.14780E+02
+          6.13731E-03         2.36295E-02        -1.83439E-02         3.85511E-01         1.70401E+00         3.85947E-01         2.38052E+02         1.00619E+00         2.36092E+01         2.32214E+02         1.19155E+02         1.13058E+02
+          6.13731E-03         2.37994E-02        -1.85970E-02         3.85510E-01         1.71468E+00         3.85958E-01         2.35022E+02         1.00619E+00         2.33666E+01         2.29056E+02         1.17728E+02         1.11329E+02
+          6.13731E-03         2.39692E-02        -1.88519E-02         3.85508E-01         1.72535E+00         3.85969E-01         2.31898E+02         1.00618E+00         2.31149E+01         2.25825E+02         1.16230E+02         1.09594E+02
+          6.13731E-03         2.41390E-02        -1.91087E-02         3.85506E-01         1.73602E+00         3.85980E-01         2.28692E+02         1.00618E+00         2.28544E+01         2.22529E+02         1.14671E+02         1.07859E+02
+          6.13731E-03         2.43088E-02        -1.93672E-02         3.85505E-01         1.74669E+00         3.85991E-01         2.25412E+02         1.00618E+00         2.25855E+01         2.19180E+02         1.13056E+02         1.06124E+02
+          6.13731E-03         2.44787E-02        -1.96276E-02         3.85503E-01         1.75736E+00         3.86003E-01         2.22069E+02         1.00618E+00         2.23084E+01         2.15786E+02         1.11392E+02         1.04395E+02
+          6.13731E-03         2.46485E-02        -1.98898E-02         3.85502E-01         1.76804E+00         3.86014E-01         2.18673E+02         1.00618E+00         2.20235E+01         2.12358E+02         1.09686E+02         1.02672E+02
+          6.13731E-03         2.48183E-02        -2.01538E-02         3.85500E-01         1.77871E+00         3.86026E-01         2.15232E+02         1.00618E+00         2.17312E+01         2.08903E+02         1.07943E+02         1.00960E+02
+          6.13731E-03         2.49882E-02        -2.04196E-02         3.85498E-01         1.78938E+00         3.86039E-01         2.11757E+02         1.00618E+00         2.14318E+01         2.05431E+02         1.06171E+02         9.92597E+01
+          6.13731E-03         2.51580E-02        -2.06872E-02         3.85497E-01         1.80005E+00         3.86051E-01         2.08255E+02         1.00617E+00         2.11256E+01         2.01950E+02         1.04375E+02         9.75748E+01
+          6.13731E-03         2.53278E-02        -2.09567E-02         3.85495E-01         1.81072E+00         3.86064E-01         2.04736E+02         1.00617E+00         2.08130E+01         1.98469E+02         1.02561E+02         9.59073E+01
+          6.13731E-03         2.54976E-02        -2.12279E-02         3.85493E-01         1.82139E+00         3.86077E-01         2.01208E+02         1.00617E+00         2.04944E+01         1.94994E+02         1.00735E+02         9.42594E+01
+          6.13731E-03         2.56675E-02        -2.15010E-02         3.85492E-01         1.83206E+00         3.86091E-01         1.97678E+02         1.00617E+00         2.01702E+01         1.91534E+02         9.89011E+01         9.26332E+01
+          6.13731E-03         2.58373E-02        -2.17759E-02         3.85490E-01         1.84273E+00         3.86105E-01         1.94156E+02         1.00617E+00         1.98407E+01         1.88096E+02         9.70650E+01         9.10306E+01
+          6.13731E-03         2.60071E-02        -2.20525E-02         3.85488E-01         1.85340E+00         3.86119E-01         1.90647E+02         1.00616E+00         1.95062E+01         1.84685E+02         9.52314E+01         8.94535E+01
+          6.13731E-03         2.61769E-02        -2.23311E-02         3.85487E-01         1.86407E+00         3.86133E-01         1.87158E+02         1.00616E+00         1.91672E+01         1.81308E+02         9.34047E+01         8.79034E+01
+          6.30714E-03         8.72665E-04        -8.90870E-04         3.96289E-01         2.74155E-01         3.96290E-01         6.19788E+03         1.00488E+00         2.60835E+02         6.15419E+03         5.36539E+03         7.88800E+02
+          6.30714E-03         1.04249E-03        -9.01088E-04         3.96289E-01         2.84826E-01         3.96290E-01         6.09352E+03         1.00488E+00         2.56874E+02         6.04987E+03         5.27222E+03         7.77648E+02
+          6.30714E-03         1.21232E-03        -9.13118E-04         3.96289E-01         2.95496E-01         3.96290E-01         5.98684E+03         1.00488E+00         2.52827E+02         5.94323E+03         5.17699E+03         7.66231E+02
+          6.30714E-03         1.38215E-03        -9.26960E-04         3.96289E-01         3.06167E-01         3.96290E-01         5.87798E+03         1.00488E+00         2.48701E+02         5.83443E+03         5.07986E+03         7.54565E+02
+          6.30714E-03         1.55197E-03        -9.42614E-04         3.96289E-01         3.16838E-01         3.96290E-01         5.76712E+03         1.00488E+00         2.44500E+02         5.72364E+03         4.98097E+03         7.42667E+02
+          6.30714E-03         1.72180E-03        -9.60080E-04         3.96289E-01         3.27508E-01         3.96290E-01         5.65442E+03         1.00488E+00         2.40233E+02         5.61103E+03         4.88048E+03         7.30554E+02
+          6.30714E-03         1.89163E-03        -9.79358E-04         3.96289E-01         3.38179E-01         3.96290E-01         5.54005E+03         1.00488E+00         2.35904E+02         5.49676E+03         4.77852E+03         7.18242E+02
+          6.30714E-03         2.06146E-03        -1.00045E-03         3.96289E-01         3.48849E-01         3.96290E-01         5.42417E+03         1.00488E+00         2.31521E+02         5.38101E+03         4.67526E+03         7.05748E+02
+          6.30714E-03         2.23128E-03        -1.02335E-03         3.96288E-01         3.59520E-01         3.96290E-01         5.30695E+03         1.00488E+00         2.27089E+02         5.26393E+03         4.57084E+03         6.93090E+02
+          6.30714E-03         2.40111E-03        -1.04807E-03         3.96288E-01         3.70190E-01         3.96290E-01         5.18855E+03         1.00488E+00         2.22616E+02         5.14569E+03         4.46541E+03         6.80284E+02
+          6.30714E-03         2.57094E-03        -1.07459E-03         3.96288E-01         3.80861E-01         3.96290E-01         5.06914E+03         1.00488E+00         2.18108E+02         5.02648E+03         4.35913E+03         6.67349E+02
+          6.30714E-03         2.74077E-03        -1.10293E-03         3.96288E-01         3.91532E-01         3.96289E-01         4.94890E+03         1.00488E+00         2.13571E+02         4.90644E+03         4.25214E+03         6.54301E+02
+          6.30714E-03         2.91059E-03        -1.13308E-03         3.96288E-01         4.02202E-01         3.96289E-01         4.82798E+03         1.00488E+00         2.09011E+02         4.78574E+03         4.14459E+03         6.41158E+02
+          6.30714E-03         3.08042E-03        -1.16505E-03         3.96288E-01         4.12873E-01         3.96289E-01         4.70654E+03         1.00488E+00         2.04434E+02         4.66456E+03         4.03663E+03         6.27937E+02
+          6.30714E-03         3.25025E-03        -1.19882E-03         3.96287E-01         4.23543E-01         3.96289E-01         4.58476E+03         1.00488E+00         1.99847E+02         4.54305E+03         3.92840E+03         6.14655E+02
+          6.30714E-03         3.42008E-03        -1.23441E-03         3.96287E-01         4.34214E-01         3.96289E-01         4.46278E+03         1.00488E+00         1.95255E+02         4.42138E+03         3.82005E+03         6.01330E+02
+          6.30714E-03         3.58990E-03        -1.27181E-03         3.96287E-01         4.44884E-01         3.96289E-01         4.34077E+03         1.00488E+00         1.90665E+02         4.29969E+03         3.71172E+03         5.87979E+02
+          6.30714E-03         3.75973E-03        -1.31102E-03         3.96287E-01         4.55555E-01         3.96289E-01         4.21888E+03         1.00488E+00         1.86081E+02         4.17816E+03         3.60354E+03         5.74618E+02
+          6.30714E-03         3.92956E-03        -1.35204E-03         3.96286E-01         4.66225E-01         3.96289E-01         4.09727E+03         1.00488E+00         1.81511E+02         4.05692E+03         3.49565E+03         5.61265E+02
+          6.30714E-03         4.09939E-03        -1.39488E-03         3.96286E-01         4.76896E-01         3.96289E-01         3.97608E+03         1.00488E+00         1.76959E+02         3.93613E+03         3.38819E+03         5.47935E+02
+          6.30714E-03         4.26921E-03        -1.43953E-03         3.96286E-01         4.87567E-01         3.96288E-01         3.85545E+03         1.00488E+00         1.72430E+02         3.81593E+03         3.28128E+03         5.34645E+02
+          6.30714E-03         4.43904E-03        -1.48599E-03         3.96285E-01         4.98237E-01         3.96288E-01         3.73553E+03         1.00488E+00         1.67930E+02         3.69646E+03         3.17505E+03         5.21410E+02
+          6.30714E-03         4.60887E-03        -1.53426E-03         3.96285E-01         5.08908E-01         3.96288E-01         3.61645E+03         1.00488E+00         1.63464E+02         3.57787E+03         3.06962E+03         5.08247E+02
+          6.30714E-03         4.77869E-03        -1.58435E-03         3.96285E-01         5.19578E-01         3.96288E-01         3.49836E+03         1.00488E+00         1.59036E+02         3.46028E+03         2.96511E+03         4.95170E+02
+          6.30714E-03         4.94852E-03        -1.63624E-03         3.96285E-01         5.30249E-01         3.96288E-01         3.38137E+03         1.00488E+00         1.54652E+02         3.34383E+03         2.86163E+03         4.82195E+02
+          6.30714E-03         5.11835E-03        -1.68995E-03         3.96284E-01         5.40919E-01         3.96288E-01         3.26561E+03         1.00488E+00         1.50314E+02         3.22863E+03         2.75929E+03         4.69336E+02
+          6.30714E-03         5.28818E-03        -1.74548E-03         3.96284E-01         5.51590E-01         3.96288E-01         3.15121E+03         1.00488E+00         1.46029E+02         3.11481E+03         2.65820E+03         4.56606E+02
+          6.30714E-03         5.45800E-03        -1.80281E-03         3.96283E-01         5.62261E-01         3.96288E-01         3.03826E+03         1.00488E+00         1.41799E+02         3.00248E+03         2.55846E+03         4.44020E+02
+          6.30714E-03         5.62783E-03        -1.86195E-03         3.96283E-01         5.72931E-01         3.96287E-01         2.92689E+03         1.00488E+00         1.37628E+02         2.89174E+03         2.46015E+03         4.31591E+02
+          6.30714E-03         5.79766E-03        -1.92291E-03         3.96283E-01         5.83602E-01         3.96287E-01         2.81720E+03         1.00488E+00         1.33521E+02         2.78271E+03         2.36338E+03         4.19332E+02
+          6.30714E-03         5.96749E-03        -1.98568E-03         3.96282E-01         5.94272E-01         3.96287E-01         2.70928E+03         1.00488E+00         1.29479E+02         2.67548E+03         2.26823E+03         4.07253E+02
+          6.30714E-03         6.13731E-03        -2.05027E-03         3.96282E-01         6.04943E-01         3.96287E-01         2.60323E+03         1.00488E+00         1.25507E+02         2.57014E+03         2.17477E+03         3.95368E+02
+          6.30714E-03         6.30714E-03        -2.11666E-03         3.96282E-01         6.15613E-01         3.96287E-01         2.49914E+03         1.00488E+00         1.21607E+02         2.46678E+03         2.08309E+03         3.83687E+02
+          6.30714E-03         6.47697E-03        -2.18487E-03         3.96281E-01         6.26284E-01         3.96287E-01         2.39709E+03         1.00488E+00         1.17782E+02         2.36548E+03         1.99326E+03         3.72220E+02
+          6.30714E-03         6.64680E-03        -2.25489E-03         3.96281E-01         6.36955E-01         3.96287E-01         2.29714E+03         1.00488E+00         1.14033E+02         2.26631E+03         1.90533E+03         3.60978E+02
+          6.30714E-03         6.81662E-03        -2.32672E-03         3.96280E-01         6.47625E-01         3.96287E-01         2.19938E+03         1.00488E+00         1.10364E+02         2.16934E+03         1.81937E+03         3.49970E+02
+          6.30714E-03         6.98645E-03        -2.40036E-03         3.96280E-01         6.58296E-01         3.96287E-01         2.10387E+03         1.00488E+00         1.06776E+02         2.07464E+03         1.73544E+03         3.39204E+02
+          6.30714E-03         7.15628E-03        -2.47582E-03         3.96279E-01         6.68966E-01         3.96287E-01         2.01066E+03         1.00488E+00         1.03271E+02         1.98226E+03         1.65357E+03         3.28689E+02
+          6.30714E-03         7.32611E-03        -2.55309E-03         3.96279E-01         6.79637E-01         3.96287E-01         1.91981E+03         1.00488E+00         9.98496E+01         1.89226E+03         1.57383E+03         3.18432E+02
+          6.30714E-03         7.49593E-03        -2.63217E-03         3.96278E-01         6.90307E-01         3.96287E-01         1.83136E+03         1.00488E+00         9.65136E+01         1.80468E+03         1.49624E+03         3.08440E+02
+          6.30714E-03         7.66576E-03        -2.71306E-03         3.96278E-01         7.00978E-01         3.96287E-01         1.74536E+03         1.00488E+00         9.32639E+01         1.71956E+03         1.42084E+03         2.98718E+02
+          6.30714E-03         7.83559E-03        -2.79576E-03         3.96277E-01         7.11649E-01         3.96287E-01         1.66184E+03         1.00488E+00         9.01011E+01         1.63693E+03         1.34765E+03         2.89274E+02
+          6.30714E-03         8.00542E-03        -2.88028E-03         3.96277E-01         7.22319E-01         3.96287E-01         1.58083E+03         1.00488E+00         8.70258E+01         1.55682E+03         1.27671E+03         2.80111E+02
+          6.30714E-03         8.17524E-03        -2.96661E-03         3.96276E-01         7.32990E-01         3.96287E-01         1.50236E+03         1.00488E+00         8.40383E+01         1.47926E+03         1.20803E+03         2.71233E+02
+          6.30714E-03         8.34507E-03        -3.05475E-03         3.96276E-01         7.43660E-01         3.96287E-01         1.42643E+03         1.00488E+00         8.11386E+01         1.40426E+03         1.14162E+03         2.62645E+02
+          6.30714E-03         8.51490E-03        -3.14471E-03         3.96275E-01         7.54331E-01         3.96288E-01         1.35308E+03         1.00488E+00         7.83267E+01         1.33184E+03         1.07749E+03         2.54348E+02
+          6.30714E-03         8.68473E-03        -3.23647E-03         3.96274E-01         7.65001E-01         3.96288E-01         1.28229E+03         1.00488E+00         7.56023E+01         1.26199E+03         1.01564E+03         2.46347E+02
+          6.30714E-03         8.85455E-03        -3.33005E-03         3.96274E-01         7.75672E-01         3.96288E-01         1.21409E+03         1.00488E+00         7.29648E+01         1.19472E+03         9.56084E+02         2.38641E+02
+          6.30714E-03         9.02438E-03        -3.42544E-03         3.96273E-01         7.86343E-01         3.96288E-01         1.14846E+03         1.00488E+00         7.04137E+01         1.13004E+03         8.98804E+02         2.31233E+02
+          6.30714E-03         9.19421E-03        -3.52265E-03         3.96273E-01         7.97013E-01         3.96288E-01         1.08539E+03         1.00488E+00         6.79482E+01         1.06792E+03         8.43795E+02         2.24122E+02
+          6.30714E-03         9.36403E-03        -3.62166E-03         3.96272E-01         8.07684E-01         3.96289E-01         1.02488E+03         1.00488E+00         6.55672E+01         1.00835E+03         7.91044E+02         2.17308E+02
+          6.30714E-03         9.53386E-03        -3.72249E-03         3.96271E-01         8.18354E-01         3.96289E-01         9.66909E+02         1.00488E+00         6.32698E+01         9.51324E+02         7.40533E+02         2.10791E+02
+          6.30714E-03         9.70369E-03        -3.82513E-03         3.96271E-01         8.29025E-01         3.96289E-01         9.11454E+02         1.00488E+00         6.10546E+01         8.96810E+02         6.92241E+02         2.04569E+02
+          6.30714E-03         9.87352E-03        -3.92958E-03         3.96270E-01         8.39695E-01         3.96290E-01         8.58492E+02         1.00488E+00         5.89205E+01         8.44783E+02         6.46144E+02         1.98640E+02
+          6.30714E-03         1.00433E-02        -4.03585E-03         3.96269E-01         8.50366E-01         3.96290E-01         8.07994E+02         1.00488E+00         5.68659E+01         7.95214E+02         6.02212E+02         1.93001E+02
+          6.30714E-03         1.02132E-02        -4.14393E-03         3.96269E-01         8.61037E-01         3.96290E-01         7.59926E+02         1.00488E+00         5.48895E+01         7.48066E+02         5.60416E+02         1.87650E+02
+          6.30714E-03         1.03830E-02        -4.25382E-03         3.96268E-01         8.71707E-01         3.96291E-01         7.14251E+02         1.00488E+00         5.29895E+01         7.03303E+02         5.20720E+02         1.82583E+02
+          6.30714E-03         1.05528E-02        -4.36552E-03         3.96267E-01         8.82378E-01         3.96291E-01         6.70930E+02         1.00488E+00         5.11645E+01         6.60882E+02         4.83087E+02         1.77796E+02
+          6.30714E-03         1.07227E-02        -4.47903E-03         3.96267E-01         8.93048E-01         3.96292E-01         6.29919E+02         1.00488E+00         4.94128E+01         6.20759E+02         4.47476E+02         1.73283E+02
+          6.30714E-03         1.08925E-02        -4.59436E-03         3.96266E-01         9.03719E-01         3.96293E-01         5.91173E+02         1.00488E+00         4.77326E+01         5.82885E+02         4.13845E+02         1.69040E+02
+          6.30714E-03         1.10623E-02        -4.71150E-03         3.96265E-01         9.14389E-01         3.96293E-01         5.54641E+02         1.00488E+00         4.61223E+01         5.47211E+02         3.82148E+02         1.65062E+02
+          6.30714E-03         1.12321E-02        -4.83045E-03         3.96264E-01         9.25060E-01         3.96294E-01         5.20271E+02         1.00488E+00         4.45802E+01         5.13682E+02         3.52339E+02         1.61343E+02
+          6.30714E-03         1.14020E-02        -4.95122E-03         3.96264E-01         9.35731E-01         3.96295E-01         4.88011E+02         1.00488E+00         4.31047E+01         4.82244E+02         3.24368E+02         1.57875E+02
+          6.30714E-03         1.15718E-02        -5.07380E-03         3.96263E-01         9.46401E-01         3.96295E-01         4.57803E+02         1.00488E+00         4.16940E+01         4.52838E+02         2.98185E+02         1.54653E+02
+          6.30714E-03         1.17416E-02        -5.19818E-03         3.96262E-01         9.57072E-01         3.96296E-01         4.29588E+02         1.00488E+00         4.03465E+01         4.25405E+02         2.73736E+02         1.51670E+02
+          6.30714E-03         1.19114E-02        -5.32439E-03         3.96261E-01         9.67742E-01         3.96297E-01         4.03307E+02         1.00488E+00         3.90606E+01         3.99884E+02         2.50967E+02         1.48917E+02
+          6.30714E-03         1.20813E-02        -5.45240E-03         3.96260E-01         9.78413E-01         3.96298E-01         3.78898E+02         1.00488E+00         3.78348E+01         3.76212E+02         2.29824E+02         1.46388E+02
+          6.30714E-03         1.22511E-02        -5.58223E-03         3.96260E-01         9.89083E-01         3.96299E-01         3.56298E+02         1.00488E+00         3.66676E+01         3.54324E+02         2.10250E+02         1.44074E+02
+          6.30714E-03         1.24209E-02        -5.71387E-03         3.96259E-01         9.99754E-01         3.96300E-01         3.35443E+02         1.00488E+00         3.55575E+01         3.34155E+02         1.92188E+02         1.41966E+02
+          6.30714E-03         1.25908E-02        -5.84732E-03         3.96258E-01         1.01042E+00         3.96301E-01         3.16266E+02         1.00488E+00         3.45032E+01         3.15639E+02         1.75581E+02         1.40058E+02
+          6.30714E-03         1.27606E-02        -5.98259E-03         3.96257E-01         1.02110E+00         3.96302E-01         2.98704E+02         1.00488E+00         3.35032E+01         2.98709E+02         1.60370E+02         1.38340E+02
+          6.30714E-03         1.29304E-02        -6.11966E-03         3.96256E-01         1.03177E+00         3.96304E-01         2.82688E+02         1.00488E+00         3.25564E+01         2.83299E+02         1.46496E+02         1.36803E+02
+          6.30714E-03         1.31002E-02        -6.25855E-03         3.96255E-01         1.04244E+00         3.96305E-01         2.68152E+02         1.00488E+00         3.16614E+01         2.69339E+02         1.33901E+02         1.35438E+02
+          6.30714E-03         1.32701E-02        -6.39926E-03         3.96254E-01         1.05311E+00         3.96306E-01         2.55028E+02         1.00488E+00         3.08171E+01         2.56763E+02         1.22526E+02         1.34237E+02
+          6.30714E-03         1.34399E-02        -6.54177E-03         3.96254E-01         1.06378E+00         3.96308E-01         2.43251E+02         1.00488E+00         3.00223E+01         2.45503E+02         1.12313E+02         1.33190E+02
+          6.30714E-03         1.36097E-02        -6.68610E-03         3.96253E-01         1.07445E+00         3.96309E-01         2.32752E+02         1.00488E+00         2.92757E+01         2.35492E+02         1.03204E+02         1.32288E+02
+          6.30714E-03         1.37795E-02        -6.83224E-03         3.96252E-01         1.08512E+00         3.96311E-01         2.23466E+02         1.00488E+00         2.85764E+01         2.26662E+02         9.51395E+01         1.31522E+02
+          6.30714E-03         1.39494E-02        -6.98019E-03         3.96251E-01         1.09579E+00         3.96312E-01         2.15326E+02         1.00488E+00         2.79231E+01         2.18946E+02         8.80634E+01         1.30883E+02
+          6.30714E-03         1.41192E-02        -7.12996E-03         3.96250E-01         1.10646E+00         3.96314E-01         2.08266E+02         1.00488E+00         2.73147E+01         2.12280E+02         8.19188E+01         1.30361E+02
+          6.30714E-03         1.42890E-02        -7.28154E-03         3.96249E-01         1.11713E+00         3.96316E-01         2.02222E+02         1.00488E+00         2.67500E+01         2.06598E+02         7.66501E+01         1.29948E+02
+          6.30714E-03         1.44589E-02        -7.43493E-03         3.96248E-01         1.12780E+00         3.96318E-01         1.97130E+02         1.00488E+00         2.62277E+01         2.01837E+02         7.22022E+01         1.29634E+02
+          6.30714E-03         1.46287E-02        -7.59013E-03         3.96247E-01         1.13847E+00         3.96320E-01         1.92927E+02         1.00488E+00         2.57467E+01         1.97933E+02         6.85215E+01         1.29411E+02
+          6.30714E-03         1.47985E-02        -7.74715E-03         3.96246E-01         1.14914E+00         3.96322E-01         1.89551E+02         1.00488E+00         2.53055E+01         1.94825E+02         6.55551E+01         1.29270E+02
+          6.30714E-03         1.49683E-02        -7.90598E-03         3.96245E-01         1.15981E+00         3.96324E-01         1.86943E+02         1.00488E+00         2.49028E+01         1.92453E+02         6.32516E+01         1.29201E+02
+          6.30714E-03         1.51382E-02        -8.06662E-03         3.96244E-01         1.17048E+00         3.96326E-01         1.85043E+02         1.00488E+00         2.45372E+01         1.90758E+02         6.15608E+01         1.29197E+02
+          6.30714E-03         1.53080E-02        -8.22907E-03         3.96243E-01         1.18115E+00         3.96328E-01         1.83795E+02         1.00488E+00         2.42070E+01         1.89683E+02         6.04339E+01         1.29249E+02
+          6.30714E-03         1.54778E-02        -8.39334E-03         3.96242E-01         1.19182E+00         3.96331E-01         1.83140E+02         1.00488E+00         2.39108E+01         1.89173E+02         5.98236E+01         1.29350E+02
+          6.30714E-03         1.56476E-02        -8.55942E-03         3.96241E-01         1.20249E+00         3.96333E-01         1.83027E+02         1.00488E+00         2.36467E+01         1.89174E+02         5.96840E+01         1.29490E+02
+          6.30714E-03         1.58175E-02        -8.72731E-03         3.96240E-01         1.21317E+00         3.96336E-01         1.83402E+02         1.00487E+00         2.34132E+01         1.89633E+02         5.99708E+01         1.29662E+02
+          6.30714E-03         1.59873E-02        -8.89702E-03         3.96239E-01         1.22384E+00         3.96339E-01         1.84214E+02         1.00487E+00         2.32083E+01         1.90501E+02         6.06413E+01         1.29860E+02
+          6.30714E-03         1.61571E-02        -9.06854E-03         3.96238E-01         1.23451E+00         3.96341E-01         1.85415E+02         1.00487E+00         2.30304E+01         1.91730E+02         6.16546E+01         1.30075E+02
+          6.30714E-03         1.63270E-02        -9.24187E-03         3.96237E-01         1.24518E+00         3.96344E-01         1.86957E+02         1.00487E+00         2.28774E+01         1.93273E+02         6.29713E+01         1.30302E+02
+          6.30714E-03         1.64968E-02        -9.41701E-03         3.96235E-01         1.25585E+00         3.96347E-01         1.88796E+02         1.00487E+00         2.27475E+01         1.95086E+02         6.45538E+01         1.30532E+02
+          6.30714E-03         1.66666E-02        -9.59397E-03         3.96234E-01         1.26652E+00         3.96350E-01         1.90889E+02         1.00487E+00         2.26388E+01         1.97127E+02         6.63662E+01         1.30761E+02
+          6.30714E-03         1.68364E-02        -9.77274E-03         3.96233E-01         1.27719E+00         3.96354E-01         1.93194E+02         1.00487E+00         2.25493E+01         1.99356E+02         6.83744E+01         1.30981E+02
+          6.30714E-03         1.70063E-02        -9.95332E-03         3.96232E-01         1.28786E+00         3.96357E-01         1.95672E+02         1.00487E+00         2.24772E+01         2.01734E+02         7.05460E+01         1.31188E+02
+          6.30714E-03         1.71761E-02        -1.01357E-02         3.96231E-01         1.29853E+00         3.96361E-01         1.98287E+02         1.00487E+00         2.24207E+01         2.04227E+02         7.28503E+01         1.31376E+02
+          6.30714E-03         1.73459E-02        -1.03199E-02         3.96230E-01         1.30920E+00         3.96364E-01         2.01003E+02         1.00487E+00         2.23778E+01         2.06799E+02         7.52585E+01         1.31540E+02
+          6.30714E-03         1.75158E-02        -1.05059E-02         3.96229E-01         1.31987E+00         3.96368E-01         2.03788E+02         1.00487E+00         2.23468E+01         2.09419E+02         7.77435E+01         1.31675E+02
+          6.30714E-03         1.76856E-02        -1.06938E-02         3.96227E-01         1.33054E+00         3.96372E-01         2.06611E+02         1.00487E+00         2.23260E+01         2.12057E+02         8.02798E+01         1.31777E+02
+          6.30714E-03         1.78554E-02        -1.08834E-02         3.96226E-01         1.34121E+00         3.96376E-01         2.09442E+02         1.00487E+00         2.23137E+01         2.14686E+02         8.28438E+01         1.31842E+02
+          6.30714E-03         1.80252E-02        -1.10749E-02         3.96225E-01         1.35188E+00         3.96380E-01         2.12255E+02         1.00487E+00         2.23084E+01         2.17280E+02         8.54135E+01         1.31867E+02
+          6.30714E-03         1.81951E-02        -1.12682E-02         3.96224E-01         1.36255E+00         3.96384E-01         2.15026E+02         1.00487E+00         2.23084E+01         2.19815E+02         8.79685E+01         1.31847E+02
+          6.30714E-03         1.83649E-02        -1.14632E-02         3.96223E-01         1.37322E+00         3.96388E-01         2.17730E+02         1.00487E+00         2.23125E+01         2.22270E+02         9.04901E+01         1.31780E+02
+          6.30714E-03         1.85347E-02        -1.16601E-02         3.96221E-01         1.38389E+00         3.96393E-01         2.20348E+02         1.00487E+00         2.23192E+01         2.24625E+02         9.29611E+01         1.31664E+02
+          6.30714E-03         1.87045E-02        -1.18589E-02         3.96220E-01         1.39457E+00         3.96397E-01         2.22859E+02         1.00487E+00         2.23273E+01         2.26862E+02         9.53661E+01         1.31496E+02
+          6.30714E-03         1.88744E-02        -1.20594E-02         3.96219E-01         1.40524E+00         3.96402E-01         2.25247E+02         1.00487E+00         2.23356E+01         2.28965E+02         9.76908E+01         1.31274E+02
+          6.30714E-03         1.90442E-02        -1.22617E-02         3.96218E-01         1.41591E+00         3.96407E-01         2.27497E+02         1.00487E+00         2.23430E+01         2.30919E+02         9.99228E+01         1.30996E+02
+          6.30714E-03         1.92140E-02        -1.24659E-02         3.96216E-01         1.42658E+00         3.96412E-01         2.29593E+02         1.00487E+00         2.23485E+01         2.32713E+02         1.02051E+02         1.30662E+02
+          6.30714E-03         1.93839E-02        -1.26718E-02         3.96215E-01         1.43725E+00         3.96418E-01         2.31525E+02         1.00486E+00         2.23512E+01         2.34335E+02         1.04065E+02         1.30270E+02
+          6.30714E-03         1.95537E-02        -1.28796E-02         3.96214E-01         1.44792E+00         3.96423E-01         2.33282E+02         1.00486E+00         2.23502E+01         2.35776E+02         1.05957E+02         1.29819E+02
+          6.30714E-03         1.97235E-02        -1.30892E-02         3.96212E-01         1.45859E+00         3.96428E-01         2.34854E+02         1.00486E+00         2.23447E+01         2.37029E+02         1.07719E+02         1.29310E+02
+          6.30714E-03         1.98933E-02        -1.33006E-02         3.96211E-01         1.46926E+00         3.96434E-01         2.36234E+02         1.00486E+00         2.23341E+01         2.38086E+02         1.09345E+02         1.28741E+02
+          6.30714E-03         2.00632E-02        -1.35138E-02         3.96210E-01         1.47993E+00         3.96440E-01         2.37417E+02         1.00486E+00         2.23178E+01         2.38945E+02         1.10831E+02         1.28113E+02
+          6.30714E-03         2.02330E-02        -1.37289E-02         3.96208E-01         1.49060E+00         3.96446E-01         2.38398E+02         1.00486E+00         2.22951E+01         2.39600E+02         1.12173E+02         1.27427E+02
+          6.30714E-03         2.04028E-02        -1.39457E-02         3.96207E-01         1.50127E+00         3.96452E-01         2.39173E+02         1.00486E+00         2.22657E+01         2.40051E+02         1.13367E+02         1.26683E+02
+          6.30714E-03         2.05726E-02        -1.41644E-02         3.96206E-01         1.51194E+00         3.96459E-01         2.39741E+02         1.00486E+00         2.22290E+01         2.40295E+02         1.14412E+02         1.25882E+02
+          6.30714E-03         2.07425E-02        -1.43848E-02         3.96204E-01         1.52261E+00         3.96465E-01         2.40100E+02         1.00486E+00         2.21847E+01         2.40333E+02         1.15308E+02         1.25026E+02
+          6.30714E-03         2.09123E-02        -1.46071E-02         3.96203E-01         1.53328E+00         3.96472E-01         2.40251E+02         1.00486E+00         2.21324E+01         2.40167E+02         1.16053E+02         1.24114E+02
+          6.30714E-03         2.10821E-02        -1.48312E-02         3.96201E-01         1.54395E+00         3.96479E-01         2.40195E+02         1.00486E+00         2.20720E+01         2.39799E+02         1.16649E+02         1.23150E+02
+          6.30714E-03         2.12520E-02        -1.50571E-02         3.96200E-01         1.55462E+00         3.96486E-01         2.39933E+02         1.00486E+00         2.20032E+01         2.39232E+02         1.17097E+02         1.22135E+02
+          6.30714E-03         2.14218E-02        -1.52849E-02         3.96198E-01         1.56529E+00         3.96493E-01         2.39470E+02         1.00486E+00         2.19258E+01         2.38469E+02         1.17399E+02         1.21070E+02
+          6.30714E-03         2.15916E-02        -1.55144E-02         3.96197E-01         1.57596E+00         3.96501E-01         2.38810E+02         1.00485E+00         2.18397E+01         2.37516E+02         1.17559E+02         1.19958E+02
+          6.30714E-03         2.17614E-02        -1.57457E-02         3.96196E-01         1.58664E+00         3.96508E-01         2.37955E+02         1.00485E+00         2.17448E+01         2.36379E+02         1.17579E+02         1.18800E+02
+          6.30714E-03         2.19313E-02        -1.59789E-02         3.96194E-01         1.59731E+00         3.96516E-01         2.36914E+02         1.00485E+00         2.16411E+01         2.35063E+02         1.17463E+02         1.17600E+02
+          6.30714E-03         2.21011E-02        -1.62139E-02         3.96193E-01         1.60798E+00         3.96524E-01         2.35690E+02         1.00485E+00         2.15285E+01         2.33575E+02         1.17215E+02         1.16360E+02
+          6.30714E-03         2.22709E-02        -1.64507E-02         3.96191E-01         1.61865E+00         3.96532E-01         2.34291E+02         1.00485E+00         2.14071E+01         2.31922E+02         1.16841E+02         1.15081E+02
+          6.30714E-03         2.24407E-02        -1.66893E-02         3.96190E-01         1.62932E+00         3.96541E-01         2.32724E+02         1.00485E+00         2.12769E+01         2.30113E+02         1.16345E+02         1.13768E+02
+          6.30714E-03         2.26106E-02        -1.69297E-02         3.96188E-01         1.63999E+00         3.96550E-01         2.30996E+02         1.00485E+00         2.11379E+01         2.28154E+02         1.15733E+02         1.12421E+02
+          6.30714E-03         2.27804E-02        -1.71719E-02         3.96187E-01         1.65066E+00         3.96559E-01         2.29115E+02         1.00485E+00         2.09904E+01         2.26055E+02         1.15010E+02         1.11045E+02
+          6.30714E-03         2.29502E-02        -1.74160E-02         3.96185E-01         1.66133E+00         3.96568E-01         2.27089E+02         1.00485E+00         2.08343E+01         2.23824E+02         1.14182E+02         1.09642E+02
+          6.30714E-03         2.31201E-02        -1.76618E-02         3.96183E-01         1.67200E+00         3.96577E-01         2.24928E+02         1.00485E+00         2.06699E+01         2.21470E+02         1.13255E+02         1.08215E+02
+          6.30714E-03         2.32899E-02        -1.79095E-02         3.96182E-01         1.68267E+00         3.96586E-01         2.22638E+02         1.00484E+00         2.04972E+01         2.19002E+02         1.12236E+02         1.06766E+02
+          6.30714E-03         2.34597E-02        -1.81590E-02         3.96180E-01         1.69334E+00         3.96596E-01         2.20230E+02         1.00484E+00         2.03165E+01         2.16429E+02         1.11130E+02         1.05299E+02
+          6.30714E-03         2.36295E-02        -1.84103E-02         3.96179E-01         1.70401E+00         3.96606E-01         2.17712E+02         1.00484E+00         2.01280E+01         2.13761E+02         1.09945E+02         1.03816E+02
+          6.30714E-03         2.37994E-02        -1.86634E-02         3.96177E-01         1.71468E+00         3.96617E-01         2.15094E+02         1.00484E+00         1.99318E+01         2.11005E+02         1.08685E+02         1.02320E+02
+          6.30714E-03         2.39692E-02        -1.89183E-02         3.96176E-01         1.72535E+00         3.96627E-01         2.12383E+02         1.00484E+00         1.97283E+01         2.08173E+02         1.07358E+02         1.00814E+02
+          6.30714E-03         2.41390E-02        -1.91751E-02         3.96174E-01         1.73602E+00         3.96638E-01         2.09590E+02         1.00484E+00         1.95175E+01         2.05272E+02         1.05970E+02         9.93012E+01
+          6.30714E-03         2.43088E-02        -1.94336E-02         3.96172E-01         1.74669E+00         3.96649E-01         2.06722E+02         1.00484E+00         1.92997E+01         2.02311E+02         1.04528E+02         9.77834E+01
+          6.30714E-03         2.44787E-02        -1.96940E-02         3.96171E-01         1.75736E+00         3.96660E-01         2.03790E+02         1.00484E+00         1.90753E+01         1.99300E+02         1.03036E+02         9.62636E+01
+          6.30714E-03         2.46485E-02        -1.99562E-02         3.96169E-01         1.76804E+00         3.96671E-01         2.00801E+02         1.00483E+00         1.88444E+01         1.96247E+02         1.01502E+02         9.47445E+01
+          6.30714E-03         2.48183E-02        -2.02202E-02         3.96167E-01         1.77871E+00         3.96683E-01         1.97765E+02         1.00483E+00         1.86074E+01         1.93160E+02         9.99311E+01         9.32286E+01
+          6.30714E-03         2.49882E-02        -2.04860E-02         3.96166E-01         1.78938E+00         3.96695E-01         1.94689E+02         1.00483E+00         1.83644E+01         1.90047E+02         9.83291E+01         9.17182E+01
+          6.30714E-03         2.51580E-02        -2.07536E-02         3.96164E-01         1.80005E+00         3.96707E-01         1.91582E+02         1.00483E+00         1.81158E+01         1.86917E+02         9.67016E+01         9.02158E+01
+          6.30714E-03         2.53278E-02        -2.10230E-02         3.96162E-01         1.81072E+00         3.96720E-01         1.88451E+02         1.00483E+00         1.78618E+01         1.83778E+02         9.50540E+01         8.87236E+01
+          6.30714E-03         2.54976E-02        -2.12943E-02         3.96161E-01         1.82139E+00         3.96732E-01         1.85305E+02         1.00483E+00         1.76028E+01         1.80635E+02         9.33915E+01         8.72438E+01
+          6.30714E-03         2.56675E-02        -2.15673E-02         3.96159E-01         1.83206E+00         3.96745E-01         1.82150E+02         1.00483E+00         1.73390E+01         1.77497E+02         9.17189E+01         8.57783E+01
+          6.30714E-03         2.58373E-02        -2.18422E-02         3.96157E-01         1.84273E+00         3.96759E-01         1.78994E+02         1.00482E+00         1.70706E+01         1.74370E+02         9.00412E+01         8.43292E+01
+          6.30714E-03         2.60071E-02        -2.21189E-02         3.96155E-01         1.85340E+00         3.96772E-01         1.75844E+02         1.00482E+00         1.67981E+01         1.71261E+02         8.83626E+01         8.28983E+01
+          6.30714E-03         2.61769E-02        -2.23974E-02         3.96154E-01         1.86407E+00         3.96786E-01         1.72705E+02         1.00482E+00         1.65217E+01         1.68175E+02         8.66876E+01         8.14874E+01
+          6.47697E-03         8.72665E-04        -9.59078E-04         4.06960E-01         2.74155E-01         4.06961E-01         5.59515E+03         1.00368E+00         2.09061E+02         5.56886E+03         4.89556E+03         6.73299E+02
+          6.47697E-03         1.04249E-03        -9.69296E-04         4.06960E-01         2.84826E-01         4.06961E-01         5.50253E+03         1.00368E+00         2.05922E+02         5.47613E+03         4.81151E+03         6.64614E+02
+          6.47697E-03         1.21232E-03        -9.81326E-04         4.06960E-01         2.95496E-01         4.06961E-01         5.40781E+03         1.00368E+00         2.02714E+02         5.38131E+03         4.72560E+03         6.55710E+02
+          6.47697E-03         1.38215E-03        -9.95168E-04         4.06960E-01         3.06167E-01         4.06961E-01         5.31113E+03         1.00368E+00         1.99443E+02         5.28454E+03         4.63794E+03         6.46599E+02
+          6.47697E-03         1.55197E-03        -1.01082E-03         4.06959E-01         3.16838E-01         4.06961E-01         5.21265E+03         1.00368E+00         1.96114E+02         5.18598E+03         4.54868E+03         6.37292E+02
+          6.47697E-03         1.72180E-03        -1.02829E-03         4.06959E-01         3.27508E-01         4.06961E-01         5.11250E+03         1.00368E+00         1.92730E+02         5.08575E+03         4.45795E+03         6.27801E+02
+          6.47697E-03         1.89163E-03        -1.04757E-03         4.06959E-01         3.38179E-01         4.06961E-01         5.01083E+03         1.00368E+00         1.89298E+02         4.98402E+03         4.36588E+03         6.18139E+02
+          6.47697E-03         2.06146E-03        -1.06866E-03         4.06959E-01         3.48849E-01         4.06961E-01         4.90779E+03         1.00368E+00         1.85823E+02         4.88093E+03         4.27261E+03         6.08318E+02
+          6.47697E-03         2.23128E-03        -1.09156E-03         4.06959E-01         3.59520E-01         4.06960E-01         4.80353E+03         1.00368E+00         1.82310E+02         4.77662E+03         4.17827E+03         5.98350E+02
+          6.47697E-03         2.40111E-03        -1.11627E-03         4.06959E-01         3.70190E-01         4.06960E-01         4.69818E+03         1.00368E+00         1.78763E+02         4.67124E+03         4.08299E+03         5.88249E+02
+          6.47697E-03         2.57094E-03        -1.14280E-03         4.06959E-01         3.80861E-01         4.06960E-01         4.59189E+03         1.00368E+00         1.75187E+02         4.56494E+03         3.98692E+03         5.78025E+02
+          6.47697E-03         2.74077E-03        -1.17114E-03         4.06958E-01         3.91532E-01         4.06960E-01         4.48482E+03         1.00368E+00         1.71589E+02         4.45787E+03         3.89018E+03         5.67693E+02
+          6.47697E-03         2.91059E-03        -1.20129E-03         4.06958E-01         4.02202E-01         4.06960E-01         4.37711E+03         1.00368E+00         1.67972E+02         4.35017E+03         3.79290E+03         5.57266E+02
+          6.47697E-03         3.08042E-03        -1.23325E-03         4.06958E-01         4.12873E-01         4.06960E-01         4.26889E+03         1.00368E+00         1.64342E+02         4.24199E+03         3.69523E+03         5.46755E+02
+          6.47697E-03         3.25025E-03        -1.26703E-03         4.06958E-01         4.23543E-01         4.06960E-01         4.16032E+03         1.00368E+00         1.60703E+02         4.13346E+03         3.59729E+03         5.36175E+02
+          6.47697E-03         3.42008E-03        -1.30262E-03         4.06958E-01         4.34214E-01         4.06960E-01         4.05153E+03         1.00368E+00         1.57060E+02         4.02474E+03         3.49920E+03         5.25537E+02
+          6.47697E-03         3.58990E-03        -1.34002E-03         4.06957E-01         4.44884E-01         4.06960E-01         3.94267E+03         1.00368E+00         1.53418E+02         3.91596E+03         3.40110E+03         5.14855E+02
+          6.47697E-03         3.75973E-03        -1.37923E-03         4.06957E-01         4.55555E-01         4.06959E-01         3.83386E+03         1.00368E+00         1.49781E+02         3.80726E+03         3.30311E+03         5.04141E+02
+          6.47697E-03         3.92956E-03        -1.42025E-03         4.06957E-01         4.66225E-01         4.06959E-01         3.72525E+03         1.00368E+00         1.46154E+02         3.69876E+03         3.20536E+03         4.93409E+02
+          6.47697E-03         4.09939E-03        -1.46309E-03         4.06957E-01         4.76896E-01         4.06959E-01         3.61696E+03         1.00368E+00         1.42541E+02         3.59062E+03         3.10795E+03         4.82670E+02
+          6.47697E-03         4.26921E-03        -1.50774E-03         4.06956E-01         4.87567E-01         4.06959E-01         3.50913E+03         1.00368E+00         1.38947E+02         3.48295E+03         3.01101E+03         4.71938E+02
+          6.47697E-03         4.43904E-03        -1.55420E-03         4.06956E-01         4.98237E-01         4.06959E-01         3.40188E+03         1.00368E+00         1.35375E+02         3.37587E+03         2.91465E+03         4.61224E+02
+          6.47697E-03         4.60887E-03        -1.60247E-03         4.06956E-01         5.08908E-01         4.06959E-01         3.29533E+03         1.00368E+00         1.31829E+02         3.26952E+03         2.81898E+03         4.50540E+02
+          6.47697E-03         4.77869E-03        -1.65255E-03         4.06955E-01         5.19578E-01         4.06959E-01         3.18959E+03         1.00368E+00         1.28313E+02         3.16401E+03         2.72411E+03         4.39900E+02
+          6.47697E-03         4.94852E-03        -1.70445E-03         4.06955E-01         5.30249E-01         4.06959E-01         3.08479E+03         1.00368E+00         1.24832E+02         3.05945E+03         2.63014E+03         4.29314E+02
+          6.47697E-03         5.11835E-03        -1.75816E-03         4.06955E-01         5.40919E-01         4.06958E-01         2.98104E+03         1.00368E+00         1.21387E+02         2.95596E+03         2.53716E+03         4.18794E+02
+          6.47697E-03         5.28818E-03        -1.81368E-03         4.06954E-01         5.51590E-01         4.06958E-01         2.87843E+03         1.00368E+00         1.17983E+02         2.85364E+03         2.44528E+03         4.08351E+02
+          6.47697E-03         5.45800E-03        -1.87102E-03         4.06954E-01         5.62261E-01         4.06958E-01         2.77708E+03         1.00368E+00         1.14623E+02         2.75259E+03         2.35459E+03         3.97996E+02
+          6.47697E-03         5.62783E-03        -1.93016E-03         4.06954E-01         5.72931E-01         4.06958E-01         2.67708E+03         1.00368E+00         1.11309E+02         2.65291E+03         2.26517E+03         3.87741E+02
+          6.47697E-03         5.79766E-03        -1.99112E-03         4.06953E-01         5.83602E-01         4.06958E-01         2.57852E+03         1.00368E+00         1.08045E+02         2.55470E+03         2.17711E+03         3.77595E+02
+          6.47697E-03         5.96749E-03        -2.05389E-03         4.06953E-01         5.94272E-01         4.06958E-01         2.48150E+03         1.00368E+00         1.04833E+02         2.45804E+03         2.09047E+03         3.67568E+02
+          6.47697E-03         6.13731E-03        -2.11847E-03         4.06952E-01         6.04943E-01         4.06958E-01         2.38609E+03         1.00368E+00         1.01675E+02         2.36302E+03         2.00535E+03         3.57671E+02
+          6.47697E-03         6.30714E-03        -2.18487E-03         4.06952E-01         6.15613E-01         4.06958E-01         2.29238E+03         1.00368E+00         9.85746E+01         2.26971E+03         1.92180E+03         3.47913E+02
+          6.47697E-03         6.47697E-03        -2.25307E-03         4.06951E-01         6.26284E-01         4.06958E-01         2.20044E+03         1.00368E+00         9.55328E+01         2.17819E+03         1.83989E+03         3.38302E+02
+          6.47697E-03         6.64680E-03        -2.32309E-03         4.06951E-01         6.36955E-01         4.06958E-01         2.11033E+03         1.00368E+00         9.25517E+01         2.08853E+03         1.75968E+03         3.28848E+02
+          6.47697E-03         6.81662E-03        -2.39492E-03         4.06951E-01         6.47625E-01         4.06958E-01         2.02213E+03         1.00368E+00         8.96330E+01         2.00079E+03         1.68123E+03         3.19559E+02
+          6.47697E-03         6.98645E-03        -2.46857E-03         4.06950E-01         6.58296E-01         4.06958E-01         1.93589E+03         1.00368E+00         8.67783E+01         1.91503E+03         1.60459E+03         3.10442E+02
+          6.47697E-03         7.15628E-03        -2.54402E-03         4.06950E-01         6.68966E-01         4.06957E-01         1.85166E+03         1.00368E+00         8.39887E+01         1.83130E+03         1.52979E+03         3.01505E+02
+          6.47697E-03         7.32611E-03        -2.62129E-03         4.06949E-01         6.79637E-01         4.06957E-01         1.76949E+03         1.00368E+00         8.12655E+01         1.74965E+03         1.45689E+03         2.92754E+02
+          6.47697E-03         7.49593E-03        -2.70037E-03         4.06949E-01         6.90307E-01         4.06957E-01         1.68944E+03         1.00368E+00         7.86096E+01         1.67012E+03         1.38592E+03         2.84197E+02
+          6.47697E-03         7.66576E-03        -2.78126E-03         4.06948E-01         7.00978E-01         4.06958E-01         1.61153E+03         1.00368E+00         7.60218E+01         1.59275E+03         1.31691E+03         2.75840E+02
+          6.47697E-03         7.83559E-03        -2.86397E-03         4.06947E-01         7.11649E-01         4.06958E-01         1.53580E+03         1.00368E+00         7.35026E+01         1.51758E+03         1.24989E+03         2.67687E+02
+          6.47697E-03         8.00542E-03        -2.94849E-03         4.06947E-01         7.22319E-01         4.06958E-01         1.46228E+03         1.00368E+00         7.10525E+01         1.44463E+03         1.18488E+03         2.59745E+02
+          6.47697E-03         8.17524E-03        -3.03482E-03         4.06946E-01         7.32990E-01         4.06958E-01         1.39099E+03         1.00368E+00         6.86717E+01         1.37392E+03         1.12190E+03         2.52017E+02
+          6.47697E-03         8.34507E-03        -3.12296E-03         4.06946E-01         7.43660E-01         4.06958E-01         1.32195E+03         1.00368E+00         6.63603E+01         1.30548E+03         1.06097E+03         2.44509E+02
+          6.47697E-03         8.51490E-03        -3.21291E-03         4.06945E-01         7.54331E-01         4.06958E-01         1.25518E+03         1.00368E+00         6.41182E+01         1.23931E+03         1.00209E+03         2.37223E+02
+          6.47697E-03         8.68473E-03        -3.30468E-03         4.06945E-01         7.65001E-01         4.06958E-01         1.19069E+03         1.00368E+00         6.19452E+01         1.17543E+03         9.45265E+02         2.30162E+02
+          6.47697E-03         8.85455E-03        -3.39826E-03         4.06944E-01         7.75672E-01         4.06958E-01         1.12847E+03         1.00368E+00         5.98410E+01         1.11383E+03         8.90503E+02         2.23330E+02
+          6.47697E-03         9.02438E-03        -3.49365E-03         4.06943E-01         7.86343E-01         4.06958E-01         1.06854E+03         1.00368E+00         5.78050E+01         1.05453E+03         8.37798E+02         2.16729E+02
+          6.47697E-03         9.19421E-03        -3.59085E-03         4.06943E-01         7.97013E-01         4.06959E-01         1.01089E+03         1.00368E+00         5.58367E+01         9.97504E+02         7.87144E+02         2.10361E+02
+          6.47697E-03         9.36403E-03        -3.68987E-03         4.06942E-01         8.07684E-01         4.06959E-01         9.55499E+02         1.00368E+00         5.39353E+01         9.42755E+02         7.38530E+02         2.04225E+02
+          6.47697E-03         9.53386E-03        -3.79070E-03         4.06941E-01         8.18354E-01         4.06959E-01         9.02370E+02         1.00368E+00         5.20999E+01         8.90268E+02         6.91943E+02         1.98325E+02
+          6.47697E-03         9.70369E-03        -3.89334E-03         4.06941E-01         8.29025E-01         4.06959E-01         8.51483E+02         1.00368E+00         5.03297E+01         8.40024E+02         6.47365E+02         1.92659E+02
+          6.47697E-03         9.87352E-03        -3.99779E-03         4.06940E-01         8.39695E-01         4.06960E-01         8.02818E+02         1.00368E+00         4.86236E+01         7.92003E+02         6.04775E+02         1.87227E+02
+          6.47697E-03         1.00433E-02        -4.10405E-03         4.06939E-01         8.50366E-01         4.06960E-01         7.56351E+02         1.00368E+00         4.69805E+01         7.46181E+02         5.64151E+02         1.82030E+02
+          6.47697E-03         1.02132E-02        -4.21213E-03         4.06939E-01         8.61037E-01         4.06961E-01         7.12056E+02         1.00368E+00         4.53993E+01         7.02529E+02         5.25464E+02         1.77065E+02
+          6.47697E-03         1.03830E-02        -4.32202E-03         4.06938E-01         8.71707E-01         4.06961E-01         6.69903E+02         1.00368E+00         4.38786E+01         6.61016E+02         4.88685E+02         1.72331E+02
+          6.47697E-03         1.05528E-02        -4.43372E-03         4.06937E-01         8.82378E-01         4.06961E-01         6.29858E+02         1.00368E+00         4.24174E+01         6.21609E+02         4.53781E+02         1.67827E+02
+          6.47697E-03         1.07227E-02        -4.54724E-03         4.06937E-01         8.93048E-01         4.06962E-01         5.91886E+02         1.00368E+00         4.10142E+01         5.84268E+02         4.20719E+02         1.63550E+02
+          6.47697E-03         1.08925E-02        -4.66257E-03         4.06936E-01         9.03719E-01         4.06963E-01         5.55947E+02         1.00368E+00         3.96679E+01         5.48956E+02         3.89460E+02         1.59496E+02
+          6.47697E-03         1.10623E-02        -4.77971E-03         4.06935E-01         9.14389E-01         4.06963E-01         5.22000E+02         1.00368E+00         3.83769E+01         5.15628E+02         3.59965E+02         1.55663E+02
+          6.47697E-03         1.12321E-02        -4.89866E-03         4.06934E-01         9.25060E-01         4.06964E-01         4.90001E+02         1.00368E+00         3.71401E+01         4.84240E+02         3.32192E+02         1.52048E+02
+          6.47697E-03         1.14020E-02        -5.01942E-03         4.06934E-01         9.35731E-01         4.06964E-01         4.59903E+02         1.00368E+00         3.59561E+01         4.54744E+02         3.06098E+02         1.48646E+02
+          6.47697E-03         1.15718E-02        -5.14200E-03         4.06933E-01         9.46401E-01         4.06965E-01         4.31659E+02         1.00368E+00         3.48236E+01         4.27091E+02         2.81639E+02         1.45452E+02
+          6.47697E-03         1.17416E-02        -5.26639E-03         4.06932E-01         9.57072E-01         4.06966E-01         4.05219E+02         1.00368E+00         3.37412E+01         4.01230E+02         2.58767E+02         1.42463E+02
+          6.47697E-03         1.19114E-02        -5.39259E-03         4.06931E-01         9.67742E-01         4.06967E-01         3.80530E+02         1.00368E+00         3.27079E+01         3.77108E+02         2.37435E+02         1.39673E+02
+          6.47697E-03         1.20813E-02        -5.52061E-03         4.06930E-01         9.78413E-01         4.06968E-01         3.57539E+02         1.00368E+00         3.17222E+01         3.54672E+02         2.17594E+02         1.37078E+02
+          6.47697E-03         1.22511E-02        -5.65043E-03         4.06929E-01         9.89083E-01         4.06969E-01         3.36192E+02         1.00368E+00         3.07831E+01         3.33864E+02         1.99193E+02         1.34671E+02
+          6.47697E-03         1.24209E-02        -5.78207E-03         4.06929E-01         9.99754E-01         4.06970E-01         3.16433E+02         1.00368E+00         2.98894E+01         3.14629E+02         1.82183E+02         1.32446E+02
+          6.47697E-03         1.25908E-02        -5.91552E-03         4.06928E-01         1.01042E+00         4.06971E-01         2.98204E+02         1.00368E+00         2.90399E+01         2.96909E+02         1.66511E+02         1.30398E+02
+          6.47697E-03         1.27606E-02        -6.05079E-03         4.06927E-01         1.02110E+00         4.06972E-01         2.81450E+02         1.00368E+00         2.82337E+01         2.80646E+02         1.52125E+02         1.28521E+02
+          6.47697E-03         1.29304E-02        -6.18787E-03         4.06926E-01         1.03177E+00         4.06973E-01         2.66111E+02         1.00368E+00         2.74696E+01         2.65780E+02         1.38973E+02         1.26808E+02
+          6.47697E-03         1.31002E-02        -6.32676E-03         4.06925E-01         1.04244E+00         4.06974E-01         2.52129E+02         1.00368E+00         2.67467E+01         2.52253E+02         1.27002E+02         1.25252E+02
+          6.47697E-03         1.32701E-02        -6.46746E-03         4.06924E-01         1.05311E+00         4.06976E-01         2.39445E+02         1.00368E+00         2.60640E+01         2.40005E+02         1.16159E+02         1.23846E+02
+          6.47697E-03         1.34399E-02        -6.60997E-03         4.06923E-01         1.06378E+00         4.06977E-01         2.27999E+02         1.00368E+00         2.54205E+01         2.28976E+02         1.06393E+02         1.22584E+02
+          6.47697E-03         1.36097E-02        -6.75430E-03         4.06922E-01         1.07445E+00         4.06978E-01         2.17734E+02         1.00368E+00         2.48153E+01         2.19107E+02         9.76491E+01         1.21458E+02
+          6.47697E-03         1.37795E-02        -6.90044E-03         4.06921E-01         1.08512E+00         4.06980E-01         2.08590E+02         1.00368E+00         2.42474E+01         2.10339E+02         8.98764E+01         1.20462E+02
+          6.47697E-03         1.39494E-02        -7.04839E-03         4.06920E-01         1.09579E+00         4.06981E-01         2.00508E+02         1.00368E+00         2.37160E+01         2.02611E+02         8.30230E+01         1.19588E+02
+          6.47697E-03         1.41192E-02        -7.19816E-03         4.06919E-01         1.10646E+00         4.06983E-01         1.93430E+02         1.00368E+00         2.32201E+01         1.95867E+02         7.70376E+01         1.18829E+02
+          6.47697E-03         1.42890E-02        -7.34974E-03         4.06918E-01         1.11713E+00         4.06985E-01         1.87299E+02         1.00368E+00         2.27588E+01         1.90047E+02         7.18696E+01         1.18177E+02
+          6.47697E-03         1.44589E-02        -7.50313E-03         4.06917E-01         1.12780E+00         4.06987E-01         1.82058E+02         1.00368E+00         2.23310E+01         1.85095E+02         6.74693E+01         1.17626E+02
+          6.47697E-03         1.46287E-02        -7.65833E-03         4.06916E-01         1.13847E+00         4.06988E-01         1.77651E+02         1.00368E+00         2.19358E+01         1.80955E+02         6.37876E+01         1.17168E+02
+          6.47697E-03         1.47985E-02        -7.81535E-03         4.06915E-01         1.14914E+00         4.06990E-01         1.74023E+02         1.00368E+00         2.15720E+01         1.77572E+02         6.07767E+01         1.16795E+02
+          6.47697E-03         1.49683E-02        -7.97418E-03         4.06914E-01         1.15981E+00         4.06992E-01         1.71119E+02         1.00368E+00         2.12387E+01         1.74890E+02         5.83896E+01         1.16501E+02
+          6.47697E-03         1.51382E-02        -8.13482E-03         4.06913E-01         1.17048E+00         4.06995E-01         1.68888E+02         1.00368E+00         2.09347E+01         1.72858E+02         5.65806E+01         1.16278E+02
+          6.47697E-03         1.53080E-02        -8.29727E-03         4.06912E-01         1.18115E+00         4.06997E-01         1.67276E+02         1.00368E+00         2.06587E+01         1.71424E+02         5.53049E+01         1.16119E+02
+          6.47697E-03         1.54778E-02        -8.46154E-03         4.06911E-01         1.19182E+00         4.06999E-01         1.66234E+02         1.00368E+00         2.04096E+01         1.70537E+02         5.45193E+01         1.16017E+02
+          6.47697E-03         1.56476E-02        -8.62762E-03         4.06910E-01         1.20249E+00         4.07002E-01         1.65712E+02         1.00368E+00         2.01859E+01         1.70148E+02         5.41817E+01         1.15966E+02
+          6.47697E-03         1.58175E-02        -8.79551E-03         4.06909E-01         1.21317E+00         4.07004E-01         1.65663E+02         1.00368E+00         1.99865E+01         1.70210E+02         5.42514E+01         1.15959E+02
+          6.47697E-03         1.59873E-02        -8.96522E-03         4.06908E-01         1.22384E+00         4.07007E-01         1.66041E+02         1.00368E+00         1.98100E+01         1.70678E+02         5.46892E+01         1.15989E+02
+          6.47697E-03         1.61571E-02        -9.13674E-03         4.06907E-01         1.23451E+00         4.07009E-01         1.66802E+02         1.00368E+00         1.96548E+01         1.71507E+02         5.54574E+01         1.16049E+02
+          6.47697E-03         1.63270E-02        -9.31007E-03         4.06906E-01         1.24518E+00         4.07012E-01         1.67902E+02         1.00368E+00         1.95196E+01         1.72654E+02         5.65196E+01         1.16134E+02
+          6.47697E-03         1.64968E-02        -9.48521E-03         4.06905E-01         1.25585E+00         4.07015E-01         1.69300E+02         1.00368E+00         1.94029E+01         1.74079E+02         5.78410E+01         1.16238E+02
+          6.47697E-03         1.66666E-02        -9.66217E-03         4.06903E-01         1.26652E+00         4.07018E-01         1.70957E+02         1.00368E+00         1.93033E+01         1.75743E+02         5.93884E+01         1.16355E+02
+          6.47697E-03         1.68364E-02        -9.84094E-03         4.06902E-01         1.27719E+00         4.07021E-01         1.72835E+02         1.00368E+00         1.92193E+01         1.77609E+02         6.11301E+01         1.16479E+02
+          6.47697E-03         1.70063E-02        -1.00215E-02         4.06901E-01         1.28786E+00         4.07025E-01         1.74897E+02         1.00368E+00         1.91494E+01         1.79640E+02         6.30360E+01         1.16604E+02
+          6.47697E-03         1.71761E-02        -1.02039E-02         4.06900E-01         1.29853E+00         4.07028E-01         1.77111E+02         1.00367E+00         1.90922E+01         1.81804E+02         6.50776E+01         1.16727E+02
+          6.47697E-03         1.73459E-02        -1.03881E-02         4.06899E-01         1.30920E+00         4.07031E-01         1.79442E+02         1.00367E+00         1.90462E+01         1.84069E+02         6.72278E+01         1.16841E+02
+          6.47697E-03         1.75158E-02        -1.05741E-02         4.06898E-01         1.31987E+00         4.07035E-01         1.81861E+02         1.00367E+00         1.90102E+01         1.86405E+02         6.94614E+01         1.16943E+02
+          6.47697E-03         1.76856E-02        -1.07620E-02         4.06896E-01         1.33054E+00         4.07039E-01         1.84339E+02         1.00367E+00         1.89827E+01         1.88783E+02         7.17545E+01         1.17028E+02
+          6.47697E-03         1.78554E-02        -1.09516E-02         4.06895E-01         1.34121E+00         4.07042E-01         1.86848E+02         1.00367E+00         1.89625E+01         1.91177E+02         7.40847E+01         1.17092E+02
+          6.47697E-03         1.80252E-02        -1.11431E-02         4.06894E-01         1.35188E+00         4.07046E-01         1.89363E+02         1.00367E+00         1.89483E+01         1.93562E+02         7.64314E+01         1.17131E+02
+          6.47697E-03         1.81951E-02        -1.13364E-02         4.06893E-01         1.36255E+00         4.07050E-01         1.91861E+02         1.00367E+00         1.89389E+01         1.95917E+02         7.87752E+01         1.17142E+02
+          6.47697E-03         1.83649E-02        -1.15314E-02         4.06891E-01         1.37322E+00         4.07055E-01         1.94320E+02         1.00367E+00         1.89332E+01         1.98219E+02         8.10984E+01         1.17121E+02
+          6.47697E-03         1.85347E-02        -1.17283E-02         4.06890E-01         1.38389E+00         4.07059E-01         1.96718E+02         1.00367E+00         1.89302E+01         2.00450E+02         8.33846E+01         1.17065E+02
+          6.47697E-03         1.87045E-02        -1.19271E-02         4.06889E-01         1.39457E+00         4.07064E-01         1.99039E+02         1.00367E+00         1.89288E+01         2.02592E+02         8.56189E+01         1.16973E+02
+          6.47697E-03         1.88744E-02        -1.21276E-02         4.06887E-01         1.40524E+00         4.07068E-01         2.01265E+02         1.00367E+00         1.89281E+01         2.04628E+02         8.77878E+01         1.16840E+02
+          6.47697E-03         1.90442E-02        -1.23299E-02         4.06886E-01         1.41591E+00         4.07073E-01         2.03381E+02         1.00367E+00         1.89272E+01         2.06545E+02         8.98791E+01         1.16666E+02
+          6.47697E-03         1.92140E-02        -1.25341E-02         4.06885E-01         1.42658E+00         4.07078E-01         2.05373E+02         1.00367E+00         1.89252E+01         2.08331E+02         9.18818E+01         1.16449E+02
+          6.47697E-03         1.93839E-02        -1.27400E-02         4.06884E-01         1.43725E+00         4.07083E-01         2.07229E+02         1.00367E+00         1.89215E+01         2.09972E+02         9.37864E+01         1.16186E+02
+          6.47697E-03         1.95537E-02        -1.29478E-02         4.06882E-01         1.44792E+00         4.07088E-01         2.08939E+02         1.00367E+00         1.89154E+01         2.11461E+02         9.55844E+01         1.15877E+02
+          6.47697E-03         1.97235E-02        -1.31574E-02         4.06881E-01         1.45859E+00         4.07093E-01         2.10493E+02         1.00367E+00         1.89062E+01         2.12788E+02         9.72685E+01         1.15520E+02
+          6.47697E-03         1.98933E-02        -1.33688E-02         4.06879E-01         1.46926E+00         4.07099E-01         2.11883E+02         1.00367E+00         1.88932E+01         2.13947E+02         9.88325E+01         1.15115E+02
+          6.47697E-03         2.00632E-02        -1.35820E-02         4.06878E-01         1.47993E+00         4.07105E-01         2.13103E+02         1.00367E+00         1.88761E+01         2.14932E+02         1.00271E+02         1.14660E+02
+          6.47697E-03         2.02330E-02        -1.37971E-02         4.06877E-01         1.49060E+00         4.07111E-01         2.14147E+02         1.00367E+00         1.88544E+01         2.15738E+02         1.01581E+02         1.14157E+02
+          6.47697E-03         2.04028E-02        -1.40139E-02         4.06875E-01         1.50127E+00         4.07117E-01         2.15011E+02         1.00367E+00         1.88275E+01         2.16363E+02         1.02758E+02         1.13605E+02
+          6.47697E-03         2.05726E-02        -1.42326E-02         4.06874E-01         1.51194E+00         4.07123E-01         2.15694E+02         1.00367E+00         1.87953E+01         2.16805E+02         1.03801E+02         1.13003E+02
+          6.47697E-03         2.07425E-02        -1.44530E-02         4.06872E-01         1.52261E+00         4.07129E-01         2.16191E+02         1.00366E+00         1.87572E+01         2.17061E+02         1.04708E+02         1.12353E+02
+          6.47697E-03         2.09123E-02        -1.46753E-02         4.06871E-01         1.53328E+00         4.07136E-01         2.16504E+02         1.00366E+00         1.87132E+01         2.17133E+02         1.05478E+02         1.11655E+02
+          6.47697E-03         2.10821E-02        -1.48994E-02         4.06870E-01         1.54395E+00         4.07142E-01         2.16631E+02         1.00366E+00         1.86628E+01         2.17022E+02         1.06112E+02         1.10909E+02
+          6.47697E-03         2.12520E-02        -1.51253E-02         4.06868E-01         1.55462E+00         4.07149E-01         2.16575E+02         1.00366E+00         1.86060E+01         2.16729E+02         1.06611E+02         1.10118E+02
+          6.47697E-03         2.14218E-02        -1.53530E-02         4.06867E-01         1.56529E+00         4.07156E-01         2.16336E+02         1.00366E+00         1.85425E+01         2.16256E+02         1.06976E+02         1.09281E+02
+          6.47697E-03         2.15916E-02        -1.55826E-02         4.06865E-01         1.57596E+00         4.07163E-01         2.15918E+02         1.00366E+00         1.84723E+01         2.15608E+02         1.07209E+02         1.08400E+02
+          6.47697E-03         2.17614E-02        -1.58139E-02         4.06864E-01         1.58664E+00         4.07171E-01         2.15325E+02         1.00366E+00         1.83952E+01         2.14789E+02         1.07313E+02         1.07476E+02
+          6.47697E-03         2.19313E-02        -1.60471E-02         4.06862E-01         1.59731E+00         4.07178E-01         2.14559E+02         1.00366E+00         1.83112E+01         2.13803E+02         1.07291E+02         1.06512E+02
+          6.47697E-03         2.21011E-02        -1.62821E-02         4.06861E-01         1.60798E+00         4.07186E-01         2.13627E+02         1.00366E+00         1.82202E+01         2.12656E+02         1.07147E+02         1.05509E+02
+          6.47697E-03         2.22709E-02        -1.65189E-02         4.06859E-01         1.61865E+00         4.07194E-01         2.12532E+02         1.00366E+00         1.81223E+01         2.11353E+02         1.06884E+02         1.04469E+02
+          6.47697E-03         2.24407E-02        -1.67575E-02         4.06857E-01         1.62932E+00         4.07202E-01         2.11282E+02         1.00366E+00         1.80174E+01         2.09902E+02         1.06508E+02         1.03393E+02
+          6.47697E-03         2.26106E-02        -1.69979E-02         4.06856E-01         1.63999E+00         4.07211E-01         2.09882E+02         1.00366E+00         1.79055E+01         2.08308E+02         1.06023E+02         1.02285E+02
+          6.47697E-03         2.27804E-02        -1.72401E-02         4.06854E-01         1.65066E+00         4.07219E-01         2.08339E+02         1.00366E+00         1.77868E+01         2.06578E+02         1.05433E+02         1.01145E+02
+          6.47697E-03         2.29502E-02        -1.74842E-02         4.06853E-01         1.66133E+00         4.07228E-01         2.06660E+02         1.00365E+00         1.76613E+01         2.04721E+02         1.04744E+02         9.99770E+01
+          6.47697E-03         2.31201E-02        -1.77300E-02         4.06851E-01         1.67200E+00         4.07237E-01         2.04851E+02         1.00365E+00         1.75291E+01         2.02744E+02         1.03962E+02         9.87822E+01
+          6.47697E-03         2.32899E-02        -1.79777E-02         4.06850E-01         1.68267E+00         4.07247E-01         2.02921E+02         1.00365E+00         1.73903E+01         2.00655E+02         1.03092E+02         9.75633E+01
+          6.47697E-03         2.34597E-02        -1.82272E-02         4.06848E-01         1.69334E+00         4.07256E-01         2.00878E+02         1.00365E+00         1.72451E+01         1.98461E+02         1.02138E+02         9.63225E+01
+          6.47697E-03         2.36295E-02        -1.84785E-02         4.06846E-01         1.70401E+00         4.07266E-01         1.98728E+02         1.00365E+00         1.70935E+01         1.96171E+02         1.01108E+02         9.50624E+01
+          6.47697E-03         2.37994E-02        -1.87316E-02         4.06845E-01         1.71468E+00         4.07276E-01         1.96480E+02         1.00365E+00         1.69357E+01         1.93793E+02         1.00007E+02         9.37854E+01
+          6.47697E-03         2.39692E-02        -1.89865E-02         4.06843E-01         1.72535E+00         4.07286E-01         1.94142E+02         1.00365E+00         1.67719E+01         1.91335E+02         9.88408E+01         9.24937E+01
+          6.47697E-03         2.41390E-02        -1.92433E-02         4.06841E-01         1.73602E+00         4.07296E-01         1.91722E+02         1.00365E+00         1.66022E+01         1.88805E+02         9.76147E+01         9.11899E+01
+          6.47697E-03         2.43088E-02        -1.95018E-02         4.06840E-01         1.74669E+00         4.07307E-01         1.89228E+02         1.00365E+00         1.64269E+01         1.86211E+02         9.63346E+01         8.98764E+01
+          6.47697E-03         2.44787E-02        -1.97622E-02         4.06838E-01         1.75736E+00         4.07318E-01         1.86667E+02         1.00365E+00         1.62460E+01         1.83562E+02         9.50062E+01         8.85554E+01
+          6.47697E-03         2.46485E-02        -2.00244E-02         4.06836E-01         1.76804E+00         4.07329E-01         1.84048E+02         1.00364E+00         1.60599E+01         1.80865E+02         9.36351E+01         8.72294E+01
+          6.47697E-03         2.48183E-02        -2.02884E-02         4.06835E-01         1.77871E+00         4.07340E-01         1.81378E+02         1.00364E+00         1.58686E+01         1.78127E+02         9.22267E+01         8.59007E+01
+          6.47697E-03         2.49882E-02        -2.05542E-02         4.06833E-01         1.78938E+00         4.07352E-01         1.78665E+02         1.00364E+00         1.56725E+01         1.75358E+02         9.07863E+01         8.45715E+01
+          6.47697E-03         2.51580E-02        -2.08218E-02         4.06831E-01         1.80005E+00         4.07364E-01         1.75916E+02         1.00364E+00         1.54717E+01         1.72563E+02         8.93190E+01         8.32439E+01
+          6.47697E-03         2.53278E-02        -2.10912E-02         4.06829E-01         1.81072E+00         4.07376E-01         1.73139E+02         1.00364E+00         1.52665E+01         1.69750E+02         8.78300E+01         8.19202E+01
+          6.47697E-03         2.54976E-02        -2.13625E-02         4.06828E-01         1.82139E+00         4.07388E-01         1.70341E+02         1.00364E+00         1.50570E+01         1.66926E+02         8.63239E+01         8.06023E+01
+          6.47697E-03         2.56675E-02        -2.16355E-02         4.06826E-01         1.83206E+00         4.07401E-01         1.67528E+02         1.00364E+00         1.48434E+01         1.64098E+02         8.48054E+01         7.92924E+01
+          6.47697E-03         2.58373E-02        -2.19104E-02         4.06824E-01         1.84273E+00         4.07414E-01         1.64706E+02         1.00364E+00         1.46261E+01         1.61271E+02         8.32790E+01         7.79922E+01
+          6.47697E-03         2.60071E-02        -2.21871E-02         4.06822E-01         1.85340E+00         4.07427E-01         1.61883E+02         1.00363E+00         1.44053E+01         1.58453E+02         8.17490E+01         7.67035E+01
+          6.47697E-03         2.61769E-02        -2.24656E-02         4.06821E-01         1.86407E+00         4.07440E-01         1.59065E+02         1.00363E+00         1.41811E+01         1.55648E+02         8.02193E+01         7.54282E+01
+          6.64680E-03         8.72665E-04        -1.02910E-03         4.17630E-01         2.74155E-01         4.17632E-01         5.03954E+03         1.00268E+00         1.67251E+02         5.02448E+03         4.44986E+03         5.74621E+02
+          6.64680E-03         1.04249E-03        -1.03932E-03         4.17630E-01         2.84826E-01         4.17632E-01         4.95757E+03         1.00268E+00         1.64766E+02         4.94235E+03         4.37440E+03         5.67950E+02
+          6.64680E-03         1.21232E-03        -1.05135E-03         4.17630E-01         2.95496E-01         4.17632E-01         4.87373E+03         1.00268E+00         1.62227E+02         4.85835E+03         4.29725E+03         5.61100E+02
+          6.64680E-03         1.38215E-03        -1.06519E-03         4.17630E-01         3.06167E-01         4.17631E-01         4.78814E+03         1.00268E+00         1.59638E+02         4.77260E+03         4.21852E+03         5.54079E+02
+          6.64680E-03         1.55197E-03        -1.08084E-03         4.17630E-01         3.16838E-01         4.17631E-01         4.70091E+03         1.00268E+00         1.57002E+02         4.68523E+03         4.13833E+03         5.46894E+02
+          6.64680E-03         1.72180E-03        -1.09831E-03         4.17630E-01         3.27508E-01         4.17631E-01         4.61219E+03         1.00268E+00         1.54323E+02         4.59635E+03         4.05680E+03         5.39554E+02
+          6.64680E-03         1.89163E-03        -1.11759E-03         4.17630E-01         3.38179E-01         4.17631E-01         4.52209E+03         1.00268E+00         1.51606E+02         4.50611E+03         3.97404E+03         5.32067E+02
+          6.64680E-03         2.06146E-03        -1.13868E-03         4.17630E-01         3.48849E-01         4.17631E-01         4.43074E+03         1.00268E+00         1.48855E+02         4.41463E+03         3.89019E+03         5.24442E+02
+          6.64680E-03         2.23128E-03        -1.16158E-03         4.17629E-01         3.59520E-01         4.17631E-01         4.33827E+03         1.00268E+00         1.46072E+02         4.32203E+03         3.80534E+03         5.16687E+02
+          6.64680E-03         2.40111E-03        -1.18629E-03         4.17629E-01         3.70190E-01         4.17631E-01         4.24481E+03         1.00268E+00         1.43264E+02         4.22845E+03         3.71964E+03         5.08812E+02
+          6.64680E-03         2.57094E-03        -1.21282E-03         4.17629E-01         3.80861E-01         4.17631E-01         4.15049E+03         1.00268E+00         1.40432E+02         4.13401E+03         3.63319E+03         5.00825E+02
+          6.64680E-03         2.74077E-03        -1.24116E-03         4.17629E-01         3.91532E-01         4.17631E-01         4.05543E+03         1.00268E+00         1.37583E+02         4.03885E+03         3.54612E+03         4.92735E+02
+          6.64680E-03         2.91059E-03        -1.27131E-03         4.17629E-01         4.02202E-01         4.17631E-01         3.95976E+03         1.00268E+00         1.34718E+02         3.94309E+03         3.45854E+03         4.84553E+02
+          6.64680E-03         3.08042E-03        -1.30327E-03         4.17629E-01         4.12873E-01         4.17631E-01         3.86360E+03         1.00268E+00         1.31843E+02         3.84686E+03         3.37057E+03         4.76286E+02
+          6.64680E-03         3.25025E-03        -1.33705E-03         4.17628E-01         4.23543E-01         4.17630E-01         3.76709E+03         1.00268E+00         1.28960E+02         3.75028E+03         3.28233E+03         4.67944E+02
+          6.64680E-03         3.42008E-03        -1.37264E-03         4.17628E-01         4.34214E-01         4.17630E-01         3.67035E+03         1.00268E+00         1.26075E+02         3.65348E+03         3.19394E+03         4.59537E+02
+          6.64680E-03         3.58990E-03        -1.41004E-03         4.17628E-01         4.44884E-01         4.17630E-01         3.57349E+03         1.00268E+00         1.23189E+02         3.55657E+03         3.10550E+03         4.51074E+02
+          6.64680E-03         3.75973E-03        -1.44925E-03         4.17628E-01         4.55555E-01         4.17630E-01         3.47664E+03         1.00268E+00         1.20308E+02         3.45969E+03         3.01713E+03         4.42565E+02
+          6.64680E-03         3.92956E-03        -1.49027E-03         4.17627E-01         4.66225E-01         4.17630E-01         3.37992E+03         1.00268E+00         1.17434E+02         3.36295E+03         2.92894E+03         4.34018E+02
+          6.64680E-03         4.09939E-03        -1.53311E-03         4.17627E-01         4.76896E-01         4.17630E-01         3.28344E+03         1.00268E+00         1.14571E+02         3.26647E+03         2.84103E+03         4.25443E+02
+          6.64680E-03         4.26921E-03        -1.57776E-03         4.17627E-01         4.87567E-01         4.17630E-01         3.18732E+03         1.00268E+00         1.11723E+02         3.17036E+03         2.75351E+03         4.16850E+02
+          6.64680E-03         4.43904E-03        -1.62422E-03         4.17626E-01         4.98237E-01         4.17630E-01         3.09166E+03         1.00268E+00         1.08892E+02         3.07472E+03         2.66648E+03         4.08248E+02
+          6.64680E-03         4.60887E-03        -1.67249E-03         4.17626E-01         5.08908E-01         4.17629E-01         2.99657E+03         1.00268E+00         1.06081E+02         2.97968E+03         2.58003E+03         3.99646E+02
+          6.64680E-03         4.77869E-03        -1.72257E-03         4.17626E-01         5.19578E-01         4.17629E-01         2.90217E+03         1.00268E+00         1.03295E+02         2.88533E+03         2.49428E+03         3.91054E+02
+          6.64680E-03         4.94852E-03        -1.77447E-03         4.17625E-01         5.30249E-01         4.17629E-01         2.80855E+03         1.00268E+00         1.00534E+02         2.79178E+03         2.40930E+03         3.82481E+02
+          6.64680E-03         5.11835E-03        -1.82818E-03         4.17625E-01         5.40919E-01         4.17629E-01         2.71580E+03         1.00268E+00         9.78033E+01         2.69913E+03         2.32519E+03         3.73934E+02
+          6.64680E-03         5.28818E-03        -1.88370E-03         4.17625E-01         5.51590E-01         4.17629E-01         2.62403E+03         1.00268E+00         9.51041E+01         2.60746E+03         2.24203E+03         3.65425E+02
+          6.64680E-03         5.45800E-03        -1.94104E-03         4.17624E-01         5.62261E-01         4.17629E-01         2.53332E+03         1.00268E+00         9.24392E+01         2.51687E+03         2.15991E+03         3.56961E+02
+          6.64680E-03         5.62783E-03        -2.00018E-03         4.17624E-01         5.72931E-01         4.17629E-01         2.44377E+03         1.00268E+00         8.98111E+01         2.42746E+03         2.07891E+03         3.48551E+02
+          6.64680E-03         5.79766E-03        -2.06114E-03         4.17624E-01         5.83602E-01         4.17629E-01         2.35545E+03         1.00268E+00         8.72220E+01         2.33929E+03         1.99909E+03         3.40203E+02
+          6.64680E-03         5.96749E-03        -2.12391E-03         4.17623E-01         5.94272E-01         4.17628E-01         2.26845E+03         1.00268E+00         8.46738E+01         2.25246E+03         1.92053E+03         3.31926E+02
+          6.64680E-03         6.13731E-03        -2.18849E-03         4.17623E-01         6.04943E-01         4.17628E-01         2.18284E+03         1.00268E+00         8.21686E+01         2.16703E+03         1.84330E+03         3.23727E+02
+          6.64680E-03         6.30714E-03        -2.25489E-03         4.17622E-01         6.15613E-01         4.17628E-01         2.09868E+03         1.00268E+00         7.97081E+01         2.08308E+03         1.76747E+03         3.15615E+02
+          6.64680E-03         6.47697E-03        -2.32309E-03         4.17622E-01         6.26284E-01         4.17628E-01         2.01606E+03         1.00268E+00         7.72939E+01         2.00068E+03         1.69308E+03         3.07598E+02
+          6.64680E-03         6.64680E-03        -2.39311E-03         4.17621E-01         6.36955E-01         4.17628E-01         1.93503E+03         1.00268E+00         7.49276E+01         1.91988E+03         1.62020E+03         2.99682E+02
+          6.64680E-03         6.81662E-03        -2.46494E-03         4.17621E-01         6.47625E-01         4.17628E-01         1.85565E+03         1.00268E+00         7.26104E+01         1.84075E+03         1.54887E+03         2.91875E+02
+          6.64680E-03         6.98645E-03        -2.53859E-03         4.17620E-01         6.58296E-01         4.17628E-01         1.77797E+03         1.00268E+00         7.03436E+01         1.76333E+03         1.47915E+03         2.84184E+02
+          6.64680E-03         7.15628E-03        -2.61404E-03         4.17620E-01         6.68966E-01         4.17628E-01         1.70205E+03         1.00268E+00         6.81282E+01         1.68769E+03         1.41107E+03         2.76616E+02
+          6.64680E-03         7.32611E-03        -2.69131E-03         4.17619E-01         6.79637E-01         4.17628E-01         1.62792E+03         1.00268E+00         6.59651E+01         1.61386E+03         1.34468E+03         2.69176E+02
+          6.64680E-03         7.49593E-03        -2.77039E-03         4.17619E-01         6.90307E-01         4.17628E-01         1.55563E+03         1.00268E+00         6.38551E+01         1.54187E+03         1.28000E+03         2.61871E+02
+          6.64680E-03         7.66576E-03        -2.85128E-03         4.17618E-01         7.00978E-01         4.17628E-01         1.48522E+03         1.00268E+00         6.17987E+01         1.47178E+03         1.21708E+03         2.54707E+02
+          6.64680E-03         7.83559E-03        -2.93399E-03         4.17618E-01         7.11649E-01         4.17628E-01         1.41672E+03         1.00268E+00         5.97964E+01         1.40361E+03         1.15592E+03         2.47689E+02
+          6.64680E-03         8.00542E-03        -3.01850E-03         4.17617E-01         7.22319E-01         4.17628E-01         1.35015E+03         1.00268E+00         5.78486E+01         1.33739E+03         1.09657E+03         2.40822E+02
+          6.64680E-03         8.17524E-03        -3.10483E-03         4.17617E-01         7.32990E-01         4.17628E-01         1.28554E+03         1.00268E+00         5.59555E+01         1.27314E+03         1.03903E+03         2.34110E+02
+          6.64680E-03         8.34507E-03        -3.19298E-03         4.17616E-01         7.43660E-01         4.17628E-01         1.22290E+03         1.00268E+00         5.41172E+01         1.21087E+03         9.83312E+02         2.27560E+02
+          6.64680E-03         8.51490E-03        -3.28293E-03         4.17615E-01         7.54331E-01         4.17628E-01         1.16226E+03         1.00268E+00         5.23335E+01         1.15061E+03         9.29438E+02         2.21174E+02
+          6.64680E-03         8.68473E-03        -3.37470E-03         4.17615E-01         7.65001E-01         4.17628E-01         1.10363E+03         1.00268E+00         5.06044E+01         1.09237E+03         8.77409E+02         2.14956E+02
+          6.64680E-03         8.85455E-03        -3.46827E-03         4.17614E-01         7.75672E-01         4.17629E-01         1.04700E+03         1.00268E+00         4.89295E+01         1.03614E+03         8.27229E+02         2.08909E+02
+          6.64680E-03         9.02438E-03        -3.56367E-03         4.17614E-01         7.86343E-01         4.17629E-01         9.92395E+02         1.00268E+00         4.73086E+01         9.81933E+02         7.78896E+02         2.03038E+02
+          6.64680E-03         9.19421E-03        -3.66087E-03         4.17613E-01         7.97013E-01         4.17629E-01         9.39798E+02         1.00268E+00         4.57410E+01         9.29749E+02         7.32406E+02         1.97343E+02
+          6.64680E-03         9.36403E-03        -3.75988E-03         4.17612E-01         8.07684E-01         4.17629E-01         8.89209E+02         1.00268E+00         4.42263E+01         8.79580E+02         6.87752E+02         1.91828E+02
+          6.64680E-03         9.53386E-03        -3.86071E-03         4.17612E-01         8.18354E-01         4.17629E-01         8.40621E+02         1.00268E+00         4.27637E+01         8.31418E+02         6.44923E+02         1.86495E+02
+          6.64680E-03         9.70369E-03        -3.96335E-03         4.17611E-01         8.29025E-01         4.17630E-01         7.94022E+02         1.00268E+00         4.13526E+01         7.85249E+02         6.03905E+02         1.81344E+02
+          6.64680E-03         9.87352E-03        -4.06781E-03         4.17610E-01         8.39695E-01         4.17630E-01         7.49397E+02         1.00268E+00         3.99922E+01         7.41058E+02         5.64680E+02         1.76378E+02
+          6.64680E-03         1.00433E-02        -4.17407E-03         4.17609E-01         8.50366E-01         4.17630E-01         7.06728E+02         1.00268E+00         3.86816E+01         6.98826E+02         5.27229E+02         1.71597E+02
+          6.64680E-03         1.02132E-02        -4.28215E-03         4.17609E-01         8.61037E-01         4.17631E-01         6.65993E+02         1.00268E+00         3.74198E+01         6.58531E+02         4.91530E+02         1.67001E+02
+          6.64680E-03         1.03830E-02        -4.39204E-03         4.17608E-01         8.71707E-01         4.17631E-01         6.27168E+02         1.00268E+00         3.62061E+01         6.20147E+02         4.57556E+02         1.62590E+02
+          6.64680E-03         1.05528E-02        -4.50374E-03         4.17607E-01         8.82378E-01         4.17632E-01         5.90226E+02         1.00268E+00         3.50393E+01         5.83646E+02         4.25281E+02         1.58365E+02
+          6.64680E-03         1.07227E-02        -4.61725E-03         4.17607E-01         8.93048E-01         4.17632E-01         5.55137E+02         1.00268E+00         3.39184E+01         5.48998E+02         3.94674E+02         1.54324E+02
+          6.64680E-03         1.08925E-02        -4.73258E-03         4.17606E-01         9.03719E-01         4.17633E-01         5.21868E+02         1.00268E+00         3.28425E+01         5.16170E+02         3.65703E+02         1.50467E+02
+          6.64680E-03         1.10623E-02        -4.84972E-03         4.17605E-01         9.14389E-01         4.17633E-01         4.90386E+02         1.00268E+00         3.18105E+01         4.85125E+02         3.38334E+02         1.46791E+02
+          6.64680E-03         1.12321E-02        -4.96867E-03         4.17604E-01         9.25060E-01         4.17634E-01         4.60652E+02         1.00268E+00         3.08213E+01         4.55827E+02         3.12531E+02         1.43296E+02
+          6.64680E-03         1.14020E-02        -5.08944E-03         4.17603E-01         9.35731E-01         4.17634E-01         4.32629E+02         1.00268E+00         2.98740E+01         4.28235E+02         2.88255E+02         1.39980E+02
+          6.64680E-03         1.15718E-02        -5.21201E-03         4.17603E-01         9.46401E-01         4.17635E-01         4.06275E+02         1.00268E+00         2.89674E+01         4.02308E+02         2.65468E+02         1.36839E+02
+          6.64680E-03         1.17416E-02        -5.33640E-03         4.17602E-01         9.57072E-01         4.17636E-01         3.81547E+02         1.00268E+00         2.81006E+01         3.78001E+02         2.44129E+02         1.33872E+02
+          6.64680E-03         1.19114E-02        -5.46261E-03         4.17601E-01         9.67742E-01         4.17637E-01         3.58402E+02         1.00268E+00         2.72726E+01         3.55270E+02         2.24195E+02         1.31075E+02
+          6.64680E-03         1.20813E-02        -5.59062E-03         4.17600E-01         9.78413E-01         4.17637E-01         3.36793E+02         1.00268E+00         2.64825E+01         3.34069E+02         2.05623E+02         1.28446E+02
+          6.64680E-03         1.22511E-02        -5.72045E-03         4.17599E-01         9.89083E-01         4.17638E-01         3.16674E+02         1.00268E+00         2.57292E+01         3.14350E+02         1.88370E+02         1.25980E+02
+          6.64680E-03         1.24209E-02        -5.85209E-03         4.17598E-01         9.99754E-01         4.17639E-01         2.97996E+02         1.00268E+00         2.50119E+01         2.96063E+02         1.72389E+02         1.23674E+02
+          6.64680E-03         1.25908E-02        -5.98554E-03         4.17597E-01         1.01042E+00         4.17640E-01         2.80711E+02         1.00268E+00         2.43296E+01         2.79160E+02         1.57636E+02         1.21524E+02
+          6.64680E-03         1.27606E-02        -6.12080E-03         4.17597E-01         1.02110E+00         4.17641E-01         2.64769E+02         1.00268E+00         2.36816E+01         2.63589E+02         1.44064E+02         1.19525E+02
+          6.64680E-03         1.29304E-02        -6.25788E-03         4.17596E-01         1.03177E+00         4.17643E-01         2.50118E+02         1.00268E+00         2.30670E+01         2.49300E+02         1.31626E+02         1.17674E+02
+          6.64680E-03         1.31002E-02        -6.39677E-03         4.17595E-01         1.04244E+00         4.17644E-01         2.36709E+02         1.00268E+00         2.24850E+01         2.36240E+02         1.20275E+02         1.15965E+02
+          6.64680E-03         1.32701E-02        -6.53747E-03         4.17594E-01         1.05311E+00         4.17645E-01         2.24489E+02         1.00268E+00         2.19347E+01         2.24358E+02         1.09965E+02         1.14393E+02
+          6.64680E-03         1.34399E-02        -6.67999E-03         4.17593E-01         1.06378E+00         4.17646E-01         2.13406E+02         1.00268E+00         2.14156E+01         2.13601E+02         1.00648E+02         1.12954E+02
+          6.64680E-03         1.36097E-02        -6.82431E-03         4.17592E-01         1.07445E+00         4.17648E-01         2.03410E+02         1.00268E+00         2.09266E+01         2.03918E+02         9.22761E+01         1.11642E+02
+          6.64680E-03         1.37795E-02        -6.97045E-03         4.17591E-01         1.08512E+00         4.17649E-01         1.94449E+02         1.00268E+00         2.04673E+01         1.95255E+02         8.48036E+01         1.10451E+02
+          6.64680E-03         1.39494E-02        -7.11841E-03         4.17590E-01         1.09579E+00         4.17651E-01         1.86470E+02         1.00268E+00         2.00367E+01         1.87561E+02         7.81836E+01         1.09378E+02
+          6.64680E-03         1.41192E-02        -7.26817E-03         4.17589E-01         1.10646E+00         4.17652E-01         1.79422E+02         1.00268E+00         1.96341E+01         1.80784E+02         7.23699E+01         1.08414E+02
+          6.64680E-03         1.42890E-02        -7.41975E-03         4.17588E-01         1.11713E+00         4.17654E-01         1.73255E+02         1.00268E+00         1.92588E+01         1.74873E+02         6.73170E+01         1.07556E+02
+          6.64680E-03         1.44589E-02        -7.57314E-03         4.17587E-01         1.12780E+00         4.17656E-01         1.67918E+02         1.00268E+00         1.89100E+01         1.69778E+02         6.29799E+01         1.06798E+02
+          6.64680E-03         1.46287E-02        -7.72834E-03         4.17586E-01         1.13847E+00         4.17657E-01         1.63361E+02         1.00268E+00         1.85869E+01         1.65447E+02         5.93142E+01         1.06132E+02
+          6.64680E-03         1.47985E-02        -7.88536E-03         4.17585E-01         1.14914E+00         4.17659E-01         1.59535E+02         1.00268E+00         1.82886E+01         1.61831E+02         5.62766E+01         1.05555E+02
+          6.64680E-03         1.49683E-02        -8.04419E-03         4.17584E-01         1.15981E+00         4.17661E-01         1.56392E+02         1.00268E+00         1.80143E+01         1.58883E+02         5.38244E+01         1.05059E+02
+          6.64680E-03         1.51382E-02        -8.20483E-03         4.17583E-01         1.17048E+00         4.17663E-01         1.53884E+02         1.00268E+00         1.77630E+01         1.56555E+02         5.19160E+01         1.04639E+02
+          6.64680E-03         1.53080E-02        -8.36728E-03         4.17582E-01         1.18115E+00         4.17665E-01         1.51965E+02         1.00268E+00         1.75340E+01         1.54800E+02         5.05108E+01         1.04289E+02
+          6.64680E-03         1.54778E-02        -8.53155E-03         4.17581E-01         1.19182E+00         4.17668E-01         1.50591E+02         1.00268E+00         1.73261E+01         1.53572E+02         4.95693E+01         1.04003E+02
+          6.64680E-03         1.56476E-02        -8.69763E-03         4.17579E-01         1.20249E+00         4.17670E-01         1.49715E+02         1.00268E+00         1.71384E+01         1.52828E+02         4.90530E+01         1.03775E+02
+          6.64680E-03         1.58175E-02        -8.86552E-03         4.17578E-01         1.21317E+00         4.17672E-01         1.49296E+02         1.00268E+00         1.69699E+01         1.52525E+02         4.89248E+01         1.03600E+02
+          6.64680E-03         1.59873E-02        -9.03523E-03         4.17577E-01         1.22384E+00         4.17675E-01         1.49292E+02         1.00268E+00         1.68195E+01         1.52621E+02         4.91486E+01         1.03472E+02
+          6.64680E-03         1.61571E-02        -9.20675E-03         4.17576E-01         1.23451E+00         4.17678E-01         1.49662E+02         1.00268E+00         1.66861E+01         1.53075E+02         4.96899E+01         1.03385E+02
+          6.64680E-03         1.63270E-02        -9.38008E-03         4.17575E-01         1.24518E+00         4.17680E-01         1.50368E+02         1.00268E+00         1.65687E+01         1.53850E+02         5.05152E+01         1.03334E+02
+          6.64680E-03         1.64968E-02        -9.55522E-03         4.17574E-01         1.25585E+00         4.17683E-01         1.51372E+02         1.00268E+00         1.64660E+01         1.54906E+02         5.15925E+01         1.03314E+02
+          6.64680E-03         1.66666E-02        -9.73218E-03         4.17573E-01         1.26652E+00         4.17686E-01         1.52637E+02         1.00268E+00         1.63770E+01         1.56210E+02         5.28910E+01         1.03319E+02
+          6.64680E-03         1.68364E-02        -9.91095E-03         4.17571E-01         1.27719E+00         4.17689E-01         1.54129E+02         1.00268E+00         1.63006E+01         1.57725E+02         5.43816E+01         1.03344E+02
+          6.64680E-03         1.70063E-02        -1.00915E-02         4.17570E-01         1.28786E+00         4.17692E-01         1.55814E+02         1.00268E+00         1.62356E+01         1.59420E+02         5.60362E+01         1.03384E+02
+          6.64680E-03         1.71761E-02        -1.02739E-02         4.17569E-01         1.29853E+00         4.17695E-01         1.57662E+02         1.00268E+00         1.61809E+01         1.61263E+02         5.78285E+01         1.03434E+02
+          6.64680E-03         1.73459E-02        -1.04581E-02         4.17568E-01         1.30920E+00         4.17699E-01         1.59642E+02         1.00268E+00         1.61354E+01         1.63223E+02         5.97331E+01         1.03490E+02
+          6.64680E-03         1.75158E-02        -1.06442E-02         4.17566E-01         1.31987E+00         4.17702E-01         1.61725E+02         1.00268E+00         1.60981E+01         1.65275E+02         6.17266E+01         1.03548E+02
+          6.64680E-03         1.76856E-02        -1.08320E-02         4.17565E-01         1.33054E+00         4.17706E-01         1.63884E+02         1.00268E+00         1.60680E+01         1.67389E+02         6.37865E+01         1.03603E+02
+          6.64680E-03         1.78554E-02        -1.10216E-02         4.17564E-01         1.34121E+00         4.17709E-01         1.66095E+02         1.00268E+00         1.60439E+01         1.69543E+02         6.58920E+01         1.03651E+02
+          6.64680E-03         1.80252E-02        -1.12131E-02         4.17563E-01         1.35188E+00         4.17713E-01         1.68333E+02         1.00267E+00         1.60250E+01         1.71711E+02         6.80235E+01         1.03688E+02
+          6.64680E-03         1.81951E-02        -1.14064E-02         4.17561E-01         1.36255E+00         4.17717E-01         1.70575E+02         1.00267E+00         1.60103E+01         1.73874E+02         7.01629E+01         1.03711E+02
+          6.64680E-03         1.83649E-02        -1.16015E-02         4.17560E-01         1.37322E+00         4.17721E-01         1.72802E+02         1.00267E+00         1.59990E+01         1.76009E+02         7.22932E+01         1.03716E+02
+          6.64680E-03         1.85347E-02        -1.17984E-02         4.17559E-01         1.38389E+00         4.17725E-01         1.74994E+02         1.00267E+00         1.59901E+01         1.78099E+02         7.43990E+01         1.03700E+02
+          6.64680E-03         1.87045E-02        -1.19971E-02         4.17557E-01         1.39457E+00         4.17730E-01         1.77132E+02         1.00267E+00         1.59829E+01         1.80126E+02         7.64661E+01         1.03660E+02
+          6.64680E-03         1.88744E-02        -1.21976E-02         4.17556E-01         1.40524E+00         4.17734E-01         1.79201E+02         1.00267E+00         1.59767E+01         1.82076E+02         7.84813E+01         1.03594E+02
+          6.64680E-03         1.90442E-02        -1.23999E-02         4.17555E-01         1.41591E+00         4.17739E-01         1.81186E+02         1.00267E+00         1.59706E+01         1.83932E+02         8.04331E+01         1.03499E+02
+          6.64680E-03         1.92140E-02        -1.26041E-02         4.17553E-01         1.42658E+00         4.17744E-01         1.83074E+02         1.00267E+00         1.59642E+01         1.85683E+02         8.23107E+01         1.03373E+02
+          6.64680E-03         1.93839E-02        -1.28100E-02         4.17552E-01         1.43725E+00         4.17749E-01         1.84851E+02         1.00267E+00         1.59567E+01         1.87318E+02         8.41049E+01         1.03213E+02
+          6.64680E-03         1.95537E-02        -1.30178E-02         4.17551E-01         1.44792E+00         4.17754E-01         1.86508E+02         1.00267E+00         1.59476E+01         1.88825E+02         8.58071E+01         1.03018E+02
+          6.64680E-03         1.97235E-02        -1.32274E-02         4.17549E-01         1.45859E+00         4.17759E-01         1.88035E+02         1.00267E+00         1.59365E+01         1.90197E+02         8.74103E+01         1.02786E+02
+          6.64680E-03         1.98933E-02        -1.34388E-02         4.17548E-01         1.46926E+00         4.17764E-01         1.89424E+02         1.00267E+00         1.59227E+01         1.91425E+02         8.89082E+01         1.02517E+02
+          6.64680E-03         2.00632E-02        -1.36520E-02         4.17546E-01         1.47993E+00         4.17770E-01         1.90667E+02         1.00267E+00         1.59059E+01         1.92504E+02         9.02956E+01         1.02208E+02
+          6.64680E-03         2.02330E-02        -1.38671E-02         4.17545E-01         1.49060E+00         4.17775E-01         1.91760E+02         1.00267E+00         1.58857E+01         1.93427E+02         9.15681E+01         1.01859E+02
+          6.64680E-03         2.04028E-02        -1.40839E-02         4.17544E-01         1.50127E+00         4.17781E-01         1.92696E+02         1.00267E+00         1.58618E+01         1.94192E+02         9.27225E+01         1.01470E+02
+          6.64680E-03         2.05726E-02        -1.43026E-02         4.17542E-01         1.51194E+00         4.17787E-01         1.93474E+02         1.00267E+00         1.58338E+01         1.94795E+02         9.37560E+01         1.01039E+02
+          6.64680E-03         2.07425E-02        -1.45230E-02         4.17541E-01         1.52261E+00         4.17793E-01         1.94089E+02         1.00267E+00         1.58015E+01         1.95234E+02         9.46671E+01         1.00567E+02
+          6.64680E-03         2.09123E-02        -1.47453E-02         4.17539E-01         1.53328E+00         4.17799E-01         1.94540E+02         1.00267E+00         1.57645E+01         1.95508E+02         9.54546E+01         1.00054E+02
+          6.64680E-03         2.10821E-02        -1.49694E-02         4.17538E-01         1.54395E+00         4.17806E-01         1.94827E+02         1.00267E+00         1.57228E+01         1.95617E+02         9.61184E+01         9.94991E+01
+          6.64680E-03         2.12520E-02        -1.51953E-02         4.17536E-01         1.55462E+00         4.17813E-01         1.94949E+02         1.00267E+00         1.56762E+01         1.95562E+02         9.66587E+01         9.89033E+01
+          6.64680E-03         2.14218E-02        -1.54230E-02         4.17535E-01         1.56529E+00         4.17819E-01         1.94907E+02         1.00267E+00         1.56244E+01         1.95344E+02         9.70766E+01         9.82669E+01
+          6.64680E-03         2.15916E-02        -1.56526E-02         4.17533E-01         1.57596E+00         4.17826E-01         1.94704E+02         1.00267E+00         1.55674E+01         1.94964E+02         9.73736E+01         9.75907E+01
+          6.64680E-03         2.17614E-02        -1.58839E-02         4.17532E-01         1.58664E+00         4.17834E-01         1.94341E+02         1.00266E+00         1.55051E+01         1.94427E+02         9.75519E+01         9.68755E+01
+          6.64680E-03         2.19313E-02        -1.61171E-02         4.17530E-01         1.59731E+00         4.17841E-01         1.93821E+02         1.00266E+00         1.54373E+01         1.93736E+02         9.76139E+01         9.61222E+01
+          6.64680E-03         2.21011E-02        -1.63521E-02         4.17529E-01         1.60798E+00         4.17849E-01         1.93148E+02         1.00266E+00         1.53641E+01         1.92895E+02         9.75626E+01         9.53320E+01
+          6.64680E-03         2.22709E-02        -1.65889E-02         4.17527E-01         1.61865E+00         4.17856E-01         1.92326E+02         1.00266E+00         1.52855E+01         1.91908E+02         9.74015E+01         9.45061E+01
+          6.64680E-03         2.24407E-02        -1.68275E-02         4.17525E-01         1.62932E+00         4.17864E-01         1.91360E+02         1.00266E+00         1.52014E+01         1.90780E+02         9.71343E+01         9.36458E+01
+          6.64680E-03         2.26106E-02        -1.70679E-02         4.17524E-01         1.63999E+00         4.17872E-01         1.90254E+02         1.00266E+00         1.51118E+01         1.89518E+02         9.67649E+01         9.27528E+01
+          6.64680E-03         2.27804E-02        -1.73101E-02         4.17522E-01         1.65066E+00         4.17881E-01         1.89015E+02         1.00266E+00         1.50167E+01         1.88126E+02         9.62978E+01         9.18285E+01
+          6.64680E-03         2.29502E-02        -1.75542E-02         4.17521E-01         1.66133E+00         4.17889E-01         1.87647E+02         1.00266E+00         1.49163E+01         1.86612E+02         9.57373E+01         9.08746E+01
+          6.64680E-03         2.31201E-02        -1.78000E-02         4.17519E-01         1.67200E+00         4.17898E-01         1.86158E+02         1.00266E+00         1.48105E+01         1.84981E+02         9.50884E+01         8.98929E+01
+          6.64680E-03         2.32899E-02        -1.80477E-02         4.17517E-01         1.68267E+00         4.17907E-01         1.84553E+02         1.00266E+00         1.46995E+01         1.83241E+02         9.43558E+01         8.88853E+01
+          6.64680E-03         2.34597E-02        -1.82972E-02         4.17516E-01         1.69334E+00         4.17916E-01         1.82839E+02         1.00266E+00         1.45832E+01         1.81398E+02         9.35445E+01         8.78536E+01
+          6.64680E-03         2.36295E-02        -1.85485E-02         4.17514E-01         1.70401E+00         4.17926E-01         1.81023E+02         1.00266E+00         1.44619E+01         1.79460E+02         9.26597E+01         8.67999E+01
+          6.64680E-03         2.37994E-02        -1.88016E-02         4.17512E-01         1.71468E+00         4.17935E-01         1.79112E+02         1.00266E+00         1.43356E+01         1.77433E+02         9.17065E+01         8.57260E+01
+          6.64680E-03         2.39692E-02        -1.90565E-02         4.17511E-01         1.72535E+00         4.17945E-01         1.77113E+02         1.00266E+00         1.42044E+01         1.75324E+02         9.06902E+01         8.46340E+01
+          6.64680E-03         2.41390E-02        -1.93133E-02         4.17509E-01         1.73602E+00         4.17955E-01         1.75032E+02         1.00265E+00         1.40685E+01         1.73142E+02         8.96159E+01         8.35260E+01
+          6.64680E-03         2.43088E-02        -1.95718E-02         4.17507E-01         1.74669E+00         4.17966E-01         1.72877E+02         1.00265E+00         1.39280E+01         1.70893E+02         8.84888E+01         8.24041E+01
+          6.64680E-03         2.44787E-02        -1.98322E-02         4.17505E-01         1.75736E+00         4.17976E-01         1.70655E+02         1.00265E+00         1.37830E+01         1.68584E+02         8.73140E+01         8.12702E+01
+          6.64680E-03         2.46485E-02        -2.00944E-02         4.17504E-01         1.76804E+00         4.17987E-01         1.68373E+02         1.00265E+00         1.36337E+01         1.66223E+02         8.60967E+01         8.01266E+01
+          6.64680E-03         2.48183E-02        -2.03584E-02         4.17502E-01         1.77871E+00         4.17998E-01         1.66038E+02         1.00265E+00         1.34802E+01         1.63817E+02         8.48419E+01         7.89751E+01
+          6.64680E-03         2.49882E-02        -2.06242E-02         4.17500E-01         1.78938E+00         4.18009E-01         1.63657E+02         1.00265E+00         1.33227E+01         1.61372E+02         8.35543E+01         7.78180E+01
+          6.64680E-03         2.51580E-02        -2.08918E-02         4.17498E-01         1.80005E+00         4.18021E-01         1.61236E+02         1.00265E+00         1.31613E+01         1.58896E+02         8.22389E+01         7.66571E+01
+          6.64680E-03         2.53278E-02        -2.11612E-02         4.17497E-01         1.81072E+00         4.18033E-01         1.58783E+02         1.00265E+00         1.29962E+01         1.56395E+02         8.09002E+01         7.54944E+01
+          6.64680E-03         2.54976E-02        -2.14325E-02         4.17495E-01         1.82139E+00         4.18045E-01         1.56303E+02         1.00265E+00         1.28276E+01         1.53875E+02         7.95428E+01         7.43320E+01
+          6.64680E-03         2.56675E-02        -2.17055E-02         4.17493E-01         1.83206E+00         4.18057E-01         1.53803E+02         1.00265E+00         1.26557E+01         1.51343E+02         7.81710E+01         7.31716E+01
+          6.64680E-03         2.58373E-02        -2.19804E-02         4.17491E-01         1.84273E+00         4.18069E-01         1.51289E+02         1.00264E+00         1.24806E+01         1.48804E+02         7.67888E+01         7.20151E+01
+          6.64680E-03         2.60071E-02        -2.22571E-02         4.17489E-01         1.85340E+00         4.18082E-01         1.48767E+02         1.00264E+00         1.23024E+01         1.46265E+02         7.54005E+01         7.08643E+01
+          6.64680E-03         2.61769E-02        -2.25356E-02         4.17487E-01         1.86407E+00         4.18095E-01         1.46242E+02         1.00264E+00         1.21215E+01         1.43730E+02         7.40096E+01         6.97208E+01
+          6.81662E-03         8.72665E-04        -1.10093E-03         4.28301E-01         2.74155E-01         4.28302E-01         4.52840E+03         1.00189E+00         1.33610E+02         4.52037E+03         4.02860E+03         4.91762E+02
+          6.81662E-03         1.04249E-03        -1.11115E-03         4.28301E-01         2.84826E-01         4.28302E-01         4.45609E+03         1.00189E+00         1.31644E+02         4.44789E+03         3.96120E+03         4.86687E+02
+          6.81662E-03         1.21232E-03        -1.12318E-03         4.28301E-01         2.95496E-01         4.28302E-01         4.38211E+03         1.00189E+00         1.29636E+02         4.37374E+03         3.89227E+03         4.81466E+02
+          6.81662E-03         1.38215E-03        -1.13702E-03         4.28301E-01         3.06167E-01         4.28302E-01         4.30656E+03         1.00189E+00         1.27588E+02         4.29801E+03         3.82191E+03         4.76104E+02
+          6.81662E-03         1.55197E-03        -1.15267E-03         4.28301E-01         3.16838E-01         4.28302E-01         4.22955E+03         1.00189E+00         1.25503E+02         4.22083E+03         3.75023E+03         4.70606E+02
+          6.81662E-03         1.72180E-03        -1.17014E-03         4.28300E-01         3.27508E-01         4.28302E-01         4.15119E+03         1.00189E+00         1.23384E+02         4.14230E+03         3.67733E+03         4.64978E+02
+          6.81662E-03         1.89163E-03        -1.18942E-03         4.28300E-01         3.38179E-01         4.28302E-01         4.07159E+03         1.00189E+00         1.21234E+02         4.06254E+03         3.60331E+03         4.59225E+02
+          6.81662E-03         2.06146E-03        -1.21051E-03         4.28300E-01         3.48849E-01         4.28302E-01         3.99086E+03         1.00189E+00         1.19058E+02         3.98164E+03         3.52829E+03         4.53353E+02
+          6.81662E-03         2.23128E-03        -1.23341E-03         4.28300E-01         3.59520E-01         4.28302E-01         3.90910E+03         1.00189E+00         1.16857E+02         3.89973E+03         3.45236E+03         4.47368E+02
+          6.81662E-03         2.40111E-03        -1.25813E-03         4.28300E-01         3.70190E-01         4.28302E-01         3.82644E+03         1.00189E+00         1.14634E+02         3.81692E+03         3.37564E+03         4.41276E+02
+          6.81662E-03         2.57094E-03        -1.28465E-03         4.28300E-01         3.80861E-01         4.28302E-01         3.74299E+03         1.00189E+00         1.12394E+02         3.73332E+03         3.29823E+03         4.35083E+02
+          6.81662E-03         2.74077E-03        -1.31299E-03         4.28299E-01         3.91532E-01         4.28302E-01         3.65885E+03         1.00189E+00         1.10140E+02         3.64904E+03         3.22024E+03         4.28796E+02
+          6.81662E-03         2.91059E-03        -1.34314E-03         4.28299E-01         4.02202E-01         4.28301E-01         3.57413E+03         1.00189E+00         1.07873E+02         3.56419E+03         3.14177E+03         4.22420E+02
+          6.81662E-03         3.08042E-03        -1.37511E-03         4.28299E-01         4.12873E-01         4.28301E-01         3.48896E+03         1.00189E+00         1.05598E+02         3.47888E+03         3.06292E+03         4.15962E+02
+          6.81662E-03         3.25025E-03        -1.40888E-03         4.28299E-01         4.23543E-01         4.28301E-01         3.40343E+03         1.00189E+00         1.03317E+02         3.39323E+03         2.98381E+03         4.09429E+02
+          6.81662E-03         3.42008E-03        -1.44447E-03         4.28299E-01         4.34214E-01         4.28301E-01         3.31765E+03         1.00189E+00         1.01033E+02         3.30735E+03         2.90452E+03         4.02827E+02
+          6.81662E-03         3.58990E-03        -1.48187E-03         4.28298E-01         4.44884E-01         4.28301E-01         3.23173E+03         1.00189E+00         9.87498E+01         3.22133E+03         2.82516E+03         3.96163E+02
+          6.81662E-03         3.75973E-03        -1.52108E-03         4.28298E-01         4.55555E-01         4.28301E-01         3.14578E+03         1.00189E+00         9.64694E+01         3.13528E+03         2.74584E+03         3.89443E+02
+          6.81662E-03         3.92956E-03        -1.56210E-03         4.28298E-01         4.66225E-01         4.28301E-01         3.05990E+03         1.00189E+00         9.41949E+01         3.04932E+03         2.66665E+03         3.82675E+02
+          6.81662E-03         4.09939E-03        -1.60494E-03         4.28298E-01         4.76896E-01         4.28301E-01         2.97420E+03         1.00189E+00         9.19288E+01         2.96354E+03         2.58767E+03         3.75865E+02
+          6.81662E-03         4.26921E-03        -1.64959E-03         4.28297E-01         4.87567E-01         4.28300E-01         2.88876E+03         1.00189E+00         8.96739E+01         2.87804E+03         2.50902E+03         3.69021E+02
+          6.81662E-03         4.43904E-03        -1.69605E-03         4.28297E-01         4.98237E-01         4.28300E-01         2.80369E+03         1.00189E+00         8.74328E+01         2.79292E+03         2.43077E+03         3.62148E+02
+          6.81662E-03         4.60887E-03        -1.74432E-03         4.28297E-01         5.08908E-01         4.28300E-01         2.71909E+03         1.00189E+00         8.52077E+01         2.70828E+03         2.35302E+03         3.55255E+02
+          6.81662E-03         4.77869E-03        -1.79441E-03         4.28296E-01         5.19578E-01         4.28300E-01         2.63504E+03         1.00189E+00         8.30013E+01         2.62420E+03         2.27585E+03         3.48347E+02
+          6.81662E-03         4.94852E-03        -1.84630E-03         4.28296E-01         5.30249E-01         4.28300E-01         2.55164E+03         1.00189E+00         8.08156E+01         2.54078E+03         2.19935E+03         3.41432E+02
+          6.81662E-03         5.11835E-03        -1.90001E-03         4.28295E-01         5.40919E-01         4.28300E-01         2.46898E+03         1.00189E+00         7.86529E+01         2.45811E+03         2.12359E+03         3.34518E+02
+          6.81662E-03         5.28818E-03        -1.95553E-03         4.28295E-01         5.51590E-01         4.28300E-01         2.38713E+03         1.00189E+00         7.65153E+01         2.37627E+03         2.04866E+03         3.27609E+02
+          6.81662E-03         5.45800E-03        -2.01287E-03         4.28295E-01         5.62261E-01         4.28299E-01         2.30618E+03         1.00189E+00         7.44047E+01         2.29534E+03         1.97462E+03         3.20715E+02
+          6.81662E-03         5.62783E-03        -2.07201E-03         4.28294E-01         5.72931E-01         4.28299E-01         2.22621E+03         1.00189E+00         7.23230E+01         2.21539E+03         1.90155E+03         3.13840E+02
+          6.81662E-03         5.79766E-03        -2.13297E-03         4.28294E-01         5.83602E-01         4.28299E-01         2.14728E+03         1.00189E+00         7.02720E+01         2.13651E+03         1.82952E+03         3.06993E+02
+          6.81662E-03         5.96749E-03        -2.19574E-03         4.28293E-01         5.94272E-01         4.28299E-01         2.06948E+03         1.00189E+00         6.82532E+01         2.05877E+03         1.75859E+03         3.00179E+02
+          6.81662E-03         6.13731E-03        -2.26032E-03         4.28293E-01         6.04943E-01         4.28299E-01         1.99287E+03         1.00189E+00         6.62682E+01         1.98223E+03         1.68882E+03         2.93406E+02
+          6.81662E-03         6.30714E-03        -2.32672E-03         4.28293E-01         6.15613E-01         4.28299E-01         1.91751E+03         1.00189E+00         6.43184E+01         1.90695E+03         1.62027E+03         2.86679E+02
+          6.81662E-03         6.47697E-03        -2.39492E-03         4.28292E-01         6.26284E-01         4.28299E-01         1.84347E+03         1.00189E+00         6.24052E+01         1.83300E+03         1.55299E+03         2.80006E+02
+          6.81662E-03         6.64680E-03        -2.46494E-03         4.28292E-01         6.36955E-01         4.28299E-01         1.77079E+03         1.00189E+00         6.05296E+01         1.76043E+03         1.48704E+03         2.73392E+02
+          6.81662E-03         6.81662E-03        -2.53677E-03         4.28291E-01         6.47625E-01         4.28299E-01         1.69954E+03         1.00189E+00         5.86927E+01         1.68930E+03         1.42245E+03         2.66843E+02
+          6.81662E-03         6.98645E-03        -2.61042E-03         4.28291E-01         6.58296E-01         4.28299E-01         1.62976E+03         1.00189E+00         5.68956E+01         1.61965E+03         1.35928E+03         2.60366E+02
+          6.81662E-03         7.15628E-03        -2.68587E-03         4.28290E-01         6.68966E-01         4.28299E-01         1.56150E+03         1.00189E+00         5.51389E+01         1.55153E+03         1.29757E+03         2.53966E+02
+          6.81662E-03         7.32611E-03        -2.76314E-03         4.28290E-01         6.79637E-01         4.28299E-01         1.49480E+03         1.00189E+00         5.34234E+01         1.48499E+03         1.23734E+03         2.47650E+02
+          6.81662E-03         7.49593E-03        -2.84222E-03         4.28289E-01         6.90307E-01         4.28299E-01         1.42969E+03         1.00189E+00         5.17497E+01         1.42005E+03         1.17863E+03         2.41422E+02
+          6.81662E-03         7.66576E-03        -2.92311E-03         4.28289E-01         7.00978E-01         4.28298E-01         1.36622E+03         1.00189E+00         5.01184E+01         1.35675E+03         1.12147E+03         2.35287E+02
+          6.81662E-03         7.83559E-03        -3.00582E-03         4.28288E-01         7.11649E-01         4.28299E-01         1.30441E+03         1.00189E+00         4.85297E+01         1.29513E+03         1.06588E+03         2.29251E+02
+          6.81662E-03         8.00542E-03        -3.09034E-03         4.28287E-01         7.22319E-01         4.28299E-01         1.24429E+03         1.00189E+00         4.69839E+01         1.23521E+03         1.01189E+03         2.23320E+02
+          6.81662E-03         8.17524E-03        -3.17666E-03         4.28287E-01         7.32990E-01         4.28299E-01         1.18587E+03         1.00189E+00         4.54812E+01         1.17700E+03         9.59508E+02         2.17496E+02
+          6.81662E-03         8.34507E-03        -3.26481E-03         4.28286E-01         7.43660E-01         4.28299E-01         1.12919E+03         1.00189E+00         4.40217E+01         1.12054E+03         9.08757E+02         2.11786E+02
+          6.81662E-03         8.51490E-03        -3.35476E-03         4.28286E-01         7.54331E-01         4.28299E-01         1.07426E+03         1.00189E+00         4.26053E+01         1.06584E+03         8.59643E+02         2.06193E+02
+          6.81662E-03         8.68473E-03        -3.44653E-03         4.28285E-01         7.65001E-01         4.28299E-01         1.02108E+03         1.00189E+00         4.12320E+01         1.01289E+03         8.12174E+02         2.00721E+02
+          6.81662E-03         8.85455E-03        -3.54010E-03         4.28284E-01         7.75672E-01         4.28299E-01         9.69663E+02         1.00189E+00         3.99014E+01         9.61729E+02         7.66355E+02         1.95373E+02
+          6.81662E-03         9.02438E-03        -3.63550E-03         4.28284E-01         7.86343E-01         4.28299E-01         9.20021E+02         1.00189E+00         3.86133E+01         9.12341E+02         7.22187E+02         1.90155E+02
+          6.81662E-03         9.19421E-03        -3.73270E-03         4.28283E-01         7.97013E-01         4.28299E-01         8.72151E+02         1.00189E+00         3.73674E+01         8.64734E+02         6.79667E+02         1.85067E+02
+          6.81662E-03         9.36403E-03        -3.83171E-03         4.28282E-01         8.07684E-01         4.28299E-01         8.26052E+02         1.00189E+00         3.61631E+01         8.18904E+02         6.38790E+02         1.80114E+02
+          6.81662E-03         9.53386E-03        -3.93254E-03         4.28282E-01         8.18354E-01         4.28300E-01         7.81720E+02         1.00189E+00         3.50000E+01         7.74846E+02         5.99548E+02         1.75299E+02
+          6.81662E-03         9.70369E-03        -4.03518E-03         4.28281E-01         8.29025E-01         4.28300E-01         7.39145E+02         1.00189E+00         3.38775E+01         7.32552E+02         5.61930E+02         1.70623E+02
+          6.81662E-03         9.87352E-03        -4.13963E-03         4.28280E-01         8.39695E-01         4.28300E-01         6.98316E+02         1.00189E+00         3.27950E+01         6.92010E+02         5.25922E+02         1.66088E+02
+          6.81662E-03         1.00433E-02        -4.24590E-03         4.28280E-01         8.50366E-01         4.28301E-01         6.59222E+02         1.00189E+00         3.17518E+01         6.53206E+02         4.91509E+02         1.61697E+02
+          6.81662E-03         1.02132E-02        -4.35398E-03         4.28279E-01         8.61037E-01         4.28301E-01         6.21843E+02         1.00189E+00         3.07473E+01         6.16122E+02         4.58671E+02         1.57451E+02
+          6.81662E-03         1.03830E-02        -4.46387E-03         4.28278E-01         8.71707E-01         4.28301E-01         5.86162E+02         1.00189E+00         2.97806E+01         5.80738E+02         4.27387E+02         1.53351E+02
+          6.81662E-03         1.05528E-02        -4.57557E-03         4.28277E-01         8.82378E-01         4.28302E-01         5.52156E+02         1.00189E+00         2.88510E+01         5.47033E+02         3.97634E+02         1.49399E+02
+          6.81662E-03         1.07227E-02        -4.68908E-03         4.28276E-01         8.93048E-01         4.28302E-01         5.19802E+02         1.00189E+00         2.79577E+01         5.14980E+02         3.69386E+02         1.45594E+02
+          6.81662E-03         1.08925E-02        -4.80441E-03         4.28276E-01         9.03719E-01         4.28303E-01         4.89072E+02         1.00189E+00         2.70999E+01         4.84554E+02         3.42617E+02         1.41937E+02
+          6.81662E-03         1.10623E-02        -4.92155E-03         4.28275E-01         9.14389E-01         4.28303E-01         4.59937E+02         1.00189E+00         2.62768E+01         4.55724E+02         3.17295E+02         1.38429E+02
+          6.81662E-03         1.12321E-02        -5.04050E-03         4.28274E-01         9.25060E-01         4.28304E-01         4.32369E+02         1.00189E+00         2.54876E+01         4.28459E+02         2.93391E+02         1.35068E+02
+          6.81662E-03         1.14020E-02        -5.16127E-03         4.28273E-01         9.35731E-01         4.28304E-01         4.06333E+02         1.00189E+00         2.47315E+01         4.02726E+02         2.70871E+02         1.31855E+02
+          6.81662E-03         1.15718E-02        -5.28384E-03         4.28272E-01         9.46401E-01         4.28305E-01         3.81795E+02         1.00189E+00         2.40076E+01         3.78490E+02         2.49701E+02         1.28789E+02
+          6.81662E-03         1.17416E-02        -5.40823E-03         4.28272E-01         9.57072E-01         4.28306E-01         3.58719E+02         1.00189E+00         2.33151E+01         3.55714E+02         2.29846E+02         1.25868E+02
+          6.81662E-03         1.19114E-02        -5.53443E-03         4.28271E-01         9.67742E-01         4.28306E-01         3.37068E+02         1.00189E+00         2.26534E+01         3.34361E+02         2.11269E+02         1.23092E+02
+          6.81662E-03         1.20813E-02        -5.66245E-03         4.28270E-01         9.78413E-01         4.28307E-01         3.16804E+02         1.00189E+00         2.20216E+01         3.14391E+02         1.93932E+02         1.20458E+02
+          6.81662E-03         1.22511E-02        -5.79227E-03         4.28269E-01         9.89083E-01         4.28308E-01         2.97885E+02         1.00189E+00         2.14189E+01         2.95762E+02         1.77797E+02         1.17965E+02
+          6.81662E-03         1.24209E-02        -5.92391E-03         4.28268E-01         9.99754E-01         4.28309E-01         2.80271E+02         1.00189E+00         2.08447E+01         2.78434E+02         1.62823E+02         1.15611E+02
+          6.81662E-03         1.25908E-02        -6.05737E-03         4.28267E-01         1.01042E+00         4.28310E-01         2.63919E+02         1.00189E+00         2.02982E+01         2.62363E+02         1.48970E+02         1.13393E+02
+          6.81662E-03         1.27606E-02        -6.19263E-03         4.28266E-01         1.02110E+00         4.28311E-01         2.48787E+02         1.00189E+00         1.97788E+01         2.47507E+02         1.36198E+02         1.11309E+02
+          6.81662E-03         1.29304E-02        -6.32971E-03         4.28265E-01         1.03177E+00         4.28312E-01         2.34831E+02         1.00189E+00         1.92858E+01         2.33820E+02         1.24465E+02         1.09355E+02
+          6.81662E-03         1.31002E-02        -6.46860E-03         4.28264E-01         1.04244E+00         4.28313E-01         2.22007E+02         1.00189E+00         1.88186E+01         2.21259E+02         1.13729E+02         1.07530E+02
+          6.81662E-03         1.32701E-02        -6.60930E-03         4.28263E-01         1.05311E+00         4.28314E-01         2.10270E+02         1.00189E+00         1.83764E+01         2.09778E+02         1.03949E+02         1.05828E+02
+          6.81662E-03         1.34399E-02        -6.75181E-03         4.28262E-01         1.06378E+00         4.28316E-01         1.99575E+02         1.00189E+00         1.79588E+01         1.99331E+02         9.50827E+01         1.04248E+02
+          6.81662E-03         1.36097E-02        -6.89614E-03         4.28261E-01         1.07445E+00         4.28317E-01         1.89877E+02         1.00189E+00         1.75651E+01         1.89873E+02         8.70879E+01         1.02785E+02
+          6.81662E-03         1.37795E-02        -7.04228E-03         4.28260E-01         1.08512E+00         4.28318E-01         1.81131E+02         1.00189E+00         1.71947E+01         1.81359E+02         7.99229E+01         1.01436E+02
+          6.81662E-03         1.39494E-02        -7.19023E-03         4.28259E-01         1.09579E+00         4.28320E-01         1.73292E+02         1.00189E+00         1.68469E+01         1.73742E+02         7.35459E+01         1.00196E+02
+          6.81662E-03         1.41192E-02        -7.34000E-03         4.28258E-01         1.10646E+00         4.28321E-01         1.66314E+02         1.00189E+00         1.65213E+01         1.66978E+02         6.79157E+01         9.90619E+01
+          6.81662E-03         1.42890E-02        -7.49158E-03         4.28257E-01         1.11713E+00         4.28323E-01         1.60152E+02         1.00189E+00         1.62172E+01         1.61020E+02         6.29914E+01         9.80288E+01
+          6.81662E-03         1.44589E-02        -7.64497E-03         4.28256E-01         1.12780E+00         4.28325E-01         1.54763E+02         1.00189E+00         1.59339E+01         1.55825E+02         5.87324E+01         9.70925E+01
+          6.81662E-03         1.46287E-02        -7.80017E-03         4.28255E-01         1.13847E+00         4.28326E-01         1.50101E+02         1.00189E+00         1.56708E+01         1.51348E+02         5.50990E+01         9.62485E+01
+          6.81662E-03         1.47985E-02        -7.95719E-03         4.28254E-01         1.14914E+00         4.28328E-01         1.46125E+02         1.00189E+00         1.54273E+01         1.47544E+02         5.20519E+01         9.54923E+01
+          6.81662E-03         1.49683E-02        -8.11601E-03         4.28253E-01         1.15981E+00         4.28330E-01         1.42789E+02         1.00189E+00         1.52027E+01         1.44372E+02         4.95527E+01         9.48191E+01
+          6.81662E-03         1.51382E-02        -8.27666E-03         4.28252E-01         1.17048E+00         4.28332E-01         1.40053E+02         1.00189E+00         1.49963E+01         1.41788E+02         4.75637E+01         9.42243E+01
+          6.81662E-03         1.53080E-02        -8.43911E-03         4.28251E-01         1.18115E+00         4.28334E-01         1.37875E+02         1.00189E+00         1.48074E+01         1.39751E+02         4.60480E+01         9.37030E+01
+          6.81662E-03         1.54778E-02        -8.60338E-03         4.28250E-01         1.19182E+00         4.28336E-01         1.36214E+02         1.00188E+00         1.46351E+01         1.38220E+02         4.49698E+01         9.32506E+01
+          6.81662E-03         1.56476E-02        -8.76946E-03         4.28249E-01         1.20249E+00         4.28338E-01         1.35031E+02         1.00188E+00         1.44788E+01         1.37156E+02         4.42941E+01         9.28621E+01
+          6.81662E-03         1.58175E-02        -8.93735E-03         4.28248E-01         1.21317E+00         4.28341E-01         1.34287E+02         1.00188E+00         1.43377E+01         1.36520E+02         4.39870E+01         9.25328E+01
+          6.81662E-03         1.59873E-02        -9.10705E-03         4.28246E-01         1.22384E+00         4.28343E-01         1.33945E+02         1.00188E+00         1.42109E+01         1.36273E+02         4.40157E+01         9.22577E+01
+          6.81662E-03         1.61571E-02        -9.27857E-03         4.28245E-01         1.23451E+00         4.28346E-01         1.33967E+02         1.00188E+00         1.40975E+01         1.36381E+02         4.43486E+01         9.20321E+01
+          6.81662E-03         1.63270E-02        -9.45190E-03         4.28244E-01         1.24518E+00         4.28348E-01         1.34319E+02         1.00188E+00         1.39969E+01         1.36806E+02         4.49549E+01         9.18513E+01
+          6.81662E-03         1.64968E-02        -9.62705E-03         4.28243E-01         1.25585E+00         4.28351E-01         1.34966E+02         1.00188E+00         1.39080E+01         1.37516E+02         4.58052E+01         9.17105E+01
+          6.81662E-03         1.66666E-02        -9.80400E-03         4.28242E-01         1.26652E+00         4.28354E-01         1.35875E+02         1.00188E+00         1.38301E+01         1.38476E+02         4.68715E+01         9.16050E+01
+          6.81662E-03         1.68364E-02        -9.98277E-03         4.28240E-01         1.27719E+00         4.28357E-01         1.37015E+02         1.00188E+00         1.37622E+01         1.39657E+02         4.81265E+01         9.15303E+01
+          6.81662E-03         1.70063E-02        -1.01634E-02         4.28239E-01         1.28786E+00         4.28360E-01         1.38354E+02         1.00188E+00         1.37035E+01         1.41026E+02         4.95447E+01         9.14818E+01
+          6.81662E-03         1.71761E-02        -1.03457E-02         4.28238E-01         1.29853E+00         4.28363E-01         1.39865E+02         1.00188E+00         1.36532E+01         1.42556E+02         5.11013E+01         9.14552E+01
+          6.81662E-03         1.73459E-02        -1.05300E-02         4.28237E-01         1.30920E+00         4.28366E-01         1.41520E+02         1.00188E+00         1.36104E+01         1.44219E+02         5.27732E+01         9.14461E+01
+          6.81662E-03         1.75158E-02        -1.07160E-02         4.28235E-01         1.31987E+00         4.28369E-01         1.43291E+02         1.00188E+00         1.35743E+01         1.45989E+02         5.45382E+01         9.14505E+01
+          6.81662E-03         1.76856E-02        -1.09038E-02         4.28234E-01         1.33054E+00         4.28373E-01         1.45153E+02         1.00188E+00         1.35440E+01         1.47840E+02         5.63757E+01         9.14642E+01
+          6.81662E-03         1.78554E-02        -1.10935E-02         4.28233E-01         1.34121E+00         4.28376E-01         1.47084E+02         1.00188E+00         1.35189E+01         1.49749E+02         5.82659E+01         9.14833E+01
+          6.81662E-03         1.80252E-02        -1.12849E-02         4.28232E-01         1.35188E+00         4.28380E-01         1.49060E+02         1.00188E+00         1.34981E+01         1.51695E+02         6.01907E+01         9.15040E+01
+          6.81662E-03         1.81951E-02        -1.14782E-02         4.28230E-01         1.36255E+00         4.28384E-01         1.51060E+02         1.00188E+00         1.34809E+01         1.53656E+02         6.21328E+01         9.15229E+01
+          6.81662E-03         1.83649E-02        -1.16733E-02         4.28229E-01         1.37322E+00         4.28388E-01         1.53065E+02         1.00188E+00         1.34666E+01         1.55613E+02         6.40764E+01         9.15363E+01
+          6.81662E-03         1.85347E-02        -1.18702E-02         4.28228E-01         1.38389E+00         4.28392E-01         1.55057E+02         1.00188E+00         1.34546E+01         1.57548E+02         6.60068E+01         9.15412E+01
+          6.81662E-03         1.87045E-02        -1.20689E-02         4.28226E-01         1.39457E+00         4.28396E-01         1.57018E+02         1.00188E+00         1.34442E+01         1.59445E+02         6.79104E+01         9.15342E+01
+          6.81662E-03         1.88744E-02        -1.22694E-02         4.28225E-01         1.40524E+00         4.28401E-01         1.58933E+02         1.00188E+00         1.34349E+01         1.61287E+02         6.97748E+01         9.15126E+01
+          6.81662E-03         1.90442E-02        -1.24717E-02         4.28223E-01         1.41591E+00         4.28405E-01         1.60786E+02         1.00188E+00         1.34260E+01         1.63062E+02         7.15888E+01         9.14735E+01
+          6.81662E-03         1.92140E-02        -1.26759E-02         4.28222E-01         1.42658E+00         4.28410E-01         1.62566E+02         1.00188E+00         1.34171E+01         1.64756E+02         7.33419E+01         9.14145E+01
+          6.81662E-03         1.93839E-02        -1.28819E-02         4.28221E-01         1.43725E+00         4.28414E-01         1.64260E+02         1.00188E+00         1.34076E+01         1.66358E+02         7.50252E+01         9.13332E+01
+          6.81662E-03         1.95537E-02        -1.30896E-02         4.28219E-01         1.44792E+00         4.28419E-01         1.65857E+02         1.00188E+00         1.33972E+01         1.67858E+02         7.66304E+01         9.12275E+01
+          6.81662E-03         1.97235E-02        -1.32992E-02         4.28218E-01         1.45859E+00         4.28424E-01         1.67348E+02         1.00188E+00         1.33853E+01         1.69246E+02         7.81504E+01         9.10953E+01
+          6.81662E-03         1.98933E-02        -1.35106E-02         4.28216E-01         1.46926E+00         4.28429E-01         1.68724E+02         1.00188E+00         1.33717E+01         1.70514E+02         7.95790E+01         9.09348E+01
+          6.81662E-03         2.00632E-02        -1.37239E-02         4.28215E-01         1.47993E+00         4.28435E-01         1.69978E+02         1.00188E+00         1.33559E+01         1.71655E+02         8.09108E+01         9.07447E+01
+          6.81662E-03         2.02330E-02        -1.39389E-02         4.28213E-01         1.49060E+00         4.28440E-01         1.71103E+02         1.00188E+00         1.33376E+01         1.72665E+02         8.21413E+01         9.05233E+01
+          6.81662E-03         2.04028E-02        -1.41557E-02         4.28212E-01         1.50127E+00         4.28446E-01         1.72095E+02         1.00188E+00         1.33166E+01         1.73537E+02         8.32671E+01         9.02696E+01
+          6.81662E-03         2.05726E-02        -1.43744E-02         4.28210E-01         1.51194E+00         4.28452E-01         1.72948E+02         1.00188E+00         1.32926E+01         1.74268E+02         8.42851E+01         8.99827E+01
+          6.81662E-03         2.07425E-02        -1.45949E-02         4.28209E-01         1.52261E+00         4.28458E-01         1.73661E+02         1.00188E+00         1.32653E+01         1.74855E+02         8.51934E+01         8.96615E+01
+          6.81662E-03         2.09123E-02        -1.48171E-02         4.28207E-01         1.53328E+00         4.28464E-01         1.74229E+02         1.00188E+00         1.32346E+01         1.75296E+02         8.59906E+01         8.93057E+01
+          6.81662E-03         2.10821E-02        -1.50412E-02         4.28206E-01         1.54395E+00         4.28470E-01         1.74652E+02         1.00188E+00         1.32002E+01         1.75591E+02         8.66760E+01         8.89147E+01
+          6.81662E-03         2.12520E-02        -1.52671E-02         4.28204E-01         1.55462E+00         4.28476E-01         1.74928E+02         1.00188E+00         1.31621E+01         1.75738E+02         8.72494E+01         8.84882E+01
+          6.81662E-03         2.14218E-02        -1.54949E-02         4.28203E-01         1.56529E+00         4.28483E-01         1.75059E+02         1.00188E+00         1.31200E+01         1.75738E+02         8.77114E+01         8.80262E+01
+          6.81662E-03         2.15916E-02        -1.57244E-02         4.28201E-01         1.57596E+00         4.28490E-01         1.75043E+02         1.00187E+00         1.30739E+01         1.75592E+02         8.80629E+01         8.75289E+01
+          6.81662E-03         2.17614E-02        -1.59558E-02         4.28200E-01         1.58664E+00         4.28497E-01         1.74884E+02         1.00187E+00         1.30237E+01         1.75302E+02         8.83056E+01         8.69963E+01
+          6.81662E-03         2.19313E-02        -1.61889E-02         4.28198E-01         1.59731E+00         4.28504E-01         1.74582E+02         1.00187E+00         1.29693E+01         1.74870E+02         8.84415E+01         8.64290E+01
+          6.81662E-03         2.21011E-02        -1.64239E-02         4.28196E-01         1.60798E+00         4.28511E-01         1.74140E+02         1.00187E+00         1.29107E+01         1.74300E+02         8.84728E+01         8.58275E+01
+          6.81662E-03         2.22709E-02        -1.66607E-02         4.28195E-01         1.61865E+00         4.28519E-01         1.73561E+02         1.00187E+00         1.28478E+01         1.73595E+02         8.84024E+01         8.51924E+01
+          6.81662E-03         2.24407E-02        -1.68993E-02         4.28193E-01         1.62932E+00         4.28527E-01         1.72849E+02         1.00187E+00         1.27806E+01         1.72758E+02         8.82335E+01         8.45246E+01
+          6.81662E-03         2.26106E-02        -1.71397E-02         4.28192E-01         1.63999E+00         4.28535E-01         1.72009E+02         1.00187E+00         1.27091E+01         1.71795E+02         8.79695E+01         8.38251E+01
+          6.81662E-03         2.27804E-02        -1.73819E-02         4.28190E-01         1.65066E+00         4.28543E-01         1.71043E+02         1.00187E+00         1.26333E+01         1.70709E+02         8.76140E+01         8.30949E+01
+          6.81662E-03         2.29502E-02        -1.76260E-02         4.28188E-01         1.66133E+00         4.28551E-01         1.69957E+02         1.00187E+00         1.25533E+01         1.69506E+02         8.71710E+01         8.23352E+01
+          6.81662E-03         2.31201E-02        -1.78718E-02         4.28187E-01         1.67200E+00         4.28559E-01         1.68757E+02         1.00187E+00         1.24690E+01         1.68192E+02         8.66446E+01         8.15472E+01
+          6.81662E-03         2.32899E-02        -1.81195E-02         4.28185E-01         1.68267E+00         4.28568E-01         1.67446E+02         1.00187E+00         1.23805E+01         1.66771E+02         8.60392E+01         8.07323E+01
+          6.81662E-03         2.34597E-02        -1.83690E-02         4.28183E-01         1.69334E+00         4.28577E-01         1.66032E+02         1.00187E+00         1.22879E+01         1.65251E+02         8.53591E+01         7.98921E+01
+          6.81662E-03         2.36295E-02        -1.86203E-02         4.28182E-01         1.70401E+00         4.28586E-01         1.64520E+02         1.00187E+00         1.21912E+01         1.63637E+02         8.46089E+01         7.90279E+01
+          6.81662E-03         2.37994E-02        -1.88734E-02         4.28180E-01         1.71468E+00         4.28596E-01         1.62916E+02         1.00187E+00         1.20906E+01         1.61935E+02         8.37932E+01         7.81414E+01
+          6.81662E-03         2.39692E-02        -1.91283E-02         4.28178E-01         1.72535E+00         4.28605E-01         1.61225E+02         1.00187E+00         1.19860E+01         1.60151E+02         8.29167E+01         7.72342E+01
+          6.81662E-03         2.41390E-02        -1.93851E-02         4.28176E-01         1.73602E+00         4.28615E-01         1.59455E+02         1.00187E+00         1.18776E+01         1.58292E+02         8.19841E+01         7.63081E+01
+          6.81662E-03         2.43088E-02        -1.96436E-02         4.28175E-01         1.74669E+00         4.28625E-01         1.57610E+02         1.00187E+00         1.17655E+01         1.56365E+02         8.10001E+01         7.53647E+01
+          6.81662E-03         2.44787E-02        -1.99040E-02         4.28173E-01         1.75736E+00         4.28635E-01         1.55699E+02         1.00187E+00         1.16497E+01         1.54375E+02         7.99693E+01         7.44058E+01
+          6.81662E-03         2.46485E-02        -2.01662E-02         4.28171E-01         1.76804E+00         4.28646E-01         1.53726E+02         1.00186E+00         1.15305E+01         1.52330E+02         7.88964E+01         7.34332E+01
+          6.81662E-03         2.48183E-02        -2.04302E-02         4.28169E-01         1.77871E+00         4.28656E-01         1.51698E+02         1.00186E+00         1.14078E+01         1.50235E+02         7.77860E+01         7.24486E+01
+          6.81662E-03         2.49882E-02        -2.06960E-02         4.28167E-01         1.78938E+00         4.28667E-01         1.49622E+02         1.00186E+00         1.12819E+01         1.48096E+02         7.66425E+01         7.14540E+01
+          6.81662E-03         2.51580E-02        -2.09636E-02         4.28166E-01         1.80005E+00         4.28678E-01         1.47503E+02         1.00186E+00         1.11528E+01         1.45921E+02         7.54703E+01         7.04511E+01
+          6.81662E-03         2.53278E-02        -2.12330E-02         4.28164E-01         1.81072E+00         4.28690E-01         1.45348E+02         1.00186E+00         1.10206E+01         1.43715E+02         7.42738E+01         6.94416E+01
+          6.81662E-03         2.54976E-02        -2.15043E-02         4.28162E-01         1.82139E+00         4.28702E-01         1.43162E+02         1.00186E+00         1.08856E+01         1.41484E+02         7.30570E+01         6.84274E+01
+          6.81662E-03         2.56675E-02        -2.17773E-02         4.28160E-01         1.83206E+00         4.28713E-01         1.40951E+02         1.00186E+00         1.07478E+01         1.39234E+02         7.18241E+01         6.74103E+01
+          6.81662E-03         2.58373E-02        -2.20522E-02         4.28158E-01         1.84273E+00         4.28726E-01         1.38720E+02         1.00186E+00         1.06073E+01         1.36971E+02         7.05789E+01         6.63918E+01
+          6.81662E-03         2.60071E-02        -2.23289E-02         4.28156E-01         1.85340E+00         4.28738E-01         1.36476E+02         1.00186E+00         1.04644E+01         1.34699E+02         6.93252E+01         6.53738E+01
+          6.81662E-03         2.61769E-02        -2.26074E-02         4.28154E-01         1.86407E+00         4.28751E-01         1.34224E+02         1.00186E+00         1.03190E+01         1.32424E+02         6.80664E+01         6.43578E+01
+          6.98645E-03         8.72665E-04        -1.17458E-03         4.38972E-01         2.74155E-01         4.38973E-01         4.05939E+03         1.00128E+00         1.06624E+02         4.05558E+03         3.63194E+03         4.23638E+02
+          6.98645E-03         1.04249E-03        -1.18479E-03         4.38971E-01         2.84826E-01         4.38973E-01         3.99580E+03         1.00128E+00         1.05070E+02         3.99184E+03         3.57206E+03         4.19775E+02
+          6.98645E-03         1.21232E-03        -1.19682E-03         4.38971E-01         2.95496E-01         4.38973E-01         3.93073E+03         1.00128E+00         1.03482E+02         3.92660E+03         3.51081E+03         4.15793E+02
+          6.98645E-03         1.38215E-03        -1.21067E-03         4.38971E-01         3.06167E-01         4.38973E-01         3.86425E+03         1.00128E+00         1.01863E+02         3.85996E+03         3.44826E+03         4.11695E+02
+          6.98645E-03         1.55197E-03        -1.22632E-03         4.38971E-01         3.16838E-01         4.38973E-01         3.79646E+03         1.00128E+00         1.00214E+02         3.79201E+03         3.38453E+03         4.07485E+02
+          6.98645E-03         1.72180E-03        -1.24379E-03         4.38971E-01         3.27508E-01         4.38973E-01         3.72747E+03         1.00128E+00         9.85384E+01         3.72286E+03         3.31969E+03         4.03167E+02
+          6.98645E-03         1.89163E-03        -1.26306E-03         4.38971E-01         3.38179E-01         4.38973E-01         3.65736E+03         1.00128E+00         9.68388E+01         3.65259E+03         3.25384E+03         3.98743E+02
+          6.98645E-03         2.06146E-03        -1.28415E-03         4.38971E-01         3.48849E-01         4.38973E-01         3.58622E+03         1.00128E+00         9.51174E+01         3.58130E+03         3.18708E+03         3.94218E+02
+          6.98645E-03         2.23128E-03        -1.30706E-03         4.38971E-01         3.59520E-01         4.38973E-01         3.51417E+03         1.00128E+00         9.33769E+01         3.50908E+03         3.11949E+03         3.89596E+02
+          6.98645E-03         2.40111E-03        -1.33177E-03         4.38970E-01         3.70190E-01         4.38972E-01         3.44128E+03         1.00128E+00         9.16197E+01         3.43605E+03         3.05117E+03         3.84880E+02
+          6.98645E-03         2.57094E-03        -1.35830E-03         4.38970E-01         3.80861E-01         4.38972E-01         3.36767E+03         1.00128E+00         8.98482E+01         3.36229E+03         2.98221E+03         3.80074E+02
+          6.98645E-03         2.74077E-03        -1.38664E-03         4.38970E-01         3.91532E-01         4.38972E-01         3.29342E+03         1.00128E+00         8.80650E+01         3.28789E+03         2.91271E+03         3.75183E+02
+          6.98645E-03         2.91059E-03        -1.41679E-03         4.38970E-01         4.02202E-01         4.38972E-01         3.21864E+03         1.00128E+00         8.62724E+01         3.21297E+03         2.84276E+03         3.70210E+02
+          6.98645E-03         3.08042E-03        -1.44875E-03         4.38970E-01         4.12873E-01         4.38972E-01         3.14341E+03         1.00128E+00         8.44730E+01         3.13761E+03         2.77245E+03         3.65161E+02
+          6.98645E-03         3.25025E-03        -1.48253E-03         4.38969E-01         4.23543E-01         4.38972E-01         3.06784E+03         1.00128E+00         8.26690E+01         3.06190E+03         2.70186E+03         3.60039E+02
+          6.98645E-03         3.42008E-03        -1.51811E-03         4.38969E-01         4.34214E-01         4.38972E-01         2.99202E+03         1.00128E+00         8.08628E+01         2.98595E+03         2.63111E+03         3.54849E+02
+          6.98645E-03         3.58990E-03        -1.55551E-03         4.38969E-01         4.44884E-01         4.38972E-01         2.91604E+03         1.00128E+00         7.90566E+01         2.90985E+03         2.56026E+03         3.49596E+02
+          6.98645E-03         3.75973E-03        -1.59473E-03         4.38969E-01         4.55555E-01         4.38971E-01         2.83999E+03         1.00128E+00         7.72529E+01         2.83369E+03         2.48941E+03         3.44284E+02
+          6.98645E-03         3.92956E-03        -1.63575E-03         4.38968E-01         4.66225E-01         4.38971E-01         2.76396E+03         1.00128E+00         7.54537E+01         2.75756E+03         2.41864E+03         3.38919E+02
+          6.98645E-03         4.09939E-03        -1.67859E-03         4.38968E-01         4.76896E-01         4.38971E-01         2.68805E+03         1.00128E+00         7.36611E+01         2.68155E+03         2.34805E+03         3.33504E+02
+          6.98645E-03         4.26921E-03        -1.72323E-03         4.38968E-01         4.87567E-01         4.38971E-01         2.61234E+03         1.00128E+00         7.18773E+01         2.60575E+03         2.27770E+03         3.28046E+02
+          6.98645E-03         4.43904E-03        -1.76969E-03         4.38967E-01         4.98237E-01         4.38971E-01         2.53692E+03         1.00128E+00         7.01043E+01         2.53024E+03         2.20769E+03         3.22548E+02
+          6.98645E-03         4.60887E-03        -1.81797E-03         4.38967E-01         5.08908E-01         4.38971E-01         2.46187E+03         1.00128E+00         6.83440E+01         2.45511E+03         2.13809E+03         3.17017E+02
+          6.98645E-03         4.77869E-03        -1.86805E-03         4.38967E-01         5.19578E-01         4.38971E-01         2.38726E+03         1.00128E+00         6.65982E+01         2.38044E+03         2.06898E+03         3.11456E+02
+          6.98645E-03         4.94852E-03        -1.91995E-03         4.38966E-01         5.30249E-01         4.38970E-01         2.31319E+03         1.00128E+00         6.48689E+01         2.30630E+03         2.00043E+03         3.05872E+02
+          6.98645E-03         5.11835E-03        -1.97366E-03         4.38966E-01         5.40919E-01         4.38970E-01         2.23972E+03         1.00128E+00         6.31576E+01         2.23278E+03         1.93252E+03         3.00269E+02
+          6.98645E-03         5.28818E-03        -2.02918E-03         4.38966E-01         5.51590E-01         4.38970E-01         2.16694E+03         1.00128E+00         6.14661E+01         2.15996E+03         1.86530E+03         2.94653E+02
+          6.98645E-03         5.45800E-03        -2.08651E-03         4.38965E-01         5.62261E-01         4.38970E-01         2.09491E+03         1.00128E+00         5.97958E+01         2.08789E+03         1.79886E+03         2.89029E+02
+          6.98645E-03         5.62783E-03        -2.14566E-03         4.38965E-01         5.72931E-01         4.38970E-01         2.02369E+03         1.00128E+00         5.81483E+01         2.01666E+03         1.73325E+03         2.83401E+02
+          6.98645E-03         5.79766E-03        -2.20661E-03         4.38964E-01         5.83602E-01         4.38970E-01         1.95337E+03         1.00128E+00         5.65250E+01         1.94632E+03         1.66854E+03         2.77776E+02
+          6.98645E-03         5.96749E-03        -2.26938E-03         4.38964E-01         5.94272E-01         4.38970E-01         1.88400E+03         1.00128E+00         5.49270E+01         1.87694E+03         1.60478E+03         2.72159E+02
+          6.98645E-03         6.13731E-03        -2.33397E-03         4.38963E-01         6.04943E-01         4.38970E-01         1.81564E+03         1.00128E+00         5.33557E+01         1.80858E+03         1.54203E+03         2.66554E+02
+          6.98645E-03         6.30714E-03        -2.40036E-03         4.38963E-01         6.15613E-01         4.38970E-01         1.74834E+03         1.00128E+00         5.18122E+01         1.74131E+03         1.48034E+03         2.60968E+02
+          6.98645E-03         6.47697E-03        -2.46857E-03         4.38962E-01         6.26284E-01         4.38969E-01         1.68217E+03         1.00128E+00         5.02974E+01         1.67516E+03         1.41975E+03         2.55404E+02
+          6.98645E-03         6.64680E-03        -2.53859E-03         4.38962E-01         6.36955E-01         4.38969E-01         1.61718E+03         1.00128E+00         4.88123E+01         1.61020E+03         1.36033E+03         2.49869E+02
+          6.98645E-03         6.81662E-03        -2.61042E-03         4.38961E-01         6.47625E-01         4.38969E-01         1.55340E+03         1.00128E+00         4.73577E+01         1.54646E+03         1.30210E+03         2.44368E+02
+          6.98645E-03         6.98645E-03        -2.68406E-03         4.38961E-01         6.58296E-01         4.38969E-01         1.49089E+03         1.00128E+00         4.59344E+01         1.48401E+03         1.24510E+03         2.38905E+02
+          6.98645E-03         7.15628E-03        -2.75952E-03         4.38960E-01         6.68966E-01         4.38969E-01         1.42969E+03         1.00128E+00         4.45430E+01         1.42287E+03         1.18938E+03         2.33486E+02
+          6.98645E-03         7.32611E-03        -2.83678E-03         4.38960E-01         6.79637E-01         4.38969E-01         1.36984E+03         1.00128E+00         4.31840E+01         1.36308E+03         1.13497E+03         2.28114E+02
+          6.98645E-03         7.49593E-03        -2.91586E-03         4.38959E-01         6.90307E-01         4.38969E-01         1.31136E+03         1.00128E+00         4.18581E+01         1.30469E+03         1.08189E+03         2.22797E+02
+          6.98645E-03         7.66576E-03        -2.99676E-03         4.38959E-01         7.00978E-01         4.38969E-01         1.25430E+03         1.00128E+00         4.05654E+01         1.24772E+03         1.03018E+03         2.17537E+02
+          6.98645E-03         7.83559E-03        -3.07946E-03         4.38958E-01         7.11649E-01         4.38969E-01         1.19868E+03         1.00128E+00         3.93064E+01         1.19220E+03         9.79856E+02         2.12339E+02
+          6.98645E-03         8.00542E-03        -3.16398E-03         4.38958E-01         7.22319E-01         4.38969E-01         1.14452E+03         1.00128E+00         3.80813E+01         1.13815E+03         9.30938E+02         2.07209E+02
+          6.98645E-03         8.17524E-03        -3.25031E-03         4.38957E-01         7.32990E-01         4.38969E-01         1.09185E+03         1.00128E+00         3.68901E+01         1.08560E+03         8.83445E+02         2.02151E+02
+          6.98645E-03         8.34507E-03        -3.33845E-03         4.38956E-01         7.43660E-01         4.38969E-01         1.04069E+03         1.00128E+00         3.57329E+01         1.03456E+03         8.37391E+02         1.97167E+02
+          6.98645E-03         8.51490E-03        -3.42840E-03         4.38956E-01         7.54331E-01         4.38969E-01         9.91049E+02         1.00128E+00         3.46097E+01         9.85051E+02         7.92787E+02         1.92264E+02
+          6.98645E-03         8.68473E-03        -3.52017E-03         4.38955E-01         7.65001E-01         4.38969E-01         9.42944E+02         1.00128E+00         3.35204E+01         9.37086E+02         7.49641E+02         1.87445E+02
+          6.98645E-03         8.85455E-03        -3.61375E-03         4.38954E-01         7.75672E-01         4.38969E-01         8.96383E+02         1.00128E+00         3.24649E+01         8.90673E+02         7.07960E+02         1.82713E+02
+          6.98645E-03         9.02438E-03        -3.70914E-03         4.38954E-01         7.86343E-01         4.38969E-01         8.51372E+02         1.00128E+00         3.14428E+01         8.45817E+02         6.67745E+02         1.78072E+02
+          6.98645E-03         9.19421E-03        -3.80634E-03         4.38953E-01         7.97013E-01         4.38970E-01         8.07916E+02         1.00128E+00         3.04540E+01         8.02522E+02         6.28996E+02         1.73526E+02
+          6.98645E-03         9.36403E-03        -3.90536E-03         4.38952E-01         8.07684E-01         4.38970E-01         7.66013E+02         1.00128E+00         2.94981E+01         7.60787E+02         5.91709E+02         1.69078E+02
+          6.98645E-03         9.53386E-03        -4.00618E-03         4.38952E-01         8.18354E-01         4.38970E-01         7.25664E+02         1.00128E+00         2.85746E+01         7.20611E+02         5.55880E+02         1.64731E+02
+          6.98645E-03         9.70369E-03        -4.10882E-03         4.38951E-01         8.29025E-01         4.38970E-01         6.86861E+02         1.00128E+00         2.76831E+01         6.81988E+02         5.21500E+02         1.60488E+02
+          6.98645E-03         9.87352E-03        -4.21328E-03         4.38950E-01         8.39695E-01         4.38970E-01         6.49599E+02         1.00128E+00         2.68232E+01         6.44910E+02         4.88559E+02         1.56351E+02
+          6.98645E-03         1.00433E-02        -4.31954E-03         4.38950E-01         8.50366E-01         4.38971E-01         6.13866E+02         1.00128E+00         2.59943E+01         6.09366E+02         4.57043E+02         1.52323E+02
+          6.98645E-03         1.02132E-02        -4.42762E-03         4.38949E-01         8.61037E-01         4.38971E-01         5.79651E+02         1.00128E+00         2.51959E+01         5.75344E+02         4.26937E+02         1.48407E+02
+          6.98645E-03         1.03830E-02        -4.53751E-03         4.38948E-01         8.71707E-01         4.38971E-01         5.46938E+02         1.00128E+00         2.44273E+01         5.42827E+02         3.98224E+02         1.44604E+02
+          6.98645E-03         1.05528E-02        -4.64921E-03         4.38947E-01         8.82378E-01         4.38972E-01         5.15709E+02         1.00128E+00         2.36880E+01         5.11799E+02         3.70884E+02         1.40916E+02
+          6.98645E-03         1.07227E-02        -4.76272E-03         4.38946E-01         8.93048E-01         4.38972E-01         4.85947E+02         1.00128E+00         2.29774E+01         4.82240E+02         3.44896E+02         1.37344E+02
+          6.98645E-03         1.08925E-02        -4.87805E-03         4.38946E-01         9.03719E-01         4.38973E-01         4.57628E+02         1.00128E+00         2.22948E+01         4.54127E+02         3.20236E+02         1.33890E+02
+          6.98645E-03         1.10623E-02        -4.99519E-03         4.38945E-01         9.14389E-01         4.38973E-01         4.30731E+02         1.00128E+00         2.16396E+01         4.27436E+02         2.96881E+02         1.30556E+02
+          6.98645E-03         1.12321E-02        -5.11414E-03         4.38944E-01         9.25060E-01         4.38974E-01         4.05229E+02         1.00128E+00         2.10111E+01         4.02143E+02         2.74802E+02         1.27341E+02
+          6.98645E-03         1.14020E-02        -5.23491E-03         4.38943E-01         9.35731E-01         4.38974E-01         3.81096E+02         1.00128E+00         2.04088E+01         3.78219E+02         2.53972E+02         1.24247E+02
+          6.98645E-03         1.15718E-02        -5.35748E-03         4.38942E-01         9.46401E-01         4.38975E-01         3.58302E+02         1.00128E+00         1.98319E+01         3.55636E+02         2.34363E+02         1.21274E+02
+          6.98645E-03         1.17416E-02        -5.48187E-03         4.38941E-01         9.57072E-01         4.38976E-01         3.36819E+02         1.00128E+00         1.92799E+01         3.34363E+02         2.15942E+02         1.18421E+02
+          6.98645E-03         1.19114E-02        -5.60807E-03         4.38941E-01         9.67742E-01         4.38976E-01         3.16614E+02         1.00128E+00         1.87521E+01         3.14368E+02         1.98678E+02         1.15690E+02
+          6.98645E-03         1.20813E-02        -5.73609E-03         4.38940E-01         9.78413E-01         4.38977E-01         2.97655E+02         1.00128E+00         1.82479E+01         2.95617E+02         1.82539E+02         1.13079E+02
+          6.98645E-03         1.22511E-02        -5.86591E-03         4.38939E-01         9.89083E-01         4.38978E-01         2.79908E+02         1.00128E+00         1.77668E+01         2.78077E+02         1.67490E+02         1.10588E+02
+          6.98645E-03         1.24209E-02        -5.99755E-03         4.38938E-01         9.99754E-01         4.38979E-01         2.63338E+02         1.00128E+00         1.73082E+01         2.61712E+02         1.53497E+02         1.08216E+02
+          6.98645E-03         1.25908E-02        -6.13101E-03         4.38937E-01         1.01042E+00         4.38980E-01         2.47908E+02         1.00128E+00         1.68715E+01         2.46486E+02         1.40524E+02         1.05962E+02
+          6.98645E-03         1.27606E-02        -6.26627E-03         4.38936E-01         1.02110E+00         4.38981E-01         2.33583E+02         1.00128E+00         1.64561E+01         2.32361E+02         1.28536E+02         1.03825E+02
+          6.98645E-03         1.29304E-02        -6.40335E-03         4.38935E-01         1.03177E+00         4.38982E-01         2.20325E+02         1.00128E+00         1.60616E+01         2.19300E+02         1.17497E+02         1.01803E+02
+          6.98645E-03         1.31002E-02        -6.54224E-03         4.38934E-01         1.04244E+00         4.38983E-01         2.08096E+02         1.00128E+00         1.56874E+01         2.07265E+02         1.07369E+02         9.98953E+01
+          6.98645E-03         1.32701E-02        -6.68294E-03         4.38933E-01         1.05311E+00         4.38984E-01         1.96857E+02         1.00128E+00         1.53330E+01         1.96215E+02         9.81166E+01         9.80988E+01
+          6.98645E-03         1.34399E-02        -6.82545E-03         4.38932E-01         1.06378E+00         4.38985E-01         1.86569E+02         1.00128E+00         1.49979E+01         1.86113E+02         8.97014E+01         9.64119E+01
+          6.98645E-03         1.36097E-02        -6.96978E-03         4.38931E-01         1.07445E+00         4.38986E-01         1.77194E+02         1.00128E+00         1.46817E+01         1.76919E+02         8.20865E+01         9.48321E+01
+          6.98645E-03         1.37795E-02        -7.11592E-03         4.38930E-01         1.08512E+00         4.38988E-01         1.68692E+02         1.00128E+00         1.43838E+01         1.68592E+02         7.52349E+01         9.33571E+01
+          6.98645E-03         1.39494E-02        -7.26387E-03         4.38929E-01         1.09579E+00         4.38989E-01         1.61024E+02         1.00128E+00         1.41039E+01         1.61094E+02         6.91095E+01         9.19840E+01
+          6.98645E-03         1.41192E-02        -7.41364E-03         4.38928E-01         1.10646E+00         4.38991E-01         1.54150E+02         1.00128E+00         1.38413E+01         1.54384E+02         6.36735E+01         9.07101E+01
+          6.98645E-03         1.42890E-02        -7.56521E-03         4.38927E-01         1.11713E+00         4.38992E-01         1.48031E+02         1.00128E+00         1.35956E+01         1.48423E+02         5.88903E+01         8.95324E+01
+          6.98645E-03         1.44589E-02        -7.71860E-03         4.38926E-01         1.12780E+00         4.38994E-01         1.42628E+02         1.00128E+00         1.33664E+01         1.43171E+02         5.47237E+01         8.84475E+01
+          6.98645E-03         1.46287E-02        -7.87381E-03         4.38925E-01         1.13847E+00         4.38995E-01         1.37902E+02         1.00128E+00         1.31530E+01         1.38591E+02         5.11381E+01         8.74524E+01
+          6.98645E-03         1.47985E-02        -8.03082E-03         4.38924E-01         1.14914E+00         4.38997E-01         1.33815E+02         1.00128E+00         1.29551E+01         1.34642E+02         4.80983E+01         8.65434E+01
+          6.98645E-03         1.49683E-02        -8.18965E-03         4.38922E-01         1.15981E+00         4.38999E-01         1.30328E+02         1.00128E+00         1.27720E+01         1.31287E+02         4.55696E+01         8.57171E+01
+          6.98645E-03         1.51382E-02        -8.35029E-03         4.38921E-01         1.17048E+00         4.39001E-01         1.27406E+02         1.00128E+00         1.26032E+01         1.28488E+02         4.35181E+01         8.49698E+01
+          6.98645E-03         1.53080E-02        -8.51275E-03         4.38920E-01         1.18115E+00         4.39003E-01         1.25010E+02         1.00128E+00         1.24481E+01         1.26208E+02         4.19106E+01         8.42977E+01
+          6.98645E-03         1.54778E-02        -8.67701E-03         4.38919E-01         1.19182E+00         4.39005E-01         1.23104E+02         1.00128E+00         1.23063E+01         1.24412E+02         4.07147E+01         8.36971E+01
+          6.98645E-03         1.56476E-02        -8.84309E-03         4.38918E-01         1.20249E+00         4.39007E-01         1.21653E+02         1.00128E+00         1.21770E+01         1.23063E+02         3.98987E+01         8.31639E+01
+          6.98645E-03         1.58175E-02        -9.01098E-03         4.38917E-01         1.21317E+00         4.39009E-01         1.20623E+02         1.00128E+00         1.20596E+01         1.22126E+02         3.94318E+01         8.26943E+01
+          6.98645E-03         1.59873E-02        -9.18069E-03         4.38916E-01         1.22384E+00         4.39012E-01         1.19980E+02         1.00128E+00         1.19536E+01         1.21568E+02         3.92841E+01         8.22841E+01
+          6.98645E-03         1.61571E-02        -9.35221E-03         4.38914E-01         1.23451E+00         4.39014E-01         1.19690E+02         1.00128E+00         1.18583E+01         1.21356E+02         3.94269E+01         8.19295E+01
+          6.98645E-03         1.63270E-02        -9.52554E-03         4.38913E-01         1.24518E+00         4.39017E-01         1.19723E+02         1.00128E+00         1.17730E+01         1.21459E+02         3.98322E+01         8.16263E+01
+          6.98645E-03         1.64968E-02        -9.70068E-03         4.38912E-01         1.25585E+00         4.39019E-01         1.20046E+02         1.00128E+00         1.16970E+01         1.21844E+02         4.04731E+01         8.13704E+01
+          6.98645E-03         1.66666E-02        -9.87764E-03         4.38911E-01         1.26652E+00         4.39022E-01         1.20630E+02         1.00128E+00         1.16298E+01         1.22482E+02         4.13236E+01         8.11579E+01
+          6.98645E-03         1.68364E-02        -1.00564E-02         4.38909E-01         1.27719E+00         4.39025E-01         1.21447E+02         1.00128E+00         1.15706E+01         1.23344E+02         4.23591E+01         8.09845E+01
+          6.98645E-03         1.70063E-02        -1.02370E-02         4.38908E-01         1.28786E+00         4.39028E-01         1.22467E+02         1.00128E+00         1.15188E+01         1.24402E+02         4.35558E+01         8.08464E+01
+          6.98645E-03         1.71761E-02        -1.04194E-02         4.38907E-01         1.29853E+00         4.39031E-01         1.23666E+02         1.00128E+00         1.14738E+01         1.25631E+02         4.48910E+01         8.07396E+01
+          6.98645E-03         1.73459E-02        -1.06036E-02         4.38906E-01         1.30920E+00         4.39034E-01         1.25016E+02         1.00128E+00         1.14348E+01         1.27003E+02         4.63432E+01         8.06600E+01
+          6.98645E-03         1.75158E-02        -1.07896E-02         4.38904E-01         1.31987E+00         4.39037E-01         1.26494E+02         1.00128E+00         1.14012E+01         1.28496E+02         4.78920E+01         8.06039E+01
+          6.98645E-03         1.76856E-02        -1.09774E-02         4.38903E-01         1.33054E+00         4.39040E-01         1.28076E+02         1.00128E+00         1.13725E+01         1.30085E+02         4.95180E+01         8.05675E+01
+          6.98645E-03         1.78554E-02        -1.11671E-02         4.38902E-01         1.34121E+00         4.39044E-01         1.29741E+02         1.00128E+00         1.13480E+01         1.31750E+02         5.12030E+01         8.05470E+01
+          6.98645E-03         1.80252E-02        -1.13586E-02         4.38900E-01         1.35188E+00         4.39047E-01         1.31467E+02         1.00128E+00         1.13271E+01         1.33469E+02         5.29298E+01         8.05389E+01
+          6.98645E-03         1.81951E-02        -1.15518E-02         4.38899E-01         1.36255E+00         4.39051E-01         1.33234E+02         1.00128E+00         1.13093E+01         1.35222E+02         5.46825E+01         8.05396E+01
+          6.98645E-03         1.83649E-02        -1.17469E-02         4.38898E-01         1.37322E+00         4.39055E-01         1.35025E+02         1.00128E+00         1.12939E+01         1.36992E+02         5.64460E+01         8.05457E+01
+          6.98645E-03         1.85347E-02        -1.19438E-02         4.38896E-01         1.38389E+00         4.39059E-01         1.36821E+02         1.00128E+00         1.12806E+01         1.38760E+02         5.82065E+01         8.05540E+01
+          6.98645E-03         1.87045E-02        -1.21425E-02         4.38895E-01         1.39457E+00         4.39063E-01         1.38607E+02         1.00128E+00         1.12688E+01         1.40512E+02         5.99510E+01         8.05613E+01
+          6.98645E-03         1.88744E-02        -1.23430E-02         4.38893E-01         1.40524E+00         4.39067E-01         1.40367E+02         1.00128E+00         1.12580E+01         1.42232E+02         6.16678E+01         8.05646E+01
+          6.98645E-03         1.90442E-02        -1.25454E-02         4.38892E-01         1.41591E+00         4.39071E-01         1.42087E+02         1.00128E+00         1.12478E+01         1.43907E+02         6.33461E+01         8.05610E+01
+          6.98645E-03         1.92140E-02        -1.27495E-02         4.38891E-01         1.42658E+00         4.39076E-01         1.43755E+02         1.00128E+00         1.12378E+01         1.45524E+02         6.49759E+01         8.05477E+01
+          6.98645E-03         1.93839E-02        -1.29555E-02         4.38889E-01         1.43725E+00         4.39080E-01         1.45358E+02         1.00128E+00         1.12276E+01         1.47071E+02         6.65485E+01         8.05223E+01
+          6.98645E-03         1.95537E-02        -1.31633E-02         4.38888E-01         1.44792E+00         4.39085E-01         1.46886E+02         1.00128E+00         1.12168E+01         1.48538E+02         6.80558E+01         8.04822E+01
+          6.98645E-03         1.97235E-02        -1.33729E-02         4.38886E-01         1.45859E+00         4.39090E-01         1.48330E+02         1.00128E+00         1.12051E+01         1.49916E+02         6.94907E+01         8.04253E+01
+          6.98645E-03         1.98933E-02        -1.35843E-02         4.38885E-01         1.46926E+00         4.39095E-01         1.49681E+02         1.00128E+00         1.11921E+01         1.51197E+02         7.08472E+01         8.03494E+01
+          6.98645E-03         2.00632E-02        -1.37975E-02         4.38883E-01         1.47993E+00         4.39100E-01         1.50930E+02         1.00128E+00         1.11777E+01         1.52372E+02         7.21198E+01         8.02526E+01
+          6.98645E-03         2.02330E-02        -1.40125E-02         4.38882E-01         1.49060E+00         4.39105E-01         1.52073E+02         1.00128E+00         1.11615E+01         1.53437E+02         7.33040E+01         8.01332E+01
+          6.98645E-03         2.04028E-02        -1.42294E-02         4.38880E-01         1.50127E+00         4.39111E-01         1.53102E+02         1.00128E+00         1.11432E+01         1.54385E+02         7.43960E+01         7.99895E+01
+          6.98645E-03         2.05726E-02        -1.44480E-02         4.38879E-01         1.51194E+00         4.39117E-01         1.54013E+02         1.00128E+00         1.11228E+01         1.55213E+02         7.53926E+01         7.98201E+01
+          6.98645E-03         2.07425E-02        -1.46685E-02         4.38877E-01         1.52261E+00         4.39122E-01         1.54802E+02         1.00128E+00         1.10999E+01         1.55916E+02         7.62916E+01         7.96239E+01
+          6.98645E-03         2.09123E-02        -1.48908E-02         4.38876E-01         1.53328E+00         4.39128E-01         1.55466E+02         1.00128E+00         1.10745E+01         1.56491E+02         7.70913E+01         7.93997E+01
+          6.98645E-03         2.10821E-02        -1.51149E-02         4.38874E-01         1.54395E+00         4.39134E-01         1.56003E+02         1.00127E+00         1.10463E+01         1.56937E+02         7.77905E+01         7.91466E+01
+          6.98645E-03         2.12520E-02        -1.53408E-02         4.38873E-01         1.55462E+00         4.39141E-01         1.56410E+02         1.00127E+00         1.10152E+01         1.57252E+02         7.83887E+01         7.88638E+01
+          6.98645E-03         2.14218E-02        -1.55685E-02         4.38871E-01         1.56529E+00         4.39147E-01         1.56688E+02         1.00127E+00         1.09811E+01         1.57437E+02         7.88860E+01         7.85508E+01
+          6.98645E-03         2.15916E-02        -1.57980E-02         4.38869E-01         1.57596E+00         4.39154E-01         1.56836E+02         1.00127E+00         1.09440E+01         1.57490E+02         7.92830E+01         7.82072E+01
+          6.98645E-03         2.17614E-02        -1.60294E-02         4.38868E-01         1.58664E+00         4.39160E-01         1.56854E+02         1.00127E+00         1.09037E+01         1.57413E+02         7.95807E+01         7.78327E+01
+          6.98645E-03         2.19313E-02        -1.62625E-02         4.38866E-01         1.59731E+00         4.39167E-01         1.56744E+02         1.00127E+00         1.08601E+01         1.57208E+02         7.97805E+01         7.74273E+01
+          6.98645E-03         2.21011E-02        -1.64975E-02         4.38864E-01         1.60798E+00         4.39174E-01         1.56506E+02         1.00127E+00         1.08133E+01         1.56875E+02         7.98843E+01         7.69908E+01
+          6.98645E-03         2.22709E-02        -1.67343E-02         4.38863E-01         1.61865E+00         4.39182E-01         1.56144E+02         1.00127E+00         1.07631E+01         1.56418E+02         7.98944E+01         7.65236E+01
+          6.98645E-03         2.24407E-02        -1.69729E-02         4.38861E-01         1.62932E+00         4.39189E-01         1.55659E+02         1.00127E+00         1.07096E+01         1.55839E+02         7.98133E+01         7.60260E+01
+          6.98645E-03         2.26106E-02        -1.72133E-02         4.38859E-01         1.63999E+00         4.39197E-01         1.55056E+02         1.00127E+00         1.06528E+01         1.55142E+02         7.96439E+01         7.54983E+01
+          6.98645E-03         2.27804E-02        -1.74556E-02         4.38858E-01         1.65066E+00         4.39205E-01         1.54336E+02         1.00127E+00         1.05925E+01         1.54331E+02         7.93894E+01         7.49413E+01
+          6.98645E-03         2.29502E-02        -1.76996E-02         4.38856E-01         1.66133E+00         4.39213E-01         1.53504E+02         1.00127E+00         1.05289E+01         1.53409E+02         7.90530E+01         7.43555E+01
+          6.98645E-03         2.31201E-02        -1.79455E-02         4.38854E-01         1.67200E+00         4.39221E-01         1.52565E+02         1.00127E+00         1.04620E+01         1.52380E+02         7.86385E+01         7.37419E+01
+          6.98645E-03         2.32899E-02        -1.81931E-02         4.38853E-01         1.68267E+00         4.39230E-01         1.51522E+02         1.00127E+00         1.03918E+01         1.51251E+02         7.81495E+01         7.31013E+01
+          6.98645E-03         2.34597E-02        -1.84426E-02         4.38851E-01         1.69334E+00         4.39238E-01         1.50380E+02         1.00127E+00         1.03182E+01         1.50025E+02         7.75899E+01         7.24347E+01
+          6.98645E-03         2.36295E-02        -1.86939E-02         4.38849E-01         1.70401E+00         4.39247E-01         1.49144E+02         1.00127E+00         1.02415E+01         1.48707E+02         7.69638E+01         7.17432E+01
+          6.98645E-03         2.37994E-02        -1.89470E-02         4.38847E-01         1.71468E+00         4.39256E-01         1.47820E+02         1.00127E+00         1.01616E+01         1.47303E+02         7.62751E+01         7.10282E+01
+          6.98645E-03         2.39692E-02        -1.92020E-02         4.38846E-01         1.72535E+00         4.39265E-01         1.46412E+02         1.00127E+00         1.00785E+01         1.45819E+02         7.55282E+01         7.02907E+01
+          6.98645E-03         2.41390E-02        -1.94587E-02         4.38844E-01         1.73602E+00         4.39275E-01         1.44925E+02         1.00127E+00         9.99239E+00         1.44259E+02         7.47272E+01         6.95321E+01
+          6.98645E-03         2.43088E-02        -1.97172E-02         4.38842E-01         1.74669E+00         4.39285E-01         1.43366E+02         1.00127E+00         9.90329E+00         1.42630E+02         7.38763E+01         6.87539E+01
+          6.98645E-03         2.44787E-02        -1.99776E-02         4.38840E-01         1.75736E+00         4.39295E-01         1.41740E+02         1.00127E+00         9.81126E+00         1.40937E+02         7.29798E+01         6.79575E+01
+          6.98645E-03         2.46485E-02        -2.02398E-02         4.38838E-01         1.76804E+00         4.39305E-01         1.40051E+02         1.00127E+00         9.71640E+00         1.39186E+02         7.20418E+01         6.71443E+01
+          6.98645E-03         2.48183E-02        -2.05038E-02         4.38836E-01         1.77871E+00         4.39315E-01         1.38307E+02         1.00127E+00         9.61878E+00         1.37382E+02         7.10665E+01         6.63160E+01
+          6.98645E-03         2.49882E-02        -2.07696E-02         4.38835E-01         1.78938E+00         4.39326E-01         1.36512E+02         1.00127E+00         9.51849E+00         1.35532E+02         7.00580E+01         6.54739E+01
+          6.98645E-03         2.51580E-02        -2.10372E-02         4.38833E-01         1.80005E+00         4.39337E-01         1.34672E+02         1.00127E+00         9.41563E+00         1.33640E+02         6.90204E+01         6.46198E+01
+          6.98645E-03         2.53278E-02        -2.13066E-02         4.38831E-01         1.81072E+00         4.39348E-01         1.32792E+02         1.00126E+00         9.31028E+00         1.31713E+02         6.79576E+01         6.37552E+01
+          6.98645E-03         2.54976E-02        -2.15779E-02         4.38829E-01         1.82139E+00         4.39359E-01         1.30878E+02         1.00126E+00         9.20256E+00         1.29755E+02         6.68735E+01         6.28816E+01
+          6.98645E-03         2.56675E-02        -2.18510E-02         4.38827E-01         1.83206E+00         4.39371E-01         1.28935E+02         1.00126E+00         9.09255E+00         1.27773E+02         6.57717E+01         6.20008E+01
+          6.98645E-03         2.58373E-02        -2.21258E-02         4.38825E-01         1.84273E+00         4.39383E-01         1.26968E+02         1.00126E+00         8.98036E+00         1.25770E+02         6.46559E+01         6.11142E+01
+          6.98645E-03         2.60071E-02        -2.24025E-02         4.38823E-01         1.85340E+00         4.39395E-01         1.24982E+02         1.00126E+00         8.86610E+00         1.23753E+02         6.35296E+01         6.02235E+01
+          6.98645E-03         2.61769E-02        -2.26810E-02         4.38821E-01         1.86407E+00         4.39407E-01         1.22982E+02         1.00126E+00         8.74987E+00         1.21726E+02         6.23960E+01         5.93302E+01
+          7.15628E-03         8.72665E-04        -1.25003E-03         4.49642E-01         2.74155E-01         4.49644E-01         3.63037E+03         1.00084E+00         8.50336E+01         3.62899E+03         3.25989E+03         3.69100E+02
+          7.15628E-03         1.04249E-03        -1.26025E-03         4.49642E-01         2.84826E-01         4.49644E-01         3.57462E+03         1.00084E+00         8.38048E+01         3.57310E+03         3.20700E+03         3.66101E+02
+          7.15628E-03         1.21232E-03        -1.27228E-03         4.49642E-01         2.95496E-01         4.49644E-01         3.51754E+03         1.00084E+00         8.25491E+01         3.51588E+03         3.15288E+03         3.63005E+02
+          7.15628E-03         1.38215E-03        -1.28612E-03         4.49642E-01         3.06167E-01         4.49644E-01         3.45922E+03         1.00084E+00         8.12683E+01         3.45742E+03         3.09760E+03         3.59815E+02
+          7.15628E-03         1.55197E-03        -1.30178E-03         4.49642E-01         3.16838E-01         4.49644E-01         3.39973E+03         1.00084E+00         7.99645E+01         3.39779E+03         3.04126E+03         3.56532E+02
+          7.15628E-03         1.72180E-03        -1.31924E-03         4.49642E-01         3.27508E-01         4.49644E-01         3.33916E+03         1.00084E+00         7.86396E+01         3.33708E+03         2.98392E+03         3.53159E+02
+          7.15628E-03         1.89163E-03        -1.33852E-03         4.49641E-01         3.38179E-01         4.49643E-01         3.27758E+03         1.00084E+00         7.72955E+01         3.27537E+03         2.92567E+03         3.49697E+02
+          7.15628E-03         2.06146E-03        -1.35961E-03         4.49641E-01         3.48849E-01         4.49643E-01         3.21509E+03         1.00084E+00         7.59343E+01         3.21274E+03         2.86659E+03         3.46150E+02
+          7.15628E-03         2.23128E-03        -1.38251E-03         4.49641E-01         3.59520E-01         4.49643E-01         3.15177E+03         1.00084E+00         7.45579E+01         3.14928E+03         2.80676E+03         3.42520E+02
+          7.15628E-03         2.40111E-03        -1.40723E-03         4.49641E-01         3.70190E-01         4.49643E-01         3.08770E+03         1.00084E+00         7.31683E+01         3.08507E+03         2.74626E+03         3.38809E+02
+          7.15628E-03         2.57094E-03        -1.43376E-03         4.49641E-01         3.80861E-01         4.49643E-01         3.02295E+03         1.00084E+00         7.17674E+01         3.02019E+03         2.68517E+03         3.35021E+02
+          7.15628E-03         2.74077E-03        -1.46209E-03         4.49641E-01         3.91532E-01         4.49643E-01         2.95763E+03         1.00084E+00         7.03572E+01         2.95473E+03         2.62358E+03         3.31157E+02
+          7.15628E-03         2.91059E-03        -1.49225E-03         4.49640E-01         4.02202E-01         4.49643E-01         2.89181E+03         1.00084E+00         6.89396E+01         2.88878E+03         2.56156E+03         3.27220E+02
+          7.15628E-03         3.08042E-03        -1.52421E-03         4.49640E-01         4.12873E-01         4.49643E-01         2.82556E+03         1.00084E+00         6.75166E+01         2.82241E+03         2.49920E+03         3.23215E+02
+          7.15628E-03         3.25025E-03        -1.55798E-03         4.49640E-01         4.23543E-01         4.49643E-01         2.75899E+03         1.00084E+00         6.60899E+01         2.75571E+03         2.43657E+03         3.19142E+02
+          7.15628E-03         3.42008E-03        -1.59357E-03         4.49640E-01         4.34214E-01         4.49642E-01         2.69216E+03         1.00084E+00         6.46615E+01         2.68877E+03         2.37376E+03         3.15006E+02
+          7.15628E-03         3.58990E-03        -1.63097E-03         4.49639E-01         4.44884E-01         4.49642E-01         2.62517E+03         1.00084E+00         6.32332E+01         2.62165E+03         2.31084E+03         3.10810E+02
+          7.15628E-03         3.75973E-03        -1.67018E-03         4.49639E-01         4.55555E-01         4.49642E-01         2.55808E+03         1.00084E+00         6.18066E+01         2.55445E+03         2.24790E+03         3.06557E+02
+          7.15628E-03         3.92956E-03        -1.71121E-03         4.49639E-01         4.66225E-01         4.49642E-01         2.49098E+03         1.00084E+00         6.03837E+01         2.48725E+03         2.18500E+03         3.02250E+02
+          7.15628E-03         4.09939E-03        -1.75404E-03         4.49638E-01         4.76896E-01         4.49642E-01         2.42394E+03         1.00084E+00         5.89660E+01         2.42011E+03         2.12222E+03         2.97892E+02
+          7.15628E-03         4.26921E-03        -1.79869E-03         4.49638E-01         4.87567E-01         4.49642E-01         2.35705E+03         1.00084E+00         5.75552E+01         2.35312E+03         2.05963E+03         2.93488E+02
+          7.15628E-03         4.43904E-03        -1.84515E-03         4.49638E-01         4.98237E-01         4.49642E-01         2.29037E+03         1.00084E+00         5.61529E+01         2.28635E+03         1.99731E+03         2.89040E+02
+          7.15628E-03         4.60887E-03        -1.89342E-03         4.49637E-01         5.08908E-01         4.49641E-01         2.22398E+03         1.00084E+00         5.47606E+01         2.21988E+03         1.93532E+03         2.84553E+02
+          7.15628E-03         4.77869E-03        -1.94351E-03         4.49637E-01         5.19578E-01         4.49641E-01         2.15796E+03         1.00084E+00         5.33798E+01         2.15377E+03         1.87374E+03         2.80029E+02
+          7.15628E-03         4.94852E-03        -1.99540E-03         4.49637E-01         5.30249E-01         4.49641E-01         2.09236E+03         1.00084E+00         5.20119E+01         2.08810E+03         1.81263E+03         2.75473E+02
+          7.15628E-03         5.11835E-03        -2.04911E-03         4.49636E-01         5.40919E-01         4.49641E-01         2.02726E+03         1.00084E+00         5.06583E+01         2.02293E+03         1.75204E+03         2.70888E+02
+          7.15628E-03         5.28818E-03        -2.10463E-03         4.49636E-01         5.51590E-01         4.49641E-01         1.96273E+03         1.00084E+00         4.93203E+01         1.95833E+03         1.69205E+03         2.66279E+02
+          7.15628E-03         5.45800E-03        -2.16197E-03         4.49636E-01         5.62261E-01         4.49641E-01         1.89882E+03         1.00084E+00         4.79990E+01         1.89437E+03         1.63272E+03         2.61649E+02
+          7.15628E-03         5.62783E-03        -2.22111E-03         4.49635E-01         5.72931E-01         4.49641E-01         1.83559E+03         1.00084E+00         4.66957E+01         1.83110E+03         1.57409E+03         2.57002E+02
+          7.15628E-03         5.79766E-03        -2.28207E-03         4.49635E-01         5.83602E-01         4.49640E-01         1.77311E+03         1.00084E+00         4.54114E+01         1.76858E+03         1.51624E+03         2.52342E+02
+          7.15628E-03         5.96749E-03        -2.34484E-03         4.49634E-01         5.94272E-01         4.49640E-01         1.71144E+03         1.00084E+00         4.41472E+01         1.70687E+03         1.45919E+03         2.47674E+02
+          7.15628E-03         6.13731E-03        -2.40942E-03         4.49634E-01         6.04943E-01         4.49640E-01         1.65062E+03         1.00084E+00         4.29040E+01         1.64602E+03         1.40302E+03         2.43000E+02
+          7.15628E-03         6.30714E-03        -2.47582E-03         4.49633E-01         6.15613E-01         4.49640E-01         1.59070E+03         1.00084E+00         4.16827E+01         1.58608E+03         1.34776E+03         2.38326E+02
+          7.15628E-03         6.47697E-03        -2.54402E-03         4.49633E-01         6.26284E-01         4.49640E-01         1.53174E+03         1.00084E+00         4.04840E+01         1.52711E+03         1.29345E+03         2.33655E+02
+          7.15628E-03         6.64680E-03        -2.61404E-03         4.49632E-01         6.36955E-01         4.49640E-01         1.47377E+03         1.00084E+00         3.93088E+01         1.46914E+03         1.24015E+03         2.28992E+02
+          7.15628E-03         6.81662E-03        -2.68587E-03         4.49632E-01         6.47625E-01         4.49640E-01         1.41686E+03         1.00084E+00         3.81577E+01         1.41222E+03         1.18788E+03         2.24341E+02
+          7.15628E-03         6.98645E-03        -2.75952E-03         4.49631E-01         6.58296E-01         4.49640E-01         1.36102E+03         1.00084E+00         3.70312E+01         1.35640E+03         1.13669E+03         2.19705E+02
+          7.15628E-03         7.15628E-03        -2.83497E-03         4.49631E-01         6.68966E-01         4.49640E-01         1.30630E+03         1.00084E+00         3.59299E+01         1.30170E+03         1.08661E+03         2.15089E+02
+          7.15628E-03         7.32611E-03        -2.91224E-03         4.49630E-01         6.79637E-01         4.49640E-01         1.25275E+03         1.00084E+00         3.48542E+01         1.24816E+03         1.03766E+03         2.10497E+02
+          7.15628E-03         7.49593E-03        -2.99132E-03         4.49630E-01         6.90307E-01         4.49640E-01         1.20037E+03         1.00084E+00         3.38044E+01         1.19582E+03         9.89887E+02         2.05934E+02
+          7.15628E-03         7.66576E-03        -3.07221E-03         4.49629E-01         7.00978E-01         4.49640E-01         1.14922E+03         1.00084E+00         3.27810E+01         1.14470E+03         9.43302E+02         2.01402E+02
+          7.15628E-03         7.83559E-03        -3.15492E-03         4.49628E-01         7.11649E-01         4.49640E-01         1.09931E+03         1.00084E+00         3.17841E+01         1.09484E+03         8.97931E+02         1.96907E+02
+          7.15628E-03         8.00542E-03        -3.23943E-03         4.49628E-01         7.22319E-01         4.49640E-01         1.05066E+03         1.00084E+00         3.08138E+01         1.04625E+03         8.53793E+02         1.92452E+02
+          7.15628E-03         8.17524E-03        -3.32576E-03         4.49627E-01         7.32990E-01         4.49640E-01         1.00330E+03         1.00084E+00         2.98704E+01         9.98947E+02         8.10907E+02         1.88040E+02
+          7.15628E-03         8.34507E-03        -3.41390E-03         4.49627E-01         7.43660E-01         4.49640E-01         9.57253E+02         1.00084E+00         2.89537E+01         9.52961E+02         7.69284E+02         1.83677E+02
+          7.15628E-03         8.51490E-03        -3.50386E-03         4.49626E-01         7.54331E-01         4.49640E-01         9.12523E+02         1.00084E+00         2.80639E+01         9.08304E+02         7.28938E+02         1.79366E+02
+          7.15628E-03         8.68473E-03        -3.59562E-03         4.49625E-01         7.65001E-01         4.49640E-01         8.69127E+02         1.00084E+00         2.72008E+01         8.64986E+02         6.89876E+02         1.75110E+02
+          7.15628E-03         8.85455E-03        -3.68920E-03         4.49625E-01         7.75672E-01         4.49640E-01         8.27075E+02         1.00084E+00         2.63643E+01         8.23019E+02         6.52106E+02         1.70912E+02
+          7.15628E-03         9.02438E-03        -3.78459E-03         4.49624E-01         7.86343E-01         4.49640E-01         7.86375E+02         1.00084E+00         2.55542E+01         7.82409E+02         6.15631E+02         1.66778E+02
+          7.15628E-03         9.19421E-03        -3.88179E-03         4.49623E-01         7.97013E-01         4.49640E-01         7.47031E+02         1.00084E+00         2.47702E+01         7.43161E+02         5.80451E+02         1.62709E+02
+          7.15628E-03         9.36403E-03        -3.98081E-03         4.49623E-01         8.07684E-01         4.49640E-01         7.09046E+02         1.00084E+00         2.40122E+01         7.05277E+02         5.46567E+02         1.58710E+02
+          7.15628E-03         9.53386E-03        -4.08164E-03         4.49622E-01         8.18354E-01         4.49640E-01         6.72420E+02         1.00084E+00         2.32799E+01         6.68757E+02         5.13974E+02         1.54783E+02
+          7.15628E-03         9.70369E-03        -4.18428E-03         4.49621E-01         8.29025E-01         4.49641E-01         6.37150E+02         1.00084E+00         2.25727E+01         6.33598E+02         4.82667E+02         1.50931E+02
+          7.15628E-03         9.87352E-03        -4.28873E-03         4.49620E-01         8.39695E-01         4.49641E-01         6.03232E+02         1.00084E+00         2.18904E+01         5.99796E+02         4.52638E+02         1.47158E+02
+          7.15628E-03         1.00433E-02        -4.39499E-03         4.49620E-01         8.50366E-01         4.49641E-01         5.70658E+02         1.00084E+00         2.12326E+01         5.67342E+02         4.23876E+02         1.43466E+02
+          7.15628E-03         1.02132E-02        -4.50307E-03         4.49619E-01         8.61037E-01         4.49641E-01         5.39420E+02         1.00084E+00         2.05988E+01         5.36228E+02         3.96370E+02         1.39857E+02
+          7.15628E-03         1.03830E-02        -4.61296E-03         4.49618E-01         8.71707E-01         4.49642E-01         5.09506E+02         1.00084E+00         1.99886E+01         5.06441E+02         3.70106E+02         1.36335E+02
+          7.15628E-03         1.05528E-02        -4.72466E-03         4.49617E-01         8.82378E-01         4.49642E-01         4.80902E+02         1.00084E+00         1.94014E+01         4.77969E+02         3.45068E+02         1.32902E+02
+          7.15628E-03         1.07227E-02        -4.83818E-03         4.49616E-01         8.93048E-01         4.49642E-01         4.53595E+02         1.00084E+00         1.88369E+01         4.50796E+02         3.21237E+02         1.29558E+02
+          7.15628E-03         1.08925E-02        -4.95350E-03         4.49616E-01         9.03719E-01         4.49643E-01         4.27566E+02         1.00084E+00         1.82945E+01         4.24903E+02         2.98595E+02         1.26308E+02
+          7.15628E-03         1.10623E-02        -5.07064E-03         4.49615E-01         9.14389E-01         4.49643E-01         4.02797E+02         1.00084E+00         1.77737E+01         4.00273E+02         2.77121E+02         1.23152E+02
+          7.15628E-03         1.12321E-02        -5.18959E-03         4.49614E-01         9.25060E-01         4.49644E-01         3.79267E+02         1.00084E+00         1.72739E+01         3.76884E+02         2.56793E+02         1.20091E+02
+          7.15628E-03         1.14020E-02        -5.31036E-03         4.49613E-01         9.35731E-01         4.49644E-01         3.56955E+02         1.00084E+00         1.67948E+01         3.54715E+02         2.37586E+02         1.17128E+02
+          7.15628E-03         1.15718E-02        -5.43294E-03         4.49612E-01         9.46401E-01         4.49645E-01         3.35836E+02         1.00084E+00         1.63358E+01         3.33740E+02         2.19476E+02         1.14263E+02
+          7.15628E-03         1.17416E-02        -5.55732E-03         4.49611E-01         9.57072E-01         4.49646E-01         3.15887E+02         1.00084E+00         1.58965E+01         3.13935E+02         2.02437E+02         1.11498E+02
+          7.15628E-03         1.19114E-02        -5.68353E-03         4.49610E-01         9.67742E-01         4.49646E-01         2.97080E+02         1.00084E+00         1.54762E+01         2.95274E+02         1.86441E+02         1.08833E+02
+          7.15628E-03         1.20813E-02        -5.81154E-03         4.49609E-01         9.78413E-01         4.49647E-01         2.79389E+02         1.00084E+00         1.50746E+01         2.77728E+02         1.71459E+02         1.06269E+02
+          7.15628E-03         1.22511E-02        -5.94137E-03         4.49609E-01         9.89083E-01         4.49648E-01         2.62784E+02         1.00084E+00         1.46912E+01         2.61269E+02         1.57463E+02         1.03806E+02
+          7.15628E-03         1.24209E-02        -6.07301E-03         4.49608E-01         9.99754E-01         4.49649E-01         2.47238E+02         1.00084E+00         1.43255E+01         2.45868E+02         1.44424E+02         1.01444E+02
+          7.15628E-03         1.25908E-02        -6.20646E-03         4.49607E-01         1.01042E+00         4.49649E-01         2.32718E+02         1.00084E+00         1.39771E+01         2.31493E+02         1.32309E+02         9.91837E+01
+          7.15628E-03         1.27606E-02        -6.34172E-03         4.49606E-01         1.02110E+00         4.49650E-01         2.19195E+02         1.00084E+00         1.36455E+01         2.18113E+02         1.21088E+02         9.70243E+01
+          7.15628E-03         1.29304E-02        -6.47880E-03         4.49605E-01         1.03177E+00         4.49651E-01         2.06636E+02         1.00084E+00         1.33304E+01         2.05695E+02         1.10730E+02         9.49656E+01
+          7.15628E-03         1.31002E-02        -6.61769E-03         4.49604E-01         1.04244E+00         4.49652E-01         1.95009E+02         1.00084E+00         1.30313E+01         1.94208E+02         1.01202E+02         9.30069E+01
+          7.15628E-03         1.32701E-02        -6.75839E-03         4.49603E-01         1.05311E+00         4.49653E-01         1.84281E+02         1.00084E+00         1.27478E+01         1.83618E+02         9.24711E+01         9.11473E+01
+          7.15628E-03         1.34399E-02        -6.90090E-03         4.49602E-01         1.06378E+00         4.49655E-01         1.74418E+02         1.00084E+00         1.24795E+01         1.73892E+02         8.45057E+01         8.93859E+01
+          7.15628E-03         1.36097E-02        -7.04523E-03         4.49601E-01         1.07445E+00         4.49656E-01         1.65387E+02         1.00084E+00         1.22261E+01         1.64994E+02         7.72728E+01         8.77213E+01
+          7.15628E-03         1.37795E-02        -7.19137E-03         4.49600E-01         1.08512E+00         4.49657E-01         1.57155E+02         1.00084E+00         1.19872E+01         1.56892E+02         7.07394E+01         8.61521E+01
+          7.15628E-03         1.39494E-02        -7.33932E-03         4.49598E-01         1.09579E+00         4.49658E-01         1.49686E+02         1.00084E+00         1.17623E+01         1.49550E+02         6.48729E+01         8.46768E+01
+          7.15628E-03         1.41192E-02        -7.48909E-03         4.49597E-01         1.10646E+00         4.49660E-01         1.42947E+02         1.00084E+00         1.15511E+01         1.42934E+02         5.96406E+01         8.32935E+01
+          7.15628E-03         1.42890E-02        -7.64066E-03         4.49596E-01         1.11713E+00         4.49661E-01         1.36903E+02         1.00084E+00         1.13532E+01         1.37010E+02         5.50101E+01         8.20003E+01
+          7.15628E-03         1.44589E-02        -7.79405E-03         4.49595E-01         1.12780E+00         4.49663E-01         1.31522E+02         1.00084E+00         1.11682E+01         1.31744E+02         5.09493E+01         8.07951E+01
+          7.15628E-03         1.46287E-02        -7.94926E-03         4.49594E-01         1.13847E+00         4.49664E-01         1.26767E+02         1.00084E+00         1.09957E+01         1.27102E+02         4.74262E+01         7.96756E+01
+          7.15628E-03         1.47985E-02        -8.10627E-03         4.49593E-01         1.14914E+00         4.49666E-01         1.22607E+02         1.00084E+00         1.08354E+01         1.23049E+02         4.44096E+01         7.86393E+01
+          7.15628E-03         1.49683E-02        -8.26510E-03         4.49592E-01         1.15981E+00         4.49668E-01         1.19007E+02         1.00084E+00         1.06867E+01         1.19552E+02         4.18683E+01         7.76837E+01
+          7.15628E-03         1.51382E-02        -8.42574E-03         4.49591E-01         1.17048E+00         4.49670E-01         1.15936E+02         1.00084E+00         1.05492E+01         1.16578E+02         3.97721E+01         7.68060E+01
+          7.15628E-03         1.53080E-02        -8.58819E-03         4.49590E-01         1.18115E+00         4.49672E-01         1.13359E+02         1.00084E+00         1.04226E+01         1.14095E+02         3.80910E+01         7.60035E+01
+          7.15628E-03         1.54778E-02        -8.75246E-03         4.49588E-01         1.19182E+00         4.49674E-01         1.11245E+02         1.00084E+00         1.03063E+01         1.12069E+02         3.67959E+01         7.52732E+01
+          7.15628E-03         1.56476E-02        -8.91854E-03         4.49587E-01         1.20249E+00         4.49676E-01         1.09564E+02         1.00084E+00         1.02000E+01         1.10470E+02         3.58583E+01         7.46120E+01
+          7.15628E-03         1.58175E-02        -9.08643E-03         4.49586E-01         1.21317E+00         4.49678E-01         1.08283E+02         1.00084E+00         1.01030E+01         1.09267E+02         3.52503E+01         7.40167E+01
+          7.15628E-03         1.59873E-02        -9.25614E-03         4.49585E-01         1.22384E+00         4.49680E-01         1.07373E+02         1.00084E+00         1.00150E+01         1.08429E+02         3.49450E+01         7.34843E+01
+          7.15628E-03         1.61571E-02        -9.42765E-03         4.49584E-01         1.23451E+00         4.49682E-01         1.06805E+02         1.00084E+00         9.93543E+00         1.07927E+02         3.49161E+01         7.30112E+01
+          7.15628E-03         1.63270E-02        -9.60098E-03         4.49582E-01         1.24518E+00         4.49685E-01         1.06549E+02         1.00084E+00         9.86380E+00         1.07733E+02         3.51382E+01         7.25943E+01
+          7.15628E-03         1.64968E-02        -9.77613E-03         4.49581E-01         1.25585E+00         4.49687E-01         1.06578E+02         1.00084E+00         9.79960E+00         1.07817E+02         3.55870E+01         7.22300E+01
+          7.15628E-03         1.66666E-02        -9.95308E-03         4.49580E-01         1.26652E+00         4.49690E-01         1.06864E+02         1.00084E+00         9.74232E+00         1.08153E+02         3.62387E+01         7.19148E+01
+          7.15628E-03         1.68364E-02        -1.01319E-02         4.49579E-01         1.27719E+00         4.49693E-01         1.07383E+02         1.00084E+00         9.69145E+00         1.08716E+02         3.70706E+01         7.16454E+01
+          7.15628E-03         1.70063E-02        -1.03124E-02         4.49577E-01         1.28786E+00         4.49695E-01         1.08107E+02         1.00084E+00         9.64649E+00         1.09479E+02         3.80610E+01         7.14182E+01
+          7.15628E-03         1.71761E-02        -1.04948E-02         4.49576E-01         1.29853E+00         4.49698E-01         1.09014E+02         1.00084E+00         9.60692E+00         1.10419E+02         3.91892E+01         7.12296E+01
+          7.15628E-03         1.73459E-02        -1.06790E-02         4.49575E-01         1.30920E+00         4.49701E-01         1.10079E+02         1.00084E+00         9.57225E+00         1.11511E+02         4.04351E+01         7.10762E+01
+          7.15628E-03         1.75158E-02        -1.08651E-02         4.49573E-01         1.31987E+00         4.49705E-01         1.11280E+02         1.00084E+00         9.54199E+00         1.12734E+02         4.17801E+01         7.09544E+01
+          7.15628E-03         1.76856E-02        -1.10529E-02         4.49572E-01         1.33054E+00         4.49708E-01         1.12597E+02         1.00084E+00         9.51565E+00         1.14067E+02         4.32060E+01         7.08608E+01
+          7.15628E-03         1.78554E-02        -1.12425E-02         4.49571E-01         1.34121E+00         4.49711E-01         1.14007E+02         1.00084E+00         9.49277E+00         1.15488E+02         4.46961E+01         7.07920E+01
+          7.15628E-03         1.80252E-02        -1.14340E-02         4.49569E-01         1.35188E+00         4.49715E-01         1.15492E+02         1.00084E+00         9.47288E+00         1.16979E+02         4.62343E+01         7.07445E+01
+          7.15628E-03         1.81951E-02        -1.16273E-02         4.49568E-01         1.36255E+00         4.49718E-01         1.17034E+02         1.00084E+00         9.45556E+00         1.18521E+02         4.78057E+01         7.07150E+01
+          7.15628E-03         1.83649E-02        -1.18224E-02         4.49566E-01         1.37322E+00         4.49722E-01         1.18614E+02         1.00084E+00         9.44037E+00         1.20096E+02         4.93962E+01         7.07002E+01
+          7.15628E-03         1.85347E-02        -1.20193E-02         4.49565E-01         1.38389E+00         4.49726E-01         1.20217E+02         1.00084E+00         9.42691E+00         1.21690E+02         5.09926E+01         7.06970E+01
+          7.15628E-03         1.87045E-02        -1.22180E-02         4.49564E-01         1.39457E+00         4.49730E-01         1.21828E+02         1.00084E+00         9.41480E+00         1.23285E+02         5.25830E+01         7.07023E+01
+          7.15628E-03         1.88744E-02        -1.24185E-02         4.49562E-01         1.40524E+00         4.49734E-01         1.23431E+02         1.00084E+00         9.40366E+00         1.24869E+02         5.41560E+01         7.07129E+01
+          7.15628E-03         1.90442E-02        -1.26208E-02         4.49561E-01         1.41591E+00         4.49738E-01         1.25013E+02         1.00084E+00         9.39315E+00         1.26427E+02         5.57013E+01         7.07261E+01
+          7.15628E-03         1.92140E-02        -1.28250E-02         4.49559E-01         1.42658E+00         4.49742E-01         1.26562E+02         1.00084E+00         9.38293E+00         1.27948E+02         5.72094E+01         7.07389E+01
+          7.15628E-03         1.93839E-02        -1.30309E-02         4.49558E-01         1.43725E+00         4.49747E-01         1.28067E+02         1.00084E+00         9.37270E+00         1.29421E+02         5.86719E+01         7.07487E+01
+          7.15628E-03         1.95537E-02        -1.32387E-02         4.49556E-01         1.44792E+00         4.49751E-01         1.29516E+02         1.00084E+00         9.36217E+00         1.30834E+02         6.00809E+01         7.07529E+01
+          7.15628E-03         1.97235E-02        -1.34483E-02         4.49555E-01         1.45859E+00         4.49756E-01         1.30901E+02         1.00084E+00         9.35107E+00         1.32179E+02         6.14295E+01         7.07491E+01
+          7.15628E-03         1.98933E-02        -1.36597E-02         4.49553E-01         1.46926E+00         4.49761E-01         1.32213E+02         1.00084E+00         9.33916E+00         1.33447E+02         6.27117E+01         7.07349E+01
+          7.15628E-03         2.00632E-02        -1.38729E-02         4.49552E-01         1.47993E+00         4.49766E-01         1.33444E+02         1.00084E+00         9.32619E+00         1.34630E+02         6.39220E+01         7.07082E+01
+          7.15628E-03         2.02330E-02        -1.40880E-02         4.49550E-01         1.49060E+00         4.49771E-01         1.34586E+02         1.00084E+00         9.31196E+00         1.35723E+02         6.50559E+01         7.06669E+01
+          7.15628E-03         2.04028E-02        -1.43048E-02         4.49549E-01         1.50127E+00         4.49776E-01         1.35635E+02         1.00084E+00         9.29628E+00         1.36718E+02         6.61094E+01         7.06091E+01
+          7.15628E-03         2.05726E-02        -1.45235E-02         4.49547E-01         1.51194E+00         4.49782E-01         1.36585E+02         1.00084E+00         9.27897E+00         1.37612E+02         6.70792E+01         7.05330E+01
+          7.15628E-03         2.07425E-02        -1.47439E-02         4.49546E-01         1.52261E+00         4.49787E-01         1.37430E+02         1.00084E+00         9.25987E+00         1.38400E+02         6.79628E+01         7.04371E+01
+          7.15628E-03         2.09123E-02        -1.49662E-02         4.49544E-01         1.53328E+00         4.49793E-01         1.38169E+02         1.00083E+00         9.23883E+00         1.39078E+02         6.87581E+01         7.03200E+01
+          7.15628E-03         2.10821E-02        -1.51903E-02         4.49542E-01         1.54395E+00         4.49799E-01         1.38797E+02         1.00083E+00         9.21573E+00         1.39644E+02         6.94638E+01         7.01802E+01
+          7.15628E-03         2.12520E-02        -1.54162E-02         4.49541E-01         1.55462E+00         4.49805E-01         1.39312E+02         1.00083E+00         9.19047E+00         1.40096E+02         7.00789E+01         7.00167E+01
+          7.15628E-03         2.14218E-02        -1.56439E-02         4.49539E-01         1.56529E+00         4.49811E-01         1.39714E+02         1.00083E+00         9.16293E+00         1.40432E+02         7.06032E+01         6.98284E+01
+          7.15628E-03         2.15916E-02        -1.58735E-02         4.49537E-01         1.57596E+00         4.49818E-01         1.40000E+02         1.00083E+00         9.13303E+00         1.40651E+02         7.10368E+01         6.96146E+01
+          7.15628E-03         2.17614E-02        -1.61048E-02         4.49536E-01         1.58664E+00         4.49824E-01         1.40171E+02         1.00083E+00         9.10071E+00         1.40755E+02         7.13802E+01         6.93744E+01
+          7.15628E-03         2.19313E-02        -1.63380E-02         4.49534E-01         1.59731E+00         4.49831E-01         1.40227E+02         1.00083E+00         9.06590E+00         1.40742E+02         7.16344E+01         6.91075E+01
+          7.15628E-03         2.21011E-02        -1.65730E-02         4.49532E-01         1.60798E+00         4.49838E-01         1.40168E+02         1.00083E+00         9.02855E+00         1.40614E+02         7.18009E+01         6.88133E+01
+          7.15628E-03         2.22709E-02        -1.68097E-02         4.49531E-01         1.61865E+00         4.49845E-01         1.39996E+02         1.00083E+00         8.98863E+00         1.40373E+02         7.18814E+01         6.84916E+01
+          7.15628E-03         2.24407E-02        -1.70484E-02         4.49529E-01         1.62932E+00         4.49852E-01         1.39712E+02         1.00083E+00         8.94611E+00         1.40020E+02         7.18779E+01         6.81423E+01
+          7.15628E-03         2.26106E-02        -1.72888E-02         4.49527E-01         1.63999E+00         4.49860E-01         1.39319E+02         1.00083E+00         8.90098E+00         1.39558E+02         7.17928E+01         6.77654E+01
+          7.15628E-03         2.27804E-02        -1.75310E-02         4.49526E-01         1.65066E+00         4.49867E-01         1.38819E+02         1.00083E+00         8.85321E+00         1.38990E+02         7.16287E+01         6.73609E+01
+          7.15628E-03         2.29502E-02        -1.77750E-02         4.49524E-01         1.66133E+00         4.49875E-01         1.38216E+02         1.00083E+00         8.80282E+00         1.38318E+02         7.13884E+01         6.69293E+01
+          7.15628E-03         2.31201E-02        -1.80209E-02         4.49522E-01         1.67200E+00         4.49883E-01         1.37511E+02         1.00083E+00         8.74980E+00         1.37546E+02         7.10751E+01         6.64709E+01
+          7.15628E-03         2.32899E-02        -1.82686E-02         4.49520E-01         1.68267E+00         4.49891E-01         1.36709E+02         1.00083E+00         8.69418E+00         1.36678E+02         7.06919E+01         6.59861E+01
+          7.15628E-03         2.34597E-02        -1.85181E-02         4.49518E-01         1.69334E+00         4.49900E-01         1.35814E+02         1.00083E+00         8.63598E+00         1.35718E+02         7.02423E+01         6.54756E+01
+          7.15628E-03         2.36295E-02        -1.87694E-02         4.49517E-01         1.70401E+00         4.49908E-01         1.34830E+02         1.00083E+00         8.57521E+00         1.34670E+02         6.97297E+01         6.49401E+01
+          7.15628E-03         2.37994E-02        -1.90225E-02         4.49515E-01         1.71468E+00         4.49917E-01         1.33760E+02         1.00083E+00         8.51193E+00         1.33538E+02         6.91577E+01         6.43804E+01
+          7.15628E-03         2.39692E-02        -1.92774E-02         4.49513E-01         1.72535E+00         4.49926E-01         1.32610E+02         1.00083E+00         8.44616E+00         1.32327E+02         6.85300E+01         6.37975E+01
+          7.15628E-03         2.41390E-02        -1.95341E-02         4.49511E-01         1.73602E+00         4.49935E-01         1.31384E+02         1.00083E+00         8.37795E+00         1.31043E+02         6.78505E+01         6.31922E+01
+          7.15628E-03         2.43088E-02        -1.97927E-02         4.49509E-01         1.74669E+00         4.49945E-01         1.30086E+02         1.00083E+00         8.30735E+00         1.29688E+02         6.71228E+01         6.25656E+01
+          7.15628E-03         2.44787E-02        -2.00530E-02         4.49508E-01         1.75736E+00         4.49955E-01         1.28721E+02         1.00083E+00         8.23442E+00         1.28270E+02         6.63508E+01         6.19189E+01
+          7.15628E-03         2.46485E-02        -2.03152E-02         4.49506E-01         1.76804E+00         4.49964E-01         1.27295E+02         1.00083E+00         8.15920E+00         1.26791E+02         6.55382E+01         6.12532E+01
+          7.15628E-03         2.48183E-02        -2.05792E-02         4.49504E-01         1.77871E+00         4.49975E-01         1.25812E+02         1.00083E+00         8.08177E+00         1.25259E+02         6.46888E+01         6.05699E+01
+          7.15628E-03         2.49882E-02        -2.08450E-02         4.49502E-01         1.78938E+00         4.49985E-01         1.24277E+02         1.00083E+00         8.00218E+00         1.23676E+02         6.38064E+01         5.98701E+01
+          7.15628E-03         2.51580E-02        -2.11126E-02         4.49500E-01         1.80005E+00         4.49995E-01         1.22695E+02         1.00083E+00         7.92051E+00         1.22050E+02         6.28946E+01         5.91553E+01
+          7.15628E-03         2.53278E-02        -2.13821E-02         4.49498E-01         1.81072E+00         4.50006E-01         1.21070E+02         1.00083E+00         7.83682E+00         1.20384E+02         6.19570E+01         5.84267E+01
+          7.15628E-03         2.54976E-02        -2.16533E-02         4.49496E-01         1.82139E+00         4.50017E-01         1.19408E+02         1.00083E+00         7.75119E+00         1.18683E+02         6.09972E+01         5.76859E+01
+          7.15628E-03         2.56675E-02        -2.19264E-02         4.49494E-01         1.83206E+00         4.50029E-01         1.17714E+02         1.00083E+00         7.66370E+00         1.16953E+02         6.00186E+01         5.69341E+01
+          7.15628E-03         2.58373E-02        -2.22013E-02         4.49492E-01         1.84273E+00         4.50040E-01         1.15992E+02         1.00083E+00         7.57442E+00         1.15197E+02         5.90246E+01         5.61728E+01
+          7.15628E-03         2.60071E-02        -2.24780E-02         4.49490E-01         1.85340E+00         4.50052E-01         1.14247E+02         1.00083E+00         7.48344E+00         1.13422E+02         5.80184E+01         5.54035E+01
+          7.15628E-03         2.61769E-02        -2.27565E-02         4.49488E-01         1.86407E+00         4.50064E-01         1.12483E+02         1.00083E+00         7.39083E+00         1.11631E+02         5.70030E+01         5.46275E+01
+          7.32611E-03         8.72665E-04        -1.32730E-03         4.60313E-01         2.74155E-01         4.60315E-01         3.23934E+03         1.00053E+00         6.77943E+01         3.23926E+03         2.91230E+03         3.26954E+02
+          7.32611E-03         1.04249E-03        -1.33752E-03         4.60313E-01         2.84826E-01         4.60315E-01         3.19058E+03         1.00053E+00         6.68221E+01         3.19039E+03         2.86588E+03         3.24509E+02
+          7.32611E-03         1.21232E-03        -1.34955E-03         4.60312E-01         2.95496E-01         4.60314E-01         3.14065E+03         1.00053E+00         6.58287E+01         3.14034E+03         2.81836E+03         3.21985E+02
+          7.32611E-03         1.38215E-03        -1.36339E-03         4.60312E-01         3.06167E-01         4.60314E-01         3.08962E+03         1.00053E+00         6.48155E+01         3.08920E+03         2.76981E+03         3.19382E+02
+          7.32611E-03         1.55197E-03        -1.37905E-03         4.60312E-01         3.16838E-01         4.60314E-01         3.03755E+03         1.00053E+00         6.37840E+01         3.03701E+03         2.72031E+03         3.16703E+02
+          7.32611E-03         1.72180E-03        -1.39651E-03         4.60312E-01         3.27508E-01         4.60314E-01         2.98451E+03         1.00053E+00         6.27358E+01         2.98386E+03         2.66991E+03         3.13948E+02
+          7.32611E-03         1.89163E-03        -1.41579E-03         4.60312E-01         3.38179E-01         4.60314E-01         2.93059E+03         1.00053E+00         6.16726E+01         2.92982E+03         2.61870E+03         3.11121E+02
+          7.32611E-03         2.06146E-03        -1.43688E-03         4.60312E-01         3.48849E-01         4.60314E-01         2.87584E+03         1.00053E+00         6.05957E+01         2.87496E+03         2.56673E+03         3.08221E+02
+          7.32611E-03         2.23128E-03        -1.45978E-03         4.60312E-01         3.59520E-01         4.60314E-01         2.82034E+03         1.00053E+00         5.95069E+01         2.81934E+03         2.51409E+03         3.05252E+02
+          7.32611E-03         2.40111E-03        -1.48450E-03         4.60311E-01         3.70190E-01         4.60314E-01         2.76416E+03         1.00053E+00         5.84076E+01         2.76305E+03         2.46084E+03         3.02214E+02
+          7.32611E-03         2.57094E-03        -1.51103E-03         4.60311E-01         3.80861E-01         4.60314E-01         2.70738E+03         1.00053E+00         5.72995E+01         2.70615E+03         2.40704E+03         2.99110E+02
+          7.32611E-03         2.74077E-03        -1.53936E-03         4.60311E-01         3.91532E-01         4.60314E-01         2.65006E+03         1.00053E+00         5.61839E+01         2.64872E+03         2.35278E+03         2.95942E+02
+          7.32611E-03         2.91059E-03        -1.56951E-03         4.60311E-01         4.02202E-01         4.60314E-01         2.59228E+03         1.00053E+00         5.50626E+01         2.59083E+03         2.29812E+03         2.92711E+02
+          7.32611E-03         3.08042E-03        -1.60148E-03         4.60311E-01         4.12873E-01         4.60313E-01         2.53411E+03         1.00053E+00         5.39369E+01         2.53256E+03         2.24314E+03         2.89421E+02
+          7.32611E-03         3.25025E-03        -1.63525E-03         4.60310E-01         4.23543E-01         4.60313E-01         2.47563E+03         1.00053E+00         5.28084E+01         2.47396E+03         2.18789E+03         2.86072E+02
+          7.32611E-03         3.42008E-03        -1.67084E-03         4.60310E-01         4.34214E-01         4.60313E-01         2.41689E+03         1.00053E+00         5.16785E+01         2.41512E+03         2.13246E+03         2.82667E+02
+          7.32611E-03         3.58990E-03        -1.70824E-03         4.60310E-01         4.44884E-01         4.60313E-01         2.35798E+03         1.00053E+00         5.05486E+01         2.35611E+03         2.07690E+03         2.79208E+02
+          7.32611E-03         3.75973E-03        -1.74745E-03         4.60310E-01         4.55555E-01         4.60313E-01         2.29896E+03         1.00053E+00         4.94203E+01         2.29699E+03         2.02129E+03         2.75697E+02
+          7.32611E-03         3.92956E-03        -1.78848E-03         4.60309E-01         4.66225E-01         4.60313E-01         2.23990E+03         1.00053E+00         4.82947E+01         2.23783E+03         1.96570E+03         2.72138E+02
+          7.32611E-03         4.09939E-03        -1.83131E-03         4.60309E-01         4.76896E-01         4.60313E-01         2.18087E+03         1.00053E+00         4.71733E+01         2.17871E+03         1.91018E+03         2.68531E+02
+          7.32611E-03         4.26921E-03        -1.87596E-03         4.60309E-01         4.87567E-01         4.60312E-01         2.12193E+03         1.00053E+00         4.60574E+01         2.11968E+03         1.85480E+03         2.64881E+02
+          7.32611E-03         4.43904E-03        -1.92242E-03         4.60308E-01         4.98237E-01         4.60312E-01         2.06315E+03         1.00053E+00         4.49481E+01         2.06082E+03         1.79963E+03         2.61188E+02
+          7.32611E-03         4.60887E-03        -1.97069E-03         4.60308E-01         5.08908E-01         4.60312E-01         2.00460E+03         1.00053E+00         4.38468E+01         2.00218E+03         1.74473E+03         2.57456E+02
+          7.32611E-03         4.77869E-03        -2.02078E-03         4.60308E-01         5.19578E-01         4.60312E-01         1.94633E+03         1.00053E+00         4.27546E+01         1.94383E+03         1.69015E+03         2.53688E+02
+          7.32611E-03         4.94852E-03        -2.07267E-03         4.60307E-01         5.30249E-01         4.60312E-01         1.88840E+03         1.00053E+00         4.16726E+01         1.88584E+03         1.63595E+03         2.49885E+02
+          7.32611E-03         5.11835E-03        -2.12638E-03         4.60307E-01         5.40919E-01         4.60312E-01         1.83088E+03         1.00053E+00         4.06019E+01         1.82825E+03         1.58220E+03         2.46051E+02
+          7.32611E-03         5.28818E-03        -2.18190E-03         4.60306E-01         5.51590E-01         4.60312E-01         1.77382E+03         1.00053E+00         3.95435E+01         1.77112E+03         1.52893E+03         2.42189E+02
+          7.32611E-03         5.45800E-03        -2.23924E-03         4.60306E-01         5.62261E-01         4.60311E-01         1.71728E+03         1.00053E+00         3.84983E+01         1.71452E+03         1.47622E+03         2.38302E+02
+          7.32611E-03         5.62783E-03        -2.29838E-03         4.60306E-01         5.72931E-01         4.60311E-01         1.66131E+03         1.00053E+00         3.74674E+01         1.65850E+03         1.42411E+03         2.34391E+02
+          7.32611E-03         5.79766E-03        -2.35934E-03         4.60305E-01         5.83602E-01         4.60311E-01         1.60596E+03         1.00053E+00         3.64515E+01         1.60310E+03         1.37264E+03         2.30461E+02
+          7.32611E-03         5.96749E-03        -2.42211E-03         4.60305E-01         5.94272E-01         4.60311E-01         1.55128E+03         1.00053E+00         3.54514E+01         1.54838E+03         1.32186E+03         2.26514E+02
+          7.32611E-03         6.13731E-03        -2.48669E-03         4.60304E-01         6.04943E-01         4.60311E-01         1.49733E+03         1.00053E+00         3.44679E+01         1.49438E+03         1.27182E+03         2.22554E+02
+          7.32611E-03         6.30714E-03        -2.55309E-03         4.60304E-01         6.15613E-01         4.60311E-01         1.44413E+03         1.00053E+00         3.35017E+01         1.44115E+03         1.22257E+03         2.18583E+02
+          7.32611E-03         6.47697E-03        -2.62129E-03         4.60303E-01         6.26284E-01         4.60311E-01         1.39174E+03         1.00053E+00         3.25534E+01         1.38873E+03         1.17413E+03         2.14605E+02
+          7.32611E-03         6.64680E-03        -2.69131E-03         4.60303E-01         6.36955E-01         4.60311E-01         1.34020E+03         1.00053E+00         3.16236E+01         1.33717E+03         1.12655E+03         2.10622E+02
+          7.32611E-03         6.81662E-03        -2.76314E-03         4.60302E-01         6.47625E-01         4.60310E-01         1.28955E+03         1.00053E+00         3.07128E+01         1.28650E+03         1.07986E+03         2.06639E+02
+          7.32611E-03         6.98645E-03        -2.83678E-03         4.60302E-01         6.58296E-01         4.60310E-01         1.23982E+03         1.00053E+00         2.98215E+01         1.23675E+03         1.03410E+03         2.02657E+02
+          7.32611E-03         7.15628E-03        -2.91224E-03         4.60301E-01         6.68966E-01         4.60310E-01         1.19104E+03         1.00053E+00         2.89500E+01         1.18797E+03         9.89289E+02         1.98681E+02
+          7.32611E-03         7.32611E-03        -2.98951E-03         4.60300E-01         6.79637E-01         4.60310E-01         1.14326E+03         1.00053E+00         2.80988E+01         1.14018E+03         9.45467E+02         1.94714E+02
+          7.32611E-03         7.49593E-03        -3.06859E-03         4.60300E-01         6.90307E-01         4.60310E-01         1.09649E+03         1.00053E+00         2.72681E+01         1.09342E+03         9.02656E+02         1.90759E+02
+          7.32611E-03         7.66576E-03        -3.14948E-03         4.60299E-01         7.00978E-01         4.60310E-01         1.05076E+03         1.00053E+00         2.64581E+01         1.04770E+03         8.60878E+02         1.86820E+02
+          7.32611E-03         7.83559E-03        -3.23218E-03         4.60299E-01         7.11649E-01         4.60310E-01         1.00610E+03         1.00053E+00         2.56690E+01         1.00305E+03         8.20155E+02         1.82899E+02
+          7.32611E-03         8.00542E-03        -3.31670E-03         4.60298E-01         7.22319E-01         4.60310E-01         9.62531E+02         1.00053E+00         2.49010E+01         9.59505E+02         7.80505E+02         1.79000E+02
+          7.32611E-03         8.17524E-03        -3.40303E-03         4.60297E-01         7.32990E-01         4.60310E-01         9.20072E+02         1.00053E+00         2.41541E+01         9.17072E+02         7.41945E+02         1.75127E+02
+          7.32611E-03         8.34507E-03        -3.49117E-03         4.60297E-01         7.43660E-01         4.60310E-01         8.78740E+02         1.00053E+00         2.34284E+01         8.75770E+02         7.04488E+02         1.71282E+02
+          7.32611E-03         8.51490E-03        -3.58112E-03         4.60296E-01         7.54331E-01         4.60310E-01         8.38550E+02         1.00053E+00         2.27238E+01         8.35615E+02         6.68146E+02         1.67469E+02
+          7.32611E-03         8.68473E-03        -3.67289E-03         4.60295E-01         7.65001E-01         4.60310E-01         7.99514E+02         1.00053E+00         2.20403E+01         7.96620E+02         6.32928E+02         1.63691E+02
+          7.32611E-03         8.85455E-03        -3.76647E-03         4.60295E-01         7.75672E-01         4.60310E-01         7.61643E+02         1.00053E+00         2.13777E+01         7.58794E+02         5.98842E+02         1.59952E+02
+          7.32611E-03         9.02438E-03        -3.86186E-03         4.60294E-01         7.86343E-01         4.60310E-01         7.24945E+02         1.00053E+00         2.07360E+01         7.22146E+02         5.65892E+02         1.56254E+02
+          7.32611E-03         9.19421E-03        -3.95906E-03         4.60293E-01         7.97013E-01         4.60310E-01         6.89426E+02         1.00053E+00         2.01150E+01         6.86681E+02         5.34080E+02         1.52601E+02
+          7.32611E-03         9.36403E-03        -4.05808E-03         4.60293E-01         8.07684E-01         4.60311E-01         6.55090E+02         1.00053E+00         1.95143E+01         6.52404E+02         5.03408E+02         1.48996E+02
+          7.32611E-03         9.53386E-03        -4.15890E-03         4.60292E-01         8.18354E-01         4.60311E-01         6.21938E+02         1.00053E+00         1.89339E+01         6.19314E+02         4.73873E+02         1.45442E+02
+          7.32611E-03         9.70369E-03        -4.26154E-03         4.60291E-01         8.29025E-01         4.60311E-01         5.89969E+02         1.00053E+00         1.83734E+01         5.87413E+02         4.45472E+02         1.41941E+02
+          7.32611E-03         9.87352E-03        -4.36600E-03         4.60290E-01         8.39695E-01         4.60311E-01         5.59182E+02         1.00053E+00         1.78325E+01         5.56696E+02         4.18199E+02         1.38497E+02
+          7.32611E-03         1.00433E-02        -4.47226E-03         4.60290E-01         8.50366E-01         4.60311E-01         5.29571E+02         1.00053E+00         1.73109E+01         5.27160E+02         3.92048E+02         1.35112E+02
+          7.32611E-03         1.02132E-02        -4.58034E-03         4.60289E-01         8.61037E-01         4.60312E-01         5.01131E+02         1.00053E+00         1.68082E+01         4.98798E+02         3.67008E+02         1.31789E+02
+          7.32611E-03         1.03830E-02        -4.69023E-03         4.60288E-01         8.71707E-01         4.60312E-01         4.73853E+02         1.00053E+00         1.63241E+01         4.71601E+02         3.43069E+02         1.28531E+02
+          7.32611E-03         1.05528E-02        -4.80193E-03         4.60287E-01         8.82378E-01         4.60312E-01         4.47727E+02         1.00053E+00         1.58582E+01         4.45559E+02         3.20218E+02         1.25341E+02
+          7.32611E-03         1.07227E-02        -4.91544E-03         4.60286E-01         8.93048E-01         4.60313E-01         4.22742E+02         1.00053E+00         1.54102E+01         4.20660E+02         2.98441E+02         1.22219E+02
+          7.32611E-03         1.08925E-02        -5.03077E-03         4.60286E-01         9.03719E-01         4.60313E-01         3.98884E+02         1.00053E+00         1.49795E+01         3.96892E+02         2.77722E+02         1.19169E+02
+          7.32611E-03         1.10623E-02        -5.14791E-03         4.60285E-01         9.14389E-01         4.60313E-01         3.76139E+02         1.00053E+00         1.45660E+01         3.74238E+02         2.58044E+02         1.16194E+02
+          7.32611E-03         1.12321E-02        -5.26686E-03         4.60284E-01         9.25060E-01         4.60314E-01         3.54489E+02         1.00053E+00         1.41690E+01         3.52682E+02         2.39388E+02         1.13294E+02
+          7.32611E-03         1.14020E-02        -5.38762E-03         4.60283E-01         9.35731E-01         4.60314E-01         3.33918E+02         1.00053E+00         1.37884E+01         3.32206E+02         2.21735E+02         1.10471E+02
+          7.32611E-03         1.15718E-02        -5.51020E-03         4.60282E-01         9.46401E-01         4.60315E-01         3.14405E+02         1.00053E+00         1.34236E+01         3.12791E+02         2.05063E+02         1.07728E+02
+          7.32611E-03         1.17416E-02        -5.63459E-03         4.60281E-01         9.57072E-01         4.60316E-01         2.95932E+02         1.00053E+00         1.30742E+01         2.94416E+02         1.89350E+02         1.05066E+02
+          7.32611E-03         1.19114E-02        -5.76079E-03         4.60280E-01         9.67742E-01         4.60316E-01         2.78476E+02         1.00053E+00         1.27400E+01         2.77059E+02         1.74573E+02         1.02486E+02
+          7.32611E-03         1.20813E-02        -5.88880E-03         4.60279E-01         9.78413E-01         4.60317E-01         2.62014E+02         1.00053E+00         1.24205E+01         2.60698E+02         1.60709E+02         9.99891E+01
+          7.32611E-03         1.22511E-02        -6.01863E-03         4.60278E-01         9.89083E-01         4.60318E-01         2.46524E+02         1.00053E+00         1.21153E+01         2.45308E+02         1.47731E+02         9.75770E+01
+          7.32611E-03         1.24209E-02        -6.15027E-03         4.60277E-01         9.99754E-01         4.60318E-01         2.31980E+02         1.00053E+00         1.18241E+01         2.30865E+02         1.35615E+02         9.52502E+01
+          7.32611E-03         1.25908E-02        -6.28372E-03         4.60276E-01         1.01042E+00         4.60319E-01         2.18357E+02         1.00053E+00         1.15465E+01         2.17343E+02         1.24334E+02         9.30095E+01
+          7.32611E-03         1.27606E-02        -6.41898E-03         4.60275E-01         1.02110E+00         4.60320E-01         2.05629E+02         1.00053E+00         1.12822E+01         2.04716E+02         1.13861E+02         9.08554E+01
+          7.32611E-03         1.29304E-02        -6.55606E-03         4.60274E-01         1.03177E+00         4.60321E-01         1.93769E+02         1.00053E+00         1.10308E+01         1.92957E+02         1.04169E+02         8.87881E+01
+          7.32611E-03         1.31002E-02        -6.69495E-03         4.60273E-01         1.04244E+00         4.60322E-01         1.82750E+02         1.00053E+00         1.07921E+01         1.82038E+02         9.52298E+01         8.68080E+01
+          7.32611E-03         1.32701E-02        -6.83565E-03         4.60272E-01         1.05311E+00         4.60323E-01         1.72543E+02         1.00053E+00         1.05657E+01         1.71930E+02         8.70154E+01         8.49150E+01
+          7.32611E-03         1.34399E-02        -6.97817E-03         4.60271E-01         1.06378E+00         4.60324E-01         1.63121E+02         1.00053E+00         1.03513E+01         1.62606E+02         7.94972E+01         8.31089E+01
+          7.32611E-03         1.36097E-02        -7.12249E-03         4.60270E-01         1.07445E+00         4.60325E-01         1.54454E+02         1.00053E+00         1.01486E+01         1.54036E+02         7.26466E+01         8.13893E+01
+          7.32611E-03         1.37795E-02        -7.26863E-03         4.60269E-01         1.08512E+00         4.60327E-01         1.46514E+02         1.00053E+00         9.95724E+00         1.46191E+02         6.64349E+01         7.97557E+01
+          7.32611E-03         1.39494E-02        -7.41658E-03         4.60268E-01         1.09579E+00         4.60328E-01         1.39271E+02         1.00053E+00         9.77696E+00         1.39041E+02         6.08334E+01         7.82073E+01
+          7.32611E-03         1.41192E-02        -7.56635E-03         4.60267E-01         1.10646E+00         4.60329E-01         1.32696E+02         1.00053E+00         9.60745E+00         1.32557E+02         5.58133E+01         7.67433E+01
+          7.32611E-03         1.42890E-02        -7.71792E-03         4.60266E-01         1.11713E+00         4.60331E-01         1.26759E+02         1.00053E+00         9.44839E+00         1.26709E+02         5.13461E+01         7.53626E+01
+          7.32611E-03         1.44589E-02        -7.87131E-03         4.60265E-01         1.12780E+00         4.60332E-01         1.21430E+02         1.00053E+00         9.29948E+00         1.21467E+02         4.74032E+01         7.40639E+01
+          7.32611E-03         1.46287E-02        -8.02652E-03         4.60264E-01         1.13847E+00         4.60334E-01         1.16681E+02         1.00053E+00         9.16041E+00         1.16802E+02         4.39565E+01         7.28458E+01
+          7.32611E-03         1.47985E-02        -8.18353E-03         4.60262E-01         1.14914E+00         4.60335E-01         1.12483E+02         1.00053E+00         9.03084E+00         1.12685E+02         4.09781E+01         7.17069E+01
+          7.32611E-03         1.49683E-02        -8.34236E-03         4.60261E-01         1.15981E+00         4.60337E-01         1.08805E+02         1.00053E+00         8.91045E+00         1.09086E+02         3.84405E+01         7.06452E+01
+          7.32611E-03         1.51382E-02        -8.50300E-03         4.60260E-01         1.17048E+00         4.60339E-01         1.05619E+02         1.00053E+00         8.79891E+00         1.05976E+02         3.63165E+01         6.96590E+01
+          7.32611E-03         1.53080E-02        -8.66545E-03         4.60259E-01         1.18115E+00         4.60340E-01         1.02897E+02         1.00053E+00         8.69587E+00         1.03326E+02         3.45795E+01         6.87463E+01
+          7.32611E-03         1.54778E-02        -8.82972E-03         4.60258E-01         1.19182E+00         4.60342E-01         1.00611E+02         1.00053E+00         8.60097E+00         1.01108E+02         3.32033E+01         6.79050E+01
+          7.32611E-03         1.56476E-02        -8.99580E-03         4.60256E-01         1.20249E+00         4.60344E-01         9.87317E+01         1.00053E+00         8.51387E+00         9.92950E+01         3.21624E+01         6.71327E+01
+          7.32611E-03         1.58175E-02        -9.16369E-03         4.60255E-01         1.21317E+00         4.60346E-01         9.72334E+01         1.00053E+00         8.43418E+00         9.78587E+01         3.14317E+01         6.64270E+01
+          7.32611E-03         1.59873E-02        -9.33340E-03         4.60254E-01         1.22384E+00         4.60349E-01         9.60887E+01         1.00053E+00         8.36153E+00         9.67725E+01         3.09870E+01         6.57855E+01
+          7.32611E-03         1.61571E-02        -9.50491E-03         4.60253E-01         1.23451E+00         4.60351E-01         9.52716E+01         1.00053E+00         8.29555E+00         9.60101E+01         3.08045E+01         6.52055E+01
+          7.32611E-03         1.63270E-02        -9.67824E-03         4.60251E-01         1.24518E+00         4.60353E-01         9.47564E+01         1.00053E+00         8.23584E+00         9.55458E+01         3.08614E+01         6.46844E+01
+          7.32611E-03         1.64968E-02        -9.85339E-03         4.60250E-01         1.25585E+00         4.60356E-01         9.45182E+01         1.00053E+00         8.18201E+00         9.53547E+01         3.11353E+01         6.42194E+01
+          7.32611E-03         1.66666E-02        -1.00303E-02         4.60249E-01         1.26652E+00         4.60358E-01         9.45327E+01         1.00053E+00         8.13367E+00         9.54123E+01         3.16049E+01         6.38075E+01
+          7.32611E-03         1.68364E-02        -1.02091E-02         4.60248E-01         1.27719E+00         4.60361E-01         9.47763E+01         1.00053E+00         8.09043E+00         9.56952E+01         3.22494E+01         6.34459E+01
+          7.32611E-03         1.70063E-02        -1.03897E-02         4.60246E-01         1.28786E+00         4.60364E-01         9.52263E+01         1.00053E+00         8.05190E+00         9.61804E+01         3.30489E+01         6.31315E+01
+          7.32611E-03         1.71761E-02        -1.05721E-02         4.60245E-01         1.29853E+00         4.60366E-01         9.58605E+01         1.00053E+00         8.01768E+00         9.68459E+01         3.39845E+01         6.28614E+01
+          7.32611E-03         1.73459E-02        -1.07563E-02         4.60244E-01         1.30920E+00         4.60369E-01         9.66576E+01         1.00053E+00         7.98738E+00         9.76703E+01         3.50378E+01         6.26325E+01
+          7.32611E-03         1.75158E-02        -1.09423E-02         4.60242E-01         1.31987E+00         4.60372E-01         9.75973E+01         1.00053E+00         7.96064E+00         9.86332E+01         3.61916E+01         6.24417E+01
+          7.32611E-03         1.76856E-02        -1.11301E-02         4.60241E-01         1.33054E+00         4.60375E-01         9.86597E+01         1.00053E+00         7.93708E+00         9.97150E+01         3.74292E+01         6.22858E+01
+          7.32611E-03         1.78554E-02        -1.13198E-02         4.60239E-01         1.34121E+00         4.60379E-01         9.98261E+01         1.00053E+00         7.91634E+00         1.00897E+02         3.87350E+01         6.21618E+01
+          7.32611E-03         1.80252E-02        -1.15113E-02         4.60238E-01         1.35188E+00         4.60382E-01         1.01079E+02         1.00053E+00         7.89805E+00         1.02161E+02         4.00942E+01         6.20665E+01
+          7.32611E-03         1.81951E-02        -1.17045E-02         4.60237E-01         1.36255E+00         4.60385E-01         1.02400E+02         1.00053E+00         7.88189E+00         1.03490E+02         4.14929E+01         6.19969E+01
+          7.32611E-03         1.83649E-02        -1.18996E-02         4.60235E-01         1.37322E+00         4.60389E-01         1.03774E+02         1.00053E+00         7.86751E+00         1.04868E+02         4.29177E+01         6.19499E+01
+          7.32611E-03         1.85347E-02        -1.20965E-02         4.60234E-01         1.38389E+00         4.60393E-01         1.05185E+02         1.00053E+00         7.85462E+00         1.06279E+02         4.43566E+01         6.19224E+01
+          7.32611E-03         1.87045E-02        -1.22952E-02         4.60232E-01         1.39457E+00         4.60396E-01         1.06619E+02         1.00053E+00         7.84289E+00         1.07710E+02         4.57981E+01         6.19115E+01
+          7.32611E-03         1.88744E-02        -1.24957E-02         4.60231E-01         1.40524E+00         4.60400E-01         1.08062E+02         1.00053E+00         7.83205E+00         1.09146E+02         4.72315E+01         6.19141E+01
+          7.32611E-03         1.90442E-02        -1.26981E-02         4.60229E-01         1.41591E+00         4.60404E-01         1.09502E+02         1.00053E+00         7.82181E+00         1.10575E+02         4.86470E+01         6.19276E+01
+          7.32611E-03         1.92140E-02        -1.29022E-02         4.60228E-01         1.42658E+00         4.60409E-01         1.10925E+02         1.00053E+00         7.81193E+00         1.11985E+02         5.00356E+01         6.19489E+01
+          7.32611E-03         1.93839E-02        -1.31082E-02         4.60226E-01         1.43725E+00         4.60413E-01         1.12323E+02         1.00053E+00         7.80215E+00         1.13365E+02         5.13891E+01         6.19755E+01
+          7.32611E-03         1.95537E-02        -1.33160E-02         4.60225E-01         1.44792E+00         4.60417E-01         1.13683E+02         1.00053E+00         7.79226E+00         1.14705E+02         5.27000E+01         6.20046E+01
+          7.32611E-03         1.97235E-02        -1.35256E-02         4.60223E-01         1.45859E+00         4.60422E-01         1.14997E+02         1.00053E+00         7.78202E+00         1.15995E+02         5.39615E+01         6.20337E+01
+          7.32611E-03         1.98933E-02        -1.37370E-02         4.60222E-01         1.46926E+00         4.60427E-01         1.16255E+02         1.00053E+00         7.77125E+00         1.17228E+02         5.51676E+01         6.20604E+01
+          7.32611E-03         2.00632E-02        -1.39502E-02         4.60220E-01         1.47993E+00         4.60432E-01         1.17451E+02         1.00053E+00         7.75976E+00         1.18395E+02         5.63131E+01         6.20823E+01
+          7.32611E-03         2.02330E-02        -1.41652E-02         4.60219E-01         1.49060E+00         4.60437E-01         1.18578E+02         1.00053E+00         7.74738E+00         1.19490E+02         5.73932E+01         6.20972E+01
+          7.32611E-03         2.04028E-02        -1.43821E-02         4.60217E-01         1.50127E+00         4.60442E-01         1.19628E+02         1.00053E+00         7.73395E+00         1.20507E+02         5.84040E+01         6.21029E+01
+          7.32611E-03         2.05726E-02        -1.46007E-02         4.60215E-01         1.51194E+00         4.60447E-01         1.20596E+02         1.00053E+00         7.71933E+00         1.21439E+02         5.93420E+01         6.20975E+01
+          7.32611E-03         2.07425E-02        -1.48212E-02         4.60214E-01         1.52261E+00         4.60452E-01         1.21478E+02         1.00053E+00         7.70339E+00         1.22284E+02         6.02044E+01         6.20791E+01
+          7.32611E-03         2.09123E-02        -1.50435E-02         4.60212E-01         1.53328E+00         4.60458E-01         1.22270E+02         1.00052E+00         7.68601E+00         1.23035E+02         6.09891E+01         6.20459E+01
+          7.32611E-03         2.10821E-02        -1.52676E-02         4.60211E-01         1.54395E+00         4.60464E-01         1.22967E+02         1.00052E+00         7.66709E+00         1.23691E+02         6.16944E+01         6.19964E+01
+          7.32611E-03         2.12520E-02        -1.54935E-02         4.60209E-01         1.55462E+00         4.60470E-01         1.23568E+02         1.00052E+00         7.64654E+00         1.24248E+02         6.23190E+01         6.19290E+01
+          7.32611E-03         2.14218E-02        -1.57212E-02         4.60207E-01         1.56529E+00         4.60476E-01         1.24069E+02         1.00052E+00         7.62427E+00         1.24705E+02         6.28623E+01         6.18425E+01
+          7.32611E-03         2.15916E-02        -1.59507E-02         4.60206E-01         1.57596E+00         4.60482E-01         1.24470E+02         1.00052E+00         7.60020E+00         1.25060E+02         6.33240E+01         6.17356E+01
+          7.32611E-03         2.17614E-02        -1.61821E-02         4.60204E-01         1.58664E+00         4.60488E-01         1.24769E+02         1.00052E+00         7.57428E+00         1.25312E+02         6.37044E+01         6.16072E+01
+          7.32611E-03         2.19313E-02        -1.64152E-02         4.60202E-01         1.59731E+00         4.60495E-01         1.24966E+02         1.00052E+00         7.54646E+00         1.25460E+02         6.40039E+01         6.14565E+01
+          7.32611E-03         2.21011E-02        -1.66502E-02         4.60200E-01         1.60798E+00         4.60501E-01         1.25060E+02         1.00052E+00         7.51668E+00         1.25506E+02         6.42236E+01         6.12826E+01
+          7.32611E-03         2.22709E-02        -1.68870E-02         4.60199E-01         1.61865E+00         4.60508E-01         1.25053E+02         1.00052E+00         7.48493E+00         1.25450E+02         6.43647E+01         6.10849E+01
+          7.32611E-03         2.24407E-02        -1.71256E-02         4.60197E-01         1.62932E+00         4.60515E-01         1.24945E+02         1.00052E+00         7.45116E+00         1.25292E+02         6.44288E+01         6.08628E+01
+          7.32611E-03         2.26106E-02        -1.73660E-02         4.60195E-01         1.63999E+00         4.60523E-01         1.24737E+02         1.00052E+00         7.41536E+00         1.25034E+02         6.44178E+01         6.06160E+01
+          7.32611E-03         2.27804E-02        -1.76082E-02         4.60193E-01         1.65066E+00         4.60530E-01         1.24431E+02         1.00052E+00         7.37751E+00         1.24678E+02         6.43339E+01         6.03443E+01
+          7.32611E-03         2.29502E-02        -1.78523E-02         4.60192E-01         1.66133E+00         4.60538E-01         1.24030E+02         1.00052E+00         7.33762E+00         1.24227E+02         6.41794E+01         6.00474E+01
+          7.32611E-03         2.31201E-02        -1.80981E-02         4.60190E-01         1.67200E+00         4.60546E-01         1.23535E+02         1.00052E+00         7.29568E+00         1.23682E+02         6.39569E+01         5.97254E+01
+          7.32611E-03         2.32899E-02        -1.83458E-02         4.60188E-01         1.68267E+00         4.60554E-01         1.22950E+02         1.00052E+00         7.25169E+00         1.23047E+02         6.36691E+01         5.93784E+01
+          7.32611E-03         2.34597E-02        -1.85953E-02         4.60186E-01         1.69334E+00         4.60562E-01         1.22277E+02         1.00052E+00         7.20568E+00         1.22326E+02         6.33189E+01         5.90066E+01
+          7.32611E-03         2.36295E-02        -1.88466E-02         4.60184E-01         1.70401E+00         4.60570E-01         1.21519E+02         1.00052E+00         7.15765E+00         1.21520E+02         6.29095E+01         5.86104E+01
+          7.32611E-03         2.37994E-02        -1.90997E-02         4.60182E-01         1.71468E+00         4.60579E-01         1.20681E+02         1.00052E+00         7.10764E+00         1.20634E+02         6.24439E+01         5.81902E+01
+          7.32611E-03         2.39692E-02        -1.93546E-02         4.60181E-01         1.72535E+00         4.60587E-01         1.19765E+02         1.00052E+00         7.05566E+00         1.19672E+02         6.19253E+01         5.77465E+01
+          7.32611E-03         2.41390E-02        -1.96114E-02         4.60179E-01         1.73602E+00         4.60596E-01         1.18776E+02         1.00052E+00         7.00174E+00         1.18637E+02         6.13572E+01         5.72800E+01
+          7.32611E-03         2.43088E-02        -1.98699E-02         4.60177E-01         1.74669E+00         4.60606E-01         1.17717E+02         1.00052E+00         6.94593E+00         1.17534E+02         6.07429E+01         5.67914E+01
+          7.32611E-03         2.44787E-02        -2.01303E-02         4.60175E-01         1.75736E+00         4.60615E-01         1.16593E+02         1.00052E+00         6.88825E+00         1.16367E+02         6.00856E+01         5.62816E+01
+          7.32611E-03         2.46485E-02        -2.03925E-02         4.60173E-01         1.76804E+00         4.60625E-01         1.15407E+02         1.00052E+00         6.82876E+00         1.15140E+02         5.93889E+01         5.57513E+01
+          7.32611E-03         2.48183E-02        -2.06565E-02         4.60171E-01         1.77871E+00         4.60634E-01         1.14165E+02         1.00052E+00         6.76749E+00         1.13858E+02         5.86562E+01         5.52017E+01
+          7.32611E-03         2.49882E-02        -2.09223E-02         4.60169E-01         1.78938E+00         4.60644E-01         1.12869E+02         1.00052E+00         6.70449E+00         1.12524E+02         5.78908E+01         5.46336E+01
+          7.32611E-03         2.51580E-02        -2.11899E-02         4.60167E-01         1.80005E+00         4.60655E-01         1.11526E+02         1.00052E+00         6.63982E+00         1.11144E+02         5.70960E+01         5.40482E+01
+          7.32611E-03         2.53278E-02        -2.14593E-02         4.60165E-01         1.81072E+00         4.60665E-01         1.10138E+02         1.00052E+00         6.57352E+00         1.09722E+02         5.62751E+01         5.34466E+01
+          7.32611E-03         2.54976E-02        -2.17306E-02         4.60163E-01         1.82139E+00         4.60676E-01         1.08711E+02         1.00052E+00         6.50565E+00         1.08261E+02         5.54315E+01         5.28300E+01
+          7.32611E-03         2.56675E-02        -2.20036E-02         4.60161E-01         1.83206E+00         4.60687E-01         1.07248E+02         1.00052E+00         6.43627E+00         1.06768E+02         5.45681E+01         5.21996E+01
+          7.32611E-03         2.58373E-02        -2.22785E-02         4.60159E-01         1.84273E+00         4.60698E-01         1.05754E+02         1.00052E+00         6.36543E+00         1.05245E+02         5.36882E+01         5.15566E+01
+          7.32611E-03         2.60071E-02        -2.25552E-02         4.60157E-01         1.85340E+00         4.60710E-01         1.04234E+02         1.00052E+00         6.29320E+00         1.03697E+02         5.27947E+01         5.09023E+01
+          7.32611E-03         2.61769E-02        -2.28337E-02         4.60155E-01         1.86407E+00         4.60721E-01         1.02690E+02         1.00052E+00         6.21964E+00         1.02129E+02         5.18905E+01         5.02381E+01
+          7.49593E-03         8.72665E-04        -1.40639E-03         4.70983E-01         2.74155E-01         4.70985E-01         2.88435E+03         1.00032E+00         5.40496E+01         2.88489E+03         2.58891E+03         2.95979E+02
+          7.49593E-03         1.04249E-03        -1.41660E-03         4.70983E-01         2.84826E-01         4.70985E-01         2.84180E+03         1.00032E+00         5.32800E+01         2.84226E+03         2.54844E+03         2.93816E+02
+          7.49593E-03         1.21232E-03        -1.42863E-03         4.70983E-01         2.95496E-01         4.70985E-01         2.79822E+03         1.00032E+00         5.24935E+01         2.79859E+03         2.50700E+03         2.91585E+02
+          7.49593E-03         1.38215E-03        -1.44247E-03         4.70983E-01         3.06167E-01         4.70985E-01         2.75366E+03         1.00032E+00         5.16914E+01         2.75394E+03         2.46465E+03         2.89289E+02
+          7.49593E-03         1.55197E-03        -1.45813E-03         4.70983E-01         3.16838E-01         4.70985E-01         2.70819E+03         1.00032E+00         5.08748E+01         2.70838E+03         2.42145E+03         2.86929E+02
+          7.49593E-03         1.72180E-03        -1.47559E-03         4.70983E-01         3.27508E-01         4.70985E-01         2.66186E+03         1.00032E+00         5.00451E+01         2.66196E+03         2.37745E+03         2.84505E+02
+          7.49593E-03         1.89163E-03        -1.49487E-03         4.70983E-01         3.38179E-01         4.70985E-01         2.61474E+03         1.00032E+00         4.92034E+01         2.61474E+03         2.33272E+03         2.82021E+02
+          7.49593E-03         2.06146E-03        -1.51596E-03         4.70982E-01         3.48849E-01         4.70985E-01         2.56688E+03         1.00032E+00         4.83510E+01         2.56679E+03         2.28732E+03         2.79477E+02
+          7.49593E-03         2.23128E-03        -1.53887E-03         4.70982E-01         3.59520E-01         4.70985E-01         2.51835E+03         1.00032E+00         4.74892E+01         2.51817E+03         2.24130E+03         2.76875E+02
+          7.49593E-03         2.40111E-03        -1.56358E-03         4.70982E-01         3.70190E-01         4.70985E-01         2.46922E+03         1.00032E+00         4.66190E+01         2.46894E+03         2.19473E+03         2.74217E+02
+          7.49593E-03         2.57094E-03        -1.59011E-03         4.70982E-01         3.80861E-01         4.70985E-01         2.41953E+03         1.00032E+00         4.57419E+01         2.41916E+03         2.14766E+03         2.71503E+02
+          7.49593E-03         2.74077E-03        -1.61845E-03         4.70982E-01         3.91532E-01         4.70984E-01         2.36936E+03         1.00032E+00         4.48590E+01         2.36890E+03         2.10016E+03         2.68737E+02
+          7.49593E-03         2.91059E-03        -1.64860E-03         4.70981E-01         4.02202E-01         4.70984E-01         2.31876E+03         1.00032E+00         4.39714E+01         2.31822E+03         2.05230E+03         2.65920E+02
+          7.49593E-03         3.08042E-03        -1.68056E-03         4.70981E-01         4.12873E-01         4.70984E-01         2.26781E+03         1.00032E+00         4.30805E+01         2.26717E+03         2.00412E+03         2.63053E+02
+          7.49593E-03         3.25025E-03        -1.71433E-03         4.70981E-01         4.23543E-01         4.70984E-01         2.21655E+03         1.00032E+00         4.21874E+01         2.21583E+03         1.95569E+03         2.60138E+02
+          7.49593E-03         3.42008E-03        -1.74992E-03         4.70981E-01         4.34214E-01         4.70984E-01         2.16506E+03         1.00032E+00         4.12931E+01         2.16425E+03         1.90707E+03         2.57176E+02
+          7.49593E-03         3.58990E-03        -1.78732E-03         4.70980E-01         4.44884E-01         4.70984E-01         2.11338E+03         1.00032E+00         4.03990E+01         2.11249E+03         1.85832E+03         2.54170E+02
+          7.49593E-03         3.75973E-03        -1.82653E-03         4.70980E-01         4.55555E-01         4.70984E-01         2.06159E+03         1.00032E+00         3.95060E+01         2.06061E+03         1.80949E+03         2.51122E+02
+          7.49593E-03         3.92956E-03        -1.86756E-03         4.70980E-01         4.66225E-01         4.70983E-01         2.00974E+03         1.00032E+00         3.86153E+01         2.00868E+03         1.76065E+03         2.48032E+02
+          7.49593E-03         4.09939E-03        -1.91039E-03         4.70979E-01         4.76896E-01         4.70983E-01         1.95789E+03         1.00032E+00         3.77279E+01         1.95675E+03         1.71185E+03         2.44904E+02
+          7.49593E-03         4.26921E-03        -1.95504E-03         4.70979E-01         4.87567E-01         4.70983E-01         1.90610E+03         1.00032E+00         3.68448E+01         1.90488E+03         1.66314E+03         2.41738E+02
+          7.49593E-03         4.43904E-03        -2.00150E-03         4.70979E-01         4.98237E-01         4.70983E-01         1.85442E+03         1.00032E+00         3.59670E+01         1.85313E+03         1.61459E+03         2.38537E+02
+          7.49593E-03         4.60887E-03        -2.04977E-03         4.70978E-01         5.08908E-01         4.70983E-01         1.80290E+03         1.00032E+00         3.50956E+01         1.80154E+03         1.56624E+03         2.35302E+02
+          7.49593E-03         4.77869E-03        -2.09986E-03         4.70978E-01         5.19578E-01         4.70983E-01         1.75161E+03         1.00032E+00         3.42313E+01         1.75018E+03         1.51815E+03         2.32036E+02
+          7.49593E-03         4.94852E-03        -2.15175E-03         4.70978E-01         5.30249E-01         4.70983E-01         1.70060E+03         1.00032E+00         3.33752E+01         1.69910E+03         1.47036E+03         2.28740E+02
+          7.49593E-03         5.11835E-03        -2.20546E-03         4.70977E-01         5.40919E-01         4.70982E-01         1.64991E+03         1.00032E+00         3.25280E+01         1.64835E+03         1.42294E+03         2.25417E+02
+          7.49593E-03         5.28818E-03        -2.26098E-03         4.70977E-01         5.51590E-01         4.70982E-01         1.59960E+03         1.00032E+00         3.16905E+01         1.59798E+03         1.37591E+03         2.22068E+02
+          7.49593E-03         5.45800E-03        -2.31832E-03         4.70976E-01         5.62261E-01         4.70982E-01         1.54971E+03         1.00032E+00         3.08635E+01         1.54804E+03         1.32934E+03         2.18696E+02
+          7.49593E-03         5.62783E-03        -2.37746E-03         4.70976E-01         5.72931E-01         4.70982E-01         1.50029E+03         1.00032E+00         3.00478E+01         1.49857E+03         1.28327E+03         2.15302E+02
+          7.49593E-03         5.79766E-03        -2.43842E-03         4.70975E-01         5.83602E-01         4.70982E-01         1.45139E+03         1.00032E+00         2.92440E+01         1.44962E+03         1.23773E+03         2.11889E+02
+          7.49593E-03         5.96749E-03        -2.50119E-03         4.70975E-01         5.94272E-01         4.70982E-01         1.40305E+03         1.00032E+00         2.84527E+01         1.40124E+03         1.19278E+03         2.08458E+02
+          7.49593E-03         6.13731E-03        -2.56577E-03         4.70975E-01         6.04943E-01         4.70982E-01         1.35532E+03         1.00032E+00         2.76745E+01         1.35346E+03         1.14845E+03         2.05013E+02
+          7.49593E-03         6.30714E-03        -2.63217E-03         4.70974E-01         6.15613E-01         4.70981E-01         1.30822E+03         1.00032E+00         2.69100E+01         1.30632E+03         1.10477E+03         2.01555E+02
+          7.49593E-03         6.47697E-03        -2.70037E-03         4.70974E-01         6.26284E-01         4.70981E-01         1.26180E+03         1.00032E+00         2.61597E+01         1.25987E+03         1.06179E+03         1.98087E+02
+          7.49593E-03         6.64680E-03        -2.77039E-03         4.70973E-01         6.36955E-01         4.70981E-01         1.21610E+03         1.00032E+00         2.54240E+01         1.21414E+03         1.01953E+03         1.94611E+02
+          7.49593E-03         6.81662E-03        -2.84222E-03         4.70972E-01         6.47625E-01         4.70981E-01         1.17115E+03         1.00032E+00         2.47033E+01         1.16917E+03         9.78039E+02         1.91129E+02
+          7.49593E-03         6.98645E-03        -2.91586E-03         4.70972E-01         6.58296E-01         4.70981E-01         1.12698E+03         1.00032E+00         2.39981E+01         1.12498E+03         9.37334E+02         1.87644E+02
+          7.49593E-03         7.15628E-03        -2.99132E-03         4.70971E-01         6.68966E-01         4.70981E-01         1.08363E+03         1.00032E+00         2.33085E+01         1.08160E+03         8.97447E+02         1.84158E+02
+          7.49593E-03         7.32611E-03        -3.06859E-03         4.70971E-01         6.79637E-01         4.70981E-01         1.04111E+03         1.00032E+00         2.26349E+01         1.03908E+03         8.58402E+02         1.80673E+02
+          7.49593E-03         7.49593E-03        -3.14767E-03         4.70970E-01         6.90307E-01         4.70981E-01         9.99464E+02         1.00032E+00         2.19774E+01         9.97418E+02         8.20225E+02         1.77193E+02
+          7.49593E-03         7.66576E-03        -3.22856E-03         4.70970E-01         7.00978E-01         4.70981E-01         9.58708E+02         1.00032E+00         2.13364E+01         9.56655E+02         7.82937E+02         1.73719E+02
+          7.49593E-03         7.83559E-03        -3.31126E-03         4.70969E-01         7.11649E-01         4.70981E-01         9.18865E+02         1.00032E+00         2.07119E+01         9.16811E+02         7.46557E+02         1.70254E+02
+          7.49593E-03         8.00542E-03        -3.39578E-03         4.70968E-01         7.22319E-01         4.70981E-01         8.79956E+02         1.00032E+00         2.01040E+01         8.77905E+02         7.11103E+02         1.66802E+02
+          7.49593E-03         8.17524E-03        -3.48211E-03         4.70968E-01         7.32990E-01         4.70981E-01         8.41999E+02         1.00032E+00         1.95128E+01         8.39954E+02         6.76591E+02         1.63363E+02
+          7.49593E-03         8.34507E-03        -3.57025E-03         4.70967E-01         7.43660E-01         4.70981E-01         8.05011E+02         1.00032E+00         1.89383E+01         8.02976E+02         6.43034E+02         1.59942E+02
+          7.49593E-03         8.51490E-03        -3.66020E-03         4.70966E-01         7.54331E-01         4.70981E-01         7.69005E+02         1.00032E+00         1.83805E+01         7.66985E+02         6.10444E+02         1.56541E+02
+          7.49593E-03         8.68473E-03        -3.75197E-03         4.70966E-01         7.65001E-01         4.70981E-01         7.33995E+02         1.00032E+00         1.78394E+01         7.31992E+02         5.78831E+02         1.53161E+02
+          7.49593E-03         8.85455E-03        -3.84555E-03         4.70965E-01         7.75672E-01         4.70981E-01         6.99989E+02         1.00032E+00         1.73147E+01         6.98008E+02         5.48201E+02         1.49807E+02
+          7.49593E-03         9.02438E-03        -3.94094E-03         4.70964E-01         7.86343E-01         4.70981E-01         6.66997E+02         1.00032E+00         1.68066E+01         6.65042E+02         5.18562E+02         1.46480E+02
+          7.49593E-03         9.19421E-03        -4.03814E-03         4.70963E-01         7.97013E-01         4.70981E-01         6.35026E+02         1.00032E+00         1.63147E+01         6.33099E+02         4.89915E+02         1.43184E+02
+          7.49593E-03         9.36403E-03        -4.13715E-03         4.70963E-01         8.07684E-01         4.70981E-01         6.04079E+02         1.00032E+00         1.58389E+01         6.02185E+02         4.62264E+02         1.39920E+02
+          7.49593E-03         9.53386E-03        -4.23798E-03         4.70962E-01         8.18354E-01         4.70981E-01         5.74160E+02         1.00032E+00         1.53791E+01         5.72301E+02         4.35609E+02         1.36692E+02
+          7.49593E-03         9.70369E-03        -4.34062E-03         4.70961E-01         8.29025E-01         4.70981E-01         5.45269E+02         1.00032E+00         1.49350E+01         5.43449E+02         4.09947E+02         1.33503E+02
+          7.49593E-03         9.87352E-03        -4.44507E-03         4.70960E-01         8.39695E-01         4.70981E-01         5.17407E+02         1.00032E+00         1.45063E+01         5.15629E+02         3.85275E+02         1.30354E+02
+          7.49593E-03         1.00433E-02        -4.55134E-03         4.70960E-01         8.50366E-01         4.70982E-01         4.90570E+02         1.00032E+00         1.40929E+01         4.88836E+02         3.61588E+02         1.27248E+02
+          7.49593E-03         1.02132E-02        -4.65942E-03         4.70959E-01         8.61037E-01         4.70982E-01         4.64754E+02         1.00032E+00         1.36944E+01         4.63068E+02         3.38880E+02         1.24188E+02
+          7.49593E-03         1.03830E-02        -4.76930E-03         4.70958E-01         8.71707E-01         4.70982E-01         4.39953E+02         1.00032E+00         1.33105E+01         4.38318E+02         3.17141E+02         1.21176E+02
+          7.49593E-03         1.05528E-02        -4.88101E-03         4.70957E-01         8.82378E-01         4.70982E-01         4.16161E+02         1.00032E+00         1.29411E+01         4.14579E+02         2.96363E+02         1.18215E+02
+          7.49593E-03         1.07227E-02        -4.99452E-03         4.70956E-01         8.93048E-01         4.70983E-01         3.93369E+02         1.00032E+00         1.25856E+01         3.91841E+02         2.76534E+02         1.15307E+02
+          7.49593E-03         1.08925E-02        -5.10985E-03         4.70955E-01         9.03719E-01         4.70983E-01         3.71566E+02         1.00032E+00         1.22440E+01         3.70096E+02         2.57642E+02         1.12454E+02
+          7.49593E-03         1.10623E-02        -5.22699E-03         4.70955E-01         9.14389E-01         4.70984E-01         3.50741E+02         1.00032E+00         1.19158E+01         3.49330E+02         2.39672E+02         1.09658E+02
+          7.49593E-03         1.12321E-02        -5.34594E-03         4.70954E-01         9.25060E-01         4.70984E-01         3.30881E+02         1.00032E+00         1.16007E+01         3.29532E+02         2.22609E+02         1.06922E+02
+          7.49593E-03         1.14020E-02        -5.46670E-03         4.70953E-01         9.35731E-01         4.70984E-01         3.11972E+02         1.00032E+00         1.12984E+01         3.10685E+02         2.06438E+02         1.04247E+02
+          7.49593E-03         1.15718E-02        -5.58928E-03         4.70952E-01         9.46401E-01         4.70985E-01         2.93998E+02         1.00032E+00         1.10087E+01         2.92776E+02         1.91140E+02         1.01636E+02
+          7.49593E-03         1.17416E-02        -5.71367E-03         4.70951E-01         9.57072E-01         4.70986E-01         2.76943E+02         1.00032E+00         1.07312E+01         2.75787E+02         1.76698E+02         9.90897E+01
+          7.49593E-03         1.19114E-02        -5.83987E-03         4.70950E-01         9.67742E-01         4.70986E-01         2.60790E+02         1.00032E+00         1.04655E+01         2.59701E+02         1.63091E+02         9.66103E+01
+          7.49593E-03         1.20813E-02        -5.96788E-03         4.70949E-01         9.78413E-01         4.70987E-01         2.45520E+02         1.00032E+00         1.02115E+01         2.44499E+02         1.50300E+02         9.41993E+01
+          7.49593E-03         1.22511E-02        -6.09771E-03         4.70948E-01         9.89083E-01         4.70988E-01         2.31114E+02         1.00032E+00         9.96876E+00         2.30162E+02         1.38304E+02         9.18581E+01
+          7.49593E-03         1.24209E-02        -6.22934E-03         4.70947E-01         9.99754E-01         4.70988E-01         2.17551E+02         1.00032E+00         9.73706E+00         2.16668E+02         1.27080E+02         8.95881E+01
+          7.49593E-03         1.25908E-02        -6.36280E-03         4.70946E-01         1.01042E+00         4.70989E-01         2.04810E+02         1.00032E+00         9.51611E+00         2.03998E+02         1.16607E+02         8.73905E+01
+          7.49593E-03         1.27606E-02        -6.49806E-03         4.70945E-01         1.02110E+00         4.70990E-01         1.92870E+02         1.00032E+00         9.30564E+00         1.92128E+02         1.06861E+02         8.52662E+01
+          7.49593E-03         1.29304E-02        -6.63514E-03         4.70944E-01         1.03177E+00         4.70991E-01         1.81707E+02         1.00032E+00         9.10537E+00         1.81036E+02         9.78196E+01         8.32161E+01
+          7.49593E-03         1.31002E-02        -6.77402E-03         4.70943E-01         1.04244E+00         4.70992E-01         1.71300E+02         1.00032E+00         8.91506E+00         1.70699E+02         8.94577E+01         8.12411E+01
+          7.49593E-03         1.32701E-02        -6.91473E-03         4.70942E-01         1.05311E+00         4.70993E-01         1.61624E+02         1.00032E+00         8.73444E+00         1.61093E+02         8.17514E+01         7.93417E+01
+          7.49593E-03         1.34399E-02        -7.05724E-03         4.70941E-01         1.06378E+00         4.70994E-01         1.52656E+02         1.00032E+00         8.56327E+00         1.52195E+02         7.46761E+01         7.75184E+01
+          7.49593E-03         1.36097E-02        -7.20157E-03         4.70940E-01         1.07445E+00         4.70995E-01         1.44371E+02         1.00032E+00         8.40129E+00         1.43978E+02         6.82071E+01         7.57714E+01
+          7.49593E-03         1.37795E-02        -7.34771E-03         4.70939E-01         1.08512E+00         4.70996E-01         1.36744E+02         1.00032E+00         8.24827E+00         1.36420E+02         6.23192E+01         7.41009E+01
+          7.49593E-03         1.39494E-02        -7.49566E-03         4.70938E-01         1.09579E+00         4.70997E-01         1.29751E+02         1.00032E+00         8.10396E+00         1.29494E+02         5.69875E+01         7.25068E+01
+          7.49593E-03         1.41192E-02        -7.64542E-03         4.70936E-01         1.10646E+00         4.70998E-01         1.23366E+02         1.00032E+00         7.96812E+00         1.23176E+02         5.21869E+01         7.09889E+01
+          7.49593E-03         1.42890E-02        -7.79700E-03         4.70935E-01         1.11713E+00         4.71000E-01         1.17564E+02         1.00032E+00         7.84050E+00         1.17439E+02         4.78922E+01         6.95469E+01
+          7.49593E-03         1.44589E-02        -7.95039E-03         4.70934E-01         1.12780E+00         4.71001E-01         1.12320E+02         1.00032E+00         7.72085E+00         1.12259E+02         4.40785E+01         6.81803E+01
+          7.49593E-03         1.46287E-02        -8.10559E-03         4.70933E-01         1.13847E+00         4.71003E-01         1.07609E+02         1.00032E+00         7.60893E+00         1.07609E+02         4.07210E+01         6.68884E+01
+          7.49593E-03         1.47985E-02        -8.26261E-03         4.70932E-01         1.14914E+00         4.71004E-01         1.03404E+02         1.00032E+00         7.50449E+00         1.03465E+02         3.77951E+01         6.56704E+01
+          7.49593E-03         1.49683E-02        -8.42143E-03         4.70931E-01         1.15981E+00         4.71006E-01         9.96812E+01         1.00032E+00         7.40725E+00         9.98016E+01         3.52764E+01         6.45253E+01
+          7.49593E-03         1.51382E-02        -8.58207E-03         4.70929E-01         1.17048E+00         4.71008E-01         9.64153E+01         1.00032E+00         7.31697E+00         9.65927E+01         3.31409E+01         6.34519E+01
+          7.49593E-03         1.53080E-02        -8.74453E-03         4.70928E-01         1.18115E+00         4.71009E-01         9.35814E+01         1.00032E+00         7.23337E+00         9.38138E+01         3.13648E+01         6.24489E+01
+          7.49593E-03         1.54778E-02        -8.90879E-03         4.70927E-01         1.19182E+00         4.71011E-01         9.11548E+01         1.00032E+00         7.15617E+00         9.14401E+01         2.99250E+01         6.15150E+01
+          7.49593E-03         1.56476E-02        -9.07487E-03         4.70926E-01         1.20249E+00         4.71013E-01         8.91114E+01         1.00032E+00         7.08510E+00         8.94472E+01         2.87986E+01         6.06486E+01
+          7.49593E-03         1.58175E-02        -9.24276E-03         4.70924E-01         1.21317E+00         4.71015E-01         8.74270E+01         1.00032E+00         7.01986E+00         8.78112E+01         2.79632E+01         5.98480E+01
+          7.49593E-03         1.59873E-02        -9.41247E-03         4.70923E-01         1.22384E+00         4.71017E-01         8.60782E+01         1.00032E+00         6.96017E+00         8.65083E+01         2.73971E+01         5.91112E+01
+          7.49593E-03         1.61571E-02        -9.58398E-03         4.70922E-01         1.23451E+00         4.71019E-01         8.50417E+01         1.00032E+00         6.90573E+00         8.55153E+01         2.70789E+01         5.84365E+01
+          7.49593E-03         1.63270E-02        -9.75731E-03         4.70921E-01         1.24518E+00         4.71022E-01         8.42950E+01         1.00032E+00         6.85625E+00         8.48095E+01         2.69879E+01         5.78216E+01
+          7.49593E-03         1.64968E-02        -9.93246E-03         4.70919E-01         1.25585E+00         4.71024E-01         8.38159E+01         1.00032E+00         6.81141E+00         8.43687E+01         2.71042E+01         5.72645E+01
+          7.49593E-03         1.66666E-02        -1.01094E-02         4.70918E-01         1.26652E+00         4.71026E-01         8.35826E+01         1.00032E+00         6.77092E+00         8.41711E+01         2.74082E+01         5.67628E+01
+          7.49593E-03         1.68364E-02        -1.02882E-02         4.70917E-01         1.27719E+00         4.71029E-01         8.35741E+01         1.00032E+00         6.73447E+00         8.41955E+01         2.78813E+01         5.63143E+01
+          7.49593E-03         1.70063E-02        -1.04688E-02         4.70915E-01         1.28786E+00         4.71032E-01         8.37699E+01         1.00032E+00         6.70176E+00         8.44216E+01         2.85053E+01         5.59163E+01
+          7.49593E-03         1.71761E-02        -1.06512E-02         4.70914E-01         1.29853E+00         4.71034E-01         8.41502E+01         1.00032E+00         6.67250E+00         8.48293E+01         2.92628E+01         5.55664E+01
+          7.49593E-03         1.73459E-02        -1.08354E-02         4.70913E-01         1.30920E+00         4.71037E-01         8.46956E+01         1.00032E+00         6.64637E+00         8.53993E+01         3.01373E+01         5.52621E+01
+          7.49593E-03         1.75158E-02        -1.10214E-02         4.70911E-01         1.31987E+00         4.71040E-01         8.53877E+01         1.00032E+00         6.62309E+00         8.61132E+01         3.11127E+01         5.50005E+01
+          7.49593E-03         1.76856E-02        -1.12092E-02         4.70910E-01         1.33054E+00         4.71043E-01         8.62085E+01         1.00032E+00         6.60238E+00         8.69530E+01         3.21739E+01         5.47791E+01
+          7.49593E-03         1.78554E-02        -1.13989E-02         4.70908E-01         1.34121E+00         4.71046E-01         8.71407E+01         1.00032E+00         6.58394E+00         8.79015E+01         3.33064E+01         5.45951E+01
+          7.49593E-03         1.80252E-02        -1.15903E-02         4.70907E-01         1.35188E+00         4.71049E-01         8.81680E+01         1.00032E+00         6.56751E+00         8.89422E+01         3.44965E+01         5.44457E+01
+          7.49593E-03         1.81951E-02        -1.17836E-02         4.70905E-01         1.36255E+00         4.71053E-01         8.92745E+01         1.00032E+00         6.55283E+00         9.00593E+01         3.57312E+01         5.43280E+01
+          7.49593E-03         1.83649E-02        -1.19787E-02         4.70904E-01         1.37322E+00         4.71056E-01         9.04451E+01         1.00032E+00         6.53963E+00         9.12378E+01         3.69984E+01         5.42394E+01
+          7.49593E-03         1.85347E-02        -1.21756E-02         4.70902E-01         1.38389E+00         4.71060E-01         9.16656E+01         1.00032E+00         6.52767E+00         9.24635E+01         3.82865E+01         5.41770E+01
+          7.49593E-03         1.87045E-02        -1.23743E-02         4.70901E-01         1.39457E+00         4.71064E-01         9.29223E+01         1.00032E+00         6.51671E+00         9.37227E+01         3.95848E+01         5.41379E+01
+          7.49593E-03         1.88744E-02        -1.25748E-02         4.70899E-01         1.40524E+00         4.71067E-01         9.42025E+01         1.00032E+00         6.50653E+00         9.50027E+01         4.08832E+01         5.41195E+01
+          7.49593E-03         1.90442E-02        -1.27771E-02         4.70898E-01         1.41591E+00         4.71071E-01         9.54940E+01         1.00032E+00         6.49691E+00         9.62915E+01         4.21726E+01         5.41189E+01
+          7.49593E-03         1.92140E-02        -1.29813E-02         4.70896E-01         1.42658E+00         4.71075E-01         9.67854E+01         1.00032E+00         6.48765E+00         9.75777E+01         4.34443E+01         5.41334E+01
+          7.49593E-03         1.93839E-02        -1.31873E-02         4.70895E-01         1.43725E+00         4.71080E-01         9.80662E+01         1.00032E+00         6.47857E+00         9.88508E+01         4.46904E+01         5.41604E+01
+          7.49593E-03         1.95537E-02        -1.33950E-02         4.70893E-01         1.44792E+00         4.71084E-01         9.93264E+01         1.00032E+00         6.46946E+00         1.00101E+02         4.59038E+01         5.41972E+01
+          7.49593E-03         1.97235E-02        -1.36046E-02         4.70892E-01         1.45859E+00         4.71088E-01         1.00557E+02         1.00032E+00         6.46018E+00         1.01319E+02         4.70779E+01         5.42412E+01
+          7.49593E-03         1.98933E-02        -1.38160E-02         4.70890E-01         1.46926E+00         4.71093E-01         1.01749E+02         1.00032E+00         6.45055E+00         1.02497E+02         4.82069E+01         5.42900E+01
+          7.49593E-03         2.00632E-02        -1.40292E-02         4.70889E-01         1.47993E+00         4.71098E-01         1.02895E+02         1.00032E+00         6.44044E+00         1.03626E+02         4.92854E+01         5.43411E+01
+          7.49593E-03         2.02330E-02        -1.42443E-02         4.70887E-01         1.49060E+00         4.71102E-01         1.03989E+02         1.00031E+00         6.42970E+00         1.04701E+02         5.03088E+01         5.43922E+01
+          7.49593E-03         2.04028E-02        -1.44611E-02         4.70885E-01         1.50127E+00         4.71107E-01         1.05022E+02         1.00031E+00         6.41821E+00         1.05714E+02         5.12732E+01         5.44410E+01
+          7.49593E-03         2.05726E-02        -1.46798E-02         4.70884E-01         1.51194E+00         4.71112E-01         1.05991E+02         1.00031E+00         6.40586E+00         1.06660E+02         5.21749E+01         5.44854E+01
+          7.49593E-03         2.07425E-02        -1.49002E-02         4.70882E-01         1.52261E+00         4.71118E-01         1.06889E+02         1.00031E+00         6.39254E+00         1.07534E+02         5.30111E+01         5.45233E+01
+          7.49593E-03         2.09123E-02        -1.51225E-02         4.70880E-01         1.53328E+00         4.71123E-01         1.07713E+02         1.00031E+00         6.37816E+00         1.08332E+02         5.37794E+01         5.45528E+01
+          7.49593E-03         2.10821E-02        -1.53466E-02         4.70879E-01         1.54395E+00         4.71129E-01         1.08457E+02         1.00031E+00         6.36262E+00         1.09050E+02         5.44778E+01         5.45720E+01
+          7.49593E-03         2.12520E-02        -1.55725E-02         4.70877E-01         1.55462E+00         4.71134E-01         1.09120E+02         1.00031E+00         6.34585E+00         1.09684E+02         5.51049E+01         5.45792E+01
+          7.49593E-03         2.14218E-02        -1.58003E-02         4.70875E-01         1.56529E+00         4.71140E-01         1.09699E+02         1.00031E+00         6.32779E+00         1.10232E+02         5.56597E+01         5.45728E+01
+          7.49593E-03         2.15916E-02        -1.60298E-02         4.70874E-01         1.57596E+00         4.71146E-01         1.10190E+02         1.00031E+00         6.30837E+00         1.10693E+02         5.61416E+01         5.45512E+01
+          7.49593E-03         2.17614E-02        -1.62611E-02         4.70872E-01         1.58664E+00         4.71153E-01         1.10593E+02         1.00031E+00         6.28754E+00         1.11064E+02         5.65504E+01         5.45133E+01
+          7.49593E-03         2.19313E-02        -1.64943E-02         4.70870E-01         1.59731E+00         4.71159E-01         1.10906E+02         1.00031E+00         6.26525E+00         1.11344E+02         5.68865E+01         5.44576E+01
+          7.49593E-03         2.21011E-02        -1.67293E-02         4.70868E-01         1.60798E+00         4.71165E-01         1.11129E+02         1.00031E+00         6.24147E+00         1.11533E+02         5.71503E+01         5.43830E+01
+          7.49593E-03         2.22709E-02        -1.69661E-02         4.70867E-01         1.61865E+00         4.71172E-01         1.11262E+02         1.00031E+00         6.21616E+00         1.11631E+02         5.73426E+01         5.42887E+01
+          7.49593E-03         2.24407E-02        -1.72047E-02         4.70865E-01         1.62932E+00         4.71179E-01         1.11304E+02         1.00031E+00         6.18931E+00         1.11638E+02         5.74647E+01         5.41737E+01
+          7.49593E-03         2.26106E-02        -1.74451E-02         4.70863E-01         1.63999E+00         4.71186E-01         1.11256E+02         1.00031E+00         6.16088E+00         1.11555E+02         5.75181E+01         5.40373E+01
+          7.49593E-03         2.27804E-02        -1.76873E-02         4.70861E-01         1.65066E+00         4.71193E-01         1.11120E+02         1.00031E+00         6.13087E+00         1.11383E+02         5.75044E+01         5.38788E+01
+          7.49593E-03         2.29502E-02        -1.79314E-02         4.70859E-01         1.66133E+00         4.71201E-01         1.10896E+02         1.00031E+00         6.09927E+00         1.11123E+02         5.74255E+01         5.36979E+01
+          7.49593E-03         2.31201E-02        -1.81772E-02         4.70857E-01         1.67200E+00         4.71208E-01         1.10586E+02         1.00031E+00         6.06608E+00         1.10778E+02         5.72836E+01         5.34941E+01
+          7.49593E-03         2.32899E-02        -1.84249E-02         4.70856E-01         1.68267E+00         4.71216E-01         1.10193E+02         1.00031E+00         6.03130E+00         1.10348E+02         5.70810E+01         5.32672E+01
+          7.49593E-03         2.34597E-02        -1.86744E-02         4.70854E-01         1.69334E+00         4.71224E-01         1.09718E+02         1.00031E+00         5.99492E+00         1.09837E+02         5.68202E+01         5.30171E+01
+          7.49593E-03         2.36295E-02        -1.89257E-02         4.70852E-01         1.70401E+00         4.71232E-01         1.09163E+02         1.00031E+00         5.95697E+00         1.09247E+02         5.65038E+01         5.27437E+01
+          7.49593E-03         2.37994E-02        -1.91788E-02         4.70850E-01         1.71468E+00         4.71240E-01         1.08533E+02         1.00031E+00         5.91746E+00         1.08582E+02         5.61344E+01         5.24472E+01
+          7.49593E-03         2.39692E-02        -1.94337E-02         4.70848E-01         1.72535E+00         4.71249E-01         1.07829E+02         1.00031E+00         5.87640E+00         1.07843E+02         5.57150E+01         5.21278E+01
+          7.49593E-03         2.41390E-02        -1.96904E-02         4.70846E-01         1.73602E+00         4.71258E-01         1.07054E+02         1.00031E+00         5.83382E+00         1.07034E+02         5.52485E+01         5.17858E+01
+          7.49593E-03         2.43088E-02        -1.99490E-02         4.70844E-01         1.74669E+00         4.71267E-01         1.06213E+02         1.00031E+00         5.78974E+00         1.06159E+02         5.47377E+01         5.14215E+01
+          7.49593E-03         2.44787E-02        -2.02093E-02         4.70842E-01         1.75736E+00         4.71276E-01         1.05308E+02         1.00031E+00         5.74418E+00         1.05221E+02         5.41857E+01         5.10356E+01
+          7.49593E-03         2.46485E-02        -2.04715E-02         4.70840E-01         1.76804E+00         4.71285E-01         1.04343E+02         1.00031E+00         5.69718E+00         1.04224E+02         5.35955E+01         5.06286E+01
+          7.49593E-03         2.48183E-02        -2.07355E-02         4.70838E-01         1.77871E+00         4.71295E-01         1.03321E+02         1.00031E+00         5.64877E+00         1.03171E+02         5.29702E+01         5.02011E+01
+          7.49593E-03         2.49882E-02        -2.10013E-02         4.70836E-01         1.78938E+00         4.71304E-01         1.02247E+02         1.00031E+00         5.59898E+00         1.02067E+02         5.23127E+01         4.97539E+01
+          7.49593E-03         2.51580E-02        -2.12689E-02         4.70834E-01         1.80005E+00         4.71314E-01         1.01123E+02         1.00031E+00         5.54785E+00         1.00914E+02         5.16262E+01         4.92879E+01
+          7.49593E-03         2.53278E-02        -2.15384E-02         4.70832E-01         1.81072E+00         4.71325E-01         9.99544E+01         1.00031E+00         5.49542E+00         9.97175E+01         5.09136E+01         4.88039E+01
+          7.49593E-03         2.54976E-02        -2.18096E-02         4.70830E-01         1.82139E+00         4.71335E-01         9.87444E+01         1.00031E+00         5.44173E+00         9.84807E+01         5.01778E+01         4.83029E+01
+          7.49593E-03         2.56675E-02        -2.20827E-02         4.70828E-01         1.83206E+00         4.71346E-01         9.74968E+01         1.00031E+00         5.38682E+00         9.72076E+01         4.94217E+01         4.77858E+01
+          7.49593E-03         2.58373E-02        -2.23576E-02         4.70826E-01         1.84273E+00         4.71357E-01         9.62155E+01         1.00031E+00         5.33074E+00         9.59020E+01         4.86482E+01         4.72538E+01
+          7.49593E-03         2.60071E-02        -2.26343E-02         4.70824E-01         1.85340E+00         4.71368E-01         9.49042E+01         1.00031E+00         5.27352E+00         9.45679E+01         4.78600E+01         4.67079E+01
+          7.49593E-03         2.61769E-02        -2.29128E-02         4.70822E-01         1.86407E+00         4.71379E-01         9.35667E+01         1.00031E+00         5.21523E+00         9.32089E+01         4.70598E+01         4.61492E+01
+          7.66576E-03         8.72665E-04        -1.48728E-03         4.81654E-01         2.74155E-01         4.81656E-01         2.56348E+03         1.00018E+00         4.31017E+01         2.56427E+03         2.28932E+03         2.74945E+02
+          7.66576E-03         1.04249E-03        -1.49750E-03         4.81654E-01         2.84826E-01         4.81656E-01         2.52641E+03         1.00018E+00         4.24919E+01         2.52713E+03         2.25431E+03         2.72827E+02
+          7.66576E-03         1.21232E-03        -1.50953E-03         4.81654E-01         2.95496E-01         4.81656E-01         2.48844E+03         1.00018E+00         4.18687E+01         2.48909E+03         2.21844E+03         2.70651E+02
+          7.66576E-03         1.38215E-03        -1.52337E-03         4.81653E-01         3.06167E-01         4.81656E-01         2.44960E+03         1.00018E+00         4.12332E+01         2.45018E+03         2.18176E+03         2.68417E+02
+          7.66576E-03         1.55197E-03        -1.53902E-03         4.81653E-01         3.16838E-01         4.81656E-01         2.40995E+03         1.00018E+00         4.05863E+01         2.41046E+03         2.14433E+03         2.66128E+02
+          7.66576E-03         1.72180E-03        -1.55649E-03         4.81653E-01         3.27508E-01         4.81656E-01         2.36955E+03         1.00018E+00         3.99289E+01         2.36999E+03         2.10620E+03         2.63787E+02
+          7.66576E-03         1.89163E-03        -1.57577E-03         4.81653E-01         3.38179E-01         4.81656E-01         2.32844E+03         1.00018E+00         3.92621E+01         2.32881E+03         2.06742E+03         2.61394E+02
+          7.66576E-03         2.06146E-03        -1.59686E-03         4.81653E-01         3.48849E-01         4.81656E-01         2.28668E+03         1.00018E+00         3.85868E+01         2.28698E+03         2.02803E+03         2.58952E+02
+          7.66576E-03         2.23128E-03        -1.61976E-03         4.81653E-01         3.59520E-01         4.81655E-01         2.24433E+03         1.00018E+00         3.79040E+01         2.24455E+03         1.98809E+03         2.56463E+02
+          7.66576E-03         2.40111E-03        -1.64447E-03         4.81653E-01         3.70190E-01         4.81655E-01         2.20142E+03         1.00018E+00         3.72148E+01         2.20158E+03         1.94765E+03         2.53928E+02
+          7.66576E-03         2.57094E-03        -1.67100E-03         4.81652E-01         3.80861E-01         4.81655E-01         2.15803E+03         1.00018E+00         3.65200E+01         2.15811E+03         1.90676E+03         2.51349E+02
+          7.66576E-03         2.74077E-03        -1.69934E-03         4.81652E-01         3.91532E-01         4.81655E-01         2.11419E+03         1.00018E+00         3.58206E+01         2.11420E+03         1.86547E+03         2.48729E+02
+          7.66576E-03         2.91059E-03        -1.72949E-03         4.81652E-01         4.02202E-01         4.81655E-01         2.06997E+03         1.00018E+00         3.51176E+01         2.06991E+03         1.82384E+03         2.46069E+02
+          7.66576E-03         3.08042E-03        -1.76145E-03         4.81652E-01         4.12873E-01         4.81655E-01         2.02542E+03         1.00018E+00         3.44120E+01         2.02529E+03         1.78192E+03         2.43371E+02
+          7.66576E-03         3.25025E-03        -1.79523E-03         4.81651E-01         4.23543E-01         4.81655E-01         1.98059E+03         1.00018E+00         3.37046E+01         1.98039E+03         1.73975E+03         2.40637E+02
+          7.66576E-03         3.42008E-03        -1.83082E-03         4.81651E-01         4.34214E-01         4.81655E-01         1.93554E+03         1.00018E+00         3.29964E+01         1.93527E+03         1.69740E+03         2.37868E+02
+          7.66576E-03         3.58990E-03        -1.86822E-03         4.81651E-01         4.44884E-01         4.81654E-01         1.89031E+03         1.00018E+00         3.22883E+01         1.88997E+03         1.65490E+03         2.35066E+02
+          7.66576E-03         3.75973E-03        -1.90743E-03         4.81651E-01         4.55555E-01         4.81654E-01         1.84495E+03         1.00018E+00         3.15811E+01         1.84455E+03         1.61232E+03         2.32232E+02
+          7.66576E-03         3.92956E-03        -1.94845E-03         4.81650E-01         4.66225E-01         4.81654E-01         1.79953E+03         1.00018E+00         3.08758E+01         1.79906E+03         1.56969E+03         2.29369E+02
+          7.66576E-03         4.09939E-03        -1.99129E-03         4.81650E-01         4.76896E-01         4.81654E-01         1.75408E+03         1.00018E+00         3.01731E+01         1.75355E+03         1.52707E+03         2.26478E+02
+          7.66576E-03         4.26921E-03        -2.03593E-03         4.81650E-01         4.87567E-01         4.81654E-01         1.70867E+03         1.00018E+00         2.94739E+01         1.70807E+03         1.48451E+03         2.23561E+02
+          7.66576E-03         4.43904E-03        -2.08239E-03         4.81649E-01         4.98237E-01         4.81654E-01         1.66333E+03         1.00018E+00         2.87789E+01         1.66267E+03         1.44205E+03         2.20618E+02
+          7.66576E-03         4.60887E-03        -2.13067E-03         4.81649E-01         5.08908E-01         4.81654E-01         1.61811E+03         1.00018E+00         2.80889E+01         1.61740E+03         1.39974E+03         2.17653E+02
+          7.66576E-03         4.77869E-03        -2.18075E-03         4.81648E-01         5.19578E-01         4.81653E-01         1.57307E+03         1.00018E+00         2.74046E+01         1.57230E+03         1.35763E+03         2.14665E+02
+          7.66576E-03         4.94852E-03        -2.23265E-03         4.81648E-01         5.30249E-01         4.81653E-01         1.52824E+03         1.00018E+00         2.67268E+01         1.52742E+03         1.31576E+03         2.11658E+02
+          7.66576E-03         5.11835E-03        -2.28636E-03         4.81648E-01         5.40919E-01         4.81653E-01         1.48368E+03         1.00018E+00         2.60561E+01         1.48280E+03         1.27417E+03         2.08631E+02
+          7.66576E-03         5.28818E-03        -2.34188E-03         4.81647E-01         5.51590E-01         4.81653E-01         1.43943E+03         1.00018E+00         2.53931E+01         1.43849E+03         1.23291E+03         2.05588E+02
+          7.66576E-03         5.45800E-03        -2.39921E-03         4.81647E-01         5.62261E-01         4.81653E-01         1.39552E+03         1.00018E+00         2.47385E+01         1.39454E+03         1.19201E+03         2.02529E+02
+          7.66576E-03         5.62783E-03        -2.45836E-03         4.81646E-01         5.72931E-01         4.81653E-01         1.35199E+03         1.00018E+00         2.40927E+01         1.35097E+03         1.15151E+03         1.99455E+02
+          7.66576E-03         5.79766E-03        -2.51931E-03         4.81646E-01         5.83602E-01         4.81652E-01         1.30890E+03         1.00018E+00         2.34564E+01         1.30783E+03         1.11146E+03         1.96369E+02
+          7.66576E-03         5.96749E-03        -2.58208E-03         4.81645E-01         5.94272E-01         4.81652E-01         1.26627E+03         1.00018E+00         2.28301E+01         1.26516E+03         1.07189E+03         1.93271E+02
+          7.66576E-03         6.13731E-03        -2.64666E-03         4.81645E-01         6.04943E-01         4.81652E-01         1.22415E+03         1.00018E+00         2.22141E+01         1.22300E+03         1.03284E+03         1.90164E+02
+          7.66576E-03         6.30714E-03        -2.71306E-03         4.81644E-01         6.15613E-01         4.81652E-01         1.18256E+03         1.00018E+00         2.16090E+01         1.18138E+03         9.94329E+02         1.87049E+02
+          7.66576E-03         6.47697E-03        -2.78126E-03         4.81644E-01         6.26284E-01         4.81652E-01         1.14154E+03         1.00018E+00         2.10151E+01         1.14033E+03         9.56401E+02         1.83927E+02
+          7.66576E-03         6.64680E-03        -2.85128E-03         4.81643E-01         6.36955E-01         4.81652E-01         1.10113E+03         1.00018E+00         2.04328E+01         1.09988E+03         9.19083E+02         1.80800E+02
+          7.66576E-03         6.81662E-03        -2.92311E-03         4.81643E-01         6.47625E-01         4.81652E-01         1.06134E+03         1.00018E+00         1.98623E+01         1.06007E+03         8.82404E+02         1.77669E+02
+          7.66576E-03         6.98645E-03        -2.99676E-03         4.81642E-01         6.58296E-01         4.81652E-01         1.02222E+03         1.00018E+00         1.93041E+01         1.02093E+03         8.46391E+02         1.74537E+02
+          7.66576E-03         7.15628E-03        -3.07221E-03         4.81642E-01         6.68966E-01         4.81651E-01         9.83790E+02         1.00018E+00         1.87582E+01         9.82474E+02         8.11070E+02         1.71404E+02
+          7.66576E-03         7.32611E-03        -3.14948E-03         4.81641E-01         6.79637E-01         4.81651E-01         9.46070E+02         1.00018E+00         1.82251E+01         9.44736E+02         7.76463E+02         1.68273E+02
+          7.66576E-03         7.49593E-03        -3.22856E-03         4.81640E-01         6.90307E-01         4.81651E-01         9.09087E+02         1.00018E+00         1.77047E+01         9.07738E+02         7.42593E+02         1.65145E+02
+          7.66576E-03         7.66576E-03        -3.30945E-03         4.81640E-01         7.00978E-01         4.81651E-01         8.72863E+02         1.00018E+00         1.71972E+01         8.71501E+02         7.09480E+02         1.62022E+02
+          7.66576E-03         7.83559E-03        -3.39216E-03         4.81639E-01         7.11649E-01         4.81651E-01         8.37418E+02         1.00018E+00         1.67029E+01         8.36047E+02         6.77142E+02         1.58905E+02
+          7.66576E-03         8.00542E-03        -3.47667E-03         4.81639E-01         7.22319E-01         4.81651E-01         8.02770E+02         1.00018E+00         1.62217E+01         8.01393E+02         6.45596E+02         1.55797E+02
+          7.66576E-03         8.17524E-03        -3.56300E-03         4.81638E-01         7.32990E-01         4.81651E-01         7.68936E+02         1.00018E+00         1.57536E+01         7.67556E+02         6.14856E+02         1.52699E+02
+          7.66576E-03         8.34507E-03        -3.65114E-03         4.81637E-01         7.43660E-01         4.81651E-01         7.35931E+02         1.00018E+00         1.52988E+01         7.34551E+02         5.84937E+02         1.49614E+02
+          7.66576E-03         8.51490E-03        -3.74109E-03         4.81636E-01         7.54331E-01         4.81651E-01         7.03769E+02         1.00018E+00         1.48572E+01         7.02391E+02         5.55849E+02         1.46542E+02
+          7.66576E-03         8.68473E-03        -3.83286E-03         4.81636E-01         7.65001E-01         4.81651E-01         6.72461E+02         1.00018E+00         1.44287E+01         6.71089E+02         5.27602E+02         1.43487E+02
+          7.66576E-03         8.85455E-03        -3.92644E-03         4.81635E-01         7.75672E-01         4.81651E-01         6.42018E+02         1.00018E+00         1.40132E+01         6.40653E+02         5.00204E+02         1.40449E+02
+          7.66576E-03         9.02438E-03        -4.02183E-03         4.81634E-01         7.86343E-01         4.81651E-01         6.12447E+02         1.00018E+00         1.36108E+01         6.11093E+02         4.73662E+02         1.37431E+02
+          7.66576E-03         9.19421E-03        -4.11903E-03         4.81634E-01         7.97013E-01         4.81651E-01         5.83755E+02         1.00018E+00         1.32212E+01         5.82415E+02         4.47979E+02         1.34436E+02
+          7.66576E-03         9.36403E-03        -4.21805E-03         4.81633E-01         8.07684E-01         4.81651E-01         5.55947E+02         1.00018E+00         1.28443E+01         5.54624E+02         4.23160E+02         1.31464E+02
+          7.66576E-03         9.53386E-03        -4.31887E-03         4.81632E-01         8.18354E-01         4.81651E-01         5.29028E+02         1.00018E+00         1.24801E+01         5.27723E+02         3.99205E+02         1.28518E+02
+          7.66576E-03         9.70369E-03        -4.42151E-03         4.81631E-01         8.29025E-01         4.81652E-01         5.02999E+02         1.00018E+00         1.21282E+01         5.01716E+02         3.76115E+02         1.25601E+02
+          7.66576E-03         9.87352E-03        -4.52596E-03         4.81630E-01         8.39695E-01         4.81652E-01         4.77861E+02         1.00018E+00         1.17885E+01         4.76601E+02         3.53888E+02         1.22713E+02
+          7.66576E-03         1.00433E-02        -4.63223E-03         4.81630E-01         8.50366E-01         4.81652E-01         4.53612E+02         1.00018E+00         1.14608E+01         4.52378E+02         3.32520E+02         1.19858E+02
+          7.66576E-03         1.02132E-02        -4.74031E-03         4.81629E-01         8.61037E-01         4.81652E-01         4.30251E+02         1.00018E+00         1.11450E+01         4.29046E+02         3.12008E+02         1.17037E+02
+          7.66576E-03         1.03830E-02        -4.85019E-03         4.81628E-01         8.71707E-01         4.81652E-01         4.07774E+02         1.00018E+00         1.08407E+01         4.06599E+02         2.92345E+02         1.14253E+02
+          7.66576E-03         1.05528E-02        -4.96190E-03         4.81627E-01         8.82378E-01         4.81653E-01         3.86175E+02         1.00018E+00         1.05477E+01         3.85032E+02         2.73525E+02         1.11508E+02
+          7.66576E-03         1.07227E-02        -5.07541E-03         4.81626E-01         8.93048E-01         4.81653E-01         3.65449E+02         1.00018E+00         1.02658E+01         3.64340E+02         2.55538E+02         1.08803E+02
+          7.66576E-03         1.08925E-02        -5.19074E-03         4.81625E-01         9.03719E-01         4.81653E-01         3.45587E+02         1.00018E+00         9.99482E+00         3.44514E+02         2.38374E+02         1.06140E+02
+          7.66576E-03         1.10623E-02        -5.30787E-03         4.81624E-01         9.14389E-01         4.81654E-01         3.26581E+02         1.00018E+00         9.73442E+00         3.25546E+02         2.22024E+02         1.03522E+02
+          7.66576E-03         1.12321E-02        -5.42683E-03         4.81624E-01         9.25060E-01         4.81654E-01         3.08420E+02         1.00018E+00         9.48438E+00         3.07426E+02         2.06474E+02         1.00951E+02
+          7.66576E-03         1.14020E-02        -5.54759E-03         4.81623E-01         9.35731E-01         4.81655E-01         2.91095E+02         1.00018E+00         9.24446E+00         2.90141E+02         1.91713E+02         9.84284E+01
+          7.66576E-03         1.15718E-02        -5.67017E-03         4.81622E-01         9.46401E-01         4.81655E-01         2.74592E+02         1.00018E+00         9.01440E+00         2.73680E+02         1.77724E+02         9.59561E+01
+          7.66576E-03         1.17416E-02        -5.79455E-03         4.81621E-01         9.57072E-01         4.81656E-01         2.58898E+02         1.00018E+00         8.79398E+00         2.58030E+02         1.64494E+02         9.35361E+01
+          7.66576E-03         1.19114E-02        -5.92075E-03         4.81620E-01         9.67742E-01         4.81656E-01         2.44000E+02         1.00018E+00         8.58295E+00         2.43177E+02         1.52007E+02         9.11699E+01
+          7.66576E-03         1.20813E-02        -6.04877E-03         4.81619E-01         9.78413E-01         4.81657E-01         2.29882E+02         1.00018E+00         8.38107E+00         2.29105E+02         1.40245E+02         8.88595E+01
+          7.66576E-03         1.22511E-02        -6.17859E-03         4.81618E-01         9.89083E-01         4.81657E-01         2.16529E+02         1.00018E+00         8.18811E+00         2.15798E+02         1.29192E+02         8.66063E+01
+          7.66576E-03         1.24209E-02        -6.31023E-03         4.81617E-01         9.99754E-01         4.81658E-01         2.03923E+02         1.00018E+00         8.00386E+00         2.03240E+02         1.18828E+02         8.44118E+01
+          7.66576E-03         1.25908E-02        -6.44368E-03         4.81616E-01         1.01042E+00         4.81659E-01         1.92049E+02         1.00018E+00         7.82807E+00         1.91413E+02         1.09136E+02         8.22775E+01
+          7.66576E-03         1.27606E-02        -6.57895E-03         4.81615E-01         1.02110E+00         4.81660E-01         1.80887E+02         1.00018E+00         7.66055E+00         1.80299E+02         1.00095E+02         8.02047E+01
+          7.66576E-03         1.29304E-02        -6.71602E-03         4.81614E-01         1.03177E+00         4.81661E-01         1.70419E+02         1.00018E+00         7.50108E+00         1.69880E+02         9.16856E+01         7.81946E+01
+          7.66576E-03         1.31002E-02        -6.85491E-03         4.81613E-01         1.04244E+00         4.81661E-01         1.60626E+02         1.00018E+00         7.34945E+00         1.60136E+02         8.38876E+01         7.62484E+01
+          7.66576E-03         1.32701E-02        -6.99561E-03         4.81612E-01         1.05311E+00         4.81662E-01         1.51488E+02         1.00018E+00         7.20546E+00         1.51047E+02         7.66803E+01         7.43670E+01
+          7.66576E-03         1.34399E-02        -7.13813E-03         4.81610E-01         1.06378E+00         4.81663E-01         1.42985E+02         1.00018E+00         7.06891E+00         1.42594E+02         7.00423E+01         7.25513E+01
+          7.66576E-03         1.36097E-02        -7.28245E-03         4.81609E-01         1.07445E+00         4.81664E-01         1.35097E+02         1.00018E+00         6.93960E+00         1.34755E+02         6.39525E+01         7.08021E+01
+          7.66576E-03         1.37795E-02        -7.42859E-03         4.81608E-01         1.08512E+00         4.81666E-01         1.27803E+02         1.00018E+00         6.81734E+00         1.27509E+02         5.83892E+01         6.91199E+01
+          7.66576E-03         1.39494E-02        -7.57654E-03         4.81607E-01         1.09579E+00         4.81667E-01         1.21082E+02         1.00018E+00         6.70194E+00         1.20836E+02         5.33308E+01         6.75053E+01
+          7.66576E-03         1.41192E-02        -7.72631E-03         4.81606E-01         1.10646E+00         4.81668E-01         1.14912E+02         1.00018E+00         6.59319E+00         1.14714E+02         4.87556E+01         6.59585E+01
+          7.66576E-03         1.42890E-02        -7.87788E-03         4.81605E-01         1.11713E+00         4.81669E-01         1.09273E+02         1.00018E+00         6.49092E+00         1.09122E+02         4.46417E+01         6.44799E+01
+          7.66576E-03         1.44589E-02        -8.03127E-03         4.81604E-01         1.12780E+00         4.81671E-01         1.04142E+02         1.00018E+00         6.39491E+00         1.04037E+02         4.09673E+01         6.30694E+01
+          7.66576E-03         1.46287E-02        -8.18648E-03         4.81602E-01         1.13847E+00         4.81672E-01         9.94973E+01         1.00018E+00         6.30498E+00         9.94378E+01         3.77107E+01         6.17271E+01
+          7.66576E-03         1.47985E-02        -8.34349E-03         4.81601E-01         1.14914E+00         4.81673E-01         9.53181E+01         1.00018E+00         6.22092E+00         9.53030E+01         3.48505E+01         6.04525E+01
+          7.66576E-03         1.49683E-02        -8.50232E-03         4.81600E-01         1.15981E+00         4.81675E-01         9.15823E+01         1.00018E+00         6.14253E+00         9.16107E+01         3.23651E+01         5.92455E+01
+          7.66576E-03         1.51382E-02        -8.66296E-03         4.81599E-01         1.17048E+00         4.81677E-01         8.82683E+01         1.00018E+00         6.06960E+00         8.83389E+01         3.02335E+01         5.81055E+01
+          7.66576E-03         1.53080E-02        -8.82541E-03         4.81598E-01         1.18115E+00         4.81678E-01         8.53546E+01         1.00018E+00         6.00192E+00         8.54664E+01         2.84346E+01         5.70318E+01
+          7.66576E-03         1.54778E-02        -8.98968E-03         4.81596E-01         1.19182E+00         4.81680E-01         8.28200E+01         1.00018E+00         5.93927E+00         8.29715E+01         2.69479E+01         5.60236E+01
+          7.66576E-03         1.56476E-02        -9.15576E-03         4.81595E-01         1.20249E+00         4.81682E-01         8.06433E+01         1.00018E+00         5.88144E+00         8.08331E+01         2.57531E+01         5.50799E+01
+          7.66576E-03         1.58175E-02        -9.32365E-03         4.81594E-01         1.21317E+00         4.81684E-01         7.88036E+01         1.00018E+00         5.82820E+00         7.90302E+01         2.48304E+01         5.41998E+01
+          7.66576E-03         1.59873E-02        -9.49335E-03         4.81592E-01         1.22384E+00         4.81686E-01         7.72803E+01         1.00018E+00         5.77933E+00         7.75422E+01         2.41603E+01         5.33819E+01
+          7.66576E-03         1.61571E-02        -9.66487E-03         4.81591E-01         1.23451E+00         4.81688E-01         7.60532E+01         1.00018E+00         5.73459E+00         7.63487E+01         2.37237E+01         5.26250E+01
+          7.66576E-03         1.63270E-02        -9.83820E-03         4.81590E-01         1.24518E+00         4.81690E-01         7.51022E+01         1.00018E+00         5.69376E+00         7.54296E+01         2.35021E+01         5.19275E+01
+          7.66576E-03         1.64968E-02        -1.00133E-02         4.81588E-01         1.25585E+00         4.81693E-01         7.44077E+01         1.00018E+00         5.65659E+00         7.47654E+01         2.34775E+01         5.12879E+01
+          7.66576E-03         1.66666E-02        -1.01903E-02         4.81587E-01         1.26652E+00         4.81695E-01         7.39507E+01         1.00018E+00         5.62286E+00         7.43369E+01         2.36325E+01         5.07044E+01
+          7.66576E-03         1.68364E-02        -1.03691E-02         4.81586E-01         1.27719E+00         4.81697E-01         7.37124E+01         1.00018E+00         5.59233E+00         7.41252E+01         2.39499E+01         5.01753E+01
+          7.66576E-03         1.70063E-02        -1.05496E-02         4.81584E-01         1.28786E+00         4.81700E-01         7.36746E+01         1.00018E+00         5.56477E+00         7.41121E+01         2.44136E+01         4.96985E+01
+          7.66576E-03         1.71761E-02        -1.07320E-02         4.81583E-01         1.29853E+00         4.81702E-01         7.38194E+01         1.00018E+00         5.53994E+00         7.42797E+01         2.50077E+01         4.92720E+01
+          7.66576E-03         1.73459E-02        -1.09162E-02         4.81581E-01         1.30920E+00         4.81705E-01         7.41296E+01         1.00018E+00         5.51761E+00         7.46108E+01         2.57170E+01         4.88938E+01
+          7.66576E-03         1.75158E-02        -1.11023E-02         4.81580E-01         1.31987E+00         4.81708E-01         7.45884E+01         1.00018E+00         5.49757E+00         7.50887E+01         2.65270E+01         4.85616E+01
+          7.66576E-03         1.76856E-02        -1.12901E-02         4.81579E-01         1.33054E+00         4.81711E-01         7.51798E+01         1.00018E+00         5.47957E+00         7.56970E+01         2.74238E+01         4.82732E+01
+          7.66576E-03         1.78554E-02        -1.14797E-02         4.81577E-01         1.34121E+00         4.81714E-01         7.58880E+01         1.00018E+00         5.46342E+00         7.64203E+01         2.83941E+01         4.80262E+01
+          7.66576E-03         1.80252E-02        -1.16712E-02         4.81576E-01         1.35188E+00         4.81717E-01         7.66981E+01         1.00018E+00         5.44889E+00         7.72434E+01         2.94252E+01         4.78182E+01
+          7.66576E-03         1.81951E-02        -1.18645E-02         4.81574E-01         1.36255E+00         4.81720E-01         7.75955E+01         1.00018E+00         5.43578E+00         7.81519E+01         3.05052E+01         4.76467E+01
+          7.66576E-03         1.83649E-02        -1.20596E-02         4.81573E-01         1.37322E+00         4.81724E-01         7.85665E+01         1.00018E+00         5.42389E+00         7.91321E+01         3.16228E+01         4.75093E+01
+          7.66576E-03         1.85347E-02        -1.22565E-02         4.81571E-01         1.38389E+00         4.81727E-01         7.95979E+01         1.00018E+00         5.41303E+00         8.01706E+01         3.27672E+01         4.74034E+01
+          7.66576E-03         1.87045E-02        -1.24552E-02         4.81570E-01         1.39457E+00         4.81731E-01         8.06769E+01         1.00018E+00         5.40302E+00         8.12548E+01         3.39284E+01         4.73264E+01
+          7.66576E-03         1.88744E-02        -1.26557E-02         4.81568E-01         1.40524E+00         4.81734E-01         8.17917E+01         1.00018E+00         5.39367E+00         8.23729E+01         3.50971E+01         4.72759E+01
+          7.66576E-03         1.90442E-02        -1.28580E-02         4.81567E-01         1.41591E+00         4.81738E-01         8.29308E+01         1.00018E+00         5.38483E+00         8.35135E+01         3.62644E+01         4.72491E+01
+          7.66576E-03         1.92140E-02        -1.30622E-02         4.81565E-01         1.42658E+00         4.81742E-01         8.40836E+01         1.00018E+00         5.37633E+00         8.46659E+01         3.74222E+01         4.72437E+01
+          7.66576E-03         1.93839E-02        -1.32681E-02         4.81563E-01         1.43725E+00         4.81746E-01         8.52400E+01         1.00018E+00         5.36802E+00         8.58200E+01         3.85631E+01         4.72569E+01
+          7.66576E-03         1.95537E-02        -1.34759E-02         4.81562E-01         1.44792E+00         4.81750E-01         8.63904E+01         1.00018E+00         5.35976E+00         8.69664E+01         3.96802E+01         4.72863E+01
+          7.66576E-03         1.97235E-02        -1.36855E-02         4.81560E-01         1.45859E+00         4.81755E-01         8.75260E+01         1.00018E+00         5.35142E+00         8.80963E+01         4.07671E+01         4.73293E+01
+          7.66576E-03         1.98933E-02        -1.38969E-02         4.81559E-01         1.46926E+00         4.81759E-01         8.86386E+01         1.00018E+00         5.34286E+00         8.92016E+01         4.18181E+01         4.73835E+01
+          7.66576E-03         2.00632E-02        -1.41101E-02         4.81557E-01         1.47993E+00         4.81764E-01         8.97206E+01         1.00018E+00         5.33398E+00         9.02745E+01         4.28281E+01         4.74464E+01
+          7.66576E-03         2.02330E-02        -1.43252E-02         4.81555E-01         1.49060E+00         4.81768E-01         9.07649E+01         1.00018E+00         5.32467E+00         9.13083E+01         4.37925E+01         4.75158E+01
+          7.66576E-03         2.04028E-02        -1.45420E-02         4.81554E-01         1.50127E+00         4.81773E-01         9.17651E+01         1.00018E+00         5.31482E+00         9.22965E+01         4.47073E+01         4.75892E+01
+          7.66576E-03         2.05726E-02        -1.47607E-02         4.81552E-01         1.51194E+00         4.81778E-01         9.27154E+01         1.00018E+00         5.30435E+00         9.32333E+01         4.55688E+01         4.76645E+01
+          7.66576E-03         2.07425E-02        -1.49811E-02         4.81550E-01         1.52261E+00         4.81783E-01         9.36105E+01         1.00018E+00         5.29316E+00         9.41135E+01         4.63742E+01         4.77394E+01
+          7.66576E-03         2.09123E-02        -1.52034E-02         4.81549E-01         1.53328E+00         4.81789E-01         9.44456E+01         1.00018E+00         5.28119E+00         9.49326E+01         4.71207E+01         4.78119E+01
+          7.66576E-03         2.10821E-02        -1.54275E-02         4.81547E-01         1.54395E+00         4.81794E-01         9.52167E+01         1.00018E+00         5.26836E+00         9.56863E+01         4.78063E+01         4.78800E+01
+          7.66576E-03         2.12520E-02        -1.56534E-02         4.81545E-01         1.55462E+00         4.81800E-01         9.59200E+01         1.00018E+00         5.25461E+00         9.63711E+01         4.84294E+01         4.79417E+01
+          7.66576E-03         2.14218E-02        -1.58811E-02         4.81543E-01         1.56529E+00         4.81805E-01         9.65524E+01         1.00018E+00         5.23988E+00         9.69840E+01         4.89887E+01         4.79954E+01
+          7.66576E-03         2.15916E-02        -1.61107E-02         4.81542E-01         1.57596E+00         4.81811E-01         9.71113E+01         1.00018E+00         5.22413E+00         9.75225E+01         4.94833E+01         4.80392E+01
+          7.66576E-03         2.17614E-02        -1.63420E-02         4.81540E-01         1.58664E+00         4.81817E-01         9.75945E+01         1.00018E+00         5.20730E+00         9.79843E+01         4.99128E+01         4.80715E+01
+          7.66576E-03         2.19313E-02        -1.65752E-02         4.81538E-01         1.59731E+00         4.81823E-01         9.80004E+01         1.00018E+00         5.18937E+00         9.83680E+01         5.02770E+01         4.80909E+01
+          7.66576E-03         2.21011E-02        -1.68101E-02         4.81536E-01         1.60798E+00         4.81830E-01         9.83276E+01         1.00018E+00         5.17030E+00         9.86723E+01         5.05762E+01         4.80961E+01
+          7.66576E-03         2.22709E-02        -1.70469E-02         4.81534E-01         1.61865E+00         4.81836E-01         9.85754E+01         1.00018E+00         5.15005E+00         9.88964E+01         5.08109E+01         4.80856E+01
+          7.66576E-03         2.24407E-02        -1.72855E-02         4.81533E-01         1.62932E+00         4.81843E-01         9.87433E+01         1.00018E+00         5.12862E+00         9.90402E+01         5.09818E+01         4.80584E+01
+          7.66576E-03         2.26106E-02        -1.75260E-02         4.81531E-01         1.63999E+00         4.81850E-01         9.88312E+01         1.00018E+00         5.10598E+00         9.91035E+01         5.10900E+01         4.80134E+01
+          7.66576E-03         2.27804E-02        -1.77682E-02         4.81529E-01         1.65066E+00         4.81857E-01         9.88395E+01         1.00018E+00         5.08212E+00         9.90867E+01         5.11369E+01         4.79498E+01
+          7.66576E-03         2.29502E-02        -1.80122E-02         4.81527E-01         1.66133E+00         4.81864E-01         9.87688E+01         1.00018E+00         5.05702E+00         9.89907E+01         5.11240E+01         4.78667E+01
+          7.66576E-03         2.31201E-02        -1.82581E-02         4.81525E-01         1.67200E+00         4.81871E-01         9.86201E+01         1.00018E+00         5.03069E+00         9.88164E+01         5.10529E+01         4.77635E+01
+          7.66576E-03         2.32899E-02        -1.85058E-02         4.81523E-01         1.68267E+00         4.81879E-01         9.83947E+01         1.00018E+00         5.00312E+00         9.85652E+01         5.09256E+01         4.76396E+01
+          7.66576E-03         2.34597E-02        -1.87552E-02         4.81521E-01         1.69334E+00         4.81887E-01         9.80940E+01         1.00018E+00         4.97432E+00         9.82388E+01         5.07442E+01         4.74945E+01
+          7.66576E-03         2.36295E-02        -1.90065E-02         4.81519E-01         1.70401E+00         4.81894E-01         9.77199E+01         1.00018E+00         4.94429E+00         9.78389E+01         5.05109E+01         4.73280E+01
+          7.66576E-03         2.37994E-02        -1.92596E-02         4.81518E-01         1.71468E+00         4.81903E-01         9.72745E+01         1.00018E+00         4.91304E+00         9.73678E+01         5.02280E+01         4.71398E+01
+          7.66576E-03         2.39692E-02        -1.95146E-02         4.81516E-01         1.72535E+00         4.81911E-01         9.67600E+01         1.00018E+00         4.88058E+00         9.68277E+01         4.98979E+01         4.69298E+01
+          7.66576E-03         2.41390E-02        -1.97713E-02         4.81514E-01         1.73602E+00         4.81919E-01         9.61787E+01         1.00018E+00         4.84692E+00         9.62212E+01         4.95232E+01         4.66980E+01
+          7.66576E-03         2.43088E-02        -2.00299E-02         4.81512E-01         1.74669E+00         4.81928E-01         9.55335E+01         1.00018E+00         4.81208E+00         9.55510E+01         4.91064E+01         4.64446E+01
+          7.66576E-03         2.44787E-02        -2.02902E-02         4.81510E-01         1.75736E+00         4.81937E-01         9.48270E+01         1.00018E+00         4.77609E+00         9.48199E+01         4.86502E+01         4.61697E+01
+          7.66576E-03         2.46485E-02        -2.05524E-02         4.81508E-01         1.76804E+00         4.81946E-01         9.40621E+01         1.00018E+00         4.73895E+00         9.40309E+01         4.81573E+01         4.58736E+01
+          7.66576E-03         2.48183E-02        -2.08164E-02         4.81506E-01         1.77871E+00         4.81955E-01         9.32419E+01         1.00018E+00         4.70070E+00         9.31870E+01         4.76303E+01         4.55567E+01
+          7.66576E-03         2.49882E-02        -2.10822E-02         4.81504E-01         1.78938E+00         4.81965E-01         9.23695E+01         1.00018E+00         4.66136E+00         9.22916E+01         4.70720E+01         4.52196E+01
+          7.66576E-03         2.51580E-02        -2.13498E-02         4.81502E-01         1.80005E+00         4.81975E-01         9.14482E+01         1.00018E+00         4.62095E+00         9.13478E+01         4.64851E+01         4.48627E+01
+          7.66576E-03         2.53278E-02        -2.16193E-02         4.81499E-01         1.81072E+00         4.81985E-01         9.04811E+01         1.00018E+00         4.57951E+00         9.03590E+01         4.58723E+01         4.44867E+01
+          7.66576E-03         2.54976E-02        -2.18905E-02         4.81497E-01         1.82139E+00         4.81995E-01         8.94717E+01         1.00018E+00         4.53706E+00         8.93285E+01         4.52362E+01         4.40923E+01
+          7.66576E-03         2.56675E-02        -2.21636E-02         4.81495E-01         1.83206E+00         4.82005E-01         8.84232E+01         1.00018E+00         4.49364E+00         8.82599E+01         4.45795E+01         4.36804E+01
+          7.66576E-03         2.58373E-02        -2.24384E-02         4.81493E-01         1.84273E+00         4.82016E-01         8.73391E+01         1.00018E+00         4.44929E+00         8.71563E+01         4.39047E+01         4.32517E+01
+          7.66576E-03         2.60071E-02        -2.27151E-02         4.81491E-01         1.85340E+00         4.82027E-01         8.62227E+01         1.00018E+00         4.40402E+00         8.60214E+01         4.32143E+01         4.28071E+01
+          7.66576E-03         2.61769E-02        -2.29936E-02         4.81489E-01         1.86407E+00         4.82038E-01         8.50774E+01         1.00017E+00         4.35789E+00         8.48585E+01         4.25109E+01         4.23476E+01
+          7.83559E-03         8.72665E-04        -1.56999E-03         4.92324E-01         2.74155E-01         4.92327E-01         2.27482E+03         1.00009E+00         3.43856E+01         2.27564E+03         2.01302E+03         2.62625E+02
+          7.83559E-03         1.04249E-03        -1.58020E-03         4.92324E-01         2.84826E-01         4.92327E-01         2.24255E+03         1.00009E+00         3.39020E+01         2.24332E+03         1.98297E+03         2.60353E+02
+          7.83559E-03         1.21232E-03        -1.59223E-03         4.92324E-01         2.95496E-01         4.92327E-01         2.20948E+03         1.00009E+00         3.34077E+01         2.21020E+03         1.95217E+03         2.58027E+02
+          7.83559E-03         1.38215E-03        -1.60608E-03         4.92324E-01         3.06167E-01         4.92327E-01         2.17566E+03         1.00009E+00         3.29037E+01         2.17632E+03         1.92067E+03         2.55650E+02
+          7.83559E-03         1.55197E-03        -1.62173E-03         4.92324E-01         3.16838E-01         4.92327E-01         2.14112E+03         1.00009E+00         3.23907E+01         2.14173E+03         1.88851E+03         2.53224E+02
+          7.83559E-03         1.72180E-03        -1.63920E-03         4.92324E-01         3.27508E-01         4.92327E-01         2.10592E+03         1.00009E+00         3.18694E+01         2.10648E+03         1.85573E+03         2.50752E+02
+          7.83559E-03         1.89163E-03        -1.65847E-03         4.92324E-01         3.38179E-01         4.92326E-01         2.07010E+03         1.00009E+00         3.13407E+01         2.07060E+03         1.82236E+03         2.48236E+02
+          7.83559E-03         2.06146E-03        -1.67956E-03         4.92323E-01         3.48849E-01         4.92326E-01         2.03370E+03         1.00009E+00         3.08053E+01         2.03414E+03         1.78846E+03         2.45680E+02
+          7.83559E-03         2.23128E-03        -1.70247E-03         4.92323E-01         3.59520E-01         4.92326E-01         1.99676E+03         1.00009E+00         3.02639E+01         1.99716E+03         1.75407E+03         2.43086E+02
+          7.83559E-03         2.40111E-03        -1.72718E-03         4.92323E-01         3.70190E-01         4.92326E-01         1.95935E+03         1.00009E+00         2.97175E+01         1.95968E+03         1.71923E+03         2.40457E+02
+          7.83559E-03         2.57094E-03        -1.75371E-03         4.92323E-01         3.80861E-01         4.92326E-01         1.92149E+03         1.00009E+00         2.91666E+01         1.92177E+03         1.68398E+03         2.37795E+02
+          7.83559E-03         2.74077E-03        -1.78205E-03         4.92323E-01         3.91532E-01         4.92326E-01         1.88324E+03         1.00009E+00         2.86122E+01         1.88347E+03         1.64837E+03         2.35102E+02
+          7.83559E-03         2.91059E-03        -1.81220E-03         4.92322E-01         4.02202E-01         4.92326E-01         1.84464E+03         1.00009E+00         2.80549E+01         1.84481E+03         1.61243E+03         2.32380E+02
+          7.83559E-03         3.08042E-03        -1.84416E-03         4.92322E-01         4.12873E-01         4.92326E-01         1.80574E+03         1.00009E+00         2.74956E+01         1.80586E+03         1.57623E+03         2.29633E+02
+          7.83559E-03         3.25025E-03        -1.87793E-03         4.92322E-01         4.23543E-01         4.92326E-01         1.76658E+03         1.00009E+00         2.69349E+01         1.76665E+03         1.53979E+03         2.26862E+02
+          7.83559E-03         3.42008E-03        -1.91352E-03         4.92322E-01         4.34214E-01         4.92325E-01         1.72722E+03         1.00009E+00         2.63736E+01         1.72723E+03         1.50316E+03         2.24068E+02
+          7.83559E-03         3.58990E-03        -1.95092E-03         4.92321E-01         4.44884E-01         4.92325E-01         1.68768E+03         1.00009E+00         2.58124E+01         1.68764E+03         1.46639E+03         2.21256E+02
+          7.83559E-03         3.75973E-03        -1.99013E-03         4.92321E-01         4.55555E-01         4.92325E-01         1.64803E+03         1.00009E+00         2.52519E+01         1.64794E+03         1.42951E+03         2.18425E+02
+          7.83559E-03         3.92956E-03        -2.03116E-03         4.92321E-01         4.66225E-01         4.92325E-01         1.60830E+03         1.00009E+00         2.46930E+01         1.60815E+03         1.39258E+03         2.15578E+02
+          7.83559E-03         4.09939E-03        -2.07399E-03         4.92320E-01         4.76896E-01         4.92325E-01         1.56853E+03         1.00009E+00         2.41361E+01         1.56834E+03         1.35562E+03         2.12716E+02
+          7.83559E-03         4.26921E-03        -2.11864E-03         4.92320E-01         4.87567E-01         4.92325E-01         1.52877E+03         1.00009E+00         2.35821E+01         1.52853E+03         1.31869E+03         2.09842E+02
+          7.83559E-03         4.43904E-03        -2.16510E-03         4.92320E-01         4.98237E-01         4.92324E-01         1.48906E+03         1.00009E+00         2.30314E+01         1.48877E+03         1.28182E+03         2.06957E+02
+          7.83559E-03         4.60887E-03        -2.21337E-03         4.92319E-01         5.08908E-01         4.92324E-01         1.44945E+03         1.00009E+00         2.24847E+01         1.44911E+03         1.24505E+03         2.04062E+02
+          7.83559E-03         4.77869E-03        -2.26346E-03         4.92319E-01         5.19578E-01         4.92324E-01         1.40997E+03         1.00009E+00         2.19426E+01         1.40958E+03         1.20842E+03         2.01159E+02
+          7.83559E-03         4.94852E-03        -2.31535E-03         4.92319E-01         5.30249E-01         4.92324E-01         1.37066E+03         1.00009E+00         2.14056E+01         1.37023E+03         1.17198E+03         1.98249E+02
+          7.83559E-03         5.11835E-03        -2.36906E-03         4.92318E-01         5.40919E-01         4.92324E-01         1.33155E+03         1.00009E+00         2.08742E+01         1.33108E+03         1.13575E+03         1.95334E+02
+          7.83559E-03         5.28818E-03        -2.42458E-03         4.92318E-01         5.51590E-01         4.92324E-01         1.29270E+03         1.00009E+00         2.03490E+01         1.29219E+03         1.09978E+03         1.92414E+02
+          7.83559E-03         5.45800E-03        -2.48192E-03         4.92317E-01         5.62261E-01         4.92323E-01         1.25413E+03         1.00009E+00         1.98305E+01         1.25358E+03         1.06409E+03         1.89490E+02
+          7.83559E-03         5.62783E-03        -2.54106E-03         4.92317E-01         5.72931E-01         4.92323E-01         1.21588E+03         1.00009E+00         1.93190E+01         1.21530E+03         1.02873E+03         1.86565E+02
+          7.83559E-03         5.79766E-03        -2.60202E-03         4.92316E-01         5.83602E-01         4.92323E-01         1.17799E+03         1.00009E+00         1.88150E+01         1.17736E+03         9.93726E+02         1.83638E+02
+          7.83559E-03         5.96749E-03        -2.66479E-03         4.92316E-01         5.94272E-01         4.92323E-01         1.14048E+03         1.00009E+00         1.83189E+01         1.13982E+03         9.59111E+02         1.80712E+02
+          7.83559E-03         6.13731E-03        -2.72937E-03         4.92315E-01         6.04943E-01         4.92323E-01         1.10339E+03         1.00009E+00         1.78311E+01         1.10270E+03         9.24915E+02         1.77786E+02
+          7.83559E-03         6.30714E-03        -2.79576E-03         4.92315E-01         6.15613E-01         4.92323E-01         1.06675E+03         1.00009E+00         1.73518E+01         1.06603E+03         8.91169E+02         1.74862E+02
+          7.83559E-03         6.47697E-03        -2.86397E-03         4.92314E-01         6.26284E-01         4.92323E-01         1.03059E+03         1.00009E+00         1.68815E+01         1.02984E+03         8.57900E+02         1.71941E+02
+          7.83559E-03         6.64680E-03        -2.93399E-03         4.92314E-01         6.36955E-01         4.92322E-01         9.94937E+02         1.00009E+00         1.64203E+01         9.94159E+02         8.25136E+02         1.69023E+02
+          7.83559E-03         6.81662E-03        -3.00582E-03         4.92313E-01         6.47625E-01         4.92322E-01         9.59815E+02         1.00009E+00         1.59686E+01         9.59012E+02         7.92903E+02         1.66110E+02
+          7.83559E-03         6.98645E-03        -3.07946E-03         4.92313E-01         6.58296E-01         4.92322E-01         9.25251E+02         1.00009E+00         1.55265E+01         9.24425E+02         7.61223E+02         1.63202E+02
+          7.83559E-03         7.15628E-03        -3.15492E-03         4.92312E-01         6.68966E-01         4.92322E-01         8.91268E+02         1.00009E+00         1.50942E+01         8.90422E+02         7.30121E+02         1.60301E+02
+          7.83559E-03         7.32611E-03        -3.23218E-03         4.92311E-01         6.79637E-01         4.92322E-01         8.57889E+02         1.00009E+00         1.46720E+01         8.57025E+02         6.99618E+02         1.57407E+02
+          7.83559E-03         7.49593E-03        -3.31126E-03         4.92311E-01         6.90307E-01         4.92322E-01         8.25135E+02         1.00009E+00         1.42599E+01         8.24255E+02         6.69734E+02         1.54521E+02
+          7.83559E-03         7.66576E-03        -3.39216E-03         4.92310E-01         7.00978E-01         4.92322E-01         7.93026E+02         1.00009E+00         1.38581E+01         7.92132E+02         6.40487E+02         1.51644E+02
+          7.83559E-03         7.83559E-03        -3.47486E-03         4.92309E-01         7.11649E-01         4.92322E-01         7.61579E+02         1.00009E+00         1.34666E+01         7.60673E+02         6.11895E+02         1.48778E+02
+          7.83559E-03         8.00542E-03        -3.55938E-03         4.92309E-01         7.22319E-01         4.92322E-01         7.30810E+02         1.00009E+00         1.30855E+01         7.29895E+02         5.83973E+02         1.45922E+02
+          7.83559E-03         8.17524E-03        -3.64570E-03         4.92308E-01         7.32990E-01         4.92322E-01         7.00736E+02         1.00009E+00         1.27149E+01         6.99813E+02         5.56735E+02         1.43078E+02
+          7.83559E-03         8.34507E-03        -3.73384E-03         4.92307E-01         7.43660E-01         4.92322E-01         6.71370E+02         1.00009E+00         1.23547E+01         6.70441E+02         5.30193E+02         1.40248E+02
+          7.83559E-03         8.51490E-03        -3.82380E-03         4.92307E-01         7.54331E-01         4.92322E-01         6.42724E+02         1.00009E+00         1.20049E+01         6.41792E+02         5.04360E+02         1.37432E+02
+          7.83559E-03         8.68473E-03        -3.91556E-03         4.92306E-01         7.65001E-01         4.92322E-01         6.14809E+02         1.00009E+00         1.16655E+01         6.13876E+02         4.79245E+02         1.34631E+02
+          7.83559E-03         8.85455E-03        -4.00914E-03         4.92305E-01         7.75672E-01         4.92322E-01         5.87635E+02         1.00009E+00         1.13364E+01         5.86703E+02         4.54856E+02         1.31846E+02
+          7.83559E-03         9.02438E-03        -4.10453E-03         4.92304E-01         7.86343E-01         4.92322E-01         5.61209E+02         1.00009E+00         1.10176E+01         5.60280E+02         4.31200E+02         1.29080E+02
+          7.83559E-03         9.19421E-03        -4.20173E-03         4.92304E-01         7.97013E-01         4.92322E-01         5.35539E+02         1.00009E+00         1.07090E+01         5.34614E+02         4.08282E+02         1.26332E+02
+          7.83559E-03         9.36403E-03        -4.30075E-03         4.92303E-01         8.07684E-01         4.92322E-01         5.10629E+02         1.00009E+00         1.04104E+01         5.09711E+02         3.86106E+02         1.23605E+02
+          7.83559E-03         9.53386E-03        -4.40158E-03         4.92302E-01         8.18354E-01         4.92322E-01         4.86484E+02         1.00009E+00         1.01217E+01         4.85575E+02         3.64676E+02         1.20899E+02
+          7.83559E-03         9.70369E-03        -4.50422E-03         4.92301E-01         8.29025E-01         4.92322E-01         4.63106E+02         1.00009E+00         9.84290E+00         4.62208E+02         3.43992E+02         1.18216E+02
+          7.83559E-03         9.87352E-03        -4.60867E-03         4.92301E-01         8.39695E-01         4.92322E-01         4.40497E+02         1.00009E+00         9.57369E+00         4.39612E+02         3.24054E+02         1.15558E+02
+          7.83559E-03         1.00433E-02        -4.71493E-03         4.92300E-01         8.50366E-01         4.92322E-01         4.18657E+02         1.00009E+00         9.31397E+00         4.17786E+02         3.04861E+02         1.12926E+02
+          7.83559E-03         1.02132E-02        -4.82301E-03         4.92299E-01         8.61037E-01         4.92322E-01         3.97585E+02         1.00009E+00         9.06356E+00         3.96731E+02         2.86410E+02         1.10321E+02
+          7.83559E-03         1.03830E-02        -4.93290E-03         4.92298E-01         8.71707E-01         4.92323E-01         3.77279E+02         1.00009E+00         8.82228E+00         3.76442E+02         2.68698E+02         1.07745E+02
+          7.83559E-03         1.05528E-02        -5.04460E-03         4.92297E-01         8.82378E-01         4.92323E-01         3.57735E+02         1.00009E+00         8.58996E+00         3.56918E+02         2.51719E+02         1.05199E+02
+          7.83559E-03         1.07227E-02        -5.15811E-03         4.92296E-01         8.93048E-01         4.92323E-01         3.38949E+02         1.00009E+00         8.36640E+00         3.38153E+02         2.35467E+02         1.02686E+02
+          7.83559E-03         1.08925E-02        -5.27344E-03         4.92295E-01         9.03719E-01         4.92324E-01         3.20916E+02         1.00009E+00         8.15141E+00         3.20142E+02         2.19936E+02         1.00206E+02
+          7.83559E-03         1.10623E-02        -5.39058E-03         4.92294E-01         9.14389E-01         4.92324E-01         3.03628E+02         1.00009E+00         7.94479E+00         3.02878E+02         2.05116E+02         9.77619E+01
+          7.83559E-03         1.12321E-02        -5.50953E-03         4.92293E-01         9.25060E-01         4.92324E-01         2.87078E+02         1.00009E+00         7.74636E+00         2.86353E+02         1.90998E+02         9.53547E+01
+          7.83559E-03         1.14020E-02        -5.63029E-03         4.92293E-01         9.35731E-01         4.92325E-01         2.71258E+02         1.00009E+00         7.55592E+00         2.70559E+02         1.77573E+02         9.29860E+01
+          7.83559E-03         1.15718E-02        -5.75287E-03         4.92292E-01         9.46401E-01         4.92325E-01         2.56157E+02         1.00009E+00         7.37327E+00         2.55486E+02         1.64828E+02         9.06577E+01
+          7.83559E-03         1.17416E-02        -5.87725E-03         4.92291E-01         9.57072E-01         4.92326E-01         2.41766E+02         1.00009E+00         7.19821E+00         2.41123E+02         1.52752E+02         8.83712E+01
+          7.83559E-03         1.19114E-02        -6.00346E-03         4.92290E-01         9.67742E-01         4.92326E-01         2.28074E+02         1.00009E+00         7.03057E+00         2.27460E+02         1.41332E+02         8.61282E+01
+          7.83559E-03         1.20813E-02        -6.13147E-03         4.92289E-01         9.78413E-01         4.92327E-01         2.15067E+02         1.00009E+00         6.87016E+00         2.14484E+02         1.30554E+02         8.39303E+01
+          7.83559E-03         1.22511E-02        -6.26129E-03         4.92288E-01         9.89083E-01         4.92327E-01         2.02735E+02         1.00009E+00         6.71679E+00         2.02183E+02         1.20404E+02         8.17790E+01
+          7.83559E-03         1.24209E-02        -6.39293E-03         4.92287E-01         9.99754E-01         4.92328E-01         1.91062E+02         1.00009E+00         6.57028E+00         1.90542E+02         1.10866E+02         7.96758E+01
+          7.83559E-03         1.25908E-02        -6.52638E-03         4.92286E-01         1.01042E+00         4.92329E-01         1.80035E+02         1.00009E+00         6.43046E+00         1.79548E+02         1.01925E+02         7.76222E+01
+          7.83559E-03         1.27606E-02        -6.66165E-03         4.92284E-01         1.02110E+00         4.92330E-01         1.69640E+02         1.00009E+00         6.29715E+00         1.69185E+02         9.35657E+01         7.56196E+01
+          7.83559E-03         1.29304E-02        -6.79872E-03         4.92283E-01         1.03177E+00         4.92330E-01         1.59861E+02         1.00009E+00         6.17020E+00         1.59440E+02         8.57701E+01         7.36694E+01
+          7.83559E-03         1.31002E-02        -6.93761E-03         4.92282E-01         1.04244E+00         4.92331E-01         1.50682E+02         1.00009E+00         6.04943E+00         1.50294E+02         7.85215E+01         7.17728E+01
+          7.83559E-03         1.32701E-02        -7.07831E-03         4.92281E-01         1.05311E+00         4.92332E-01         1.42087E+02         1.00009E+00         5.93468E+00         1.41733E+02         7.18023E+01         6.99310E+01
+          7.83559E-03         1.34399E-02        -7.22083E-03         4.92280E-01         1.06378E+00         4.92333E-01         1.34059E+02         1.00009E+00         5.82579E+00         1.33740E+02         6.55947E+01         6.81452E+01
+          7.83559E-03         1.36097E-02        -7.36515E-03         4.92279E-01         1.07445E+00         4.92334E-01         1.26582E+02         1.00009E+00         5.72261E+00         1.26297E+02         5.98804E+01         6.64163E+01
+          7.83559E-03         1.37795E-02        -7.51129E-03         4.92278E-01         1.08512E+00         4.92335E-01         1.19638E+02         1.00009E+00         5.62498E+00         1.19387E+02         5.46412E+01         6.47454E+01
+          7.83559E-03         1.39494E-02        -7.65924E-03         4.92277E-01         1.09579E+00         4.92336E-01         1.13209E+02         1.00009E+00         5.53275E+00         1.12992E+02         4.98584E+01         6.31332E+01
+          7.83559E-03         1.41192E-02        -7.80901E-03         4.92275E-01         1.10646E+00         4.92337E-01         1.07277E+02         1.00009E+00         5.44576E+00         1.07094E+02         4.55132E+01         6.15806E+01
+          7.83559E-03         1.42890E-02        -7.96058E-03         4.92274E-01         1.11713E+00         4.92339E-01         1.01825E+02         1.00009E+00         5.36385E+00         1.01675E+02         4.15870E+01         6.00880E+01
+          7.83559E-03         1.44589E-02        -8.11397E-03         4.92273E-01         1.12780E+00         4.92340E-01         9.68335E+01         1.00009E+00         5.28688E+00         9.67168E+01         3.80608E+01         5.86560E+01
+          7.83559E-03         1.46287E-02        -8.26917E-03         4.92272E-01         1.13847E+00         4.92341E-01         9.22848E+01         1.00009E+00         5.21469E+00         9.22009E+01         3.49159E+01         5.72850E+01
+          7.83559E-03         1.47985E-02        -8.42619E-03         4.92271E-01         1.14914E+00         4.92343E-01         8.81604E+01         1.00009E+00         5.14711E+00         8.81088E+01         3.21334E+01         5.59753E+01
+          7.83559E-03         1.49683E-02        -8.58502E-03         4.92269E-01         1.15981E+00         4.92344E-01         8.44418E+01         1.00009E+00         5.08399E+00         8.44218E+01         2.96948E+01         5.47270E+01
+          7.83559E-03         1.51382E-02        -8.74566E-03         4.92268E-01         1.17048E+00         4.92346E-01         8.11105E+01         1.00009E+00         5.02516E+00         8.11214E+01         2.75814E+01         5.35400E+01
+          7.83559E-03         1.53080E-02        -8.90811E-03         4.92267E-01         1.18115E+00         4.92347E-01         7.81481E+01         1.00009E+00         4.97046E+00         7.81892E+01         2.57750E+01         5.24142E+01
+          7.83559E-03         1.54778E-02        -9.07237E-03         4.92266E-01         1.19182E+00         4.92349E-01         7.55363E+01         1.00009E+00         4.91971E+00         7.56068E+01         2.42573E+01         5.13495E+01
+          7.83559E-03         1.56476E-02        -9.23845E-03         4.92264E-01         1.20249E+00         4.92351E-01         7.32569E+01         1.00009E+00         4.87275E+00         7.33559E+01         2.30106E+01         5.03453E+01
+          7.83559E-03         1.58175E-02        -9.40634E-03         4.92263E-01         1.21317E+00         4.92353E-01         7.12919E+01         1.00009E+00         4.82940E+00         7.14184E+01         2.20173E+01         4.94012E+01
+          7.83559E-03         1.59873E-02        -9.57605E-03         4.92262E-01         1.22384E+00         4.92355E-01         6.96232E+01         1.00009E+00         4.78948E+00         6.97764E+01         2.12600E+01         4.85164E+01
+          7.83559E-03         1.61571E-02        -9.74756E-03         4.92260E-01         1.23451E+00         4.92357E-01         6.82334E+01         1.00009E+00         4.75281E+00         6.84121E+01         2.07219E+01         4.76902E+01
+          7.83559E-03         1.63270E-02        -9.92089E-03         4.92259E-01         1.24518E+00         4.92359E-01         6.71050E+01         1.00009E+00         4.71923E+00         6.73081E+01         2.03864E+01         4.69217E+01
+          7.83559E-03         1.64968E-02        -1.00960E-02         4.92258E-01         1.25585E+00         4.92361E-01         6.62209E+01         1.00009E+00         4.68853E+00         6.64473E+01         2.02375E+01         4.62098E+01
+          7.83559E-03         1.66666E-02        -1.02730E-02         4.92256E-01         1.26652E+00         4.92363E-01         6.55642E+01         1.00009E+00         4.66054E+00         6.58127E+01         2.02594E+01         4.55533E+01
+          7.83559E-03         1.68364E-02        -1.04518E-02         4.92255E-01         1.27719E+00         4.92366E-01         6.51185E+01         1.00009E+00         4.63509E+00         6.53879E+01         2.04369E+01         4.49510E+01
+          7.83559E-03         1.70063E-02        -1.06323E-02         4.92253E-01         1.28786E+00         4.92368E-01         6.48676E+01         1.00009E+00         4.61198E+00         6.51566E+01         2.07553E+01         4.44013E+01
+          7.83559E-03         1.71761E-02        -1.08147E-02         4.92252E-01         1.29853E+00         4.92371E-01         6.47958E+01         1.00009E+00         4.59103E+00         6.51031E+01         2.12004E+01         4.39028E+01
+          7.83559E-03         1.73459E-02        -1.09989E-02         4.92250E-01         1.30920E+00         4.92373E-01         6.48877E+01         1.00009E+00         4.57208E+00         6.52121E+01         2.17582E+01         4.34538E+01
+          7.83559E-03         1.75158E-02        -1.11850E-02         4.92249E-01         1.31987E+00         4.92376E-01         6.51283E+01         1.00009E+00         4.55494E+00         6.54684E+01         2.24158E+01         4.30526E+01
+          7.83559E-03         1.76856E-02        -1.13728E-02         4.92248E-01         1.33054E+00         4.92379E-01         6.55032E+01         1.00009E+00         4.53945E+00         6.58576E+01         2.31602E+01         4.26974E+01
+          7.83559E-03         1.78554E-02        -1.15624E-02         4.92246E-01         1.34121E+00         4.92382E-01         6.59983E+01         1.00009E+00         4.52542E+00         6.63657E+01         2.39795E+01         4.23862E+01
+          7.83559E-03         1.80252E-02        -1.17539E-02         4.92245E-01         1.35188E+00         4.92385E-01         6.66000E+01         1.00009E+00         4.51271E+00         6.69790E+01         2.48620E+01         4.21170E+01
+          7.83559E-03         1.81951E-02        -1.19472E-02         4.92243E-01         1.36255E+00         4.92388E-01         6.72952E+01         1.00009E+00         4.50114E+00         6.76844E+01         2.57966E+01         4.18877E+01
+          7.83559E-03         1.83649E-02        -1.21423E-02         4.92241E-01         1.37322E+00         4.92391E-01         6.80713E+01         1.00009E+00         4.49057E+00         6.84693E+01         2.67730E+01         4.16963E+01
+          7.83559E-03         1.85347E-02        -1.23391E-02         4.92240E-01         1.38389E+00         4.92395E-01         6.89162E+01         1.00009E+00         4.48084E+00         6.93216E+01         2.77812E+01         4.15404E+01
+          7.83559E-03         1.87045E-02        -1.25379E-02         4.92238E-01         1.39457E+00         4.92398E-01         6.98182E+01         1.00009E+00         4.47182E+00         7.02296E+01         2.88118E+01         4.14179E+01
+          7.83559E-03         1.88744E-02        -1.27384E-02         4.92237E-01         1.40524E+00         4.92402E-01         7.07663E+01         1.00009E+00         4.46336E+00         7.11824E+01         2.98560E+01         4.13264E+01
+          7.83559E-03         1.90442E-02        -1.29407E-02         4.92235E-01         1.41591E+00         4.92405E-01         7.17499E+01         1.00009E+00         4.45533E+00         7.21693E+01         3.09058E+01         4.12635E+01
+          7.83559E-03         1.92140E-02        -1.31449E-02         4.92234E-01         1.42658E+00         4.92409E-01         7.27590E+01         1.00009E+00         4.44762E+00         7.31804E+01         3.19533E+01         4.12271E+01
+          7.83559E-03         1.93839E-02        -1.33508E-02         4.92232E-01         1.43725E+00         4.92413E-01         7.37840E+01         1.00009E+00         4.44009E+00         7.42061E+01         3.29915E+01         4.12146E+01
+          7.83559E-03         1.95537E-02        -1.35586E-02         4.92230E-01         1.44792E+00         4.92417E-01         7.48161E+01         1.00009E+00         4.43265E+00         7.52375E+01         3.40139E+01         4.12237E+01
+          7.83559E-03         1.97235E-02        -1.37682E-02         4.92229E-01         1.45859E+00         4.92421E-01         7.58466E+01         1.00009E+00         4.42518E+00         7.62662E+01         3.50142E+01         4.12519E+01
+          7.83559E-03         1.98933E-02        -1.39796E-02         4.92227E-01         1.46926E+00         4.92426E-01         7.68678E+01         1.00009E+00         4.41759E+00         7.72842E+01         3.59872E+01         4.12970E+01
+          7.83559E-03         2.00632E-02        -1.41928E-02         4.92225E-01         1.47993E+00         4.92430E-01         7.78722E+01         1.00009E+00         4.40979E+00         7.82843E+01         3.69277E+01         4.13566E+01
+          7.83559E-03         2.02330E-02        -1.44078E-02         4.92224E-01         1.49060E+00         4.92435E-01         7.88530E+01         1.00009E+00         4.40168E+00         7.92595E+01         3.78312E+01         4.14283E+01
+          7.83559E-03         2.04028E-02        -1.46247E-02         4.92222E-01         1.50127E+00         4.92439E-01         7.98037E+01         1.00009E+00         4.39319E+00         8.02036E+01         3.86938E+01         4.15099E+01
+          7.83559E-03         2.05726E-02        -1.48433E-02         4.92220E-01         1.51194E+00         4.92444E-01         8.07186E+01         1.00009E+00         4.38425E+00         8.11108E+01         3.95118E+01         4.15990E+01
+          7.83559E-03         2.07425E-02        -1.50638E-02         4.92219E-01         1.52261E+00         4.92449E-01         8.15922E+01         1.00009E+00         4.37479E+00         8.19757E+01         4.02821E+01         4.16936E+01
+          7.83559E-03         2.09123E-02        -1.52861E-02         4.92217E-01         1.53328E+00         4.92454E-01         8.24198E+01         1.00009E+00         4.36475E+00         8.27935E+01         4.10022E+01         4.17913E+01
+          7.83559E-03         2.10821E-02        -1.55102E-02         4.92215E-01         1.54395E+00         4.92459E-01         8.31969E+01         1.00009E+00         4.35407E+00         8.35599E+01         4.16697E+01         4.18902E+01
+          7.83559E-03         2.12520E-02        -1.57361E-02         4.92213E-01         1.55462E+00         4.92465E-01         8.39197E+01         1.00009E+00         4.34270E+00         8.42710E+01         4.22828E+01         4.19883E+01
+          7.83559E-03         2.14218E-02        -1.59638E-02         4.92212E-01         1.56529E+00         4.92470E-01         8.45846E+01         1.00009E+00         4.33059E+00         8.49235E+01         4.28401E+01         4.20835E+01
+          7.83559E-03         2.15916E-02        -1.61933E-02         4.92210E-01         1.57596E+00         4.92476E-01         8.51888E+01         1.00009E+00         4.31771E+00         8.55144E+01         4.33404E+01         4.21740E+01
+          7.83559E-03         2.17614E-02        -1.64247E-02         4.92208E-01         1.58664E+00         4.92482E-01         8.57295E+01         1.00009E+00         4.30402E+00         8.60412E+01         4.37831E+01         4.22581E+01
+          7.83559E-03         2.19313E-02        -1.66579E-02         4.92206E-01         1.59731E+00         4.92488E-01         8.62048E+01         1.00009E+00         4.28948E+00         8.65018E+01         4.41677E+01         4.23341E+01
+          7.83559E-03         2.21011E-02        -1.68928E-02         4.92204E-01         1.60798E+00         4.92494E-01         8.66128E+01         1.00009E+00         4.27408E+00         8.68945E+01         4.44942E+01         4.24004E+01
+          7.83559E-03         2.22709E-02        -1.71296E-02         4.92202E-01         1.61865E+00         4.92500E-01         8.69522E+01         1.00009E+00         4.25778E+00         8.72181E+01         4.47626E+01         4.24554E+01
+          7.83559E-03         2.24407E-02        -1.73682E-02         4.92201E-01         1.62932E+00         4.92507E-01         8.72221E+01         1.00009E+00         4.24057E+00         8.74715E+01         4.49736E+01         4.24979E+01
+          7.83559E-03         2.26106E-02        -1.76086E-02         4.92199E-01         1.63999E+00         4.92514E-01         8.74217E+01         1.00009E+00         4.22243E+00         8.76543E+01         4.51277E+01         4.25265E+01
+          7.83559E-03         2.27804E-02        -1.78509E-02         4.92197E-01         1.65066E+00         4.92520E-01         8.75508E+01         1.00009E+00         4.20335E+00         8.77662E+01         4.52260E+01         4.25401E+01
+          7.83559E-03         2.29502E-02        -1.80949E-02         4.92195E-01         1.66133E+00         4.92527E-01         8.76095E+01         1.00009E+00         4.18333E+00         8.78073E+01         4.52697E+01         4.25376E+01
+          7.83559E-03         2.31201E-02        -1.83408E-02         4.92193E-01         1.67200E+00         4.92535E-01         8.75982E+01         1.00009E+00         4.16234E+00         8.77781E+01         4.52600E+01         4.25181E+01
+          7.83559E-03         2.32899E-02        -1.85884E-02         4.92191E-01         1.68267E+00         4.92542E-01         8.75174E+01         1.00009E+00         4.14041E+00         8.76792E+01         4.51985E+01         4.24807E+01
+          7.83559E-03         2.34597E-02        -1.88379E-02         4.92189E-01         1.69334E+00         4.92549E-01         8.73680E+01         1.00009E+00         4.11751E+00         8.75116E+01         4.50870E+01         4.24247E+01
+          7.83559E-03         2.36295E-02        -1.90892E-02         4.92187E-01         1.70401E+00         4.92557E-01         8.71513E+01         1.00009E+00         4.09366E+00         8.72766E+01         4.49272E+01         4.23495E+01
+          7.83559E-03         2.37994E-02        -1.93423E-02         4.92185E-01         1.71468E+00         4.92565E-01         8.68687E+01         1.00009E+00         4.06886E+00         8.69756E+01         4.47211E+01         4.22545E+01
+          7.83559E-03         2.39692E-02        -1.95972E-02         4.92183E-01         1.72535E+00         4.92573E-01         8.65217E+01         1.00009E+00         4.04312E+00         8.66103E+01         4.44708E+01         4.21395E+01
+          7.83559E-03         2.41390E-02        -1.98540E-02         4.92181E-01         1.73602E+00         4.92581E-01         8.61123E+01         1.00009E+00         4.01644E+00         8.61825E+01         4.41785E+01         4.20040E+01
+          7.83559E-03         2.43088E-02        -2.01125E-02         4.92179E-01         1.74669E+00         4.92590E-01         8.56424E+01         1.00009E+00         3.98885E+00         8.56943E+01         4.38464E+01         4.18480E+01
+          7.83559E-03         2.44787E-02        -2.03729E-02         4.92177E-01         1.75736E+00         4.92598E-01         8.51141E+01         1.00009E+00         3.96034E+00         8.51480E+01         4.34768E+01         4.16713E+01
+          7.83559E-03         2.46485E-02        -2.06351E-02         4.92175E-01         1.76804E+00         4.92607E-01         8.45299E+01         1.00009E+00         3.93095E+00         8.45460E+01         4.30720E+01         4.14740E+01
+          7.83559E-03         2.48183E-02        -2.08991E-02         4.92173E-01         1.77871E+00         4.92616E-01         8.38921E+01         1.00009E+00         3.90067E+00         8.38907E+01         4.26345E+01         4.12562E+01
+          7.83559E-03         2.49882E-02        -2.11649E-02         4.92171E-01         1.78938E+00         4.92626E-01         8.32034E+01         1.00009E+00         3.86954E+00         8.31847E+01         4.21666E+01         4.10181E+01
+          7.83559E-03         2.51580E-02        -2.14325E-02         4.92169E-01         1.80005E+00         4.92635E-01         8.24664E+01         1.00009E+00         3.83757E+00         8.24308E+01         4.16708E+01         4.07600E+01
+          7.83559E-03         2.53278E-02        -2.17019E-02         4.92167E-01         1.81072E+00         4.92645E-01         8.16839E+01         1.00009E+00         3.80479E+00         8.16318E+01         4.11494E+01         4.04824E+01
+          7.83559E-03         2.54976E-02        -2.19732E-02         4.92164E-01         1.82139E+00         4.92655E-01         8.08587E+01         1.00009E+00         3.77121E+00         8.07905E+01         4.06049E+01         4.01856E+01
+          7.83559E-03         2.56675E-02        -2.22462E-02         4.92162E-01         1.83206E+00         4.92665E-01         7.99937E+01         1.00009E+00         3.73686E+00         7.99100E+01         4.00397E+01         3.98703E+01
+          7.83559E-03         2.58373E-02        -2.25211E-02         4.92160E-01         1.84273E+00         4.92675E-01         7.90918E+01         1.00009E+00         3.70176E+00         7.89930E+01         3.94560E+01         3.95370E+01
+          7.83559E-03         2.60071E-02        -2.27978E-02         4.92158E-01         1.85340E+00         4.92686E-01         7.81560E+01         1.00009E+00         3.66594E+00         7.80427E+01         3.88562E+01         3.91864E+01
+          7.83559E-03         2.61769E-02        -2.30763E-02         4.92156E-01         1.86407E+00         4.92697E-01         7.71892E+01         1.00009E+00         3.62943E+00         7.70619E+01         3.82426E+01         3.88194E+01
+          8.00542E-03         8.72665E-04        -1.65451E-03         5.02995E-01         2.74155E-01         5.02998E-01         2.01644E+03         1.00004E+00         2.74465E+01         2.01719E+03         1.75938E+03         2.57814E+02
+          8.00542E-03         1.04249E-03        -1.66472E-03         5.02995E-01         2.84826E-01         5.02998E-01         1.98834E+03         1.00004E+00         2.70625E+01         1.98905E+03         1.73383E+03         2.55224E+02
+          8.00542E-03         1.21232E-03        -1.67675E-03         5.02995E-01         2.95496E-01         5.02998E-01         1.95954E+03         1.00004E+00         2.66702E+01         1.96021E+03         1.70763E+03         2.52581E+02
+          8.00542E-03         1.38215E-03        -1.69059E-03         5.02995E-01         3.06167E-01         5.02997E-01         1.93007E+03         1.00004E+00         2.62702E+01         1.93071E+03         1.68082E+03         2.49889E+02
+          8.00542E-03         1.55197E-03        -1.70625E-03         5.02994E-01         3.16838E-01         5.02997E-01         1.89998E+03         1.00004E+00         2.58630E+01         1.90058E+03         1.65343E+03         2.47152E+02
+          8.00542E-03         1.72180E-03        -1.72371E-03         5.02994E-01         3.27508E-01         5.02997E-01         1.86931E+03         1.00004E+00         2.54493E+01         1.86987E+03         1.62549E+03         2.44373E+02
+          8.00542E-03         1.89163E-03        -1.74299E-03         5.02994E-01         3.38179E-01         5.02997E-01         1.83809E+03         1.00004E+00         2.50297E+01         1.83861E+03         1.59705E+03         2.41558E+02
+          8.00542E-03         2.06146E-03        -1.76408E-03         5.02994E-01         3.48849E-01         5.02997E-01         1.80636E+03         1.00004E+00         2.46048E+01         1.80684E+03         1.56813E+03         2.38708E+02
+          8.00542E-03         2.23128E-03        -1.78698E-03         5.02994E-01         3.59520E-01         5.02997E-01         1.77417E+03         1.00004E+00         2.41752E+01         1.77460E+03         1.53877E+03         2.35829E+02
+          8.00542E-03         2.40111E-03        -1.81170E-03         5.02994E-01         3.70190E-01         5.02997E-01         1.74154E+03         1.00004E+00         2.37416E+01         1.74193E+03         1.50901E+03         2.32923E+02
+          8.00542E-03         2.57094E-03        -1.83823E-03         5.02993E-01         3.80861E-01         5.02997E-01         1.70852E+03         1.00004E+00         2.33045E+01         1.70887E+03         1.47888E+03         2.29994E+02
+          8.00542E-03         2.74077E-03        -1.86656E-03         5.02993E-01         3.91532E-01         5.02997E-01         1.67516E+03         1.00004E+00         2.28646E+01         1.67546E+03         1.44842E+03         2.27045E+02
+          8.00542E-03         2.91059E-03        -1.89672E-03         5.02993E-01         4.02202E-01         5.02997E-01         1.64148E+03         1.00004E+00         2.24225E+01         1.64175E+03         1.41767E+03         2.24079E+02
+          8.00542E-03         3.08042E-03        -1.92868E-03         5.02993E-01         4.12873E-01         5.02996E-01         1.60753E+03         1.00004E+00         2.19788E+01         1.60776E+03         1.38666E+03         2.21099E+02
+          8.00542E-03         3.25025E-03        -1.96245E-03         5.02992E-01         4.23543E-01         5.02996E-01         1.57335E+03         1.00004E+00         2.15340E+01         1.57353E+03         1.35542E+03         2.18109E+02
+          8.00542E-03         3.42008E-03        -1.99804E-03         5.02992E-01         4.34214E-01         5.02996E-01         1.53897E+03         1.00004E+00         2.10888E+01         1.53912E+03         1.32401E+03         2.15110E+02
+          8.00542E-03         3.58990E-03        -2.03544E-03         5.02992E-01         4.44884E-01         5.02996E-01         1.50444E+03         1.00004E+00         2.06436E+01         1.50455E+03         1.29244E+03         2.12105E+02
+          8.00542E-03         3.75973E-03        -2.07465E-03         5.02992E-01         4.55555E-01         5.02996E-01         1.46980E+03         1.00004E+00         2.01991E+01         1.46986E+03         1.26076E+03         2.09097E+02
+          8.00542E-03         3.92956E-03        -2.11567E-03         5.02991E-01         4.66225E-01         5.02996E-01         1.43507E+03         1.00004E+00         1.97558E+01         1.43510E+03         1.22901E+03         2.06089E+02
+          8.00542E-03         4.09939E-03        -2.15851E-03         5.02991E-01         4.76896E-01         5.02996E-01         1.40031E+03         1.00004E+00         1.93142E+01         1.40029E+03         1.19721E+03         2.03081E+02
+          8.00542E-03         4.26921E-03        -2.20316E-03         5.02991E-01         4.87567E-01         5.02995E-01         1.36554E+03         1.00004E+00         1.88748E+01         1.36549E+03         1.16541E+03         2.00077E+02
+          8.00542E-03         4.43904E-03        -2.24962E-03         5.02990E-01         4.98237E-01         5.02995E-01         1.33080E+03         1.00004E+00         1.84382E+01         1.33071E+03         1.13363E+03         1.97077E+02
+          8.00542E-03         4.60887E-03        -2.29789E-03         5.02990E-01         5.08908E-01         5.02995E-01         1.29613E+03         1.00004E+00         1.80047E+01         1.29601E+03         1.10192E+03         1.94084E+02
+          8.00542E-03         4.77869E-03        -2.34797E-03         5.02989E-01         5.19578E-01         5.02995E-01         1.26156E+03         1.00004E+00         1.75749E+01         1.26140E+03         1.07030E+03         1.91100E+02
+          8.00542E-03         4.94852E-03        -2.39987E-03         5.02989E-01         5.30249E-01         5.02995E-01         1.22713E+03         1.00004E+00         1.71492E+01         1.22694E+03         1.03881E+03         1.88124E+02
+          8.00542E-03         5.11835E-03        -2.45358E-03         5.02989E-01         5.40919E-01         5.02994E-01         1.19287E+03         1.00004E+00         1.67280E+01         1.19264E+03         1.00748E+03         1.85160E+02
+          8.00542E-03         5.28818E-03        -2.50910E-03         5.02988E-01         5.51590E-01         5.02994E-01         1.15881E+03         1.00004E+00         1.63116E+01         1.15855E+03         9.76344E+02         1.82207E+02
+          8.00542E-03         5.45800E-03        -2.56643E-03         5.02988E-01         5.62261E-01         5.02994E-01         1.12499E+03         1.00004E+00         1.59006E+01         1.12469E+03         9.45427E+02         1.79267E+02
+          8.00542E-03         5.62783E-03        -2.62558E-03         5.02987E-01         5.72931E-01         5.02994E-01         1.09143E+03         1.00004E+00         1.54952E+01         1.09110E+03         9.14762E+02         1.76341E+02
+          8.00542E-03         5.79766E-03        -2.68654E-03         5.02987E-01         5.83602E-01         5.02994E-01         1.05816E+03         1.00004E+00         1.50957E+01         1.05781E+03         8.84377E+02         1.73430E+02
+          8.00542E-03         5.96749E-03        -2.74931E-03         5.02986E-01         5.94272E-01         5.02994E-01         1.02521E+03         1.00004E+00         1.47026E+01         1.02483E+03         8.54300E+02         1.70533E+02
+          8.00542E-03         6.13731E-03        -2.81389E-03         5.02986E-01         6.04943E-01         5.02993E-01         9.92618E+02         1.00004E+00         1.43159E+01         9.92212E+02         8.24559E+02         1.67653E+02
+          8.00542E-03         6.30714E-03        -2.88028E-03         5.02985E-01         6.15613E-01         5.02993E-01         9.60399E+02         1.00004E+00         1.39361E+01         9.59968E+02         7.95180E+02         1.64789E+02
+          8.00542E-03         6.47697E-03        -2.94849E-03         5.02985E-01         6.26284E-01         5.02993E-01         9.28582E+02         1.00004E+00         1.35634E+01         9.28127E+02         7.66186E+02         1.61941E+02
+          8.00542E-03         6.64680E-03        -3.01850E-03         5.02984E-01         6.36955E-01         5.02993E-01         8.97191E+02         1.00004E+00         1.31980E+01         8.96714E+02         7.37603E+02         1.59111E+02
+          8.00542E-03         6.81662E-03        -3.09034E-03         5.02983E-01         6.47625E-01         5.02993E-01         8.66249E+02         1.00004E+00         1.28401E+01         8.65750E+02         7.09453E+02         1.56297E+02
+          8.00542E-03         6.98645E-03        -3.16398E-03         5.02983E-01         6.58296E-01         5.02993E-01         8.35777E+02         1.00004E+00         1.24898E+01         8.35259E+02         6.81758E+02         1.53502E+02
+          8.00542E-03         7.15628E-03        -3.23943E-03         5.02982E-01         6.68966E-01         5.02993E-01         8.05798E+02         1.00004E+00         1.21473E+01         8.05262E+02         6.54538E+02         1.50724E+02
+          8.00542E-03         7.32611E-03        -3.31670E-03         5.02982E-01         6.79637E-01         5.02993E-01         7.76329E+02         1.00004E+00         1.18127E+01         7.75776E+02         6.27812E+02         1.47964E+02
+          8.00542E-03         7.49593E-03        -3.39578E-03         5.02981E-01         6.90307E-01         5.02992E-01         7.47390E+02         1.00004E+00         1.14862E+01         7.46822E+02         6.01600E+02         1.45222E+02
+          8.00542E-03         7.66576E-03        -3.47667E-03         5.02980E-01         7.00978E-01         5.02992E-01         7.18998E+02         1.00004E+00         1.11679E+01         7.18417E+02         5.75918E+02         1.42499E+02
+          8.00542E-03         7.83559E-03        -3.55938E-03         5.02980E-01         7.11649E-01         5.02992E-01         6.91168E+02         1.00004E+00         1.08577E+01         6.90575E+02         5.50781E+02         1.39794E+02
+          8.00542E-03         8.00542E-03        -3.64389E-03         5.02979E-01         7.22319E-01         5.02992E-01         6.63916E+02         1.00004E+00         1.05558E+01         6.63313E+02         5.26204E+02         1.37108E+02
+          8.00542E-03         8.17524E-03        -3.73022E-03         5.02978E-01         7.32990E-01         5.02992E-01         6.37255E+02         1.00004E+00         1.02621E+01         6.36642E+02         5.02202E+02         1.34441E+02
+          8.00542E-03         8.34507E-03        -3.81836E-03         5.02978E-01         7.43660E-01         5.02992E-01         6.11197E+02         1.00004E+00         9.97666E+00         6.10577E+02         4.78785E+02         1.31793E+02
+          8.00542E-03         8.51490E-03        -3.90831E-03         5.02977E-01         7.54331E-01         5.02992E-01         5.85753E+02         1.00004E+00         9.69950E+00         5.85128E+02         4.55964E+02         1.29164E+02
+          8.00542E-03         8.68473E-03        -4.00008E-03         5.02976E-01         7.65001E-01         5.02992E-01         5.60934E+02         1.00004E+00         9.43056E+00         5.60304E+02         4.33750E+02         1.26554E+02
+          8.00542E-03         8.85455E-03        -4.09366E-03         5.02975E-01         7.75672E-01         5.02992E-01         5.36748E+02         1.00004E+00         9.16980E+00         5.36115E+02         4.12151E+02         1.23965E+02
+          8.00542E-03         9.02438E-03        -4.18905E-03         5.02975E-01         7.86343E-01         5.02992E-01         5.13202E+02         1.00004E+00         8.91716E+00         5.12569E+02         3.91173E+02         1.21396E+02
+          8.00542E-03         9.19421E-03        -4.28625E-03         5.02974E-01         7.97013E-01         5.02992E-01         4.90303E+02         1.00004E+00         8.67256E+00         4.89670E+02         3.70823E+02         1.18847E+02
+          8.00542E-03         9.36403E-03        -4.38526E-03         5.02973E-01         8.07684E-01         5.02992E-01         4.68057E+02         1.00004E+00         8.43591E+00         4.67426E+02         3.51106E+02         1.16319E+02
+          8.00542E-03         9.53386E-03        -4.48609E-03         5.02972E-01         8.18354E-01         5.02992E-01         4.46467E+02         1.00004E+00         8.20711E+00         4.45839E+02         3.32026E+02         1.13814E+02
+          8.00542E-03         9.70369E-03        -4.58873E-03         5.02971E-01         8.29025E-01         5.02992E-01         4.25537E+02         1.00004E+00         7.98606E+00         4.24913E+02         3.13583E+02         1.11330E+02
+          8.00542E-03         9.87352E-03        -4.69318E-03         5.02971E-01         8.39695E-01         5.02992E-01         4.05268E+02         1.00004E+00         7.77263E+00         4.04650E+02         2.95781E+02         1.08869E+02
+          8.00542E-03         1.00433E-02        -4.79945E-03         5.02970E-01         8.50366E-01         5.02993E-01         3.85661E+02         1.00004E+00         7.56669E+00         3.85051E+02         2.78619E+02         1.06432E+02
+          8.00542E-03         1.02132E-02        -4.90752E-03         5.02969E-01         8.61037E-01         5.02993E-01         3.66716E+02         1.00004E+00         7.36811E+00         3.66115E+02         2.62096E+02         1.04019E+02
+          8.00542E-03         1.03830E-02        -5.01741E-03         5.02968E-01         8.71707E-01         5.02993E-01         3.48433E+02         1.00004E+00         7.17676E+00         3.47842E+02         2.46210E+02         1.01632E+02
+          8.00542E-03         1.05528E-02        -5.12911E-03         5.02967E-01         8.82378E-01         5.02993E-01         3.30808E+02         1.00004E+00         6.99247E+00         3.30228E+02         2.30958E+02         9.92708E+01
+          8.00542E-03         1.07227E-02        -5.24263E-03         5.02966E-01         8.93048E-01         5.02994E-01         3.13840E+02         1.00004E+00         6.81511E+00         3.13272E+02         2.16335E+02         9.69366E+01
+          8.00542E-03         1.08925E-02        -5.35795E-03         5.02965E-01         9.03719E-01         5.02994E-01         2.97523E+02         1.00004E+00         6.64452E+00         2.96969E+02         2.02338E+02         9.46307E+01
+          8.00542E-03         1.10623E-02        -5.47509E-03         5.02964E-01         9.14389E-01         5.02994E-01         2.81853E+02         1.00004E+00         6.48054E+00         2.81313E+02         1.88959E+02         9.23539E+01
+          8.00542E-03         1.12321E-02        -5.59404E-03         5.02963E-01         9.25060E-01         5.02994E-01         2.66824E+02         1.00004E+00         6.32303E+00         2.66300E+02         1.76193E+02         9.01075E+01
+          8.00542E-03         1.14020E-02        -5.71480E-03         5.02962E-01         9.35731E-01         5.02995E-01         2.52430E+02         1.00004E+00         6.17183E+00         2.51922E+02         1.64030E+02         8.78927E+01
+          8.00542E-03         1.15718E-02        -5.83738E-03         5.02961E-01         9.46401E-01         5.02995E-01         2.38663E+02         1.00004E+00         6.02679E+00         2.38173E+02         1.52462E+02         8.57106E+01
+          8.00542E-03         1.17416E-02        -5.96177E-03         5.02960E-01         9.57072E-01         5.02996E-01         2.25515E+02         1.00004E+00         5.88775E+00         2.25043E+02         1.41481E+02         8.35625E+01
+          8.00542E-03         1.19114E-02        -6.08797E-03         5.02959E-01         9.67742E-01         5.02996E-01         2.12977E+02         1.00004E+00         5.75456E+00         2.12525E+02         1.31075E+02         8.14497E+01
+          8.00542E-03         1.20813E-02        -6.21598E-03         5.02958E-01         9.78413E-01         5.02997E-01         2.01040E+02         1.00004E+00         5.62708E+00         2.00608E+02         1.21234E+02         7.93735E+01
+          8.00542E-03         1.22511E-02        -6.34581E-03         5.02957E-01         9.89083E-01         5.02997E-01         1.89693E+02         1.00004E+00         5.50516E+00         1.89282E+02         1.11946E+02         7.73352E+01
+          8.00542E-03         1.24209E-02        -6.47745E-03         5.02956E-01         9.99754E-01         5.02998E-01         1.78926E+02         1.00004E+00         5.38866E+00         1.78536E+02         1.03200E+02         7.53361E+01
+          8.00542E-03         1.25908E-02        -6.61090E-03         5.02955E-01         1.01042E+00         5.02999E-01         1.68727E+02         1.00004E+00         5.27743E+00         1.68359E+02         9.49813E+01         7.33776E+01
+          8.00542E-03         1.27606E-02        -6.74616E-03         5.02954E-01         1.02110E+00         5.02999E-01         1.59085E+02         1.00004E+00         5.17136E+00         1.58739E+02         8.72778E+01         7.14610E+01
+          8.00542E-03         1.29304E-02        -6.88323E-03         5.02953E-01         1.03177E+00         5.03000E-01         1.49987E+02         1.00004E+00         5.07029E+00         1.49663E+02         8.00756E+01         6.95875E+01
+          8.00542E-03         1.31002E-02        -7.02212E-03         5.02952E-01         1.04244E+00         5.03001E-01         1.41419E+02         1.00004E+00         4.97410E+00         1.41119E+02         7.33603E+01         6.77585E+01
+          8.00542E-03         1.32701E-02        -7.16282E-03         5.02951E-01         1.05311E+00         5.03002E-01         1.33370E+02         1.00004E+00         4.88266E+00         1.33092E+02         6.71173E+01         6.59751E+01
+          8.00542E-03         1.34399E-02        -7.30534E-03         5.02950E-01         1.06378E+00         5.03003E-01         1.25824E+02         1.00004E+00         4.79584E+00         1.25570E+02         6.13316E+01         6.42387E+01
+          8.00542E-03         1.36097E-02        -7.44966E-03         5.02949E-01         1.07445E+00         5.03004E-01         1.18768E+02         1.00004E+00         4.71353E+00         1.18538E+02         5.59879E+01         6.25503E+01
+          8.00542E-03         1.37795E-02        -7.59580E-03         5.02947E-01         1.08512E+00         5.03005E-01         1.12188E+02         1.00004E+00         4.63558E+00         1.11982E+02         5.10708E+01         6.09111E+01
+          8.00542E-03         1.39494E-02        -7.74375E-03         5.02946E-01         1.09579E+00         5.03006E-01         1.06069E+02         1.00004E+00         4.56189E+00         1.05887E+02         4.65644E+01         5.93221E+01
+          8.00542E-03         1.41192E-02        -7.89352E-03         5.02945E-01         1.10646E+00         5.03007E-01         1.00396E+02         1.00004E+00         4.49233E+00         1.00237E+02         4.24528E+01         5.77843E+01
+          8.00542E-03         1.42890E-02        -8.04509E-03         5.02944E-01         1.11713E+00         5.03008E-01         9.51532E+01         1.00004E+00         4.42677E+00         9.50185E+01         3.87200E+01         5.62985E+01
+          8.00542E-03         1.44589E-02        -8.19848E-03         5.02943E-01         1.12780E+00         5.03009E-01         9.03265E+01         1.00004E+00         4.36509E+00         9.02153E+01         3.53497E+01         5.48656E+01
+          8.00542E-03         1.46287E-02        -8.35368E-03         5.02941E-01         1.13847E+00         5.03011E-01         8.59000E+01         1.00004E+00         4.30717E+00         8.58122E+01         3.23259E+01         5.34863E+01
+          8.00542E-03         1.47985E-02        -8.51070E-03         5.02940E-01         1.14914E+00         5.03012E-01         8.18582E+01         1.00004E+00         4.25289E+00         8.17935E+01         2.96323E+01         5.21612E+01
+          8.00542E-03         1.49683E-02        -8.66953E-03         5.02939E-01         1.15981E+00         5.03013E-01         7.81854E+01         1.00004E+00         4.20210E+00         7.81435E+01         2.72527E+01         5.08908E+01
+          8.00542E-03         1.51382E-02        -8.83017E-03         5.02937E-01         1.17048E+00         5.03015E-01         7.48662E+01         1.00004E+00         4.15469E+00         7.48466E+01         2.51710E+01         4.96756E+01
+          8.00542E-03         1.53080E-02        -8.99262E-03         5.02936E-01         1.18115E+00         5.03017E-01         7.18847E+01         1.00004E+00         4.11052E+00         7.18871E+01         2.33713E+01         4.85158E+01
+          8.00542E-03         1.54778E-02        -9.15688E-03         5.02935E-01         1.19182E+00         5.03018E-01         6.92255E+01         1.00004E+00         4.06946E+00         6.92494E+01         2.18378E+01         4.74116E+01
+          8.00542E-03         1.56476E-02        -9.32296E-03         5.02934E-01         1.20249E+00         5.03020E-01         6.68730E+01         1.00004E+00         4.03137E+00         6.69178E+01         2.05547E+01         4.63631E+01
+          8.00542E-03         1.58175E-02        -9.49085E-03         5.02932E-01         1.21317E+00         5.03022E-01         6.48117E+01         1.00004E+00         3.99612E+00         6.48768E+01         1.95067E+01         4.53702E+01
+          8.00542E-03         1.59873E-02        -9.66056E-03         5.02931E-01         1.22384E+00         5.03024E-01         6.30263E+01         1.00004E+00         3.96357E+00         6.31111E+01         1.86784E+01         4.44327E+01
+          8.00542E-03         1.61571E-02        -9.83207E-03         5.02929E-01         1.23451E+00         5.03026E-01         6.15015E+01         1.00004E+00         3.93358E+00         6.16054E+01         1.80550E+01         4.35504E+01
+          8.00542E-03         1.63270E-02        -1.00054E-02         5.02928E-01         1.24518E+00         5.03028E-01         6.02224E+01         1.00004E+00         3.90601E+00         6.03447E+01         1.76219E+01         4.27228E+01
+          8.00542E-03         1.64968E-02        -1.01805E-02         5.02927E-01         1.25585E+00         5.03030E-01         5.91740E+01         1.00004E+00         3.88072E+00         5.93139E+01         1.73646E+01         4.19493E+01
+          8.00542E-03         1.66666E-02        -1.03575E-02         5.02925E-01         1.26652E+00         5.03032E-01         5.83418E+01         1.00004E+00         3.85757E+00         5.84985E+01         1.72692E+01         4.12294E+01
+          8.00542E-03         1.68364E-02        -1.05363E-02         5.02924E-01         1.27719E+00         5.03034E-01         5.77114E+01         1.00004E+00         3.83640E+00         5.78841E+01         1.73221E+01         4.05620E+01
+          8.00542E-03         1.70063E-02        -1.07168E-02         5.02922E-01         1.28786E+00         5.03037E-01         5.72685E+01         1.00004E+00         3.81709E+00         5.74565E+01         1.75100E+01         3.99464E+01
+          8.00542E-03         1.71761E-02        -1.08992E-02         5.02921E-01         1.29853E+00         5.03039E-01         5.69995E+01         1.00004E+00         3.79950E+00         5.72017E+01         1.78202E+01         3.93815E+01
+          8.00542E-03         1.73459E-02        -1.10834E-02         5.02919E-01         1.30920E+00         5.03042E-01         5.68907E+01         1.00004E+00         3.78348E+00         5.71064E+01         1.82403E+01         3.88661E+01
+          8.00542E-03         1.75158E-02        -1.12695E-02         5.02918E-01         1.31987E+00         5.03044E-01         5.69289E+01         1.00004E+00         3.76890E+00         5.71571E+01         1.87581E+01         3.83989E+01
+          8.00542E-03         1.76856E-02        -1.14573E-02         5.02916E-01         1.33054E+00         5.03047E-01         5.71012E+01         1.00004E+00         3.75562E+00         5.73410E+01         1.93624E+01         3.79786E+01
+          8.00542E-03         1.78554E-02        -1.16469E-02         5.02915E-01         1.34121E+00         5.03050E-01         5.73951E+01         1.00004E+00         3.74352E+00         5.76456E+01         2.00419E+01         3.76037E+01
+          8.00542E-03         1.80252E-02        -1.18384E-02         5.02913E-01         1.35188E+00         5.03053E-01         5.77985E+01         1.00004E+00         3.73247E+00         5.80587E+01         2.07862E+01         3.72725E+01
+          8.00542E-03         1.81951E-02        -1.20317E-02         5.02912E-01         1.36255E+00         5.03056E-01         5.82994E+01         1.00004E+00         3.72234E+00         5.85684E+01         2.15850E+01         3.69834E+01
+          8.00542E-03         1.83649E-02        -1.22268E-02         5.02910E-01         1.37322E+00         5.03059E-01         5.88866E+01         1.00004E+00         3.71301E+00         5.91634E+01         2.24287E+01         3.67346E+01
+          8.00542E-03         1.85347E-02        -1.24237E-02         5.02909E-01         1.38389E+00         5.03062E-01         5.95491E+01         1.00004E+00         3.70437E+00         5.98326E+01         2.33083E+01         3.65243E+01
+          8.00542E-03         1.87045E-02        -1.26224E-02         5.02907E-01         1.39457E+00         5.03065E-01         6.02762E+01         1.00004E+00         3.69631E+00         6.05656E+01         2.42151E+01         3.63505E+01
+          8.00542E-03         1.88744E-02        -1.28229E-02         5.02905E-01         1.40524E+00         5.03069E-01         6.10578E+01         1.00004E+00         3.68872E+00         6.13521E+01         2.51408E+01         3.62113E+01
+          8.00542E-03         1.90442E-02        -1.30252E-02         5.02904E-01         1.41591E+00         5.03073E-01         6.18842E+01         1.00004E+00         3.68149E+00         6.21824E+01         2.60778E+01         3.61046E+01
+          8.00542E-03         1.92140E-02        -1.32294E-02         5.02902E-01         1.42658E+00         5.03076E-01         6.27461E+01         1.00004E+00         3.67453E+00         6.30472E+01         2.70189E+01         3.60282E+01
+          8.00542E-03         1.93839E-02        -1.34353E-02         5.02901E-01         1.43725E+00         5.03080E-01         6.36346E+01         1.00004E+00         3.66775E+00         6.39376E+01         2.79574E+01         3.59802E+01
+          8.00542E-03         1.95537E-02        -1.36431E-02         5.02899E-01         1.44792E+00         5.03084E-01         6.45412E+01         1.00004E+00         3.66106E+00         6.48454E+01         2.88871E+01         3.59582E+01
+          8.00542E-03         1.97235E-02        -1.38527E-02         5.02897E-01         1.45859E+00         5.03088E-01         6.54581E+01         1.00004E+00         3.65438E+00         6.57624E+01         2.98022E+01         3.59602E+01
+          8.00542E-03         1.98933E-02        -1.40641E-02         5.02896E-01         1.46926E+00         5.03092E-01         6.63777E+01         1.00004E+00         3.64764E+00         6.66812E+01         3.06974E+01         3.59838E+01
+          8.00542E-03         2.00632E-02        -1.42773E-02         5.02894E-01         1.47993E+00         5.03096E-01         6.72928E+01         1.00004E+00         3.64075E+00         6.75947E+01         3.15679E+01         3.60268E+01
+          8.00542E-03         2.02330E-02        -1.44923E-02         5.02892E-01         1.49060E+00         5.03101E-01         6.81969E+01         1.00004E+00         3.63365E+00         6.84963E+01         3.24092E+01         3.60871E+01
+          8.00542E-03         2.04028E-02        -1.47092E-02         5.02890E-01         1.50127E+00         5.03105E-01         6.90838E+01         1.00004E+00         3.62628E+00         6.93798E+01         3.32175E+01         3.61624E+01
+          8.00542E-03         2.05726E-02        -1.49278E-02         5.02889E-01         1.51194E+00         5.03110E-01         6.99476E+01         1.00004E+00         3.61858E+00         7.02395E+01         3.39891E+01         3.62504E+01
+          8.00542E-03         2.07425E-02        -1.51483E-02         5.02887E-01         1.52261E+00         5.03115E-01         7.07831E+01         1.00004E+00         3.61050E+00         7.10701E+01         3.47210E+01         3.63491E+01
+          8.00542E-03         2.09123E-02        -1.53706E-02         5.02885E-01         1.53328E+00         5.03120E-01         7.15853E+01         1.00004E+00         3.60199E+00         7.18666E+01         3.54104E+01         3.64562E+01
+          8.00542E-03         2.10821E-02        -1.55947E-02         5.02883E-01         1.54395E+00         5.03125E-01         7.23498E+01         1.00004E+00         3.59300E+00         7.26246E+01         3.60549E+01         3.65697E+01
+          8.00542E-03         2.12520E-02        -1.58206E-02         5.02881E-01         1.55462E+00         5.03130E-01         7.30724E+01         1.00004E+00         3.58349E+00         7.33402E+01         3.66527E+01         3.66875E+01
+          8.00542E-03         2.14218E-02        -1.60483E-02         5.02880E-01         1.56529E+00         5.03136E-01         7.37496E+01         1.00004E+00         3.57344E+00         7.40095E+01         3.72020E+01         3.68075E+01
+          8.00542E-03         2.15916E-02        -1.62778E-02         5.02878E-01         1.57596E+00         5.03141E-01         7.43780E+01         1.00004E+00         3.56279E+00         7.46296E+01         3.77017E+01         3.69279E+01
+          8.00542E-03         2.17614E-02        -1.65092E-02         5.02876E-01         1.58664E+00         5.03147E-01         7.49548E+01         1.00004E+00         3.55154E+00         7.51974E+01         3.81507E+01         3.70467E+01
+          8.00542E-03         2.19313E-02        -1.67424E-02         5.02874E-01         1.59731E+00         5.03153E-01         7.54774E+01         1.00004E+00         3.53964E+00         7.57105E+01         3.85484E+01         3.71621E+01
+          8.00542E-03         2.21011E-02        -1.69773E-02         5.02872E-01         1.60798E+00         5.03159E-01         7.59438E+01         1.00004E+00         3.52707E+00         7.61668E+01         3.88944E+01         3.72724E+01
+          8.00542E-03         2.22709E-02        -1.72141E-02         5.02870E-01         1.61865E+00         5.03165E-01         7.63521E+01         1.00004E+00         3.51383E+00         7.65646E+01         3.91887E+01         3.73759E+01
+          8.00542E-03         2.24407E-02        -1.74527E-02         5.02868E-01         1.62932E+00         5.03171E-01         7.67010E+01         1.00004E+00         3.49989E+00         7.69026E+01         3.94314E+01         3.74711E+01
+          8.00542E-03         2.26106E-02        -1.76931E-02         5.02867E-01         1.63999E+00         5.03178E-01         7.69893E+01         1.00004E+00         3.48524E+00         7.71795E+01         3.96230E+01         3.75565E+01
+          8.00542E-03         2.27804E-02        -1.79354E-02         5.02865E-01         1.65066E+00         5.03184E-01         7.72162E+01         1.00004E+00         3.46986E+00         7.73947E+01         3.97640E+01         3.76308E+01
+          8.00542E-03         2.29502E-02        -1.81794E-02         5.02863E-01         1.66133E+00         5.03191E-01         7.73812E+01         1.00004E+00         3.45376E+00         7.75478E+01         3.98553E+01         3.76925E+01
+          8.00542E-03         2.31201E-02        -1.84253E-02         5.02861E-01         1.67200E+00         5.03198E-01         7.74843E+01         1.00004E+00         3.43692E+00         7.76386E+01         3.98979E+01         3.77406E+01
+          8.00542E-03         2.32899E-02        -1.86729E-02         5.02859E-01         1.68267E+00         5.03205E-01         7.75254E+01         1.00004E+00         3.41935E+00         7.76671E+01         3.98931E+01         3.77740E+01
+          8.00542E-03         2.34597E-02        -1.89224E-02         5.02857E-01         1.69334E+00         5.03213E-01         7.75048E+01         1.00004E+00         3.40103E+00         7.76339E+01         3.98422E+01         3.77917E+01
+          8.00542E-03         2.36295E-02        -1.91737E-02         5.02855E-01         1.70401E+00         5.03220E-01         7.74233E+01         1.00004E+00         3.38198E+00         7.75396E+01         3.97467E+01         3.77928E+01
+          8.00542E-03         2.37994E-02        -1.94268E-02         5.02853E-01         1.71468E+00         5.03228E-01         7.72816E+01         1.00004E+00         3.36219E+00         7.73849E+01         3.96083E+01         3.77766E+01
+          8.00542E-03         2.39692E-02        -1.96817E-02         5.02851E-01         1.72535E+00         5.03236E-01         7.70808E+01         1.00004E+00         3.34167E+00         7.71711E+01         3.94286E+01         3.77425E+01
+          8.00542E-03         2.41390E-02        -1.99385E-02         5.02849E-01         1.73602E+00         5.03244E-01         7.68221E+01         1.00004E+00         3.32042E+00         7.68993E+01         3.92095E+01         3.76898E+01
+          8.00542E-03         2.43088E-02        -2.01970E-02         5.02846E-01         1.74669E+00         5.03252E-01         7.65069E+01         1.00004E+00         3.29847E+00         7.65711E+01         3.89530E+01         3.76181E+01
+          8.00542E-03         2.44787E-02        -2.04574E-02         5.02844E-01         1.75736E+00         5.03260E-01         7.61369E+01         1.00004E+00         3.27580E+00         7.61881E+01         3.86610E+01         3.75271E+01
+          8.00542E-03         2.46485E-02        -2.07196E-02         5.02842E-01         1.76804E+00         5.03269E-01         7.57139E+01         1.00004E+00         3.25244E+00         7.57522E+01         3.83356E+01         3.74166E+01
+          8.00542E-03         2.48183E-02        -2.09836E-02         5.02840E-01         1.77871E+00         5.03278E-01         7.52397E+01         1.00004E+00         3.22839E+00         7.52652E+01         3.79788E+01         3.72864E+01
+          8.00542E-03         2.49882E-02        -2.12494E-02         5.02838E-01         1.78938E+00         5.03287E-01         7.47164E+01         1.00004E+00         3.20368E+00         7.47293E+01         3.75928E+01         3.71364E+01
+          8.00542E-03         2.51580E-02        -2.15170E-02         5.02836E-01         1.80005E+00         5.03296E-01         7.41462E+01         1.00004E+00         3.17831E+00         7.41466E+01         3.71798E+01         3.69668E+01
+          8.00542E-03         2.53278E-02        -2.17864E-02         5.02834E-01         1.81072E+00         5.03305E-01         7.35313E+01         1.00004E+00         3.15230E+00         7.35195E+01         3.67417E+01         3.67777E+01
+          8.00542E-03         2.54976E-02        -2.20577E-02         5.02832E-01         1.82139E+00         5.03315E-01         7.28741E+01         1.00004E+00         3.12566E+00         7.28503E+01         3.62809E+01         3.65693E+01
+          8.00542E-03         2.56675E-02        -2.23307E-02         5.02829E-01         1.83206E+00         5.03325E-01         7.21770E+01         1.00004E+00         3.09842E+00         7.21414E+01         3.57994E+01         3.63420E+01
+          8.00542E-03         2.58373E-02        -2.26056E-02         5.02827E-01         1.84273E+00         5.03335E-01         7.14425E+01         1.00004E+00         3.07060E+00         7.13955E+01         3.52994E+01         3.60961E+01
+          8.00542E-03         2.60071E-02        -2.28823E-02         5.02825E-01         1.85340E+00         5.03345E-01         7.06730E+01         1.00004E+00         3.04221E+00         7.06150E+01         3.47829E+01         3.58321E+01
+          8.00542E-03         2.61769E-02        -2.31608E-02         5.02823E-01         1.86407E+00         5.03356E-01         6.98713E+01         1.00004E+00         3.01327E+00         6.98025E+01         3.42519E+01         3.55506E+01
+          8.17524E-03         8.72665E-04        -1.74084E-03         5.13665E-01         2.74155E-01         5.13668E-01         1.78639E+03         1.00001E+00         2.19201E+01         1.78703E+03         1.52769E+03         2.59342E+02
+          8.17524E-03         1.04249E-03        -1.75105E-03         5.13665E-01         2.84826E-01         5.13668E-01         1.76188E+03         1.00001E+00         2.16151E+01         1.76249E+03         1.50619E+03         2.56302E+02
+          8.17524E-03         1.21232E-03        -1.76308E-03         5.13665E-01         2.95496E-01         5.13668E-01         1.73675E+03         1.00001E+00         2.13034E+01         1.73734E+03         1.48413E+03         2.53207E+02
+          8.17524E-03         1.38215E-03        -1.77693E-03         5.13665E-01         3.06167E-01         5.13668E-01         1.71105E+03         1.00001E+00         2.09857E+01         1.71161E+03         1.46155E+03         2.50064E+02
+          8.17524E-03         1.55197E-03        -1.79258E-03         5.13665E-01         3.16838E-01         5.13668E-01         1.68480E+03         1.00001E+00         2.06623E+01         1.68533E+03         1.43845E+03         2.46877E+02
+          8.17524E-03         1.72180E-03        -1.81005E-03         5.13665E-01         3.27508E-01         5.13668E-01         1.65804E+03         1.00001E+00         2.03337E+01         1.65854E+03         1.41489E+03         2.43651E+02
+          8.17524E-03         1.89163E-03        -1.82932E-03         5.13665E-01         3.38179E-01         5.13668E-01         1.63080E+03         1.00001E+00         2.00004E+01         1.63127E+03         1.39088E+03         2.40392E+02
+          8.17524E-03         2.06146E-03        -1.85041E-03         5.13665E-01         3.48849E-01         5.13668E-01         1.60312E+03         1.00001E+00         1.96629E+01         1.60355E+03         1.36645E+03         2.37105E+02
+          8.17524E-03         2.23128E-03        -1.87332E-03         5.13664E-01         3.59520E-01         5.13668E-01         1.57502E+03         1.00001E+00         1.93218E+01         1.57542E+03         1.34163E+03         2.33794E+02
+          8.17524E-03         2.40111E-03        -1.89803E-03         5.13664E-01         3.70190E-01         5.13668E-01         1.54654E+03         1.00001E+00         1.89775E+01         1.54692E+03         1.31645E+03         2.30465E+02
+          8.17524E-03         2.57094E-03        -1.92456E-03         5.13664E-01         3.80861E-01         5.13668E-01         1.51772E+03         1.00001E+00         1.86305E+01         1.51807E+03         1.29095E+03         2.27121E+02
+          8.17524E-03         2.74077E-03        -1.95290E-03         5.13664E-01         3.91532E-01         5.13667E-01         1.48859E+03         1.00001E+00         1.82812E+01         1.48891E+03         1.26514E+03         2.23767E+02
+          8.17524E-03         2.91059E-03        -1.98305E-03         5.13663E-01         4.02202E-01         5.13667E-01         1.45919E+03         1.00001E+00         1.79302E+01         1.45947E+03         1.23906E+03         2.20408E+02
+          8.17524E-03         3.08042E-03        -2.01501E-03         5.13663E-01         4.12873E-01         5.13667E-01         1.42954E+03         1.00001E+00         1.75779E+01         1.42980E+03         1.21275E+03         2.17047E+02
+          8.17524E-03         3.25025E-03        -2.04878E-03         5.13663E-01         4.23543E-01         5.13667E-01         1.39969E+03         1.00001E+00         1.72248E+01         1.39991E+03         1.18622E+03         2.13688E+02
+          8.17524E-03         3.42008E-03        -2.08437E-03         5.13663E-01         4.34214E-01         5.13667E-01         1.36966E+03         1.00001E+00         1.68714E+01         1.36985E+03         1.15952E+03         2.10334E+02
+          8.17524E-03         3.58990E-03        -2.12177E-03         5.13662E-01         4.44884E-01         5.13667E-01         1.33949E+03         1.00001E+00         1.65181E+01         1.33966E+03         1.13267E+03         2.06990E+02
+          8.17524E-03         3.75973E-03        -2.16098E-03         5.13662E-01         4.55555E-01         5.13667E-01         1.30922E+03         1.00001E+00         1.61653E+01         1.30935E+03         1.10569E+03         2.03658E+02
+          8.17524E-03         3.92956E-03        -2.20201E-03         5.13662E-01         4.66225E-01         5.13666E-01         1.27887E+03         1.00001E+00         1.58134E+01         1.27897E+03         1.07863E+03         2.00341E+02
+          8.17524E-03         4.09939E-03        -2.24484E-03         5.13661E-01         4.76896E-01         5.13666E-01         1.24847E+03         1.00001E+00         1.54630E+01         1.24855E+03         1.05151E+03         1.97042E+02
+          8.17524E-03         4.26921E-03        -2.28949E-03         5.13661E-01         4.87567E-01         5.13666E-01         1.21807E+03         1.00001E+00         1.51143E+01         1.21812E+03         1.02435E+03         1.93763E+02
+          8.17524E-03         4.43904E-03        -2.33595E-03         5.13661E-01         4.98237E-01         5.13666E-01         1.18769E+03         1.00001E+00         1.47679E+01         1.18771E+03         9.97200E+02         1.90507E+02
+          8.17524E-03         4.60887E-03        -2.38422E-03         5.13660E-01         5.08908E-01         5.13666E-01         1.15736E+03         1.00001E+00         1.44240E+01         1.15735E+03         9.70072E+02         1.87275E+02
+          8.17524E-03         4.77869E-03        -2.43430E-03         5.13660E-01         5.19578E-01         5.13666E-01         1.12711E+03         1.00001E+00         1.40830E+01         1.12707E+03         9.42998E+02         1.84071E+02
+          8.17524E-03         4.94852E-03        -2.48620E-03         5.13659E-01         5.30249E-01         5.13665E-01         1.09697E+03         1.00001E+00         1.37452E+01         1.09690E+03         9.16008E+02         1.80894E+02
+          8.17524E-03         5.11835E-03        -2.53991E-03         5.13659E-01         5.40919E-01         5.13665E-01         1.06696E+03         1.00001E+00         1.34111E+01         1.06687E+03         8.89128E+02         1.77747E+02
+          8.17524E-03         5.28818E-03        -2.59543E-03         5.13658E-01         5.51590E-01         5.13665E-01         1.03713E+03         1.00001E+00         1.30808E+01         1.03702E+03         8.62385E+02         1.74630E+02
+          8.17524E-03         5.45800E-03        -2.65276E-03         5.13658E-01         5.62261E-01         5.13665E-01         1.00749E+03         1.00001E+00         1.27548E+01         1.00735E+03         8.35805E+02         1.71545E+02
+          8.17524E-03         5.62783E-03        -2.71191E-03         5.13658E-01         5.72931E-01         5.13665E-01         9.78069E+02         1.00001E+00         1.24333E+01         9.77906E+02         8.09413E+02         1.68493E+02
+          8.17524E-03         5.79766E-03        -2.77287E-03         5.13657E-01         5.83602E-01         5.13665E-01         9.48895E+02         1.00001E+00         1.21165E+01         9.48709E+02         7.83235E+02         1.65474E+02
+          8.17524E-03         5.96749E-03        -2.83563E-03         5.13657E-01         5.94272E-01         5.13664E-01         9.19991E+02         1.00001E+00         1.18047E+01         9.19783E+02         7.57294E+02         1.62489E+02
+          8.17524E-03         6.13731E-03        -2.90022E-03         5.13656E-01         6.04943E-01         5.13664E-01         8.91381E+02         1.00001E+00         1.14981E+01         8.91153E+02         7.31614E+02         1.59538E+02
+          8.17524E-03         6.30714E-03        -2.96661E-03         5.13655E-01         6.15613E-01         5.13664E-01         8.63088E+02         1.00001E+00         1.11970E+01         8.62840E+02         7.06219E+02         1.56621E+02
+          8.17524E-03         6.47697E-03        -3.03482E-03         5.13655E-01         6.26284E-01         5.13664E-01         8.35134E+02         1.00001E+00         1.09014E+01         8.34866E+02         6.81128E+02         1.53738E+02
+          8.17524E-03         6.64680E-03        -3.10483E-03         5.13654E-01         6.36955E-01         5.13664E-01         8.07540E+02         1.00001E+00         1.06117E+01         8.07254E+02         6.56365E+02         1.50889E+02
+          8.17524E-03         6.81662E-03        -3.17666E-03         5.13654E-01         6.47625E-01         5.13664E-01         7.80326E+02         1.00001E+00         1.03279E+01         7.80022E+02         6.31948E+02         1.48075E+02
+          8.17524E-03         6.98645E-03        -3.25031E-03         5.13653E-01         6.58296E-01         5.13663E-01         7.53510E+02         1.00001E+00         1.00502E+01         7.53190E+02         6.07897E+02         1.45293E+02
+          8.17524E-03         7.15628E-03        -3.32576E-03         5.13653E-01         6.68966E-01         5.13663E-01         7.27110E+02         1.00001E+00         9.77869E+00         7.26776E+02         5.84231E+02         1.42545E+02
+          8.17524E-03         7.32611E-03        -3.40303E-03         5.13652E-01         6.79637E-01         5.13663E-01         7.01145E+02         1.00001E+00         9.51349E+00         7.00796E+02         5.60966E+02         1.39830E+02
+          8.17524E-03         7.49593E-03        -3.48211E-03         5.13651E-01         6.90307E-01         5.13663E-01         6.75629E+02         1.00001E+00         9.25466E+00         6.75267E+02         5.38120E+02         1.37147E+02
+          8.17524E-03         7.66576E-03        -3.56300E-03         5.13651E-01         7.00978E-01         5.13663E-01         6.50577E+02         1.00001E+00         9.00228E+00         6.50203E+02         5.15708E+02         1.34495E+02
+          8.17524E-03         7.83559E-03        -3.64570E-03         5.13650E-01         7.11649E-01         5.13663E-01         6.26004E+02         1.00001E+00         8.75639E+00         6.25619E+02         4.93745E+02         1.31875E+02
+          8.17524E-03         8.00542E-03        -3.73022E-03         5.13649E-01         7.22319E-01         5.13663E-01         6.01922E+02         1.00001E+00         8.51704E+00         6.01528E+02         4.72243E+02         1.29284E+02
+          8.17524E-03         8.17524E-03        -3.81655E-03         5.13649E-01         7.32990E-01         5.13663E-01         5.78343E+02         1.00001E+00         8.28423E+00         5.77940E+02         4.51216E+02         1.26724E+02
+          8.17524E-03         8.34507E-03        -3.90469E-03         5.13648E-01         7.43660E-01         5.13663E-01         5.55278E+02         1.00001E+00         8.05798E+00         5.54868E+02         4.30675E+02         1.24193E+02
+          8.17524E-03         8.51490E-03        -3.99464E-03         5.13647E-01         7.54331E-01         5.13663E-01         5.32737E+02         1.00001E+00         7.83826E+00         5.32321E+02         4.10631E+02         1.21690E+02
+          8.17524E-03         8.68473E-03        -4.08641E-03         5.13646E-01         7.65001E-01         5.13663E-01         5.10729E+02         1.00001E+00         7.62505E+00         5.10307E+02         3.91093E+02         1.19215E+02
+          8.17524E-03         8.85455E-03        -4.17998E-03         5.13646E-01         7.75672E-01         5.13663E-01         4.89261E+02         1.00001E+00         7.41832E+00         4.88835E+02         3.72069E+02         1.16767E+02
+          8.17524E-03         9.02438E-03        -4.27537E-03         5.13645E-01         7.86343E-01         5.13663E-01         4.68341E+02         1.00001E+00         7.21802E+00         4.67912E+02         3.53566E+02         1.14346E+02
+          8.17524E-03         9.19421E-03        -4.37258E-03         5.13644E-01         7.97013E-01         5.13663E-01         4.47974E+02         1.00001E+00         7.02407E+00         4.47544E+02         3.35592E+02         1.11951E+02
+          8.17524E-03         9.36403E-03        -4.47159E-03         5.13643E-01         8.07684E-01         5.13663E-01         4.28166E+02         1.00001E+00         6.83643E+00         4.27734E+02         3.18152E+02         1.09582E+02
+          8.17524E-03         9.53386E-03        -4.57242E-03         5.13642E-01         8.18354E-01         5.13663E-01         4.08919E+02         1.00001E+00         6.65499E+00         4.08488E+02         3.01249E+02         1.07239E+02
+          8.17524E-03         9.70369E-03        -4.67506E-03         5.13641E-01         8.29025E-01         5.13663E-01         3.90239E+02         1.00001E+00         6.47968E+00         3.89809E+02         2.84888E+02         1.04921E+02
+          8.17524E-03         9.87352E-03        -4.77951E-03         5.13641E-01         8.39695E-01         5.13663E-01         3.72125E+02         1.00001E+00         6.31040E+00         3.71698E+02         2.69070E+02         1.02628E+02
+          8.17524E-03         1.00433E-02        -4.88577E-03         5.13640E-01         8.50366E-01         5.13663E-01         3.54581E+02         1.00001E+00         6.14705E+00         3.54157E+02         2.53797E+02         1.00359E+02
+          8.17524E-03         1.02132E-02        -4.99385E-03         5.13639E-01         8.61037E-01         5.13663E-01         3.37606E+02         1.00001E+00         5.98952E+00         3.37186E+02         2.39070E+02         9.81158E+01
+          8.17524E-03         1.03830E-02        -5.10374E-03         5.13638E-01         8.71707E-01         5.13663E-01         3.21199E+02         1.00001E+00         5.83769E+00         3.20784E+02         2.24887E+02         9.58972E+01
+          8.17524E-03         1.05528E-02        -5.21544E-03         5.13637E-01         8.82378E-01         5.13664E-01         3.05360E+02         1.00001E+00         5.69146E+00         3.04952E+02         2.11248E+02         9.37036E+01
+          8.17524E-03         1.07227E-02        -5.32895E-03         5.13636E-01         8.93048E-01         5.13664E-01         2.90087E+02         1.00001E+00         5.55070E+00         2.89685E+02         1.98150E+02         9.15352E+01
+          8.17524E-03         1.08925E-02        -5.44428E-03         5.13635E-01         9.03719E-01         5.13664E-01         2.75376E+02         1.00001E+00         5.41529E+00         2.74982E+02         1.85590E+02         8.93924E+01
+          8.17524E-03         1.10623E-02        -5.56142E-03         5.13634E-01         9.14389E-01         5.13664E-01         2.61224E+02         1.00001E+00         5.28511E+00         2.60839E+02         1.73563E+02         8.72755E+01
+          8.17524E-03         1.12321E-02        -5.68037E-03         5.13633E-01         9.25060E-01         5.13665E-01         2.47627E+02         1.00001E+00         5.16005E+00         2.47251E+02         1.62066E+02         8.51851E+01
+          8.17524E-03         1.14020E-02        -5.80113E-03         5.13632E-01         9.35731E-01         5.13665E-01         2.34579E+02         1.00001E+00         5.03997E+00         2.34214E+02         1.51092E+02         8.31217E+01
+          8.17524E-03         1.15718E-02        -5.92371E-03         5.13631E-01         9.46401E-01         5.13665E-01         2.22075E+02         1.00001E+00         4.92475E+00         2.21722E+02         1.40636E+02         8.10860E+01
+          8.17524E-03         1.17416E-02        -6.04809E-03         5.13630E-01         9.57072E-01         5.13666E-01         2.10109E+02         1.00001E+00         4.81429E+00         2.09767E+02         1.30689E+02         7.90786E+01
+          8.17524E-03         1.19114E-02        -6.17429E-03         5.13629E-01         9.67742E-01         5.13666E-01         1.98674E+02         1.00001E+00         4.70844E+00         1.98344E+02         1.21244E+02         7.71005E+01
+          8.17524E-03         1.20813E-02        -6.30231E-03         5.13628E-01         9.78413E-01         5.13667E-01         1.87762E+02         1.00001E+00         4.60711E+00         1.87445E+02         1.12293E+02         7.51524E+01
+          8.17524E-03         1.22511E-02        -6.43213E-03         5.13627E-01         9.89083E-01         5.13667E-01         1.77365E+02         1.00001E+00         4.51017E+00         1.77061E+02         1.03826E+02         7.32354E+01
+          8.17524E-03         1.24209E-02        -6.56377E-03         5.13626E-01         9.99754E-01         5.13668E-01         1.67474E+02         1.00001E+00         4.41751E+00         1.67185E+02         9.58341E+01         7.13504E+01
+          8.17524E-03         1.25908E-02        -6.69722E-03         5.13625E-01         1.01042E+00         5.13669E-01         1.58080E+02         1.00001E+00         4.32903E+00         1.57805E+02         8.83070E+01         6.94984E+01
+          8.17524E-03         1.27606E-02        -6.83248E-03         5.13624E-01         1.02110E+00         5.13669E-01         1.49174E+02         1.00001E+00         4.24460E+00         1.48914E+02         8.12339E+01         6.76806E+01
+          8.17524E-03         1.29304E-02        -6.96956E-03         5.13623E-01         1.03177E+00         5.13670E-01         1.40746E+02         1.00001E+00         4.16413E+00         1.40501E+02         7.46035E+01         6.58979E+01
+          8.17524E-03         1.31002E-02        -7.10845E-03         5.13622E-01         1.04244E+00         5.13671E-01         1.32785E+02         1.00001E+00         4.08752E+00         1.32556E+02         6.84043E+01         6.41516E+01
+          8.17524E-03         1.32701E-02        -7.24915E-03         5.13620E-01         1.05311E+00         5.13672E-01         1.25280E+02         1.00001E+00         4.01465E+00         1.25067E+02         6.26242E+01         6.24428E+01
+          8.17524E-03         1.34399E-02        -7.39166E-03         5.13619E-01         1.06378E+00         5.13672E-01         1.18220E+02         1.00001E+00         3.94543E+00         1.18023E+02         5.72508E+01         6.07726E+01
+          8.17524E-03         1.36097E-02        -7.53599E-03         5.13618E-01         1.07445E+00         5.13673E-01         1.11594E+02         1.00001E+00         3.87976E+00         1.11414E+02         5.22715E+01         5.91422E+01
+          8.17524E-03         1.37795E-02        -7.68212E-03         5.13617E-01         1.08512E+00         5.13674E-01         1.05390E+02         1.00001E+00         3.81753E+00         1.05226E+02         4.76733E+01         5.75527E+01
+          8.17524E-03         1.39494E-02        -7.83008E-03         5.13616E-01         1.09579E+00         5.13675E-01         9.95957E+01         1.00001E+00         3.75866E+00         9.94481E+01         4.34429E+01         5.60052E+01
+          8.17524E-03         1.41192E-02        -7.97984E-03         5.13614E-01         1.10646E+00         5.13676E-01         9.41988E+01         1.00001E+00         3.70304E+00         9.40678E+01         3.95670E+01         5.45008E+01
+          8.17524E-03         1.42890E-02        -8.13142E-03         5.13613E-01         1.11713E+00         5.13678E-01         8.91868E+01         1.00001E+00         3.65058E+00         8.90725E+01         3.60320E+01         5.30405E+01
+          8.17524E-03         1.44589E-02        -8.28480E-03         5.13612E-01         1.12780E+00         5.13679E-01         8.45472E+01         1.00001E+00         3.60117E+00         8.44495E+01         3.28242E+01         5.16254E+01
+          8.17524E-03         1.46287E-02        -8.44001E-03         5.13611E-01         1.13847E+00         5.13680E-01         8.02671E+01         1.00001E+00         3.55472E+00         8.01859E+01         2.99297E+01         5.02563E+01
+          8.17524E-03         1.47985E-02        -8.59702E-03         5.13609E-01         1.14914E+00         5.13681E-01         7.63336E+01         1.00001E+00         3.51112E+00         7.62688E+01         2.73347E+01         4.89341E+01
+          8.17524E-03         1.49683E-02        -8.75585E-03         5.13608E-01         1.15981E+00         5.13683E-01         7.27335E+01         1.00001E+00         3.47028E+00         7.26850E+01         2.50254E+01         4.76596E+01
+          8.17524E-03         1.51382E-02        -8.91649E-03         5.13607E-01         1.17048E+00         5.13684E-01         6.94540E+01         1.00001E+00         3.43209E+00         6.94215E+01         2.29878E+01         4.64336E+01
+          8.17524E-03         1.53080E-02        -9.07894E-03         5.13605E-01         1.18115E+00         5.13686E-01         6.64817E+01         1.00001E+00         3.39645E+00         6.64650E+01         2.12082E+01         4.52567E+01
+          8.17524E-03         1.54778E-02        -9.24320E-03         5.13604E-01         1.19182E+00         5.13687E-01         6.38035E+01         1.00001E+00         3.36325E+00         6.38023E+01         1.96729E+01         4.41294E+01
+          8.17524E-03         1.56476E-02        -9.40928E-03         5.13603E-01         1.20249E+00         5.13689E-01         6.14064E+01         1.00001E+00         3.33239E+00         6.14204E+01         1.83682E+01         4.30522E+01
+          8.17524E-03         1.58175E-02        -9.57717E-03         5.13601E-01         1.21317E+00         5.13691E-01         5.92771E+01         1.00001E+00         3.30376E+00         5.93060E+01         1.72806E+01         4.20254E+01
+          8.17524E-03         1.59873E-02        -9.74688E-03         5.13600E-01         1.22384E+00         5.13692E-01         5.74027E+01         1.00001E+00         3.27725E+00         5.74460E+01         1.63968E+01         4.10493E+01
+          8.17524E-03         1.61571E-02        -9.91839E-03         5.13599E-01         1.23451E+00         5.13694E-01         5.57702E+01         1.00001E+00         3.25275E+00         5.58275E+01         1.57037E+01         4.01239E+01
+          8.17524E-03         1.63270E-02        -1.00917E-02         5.13597E-01         1.24518E+00         5.13696E-01         5.43667E+01         1.00001E+00         3.23015E+00         5.44376E+01         1.51883E+01         3.92493E+01
+          8.17524E-03         1.64968E-02        -1.02669E-02         5.13596E-01         1.25585E+00         5.13698E-01         5.31794E+01         1.00001E+00         3.20934E+00         5.32635E+01         1.48381E+01         3.84254E+01
+          8.17524E-03         1.66666E-02        -1.04438E-02         5.13594E-01         1.26652E+00         5.13700E-01         5.21959E+01         1.00001E+00         3.19021E+00         5.22926E+01         1.46407E+01         3.76519E+01
+          8.17524E-03         1.68364E-02        -1.06226E-02         5.13593E-01         1.27719E+00         5.13703E-01         5.14036E+01         1.00001E+00         3.17266E+00         5.15123E+01         1.45838E+01         3.69285E+01
+          8.17524E-03         1.70063E-02        -1.08032E-02         5.13591E-01         1.28786E+00         5.13705E-01         5.07903E+01         1.00001E+00         3.15656E+00         5.09106E+01         1.46558E+01         3.62548E+01
+          8.17524E-03         1.71761E-02        -1.09856E-02         5.13590E-01         1.29853E+00         5.13707E-01         5.03440E+01         1.00001E+00         3.14181E+00         5.04752E+01         1.48451E+01         3.56302E+01
+          8.17524E-03         1.73459E-02        -1.11698E-02         5.13588E-01         1.30920E+00         5.13710E-01         5.00528E+01         1.00001E+00         3.12831E+00         5.01944E+01         1.51406E+01         3.50538E+01
+          8.17524E-03         1.75158E-02        -1.13558E-02         5.13587E-01         1.31987E+00         5.13712E-01         4.99052E+01         1.00001E+00         3.11594E+00         5.00566E+01         1.55316E+01         3.45250E+01
+          8.17524E-03         1.76856E-02        -1.15436E-02         5.13585E-01         1.33054E+00         5.13715E-01         4.98899E+01         1.00001E+00         3.10461E+00         5.00504E+01         1.60076E+01         3.40428E+01
+          8.17524E-03         1.78554E-02        -1.17333E-02         5.13584E-01         1.34121E+00         5.13718E-01         4.99957E+01         1.00001E+00         3.09421E+00         5.01647E+01         1.65587E+01         3.36060E+01
+          8.17524E-03         1.80252E-02        -1.19247E-02         5.13582E-01         1.35188E+00         5.13721E-01         5.02119E+01         1.00001E+00         3.08464E+00         5.03887E+01         1.71751E+01         3.32136E+01
+          8.17524E-03         1.81951E-02        -1.21180E-02         5.13581E-01         1.36255E+00         5.13724E-01         5.05281E+01         1.00001E+00         3.07581E+00         5.07120E+01         1.78477E+01         3.28643E+01
+          8.17524E-03         1.83649E-02        -1.23131E-02         5.13579E-01         1.37322E+00         5.13727E-01         5.09339E+01         1.00001E+00         3.06762E+00         5.11244E+01         1.85677E+01         3.25567E+01
+          8.17524E-03         1.85347E-02        -1.25100E-02         5.13577E-01         1.38389E+00         5.13730E-01         5.14196E+01         1.00001E+00         3.05998E+00         5.16159E+01         1.93266E+01         3.22893E+01
+          8.17524E-03         1.87045E-02        -1.27087E-02         5.13576E-01         1.39457E+00         5.13733E-01         5.19756E+01         1.00001E+00         3.05281E+00         5.21770E+01         2.01164E+01         3.20606E+01
+          8.17524E-03         1.88744E-02        -1.29092E-02         5.13574E-01         1.40524E+00         5.13736E-01         5.25926E+01         1.00001E+00         3.04603E+00         5.27985E+01         2.09296E+01         3.18689E+01
+          8.17524E-03         1.90442E-02        -1.31115E-02         5.13573E-01         1.41591E+00         5.13740E-01         5.32619E+01         1.00001E+00         3.03955E+00         5.34716E+01         2.17591E+01         3.17124E+01
+          8.17524E-03         1.92140E-02        -1.33157E-02         5.13571E-01         1.42658E+00         5.13743E-01         5.39748E+01         1.00001E+00         3.03329E+00         5.41876E+01         2.25981E+01         3.15895E+01
+          8.17524E-03         1.93839E-02        -1.35217E-02         5.13569E-01         1.43725E+00         5.13747E-01         5.47233E+01         1.00001E+00         3.02720E+00         5.49385E+01         2.34404E+01         3.14982E+01
+          8.17524E-03         1.95537E-02        -1.37294E-02         5.13567E-01         1.44792E+00         5.13751E-01         5.54995E+01         1.00001E+00         3.02119E+00         5.57165E+01         2.42799E+01         3.14365E+01
+          8.17524E-03         1.97235E-02        -1.39390E-02         5.13566E-01         1.45859E+00         5.13755E-01         5.62959E+01         1.00001E+00         3.01520E+00         5.65140E+01         2.51114E+01         3.14026E+01
+          8.17524E-03         1.98933E-02        -1.41504E-02         5.13564E-01         1.46926E+00         5.13759E-01         5.71056E+01         1.00001E+00         3.00918E+00         5.73241E+01         2.59297E+01         3.13944E+01
+          8.17524E-03         2.00632E-02        -1.43636E-02         5.13562E-01         1.47993E+00         5.13763E-01         5.79217E+01         1.00001E+00         3.00306E+00         5.81401E+01         2.67301E+01         3.14099E+01
+          8.17524E-03         2.02330E-02        -1.45787E-02         5.13561E-01         1.49060E+00         5.13767E-01         5.87380E+01         1.00001E+00         2.99680E+00         5.89555E+01         2.75085E+01         3.14470E+01
+          8.17524E-03         2.04028E-02        -1.47955E-02         5.13559E-01         1.50127E+00         5.13772E-01         5.95484E+01         1.00001E+00         2.99035E+00         5.97645E+01         2.82609E+01         3.15036E+01
+          8.17524E-03         2.05726E-02        -1.50142E-02         5.13557E-01         1.51194E+00         5.13776E-01         6.03474E+01         1.00001E+00         2.98365E+00         6.05615E+01         2.89839E+01         3.15776E+01
+          8.17524E-03         2.07425E-02        -1.52346E-02         5.13555E-01         1.52261E+00         5.13781E-01         6.11297E+01         1.00001E+00         2.97667E+00         6.13412E+01         2.96743E+01         3.16669E+01
+          8.17524E-03         2.09123E-02        -1.54569E-02         5.13553E-01         1.53328E+00         5.13786E-01         6.18905E+01         1.00001E+00         2.96937E+00         6.20989E+01         3.03294E+01         3.17694E+01
+          8.17524E-03         2.10821E-02        -1.56810E-02         5.13552E-01         1.54395E+00         5.13791E-01         6.26253E+01         1.00001E+00         2.96171E+00         6.28299E+01         3.09468E+01         3.18831E+01
+          8.17524E-03         2.12520E-02        -1.59069E-02         5.13550E-01         1.55462E+00         5.13796E-01         6.33299E+01         1.00001E+00         2.95367E+00         6.35303E+01         3.15244E+01         3.20059E+01
+          8.17524E-03         2.14218E-02        -1.61346E-02         5.13548E-01         1.56529E+00         5.13801E-01         6.40005E+01         1.00001E+00         2.94520E+00         6.41962E+01         3.20605E+01         3.21357E+01
+          8.17524E-03         2.15916E-02        -1.63642E-02         5.13546E-01         1.57596E+00         5.13807E-01         6.46337E+01         1.00001E+00         2.93630E+00         6.48242E+01         3.25536E+01         3.22706E+01
+          8.17524E-03         2.17614E-02        -1.65955E-02         5.13544E-01         1.58664E+00         5.13812E-01         6.52264E+01         1.00001E+00         2.92692E+00         6.54112E+01         3.30026E+01         3.24086E+01
+          8.17524E-03         2.19313E-02        -1.68287E-02         5.13542E-01         1.59731E+00         5.13818E-01         6.57757E+01         1.00001E+00         2.91706E+00         6.59545E+01         3.34067E+01         3.25478E+01
+          8.17524E-03         2.21011E-02        -1.70636E-02         5.13540E-01         1.60798E+00         5.13824E-01         6.62794E+01         1.00001E+00         2.90669E+00         6.64517E+01         3.37652E+01         3.26865E+01
+          8.17524E-03         2.22709E-02        -1.73004E-02         5.13538E-01         1.61865E+00         5.13830E-01         6.67352E+01         1.00001E+00         2.89581E+00         6.69007E+01         3.40779E+01         3.28228E+01
+          8.17524E-03         2.24407E-02        -1.75390E-02         5.13536E-01         1.62932E+00         5.13836E-01         6.71414E+01         1.00001E+00         2.88439E+00         6.72996E+01         3.43446E+01         3.29551E+01
+          8.17524E-03         2.26106E-02        -1.77794E-02         5.13534E-01         1.63999E+00         5.13842E-01         6.74964E+01         1.00001E+00         2.87242E+00         6.76471E+01         3.45655E+01         3.30816E+01
+          8.17524E-03         2.27804E-02        -1.80217E-02         5.13532E-01         1.65066E+00         5.13848E-01         6.77991E+01         1.00001E+00         2.85990E+00         6.79419E+01         3.47409E+01         3.32010E+01
+          8.17524E-03         2.29502E-02        -1.82657E-02         5.13530E-01         1.66133E+00         5.13855E-01         6.80484E+01         1.00001E+00         2.84682E+00         6.81832E+01         3.48715E+01         3.33117E+01
+          8.17524E-03         2.31201E-02        -1.85116E-02         5.13528E-01         1.67200E+00         5.13862E-01         6.82438E+01         1.00001E+00         2.83318E+00         6.83703E+01         3.49579E+01         3.34123E+01
+          8.17524E-03         2.32899E-02        -1.87592E-02         5.13526E-01         1.68267E+00         5.13869E-01         6.83848E+01         1.00001E+00         2.81897E+00         6.85027E+01         3.50011E+01         3.35017E+01
+          8.17524E-03         2.34597E-02        -1.90087E-02         5.13524E-01         1.69334E+00         5.13876E-01         6.84713E+01         1.00001E+00         2.80419E+00         6.85805E+01         3.50020E+01         3.35785E+01
+          8.17524E-03         2.36295E-02        -1.92600E-02         5.13522E-01         1.70401E+00         5.13883E-01         6.85034E+01         1.00001E+00         2.78883E+00         6.86037E+01         3.49620E+01         3.36417E+01
+          8.17524E-03         2.37994E-02        -1.95131E-02         5.13520E-01         1.71468E+00         5.13891E-01         6.84813E+01         1.00001E+00         2.77292E+00         6.85727E+01         3.48823E+01         3.36903E+01
+          8.17524E-03         2.39692E-02        -1.97680E-02         5.13518E-01         1.72535E+00         5.13898E-01         6.84057E+01         1.00001E+00         2.75644E+00         6.84879E+01         3.47644E+01         3.37235E+01
+          8.17524E-03         2.41390E-02        -2.00248E-02         5.13516E-01         1.73602E+00         5.13906E-01         6.82771E+01         1.00001E+00         2.73940E+00         6.83502E+01         3.46098E+01         3.37404E+01
+          8.17524E-03         2.43088E-02        -2.02833E-02         5.13514E-01         1.74669E+00         5.13914E-01         6.80967E+01         1.00001E+00         2.72180E+00         6.81606E+01         3.44201E+01         3.37404E+01
+          8.17524E-03         2.44787E-02        -2.05437E-02         5.13512E-01         1.75736E+00         5.13923E-01         6.78653E+01         1.00001E+00         2.70366E+00         6.79200E+01         3.41971E+01         3.37229E+01
+          8.17524E-03         2.46485E-02        -2.08059E-02         5.13510E-01         1.76804E+00         5.13931E-01         6.75844E+01         1.00001E+00         2.68498E+00         6.76298E+01         3.39425E+01         3.36874E+01
+          8.17524E-03         2.48183E-02        -2.10699E-02         5.13507E-01         1.77871E+00         5.13940E-01         6.72552E+01         1.00001E+00         2.66577E+00         6.72915E+01         3.36580E+01         3.36335E+01
+          8.17524E-03         2.49882E-02        -2.13357E-02         5.13505E-01         1.78938E+00         5.13948E-01         6.68794E+01         1.00001E+00         2.64604E+00         6.69065E+01         3.33456E+01         3.35609E+01
+          8.17524E-03         2.51580E-02        -2.16033E-02         5.13503E-01         1.80005E+00         5.13957E-01         6.64586E+01         1.00001E+00         2.62580E+00         6.64767E+01         3.30072E+01         3.34695E+01
+          8.17524E-03         2.53278E-02        -2.18727E-02         5.13501E-01         1.81072E+00         5.13967E-01         6.59945E+01         1.00001E+00         2.60506E+00         6.60037E+01         3.26445E+01         3.33592E+01
+          8.17524E-03         2.54976E-02        -2.21440E-02         5.13499E-01         1.82139E+00         5.13976E-01         6.54892E+01         1.00001E+00         2.58384E+00         6.54896E+01         3.22596E+01         3.32300E+01
+          8.17524E-03         2.56675E-02        -2.24170E-02         5.13496E-01         1.83206E+00         5.13986E-01         6.49444E+01         1.00001E+00         2.56215E+00         6.49362E+01         3.18543E+01         3.30819E+01
+          8.17524E-03         2.58373E-02        -2.26919E-02         5.13494E-01         1.84273E+00         5.13995E-01         6.43624E+01         1.00001E+00         2.54001E+00         6.43457E+01         3.14305E+01         3.29152E+01
+          8.17524E-03         2.60071E-02        -2.29686E-02         5.13492E-01         1.85340E+00         5.14005E-01         6.37452E+01         1.00001E+00         2.51742E+00         6.37203E+01         3.09901E+01         3.27301E+01
+          8.17524E-03         2.61769E-02        -2.32471E-02         5.13490E-01         1.86407E+00         5.14016E-01         6.30950E+01         1.00001E+00         2.49440E+00         6.30620E+01         3.05350E+01         3.25270E+01
+          8.34507E-03         8.72665E-04        -1.82898E-03         5.24336E-01         2.74155E-01         5.24339E-01         1.58272E+03         9.99999E-01         1.75159E+01         1.58324E+03         1.31716E+03         2.66083E+02
+          8.34507E-03         1.04249E-03        -1.83920E-03         5.24336E-01         2.84826E-01         5.24339E-01         1.56127E+03         9.99999E-01         1.72735E+01         1.56177E+03         1.29928E+03         2.62493E+02
+          8.34507E-03         1.21232E-03        -1.85123E-03         5.24336E-01         2.95496E-01         5.24339E-01         1.53929E+03         9.99999E-01         1.70258E+01         1.53977E+03         1.28093E+03         2.58845E+02
+          8.34507E-03         1.38215E-03        -1.86507E-03         5.24336E-01         3.06167E-01         5.24339E-01         1.51680E+03         9.99999E-01         1.67732E+01         1.51726E+03         1.26212E+03         2.55146E+02
+          8.34507E-03         1.55197E-03        -1.88072E-03         5.24336E-01         3.16838E-01         5.24339E-01         1.49384E+03         9.99999E-01         1.65162E+01         1.49428E+03         1.24287E+03         2.51402E+02
+          8.34507E-03         1.72180E-03        -1.89819E-03         5.24335E-01         3.27508E-01         5.24339E-01         1.47042E+03         9.99999E-01         1.62550E+01         1.47084E+03         1.22322E+03         2.47621E+02
+          8.34507E-03         1.89163E-03        -1.91747E-03         5.24335E-01         3.38179E-01         5.24339E-01         1.44659E+03         9.99999E-01         1.59902E+01         1.44699E+03         1.20318E+03         2.43809E+02
+          8.34507E-03         2.06146E-03        -1.93856E-03         5.24335E-01         3.48849E-01         5.24339E-01         1.42237E+03         9.99999E-01         1.57221E+01         1.42275E+03         1.18277E+03         2.39972E+02
+          8.34507E-03         2.23128E-03        -1.96146E-03         5.24335E-01         3.59520E-01         5.24339E-01         1.39779E+03         9.99999E-01         1.54510E+01         1.39814E+03         1.16202E+03         2.36118E+02
+          8.34507E-03         2.40111E-03        -1.98617E-03         5.24335E-01         3.70190E-01         5.24338E-01         1.37288E+03         9.99999E-01         1.51775E+01         1.37321E+03         1.14096E+03         2.32250E+02
+          8.34507E-03         2.57094E-03        -2.01270E-03         5.24335E-01         3.80861E-01         5.24338E-01         1.34767E+03         9.99999E-01         1.49017E+01         1.34797E+03         1.11960E+03         2.28377E+02
+          8.34507E-03         2.74077E-03        -2.04104E-03         5.24334E-01         3.91532E-01         5.24338E-01         1.32218E+03         9.99999E-01         1.46243E+01         1.32247E+03         1.09797E+03         2.24503E+02
+          8.34507E-03         2.91059E-03        -2.07119E-03         5.24334E-01         4.02202E-01         5.24338E-01         1.29646E+03         9.99999E-01         1.43455E+01         1.29672E+03         1.07609E+03         2.20633E+02
+          8.34507E-03         3.08042E-03        -2.10315E-03         5.24334E-01         4.12873E-01         5.24338E-01         1.27052E+03         9.99999E-01         1.40656E+01         1.27076E+03         1.05399E+03         2.16774E+02
+          8.34507E-03         3.25025E-03        -2.13693E-03         5.24333E-01         4.23543E-01         5.24338E-01         1.24440E+03         9.99999E-01         1.37852E+01         1.24462E+03         1.03169E+03         2.12929E+02
+          8.34507E-03         3.42008E-03        -2.17251E-03         5.24333E-01         4.34214E-01         5.24338E-01         1.21813E+03         9.99999E-01         1.35045E+01         1.21833E+03         1.00922E+03         2.09104E+02
+          8.34507E-03         3.58990E-03        -2.20991E-03         5.24333E-01         4.44884E-01         5.24338E-01         1.19173E+03         9.99999E-01         1.32239E+01         1.19191E+03         9.86607E+02         2.05302E+02
+          8.34507E-03         3.75973E-03        -2.24912E-03         5.24333E-01         4.55555E-01         5.24337E-01         1.16524E+03         9.99999E-01         1.29437E+01         1.16539E+03         9.63866E+02         2.01528E+02
+          8.34507E-03         3.92956E-03        -2.29015E-03         5.24332E-01         4.66225E-01         5.24337E-01         1.13868E+03         9.99999E-01         1.26644E+01         1.13881E+03         9.41027E+02         1.97787E+02
+          8.34507E-03         4.09939E-03        -2.33298E-03         5.24332E-01         4.76896E-01         5.24337E-01         1.11208E+03         9.99999E-01         1.23861E+01         1.11219E+03         9.18113E+02         1.94080E+02
+          8.34507E-03         4.26921E-03        -2.37763E-03         5.24331E-01         4.87567E-01         5.24337E-01         1.08547E+03         9.99999E-01         1.21093E+01         1.08556E+03         8.95149E+02         1.90412E+02
+          8.34507E-03         4.43904E-03        -2.42409E-03         5.24331E-01         4.98237E-01         5.24337E-01         1.05888E+03         9.99999E-01         1.18342E+01         1.05894E+03         8.72158E+02         1.86785E+02
+          8.34507E-03         4.60887E-03        -2.47236E-03         5.24331E-01         5.08908E-01         5.24337E-01         1.03232E+03         9.99999E-01         1.15612E+01         1.03237E+03         8.49165E+02         1.83201E+02
+          8.34507E-03         4.77869E-03        -2.52245E-03         5.24330E-01         5.19578E-01         5.24336E-01         1.00583E+03         9.99999E-01         1.12905E+01         1.00586E+03         8.26193E+02         1.79665E+02
+          8.34507E-03         4.94852E-03        -2.57434E-03         5.24330E-01         5.30249E-01         5.24336E-01         9.79437E+02         9.99999E-01         1.10225E+01         9.79442E+02         8.03266E+02         1.76176E+02
+          8.34507E-03         5.11835E-03        -2.62805E-03         5.24329E-01         5.40919E-01         5.24336E-01         9.53158E+02         9.99999E-01         1.07573E+01         9.53143E+02         7.80406E+02         1.72737E+02
+          8.34507E-03         5.28818E-03        -2.68357E-03         5.24329E-01         5.51590E-01         5.24336E-01         9.27020E+02         9.99999E-01         1.04952E+01         9.26986E+02         7.57636E+02         1.69350E+02
+          8.34507E-03         5.45800E-03        -2.74091E-03         5.24328E-01         5.62261E-01         5.24336E-01         9.01046E+02         9.99999E-01         1.02365E+01         9.00993E+02         7.34978E+02         1.66015E+02
+          8.34507E-03         5.62783E-03        -2.80005E-03         5.24328E-01         5.72931E-01         5.24335E-01         8.75258E+02         9.99999E-01         9.98133E+00         8.75188E+02         7.12454E+02         1.62733E+02
+          8.34507E-03         5.79766E-03        -2.86101E-03         5.24327E-01         5.83602E-01         5.24335E-01         8.49680E+02         9.99999E-01         9.72997E+00         8.49591E+02         6.90086E+02         1.59506E+02
+          8.34507E-03         5.96749E-03        -2.92378E-03         5.24327E-01         5.94272E-01         5.24335E-01         8.24331E+02         9.99999E-01         9.48259E+00         8.24226E+02         6.67893E+02         1.56333E+02
+          8.34507E-03         6.13731E-03        -2.98836E-03         5.24326E-01         6.04943E-01         5.24335E-01         7.99232E+02         9.99999E-01         9.23936E+00         7.99111E+02         6.45896E+02         1.53215E+02
+          8.34507E-03         6.30714E-03        -3.05475E-03         5.24326E-01         6.15613E-01         5.24335E-01         7.74403E+02         9.99999E-01         9.00045E+00         7.74266E+02         6.24115E+02         1.50151E+02
+          8.34507E-03         6.47697E-03        -3.12296E-03         5.24325E-01         6.26284E-01         5.24335E-01         7.49862E+02         9.99999E-01         8.76602E+00         7.49710E+02         6.02569E+02         1.47141E+02
+          8.34507E-03         6.64680E-03        -3.19298E-03         5.24325E-01         6.36955E-01         5.24334E-01         7.25628E+02         9.99999E-01         8.53619E+00         7.25462E+02         5.81276E+02         1.44186E+02
+          8.34507E-03         6.81662E-03        -3.26481E-03         5.24324E-01         6.47625E-01         5.24334E-01         7.01717E+02         9.99999E-01         8.31108E+00         7.01537E+02         5.60254E+02         1.41284E+02
+          8.34507E-03         6.98645E-03        -3.33845E-03         5.24323E-01         6.58296E-01         5.24334E-01         6.78146E+02         9.99999E-01         8.09081E+00         6.77953E+02         5.39520E+02         1.38434E+02
+          8.34507E-03         7.15628E-03        -3.41390E-03         5.24323E-01         6.68966E-01         5.24334E-01         6.54930E+02         9.99999E-01         7.87547E+00         6.54725E+02         5.19090E+02         1.35635E+02
+          8.34507E-03         7.32611E-03        -3.49117E-03         5.24322E-01         6.79637E-01         5.24334E-01         6.32084E+02         9.99999E-01         7.66513E+00         6.31868E+02         4.98980E+02         1.32888E+02
+          8.34507E-03         7.49593E-03        -3.57025E-03         5.24322E-01         6.90307E-01         5.24334E-01         6.09621E+02         9.99999E-01         7.45985E+00         6.09394E+02         4.79205E+02         1.30189E+02
+          8.34507E-03         7.66576E-03        -3.65114E-03         5.24321E-01         7.00978E-01         5.24334E-01         5.87555E+02         9.99999E-01         7.25969E+00         5.87317E+02         4.59779E+02         1.27539E+02
+          8.34507E-03         7.83559E-03        -3.73384E-03         5.24320E-01         7.11649E-01         5.24333E-01         5.65896E+02         9.99999E-01         7.06469E+00         5.65650E+02         4.40715E+02         1.24935E+02
+          8.34507E-03         8.00542E-03        -3.81836E-03         5.24319E-01         7.22319E-01         5.24333E-01         5.44657E+02         9.99999E-01         6.87487E+00         5.44402E+02         4.22025E+02         1.22377E+02
+          8.34507E-03         8.17524E-03        -3.90469E-03         5.24319E-01         7.32990E-01         5.24333E-01         5.23847E+02         9.99999E-01         6.69024E+00         5.23585E+02         4.03723E+02         1.19862E+02
+          8.34507E-03         8.34507E-03        -3.99283E-03         5.24318E-01         7.43660E-01         5.24333E-01         5.03476E+02         9.99999E-01         6.51080E+00         5.03207E+02         3.85817E+02         1.17390E+02
+          8.34507E-03         8.51490E-03        -4.08278E-03         5.24317E-01         7.54331E-01         5.24333E-01         4.83553E+02         9.99999E-01         6.33655E+00         4.83278E+02         3.68318E+02         1.14959E+02
+          8.34507E-03         8.68473E-03        -4.17455E-03         5.24316E-01         7.65001E-01         5.24333E-01         4.64084E+02         9.99999E-01         6.16745E+00         4.63804E+02         3.51236E+02         1.12568E+02
+          8.34507E-03         8.85455E-03        -4.26813E-03         5.24316E-01         7.75672E-01         5.24333E-01         4.45078E+02         9.99999E-01         6.00349E+00         4.44793E+02         3.34579E+02         1.10214E+02
+          8.34507E-03         9.02438E-03        -4.36351E-03         5.24315E-01         7.86343E-01         5.24333E-01         4.26539E+02         9.99999E-01         5.84461E+00         4.26251E+02         3.18354E+02         1.07897E+02
+          8.34507E-03         9.19421E-03        -4.46072E-03         5.24314E-01         7.97013E-01         5.24333E-01         4.08474E+02         9.99999E-01         5.69078E+00         4.08183E+02         3.02568E+02         1.05615E+02
+          8.34507E-03         9.36403E-03        -4.55973E-03         5.24313E-01         8.07684E-01         5.24333E-01         3.90886E+02         9.99999E-01         5.54193E+00         3.90593E+02         2.87226E+02         1.03367E+02
+          8.34507E-03         9.53386E-03        -4.66056E-03         5.24312E-01         8.18354E-01         5.24333E-01         3.73780E+02         9.99999E-01         5.39799E+00         3.73486E+02         2.72334E+02         1.01151E+02
+          8.34507E-03         9.70369E-03        -4.76320E-03         5.24312E-01         8.29025E-01         5.24333E-01         3.57158E+02         9.99999E-01         5.25891E+00         3.56863E+02         2.57896E+02         9.89668E+01
+          8.34507E-03         9.87352E-03        -4.86765E-03         5.24311E-01         8.39695E-01         5.24333E-01         3.41022E+02         9.99999E-01         5.12460E+00         3.40727E+02         2.43914E+02         9.68127E+01
+          8.34507E-03         1.00433E-02        -4.97391E-03         5.24310E-01         8.50366E-01         5.24333E-01         3.25373E+02         9.99999E-01         4.99497E+00         3.25080E+02         2.30392E+02         9.46877E+01
+          8.34507E-03         1.02132E-02        -5.08199E-03         5.24309E-01         8.61037E-01         5.24334E-01         3.10213E+02         9.99999E-01         4.86996E+00         3.09921E+02         2.17330E+02         9.25909E+01
+          8.34507E-03         1.03830E-02        -5.19188E-03         5.24308E-01         8.71707E-01         5.24334E-01         2.95541E+02         9.99999E-01         4.74945E+00         2.95252E+02         2.04730E+02         9.05215E+01
+          8.34507E-03         1.05528E-02        -5.30358E-03         5.24307E-01         8.82378E-01         5.24334E-01         2.81357E+02         9.99999E-01         4.63338E+00         2.81071E+02         1.92592E+02         8.84788E+01
+          8.34507E-03         1.07227E-02        -5.41709E-03         5.24306E-01         8.93048E-01         5.24334E-01         2.67658E+02         9.99999E-01         4.52163E+00         2.67376E+02         1.80914E+02         8.64621E+01
+          8.34507E-03         1.08925E-02        -5.53242E-03         5.24305E-01         9.03719E-01         5.24334E-01         2.54444E+02         9.99999E-01         4.41411E+00         2.54166E+02         1.69695E+02         8.44709E+01
+          8.34507E-03         1.10623E-02        -5.64955E-03         5.24304E-01         9.14389E-01         5.24335E-01         2.41711E+02         9.99999E-01         4.31074E+00         2.41438E+02         1.58933E+02         8.25050E+01
+          8.34507E-03         1.12321E-02        -5.76850E-03         5.24303E-01         9.25060E-01         5.24335E-01         2.29456E+02         9.99999E-01         4.21140E+00         2.29189E+02         1.48625E+02         8.05640E+01
+          8.34507E-03         1.14020E-02        -5.88927E-03         5.24302E-01         9.35731E-01         5.24335E-01         2.17675E+02         9.99999E-01         4.11601E+00         2.17414E+02         1.38766E+02         7.86478E+01
+          8.34507E-03         1.15718E-02        -6.01184E-03         5.24301E-01         9.46401E-01         5.24336E-01         2.06364E+02         9.99999E-01         4.02447E+00         2.06110E+02         1.29354E+02         7.67564E+01
+          8.34507E-03         1.17416E-02        -6.13623E-03         5.24300E-01         9.57072E-01         5.24336E-01         1.95517E+02         9.99999E-01         3.93668E+00         1.95271E+02         1.20381E+02         7.48898E+01
+          8.34507E-03         1.19114E-02        -6.26243E-03         5.24299E-01         9.67742E-01         5.24336E-01         1.85131E+02         9.99999E-01         3.85254E+00         1.84892E+02         1.11843E+02         7.30484E+01
+          8.34507E-03         1.20813E-02        -6.39044E-03         5.24298E-01         9.78413E-01         5.24337E-01         1.75197E+02         9.99999E-01         3.77198E+00         1.74967E+02         1.03734E+02         7.12324E+01
+          8.34507E-03         1.22511E-02        -6.52027E-03         5.24297E-01         9.89083E-01         5.24337E-01         1.65710E+02         9.99999E-01         3.69488E+00         1.65489E+02         9.60465E+01         6.94423E+01
+          8.34507E-03         1.24209E-02        -6.65191E-03         5.24296E-01         9.99754E-01         5.24338E-01         1.56664E+02         9.99999E-01         3.62117E+00         1.56451E+02         8.87729E+01         6.76786E+01
+          8.34507E-03         1.25908E-02        -6.78536E-03         5.24295E-01         1.01042E+00         5.24339E-01         1.48050E+02         9.99999E-01         3.55076E+00         1.47847E+02         8.19054E+01         6.59418E+01
+          8.34507E-03         1.27606E-02        -6.92062E-03         5.24294E-01         1.02110E+00         5.24339E-01         1.39861E+02         9.99999E-01         3.48356E+00         1.39668E+02         7.54356E+01         6.42328E+01
+          8.34507E-03         1.29304E-02        -7.05770E-03         5.24292E-01         1.03177E+00         5.24340E-01         1.32090E+02         9.99999E-01         3.41949E+00         1.31907E+02         6.93547E+01         6.25523E+01
+          8.34507E-03         1.31002E-02        -7.19658E-03         5.24291E-01         1.04244E+00         5.24341E-01         1.24726E+02         9.99999E-01         3.35845E+00         1.24554E+02         6.36532E+01         6.09010E+01
+          8.34507E-03         1.32701E-02        -7.33728E-03         5.24290E-01         1.05311E+00         5.24341E-01         1.17763E+02         9.99999E-01         3.30038E+00         1.17602E+02         5.83216E+01         5.92801E+01
+          8.34507E-03         1.34399E-02        -7.47980E-03         5.24289E-01         1.06378E+00         5.24342E-01         1.11190E+02         9.99999E-01         3.24519E+00         1.11040E+02         5.33497E+01         5.76903E+01
+          8.34507E-03         1.36097E-02        -7.62412E-03         5.24288E-01         1.07445E+00         5.24343E-01         1.04999E+02         9.99999E-01         3.19280E+00         1.04860E+02         4.87272E+01         5.61327E+01
+          8.34507E-03         1.37795E-02        -7.77026E-03         5.24286E-01         1.08512E+00         5.24344E-01         9.91797E+01         9.99999E-01         3.14312E+00         9.90519E+01         4.44435E+01         5.46084E+01
+          8.34507E-03         1.39494E-02        -7.91821E-03         5.24285E-01         1.09579E+00         5.24345E-01         9.37223E+01         9.99999E-01         3.09609E+00         9.36059E+01         4.04875E+01         5.31184E+01
+          8.34507E-03         1.41192E-02        -8.06797E-03         5.24284E-01         1.10646E+00         5.24346E-01         8.86168E+01         9.99999E-01         3.05163E+00         8.85119E+01         3.68481E+01         5.16638E+01
+          8.34507E-03         1.42890E-02        -8.21955E-03         5.24283E-01         1.11713E+00         5.24347E-01         8.38529E+01         9.99999E-01         3.00965E+00         8.37596E+01         3.35141E+01         5.02455E+01
+          8.34507E-03         1.44589E-02        -8.37294E-03         5.24281E-01         1.12780E+00         5.24348E-01         7.94204E+01         9.99999E-01         2.97007E+00         7.93387E+01         3.04738E+01         4.88648E+01
+          8.34507E-03         1.46287E-02        -8.52814E-03         5.24280E-01         1.13847E+00         5.24349E-01         7.53085E+01         9.99999E-01         2.93283E+00         7.52385E+01         2.77158E+01         4.75227E+01
+          8.34507E-03         1.47985E-02        -8.68515E-03         5.24279E-01         1.14914E+00         5.24351E-01         7.15067E+01         9.99999E-01         2.89783E+00         7.14482E+01         2.52281E+01         4.62201E+01
+          8.34507E-03         1.49683E-02        -8.84398E-03         5.24277E-01         1.15981E+00         5.24352E-01         6.80042E+01         9.99999E-01         2.86499E+00         6.79572E+01         2.29991E+01         4.49581E+01
+          8.34507E-03         1.51382E-02        -9.00462E-03         5.24276E-01         1.17048E+00         5.24353E-01         6.47900E+01         9.99999E-01         2.83424E+00         6.47545E+01         2.10169E+01         4.37375E+01
+          8.34507E-03         1.53080E-02        -9.16707E-03         5.24275E-01         1.18115E+00         5.24355E-01         6.18534E+01         9.99999E-01         2.80550E+00         6.18291E+01         1.92697E+01         4.25594E+01
+          8.34507E-03         1.54778E-02        -9.33134E-03         5.24273E-01         1.19182E+00         5.24356E-01         5.91832E+01         9.99999E-01         2.77867E+00         5.91701E+01         1.77456E+01         4.14244E+01
+          8.34507E-03         1.56476E-02        -9.49742E-03         5.24272E-01         1.20249E+00         5.24358E-01         5.67686E+01         9.99999E-01         2.75368E+00         5.67664E+01         1.64330E+01         4.03334E+01
+          8.34507E-03         1.58175E-02        -9.66531E-03         5.24271E-01         1.21317E+00         5.24360E-01         5.45986E+01         9.99999E-01         2.73044E+00         5.46071E+01         1.53201E+01         3.92870E+01
+          8.34507E-03         1.59873E-02        -9.83501E-03         5.24269E-01         1.22384E+00         5.24361E-01         5.26621E+01         9.99999E-01         2.70886E+00         5.26811E+01         1.43954E+01         3.82857E+01
+          8.34507E-03         1.61571E-02        -1.00065E-02         5.24268E-01         1.23451E+00         5.24363E-01         5.09483E+01         9.99999E-01         2.68886E+00         5.09775E+01         1.36474E+01         3.73302E+01
+          8.34507E-03         1.63270E-02        -1.01799E-02         5.24266E-01         1.24518E+00         5.24365E-01         4.94462E+01         9.99999E-01         2.67036E+00         4.94854E+01         1.30648E+01         3.64207E+01
+          8.34507E-03         1.64968E-02        -1.03550E-02         5.24265E-01         1.25585E+00         5.24367E-01         4.81452E+01         9.99999E-01         2.65326E+00         4.81940E+01         1.26365E+01         3.55576E+01
+          8.34507E-03         1.66666E-02        -1.05319E-02         5.24263E-01         1.26652E+00         5.24369E-01         4.70344E+01         9.99999E-01         2.63748E+00         4.70926E+01         1.23516E+01         3.47410E+01
+          8.34507E-03         1.68364E-02        -1.07107E-02         5.24262E-01         1.27719E+00         5.24371E-01         4.61032E+01         9.99999E-01         2.62293E+00         4.61704E+01         1.21993E+01         3.39711E+01
+          8.34507E-03         1.70063E-02        -1.08913E-02         5.24260E-01         1.28786E+00         5.24374E-01         4.53413E+01         9.99999E-01         2.60952E+00         4.54171E+01         1.21694E+01         3.32477E+01
+          8.34507E-03         1.71761E-02        -1.10737E-02         5.24259E-01         1.29853E+00         5.24376E-01         4.47381E+01         9.99999E-01         2.59718E+00         4.48222E+01         1.22514E+01         3.25708E+01
+          8.34507E-03         1.73459E-02        -1.12579E-02         5.24257E-01         1.30920E+00         5.24378E-01         4.42836E+01         9.99999E-01         2.58582E+00         4.43755E+01         1.24355E+01         3.19400E+01
+          8.34507E-03         1.75158E-02        -1.14439E-02         5.24256E-01         1.31987E+00         5.24381E-01         4.39677E+01         9.99999E-01         2.57535E+00         4.40670E+01         1.27121E+01         3.13549E+01
+          8.34507E-03         1.76856E-02        -1.16317E-02         5.24254E-01         1.33054E+00         5.24383E-01         4.37806E+01         9.99999E-01         2.56569E+00         4.38869E+01         1.30718E+01         3.08151E+01
+          8.34507E-03         1.78554E-02        -1.18214E-02         5.24253E-01         1.34121E+00         5.24386E-01         4.37125E+01         9.99999E-01         2.55678E+00         4.38255E+01         1.35055E+01         3.03199E+01
+          8.34507E-03         1.80252E-02        -1.20128E-02         5.24251E-01         1.35188E+00         5.24389E-01         4.37541E+01         9.99999E-01         2.54851E+00         4.38732E+01         1.40046E+01         2.98686E+01
+          8.34507E-03         1.81951E-02        -1.22061E-02         5.24249E-01         1.36255E+00         5.24392E-01         4.38962E+01         9.99999E-01         2.54083E+00         4.40209E+01         1.45606E+01         2.94603E+01
+          8.34507E-03         1.83649E-02        -1.24012E-02         5.24248E-01         1.37322E+00         5.24394E-01         4.41297E+01         9.99999E-01         2.53367E+00         4.42596E+01         1.51656E+01         2.90940E+01
+          8.34507E-03         1.85347E-02        -1.25981E-02         5.24246E-01         1.38389E+00         5.24398E-01         4.44458E+01         9.99999E-01         2.52694E+00         4.45805E+01         1.58119E+01         2.87687E+01
+          8.34507E-03         1.87045E-02        -1.27968E-02         5.24245E-01         1.39457E+00         5.24401E-01         4.48361E+01         9.99999E-01         2.52058E+00         4.49751E+01         1.64920E+01         2.84831E+01
+          8.34507E-03         1.88744E-02        -1.29973E-02         5.24243E-01         1.40524E+00         5.24404E-01         4.52923E+01         9.99999E-01         2.51454E+00         4.54351E+01         1.71991E+01         2.82360E+01
+          8.34507E-03         1.90442E-02        -1.31997E-02         5.24241E-01         1.41591E+00         5.24407E-01         4.58064E+01         9.99999E-01         2.50873E+00         4.59525E+01         1.79266E+01         2.80260E+01
+          8.34507E-03         1.92140E-02        -1.34038E-02         5.24239E-01         1.42658E+00         5.24411E-01         4.63706E+01         9.99999E-01         2.50312E+00         4.65197E+01         1.86681E+01         2.78516E+01
+          8.34507E-03         1.93839E-02        -1.36098E-02         5.24238E-01         1.43725E+00         5.24414E-01         4.69776E+01         9.99999E-01         2.49764E+00         4.71291E+01         1.94178E+01         2.77112E+01
+          8.34507E-03         1.95537E-02        -1.38176E-02         5.24236E-01         1.44792E+00         5.24418E-01         4.76202E+01         9.99999E-01         2.49223E+00         4.77736E+01         2.01702E+01         2.76033E+01
+          8.34507E-03         1.97235E-02        -1.40271E-02         5.24234E-01         1.45859E+00         5.24422E-01         4.82915E+01         9.99999E-01         2.48685E+00         4.84463E+01         2.09201E+01         2.75262E+01
+          8.34507E-03         1.98933E-02        -1.42385E-02         5.24232E-01         1.46926E+00         5.24426E-01         4.89850E+01         9.99999E-01         2.48146E+00         4.91408E+01         2.16628E+01         2.74780E+01
+          8.34507E-03         2.00632E-02        -1.44518E-02         5.24231E-01         1.47993E+00         5.24430E-01         4.96943E+01         9.99999E-01         2.47600E+00         4.98506E+01         2.23937E+01         2.74569E+01
+          8.34507E-03         2.02330E-02        -1.46668E-02         5.24229E-01         1.49060E+00         5.24434E-01         5.04136E+01         9.99999E-01         2.47043E+00         5.05699E+01         2.31089E+01         2.74611E+01
+          8.34507E-03         2.04028E-02        -1.48836E-02         5.24227E-01         1.50127E+00         5.24438E-01         5.11371E+01         9.99999E-01         2.46473E+00         5.12931E+01         2.38044E+01         2.74886E+01
+          8.34507E-03         2.05726E-02        -1.51023E-02         5.24225E-01         1.51194E+00         5.24443E-01         5.18595E+01         9.99999E-01         2.45884E+00         5.20146E+01         2.44771E+01         2.75376E+01
+          8.34507E-03         2.07425E-02        -1.53227E-02         5.24223E-01         1.52261E+00         5.24447E-01         5.25757E+01         9.99999E-01         2.45274E+00         5.27296E+01         2.51236E+01         2.76060E+01
+          8.34507E-03         2.09123E-02        -1.55450E-02         5.24222E-01         1.53328E+00         5.24452E-01         5.32810E+01         9.99999E-01         2.44640E+00         5.34333E+01         2.57414E+01         2.76919E+01
+          8.34507E-03         2.10821E-02        -1.57691E-02         5.24220E-01         1.54395E+00         5.24457E-01         5.39709E+01         9.99999E-01         2.43980E+00         5.41212E+01         2.63280E+01         2.77932E+01
+          8.34507E-03         2.12520E-02        -1.59950E-02         5.24218E-01         1.55462E+00         5.24462E-01         5.46414E+01         9.99999E-01         2.43289E+00         5.47893E+01         2.68812E+01         2.79080E+01
+          8.34507E-03         2.14218E-02        -1.62227E-02         5.24216E-01         1.56529E+00         5.24467E-01         5.52885E+01         9.99999E-01         2.42567E+00         5.54336E+01         2.73993E+01         2.80343E+01
+          8.34507E-03         2.15916E-02        -1.64523E-02         5.24214E-01         1.57596E+00         5.24472E-01         5.59088E+01         9.99999E-01         2.41812E+00         5.60507E+01         2.78806E+01         2.81701E+01
+          8.34507E-03         2.17614E-02        -1.66836E-02         5.24212E-01         1.58664E+00         5.24477E-01         5.64990E+01         9.99999E-01         2.41020E+00         5.66374E+01         2.83239E+01         2.83135E+01
+          8.34507E-03         2.19313E-02        -1.69168E-02         5.24210E-01         1.59731E+00         5.24483E-01         5.70561E+01         9.99999E-01         2.40191E+00         5.71907E+01         2.87281E+01         2.84626E+01
+          8.34507E-03         2.21011E-02        -1.71518E-02         5.24208E-01         1.60798E+00         5.24489E-01         5.75775E+01         9.99999E-01         2.39324E+00         5.77080E+01         2.90926E+01         2.86154E+01
+          8.34507E-03         2.22709E-02        -1.73886E-02         5.24206E-01         1.61865E+00         5.24495E-01         5.80608E+01         9.99999E-01         2.38417E+00         5.81869E+01         2.94167E+01         2.87702E+01
+          8.34507E-03         2.24407E-02        -1.76272E-02         5.24204E-01         1.62932E+00         5.24500E-01         5.85040E+01         9.99999E-01         2.37469E+00         5.86254E+01         2.97002E+01         2.89252E+01
+          8.34507E-03         2.26106E-02        -1.78676E-02         5.24202E-01         1.63999E+00         5.24507E-01         5.89051E+01         9.99999E-01         2.36479E+00         5.90216E+01         2.99430E+01         2.90786E+01
+          8.34507E-03         2.27804E-02        -1.81098E-02         5.24200E-01         1.65066E+00         5.24513E-01         5.92627E+01         9.99999E-01         2.35447E+00         5.93740E+01         3.01452E+01         2.92287E+01
+          8.34507E-03         2.29502E-02        -1.83538E-02         5.24198E-01         1.66133E+00         5.24519E-01         5.95754E+01         9.99999E-01         2.34371E+00         5.96813E+01         3.03072E+01         2.93741E+01
+          8.34507E-03         2.31201E-02        -1.85997E-02         5.24196E-01         1.67200E+00         5.24526E-01         5.98422E+01         9.99999E-01         2.33252E+00         5.99425E+01         3.04293E+01         2.95132E+01
+          8.34507E-03         2.32899E-02        -1.88474E-02         5.24194E-01         1.68267E+00         5.24533E-01         6.00622E+01         9.99999E-01         2.32090E+00         6.01567E+01         3.05122E+01         2.96445E+01
+          8.34507E-03         2.34597E-02        -1.90968E-02         5.24192E-01         1.69334E+00         5.24540E-01         6.02348E+01         9.99999E-01         2.30884E+00         6.03234E+01         3.05567E+01         2.97667E+01
+          8.34507E-03         2.36295E-02        -1.93481E-02         5.24190E-01         1.70401E+00         5.24547E-01         6.03597E+01         9.99999E-01         2.29634E+00         6.04423E+01         3.05638E+01         2.98785E+01
+          8.34507E-03         2.37994E-02        -1.96012E-02         5.24188E-01         1.71468E+00         5.24554E-01         6.04368E+01         9.99999E-01         2.28340E+00         6.05132E+01         3.05344E+01         2.99788E+01
+          8.34507E-03         2.39692E-02        -1.98562E-02         5.24186E-01         1.72535E+00         5.24562E-01         6.04661E+01         9.99999E-01         2.27003E+00         6.05362E+01         3.04698E+01         3.00664E+01
+          8.34507E-03         2.41390E-02        -2.01129E-02         5.24183E-01         1.73602E+00         5.24569E-01         6.04479E+01         9.99999E-01         2.25623E+00         6.05116E+01         3.03712E+01         3.01404E+01
+          8.34507E-03         2.43088E-02        -2.03715E-02         5.24181E-01         1.74669E+00         5.24577E-01         6.03825E+01         9.99999E-01         2.24200E+00         6.04398E+01         3.02400E+01         3.01998E+01
+          8.34507E-03         2.44787E-02        -2.06318E-02         5.24179E-01         1.75736E+00         5.24585E-01         6.02706E+01         9.99999E-01         2.22735E+00         6.03215E+01         3.00776E+01         3.02439E+01
+          8.34507E-03         2.46485E-02        -2.08940E-02         5.24177E-01         1.76804E+00         5.24593E-01         6.01130E+01         9.99999E-01         2.21229E+00         6.01574E+01         2.98855E+01         3.02719E+01
+          8.34507E-03         2.48183E-02        -2.11580E-02         5.24175E-01         1.77871E+00         5.24602E-01         5.99107E+01         9.99999E-01         2.19682E+00         5.99485E+01         2.96652E+01         3.02833E+01
+          8.34507E-03         2.49882E-02        -2.14238E-02         5.24173E-01         1.78938E+00         5.24610E-01         5.96646E+01         9.99999E-01         2.18094E+00         5.96960E+01         2.94184E+01         3.02776E+01
+          8.34507E-03         2.51580E-02        -2.16914E-02         5.24170E-01         1.80005E+00         5.24619E-01         5.93760E+01         9.99999E-01         2.16468E+00         5.94009E+01         2.91467E+01         3.02543E+01
+          8.34507E-03         2.53278E-02        -2.19608E-02         5.24168E-01         1.81072E+00         5.24628E-01         5.90462E+01         9.99999E-01         2.14803E+00         5.90648E+01         2.88517E+01         3.02131E+01
+          8.34507E-03         2.54976E-02        -2.22321E-02         5.24166E-01         1.82139E+00         5.24637E-01         5.86767E+01         9.99999E-01         2.13101E+00         5.86889E+01         2.85351E+01         3.01538E+01
+          8.34507E-03         2.56675E-02        -2.25051E-02         5.24163E-01         1.83206E+00         5.24646E-01         5.82690E+01         9.99999E-01         2.11362E+00         5.82750E+01         2.81986E+01         3.00763E+01
+          8.34507E-03         2.58373E-02        -2.27800E-02         5.24161E-01         1.84273E+00         5.24656E-01         5.78248E+01         9.99999E-01         2.09589E+00         5.78246E+01         2.78440E+01         2.99806E+01
+          8.34507E-03         2.60071E-02        -2.30567E-02         5.24159E-01         1.85340E+00         5.24666E-01         5.73457E+01         9.99999E-01         2.07781E+00         5.73394E+01         2.74727E+01         2.98667E+01
+          8.34507E-03         2.61769E-02        -2.33352E-02         5.24157E-01         1.86407E+00         5.24676E-01         5.68335E+01         9.99999E-01         2.05940E+00         5.68213E+01         2.70867E+01         2.97347E+01
+          8.51490E-03         8.72665E-04        -1.91894E-03         5.35007E-01         2.74155E-01         5.35010E-01         1.40347E+03         9.99993E-01         1.40030E+01         1.40388E+03         1.12691E+03         2.76971E+02
+          8.51490E-03         1.04249E-03        -1.92915E-03         5.35007E-01         2.84826E-01         5.35010E-01         1.38461E+03         9.99993E-01         1.38102E+01         1.38501E+03         1.11225E+03         2.72760E+02
+          8.51490E-03         1.21232E-03        -1.94118E-03         5.35006E-01         2.95496E-01         5.35010E-01         1.36528E+03         9.99993E-01         1.36133E+01         1.36567E+03         1.09718E+03         2.68485E+02
+          8.51490E-03         1.38215E-03        -1.95502E-03         5.35006E-01         3.06167E-01         5.35010E-01         1.34551E+03         9.99993E-01         1.34125E+01         1.34588E+03         1.08173E+03         2.64155E+02
+          8.51490E-03         1.55197E-03        -1.97068E-03         5.35006E-01         3.16838E-01         5.35010E-01         1.32533E+03         9.99993E-01         1.32081E+01         1.32569E+03         1.06591E+03         2.59779E+02
+          8.51490E-03         1.72180E-03        -1.98814E-03         5.35006E-01         3.27508E-01         5.35010E-01         1.30476E+03         9.99993E-01         1.30006E+01         1.30510E+03         1.04973E+03         2.55365E+02
+          8.51490E-03         1.89163E-03        -2.00742E-03         5.35006E-01         3.38179E-01         5.35010E-01         1.28382E+03         9.99993E-01         1.27900E+01         1.28414E+03         1.03322E+03         2.50920E+02
+          8.51490E-03         2.06146E-03        -2.02851E-03         5.35006E-01         3.48849E-01         5.35010E-01         1.26254E+03         9.99993E-01         1.25769E+01         1.26285E+03         1.01639E+03         2.46453E+02
+          8.51490E-03         2.23128E-03        -2.05142E-03         5.35005E-01         3.59520E-01         5.35009E-01         1.24095E+03         9.99993E-01         1.23615E+01         1.24124E+03         9.99265E+02         2.41972E+02
+          8.51490E-03         2.40111E-03        -2.07613E-03         5.35005E-01         3.70190E-01         5.35009E-01         1.21907E+03         9.99993E-01         1.21441E+01         1.21934E+03         9.81858E+02         2.37484E+02
+          8.51490E-03         2.57094E-03        -2.10266E-03         5.35005E-01         3.80861E-01         5.35009E-01         1.19693E+03         9.99993E-01         1.19249E+01         1.19719E+03         9.64190E+02         2.32997E+02
+          8.51490E-03         2.74077E-03        -2.13099E-03         5.35005E-01         3.91532E-01         5.35009E-01         1.17455E+03         9.99993E-01         1.17045E+01         1.17480E+03         9.46278E+02         2.28517E+02
+          8.51490E-03         2.91059E-03        -2.16114E-03         5.35005E-01         4.02202E-01         5.35009E-01         1.15197E+03         9.99993E-01         1.14829E+01         1.15219E+03         9.28144E+02         2.24051E+02
+          8.51490E-03         3.08042E-03        -2.19311E-03         5.35004E-01         4.12873E-01         5.35009E-01         1.12920E+03         9.99993E-01         1.12606E+01         1.12941E+03         9.09805E+02         2.19606E+02
+          8.51490E-03         3.25025E-03        -2.22688E-03         5.35004E-01         4.23543E-01         5.35009E-01         1.10628E+03         9.99993E-01         1.10377E+01         1.10647E+03         8.91282E+02         2.15189E+02
+          8.51490E-03         3.42008E-03        -2.26247E-03         5.35004E-01         4.34214E-01         5.35008E-01         1.08322E+03         9.99993E-01         1.08147E+01         1.08340E+03         8.72594E+02         2.10804E+02
+          8.51490E-03         3.58990E-03        -2.29987E-03         5.35003E-01         4.44884E-01         5.35008E-01         1.06006E+03         9.99993E-01         1.05918E+01         1.06022E+03         8.53761E+02         2.06457E+02
+          8.51490E-03         3.75973E-03        -2.33908E-03         5.35003E-01         4.55555E-01         5.35008E-01         1.03681E+03         9.99993E-01         1.03693E+01         1.03696E+03         8.34803E+02         2.02153E+02
+          8.51490E-03         3.92956E-03        -2.38010E-03         5.35003E-01         4.66225E-01         5.35008E-01         1.01351E+03         9.99993E-01         1.01474E+01         1.01364E+03         8.15740E+02         1.97898E+02
+          8.51490E-03         4.09939E-03        -2.42294E-03         5.35002E-01         4.76896E-01         5.35008E-01         9.90174E+02         9.99993E-01         9.92638E+00         9.90287E+02         7.96591E+02         1.93696E+02
+          8.51490E-03         4.26921E-03        -2.46759E-03         5.35002E-01         4.87567E-01         5.35008E-01         9.66829E+02         9.99993E-01         9.70654E+00         9.66926E+02         7.77376E+02         1.89550E+02
+          8.51490E-03         4.43904E-03        -2.51405E-03         5.35002E-01         4.98237E-01         5.35007E-01         9.43498E+02         9.99993E-01         9.48810E+00         9.43580E+02         7.58116E+02         1.85464E+02
+          8.51490E-03         4.60887E-03        -2.56232E-03         5.35001E-01         5.08908E-01         5.35007E-01         9.20204E+02         9.99993E-01         9.27131E+00         9.20270E+02         7.38828E+02         1.81442E+02
+          8.51490E-03         4.77869E-03        -2.61240E-03         5.35001E-01         5.19578E-01         5.35007E-01         8.96969E+02         9.99993E-01         9.05638E+00         8.97020E+02         7.19534E+02         1.77486E+02
+          8.51490E-03         4.94852E-03        -2.66430E-03         5.35000E-01         5.30249E-01         5.35007E-01         8.73815E+02         9.99993E-01         8.84355E+00         8.73851E+02         7.00252E+02         1.73599E+02
+          8.51490E-03         5.11835E-03        -2.71801E-03         5.35000E-01         5.40919E-01         5.35007E-01         8.50763E+02         9.99993E-01         8.63300E+00         8.50784E+02         6.81001E+02         1.69784E+02
+          8.51490E-03         5.28818E-03        -2.77353E-03         5.34999E-01         5.51590E-01         5.35007E-01         8.27834E+02         9.99993E-01         8.42495E+00         8.27841E+02         6.61800E+02         1.66041E+02
+          8.51490E-03         5.45800E-03        -2.83086E-03         5.34999E-01         5.62261E-01         5.35006E-01         8.05047E+02         9.99993E-01         8.21957E+00         8.05041E+02         6.42668E+02         1.62372E+02
+          8.51490E-03         5.62783E-03        -2.89000E-03         5.34998E-01         5.72931E-01         5.35006E-01         7.82423E+02         9.99993E-01         8.01705E+00         7.82403E+02         6.23624E+02         1.58780E+02
+          8.51490E-03         5.79766E-03        -2.95096E-03         5.34998E-01         5.83602E-01         5.35006E-01         7.59980E+02         9.99993E-01         7.81754E+00         7.59947E+02         6.04684E+02         1.55263E+02
+          8.51490E-03         5.96749E-03        -3.01373E-03         5.34997E-01         5.94272E-01         5.35006E-01         7.37736E+02         9.99993E-01         7.62121E+00         7.37690E+02         5.85867E+02         1.51823E+02
+          8.51490E-03         6.13731E-03        -3.07831E-03         5.34997E-01         6.04943E-01         5.35006E-01         7.15709E+02         9.99993E-01         7.42818E+00         7.15650E+02         5.67191E+02         1.48460E+02
+          8.51490E-03         6.30714E-03        -3.14471E-03         5.34996E-01         6.15613E-01         5.35005E-01         6.93914E+02         9.99993E-01         7.23859E+00         6.93844E+02         5.48671E+02         1.45173E+02
+          8.51490E-03         6.47697E-03        -3.21291E-03         5.34996E-01         6.26284E-01         5.35005E-01         6.72369E+02         9.99993E-01         7.05257E+00         6.72287E+02         5.30324E+02         1.41963E+02
+          8.51490E-03         6.64680E-03        -3.28293E-03         5.34995E-01         6.36955E-01         5.35005E-01         6.51088E+02         9.99993E-01         6.87020E+00         6.50995E+02         5.12167E+02         1.38828E+02
+          8.51490E-03         6.81662E-03        -3.35476E-03         5.34994E-01         6.47625E-01         5.35005E-01         6.30086E+02         9.99993E-01         6.69160E+00         6.29982E+02         4.94215E+02         1.35767E+02
+          8.51490E-03         6.98645E-03        -3.42840E-03         5.34994E-01         6.58296E-01         5.35005E-01         6.09376E+02         9.99993E-01         6.51683E+00         6.09263E+02         4.76482E+02         1.32780E+02
+          8.51490E-03         7.15628E-03        -3.50386E-03         5.34993E-01         6.68966E-01         5.35005E-01         5.88972E+02         9.99993E-01         6.34599E+00         5.88849E+02         4.58984E+02         1.29865E+02
+          8.51490E-03         7.32611E-03        -3.58112E-03         5.34992E-01         6.79637E-01         5.35004E-01         5.68887E+02         9.99993E-01         6.17911E+00         5.68755E+02         4.41734E+02         1.27021E+02
+          8.51490E-03         7.49593E-03        -3.66020E-03         5.34992E-01         6.90307E-01         5.35004E-01         5.49131E+02         9.99993E-01         6.01626E+00         5.48990E+02         4.24745E+02         1.24245E+02
+          8.51490E-03         7.66576E-03        -3.74109E-03         5.34991E-01         7.00978E-01         5.35004E-01         5.29715E+02         9.99993E-01         5.85748E+00         5.29566E+02         4.08031E+02         1.21536E+02
+          8.51490E-03         7.83559E-03        -3.82380E-03         5.34990E-01         7.11649E-01         5.35004E-01         5.10650E+02         9.99993E-01         5.70278E+00         5.10494E+02         3.91602E+02         1.18892E+02
+          8.51490E-03         8.00542E-03        -3.90831E-03         5.34990E-01         7.22319E-01         5.35004E-01         4.91945E+02         9.99993E-01         5.55220E+00         4.91782E+02         3.75472E+02         1.16310E+02
+          8.51490E-03         8.17524E-03        -3.99464E-03         5.34989E-01         7.32990E-01         5.35004E-01         4.73608E+02         9.99993E-01         5.40574E+00         4.73439E+02         3.59650E+02         1.13789E+02
+          8.51490E-03         8.34507E-03        -4.08278E-03         5.34988E-01         7.43660E-01         5.35004E-01         4.55648E+02         9.99993E-01         5.26339E+00         4.55473E+02         3.44146E+02         1.11327E+02
+          8.51490E-03         8.51490E-03        -4.17274E-03         5.34987E-01         7.54331E-01         5.35004E-01         4.38072E+02         9.99993E-01         5.12516E+00         4.37891E+02         3.28971E+02         1.08920E+02
+          8.51490E-03         8.68473E-03        -4.26450E-03         5.34987E-01         7.65001E-01         5.35004E-01         4.20885E+02         9.99993E-01         4.99101E+00         4.20700E+02         3.14133E+02         1.06567E+02
+          8.51490E-03         8.85455E-03        -4.35808E-03         5.34986E-01         7.75672E-01         5.35004E-01         4.04095E+02         9.99993E-01         4.86093E+00         4.03906E+02         2.99641E+02         1.04265E+02
+          8.51490E-03         9.02438E-03        -4.45347E-03         5.34985E-01         7.86343E-01         5.35004E-01         3.87706E+02         9.99993E-01         4.73489E+00         3.87513E+02         2.85501E+02         1.02013E+02
+          8.51490E-03         9.19421E-03        -4.55067E-03         5.34984E-01         7.97013E-01         5.35004E-01         3.71722E+02         9.99993E-01         4.61283E+00         3.71526E+02         2.71720E+02         9.98064E+01
+          8.51490E-03         9.36403E-03        -4.64968E-03         5.34983E-01         8.07684E-01         5.35004E-01         3.56147E+02         9.99993E-01         4.49473E+00         3.55949E+02         2.58305E+02         9.76446E+01
+          8.51490E-03         9.53386E-03        -4.75051E-03         5.34982E-01         8.18354E-01         5.35004E-01         3.40985E+02         9.99993E-01         4.38051E+00         3.40785E+02         2.45260E+02         9.55250E+01
+          8.51490E-03         9.70369E-03        -4.85315E-03         5.34982E-01         8.29025E-01         5.35004E-01         3.26237E+02         9.99993E-01         4.27014E+00         3.26036E+02         2.32591E+02         9.34453E+01
+          8.51490E-03         9.87352E-03        -4.95760E-03         5.34981E-01         8.39695E-01         5.35004E-01         3.11906E+02         9.99993E-01         4.16355E+00         3.11704E+02         2.20301E+02         9.14035E+01
+          8.51490E-03         1.00433E-02        -5.06386E-03         5.34980E-01         8.50366E-01         5.35004E-01         2.97993E+02         9.99993E-01         4.06067E+00         2.97791E+02         2.08393E+02         8.93977E+01
+          8.51490E-03         1.02132E-02        -5.17194E-03         5.34979E-01         8.61037E-01         5.35004E-01         2.84498E+02         9.99993E-01         3.96143E+00         2.84296E+02         1.96871E+02         8.74259E+01
+          8.51490E-03         1.03830E-02        -5.28183E-03         5.34978E-01         8.71707E-01         5.35004E-01         2.71422E+02         9.99993E-01         3.86577E+00         2.71221E+02         1.85735E+02         8.54865E+01
+          8.51490E-03         1.05528E-02        -5.39353E-03         5.34977E-01         8.82378E-01         5.35004E-01         2.58763E+02         9.99993E-01         3.77361E+00         2.58564E+02         1.74986E+02         8.35777E+01
+          8.51490E-03         1.07227E-02        -5.50704E-03         5.34976E-01         8.93048E-01         5.35004E-01         2.46522E+02         9.99993E-01         3.68488E+00         2.46325E+02         1.64626E+02         8.16982E+01
+          8.51490E-03         1.08925E-02        -5.62237E-03         5.34975E-01         9.03719E-01         5.35005E-01         2.34696E+02         9.99993E-01         3.59949E+00         2.34501E+02         1.54655E+02         7.98465E+01
+          8.51490E-03         1.10623E-02        -5.73950E-03         5.34974E-01         9.14389E-01         5.35005E-01         2.23283E+02         9.99993E-01         3.51738E+00         2.23091E+02         1.45070E+02         7.80214E+01
+          8.51490E-03         1.12321E-02        -5.85845E-03         5.34973E-01         9.25060E-01         5.35005E-01         2.12281E+02         9.99993E-01         3.43847E+00         2.12093E+02         1.35871E+02         7.62219E+01
+          8.51490E-03         1.14020E-02        -5.97922E-03         5.34972E-01         9.35731E-01         5.35005E-01         2.01687E+02         9.99993E-01         3.36268E+00         2.01502E+02         1.27055E+02         7.44470E+01
+          8.51490E-03         1.15718E-02        -6.10179E-03         5.34971E-01         9.46401E-01         5.35006E-01         1.91497E+02         9.99993E-01         3.28993E+00         1.91316E+02         1.18620E+02         7.26961E+01
+          8.51490E-03         1.17416E-02        -6.22618E-03         5.34970E-01         9.57072E-01         5.35006E-01         1.81707E+02         9.99993E-01         3.22016E+00         1.81531E+02         1.10562E+02         7.09684E+01
+          8.51490E-03         1.19114E-02        -6.35238E-03         5.34969E-01         9.67742E-01         5.35007E-01         1.72313E+02         9.99993E-01         3.15327E+00         1.72141E+02         1.02878E+02         6.92635E+01
+          8.51490E-03         1.20813E-02        -6.48039E-03         5.34968E-01         9.78413E-01         5.35007E-01         1.63310E+02         9.99993E-01         3.08921E+00         1.63144E+02         9.55627E+01         6.75811E+01
+          8.51490E-03         1.22511E-02        -6.61022E-03         5.34967E-01         9.89083E-01         5.35007E-01         1.54693E+02         9.99993E-01         3.02789E+00         1.54532E+02         8.86114E+01         6.59209E+01
+          8.51490E-03         1.24209E-02        -6.74186E-03         5.34966E-01         9.99754E-01         5.35008E-01         1.46456E+02         9.99993E-01         2.96926E+00         1.46302E+02         8.20187E+01         6.42831E+01
+          8.51490E-03         1.25908E-02        -6.87531E-03         5.34964E-01         1.01042E+00         5.35009E-01         1.38594E+02         9.99993E-01         2.91323E+00         1.38446E+02         7.57784E+01         6.26677E+01
+          8.51490E-03         1.27606E-02        -7.01057E-03         5.34963E-01         1.02110E+00         5.35009E-01         1.31101E+02         9.99993E-01         2.85973E+00         1.30959E+02         6.98843E+01         6.10748E+01
+          8.51490E-03         1.29304E-02        -7.14764E-03         5.34962E-01         1.03177E+00         5.35010E-01         1.23969E+02         9.99993E-01         2.80871E+00         1.23834E+02         6.43293E+01         5.95049E+01
+          8.51490E-03         1.31002E-02        -7.28653E-03         5.34961E-01         1.04244E+00         5.35011E-01         1.17193E+02         9.99993E-01         2.76009E+00         1.17065E+02         5.91063E+01         5.79585E+01
+          8.51490E-03         1.32701E-02        -7.42723E-03         5.34960E-01         1.05311E+00         5.35011E-01         1.10764E+02         9.99993E-01         2.71381E+00         1.10644E+02         5.42077E+01         5.64360E+01
+          8.51490E-03         1.34399E-02        -7.56974E-03         5.34958E-01         1.06378E+00         5.35012E-01         1.04677E+02         9.99993E-01         2.66981E+00         1.04563E+02         4.96253E+01         5.49382E+01
+          8.51490E-03         1.36097E-02        -7.71407E-03         5.34957E-01         1.07445E+00         5.35013E-01         9.89224E+01         9.99993E-01         2.62802E+00         9.88168E+01         4.53509E+01         5.34658E+01
+          8.51490E-03         1.37795E-02        -7.86021E-03         5.34956E-01         1.08512E+00         5.35014E-01         9.34936E+01         9.99993E-01         2.58837E+00         9.33957E+01         4.13759E+01         5.20197E+01
+          8.51490E-03         1.39494E-02        -8.00816E-03         5.34955E-01         1.09579E+00         5.35015E-01         8.83822E+01         9.99993E-01         2.55081E+00         8.82922E+01         3.76914E+01         5.06008E+01
+          8.51490E-03         1.41192E-02        -8.15792E-03         5.34953E-01         1.10646E+00         5.35016E-01         8.35803E+01         9.99993E-01         2.51526E+00         8.34982E+01         3.42882E+01         4.92100E+01
+          8.51490E-03         1.42890E-02        -8.30950E-03         5.34952E-01         1.11713E+00         5.35017E-01         7.90794E+01         9.99993E-01         2.48168E+00         7.90053E+01         3.11571E+01         4.78483E+01
+          8.51490E-03         1.44589E-02        -8.46289E-03         5.34951E-01         1.12780E+00         5.35018E-01         7.48711E+01         9.99993E-01         2.44999E+00         7.48051E+01         2.82884E+01         4.65167E+01
+          8.51490E-03         1.46287E-02        -8.61809E-03         5.34950E-01         1.13847E+00         5.35019E-01         7.09468E+01         9.99993E-01         2.42014E+00         7.08889E+01         2.56725E+01         4.52164E+01
+          8.51490E-03         1.47985E-02        -8.77510E-03         5.34948E-01         1.14914E+00         5.35020E-01         6.72977E+01         9.99993E-01         2.39205E+00         6.72480E+01         2.32996E+01         4.39484E+01
+          8.51490E-03         1.49683E-02        -8.93393E-03         5.34947E-01         1.15981E+00         5.35021E-01         6.39151E+01         9.99993E-01         2.36566E+00         6.38735E+01         2.11598E+01         4.27137E+01
+          8.51490E-03         1.51382E-02        -9.09457E-03         5.34946E-01         1.17048E+00         5.35023E-01         6.07901E+01         9.99993E-01         2.34092E+00         6.07565E+01         1.92431E+01         4.15134E+01
+          8.51490E-03         1.53080E-02        -9.25702E-03         5.34944E-01         1.18115E+00         5.35024E-01         5.79136E+01         9.99993E-01         2.31774E+00         5.78881E+01         1.75394E+01         4.03487E+01
+          8.51490E-03         1.54778E-02        -9.42128E-03         5.34943E-01         1.19182E+00         5.35026E-01         5.52767E+01         9.99993E-01         2.29608E+00         5.52591E+01         1.60387E+01         3.92204E+01
+          8.51490E-03         1.56476E-02        -9.58736E-03         5.34941E-01         1.20249E+00         5.35027E-01         5.28703E+01         9.99993E-01         2.27585E+00         5.28605E+01         1.47309E+01         3.81296E+01
+          8.51490E-03         1.58175E-02        -9.75525E-03         5.34940E-01         1.21317E+00         5.35029E-01         5.06853E+01         9.99993E-01         2.25699E+00         5.06831E+01         1.36060E+01         3.70771E+01
+          8.51490E-03         1.59873E-02        -9.92495E-03         5.34938E-01         1.22384E+00         5.35030E-01         4.87125E+01         9.99993E-01         2.23945E+00         4.87179E+01         1.26540E+01         3.60639E+01
+          8.51490E-03         1.61571E-02        -1.00965E-02         5.34937E-01         1.23451E+00         5.35032E-01         4.69430E+01         9.99993E-01         2.22313E+00         4.69558E+01         1.18651E+01         3.50908E+01
+          8.51490E-03         1.63270E-02        -1.02698E-02         5.34935E-01         1.24518E+00         5.35034E-01         4.53676E+01         9.99993E-01         2.20799E+00         4.53876E+01         1.12293E+01         3.41583E+01
+          8.51490E-03         1.64968E-02        -1.04449E-02         5.34934E-01         1.25585E+00         5.35036E-01         4.39772E+01         9.99993E-01         2.19395E+00         4.40043E+01         1.07370E+01         3.32673E+01
+          8.51490E-03         1.66666E-02        -1.06219E-02         5.34933E-01         1.26652E+00         5.35038E-01         4.27630E+01         9.99993E-01         2.18094E+00         4.27969E+01         1.03788E+01         3.24182E+01
+          8.51490E-03         1.68364E-02        -1.08007E-02         5.34931E-01         1.27719E+00         5.35040E-01         4.17159E+01         9.99993E-01         2.16889E+00         4.17565E+01         1.01451E+01         3.16114E+01
+          8.51490E-03         1.70063E-02        -1.09812E-02         5.34929E-01         1.28786E+00         5.35042E-01         4.08272E+01         9.99993E-01         2.15775E+00         4.08741E+01         1.00267E+01         3.08474E+01
+          8.51490E-03         1.71761E-02        -1.11636E-02         5.34928E-01         1.29853E+00         5.35044E-01         4.00879E+01         9.99993E-01         2.14743E+00         4.01410E+01         1.00147E+01         3.01263E+01
+          8.51490E-03         1.73459E-02        -1.13478E-02         5.34926E-01         1.30920E+00         5.35047E-01         3.94896E+01         9.99993E-01         2.13788E+00         3.95485E+01         1.01001E+01         2.94483E+01
+          8.51490E-03         1.75158E-02        -1.15339E-02         5.34925E-01         1.31987E+00         5.35049E-01         3.90235E+01         9.99993E-01         2.12903E+00         3.90880E+01         1.02745E+01         2.88134E+01
+          8.51490E-03         1.76856E-02        -1.17217E-02         5.34923E-01         1.33054E+00         5.35052E-01         3.86813E+01         9.99993E-01         2.12082E+00         3.87511E+01         1.05295E+01         2.82216E+01
+          8.51490E-03         1.78554E-02        -1.19113E-02         5.34922E-01         1.34121E+00         5.35054E-01         3.84546E+01         9.99993E-01         2.11318E+00         3.85294E+01         1.08570E+01         2.76724E+01
+          8.51490E-03         1.80252E-02        -1.21028E-02         5.34920E-01         1.35188E+00         5.35057E-01         3.83352E+01         9.99993E-01         2.10606E+00         3.84148E+01         1.12490E+01         2.71657E+01
+          8.51490E-03         1.81951E-02        -1.22961E-02         5.34918E-01         1.36255E+00         5.35060E-01         3.83153E+01         9.99993E-01         2.09940E+00         3.83992E+01         1.16982E+01         2.67010E+01
+          8.51490E-03         1.83649E-02        -1.24911E-02         5.34917E-01         1.37322E+00         5.35062E-01         3.83869E+01         9.99993E-01         2.09313E+00         3.84749E+01         1.21971E+01         2.62778E+01
+          8.51490E-03         1.85347E-02        -1.26880E-02         5.34915E-01         1.38389E+00         5.35065E-01         3.85422E+01         9.99993E-01         2.08722E+00         3.86341E+01         1.27389E+01         2.58952E+01
+          8.51490E-03         1.87045E-02        -1.28867E-02         5.34913E-01         1.39457E+00         5.35068E-01         3.87740E+01         9.99993E-01         2.08159E+00         3.88692E+01         1.33167E+01         2.55526E+01
+          8.51490E-03         1.88744E-02        -1.30873E-02         5.34912E-01         1.40524E+00         5.35072E-01         3.90747E+01         9.99993E-01         2.07621E+00         3.91731E+01         1.39242E+01         2.52489E+01
+          8.51490E-03         1.90442E-02        -1.32896E-02         5.34910E-01         1.41591E+00         5.35075E-01         3.94374E+01         9.99993E-01         2.07103E+00         3.95386E+01         1.45553E+01         2.49833E+01
+          8.51490E-03         1.92140E-02        -1.34938E-02         5.34908E-01         1.42658E+00         5.35078E-01         3.98551E+01         9.99993E-01         2.06599E+00         3.99587E+01         1.52043E+01         2.47545E+01
+          8.51490E-03         1.93839E-02        -1.36997E-02         5.34906E-01         1.43725E+00         5.35082E-01         4.03212E+01         9.99993E-01         2.06106E+00         4.04269E+01         1.58656E+01         2.45613E+01
+          8.51490E-03         1.95537E-02        -1.39075E-02         5.34905E-01         1.44792E+00         5.35085E-01         4.08291E+01         9.99993E-01         2.05620E+00         4.09366E+01         1.65341E+01         2.44025E+01
+          8.51490E-03         1.97235E-02        -1.41171E-02         5.34903E-01         1.45859E+00         5.35089E-01         4.13726E+01         9.99993E-01         2.05136E+00         4.14816E+01         1.72050E+01         2.42766E+01
+          8.51490E-03         1.98933E-02        -1.43285E-02         5.34901E-01         1.46926E+00         5.35093E-01         4.19458E+01         9.99993E-01         2.04650E+00         4.20559E+01         1.78738E+01         2.41820E+01
+          8.51490E-03         2.00632E-02        -1.45417E-02         5.34899E-01         1.47993E+00         5.35097E-01         4.25427E+01         9.99993E-01         2.04160E+00         4.26536E+01         1.85362E+01         2.41174E+01
+          8.51490E-03         2.02330E-02        -1.47567E-02         5.34897E-01         1.49060E+00         5.35101E-01         4.31580E+01         9.99993E-01         2.03663E+00         4.32693E+01         1.91883E+01         2.40810E+01
+          8.51490E-03         2.04028E-02        -1.49736E-02         5.34895E-01         1.50127E+00         5.35105E-01         4.37862E+01         9.99993E-01         2.03154E+00         4.38977E+01         1.98266E+01         2.40711E+01
+          8.51490E-03         2.05726E-02        -1.51922E-02         5.34894E-01         1.51194E+00         5.35109E-01         4.44223E+01         9.99993E-01         2.02632E+00         4.45337E+01         2.04477E+01         2.40860E+01
+          8.51490E-03         2.07425E-02        -1.54127E-02         5.34892E-01         1.52261E+00         5.35114E-01         4.50616E+01         9.99993E-01         2.02094E+00         4.51725E+01         2.10486E+01         2.41239E+01
+          8.51490E-03         2.09123E-02        -1.56350E-02         5.34890E-01         1.53328E+00         5.35118E-01         4.56994E+01         9.99993E-01         2.01537E+00         4.58095E+01         2.16266E+01         2.41829E+01
+          8.51490E-03         2.10821E-02        -1.58591E-02         5.34888E-01         1.54395E+00         5.35123E-01         4.63315E+01         9.99993E-01         2.00960E+00         4.64406E+01         2.21793E+01         2.42613E+01
+          8.51490E-03         2.12520E-02        -1.60850E-02         5.34886E-01         1.55462E+00         5.35128E-01         4.69538E+01         9.99993E-01         2.00360E+00         4.70615E+01         2.27045E+01         2.43570E+01
+          8.51490E-03         2.14218E-02        -1.63127E-02         5.34884E-01         1.56529E+00         5.35133E-01         4.75625E+01         9.99993E-01         1.99736E+00         4.76686E+01         2.32004E+01         2.44683E+01
+          8.51490E-03         2.15916E-02        -1.65422E-02         5.34882E-01         1.57596E+00         5.35138E-01         4.81540E+01         9.99993E-01         1.99085E+00         4.82583E+01         2.36652E+01         2.45932E+01
+          8.51490E-03         2.17614E-02        -1.67736E-02         5.34880E-01         1.58664E+00         5.35143E-01         4.87251E+01         9.99993E-01         1.98408E+00         4.88273E+01         2.40976E+01         2.47297E+01
+          8.51490E-03         2.19313E-02        -1.70067E-02         5.34878E-01         1.59731E+00         5.35148E-01         4.92728E+01         9.99993E-01         1.97701E+00         4.93726E+01         2.44965E+01         2.48761E+01
+          8.51490E-03         2.21011E-02        -1.72417E-02         5.34876E-01         1.60798E+00         5.35154E-01         4.97942E+01         9.99993E-01         1.96965E+00         4.98914E+01         2.48609E+01         2.50305E+01
+          8.51490E-03         2.22709E-02        -1.74785E-02         5.34874E-01         1.61865E+00         5.35160E-01         5.02867E+01         9.99993E-01         1.96198E+00         5.03812E+01         2.51903E+01         2.51909E+01
+          8.51490E-03         2.24407E-02        -1.77171E-02         5.34872E-01         1.62932E+00         5.35165E-01         5.07481E+01         9.99993E-01         1.95400E+00         5.08395E+01         2.54839E+01         2.53556E+01
+          8.51490E-03         2.26106E-02        -1.79575E-02         5.34870E-01         1.63999E+00         5.35171E-01         5.11763E+01         9.99993E-01         1.94570E+00         5.12645E+01         2.57417E+01         2.55228E+01
+          8.51490E-03         2.27804E-02        -1.81997E-02         5.34868E-01         1.65066E+00         5.35178E-01         5.15694E+01         9.99993E-01         1.93706E+00         5.16542E+01         2.59635E+01         2.56907E+01
+          8.51490E-03         2.29502E-02        -1.84438E-02         5.34866E-01         1.66133E+00         5.35184E-01         5.19258E+01         9.99993E-01         1.92810E+00         5.20071E+01         2.61494E+01         2.58577E+01
+          8.51490E-03         2.31201E-02        -1.86896E-02         5.34864E-01         1.67200E+00         5.35190E-01         5.22442E+01         9.99993E-01         1.91880E+00         5.23218E+01         2.62996E+01         2.60222E+01
+          8.51490E-03         2.32899E-02        -1.89373E-02         5.34862E-01         1.68267E+00         5.35197E-01         5.25234E+01         9.99993E-01         1.90917E+00         5.25971E+01         2.64146E+01         2.61826E+01
+          8.51490E-03         2.34597E-02        -1.91868E-02         5.34860E-01         1.69334E+00         5.35204E-01         5.27624E+01         9.99993E-01         1.89920E+00         5.28322E+01         2.64948E+01         2.63373E+01
+          8.51490E-03         2.36295E-02        -1.94381E-02         5.34857E-01         1.70401E+00         5.35211E-01         5.29605E+01         9.99993E-01         1.88889E+00         5.30261E+01         2.65410E+01         2.64851E+01
+          8.51490E-03         2.37994E-02        -1.96912E-02         5.34855E-01         1.71468E+00         5.35218E-01         5.31172E+01         9.99993E-01         1.87825E+00         5.31786E+01         2.65541E+01         2.66245E+01
+          8.51490E-03         2.39692E-02        -1.99461E-02         5.34853E-01         1.72535E+00         5.35225E-01         5.32320E+01         9.99993E-01         1.86727E+00         5.32891E+01         2.65348E+01         2.67543E+01
+          8.51490E-03         2.41390E-02        -2.02028E-02         5.34851E-01         1.73602E+00         5.35232E-01         5.33048E+01         9.99993E-01         1.85596E+00         5.33576E+01         2.64842E+01         2.68734E+01
+          8.51490E-03         2.43088E-02        -2.04614E-02         5.34849E-01         1.74669E+00         5.35240E-01         5.33357E+01         9.99993E-01         1.84433E+00         5.33840E+01         2.64034E+01         2.69805E+01
+          8.51490E-03         2.44787E-02        -2.07217E-02         5.34846E-01         1.75736E+00         5.35248E-01         5.33247E+01         9.99993E-01         1.83237E+00         5.33686E+01         2.62937E+01         2.70749E+01
+          8.51490E-03         2.46485E-02        -2.09839E-02         5.34844E-01         1.76804E+00         5.35256E-01         5.32724E+01         9.99993E-01         1.82009E+00         5.33117E+01         2.61562E+01         2.71554E+01
+          8.51490E-03         2.48183E-02        -2.12479E-02         5.34842E-01         1.77871E+00         5.35264E-01         5.31790E+01         9.99993E-01         1.80750E+00         5.32138E+01         2.59923E+01         2.72215E+01
+          8.51490E-03         2.49882E-02        -2.15137E-02         5.34840E-01         1.78938E+00         5.35272E-01         5.30454E+01         9.99993E-01         1.79460E+00         5.30756E+01         2.58034E+01         2.72722E+01
+          8.51490E-03         2.51580E-02        -2.17813E-02         5.34837E-01         1.80005E+00         5.35281E-01         5.28722E+01         9.99993E-01         1.78140E+00         5.28979E+01         2.55908E+01         2.73071E+01
+          8.51490E-03         2.53278E-02        -2.20508E-02         5.34835E-01         1.81072E+00         5.35290E-01         5.26604E+01         9.99993E-01         1.76791E+00         5.26815E+01         2.53560E+01         2.73255E+01
+          8.51490E-03         2.54976E-02        -2.23220E-02         5.34833E-01         1.82139E+00         5.35298E-01         5.24110E+01         9.99993E-01         1.75413E+00         5.24276E+01         2.51005E+01         2.73271E+01
+          8.51490E-03         2.56675E-02        -2.25951E-02         5.34831E-01         1.83206E+00         5.35308E-01         5.21251E+01         9.99993E-01         1.74008E+00         5.21372E+01         2.48257E+01         2.73115E+01
+          8.51490E-03         2.58373E-02        -2.28699E-02         5.34828E-01         1.84273E+00         5.35317E-01         5.18040E+01         9.99993E-01         1.72575E+00         5.18117E+01         2.45332E+01         2.72785E+01
+          8.51490E-03         2.60071E-02        -2.31466E-02         5.34826E-01         1.85340E+00         5.35326E-01         5.14489E+01         9.99993E-01         1.71117E+00         5.14523E+01         2.42244E+01         2.72280E+01
+          8.51490E-03         2.61769E-02        -2.34251E-02         5.34823E-01         1.86407E+00         5.35336E-01         5.10614E+01         9.99993E-01         1.69633E+00         5.10605E+01         2.39007E+01         2.71597E+01
+          8.68473E-03         8.72665E-04        -2.01070E-03         5.45677E-01         2.74155E-01         5.45681E-01         1.24670E+03         9.99992E-01         1.11981E+01         1.24702E+03         9.56015E+02         2.91002E+02
+          8.68473E-03         1.04249E-03        -2.02092E-03         5.45677E-01         2.84826E-01         5.45681E-01         1.23000E+03         9.99992E-01         1.10449E+01         1.23031E+03         9.44184E+02         2.86126E+02
+          8.68473E-03         1.21232E-03        -2.03295E-03         5.45677E-01         2.95496E-01         5.45681E-01         1.21290E+03         9.99992E-01         1.08883E+01         1.21319E+03         9.32015E+02         2.81179E+02
+          8.68473E-03         1.38215E-03        -2.04679E-03         5.45677E-01         3.06167E-01         5.45681E-01         1.19541E+03         9.99992E-01         1.07287E+01         1.19569E+03         9.19521E+02         2.76172E+02
+          8.68473E-03         1.55197E-03        -2.06245E-03         5.45677E-01         3.16838E-01         5.45681E-01         1.17755E+03         9.99992E-01         1.05662E+01         1.17783E+03         9.06713E+02         2.71115E+02
+          8.68473E-03         1.72180E-03        -2.07991E-03         5.45677E-01         3.27508E-01         5.45681E-01         1.15936E+03         9.99992E-01         1.04012E+01         1.15962E+03         8.93605E+02         2.66017E+02
+          8.68473E-03         1.89163E-03        -2.09919E-03         5.45676E-01         3.38179E-01         5.45680E-01         1.14084E+03         9.99992E-01         1.02338E+01         1.14110E+03         8.80210E+02         2.60889E+02
+          8.68473E-03         2.06146E-03        -2.12028E-03         5.45676E-01         3.48849E-01         5.45680E-01         1.12204E+03         9.99992E-01         1.00644E+01         1.12228E+03         8.66541E+02         2.55740E+02
+          8.68473E-03         2.23128E-03        -2.14318E-03         5.45676E-01         3.59520E-01         5.45680E-01         1.10296E+03         9.99992E-01         9.89320E+00         1.10319E+03         8.52612E+02         2.50579E+02
+          8.68473E-03         2.40111E-03        -2.16790E-03         5.45676E-01         3.70190E-01         5.45680E-01         1.08363E+03         9.99992E-01         9.72039E+00         1.08385E+03         8.38439E+02         2.45415E+02
+          8.68473E-03         2.57094E-03        -2.19442E-03         5.45676E-01         3.80861E-01         5.45680E-01         1.06408E+03         9.99992E-01         9.54626E+00         1.06429E+03         8.24034E+02         2.40258E+02
+          8.68473E-03         2.74077E-03        -2.22276E-03         5.45675E-01         3.91532E-01         5.45680E-01         1.04433E+03         9.99992E-01         9.37104E+00         1.04453E+03         8.09412E+02         2.35115E+02
+          8.68473E-03         2.91059E-03        -2.25291E-03         5.45675E-01         4.02202E-01         5.45680E-01         1.02440E+03         9.99992E-01         9.19497E+00         1.02459E+03         7.94589E+02         2.29996E+02
+          8.68473E-03         3.08042E-03        -2.28488E-03         5.45675E-01         4.12873E-01         5.45680E-01         1.00431E+03         9.99992E-01         9.01831E+00         1.00449E+03         7.79580E+02         2.24907E+02
+          8.68473E-03         3.25025E-03        -2.31865E-03         5.45675E-01         4.23543E-01         5.45679E-01         9.84093E+02         9.99992E-01         8.84127E+00         9.84255E+02         7.64399E+02         2.19856E+02
+          8.68473E-03         3.42008E-03        -2.35424E-03         5.45674E-01         4.34214E-01         5.45679E-01         9.63763E+02         9.99992E-01         8.66409E+00         9.63913E+02         7.49062E+02         2.14851E+02
+          8.68473E-03         3.58990E-03        -2.39164E-03         5.45674E-01         4.44884E-01         5.45679E-01         9.43344E+02         9.99992E-01         8.48700E+00         9.43482E+02         7.33584E+02         2.09898E+02
+          8.68473E-03         3.75973E-03        -2.43085E-03         5.45674E-01         4.55555E-01         5.45679E-01         9.22858E+02         9.99992E-01         8.31022E+00         9.22985E+02         7.17982E+02         2.05003E+02
+          8.68473E-03         3.92956E-03        -2.47187E-03         5.45673E-01         4.66225E-01         5.45679E-01         9.02328E+02         9.99992E-01         8.13395E+00         9.02443E+02         7.02271E+02         2.00173E+02
+          8.68473E-03         4.09939E-03        -2.51471E-03         5.45673E-01         4.76896E-01         5.45679E-01         8.81774E+02         9.99992E-01         7.95842E+00         8.81877E+02         6.86466E+02         1.95412E+02
+          8.68473E-03         4.26921E-03        -2.55935E-03         5.45672E-01         4.87567E-01         5.45678E-01         8.61216E+02         9.99992E-01         7.78382E+00         8.61309E+02         6.70584E+02         1.90725E+02
+          8.68473E-03         4.43904E-03        -2.60581E-03         5.45672E-01         4.98237E-01         5.45678E-01         8.40676E+02         9.99992E-01         7.61034E+00         8.40757E+02         6.54640E+02         1.86117E+02
+          8.68473E-03         4.60887E-03        -2.65409E-03         5.45672E-01         5.08908E-01         5.45678E-01         8.20173E+02         9.99992E-01         7.43819E+00         8.20243E+02         6.38651E+02         1.81593E+02
+          8.68473E-03         4.77869E-03        -2.70417E-03         5.45671E-01         5.19578E-01         5.45678E-01         7.99727E+02         9.99992E-01         7.26752E+00         7.99786E+02         6.22631E+02         1.77155E+02
+          8.68473E-03         4.94852E-03        -2.75607E-03         5.45671E-01         5.30249E-01         5.45678E-01         7.79356E+02         9.99992E-01         7.09853E+00         7.79404E+02         6.06597E+02         1.72806E+02
+          8.68473E-03         5.11835E-03        -2.80977E-03         5.45670E-01         5.40919E-01         5.45677E-01         7.59079E+02         9.99992E-01         6.93137E+00         7.59116E+02         5.90565E+02         1.68551E+02
+          8.68473E-03         5.28818E-03        -2.86529E-03         5.45670E-01         5.51590E-01         5.45677E-01         7.38913E+02         9.99992E-01         6.76620E+00         7.38939E+02         5.74549E+02         1.64390E+02
+          8.68473E-03         5.45800E-03        -2.92263E-03         5.45669E-01         5.62261E-01         5.45677E-01         7.18876E+02         9.99992E-01         6.60316E+00         7.18892E+02         5.58566E+02         1.60325E+02
+          8.68473E-03         5.62783E-03        -2.98177E-03         5.45669E-01         5.72931E-01         5.45677E-01         6.98984E+02         9.99992E-01         6.44240E+00         6.98990E+02         5.42631E+02         1.56359E+02
+          8.68473E-03         5.79766E-03        -3.04273E-03         5.45668E-01         5.83602E-01         5.45677E-01         6.79254E+02         9.99992E-01         6.28404E+00         6.79250E+02         5.26759E+02         1.52492E+02
+          8.68473E-03         5.96749E-03        -3.10550E-03         5.45668E-01         5.94272E-01         5.45677E-01         6.59701E+02         9.99992E-01         6.12821E+00         6.59687E+02         5.10964E+02         1.48724E+02
+          8.68473E-03         6.13731E-03        -3.17008E-03         5.45667E-01         6.04943E-01         5.45676E-01         6.40339E+02         9.99992E-01         5.97502E+00         6.40316E+02         4.95261E+02         1.45055E+02
+          8.68473E-03         6.30714E-03        -3.23647E-03         5.45667E-01         6.15613E-01         5.45676E-01         6.21183E+02         9.99992E-01         5.82457E+00         6.21151E+02         4.79665E+02         1.41487E+02
+          8.68473E-03         6.47697E-03        -3.30468E-03         5.45666E-01         6.26284E-01         5.45676E-01         6.02246E+02         9.99992E-01         5.67694E+00         6.02206E+02         4.64189E+02         1.38017E+02
+          8.68473E-03         6.64680E-03        -3.37470E-03         5.45665E-01         6.36955E-01         5.45676E-01         5.83542E+02         9.99992E-01         5.53223E+00         5.83494E+02         4.48848E+02         1.34645E+02
+          8.68473E-03         6.81662E-03        -3.44653E-03         5.45665E-01         6.47625E-01         5.45676E-01         5.65082E+02         9.99992E-01         5.39052E+00         5.65026E+02         4.33655E+02         1.31371E+02
+          8.68473E-03         6.98645E-03        -3.52017E-03         5.45664E-01         6.58296E-01         5.45675E-01         5.46879E+02         9.99992E-01         5.25185E+00         5.46814E+02         4.18623E+02         1.28192E+02
+          8.68473E-03         7.15628E-03        -3.59562E-03         5.45663E-01         6.68966E-01         5.45675E-01         5.28942E+02         9.99992E-01         5.11630E+00         5.28870E+02         4.03764E+02         1.25106E+02
+          8.68473E-03         7.32611E-03        -3.67289E-03         5.45663E-01         6.79637E-01         5.45675E-01         5.11283E+02         9.99992E-01         4.98391E+00         5.11204E+02         3.89091E+02         1.22113E+02
+          8.68473E-03         7.49593E-03        -3.75197E-03         5.45662E-01         6.90307E-01         5.45675E-01         4.93910E+02         9.99992E-01         4.85471E+00         4.93825E+02         3.74616E+02         1.19209E+02
+          8.68473E-03         7.66576E-03        -3.83286E-03         5.45661E-01         7.00978E-01         5.45675E-01         4.76834E+02         9.99992E-01         4.72874E+00         4.76742E+02         3.60350E+02         1.16392E+02
+          8.68473E-03         7.83559E-03        -3.91556E-03         5.45661E-01         7.11649E-01         5.45675E-01         4.60061E+02         9.99992E-01         4.60601E+00         4.59964E+02         3.46304E+02         1.13660E+02
+          8.68473E-03         8.00542E-03        -4.00008E-03         5.45660E-01         7.22319E-01         5.45675E-01         4.43601E+02         9.99992E-01         4.48655E+00         4.43498E+02         3.32488E+02         1.11010E+02
+          8.68473E-03         8.17524E-03        -4.08641E-03         5.45659E-01         7.32990E-01         5.45674E-01         4.27460E+02         9.99992E-01         4.37036E+00         4.27352E+02         3.18914E+02         1.08438E+02
+          8.68473E-03         8.34507E-03        -4.17455E-03         5.45658E-01         7.43660E-01         5.45674E-01         4.11644E+02         9.99992E-01         4.25743E+00         4.11531E+02         3.05589E+02         1.05942E+02
+          8.68473E-03         8.51490E-03        -4.26450E-03         5.45658E-01         7.54331E-01         5.45674E-01         3.96160E+02         9.99992E-01         4.14777E+00         3.96043E+02         2.92523E+02         1.03520E+02
+          8.68473E-03         8.68473E-03        -4.35627E-03         5.45657E-01         7.65001E-01         5.45674E-01         3.81012E+02         9.99992E-01         4.04134E+00         3.80891E+02         2.79725E+02         1.01167E+02
+          8.68473E-03         8.85455E-03        -4.44984E-03         5.45656E-01         7.75672E-01         5.45674E-01         3.66206E+02         9.99992E-01         3.93814E+00         3.66081E+02         2.67201E+02         9.88800E+01
+          8.68473E-03         9.02438E-03        -4.54523E-03         5.45655E-01         7.86343E-01         5.45674E-01         3.51745E+02         9.99992E-01         3.83814E+00         3.51617E+02         2.54961E+02         9.66567E+01
+          8.68473E-03         9.19421E-03        -4.64243E-03         5.45654E-01         7.97013E-01         5.45674E-01         3.37633E+02         9.99992E-01         3.74130E+00         3.37503E+02         2.43009E+02         9.44936E+01
+          8.68473E-03         9.36403E-03        -4.74145E-03         5.45653E-01         8.07684E-01         5.45674E-01         3.23873E+02         9.99992E-01         3.64758E+00         3.23740E+02         2.31353E+02         9.23873E+01
+          8.68473E-03         9.53386E-03        -4.84227E-03         5.45653E-01         8.18354E-01         5.45674E-01         3.10467E+02         9.99992E-01         3.55696E+00         3.10333E+02         2.19998E+02         9.03348E+01
+          8.68473E-03         9.70369E-03        -4.94491E-03         5.45652E-01         8.29025E-01         5.45674E-01         2.97418E+02         9.99992E-01         3.46937E+00         2.97282E+02         2.08949E+02         8.83329E+01
+          8.68473E-03         9.87352E-03        -5.04936E-03         5.45651E-01         8.39695E-01         5.45674E-01         2.84726E+02         9.99992E-01         3.38477E+00         2.84589E+02         1.98210E+02         8.63788E+01
+          8.68473E-03         1.00433E-02        -5.15563E-03         5.45650E-01         8.50366E-01         5.45674E-01         2.72393E+02         9.99992E-01         3.30312E+00         2.72254E+02         1.87785E+02         8.44694E+01
+          8.68473E-03         1.02132E-02        -5.26370E-03         5.45649E-01         8.61037E-01         5.45674E-01         2.60418E+02         9.99992E-01         3.22434E+00         2.60280E+02         1.77678E+02         8.26020E+01
+          8.68473E-03         1.03830E-02        -5.37359E-03         5.45648E-01         8.71707E-01         5.45674E-01         2.48802E+02         9.99992E-01         3.14840E+00         2.48664E+02         1.67890E+02         8.07738E+01
+          8.68473E-03         1.05528E-02        -5.48529E-03         5.45647E-01         8.82378E-01         5.45675E-01         2.37545E+02         9.99992E-01         3.07523E+00         2.37407E+02         1.58425E+02         7.89824E+01
+          8.68473E-03         1.07227E-02        -5.59880E-03         5.45646E-01         8.93048E-01         5.45675E-01         2.26645E+02         9.99992E-01         3.00478E+00         2.26508E+02         1.49283E+02         7.72252E+01
+          8.68473E-03         1.08925E-02        -5.71413E-03         5.45645E-01         9.03719E-01         5.45675E-01         2.16102E+02         9.99992E-01         2.93697E+00         2.15965E+02         1.40465E+02         7.55002E+01
+          8.68473E-03         1.10623E-02        -5.83127E-03         5.45644E-01         9.14389E-01         5.45675E-01         2.05912E+02         9.99992E-01         2.87176E+00         2.05777E+02         1.31972E+02         7.38051E+01
+          8.68473E-03         1.12321E-02        -5.95022E-03         5.45643E-01         9.25060E-01         5.45675E-01         1.96075E+02         9.99992E-01         2.80908E+00         1.95942E+02         1.23804E+02         7.21380E+01
+          8.68473E-03         1.14020E-02        -6.07098E-03         5.45642E-01         9.35731E-01         5.45676E-01         1.86587E+02         9.99992E-01         2.74886E+00         1.86456E+02         1.15959E+02         7.04972E+01
+          8.68473E-03         1.15718E-02        -6.19355E-03         5.45641E-01         9.46401E-01         5.45676E-01         1.77445E+02         9.99992E-01         2.69106E+00         1.77317E+02         1.08436E+02         6.88811E+01
+          8.68473E-03         1.17416E-02        -6.31794E-03         5.45640E-01         9.57072E-01         5.45676E-01         1.68647E+02         9.99992E-01         2.63561E+00         1.68522E+02         1.01234E+02         6.72884E+01
+          8.68473E-03         1.19114E-02        -6.44414E-03         5.45639E-01         9.67742E-01         5.45677E-01         1.60189E+02         9.99992E-01         2.58244E+00         1.60067E+02         9.43492E+01         6.57178E+01
+          8.68473E-03         1.20813E-02        -6.57215E-03         5.45638E-01         9.78413E-01         5.45677E-01         1.52067E+02         9.99992E-01         2.53151E+00         1.51948E+02         8.77799E+01         6.41683E+01
+          8.68473E-03         1.22511E-02        -6.70198E-03         5.45636E-01         9.89083E-01         5.45678E-01         1.44277E+02         9.99992E-01         2.48275E+00         1.44161E+02         8.15224E+01         6.26390E+01
+          8.68473E-03         1.24209E-02        -6.83362E-03         5.45635E-01         9.99754E-01         5.45678E-01         1.36814E+02         9.99992E-01         2.43611E+00         1.36702E+02         7.55728E+01         6.11293E+01
+          8.68473E-03         1.25908E-02        -6.96707E-03         5.45634E-01         1.01042E+00         5.45679E-01         1.29673E+02         9.99992E-01         2.39154E+00         1.29566E+02         6.99269E+01         5.96387E+01
+          8.68473E-03         1.27606E-02        -7.10233E-03         5.45633E-01         1.02110E+00         5.45679E-01         1.22850E+02         9.99992E-01         2.34897E+00         1.22747E+02         6.45800E+01         5.81669E+01
+          8.68473E-03         1.29304E-02        -7.23940E-03         5.45632E-01         1.03177E+00         5.45680E-01         1.16339E+02         9.99992E-01         2.30835E+00         1.16241E+02         5.95269E+01         5.67137E+01
+          8.68473E-03         1.31002E-02        -7.37829E-03         5.45631E-01         1.04244E+00         5.45680E-01         1.10135E+02         9.99992E-01         2.26963E+00         1.10041E+02         5.47622E+01         5.52791E+01
+          8.68473E-03         1.32701E-02        -7.51899E-03         5.45629E-01         1.05311E+00         5.45681E-01         1.04233E+02         9.99992E-01         2.23277E+00         1.04143E+02         5.02800E+01         5.38632E+01
+          8.68473E-03         1.34399E-02        -7.66150E-03         5.45628E-01         1.06378E+00         5.45682E-01         9.86249E+01         9.99992E-01         2.19769E+00         9.85406E+01         4.60741E+01         5.24665E+01
+          8.68473E-03         1.36097E-02        -7.80583E-03         5.45627E-01         1.07445E+00         5.45683E-01         9.33064E+01         9.99992E-01         2.16437E+00         9.32272E+01         4.21381E+01         5.10891E+01
+          8.68473E-03         1.37795E-02        -7.95197E-03         5.45626E-01         1.08512E+00         5.45684E-01         8.82708E+01         9.99992E-01         2.13274E+00         8.81968E+01         3.84650E+01         4.97318E+01
+          8.68473E-03         1.39494E-02        -8.09992E-03         5.45624E-01         1.09579E+00         5.45684E-01         8.35116E+01         9.99992E-01         2.10275E+00         8.34430E+01         3.50478E+01         4.83952E+01
+          8.68473E-03         1.41192E-02        -8.24968E-03         5.45623E-01         1.10646E+00         5.45685E-01         7.90224E+01         9.99992E-01         2.07435E+00         7.89592E+01         3.18792E+01         4.70800E+01
+          8.68473E-03         1.42890E-02        -8.40126E-03         5.45622E-01         1.11713E+00         5.45686E-01         7.47963E+01         9.99992E-01         2.04750E+00         7.47387E+01         2.89516E+01         4.57871E+01
+          8.68473E-03         1.44589E-02        -8.55464E-03         5.45620E-01         1.12780E+00         5.45687E-01         7.08266E+01         9.99992E-01         2.02214E+00         7.07746E+01         2.62572E+01         4.45174E+01
+          8.68473E-03         1.46287E-02        -8.70985E-03         5.45619E-01         1.13847E+00         5.45689E-01         6.71064E+01         9.99992E-01         1.99822E+00         6.70600E+01         2.37882E+01         4.32719E+01
+          8.68473E-03         1.47985E-02        -8.86686E-03         5.45618E-01         1.14914E+00         5.45690E-01         6.36285E+01         9.99992E-01         1.97570E+00         6.35878E+01         2.15363E+01         4.20516E+01
+          8.68473E-03         1.49683E-02        -9.02568E-03         5.45616E-01         1.15981E+00         5.45691E-01         6.03859E+01         9.99992E-01         1.95451E+00         6.03509E+01         1.94933E+01         4.08576E+01
+          8.68473E-03         1.51382E-02        -9.18632E-03         5.45615E-01         1.17048E+00         5.45692E-01         5.73713E+01         9.99992E-01         1.93461E+00         5.73420E+01         1.76510E+01         3.96910E+01
+          8.68473E-03         1.53080E-02        -9.34878E-03         5.45613E-01         1.18115E+00         5.45694E-01         5.45775E+01         9.99992E-01         1.91594E+00         5.45538E+01         1.60008E+01         3.85530E+01
+          8.68473E-03         1.54778E-02        -9.51304E-03         5.45612E-01         1.19182E+00         5.45695E-01         5.19971E+01         9.99992E-01         1.89845E+00         5.19790E+01         1.45344E+01         3.74446E+01
+          8.68473E-03         1.56476E-02        -9.67912E-03         5.45611E-01         1.20249E+00         5.45696E-01         4.96227E+01         9.99992E-01         1.88209E+00         4.96102E+01         1.32432E+01         3.63670E+01
+          8.68473E-03         1.58175E-02        -9.84701E-03         5.45609E-01         1.21317E+00         5.45698E-01         4.74470E+01         9.99992E-01         1.86681E+00         4.74399E+01         1.21186E+01         3.53213E+01
+          8.68473E-03         1.59873E-02        -1.00167E-02         5.45608E-01         1.22384E+00         5.45700E-01         4.54624E+01         9.99992E-01         1.85255E+00         4.54608E+01         1.11522E+01         3.43086E+01
+          8.68473E-03         1.61571E-02        -1.01882E-02         5.45606E-01         1.23451E+00         5.45701E-01         4.36616E+01         9.99992E-01         1.83926E+00         4.36653E+01         1.03354E+01         3.33299E+01
+          8.68473E-03         1.63270E-02        -1.03616E-02         5.45605E-01         1.24518E+00         5.45703E-01         4.20370E+01         9.99992E-01         1.82688E+00         4.20459E+01         9.65976E+00         3.23862E+01
+          8.68473E-03         1.64968E-02        -1.05367E-02         5.45603E-01         1.25585E+00         5.45705E-01         4.05813E+01         9.99992E-01         1.81536E+00         4.05953E+01         9.11695E+00         3.14783E+01
+          8.68473E-03         1.66666E-02        -1.07136E-02         5.45602E-01         1.26652E+00         5.45707E-01         3.92869E+01         9.99992E-01         1.80465E+00         3.93059E+01         8.69865E+00         3.06072E+01
+          8.68473E-03         1.68364E-02        -1.08924E-02         5.45600E-01         1.27719E+00         5.45709E-01         3.81465E+01         9.99992E-01         1.79469E+00         3.81703E+01         8.39668E+00         2.97736E+01
+          8.68473E-03         1.70063E-02        -1.10730E-02         5.45598E-01         1.28786E+00         5.45711E-01         3.71527E+01         9.99992E-01         1.78543E+00         3.71812E+01         8.20296E+00         2.89782E+01
+          8.68473E-03         1.71761E-02        -1.12554E-02         5.45597E-01         1.29853E+00         5.45713E-01         3.62982E+01         9.99992E-01         1.77681E+00         3.63312E+01         8.10957E+00         2.82216E+01
+          8.68473E-03         1.73459E-02        -1.14396E-02         5.45595E-01         1.30920E+00         5.45715E-01         3.55758E+01         9.99992E-01         1.76880E+00         3.56131E+01         8.10874E+00         2.75043E+01
+          8.68473E-03         1.75158E-02        -1.16256E-02         5.45594E-01         1.31987E+00         5.45718E-01         3.49781E+01         9.99992E-01         1.76133E+00         3.50196E+01         8.19288E+00         2.68267E+01
+          8.68473E-03         1.76856E-02        -1.18134E-02         5.45592E-01         1.33054E+00         5.45720E-01         3.44982E+01         9.99992E-01         1.75435E+00         3.45436E+01         8.35455E+00         2.61891E+01
+          8.68473E-03         1.78554E-02        -1.20031E-02         5.45590E-01         1.34121E+00         5.45722E-01         3.41289E+01         9.99992E-01         1.74783E+00         3.41781E+01         8.58654E+00         2.55916E+01
+          8.68473E-03         1.80252E-02        -1.21945E-02         5.45589E-01         1.35188E+00         5.45725E-01         3.38633E+01         9.99992E-01         1.74170E+00         3.39161E+01         8.88185E+00         2.50342E+01
+          8.68473E-03         1.81951E-02        -1.23878E-02         5.45587E-01         1.36255E+00         5.45728E-01         3.36946E+01         9.99992E-01         1.73593E+00         3.37507E+01         9.23366E+00         2.45170E+01
+          8.68473E-03         1.83649E-02        -1.25829E-02         5.45585E-01         1.37322E+00         5.45730E-01         3.36159E+01         9.99992E-01         1.73047E+00         3.36752E+01         9.63543E+00         2.40398E+01
+          8.68473E-03         1.85347E-02        -1.27798E-02         5.45584E-01         1.38389E+00         5.45733E-01         3.36208E+01         9.99992E-01         1.72528E+00         3.36830E+01         1.00808E+01         2.36021E+01
+          8.68473E-03         1.87045E-02        -1.29785E-02         5.45582E-01         1.39457E+00         5.45736E-01         3.37026E+01         9.99992E-01         1.72032E+00         3.37675E+01         1.05637E+01         2.32038E+01
+          8.68473E-03         1.88744E-02        -1.31790E-02         5.45580E-01         1.40524E+00         5.45739E-01         3.38551E+01         9.99992E-01         1.71554E+00         3.39224E+01         1.10784E+01         2.28441E+01
+          8.68473E-03         1.90442E-02        -1.33814E-02         5.45578E-01         1.41591E+00         5.45742E-01         3.40719E+01         9.99992E-01         1.71091E+00         3.41415E+01         1.16191E+01         2.25224E+01
+          8.68473E-03         1.92140E-02        -1.35855E-02         5.45577E-01         1.42658E+00         5.45746E-01         3.43471E+01         9.99992E-01         1.70640E+00         3.44187E+01         1.21807E+01         2.22380E+01
+          8.68473E-03         1.93839E-02        -1.37915E-02         5.45575E-01         1.43725E+00         5.45749E-01         3.46746E+01         9.99992E-01         1.70198E+00         3.47480E+01         1.27580E+01         2.19900E+01
+          8.68473E-03         1.95537E-02        -1.39992E-02         5.45573E-01         1.44792E+00         5.45753E-01         3.50488E+01         9.99992E-01         1.69759E+00         3.51237E+01         1.33464E+01         2.17773E+01
+          8.68473E-03         1.97235E-02        -1.42088E-02         5.45571E-01         1.45859E+00         5.45756E-01         3.54640E+01         9.99992E-01         1.69323E+00         3.55402E+01         1.39412E+01         2.15990E+01
+          8.68473E-03         1.98933E-02        -1.44202E-02         5.45569E-01         1.46926E+00         5.45760E-01         3.59148E+01         9.99992E-01         1.68886E+00         3.59921E+01         1.45382E+01         2.14538E+01
+          8.68473E-03         2.00632E-02        -1.46334E-02         5.45568E-01         1.47993E+00         5.45764E-01         3.63959E+01         9.99992E-01         1.68445E+00         3.64740E+01         1.51335E+01         2.13405E+01
+          8.68473E-03         2.02330E-02        -1.48485E-02         5.45566E-01         1.49060E+00         5.45768E-01         3.69022E+01         9.99992E-01         1.67998E+00         3.69810E+01         1.57234E+01         2.12576E+01
+          8.68473E-03         2.04028E-02        -1.50653E-02         5.45564E-01         1.50127E+00         5.45772E-01         3.74290E+01         9.99992E-01         1.67542E+00         3.75081E+01         1.63043E+01         2.12038E+01
+          8.68473E-03         2.05726E-02        -1.52840E-02         5.45562E-01         1.51194E+00         5.45776E-01         3.79714E+01         9.99992E-01         1.67076E+00         3.80507E+01         1.68733E+01         2.11775E+01
+          8.68473E-03         2.07425E-02        -1.55044E-02         5.45560E-01         1.52261E+00         5.45780E-01         3.85251E+01         9.99992E-01         1.66597E+00         3.86043E+01         1.74272E+01         2.11771E+01
+          8.68473E-03         2.09123E-02        -1.57267E-02         5.45558E-01         1.53328E+00         5.45785E-01         3.90856E+01         9.99992E-01         1.66104E+00         3.91646E+01         1.79635E+01         2.12010E+01
+          8.68473E-03         2.10821E-02        -1.59508E-02         5.45556E-01         1.54395E+00         5.45789E-01         3.96489E+01         9.99992E-01         1.65594E+00         3.97274E+01         1.84799E+01         2.12476E+01
+          8.68473E-03         2.12520E-02        -1.61767E-02         5.45554E-01         1.55462E+00         5.45794E-01         4.02111E+01         9.99992E-01         1.65067E+00         4.02889E+01         1.89740E+01         2.13149E+01
+          8.68473E-03         2.14218E-02        -1.64044E-02         5.45552E-01         1.56529E+00         5.45799E-01         4.07685E+01         9.99992E-01         1.64521E+00         4.08455E+01         1.94441E+01         2.14014E+01
+          8.68473E-03         2.15916E-02        -1.66340E-02         5.45550E-01         1.57596E+00         5.45804E-01         4.13176E+01         9.99992E-01         1.63954E+00         4.13935E+01         1.98883E+01         2.15052E+01
+          8.68473E-03         2.17614E-02        -1.68653E-02         5.45548E-01         1.58664E+00         5.45809E-01         4.18551E+01         9.99992E-01         1.63367E+00         4.19298E+01         2.03054E+01         2.16244E+01
+          8.68473E-03         2.19313E-02        -1.70985E-02         5.45546E-01         1.59731E+00         5.45814E-01         4.23780E+01         9.99992E-01         1.62756E+00         4.24512E+01         2.06939E+01         2.17573E+01
+          8.68473E-03         2.21011E-02        -1.73334E-02         5.45544E-01         1.60798E+00         5.45819E-01         4.28834E+01         9.99992E-01         1.62123E+00         4.29550E+01         2.10530E+01         2.19020E+01
+          8.68473E-03         2.22709E-02        -1.75702E-02         5.45542E-01         1.61865E+00         5.45825E-01         4.33687E+01         9.99992E-01         1.61466E+00         4.34385E+01         2.13818E+01         2.20567E+01
+          8.68473E-03         2.24407E-02        -1.78088E-02         5.45540E-01         1.62932E+00         5.45831E-01         4.38313E+01         9.99992E-01         1.60784E+00         4.38992E+01         2.16796E+01         2.22196E+01
+          8.68473E-03         2.26106E-02        -1.80492E-02         5.45538E-01         1.63999E+00         5.45836E-01         4.42690E+01         9.99992E-01         1.60078E+00         4.43349E+01         2.19461E+01         2.23888E+01
+          8.68473E-03         2.27804E-02        -1.82915E-02         5.45536E-01         1.65066E+00         5.45842E-01         4.46799E+01         9.99992E-01         1.59346E+00         4.47435E+01         2.21808E+01         2.25627E+01
+          8.68473E-03         2.29502E-02        -1.85355E-02         5.45534E-01         1.66133E+00         5.45848E-01         4.50620E+01         9.99992E-01         1.58588E+00         4.51233E+01         2.23838E+01         2.27395E+01
+          8.68473E-03         2.31201E-02        -1.87814E-02         5.45532E-01         1.67200E+00         5.45855E-01         4.54138E+01         9.99992E-01         1.57805E+00         4.54726E+01         2.25552E+01         2.29175E+01
+          8.68473E-03         2.32899E-02        -1.90290E-02         5.45529E-01         1.68267E+00         5.45861E-01         4.57337E+01         9.99992E-01         1.56995E+00         4.57900E+01         2.26950E+01         2.30950E+01
+          8.68473E-03         2.34597E-02        -1.92785E-02         5.45527E-01         1.69334E+00         5.45868E-01         4.60206E+01         9.99992E-01         1.56160E+00         4.60741E+01         2.28036E+01         2.32705E+01
+          8.68473E-03         2.36295E-02        -1.95298E-02         5.45525E-01         1.70401E+00         5.45874E-01         4.62733E+01         9.99992E-01         1.55298E+00         4.63241E+01         2.28816E+01         2.34425E+01
+          8.68473E-03         2.37994E-02        -1.97829E-02         5.45523E-01         1.71468E+00         5.45881E-01         4.64909E+01         9.99992E-01         1.54411E+00         4.65389E+01         2.29295E+01         2.36094E+01
+          8.68473E-03         2.39692E-02        -2.00378E-02         5.45521E-01         1.72535E+00         5.45888E-01         4.66729E+01         9.99992E-01         1.53498E+00         4.67179E+01         2.29480E+01         2.37700E+01
+          8.68473E-03         2.41390E-02        -2.02946E-02         5.45518E-01         1.73602E+00         5.45896E-01         4.68185E+01         9.99992E-01         1.52559E+00         4.68606E+01         2.29378E+01         2.39228E+01
+          8.68473E-03         2.43088E-02        -2.05531E-02         5.45516E-01         1.74669E+00         5.45903E-01         4.69275E+01         9.99992E-01         1.51595E+00         4.69666E+01         2.28999E+01         2.40666E+01
+          8.68473E-03         2.44787E-02        -2.08135E-02         5.45514E-01         1.75736E+00         5.45911E-01         4.69997E+01         9.99992E-01         1.50606E+00         4.70357E+01         2.28353E+01         2.42004E+01
+          8.68473E-03         2.46485E-02        -2.10757E-02         5.45512E-01         1.76804E+00         5.45919E-01         4.70351E+01         9.99992E-01         1.49593E+00         4.70679E+01         2.27450E+01         2.43229E+01
+          8.68473E-03         2.48183E-02        -2.13397E-02         5.45509E-01         1.77871E+00         5.45927E-01         4.70336E+01         9.99992E-01         1.48556E+00         4.70633E+01         2.26300E+01         2.44333E+01
+          8.68473E-03         2.49882E-02        -2.16055E-02         5.45507E-01         1.78938E+00         5.45935E-01         4.69956E+01         9.99992E-01         1.47496E+00         4.70221E+01         2.24916E+01         2.45305E+01
+          8.68473E-03         2.51580E-02        -2.18731E-02         5.45505E-01         1.80005E+00         5.45943E-01         4.69215E+01         9.99992E-01         1.46412E+00         4.69448E+01         2.23309E+01         2.46139E+01
+          8.68473E-03         2.53278E-02        -2.21425E-02         5.45502E-01         1.81072E+00         5.45952E-01         4.68117E+01         9.99992E-01         1.45307E+00         4.68318E+01         2.21491E+01         2.46827E+01
+          8.68473E-03         2.54976E-02        -2.24138E-02         5.45500E-01         1.82139E+00         5.45960E-01         4.66669E+01         9.99992E-01         1.44179E+00         4.66839E+01         2.19476E+01         2.47362E+01
+          8.68473E-03         2.56675E-02        -2.26868E-02         5.45498E-01         1.83206E+00         5.45969E-01         4.64879E+01         9.99992E-01         1.43031E+00         4.65017E+01         2.17277E+01         2.47740E+01
+          8.68473E-03         2.58373E-02        -2.29617E-02         5.45495E-01         1.84273E+00         5.45978E-01         4.62755E+01         9.99992E-01         1.41862E+00         4.62862E+01         2.14905E+01         2.47956E+01
+          8.68473E-03         2.60071E-02        -2.32384E-02         5.45493E-01         1.85340E+00         5.45988E-01         4.60306E+01         9.99992E-01         1.40673E+00         4.60382E+01         2.12376E+01         2.48006E+01
+          8.68473E-03         2.61769E-02        -2.35169E-02         5.45490E-01         1.86407E+00         5.45997E-01         4.57544E+01         9.99992E-01         1.39466E+00         4.57589E+01         2.09701E+01         2.47888E+01
+          8.85455E-03         8.72665E-04        -2.10428E-03         5.56348E-01         2.74155E-01         5.56352E-01         1.11050E+03         9.99992E-01         8.95632E+00         1.11074E+03         8.03491E+02         3.07249E+02
+          8.85455E-03         1.04249E-03        -2.11450E-03         5.56348E-01         2.84826E-01         5.56352E-01         1.09559E+03         9.99992E-01         8.83449E+00         1.09582E+03         7.94132E+02         3.01688E+02
+          8.85455E-03         1.21232E-03        -2.12653E-03         5.56348E-01         2.95496E-01         5.56352E-01         1.08031E+03         9.99992E-01         8.71005E+00         1.08054E+03         7.84493E+02         2.96048E+02
+          8.85455E-03         1.38215E-03        -2.14037E-03         5.56347E-01         3.06167E-01         5.56352E-01         1.06471E+03         9.99992E-01         8.58317E+00         1.06492E+03         7.74582E+02         2.90342E+02
+          8.85455E-03         1.55197E-03        -2.15603E-03         5.56347E-01         3.16838E-01         5.56351E-01         1.04878E+03         9.99992E-01         8.45406E+00         1.04899E+03         7.64409E+02         2.84580E+02
+          8.85455E-03         1.72180E-03        -2.17349E-03         5.56347E-01         3.27508E-01         5.56351E-01         1.03255E+03         9.99992E-01         8.32292E+00         1.03276E+03         7.53983E+02         2.78775E+02
+          8.85455E-03         1.89163E-03        -2.19277E-03         5.56347E-01         3.38179E-01         5.56351E-01         1.01605E+03         9.99992E-01         8.18994E+00         1.01625E+03         7.43313E+02         2.72938E+02
+          8.85455E-03         2.06146E-03        -2.21386E-03         5.56347E-01         3.48849E-01         5.56351E-01         9.99300E+02         9.99992E-01         8.05532E+00         9.99488E+02         7.32409E+02         2.67079E+02
+          8.85455E-03         2.23128E-03        -2.23676E-03         5.56347E-01         3.59520E-01         5.56351E-01         9.82311E+02         9.99992E-01         7.91926E+00         9.82492E+02         7.21281E+02         2.61211E+02
+          8.85455E-03         2.40111E-03        -2.26148E-03         5.56346E-01         3.70190E-01         5.56351E-01         9.65110E+02         9.99992E-01         7.78195E+00         9.65282E+02         7.09940E+02         2.55343E+02
+          8.85455E-03         2.57094E-03        -2.28800E-03         5.56346E-01         3.80861E-01         5.56351E-01         9.47717E+02         9.99992E-01         7.64360E+00         9.47881E+02         6.98395E+02         2.49486E+02
+          8.85455E-03         2.74077E-03        -2.31634E-03         5.56346E-01         3.91532E-01         5.56351E-01         9.30153E+02         9.99992E-01         7.50440E+00         9.30308E+02         6.86659E+02         2.43649E+02
+          8.85455E-03         2.91059E-03        -2.34649E-03         5.56346E-01         4.02202E-01         5.56351E-01         9.12438E+02         9.99992E-01         7.36453E+00         9.12585E+02         6.74742E+02         2.37843E+02
+          8.85455E-03         3.08042E-03        -2.37846E-03         5.56345E-01         4.12873E-01         5.56350E-01         8.94594E+02         9.99992E-01         7.22419E+00         8.94732E+02         6.62655E+02         2.32077E+02
+          8.85455E-03         3.25025E-03        -2.41223E-03         5.56345E-01         4.23543E-01         5.56350E-01         8.76639E+02         9.99992E-01         7.08357E+00         8.76770E+02         6.50410E+02         2.26359E+02
+          8.85455E-03         3.42008E-03        -2.44782E-03         5.56345E-01         4.34214E-01         5.56350E-01         8.58596E+02         9.99992E-01         6.94284E+00         8.58718E+02         6.38019E+02         2.20699E+02
+          8.85455E-03         3.58990E-03        -2.48522E-03         5.56344E-01         4.44884E-01         5.56350E-01         8.40482E+02         9.99992E-01         6.80219E+00         8.40596E+02         6.25493E+02         2.15103E+02
+          8.85455E-03         3.75973E-03        -2.52443E-03         5.56344E-01         4.55555E-01         5.56350E-01         8.22318E+02         9.99992E-01         6.66180E+00         8.22424E+02         6.12844E+02         2.09579E+02
+          8.85455E-03         3.92956E-03        -2.56545E-03         5.56344E-01         4.66225E-01         5.56350E-01         8.04123E+02         9.99992E-01         6.52183E+00         8.04220E+02         6.00085E+02         2.04135E+02
+          8.85455E-03         4.09939E-03        -2.60829E-03         5.56343E-01         4.76896E-01         5.56349E-01         7.85916E+02         9.99992E-01         6.38244E+00         7.86004E+02         5.87228E+02         1.98776E+02
+          8.85455E-03         4.26921E-03        -2.65293E-03         5.56343E-01         4.87567E-01         5.56349E-01         7.67714E+02         9.99992E-01         6.24381E+00         7.67794E+02         5.74285E+02         1.93509E+02
+          8.85455E-03         4.43904E-03        -2.69939E-03         5.56342E-01         4.98237E-01         5.56349E-01         7.49536E+02         9.99992E-01         6.10608E+00         7.49608E+02         5.61269E+02         1.88339E+02
+          8.85455E-03         4.60887E-03        -2.74767E-03         5.56342E-01         5.08908E-01         5.56349E-01         7.31399E+02         9.99992E-01         5.96940E+00         7.31463E+02         5.48192E+02         1.83271E+02
+          8.85455E-03         4.77869E-03        -2.79775E-03         5.56342E-01         5.19578E-01         5.56349E-01         7.13320E+02         9.99992E-01         5.83392E+00         7.13376E+02         5.35067E+02         1.78309E+02
+          8.85455E-03         4.94852E-03        -2.84965E-03         5.56341E-01         5.30249E-01         5.56348E-01         6.95316E+02         9.99992E-01         5.69977E+00         6.95364E+02         5.21906E+02         1.73458E+02
+          8.85455E-03         5.11835E-03        -2.90335E-03         5.56341E-01         5.40919E-01         5.56348E-01         6.77402E+02         9.99992E-01         5.56709E+00         6.77442E+02         5.08723E+02         1.68719E+02
+          8.85455E-03         5.28818E-03        -2.95887E-03         5.56340E-01         5.51590E-01         5.56348E-01         6.59594E+02         9.99992E-01         5.43599E+00         6.59626E+02         4.95529E+02         1.64097E+02
+          8.85455E-03         5.45800E-03        -3.01621E-03         5.56340E-01         5.62261E-01         5.56348E-01         6.41906E+02         9.99992E-01         5.30660E+00         6.41932E+02         4.82338E+02         1.59594E+02
+          8.85455E-03         5.62783E-03        -3.07535E-03         5.56339E-01         5.72931E-01         5.56348E-01         6.24354E+02         9.99992E-01         5.17902E+00         6.24372E+02         4.69162E+02         1.55210E+02
+          8.85455E-03         5.79766E-03        -3.13631E-03         5.56339E-01         5.83602E-01         5.56347E-01         6.06951E+02         9.99992E-01         5.05336E+00         6.06961E+02         4.56013E+02         1.50948E+02
+          8.85455E-03         5.96749E-03        -3.19908E-03         5.56338E-01         5.94272E-01         5.56347E-01         5.89709E+02         9.99992E-01         4.92971E+00         5.89713E+02         4.42904E+02         1.46809E+02
+          8.85455E-03         6.13731E-03        -3.26366E-03         5.56337E-01         6.04943E-01         5.56347E-01         5.72642E+02         9.99992E-01         4.80816E+00         5.72639E+02         4.29847E+02         1.42792E+02
+          8.85455E-03         6.30714E-03        -3.33005E-03         5.56337E-01         6.15613E-01         5.56347E-01         5.55762E+02         9.99992E-01         4.68879E+00         5.55752E+02         4.16854E+02         1.38898E+02
+          8.85455E-03         6.47697E-03        -3.39826E-03         5.56336E-01         6.26284E-01         5.56347E-01         5.39079E+02         9.99992E-01         4.57167E+00         5.39063E+02         4.03937E+02         1.35126E+02
+          8.85455E-03         6.64680E-03        -3.46827E-03         5.56336E-01         6.36955E-01         5.56346E-01         5.22606E+02         9.99992E-01         4.45687E+00         5.22583E+02         3.91108E+02         1.31475E+02
+          8.85455E-03         6.81662E-03        -3.54010E-03         5.56335E-01         6.47625E-01         5.56346E-01         5.06351E+02         9.99992E-01         4.34445E+00         5.06322E+02         3.78379E+02         1.27944E+02
+          8.85455E-03         6.98645E-03        -3.61375E-03         5.56334E-01         6.58296E-01         5.56346E-01         4.90325E+02         9.99992E-01         4.23446E+00         4.90290E+02         3.65760E+02         1.24530E+02
+          8.85455E-03         7.15628E-03        -3.68920E-03         5.56334E-01         6.68966E-01         5.56346E-01         4.74536E+02         9.99992E-01         4.12694E+00         4.74496E+02         3.53263E+02         1.21233E+02
+          8.85455E-03         7.32611E-03        -3.76647E-03         5.56333E-01         6.79637E-01         5.56346E-01         4.58994E+02         9.99992E-01         4.02192E+00         4.58949E+02         3.40898E+02         1.18050E+02
+          8.85455E-03         7.49593E-03        -3.84555E-03         5.56332E-01         6.90307E-01         5.56346E-01         4.43705E+02         9.99992E-01         3.91945E+00         4.43655E+02         3.28677E+02         1.14978E+02
+          8.85455E-03         7.66576E-03        -3.92644E-03         5.56332E-01         7.00978E-01         5.56345E-01         4.28678E+02         9.99992E-01         3.81953E+00         4.28623E+02         3.16608E+02         1.12015E+02
+          8.85455E-03         7.83559E-03        -4.00914E-03         5.56331E-01         7.11649E-01         5.56345E-01         4.13919E+02         9.99992E-01         3.72220E+00         4.13859E+02         3.04703E+02         1.09156E+02
+          8.85455E-03         8.00542E-03        -4.09366E-03         5.56330E-01         7.22319E-01         5.56345E-01         3.99434E+02         9.99992E-01         3.62745E+00         3.99369E+02         2.92970E+02         1.06399E+02
+          8.85455E-03         8.17524E-03        -4.17998E-03         5.56329E-01         7.32990E-01         5.56345E-01         3.85228E+02         9.99992E-01         3.53530E+00         3.85160E+02         2.81419E+02         1.03741E+02
+          8.85455E-03         8.34507E-03        -4.26813E-03         5.56329E-01         7.43660E-01         5.56345E-01         3.71308E+02         9.99992E-01         3.44573E+00         3.71236E+02         2.70058E+02         1.01177E+02
+          8.85455E-03         8.51490E-03        -4.35808E-03         5.56328E-01         7.54331E-01         5.56345E-01         3.57676E+02         9.99992E-01         3.35875E+00         3.57601E+02         2.58896E+02         9.87045E+01
+          8.85455E-03         8.68473E-03        -4.44984E-03         5.56327E-01         7.65001E-01         5.56345E-01         3.44338E+02         9.99992E-01         3.27434E+00         3.44260E+02         2.47941E+02         9.63187E+01
+          8.85455E-03         8.85455E-03        -4.54342E-03         5.56326E-01         7.75672E-01         5.56345E-01         3.31297E+02         9.99992E-01         3.19249E+00         3.31216E+02         2.37200E+02         9.40159E+01
+          8.85455E-03         9.02438E-03        -4.63881E-03         5.56325E-01         7.86343E-01         5.56345E-01         3.18556E+02         9.99992E-01         3.11317E+00         3.18472E+02         2.26680E+02         9.17921E+01
+          8.85455E-03         9.19421E-03        -4.73601E-03         5.56324E-01         7.97013E-01         5.56345E-01         3.06118E+02         9.99992E-01         3.03635E+00         3.06032E+02         2.16388E+02         8.96433E+01
+          8.85455E-03         9.36403E-03        -4.83502E-03         5.56324E-01         8.07684E-01         5.56345E-01         2.93984E+02         9.99992E-01         2.96201E+00         2.93896E+02         2.06330E+02         8.75654E+01
+          8.85455E-03         9.53386E-03        -4.93585E-03         5.56323E-01         8.18354E-01         5.56345E-01         2.82157E+02         9.99992E-01         2.89012E+00         2.82067E+02         1.96512E+02         8.55543E+01
+          8.85455E-03         9.70369E-03        -5.03849E-03         5.56322E-01         8.29025E-01         5.56345E-01         2.70637E+02         9.99992E-01         2.82063E+00         2.70545E+02         1.86939E+02         8.36062E+01
+          8.85455E-03         9.87352E-03        -5.14294E-03         5.56321E-01         8.39695E-01         5.56345E-01         2.59426E+02         9.99992E-01         2.75352E+00         2.59333E+02         1.77616E+02         8.17170E+01
+          8.85455E-03         1.00433E-02        -5.24920E-03         5.56320E-01         8.50366E-01         5.56345E-01         2.48523E+02         9.99992E-01         2.68873E+00         2.48429E+02         1.68546E+02         7.98830E+01
+          8.85455E-03         1.02132E-02        -5.35728E-03         5.56319E-01         8.61037E-01         5.56345E-01         2.37929E+02         9.99992E-01         2.62622E+00         2.37835E+02         1.59734E+02         7.81004E+01
+          8.85455E-03         1.03830E-02        -5.46717E-03         5.56318E-01         8.71707E-01         5.56345E-01         2.27644E+02         9.99992E-01         2.56595E+00         2.27549E+02         1.51183E+02         7.63657E+01
+          8.85455E-03         1.05528E-02        -5.57887E-03         5.56317E-01         8.82378E-01         5.56345E-01         2.17666E+02         9.99992E-01         2.50788E+00         2.17571E+02         1.42896E+02         7.46752E+01
+          8.85455E-03         1.07227E-02        -5.69238E-03         5.56316E-01         8.93048E-01         5.56345E-01         2.07995E+02         9.99992E-01         2.45196E+00         2.07900E+02         1.34875E+02         7.30258E+01
+          8.85455E-03         1.08925E-02        -5.80770E-03         5.56315E-01         9.03719E-01         5.56345E-01         1.98630E+02         9.99992E-01         2.39813E+00         1.98535E+02         1.27121E+02         7.14142E+01
+          8.85455E-03         1.10623E-02        -5.92484E-03         5.56314E-01         9.14389E-01         5.56345E-01         1.89567E+02         9.99992E-01         2.34636E+00         1.89474E+02         1.19636E+02         6.98375E+01
+          8.85455E-03         1.12321E-02        -6.04379E-03         5.56313E-01         9.25060E-01         5.56346E-01         1.80807E+02         9.99992E-01         2.29659E+00         1.80714E+02         1.12421E+02         6.82929E+01
+          8.85455E-03         1.14020E-02        -6.16455E-03         5.56312E-01         9.35731E-01         5.56346E-01         1.72346E+02         9.99992E-01         2.24877E+00         1.72254E+02         1.05476E+02         6.67777E+01
+          8.85455E-03         1.15718E-02        -6.28713E-03         5.56311E-01         9.46401E-01         5.56346E-01         1.64181E+02         9.99992E-01         2.20286E+00         1.64091E+02         9.88011E+01         6.52896E+01
+          8.85455E-03         1.17416E-02        -6.41152E-03         5.56310E-01         9.57072E-01         5.56347E-01         1.56310E+02         9.99992E-01         2.15881E+00         1.56222E+02         9.23953E+01         6.38264E+01
+          8.85455E-03         1.19114E-02        -6.53772E-03         5.56308E-01         9.67742E-01         5.56347E-01         1.48731E+02         9.99992E-01         2.11658E+00         1.48644E+02         8.62576E+01         6.23861E+01
+          8.85455E-03         1.20813E-02        -6.66573E-03         5.56307E-01         9.78413E-01         5.56347E-01         1.41438E+02         9.99992E-01         2.07611E+00         1.41353E+02         8.03865E+01         6.09668E+01
+          8.85455E-03         1.22511E-02        -6.79555E-03         5.56306E-01         9.89083E-01         5.56348E-01         1.34430E+02         9.99992E-01         2.03736E+00         1.34347E+02         7.47801E+01         5.95671E+01
+          8.85455E-03         1.24209E-02        -6.92719E-03         5.56305E-01         9.99754E-01         5.56348E-01         1.27702E+02         9.99992E-01         2.00028E+00         1.27621E+02         6.94358E+01         5.81856E+01
+          8.85455E-03         1.25908E-02        -7.06064E-03         5.56304E-01         1.01042E+00         5.56349E-01         1.21250E+02         9.99992E-01         1.96484E+00         1.21172E+02         6.43510E+01         5.68212E+01
+          8.85455E-03         1.27606E-02        -7.19590E-03         5.56303E-01         1.02110E+00         5.56349E-01         1.15070E+02         9.99992E-01         1.93099E+00         1.14995E+02         5.95224E+01         5.54728E+01
+          8.85455E-03         1.29304E-02        -7.33298E-03         5.56301E-01         1.03177E+00         5.56350E-01         1.09158E+02         9.99992E-01         1.89867E+00         1.09086E+02         5.49463E+01         5.41399E+01
+          8.85455E-03         1.31002E-02        -7.47186E-03         5.56300E-01         1.04244E+00         5.56350E-01         1.03510E+02         9.99992E-01         1.86786E+00         1.03441E+02         5.06190E+01         5.28218E+01
+          8.85455E-03         1.32701E-02        -7.61256E-03         5.56299E-01         1.05311E+00         5.56351E-01         9.81198E+01         9.99992E-01         1.83852E+00         9.80542E+01         4.65359E+01         5.15182E+01
+          8.85455E-03         1.34399E-02        -7.75508E-03         5.56298E-01         1.06378E+00         5.56352E-01         9.29839E+01         9.99992E-01         1.81059E+00         9.29216E+01         4.26926E+01         5.02291E+01
+          8.85455E-03         1.36097E-02        -7.89940E-03         5.56296E-01         1.07445E+00         5.56353E-01         8.80971E+01         9.99992E-01         1.78403E+00         8.80382E+01         3.90840E+01         4.89542E+01
+          8.85455E-03         1.37795E-02        -8.04554E-03         5.56295E-01         1.08512E+00         5.56353E-01         8.34542E+01         9.99992E-01         1.75882E+00         8.33989E+01         3.57049E+01         4.76940E+01
+          8.85455E-03         1.39494E-02        -8.19349E-03         5.56294E-01         1.09579E+00         5.56354E-01         7.90502E+01         9.99992E-01         1.73490E+00         7.89986E+01         3.25499E+01         4.64487E+01
+          8.85455E-03         1.41192E-02        -8.34325E-03         5.56292E-01         1.10646E+00         5.56355E-01         7.48797E+01         9.99992E-01         1.71223E+00         7.48318E+01         2.96131E+01         4.52187E+01
+          8.85455E-03         1.42890E-02        -8.49483E-03         5.56291E-01         1.11713E+00         5.56356E-01         7.09373E+01         9.99992E-01         1.69079E+00         7.08932E+01         2.68885E+01         4.40047E+01
+          8.85455E-03         1.44589E-02        -8.64822E-03         5.56290E-01         1.12780E+00         5.56357E-01         6.72177E+01         9.99992E-01         1.67051E+00         6.71775E+01         2.43700E+01         4.28075E+01
+          8.85455E-03         1.46287E-02        -8.80342E-03         5.56288E-01         1.13847E+00         5.56358E-01         6.37152E+01         9.99992E-01         1.65137E+00         6.36788E+01         2.20510E+01         4.16278E+01
+          8.85455E-03         1.47985E-02        -8.96043E-03         5.56287E-01         1.14914E+00         5.56359E-01         6.04241E+01         9.99992E-01         1.63332E+00         6.03918E+01         1.99251E+01         4.04667E+01
+          8.85455E-03         1.49683E-02        -9.11926E-03         5.56286E-01         1.15981E+00         5.56360E-01         5.73389E+01         9.99992E-01         1.61633E+00         5.73105E+01         1.79855E+01         3.93250E+01
+          8.85455E-03         1.51382E-02        -9.27989E-03         5.56284E-01         1.17048E+00         5.56362E-01         5.44537E+01         9.99992E-01         1.60034E+00         5.44292E+01         1.62253E+01         3.82039E+01
+          8.85455E-03         1.53080E-02        -9.44235E-03         5.56283E-01         1.18115E+00         5.56363E-01         5.17626E+01         9.99992E-01         1.58532E+00         5.17421E+01         1.46376E+01         3.71045E+01
+          8.85455E-03         1.54778E-02        -9.60661E-03         5.56281E-01         1.19182E+00         5.56364E-01         4.92599E+01         9.99992E-01         1.57123E+00         4.92434E+01         1.32153E+01         3.60281E+01
+          8.85455E-03         1.56476E-02        -9.77269E-03         5.56280E-01         1.20249E+00         5.56366E-01         4.69395E+01         9.99992E-01         1.55802E+00         4.69269E+01         1.19513E+01         3.49757E+01
+          8.85455E-03         1.58175E-02        -9.94058E-03         5.56278E-01         1.21317E+00         5.56367E-01         4.47956E+01         9.99992E-01         1.54565E+00         4.47869E+01         1.08383E+01         3.39486E+01
+          8.85455E-03         1.59873E-02        -1.01103E-02         5.56277E-01         1.22384E+00         5.56369E-01         4.28221E+01         9.99992E-01         1.53407E+00         4.28173E+01         9.86919E+00         3.29481E+01
+          8.85455E-03         1.61571E-02        -1.02818E-02         5.56275E-01         1.23451E+00         5.56370E-01         4.10131E+01         9.99992E-01         1.52326E+00         4.10120E+01         9.03674E+00         3.19753E+01
+          8.85455E-03         1.63270E-02        -1.04551E-02         5.56274E-01         1.24518E+00         5.56372E-01         3.93624E+01         9.99992E-01         1.51315E+00         3.93651E+01         8.33372E+00         3.10314E+01
+          8.85455E-03         1.64968E-02        -1.06303E-02         5.56272E-01         1.25585E+00         5.56374E-01         3.78641E+01         9.99992E-01         1.50372E+00         3.78705E+01         7.75295E+00         3.01175E+01
+          8.85455E-03         1.66666E-02        -1.08072E-02         5.56271E-01         1.26652E+00         5.56376E-01         3.65122E+01         9.99992E-01         1.49491E+00         3.65221E+01         7.28727E+00         2.92349E+01
+          8.85455E-03         1.68364E-02        -1.09860E-02         5.56269E-01         1.27719E+00         5.56378E-01         3.53006E+01         9.99992E-01         1.48669E+00         3.53140E+01         6.92961E+00         2.83844E+01
+          8.85455E-03         1.70063E-02        -1.11666E-02         5.56267E-01         1.28786E+00         5.56380E-01         3.42232E+01         9.99992E-01         1.47901E+00         3.42401E+01         6.67296E+00         2.75671E+01
+          8.85455E-03         1.71761E-02        -1.13490E-02         5.56266E-01         1.29853E+00         5.56382E-01         3.32742E+01         9.99992E-01         1.47183E+00         3.32943E+01         6.51041E+00         2.67839E+01
+          8.85455E-03         1.73459E-02        -1.15332E-02         5.56264E-01         1.30920E+00         5.56384E-01         3.24475E+01         9.99992E-01         1.46512E+00         3.24708E+01         6.43516E+00         2.60357E+01
+          8.85455E-03         1.75158E-02        -1.17192E-02         5.56263E-01         1.31987E+00         5.56386E-01         3.17372E+01         9.99992E-01         1.45882E+00         3.17635E+01         6.44052E+00         2.53230E+01
+          8.85455E-03         1.76856E-02        -1.19070E-02         5.56261E-01         1.33054E+00         5.56388E-01         3.11373E+01         9.99992E-01         1.45291E+00         3.11666E+01         6.51996E+00         2.46467E+01
+          8.85455E-03         1.78554E-02        -1.20967E-02         5.56259E-01         1.34121E+00         5.56391E-01         3.06421E+01         9.99992E-01         1.44735E+00         3.06742E+01         6.66707E+00         2.40071E+01
+          8.85455E-03         1.80252E-02        -1.22881E-02         5.56258E-01         1.35188E+00         5.56393E-01         3.02457E+01         9.99992E-01         1.44209E+00         3.02805E+01         6.87562E+00         2.34048E+01
+          8.85455E-03         1.81951E-02        -1.24814E-02         5.56256E-01         1.36255E+00         5.56396E-01         2.99423E+01         9.99992E-01         1.43711E+00         2.99796E+01         7.13955E+00         2.28401E+01
+          8.85455E-03         1.83649E-02        -1.26765E-02         5.56254E-01         1.37322E+00         5.56399E-01         2.97263E+01         9.99992E-01         1.43236E+00         2.97660E+01         7.45298E+00         2.23130E+01
+          8.85455E-03         1.85347E-02        -1.28734E-02         5.56252E-01         1.38389E+00         5.56401E-01         2.95921E+01         9.99992E-01         1.42782E+00         2.96340E+01         7.81021E+00         2.18238E+01
+          8.85455E-03         1.87045E-02        -1.30721E-02         5.56251E-01         1.39457E+00         5.56404E-01         2.95341E+01         9.99992E-01         1.42346E+00         2.95781E+01         8.20575E+00         2.13724E+01
+          8.85455E-03         1.88744E-02        -1.32726E-02         5.56249E-01         1.40524E+00         5.56407E-01         2.95469E+01         9.99992E-01         1.41923E+00         2.95928E+01         8.63431E+00         2.09585E+01
+          8.85455E-03         1.90442E-02        -1.34749E-02         5.56247E-01         1.41591E+00         5.56410E-01         2.96251E+01         9.99992E-01         1.41512E+00         2.96728E+01         9.09082E+00         2.05819E+01
+          8.85455E-03         1.92140E-02        -1.36791E-02         5.56245E-01         1.42658E+00         5.56413E-01         2.97635E+01         9.99992E-01         1.41109E+00         2.98127E+01         9.57041E+00         2.02423E+01
+          8.85455E-03         1.93839E-02        -1.38850E-02         5.56243E-01         1.43725E+00         5.56417E-01         2.99568E+01         9.99992E-01         1.40712E+00         3.00075E+01         1.00684E+01         1.99390E+01
+          8.85455E-03         1.95537E-02        -1.40928E-02         5.56242E-01         1.44792E+00         5.56420E-01         3.02000E+01         9.99992E-01         1.40319E+00         3.02520E+01         1.05805E+01         1.96714E+01
+          8.85455E-03         1.97235E-02        -1.43024E-02         5.56240E-01         1.45859E+00         5.56424E-01         3.04883E+01         9.99992E-01         1.39926E+00         3.05413E+01         1.11025E+01         1.94388E+01
+          8.85455E-03         1.98933E-02        -1.45138E-02         5.56238E-01         1.46926E+00         5.56427E-01         3.08167E+01         9.99992E-01         1.39533E+00         3.08707E+01         1.16303E+01         1.92404E+01
+          8.85455E-03         2.00632E-02        -1.47270E-02         5.56236E-01         1.47993E+00         5.56431E-01         3.11806E+01         9.99992E-01         1.39135E+00         3.12353E+01         1.21604E+01         1.90750E+01
+          8.85455E-03         2.02330E-02        -1.49420E-02         5.56234E-01         1.49060E+00         5.56435E-01         3.15754E+01         9.99992E-01         1.38733E+00         3.16308E+01         1.26891E+01         1.89417E+01
+          8.85455E-03         2.04028E-02        -1.51589E-02         5.56232E-01         1.50127E+00         5.56439E-01         3.19967E+01         9.99992E-01         1.38324E+00         3.20525E+01         1.32133E+01         1.88392E+01
+          8.85455E-03         2.05726E-02        -1.53775E-02         5.56230E-01         1.51194E+00         5.56443E-01         3.24401E+01         9.99992E-01         1.37906E+00         3.24963E+01         1.37299E+01         1.87664E+01
+          8.85455E-03         2.07425E-02        -1.55980E-02         5.56228E-01         1.52261E+00         5.56447E-01         3.29017E+01         9.99992E-01         1.37477E+00         3.29579E+01         1.42362E+01         1.87218E+01
+          8.85455E-03         2.09123E-02        -1.58203E-02         5.56226E-01         1.53328E+00         5.56451E-01         3.33773E+01         9.99992E-01         1.37037E+00         3.34335E+01         1.47295E+01         1.87041E+01
+          8.85455E-03         2.10821E-02        -1.60444E-02         5.56224E-01         1.54395E+00         5.56456E-01         3.38631E+01         9.99992E-01         1.36584E+00         3.39192E+01         1.52075E+01         1.87117E+01
+          8.85455E-03         2.12520E-02        -1.62703E-02         5.56222E-01         1.55462E+00         5.56460E-01         3.43554E+01         9.99992E-01         1.36117E+00         3.44112E+01         1.56681E+01         1.87431E+01
+          8.85455E-03         2.14218E-02        -1.64980E-02         5.56220E-01         1.56529E+00         5.56465E-01         3.48508E+01         9.99992E-01         1.35635E+00         3.49061E+01         1.61094E+01         1.87967E+01
+          8.85455E-03         2.15916E-02        -1.67275E-02         5.56218E-01         1.57596E+00         5.56470E-01         3.53458E+01         9.99992E-01         1.35137E+00         3.54005E+01         1.65296E+01         1.88709E+01
+          8.85455E-03         2.17614E-02        -1.69589E-02         5.56216E-01         1.58664E+00         5.56475E-01         3.58372E+01         9.99992E-01         1.34622E+00         3.58912E+01         1.69273E+01         1.89639E+01
+          8.85455E-03         2.19313E-02        -1.71920E-02         5.56214E-01         1.59731E+00         5.56480E-01         3.63221E+01         9.99992E-01         1.34089E+00         3.63753E+01         1.73012E+01         1.90740E+01
+          8.85455E-03         2.21011E-02        -1.74270E-02         5.56212E-01         1.60798E+00         5.56485E-01         3.67976E+01         9.99992E-01         1.33538E+00         3.68497E+01         1.76502E+01         1.91995E+01
+          8.85455E-03         2.22709E-02        -1.76638E-02         5.56210E-01         1.61865E+00         5.56490E-01         3.72609E+01         9.99992E-01         1.32968E+00         3.73119E+01         1.79733E+01         1.93386E+01
+          8.85455E-03         2.24407E-02        -1.79024E-02         5.56208E-01         1.62932E+00         5.56496E-01         3.77095E+01         9.99992E-01         1.32379E+00         3.77594E+01         1.82698E+01         1.94895E+01
+          8.85455E-03         2.26106E-02        -1.81428E-02         5.56206E-01         1.63999E+00         5.56502E-01         3.81412E+01         9.99992E-01         1.31770E+00         3.81897E+01         1.85392E+01         1.96505E+01
+          8.85455E-03         2.27804E-02        -1.83850E-02         5.56204E-01         1.65066E+00         5.56507E-01         3.85537E+01         9.99992E-01         1.31142E+00         3.86008E+01         1.87809E+01         1.98198E+01
+          8.85455E-03         2.29502E-02        -1.86291E-02         5.56201E-01         1.66133E+00         5.56513E-01         3.89450E+01         9.99992E-01         1.30493E+00         3.89906E+01         1.89948E+01         1.99957E+01
+          8.85455E-03         2.31201E-02        -1.88749E-02         5.56199E-01         1.67200E+00         5.56519E-01         3.93134E+01         9.99992E-01         1.29824E+00         3.93573E+01         1.91808E+01         2.01765E+01
+          8.85455E-03         2.32899E-02        -1.91226E-02         5.56197E-01         1.68267E+00         5.56526E-01         3.96570E+01         9.99992E-01         1.29135E+00         3.96993E+01         1.93388E+01         2.03604E+01
+          8.85455E-03         2.34597E-02        -1.93721E-02         5.56195E-01         1.69334E+00         5.56532E-01         3.99746E+01         9.99992E-01         1.28425E+00         4.00150E+01         1.94691E+01         2.05459E+01
+          8.85455E-03         2.36295E-02        -1.96234E-02         5.56193E-01         1.70401E+00         5.56539E-01         4.02646E+01         9.99992E-01         1.27695E+00         4.03032E+01         1.95719E+01         2.07312E+01
+          8.85455E-03         2.37994E-02        -1.98765E-02         5.56190E-01         1.71468E+00         5.56545E-01         4.05260E+01         9.99992E-01         1.26945E+00         4.05627E+01         1.96477E+01         2.09150E+01
+          8.85455E-03         2.39692E-02        -2.01314E-02         5.56188E-01         1.72535E+00         5.56552E-01         4.07577E+01         9.99992E-01         1.26176E+00         4.07924E+01         1.96968E+01         2.10956E+01
+          8.85455E-03         2.41390E-02        -2.03881E-02         5.56186E-01         1.73602E+00         5.56559E-01         4.09590E+01         9.99992E-01         1.25386E+00         4.09917E+01         1.97200E+01         2.12717E+01
+          8.85455E-03         2.43088E-02        -2.06467E-02         5.56184E-01         1.74669E+00         5.56567E-01         4.11291E+01         9.99992E-01         1.24577E+00         4.11597E+01         1.97179E+01         2.14418E+01
+          8.85455E-03         2.44787E-02        -2.09070E-02         5.56181E-01         1.75736E+00         5.56574E-01         4.12675E+01         9.99992E-01         1.23749E+00         4.12960E+01         1.96912E+01         2.16047E+01
+          8.85455E-03         2.46485E-02        -2.11692E-02         5.56179E-01         1.76804E+00         5.56582E-01         4.13738E+01         9.99992E-01         1.22902E+00         4.14001E+01         1.96409E+01         2.17592E+01
+          8.85455E-03         2.48183E-02        -2.14332E-02         5.56177E-01         1.77871E+00         5.56589E-01         4.14478E+01         9.99992E-01         1.22037E+00         4.14719E+01         1.95678E+01         2.19041E+01
+          8.85455E-03         2.49882E-02        -2.16990E-02         5.56174E-01         1.78938E+00         5.56597E-01         4.14893E+01         9.99992E-01         1.21154E+00         4.15112E+01         1.94729E+01         2.20384E+01
+          8.85455E-03         2.51580E-02        -2.19666E-02         5.56172E-01         1.80005E+00         5.56605E-01         4.14984E+01         9.99992E-01         1.20253E+00         4.15181E+01         1.93571E+01         2.21610E+01
+          8.85455E-03         2.53278E-02        -2.22361E-02         5.56169E-01         1.81072E+00         5.56614E-01         4.14752E+01         9.99992E-01         1.19336E+00         4.14928E+01         1.92216E+01         2.22711E+01
+          8.85455E-03         2.54976E-02        -2.25073E-02         5.56167E-01         1.82139E+00         5.56622E-01         4.14201E+01         9.99992E-01         1.18402E+00         4.14354E+01         1.90675E+01         2.23679E+01
+          8.85455E-03         2.56675E-02        -2.27804E-02         5.56165E-01         1.83206E+00         5.56631E-01         4.13333E+01         9.99992E-01         1.17452E+00         4.13464E+01         1.88957E+01         2.24507E+01
+          8.85455E-03         2.58373E-02        -2.30552E-02         5.56162E-01         1.84273E+00         5.56640E-01         4.12155E+01         9.99992E-01         1.16487E+00         4.12264E+01         1.87076E+01         2.25188E+01
+          8.85455E-03         2.60071E-02        -2.33319E-02         5.56160E-01         1.85340E+00         5.56649E-01         4.10672E+01         9.99992E-01         1.15507E+00         4.10759E+01         1.85041E+01         2.25718E+01
+          8.85455E-03         2.61769E-02        -2.36104E-02         5.56157E-01         1.86407E+00         5.56658E-01         4.08891E+01         9.99992E-01         1.14512E+00         4.08956E+01         1.82866E+01         2.26091E+01
+          9.02438E-03         8.72665E-04        -2.19968E-03         5.67018E-01         2.74155E-01         5.67023E-01         9.92998E+02         9.99994E-01         7.16276E+00         9.93177E+02         6.68316E+02         3.24861E+02
+          9.02438E-03         1.04249E-03        -2.20990E-03         5.67018E-01         2.84826E-01         5.67023E-01         9.79535E+02         9.99994E-01         7.06599E+00         9.79710E+02         6.61093E+02         3.18617E+02
+          9.02438E-03         1.21232E-03        -2.22192E-03         5.67018E-01         2.95496E-01         5.67022E-01         9.65757E+02         9.99994E-01         6.96714E+00         9.65926E+02         6.53641E+02         3.12286E+02
+          9.02438E-03         1.38215E-03        -2.23577E-03         5.67018E-01         3.06167E-01         5.67022E-01         9.51680E+02         9.99994E-01         6.86637E+00         9.51845E+02         6.45965E+02         3.05880E+02
+          9.02438E-03         1.55197E-03        -2.25142E-03         5.67018E-01         3.16838E-01         5.67022E-01         9.37326E+02         9.99994E-01         6.76382E+00         9.37485E+02         6.38072E+02         2.99414E+02
+          9.02438E-03         1.72180E-03        -2.26889E-03         5.67018E-01         3.27508E-01         5.67022E-01         9.22713E+02         9.99994E-01         6.65967E+00         9.22866E+02         6.29967E+02         2.92899E+02
+          9.02438E-03         1.89163E-03        -2.28816E-03         5.67018E-01         3.38179E-01         5.67022E-01         9.07860E+02         9.99994E-01         6.55405E+00         9.08008E+02         6.21658E+02         2.86350E+02
+          9.02438E-03         2.06146E-03        -2.30925E-03         5.67017E-01         3.48849E-01         5.67022E-01         8.92786E+02         9.99994E-01         6.44715E+00         8.92929E+02         6.13150E+02         2.79779E+02
+          9.02438E-03         2.23128E-03        -2.33216E-03         5.67017E-01         3.59520E-01         5.67022E-01         8.77512E+02         9.99994E-01         6.33910E+00         8.77649E+02         6.04451E+02         2.73198E+02
+          9.02438E-03         2.40111E-03        -2.35687E-03         5.67017E-01         3.70190E-01         5.67022E-01         8.62056E+02         9.99994E-01         6.23008E+00         8.62188E+02         5.95567E+02         2.66620E+02
+          9.02438E-03         2.57094E-03        -2.38340E-03         5.67017E-01         3.80861E-01         5.67022E-01         8.46438E+02         9.99994E-01         6.12022E+00         8.46563E+02         5.86507E+02         2.60056E+02
+          9.02438E-03         2.74077E-03        -2.41174E-03         5.67016E-01         3.91532E-01         5.67022E-01         8.30676E+02         9.99994E-01         6.00970E+00         8.30796E+02         5.77278E+02         2.53518E+02
+          9.02438E-03         2.91059E-03        -2.44189E-03         5.67016E-01         4.02202E-01         5.67021E-01         8.14790E+02         9.99994E-01         5.89865E+00         8.14904E+02         5.67887E+02         2.47017E+02
+          9.02438E-03         3.08042E-03        -2.47385E-03         5.67016E-01         4.12873E-01         5.67021E-01         7.98798E+02         9.99994E-01         5.78724E+00         7.98906E+02         5.58343E+02         2.40563E+02
+          9.02438E-03         3.25025E-03        -2.50762E-03         5.67016E-01         4.23543E-01         5.67021E-01         7.82718E+02         9.99994E-01         5.67561E+00         7.82821E+02         5.48654E+02         2.34167E+02
+          9.02438E-03         3.42008E-03        -2.54321E-03         5.67015E-01         4.34214E-01         5.67021E-01         7.66570E+02         9.99994E-01         5.56390E+00         7.66666E+02         5.38829E+02         2.27838E+02
+          9.02438E-03         3.58990E-03        -2.58061E-03         5.67015E-01         4.44884E-01         5.67021E-01         7.50370E+02         9.99994E-01         5.45227E+00         7.50460E+02         5.28875E+02         2.21585E+02
+          9.02438E-03         3.75973E-03        -2.61982E-03         5.67015E-01         4.55555E-01         5.67021E-01         7.34137E+02         9.99994E-01         5.34084E+00         7.34221E+02         5.18803E+02         2.15418E+02
+          9.02438E-03         3.92956E-03        -2.66084E-03         5.67014E-01         4.66225E-01         5.67020E-01         7.17887E+02         9.99994E-01         5.22975E+00         7.17965E+02         5.08622E+02         2.09343E+02
+          9.02438E-03         4.09939E-03        -2.70368E-03         5.67014E-01         4.76896E-01         5.67020E-01         7.01637E+02         9.99994E-01         5.11913E+00         7.01709E+02         4.98340E+02         2.03370E+02
+          9.02438E-03         4.26921E-03        -2.74833E-03         5.67013E-01         4.87567E-01         5.67020E-01         6.85404E+02         9.99994E-01         5.00912E+00         6.85470E+02         4.87967E+02         1.97504E+02
+          9.02438E-03         4.43904E-03        -2.79479E-03         5.67013E-01         4.98237E-01         5.67020E-01         6.69203E+02         9.99994E-01         4.89983E+00         6.69264E+02         4.77512E+02         1.91751E+02
+          9.02438E-03         4.60887E-03        -2.84306E-03         5.67013E-01         5.08908E-01         5.67020E-01         6.53050E+02         9.99994E-01         4.79139E+00         6.53105E+02         4.66986E+02         1.86119E+02
+          9.02438E-03         4.77869E-03        -2.89314E-03         5.67012E-01         5.19578E-01         5.67019E-01         6.36960E+02         9.99994E-01         4.68390E+00         6.37009E+02         4.56398E+02         1.80611E+02
+          9.02438E-03         4.94852E-03        -2.94504E-03         5.67012E-01         5.30249E-01         5.67019E-01         6.20948E+02         9.99994E-01         4.57748E+00         6.20991E+02         4.45758E+02         1.75233E+02
+          9.02438E-03         5.11835E-03        -2.99875E-03         5.67011E-01         5.40919E-01         5.67019E-01         6.05026E+02         9.99994E-01         4.47222E+00         6.05064E+02         4.35076E+02         1.69988E+02
+          9.02438E-03         5.28818E-03        -3.05427E-03         5.67011E-01         5.51590E-01         5.67019E-01         5.89210E+02         9.99994E-01         4.36824E+00         5.89243E+02         4.24362E+02         1.64880E+02
+          9.02438E-03         5.45800E-03        -3.11160E-03         5.67010E-01         5.62261E-01         5.67019E-01         5.73512E+02         9.99994E-01         4.26561E+00         5.73539E+02         4.13627E+02         1.59912E+02
+          9.02438E-03         5.62783E-03        -3.17074E-03         5.67010E-01         5.72931E-01         5.67018E-01         5.57943E+02         9.99994E-01         4.16442E+00         5.57965E+02         4.02880E+02         1.55085E+02
+          9.02438E-03         5.79766E-03        -3.23170E-03         5.67009E-01         5.83602E-01         5.67018E-01         5.42517E+02         9.99994E-01         4.06476E+00         5.42533E+02         3.92131E+02         1.50402E+02
+          9.02438E-03         5.96749E-03        -3.29447E-03         5.67008E-01         5.94272E-01         5.67018E-01         5.27243E+02         9.99994E-01         3.96670E+00         5.27254E+02         3.81391E+02         1.45863E+02
+          9.02438E-03         6.13731E-03        -3.35905E-03         5.67008E-01         6.04943E-01         5.67018E-01         5.12134E+02         9.99994E-01         3.87032E+00         5.12140E+02         3.70670E+02         1.41470E+02
+          9.02438E-03         6.30714E-03        -3.42544E-03         5.67007E-01         6.15613E-01         5.67018E-01         4.97198E+02         9.99994E-01         3.77566E+00         4.97200E+02         3.59978E+02         1.37221E+02
+          9.02438E-03         6.47697E-03        -3.49365E-03         5.67007E-01         6.26284E-01         5.67017E-01         4.82446E+02         9.99994E-01         3.68280E+00         4.82443E+02         3.49325E+02         1.33118E+02
+          9.02438E-03         6.64680E-03        -3.56367E-03         5.67006E-01         6.36955E-01         5.67017E-01         4.67887E+02         9.99994E-01         3.59178E+00         4.67879E+02         3.38721E+02         1.29158E+02
+          9.02438E-03         6.81662E-03        -3.63550E-03         5.67005E-01         6.47625E-01         5.67017E-01         4.53529E+02         9.99994E-01         3.50265E+00         4.53516E+02         3.28176E+02         1.25340E+02
+          9.02438E-03         6.98645E-03        -3.70914E-03         5.67005E-01         6.58296E-01         5.67017E-01         4.39379E+02         9.99994E-01         3.41545E+00         4.39362E+02         3.17699E+02         1.21663E+02
+          9.02438E-03         7.15628E-03        -3.78459E-03         5.67004E-01         6.68966E-01         5.67017E-01         4.25446E+02         9.99994E-01         3.33021E+00         4.25425E+02         3.07300E+02         1.18125E+02
+          9.02438E-03         7.32611E-03        -3.86186E-03         5.67003E-01         6.79637E-01         5.67016E-01         4.11736E+02         9.99994E-01         3.24696E+00         4.11711E+02         2.96989E+02         1.14722E+02
+          9.02438E-03         7.49593E-03        -3.94094E-03         5.67003E-01         6.90307E-01         5.67016E-01         3.98255E+02         9.99994E-01         3.16573E+00         3.98226E+02         2.86774E+02         1.11452E+02
+          9.02438E-03         7.66576E-03        -4.02183E-03         5.67002E-01         7.00978E-01         5.67016E-01         3.85010E+02         9.99994E-01         3.08653E+00         3.84977E+02         2.76665E+02         1.08312E+02
+          9.02438E-03         7.83559E-03        -4.10453E-03         5.67001E-01         7.11649E-01         5.67016E-01         3.72004E+02         9.99994E-01         3.00938E+00         3.71968E+02         2.66671E+02         1.05298E+02
+          9.02438E-03         8.00542E-03        -4.18905E-03         5.67000E-01         7.22319E-01         5.67016E-01         3.59244E+02         9.99994E-01         2.93427E+00         3.59205E+02         2.56799E+02         1.02406E+02
+          9.02438E-03         8.17524E-03        -4.27537E-03         5.67000E-01         7.32990E-01         5.67016E-01         3.46733E+02         9.99994E-01         2.86123E+00         3.46691E+02         2.47059E+02         9.96318E+01
+          9.02438E-03         8.34507E-03        -4.36351E-03         5.66999E-01         7.43660E-01         5.67016E-01         3.34475E+02         9.99994E-01         2.79024E+00         3.34430E+02         2.37458E+02         9.69719E+01
+          9.02438E-03         8.51490E-03        -4.45347E-03         5.66998E-01         7.54331E-01         5.67015E-01         3.22474E+02         9.99994E-01         2.72129E+00         3.22426E+02         2.28004E+02         9.44216E+01
+          9.02438E-03         8.68473E-03        -4.54523E-03         5.66997E-01         7.65001E-01         5.67015E-01         3.10732E+02         9.99994E-01         2.65438E+00         3.10681E+02         2.18705E+02         9.19762E+01
+          9.02438E-03         8.85455E-03        -4.63881E-03         5.66996E-01         7.75672E-01         5.67015E-01         2.99251E+02         9.99994E-01         2.58950E+00         2.99198E+02         2.09567E+02         8.96311E+01
+          9.02438E-03         9.02438E-03        -4.73420E-03         5.66995E-01         7.86343E-01         5.67015E-01         2.88034E+02         9.99994E-01         2.52662E+00         2.87979E+02         2.00598E+02         8.73815E+01
+          9.02438E-03         9.19421E-03        -4.83140E-03         5.66995E-01         7.97013E-01         5.67015E-01         2.77082E+02         9.99994E-01         2.46573E+00         2.77025E+02         1.91803E+02         8.52226E+01
+          9.02438E-03         9.36403E-03        -4.93041E-03         5.66994E-01         8.07684E-01         5.67015E-01         2.66397E+02         9.99994E-01         2.40680E+00         2.66339E+02         1.83189E+02         8.31495E+01
+          9.02438E-03         9.53386E-03        -5.03124E-03         5.66993E-01         8.18354E-01         5.67015E-01         2.55979E+02         9.99994E-01         2.34980E+00         2.55919E+02         1.74762E+02         8.11574E+01
+          9.02438E-03         9.70369E-03        -5.13388E-03         5.66992E-01         8.29025E-01         5.67015E-01         2.45829E+02         9.99994E-01         2.29471E+00         2.45768E+02         1.66526E+02         7.92414E+01
+          9.02438E-03         9.87352E-03        -5.23833E-03         5.66991E-01         8.39695E-01         5.67015E-01         2.35947E+02         9.99994E-01         2.24150E+00         2.35884E+02         1.58488E+02         7.73968E+01
+          9.02438E-03         1.00433E-02        -5.34459E-03         5.66990E-01         8.50366E-01         5.67015E-01         2.26333E+02         9.99994E-01         2.19013E+00         2.26269E+02         1.50650E+02         7.56189E+01
+          9.02438E-03         1.02132E-02        -5.45267E-03         5.66989E-01         8.61037E-01         5.67015E-01         2.16985E+02         9.99994E-01         2.14056E+00         2.16921E+02         1.43018E+02         7.39030E+01
+          9.02438E-03         1.03830E-02        -5.56255E-03         5.66988E-01         8.71707E-01         5.67015E-01         2.07905E+02         9.99994E-01         2.09277E+00         2.07840E+02         1.35595E+02         7.22446E+01
+          9.02438E-03         1.05528E-02        -5.67425E-03         5.66987E-01         8.82378E-01         5.67015E-01         1.99089E+02         9.99994E-01         2.04672E+00         1.99024E+02         1.28385E+02         7.06394E+01
+          9.02438E-03         1.07227E-02        -5.78777E-03         5.66986E-01         8.93048E-01         5.67015E-01         1.90538E+02         9.99994E-01         2.00236E+00         1.90472E+02         1.21389E+02         6.90832E+01
+          9.02438E-03         1.08925E-02        -5.90309E-03         5.66985E-01         9.03719E-01         5.67016E-01         1.82249E+02         9.99994E-01         1.95967E+00         1.82183E+02         1.14612E+02         6.75719E+01
+          9.02438E-03         1.10623E-02        -6.02023E-03         5.66984E-01         9.14389E-01         5.67016E-01         1.74220E+02         9.99994E-01         1.91860E+00         1.74155E+02         1.08054E+02         6.61017E+01
+          9.02438E-03         1.12321E-02        -6.13918E-03         5.66983E-01         9.25060E-01         5.67016E-01         1.66451E+02         9.99994E-01         1.87911E+00         1.66386E+02         1.01717E+02         6.46688E+01
+          9.02438E-03         1.14020E-02        -6.25994E-03         5.66982E-01         9.35731E-01         5.67016E-01         1.58937E+02         9.99994E-01         1.84117E+00         1.58873E+02         9.56030E+01         6.32699E+01
+          9.02438E-03         1.15718E-02        -6.38252E-03         5.66981E-01         9.46401E-01         5.67016E-01         1.51677E+02         9.99994E-01         1.80474E+00         1.51614E+02         8.97123E+01         6.19016E+01
+          9.02438E-03         1.17416E-02        -6.50690E-03         5.66979E-01         9.57072E-01         5.67017E-01         1.44669E+02         9.99994E-01         1.76979E+00         1.44606E+02         8.40452E+01         6.05611E+01
+          9.02438E-03         1.19114E-02        -6.63310E-03         5.66978E-01         9.67742E-01         5.67017E-01         1.37909E+02         9.99994E-01         1.73626E+00         1.37847E+02         7.86018E+01         5.92454E+01
+          9.02438E-03         1.20813E-02        -6.76111E-03         5.66977E-01         9.78413E-01         5.67017E-01         1.31394E+02         9.99994E-01         1.70414E+00         1.31334E+02         7.33816E+01         5.79521E+01
+          9.02438E-03         1.22511E-02        -6.89094E-03         5.66976E-01         9.89083E-01         5.67018E-01         1.25121E+02         9.99994E-01         1.67337E+00         1.25063E+02         6.83838E+01         5.66788E+01
+          9.02438E-03         1.24209E-02        -7.02258E-03         5.66975E-01         9.99754E-01         5.67018E-01         1.19088E+02         9.99994E-01         1.64393E+00         1.19031E+02         6.36071E+01         5.54235E+01
+          9.02438E-03         1.25908E-02        -7.15603E-03         5.66974E-01         1.01042E+00         5.67019E-01         1.13290E+02         9.99994E-01         1.61578E+00         1.13234E+02         5.90499E+01         5.41844E+01
+          9.02438E-03         1.27606E-02        -7.29129E-03         5.66972E-01         1.02110E+00         5.67019E-01         1.07724E+02         9.99994E-01         1.58889E+00         1.07670E+02         5.47104E+01         5.29598E+01
+          9.02438E-03         1.29304E-02        -7.42836E-03         5.66971E-01         1.03177E+00         5.67020E-01         1.02387E+02         9.99994E-01         1.56322E+00         1.02335E+02         5.05861E+01         5.17485E+01
+          9.02438E-03         1.31002E-02        -7.56725E-03         5.66970E-01         1.04244E+00         5.67020E-01         9.72739E+01         9.99994E-01         1.53873E+00         9.72238E+01         4.66745E+01         5.05494E+01
+          9.02438E-03         1.32701E-02        -7.70795E-03         5.66969E-01         1.05311E+00         5.67021E-01         9.23819E+01         9.99994E-01         1.51540E+00         9.23340E+01         4.29725E+01         4.93615E+01
+          9.02438E-03         1.34399E-02        -7.85046E-03         5.66967E-01         1.06378E+00         5.67022E-01         8.77067E+01         9.99994E-01         1.49318E+00         8.76611E+01         3.94769E+01         4.81842E+01
+          9.02438E-03         1.36097E-02        -7.99479E-03         5.66966E-01         1.07445E+00         5.67022E-01         8.32444E+01         9.99994E-01         1.47206E+00         8.32011E+01         3.61840E+01         4.70171E+01
+          9.02438E-03         1.37795E-02        -8.14092E-03         5.66965E-01         1.08512E+00         5.67023E-01         7.89909E+01         9.99994E-01         1.45198E+00         7.89499E+01         3.30900E+01         4.58599E+01
+          9.02438E-03         1.39494E-02        -8.28887E-03         5.66963E-01         1.09579E+00         5.67024E-01         7.49418E+01         9.99994E-01         1.43293E+00         7.49034E+01         3.01907E+01         4.47126E+01
+          9.02438E-03         1.41192E-02        -8.43864E-03         5.66962E-01         1.10646E+00         5.67025E-01         7.10931E+01         9.99994E-01         1.41487E+00         7.10572E+01         2.74818E+01         4.35753E+01
+          9.02438E-03         1.42890E-02        -8.59021E-03         5.66961E-01         1.11713E+00         5.67026E-01         6.74403E+01         9.99994E-01         1.39777E+00         6.74070E+01         2.49586E+01         4.24484E+01
+          9.02438E-03         1.44589E-02        -8.74360E-03         5.66959E-01         1.12780E+00         5.67027E-01         6.39792E+01         9.99994E-01         1.38159E+00         6.39485E+01         2.26162E+01         4.13323E+01
+          9.02438E-03         1.46287E-02        -8.89880E-03         5.66958E-01         1.13847E+00         5.67028E-01         6.07052E+01         9.99994E-01         1.36629E+00         6.06772E+01         2.04496E+01         4.02276E+01
+          9.02438E-03         1.47985E-02        -9.05581E-03         5.66956E-01         1.14914E+00         5.67029E-01         5.76139E+01         9.99994E-01         1.35186E+00         5.75886E+01         1.84534E+01         3.91352E+01
+          9.02438E-03         1.49683E-02        -9.21464E-03         5.66955E-01         1.15981E+00         5.67030E-01         5.47008E+01         9.99994E-01         1.33825E+00         5.46783E+01         1.66225E+01         3.80558E+01
+          9.02438E-03         1.51382E-02        -9.37528E-03         5.66954E-01         1.17048E+00         5.67031E-01         5.19613E+01         9.99994E-01         1.32543E+00         5.19415E+01         1.49510E+01         3.69905E+01
+          9.02438E-03         1.53080E-02        -9.53773E-03         5.66952E-01         1.18115E+00         5.67032E-01         4.93907E+01         9.99994E-01         1.31337E+00         4.93737E+01         1.34335E+01         3.59403E+01
+          9.02438E-03         1.54778E-02        -9.70199E-03         5.66951E-01         1.19182E+00         5.67034E-01         4.69846E+01         9.99994E-01         1.30204E+00         4.69703E+01         1.20640E+01         3.49064E+01
+          9.02438E-03         1.56476E-02        -9.86807E-03         5.66949E-01         1.20249E+00         5.67035E-01         4.47381E+01         9.99994E-01         1.29139E+00         4.47266E+01         1.08367E+01         3.38900E+01
+          9.02438E-03         1.58175E-02        -1.00360E-02         5.66948E-01         1.21317E+00         5.67036E-01         4.26465E+01         9.99994E-01         1.28140E+00         4.26379E+01         9.74553E+00         3.28923E+01
+          9.02438E-03         1.59873E-02        -1.02057E-02         5.66946E-01         1.22384E+00         5.67038E-01         4.07053E+01         9.99994E-01         1.27203E+00         4.06993E+01         8.78456E+00         3.19148E+01
+          9.02438E-03         1.61571E-02        -1.03772E-02         5.66945E-01         1.23451E+00         5.67039E-01         3.89095E+01         9.99994E-01         1.26325E+00         3.89063E+01         7.94769E+00         3.09586E+01
+          9.02438E-03         1.63270E-02        -1.05505E-02         5.66943E-01         1.24518E+00         5.67041E-01         3.72545E+01         9.99994E-01         1.25502E+00         3.72539E+01         7.22882E+00         3.00251E+01
+          9.02438E-03         1.64968E-02        -1.07256E-02         5.66941E-01         1.25585E+00         5.67043E-01         3.57354E+01         9.99994E-01         1.24731E+00         3.57375E+01         6.62182E+00         2.91156E+01
+          9.02438E-03         1.66666E-02        -1.09026E-02         5.66940E-01         1.26652E+00         5.67045E-01         3.43475E+01         9.99994E-01         1.24009E+00         3.43521E+01         6.12062E+00         2.82315E+01
+          9.02438E-03         1.68364E-02        -1.10814E-02         5.66938E-01         1.27719E+00         5.67046E-01         3.30859E+01         9.99994E-01         1.23332E+00         3.30931E+01         5.71914E+00         2.73740E+01
+          9.02438E-03         1.70063E-02        -1.12619E-02         5.66937E-01         1.28786E+00         5.67048E-01         3.19460E+01         9.99994E-01         1.22697E+00         3.19556E+01         5.41133E+00         2.65443E+01
+          9.02438E-03         1.71761E-02        -1.14443E-02         5.66935E-01         1.29853E+00         5.67050E-01         3.09227E+01         9.99994E-01         1.22100E+00         3.09347E+01         5.19123E+00         2.57435E+01
+          9.02438E-03         1.73459E-02        -1.16285E-02         5.66933E-01         1.30920E+00         5.67052E-01         3.00115E+01         9.99994E-01         1.21540E+00         3.00258E+01         5.05292E+00         2.49729E+01
+          9.02438E-03         1.75158E-02        -1.18146E-02         5.66932E-01         1.31987E+00         5.67055E-01         2.92074E+01         9.99994E-01         1.21011E+00         2.92239E+01         4.99057E+00         2.42334E+01
+          9.02438E-03         1.76856E-02        -1.20024E-02         5.66930E-01         1.33054E+00         5.67057E-01         2.85056E+01         9.99994E-01         1.20512E+00         2.85244E+01         4.99846E+00         2.35259E+01
+          9.02438E-03         1.78554E-02        -1.21920E-02         5.66928E-01         1.34121E+00         5.67059E-01         2.79016E+01         9.99994E-01         1.20039E+00         2.79224E+01         5.07095E+00         2.28514E+01
+          9.02438E-03         1.80252E-02        -1.23835E-02         5.66926E-01         1.35188E+00         5.67062E-01         2.73903E+01         9.99994E-01         1.19590E+00         2.74131E+01         5.20254E+00         2.22106E+01
+          9.02438E-03         1.81951E-02        -1.25768E-02         5.66925E-01         1.36255E+00         5.67064E-01         2.69673E+01         9.99994E-01         1.19162E+00         2.69919E+01         5.38786E+00         2.16041E+01
+          9.02438E-03         1.83649E-02        -1.27718E-02         5.66923E-01         1.37322E+00         5.67067E-01         2.66277E+01         9.99994E-01         1.18751E+00         2.66541E+01         5.62166E+00         2.10325E+01
+          9.02438E-03         1.85347E-02        -1.29687E-02         5.66921E-01         1.38389E+00         5.67069E-01         2.63669E+01         9.99994E-01         1.18356E+00         2.63950E+01         5.89885E+00         2.04962E+01
+          9.02438E-03         1.87045E-02        -1.31674E-02         5.66919E-01         1.39457E+00         5.67072E-01         2.61804E+01         9.99994E-01         1.17974E+00         2.62100E+01         6.21452E+00         1.99955E+01
+          9.02438E-03         1.88744E-02        -1.33680E-02         5.66918E-01         1.40524E+00         5.67075E-01         2.60634E+01         9.99994E-01         1.17602E+00         2.60946E+01         6.56389E+00         1.95307E+01
+          9.02438E-03         1.90442E-02        -1.35703E-02         5.66916E-01         1.41591E+00         5.67078E-01         2.60116E+01         9.99994E-01         1.17238E+00         2.60441E+01         6.94237E+00         1.91017E+01
+          9.02438E-03         1.92140E-02        -1.37744E-02         5.66914E-01         1.42658E+00         5.67081E-01         2.60204E+01         9.99994E-01         1.16880E+00         2.60542E+01         7.34554E+00         1.87086E+01
+          9.02438E-03         1.93839E-02        -1.39804E-02         5.66912E-01         1.43725E+00         5.67084E-01         2.60855E+01         9.99994E-01         1.16526E+00         2.61203E+01         7.76919E+00         1.83512E+01
+          9.02438E-03         1.95537E-02        -1.41882E-02         5.66910E-01         1.44792E+00         5.67088E-01         2.62024E+01         9.99994E-01         1.16174E+00         2.62383E+01         8.20925E+00         1.80291E+01
+          9.02438E-03         1.97235E-02        -1.43978E-02         5.66908E-01         1.45859E+00         5.67091E-01         2.63670E+01         9.99994E-01         1.15822E+00         2.64038E+01         8.66190E+00         1.77419E+01
+          9.02438E-03         1.98933E-02        -1.46092E-02         5.66906E-01         1.46926E+00         5.67095E-01         2.65750E+01         9.99994E-01         1.15469E+00         2.66125E+01         9.12346E+00         1.74891E+01
+          9.02438E-03         2.00632E-02        -1.48224E-02         5.66904E-01         1.47993E+00         5.67098E-01         2.68223E+01         9.99994E-01         1.15112E+00         2.68605E+01         9.59049E+00         1.72700E+01
+          9.02438E-03         2.02330E-02        -1.50374E-02         5.66902E-01         1.49060E+00         5.67102E-01         2.71048E+01         9.99994E-01         1.14750E+00         2.71436E+01         1.00597E+01         1.70839E+01
+          9.02438E-03         2.04028E-02        -1.52542E-02         5.66900E-01         1.50127E+00         5.67106E-01         2.74187E+01         9.99994E-01         1.14383E+00         2.74579E+01         1.05281E+01         1.69298E+01
+          9.02438E-03         2.05726E-02        -1.54729E-02         5.66899E-01         1.51194E+00         5.67110E-01         2.77600E+01         9.99994E-01         1.14008E+00         2.77996E+01         1.09928E+01         1.68068E+01
+          9.02438E-03         2.07425E-02        -1.56934E-02         5.66897E-01         1.52261E+00         5.67114E-01         2.81251E+01         9.99994E-01         1.13624E+00         2.81649E+01         1.14510E+01         1.67138E+01
+          9.02438E-03         2.09123E-02        -1.59156E-02         5.66895E-01         1.53328E+00         5.67118E-01         2.85103E+01         9.99994E-01         1.13231E+00         2.85502E+01         1.19005E+01         1.66497E+01
+          9.02438E-03         2.10821E-02        -1.61397E-02         5.66893E-01         1.54395E+00         5.67122E-01         2.89120E+01         9.99994E-01         1.12827E+00         2.89519E+01         1.23388E+01         1.66131E+01
+          9.02438E-03         2.12520E-02        -1.63656E-02         5.66890E-01         1.55462E+00         5.67127E-01         2.93269E+01         9.99994E-01         1.12411E+00         2.93666E+01         1.27640E+01         1.66027E+01
+          9.02438E-03         2.14218E-02        -1.65934E-02         5.66888E-01         1.56529E+00         5.67131E-01         2.97516E+01         9.99994E-01         1.11984E+00         2.97911E+01         1.31741E+01         1.66170E+01
+          9.02438E-03         2.15916E-02        -1.68229E-02         5.66886E-01         1.57596E+00         5.67136E-01         3.01830E+01         9.99994E-01         1.11543E+00         3.02222E+01         1.35674E+01         1.66547E+01
+          9.02438E-03         2.17614E-02        -1.70542E-02         5.66884E-01         1.58664E+00         5.67141E-01         3.06179E+01         9.99994E-01         1.11088E+00         3.06567E+01         1.39425E+01         1.67142E+01
+          9.02438E-03         2.19313E-02        -1.72874E-02         5.66882E-01         1.59731E+00         5.67146E-01         3.10535E+01         9.99994E-01         1.10619E+00         3.10918E+01         1.42980E+01         1.67938E+01
+          9.02438E-03         2.21011E-02        -1.75224E-02         5.66880E-01         1.60798E+00         5.67151E-01         3.14871E+01         9.99994E-01         1.10136E+00         3.15248E+01         1.46327E+01         1.68920E+01
+          9.02438E-03         2.22709E-02        -1.77592E-02         5.66878E-01         1.61865E+00         5.67156E-01         3.19158E+01         9.99994E-01         1.09637E+00         3.19528E+01         1.49457E+01         1.70071E+01
+          9.02438E-03         2.24407E-02        -1.79978E-02         5.66876E-01         1.62932E+00         5.67161E-01         3.23372E+01         9.99994E-01         1.09123E+00         3.23735E+01         1.52360E+01         1.71374E+01
+          9.02438E-03         2.26106E-02        -1.82382E-02         5.66874E-01         1.63999E+00         5.67167E-01         3.27489E+01         9.99994E-01         1.08593E+00         3.27843E+01         1.55031E+01         1.72812E+01
+          9.02438E-03         2.27804E-02        -1.84804E-02         5.66871E-01         1.65066E+00         5.67173E-01         3.31487E+01         9.99994E-01         1.08048E+00         3.31832E+01         1.57464E+01         1.74368E+01
+          9.02438E-03         2.29502E-02        -1.87244E-02         5.66869E-01         1.66133E+00         5.67178E-01         3.35345E+01         9.99994E-01         1.07486E+00         3.35680E+01         1.59655E+01         1.76024E+01
+          9.02438E-03         2.31201E-02        -1.89703E-02         5.66867E-01         1.67200E+00         5.67184E-01         3.39043E+01         9.99994E-01         1.06909E+00         3.39367E+01         1.61603E+01         1.77764E+01
+          9.02438E-03         2.32899E-02        -1.92180E-02         5.66865E-01         1.68267E+00         5.67190E-01         3.42563E+01         9.99994E-01         1.06315E+00         3.42876E+01         1.63305E+01         1.79571E+01
+          9.02438E-03         2.34597E-02        -1.94674E-02         5.66862E-01         1.69334E+00         5.67197E-01         3.45888E+01         9.99994E-01         1.05706E+00         3.46189E+01         1.64761E+01         1.81427E+01
+          9.02438E-03         2.36295E-02        -1.97187E-02         5.66860E-01         1.70401E+00         5.67203E-01         3.49003E+01         9.99994E-01         1.05080E+00         3.49291E+01         1.65974E+01         1.83317E+01
+          9.02438E-03         2.37994E-02        -1.99718E-02         5.66858E-01         1.71468E+00         5.67210E-01         3.51894E+01         9.99994E-01         1.04439E+00         3.52170E+01         1.66945E+01         1.85225E+01
+          9.02438E-03         2.39692E-02        -2.02268E-02         5.66856E-01         1.72535E+00         5.67216E-01         3.54549E+01         9.99994E-01         1.03782E+00         3.54812E+01         1.67678E+01         1.87134E+01
+          9.02438E-03         2.41390E-02        -2.04835E-02         5.66853E-01         1.73602E+00         5.67223E-01         3.56958E+01         9.99994E-01         1.03110E+00         3.57206E+01         1.68176E+01         1.89030E+01
+          9.02438E-03         2.43088E-02        -2.07420E-02         5.66851E-01         1.74669E+00         5.67230E-01         3.59109E+01         9.99994E-01         1.02422E+00         3.59343E+01         1.68446E+01         1.90897E+01
+          9.02438E-03         2.44787E-02        -2.10024E-02         5.66849E-01         1.75736E+00         5.67238E-01         3.60996E+01         9.99994E-01         1.01720E+00         3.61215E+01         1.68493E+01         1.92723E+01
+          9.02438E-03         2.46485E-02        -2.12646E-02         5.66846E-01         1.76804E+00         5.67245E-01         3.62610E+01         9.99994E-01         1.01003E+00         3.62816E+01         1.68323E+01         1.94493E+01
+          9.02438E-03         2.48183E-02        -2.15286E-02         5.66844E-01         1.77871E+00         5.67253E-01         3.63948E+01         9.99994E-01         1.00272E+00         3.64138E+01         1.67944E+01         1.96194E+01
+          9.02438E-03         2.49882E-02        -2.17944E-02         5.66841E-01         1.78938E+00         5.67260E-01         3.65005E+01         9.99994E-01         9.95273E-01         3.65180E+01         1.67364E+01         1.97816E+01
+          9.02438E-03         2.51580E-02        -2.20620E-02         5.66839E-01         1.80005E+00         5.67268E-01         3.65777E+01         9.99994E-01         9.87691E-01         3.65937E+01         1.66590E+01         1.99346E+01
+          9.02438E-03         2.53278E-02        -2.23314E-02         5.66837E-01         1.81072E+00         5.67276E-01         3.66263E+01         9.99994E-01         9.79980E-01         3.66407E+01         1.65633E+01         2.00774E+01
+          9.02438E-03         2.54976E-02        -2.26027E-02         5.66834E-01         1.82139E+00         5.67285E-01         3.66463E+01         9.99994E-01         9.72143E-01         3.66592E+01         1.64501E+01         2.02091E+01
+          9.02438E-03         2.56675E-02        -2.28757E-02         5.66832E-01         1.83206E+00         5.67293E-01         3.66377E+01         9.99994E-01         9.64186E-01         3.66490E+01         1.63203E+01         2.03287E+01
+          9.02438E-03         2.58373E-02        -2.31506E-02         5.66829E-01         1.84273E+00         5.67302E-01         3.66007E+01         9.99994E-01         9.56114E-01         3.66105E+01         1.61749E+01         2.04356E+01
+          9.02438E-03         2.60071E-02        -2.34273E-02         5.66827E-01         1.85340E+00         5.67311E-01         3.65356E+01         9.99994E-01         9.47931E-01         3.65439E+01         1.60150E+01         2.05289E+01
+          9.02438E-03         2.61769E-02        -2.37058E-02         5.66824E-01         1.86407E+00         5.67320E-01         3.64428E+01         9.99994E-01         9.39643E-01         3.64495E+01         1.58415E+01         2.06080E+01
+          9.19421E-03         8.72665E-04        -2.29688E-03         5.77689E-01         2.74155E-01         5.77693E-01         8.92378E+02         9.99995E-01         5.72661E+00         8.92510E+02         5.49438E+02         3.43072E+02
+          9.19421E-03         1.04249E-03        -2.30710E-03         5.77689E-01         2.84826E-01         5.77693E-01         8.80076E+02         9.99995E-01         5.64981E+00         8.80205E+02         5.44039E+02         3.36166E+02
+          9.19421E-03         1.21232E-03        -2.31913E-03         5.77689E-01         2.95496E-01         5.77693E-01         8.67493E+02         9.99995E-01         5.57137E+00         8.67618E+02         5.38455E+02         3.29163E+02
+          9.19421E-03         1.38215E-03        -2.33297E-03         5.77689E-01         3.06167E-01         5.77693E-01         8.54648E+02         9.99995E-01         5.49140E+00         8.54769E+02         5.32691E+02         3.22078E+02
+          9.19421E-03         1.55197E-03        -2.34863E-03         5.77688E-01         3.16838E-01         5.77693E-01         8.41557E+02         9.99995E-01         5.41003E+00         8.41674E+02         5.26748E+02         3.14926E+02
+          9.19421E-03         1.72180E-03        -2.36609E-03         5.77688E-01         3.27508E-01         5.77693E-01         8.28239E+02         9.99995E-01         5.32739E+00         8.28353E+02         5.20632E+02         3.07721E+02
+          9.19421E-03         1.89163E-03        -2.38537E-03         5.77688E-01         3.38179E-01         5.77693E-01         8.14712E+02         9.99995E-01         5.24359E+00         8.14823E+02         5.14345E+02         3.00478E+02
+          9.19421E-03         2.06146E-03        -2.40646E-03         5.77688E-01         3.48849E-01         5.77693E-01         8.00996E+02         9.99995E-01         5.15878E+00         8.01102E+02         5.07891E+02         2.93211E+02
+          9.19421E-03         2.23128E-03        -2.42936E-03         5.77688E-01         3.59520E-01         5.77693E-01         7.87106E+02         9.99995E-01         5.07306E+00         7.87209E+02         5.01276E+02         2.85933E+02
+          9.19421E-03         2.40111E-03        -2.45408E-03         5.77687E-01         3.70190E-01         5.77693E-01         7.73063E+02         9.99995E-01         4.98657E+00         7.73162E+02         4.94502E+02         2.78659E+02
+          9.19421E-03         2.57094E-03        -2.48060E-03         5.77687E-01         3.80861E-01         5.77693E-01         7.58884E+02         9.99995E-01         4.89942E+00         7.58978E+02         4.87576E+02         2.71402E+02
+          9.19421E-03         2.74077E-03        -2.50894E-03         5.77687E-01         3.91532E-01         5.77692E-01         7.44586E+02         9.99995E-01         4.81175E+00         7.44676E+02         4.80501E+02         2.64175E+02
+          9.19421E-03         2.91059E-03        -2.53909E-03         5.77687E-01         4.02202E-01         5.77692E-01         7.30187E+02         9.99995E-01         4.72368E+00         7.30273E+02         4.73284E+02         2.56989E+02
+          9.19421E-03         3.08042E-03        -2.57105E-03         5.77686E-01         4.12873E-01         5.77692E-01         7.15704E+02         9.99995E-01         4.63531E+00         7.15787E+02         4.65929E+02         2.49858E+02
+          9.19421E-03         3.25025E-03        -2.60483E-03         5.77686E-01         4.23543E-01         5.77692E-01         7.01155E+02         9.99995E-01         4.54678E+00         7.01234E+02         4.58442E+02         2.42791E+02
+          9.19421E-03         3.42008E-03        -2.64041E-03         5.77686E-01         4.34214E-01         5.77692E-01         6.86557E+02         9.99995E-01         4.45819E+00         6.86631E+02         4.50829E+02         2.35801E+02
+          9.19421E-03         3.58990E-03        -2.67781E-03         5.77685E-01         4.44884E-01         5.77692E-01         6.71925E+02         9.99995E-01         4.36966E+00         6.71995E+02         4.43096E+02         2.28898E+02
+          9.19421E-03         3.75973E-03        -2.71702E-03         5.77685E-01         4.55555E-01         5.77691E-01         6.57275E+02         9.99995E-01         4.28130E+00         6.57341E+02         4.35250E+02         2.22091E+02
+          9.19421E-03         3.92956E-03        -2.75805E-03         5.77685E-01         4.66225E-01         5.77691E-01         6.42625E+02         9.99995E-01         4.19322E+00         6.42686E+02         4.27296E+02         2.15390E+02
+          9.19421E-03         4.09939E-03        -2.80088E-03         5.77684E-01         4.76896E-01         5.77691E-01         6.27988E+02         9.99995E-01         4.10552E+00         6.28045E+02         4.19242E+02         2.08803E+02
+          9.19421E-03         4.26921E-03        -2.84553E-03         5.77684E-01         4.87567E-01         5.77691E-01         6.13379E+02         9.99995E-01         4.01830E+00         6.13433E+02         4.11095E+02         2.02338E+02
+          9.19421E-03         4.43904E-03        -2.89199E-03         5.77683E-01         4.98237E-01         5.77691E-01         5.98814E+02         9.99995E-01         3.93166E+00         5.98863E+02         4.02861E+02         1.96002E+02
+          9.19421E-03         4.60887E-03        -2.94026E-03         5.77683E-01         5.08908E-01         5.77690E-01         5.84305E+02         9.99995E-01         3.84570E+00         5.84350E+02         3.94547E+02         1.89803E+02
+          9.19421E-03         4.77869E-03        -2.99035E-03         5.77682E-01         5.19578E-01         5.77690E-01         5.69867E+02         9.99995E-01         3.76050E+00         5.69908E+02         3.86162E+02         1.83745E+02
+          9.19421E-03         4.94852E-03        -3.04224E-03         5.77682E-01         5.30249E-01         5.77690E-01         5.55512E+02         9.99995E-01         3.67615E+00         5.55548E+02         3.77713E+02         1.77835E+02
+          9.19421E-03         5.11835E-03        -3.09595E-03         5.77682E-01         5.40919E-01         5.77690E-01         5.41252E+02         9.99995E-01         3.59273E+00         5.41285E+02         3.69208E+02         1.72077E+02
+          9.19421E-03         5.28818E-03        -3.15147E-03         5.77681E-01         5.51590E-01         5.77690E-01         5.27100E+02         9.99995E-01         3.51032E+00         5.27128E+02         3.60654E+02         1.66475E+02
+          9.19421E-03         5.45800E-03        -3.20880E-03         5.77680E-01         5.62261E-01         5.77689E-01         5.13066E+02         9.99995E-01         3.42899E+00         5.13091E+02         3.52059E+02         1.61032E+02
+          9.19421E-03         5.62783E-03        -3.26795E-03         5.77680E-01         5.72931E-01         5.77689E-01         4.99162E+02         9.99995E-01         3.34881E+00         4.99183E+02         3.43432E+02         1.55751E+02
+          9.19421E-03         5.79766E-03        -3.32890E-03         5.77679E-01         5.83602E-01         5.77689E-01         4.85397E+02         9.99995E-01         3.26985E+00         4.85415E+02         3.34780E+02         1.50635E+02
+          9.19421E-03         5.96749E-03        -3.39167E-03         5.77679E-01         5.94272E-01         5.77689E-01         4.71782E+02         9.99995E-01         3.19215E+00         4.71796E+02         3.26112E+02         1.45684E+02
+          9.19421E-03         6.13731E-03        -3.45625E-03         5.77678E-01         6.04943E-01         5.77689E-01         4.58326E+02         9.99995E-01         3.11579E+00         4.58336E+02         3.17437E+02         1.40899E+02
+          9.19421E-03         6.30714E-03        -3.52265E-03         5.77678E-01         6.15613E-01         5.77688E-01         4.45036E+02         9.99995E-01         3.04081E+00         4.45043E+02         3.08762E+02         1.36281E+02
+          9.19421E-03         6.47697E-03        -3.59085E-03         5.77677E-01         6.26284E-01         5.77688E-01         4.31922E+02         9.99995E-01         2.96724E+00         4.31925E+02         3.00095E+02         1.31830E+02
+          9.19421E-03         6.64680E-03        -3.66087E-03         5.77676E-01         6.36955E-01         5.77688E-01         4.18990E+02         9.99995E-01         2.89514E+00         4.18989E+02         2.91446E+02         1.27544E+02
+          9.19421E-03         6.81662E-03        -3.73270E-03         5.77676E-01         6.47625E-01         5.77688E-01         4.06247E+02         9.99995E-01         2.82455E+00         4.06244E+02         2.82822E+02         1.23422E+02
+          9.19421E-03         6.98645E-03        -3.80634E-03         5.77675E-01         6.58296E-01         5.77688E-01         3.93701E+02         9.99995E-01         2.75548E+00         3.93694E+02         2.74232E+02         1.19462E+02
+          9.19421E-03         7.15628E-03        -3.88179E-03         5.77674E-01         6.68966E-01         5.77687E-01         3.81356E+02         9.99995E-01         2.68797E+00         3.81346E+02         2.65683E+02         1.15663E+02
+          9.19421E-03         7.32611E-03        -3.95906E-03         5.77674E-01         6.79637E-01         5.77687E-01         3.69218E+02         9.99995E-01         2.62204E+00         3.69205E+02         2.57184E+02         1.12021E+02
+          9.19421E-03         7.49593E-03        -4.03814E-03         5.77673E-01         6.90307E-01         5.77687E-01         3.57292E+02         9.99995E-01         2.55770E+00         3.57276E+02         2.48744E+02         1.08533E+02
+          9.19421E-03         7.66576E-03        -4.11903E-03         5.77672E-01         7.00978E-01         5.77687E-01         3.45583E+02         9.99995E-01         2.49498E+00         3.45564E+02         2.40369E+02         1.05195E+02
+          9.19421E-03         7.83559E-03        -4.20173E-03         5.77671E-01         7.11649E-01         5.77687E-01         3.34093E+02         9.99995E-01         2.43388E+00         3.34072E+02         2.32068E+02         1.02004E+02
+          9.19421E-03         8.00542E-03        -4.28625E-03         5.77671E-01         7.22319E-01         5.77686E-01         3.22828E+02         9.99995E-01         2.37441E+00         3.22804E+02         2.23848E+02         9.89557E+01
+          9.19421E-03         8.17524E-03        -4.37258E-03         5.77670E-01         7.32990E-01         5.77686E-01         3.11789E+02         9.99995E-01         2.31657E+00         3.11763E+02         2.15718E+02         9.60451E+01
+          9.19421E-03         8.34507E-03        -4.46072E-03         5.77669E-01         7.43660E-01         5.77686E-01         3.00979E+02         9.99995E-01         2.26035E+00         3.00951E+02         2.07683E+02         9.32677E+01
+          9.19421E-03         8.51490E-03        -4.55067E-03         5.77668E-01         7.54331E-01         5.77686E-01         2.90400E+02         9.99995E-01         2.20575E+00         2.90370E+02         1.99751E+02         9.06185E+01
+          9.19421E-03         8.68473E-03        -4.64243E-03         5.77667E-01         7.65001E-01         5.77686E-01         2.80054E+02         9.99995E-01         2.15277E+00         2.80022E+02         1.91930E+02         8.80923E+01
+          9.19421E-03         8.85455E-03        -4.73601E-03         5.77666E-01         7.75672E-01         5.77686E-01         2.69943E+02         9.99995E-01         2.10139E+00         2.69909E+02         1.84225E+02         8.56838E+01
+          9.19421E-03         9.02438E-03        -4.83140E-03         5.77666E-01         7.86343E-01         5.77686E-01         2.60067E+02         9.99995E-01         2.05160E+00         2.60032E+02         1.76644E+02         8.33876E+01
+          9.19421E-03         9.19421E-03        -4.92860E-03         5.77665E-01         7.97013E-01         5.77686E-01         2.50427E+02         9.99995E-01         2.00338E+00         2.50390E+02         1.69192E+02         8.11983E+01
+          9.19421E-03         9.36403E-03        -5.02761E-03         5.77664E-01         8.07684E-01         5.77686E-01         2.41023E+02         9.99995E-01         1.95671E+00         2.40985E+02         1.61875E+02         7.91101E+01
+          9.19421E-03         9.53386E-03        -5.12844E-03         5.77663E-01         8.18354E-01         5.77686E-01         2.31856E+02         9.99995E-01         1.91157E+00         2.31816E+02         1.54699E+02         7.71175E+01
+          9.19421E-03         9.70369E-03        -5.23108E-03         5.77662E-01         8.29025E-01         5.77686E-01         2.22924E+02         9.99995E-01         1.86794E+00         2.22883E+02         1.47668E+02         7.52149E+01
+          9.19421E-03         9.87352E-03        -5.33553E-03         5.77661E-01         8.39695E-01         5.77686E-01         2.14228E+02         9.99995E-01         1.82580E+00         2.14186E+02         1.40789E+02         7.33967E+01
+          9.19421E-03         1.00433E-02        -5.44179E-03         5.77660E-01         8.50366E-01         5.77686E-01         2.05766E+02         9.99995E-01         1.78511E+00         2.05723E+02         1.34066E+02         7.16574E+01
+          9.19421E-03         1.02132E-02        -5.54987E-03         5.77659E-01         8.61037E-01         5.77686E-01         1.97538E+02         9.99995E-01         1.74585E+00         1.97494E+02         1.27503E+02         6.99915E+01
+          9.19421E-03         1.03830E-02        -5.65975E-03         5.77658E-01         8.71707E-01         5.77686E-01         1.89541E+02         9.99995E-01         1.70800E+00         1.89497E+02         1.21103E+02         6.83938E+01
+          9.19421E-03         1.05528E-02        -5.77145E-03         5.77657E-01         8.82378E-01         5.77686E-01         1.81775E+02         9.99995E-01         1.67152E+00         1.81731E+02         1.14872E+02         6.68589E+01
+          9.19421E-03         1.07227E-02        -5.88497E-03         5.77656E-01         8.93048E-01         5.77686E-01         1.74238E+02         9.99995E-01         1.63638E+00         1.74193E+02         1.08811E+02         6.53818E+01
+          9.19421E-03         1.08925E-02        -6.00029E-03         5.77655E-01         9.03719E-01         5.77686E-01         1.66927E+02         9.99995E-01         1.60256E+00         1.66882E+02         1.02925E+02         6.39576E+01
+          9.19421E-03         1.10623E-02        -6.11743E-03         5.77654E-01         9.14389E-01         5.77686E-01         1.59841E+02         9.99995E-01         1.57002E+00         1.59796E+02         9.72146E+01         6.25817E+01
+          9.19421E-03         1.12321E-02        -6.23638E-03         5.77653E-01         9.25060E-01         5.77686E-01         1.52978E+02         9.99995E-01         1.53874E+00         1.52933E+02         9.16834E+01         6.12495E+01
+          9.19421E-03         1.14020E-02        -6.35714E-03         5.77652E-01         9.35731E-01         5.77687E-01         1.46334E+02         9.99995E-01         1.50868E+00         1.46290E+02         8.63329E+01         5.99567E+01
+          9.19421E-03         1.15718E-02        -6.47971E-03         5.77650E-01         9.46401E-01         5.77687E-01         1.39908E+02         9.99995E-01         1.47981E+00         1.39864E+02         8.11646E+01         5.86993E+01
+          9.19421E-03         1.17416E-02        -6.60410E-03         5.77649E-01         9.57072E-01         5.77687E-01         1.33697E+02         9.99995E-01         1.45211E+00         1.33653E+02         7.61798E+01         5.74734E+01
+          9.19421E-03         1.19114E-02        -6.73030E-03         5.77648E-01         9.67742E-01         5.77687E-01         1.27698E+02         9.99995E-01         1.42554E+00         1.27655E+02         7.13791E+01         5.62755E+01
+          9.19421E-03         1.20813E-02        -6.85831E-03         5.77647E-01         9.78413E-01         5.77688E-01         1.21908E+02         9.99995E-01         1.40008E+00         1.21865E+02         6.67631E+01         5.51022E+01
+          9.19421E-03         1.22511E-02        -6.98814E-03         5.77646E-01         9.89083E-01         5.77688E-01         1.16324E+02         9.99995E-01         1.37569E+00         1.16282E+02         6.23318E+01         5.39506E+01
+          9.19421E-03         1.24209E-02        -7.11977E-03         5.77645E-01         9.99754E-01         5.77688E-01         1.10944E+02         9.99995E-01         1.35235E+00         1.10903E+02         5.80850E+01         5.28178E+01
+          9.19421E-03         1.25908E-02        -7.25322E-03         5.77643E-01         1.01042E+00         5.77689E-01         1.05763E+02         9.99995E-01         1.33003E+00         1.05723E+02         5.40221E+01         5.17013E+01
+          9.19421E-03         1.27606E-02        -7.38848E-03         5.77642E-01         1.02110E+00         5.77689E-01         1.00780E+02         9.99995E-01         1.30871E+00         1.00741E+02         5.01422E+01         5.05989E+01
+          9.19421E-03         1.29304E-02        -7.52556E-03         5.77641E-01         1.03177E+00         5.77690E-01         9.59900E+01         9.99995E-01         1.28834E+00         9.59526E+01         4.64440E+01         4.95086E+01
+          9.19421E-03         1.31002E-02        -7.66445E-03         5.77640E-01         1.04244E+00         5.77690E-01         9.13909E+01         9.99995E-01         1.26892E+00         9.13547E+01         4.29261E+01         4.84287E+01
+          9.19421E-03         1.32701E-02        -7.80515E-03         5.77638E-01         1.05311E+00         5.77691E-01         8.69789E+01         9.99995E-01         1.25040E+00         8.69441E+01         3.95864E+01         4.73577E+01
+          9.19421E-03         1.34399E-02        -7.94766E-03         5.77637E-01         1.06378E+00         5.77692E-01         8.27507E+01         9.99995E-01         1.23277E+00         8.27175E+01         3.64230E+01         4.62945E+01
+          9.19421E-03         1.36097E-02        -8.09198E-03         5.77636E-01         1.07445E+00         5.77692E-01         7.87030E+01         9.99995E-01         1.21600E+00         7.86713E+01         3.34332E+01         4.52381E+01
+          9.19421E-03         1.37795E-02        -8.23812E-03         5.77634E-01         1.08512E+00         5.77693E-01         7.48324E+01         9.99995E-01         1.20005E+00         7.48023E+01         3.06144E+01         4.41879E+01
+          9.19421E-03         1.39494E-02        -8.38607E-03         5.77633E-01         1.09579E+00         5.77694E-01         7.11353E+01         9.99995E-01         1.18491E+00         7.11069E+01         2.79636E+01         4.31432E+01
+          9.19421E-03         1.41192E-02        -8.53583E-03         5.77632E-01         1.10646E+00         5.77695E-01         6.76084E+01         9.99995E-01         1.17055E+00         6.75817E+01         2.54776E+01         4.21040E+01
+          9.19421E-03         1.42890E-02        -8.68741E-03         5.77630E-01         1.11713E+00         5.77695E-01         6.42481E+01         9.99995E-01         1.15694E+00         6.42232E+01         2.31529E+01         4.10702E+01
+          9.19421E-03         1.44589E-02        -8.84079E-03         5.77629E-01         1.12780E+00         5.77696E-01         6.10510E+01         9.99995E-01         1.14406E+00         6.10278E+01         2.09859E+01         4.00420E+01
+          9.19421E-03         1.46287E-02        -8.99599E-03         5.77627E-01         1.13847E+00         5.77697E-01         5.80135E+01         9.99995E-01         1.13187E+00         5.79921E+01         1.89725E+01         3.90196E+01
+          9.19421E-03         1.47985E-02        -9.15301E-03         5.77626E-01         1.14914E+00         5.77698E-01         5.51320E+01         9.99995E-01         1.12036E+00         5.51125E+01         1.71089E+01         3.80037E+01
+          9.19421E-03         1.49683E-02        -9.31183E-03         5.77624E-01         1.15981E+00         5.77699E-01         5.24030E+01         9.99995E-01         1.10949E+00         5.23854E+01         1.53906E+01         3.69948E+01
+          9.19421E-03         1.51382E-02        -9.47247E-03         5.77623E-01         1.17048E+00         5.77701E-01         4.98229E+01         9.99995E-01         1.09925E+00         4.98073E+01         1.38133E+01         3.59939E+01
+          9.19421E-03         1.53080E-02        -9.63492E-03         5.77621E-01         1.18115E+00         5.77702E-01         4.73881E+01         9.99995E-01         1.08959E+00         4.73744E+01         1.23725E+01         3.50019E+01
+          9.19421E-03         1.54778E-02        -9.79918E-03         5.77620E-01         1.19182E+00         5.77703E-01         4.50950E+01         9.99995E-01         1.08050E+00         4.50833E+01         1.10634E+01         3.40199E+01
+          9.19421E-03         1.56476E-02        -9.96526E-03         5.77618E-01         1.20249E+00         5.77704E-01         4.29400E+01         9.99995E-01         1.07194E+00         4.29302E+01         9.88123E+00         3.30490E+01
+          9.19421E-03         1.58175E-02        -1.01332E-02         5.77617E-01         1.21317E+00         5.77706E-01         4.09195E+01         9.99995E-01         1.06390E+00         4.09116E+01         8.82111E+00         3.20905E+01
+          9.19421E-03         1.59873E-02        -1.03029E-02         5.77615E-01         1.22384E+00         5.77707E-01         3.90297E+01         9.99995E-01         1.05633E+00         3.90238E+01         7.87805E+00         3.11457E+01
+          9.19421E-03         1.61571E-02        -1.04744E-02         5.77614E-01         1.23451E+00         5.77709E-01         3.72670E+01         9.99995E-01         1.04923E+00         3.72630E+01         7.04701E+00         3.02160E+01
+          9.19421E-03         1.63270E-02        -1.06477E-02         5.77612E-01         1.24518E+00         5.77710E-01         3.56278E+01         9.99995E-01         1.04255E+00         3.56257E+01         6.32290E+00         2.93028E+01
+          9.19421E-03         1.64968E-02        -1.08228E-02         5.77610E-01         1.25585E+00         5.77712E-01         3.41083E+01         9.99995E-01         1.03627E+00         3.41081E+01         5.70057E+00         2.84075E+01
+          9.19421E-03         1.66666E-02        -1.09998E-02         5.77609E-01         1.26652E+00         5.77714E-01         3.27049E+01         9.99995E-01         1.03037E+00         3.27065E+01         5.17489E+00         2.75316E+01
+          9.19421E-03         1.68364E-02        -1.11786E-02         5.77607E-01         1.27719E+00         5.77715E-01         3.14138E+01         9.99995E-01         1.02482E+00         3.14172E+01         4.74068E+00         2.66765E+01
+          9.19421E-03         1.70063E-02        -1.13591E-02         5.77606E-01         1.28786E+00         5.77717E-01         3.02313E+01         9.99995E-01         1.01959E+00         3.02365E+01         4.39281E+00         2.58437E+01
+          9.19421E-03         1.71761E-02        -1.15415E-02         5.77604E-01         1.29853E+00         5.77719E-01         2.91536E+01         9.99995E-01         1.01466E+00         2.91606E+01         4.12614E+00         2.50344E+01
+          9.19421E-03         1.73459E-02        -1.17257E-02         5.77602E-01         1.30920E+00         5.77721E-01         2.81771E+01         9.99995E-01         1.01000E+00         2.81857E+01         3.93558E+00         2.42501E+01
+          9.19421E-03         1.75158E-02        -1.19117E-02         5.77600E-01         1.31987E+00         5.77723E-01         2.72979E+01         9.99995E-01         1.00558E+00         2.73082E+01         3.81609E+00         2.34921E+01
+          9.19421E-03         1.76856E-02        -1.20996E-02         5.77599E-01         1.33054E+00         5.77725E-01         2.65123E+01         9.99995E-01         1.00139E+00         2.65242E+01         3.76269E+00         2.27615E+01
+          9.19421E-03         1.78554E-02        -1.22892E-02         5.77597E-01         1.34121E+00         5.77728E-01         2.58166E+01         9.99995E-01         9.97394E-01         2.58300E+01         3.77046E+00         2.20595E+01
+          9.19421E-03         1.80252E-02        -1.24807E-02         5.77595E-01         1.35188E+00         5.77730E-01         2.52070E+01         9.99995E-01         9.93576E-01         2.52218E+01         3.83458E+00         2.13872E+01
+          9.19421E-03         1.81951E-02        -1.26739E-02         5.77593E-01         1.36255E+00         5.77732E-01         2.46796E+01         9.99995E-01         9.89912E-01         2.46958E+01         3.95031E+00         2.07455E+01
+          9.19421E-03         1.83649E-02        -1.28690E-02         5.77592E-01         1.37322E+00         5.77735E-01         2.42309E+01         9.99995E-01         9.86382E-01         2.42484E+01         4.11303E+00         2.01354E+01
+          9.19421E-03         1.85347E-02        -1.30659E-02         5.77590E-01         1.38389E+00         5.77738E-01         2.38569E+01         9.99995E-01         9.82963E-01         2.38757E+01         4.31822E+00         1.95575E+01
+          9.19421E-03         1.87045E-02        -1.32646E-02         5.77588E-01         1.39457E+00         5.77740E-01         2.35540E+01         9.99995E-01         9.79637E-01         2.35740E+01         4.56148E+00         1.90125E+01
+          9.19421E-03         1.88744E-02        -1.34652E-02         5.77586E-01         1.40524E+00         5.77743E-01         2.33185E+01         9.99995E-01         9.76385E-01         2.33395E+01         4.83855E+00         1.85010E+01
+          9.19421E-03         1.90442E-02        -1.36675E-02         5.77584E-01         1.41591E+00         5.77746E-01         2.31465E+01         9.99995E-01         9.73189E-01         2.31686E+01         5.14531E+00         1.80233E+01
+          9.19421E-03         1.92140E-02        -1.38716E-02         5.77582E-01         1.42658E+00         5.77749E-01         2.30345E+01         9.99995E-01         9.70031E-01         2.30575E+01         5.47776E+00         1.75797E+01
+          9.19421E-03         1.93839E-02        -1.40776E-02         5.77581E-01         1.43725E+00         5.77752E-01         2.29787E+01         9.99995E-01         9.66897E-01         2.30026E+01         5.83209E+00         1.71705E+01
+          9.19421E-03         1.95537E-02        -1.42854E-02         5.77579E-01         1.44792E+00         5.77755E-01         2.29755E+01         9.99995E-01         9.63769E-01         2.30002E+01         6.20460E+00         1.67956E+01
+          9.19421E-03         1.97235E-02        -1.44950E-02         5.77577E-01         1.45859E+00         5.77759E-01         2.30214E+01         9.99995E-01         9.60635E-01         2.30468E+01         6.59178E+00         1.64550E+01
+          9.19421E-03         1.98933E-02        -1.47064E-02         5.77575E-01         1.46926E+00         5.77762E-01         2.31126E+01         9.99995E-01         9.57480E-01         2.31386E+01         6.99027E+00         1.61484E+01
+          9.19421E-03         2.00632E-02        -1.49196E-02         5.77573E-01         1.47993E+00         5.77765E-01         2.32457E+01         9.99995E-01         9.54293E-01         2.32723E+01         7.39688E+00         1.58755E+01
+          9.19421E-03         2.02330E-02        -1.51346E-02         5.77571E-01         1.49060E+00         5.77769E-01         2.34173E+01         9.99995E-01         9.51061E-01         2.34443E+01         7.80858E+00         1.56357E+01
+          9.19421E-03         2.04028E-02        -1.53514E-02         5.77569E-01         1.50127E+00         5.77773E-01         2.36238E+01         9.99995E-01         9.47773E-01         2.36512E+01         8.22253E+00         1.54287E+01
+          9.19421E-03         2.05726E-02        -1.55701E-02         5.77567E-01         1.51194E+00         5.77777E-01         2.38618E+01         9.99995E-01         9.44420E-01         2.38896E+01         8.63604E+00         1.52536E+01
+          9.19421E-03         2.07425E-02        -1.57905E-02         5.77565E-01         1.52261E+00         5.77781E-01         2.41282E+01         9.99995E-01         9.40992E-01         2.41562E+01         9.04661E+00         1.51096E+01
+          9.19421E-03         2.09123E-02        -1.60128E-02         5.77563E-01         1.53328E+00         5.77785E-01         2.44195E+01         9.99995E-01         9.37482E-01         2.44476E+01         9.45188E+00         1.49958E+01
+          9.19421E-03         2.10821E-02        -1.62369E-02         5.77561E-01         1.54395E+00         5.77789E-01         2.47327E+01         9.99995E-01         9.33881E-01         2.47609E+01         9.84970E+00         1.49112E+01
+          9.19421E-03         2.12520E-02        -1.64628E-02         5.77559E-01         1.55462E+00         5.77793E-01         2.50645E+01         9.99995E-01         9.30182E-01         2.50927E+01         1.02381E+01         1.48547E+01
+          9.19421E-03         2.14218E-02        -1.66905E-02         5.77557E-01         1.56529E+00         5.77798E-01         2.54120E+01         9.99995E-01         9.26381E-01         2.54402E+01         1.06152E+01         1.48250E+01
+          9.19421E-03         2.15916E-02        -1.69201E-02         5.77554E-01         1.57596E+00         5.77802E-01         2.57723E+01         9.99995E-01         9.22471E-01         2.58003E+01         1.09793E+01         1.48210E+01
+          9.19421E-03         2.17614E-02        -1.71514E-02         5.77552E-01         1.58664E+00         5.77807E-01         2.61424E+01         9.99995E-01         9.18447E-01         2.61701E+01         1.13290E+01         1.48412E+01
+          9.19421E-03         2.19313E-02        -1.73846E-02         5.77550E-01         1.59731E+00         5.77812E-01         2.65196E+01         9.99995E-01         9.14306E-01         2.65470E+01         1.16628E+01         1.48842E+01
+          9.19421E-03         2.21011E-02        -1.76196E-02         5.77548E-01         1.60798E+00         5.77817E-01         2.69012E+01         9.99995E-01         9.10045E-01         2.69283E+01         1.19797E+01         1.49485E+01
+          9.19421E-03         2.22709E-02        -1.78563E-02         5.77546E-01         1.61865E+00         5.77822E-01         2.72846E+01         9.99995E-01         9.05659E-01         2.73113E+01         1.22786E+01         1.50327E+01
+          9.19421E-03         2.24407E-02        -1.80949E-02         5.77544E-01         1.62932E+00         5.77827E-01         2.76674E+01         9.99995E-01         9.01148E-01         2.76936E+01         1.25586E+01         1.51350E+01
+          9.19421E-03         2.26106E-02        -1.83353E-02         5.77541E-01         1.63999E+00         5.77832E-01         2.80472E+01         9.99995E-01         8.96510E-01         2.80729E+01         1.28189E+01         1.52540E+01
+          9.19421E-03         2.27804E-02        -1.85776E-02         5.77539E-01         1.65066E+00         5.77838E-01         2.84218E+01         9.99995E-01         8.91743E-01         2.84469E+01         1.30589E+01         1.53880E+01
+          9.19421E-03         2.29502E-02        -1.88216E-02         5.77537E-01         1.66133E+00         5.77844E-01         2.87890E+01         9.99995E-01         8.86846E-01         2.88134E+01         1.32782E+01         1.55352E+01
+          9.19421E-03         2.31201E-02        -1.90675E-02         5.77535E-01         1.67200E+00         5.77849E-01         2.91468E+01         9.99995E-01         8.81821E-01         2.91705E+01         1.34763E+01         1.56942E+01
+          9.19421E-03         2.32899E-02        -1.93151E-02         5.77532E-01         1.68267E+00         5.77855E-01         2.94933E+01         9.99995E-01         8.76666E-01         2.95162E+01         1.36532E+01         1.58630E+01
+          9.19421E-03         2.34597E-02        -1.95646E-02         5.77530E-01         1.69334E+00         5.77861E-01         2.98266E+01         9.99995E-01         8.71382E-01         2.98488E+01         1.38085E+01         1.60403E+01
+          9.19421E-03         2.36295E-02        -1.98159E-02         5.77528E-01         1.70401E+00         5.77868E-01         3.01452E+01         9.99995E-01         8.65971E-01         3.01666E+01         1.39424E+01         1.62241E+01
+          9.19421E-03         2.37994E-02        -2.00690E-02         5.77525E-01         1.71468E+00         5.77874E-01         3.04475E+01         9.99995E-01         8.60434E-01         3.04680E+01         1.40550E+01         1.64130E+01
+          9.19421E-03         2.39692E-02        -2.03239E-02         5.77523E-01         1.72535E+00         5.77881E-01         3.07321E+01         9.99995E-01         8.54773E-01         3.07516E+01         1.41463E+01         1.66053E+01
+          9.19421E-03         2.41390E-02        -2.05807E-02         5.77521E-01         1.73602E+00         5.77887E-01         3.09976E+01         9.99995E-01         8.48990E-01         3.10162E+01         1.42167E+01         1.67995E+01
+          9.19421E-03         2.43088E-02        -2.08392E-02         5.77518E-01         1.74669E+00         5.77894E-01         3.12429E+01         9.99995E-01         8.43087E-01         3.12606E+01         1.42666E+01         1.69940E+01
+          9.19421E-03         2.44787E-02        -2.10996E-02         5.77516E-01         1.75736E+00         5.77901E-01         3.14670E+01         9.99995E-01         8.37066E-01         3.14837E+01         1.42963E+01         1.71873E+01
+          9.19421E-03         2.46485E-02        -2.13618E-02         5.77514E-01         1.76804E+00         5.77909E-01         3.16689E+01         9.99995E-01         8.30932E-01         3.16846E+01         1.43065E+01         1.73781E+01
+          9.19421E-03         2.48183E-02        -2.16257E-02         5.77511E-01         1.77871E+00         5.77916E-01         3.18478E+01         9.99995E-01         8.24686E-01         3.18624E+01         1.42976E+01         1.75649E+01
+          9.19421E-03         2.49882E-02        -2.18915E-02         5.77509E-01         1.78938E+00         5.77923E-01         3.20030E+01         9.99995E-01         8.18333E-01         3.20166E+01         1.42702E+01         1.77464E+01
+          9.19421E-03         2.51580E-02        -2.21592E-02         5.77506E-01         1.80005E+00         5.77931E-01         3.21340E+01         9.99995E-01         8.11876E-01         3.21465E+01         1.42252E+01         1.79214E+01
+          9.19421E-03         2.53278E-02        -2.24286E-02         5.77504E-01         1.81072E+00         5.77939E-01         3.22403E+01         9.99995E-01         8.05319E-01         3.22518E+01         1.41631E+01         1.80887E+01
+          9.19421E-03         2.54976E-02        -2.26998E-02         5.77501E-01         1.82139E+00         5.77947E-01         3.23216E+01         9.99995E-01         7.98666E-01         3.23320E+01         1.40848E+01         1.82472E+01
+          9.19421E-03         2.56675E-02        -2.29729E-02         5.77499E-01         1.83206E+00         5.77956E-01         3.23776E+01         9.99995E-01         7.91921E-01         3.23869E+01         1.39910E+01         1.83959E+01
+          9.19421E-03         2.58373E-02        -2.32478E-02         5.77496E-01         1.84273E+00         5.77964E-01         3.24082E+01         9.99995E-01         7.85087E-01         3.24164E+01         1.38826E+01         1.85338E+01
+          9.19421E-03         2.60071E-02        -2.35245E-02         5.77494E-01         1.85340E+00         5.77973E-01         3.24134E+01         9.99995E-01         7.78171E-01         3.24206E+01         1.37604E+01         1.86601E+01
+          9.19421E-03         2.61769E-02        -2.38030E-02         5.77491E-01         1.86407E+00         5.77981E-01         3.23933E+01         9.99995E-01         7.71175E-01         3.23994E+01         1.36253E+01         1.87741E+01
+          9.36403E-03         8.72665E-04        -2.39590E-03         5.88359E-01         2.74155E-01         5.88364E-01         8.06892E+02         9.99997E-01         4.57588E+00         8.06988E+02         4.45785E+02         3.61203E+02
+          9.36403E-03         1.04249E-03        -2.40612E-03         5.88359E-01         2.84826E-01         5.88364E-01         7.95501E+02         9.99997E-01         4.51501E+00         7.95594E+02         4.41923E+02         3.53671E+02
+          9.36403E-03         1.21232E-03        -2.41815E-03         5.88359E-01         2.95496E-01         5.88364E-01         7.83858E+02         9.99997E-01         4.45284E+00         7.83949E+02         4.37916E+02         3.46033E+02
+          9.36403E-03         1.38215E-03        -2.43199E-03         5.88359E-01         3.06167E-01         5.88364E-01         7.71981E+02         9.99997E-01         4.38946E+00         7.72069E+02         4.33764E+02         3.38305E+02
+          9.36403E-03         1.55197E-03        -2.44764E-03         5.88359E-01         3.16838E-01         5.88364E-01         7.59886E+02         9.99997E-01         4.32498E+00         7.59972E+02         4.29469E+02         3.30503E+02
+          9.36403E-03         1.72180E-03        -2.46511E-03         5.88359E-01         3.27508E-01         5.88364E-01         7.47592E+02         9.99997E-01         4.25949E+00         7.47676E+02         4.25033E+02         3.22643E+02
+          9.36403E-03         1.89163E-03        -2.48439E-03         5.88359E-01         3.38179E-01         5.88364E-01         7.35116E+02         9.99997E-01         4.19309E+00         7.35197E+02         4.20456E+02         3.14741E+02
+          9.36403E-03         2.06146E-03        -2.50548E-03         5.88358E-01         3.48849E-01         5.88364E-01         7.22474E+02         9.99997E-01         4.12588E+00         7.22553E+02         4.15741E+02         3.06811E+02
+          9.36403E-03         2.23128E-03        -2.52838E-03         5.88358E-01         3.59520E-01         5.88364E-01         7.09686E+02         9.99997E-01         4.05796E+00         7.09761E+02         4.10890E+02         2.98871E+02
+          9.36403E-03         2.40111E-03        -2.55309E-03         5.88358E-01         3.70190E-01         5.88364E-01         6.96766E+02         9.99997E-01         3.98943E+00         6.96839E+02         4.05906E+02         2.90934E+02
+          9.36403E-03         2.57094E-03        -2.57962E-03         5.88358E-01         3.80861E-01         5.88363E-01         6.83734E+02         9.99997E-01         3.92039E+00         6.83804E+02         4.00790E+02         2.83015E+02
+          9.36403E-03         2.74077E-03        -2.60796E-03         5.88357E-01         3.91532E-01         5.88363E-01         6.70605E+02         9.99997E-01         3.85094E+00         6.70673E+02         3.95545E+02         2.75128E+02
+          9.36403E-03         2.91059E-03        -2.63811E-03         5.88357E-01         4.02202E-01         5.88363E-01         6.57397E+02         9.99997E-01         3.78117E+00         6.57461E+02         3.90174E+02         2.67287E+02
+          9.36403E-03         3.08042E-03        -2.67007E-03         5.88357E-01         4.12873E-01         5.88363E-01         6.44125E+02         9.99997E-01         3.71117E+00         6.44187E+02         3.84682E+02         2.59505E+02
+          9.36403E-03         3.25025E-03        -2.70385E-03         5.88357E-01         4.23543E-01         5.88363E-01         6.30806E+02         9.99997E-01         3.64104E+00         6.30865E+02         3.79070E+02         2.51795E+02
+          9.36403E-03         3.42008E-03        -2.73943E-03         5.88356E-01         4.34214E-01         5.88363E-01         6.17455E+02         9.99997E-01         3.57087E+00         6.17511E+02         3.73342E+02         2.44169E+02
+          9.36403E-03         3.58990E-03        -2.77683E-03         5.88356E-01         4.44884E-01         5.88362E-01         6.04089E+02         9.99997E-01         3.50076E+00         6.04142E+02         3.67504E+02         2.36638E+02
+          9.36403E-03         3.75973E-03        -2.81604E-03         5.88356E-01         4.55555E-01         5.88362E-01         5.90721E+02         9.99997E-01         3.43078E+00         5.90771E+02         3.61557E+02         2.29214E+02
+          9.36403E-03         3.92956E-03        -2.85706E-03         5.88355E-01         4.66225E-01         5.88362E-01         5.77366E+02         9.99997E-01         3.36103E+00         5.77413E+02         3.55508E+02         2.21905E+02
+          9.36403E-03         4.09939E-03        -2.89990E-03         5.88355E-01         4.76896E-01         5.88362E-01         5.64039E+02         9.99997E-01         3.29158E+00         5.64083E+02         3.49360E+02         2.14723E+02
+          9.36403E-03         4.26921E-03        -2.94455E-03         5.88354E-01         4.87567E-01         5.88362E-01         5.50753E+02         9.99997E-01         3.22252E+00         5.50794E+02         3.43118E+02         2.07676E+02
+          9.36403E-03         4.43904E-03        -2.99101E-03         5.88354E-01         4.98237E-01         5.88361E-01         5.37521E+02         9.99997E-01         3.15393E+00         5.37560E+02         3.36788E+02         2.00772E+02
+          9.36403E-03         4.60887E-03        -3.03928E-03         5.88353E-01         5.08908E-01         5.88361E-01         5.24357E+02         9.99997E-01         3.08587E+00         5.24393E+02         3.30374E+02         1.94019E+02
+          9.36403E-03         4.77869E-03        -3.08936E-03         5.88353E-01         5.19578E-01         5.88361E-01         5.11272E+02         9.99997E-01         3.01842E+00         5.11305E+02         3.23882E+02         1.87423E+02
+          9.36403E-03         4.94852E-03        -3.14126E-03         5.88352E-01         5.30249E-01         5.88361E-01         4.98278E+02         9.99997E-01         2.95165E+00         4.98308E+02         3.17317E+02         1.80991E+02
+          9.36403E-03         5.11835E-03        -3.19497E-03         5.88352E-01         5.40919E-01         5.88361E-01         4.85386E+02         9.99997E-01         2.88562E+00         4.85413E+02         3.10686E+02         1.74727E+02
+          9.36403E-03         5.28818E-03        -3.25049E-03         5.88351E-01         5.51590E-01         5.88360E-01         4.72606E+02         9.99997E-01         2.82039E+00         4.72631E+02         3.03994E+02         1.68637E+02
+          9.36403E-03         5.45800E-03        -3.30782E-03         5.88351E-01         5.62261E-01         5.88360E-01         4.59950E+02         9.99997E-01         2.75602E+00         4.59971E+02         2.97247E+02         1.62725E+02
+          9.36403E-03         5.62783E-03        -3.36696E-03         5.88350E-01         5.72931E-01         5.88360E-01         4.47426E+02         9.99997E-01         2.69257E+00         4.47444E+02         2.90452E+02         1.56993E+02
+          9.36403E-03         5.79766E-03        -3.42792E-03         5.88350E-01         5.83602E-01         5.88360E-01         4.35042E+02         9.99997E-01         2.63008E+00         4.35058E+02         2.83614E+02         1.51444E+02
+          9.36403E-03         5.96749E-03        -3.49069E-03         5.88349E-01         5.94272E-01         5.88360E-01         4.22809E+02         9.99997E-01         2.56860E+00         4.22822E+02         2.76742E+02         1.46081E+02
+          9.36403E-03         6.13731E-03        -3.55527E-03         5.88349E-01         6.04943E-01         5.88359E-01         4.10732E+02         9.99997E-01         2.50818E+00         4.10743E+02         2.69840E+02         1.40903E+02
+          9.36403E-03         6.30714E-03        -3.62166E-03         5.88348E-01         6.15613E-01         5.88359E-01         3.98821E+02         9.99997E-01         2.44885E+00         3.98829E+02         2.62917E+02         1.35913E+02
+          9.36403E-03         6.47697E-03        -3.68987E-03         5.88347E-01         6.26284E-01         5.88359E-01         3.87080E+02         9.99997E-01         2.39065E+00         3.87086E+02         2.55978E+02         1.31109E+02
+          9.36403E-03         6.64680E-03        -3.75988E-03         5.88347E-01         6.36955E-01         5.88359E-01         3.75518E+02         9.99997E-01         2.33361E+00         3.75521E+02         2.49030E+02         1.26491E+02
+          9.36403E-03         6.81662E-03        -3.83171E-03         5.88346E-01         6.47625E-01         5.88358E-01         3.64138E+02         9.99997E-01         2.27776E+00         3.64139E+02         2.42082E+02         1.22057E+02
+          9.36403E-03         6.98645E-03        -3.90536E-03         5.88345E-01         6.58296E-01         5.88358E-01         3.52947E+02         9.99997E-01         2.22313E+00         3.52945E+02         2.35138E+02         1.17807E+02
+          9.36403E-03         7.15628E-03        -3.98081E-03         5.88345E-01         6.68966E-01         5.88358E-01         3.41948E+02         9.99997E-01         2.16973E+00         3.41944E+02         2.28207E+02         1.13737E+02
+          9.36403E-03         7.32611E-03        -4.05808E-03         5.88344E-01         6.79637E-01         5.88358E-01         3.31147E+02         9.99997E-01         2.11758E+00         3.31141E+02         2.21296E+02         1.09845E+02
+          9.36403E-03         7.49593E-03        -4.13715E-03         5.88343E-01         6.90307E-01         5.88358E-01         3.20546E+02         9.99997E-01         2.06670E+00         3.20538E+02         2.14411E+02         1.06127E+02
+          9.36403E-03         7.66576E-03        -4.21805E-03         5.88342E-01         7.00978E-01         5.88357E-01         3.10148E+02         9.99997E-01         2.01709E+00         3.10139E+02         2.07559E+02         1.02580E+02
+          9.36403E-03         7.83559E-03        -4.30075E-03         5.88342E-01         7.11649E-01         5.88357E-01         2.99958E+02         9.99997E-01         1.96877E+00         2.99946E+02         2.00747E+02         9.91987E+01
+          9.36403E-03         8.00542E-03        -4.38526E-03         5.88341E-01         7.22319E-01         5.88357E-01         2.89976E+02         9.99997E-01         1.92174E+00         2.89962E+02         1.93982E+02         9.59797E+01
+          9.36403E-03         8.17524E-03        -4.47159E-03         5.88340E-01         7.32990E-01         5.88357E-01         2.80204E+02         9.99997E-01         1.87599E+00         2.80189E+02         1.87271E+02         9.29177E+01
+          9.36403E-03         8.34507E-03        -4.55973E-03         5.88339E-01         7.43660E-01         5.88357E-01         2.70644E+02         9.99997E-01         1.83153E+00         2.70627E+02         1.80620E+02         9.00075E+01
+          9.36403E-03         8.51490E-03        -4.64968E-03         5.88338E-01         7.54331E-01         5.88357E-01         2.61298E+02         9.99997E-01         1.78836E+00         2.61279E+02         1.74035E+02         8.72438E+01
+          9.36403E-03         8.68473E-03        -4.74145E-03         5.88337E-01         7.65001E-01         5.88357E-01         2.52165E+02         9.99997E-01         1.74646E+00         2.52145E+02         1.67524E+02         8.46209E+01
+          9.36403E-03         8.85455E-03        -4.83502E-03         5.88337E-01         7.75672E-01         5.88356E-01         2.43246E+02         9.99997E-01         1.70583E+00         2.43224E+02         1.61091E+02         8.21329E+01
+          9.36403E-03         9.02438E-03        -4.93041E-03         5.88336E-01         7.86343E-01         5.88356E-01         2.34541E+02         9.99997E-01         1.66646E+00         2.34518E+02         1.54744E+02         7.97739E+01
+          9.36403E-03         9.19421E-03        -5.02761E-03         5.88335E-01         7.97013E-01         5.88356E-01         2.26049E+02         9.99997E-01         1.62833E+00         2.26025E+02         1.48488E+02         7.75377E+01
+          9.36403E-03         9.36403E-03        -5.12663E-03         5.88334E-01         8.07684E-01         5.88356E-01         2.17771E+02         9.99997E-01         1.59143E+00         2.17746E+02         1.42328E+02         7.54180E+01
+          9.36403E-03         9.53386E-03        -5.22745E-03         5.88333E-01         8.18354E-01         5.88356E-01         2.09705E+02         9.99997E-01         1.55573E+00         2.09678E+02         1.36270E+02         7.34087E+01
+          9.36403E-03         9.70369E-03        -5.33009E-03         5.88332E-01         8.29025E-01         5.88356E-01         2.01849E+02         9.99997E-01         1.52123E+00         2.01822E+02         1.30319E+02         7.15034E+01
+          9.36403E-03         9.87352E-03        -5.43454E-03         5.88331E-01         8.39695E-01         5.88356E-01         1.94204E+02         9.99997E-01         1.48791E+00         1.94176E+02         1.24480E+02         6.96958E+01
+          9.36403E-03         1.00433E-02        -5.54080E-03         5.88330E-01         8.50366E-01         5.88356E-01         1.86766E+02         9.99997E-01         1.45573E+00         1.86738E+02         1.18758E+02         6.79796E+01
+          9.36403E-03         1.02132E-02        -5.64888E-03         5.88329E-01         8.61037E-01         5.88356E-01         1.79535E+02         9.99997E-01         1.42469E+00         1.79506E+02         1.13157E+02         6.63487E+01
+          9.36403E-03         1.03830E-02        -5.75877E-03         5.88328E-01         8.71707E-01         5.88356E-01         1.72508E+02         9.99997E-01         1.39475E+00         1.72479E+02         1.07682E+02         6.47968E+01
+          9.36403E-03         1.05528E-02        -5.87047E-03         5.88327E-01         8.82378E-01         5.88356E-01         1.65684E+02         9.99997E-01         1.36590E+00         1.65654E+02         1.02335E+02         6.33182E+01
+          9.36403E-03         1.07227E-02        -5.98398E-03         5.88326E-01         8.93048E-01         5.88356E-01         1.59059E+02         9.99997E-01         1.33812E+00         1.59029E+02         9.71219E+01         6.19068E+01
+          9.36403E-03         1.08925E-02        -6.09930E-03         5.88325E-01         9.03719E-01         5.88356E-01         1.52632E+02         9.99997E-01         1.31137E+00         1.52601E+02         9.20445E+01         6.05570E+01
+          9.36403E-03         1.10623E-02        -6.21644E-03         5.88324E-01         9.14389E-01         5.88357E-01         1.46400E+02         9.99997E-01         1.28564E+00         1.46369E+02         8.71062E+01         5.92632E+01
+          9.36403E-03         1.12321E-02        -6.33539E-03         5.88323E-01         9.25060E-01         5.88357E-01         1.40361E+02         9.99997E-01         1.26090E+00         1.40330E+02         8.23097E+01         5.80203E+01
+          9.36403E-03         1.14020E-02        -6.45615E-03         5.88321E-01         9.35731E-01         5.88357E-01         1.34512E+02         9.99997E-01         1.23712E+00         1.34481E+02         7.76574E+01         5.68231E+01
+          9.36403E-03         1.15718E-02        -6.57873E-03         5.88320E-01         9.46401E-01         5.88357E-01         1.28849E+02         9.99997E-01         1.21429E+00         1.28818E+02         7.31515E+01         5.56667E+01
+          9.36403E-03         1.17416E-02        -6.70311E-03         5.88319E-01         9.57072E-01         5.88357E-01         1.23371E+02         9.99997E-01         1.19238E+00         1.23340E+02         6.87935E+01         5.45466E+01
+          9.36403E-03         1.19114E-02        -6.82931E-03         5.88318E-01         9.67742E-01         5.88358E-01         1.18074E+02         9.99997E-01         1.17137E+00         1.18044E+02         6.45851E+01         5.34585E+01
+          9.36403E-03         1.20813E-02        -6.95732E-03         5.88317E-01         9.78413E-01         5.88358E-01         1.12956E+02         9.99997E-01         1.15123E+00         1.12926E+02         6.05274E+01         5.23982E+01
+          9.36403E-03         1.22511E-02        -7.08715E-03         5.88316E-01         9.89083E-01         5.88358E-01         1.08013E+02         9.99997E-01         1.13194E+00         1.07983E+02         5.66212E+01         5.13620E+01
+          9.36403E-03         1.24209E-02        -7.21878E-03         5.88314E-01         9.99754E-01         5.88359E-01         1.03242E+02         9.99997E-01         1.11348E+00         1.03213E+02         5.28671E+01         5.03464E+01
+          9.36403E-03         1.25908E-02        -7.35223E-03         5.88313E-01         1.01042E+00         5.88359E-01         9.86417E+01         9.99997E-01         1.09583E+00         9.86134E+01         4.92652E+01         4.93483E+01
+          9.36403E-03         1.27606E-02        -7.48749E-03         5.88312E-01         1.02110E+00         5.88359E-01         9.42076E+01         9.99997E-01         1.07896E+00         9.41801E+01         4.58155E+01         4.83646E+01
+          9.36403E-03         1.29304E-02        -7.62457E-03         5.88310E-01         1.03177E+00         5.88360E-01         8.99372E+01         9.99997E-01         1.06285E+00         8.99104E+01         4.25176E+01         4.73928E+01
+          9.36403E-03         1.31002E-02        -7.76346E-03         5.88309E-01         1.04244E+00         5.88360E-01         8.58274E+01         9.99997E-01         1.04747E+00         8.58014E+01         3.93709E+01         4.64305E+01
+          9.36403E-03         1.32701E-02        -7.90415E-03         5.88308E-01         1.05311E+00         5.88361E-01         8.18752E+01         9.99997E-01         1.03282E+00         8.18502E+01         3.63744E+01         4.54758E+01
+          9.36403E-03         1.34399E-02        -8.04667E-03         5.88307E-01         1.06378E+00         5.88362E-01         7.80778E+01         9.99997E-01         1.01886E+00         7.80537E+01         3.35268E+01         4.45269E+01
+          9.36403E-03         1.36097E-02        -8.19099E-03         5.88305E-01         1.07445E+00         5.88362E-01         7.44322E+01         9.99997E-01         1.00558E+00         7.44091E+01         3.08268E+01         4.35823E+01
+          9.36403E-03         1.37795E-02        -8.33713E-03         5.88304E-01         1.08512E+00         5.88363E-01         7.09354E+01         9.99997E-01         9.92954E-01         7.09133E+01         2.82725E+01         4.26408E+01
+          9.36403E-03         1.39494E-02        -8.48508E-03         5.88302E-01         1.09579E+00         5.88364E-01         6.75845E+01         9.99997E-01         9.80959E-01         6.75636E+01         2.58620E+01         4.17016E+01
+          9.36403E-03         1.41192E-02        -8.63484E-03         5.88301E-01         1.10646E+00         5.88364E-01         6.43766E+01         9.99997E-01         9.69575E-01         6.43568E+01         2.35929E+01         4.07639E+01
+          9.36403E-03         1.42890E-02        -8.78641E-03         5.88300E-01         1.11713E+00         5.88365E-01         6.13089E+01         9.99997E-01         9.58781E-01         6.12903E+01         2.14629E+01         3.98274E+01
+          9.36403E-03         1.44589E-02        -8.93980E-03         5.88298E-01         1.12780E+00         5.88366E-01         5.83784E+01         9.99997E-01         9.48556E-01         5.83611E+01         1.94693E+01         3.88918E+01
+          9.36403E-03         1.46287E-02        -9.09500E-03         5.88297E-01         1.13847E+00         5.88367E-01         5.55824E+01         9.99997E-01         9.38879E-01         5.55663E+01         1.76092E+01         3.79572E+01
+          9.36403E-03         1.47985E-02        -9.25201E-03         5.88295E-01         1.14914E+00         5.88368E-01         5.29180E+01         9.99997E-01         9.29728E-01         5.29032E+01         1.58794E+01         3.70238E+01
+          9.36403E-03         1.49683E-02        -9.41084E-03         5.88294E-01         1.15981E+00         5.88369E-01         5.03824E+01         9.99997E-01         9.21082E-01         5.03690E+01         1.42768E+01         3.60921E+01
+          9.36403E-03         1.51382E-02        -9.57148E-03         5.88292E-01         1.17048E+00         5.88370E-01         4.79729E+01         9.99997E-01         9.12918E-01         4.79607E+01         1.27980E+01         3.51628E+01
+          9.36403E-03         1.53080E-02        -9.73393E-03         5.88291E-01         1.18115E+00         5.88371E-01         4.56865E+01         9.99997E-01         9.05215E-01         4.56758E+01         1.14393E+01         3.42365E+01
+          9.36403E-03         1.54778E-02        -9.89819E-03         5.88289E-01         1.19182E+00         5.88372E-01         4.35207E+01         9.99997E-01         8.97952E-01         4.35113E+01         1.01970E+01         3.33143E+01
+          9.36403E-03         1.56476E-02        -1.00643E-02         5.88288E-01         1.20249E+00         5.88374E-01         4.14725E+01         9.99997E-01         8.91107E-01         4.14645E+01         9.06734E+00         3.23971E+01
+          9.36403E-03         1.58175E-02        -1.02322E-02         5.88286E-01         1.21317E+00         5.88375E-01         3.95393E+01         9.99997E-01         8.84657E-01         3.95326E+01         8.04632E+00         3.14863E+01
+          9.36403E-03         1.59873E-02        -1.04019E-02         5.88284E-01         1.22384E+00         5.88376E-01         3.77183E+01         9.99997E-01         8.78581E-01         3.77129E+01         7.12990E+00         3.05830E+01
+          9.36403E-03         1.61571E-02        -1.05734E-02         5.88283E-01         1.23451E+00         5.88378E-01         3.60067E+01         9.99997E-01         8.72858E-01         3.60027E+01         6.31396E+00         2.96888E+01
+          9.36403E-03         1.63270E-02        -1.07467E-02         5.88281E-01         1.24518E+00         5.88379E-01         3.44018E+01         9.99997E-01         8.67465E-01         3.43991E+01         5.59428E+00         2.88049E+01
+          9.36403E-03         1.64968E-02        -1.09218E-02         5.88280E-01         1.25585E+00         5.88381E-01         3.29008E+01         9.99997E-01         8.62381E-01         3.28995E+01         4.96660E+00         2.79329E+01
+          9.36403E-03         1.66666E-02        -1.10988E-02         5.88278E-01         1.26652E+00         5.88383E-01         3.15009E+01         9.99997E-01         8.57585E-01         3.15009E+01         4.42663E+00         2.70743E+01
+          9.36403E-03         1.68364E-02        -1.12776E-02         5.88276E-01         1.27719E+00         5.88384E-01         3.01995E+01         9.99997E-01         8.53056E-01         3.02008E+01         3.97003E+00         2.62307E+01
+          9.36403E-03         1.70063E-02        -1.14581E-02         5.88275E-01         1.28786E+00         5.88386E-01         2.89936E+01         9.99997E-01         8.48773E-01         2.89961E+01         3.59245E+00         2.54037E+01
+          9.36403E-03         1.71761E-02        -1.16405E-02         5.88273E-01         1.29853E+00         5.88388E-01         2.78805E+01         9.99997E-01         8.44715E-01         2.78843E+01         3.28954E+00         2.45947E+01
+          9.36403E-03         1.73459E-02        -1.18247E-02         5.88271E-01         1.30920E+00         5.88390E-01         2.68573E+01         9.99997E-01         8.40863E-01         2.68624E+01         3.05694E+00         2.38054E+01
+          9.36403E-03         1.75158E-02        -1.20107E-02         5.88269E-01         1.31987E+00         5.88392E-01         2.59214E+01         9.99997E-01         8.37197E-01         2.59276E+01         2.89034E+00         2.30373E+01
+          9.36403E-03         1.76856E-02        -1.21986E-02         5.88268E-01         1.33054E+00         5.88394E-01         2.50697E+01         9.99997E-01         8.33697E-01         2.50771E+01         2.78544E+00         2.22917E+01
+          9.36403E-03         1.78554E-02        -1.23882E-02         5.88266E-01         1.34121E+00         5.88396E-01         2.42996E+01         9.99997E-01         8.30346E-01         2.43080E+01         2.73798E+00         2.15700E+01
+          9.36403E-03         1.80252E-02        -1.25797E-02         5.88264E-01         1.35188E+00         5.88399E-01         2.36080E+01         9.99997E-01         8.27126E-01         2.36175E+01         2.74378E+00         2.08737E+01
+          9.36403E-03         1.81951E-02        -1.27729E-02         5.88262E-01         1.36255E+00         5.88401E-01         2.29921E+01         9.99997E-01         8.24018E-01         2.30026E+01         2.79870E+00         2.02039E+01
+          9.36403E-03         1.83649E-02        -1.29680E-02         5.88260E-01         1.37322E+00         5.88403E-01         2.24490E+01         9.99997E-01         8.21006E-01         2.24605E+01         2.89866E+00         1.95619E+01
+          9.36403E-03         1.85347E-02        -1.31649E-02         5.88259E-01         1.38389E+00         5.88406E-01         2.19758E+01         9.99997E-01         8.18074E-01         2.19883E+01         3.03971E+00         1.89486E+01
+          9.36403E-03         1.87045E-02        -1.33636E-02         5.88257E-01         1.39457E+00         5.88409E-01         2.15696E+01         9.99997E-01         8.15207E-01         2.15829E+01         3.21795E+00         1.83650E+01
+          9.36403E-03         1.88744E-02        -1.35642E-02         5.88255E-01         1.40524E+00         5.88411E-01         2.12274E+01         9.99997E-01         8.12389E-01         2.12415E+01         3.42959E+00         1.78120E+01
+          9.36403E-03         1.90442E-02        -1.37665E-02         5.88253E-01         1.41591E+00         5.88414E-01         2.09462E+01         9.99997E-01         8.09607E-01         2.09612E+01         3.67095E+00         1.72902E+01
+          9.36403E-03         1.92140E-02        -1.39706E-02         5.88251E-01         1.42658E+00         5.88417E-01         2.07232E+01         9.99997E-01         8.06847E-01         2.07389E+01         3.93846E+00         1.68004E+01
+          9.36403E-03         1.93839E-02        -1.41766E-02         5.88249E-01         1.43725E+00         5.88420E-01         2.05553E+01         9.99997E-01         8.04096E-01         2.05717E+01         4.22868E+00         1.63430E+01
+          9.36403E-03         1.95537E-02        -1.43844E-02         5.88247E-01         1.44792E+00         5.88423E-01         2.04396E+01         9.99997E-01         8.01343E-01         2.04566E+01         4.53828E+00         1.59183E+01
+          9.36403E-03         1.97235E-02        -1.45940E-02         5.88245E-01         1.45859E+00         5.88426E-01         2.03732E+01         9.99997E-01         7.98576E-01         2.03907E+01         4.86406E+00         1.55266E+01
+          9.36403E-03         1.98933E-02        -1.48054E-02         5.88243E-01         1.46926E+00         5.88430E-01         2.03530E+01         9.99997E-01         7.95785E-01         2.03710E+01         5.20296E+00         1.51680E+01
+          9.36403E-03         2.00632E-02        -1.50186E-02         5.88241E-01         1.47993E+00         5.88433E-01         2.03761E+01         9.99997E-01         7.92960E-01         2.03945E+01         5.55206E+00         1.48425E+01
+          9.36403E-03         2.02330E-02        -1.52336E-02         5.88239E-01         1.49060E+00         5.88436E-01         2.04396E+01         9.99997E-01         7.90092E-01         2.04584E+01         5.90859E+00         1.45498E+01
+          9.36403E-03         2.04028E-02        -1.54504E-02         5.88237E-01         1.50127E+00         5.88440E-01         2.05406E+01         9.99997E-01         7.87173E-01         2.05597E+01         6.26989E+00         1.42898E+01
+          9.36403E-03         2.05726E-02        -1.56691E-02         5.88235E-01         1.51194E+00         5.88444E-01         2.06761E+01         9.99997E-01         7.84194E-01         2.06955E+01         6.63348E+00         1.40620E+01
+          9.36403E-03         2.07425E-02        -1.58895E-02         5.88233E-01         1.52261E+00         5.88448E-01         2.08433E+01         9.99997E-01         7.81149E-01         2.08629E+01         6.99701E+00         1.38659E+01
+          9.36403E-03         2.09123E-02        -1.61118E-02         5.88231E-01         1.53328E+00         5.88452E-01         2.10393E+01         9.99997E-01         7.78031E-01         2.10591E+01         7.35827E+00         1.37008E+01
+          9.36403E-03         2.10821E-02        -1.63359E-02         5.88229E-01         1.54395E+00         5.88456E-01         2.12613E+01         9.99997E-01         7.74834E-01         2.12812E+01         7.71523E+00         1.35660E+01
+          9.36403E-03         2.12520E-02        -1.65618E-02         5.88227E-01         1.55462E+00         5.88460E-01         2.15067E+01         9.99997E-01         7.71554E-01         2.15266E+01         8.06596E+00         1.34606E+01
+          9.36403E-03         2.14218E-02        -1.67895E-02         5.88225E-01         1.56529E+00         5.88464E-01         2.17725E+01         9.99997E-01         7.68185E-01         2.17924E+01         8.40872E+00         1.33837E+01
+          9.36403E-03         2.15916E-02        -1.70191E-02         5.88223E-01         1.57596E+00         5.88469E-01         2.20562E+01         9.99997E-01         7.64724E-01         2.20760E+01         8.74188E+00         1.33341E+01
+          9.36403E-03         2.17614E-02        -1.72504E-02         5.88220E-01         1.58664E+00         5.88473E-01         2.23550E+01         9.99997E-01         7.61166E-01         2.23748E+01         9.06398E+00         1.33108E+01
+          9.36403E-03         2.19313E-02        -1.74836E-02         5.88218E-01         1.59731E+00         5.88478E-01         2.26666E+01         9.99997E-01         7.57510E-01         2.26862E+01         9.37368E+00         1.33125E+01
+          9.36403E-03         2.21011E-02        -1.77185E-02         5.88216E-01         1.60798E+00         5.88483E-01         2.29883E+01         9.99997E-01         7.53753E-01         2.30077E+01         9.66980E+00         1.33379E+01
+          9.36403E-03         2.22709E-02        -1.79553E-02         5.88214E-01         1.61865E+00         5.88488E-01         2.33177E+01         9.99997E-01         7.49892E-01         2.33368E+01         9.95127E+00         1.33855E+01
+          9.36403E-03         2.24407E-02        -1.81939E-02         5.88212E-01         1.62932E+00         5.88493E-01         2.36524E+01         9.99997E-01         7.45926E-01         2.36712E+01         1.02172E+01         1.34541E+01
+          9.36403E-03         2.26106E-02        -1.84343E-02         5.88209E-01         1.63999E+00         5.88498E-01         2.39902E+01         9.99997E-01         7.41854E-01         2.40087E+01         1.04667E+01         1.35420E+01
+          9.36403E-03         2.27804E-02        -1.86766E-02         5.88207E-01         1.65066E+00         5.88503E-01         2.43289E+01         9.99997E-01         7.37676E-01         2.43470E+01         1.06992E+01         1.36477E+01
+          9.36403E-03         2.29502E-02        -1.89206E-02         5.88205E-01         1.66133E+00         5.88509E-01         2.46662E+01         9.99997E-01         7.33391E-01         2.46839E+01         1.09141E+01         1.37698E+01
+          9.36403E-03         2.31201E-02        -1.91665E-02         5.88202E-01         1.67200E+00         5.88515E-01         2.50003E+01         9.99997E-01         7.28999E-01         2.50175E+01         1.11110E+01         1.39065E+01
+          9.36403E-03         2.32899E-02        -1.94141E-02         5.88200E-01         1.68267E+00         5.88520E-01         2.53291E+01         9.99997E-01         7.24501E-01         2.53458E+01         1.12895E+01         1.40563E+01
+          9.36403E-03         2.34597E-02        -1.96636E-02         5.88198E-01         1.69334E+00         5.88526E-01         2.56508E+01         9.99997E-01         7.19897E-01         2.56670E+01         1.14495E+01         1.42175E+01
+          9.36403E-03         2.36295E-02        -1.99149E-02         5.88195E-01         1.70401E+00         5.88532E-01         2.59636E+01         9.99997E-01         7.15189E-01         2.59792E+01         1.15907E+01         1.43885E+01
+          9.36403E-03         2.37994E-02        -2.01680E-02         5.88193E-01         1.71468E+00         5.88539E-01         2.62659E+01         9.99997E-01         7.10379E-01         2.62810E+01         1.17133E+01         1.45677E+01
+          9.36403E-03         2.39692E-02        -2.04229E-02         5.88191E-01         1.72535E+00         5.88545E-01         2.65562E+01         9.99997E-01         7.05467E-01         2.65706E+01         1.18171E+01         1.47535E+01
+          9.36403E-03         2.41390E-02        -2.06797E-02         5.88188E-01         1.73602E+00         5.88552E-01         2.68330E+01         9.99997E-01         7.00456E-01         2.68467E+01         1.19025E+01         1.49442E+01
+          9.36403E-03         2.43088E-02        -2.09382E-02         5.88186E-01         1.74669E+00         5.88558E-01         2.70949E+01         9.99997E-01         6.95349E-01         2.71080E+01         1.19696E+01         1.51384E+01
+          9.36403E-03         2.44787E-02        -2.11986E-02         5.88183E-01         1.75736E+00         5.88565E-01         2.73407E+01         9.99997E-01         6.90147E-01         2.73531E+01         1.20187E+01         1.53344E+01
+          9.36403E-03         2.46485E-02        -2.14607E-02         5.88181E-01         1.76804E+00         5.88572E-01         2.75693E+01         9.99997E-01         6.84853E-01         2.75810E+01         1.20501E+01         1.55309E+01
+          9.36403E-03         2.48183E-02        -2.17247E-02         5.88178E-01         1.77871E+00         5.88580E-01         2.77796E+01         9.99997E-01         6.79471E-01         2.77907E+01         1.20644E+01         1.57262E+01
+          9.36403E-03         2.49882E-02        -2.19905E-02         5.88176E-01         1.78938E+00         5.88587E-01         2.79709E+01         9.99997E-01         6.74003E-01         2.79812E+01         1.20620E+01         1.59191E+01
+          9.36403E-03         2.51580E-02        -2.22582E-02         5.88173E-01         1.80005E+00         5.88594E-01         2.81421E+01         9.99997E-01         6.68453E-01         2.81517E+01         1.20435E+01         1.61082E+01
+          9.36403E-03         2.53278E-02        -2.25276E-02         5.88171E-01         1.81072E+00         5.88602E-01         2.82927E+01         9.99997E-01         6.62823E-01         2.83016E+01         1.20093E+01         1.62923E+01
+          9.36403E-03         2.54976E-02        -2.27988E-02         5.88168E-01         1.82139E+00         5.88610E-01         2.84221E+01         9.99997E-01         6.57118E-01         2.84302E+01         1.19602E+01         1.64700E+01
+          9.36403E-03         2.56675E-02        -2.30719E-02         5.88166E-01         1.83206E+00         5.88618E-01         2.85298E+01         9.99997E-01         6.51341E-01         2.85371E+01         1.18969E+01         1.66403E+01
+          9.36403E-03         2.58373E-02        -2.33468E-02         5.88163E-01         1.84273E+00         5.88626E-01         2.86153E+01         9.99997E-01         6.45497E-01         2.86219E+01         1.18199E+01         1.68020E+01
+          9.36403E-03         2.60071E-02        -2.36234E-02         5.88161E-01         1.85340E+00         5.88635E-01         2.86785E+01         9.99997E-01         6.39588E-01         2.86843E+01         1.17301E+01         1.69543E+01
+          9.36403E-03         2.61769E-02        -2.39019E-02         5.88158E-01         1.86407E+00         5.88644E-01         2.87191E+01         9.99997E-01         6.33618E-01         2.87242E+01         1.16281E+01         1.70961E+01
+          9.53386E-03         8.72665E-04        -2.49673E-03         5.99030E-01         2.74155E-01         5.99035E-01         7.34868E+02         9.99998E-01         3.65346E+00         7.34936E+02         3.56275E+02         3.78661E+02
+          9.53386E-03         1.04249E-03        -2.50695E-03         5.99030E-01         2.84826E-01         5.99035E-01         7.24176E+02         9.99998E-01         3.60530E+00         7.24243E+02         3.53689E+02         3.70554E+02
+          9.53386E-03         1.21232E-03        -2.51898E-03         5.99030E-01         2.95496E-01         5.99035E-01         7.13256E+02         9.99998E-01         3.55610E+00         7.13321E+02         3.50990E+02         3.62331E+02
+          9.53386E-03         1.38215E-03        -2.53282E-03         5.99030E-01         3.06167E-01         5.99035E-01         7.02124E+02         9.99998E-01         3.50595E+00         7.02188E+02         3.48178E+02         3.54010E+02
+          9.53386E-03         1.55197E-03        -2.54847E-03         5.99030E-01         3.16838E-01         5.99035E-01         6.90799E+02         9.99998E-01         3.45493E+00         6.90861E+02         3.45253E+02         3.45608E+02
+          9.53386E-03         1.72180E-03        -2.56594E-03         5.99029E-01         3.27508E-01         5.99035E-01         6.79296E+02         9.99998E-01         3.40311E+00         6.79357E+02         3.42214E+02         3.37143E+02
+          9.53386E-03         1.89163E-03        -2.58522E-03         5.99029E-01         3.38179E-01         5.99035E-01         6.67634E+02         9.99998E-01         3.35058E+00         6.67692E+02         3.39062E+02         3.28630E+02
+          9.53386E-03         2.06146E-03        -2.60631E-03         5.99029E-01         3.48849E-01         5.99035E-01         6.55828E+02         9.99998E-01         3.29740E+00         6.55884E+02         3.35797E+02         3.20088E+02
+          9.53386E-03         2.23128E-03        -2.62921E-03         5.99029E-01         3.59520E-01         5.99035E-01         6.43895E+02         9.99998E-01         3.24367E+00         6.43950E+02         3.32419E+02         3.11532E+02
+          9.53386E-03         2.40111E-03        -2.65392E-03         5.99029E-01         3.70190E-01         5.99034E-01         6.31853E+02         9.99998E-01         3.18946E+00         6.31906E+02         3.28928E+02         3.02979E+02
+          9.53386E-03         2.57094E-03        -2.68045E-03         5.99028E-01         3.80861E-01         5.99034E-01         6.19718E+02         9.99998E-01         3.13485E+00         6.19769E+02         3.25325E+02         2.94444E+02
+          9.53386E-03         2.74077E-03        -2.70879E-03         5.99028E-01         3.91532E-01         5.99034E-01         6.07505E+02         9.99998E-01         3.07991E+00         6.07555E+02         3.21612E+02         2.85943E+02
+          9.53386E-03         2.91059E-03        -2.73894E-03         5.99028E-01         4.02202E-01         5.99034E-01         5.95232E+02         9.99998E-01         3.02472E+00         5.95280E+02         3.17789E+02         2.77490E+02
+          9.53386E-03         3.08042E-03        -2.77090E-03         5.99027E-01         4.12873E-01         5.99034E-01         5.82913E+02         9.99998E-01         2.96936E+00         5.82959E+02         3.13858E+02         2.69101E+02
+          9.53386E-03         3.25025E-03        -2.80467E-03         5.99027E-01         4.23543E-01         5.99034E-01         5.70565E+02         9.99998E-01         2.91390E+00         5.70609E+02         3.09820E+02         2.60788E+02
+          9.53386E-03         3.42008E-03        -2.84026E-03         5.99027E-01         4.34214E-01         5.99033E-01         5.58202E+02         9.99998E-01         2.85841E+00         5.58243E+02         3.05678E+02         2.52565E+02
+          9.53386E-03         3.58990E-03        -2.87766E-03         5.99026E-01         4.44884E-01         5.99033E-01         5.45838E+02         9.99998E-01         2.80297E+00         5.45878E+02         3.01433E+02         2.44445E+02
+          9.53386E-03         3.75973E-03        -2.91687E-03         5.99026E-01         4.55555E-01         5.99033E-01         5.33489E+02         9.99998E-01         2.74764E+00         5.33526E+02         2.97088E+02         2.36439E+02
+          9.53386E-03         3.92956E-03        -2.95789E-03         5.99026E-01         4.66225E-01         5.99033E-01         5.21167E+02         9.99998E-01         2.69248E+00         5.21202E+02         2.92644E+02         2.28558E+02
+          9.53386E-03         4.09939E-03        -3.00073E-03         5.99025E-01         4.76896E-01         5.99033E-01         5.08886E+02         9.99998E-01         2.63758E+00         5.08920E+02         2.88106E+02         2.20814E+02
+          9.53386E-03         4.26921E-03        -3.04538E-03         5.99025E-01         4.87567E-01         5.99033E-01         4.96660E+02         9.99998E-01         2.58298E+00         4.96691E+02         2.83476E+02         2.13215E+02
+          9.53386E-03         4.43904E-03        -3.09184E-03         5.99024E-01         4.98237E-01         5.99032E-01         4.84499E+02         9.99998E-01         2.52875E+00         4.84529E+02         2.78757E+02         2.05772E+02
+          9.53386E-03         4.60887E-03        -3.14011E-03         5.99024E-01         5.08908E-01         5.99032E-01         4.72417E+02         9.99998E-01         2.47496E+00         4.72445E+02         2.73953E+02         1.98492E+02
+          9.53386E-03         4.77869E-03        -3.19019E-03         5.99023E-01         5.19578E-01         5.99032E-01         4.60425E+02         9.99998E-01         2.42164E+00         4.60450E+02         2.69067E+02         1.91383E+02
+          9.53386E-03         4.94852E-03        -3.24209E-03         5.99023E-01         5.30249E-01         5.99032E-01         4.48532E+02         9.99998E-01         2.36887E+00         4.48556E+02         2.64104E+02         1.84451E+02
+          9.53386E-03         5.11835E-03        -3.29579E-03         5.99022E-01         5.40919E-01         5.99031E-01         4.36750E+02         9.99998E-01         2.31668E+00         4.36771E+02         2.59068E+02         1.77704E+02
+          9.53386E-03         5.28818E-03        -3.35131E-03         5.99022E-01         5.51590E-01         5.99031E-01         4.25088E+02         9.99998E-01         2.26514E+00         4.25107E+02         2.53962E+02         1.71145E+02
+          9.53386E-03         5.45800E-03        -3.40865E-03         5.99021E-01         5.62261E-01         5.99031E-01         4.13554E+02         9.99998E-01         2.21427E+00         4.13572E+02         2.48792E+02         1.64780E+02
+          9.53386E-03         5.62783E-03        -3.46779E-03         5.99021E-01         5.72931E-01         5.99031E-01         4.02159E+02         9.99998E-01         2.16414E+00         4.02174E+02         2.43562E+02         1.58612E+02
+          9.53386E-03         5.79766E-03        -3.52875E-03         5.99020E-01         5.83602E-01         5.99031E-01         3.90908E+02         9.99998E-01         2.11476E+00         3.90922E+02         2.38277E+02         1.52645E+02
+          9.53386E-03         5.96749E-03        -3.59152E-03         5.99020E-01         5.94272E-01         5.99030E-01         3.79811E+02         9.99998E-01         2.06620E+00         3.79823E+02         2.32943E+02         1.46880E+02
+          9.53386E-03         6.13731E-03        -3.65610E-03         5.99019E-01         6.04943E-01         5.99030E-01         3.68873E+02         9.99998E-01         2.01846E+00         3.68883E+02         2.27564E+02         1.41319E+02
+          9.53386E-03         6.30714E-03        -3.72249E-03         5.99018E-01         6.15613E-01         5.99030E-01         3.58100E+02         9.99998E-01         1.97160E+00         3.58109E+02         2.22145E+02         1.35963E+02
+          9.53386E-03         6.47697E-03        -3.79070E-03         5.99018E-01         6.26284E-01         5.99030E-01         3.47500E+02         9.99998E-01         1.92563E+00         3.47506E+02         2.16693E+02         1.30813E+02
+          9.53386E-03         6.64680E-03        -3.86071E-03         5.99017E-01         6.36955E-01         5.99029E-01         3.37075E+02         9.99998E-01         1.88057E+00         3.37080E+02         2.11213E+02         1.25867E+02
+          9.53386E-03         6.81662E-03        -3.93254E-03         5.99016E-01         6.47625E-01         5.99029E-01         3.26832E+02         9.99998E-01         1.83647E+00         3.26835E+02         2.05710E+02         1.21124E+02
+          9.53386E-03         6.98645E-03        -4.00618E-03         5.99016E-01         6.58296E-01         5.99029E-01         3.16774E+02         9.99998E-01         1.79332E+00         3.16775E+02         2.00191E+02         1.16584E+02
+          9.53386E-03         7.15628E-03        -4.08164E-03         5.99015E-01         6.68966E-01         5.99029E-01         3.06904E+02         9.99998E-01         1.75115E+00         3.06904E+02         1.94661E+02         1.12243E+02
+          9.53386E-03         7.32611E-03        -4.15890E-03         5.99014E-01         6.79637E-01         5.99029E-01         2.97226E+02         9.99998E-01         1.70997E+00         2.97224E+02         1.89126E+02         1.08098E+02
+          9.53386E-03         7.49593E-03        -4.23798E-03         5.99013E-01         6.90307E-01         5.99028E-01         2.87742E+02         9.99998E-01         1.66979E+00         2.87739E+02         1.83593E+02         1.04147E+02
+          9.53386E-03         7.66576E-03        -4.31887E-03         5.99013E-01         7.00978E-01         5.99028E-01         2.78455E+02         9.99998E-01         1.63062E+00         2.78450E+02         1.78066E+02         1.00384E+02
+          9.53386E-03         7.83559E-03        -4.40158E-03         5.99012E-01         7.11649E-01         5.99028E-01         2.69366E+02         9.99998E-01         1.59247E+00         2.69360E+02         1.72552E+02         9.68073E+01
+          9.53386E-03         8.00542E-03        -4.48609E-03         5.99011E-01         7.22319E-01         5.99028E-01         2.60476E+02         9.99998E-01         1.55534E+00         2.60468E+02         1.67058E+02         9.34104E+01
+          9.53386E-03         8.17524E-03        -4.57242E-03         5.99010E-01         7.32990E-01         5.99028E-01         2.51785E+02         9.99998E-01         1.51923E+00         2.51776E+02         1.61588E+02         9.01886E+01
+          9.53386E-03         8.34507E-03        -4.66056E-03         5.99009E-01         7.43660E-01         5.99028E-01         2.43295E+02         9.99998E-01         1.48413E+00         2.43285E+02         1.56149E+02         8.71364E+01
+          9.53386E-03         8.51490E-03        -4.75051E-03         5.99009E-01         7.54331E-01         5.99027E-01         2.35006E+02         9.99998E-01         1.45005E+00         2.34995E+02         1.50747E+02         8.42480E+01
+          9.53386E-03         8.68473E-03        -4.84227E-03         5.99008E-01         7.65001E-01         5.99027E-01         2.26917E+02         9.99998E-01         1.41698E+00         2.26904E+02         1.45387E+02         8.15174E+01
+          9.53386E-03         8.85455E-03        -4.93585E-03         5.99007E-01         7.75672E-01         5.99027E-01         2.19027E+02         9.99998E-01         1.38491E+00         2.19013E+02         1.40075E+02         7.89384E+01
+          9.53386E-03         9.02438E-03        -5.03124E-03         5.99006E-01         7.86343E-01         5.99027E-01         2.11336E+02         9.99998E-01         1.35383E+00         2.11321E+02         1.34817E+02         7.65043E+01
+          9.53386E-03         9.19421E-03        -5.12844E-03         5.99005E-01         7.97013E-01         5.99027E-01         2.03842E+02         9.99998E-01         1.32373E+00         2.03826E+02         1.29618E+02         7.42087E+01
+          9.53386E-03         9.36403E-03        -5.22745E-03         5.99004E-01         8.07684E-01         5.99027E-01         1.96544E+02         9.99998E-01         1.29460E+00         1.96527E+02         1.24483E+02         7.20446E+01
+          9.53386E-03         9.53386E-03        -5.32828E-03         5.99003E-01         8.18354E-01         5.99027E-01         1.89440E+02         9.99998E-01         1.26643E+00         1.89423E+02         1.19418E+02         7.00053E+01
+          9.53386E-03         9.70369E-03        -5.43092E-03         5.99002E-01         8.29025E-01         5.99027E-01         1.82528E+02         9.99998E-01         1.23920E+00         1.82510E+02         1.14427E+02         6.80838E+01
+          9.53386E-03         9.87352E-03        -5.53537E-03         5.99001E-01         8.39695E-01         5.99027E-01         1.75807E+02         9.99998E-01         1.21290E+00         1.75788E+02         1.09515E+02         6.62733E+01
+          9.53386E-03         1.00433E-02        -5.64163E-03         5.99000E-01         8.50366E-01         5.99027E-01         1.69273E+02         9.99998E-01         1.18751E+00         1.69254E+02         1.04687E+02         6.45667E+01
+          9.53386E-03         1.02132E-02        -5.74970E-03         5.98999E-01         8.61037E-01         5.99027E-01         1.62925E+02         9.99998E-01         1.16301E+00         1.62905E+02         9.99477E+01         6.29573E+01
+          9.53386E-03         1.03830E-02        -5.85959E-03         5.98998E-01         8.71707E-01         5.99027E-01         1.56759E+02         9.99998E-01         1.13939E+00         1.56739E+02         9.53007E+01         6.14382E+01
+          9.53386E-03         1.05528E-02        -5.97129E-03         5.98997E-01         8.82378E-01         5.99027E-01         1.50773E+02         9.99998E-01         1.11662E+00         1.50753E+02         9.07501E+01         6.00027E+01
+          9.53386E-03         1.07227E-02        -6.08480E-03         5.98996E-01         8.93048E-01         5.99027E-01         1.44965E+02         9.99998E-01         1.09470E+00         1.44944E+02         8.62996E+01         5.86443E+01
+          9.53386E-03         1.08925E-02        -6.20013E-03         5.98995E-01         9.03719E-01         5.99027E-01         1.39330E+02         9.99998E-01         1.07359E+00         1.39309E+02         8.19529E+01         5.73565E+01
+          9.53386E-03         1.10623E-02        -6.31726E-03         5.98994E-01         9.14389E-01         5.99027E-01         1.33867E+02         9.99998E-01         1.05329E+00         1.33846E+02         7.77131E+01         5.61331E+01
+          9.53386E-03         1.12321E-02        -6.43621E-03         5.98992E-01         9.25060E-01         5.99027E-01         1.28573E+02         9.99998E-01         1.03377E+00         1.28551E+02         7.35832E+01         5.49681E+01
+          9.53386E-03         1.14020E-02        -6.55698E-03         5.98991E-01         9.35731E-01         5.99027E-01         1.23443E+02         9.99998E-01         1.01502E+00         1.23422E+02         6.95661E+01         5.38556E+01
+          9.53386E-03         1.15718E-02        -6.67955E-03         5.98990E-01         9.46401E-01         5.99027E-01         1.18476E+02         9.99998E-01         9.97008E-01         1.18454E+02         6.56641E+01         5.27901E+01
+          9.53386E-03         1.17416E-02        -6.80394E-03         5.98989E-01         9.57072E-01         5.99028E-01         1.13667E+02         9.99998E-01         9.79725E-01         1.13646E+02         6.18795E+01         5.17663E+01
+          9.53386E-03         1.19114E-02        -6.93013E-03         5.98988E-01         9.67742E-01         5.99028E-01         1.09015E+02         9.99998E-01         9.63151E-01         1.08993E+02         5.82143E+01         5.07790E+01
+          9.53386E-03         1.20813E-02        -7.05815E-03         5.98987E-01         9.78413E-01         5.99028E-01         1.04515E+02         9.99998E-01         9.47266E-01         1.04494E+02         5.46701E+01         4.98236E+01
+          9.53386E-03         1.22511E-02        -7.18797E-03         5.98985E-01         9.89083E-01         5.99028E-01         1.00165E+02         9.99998E-01         9.32052E-01         1.00144E+02         5.12483E+01         4.88955E+01
+          9.53386E-03         1.24209E-02        -7.31961E-03         5.98984E-01         9.99754E-01         5.99029E-01         9.59611E+01         9.99998E-01         9.17493E-01         9.59407E+01         4.79501E+01         4.79906E+01
+          9.53386E-03         1.25908E-02        -7.45306E-03         5.98983E-01         1.01042E+00         5.99029E-01         9.19012E+01         9.99998E-01         9.03568E-01         9.18812E+01         4.47762E+01         4.71050E+01
+          9.53386E-03         1.27606E-02        -7.58832E-03         5.98981E-01         1.02110E+00         5.99030E-01         8.79821E+01         9.99998E-01         8.90262E-01         8.79625E+01         4.17274E+01         4.62351E+01
+          9.53386E-03         1.29304E-02        -7.72539E-03         5.98980E-01         1.03177E+00         5.99030E-01         8.42007E+01         9.99998E-01         8.77555E-01         8.41816E+01         3.88038E+01         4.53778E+01
+          9.53386E-03         1.31002E-02        -7.86428E-03         5.98979E-01         1.04244E+00         5.99030E-01         8.05541E+01         9.99998E-01         8.65432E-01         8.05356E+01         3.60056E+01         4.45299E+01
+          9.53386E-03         1.32701E-02        -8.00498E-03         5.98977E-01         1.05311E+00         5.99031E-01         7.70397E+01         9.99998E-01         8.53874E-01         7.70217E+01         3.33326E+01         4.36891E+01
+          9.53386E-03         1.34399E-02        -8.14749E-03         5.98976E-01         1.06378E+00         5.99032E-01         7.36545E+01         9.99998E-01         8.42864E-01         7.36372E+01         3.07843E+01         4.28528E+01
+          9.53386E-03         1.36097E-02        -8.29181E-03         5.98975E-01         1.07445E+00         5.99032E-01         7.03960E+01         9.99998E-01         8.32385E-01         7.03793E+01         2.83600E+01         4.20193E+01
+          9.53386E-03         1.37795E-02        -8.43795E-03         5.98973E-01         1.08512E+00         5.99033E-01         6.72614E+01         9.99998E-01         8.22421E-01         6.72454E+01         2.60587E+01         4.11867E+01
+          9.53386E-03         1.39494E-02        -8.58590E-03         5.98972E-01         1.09579E+00         5.99033E-01         6.42482E+01         9.99998E-01         8.12953E-01         6.42330E+01         2.38793E+01         4.03536E+01
+          9.53386E-03         1.41192E-02        -8.73566E-03         5.98971E-01         1.10646E+00         5.99034E-01         6.13539E+01         9.99998E-01         8.03965E-01         6.13394E+01         2.18204E+01         3.95190E+01
+          9.53386E-03         1.42890E-02        -8.88723E-03         5.98969E-01         1.11713E+00         5.99035E-01         5.85761E+01         9.99998E-01         7.95439E-01         5.85624E+01         1.98803E+01         3.86821E+01
+          9.53386E-03         1.44589E-02        -9.04062E-03         5.98968E-01         1.12780E+00         5.99036E-01         5.59123E+01         9.99998E-01         7.87359E-01         5.58994E+01         1.80572E+01         3.78422E+01
+          9.53386E-03         1.46287E-02        -9.19582E-03         5.98966E-01         1.13847E+00         5.99037E-01         5.33601E+01         9.99998E-01         7.79708E-01         5.33481E+01         1.63491E+01         3.69991E+01
+          9.53386E-03         1.47985E-02        -9.35283E-03         5.98965E-01         1.14914E+00         5.99038E-01         5.09174E+01         9.99998E-01         7.72467E-01         5.09063E+01         1.47537E+01         3.61527E+01
+          9.53386E-03         1.49683E-02        -9.51166E-03         5.98963E-01         1.15981E+00         5.99039E-01         4.85819E+01         9.99998E-01         7.65619E-01         4.85717E+01         1.32686E+01         3.53031E+01
+          9.53386E-03         1.51382E-02        -9.67230E-03         5.98962E-01         1.17048E+00         5.99040E-01         4.63514E+01         9.99998E-01         7.59148E-01         4.63421E+01         1.18913E+01         3.44508E+01
+          9.53386E-03         1.53080E-02        -9.83475E-03         5.98960E-01         1.18115E+00         5.99041E-01         4.42237E+01         9.99998E-01         7.53035E-01         4.42153E+01         1.06190E+01         3.35963E+01
+          9.53386E-03         1.54778E-02        -9.99901E-03         5.98958E-01         1.19182E+00         5.99042E-01         4.21967E+01         9.99998E-01         7.47264E-01         4.21893E+01         9.44891E+00         3.27404E+01
+          9.53386E-03         1.56476E-02        -1.01651E-02         5.98957E-01         1.20249E+00         5.99043E-01         4.02684E+01         9.99998E-01         7.41816E-01         4.02619E+01         8.37798E+00         3.18839E+01
+          9.53386E-03         1.58175E-02        -1.03330E-02         5.98955E-01         1.21317E+00         5.99044E-01         3.84367E+01         9.99998E-01         7.36674E-01         3.84312E+01         7.40309E+00         3.10281E+01
+          9.53386E-03         1.59873E-02        -1.05027E-02         5.98954E-01         1.22384E+00         5.99046E-01         3.66996E+01         9.99998E-01         7.31820E-01         3.66950E+01         6.52101E+00         3.01740E+01
+          9.53386E-03         1.61571E-02        -1.06742E-02         5.98952E-01         1.23451E+00         5.99047E-01         3.50551E+01         9.99998E-01         7.27238E-01         3.50515E+01         5.72842E+00         2.93231E+01
+          9.53386E-03         1.63270E-02        -1.08475E-02         5.98950E-01         1.24518E+00         5.99049E-01         3.35012E+01         9.99998E-01         7.22910E-01         3.34985E+01         5.02188E+00         2.84766E+01
+          9.53386E-03         1.64968E-02        -1.10227E-02         5.98949E-01         1.25585E+00         5.99050E-01         3.20359E+01         9.99998E-01         7.18818E-01         3.20342E+01         4.39793E+00         2.76362E+01
+          9.53386E-03         1.66666E-02        -1.11996E-02         5.98947E-01         1.26652E+00         5.99052E-01         3.06573E+01         9.99998E-01         7.14947E-01         3.06565E+01         3.85301E+00         2.68035E+01
+          9.53386E-03         1.68364E-02        -1.13784E-02         5.98945E-01         1.27719E+00         5.99053E-01         2.93633E+01         9.99998E-01         7.11278E-01         2.93634E+01         3.38352E+00         2.59799E+01
+          9.53386E-03         1.70063E-02        -1.15590E-02         5.98944E-01         1.28786E+00         5.99055E-01         2.81520E+01         9.99998E-01         7.07795E-01         2.81531E+01         2.98584E+00         2.51672E+01
+          9.53386E-03         1.71761E-02        -1.17413E-02         5.98942E-01         1.29853E+00         5.99057E-01         2.70215E+01         9.99998E-01         7.04483E-01         2.70234E+01         2.65631E+00         2.43671E+01
+          9.53386E-03         1.73459E-02        -1.19255E-02         5.98940E-01         1.30920E+00         5.99059E-01         2.59697E+01         9.99998E-01         7.01325E-01         2.59725E+01         2.39125E+00         2.35812E+01
+          9.53386E-03         1.75158E-02        -1.21116E-02         5.98938E-01         1.31987E+00         5.99061E-01         2.49946E+01         9.99998E-01         6.98306E-01         2.49983E+01         2.18699E+00         2.28113E+01
+          9.53386E-03         1.76856E-02        -1.22994E-02         5.98937E-01         1.33054E+00         5.99063E-01         2.40942E+01         9.99998E-01         6.95411E-01         2.40987E+01         2.03987E+00         2.20588E+01
+          9.53386E-03         1.78554E-02        -1.24890E-02         5.98935E-01         1.34121E+00         5.99065E-01         2.32665E+01         9.99998E-01         6.92625E-01         2.32718E+01         1.94625E+00         2.13255E+01
+          9.53386E-03         1.80252E-02        -1.26805E-02         5.98933E-01         1.35188E+00         5.99067E-01         2.25093E+01         9.99998E-01         6.89933E-01         2.25154E+01         1.90249E+00         2.06129E+01
+          9.53386E-03         1.81951E-02        -1.28738E-02         5.98931E-01         1.36255E+00         5.99069E-01         2.18206E+01         9.99998E-01         6.87322E-01         2.18275E+01         1.90503E+00         1.99224E+01
+          9.53386E-03         1.83649E-02        -1.30688E-02         5.98929E-01         1.37322E+00         5.99072E-01         2.11983E+01         9.99998E-01         6.84779E-01         2.12059E+01         1.95033E+00         1.92555E+01
+          9.53386E-03         1.85347E-02        -1.32657E-02         5.98927E-01         1.38389E+00         5.99074E-01         2.06402E+01         9.99998E-01         6.82290E-01         2.06485E+01         2.03491E+00         1.86136E+01
+          9.53386E-03         1.87045E-02        -1.34644E-02         5.98925E-01         1.39457E+00         5.99077E-01         2.01442E+01         9.99998E-01         6.79845E-01         2.01531E+01         2.15537E+00         1.79977E+01
+          9.53386E-03         1.88744E-02        -1.36650E-02         5.98924E-01         1.40524E+00         5.99079E-01         1.97080E+01         9.99998E-01         6.77430E-01         1.97175E+01         2.30837E+00         1.74092E+01
+          9.53386E-03         1.90442E-02        -1.38673E-02         5.98922E-01         1.41591E+00         5.99082E-01         1.93294E+01         9.99998E-01         6.75035E-01         1.93395E+01         2.49064E+00         1.68489E+01
+          9.53386E-03         1.92140E-02        -1.40714E-02         5.98920E-01         1.42658E+00         5.99085E-01         1.90062E+01         9.99998E-01         6.72650E-01         1.90168E+01         2.69903E+00         1.63178E+01
+          9.53386E-03         1.93839E-02        -1.42774E-02         5.98918E-01         1.43725E+00         5.99088E-01         1.87360E+01         9.99998E-01         6.70264E-01         1.87472E+01         2.93044E+00         1.58167E+01
+          9.53386E-03         1.95537E-02        -1.44852E-02         5.98916E-01         1.44792E+00         5.99091E-01         1.85166E+01         9.99998E-01         6.67868E-01         1.85282E+01         3.18190E+00         1.53463E+01
+          9.53386E-03         1.97235E-02        -1.46948E-02         5.98914E-01         1.45859E+00         5.99094E-01         1.83456E+01         9.99998E-01         6.65453E-01         1.83576E+01         3.45053E+00         1.49071E+01
+          9.53386E-03         1.98933E-02        -1.49062E-02         5.98912E-01         1.46926E+00         5.99097E-01         1.82207E+01         9.99998E-01         6.63011E-01         1.82331E+01         3.73357E+00         1.44995E+01
+          9.53386E-03         2.00632E-02        -1.51194E-02         5.98910E-01         1.47993E+00         5.99100E-01         1.81394E+01         9.99998E-01         6.60534E-01         1.81522E+01         4.02836E+00         1.41238E+01
+          9.53386E-03         2.02330E-02        -1.53344E-02         5.98908E-01         1.49060E+00         5.99104E-01         1.80994E+01         9.99998E-01         6.58015E-01         1.81125E+01         4.33236E+00         1.37801E+01
+          9.53386E-03         2.04028E-02        -1.55512E-02         5.98906E-01         1.50127E+00         5.99107E-01         1.80983E+01         9.99998E-01         6.55448E-01         1.81117E+01         4.64315E+00         1.34685E+01
+          9.53386E-03         2.05726E-02        -1.57699E-02         5.98903E-01         1.51194E+00         5.99111E-01         1.81337E+01         9.99998E-01         6.52826E-01         1.81473E+01         4.95843E+00         1.31888E+01
+          9.53386E-03         2.07425E-02        -1.59904E-02         5.98901E-01         1.52261E+00         5.99115E-01         1.82031E+01         9.99998E-01         6.50144E-01         1.82169E+01         5.27603E+00         1.29408E+01
+          9.53386E-03         2.09123E-02        -1.62126E-02         5.98899E-01         1.53328E+00         5.99119E-01         1.83042E+01         9.99998E-01         6.47397E-01         1.83181E+01         5.59390E+00         1.27242E+01
+          9.53386E-03         2.10821E-02        -1.64367E-02         5.98897E-01         1.54395E+00         5.99123E-01         1.84345E+01         9.99998E-01         6.44580E-01         1.84485E+01         5.91012E+00         1.25384E+01
+          9.53386E-03         2.12520E-02        -1.66626E-02         5.98895E-01         1.55462E+00         5.99127E-01         1.85916E+01         9.99998E-01         6.41690E-01         1.86057E+01         6.22288E+00         1.23828E+01
+          9.53386E-03         2.14218E-02        -1.68903E-02         5.98893E-01         1.56529E+00         5.99131E-01         1.87731E+01         9.99998E-01         6.38723E-01         1.87872E+01         6.53052E+00         1.22567E+01
+          9.53386E-03         2.15916E-02        -1.71199E-02         5.98891E-01         1.57596E+00         5.99135E-01         1.89767E+01         9.99998E-01         6.35676E-01         1.89908E+01         6.83149E+00         1.21593E+01
+          9.53386E-03         2.17614E-02        -1.73512E-02         5.98888E-01         1.58664E+00         5.99140E-01         1.92000E+01         9.99998E-01         6.32546E-01         1.92140E+01         7.12437E+00         1.20896E+01
+          9.53386E-03         2.19313E-02        -1.75844E-02         5.98886E-01         1.59731E+00         5.99144E-01         1.94406E+01         9.99998E-01         6.29331E-01         1.94545E+01         7.40787E+00         1.20467E+01
+          9.53386E-03         2.21011E-02        -1.78194E-02         5.98884E-01         1.60798E+00         5.99149E-01         1.96963E+01         9.99998E-01         6.26029E-01         1.97101E+01         7.68081E+00         1.20293E+01
+          9.53386E-03         2.22709E-02        -1.80561E-02         5.98882E-01         1.61865E+00         5.99154E-01         1.99648E+01         9.99998E-01         6.22639E-01         1.99784E+01         7.94213E+00         1.20363E+01
+          9.53386E-03         2.24407E-02        -1.82947E-02         5.98879E-01         1.62932E+00         5.99159E-01         2.02438E+01         9.99998E-01         6.19160E-01         2.02573E+01         8.19090E+00         1.20664E+01
+          9.53386E-03         2.26106E-02        -1.85351E-02         5.98877E-01         1.63999E+00         5.99164E-01         2.05314E+01         9.99998E-01         6.15591E-01         2.05446E+01         8.42630E+00         1.21183E+01
+          9.53386E-03         2.27804E-02        -1.87774E-02         5.98875E-01         1.65066E+00         5.99169E-01         2.08252E+01         9.99998E-01         6.11932E-01         2.08382E+01         8.64761E+00         1.21906E+01
+          9.53386E-03         2.29502E-02        -1.90214E-02         5.98872E-01         1.66133E+00         5.99174E-01         2.11233E+01         9.99998E-01         6.08183E-01         2.11360E+01         8.85423E+00         1.22818E+01
+          9.53386E-03         2.31201E-02        -1.92673E-02         5.98870E-01         1.67200E+00         5.99180E-01         2.14236E+01         9.99998E-01         6.04343E-01         2.14360E+01         9.04567E+00         1.23903E+01
+          9.53386E-03         2.32899E-02        -1.95149E-02         5.98868E-01         1.68267E+00         5.99186E-01         2.17242E+01         9.99998E-01         6.00415E-01         2.17363E+01         9.22152E+00         1.25148E+01
+          9.53386E-03         2.34597E-02        -1.97644E-02         5.98865E-01         1.69334E+00         5.99191E-01         2.20233E+01         9.99998E-01         5.96398E-01         2.20351E+01         9.38148E+00         1.26536E+01
+          9.53386E-03         2.36295E-02        -2.00157E-02         5.98863E-01         1.70401E+00         5.99197E-01         2.23191E+01         9.99998E-01         5.92294E-01         2.23305E+01         9.52535E+00         1.28051E+01
+          9.53386E-03         2.37994E-02        -2.02688E-02         5.98861E-01         1.71468E+00         5.99203E-01         2.26098E+01         9.99998E-01         5.88104E-01         2.26208E+01         9.65300E+00         1.29678E+01
+          9.53386E-03         2.39692E-02        -2.05237E-02         5.98858E-01         1.72535E+00         5.99210E-01         2.28939E+01         9.99998E-01         5.83830E-01         2.29044E+01         9.76439E+00         1.31401E+01
+          9.53386E-03         2.41390E-02        -2.07805E-02         5.98856E-01         1.73602E+00         5.99216E-01         2.31697E+01         9.99998E-01         5.79474E-01         2.31798E+01         9.85957E+00         1.33203E+01
+          9.53386E-03         2.43088E-02        -2.10390E-02         5.98853E-01         1.74669E+00         5.99223E-01         2.34359E+01         9.99998E-01         5.75037E-01         2.34455E+01         9.93866E+00         1.35069E+01
+          9.53386E-03         2.44787E-02        -2.12994E-02         5.98851E-01         1.75736E+00         5.99229E-01         2.36910E+01         9.99998E-01         5.70523E-01         2.37002E+01         1.00018E+01         1.36983E+01
+          9.53386E-03         2.46485E-02        -2.15615E-02         5.98848E-01         1.76804E+00         5.99236E-01         2.39337E+01         9.99998E-01         5.65933E-01         2.39425E+01         1.00493E+01         1.38931E+01
+          9.53386E-03         2.48183E-02        -2.18255E-02         5.98846E-01         1.77871E+00         5.99243E-01         2.41630E+01         9.99998E-01         5.61270E-01         2.41712E+01         1.00815E+01         1.40897E+01
+          9.53386E-03         2.49882E-02        -2.20913E-02         5.98843E-01         1.78938E+00         5.99251E-01         2.43776E+01         9.99998E-01         5.56537E-01         2.43853E+01         1.00987E+01         1.42867E+01
+          9.53386E-03         2.51580E-02        -2.23589E-02         5.98841E-01         1.80005E+00         5.99258E-01         2.45766E+01         9.99998E-01         5.51736E-01         2.45838E+01         1.01013E+01         1.44826E+01
+          9.53386E-03         2.53278E-02        -2.26284E-02         5.98838E-01         1.81072E+00         5.99265E-01         2.47591E+01         9.99998E-01         5.46871E-01         2.47658E+01         1.00898E+01         1.46760E+01
+          9.53386E-03         2.54976E-02        -2.28996E-02         5.98835E-01         1.82139E+00         5.99273E-01         2.49243E+01         9.99998E-01         5.41945E-01         2.49304E+01         1.00646E+01         1.48658E+01
+          9.53386E-03         2.56675E-02        -2.31727E-02         5.98833E-01         1.83206E+00         5.99281E-01         2.50714E+01         9.99998E-01         5.36962E-01         2.50770E+01         1.00264E+01         1.50506E+01
+          9.53386E-03         2.58373E-02        -2.34476E-02         5.98830E-01         1.84273E+00         5.99289E-01         2.51999E+01         9.99998E-01         5.31924E-01         2.52050E+01         9.97573E+00         1.52293E+01
+          9.53386E-03         2.60071E-02        -2.37242E-02         5.98828E-01         1.85340E+00         5.99297E-01         2.53092E+01         9.99998E-01         5.26834E-01         2.53138E+01         9.91312E+00         1.54007E+01
+          9.53386E-03         2.61769E-02        -2.40027E-02         5.98825E-01         1.86407E+00         5.99306E-01         2.53989E+01         9.99998E-01         5.21697E-01         2.54030E+01         9.83923E+00         1.55638E+01
+          9.70369E-03         8.72665E-04        -2.59937E-03         6.09701E-01         2.74155E-01         6.09706E-01         6.74720E+02         9.99999E-01         2.91397E+00         6.74769E+02         2.79827E+02         3.94941E+02
+          9.70369E-03         1.04249E-03        -2.60959E-03         6.09700E-01         2.84826E-01         6.09706E-01         6.64550E+02         9.99999E-01         2.87592E+00         6.64597E+02         2.78278E+02         3.86320E+02
+          9.70369E-03         1.21232E-03        -2.62162E-03         6.09700E-01         2.95496E-01         6.09706E-01         6.54171E+02         9.99999E-01         2.83706E+00         6.54217E+02         2.76644E+02         3.77573E+02
+          9.70369E-03         1.38215E-03        -2.63546E-03         6.09700E-01         3.06167E-01         6.09706E-01         6.43599E+02         9.99999E-01         2.79745E+00         6.43644E+02         2.74924E+02         3.68721E+02
+          9.70369E-03         1.55197E-03        -2.65112E-03         6.09700E-01         3.16838E-01         6.09706E-01         6.32852E+02         9.99999E-01         2.75716E+00         6.32896E+02         2.73116E+02         3.59780E+02
+          9.70369E-03         1.72180E-03        -2.66858E-03         6.09700E-01         3.27508E-01         6.09706E-01         6.21946E+02         9.99999E-01         2.71623E+00         6.21989E+02         2.71219E+02         3.50770E+02
+          9.70369E-03         1.89163E-03        -2.68786E-03         6.09700E-01         3.38179E-01         6.09706E-01         6.10898E+02         9.99999E-01         2.67474E+00         6.10940E+02         2.69232E+02         3.41709E+02
+          9.70369E-03         2.06146E-03        -2.70895E-03         6.09700E-01         3.48849E-01         6.09706E-01         5.99726E+02         9.99999E-01         2.63275E+00         5.99766E+02         2.67153E+02         3.32613E+02
+          9.70369E-03         2.23128E-03        -2.73185E-03         6.09699E-01         3.59520E-01         6.09705E-01         5.88444E+02         9.99999E-01         2.59032E+00         5.88483E+02         2.64981E+02         3.23502E+02
+          9.70369E-03         2.40111E-03        -2.75657E-03         6.09699E-01         3.70190E-01         6.09705E-01         5.77070E+02         9.99999E-01         2.54752E+00         5.77108E+02         2.62716E+02         3.14392E+02
+          9.70369E-03         2.57094E-03        -2.78309E-03         6.09699E-01         3.80861E-01         6.09705E-01         5.65620E+02         9.99999E-01         2.50439E+00         5.65657E+02         2.60357E+02         3.05300E+02
+          9.70369E-03         2.74077E-03        -2.81143E-03         6.09699E-01         3.91532E-01         6.09705E-01         5.54109E+02         9.99999E-01         2.46102E+00         5.54145E+02         2.57903E+02         2.96242E+02
+          9.70369E-03         2.91059E-03        -2.84158E-03         6.09698E-01         4.02202E-01         6.09705E-01         5.42554E+02         9.99999E-01         2.41745E+00         5.42589E+02         2.55355E+02         2.87234E+02
+          9.70369E-03         3.08042E-03        -2.87354E-03         6.09698E-01         4.12873E-01         6.09705E-01         5.30970E+02         9.99999E-01         2.37374E+00         5.31003E+02         2.52711E+02         2.78292E+02
+          9.70369E-03         3.25025E-03        -2.90732E-03         6.09698E-01         4.23543E-01         6.09705E-01         5.19371E+02         9.99999E-01         2.32996E+00         5.19403E+02         2.49973E+02         2.69430E+02
+          9.70369E-03         3.42008E-03        -2.94290E-03         6.09697E-01         4.34214E-01         6.09704E-01         5.07773E+02         9.99999E-01         2.28616E+00         5.07803E+02         2.47141E+02         2.60662E+02
+          9.70369E-03         3.58990E-03        -2.98030E-03         6.09697E-01         4.44884E-01         6.09704E-01         4.96189E+02         9.99999E-01         2.24240E+00         4.96218E+02         2.44216E+02         2.52002E+02
+          9.70369E-03         3.75973E-03        -3.01951E-03         6.09696E-01         4.55555E-01         6.09704E-01         4.84633E+02         9.99999E-01         2.19872E+00         4.84660E+02         2.41198E+02         2.43463E+02
+          9.70369E-03         3.92956E-03        -3.06054E-03         6.09696E-01         4.66225E-01         6.09704E-01         4.73118E+02         9.99999E-01         2.15520E+00         4.73145E+02         2.38088E+02         2.35057E+02
+          9.70369E-03         4.09939E-03        -3.10337E-03         6.09696E-01         4.76896E-01         6.09704E-01         4.61658E+02         9.99999E-01         2.11187E+00         4.61683E+02         2.34888E+02         2.26795E+02
+          9.70369E-03         4.26921E-03        -3.14802E-03         6.09695E-01         4.87567E-01         6.09703E-01         4.50264E+02         9.99999E-01         2.06879E+00         4.50288E+02         2.31600E+02         2.18688E+02
+          9.70369E-03         4.43904E-03        -3.19448E-03         6.09695E-01         4.98237E-01         6.09703E-01         4.38949E+02         9.99999E-01         2.02600E+00         4.38971E+02         2.28225E+02         2.10746E+02
+          9.70369E-03         4.60887E-03        -3.24275E-03         6.09694E-01         5.08908E-01         6.09703E-01         4.27723E+02         9.99999E-01         1.98355E+00         4.27743E+02         2.24766E+02         2.02978E+02
+          9.70369E-03         4.77869E-03        -3.29283E-03         6.09694E-01         5.19578E-01         6.09703E-01         4.16596E+02         9.99999E-01         1.94149E+00         4.16616E+02         2.21224E+02         1.95392E+02
+          9.70369E-03         4.94852E-03        -3.34473E-03         6.09693E-01         5.30249E-01         6.09703E-01         4.05580E+02         9.99999E-01         1.89986E+00         4.05599E+02         2.17603E+02         1.87996E+02
+          9.70369E-03         5.11835E-03        -3.39844E-03         6.09693E-01         5.40919E-01         6.09702E-01         3.94684E+02         9.99999E-01         1.85869E+00         3.94701E+02         2.13904E+02         1.80796E+02
+          9.70369E-03         5.28818E-03        -3.45396E-03         6.09692E-01         5.51590E-01         6.09702E-01         3.83916E+02         9.99999E-01         1.81803E+00         3.83931E+02         2.10132E+02         1.73799E+02
+          9.70369E-03         5.45800E-03        -3.51129E-03         6.09692E-01         5.62261E-01         6.09702E-01         3.73285E+02         9.99999E-01         1.77792E+00         3.73299E+02         2.06290E+02         1.67009E+02
+          9.70369E-03         5.62783E-03        -3.57043E-03         6.09691E-01         5.72931E-01         6.09702E-01         3.62798E+02         9.99999E-01         1.73838E+00         3.62811E+02         2.02380E+02         1.60431E+02
+          9.70369E-03         5.79766E-03        -3.63139E-03         6.09691E-01         5.83602E-01         6.09701E-01         3.52463E+02         9.99999E-01         1.69944E+00         3.52475E+02         1.98406E+02         1.54068E+02
+          9.70369E-03         5.96749E-03        -3.69416E-03         6.09690E-01         5.94272E-01         6.09701E-01         3.42286E+02         9.99999E-01         1.66114E+00         3.42296E+02         1.94373E+02         1.47923E+02
+          9.70369E-03         6.13731E-03        -3.75874E-03         6.09689E-01         6.04943E-01         6.09701E-01         3.32274E+02         9.99999E-01         1.62351E+00         3.32283E+02         1.90284E+02         1.41998E+02
+          9.70369E-03         6.30714E-03        -3.82513E-03         6.09689E-01         6.15613E-01         6.09701E-01         3.22431E+02         9.99999E-01         1.58656E+00         3.22438E+02         1.86144E+02         1.36294E+02
+          9.70369E-03         6.47697E-03        -3.89334E-03         6.09688E-01         6.26284E-01         6.09700E-01         3.12762E+02         9.99999E-01         1.55031E+00         3.12768E+02         1.81956E+02         1.30812E+02
+          9.70369E-03         6.64680E-03        -3.96335E-03         6.09687E-01         6.36955E-01         6.09700E-01         3.03272E+02         9.99999E-01         1.51480E+00         3.03277E+02         1.77726E+02         1.25551E+02
+          9.70369E-03         6.81662E-03        -4.03518E-03         6.09687E-01         6.47625E-01         6.09700E-01         2.93964E+02         9.99999E-01         1.48003E+00         2.93967E+02         1.73458E+02         1.20510E+02
+          9.70369E-03         6.98645E-03        -4.10882E-03         6.09686E-01         6.58296E-01         6.09700E-01         2.84841E+02         9.99999E-01         1.44602E+00         2.84844E+02         1.69156E+02         1.15688E+02
+          9.70369E-03         7.15628E-03        -4.18428E-03         6.09685E-01         6.68966E-01         6.09700E-01         2.75907E+02         9.99999E-01         1.41279E+00         2.75908E+02         1.64826E+02         1.11082E+02
+          9.70369E-03         7.32611E-03        -4.26154E-03         6.09684E-01         6.79637E-01         6.09699E-01         2.67162E+02         9.99999E-01         1.38033E+00         2.67163E+02         1.60473E+02         1.06690E+02
+          9.70369E-03         7.49593E-03        -4.34062E-03         6.09684E-01         6.90307E-01         6.09699E-01         2.58610E+02         9.99999E-01         1.34867E+00         2.58609E+02         1.56101E+02         1.02509E+02
+          9.70369E-03         7.66576E-03        -4.42151E-03         6.09683E-01         7.00978E-01         6.09699E-01         2.50251E+02         9.99999E-01         1.31781E+00         2.50249E+02         1.51716E+02         9.85333E+01
+          9.70369E-03         7.83559E-03        -4.50422E-03         6.09682E-01         7.11649E-01         6.09699E-01         2.42085E+02         9.99999E-01         1.28775E+00         2.42082E+02         1.47322E+02         9.47601E+01
+          9.70369E-03         8.00542E-03        -4.58873E-03         6.09681E-01         7.22319E-01         6.09699E-01         2.34114E+02         9.99999E-01         1.25849E+00         2.34110E+02         1.42926E+02         9.11840E+01
+          9.70369E-03         8.17524E-03        -4.67506E-03         6.09680E-01         7.32990E-01         6.09698E-01         2.26336E+02         9.99999E-01         1.23004E+00         2.26331E+02         1.38532E+02         8.77997E+01
+          9.70369E-03         8.34507E-03        -4.76320E-03         6.09680E-01         7.43660E-01         6.09698E-01         2.18752E+02         9.99999E-01         1.20240E+00         2.18747E+02         1.34145E+02         8.46014E+01
+          9.70369E-03         8.51490E-03        -4.85315E-03         6.09679E-01         7.54331E-01         6.09698E-01         2.11361E+02         9.99999E-01         1.17555E+00         2.11355E+02         1.29771E+02         8.15832E+01
+          9.70369E-03         8.68473E-03        -4.94491E-03         6.09678E-01         7.65001E-01         6.09698E-01         2.04161E+02         9.99999E-01         1.14950E+00         2.04154E+02         1.25415E+02         7.87387E+01
+          9.70369E-03         8.85455E-03        -5.03849E-03         6.09677E-01         7.75672E-01         6.09698E-01         1.97152E+02         9.99999E-01         1.12424E+00         1.97143E+02         1.21082E+02         7.60612E+01
+          9.70369E-03         9.02438E-03        -5.13388E-03         6.09676E-01         7.86343E-01         6.09698E-01         1.90330E+02         9.99999E-01         1.09976E+00         1.90321E+02         1.16777E+02         7.35440E+01
+          9.70369E-03         9.19421E-03        -5.23108E-03         6.09675E-01         7.97013E-01         6.09697E-01         1.83695E+02         9.99999E-01         1.07606E+00         1.83685E+02         1.12505E+02         7.11799E+01
+          9.70369E-03         9.36403E-03        -5.33009E-03         6.09674E-01         8.07684E-01         6.09697E-01         1.77244E+02         9.99999E-01         1.05312E+00         1.77233E+02         1.08271E+02         6.89617E+01
+          9.70369E-03         9.53386E-03        -5.43092E-03         6.09673E-01         8.18354E-01         6.09697E-01         1.70974E+02         9.99999E-01         1.03094E+00         1.70962E+02         1.04080E+02         6.68822E+01
+          9.70369E-03         9.70369E-03        -5.53355E-03         6.09672E-01         8.29025E-01         6.09697E-01         1.64882E+02         9.99999E-01         1.00950E+00         1.64871E+02         9.99368E+01         6.49338E+01
+          9.70369E-03         9.87352E-03        -5.63800E-03         6.09671E-01         8.39695E-01         6.09697E-01         1.58967E+02         9.99999E-01         9.88796E-01         1.58955E+02         9.58454E+01         6.31091E+01
+          9.70369E-03         1.00433E-02        -5.74427E-03         6.09670E-01         8.50366E-01         6.09697E-01         1.53224E+02         9.99999E-01         9.68807E-01         1.53211E+02         9.18105E+01         6.14007E+01
+          9.70369E-03         1.02132E-02        -5.85234E-03         6.09669E-01         8.61037E-01         6.09697E-01         1.47651E+02         9.99999E-01         9.49522E-01         1.47638E+02         8.78365E+01         5.98011E+01
+          9.70369E-03         1.03830E-02        -5.96223E-03         6.09668E-01         8.71707E-01         6.09697E-01         1.42244E+02         9.99999E-01         9.30929E-01         1.42230E+02         8.39275E+01         5.83029E+01
+          9.70369E-03         1.05528E-02        -6.07393E-03         6.09667E-01         8.82378E-01         6.09697E-01         1.37000E+02         9.99999E-01         9.13013E-01         1.36986E+02         8.00874E+01         5.68987E+01
+          9.70369E-03         1.07227E-02        -6.18744E-03         6.09666E-01         8.93048E-01         6.09697E-01         1.31916E+02         9.99999E-01         8.95759E-01         1.31902E+02         7.63201E+01         5.55815E+01
+          9.70369E-03         1.08925E-02        -6.30276E-03         6.09665E-01         9.03719E-01         6.09697E-01         1.26987E+02         9.99999E-01         8.79153E-01         1.26973E+02         7.26291E+01         5.43440E+01
+          9.70369E-03         1.10623E-02        -6.41990E-03         6.09664E-01         9.14389E-01         6.09697E-01         1.22212E+02         9.99999E-01         8.63180E-01         1.22197E+02         6.90177E+01         5.31795E+01
+          9.70369E-03         1.12321E-02        -6.53885E-03         6.09662E-01         9.25060E-01         6.09697E-01         1.17585E+02         9.99999E-01         8.47824E-01         1.17570E+02         6.54892E+01         5.20812E+01
+          9.70369E-03         1.14020E-02        -6.65961E-03         6.09661E-01         9.35731E-01         6.09698E-01         1.13104E+02         9.99999E-01         8.33072E-01         1.13089E+02         6.20465E+01         5.10426E+01
+          9.70369E-03         1.15718E-02        -6.78219E-03         6.09660E-01         9.46401E-01         6.09698E-01         1.08765E+02         9.99999E-01         8.18909E-01         1.08750E+02         5.86924E+01         5.00575E+01
+          9.70369E-03         1.17416E-02        -6.90657E-03         6.09659E-01         9.57072E-01         6.09698E-01         1.04564E+02         9.99999E-01         8.05318E-01         1.04549E+02         5.54293E+01         4.91199E+01
+          9.70369E-03         1.19114E-02        -7.03277E-03         6.09658E-01         9.67742E-01         6.09698E-01         1.00498E+02         9.99999E-01         7.92287E-01         1.00484E+02         5.22596E+01         4.82242E+01
+          9.70369E-03         1.20813E-02        -7.16078E-03         6.09656E-01         9.78413E-01         6.09698E-01         9.65646E+01         9.99999E-01         7.79799E-01         9.65500E+01         4.91853E+01         4.73647E+01
+          9.70369E-03         1.22511E-02        -7.29060E-03         6.09655E-01         9.89083E-01         6.09699E-01         9.27591E+01         9.99999E-01         7.67841E-01         9.27446E+01         4.62081E+01         4.65365E+01
+          9.70369E-03         1.24209E-02        -7.42224E-03         6.09654E-01         9.99754E-01         6.09699E-01         8.90787E+01         9.99999E-01         7.56398E-01         8.90644E+01         4.33298E+01         4.57346E+01
+          9.70369E-03         1.25908E-02        -7.55569E-03         6.09652E-01         1.01042E+00         6.09699E-01         8.55202E+01         9.99999E-01         7.45457E-01         8.55061E+01         4.05515E+01         4.49546E+01
+          9.70369E-03         1.27606E-02        -7.69095E-03         6.09651E-01         1.02110E+00         6.09700E-01         8.20805E+01         9.99999E-01         7.35001E-01         8.20667E+01         3.78744E+01         4.41923E+01
+          9.70369E-03         1.29304E-02        -7.82802E-03         6.09650E-01         1.03177E+00         6.09700E-01         7.87567E+01         9.99999E-01         7.25019E-01         7.87432E+01         3.52993E+01         4.34439E+01
+          9.70369E-03         1.31002E-02        -7.96691E-03         6.09648E-01         1.04244E+00         6.09701E-01         7.55459E+01         9.99999E-01         7.15495E-01         7.55326E+01         3.28269E+01         4.27058E+01
+          9.70369E-03         1.32701E-02        -8.10761E-03         6.09647E-01         1.05311E+00         6.09701E-01         7.24451E+01         9.99999E-01         7.06417E-01         7.24322E+01         3.04575E+01         4.19748E+01
+          9.70369E-03         1.34399E-02        -8.25012E-03         6.09646E-01         1.06378E+00         6.09702E-01         6.94518E+01         9.99999E-01         6.97769E-01         6.94393E+01         2.81912E+01         4.12481E+01
+          9.70369E-03         1.36097E-02        -8.39444E-03         6.09644E-01         1.07445E+00         6.09702E-01         6.65633E+01         9.99999E-01         6.89538E-01         6.65512E+01         2.60281E+01         4.05231E+01
+          9.70369E-03         1.37795E-02        -8.54058E-03         6.09643E-01         1.08512E+00         6.09703E-01         6.37771E+01         9.99999E-01         6.81711E-01         6.37655E+01         2.39678E+01         3.97977E+01
+          9.70369E-03         1.39494E-02        -8.68853E-03         6.09641E-01         1.09579E+00         6.09703E-01         6.10908E+01         9.99999E-01         6.74274E-01         6.10797E+01         2.20097E+01         3.90700E+01
+          9.70369E-03         1.41192E-02        -8.83829E-03         6.09640E-01         1.10646E+00         6.09704E-01         5.85022E+01         9.99999E-01         6.67212E-01         5.84916E+01         2.01532E+01         3.83384E+01
+          9.70369E-03         1.42890E-02        -8.98987E-03         6.09639E-01         1.11713E+00         6.09705E-01         5.60090E+01         9.99999E-01         6.60512E-01         5.59990E+01         1.83972E+01         3.76017E+01
+          9.70369E-03         1.44589E-02        -9.14325E-03         6.09637E-01         1.12780E+00         6.09706E-01         5.36092E+01         9.99999E-01         6.54160E-01         5.35997E+01         1.67408E+01         3.68590E+01
+          9.70369E-03         1.46287E-02        -9.29845E-03         6.09636E-01         1.13847E+00         6.09706E-01         5.13007E+01         9.99999E-01         6.48143E-01         5.12918E+01         1.51824E+01         3.61094E+01
+          9.70369E-03         1.47985E-02        -9.45546E-03         6.09634E-01         1.14914E+00         6.09707E-01         4.90817E+01         9.99999E-01         6.42445E-01         4.90734E+01         1.37207E+01         3.53527E+01
+          9.70369E-03         1.49683E-02        -9.61429E-03         6.09633E-01         1.15981E+00         6.09708E-01         4.69503E+01         9.99999E-01         6.37054E-01         4.69426E+01         1.23539E+01         3.45886E+01
+          9.70369E-03         1.51382E-02        -9.77493E-03         6.09631E-01         1.17048E+00         6.09709E-01         4.49047E+01         9.99999E-01         6.31956E-01         4.48976E+01         1.10802E+01         3.38174E+01
+          9.70369E-03         1.53080E-02        -9.93738E-03         6.09629E-01         1.18115E+00         6.09710E-01         4.29433E+01         9.99999E-01         6.27135E-01         4.29369E+01         9.89761E+00         3.30392E+01
+          9.70369E-03         1.54778E-02        -1.01016E-02         6.09628E-01         1.19182E+00         6.09711E-01         4.10645E+01         9.99999E-01         6.22578E-01         4.10587E+01         8.80394E+00         3.22547E+01
+          9.70369E-03         1.56476E-02        -1.02677E-02         6.09626E-01         1.20249E+00         6.09713E-01         3.92667E+01         9.99999E-01         6.18271E-01         3.92616E+01         7.79691E+00         3.14646E+01
+          9.70369E-03         1.58175E-02        -1.04356E-02         6.09625E-01         1.21317E+00         6.09714E-01         3.75484E+01         9.99999E-01         6.14201E-01         3.75440E+01         6.87412E+00         3.06698E+01
+          9.70369E-03         1.59873E-02        -1.06053E-02         6.09623E-01         1.22384E+00         6.09715E-01         3.59083E+01         9.99999E-01         6.10352E-01         3.59045E+01         6.03305E+00         2.98714E+01
+          9.70369E-03         1.61571E-02        -1.07768E-02         6.09621E-01         1.23451E+00         6.09716E-01         3.43449E+01         9.99999E-01         6.06711E-01         3.43417E+01         5.27106E+00         2.90707E+01
+          9.70369E-03         1.63270E-02        -1.09501E-02         6.09620E-01         1.24518E+00         6.09718E-01         3.28568E+01         9.99999E-01         6.03264E-01         3.28543E+01         4.58543E+00         2.82689E+01
+          9.70369E-03         1.64968E-02        -1.11253E-02         6.09618E-01         1.25585E+00         6.09719E-01         3.14427E+01         9.99999E-01         5.99998E-01         3.14409E+01         3.97334E+00         2.74675E+01
+          9.70369E-03         1.66666E-02        -1.13022E-02         6.09616E-01         1.26652E+00         6.09721E-01         3.01012E+01         9.99999E-01         5.96898E-01         3.01001E+01         3.43193E+00         2.66682E+01
+          9.70369E-03         1.68364E-02        -1.14810E-02         6.09614E-01         1.27719E+00         6.09722E-01         2.88312E+01         9.99999E-01         5.93952E-01         2.88307E+01         2.95824E+00         2.58725E+01
+          9.70369E-03         1.70063E-02        -1.16616E-02         6.09613E-01         1.28786E+00         6.09724E-01         2.76313E+01         9.99999E-01         5.91147E-01         2.76315E+01         2.54930E+00         2.50822E+01
+          9.70369E-03         1.71761E-02        -1.18440E-02         6.09611E-01         1.29853E+00         6.09726E-01         2.65002E+01         9.99999E-01         5.88469E-01         2.65010E+01         2.20205E+00         2.42990E+01
+          9.70369E-03         1.73459E-02        -1.20282E-02         6.09609E-01         1.30920E+00         6.09728E-01         2.54366E+01         9.99999E-01         5.85905E-01         2.54380E+01         1.91344E+00         2.35246E+01
+          9.70369E-03         1.75158E-02        -1.22142E-02         6.09607E-01         1.31987E+00         6.09730E-01         2.44392E+01         9.99999E-01         5.83444E-01         2.44413E+01         1.68038E+00         2.27609E+01
+          9.70369E-03         1.76856E-02        -1.24020E-02         6.09605E-01         1.33054E+00         6.09732E-01         2.35068E+01         9.99999E-01         5.81074E-01         2.35094E+01         1.49978E+00         2.20096E+01
+          9.70369E-03         1.78554E-02        -1.25917E-02         6.09604E-01         1.34121E+00         6.09734E-01         2.26379E+01         9.99999E-01         5.78782E-01         2.26411E+01         1.36855E+00         2.12726E+01
+          9.70369E-03         1.80252E-02        -1.27831E-02         6.09602E-01         1.35188E+00         6.09736E-01         2.18312E+01         9.99999E-01         5.76558E-01         2.18350E+01         1.28359E+00         2.05514E+01
+          9.70369E-03         1.81951E-02        -1.29764E-02         6.09600E-01         1.36255E+00         6.09738E-01         2.10854E+01         9.99999E-01         5.74390E-01         2.10897E+01         1.24183E+00         1.98479E+01
+          9.70369E-03         1.83649E-02        -1.31715E-02         6.09598E-01         1.37322E+00         6.09740E-01         2.03989E+01         9.99999E-01         5.72268E-01         2.04038E+01         1.24024E+00         1.91636E+01
+          9.70369E-03         1.85347E-02        -1.33684E-02         6.09596E-01         1.38389E+00         6.09743E-01         1.97704E+01         9.99999E-01         5.70182E-01         1.97758E+01         1.27580E+00         1.85000E+01
+          9.70369E-03         1.87045E-02        -1.35671E-02         6.09594E-01         1.39457E+00         6.09745E-01         1.91984E+01         9.99999E-01         5.68122E-01         1.92043E+01         1.34555E+00         1.78588E+01
+          9.70369E-03         1.88744E-02        -1.37676E-02         6.09592E-01         1.40524E+00         6.09748E-01         1.86814E+01         9.99999E-01         5.66080E-01         1.86877E+01         1.44657E+00         1.72411E+01
+          9.70369E-03         1.90442E-02        -1.39699E-02         6.09590E-01         1.41591E+00         6.09750E-01         1.82177E+01         9.99999E-01         5.64045E-01         1.82245E+01         1.57601E+00         1.66485E+01
+          9.70369E-03         1.92140E-02        -1.41741E-02         6.09588E-01         1.42658E+00         6.09753E-01         1.78058E+01         9.99999E-01         5.62011E-01         1.78130E+01         1.73107E+00         1.60819E+01
+          9.70369E-03         1.93839E-02        -1.43800E-02         6.09586E-01         1.43725E+00         6.09756E-01         1.74440E+01         9.99999E-01         5.59968E-01         1.74515E+01         1.90902E+00         1.55425E+01
+          9.70369E-03         1.95537E-02        -1.45878E-02         6.09584E-01         1.44792E+00         6.09759E-01         1.71306E+01         9.99999E-01         5.57910E-01         1.71385E+01         2.10723E+00         1.50313E+01
+          9.70369E-03         1.97235E-02        -1.47974E-02         6.09582E-01         1.45859E+00         6.09762E-01         1.68639E+01         9.99999E-01         5.55830E-01         1.68721E+01         2.32311E+00         1.45490E+01
+          9.70369E-03         1.98933E-02        -1.50088E-02         6.09580E-01         1.46926E+00         6.09765E-01         1.66421E+01         9.99999E-01         5.53721E-01         1.66506E+01         2.55420E+00         1.40964E+01
+          9.70369E-03         2.00632E-02        -1.52220E-02         6.09578E-01         1.47993E+00         6.09768E-01         1.64633E+01         9.99999E-01         5.51577E-01         1.64721E+01         2.79810E+00         1.36740E+01
+          9.70369E-03         2.02330E-02        -1.54370E-02         6.09576E-01         1.49060E+00         6.09771E-01         1.63258E+01         9.99999E-01         5.49392E-01         1.63349E+01         3.05251E+00         1.32824E+01
+          9.70369E-03         2.04028E-02        -1.56539E-02         6.09574E-01         1.50127E+00         6.09775E-01         1.62276E+01         9.99999E-01         5.47162E-01         1.62369E+01         3.31523E+00         1.29217E+01
+          9.70369E-03         2.05726E-02        -1.58725E-02         6.09572E-01         1.51194E+00         6.09778E-01         1.61669E+01         9.99999E-01         5.44882E-01         1.61763E+01         3.58418E+00         1.25921E+01
+          9.70369E-03         2.07425E-02        -1.60930E-02         6.09570E-01         1.52261E+00         6.09782E-01         1.61415E+01         9.99999E-01         5.42546E-01         1.61511E+01         3.85734E+00         1.22938E+01
+          9.70369E-03         2.09123E-02        -1.63153E-02         6.09567E-01         1.53328E+00         6.09786E-01         1.61496E+01         9.99999E-01         5.40152E-01         1.61594E+01         4.13284E+00         1.20265E+01
+          9.70369E-03         2.10821E-02        -1.65393E-02         6.09565E-01         1.54395E+00         6.09790E-01         1.61892E+01         9.99999E-01         5.37696E-01         1.61990E+01         4.40889E+00         1.17902E+01
+          9.70369E-03         2.12520E-02        -1.67652E-02         6.09563E-01         1.55462E+00         6.09794E-01         1.62582E+01         9.99999E-01         5.35174E-01         1.62681E+01         4.68380E+00         1.15843E+01
+          9.70369E-03         2.14218E-02        -1.69930E-02         6.09561E-01         1.56529E+00         6.09798E-01         1.63546E+01         9.99999E-01         5.32585E-01         1.63646E+01         4.95602E+00         1.14085E+01
+          9.70369E-03         2.15916E-02        -1.72225E-02         6.09559E-01         1.57596E+00         6.09802E-01         1.64764E+01         9.99999E-01         5.29925E-01         1.64863E+01         5.22408E+00         1.12622E+01
+          9.70369E-03         2.17614E-02        -1.74538E-02         6.09556E-01         1.58664E+00         6.09806E-01         1.66214E+01         9.99999E-01         5.27192E-01         1.66313E+01         5.48664E+00         1.11447E+01
+          9.70369E-03         2.19313E-02        -1.76870E-02         6.09554E-01         1.59731E+00         6.09811E-01         1.67876E+01         9.99999E-01         5.24386E-01         1.67975E+01         5.74243E+00         1.10551E+01
+          9.70369E-03         2.21011E-02        -1.79220E-02         6.09552E-01         1.60798E+00         6.09815E-01         1.69731E+01         9.99999E-01         5.21504E-01         1.69829E+01         5.99034E+00         1.09925E+01
+          9.70369E-03         2.22709E-02        -1.81588E-02         6.09550E-01         1.61865E+00         6.09820E-01         1.71756E+01         9.99999E-01         5.18546E-01         1.71853E+01         6.22931E+00         1.09560E+01
+          9.70369E-03         2.24407E-02        -1.83974E-02         6.09547E-01         1.62932E+00         6.09825E-01         1.73933E+01         9.99999E-01         5.15511E-01         1.74029E+01         6.45843E+00         1.09445E+01
+          9.70369E-03         2.26106E-02        -1.86378E-02         6.09545E-01         1.63999E+00         6.09830E-01         1.76240E+01         9.99999E-01         5.12398E-01         1.76335E+01         6.67687E+00         1.09566E+01
+          9.70369E-03         2.27804E-02        -1.88800E-02         6.09543E-01         1.65066E+00         6.09835E-01         1.78659E+01         9.99999E-01         5.09208E-01         1.78752E+01         6.88389E+00         1.09913E+01
+          9.70369E-03         2.29502E-02        -1.91240E-02         6.09540E-01         1.66133E+00         6.09840E-01         1.81169E+01         9.99999E-01         5.05940E-01         1.81261E+01         7.07886E+00         1.10472E+01
+          9.70369E-03         2.31201E-02        -1.93699E-02         6.09538E-01         1.67200E+00         6.09846E-01         1.83752E+01         9.99999E-01         5.02596E-01         1.83842E+01         7.26125E+00         1.11229E+01
+          9.70369E-03         2.32899E-02        -1.96175E-02         6.09535E-01         1.68267E+00         6.09851E-01         1.86389E+01         9.99999E-01         4.99174E-01         1.86476E+01         7.43061E+00         1.12170E+01
+          9.70369E-03         2.34597E-02        -1.98670E-02         6.09533E-01         1.69334E+00         6.09857E-01         1.89061E+01         9.99999E-01         4.95678E-01         1.89146E+01         7.58657E+00         1.13280E+01
+          9.70369E-03         2.36295E-02        -2.01183E-02         6.09531E-01         1.70401E+00         6.09862E-01         1.91751E+01         9.99999E-01         4.92106E-01         1.91833E+01         7.72886E+00         1.14544E+01
+          9.70369E-03         2.37994E-02        -2.03714E-02         6.09528E-01         1.71468E+00         6.09868E-01         1.94441E+01         9.99999E-01         4.88462E-01         1.94521E+01         7.85728E+00         1.15948E+01
+          9.70369E-03         2.39692E-02        -2.06263E-02         6.09526E-01         1.72535E+00         6.09875E-01         1.97115E+01         9.99999E-01         4.84746E-01         1.97192E+01         7.97172E+00         1.17474E+01
+          9.70369E-03         2.41390E-02        -2.08831E-02         6.09523E-01         1.73602E+00         6.09881E-01         1.99757E+01         9.99999E-01         4.80960E-01         1.99830E+01         8.07213E+00         1.19109E+01
+          9.70369E-03         2.43088E-02        -2.11416E-02         6.09521E-01         1.74669E+00         6.09887E-01         2.02351E+01         9.99999E-01         4.77105E-01         2.02422E+01         8.15853E+00         1.20836E+01
+          9.70369E-03         2.44787E-02        -2.14020E-02         6.09518E-01         1.75736E+00         6.09894E-01         2.04883E+01         9.99999E-01         4.73185E-01         2.04950E+01         8.23101E+00         1.22640E+01
+          9.70369E-03         2.46485E-02        -2.16642E-02         6.09516E-01         1.76804E+00         6.09900E-01         2.07339E+01         9.99999E-01         4.69200E-01         2.07403E+01         8.28972E+00         1.24506E+01
+          9.70369E-03         2.48183E-02        -2.19281E-02         6.09513E-01         1.77871E+00         6.09907E-01         2.09705E+01         9.99999E-01         4.65154E-01         2.09766E+01         8.33487E+00         1.26417E+01
+          9.70369E-03         2.49882E-02        -2.21939E-02         6.09510E-01         1.78938E+00         6.09914E-01         2.11970E+01         9.99999E-01         4.61048E-01         2.12028E+01         8.36671E+00         1.28361E+01
+          9.70369E-03         2.51580E-02        -2.24616E-02         6.09508E-01         1.80005E+00         6.09922E-01         2.14122E+01         9.99999E-01         4.56886E-01         2.14176E+01         8.38555E+00         1.30321E+01
+          9.70369E-03         2.53278E-02        -2.27310E-02         6.09505E-01         1.81072E+00         6.09929E-01         2.16151E+01         9.99999E-01         4.52670E-01         2.16201E+01         8.39175E+00         1.32283E+01
+          9.70369E-03         2.54976E-02        -2.30022E-02         6.09503E-01         1.82139E+00         6.09936E-01         2.18045E+01         9.99999E-01         4.48402E-01         2.18092E+01         8.38568E+00         1.34235E+01
+          9.70369E-03         2.56675E-02        -2.32753E-02         6.09500E-01         1.83206E+00         6.09944E-01         2.19797E+01         9.99999E-01         4.44086E-01         2.19840E+01         8.36779E+00         1.36162E+01
+          9.70369E-03         2.58373E-02        -2.35502E-02         6.09497E-01         1.84273E+00         6.09952E-01         2.21399E+01         9.99999E-01         4.39725E-01         2.21438E+01         8.33853E+00         1.38052E+01
+          9.70369E-03         2.60071E-02        -2.38268E-02         6.09495E-01         1.85340E+00         6.09960E-01         2.22842E+01         9.99999E-01         4.35321E-01         2.22877E+01         8.29838E+00         1.39894E+01
+          9.70369E-03         2.61769E-02        -2.41053E-02         6.09492E-01         1.86407E+00         6.09968E-01         2.24121E+01         9.99999E-01         4.30878E-01         2.24153E+01         8.24787E+00         1.41674E+01
+          9.87352E-03         8.72665E-04        -2.70383E-03         6.20371E-01         2.74155E-01         6.20377E-01         6.24958E+02         9.99999E-01         2.32123E+00         6.24992E+02         2.15367E+02         4.09624E+02
+          9.87352E-03         1.04249E-03        -2.71405E-03         6.20371E-01         2.84826E-01         6.20377E-01         6.15164E+02         9.99999E-01         2.29123E+00         6.15197E+02         2.14640E+02         4.00557E+02
+          9.87352E-03         1.21232E-03        -2.72608E-03         6.20371E-01         2.95496E-01         6.20377E-01         6.05176E+02         9.99999E-01         2.26060E+00         6.05208E+02         2.13852E+02         3.91356E+02
+          9.87352E-03         1.38215E-03        -2.73992E-03         6.20371E-01         3.06167E-01         6.20377E-01         5.95010E+02         9.99999E-01         2.22938E+00         5.95042E+02         2.13000E+02         3.82042E+02
+          9.87352E-03         1.55197E-03        -2.75557E-03         6.20371E-01         3.16838E-01         6.20377E-01         5.84684E+02         9.99999E-01         2.19762E+00         5.84715E+02         2.12082E+02         3.72634E+02
+          9.87352E-03         1.72180E-03        -2.77304E-03         6.20370E-01         3.27508E-01         6.20377E-01         5.74214E+02         9.99999E-01         2.16536E+00         5.74245E+02         2.11095E+02         3.63149E+02
+          9.87352E-03         1.89163E-03        -2.79231E-03         6.20370E-01         3.38179E-01         6.20377E-01         5.63617E+02         9.99999E-01         2.13267E+00         5.63647E+02         2.10038E+02         3.53609E+02
+          9.87352E-03         2.06146E-03        -2.81340E-03         6.20370E-01         3.48849E-01         6.20376E-01         5.52910E+02         9.99999E-01         2.09957E+00         5.52938E+02         2.08907E+02         3.44031E+02
+          9.87352E-03         2.23128E-03        -2.83631E-03         6.20370E-01         3.59520E-01         6.20376E-01         5.42108E+02         9.99999E-01         2.06614E+00         5.42136E+02         2.07702E+02         3.34434E+02
+          9.87352E-03         2.40111E-03        -2.86102E-03         6.20370E-01         3.70190E-01         6.20376E-01         5.31228E+02         9.99999E-01         2.03241E+00         5.31256E+02         2.06420E+02         3.24835E+02
+          9.87352E-03         2.57094E-03        -2.88755E-03         6.20369E-01         3.80861E-01         6.20376E-01         5.20287E+02         9.99999E-01         1.99843E+00         5.20313E+02         2.05060E+02         3.15253E+02
+          9.87352E-03         2.74077E-03        -2.91588E-03         6.20369E-01         3.91532E-01         6.20376E-01         5.09300E+02         9.99999E-01         1.96425E+00         5.09325E+02         2.03620E+02         3.05705E+02
+          9.87352E-03         2.91059E-03        -2.94603E-03         6.20369E-01         4.02202E-01         6.20376E-01         4.98281E+02         9.99999E-01         1.92992E+00         4.98306E+02         2.02098E+02         2.96208E+02
+          9.87352E-03         3.08042E-03        -2.97800E-03         6.20368E-01         4.12873E-01         6.20376E-01         4.87248E+02         9.99999E-01         1.89549E+00         4.87272E+02         2.00495E+02         2.86777E+02
+          9.87352E-03         3.25025E-03        -3.01177E-03         6.20368E-01         4.23543E-01         6.20375E-01         4.76214E+02         9.99999E-01         1.86100E+00         4.76237E+02         1.98808E+02         2.77429E+02
+          9.87352E-03         3.42008E-03        -3.04736E-03         6.20368E-01         4.34214E-01         6.20375E-01         4.65193E+02         9.99999E-01         1.82650E+00         4.65215E+02         1.97037E+02         2.68178E+02
+          9.87352E-03         3.58990E-03        -3.08476E-03         6.20367E-01         4.44884E-01         6.20375E-01         4.54200E+02         9.99999E-01         1.79203E+00         4.54221E+02         1.95183E+02         2.59039E+02
+          9.87352E-03         3.75973E-03        -3.12397E-03         6.20367E-01         4.55555E-01         6.20375E-01         4.43248E+02         9.99999E-01         1.75763E+00         4.43269E+02         1.93244E+02         2.50025E+02
+          9.87352E-03         3.92956E-03        -3.16499E-03         6.20367E-01         4.66225E-01         6.20375E-01         4.32350E+02         9.99999E-01         1.72335E+00         4.32370E+02         1.91220E+02         2.41150E+02
+          9.87352E-03         4.09939E-03        -3.20783E-03         6.20366E-01         4.76896E-01         6.20374E-01         4.21519E+02         9.99999E-01         1.68923E+00         4.21537E+02         1.89112E+02         2.32425E+02
+          9.87352E-03         4.26921E-03        -3.25247E-03         6.20366E-01         4.87567E-01         6.20374E-01         4.10765E+02         9.99999E-01         1.65531E+00         4.10783E+02         1.86921E+02         2.23862E+02
+          9.87352E-03         4.43904E-03        -3.29893E-03         6.20365E-01         4.98237E-01         6.20374E-01         4.00102E+02         9.99999E-01         1.62162E+00         4.00118E+02         1.84647E+02         2.15471E+02
+          9.87352E-03         4.60887E-03        -3.34720E-03         6.20365E-01         5.08908E-01         6.20374E-01         3.89539E+02         9.99999E-01         1.58820E+00         3.89554E+02         1.82291E+02         2.07263E+02
+          9.87352E-03         4.77869E-03        -3.39729E-03         6.20364E-01         5.19578E-01         6.20374E-01         3.79086E+02         9.99999E-01         1.55508E+00         3.79101E+02         1.79854E+02         1.99247E+02
+          9.87352E-03         4.94852E-03        -3.44918E-03         6.20364E-01         5.30249E-01         6.20373E-01         3.68754E+02         9.99999E-01         1.52231E+00         3.68767E+02         1.77337E+02         1.91430E+02
+          9.87352E-03         5.11835E-03        -3.50289E-03         6.20363E-01         5.40919E-01         6.20373E-01         3.58551E+02         9.99999E-01         1.48991E+00         3.58563E+02         1.74744E+02         1.83820E+02
+          9.87352E-03         5.28818E-03        -3.55841E-03         6.20363E-01         5.51590E-01         6.20373E-01         3.48485E+02         9.99999E-01         1.45791E+00         3.48497E+02         1.72074E+02         1.76423E+02
+          9.87352E-03         5.45800E-03        -3.61574E-03         6.20362E-01         5.62261E-01         6.20373E-01         3.38565E+02         9.99999E-01         1.42633E+00         3.38576E+02         1.69331E+02         1.69245E+02
+          9.87352E-03         5.62783E-03        -3.67489E-03         6.20362E-01         5.72931E-01         6.20372E-01         3.28798E+02         9.99999E-01         1.39522E+00         3.28808E+02         1.66517E+02         1.62291E+02
+          9.87352E-03         5.79766E-03        -3.73584E-03         6.20361E-01         5.83602E-01         6.20372E-01         3.19190E+02         9.99999E-01         1.36458E+00         3.19199E+02         1.63634E+02         1.55565E+02
+          9.87352E-03         5.96749E-03        -3.79861E-03         6.20360E-01         5.94272E-01         6.20372E-01         3.09747E+02         9.99999E-01         1.33445E+00         3.09755E+02         1.60686E+02         1.49069E+02
+          9.87352E-03         6.13731E-03        -3.86319E-03         6.20360E-01         6.04943E-01         6.20372E-01         3.00474E+02         9.99999E-01         1.30483E+00         3.00481E+02         1.57674E+02         1.42807E+02
+          9.87352E-03         6.30714E-03        -3.92958E-03         6.20359E-01         6.15613E-01         6.20371E-01         2.91376E+02         9.99999E-01         1.27577E+00         2.91383E+02         1.54603E+02         1.36779E+02
+          9.87352E-03         6.47697E-03        -3.99779E-03         6.20358E-01         6.26284E-01         6.20371E-01         2.82458E+02         9.99999E-01         1.24726E+00         2.82464E+02         1.51476E+02         1.30988E+02
+          9.87352E-03         6.64680E-03        -4.06781E-03         6.20358E-01         6.36955E-01         6.20371E-01         2.73723E+02         9.99999E-01         1.21933E+00         2.73728E+02         1.48296E+02         1.25431E+02
+          9.87352E-03         6.81662E-03        -4.13963E-03         6.20357E-01         6.47625E-01         6.20371E-01         2.65174E+02         9.99999E-01         1.19198E+00         2.65178E+02         1.45068E+02         1.20110E+02
+          9.87352E-03         6.98645E-03        -4.21328E-03         6.20356E-01         6.58296E-01         6.20371E-01         2.56813E+02         9.99999E-01         1.16524E+00         2.56816E+02         1.41794E+02         1.15022E+02
+          9.87352E-03         7.15628E-03        -4.28873E-03         6.20355E-01         6.68966E-01         6.20370E-01         2.48642E+02         9.99999E-01         1.13910E+00         2.48644E+02         1.38479E+02         1.10166E+02
+          9.87352E-03         7.32611E-03        -4.36600E-03         6.20355E-01         6.79637E-01         6.20370E-01         2.40663E+02         9.99999E-01         1.11359E+00         2.40665E+02         1.35127E+02         1.05538E+02
+          9.87352E-03         7.49593E-03        -4.44507E-03         6.20354E-01         6.90307E-01         6.20370E-01         2.32877E+02         9.99999E-01         1.08869E+00         2.32878E+02         1.31742E+02         1.01136E+02
+          9.87352E-03         7.66576E-03        -4.52596E-03         6.20353E-01         7.00978E-01         6.20370E-01         2.25284E+02         9.99999E-01         1.06443E+00         2.25284E+02         1.28328E+02         9.69554E+01
+          9.87352E-03         7.83559E-03        -4.60867E-03         6.20352E-01         7.11649E-01         6.20369E-01         2.17884E+02         9.99999E-01         1.04080E+00         2.17883E+02         1.24891E+02         9.29919E+01
+          9.87352E-03         8.00542E-03        -4.69318E-03         6.20351E-01         7.22319E-01         6.20369E-01         2.10676E+02         9.99999E-01         1.01781E+00         2.10674E+02         1.21434E+02         8.92406E+01
+          9.87352E-03         8.17524E-03        -4.77951E-03         6.20351E-01         7.32990E-01         6.20369E-01         2.03660E+02         9.99999E-01         9.95447E-01         2.03658E+02         1.17962E+02         8.56961E+01
+          9.87352E-03         8.34507E-03        -4.86765E-03         6.20350E-01         7.43660E-01         6.20369E-01         1.96835E+02         9.99999E-01         9.73721E-01         1.96832E+02         1.14479E+02         8.23526E+01
+          9.87352E-03         8.51490E-03        -4.95760E-03         6.20349E-01         7.54331E-01         6.20369E-01         1.90198E+02         9.99999E-01         9.52625E-01         1.90194E+02         1.10990E+02         7.92039E+01
+          9.87352E-03         8.68473E-03        -5.04936E-03         6.20348E-01         7.65001E-01         6.20369E-01         1.83748E+02         9.99999E-01         9.32158E-01         1.83744E+02         1.07501E+02         7.62434E+01
+          9.87352E-03         8.85455E-03        -5.14294E-03         6.20347E-01         7.75672E-01         6.20368E-01         1.77483E+02         9.99999E-01         9.12314E-01         1.77478E+02         1.04014E+02         7.34642E+01
+          9.87352E-03         9.02438E-03        -5.23833E-03         6.20346E-01         7.86343E-01         6.20368E-01         1.71400E+02         9.99999E-01         8.93087E-01         1.71395E+02         1.00536E+02         7.08593E+01
+          9.87352E-03         9.19421E-03        -5.33553E-03         6.20345E-01         7.97013E-01         6.20368E-01         1.65497E+02         9.99999E-01         8.74470E-01         1.65491E+02         9.70694E+01         6.84211E+01
+          9.87352E-03         9.36403E-03        -5.43454E-03         6.20344E-01         8.07684E-01         6.20368E-01         1.59769E+02         9.99999E-01         8.56457E-01         1.59763E+02         9.36203E+01         6.61423E+01
+          9.87352E-03         9.53386E-03        -5.53537E-03         6.20343E-01         8.18354E-01         6.20368E-01         1.54215E+02         9.99999E-01         8.39038E-01         1.54208E+02         9.01927E+01         6.40150E+01
+          9.87352E-03         9.70369E-03        -5.63800E-03         6.20342E-01         8.29025E-01         6.20368E-01         1.48830E+02         9.99999E-01         8.22205E-01         1.48822E+02         8.67909E+01         6.20315E+01
+          9.87352E-03         9.87352E-03        -5.74245E-03         6.20341E-01         8.39695E-01         6.20368E-01         1.43611E+02         9.99999E-01         8.05949E-01         1.43603E+02         8.34193E+01         6.01838E+01
+          9.87352E-03         1.00433E-02        -5.84872E-03         6.20340E-01         8.50366E-01         6.20368E-01         1.38554E+02         9.99999E-01         7.90258E-01         1.38546E+02         8.00820E+01         5.84640E+01
+          9.87352E-03         1.02132E-02        -5.95679E-03         6.20339E-01         8.61037E-01         6.20368E-01         1.33656E+02         9.99999E-01         7.75123E-01         1.33647E+02         7.67832E+01         5.68643E+01
+          9.87352E-03         1.03830E-02        -6.06668E-03         6.20338E-01         8.71707E-01         6.20368E-01         1.28912E+02         9.99999E-01         7.60533E-01         1.28903E+02         7.35268E+01         5.53766E+01
+          9.87352E-03         1.05528E-02        -6.17838E-03         6.20337E-01         8.82378E-01         6.20368E-01         1.24319E+02         9.99999E-01         7.46476E-01         1.24310E+02         7.03167E+01         5.39932E+01
+          9.87352E-03         1.07227E-02        -6.29189E-03         6.20336E-01         8.93048E-01         6.20368E-01         1.19872E+02         9.99999E-01         7.32942E-01         1.19863E+02         6.71566E+01         5.27062E+01
+          9.87352E-03         1.08925E-02        -6.40721E-03         6.20335E-01         9.03719E-01         6.20368E-01         1.15568E+02         9.99999E-01         7.19918E-01         1.15558E+02         6.40500E+01         5.15082E+01
+          9.87352E-03         1.10623E-02        -6.52435E-03         6.20333E-01         9.14389E-01         6.20368E-01         1.11402E+02         9.99999E-01         7.07393E-01         1.11392E+02         6.10004E+01         5.03916E+01
+          9.87352E-03         1.12321E-02        -6.64330E-03         6.20332E-01         9.25060E-01         6.20368E-01         1.07370E+02         9.99999E-01         6.95355E-01         1.07360E+02         5.80109E+01         4.93491E+01
+          9.87352E-03         1.14020E-02        -6.76406E-03         6.20331E-01         9.35731E-01         6.20368E-01         1.03468E+02         9.99999E-01         6.83792E-01         1.03458E+02         5.50847E+01         4.83738E+01
+          9.87352E-03         1.15718E-02        -6.88663E-03         6.20330E-01         9.46401E-01         6.20368E-01         9.96932E+01         9.99999E-01         6.72693E-01         9.96831E+01         5.22245E+01         4.74586E+01
+          9.87352E-03         1.17416E-02        -7.01102E-03         6.20329E-01         9.57072E-01         6.20368E-01         9.60403E+01         9.99999E-01         6.62046E-01         9.60302E+01         4.94330E+01         4.65971E+01
+          9.87352E-03         1.19114E-02        -7.13722E-03         6.20327E-01         9.67742E-01         6.20368E-01         9.25059E+01         9.99999E-01         6.51839E-01         9.24958E+01         4.67128E+01         4.57830E+01
+          9.87352E-03         1.20813E-02        -7.26523E-03         6.20326E-01         9.78413E-01         6.20369E-01         8.90863E+01         9.99999E-01         6.42061E-01         8.90761E+01         4.40661E+01         4.50101E+01
+          9.87352E-03         1.22511E-02        -7.39505E-03         6.20325E-01         9.89083E-01         6.20369E-01         8.57777E+01         9.99999E-01         6.32700E-01         8.57676E+01         4.14949E+01         4.42727E+01
+          9.87352E-03         1.24209E-02        -7.52669E-03         6.20324E-01         9.99754E-01         6.20369E-01         8.25767E+01         9.99999E-01         6.23745E-01         8.25667E+01         3.90012E+01         4.35655E+01
+          9.87352E-03         1.25908E-02        -7.66014E-03         6.20322E-01         1.01042E+00         6.20369E-01         7.94797E+01         9.99999E-01         6.15184E-01         7.94698E+01         3.65866E+01         4.28832E+01
+          9.87352E-03         1.27606E-02        -7.79540E-03         6.20321E-01         1.02110E+00         6.20370E-01         7.64835E+01         9.99999E-01         6.07006E-01         7.64738E+01         3.42526E+01         4.22213E+01
+          9.87352E-03         1.29304E-02        -7.93247E-03         6.20320E-01         1.03177E+00         6.20370E-01         7.35850E+01         9.99999E-01         5.99200E-01         7.35754E+01         3.20003E+01         4.15751E+01
+          9.87352E-03         1.31002E-02        -8.07136E-03         6.20318E-01         1.04244E+00         6.20371E-01         7.07809E+01         9.99999E-01         5.91754E-01         7.07716E+01         2.98308E+01         4.09407E+01
+          9.87352E-03         1.32701E-02        -8.21206E-03         6.20317E-01         1.05311E+00         6.20371E-01         6.80685E+01         9.99999E-01         5.84658E-01         6.80593E+01         2.77450E+01         4.03143E+01
+          9.87352E-03         1.34399E-02        -8.35457E-03         6.20315E-01         1.06378E+00         6.20372E-01         6.54449E+01         9.99999E-01         5.77900E-01         6.54360E+01         2.57435E+01         3.96926E+01
+          9.87352E-03         1.36097E-02        -8.49889E-03         6.20314E-01         1.07445E+00         6.20372E-01         6.29075E+01         9.99999E-01         5.71469E-01         6.28989E+01         2.38265E+01         3.90724E+01
+          9.87352E-03         1.37795E-02        -8.64503E-03         6.20312E-01         1.08512E+00         6.20373E-01         6.04539E+01         9.99999E-01         5.65354E-01         6.04456E+01         2.19945E+01         3.84511E+01
+          9.87352E-03         1.39494E-02        -8.79297E-03         6.20311E-01         1.09579E+00         6.20373E-01         5.80816E+01         9.99999E-01         5.59545E-01         5.80736E+01         2.02472E+01         3.78264E+01
+          9.87352E-03         1.41192E-02        -8.94274E-03         6.20310E-01         1.10646E+00         6.20374E-01         5.57885E+01         9.99999E-01         5.54029E-01         5.57808E+01         1.85847E+01         3.71962E+01
+          9.87352E-03         1.42890E-02        -9.09431E-03         6.20308E-01         1.11713E+00         6.20375E-01         5.35725E+01         9.99999E-01         5.48795E-01         5.35652E+01         1.70064E+01         3.65588E+01
+          9.87352E-03         1.44589E-02        -9.24770E-03         6.20307E-01         1.12780E+00         6.20375E-01         5.14316E+01         9.99999E-01         5.43834E-01         5.14247E+01         1.55117E+01         3.59129E+01
+          9.87352E-03         1.46287E-02        -9.40290E-03         6.20305E-01         1.13847E+00         6.20376E-01         4.93641E+01         9.99999E-01         5.39132E-01         4.93575E+01         1.41001E+01         3.52575E+01
+          9.87352E-03         1.47985E-02        -9.55991E-03         6.20303E-01         1.14914E+00         6.20377E-01         4.73682E+01         9.99999E-01         5.34680E-01         4.73621E+01         1.27704E+01         3.45916E+01
+          9.87352E-03         1.49683E-02        -9.71873E-03         6.20302E-01         1.15981E+00         6.20378E-01         4.54425E+01         9.99999E-01         5.30465E-01         4.54367E+01         1.15217E+01         3.39150E+01
+          9.87352E-03         1.51382E-02        -9.87937E-03         6.20300E-01         1.17048E+00         6.20379E-01         4.35853E+01         9.99999E-01         5.26477E-01         4.35800E+01         1.03526E+01         3.32274E+01
+          9.87352E-03         1.53080E-02        -1.00418E-02         6.20299E-01         1.18115E+00         6.20380E-01         4.17955E+01         9.99999E-01         5.22703E-01         4.17906E+01         9.26183E+00         3.25287E+01
+          9.87352E-03         1.54778E-02        -1.02061E-02         6.20297E-01         1.19182E+00         6.20381E-01         4.00716E+01         9.99999E-01         5.19134E-01         4.00672E+01         8.24777E+00         3.18194E+01
+          9.87352E-03         1.56476E-02        -1.03722E-02         6.20295E-01         1.20249E+00         6.20382E-01         3.84127E+01         9.99999E-01         5.15757E-01         3.84087E+01         7.30877E+00         3.10999E+01
+          9.87352E-03         1.58175E-02        -1.05400E-02         6.20294E-01         1.21317E+00         6.20383E-01         3.68176E+01         9.99999E-01         5.12562E-01         3.68141E+01         6.44302E+00         3.03710E+01
+          9.87352E-03         1.59873E-02        -1.07097E-02         6.20292E-01         1.22384E+00         6.20385E-01         3.52853E+01         9.99999E-01         5.09536E-01         3.52822E+01         5.64860E+00         2.96336E+01
+          9.87352E-03         1.61571E-02        -1.08813E-02         6.20290E-01         1.23451E+00         6.20386E-01         3.38148E+01         9.99999E-01         5.06670E-01         3.38122E+01         4.92349E+00         2.88888E+01
+          9.87352E-03         1.63270E-02        -1.10546E-02         6.20289E-01         1.24518E+00         6.20387E-01         3.24054E+01         9.99999E-01         5.03951E-01         3.24033E+01         4.26554E+00         2.81377E+01
+          9.87352E-03         1.64968E-02        -1.12297E-02         6.20287E-01         1.25585E+00         6.20389E-01         3.10562E+01         9.99999E-01         5.01369E-01         3.10545E+01         3.67255E+00         2.73819E+01
+          9.87352E-03         1.66666E-02        -1.14067E-02         6.20285E-01         1.26652E+00         6.20390E-01         2.97663E+01         9.99999E-01         4.98913E-01         2.97651E+01         3.14223E+00         2.66229E+01
+          9.87352E-03         1.68364E-02        -1.15854E-02         6.20283E-01         1.27719E+00         6.20392E-01         2.85351E+01         9.99999E-01         4.96572E-01         2.85343E+01         2.67219E+00         2.58622E+01
+          9.87352E-03         1.70063E-02        -1.17660E-02         6.20282E-01         1.28786E+00         6.20393E-01         2.73618E+01         9.99999E-01         4.94337E-01         2.73615E+01         2.26002E+00         2.51015E+01
+          9.87352E-03         1.71761E-02        -1.19484E-02         6.20280E-01         1.29853E+00         6.20395E-01         2.62457E+01         9.99999E-01         4.92195E-01         2.62459E+01         1.90323E+00         2.43426E+01
+          9.87352E-03         1.73459E-02        -1.21326E-02         6.20278E-01         1.30920E+00         6.20397E-01         2.51861E+01         9.99999E-01         4.90139E-01         2.51867E+01         1.59929E+00         2.35874E+01
+          9.87352E-03         1.75158E-02        -1.23186E-02         6.20276E-01         1.31987E+00         6.20399E-01         2.41823E+01         9.99999E-01         4.88157E-01         2.41834E+01         1.34566E+00         2.28377E+01
+          9.87352E-03         1.76856E-02        -1.25065E-02         6.20274E-01         1.33054E+00         6.20400E-01         2.32336E+01         9.99999E-01         4.86240E-01         2.32351E+01         1.13975E+00         2.20954E+01
+          9.87352E-03         1.78554E-02        -1.26961E-02         6.20272E-01         1.34121E+00         6.20402E-01         2.23393E+01         9.99999E-01         4.84380E-01         2.23413E+01         9.78961E-01         2.13623E+01
+          9.87352E-03         1.80252E-02        -1.28876E-02         6.20271E-01         1.35188E+00         6.20404E-01         2.14987E+01         9.99999E-01         4.82566E-01         2.15010E+01         8.60688E-01         2.06404E+01
+          9.87352E-03         1.81951E-02        -1.30808E-02         6.20269E-01         1.36255E+00         6.20407E-01         2.07109E+01         9.99999E-01         4.80790E-01         2.07137E+01         7.82329E-01         1.99313E+01
+          9.87352E-03         1.83649E-02        -1.32759E-02         6.20267E-01         1.37322E+00         6.20409E-01         1.99752E+01         9.99999E-01         4.79044E-01         1.99784E+01         7.41289E-01         1.92371E+01
+          9.87352E-03         1.85347E-02        -1.34728E-02         6.20265E-01         1.38389E+00         6.20411E-01         1.92908E+01         9.99999E-01         4.77321E-01         1.92943E+01         7.34990E-01         1.85593E+01
+          9.87352E-03         1.87045E-02        -1.36715E-02         6.20263E-01         1.39457E+00         6.20413E-01         1.86568E+01         9.99999E-01         4.75611E-01         1.86606E+01         7.60880E-01         1.78997E+01
+          9.87352E-03         1.88744E-02        -1.38720E-02         6.20261E-01         1.40524E+00         6.20416E-01         1.80722E+01         9.99999E-01         4.73908E-01         1.80764E+01         8.16437E-01         1.72600E+01
+          9.87352E-03         1.90442E-02        -1.40744E-02         6.20259E-01         1.41591E+00         6.20419E-01         1.75361E+01         9.99999E-01         4.72206E-01         1.75406E+01         8.99180E-01         1.66415E+01
+          9.87352E-03         1.92140E-02        -1.42785E-02         6.20257E-01         1.42658E+00         6.20421E-01         1.70476E+01         9.99999E-01         4.70496E-01         1.70524E+01         1.00667E+00         1.60457E+01
+          9.87352E-03         1.93839E-02        -1.44845E-02         6.20255E-01         1.43725E+00         6.20424E-01         1.66054E+01         9.99999E-01         4.68774E-01         1.66105E+01         1.13652E+00         1.54740E+01
+          9.87352E-03         1.95537E-02        -1.46922E-02         6.20253E-01         1.44792E+00         6.20427E-01         1.62086E+01         9.99999E-01         4.67033E-01         1.62140E+01         1.28639E+00         1.49276E+01
+          9.87352E-03         1.97235E-02        -1.49018E-02         6.20251E-01         1.45859E+00         6.20430E-01         1.58559E+01         9.99999E-01         4.65268E-01         1.58615E+01         1.45403E+00         1.44075E+01
+          9.87352E-03         1.98933E-02        -1.51132E-02         6.20249E-01         1.46926E+00         6.20433E-01         1.55461E+01         9.99999E-01         4.63473E-01         1.55519E+01         1.63723E+00         1.39147E+01
+          9.87352E-03         2.00632E-02        -1.53264E-02         6.20247E-01         1.47993E+00         6.20436E-01         1.52779E+01         9.99999E-01         4.61644E-01         1.52840E+01         1.83385E+00         1.34501E+01
+          9.87352E-03         2.02330E-02        -1.55415E-02         6.20244E-01         1.49060E+00         6.20439E-01         1.50500E+01         9.99999E-01         4.59776E-01         1.50562E+01         2.04184E+00         1.30144E+01
+          9.87352E-03         2.04028E-02        -1.57583E-02         6.20242E-01         1.50127E+00         6.20442E-01         1.48609E+01         9.99999E-01         4.57866E-01         1.48673E+01         2.25923E+00         1.26081E+01
+          9.87352E-03         2.05726E-02        -1.59769E-02         6.20240E-01         1.51194E+00         6.20446E-01         1.47093E+01         9.99999E-01         4.55909E-01         1.47159E+01         2.48411E+00         1.22318E+01
+          9.87352E-03         2.07425E-02        -1.61974E-02         6.20238E-01         1.52261E+00         6.20449E-01         1.45936E+01         9.99999E-01         4.53902E-01         1.46003E+01         2.71467E+00         1.18856E+01
+          9.87352E-03         2.09123E-02        -1.64197E-02         6.20236E-01         1.53328E+00         6.20453E-01         1.45123E+01         9.99999E-01         4.51842E-01         1.45191E+01         2.94920E+00         1.15699E+01
+          9.87352E-03         2.10821E-02        -1.66438E-02         6.20233E-01         1.54395E+00         6.20457E-01         1.44638E+01         9.99999E-01         4.49726E-01         1.44706E+01         3.18605E+00         1.12846E+01
+          9.87352E-03         2.12520E-02        -1.68697E-02         6.20231E-01         1.55462E+00         6.20461E-01         1.44464E+01         9.99999E-01         4.47552E-01         1.44533E+01         3.42368E+00         1.10296E+01
+          9.87352E-03         2.14218E-02        -1.70974E-02         6.20229E-01         1.56529E+00         6.20465E-01         1.44585E+01         9.99999E-01         4.45318E-01         1.44654E+01         3.66063E+00         1.08048E+01
+          9.87352E-03         2.15916E-02        -1.73269E-02         6.20227E-01         1.57596E+00         6.20469E-01         1.44983E+01         9.99999E-01         4.43022E-01         1.45053E+01         3.89554E+00         1.06098E+01
+          9.87352E-03         2.17614E-02        -1.75583E-02         6.20224E-01         1.58664E+00         6.20473E-01         1.45642E+01         9.99999E-01         4.40662E-01         1.45712E+01         4.12714E+00         1.04441E+01
+          9.87352E-03         2.19313E-02        -1.77914E-02         6.20222E-01         1.59731E+00         6.20477E-01         1.46543E+01         9.99999E-01         4.38236E-01         1.46613E+01         4.35425E+00         1.03071E+01
+          9.87352E-03         2.21011E-02        -1.80264E-02         6.20220E-01         1.60798E+00         6.20482E-01         1.47669E+01         9.99999E-01         4.35745E-01         1.47739E+01         4.57578E+00         1.01981E+01
+          9.87352E-03         2.22709E-02        -1.82632E-02         6.20218E-01         1.61865E+00         6.20486E-01         1.49003E+01         9.99999E-01         4.33187E-01         1.49072E+01         4.79074E+00         1.01164E+01
+          9.87352E-03         2.24407E-02        -1.85018E-02         6.20215E-01         1.62932E+00         6.20491E-01         1.50524E+01         9.99999E-01         4.30562E-01         1.50593E+01         4.99823E+00         1.00611E+01
+          9.87352E-03         2.26106E-02        -1.87422E-02         6.20213E-01         1.63999E+00         6.20496E-01         1.52217E+01         9.99999E-01         4.27869E-01         1.52285E+01         5.19743E+00         1.00310E+01
+          9.87352E-03         2.27804E-02        -1.89844E-02         6.20210E-01         1.65066E+00         6.20501E-01         1.54062E+01         9.99999E-01         4.25108E-01         1.54129E+01         5.38760E+00         1.00253E+01
+          9.87352E-03         2.29502E-02        -1.92285E-02         6.20208E-01         1.66133E+00         6.20506E-01         1.56041E+01         9.99999E-01         4.22280E-01         1.56107E+01         5.56812E+00         1.00426E+01
+          9.87352E-03         2.31201E-02        -1.94743E-02         6.20206E-01         1.67200E+00         6.20511E-01         1.58137E+01         9.99999E-01         4.19386E-01         1.58202E+01         5.73841E+00         1.00818E+01
+          9.87352E-03         2.32899E-02        -1.97220E-02         6.20203E-01         1.68267E+00         6.20517E-01         1.60332E+01         9.99999E-01         4.16424E-01         1.60395E+01         5.89799E+00         1.01415E+01
+          9.87352E-03         2.34597E-02        -1.99714E-02         6.20201E-01         1.69334E+00         6.20522E-01         1.62608E+01         9.99999E-01         4.13397E-01         1.62669E+01         6.04648E+00         1.02205E+01
+          9.87352E-03         2.36295E-02        -2.02227E-02         6.20198E-01         1.70401E+00         6.20528E-01         1.64948E+01         9.99999E-01         4.10306E-01         1.65008E+01         6.18354E+00         1.03172E+01
+          9.87352E-03         2.37994E-02        -2.04758E-02         6.20196E-01         1.71468E+00         6.20534E-01         1.67335E+01         9.99999E-01         4.07151E-01         1.67393E+01         6.30892E+00         1.04304E+01
+          9.87352E-03         2.39692E-02        -2.07308E-02         6.20193E-01         1.72535E+00         6.20540E-01         1.69753E+01         9.99999E-01         4.03933E-01         1.69808E+01         6.42244E+00         1.05584E+01
+          9.87352E-03         2.41390E-02        -2.09875E-02         6.20191E-01         1.73602E+00         6.20546E-01         1.72184E+01         9.99999E-01         4.00655E-01         1.72238E+01         6.52398E+00         1.06998E+01
+          9.87352E-03         2.43088E-02        -2.12460E-02         6.20188E-01         1.74669E+00         6.20552E-01         1.74615E+01         9.99999E-01         3.97318E-01         1.74667E+01         6.61350E+00         1.08531E+01
+          9.87352E-03         2.44787E-02        -2.15064E-02         6.20185E-01         1.75736E+00         6.20558E-01         1.77029E+01         9.99999E-01         3.93923E-01         1.77078E+01         6.69100E+00         1.10168E+01
+          9.87352E-03         2.46485E-02        -2.17686E-02         6.20183E-01         1.76804E+00         6.20565E-01         1.79412E+01         9.99999E-01         3.90473E-01         1.79459E+01         6.75655E+00         1.11894E+01
+          9.87352E-03         2.48183E-02        -2.20326E-02         6.20180E-01         1.77871E+00         6.20572E-01         1.81750E+01         9.99999E-01         3.86969E-01         1.81795E+01         6.81027E+00         1.13692E+01
+          9.87352E-03         2.49882E-02        -2.22984E-02         6.20178E-01         1.78938E+00         6.20578E-01         1.84030E+01         9.99999E-01         3.83414E-01         1.84072E+01         6.85232E+00         1.15549E+01
+          9.87352E-03         2.51580E-02        -2.25660E-02         6.20175E-01         1.80005E+00         6.20585E-01         1.86239E+01         9.99999E-01         3.79809E-01         1.86279E+01         6.88291E+00         1.17450E+01
+          9.87352E-03         2.53278E-02        -2.28354E-02         6.20172E-01         1.81072E+00         6.20593E-01         1.88365E+01         9.99999E-01         3.76158E-01         1.88402E+01         6.90231E+00         1.19379E+01
+          9.87352E-03         2.54976E-02        -2.31067E-02         6.20170E-01         1.82139E+00         6.20600E-01         1.90397E+01         9.99999E-01         3.72462E-01         1.90431E+01         6.91081E+00         1.21323E+01
+          9.87352E-03         2.56675E-02        -2.33797E-02         6.20167E-01         1.83206E+00         6.20608E-01         1.92324E+01         9.99999E-01         3.68724E-01         1.92356E+01         6.90874E+00         1.23269E+01
+          9.87352E-03         2.58373E-02        -2.36546E-02         6.20164E-01         1.84273E+00         6.20615E-01         1.94137E+01         9.99999E-01         3.64947E-01         1.94166E+01         6.89645E+00         1.25202E+01
+          9.87352E-03         2.60071E-02        -2.39313E-02         6.20162E-01         1.85340E+00         6.20623E-01         1.95827E+01         9.99999E-01         3.61133E-01         1.95853E+01         6.87435E+00         1.27110E+01
+          9.87352E-03         2.61769E-02        -2.42098E-02         6.20159E-01         1.86407E+00         6.20631E-01         1.97385E+01         9.99999E-01         3.57284E-01         1.97409E+01         6.84284E+00         1.28980E+01
+          1.00433E-02         8.72665E-04        -2.81010E-03         6.31042E-01         2.74155E-01         6.31048E-01         5.84187E+02         9.99999E-01         1.84633E+00         5.84211E+02         1.61836E+02         4.22374E+02
+          1.00433E-02         1.04249E-03        -2.82031E-03         6.31042E-01         2.84826E-01         6.31048E-01         5.74653E+02         9.99999E-01         1.82274E+00         5.74676E+02         1.61740E+02         4.12936E+02
+          1.00433E-02         1.21232E-03        -2.83234E-03         6.31041E-01         2.95496E-01         6.31048E-01         5.64936E+02         9.99999E-01         1.79865E+00         5.64958E+02         1.61601E+02         4.03357E+02
+          1.00433E-02         1.38215E-03        -2.84618E-03         6.31041E-01         3.06167E-01         6.31048E-01         5.55053E+02         9.99999E-01         1.77410E+00         5.55075E+02         1.61418E+02         3.93657E+02
+          1.00433E-02         1.55197E-03        -2.86184E-03         6.31041E-01         3.16838E-01         6.31048E-01         5.45021E+02         9.99999E-01         1.74912E+00         5.45043E+02         1.61186E+02         3.83857E+02
+          1.00433E-02         1.72180E-03        -2.87930E-03         6.31041E-01         3.27508E-01         6.31048E-01         5.34857E+02         9.99999E-01         1.72376E+00         5.34878E+02         1.60902E+02         3.73976E+02
+          1.00433E-02         1.89163E-03        -2.89858E-03         6.31041E-01         3.38179E-01         6.31047E-01         5.24577E+02         9.99999E-01         1.69805E+00         5.24598E+02         1.60565E+02         3.64033E+02
+          1.00433E-02         2.06146E-03        -2.91967E-03         6.31041E-01         3.48849E-01         6.31047E-01         5.14199E+02         9.99999E-01         1.67203E+00         5.14219E+02         1.60171E+02         3.54048E+02
+          1.00433E-02         2.23128E-03        -2.94257E-03         6.31040E-01         3.59520E-01         6.31047E-01         5.03738E+02         9.99999E-01         1.64574E+00         5.03758E+02         1.59717E+02         3.44041E+02
+          1.00433E-02         2.40111E-03        -2.96729E-03         6.31040E-01         3.70190E-01         6.31047E-01         4.93211E+02         9.99999E-01         1.61922E+00         4.93230E+02         1.59200E+02         3.34030E+02
+          1.00433E-02         2.57094E-03        -2.99381E-03         6.31040E-01         3.80861E-01         6.31047E-01         4.82634E+02         9.99999E-01         1.59251E+00         4.82653E+02         1.58620E+02         3.24033E+02
+          1.00433E-02         2.74077E-03        -3.02215E-03         6.31040E-01         3.91532E-01         6.31047E-01         4.72023E+02         9.99999E-01         1.56564E+00         4.72042E+02         1.57972E+02         3.14069E+02
+          1.00433E-02         2.91059E-03        -3.05230E-03         6.31039E-01         4.02202E-01         6.31047E-01         4.61394E+02         9.99999E-01         1.53866E+00         4.61411E+02         1.57256E+02         3.04155E+02
+          1.00433E-02         3.08042E-03        -3.08426E-03         6.31039E-01         4.12873E-01         6.31046E-01         4.50760E+02         9.99999E-01         1.51160E+00         4.50777E+02         1.56469E+02         2.94308E+02
+          1.00433E-02         3.25025E-03        -3.11804E-03         6.31039E-01         4.23543E-01         6.31046E-01         4.40138E+02         9.99999E-01         1.48449E+00         4.40154E+02         1.55610E+02         2.84544E+02
+          1.00433E-02         3.42008E-03        -3.15362E-03         6.31038E-01         4.34214E-01         6.31046E-01         4.29541E+02         9.99999E-01         1.45737E+00         4.29556E+02         1.54678E+02         2.74879E+02
+          1.00433E-02         3.58990E-03        -3.19102E-03         6.31038E-01         4.44884E-01         6.31046E-01         4.18982E+02         9.99999E-01         1.43028E+00         4.18998E+02         1.53670E+02         2.65327E+02
+          1.00433E-02         3.75973E-03        -3.23023E-03         6.31037E-01         4.55555E-01         6.31046E-01         4.08477E+02         9.99999E-01         1.40326E+00         4.08491E+02         1.52586E+02         2.55905E+02
+          1.00433E-02         3.92956E-03        -3.27126E-03         6.31037E-01         4.66225E-01         6.31046E-01         3.98036E+02         9.99999E-01         1.37632E+00         3.98050E+02         1.51426E+02         2.46624E+02
+          1.00433E-02         4.09939E-03        -3.31409E-03         6.31037E-01         4.76896E-01         6.31045E-01         3.87673E+02         9.99999E-01         1.34951E+00         3.87686E+02         1.50188E+02         2.37498E+02
+          1.00433E-02         4.26921E-03        -3.35874E-03         6.31036E-01         4.87567E-01         6.31045E-01         3.77399E+02         9.99999E-01         1.32286E+00         3.77412E+02         1.48873E+02         2.28539E+02
+          1.00433E-02         4.43904E-03        -3.40520E-03         6.31036E-01         4.98237E-01         6.31045E-01         3.67226E+02         9.99999E-01         1.29640E+00         3.67238E+02         1.47479E+02         2.19759E+02
+          1.00433E-02         4.60887E-03        -3.45347E-03         6.31035E-01         5.08908E-01         6.31045E-01         3.57163E+02         9.99999E-01         1.27015E+00         3.57175E+02         1.46008E+02         2.11166E+02
+          1.00433E-02         4.77869E-03        -3.50355E-03         6.31035E-01         5.19578E-01         6.31044E-01         3.47222E+02         9.99999E-01         1.24414E+00         3.47232E+02         1.44460E+02         2.02773E+02
+          1.00433E-02         4.94852E-03        -3.55545E-03         6.31034E-01         5.30249E-01         6.31044E-01         3.37410E+02         9.99999E-01         1.21840E+00         3.37420E+02         1.42835E+02         1.94586E+02
+          1.00433E-02         5.11835E-03        -3.60916E-03         6.31034E-01         5.40919E-01         6.31044E-01         3.27738E+02         9.99999E-01         1.19296E+00         3.27747E+02         1.41133E+02         1.86614E+02
+          1.00433E-02         5.28818E-03        -3.66468E-03         6.31033E-01         5.51590E-01         6.31044E-01         3.18212E+02         9.99999E-01         1.16783E+00         3.18221E+02         1.39357E+02         1.78863E+02
+          1.00433E-02         5.45800E-03        -3.72201E-03         6.31033E-01         5.62261E-01         6.31044E-01         3.08841E+02         9.99999E-01         1.14304E+00         3.08849E+02         1.37507E+02         1.71341E+02
+          1.00433E-02         5.62783E-03        -3.78115E-03         6.31032E-01         5.72931E-01         6.31043E-01         2.99630E+02         9.99999E-01         1.11861E+00         2.99638E+02         1.35585E+02         1.64053E+02
+          1.00433E-02         5.79766E-03        -3.84211E-03         6.31031E-01         5.83602E-01         6.31043E-01         2.90588E+02         9.99999E-01         1.09456E+00         2.90595E+02         1.33593E+02         1.57002E+02
+          1.00433E-02         5.96749E-03        -3.90488E-03         6.31031E-01         5.94272E-01         6.31043E-01         2.81718E+02         9.99999E-01         1.07091E+00         2.81724E+02         1.31532E+02         1.50192E+02
+          1.00433E-02         6.13731E-03        -3.96946E-03         6.31030E-01         6.04943E-01         6.31043E-01         2.73026E+02         9.99999E-01         1.04767E+00         2.73031E+02         1.29405E+02         1.43626E+02
+          1.00433E-02         6.30714E-03        -4.03585E-03         6.31029E-01         6.15613E-01         6.31042E-01         2.64516E+02         9.99999E-01         1.02486E+00         2.64521E+02         1.27214E+02         1.37307E+02
+          1.00433E-02         6.47697E-03        -4.10405E-03         6.31029E-01         6.26284E-01         6.31042E-01         2.56191E+02         9.99999E-01         1.00249E+00         2.56196E+02         1.24961E+02         1.31234E+02
+          1.00433E-02         6.64680E-03        -4.17407E-03         6.31028E-01         6.36955E-01         6.31042E-01         2.48056E+02         9.99999E-01         9.80577E-01         2.48059E+02         1.22650E+02         1.25410E+02
+          1.00433E-02         6.81662E-03        -4.24590E-03         6.31027E-01         6.47625E-01         6.31042E-01         2.40111E+02         9.99999E-01         9.59125E-01         2.40114E+02         1.20283E+02         1.19832E+02
+          1.00433E-02         6.98645E-03        -4.31954E-03         6.31027E-01         6.58296E-01         6.31041E-01         2.32360E+02         9.99999E-01         9.38146E-01         2.32363E+02         1.17863E+02         1.14500E+02
+          1.00433E-02         7.15628E-03        -4.39499E-03         6.31026E-01         6.68966E-01         6.31041E-01         2.24803E+02         9.99999E-01         9.17648E-01         2.24805E+02         1.15393E+02         1.09412E+02
+          1.00433E-02         7.32611E-03        -4.47226E-03         6.31025E-01         6.79637E-01         6.31041E-01         2.17442E+02         9.99999E-01         8.97638E-01         2.17444E+02         1.12878E+02         1.04566E+02
+          1.00433E-02         7.49593E-03        -4.55134E-03         6.31024E-01         6.90307E-01         6.31041E-01         2.10277E+02         9.99999E-01         8.78119E-01         2.10278E+02         1.10319E+02         9.99583E+01
+          1.00433E-02         7.66576E-03        -4.63223E-03         6.31023E-01         7.00978E-01         6.31040E-01         2.03307E+02         9.99999E-01         8.59096E-01         2.03307E+02         1.07722E+02         9.55851E+01
+          1.00433E-02         7.83559E-03        -4.71493E-03         6.31023E-01         7.11649E-01         6.31040E-01         1.96531E+02         9.99999E-01         8.40572E-01         1.96531E+02         1.05089E+02         9.14421E+01
+          1.00433E-02         8.00542E-03        -4.79945E-03         6.31022E-01         7.22319E-01         6.31040E-01         1.89950E+02         9.99999E-01         8.22547E-01         1.89949E+02         1.02425E+02         8.75245E+01
+          1.00433E-02         8.17524E-03        -4.88577E-03         6.31021E-01         7.32990E-01         6.31040E-01         1.83561E+02         9.99999E-01         8.05021E-01         1.83560E+02         9.97330E+01         8.38268E+01
+          1.00433E-02         8.34507E-03        -4.97391E-03         6.31020E-01         7.43660E-01         6.31040E-01         1.77362E+02         9.99999E-01         7.87995E-01         1.77361E+02         9.70174E+01         8.03431E+01
+          1.00433E-02         8.51490E-03        -5.06386E-03         6.31019E-01         7.54331E-01         6.31039E-01         1.71351E+02         9.99999E-01         7.71466E-01         1.71349E+02         9.42822E+01         7.70673E+01
+          1.00433E-02         8.68473E-03        -5.15563E-03         6.31018E-01         7.65001E-01         6.31039E-01         1.65526E+02         9.99999E-01         7.55431E-01         1.65524E+02         9.15313E+01         7.39925E+01
+          1.00433E-02         8.85455E-03        -5.24920E-03         6.31017E-01         7.75672E-01         6.31039E-01         1.59884E+02         9.99999E-01         7.39886E-01         1.59881E+02         8.87690E+01         7.11119E+01
+          1.00433E-02         9.02438E-03        -5.34459E-03         6.31016E-01         7.86343E-01         6.31039E-01         1.54421E+02         9.99999E-01         7.24827E-01         1.54417E+02         8.59992E+01         6.84180E+01
+          1.00433E-02         9.19421E-03        -5.44179E-03         6.31015E-01         7.97013E-01         6.31039E-01         1.49133E+02         9.99999E-01         7.10249E-01         1.49129E+02         8.32261E+01         6.59033E+01
+          1.00433E-02         9.36403E-03        -5.54080E-03         6.31014E-01         8.07684E-01         6.31039E-01         1.44018E+02         9.99999E-01         6.96145E-01         1.44014E+02         8.04538E+01         6.35601E+01
+          1.00433E-02         9.53386E-03        -5.64163E-03         6.31013E-01         8.18354E-01         6.31038E-01         1.39071E+02         9.99999E-01         6.82509E-01         1.39067E+02         7.76864E+01         6.13803E+01
+          1.00433E-02         9.70369E-03        -5.74427E-03         6.31012E-01         8.29025E-01         6.31038E-01         1.34288E+02         9.99999E-01         6.69335E-01         1.34284E+02         7.49278E+01         5.93558E+01
+          1.00433E-02         9.87352E-03        -5.84872E-03         6.31011E-01         8.39695E-01         6.31038E-01         1.29665E+02         9.99999E-01         6.56614E-01         1.29660E+02         7.21821E+01         5.74783E+01
+          1.00433E-02         1.00433E-02        -5.95498E-03         6.31010E-01         8.50366E-01         6.31038E-01         1.25198E+02         9.99999E-01         6.44338E-01         1.25193E+02         6.94531E+01         5.57397E+01
+          1.00433E-02         1.02132E-02        -6.06305E-03         6.31009E-01         8.61037E-01         6.31038E-01         1.20882E+02         9.99999E-01         6.32500E-01         1.20876E+02         6.67447E+01         5.41316E+01
+          1.00433E-02         1.03830E-02        -6.17294E-03         6.31008E-01         8.71707E-01         6.31038E-01         1.16712E+02         9.99999E-01         6.21091E-01         1.16706E+02         6.40607E+01         5.26457E+01
+          1.00433E-02         1.05528E-02        -6.28464E-03         6.31007E-01         8.82378E-01         6.31038E-01         1.12684E+02         9.99999E-01         6.10101E-01         1.12678E+02         6.14047E+01         5.12736E+01
+          1.00433E-02         1.07227E-02        -6.39815E-03         6.31006E-01         8.93048E-01         6.31038E-01         1.08794E+02         9.99999E-01         5.99523E-01         1.08788E+02         5.87803E+01         5.00074E+01
+          1.00433E-02         1.08925E-02        -6.51347E-03         6.31005E-01         9.03719E-01         6.31038E-01         1.05036E+02         9.99999E-01         5.89346E-01         1.05030E+02         5.61908E+01         4.88388E+01
+          1.00433E-02         1.10623E-02        -6.63061E-03         6.31003E-01         9.14389E-01         6.31038E-01         1.01406E+02         9.99999E-01         5.79562E-01         1.01400E+02         5.36397E+01         4.77599E+01
+          1.00433E-02         1.12321E-02        -6.74956E-03         6.31002E-01         9.25060E-01         6.31038E-01         9.78997E+01         9.99999E-01         5.70162E-01         9.78930E+01         5.11301E+01         4.67630E+01
+          1.00433E-02         1.14020E-02        -6.87032E-03         6.31001E-01         9.35731E-01         6.31038E-01         9.45121E+01         9.99999E-01         5.61136E-01         9.45053E+01         4.86649E+01         4.58404E+01
+          1.00433E-02         1.15718E-02        -6.99289E-03         6.31000E-01         9.46401E-01         6.31038E-01         9.12389E+01         9.99999E-01         5.52475E-01         9.12320E+01         4.62471E+01         4.49849E+01
+          1.00433E-02         1.17416E-02        -7.11728E-03         6.30998E-01         9.57072E-01         6.31039E-01         8.80757E+01         9.99999E-01         5.44170E-01         8.80688E+01         4.38795E+01         4.41892E+01
+          1.00433E-02         1.19114E-02        -7.24348E-03         6.30997E-01         9.67742E-01         6.31039E-01         8.50182E+01         9.99999E-01         5.36211E-01         8.50112E+01         4.15645E+01         4.34467E+01
+          1.00433E-02         1.20813E-02        -7.37149E-03         6.30996E-01         9.78413E-01         6.31039E-01         8.20622E+01         9.99999E-01         5.28589E-01         8.20552E+01         3.93047E+01         4.27506E+01
+          1.00433E-02         1.22511E-02        -7.50131E-03         6.30995E-01         9.89083E-01         6.31039E-01         7.92037E+01         9.99999E-01         5.21295E-01         7.91967E+01         3.71020E+01         4.20946E+01
+          1.00433E-02         1.24209E-02        -7.63295E-03         6.30993E-01         9.99754E-01         6.31039E-01         7.64387E+01         9.99999E-01         5.14321E-01         7.64318E+01         3.49588E+01         4.14730E+01
+          1.00433E-02         1.25908E-02        -7.76640E-03         6.30992E-01         1.01042E+00         6.31040E-01         7.37635E+01         9.99999E-01         5.07656E-01         7.37566E+01         3.28767E+01         4.08799E+01
+          1.00433E-02         1.27606E-02        -7.90166E-03         6.30991E-01         1.02110E+00         6.31040E-01         7.11745E+01         9.99999E-01         5.01292E-01         7.11677E+01         3.08575E+01         4.03101E+01
+          1.00433E-02         1.29304E-02        -8.03873E-03         6.30989E-01         1.03177E+00         6.31040E-01         6.86681E+01         9.99999E-01         4.95220E-01         6.86614E+01         2.89027E+01         3.97587E+01
+          1.00433E-02         1.31002E-02        -8.17761E-03         6.30988E-01         1.04244E+00         6.31041E-01         6.62412E+01         9.99999E-01         4.89431E-01         6.62346E+01         2.70136E+01         3.92210E+01
+          1.00433E-02         1.32701E-02        -8.31831E-03         6.30986E-01         1.05311E+00         6.31041E-01         6.38906E+01         9.99999E-01         4.83916E-01         6.38842E+01         2.51913E+01         3.86928E+01
+          1.00433E-02         1.34399E-02        -8.46082E-03         6.30985E-01         1.06378E+00         6.31042E-01         6.16134E+01         9.99999E-01         4.78666E-01         6.16071E+01         2.34368E+01         3.81702E+01
+          1.00433E-02         1.36097E-02        -8.60515E-03         6.30984E-01         1.07445E+00         6.31042E-01         5.94067E+01         9.99999E-01         4.73672E-01         5.94006E+01         2.17508E+01         3.76497E+01
+          1.00433E-02         1.37795E-02        -8.75128E-03         6.30982E-01         1.08512E+00         6.31043E-01         5.72680E+01         9.99999E-01         4.68926E-01         5.72621E+01         2.01339E+01         3.71282E+01
+          1.00433E-02         1.39494E-02        -8.89923E-03         6.30981E-01         1.09579E+00         6.31043E-01         5.51949E+01         9.99999E-01         4.64417E-01         5.51892E+01         1.85865E+01         3.66027E+01
+          1.00433E-02         1.41192E-02        -9.04899E-03         6.30979E-01         1.10646E+00         6.31044E-01         5.31852E+01         9.99999E-01         4.60138E-01         5.31796E+01         1.71088E+01         3.60708E+01
+          1.00433E-02         1.42890E-02        -9.20057E-03         6.30978E-01         1.11713E+00         6.31045E-01         5.12367E+01         9.99999E-01         4.56079E-01         5.12313E+01         1.57008E+01         3.55305E+01
+          1.00433E-02         1.44589E-02        -9.35395E-03         6.30976E-01         1.12780E+00         6.31045E-01         4.93475E+01         9.99999E-01         4.52232E-01         4.93424E+01         1.43625E+01         3.49799E+01
+          1.00433E-02         1.46287E-02        -9.50915E-03         6.30974E-01         1.13847E+00         6.31046E-01         4.75160E+01         9.99999E-01         4.48587E-01         4.75111E+01         1.30935E+01         3.44177E+01
+          1.00433E-02         1.47985E-02        -9.66616E-03         6.30973E-01         1.14914E+00         6.31047E-01         4.57405E+01         9.99999E-01         4.45135E-01         4.57359E+01         1.18933E+01         3.38426E+01
+          1.00433E-02         1.49683E-02        -9.82499E-03         6.30971E-01         1.15981E+00         6.31048E-01         4.40196E+01         9.99999E-01         4.41867E-01         4.40153E+01         1.07614E+01         3.32538E+01
+          1.00433E-02         1.51382E-02        -9.98562E-03         6.30970E-01         1.17048E+00         6.31049E-01         4.23520E+01         9.99999E-01         4.38774E-01         4.23480E+01         9.69706E+00         3.26509E+01
+          1.00433E-02         1.53080E-02        -1.01481E-02         6.30968E-01         1.18115E+00         6.31050E-01         4.07366E+01         9.99999E-01         4.35847E-01         4.07329E+01         8.69927E+00         3.20336E+01
+          1.00433E-02         1.54778E-02        -1.03123E-02         6.30966E-01         1.19182E+00         6.31051E-01         3.91723E+01         9.99999E-01         4.33077E-01         3.91689E+01         7.76702E+00         3.14019E+01
+          1.00433E-02         1.56476E-02        -1.04784E-02         6.30965E-01         1.20249E+00         6.31052E-01         3.76583E+01         9.99999E-01         4.30455E-01         3.76553E+01         6.89916E+00         3.07561E+01
+          1.00433E-02         1.58175E-02        -1.06463E-02         6.30963E-01         1.21317E+00         6.31053E-01         3.61938E+01         9.99999E-01         4.27972E-01         3.61910E+01         6.09438E+00         3.00967E+01
+          1.00433E-02         1.59873E-02        -1.08160E-02         6.30961E-01         1.22384E+00         6.31054E-01         3.47780E+01         9.99999E-01         4.25619E-01         3.47756E+01         5.35128E+00         2.94243E+01
+          1.00433E-02         1.61571E-02        -1.09875E-02         6.30960E-01         1.23451E+00         6.31055E-01         3.34105E+01         9.99999E-01         4.23386E-01         3.34084E+01         4.66833E+00         2.87400E+01
+          1.00433E-02         1.63270E-02        -1.11608E-02         6.30958E-01         1.24518E+00         6.31057E-01         3.20906E+01         9.99999E-01         4.21266E-01         3.20888E+01         4.04392E+00         2.80449E+01
+          1.00433E-02         1.64968E-02        -1.13360E-02         6.30956E-01         1.25585E+00         6.31058E-01         3.08180E+01         9.99999E-01         4.19248E-01         3.08165E+01         3.47633E+00         2.73402E+01
+          1.00433E-02         1.66666E-02        -1.15129E-02         6.30954E-01         1.26652E+00         6.31059E-01         2.95922E+01         9.99999E-01         4.17326E-01         2.95911E+01         2.96379E+00         2.66273E+01
+          1.00433E-02         1.68364E-02        -1.16917E-02         6.30953E-01         1.27719E+00         6.31061E-01         2.84130E+01         9.99999E-01         4.15490E-01         2.84122E+01         2.50441E+00         2.59078E+01
+          1.00433E-02         1.70063E-02        -1.18723E-02         6.30951E-01         1.28786E+00         6.31062E-01         2.72801E+01         9.99999E-01         4.13731E-01         2.72796E+01         2.09626E+00         2.51833E+01
+          1.00433E-02         1.71761E-02        -1.20547E-02         6.30949E-01         1.29853E+00         6.31064E-01         2.61932E+01         9.99999E-01         4.12042E-01         2.61930E+01         1.73734E+00         2.44557E+01
+          1.00433E-02         1.73459E-02        -1.22389E-02         6.30947E-01         1.30920E+00         6.31066E-01         2.51521E+01         9.99999E-01         4.10415E-01         2.51523E+01         1.42562E+00         2.37267E+01
+          1.00433E-02         1.75158E-02        -1.24249E-02         6.30945E-01         1.31987E+00         6.31067E-01         2.41567E+01         9.99999E-01         4.08842E-01         2.41572E+01         1.15899E+00         2.29982E+01
+          1.00433E-02         1.76856E-02        -1.26127E-02         6.30943E-01         1.33054E+00         6.31069E-01         2.32067E+01         9.99999E-01         4.07314E-01         2.32075E+01         9.35339E-01         2.22721E+01
+          1.00433E-02         1.78554E-02        -1.28024E-02         6.30941E-01         1.34121E+00         6.31071E-01         2.23019E+01         9.99999E-01         4.05826E-01         2.23030E+01         7.52511E-01         2.15505E+01
+          1.00433E-02         1.80252E-02        -1.29938E-02         6.30939E-01         1.35188E+00         6.31073E-01         2.14421E+01         9.99999E-01         4.04369E-01         2.14435E+01         6.08337E-01         2.08352E+01
+          1.00433E-02         1.81951E-02        -1.31871E-02         6.30937E-01         1.36255E+00         6.31075E-01         2.06271E+01         9.99999E-01         4.02938E-01         2.06288E+01         5.00636E-01         2.01282E+01
+          1.00433E-02         1.83649E-02        -1.33822E-02         6.30936E-01         1.37322E+00         6.31077E-01         1.98567E+01         9.99999E-01         4.01524E-01         1.98587E+01         4.27223E-01         1.94314E+01
+          1.00433E-02         1.85347E-02        -1.35790E-02         6.30934E-01         1.38389E+00         6.31080E-01         1.91305E+01         9.99999E-01         4.00122E-01         1.91327E+01         3.85914E-01         1.87468E+01
+          1.00433E-02         1.87045E-02        -1.37778E-02         6.30932E-01         1.39457E+00         6.31082E-01         1.84482E+01         9.99999E-01         3.98726E-01         1.84507E+01         3.74538E-01         1.80762E+01
+          1.00433E-02         1.88744E-02        -1.39783E-02         6.30930E-01         1.40524E+00         6.31084E-01         1.78095E+01         9.99999E-01         3.97330E-01         1.78123E+01         3.90937E-01         1.74213E+01
+          1.00433E-02         1.90442E-02        -1.41806E-02         6.30928E-01         1.41591E+00         6.31087E-01         1.72140E+01         9.99999E-01         3.95928E-01         1.72169E+01         4.32980E-01         1.67840E+01
+          1.00433E-02         1.92140E-02        -1.43848E-02         6.30925E-01         1.42658E+00         6.31089E-01         1.66611E+01         9.99999E-01         3.94516E-01         1.66643E+01         4.98562E-01         1.61657E+01
+          1.00433E-02         1.93839E-02        -1.45907E-02         6.30923E-01         1.43725E+00         6.31092E-01         1.61503E+01         9.99999E-01         3.93088E-01         1.61537E+01         5.85614E-01         1.55681E+01
+          1.00433E-02         1.95537E-02        -1.47985E-02         6.30921E-01         1.44792E+00         6.31095E-01         1.56811E+01         9.99999E-01         3.91639E-01         1.56847E+01         6.92107E-01         1.49926E+01
+          1.00433E-02         1.97235E-02        -1.50081E-02         6.30919E-01         1.45859E+00         6.31098E-01         1.52528E+01         9.99999E-01         3.90165E-01         1.52566E+01         8.16056E-01         1.44405E+01
+          1.00433E-02         1.98933E-02        -1.52195E-02         6.30917E-01         1.46926E+00         6.31101E-01         1.48646E+01         9.99999E-01         3.88663E-01         1.48686E+01         9.55528E-01         1.39131E+01
+          1.00433E-02         2.00632E-02        -1.54327E-02         6.30915E-01         1.47993E+00         6.31104E-01         1.45159E+01         9.99999E-01         3.87127E-01         1.45200E+01         1.10864E+00         1.34114E+01
+          1.00433E-02         2.02330E-02        -1.56477E-02         6.30913E-01         1.49060E+00         6.31107E-01         1.42057E+01         9.99999E-01         3.85556E-01         1.42099E+01         1.27358E+00         1.29364E+01
+          1.00433E-02         2.04028E-02        -1.58645E-02         6.30911E-01         1.50127E+00         6.31110E-01         1.39331E+01         9.99999E-01         3.83945E-01         1.39375E+01         1.44858E+00         1.24889E+01
+          1.00433E-02         2.05726E-02        -1.60832E-02         6.30908E-01         1.51194E+00         6.31113E-01         1.36971E+01         9.99999E-01         3.82291E-01         1.37016E+01         1.63194E+00         1.20697E+01
+          1.00433E-02         2.07425E-02        -1.63037E-02         6.30906E-01         1.52261E+00         6.31117E-01         1.34967E+01         9.99999E-01         3.80592E-01         1.35013E+01         1.82205E+00         1.16793E+01
+          1.00433E-02         2.09123E-02        -1.65259E-02         6.30904E-01         1.53328E+00         6.31120E-01         1.33307E+01         9.99999E-01         3.78845E-01         1.33355E+01         2.01734E+00         1.13181E+01
+          1.00433E-02         2.10821E-02        -1.67500E-02         6.30902E-01         1.54395E+00         6.31124E-01         1.31981E+01         9.99999E-01         3.77048E-01         1.32029E+01         2.21634E+00         1.09865E+01
+          1.00433E-02         2.12520E-02        -1.69759E-02         6.30899E-01         1.55462E+00         6.31128E-01         1.30974E+01         9.99999E-01         3.75200E-01         1.31023E+01         2.41762E+00         1.06846E+01
+          1.00433E-02         2.14218E-02        -1.72036E-02         6.30897E-01         1.56529E+00         6.31132E-01         1.30275E+01         9.99999E-01         3.73298E-01         1.30324E+01         2.61987E+00         1.04125E+01
+          1.00433E-02         2.15916E-02        -1.74332E-02         6.30895E-01         1.57596E+00         6.31136E-01         1.29869E+01         9.99999E-01         3.71341E-01         1.29918E+01         2.82183E+00         1.01700E+01
+          1.00433E-02         2.17614E-02        -1.76645E-02         6.30893E-01         1.58664E+00         6.31140E-01         1.29743E+01         9.99999E-01         3.69327E-01         1.29792E+01         3.02231E+00         9.95690E+00
+          1.00433E-02         2.19313E-02        -1.78977E-02         6.30890E-01         1.59731E+00         6.31144E-01         1.29881E+01         9.99999E-01         3.67257E-01         1.29931E+01         3.22022E+00         9.77288E+00
+          1.00433E-02         2.21011E-02        -1.81326E-02         6.30888E-01         1.60798E+00         6.31148E-01         1.30271E+01         9.99999E-01         3.65128E-01         1.30320E+01         3.41454E+00         9.61745E+00
+          1.00433E-02         2.22709E-02        -1.83694E-02         6.30885E-01         1.61865E+00         6.31153E-01         1.30894E+01         9.99999E-01         3.62941E-01         1.30944E+01         3.60433E+00         9.49002E+00
+          1.00433E-02         2.24407E-02        -1.86080E-02         6.30883E-01         1.62932E+00         6.31157E-01         1.31737E+01         9.99999E-01         3.60694E-01         1.31786E+01         3.78872E+00         9.38990E+00
+          1.00433E-02         2.26106E-02        -1.88484E-02         6.30881E-01         1.63999E+00         6.31162E-01         1.32784E+01         9.99999E-01         3.58389E-01         1.32832E+01         3.96692E+00         9.31627E+00
+          1.00433E-02         2.27804E-02        -1.90907E-02         6.30878E-01         1.65066E+00         6.31167E-01         1.34017E+01         9.99999E-01         3.56024E-01         1.34065E+01         4.13822E+00         9.26825E+00
+          1.00433E-02         2.29502E-02        -1.93347E-02         6.30876E-01         1.66133E+00         6.31172E-01         1.35421E+01         9.99999E-01         3.53600E-01         1.35468E+01         4.30199E+00         9.24483E+00
+          1.00433E-02         2.31201E-02        -1.95805E-02         6.30873E-01         1.67200E+00         6.31177E-01         1.36980E+01         9.99999E-01         3.51117E-01         1.37026E+01         4.45766E+00         9.24495E+00
+          1.00433E-02         2.32899E-02        -1.98282E-02         6.30871E-01         1.68267E+00         6.31182E-01         1.38677E+01         9.99999E-01         3.48576E-01         1.38722E+01         4.60473E+00         9.26745E+00
+          1.00433E-02         2.34597E-02        -2.00777E-02         6.30868E-01         1.69334E+00         6.31188E-01         1.40495E+01         9.99999E-01         3.45978E-01         1.40539E+01         4.74280E+00         9.31111E+00
+          1.00433E-02         2.36295E-02        -2.03290E-02         6.30866E-01         1.70401E+00         6.31193E-01         1.42419E+01         9.99999E-01         3.43323E-01         1.42461E+01         4.87149E+00         9.37465E+00
+          1.00433E-02         2.37994E-02        -2.05821E-02         6.30863E-01         1.71468E+00         6.31199E-01         1.44431E+01         9.99999E-01         3.40612E-01         1.44473E+01         4.99052E+00         9.45674E+00
+          1.00433E-02         2.39692E-02        -2.08370E-02         6.30861E-01         1.72535E+00         6.31205E-01         1.46516E+01         9.99999E-01         3.37846E-01         1.46557E+01         5.09967E+00         9.55600E+00
+          1.00433E-02         2.41390E-02        -2.10937E-02         6.30858E-01         1.73602E+00         6.31211E-01         1.48659E+01         9.99999E-01         3.35028E-01         1.48698E+01         5.19876E+00         9.67102E+00
+          1.00433E-02         2.43088E-02        -2.13523E-02         6.30855E-01         1.74669E+00         6.31217E-01         1.50843E+01         9.99999E-01         3.32157E-01         1.50880E+01         5.28769E+00         9.80033E+00
+          1.00433E-02         2.44787E-02        -2.16126E-02         6.30853E-01         1.75736E+00         6.31223E-01         1.53053E+01         9.99999E-01         3.29235E-01         1.53089E+01         5.36640E+00         9.94249E+00
+          1.00433E-02         2.46485E-02        -2.18748E-02         6.30850E-01         1.76804E+00         6.31229E-01         1.55275E+01         9.99999E-01         3.26265E-01         1.55309E+01         5.43490E+00         1.00960E+01
+          1.00433E-02         2.48183E-02        -2.21388E-02         6.30848E-01         1.77871E+00         6.31236E-01         1.57493E+01         9.99999E-01         3.23247E-01         1.57526E+01         5.49321E+00         1.02594E+01
+          1.00433E-02         2.49882E-02        -2.24046E-02         6.30845E-01         1.78938E+00         6.31243E-01         1.59695E+01         9.99999E-01         3.20183E-01         1.59726E+01         5.54145E+00         1.04312E+01
+          1.00433E-02         2.51580E-02        -2.26722E-02         6.30842E-01         1.80005E+00         6.31250E-01         1.61867E+01         9.99999E-01         3.17076E-01         1.61896E+01         5.57974E+00         1.06099E+01
+          1.00433E-02         2.53278E-02        -2.29416E-02         6.30840E-01         1.81072E+00         6.31257E-01         1.63995E+01         9.99999E-01         3.13927E-01         1.64023E+01         5.60825E+00         1.07940E+01
+          1.00433E-02         2.54976E-02        -2.32129E-02         6.30837E-01         1.82139E+00         6.31264E-01         1.66068E+01         9.99999E-01         3.10739E-01         1.66094E+01         5.62721E+00         1.09822E+01
+          1.00433E-02         2.56675E-02        -2.34859E-02         6.30834E-01         1.83206E+00         6.31271E-01         1.68074E+01         9.99999E-01         3.07513E-01         1.68098E+01         5.63685E+00         1.11729E+01
+          1.00433E-02         2.58373E-02        -2.37608E-02         6.30831E-01         1.84273E+00         6.31279E-01         1.70002E+01         9.99999E-01         3.04251E-01         1.70024E+01         5.63745E+00         1.13649E+01
+          1.00433E-02         2.60071E-02        -2.40375E-02         6.30829E-01         1.85340E+00         6.31286E-01         1.71841E+01         9.99999E-01         3.00957E-01         1.71861E+01         5.62932E+00         1.15568E+01
+          1.00433E-02         2.61769E-02        -2.43160E-02         6.30826E-01         1.86407E+00         6.31294E-01         1.73583E+01         9.99999E-01         2.97631E-01         1.73601E+01         5.61278E+00         1.17473E+01
+          1.02132E-02         8.72665E-04        -2.91818E-03         6.41712E-01         2.74155E-01         6.41719E-01         5.51118E+02         1.00000E+00         1.46616E+00         5.51134E+02         1.18199E+02         4.32936E+02
+          1.02132E-02         1.04249E-03        -2.92839E-03         6.41712E-01         2.84826E-01         6.41719E-01         5.41752E+02         1.00000E+00         1.44765E+00         5.41768E+02         1.18563E+02         4.23205E+02
+          1.02132E-02         1.21232E-03        -2.94042E-03         6.41712E-01         2.95496E-01         6.41719E-01         5.32212E+02         1.00000E+00         1.42875E+00         5.32228E+02         1.18901E+02         4.13327E+02
+          1.02132E-02         1.38215E-03        -2.95426E-03         6.41712E-01         3.06167E-01         6.41719E-01         5.22515E+02         1.00000E+00         1.40949E+00         5.22530E+02         1.19209E+02         4.03321E+02
+          1.02132E-02         1.55197E-03        -2.96992E-03         6.41712E-01         3.16838E-01         6.41719E-01         5.12677E+02         1.00000E+00         1.38989E+00         5.12692E+02         1.19483E+02         3.93210E+02
+          1.02132E-02         1.72180E-03        -2.98738E-03         6.41712E-01         3.27508E-01         6.41719E-01         5.02716E+02         1.00000E+00         1.37000E+00         5.02731E+02         1.19719E+02         3.83012E+02
+          1.02132E-02         1.89163E-03        -3.00666E-03         6.41711E-01         3.38179E-01         6.41718E-01         4.92649E+02         1.00000E+00         1.34983E+00         4.92663E+02         1.19916E+02         3.72748E+02
+          1.02132E-02         2.06146E-03        -3.02775E-03         6.41711E-01         3.48849E-01         6.41718E-01         4.82492E+02         1.00000E+00         1.32942E+00         4.82506E+02         1.20069E+02         3.62437E+02
+          1.02132E-02         2.23128E-03        -3.05065E-03         6.41711E-01         3.59520E-01         6.41718E-01         4.72262E+02         1.00000E+00         1.30881E+00         4.72276E+02         1.20175E+02         3.52101E+02
+          1.02132E-02         2.40111E-03        -3.07537E-03         6.41711E-01         3.70190E-01         6.41718E-01         4.61975E+02         1.00000E+00         1.28801E+00         4.61989E+02         1.20231E+02         3.41757E+02
+          1.02132E-02         2.57094E-03        -3.10189E-03         6.41710E-01         3.80861E-01         6.41718E-01         4.51648E+02         1.00000E+00         1.26706E+00         4.51661E+02         1.20236E+02         3.31425E+02
+          1.02132E-02         2.74077E-03        -3.13023E-03         6.41710E-01         3.91532E-01         6.41718E-01         4.41296E+02         1.00000E+00         1.24599E+00         4.41309E+02         1.20185E+02         3.21124E+02
+          1.02132E-02         2.91059E-03        -3.16038E-03         6.41710E-01         4.02202E-01         6.41718E-01         4.30935E+02         1.00000E+00         1.22484E+00         4.30947E+02         1.20077E+02         3.10871E+02
+          1.02132E-02         3.08042E-03        -3.19234E-03         6.41709E-01         4.12873E-01         6.41717E-01         4.20580E+02         1.00000E+00         1.20362E+00         4.20592E+02         1.19908E+02         3.00684E+02
+          1.02132E-02         3.25025E-03        -3.22612E-03         6.41709E-01         4.23543E-01         6.41717E-01         4.10246E+02         1.00000E+00         1.18236E+00         4.10258E+02         1.19678E+02         2.90580E+02
+          1.02132E-02         3.42008E-03        -3.26170E-03         6.41709E-01         4.34214E-01         6.41717E-01         3.99947E+02         1.00000E+00         1.16111E+00         3.99958E+02         1.19384E+02         2.80574E+02
+          1.02132E-02         3.58990E-03        -3.29910E-03         6.41708E-01         4.44884E-01         6.41717E-01         3.89697E+02         1.00000E+00         1.13987E+00         3.89708E+02         1.19024E+02         2.70684E+02
+          1.02132E-02         3.75973E-03        -3.33831E-03         6.41708E-01         4.55555E-01         6.41717E-01         3.79509E+02         1.00000E+00         1.11869E+00         3.79519E+02         1.18596E+02         2.60924E+02
+          1.02132E-02         3.92956E-03        -3.37934E-03         6.41708E-01         4.66225E-01         6.41716E-01         3.69396E+02         1.00000E+00         1.09758E+00         3.69406E+02         1.18100E+02         2.51307E+02
+          1.02132E-02         4.09939E-03        -3.42217E-03         6.41707E-01         4.76896E-01         6.41716E-01         3.59371E+02         1.00000E+00         1.07657E+00         3.59380E+02         1.17533E+02         2.41847E+02
+          1.02132E-02         4.26921E-03        -3.46682E-03         6.41707E-01         4.87567E-01         6.41716E-01         3.49444E+02         1.00000E+00         1.05569E+00         3.49453E+02         1.16896E+02         2.32558E+02
+          1.02132E-02         4.43904E-03        -3.51328E-03         6.41706E-01         4.98237E-01         6.41716E-01         3.39628E+02         1.00000E+00         1.03495E+00         3.39636E+02         1.16187E+02         2.23450E+02
+          1.02132E-02         4.60887E-03        -3.56155E-03         6.41706E-01         5.08908E-01         6.41716E-01         3.29932E+02         1.00000E+00         1.01438E+00         3.29940E+02         1.15405E+02         2.14535E+02
+          1.02132E-02         4.77869E-03        -3.61163E-03         6.41705E-01         5.19578E-01         6.41715E-01         3.20366E+02         1.00000E+00         9.94011E-01         3.20374E+02         1.14551E+02         2.05823E+02
+          1.02132E-02         4.94852E-03        -3.66353E-03         6.41705E-01         5.30249E-01         6.41715E-01         3.10940E+02         1.00000E+00         9.73850E-01         3.10947E+02         1.13625E+02         1.97322E+02
+          1.02132E-02         5.11835E-03        -3.71723E-03         6.41704E-01         5.40919E-01         6.41715E-01         3.01662E+02         1.00000E+00         9.53921E-01         3.01669E+02         1.12626E+02         1.89043E+02
+          1.02132E-02         5.28818E-03        -3.77275E-03         6.41704E-01         5.51590E-01         6.41715E-01         2.92540E+02         1.00000E+00         9.34242E-01         2.92546E+02         1.11555E+02         1.80991E+02
+          1.02132E-02         5.45800E-03        -3.83009E-03         6.41703E-01         5.62261E-01         6.41714E-01         2.83580E+02         1.00000E+00         9.14831E-01         2.83587E+02         1.10413E+02         1.73174E+02
+          1.02132E-02         5.62783E-03        -3.88923E-03         6.41702E-01         5.72931E-01         6.41714E-01         2.74791E+02         1.00000E+00         8.95704E-01         2.74797E+02         1.09200E+02         1.65597E+02
+          1.02132E-02         5.79766E-03        -3.95019E-03         6.41702E-01         5.83602E-01         6.41714E-01         2.66178E+02         1.00000E+00         8.76876E-01         2.66183E+02         1.07917E+02         1.58266E+02
+          1.02132E-02         5.96749E-03        -4.01295E-03         6.41701E-01         5.94272E-01         6.41714E-01         2.57745E+02         1.00000E+00         8.58361E-01         2.57750E+02         1.06566E+02         1.51184E+02
+          1.02132E-02         6.13731E-03        -4.07753E-03         6.41700E-01         6.04943E-01         6.41713E-01         2.49498E+02         1.00000E+00         8.40172E-01         2.49502E+02         1.05148E+02         1.44354E+02
+          1.02132E-02         6.30714E-03        -4.14393E-03         6.41700E-01         6.15613E-01         6.41713E-01         2.41440E+02         1.00000E+00         8.22319E-01         2.41444E+02         1.03665E+02         1.37779E+02
+          1.02132E-02         6.47697E-03        -4.21213E-03         6.41699E-01         6.26284E-01         6.41713E-01         2.33575E+02         1.00000E+00         8.04815E-01         2.33579E+02         1.02119E+02         1.31460E+02
+          1.02132E-02         6.64680E-03        -4.28215E-03         6.41698E-01         6.36955E-01         6.41713E-01         2.25906E+02         1.00000E+00         7.87667E-01         2.25909E+02         1.00511E+02         1.25398E+02
+          1.02132E-02         6.81662E-03        -4.35398E-03         6.41698E-01         6.47625E-01         6.41712E-01         2.18434E+02         1.00000E+00         7.70885E-01         2.18437E+02         9.88442E+01         1.19593E+02
+          1.02132E-02         6.98645E-03        -4.42762E-03         6.41697E-01         6.58296E-01         6.41712E-01         2.11162E+02         1.00000E+00         7.54475E-01         2.11164E+02         9.71206E+01         1.14044E+02
+          1.02132E-02         7.15628E-03        -4.50307E-03         6.41696E-01         6.68966E-01         6.41712E-01         2.04090E+02         1.00000E+00         7.38443E-01         2.04091E+02         9.53428E+01         1.08749E+02
+          1.02132E-02         7.32611E-03        -4.58034E-03         6.41695E-01         6.79637E-01         6.41712E-01         1.97218E+02         1.00000E+00         7.22795E-01         1.97219E+02         9.35136E+01         1.03706E+02
+          1.02132E-02         7.49593E-03        -4.65942E-03         6.41694E-01         6.90307E-01         6.41711E-01         1.90546E+02         1.00000E+00         7.07533E-01         1.90547E+02         9.16358E+01         9.89116E+01
+          1.02132E-02         7.66576E-03        -4.74031E-03         6.41694E-01         7.00978E-01         6.41711E-01         1.84074E+02         1.00000E+00         6.92662E-01         1.84075E+02         8.97123E+01         9.43630E+01
+          1.02132E-02         7.83559E-03        -4.82301E-03         6.41693E-01         7.11649E-01         6.41711E-01         1.77801E+02         1.00000E+00         6.78182E-01         1.77802E+02         8.77463E+01         9.00554E+01
+          1.02132E-02         8.00542E-03        -4.90752E-03         6.41692E-01         7.22319E-01         6.41711E-01         1.71725E+02         1.00000E+00         6.64095E-01         1.71725E+02         8.57409E+01         8.59843E+01
+          1.02132E-02         8.17524E-03        -4.99385E-03         6.41691E-01         7.32990E-01         6.41711E-01         1.65844E+02         1.00000E+00         6.50401E-01         1.65844E+02         8.36995E+01         8.21441E+01
+          1.02132E-02         8.34507E-03        -5.08199E-03         6.41690E-01         7.43660E-01         6.41710E-01         1.60155E+02         1.00000E+00         6.37099E-01         1.60155E+02         8.16255E+01         7.85291E+01
+          1.02132E-02         8.51490E-03        -5.17194E-03         6.41689E-01         7.54331E-01         6.41710E-01         1.54656E+02         1.00000E+00         6.24187E-01         1.54655E+02         7.95224E+01         7.51331E+01
+          1.02132E-02         8.68473E-03        -5.26370E-03         6.41688E-01         7.65001E-01         6.41710E-01         1.49344E+02         1.00000E+00         6.11664E-01         1.49343E+02         7.73935E+01         7.19492E+01
+          1.02132E-02         8.85455E-03        -5.35728E-03         6.41687E-01         7.75672E-01         6.41710E-01         1.44215E+02         1.00000E+00         5.99527E-01         1.44213E+02         7.52426E+01         6.89705E+01
+          1.02132E-02         9.02438E-03        -5.45267E-03         6.41686E-01         7.86343E-01         6.41710E-01         1.39265E+02         1.00000E+00         5.87771E-01         1.39263E+02         7.30733E+01         6.61896E+01
+          1.02132E-02         9.19421E-03        -5.54987E-03         6.41685E-01         7.97013E-01         6.41709E-01         1.34490E+02         1.00000E+00         5.76393E-01         1.34488E+02         7.08891E+01         6.35988E+01
+          1.02132E-02         9.36403E-03        -5.64888E-03         6.41684E-01         8.07684E-01         6.41709E-01         1.29886E+02         1.00000E+00         5.65388E-01         1.29884E+02         6.86937E+01         6.11901E+01
+          1.02132E-02         9.53386E-03        -5.74970E-03         6.41683E-01         8.18354E-01         6.41709E-01         1.25449E+02         1.00000E+00         5.54750E-01         1.25446E+02         6.64908E+01         5.89554E+01
+          1.02132E-02         9.70369E-03        -5.85234E-03         6.41682E-01         8.29025E-01         6.41709E-01         1.21173E+02         1.00000E+00         5.44475E-01         1.21170E+02         6.42840E+01         5.68864E+01
+          1.02132E-02         9.87352E-03        -5.95679E-03         6.41681E-01         8.39695E-01         6.41709E-01         1.17055E+02         1.00000E+00         5.34557E-01         1.17052E+02         6.20769E+01         5.49746E+01
+          1.02132E-02         1.00433E-02        -6.06305E-03         6.41680E-01         8.50366E-01         6.41709E-01         1.13088E+02         1.00000E+00         5.24989E-01         1.13085E+02         5.98731E+01         5.32116E+01
+          1.02132E-02         1.02132E-02        -6.17113E-03         6.41679E-01         8.61037E-01         6.41709E-01         1.09268E+02         1.00000E+00         5.15764E-01         1.09265E+02         5.76761E+01         5.15886E+01
+          1.02132E-02         1.03830E-02        -6.28101E-03         6.41678E-01         8.71707E-01         6.41709E-01         1.05590E+02         1.00000E+00         5.06877E-01         1.05587E+02         5.54894E+01         5.00971E+01
+          1.02132E-02         1.05528E-02        -6.39271E-03         6.41677E-01         8.82378E-01         6.41709E-01         1.02049E+02         1.00000E+00         4.98319E-01         1.02045E+02         5.33164E+01         4.87286E+01
+          1.02132E-02         1.07227E-02        -6.50622E-03         6.41676E-01         8.93048E-01         6.41709E-01         9.86390E+01         1.00000E+00         4.90085E-01         9.86349E+01         5.11604E+01         4.74744E+01
+          1.02132E-02         1.08925E-02        -6.62155E-03         6.41674E-01         9.03719E-01         6.41709E-01         9.53552E+01         1.00000E+00         4.82167E-01         9.53510E+01         4.90247E+01         4.63262E+01
+          1.02132E-02         1.10623E-02        -6.73868E-03         6.41673E-01         9.14389E-01         6.41709E-01         9.21925E+01         1.00000E+00         4.74557E-01         9.21881E+01         4.69124E+01         4.52757E+01
+          1.02132E-02         1.12321E-02        -6.85763E-03         6.41672E-01         9.25060E-01         6.41709E-01         8.91456E+01         1.00000E+00         4.67249E-01         8.91412E+01         4.48266E+01         4.43146E+01
+          1.02132E-02         1.14020E-02        -6.97839E-03         6.41671E-01         9.35731E-01         6.41709E-01         8.62096E+01         1.00000E+00         4.60235E-01         8.62051E+01         4.27701E+01         4.34350E+01
+          1.02132E-02         1.15718E-02        -7.10097E-03         6.41670E-01         9.46401E-01         6.41709E-01         8.33795E+01         1.00000E+00         4.53508E-01         8.33748E+01         4.07458E+01         4.26290E+01
+          1.02132E-02         1.17416E-02        -7.22535E-03         6.41668E-01         9.57072E-01         6.41709E-01         8.06503E+01         1.00000E+00         4.47061E-01         8.06456E+01         3.87564E+01         4.18892E+01
+          1.02132E-02         1.19114E-02        -7.35155E-03         6.41667E-01         9.67742E-01         6.41709E-01         7.80174E+01         1.00000E+00         4.40885E-01         7.80126E+01         3.68044E+01         4.12082E+01
+          1.02132E-02         1.20813E-02        -7.47956E-03         6.41666E-01         9.78413E-01         6.41709E-01         7.54760E+01         1.00000E+00         4.34975E-01         7.54712E+01         3.48922E+01         4.05791E+01
+          1.02132E-02         1.22511E-02        -7.60938E-03         6.41664E-01         9.89083E-01         6.41709E-01         7.30217E+01         1.00000E+00         4.29322E-01         7.30169E+01         3.30220E+01         3.99949E+01
+          1.02132E-02         1.24209E-02        -7.74102E-03         6.41663E-01         9.99754E-01         6.41710E-01         7.06503E+01         1.00000E+00         4.23920E-01         7.06455E+01         3.11961E+01         3.94494E+01
+          1.02132E-02         1.25908E-02        -7.87447E-03         6.41662E-01         1.01042E+00         6.41710E-01         6.83574E+01         1.00000E+00         4.18761E-01         6.83527E+01         2.94163E+01         3.89364E+01
+          1.02132E-02         1.27606E-02        -8.00973E-03         6.41660E-01         1.02110E+00         6.41710E-01         6.61393E+01         1.00000E+00         4.13838E-01         6.61345E+01         2.76845E+01         3.84501E+01
+          1.02132E-02         1.29304E-02        -8.14680E-03         6.41659E-01         1.03177E+00         6.41711E-01         6.39920E+01         1.00000E+00         4.09143E-01         6.39873E+01         2.60022E+01         3.79851E+01
+          1.02132E-02         1.31002E-02        -8.28569E-03         6.41657E-01         1.04244E+00         6.41711E-01         6.19120E+01         1.00000E+00         4.04671E-01         6.19074E+01         2.43711E+01         3.75363E+01
+          1.02132E-02         1.32701E-02        -8.42638E-03         6.41656E-01         1.05311E+00         6.41711E-01         5.98959E+01         1.00000E+00         4.00412E-01         5.98914E+01         2.27924E+01         3.70990E+01
+          1.02132E-02         1.34399E-02        -8.56889E-03         6.41655E-01         1.06378E+00         6.41712E-01         5.79405E+01         1.00000E+00         3.96361E-01         5.79361E+01         2.12672E+01         3.66689E+01
+          1.02132E-02         1.36097E-02        -8.71322E-03         6.41653E-01         1.07445E+00         6.41712E-01         5.60429E+01         1.00000E+00         3.92511E-01         5.60385E+01         1.97966E+01         3.62419E+01
+          1.02132E-02         1.37795E-02        -8.85935E-03         6.41652E-01         1.08512E+00         6.41713E-01         5.42001E+01         1.00000E+00         3.88853E-01         5.41959E+01         1.83814E+01         3.58145E+01
+          1.02132E-02         1.39494E-02        -9.00730E-03         6.41650E-01         1.09579E+00         6.41713E-01         5.24098E+01         1.00000E+00         3.85381E-01         5.24057E+01         1.70223E+01         3.53833E+01
+          1.02132E-02         1.41192E-02        -9.15706E-03         6.41649E-01         1.10646E+00         6.41714E-01         5.06694E+01         1.00000E+00         3.82087E-01         5.06655E+01         1.57198E+01         3.49456E+01
+          1.02132E-02         1.42890E-02        -9.30864E-03         6.41647E-01         1.11713E+00         6.41715E-01         4.89769E+01         1.00000E+00         3.78965E-01         4.89731E+01         1.44743E+01         3.44988E+01
+          1.02132E-02         1.44589E-02        -9.46202E-03         6.41645E-01         1.12780E+00         6.41715E-01         4.73303E+01         1.00000E+00         3.76007E-01         4.73266E+01         1.32859E+01         3.40406E+01
+          1.02132E-02         1.46287E-02        -9.61722E-03         6.41644E-01         1.13847E+00         6.41716E-01         4.57277E+01         1.00000E+00         3.73206E-01         4.57242E+01         1.21548E+01         3.35694E+01
+          1.02132E-02         1.47985E-02        -9.77423E-03         6.41642E-01         1.14914E+00         6.41717E-01         4.41676E+01         1.00000E+00         3.70555E-01         4.41643E+01         1.10808E+01         3.30835E+01
+          1.02132E-02         1.49683E-02        -9.93306E-03         6.41641E-01         1.15981E+00         6.41718E-01         4.26487E+01         1.00000E+00         3.68045E-01         4.26455E+01         1.00637E+01         3.25819E+01
+          1.02132E-02         1.51382E-02        -1.00937E-02         6.41639E-01         1.17048E+00         6.41718E-01         4.11696E+01         1.00000E+00         3.65671E-01         4.11667E+01         9.10309E+00         3.20636E+01
+          1.02132E-02         1.53080E-02        -1.02561E-02         6.41637E-01         1.18115E+00         6.41719E-01         3.97293E+01         1.00000E+00         3.63425E-01         3.97266E+01         8.19851E+00         3.15281E+01
+          1.02132E-02         1.54778E-02        -1.04204E-02         6.41636E-01         1.19182E+00         6.41720E-01         3.83270E+01         1.00000E+00         3.61299E-01         3.83244E+01         7.34930E+00         3.09751E+01
+          1.02132E-02         1.56476E-02        -1.05865E-02         6.41634E-01         1.20249E+00         6.41721E-01         3.69618E+01         1.00000E+00         3.59286E-01         3.69595E+01         6.55472E+00         3.04047E+01
+          1.02132E-02         1.58175E-02        -1.07544E-02         6.41632E-01         1.21317E+00         6.41722E-01         3.56331E+01         1.00000E+00         3.57379E-01         3.56310E+01         5.81387E+00         2.98172E+01
+          1.02132E-02         1.59873E-02        -1.09241E-02         6.41631E-01         1.22384E+00         6.41723E-01         3.43406E+01         1.00000E+00         3.55571E-01         3.43387E+01         5.12578E+00         2.92129E+01
+          1.02132E-02         1.61571E-02        -1.10956E-02         6.41629E-01         1.23451E+00         6.41725E-01         3.30837E+01         1.00000E+00         3.53855E-01         3.30820E+01         4.48934E+00         2.85927E+01
+          1.02132E-02         1.63270E-02        -1.12689E-02         6.41627E-01         1.24518E+00         6.41726E-01         3.18623E+01         1.00000E+00         3.52223E-01         3.18608E+01         3.90338E+00         2.79574E+01
+          1.02132E-02         1.64968E-02        -1.14440E-02         6.41625E-01         1.25585E+00         6.41727E-01         3.06761E+01         1.00000E+00         3.50669E-01         3.06749E+01         3.36662E+00         2.73083E+01
+          1.02132E-02         1.66666E-02        -1.16210E-02         6.41623E-01         1.26652E+00         6.41729E-01         2.95252E+01         1.00000E+00         3.49186E-01         2.95242E+01         2.87768E+00         2.66465E+01
+          1.02132E-02         1.68364E-02        -1.17998E-02         6.41622E-01         1.27719E+00         6.41730E-01         2.84095E+01         1.00000E+00         3.47766E-01         2.84088E+01         2.43513E+00         2.59736E+01
+          1.02132E-02         1.70063E-02        -1.19803E-02         6.41620E-01         1.28786E+00         6.41732E-01         2.73291E+01         1.00000E+00         3.46404E-01         2.73286E+01         2.03745E+00         2.52911E+01
+          1.02132E-02         1.71761E-02        -1.21627E-02         6.41618E-01         1.29853E+00         6.41733E-01         2.62842E+01         1.00000E+00         3.45093E-01         2.62839E+01         1.68308E+00         2.46008E+01
+          1.02132E-02         1.73459E-02        -1.23469E-02         6.41616E-01         1.30920E+00         6.41735E-01         2.52748E+01         1.00000E+00         3.43826E-01         2.52747E+01         1.37038E+00         2.39043E+01
+          1.02132E-02         1.75158E-02        -1.25329E-02         6.41614E-01         1.31987E+00         6.41736E-01         2.43012E+01         1.00000E+00         3.42598E-01         2.43013E+01         1.09767E+00         2.32037E+01
+          1.02132E-02         1.76856E-02        -1.27208E-02         6.41612E-01         1.33054E+00         6.41738E-01         2.33636E+01         1.00000E+00         3.41401E-01         2.33640E+01         8.63239E-01         2.25007E+01
+          1.02132E-02         1.78554E-02        -1.29104E-02         6.41610E-01         1.34121E+00         6.41740E-01         2.24622E+01         1.00000E+00         3.40231E-01         2.24628E+01         6.65329E-01         2.17975E+01
+          1.02132E-02         1.80252E-02        -1.31019E-02         6.41608E-01         1.35188E+00         6.41742E-01         2.15974E+01         1.00000E+00         3.39082E-01         2.15982E+01         5.02158E-01         2.10960E+01
+          1.02132E-02         1.81951E-02        -1.32951E-02         6.41606E-01         1.36255E+00         6.41744E-01         2.07692E+01         1.00000E+00         3.37948E-01         2.07702E+01         3.71926E-01         2.03982E+01
+          1.02132E-02         1.83649E-02        -1.34902E-02         6.41604E-01         1.37322E+00         6.41746E-01         1.99779E+01         1.00000E+00         3.36824E-01         1.99791E+01         2.72815E-01         1.97063E+01
+          1.02132E-02         1.85347E-02        -1.36871E-02         6.41602E-01         1.38389E+00         6.41748E-01         1.92236E+01         1.00000E+00         3.35704E-01         1.92250E+01         2.03002E-01         1.90220E+01
+          1.02132E-02         1.87045E-02        -1.38858E-02         6.41600E-01         1.39457E+00         6.41750E-01         1.85067E+01         1.00000E+00         3.34585E-01         1.85083E+01         1.60662E-01         1.83476E+01
+          1.02132E-02         1.88744E-02        -1.40863E-02         6.41598E-01         1.40524E+00         6.41753E-01         1.78270E+01         1.00000E+00         3.33461E-01         1.78288E+01         1.43976E-01         1.76848E+01
+          1.02132E-02         1.90442E-02        -1.42887E-02         6.41596E-01         1.41591E+00         6.41755E-01         1.71848E+01         1.00000E+00         3.32328E-01         1.71867E+01         1.51132E-01         1.70356E+01
+          1.02132E-02         1.92140E-02        -1.44928E-02         6.41594E-01         1.42658E+00         6.41758E-01         1.65800E+01         1.00000E+00         3.31182E-01         1.65821E+01         1.80339E-01         1.64018E+01
+          1.02132E-02         1.93839E-02        -1.46988E-02         6.41592E-01         1.43725E+00         6.41760E-01         1.60125E+01         1.00000E+00         3.30019E-01         1.60148E+01         2.29824E-01         1.57850E+01
+          1.02132E-02         1.95537E-02        -1.49065E-02         6.41590E-01         1.44792E+00         6.41763E-01         1.54824E+01         1.00000E+00         3.28835E-01         1.54848E+01         2.97842E-01         1.51869E+01
+          1.02132E-02         1.97235E-02        -1.51161E-02         6.41588E-01         1.45859E+00         6.41766E-01         1.49893E+01         1.00000E+00         3.27627E-01         1.49918E+01         3.82679E-01         1.46092E+01
+          1.02132E-02         1.98933E-02        -1.53275E-02         6.41586E-01         1.46926E+00         6.41769E-01         1.45330E+01         1.00000E+00         3.26391E-01         1.45357E+01         4.82658E-01         1.40530E+01
+          1.02132E-02         2.00632E-02        -1.55407E-02         6.41583E-01         1.47993E+00         6.41772E-01         1.41133E+01         1.00000E+00         3.25125E-01         1.41161E+01         5.96140E-01         1.35199E+01
+          1.02132E-02         2.02330E-02        -1.57558E-02         6.41581E-01         1.49060E+00         6.41775E-01         1.37296E+01         1.00000E+00         3.23825E-01         1.37326E+01         7.21532E-01         1.30110E+01
+          1.02132E-02         2.04028E-02        -1.59726E-02         6.41579E-01         1.50127E+00         6.41778E-01         1.33817E+01         1.00000E+00         3.22489E-01         1.33847E+01         8.57287E-01         1.25274E+01
+          1.02132E-02         2.05726E-02        -1.61912E-02         6.41577E-01         1.51194E+00         6.41781E-01         1.30688E+01         1.00000E+00         3.21114E-01         1.30719E+01         1.00191E+00         1.20700E+01
+          1.02132E-02         2.07425E-02        -1.64117E-02         6.41574E-01         1.52261E+00         6.41784E-01         1.27904E+01         1.00000E+00         3.19699E-01         1.27936E+01         1.15396E+00         1.16396E+01
+          1.02132E-02         2.09123E-02        -1.66340E-02         6.41572E-01         1.53328E+00         6.41788E-01         1.25457E+01         1.00000E+00         3.18241E-01         1.25490E+01         1.31205E+00         1.12370E+01
+          1.02132E-02         2.10821E-02        -1.68581E-02         6.41570E-01         1.54395E+00         6.41791E-01         1.23341E+01         1.00000E+00         3.16739E-01         1.23374E+01         1.47486E+00         1.08626E+01
+          1.02132E-02         2.12520E-02        -1.70840E-02         6.41568E-01         1.55462E+00         6.41795E-01         1.21545E+01         1.00000E+00         3.15191E-01         1.21579E+01         1.64111E+00         1.05168E+01
+          1.02132E-02         2.14218E-02        -1.73117E-02         6.41565E-01         1.56529E+00         6.41799E-01         1.20062E+01         1.00000E+00         3.13595E-01         1.20096E+01         1.80960E+00         1.02000E+01
+          1.02132E-02         2.15916E-02        -1.75412E-02         6.41563E-01         1.57596E+00         6.41803E-01         1.18880E+01         1.00000E+00         3.11951E-01         1.18915E+01         1.97921E+00         9.91228E+00
+          1.02132E-02         2.17614E-02        -1.77726E-02         6.41561E-01         1.58664E+00         6.41807E-01         1.17990E+01         1.00000E+00         3.10258E-01         1.18025E+01         2.14883E+00         9.65363E+00
+          1.02132E-02         2.19313E-02        -1.80057E-02         6.41558E-01         1.59731E+00         6.41811E-01         1.17379E+01         1.00000E+00         3.08514E-01         1.17414E+01         2.31748E+00         9.42394E+00
+          1.02132E-02         2.21011E-02        -1.82407E-02         6.41556E-01         1.60798E+00         6.41815E-01         1.17037E+01         1.00000E+00         3.06719E-01         1.17072E+01         2.48420E+00         9.22296E+00
+          1.02132E-02         2.22709E-02        -1.84775E-02         6.41553E-01         1.61865E+00         6.41819E-01         1.16949E+01         1.00000E+00         3.04872E-01         1.16984E+01         2.64812E+00         9.05031E+00
+          1.02132E-02         2.24407E-02        -1.87161E-02         6.41551E-01         1.62932E+00         6.41824E-01         1.17105E+01         1.00000E+00         3.02974E-01         1.17139E+01         2.80842E+00         8.90551E+00
+          1.02132E-02         2.26106E-02        -1.89565E-02         6.41548E-01         1.63999E+00         6.41828E-01         1.17489E+01         1.00000E+00         3.01024E-01         1.17523E+01         2.96437E+00         8.78795E+00
+          1.02132E-02         2.27804E-02        -1.91987E-02         6.41546E-01         1.65066E+00         6.41833E-01         1.18088E+01         1.00000E+00         2.99022E-01         1.18122E+01         3.11527E+00         8.69693E+00
+          1.02132E-02         2.29502E-02        -1.94427E-02         6.41543E-01         1.66133E+00         6.41838E-01         1.18888E+01         1.00000E+00         2.96968E-01         1.18921E+01         3.26051E+00         8.63163E+00
+          1.02132E-02         2.31201E-02        -1.96886E-02         6.41541E-01         1.67200E+00         6.41843E-01         1.19874E+01         1.00000E+00         2.94863E-01         1.19907E+01         3.39954E+00         8.59116E+00
+          1.02132E-02         2.32899E-02        -1.99363E-02         6.41538E-01         1.68267E+00         6.41848E-01         1.21031E+01         1.00000E+00         2.92706E-01         1.21064E+01         3.53187E+00         8.57451E+00
+          1.02132E-02         2.34597E-02        -2.01857E-02         6.41536E-01         1.69334E+00         6.41853E-01         1.22345E+01         1.00000E+00         2.90499E-01         1.22377E+01         3.65707E+00         8.58063E+00
+          1.02132E-02         2.36295E-02        -2.04370E-02         6.41533E-01         1.70401E+00         6.41859E-01         1.23800E+01         1.00000E+00         2.88242E-01         1.23831E+01         3.77477E+00         8.60837E+00
+          1.02132E-02         2.37994E-02        -2.06901E-02         6.41531E-01         1.71468E+00         6.41864E-01         1.25382E+01         1.00000E+00         2.85936E-01         1.25412E+01         3.88466E+00         8.65651E+00
+          1.02132E-02         2.39692E-02        -2.09451E-02         6.41528E-01         1.72535E+00         6.41870E-01         1.27073E+01         1.00000E+00         2.83581E-01         1.27103E+01         3.98647E+00         8.72379E+00
+          1.02132E-02         2.41390E-02        -2.12018E-02         6.41526E-01         1.73602E+00         6.41876E-01         1.28861E+01         1.00000E+00         2.81179E-01         1.28889E+01         4.08001E+00         8.80889E+00
+          1.02132E-02         2.43088E-02        -2.14603E-02         6.41523E-01         1.74669E+00         6.41882E-01         1.30729E+01         1.00000E+00         2.78732E-01         1.30756E+01         4.16513E+00         8.91046E+00
+          1.02132E-02         2.44787E-02        -2.17207E-02         6.41520E-01         1.75736E+00         6.41888E-01         1.32662E+01         1.00000E+00         2.76239E-01         1.32688E+01         4.24171E+00         9.02711E+00
+          1.02132E-02         2.46485E-02        -2.19829E-02         6.41518E-01         1.76804E+00         6.41894E-01         1.34646E+01         1.00000E+00         2.73702E-01         1.34671E+01         4.30972E+00         9.15742E+00
+          1.02132E-02         2.48183E-02        -2.22468E-02         6.41515E-01         1.77871E+00         6.41900E-01         1.36667E+01         1.00000E+00         2.71124E-01         1.36691E+01         4.36912E+00         9.29994E+00
+          1.02132E-02         2.49882E-02        -2.25126E-02         6.41512E-01         1.78938E+00         6.41907E-01         1.38709E+01         1.00000E+00         2.68504E-01         1.38732E+01         4.41996E+00         9.45324E+00
+          1.02132E-02         2.51580E-02        -2.27803E-02         6.41509E-01         1.80005E+00         6.41914E-01         1.40760E+01         1.00000E+00         2.65846E-01         1.40782E+01         4.46231E+00         9.61586E+00
+          1.02132E-02         2.53278E-02        -2.30497E-02         6.41507E-01         1.81072E+00         6.41921E-01         1.42806E+01         1.00000E+00         2.63150E-01         1.42826E+01         4.49626E+00         9.78635E+00
+          1.02132E-02         2.54976E-02        -2.33209E-02         6.41504E-01         1.82139E+00         6.41928E-01         1.44834E+01         1.00000E+00         2.60418E-01         1.44853E+01         4.52197E+00         9.96329E+00
+          1.02132E-02         2.56675E-02        -2.35940E-02         6.41501E-01         1.83206E+00         6.41935E-01         1.46831E+01         1.00000E+00         2.57651E-01         1.46849E+01         4.53961E+00         1.01453E+01
+          1.02132E-02         2.58373E-02        -2.38689E-02         6.41498E-01         1.84273E+00         6.41942E-01         1.48786E+01         1.00000E+00         2.54853E-01         1.48802E+01         4.54937E+00         1.03308E+01
+          1.02132E-02         2.60071E-02        -2.41455E-02         6.41495E-01         1.85340E+00         6.41950E-01         1.50687E+01         1.00000E+00         2.52024E-01         1.50702E+01         4.55149E+00         1.05187E+01
+          1.02132E-02         2.61769E-02        -2.44240E-02         6.41493E-01         1.86407E+00         6.41957E-01         1.52523E+01         1.00000E+00         2.49166E-01         1.52537E+01         4.54622E+00         1.07075E+01
+          1.03830E-02         8.72665E-04        -3.02807E-03         6.52383E-01         2.74155E-01         6.52390E-01         5.24565E+02         1.00000E+00         1.16214E+00         5.24576E+02         8.34480E+01         4.41128E+02
+          1.03830E-02         1.04249E-03        -3.03829E-03         6.52383E-01         2.84826E-01         6.52390E-01         5.15299E+02         1.00000E+00         1.14765E+00         5.15310E+02         8.41257E+01         4.31185E+02
+          1.03830E-02         1.21232E-03        -3.05031E-03         6.52383E-01         2.95496E-01         6.52390E-01         5.05865E+02         1.00000E+00         1.13286E+00         5.05876E+02         8.47882E+01         4.21088E+02
+          1.03830E-02         1.38215E-03        -3.06416E-03         6.52382E-01         3.06167E-01         6.52390E-01         4.96280E+02         1.00000E+00         1.11779E+00         4.96291E+02         8.54321E+01         4.10859E+02
+          1.03830E-02         1.55197E-03        -3.07981E-03         6.52382E-01         3.16838E-01         6.52390E-01         4.86561E+02         1.00000E+00         1.10246E+00         4.86572E+02         8.60537E+01         4.00518E+02
+          1.03830E-02         1.72180E-03        -3.09728E-03         6.52382E-01         3.27508E-01         6.52389E-01         4.76726E+02         1.00000E+00         1.08689E+00         4.76736E+02         8.66496E+01         3.90086E+02
+          1.03830E-02         1.89163E-03        -3.11655E-03         6.52382E-01         3.38179E-01         6.52389E-01         4.66790E+02         1.00000E+00         1.07112E+00         4.66800E+02         8.72164E+01         3.79583E+02
+          1.03830E-02         2.06146E-03        -3.13764E-03         6.52382E-01         3.48849E-01         6.52389E-01         4.56772E+02         1.00000E+00         1.05515E+00         4.56781E+02         8.77507E+01         3.69031E+02
+          1.03830E-02         2.23128E-03        -3.16054E-03         6.52381E-01         3.59520E-01         6.52389E-01         4.46687E+02         1.00000E+00         1.03902E+00         4.46697E+02         8.82494E+01         3.58447E+02
+          1.03830E-02         2.40111E-03        -3.18526E-03         6.52381E-01         3.70190E-01         6.52389E-01         4.36554E+02         1.00000E+00         1.02276E+00         4.36563E+02         8.87091E+01         3.47854E+02
+          1.03830E-02         2.57094E-03        -3.21178E-03         6.52381E-01         3.80861E-01         6.52389E-01         4.26387E+02         1.00000E+00         1.00637E+00         4.26396E+02         8.91270E+01         3.37269E+02
+          1.03830E-02         2.74077E-03        -3.24012E-03         6.52381E-01         3.91532E-01         6.52389E-01         4.16203E+02         1.00000E+00         9.89896E-01         4.16212E+02         8.95002E+01         3.26711E+02
+          1.03830E-02         2.91059E-03        -3.27027E-03         6.52380E-01         4.02202E-01         6.52389E-01         4.06018E+02         1.00000E+00         9.73350E-01         4.06026E+02         8.98258E+01         3.16200E+02
+          1.03830E-02         3.08042E-03        -3.30223E-03         6.52380E-01         4.12873E-01         6.52388E-01         3.95846E+02         1.00000E+00         9.56758E-01         3.95854E+02         9.01013E+01         3.05753E+02
+          1.03830E-02         3.25025E-03        -3.33601E-03         6.52380E-01         4.23543E-01         6.52388E-01         3.85703E+02         1.00000E+00         9.40141E-01         3.85711E+02         9.03241E+01         2.95387E+02
+          1.03830E-02         3.42008E-03        -3.37160E-03         6.52379E-01         4.34214E-01         6.52388E-01         3.75604E+02         1.00000E+00         9.23522E-01         3.75611E+02         9.04921E+01         2.85119E+02
+          1.03830E-02         3.58990E-03        -3.40899E-03         6.52379E-01         4.44884E-01         6.52388E-01         3.65561E+02         1.00000E+00         9.06922E-01         3.65569E+02         9.06031E+01         2.74966E+02
+          1.03830E-02         3.75973E-03        -3.44820E-03         6.52378E-01         4.55555E-01         6.52388E-01         3.55589E+02         1.00000E+00         8.90362E-01         3.55596E+02         9.06551E+01         2.64941E+02
+          1.03830E-02         3.92956E-03        -3.48923E-03         6.52378E-01         4.66225E-01         6.52387E-01         3.45701E+02         1.00000E+00         8.73862E-01         3.45708E+02         9.06464E+01         2.55061E+02
+          1.03830E-02         4.09939E-03        -3.53206E-03         6.52378E-01         4.76896E-01         6.52387E-01         3.35908E+02         1.00000E+00         8.57443E-01         3.35914E+02         9.05754E+01         2.45339E+02
+          1.03830E-02         4.26921E-03        -3.57671E-03         6.52377E-01         4.87567E-01         6.52387E-01         3.26222E+02         1.00000E+00         8.41122E-01         3.26228E+02         9.04409E+01         2.35788E+02
+          1.03830E-02         4.43904E-03        -3.62317E-03         6.52377E-01         4.98237E-01         6.52387E-01         3.16655E+02         1.00000E+00         8.24918E-01         3.16661E+02         9.02415E+01         2.26420E+02
+          1.03830E-02         4.60887E-03        -3.67144E-03         6.52376E-01         5.08908E-01         6.52386E-01         3.07217E+02         1.00000E+00         8.08850E-01         3.07223E+02         8.99765E+01         2.17246E+02
+          1.03830E-02         4.77869E-03        -3.72152E-03         6.52376E-01         5.19578E-01         6.52386E-01         2.97918E+02         1.00000E+00         7.92933E-01         2.97923E+02         8.96449E+01         2.08278E+02
+          1.03830E-02         4.94852E-03        -3.77342E-03         6.52375E-01         5.30249E-01         6.52386E-01         2.88766E+02         1.00000E+00         7.77185E-01         2.88771E+02         8.92464E+01         1.99525E+02
+          1.03830E-02         5.11835E-03        -3.82712E-03         6.52375E-01         5.40919E-01         6.52386E-01         2.79771E+02         1.00000E+00         7.61619E-01         2.79776E+02         8.87805E+01         1.90996E+02
+          1.03830E-02         5.28818E-03        -3.88264E-03         6.52374E-01         5.51590E-01         6.52386E-01         2.70941E+02         1.00000E+00         7.46250E-01         2.70945E+02         8.82472E+01         1.82698E+02
+          1.03830E-02         5.45800E-03        -3.93998E-03         6.52373E-01         5.62261E-01         6.52385E-01         2.62281E+02         1.00000E+00         7.31093E-01         2.62286E+02         8.76465E+01         1.74639E+02
+          1.03830E-02         5.62783E-03        -3.99912E-03         6.52373E-01         5.72931E-01         6.52385E-01         2.53800E+02         1.00000E+00         7.16159E-01         2.53804E+02         8.69788E+01         1.66825E+02
+          1.03830E-02         5.79766E-03        -4.06008E-03         6.52372E-01         5.83602E-01         6.52385E-01         2.45502E+02         1.00000E+00         7.01461E-01         2.45506E+02         8.62446E+01         1.59262E+02
+          1.03830E-02         5.96749E-03        -4.12284E-03         6.52371E-01         5.94272E-01         6.52385E-01         2.37394E+02         1.00000E+00         6.87008E-01         2.37397E+02         8.54445E+01         1.51953E+02
+          1.03830E-02         6.13731E-03        -4.18742E-03         6.52371E-01         6.04943E-01         6.52384E-01         2.29478E+02         1.00000E+00         6.72812E-01         2.29481E+02         8.45795E+01         1.44902E+02
+          1.03830E-02         6.30714E-03        -4.25382E-03         6.52370E-01         6.15613E-01         6.52384E-01         2.21760E+02         1.00000E+00         6.58881E-01         2.21763E+02         8.36507E+01         1.38112E+02
+          1.03830E-02         6.47697E-03        -4.32202E-03         6.52369E-01         6.26284E-01         6.52384E-01         2.14241E+02         1.00000E+00         6.45224E-01         2.14244E+02         8.26594E+01         1.31585E+02
+          1.03830E-02         6.64680E-03        -4.39204E-03         6.52369E-01         6.36955E-01         6.52383E-01         2.06926E+02         1.00000E+00         6.31847E-01         2.06928E+02         8.16070E+01         1.25321E+02
+          1.03830E-02         6.81662E-03        -4.46387E-03         6.52368E-01         6.47625E-01         6.52383E-01         1.99814E+02         1.00000E+00         6.18756E-01         1.99817E+02         8.04953E+01         1.19321E+02
+          1.03830E-02         6.98645E-03        -4.53751E-03         6.52367E-01         6.58296E-01         6.52383E-01         1.92909E+02         1.00000E+00         6.05959E-01         1.92911E+02         7.93260E+01         1.13585E+02
+          1.03830E-02         7.15628E-03        -4.61296E-03         6.52366E-01         6.68966E-01         6.52383E-01         1.86210E+02         1.00000E+00         5.93458E-01         1.86212E+02         7.81011E+01         1.08111E+02
+          1.03830E-02         7.32611E-03        -4.69023E-03         6.52366E-01         6.79637E-01         6.52382E-01         1.79718E+02         1.00000E+00         5.81259E-01         1.79719E+02         7.68228E+01         1.02896E+02
+          1.03830E-02         7.49593E-03        -4.76930E-03         6.52365E-01         6.90307E-01         6.52382E-01         1.73431E+02         1.00000E+00         5.69363E-01         1.73432E+02         7.54933E+01         9.79389E+01
+          1.03830E-02         7.66576E-03        -4.85019E-03         6.52364E-01         7.00978E-01         6.52382E-01         1.67350E+02         1.00000E+00         5.57773E-01         1.67351E+02         7.41151E+01         9.32355E+01
+          1.03830E-02         7.83559E-03        -4.93290E-03         6.52363E-01         7.11649E-01         6.52382E-01         1.61472E+02         1.00000E+00         5.46491E-01         1.61473E+02         7.26906E+01         8.87819E+01
+          1.03830E-02         8.00542E-03        -5.01741E-03         6.52362E-01         7.22319E-01         6.52381E-01         1.55796E+02         1.00000E+00         5.35517E-01         1.55796E+02         7.12227E+01         8.45733E+01
+          1.03830E-02         8.17524E-03        -5.10374E-03         6.52361E-01         7.32990E-01         6.52381E-01         1.50319E+02         1.00000E+00         5.24852E-01         1.50319E+02         6.97139E+01         8.06048E+01
+          1.03830E-02         8.34507E-03        -5.19188E-03         6.52360E-01         7.43660E-01         6.52381E-01         1.45038E+02         1.00000E+00         5.14494E-01         1.45038E+02         6.81672E+01         7.68705E+01
+          1.03830E-02         8.51490E-03        -5.28183E-03         6.52359E-01         7.54331E-01         6.52381E-01         1.39950E+02         1.00000E+00         5.04442E-01         1.39950E+02         6.65855E+01         7.33642E+01
+          1.03830E-02         8.68473E-03        -5.37359E-03         6.52358E-01         7.65001E-01         6.52381E-01         1.35052E+02         1.00000E+00         4.94696E-01         1.35051E+02         6.49719E+01         7.00794E+01
+          1.03830E-02         8.85455E-03        -5.46717E-03         6.52358E-01         7.75672E-01         6.52380E-01         1.30339E+02         1.00000E+00         4.85252E-01         1.30338E+02         6.33294E+01         6.70089E+01
+          1.03830E-02         9.02438E-03        -5.56255E-03         6.52357E-01         7.86343E-01         6.52380E-01         1.25808E+02         1.00000E+00         4.76107E-01         1.25807E+02         6.16611E+01         6.41455E+01
+          1.03830E-02         9.19421E-03        -5.65975E-03         6.52356E-01         7.97013E-01         6.52380E-01         1.21453E+02         1.00000E+00         4.67259E-01         1.21452E+02         5.99702E+01         6.14814E+01
+          1.03830E-02         9.36403E-03        -5.75877E-03         6.52354E-01         8.07684E-01         6.52380E-01         1.17270E+02         1.00000E+00         4.58704E-01         1.17269E+02         5.82599E+01         5.90087E+01
+          1.03830E-02         9.53386E-03        -5.85959E-03         6.52353E-01         8.18354E-01         6.52380E-01         1.13254E+02         1.00000E+00         4.50437E-01         1.13253E+02         5.65335E+01         5.67191E+01
+          1.03830E-02         9.70369E-03        -5.96223E-03         6.52352E-01         8.29025E-01         6.52380E-01         1.09400E+02         1.00000E+00         4.42455E-01         1.09398E+02         5.47941E+01         5.46041E+01
+          1.03830E-02         9.87352E-03        -6.06668E-03         6.52351E-01         8.39695E-01         6.52379E-01         1.05702E+02         1.00000E+00         4.34752E-01         1.05700E+02         5.30450E+01         5.26554E+01
+          1.03830E-02         1.00433E-02        -6.17294E-03         6.52350E-01         8.50366E-01         6.52379E-01         1.02156E+02         1.00000E+00         4.27324E-01         1.02153E+02         5.12893E+01         5.08640E+01
+          1.03830E-02         1.02132E-02        -6.28101E-03         6.52349E-01         8.61037E-01         6.52379E-01         9.87541E+01         1.00000E+00         4.20166E-01         9.87518E+01         4.95304E+01         4.92214E+01
+          1.03830E-02         1.03830E-02        -6.39090E-03         6.52348E-01         8.71707E-01         6.52379E-01         9.54923E+01         1.00000E+00         4.13273E-01         9.54898E+01         4.77712E+01         4.77187E+01
+          1.03830E-02         1.05528E-02        -6.50260E-03         6.52347E-01         8.82378E-01         6.52379E-01         9.23645E+01         1.00000E+00         4.06638E-01         9.23619E+01         4.60150E+01         4.63470E+01
+          1.03830E-02         1.07227E-02        -6.61611E-03         6.52346E-01         8.93048E-01         6.52379E-01         8.93650E+01         1.00000E+00         4.00257E-01         8.93623E+01         4.42647E+01         4.50977E+01
+          1.03830E-02         1.08925E-02        -6.73143E-03         6.52344E-01         9.03719E-01         6.52379E-01         8.64881E+01         1.00000E+00         3.94125E-01         8.64853E+01         4.25234E+01         4.39619E+01
+          1.03830E-02         1.10623E-02        -6.84857E-03         6.52343E-01         9.14389E-01         6.52379E-01         8.37280E+01         1.00000E+00         3.88234E-01         8.37251E+01         4.07939E+01         4.29312E+01
+          1.03830E-02         1.12321E-02        -6.96752E-03         6.52342E-01         9.25060E-01         6.52379E-01         8.10792E+01         1.00000E+00         3.82581E-01         8.10762E+01         3.90792E+01         4.19970E+01
+          1.03830E-02         1.14020E-02        -7.08828E-03         6.52341E-01         9.35731E-01         6.52379E-01         7.85360E+01         1.00000E+00         3.77158E-01         7.85330E+01         3.73819E+01         4.11511E+01
+          1.03830E-02         1.15718E-02        -7.21085E-03         6.52339E-01         9.46401E-01         6.52379E-01         7.60931E+01         1.00000E+00         3.71960E-01         7.60899E+01         3.57047E+01         4.03852E+01
+          1.03830E-02         1.17416E-02        -7.33524E-03         6.52338E-01         9.57072E-01         6.52379E-01         7.37449E+01         1.00000E+00         3.66982E-01         7.37418E+01         3.40502E+01         3.96915E+01
+          1.03830E-02         1.19114E-02        -7.46143E-03         6.52337E-01         9.67742E-01         6.52379E-01         7.14864E+01         1.00000E+00         3.62217E-01         7.14832E+01         3.24209E+01         3.90623E+01
+          1.03830E-02         1.20813E-02        -7.58944E-03         6.52335E-01         9.78413E-01         6.52380E-01         6.93125E+01         1.00000E+00         3.57660E-01         6.93092E+01         3.08189E+01         3.84903E+01
+          1.03830E-02         1.22511E-02        -7.71927E-03         6.52334E-01         9.89083E-01         6.52380E-01         6.72181E+01         1.00000E+00         3.53305E-01         6.72148E+01         2.92467E+01         3.79681E+01
+          1.03830E-02         1.24209E-02        -7.85090E-03         6.52333E-01         9.99754E-01         6.52380E-01         6.51986E+01         1.00000E+00         3.49146E-01         6.51953E+01         2.77062E+01         3.74892E+01
+          1.03830E-02         1.25908E-02        -7.98435E-03         6.52331E-01         1.01042E+00         6.52380E-01         6.32495E+01         1.00000E+00         3.45178E-01         6.32462E+01         2.61994E+01         3.70468E+01
+          1.03830E-02         1.27606E-02        -8.11961E-03         6.52330E-01         1.02110E+00         6.52381E-01         6.13662E+01         1.00000E+00         3.41394E-01         6.13630E+01         2.47281E+01         3.66348E+01
+          1.03830E-02         1.29304E-02        -8.25668E-03         6.52329E-01         1.03177E+00         6.52381E-01         5.95449E+01         1.00000E+00         3.37790E-01         5.95416E+01         2.32942E+01         3.62474E+01
+          1.03830E-02         1.31002E-02        -8.39557E-03         6.52327E-01         1.04244E+00         6.52381E-01         5.77813E+01         1.00000E+00         3.34359E-01         5.77781E+01         2.18990E+01         3.58791E+01
+          1.03830E-02         1.32701E-02        -8.53627E-03         6.52326E-01         1.05311E+00         6.52381E-01         5.60720E+01         1.00000E+00         3.31095E-01         5.60688E+01         2.05440E+01         3.55248E+01
+          1.03830E-02         1.34399E-02        -8.67878E-03         6.52324E-01         1.06378E+00         6.52382E-01         5.44133E+01         1.00000E+00         3.27993E-01         5.44101E+01         1.92306E+01         3.51796E+01
+          1.03830E-02         1.36097E-02        -8.82310E-03         6.52323E-01         1.07445E+00         6.52382E-01         5.28020E+01         1.00000E+00         3.25048E-01         5.27989E+01         1.79598E+01         3.48391E+01
+          1.03830E-02         1.37795E-02        -8.96923E-03         6.52321E-01         1.08512E+00         6.52383E-01         5.12350E+01         1.00000E+00         3.22252E-01         5.12320E+01         1.67326E+01         3.44994E+01
+          1.03830E-02         1.39494E-02        -9.11718E-03         6.52320E-01         1.09579E+00         6.52383E-01         4.97097E+01         1.00000E+00         3.19602E-01         4.97068E+01         1.55500E+01         3.41567E+01
+          1.03830E-02         1.41192E-02        -9.26694E-03         6.52318E-01         1.10646E+00         6.52384E-01         4.82234E+01         1.00000E+00         3.17090E-01         4.82205E+01         1.44126E+01         3.38079E+01
+          1.03830E-02         1.42890E-02        -9.41852E-03         6.52316E-01         1.11713E+00         6.52384E-01         4.67737E+01         1.00000E+00         3.14711E-01         4.67709E+01         1.33210E+01         3.34499E+01
+          1.03830E-02         1.44589E-02        -9.57190E-03         6.52315E-01         1.12780E+00         6.52385E-01         4.53586E+01         1.00000E+00         3.12459E-01         4.53559E+01         1.22757E+01         3.30802E+01
+          1.03830E-02         1.46287E-02        -9.72710E-03         6.52313E-01         1.13847E+00         6.52386E-01         4.39761E+01         1.00000E+00         3.10329E-01         4.39736E+01         1.12769E+01         3.26966E+01
+          1.03830E-02         1.47985E-02        -9.88411E-03         6.52312E-01         1.14914E+00         6.52387E-01         4.26246E+01         1.00000E+00         3.08314E-01         4.26222E+01         1.03249E+01         3.22973E+01
+          1.03830E-02         1.49683E-02        -1.00429E-02         6.52310E-01         1.15981E+00         6.52387E-01         4.13027E+01         1.00000E+00         3.06409E-01         4.13004E+01         9.41967E+00         3.18807E+01
+          1.03830E-02         1.51382E-02        -1.02036E-02         6.52308E-01         1.17048E+00         6.52388E-01         4.00090E+01         1.00000E+00         3.04608E-01         4.00068E+01         8.56113E+00         3.14457E+01
+          1.03830E-02         1.53080E-02        -1.03660E-02         6.52307E-01         1.18115E+00         6.52389E-01         3.87425E+01         1.00000E+00         3.02905E-01         3.87404E+01         7.74910E+00         3.09913E+01
+          1.03830E-02         1.54778E-02        -1.05303E-02         6.52305E-01         1.19182E+00         6.52390E-01         3.75023E+01         1.00000E+00         3.01294E-01         3.75004E+01         6.98326E+00         3.05171E+01
+          1.03830E-02         1.56476E-02        -1.06964E-02         6.52303E-01         1.20249E+00         6.52391E-01         3.62877E+01         1.00000E+00         2.99770E-01         3.62859E+01         6.26317E+00         3.00227E+01
+          1.03830E-02         1.58175E-02        -1.08642E-02         6.52301E-01         1.21317E+00         6.52392E-01         3.50981E+01         1.00000E+00         2.98326E-01         3.50965E+01         5.58829E+00         2.95082E+01
+          1.03830E-02         1.59873E-02        -1.10339E-02         6.52300E-01         1.22384E+00         6.52393E-01         3.39333E+01         1.00000E+00         2.96958E-01         3.39318E+01         4.95798E+00         2.89739E+01
+          1.03830E-02         1.61571E-02        -1.12055E-02         6.52298E-01         1.23451E+00         6.52394E-01         3.27929E+01         1.00000E+00         2.95658E-01         3.27916E+01         4.37150E+00         2.84201E+01
+          1.03830E-02         1.63270E-02        -1.13788E-02         6.52296E-01         1.24518E+00         6.52395E-01         3.16769E+01         1.00000E+00         2.94422E-01         3.16757E+01         3.82801E+00         2.78477E+01
+          1.03830E-02         1.64968E-02        -1.15539E-02         6.52294E-01         1.25585E+00         6.52397E-01         3.05852E+01         1.00000E+00         2.93245E-01         3.05842E+01         3.32659E+00         2.72577E+01
+          1.03830E-02         1.66666E-02        -1.17309E-02         6.52292E-01         1.26652E+00         6.52398E-01         2.95181E+01         1.00000E+00         2.92120E-01         2.95173E+01         2.86623E+00         2.66510E+01
+          1.03830E-02         1.68364E-02        -1.19096E-02         6.52291E-01         1.27719E+00         6.52399E-01         2.84757E+01         1.00000E+00         2.91042E-01         2.84750E+01         2.44585E+00         2.60292E+01
+          1.03830E-02         1.70063E-02        -1.20902E-02         6.52289E-01         1.28786E+00         6.52401E-01         2.74584E+01         1.00000E+00         2.90006E-01         2.74578E+01         2.06431E+00         2.53935E+01
+          1.03830E-02         1.71761E-02        -1.22726E-02         6.52287E-01         1.29853E+00         6.52402E-01         2.64665E+01         1.00000E+00         2.89007E-01         2.64661E+01         1.72039E+00         2.47457E+01
+          1.03830E-02         1.73459E-02        -1.24568E-02         6.52285E-01         1.30920E+00         6.52404E-01         2.55005E+01         1.00000E+00         2.88039E-01         2.55003E+01         1.41282E+00         2.40874E+01
+          1.03830E-02         1.75158E-02        -1.26428E-02         6.52283E-01         1.31987E+00         6.52406E-01         2.45609E+01         1.00000E+00         2.87099E-01         2.45608E+01         1.14028E+00         2.34205E+01
+          1.03830E-02         1.76856E-02        -1.28306E-02         6.52281E-01         1.33054E+00         6.52407E-01         2.36482E+01         1.00000E+00         2.86180E-01         2.36484E+01         9.01412E-01         2.27469E+01
+          1.03830E-02         1.78554E-02        -1.30203E-02         6.52279E-01         1.34121E+00         6.52409E-01         2.27631E+01         1.00000E+00         2.85279E-01         2.27634E+01         6.94799E-01         2.20686E+01
+          1.03830E-02         1.80252E-02        -1.32117E-02         6.52277E-01         1.35188E+00         6.52411E-01         2.19062E+01         1.00000E+00         2.84390E-01         2.19066E+01         5.19010E-01         2.13876E+01
+          1.03830E-02         1.81951E-02        -1.34050E-02         6.52275E-01         1.36255E+00         6.52413E-01         2.10779E+01         1.00000E+00         2.83510E-01         2.10784E+01         3.72579E-01         2.07059E+01
+          1.03830E-02         1.83649E-02        -1.36001E-02         6.52273E-01         1.37322E+00         6.52415E-01         2.02789E+01         1.00000E+00         2.82634E-01         2.02796E+01         2.54021E-01         2.00256E+01
+          1.03830E-02         1.85347E-02        -1.37970E-02         6.52271E-01         1.38389E+00         6.52417E-01         1.95098E+01         1.00000E+00         2.81759E-01         1.95107E+01         1.61837E-01         1.93488E+01
+          1.03830E-02         1.87045E-02        -1.39957E-02         6.52269E-01         1.39457E+00         6.52419E-01         1.87711E+01         1.00000E+00         2.80880E-01         1.87721E+01         9.45157E-02         1.86776E+01
+          1.03830E-02         1.88744E-02        -1.41962E-02         6.52267E-01         1.40524E+00         6.52421E-01         1.80634E+01         1.00000E+00         2.79994E-01         1.80646E+01         5.05439E-02         1.80140E+01
+          1.03830E-02         1.90442E-02        -1.43985E-02         6.52265E-01         1.41591E+00         6.52424E-01         1.73871E+01         1.00000E+00         2.79097E-01         1.73884E+01         2.84084E-02         1.73600E+01
+          1.03830E-02         1.92140E-02        -1.46027E-02         6.52263E-01         1.42658E+00         6.52426E-01         1.67427E+01         1.00000E+00         2.78186E-01         1.67441E+01         2.66027E-02         1.67175E+01
+          1.03830E-02         1.93839E-02        -1.48086E-02         6.52261E-01         1.43725E+00         6.52429E-01         1.61306E+01         1.00000E+00         2.77257E-01         1.61321E+01         4.36312E-02         1.60884E+01
+          1.03830E-02         1.95537E-02        -1.50164E-02         6.52258E-01         1.44792E+00         6.52431E-01         1.55510E+01         1.00000E+00         2.76309E-01         1.55526E+01         7.80140E-02         1.54746E+01
+          1.03830E-02         1.97235E-02        -1.52260E-02         6.52256E-01         1.45859E+00         6.52434E-01         1.50042E+01         1.00000E+00         2.75337E-01         1.50059E+01         1.28292E-01         1.48776E+01
+          1.03830E-02         1.98933E-02        -1.54374E-02         6.52254E-01         1.46926E+00         6.52437E-01         1.44904E+01         1.00000E+00         2.74340E-01         1.44922E+01         1.93028E-01         1.42992E+01
+          1.03830E-02         2.00632E-02        -1.56506E-02         6.52252E-01         1.47993E+00         6.52440E-01         1.40097E+01         1.00000E+00         2.73315E-01         1.40116E+01         2.70818E-01         1.37408E+01
+          1.03830E-02         2.02330E-02        -1.58656E-02         6.52250E-01         1.49060E+00         6.52442E-01         1.35621E+01         1.00000E+00         2.72260E-01         1.35641E+01         3.60284E-01         1.32038E+01
+          1.03830E-02         2.04028E-02        -1.60825E-02         6.52247E-01         1.50127E+00         6.52446E-01         1.31476E+01         1.00000E+00         2.71172E-01         1.31497E+01         4.60088E-01         1.26896E+01
+          1.03830E-02         2.05726E-02        -1.63011E-02         6.52245E-01         1.51194E+00         6.52449E-01         1.27661E+01         1.00000E+00         2.70049E-01         1.27682E+01         5.68928E-01         1.21993E+01
+          1.03830E-02         2.07425E-02        -1.65216E-02         6.52243E-01         1.52261E+00         6.52452E-01         1.24172E+01         1.00000E+00         2.68891E-01         1.24194E+01         6.85544E-01         1.17339E+01
+          1.03830E-02         2.09123E-02        -1.67439E-02         6.52240E-01         1.53328E+00         6.52455E-01         1.21007E+01         1.00000E+00         2.67695E-01         1.21030E+01         8.08720E-01         1.12943E+01
+          1.03830E-02         2.10821E-02        -1.69679E-02         6.52238E-01         1.54395E+00         6.52459E-01         1.18163E+01         1.00000E+00         2.66460E-01         1.18186E+01         9.37287E-01         1.08813E+01
+          1.03830E-02         2.12520E-02        -1.71938E-02         6.52236E-01         1.55462E+00         6.52462E-01         1.15633E+01         1.00000E+00         2.65184E-01         1.15657E+01         1.07012E+00         1.04956E+01
+          1.03830E-02         2.14218E-02        -1.74216E-02         6.52233E-01         1.56529E+00         6.52466E-01         1.13413E+01         1.00000E+00         2.63867E-01         1.13437E+01         1.20616E+00         1.01376E+01
+          1.03830E-02         2.15916E-02        -1.76511E-02         6.52231E-01         1.57596E+00         6.52470E-01         1.11496E+01         1.00000E+00         2.62507E-01         1.11521E+01         1.34437E+00         9.80769E+00
+          1.03830E-02         2.17614E-02        -1.78824E-02         6.52229E-01         1.58664E+00         6.52474E-01         1.09875E+01         1.00000E+00         2.61104E-01         1.09899E+01         1.48379E+00         9.50614E+00
+          1.03830E-02         2.19313E-02        -1.81156E-02         6.52226E-01         1.59731E+00         6.52478E-01         1.08541E+01         1.00000E+00         2.59657E-01         1.08565E+01         1.62351E+00         9.23303E+00
+          1.03830E-02         2.21011E-02        -1.83506E-02         6.52224E-01         1.60798E+00         6.52482E-01         1.07486E+01         1.00000E+00         2.58165E-01         1.07510E+01         1.76267E+00         8.98834E+00
+          1.03830E-02         2.22709E-02        -1.85873E-02         6.52221E-01         1.61865E+00         6.52486E-01         1.06699E+01         1.00000E+00         2.56628E-01         1.06724E+01         1.90047E+00         8.77191E+00
+          1.03830E-02         2.24407E-02        -1.88259E-02         6.52219E-01         1.62932E+00         6.52490E-01         1.06172E+01         1.00000E+00         2.55047E-01         1.06196E+01         2.03615E+00         8.58346E+00
+          1.03830E-02         2.26106E-02        -1.90663E-02         6.52216E-01         1.63999E+00         6.52495E-01         1.05892E+01         1.00000E+00         2.53419E-01         1.05916E+01         2.16903E+00         8.42258E+00
+          1.03830E-02         2.27804E-02        -1.93086E-02         6.52214E-01         1.65066E+00         6.52500E-01         1.05848E+01         1.00000E+00         2.51747E-01         1.05873E+01         2.29847E+00         8.28878E+00
+          1.03830E-02         2.29502E-02        -1.95526E-02         6.52211E-01         1.66133E+00         6.52504E-01         1.06029E+01         1.00000E+00         2.50029E-01         1.06053E+01         2.42389E+00         8.18142E+00
+          1.03830E-02         2.31201E-02        -1.97985E-02         6.52209E-01         1.67200E+00         6.52509E-01         1.06422E+01         1.00000E+00         2.48265E-01         1.06445E+01         2.54475E+00         8.09979E+00
+          1.03830E-02         2.32899E-02        -2.00461E-02         6.52206E-01         1.68267E+00         6.52514E-01         1.07013E+01         1.00000E+00         2.46457E-01         1.07036E+01         2.66059E+00         8.04306E+00
+          1.03830E-02         2.34597E-02        -2.02956E-02         6.52204E-01         1.69334E+00         6.52519E-01         1.07790E+01         1.00000E+00         2.44605E-01         1.07813E+01         2.77097E+00         8.01032E+00
+          1.03830E-02         2.36295E-02        -2.05469E-02         6.52201E-01         1.70401E+00         6.52525E-01         1.08739E+01         1.00000E+00         2.42709E-01         1.08761E+01         2.87554E+00         8.00059E+00
+          1.03830E-02         2.37994E-02        -2.08000E-02         6.52198E-01         1.71468E+00         6.52530E-01         1.09846E+01         1.00000E+00         2.40769E-01         1.09867E+01         2.97396E+00         8.01278E+00
+          1.03830E-02         2.39692E-02        -2.10549E-02         6.52196E-01         1.72535E+00         6.52535E-01         1.11096E+01         1.00000E+00         2.38787E-01         1.11117E+01         3.06596E+00         8.04577E+00
+          1.03830E-02         2.41390E-02        -2.13116E-02         6.52193E-01         1.73602E+00         6.52541E-01         1.12476E+01         1.00000E+00         2.36763E-01         1.12497E+01         3.15132E+00         8.09835E+00
+          1.03830E-02         2.43088E-02        -2.15702E-02         6.52190E-01         1.74669E+00         6.52547E-01         1.13972E+01         1.00000E+00         2.34698E-01         1.13991E+01         3.22987E+00         8.16928E+00
+          1.03830E-02         2.44787E-02        -2.18305E-02         6.52188E-01         1.75736E+00         6.52553E-01         1.15568E+01         1.00000E+00         2.32594E-01         1.15587E+01         3.30145E+00         8.25725E+00
+          1.03830E-02         2.46485E-02        -2.20927E-02         6.52185E-01         1.76804E+00         6.52559E-01         1.17251E+01         1.00000E+00         2.30450E-01         1.17269E+01         3.36598E+00         8.36092E+00
+          1.03830E-02         2.48183E-02        -2.23567E-02         6.52182E-01         1.77871E+00         6.52565E-01         1.19006E+01         1.00000E+00         2.28269E-01         1.19023E+01         3.42340E+00         8.47894E+00
+          1.03830E-02         2.49882E-02        -2.26225E-02         6.52179E-01         1.78938E+00         6.52572E-01         1.20820E+01         1.00000E+00         2.26051E-01         1.20836E+01         3.47369E+00         8.60992E+00
+          1.03830E-02         2.51580E-02        -2.28901E-02         6.52177E-01         1.80005E+00         6.52578E-01         1.22677E+01         1.00000E+00         2.23798E-01         1.22693E+01         3.51687E+00         8.75244E+00
+          1.03830E-02         2.53278E-02        -2.31595E-02         6.52174E-01         1.81072E+00         6.52585E-01         1.24566E+01         1.00000E+00         2.21511E-01         1.24581E+01         3.55300E+00         8.90510E+00
+          1.03830E-02         2.54976E-02        -2.34308E-02         6.52171E-01         1.82139E+00         6.52592E-01         1.26472E+01         1.00000E+00         2.19191E-01         1.26486E+01         3.58215E+00         9.06649E+00
+          1.03830E-02         2.56675E-02        -2.37038E-02         6.52168E-01         1.83206E+00         6.52599E-01         1.28383E+01         1.00000E+00         2.16840E-01         1.28396E+01         3.60443E+00         9.23520E+00
+          1.03830E-02         2.58373E-02        -2.39787E-02         6.52165E-01         1.84273E+00         6.52606E-01         1.30286E+01         1.00000E+00         2.14459E-01         1.30298E+01         3.62000E+00         9.40983E+00
+          1.03830E-02         2.60071E-02        -2.42554E-02         6.52162E-01         1.85340E+00         6.52613E-01         1.32169E+01         1.00000E+00         2.12050E-01         1.32180E+01         3.62900E+00         9.58902E+00
+          1.03830E-02         2.61769E-02        -2.45339E-02         6.52160E-01         1.86407E+00         6.52621E-01         1.34020E+01         1.00000E+00         2.09615E-01         1.34030E+01         3.63164E+00         9.77141E+00
+          1.05528E-02         8.72665E-04        -3.13977E-03         6.63053E-01         2.74155E-01         6.63061E-01         5.03447E+02         1.00000E+00         9.19334E-01         5.03454E+02         5.66136E+01         4.46841E+02
+          1.05528E-02         1.04249E-03        -3.14999E-03         6.63053E-01         2.84826E-01         6.63061E-01         4.94233E+02         1.00000E+00         9.08032E-01         4.94240E+02         5.74759E+01         4.36764E+02
+          1.05528E-02         1.21232E-03        -3.16202E-03         6.63053E-01         2.95496E-01         6.63061E-01         4.84855E+02         1.00000E+00         8.96491E-01         4.84862E+02         5.83319E+01         4.26530E+02
+          1.05528E-02         1.38215E-03        -3.17586E-03         6.63053E-01         3.06167E-01         6.63061E-01         4.75329E+02         1.00000E+00         8.84730E-01         4.75336E+02         5.91778E+01         4.16158E+02
+          1.05528E-02         1.55197E-03        -3.19151E-03         6.63053E-01         3.16838E-01         6.63061E-01         4.65674E+02         1.00000E+00         8.72767E-01         4.65681E+02         6.00104E+01         4.05671E+02
+          1.05528E-02         1.72180E-03        -3.20898E-03         6.63053E-01         3.27508E-01         6.63060E-01         4.55907E+02         1.00000E+00         8.60622E-01         4.55914E+02         6.08262E+01         3.95088E+02
+          1.05528E-02         1.89163E-03        -3.22826E-03         6.63052E-01         3.38179E-01         6.63060E-01         4.46045E+02         1.00000E+00         8.48312E-01         4.46051E+02         6.16217E+01         3.84430E+02
+          1.05528E-02         2.06146E-03        -3.24935E-03         6.63052E-01         3.48849E-01         6.63060E-01         4.36104E+02         1.00000E+00         8.35858E-01         4.36111E+02         6.23938E+01         3.73717E+02
+          1.05528E-02         2.23128E-03        -3.27225E-03         6.63052E-01         3.59520E-01         6.63060E-01         4.26103E+02         1.00000E+00         8.23276E-01         4.26110E+02         6.31392E+01         3.62971E+02
+          1.05528E-02         2.40111E-03        -3.29696E-03         6.63052E-01         3.70190E-01         6.63060E-01         4.16058E+02         1.00000E+00         8.10587E-01         4.16064E+02         6.38547E+01         3.52210E+02
+          1.05528E-02         2.57094E-03        -3.32349E-03         6.63051E-01         3.80861E-01         6.63060E-01         4.05985E+02         1.00000E+00         7.97809E-01         4.05992E+02         6.45372E+01         3.41454E+02
+          1.05528E-02         2.74077E-03        -3.35183E-03         6.63051E-01         3.91532E-01         6.63060E-01         3.95901E+02         1.00000E+00         7.84959E-01         3.95907E+02         6.51840E+01         3.30723E+02
+          1.05528E-02         2.91059E-03        -3.38198E-03         6.63051E-01         4.02202E-01         6.63059E-01         3.85821E+02         1.00000E+00         7.72056E-01         3.85827E+02         6.57921E+01         3.20035E+02
+          1.05528E-02         3.08042E-03        -3.41394E-03         6.63051E-01         4.12873E-01         6.63059E-01         3.75762E+02         1.00000E+00         7.59117E-01         3.75767E+02         6.63589E+01         3.09408E+02
+          1.05528E-02         3.25025E-03        -3.44771E-03         6.63050E-01         4.23543E-01         6.63059E-01         3.65737E+02         1.00000E+00         7.46161E-01         3.65742E+02         6.68818E+01         2.98860E+02
+          1.05528E-02         3.42008E-03        -3.48330E-03         6.63050E-01         4.34214E-01         6.63059E-01         3.55761E+02         1.00000E+00         7.33205E-01         3.55766E+02         6.73583E+01         2.88408E+02
+          1.05528E-02         3.58990E-03        -3.52070E-03         6.63049E-01         4.44884E-01         6.63059E-01         3.45849E+02         1.00000E+00         7.20264E-01         3.45854E+02         6.77864E+01         2.78068E+02
+          1.05528E-02         3.75973E-03        -3.55991E-03         6.63049E-01         4.55555E-01         6.63059E-01         3.36014E+02         1.00000E+00         7.07355E-01         3.36019E+02         6.81638E+01         2.67856E+02
+          1.05528E-02         3.92956E-03        -3.60093E-03         6.63049E-01         4.66225E-01         6.63058E-01         3.26270E+02         1.00000E+00         6.94495E-01         3.26275E+02         6.84886E+01         2.57786E+02
+          1.05528E-02         4.09939E-03        -3.64377E-03         6.63048E-01         4.76896E-01         6.63058E-01         3.16628E+02         1.00000E+00         6.81699E-01         3.16633E+02         6.87590E+01         2.47873E+02
+          1.05528E-02         4.26921E-03        -3.68841E-03         6.63048E-01         4.87567E-01         6.63058E-01         3.07100E+02         1.00000E+00         6.68981E-01         3.07105E+02         6.89736E+01         2.38131E+02
+          1.05528E-02         4.43904E-03        -3.73487E-03         6.63047E-01         4.98237E-01         6.63058E-01         2.97698E+02         1.00000E+00         6.56356E-01         2.97703E+02         6.91309E+01         2.28572E+02
+          1.05528E-02         4.60887E-03        -3.78314E-03         6.63047E-01         5.08908E-01         6.63057E-01         2.88432E+02         1.00000E+00         6.43838E-01         2.88436E+02         6.92297E+01         2.19207E+02
+          1.05528E-02         4.77869E-03        -3.83323E-03         6.63046E-01         5.19578E-01         6.63057E-01         2.79313E+02         1.00000E+00         6.31439E-01         2.79316E+02         6.92689E+01         2.10048E+02
+          1.05528E-02         4.94852E-03        -3.88512E-03         6.63046E-01         5.30249E-01         6.63057E-01         2.70348E+02         1.00000E+00         6.19173E-01         2.70352E+02         6.92477E+01         2.01104E+02
+          1.05528E-02         5.11835E-03        -3.93883E-03         6.63045E-01         5.40919E-01         6.63057E-01         2.61547E+02         1.00000E+00         6.07051E-01         2.61551E+02         6.91655E+01         1.92385E+02
+          1.05528E-02         5.28818E-03        -3.99435E-03         6.63044E-01         5.51590E-01         6.63056E-01         2.52918E+02         1.00000E+00         5.95084E-01         2.52922E+02         6.90219E+01         1.83900E+02
+          1.05528E-02         5.45800E-03        -4.05168E-03         6.63044E-01         5.62261E-01         6.63056E-01         2.44468E+02         1.00000E+00         5.83283E-01         2.44471E+02         6.88165E+01         1.75655E+02
+          1.05528E-02         5.62783E-03        -4.11082E-03         6.63043E-01         5.72931E-01         6.63056E-01         2.36203E+02         1.00000E+00         5.71658E-01         2.36206E+02         6.85493E+01         1.67657E+02
+          1.05528E-02         5.79766E-03        -4.17178E-03         6.63043E-01         5.83602E-01         6.63056E-01         2.28129E+02         1.00000E+00         5.60218E-01         2.28132E+02         6.82205E+01         1.59912E+02
+          1.05528E-02         5.96749E-03        -4.23455E-03         6.63042E-01         5.94272E-01         6.63055E-01         2.20252E+02         1.00000E+00         5.48971E-01         2.20255E+02         6.78303E+01         1.52424E+02
+          1.05528E-02         6.13731E-03        -4.29913E-03         6.63041E-01         6.04943E-01         6.63055E-01         2.12575E+02         1.00000E+00         5.37925E-01         2.12577E+02         6.73792E+01         1.45198E+02
+          1.05528E-02         6.30714E-03        -4.36552E-03         6.63040E-01         6.15613E-01         6.63055E-01         2.05102E+02         1.00000E+00         5.27088E-01         2.05104E+02         6.68679E+01         1.38236E+02
+          1.05528E-02         6.47697E-03        -4.43372E-03         6.63040E-01         6.26284E-01         6.63055E-01         1.97836E+02         1.00000E+00         5.16465E-01         1.97839E+02         6.62972E+01         1.31541E+02
+          1.05528E-02         6.64680E-03        -4.50374E-03         6.63039E-01         6.36955E-01         6.63054E-01         1.90781E+02         1.00000E+00         5.06062E-01         1.90782E+02         6.56683E+01         1.25114E+02
+          1.05528E-02         6.81662E-03        -4.57557E-03         6.63038E-01         6.47625E-01         6.63054E-01         1.83936E+02         1.00000E+00         4.95884E-01         1.83938E+02         6.49821E+01         1.18956E+02
+          1.05528E-02         6.98645E-03        -4.64921E-03         6.63037E-01         6.58296E-01         6.63054E-01         1.77304E+02         1.00000E+00         4.85935E-01         1.77306E+02         6.42402E+01         1.13065E+02
+          1.05528E-02         7.15628E-03        -4.72466E-03         6.63037E-01         6.68966E-01         6.63054E-01         1.70885E+02         1.00000E+00         4.76219E-01         1.70886E+02         6.34440E+01         1.07442E+02
+          1.05528E-02         7.32611E-03        -4.80193E-03         6.63036E-01         6.79637E-01         6.63053E-01         1.64679E+02         1.00000E+00         4.66740E-01         1.64680E+02         6.25952E+01         1.02085E+02
+          1.05528E-02         7.49593E-03        -4.88101E-03         6.63035E-01         6.90307E-01         6.63053E-01         1.58685E+02         1.00000E+00         4.57498E-01         1.58686E+02         6.16955E+01         9.69901E+01
+          1.05528E-02         7.66576E-03        -4.96190E-03         6.63034E-01         7.00978E-01         6.63053E-01         1.52902E+02         1.00000E+00         4.48496E-01         1.52902E+02         6.07470E+01         9.21554E+01
+          1.05528E-02         7.83559E-03        -5.04460E-03         6.63033E-01         7.11649E-01         6.63052E-01         1.47328E+02         1.00000E+00         4.39736E-01         1.47328E+02         5.97515E+01         8.75768E+01
+          1.05528E-02         8.00542E-03        -5.12911E-03         6.63032E-01         7.22319E-01         6.63052E-01         1.41961E+02         1.00000E+00         4.31217E-01         1.41961E+02         5.87113E+01         8.32499E+01
+          1.05528E-02         8.17524E-03        -5.21544E-03         6.63032E-01         7.32990E-01         6.63052E-01         1.36798E+02         1.00000E+00         4.22939E-01         1.36798E+02         5.76288E+01         7.91696E+01
+          1.05528E-02         8.34507E-03        -5.30358E-03         6.63031E-01         7.43660E-01         6.63052E-01         1.31837E+02         1.00000E+00         4.14903E-01         1.31837E+02         5.65061E+01         7.53306E+01
+          1.05528E-02         8.51490E-03        -5.39353E-03         6.63030E-01         7.54331E-01         6.63052E-01         1.27073E+02         1.00000E+00         4.07107E-01         1.27072E+02         5.53458E+01         7.17267E+01
+          1.05528E-02         8.68473E-03        -5.48529E-03         6.63029E-01         7.65001E-01         6.63051E-01         1.22502E+02         1.00000E+00         3.99549E-01         1.22502E+02         5.41505E+01         6.83514E+01
+          1.05528E-02         8.85455E-03        -5.57887E-03         6.63028E-01         7.75672E-01         6.63051E-01         1.18121E+02         1.00000E+00         3.92228E-01         1.18121E+02         5.29227E+01         6.51979E+01
+          1.05528E-02         9.02438E-03        -5.67425E-03         6.63027E-01         7.86343E-01         6.63051E-01         1.13925E+02         1.00000E+00         3.85143E-01         1.13924E+02         5.16651E+01         6.22589E+01
+          1.05528E-02         9.19421E-03        -5.77145E-03         6.63026E-01         7.97013E-01         6.63051E-01         1.09908E+02         1.00000E+00         3.78289E-01         1.09907E+02         5.03804E+01         5.95267E+01
+          1.05528E-02         9.36403E-03        -5.87047E-03         6.63025E-01         8.07684E-01         6.63051E-01         1.06066E+02         1.00000E+00         3.71665E-01         1.06065E+02         4.90713E+01         5.69934E+01
+          1.05528E-02         9.53386E-03        -5.97129E-03         6.63024E-01         8.18354E-01         6.63050E-01         1.02393E+02         1.00000E+00         3.65266E-01         1.02392E+02         4.77408E+01         5.46508E+01
+          1.05528E-02         9.70369E-03        -6.07393E-03         6.63022E-01         8.29025E-01         6.63050E-01         9.88831E+01         1.00000E+00         3.59091E-01         9.88820E+01         4.63914E+01         5.24905E+01
+          1.05528E-02         9.87352E-03        -6.17838E-03         6.63021E-01         8.39695E-01         6.63050E-01         9.55314E+01         1.00000E+00         3.53135E-01         9.55301E+01         4.50262E+01         5.05039E+01
+          1.05528E-02         1.00433E-02        -6.28464E-03         6.63020E-01         8.50366E-01         6.63050E-01         9.23315E+01         1.00000E+00         3.47394E-01         9.23302E+01         4.36479E+01         4.86823E+01
+          1.05528E-02         1.02132E-02        -6.39271E-03         6.63019E-01         8.61037E-01         6.63050E-01         8.92775E+01         1.00000E+00         3.41865E-01         8.92760E+01         4.22592E+01         4.70168E+01
+          1.05528E-02         1.03830E-02        -6.50260E-03         6.63018E-01         8.71707E-01         6.63050E-01         8.63631E+01         1.00000E+00         3.36543E-01         8.63616E+01         4.08631E+01         4.54985E+01
+          1.05528E-02         1.05528E-02        -6.61430E-03         6.63017E-01         8.82378E-01         6.63050E-01         8.35824E+01         1.00000E+00         3.31424E-01         8.35807E+01         3.94622E+01         4.41185E+01
+          1.05528E-02         1.07227E-02        -6.72781E-03         6.63016E-01         8.93048E-01         6.63050E-01         8.09290E+01         1.00000E+00         3.26504E-01         8.09272E+01         3.80593E+01         4.28679E+01
+          1.05528E-02         1.08925E-02        -6.84313E-03         6.63014E-01         9.03719E-01         6.63050E-01         7.83968E+01         1.00000E+00         3.21778E-01         7.83950E+01         3.66571E+01         4.17379E+01
+          1.05528E-02         1.10623E-02        -6.96027E-03         6.63013E-01         9.14389E-01         6.63050E-01         7.59796E+01         1.00000E+00         3.17242E-01         7.59777E+01         3.52582E+01         4.07195E+01
+          1.05528E-02         1.12321E-02        -7.07921E-03         6.63012E-01         9.25060E-01         6.63050E-01         7.36714E+01         1.00000E+00         3.12892E-01         7.36694E+01         3.38653E+01         3.98041E+01
+          1.05528E-02         1.14020E-02        -7.19998E-03         6.63011E-01         9.35731E-01         6.63050E-01         7.14661E+01         1.00000E+00         3.08722E-01         7.14640E+01         3.24807E+01         3.89833E+01
+          1.05528E-02         1.15718E-02        -7.32255E-03         6.63009E-01         9.46401E-01         6.63050E-01         6.93577E+01         1.00000E+00         3.04729E-01         6.93557E+01         3.11071E+01         3.82486E+01
+          1.05528E-02         1.17416E-02        -7.44693E-03         6.63008E-01         9.57072E-01         6.63050E-01         6.73406E+01         1.00000E+00         3.00908E-01         6.73384E+01         2.97466E+01         3.75918E+01
+          1.05528E-02         1.19114E-02        -7.57313E-03         6.63007E-01         9.67742E-01         6.63050E-01         6.54089E+01         1.00000E+00         2.97254E-01         6.54067E+01         2.84017E+01         3.70050E+01
+          1.05528E-02         1.20813E-02        -7.70114E-03         6.63005E-01         9.78413E-01         6.63050E-01         6.35571E+01         1.00000E+00         2.93763E-01         6.35549E+01         2.70745E+01         3.64804E+01
+          1.05528E-02         1.22511E-02        -7.83096E-03         6.63004E-01         9.89083E-01         6.63050E-01         6.17800E+01         1.00000E+00         2.90430E-01         6.17778E+01         2.57671E+01         3.60107E+01
+          1.05528E-02         1.24209E-02        -7.96260E-03         6.63003E-01         9.99754E-01         6.63050E-01         6.00723E+01         1.00000E+00         2.87250E-01         6.00701E+01         2.44814E+01         3.55887E+01
+          1.05528E-02         1.25908E-02        -8.09605E-03         6.63001E-01         1.01042E+00         6.63051E-01         5.84291E+01         1.00000E+00         2.84219E-01         5.84269E+01         2.32195E+01         3.52074E+01
+          1.05528E-02         1.27606E-02        -8.23131E-03         6.63000E-01         1.02110E+00         6.63051E-01         5.68457E+01         1.00000E+00         2.81333E-01         5.68434E+01         2.19829E+01         3.48605E+01
+          1.05528E-02         1.29304E-02        -8.36838E-03         6.62998E-01         1.03177E+00         6.63051E-01         5.53174E+01         1.00000E+00         2.78587E-01         5.53151E+01         2.07735E+01         3.45416E+01
+          1.05528E-02         1.31002E-02        -8.50726E-03         6.62997E-01         1.04244E+00         6.63051E-01         5.38400E+01         1.00000E+00         2.75975E-01         5.38377E+01         1.95928E+01         3.42449E+01
+          1.05528E-02         1.32701E-02        -8.64796E-03         6.62995E-01         1.05311E+00         6.63052E-01         5.24093E+01         1.00000E+00         2.73495E-01         5.24071E+01         1.84421E+01         3.39650E+01
+          1.05528E-02         1.34399E-02        -8.79047E-03         6.62994E-01         1.06378E+00         6.63052E-01         5.10217E+01         1.00000E+00         2.71140E-01         5.10195E+01         1.73229E+01         3.36966E+01
+          1.05528E-02         1.36097E-02        -8.93479E-03         6.62992E-01         1.07445E+00         6.63052E-01         4.96735E+01         1.00000E+00         2.68908E-01         4.96713E+01         1.62363E+01         3.34350E+01
+          1.05528E-02         1.37795E-02        -9.08093E-03         6.62991E-01         1.08512E+00         6.63053E-01         4.83613E+01         1.00000E+00         2.66792E-01         4.83592E+01         1.51834E+01         3.31758E+01
+          1.05528E-02         1.39494E-02        -9.22888E-03         6.62989E-01         1.09579E+00         6.63053E-01         4.70822E+01         1.00000E+00         2.64788E-01         4.70801E+01         1.41651E+01         3.29150E+01
+          1.05528E-02         1.41192E-02        -9.37864E-03         6.62988E-01         1.10646E+00         6.63054E-01         4.58333E+01         1.00000E+00         2.62892E-01         4.58312E+01         1.31824E+01         3.26489E+01
+          1.05528E-02         1.42890E-02        -9.53021E-03         6.62986E-01         1.11713E+00         6.63054E-01         4.46119E+01         1.00000E+00         2.61099E-01         4.46100E+01         1.22358E+01         3.23742E+01
+          1.05528E-02         1.44589E-02        -9.68360E-03         6.62984E-01         1.12780E+00         6.63055E-01         4.34159E+01         1.00000E+00         2.59405E-01         4.34140E+01         1.13260E+01         3.20880E+01
+          1.05528E-02         1.46287E-02        -9.83879E-03         6.62983E-01         1.13847E+00         6.63056E-01         4.22430E+01         1.00000E+00         2.57804E-01         4.22412E+01         1.04535E+01         3.17877E+01
+          1.05528E-02         1.47985E-02        -9.99580E-03         6.62981E-01         1.14914E+00         6.63056E-01         4.10916E+01         1.00000E+00         2.56293E-01         4.10898E+01         9.61861E+00         3.14712E+01
+          1.05528E-02         1.49683E-02        -1.01546E-02         6.62979E-01         1.15981E+00         6.63057E-01         3.99599E+01         1.00000E+00         2.54865E-01         3.99582E+01         8.82159E+00         3.11366E+01
+          1.05528E-02         1.51382E-02        -1.03153E-02         6.62978E-01         1.17048E+00         6.63058E-01         3.88466E+01         1.00000E+00         2.53518E-01         3.88450E+01         8.06259E+00         3.07824E+01
+          1.05528E-02         1.53080E-02        -1.04777E-02         6.62976E-01         1.18115E+00         6.63059E-01         3.77505E+01         1.00000E+00         2.52246E-01         3.77490E+01         7.34163E+00         3.04074E+01
+          1.05528E-02         1.54778E-02        -1.06420E-02         6.62974E-01         1.19182E+00         6.63060E-01         3.66708E+01         1.00000E+00         2.51044E-01         3.66694E+01         6.65862E+00         3.00108E+01
+          1.05528E-02         1.56476E-02        -1.08080E-02         6.62972E-01         1.20249E+00         6.63061E-01         3.56066E+01         1.00000E+00         2.49908E-01         3.56053E+01         6.01338E+00         2.95919E+01
+          1.05528E-02         1.58175E-02        -1.09759E-02         6.62971E-01         1.21317E+00         6.63062E-01         3.45575E+01         1.00000E+00         2.48833E-01         3.45563E+01         5.40564E+00         2.91506E+01
+          1.05528E-02         1.59873E-02        -1.11456E-02         6.62969E-01         1.22384E+00         6.63063E-01         3.35230E+01         1.00000E+00         2.47815E-01         3.35219E+01         4.83501E+00         2.86869E+01
+          1.05528E-02         1.61571E-02        -1.13171E-02         6.62967E-01         1.23451E+00         6.63064E-01         3.25030E+01         1.00000E+00         2.46849E-01         3.25020E+01         4.30104E+00         2.82009E+01
+          1.05528E-02         1.63270E-02        -1.14905E-02         6.62965E-01         1.24518E+00         6.63065E-01         3.14974E+01         1.00000E+00         2.45931E-01         3.14965E+01         3.80317E+00         2.76933E+01
+          1.05528E-02         1.64968E-02        -1.16656E-02         6.62963E-01         1.25585E+00         6.63066E-01         3.05063E+01         1.00000E+00         2.45056E-01         3.05055E+01         3.34076E+00         2.71648E+01
+          1.05528E-02         1.66666E-02        -1.18426E-02         6.62962E-01         1.26652E+00         6.63067E-01         2.95301E+01         1.00000E+00         2.44221E-01         2.95294E+01         2.91312E+00         2.66163E+01
+          1.05528E-02         1.68364E-02        -1.20213E-02         6.62960E-01         1.27719E+00         6.63069E-01         2.85690E+01         1.00000E+00         2.43420E-01         2.85684E+01         2.51946E+00         2.60489E+01
+          1.05528E-02         1.70063E-02        -1.22019E-02         6.62958E-01         1.28786E+00         6.63070E-01         2.76235E+01         1.00000E+00         2.42649E-01         2.76230E+01         2.15893E+00         2.54641E+01
+          1.05528E-02         1.71761E-02        -1.23843E-02         6.62956E-01         1.29853E+00         6.63072E-01         2.66942E+01         1.00000E+00         2.41905E-01         2.66939E+01         1.83063E+00         2.48632E+01
+          1.05528E-02         1.73459E-02        -1.25685E-02         6.62954E-01         1.30920E+00         6.63073E-01         2.57818E+01         1.00000E+00         2.41183E-01         2.57816E+01         1.53359E+00         2.42480E+01
+          1.05528E-02         1.75158E-02        -1.27545E-02         6.62952E-01         1.31987E+00         6.63075E-01         2.48870E+01         1.00000E+00         2.40479E-01         2.48869E+01         1.26680E+00         2.36201E+01
+          1.05528E-02         1.76856E-02        -1.29423E-02         6.62950E-01         1.33054E+00         6.63076E-01         2.40106E+01         1.00000E+00         2.39791E-01         2.40105E+01         1.02919E+00         2.29814E+01
+          1.05528E-02         1.78554E-02        -1.31320E-02         6.62948E-01         1.34121E+00         6.63078E-01         2.31533E+01         1.00000E+00         2.39113E-01         2.31534E+01         8.19670E-01         2.23337E+01
+          1.05528E-02         1.80252E-02        -1.33234E-02         6.62946E-01         1.35188E+00         6.63080E-01         2.23162E+01         1.00000E+00         2.38442E-01         2.23164E+01         6.37098E-01         2.16793E+01
+          1.05528E-02         1.81951E-02        -1.35167E-02         6.62944E-01         1.36255E+00         6.63082E-01         2.15000E+01         1.00000E+00         2.37776E-01         2.15003E+01         4.80309E-01         2.10200E+01
+          1.05528E-02         1.83649E-02        -1.37118E-02         6.62942E-01         1.37322E+00         6.63084E-01         2.07056E+01         1.00000E+00         2.37110E-01         2.07060E+01         3.48110E-01         2.03579E+01
+          1.05528E-02         1.85347E-02        -1.39087E-02         6.62940E-01         1.38389E+00         6.63086E-01         1.99340E+01         1.00000E+00         2.36442E-01         1.99345E+01         2.39289E-01         1.96952E+01
+          1.05528E-02         1.87045E-02        -1.41074E-02         6.62938E-01         1.39457E+00         6.63088E-01         1.91861E+01         1.00000E+00         2.35768E-01         1.91867E+01         1.52620E-01         1.90341E+01
+          1.05528E-02         1.88744E-02        -1.43079E-02         6.62936E-01         1.40524E+00         6.63090E-01         1.84626E+01         1.00000E+00         2.35085E-01         1.84633E+01         8.68648E-02         1.83765E+01
+          1.05528E-02         1.90442E-02        -1.45102E-02         6.62933E-01         1.41591E+00         6.63092E-01         1.77645E+01         1.00000E+00         2.34391E-01         1.77653E+01         4.07805E-02         1.77245E+01
+          1.05528E-02         1.92140E-02        -1.47144E-02         6.62931E-01         1.42658E+00         6.63095E-01         1.70925E+01         1.00000E+00         2.33683E-01         1.70934E+01         1.31227E-02         1.70803E+01
+          1.05528E-02         1.93839E-02        -1.49203E-02         6.62929E-01         1.43725E+00         6.63097E-01         1.64474E+01         1.00000E+00         2.32959E-01         1.64484E+01         2.65019E-03         1.64457E+01
+          1.05528E-02         1.95537E-02        -1.51281E-02         6.62927E-01         1.44792E+00         6.63099E-01         1.58299E+01         1.00000E+00         2.32216E-01         1.58309E+01         8.12891E-03         1.58228E+01
+          1.05528E-02         1.97235E-02        -1.53377E-02         6.62925E-01         1.45859E+00         6.63102E-01         1.52406E+01         1.00000E+00         2.31451E-01         1.52417E+01         2.83361E-02         1.52134E+01
+          1.05528E-02         1.98933E-02        -1.55491E-02         6.62922E-01         1.46926E+00         6.63105E-01         1.46800E+01         1.00000E+00         2.30663E-01         1.46812E+01         6.20643E-02         1.46191E+01
+          1.05528E-02         2.00632E-02        -1.57623E-02         6.62920E-01         1.47993E+00         6.63108E-01         1.41487E+01         1.00000E+00         2.29850E-01         1.41499E+01         1.08124E-01         1.40418E+01
+          1.05528E-02         2.02330E-02        -1.59773E-02         6.62918E-01         1.49060E+00         6.63110E-01         1.36470E+01         1.00000E+00         2.29011E-01         1.36484E+01         1.65349E-01         1.34830E+01
+          1.05528E-02         2.04028E-02        -1.61941E-02         6.62916E-01         1.50127E+00         6.63113E-01         1.31753E+01         1.00000E+00         2.28142E-01         1.31767E+01         2.32597E-01         1.29441E+01
+          1.05528E-02         2.05726E-02        -1.64128E-02         6.62913E-01         1.51194E+00         6.63116E-01         1.27339E+01         1.00000E+00         2.27243E-01         1.27353E+01         3.08754E-01         1.24266E+01
+          1.05528E-02         2.07425E-02        -1.66333E-02         6.62911E-01         1.52261E+00         6.63120E-01         1.23228E+01         1.00000E+00         2.26312E-01         1.23243E+01         3.92737E-01         1.19316E+01
+          1.05528E-02         2.09123E-02        -1.68555E-02         6.62909E-01         1.53328E+00         6.63123E-01         1.19422E+01         1.00000E+00         2.25349E-01         1.19437E+01         4.83498E-01         1.14602E+01
+          1.05528E-02         2.10821E-02        -1.70796E-02         6.62906E-01         1.54395E+00         6.63126E-01         1.15919E+01         1.00000E+00         2.24351E-01         1.15935E+01         5.80021E-01         1.10135E+01
+          1.05528E-02         2.12520E-02        -1.73055E-02         6.62904E-01         1.55462E+00         6.63130E-01         1.12719E+01         1.00000E+00         2.23318E-01         1.12736E+01         6.81330E-01         1.05922E+01
+          1.05528E-02         2.14218E-02        -1.75332E-02         6.62902E-01         1.56529E+00         6.63133E-01         1.09820E+01         1.00000E+00         2.22249E-01         1.09837E+01         7.86489E-01         1.01972E+01
+          1.05528E-02         2.15916E-02        -1.77628E-02         6.62899E-01         1.57596E+00         6.63137E-01         1.07218E+01         1.00000E+00         2.21143E-01         1.07235E+01         8.94601E-01         9.82892E+00
+          1.05528E-02         2.17614E-02        -1.79941E-02         6.62897E-01         1.58664E+00         6.63141E-01         1.04910E+01         1.00000E+00         2.19999E-01         1.04927E+01         1.00481E+00         9.48788E+00
+          1.05528E-02         2.19313E-02        -1.82273E-02         6.62894E-01         1.59731E+00         6.63145E-01         1.02890E+01         1.00000E+00         2.18817E-01         1.02907E+01         1.11631E+00         9.17440E+00
+          1.05528E-02         2.21011E-02        -1.84622E-02         6.62892E-01         1.60798E+00         6.63149E-01         1.01153E+01         1.00000E+00         2.17596E-01         1.01170E+01         1.22834E+00         8.88865E+00
+          1.05528E-02         2.22709E-02        -1.86990E-02         6.62889E-01         1.61865E+00         6.63153E-01         9.96913E+00         1.00000E+00         2.16337E-01         9.97086E+00         1.34016E+00         8.63070E+00
+          1.05528E-02         2.24407E-02        -1.89376E-02         6.62887E-01         1.62932E+00         6.63157E-01         9.84984E+00         1.00000E+00         2.15038E-01         9.85157E+00         1.45112E+00         8.40046E+00
+          1.05528E-02         2.26106E-02        -1.91780E-02         6.62884E-01         1.63999E+00         6.63162E-01         9.75658E+00         1.00000E+00         2.13699E-01         9.75831E+00         1.56056E+00         8.19774E+00
+          1.05528E-02         2.27804E-02        -1.94202E-02         6.62882E-01         1.65066E+00         6.63166E-01         9.68845E+00         1.00000E+00         2.12322E-01         9.69017E+00         1.66793E+00         8.02224E+00
+          1.05528E-02         2.29502E-02        -1.96643E-02         6.62879E-01         1.66133E+00         6.63171E-01         9.64448E+00         1.00000E+00         2.10904E-01         9.64618E+00         1.77266E+00         7.87352E+00
+          1.05528E-02         2.31201E-02        -1.99101E-02         6.62876E-01         1.67200E+00         6.63175E-01         9.62364E+00         1.00000E+00         2.09448E-01         9.62532E+00         1.87428E+00         7.75104E+00
+          1.05528E-02         2.32899E-02        -2.01578E-02         6.62874E-01         1.68267E+00         6.63180E-01         9.62484E+00         1.00000E+00         2.07952E-01         9.62649E+00         1.97232E+00         7.65416E+00
+          1.05528E-02         2.34597E-02        -2.04073E-02         6.62871E-01         1.69334E+00         6.63185E-01         9.64692E+00         1.00000E+00         2.06418E-01         9.64855E+00         2.06640E+00         7.58215E+00
+          1.05528E-02         2.36295E-02        -2.06586E-02         6.62869E-01         1.70401E+00         6.63190E-01         9.68871E+00         1.00000E+00         2.04845E-01         9.69030E+00         2.15615E+00         7.53416E+00
+          1.05528E-02         2.37994E-02        -2.09117E-02         6.62866E-01         1.71468E+00         6.63196E-01         9.74897E+00         1.00000E+00         2.03234E-01         9.75052E+00         2.24125E+00         7.50927E+00
+          1.05528E-02         2.39692E-02        -2.11666E-02         6.62863E-01         1.72535E+00         6.63201E-01         9.82641E+00         1.00000E+00         2.01586E-01         9.82793E+00         2.32142E+00         7.50650E+00
+          1.05528E-02         2.41390E-02        -2.14233E-02         6.62860E-01         1.73602E+00         6.63207E-01         9.91975E+00         1.00000E+00         1.99901E-01         9.92122E+00         2.39644E+00         7.52478E+00
+          1.05528E-02         2.43088E-02        -2.16819E-02         6.62858E-01         1.74669E+00         6.63212E-01         1.00276E+01         1.00000E+00         1.98180E-01         1.00291E+01         2.46610E+00         7.56297E+00
+          1.05528E-02         2.44787E-02        -2.19422E-02         6.62855E-01         1.75736E+00         6.63218E-01         1.01488E+01         1.00000E+00         1.96424E-01         1.01501E+01         2.53024E+00         7.61989E+00
+          1.05528E-02         2.46485E-02        -2.22044E-02         6.62852E-01         1.76804E+00         6.63224E-01         1.02817E+01         1.00000E+00         1.94633E-01         1.02831E+01         2.58875E+00         7.69430E+00
+          1.05528E-02         2.48183E-02        -2.24684E-02         6.62849E-01         1.77871E+00         6.63230E-01         1.04252E+01         1.00000E+00         1.92809E-01         1.04265E+01         2.64154E+00         7.78493E+00
+          1.05528E-02         2.49882E-02        -2.27342E-02         6.62847E-01         1.78938E+00         6.63236E-01         1.05778E+01         1.00000E+00         1.90952E-01         1.05790E+01         2.68855E+00         7.89045E+00
+          1.05528E-02         2.51580E-02        -2.30018E-02         6.62844E-01         1.80005E+00         6.63243E-01         1.07382E+01         1.00000E+00         1.89064E-01         1.07393E+01         2.72977E+00         8.00954E+00
+          1.05528E-02         2.53278E-02        -2.32712E-02         6.62841E-01         1.81072E+00         6.63249E-01         1.09049E+01         1.00000E+00         1.87145E-01         1.09060E+01         2.76519E+00         8.14084E+00
+          1.05528E-02         2.54976E-02        -2.35425E-02         6.62838E-01         1.82139E+00         6.63256E-01         1.10768E+01         1.00000E+00         1.85196E-01         1.10778E+01         2.79486E+00         8.28297E+00
+          1.05528E-02         2.56675E-02        -2.38155E-02         6.62835E-01         1.83206E+00         6.63263E-01         1.12524E+01         1.00000E+00         1.83219E-01         1.12534E+01         2.81884E+00         8.43457E+00
+          1.05528E-02         2.58373E-02        -2.40904E-02         6.62832E-01         1.84273E+00         6.63270E-01         1.14306E+01         1.00000E+00         1.81215E-01         1.14315E+01         2.83721E+00         8.59426E+00
+          1.05528E-02         2.60071E-02        -2.43671E-02         6.62829E-01         1.85340E+00         6.63277E-01         1.16099E+01         1.00000E+00         1.79185E-01         1.16108E+01         2.85008E+00         8.76068E+00
+          1.05528E-02         2.61769E-02        -2.46456E-02         6.62826E-01         1.86407E+00         6.63284E-01         1.17893E+01         1.00000E+00         1.77131E-01         1.17901E+01         2.85759E+00         8.93249E+00
+          1.07227E-02         8.72665E-04        -3.25329E-03         6.73724E-01         2.74155E-01         6.73732E-01         4.86788E+02         1.00000E+00         7.25732E-01         4.86793E+02         3.67645E+01         4.50028E+02
+          1.07227E-02         1.04249E-03        -3.26351E-03         6.73724E-01         2.84826E-01         6.73732E-01         4.77594E+02         1.00000E+00         7.16937E-01         4.77599E+02         3.77024E+01         4.39896E+02
+          1.07227E-02         1.21232E-03        -3.27554E-03         6.73724E-01         2.95496E-01         6.73732E-01         4.68238E+02         1.00000E+00         7.07956E-01         4.68243E+02         3.86398E+01         4.29603E+02
+          1.07227E-02         1.38215E-03        -3.28938E-03         6.73724E-01         3.06167E-01         6.73732E-01         4.58737E+02         1.00000E+00         6.98805E-01         4.58742E+02         3.95734E+01         4.19169E+02
+          1.07227E-02         1.55197E-03        -3.30503E-03         6.73723E-01         3.16838E-01         6.73732E-01         4.49110E+02         1.00000E+00         6.89497E-01         4.49115E+02         4.05001E+01         4.08615E+02
+          1.07227E-02         1.72180E-03        -3.32250E-03         6.73723E-01         3.27508E-01         6.73731E-01         4.39373E+02         1.00000E+00         6.80048E-01         4.39378E+02         4.14167E+01         3.97961E+02
+          1.07227E-02         1.89163E-03        -3.34177E-03         6.73723E-01         3.38179E-01         6.73731E-01         4.29544E+02         1.00000E+00         6.70472E-01         4.29549E+02         4.23199E+01         3.87229E+02
+          1.07227E-02         2.06146E-03        -3.36286E-03         6.73723E-01         3.48849E-01         6.73731E-01         4.19641E+02         1.00000E+00         6.60783E-01         4.19645E+02         4.32067E+01         3.76439E+02
+          1.07227E-02         2.23128E-03        -3.38577E-03         6.73723E-01         3.59520E-01         6.73731E-01         4.09680E+02         1.00000E+00         6.50997E-01         4.09685E+02         4.40740E+01         3.65611E+02
+          1.07227E-02         2.40111E-03        -3.41048E-03         6.73722E-01         3.70190E-01         6.73731E-01         3.99679E+02         1.00000E+00         6.41128E-01         3.99683E+02         4.49188E+01         3.54764E+02
+          1.07227E-02         2.57094E-03        -3.43701E-03         6.73722E-01         3.80861E-01         6.73731E-01         3.89654E+02         1.00000E+00         6.31190E-01         3.89658E+02         4.57383E+01         3.43920E+02
+          1.07227E-02         2.74077E-03        -3.46534E-03         6.73722E-01         3.91532E-01         6.73731E-01         3.79621E+02         1.00000E+00         6.21197E-01         3.79625E+02         4.65296E+01         3.33096E+02
+          1.07227E-02         2.91059E-03        -3.49549E-03         6.73721E-01         4.02202E-01         6.73730E-01         3.69597E+02         1.00000E+00         6.11164E-01         3.69601E+02         4.72901E+01         3.22311E+02
+          1.07227E-02         3.08042E-03        -3.52746E-03         6.73721E-01         4.12873E-01         6.73730E-01         3.59597E+02         1.00000E+00         6.01104E-01         3.59601E+02         4.80170E+01         3.11584E+02
+          1.07227E-02         3.25025E-03        -3.56123E-03         6.73721E-01         4.23543E-01         6.73730E-01         3.49637E+02         1.00000E+00         5.91032E-01         3.49641E+02         4.87080E+01         3.00933E+02
+          1.07227E-02         3.42008E-03        -3.59682E-03         6.73720E-01         4.34214E-01         6.73730E-01         3.39731E+02         1.00000E+00         5.80960E-01         3.39735E+02         4.93607E+01         2.90374E+02
+          1.07227E-02         3.58990E-03        -3.63421E-03         6.73720E-01         4.44884E-01         6.73730E-01         3.29893E+02         1.00000E+00         5.70901E-01         3.29897E+02         4.99728E+01         2.79924E+02
+          1.07227E-02         3.75973E-03        -3.67342E-03         6.73719E-01         4.55555E-01         6.73729E-01         3.20138E+02         1.00000E+00         5.60869E-01         3.20141E+02         5.05423E+01         2.69599E+02
+          1.07227E-02         3.92956E-03        -3.71445E-03         6.73719E-01         4.66225E-01         6.73729E-01         3.10478E+02         1.00000E+00         5.50875E-01         3.10481E+02         5.10672E+01         2.59414E+02
+          1.07227E-02         4.09939E-03        -3.75728E-03         6.73719E-01         4.76896E-01         6.73729E-01         3.00926E+02         1.00000E+00         5.40932E-01         3.00929E+02         5.15457E+01         2.49383E+02
+          1.07227E-02         4.26921E-03        -3.80193E-03         6.73718E-01         4.87567E-01         6.73729E-01         2.91494E+02         1.00000E+00         5.31052E-01         2.91497E+02         5.19762E+01         2.39521E+02
+          1.07227E-02         4.43904E-03        -3.84839E-03         6.73718E-01         4.98237E-01         6.73729E-01         2.82193E+02         1.00000E+00         5.21244E-01         2.82196E+02         5.23572E+01         2.29839E+02
+          1.07227E-02         4.60887E-03        -3.89666E-03         6.73717E-01         5.08908E-01         6.73728E-01         2.73034E+02         1.00000E+00         5.11521E-01         2.73037E+02         5.26873E+01         2.20349E+02
+          1.07227E-02         4.77869E-03        -3.94674E-03         6.73717E-01         5.19578E-01         6.73728E-01         2.64027E+02         1.00000E+00         5.01892E-01         2.64030E+02         5.29654E+01         2.11064E+02
+          1.07227E-02         4.94852E-03        -3.99864E-03         6.73716E-01         5.30249E-01         6.73728E-01         2.55181E+02         1.00000E+00         4.92367E-01         2.55184E+02         5.31906E+01         2.01993E+02
+          1.07227E-02         5.11835E-03        -4.05234E-03         6.73715E-01         5.40919E-01         6.73728E-01         2.46506E+02         1.00000E+00         4.82956E-01         2.46508E+02         5.33619E+01         1.93146E+02
+          1.07227E-02         5.28818E-03        -4.10786E-03         6.73715E-01         5.51590E-01         6.73727E-01         2.38008E+02         1.00000E+00         4.73667E-01         2.38011E+02         5.34788E+01         1.84532E+02
+          1.07227E-02         5.45800E-03        -4.16519E-03         6.73714E-01         5.62261E-01         6.73727E-01         2.29696E+02         1.00000E+00         4.64507E-01         2.29698E+02         5.35407E+01         1.76157E+02
+          1.07227E-02         5.62783E-03        -4.22434E-03         6.73714E-01         5.72931E-01         6.73727E-01         2.21575E+02         1.00000E+00         4.55486E-01         2.21577E+02         5.35474E+01         1.68030E+02
+          1.07227E-02         5.79766E-03        -4.28529E-03         6.73713E-01         5.83602E-01         6.73727E-01         2.13652E+02         1.00000E+00         4.46610E-01         2.13654E+02         5.34987E+01         1.60155E+02
+          1.07227E-02         5.96749E-03        -4.34806E-03         6.73712E-01         5.94272E-01         6.73726E-01         2.05931E+02         1.00000E+00         4.37885E-01         2.05933E+02         5.33945E+01         1.52539E+02
+          1.07227E-02         6.13731E-03        -4.41264E-03         6.73712E-01         6.04943E-01         6.73726E-01         1.98418E+02         1.00000E+00         4.29318E-01         1.98420E+02         5.32352E+01         1.45184E+02
+          1.07227E-02         6.30714E-03        -4.47903E-03         6.73711E-01         6.15613E-01         6.73726E-01         1.91115E+02         1.00000E+00         4.20915E-01         1.91117E+02         5.30211E+01         1.38096E+02
+          1.07227E-02         6.47697E-03        -4.54724E-03         6.73710E-01         6.26284E-01         6.73725E-01         1.84026E+02         1.00000E+00         4.12679E-01         1.84028E+02         5.27526E+01         1.31275E+02
+          1.07227E-02         6.64680E-03        -4.61725E-03         6.73709E-01         6.36955E-01         6.73725E-01         1.77154E+02         1.00000E+00         4.04615E-01         1.77155E+02         5.24305E+01         1.24725E+02
+          1.07227E-02         6.81662E-03        -4.68908E-03         6.73709E-01         6.47625E-01         6.73725E-01         1.70499E+02         1.00000E+00         3.96728E-01         1.70500E+02         5.20555E+01         1.18445E+02
+          1.07227E-02         6.98645E-03        -4.76272E-03         6.73708E-01         6.58296E-01         6.73725E-01         1.64063E+02         1.00000E+00         3.89020E-01         1.64064E+02         5.16286E+01         1.12435E+02
+          1.07227E-02         7.15628E-03        -4.83818E-03         6.73707E-01         6.68966E-01         6.73724E-01         1.57846E+02         1.00000E+00         3.81495E-01         1.57847E+02         5.11510E+01         1.06696E+02
+          1.07227E-02         7.32611E-03        -4.91544E-03         6.73706E-01         6.79637E-01         6.73724E-01         1.51849E+02         1.00000E+00         3.74154E-01         1.51850E+02         5.06239E+01         1.01226E+02
+          1.07227E-02         7.49593E-03        -4.99452E-03         6.73705E-01         6.90307E-01         6.73724E-01         1.46070E+02         1.00000E+00         3.67000E-01         1.46070E+02         5.00486E+01         9.60218E+01
+          1.07227E-02         7.66576E-03        -5.07541E-03         6.73704E-01         7.00978E-01         6.73724E-01         1.40508E+02         1.00000E+00         3.60033E-01         1.40508E+02         4.94267E+01         9.10814E+01
+          1.07227E-02         7.83559E-03        -5.15811E-03         6.73704E-01         7.11649E-01         6.73723E-01         1.35160E+02         1.00000E+00         3.53255E-01         1.35161E+02         4.87598E+01         8.64011E+01
+          1.07227E-02         8.00542E-03        -5.24263E-03         6.73703E-01         7.22319E-01         6.73723E-01         1.30026E+02         1.00000E+00         3.46666E-01         1.30026E+02         4.80496E+01         8.19768E+01
+          1.07227E-02         8.17524E-03        -5.32895E-03         6.73702E-01         7.32990E-01         6.73723E-01         1.25101E+02         1.00000E+00         3.40266E-01         1.25102E+02         4.72978E+01         7.78037E+01
+          1.07227E-02         8.34507E-03        -5.41709E-03         6.73701E-01         7.43660E-01         6.73723E-01         1.20383E+02         1.00000E+00         3.34054E-01         1.20383E+02         4.65066E+01         7.38766E+01
+          1.07227E-02         8.51490E-03        -5.50704E-03         6.73700E-01         7.54331E-01         6.73722E-01         1.15867E+02         1.00000E+00         3.28031E-01         1.15867E+02         4.56778E+01         7.01897E+01
+          1.07227E-02         8.68473E-03        -5.59880E-03         6.73699E-01         7.65001E-01         6.73722E-01         1.11550E+02         1.00000E+00         3.22194E-01         1.11550E+02         4.48136E+01         6.67367E+01
+          1.07227E-02         8.85455E-03        -5.69238E-03         6.73698E-01         7.75672E-01         6.73722E-01         1.07427E+02         1.00000E+00         3.16542E-01         1.07427E+02         4.39160E+01         6.35108E+01
+          1.07227E-02         9.02438E-03        -5.78777E-03         6.73697E-01         7.86343E-01         6.73722E-01         1.03493E+02         1.00000E+00         3.11074E-01         1.03492E+02         4.29874E+01         6.05050E+01
+          1.07227E-02         9.19421E-03        -5.88497E-03         6.73696E-01         7.97013E-01         6.73721E-01         9.97422E+01         1.00000E+00         3.05788E-01         9.97419E+01         4.20301E+01         5.77118E+01
+          1.07227E-02         9.36403E-03        -5.98398E-03         6.73695E-01         8.07684E-01         6.73721E-01         9.61701E+01         1.00000E+00         3.00680E-01         9.61696E+01         4.10462E+01         5.51234E+01
+          1.07227E-02         9.53386E-03        -6.08480E-03         6.73694E-01         8.18354E-01         6.73721E-01         9.27705E+01         1.00000E+00         2.95750E-01         9.27699E+01         4.00382E+01         5.27317E+01
+          1.07227E-02         9.70369E-03        -6.18744E-03         6.73693E-01         8.29025E-01         6.73721E-01         8.95375E+01         1.00000E+00         2.90995E-01         8.95368E+01         3.90086E+01         5.05283E+01
+          1.07227E-02         9.87352E-03        -6.29189E-03         6.73691E-01         8.39695E-01         6.73721E-01         8.64650E+01         1.00000E+00         2.86410E-01         8.64643E+01         3.79596E+01         4.85047E+01
+          1.07227E-02         1.00433E-02        -6.39815E-03         6.73690E-01         8.50366E-01         6.73721E-01         8.35468E+01         1.00000E+00         2.81995E-01         8.35460E+01         3.68937E+01         4.66524E+01
+          1.07227E-02         1.02132E-02        -6.50622E-03         6.73689E-01         8.61037E-01         6.73721E-01         8.07765E+01         1.00000E+00         2.77744E-01         8.07756E+01         3.58133E+01         4.49623E+01
+          1.07227E-02         1.03830E-02        -6.61611E-03         6.73688E-01         8.71707E-01         6.73720E-01         7.81475E+01         1.00000E+00         2.73656E-01         7.81465E+01         3.47209E+01         4.34256E+01
+          1.07227E-02         1.05528E-02        -6.72781E-03         6.73687E-01         8.82378E-01         6.73720E-01         7.56533E+01         1.00000E+00         2.69727E-01         7.56522E+01         3.36188E+01         4.20334E+01
+          1.07227E-02         1.07227E-02        -6.84132E-03         6.73686E-01         8.93048E-01         6.73720E-01         7.32873E+01         1.00000E+00         2.65953E-01         7.32862E+01         3.25095E+01         4.07767E+01
+          1.07227E-02         1.08925E-02        -6.95664E-03         6.73684E-01         9.03719E-01         6.73720E-01         7.10430E+01         1.00000E+00         2.62332E-01         7.10418E+01         3.13952E+01         3.96466E+01
+          1.07227E-02         1.10623E-02        -7.07378E-03         6.73683E-01         9.14389E-01         6.73720E-01         6.89137E+01         1.00000E+00         2.58859E-01         6.89125E+01         3.02784E+01         3.86341E+01
+          1.07227E-02         1.12321E-02        -7.19273E-03         6.73682E-01         9.25060E-01         6.73720E-01         6.68931E+01         1.00000E+00         2.55531E-01         6.68918E+01         2.91613E+01         3.77305E+01
+          1.07227E-02         1.14020E-02        -7.31349E-03         6.73680E-01         9.35731E-01         6.73720E-01         6.49745E+01         1.00000E+00         2.52344E-01         6.49732E+01         2.80462E+01         3.69270E+01
+          1.07227E-02         1.15718E-02        -7.43606E-03         6.73679E-01         9.46401E-01         6.73720E-01         6.31517E+01         1.00000E+00         2.49296E-01         6.31503E+01         2.69351E+01         3.62152E+01
+          1.07227E-02         1.17416E-02        -7.56044E-03         6.73678E-01         9.57072E-01         6.73720E-01         6.14185E+01         1.00000E+00         2.46382E-01         6.14170E+01         2.58303E+01         3.55867E+01
+          1.07227E-02         1.19114E-02        -7.68664E-03         6.73676E-01         9.67742E-01         6.73720E-01         5.97686E+01         1.00000E+00         2.43599E-01         5.97672E+01         2.47339E+01         3.50333E+01
+          1.07227E-02         1.20813E-02        -7.81465E-03         6.73675E-01         9.78413E-01         6.73720E-01         5.81963E+01         1.00000E+00         2.40943E-01         5.81948E+01         2.36477E+01         3.45471E+01
+          1.07227E-02         1.22511E-02        -7.94447E-03         6.73674E-01         9.89083E-01         6.73721E-01         5.66957E+01         1.00000E+00         2.38410E-01         5.66942E+01         2.25737E+01         3.41205E+01
+          1.07227E-02         1.24209E-02        -8.07611E-03         6.73672E-01         9.99754E-01         6.73721E-01         5.52613E+01         1.00000E+00         2.35997E-01         5.52598E+01         2.15138E+01         3.37460E+01
+          1.07227E-02         1.25908E-02        -8.20955E-03         6.73671E-01         1.01042E+00         6.73721E-01         5.38876E+01         1.00000E+00         2.33701E-01         5.38861E+01         2.04696E+01         3.34165E+01
+          1.07227E-02         1.27606E-02        -8.34481E-03         6.73669E-01         1.02110E+00         6.73721E-01         5.25696E+01         1.00000E+00         2.31517E-01         5.25680E+01         1.94429E+01         3.31251E+01
+          1.07227E-02         1.29304E-02        -8.48189E-03         6.73668E-01         1.03177E+00         6.73721E-01         5.13022E+01         1.00000E+00         2.29443E-01         5.13007E+01         1.84352E+01         3.28655E+01
+          1.07227E-02         1.31002E-02        -8.62077E-03         6.73666E-01         1.04244E+00         6.73722E-01         5.00809E+01         1.00000E+00         2.27473E-01         5.00794E+01         1.74479E+01         3.26315E+01
+          1.07227E-02         1.32701E-02        -8.76147E-03         6.73665E-01         1.05311E+00         6.73722E-01         4.89012E+01         1.00000E+00         2.25606E-01         4.88997E+01         1.64825E+01         3.24171E+01
+          1.07227E-02         1.34399E-02        -8.90398E-03         6.73663E-01         1.06378E+00         6.73722E-01         4.77589E+01         1.00000E+00         2.23836E-01         4.77574E+01         1.55403E+01         3.22171E+01
+          1.07227E-02         1.36097E-02        -9.04830E-03         6.73662E-01         1.07445E+00         6.73723E-01         4.66501E+01         1.00000E+00         2.22161E-01         4.66486E+01         1.46224E+01         3.20262E+01
+          1.07227E-02         1.37795E-02        -9.19444E-03         6.73660E-01         1.08512E+00         6.73723E-01         4.55711E+01         1.00000E+00         2.20577E-01         4.55697E+01         1.37298E+01         3.18398E+01
+          1.07227E-02         1.39494E-02        -9.34238E-03         6.73659E-01         1.09579E+00         6.73723E-01         4.45186E+01         1.00000E+00         2.19080E-01         4.45172E+01         1.28637E+01         3.16535E+01
+          1.07227E-02         1.41192E-02        -9.49214E-03         6.73657E-01         1.10646E+00         6.73724E-01         4.34895E+01         1.00000E+00         2.17666E-01         4.34881E+01         1.20248E+01         3.14633E+01
+          1.07227E-02         1.42890E-02        -9.64372E-03         6.73655E-01         1.11713E+00         6.73724E-01         4.24809E+01         1.00000E+00         2.16332E-01         4.24795E+01         1.12139E+01         3.12656E+01
+          1.07227E-02         1.44589E-02        -9.79710E-03         6.73654E-01         1.12780E+00         6.73725E-01         4.14901E+01         1.00000E+00         2.15074E-01         4.14888E+01         1.04317E+01         3.10571E+01
+          1.07227E-02         1.46287E-02        -9.95230E-03         6.73652E-01         1.13847E+00         6.73726E-01         4.05151E+01         1.00000E+00         2.13888E-01         4.05137E+01         9.67880E+00         3.08350E+01
+          1.07227E-02         1.47985E-02        -1.01093E-02         6.73650E-01         1.14914E+00         6.73726E-01         3.95535E+01         1.00000E+00         2.12770E-01         3.95523E+01         8.95561E+00         3.05967E+01
+          1.07227E-02         1.49683E-02        -1.02681E-02         6.73649E-01         1.15981E+00         6.73727E-01         3.86038E+01         1.00000E+00         2.11718E-01         3.86026E+01         8.26253E+00         3.03400E+01
+          1.07227E-02         1.51382E-02        -1.04288E-02         6.73647E-01         1.17048E+00         6.73728E-01         3.76642E+01         1.00000E+00         2.10727E-01         3.76631E+01         7.59983E+00         3.00633E+01
+          1.07227E-02         1.53080E-02        -1.05912E-02         6.73645E-01         1.18115E+00         6.73729E-01         3.67336E+01         1.00000E+00         2.09793E-01         3.67325E+01         6.96769E+00         2.97648E+01
+          1.07227E-02         1.54778E-02        -1.07555E-02         6.73644E-01         1.19182E+00         6.73729E-01         3.58109E+01         1.00000E+00         2.08912E-01         3.58099E+01         6.36621E+00         2.94436E+01
+          1.07227E-02         1.56476E-02        -1.09216E-02         6.73642E-01         1.20249E+00         6.73730E-01         3.48952E+01         1.00000E+00         2.08082E-01         3.48942E+01         5.79537E+00         2.90988E+01
+          1.07227E-02         1.58175E-02        -1.10894E-02         6.73640E-01         1.21317E+00         6.73731E-01         3.39858E+01         1.00000E+00         2.07299E-01         3.39849E+01         5.25510E+00         2.87298E+01
+          1.07227E-02         1.59873E-02        -1.12591E-02         6.73638E-01         1.22384E+00         6.73732E-01         3.30824E+01         1.00000E+00         2.06558E-01         3.30816E+01         4.74522E+00         2.83364E+01
+          1.07227E-02         1.61571E-02        -1.14306E-02         6.73636E-01         1.23451E+00         6.73733E-01         3.21848E+01         1.00000E+00         2.05856E-01         3.21840E+01         4.26547E+00         2.79186E+01
+          1.07227E-02         1.63270E-02        -1.16040E-02         6.73634E-01         1.24518E+00         6.73734E-01         3.12929E+01         1.00000E+00         2.05190E-01         3.12922E+01         3.81554E+00         2.74766E+01
+          1.07227E-02         1.64968E-02        -1.17791E-02         6.73633E-01         1.25585E+00         6.73736E-01         3.04067E+01         1.00000E+00         2.04556E-01         3.04061E+01         3.39501E+00         2.70111E+01
+          1.07227E-02         1.66666E-02        -1.19561E-02         6.73631E-01         1.26652E+00         6.73737E-01         2.95267E+01         1.00000E+00         2.03951E-01         2.95261E+01         3.00342E+00         2.65227E+01
+          1.07227E-02         1.68364E-02        -1.21348E-02         6.73629E-01         1.27719E+00         6.73738E-01         2.86532E+01         1.00000E+00         2.03372E-01         2.86527E+01         2.64023E+00         2.60124E+01
+          1.07227E-02         1.70063E-02        -1.23154E-02         6.73627E-01         1.28786E+00         6.73739E-01         2.77867E+01         1.00000E+00         2.02814E-01         2.77863E+01         2.30483E+00         2.54815E+01
+          1.07227E-02         1.71761E-02        -1.24978E-02         6.73625E-01         1.29853E+00         6.73741E-01         2.69280E+01         1.00000E+00         2.02275E-01         2.69277E+01         1.99658E+00         2.49311E+01
+          1.07227E-02         1.73459E-02        -1.26820E-02         6.73623E-01         1.30920E+00         6.73742E-01         2.60779E+01         1.00000E+00         2.01752E-01         2.60776E+01         1.71477E+00         2.43629E+01
+          1.07227E-02         1.75158E-02        -1.28680E-02         6.73621E-01         1.31987E+00         6.73744E-01         2.52371E+01         1.00000E+00         2.01241E-01         2.52369E+01         1.45863E+00         2.37783E+01
+          1.07227E-02         1.76856E-02        -1.30558E-02         6.73619E-01         1.33054E+00         6.73745E-01         2.44067E+01         1.00000E+00         2.00740E-01         2.44066E+01         1.22737E+00         2.31792E+01
+          1.07227E-02         1.78554E-02        -1.32455E-02         6.73617E-01         1.34121E+00         6.73747E-01         2.35877E+01         1.00000E+00         2.00245E-01         2.35877E+01         1.02015E+00         2.25675E+01
+          1.07227E-02         1.80252E-02        -1.34369E-02         6.73615E-01         1.35188E+00         6.73749E-01         2.27811E+01         1.00000E+00         1.99754E-01         2.27811E+01         8.36081E-01         2.19450E+01
+          1.07227E-02         1.81951E-02        -1.36302E-02         6.73613E-01         1.36255E+00         6.73751E-01         2.19880E+01         1.00000E+00         1.99264E-01         2.19881E+01         6.74266E-01         2.13139E+01
+          1.07227E-02         1.83649E-02        -1.38253E-02         6.73611E-01         1.37322E+00         6.73752E-01         2.12096E+01         1.00000E+00         1.98773E-01         2.12098E+01         5.33768E-01         2.06760E+01
+          1.07227E-02         1.85347E-02        -1.40222E-02         6.73608E-01         1.38389E+00         6.73754E-01         2.04470E+01         1.00000E+00         1.98277E-01         2.04473E+01         4.13629E-01         2.00337E+01
+          1.07227E-02         1.87045E-02        -1.42209E-02         6.73606E-01         1.39457E+00         6.73756E-01         1.97014E+01         1.00000E+00         1.97775E-01         1.97017E+01         3.12873E-01         1.93889E+01
+          1.07227E-02         1.88744E-02        -1.44214E-02         6.73604E-01         1.40524E+00         6.73759E-01         1.89739E+01         1.00000E+00         1.97264E-01         1.89743E+01         2.30511E-01         1.87438E+01
+          1.07227E-02         1.90442E-02        -1.46237E-02         6.73602E-01         1.41591E+00         6.73761E-01         1.82656E+01         1.00000E+00         1.96741E-01         1.82661E+01         1.65541E-01         1.81005E+01
+          1.07227E-02         1.92140E-02        -1.48279E-02         6.73600E-01         1.42658E+00         6.73763E-01         1.75776E+01         1.00000E+00         1.96205E-01         1.75782E+01         1.16958E-01         1.74612E+01
+          1.07227E-02         1.93839E-02        -1.50338E-02         6.73598E-01         1.43725E+00         6.73765E-01         1.69110E+01         1.00000E+00         1.95655E-01         1.69117E+01         8.37509E-02         1.68279E+01
+          1.07227E-02         1.95537E-02        -1.52416E-02         6.73595E-01         1.44792E+00         6.73768E-01         1.62669E+01         1.00000E+00         1.95086E-01         1.62675E+01         6.49127E-02         1.62026E+01
+          1.07227E-02         1.97235E-02        -1.54512E-02         6.73593E-01         1.45859E+00         6.73770E-01         1.56460E+01         1.00000E+00         1.94499E-01         1.56468E+01         5.94391E-02         1.55873E+01
+          1.07227E-02         1.98933E-02        -1.56626E-02         6.73591E-01         1.46926E+00         6.73773E-01         1.50494E+01         1.00000E+00         1.93891E-01         1.50502E+01         6.63341E-02         1.49839E+01
+          1.07227E-02         2.00632E-02        -1.58758E-02         6.73589E-01         1.47993E+00         6.73776E-01         1.44779E+01         1.00000E+00         1.93261E-01         1.44788E+01         8.46129E-02         1.43941E+01
+          1.07227E-02         2.02330E-02        -1.60908E-02         6.73586E-01         1.49060E+00         6.73778E-01         1.39322E+01         1.00000E+00         1.92608E-01         1.39331E+01         1.13305E-01         1.38198E+01
+          1.07227E-02         2.04028E-02        -1.63076E-02         6.73584E-01         1.50127E+00         6.73781E-01         1.34130E+01         1.00000E+00         1.91929E-01         1.34139E+01         1.51455E-01         1.32625E+01
+          1.07227E-02         2.05726E-02        -1.65263E-02         6.73582E-01         1.51194E+00         6.73784E-01         1.29208E+01         1.00000E+00         1.91224E-01         1.29218E+01         1.98131E-01         1.27237E+01
+          1.07227E-02         2.07425E-02        -1.67467E-02         6.73579E-01         1.52261E+00         6.73787E-01         1.24562E+01         1.00000E+00         1.90491E-01         1.24572E+01         2.52418E-01         1.22048E+01
+          1.07227E-02         2.09123E-02        -1.69690E-02         6.73577E-01         1.53328E+00         6.73791E-01         1.20196E+01         1.00000E+00         1.89730E-01         1.20206E+01         3.13430E-01         1.17072E+01
+          1.07227E-02         2.10821E-02        -1.71931E-02         6.73574E-01         1.54395E+00         6.73794E-01         1.16112E+01         1.00000E+00         1.88939E-01         1.16123E+01         3.80305E-01         1.12320E+01
+          1.07227E-02         2.12520E-02        -1.74190E-02         6.73572E-01         1.55462E+00         6.73797E-01         1.12313E+01         1.00000E+00         1.88118E-01         1.12324E+01         4.52210E-01         1.07802E+01
+          1.07227E-02         2.14218E-02        -1.76467E-02         6.73570E-01         1.56529E+00         6.73801E-01         1.08800E+01         1.00000E+00         1.87266E-01         1.08811E+01         5.28342E-01         1.03528E+01
+          1.07227E-02         2.15916E-02        -1.78763E-02         6.73567E-01         1.57596E+00         6.73804E-01         1.05573E+01         1.00000E+00         1.86382E-01         1.05584E+01         6.07929E-01         9.95050E+00
+          1.07227E-02         2.17614E-02        -1.81076E-02         6.73565E-01         1.58664E+00         6.73808E-01         1.02631E+01         1.00000E+00         1.85465E-01         1.02643E+01         6.90234E-01         9.57402E+00
+          1.07227E-02         2.19313E-02        -1.83408E-02         6.73562E-01         1.59731E+00         6.73812E-01         9.99720E+00         1.00000E+00         1.84516E-01         9.99840E+00         7.74551E-01         9.22385E+00
+          1.07227E-02         2.21011E-02        -1.85757E-02         6.73560E-01         1.60798E+00         6.73816E-01         9.75938E+00         1.00000E+00         1.83533E-01         9.76059E+00         8.60212E-01         8.90038E+00
+          1.07227E-02         2.22709E-02        -1.88125E-02         6.73557E-01         1.61865E+00         6.73820E-01         9.54924E+00         1.00000E+00         1.82517E-01         9.55046E+00         9.46584E-01         8.60387E+00
+          1.07227E-02         2.24407E-02        -1.90511E-02         6.73555E-01         1.62932E+00         6.73824E-01         9.36631E+00         1.00000E+00         1.81467E-01         9.36753E+00         1.03307E+00         8.33446E+00
+          1.07227E-02         2.26106E-02        -1.92915E-02         6.73552E-01         1.63999E+00         6.73828E-01         9.21003E+00         1.00000E+00         1.80383E-01         9.21125E+00         1.11911E+00         8.09214E+00
+          1.07227E-02         2.27804E-02        -1.95337E-02         6.73549E-01         1.65066E+00         6.73833E-01         9.07977E+00         1.00000E+00         1.79265E-01         9.08098E+00         1.20418E+00         7.87680E+00
+          1.07227E-02         2.29502E-02        -1.97778E-02         6.73547E-01         1.66133E+00         6.73837E-01         8.97479E+00         1.00000E+00         1.78113E-01         8.97600E+00         1.28779E+00         7.68820E+00
+          1.07227E-02         2.31201E-02        -2.00236E-02         6.73544E-01         1.67200E+00         6.73842E-01         8.89431E+00         1.00000E+00         1.76927E-01         8.89550E+00         1.36951E+00         7.52600E+00
+          1.07227E-02         2.32899E-02        -2.02713E-02         6.73541E-01         1.68267E+00         6.73846E-01         8.83744E+00         1.00000E+00         1.75707E-01         8.83862E+00         1.44890E+00         7.38972E+00
+          1.07227E-02         2.34597E-02        -2.05208E-02         6.73539E-01         1.69334E+00         6.73851E-01         8.80326E+00         1.00000E+00         1.74453E-01         8.80442E+00         1.52562E+00         7.27880E+00
+          1.07227E-02         2.36295E-02        -2.07720E-02         6.73536E-01         1.70401E+00         6.73856E-01         8.79074E+00         1.00000E+00         1.73167E-01         8.79188E+00         1.59930E+00         7.19258E+00
+          1.07227E-02         2.37994E-02        -2.10252E-02         6.73533E-01         1.71468E+00         6.73861E-01         8.79884E+00         1.00000E+00         1.71847E-01         8.79996E+00         1.66966E+00         7.13030E+00
+          1.07227E-02         2.39692E-02        -2.12801E-02         6.73531E-01         1.72535E+00         6.73867E-01         8.82644E+00         1.00000E+00         1.70495E-01         8.82753E+00         1.73642E+00         7.09111E+00
+          1.07227E-02         2.41390E-02        -2.15368E-02         6.73528E-01         1.73602E+00         6.73872E-01         8.87239E+00         1.00000E+00         1.69110E-01         8.87345E+00         1.79935E+00         7.07410E+00
+          1.07227E-02         2.43088E-02        -2.17953E-02         6.73525E-01         1.74669E+00         6.73878E-01         8.93548E+00         1.00000E+00         1.67694E-01         8.93650E+00         1.85825E+00         7.07825E+00
+          1.07227E-02         2.44787E-02        -2.20557E-02         6.73522E-01         1.75736E+00         6.73883E-01         9.01448E+00         1.00000E+00         1.66247E-01         9.01547E+00         1.91296E+00         7.10252E+00
+          1.07227E-02         2.46485E-02        -2.23179E-02         6.73520E-01         1.76804E+00         6.73889E-01         9.10813E+00         1.00000E+00         1.64770E-01         9.10909E+00         1.96332E+00         7.14577E+00
+          1.07227E-02         2.48183E-02        -2.25819E-02         6.73517E-01         1.77871E+00         6.73895E-01         9.21516E+00         1.00000E+00         1.63263E-01         9.21609E+00         2.00925E+00         7.20683E+00
+          1.07227E-02         2.49882E-02        -2.28477E-02         6.73514E-01         1.78938E+00         6.73901E-01         9.33427E+00         1.00000E+00         1.61727E-01         9.33515E+00         2.05066E+00         7.28449E+00
+          1.07227E-02         2.51580E-02        -2.31153E-02         6.73511E-01         1.80005E+00         6.73908E-01         9.46415E+00         1.00000E+00         1.60163E-01         9.46499E+00         2.08749E+00         7.37750E+00
+          1.07227E-02         2.53278E-02        -2.33847E-02         6.73508E-01         1.81072E+00         6.73914E-01         9.60349E+00         1.00000E+00         1.58572E-01         9.60428E+00         2.11973E+00         7.48455E+00
+          1.07227E-02         2.54976E-02        -2.36559E-02         6.73505E-01         1.82139E+00         6.73921E-01         9.75098E+00         1.00000E+00         1.56955E-01         9.75173E+00         2.14737E+00         7.60436E+00
+          1.07227E-02         2.56675E-02        -2.39290E-02         6.73502E-01         1.83206E+00         6.73927E-01         9.90532E+00         1.00000E+00         1.55312E-01         9.90603E+00         2.17044E+00         7.73559E+00
+          1.07227E-02         2.58373E-02        -2.42039E-02         6.73499E-01         1.84273E+00         6.73934E-01         1.00652E+01         1.00000E+00         1.53644E-01         1.00659E+01         2.18898E+00         7.87692E+00
+          1.07227E-02         2.60071E-02        -2.44805E-02         6.73496E-01         1.85340E+00         6.73941E-01         1.02294E+01         1.00000E+00         1.51953E-01         1.02301E+01         2.20305E+00         8.02701E+00
+          1.07227E-02         2.61769E-02        -2.47590E-02         6.73493E-01         1.86407E+00         6.73948E-01         1.03967E+01         1.00000E+00         1.50239E-01         1.03973E+01         2.21274E+00         8.18454E+00
+          1.08925E-02         8.72665E-04        -3.36862E-03         6.84395E-01         2.74155E-01         6.84403E-01         4.73715E+02         1.00000E+00         5.71636E-01         4.73718E+02         2.30148E+01         4.50703E+02
+          1.08925E-02         1.04249E-03        -3.37884E-03         6.84394E-01         2.84826E-01         6.84403E-01         4.64523E+02         1.00000E+00         5.64812E-01         4.64527E+02         2.39367E+01         4.40590E+02
+          1.08925E-02         1.21232E-03        -3.39087E-03         6.84394E-01         2.95496E-01         6.84403E-01         4.55171E+02         1.00000E+00         5.57844E-01         4.55174E+02         2.48618E+01         4.30313E+02
+          1.08925E-02         1.38215E-03        -3.40471E-03         6.84394E-01         3.06167E-01         6.84403E-01         4.45676E+02         1.00000E+00         5.50744E-01         4.45679E+02         2.57871E+01         4.19892E+02
+          1.08925E-02         1.55197E-03        -3.42036E-03         6.84394E-01         3.16838E-01         6.84403E-01         4.36055E+02         1.00000E+00         5.43523E-01         4.36058E+02         2.67099E+01         4.09348E+02
+          1.08925E-02         1.72180E-03        -3.43783E-03         6.84394E-01         3.27508E-01         6.84402E-01         4.26327E+02         1.00000E+00         5.36194E-01         4.26330E+02         2.76272E+01         3.98702E+02
+          1.08925E-02         1.89163E-03        -3.45710E-03         6.84394E-01         3.38179E-01         6.84402E-01         4.16508E+02         1.00000E+00         5.28766E-01         4.16511E+02         2.85362E+01         3.87975E+02
+          1.08925E-02         2.06146E-03        -3.47819E-03         6.84393E-01         3.48849E-01         6.84402E-01         4.06616E+02         1.00000E+00         5.21251E-01         4.06619E+02         2.94341E+01         3.77185E+02
+          1.08925E-02         2.23128E-03        -3.50110E-03         6.84393E-01         3.59520E-01         6.84402E-01         3.96669E+02         1.00000E+00         5.13662E-01         3.96672E+02         3.03182E+01         3.66354E+02
+          1.08925E-02         2.40111E-03        -3.52581E-03         6.84393E-01         3.70190E-01         6.84402E-01         3.86684E+02         1.00000E+00         5.06009E-01         3.86687E+02         3.11858E+01         3.55501E+02
+          1.08925E-02         2.57094E-03        -3.55233E-03         6.84393E-01         3.80861E-01         6.84402E-01         3.76677E+02         1.00000E+00         4.98302E-01         3.76680E+02         3.20342E+01         3.44645E+02
+          1.08925E-02         2.74077E-03        -3.58067E-03         6.84392E-01         3.91532E-01         6.84402E-01         3.66665E+02         1.00000E+00         4.90555E-01         3.66668E+02         3.28610E+01         3.33807E+02
+          1.08925E-02         2.91059E-03        -3.61082E-03         6.84392E-01         4.02202E-01         6.84401E-01         3.56664E+02         1.00000E+00         4.82777E-01         3.56667E+02         3.36635E+01         3.23004E+02
+          1.08925E-02         3.08042E-03        -3.64278E-03         6.84392E-01         4.12873E-01         6.84401E-01         3.46691E+02         1.00000E+00         4.74979E-01         3.46694E+02         3.44396E+01         3.12254E+02
+          1.08925E-02         3.25025E-03        -3.67656E-03         6.84391E-01         4.23543E-01         6.84401E-01         3.36760E+02         1.00000E+00         4.67171E-01         3.36762E+02         3.51868E+01         3.01576E+02
+          1.08925E-02         3.42008E-03        -3.71215E-03         6.84391E-01         4.34214E-01         6.84401E-01         3.26886E+02         1.00000E+00         4.59365E-01         3.26889E+02         3.59030E+01         2.90986E+02
+          1.08925E-02         3.58990E-03        -3.74954E-03         6.84390E-01         4.44884E-01         6.84401E-01         3.17084E+02         1.00000E+00         4.51571E-01         3.17087E+02         3.65861E+01         2.80501E+02
+          1.08925E-02         3.75973E-03        -3.78875E-03         6.84390E-01         4.55555E-01         6.84400E-01         3.07368E+02         1.00000E+00         4.43797E-01         3.07371E+02         3.72342E+01         2.70136E+02
+          1.08925E-02         3.92956E-03        -3.82978E-03         6.84390E-01         4.66225E-01         6.84400E-01         2.97751E+02         1.00000E+00         4.36055E-01         2.97754E+02         3.78455E+01         2.59908E+02
+          1.08925E-02         4.09939E-03        -3.87261E-03         6.84389E-01         4.76896E-01         6.84400E-01         2.88246E+02         1.00000E+00         4.28353E-01         2.88248E+02         3.84181E+01         2.49830E+02
+          1.08925E-02         4.26921E-03        -3.91726E-03         6.84389E-01         4.87567E-01         6.84400E-01         2.78865E+02         1.00000E+00         4.20700E-01         2.78867E+02         3.89506E+01         2.39916E+02
+          1.08925E-02         4.43904E-03        -3.96372E-03         6.84388E-01         4.98237E-01         6.84400E-01         2.69619E+02         1.00000E+00         4.13105E-01         2.69621E+02         3.94415E+01         2.30180E+02
+          1.08925E-02         4.60887E-03        -4.01199E-03         6.84388E-01         5.08908E-01         6.84399E-01         2.60520E+02         1.00000E+00         4.05576E-01         2.60522E+02         3.98895E+01         2.20632E+02
+          1.08925E-02         4.77869E-03        -4.06207E-03         6.84387E-01         5.19578E-01         6.84399E-01         2.51577E+02         1.00000E+00         3.98122E-01         2.51579E+02         4.02934E+01         2.11285E+02
+          1.08925E-02         4.94852E-03        -4.11396E-03         6.84386E-01         5.30249E-01         6.84399E-01         2.42800E+02         1.00000E+00         3.90749E-01         2.42802E+02         4.06522E+01         2.02150E+02
+          1.08925E-02         5.11835E-03        -4.16767E-03         6.84386E-01         5.40919E-01         6.84399E-01         2.34198E+02         1.00000E+00         3.83466E-01         2.34200E+02         4.09650E+01         1.93235E+02
+          1.08925E-02         5.28818E-03        -4.22319E-03         6.84385E-01         5.51590E-01         6.84398E-01         2.25779E+02         1.00000E+00         3.76278E-01         2.25781E+02         4.12310E+01         1.84550E+02
+          1.08925E-02         5.45800E-03        -4.28052E-03         6.84385E-01         5.62261E-01         6.84398E-01         2.17550E+02         1.00000E+00         3.69192E-01         2.17552E+02         4.14498E+01         1.76102E+02
+          1.08925E-02         5.62783E-03        -4.33967E-03         6.84384E-01         5.72931E-01         6.84398E-01         2.09518E+02         1.00000E+00         3.62214E-01         2.09520E+02         4.16207E+01         1.67899E+02
+          1.08925E-02         5.79766E-03        -4.40062E-03         6.84383E-01         5.83602E-01         6.84397E-01         2.01689E+02         1.00000E+00         3.55350E-01         2.01691E+02         4.17436E+01         1.59947E+02
+          1.08925E-02         5.96749E-03        -4.46339E-03         6.84383E-01         5.94272E-01         6.84397E-01         1.94068E+02         1.00000E+00         3.48604E-01         1.94070E+02         4.18182E+01         1.52252E+02
+          1.08925E-02         6.13731E-03        -4.52797E-03         6.84382E-01         6.04943E-01         6.84397E-01         1.86660E+02         1.00000E+00         3.41982E-01         1.86662E+02         4.18446E+01         1.44817E+02
+          1.08925E-02         6.30714E-03        -4.59436E-03         6.84381E-01         6.15613E-01         6.84397E-01         1.79468E+02         1.00000E+00         3.35487E-01         1.79470E+02         4.18229E+01         1.37647E+02
+          1.08925E-02         6.47697E-03        -4.66257E-03         6.84380E-01         6.26284E-01         6.84396E-01         1.72496E+02         1.00000E+00         3.29124E-01         1.72497E+02         4.17533E+01         1.30744E+02
+          1.08925E-02         6.64680E-03        -4.73258E-03         6.84380E-01         6.36955E-01         6.84396E-01         1.65746E+02         1.00000E+00         3.22895E-01         1.65747E+02         4.16363E+01         1.24110E+02
+          1.08925E-02         6.81662E-03        -4.80441E-03         6.84379E-01         6.47625E-01         6.84396E-01         1.59219E+02         1.00000E+00         3.16805E-01         1.59220E+02         4.14723E+01         1.17747E+02
+          1.08925E-02         6.98645E-03        -4.87805E-03         6.84378E-01         6.58296E-01         6.84395E-01         1.52917E+02         1.00000E+00         3.10854E-01         1.52918E+02         4.12621E+01         1.11655E+02
+          1.08925E-02         7.15628E-03        -4.95350E-03         6.84377E-01         6.68966E-01         6.84395E-01         1.46840E+02         1.00000E+00         3.05046E-01         1.46841E+02         4.10065E+01         1.05834E+02
+          1.08925E-02         7.32611E-03        -5.03077E-03         6.84376E-01         6.79637E-01         6.84395E-01         1.40988E+02         1.00000E+00         2.99383E-01         1.40988E+02         4.07063E+01         1.00282E+02
+          1.08925E-02         7.49593E-03        -5.10985E-03         6.84376E-01         6.90307E-01         6.84395E-01         1.35360E+02         1.00000E+00         2.93864E-01         1.35360E+02         4.03626E+01         9.49978E+01
+          1.08925E-02         7.66576E-03        -5.19074E-03         6.84375E-01         7.00978E-01         6.84394E-01         1.29955E+02         1.00000E+00         2.88493E-01         1.29955E+02         3.99765E+01         8.99786E+01
+          1.08925E-02         7.83559E-03        -5.27344E-03         6.84374E-01         7.11649E-01         6.84394E-01         1.24770E+02         1.00000E+00         2.83269E-01         1.24771E+02         3.95493E+01         8.52213E+01
+          1.08925E-02         8.00542E-03        -5.35795E-03         6.84373E-01         7.22319E-01         6.84394E-01         1.19804E+02         1.00000E+00         2.78192E-01         1.19804E+02         3.90823E+01         8.07220E+01
+          1.08925E-02         8.17524E-03        -5.44428E-03         6.84372E-01         7.32990E-01         6.84394E-01         1.15053E+02         1.00000E+00         2.73263E-01         1.15053E+02         3.85769E+01         7.64765E+01
+          1.08925E-02         8.34507E-03        -5.53242E-03         6.84371E-01         7.43660E-01         6.84393E-01         1.10514E+02         1.00000E+00         2.68481E-01         1.10514E+02         3.80347E+01         7.24796E+01
+          1.08925E-02         8.51490E-03        -5.62237E-03         6.84370E-01         7.54331E-01         6.84393E-01         1.06183E+02         1.00000E+00         2.63846E-01         1.06183E+02         3.74573E+01         6.87258E+01
+          1.08925E-02         8.68473E-03        -5.71413E-03         6.84369E-01         7.65001E-01         6.84393E-01         1.02056E+02         1.00000E+00         2.59357E-01         1.02056E+02         3.68463E+01         6.52093E+01
+          1.08925E-02         8.85455E-03        -5.80770E-03         6.84368E-01         7.75672E-01         6.84393E-01         9.81269E+01         1.00000E+00         2.55012E-01         9.81269E+01         3.62035E+01         6.19234E+01
+          1.08925E-02         9.02438E-03        -5.90309E-03         6.84367E-01         7.86343E-01         6.84392E-01         9.43922E+01         1.00000E+00         2.50811E-01         9.43921E+01         3.55308E+01         5.88613E+01
+          1.08925E-02         9.19421E-03        -6.00029E-03         6.84366E-01         7.97013E-01         6.84392E-01         9.08458E+01         1.00000E+00         2.46752E-01         9.08457E+01         3.48299E+01         5.60158E+01
+          1.08925E-02         9.36403E-03        -6.09930E-03         6.84365E-01         8.07684E-01         6.84392E-01         8.74822E+01         1.00000E+00         2.42833E-01         8.74820E+01         3.41027E+01         5.33792E+01
+          1.08925E-02         9.53386E-03        -6.20013E-03         6.84364E-01         8.18354E-01         6.84392E-01         8.42953E+01         1.00000E+00         2.39052E-01         8.42950E+01         3.33513E+01         5.09437E+01
+          1.08925E-02         9.70369E-03        -6.30276E-03         6.84363E-01         8.29025E-01         6.84392E-01         8.12790E+01         1.00000E+00         2.35407E-01         8.12787E+01         3.25776E+01         4.87011E+01
+          1.08925E-02         9.87352E-03        -6.40721E-03         6.84361E-01         8.39695E-01         6.84391E-01         7.84269E+01         1.00000E+00         2.31896E-01         7.84265E+01         3.17835E+01         4.66430E+01
+          1.08925E-02         1.00433E-02        -6.51347E-03         6.84360E-01         8.50366E-01         6.84391E-01         7.57325E+01         1.00000E+00         2.28516E-01         7.57320E+01         3.09712E+01         4.47608E+01
+          1.08925E-02         1.02132E-02        -6.62155E-03         6.84359E-01         8.61037E-01         6.84391E-01         7.31890E+01         1.00000E+00         2.25266E-01         7.31885E+01         3.01426E+01         4.30459E+01
+          1.08925E-02         1.03830E-02        -6.73143E-03         6.84358E-01         8.71707E-01         6.84391E-01         7.07897E+01         1.00000E+00         2.22143E-01         7.07891E+01         2.92997E+01         4.14894E+01
+          1.08925E-02         1.05528E-02        -6.84313E-03         6.84357E-01         8.82378E-01         6.84391E-01         6.85277E+01         1.00000E+00         2.19144E-01         6.85271E+01         2.84447E+01         4.00824E+01
+          1.08925E-02         1.07227E-02        -6.95664E-03         6.84355E-01         8.93048E-01         6.84391E-01         6.63962E+01         1.00000E+00         2.16266E-01         6.63955E+01         2.75795E+01         3.88160E+01
+          1.08925E-02         1.08925E-02        -7.07196E-03         6.84354E-01         9.03719E-01         6.84391E-01         6.43881E+01         1.00000E+00         2.13507E-01         6.43873E+01         2.67061E+01         3.76812E+01
+          1.08925E-02         1.10623E-02        -7.18910E-03         6.84353E-01         9.14389E-01         6.84391E-01         6.24966E+01         1.00000E+00         2.10865E-01         6.24958E+01         2.58266E+01         3.66692E+01
+          1.08925E-02         1.12321E-02        -7.30805E-03         6.84352E-01         9.25060E-01         6.84391E-01         6.07148E+01         1.00000E+00         2.08335E-01         6.07140E+01         2.49428E+01         3.57711E+01
+          1.08925E-02         1.14020E-02        -7.42881E-03         6.84350E-01         9.35731E-01         6.84391E-01         5.90359E+01         1.00000E+00         2.05916E-01         5.90350E+01         2.40568E+01         3.49782E+01
+          1.08925E-02         1.15718E-02        -7.55138E-03         6.84349E-01         9.46401E-01         6.84391E-01         5.74532E+01         1.00000E+00         2.03605E-01         5.74523E+01         2.31703E+01         3.42820E+01
+          1.08925E-02         1.17416E-02        -7.67576E-03         6.84348E-01         9.57072E-01         6.84391E-01         5.59600E+01         1.00000E+00         2.01399E-01         5.59591E+01         2.22853E+01         3.36738E+01
+          1.08925E-02         1.19114E-02        -7.80196E-03         6.84346E-01         9.67742E-01         6.84391E-01         5.45500E+01         1.00000E+00         1.99294E-01         5.45490E+01         2.14035E+01         3.31455E+01
+          1.08925E-02         1.20813E-02        -7.92997E-03         6.84345E-01         9.78413E-01         6.84391E-01         5.32167E+01         1.00000E+00         1.97289E-01         5.32157E+01         2.05267E+01         3.26891E+01
+          1.08925E-02         1.22511E-02        -8.05979E-03         6.84343E-01         9.89083E-01         6.84391E-01         5.19541E+01         1.00000E+00         1.95380E-01         5.19531E+01         1.96565E+01         3.22966E+01
+          1.08925E-02         1.24209E-02        -8.19143E-03         6.84342E-01         9.99754E-01         6.84391E-01         5.07561E+01         1.00000E+00         1.93565E-01         5.07551E+01         1.87946E+01         3.19605E+01
+          1.08925E-02         1.25908E-02        -8.32487E-03         6.84341E-01         1.01042E+00         6.84391E-01         4.96170E+01         1.00000E+00         1.91841E-01         4.96160E+01         1.79425E+01         3.16735E+01
+          1.08925E-02         1.27606E-02        -8.46013E-03         6.84339E-01         1.02110E+00         6.84391E-01         4.85314E+01         1.00000E+00         1.90204E-01         4.85303E+01         1.71017E+01         3.14286E+01
+          1.08925E-02         1.29304E-02        -8.59721E-03         6.84338E-01         1.03177E+00         6.84392E-01         4.74938E+01         1.00000E+00         1.88652E-01         4.74928E+01         1.62737E+01         3.12191E+01
+          1.08925E-02         1.31002E-02        -8.73609E-03         6.84336E-01         1.04244E+00         6.84392E-01         4.64993E+01         1.00000E+00         1.87181E-01         4.64982E+01         1.54597E+01         3.10385E+01
+          1.08925E-02         1.32701E-02        -8.87679E-03         6.84335E-01         1.05311E+00         6.84392E-01         4.55430E+01         1.00000E+00         1.85790E-01         4.55419E+01         1.46610E+01         3.08809E+01
+          1.08925E-02         1.34399E-02        -9.01930E-03         6.84333E-01         1.06378E+00         6.84392E-01         4.46204E+01         1.00000E+00         1.84475E-01         4.46193E+01         1.38788E+01         3.07405E+01
+          1.08925E-02         1.36097E-02        -9.16362E-03         6.84331E-01         1.07445E+00         6.84393E-01         4.37272E+01         1.00000E+00         1.83234E-01         4.37262E+01         1.31143E+01         3.06119E+01
+          1.08925E-02         1.37795E-02        -9.30975E-03         6.84330E-01         1.08512E+00         6.84393E-01         4.28596E+01         1.00000E+00         1.82062E-01         4.28585E+01         1.23683E+01         3.04902E+01
+          1.08925E-02         1.39494E-02        -9.45770E-03         6.84328E-01         1.09579E+00         6.84394E-01         4.20136E+01         1.00000E+00         1.80958E-01         4.20126E+01         1.16420E+01         3.03706E+01
+          1.08925E-02         1.41192E-02        -9.60746E-03         6.84327E-01         1.10646E+00         6.84394E-01         4.11860E+01         1.00000E+00         1.79919E-01         4.11850E+01         1.09360E+01         3.02490E+01
+          1.08925E-02         1.42890E-02        -9.75903E-03         6.84325E-01         1.11713E+00         6.84395E-01         4.03736E+01         1.00000E+00         1.78941E-01         4.03726E+01         1.02512E+01         3.01214E+01
+          1.08925E-02         1.44589E-02        -9.91242E-03         6.84323E-01         1.12780E+00         6.84395E-01         3.95735E+01         1.00000E+00         1.78022E-01         3.95725E+01         9.58834E+00         2.99842E+01
+          1.08925E-02         1.46287E-02        -1.00676E-02         6.84322E-01         1.13847E+00         6.84396E-01         3.87831E+01         1.00000E+00         1.77158E-01         3.87822E+01         8.94790E+00         2.98343E+01
+          1.08925E-02         1.47985E-02        -1.02246E-02         6.84320E-01         1.14914E+00         6.84396E-01         3.80002E+01         1.00000E+00         1.76347E-01         3.79993E+01         8.33045E+00         2.96688E+01
+          1.08925E-02         1.49683E-02        -1.03834E-02         6.84318E-01         1.15981E+00         6.84397E-01         3.72227E+01         1.00000E+00         1.75585E-01         3.72218E+01         7.73641E+00         2.94854E+01
+          1.08925E-02         1.51382E-02        -1.05441E-02         6.84316E-01         1.17048E+00         6.84398E-01         3.64488E+01         1.00000E+00         1.74871E-01         3.64480E+01         7.16614E+00         2.92818E+01
+          1.08925E-02         1.53080E-02        -1.07065E-02         6.84315E-01         1.18115E+00         6.84398E-01         3.56770E+01         1.00000E+00         1.74200E-01         3.56762E+01         6.61992E+00         2.90563E+01
+          1.08925E-02         1.54778E-02        -1.08708E-02         6.84313E-01         1.19182E+00         6.84399E-01         3.49062E+01         1.00000E+00         1.73570E-01         3.49054E+01         6.09794E+00         2.88075E+01
+          1.08925E-02         1.56476E-02        -1.10369E-02         6.84311E-01         1.20249E+00         6.84400E-01         3.41352E+01         1.00000E+00         1.72978E-01         3.41345E+01         5.60031E+00         2.85342E+01
+          1.08925E-02         1.58175E-02        -1.12048E-02         6.84309E-01         1.21317E+00         6.84401E-01         3.33634E+01         1.00000E+00         1.72422E-01         3.33627E+01         5.12709E+00         2.82356E+01
+          1.08925E-02         1.59873E-02        -1.13745E-02         6.84307E-01         1.22384E+00         6.84402E-01         3.25902E+01         1.00000E+00         1.71897E-01         3.25895E+01         4.67824E+00         2.79113E+01
+          1.08925E-02         1.61571E-02        -1.15460E-02         6.84305E-01         1.23451E+00         6.84403E-01         3.18152E+01         1.00000E+00         1.71402E-01         3.18146E+01         4.25367E+00         2.75609E+01
+          1.08925E-02         1.63270E-02        -1.17193E-02         6.84304E-01         1.24518E+00         6.84404E-01         3.10383E+01         1.00000E+00         1.70934E-01         3.10378E+01         3.85320E+00         2.71846E+01
+          1.08925E-02         1.64968E-02        -1.18944E-02         6.84302E-01         1.25585E+00         6.84405E-01         3.02597E+01         1.00000E+00         1.70489E-01         3.02592E+01         3.47663E+00         2.67825E+01
+          1.08925E-02         1.66666E-02        -1.20714E-02         6.84300E-01         1.26652E+00         6.84406E-01         2.94795E+01         1.00000E+00         1.70066E-01         2.94790E+01         3.12365E+00         2.63554E+01
+          1.08925E-02         1.68364E-02        -1.22501E-02         6.84298E-01         1.27719E+00         6.84407E-01         2.86981E+01         1.00000E+00         1.69661E-01         2.86977E+01         2.79392E+00         2.59038E+01
+          1.08925E-02         1.70063E-02        -1.24307E-02         6.84296E-01         1.28786E+00         6.84409E-01         2.79162E+01         1.00000E+00         1.69272E-01         2.79159E+01         2.48704E+00         2.54289E+01
+          1.08925E-02         1.71761E-02        -1.26131E-02         6.84294E-01         1.29853E+00         6.84410E-01         2.71345E+01         1.00000E+00         1.68896E-01         2.71342E+01         2.20256E+00         2.49316E+01
+          1.08925E-02         1.73459E-02        -1.27973E-02         6.84292E-01         1.30920E+00         6.84411E-01         2.63537E+01         1.00000E+00         1.68531E-01         2.63535E+01         1.93998E+00         2.44135E+01
+          1.08925E-02         1.75158E-02        -1.29833E-02         6.84290E-01         1.31987E+00         6.84413E-01         2.55748E+01         1.00000E+00         1.68174E-01         2.55746E+01         1.69875E+00         2.38759E+01
+          1.08925E-02         1.76856E-02        -1.31711E-02         6.84288E-01         1.33054E+00         6.84415E-01         2.47989E+01         1.00000E+00         1.67823E-01         2.47987E+01         1.47828E+00         2.33205E+01
+          1.08925E-02         1.78554E-02        -1.33608E-02         6.84286E-01         1.34121E+00         6.84416E-01         2.40270E+01         1.00000E+00         1.67476E-01         2.40270E+01         1.27797E+00         2.27490E+01
+          1.08925E-02         1.80252E-02        -1.35522E-02         6.84284E-01         1.35188E+00         6.84418E-01         2.32604E+01         1.00000E+00         1.67130E-01         2.32604E+01         1.09714E+00         2.21633E+01
+          1.08925E-02         1.81951E-02        -1.37455E-02         6.84282E-01         1.36255E+00         6.84420E-01         2.25004E+01         1.00000E+00         1.66783E-01         2.25004E+01         9.35119E-01         2.15653E+01
+          1.08925E-02         1.83649E-02        -1.39406E-02         6.84279E-01         1.37322E+00         6.84421E-01         2.17482E+01         1.00000E+00         1.66434E-01         2.17483E+01         7.91190E-01         2.09571E+01
+          1.08925E-02         1.85347E-02        -1.41375E-02         6.84277E-01         1.38389E+00         6.84423E-01         2.10051E+01         1.00000E+00         1.66080E-01         2.10053E+01         6.64617E-01         2.03406E+01
+          1.08925E-02         1.87045E-02        -1.43362E-02         6.84275E-01         1.39457E+00         6.84425E-01         2.02725E+01         1.00000E+00         1.65718E-01         2.02727E+01         5.54645E-01         1.97181E+01
+          1.08925E-02         1.88744E-02        -1.45367E-02         6.84273E-01         1.40524E+00         6.84427E-01         1.95519E+01         1.00000E+00         1.65348E-01         1.95521E+01         4.60502E-01         1.90916E+01
+          1.08925E-02         1.90442E-02        -1.47390E-02         6.84271E-01         1.41591E+00         6.84429E-01         1.88444E+01         1.00000E+00         1.64968E-01         1.88447E+01         3.81406E-01         1.84633E+01
+          1.08925E-02         1.92140E-02        -1.49432E-02         6.84268E-01         1.42658E+00         6.84432E-01         1.81514E+01         1.00000E+00         1.64575E-01         1.81518E+01         3.16561E-01         1.78352E+01
+          1.08925E-02         1.93839E-02        -1.51491E-02         6.84266E-01         1.43725E+00         6.84434E-01         1.74743E+01         1.00000E+00         1.64169E-01         1.74747E+01         2.65168E-01         1.72096E+01
+          1.08925E-02         1.95537E-02        -1.53569E-02         6.84264E-01         1.44792E+00         6.84436E-01         1.68144E+01         1.00000E+00         1.63748E-01         1.68148E+01         2.26424E-01         1.65884E+01
+          1.08925E-02         1.97235E-02        -1.55665E-02         6.84262E-01         1.45859E+00         6.84439E-01         1.61728E+01         1.00000E+00         1.63309E-01         1.61733E+01         1.99525E-01         1.59738E+01
+          1.08925E-02         1.98933E-02        -1.57779E-02         6.84259E-01         1.46926E+00         6.84441E-01         1.55508E+01         1.00000E+00         1.62853E-01         1.55513E+01         1.83669E-01         1.53676E+01
+          1.08925E-02         2.00632E-02        -1.59911E-02         6.84257E-01         1.47993E+00         6.84444E-01         1.49494E+01         1.00000E+00         1.62377E-01         1.49499E+01         1.78061E-01         1.47719E+01
+          1.08925E-02         2.02330E-02        -1.62061E-02         6.84255E-01         1.49060E+00         6.84447E-01         1.43697E+01         1.00000E+00         1.61881E-01         1.43703E+01         1.81914E-01         1.41884E+01
+          1.08925E-02         2.04028E-02        -1.64229E-02         6.84252E-01         1.50127E+00         6.84449E-01         1.38127E+01         1.00000E+00         1.61364E-01         1.38133E+01         1.94450E-01         1.36188E+01
+          1.08925E-02         2.05726E-02        -1.66416E-02         6.84250E-01         1.51194E+00         6.84452E-01         1.32792E+01         1.00000E+00         1.60823E-01         1.32798E+01         2.14904E-01         1.30649E+01
+          1.08925E-02         2.07425E-02        -1.68621E-02         6.84248E-01         1.52261E+00         6.84455E-01         1.27701E+01         1.00000E+00         1.60259E-01         1.27707E+01         2.42527E-01         1.25282E+01
+          1.08925E-02         2.09123E-02        -1.70843E-02         6.84245E-01         1.53328E+00         6.84458E-01         1.22860E+01         1.00000E+00         1.59671E-01         1.22867E+01         2.76586E-01         1.20101E+01
+          1.08925E-02         2.10821E-02        -1.73084E-02         6.84243E-01         1.54395E+00         6.84462E-01         1.18276E+01         1.00000E+00         1.59057E-01         1.18284E+01         3.16367E-01         1.15120E+01
+          1.08925E-02         2.12520E-02        -1.75343E-02         6.84240E-01         1.55462E+00         6.84465E-01         1.13955E+01         1.00000E+00         1.58418E-01         1.13962E+01         3.61178E-01         1.10350E+01
+          1.08925E-02         2.14218E-02        -1.77620E-02         6.84238E-01         1.56529E+00         6.84468E-01         1.09899E+01         1.00000E+00         1.57751E-01         1.09907E+01         4.10346E-01         1.05804E+01
+          1.08925E-02         2.15916E-02        -1.79916E-02         6.84235E-01         1.57596E+00         6.84472E-01         1.06113E+01         1.00000E+00         1.57058E-01         1.06121E+01         4.63225E-01         1.01489E+01
+          1.08925E-02         2.17614E-02        -1.82229E-02         6.84233E-01         1.58664E+00         6.84475E-01         1.02598E+01         1.00000E+00         1.56337E-01         1.02607E+01         5.19191E-01         9.74147E+00
+          1.08925E-02         2.19313E-02        -1.84561E-02         6.84230E-01         1.59731E+00         6.84479E-01         9.93566E+00         1.00000E+00         1.55588E-01         9.93648E+00         5.77650E-01         9.35884E+00
+          1.08925E-02         2.21011E-02        -1.86910E-02         6.84228E-01         1.60798E+00         6.84483E-01         9.63874E+00         1.00000E+00         1.54811E-01         9.63958E+00         6.38030E-01         9.00155E+00
+          1.08925E-02         2.22709E-02        -1.89278E-02         6.84225E-01         1.61865E+00         6.84487E-01         9.36902E+00         1.00000E+00         1.54005E-01         9.36986E+00         6.99790E-01         8.67007E+00
+          1.08925E-02         2.24407E-02        -1.91664E-02         6.84222E-01         1.62932E+00         6.84491E-01         9.12629E+00         1.00000E+00         1.53170E-01         9.12714E+00         7.62417E-01         8.36472E+00
+          1.08925E-02         2.26106E-02        -1.94068E-02         6.84220E-01         1.63999E+00         6.84495E-01         8.91027E+00         1.00000E+00         1.52306E-01         8.91112E+00         8.25427E-01         8.08569E+00
+          1.08925E-02         2.27804E-02        -1.96490E-02         6.84217E-01         1.65066E+00         6.84499E-01         8.72057E+00         1.00000E+00         1.51413E-01         8.72142E+00         8.88364E-01         7.83306E+00
+          1.08925E-02         2.29502E-02        -1.98931E-02         6.84215E-01         1.66133E+00         6.84504E-01         8.55673E+00         1.00000E+00         1.50490E-01         8.55758E+00         9.50803E-01         7.60677E+00
+          1.08925E-02         2.31201E-02        -2.01389E-02         6.84212E-01         1.67200E+00         6.84508E-01         8.41817E+00         1.00000E+00         1.49539E-01         8.41902E+00         1.01235E+00         7.40667E+00
+          1.08925E-02         2.32899E-02        -2.03866E-02         6.84209E-01         1.68267E+00         6.84513E-01         8.30426E+00         1.00000E+00         1.48558E-01         8.30510E+00         1.07263E+00         7.23246E+00
+          1.08925E-02         2.34597E-02        -2.06361E-02         6.84206E-01         1.69334E+00         6.84518E-01         8.21427E+00         1.00000E+00         1.47549E-01         8.21510E+00         1.13132E+00         7.08377E+00
+          1.08925E-02         2.36295E-02        -2.08873E-02         6.84204E-01         1.70401E+00         6.84522E-01         8.14739E+00         1.00000E+00         1.46511E-01         8.14821E+00         1.18811E+00         6.96009E+00
+          1.08925E-02         2.37994E-02        -2.11404E-02         6.84201E-01         1.71468E+00         6.84527E-01         8.10276E+00         1.00000E+00         1.45445E-01         8.10356E+00         1.24272E+00         6.86084E+00
+          1.08925E-02         2.39692E-02        -2.13954E-02         6.84198E-01         1.72535E+00         6.84533E-01         8.07944E+00         1.00000E+00         1.44350E-01         8.08022E+00         1.29489E+00         6.78532E+00
+          1.08925E-02         2.41390E-02        -2.16521E-02         6.84195E-01         1.73602E+00         6.84538E-01         8.07642E+00         1.00000E+00         1.43228E-01         8.07719E+00         1.34441E+00         6.73277E+00
+          1.08925E-02         2.43088E-02        -2.19106E-02         6.84193E-01         1.74669E+00         6.84543E-01         8.09268E+00         1.00000E+00         1.42079E-01         8.09342E+00         1.39109E+00         6.70233E+00
+          1.08925E-02         2.44787E-02        -2.21710E-02         6.84190E-01         1.75736E+00         6.84549E-01         8.12710E+00         1.00000E+00         1.40902E-01         8.12782E+00         1.43475E+00         6.69306E+00
+          1.08925E-02         2.46485E-02        -2.24332E-02         6.84187E-01         1.76804E+00         6.84555E-01         8.17855E+00         1.00000E+00         1.39699E-01         8.17924E+00         1.47526E+00         6.70398E+00
+          1.08925E-02         2.48183E-02        -2.26972E-02         6.84184E-01         1.77871E+00         6.84560E-01         8.24585E+00         1.00000E+00         1.38471E-01         8.24652E+00         1.51249E+00         6.73403E+00
+          1.08925E-02         2.49882E-02        -2.29630E-02         6.84181E-01         1.78938E+00         6.84566E-01         8.32781E+00         1.00000E+00         1.37217E-01         8.32846E+00         1.54636E+00         6.78210E+00
+          1.08925E-02         2.51580E-02        -2.32306E-02         6.84178E-01         1.80005E+00         6.84572E-01         8.42320E+00         1.00000E+00         1.35938E-01         8.42381E+00         1.57679E+00         6.84702E+00
+          1.08925E-02         2.53278E-02        -2.35000E-02         6.84175E-01         1.81072E+00         6.84579E-01         8.53077E+00         1.00000E+00         1.34635E-01         8.53135E+00         1.60374E+00         6.92761E+00
+          1.08925E-02         2.54976E-02        -2.37712E-02         6.84172E-01         1.82139E+00         6.84585E-01         8.64926E+00         1.00000E+00         1.33309E-01         8.64981E+00         1.62717E+00         7.02264E+00
+          1.08925E-02         2.56675E-02        -2.40443E-02         6.84169E-01         1.83206E+00         6.84592E-01         8.77742E+00         1.00000E+00         1.31960E-01         8.77794E+00         1.64709E+00         7.13085E+00
+          1.08925E-02         2.58373E-02        -2.43191E-02         6.84166E-01         1.84273E+00         6.84598E-01         8.91398E+00         1.00000E+00         1.30589E-01         8.91447E+00         1.66351E+00         7.25097E+00
+          1.08925E-02         2.60071E-02        -2.45958E-02         6.84163E-01         1.85340E+00         6.84605E-01         9.05770E+00         1.00000E+00         1.29197E-01         9.05815E+00         1.67644E+00         7.38171E+00
+          1.08925E-02         2.61769E-02        -2.48743E-02         6.84160E-01         1.86407E+00         6.84612E-01         9.20731E+00         1.00000E+00         1.27785E-01         9.20773E+00         1.68595E+00         7.52179E+00
+          1.10623E-02         8.72665E-04        -3.48576E-03         6.95065E-01         2.74155E-01         6.95074E-01         4.63453E+02         1.00000E+00         4.49227E-01         4.63455E+02         1.45264E+01         4.48929E+02
+          1.10623E-02         1.04249E-03        -3.49598E-03         6.95065E-01         2.84826E-01         6.95074E-01         4.54259E+02         1.00000E+00         4.43948E-01         4.54261E+02         1.53574E+01         4.38904E+02
+          1.10623E-02         1.21232E-03        -3.50801E-03         6.95065E-01         2.95496E-01         6.95074E-01         4.44905E+02         1.00000E+00         4.38558E-01         4.44907E+02         1.61932E+01         4.28714E+02
+          1.10623E-02         1.38215E-03        -3.52185E-03         6.95065E-01         3.06167E-01         6.95074E-01         4.35408E+02         1.00000E+00         4.33066E-01         4.35410E+02         1.70315E+01         4.18378E+02
+          1.10623E-02         1.55197E-03        -3.53750E-03         6.95065E-01         3.16838E-01         6.95074E-01         4.25786E+02         1.00000E+00         4.27481E-01         4.25788E+02         1.78697E+01         4.07918E+02
+          1.10623E-02         1.72180E-03        -3.55497E-03         6.95064E-01         3.27508E-01         6.95073E-01         4.16056E+02         1.00000E+00         4.21812E-01         4.16058E+02         1.87054E+01         3.97353E+02
+          1.10623E-02         1.89163E-03        -3.57425E-03         6.95064E-01         3.38179E-01         6.95073E-01         4.06237E+02         1.00000E+00         4.16068E-01         4.06239E+02         1.95362E+01         3.86703E+02
+          1.10623E-02         2.06146E-03        -3.59534E-03         6.95064E-01         3.48849E-01         6.95073E-01         3.96346E+02         1.00000E+00         4.10258E-01         3.96348E+02         2.03598E+01         3.75988E+02
+          1.10623E-02         2.23128E-03        -3.61824E-03         6.95064E-01         3.59520E-01         6.95073E-01         3.86400E+02         1.00000E+00         4.04390E-01         3.86402E+02         2.11738E+01         3.65228E+02
+          1.10623E-02         2.40111E-03        -3.64295E-03         6.95063E-01         3.70190E-01         6.95073E-01         3.76417E+02         1.00000E+00         3.98473E-01         3.76419E+02         2.19760E+01         3.54443E+02
+          1.10623E-02         2.57094E-03        -3.66948E-03         6.95063E-01         3.80861E-01         6.95073E-01         3.66413E+02         1.00000E+00         3.92515E-01         3.66415E+02         2.27639E+01         3.43651E+02
+          1.10623E-02         2.74077E-03        -3.69781E-03         6.95063E-01         3.91532E-01         6.95073E-01         3.56406E+02         1.00000E+00         3.86527E-01         3.56408E+02         2.35356E+01         3.32872E+02
+          1.10623E-02         2.91059E-03        -3.72796E-03         6.95062E-01         4.02202E-01         6.95072E-01         3.46411E+02         1.00000E+00         3.80515E-01         3.46413E+02         2.42888E+01         3.22124E+02
+          1.10623E-02         3.08042E-03        -3.75993E-03         6.95062E-01         4.12873E-01         6.95072E-01         3.36445E+02         1.00000E+00         3.74489E-01         3.36447E+02         2.50215E+01         3.11425E+02
+          1.10623E-02         3.25025E-03        -3.79370E-03         6.95062E-01         4.23543E-01         6.95072E-01         3.26523E+02         1.00000E+00         3.68456E-01         3.26525E+02         2.57317E+01         3.00793E+02
+          1.10623E-02         3.42008E-03        -3.82929E-03         6.95061E-01         4.34214E-01         6.95072E-01         3.16660E+02         1.00000E+00         3.62425E-01         3.16662E+02         2.64175E+01         2.90244E+02
+          1.10623E-02         3.58990E-03        -3.86668E-03         6.95061E-01         4.44884E-01         6.95072E-01         3.06871E+02         1.00000E+00         3.56404E-01         3.06872E+02         2.70772E+01         2.79795E+02
+          1.10623E-02         3.75973E-03        -3.90589E-03         6.95060E-01         4.55555E-01         6.95071E-01         2.97169E+02         1.00000E+00         3.50399E-01         2.97171E+02         2.77089E+01         2.69462E+02
+          1.10623E-02         3.92956E-03        -3.94692E-03         6.95060E-01         4.66225E-01         6.95071E-01         2.87569E+02         1.00000E+00         3.44420E-01         2.87571E+02         2.83111E+01         2.59260E+02
+          1.10623E-02         4.09939E-03        -3.98975E-03         6.95060E-01         4.76896E-01         6.95071E-01         2.78083E+02         1.00000E+00         3.38472E-01         2.78085E+02         2.88823E+01         2.49202E+02
+          1.10623E-02         4.26921E-03        -4.03440E-03         6.95059E-01         4.87567E-01         6.95071E-01         2.68724E+02         1.00000E+00         3.32564E-01         2.68725E+02         2.94211E+01         2.39304E+02
+          1.10623E-02         4.43904E-03        -4.08086E-03         6.95059E-01         4.98237E-01         6.95071E-01         2.59503E+02         1.00000E+00         3.26701E-01         2.59504E+02         2.99261E+01         2.29578E+02
+          1.10623E-02         4.60887E-03        -4.12913E-03         6.95058E-01         5.08908E-01         6.95070E-01         2.50431E+02         1.00000E+00         3.20890E-01         2.50433E+02         3.03961E+01         2.20036E+02
+          1.10623E-02         4.77869E-03        -4.17921E-03         6.95057E-01         5.19578E-01         6.95070E-01         2.41519E+02         1.00000E+00         3.15138E-01         2.41520E+02         3.08302E+01         2.10690E+02
+          1.10623E-02         4.94852E-03        -4.23111E-03         6.95057E-01         5.30249E-01         6.95070E-01         2.32776E+02         1.00000E+00         3.09449E-01         2.32777E+02         3.12272E+01         2.01550E+02
+          1.10623E-02         5.11835E-03        -4.28481E-03         6.95056E-01         5.40919E-01         6.95069E-01         2.24211E+02         1.00000E+00         3.03831E-01         2.24213E+02         3.15864E+01         1.92626E+02
+          1.10623E-02         5.28818E-03        -4.34033E-03         6.95056E-01         5.51590E-01         6.95069E-01         2.15833E+02         1.00000E+00         2.98287E-01         2.15835E+02         3.19071E+01         1.83927E+02
+          1.10623E-02         5.45800E-03        -4.39766E-03         6.95055E-01         5.62261E-01         6.95069E-01         2.07649E+02         1.00000E+00         2.92823E-01         2.07650E+02         3.21885E+01         1.75462E+02
+          1.10623E-02         5.62783E-03        -4.45681E-03         6.95054E-01         5.72931E-01         6.95069E-01         1.99666E+02         1.00000E+00         2.87444E-01         1.99667E+02         3.24304E+01         1.67237E+02
+          1.10623E-02         5.79766E-03        -4.51776E-03         6.95054E-01         5.83602E-01         6.95068E-01         1.91890E+02         1.00000E+00         2.82154E-01         1.91891E+02         3.26322E+01         1.59259E+02
+          1.10623E-02         5.96749E-03        -4.58053E-03         6.95053E-01         5.94272E-01         6.95068E-01         1.84326E+02         1.00000E+00         2.76956E-01         1.84327E+02         3.27937E+01         1.51533E+02
+          1.10623E-02         6.13731E-03        -4.64511E-03         6.95052E-01         6.04943E-01         6.95068E-01         1.76979E+02         1.00000E+00         2.71855E-01         1.76980E+02         3.29149E+01         1.44065E+02
+          1.10623E-02         6.30714E-03        -4.71150E-03         6.95052E-01         6.15613E-01         6.95068E-01         1.69853E+02         1.00000E+00         2.66853E-01         1.69854E+02         3.29956E+01         1.36858E+02
+          1.10623E-02         6.47697E-03        -4.77971E-03         6.95051E-01         6.26284E-01         6.95067E-01         1.62951E+02         1.00000E+00         2.61954E-01         1.62952E+02         3.30361E+01         1.29916E+02
+          1.10623E-02         6.64680E-03        -4.84972E-03         6.95050E-01         6.36955E-01         6.95067E-01         1.56276E+02         1.00000E+00         2.57160E-01         1.56277E+02         3.30364E+01         1.23240E+02
+          1.10623E-02         6.81662E-03        -4.92155E-03         6.95049E-01         6.47625E-01         6.95067E-01         1.49829E+02         1.00000E+00         2.52474E-01         1.49830E+02         3.29970E+01         1.16833E+02
+          1.10623E-02         6.98645E-03        -4.99519E-03         6.95048E-01         6.58296E-01         6.95066E-01         1.43612E+02         1.00000E+00         2.47897E-01         1.43613E+02         3.29183E+01         1.10694E+02
+          1.10623E-02         7.15628E-03        -5.07064E-03         6.95048E-01         6.68966E-01         6.95066E-01         1.37625E+02         1.00000E+00         2.43431E-01         1.37625E+02         3.28008E+01         1.04825E+02
+          1.10623E-02         7.32611E-03        -5.14791E-03         6.95047E-01         6.79637E-01         6.95066E-01         1.31868E+02         1.00000E+00         2.39078E-01         1.31868E+02         3.26452E+01         9.92231E+01
+          1.10623E-02         7.49593E-03        -5.22699E-03         6.95046E-01         6.90307E-01         6.95065E-01         1.26340E+02         1.00000E+00         2.34838E-01         1.26340E+02         3.24522E+01         9.38882E+01
+          1.10623E-02         7.66576E-03        -5.30787E-03         6.95045E-01         7.00978E-01         6.95065E-01         1.21040E+02         1.00000E+00         2.30713E-01         1.21040E+02         3.22227E+01         8.88178E+01
+          1.10623E-02         7.83559E-03        -5.39058E-03         6.95044E-01         7.11649E-01         6.95065E-01         1.15966E+02         1.00000E+00         2.26703E-01         1.15966E+02         3.19575E+01         8.40089E+01
+          1.10623E-02         8.00542E-03        -5.47509E-03         6.95043E-01         7.22319E-01         6.95065E-01         1.11116E+02         1.00000E+00         2.22807E-01         1.11116E+02         3.16577E+01         7.94582E+01
+          1.10623E-02         8.17524E-03        -5.56142E-03         6.95042E-01         7.32990E-01         6.95064E-01         1.06486E+02         1.00000E+00         2.19027E-01         1.06486E+02         3.13244E+01         7.51615E+01
+          1.10623E-02         8.34507E-03        -5.64955E-03         6.95041E-01         7.43660E-01         6.95064E-01         1.02073E+02         1.00000E+00         2.15361E-01         1.02073E+02         3.09588E+01         7.11141E+01
+          1.10623E-02         8.51490E-03        -5.73950E-03         6.95040E-01         7.54331E-01         6.95064E-01         9.78729E+01         1.00000E+00         2.11810E-01         9.78730E+01         3.05621E+01         6.73109E+01
+          1.10623E-02         8.68473E-03        -5.83127E-03         6.95039E-01         7.65001E-01         6.95064E-01         9.38817E+01         1.00000E+00         2.08373E-01         9.38818E+01         3.01356E+01         6.37462E+01
+          1.10623E-02         8.85455E-03        -5.92484E-03         6.95038E-01         7.75672E-01         6.95063E-01         9.00945E+01         1.00000E+00         2.05048E-01         9.00945E+01         2.96806E+01         6.04139E+01
+          1.10623E-02         9.02438E-03        -6.02023E-03         6.95037E-01         7.86343E-01         6.95063E-01         8.65059E+01         1.00000E+00         2.01835E-01         8.65059E+01         2.91987E+01         5.73073E+01
+          1.10623E-02         9.19421E-03        -6.11743E-03         6.95036E-01         7.97013E-01         6.95063E-01         8.31107E+01         1.00000E+00         1.98733E-01         8.31106E+01         2.86912E+01         5.44194E+01
+          1.10623E-02         9.36403E-03        -6.21644E-03         6.95035E-01         8.07684E-01         6.95063E-01         7.99028E+01         1.00000E+00         1.95740E-01         7.99027E+01         2.81596E+01         5.17431E+01
+          1.10623E-02         9.53386E-03        -6.31726E-03         6.95034E-01         8.18354E-01         6.95062E-01         7.68762E+01         1.00000E+00         1.92855E-01         7.68761E+01         2.76056E+01         4.92705E+01
+          1.10623E-02         9.70369E-03        -6.41990E-03         6.95033E-01         8.29025E-01         6.95062E-01         7.40247E+01         1.00000E+00         1.90076E-01         7.40245E+01         2.70307E+01         4.69938E+01
+          1.10623E-02         9.87352E-03        -6.52435E-03         6.95031E-01         8.39695E-01         6.95062E-01         7.13415E+01         1.00000E+00         1.87401E-01         7.13413E+01         2.64364E+01         4.49049E+01
+          1.10623E-02         1.00433E-02        -6.63061E-03         6.95030E-01         8.50366E-01         6.95062E-01         6.88200E+01         1.00000E+00         1.84829E-01         6.88198E+01         2.58245E+01         4.29952E+01
+          1.10623E-02         1.02132E-02        -6.73868E-03         6.95029E-01         8.61037E-01         6.95062E-01         6.64534E+01         1.00000E+00         1.82358E-01         6.64531E+01         2.51966E+01         4.12565E+01
+          1.10623E-02         1.03830E-02        -6.84857E-03         6.95028E-01         8.71707E-01         6.95062E-01         6.42345E+01         1.00000E+00         1.79986E-01         6.42341E+01         2.45543E+01         3.96799E+01
+          1.10623E-02         1.05528E-02        -6.96027E-03         6.95027E-01         8.82378E-01         6.95062E-01         6.21563E+01         1.00000E+00         1.77710E-01         6.21559E+01         2.38992E+01         3.82567E+01
+          1.10623E-02         1.07227E-02        -7.07378E-03         6.95025E-01         8.93048E-01         6.95061E-01         6.02116E+01         1.00000E+00         1.75529E-01         6.02112E+01         2.32331E+01         3.69781E+01
+          1.10623E-02         1.08925E-02        -7.18910E-03         6.95024E-01         9.03719E-01         6.95061E-01         5.83933E+01         1.00000E+00         1.73441E-01         5.83928E+01         2.25576E+01         3.58352E+01
+          1.10623E-02         1.10623E-02        -7.30623E-03         6.95023E-01         9.14389E-01         6.95061E-01         5.66941E+01         1.00000E+00         1.71443E-01         5.66936E+01         2.18742E+01         3.48194E+01
+          1.10623E-02         1.12321E-02        -7.42518E-03         6.95022E-01         9.25060E-01         6.95061E-01         5.51069E+01         1.00000E+00         1.69534E-01         5.51064E+01         2.11847E+01         3.39217E+01
+          1.10623E-02         1.14020E-02        -7.54594E-03         6.95020E-01         9.35731E-01         6.95061E-01         5.36246E+01         1.00000E+00         1.67711E-01         5.36241E+01         2.04906E+01         3.31335E+01
+          1.10623E-02         1.15718E-02        -7.66851E-03         6.95019E-01         9.46401E-01         6.95061E-01         5.22402E+01         1.00000E+00         1.65972E-01         5.22396E+01         1.97934E+01         3.24462E+01
+          1.10623E-02         1.17416E-02        -7.79290E-03         6.95017E-01         9.57072E-01         6.95061E-01         5.09467E+01         1.00000E+00         1.64315E-01         5.09461E+01         1.90948E+01         3.18513E+01
+          1.10623E-02         1.19114E-02        -7.91910E-03         6.95016E-01         9.67742E-01         6.95061E-01         4.97373E+01         1.00000E+00         1.62737E-01         4.97367E+01         1.83962E+01         3.13405E+01
+          1.10623E-02         1.20813E-02        -8.04710E-03         6.95015E-01         9.78413E-01         6.95061E-01         4.86054E+01         1.00000E+00         1.61236E-01         4.86048E+01         1.76990E+01         3.09057E+01
+          1.10623E-02         1.22511E-02        -8.17693E-03         6.95013E-01         9.89083E-01         6.95061E-01         4.75445E+01         1.00000E+00         1.59810E-01         4.75438E+01         1.70048E+01         3.05390E+01
+          1.10623E-02         1.24209E-02        -8.30856E-03         6.95012E-01         9.99754E-01         6.95061E-01         4.65483E+01         1.00000E+00         1.58457E-01         4.65476E+01         1.63148E+01         3.02328E+01
+          1.10623E-02         1.25908E-02        -8.44201E-03         6.95010E-01         1.01042E+00         6.95062E-01         4.56106E+01         1.00000E+00         1.57175E-01         4.56099E+01         1.56304E+01         2.99795E+01
+          1.10623E-02         1.27606E-02        -8.57727E-03         6.95009E-01         1.02110E+00         6.95062E-01         4.47257E+01         1.00000E+00         1.55961E-01         4.47250E+01         1.49529E+01         2.97721E+01
+          1.10623E-02         1.29304E-02        -8.71434E-03         6.95007E-01         1.03177E+00         6.95062E-01         4.38878E+01         1.00000E+00         1.54812E-01         4.38871E+01         1.42834E+01         2.96037E+01
+          1.10623E-02         1.31002E-02        -8.85322E-03         6.95006E-01         1.04244E+00         6.95062E-01         4.30916E+01         1.00000E+00         1.53728E-01         4.30908E+01         1.36231E+01         2.94677E+01
+          1.10623E-02         1.32701E-02        -8.99392E-03         6.95004E-01         1.05311E+00         6.95062E-01         4.23318E+01         1.00000E+00         1.52704E-01         4.23311E+01         1.29732E+01         2.93579E+01
+          1.10623E-02         1.34399E-02        -9.13643E-03         6.95003E-01         1.06378E+00         6.95063E-01         4.16037E+01         1.00000E+00         1.51740E-01         4.16030E+01         1.23347E+01         2.92684E+01
+          1.10623E-02         1.36097E-02        -9.28075E-03         6.95001E-01         1.07445E+00         6.95063E-01         4.09027E+01         1.00000E+00         1.50832E-01         4.09020E+01         1.17085E+01         2.91935E+01
+          1.10623E-02         1.37795E-02        -9.42688E-03         6.94999E-01         1.08512E+00         6.95063E-01         4.02243E+01         1.00000E+00         1.49979E-01         4.02236E+01         1.10955E+01         2.91281E+01
+          1.10623E-02         1.39494E-02        -9.57483E-03         6.94998E-01         1.09579E+00         6.95064E-01         3.95646E+01         1.00000E+00         1.49178E-01         3.95639E+01         1.04966E+01         2.90673E+01
+          1.10623E-02         1.41192E-02        -9.72459E-03         6.94996E-01         1.10646E+00         6.95064E-01         3.89199E+01         1.00000E+00         1.48426E-01         3.89192E+01         9.91261E+00         2.90066E+01
+          1.10623E-02         1.42890E-02        -9.87616E-03         6.94994E-01         1.11713E+00         6.95065E-01         3.82866E+01         1.00000E+00         1.47723E-01         3.82859E+01         9.34418E+00         2.89417E+01
+          1.10623E-02         1.44589E-02        -1.00295E-02         6.94993E-01         1.12780E+00         6.95065E-01         3.76616E+01         1.00000E+00         1.47064E-01         3.76609E+01         8.79196E+00         2.88690E+01
+          1.10623E-02         1.46287E-02        -1.01847E-02         6.94991E-01         1.13847E+00         6.95066E-01         3.70420E+01         1.00000E+00         1.46447E-01         3.70414E+01         8.25654E+00         2.87848E+01
+          1.10623E-02         1.47985E-02        -1.03418E-02         6.94989E-01         1.14914E+00         6.95066E-01         3.64253E+01         1.00000E+00         1.45872E-01         3.64247E+01         7.73842E+00         2.86863E+01
+          1.10623E-02         1.49683E-02        -1.05006E-02         6.94988E-01         1.15981E+00         6.95067E-01         3.58092E+01         1.00000E+00         1.45334E-01         3.58085E+01         7.23804E+00         2.85705E+01
+          1.10623E-02         1.51382E-02        -1.06612E-02         6.94986E-01         1.17048E+00         6.95067E-01         3.51915E+01         1.00000E+00         1.44832E-01         3.51910E+01         6.75579E+00         2.84352E+01
+          1.10623E-02         1.53080E-02        -1.08237E-02         6.94984E-01         1.18115E+00         6.95068E-01         3.45707E+01         1.00000E+00         1.44364E-01         3.45702E+01         6.29196E+00         2.82782E+01
+          1.10623E-02         1.54778E-02        -1.09879E-02         6.94982E-01         1.19182E+00         6.95069E-01         3.39453E+01         1.00000E+00         1.43926E-01         3.39447E+01         5.84681E+00         2.80979E+01
+          1.10623E-02         1.56476E-02        -1.11540E-02         6.94980E-01         1.20249E+00         6.95070E-01         3.33139E+01         1.00000E+00         1.43518E-01         3.33134E+01         5.42053E+00         2.78929E+01
+          1.10623E-02         1.58175E-02        -1.13219E-02         6.94978E-01         1.21317E+00         6.95071E-01         3.26758E+01         1.00000E+00         1.43136E-01         3.26753E+01         5.01323E+00         2.76620E+01
+          1.10623E-02         1.59873E-02        -1.14916E-02         6.94977E-01         1.22384E+00         6.95072E-01         3.20301E+01         1.00000E+00         1.42778E-01         3.20296E+01         4.62497E+00         2.74046E+01
+          1.10623E-02         1.61571E-02        -1.16631E-02         6.94975E-01         1.23451E+00         6.95073E-01         3.13764E+01         1.00000E+00         1.42443E-01         3.13760E+01         4.25578E+00         2.71202E+01
+          1.10623E-02         1.63270E-02        -1.18364E-02         6.94973E-01         1.24518E+00         6.95074E-01         3.07144E+01         1.00000E+00         1.42127E-01         3.07140E+01         3.90559E+00         2.68085E+01
+          1.10623E-02         1.64968E-02        -1.20116E-02         6.94971E-01         1.25585E+00         6.95075E-01         3.00442E+01         1.00000E+00         1.41829E-01         3.00438E+01         3.57430E+00         2.64695E+01
+          1.10623E-02         1.66666E-02        -1.21885E-02         6.94969E-01         1.26652E+00         6.95076E-01         2.93658E+01         1.00000E+00         1.41546E-01         2.93655E+01         3.26177E+00         2.61037E+01
+          1.10623E-02         1.68364E-02        -1.23673E-02         6.94967E-01         1.27719E+00         6.95077E-01         2.86797E+01         1.00000E+00         1.41277E-01         2.86794E+01         2.96778E+00         2.57116E+01
+          1.10623E-02         1.70063E-02        -1.25478E-02         6.94965E-01         1.28786E+00         6.95078E-01         2.79862E+01         1.00000E+00         1.41019E-01         2.79859E+01         2.69209E+00         2.52938E+01
+          1.10623E-02         1.71761E-02        -1.27302E-02         6.94963E-01         1.29853E+00         6.95079E-01         2.72861E+01         1.00000E+00         1.40770E-01         2.72859E+01         2.43440E+00         2.48515E+01
+          1.10623E-02         1.73459E-02        -1.29144E-02         6.94961E-01         1.30920E+00         6.95081E-01         2.65803E+01         1.00000E+00         1.40529E-01         2.65801E+01         2.19438E+00         2.43857E+01
+          1.10623E-02         1.75158E-02        -1.31004E-02         6.94959E-01         1.31987E+00         6.95082E-01         2.58696E+01         1.00000E+00         1.40293E-01         2.58694E+01         1.97166E+00         2.38978E+01
+          1.10623E-02         1.76856E-02        -1.32883E-02         6.94957E-01         1.33054E+00         6.95084E-01         2.51551E+01         1.00000E+00         1.40061E-01         2.51550E+01         1.76583E+00         2.33892E+01
+          1.10623E-02         1.78554E-02        -1.34779E-02         6.94955E-01         1.34121E+00         6.95085E-01         2.44381E+01         1.00000E+00         1.39830E-01         2.44380E+01         1.57645E+00         2.28616E+01
+          1.10623E-02         1.80252E-02        -1.36694E-02         6.94952E-01         1.35188E+00         6.95087E-01         2.37197E+01         1.00000E+00         1.39599E-01         2.37197E+01         1.40304E+00         2.23166E+01
+          1.10623E-02         1.81951E-02        -1.38626E-02         6.94950E-01         1.36255E+00         6.95089E-01         2.30014E+01         1.00000E+00         1.39367E-01         2.30013E+01         1.24511E+00         2.17562E+01
+          1.10623E-02         1.83649E-02        -1.40577E-02         6.94948E-01         1.37322E+00         6.95090E-01         2.22844E+01         1.00000E+00         1.39131E-01         2.22844E+01         1.10214E+00         2.11823E+01
+          1.10623E-02         1.85347E-02        -1.42546E-02         6.94946E-01         1.38389E+00         6.95092E-01         2.15703E+01         1.00000E+00         1.38890E-01         2.15704E+01         9.73571E-01         2.05968E+01
+          1.10623E-02         1.87045E-02        -1.44533E-02         6.94944E-01         1.39457E+00         6.95094E-01         2.08605E+01         1.00000E+00         1.38642E-01         2.08606E+01         8.58848E-01         2.00018E+01
+          1.10623E-02         1.88744E-02        -1.46538E-02         6.94942E-01         1.40524E+00         6.95096E-01         2.01566E+01         1.00000E+00         1.38387E-01         2.01568E+01         7.57387E-01         1.93994E+01
+          1.10623E-02         1.90442E-02        -1.48561E-02         6.94939E-01         1.41591E+00         6.95098E-01         1.94601E+01         1.00000E+00         1.38121E-01         1.94603E+01         6.68596E-01         1.87917E+01
+          1.10623E-02         1.92140E-02        -1.50603E-02         6.94937E-01         1.42658E+00         6.95100E-01         1.87725E+01         1.00000E+00         1.37845E-01         1.87727E+01         5.91868E-01         1.81808E+01
+          1.10623E-02         1.93839E-02        -1.52662E-02         6.94935E-01         1.43725E+00         6.95102E-01         1.80953E+01         1.00000E+00         1.37557E-01         1.80955E+01         5.26591E-01         1.75689E+01
+          1.10623E-02         1.95537E-02        -1.54740E-02         6.94932E-01         1.44792E+00         6.95105E-01         1.74299E+01         1.00000E+00         1.37256E-01         1.74302E+01         4.72145E-01         1.69581E+01
+          1.10623E-02         1.97235E-02        -1.56836E-02         6.94930E-01         1.45859E+00         6.95107E-01         1.67779E+01         1.00000E+00         1.36940E-01         1.67782E+01         4.27909E-01         1.63503E+01
+          1.10623E-02         1.98933E-02        -1.58950E-02         6.94928E-01         1.46926E+00         6.95110E-01         1.61407E+01         1.00000E+00         1.36609E-01         1.61410E+01         3.93258E-01         1.57477E+01
+          1.10623E-02         2.00632E-02        -1.61082E-02         6.94925E-01         1.47993E+00         6.95112E-01         1.55195E+01         1.00000E+00         1.36261E-01         1.55199E+01         3.67570E-01         1.51523E+01
+          1.10623E-02         2.02330E-02        -1.63232E-02         6.94923E-01         1.49060E+00         6.95115E-01         1.49158E+01         1.00000E+00         1.35896E-01         1.49161E+01         3.50227E-01         1.45659E+01
+          1.10623E-02         2.04028E-02        -1.65401E-02         6.94921E-01         1.50127E+00         6.95117E-01         1.43306E+01         1.00000E+00         1.35512E-01         1.43310E+01         3.40615E-01         1.39904E+01
+          1.10623E-02         2.05726E-02        -1.67587E-02         6.94918E-01         1.51194E+00         6.95120E-01         1.37653E+01         1.00000E+00         1.35109E-01         1.37657E+01         3.38129E-01         1.34276E+01
+          1.10623E-02         2.07425E-02        -1.69792E-02         6.94916E-01         1.52261E+00         6.95123E-01         1.32208E+01         1.00000E+00         1.34686E-01         1.32212E+01         3.42173E-01         1.28790E+01
+          1.10623E-02         2.09123E-02        -1.72014E-02         6.94913E-01         1.53328E+00         6.95126E-01         1.26981E+01         1.00000E+00         1.34242E-01         1.26986E+01         3.52160E-01         1.23464E+01
+          1.10623E-02         2.10821E-02        -1.74255E-02         6.94911E-01         1.54395E+00         6.95129E-01         1.21982E+01         1.00000E+00         1.33777E-01         1.21987E+01         3.67520E-01         1.18311E+01
+          1.10623E-02         2.12520E-02        -1.76514E-02         6.94908E-01         1.55462E+00         6.95133E-01         1.17217E+01         1.00000E+00         1.33289E-01         1.17223E+01         3.87692E-01         1.13346E+01
+          1.10623E-02         2.14218E-02        -1.78791E-02         6.94906E-01         1.56529E+00         6.95136E-01         1.12696E+01         1.00000E+00         1.32780E-01         1.12701E+01         4.12135E-01         1.08580E+01
+          1.10623E-02         2.15916E-02        -1.81087E-02         6.94903E-01         1.57596E+00         6.95139E-01         1.08422E+01         1.00000E+00         1.32247E-01         1.08428E+01         4.40322E-01         1.04024E+01
+          1.10623E-02         2.17614E-02        -1.83400E-02         6.94901E-01         1.58664E+00         6.95143E-01         1.04402E+01         1.00000E+00         1.31691E-01         1.04408E+01         4.71746E-01         9.96901E+00
+          1.10623E-02         2.19313E-02        -1.85732E-02         6.94898E-01         1.59731E+00         6.95146E-01         1.00639E+01         1.00000E+00         1.31112E-01         1.00645E+01         5.05918E-01         9.55855E+00
+          1.10623E-02         2.21011E-02        -1.88081E-02         6.94896E-01         1.60798E+00         6.95150E-01         9.71360E+00         1.00000E+00         1.30508E-01         9.71418E+00         5.42368E-01         9.17181E+00
+          1.10623E-02         2.22709E-02        -1.90449E-02         6.94893E-01         1.61865E+00         6.95154E-01         9.38949E+00         1.00000E+00         1.29880E-01         9.39007E+00         5.80649E-01         8.80942E+00
+          1.10623E-02         2.24407E-02        -1.92835E-02         6.94890E-01         1.62932E+00         6.95158E-01         9.09164E+00         1.00000E+00         1.29228E-01         9.09223E+00         6.20332E-01         8.47190E+00
+          1.10623E-02         2.26106E-02        -1.95239E-02         6.94888E-01         1.63999E+00         6.95162E-01         8.82002E+00         1.00000E+00         1.28551E-01         8.82062E+00         6.61014E-01         8.15960E+00
+          1.10623E-02         2.27804E-02        -1.97661E-02         6.94885E-01         1.65066E+00         6.95166E-01         8.57452E+00         1.00000E+00         1.27849E-01         8.57511E+00         7.02311E-01         7.87280E+00
+          1.10623E-02         2.29502E-02        -2.00102E-02         6.94882E-01         1.66133E+00         6.95170E-01         8.35489E+00         1.00000E+00         1.27122E-01         8.35548E+00         7.43863E-01         7.61162E+00
+          1.10623E-02         2.31201E-02        -2.02560E-02         6.94880E-01         1.67200E+00         6.95175E-01         8.16082E+00         1.00000E+00         1.26371E-01         8.16141E+00         7.85333E-01         7.37608E+00
+          1.10623E-02         2.32899E-02        -2.05037E-02         6.94877E-01         1.68267E+00         6.95179E-01         7.99189E+00         1.00000E+00         1.25595E-01         7.99248E+00         8.26407E-01         7.16607E+00
+          1.10623E-02         2.34597E-02        -2.07532E-02         6.94874E-01         1.69334E+00         6.95184E-01         7.84759E+00         1.00000E+00         1.24795E-01         7.84817E+00         8.66792E-01         6.98138E+00
+          1.10623E-02         2.36295E-02        -2.10045E-02         6.94871E-01         1.70401E+00         6.95189E-01         7.72734E+00         1.00000E+00         1.23970E-01         7.72791E+00         9.06221E-01         6.82169E+00
+          1.10623E-02         2.37994E-02        -2.12576E-02         6.94868E-01         1.71468E+00         6.95194E-01         7.63045E+00         1.00000E+00         1.23121E-01         7.63102E+00         9.44448E-01         6.68657E+00
+          1.10623E-02         2.39692E-02        -2.15125E-02         6.94866E-01         1.72535E+00         6.95199E-01         7.55619E+00         1.00000E+00         1.22248E-01         7.55675E+00         9.81249E-01         6.57550E+00
+          1.10623E-02         2.41390E-02        -2.17692E-02         6.94863E-01         1.73602E+00         6.95204E-01         7.50374E+00         1.00000E+00         1.21351E-01         7.50428E+00         1.01642E+00         6.48786E+00
+          1.10623E-02         2.43088E-02        -2.20277E-02         6.94860E-01         1.74669E+00         6.95209E-01         7.47220E+00         1.00000E+00         1.20431E-01         7.47273E+00         1.04979E+00         6.42294E+00
+          1.10623E-02         2.44787E-02        -2.22881E-02         6.94857E-01         1.75736E+00         6.95214E-01         7.46064E+00         1.00000E+00         1.19487E-01         7.46115E+00         1.08120E+00         6.37996E+00
+          1.10623E-02         2.46485E-02        -2.25503E-02         6.94854E-01         1.76804E+00         6.95220E-01         7.46805E+00         1.00000E+00         1.18521E-01         7.46855E+00         1.11050E+00         6.35805E+00
+          1.10623E-02         2.48183E-02        -2.28143E-02         6.94851E-01         1.77871E+00         6.95226E-01         7.49340E+00         1.00000E+00         1.17532E-01         7.49388E+00         1.13758E+00         6.35630E+00
+          1.10623E-02         2.49882E-02        -2.30801E-02         6.94848E-01         1.78938E+00         6.95232E-01         7.53558E+00         1.00000E+00         1.16521E-01         7.53605E+00         1.16235E+00         6.37370E+00
+          1.10623E-02         2.51580E-02        -2.33477E-02         6.94845E-01         1.80005E+00         6.95238E-01         7.59348E+00         1.00000E+00         1.15489E-01         7.59393E+00         1.18471E+00         6.40922E+00
+          1.10623E-02         2.53278E-02        -2.36171E-02         6.94842E-01         1.81072E+00         6.95244E-01         7.66595E+00         1.00000E+00         1.14436E-01         7.66637E+00         1.20462E+00         6.46175E+00
+          1.10623E-02         2.54976E-02        -2.38883E-02         6.94839E-01         1.82139E+00         6.95250E-01         7.75179E+00         1.00000E+00         1.13363E-01         7.75219E+00         1.22203E+00         6.53016E+00
+          1.10623E-02         2.56675E-02        -2.41614E-02         6.94836E-01         1.83206E+00         6.95256E-01         7.84981E+00         1.00000E+00         1.12269E-01         7.85019E+00         1.23691E+00         6.61328E+00
+          1.10623E-02         2.58373E-02        -2.44363E-02         6.94833E-01         1.84273E+00         6.95263E-01         7.95880E+00         1.00000E+00         1.11157E-01         7.95916E+00         1.24924E+00         6.70991E+00
+          1.10623E-02         2.60071E-02        -2.47129E-02         6.94830E-01         1.85340E+00         6.95270E-01         8.07754E+00         1.00000E+00         1.10025E-01         8.07788E+00         1.25904E+00         6.81884E+00
+          1.10623E-02         2.61769E-02        -2.49914E-02         6.94827E-01         1.86407E+00         6.95276E-01         8.20481E+00         1.00000E+00         1.08876E-01         8.20513E+00         1.26631E+00         6.93882E+00
+          1.12321E-02         8.72665E-04        -3.60472E-03         7.05736E-01         2.74155E-01         7.05745E-01         4.55325E+02         1.00000E+00         3.52196E-01         4.55327E+02         1.05124E+01         4.44814E+02
+          1.12321E-02         1.04249E-03        -3.61493E-03         7.05736E-01         2.84826E-01         7.05745E-01         4.46133E+02         1.00000E+00         3.48124E-01         4.46135E+02         1.11928E+01         4.34942E+02
+          1.12321E-02         1.21232E-03        -3.62696E-03         7.05735E-01         2.95496E-01         7.05745E-01         4.36781E+02         1.00000E+00         3.43967E-01         4.36782E+02         1.18781E+01         4.24904E+02
+          1.12321E-02         1.38215E-03        -3.64080E-03         7.05735E-01         3.06167E-01         7.05745E-01         4.27285E+02         1.00000E+00         3.39732E-01         4.27286E+02         1.25662E+01         4.14720E+02
+          1.12321E-02         1.55197E-03        -3.65646E-03         7.05735E-01         3.16838E-01         7.05745E-01         4.17664E+02         1.00000E+00         3.35426E-01         4.17665E+02         1.32553E+01         4.04410E+02
+          1.12321E-02         1.72180E-03        -3.67392E-03         7.05735E-01         3.27508E-01         7.05744E-01         4.07935E+02         1.00000E+00         3.31055E-01         4.07936E+02         1.39434E+01         3.93993E+02
+          1.12321E-02         1.89163E-03        -3.69320E-03         7.05735E-01         3.38179E-01         7.05744E-01         3.98116E+02         1.00000E+00         3.26627E-01         3.98117E+02         1.46287E+01         3.83489E+02
+          1.12321E-02         2.06146E-03        -3.71429E-03         7.05734E-01         3.48849E-01         7.05744E-01         3.88225E+02         1.00000E+00         3.22148E-01         3.88227E+02         1.53092E+01         3.72917E+02
+          1.12321E-02         2.23128E-03        -3.73719E-03         7.05734E-01         3.59520E-01         7.05744E-01         3.78280E+02         1.00000E+00         3.17624E-01         3.78281E+02         1.59831E+01         3.62298E+02
+          1.12321E-02         2.40111E-03        -3.76191E-03         7.05734E-01         3.70190E-01         7.05744E-01         3.68297E+02         1.00000E+00         3.13064E-01         3.68298E+02         1.66486E+01         3.51649E+02
+          1.12321E-02         2.57094E-03        -3.78843E-03         7.05734E-01         3.80861E-01         7.05744E-01         3.58293E+02         1.00000E+00         3.08473E-01         3.58295E+02         1.73038E+01         3.40991E+02
+          1.12321E-02         2.74077E-03        -3.81677E-03         7.05733E-01         3.91532E-01         7.05744E-01         3.48286E+02         1.00000E+00         3.03858E-01         3.48288E+02         1.79471E+01         3.30340E+02
+          1.12321E-02         2.91059E-03        -3.84692E-03         7.05733E-01         4.02202E-01         7.05743E-01         3.38292E+02         1.00000E+00         2.99226E-01         3.38293E+02         1.85766E+01         3.19717E+02
+          1.12321E-02         3.08042E-03        -3.87888E-03         7.05733E-01         4.12873E-01         7.05743E-01         3.28327E+02         1.00000E+00         2.94584E-01         3.28328E+02         1.91909E+01         3.09137E+02
+          1.12321E-02         3.25025E-03        -3.91265E-03         7.05732E-01         4.23543E-01         7.05743E-01         3.18406E+02         1.00000E+00         2.89937E-01         3.18407E+02         1.97882E+01         2.98618E+02
+          1.12321E-02         3.42008E-03        -3.94824E-03         7.05732E-01         4.34214E-01         7.05743E-01         3.08544E+02         1.00000E+00         2.85292E-01         3.08545E+02         2.03670E+01         2.88178E+02
+          1.12321E-02         3.58990E-03        -3.98564E-03         7.05731E-01         4.44884E-01         7.05743E-01         2.98757E+02         1.00000E+00         2.80655E-01         2.98758E+02         2.09259E+01         2.77832E+02
+          1.12321E-02         3.75973E-03        -4.02485E-03         7.05731E-01         4.55555E-01         7.05742E-01         2.89059E+02         1.00000E+00         2.76032E-01         2.89060E+02         2.14635E+01         2.67596E+02
+          1.12321E-02         3.92956E-03        -4.06587E-03         7.05730E-01         4.66225E-01         7.05742E-01         2.79462E+02         1.00000E+00         2.71428E-01         2.79463E+02         2.19785E+01         2.57485E+02
+          1.12321E-02         4.09939E-03        -4.10871E-03         7.05730E-01         4.76896E-01         7.05742E-01         2.69981E+02         1.00000E+00         2.66851E-01         2.69982E+02         2.24697E+01         2.47513E+02
+          1.12321E-02         4.26921E-03        -4.15335E-03         7.05730E-01         4.87567E-01         7.05742E-01         2.60628E+02         1.00000E+00         2.62304E-01         2.60629E+02         2.29357E+01         2.37693E+02
+          1.12321E-02         4.43904E-03        -4.19981E-03         7.05729E-01         4.98237E-01         7.05741E-01         2.51415E+02         1.00000E+00         2.57792E-01         2.51416E+02         2.33757E+01         2.28040E+02
+          1.12321E-02         4.60887E-03        -4.24808E-03         7.05728E-01         5.08908E-01         7.05741E-01         2.42352E+02         1.00000E+00         2.53322E-01         2.42353E+02         2.37886E+01         2.18564E+02
+          1.12321E-02         4.77869E-03        -4.29816E-03         7.05728E-01         5.19578E-01         7.05741E-01         2.33450E+02         1.00000E+00         2.48898E-01         2.33451E+02         2.41735E+01         2.09277E+02
+          1.12321E-02         4.94852E-03        -4.35006E-03         7.05727E-01         5.30249E-01         7.05741E-01         2.24720E+02         1.00000E+00         2.44524E-01         2.24720E+02         2.45295E+01         2.00191E+02
+          1.12321E-02         5.11835E-03        -4.40377E-03         7.05727E-01         5.40919E-01         7.05740E-01         2.16169E+02         1.00000E+00         2.40204E-01         2.16170E+02         2.48560E+01         1.91314E+02
+          1.12321E-02         5.28818E-03        -4.45928E-03         7.05726E-01         5.51590E-01         7.05740E-01         2.07808E+02         1.00000E+00         2.35943E-01         2.07809E+02         2.51524E+01         1.82656E+02
+          1.12321E-02         5.45800E-03        -4.51662E-03         7.05725E-01         5.62261E-01         7.05740E-01         1.99643E+02         1.00000E+00         2.31745E-01         1.99643E+02         2.54180E+01         1.74225E+02
+          1.12321E-02         5.62783E-03        -4.57576E-03         7.05725E-01         5.72931E-01         7.05740E-01         1.91681E+02         1.00000E+00         2.27612E-01         1.91682E+02         2.56524E+01         1.66029E+02
+          1.12321E-02         5.79766E-03        -4.63671E-03         7.05724E-01         5.83602E-01         7.05739E-01         1.83929E+02         1.00000E+00         2.23549E-01         1.83930E+02         2.58553E+01         1.58074E+02
+          1.12321E-02         5.96749E-03        -4.69948E-03         7.05723E-01         5.94272E-01         7.05739E-01         1.76392E+02         1.00000E+00         2.19559E-01         1.76393E+02         2.60264E+01         1.50366E+02
+          1.12321E-02         6.13731E-03        -4.76406E-03         7.05723E-01         6.04943E-01         7.05739E-01         1.69075E+02         1.00000E+00         2.15643E-01         1.69076E+02         2.61656E+01         1.42910E+02
+          1.12321E-02         6.30714E-03        -4.83045E-03         7.05722E-01         6.15613E-01         7.05738E-01         1.61983E+02         1.00000E+00         2.11805E-01         1.61983E+02         2.62728E+01         1.35711E+02
+          1.12321E-02         6.47697E-03        -4.89866E-03         7.05721E-01         6.26284E-01         7.05738E-01         1.55118E+02         1.00000E+00         2.08047E-01         1.55118E+02         2.63479E+01         1.28770E+02
+          1.12321E-02         6.64680E-03        -4.96867E-03         7.05720E-01         6.36955E-01         7.05738E-01         1.48483E+02         1.00000E+00         2.04371E-01         1.48483E+02         2.63911E+01         1.22092E+02
+          1.12321E-02         6.81662E-03        -5.04050E-03         7.05720E-01         6.47625E-01         7.05738E-01         1.42080E+02         1.00000E+00         2.00779E-01         1.42081E+02         2.64026E+01         1.15678E+02
+          1.12321E-02         6.98645E-03        -5.11414E-03         7.05719E-01         6.58296E-01         7.05737E-01         1.35911E+02         1.00000E+00         1.97272E-01         1.35911E+02         2.63827E+01         1.09529E+02
+          1.12321E-02         7.15628E-03        -5.18959E-03         7.05718E-01         6.68966E-01         7.05737E-01         1.29976E+02         1.00000E+00         1.93852E-01         1.29976E+02         2.63316E+01         1.03645E+02
+          1.12321E-02         7.32611E-03        -5.26686E-03         7.05717E-01         6.79637E-01         7.05737E-01         1.24275E+02         1.00000E+00         1.90519E-01         1.24275E+02         2.62500E+01         9.80254E+01
+          1.12321E-02         7.49593E-03        -5.34594E-03         7.05716E-01         6.90307E-01         7.05736E-01         1.18807E+02         1.00000E+00         1.87275E-01         1.18808E+02         2.61382E+01         9.26697E+01
+          1.12321E-02         7.66576E-03        -5.42683E-03         7.05715E-01         7.00978E-01         7.05736E-01         1.13572E+02         1.00000E+00         1.84119E-01         1.13573E+02         2.59968E+01         8.75757E+01
+          1.12321E-02         7.83559E-03        -5.50953E-03         7.05714E-01         7.11649E-01         7.05736E-01         1.08567E+02         1.00000E+00         1.81054E-01         1.08568E+02         2.58266E+01         8.27411E+01
+          1.12321E-02         8.00542E-03        -5.59404E-03         7.05713E-01         7.22319E-01         7.05736E-01         1.03791E+02         1.00000E+00         1.78077E-01         1.03791E+02         2.56283E+01         7.81626E+01
+          1.12321E-02         8.17524E-03        -5.68037E-03         7.05712E-01         7.32990E-01         7.05735E-01         9.92389E+01         1.00000E+00         1.75191E-01         9.92391E+01         2.54026E+01         7.38365E+01
+          1.12321E-02         8.34507E-03        -5.76850E-03         7.05711E-01         7.43660E-01         7.05735E-01         9.49089E+01         1.00000E+00         1.72393E-01         9.49091E+01         2.51505E+01         6.97586E+01
+          1.12321E-02         8.51490E-03        -5.85845E-03         7.05710E-01         7.54331E-01         7.05735E-01         9.07967E+01         1.00000E+00         1.69685E-01         9.07968E+01         2.48727E+01         6.59241E+01
+          1.12321E-02         8.68473E-03        -5.95022E-03         7.05709E-01         7.65001E-01         7.05734E-01         8.68978E+01         1.00000E+00         1.67065E-01         8.68979E+01         2.45705E+01         6.23275E+01
+          1.12321E-02         8.85455E-03        -6.04379E-03         7.05708E-01         7.75672E-01         7.05734E-01         8.32076E+01         1.00000E+00         1.64533E-01         8.32077E+01         2.42446E+01         5.89631E+01
+          1.12321E-02         9.02438E-03        -6.13918E-03         7.05707E-01         7.86343E-01         7.05734E-01         7.97208E+01         1.00000E+00         1.62088E-01         7.97209E+01         2.38962E+01         5.58246E+01
+          1.12321E-02         9.19421E-03        -6.23638E-03         7.05706E-01         7.97013E-01         7.05734E-01         7.64320E+01         1.00000E+00         1.59729E-01         7.64320E+01         2.35265E+01         5.29055E+01
+          1.12321E-02         9.36403E-03        -6.33539E-03         7.05705E-01         8.07684E-01         7.05733E-01         7.33352E+01         1.00000E+00         1.57455E-01         7.33352E+01         2.31365E+01         5.01987E+01
+          1.12321E-02         9.53386E-03        -6.43621E-03         7.05704E-01         8.18354E-01         7.05733E-01         7.04244E+01         1.00000E+00         1.55265E-01         7.04243E+01         2.27275E+01         4.76968E+01
+          1.12321E-02         9.70369E-03        -6.53885E-03         7.05703E-01         8.29025E-01         7.05733E-01         6.76930E+01         1.00000E+00         1.53158E-01         6.76929E+01         2.23005E+01         4.53924E+01
+          1.12321E-02         9.87352E-03        -6.64330E-03         7.05702E-01         8.39695E-01         7.05733E-01         6.51345E+01         1.00000E+00         1.51132E-01         6.51343E+01         2.18570E+01         4.32774E+01
+          1.12321E-02         1.00433E-02        -6.74956E-03         7.05700E-01         8.50366E-01         7.05733E-01         6.27420E+01         1.00000E+00         1.49186E-01         6.27418E+01         2.13980E+01         4.13438E+01
+          1.12321E-02         1.02132E-02        -6.85763E-03         7.05699E-01         8.61037E-01         7.05732E-01         6.05084E+01         1.00000E+00         1.47318E-01         6.05082E+01         2.09249E+01         3.95833E+01
+          1.12321E-02         1.03830E-02        -6.96752E-03         7.05698E-01         8.71707E-01         7.05732E-01         5.84267E+01         1.00000E+00         1.45528E-01         5.84265E+01         2.04390E+01         3.79875E+01
+          1.12321E-02         1.05528E-02        -7.07921E-03         7.05697E-01         8.82378E-01         7.05732E-01         5.64896E+01         1.00000E+00         1.43812E-01         5.64893E+01         1.99415E+01         3.65479E+01
+          1.12321E-02         1.07227E-02        -7.19273E-03         7.05695E-01         8.93048E-01         7.05732E-01         5.46897E+01         1.00000E+00         1.42171E-01         5.46894E+01         1.94337E+01         3.52558E+01
+          1.12321E-02         1.08925E-02        -7.30805E-03         7.05694E-01         9.03719E-01         7.05732E-01         5.30197E+01         1.00000E+00         1.40602E-01         5.30194E+01         1.89169E+01         3.41025E+01
+          1.12321E-02         1.10623E-02        -7.42518E-03         7.05693E-01         9.14389E-01         7.05732E-01         5.14721E+01         1.00000E+00         1.39103E-01         5.14718E+01         1.83923E+01         3.30795E+01
+          1.12321E-02         1.12321E-02        -7.54413E-03         7.05691E-01         9.25060E-01         7.05732E-01         5.00397E+01         1.00000E+00         1.37672E-01         5.00393E+01         1.78612E+01         3.21781E+01
+          1.12321E-02         1.14020E-02        -7.66489E-03         7.05690E-01         9.35731E-01         7.05732E-01         4.87150E+01         1.00000E+00         1.36309E-01         4.87146E+01         1.73250E+01         3.13896E+01
+          1.12321E-02         1.15718E-02        -7.78746E-03         7.05689E-01         9.46401E-01         7.05732E-01         4.74907E+01         1.00000E+00         1.35011E-01         4.74904E+01         1.67847E+01         3.07057E+01
+          1.12321E-02         1.17416E-02        -7.91184E-03         7.05687E-01         9.57072E-01         7.05732E-01         4.63598E+01         1.00000E+00         1.33777E-01         4.63594E+01         1.62417E+01         3.01177E+01
+          1.12321E-02         1.19114E-02        -8.03804E-03         7.05686E-01         9.67742E-01         7.05732E-01         4.53151E+01         1.00000E+00         1.32605E-01         4.53147E+01         1.56970E+01         2.96176E+01
+          1.12321E-02         1.20813E-02        -8.16605E-03         7.05684E-01         9.78413E-01         7.05732E-01         4.43496E+01         1.00000E+00         1.31492E-01         4.43492E+01         1.51520E+01         2.91972E+01
+          1.12321E-02         1.22511E-02        -8.29587E-03         7.05683E-01         9.89083E-01         7.05732E-01         4.34567E+01         1.00000E+00         1.30438E-01         4.34563E+01         1.46076E+01         2.88487E+01
+          1.12321E-02         1.24209E-02        -8.42751E-03         7.05682E-01         9.99754E-01         7.05732E-01         4.26297E+01         1.00000E+00         1.29441E-01         4.26292E+01         1.40650E+01         2.85642E+01
+          1.12321E-02         1.25908E-02        -8.56095E-03         7.05680E-01         1.01042E+00         7.05732E-01         4.18621E+01         1.00000E+00         1.28498E-01         4.18617E+01         1.35253E+01         2.83363E+01
+          1.12321E-02         1.27606E-02        -8.69621E-03         7.05678E-01         1.02110E+00         7.05732E-01         4.11479E+01         1.00000E+00         1.27608E-01         4.11474E+01         1.29895E+01         2.81579E+01
+          1.12321E-02         1.29304E-02        -8.83328E-03         7.05677E-01         1.03177E+00         7.05732E-01         4.04810E+01         1.00000E+00         1.26769E-01         4.04805E+01         1.24585E+01         2.80220E+01
+          1.12321E-02         1.31002E-02        -8.97217E-03         7.05675E-01         1.04244E+00         7.05732E-01         3.98557E+01         1.00000E+00         1.25980E-01         3.98552E+01         1.19334E+01         2.79219E+01
+          1.12321E-02         1.32701E-02        -9.11286E-03         7.05674E-01         1.05311E+00         7.05733E-01         3.92666E+01         1.00000E+00         1.25238E-01         3.92661E+01         1.14149E+01         2.78512E+01
+          1.12321E-02         1.34399E-02        -9.25537E-03         7.05672E-01         1.06378E+00         7.05733E-01         3.87084E+01         1.00000E+00         1.24541E-01         3.87079E+01         1.09040E+01         2.78039E+01
+          1.12321E-02         1.36097E-02        -9.39969E-03         7.05671E-01         1.07445E+00         7.05733E-01         3.81762E+01         1.00000E+00         1.23889E-01         3.81758E+01         1.04015E+01         2.77742E+01
+          1.12321E-02         1.37795E-02        -9.54583E-03         7.05669E-01         1.08512E+00         7.05734E-01         3.76655E+01         1.00000E+00         1.23278E-01         3.76650E+01         9.90815E+00         2.77568E+01
+          1.12321E-02         1.39494E-02        -9.69377E-03         7.05667E-01         1.09579E+00         7.05734E-01         3.71717E+01         1.00000E+00         1.22708E-01         3.71712E+01         9.42459E+00         2.77466E+01
+          1.12321E-02         1.41192E-02        -9.84353E-03         7.05666E-01         1.10646E+00         7.05734E-01         3.66909E+01         1.00000E+00         1.22176E-01         3.66904E+01         8.95153E+00         2.77389E+01
+          1.12321E-02         1.42890E-02        -9.99511E-03         7.05664E-01         1.11713E+00         7.05735E-01         3.62193E+01         1.00000E+00         1.21681E-01         3.62188E+01         8.48956E+00         2.77292E+01
+          1.12321E-02         1.44589E-02        -1.01485E-02         7.05662E-01         1.12780E+00         7.05735E-01         3.57534E+01         1.00000E+00         1.21220E-01         3.57529E+01         8.03926E+00         2.77137E+01
+          1.12321E-02         1.46287E-02        -1.03037E-02         7.05660E-01         1.13847E+00         7.05736E-01         3.52900E+01         1.00000E+00         1.20792E-01         3.52896E+01         7.60111E+00         2.76885E+01
+          1.12321E-02         1.47985E-02        -1.04607E-02         7.05659E-01         1.14914E+00         7.05736E-01         3.48263E+01         1.00000E+00         1.20395E-01         3.48259E+01         7.17557E+00         2.76503E+01
+          1.12321E-02         1.49683E-02        -1.06195E-02         7.05657E-01         1.15981E+00         7.05737E-01         3.43597E+01         1.00000E+00         1.20028E-01         3.43593E+01         6.76306E+00         2.75962E+01
+          1.12321E-02         1.51382E-02        -1.07802E-02         7.05655E-01         1.17048E+00         7.05737E-01         3.38880E+01         1.00000E+00         1.19687E-01         3.38875E+01         6.36391E+00         2.75236E+01
+          1.12321E-02         1.53080E-02        -1.09426E-02         7.05653E-01         1.18115E+00         7.05738E-01         3.34090E+01         1.00000E+00         1.19372E-01         3.34086E+01         5.97844E+00         2.74302E+01
+          1.12321E-02         1.54778E-02        -1.11069E-02         7.05651E-01         1.19182E+00         7.05739E-01         3.29211E+01         1.00000E+00         1.19081E-01         3.29207E+01         5.60689E+00         2.73139E+01
+          1.12321E-02         1.56476E-02        -1.12729E-02         7.05650E-01         1.20249E+00         7.05740E-01         3.24229E+01         1.00000E+00         1.18811E-01         3.24226E+01         5.24946E+00         2.71731E+01
+          1.12321E-02         1.58175E-02        -1.14408E-02         7.05648E-01         1.21317E+00         7.05740E-01         3.19132E+01         1.00000E+00         1.18562E-01         3.19129E+01         4.90633E+00         2.70065E+01
+          1.12321E-02         1.59873E-02        -1.16105E-02         7.05646E-01         1.22384E+00         7.05741E-01         3.13911E+01         1.00000E+00         1.18331E-01         3.13907E+01         4.57758E+00         2.68132E+01
+          1.12321E-02         1.61571E-02        -1.17820E-02         7.05644E-01         1.23451E+00         7.05742E-01         3.08559E+01         1.00000E+00         1.18116E-01         3.08555E+01         4.26329E+00         2.65923E+01
+          1.12321E-02         1.63270E-02        -1.19554E-02         7.05642E-01         1.24518E+00         7.05743E-01         3.03071E+01         1.00000E+00         1.17916E-01         3.03068E+01         3.96349E+00         2.63434E+01
+          1.12321E-02         1.64968E-02        -1.21305E-02         7.05640E-01         1.25585E+00         7.05744E-01         2.97447E+01         1.00000E+00         1.17730E-01         2.97444E+01         3.67814E+00         2.60663E+01
+          1.12321E-02         1.66666E-02        -1.23074E-02         7.05638E-01         1.26652E+00         7.05745E-01         2.91686E+01         1.00000E+00         1.17554E-01         2.91683E+01         3.40718E+00         2.57611E+01
+          1.12321E-02         1.68364E-02        -1.24862E-02         7.05636E-01         1.27719E+00         7.05746E-01         2.85790E+01         1.00000E+00         1.17388E-01         2.85787E+01         3.15052E+00         2.54282E+01
+          1.12321E-02         1.70063E-02        -1.26668E-02         7.05634E-01         1.28786E+00         7.05748E-01         2.79763E+01         1.00000E+00         1.17231E-01         2.79761E+01         2.90801E+00         2.50681E+01
+          1.12321E-02         1.71761E-02        -1.28492E-02         7.05632E-01         1.29853E+00         7.05749E-01         2.73612E+01         1.00000E+00         1.17080E-01         2.73610E+01         2.67948E+00         2.46815E+01
+          1.12321E-02         1.73459E-02        -1.30334E-02         7.05630E-01         1.30920E+00         7.05750E-01         2.67344E+01         1.00000E+00         1.16933E-01         2.67342E+01         2.46472E+00         2.42695E+01
+          1.12321E-02         1.75158E-02        -1.32194E-02         7.05628E-01         1.31987E+00         7.05751E-01         2.60967E+01         1.00000E+00         1.16791E-01         2.60966E+01         2.26349E+00         2.38331E+01
+          1.12321E-02         1.76856E-02        -1.34072E-02         7.05626E-01         1.33054E+00         7.05753E-01         2.54493E+01         1.00000E+00         1.16650E-01         2.54492E+01         2.07553E+00         2.33737E+01
+          1.12321E-02         1.78554E-02        -1.35968E-02         7.05623E-01         1.34121E+00         7.05754E-01         2.47933E+01         1.00000E+00         1.16509E-01         2.47932E+01         1.90053E+00         2.28927E+01
+          1.12321E-02         1.80252E-02        -1.37883E-02         7.05621E-01         1.35188E+00         7.05756E-01         2.41300E+01         1.00000E+00         1.16368E-01         2.41299E+01         1.73817E+00         2.23917E+01
+          1.12321E-02         1.81951E-02        -1.39816E-02         7.05619E-01         1.36255E+00         7.05758E-01         2.34607E+01         1.00000E+00         1.16224E-01         2.34606E+01         1.58812E+00         2.18725E+01
+          1.12321E-02         1.83649E-02        -1.41766E-02         7.05617E-01         1.37322E+00         7.05759E-01         2.27869E+01         1.00000E+00         1.16077E-01         2.27868E+01         1.45000E+00         2.13368E+01
+          1.12321E-02         1.85347E-02        -1.43735E-02         7.05615E-01         1.38389E+00         7.05761E-01         2.21100E+01         1.00000E+00         1.15925E-01         2.21100E+01         1.32342E+00         2.07866E+01
+          1.12321E-02         1.87045E-02        -1.45722E-02         7.05612E-01         1.39457E+00         7.05763E-01         2.14318E+01         1.00000E+00         1.15767E-01         2.14318E+01         1.20799E+00         2.02238E+01
+          1.12321E-02         1.88744E-02        -1.47728E-02         7.05610E-01         1.40524E+00         7.05765E-01         2.07537E+01         1.00000E+00         1.15602E-01         2.07537E+01         1.10329E+00         1.96504E+01
+          1.12321E-02         1.90442E-02        -1.49751E-02         7.05608E-01         1.41591E+00         7.05767E-01         2.00774E+01         1.00000E+00         1.15428E-01         2.00775E+01         1.00890E+00         1.90686E+01
+          1.12321E-02         1.92140E-02        -1.51792E-02         7.05606E-01         1.42658E+00         7.05769E-01         1.94045E+01         1.00000E+00         1.15245E-01         1.94046E+01         9.24356E-01         1.84803E+01
+          1.12321E-02         1.93839E-02        -1.53852E-02         7.05603E-01         1.43725E+00         7.05771E-01         1.87368E+01         1.00000E+00         1.15052E-01         1.87369E+01         8.49227E-01         1.78877E+01
+          1.12321E-02         1.95537E-02        -1.55929E-02         7.05601E-01         1.44792E+00         7.05773E-01         1.80757E+01         1.00000E+00         1.14847E-01         1.80759E+01         7.83053E-01         1.72929E+01
+          1.12321E-02         1.97235E-02        -1.58025E-02         7.05599E-01         1.45859E+00         7.05776E-01         1.74231E+01         1.00000E+00         1.14630E-01         1.74233E+01         7.25373E-01         1.66979E+01
+          1.12321E-02         1.98933E-02        -1.60139E-02         7.05596E-01         1.46926E+00         7.05778E-01         1.67804E+01         1.00000E+00         1.14399E-01         1.67806E+01         6.75724E-01         1.61049E+01
+          1.12321E-02         2.00632E-02        -1.62271E-02         7.05594E-01         1.47993E+00         7.05780E-01         1.61492E+01         1.00000E+00         1.14155E-01         1.61494E+01         6.33640E-01         1.55158E+01
+          1.12321E-02         2.02330E-02        -1.64422E-02         7.05591E-01         1.49060E+00         7.05783E-01         1.55310E+01         1.00000E+00         1.13896E-01         1.55313E+01         5.98658E-01         1.49326E+01
+          1.12321E-02         2.04028E-02        -1.66590E-02         7.05589E-01         1.50127E+00         7.05786E-01         1.49273E+01         1.00000E+00         1.13621E-01         1.49275E+01         5.70315E-01         1.43572E+01
+          1.12321E-02         2.05726E-02        -1.68776E-02         7.05587E-01         1.51194E+00         7.05788E-01         1.43394E+01         1.00000E+00         1.13330E-01         1.43396E+01         5.48153E-01         1.37915E+01
+          1.12321E-02         2.07425E-02        -1.70981E-02         7.05584E-01         1.52261E+00         7.05791E-01         1.37686E+01         1.00000E+00         1.13022E-01         1.37689E+01         5.31718E-01         1.32372E+01
+          1.12321E-02         2.09123E-02        -1.73204E-02         7.05582E-01         1.53328E+00         7.05794E-01         1.32161E+01         1.00000E+00         1.12697E-01         1.32165E+01         5.20564E-01         1.26959E+01
+          1.12321E-02         2.10821E-02        -1.75445E-02         7.05579E-01         1.54395E+00         7.05797E-01         1.26832E+01         1.00000E+00         1.12354E-01         1.26835E+01         5.14250E-01         1.21693E+01
+          1.12321E-02         2.12520E-02        -1.77704E-02         7.05577E-01         1.55462E+00         7.05800E-01         1.21708E+01         1.00000E+00         1.11992E-01         1.21712E+01         5.12349E-01         1.16588E+01
+          1.12321E-02         2.14218E-02        -1.79981E-02         7.05574E-01         1.56529E+00         7.05804E-01         1.16799E+01         1.00000E+00         1.11612E-01         1.16803E+01         5.14439E-01         1.11658E+01
+          1.12321E-02         2.15916E-02        -1.82276E-02         7.05571E-01         1.57596E+00         7.05807E-01         1.12114E+01         1.00000E+00         1.11212E-01         1.12117E+01         5.20112E-01         1.06916E+01
+          1.12321E-02         2.17614E-02        -1.84589E-02         7.05569E-01         1.58664E+00         7.05810E-01         1.07659E+01         1.00000E+00         1.10793E-01         1.07663E+01         5.28972E-01         1.02373E+01
+          1.12321E-02         2.19313E-02        -1.86921E-02         7.05566E-01         1.59731E+00         7.05814E-01         1.03442E+01         1.00000E+00         1.10354E-01         1.03446E+01         5.40637E-01         9.80395E+00
+          1.12321E-02         2.21011E-02        -1.89271E-02         7.05564E-01         1.60798E+00         7.05817E-01         9.94679E+00         1.00000E+00         1.09895E-01         9.94718E+00         5.54736E-01         9.39245E+00
+          1.12321E-02         2.22709E-02        -1.91638E-02         7.05561E-01         1.61865E+00         7.05821E-01         9.57411E+00         1.00000E+00         1.09415E-01         9.57452E+00         5.70916E-01         9.00360E+00
+          1.12321E-02         2.24407E-02        -1.94024E-02         7.05558E-01         1.62932E+00         7.05825E-01         9.22650E+00         1.00000E+00         1.08915E-01         9.22691E+00         5.88836E-01         8.63807E+00
+          1.12321E-02         2.26106E-02        -1.96428E-02         7.05556E-01         1.63999E+00         7.05829E-01         8.90417E+00         1.00000E+00         1.08394E-01         8.90458E+00         6.08173E-01         8.29641E+00
+          1.12321E-02         2.27804E-02        -1.98851E-02         7.05553E-01         1.65066E+00         7.05833E-01         8.60725E+00         1.00000E+00         1.07853E-01         8.60766E+00         6.28620E-01         7.97904E+00
+          1.12321E-02         2.29502E-02        -2.01291E-02         7.05550E-01         1.66133E+00         7.05837E-01         8.33574E+00         1.00000E+00         1.07290E-01         8.33616E+00         6.49884E-01         7.68627E+00
+          1.12321E-02         2.31201E-02        -2.03750E-02         7.05547E-01         1.67200E+00         7.05841E-01         8.08956E+00         1.00000E+00         1.06707E-01         8.08998E+00         6.71691E-01         7.41829E+00
+          1.12321E-02         2.32899E-02        -2.06226E-02         7.05545E-01         1.68267E+00         7.05846E-01         7.86853E+00         1.00000E+00         1.06103E-01         7.86894E+00         6.93784E-01         7.17515E+00
+          1.12321E-02         2.34597E-02        -2.08721E-02         7.05542E-01         1.69334E+00         7.05850E-01         7.67234E+00         1.00000E+00         1.05479E-01         7.67275E+00         7.15921E-01         6.95683E+00
+          1.12321E-02         2.36295E-02        -2.11234E-02         7.05539E-01         1.70401E+00         7.05855E-01         7.50064E+00         1.00000E+00         1.04833E-01         7.50105E+00         7.37878E-01         6.76317E+00
+          1.12321E-02         2.37994E-02        -2.13765E-02         7.05536E-01         1.71468E+00         7.05860E-01         7.35295E+00         1.00000E+00         1.04167E-01         7.35335E+00         7.59450E-01         6.59390E+00
+          1.12321E-02         2.39692E-02        -2.16314E-02         7.05533E-01         1.72535E+00         7.05865E-01         7.22872E+00         1.00000E+00         1.03481E-01         7.22911E+00         7.80444E-01         6.44867E+00
+          1.12321E-02         2.41390E-02        -2.18881E-02         7.05530E-01         1.73602E+00         7.05870E-01         7.12731E+00         1.00000E+00         1.02775E-01         7.12770E+00         8.00689E-01         6.32701E+00
+          1.12321E-02         2.43088E-02        -2.21467E-02         7.05527E-01         1.74669E+00         7.05875E-01         7.04802E+00         1.00000E+00         1.02048E-01         7.04840E+00         8.20027E-01         6.22837E+00
+          1.12321E-02         2.44787E-02        -2.24070E-02         7.05524E-01         1.75736E+00         7.05880E-01         6.99007E+00         1.00000E+00         1.01302E-01         6.99044E+00         8.38316E-01         6.15213E+00
+          1.12321E-02         2.46485E-02        -2.26692E-02         7.05522E-01         1.76804E+00         7.05886E-01         6.95261E+00         1.00000E+00         1.00536E-01         6.95298E+00         8.55432E-01         6.09754E+00
+          1.12321E-02         2.48183E-02        -2.29332E-02         7.05519E-01         1.77871E+00         7.05891E-01         6.93475E+00         1.00000E+00         9.97518E-02         6.93510E+00         8.71265E-01         6.06383E+00
+          1.12321E-02         2.49882E-02        -2.31990E-02         7.05516E-01         1.78938E+00         7.05897E-01         6.93551E+00         1.00000E+00         9.89483E-02         6.93585E+00         8.85719E-01         6.05013E+00
+          1.12321E-02         2.51580E-02        -2.34666E-02         7.05513E-01         1.80005E+00         7.05903E-01         6.95391E+00         1.00000E+00         9.81263E-02         6.95423E+00         8.98714E-01         6.05552E+00
+          1.12321E-02         2.53278E-02        -2.37360E-02         7.05510E-01         1.81072E+00         7.05909E-01         6.98887E+00         1.00000E+00         9.72864E-02         6.98919E+00         9.10184E-01         6.07900E+00
+          1.12321E-02         2.54976E-02        -2.40072E-02         7.05506E-01         1.82139E+00         7.05915E-01         7.03934E+00         1.00000E+00         9.64287E-02         7.03963E+00         9.20075E-01         6.11956E+00
+          1.12321E-02         2.56675E-02        -2.42803E-02         7.05503E-01         1.83206E+00         7.05921E-01         7.10418E+00         1.00000E+00         9.55539E-02         7.10446E+00         9.28348E-01         6.17611E+00
+          1.12321E-02         2.58373E-02        -2.45552E-02         7.05500E-01         1.84273E+00         7.05928E-01         7.18225E+00         1.00000E+00         9.46622E-02         7.18252E+00         9.34972E-01         6.24755E+00
+          1.12321E-02         2.60071E-02        -2.48318E-02         7.05497E-01         1.85340E+00         7.05934E-01         7.27241E+00         1.00000E+00         9.37542E-02         7.27266E+00         9.39932E-01         6.33273E+00
+          1.12321E-02         2.61769E-02        -2.51103E-02         7.05494E-01         1.86407E+00         7.05941E-01         7.37348E+00         1.00000E+00         9.28304E-02         7.37372E+00         9.43223E-01         6.43050E+00
+          1.14020E-02         8.72665E-04        -3.72548E-03         7.16406E-01         2.74155E-01         7.16416E-01         4.48745E+02         1.00000E+00         2.75455E-01         4.48745E+02         1.02394E+01         4.38506E+02
+          1.14020E-02         1.04249E-03        -3.73570E-03         7.16406E-01         2.84826E-01         7.16416E-01         4.39566E+02         1.00000E+00         2.72324E-01         4.39567E+02         1.07234E+01         4.28844E+02
+          1.14020E-02         1.21232E-03        -3.74773E-03         7.16406E-01         2.95496E-01         7.16416E-01         4.30227E+02         1.00000E+00         2.69128E-01         4.30228E+02         1.12108E+01         4.19017E+02
+          1.14020E-02         1.38215E-03        -3.76157E-03         7.16406E-01         3.06167E-01         7.16416E-01         4.20743E+02         1.00000E+00         2.65872E-01         4.20744E+02         1.17003E+01         4.09044E+02
+          1.14020E-02         1.55197E-03        -3.77722E-03         7.16406E-01         3.16838E-01         7.16416E-01         4.11134E+02         1.00000E+00         2.62562E-01         4.11135E+02         1.21904E+01         3.98944E+02
+          1.14020E-02         1.72180E-03        -3.79469E-03         7.16405E-01         3.27508E-01         7.16416E-01         4.01416E+02         1.00000E+00         2.59202E-01         4.01417E+02         1.26799E+01         3.88737E+02
+          1.14020E-02         1.89163E-03        -3.81397E-03         7.16405E-01         3.38179E-01         7.16415E-01         3.91607E+02         1.00000E+00         2.55799E-01         3.91608E+02         1.31673E+01         3.78441E+02
+          1.14020E-02         2.06146E-03        -3.83506E-03         7.16405E-01         3.48849E-01         7.16415E-01         3.81726E+02         1.00000E+00         2.52356E-01         3.81727E+02         1.36513E+01         3.68075E+02
+          1.14020E-02         2.23128E-03        -3.85796E-03         7.16405E-01         3.59520E-01         7.16415E-01         3.71789E+02         1.00000E+00         2.48881E-01         3.71789E+02         1.41306E+01         3.57659E+02
+          1.14020E-02         2.40111E-03        -3.88267E-03         7.16404E-01         3.70190E-01         7.16415E-01         3.61813E+02         1.00000E+00         2.45377E-01         3.61814E+02         1.46038E+01         3.47210E+02
+          1.14020E-02         2.57094E-03        -3.90920E-03         7.16404E-01         3.80861E-01         7.16415E-01         3.51816E+02         1.00000E+00         2.41850E-01         3.51817E+02         1.50697E+01         3.36747E+02
+          1.14020E-02         2.74077E-03        -3.93754E-03         7.16404E-01         3.91532E-01         7.16415E-01         3.41815E+02         1.00000E+00         2.38305E-01         3.41816E+02         1.55271E+01         3.26289E+02
+          1.14020E-02         2.91059E-03        -3.96769E-03         7.16403E-01         4.02202E-01         7.16414E-01         3.31826E+02         1.00000E+00         2.34747E-01         3.31827E+02         1.59746E+01         3.15852E+02
+          1.14020E-02         3.08042E-03        -3.99965E-03         7.16403E-01         4.12873E-01         7.16414E-01         3.21865E+02         1.00000E+00         2.31182E-01         3.21865E+02         1.64111E+01         3.05454E+02
+          1.14020E-02         3.25025E-03        -4.03342E-03         7.16403E-01         4.23543E-01         7.16414E-01         3.11947E+02         1.00000E+00         2.27614E-01         3.11948E+02         1.68355E+01         2.95112E+02
+          1.14020E-02         3.42008E-03        -4.06901E-03         7.16402E-01         4.34214E-01         7.16414E-01         3.02089E+02         1.00000E+00         2.24048E-01         3.02089E+02         1.72466E+01         2.84843E+02
+          1.14020E-02         3.58990E-03        -4.10640E-03         7.16402E-01         4.44884E-01         7.16414E-01         2.92304E+02         1.00000E+00         2.20489E-01         2.92305E+02         1.76434E+01         2.74661E+02
+          1.14020E-02         3.75973E-03        -4.14562E-03         7.16401E-01         4.55555E-01         7.16413E-01         2.82608E+02         1.00000E+00         2.16941E-01         2.82608E+02         1.80250E+01         2.64583E+02
+          1.14020E-02         3.92956E-03        -4.18664E-03         7.16401E-01         4.66225E-01         7.16413E-01         2.73013E+02         1.00000E+00         2.13408E-01         2.73013E+02         1.83902E+01         2.54623E+02
+          1.14020E-02         4.09939E-03        -4.22947E-03         7.16400E-01         4.76896E-01         7.16413E-01         2.63533E+02         1.00000E+00         2.09896E-01         2.63534E+02         1.87383E+01         2.44795E+02
+          1.14020E-02         4.26921E-03        -4.27412E-03         7.16400E-01         4.87567E-01         7.16413E-01         2.54181E+02         1.00000E+00         2.06409E-01         2.54182E+02         1.90684E+01         2.35113E+02
+          1.14020E-02         4.43904E-03        -4.32058E-03         7.16399E-01         4.98237E-01         7.16412E-01         2.44968E+02         1.00000E+00         2.02949E-01         2.44969E+02         1.93797E+01         2.25589E+02
+          1.14020E-02         4.60887E-03        -4.36885E-03         7.16399E-01         5.08908E-01         7.16412E-01         2.35907E+02         1.00000E+00         1.99522E-01         2.35907E+02         1.96714E+01         2.16236E+02
+          1.14020E-02         4.77869E-03        -4.41893E-03         7.16398E-01         5.19578E-01         7.16412E-01         2.27007E+02         1.00000E+00         1.96130E-01         2.27007E+02         1.99430E+01         2.07064E+02
+          1.14020E-02         4.94852E-03        -4.47082E-03         7.16398E-01         5.30249E-01         7.16412E-01         2.18278E+02         1.00000E+00         1.92778E-01         2.18279E+02         2.01937E+01         1.98085E+02
+          1.14020E-02         5.11835E-03        -4.52453E-03         7.16397E-01         5.40919E-01         7.16411E-01         2.09731E+02         1.00000E+00         1.89469E-01         2.09731E+02         2.04232E+01         1.89308E+02
+          1.14020E-02         5.28818E-03        -4.58005E-03         7.16396E-01         5.51590E-01         7.16411E-01         2.01372E+02         1.00000E+00         1.86205E-01         2.01373E+02         2.06308E+01         1.80742E+02
+          1.14020E-02         5.45800E-03        -4.63738E-03         7.16396E-01         5.62261E-01         7.16411E-01         1.93212E+02         1.00000E+00         1.82990E-01         1.93212E+02         2.08161E+01         1.72396E+02
+          1.14020E-02         5.62783E-03        -4.69652E-03         7.16395E-01         5.72931E-01         7.16411E-01         1.85255E+02         1.00000E+00         1.79827E-01         1.85256E+02         2.09789E+01         1.64277E+02
+          1.14020E-02         5.79766E-03        -4.75748E-03         7.16394E-01         5.83602E-01         7.16410E-01         1.77510E+02         1.00000E+00         1.76718E-01         1.77511E+02         2.11189E+01         1.56392E+02
+          1.14020E-02         5.96749E-03        -4.82025E-03         7.16394E-01         5.94272E-01         7.16410E-01         1.69982E+02         1.00000E+00         1.73665E-01         1.69982E+02         2.12358E+01         1.48746E+02
+          1.14020E-02         6.13731E-03        -4.88483E-03         7.16393E-01         6.04943E-01         7.16410E-01         1.62675E+02         1.00000E+00         1.70670E-01         1.62676E+02         2.13295E+01         1.41346E+02
+          1.14020E-02         6.30714E-03        -4.95122E-03         7.16392E-01         6.15613E-01         7.16409E-01         1.55595E+02         1.00000E+00         1.67736E-01         1.55595E+02         2.14000E+01         1.34195E+02
+          1.14020E-02         6.47697E-03        -5.01942E-03         7.16391E-01         6.26284E-01         7.16409E-01         1.48744E+02         1.00000E+00         1.64865E-01         1.48744E+02         2.14471E+01         1.27297E+02
+          1.14020E-02         6.64680E-03        -5.08944E-03         7.16391E-01         6.36955E-01         7.16409E-01         1.42125E+02         1.00000E+00         1.62057E-01         1.42125E+02         2.14710E+01         1.20654E+02
+          1.14020E-02         6.81662E-03        -5.16127E-03         7.16390E-01         6.47625E-01         7.16408E-01         1.35741E+02         1.00000E+00         1.59314E-01         1.35742E+02         2.14717E+01         1.14270E+02
+          1.14020E-02         6.98645E-03        -5.23491E-03         7.16389E-01         6.58296E-01         7.16408E-01         1.29594E+02         1.00000E+00         1.56638E-01         1.29594E+02         2.14495E+01         1.08144E+02
+          1.14020E-02         7.15628E-03        -5.31036E-03         7.16388E-01         6.68966E-01         7.16408E-01         1.23683E+02         1.00000E+00         1.54029E-01         1.23683E+02         2.14046E+01         1.02279E+02
+          1.14020E-02         7.32611E-03        -5.38762E-03         7.16387E-01         6.79637E-01         7.16408E-01         1.18009E+02         1.00000E+00         1.51488E-01         1.18010E+02         2.13372E+01         9.66723E+01
+          1.14020E-02         7.49593E-03        -5.46670E-03         7.16386E-01         6.90307E-01         7.16407E-01         1.12572E+02         1.00000E+00         1.49016E-01         1.12573E+02         2.12478E+01         9.13249E+01
+          1.14020E-02         7.66576E-03        -5.54759E-03         7.16385E-01         7.00978E-01         7.16407E-01         1.07371E+02         1.00000E+00         1.46613E-01         1.07371E+02         2.11366E+01         8.62347E+01
+          1.14020E-02         7.83559E-03        -5.63029E-03         7.16385E-01         7.11649E-01         7.16407E-01         1.02404E+02         1.00000E+00         1.44279E-01         1.02404E+02         2.10042E+01         8.13997E+01
+          1.14020E-02         8.00542E-03        -5.71480E-03         7.16384E-01         7.22319E-01         7.16406E-01         9.76680E+01         1.00000E+00         1.42015E-01         9.76682E+01         2.08511E+01         7.68171E+01
+          1.14020E-02         8.17524E-03        -5.80113E-03         7.16383E-01         7.32990E-01         7.16406E-01         9.31612E+01         1.00000E+00         1.39821E-01         9.31614E+01         2.06778E+01         7.24836E+01
+          1.14020E-02         8.34507E-03        -5.88927E-03         7.16382E-01         7.43660E-01         7.16406E-01         8.88800E+01         1.00000E+00         1.37696E-01         8.88801E+01         2.04849E+01         6.83952E+01
+          1.14020E-02         8.51490E-03        -5.97922E-03         7.16381E-01         7.54331E-01         7.16405E-01         8.48205E+01         1.00000E+00         1.35641E-01         8.48206E+01         2.02730E+01         6.45476E+01
+          1.14020E-02         8.68473E-03        -6.07098E-03         7.16379E-01         7.65001E-01         7.16405E-01         8.09785E+01         1.00000E+00         1.33654E-01         8.09786E+01         2.00429E+01         6.09357E+01
+          1.14020E-02         8.85455E-03        -6.16455E-03         7.16378E-01         7.75672E-01         7.16405E-01         7.73494E+01         1.00000E+00         1.31735E-01         7.73495E+01         1.97952E+01         5.75542E+01
+          1.14020E-02         9.02438E-03        -6.25994E-03         7.16377E-01         7.86343E-01         7.16405E-01         7.39279E+01         1.00000E+00         1.29884E-01         7.39280E+01         1.95308E+01         5.43972E+01
+          1.14020E-02         9.19421E-03        -6.35714E-03         7.16376E-01         7.97013E-01         7.16404E-01         7.07087E+01         1.00000E+00         1.28100E-01         7.07087E+01         1.92503E+01         5.14585E+01
+          1.14020E-02         9.36403E-03        -6.45615E-03         7.16375E-01         8.07684E-01         7.16404E-01         6.76859E+01         1.00000E+00         1.26382E-01         6.76859E+01         1.89545E+01         4.87314E+01
+          1.14020E-02         9.53386E-03        -6.55698E-03         7.16374E-01         8.18354E-01         7.16404E-01         6.48533E+01         1.00000E+00         1.24729E-01         6.48533E+01         1.86444E+01         4.62089E+01
+          1.14020E-02         9.70369E-03        -6.65961E-03         7.16373E-01         8.29025E-01         7.16404E-01         6.22046E+01         1.00000E+00         1.23141E-01         6.22046E+01         1.83208E+01         4.38838E+01
+          1.14020E-02         9.87352E-03        -6.76406E-03         7.16372E-01         8.39695E-01         7.16404E-01         5.97331E+01         1.00000E+00         1.21615E-01         5.97330E+01         1.79845E+01         4.17486E+01
+          1.14020E-02         1.00433E-02        -6.87032E-03         7.16370E-01         8.50366E-01         7.16403E-01         5.74319E+01         1.00000E+00         1.20152E-01         5.74318E+01         1.76364E+01         3.97954E+01
+          1.14020E-02         1.02132E-02        -6.97839E-03         7.16369E-01         8.61037E-01         7.16403E-01         5.52939E+01         1.00000E+00         1.18750E-01         5.52938E+01         1.72774E+01         3.80164E+01
+          1.14020E-02         1.03830E-02        -7.08828E-03         7.16368E-01         8.71707E-01         7.16403E-01         5.33120E+01         1.00000E+00         1.17407E-01         5.33119E+01         1.69085E+01         3.64034E+01
+          1.14020E-02         1.05528E-02        -7.19998E-03         7.16367E-01         8.82378E-01         7.16403E-01         5.14787E+01         1.00000E+00         1.16123E-01         5.14786E+01         1.65305E+01         3.49481E+01
+          1.14020E-02         1.07227E-02        -7.31349E-03         7.16365E-01         8.93048E-01         7.16403E-01         4.97867E+01         1.00000E+00         1.14897E-01         4.97866E+01         1.61444E+01         3.36422E+01
+          1.14020E-02         1.08925E-02        -7.42881E-03         7.16364E-01         9.03719E-01         7.16403E-01         4.82285E+01         1.00000E+00         1.13726E-01         4.82283E+01         1.57511E+01         3.24772E+01
+          1.14020E-02         1.10623E-02        -7.54594E-03         7.16363E-01         9.14389E-01         7.16402E-01         4.67965E+01         1.00000E+00         1.12610E-01         4.67963E+01         1.53514E+01         3.14448E+01
+          1.14020E-02         1.12321E-02        -7.66489E-03         7.16361E-01         9.25060E-01         7.16402E-01         4.54831E+01         1.00000E+00         1.11548E-01         4.54829E+01         1.49465E+01         3.05365E+01
+          1.14020E-02         1.14020E-02        -7.78565E-03         7.16360E-01         9.35731E-01         7.16402E-01         4.42810E+01         1.00000E+00         1.10538E-01         4.42808E+01         1.45370E+01         2.97438E+01
+          1.14020E-02         1.15718E-02        -7.90822E-03         7.16359E-01         9.46401E-01         7.16402E-01         4.31826E+01         1.00000E+00         1.09578E-01         4.31824E+01         1.41240E+01         2.90584E+01
+          1.14020E-02         1.17416E-02        -8.03260E-03         7.16357E-01         9.57072E-01         7.16402E-01         4.21806E+01         1.00000E+00         1.08668E-01         4.21804E+01         1.37082E+01         2.84721E+01
+          1.14020E-02         1.19114E-02        -8.15880E-03         7.16356E-01         9.67742E-01         7.16402E-01         4.12677E+01         1.00000E+00         1.07806E-01         4.12674E+01         1.32907E+01         2.79767E+01
+          1.14020E-02         1.20813E-02        -8.28681E-03         7.16354E-01         9.78413E-01         7.16402E-01         4.04366E+01         1.00000E+00         1.06990E-01         4.04364E+01         1.28722E+01         2.75642E+01
+          1.14020E-02         1.22511E-02        -8.41663E-03         7.16353E-01         9.89083E-01         7.16402E-01         3.96805E+01         1.00000E+00         1.06220E-01         3.96802E+01         1.24535E+01         2.72267E+01
+          1.14020E-02         1.24209E-02        -8.54826E-03         7.16351E-01         9.99754E-01         7.16402E-01         3.89924E+01         1.00000E+00         1.05493E-01         3.89921E+01         1.20355E+01         2.69567E+01
+          1.14020E-02         1.25908E-02        -8.68171E-03         7.16350E-01         1.01042E+00         7.16402E-01         3.83657E+01         1.00000E+00         1.04809E-01         3.83654E+01         1.16189E+01         2.67465E+01
+          1.14020E-02         1.27606E-02        -8.81697E-03         7.16348E-01         1.02110E+00         7.16402E-01         3.77940E+01         1.00000E+00         1.04166E-01         3.77937E+01         1.12045E+01         2.65892E+01
+          1.14020E-02         1.29304E-02        -8.95404E-03         7.16347E-01         1.03177E+00         7.16403E-01         3.72709E+01         1.00000E+00         1.03563E-01         3.72706E+01         1.07930E+01         2.64775E+01
+          1.14020E-02         1.31002E-02        -9.09292E-03         7.16345E-01         1.04244E+00         7.16403E-01         3.67905E+01         1.00000E+00         1.02997E-01         3.67902E+01         1.03852E+01         2.64050E+01
+          1.14020E-02         1.32701E-02        -9.23362E-03         7.16343E-01         1.05311E+00         7.16403E-01         3.63471E+01         1.00000E+00         1.02469E-01         3.63468E+01         9.98173E+00         2.63650E+01
+          1.14020E-02         1.34399E-02        -9.37613E-03         7.16342E-01         1.06378E+00         7.16403E-01         3.59351E+01         1.00000E+00         1.01975E-01         3.59348E+01         9.58317E+00         2.63516E+01
+          1.14020E-02         1.36097E-02        -9.52045E-03         7.16340E-01         1.07445E+00         7.16403E-01         3.55493E+01         1.00000E+00         1.01516E-01         3.55490E+01         9.19017E+00         2.63588E+01
+          1.14020E-02         1.37795E-02        -9.66658E-03         7.16338E-01         1.08512E+00         7.16404E-01         3.51848E+01         1.00000E+00         1.01089E-01         3.51844E+01         8.80330E+00         2.63811E+01
+          1.14020E-02         1.39494E-02        -9.81453E-03         7.16337E-01         1.09579E+00         7.16404E-01         3.48368E+01         1.00000E+00         1.00693E-01         3.48365E+01         8.42311E+00         2.64134E+01
+          1.14020E-02         1.41192E-02        -9.96429E-03         7.16335E-01         1.10646E+00         7.16404E-01         3.45012E+01         1.00000E+00         1.00326E-01         3.45008E+01         8.05009E+00         2.64507E+01
+          1.14020E-02         1.42890E-02        -1.01159E-02         7.16333E-01         1.11713E+00         7.16405E-01         3.41736E+01         1.00000E+00         9.99879E-02         3.41733E+01         7.68472E+00         2.64886E+01
+          1.14020E-02         1.44589E-02        -1.02692E-02         7.16332E-01         1.12780E+00         7.16405E-01         3.38505E+01         1.00000E+00         9.96761E-02         3.38502E+01         7.32743E+00         2.65227E+01
+          1.14020E-02         1.46287E-02        -1.04244E-02         7.16330E-01         1.13847E+00         7.16406E-01         3.35283E+01         1.00000E+00         9.93895E-02         3.35280E+01         6.97862E+00         2.65493E+01
+          1.14020E-02         1.47985E-02        -1.05815E-02         7.16328E-01         1.14914E+00         7.16406E-01         3.32038E+01         1.00000E+00         9.91267E-02         3.32035E+01         6.63866E+00         2.65649E+01
+          1.14020E-02         1.49683E-02        -1.07403E-02         7.16326E-01         1.15981E+00         7.16407E-01         3.28743E+01         1.00000E+00         9.88861E-02         3.28740E+01         6.30787E+00         2.65661E+01
+          1.14020E-02         1.51382E-02        -1.09009E-02         7.16324E-01         1.17048E+00         7.16407E-01         3.25371E+01         1.00000E+00         9.86664E-02         3.25368E+01         5.98654E+00         2.65502E+01
+          1.14020E-02         1.53080E-02        -1.10634E-02         7.16323E-01         1.18115E+00         7.16408E-01         3.21899E+01         1.00000E+00         9.84661E-02         3.21896E+01         5.67492E+00         2.65147E+01
+          1.14020E-02         1.54778E-02        -1.12276E-02         7.16321E-01         1.19182E+00         7.16409E-01         3.18309E+01         1.00000E+00         9.82838E-02         3.18306E+01         5.37323E+00         2.64573E+01
+          1.14020E-02         1.56476E-02        -1.13937E-02         7.16319E-01         1.20249E+00         7.16409E-01         3.14582E+01         1.00000E+00         9.81181E-02         3.14579E+01         5.08166E+00         2.63763E+01
+          1.14020E-02         1.58175E-02        -1.15616E-02         7.16317E-01         1.21317E+00         7.16410E-01         3.10705E+01         1.00000E+00         9.79675E-02         3.10702E+01         4.80035E+00         2.62699E+01
+          1.14020E-02         1.59873E-02        -1.17313E-02         7.16315E-01         1.22384E+00         7.16411E-01         3.06666E+01         1.00000E+00         9.78306E-02         3.06664E+01         4.52943E+00         2.61369E+01
+          1.14020E-02         1.61571E-02        -1.19028E-02         7.16313E-01         1.23451E+00         7.16412E-01         3.02457E+01         1.00000E+00         9.77061E-02         3.02455E+01         4.26897E+00         2.59765E+01
+          1.14020E-02         1.63270E-02        -1.20761E-02         7.16311E-01         1.24518E+00         7.16413E-01         2.98071E+01         1.00000E+00         9.75927E-02         2.98069E+01         4.01903E+00         2.57879E+01
+          1.14020E-02         1.64968E-02        -1.22512E-02         7.16309E-01         1.25585E+00         7.16414E-01         2.93504E+01         1.00000E+00         9.74889E-02         2.93502E+01         3.77962E+00         2.55706E+01
+          1.14020E-02         1.66666E-02        -1.24282E-02         7.16307E-01         1.26652E+00         7.16415E-01         2.88755E+01         1.00000E+00         9.73934E-02         2.88754E+01         3.55074E+00         2.53246E+01
+          1.14020E-02         1.68364E-02        -1.26070E-02         7.16305E-01         1.27719E+00         7.16416E-01         2.83825E+01         1.00000E+00         9.73050E-02         2.83823E+01         3.33234E+00         2.50500E+01
+          1.14020E-02         1.70063E-02        -1.27875E-02         7.16303E-01         1.28786E+00         7.16417E-01         2.78715E+01         1.00000E+00         9.72223E-02         2.78714E+01         3.12437E+00         2.47470E+01
+          1.14020E-02         1.71761E-02        -1.29699E-02         7.16301E-01         1.29853E+00         7.16418E-01         2.73431E+01         1.00000E+00         9.71442E-02         2.73430E+01         2.92673E+00         2.44163E+01
+          1.14020E-02         1.73459E-02        -1.31541E-02         7.16299E-01         1.30920E+00         7.16420E-01         2.67980E+01         1.00000E+00         9.70693E-02         2.67978E+01         2.73930E+00         2.40585E+01
+          1.14020E-02         1.75158E-02        -1.33401E-02         7.16297E-01         1.31987E+00         7.16421E-01         2.62368E+01         1.00000E+00         9.69965E-02         2.62367E+01         2.56194E+00         2.36747E+01
+          1.14020E-02         1.76856E-02        -1.35280E-02         7.16294E-01         1.33054E+00         7.16422E-01         2.56606E+01         1.00000E+00         9.69246E-02         2.56605E+01         2.39449E+00         2.32660E+01
+          1.14020E-02         1.78554E-02        -1.37176E-02         7.16292E-01         1.34121E+00         7.16424E-01         2.50705E+01         1.00000E+00         9.68525E-02         2.50704E+01         2.23676E+00         2.28337E+01
+          1.14020E-02         1.80252E-02        -1.39090E-02         7.16290E-01         1.35188E+00         7.16425E-01         2.44677E+01         1.00000E+00         9.67790E-02         2.44676E+01         2.08854E+00         2.23791E+01
+          1.14020E-02         1.81951E-02        -1.41023E-02         7.16288E-01         1.36255E+00         7.16427E-01         2.38535E+01         1.00000E+00         9.67032E-02         2.38535E+01         1.94963E+00         2.19039E+01
+          1.14020E-02         1.83649E-02        -1.42974E-02         7.16286E-01         1.37322E+00         7.16428E-01         2.32295E+01         1.00000E+00         9.66239E-02         2.32295E+01         1.81978E+00         2.14097E+01
+          1.14020E-02         1.85347E-02        -1.44943E-02         7.16283E-01         1.38389E+00         7.16430E-01         2.25971E+01         1.00000E+00         9.65402E-02         2.25971E+01         1.69873E+00         2.08983E+01
+          1.14020E-02         1.87045E-02        -1.46930E-02         7.16281E-01         1.39457E+00         7.16432E-01         2.19579E+01         1.00000E+00         9.64512E-02         2.19579E+01         1.58622E+00         2.03717E+01
+          1.14020E-02         1.88744E-02        -1.48935E-02         7.16279E-01         1.40524E+00         7.16434E-01         2.13135E+01         1.00000E+00         9.63558E-02         2.13135E+01         1.48197E+00         1.98316E+01
+          1.14020E-02         1.90442E-02        -1.50958E-02         7.16277E-01         1.41591E+00         7.16436E-01         2.06657E+01         1.00000E+00         9.62532E-02         2.06658E+01         1.38570E+00         1.92801E+01
+          1.14020E-02         1.92140E-02        -1.53000E-02         7.16274E-01         1.42658E+00         7.16438E-01         2.00162E+01         1.00000E+00         9.61425E-02         2.00163E+01         1.29709E+00         1.87192E+01
+          1.14020E-02         1.93839E-02        -1.55059E-02         7.16272E-01         1.43725E+00         7.16440E-01         1.93667E+01         1.00000E+00         9.60229E-02         1.93668E+01         1.21586E+00         1.81509E+01
+          1.14020E-02         1.95537E-02        -1.57137E-02         7.16270E-01         1.44792E+00         7.16442E-01         1.87190E+01         1.00000E+00         9.58938E-02         1.87191E+01         1.14167E+00         1.75774E+01
+          1.14020E-02         1.97235E-02        -1.59233E-02         7.16267E-01         1.45859E+00         7.16444E-01         1.80748E+01         1.00000E+00         9.57542E-02         1.80749E+01         1.07422E+00         1.70007E+01
+          1.14020E-02         1.98933E-02        -1.61347E-02         7.16265E-01         1.46926E+00         7.16446E-01         1.74358E+01         1.00000E+00         9.56035E-02         1.74360E+01         1.01318E+00         1.64228E+01
+          1.14020E-02         2.00632E-02        -1.63479E-02         7.16262E-01         1.47993E+00         7.16449E-01         1.68038E+01         1.00000E+00         9.54411E-02         1.68040E+01         9.58238E-01         1.58457E+01
+          1.14020E-02         2.02330E-02        -1.65629E-02         7.16260E-01         1.49060E+00         7.16451E-01         1.61804E+01         1.00000E+00         9.52663E-02         1.61806E+01         9.09056E-01         1.52715E+01
+          1.14020E-02         2.04028E-02        -1.67797E-02         7.16257E-01         1.50127E+00         7.16454E-01         1.55672E+01         1.00000E+00         9.50785E-02         1.55674E+01         8.65314E-01         1.47021E+01
+          1.14020E-02         2.05726E-02        -1.69984E-02         7.16255E-01         1.51194E+00         7.16457E-01         1.49658E+01         1.00000E+00         9.48773E-02         1.49660E+01         8.26687E-01         1.41393E+01
+          1.14020E-02         2.07425E-02        -1.72188E-02         7.16252E-01         1.52261E+00         7.16459E-01         1.43777E+01         1.00000E+00         9.46620E-02         1.43779E+01         7.92854E-01         1.35850E+01
+          1.14020E-02         2.09123E-02        -1.74411E-02         7.16250E-01         1.53328E+00         7.16462E-01         1.38042E+01         1.00000E+00         9.44323E-02         1.38044E+01         7.63495E-01         1.30409E+01
+          1.14020E-02         2.10821E-02        -1.76652E-02         7.16247E-01         1.54395E+00         7.16465E-01         1.32468E+01         1.00000E+00         9.41877E-02         1.32471E+01         7.38298E-01         1.25088E+01
+          1.14020E-02         2.12520E-02        -1.78911E-02         7.16245E-01         1.55462E+00         7.16468E-01         1.27068E+01         1.00000E+00         9.39277E-02         1.27070E+01         7.16953E-01         1.19900E+01
+          1.14020E-02         2.14218E-02        -1.81188E-02         7.16242E-01         1.56529E+00         7.16471E-01         1.21852E+01         1.00000E+00         9.36521E-02         1.21854E+01         6.99157E-01         1.14863E+01
+          1.14020E-02         2.15916E-02        -1.83483E-02         7.16240E-01         1.57596E+00         7.16474E-01         1.16832E+01         1.00000E+00         9.33604E-02         1.16834E+01         6.84613E-01         1.09988E+01
+          1.14020E-02         2.17614E-02        -1.85797E-02         7.16237E-01         1.58664E+00         7.16478E-01         1.12017E+01         1.00000E+00         9.30525E-02         1.12019E+01         6.73033E-01         1.05289E+01
+          1.14020E-02         2.19313E-02        -1.88128E-02         7.16234E-01         1.59731E+00         7.16481E-01         1.07417E+01         1.00000E+00         9.27281E-02         1.07419E+01         6.64137E-01         1.00778E+01
+          1.14020E-02         2.21011E-02        -1.90478E-02         7.16232E-01         1.60798E+00         7.16485E-01         1.03038E+01         1.00000E+00         9.23868E-02         1.03041E+01         6.57654E-01         9.64645E+00
+          1.14020E-02         2.22709E-02        -1.92846E-02         7.16229E-01         1.61865E+00         7.16488E-01         9.88889E+00         1.00000E+00         9.20287E-02         9.88917E+00         6.53320E-01         9.23585E+00
+          1.14020E-02         2.24407E-02        -1.95232E-02         7.16226E-01         1.62932E+00         7.16492E-01         9.49741E+00         1.00000E+00         9.16534E-02         9.49769E+00         6.50884E-01         8.84680E+00
+          1.14020E-02         2.26106E-02        -1.97636E-02         7.16223E-01         1.63999E+00         7.16496E-01         9.12984E+00         1.00000E+00         9.12610E-02         9.13012E+00         6.50103E-01         8.48002E+00
+          1.14020E-02         2.27804E-02        -2.00058E-02         7.16221E-01         1.65066E+00         7.16500E-01         8.78653E+00         1.00000E+00         9.08512E-02         8.78681E+00         6.50747E-01         8.13607E+00
+          1.14020E-02         2.29502E-02        -2.02498E-02         7.16218E-01         1.66133E+00         7.16504E-01         8.46773E+00         1.00000E+00         9.04240E-02         8.46802E+00         6.52595E-01         7.81542E+00
+          1.14020E-02         2.31201E-02        -2.04957E-02         7.16215E-01         1.67200E+00         7.16508E-01         8.17358E+00         1.00000E+00         8.99795E-02         8.17387E+00         6.55437E-01         7.51843E+00
+          1.14020E-02         2.32899E-02        -2.07433E-02         7.16212E-01         1.68267E+00         7.16513E-01         7.90411E+00         1.00000E+00         8.95176E-02         7.90440E+00         6.59076E-01         7.24532E+00
+          1.14020E-02         2.34597E-02        -2.09928E-02         7.16209E-01         1.69334E+00         7.16517E-01         7.65926E+00         1.00000E+00         8.90383E-02         7.65955E+00         6.63326E-01         6.99622E+00
+          1.14020E-02         2.36295E-02        -2.12441E-02         7.16206E-01         1.70401E+00         7.16521E-01         7.43887E+00         1.00000E+00         8.85417E-02         7.43915E+00         6.68012E-01         6.77114E+00
+          1.14020E-02         2.37994E-02        -2.14972E-02         7.16204E-01         1.71468E+00         7.16526E-01         7.24267E+00         1.00000E+00         8.80278E-02         7.24295E+00         6.72971E-01         6.56998E+00
+          1.14020E-02         2.39692E-02        -2.17521E-02         7.16201E-01         1.72535E+00         7.16531E-01         7.07030E+00         1.00000E+00         8.74969E-02         7.07058E+00         6.78051E-01         6.39253E+00
+          1.14020E-02         2.41390E-02        -2.20089E-02         7.16198E-01         1.73602E+00         7.16536E-01         6.92133E+00         1.00000E+00         8.69490E-02         6.92161E+00         6.83113E-01         6.23849E+00
+          1.14020E-02         2.43088E-02        -2.22674E-02         7.16195E-01         1.74669E+00         7.16541E-01         6.79524E+00         1.00000E+00         8.63843E-02         6.79551E+00         6.88028E-01         6.10748E+00
+          1.14020E-02         2.44787E-02        -2.25278E-02         7.16192E-01         1.75736E+00         7.16546E-01         6.69140E+00         1.00000E+00         8.58029E-02         6.69167E+00         6.92679E-01         5.99899E+00
+          1.14020E-02         2.46485E-02        -2.27899E-02         7.16189E-01         1.76804E+00         7.16551E-01         6.60916E+00         1.00000E+00         8.52052E-02         6.60942E+00         6.96959E-01         5.91246E+00
+          1.14020E-02         2.48183E-02        -2.30539E-02         7.16186E-01         1.77871E+00         7.16557E-01         6.54775E+00         1.00000E+00         8.45912E-02         6.54800E+00         7.00774E-01         5.84723E+00
+          1.14020E-02         2.49882E-02        -2.33197E-02         7.16183E-01         1.78938E+00         7.16562E-01         6.50637E+00         1.00000E+00         8.39613E-02         6.50661E+00         7.04039E-01         5.80257E+00
+          1.14020E-02         2.51580E-02        -2.35873E-02         7.16180E-01         1.80005E+00         7.16568E-01         6.48414E+00         1.00000E+00         8.33157E-02         6.48437E+00         7.06679E-01         5.77769E+00
+          1.14020E-02         2.53278E-02        -2.38567E-02         7.16177E-01         1.81072E+00         7.16574E-01         6.48013E+00         1.00000E+00         8.26547E-02         6.48036E+00         7.08630E-01         5.77173E+00
+          1.14020E-02         2.54976E-02        -2.41280E-02         7.16174E-01         1.82139E+00         7.16580E-01         6.49338E+00         1.00000E+00         8.19786E-02         6.49360E+00         7.09837E-01         5.78376E+00
+          1.14020E-02         2.56675E-02        -2.44010E-02         7.16170E-01         1.83206E+00         7.16586E-01         6.52288E+00         1.00000E+00         8.12877E-02         6.52308E+00         7.10255E-01         5.81283E+00
+          1.14020E-02         2.58373E-02        -2.46759E-02         7.16167E-01         1.84273E+00         7.16592E-01         6.56757E+00         1.00000E+00         8.05825E-02         6.56776E+00         7.09847E-01         5.85792E+00
+          1.14020E-02         2.60071E-02        -2.49526E-02         7.16164E-01         1.85340E+00         7.16599E-01         6.62637E+00         1.00000E+00         7.98631E-02         6.62656E+00         7.08584E-01         5.91797E+00
+          1.14020E-02         2.61769E-02        -2.52311E-02         7.16161E-01         1.86407E+00         7.16605E-01         6.69819E+00         1.00000E+00         7.91300E-02         6.69836E+00         7.06448E-01         5.99191E+00
+          1.15718E-02         8.72665E-04        -3.84806E-03         7.27077E-01         2.74155E-01         7.27087E-01         4.43209E+02         1.00000E+00         2.14904E-01         4.43210E+02         1.30285E+01         4.30181E+02
+          1.15718E-02         1.04249E-03        -3.85828E-03         7.27077E-01         2.84826E-01         7.27087E-01         4.34063E+02         1.00000E+00         2.12504E-01         4.34063E+02         1.32828E+01         4.20780E+02
+          1.15718E-02         1.21232E-03        -3.87031E-03         7.27077E-01         2.95496E-01         7.27087E-01         4.24754E+02         1.00000E+00         2.10055E-01         4.24754E+02         1.35380E+01         4.11216E+02
+          1.15718E-02         1.38215E-03        -3.88415E-03         7.27076E-01         3.06167E-01         7.27087E-01         4.15300E+02         1.00000E+00         2.07559E-01         4.15300E+02         1.37933E+01         4.01507E+02
+          1.15718E-02         1.55197E-03        -3.89980E-03         7.27076E-01         3.16838E-01         7.27087E-01         4.05719E+02         1.00000E+00         2.05022E-01         4.05720E+02         1.40480E+01         3.91672E+02
+          1.15718E-02         1.72180E-03        -3.91727E-03         7.27076E-01         3.27508E-01         7.27087E-01         3.96029E+02         1.00000E+00         2.02448E-01         3.96029E+02         1.43013E+01         3.81728E+02
+          1.15718E-02         1.89163E-03        -3.93655E-03         7.27076E-01         3.38179E-01         7.27086E-01         3.86247E+02         1.00000E+00         1.99840E-01         3.86247E+02         1.45523E+01         3.71695E+02
+          1.15718E-02         2.06146E-03        -3.95764E-03         7.27076E-01         3.48849E-01         7.27086E-01         3.76390E+02         1.00000E+00         1.97203E-01         3.76391E+02         1.48002E+01         3.61590E+02
+          1.15718E-02         2.23128E-03        -3.98054E-03         7.27075E-01         3.59520E-01         7.27086E-01         3.66477E+02         1.00000E+00         1.94540E-01         3.66477E+02         1.50444E+01         3.51433E+02
+          1.15718E-02         2.40111E-03        -4.00525E-03         7.27075E-01         3.70190E-01         7.27086E-01         3.56523E+02         1.00000E+00         1.91857E-01         3.56524E+02         1.52840E+01         3.41240E+02
+          1.15718E-02         2.57094E-03        -4.03178E-03         7.27075E-01         3.80861E-01         7.27086E-01         3.46547E+02         1.00000E+00         1.89156E-01         3.46548E+02         1.55182E+01         3.31029E+02
+          1.15718E-02         2.74077E-03        -4.06011E-03         7.27074E-01         3.91532E-01         7.27086E-01         3.36565E+02         1.00000E+00         1.86441E-01         3.36565E+02         1.57465E+01         3.20819E+02
+          1.15718E-02         2.91059E-03        -4.09026E-03         7.27074E-01         4.02202E-01         7.27086E-01         3.26593E+02         1.00000E+00         1.83718E-01         3.26594E+02         1.59680E+01         3.10626E+02
+          1.15718E-02         3.08042E-03        -4.12223E-03         7.27074E-01         4.12873E-01         7.27085E-01         3.16648E+02         1.00000E+00         1.80989E-01         3.16648E+02         1.61820E+01         3.00466E+02
+          1.15718E-02         3.25025E-03        -4.15600E-03         7.27073E-01         4.23543E-01         7.27085E-01         3.06744E+02         1.00000E+00         1.78258E-01         3.06745E+02         1.63880E+01         2.90357E+02
+          1.15718E-02         3.42008E-03        -4.19159E-03         7.27073E-01         4.34214E-01         7.27085E-01         2.96898E+02         1.00000E+00         1.75529E-01         2.96899E+02         1.65852E+01         2.80314E+02
+          1.15718E-02         3.58990E-03        -4.22898E-03         7.27072E-01         4.44884E-01         7.27085E-01         2.87125E+02         1.00000E+00         1.72806E-01         2.87125E+02         1.67730E+01         2.70352E+02
+          1.15718E-02         3.75973E-03        -4.26819E-03         7.27072E-01         4.55555E-01         7.27084E-01         2.77437E+02         1.00000E+00         1.70092E-01         2.77438E+02         1.69510E+01         2.60487E+02
+          1.15718E-02         3.92956E-03        -4.30922E-03         7.27071E-01         4.66225E-01         7.27084E-01         2.67851E+02         1.00000E+00         1.67390E-01         2.67851E+02         1.71184E+01         2.50733E+02
+          1.15718E-02         4.09939E-03        -4.35205E-03         7.27071E-01         4.76896E-01         7.27084E-01         2.58377E+02         1.00000E+00         1.64705E-01         2.58378E+02         1.72749E+01         2.41103E+02
+          1.15718E-02         4.26921E-03        -4.39670E-03         7.27070E-01         4.87567E-01         7.27084E-01         2.49030E+02         1.00000E+00         1.62039E-01         2.49031E+02         1.74198E+01         2.31611E+02
+          1.15718E-02         4.43904E-03        -4.44315E-03         7.27070E-01         4.98237E-01         7.27083E-01         2.39821E+02         1.00000E+00         1.59395E-01         2.39822E+02         1.75528E+01         2.22269E+02
+          1.15718E-02         4.60887E-03        -4.49143E-03         7.27069E-01         5.08908E-01         7.27083E-01         2.30763E+02         1.00000E+00         1.56776E-01         2.30763E+02         1.76735E+01         2.13089E+02
+          1.15718E-02         4.77869E-03        -4.54151E-03         7.27069E-01         5.19578E-01         7.27083E-01         2.21864E+02         1.00000E+00         1.54185E-01         2.21865E+02         1.77814E+01         2.04083E+02
+          1.15718E-02         4.94852E-03        -4.59340E-03         7.27068E-01         5.30249E-01         7.27083E-01         2.13136E+02         1.00000E+00         1.51625E-01         2.13137E+02         1.78763E+01         1.95261E+02
+          1.15718E-02         5.11835E-03        -4.64711E-03         7.27068E-01         5.40919E-01         7.27082E-01         2.04589E+02         1.00000E+00         1.49099E-01         2.04589E+02         1.79577E+01         1.86632E+02
+          1.15718E-02         5.28818E-03        -4.70263E-03         7.27067E-01         5.51590E-01         7.27082E-01         1.96230E+02         1.00000E+00         1.46608E-01         1.96231E+02         1.80256E+01         1.78205E+02
+          1.15718E-02         5.45800E-03        -4.75996E-03         7.27066E-01         5.62261E-01         7.27082E-01         1.88069E+02         1.00000E+00         1.44155E-01         1.88069E+02         1.80795E+01         1.69989E+02
+          1.15718E-02         5.62783E-03        -4.81910E-03         7.27066E-01         5.72931E-01         7.27082E-01         1.80111E+02         1.00000E+00         1.41742E-01         1.80112E+02         1.81194E+01         1.61992E+02
+          1.15718E-02         5.79766E-03        -4.88006E-03         7.27065E-01         5.83602E-01         7.27081E-01         1.72365E+02         1.00000E+00         1.39372E-01         1.72365E+02         1.81451E+01         1.54220E+02
+          1.15718E-02         5.96749E-03        -4.94282E-03         7.27064E-01         5.94272E-01         7.27081E-01         1.64836E+02         1.00000E+00         1.37045E-01         1.64836E+02         1.81565E+01         1.46679E+02
+          1.15718E-02         6.13731E-03        -5.00740E-03         7.27063E-01         6.04943E-01         7.27081E-01         1.57528E+02         1.00000E+00         1.34764E-01         1.57529E+02         1.81535E+01         1.39375E+02
+          1.15718E-02         6.30714E-03        -5.07380E-03         7.27063E-01         6.15613E-01         7.27080E-01         1.50448E+02         1.00000E+00         1.32530E-01         1.50448E+02         1.81360E+01         1.32312E+02
+          1.15718E-02         6.47697E-03        -5.14200E-03         7.27062E-01         6.26284E-01         7.27080E-01         1.43597E+02         1.00000E+00         1.30344E-01         1.43597E+02         1.81042E+01         1.25493E+02
+          1.15718E-02         6.64680E-03        -5.21201E-03         7.27061E-01         6.36955E-01         7.27080E-01         1.36980E+02         1.00000E+00         1.28208E-01         1.36981E+02         1.80580E+01         1.18923E+02
+          1.15718E-02         6.81662E-03        -5.28384E-03         7.27060E-01         6.47625E-01         7.27079E-01         1.30599E+02         1.00000E+00         1.26122E-01         1.30600E+02         1.79975E+01         1.12602E+02
+          1.15718E-02         6.98645E-03        -5.35748E-03         7.27059E-01         6.58296E-01         7.27079E-01         1.24456E+02         1.00000E+00         1.24088E-01         1.24456E+02         1.79228E+01         1.06533E+02
+          1.15718E-02         7.15628E-03        -5.43294E-03         7.27058E-01         6.68966E-01         7.27079E-01         1.18551E+02         1.00000E+00         1.22106E-01         1.18551E+02         1.78342E+01         1.00717E+02
+          1.15718E-02         7.32611E-03        -5.51020E-03         7.27058E-01         6.79637E-01         7.27078E-01         1.12885E+02         1.00000E+00         1.20177E-01         1.12885E+02         1.77317E+01         9.51534E+01
+          1.15718E-02         7.49593E-03        -5.58928E-03         7.27057E-01         6.90307E-01         7.27078E-01         1.07458E+02         1.00000E+00         1.18302E-01         1.07458E+02         1.76157E+01         8.98423E+01
+          1.15718E-02         7.66576E-03        -5.67017E-03         7.27056E-01         7.00978E-01         7.27078E-01         1.02268E+02         1.00000E+00         1.16480E-01         1.02269E+02         1.74863E+01         8.47822E+01
+          1.15718E-02         7.83559E-03        -5.75287E-03         7.27055E-01         7.11649E-01         7.27078E-01         9.73154E+01         1.00000E+00         1.14712E-01         9.73155E+01         1.73439E+01         7.99716E+01
+          1.15718E-02         8.00542E-03        -5.83738E-03         7.27054E-01         7.22319E-01         7.27077E-01         9.25966E+01         1.00000E+00         1.12998E-01         9.25968E+01         1.71888E+01         7.54080E+01
+          1.15718E-02         8.17524E-03        -5.92371E-03         7.27053E-01         7.32990E-01         7.27077E-01         8.81096E+01         1.00000E+00         1.11338E-01         8.81097E+01         1.70213E+01         7.10884E+01
+          1.15718E-02         8.34507E-03        -6.01184E-03         7.27052E-01         7.43660E-01         7.27077E-01         8.38511E+01         1.00000E+00         1.09732E-01         8.38512E+01         1.68417E+01         6.70095E+01
+          1.15718E-02         8.51490E-03        -6.10179E-03         7.27051E-01         7.54331E-01         7.27076E-01         7.98175E+01         1.00000E+00         1.08179E-01         7.98176E+01         1.66506E+01         6.31670E+01
+          1.15718E-02         8.68473E-03        -6.19355E-03         7.27050E-01         7.65001E-01         7.27076E-01         7.60048E+01         1.00000E+00         1.06680E-01         7.60048E+01         1.64483E+01         5.95565E+01
+          1.15718E-02         8.85455E-03        -6.28713E-03         7.27049E-01         7.75672E-01         7.27076E-01         7.24083E+01         1.00000E+00         1.05234E-01         7.24083E+01         1.62353E+01         5.61730E+01
+          1.15718E-02         9.02438E-03        -6.38252E-03         7.27047E-01         7.86343E-01         7.27075E-01         6.90230E+01         1.00000E+00         1.03841E-01         6.90231E+01         1.60120E+01         5.30111E+01
+          1.15718E-02         9.19421E-03        -6.47971E-03         7.27046E-01         7.97013E-01         7.27075E-01         6.58437E+01         1.00000E+00         1.02499E-01         6.58438E+01         1.57790E+01         5.00648E+01
+          1.15718E-02         9.36403E-03        -6.57873E-03         7.27045E-01         8.07684E-01         7.27075E-01         6.28646E+01         1.00000E+00         1.01209E-01         6.28647E+01         1.55366E+01         4.73280E+01
+          1.15718E-02         9.53386E-03        -6.67955E-03         7.27044E-01         8.18354E-01         7.27075E-01         6.00797E+01         1.00000E+00         9.99688E-02         6.00797E+01         1.52855E+01         4.47942E+01
+          1.15718E-02         9.70369E-03        -6.78219E-03         7.27043E-01         8.29025E-01         7.27074E-01         5.74826E+01         1.00000E+00         9.87788E-02         5.74826E+01         1.50262E+01         4.24564E+01
+          1.15718E-02         9.87352E-03        -6.88663E-03         7.27042E-01         8.39695E-01         7.27074E-01         5.50666E+01         1.00000E+00         9.76378E-02         5.50666E+01         1.47592E+01         4.03074E+01
+          1.15718E-02         1.00433E-02        -6.99289E-03         7.27040E-01         8.50366E-01         7.27074E-01         5.28251E+01         1.00000E+00         9.65450E-02         5.28250E+01         1.44851E+01         3.83400E+01
+          1.15718E-02         1.02132E-02        -7.10097E-03         7.27039E-01         8.61037E-01         7.27074E-01         5.07508E+01         1.00000E+00         9.54995E-02         5.07508E+01         1.42044E+01         3.65464E+01
+          1.15718E-02         1.03830E-02        -7.21085E-03         7.27038E-01         8.71707E-01         7.27074E-01         4.88367E+01         1.00000E+00         9.45003E-02         4.88367E+01         1.39176E+01         3.49190E+01
+          1.15718E-02         1.05528E-02        -7.32255E-03         7.27037E-01         8.82378E-01         7.27073E-01         4.70754E+01         1.00000E+00         9.35467E-02         4.70753E+01         1.36255E+01         3.34498E+01
+          1.15718E-02         1.07227E-02        -7.43606E-03         7.27035E-01         8.93048E-01         7.27073E-01         4.54593E+01         1.00000E+00         9.26375E-02         4.54592E+01         1.33285E+01         3.21307E+01
+          1.15718E-02         1.08925E-02        -7.55138E-03         7.27034E-01         9.03719E-01         7.27073E-01         4.39810E+01         1.00000E+00         9.17717E-02         4.39809E+01         1.30272E+01         3.09537E+01
+          1.15718E-02         1.10623E-02        -7.66851E-03         7.27033E-01         9.14389E-01         7.27073E-01         4.26329E+01         1.00000E+00         9.09485E-02         4.26328E+01         1.27222E+01         2.99106E+01
+          1.15718E-02         1.12321E-02        -7.78746E-03         7.27031E-01         9.25060E-01         7.27073E-01         4.14074E+01         1.00000E+00         9.01666E-02         4.14072E+01         1.24141E+01         2.89931E+01
+          1.15718E-02         1.14020E-02        -7.90822E-03         7.27030E-01         9.35731E-01         7.27073E-01         4.02968E+01         1.00000E+00         8.94252E-02         4.02966E+01         1.21034E+01         2.81932E+01
+          1.15718E-02         1.15718E-02        -8.03079E-03         7.27028E-01         9.46401E-01         7.27073E-01         3.92936E+01         1.00000E+00         8.87231E-02         3.92934E+01         1.17907E+01         2.75027E+01
+          1.15718E-02         1.17416E-02        -8.15517E-03         7.27027E-01         9.57072E-01         7.27073E-01         3.83902E+01         1.00000E+00         8.80593E-02         3.83901E+01         1.14765E+01         2.69135E+01
+          1.15718E-02         1.19114E-02        -8.28137E-03         7.27026E-01         9.67742E-01         7.27073E-01         3.75793E+01         1.00000E+00         8.74327E-02         3.75792E+01         1.11615E+01         2.64177E+01
+          1.15718E-02         1.20813E-02        -8.40938E-03         7.27024E-01         9.78413E-01         7.27073E-01         3.68535E+01         1.00000E+00         8.68422E-02         3.68534E+01         1.08460E+01         2.60074E+01
+          1.15718E-02         1.22511E-02        -8.53920E-03         7.27023E-01         9.89083E-01         7.27073E-01         3.62057E+01         1.00000E+00         8.62867E-02         3.62055E+01         1.05307E+01         2.56748E+01
+          1.15718E-02         1.24209E-02        -8.67083E-03         7.27021E-01         9.99754E-01         7.27073E-01         3.56287E+01         1.00000E+00         8.57652E-02         3.56286E+01         1.02160E+01         2.54125E+01
+          1.15718E-02         1.25908E-02        -8.80428E-03         7.27019E-01         1.01042E+00         7.27073E-01         3.51158E+01         1.00000E+00         8.52765E-02         3.51156E+01         9.90249E+00         2.52131E+01
+          1.15718E-02         1.27606E-02        -8.93954E-03         7.27018E-01         1.02110E+00         7.27073E-01         3.46602E+01         1.00000E+00         8.48195E-02         3.46600E+01         9.59060E+00         2.50695E+01
+          1.15718E-02         1.29304E-02        -9.07661E-03         7.27016E-01         1.03177E+00         7.27073E-01         3.42556E+01         1.00000E+00         8.43932E-02         3.42554E+01         9.28080E+00         2.49746E+01
+          1.15718E-02         1.31002E-02        -9.21549E-03         7.27015E-01         1.04244E+00         7.27073E-01         3.38955E+01         1.00000E+00         8.39963E-02         3.38953E+01         8.97353E+00         2.49218E+01
+          1.15718E-02         1.32701E-02        -9.35619E-03         7.27013E-01         1.05311E+00         7.27073E-01         3.35741E+01         1.00000E+00         8.36279E-02         3.35739E+01         8.66924E+00         2.49046E+01
+          1.15718E-02         1.34399E-02        -9.49870E-03         7.27011E-01         1.06378E+00         7.27073E-01         3.32856E+01         1.00000E+00         8.32867E-02         3.32853E+01         8.36832E+00         2.49170E+01
+          1.15718E-02         1.36097E-02        -9.64302E-03         7.27010E-01         1.07445E+00         7.27074E-01         3.30244E+01         1.00000E+00         8.29716E-02         3.30242E+01         8.07118E+00         2.49530E+01
+          1.15718E-02         1.37795E-02        -9.78915E-03         7.27008E-01         1.08512E+00         7.27074E-01         3.27854E+01         1.00000E+00         8.26815E-02         3.27852E+01         7.77817E+00         2.50071E+01
+          1.15718E-02         1.39494E-02        -9.93710E-03         7.27006E-01         1.09579E+00         7.27074E-01         3.25637E+01         1.00000E+00         8.24153E-02         3.25635E+01         7.48965E+00         2.50738E+01
+          1.15718E-02         1.41192E-02        -1.00869E-02         7.27005E-01         1.10646E+00         7.27075E-01         3.23545E+01         1.00000E+00         8.21719E-02         3.23543E+01         7.20594E+00         2.51484E+01
+          1.15718E-02         1.42890E-02        -1.02384E-02         7.27003E-01         1.11713E+00         7.27075E-01         3.21536E+01         1.00000E+00         8.19500E-02         3.21534E+01         6.92736E+00         2.52260E+01
+          1.15718E-02         1.44589E-02        -1.03918E-02         7.27001E-01         1.12780E+00         7.27075E-01         3.19569E+01         1.00000E+00         8.17486E-02         3.19566E+01         6.65419E+00         2.53025E+01
+          1.15718E-02         1.46287E-02        -1.05470E-02         7.26999E-01         1.13847E+00         7.27076E-01         3.17605E+01         1.00000E+00         8.15665E-02         3.17603E+01         6.38669E+00         2.53736E+01
+          1.15718E-02         1.47985E-02        -1.07040E-02         7.26997E-01         1.14914E+00         7.27076E-01         3.15612E+01         1.00000E+00         8.14026E-02         3.15610E+01         6.12509E+00         2.54359E+01
+          1.15718E-02         1.49683E-02        -1.08628E-02         7.26996E-01         1.15981E+00         7.27077E-01         3.13556E+01         1.00000E+00         8.12558E-02         3.13554E+01         5.86963E+00         2.54858E+01
+          1.15718E-02         1.51382E-02        -1.10235E-02         7.26994E-01         1.17048E+00         7.27077E-01         3.11411E+01         1.00000E+00         8.11248E-02         3.11409E+01         5.62050E+00         2.55204E+01
+          1.15718E-02         1.53080E-02        -1.11859E-02         7.26992E-01         1.18115E+00         7.27078E-01         3.09149E+01         1.00000E+00         8.10087E-02         3.09148E+01         5.37787E+00         2.55369E+01
+          1.15718E-02         1.54778E-02        -1.13502E-02         7.26990E-01         1.19182E+00         7.27079E-01         3.06750E+01         1.00000E+00         8.09062E-02         3.06748E+01         5.14189E+00         2.55329E+01
+          1.15718E-02         1.56476E-02        -1.15163E-02         7.26988E-01         1.20249E+00         7.27079E-01         3.04193E+01         1.00000E+00         8.08164E-02         3.04191E+01         4.91269E+00         2.55064E+01
+          1.15718E-02         1.58175E-02        -1.16841E-02         7.26986E-01         1.21317E+00         7.27080E-01         3.01461E+01         1.00000E+00         8.07379E-02         3.01460E+01         4.69039E+00         2.54556E+01
+          1.15718E-02         1.59873E-02        -1.18538E-02         7.26984E-01         1.22384E+00         7.27081E-01         2.98541E+01         1.00000E+00         8.06699E-02         2.98540E+01         4.47507E+00         2.53789E+01
+          1.15718E-02         1.61571E-02        -1.20253E-02         7.26982E-01         1.23451E+00         7.27082E-01         2.95422E+01         1.00000E+00         8.06111E-02         2.95420E+01         4.26680E+00         2.52752E+01
+          1.15718E-02         1.63270E-02        -1.21987E-02         7.26980E-01         1.24518E+00         7.27083E-01         2.92094E+01         1.00000E+00         8.05605E-02         2.92093E+01         4.06563E+00         2.51436E+01
+          1.15718E-02         1.64968E-02        -1.23738E-02         7.26978E-01         1.25585E+00         7.27083E-01         2.88552E+01         1.00000E+00         8.05171E-02         2.88551E+01         3.87158E+00         2.49835E+01
+          1.15718E-02         1.66666E-02        -1.25508E-02         7.26976E-01         1.26652E+00         7.27084E-01         2.84792E+01         1.00000E+00         8.04798E-02         2.84791E+01         3.68468E+00         2.47944E+01
+          1.15718E-02         1.68364E-02        -1.27295E-02         7.26974E-01         1.27719E+00         7.27085E-01         2.80813E+01         1.00000E+00         8.04477E-02         2.80812E+01         3.50489E+00         2.45763E+01
+          1.15718E-02         1.70063E-02        -1.29101E-02         7.26972E-01         1.28786E+00         7.27087E-01         2.76616E+01         1.00000E+00         8.04196E-02         2.76615E+01         3.33222E+00         2.43293E+01
+          1.15718E-02         1.71761E-02        -1.30925E-02         7.26970E-01         1.29853E+00         7.27088E-01         2.72203E+01         1.00000E+00         8.03946E-02         2.72202E+01         3.16660E+00         2.40536E+01
+          1.15718E-02         1.73459E-02        -1.32767E-02         7.26968E-01         1.30920E+00         7.27089E-01         2.67580E+01         1.00000E+00         8.03718E-02         2.67579E+01         3.00798E+00         2.37500E+01
+          1.15718E-02         1.75158E-02        -1.34627E-02         7.26966E-01         1.31987E+00         7.27090E-01         2.62754E+01         1.00000E+00         8.03502E-02         2.62753E+01         2.85628E+00         2.34190E+01
+          1.15718E-02         1.76856E-02        -1.36505E-02         7.26963E-01         1.33054E+00         7.27092E-01         2.57732E+01         1.00000E+00         8.03289E-02         2.57731E+01         2.71143E+00         2.30617E+01
+          1.15718E-02         1.78554E-02        -1.38402E-02         7.26961E-01         1.34121E+00         7.27093E-01         2.52525E+01         1.00000E+00         8.03070E-02         2.52525E+01         2.57331E+00         2.26791E+01
+          1.15718E-02         1.80252E-02        -1.40316E-02         7.26959E-01         1.35188E+00         7.27094E-01         2.47145E+01         1.00000E+00         8.02837E-02         2.47144E+01         2.44181E+00         2.22726E+01
+          1.15718E-02         1.81951E-02        -1.42249E-02         7.26957E-01         1.36255E+00         7.27096E-01         2.41603E+01         1.00000E+00         8.02580E-02         2.41602E+01         2.31680E+00         2.18435E+01
+          1.15718E-02         1.83649E-02        -1.44199E-02         7.26954E-01         1.37322E+00         7.27097E-01         2.35914E+01         1.00000E+00         8.02292E-02         2.35914E+01         2.19815E+00         2.13932E+01
+          1.15718E-02         1.85347E-02        -1.46168E-02         7.26952E-01         1.38389E+00         7.27099E-01         2.30093E+01         1.00000E+00         8.01965E-02         2.30093E+01         2.08571E+00         2.09236E+01
+          1.15718E-02         1.87045E-02        -1.48155E-02         7.26950E-01         1.39457E+00         7.27101E-01         2.24156E+01         1.00000E+00         8.01591E-02         2.24156E+01         1.97932E+00         2.04362E+01
+          1.15718E-02         1.88744E-02        -1.50161E-02         7.26948E-01         1.40524E+00         7.27103E-01         2.18118E+01         1.00000E+00         8.01163E-02         2.18118E+01         1.87881E+00         1.99330E+01
+          1.15718E-02         1.90442E-02        -1.52184E-02         7.26945E-01         1.41591E+00         7.27105E-01         2.11998E+01         1.00000E+00         8.00673E-02         2.11998E+01         1.78402E+00         1.94158E+01
+          1.15718E-02         1.92140E-02        -1.54225E-02         7.26943E-01         1.42658E+00         7.27106E-01         2.05812E+01         1.00000E+00         8.00116E-02         2.05812E+01         1.69476E+00         1.88864E+01
+          1.15718E-02         1.93839E-02        -1.56285E-02         7.26940E-01         1.43725E+00         7.27108E-01         1.99578E+01         1.00000E+00         7.99484E-02         1.99579E+01         1.61085E+00         1.83470E+01
+          1.15718E-02         1.95537E-02        -1.58362E-02         7.26938E-01         1.44792E+00         7.27111E-01         1.93315E+01         1.00000E+00         7.98772E-02         1.93316E+01         1.53210E+00         1.77995E+01
+          1.15718E-02         1.97235E-02        -1.60458E-02         7.26936E-01         1.45859E+00         7.27113E-01         1.87041E+01         1.00000E+00         7.97973E-02         1.87042E+01         1.45831E+00         1.72459E+01
+          1.15718E-02         1.98933E-02        -1.62572E-02         7.26933E-01         1.46926E+00         7.27115E-01         1.80774E+01         1.00000E+00         7.97082E-02         1.80775E+01         1.38929E+00         1.66882E+01
+          1.15718E-02         2.00632E-02        -1.64704E-02         7.26931E-01         1.47993E+00         7.27117E-01         1.74531E+01         1.00000E+00         7.96093E-02         1.74532E+01         1.32483E+00         1.61284E+01
+          1.15718E-02         2.02330E-02        -1.66855E-02         7.26928E-01         1.49060E+00         7.27120E-01         1.68332E+01         1.00000E+00         7.95002E-02         1.68333E+01         1.26474E+00         1.55685E+01
+          1.15718E-02         2.04028E-02        -1.69023E-02         7.26926E-01         1.50127E+00         7.27122E-01         1.62192E+01         1.00000E+00         7.93804E-02         1.62193E+01         1.20882E+00         1.50105E+01
+          1.15718E-02         2.05726E-02        -1.71209E-02         7.26923E-01         1.51194E+00         7.27125E-01         1.56130E+01         1.00000E+00         7.92494E-02         1.56131E+01         1.15685E+00         1.44563E+01
+          1.15718E-02         2.07425E-02        -1.73414E-02         7.26921E-01         1.52261E+00         7.27127E-01         1.50161E+01         1.00000E+00         7.91068E-02         1.50162E+01         1.10865E+00         1.39076E+01
+          1.15718E-02         2.09123E-02        -1.75637E-02         7.26918E-01         1.53328E+00         7.27130E-01         1.44302E+01         1.00000E+00         7.89523E-02         1.44303E+01         1.06400E+00         1.33663E+01
+          1.15718E-02         2.10821E-02        -1.77878E-02         7.26915E-01         1.54395E+00         7.27133E-01         1.38568E+01         1.00000E+00         7.87855E-02         1.38569E+01         1.02271E+00         1.28342E+01
+          1.15718E-02         2.12520E-02        -1.80137E-02         7.26913E-01         1.55462E+00         7.27136E-01         1.32972E+01         1.00000E+00         7.86060E-02         1.32974E+01         9.84579E-01         1.23128E+01
+          1.15718E-02         2.14218E-02        -1.82414E-02         7.26910E-01         1.56529E+00         7.27139E-01         1.27530E+01         1.00000E+00         7.84137E-02         1.27532E+01         9.49420E-01         1.18037E+01
+          1.15718E-02         2.15916E-02        -1.84709E-02         7.26908E-01         1.57596E+00         7.27142E-01         1.22253E+01         1.00000E+00         7.82081E-02         1.22255E+01         9.17037E-01         1.13085E+01
+          1.15718E-02         2.17614E-02        -1.87022E-02         7.26905E-01         1.58664E+00         7.27145E-01         1.17154E+01         1.00000E+00         7.79891E-02         1.17156E+01         8.87247E-01         1.08283E+01
+          1.15718E-02         2.19313E-02        -1.89354E-02         7.26902E-01         1.59731E+00         7.27149E-01         1.12243E+01         1.00000E+00         7.77565E-02         1.12245E+01         8.59865E-01         1.03646E+01
+          1.15718E-02         2.21011E-02        -1.91704E-02         7.26899E-01         1.60798E+00         7.27152E-01         1.07530E+01         1.00000E+00         7.75100E-02         1.07532E+01         8.34715E-01         9.91848E+00
+          1.15718E-02         2.22709E-02        -1.94071E-02         7.26897E-01         1.61865E+00         7.27156E-01         1.03025E+01         1.00000E+00         7.72495E-02         1.03026E+01         8.11624E-01         9.49101E+00
+          1.15718E-02         2.24407E-02        -1.96457E-02         7.26894E-01         1.62932E+00         7.27159E-01         9.87338E+00         1.00000E+00         7.69749E-02         9.87357E+00         7.90426E-01         9.08315E+00
+          1.15718E-02         2.26106E-02        -1.98861E-02         7.26891E-01         1.63999E+00         7.27163E-01         9.46648E+00         1.00000E+00         7.66860E-02         9.46668E+00         7.70960E-01         8.69572E+00
+          1.15718E-02         2.27804E-02        -2.01284E-02         7.26888E-01         1.65066E+00         7.27167E-01         9.08233E+00         1.00000E+00         7.63829E-02         9.08252E+00         7.53071E-01         8.32945E+00
+          1.15718E-02         2.29502E-02        -2.03724E-02         7.26886E-01         1.66133E+00         7.27171E-01         8.72138E+00         1.00000E+00         7.60654E-02         8.72157E+00         7.36609E-01         7.98496E+00
+          1.15718E-02         2.31201E-02        -2.06182E-02         7.26883E-01         1.67200E+00         7.27175E-01         8.38399E+00         1.00000E+00         7.57334E-02         8.38419E+00         7.21433E-01         7.66275E+00
+          1.15718E-02         2.32899E-02        -2.08659E-02         7.26880E-01         1.68267E+00         7.27179E-01         8.07041E+00         1.00000E+00         7.53870E-02         8.07061E+00         7.07407E-01         7.36320E+00
+          1.15718E-02         2.34597E-02        -2.11154E-02         7.26877E-01         1.69334E+00         7.27184E-01         7.78079E+00         1.00000E+00         7.50262E-02         7.78099E+00         6.94402E-01         7.08659E+00
+          1.15718E-02         2.36295E-02        -2.13667E-02         7.26874E-01         1.70401E+00         7.27188E-01         7.51517E+00         1.00000E+00         7.46511E-02         7.51537E+00         6.82295E-01         6.83308E+00
+          1.15718E-02         2.37994E-02        -2.16198E-02         7.26871E-01         1.71468E+00         7.27193E-01         7.27350E+00         1.00000E+00         7.42616E-02         7.27369E+00         6.70972E-01         6.60272E+00
+          1.15718E-02         2.39692E-02        -2.18747E-02         7.26868E-01         1.72535E+00         7.27197E-01         7.05561E+00         1.00000E+00         7.38578E-02         7.05581E+00         6.60323E-01         6.39548E+00
+          1.15718E-02         2.41390E-02        -2.21314E-02         7.26865E-01         1.73602E+00         7.27202E-01         6.86126E+00         1.00000E+00         7.34399E-02         6.86146E+00         6.50248E-01         6.21121E+00
+          1.15718E-02         2.43088E-02        -2.23899E-02         7.26862E-01         1.74669E+00         7.27207E-01         6.69011E+00         1.00000E+00         7.30080E-02         6.69030E+00         6.40651E-01         6.04965E+00
+          1.15718E-02         2.44787E-02        -2.26503E-02         7.26859E-01         1.75736E+00         7.27212E-01         6.54174E+00         1.00000E+00         7.25621E-02         6.54192E+00         6.31445E-01         5.91048E+00
+          1.15718E-02         2.46485E-02        -2.29125E-02         7.26856E-01         1.76804E+00         7.27217E-01         6.41563E+00         1.00000E+00         7.21025E-02         6.41581E+00         6.22548E-01         5.79326E+00
+          1.15718E-02         2.48183E-02        -2.31764E-02         7.26853E-01         1.77871E+00         7.27223E-01         6.31120E+00         1.00000E+00         7.16293E-02         6.31137E+00         6.13885E-01         5.69749E+00
+          1.15718E-02         2.49882E-02        -2.34422E-02         7.26850E-01         1.78938E+00         7.27228E-01         6.22778E+00         1.00000E+00         7.11427E-02         6.22796E+00         6.05389E-01         5.62257E+00
+          1.15718E-02         2.51580E-02        -2.37099E-02         7.26847E-01         1.80005E+00         7.27234E-01         6.16467E+00         1.00000E+00         7.06428E-02         6.16484E+00         5.96997E-01         5.56784E+00
+          1.15718E-02         2.53278E-02        -2.39793E-02         7.26844E-01         1.81072E+00         7.27239E-01         6.12106E+00         1.00000E+00         7.01300E-02         6.12122E+00         5.88654E-01         5.53257E+00
+          1.15718E-02         2.54976E-02        -2.42505E-02         7.26841E-01         1.82139E+00         7.27245E-01         6.09611E+00         1.00000E+00         6.96044E-02         6.09627E+00         5.80311E-01         5.51596E+00
+          1.15718E-02         2.56675E-02        -2.45236E-02         7.26838E-01         1.83206E+00         7.27251E-01         6.08893E+00         1.00000E+00         6.90662E-02         6.08908E+00         5.71922E-01         5.51715E+00
+          1.15718E-02         2.58373E-02        -2.47984E-02         7.26834E-01         1.84273E+00         7.27257E-01         6.09856E+00         1.00000E+00         6.85158E-02         6.09871E+00         5.63451E-01         5.53526E+00
+          1.15718E-02         2.60071E-02        -2.50751E-02         7.26831E-01         1.85340E+00         7.27264E-01         6.12404E+00         1.00000E+00         6.79534E-02         6.12418E+00         5.54863E-01         5.56932E+00
+          1.15718E-02         2.61769E-02        -2.53536E-02         7.26828E-01         1.86407E+00         7.27270E-01         6.16435E+00         1.00000E+00         6.73793E-02         6.16448E+00         5.46132E-01         5.61835E+00
+          1.17416E-02         8.72665E-04        -3.97245E-03         7.37747E-01         2.74155E-01         7.37758E-01         4.38299E+02         1.00000E+00         1.67244E-01         4.38300E+02         1.82565E+01         4.20043E+02
+          1.17416E-02         1.04249E-03        -3.98267E-03         7.37747E-01         2.84826E-01         7.37758E-01         4.29205E+02         1.00000E+00         1.65410E-01         4.29206E+02         1.82591E+01         4.10947E+02
+          1.17416E-02         1.21232E-03        -3.99470E-03         7.37747E-01         2.95496E-01         7.37758E-01         4.19949E+02         1.00000E+00         1.63538E-01         4.19949E+02         1.82592E+01         4.01690E+02
+          1.17416E-02         1.38215E-03        -4.00854E-03         7.37747E-01         3.06167E-01         7.37758E-01         4.10546E+02         1.00000E+00         1.61632E-01         4.10547E+02         1.82567E+01         3.92290E+02
+          1.17416E-02         1.55197E-03        -4.02420E-03         7.37747E-01         3.16838E-01         7.37758E-01         4.01016E+02         1.00000E+00         1.59694E-01         4.01016E+02         1.82513E+01         3.82765E+02
+          1.17416E-02         1.72180E-03        -4.04166E-03         7.37747E-01         3.27508E-01         7.37758E-01         3.91374E+02         1.00000E+00         1.57727E-01         3.91375E+02         1.82429E+01         3.73132E+02
+          1.17416E-02         1.89163E-03        -4.06094E-03         7.37746E-01         3.38179E-01         7.37758E-01         3.81640E+02         1.00000E+00         1.55735E-01         3.81640E+02         1.82313E+01         3.63409E+02
+          1.17416E-02         2.06146E-03        -4.08203E-03         7.37746E-01         3.48849E-01         7.37757E-01         3.71829E+02         1.00000E+00         1.53721E-01         3.71829E+02         1.82161E+01         3.53613E+02
+          1.17416E-02         2.23128E-03        -4.10493E-03         7.37746E-01         3.59520E-01         7.37757E-01         3.61960E+02         1.00000E+00         1.51688E-01         3.61960E+02         1.81972E+01         3.43763E+02
+          1.17416E-02         2.40111E-03        -4.12964E-03         7.37746E-01         3.70190E-01         7.37757E-01         3.52048E+02         1.00000E+00         1.49639E-01         3.52049E+02         1.81745E+01         3.33874E+02
+          1.17416E-02         2.57094E-03        -4.15617E-03         7.37745E-01         3.80861E-01         7.37757E-01         3.42112E+02         1.00000E+00         1.47577E-01         3.42113E+02         1.81477E+01         3.23965E+02
+          1.17416E-02         2.74077E-03        -4.18451E-03         7.37745E-01         3.91532E-01         7.37757E-01         3.32168E+02         1.00000E+00         1.45506E-01         3.32168E+02         1.81166E+01         3.14052E+02
+          1.17416E-02         2.91059E-03        -4.21466E-03         7.37745E-01         4.02202E-01         7.37757E-01         3.22232E+02         1.00000E+00         1.43427E-01         3.22232E+02         1.80811E+01         3.04151E+02
+          1.17416E-02         3.08042E-03        -4.24662E-03         7.37744E-01         4.12873E-01         7.37756E-01         3.12320E+02         1.00000E+00         1.41345E-01         3.12320E+02         1.80409E+01         2.94279E+02
+          1.17416E-02         3.25025E-03        -4.28039E-03         7.37744E-01         4.23543E-01         7.37756E-01         3.02447E+02         1.00000E+00         1.39261E-01         3.02448E+02         1.79960E+01         2.84452E+02
+          1.17416E-02         3.42008E-03        -4.31598E-03         7.37743E-01         4.34214E-01         7.37756E-01         2.92630E+02         1.00000E+00         1.37180E-01         2.92630E+02         1.79462E+01         2.74684E+02
+          1.17416E-02         3.58990E-03        -4.35338E-03         7.37743E-01         4.44884E-01         7.37756E-01         2.82882E+02         1.00000E+00         1.35104E-01         2.82883E+02         1.78912E+01         2.64991E+02
+          1.17416E-02         3.75973E-03        -4.39259E-03         7.37742E-01         4.55555E-01         7.37756E-01         2.73219E+02         1.00000E+00         1.33034E-01         2.73219E+02         1.78311E+01         2.55388E+02
+          1.17416E-02         3.92956E-03        -4.43361E-03         7.37742E-01         4.66225E-01         7.37755E-01         2.63653E+02         1.00000E+00         1.30975E-01         2.63653E+02         1.77657E+01         2.45887E+02
+          1.17416E-02         4.09939E-03        -4.47644E-03         7.37741E-01         4.76896E-01         7.37755E-01         2.54198E+02         1.00000E+00         1.28929E-01         2.54198E+02         1.76949E+01         2.36503E+02
+          1.17416E-02         4.26921E-03        -4.52109E-03         7.37741E-01         4.87567E-01         7.37755E-01         2.44867E+02         1.00000E+00         1.26898E-01         2.44867E+02         1.76185E+01         2.27249E+02
+          1.17416E-02         4.43904E-03        -4.56755E-03         7.37740E-01         4.98237E-01         7.37755E-01         2.35672E+02         1.00000E+00         1.24884E-01         2.35672E+02         1.75365E+01         2.18136E+02
+          1.17416E-02         4.60887E-03        -4.61582E-03         7.37740E-01         5.08908E-01         7.37754E-01         2.26624E+02         1.00000E+00         1.22890E-01         2.26625E+02         1.74488E+01         2.09176E+02
+          1.17416E-02         4.77869E-03        -4.66590E-03         7.37739E-01         5.19578E-01         7.37754E-01         2.17735E+02         1.00000E+00         1.20918E-01         2.17735E+02         1.73555E+01         2.00380E+02
+          1.17416E-02         4.94852E-03        -4.71779E-03         7.37739E-01         5.30249E-01         7.37754E-01         2.09015E+02         1.00000E+00         1.18970E-01         2.09015E+02         1.72563E+01         1.91759E+02
+          1.17416E-02         5.11835E-03        -4.77150E-03         7.37738E-01         5.40919E-01         7.37753E-01         2.00472E+02         1.00000E+00         1.17048E-01         2.00472E+02         1.71513E+01         1.83321E+02
+          1.17416E-02         5.28818E-03        -4.82702E-03         7.37737E-01         5.51590E-01         7.37753E-01         1.92117E+02         1.00000E+00         1.15154E-01         1.92117E+02         1.70405E+01         1.75077E+02
+          1.17416E-02         5.45800E-03        -4.88435E-03         7.37737E-01         5.62261E-01         7.37753E-01         1.83957E+02         1.00000E+00         1.13290E-01         1.83957E+02         1.69238E+01         1.67033E+02
+          1.17416E-02         5.62783E-03        -4.94349E-03         7.37736E-01         5.72931E-01         7.37753E-01         1.75999E+02         1.00000E+00         1.11457E-01         1.76000E+02         1.68013E+01         1.59198E+02
+          1.17416E-02         5.79766E-03        -5.00445E-03         7.37735E-01         5.83602E-01         7.37752E-01         1.68252E+02         1.00000E+00         1.09656E-01         1.68252E+02         1.66730E+01         1.51579E+02
+          1.17416E-02         5.96749E-03        -5.06721E-03         7.37735E-01         5.94272E-01         7.37752E-01         1.60720E+02         1.00000E+00         1.07890E-01         1.60720E+02         1.65390E+01         1.44181E+02
+          1.17416E-02         6.13731E-03        -5.13179E-03         7.37734E-01         6.04943E-01         7.37752E-01         1.53409E+02         1.00000E+00         1.06159E-01         1.53409E+02         1.63992E+01         1.37010E+02
+          1.17416E-02         6.30714E-03        -5.19818E-03         7.37733E-01         6.15613E-01         7.37751E-01         1.46324E+02         1.00000E+00         1.04464E-01         1.46324E+02         1.62537E+01         1.30070E+02
+          1.17416E-02         6.47697E-03        -5.26639E-03         7.37732E-01         6.26284E-01         7.37751E-01         1.39468E+02         1.00000E+00         1.02807E-01         1.39469E+02         1.61027E+01         1.23366E+02
+          1.17416E-02         6.64680E-03        -5.33640E-03         7.37731E-01         6.36955E-01         7.37751E-01         1.32846E+02         1.00000E+00         1.01188E-01         1.32846E+02         1.59461E+01         1.16900E+02
+          1.17416E-02         6.81662E-03        -5.40823E-03         7.37731E-01         6.47625E-01         7.37750E-01         1.26460E+02         1.00000E+00         9.96091E-02         1.26460E+02         1.57842E+01         1.10676E+02
+          1.17416E-02         6.98645E-03        -5.48187E-03         7.37730E-01         6.58296E-01         7.37750E-01         1.20311E+02         1.00000E+00         9.80698E-02         1.20311E+02         1.56169E+01         1.04694E+02
+          1.17416E-02         7.15628E-03        -5.55732E-03         7.37729E-01         6.68966E-01         7.37750E-01         1.14401E+02         1.00000E+00         9.65710E-02         1.14401E+02         1.54445E+01         9.89568E+01
+          1.17416E-02         7.32611E-03        -5.63459E-03         7.37728E-01         6.79637E-01         7.37749E-01         1.08731E+02         1.00000E+00         9.51132E-02         1.08731E+02         1.52671E+01         9.34639E+01
+          1.17416E-02         7.49593E-03        -5.71367E-03         7.37727E-01         6.90307E-01         7.37749E-01         1.03300E+02         1.00000E+00         9.36967E-02         1.03300E+02         1.50847E+01         8.82155E+01
+          1.17416E-02         7.66576E-03        -5.79455E-03         7.37726E-01         7.00978E-01         7.37749E-01         9.81081E+01         1.00000E+00         9.23218E-02         9.81082E+01         1.48977E+01         8.32106E+01
+          1.17416E-02         7.83559E-03        -5.87725E-03         7.37725E-01         7.11649E-01         7.37748E-01         9.31538E+01         1.00000E+00         9.09888E-02         9.31539E+01         1.47060E+01         7.84479E+01
+          1.17416E-02         8.00542E-03        -5.96177E-03         7.37724E-01         7.22319E-01         7.37748E-01         8.84353E+01         1.00000E+00         8.96976E-02         8.84354E+01         1.45100E+01         7.39254E+01
+          1.17416E-02         8.17524E-03        -6.04809E-03         7.37723E-01         7.32990E-01         7.37748E-01         8.39502E+01         1.00000E+00         8.84482E-02         8.39503E+01         1.43098E+01         6.96405E+01
+          1.17416E-02         8.34507E-03        -6.13623E-03         7.37722E-01         7.43660E-01         7.37747E-01         7.96957E+01         1.00000E+00         8.72405E-02         7.96957E+01         1.41056E+01         6.55902E+01
+          1.17416E-02         8.51490E-03        -6.22618E-03         7.37721E-01         7.54331E-01         7.37747E-01         7.56682E+01         1.00000E+00         8.60745E-02         7.56682E+01         1.38975E+01         6.17707E+01
+          1.17416E-02         8.68473E-03        -6.31794E-03         7.37720E-01         7.65001E-01         7.37747E-01         7.18639E+01         1.00000E+00         8.49497E-02         7.18639E+01         1.36859E+01         5.81780E+01
+          1.17416E-02         8.85455E-03        -6.41152E-03         7.37719E-01         7.75672E-01         7.37747E-01         6.82784E+01         1.00000E+00         8.38660E-02         6.82785E+01         1.34709E+01         5.48075E+01
+          1.17416E-02         9.02438E-03        -6.50690E-03         7.37718E-01         7.86343E-01         7.37746E-01         6.49070E+01         1.00000E+00         8.28229E-02         6.49070E+01         1.32528E+01         5.16542E+01
+          1.17416E-02         9.19421E-03        -6.60410E-03         7.37716E-01         7.97013E-01         7.37746E-01         6.17444E+01         1.00000E+00         8.18199E-02         6.17444E+01         1.30317E+01         4.87127E+01
+          1.17416E-02         9.36403E-03        -6.70311E-03         7.37715E-01         8.07684E-01         7.37746E-01         5.87851E+01         1.00000E+00         8.08567E-02         5.87851E+01         1.28079E+01         4.59772E+01
+          1.17416E-02         9.53386E-03        -6.80394E-03         7.37714E-01         8.18354E-01         7.37746E-01         5.60232E+01         1.00000E+00         7.99327E-02         5.60232E+01         1.25817E+01         4.34416E+01
+          1.17416E-02         9.70369E-03        -6.90657E-03         7.37713E-01         8.29025E-01         7.37745E-01         5.34525E+01         1.00000E+00         7.90472E-02         5.34526E+01         1.23532E+01         4.10993E+01
+          1.17416E-02         9.87352E-03        -7.01102E-03         7.37712E-01         8.39695E-01         7.37745E-01         5.10666E+01         1.00000E+00         7.81997E-02         5.10666E+01         1.21228E+01         3.89438E+01
+          1.17416E-02         1.00433E-02        -7.11728E-03         7.37710E-01         8.50366E-01         7.37745E-01         4.88586E+01         1.00000E+00         7.73895E-02         4.88586E+01         1.18906E+01         3.69679E+01
+          1.17416E-02         1.02132E-02        -7.22535E-03         7.37709E-01         8.61037E-01         7.37745E-01         4.68216E+01         1.00000E+00         7.66160E-02         4.68216E+01         1.16570E+01         3.51646E+01
+          1.17416E-02         1.03830E-02        -7.33524E-03         7.37708E-01         8.71707E-01         7.37744E-01         4.49485E+01         1.00000E+00         7.58784E-02         4.49485E+01         1.14221E+01         3.35264E+01
+          1.17416E-02         1.05528E-02        -7.44693E-03         7.37707E-01         8.82378E-01         7.37744E-01         4.32321E+01         1.00000E+00         7.51759E-02         4.32320E+01         1.11863E+01         3.20457E+01
+          1.17416E-02         1.07227E-02        -7.56044E-03         7.37705E-01         8.93048E-01         7.37744E-01         4.16648E+01         1.00000E+00         7.45080E-02         4.16647E+01         1.09497E+01         3.07150E+01
+          1.17416E-02         1.08925E-02        -7.67576E-03         7.37704E-01         9.03719E-01         7.37744E-01         4.02391E+01         1.00000E+00         7.38736E-02         4.02391E+01         1.07126E+01         2.95264E+01
+          1.17416E-02         1.10623E-02        -7.79290E-03         7.37703E-01         9.14389E-01         7.37744E-01         3.89475E+01         1.00000E+00         7.32722E-02         3.89475E+01         1.04753E+01         2.84722E+01
+          1.17416E-02         1.12321E-02        -7.91184E-03         7.37701E-01         9.25060E-01         7.37744E-01         3.77824E+01         1.00000E+00         7.27029E-02         3.77823E+01         1.02380E+01         2.75444E+01
+          1.17416E-02         1.14020E-02        -8.03260E-03         7.37700E-01         9.35731E-01         7.37743E-01         3.67361E+01         1.00000E+00         7.21648E-02         3.67360E+01         1.00009E+01         2.67351E+01
+          1.17416E-02         1.15718E-02        -8.15517E-03         7.37698E-01         9.46401E-01         7.37743E-01         3.58010E+01         1.00000E+00         7.16572E-02         3.58009E+01         9.76429E+00         2.60366E+01
+          1.17416E-02         1.17416E-02        -8.27956E-03         7.37697E-01         9.57072E-01         7.37743E-01         3.49695E+01         1.00000E+00         7.11793E-02         3.49694E+01         9.52839E+00         2.54410E+01
+          1.17416E-02         1.19114E-02        -8.40575E-03         7.37695E-01         9.67742E-01         7.37743E-01         3.42341E+01         1.00000E+00         7.07301E-02         3.42340E+01         9.29343E+00         2.49405E+01
+          1.17416E-02         1.20813E-02        -8.53376E-03         7.37694E-01         9.78413E-01         7.37743E-01         3.35873E+01         1.00000E+00         7.03089E-02         3.35872E+01         9.05963E+00         2.45276E+01
+          1.17416E-02         1.22511E-02        -8.66358E-03         7.37692E-01         9.89083E-01         7.37743E-01         3.30220E+01         1.00000E+00         6.99147E-02         3.30218E+01         8.82721E+00         2.41946E+01
+          1.17416E-02         1.24209E-02        -8.79522E-03         7.37691E-01         9.99754E-01         7.37743E-01         3.25308E+01         1.00000E+00         6.95468E-02         3.25307E+01         8.59638E+00         2.39343E+01
+          1.17416E-02         1.25908E-02        -8.92866E-03         7.37689E-01         1.01042E+00         7.37743E-01         3.21068E+01         1.00000E+00         6.92044E-02         3.21067E+01         8.36734E+00         2.37393E+01
+          1.17416E-02         1.27606E-02        -9.06392E-03         7.37688E-01         1.02110E+00         7.37743E-01         3.17431E+01         1.00000E+00         6.88864E-02         3.17430E+01         8.14030E+00         2.36027E+01
+          1.17416E-02         1.29304E-02        -9.20099E-03         7.37686E-01         1.03177E+00         7.37743E-01         3.14332E+01         1.00000E+00         6.85921E-02         3.14330E+01         7.91544E+00         2.35176E+01
+          1.17416E-02         1.31002E-02        -9.33987E-03         7.37684E-01         1.04244E+00         7.37743E-01         3.11705E+01         1.00000E+00         6.83205E-02         3.11703E+01         7.69295E+00         2.34774E+01
+          1.17416E-02         1.32701E-02        -9.48057E-03         7.37683E-01         1.05311E+00         7.37744E-01         3.09488E+01         1.00000E+00         6.80709E-02         3.09487E+01         7.47301E+00         2.34757E+01
+          1.17416E-02         1.34399E-02        -9.62308E-03         7.37681E-01         1.06378E+00         7.37744E-01         3.07622E+01         1.00000E+00         6.78423E-02         3.07621E+01         7.25577E+00         2.35063E+01
+          1.17416E-02         1.36097E-02        -9.76740E-03         7.37679E-01         1.07445E+00         7.37744E-01         3.06050E+01         1.00000E+00         6.76339E-02         3.06049E+01         7.04141E+00         2.35635E+01
+          1.17416E-02         1.37795E-02        -9.91353E-03         7.37678E-01         1.08512E+00         7.37744E-01         3.04717E+01         1.00000E+00         6.74447E-02         3.04716E+01         6.83008E+00         2.36415E+01
+          1.17416E-02         1.39494E-02        -1.00615E-02         7.37676E-01         1.09579E+00         7.37744E-01         3.03572E+01         1.00000E+00         6.72739E-02         3.03570E+01         6.62191E+00         2.37351E+01
+          1.17416E-02         1.41192E-02        -1.02112E-02         7.37674E-01         1.10646E+00         7.37745E-01         3.02564E+01         1.00000E+00         6.71206E-02         3.02563E+01         6.41703E+00         2.38392E+01
+          1.17416E-02         1.42890E-02        -1.03628E-02         7.37672E-01         1.11713E+00         7.37745E-01         3.01649E+01         1.00000E+00         6.69839E-02         3.01647E+01         6.21559E+00         2.39491E+01
+          1.17416E-02         1.44589E-02        -1.05162E-02         7.37671E-01         1.12780E+00         7.37745E-01         3.00782E+01         1.00000E+00         6.68629E-02         3.00781E+01         6.01768E+00         2.40604E+01
+          1.17416E-02         1.46287E-02        -1.06714E-02         7.37669E-01         1.13847E+00         7.37746E-01         2.99925E+01         1.00000E+00         6.67568E-02         2.99923E+01         5.82341E+00         2.41689E+01
+          1.17416E-02         1.47985E-02        -1.08284E-02         7.37667E-01         1.14914E+00         7.37746E-01         2.99039E+01         1.00000E+00         6.66646E-02         2.99037E+01         5.63289E+00         2.42709E+01
+          1.17416E-02         1.49683E-02        -1.09872E-02         7.37665E-01         1.15981E+00         7.37747E-01         2.98090E+01         1.00000E+00         6.65854E-02         2.98089E+01         5.44619E+00         2.43627E+01
+          1.17416E-02         1.51382E-02        -1.11479E-02         7.37663E-01         1.17048E+00         7.37747E-01         2.97048E+01         1.00000E+00         6.65184E-02         2.97047E+01         5.26341E+00         2.44412E+01
+          1.17416E-02         1.53080E-02        -1.13103E-02         7.37661E-01         1.18115E+00         7.37748E-01         2.95884E+01         1.00000E+00         6.64627E-02         2.95882E+01         5.08459E+00         2.45036E+01
+          1.17416E-02         1.54778E-02        -1.14746E-02         7.37659E-01         1.19182E+00         7.37749E-01         2.94572E+01         1.00000E+00         6.64174E-02         2.94571E+01         4.90982E+00         2.45473E+01
+          1.17416E-02         1.56476E-02        -1.16406E-02         7.37657E-01         1.20249E+00         7.37749E-01         2.93091E+01         1.00000E+00         6.63817E-02         2.93090E+01         4.73913E+00         2.45699E+01
+          1.17416E-02         1.58175E-02        -1.18085E-02         7.37655E-01         1.21317E+00         7.37750E-01         2.91422E+01         1.00000E+00         6.63546E-02         2.91421E+01         4.57257E+00         2.45695E+01
+          1.17416E-02         1.59873E-02        -1.19782E-02         7.37653E-01         1.22384E+00         7.37751E-01         2.89547E+01         1.00000E+00         6.63354E-02         2.89546E+01         4.41017E+00         2.45444E+01
+          1.17416E-02         1.61571E-02        -1.21497E-02         7.37651E-01         1.23451E+00         7.37751E-01         2.87454E+01         1.00000E+00         6.63231E-02         2.87452E+01         4.25196E+00         2.44933E+01
+          1.17416E-02         1.63270E-02        -1.23230E-02         7.37649E-01         1.24518E+00         7.37752E-01         2.85130E+01         1.00000E+00         6.63170E-02         2.85129E+01         4.09796E+00         2.44150E+01
+          1.17416E-02         1.64968E-02        -1.24982E-02         7.37647E-01         1.25585E+00         7.37753E-01         2.82569E+01         1.00000E+00         6.63162E-02         2.82567E+01         3.94816E+00         2.43086E+01
+          1.17416E-02         1.66666E-02        -1.26751E-02         7.37645E-01         1.26652E+00         7.37754E-01         2.79763E+01         1.00000E+00         6.63199E-02         2.79762E+01         3.80258E+00         2.41736E+01
+          1.17416E-02         1.68364E-02        -1.28539E-02         7.37643E-01         1.27719E+00         7.37755E-01         2.76709E+01         1.00000E+00         6.63274E-02         2.76708E+01         3.66120E+00         2.40096E+01
+          1.17416E-02         1.70063E-02        -1.30345E-02         7.37641E-01         1.28786E+00         7.37756E-01         2.73407E+01         1.00000E+00         6.63377E-02         2.73406E+01         3.52402E+00         2.38166E+01
+          1.17416E-02         1.71761E-02        -1.32168E-02         7.37639E-01         1.29853E+00         7.37757E-01         2.69857E+01         1.00000E+00         6.63503E-02         2.69856E+01         3.39100E+00         2.35946E+01
+          1.17416E-02         1.73459E-02        -1.34010E-02         7.37637E-01         1.30920E+00         7.37758E-01         2.66062E+01         1.00000E+00         6.63642E-02         2.66061E+01         3.26212E+00         2.33440E+01
+          1.17416E-02         1.75158E-02        -1.35871E-02         7.37634E-01         1.31987E+00         7.37760E-01         2.62028E+01         1.00000E+00         6.63788E-02         2.62027E+01         3.13734E+00         2.30654E+01
+          1.17416E-02         1.76856E-02        -1.37749E-02         7.37632E-01         1.33054E+00         7.37761E-01         2.57761E+01         1.00000E+00         6.63933E-02         2.57761E+01         3.01663E+00         2.27594E+01
+          1.17416E-02         1.78554E-02        -1.39645E-02         7.37630E-01         1.34121E+00         7.37762E-01         2.53271E+01         1.00000E+00         6.64070E-02         2.53270E+01         2.89994E+00         2.24271E+01
+          1.17416E-02         1.80252E-02        -1.41560E-02         7.37628E-01         1.35188E+00         7.37764E-01         2.48567E+01         1.00000E+00         6.64193E-02         2.48566E+01         2.78721E+00         2.20694E+01
+          1.17416E-02         1.81951E-02        -1.43492E-02         7.37626E-01         1.36255E+00         7.37765E-01         2.43660E+01         1.00000E+00         6.64295E-02         2.43660E+01         2.67839E+00         2.16876E+01
+          1.17416E-02         1.83649E-02        -1.45443E-02         7.37623E-01         1.37322E+00         7.37767E-01         2.38565E+01         1.00000E+00         6.64370E-02         2.38565E+01         2.57341E+00         2.12830E+01
+          1.17416E-02         1.85347E-02        -1.47412E-02         7.37621E-01         1.38389E+00         7.37768E-01         2.33294E+01         1.00000E+00         6.64410E-02         2.33294E+01         2.47220E+00         2.08572E+01
+          1.17416E-02         1.87045E-02        -1.49399E-02         7.37619E-01         1.39457E+00         7.37770E-01         2.27864E+01         1.00000E+00         6.64411E-02         2.27864E+01         2.37470E+00         2.04117E+01
+          1.17416E-02         1.88744E-02        -1.51404E-02         7.37616E-01         1.40524E+00         7.37772E-01         2.22290E+01         1.00000E+00         6.64366E-02         2.22290E+01         2.28083E+00         1.99481E+01
+          1.17416E-02         1.90442E-02        -1.53428E-02         7.37614E-01         1.41591E+00         7.37773E-01         2.16588E+01         1.00000E+00         6.64270E-02         2.16588E+01         2.19051E+00         1.94683E+01
+          1.17416E-02         1.92140E-02        -1.55469E-02         7.37611E-01         1.42658E+00         7.37775E-01         2.10777E+01         1.00000E+00         6.64118E-02         2.10777E+01         2.10366E+00         1.89741E+01
+          1.17416E-02         1.93839E-02        -1.57529E-02         7.37609E-01         1.43725E+00         7.37777E-01         2.04874E+01         1.00000E+00         6.63903E-02         2.04875E+01         2.02020E+00         1.84673E+01
+          1.17416E-02         1.95537E-02        -1.59606E-02         7.37607E-01         1.44792E+00         7.37779E-01         1.98898E+01         1.00000E+00         6.63622E-02         1.98898E+01         1.94003E+00         1.79498E+01
+          1.17416E-02         1.97235E-02        -1.61702E-02         7.37604E-01         1.45859E+00         7.37781E-01         1.92866E+01         1.00000E+00         6.63269E-02         1.92867E+01         1.86307E+00         1.74236E+01
+          1.17416E-02         1.98933E-02        -1.63816E-02         7.37602E-01         1.46926E+00         7.37784E-01         1.86798E+01         1.00000E+00         6.62841E-02         1.86799E+01         1.78924E+00         1.68906E+01
+          1.17416E-02         2.00632E-02        -1.65948E-02         7.37599E-01         1.47993E+00         7.37786E-01         1.80713E+01         1.00000E+00         6.62332E-02         1.80713E+01         1.71843E+00         1.63529E+01
+          1.17416E-02         2.02330E-02        -1.68098E-02         7.37597E-01         1.49060E+00         7.37788E-01         1.74628E+01         1.00000E+00         6.61740E-02         1.74628E+01         1.65055E+00         1.58123E+01
+          1.17416E-02         2.04028E-02        -1.70267E-02         7.37594E-01         1.50127E+00         7.37791E-01         1.68562E+01         1.00000E+00         6.61059E-02         1.68562E+01         1.58551E+00         1.52707E+01
+          1.17416E-02         2.05726E-02        -1.72453E-02         7.37592E-01         1.51194E+00         7.37793E-01         1.62533E+01         1.00000E+00         6.60287E-02         1.62534E+01         1.52322E+00         1.47301E+01
+          1.17416E-02         2.07425E-02        -1.74658E-02         7.37589E-01         1.52261E+00         7.37796E-01         1.56559E+01         1.00000E+00         6.59420E-02         1.56560E+01         1.46358E+00         1.41924E+01
+          1.17416E-02         2.09123E-02        -1.76880E-02         7.37586E-01         1.53328E+00         7.37798E-01         1.50657E+01         1.00000E+00         6.58455E-02         1.50658E+01         1.40649E+00         1.36593E+01
+          1.17416E-02         2.10821E-02        -1.79121E-02         7.37584E-01         1.54395E+00         7.37801E-01         1.44843E+01         1.00000E+00         6.57390E-02         1.44844E+01         1.35187E+00         1.31325E+01
+          1.17416E-02         2.12520E-02        -1.81380E-02         7.37581E-01         1.55462E+00         7.37804E-01         1.39134E+01         1.00000E+00         6.56221E-02         1.39134E+01         1.29962E+00         1.26138E+01
+          1.17416E-02         2.14218E-02        -1.83657E-02         7.37578E-01         1.56529E+00         7.37807E-01         1.33544E+01         1.00000E+00         6.54946E-02         1.33545E+01         1.24964E+00         1.21048E+01
+          1.17416E-02         2.15916E-02        -1.85953E-02         7.37576E-01         1.57596E+00         7.37810E-01         1.28088E+01         1.00000E+00         6.53564E-02         1.28089E+01         1.20184E+00         1.16070E+01
+          1.17416E-02         2.17614E-02        -1.88266E-02         7.37573E-01         1.58664E+00         7.37813E-01         1.22779E+01         1.00000E+00         6.52071E-02         1.22780E+01         1.15613E+00         1.11219E+01
+          1.17416E-02         2.19313E-02        -1.90597E-02         7.37570E-01         1.59731E+00         7.37816E-01         1.17631E+01         1.00000E+00         6.50466E-02         1.17632E+01         1.11243E+00         1.06508E+01
+          1.17416E-02         2.21011E-02        -1.92947E-02         7.37567E-01         1.60798E+00         7.37820E-01         1.12655E+01         1.00000E+00         6.48748E-02         1.12656E+01         1.07064E+00         1.01949E+01
+          1.17416E-02         2.22709E-02        -1.95315E-02         7.37565E-01         1.61865E+00         7.37823E-01         1.07861E+01         1.00000E+00         6.46916E-02         1.07862E+01         1.03068E+00         9.75554E+00
+          1.17416E-02         2.24407E-02        -1.97701E-02         7.37562E-01         1.62932E+00         7.37827E-01         1.03260E+01         1.00000E+00         6.44967E-02         1.03261E+01         9.92466E-01         9.33364E+00
+          1.17416E-02         2.26106E-02        -2.00105E-02         7.37559E-01         1.63999E+00         7.37830E-01         9.88599E+00         1.00000E+00         6.42902E-02         9.88612E+00         9.55913E-01         8.93021E+00
+          1.17416E-02         2.27804E-02        -2.02527E-02         7.37556E-01         1.65066E+00         7.37834E-01         9.46689E+00         1.00000E+00         6.40719E-02         9.46702E+00         9.20944E-01         8.54608E+00
+          1.17416E-02         2.29502E-02        -2.04967E-02         7.37553E-01         1.66133E+00         7.37838E-01         9.06935E+00         1.00000E+00         6.38418E-02         9.06949E+00         8.87478E-01         8.18201E+00
+          1.17416E-02         2.31201E-02        -2.07426E-02         7.37550E-01         1.67200E+00         7.37842E-01         8.69393E+00         1.00000E+00         6.35998E-02         8.69407E+00         8.55443E-01         7.83862E+00
+          1.17416E-02         2.32899E-02        -2.09903E-02         7.37548E-01         1.68267E+00         7.37846E-01         8.34108E+00         1.00000E+00         6.33460E-02         8.34121E+00         8.24764E-01         7.51645E+00
+          1.17416E-02         2.34597E-02        -2.12397E-02         7.37545E-01         1.69334E+00         7.37850E-01         8.01114E+00         1.00000E+00         6.30803E-02         8.01128E+00         7.95372E-01         7.21591E+00
+          1.17416E-02         2.36295E-02        -2.14910E-02         7.37542E-01         1.70401E+00         7.37855E-01         7.70437E+00         1.00000E+00         6.28027E-02         7.70450E+00         7.67198E-01         6.93731E+00
+          1.17416E-02         2.37994E-02        -2.17441E-02         7.37539E-01         1.71468E+00         7.37859E-01         7.42089E+00         1.00000E+00         6.25134E-02         7.42103E+00         7.40177E-01         6.68085E+00
+          1.17416E-02         2.39692E-02        -2.19990E-02         7.37536E-01         1.72535E+00         7.37864E-01         7.16076E+00         1.00000E+00         6.22122E-02         7.16089E+00         7.14247E-01         6.44665E+00
+          1.17416E-02         2.41390E-02        -2.22558E-02         7.37533E-01         1.73602E+00         7.37868E-01         6.92390E+00         1.00000E+00         6.18993E-02         6.92404E+00         6.89349E-01         6.23469E+00
+          1.17416E-02         2.43088E-02        -2.25143E-02         7.37530E-01         1.74669E+00         7.37873E-01         6.71017E+00         1.00000E+00         6.15748E-02         6.71031E+00         6.65425E-01         6.04488E+00
+          1.17416E-02         2.44787E-02        -2.27747E-02         7.37527E-01         1.75736E+00         7.37878E-01         6.51933E+00         1.00000E+00         6.12387E-02         6.51946E+00         6.42420E-01         5.87704E+00
+          1.17416E-02         2.46485E-02        -2.30368E-02         7.37524E-01         1.76804E+00         7.37883E-01         6.35103E+00         1.00000E+00         6.08912E-02         6.35116E+00         6.20283E-01         5.73087E+00
+          1.17416E-02         2.48183E-02        -2.33008E-02         7.37520E-01         1.77871E+00         7.37888E-01         6.20486E+00         1.00000E+00         6.05324E-02         6.20498E+00         5.98965E-01         5.60602E+00
+          1.17416E-02         2.49882E-02        -2.35666E-02         7.37517E-01         1.78938E+00         7.37894E-01         6.08032E+00         1.00000E+00         6.01624E-02         6.08044E+00         5.78419E-01         5.50202E+00
+          1.17416E-02         2.51580E-02        -2.38342E-02         7.37514E-01         1.80005E+00         7.37899E-01         5.97684E+00         1.00000E+00         5.97813E-02         5.97696E+00         5.58602E-01         5.41836E+00
+          1.17416E-02         2.53278E-02        -2.41036E-02         7.37511E-01         1.81072E+00         7.37905E-01         5.89378E+00         1.00000E+00         5.93894E-02         5.89389E+00         5.39472E-01         5.35442E+00
+          1.17416E-02         2.54976E-02        -2.43749E-02         7.37508E-01         1.82139E+00         7.37910E-01         5.83042E+00         1.00000E+00         5.89867E-02         5.83054E+00         5.20991E-01         5.30955E+00
+          1.17416E-02         2.56675E-02        -2.46479E-02         7.37505E-01         1.83206E+00         7.37916E-01         5.78601E+00         1.00000E+00         5.85736E-02         5.78612E+00         5.03121E-01         5.28300E+00
+          1.17416E-02         2.58373E-02        -2.49228E-02         7.37501E-01         1.84273E+00         7.37922E-01         5.75972E+00         1.00000E+00         5.81500E-02         5.75982E+00         4.85830E-01         5.27399E+00
+          1.17416E-02         2.60071E-02        -2.51995E-02         7.37498E-01         1.85340E+00         7.37929E-01         5.75068E+00         1.00000E+00         5.77164E-02         5.75078E+00         4.69084E-01         5.28169E+00
+          1.17416E-02         2.61769E-02        -2.54780E-02         7.37495E-01         1.86407E+00         7.37935E-01         5.75797E+00         1.00000E+00         5.72728E-02         5.75806E+00         4.52856E-01         5.30521E+00
+          1.19114E-02         8.72665E-04        -4.09866E-03         7.48418E-01         2.74155E-01         7.48429E-01         4.33667E+02         1.00000E+00         1.29824E-01         4.33667E+02         2.53562E+01         4.08311E+02
+          1.19114E-02         1.04249E-03        -4.10888E-03         7.48418E-01         2.84826E-01         7.48429E-01         4.24650E+02         1.00000E+00         1.28427E-01         4.24650E+02         2.50949E+01         3.99555E+02
+          1.19114E-02         1.21232E-03        -4.12091E-03         7.48418E-01         2.95496E-01         7.48429E-01         4.15470E+02         1.00000E+00         1.27001E-01         4.15470E+02         2.48272E+01         3.90643E+02
+          1.19114E-02         1.38215E-03        -4.13475E-03         7.48418E-01         3.06167E-01         7.48429E-01         4.06143E+02         1.00000E+00         1.25549E-01         4.06143E+02         2.45535E+01         3.81590E+02
+          1.19114E-02         1.55197E-03        -4.15040E-03         7.48417E-01         3.16838E-01         7.48429E-01         3.96688E+02         1.00000E+00         1.24073E-01         3.96688E+02         2.42741E+01         3.72414E+02
+          1.19114E-02         1.72180E-03        -4.16787E-03         7.48417E-01         3.27508E-01         7.48429E-01         3.87120E+02         1.00000E+00         1.22575E-01         3.87120E+02         2.39894E+01         3.63130E+02
+          1.19114E-02         1.89163E-03        -4.18714E-03         7.48417E-01         3.38179E-01         7.48429E-01         3.77457E+02         1.00000E+00         1.21059E-01         3.77457E+02         2.36998E+01         3.53757E+02
+          1.19114E-02         2.06146E-03        -4.20823E-03         7.48417E-01         3.48849E-01         7.48428E-01         3.67716E+02         1.00000E+00         1.19526E-01         3.67717E+02         2.34055E+01         3.44311E+02
+          1.19114E-02         2.23128E-03        -4.23113E-03         7.48416E-01         3.59520E-01         7.48428E-01         3.57915E+02         1.00000E+00         1.17978E-01         3.57915E+02         2.31069E+01         3.34808E+02
+          1.19114E-02         2.40111E-03        -4.25585E-03         7.48416E-01         3.70190E-01         7.48428E-01         3.48070E+02         1.00000E+00         1.16419E-01         3.48070E+02         2.28045E+01         3.25265E+02
+          1.19114E-02         2.57094E-03        -4.28237E-03         7.48416E-01         3.80861E-01         7.48428E-01         3.38197E+02         1.00000E+00         1.14850E-01         3.38197E+02         2.24986E+01         3.15699E+02
+          1.19114E-02         2.74077E-03        -4.31071E-03         7.48415E-01         3.91532E-01         7.48428E-01         3.28314E+02         1.00000E+00         1.13274E-01         3.28314E+02         2.21894E+01         3.06125E+02
+          1.19114E-02         2.91059E-03        -4.34086E-03         7.48415E-01         4.02202E-01         7.48428E-01         3.18436E+02         1.00000E+00         1.11693E-01         3.18436E+02         2.18775E+01         2.96558E+02
+          1.19114E-02         3.08042E-03        -4.37282E-03         7.48415E-01         4.12873E-01         7.48427E-01         3.08579E+02         1.00000E+00         1.10109E-01         3.08579E+02         2.15631E+01         2.87016E+02
+          1.19114E-02         3.25025E-03        -4.40660E-03         7.48414E-01         4.23543E-01         7.48427E-01         2.98759E+02         1.00000E+00         1.08525E-01         2.98759E+02         2.12465E+01         2.77512E+02
+          1.19114E-02         3.42008E-03        -4.44218E-03         7.48414E-01         4.34214E-01         7.48427E-01         2.88990E+02         1.00000E+00         1.06943E-01         2.88990E+02         2.09282E+01         2.68062E+02
+          1.19114E-02         3.58990E-03        -4.47958E-03         7.48413E-01         4.44884E-01         7.48427E-01         2.79288E+02         1.00000E+00         1.05365E-01         2.79288E+02         2.06084E+01         2.58680E+02
+          1.19114E-02         3.75973E-03        -4.51879E-03         7.48413E-01         4.55555E-01         7.48427E-01         2.69667E+02         1.00000E+00         1.03793E-01         2.69667E+02         2.02875E+01         2.49380E+02
+          1.19114E-02         3.92956E-03        -4.55981E-03         7.48412E-01         4.66225E-01         7.48426E-01         2.60140E+02         1.00000E+00         1.02229E-01         2.60141E+02         1.99658E+01         2.40175E+02
+          1.19114E-02         4.09939E-03        -4.60264E-03         7.48412E-01         4.76896E-01         7.48426E-01         2.50721E+02         1.00000E+00         1.00675E-01         2.50722E+02         1.96437E+01         2.31078E+02
+          1.19114E-02         4.26921E-03        -4.64729E-03         7.48411E-01         4.87567E-01         7.48426E-01         2.41423E+02         1.00000E+00         9.91325E-02         2.41423E+02         1.93213E+01         2.22102E+02
+          1.19114E-02         4.43904E-03        -4.69375E-03         7.48411E-01         4.98237E-01         7.48426E-01         2.32257E+02         1.00000E+00         9.76042E-02         2.32257E+02         1.89991E+01         2.13258E+02
+          1.19114E-02         4.60887E-03        -4.74202E-03         7.48410E-01         5.08908E-01         7.48425E-01         2.23235E+02         1.00000E+00         9.60914E-02         2.23235E+02         1.86774E+01         2.04558E+02
+          1.19114E-02         4.77869E-03        -4.79210E-03         7.48410E-01         5.19578E-01         7.48425E-01         2.14368E+02         1.00000E+00         9.45958E-02         2.14368E+02         1.83563E+01         1.96012E+02
+          1.19114E-02         4.94852E-03        -4.84400E-03         7.48409E-01         5.30249E-01         7.48425E-01         2.05667E+02         1.00000E+00         9.31190E-02         2.05667E+02         1.80362E+01         1.87631E+02
+          1.19114E-02         5.11835E-03        -4.89770E-03         7.48408E-01         5.40919E-01         7.48424E-01         1.97140E+02         1.00000E+00         9.16625E-02         1.97141E+02         1.77174E+01         1.79423E+02
+          1.19114E-02         5.28818E-03        -4.95322E-03         7.48408E-01         5.51590E-01         7.48424E-01         1.88798E+02         1.00000E+00         9.02276E-02         1.88798E+02         1.74001E+01         1.71398E+02
+          1.19114E-02         5.45800E-03        -5.01055E-03         7.48407E-01         5.62261E-01         7.48424E-01         1.80648E+02         1.00000E+00         8.88158E-02         1.80648E+02         1.70845E+01         1.63564E+02
+          1.19114E-02         5.62783E-03        -5.06969E-03         7.48406E-01         5.72931E-01         7.48424E-01         1.72698E+02         1.00000E+00         8.74282E-02         1.72698E+02         1.67708E+01         1.55927E+02
+          1.19114E-02         5.79766E-03        -5.13065E-03         7.48406E-01         5.83602E-01         7.48423E-01         1.64955E+02         1.00000E+00         8.60660E-02         1.64955E+02         1.64594E+01         1.48496E+02
+          1.19114E-02         5.96749E-03        -5.19342E-03         7.48405E-01         5.94272E-01         7.48423E-01         1.57425E+02         1.00000E+00         8.47303E-02         1.57425E+02         1.61504E+01         1.41275E+02
+          1.19114E-02         6.13731E-03        -5.25800E-03         7.48404E-01         6.04943E-01         7.48423E-01         1.50114E+02         1.00000E+00         8.34220E-02         1.50114E+02         1.58439E+01         1.34270E+02
+          1.19114E-02         6.30714E-03        -5.32439E-03         7.48403E-01         6.15613E-01         7.48422E-01         1.43027E+02         1.00000E+00         8.21421E-02         1.43027E+02         1.55403E+01         1.27487E+02
+          1.19114E-02         6.47697E-03        -5.39259E-03         7.48403E-01         6.26284E-01         7.48422E-01         1.36168E+02         1.00000E+00         8.08912E-02         1.36168E+02         1.52396E+01         1.20928E+02
+          1.19114E-02         6.64680E-03        -5.46261E-03         7.48402E-01         6.36955E-01         7.48422E-01         1.29540E+02         1.00000E+00         7.96702E-02         1.29540E+02         1.49421E+01         1.14598E+02
+          1.19114E-02         6.81662E-03        -5.53443E-03         7.48401E-01         6.47625E-01         7.48421E-01         1.23146E+02         1.00000E+00         7.84795E-02         1.23147E+02         1.46478E+01         1.08499E+02
+          1.19114E-02         6.98645E-03        -5.60807E-03         7.48400E-01         6.58296E-01         7.48421E-01         1.16989E+02         1.00000E+00         7.73198E-02         1.16989E+02         1.43569E+01         1.02633E+02
+          1.19114E-02         7.15628E-03        -5.68353E-03         7.48399E-01         6.68966E-01         7.48421E-01         1.11070E+02         1.00000E+00         7.61915E-02         1.11070E+02         1.40696E+01         9.70008E+01
+          1.19114E-02         7.32611E-03        -5.76079E-03         7.48398E-01         6.79637E-01         7.48420E-01         1.05390E+02         1.00000E+00         7.50948E-02         1.05390E+02         1.37860E+01         9.16043E+01
+          1.19114E-02         7.49593E-03        -5.83987E-03         7.48397E-01         6.90307E-01         7.48420E-01         9.99490E+01         1.00000E+00         7.40302E-02         9.99491E+01         1.35061E+01         8.64430E+01
+          1.19114E-02         7.66576E-03        -5.92075E-03         7.48396E-01         7.00978E-01         7.48420E-01         9.47466E+01         1.00000E+00         7.29978E-02         9.47467E+01         1.32301E+01         8.15166E+01
+          1.19114E-02         7.83559E-03        -6.00346E-03         7.48395E-01         7.11649E-01         7.48419E-01         8.97819E+01         1.00000E+00         7.19977E-02         8.97820E+01         1.29580E+01         7.68239E+01
+          1.19114E-02         8.00542E-03        -6.08797E-03         7.48394E-01         7.22319E-01         7.48419E-01         8.50533E+01         1.00000E+00         7.10299E-02         8.50534E+01         1.26900E+01         7.23634E+01
+          1.19114E-02         8.17524E-03        -6.17429E-03         7.48393E-01         7.32990E-01         7.48419E-01         8.05587E+01         1.00000E+00         7.00945E-02         8.05588E+01         1.24260E+01         6.81328E+01
+          1.19114E-02         8.34507E-03        -6.26243E-03         7.48392E-01         7.43660E-01         7.48418E-01         7.62956E+01         1.00000E+00         6.91914E-02         7.62956E+01         1.21662E+01         6.41294E+01
+          1.19114E-02         8.51490E-03        -6.35238E-03         7.48391E-01         7.54331E-01         7.48418E-01         7.22606E+01         1.00000E+00         6.83204E-02         7.22606E+01         1.19106E+01         6.03500E+01
+          1.19114E-02         8.68473E-03        -6.44414E-03         7.48390E-01         7.65001E-01         7.48418E-01         6.84501E+01         1.00000E+00         6.74814E-02         6.84502E+01         1.16592E+01         5.67910E+01
+          1.19114E-02         8.85455E-03        -6.53772E-03         7.48389E-01         7.75672E-01         7.48417E-01         6.48601E+01         1.00000E+00         6.66740E-02         6.48601E+01         1.14121E+01         5.34481E+01
+          1.19114E-02         9.02438E-03        -6.63310E-03         7.48388E-01         7.86343E-01         7.48417E-01         6.14860E+01         1.00000E+00         6.58981E-02         6.14860E+01         1.11692E+01         5.03168E+01
+          1.19114E-02         9.19421E-03        -6.73030E-03         7.48387E-01         7.97013E-01         7.48417E-01         5.83227E+01         1.00000E+00         6.51533E-02         5.83227E+01         1.09305E+01         4.73922E+01
+          1.19114E-02         9.36403E-03        -6.82931E-03         7.48385E-01         8.07684E-01         7.48417E-01         5.53650E+01         1.00000E+00         6.44391E-02         5.53651E+01         1.06961E+01         4.46689E+01
+          1.19114E-02         9.53386E-03        -6.93013E-03         7.48384E-01         8.18354E-01         7.48416E-01         5.26072E+01         1.00000E+00         6.37552E-02         5.26072E+01         1.04660E+01         4.21412E+01
+          1.19114E-02         9.70369E-03        -7.03277E-03         7.48383E-01         8.29025E-01         7.48416E-01         5.00433E+01         1.00000E+00         6.31012E-02         5.00433E+01         1.02401E+01         3.98032E+01
+          1.19114E-02         9.87352E-03        -7.13722E-03         7.48382E-01         8.39695E-01         7.48416E-01         4.76669E+01         1.00000E+00         6.24765E-02         4.76669E+01         1.00185E+01         3.76484E+01
+          1.19114E-02         1.00433E-02        -7.24348E-03         7.48380E-01         8.50366E-01         7.48416E-01         4.54715E+01         1.00000E+00         6.18807E-02         4.54715E+01         9.80097E+00         3.56705E+01
+          1.19114E-02         1.02132E-02        -7.35155E-03         7.48379E-01         8.61037E-01         7.48415E-01         4.34503E+01         1.00000E+00         6.13131E-02         4.34503E+01         9.58763E+00         3.38627E+01
+          1.19114E-02         1.03830E-02        -7.46143E-03         7.48378E-01         8.71707E-01         7.48415E-01         4.15963E+01         1.00000E+00         6.07734E-02         4.15963E+01         9.37838E+00         3.22179E+01
+          1.19114E-02         1.05528E-02        -7.57313E-03         7.48377E-01         8.82378E-01         7.48415E-01         3.99023E+01         1.00000E+00         6.02609E-02         3.99023E+01         9.17320E+00         3.07291E+01
+          1.19114E-02         1.07227E-02        -7.68664E-03         7.48375E-01         8.93048E-01         7.48415E-01         3.83610E+01         1.00000E+00         5.97750E-02         3.83610E+01         8.97201E+00         2.93889E+01
+          1.19114E-02         1.08925E-02        -7.80196E-03         7.48374E-01         9.03719E-01         7.48414E-01         3.69649E+01         1.00000E+00         5.93152E-02         3.69649E+01         8.77477E+00         2.81901E+01
+          1.19114E-02         1.10623E-02        -7.91910E-03         7.48372E-01         9.14389E-01         7.48414E-01         3.57066E+01         1.00000E+00         5.88808E-02         3.57066E+01         8.58142E+00         2.71252E+01
+          1.19114E-02         1.12321E-02        -8.03804E-03         7.48371E-01         9.25060E-01         7.48414E-01         3.45785E+01         1.00000E+00         5.84711E-02         3.45785E+01         8.39188E+00         2.61866E+01
+          1.19114E-02         1.14020E-02        -8.15880E-03         7.48370E-01         9.35731E-01         7.48414E-01         3.35729E+01         1.00000E+00         5.80857E-02         3.35729E+01         8.20610E+00         2.53668E+01
+          1.19114E-02         1.15718E-02        -8.28137E-03         7.48368E-01         9.46401E-01         7.48414E-01         3.26823E+01         1.00000E+00         5.77238E-02         3.26823E+01         8.02399E+00         2.46583E+01
+          1.19114E-02         1.17416E-02        -8.40575E-03         7.48367E-01         9.57072E-01         7.48414E-01         3.18991E+01         1.00000E+00         5.73849E-02         3.18990E+01         7.84550E+00         2.40535E+01
+          1.19114E-02         1.19114E-02        -8.53195E-03         7.48365E-01         9.67742E-01         7.48414E-01         3.12157E+01         1.00000E+00         5.70681E-02         3.12156E+01         7.67053E+00         2.35451E+01
+          1.19114E-02         1.20813E-02        -8.65996E-03         7.48364E-01         9.78413E-01         7.48414E-01         3.06247E+01         1.00000E+00         5.67730E-02         3.06246E+01         7.49902E+00         2.31256E+01
+          1.19114E-02         1.22511E-02        -8.78978E-03         7.48362E-01         9.89083E-01         7.48414E-01         3.01186E+01         1.00000E+00         5.64989E-02         3.01186E+01         7.33089E+00         2.27877E+01
+          1.19114E-02         1.24209E-02        -8.92141E-03         7.48360E-01         9.99754E-01         7.48414E-01         2.96904E+01         1.00000E+00         5.62450E-02         2.96903E+01         7.16605E+00         2.25243E+01
+          1.19114E-02         1.25908E-02        -9.05486E-03         7.48359E-01         1.01042E+00         7.48414E-01         2.93328E+01         1.00000E+00         5.60107E-02         2.93327E+01         7.00443E+00         2.23283E+01
+          1.19114E-02         1.27606E-02        -9.19012E-03         7.48357E-01         1.02110E+00         7.48414E-01         2.90389E+01         1.00000E+00         5.57953E-02         2.90388E+01         6.84594E+00         2.21929E+01
+          1.19114E-02         1.29304E-02        -9.32719E-03         7.48356E-01         1.03177E+00         7.48414E-01         2.88019E+01         1.00000E+00         5.55982E-02         2.88018E+01         6.69052E+00         2.21113E+01
+          1.19114E-02         1.31002E-02        -9.46607E-03         7.48354E-01         1.04244E+00         7.48414E-01         2.86153E+01         1.00000E+00         5.54187E-02         2.86152E+01         6.53807E+00         2.20771E+01
+          1.19114E-02         1.32701E-02        -9.60676E-03         7.48352E-01         1.05311E+00         7.48414E-01         2.84727E+01         1.00000E+00         5.52561E-02         2.84726E+01         6.38852E+00         2.20841E+01
+          1.19114E-02         1.34399E-02        -9.74927E-03         7.48351E-01         1.06378E+00         7.48414E-01         2.83679E+01         1.00000E+00         5.51098E-02         2.83678E+01         6.24179E+00         2.21260E+01
+          1.19114E-02         1.36097E-02        -9.89359E-03         7.48349E-01         1.07445E+00         7.48414E-01         2.82951E+01         1.00000E+00         5.49789E-02         2.82950E+01         6.09781E+00         2.21972E+01
+          1.19114E-02         1.37795E-02        -1.00397E-02         7.48347E-01         1.08512E+00         7.48415E-01         2.82486E+01         1.00000E+00         5.48629E-02         2.82485E+01         5.95649E+00         2.22920E+01
+          1.19114E-02         1.39494E-02        -1.01877E-02         7.48345E-01         1.09579E+00         7.48415E-01         2.82229E+01         1.00000E+00         5.47611E-02         2.82228E+01         5.81777E+00         2.24051E+01
+          1.19114E-02         1.41192E-02        -1.03374E-02         7.48344E-01         1.10646E+00         7.48415E-01         2.82131E+01         1.00000E+00         5.46727E-02         2.82130E+01         5.68156E+00         2.25315E+01
+          1.19114E-02         1.42890E-02        -1.04890E-02         7.48342E-01         1.11713E+00         7.48415E-01         2.82143E+01         1.00000E+00         5.45971E-02         2.82142E+01         5.54782E+00         2.26663E+01
+          1.19114E-02         1.44589E-02        -1.06424E-02         7.48340E-01         1.12780E+00         7.48416E-01         2.82218E+01         1.00000E+00         5.45335E-02         2.82217E+01         5.41645E+00         2.28052E+01
+          1.19114E-02         1.46287E-02        -1.07976E-02         7.48338E-01         1.13847E+00         7.48416E-01         2.82315E+01         1.00000E+00         5.44814E-02         2.82314E+01         5.28741E+00         2.29440E+01
+          1.19114E-02         1.47985E-02        -1.09546E-02         7.48336E-01         1.14914E+00         7.48416E-01         2.82393E+01         1.00000E+00         5.44399E-02         2.82392E+01         5.16061E+00         2.30786E+01
+          1.19114E-02         1.49683E-02        -1.11134E-02         7.48334E-01         1.15981E+00         7.48417E-01         2.82417E+01         1.00000E+00         5.44084E-02         2.82416E+01         5.03602E+00         2.32056E+01
+          1.19114E-02         1.51382E-02        -1.12740E-02         7.48332E-01         1.17048E+00         7.48417E-01         2.82352E+01         1.00000E+00         5.43863E-02         2.82351E+01         4.91356E+00         2.33216E+01
+          1.19114E-02         1.53080E-02        -1.14365E-02         7.48331E-01         1.18115E+00         7.48418E-01         2.82168E+01         1.00000E+00         5.43728E-02         2.82167E+01         4.79318E+00         2.34235E+01
+          1.19114E-02         1.54778E-02        -1.16007E-02         7.48329E-01         1.19182E+00         7.48418E-01         2.81836E+01         1.00000E+00         5.43672E-02         2.81835E+01         4.67483E+00         2.35087E+01
+          1.19114E-02         1.56476E-02        -1.17668E-02         7.48327E-01         1.20249E+00         7.48419E-01         2.81333E+01         1.00000E+00         5.43689E-02         2.81332E+01         4.55846E+00         2.35747E+01
+          1.19114E-02         1.58175E-02        -1.19347E-02         7.48325E-01         1.21317E+00         7.48420E-01         2.80635E+01         1.00000E+00         5.43772E-02         2.80634E+01         4.44402E+00         2.36194E+01
+          1.19114E-02         1.59873E-02        -1.21044E-02         7.48323E-01         1.22384E+00         7.48420E-01         2.79725E+01         1.00000E+00         5.43914E-02         2.79724E+01         4.33146E+00         2.36409E+01
+          1.19114E-02         1.61571E-02        -1.22759E-02         7.48321E-01         1.23451E+00         7.48421E-01         2.78585E+01         1.00000E+00         5.44108E-02         2.78584E+01         4.22076E+00         2.36377E+01
+          1.19114E-02         1.63270E-02        -1.24492E-02         7.48318E-01         1.24518E+00         7.48422E-01         2.77203E+01         1.00000E+00         5.44349E-02         2.77202E+01         4.11185E+00         2.36084E+01
+          1.19114E-02         1.64968E-02        -1.26244E-02         7.48316E-01         1.25585E+00         7.48423E-01         2.75567E+01         1.00000E+00         5.44630E-02         2.75566E+01         4.00472E+00         2.35519E+01
+          1.19114E-02         1.66666E-02        -1.28013E-02         7.48314E-01         1.26652E+00         7.48424E-01         2.73670E+01         1.00000E+00         5.44944E-02         2.73669E+01         3.89933E+00         2.34676E+01
+          1.19114E-02         1.68364E-02        -1.29801E-02         7.48312E-01         1.27719E+00         7.48425E-01         2.71504E+01         1.00000E+00         5.45285E-02         2.71504E+01         3.79564E+00         2.33547E+01
+          1.19114E-02         1.70063E-02        -1.31606E-02         7.48310E-01         1.28786E+00         7.48426E-01         2.69068E+01         1.00000E+00         5.45647E-02         2.69068E+01         3.69364E+00         2.32131E+01
+          1.19114E-02         1.71761E-02        -1.33430E-02         7.48308E-01         1.29853E+00         7.48427E-01         2.66360E+01         1.00000E+00         5.46024E-02         2.66360E+01         3.59328E+00         2.30427E+01
+          1.19114E-02         1.73459E-02        -1.35272E-02         7.48306E-01         1.30920E+00         7.48428E-01         2.63382E+01         1.00000E+00         5.46410E-02         2.63381E+01         3.49456E+00         2.28436E+01
+          1.19114E-02         1.75158E-02        -1.37132E-02         7.48303E-01         1.31987E+00         7.48429E-01         2.60135E+01         1.00000E+00         5.46799E-02         2.60135E+01         3.39745E+00         2.26160E+01
+          1.19114E-02         1.76856E-02        -1.39011E-02         7.48301E-01         1.33054E+00         7.48430E-01         2.56627E+01         1.00000E+00         5.47186E-02         2.56626E+01         3.30192E+00         2.23607E+01
+          1.19114E-02         1.78554E-02        -1.40907E-02         7.48299E-01         1.34121E+00         7.48432E-01         2.52862E+01         1.00000E+00         5.47564E-02         2.52862E+01         3.20798E+00         2.20782E+01
+          1.19114E-02         1.80252E-02        -1.42822E-02         7.48297E-01         1.35188E+00         7.48433E-01         2.48851E+01         1.00000E+00         5.47930E-02         2.48851E+01         3.11559E+00         2.17695E+01
+          1.19114E-02         1.81951E-02        -1.44754E-02         7.48294E-01         1.36255E+00         7.48434E-01         2.44603E+01         1.00000E+00         5.48277E-02         2.44603E+01         3.02475E+00         2.14356E+01
+          1.19114E-02         1.83649E-02        -1.46705E-02         7.48292E-01         1.37322E+00         7.48436E-01         2.40131E+01         1.00000E+00         5.48600E-02         2.40131E+01         2.93544E+00         2.10776E+01
+          1.19114E-02         1.85347E-02        -1.48674E-02         7.48290E-01         1.38389E+00         7.48437E-01         2.35446E+01         1.00000E+00         5.48894E-02         2.35446E+01         2.84767E+00         2.06969E+01
+          1.19114E-02         1.87045E-02        -1.50661E-02         7.48287E-01         1.39457E+00         7.48439E-01         2.30564E+01         1.00000E+00         5.49156E-02         2.30564E+01         2.76141E+00         2.02950E+01
+          1.19114E-02         1.88744E-02        -1.52666E-02         7.48285E-01         1.40524E+00         7.48441E-01         2.25499E+01         1.00000E+00         5.49379E-02         2.25499E+01         2.67667E+00         1.98732E+01
+          1.19114E-02         1.90442E-02        -1.54689E-02         7.48282E-01         1.41591E+00         7.48442E-01         2.20267E+01         1.00000E+00         5.49560E-02         2.20267E+01         2.59344E+00         1.94333E+01
+          1.19114E-02         1.92140E-02        -1.56731E-02         7.48280E-01         1.42658E+00         7.48444E-01         2.14886E+01         1.00000E+00         5.49695E-02         2.14886E+01         2.51171E+00         1.89769E+01
+          1.19114E-02         1.93839E-02        -1.58790E-02         7.48278E-01         1.43725E+00         7.48446E-01         2.09373E+01         1.00000E+00         5.49778E-02         2.09373E+01         2.43148E+00         1.85058E+01
+          1.19114E-02         1.95537E-02        -1.60868E-02         7.48275E-01         1.44792E+00         7.48448E-01         2.03746E+01         1.00000E+00         5.49807E-02         2.03746E+01         2.35275E+00         1.80218E+01
+          1.19114E-02         1.97235E-02        -1.62964E-02         7.48273E-01         1.45859E+00         7.48450E-01         1.98023E+01         1.00000E+00         5.49778E-02         1.98023E+01         2.27553E+00         1.75268E+01
+          1.19114E-02         1.98933E-02        -1.65078E-02         7.48270E-01         1.46926E+00         7.48452E-01         1.92223E+01         1.00000E+00         5.49687E-02         1.92223E+01         2.19979E+00         1.70225E+01
+          1.19114E-02         2.00632E-02        -1.67210E-02         7.48268E-01         1.47993E+00         7.48454E-01         1.86365E+01         1.00000E+00         5.49531E-02         1.86365E+01         2.12556E+00         1.65109E+01
+          1.19114E-02         2.02330E-02        -1.69360E-02         7.48265E-01         1.49060E+00         7.48457E-01         1.80467E+01         1.00000E+00         5.49306E-02         1.80468E+01         2.05282E+00         1.59940E+01
+          1.19114E-02         2.04028E-02        -1.71528E-02         7.48262E-01         1.50127E+00         7.48459E-01         1.74550E+01         1.00000E+00         5.49009E-02         1.74550E+01         1.98157E+00         1.54734E+01
+          1.19114E-02         2.05726E-02        -1.73715E-02         7.48260E-01         1.51194E+00         7.48461E-01         1.68630E+01         1.00000E+00         5.48638E-02         1.68631E+01         1.91182E+00         1.49512E+01
+          1.19114E-02         2.07425E-02        -1.75919E-02         7.48257E-01         1.52261E+00         7.48464E-01         1.62727E+01         1.00000E+00         5.48190E-02         1.62728E+01         1.84357E+00         1.44292E+01
+          1.19114E-02         2.09123E-02        -1.78142E-02         7.48255E-01         1.53328E+00         7.48467E-01         1.56859E+01         1.00000E+00         5.47663E-02         1.56860E+01         1.77682E+00         1.39092E+01
+          1.19114E-02         2.10821E-02        -1.80383E-02         7.48252E-01         1.54395E+00         7.48469E-01         1.51043E+01         1.00000E+00         5.47053E-02         1.51044E+01         1.71156E+00         1.33928E+01
+          1.19114E-02         2.12520E-02        -1.82642E-02         7.48249E-01         1.55462E+00         7.48472E-01         1.45297E+01         1.00000E+00         5.46360E-02         1.45297E+01         1.64779E+00         1.28819E+01
+          1.19114E-02         2.14218E-02        -1.84919E-02         7.48246E-01         1.56529E+00         7.48475E-01         1.39636E+01         1.00000E+00         5.45580E-02         1.39636E+01         1.58552E+00         1.23781E+01
+          1.19114E-02         2.15916E-02        -1.87214E-02         7.48244E-01         1.57596E+00         7.48478E-01         1.34076E+01         1.00000E+00         5.44713E-02         1.34077E+01         1.52474E+00         1.18829E+01
+          1.19114E-02         2.17614E-02        -1.89528E-02         7.48241E-01         1.58664E+00         7.48481E-01         1.28633E+01         1.00000E+00         5.43756E-02         1.28633E+01         1.46544E+00         1.13979E+01
+          1.19114E-02         2.19313E-02        -1.91859E-02         7.48238E-01         1.59731E+00         7.48484E-01         1.23320E+01         1.00000E+00         5.42709E-02         1.23321E+01         1.40764E+00         1.09244E+01
+          1.19114E-02         2.21011E-02        -1.94209E-02         7.48235E-01         1.60798E+00         7.48487E-01         1.18151E+01         1.00000E+00         5.41569E-02         1.18152E+01         1.35131E+00         1.04639E+01
+          1.19114E-02         2.22709E-02        -1.96577E-02         7.48233E-01         1.61865E+00         7.48491E-01         1.13138E+01         1.00000E+00         5.40336E-02         1.13139E+01         1.29647E+00         1.00175E+01
+          1.19114E-02         2.24407E-02        -1.98963E-02         7.48230E-01         1.62932E+00         7.48494E-01         1.08294E+01         1.00000E+00         5.39008E-02         1.08294E+01         1.24309E+00         9.58634E+00
+          1.19114E-02         2.26106E-02        -2.01367E-02         7.48227E-01         1.63999E+00         7.48498E-01         1.03627E+01         1.00000E+00         5.37586E-02         1.03628E+01         1.19118E+00         9.17159E+00
+          1.19114E-02         2.27804E-02        -2.03789E-02         7.48224E-01         1.65066E+00         7.48501E-01         9.91480E+00         1.00000E+00         5.36067E-02         9.91488E+00         1.14073E+00         8.77415E+00
+          1.19114E-02         2.29502E-02        -2.06229E-02         7.48221E-01         1.66133E+00         7.48505E-01         9.48653E+00         1.00000E+00         5.34452E-02         9.48662E+00         1.09173E+00         8.39488E+00
+          1.19114E-02         2.31201E-02        -2.08688E-02         7.48218E-01         1.67200E+00         7.48509E-01         9.07862E+00         1.00000E+00         5.32741E-02         9.07871E+00         1.04417E+00         8.03454E+00
+          1.19114E-02         2.32899E-02        -2.11164E-02         7.48215E-01         1.68267E+00         7.48513E-01         8.69172E+00         1.00000E+00         5.30932E-02         8.69182E+00         9.98045E-01         7.69377E+00
+          1.19114E-02         2.34597E-02        -2.13659E-02         7.48212E-01         1.69334E+00         7.48517E-01         8.32637E+00         1.00000E+00         5.29026E-02         8.32646E+00         9.53335E-01         7.37312E+00
+          1.19114E-02         2.36295E-02        -2.16172E-02         7.48209E-01         1.70401E+00         7.48521E-01         7.98298E+00         1.00000E+00         5.27023E-02         7.98308E+00         9.10030E-01         7.07305E+00
+          1.19114E-02         2.37994E-02        -2.18703E-02         7.48206E-01         1.71468E+00         7.48526E-01         7.66190E+00         1.00000E+00         5.24923E-02         7.66200E+00         8.68119E-01         6.79388E+00
+          1.19114E-02         2.39692E-02        -2.21252E-02         7.48203E-01         1.72535E+00         7.48530E-01         7.36335E+00         1.00000E+00         5.22727E-02         7.36344E+00         8.27586E-01         6.53586E+00
+          1.19114E-02         2.41390E-02        -2.23819E-02         7.48200E-01         1.73602E+00         7.48535E-01         7.08745E+00         1.00000E+00         5.20434E-02         7.08754E+00         7.88415E-01         6.29913E+00
+          1.19114E-02         2.43088E-02        -2.26405E-02         7.48197E-01         1.74669E+00         7.48540E-01         6.83423E+00         1.00000E+00         5.18045E-02         6.83432E+00         7.50591E-01         6.08373E+00
+          1.19114E-02         2.44787E-02        -2.29008E-02         7.48194E-01         1.75736E+00         7.48544E-01         6.60363E+00         1.00000E+00         5.15561E-02         6.60372E+00         7.14095E-01         5.88962E+00
+          1.19114E-02         2.46485E-02        -2.31630E-02         7.48191E-01         1.76804E+00         7.48549E-01         6.39548E+00         1.00000E+00         5.12983E-02         6.39557E+00         6.78909E-01         5.71666E+00
+          1.19114E-02         2.48183E-02        -2.34270E-02         7.48188E-01         1.77871E+00         7.48554E-01         6.20954E+00         1.00000E+00         5.10312E-02         6.20963E+00         6.45013E-01         5.56461E+00
+          1.19114E-02         2.49882E-02        -2.36928E-02         7.48185E-01         1.78938E+00         7.48560E-01         6.04547E+00         1.00000E+00         5.07547E-02         6.04556E+00         6.12387E-01         5.43317E+00
+          1.19114E-02         2.51580E-02        -2.39604E-02         7.48181E-01         1.80005E+00         7.48565E-01         5.90286E+00         1.00000E+00         5.04692E-02         5.90295E+00         5.81010E-01         5.32194E+00
+          1.19114E-02         2.53278E-02        -2.42298E-02         7.48178E-01         1.81072E+00         7.48570E-01         5.78122E+00         1.00000E+00         5.01745E-02         5.78130E+00         5.50859E-01         5.23045E+00
+          1.19114E-02         2.54976E-02        -2.45010E-02         7.48175E-01         1.82139E+00         7.48576E-01         5.67999E+00         1.00000E+00         4.98710E-02         5.68007E+00         5.21911E-01         5.15816E+00
+          1.19114E-02         2.56675E-02        -2.47741E-02         7.48172E-01         1.83206E+00         7.48582E-01         5.59853E+00         1.00000E+00         4.95587E-02         5.59861E+00         4.94142E-01         5.10446E+00
+          1.19114E-02         2.58373E-02        -2.50489E-02         7.48168E-01         1.84273E+00         7.48588E-01         5.53615E+00         1.00000E+00         4.92377E-02         5.53623E+00         4.67529E-01         5.06870E+00
+          1.19114E-02         2.60071E-02        -2.53256E-02         7.48165E-01         1.85340E+00         7.48594E-01         5.49211E+00         1.00000E+00         4.89082E-02         5.49218E+00         4.42046E-01         5.05013E+00
+          1.19114E-02         2.61769E-02        -2.56041E-02         7.48162E-01         1.86407E+00         7.48600E-01         5.46560E+00         1.00000E+00         4.85703E-02         5.46567E+00         4.17667E-01         5.04800E+00
+          1.20813E-02         8.72665E-04        -4.22668E-03         7.59089E-01         2.74155E-01         7.59100E-01         4.29032E+02         1.00000E+00         1.00519E-01         4.29032E+02         3.38156E+01         3.95217E+02
+          1.20813E-02         1.04249E-03        -4.23689E-03         7.59088E-01         2.84826E-01         7.59100E-01         4.20118E+02         1.00000E+00         9.94575E-02         4.20118E+02         3.32872E+01         3.86831E+02
+          1.20813E-02         1.21232E-03        -4.24892E-03         7.59088E-01         2.95496E-01         7.59100E-01         4.11040E+02         1.00000E+00         9.83747E-02         4.11040E+02         3.27479E+01         3.78292E+02
+          1.20813E-02         1.38215E-03        -4.26276E-03         7.59088E-01         3.06167E-01         7.59100E-01         4.01815E+02         1.00000E+00         9.72720E-02         4.01816E+02         3.21988E+01         3.69617E+02
+          1.20813E-02         1.55197E-03        -4.27842E-03         7.59088E-01         3.16838E-01         7.59100E-01         3.92461E+02         1.00000E+00         9.61514E-02         3.92461E+02         3.16406E+01         3.60820E+02
+          1.20813E-02         1.72180E-03        -4.29588E-03         7.59088E-01         3.27508E-01         7.59100E-01         3.82992E+02         1.00000E+00         9.50147E-02         3.82993E+02         3.10744E+01         3.51918E+02
+          1.20813E-02         1.89163E-03        -4.31516E-03         7.59087E-01         3.38179E-01         7.59100E-01         3.73428E+02         1.00000E+00         9.38637E-02         3.73428E+02         3.05010E+01         3.42927E+02
+          1.20813E-02         2.06146E-03        -4.33625E-03         7.59087E-01         3.48849E-01         7.59100E-01         3.63784E+02         1.00000E+00         9.27002E-02         3.63784E+02         2.99213E+01         3.33862E+02
+          1.20813E-02         2.23128E-03        -4.35915E-03         7.59087E-01         3.59520E-01         7.59099E-01         3.54077E+02         1.00000E+00         9.15260E-02         3.54077E+02         2.93362E+01         3.24740E+02
+          1.20813E-02         2.40111E-03        -4.38386E-03         7.59087E-01         3.70190E-01         7.59099E-01         3.44323E+02         1.00000E+00         9.03431E-02         3.44323E+02         2.87467E+01         3.15577E+02
+          1.20813E-02         2.57094E-03        -4.41039E-03         7.59086E-01         3.80861E-01         7.59099E-01         3.34540E+02         1.00000E+00         8.91531E-02         3.34540E+02         2.81536E+01         3.06386E+02
+          1.20813E-02         2.74077E-03        -4.43873E-03         7.59086E-01         3.91532E-01         7.59099E-01         3.24743E+02         1.00000E+00         8.79579E-02         3.24743E+02         2.75579E+01         2.97185E+02
+          1.20813E-02         2.91059E-03        -4.46888E-03         7.59086E-01         4.02202E-01         7.59099E-01         3.14948E+02         1.00000E+00         8.67593E-02         3.14948E+02         2.69603E+01         2.87988E+02
+          1.20813E-02         3.08042E-03        -4.50084E-03         7.59085E-01         4.12873E-01         7.59099E-01         3.05171E+02         1.00000E+00         8.55590E-02         3.05171E+02         2.63618E+01         2.78809E+02
+          1.20813E-02         3.25025E-03        -4.53461E-03         7.59085E-01         4.23543E-01         7.59098E-01         2.95427E+02         1.00000E+00         8.43587E-02         2.95427E+02         2.57631E+01         2.69664E+02
+          1.20813E-02         3.42008E-03        -4.57020E-03         7.59084E-01         4.34214E-01         7.59098E-01         2.85731E+02         1.00000E+00         8.31601E-02         2.85731E+02         2.51652E+01         2.60566E+02
+          1.20813E-02         3.58990E-03        -4.60760E-03         7.59084E-01         4.44884E-01         7.59098E-01         2.76098E+02         1.00000E+00         8.19649E-02         2.76098E+02         2.45688E+01         2.51530E+02
+          1.20813E-02         3.75973E-03        -4.64681E-03         7.59083E-01         4.55555E-01         7.59098E-01         2.66542E+02         1.00000E+00         8.07745E-02         2.66542E+02         2.39748E+01         2.42567E+02
+          1.20813E-02         3.92956E-03        -4.68783E-03         7.59083E-01         4.66225E-01         7.59097E-01         2.57076E+02         1.00000E+00         7.95906E-02         2.57076E+02         2.33838E+01         2.33693E+02
+          1.20813E-02         4.09939E-03        -4.73066E-03         7.59082E-01         4.76896E-01         7.59097E-01         2.47714E+02         1.00000E+00         7.84147E-02         2.47714E+02         2.27966E+01         2.24918E+02
+          1.20813E-02         4.26921E-03        -4.77531E-03         7.59082E-01         4.87567E-01         7.59097E-01         2.38468E+02         1.00000E+00         7.72483E-02         2.38468E+02         2.22140E+01         2.16254E+02
+          1.20813E-02         4.43904E-03        -4.82176E-03         7.59081E-01         4.98237E-01         7.59097E-01         2.29351E+02         1.00000E+00         7.60926E-02         2.29351E+02         2.16366E+01         2.07714E+02
+          1.20813E-02         4.60887E-03        -4.87004E-03         7.59081E-01         5.08908E-01         7.59096E-01         2.20373E+02         1.00000E+00         7.49491E-02         2.20373E+02         2.10651E+01         1.99308E+02
+          1.20813E-02         4.77869E-03        -4.92012E-03         7.59080E-01         5.19578E-01         7.59096E-01         2.11546E+02         1.00000E+00         7.38190E-02         2.11546E+02         2.05001E+01         1.91046E+02
+          1.20813E-02         4.94852E-03        -4.97201E-03         7.59080E-01         5.30249E-01         7.59096E-01         2.02880E+02         1.00000E+00         7.27036E-02         2.02880E+02         1.99423E+01         1.82938E+02
+          1.20813E-02         5.11835E-03        -5.02572E-03         7.59079E-01         5.40919E-01         7.59095E-01         1.94385E+02         1.00000E+00         7.16039E-02         1.94385E+02         1.93922E+01         1.74993E+02
+          1.20813E-02         5.28818E-03        -5.08124E-03         7.59078E-01         5.51590E-01         7.59095E-01         1.86070E+02         1.00000E+00         7.05211E-02         1.86070E+02         1.88503E+01         1.67220E+02
+          1.20813E-02         5.45800E-03        -5.13857E-03         7.59077E-01         5.62261E-01         7.59095E-01         1.77943E+02         1.00000E+00         6.94562E-02         1.77943E+02         1.83171E+01         1.59626E+02
+          1.20813E-02         5.62783E-03        -5.19771E-03         7.59077E-01         5.72931E-01         7.59095E-01         1.70013E+02         1.00000E+00         6.84102E-02         1.70013E+02         1.77932E+01         1.52219E+02
+          1.20813E-02         5.79766E-03        -5.25866E-03         7.59076E-01         5.83602E-01         7.59094E-01         1.62285E+02         1.00000E+00         6.73838E-02         1.62285E+02         1.72789E+01         1.45006E+02
+          1.20813E-02         5.96749E-03        -5.32143E-03         7.59075E-01         5.94272E-01         7.59094E-01         1.54767E+02         1.00000E+00         6.63780E-02         1.54767E+02         1.67747E+01         1.37993E+02
+          1.20813E-02         6.13731E-03        -5.38601E-03         7.59075E-01         6.04943E-01         7.59094E-01         1.47465E+02         1.00000E+00         6.53934E-02         1.47465E+02         1.62810E+01         1.31184E+02
+          1.20813E-02         6.30714E-03        -5.45240E-03         7.59074E-01         6.15613E-01         7.59093E-01         1.40383E+02         1.00000E+00         6.44307E-02         1.40383E+02         1.57980E+01         1.24585E+02
+          1.20813E-02         6.47697E-03        -5.52061E-03         7.59073E-01         6.26284E-01         7.59093E-01         1.33526E+02         1.00000E+00         6.34906E-02         1.33526E+02         1.53261E+01         1.18200E+02
+          1.20813E-02         6.64680E-03        -5.59062E-03         7.59072E-01         6.36955E-01         7.59093E-01         1.26897E+02         1.00000E+00         6.25735E-02         1.26897E+02         1.48655E+01         1.12032E+02
+          1.20813E-02         6.81662E-03        -5.66245E-03         7.59071E-01         6.47625E-01         7.59092E-01         1.20500E+02         1.00000E+00         6.16800E-02         1.20500E+02         1.44166E+01         1.06084E+02
+          1.20813E-02         6.98645E-03        -5.73609E-03         7.59070E-01         6.58296E-01         7.59092E-01         1.14338E+02         1.00000E+00         6.08103E-02         1.14338E+02         1.39794E+01         1.00358E+02
+          1.20813E-02         7.15628E-03        -5.81154E-03         7.59069E-01         6.68966E-01         7.59092E-01         1.08411E+02         1.00000E+00         5.99649E-02         1.08411E+02         1.35542E+01         9.48565E+01
+          1.20813E-02         7.32611E-03        -5.88880E-03         7.59068E-01         6.79637E-01         7.59091E-01         1.02720E+02         1.00000E+00         5.91440E-02         1.02721E+02         1.31410E+01         8.95795E+01
+          1.20813E-02         7.49593E-03        -5.96788E-03         7.59067E-01         6.90307E-01         7.59091E-01         9.72678E+01         1.00000E+00         5.83478E-02         9.72678E+01         1.27400E+01         8.45278E+01
+          1.20813E-02         7.66576E-03        -6.04877E-03         7.59066E-01         7.00978E-01         7.59091E-01         9.20524E+01         1.00000E+00         5.75765E-02         9.20525E+01         1.23513E+01         7.97012E+01
+          1.20813E-02         7.83559E-03        -6.13147E-03         7.59065E-01         7.11649E-01         7.59090E-01         8.70736E+01         1.00000E+00         5.68301E-02         8.70737E+01         1.19749E+01         7.50988E+01
+          1.20813E-02         8.00542E-03        -6.21598E-03         7.59064E-01         7.22319E-01         7.59090E-01         8.23302E+01         1.00000E+00         5.61087E-02         8.23302E+01         1.16108E+01         7.07195E+01
+          1.20813E-02         8.17524E-03        -6.30231E-03         7.59063E-01         7.32990E-01         7.59090E-01         7.78202E+01         1.00000E+00         5.54123E-02         7.78202E+01         1.12589E+01         6.65613E+01
+          1.20813E-02         8.34507E-03        -6.39044E-03         7.59062E-01         7.43660E-01         7.59089E-01         7.35413E+01         1.00000E+00         5.47408E-02         7.35414E+01         1.09193E+01         6.26221E+01
+          1.20813E-02         8.51490E-03        -6.48039E-03         7.59061E-01         7.54331E-01         7.59089E-01         6.94906E+01         1.00000E+00         5.40941E-02         6.94907E+01         1.05918E+01         5.88989E+01
+          1.20813E-02         8.68473E-03        -6.57215E-03         7.59060E-01         7.65001E-01         7.59089E-01         6.56648E+01         1.00000E+00         5.34721E-02         6.56648E+01         1.02763E+01         5.53885E+01
+          1.20813E-02         8.85455E-03        -6.66573E-03         7.59059E-01         7.75672E-01         7.59088E-01         6.20600E+01         1.00000E+00         5.28746E-02         6.20600E+01         9.97278E+00         5.20872E+01
+          1.20813E-02         9.02438E-03        -6.76111E-03         7.59058E-01         7.86343E-01         7.59088E-01         5.86718E+01         1.00000E+00         5.23012E-02         5.86718E+01         9.68099E+00         4.89908E+01
+          1.20813E-02         9.19421E-03        -6.85831E-03         7.59057E-01         7.97013E-01         7.59088E-01         5.54957E+01         1.00000E+00         5.17519E-02         5.54957E+01         9.40076E+00         4.60949E+01
+          1.20813E-02         9.36403E-03        -6.95732E-03         7.59056E-01         8.07684E-01         7.59087E-01         5.25265E+01         1.00000E+00         5.12262E-02         5.25265E+01         9.13190E+00         4.33946E+01
+          1.20813E-02         9.53386E-03        -7.05815E-03         7.59054E-01         8.18354E-01         7.59087E-01         4.97588E+01         1.00000E+00         5.07240E-02         4.97588E+01         8.87419E+00         4.08846E+01
+          1.20813E-02         9.70369E-03        -7.16078E-03         7.59053E-01         8.29025E-01         7.59087E-01         4.71868E+01         1.00000E+00         5.02447E-02         4.71868E+01         8.62739E+00         3.85594E+01
+          1.20813E-02         9.87352E-03        -7.26523E-03         7.59052E-01         8.39695E-01         7.59087E-01         4.48044E+01         1.00000E+00         4.97881E-02         4.48044E+01         8.39125E+00         3.64131E+01
+          1.20813E-02         1.00433E-02        -7.37149E-03         7.59051E-01         8.50366E-01         7.59086E-01         4.26053E+01         1.00000E+00         4.93538E-02         4.26053E+01         8.16548E+00         3.44398E+01
+          1.20813E-02         1.02132E-02        -7.47956E-03         7.59049E-01         8.61037E-01         7.59086E-01         4.05829E+01         1.00000E+00         4.89413E-02         4.05829E+01         7.94980E+00         3.26331E+01
+          1.20813E-02         1.03830E-02        -7.58944E-03         7.59048E-01         8.71707E-01         7.59086E-01         3.87304E+01         1.00000E+00         4.85503E-02         3.87304E+01         7.74391E+00         3.09865E+01
+          1.20813E-02         1.05528E-02        -7.70114E-03         7.59047E-01         8.82378E-01         7.59086E-01         3.70408E+01         1.00000E+00         4.81803E-02         3.70407E+01         7.54749E+00         2.94932E+01
+          1.20813E-02         1.07227E-02        -7.81465E-03         7.59045E-01         8.93048E-01         7.59085E-01         3.55068E+01         1.00000E+00         4.78309E-02         3.55068E+01         7.36023E+00         2.81466E+01
+          1.20813E-02         1.08925E-02        -7.92997E-03         7.59044E-01         9.03719E-01         7.59085E-01         3.41213E+01         1.00000E+00         4.75015E-02         3.41213E+01         7.18177E+00         2.69395E+01
+          1.20813E-02         1.10623E-02        -8.04710E-03         7.59042E-01         9.14389E-01         7.59085E-01         3.28769E+01         1.00000E+00         4.71918E-02         3.28768E+01         7.01179E+00         2.58651E+01
+          1.20813E-02         1.12321E-02        -8.16605E-03         7.59041E-01         9.25060E-01         7.59085E-01         3.17660E+01         1.00000E+00         4.69013E-02         3.17660E+01         6.84993E+00         2.49160E+01
+          1.20813E-02         1.14020E-02        -8.28681E-03         7.59039E-01         9.35731E-01         7.59085E-01         3.07811E+01         1.00000E+00         4.66294E-02         3.07811E+01         6.69584E+00         2.40853E+01
+          1.20813E-02         1.15718E-02        -8.40938E-03         7.59038E-01         9.46401E-01         7.59085E-01         2.99148E+01         1.00000E+00         4.63758E-02         2.99148E+01         6.54917E+00         2.33656E+01
+          1.20813E-02         1.17416E-02        -8.53376E-03         7.59036E-01         9.57072E-01         7.59084E-01         2.91595E+01         1.00000E+00         4.61398E-02         2.91595E+01         6.40954E+00         2.27499E+01
+          1.20813E-02         1.19114E-02        -8.65996E-03         7.59035E-01         9.67742E-01         7.59084E-01         2.85077E+01         1.00000E+00         4.59210E-02         2.85076E+01         6.27661E+00         2.22310E+01
+          1.20813E-02         1.20813E-02        -8.78797E-03         7.59033E-01         9.78413E-01         7.59084E-01         2.79519E+01         1.00000E+00         4.57188E-02         2.79518E+01         6.15000E+00         2.18018E+01
+          1.20813E-02         1.22511E-02        -8.91779E-03         7.59032E-01         9.89083E-01         7.59084E-01         2.74848E+01         1.00000E+00         4.55329E-02         2.74847E+01         6.02937E+00         2.14554E+01
+          1.20813E-02         1.24209E-02        -9.04942E-03         7.59030E-01         9.99754E-01         7.59084E-01         2.70991E+01         1.00000E+00         4.53626E-02         2.70991E+01         5.91435E+00         2.11847E+01
+          1.20813E-02         1.25908E-02        -9.18286E-03         7.59029E-01         1.01042E+00         7.59084E-01         2.67877E+01         1.00000E+00         4.52074E-02         2.67876E+01         5.80459E+00         2.09830E+01
+          1.20813E-02         1.27606E-02        -9.31812E-03         7.59027E-01         1.02110E+00         7.59084E-01         2.65435E+01         1.00000E+00         4.50669E-02         2.65435E+01         5.69973E+00         2.08437E+01
+          1.20813E-02         1.29304E-02        -9.45519E-03         7.59025E-01         1.03177E+00         7.59084E-01         2.63598E+01         1.00000E+00         4.49404E-02         2.63597E+01         5.59945E+00         2.07603E+01
+          1.20813E-02         1.31002E-02        -9.59407E-03         7.59024E-01         1.04244E+00         7.59084E-01         2.62298E+01         1.00000E+00         4.48275E-02         2.62297E+01         5.50339E+00         2.07263E+01
+          1.20813E-02         1.32701E-02        -9.73477E-03         7.59022E-01         1.05311E+00         7.59084E-01         2.61471E+01         1.00000E+00         4.47277E-02         2.61470E+01         5.41122E+00         2.07358E+01
+          1.20813E-02         1.34399E-02        -9.87728E-03         7.59020E-01         1.06378E+00         7.59085E-01         2.61054E+01         1.00000E+00         4.46403E-02         2.61053E+01         5.32264E+00         2.07827E+01
+          1.20813E-02         1.36097E-02        -1.00216E-02         7.59018E-01         1.07445E+00         7.59085E-01         2.60987E+01         1.00000E+00         4.45650E-02         2.60986E+01         5.23731E+00         2.08613E+01
+          1.20813E-02         1.37795E-02        -1.01677E-02         7.59017E-01         1.08512E+00         7.59085E-01         2.61211E+01         1.00000E+00         4.45010E-02         2.61211E+01         5.15495E+00         2.09661E+01
+          1.20813E-02         1.39494E-02        -1.03157E-02         7.59015E-01         1.09579E+00         7.59085E-01         2.61672E+01         1.00000E+00         4.44480E-02         2.61672E+01         5.07525E+00         2.10919E+01
+          1.20813E-02         1.41192E-02        -1.04654E-02         7.59013E-01         1.10646E+00         7.59085E-01         2.62316E+01         1.00000E+00         4.44053E-02         2.62316E+01         4.99794E+00         2.12336E+01
+          1.20813E-02         1.42890E-02        -1.06170E-02         7.59011E-01         1.11713E+00         7.59086E-01         2.63093E+01         1.00000E+00         4.43725E-02         2.63093E+01         4.92275E+00         2.13865E+01
+          1.20813E-02         1.44589E-02        -1.07704E-02         7.59009E-01         1.12780E+00         7.59086E-01         2.63956E+01         1.00000E+00         4.43490E-02         2.63956E+01         4.84941E+00         2.15461E+01
+          1.20813E-02         1.46287E-02        -1.09256E-02         7.59008E-01         1.13847E+00         7.59086E-01         2.64860E+01         1.00000E+00         4.43342E-02         2.64859E+01         4.77768E+00         2.17082E+01
+          1.20813E-02         1.47985E-02        -1.10826E-02         7.59006E-01         1.14914E+00         7.59087E-01         2.65762E+01         1.00000E+00         4.43276E-02         2.65761E+01         4.70733E+00         2.18688E+01
+          1.20813E-02         1.49683E-02        -1.12414E-02         7.59004E-01         1.15981E+00         7.59087E-01         2.66624E+01         1.00000E+00         4.43287E-02         2.66624E+01         4.63814E+00         2.20242E+01
+          1.20813E-02         1.51382E-02        -1.14020E-02         7.59002E-01         1.17048E+00         7.59087E-01         2.67410E+01         1.00000E+00         4.43369E-02         2.67410E+01         4.56990E+00         2.21711E+01
+          1.20813E-02         1.53080E-02        -1.15645E-02         7.59000E-01         1.18115E+00         7.59088E-01         2.68087E+01         1.00000E+00         4.43517E-02         2.68087E+01         4.50241E+00         2.23062E+01
+          1.20813E-02         1.54778E-02        -1.17287E-02         7.58998E-01         1.19182E+00         7.59088E-01         2.68625E+01         1.00000E+00         4.43726E-02         2.68624E+01         4.43551E+00         2.24269E+01
+          1.20813E-02         1.56476E-02        -1.18948E-02         7.58996E-01         1.20249E+00         7.59089E-01         2.68995E+01         1.00000E+00         4.43990E-02         2.68995E+01         4.36901E+00         2.25305E+01
+          1.20813E-02         1.58175E-02        -1.20627E-02         7.58994E-01         1.21317E+00         7.59090E-01         2.69175E+01         1.00000E+00         4.44305E-02         2.69174E+01         4.30277E+00         2.26147E+01
+          1.20813E-02         1.59873E-02        -1.22324E-02         7.58992E-01         1.22384E+00         7.59090E-01         2.69142E+01         1.00000E+00         4.44665E-02         2.69141E+01         4.23665E+00         2.26775E+01
+          1.20813E-02         1.61571E-02        -1.24039E-02         7.58990E-01         1.23451E+00         7.59091E-01         2.68877E+01         1.00000E+00         4.45064E-02         2.68877E+01         4.17052E+00         2.27171E+01
+          1.20813E-02         1.63270E-02        -1.25772E-02         7.58988E-01         1.24518E+00         7.59092E-01         2.68365E+01         1.00000E+00         4.45499E-02         2.68365E+01         4.10427E+00         2.27322E+01
+          1.20813E-02         1.64968E-02        -1.27524E-02         7.58986E-01         1.25585E+00         7.59093E-01         2.67593E+01         1.00000E+00         4.45963E-02         2.67592E+01         4.03780E+00         2.27214E+01
+          1.20813E-02         1.66666E-02        -1.29293E-02         7.58983E-01         1.26652E+00         7.59093E-01         2.66549E+01         1.00000E+00         4.46452E-02         2.66548E+01         3.97102E+00         2.26838E+01
+          1.20813E-02         1.68364E-02        -1.31081E-02         7.58981E-01         1.27719E+00         7.59094E-01         2.65225E+01         1.00000E+00         4.46960E-02         2.65225E+01         3.90386E+00         2.26186E+01
+          1.20813E-02         1.70063E-02        -1.32886E-02         7.58979E-01         1.28786E+00         7.59095E-01         2.63617E+01         1.00000E+00         4.47484E-02         2.63616E+01         3.83626E+00         2.25254E+01
+          1.20813E-02         1.71761E-02        -1.34710E-02         7.58977E-01         1.29853E+00         7.59096E-01         2.61720E+01         1.00000E+00         4.48019E-02         2.61719E+01         3.76816E+00         2.24038E+01
+          1.20813E-02         1.73459E-02        -1.36552E-02         7.58975E-01         1.30920E+00         7.59097E-01         2.59534E+01         1.00000E+00         4.48559E-02         2.59533E+01         3.69954E+00         2.22538E+01
+          1.20813E-02         1.75158E-02        -1.38412E-02         7.58972E-01         1.31987E+00         7.59099E-01         2.57059E+01         1.00000E+00         4.49100E-02         2.57059E+01         3.63035E+00         2.20755E+01
+          1.20813E-02         1.76856E-02        -1.40291E-02         7.58970E-01         1.33054E+00         7.59100E-01         2.54299E+01         1.00000E+00         4.49638E-02         2.54299E+01         3.56058E+00         2.18693E+01
+          1.20813E-02         1.78554E-02        -1.42187E-02         7.58968E-01         1.34121E+00         7.59101E-01         2.51260E+01         1.00000E+00         4.50169E-02         2.51259E+01         3.49022E+00         2.16357E+01
+          1.20813E-02         1.80252E-02        -1.44102E-02         7.58965E-01         1.35188E+00         7.59102E-01         2.47947E+01         1.00000E+00         4.50688E-02         2.47946E+01         3.41929E+00         2.13754E+01
+          1.20813E-02         1.81951E-02        -1.46034E-02         7.58963E-01         1.36255E+00         7.59104E-01         2.44369E+01         1.00000E+00         4.51191E-02         2.44369E+01         3.34778E+00         2.10891E+01
+          1.20813E-02         1.83649E-02        -1.47985E-02         7.58961E-01         1.37322E+00         7.59105E-01         2.40537E+01         1.00000E+00         4.51674E-02         2.40537E+01         3.27572E+00         2.07780E+01
+          1.20813E-02         1.85347E-02        -1.49954E-02         7.58958E-01         1.38389E+00         7.59107E-01         2.36463E+01         1.00000E+00         4.52133E-02         2.36462E+01         3.20314E+00         2.04431E+01
+          1.20813E-02         1.87045E-02        -1.51941E-02         7.58956E-01         1.39457E+00         7.59108E-01         2.32158E+01         1.00000E+00         4.52565E-02         2.32158E+01         3.13007E+00         2.00857E+01
+          1.20813E-02         1.88744E-02        -1.53946E-02         7.58954E-01         1.40524E+00         7.59110E-01         2.27637E+01         1.00000E+00         4.52966E-02         2.27637E+01         3.05656E+00         1.97071E+01
+          1.20813E-02         1.90442E-02        -1.55969E-02         7.58951E-01         1.41591E+00         7.59111E-01         2.22915E+01         1.00000E+00         4.53332E-02         2.22915E+01         2.98265E+00         1.93089E+01
+          1.20813E-02         1.92140E-02        -1.58011E-02         7.58949E-01         1.42658E+00         7.59113E-01         2.18009E+01         1.00000E+00         4.53660E-02         2.18009E+01         2.90840E+00         1.88925E+01
+          1.20813E-02         1.93839E-02        -1.60070E-02         7.58946E-01         1.43725E+00         7.59115E-01         2.12934E+01         1.00000E+00         4.53947E-02         2.12934E+01         2.83387E+00         1.84595E+01
+          1.20813E-02         1.95537E-02        -1.62148E-02         7.58944E-01         1.44792E+00         7.59117E-01         2.07709E+01         1.00000E+00         4.54190E-02         2.07709E+01         2.75913E+00         1.80117E+01
+          1.20813E-02         1.97235E-02        -1.64244E-02         7.58941E-01         1.45859E+00         7.59119E-01         2.02350E+01         1.00000E+00         4.54385E-02         2.02351E+01         2.68423E+00         1.75508E+01
+          1.20813E-02         1.98933E-02        -1.66358E-02         7.58939E-01         1.46926E+00         7.59121E-01         1.96878E+01         1.00000E+00         4.54530E-02         1.96878E+01         2.60926E+00         1.70786E+01
+          1.20813E-02         2.00632E-02        -1.68490E-02         7.58936E-01         1.47993E+00         7.59123E-01         1.91310E+01         1.00000E+00         4.54623E-02         1.91310E+01         2.53429E+00         1.65968E+01
+          1.20813E-02         2.02330E-02        -1.70640E-02         7.58933E-01         1.49060E+00         7.59125E-01         1.85666E+01         1.00000E+00         4.54660E-02         1.85666E+01         2.45940E+00         1.61072E+01
+          1.20813E-02         2.04028E-02        -1.72808E-02         7.58931E-01         1.50127E+00         7.59128E-01         1.79964E+01         1.00000E+00         4.54639E-02         1.79964E+01         2.38466E+00         1.56117E+01
+          1.20813E-02         2.05726E-02        -1.74995E-02         7.58928E-01         1.51194E+00         7.59130E-01         1.74222E+01         1.00000E+00         4.54559E-02         1.74223E+01         2.31016E+00         1.51121E+01
+          1.20813E-02         2.07425E-02        -1.77199E-02         7.58925E-01         1.52261E+00         7.59132E-01         1.68461E+01         1.00000E+00         4.54416E-02         1.68462E+01         2.23598E+00         1.46102E+01
+          1.20813E-02         2.09123E-02        -1.79422E-02         7.58923E-01         1.53328E+00         7.59135E-01         1.62699E+01         1.00000E+00         4.54209E-02         1.62699E+01         2.16221E+00         1.41077E+01
+          1.20813E-02         2.10821E-02        -1.81663E-02         7.58920E-01         1.54395E+00         7.59137E-01         1.56953E+01         1.00000E+00         4.53936E-02         1.56953E+01         2.08891E+00         1.36064E+01
+          1.20813E-02         2.12520E-02        -1.83922E-02         7.58917E-01         1.55462E+00         7.59140E-01         1.51242E+01         1.00000E+00         4.53595E-02         1.51242E+01         2.01618E+00         1.31080E+01
+          1.20813E-02         2.14218E-02        -1.86199E-02         7.58915E-01         1.56529E+00         7.59143E-01         1.45582E+01         1.00000E+00         4.53185E-02         1.45583E+01         1.94410E+00         1.26142E+01
+          1.20813E-02         2.15916E-02        -1.88494E-02         7.58912E-01         1.57596E+00         7.59146E-01         1.39991E+01         1.00000E+00         4.52704E-02         1.39992E+01         1.87275E+00         1.21264E+01
+          1.20813E-02         2.17614E-02        -1.90808E-02         7.58909E-01         1.58664E+00         7.59149E-01         1.34485E+01         1.00000E+00         4.52150E-02         1.34486E+01         1.80220E+00         1.16464E+01
+          1.20813E-02         2.19313E-02        -1.93139E-02         7.58906E-01         1.59731E+00         7.59152E-01         1.29079E+01         1.00000E+00         4.51524E-02         1.29079E+01         1.73252E+00         1.11754E+01
+          1.20813E-02         2.21011E-02        -1.95489E-02         7.58903E-01         1.60798E+00         7.59155E-01         1.23787E+01         1.00000E+00         4.50823E-02         1.23788E+01         1.66381E+00         1.07150E+01
+          1.20813E-02         2.22709E-02        -1.97857E-02         7.58901E-01         1.61865E+00         7.59158E-01         1.18624E+01         1.00000E+00         4.50046E-02         1.18625E+01         1.59612E+00         1.02664E+01
+          1.20813E-02         2.24407E-02        -2.00242E-02         7.58898E-01         1.62932E+00         7.59162E-01         1.13602E+01         1.00000E+00         4.49193E-02         1.13603E+01         1.52952E+00         9.83077E+00
+          1.20813E-02         2.26106E-02        -2.02647E-02         7.58895E-01         1.63999E+00         7.59165E-01         1.08734E+01         1.00000E+00         4.48263E-02         1.08734E+01         1.46408E+00         9.40935E+00
+          1.20813E-02         2.27804E-02        -2.05069E-02         7.58892E-01         1.65066E+00         7.59169E-01         1.04030E+01         1.00000E+00         4.47256E-02         1.04030E+01         1.39986E+00         9.00316E+00
+          1.20813E-02         2.29502E-02        -2.07509E-02         7.58889E-01         1.66133E+00         7.59173E-01         9.94999E+00         1.00000E+00         4.46170E-02         9.95005E+00         1.33692E+00         8.61313E+00
+          1.20813E-02         2.31201E-02        -2.09967E-02         7.58886E-01         1.67200E+00         7.59176E-01         9.51538E+00         1.00000E+00         4.45006E-02         9.51544E+00         1.27531E+00         8.24013E+00
+          1.20813E-02         2.32899E-02        -2.12444E-02         7.58883E-01         1.68267E+00         7.59180E-01         9.09994E+00         1.00000E+00         4.43763E-02         9.10000E+00         1.21509E+00         7.88491E+00
+          1.20813E-02         2.34597E-02        -2.14939E-02         7.58880E-01         1.69334E+00         7.59184E-01         8.70438E+00         1.00000E+00         4.42441E-02         8.70445E+00         1.15630E+00         7.54815E+00
+          1.20813E-02         2.36295E-02        -2.17452E-02         7.58877E-01         1.70401E+00         7.59188E-01         8.32931E+00         1.00000E+00         4.41040E-02         8.32937E+00         1.09898E+00         7.23039E+00
+          1.20813E-02         2.37994E-02        -2.19983E-02         7.58874E-01         1.71468E+00         7.59193E-01         7.97523E+00         1.00000E+00         4.39561E-02         7.97529E+00         1.04317E+00         6.93212E+00
+          1.20813E-02         2.39692E-02        -2.22532E-02         7.58871E-01         1.72535E+00         7.59197E-01         7.64253E+00         1.00000E+00         4.38002E-02         7.64260E+00         9.88911E-01         6.65369E+00
+          1.20813E-02         2.41390E-02        -2.25099E-02         7.58868E-01         1.73602E+00         7.59201E-01         7.33154E+00         1.00000E+00         4.36365E-02         7.33160E+00         9.36226E-01         6.39538E+00
+          1.20813E-02         2.43088E-02        -2.27684E-02         7.58864E-01         1.74669E+00         7.59206E-01         7.04244E+00         1.00000E+00         4.34650E-02         7.04250E+00         8.85142E-01         6.15736E+00
+          1.20813E-02         2.44787E-02        -2.30288E-02         7.58861E-01         1.75736E+00         7.59211E-01         6.77534E+00         1.00000E+00         4.32857E-02         6.77541E+00         8.35682E-01         5.93972E+00
+          1.20813E-02         2.46485E-02        -2.32910E-02         7.58858E-01         1.76804E+00         7.59216E-01         6.53026E+00         1.00000E+00         4.30986E-02         6.53033E+00         7.87861E-01         5.74246E+00
+          1.20813E-02         2.48183E-02        -2.35549E-02         7.58855E-01         1.77871E+00         7.59220E-01         6.30712E+00         1.00000E+00         4.29039E-02         6.30718E+00         7.41694E-01         5.56548E+00
+          1.20813E-02         2.49882E-02        -2.38207E-02         7.58852E-01         1.78938E+00         7.59226E-01         6.10574E+00         1.00000E+00         4.27015E-02         6.10580E+00         6.97188E-01         5.40861E+00
+          1.20813E-02         2.51580E-02        -2.40883E-02         7.58849E-01         1.80005E+00         7.59231E-01         5.92587E+00         1.00000E+00         4.24916E-02         5.92593E+00         6.54349E-01         5.27158E+00
+          1.20813E-02         2.53278E-02        -2.43578E-02         7.58845E-01         1.81072E+00         7.59236E-01         5.76717E+00         1.00000E+00         4.22742E-02         5.76723E+00         6.13178E-01         5.15405E+00
+          1.20813E-02         2.54976E-02        -2.46290E-02         7.58842E-01         1.82139E+00         7.59242E-01         5.62923E+00         1.00000E+00         4.20495E-02         5.62929E+00         5.73672E-01         5.05562E+00
+          1.20813E-02         2.56675E-02        -2.49021E-02         7.58839E-01         1.83206E+00         7.59247E-01         5.51157E+00         1.00000E+00         4.18175E-02         5.51163E+00         5.35822E-01         4.97580E+00
+          1.20813E-02         2.58373E-02        -2.51769E-02         7.58835E-01         1.84273E+00         7.59253E-01         5.41363E+00         1.00000E+00         4.15782E-02         5.41368E+00         4.99621E-01         4.91406E+00
+          1.20813E-02         2.60071E-02        -2.54536E-02         7.58832E-01         1.85340E+00         7.59259E-01         5.33478E+00         1.00000E+00         4.13319E-02         5.33483E+00         4.65053E-01         4.86978E+00
+          1.20813E-02         2.61769E-02        -2.57321E-02         7.58829E-01         1.86407E+00         7.59265E-01         5.27435E+00         1.00000E+00         4.10786E-02         5.27440E+00         4.32101E-01         4.84230E+00
+          1.22511E-02         8.72665E-04        -4.35651E-03         7.69759E-01         2.74155E-01         7.69771E-01         4.24178E+02         1.00000E+00         7.76271E-02         4.24178E+02         4.31781E+01         3.81000E+02
+          1.22511E-02         1.04249E-03        -4.36672E-03         7.69759E-01         2.84826E-01         7.69771E-01         4.15392E+02         1.00000E+00         7.68237E-02         4.15392E+02         4.23865E+01         3.73005E+02
+          1.22511E-02         1.21232E-03        -4.37875E-03         7.69759E-01         2.95496E-01         7.69771E-01         4.06442E+02         1.00000E+00         7.60039E-02         4.06442E+02         4.15795E+01         3.64863E+02
+          1.22511E-02         1.38215E-03        -4.39259E-03         7.69759E-01         3.06167E-01         7.69771E-01         3.97345E+02         1.00000E+00         7.51694E-02         3.97345E+02         4.07584E+01         3.56587E+02
+          1.22511E-02         1.55197E-03        -4.40825E-03         7.69758E-01         3.16838E-01         7.69771E-01         3.88118E+02         1.00000E+00         7.43213E-02         3.88118E+02         3.99248E+01         3.48193E+02
+          1.22511E-02         1.72180E-03        -4.42571E-03         7.69758E-01         3.27508E-01         7.69771E-01         3.78776E+02         1.00000E+00         7.34612E-02         3.78776E+02         3.90799E+01         3.39696E+02
+          1.22511E-02         1.89163E-03        -4.44499E-03         7.69758E-01         3.38179E-01         7.69771E-01         3.69336E+02         1.00000E+00         7.25903E-02         3.69337E+02         3.82253E+01         3.31111E+02
+          1.22511E-02         2.06146E-03        -4.46608E-03         7.69758E-01         3.48849E-01         7.69771E-01         3.59816E+02         1.00000E+00         7.17103E-02         3.59816E+02         3.73623E+01         3.22453E+02
+          1.22511E-02         2.23128E-03        -4.48898E-03         7.69757E-01         3.59520E-01         7.69771E-01         3.50230E+02         1.00000E+00         7.08223E-02         3.50230E+02         3.64924E+01         3.13737E+02
+          1.22511E-02         2.40111E-03        -4.51369E-03         7.69757E-01         3.70190E-01         7.69770E-01         3.40595E+02         1.00000E+00         6.99279E-02         3.40595E+02         3.56170E+01         3.04978E+02
+          1.22511E-02         2.57094E-03        -4.54022E-03         7.69757E-01         3.80861E-01         7.69770E-01         3.30928E+02         1.00000E+00         6.90284E-02         3.30928E+02         3.47375E+01         2.96190E+02
+          1.22511E-02         2.74077E-03        -4.56856E-03         7.69756E-01         3.91532E-01         7.69770E-01         3.21244E+02         1.00000E+00         6.81251E-02         3.21244E+02         3.38553E+01         2.87389E+02
+          1.22511E-02         2.91059E-03        -4.59871E-03         7.69756E-01         4.02202E-01         7.69770E-01         3.11559E+02         1.00000E+00         6.72195E-02         3.11559E+02         3.29717E+01         2.78587E+02
+          1.22511E-02         3.08042E-03        -4.63067E-03         7.69756E-01         4.12873E-01         7.69770E-01         3.01888E+02         1.00000E+00         6.63128E-02         3.01888E+02         3.20882E+01         2.69800E+02
+          1.22511E-02         3.25025E-03        -4.66444E-03         7.69755E-01         4.23543E-01         7.69769E-01         2.92246E+02         1.00000E+00         6.54064E-02         2.92246E+02         3.12060E+01         2.61040E+02
+          1.22511E-02         3.42008E-03        -4.70003E-03         7.69755E-01         4.34214E-01         7.69769E-01         2.82649E+02         1.00000E+00         6.45015E-02         2.82649E+02         3.03264E+01         2.52322E+02
+          1.22511E-02         3.58990E-03        -4.73742E-03         7.69754E-01         4.44884E-01         7.69769E-01         2.73109E+02         1.00000E+00         6.35994E-02         2.73110E+02         2.94506E+01         2.43659E+02
+          1.22511E-02         3.75973E-03        -4.77663E-03         7.69754E-01         4.55555E-01         7.69769E-01         2.63643E+02         1.00000E+00         6.27013E-02         2.63643E+02         2.85800E+01         2.35063E+02
+          1.22511E-02         3.92956E-03        -4.81766E-03         7.69753E-01         4.66225E-01         7.69769E-01         2.54262E+02         1.00000E+00         6.18084E-02         2.54262E+02         2.77158E+01         2.26546E+02
+          1.22511E-02         4.09939E-03        -4.86049E-03         7.69753E-01         4.76896E-01         7.69768E-01         2.44980E+02         1.00000E+00         6.09218E-02         2.44980E+02         2.68590E+01         2.18121E+02
+          1.22511E-02         4.26921E-03        -4.90514E-03         7.69752E-01         4.87567E-01         7.69768E-01         2.35809E+02         1.00000E+00         6.00427E-02         2.35809E+02         2.60107E+01         2.09798E+02
+          1.22511E-02         4.43904E-03        -4.95159E-03         7.69752E-01         4.98237E-01         7.69768E-01         2.26761E+02         1.00000E+00         5.91720E-02         2.26761E+02         2.51722E+01         2.01589E+02
+          1.22511E-02         4.60887E-03        -4.99986E-03         7.69751E-01         5.08908E-01         7.69767E-01         2.17849E+02         1.00000E+00         5.83109E-02         2.17849E+02         2.43443E+01         1.93505E+02
+          1.22511E-02         4.77869E-03        -5.04995E-03         7.69751E-01         5.19578E-01         7.69767E-01         2.09082E+02         1.00000E+00         5.74602E-02         2.09082E+02         2.35281E+01         1.85554E+02
+          1.22511E-02         4.94852E-03        -5.10184E-03         7.69750E-01         5.30249E-01         7.69767E-01         2.00471E+02         1.00000E+00         5.66210E-02         2.00471E+02         2.27245E+01         1.77747E+02
+          1.22511E-02         5.11835E-03        -5.15555E-03         7.69749E-01         5.40919E-01         7.69767E-01         1.92026E+02         1.00000E+00         5.57941E-02         1.92026E+02         2.19343E+01         1.70092E+02
+          1.22511E-02         5.28818E-03        -5.21106E-03         7.69749E-01         5.51590E-01         7.69766E-01         1.83756E+02         1.00000E+00         5.49802E-02         1.83756E+02         2.11585E+01         1.62598E+02
+          1.22511E-02         5.45800E-03        -5.26839E-03         7.69748E-01         5.62261E-01         7.69766E-01         1.75669E+02         1.00000E+00         5.41803E-02         1.75669E+02         2.03978E+01         1.55272E+02
+          1.22511E-02         5.62783E-03        -5.32754E-03         7.69747E-01         5.72931E-01         7.69766E-01         1.67774E+02         1.00000E+00         5.33949E-02         1.67774E+02         1.96529E+01         1.48121E+02
+          1.22511E-02         5.79766E-03        -5.38849E-03         7.69746E-01         5.83602E-01         7.69765E-01         1.60077E+02         1.00000E+00         5.26248E-02         1.60077E+02         1.89245E+01         1.41152E+02
+          1.22511E-02         5.96749E-03        -5.45126E-03         7.69746E-01         5.94272E-01         7.69765E-01         1.52584E+02         1.00000E+00         5.18706E-02         1.52584E+02         1.82132E+01         1.34371E+02
+          1.22511E-02         6.13731E-03        -5.51584E-03         7.69745E-01         6.04943E-01         7.69765E-01         1.45303E+02         1.00000E+00         5.11329E-02         1.45303E+02         1.75196E+01         1.27783E+02
+          1.22511E-02         6.30714E-03        -5.58223E-03         7.69744E-01         6.15613E-01         7.69764E-01         1.38238E+02         1.00000E+00         5.04121E-02         1.38238E+02         1.68442E+01         1.21393E+02
+          1.22511E-02         6.47697E-03        -5.65043E-03         7.69743E-01         6.26284E-01         7.69764E-01         1.31393E+02         1.00000E+00         4.97087E-02         1.31393E+02         1.61874E+01         1.15205E+02
+          1.22511E-02         6.64680E-03        -5.72045E-03         7.69742E-01         6.36955E-01         7.69764E-01         1.24773E+02         1.00000E+00         4.90231E-02         1.24773E+02         1.55496E+01         1.09223E+02
+          1.22511E-02         6.81662E-03        -5.79227E-03         7.69741E-01         6.47625E-01         7.69763E-01         1.18380E+02         1.00000E+00         4.83557E-02         1.18380E+02         1.49312E+01         1.03449E+02
+          1.22511E-02         6.98645E-03        -5.86591E-03         7.69741E-01         6.58296E-01         7.69763E-01         1.12218E+02         1.00000E+00         4.77067E-02         1.12219E+02         1.43324E+01         9.78861E+01
+          1.22511E-02         7.15628E-03        -5.94137E-03         7.69740E-01         6.68966E-01         7.69763E-01         1.06289E+02         1.00000E+00         4.70764E-02         1.06289E+02         1.37536E+01         9.25356E+01
+          1.22511E-02         7.32611E-03        -6.01863E-03         7.69739E-01         6.79637E-01         7.69762E-01         1.00593E+02         1.00000E+00         4.64650E-02         1.00594E+02         1.31947E+01         8.73988E+01
+          1.22511E-02         7.49593E-03        -6.09771E-03         7.69738E-01         6.90307E-01         7.69762E-01         9.51325E+01         1.00000E+00         4.58727E-02         9.51326E+01         1.26561E+01         8.24765E+01
+          1.22511E-02         7.66576E-03        -6.17859E-03         7.69737E-01         7.00978E-01         7.69762E-01         8.99063E+01         1.00000E+00         4.52996E-02         8.99064E+01         1.21377E+01         7.77687E+01
+          1.22511E-02         7.83559E-03        -6.26129E-03         7.69736E-01         7.11649E-01         7.69761E-01         8.49145E+01         1.00000E+00         4.47457E-02         8.49145E+01         1.16395E+01         7.32750E+01
+          1.22511E-02         8.00542E-03        -6.34581E-03         7.69735E-01         7.22319E-01         7.69761E-01         8.01559E+01         1.00000E+00         4.42110E-02         8.01559E+01         1.11617E+01         6.89943E+01
+          1.22511E-02         8.17524E-03        -6.43213E-03         7.69734E-01         7.32990E-01         7.69761E-01         7.56292E+01         1.00000E+00         4.36956E-02         7.56292E+01         1.07039E+01         6.49252E+01
+          1.22511E-02         8.34507E-03        -6.52027E-03         7.69733E-01         7.43660E-01         7.69760E-01         7.13321E+01         1.00000E+00         4.31994E-02         7.13321E+01         1.02663E+01         6.10659E+01
+          1.22511E-02         8.51490E-03        -6.61022E-03         7.69731E-01         7.54331E-01         7.69760E-01         6.72622E+01         1.00000E+00         4.27223E-02         6.72622E+01         9.84847E+00         5.74138E+01
+          1.22511E-02         8.68473E-03        -6.70198E-03         7.69730E-01         7.65001E-01         7.69760E-01         6.34163E+01         1.00000E+00         4.22642E-02         6.34163E+01         9.45034E+00         5.39660E+01
+          1.22511E-02         8.85455E-03        -6.79555E-03         7.69729E-01         7.75672E-01         7.69759E-01         5.97910E+01         1.00000E+00         4.18250E-02         5.97910E+01         9.07163E+00         5.07194E+01
+          1.22511E-02         9.02438E-03        -6.89094E-03         7.69728E-01         7.86343E-01         7.69759E-01         5.63821E+01         1.00000E+00         4.14044E-02         5.63822E+01         8.71204E+00         4.76701E+01
+          1.22511E-02         9.19421E-03        -6.98814E-03         7.69727E-01         7.97013E-01         7.69759E-01         5.31854E+01         1.00000E+00         4.10023E-02         5.31855E+01         8.37125E+00         4.48142E+01
+          1.22511E-02         9.36403E-03        -7.08715E-03         7.69726E-01         8.07684E-01         7.69758E-01         5.01961E+01         1.00000E+00         4.06185E-02         5.01961E+01         8.04889E+00         4.21472E+01
+          1.22511E-02         9.53386E-03        -7.18797E-03         7.69724E-01         8.18354E-01         7.69758E-01         4.74089E+01         1.00000E+00         4.02526E-02         4.74089E+01         7.74456E+00         3.96643E+01
+          1.22511E-02         9.70369E-03        -7.29060E-03         7.69723E-01         8.29025E-01         7.69758E-01         4.48184E+01         1.00000E+00         3.99046E-02         4.48184E+01         7.45784E+00         3.73606E+01
+          1.22511E-02         9.87352E-03        -7.39505E-03         7.69722E-01         8.39695E-01         7.69757E-01         4.24188E+01         1.00000E+00         3.95739E-02         4.24188E+01         7.18827E+00         3.52305E+01
+          1.22511E-02         1.00433E-02        -7.50131E-03         7.69721E-01         8.50366E-01         7.69757E-01         4.02039E+01         1.00000E+00         3.92605E-02         4.02039E+01         6.93537E+00         3.32686E+01
+          1.22511E-02         1.02132E-02        -7.60938E-03         7.69719E-01         8.61037E-01         7.69757E-01         3.81675E+01         1.00000E+00         3.89639E-02         3.81675E+01         6.69862E+00         3.14689E+01
+          1.22511E-02         1.03830E-02        -7.71927E-03         7.69718E-01         8.71707E-01         7.69757E-01         3.63030E+01         1.00000E+00         3.86838E-02         3.63030E+01         6.47751E+00         2.98255E+01
+          1.22511E-02         1.05528E-02        -7.83096E-03         7.69717E-01         8.82378E-01         7.69756E-01         3.46035E+01         1.00000E+00         3.84200E-02         3.46035E+01         6.27148E+00         2.83320E+01
+          1.22511E-02         1.07227E-02        -7.94447E-03         7.69715E-01         8.93048E-01         7.69756E-01         3.30622E+01         1.00000E+00         3.81720E-02         3.30622E+01         6.07996E+00         2.69822E+01
+          1.22511E-02         1.08925E-02        -8.05979E-03         7.69714E-01         9.03719E-01         7.69756E-01         3.16719E+01         1.00000E+00         3.79395E-02         3.16719E+01         5.90237E+00         2.57695E+01
+          1.22511E-02         1.10623E-02        -8.17693E-03         7.69712E-01         9.14389E-01         7.69756E-01         3.04255E+01         1.00000E+00         3.77221E-02         3.04255E+01         5.73812E+00         2.46873E+01
+          1.22511E-02         1.12321E-02        -8.29587E-03         7.69711E-01         9.25060E-01         7.69756E-01         2.93155E+01         1.00000E+00         3.75195E-02         2.93155E+01         5.58660E+00         2.37289E+01
+          1.22511E-02         1.14020E-02        -8.41663E-03         7.69709E-01         9.35731E-01         7.69755E-01         2.83348E+01         1.00000E+00         3.73314E-02         2.83348E+01         5.44721E+00         2.28875E+01
+          1.22511E-02         1.15718E-02        -8.53920E-03         7.69708E-01         9.46401E-01         7.69755E-01         2.74757E+01         1.00000E+00         3.71572E-02         2.74757E+01         5.31931E+00         2.21564E+01
+          1.22511E-02         1.17416E-02        -8.66358E-03         7.69706E-01         9.57072E-01         7.69755E-01         2.67310E+01         1.00000E+00         3.69967E-02         2.67310E+01         5.20230E+00         2.15287E+01
+          1.22511E-02         1.19114E-02        -8.78978E-03         7.69705E-01         9.67742E-01         7.69755E-01         2.60933E+01         1.00000E+00         3.68495E-02         2.60932E+01         5.09553E+00         2.09977E+01
+          1.22511E-02         1.20813E-02        -8.91779E-03         7.69703E-01         9.78413E-01         7.69755E-01         2.55550E+01         1.00000E+00         3.67151E-02         2.55550E+01         4.99840E+00         2.05566E+01
+          1.22511E-02         1.22511E-02        -9.04761E-03         7.69702E-01         9.89083E-01         7.69755E-01         2.51090E+01         1.00000E+00         3.65933E-02         2.51090E+01         4.91027E+00         2.01987E+01
+          1.22511E-02         1.24209E-02        -9.17924E-03         7.69700E-01         9.99754E-01         7.69755E-01         2.47480E+01         1.00000E+00         3.64834E-02         2.47480E+01         4.83052E+00         1.99175E+01
+          1.22511E-02         1.25908E-02        -9.31268E-03         7.69698E-01         1.01042E+00         7.69755E-01         2.44649E+01         1.00000E+00         3.63853E-02         2.44648E+01         4.75856E+00         1.97063E+01
+          1.22511E-02         1.27606E-02        -9.44794E-03         7.69697E-01         1.02110E+00         7.69755E-01         2.42526E+01         1.00000E+00         3.62985E-02         2.42526E+01         4.69376E+00         1.95588E+01
+          1.22511E-02         1.29304E-02        -9.58501E-03         7.69695E-01         1.03177E+00         7.69755E-01         2.41043E+01         1.00000E+00         3.62225E-02         2.41043E+01         4.63554E+00         1.94688E+01
+          1.22511E-02         1.31002E-02        -9.72389E-03         7.69693E-01         1.04244E+00         7.69755E-01         2.40133E+01         1.00000E+00         3.61570E-02         2.40133E+01         4.58331E+00         1.94300E+01
+          1.22511E-02         1.32701E-02        -9.86459E-03         7.69692E-01         1.05311E+00         7.69755E-01         2.39731E+01         1.00000E+00         3.61016E-02         2.39731E+01         4.53650E+00         1.94366E+01
+          1.22511E-02         1.34399E-02        -1.00071E-02         7.69690E-01         1.06378E+00         7.69755E-01         2.39773E+01         1.00000E+00         3.60558E-02         2.39773E+01         4.49455E+00         1.94828E+01
+          1.22511E-02         1.36097E-02        -1.01514E-02         7.69688E-01         1.07445E+00         7.69755E-01         2.40198E+01         1.00000E+00         3.60192E-02         2.40198E+01         4.45692E+00         1.95629E+01
+          1.22511E-02         1.37795E-02        -1.02975E-02         7.69686E-01         1.08512E+00         7.69755E-01         2.40947E+01         1.00000E+00         3.59914E-02         2.40947E+01         4.42308E+00         1.96716E+01
+          1.22511E-02         1.39494E-02        -1.04455E-02         7.69684E-01         1.09579E+00         7.69755E-01         2.41964E+01         1.00000E+00         3.59721E-02         2.41963E+01         4.39252E+00         1.98038E+01
+          1.22511E-02         1.41192E-02        -1.05952E-02         7.69683E-01         1.10646E+00         7.69756E-01         2.43192E+01         1.00000E+00         3.59607E-02         2.43192E+01         4.36476E+00         1.99544E+01
+          1.22511E-02         1.42890E-02        -1.07468E-02         7.69681E-01         1.11713E+00         7.69756E-01         2.44582E+01         1.00000E+00         3.59569E-02         2.44582E+01         4.33932E+00         2.01189E+01
+          1.22511E-02         1.44589E-02        -1.09002E-02         7.69679E-01         1.12780E+00         7.69756E-01         2.46084E+01         1.00000E+00         3.59603E-02         2.46084E+01         4.31575E+00         2.02926E+01
+          1.22511E-02         1.46287E-02        -1.10554E-02         7.69677E-01         1.13847E+00         7.69756E-01         2.47651E+01         1.00000E+00         3.59704E-02         2.47651E+01         4.29362E+00         2.04715E+01
+          1.22511E-02         1.47985E-02        -1.12124E-02         7.69675E-01         1.14914E+00         7.69757E-01         2.49240E+01         1.00000E+00         3.59868E-02         2.49240E+01         4.27253E+00         2.06515E+01
+          1.22511E-02         1.49683E-02        -1.13712E-02         7.69673E-01         1.15981E+00         7.69757E-01         2.50810E+01         1.00000E+00         3.60091E-02         2.50809E+01         4.25208E+00         2.08289E+01
+          1.22511E-02         1.51382E-02        -1.15319E-02         7.69671E-01         1.17048E+00         7.69758E-01         2.52322E+01         1.00000E+00         3.60369E-02         2.52321E+01         4.23193E+00         2.10002E+01
+          1.22511E-02         1.53080E-02        -1.16943E-02         7.69669E-01         1.18115E+00         7.69758E-01         2.53741E+01         1.00000E+00         3.60697E-02         2.53741E+01         4.21171E+00         2.11624E+01
+          1.22511E-02         1.54778E-02        -1.18586E-02         7.69667E-01         1.19182E+00         7.69759E-01         2.55035E+01         1.00000E+00         3.61072E-02         2.55035E+01         4.19113E+00         2.13124E+01
+          1.22511E-02         1.56476E-02        -1.20246E-02         7.69665E-01         1.20249E+00         7.69759E-01         2.56175E+01         1.00000E+00         3.61490E-02         2.56175E+01         4.16988E+00         2.14476E+01
+          1.22511E-02         1.58175E-02        -1.21925E-02         7.69663E-01         1.21317E+00         7.69760E-01         2.57133E+01         1.00000E+00         3.61946E-02         2.57133E+01         4.14770E+00         2.15656E+01
+          1.22511E-02         1.59873E-02        -1.23622E-02         7.69661E-01         1.22384E+00         7.69760E-01         2.57886E+01         1.00000E+00         3.62436E-02         2.57886E+01         4.12433E+00         2.16642E+01
+          1.22511E-02         1.61571E-02        -1.25337E-02         7.69659E-01         1.23451E+00         7.69761E-01         2.58412E+01         1.00000E+00         3.62956E-02         2.58412E+01         4.09956E+00         2.17416E+01
+          1.22511E-02         1.63270E-02        -1.27070E-02         7.69657E-01         1.24518E+00         7.69762E-01         2.58694E+01         1.00000E+00         3.63503E-02         2.58693E+01         4.07317E+00         2.17962E+01
+          1.22511E-02         1.64968E-02        -1.28822E-02         7.69655E-01         1.25585E+00         7.69762E-01         2.58715E+01         1.00000E+00         3.64072E-02         2.58714E+01         4.04500E+00         2.18264E+01
+          1.22511E-02         1.66666E-02        -1.30591E-02         7.69652E-01         1.26652E+00         7.69763E-01         2.58462E+01         1.00000E+00         3.64660E-02         2.58462E+01         4.01489E+00         2.18313E+01
+          1.22511E-02         1.68364E-02        -1.32379E-02         7.69650E-01         1.27719E+00         7.69764E-01         2.57926E+01         1.00000E+00         3.65263E-02         2.57926E+01         3.98269E+00         2.18099E+01
+          1.22511E-02         1.70063E-02        -1.34185E-02         7.69648E-01         1.28786E+00         7.69765E-01         2.57098E+01         1.00000E+00         3.65876E-02         2.57097E+01         3.94830E+00         2.17614E+01
+          1.22511E-02         1.71761E-02        -1.36008E-02         7.69646E-01         1.29853E+00         7.69766E-01         2.55971E+01         1.00000E+00         3.66497E-02         2.55971E+01         3.91163E+00         2.16855E+01
+          1.22511E-02         1.73459E-02        -1.37850E-02         7.69644E-01         1.30920E+00         7.69767E-01         2.54545E+01         1.00000E+00         3.67122E-02         2.54544E+01         3.87260E+00         2.15818E+01
+          1.22511E-02         1.75158E-02        -1.39711E-02         7.69641E-01         1.31987E+00         7.69768E-01         2.52816E+01         1.00000E+00         3.67746E-02         2.52816E+01         3.83116E+00         2.14504E+01
+          1.22511E-02         1.76856E-02        -1.41589E-02         7.69639E-01         1.33054E+00         7.69769E-01         2.50786E+01         1.00000E+00         3.68368E-02         2.50786E+01         3.78727E+00         2.12913E+01
+          1.22511E-02         1.78554E-02        -1.43485E-02         7.69637E-01         1.34121E+00         7.69770E-01         2.48459E+01         1.00000E+00         3.68983E-02         2.48458E+01         3.74093E+00         2.11049E+01
+          1.22511E-02         1.80252E-02        -1.45400E-02         7.69634E-01         1.35188E+00         7.69772E-01         2.45838E+01         1.00000E+00         3.69587E-02         2.45838E+01         3.69212E+00         2.08917E+01
+          1.22511E-02         1.81951E-02        -1.47332E-02         7.69632E-01         1.36255E+00         7.69773E-01         2.42932E+01         1.00000E+00         3.70179E-02         2.42931E+01         3.64086E+00         2.06523E+01
+          1.22511E-02         1.83649E-02        -1.49283E-02         7.69630E-01         1.37322E+00         7.69774E-01         2.39747E+01         1.00000E+00         3.70754E-02         2.39747E+01         3.58720E+00         2.03875E+01
+          1.22511E-02         1.85347E-02        -1.51252E-02         7.69627E-01         1.38389E+00         7.69776E-01         2.36295E+01         1.00000E+00         3.71309E-02         2.36295E+01         3.53116E+00         2.00983E+01
+          1.22511E-02         1.87045E-02        -1.53239E-02         7.69625E-01         1.39457E+00         7.69777E-01         2.32586E+01         1.00000E+00         3.71842E-02         2.32586E+01         3.47283E+00         1.97858E+01
+          1.22511E-02         1.88744E-02        -1.55244E-02         7.69622E-01         1.40524E+00         7.69779E-01         2.28633E+01         1.00000E+00         3.72350E-02         2.28633E+01         3.41226E+00         1.94511E+01
+          1.22511E-02         1.90442E-02        -1.57267E-02         7.69620E-01         1.41591E+00         7.69780E-01         2.24451E+01         1.00000E+00         3.72831E-02         2.24450E+01         3.34955E+00         1.90955E+01
+          1.22511E-02         1.92140E-02        -1.59309E-02         7.69617E-01         1.42658E+00         7.69782E-01         2.20053E+01         1.00000E+00         3.73280E-02         2.20052E+01         3.28479E+00         1.87205E+01
+          1.22511E-02         1.93839E-02        -1.61368E-02         7.69615E-01         1.43725E+00         7.69784E-01         2.15455E+01         1.00000E+00         3.73696E-02         2.15455E+01         3.21808E+00         1.83274E+01
+          1.22511E-02         1.95537E-02        -1.63446E-02         7.69612E-01         1.44792E+00         7.69786E-01         2.10674E+01         1.00000E+00         3.74077E-02         2.10674E+01         3.14954E+00         1.79179E+01
+          1.22511E-02         1.97235E-02        -1.65542E-02         7.69610E-01         1.45859E+00         7.69788E-01         2.05728E+01         1.00000E+00         3.74420E-02         2.05728E+01         3.07930E+00         1.74935E+01
+          1.22511E-02         1.98933E-02        -1.67656E-02         7.69607E-01         1.46926E+00         7.69790E-01         2.00634E+01         1.00000E+00         3.74722E-02         2.00634E+01         3.00748E+00         1.70559E+01
+          1.22511E-02         2.00632E-02        -1.69788E-02         7.69604E-01         1.47993E+00         7.69792E-01         1.95410E+01         1.00000E+00         3.74982E-02         1.95410E+01         2.93421E+00         1.66068E+01
+          1.22511E-02         2.02330E-02        -1.71938E-02         7.69602E-01         1.49060E+00         7.69794E-01         1.90075E+01         1.00000E+00         3.75198E-02         1.90075E+01         2.85965E+00         1.61479E+01
+          1.22511E-02         2.04028E-02        -1.74106E-02         7.69599E-01         1.50127E+00         7.69796E-01         1.84648E+01         1.00000E+00         3.75368E-02         1.84648E+01         2.78392E+00         1.56809E+01
+          1.22511E-02         2.05726E-02        -1.76293E-02         7.69596E-01         1.51194E+00         7.69798E-01         1.79147E+01         1.00000E+00         3.75489E-02         1.79147E+01         2.70719E+00         1.52075E+01
+          1.22511E-02         2.07425E-02        -1.78497E-02         7.69594E-01         1.52261E+00         7.69801E-01         1.73591E+01         1.00000E+00         3.75561E-02         1.73591E+01         2.62961E+00         1.47295E+01
+          1.22511E-02         2.09123E-02        -1.80720E-02         7.69591E-01         1.53328E+00         7.69803E-01         1.67999E+01         1.00000E+00         3.75581E-02         1.67999E+01         2.55132E+00         1.42486E+01
+          1.22511E-02         2.10821E-02        -1.82961E-02         7.69588E-01         1.54395E+00         7.69806E-01         1.62390E+01         1.00000E+00         3.75549E-02         1.62390E+01         2.47247E+00         1.37666E+01
+          1.22511E-02         2.12520E-02        -1.85220E-02         7.69586E-01         1.55462E+00         7.69808E-01         1.56782E+01         1.00000E+00         3.75462E-02         1.56782E+01         2.39324E+00         1.32850E+01
+          1.22511E-02         2.14218E-02        -1.87497E-02         7.69583E-01         1.56529E+00         7.69811E-01         1.51192E+01         1.00000E+00         3.75319E-02         1.51192E+01         2.31375E+00         1.28055E+01
+          1.22511E-02         2.15916E-02        -1.89792E-02         7.69580E-01         1.57596E+00         7.69814E-01         1.45638E+01         1.00000E+00         3.75120E-02         1.45639E+01         2.23418E+00         1.23297E+01
+          1.22511E-02         2.17614E-02        -1.92106E-02         7.69577E-01         1.58664E+00         7.69817E-01         1.40138E+01         1.00000E+00         3.74863E-02         1.40138E+01         2.15466E+00         1.18591E+01
+          1.22511E-02         2.19313E-02        -1.94437E-02         7.69574E-01         1.59731E+00         7.69820E-01         1.34706E+01         1.00000E+00         3.74547E-02         1.34706E+01         2.07535E+00         1.13953E+01
+          1.22511E-02         2.21011E-02        -1.96787E-02         7.69571E-01         1.60798E+00         7.69823E-01         1.29359E+01         1.00000E+00         3.74171E-02         1.29360E+01         1.99639E+00         1.09396E+01
+          1.22511E-02         2.22709E-02        -1.99155E-02         7.69568E-01         1.61865E+00         7.69826E-01         1.24113E+01         1.00000E+00         3.73735E-02         1.24113E+01         1.91792E+00         1.04934E+01
+          1.22511E-02         2.24407E-02        -2.01540E-02         7.69566E-01         1.62932E+00         7.69829E-01         1.18979E+01         1.00000E+00         3.73237E-02         1.18980E+01         1.84008E+00         1.00579E+01
+          1.22511E-02         2.26106E-02        -2.03944E-02         7.69563E-01         1.63999E+00         7.69833E-01         1.13973E+01         1.00000E+00         3.72678E-02         1.13974E+01         1.76300E+00         9.63435E+00
+          1.22511E-02         2.27804E-02        -2.06367E-02         7.69560E-01         1.65066E+00         7.69836E-01         1.09106E+01         1.00000E+00         3.72056E-02         1.09107E+01         1.68680E+00         9.22388E+00
+          1.22511E-02         2.29502E-02        -2.08807E-02         7.69557E-01         1.66133E+00         7.69840E-01         1.04391E+01         1.00000E+00         3.71371E-02         1.04391E+01         1.61161E+00         8.82750E+00
+          1.22511E-02         2.31201E-02        -2.11265E-02         7.69554E-01         1.67200E+00         7.69844E-01         9.98365E+00         1.00000E+00         3.70623E-02         9.98369E+00         1.53754E+00         8.44615E+00
+          1.22511E-02         2.32899E-02        -2.13742E-02         7.69551E-01         1.68267E+00         7.69847E-01         9.54535E+00         1.00000E+00         3.69812E-02         9.54539E+00         1.46470E+00         8.08068E+00
+          1.22511E-02         2.34597E-02        -2.16237E-02         7.69548E-01         1.69334E+00         7.69851E-01         9.12501E+00         1.00000E+00         3.68937E-02         9.12506E+00         1.39320E+00         7.73186E+00
+          1.22511E-02         2.36295E-02        -2.18750E-02         7.69544E-01         1.70401E+00         7.69855E-01         8.72343E+00         1.00000E+00         3.67998E-02         8.72347E+00         1.32313E+00         7.40034E+00
+          1.22511E-02         2.37994E-02        -2.21281E-02         7.69541E-01         1.71468E+00         7.69859E-01         8.34125E+00         1.00000E+00         3.66995E-02         8.34129E+00         1.25458E+00         7.08671E+00
+          1.22511E-02         2.39692E-02        -2.23830E-02         7.69538E-01         1.72535E+00         7.69864E-01         7.97904E+00         1.00000E+00         3.65928E-02         7.97908E+00         1.18763E+00         6.79145E+00
+          1.22511E-02         2.41390E-02        -2.26397E-02         7.69535E-01         1.73602E+00         7.69868E-01         7.63728E+00         1.00000E+00         3.64797E-02         7.63732E+00         1.12236E+00         6.51496E+00
+          1.22511E-02         2.43088E-02        -2.28982E-02         7.69532E-01         1.74669E+00         7.69873E-01         7.31632E+00         1.00000E+00         3.63603E-02         7.31636E+00         1.05884E+00         6.25752E+00
+          1.22511E-02         2.44787E-02        -2.31586E-02         7.69529E-01         1.75736E+00         7.69877E-01         7.01645E+00         1.00000E+00         3.62346E-02         7.01649E+00         9.97136E-01         6.01936E+00
+          1.22511E-02         2.46485E-02        -2.34208E-02         7.69526E-01         1.76804E+00         7.69882E-01         6.73783E+00         1.00000E+00         3.61025E-02         6.73788E+00         9.37292E-01         5.80058E+00
+          1.22511E-02         2.48183E-02        -2.36847E-02         7.69522E-01         1.77871E+00         7.69887E-01         6.48056E+00         1.00000E+00         3.59642E-02         6.48060E+00         8.79360E-01         5.60124E+00
+          1.22511E-02         2.49882E-02        -2.39505E-02         7.69519E-01         1.78938E+00         7.69892E-01         6.24461E+00         1.00000E+00         3.58196E-02         6.24465E+00         8.23381E-01         5.42127E+00
+          1.22511E-02         2.51580E-02        -2.42181E-02         7.69516E-01         1.80005E+00         7.69897E-01         6.02990E+00         1.00000E+00         3.56689E-02         6.02994E+00         7.69389E-01         5.26056E+00
+          1.22511E-02         2.53278E-02        -2.44876E-02         7.69512E-01         1.81072E+00         7.69902E-01         5.83624E+00         1.00000E+00         3.55120E-02         5.83629E+00         7.17410E-01         5.11888E+00
+          1.22511E-02         2.54976E-02        -2.47588E-02         7.69509E-01         1.82139E+00         7.69907E-01         5.66338E+00         1.00000E+00         3.53491E-02         5.66342E+00         6.67465E-01         4.99595E+00
+          1.22511E-02         2.56675E-02        -2.50318E-02         7.69506E-01         1.83206E+00         7.69913E-01         5.51096E+00         1.00000E+00         3.51801E-02         5.51100E+00         6.19568E-01         4.89143E+00
+          1.22511E-02         2.58373E-02        -2.53067E-02         7.69502E-01         1.84273E+00         7.69918E-01         5.37857E+00         1.00000E+00         3.50052E-02         5.37861E+00         5.73725E-01         4.80488E+00
+          1.22511E-02         2.60071E-02        -2.55834E-02         7.69499E-01         1.85340E+00         7.69924E-01         5.26574E+00         1.00000E+00         3.48245E-02         5.26577E+00         5.29939E-01         4.73583E+00
+          1.22511E-02         2.61769E-02        -2.58619E-02         7.69496E-01         1.86407E+00         7.69930E-01         5.17190E+00         1.00000E+00         3.46380E-02         5.17194E+00         4.88204E-01         4.68373E+00
+          1.24209E-02         8.72665E-04        -4.48815E-03         7.80430E-01         2.74155E-01         7.80443E-01         4.18939E+02         1.00000E+00         5.97923E-02         4.18939E+02         5.30399E+01         3.65899E+02
+          1.24209E-02         1.04249E-03        -4.49837E-03         7.80430E-01         2.84826E-01         7.80442E-01         4.10306E+02         1.00000E+00         5.91859E-02         4.10306E+02         5.19956E+01         3.58310E+02
+          1.24209E-02         1.21232E-03        -4.51039E-03         7.80429E-01         2.95496E-01         7.80442E-01         4.01510E+02         1.00000E+00         5.85673E-02         4.01510E+02         5.09312E+01         3.50579E+02
+          1.24209E-02         1.38215E-03        -4.52424E-03         7.80429E-01         3.06167E-01         7.80442E-01         3.92567E+02         1.00000E+00         5.79376E-02         3.92567E+02         4.98484E+01         3.42718E+02
+          1.24209E-02         1.55197E-03        -4.53989E-03         7.80429E-01         3.16838E-01         7.80442E-01         3.83493E+02         1.00000E+00         5.72979E-02         3.83493E+02         4.87492E+01         3.34744E+02
+          1.24209E-02         1.72180E-03        -4.55735E-03         7.80429E-01         3.27508E-01         7.80442E-01         3.74304E+02         1.00000E+00         5.66491E-02         3.74304E+02         4.76355E+01         3.26668E+02
+          1.24209E-02         1.89163E-03        -4.57663E-03         7.80429E-01         3.38179E-01         7.80442E-01         3.65016E+02         1.00000E+00         5.59925E-02         3.65016E+02         4.65092E+01         3.18507E+02
+          1.24209E-02         2.06146E-03        -4.59772E-03         7.80428E-01         3.48849E-01         7.80442E-01         3.55645E+02         1.00000E+00         5.53290E-02         3.55645E+02         4.53721E+01         3.10273E+02
+          1.24209E-02         2.23128E-03        -4.62062E-03         7.80428E-01         3.59520E-01         7.80442E-01         3.46207E+02         1.00000E+00         5.46597E-02         3.46207E+02         4.42263E+01         3.01981E+02
+          1.24209E-02         2.40111E-03        -4.64534E-03         7.80428E-01         3.70190E-01         7.80442E-01         3.36718E+02         1.00000E+00         5.39857E-02         3.36718E+02         4.30736E+01         2.93644E+02
+          1.24209E-02         2.57094E-03        -4.67186E-03         7.80427E-01         3.80861E-01         7.80441E-01         3.27194E+02         1.00000E+00         5.33080E-02         3.27194E+02         4.19158E+01         2.85278E+02
+          1.24209E-02         2.74077E-03        -4.70020E-03         7.80427E-01         3.91532E-01         7.80441E-01         3.17649E+02         1.00000E+00         5.26277E-02         3.17649E+02         4.07548E+01         2.76895E+02
+          1.24209E-02         2.91059E-03        -4.73035E-03         7.80427E-01         4.02202E-01         7.80441E-01         3.08101E+02         1.00000E+00         5.19458E-02         3.08101E+02         3.95925E+01         2.68508E+02
+          1.24209E-02         3.08042E-03        -4.76231E-03         7.80426E-01         4.12873E-01         7.80441E-01         2.98562E+02         1.00000E+00         5.12633E-02         2.98562E+02         3.84307E+01         2.60132E+02
+          1.24209E-02         3.25025E-03        -4.79608E-03         7.80426E-01         4.23543E-01         7.80441E-01         2.89049E+02         1.00000E+00         5.05812E-02         2.89049E+02         3.72711E+01         2.51778E+02
+          1.24209E-02         3.42008E-03        -4.83167E-03         7.80425E-01         4.34214E-01         7.80440E-01         2.79576E+02         1.00000E+00         4.99005E-02         2.79576E+02         3.61154E+01         2.43461E+02
+          1.24209E-02         3.58990E-03        -4.86907E-03         7.80425E-01         4.44884E-01         7.80440E-01         2.70156E+02         1.00000E+00         4.92221E-02         2.70157E+02         3.49654E+01         2.35191E+02
+          1.24209E-02         3.75973E-03        -4.90828E-03         7.80424E-01         4.55555E-01         7.80440E-01         2.60804E+02         1.00000E+00         4.85469E-02         2.60805E+02         3.38227E+01         2.26982E+02
+          1.24209E-02         3.92956E-03        -4.94930E-03         7.80424E-01         4.66225E-01         7.80440E-01         2.51533E+02         1.00000E+00         4.78760E-02         2.51533E+02         3.26889E+01         2.18844E+02
+          1.24209E-02         4.09939E-03        -4.99213E-03         7.80423E-01         4.76896E-01         7.80439E-01         2.42356E+02         1.00000E+00         4.72100E-02         2.42356E+02         3.15656E+01         2.10790E+02
+          1.24209E-02         4.26921E-03        -5.03678E-03         7.80423E-01         4.87567E-01         7.80439E-01         2.33284E+02         1.00000E+00         4.65499E-02         2.33284E+02         3.04542E+01         2.02830E+02
+          1.24209E-02         4.43904E-03        -5.08323E-03         7.80422E-01         4.98237E-01         7.80439E-01         2.24330E+02         1.00000E+00         4.58965E-02         2.24330E+02         2.93563E+01         1.94974E+02
+          1.24209E-02         4.60887E-03        -5.13150E-03         7.80422E-01         5.08908E-01         7.80439E-01         2.15505E+02         1.00000E+00         4.52505E-02         2.15506E+02         2.82731E+01         1.87232E+02
+          1.24209E-02         4.77869E-03        -5.18159E-03         7.80421E-01         5.19578E-01         7.80438E-01         2.06821E+02         1.00000E+00         4.46127E-02         2.06821E+02         2.72060E+01         1.79615E+02
+          1.24209E-02         4.94852E-03        -5.23348E-03         7.80420E-01         5.30249E-01         7.80438E-01         1.98286E+02         1.00000E+00         4.39839E-02         1.98287E+02         2.61563E+01         1.72130E+02
+          1.24209E-02         5.11835E-03        -5.28719E-03         7.80420E-01         5.40919E-01         7.80438E-01         1.89912E+02         1.00000E+00         4.33645E-02         1.89912E+02         2.51252E+01         1.64787E+02
+          1.24209E-02         5.28818E-03        -5.34270E-03         7.80419E-01         5.51590E-01         7.80437E-01         1.81707E+02         1.00000E+00         4.27553E-02         1.81707E+02         2.41137E+01         1.57593E+02
+          1.24209E-02         5.45800E-03        -5.40004E-03         7.80418E-01         5.62261E-01         7.80437E-01         1.73679E+02         1.00000E+00         4.21569E-02         1.73679E+02         2.31229E+01         1.50556E+02
+          1.24209E-02         5.62783E-03        -5.45918E-03         7.80418E-01         5.72931E-01         7.80437E-01         1.65836E+02         1.00000E+00         4.15698E-02         1.65836E+02         2.21538E+01         1.43683E+02
+          1.24209E-02         5.79766E-03        -5.52013E-03         7.80417E-01         5.83602E-01         7.80436E-01         1.58187E+02         1.00000E+00         4.09945E-02         1.58187E+02         2.12074E+01         1.36979E+02
+          1.24209E-02         5.96749E-03        -5.58290E-03         7.80416E-01         5.94272E-01         7.80436E-01         1.50736E+02         1.00000E+00         4.04315E-02         1.50736E+02         2.02844E+01         1.30452E+02
+          1.24209E-02         6.13731E-03        -5.64748E-03         7.80415E-01         6.04943E-01         7.80436E-01         1.43491E+02         1.00000E+00         3.98812E-02         1.43491E+02         1.93856E+01         1.24105E+02
+          1.24209E-02         6.30714E-03        -5.71387E-03         7.80414E-01         6.15613E-01         7.80435E-01         1.36456E+02         1.00000E+00         3.93440E-02         1.36457E+02         1.85116E+01         1.17945E+02
+          1.24209E-02         6.47697E-03        -5.78207E-03         7.80414E-01         6.26284E-01         7.80435E-01         1.29637E+02         1.00000E+00         3.88202E-02         1.29637E+02         1.76632E+01         1.11974E+02
+          1.24209E-02         6.64680E-03        -5.85209E-03         7.80413E-01         6.36955E-01         7.80435E-01         1.23038E+02         1.00000E+00         3.83101E-02         1.23038E+02         1.68409E+01         1.06197E+02
+          1.24209E-02         6.81662E-03        -5.92391E-03         7.80412E-01         6.47625E-01         7.80434E-01         1.16661E+02         1.00000E+00         3.78141E-02         1.16661E+02         1.60450E+01         1.00616E+02
+          1.24209E-02         6.98645E-03        -5.99755E-03         7.80411E-01         6.58296E-01         7.80434E-01         1.10510E+02         1.00000E+00         3.73322E-02         1.10511E+02         1.52760E+01         9.52345E+01
+          1.24209E-02         7.15628E-03        -6.07301E-03         7.80410E-01         6.68966E-01         7.80434E-01         1.04588E+02         1.00000E+00         3.68648E-02         1.04588E+02         1.45342E+01         9.00536E+01
+          1.24209E-02         7.32611E-03        -6.15027E-03         7.80409E-01         6.79637E-01         7.80433E-01         9.88947E+01         1.00000E+00         3.64119E-02         9.88947E+01         1.38199E+01         8.50748E+01
+          1.24209E-02         7.49593E-03        -6.22934E-03         7.80408E-01         6.90307E-01         7.80433E-01         9.34323E+01         1.00000E+00         3.59737E-02         9.34323E+01         1.31332E+01         8.02992E+01
+          1.24209E-02         7.66576E-03        -6.31023E-03         7.80407E-01         7.00978E-01         7.80433E-01         8.82010E+01         1.00000E+00         3.55502E-02         8.82010E+01         1.24742E+01         7.57269E+01
+          1.24209E-02         7.83559E-03        -6.39293E-03         7.80406E-01         7.11649E-01         7.80432E-01         8.32007E+01         1.00000E+00         3.51415E-02         8.32007E+01         1.18429E+01         7.13578E+01
+          1.24209E-02         8.00542E-03        -6.47745E-03         7.80405E-01         7.22319E-01         7.80432E-01         7.84306E+01         1.00000E+00         3.47477E-02         7.84307E+01         1.12394E+01         6.71913E+01
+          1.24209E-02         8.17524E-03        -6.56377E-03         7.80404E-01         7.32990E-01         7.80431E-01         7.38896E+01         1.00000E+00         3.43687E-02         7.38896E+01         1.06634E+01         6.32262E+01
+          1.24209E-02         8.34507E-03        -6.65191E-03         7.80403E-01         7.43660E-01         7.80431E-01         6.95758E+01         1.00000E+00         3.40044E-02         6.95758E+01         1.01150E+01         5.94608E+01
+          1.24209E-02         8.51490E-03        -6.74186E-03         7.80402E-01         7.54331E-01         7.80431E-01         6.54870E+01         1.00000E+00         3.36548E-02         6.54870E+01         9.59373E+00         5.58933E+01
+          1.24209E-02         8.68473E-03        -6.83362E-03         7.80401E-01         7.65001E-01         7.80430E-01         6.16204E+01         1.00000E+00         3.33199E-02         6.16204E+01         9.09944E+00         5.25209E+01
+          1.24209E-02         8.85455E-03        -6.92719E-03         7.80399E-01         7.75672E-01         7.80430E-01         5.79727E+01         1.00000E+00         3.29994E-02         5.79728E+01         8.63175E+00         4.93410E+01
+          1.24209E-02         9.02438E-03        -7.02258E-03         7.80398E-01         7.86343E-01         7.80430E-01         5.45405E+01         1.00000E+00         3.26933E-02         5.45405E+01         8.19028E+00         4.63502E+01
+          1.24209E-02         9.19421E-03        -7.11977E-03         7.80397E-01         7.97013E-01         7.80429E-01         5.13194E+01         1.00000E+00         3.24015E-02         5.13194E+01         7.77458E+00         4.35448E+01
+          1.24209E-02         9.36403E-03        -7.21878E-03         7.80396E-01         8.07684E-01         7.80429E-01         4.83052E+01         1.00000E+00         3.21236E-02         4.83052E+01         7.38415E+00         4.09210E+01
+          1.24209E-02         9.53386E-03        -7.31961E-03         7.80394E-01         8.18354E-01         7.80429E-01         4.54928E+01         1.00000E+00         3.18597E-02         4.54928E+01         7.01847E+00         3.84744E+01
+          1.24209E-02         9.70369E-03        -7.42224E-03         7.80393E-01         8.29025E-01         7.80428E-01         4.28772E+01         1.00000E+00         3.16094E-02         4.28772E+01         6.67694E+00         3.62003E+01
+          1.24209E-02         9.87352E-03        -7.52669E-03         7.80392E-01         8.39695E-01         7.80428E-01         4.04529E+01         1.00000E+00         3.13725E-02         4.04529E+01         6.35894E+00         3.40940E+01
+          1.24209E-02         1.00433E-02        -7.63295E-03         7.80391E-01         8.50366E-01         7.80428E-01         3.82140E+01         1.00000E+00         3.11488E-02         3.82140E+01         6.06382E+00         3.21502E+01
+          1.24209E-02         1.02132E-02        -7.74102E-03         7.80389E-01         8.61037E-01         7.80428E-01         3.61545E+01         1.00000E+00         3.09382E-02         3.61545E+01         5.79089E+00         3.03636E+01
+          1.24209E-02         1.03830E-02        -7.85090E-03         7.80388E-01         8.71707E-01         7.80427E-01         3.42681E+01         1.00000E+00         3.07402E-02         3.42681E+01         5.53942E+00         2.87286E+01
+          1.24209E-02         1.05528E-02        -7.96260E-03         7.80386E-01         8.82378E-01         7.80427E-01         3.25482E+01         1.00000E+00         3.05547E-02         3.25482E+01         5.30865E+00         2.72396E+01
+          1.24209E-02         1.07227E-02        -8.07611E-03         7.80385E-01         8.93048E-01         7.80427E-01         3.09882E+01         1.00000E+00         3.03815E-02         3.09882E+01         5.09783E+00         2.58904E+01
+          1.24209E-02         1.08925E-02        -8.19143E-03         7.80384E-01         9.03719E-01         7.80427E-01         2.95812E+01         1.00000E+00         3.02202E-02         2.95812E+01         4.90613E+00         2.46751E+01
+          1.24209E-02         1.10623E-02        -8.30856E-03         7.80382E-01         9.14389E-01         7.80426E-01         2.83203E+01         1.00000E+00         3.00705E-02         2.83203E+01         4.73276E+00         2.35875E+01
+          1.24209E-02         1.12321E-02        -8.42751E-03         7.80381E-01         9.25060E-01         7.80426E-01         2.71983E+01         1.00000E+00         2.99323E-02         2.71983E+01         4.57688E+00         2.26214E+01
+          1.24209E-02         1.14020E-02        -8.54826E-03         7.80379E-01         9.35731E-01         7.80426E-01         2.62080E+01         1.00000E+00         2.98051E-02         2.62080E+01         4.43765E+00         2.17704E+01
+          1.24209E-02         1.15718E-02        -8.67083E-03         7.80378E-01         9.46401E-01         7.80426E-01         2.53423E+01         1.00000E+00         2.96888E-02         2.53423E+01         4.31421E+00         2.10281E+01
+          1.24209E-02         1.17416E-02        -8.79522E-03         7.80376E-01         9.57072E-01         7.80426E-01         2.45938E+01         1.00000E+00         2.95830E-02         2.45938E+01         4.20571E+00         2.03881E+01
+          1.24209E-02         1.19114E-02        -8.92141E-03         7.80375E-01         9.67742E-01         7.80426E-01         2.39554E+01         1.00000E+00         2.94874E-02         2.39554E+01         4.11127E+00         1.98441E+01
+          1.24209E-02         1.20813E-02        -9.04942E-03         7.80373E-01         9.78413E-01         7.80425E-01         2.34196E+01         1.00000E+00         2.94018E-02         2.34196E+01         4.03004E+00         1.93896E+01
+          1.24209E-02         1.22511E-02        -9.17924E-03         7.80371E-01         9.89083E-01         7.80425E-01         2.29795E+01         1.00000E+00         2.93258E-02         2.29795E+01         3.96116E+00         1.90183E+01
+          1.24209E-02         1.24209E-02        -9.31087E-03         7.80370E-01         9.99754E-01         7.80425E-01         2.26277E+01         1.00000E+00         2.92591E-02         2.26277E+01         3.90376E+00         1.87239E+01
+          1.24209E-02         1.25908E-02        -9.44432E-03         7.80368E-01         1.01042E+00         7.80425E-01         2.23572E+01         1.00000E+00         2.92014E-02         2.23572E+01         3.85700E+00         1.85002E+01
+          1.24209E-02         1.27606E-02        -9.57957E-03         7.80366E-01         1.02110E+00         7.80425E-01         2.21611E+01         1.00000E+00         2.91524E-02         2.21611E+01         3.82003E+00         1.83411E+01
+          1.24209E-02         1.29304E-02        -9.71664E-03         7.80365E-01         1.03177E+00         7.80425E-01         2.20326E+01         1.00000E+00         2.91118E-02         2.20326E+01         3.79203E+00         1.82405E+01
+          1.24209E-02         1.31002E-02        -9.85552E-03         7.80363E-01         1.04244E+00         7.80425E-01         2.19649E+01         1.00000E+00         2.90793E-02         2.19649E+01         3.77217E+00         1.81927E+01
+          1.24209E-02         1.32701E-02        -9.99622E-03         7.80361E-01         1.05311E+00         7.80425E-01         2.19515E+01         1.00000E+00         2.90545E-02         2.19515E+01         3.75966E+00         1.81918E+01
+          1.24209E-02         1.34399E-02        -1.01387E-02         7.80359E-01         1.06378E+00         7.80425E-01         2.19860E+01         1.00000E+00         2.90372E-02         2.19860E+01         3.75372E+00         1.82323E+01
+          1.24209E-02         1.36097E-02        -1.02830E-02         7.80358E-01         1.07445E+00         7.80425E-01         2.20623E+01         1.00000E+00         2.90270E-02         2.20623E+01         3.75359E+00         1.83087E+01
+          1.24209E-02         1.37795E-02        -1.04292E-02         7.80356E-01         1.08512E+00         7.80426E-01         2.21744E+01         1.00000E+00         2.90236E-02         2.21744E+01         3.75851E+00         1.84159E+01
+          1.24209E-02         1.39494E-02        -1.05771E-02         7.80354E-01         1.09579E+00         7.80426E-01         2.23165E+01         1.00000E+00         2.90267E-02         2.23165E+01         3.76779E+00         1.85487E+01
+          1.24209E-02         1.41192E-02        -1.07269E-02         7.80352E-01         1.10646E+00         7.80426E-01         2.24832E+01         1.00000E+00         2.90359E-02         2.24832E+01         3.78072E+00         1.87025E+01
+          1.24209E-02         1.42890E-02        -1.08784E-02         7.80350E-01         1.11713E+00         7.80426E-01         2.26691E+01         1.00000E+00         2.90510E-02         2.26691E+01         3.79663E+00         1.88724E+01
+          1.24209E-02         1.44589E-02        -1.10318E-02         7.80348E-01         1.12780E+00         7.80426E-01         2.28691E+01         1.00000E+00         2.90716E-02         2.28691E+01         3.81490E+00         1.90542E+01
+          1.24209E-02         1.46287E-02        -1.11870E-02         7.80346E-01         1.13847E+00         7.80427E-01         2.30786E+01         1.00000E+00         2.90974E-02         2.30786E+01         3.83490E+00         1.92437E+01
+          1.24209E-02         1.47985E-02        -1.13440E-02         7.80344E-01         1.14914E+00         7.80427E-01         2.32929E+01         1.00000E+00         2.91281E-02         2.32929E+01         3.85605E+00         1.94369E+01
+          1.24209E-02         1.49683E-02        -1.15029E-02         7.80343E-01         1.15981E+00         7.80427E-01         2.35079E+01         1.00000E+00         2.91632E-02         2.35079E+01         3.87781E+00         1.96300E+01
+          1.24209E-02         1.51382E-02        -1.16635E-02         7.80341E-01         1.17048E+00         7.80428E-01         2.37194E+01         1.00000E+00         2.92027E-02         2.37194E+01         3.89964E+00         1.98198E+01
+          1.24209E-02         1.53080E-02        -1.18259E-02         7.80338E-01         1.18115E+00         7.80428E-01         2.39239E+01         1.00000E+00         2.92460E-02         2.39239E+01         3.92107E+00         2.00028E+01
+          1.24209E-02         1.54778E-02        -1.19902E-02         7.80336E-01         1.19182E+00         7.80429E-01         2.41178E+01         1.00000E+00         2.92928E-02         2.41178E+01         3.94162E+00         2.01762E+01
+          1.24209E-02         1.56476E-02        -1.21563E-02         7.80334E-01         1.20249E+00         7.80429E-01         2.42981E+01         1.00000E+00         2.93430E-02         2.42980E+01         3.96088E+00         2.03372E+01
+          1.24209E-02         1.58175E-02        -1.23241E-02         7.80332E-01         1.21317E+00         7.80430E-01         2.44617E+01         1.00000E+00         2.93961E-02         2.44617E+01         3.97844E+00         2.04833E+01
+          1.24209E-02         1.59873E-02        -1.24938E-02         7.80330E-01         1.22384E+00         7.80430E-01         2.46062E+01         1.00000E+00         2.94518E-02         2.46062E+01         3.99394E+00         2.06122E+01
+          1.24209E-02         1.61571E-02        -1.26653E-02         7.80328E-01         1.23451E+00         7.80431E-01         2.47292E+01         1.00000E+00         2.95098E-02         2.47291E+01         4.00706E+00         2.07221E+01
+          1.24209E-02         1.63270E-02        -1.28387E-02         7.80326E-01         1.24518E+00         7.80432E-01         2.48285E+01         1.00000E+00         2.95698E-02         2.48285E+01         4.01748E+00         2.08110E+01
+          1.24209E-02         1.64968E-02        -1.30138E-02         7.80324E-01         1.25585E+00         7.80432E-01         2.49025E+01         1.00000E+00         2.96315E-02         2.49025E+01         4.02494E+00         2.08776E+01
+          1.24209E-02         1.66666E-02        -1.31907E-02         7.80322E-01         1.26652E+00         7.80433E-01         2.49496E+01         1.00000E+00         2.96946E-02         2.49496E+01         4.02921E+00         2.09204E+01
+          1.24209E-02         1.68364E-02        -1.33695E-02         7.80319E-01         1.27719E+00         7.80434E-01         2.49685E+01         1.00000E+00         2.97589E-02         2.49685E+01         4.03006E+00         2.09384E+01
+          1.24209E-02         1.70063E-02        -1.35501E-02         7.80317E-01         1.28786E+00         7.80435E-01         2.49582E+01         1.00000E+00         2.98239E-02         2.49582E+01         4.02734E+00         2.09308E+01
+          1.24209E-02         1.71761E-02        -1.37325E-02         7.80315E-01         1.29853E+00         7.80436E-01         2.49178E+01         1.00000E+00         2.98895E-02         2.49178E+01         4.02088E+00         2.08969E+01
+          1.24209E-02         1.73459E-02        -1.39167E-02         7.80313E-01         1.30920E+00         7.80437E-01         2.48469E+01         1.00000E+00         2.99553E-02         2.48469E+01         4.01056E+00         2.08363E+01
+          1.24209E-02         1.75158E-02        -1.41027E-02         7.80310E-01         1.31987E+00         7.80438E-01         2.47451E+01         1.00000E+00         3.00210E-02         2.47451E+01         3.99630E+00         2.07488E+01
+          1.24209E-02         1.76856E-02        -1.42905E-02         7.80308E-01         1.33054E+00         7.80439E-01         2.46123E+01         1.00000E+00         3.00865E-02         2.46123E+01         3.97801E+00         2.06343E+01
+          1.24209E-02         1.78554E-02        -1.44801E-02         7.80306E-01         1.34121E+00         7.80440E-01         2.44486E+01         1.00000E+00         3.01514E-02         2.44485E+01         3.95568E+00         2.04929E+01
+          1.24209E-02         1.80252E-02        -1.46716E-02         7.80303E-01         1.35188E+00         7.80441E-01         2.42542E+01         1.00000E+00         3.02154E-02         2.42542E+01         3.92926E+00         2.03249E+01
+          1.24209E-02         1.81951E-02        -1.48648E-02         7.80301E-01         1.36255E+00         7.80442E-01         2.40297E+01         1.00000E+00         3.02784E-02         2.40297E+01         3.89878E+00         2.01309E+01
+          1.24209E-02         1.83649E-02        -1.50599E-02         7.80298E-01         1.37322E+00         7.80444E-01         2.37756E+01         1.00000E+00         3.03400E-02         2.37756E+01         3.86425E+00         1.99114E+01
+          1.24209E-02         1.85347E-02        -1.52568E-02         7.80296E-01         1.38389E+00         7.80445E-01         2.34929E+01         1.00000E+00         3.04001E-02         2.34929E+01         3.82573E+00         1.96672E+01
+          1.24209E-02         1.87045E-02        -1.54555E-02         7.80293E-01         1.39457E+00         7.80446E-01         2.31824E+01         1.00000E+00         3.04584E-02         2.31824E+01         3.78329E+00         1.93991E+01
+          1.24209E-02         1.88744E-02        -1.56560E-02         7.80291E-01         1.40524E+00         7.80448E-01         2.28453E+01         1.00000E+00         3.05147E-02         2.28453E+01         3.73702E+00         1.91083E+01
+          1.24209E-02         1.90442E-02        -1.58584E-02         7.80288E-01         1.41591E+00         7.80450E-01         2.24828E+01         1.00000E+00         3.05687E-02         2.24828E+01         3.68701E+00         1.87958E+01
+          1.24209E-02         1.92140E-02        -1.60625E-02         7.80286E-01         1.42658E+00         7.80451E-01         2.20963E+01         1.00000E+00         3.06203E-02         2.20962E+01         3.63340E+00         1.84628E+01
+          1.24209E-02         1.93839E-02        -1.62684E-02         7.80283E-01         1.43725E+00         7.80453E-01         2.16871E+01         1.00000E+00         3.06692E-02         2.16871E+01         3.57631E+00         1.81107E+01
+          1.24209E-02         1.95537E-02        -1.64762E-02         7.80281E-01         1.44792E+00         7.80455E-01         2.12568E+01         1.00000E+00         3.07153E-02         2.12568E+01         3.51589E+00         1.77409E+01
+          1.24209E-02         1.97235E-02        -1.66858E-02         7.80278E-01         1.45859E+00         7.80457E-01         2.08071E+01         1.00000E+00         3.07584E-02         2.08071E+01         3.45231E+00         1.73548E+01
+          1.24209E-02         1.98933E-02        -1.68972E-02         7.80275E-01         1.46926E+00         7.80458E-01         2.03396E+01         1.00000E+00         3.07983E-02         2.03396E+01         3.38574E+00         1.69538E+01
+          1.24209E-02         2.00632E-02        -1.71104E-02         7.80273E-01         1.47993E+00         7.80460E-01         1.98561E+01         1.00000E+00         3.08348E-02         1.98561E+01         3.31636E+00         1.65397E+01
+          1.24209E-02         2.02330E-02        -1.73254E-02         7.80270E-01         1.49060E+00         7.80463E-01         1.93583E+01         1.00000E+00         3.08678E-02         1.93583E+01         3.24436E+00         1.61140E+01
+          1.24209E-02         2.04028E-02        -1.75422E-02         7.80267E-01         1.50127E+00         7.80465E-01         1.88482E+01         1.00000E+00         3.08971E-02         1.88482E+01         3.16994E+00         1.56782E+01
+          1.24209E-02         2.05726E-02        -1.77609E-02         7.80265E-01         1.51194E+00         7.80467E-01         1.83275E+01         1.00000E+00         3.09226E-02         1.83275E+01         3.09330E+00         1.52342E+01
+          1.24209E-02         2.07425E-02        -1.79813E-02         7.80262E-01         1.52261E+00         7.80469E-01         1.77980E+01         1.00000E+00         3.09442E-02         1.77980E+01         3.01464E+00         1.47834E+01
+          1.24209E-02         2.09123E-02        -1.82036E-02         7.80259E-01         1.53328E+00         7.80472E-01         1.72618E+01         1.00000E+00         3.09616E-02         1.72618E+01         2.93418E+00         1.43276E+01
+          1.24209E-02         2.10821E-02        -1.84277E-02         7.80256E-01         1.54395E+00         7.80474E-01         1.67205E+01         1.00000E+00         3.09749E-02         1.67205E+01         2.85214E+00         1.38684E+01
+          1.24209E-02         2.12520E-02        -1.86536E-02         7.80254E-01         1.55462E+00         7.80477E-01         1.61761E+01         1.00000E+00         3.09838E-02         1.61762E+01         2.76872E+00         1.34074E+01
+          1.24209E-02         2.14218E-02        -1.88813E-02         7.80251E-01         1.56529E+00         7.80479E-01         1.56304E+01         1.00000E+00         3.09883E-02         1.56304E+01         2.68415E+00         1.29463E+01
+          1.24209E-02         2.15916E-02        -1.91108E-02         7.80248E-01         1.57596E+00         7.80482E-01         1.50851E+01         1.00000E+00         3.09883E-02         1.50851E+01         2.59863E+00         1.24865E+01
+          1.24209E-02         2.17614E-02        -1.93422E-02         7.80245E-01         1.58664E+00         7.80485E-01         1.45420E+01         1.00000E+00         3.09837E-02         1.45420E+01         2.51239E+00         1.20297E+01
+          1.24209E-02         2.19313E-02        -1.95753E-02         7.80242E-01         1.59731E+00         7.80488E-01         1.40028E+01         1.00000E+00         3.09744E-02         1.40028E+01         2.42562E+00         1.15772E+01
+          1.24209E-02         2.21011E-02        -1.98103E-02         7.80239E-01         1.60798E+00         7.80491E-01         1.34691E+01         1.00000E+00         3.09604E-02         1.34691E+01         2.33855E+00         1.11305E+01
+          1.24209E-02         2.22709E-02        -2.00471E-02         7.80236E-01         1.61865E+00         7.80494E-01         1.29424E+01         1.00000E+00         3.09415E-02         1.29424E+01         2.25136E+00         1.06911E+01
+          1.24209E-02         2.24407E-02        -2.02857E-02         7.80233E-01         1.62932E+00         7.80497E-01         1.24243E+01         1.00000E+00         3.09177E-02         1.24243E+01         2.16427E+00         1.02601E+01
+          1.24209E-02         2.26106E-02        -2.05261E-02         7.80230E-01         1.63999E+00         7.80500E-01         1.19162E+01         1.00000E+00         3.08890E-02         1.19162E+01         2.07746E+00         9.83878E+00
+          1.24209E-02         2.27804E-02        -2.07683E-02         7.80227E-01         1.65066E+00         7.80504E-01         1.14195E+01         1.00000E+00         3.08553E-02         1.14195E+01         1.99111E+00         9.42838E+00
+          1.24209E-02         2.29502E-02        -2.10123E-02         7.80224E-01         1.66133E+00         7.80507E-01         1.09353E+01         1.00000E+00         3.08166E-02         1.09354E+01         1.90542E+00         9.02995E+00
+          1.24209E-02         2.31201E-02        -2.12581E-02         7.80221E-01         1.67200E+00         7.80511E-01         1.04650E+01         1.00000E+00         3.07728E-02         1.04650E+01         1.82055E+00         8.64448E+00
+          1.24209E-02         2.32899E-02        -2.15058E-02         7.80218E-01         1.68267E+00         7.80515E-01         1.00096E+01         1.00000E+00         3.07239E-02         1.00096E+01         1.73667E+00         8.27292E+00
+          1.24209E-02         2.34597E-02        -2.17553E-02         7.80215E-01         1.69334E+00         7.80518E-01         9.56999E+00         1.00000E+00         3.06699E-02         9.57002E+00         1.65392E+00         7.91609E+00
+          1.24209E-02         2.36295E-02        -2.20066E-02         7.80212E-01         1.70401E+00         7.80522E-01         9.14721E+00         1.00000E+00         3.06107E-02         9.14724E+00         1.57248E+00         7.57476E+00
+          1.24209E-02         2.37994E-02        -2.22597E-02         7.80209E-01         1.71468E+00         7.80526E-01         8.74204E+00         1.00000E+00         3.05465E-02         8.74207E+00         1.49246E+00         7.24961E+00
+          1.24209E-02         2.39692E-02        -2.25146E-02         7.80206E-01         1.72535E+00         7.80531E-01         8.35518E+00         1.00000E+00         3.04770E-02         8.35521E+00         1.41400E+00         6.94121E+00
+          1.24209E-02         2.41390E-02        -2.27713E-02         7.80203E-01         1.73602E+00         7.80535E-01         7.98726E+00         1.00000E+00         3.04025E-02         7.98729E+00         1.33723E+00         6.65006E+00
+          1.24209E-02         2.43088E-02        -2.30298E-02         7.80199E-01         1.74669E+00         7.80539E-01         7.63880E+00         1.00000E+00         3.03228E-02         7.63883E+00         1.26226E+00         6.37657E+00
+          1.24209E-02         2.44787E-02        -2.32902E-02         7.80196E-01         1.75736E+00         7.80544E-01         7.31022E+00         1.00000E+00         3.02379E-02         7.31025E+00         1.18918E+00         6.12107E+00
+          1.24209E-02         2.46485E-02        -2.35524E-02         7.80193E-01         1.76804E+00         7.80548E-01         7.00186E+00         1.00000E+00         3.01480E-02         7.00189E+00         1.11809E+00         5.88380E+00
+          1.24209E-02         2.48183E-02        -2.38163E-02         7.80190E-01         1.77871E+00         7.80553E-01         6.71395E+00         1.00000E+00         3.00529E-02         6.71397E+00         1.04907E+00         5.66490E+00
+          1.24209E-02         2.49882E-02        -2.40821E-02         7.80186E-01         1.78938E+00         7.80558E-01         6.44663E+00         1.00000E+00         2.99528E-02         6.44666E+00         9.82206E-01         5.46446E+00
+          1.24209E-02         2.51580E-02        -2.43497E-02         7.80183E-01         1.80005E+00         7.80563E-01         6.19998E+00         1.00000E+00         2.98477E-02         6.20001E+00         9.17552E-01         5.28246E+00
+          1.24209E-02         2.53278E-02        -2.46192E-02         7.80180E-01         1.81072E+00         7.80568E-01         5.97395E+00         1.00000E+00         2.97375E-02         5.97398E+00         8.55166E-01         5.11881E+00
+          1.24209E-02         2.54976E-02        -2.48904E-02         7.80176E-01         1.82139E+00         7.80573E-01         5.76844E+00         1.00000E+00         2.96224E-02         5.76847E+00         7.95093E-01         4.97337E+00
+          1.24209E-02         2.56675E-02        -2.51634E-02         7.80173E-01         1.83206E+00         7.80579E-01         5.58324E+00         1.00000E+00         2.95023E-02         5.58327E+00         7.37372E-01         4.84589E+00
+          1.24209E-02         2.58373E-02        -2.54383E-02         7.80169E-01         1.84273E+00         7.80584E-01         5.41809E+00         1.00000E+00         2.93774E-02         5.41811E+00         6.82029E-01         4.73608E+00
+          1.24209E-02         2.60071E-02        -2.57150E-02         7.80166E-01         1.85340E+00         7.80590E-01         5.27263E+00         1.00000E+00         2.92476E-02         5.27266E+00         6.29085E-01         4.64357E+00
+          1.24209E-02         2.61769E-02        -2.59935E-02         7.80163E-01         1.86407E+00         7.80595E-01         5.14646E+00         1.00000E+00         2.91131E-02         5.14649E+00         5.78552E-01         4.56793E+00
+          1.25908E-02         8.72665E-04        -4.62160E-03         7.91100E-01         2.74155E-01         7.91114E-01         4.13201E+02         1.00000E+00         4.59337E-02         4.13201E+02         6.30493E+01         3.50152E+02
+          1.25908E-02         1.04249E-03        -4.63182E-03         7.91100E-01         2.84826E-01         7.91114E-01         4.04744E+02         1.00000E+00         4.54775E-02         4.04744E+02         6.17680E+01         3.42976E+02
+          1.25908E-02         1.21232E-03        -4.64385E-03         7.91100E-01         2.95496E-01         7.91114E-01         3.96125E+02         1.00000E+00         4.50122E-02         3.96125E+02         6.04617E+01         3.35664E+02
+          1.25908E-02         1.38215E-03        -4.65769E-03         7.91100E-01         3.06167E-01         7.91113E-01         3.87360E+02         1.00000E+00         4.45386E-02         3.87360E+02         5.91328E+01         3.28227E+02
+          1.25908E-02         1.55197E-03        -4.67334E-03         7.91100E-01         3.16838E-01         7.91113E-01         3.78464E+02         1.00000E+00         4.40576E-02         3.78464E+02         5.77837E+01         3.20681E+02
+          1.25908E-02         1.72180E-03        -4.69081E-03         7.91099E-01         3.27508E-01         7.91113E-01         3.69453E+02         1.00000E+00         4.35700E-02         3.69453E+02         5.64167E+01         3.13036E+02
+          1.25908E-02         1.89163E-03        -4.71009E-03         7.91099E-01         3.38179E-01         7.91113E-01         3.60342E+02         1.00000E+00         4.30765E-02         3.60342E+02         5.50340E+01         3.05308E+02
+          1.25908E-02         2.06146E-03        -4.73118E-03         7.91099E-01         3.48849E-01         7.91113E-01         3.51146E+02         1.00000E+00         4.25780E-02         3.51146E+02         5.36381E+01         2.97508E+02
+          1.25908E-02         2.23128E-03        -4.75408E-03         7.91099E-01         3.59520E-01         7.91113E-01         3.41882E+02         1.00000E+00         4.20752E-02         3.41882E+02         5.22313E+01         2.89651E+02
+          1.25908E-02         2.40111E-03        -4.77879E-03         7.91098E-01         3.70190E-01         7.91113E-01         3.32565E+02         1.00000E+00         4.15691E-02         3.32565E+02         5.08159E+01         2.81749E+02
+          1.25908E-02         2.57094E-03        -4.80532E-03         7.91098E-01         3.80861E-01         7.91112E-01         3.23209E+02         1.00000E+00         4.10603E-02         3.23209E+02         4.93942E+01         2.73815E+02
+          1.25908E-02         2.74077E-03        -4.83365E-03         7.91098E-01         3.91532E-01         7.91112E-01         3.13831E+02         1.00000E+00         4.05497E-02         3.13831E+02         4.79685E+01         2.65862E+02
+          1.25908E-02         2.91059E-03        -4.86380E-03         7.91097E-01         4.02202E-01         7.91112E-01         3.04445E+02         1.00000E+00         4.00380E-02         3.04445E+02         4.65410E+01         2.57904E+02
+          1.25908E-02         3.08042E-03        -4.89576E-03         7.91097E-01         4.12873E-01         7.91112E-01         2.95065E+02         1.00000E+00         3.95261E-02         2.95065E+02         4.51140E+01         2.49951E+02
+          1.25908E-02         3.25025E-03        -4.92954E-03         7.91096E-01         4.23543E-01         7.91112E-01         2.85706E+02         1.00000E+00         3.90147E-02         2.85706E+02         4.36896E+01         2.42017E+02
+          1.25908E-02         3.42008E-03        -4.96512E-03         7.91096E-01         4.34214E-01         7.91111E-01         2.76383E+02         1.00000E+00         3.85045E-02         2.76383E+02         4.22700E+01         2.34113E+02
+          1.25908E-02         3.58990E-03        -5.00252E-03         7.91095E-01         4.44884E-01         7.91111E-01         2.67109E+02         1.00000E+00         3.79962E-02         2.67109E+02         4.08573E+01         2.26251E+02
+          1.25908E-02         3.75973E-03        -5.04173E-03         7.91095E-01         4.55555E-01         7.91111E-01         2.57897E+02         1.00000E+00         3.74906E-02         2.57897E+02         3.94535E+01         2.18443E+02
+          1.25908E-02         3.92956E-03        -5.08275E-03         7.91094E-01         4.66225E-01         7.91111E-01         2.48760E+02         1.00000E+00         3.69883E-02         2.48760E+02         3.80606E+01         2.10700E+02
+          1.25908E-02         4.09939E-03        -5.12558E-03         7.91094E-01         4.76896E-01         7.91110E-01         2.39712E+02         1.00000E+00         3.64899E-02         2.39712E+02         3.66805E+01         2.03031E+02
+          1.25908E-02         4.26921E-03        -5.17023E-03         7.91093E-01         4.87567E-01         7.91110E-01         2.30763E+02         1.00000E+00         3.59962E-02         2.30763E+02         3.53151E+01         1.95448E+02
+          1.25908E-02         4.43904E-03        -5.21669E-03         7.91093E-01         4.98237E-01         7.91110E-01         2.21927E+02         1.00000E+00         3.55078E-02         2.21927E+02         3.39662E+01         1.87961E+02
+          1.25908E-02         4.60887E-03        -5.26496E-03         7.91092E-01         5.08908E-01         7.91110E-01         2.13213E+02         1.00000E+00         3.50252E-02         2.13213E+02         3.26354E+01         1.80578E+02
+          1.25908E-02         4.77869E-03        -5.31504E-03         7.91091E-01         5.19578E-01         7.91109E-01         2.04634E+02         1.00000E+00         3.45489E-02         2.04634E+02         3.13244E+01         1.73309E+02
+          1.25908E-02         4.94852E-03        -5.36693E-03         7.91091E-01         5.30249E-01         7.91109E-01         1.96198E+02         1.00000E+00         3.40796E-02         1.96198E+02         3.00349E+01         1.66163E+02
+          1.25908E-02         5.11835E-03        -5.42064E-03         7.91090E-01         5.40919E-01         7.91109E-01         1.87916E+02         1.00000E+00         3.36177E-02         1.87916E+02         2.87682E+01         1.59148E+02
+          1.25908E-02         5.28818E-03        -5.47616E-03         7.91089E-01         5.51590E-01         7.91108E-01         1.79796E+02         1.00000E+00         3.31636E-02         1.79796E+02         2.75257E+01         1.52270E+02
+          1.25908E-02         5.45800E-03        -5.53349E-03         7.91089E-01         5.62261E-01         7.91108E-01         1.71847E+02         1.00000E+00         3.27179E-02         1.71847E+02         2.63089E+01         1.45538E+02
+          1.25908E-02         5.62783E-03        -5.59263E-03         7.91088E-01         5.72931E-01         7.91108E-01         1.64077E+02         1.00000E+00         3.22810E-02         1.64077E+02         2.51189E+01         1.38959E+02
+          1.25908E-02         5.79766E-03        -5.65358E-03         7.91087E-01         5.83602E-01         7.91107E-01         1.56494E+02         1.00000E+00         3.18531E-02         1.56494E+02         2.39568E+01         1.32537E+02
+          1.25908E-02         5.96749E-03        -5.71635E-03         7.91086E-01         5.94272E-01         7.91107E-01         1.49103E+02         1.00000E+00         3.14348E-02         1.49103E+02         2.28237E+01         1.26279E+02
+          1.25908E-02         6.13731E-03        -5.78093E-03         7.91086E-01         6.04943E-01         7.91107E-01         1.41911E+02         1.00000E+00         3.10262E-02         1.41911E+02         2.17206E+01         1.20191E+02
+          1.25908E-02         6.30714E-03        -5.84732E-03         7.91085E-01         6.15613E-01         7.91106E-01         1.34924E+02         1.00000E+00         3.06277E-02         1.34924E+02         2.06483E+01         1.14276E+02
+          1.25908E-02         6.47697E-03        -5.91552E-03         7.91084E-01         6.26284E-01         7.91106E-01         1.28146E+02         1.00000E+00         3.02396E-02         1.28146E+02         1.96077E+01         1.08538E+02
+          1.25908E-02         6.64680E-03        -5.98554E-03         7.91083E-01         6.36955E-01         7.91106E-01         1.21581E+02         1.00000E+00         2.98620E-02         1.21581E+02         1.85993E+01         1.02982E+02
+          1.25908E-02         6.81662E-03        -6.05737E-03         7.91082E-01         6.47625E-01         7.91105E-01         1.15234E+02         1.00000E+00         2.94952E-02         1.15234E+02         1.76239E+01         9.76103E+01
+          1.25908E-02         6.98645E-03        -6.13101E-03         7.91081E-01         6.58296E-01         7.91105E-01         1.09107E+02         1.00000E+00         2.91394E-02         1.09107E+02         1.66818E+01         9.24252E+01
+          1.25908E-02         7.15628E-03        -6.20646E-03         7.91080E-01         6.68966E-01         7.91105E-01         1.03203E+02         1.00000E+00         2.87946E-02         1.03203E+02         1.57736E+01         8.74290E+01
+          1.25908E-02         7.32611E-03        -6.28372E-03         7.91079E-01         6.79637E-01         7.91104E-01         9.75226E+01         1.00000E+00         2.84610E-02         9.75227E+01         1.48995E+01         8.26231E+01
+          1.25908E-02         7.49593E-03        -6.36280E-03         7.91078E-01         6.90307E-01         7.91104E-01         9.20684E+01         1.00000E+00         2.81387E-02         9.20685E+01         1.40599E+01         7.80086E+01
+          1.25908E-02         7.66576E-03        -6.44368E-03         7.91077E-01         7.00978E-01         7.91104E-01         8.68407E+01         1.00000E+00         2.78277E-02         8.68407E+01         1.32547E+01         7.35860E+01
+          1.25908E-02         7.83559E-03        -6.52638E-03         7.91076E-01         7.11649E-01         7.91103E-01         8.18395E+01         1.00000E+00         2.75281E-02         8.18396E+01         1.24842E+01         6.93554E+01
+          1.25908E-02         8.00542E-03        -6.61090E-03         7.91075E-01         7.22319E-01         7.91103E-01         7.70646E+01         1.00000E+00         2.72398E-02         7.70646E+01         1.17482E+01         6.53164E+01
+          1.25908E-02         8.17524E-03        -6.69722E-03         7.91074E-01         7.32990E-01         7.91102E-01         7.25148E+01         1.00000E+00         2.69630E-02         7.25148E+01         1.10467E+01         6.14681E+01
+          1.25908E-02         8.34507E-03        -6.78536E-03         7.91073E-01         7.43660E-01         7.91102E-01         6.81888E+01         1.00000E+00         2.66974E-02         6.81888E+01         1.03796E+01         5.78092E+01
+          1.25908E-02         8.51490E-03        -6.87531E-03         7.91072E-01         7.54331E-01         7.91102E-01         6.40846E+01         1.00000E+00         2.64432E-02         6.40846E+01         9.74651E+00         5.43381E+01
+          1.25908E-02         8.68473E-03        -6.96707E-03         7.91071E-01         7.65001E-01         7.91101E-01         6.01998E+01         1.00000E+00         2.62002E-02         6.01998E+01         9.14716E+00         5.10526E+01
+          1.25908E-02         8.85455E-03        -7.06064E-03         7.91069E-01         7.75672E-01         7.91101E-01         5.65314E+01         1.00000E+00         2.59684E-02         5.65314E+01         8.58116E+00         4.79503E+01
+          1.25908E-02         9.02438E-03        -7.15603E-03         7.91068E-01         7.86343E-01         7.91101E-01         5.30762E+01         1.00000E+00         2.57475E-02         5.30762E+01         8.04805E+00         4.50282E+01
+          1.25908E-02         9.19421E-03        -7.25322E-03         7.91067E-01         7.97013E-01         7.91100E-01         4.98304E+01         1.00000E+00         2.55376E-02         4.98304E+01         7.54728E+00         4.22831E+01
+          1.25908E-02         9.36403E-03        -7.35223E-03         7.91066E-01         8.07684E-01         7.91100E-01         4.67899E+01         1.00000E+00         2.53385E-02         4.67899E+01         7.07828E+00         3.97116E+01
+          1.25908E-02         9.53386E-03        -7.45306E-03         7.91065E-01         8.18354E-01         7.91100E-01         4.39501E+01         1.00000E+00         2.51500E-02         4.39501E+01         6.64039E+00         3.73097E+01
+          1.25908E-02         9.70369E-03        -7.55569E-03         7.91063E-01         8.29025E-01         7.91099E-01         4.13062E+01         1.00000E+00         2.49721E-02         4.13062E+01         6.23292E+00         3.50733E+01
+          1.25908E-02         9.87352E-03        -7.66014E-03         7.91062E-01         8.39695E-01         7.91099E-01         3.88530E+01         1.00000E+00         2.48044E-02         3.88530E+01         5.85512E+00         3.29979E+01
+          1.25908E-02         1.00433E-02        -7.76640E-03         7.91061E-01         8.50366E-01         7.91099E-01         3.65851E+01         1.00000E+00         2.46469E-02         3.65851E+01         5.50617E+00         3.10789E+01
+          1.25908E-02         1.02132E-02        -7.87447E-03         7.91059E-01         8.61037E-01         7.91098E-01         3.44966E+01         1.00000E+00         2.44994E-02         3.44966E+01         5.18525E+00         2.93114E+01
+          1.25908E-02         1.03830E-02        -7.98435E-03         7.91058E-01         8.71707E-01         7.91098E-01         3.25817E+01         1.00000E+00         2.43617E-02         3.25817E+01         4.89147E+00         2.76902E+01
+          1.25908E-02         1.05528E-02        -8.09605E-03         7.91056E-01         8.82378E-01         7.91098E-01         3.08341E+01         1.00000E+00         2.42336E-02         3.08341E+01         4.62390E+00         2.62102E+01
+          1.25908E-02         1.07227E-02        -8.20955E-03         7.91055E-01         8.93048E-01         7.91098E-01         2.92473E+01         1.00000E+00         2.41149E-02         2.92473E+01         4.38160E+00         2.48657E+01
+          1.25908E-02         1.08925E-02        -8.32487E-03         7.91054E-01         9.03719E-01         7.91097E-01         2.78149E+01         1.00000E+00         2.40054E-02         2.78149E+01         4.16358E+00         2.36513E+01
+          1.25908E-02         1.10623E-02        -8.44201E-03         7.91052E-01         9.14389E-01         7.91097E-01         2.65300E+01         1.00000E+00         2.39049E-02         2.65300E+01         3.96885E+00         2.25611E+01
+          1.25908E-02         1.12321E-02        -8.56095E-03         7.91051E-01         9.25060E-01         7.91097E-01         2.53858E+01         1.00000E+00         2.38132E-02         2.53858E+01         3.79637E+00         2.15894E+01
+          1.25908E-02         1.14020E-02        -8.68171E-03         7.91049E-01         9.35731E-01         7.91097E-01         2.43754E+01         1.00000E+00         2.37300E-02         2.43754E+01         3.64511E+00         2.07303E+01
+          1.25908E-02         1.15718E-02        -8.80428E-03         7.91048E-01         9.46401E-01         7.91097E-01         2.34919E+01         1.00000E+00         2.36552E-02         2.34918E+01         3.51399E+00         1.99779E+01
+          1.25908E-02         1.17416E-02        -8.92866E-03         7.91046E-01         9.57072E-01         7.91096E-01         2.27280E+01         1.00000E+00         2.35884E-02         2.27280E+01         3.40197E+00         1.93260E+01
+          1.25908E-02         1.19114E-02        -9.05486E-03         7.91044E-01         9.67742E-01         7.91096E-01         2.20767E+01         1.00000E+00         2.35296E-02         2.20767E+01         3.30796E+00         1.87688E+01
+          1.25908E-02         1.20813E-02        -9.18286E-03         7.91043E-01         9.78413E-01         7.91096E-01         2.15311E+01         1.00000E+00         2.34784E-02         2.15310E+01         3.23088E+00         1.83002E+01
+          1.25908E-02         1.22511E-02        -9.31268E-03         7.91041E-01         9.89083E-01         7.91096E-01         2.10839E+01         1.00000E+00         2.34346E-02         2.10839E+01         3.16967E+00         1.79142E+01
+          1.25908E-02         1.24209E-02        -9.44432E-03         7.91039E-01         9.99754E-01         7.91096E-01         2.07282E+01         1.00000E+00         2.33980E-02         2.07282E+01         3.12324E+00         1.76049E+01
+          1.25908E-02         1.25908E-02        -9.57776E-03         7.91038E-01         1.01042E+00         7.91096E-01         2.04570E+01         1.00000E+00         2.33684E-02         2.04570E+01         3.09054E+00         1.73665E+01
+          1.25908E-02         1.27606E-02        -9.71302E-03         7.91036E-01         1.02110E+00         7.91096E-01         2.02635E+01         1.00000E+00         2.33455E-02         2.02635E+01         3.07049E+00         1.71930E+01
+          1.25908E-02         1.29304E-02        -9.85009E-03         7.91034E-01         1.03177E+00         7.91096E-01         2.01410E+01         1.00000E+00         2.33291E-02         2.01409E+01         3.06207E+00         1.70789E+01
+          1.25908E-02         1.31002E-02        -9.98897E-03         7.91033E-01         1.04244E+00         7.91096E-01         2.00827E+01         1.00000E+00         2.33189E-02         2.00826E+01         3.06424E+00         1.70184E+01
+          1.25908E-02         1.32701E-02        -1.01297E-02         7.91031E-01         1.05311E+00         7.91096E-01         2.00821E+01         1.00000E+00         2.33147E-02         2.00821E+01         3.07598E+00         1.70061E+01
+          1.25908E-02         1.34399E-02        -1.02722E-02         7.91029E-01         1.06378E+00         7.91096E-01         2.01331E+01         1.00000E+00         2.33162E-02         2.01330E+01         3.09632E+00         1.70367E+01
+          1.25908E-02         1.36097E-02        -1.04165E-02         7.91027E-01         1.07445E+00         7.91096E-01         2.02292E+01         1.00000E+00         2.33232E-02         2.02292E+01         3.12428E+00         1.71049E+01
+          1.25908E-02         1.37795E-02        -1.05626E-02         7.91025E-01         1.08512E+00         7.91096E-01         2.03647E+01         1.00000E+00         2.33355E-02         2.03647E+01         3.15893E+00         1.72057E+01
+          1.25908E-02         1.39494E-02        -1.07106E-02         7.91024E-01         1.09579E+00         7.91096E-01         2.05336E+01         1.00000E+00         2.33528E-02         2.05336E+01         3.19934E+00         1.73343E+01
+          1.25908E-02         1.41192E-02        -1.08603E-02         7.91022E-01         1.10646E+00         7.91096E-01         2.07305E+01         1.00000E+00         2.33749E-02         2.07304E+01         3.24464E+00         1.74858E+01
+          1.25908E-02         1.42890E-02        -1.10119E-02         7.91020E-01         1.11713E+00         7.91096E-01         2.09498E+01         1.00000E+00         2.34014E-02         2.09498E+01         3.29396E+00         1.76559E+01
+          1.25908E-02         1.44589E-02        -1.11653E-02         7.91018E-01         1.12780E+00         7.91097E-01         2.11866E+01         1.00000E+00         2.34322E-02         2.11866E+01         3.34649E+00         1.78401E+01
+          1.25908E-02         1.46287E-02        -1.13205E-02         7.91016E-01         1.13847E+00         7.91097E-01         2.14360E+01         1.00000E+00         2.34671E-02         2.14360E+01         3.40144E+00         1.80345E+01
+          1.25908E-02         1.47985E-02        -1.14775E-02         7.91014E-01         1.14914E+00         7.91097E-01         2.16932E+01         1.00000E+00         2.35056E-02         2.16932E+01         3.45806E+00         1.82351E+01
+          1.25908E-02         1.49683E-02        -1.16363E-02         7.91012E-01         1.15981E+00         7.91097E-01         2.19539E+01         1.00000E+00         2.35477E-02         2.19539E+01         3.51563E+00         1.84383E+01
+          1.25908E-02         1.51382E-02        -1.17969E-02         7.91010E-01         1.17048E+00         7.91098E-01         2.22140E+01         1.00000E+00         2.35930E-02         2.22140E+01         3.57347E+00         1.86405E+01
+          1.25908E-02         1.53080E-02        -1.19594E-02         7.91008E-01         1.18115E+00         7.91098E-01         2.24696E+01         1.00000E+00         2.36413E-02         2.24696E+01         3.63093E+00         1.88386E+01
+          1.25908E-02         1.54778E-02        -1.21236E-02         7.91006E-01         1.19182E+00         7.91099E-01         2.27170E+01         1.00000E+00         2.36924E-02         2.27170E+01         3.68743E+00         1.90296E+01
+          1.25908E-02         1.56476E-02        -1.22897E-02         7.91004E-01         1.20249E+00         7.91099E-01         2.29530E+01         1.00000E+00         2.37460E-02         2.29530E+01         3.74238E+00         1.92106E+01
+          1.25908E-02         1.58175E-02        -1.24576E-02         7.91002E-01         1.21317E+00         7.91100E-01         2.31745E+01         1.00000E+00         2.38018E-02         2.31745E+01         3.79528E+00         1.93792E+01
+          1.25908E-02         1.59873E-02        -1.26273E-02         7.90999E-01         1.22384E+00         7.91100E-01         2.33787E+01         1.00000E+00         2.38597E-02         2.33787E+01         3.84563E+00         1.95331E+01
+          1.25908E-02         1.61571E-02        -1.27988E-02         7.90997E-01         1.23451E+00         7.91101E-01         2.35630E+01         1.00000E+00         2.39194E-02         2.35630E+01         3.89298E+00         1.96700E+01
+          1.25908E-02         1.63270E-02        -1.29721E-02         7.90995E-01         1.24518E+00         7.91101E-01         2.37252E+01         1.00000E+00         2.39805E-02         2.37252E+01         3.93694E+00         1.97882E+01
+          1.25908E-02         1.64968E-02        -1.31472E-02         7.90993E-01         1.25585E+00         7.91102E-01         2.38632E+01         1.00000E+00         2.40430E-02         2.38632E+01         3.97713E+00         1.98861E+01
+          1.25908E-02         1.66666E-02        -1.33242E-02         7.90991E-01         1.26652E+00         7.91103E-01         2.39753E+01         1.00000E+00         2.41066E-02         2.39753E+01         4.01322E+00         1.99621E+01
+          1.25908E-02         1.68364E-02        -1.35029E-02         7.90988E-01         1.27719E+00         7.91104E-01         2.40601E+01         1.00000E+00         2.41709E-02         2.40601E+01         4.04493E+00         2.00151E+01
+          1.25908E-02         1.70063E-02        -1.36835E-02         7.90986E-01         1.28786E+00         7.91104E-01         2.41162E+01         1.00000E+00         2.42359E-02         2.41161E+01         4.07199E+00         2.00442E+01
+          1.25908E-02         1.71761E-02        -1.38659E-02         7.90984E-01         1.29853E+00         7.91105E-01         2.41426E+01         1.00000E+00         2.43013E-02         2.41426E+01         4.09420E+00         2.00484E+01
+          1.25908E-02         1.73459E-02        -1.40501E-02         7.90981E-01         1.30920E+00         7.91106E-01         2.41386E+01         1.00000E+00         2.43668E-02         2.41386E+01         4.11136E+00         2.00272E+01
+          1.25908E-02         1.75158E-02        -1.42361E-02         7.90979E-01         1.31987E+00         7.91107E-01         2.41036E+01         1.00000E+00         2.44323E-02         2.41035E+01         4.12334E+00         1.99802E+01
+          1.25908E-02         1.76856E-02        -1.44239E-02         7.90977E-01         1.33054E+00         7.91108E-01         2.40372E+01         1.00000E+00         2.44975E-02         2.40372E+01         4.13003E+00         1.99072E+01
+          1.25908E-02         1.78554E-02        -1.46136E-02         7.90974E-01         1.34121E+00         7.91109E-01         2.39394E+01         1.00000E+00         2.45622E-02         2.39394E+01         4.13133E+00         1.98081E+01
+          1.25908E-02         1.80252E-02        -1.48050E-02         7.90972E-01         1.35188E+00         7.91111E-01         2.38103E+01         1.00000E+00         2.46263E-02         2.38103E+01         4.12721E+00         1.96831E+01
+          1.25908E-02         1.81951E-02        -1.49983E-02         7.90970E-01         1.36255E+00         7.91112E-01         2.36500E+01         1.00000E+00         2.46895E-02         2.36500E+01         4.11763E+00         1.95324E+01
+          1.25908E-02         1.83649E-02        -1.51934E-02         7.90967E-01         1.37322E+00         7.91113E-01         2.34591E+01         1.00000E+00         2.47517E-02         2.34591E+01         4.10263E+00         1.93565E+01
+          1.25908E-02         1.85347E-02        -1.53902E-02         7.90965E-01         1.38389E+00         7.91114E-01         2.32382E+01         1.00000E+00         2.48126E-02         2.32381E+01         4.08222E+00         1.91559E+01
+          1.25908E-02         1.87045E-02        -1.55889E-02         7.90962E-01         1.39457E+00         7.91116E-01         2.29879E+01         1.00000E+00         2.48720E-02         2.29879E+01         4.05647E+00         1.89314E+01
+          1.25908E-02         1.88744E-02        -1.57895E-02         7.90960E-01         1.40524E+00         7.91117E-01         2.27093E+01         1.00000E+00         2.49299E-02         2.27093E+01         4.02547E+00         1.86839E+01
+          1.25908E-02         1.90442E-02        -1.59918E-02         7.90957E-01         1.41591E+00         7.91119E-01         2.24035E+01         1.00000E+00         2.49860E-02         2.24035E+01         3.98934E+00         1.84141E+01
+          1.25908E-02         1.92140E-02        -1.61959E-02         7.90954E-01         1.42658E+00         7.91120E-01         2.20715E+01         1.00000E+00         2.50402E-02         2.20715E+01         3.94819E+00         1.81233E+01
+          1.25908E-02         1.93839E-02        -1.64019E-02         7.90952E-01         1.43725E+00         7.91122E-01         2.17148E+01         1.00000E+00         2.50923E-02         2.17148E+01         3.90219E+00         1.78126E+01
+          1.25908E-02         1.95537E-02        -1.66096E-02         7.90949E-01         1.44792E+00         7.91124E-01         2.13346E+01         1.00000E+00         2.51422E-02         2.13346E+01         3.85150E+00         1.74831E+01
+          1.25908E-02         1.97235E-02        -1.68192E-02         7.90947E-01         1.45859E+00         7.91125E-01         2.09326E+01         1.00000E+00         2.51897E-02         2.09326E+01         3.79630E+00         1.71363E+01
+          1.25908E-02         1.98933E-02        -1.70306E-02         7.90944E-01         1.46926E+00         7.91127E-01         2.05102E+01         1.00000E+00         2.52346E-02         2.05102E+01         3.73681E+00         1.67734E+01
+          1.25908E-02         2.00632E-02        -1.72438E-02         7.90941E-01         1.47993E+00         7.91129E-01         2.00691E+01         1.00000E+00         2.52769E-02         2.00691E+01         3.67322E+00         1.63959E+01
+          1.25908E-02         2.02330E-02        -1.74588E-02         7.90939E-01         1.49060E+00         7.91131E-01         1.96110E+01         1.00000E+00         2.53165E-02         1.96110E+01         3.60577E+00         1.60053E+01
+          1.25908E-02         2.04028E-02        -1.76757E-02         7.90936E-01         1.50127E+00         7.91133E-01         1.91377E+01         1.00000E+00         2.53531E-02         1.91377E+01         3.53470E+00         1.56030E+01
+          1.25908E-02         2.05726E-02        -1.78943E-02         7.90933E-01         1.51194E+00         7.91135E-01         1.86510E+01         1.00000E+00         2.53867E-02         1.86510E+01         3.46025E+00         1.51907E+01
+          1.25908E-02         2.07425E-02        -1.81148E-02         7.90930E-01         1.52261E+00         7.91138E-01         1.81525E+01         1.00000E+00         2.54172E-02         1.81525E+01         3.38266E+00         1.47699E+01
+          1.25908E-02         2.09123E-02        -1.83370E-02         7.90928E-01         1.53328E+00         7.91140E-01         1.76443E+01         1.00000E+00         2.54445E-02         1.76443E+01         3.30221E+00         1.43421E+01
+          1.25908E-02         2.10821E-02        -1.85611E-02         7.90925E-01         1.54395E+00         7.91142E-01         1.71280E+01         1.00000E+00         2.54685E-02         1.71280E+01         3.21915E+00         1.39089E+01
+          1.25908E-02         2.12520E-02        -1.87870E-02         7.90922E-01         1.55462E+00         7.91145E-01         1.66056E+01         1.00000E+00         2.54890E-02         1.66056E+01         3.13374E+00         1.34719E+01
+          1.25908E-02         2.14218E-02        -1.90147E-02         7.90919E-01         1.56529E+00         7.91148E-01         1.60788E+01         1.00000E+00         2.55061E-02         1.60788E+01         3.04626E+00         1.30325E+01
+          1.25908E-02         2.15916E-02        -1.92443E-02         7.90916E-01         1.57596E+00         7.91150E-01         1.55494E+01         1.00000E+00         2.55196E-02         1.55494E+01         2.95697E+00         1.25924E+01
+          1.25908E-02         2.17614E-02        -1.94756E-02         7.90913E-01         1.58664E+00         7.91153E-01         1.50192E+01         1.00000E+00         2.55295E-02         1.50192E+01         2.86614E+00         1.21530E+01
+          1.25908E-02         2.19313E-02        -1.97087E-02         7.90910E-01         1.59731E+00         7.91156E-01         1.44898E+01         1.00000E+00         2.55356E-02         1.44898E+01         2.77404E+00         1.17158E+01
+          1.25908E-02         2.21011E-02        -1.99437E-02         7.90907E-01         1.60798E+00         7.91159E-01         1.39631E+01         1.00000E+00         2.55380E-02         1.39631E+01         2.68092E+00         1.12822E+01
+          1.25908E-02         2.22709E-02        -2.01805E-02         7.90904E-01         1.61865E+00         7.91162E-01         1.34405E+01         1.00000E+00         2.55366E-02         1.34405E+01         2.58705E+00         1.08535E+01
+          1.25908E-02         2.24407E-02        -2.04191E-02         7.90901E-01         1.62932E+00         7.91165E-01         1.29237E+01         1.00000E+00         2.55313E-02         1.29237E+01         2.49268E+00         1.04310E+01
+          1.25908E-02         2.26106E-02        -2.06595E-02         7.90898E-01         1.63999E+00         7.91168E-01         1.24142E+01         1.00000E+00         2.55221E-02         1.24142E+01         2.39806E+00         1.00161E+01
+          1.25908E-02         2.27804E-02        -2.09017E-02         7.90895E-01         1.65066E+00         7.91171E-01         1.19133E+01         1.00000E+00         2.55088E-02         1.19133E+01         2.30342E+00         9.60992E+00
+          1.25908E-02         2.29502E-02        -2.11457E-02         7.90892E-01         1.66133E+00         7.91175E-01         1.14225E+01         1.00000E+00         2.54916E-02         1.14226E+01         2.20901E+00         9.21355E+00
+          1.25908E-02         2.31201E-02        -2.13916E-02         7.90889E-01         1.67200E+00         7.91178E-01         1.09431E+01         1.00000E+00         2.54704E-02         1.09431E+01         2.11504E+00         8.82808E+00
+          1.25908E-02         2.32899E-02        -2.16392E-02         7.90886E-01         1.68267E+00         7.91182E-01         1.04762E+01         1.00000E+00         2.54451E-02         1.04762E+01         2.02174E+00         8.45447E+00
+          1.25908E-02         2.34597E-02        -2.18887E-02         7.90883E-01         1.69334E+00         7.91186E-01         1.00229E+01         1.00000E+00         2.54157E-02         1.00229E+01         1.92930E+00         8.09364E+00
+          1.25908E-02         2.36295E-02        -2.21400E-02         7.90880E-01         1.70401E+00         7.91189E-01         9.58435E+00         1.00000E+00         2.53823E-02         9.58437E+00         1.83794E+00         7.74643E+00
+          1.25908E-02         2.37994E-02        -2.23931E-02         7.90876E-01         1.71468E+00         7.91193E-01         9.16139E+00         1.00000E+00         2.53447E-02         9.16141E+00         1.74783E+00         7.41358E+00
+          1.25908E-02         2.39692E-02        -2.26480E-02         7.90873E-01         1.72535E+00         7.91197E-01         8.75489E+00         1.00000E+00         2.53029E-02         8.75491E+00         1.65915E+00         7.09576E+00
+          1.25908E-02         2.41390E-02        -2.29047E-02         7.90870E-01         1.73602E+00         7.91202E-01         8.36561E+00         1.00000E+00         2.52571E-02         8.36563E+00         1.57207E+00         6.79356E+00
+          1.25908E-02         2.43088E-02        -2.31633E-02         7.90867E-01         1.74669E+00         7.91206E-01         7.99421E+00         1.00000E+00         2.52071E-02         7.99422E+00         1.48673E+00         6.50749E+00
+          1.25908E-02         2.44787E-02        -2.34236E-02         7.90863E-01         1.75736E+00         7.91210E-01         7.64125E+00         1.00000E+00         2.51530E-02         7.64127E+00         1.40329E+00         6.23798E+00
+          1.25908E-02         2.46485E-02        -2.36858E-02         7.90860E-01         1.76804E+00         7.91215E-01         7.30723E+00         1.00000E+00         2.50947E-02         7.30724E+00         1.32188E+00         5.98536E+00
+          1.25908E-02         2.48183E-02        -2.39498E-02         7.90857E-01         1.77871E+00         7.91219E-01         6.99251E+00         1.00000E+00         2.50323E-02         6.99253E+00         1.24261E+00         5.74991E+00
+          1.25908E-02         2.49882E-02        -2.42155E-02         7.90853E-01         1.78938E+00         7.91224E-01         6.69739E+00         1.00000E+00         2.49659E-02         6.69741E+00         1.16560E+00         5.53181E+00
+          1.25908E-02         2.51580E-02        -2.44832E-02         7.90850E-01         1.80005E+00         7.91229E-01         6.42208E+00         1.00000E+00         2.48953E-02         6.42210E+00         1.09093E+00         5.33116E+00
+          1.25908E-02         2.53278E-02        -2.47526E-02         7.90847E-01         1.81072E+00         7.91234E-01         6.16669E+00         1.00000E+00         2.48207E-02         6.16671E+00         1.01870E+00         5.14801E+00
+          1.25908E-02         2.54976E-02        -2.50238E-02         7.90843E-01         1.82139E+00         7.91239E-01         5.93125E+00         1.00000E+00         2.47420E-02         5.93127E+00         9.48977E-01         4.98229E+00
+          1.25908E-02         2.56675E-02        -2.52969E-02         7.90840E-01         1.83206E+00         7.91244E-01         5.71571E+00         1.00000E+00         2.46593E-02         5.71573E+00         8.81825E-01         4.83390E+00
+          1.25908E-02         2.58373E-02        -2.55717E-02         7.90836E-01         1.84273E+00         7.91250E-01         5.51994E+00         1.00000E+00         2.45726E-02         5.51996E+00         8.17294E-01         4.70267E+00
+          1.25908E-02         2.60071E-02        -2.58484E-02         7.90833E-01         1.85340E+00         7.91255E-01         5.34373E+00         1.00000E+00         2.44820E-02         5.34375E+00         7.55427E-01         4.58833E+00
+          1.25908E-02         2.61769E-02        -2.61269E-02         7.90829E-01         1.86407E+00         7.91261E-01         5.18681E+00         1.00000E+00         2.43874E-02         5.18682E+00         6.96254E-01         4.49057E+00
+          1.27606E-02         8.72665E-04        -4.75687E-03         8.01771E-01         2.74155E-01         8.01785E-01         4.06890E+02         1.00000E+00         3.51934E-02         4.06890E+02         7.29043E+01         3.33985E+02
+          1.27606E-02         1.04249E-03        -4.76709E-03         8.01771E-01         2.84826E-01         8.01785E-01         3.98630E+02         1.00000E+00         3.48514E-02         3.98630E+02         7.14056E+01         3.27225E+02
+          1.27606E-02         1.21232E-03        -4.77912E-03         8.01770E-01         2.95496E-01         8.01785E-01         3.90211E+02         1.00000E+00         3.45026E-02         3.90211E+02         6.98775E+01         3.20334E+02
+          1.27606E-02         1.38215E-03        -4.79296E-03         8.01770E-01         3.06167E-01         8.01785E-01         3.81646E+02         1.00000E+00         3.41477E-02         3.81646E+02         6.83226E+01         3.13324E+02
+          1.27606E-02         1.55197E-03        -4.80861E-03         8.01770E-01         3.16838E-01         8.01785E-01         3.72951E+02         1.00000E+00         3.37872E-02         3.72951E+02         6.67437E+01         3.06207E+02
+          1.27606E-02         1.72180E-03        -4.82608E-03         8.01770E-01         3.27508E-01         8.01784E-01         3.64140E+02         1.00000E+00         3.34219E-02         3.64140E+02         6.51434E+01         2.98997E+02
+          1.27606E-02         1.89163E-03        -4.84535E-03         8.01770E-01         3.38179E-01         8.01784E-01         3.55229E+02         1.00000E+00         3.30523E-02         3.55230E+02         6.35245E+01         2.91705E+02
+          1.27606E-02         2.06146E-03        -4.86644E-03         8.01769E-01         3.48849E-01         8.01784E-01         3.46233E+02         1.00000E+00         3.26790E-02         3.46233E+02         6.18897E+01         2.84344E+02
+          1.27606E-02         2.23128E-03        -4.88934E-03         8.01769E-01         3.59520E-01         8.01784E-01         3.37167E+02         1.00000E+00         3.23027E-02         3.37167E+02         6.02417E+01         2.76925E+02
+          1.27606E-02         2.40111E-03        -4.91406E-03         8.01769E-01         3.70190E-01         8.01784E-01         3.28045E+02         1.00000E+00         3.19239E-02         3.28045E+02         5.85833E+01         2.69462E+02
+          1.27606E-02         2.57094E-03        -4.94058E-03         8.01768E-01         3.80861E-01         8.01784E-01         3.18883E+02         1.00000E+00         3.15433E-02         3.18883E+02         5.69170E+01         2.61966E+02
+          1.27606E-02         2.74077E-03        -4.96892E-03         8.01768E-01         3.91532E-01         8.01783E-01         3.09695E+02         1.00000E+00         3.11615E-02         3.09695E+02         5.52456E+01         2.54449E+02
+          1.27606E-02         2.91059E-03        -4.99907E-03         8.01768E-01         4.02202E-01         8.01783E-01         3.00496E+02         1.00000E+00         3.07790E-02         3.00496E+02         5.35717E+01         2.46924E+02
+          1.27606E-02         3.08042E-03        -5.03103E-03         8.01767E-01         4.12873E-01         8.01783E-01         2.91299E+02         1.00000E+00         3.03964E-02         2.91299E+02         5.18979E+01         2.39401E+02
+          1.27606E-02         3.25025E-03        -5.06480E-03         8.01767E-01         4.23543E-01         8.01783E-01         2.82119E+02         1.00000E+00         3.00144E-02         2.82120E+02         5.02267E+01         2.31893E+02
+          1.27606E-02         3.42008E-03        -5.10039E-03         8.01766E-01         4.34214E-01         8.01783E-01         2.72971E+02         1.00000E+00         2.96334E-02         2.72971E+02         4.85606E+01         2.24410E+02
+          1.27606E-02         3.58990E-03        -5.13779E-03         8.01766E-01         4.44884E-01         8.01782E-01         2.63866E+02         1.00000E+00         2.92540E-02         2.63866E+02         4.69022E+01         2.16964E+02
+          1.27606E-02         3.75973E-03        -5.17700E-03         8.01765E-01         4.55555E-01         8.01782E-01         2.54818E+02         1.00000E+00         2.88768E-02         2.54818E+02         4.52537E+01         2.09565E+02
+          1.27606E-02         3.92956E-03        -5.21802E-03         8.01765E-01         4.66225E-01         8.01782E-01         2.45841E+02         1.00000E+00         2.85022E-02         2.45841E+02         4.36175E+01         2.02223E+02
+          1.27606E-02         4.09939E-03        -5.26085E-03         8.01764E-01         4.76896E-01         8.01782E-01         2.36945E+02         1.00000E+00         2.81308E-02         2.36945E+02         4.19959E+01         1.94949E+02
+          1.27606E-02         4.26921E-03        -5.30550E-03         8.01764E-01         4.87567E-01         8.01781E-01         2.28144E+02         1.00000E+00         2.77631E-02         2.28144E+02         4.03911E+01         1.87753E+02
+          1.27606E-02         4.43904E-03        -5.35195E-03         8.01763E-01         4.98237E-01         8.01781E-01         2.19448E+02         1.00000E+00         2.73994E-02         2.19448E+02         3.88050E+01         1.80643E+02
+          1.27606E-02         4.60887E-03        -5.40022E-03         8.01763E-01         5.08908E-01         8.01781E-01         2.10869E+02         1.00000E+00         2.70403E-02         2.10869E+02         3.72399E+01         1.73629E+02
+          1.27606E-02         4.77869E-03        -5.45031E-03         8.01762E-01         5.19578E-01         8.01780E-01         2.02417E+02         1.00000E+00         2.66862E-02         2.02417E+02         3.56976E+01         1.66719E+02
+          1.27606E-02         4.94852E-03        -5.50220E-03         8.01761E-01         5.30249E-01         8.01780E-01         1.94102E+02         1.00000E+00         2.63374E-02         1.94102E+02         3.41799E+01         1.59922E+02
+          1.27606E-02         5.11835E-03        -5.55591E-03         8.01761E-01         5.40919E-01         8.01780E-01         1.85934E+02         1.00000E+00         2.59944E-02         1.85934E+02         3.26887E+01         1.53245E+02
+          1.27606E-02         5.28818E-03        -5.61142E-03         8.01760E-01         5.51590E-01         8.01780E-01         1.77921E+02         1.00000E+00         2.56575E-02         1.77921E+02         3.12256E+01         1.46695E+02
+          1.27606E-02         5.45800E-03        -5.66875E-03         8.01759E-01         5.62261E-01         8.01779E-01         1.70072E+02         1.00000E+00         2.53270E-02         1.70072E+02         2.97921E+01         1.40280E+02
+          1.27606E-02         5.62783E-03        -5.72790E-03         8.01758E-01         5.72931E-01         8.01779E-01         1.62395E+02         1.00000E+00         2.50033E-02         1.62395E+02         2.83897E+01         1.34005E+02
+          1.27606E-02         5.79766E-03        -5.78885E-03         8.01758E-01         5.83602E-01         8.01779E-01         1.54897E+02         1.00000E+00         2.46866E-02         1.54897E+02         2.70199E+01         1.27877E+02
+          1.27606E-02         5.96749E-03        -5.85162E-03         8.01757E-01         5.94272E-01         8.01778E-01         1.47585E+02         1.00000E+00         2.43772E-02         1.47585E+02         2.56838E+01         1.21901E+02
+          1.27606E-02         6.13731E-03        -5.91620E-03         8.01756E-01         6.04943E-01         8.01778E-01         1.40465E+02         1.00000E+00         2.40753E-02         1.40465E+02         2.43826E+01         1.16082E+02
+          1.27606E-02         6.30714E-03        -5.98259E-03         8.01755E-01         6.15613E-01         8.01777E-01         1.33542E+02         1.00000E+00         2.37812E-02         1.33542E+02         2.31173E+01         1.10424E+02
+          1.27606E-02         6.47697E-03        -6.05079E-03         8.01754E-01         6.26284E-01         8.01777E-01         1.26821E+02         1.00000E+00         2.34951E-02         1.26821E+02         2.18890E+01         1.04932E+02
+          1.27606E-02         6.64680E-03        -6.12080E-03         8.01753E-01         6.36955E-01         8.01777E-01         1.20308E+02         1.00000E+00         2.32171E-02         1.20308E+02         2.06985E+01         9.96094E+01
+          1.27606E-02         6.81662E-03        -6.19263E-03         8.01752E-01         6.47625E-01         8.01776E-01         1.14005E+02         1.00000E+00         2.29473E-02         1.14005E+02         1.95464E+01         9.44585E+01
+          1.27606E-02         6.98645E-03        -6.26627E-03         8.01752E-01         6.58296E-01         8.01776E-01         1.07916E+02         1.00000E+00         2.26860E-02         1.07916E+02         1.84335E+01         8.94822E+01
+          1.27606E-02         7.15628E-03        -6.34172E-03         8.01751E-01         6.68966E-01         8.01776E-01         1.02043E+02         1.00000E+00         2.24332E-02         1.02043E+02         1.73603E+01         8.46827E+01
+          1.27606E-02         7.32611E-03        -6.41898E-03         8.01750E-01         6.79637E-01         8.01775E-01         9.63886E+01         1.00000E+00         2.21889E-02         9.63886E+01         1.63271E+01         8.00615E+01
+          1.27606E-02         7.49593E-03        -6.49806E-03         8.01749E-01         6.90307E-01         8.01775E-01         9.09543E+01         1.00000E+00         2.19533E-02         9.09543E+01         1.53343E+01         7.56199E+01
+          1.27606E-02         7.66576E-03        -6.57895E-03         8.01748E-01         7.00978E-01         8.01775E-01         8.57408E+01         1.00000E+00         2.17264E-02         8.57408E+01         1.43822E+01         7.13586E+01
+          1.27606E-02         7.83559E-03        -6.66165E-03         8.01746E-01         7.11649E-01         8.01774E-01         8.07486E+01         1.00000E+00         2.15082E-02         8.07486E+01         1.34708E+01         6.72779E+01
+          1.27606E-02         8.00542E-03        -6.74616E-03         8.01745E-01         7.22319E-01         8.01774E-01         7.59776E+01         1.00000E+00         2.12987E-02         7.59776E+01         1.26002E+01         6.33775E+01
+          1.27606E-02         8.17524E-03        -6.83248E-03         8.01744E-01         7.32990E-01         8.01773E-01         7.14271E+01         1.00000E+00         2.10980E-02         7.14271E+01         1.17702E+01         5.96569E+01
+          1.27606E-02         8.34507E-03        -6.92062E-03         8.01743E-01         7.43660E-01         8.01773E-01         6.70959E+01         1.00000E+00         2.09059E-02         6.70959E+01         1.09808E+01         5.61151E+01
+          1.27606E-02         8.51490E-03        -7.01057E-03         8.01742E-01         7.54331E-01         8.01773E-01         6.29824E+01         1.00000E+00         2.07225E-02         6.29824E+01         1.02317E+01         5.27507E+01
+          1.27606E-02         8.68473E-03        -7.10233E-03         8.01741E-01         7.65001E-01         8.01772E-01         5.90845E+01         1.00000E+00         2.05478E-02         5.90845E+01         9.52250E+00         4.95620E+01
+          1.27606E-02         8.85455E-03        -7.19590E-03         8.01740E-01         7.75672E-01         8.01772E-01         5.53996E+01         1.00000E+00         2.03815E-02         5.53996E+01         8.85283E+00         4.65468E+01
+          1.27606E-02         9.02438E-03        -7.29129E-03         8.01738E-01         7.86343E-01         8.01772E-01         5.19248E+01         1.00000E+00         2.02238E-02         5.19248E+01         8.22218E+00         4.37026E+01
+          1.27606E-02         9.19421E-03        -7.38848E-03         8.01737E-01         7.97013E-01         8.01771E-01         4.86566E+01         1.00000E+00         2.00744E-02         4.86566E+01         7.62995E+00         4.10266E+01
+          1.27606E-02         9.36403E-03        -7.48749E-03         8.01736E-01         8.07684E-01         8.01771E-01         4.55912E+01         1.00000E+00         1.99333E-02         4.55912E+01         7.07550E+00         3.85157E+01
+          1.27606E-02         9.53386E-03        -7.58832E-03         8.01735E-01         8.18354E-01         8.01771E-01         4.27244E+01         1.00000E+00         1.98004E-02         4.27244E+01         6.55810E+00         3.61663E+01
+          1.27606E-02         9.70369E-03        -7.69095E-03         8.01733E-01         8.29025E-01         8.01770E-01         4.00519E+01         1.00000E+00         1.96755E-02         4.00519E+01         6.07696E+00         3.39749E+01
+          1.27606E-02         9.87352E-03        -7.79540E-03         8.01732E-01         8.39695E-01         8.01770E-01         3.75686E+01         1.00000E+00         1.95586E-02         3.75686E+01         5.63124E+00         3.19374E+01
+          1.27606E-02         1.00433E-02        -7.90166E-03         8.01731E-01         8.50366E-01         8.01770E-01         3.52696E+01         1.00000E+00         1.94494E-02         3.52696E+01         5.22003E+00         3.00495E+01
+          1.27606E-02         1.02132E-02        -8.00973E-03         8.01729E-01         8.61037E-01         8.01769E-01         3.31493E+01         1.00000E+00         1.93480E-02         3.31493E+01         4.84236E+00         2.83069E+01
+          1.27606E-02         1.03830E-02        -8.11961E-03         8.01728E-01         8.71707E-01         8.01769E-01         3.12021E+01         1.00000E+00         1.92540E-02         3.12021E+01         4.49722E+00         2.67049E+01
+          1.27606E-02         1.05528E-02        -8.23131E-03         8.01726E-01         8.82378E-01         8.01769E-01         2.94222E+01         1.00000E+00         1.91675E-02         2.94222E+01         4.18357E+00         2.52386E+01
+          1.27606E-02         1.07227E-02        -8.34481E-03         8.01725E-01         8.93048E-01         8.01768E-01         2.78034E+01         1.00000E+00         1.90882E-02         2.78034E+01         3.90031E+00         2.39031E+01
+          1.27606E-02         1.08925E-02        -8.46013E-03         8.01724E-01         9.03719E-01         8.01768E-01         2.63395E+01         1.00000E+00         1.90160E-02         2.63395E+01         3.64631E+00         2.26932E+01
+          1.27606E-02         1.10623E-02        -8.57727E-03         8.01722E-01         9.14389E-01         8.01768E-01         2.50240E+01         1.00000E+00         1.89506E-02         2.50240E+01         3.42040E+00         2.16036E+01
+          1.27606E-02         1.12321E-02        -8.69621E-03         8.01721E-01         9.25060E-01         8.01768E-01         2.38503E+01         1.00000E+00         1.88921E-02         2.38503E+01         3.22140E+00         2.06289E+01
+          1.27606E-02         1.14020E-02        -8.81697E-03         8.01719E-01         9.35731E-01         8.01767E-01         2.28119E+01         1.00000E+00         1.88401E-02         2.28119E+01         3.04809E+00         1.97638E+01
+          1.27606E-02         1.15718E-02        -8.93954E-03         8.01717E-01         9.46401E-01         8.01767E-01         2.19019E+01         1.00000E+00         1.87946E-02         2.19019E+01         2.89925E+00         1.90026E+01
+          1.27606E-02         1.17416E-02        -9.06392E-03         8.01716E-01         9.57072E-01         8.01767E-01         2.11135E+01         1.00000E+00         1.87553E-02         2.11135E+01         2.77363E+00         1.83399E+01
+          1.27606E-02         1.19114E-02        -9.19012E-03         8.01714E-01         9.67742E-01         8.01767E-01         2.04399E+01         1.00000E+00         1.87221E-02         2.04399E+01         2.66998E+00         1.77699E+01
+          1.27606E-02         1.20813E-02        -9.31812E-03         8.01713E-01         9.78413E-01         8.01767E-01         1.98742E+01         1.00000E+00         1.86948E-02         1.98742E+01         2.58703E+00         1.72871E+01
+          1.27606E-02         1.22511E-02        -9.44794E-03         8.01711E-01         9.89083E-01         8.01767E-01         1.94095E+01         1.00000E+00         1.86732E-02         1.94095E+01         2.52353E+00         1.68859E+01
+          1.27606E-02         1.24209E-02        -9.57957E-03         8.01709E-01         9.99754E-01         8.01766E-01         1.90390E+01         1.00000E+00         1.86571E-02         1.90390E+01         2.47820E+00         1.65608E+01
+          1.27606E-02         1.25908E-02        -9.71302E-03         8.01708E-01         1.01042E+00         8.01766E-01         1.87559E+01         1.00000E+00         1.86465E-02         1.87559E+01         2.44980E+00         1.63061E+01
+          1.27606E-02         1.27606E-02        -9.84827E-03         8.01706E-01         1.02110E+00         8.01766E-01         1.85535E+01         1.00000E+00         1.86410E-02         1.85535E+01         2.43707E+00         1.61164E+01
+          1.27606E-02         1.29304E-02        -9.98534E-03         8.01704E-01         1.03177E+00         8.01766E-01         1.84251E+01         1.00000E+00         1.86405E-02         1.84251E+01         2.43878E+00         1.59863E+01
+          1.27606E-02         1.31002E-02        -1.01242E-02         8.01702E-01         1.04244E+00         8.01766E-01         1.83642E+01         1.00000E+00         1.86448E-02         1.83642E+01         2.45371E+00         1.59105E+01
+          1.27606E-02         1.32701E-02        -1.02649E-02         8.01700E-01         1.05311E+00         8.01766E-01         1.83644E+01         1.00000E+00         1.86538E-02         1.83644E+01         2.48066E+00         1.58837E+01
+          1.27606E-02         1.34399E-02        -1.04074E-02         8.01699E-01         1.06378E+00         8.01766E-01         1.84194E+01         1.00000E+00         1.86672E-02         1.84194E+01         2.51846E+00         1.59009E+01
+          1.27606E-02         1.36097E-02        -1.05517E-02         8.01697E-01         1.07445E+00         8.01766E-01         1.85231E+01         1.00000E+00         1.86849E-02         1.85230E+01         2.56593E+00         1.59571E+01
+          1.27606E-02         1.37795E-02        -1.06979E-02         8.01695E-01         1.08512E+00         8.01766E-01         1.86694E+01         1.00000E+00         1.87066E-02         1.86694E+01         2.62197E+00         1.60475E+01
+          1.27606E-02         1.39494E-02        -1.08458E-02         8.01693E-01         1.09579E+00         8.01766E-01         1.88528E+01         1.00000E+00         1.87321E-02         1.88527E+01         2.68547E+00         1.61673E+01
+          1.27606E-02         1.41192E-02        -1.09956E-02         8.01691E-01         1.10646E+00         8.01767E-01         1.90674E+01         1.00000E+00         1.87614E-02         1.90674E+01         2.75538E+00         1.63120E+01
+          1.27606E-02         1.42890E-02        -1.11471E-02         8.01689E-01         1.11713E+00         8.01767E-01         1.93080E+01         1.00000E+00         1.87941E-02         1.93080E+01         2.83065E+00         1.64774E+01
+          1.27606E-02         1.44589E-02        -1.13005E-02         8.01687E-01         1.12780E+00         8.01767E-01         1.95694E+01         1.00000E+00         1.88301E-02         1.95694E+01         2.91030E+00         1.66591E+01
+          1.27606E-02         1.46287E-02        -1.14557E-02         8.01685E-01         1.13847E+00         8.01767E-01         1.98466E+01         1.00000E+00         1.88692E-02         1.98466E+01         2.99336E+00         1.68532E+01
+          1.27606E-02         1.47985E-02        -1.16127E-02         8.01683E-01         1.14914E+00         8.01767E-01         2.01349E+01         1.00000E+00         1.89113E-02         2.01349E+01         3.07894E+00         1.70560E+01
+          1.27606E-02         1.49683E-02        -1.17715E-02         8.01681E-01         1.15981E+00         8.01768E-01         2.04298E+01         1.00000E+00         1.89560E-02         2.04298E+01         3.16615E+00         1.72637E+01
+          1.27606E-02         1.51382E-02        -1.19322E-02         8.01679E-01         1.17048E+00         8.01768E-01         2.07272E+01         1.00000E+00         1.90032E-02         2.07271E+01         3.25415E+00         1.74730E+01
+          1.27606E-02         1.53080E-02        -1.20946E-02         8.01677E-01         1.18115E+00         8.01768E-01         2.10229E+01         1.00000E+00         1.90528E-02         2.10228E+01         3.34217E+00         1.76807E+01
+          1.27606E-02         1.54778E-02        -1.22589E-02         8.01675E-01         1.19182E+00         8.01769E-01         2.13132E+01         1.00000E+00         1.91045E-02         2.13132E+01         3.42946E+00         1.78837E+01
+          1.27606E-02         1.56476E-02        -1.24249E-02         8.01673E-01         1.20249E+00         8.01769E-01         2.15947E+01         1.00000E+00         1.91581E-02         2.15947E+01         3.51532E+00         1.80794E+01
+          1.27606E-02         1.58175E-02        -1.25928E-02         8.01671E-01         1.21317E+00         8.01770E-01         2.18641E+01         1.00000E+00         1.92134E-02         2.18641E+01         3.59909E+00         1.82650E+01
+          1.27606E-02         1.59873E-02        -1.27625E-02         8.01669E-01         1.22384E+00         8.01770E-01         2.21185E+01         1.00000E+00         1.92704E-02         2.21185E+01         3.68017E+00         1.84383E+01
+          1.27606E-02         1.61571E-02        -1.29340E-02         8.01666E-01         1.23451E+00         8.01771E-01         2.23551E+01         1.00000E+00         1.93287E-02         2.23551E+01         3.75800E+00         1.85971E+01
+          1.27606E-02         1.63270E-02        -1.31074E-02         8.01664E-01         1.24518E+00         8.01771E-01         2.25715E+01         1.00000E+00         1.93881E-02         2.25715E+01         3.83206E+00         1.87394E+01
+          1.27606E-02         1.64968E-02        -1.32825E-02         8.01662E-01         1.25585E+00         8.01772E-01         2.27655E+01         1.00000E+00         1.94486E-02         2.27655E+01         3.90187E+00         1.88636E+01
+          1.27606E-02         1.66666E-02        -1.34594E-02         8.01660E-01         1.26652E+00         8.01773E-01         2.29351E+01         1.00000E+00         1.95099E-02         2.29350E+01         3.96702E+00         1.89680E+01
+          1.27606E-02         1.68364E-02        -1.36382E-02         8.01657E-01         1.27719E+00         8.01773E-01         2.30786E+01         1.00000E+00         1.95718E-02         2.30785E+01         4.02713E+00         1.90514E+01
+          1.27606E-02         1.70063E-02        -1.38188E-02         8.01655E-01         1.28786E+00         8.01774E-01         2.31945E+01         1.00000E+00         1.96342E-02         2.31945E+01         4.08185E+00         1.91127E+01
+          1.27606E-02         1.71761E-02        -1.40011E-02         8.01653E-01         1.29853E+00         8.01775E-01         2.32817E+01         1.00000E+00         1.96969E-02         2.32817E+01         4.13089E+00         1.91508E+01
+          1.27606E-02         1.73459E-02        -1.41853E-02         8.01650E-01         1.30920E+00         8.01776E-01         2.33391E+01         1.00000E+00         1.97597E-02         2.33391E+01         4.17401E+00         1.91651E+01
+          1.27606E-02         1.75158E-02        -1.43714E-02         8.01648E-01         1.31987E+00         8.01777E-01         2.33660E+01         1.00000E+00         1.98225E-02         2.33660E+01         4.21099E+00         1.91550E+01
+          1.27606E-02         1.76856E-02        -1.45592E-02         8.01646E-01         1.33054E+00         8.01778E-01         2.33618E+01         1.00000E+00         1.98850E-02         2.33617E+01         4.24167E+00         1.91201E+01
+          1.27606E-02         1.78554E-02        -1.47488E-02         8.01643E-01         1.34121E+00         8.01779E-01         2.33261E+01         1.00000E+00         1.99472E-02         2.33261E+01         4.26592E+00         1.90602E+01
+          1.27606E-02         1.80252E-02        -1.49403E-02         8.01641E-01         1.35188E+00         8.01780E-01         2.32589E+01         1.00000E+00         2.00088E-02         2.32589E+01         4.28364E+00         1.89753E+01
+          1.27606E-02         1.81951E-02        -1.51335E-02         8.01638E-01         1.36255E+00         8.01781E-01         2.31602E+01         1.00000E+00         2.00698E-02         2.31602E+01         4.29478E+00         1.88654E+01
+          1.27606E-02         1.83649E-02        -1.53286E-02         8.01636E-01         1.37322E+00         8.01782E-01         2.30303E+01         1.00000E+00         2.01300E-02         2.30303E+01         4.29932E+00         1.87309E+01
+          1.27606E-02         1.85347E-02        -1.55255E-02         8.01633E-01         1.38389E+00         8.01784E-01         2.28695E+01         1.00000E+00         2.01891E-02         2.28695E+01         4.29726E+00         1.85722E+01
+          1.27606E-02         1.87045E-02        -1.57242E-02         8.01631E-01         1.39457E+00         8.01785E-01         2.26784E+01         1.00000E+00         2.02472E-02         2.26784E+01         4.28867E+00         1.83897E+01
+          1.27606E-02         1.88744E-02        -1.59247E-02         8.01628E-01         1.40524E+00         8.01786E-01         2.24578E+01         1.00000E+00         2.03040E-02         2.24578E+01         4.27360E+00         1.81842E+01
+          1.27606E-02         1.90442E-02        -1.61270E-02         8.01626E-01         1.41591E+00         8.01788E-01         2.22085E+01         1.00000E+00         2.03594E-02         2.22085E+01         4.25216E+00         1.79564E+01
+          1.27606E-02         1.92140E-02        -1.63312E-02         8.01623E-01         1.42658E+00         8.01789E-01         2.19317E+01         1.00000E+00         2.04133E-02         2.19316E+01         4.22448E+00         1.77072E+01
+          1.27606E-02         1.93839E-02        -1.65371E-02         8.01620E-01         1.43725E+00         8.01791E-01         2.16283E+01         1.00000E+00         2.04656E-02         2.16283E+01         4.19072E+00         1.74375E+01
+          1.27606E-02         1.95537E-02        -1.67449E-02         8.01618E-01         1.44792E+00         8.01793E-01         2.12996E+01         1.00000E+00         2.05162E-02         2.12996E+01         4.15104E+00         1.71486E+01
+          1.27606E-02         1.97235E-02        -1.69545E-02         8.01615E-01         1.45859E+00         8.01794E-01         2.09471E+01         1.00000E+00         2.05649E-02         2.09471E+01         4.10566E+00         1.68414E+01
+          1.27606E-02         1.98933E-02        -1.71659E-02         8.01612E-01         1.46926E+00         8.01796E-01         2.05720E+01         1.00000E+00         2.06116E-02         2.05720E+01         4.05477E+00         1.65173E+01
+          1.27606E-02         2.00632E-02        -1.73791E-02         8.01610E-01         1.47993E+00         8.01798E-01         2.01761E+01         1.00000E+00         2.06562E-02         2.01761E+01         3.99862E+00         1.61774E+01
+          1.27606E-02         2.02330E-02        -1.75941E-02         8.01607E-01         1.49060E+00         8.01800E-01         1.97607E+01         1.00000E+00         2.06987E-02         1.97607E+01         3.93746E+00         1.58233E+01
+          1.27606E-02         2.04028E-02        -1.78109E-02         8.01604E-01         1.50127E+00         8.01802E-01         1.93277E+01         1.00000E+00         2.07389E-02         1.93277E+01         3.87155E+00         1.54561E+01
+          1.27606E-02         2.05726E-02        -1.80296E-02         8.01601E-01         1.51194E+00         8.01804E-01         1.88786E+01         1.00000E+00         2.07768E-02         1.88786E+01         3.80116E+00         1.50774E+01
+          1.27606E-02         2.07425E-02        -1.82500E-02         8.01599E-01         1.52261E+00         8.01806E-01         1.84152E+01         1.00000E+00         2.08122E-02         1.84152E+01         3.72658E+00         1.46886E+01
+          1.27606E-02         2.09123E-02        -1.84723E-02         8.01596E-01         1.53328E+00         8.01809E-01         1.79393E+01         1.00000E+00         2.08452E-02         1.79393E+01         3.64810E+00         1.42912E+01
+          1.27606E-02         2.10821E-02        -1.86964E-02         8.01593E-01         1.54395E+00         8.01811E-01         1.74526E+01         1.00000E+00         2.08755E-02         1.74526E+01         3.56603E+00         1.38866E+01
+          1.27606E-02         2.12520E-02        -1.89223E-02         8.01590E-01         1.55462E+00         8.01813E-01         1.69569E+01         1.00000E+00         2.09031E-02         1.69569E+01         3.48066E+00         1.34762E+01
+          1.27606E-02         2.14218E-02        -1.91500E-02         8.01587E-01         1.56529E+00         8.01816E-01         1.64540E+01         1.00000E+00         2.09280E-02         1.64540E+01         3.39232E+00         1.30617E+01
+          1.27606E-02         2.15916E-02        -1.93795E-02         8.01584E-01         1.57596E+00         8.01818E-01         1.59457E+01         1.00000E+00         2.09502E-02         1.59457E+01         3.30130E+00         1.26444E+01
+          1.27606E-02         2.17614E-02        -1.96108E-02         8.01581E-01         1.58664E+00         8.01821E-01         1.54337E+01         1.00000E+00         2.09694E-02         1.54337E+01         3.20793E+00         1.22258E+01
+          1.27606E-02         2.19313E-02        -1.98440E-02         8.01578E-01         1.59731E+00         8.01824E-01         1.49197E+01         1.00000E+00         2.09858E-02         1.49198E+01         3.11251E+00         1.18072E+01
+          1.27606E-02         2.21011E-02        -2.00789E-02         8.01575E-01         1.60798E+00         8.01827E-01         1.44055E+01         1.00000E+00         2.09991E-02         1.44055E+01         3.01536E+00         1.13902E+01
+          1.27606E-02         2.22709E-02        -2.03157E-02         8.01572E-01         1.61865E+00         8.01830E-01         1.38927E+01         1.00000E+00         2.10095E-02         1.38927E+01         2.91677E+00         1.09759E+01
+          1.27606E-02         2.24407E-02        -2.05543E-02         8.01569E-01         1.62932E+00         8.01833E-01         1.33829E+01         1.00000E+00         2.10168E-02         1.33829E+01         2.81706E+00         1.05658E+01
+          1.27606E-02         2.26106E-02        -2.07947E-02         8.01566E-01         1.63999E+00         8.01836E-01         1.28776E+01         1.00000E+00         2.10210E-02         1.28776E+01         2.71651E+00         1.01611E+01
+          1.27606E-02         2.27804E-02        -2.10369E-02         8.01563E-01         1.65066E+00         8.01839E-01         1.23784E+01         1.00000E+00         2.10221E-02         1.23784E+01         2.61542E+00         9.76296E+00
+          1.27606E-02         2.29502E-02        -2.12810E-02         8.01560E-01         1.66133E+00         8.01842E-01         1.18866E+01         1.00000E+00         2.10200E-02         1.18866E+01         2.51407E+00         9.37255E+00
+          1.27606E-02         2.31201E-02        -2.15268E-02         8.01557E-01         1.67200E+00         8.01846E-01         1.14037E+01         1.00000E+00         2.10147E-02         1.14037E+01         2.41273E+00         8.99096E+00
+          1.27606E-02         2.32899E-02        -2.17745E-02         8.01554E-01         1.68267E+00         8.01849E-01         1.09309E+01         1.00000E+00         2.10062E-02         1.09309E+01         2.31166E+00         8.61921E+00
+          1.27606E-02         2.34597E-02        -2.20239E-02         8.01550E-01         1.69334E+00         8.01853E-01         1.04694E+01         1.00000E+00         2.09945E-02         1.04694E+01         2.21112E+00         8.25825E+00
+          1.27606E-02         2.36295E-02        -2.22752E-02         8.01547E-01         1.70401E+00         8.01857E-01         1.00203E+01         1.00000E+00         2.09795E-02         1.00203E+01         2.11135E+00         7.90897E+00
+          1.27606E-02         2.37994E-02        -2.25283E-02         8.01544E-01         1.71468E+00         8.01861E-01         9.58476E+00         1.00000E+00         2.09612E-02         9.58478E+00         2.01258E+00         7.57219E+00
+          1.27606E-02         2.39692E-02        -2.27832E-02         8.01541E-01         1.72535E+00         8.01864E-01         9.16368E+00         1.00000E+00         2.09396E-02         9.16369E+00         1.91504E+00         7.24865E+00
+          1.27606E-02         2.41390E-02        -2.30399E-02         8.01537E-01         1.73602E+00         8.01869E-01         8.75792E+00         1.00000E+00         2.09147E-02         8.75793E+00         1.81893E+00         6.93901E+00
+          1.27606E-02         2.43088E-02        -2.32985E-02         8.01534E-01         1.74669E+00         8.01873E-01         8.36829E+00         1.00000E+00         2.08865E-02         8.36830E+00         1.72444E+00         6.64386E+00
+          1.27606E-02         2.44787E-02        -2.35588E-02         8.01531E-01         1.75736E+00         8.01877E-01         7.99547E+00         1.00000E+00         2.08550E-02         7.99548E+00         1.63176E+00         6.36372E+00
+          1.27606E-02         2.46485E-02        -2.38210E-02         8.01527E-01         1.76804E+00         8.01881E-01         7.64007E+00         1.00000E+00         2.08202E-02         7.64008E+00         1.54106E+00         6.09903E+00
+          1.27606E-02         2.48183E-02        -2.40850E-02         8.01524E-01         1.77871E+00         8.01886E-01         7.30261E+00         1.00000E+00         2.07820E-02         7.30263E+00         1.45248E+00         5.85014E+00
+          1.27606E-02         2.49882E-02        -2.43508E-02         8.01521E-01         1.78938E+00         8.01891E-01         6.98353E+00         1.00000E+00         2.07406E-02         6.98354E+00         1.36619E+00         5.61735E+00
+          1.27606E-02         2.51580E-02        -2.46184E-02         8.01517E-01         1.80005E+00         8.01895E-01         6.68315E+00         1.00000E+00         2.06958E-02         6.68317E+00         1.28229E+00         5.40087E+00
+          1.27606E-02         2.53278E-02        -2.48878E-02         8.01514E-01         1.81072E+00         8.01900E-01         6.40175E+00         1.00000E+00         2.06478E-02         6.40176E+00         1.20092E+00         5.20084E+00
+          1.27606E-02         2.54976E-02        -2.51590E-02         8.01510E-01         1.82139E+00         8.01905E-01         6.13947E+00         1.00000E+00         2.05964E-02         6.13949E+00         1.12216E+00         5.01732E+00
+          1.27606E-02         2.56675E-02        -2.54321E-02         8.01507E-01         1.83206E+00         8.01910E-01         5.89642E+00         1.00000E+00         2.05418E-02         5.89644E+00         1.04612E+00         4.85031E+00
+          1.27606E-02         2.58373E-02        -2.57069E-02         8.01503E-01         1.84273E+00         8.01916E-01         5.67260E+00         1.00000E+00         2.04840E-02         5.67261E+00         9.72866E-01         4.69975E+00
+          1.27606E-02         2.60071E-02        -2.59836E-02         8.01500E-01         1.85340E+00         8.01921E-01         5.46793E+00         1.00000E+00         2.04229E-02         5.46795E+00         9.02463E-01         4.56548E+00
+          1.27606E-02         2.61769E-02        -2.62621E-02         8.01496E-01         1.86407E+00         8.01926E-01         5.28227E+00         1.00000E+00         2.03586E-02         5.28229E+00         8.34962E-01         4.44733E+00
+          1.29304E-02         8.72665E-04        -4.89395E-03         8.12441E-01         2.74155E-01         8.12456E-01         3.99968E+02         1.00000E+00         2.68923E-02         3.99968E+02         8.23501E+01         3.17618E+02
+          1.29304E-02         1.04249E-03        -4.90417E-03         8.12441E-01         2.84826E-01         8.12456E-01         3.91925E+02         1.00000E+00         2.66367E-02         3.91926E+02         8.06569E+01         3.11269E+02
+          1.29304E-02         1.21232E-03        -4.91620E-03         8.12441E-01         2.95496E-01         8.12456E-01         3.83725E+02         1.00000E+00         2.63761E-02         3.83725E+02         7.89302E+01         3.04794E+02
+          1.29304E-02         1.38215E-03        -4.93004E-03         8.12441E-01         3.06167E-01         8.12456E-01         3.75380E+02         1.00000E+00         2.61110E-02         3.75380E+02         7.71727E+01         2.98207E+02
+          1.29304E-02         1.55197E-03        -4.94569E-03         8.12441E-01         3.16838E-01         8.12456E-01         3.66906E+02         1.00000E+00         2.58419E-02         3.66906E+02         7.53875E+01         2.91518E+02
+          1.29304E-02         1.72180E-03        -4.96316E-03         8.12440E-01         3.27508E-01         8.12456E-01         3.58317E+02         1.00000E+00         2.55692E-02         3.58317E+02         7.35777E+01         2.84739E+02
+          1.29304E-02         1.89163E-03        -4.98243E-03         8.12440E-01         3.38179E-01         8.12455E-01         3.49627E+02         1.00000E+00         2.52933E-02         3.49627E+02         7.17463E+01         2.77881E+02
+          1.29304E-02         2.06146E-03        -5.00352E-03         8.12440E-01         3.48849E-01         8.12455E-01         3.40851E+02         1.00000E+00         2.50149E-02         3.40851E+02         6.98963E+01         2.70955E+02
+          1.29304E-02         2.23128E-03        -5.02642E-03         8.12440E-01         3.59520E-01         8.12455E-01         3.32004E+02         1.00000E+00         2.47342E-02         3.32004E+02         6.80308E+01         2.63974E+02
+          1.29304E-02         2.40111E-03        -5.05114E-03         8.12439E-01         3.70190E-01         8.12455E-01         3.23100E+02         1.00000E+00         2.44518E-02         3.23100E+02         6.61529E+01         2.56947E+02
+          1.29304E-02         2.57094E-03        -5.07766E-03         8.12439E-01         3.80861E-01         8.12455E-01         3.14153E+02         1.00000E+00         2.41681E-02         3.14153E+02         6.42654E+01         2.49888E+02
+          1.29304E-02         2.74077E-03        -5.10600E-03         8.12439E-01         3.91532E-01         8.12455E-01         3.05178E+02         1.00000E+00         2.38836E-02         3.05178E+02         6.23715E+01         2.42807E+02
+          1.29304E-02         2.91059E-03        -5.13615E-03         8.12438E-01         4.02202E-01         8.12454E-01         2.96188E+02         1.00000E+00         2.35987E-02         2.96188E+02         6.04740E+01         2.35714E+02
+          1.29304E-02         3.08042E-03        -5.16811E-03         8.12438E-01         4.12873E-01         8.12454E-01         2.87198E+02         1.00000E+00         2.33139E-02         2.87198E+02         5.85759E+01         2.28622E+02
+          1.29304E-02         3.25025E-03        -5.20188E-03         8.12437E-01         4.23543E-01         8.12454E-01         2.78220E+02         1.00000E+00         2.30296E-02         2.78220E+02         5.66801E+01         2.21540E+02
+          1.29304E-02         3.42008E-03        -5.23747E-03         8.12437E-01         4.34214E-01         8.12454E-01         2.69268E+02         1.00000E+00         2.27463E-02         2.69268E+02         5.47893E+01         2.14479E+02
+          1.29304E-02         3.58990E-03        -5.27487E-03         8.12436E-01         4.44884E-01         8.12454E-01         2.60356E+02         1.00000E+00         2.24642E-02         2.60356E+02         5.29064E+01         2.07450E+02
+          1.29304E-02         3.75973E-03        -5.31408E-03         8.12436E-01         4.55555E-01         8.12453E-01         2.51496E+02         1.00000E+00         2.21839E-02         2.51496E+02         5.10340E+01         2.00462E+02
+          1.29304E-02         3.92956E-03        -5.35510E-03         8.12435E-01         4.66225E-01         8.12453E-01         2.42700E+02         1.00000E+00         2.19057E-02         2.42700E+02         4.91748E+01         1.93525E+02
+          1.29304E-02         4.09939E-03        -5.39793E-03         8.12435E-01         4.76896E-01         8.12453E-01         2.33980E+02         1.00000E+00         2.16300E-02         2.33980E+02         4.73313E+01         1.86648E+02
+          1.29304E-02         4.26921E-03        -5.44258E-03         8.12434E-01         4.87567E-01         8.12452E-01         2.25348E+02         1.00000E+00         2.13572E-02         2.25348E+02         4.55060E+01         1.79842E+02
+          1.29304E-02         4.43904E-03        -5.48903E-03         8.12434E-01         4.98237E-01         8.12452E-01         2.16815E+02         1.00000E+00         2.10876E-02         2.16815E+02         4.37014E+01         1.73114E+02
+          1.29304E-02         4.60887E-03        -5.53730E-03         8.12433E-01         5.08908E-01         8.12452E-01         2.08393E+02         1.00000E+00         2.08215E-02         2.08393E+02         4.19196E+01         1.66473E+02
+          1.29304E-02         4.77869E-03        -5.58738E-03         8.12432E-01         5.19578E-01         8.12452E-01         2.00090E+02         1.00000E+00         2.05593E-02         2.00090E+02         4.01629E+01         1.59927E+02
+          1.29304E-02         4.94852E-03        -5.63928E-03         8.12432E-01         5.30249E-01         8.12451E-01         1.91917E+02         1.00000E+00         2.03013E-02         1.91917E+02         3.84335E+01         1.53484E+02
+          1.29304E-02         5.11835E-03        -5.69298E-03         8.12431E-01         5.40919E-01         8.12451E-01         1.83884E+02         1.00000E+00         2.00477E-02         1.83884E+02         3.67332E+01         1.47151E+02
+          1.29304E-02         5.28818E-03        -5.74850E-03         8.12430E-01         5.51590E-01         8.12451E-01         1.75999E+02         1.00000E+00         1.97988E-02         1.75999E+02         3.50641E+01         1.40935E+02
+          1.29304E-02         5.45800E-03        -5.80583E-03         8.12430E-01         5.62261E-01         8.12450E-01         1.68270E+02         1.00000E+00         1.95549E-02         1.68270E+02         3.34280E+01         1.34842E+02
+          1.29304E-02         5.62783E-03        -5.86497E-03         8.12429E-01         5.72931E-01         8.12450E-01         1.60706E+02         1.00000E+00         1.93162E-02         1.60706E+02         3.18265E+01         1.28879E+02
+          1.29304E-02         5.79766E-03        -5.92593E-03         8.12428E-01         5.83602E-01         8.12450E-01         1.53313E+02         1.00000E+00         1.90829E-02         1.53313E+02         3.02612E+01         1.23052E+02
+          1.29304E-02         5.96749E-03        -5.98869E-03         8.12427E-01         5.94272E-01         8.12449E-01         1.46098E+02         1.00000E+00         1.88553E-02         1.46098E+02         2.87335E+01         1.17365E+02
+          1.29304E-02         6.13731E-03        -6.05327E-03         8.12426E-01         6.04943E-01         8.12449E-01         1.39068E+02         1.00000E+00         1.86334E-02         1.39068E+02         2.72449E+01         1.11823E+02
+          1.29304E-02         6.30714E-03        -6.11966E-03         8.12425E-01         6.15613E-01         8.12449E-01         1.32228E+02         1.00000E+00         1.84175E-02         1.32228E+02         2.57966E+01         1.06431E+02
+          1.29304E-02         6.47697E-03        -6.18787E-03         8.12425E-01         6.26284E-01         8.12448E-01         1.25582E+02         1.00000E+00         1.82077E-02         1.25582E+02         2.43896E+01         1.01193E+02
+          1.29304E-02         6.64680E-03        -6.25788E-03         8.12424E-01         6.36955E-01         8.12448E-01         1.19136E+02         1.00000E+00         1.80041E-02         1.19136E+02         2.30250E+01         9.61112E+01
+          1.29304E-02         6.81662E-03        -6.32971E-03         8.12423E-01         6.47625E-01         8.12447E-01         1.12893E+02         1.00000E+00         1.78069E-02         1.12894E+02         2.17036E+01         9.11899E+01
+          1.29304E-02         6.98645E-03        -6.40335E-03         8.12422E-01         6.58296E-01         8.12447E-01         1.06857E+02         1.00000E+00         1.76161E-02         1.06857E+02         2.04263E+01         8.64311E+01
+          1.29304E-02         7.15628E-03        -6.47880E-03         8.12421E-01         6.68966E-01         8.12447E-01         1.01031E+02         1.00000E+00         1.74318E-02         1.01031E+02         1.91936E+01         8.18372E+01
+          1.29304E-02         7.32611E-03        -6.55606E-03         8.12420E-01         6.79637E-01         8.12446E-01         9.54159E+01         1.00000E+00         1.72541E-02         9.54159E+01         1.80062E+01         7.74098E+01
+          1.29304E-02         7.49593E-03        -6.63514E-03         8.12419E-01         6.90307E-01         8.12446E-01         9.00144E+01         1.00000E+00         1.70830E-02         9.00144E+01         1.68643E+01         7.31501E+01
+          1.29304E-02         7.66576E-03        -6.71602E-03         8.12418E-01         7.00978E-01         8.12446E-01         8.48274E+01         1.00000E+00         1.69185E-02         8.48274E+01         1.57684E+01         6.90590E+01
+          1.29304E-02         7.83559E-03        -6.79872E-03         8.12417E-01         7.11649E-01         8.12445E-01         7.98556E+01         1.00000E+00         1.67608E-02         7.98556E+01         1.47185E+01         6.51371E+01
+          1.29304E-02         8.00542E-03        -6.88323E-03         8.12416E-01         7.22319E-01         8.12445E-01         7.50991E+01         1.00000E+00         1.66097E-02         7.50991E+01         1.37148E+01         6.13843E+01
+          1.29304E-02         8.17524E-03        -6.96956E-03         8.12415E-01         7.32990E-01         8.12444E-01         7.05576E+01         1.00000E+00         1.64654E-02         7.05576E+01         1.27573E+01         5.78002E+01
+          1.29304E-02         8.34507E-03        -7.05770E-03         8.12413E-01         7.43660E-01         8.12444E-01         6.62301E+01         1.00000E+00         1.63276E-02         6.62301E+01         1.18459E+01         5.43843E+01
+          1.29304E-02         8.51490E-03        -7.14764E-03         8.12412E-01         7.54331E-01         8.12444E-01         6.21154E+01         1.00000E+00         1.61966E-02         6.21154E+01         1.09802E+01         5.11352E+01
+          1.29304E-02         8.68473E-03        -7.23940E-03         8.12411E-01         7.65001E-01         8.12443E-01         5.82116E+01         1.00000E+00         1.60721E-02         5.82116E+01         1.01600E+01         4.80517E+01
+          1.29304E-02         8.85455E-03        -7.33298E-03         8.12410E-01         7.75672E-01         8.12443E-01         5.45165E+01         1.00000E+00         1.59541E-02         5.45165E+01         9.38478E+00         4.51318E+01
+          1.29304E-02         9.02438E-03        -7.42836E-03         8.12409E-01         7.86343E-01         8.12443E-01         5.10275E+01         1.00000E+00         1.58427E-02         5.10275E+01         8.65411E+00         4.23734E+01
+          1.29304E-02         9.19421E-03        -7.52556E-03         8.12407E-01         7.97013E-01         8.12442E-01         4.77415E+01         1.00000E+00         1.57376E-02         4.77415E+01         7.96736E+00         3.97741E+01
+          1.29304E-02         9.36403E-03        -7.62457E-03         8.12406E-01         8.07684E-01         8.12442E-01         4.46550E+01         1.00000E+00         1.56390E-02         4.46550E+01         7.32382E+00         3.73311E+01
+          1.29304E-02         9.53386E-03        -7.72539E-03         8.12405E-01         8.18354E-01         8.12441E-01         4.17642E+01         1.00000E+00         1.55466E-02         4.17642E+01         6.72274E+00         3.50414E+01
+          1.29304E-02         9.70369E-03        -7.82802E-03         8.12403E-01         8.29025E-01         8.12441E-01         3.90650E+01         1.00000E+00         1.54603E-02         3.90650E+01         6.16326E+00         3.29017E+01
+          1.29304E-02         9.87352E-03        -7.93247E-03         8.12402E-01         8.39695E-01         8.12441E-01         3.65529E+01         1.00000E+00         1.53802E-02         3.65529E+01         5.64448E+00         3.09084E+01
+          1.29304E-02         1.00433E-02        -8.03873E-03         8.12401E-01         8.50366E-01         8.12440E-01         3.42230E+01         1.00000E+00         1.53061E-02         3.42230E+01         5.16540E+00         2.90577E+01
+          1.29304E-02         1.02132E-02        -8.14680E-03         8.12399E-01         8.61037E-01         8.12440E-01         3.20705E+01         1.00000E+00         1.52378E-02         3.20705E+01         4.72498E+00         2.73455E+01
+          1.29304E-02         1.03830E-02        -8.25668E-03         8.12398E-01         8.71707E-01         8.12440E-01         3.00899E+01         1.00000E+00         1.51753E-02         3.00899E+01         4.32211E+00         2.57678E+01
+          1.29304E-02         1.05528E-02        -8.36838E-03         8.12396E-01         8.82378E-01         8.12440E-01         2.82757E+01         1.00000E+00         1.51186E-02         2.82757E+01         3.95565E+00         2.43200E+01
+          1.29304E-02         1.07227E-02        -8.48189E-03         8.12395E-01         8.93048E-01         8.12439E-01         2.66221E+01         1.00000E+00         1.50673E-02         2.66221E+01         3.62438E+00         2.29977E+01
+          1.29304E-02         1.08925E-02        -8.59721E-03         8.12393E-01         9.03719E-01         8.12439E-01         2.51232E+01         1.00000E+00         1.50215E-02         2.51232E+01         3.32706E+00         2.17961E+01
+          1.29304E-02         1.10623E-02        -8.71434E-03         8.12392E-01         9.14389E-01         8.12439E-01         2.37728E+01         1.00000E+00         1.49811E-02         2.37728E+01         3.06241E+00         2.07104E+01
+          1.29304E-02         1.12321E-02        -8.83328E-03         8.12390E-01         9.25060E-01         8.12438E-01         2.25648E+01         1.00000E+00         1.49458E-02         2.25648E+01         2.82910E+00         1.97357E+01
+          1.29304E-02         1.14020E-02        -8.95404E-03         8.12389E-01         9.35731E-01         8.12438E-01         2.14928E+01         1.00000E+00         1.49156E-02         2.14928E+01         2.62579E+00         1.88670E+01
+          1.29304E-02         1.15718E-02        -9.07661E-03         8.12387E-01         9.46401E-01         8.12438E-01         2.05502E+01         1.00000E+00         1.48904E-02         2.05502E+01         2.45111E+00         1.80991E+01
+          1.29304E-02         1.17416E-02        -9.20099E-03         8.12386E-01         9.57072E-01         8.12438E-01         1.97305E+01         1.00000E+00         1.48700E-02         1.97305E+01         2.30366E+00         1.74269E+01
+          1.29304E-02         1.19114E-02        -9.32719E-03         8.12384E-01         9.67742E-01         8.12438E-01         1.90272E+01         1.00000E+00         1.48543E-02         1.90272E+01         2.18204E+00         1.68452E+01
+          1.29304E-02         1.20813E-02        -9.45519E-03         8.12382E-01         9.78413E-01         8.12437E-01         1.84336E+01         1.00000E+00         1.48431E-02         1.84336E+01         2.08483E+00         1.63488E+01
+          1.29304E-02         1.22511E-02        -9.58501E-03         8.12381E-01         9.89083E-01         8.12437E-01         1.79431E+01         1.00000E+00         1.48363E-02         1.79431E+01         2.01061E+00         1.59325E+01
+          1.29304E-02         1.24209E-02        -9.71664E-03         8.12379E-01         9.99754E-01         8.12437E-01         1.75491E+01         1.00000E+00         1.48339E-02         1.75491E+01         1.95796E+00         1.55911E+01
+          1.29304E-02         1.25908E-02        -9.85009E-03         8.12377E-01         1.01042E+00         8.12437E-01         1.72448E+01         1.00000E+00         1.48355E-02         1.72448E+01         1.92546E+00         1.53194E+01
+          1.29304E-02         1.27606E-02        -9.98534E-03         8.12376E-01         1.02110E+00         8.12437E-01         1.70239E+01         1.00000E+00         1.48412E-02         1.70239E+01         1.91169E+00         1.51122E+01
+          1.29304E-02         1.29304E-02        -1.01224E-02         8.12374E-01         1.03177E+00         8.12437E-01         1.68798E+01         1.00000E+00         1.48508E-02         1.68798E+01         1.91526E+00         1.49646E+01
+          1.29304E-02         1.31002E-02        -1.02613E-02         8.12372E-01         1.04244E+00         8.12437E-01         1.68062E+01         1.00000E+00         1.48640E-02         1.68062E+01         1.93477E+00         1.48714E+01
+          1.29304E-02         1.32701E-02        -1.04020E-02         8.12370E-01         1.05311E+00         8.12437E-01         1.67966E+01         1.00000E+00         1.48808E-02         1.67966E+01         1.96887E+00         1.48278E+01
+          1.29304E-02         1.34399E-02        -1.05445E-02         8.12368E-01         1.06378E+00         8.12437E-01         1.68451E+01         1.00000E+00         1.49011E-02         1.68451E+01         2.01619E+00         1.48289E+01
+          1.29304E-02         1.36097E-02        -1.06888E-02         8.12366E-01         1.07445E+00         8.12437E-01         1.69454E+01         1.00000E+00         1.49246E-02         1.69454E+01         2.07542E+00         1.48700E+01
+          1.29304E-02         1.37795E-02        -1.08349E-02         8.12365E-01         1.08512E+00         8.12437E-01         1.70917E+01         1.00000E+00         1.49513E-02         1.70917E+01         2.14528E+00         1.49465E+01
+          1.29304E-02         1.39494E-02        -1.09829E-02         8.12363E-01         1.09579E+00         8.12437E-01         1.72784E+01         1.00000E+00         1.49810E-02         1.72784E+01         2.22448E+00         1.50539E+01
+          1.29304E-02         1.41192E-02        -1.11326E-02         8.12361E-01         1.10646E+00         8.12437E-01         1.74997E+01         1.00000E+00         1.50135E-02         1.74997E+01         2.31182E+00         1.51879E+01
+          1.29304E-02         1.42890E-02        -1.12842E-02         8.12359E-01         1.11713E+00         8.12437E-01         1.77504E+01         1.00000E+00         1.50487E-02         1.77504E+01         2.40610E+00         1.53443E+01
+          1.29304E-02         1.44589E-02        -1.14376E-02         8.12357E-01         1.12780E+00         8.12437E-01         1.80253E+01         1.00000E+00         1.50865E-02         1.80253E+01         2.50616E+00         1.55191E+01
+          1.29304E-02         1.46287E-02        -1.15928E-02         8.12355E-01         1.13847E+00         8.12437E-01         1.83193E+01         1.00000E+00         1.51266E-02         1.83193E+01         2.61091E+00         1.57084E+01
+          1.29304E-02         1.47985E-02        -1.17498E-02         8.12353E-01         1.14914E+00         8.12438E-01         1.86278E+01         1.00000E+00         1.51690E-02         1.86277E+01         2.71926E+00         1.59085E+01
+          1.29304E-02         1.49683E-02        -1.19086E-02         8.12351E-01         1.15981E+00         8.12438E-01         1.89461E+01         1.00000E+00         1.52135E-02         1.89461E+01         2.83020E+00         1.61159E+01
+          1.29304E-02         1.51382E-02        -1.20692E-02         8.12349E-01         1.17048E+00         8.12438E-01         1.92700E+01         1.00000E+00         1.52600E-02         1.92700E+01         2.94275E+00         1.63272E+01
+          1.29304E-02         1.53080E-02        -1.22317E-02         8.12346E-01         1.18115E+00         8.12439E-01         1.95954E+01         1.00000E+00         1.53082E-02         1.95954E+01         3.05598E+00         1.65394E+01
+          1.29304E-02         1.54778E-02        -1.23959E-02         8.12344E-01         1.19182E+00         8.12439E-01         1.99184E+01         1.00000E+00         1.53581E-02         1.99184E+01         3.16902E+00         1.67493E+01
+          1.29304E-02         1.56476E-02        -1.25620E-02         8.12342E-01         1.20249E+00         8.12439E-01         2.02354E+01         1.00000E+00         1.54095E-02         2.02354E+01         3.28104E+00         1.69544E+01
+          1.29304E-02         1.58175E-02        -1.27299E-02         8.12340E-01         1.21317E+00         8.12440E-01         2.05431E+01         1.00000E+00         1.54622E-02         2.05431E+01         3.39124E+00         1.71519E+01
+          1.29304E-02         1.59873E-02        -1.28996E-02         8.12338E-01         1.22384E+00         8.12440E-01         2.08384E+01         1.00000E+00         1.55162E-02         2.08384E+01         3.49891E+00         1.73395E+01
+          1.29304E-02         1.61571E-02        -1.30711E-02         8.12336E-01         1.23451E+00         8.12441E-01         2.11184E+01         1.00000E+00         1.55712E-02         2.11184E+01         3.60337E+00         1.75150E+01
+          1.29304E-02         1.63270E-02        -1.32444E-02         8.12333E-01         1.24518E+00         8.12441E-01         2.13804E+01         1.00000E+00         1.56271E-02         2.13804E+01         3.70400E+00         1.76764E+01
+          1.29304E-02         1.64968E-02        -1.34195E-02         8.12331E-01         1.25585E+00         8.12442E-01         2.16221E+01         1.00000E+00         1.56838E-02         2.16221E+01         3.80020E+00         1.78219E+01
+          1.29304E-02         1.66666E-02        -1.35965E-02         8.12329E-01         1.26652E+00         8.12443E-01         2.18414E+01         1.00000E+00         1.57412E-02         2.18414E+01         3.89147E+00         1.79499E+01
+          1.29304E-02         1.68364E-02        -1.37753E-02         8.12326E-01         1.27719E+00         8.12443E-01         2.20363E+01         1.00000E+00         1.57990E-02         2.20363E+01         3.97733E+00         1.80590E+01
+          1.29304E-02         1.70063E-02        -1.39558E-02         8.12324E-01         1.28786E+00         8.12444E-01         2.22053E+01         1.00000E+00         1.58572E-02         2.22053E+01         4.05736E+00         1.81479E+01
+          1.29304E-02         1.71761E-02        -1.41382E-02         8.12322E-01         1.29853E+00         8.12445E-01         2.23468E+01         1.00000E+00         1.59157E-02         2.23468E+01         4.13117E+00         1.82156E+01
+          1.29304E-02         1.73459E-02        -1.43224E-02         8.12319E-01         1.30920E+00         8.12446E-01         2.24597E+01         1.00000E+00         1.59742E-02         2.24597E+01         4.19846E+00         1.82612E+01
+          1.29304E-02         1.75158E-02        -1.45084E-02         8.12317E-01         1.31987E+00         8.12447E-01         2.25430E+01         1.00000E+00         1.60327E-02         2.25430E+01         4.25892E+00         1.82841E+01
+          1.29304E-02         1.76856E-02        -1.46962E-02         8.12315E-01         1.33054E+00         8.12448E-01         2.25960E+01         1.00000E+00         1.60910E-02         2.25960E+01         4.31235E+00         1.82836E+01
+          1.29304E-02         1.78554E-02        -1.48859E-02         8.12312E-01         1.34121E+00         8.12449E-01         2.26180E+01         1.00000E+00         1.61491E-02         2.26180E+01         4.35854E+00         1.82595E+01
+          1.29304E-02         1.80252E-02        -1.50773E-02         8.12310E-01         1.35188E+00         8.12450E-01         2.26089E+01         1.00000E+00         1.62068E-02         2.26089E+01         4.39735E+00         1.82115E+01
+          1.29304E-02         1.81951E-02        -1.52706E-02         8.12307E-01         1.36255E+00         8.12451E-01         2.25683E+01         1.00000E+00         1.62639E-02         2.25683E+01         4.42869E+00         1.81396E+01
+          1.29304E-02         1.83649E-02        -1.54657E-02         8.12305E-01         1.37322E+00         8.12452E-01         2.24964E+01         1.00000E+00         1.63204E-02         2.24964E+01         4.45248E+00         1.80439E+01
+          1.29304E-02         1.85347E-02        -1.56625E-02         8.12302E-01         1.38389E+00         8.12453E-01         2.23934E+01         1.00000E+00         1.63761E-02         2.23933E+01         4.46872E+00         1.79246E+01
+          1.29304E-02         1.87045E-02        -1.58612E-02         8.12300E-01         1.39457E+00         8.12454E-01         2.22595E+01         1.00000E+00         1.64310E-02         2.22595E+01         4.47740E+00         1.77821E+01
+          1.29304E-02         1.88744E-02        -1.60618E-02         8.12297E-01         1.40524E+00         8.12456E-01         2.20955E+01         1.00000E+00         1.64850E-02         2.20955E+01         4.47859E+00         1.76169E+01
+          1.29304E-02         1.90442E-02        -1.62641E-02         8.12294E-01         1.41591E+00         8.12457E-01         2.19020E+01         1.00000E+00         1.65379E-02         2.19020E+01         4.47237E+00         1.74296E+01
+          1.29304E-02         1.92140E-02        -1.64682E-02         8.12292E-01         1.42658E+00         8.12459E-01         2.16797E+01         1.00000E+00         1.65896E-02         2.16797E+01         4.45885E+00         1.72209E+01
+          1.29304E-02         1.93839E-02        -1.66742E-02         8.12289E-01         1.43725E+00         8.12460E-01         2.14297E+01         1.00000E+00         1.66400E-02         2.14297E+01         4.43817E+00         1.69916E+01
+          1.29304E-02         1.95537E-02        -1.68819E-02         8.12286E-01         1.44792E+00         8.12462E-01         2.11531E+01         1.00000E+00         1.66891E-02         2.11531E+01         4.41050E+00         1.67426E+01
+          1.29304E-02         1.97235E-02        -1.70915E-02         8.12284E-01         1.45859E+00         8.12463E-01         2.08510E+01         1.00000E+00         1.67368E-02         2.08510E+01         4.37605E+00         1.64749E+01
+          1.29304E-02         1.98933E-02        -1.73029E-02         8.12281E-01         1.46926E+00         8.12465E-01         2.05247E+01         1.00000E+00         1.67830E-02         2.05247E+01         4.33504E+00         1.61897E+01
+          1.29304E-02         2.00632E-02        -1.75161E-02         8.12278E-01         1.47993E+00         8.12467E-01         2.01756E+01         1.00000E+00         1.68275E-02         2.01756E+01         4.28770E+00         1.58879E+01
+          1.29304E-02         2.02330E-02        -1.77311E-02         8.12275E-01         1.49060E+00         8.12469E-01         1.98052E+01         1.00000E+00         1.68704E-02         1.98052E+01         4.23430E+00         1.55709E+01
+          1.29304E-02         2.04028E-02        -1.79480E-02         8.12273E-01         1.50127E+00         8.12471E-01         1.94149E+01         1.00000E+00         1.69116E-02         1.94149E+01         4.17511E+00         1.52398E+01
+          1.29304E-02         2.05726E-02        -1.81666E-02         8.12270E-01         1.51194E+00         8.12473E-01         1.90064E+01         1.00000E+00         1.69509E-02         1.90064E+01         4.11043E+00         1.48960E+01
+          1.29304E-02         2.07425E-02        -1.83871E-02         8.12267E-01         1.52261E+00         8.12475E-01         1.85813E+01         1.00000E+00         1.69883E-02         1.85813E+01         4.04056E+00         1.45408E+01
+          1.29304E-02         2.09123E-02        -1.86093E-02         8.12264E-01         1.53328E+00         8.12477E-01         1.81413E+01         1.00000E+00         1.70238E-02         1.81413E+01         3.96584E+00         1.41754E+01
+          1.29304E-02         2.10821E-02        -1.88334E-02         8.12261E-01         1.54395E+00         8.12479E-01         1.76880E+01         1.00000E+00         1.70572E-02         1.76880E+01         3.88657E+00         1.38014E+01
+          1.29304E-02         2.12520E-02        -1.90593E-02         8.12258E-01         1.55462E+00         8.12482E-01         1.72231E+01         1.00000E+00         1.70886E-02         1.72232E+01         3.80310E+00         1.34200E+01
+          1.29304E-02         2.14218E-02        -1.92870E-02         8.12255E-01         1.56529E+00         8.12484E-01         1.67485E+01         1.00000E+00         1.71178E-02         1.67485E+01         3.71578E+00         1.30327E+01
+          1.29304E-02         2.15916E-02        -1.95165E-02         8.12252E-01         1.57596E+00         8.12487E-01         1.62658E+01         1.00000E+00         1.71449E-02         1.62658E+01         3.62494E+00         1.26409E+01
+          1.29304E-02         2.17614E-02        -1.97479E-02         8.12249E-01         1.58664E+00         8.12489E-01         1.57768E+01         1.00000E+00         1.71697E-02         1.57768E+01         3.53093E+00         1.22459E+01
+          1.29304E-02         2.19313E-02        -1.99810E-02         8.12246E-01         1.59731E+00         8.12492E-01         1.52831E+01         1.00000E+00         1.71923E-02         1.52831E+01         3.43411E+00         1.18490E+01
+          1.29304E-02         2.21011E-02        -2.02160E-02         8.12243E-01         1.60798E+00         8.12495E-01         1.47865E+01         1.00000E+00         1.72125E-02         1.47865E+01         3.33482E+00         1.14516E+01
+          1.29304E-02         2.22709E-02        -2.04528E-02         8.12240E-01         1.61865E+00         8.12498E-01         1.42885E+01         1.00000E+00         1.72304E-02         1.42885E+01         3.23341E+00         1.10551E+01
+          1.29304E-02         2.24407E-02        -2.06914E-02         8.12237E-01         1.62932E+00         8.12501E-01         1.37909E+01         1.00000E+00         1.72459E-02         1.37909E+01         3.13022E+00         1.06607E+01
+          1.29304E-02         2.26106E-02        -2.09318E-02         8.12234E-01         1.63999E+00         8.12504E-01         1.32952E+01         1.00000E+00         1.72590E-02         1.32952E+01         3.02558E+00         1.02696E+01
+          1.29304E-02         2.27804E-02        -2.11740E-02         8.12231E-01         1.65066E+00         8.12507E-01         1.28029E+01         1.00000E+00         1.72696E-02         1.28029E+01         2.91983E+00         9.88309E+00
+          1.29304E-02         2.29502E-02        -2.14180E-02         8.12228E-01         1.66133E+00         8.12510E-01         1.23155E+01         1.00000E+00         1.72777E-02         1.23155E+01         2.81330E+00         9.50225E+00
+          1.29304E-02         2.31201E-02        -2.16638E-02         8.12224E-01         1.67200E+00         8.12513E-01         1.18345E+01         1.00000E+00         1.72833E-02         1.18345E+01         2.70629E+00         9.12819E+00
+          1.29304E-02         2.32899E-02        -2.19115E-02         8.12221E-01         1.68267E+00         8.12517E-01         1.13611E+01         1.00000E+00         1.72863E-02         1.13611E+01         2.59912E+00         8.76196E+00
+          1.29304E-02         2.34597E-02        -2.21610E-02         8.12218E-01         1.69334E+00         8.12520E-01         1.08966E+01         1.00000E+00         1.72868E-02         1.08966E+01         2.49208E+00         8.40455E+00
+          1.29304E-02         2.36295E-02        -2.24123E-02         8.12215E-01         1.70401E+00         8.12524E-01         1.04423E+01         1.00000E+00         1.72847E-02         1.04423E+01         2.38545E+00         8.05688E+00
+          1.29304E-02         2.37994E-02        -2.26653E-02         8.12212E-01         1.71468E+00         8.12528E-01         9.99932E+00         1.00000E+00         1.72800E-02         9.99933E+00         2.27951E+00         7.71982E+00
+          1.29304E-02         2.39692E-02        -2.29203E-02         8.12208E-01         1.72535E+00         8.12532E-01         9.56866E+00         1.00000E+00         1.72726E-02         9.56867E+00         2.17451E+00         7.39416E+00
+          1.29304E-02         2.41390E-02        -2.31770E-02         8.12205E-01         1.73602E+00         8.12536E-01         9.15133E+00         1.00000E+00         1.72627E-02         9.15133E+00         2.07071E+00         7.08062E+00
+          1.29304E-02         2.43088E-02        -2.34355E-02         8.12202E-01         1.74669E+00         8.12540E-01         8.74820E+00         1.00000E+00         1.72501E-02         8.74821E+00         1.96834E+00         6.77987E+00
+          1.29304E-02         2.44787E-02        -2.36959E-02         8.12198E-01         1.75736E+00         8.12544E-01         8.36011E+00         1.00000E+00         1.72348E-02         8.36012E+00         1.86761E+00         6.49250E+00
+          1.29304E-02         2.46485E-02        -2.39580E-02         8.12195E-01         1.76804E+00         8.12548E-01         7.98776E+00         1.00000E+00         1.72169E-02         7.98777E+00         1.76874E+00         6.21903E+00
+          1.29304E-02         2.48183E-02        -2.42220E-02         8.12191E-01         1.77871E+00         8.12553E-01         7.63180E+00         1.00000E+00         1.71963E-02         7.63181E+00         1.67191E+00         5.95990E+00
+          1.29304E-02         2.49882E-02        -2.44878E-02         8.12188E-01         1.78938E+00         8.12557E-01         7.29278E+00         1.00000E+00         1.71731E-02         7.29279E+00         1.57730E+00         5.71549E+00
+          1.29304E-02         2.51580E-02        -2.47554E-02         8.12185E-01         1.80005E+00         8.12562E-01         6.97117E+00         1.00000E+00         1.71472E-02         6.97117E+00         1.48507E+00         5.48610E+00
+          1.29304E-02         2.53278E-02        -2.50248E-02         8.12181E-01         1.81072E+00         8.12566E-01         6.66735E+00         1.00000E+00         1.71187E-02         6.66735E+00         1.39537E+00         5.27198E+00
+          1.29304E-02         2.54976E-02        -2.52961E-02         8.12178E-01         1.82139E+00         8.12571E-01         6.38162E+00         1.00000E+00         1.70875E-02         6.38163E+00         1.30833E+00         5.07330E+00
+          1.29304E-02         2.56675E-02        -2.55691E-02         8.12174E-01         1.83206E+00         8.12576E-01         6.11420E+00         1.00000E+00         1.70537E-02         6.11421E+00         1.22406E+00         4.89015E+00
+          1.29304E-02         2.58373E-02        -2.58440E-02         8.12170E-01         1.84273E+00         8.12582E-01         5.86522E+00         1.00000E+00         1.70172E-02         5.86523E+00         1.14267E+00         4.72256E+00
+          1.29304E-02         2.60071E-02        -2.61206E-02         8.12167E-01         1.85340E+00         8.12587E-01         5.63475E+00         1.00000E+00         1.69781E-02         5.63476E+00         1.06425E+00         4.57051E+00
+          1.29304E-02         2.61769E-02        -2.63991E-02         8.12163E-01         1.86407E+00         8.12592E-01         5.42277E+00         1.00000E+00         1.69365E-02         5.42278E+00         9.88871E-01         4.43391E+00
+          1.31002E-02         8.72665E-04        -5.03284E-03         8.23112E-01         2.74155E-01         8.23127E-01         3.92429E+02         1.00000E+00         2.04938E-02         3.92429E+02         9.11762E+01         3.01253E+02
+          1.31002E-02         1.04249E-03        -5.04306E-03         8.23112E-01         2.84826E-01         8.23127E-01         3.84619E+02         1.00000E+00         2.03035E-02         3.84619E+02         8.93140E+01         2.95305E+02
+          1.31002E-02         1.21232E-03        -5.05509E-03         8.23112E-01         2.95496E-01         8.23127E-01         3.76654E+02         1.00000E+00         2.01095E-02         3.76654E+02         8.74142E+01         2.89240E+02
+          1.31002E-02         1.38215E-03        -5.06893E-03         8.23111E-01         3.06167E-01         8.23127E-01         3.68546E+02         1.00000E+00         1.99122E-02         3.68546E+02         8.54800E+01         2.83066E+02
+          1.31002E-02         1.55197E-03        -5.08458E-03         8.23111E-01         3.16838E-01         8.23127E-01         3.60311E+02         1.00000E+00         1.97120E-02         3.60311E+02         8.35148E+01         2.76796E+02
+          1.31002E-02         1.72180E-03        -5.10205E-03         8.23111E-01         3.27508E-01         8.23127E-01         3.51961E+02         1.00000E+00         1.95091E-02         3.51961E+02         8.15218E+01         2.70439E+02
+          1.31002E-02         1.89163E-03        -5.12133E-03         8.23111E-01         3.38179E-01         8.23127E-01         3.43511E+02         1.00000E+00         1.93040E-02         3.43511E+02         7.95043E+01         2.64006E+02
+          1.31002E-02         2.06146E-03        -5.14242E-03         8.23110E-01         3.48849E-01         8.23127E-01         3.34974E+02         1.00000E+00         1.90970E-02         3.34974E+02         7.74656E+01         2.57509E+02
+          1.31002E-02         2.23128E-03        -5.16532E-03         8.23110E-01         3.59520E-01         8.23126E-01         3.26366E+02         1.00000E+00         1.88885E-02         3.26366E+02         7.54091E+01         2.50956E+02
+          1.31002E-02         2.40111E-03        -5.19003E-03         8.23110E-01         3.70190E-01         8.23126E-01         3.17698E+02         1.00000E+00         1.86787E-02         3.17698E+02         7.33381E+01         2.44360E+02
+          1.31002E-02         2.57094E-03        -5.21655E-03         8.23110E-01         3.80861E-01         8.23126E-01         3.08987E+02         1.00000E+00         1.84681E-02         3.08987E+02         7.12557E+01         2.37731E+02
+          1.31002E-02         2.74077E-03        -5.24489E-03         8.23109E-01         3.91532E-01         8.23126E-01         3.00244E+02         1.00000E+00         1.82569E-02         3.00244E+02         6.91654E+01         2.31078E+02
+          1.31002E-02         2.91059E-03        -5.27504E-03         8.23109E-01         4.02202E-01         8.23126E-01         2.91483E+02         1.00000E+00         1.80456E-02         2.91483E+02         6.70703E+01         2.24413E+02
+          1.31002E-02         3.08042E-03        -5.30700E-03         8.23108E-01         4.12873E-01         8.23125E-01         2.82719E+02         1.00000E+00         1.78344E-02         2.82719E+02         6.49736E+01         2.17745E+02
+          1.31002E-02         3.25025E-03        -5.34077E-03         8.23108E-01         4.23543E-01         8.23125E-01         2.73963E+02         1.00000E+00         1.76237E-02         2.73963E+02         6.28785E+01         2.11085E+02
+          1.31002E-02         3.42008E-03        -5.37636E-03         8.23107E-01         4.34214E-01         8.23125E-01         2.65230E+02         1.00000E+00         1.74137E-02         2.65230E+02         6.07881E+01         2.04442E+02
+          1.31002E-02         3.58990E-03        -5.41376E-03         8.23107E-01         4.44884E-01         8.23125E-01         2.56530E+02         1.00000E+00         1.72049E-02         2.56530E+02         5.87053E+01         1.97825E+02
+          1.31002E-02         3.75973E-03        -5.45297E-03         8.23106E-01         4.55555E-01         8.23124E-01         2.47878E+02         1.00000E+00         1.69975E-02         2.47878E+02         5.66331E+01         1.91245E+02
+          1.31002E-02         3.92956E-03        -5.49399E-03         8.23106E-01         4.66225E-01         8.23124E-01         2.39284E+02         1.00000E+00         1.67917E-02         2.39284E+02         5.45745E+01         1.84710E+02
+          1.31002E-02         4.09939E-03        -5.53682E-03         8.23105E-01         4.76896E-01         8.23124E-01         2.30761E+02         1.00000E+00         1.65879E-02         2.30761E+02         5.25323E+01         1.78229E+02
+          1.31002E-02         4.26921E-03        -5.58147E-03         8.23105E-01         4.87567E-01         8.23124E-01         2.22319E+02         1.00000E+00         1.63864E-02         2.22319E+02         5.05091E+01         1.71810E+02
+          1.31002E-02         4.43904E-03        -5.62792E-03         8.23104E-01         4.98237E-01         8.23123E-01         2.13970E+02         1.00000E+00         1.61874E-02         2.13970E+02         4.85077E+01         1.65463E+02
+          1.31002E-02         4.60887E-03        -5.67619E-03         8.23103E-01         5.08908E-01         8.23123E-01         2.05724E+02         1.00000E+00         1.59911E-02         2.05724E+02         4.65305E+01         1.59194E+02
+          1.31002E-02         4.77869E-03        -5.72628E-03         8.23103E-01         5.19578E-01         8.23123E-01         1.97592E+02         1.00000E+00         1.57978E-02         1.97592E+02         4.45801E+01         1.53012E+02
+          1.31002E-02         4.94852E-03        -5.77817E-03         8.23102E-01         5.30249E-01         8.23122E-01         1.89582E+02         1.00000E+00         1.56078E-02         1.89582E+02         4.26587E+01         1.46923E+02
+          1.31002E-02         5.11835E-03        -5.83187E-03         8.23101E-01         5.40919E-01         8.23122E-01         1.81704E+02         1.00000E+00         1.54212E-02         1.81704E+02         4.07686E+01         1.40935E+02
+          1.31002E-02         5.28818E-03        -5.88739E-03         8.23101E-01         5.51590E-01         8.23122E-01         1.73966E+02         1.00000E+00         1.52382E-02         1.73966E+02         3.89120E+01         1.35054E+02
+          1.31002E-02         5.45800E-03        -5.94472E-03         8.23100E-01         5.62261E-01         8.23121E-01         1.66377E+02         1.00000E+00         1.50591E-02         1.66377E+02         3.70908E+01         1.29286E+02
+          1.31002E-02         5.62783E-03        -6.00386E-03         8.23099E-01         5.72931E-01         8.23121E-01         1.58945E+02         1.00000E+00         1.48839E-02         1.58945E+02         3.53069E+01         1.23638E+02
+          1.31002E-02         5.79766E-03        -6.06482E-03         8.23098E-01         5.83602E-01         8.23121E-01         1.51676E+02         1.00000E+00         1.47129E-02         1.51676E+02         3.35621E+01         1.18114E+02
+          1.31002E-02         5.96749E-03        -6.12758E-03         8.23098E-01         5.94272E-01         8.23120E-01         1.44577E+02         1.00000E+00         1.45463E-02         1.44577E+02         3.18581E+01         1.12719E+02
+          1.31002E-02         6.13731E-03        -6.19216E-03         8.23097E-01         6.04943E-01         8.23120E-01         1.37655E+02         1.00000E+00         1.43841E-02         1.37655E+02         3.01964E+01         1.07459E+02
+          1.31002E-02         6.30714E-03        -6.25855E-03         8.23096E-01         6.15613E-01         8.23120E-01         1.30915E+02         1.00000E+00         1.42264E-02         1.30915E+02         2.85783E+01         1.02336E+02
+          1.31002E-02         6.47697E-03        -6.32676E-03         8.23095E-01         6.26284E-01         8.23119E-01         1.24361E+02         1.00000E+00         1.40734E-02         1.24361E+02         2.70053E+01         9.73559E+01
+          1.31002E-02         6.64680E-03        -6.39677E-03         8.23094E-01         6.36955E-01         8.23119E-01         1.17999E+02         1.00000E+00         1.39252E-02         1.17999E+02         2.54783E+01         9.25210E+01
+          1.31002E-02         6.81662E-03        -6.46860E-03         8.23093E-01         6.47625E-01         8.23119E-01         1.11833E+02         1.00000E+00         1.37819E-02         1.11833E+02         2.39985E+01         8.78345E+01
+          1.31002E-02         6.98645E-03        -6.54224E-03         8.23092E-01         6.58296E-01         8.23118E-01         1.05866E+02         1.00000E+00         1.36434E-02         1.05866E+02         2.25668E+01         8.32989E+01
+          1.31002E-02         7.15628E-03        -6.61769E-03         8.23091E-01         6.68966E-01         8.23118E-01         1.00100E+02         1.00000E+00         1.35100E-02         1.00100E+02         2.11839E+01         7.89163E+01
+          1.31002E-02         7.32611E-03        -6.69495E-03         8.23090E-01         6.79637E-01         8.23117E-01         9.45390E+01         1.00000E+00         1.33816E-02         9.45391E+01         1.98504E+01         7.46887E+01
+          1.31002E-02         7.49593E-03        -6.77402E-03         8.23089E-01         6.90307E-01         8.23117E-01         8.91841E+01         1.00000E+00         1.32583E-02         8.91841E+01         1.85669E+01         7.06172E+01
+          1.31002E-02         7.66576E-03        -6.85491E-03         8.23088E-01         7.00978E-01         8.23117E-01         8.40366E+01         1.00000E+00         1.31400E-02         8.40366E+01         1.73337E+01         6.67029E+01
+          1.31002E-02         7.83559E-03        -6.93761E-03         8.23087E-01         7.11649E-01         8.23116E-01         7.90976E+01         1.00000E+00         1.30269E-02         7.90976E+01         1.61512E+01         6.29464E+01
+          1.31002E-02         8.00542E-03        -7.02212E-03         8.23086E-01         7.22319E-01         8.23116E-01         7.43674E+01         1.00000E+00         1.29189E-02         7.43674E+01         1.50195E+01         5.93478E+01
+          1.31002E-02         8.17524E-03        -7.10845E-03         8.23085E-01         7.32990E-01         8.23115E-01         6.98458E+01         1.00000E+00         1.28159E-02         6.98458E+01         1.39386E+01         5.59071E+01
+          1.31002E-02         8.34507E-03        -7.19658E-03         8.23084E-01         7.43660E-01         8.23115E-01         6.55322E+01         1.00000E+00         1.27181E-02         6.55322E+01         1.29085E+01         5.26237E+01
+          1.31002E-02         8.51490E-03        -7.28653E-03         8.23082E-01         7.54331E-01         8.23115E-01         6.14258E+01         1.00000E+00         1.26254E-02         6.14258E+01         1.19289E+01         4.94968E+01
+          1.31002E-02         8.68473E-03        -7.37829E-03         8.23081E-01         7.65001E-01         8.23114E-01         5.75248E+01         1.00000E+00         1.25377E-02         5.75248E+01         1.09996E+01         4.65252E+01
+          1.31002E-02         8.85455E-03        -7.47186E-03         8.23080E-01         7.75672E-01         8.23114E-01         5.38275E+01         1.00000E+00         1.24550E-02         5.38275E+01         1.01201E+01         4.37074E+01
+          1.31002E-02         9.02438E-03        -7.56725E-03         8.23079E-01         7.86343E-01         8.23113E-01         5.03314E+01         1.00000E+00         1.23773E-02         5.03314E+01         9.28992E+00         4.10415E+01
+          1.31002E-02         9.19421E-03        -7.66445E-03         8.23077E-01         7.97013E-01         8.23113E-01         4.70339E+01         1.00000E+00         1.23045E-02         4.70339E+01         8.50850E+00         3.85254E+01
+          1.31002E-02         9.36403E-03        -7.76346E-03         8.23076E-01         8.07684E-01         8.23113E-01         4.39319E+01         1.00000E+00         1.22366E-02         4.39319E+01         7.77510E+00         3.61568E+01
+          1.31002E-02         9.53386E-03        -7.86428E-03         8.23075E-01         8.18354E-01         8.23112E-01         4.10219E+01         1.00000E+00         1.21735E-02         4.10219E+01         7.08894E+00         3.39329E+01
+          1.31002E-02         9.70369E-03        -7.96691E-03         8.23073E-01         8.29025E-01         8.23112E-01         3.83000E+01         1.00000E+00         1.21151E-02         3.83000E+01         6.44915E+00         3.18509E+01
+          1.31002E-02         9.87352E-03        -8.07136E-03         8.23072E-01         8.39695E-01         8.23112E-01         3.57623E+01         1.00000E+00         1.20614E-02         3.57623E+01         5.85478E+00         2.99075E+01
+          1.31002E-02         1.00433E-02        -8.17761E-03         8.23071E-01         8.50366E-01         8.23111E-01         3.34042E+01         1.00000E+00         1.20123E-02         3.34042E+01         5.30478E+00         2.80994E+01
+          1.31002E-02         1.02132E-02        -8.28569E-03         8.23069E-01         8.61037E-01         8.23111E-01         3.12210E+01         1.00000E+00         1.19677E-02         3.12210E+01         4.79808E+00         2.64229E+01
+          1.31002E-02         1.03830E-02        -8.39557E-03         8.23068E-01         8.71707E-01         8.23111E-01         2.92078E+01         1.00000E+00         1.19276E-02         2.92078E+01         4.33349E+00         2.48743E+01
+          1.31002E-02         1.05528E-02        -8.50726E-03         8.23066E-01         8.82378E-01         8.23110E-01         2.73595E+01         1.00000E+00         1.18918E-02         2.73595E+01         3.90979E+00         2.34497E+01
+          1.31002E-02         1.07227E-02        -8.62077E-03         8.23065E-01         8.93048E-01         8.23110E-01         2.56705E+01         1.00000E+00         1.18603E-02         2.56705E+01         3.52570E+00         2.21448E+01
+          1.31002E-02         1.08925E-02        -8.73609E-03         8.23063E-01         9.03719E-01         8.23110E-01         2.41353E+01         1.00000E+00         1.18330E-02         2.41353E+01         3.17989E+00         2.09554E+01
+          1.31002E-02         1.10623E-02        -8.85322E-03         8.23062E-01         9.14389E-01         8.23109E-01         2.27481E+01         1.00000E+00         1.18098E-02         2.27481E+01         2.87098E+00         1.98771E+01
+          1.31002E-02         1.12321E-02        -8.97217E-03         8.23060E-01         9.25060E-01         8.23109E-01         2.15031E+01         1.00000E+00         1.17906E-02         2.15031E+01         2.59756E+00         1.89055E+01
+          1.31002E-02         1.14020E-02        -9.09292E-03         8.23059E-01         9.35731E-01         8.23109E-01         2.03940E+01         1.00000E+00         1.17753E-02         2.03940E+01         2.35816E+00         1.80359E+01
+          1.31002E-02         1.15718E-02        -9.21549E-03         8.23057E-01         9.46401E-01         8.23109E-01         1.94149E+01         1.00000E+00         1.17638E-02         1.94149E+01         2.15131E+00         1.72636E+01
+          1.31002E-02         1.17416E-02        -9.33987E-03         8.23055E-01         9.57072E-01         8.23108E-01         1.85594E+01         1.00000E+00         1.17560E-02         1.85593E+01         1.97550E+00         1.65839E+01
+          1.31002E-02         1.19114E-02        -9.46607E-03         8.23054E-01         9.67742E-01         8.23108E-01         1.78212E+01         1.00000E+00         1.17518E-02         1.78212E+01         1.82921E+00         1.59920E+01
+          1.31002E-02         1.20813E-02        -9.59407E-03         8.23052E-01         9.78413E-01         8.23108E-01         1.71939E+01         1.00000E+00         1.17512E-02         1.71939E+01         1.71089E+00         1.54831E+01
+          1.31002E-02         1.22511E-02        -9.72389E-03         8.23050E-01         9.89083E-01         8.23108E-01         1.66713E+01         1.00000E+00         1.17539E-02         1.66713E+01         1.61899E+00         1.50523E+01
+          1.31002E-02         1.24209E-02        -9.85552E-03         8.23049E-01         9.99754E-01         8.23108E-01         1.62469E+01         1.00000E+00         1.17600E-02         1.62469E+01         1.55197E+00         1.46949E+01
+          1.31002E-02         1.25908E-02        -9.98897E-03         8.23047E-01         1.01042E+00         8.23108E-01         1.59143E+01         1.00000E+00         1.17693E-02         1.59143E+01         1.50826E+00         1.44061E+01
+          1.31002E-02         1.27606E-02        -1.01242E-02         8.23045E-01         1.02110E+00         8.23107E-01         1.56672E+01         1.00000E+00         1.17816E-02         1.56672E+01         1.48631E+00         1.41809E+01
+          1.31002E-02         1.29304E-02        -1.02613E-02         8.23043E-01         1.03177E+00         8.23107E-01         1.54994E+01         1.00000E+00         1.17969E-02         1.54994E+01         1.48459E+00         1.40148E+01
+          1.31002E-02         1.31002E-02        -1.04002E-02         8.23042E-01         1.04244E+00         8.23107E-01         1.54045E+01         1.00000E+00         1.18152E-02         1.54045E+01         1.50155E+00         1.39029E+01
+          1.31002E-02         1.32701E-02        -1.05409E-02         8.23040E-01         1.05311E+00         8.23107E-01         1.53764E+01         1.00000E+00         1.18361E-02         1.53764E+01         1.53569E+00         1.38407E+01
+          1.31002E-02         1.34399E-02        -1.06834E-02         8.23038E-01         1.06378E+00         8.23107E-01         1.54092E+01         1.00000E+00         1.18598E-02         1.54092E+01         1.58553E+00         1.38237E+01
+          1.31002E-02         1.36097E-02        -1.08277E-02         8.23036E-01         1.07445E+00         8.23107E-01         1.54969E+01         1.00000E+00         1.18859E-02         1.54969E+01         1.64958E+00         1.38473E+01
+          1.31002E-02         1.37795E-02        -1.09738E-02         8.23034E-01         1.08512E+00         8.23107E-01         1.56337E+01         1.00000E+00         1.19145E-02         1.56337E+01         1.72642E+00         1.39073E+01
+          1.31002E-02         1.39494E-02        -1.11218E-02         8.23032E-01         1.09579E+00         8.23107E-01         1.58140E+01         1.00000E+00         1.19454E-02         1.58139E+01         1.81463E+00         1.39993E+01
+          1.31002E-02         1.41192E-02        -1.12715E-02         8.23030E-01         1.10646E+00         8.23107E-01         1.60322E+01         1.00000E+00         1.19786E-02         1.60322E+01         1.91285E+00         1.41193E+01
+          1.31002E-02         1.42890E-02        -1.14231E-02         8.23028E-01         1.11713E+00         8.23107E-01         1.62830E+01         1.00000E+00         1.20138E-02         1.62830E+01         2.01974E+00         1.42633E+01
+          1.31002E-02         1.44589E-02        -1.15765E-02         8.23026E-01         1.12780E+00         8.23108E-01         1.65613E+01         1.00000E+00         1.20509E-02         1.65613E+01         2.13400E+00         1.44273E+01
+          1.31002E-02         1.46287E-02        -1.17317E-02         8.23024E-01         1.13847E+00         8.23108E-01         1.68621E+01         1.00000E+00         1.20900E-02         1.68621E+01         2.25439E+00         1.46077E+01
+          1.31002E-02         1.47985E-02        -1.18887E-02         8.23022E-01         1.14914E+00         8.23108E-01         1.71807E+01         1.00000E+00         1.21307E-02         1.71807E+01         2.37970E+00         1.48010E+01
+          1.31002E-02         1.49683E-02        -1.20475E-02         8.23020E-01         1.15981E+00         8.23108E-01         1.75125E+01         1.00000E+00         1.21731E-02         1.75125E+01         2.50877E+00         1.50037E+01
+          1.31002E-02         1.51382E-02        -1.22081E-02         8.23018E-01         1.17048E+00         8.23108E-01         1.78530E+01         1.00000E+00         1.22171E-02         1.78530E+01         2.64049E+00         1.52125E+01
+          1.31002E-02         1.53080E-02        -1.23706E-02         8.23016E-01         1.18115E+00         8.23109E-01         1.81983E+01         1.00000E+00         1.22624E-02         1.81983E+01         2.77380E+00         1.54245E+01
+          1.31002E-02         1.54778E-02        -1.25348E-02         8.23014E-01         1.19182E+00         8.23109E-01         1.85443E+01         1.00000E+00         1.23089E-02         1.85443E+01         2.90770E+00         1.56366E+01
+          1.31002E-02         1.56476E-02        -1.27009E-02         8.23011E-01         1.20249E+00         8.23109E-01         1.88875E+01         1.00000E+00         1.23567E-02         1.88875E+01         3.04123E+00         1.58462E+01
+          1.31002E-02         1.58175E-02        -1.28688E-02         8.23009E-01         1.21317E+00         8.23110E-01         1.92242E+01         1.00000E+00         1.24055E-02         1.92242E+01         3.17349E+00         1.60507E+01
+          1.31002E-02         1.59873E-02        -1.30385E-02         8.23007E-01         1.22384E+00         8.23110E-01         1.95514E+01         1.00000E+00         1.24553E-02         1.95514E+01         3.30363E+00         1.62477E+01
+          1.31002E-02         1.61571E-02        -1.32100E-02         8.23005E-01         1.23451E+00         8.23111E-01         1.98659E+01         1.00000E+00         1.25058E-02         1.98659E+01         3.43086E+00         1.64350E+01
+          1.31002E-02         1.63270E-02        -1.33833E-02         8.23003E-01         1.24518E+00         8.23111E-01         2.01651E+01         1.00000E+00         1.25572E-02         2.01651E+01         3.55446E+00         1.66106E+01
+          1.31002E-02         1.64968E-02        -1.35584E-02         8.23000E-01         1.25585E+00         8.23112E-01         2.04464E+01         1.00000E+00         1.26091E-02         2.04464E+01         3.67374E+00         1.67727E+01
+          1.31002E-02         1.66666E-02        -1.37354E-02         8.22998E-01         1.26652E+00         8.23113E-01         2.07075E+01         1.00000E+00         1.26615E-02         2.07075E+01         3.78808E+00         1.69195E+01
+          1.31002E-02         1.68364E-02        -1.39141E-02         8.22996E-01         1.27719E+00         8.23113E-01         2.09464E+01         1.00000E+00         1.27143E-02         2.09464E+01         3.89691E+00         1.70495E+01
+          1.31002E-02         1.70063E-02        -1.40947E-02         8.22993E-01         1.28786E+00         8.23114E-01         2.11613E+01         1.00000E+00         1.27674E-02         2.11613E+01         3.99972E+00         1.71616E+01
+          1.31002E-02         1.71761E-02        -1.42771E-02         8.22991E-01         1.29853E+00         8.23115E-01         2.13505E+01         1.00000E+00         1.28207E-02         2.13505E+01         4.09605E+00         1.72544E+01
+          1.31002E-02         1.73459E-02        -1.44613E-02         8.22988E-01         1.30920E+00         8.23115E-01         2.15126E+01         1.00000E+00         1.28741E-02         2.15126E+01         4.18549E+00         1.73271E+01
+          1.31002E-02         1.75158E-02        -1.46473E-02         8.22986E-01         1.31987E+00         8.23116E-01         2.16465E+01         1.00000E+00         1.29274E-02         2.16465E+01         4.26770E+00         1.73788E+01
+          1.31002E-02         1.76856E-02        -1.48351E-02         8.22983E-01         1.33054E+00         8.23117E-01         2.17512E+01         1.00000E+00         1.29807E-02         2.17512E+01         4.34236E+00         1.74089E+01
+          1.31002E-02         1.78554E-02        -1.50247E-02         8.22981E-01         1.34121E+00         8.23118E-01         2.18261E+01         1.00000E+00         1.30338E-02         2.18260E+01         4.40924E+00         1.74168E+01
+          1.31002E-02         1.80252E-02        -1.52162E-02         8.22978E-01         1.35188E+00         8.23119E-01         2.18704E+01         1.00000E+00         1.30865E-02         2.18704E+01         4.46813E+00         1.74023E+01
+          1.31002E-02         1.81951E-02        -1.54095E-02         8.22976E-01         1.36255E+00         8.23120E-01         2.18840E+01         1.00000E+00         1.31389E-02         2.18840E+01         4.51887E+00         1.73651E+01
+          1.31002E-02         1.83649E-02        -1.56045E-02         8.22973E-01         1.37322E+00         8.23121E-01         2.18665E+01         1.00000E+00         1.31908E-02         2.18665E+01         4.56135E+00         1.73052E+01
+          1.31002E-02         1.85347E-02        -1.58014E-02         8.22971E-01         1.38389E+00         8.23123E-01         2.18182E+01         1.00000E+00         1.32421E-02         2.18182E+01         4.59551E+00         1.72227E+01
+          1.31002E-02         1.87045E-02        -1.60001E-02         8.22968E-01         1.39457E+00         8.23124E-01         2.17390E+01         1.00000E+00         1.32928E-02         2.17390E+01         4.62132E+00         1.71177E+01
+          1.31002E-02         1.88744E-02        -1.62006E-02         8.22966E-01         1.40524E+00         8.23125E-01         2.16294E+01         1.00000E+00         1.33428E-02         2.16294E+01         4.63880E+00         1.69906E+01
+          1.31002E-02         1.90442E-02        -1.64030E-02         8.22963E-01         1.41591E+00         8.23126E-01         2.14899E+01         1.00000E+00         1.33919E-02         2.14899E+01         4.64801E+00         1.68418E+01
+          1.31002E-02         1.92140E-02        -1.66071E-02         8.22960E-01         1.42658E+00         8.23128E-01         2.13210E+01         1.00000E+00         1.34402E-02         2.13210E+01         4.64903E+00         1.66720E+01
+          1.31002E-02         1.93839E-02        -1.68130E-02         8.22958E-01         1.43725E+00         8.23129E-01         2.11237E+01         1.00000E+00         1.34875E-02         2.11237E+01         4.64199E+00         1.64817E+01
+          1.31002E-02         1.95537E-02        -1.70208E-02         8.22955E-01         1.44792E+00         8.23131E-01         2.08987E+01         1.00000E+00         1.35338E-02         2.08987E+01         4.62705E+00         1.62717E+01
+          1.31002E-02         1.97235E-02        -1.72304E-02         8.22952E-01         1.45859E+00         8.23132E-01         2.06472E+01         1.00000E+00         1.35790E-02         2.06472E+01         4.60439E+00         1.60428E+01
+          1.31002E-02         1.98933E-02        -1.74418E-02         8.22949E-01         1.46926E+00         8.23134E-01         2.03702E+01         1.00000E+00         1.36231E-02         2.03702E+01         4.57423E+00         1.57959E+01
+          1.31002E-02         2.00632E-02        -1.76550E-02         8.22947E-01         1.47993E+00         8.23136E-01         2.00689E+01         1.00000E+00         1.36659E-02         2.00689E+01         4.53680E+00         1.55321E+01
+          1.31002E-02         2.02330E-02        -1.78700E-02         8.22944E-01         1.49060E+00         8.23138E-01         1.97447E+01         1.00000E+00         1.37074E-02         1.97447E+01         4.49237E+00         1.52523E+01
+          1.31002E-02         2.04028E-02        -1.80868E-02         8.22941E-01         1.50127E+00         8.23140E-01         1.93990E+01         1.00000E+00         1.37476E-02         1.93990E+01         4.44123E+00         1.49578E+01
+          1.31002E-02         2.05726E-02        -1.83055E-02         8.22938E-01         1.51194E+00         8.23142E-01         1.90332E+01         1.00000E+00         1.37864E-02         1.90332E+01         4.38367E+00         1.46495E+01
+          1.31002E-02         2.07425E-02        -1.85259E-02         8.22935E-01         1.52261E+00         8.23144E-01         1.86488E+01         1.00000E+00         1.38237E-02         1.86488E+01         4.32001E+00         1.43287E+01
+          1.31002E-02         2.09123E-02        -1.87482E-02         8.22932E-01         1.53328E+00         8.23146E-01         1.82473E+01         1.00000E+00         1.38596E-02         1.82473E+01         4.25059E+00         1.39967E+01
+          1.31002E-02         2.10821E-02        -1.89723E-02         8.22929E-01         1.54395E+00         8.23148E-01         1.78305E+01         1.00000E+00         1.38939E-02         1.78305E+01         4.17575E+00         1.36547E+01
+          1.31002E-02         2.12520E-02        -1.91982E-02         8.22926E-01         1.55462E+00         8.23150E-01         1.73999E+01         1.00000E+00         1.39265E-02         1.73999E+01         4.09585E+00         1.33040E+01
+          1.31002E-02         2.14218E-02        -1.94259E-02         8.22923E-01         1.56529E+00         8.23153E-01         1.69571E+01         1.00000E+00         1.39576E-02         1.69571E+01         4.01126E+00         1.29459E+01
+          1.31002E-02         2.15916E-02        -1.96554E-02         8.22920E-01         1.57596E+00         8.23155E-01         1.65039E+01         1.00000E+00         1.39869E-02         1.65039E+01         3.92233E+00         1.25816E+01
+          1.31002E-02         2.17614E-02        -1.98867E-02         8.22917E-01         1.58664E+00         8.23158E-01         1.60419E+01         1.00000E+00         1.40145E-02         1.60419E+01         3.82946E+00         1.22125E+01
+          1.31002E-02         2.19313E-02        -2.01199E-02         8.22914E-01         1.59731E+00         8.23160E-01         1.55728E+01         1.00000E+00         1.40404E-02         1.55728E+01         3.73302E+00         1.18398E+01
+          1.31002E-02         2.21011E-02        -2.03548E-02         8.22911E-01         1.60798E+00         8.23163E-01         1.50982E+01         1.00000E+00         1.40644E-02         1.50982E+01         3.63338E+00         1.14648E+01
+          1.31002E-02         2.22709E-02        -2.05916E-02         8.22908E-01         1.61865E+00         8.23166E-01         1.46197E+01         1.00000E+00         1.40867E-02         1.46197E+01         3.53092E+00         1.10888E+01
+          1.31002E-02         2.24407E-02        -2.08302E-02         8.22905E-01         1.62932E+00         8.23169E-01         1.41391E+01         1.00000E+00         1.41070E-02         1.41391E+01         3.42603E+00         1.07131E+01
+          1.31002E-02         2.26106E-02        -2.10706E-02         8.22902E-01         1.63999E+00         8.23172E-01         1.36578E+01         1.00000E+00         1.41255E-02         1.36578E+01         3.31906E+00         1.03387E+01
+          1.31002E-02         2.27804E-02        -2.13128E-02         8.22899E-01         1.65066E+00         8.23175E-01         1.31774E+01         1.00000E+00         1.41420E-02         1.31774E+01         3.21040E+00         9.96698E+00
+          1.31002E-02         2.29502E-02        -2.15569E-02         8.22895E-01         1.66133E+00         8.23178E-01         1.26994E+01         1.00000E+00         1.41566E-02         1.26994E+01         3.10040E+00         9.59897E+00
+          1.31002E-02         2.31201E-02        -2.18027E-02         8.22892E-01         1.67200E+00         8.23181E-01         1.22252E+01         1.00000E+00         1.41692E-02         1.22252E+01         2.98940E+00         9.23580E+00
+          1.31002E-02         2.32899E-02        -2.20504E-02         8.22889E-01         1.68267E+00         8.23184E-01         1.17563E+01         1.00000E+00         1.41797E-02         1.17563E+01         2.87776E+00         8.87850E+00
+          1.31002E-02         2.34597E-02        -2.22998E-02         8.22886E-01         1.69334E+00         8.23188E-01         1.12939E+01         1.00000E+00         1.41883E-02         1.12939E+01         2.76581E+00         8.52808E+00
+          1.31002E-02         2.36295E-02        -2.25511E-02         8.22882E-01         1.70401E+00         8.23191E-01         1.08394E+01         1.00000E+00         1.41948E-02         1.08394E+01         2.65387E+00         8.18549E+00
+          1.31002E-02         2.37994E-02        -2.28042E-02         8.22879E-01         1.71468E+00         8.23195E-01         1.03939E+01         1.00000E+00         1.41993E-02         1.03939E+01         2.54224E+00         7.85162E+00
+          1.31002E-02         2.39692E-02        -2.30591E-02         8.22876E-01         1.72535E+00         8.23199E-01         9.95852E+00         1.00000E+00         1.42017E-02         9.95853E+00         2.43123E+00         7.52730E+00
+          1.31002E-02         2.41390E-02        -2.33158E-02         8.22872E-01         1.73602E+00         8.23203E-01         9.53442E+00         1.00000E+00         1.42020E-02         9.53443E+00         2.32112E+00         7.21331E+00
+          1.31002E-02         2.43088E-02        -2.35744E-02         8.22869E-01         1.74669E+00         8.23207E-01         9.12253E+00         1.00000E+00         1.42002E-02         9.12254E+00         2.21218E+00         6.91036E+00
+          1.31002E-02         2.44787E-02        -2.38347E-02         8.22866E-01         1.75736E+00         8.23211E-01         8.72375E+00         1.00000E+00         1.41963E-02         8.72376E+00         2.10466E+00         6.61910E+00
+          1.31002E-02         2.46485E-02        -2.40969E-02         8.22862E-01         1.76804E+00         8.23215E-01         8.33891E+00         1.00000E+00         1.41903E-02         8.33892E+00         1.99880E+00         6.34012E+00
+          1.31002E-02         2.48183E-02        -2.43609E-02         8.22859E-01         1.77871E+00         8.23219E-01         7.96876E+00         1.00000E+00         1.41822E-02         7.96876E+00         1.89483E+00         6.07393E+00
+          1.31002E-02         2.49882E-02        -2.46267E-02         8.22855E-01         1.78938E+00         8.23224E-01         7.61395E+00         1.00000E+00         1.41720E-02         7.61396E+00         1.79296E+00         5.82100E+00
+          1.31002E-02         2.51580E-02        -2.48943E-02         8.22852E-01         1.80005E+00         8.23228E-01         7.27508E+00         1.00000E+00         1.41596E-02         7.27508E+00         1.69337E+00         5.58171E+00
+          1.31002E-02         2.53278E-02        -2.51637E-02         8.22848E-01         1.81072E+00         8.23233E-01         6.95263E+00         1.00000E+00         1.41451E-02         6.95264E+00         1.59625E+00         5.35638E+00
+          1.31002E-02         2.54976E-02        -2.54349E-02         8.22845E-01         1.82139E+00         8.23238E-01         6.64704E+00         1.00000E+00         1.41284E-02         6.64704E+00         1.50176E+00         5.14528E+00
+          1.31002E-02         2.56675E-02        -2.57080E-02         8.22841E-01         1.83206E+00         8.23243E-01         6.35863E+00         1.00000E+00         1.41097E-02         6.35864E+00         1.41004E+00         4.94860E+00
+          1.31002E-02         2.58373E-02        -2.59828E-02         8.22837E-01         1.84273E+00         8.23248E-01         6.08768E+00         1.00000E+00         1.40888E-02         6.08768E+00         1.32122E+00         4.76646E+00
+          1.31002E-02         2.60071E-02        -2.62595E-02         8.22834E-01         1.85340E+00         8.23253E-01         5.83435E+00         1.00000E+00         1.40658E-02         5.83436E+00         1.23541E+00         4.59895E+00
+          1.31002E-02         2.61769E-02        -2.65380E-02         8.22830E-01         1.86407E+00         8.23258E-01         5.59877E+00         1.00000E+00         1.40407E-02         5.59877E+00         1.15272E+00         4.44606E+00
+          1.32701E-02         8.72665E-04        -5.17355E-03         8.33782E-01         2.74155E-01         8.33799E-01         3.84291E+02         1.00000E+00         1.55754E-02         3.84291E+02         9.92143E+01         2.85077E+02
+          1.32701E-02         1.04249E-03        -5.18377E-03         8.33782E-01         2.84826E-01         8.33798E-01         3.76727E+02         1.00000E+00         1.54342E-02         3.76727E+02         9.72098E+01         2.79517E+02
+          1.32701E-02         1.21232E-03        -5.19579E-03         8.33782E-01         2.95496E-01         8.33798E-01         3.69010E+02         1.00000E+00         1.52904E-02         3.69010E+02         9.51641E+01         2.73846E+02
+          1.32701E-02         1.38215E-03        -5.20964E-03         8.33782E-01         3.06167E-01         8.33798E-01         3.61154E+02         1.00000E+00         1.51441E-02         3.61154E+02         9.30809E+01         2.68073E+02
+          1.32701E-02         1.55197E-03        -5.22529E-03         8.33782E-01         3.16838E-01         8.33798E-01         3.53172E+02         1.00000E+00         1.49957E-02         3.53172E+02         9.09634E+01         2.62208E+02
+          1.32701E-02         1.72180E-03        -5.24275E-03         8.33782E-01         3.27508E-01         8.33798E-01         3.45076E+02         1.00000E+00         1.48454E-02         3.45076E+02         8.88153E+01         2.56261E+02
+          1.32701E-02         1.89163E-03        -5.26203E-03         8.33781E-01         3.38179E-01         8.33798E-01         3.36881E+02         1.00000E+00         1.46935E-02         3.36881E+02         8.66399E+01         2.50241E+02
+          1.32701E-02         2.06146E-03        -5.28312E-03         8.33781E-01         3.48849E-01         8.33798E-01         3.28599E+02         1.00000E+00         1.45402E-02         3.28599E+02         8.44410E+01         2.44158E+02
+          1.32701E-02         2.23128E-03        -5.30602E-03         8.33781E-01         3.59520E-01         8.33798E-01         3.20245E+02         1.00000E+00         1.43858E-02         3.20245E+02         8.22219E+01         2.38023E+02
+          1.32701E-02         2.40111E-03        -5.33073E-03         8.33780E-01         3.70190E-01         8.33797E-01         3.11831E+02         1.00000E+00         1.42306E-02         3.11831E+02         7.99862E+01         2.31845E+02
+          1.32701E-02         2.57094E-03        -5.35726E-03         8.33780E-01         3.80861E-01         8.33797E-01         3.03371E+02         1.00000E+00         1.40748E-02         3.03371E+02         7.77374E+01         2.25634E+02
+          1.32701E-02         2.74077E-03        -5.38560E-03         8.33780E-01         3.91532E-01         8.33797E-01         2.94878E+02         1.00000E+00         1.39187E-02         2.94878E+02         7.54789E+01         2.19399E+02
+          1.32701E-02         2.91059E-03        -5.41575E-03         8.33779E-01         4.02202E-01         8.33797E-01         2.86364E+02         1.00000E+00         1.37625E-02         2.86364E+02         7.32144E+01         2.13150E+02
+          1.32701E-02         3.08042E-03        -5.44771E-03         8.33779E-01         4.12873E-01         8.33797E-01         2.77843E+02         1.00000E+00         1.36066E-02         2.77843E+02         7.09470E+01         2.06896E+02
+          1.32701E-02         3.25025E-03        -5.48148E-03         8.33778E-01         4.23543E-01         8.33796E-01         2.69328E+02         1.00000E+00         1.34510E-02         2.69328E+02         6.86803E+01         2.00647E+02
+          1.32701E-02         3.42008E-03        -5.51706E-03         8.33778E-01         4.34214E-01         8.33796E-01         2.60830E+02         1.00000E+00         1.32961E-02         2.60830E+02         6.64174E+01         1.94412E+02
+          1.32701E-02         3.58990E-03        -5.55446E-03         8.33777E-01         4.44884E-01         8.33796E-01         2.52362E+02         1.00000E+00         1.31421E-02         2.52362E+02         6.41618E+01         1.88200E+02
+          1.32701E-02         3.75973E-03        -5.59367E-03         8.33777E-01         4.55555E-01         8.33796E-01         2.43935E+02         1.00000E+00         1.29892E-02         2.43935E+02         6.19164E+01         1.82019E+02
+          1.32701E-02         3.92956E-03        -5.63469E-03         8.33776E-01         4.66225E-01         8.33795E-01         2.35562E+02         1.00000E+00         1.28377E-02         2.35562E+02         5.96846E+01         1.75878E+02
+          1.32701E-02         4.09939E-03        -5.67753E-03         8.33776E-01         4.76896E-01         8.33795E-01         2.27254E+02         1.00000E+00         1.26877E-02         2.27254E+02         5.74692E+01         1.69785E+02
+          1.32701E-02         4.26921E-03        -5.72217E-03         8.33775E-01         4.87567E-01         8.33795E-01         2.19021E+02         1.00000E+00         1.25395E-02         2.19021E+02         5.52732E+01         1.63748E+02
+          1.32701E-02         4.43904E-03        -5.76863E-03         8.33775E-01         4.98237E-01         8.33795E-01         2.10875E+02         1.00000E+00         1.23932E-02         2.10875E+02         5.30996E+01         1.57775E+02
+          1.32701E-02         4.60887E-03        -5.81690E-03         8.33774E-01         5.08908E-01         8.33794E-01         2.02824E+02         1.00000E+00         1.22491E-02         2.02824E+02         5.09509E+01         1.51873E+02
+          1.32701E-02         4.77869E-03        -5.86698E-03         8.33773E-01         5.19578E-01         8.33794E-01         1.94880E+02         1.00000E+00         1.21073E-02         1.94880E+02         4.88300E+01         1.46050E+02
+          1.32701E-02         4.94852E-03        -5.91887E-03         8.33773E-01         5.30249E-01         8.33794E-01         1.87051E+02         1.00000E+00         1.19680E-02         1.87051E+02         4.67393E+01         1.40312E+02
+          1.32701E-02         5.11835E-03        -5.97258E-03         8.33772E-01         5.40919E-01         8.33793E-01         1.79346E+02         1.00000E+00         1.18313E-02         1.79346E+02         4.46812E+01         1.34665E+02
+          1.32701E-02         5.28818E-03        -6.02810E-03         8.33771E-01         5.51590E-01         8.33793E-01         1.71775E+02         1.00000E+00         1.16975E-02         1.71775E+02         4.26581E+01         1.29117E+02
+          1.32701E-02         5.45800E-03        -6.08543E-03         8.33770E-01         5.62261E-01         8.33793E-01         1.64344E+02         1.00000E+00         1.15665E-02         1.64344E+02         4.06723E+01         1.23672E+02
+          1.32701E-02         5.62783E-03        -6.14457E-03         8.33770E-01         5.72931E-01         8.33792E-01         1.57061E+02         1.00000E+00         1.14387E-02         1.57061E+02         3.87256E+01         1.18336E+02
+          1.32701E-02         5.79766E-03        -6.20552E-03         8.33769E-01         5.83602E-01         8.33792E-01         1.49934E+02         1.00000E+00         1.13140E-02         1.49934E+02         3.68202E+01         1.13114E+02
+          1.32701E-02         5.96749E-03        -6.26829E-03         8.33768E-01         5.94272E-01         8.33792E-01         1.42969E+02         1.00000E+00         1.11927E-02         1.42969E+02         3.49578E+01         1.08011E+02
+          1.32701E-02         6.13731E-03        -6.33287E-03         8.33767E-01         6.04943E-01         8.33791E-01         1.36172E+02         1.00000E+00         1.10747E-02         1.36172E+02         3.31402E+01         1.03032E+02
+          1.32701E-02         6.30714E-03        -6.39926E-03         8.33766E-01         6.15613E-01         8.33791E-01         1.29549E+02         1.00000E+00         1.09603E-02         1.29549E+02         3.13688E+01         9.81800E+01
+          1.32701E-02         6.47697E-03        -6.46746E-03         8.33765E-01         6.26284E-01         8.33790E-01         1.23104E+02         1.00000E+00         1.08494E-02         1.23104E+02         2.96451E+01         9.34590E+01
+          1.32701E-02         6.64680E-03        -6.53747E-03         8.33764E-01         6.36955E-01         8.33790E-01         1.16843E+02         1.00000E+00         1.07422E-02         1.16843E+02         2.79705E+01         8.88722E+01
+          1.32701E-02         6.81662E-03        -6.60930E-03         8.33763E-01         6.47625E-01         8.33790E-01         1.10769E+02         1.00000E+00         1.06387E-02         1.10769E+02         2.63460E+01         8.44226E+01
+          1.32701E-02         6.98645E-03        -6.68294E-03         8.33762E-01         6.58296E-01         8.33789E-01         1.04885E+02         1.00000E+00         1.05389E-02         1.04885E+02         2.47728E+01         8.01126E+01
+          1.32701E-02         7.15628E-03        -6.75839E-03         8.33761E-01         6.68966E-01         8.33789E-01         9.91961E+01         1.00000E+00         1.04430E-02         9.91961E+01         2.32516E+01         7.59445E+01
+          1.32701E-02         7.32611E-03        -6.83565E-03         8.33760E-01         6.79637E-01         8.33788E-01         9.37031E+01         1.00000E+00         1.03509E-02         9.37031E+01         2.17833E+01         7.19199E+01
+          1.32701E-02         7.49593E-03        -6.91473E-03         8.33759E-01         6.90307E-01         8.33788E-01         8.84087E+01         1.00000E+00         1.02627E-02         8.84087E+01         2.03684E+01         6.80403E+01
+          1.32701E-02         7.66576E-03        -6.99561E-03         8.33758E-01         7.00978E-01         8.33788E-01         8.33142E+01         1.00000E+00         1.01784E-02         8.33142E+01         1.90075E+01         6.43067E+01
+          1.32701E-02         7.83559E-03        -7.07831E-03         8.33757E-01         7.11649E-01         8.33787E-01         7.84208E+01         1.00000E+00         1.00979E-02         7.84208E+01         1.77010E+01         6.07199E+01
+          1.32701E-02         8.00542E-03        -7.16282E-03         8.33756E-01         7.22319E-01         8.33787E-01         7.37291E+01         1.00000E+00         1.00214E-02         7.37291E+01         1.64490E+01         5.72801E+01
+          1.32701E-02         8.17524E-03        -7.24915E-03         8.33755E-01         7.32990E-01         8.33786E-01         6.92391E+01         1.00000E+00         9.94880E-03         6.92391E+01         1.52516E+01         5.39875E+01
+          1.32701E-02         8.34507E-03        -7.33728E-03         8.33754E-01         7.43660E-01         8.33786E-01         6.49506E+01         1.00000E+00         9.88009E-03         6.49506E+01         1.41090E+01         5.08417E+01
+          1.32701E-02         8.51490E-03        -7.42723E-03         8.33753E-01         7.54331E-01         8.33786E-01         6.08628E+01         1.00000E+00         9.81526E-03         6.08628E+01         1.30208E+01         4.78420E+01
+          1.32701E-02         8.68473E-03        -7.51899E-03         8.33751E-01         7.65001E-01         8.33785E-01         5.69744E+01         1.00000E+00         9.75428E-03         5.69744E+01         1.19869E+01         4.49875E+01
+          1.32701E-02         8.85455E-03        -7.61256E-03         8.33750E-01         7.75672E-01         8.33785E-01         5.32839E+01         1.00000E+00         9.69715E-03         5.32839E+01         1.10069E+01         4.22770E+01
+          1.32701E-02         9.02438E-03        -7.70795E-03         8.33749E-01         7.86343E-01         8.33784E-01         4.97893E+01         1.00000E+00         9.64381E-03         4.97893E+01         1.00803E+01         3.97089E+01
+          1.32701E-02         9.19421E-03        -7.80515E-03         8.33748E-01         7.97013E-01         8.33784E-01         4.64881E+01         1.00000E+00         9.59424E-03         4.64881E+01         9.20662E+00         3.72814E+01
+          1.32701E-02         9.36403E-03        -7.90415E-03         8.33746E-01         8.07684E-01         8.33784E-01         4.33775E+01         1.00000E+00         9.54840E-03         4.33775E+01         8.38504E+00         3.49925E+01
+          1.32701E-02         9.53386E-03        -8.00498E-03         8.33745E-01         8.18354E-01         8.33783E-01         4.04545E+01         1.00000E+00         9.50624E-03         4.04545E+01         7.61484E+00         3.28397E+01
+          1.32701E-02         9.70369E-03        -8.10761E-03         8.33744E-01         8.29025E-01         8.33783E-01         3.77156E+01         1.00000E+00         9.46771E-03         3.77156E+01         6.89513E+00         3.08205E+01
+          1.32701E-02         9.87352E-03        -8.21206E-03         8.33742E-01         8.39695E-01         8.33783E-01         3.51570E+01         1.00000E+00         9.43277E-03         3.51570E+01         6.22495E+00         2.89321E+01
+          1.32701E-02         1.00433E-02        -8.31831E-03         8.33741E-01         8.50366E-01         8.33782E-01         3.27747E+01         1.00000E+00         9.40136E-03         3.27747E+01         5.60325E+00         2.71715E+01
+          1.32701E-02         1.02132E-02        -8.42638E-03         8.33739E-01         8.61037E-01         8.33782E-01         3.05644E+01         1.00000E+00         9.37342E-03         3.05644E+01         5.02892E+00         2.55355E+01
+          1.32701E-02         1.03830E-02        -8.53627E-03         8.33738E-01         8.71707E-01         8.33782E-01         2.85213E+01         1.00000E+00         9.34889E-03         2.85213E+01         4.50074E+00         2.40206E+01
+          1.32701E-02         1.05528E-02        -8.64796E-03         8.33736E-01         8.82378E-01         8.33781E-01         2.66408E+01         1.00000E+00         9.32771E-03         2.66408E+01         4.01745E+00         2.26234E+01
+          1.32701E-02         1.07227E-02        -8.76147E-03         8.33735E-01         8.93048E-01         8.33781E-01         2.49177E+01         1.00000E+00         9.30982E-03         2.49177E+01         3.57772E+00         2.13400E+01
+          1.32701E-02         1.08925E-02        -8.87679E-03         8.33733E-01         9.03719E-01         8.33781E-01         2.33468E+01         1.00000E+00         9.29514E-03         2.33468E+01         3.18017E+00         2.01666E+01
+          1.32701E-02         1.10623E-02        -8.99392E-03         8.33732E-01         9.14389E-01         8.33780E-01         2.19227E+01         1.00000E+00         9.28362E-03         2.19227E+01         2.82335E+00         1.90994E+01
+          1.32701E-02         1.12321E-02        -9.11286E-03         8.33730E-01         9.25060E-01         8.33780E-01         2.06398E+01         1.00000E+00         9.27518E-03         2.06398E+01         2.50579E+00         1.81340E+01
+          1.32701E-02         1.14020E-02        -9.23362E-03         8.33729E-01         9.35731E-01         8.33780E-01         1.94923E+01         1.00000E+00         9.26975E-03         1.94923E+01         2.22595E+00         1.72664E+01
+          1.32701E-02         1.15718E-02        -9.35619E-03         8.33727E-01         9.46401E-01         8.33779E-01         1.84745E+01         1.00000E+00         9.26726E-03         1.84745E+01         1.98227E+00         1.64923E+01
+          1.32701E-02         1.17416E-02        -9.48057E-03         8.33725E-01         9.57072E-01         8.33779E-01         1.75805E+01         1.00000E+00         9.26763E-03         1.75805E+01         1.77316E+00         1.58073E+01
+          1.32701E-02         1.19114E-02        -9.60676E-03         8.33724E-01         9.67742E-01         8.33779E-01         1.68041E+01         1.00000E+00         9.27078E-03         1.68041E+01         1.59701E+00         1.52071E+01
+          1.32701E-02         1.20813E-02        -9.73477E-03         8.33722E-01         9.78413E-01         8.33779E-01         1.61394E+01         1.00000E+00         9.27665E-03         1.61394E+01         1.45218E+00         1.46872E+01
+          1.32701E-02         1.22511E-02        -9.86459E-03         8.33720E-01         9.89083E-01         8.33779E-01         1.55802E+01         1.00000E+00         9.28514E-03         1.55802E+01         1.33702E+00         1.42432E+01
+          1.32701E-02         1.24209E-02        -9.99622E-03         8.33718E-01         9.99754E-01         8.33778E-01         1.51205E+01         1.00000E+00         9.29619E-03         1.51205E+01         1.24986E+00         1.38706E+01
+          1.32701E-02         1.25908E-02        -1.01297E-02         8.33717E-01         1.01042E+00         8.33778E-01         1.47541E+01         1.00000E+00         9.30970E-03         1.47541E+01         1.18906E+00         1.35650E+01
+          1.32701E-02         1.27606E-02        -1.02649E-02         8.33715E-01         1.02110E+00         8.33778E-01         1.44749E+01         1.00000E+00         9.32561E-03         1.44749E+01         1.15295E+00         1.33220E+01
+          1.32701E-02         1.29304E-02        -1.04020E-02         8.33713E-01         1.03177E+00         8.33778E-01         1.42769E+01         1.00000E+00         9.34382E-03         1.42769E+01         1.13987E+00         1.31371E+01
+          1.32701E-02         1.31002E-02        -1.05409E-02         8.33711E-01         1.04244E+00         8.33778E-01         1.41541E+01         1.00000E+00         9.36425E-03         1.41541E+01         1.14817E+00         1.30059E+01
+          1.32701E-02         1.32701E-02        -1.06816E-02         8.33709E-01         1.05311E+00         8.33778E-01         1.41004E+01         1.00000E+00         9.38682E-03         1.41004E+01         1.17622E+00         1.29242E+01
+          1.32701E-02         1.34399E-02        -1.08241E-02         8.33707E-01         1.06378E+00         8.33778E-01         1.41100E+01         1.00000E+00         9.41144E-03         1.41100E+01         1.22242E+00         1.28876E+01
+          1.32701E-02         1.36097E-02        -1.09684E-02         8.33706E-01         1.07445E+00         8.33778E-01         1.41773E+01         1.00000E+00         9.43803E-03         1.41773E+01         1.28517E+00         1.28921E+01
+          1.32701E-02         1.37795E-02        -1.11145E-02         8.33704E-01         1.08512E+00         8.33778E-01         1.42964E+01         1.00000E+00         9.46650E-03         1.42964E+01         1.36292E+00         1.29335E+01
+          1.32701E-02         1.39494E-02        -1.12625E-02         8.33702E-01         1.09579E+00         8.33778E-01         1.44619E+01         1.00000E+00         9.49676E-03         1.44619E+01         1.45412E+00         1.30078E+01
+          1.32701E-02         1.41192E-02        -1.14122E-02         8.33700E-01         1.10646E+00         8.33778E-01         1.46685E+01         1.00000E+00         9.52873E-03         1.46684E+01         1.55729E+00         1.31112E+01
+          1.32701E-02         1.42890E-02        -1.15638E-02         8.33698E-01         1.11713E+00         8.33778E-01         1.49107E+01         1.00000E+00         9.56232E-03         1.49107E+01         1.67096E+00         1.32397E+01
+          1.32701E-02         1.44589E-02        -1.17172E-02         8.33696E-01         1.12780E+00         8.33778E-01         1.51836E+01         1.00000E+00         9.59744E-03         1.51836E+01         1.79371E+00         1.33899E+01
+          1.32701E-02         1.46287E-02        -1.18724E-02         8.33694E-01         1.13847E+00         8.33778E-01         1.54822E+01         1.00000E+00         9.63400E-03         1.54822E+01         1.92417E+00         1.35581E+01
+          1.32701E-02         1.47985E-02        -1.20294E-02         8.33691E-01         1.14914E+00         8.33778E-01         1.58019E+01         1.00000E+00         9.67191E-03         1.58019E+01         2.06102E+00         1.37409E+01
+          1.32701E-02         1.49683E-02        -1.21882E-02         8.33689E-01         1.15981E+00         8.33778E-01         1.61380E+01         1.00000E+00         9.71108E-03         1.61380E+01         2.20296E+00         1.39350E+01
+          1.32701E-02         1.51382E-02        -1.23488E-02         8.33687E-01         1.17048E+00         8.33779E-01         1.64861E+01         1.00000E+00         9.75144E-03         1.64861E+01         2.34876E+00         1.41374E+01
+          1.32701E-02         1.53080E-02        -1.25113E-02         8.33685E-01         1.18115E+00         8.33779E-01         1.68422E+01         1.00000E+00         9.79288E-03         1.68422E+01         2.49726E+00         1.43450E+01
+          1.32701E-02         1.54778E-02        -1.26755E-02         8.33683E-01         1.19182E+00         8.33779E-01         1.72023E+01         1.00000E+00         9.83532E-03         1.72023E+01         2.64732E+00         1.45550E+01
+          1.32701E-02         1.56476E-02        -1.28416E-02         8.33681E-01         1.20249E+00         8.33780E-01         1.75626E+01         1.00000E+00         9.87868E-03         1.75626E+01         2.79787E+00         1.47647E+01
+          1.32701E-02         1.58175E-02        -1.30095E-02         8.33678E-01         1.21317E+00         8.33780E-01         1.79195E+01         1.00000E+00         9.92286E-03         1.79195E+01         2.94790E+00         1.49716E+01
+          1.32701E-02         1.59873E-02        -1.31792E-02         8.33676E-01         1.22384E+00         8.33780E-01         1.82699E+01         1.00000E+00         9.96778E-03         1.82699E+01         3.09646E+00         1.51735E+01
+          1.32701E-02         1.61571E-02        -1.33507E-02         8.33674E-01         1.23451E+00         8.33781E-01         1.86106E+01         1.00000E+00         1.00134E-02         1.86106E+01         3.24265E+00         1.53679E+01
+          1.32701E-02         1.63270E-02        -1.35240E-02         8.33672E-01         1.24518E+00         8.33781E-01         1.89387E+01         1.00000E+00         1.00595E-02         1.89387E+01         3.38563E+00         1.55531E+01
+          1.32701E-02         1.64968E-02        -1.36991E-02         8.33669E-01         1.25585E+00         8.33782E-01         1.92516E+01         1.00000E+00         1.01061E-02         1.92516E+01         3.52462E+00         1.57270E+01
+          1.32701E-02         1.66666E-02        -1.38761E-02         8.33667E-01         1.26652E+00         8.33782E-01         1.95469E+01         1.00000E+00         1.01532E-02         1.95468E+01         3.65890E+00         1.58879E+01
+          1.32701E-02         1.68364E-02        -1.40548E-02         8.33665E-01         1.27719E+00         8.33783E-01         1.98223E+01         1.00000E+00         1.02005E-02         1.98223E+01         3.78782E+00         1.60344E+01
+          1.32701E-02         1.70063E-02        -1.42354E-02         8.33662E-01         1.28786E+00         8.33784E-01         2.00759E+01         1.00000E+00         1.02481E-02         2.00759E+01         3.91077E+00         1.61651E+01
+          1.32701E-02         1.71761E-02        -1.44178E-02         8.33660E-01         1.29853E+00         8.33784E-01         2.03059E+01         1.00000E+00         1.02959E-02         2.03059E+01         4.02721E+00         1.62786E+01
+          1.32701E-02         1.73459E-02        -1.46020E-02         8.33657E-01         1.30920E+00         8.33785E-01         2.05107E+01         1.00000E+00         1.03437E-02         2.05107E+01         4.13664E+00         1.63741E+01
+          1.32701E-02         1.75158E-02        -1.47880E-02         8.33655E-01         1.31987E+00         8.33786E-01         2.06891E+01         1.00000E+00         1.03916E-02         2.06891E+01         4.23865E+00         1.64504E+01
+          1.32701E-02         1.76856E-02        -1.49758E-02         8.33652E-01         1.33054E+00         8.33787E-01         2.08399E+01         1.00000E+00         1.04394E-02         2.08399E+01         4.33286E+00         1.65070E+01
+          1.32701E-02         1.78554E-02        -1.51654E-02         8.33650E-01         1.34121E+00         8.33788E-01         2.09621E+01         1.00000E+00         1.04870E-02         2.09621E+01         4.41895E+00         1.65431E+01
+          1.32701E-02         1.80252E-02        -1.53569E-02         8.33647E-01         1.35188E+00         8.33789E-01         2.10551E+01         1.00000E+00         1.05345E-02         2.10550E+01         4.49665E+00         1.65584E+01
+          1.32701E-02         1.81951E-02        -1.55501E-02         8.33645E-01         1.36255E+00         8.33790E-01         2.11182E+01         1.00000E+00         1.05817E-02         2.11182E+01         4.56575E+00         1.65524E+01
+          1.32701E-02         1.83649E-02        -1.57452E-02         8.33642E-01         1.37322E+00         8.33791E-01         2.11511E+01         1.00000E+00         1.06285E-02         2.11511E+01         4.62609E+00         1.65250E+01
+          1.32701E-02         1.85347E-02        -1.59421E-02         8.33640E-01         1.38389E+00         8.33792E-01         2.11537E+01         1.00000E+00         1.06749E-02         2.11537E+01         4.67755E+00         1.64762E+01
+          1.32701E-02         1.87045E-02        -1.61408E-02         8.33637E-01         1.39457E+00         8.33793E-01         2.11260E+01         1.00000E+00         1.07208E-02         2.11259E+01         4.72006E+00         1.64059E+01
+          1.32701E-02         1.88744E-02        -1.63413E-02         8.33634E-01         1.40524E+00         8.33794E-01         2.10680E+01         1.00000E+00         1.07662E-02         2.10680E+01         4.75360E+00         1.63144E+01
+          1.32701E-02         1.90442E-02        -1.65436E-02         8.33632E-01         1.41591E+00         8.33796E-01         2.09801E+01         1.00000E+00         1.08110E-02         2.09801E+01         4.77818E+00         1.62019E+01
+          1.32701E-02         1.92140E-02        -1.67478E-02         8.33629E-01         1.42658E+00         8.33797E-01         2.08627E+01         1.00000E+00         1.08551E-02         2.08627E+01         4.79386E+00         1.60688E+01
+          1.32701E-02         1.93839E-02        -1.69537E-02         8.33626E-01         1.43725E+00         8.33799E-01         2.07165E+01         1.00000E+00         1.08986E-02         2.07165E+01         4.80074E+00         1.59157E+01
+          1.32701E-02         1.95537E-02        -1.71615E-02         8.33623E-01         1.44792E+00         8.33800E-01         2.05421E+01         1.00000E+00         1.09412E-02         2.05421E+01         4.79896E+00         1.57431E+01
+          1.32701E-02         1.97235E-02        -1.73711E-02         8.33621E-01         1.45859E+00         8.33802E-01         2.03404E+01         1.00000E+00         1.09830E-02         2.03404E+01         4.78867E+00         1.55518E+01
+          1.32701E-02         1.98933E-02        -1.75824E-02         8.33618E-01         1.46926E+00         8.33803E-01         2.01125E+01         1.00000E+00         1.10240E-02         2.01125E+01         4.77008E+00         1.53424E+01
+          1.32701E-02         2.00632E-02        -1.77957E-02         8.33615E-01         1.47993E+00         8.33805E-01         1.98592E+01         1.00000E+00         1.10640E-02         1.98592E+01         4.74342E+00         1.51158E+01
+          1.32701E-02         2.02330E-02        -1.80107E-02         8.33612E-01         1.49060E+00         8.33807E-01         1.95818E+01         1.00000E+00         1.11031E-02         1.95818E+01         4.70893E+00         1.48728E+01
+          1.32701E-02         2.04028E-02        -1.82275E-02         8.33609E-01         1.50127E+00         8.33808E-01         1.92815E+01         1.00000E+00         1.11411E-02         1.92815E+01         4.66690E+00         1.46146E+01
+          1.32701E-02         2.05726E-02        -1.84461E-02         8.33606E-01         1.51194E+00         8.33810E-01         1.89596E+01         1.00000E+00         1.11780E-02         1.89596E+01         4.61764E+00         1.43420E+01
+          1.32701E-02         2.07425E-02        -1.86666E-02         8.33603E-01         1.52261E+00         8.33812E-01         1.86176E+01         1.00000E+00         1.12139E-02         1.86176E+01         4.56145E+00         1.40561E+01
+          1.32701E-02         2.09123E-02        -1.88889E-02         8.33600E-01         1.53328E+00         8.33814E-01         1.82568E+01         1.00000E+00         1.12486E-02         1.82568E+01         4.49867E+00         1.37581E+01
+          1.32701E-02         2.10821E-02        -1.91129E-02         8.33597E-01         1.54395E+00         8.33817E-01         1.78787E+01         1.00000E+00         1.12821E-02         1.78787E+01         4.42968E+00         1.34490E+01
+          1.32701E-02         2.12520E-02        -1.93388E-02         8.33594E-01         1.55462E+00         8.33819E-01         1.74849E+01         1.00000E+00         1.13144E-02         1.74849E+01         4.35482E+00         1.31301E+01
+          1.32701E-02         2.14218E-02        -1.95666E-02         8.33591E-01         1.56529E+00         8.33821E-01         1.70770E+01         1.00000E+00         1.13455E-02         1.70770E+01         4.27448E+00         1.28025E+01
+          1.32701E-02         2.15916E-02        -1.97961E-02         8.33588E-01         1.57596E+00         8.33823E-01         1.66564E+01         1.00000E+00         1.13752E-02         1.66564E+01         4.18905E+00         1.24674E+01
+          1.32701E-02         2.17614E-02        -2.00274E-02         8.33585E-01         1.58664E+00         8.33826E-01         1.62248E+01         1.00000E+00         1.14036E-02         1.62249E+01         4.09891E+00         1.21259E+01
+          1.32701E-02         2.19313E-02        -2.02606E-02         8.33582E-01         1.59731E+00         8.33828E-01         1.57839E+01         1.00000E+00         1.14307E-02         1.57839E+01         4.00448E+00         1.17794E+01
+          1.32701E-02         2.21011E-02        -2.04955E-02         8.33579E-01         1.60798E+00         8.33831E-01         1.53352E+01         1.00000E+00         1.14563E-02         1.53352E+01         3.90614E+00         1.14290E+01
+          1.32701E-02         2.22709E-02        -2.07323E-02         8.33576E-01         1.61865E+00         8.33834E-01         1.48803E+01         1.00000E+00         1.14805E-02         1.48803E+01         3.80431E+00         1.10760E+01
+          1.32701E-02         2.24407E-02        -2.09709E-02         8.33573E-01         1.62932E+00         8.33837E-01         1.44208E+01         1.00000E+00         1.15033E-02         1.44208E+01         3.69938E+00         1.07214E+01
+          1.32701E-02         2.26106E-02        -2.12113E-02         8.33570E-01         1.63999E+00         8.33839E-01         1.39582E+01         1.00000E+00         1.15246E-02         1.39582E+01         3.59176E+00         1.03664E+01
+          1.32701E-02         2.27804E-02        -2.14535E-02         8.33566E-01         1.65066E+00         8.33842E-01         1.34941E+01         1.00000E+00         1.15444E-02         1.34941E+01         3.48184E+00         1.00123E+01
+          1.32701E-02         2.29502E-02        -2.16975E-02         8.33563E-01         1.66133E+00         8.33846E-01         1.30301E+01         1.00000E+00         1.15627E-02         1.30301E+01         3.37001E+00         9.66005E+00
+          1.32701E-02         2.31201E-02        -2.19434E-02         8.33560E-01         1.67200E+00         8.33849E-01         1.25674E+01         1.00000E+00         1.15794E-02         1.25674E+01         3.25664E+00         9.31077E+00
+          1.32701E-02         2.32899E-02        -2.21910E-02         8.33557E-01         1.68267E+00         8.33852E-01         1.21076E+01         1.00000E+00         1.15946E-02         1.21076E+01         3.14213E+00         8.96550E+00
+          1.32701E-02         2.34597E-02        -2.24405E-02         8.33553E-01         1.69334E+00         8.33855E-01         1.16521E+01         1.00000E+00         1.16082E-02         1.16521E+01         3.02683E+00         8.62524E+00
+          1.32701E-02         2.36295E-02        -2.26918E-02         8.33550E-01         1.70401E+00         8.33859E-01         1.12020E+01         1.00000E+00         1.16202E-02         1.12020E+01         2.91109E+00         8.29094E+00
+          1.32701E-02         2.37994E-02        -2.29449E-02         8.33547E-01         1.71468E+00         8.33862E-01         1.07588E+01         1.00000E+00         1.16305E-02         1.07588E+01         2.79527E+00         7.96351E+00
+          1.32701E-02         2.39692E-02        -2.31998E-02         8.33543E-01         1.72535E+00         8.33866E-01         1.03235E+01         1.00000E+00         1.16392E-02         1.03235E+01         2.67968E+00         7.64380E+00
+          1.32701E-02         2.41390E-02        -2.34565E-02         8.33540E-01         1.73602E+00         8.33870E-01         9.89728E+00         1.00000E+00         1.16463E-02         9.89728E+00         2.56465E+00         7.33263E+00
+          1.32701E-02         2.43088E-02        -2.37150E-02         8.33536E-01         1.74669E+00         8.33874E-01         9.48121E+00         1.00000E+00         1.16517E-02         9.48122E+00         2.45047E+00         7.03075E+00
+          1.32701E-02         2.44787E-02        -2.39754E-02         8.33533E-01         1.75736E+00         8.33878E-01         9.07628E+00         1.00000E+00         1.16555E-02         9.07628E+00         2.33744E+00         6.73884E+00
+          1.32701E-02         2.46485E-02        -2.42375E-02         8.33529E-01         1.76804E+00         8.33882E-01         8.68338E+00         1.00000E+00         1.16575E-02         8.68338E+00         2.22583E+00         6.45755E+00
+          1.32701E-02         2.48183E-02        -2.45015E-02         8.33526E-01         1.77871E+00         8.33886E-01         8.30334E+00         1.00000E+00         1.16579E-02         8.30335E+00         2.11588E+00         6.18746E+00
+          1.32701E-02         2.49882E-02        -2.47673E-02         8.33522E-01         1.78938E+00         8.33890E-01         7.93694E+00         1.00000E+00         1.16566E-02         7.93695E+00         2.00785E+00         5.92909E+00
+          1.32701E-02         2.51580E-02        -2.50349E-02         8.33519E-01         1.80005E+00         8.33895E-01         7.58485E+00         1.00000E+00         1.16536E-02         7.58486E+00         1.90196E+00         5.68290E+00
+          1.32701E-02         2.53278E-02        -2.53043E-02         8.33515E-01         1.81072E+00         8.33899E-01         7.24768E+00         1.00000E+00         1.16489E-02         7.24768E+00         1.79840E+00         5.44928E+00
+          1.32701E-02         2.54976E-02        -2.55756E-02         8.33512E-01         1.82139E+00         8.33904E-01         6.92595E+00         1.00000E+00         1.16425E-02         6.92595E+00         1.69737E+00         5.22858E+00
+          1.32701E-02         2.56675E-02        -2.58486E-02         8.33508E-01         1.83206E+00         8.33909E-01         6.62012E+00         1.00000E+00         1.16344E-02         6.62012E+00         1.59905E+00         5.02107E+00
+          1.32701E-02         2.58373E-02        -2.61235E-02         8.33504E-01         1.84273E+00         8.33914E-01         6.33055E+00         1.00000E+00         1.16246E-02         6.33055E+00         1.50358E+00         4.82697E+00
+          1.32701E-02         2.60071E-02        -2.64002E-02         8.33501E-01         1.85340E+00         8.33919E-01         6.05755E+00         1.00000E+00         1.16131E-02         6.05756E+00         1.41112E+00         4.64644E+00
+          1.32701E-02         2.61769E-02        -2.66786E-02         8.33497E-01         1.86407E+00         8.33924E-01         5.80134E+00         1.00000E+00         1.15999E-02         5.80134E+00         1.32176E+00         4.47958E+00
+          1.34399E-02         8.72665E-04        -5.31607E-03         8.44453E-01         2.74155E-01         8.44470E-01         3.75592E+02         1.00000E+00         1.18053E-02         3.75592E+02         1.06334E+02         2.69258E+02
+          1.34399E-02         1.04249E-03        -5.32628E-03         8.44453E-01         2.84826E-01         8.44470E-01         3.68284E+02         1.00000E+00         1.17010E-02         3.68284E+02         1.04215E+02         2.64069E+02
+          1.34399E-02         1.21232E-03        -5.33831E-03         8.44453E-01         2.95496E-01         8.44470E-01         3.60827E+02         1.00000E+00         1.15947E-02         3.60827E+02         1.02052E+02         2.58775E+02
+          1.34399E-02         1.38215E-03        -5.35215E-03         8.44453E-01         3.06167E-01         8.44470E-01         3.53233E+02         1.00000E+00         1.14866E-02         3.53233E+02         9.98477E+01         2.53385E+02
+          1.34399E-02         1.55197E-03        -5.36781E-03         8.44452E-01         3.16838E-01         8.44469E-01         3.45515E+02         1.00000E+00         1.13770E-02         3.45515E+02         9.76068E+01         2.47908E+02
+          1.34399E-02         1.72180E-03        -5.38527E-03         8.44452E-01         3.27508E-01         8.44469E-01         3.37686E+02         1.00000E+00         1.12661E-02         3.37686E+02         9.53326E+01         2.42353E+02
+          1.34399E-02         1.89163E-03        -5.40455E-03         8.44452E-01         3.38179E-01         8.44469E-01         3.29758E+02         1.00000E+00         1.11540E-02         3.29758E+02         9.30287E+01         2.36729E+02
+          1.34399E-02         2.06146E-03        -5.42564E-03         8.44452E-01         3.48849E-01         8.44469E-01         3.21744E+02         1.00000E+00         1.10409E-02         3.21744E+02         9.06989E+01         2.31045E+02
+          1.34399E-02         2.23128E-03        -5.44854E-03         8.44451E-01         3.59520E-01         8.44469E-01         3.13657E+02         1.00000E+00         1.09271E-02         3.13657E+02         8.83468E+01         2.25310E+02
+          1.34399E-02         2.40111E-03        -5.47325E-03         8.44451E-01         3.70190E-01         8.44469E-01         3.05509E+02         1.00000E+00         1.08127E-02         3.05509E+02         8.59761E+01         2.19533E+02
+          1.34399E-02         2.57094E-03        -5.49978E-03         8.44451E-01         3.80861E-01         8.44468E-01         2.97315E+02         1.00000E+00         1.06980E-02         2.97315E+02         8.35904E+01         2.13724E+02
+          1.34399E-02         2.74077E-03        -5.52811E-03         8.44450E-01         3.91532E-01         8.44468E-01         2.89085E+02         1.00000E+00         1.05830E-02         2.89085E+02         8.11935E+01         2.07891E+02
+          1.34399E-02         2.91059E-03        -5.55826E-03         8.44450E-01         4.02202E-01         8.44468E-01         2.80832E+02         1.00000E+00         1.04681E-02         2.80832E+02         7.87889E+01         2.02043E+02
+          1.34399E-02         3.08042E-03        -5.59022E-03         8.44449E-01         4.12873E-01         8.44468E-01         2.72569E+02         1.00000E+00         1.03534E-02         2.72569E+02         7.63802E+01         1.96189E+02
+          1.34399E-02         3.25025E-03        -5.62400E-03         8.44449E-01         4.23543E-01         8.44468E-01         2.64309E+02         1.00000E+00         1.02390E-02         2.64309E+02         7.39709E+01         1.90338E+02
+          1.34399E-02         3.42008E-03        -5.65958E-03         8.44448E-01         4.34214E-01         8.44467E-01         2.56062E+02         1.00000E+00         1.01252E-02         2.56062E+02         7.15645E+01         1.84497E+02
+          1.34399E-02         3.58990E-03        -5.69698E-03         8.44448E-01         4.44884E-01         8.44467E-01         2.47840E+02         1.00000E+00         1.00121E-02         2.47840E+02         6.91645E+01         1.78675E+02
+          1.34399E-02         3.75973E-03        -5.73619E-03         8.44447E-01         4.55555E-01         8.44467E-01         2.39655E+02         1.00000E+00         9.89996E-03         2.39655E+02         6.67742E+01         1.72881E+02
+          1.34399E-02         3.92956E-03        -5.77721E-03         8.44447E-01         4.66225E-01         8.44467E-01         2.31519E+02         1.00000E+00         9.78884E-03         2.31519E+02         6.43968E+01         1.67122E+02
+          1.34399E-02         4.09939E-03        -5.82004E-03         8.44446E-01         4.76896E-01         8.44466E-01         2.23441E+02         1.00000E+00         9.67895E-03         2.23441E+02         6.20356E+01         1.61406E+02
+          1.34399E-02         4.26921E-03        -5.86469E-03         8.44446E-01         4.87567E-01         8.44466E-01         2.15434E+02         1.00000E+00         9.57042E-03         2.15434E+02         5.96937E+01         1.55740E+02
+          1.34399E-02         4.43904E-03        -5.91114E-03         8.44445E-01         4.98237E-01         8.44466E-01         2.07505E+02         1.00000E+00         9.46342E-03         2.07505E+02         5.73741E+01         1.50131E+02
+          1.34399E-02         4.60887E-03        -5.95941E-03         8.44444E-01         5.08908E-01         8.44465E-01         1.99667E+02         1.00000E+00         9.35808E-03         1.99667E+02         5.50798E+01         1.44587E+02
+          1.34399E-02         4.77869E-03        -6.00950E-03         8.44444E-01         5.19578E-01         8.44465E-01         1.91927E+02         1.00000E+00         9.25453E-03         1.91927E+02         5.28135E+01         1.39114E+02
+          1.34399E-02         4.94852E-03        -6.06139E-03         8.44443E-01         5.30249E-01         8.44465E-01         1.84296E+02         1.00000E+00         9.15290E-03         1.84296E+02         5.05780E+01         1.33718E+02
+          1.34399E-02         5.11835E-03        -6.11509E-03         8.44442E-01         5.40919E-01         8.44464E-01         1.76782E+02         1.00000E+00         9.05331E-03         1.76782E+02         4.83758E+01         1.28406E+02
+          1.34399E-02         5.28818E-03        -6.17061E-03         8.44442E-01         5.51590E-01         8.44464E-01         1.69392E+02         1.00000E+00         8.95587E-03         1.69392E+02         4.62095E+01         1.23183E+02
+          1.34399E-02         5.45800E-03        -6.22794E-03         8.44441E-01         5.62261E-01         8.44464E-01         1.62136E+02         1.00000E+00         8.86069E-03         1.62136E+02         4.40814E+01         1.18054E+02
+          1.34399E-02         5.62783E-03        -6.28708E-03         8.44440E-01         5.72931E-01         8.44463E-01         1.55020E+02         1.00000E+00         8.76786E-03         1.55020E+02         4.19937E+01         1.13026E+02
+          1.34399E-02         5.79766E-03        -6.34804E-03         8.44439E-01         5.83602E-01         8.44463E-01         1.48051E+02         1.00000E+00         8.67748E-03         1.48051E+02         3.99486E+01         1.08102E+02
+          1.34399E-02         5.96749E-03        -6.41080E-03         8.44438E-01         5.94272E-01         8.44463E-01         1.41235E+02         1.00000E+00         8.58962E-03         1.41235E+02         3.79479E+01         1.03287E+02
+          1.34399E-02         6.13731E-03        -6.47538E-03         8.44437E-01         6.04943E-01         8.44462E-01         1.34580E+02         1.00000E+00         8.50438E-03         1.34580E+02         3.59937E+01         9.85859E+01
+          1.34399E-02         6.30714E-03        -6.54177E-03         8.44437E-01         6.15613E-01         8.44462E-01         1.28089E+02         1.00000E+00         8.42180E-03         1.28089E+02         3.40875E+01         9.40016E+01
+          1.34399E-02         6.47697E-03        -6.60997E-03         8.44436E-01         6.26284E-01         8.44462E-01         1.21769E+02         1.00000E+00         8.34196E-03         1.21769E+02         3.22309E+01         8.95379E+01
+          1.34399E-02         6.64680E-03        -6.67999E-03         8.44435E-01         6.36955E-01         8.44461E-01         1.15623E+02         1.00000E+00         8.26490E-03         1.15623E+02         3.04254E+01         8.51978E+01
+          1.34399E-02         6.81662E-03        -6.75181E-03         8.44434E-01         6.47625E-01         8.44461E-01         1.09657E+02         1.00000E+00         8.19068E-03         1.09657E+02         2.86723E+01         8.09843E+01
+          1.34399E-02         6.98645E-03        -6.82545E-03         8.44433E-01         6.58296E-01         8.44460E-01         1.03872E+02         1.00000E+00         8.11933E-03         1.03872E+02         2.69726E+01         7.68996E+01
+          1.34399E-02         7.15628E-03        -6.90090E-03         8.44432E-01         6.68966E-01         8.44460E-01         9.82735E+01         1.00000E+00         8.05089E-03         9.82735E+01         2.53275E+01         7.29460E+01
+          1.34399E-02         7.32611E-03        -6.97817E-03         8.44431E-01         6.79637E-01         8.44460E-01         9.28630E+01         1.00000E+00         7.98539E-03         9.28630E+01         2.37377E+01         6.91253E+01
+          1.34399E-02         7.49593E-03        -7.05724E-03         8.44430E-01         6.90307E-01         8.44459E-01         8.76428E+01         1.00000E+00         7.92284E-03         8.76428E+01         2.22041E+01         6.54387E+01
+          1.34399E-02         7.66576E-03        -7.13813E-03         8.44429E-01         7.00978E-01         8.44459E-01         8.26147E+01         1.00000E+00         7.86326E-03         8.26147E+01         2.07272E+01         6.18875E+01
+          1.34399E-02         7.83559E-03        -7.22083E-03         8.44427E-01         7.11649E-01         8.44458E-01         7.77799E+01         1.00000E+00         7.80667E-03         7.77799E+01         1.93074E+01         5.84725E+01
+          1.34399E-02         8.00542E-03        -7.30534E-03         8.44426E-01         7.22319E-01         8.44458E-01         7.31391E+01         1.00000E+00         7.75305E-03         7.31391E+01         1.79452E+01         5.51940E+01
+          1.34399E-02         8.17524E-03        -7.39166E-03         8.44425E-01         7.32990E-01         8.44457E-01         6.86928E+01         1.00000E+00         7.70242E-03         6.86928E+01         1.66406E+01         5.20522E+01
+          1.34399E-02         8.34507E-03        -7.47980E-03         8.44424E-01         7.43660E-01         8.44457E-01         6.44407E+01         1.00000E+00         7.65477E-03         6.44407E+01         1.53938E+01         4.90470E+01
+          1.34399E-02         8.51490E-03        -7.56974E-03         8.44423E-01         7.54331E-01         8.44457E-01         6.03825E+01         1.00000E+00         7.61008E-03         6.03825E+01         1.42046E+01         4.61779E+01
+          1.34399E-02         8.68473E-03        -7.66150E-03         8.44422E-01         7.65001E-01         8.44456E-01         5.65171E+01         1.00000E+00         7.56834E-03         5.65171E+01         1.30729E+01         4.34442E+01
+          1.34399E-02         8.85455E-03        -7.75508E-03         8.44420E-01         7.75672E-01         8.44456E-01         5.28433E+01         1.00000E+00         7.52954E-03         5.28433E+01         1.19985E+01         4.08448E+01
+          1.34399E-02         9.02438E-03        -7.85046E-03         8.44419E-01         7.86343E-01         8.44455E-01         4.93592E+01         1.00000E+00         7.49364E-03         4.93592E+01         1.09807E+01         3.83785E+01
+          1.34399E-02         9.19421E-03        -7.94766E-03         8.44418E-01         7.97013E-01         8.44455E-01         4.60629E+01         1.00000E+00         7.46063E-03         4.60629E+01         1.00192E+01         3.60437E+01
+          1.34399E-02         9.36403E-03        -8.04667E-03         8.44416E-01         8.07684E-01         8.44455E-01         4.29519E+01         1.00000E+00         7.43046E-03         4.29519E+01         9.11325E+00         3.38386E+01
+          1.34399E-02         9.53386E-03        -8.14749E-03         8.44415E-01         8.18354E-01         8.44454E-01         4.00233E+01         1.00000E+00         7.40312E-03         4.00233E+01         8.26209E+00         3.17612E+01
+          1.34399E-02         9.70369E-03        -8.25012E-03         8.44414E-01         8.29025E-01         8.44454E-01         3.72741E+01         1.00000E+00         7.37857E-03         3.72741E+01         7.46490E+00         2.98092E+01
+          1.34399E-02         9.87352E-03        -8.35457E-03         8.44412E-01         8.39695E-01         8.44454E-01         3.47008E+01         1.00000E+00         7.35676E-03         3.47008E+01         6.72070E+00         2.79801E+01
+          1.34399E-02         1.00433E-02        -8.46082E-03         8.44411E-01         8.50366E-01         8.44453E-01         3.22998E+01         1.00000E+00         7.33765E-03         3.22998E+01         6.02847E+00         2.62713E+01
+          1.34399E-02         1.02132E-02        -8.56889E-03         8.44409E-01         8.61037E-01         8.44453E-01         3.00670E+01         1.00000E+00         7.32121E-03         3.00670E+01         5.38707E+00         2.46800E+01
+          1.34399E-02         1.03830E-02        -8.67878E-03         8.44408E-01         8.71707E-01         8.44452E-01         2.79983E+01         1.00000E+00         7.30739E-03         2.79983E+01         4.79531E+00         2.32030E+01
+          1.34399E-02         1.05528E-02        -8.79047E-03         8.44406E-01         8.82378E-01         8.44452E-01         2.60890E+01         1.00000E+00         7.29615E-03         2.60890E+01         4.25190E+00         2.18371E+01
+          1.34399E-02         1.07227E-02        -8.90398E-03         8.44405E-01         8.93048E-01         8.44452E-01         2.43347E+01         1.00000E+00         7.28743E-03         2.43347E+01         3.75550E+00         2.05792E+01
+          1.34399E-02         1.08925E-02        -9.01930E-03         8.44403E-01         9.03719E-01         8.44451E-01         2.27302E+01         1.00000E+00         7.28118E-03         2.27302E+01         3.30468E+00         1.94255E+01
+          1.34399E-02         1.10623E-02        -9.13643E-03         8.44402E-01         9.14389E-01         8.44451E-01         2.12707E+01         1.00000E+00         7.27736E-03         2.12707E+01         2.89799E+00         1.83727E+01
+          1.34399E-02         1.12321E-02        -9.25537E-03         8.44400E-01         9.25060E-01         8.44451E-01         1.99508E+01         1.00000E+00         7.27590E-03         1.99508E+01         2.53389E+00         1.74169E+01
+          1.34399E-02         1.14020E-02        -9.37613E-03         8.44398E-01         9.35731E-01         8.44451E-01         1.87652E+01         1.00000E+00         7.27677E-03         1.87652E+01         2.21081E+00         1.65544E+01
+          1.34399E-02         1.15718E-02        -9.49870E-03         8.44397E-01         9.46401E-01         8.44450E-01         1.77084E+01         1.00000E+00         7.27990E-03         1.77084E+01         1.92715E+00         1.57812E+01
+          1.34399E-02         1.17416E-02        -9.62308E-03         8.44395E-01         9.57072E-01         8.44450E-01         1.67747E+01         1.00000E+00         7.28523E-03         1.67747E+01         1.68126E+00         1.50935E+01
+          1.34399E-02         1.19114E-02        -9.74927E-03         8.44393E-01         9.67742E-01         8.44450E-01         1.59586E+01         1.00000E+00         7.29271E-03         1.59586E+01         1.47146E+00         1.44871E+01
+          1.34399E-02         1.20813E-02        -9.87728E-03         8.44392E-01         9.78413E-01         8.44450E-01         1.52542E+01         1.00000E+00         7.30228E-03         1.52542E+01         1.29605E+00         1.39582E+01
+          1.34399E-02         1.22511E-02        -1.00071E-02         8.44390E-01         9.89083E-01         8.44449E-01         1.46558E+01         1.00000E+00         7.31387E-03         1.46558E+01         1.15330E+00         1.35025E+01
+          1.34399E-02         1.24209E-02        -1.01387E-02         8.44388E-01         9.99754E-01         8.44449E-01         1.41576E+01         1.00000E+00         7.32744E-03         1.41576E+01         1.04150E+00         1.31161E+01
+          1.34399E-02         1.25908E-02        -1.02722E-02         8.44386E-01         1.01042E+00         8.44449E-01         1.37536E+01         1.00000E+00         7.34291E-03         1.37536E+01         9.58880E-01         1.27947E+01
+          1.34399E-02         1.27606E-02        -1.04074E-02         8.44385E-01         1.02110E+00         8.44449E-01         1.34380E+01         1.00000E+00         7.36023E-03         1.34380E+01         9.03711E-01         1.25343E+01
+          1.34399E-02         1.29304E-02        -1.05445E-02         8.44383E-01         1.03177E+00         8.44449E-01         1.32051E+01         1.00000E+00         7.37933E-03         1.32051E+01         8.74247E-01         1.23309E+01
+          1.34399E-02         1.31002E-02        -1.06834E-02         8.44381E-01         1.04244E+00         8.44448E-01         1.30491E+01         1.00000E+00         7.40015E-03         1.30491E+01         8.68751E-01         1.21803E+01
+          1.34399E-02         1.32701E-02        -1.08241E-02         8.44379E-01         1.05311E+00         8.44448E-01         1.29642E+01         1.00000E+00         7.42263E-03         1.29642E+01         8.85499E-01         1.20787E+01
+          1.34399E-02         1.34399E-02        -1.09666E-02         8.44377E-01         1.06378E+00         8.44448E-01         1.29447E+01         1.00000E+00         7.44669E-03         1.29447E+01         9.22782E-01         1.20219E+01
+          1.34399E-02         1.36097E-02        -1.11109E-02         8.44375E-01         1.07445E+00         8.44448E-01         1.29851E+01         1.00000E+00         7.47227E-03         1.29851E+01         9.78912E-01         1.20062E+01
+          1.34399E-02         1.37795E-02        -1.12570E-02         8.44373E-01         1.08512E+00         8.44448E-01         1.30799E+01         1.00000E+00         7.49931E-03         1.30799E+01         1.05223E+00         1.20277E+01
+          1.34399E-02         1.39494E-02        -1.14050E-02         8.44371E-01         1.09579E+00         8.44448E-01         1.32237E+01         1.00000E+00         7.52775E-03         1.32237E+01         1.14109E+00         1.20826E+01
+          1.34399E-02         1.41192E-02        -1.15547E-02         8.44369E-01         1.10646E+00         8.44448E-01         1.34112E+01         1.00000E+00         7.55750E-03         1.34112E+01         1.24391E+00         1.21673E+01
+          1.34399E-02         1.42890E-02        -1.17063E-02         8.44367E-01         1.11713E+00         8.44448E-01         1.36374E+01         1.00000E+00         7.58852E-03         1.36374E+01         1.35911E+00         1.22783E+01
+          1.34399E-02         1.44589E-02        -1.18597E-02         8.44365E-01         1.12780E+00         8.44448E-01         1.38972E+01         1.00000E+00         7.62072E-03         1.38972E+01         1.48516E+00         1.24120E+01
+          1.34399E-02         1.46287E-02        -1.20149E-02         8.44363E-01         1.13847E+00         8.44448E-01         1.41857E+01         1.00000E+00         7.65404E-03         1.41857E+01         1.62060E+00         1.25651E+01
+          1.34399E-02         1.47985E-02        -1.21719E-02         8.44361E-01         1.14914E+00         8.44449E-01         1.44984E+01         1.00000E+00         7.68842E-03         1.44984E+01         1.76397E+00         1.27344E+01
+          1.34399E-02         1.49683E-02        -1.23307E-02         8.44359E-01         1.15981E+00         8.44449E-01         1.48306E+01         1.00000E+00         7.72378E-03         1.48306E+01         1.91389E+00         1.29167E+01
+          1.34399E-02         1.51382E-02        -1.24913E-02         8.44357E-01         1.17048E+00         8.44449E-01         1.51781E+01         1.00000E+00         7.76007E-03         1.51781E+01         2.06902E+00         1.31091E+01
+          1.34399E-02         1.53080E-02        -1.26538E-02         8.44354E-01         1.18115E+00         8.44449E-01         1.55368E+01         1.00000E+00         7.79720E-03         1.55368E+01         2.22808E+00         1.33087E+01
+          1.34399E-02         1.54778E-02        -1.28180E-02         8.44352E-01         1.19182E+00         8.44449E-01         1.59026E+01         1.00000E+00         7.83512E-03         1.59026E+01         2.38984E+00         1.35127E+01
+          1.34399E-02         1.56476E-02        -1.29841E-02         8.44350E-01         1.20249E+00         8.44450E-01         1.62717E+01         1.00000E+00         7.87376E-03         1.62717E+01         2.55311E+00         1.37186E+01
+          1.34399E-02         1.58175E-02        -1.31520E-02         8.44348E-01         1.21317E+00         8.44450E-01         1.66407E+01         1.00000E+00         7.91305E-03         1.66407E+01         2.71680E+00         1.39239E+01
+          1.34399E-02         1.59873E-02        -1.33217E-02         8.44345E-01         1.22384E+00         8.44451E-01         1.70062E+01         1.00000E+00         7.95292E-03         1.70062E+01         2.87983E+00         1.41263E+01
+          1.34399E-02         1.61571E-02        -1.34932E-02         8.44343E-01         1.23451E+00         8.44451E-01         1.73649E+01         1.00000E+00         7.99332E-03         1.73649E+01         3.04122E+00         1.43237E+01
+          1.34399E-02         1.63270E-02        -1.36665E-02         8.44341E-01         1.24518E+00         8.44451E-01         1.77141E+01         1.00000E+00         8.03417E-03         1.77141E+01         3.20003E+00         1.45140E+01
+          1.34399E-02         1.64968E-02        -1.38416E-02         8.44338E-01         1.25585E+00         8.44452E-01         1.80508E+01         1.00000E+00         8.07541E-03         1.80508E+01         3.35538E+00         1.46954E+01
+          1.34399E-02         1.66666E-02        -1.40186E-02         8.44336E-01         1.26652E+00         8.44452E-01         1.83726E+01         1.00000E+00         8.11699E-03         1.83726E+01         3.50647E+00         1.48661E+01
+          1.34399E-02         1.68364E-02        -1.41973E-02         8.44334E-01         1.27719E+00         8.44453E-01         1.86772E+01         1.00000E+00         8.15883E-03         1.86772E+01         3.65254E+00         1.50246E+01
+          1.34399E-02         1.70063E-02        -1.43779E-02         8.44331E-01         1.28786E+00         8.44454E-01         1.89624E+01         1.00000E+00         8.20088E-03         1.89624E+01         3.79290E+00         1.51695E+01
+          1.34399E-02         1.71761E-02        -1.45603E-02         8.44329E-01         1.29853E+00         8.44454E-01         1.92263E+01         1.00000E+00         8.24307E-03         1.92263E+01         3.92694E+00         1.52994E+01
+          1.34399E-02         1.73459E-02        -1.47445E-02         8.44326E-01         1.30920E+00         8.44455E-01         1.94674E+01         1.00000E+00         8.28536E-03         1.94674E+01         4.05407E+00         1.54133E+01
+          1.34399E-02         1.75158E-02        -1.49305E-02         8.44324E-01         1.31987E+00         8.44456E-01         1.96840E+01         1.00000E+00         8.32767E-03         1.96839E+01         4.17380E+00         1.55102E+01
+          1.34399E-02         1.76856E-02        -1.51183E-02         8.44321E-01         1.33054E+00         8.44457E-01         1.98748E+01         1.00000E+00         8.36995E-03         1.98748E+01         4.28568E+00         1.55891E+01
+          1.34399E-02         1.78554E-02        -1.53079E-02         8.44319E-01         1.34121E+00         8.44457E-01         2.00388E+01         1.00000E+00         8.41215E-03         2.00388E+01         4.38931E+00         1.56495E+01
+          1.34399E-02         1.80252E-02        -1.54994E-02         8.44316E-01         1.35188E+00         8.44458E-01         2.01750E+01         1.00000E+00         8.45422E-03         2.01750E+01         4.48438E+00         1.56907E+01
+          1.34399E-02         1.81951E-02        -1.56926E-02         8.44314E-01         1.36255E+00         8.44459E-01         2.02828E+01         1.00000E+00         8.49609E-03         2.02828E+01         4.57059E+00         1.57122E+01
+          1.34399E-02         1.83649E-02        -1.58877E-02         8.44311E-01         1.37322E+00         8.44460E-01         2.03616E+01         1.00000E+00         8.53772E-03         2.03616E+01         4.64774E+00         1.57139E+01
+          1.34399E-02         1.85347E-02        -1.60846E-02         8.44308E-01         1.38389E+00         8.44461E-01         2.04110E+01         1.00000E+00         8.57905E-03         2.04110E+01         4.71564E+00         1.56954E+01
+          1.34399E-02         1.87045E-02        -1.62833E-02         8.44306E-01         1.39457E+00         8.44463E-01         2.04308E+01         1.00000E+00         8.62004E-03         2.04308E+01         4.77418E+00         1.56567E+01
+          1.34399E-02         1.88744E-02        -1.64838E-02         8.44303E-01         1.40524E+00         8.44464E-01         2.04211E+01         1.00000E+00         8.66065E-03         2.04211E+01         4.82328E+00         1.55978E+01
+          1.34399E-02         1.90442E-02        -1.66861E-02         8.44300E-01         1.41591E+00         8.44465E-01         2.03818E+01         1.00000E+00         8.70081E-03         2.03818E+01         4.86293E+00         1.55189E+01
+          1.34399E-02         1.92140E-02        -1.68903E-02         8.44297E-01         1.42658E+00         8.44466E-01         2.03133E+01         1.00000E+00         8.74049E-03         2.03133E+01         4.89314E+00         1.54202E+01
+          1.34399E-02         1.93839E-02        -1.70962E-02         8.44295E-01         1.43725E+00         8.44468E-01         2.02161E+01         1.00000E+00         8.77964E-03         2.02161E+01         4.91397E+00         1.53021E+01
+          1.34399E-02         1.95537E-02        -1.73040E-02         8.44292E-01         1.44792E+00         8.44469E-01         2.00905E+01         1.00000E+00         8.81822E-03         2.00905E+01         4.92552E+00         1.51650E+01
+          1.34399E-02         1.97235E-02        -1.75136E-02         8.44289E-01         1.45859E+00         8.44471E-01         1.99374E+01         1.00000E+00         8.85619E-03         1.99374E+01         4.92793E+00         1.50094E+01
+          1.34399E-02         1.98933E-02        -1.77249E-02         8.44286E-01         1.46926E+00         8.44472E-01         1.97574E+01         1.00000E+00         8.89351E-03         1.97574E+01         4.92138E+00         1.48360E+01
+          1.34399E-02         2.00632E-02        -1.79381E-02         8.44283E-01         1.47993E+00         8.44474E-01         1.95515E+01         1.00000E+00         8.93013E-03         1.95515E+01         4.90608E+00         1.46455E+01
+          1.34399E-02         2.02330E-02        -1.81532E-02         8.44280E-01         1.49060E+00         8.44476E-01         1.93207E+01         1.00000E+00         8.96603E-03         1.93207E+01         4.88225E+00         1.44385E+01
+          1.34399E-02         2.04028E-02        -1.83700E-02         8.44278E-01         1.50127E+00         8.44477E-01         1.90661E+01         1.00000E+00         9.00116E-03         1.90661E+01         4.85018E+00         1.42159E+01
+          1.34399E-02         2.05726E-02        -1.85886E-02         8.44275E-01         1.51194E+00         8.44479E-01         1.87887E+01         1.00000E+00         9.03548E-03         1.87887E+01         4.81014E+00         1.39786E+01
+          1.34399E-02         2.07425E-02        -1.88091E-02         8.44272E-01         1.52261E+00         8.44481E-01         1.84899E+01         1.00000E+00         9.06897E-03         1.84899E+01         4.76245E+00         1.37275E+01
+          1.34399E-02         2.09123E-02        -1.90314E-02         8.44269E-01         1.53328E+00         8.44483E-01         1.81710E+01         1.00000E+00         9.10159E-03         1.81710E+01         4.70746E+00         1.34635E+01
+          1.34399E-02         2.10821E-02        -1.92554E-02         8.44266E-01         1.54395E+00         8.44485E-01         1.78333E+01         1.00000E+00         9.13331E-03         1.78333E+01         4.64550E+00         1.31877E+01
+          1.34399E-02         2.12520E-02        -1.94813E-02         8.44263E-01         1.55462E+00         8.44487E-01         1.74782E+01         1.00000E+00         9.16410E-03         1.74782E+01         4.57696E+00         1.29012E+01
+          1.34399E-02         2.14218E-02        -1.97090E-02         8.44260E-01         1.56529E+00         8.44490E-01         1.71072E+01         1.00000E+00         9.19392E-03         1.71072E+01         4.50222E+00         1.26049E+01
+          1.34399E-02         2.15916E-02        -1.99386E-02         8.44256E-01         1.57596E+00         8.44492E-01         1.67217E+01         1.00000E+00         9.22276E-03         1.67217E+01         4.42167E+00         1.23001E+01
+          1.34399E-02         2.17614E-02        -2.01699E-02         8.44253E-01         1.58664E+00         8.44494E-01         1.63234E+01         1.00000E+00         9.25057E-03         1.63234E+01         4.33571E+00         1.19877E+01
+          1.34399E-02         2.19313E-02        -2.04030E-02         8.44250E-01         1.59731E+00         8.44497E-01         1.59136E+01         1.00000E+00         9.27734E-03         1.59136E+01         4.24476E+00         1.16688E+01
+          1.34399E-02         2.21011E-02        -2.06380E-02         8.44247E-01         1.60798E+00         8.44499E-01         1.54940E+01         1.00000E+00         9.30304E-03         1.54940E+01         4.14924E+00         1.13447E+01
+          1.34399E-02         2.22709E-02        -2.08748E-02         8.44244E-01         1.61865E+00         8.44502E-01         1.50660E+01         1.00000E+00         9.32764E-03         1.50660E+01         4.04956E+00         1.10165E+01
+          1.34399E-02         2.24407E-02        -2.11134E-02         8.44241E-01         1.62932E+00         8.44505E-01         1.46313E+01         1.00000E+00         9.35112E-03         1.46313E+01         3.94615E+00         1.06851E+01
+          1.34399E-02         2.26106E-02        -2.13538E-02         8.44237E-01         1.63999E+00         8.44507E-01         1.41913E+01         1.00000E+00         9.37346E-03         1.41913E+01         3.83942E+00         1.03518E+01
+          1.34399E-02         2.27804E-02        -2.15960E-02         8.44234E-01         1.65066E+00         8.44510E-01         1.37475E+01         1.00000E+00         9.39463E-03         1.37475E+01         3.72980E+00         1.00177E+01
+          1.34399E-02         2.29502E-02        -2.18400E-02         8.44231E-01         1.66133E+00         8.44513E-01         1.33014E+01         1.00000E+00         9.41463E-03         1.33014E+01         3.61769E+00         9.68371E+00
+          1.34399E-02         2.31201E-02        -2.20858E-02         8.44228E-01         1.67200E+00         8.44516E-01         1.28545E+01         1.00000E+00         9.43342E-03         1.28545E+01         3.50351E+00         9.35098E+00
+          1.34399E-02         2.32899E-02        -2.23335E-02         8.44224E-01         1.68267E+00         8.44520E-01         1.24081E+01         1.00000E+00         9.45099E-03         1.24081E+01         3.38765E+00         9.02049E+00
+          1.34399E-02         2.34597E-02        -2.25830E-02         8.44221E-01         1.69334E+00         8.44523E-01         1.19637E+01         1.00000E+00         9.46732E-03         1.19637E+01         3.27051E+00         8.69323E+00
+          1.34399E-02         2.36295E-02        -2.28342E-02         8.44218E-01         1.70401E+00         8.44526E-01         1.15226E+01         1.00000E+00         9.48240E-03         1.15226E+01         3.15246E+00         8.37015E+00
+          1.34399E-02         2.37994E-02        -2.30873E-02         8.44214E-01         1.71468E+00         8.44530E-01         1.10860E+01         1.00000E+00         9.49621E-03         1.10860E+01         3.03389E+00         8.05215E+00
+          1.34399E-02         2.39692E-02        -2.33423E-02         8.44211E-01         1.72535E+00         8.44533E-01         1.06552E+01         1.00000E+00         9.50874E-03         1.06552E+01         2.91514E+00         7.74009E+00
+          1.34399E-02         2.41390E-02        -2.35990E-02         8.44207E-01         1.73602E+00         8.44537E-01         1.02314E+01         1.00000E+00         9.51997E-03         1.02314E+01         2.79656E+00         7.43481E+00
+          1.34399E-02         2.43088E-02        -2.38575E-02         8.44204E-01         1.74669E+00         8.44541E-01         9.81557E+00         1.00000E+00         9.52990E-03         9.81557E+00         2.67849E+00         7.13708E+00
+          1.34399E-02         2.44787E-02        -2.41179E-02         8.44200E-01         1.75736E+00         8.44545E-01         9.40886E+00         1.00000E+00         9.53851E-03         9.40886E+00         2.56124E+00         6.84762E+00
+          1.34399E-02         2.46485E-02        -2.43800E-02         8.44197E-01         1.76804E+00         8.44549E-01         9.01222E+00         1.00000E+00         9.54579E-03         9.01222E+00         2.44511E+00         6.56711E+00
+          1.34399E-02         2.48183E-02        -2.46440E-02         8.44193E-01         1.77871E+00         8.44553E-01         8.62656E+00         1.00000E+00         9.55174E-03         8.62656E+00         2.33039E+00         6.29617E+00
+          1.34399E-02         2.49882E-02        -2.49098E-02         8.44190E-01         1.78938E+00         8.44557E-01         8.25272E+00         1.00000E+00         9.55635E-03         8.25272E+00         2.21734E+00         6.03538E+00
+          1.34399E-02         2.51580E-02        -2.51774E-02         8.44186E-01         1.80005E+00         8.44561E-01         7.89147E+00         1.00000E+00         9.55962E-03         7.89147E+00         2.10622E+00         5.78525E+00
+          1.34399E-02         2.53278E-02        -2.54468E-02         8.44182E-01         1.81072E+00         8.44566E-01         7.54350E+00         1.00000E+00         9.56154E-03         7.54350E+00         1.99726E+00         5.54624E+00
+          1.34399E-02         2.54976E-02        -2.57180E-02         8.44179E-01         1.82139E+00         8.44570E-01         7.20944E+00         1.00000E+00         9.56210E-03         7.20944E+00         1.89067E+00         5.31877E+00
+          1.34399E-02         2.56675E-02        -2.59911E-02         8.44175E-01         1.83206E+00         8.44575E-01         6.88983E+00         1.00000E+00         9.56131E-03         6.88984E+00         1.78666E+00         5.10318E+00
+          1.34399E-02         2.58373E-02        -2.62659E-02         8.44171E-01         1.84273E+00         8.44580E-01         6.58516E+00         1.00000E+00         9.55917E-03         6.58516E+00         1.68540E+00         4.89976E+00
+          1.34399E-02         2.60071E-02        -2.65426E-02         8.44168E-01         1.85340E+00         8.44585E-01         6.29582E+00         1.00000E+00         9.55567E-03         6.29583E+00         1.58707E+00         4.70876E+00
+          1.34399E-02         2.61769E-02        -2.68211E-02         8.44164E-01         1.86407E+00         8.44590E-01         6.02215E+00         1.00000E+00         9.55082E-03         6.02215E+00         1.49180E+00         4.53035E+00
+          1.36097E-02         8.72665E-04        -5.46040E-03         8.55124E-01         2.74155E-01         8.55141E-01         3.66386E+02         1.00000E+00         8.92349E-03         3.66386E+02         1.12442E+02         2.53944E+02
+          1.36097E-02         1.04249E-03        -5.47061E-03         8.55123E-01         2.84826E-01         8.55141E-01         3.59342E+02         1.00000E+00         8.84667E-03         3.59342E+02         1.10236E+02         2.49106E+02
+          1.36097E-02         1.21232E-03        -5.48264E-03         8.55123E-01         2.95496E-01         8.55141E-01         3.52152E+02         1.00000E+00         8.76844E-03         3.52152E+02         1.07983E+02         2.44169E+02
+          1.36097E-02         1.38215E-03        -5.49648E-03         8.55123E-01         3.06167E-01         8.55141E-01         3.44828E+02         1.00000E+00         8.68895E-03         3.44828E+02         1.05687E+02         2.39141E+02
+          1.36097E-02         1.55197E-03        -5.51214E-03         8.55123E-01         3.16838E-01         8.55141E-01         3.37383E+02         1.00000E+00         8.60835E-03         3.37383E+02         1.03351E+02         2.34032E+02
+          1.36097E-02         1.72180E-03        -5.52960E-03         8.55123E-01         3.27508E-01         8.55141E-01         3.29828E+02         1.00000E+00         8.52678E-03         3.29828E+02         1.00980E+02         2.28848E+02
+          1.36097E-02         1.89163E-03        -5.54888E-03         8.55122E-01         3.38179E-01         8.55140E-01         3.22177E+02         1.00000E+00         8.44439E-03         3.22177E+02         9.85777E+01         2.23599E+02
+          1.36097E-02         2.06146E-03        -5.56997E-03         8.55122E-01         3.48849E-01         8.55140E-01         3.14440E+02         1.00000E+00         8.36133E-03         3.14440E+02         9.61468E+01         2.18293E+02
+          1.36097E-02         2.23128E-03        -5.59287E-03         8.55122E-01         3.59520E-01         8.55140E-01         3.06630E+02         1.00000E+00         8.27775E-03         3.06630E+02         9.36917E+01         2.12938E+02
+          1.36097E-02         2.40111E-03        -5.61758E-03         8.55121E-01         3.70190E-01         8.55140E-01         2.98759E+02         1.00000E+00         8.19379E-03         2.98759E+02         9.12160E+01         2.07543E+02
+          1.36097E-02         2.57094E-03        -5.64411E-03         8.55121E-01         3.80861E-01         8.55140E-01         2.90840E+02         1.00000E+00         8.10960E-03         2.90840E+02         8.87237E+01         2.02117E+02
+          1.36097E-02         2.74077E-03        -5.67244E-03         8.55121E-01         3.91532E-01         8.55140E-01         2.82885E+02         1.00000E+00         8.02531E-03         2.82885E+02         8.62183E+01         1.96666E+02
+          1.36097E-02         2.91059E-03        -5.70259E-03         8.55120E-01         4.02202E-01         8.55139E-01         2.74904E+02         1.00000E+00         7.94108E-03         2.74904E+02         8.37037E+01         1.91201E+02
+          1.36097E-02         3.08042E-03        -5.73455E-03         8.55120E-01         4.12873E-01         8.55139E-01         2.66911E+02         1.00000E+00         7.85704E-03         2.66911E+02         8.11836E+01         1.85728E+02
+          1.36097E-02         3.25025E-03        -5.76833E-03         8.55119E-01         4.23543E-01         8.55139E-01         2.58917E+02         1.00000E+00         7.77332E-03         2.58917E+02         7.86616E+01         1.80256E+02
+          1.36097E-02         3.42008E-03        -5.80391E-03         8.55119E-01         4.34214E-01         8.55139E-01         2.50933E+02         1.00000E+00         7.69006E-03         2.50933E+02         7.61413E+01         1.74792E+02
+          1.36097E-02         3.58990E-03        -5.84131E-03         8.55118E-01         4.44884E-01         8.55138E-01         2.42971E+02         1.00000E+00         7.60739E-03         2.42971E+02         7.36262E+01         1.69344E+02
+          1.36097E-02         3.75973E-03        -5.88052E-03         8.55118E-01         4.55555E-01         8.55138E-01         2.35040E+02         1.00000E+00         7.52544E-03         2.35040E+02         7.11199E+01         1.63920E+02
+          1.36097E-02         3.92956E-03        -5.92154E-03         8.55117E-01         4.66225E-01         8.55138E-01         2.27153E+02         1.00000E+00         7.44432E-03         2.27153E+02         6.86257E+01         1.58528E+02
+          1.36097E-02         4.09939E-03        -5.96437E-03         8.55117E-01         4.76896E-01         8.55138E-01         2.19320E+02         1.00000E+00         7.36416E-03         2.19320E+02         6.61470E+01         1.53173E+02
+          1.36097E-02         4.26921E-03        -6.00902E-03         8.55116E-01         4.87567E-01         8.55137E-01         2.11550E+02         1.00000E+00         7.28507E-03         2.11550E+02         6.36870E+01         1.47863E+02
+          1.36097E-02         4.43904E-03        -6.05547E-03         8.55116E-01         4.98237E-01         8.55137E-01         2.03855E+02         1.00000E+00         7.20716E-03         2.03855E+02         6.12489E+01         1.42606E+02
+          1.36097E-02         4.60887E-03        -6.10374E-03         8.55115E-01         5.08908E-01         8.55137E-01         1.96242E+02         1.00000E+00         7.13053E-03         1.96242E+02         5.88357E+01         1.37406E+02
+          1.36097E-02         4.77869E-03        -6.15382E-03         8.55114E-01         5.19578E-01         8.55136E-01         1.88721E+02         1.00000E+00         7.05528E-03         1.88721E+02         5.64503E+01         1.32271E+02
+          1.36097E-02         4.94852E-03        -6.20572E-03         8.55113E-01         5.30249E-01         8.55136E-01         1.81301E+02         1.00000E+00         6.98151E-03         1.81301E+02         5.40957E+01         1.27206E+02
+          1.36097E-02         5.11835E-03        -6.25942E-03         8.55113E-01         5.40919E-01         8.55136E-01         1.73991E+02         1.00000E+00         6.90931E-03         1.73991E+02         5.17745E+01         1.22217E+02
+          1.36097E-02         5.28818E-03        -6.31494E-03         8.55112E-01         5.51590E-01         8.55135E-01         1.66799E+02         1.00000E+00         6.83876E-03         1.66799E+02         4.94894E+01         1.17309E+02
+          1.36097E-02         5.45800E-03        -6.37227E-03         8.55111E-01         5.62261E-01         8.55135E-01         1.59731E+02         1.00000E+00         6.76994E-03         1.59731E+02         4.72429E+01         1.12488E+02
+          1.36097E-02         5.62783E-03        -6.43141E-03         8.55110E-01         5.72931E-01         8.55135E-01         1.52796E+02         1.00000E+00         6.70292E-03         1.52796E+02         4.50372E+01         1.07759E+02
+          1.36097E-02         5.79766E-03        -6.49237E-03         8.55110E-01         5.83602E-01         8.55134E-01         1.45999E+02         1.00000E+00         6.63778E-03         1.45999E+02         4.28747E+01         1.03125E+02
+          1.36097E-02         5.96749E-03        -6.55513E-03         8.55109E-01         5.94272E-01         8.55134E-01         1.39348E+02         1.00000E+00         6.57456E-03         1.39348E+02         4.07575E+01         9.85908E+01
+          1.36097E-02         6.13731E-03        -6.61971E-03         8.55108E-01         6.04943E-01         8.55133E-01         1.32848E+02         1.00000E+00         6.51333E-03         1.32848E+02         3.86875E+01         9.41609E+01
+          1.36097E-02         6.30714E-03        -6.68610E-03         8.55107E-01         6.15613E-01         8.55133E-01         1.26505E+02         1.00000E+00         6.45415E-03         1.26505E+02         3.66666E+01         8.98387E+01
+          1.36097E-02         6.47697E-03        -6.75430E-03         8.55106E-01         6.26284E-01         8.55133E-01         1.20324E+02         1.00000E+00         6.39705E-03         1.20324E+02         3.46964E+01         8.56272E+01
+          1.36097E-02         6.64680E-03        -6.82431E-03         8.55105E-01         6.36955E-01         8.55132E-01         1.14308E+02         1.00000E+00         6.34208E-03         1.14308E+02         3.27785E+01         8.15297E+01
+          1.36097E-02         6.81662E-03        -6.89614E-03         8.55104E-01         6.47625E-01         8.55132E-01         1.08463E+02         1.00000E+00         6.28926E-03         1.08463E+02         3.09143E+01         7.75486E+01
+          1.36097E-02         6.98645E-03        -6.96978E-03         8.55103E-01         6.58296E-01         8.55131E-01         1.02791E+02         1.00000E+00         6.23865E-03         1.02791E+02         2.91051E+01         7.36864E+01
+          1.36097E-02         7.15628E-03        -7.04523E-03         8.55102E-01         6.68966E-01         8.55131E-01         9.72971E+01         1.00000E+00         6.19025E-03         9.72971E+01         2.73520E+01         6.99451E+01
+          1.36097E-02         7.32611E-03        -7.12249E-03         8.55101E-01         6.79637E-01         8.55131E-01         9.19824E+01         1.00000E+00         6.14408E-03         9.19824E+01         2.56559E+01         6.63265E+01
+          1.36097E-02         7.49593E-03        -7.20157E-03         8.55100E-01         6.90307E-01         8.55130E-01         8.68497E+01         1.00000E+00         6.10018E-03         8.68497E+01         2.40178E+01         6.28319E+01
+          1.36097E-02         7.66576E-03        -7.28245E-03         8.55099E-01         7.00978E-01         8.55130E-01         8.19009E+01         1.00000E+00         6.05854E-03         8.19009E+01         2.24383E+01         5.94625E+01
+          1.36097E-02         7.83559E-03        -7.36515E-03         8.55098E-01         7.11649E-01         8.55129E-01         7.71372E+01         1.00000E+00         6.01917E-03         7.71372E+01         2.09180E+01         5.62192E+01
+          1.36097E-02         8.00542E-03        -7.44966E-03         8.55097E-01         7.22319E-01         8.55129E-01         7.25597E+01         1.00000E+00         5.98208E-03         7.25597E+01         1.94573E+01         5.31024E+01
+          1.36097E-02         8.17524E-03        -7.53599E-03         8.55095E-01         7.32990E-01         8.55129E-01         6.81688E+01         1.00000E+00         5.94726E-03         6.81688E+01         1.80565E+01         5.01124E+01
+          1.36097E-02         8.34507E-03        -7.62412E-03         8.55094E-01         7.43660E-01         8.55128E-01         6.39648E+01         1.00000E+00         5.91472E-03         6.39648E+01         1.67156E+01         4.72491E+01
+          1.36097E-02         8.51490E-03        -7.71407E-03         8.55093E-01         7.54331E-01         8.55128E-01         5.99472E+01         1.00000E+00         5.88445E-03         5.99472E+01         1.54349E+01         4.45124E+01
+          1.36097E-02         8.68473E-03        -7.80583E-03         8.55092E-01         7.65001E-01         8.55127E-01         5.61155E+01         1.00000E+00         5.85642E-03         5.61155E+01         1.42140E+01         4.19015E+01
+          1.36097E-02         8.85455E-03        -7.89940E-03         8.55090E-01         7.75672E-01         8.55127E-01         5.24684E+01         1.00000E+00         5.83064E-03         5.24684E+01         1.30528E+01         3.94156E+01
+          1.36097E-02         9.02438E-03        -7.99479E-03         8.55089E-01         7.86343E-01         8.55126E-01         4.90047E+01         1.00000E+00         5.80709E-03         4.90047E+01         1.19509E+01         3.70538E+01
+          1.36097E-02         9.19421E-03        -8.09198E-03         8.55088E-01         7.97013E-01         8.55126E-01         4.57225E+01         1.00000E+00         5.78573E-03         4.57225E+01         1.09079E+01         3.48146E+01
+          1.36097E-02         9.36403E-03        -8.19099E-03         8.55086E-01         8.07684E-01         8.55126E-01         4.26196E+01         1.00000E+00         5.76656E-03         4.26196E+01         9.92313E+00         3.26965E+01
+          1.36097E-02         9.53386E-03        -8.29181E-03         8.55085E-01         8.18354E-01         8.55125E-01         3.96936E+01         1.00000E+00         5.74955E-03         3.96936E+01         8.99588E+00         3.06977E+01
+          1.36097E-02         9.70369E-03        -8.39444E-03         8.55084E-01         8.29025E-01         8.55125E-01         3.69417E+01         1.00000E+00         5.73467E-03         3.69417E+01         8.12535E+00         2.88163E+01
+          1.36097E-02         9.87352E-03        -8.49889E-03         8.55082E-01         8.39695E-01         8.55124E-01         3.43608E+01         1.00000E+00         5.72190E-03         3.43608E+01         7.31063E+00         2.70502E+01
+          1.36097E-02         1.00433E-02        -8.60515E-03         8.55081E-01         8.50366E-01         8.55124E-01         3.19475E+01         1.00000E+00         5.71120E-03         3.19475E+01         6.55071E+00         2.53968E+01
+          1.36097E-02         1.02132E-02        -8.71322E-03         8.55079E-01         8.61037E-01         8.55124E-01         2.96982E+01         1.00000E+00         5.70255E-03         2.96982E+01         5.84449E+00         2.38537E+01
+          1.36097E-02         1.03830E-02        -8.82310E-03         8.55078E-01         8.71707E-01         8.55123E-01         2.76090E+01         1.00000E+00         5.69590E-03         2.76090E+01         5.19078E+00         2.24182E+01
+          1.36097E-02         1.05528E-02        -8.93479E-03         8.55076E-01         8.82378E-01         8.55123E-01         2.56758E+01         1.00000E+00         5.69123E-03         2.56758E+01         4.58832E+00         2.10875E+01
+          1.36097E-02         1.07227E-02        -9.04830E-03         8.55075E-01         8.93048E-01         8.55123E-01         2.38942E+01         1.00000E+00         5.68850E-03         2.38942E+01         4.03576E+00         1.98584E+01
+          1.36097E-02         1.08925E-02        -9.16362E-03         8.55073E-01         9.03719E-01         8.55122E-01         2.22597E+01         1.00000E+00         5.68767E-03         2.22597E+01         3.53168E+00         1.87280E+01
+          1.36097E-02         1.10623E-02        -9.28075E-03         8.55072E-01         9.14389E-01         8.55122E-01         2.07676E+01         1.00000E+00         5.68871E-03         2.07676E+01         3.07463E+00         1.76930E+01
+          1.36097E-02         1.12321E-02        -9.39969E-03         8.55070E-01         9.25060E-01         8.55122E-01         1.94130E+01         1.00000E+00         5.69157E-03         1.94130E+01         2.66305E+00         1.67500E+01
+          1.36097E-02         1.14020E-02        -9.52045E-03         8.55068E-01         9.35731E-01         8.55121E-01         1.81909E+01         1.00000E+00         5.69621E-03         1.81909E+01         2.29536E+00         1.58956E+01
+          1.36097E-02         1.15718E-02        -9.64302E-03         8.55067E-01         9.46401E-01         8.55121E-01         1.70962E+01         1.00000E+00         5.70259E-03         1.70962E+01         1.96994E+00         1.51262E+01
+          1.36097E-02         1.17416E-02        -9.76740E-03         8.55065E-01         9.57072E-01         8.55121E-01         1.61235E+01         1.00000E+00         5.71067E-03         1.61235E+01         1.68509E+00         1.44384E+01
+          1.36097E-02         1.19114E-02        -9.89359E-03         8.55063E-01         9.67742E-01         8.55121E-01         1.52675E+01         1.00000E+00         5.72040E-03         1.52675E+01         1.43913E+00         1.38284E+01
+          1.36097E-02         1.20813E-02        -1.00216E-02         8.55062E-01         9.78413E-01         8.55120E-01         1.45229E+01         1.00000E+00         5.73175E-03         1.45229E+01         1.23030E+00         1.32926E+01
+          1.36097E-02         1.22511E-02        -1.01514E-02         8.55060E-01         9.89083E-01         8.55120E-01         1.38840E+01         1.00000E+00         5.74466E-03         1.38840E+01         1.05684E+00         1.28272E+01
+          1.36097E-02         1.24209E-02        -1.02830E-02         8.55058E-01         9.99754E-01         8.55120E-01         1.33454E+01         1.00000E+00         5.75909E-03         1.33454E+01         9.16974E-01         1.24284E+01
+          1.36097E-02         1.25908E-02        -1.04165E-02         8.55056E-01         1.01042E+00         8.55120E-01         1.29016E+01         1.00000E+00         5.77499E-03         1.29016E+01         8.08904E-01         1.20927E+01
+          1.36097E-02         1.27606E-02        -1.05517E-02         8.55054E-01         1.02110E+00         8.55119E-01         1.25469E+01         1.00000E+00         5.79232E-03         1.25469E+01         7.30829E-01         1.18161E+01
+          1.36097E-02         1.29304E-02        -1.06888E-02         8.55052E-01         1.03177E+00         8.55119E-01         1.22759E+01         1.00000E+00         5.81103E-03         1.22759E+01         6.80945E-01         1.15949E+01
+          1.36097E-02         1.31002E-02        -1.08277E-02         8.55051E-01         1.04244E+00         8.55119E-01         1.20829E+01         1.00000E+00         5.83106E-03         1.20829E+01         6.57450E-01         1.14255E+01
+          1.36097E-02         1.32701E-02        -1.09684E-02         8.55049E-01         1.05311E+00         8.55119E-01         1.19625E+01         1.00000E+00         5.85238E-03         1.19625E+01         6.58552E-01         1.13040E+01
+          1.36097E-02         1.34399E-02        -1.11109E-02         8.55047E-01         1.06378E+00         8.55119E-01         1.19094E+01         1.00000E+00         5.87492E-03         1.19094E+01         6.82470E-01         1.12269E+01
+          1.36097E-02         1.36097E-02        -1.12552E-02         8.55045E-01         1.07445E+00         8.55119E-01         1.19180E+01         1.00000E+00         5.89864E-03         1.19180E+01         7.27441E-01         1.11905E+01
+          1.36097E-02         1.37795E-02        -1.14013E-02         8.55043E-01         1.08512E+00         8.55119E-01         1.19830E+01         1.00000E+00         5.92350E-03         1.19830E+01         7.91725E-01         1.11913E+01
+          1.36097E-02         1.39494E-02        -1.15493E-02         8.55041E-01         1.09579E+00         8.55119E-01         1.20994E+01         1.00000E+00         5.94943E-03         1.20994E+01         8.73607E-01         1.12258E+01
+          1.36097E-02         1.41192E-02        -1.16990E-02         8.55039E-01         1.10646E+00         8.55119E-01         1.22620E+01         1.00000E+00         5.97640E-03         1.22620E+01         9.71401E-01         1.12906E+01
+          1.36097E-02         1.42890E-02        -1.18506E-02         8.55037E-01         1.11713E+00         8.55119E-01         1.24657E+01         1.00000E+00         6.00434E-03         1.24657E+01         1.08346E+00         1.13822E+01
+          1.36097E-02         1.44589E-02        -1.20040E-02         8.55035E-01         1.12780E+00         8.55119E-01         1.27058E+01         1.00000E+00         6.03320E-03         1.27058E+01         1.20816E+00         1.14976E+01
+          1.36097E-02         1.46287E-02        -1.21592E-02         8.55032E-01         1.13847E+00         8.55119E-01         1.29774E+01         1.00000E+00         6.06295E-03         1.29774E+01         1.34395E+00         1.16335E+01
+          1.36097E-02         1.47985E-02        -1.23162E-02         8.55030E-01         1.14914E+00         8.55119E-01         1.32761E+01         1.00000E+00         6.09351E-03         1.32761E+01         1.48928E+00         1.17868E+01
+          1.36097E-02         1.49683E-02        -1.24750E-02         8.55028E-01         1.15981E+00         8.55119E-01         1.35974E+01         1.00000E+00         6.12485E-03         1.35974E+01         1.64269E+00         1.19547E+01
+          1.36097E-02         1.51382E-02        -1.26356E-02         8.55026E-01         1.17048E+00         8.55119E-01         1.39369E+01         1.00000E+00         6.15691E-03         1.39369E+01         1.80274E+00         1.21342E+01
+          1.36097E-02         1.53080E-02        -1.27981E-02         8.55024E-01         1.18115E+00         8.55120E-01         1.42906E+01         1.00000E+00         6.18964E-03         1.42906E+01         1.96806E+00         1.23226E+01
+          1.36097E-02         1.54778E-02        -1.29623E-02         8.55022E-01         1.19182E+00         8.55120E-01         1.46546E+01         1.00000E+00         6.22298E-03         1.46546E+01         2.13731E+00         1.25173E+01
+          1.36097E-02         1.56476E-02        -1.31284E-02         8.55019E-01         1.20249E+00         8.55120E-01         1.50251E+01         1.00000E+00         6.25690E-03         1.50251E+01         2.30924E+00         1.27159E+01
+          1.36097E-02         1.58175E-02        -1.32963E-02         8.55017E-01         1.21317E+00         8.55120E-01         1.53985E+01         1.00000E+00         6.29133E-03         1.53985E+01         2.48264E+00         1.29159E+01
+          1.36097E-02         1.59873E-02        -1.34660E-02         8.55015E-01         1.22384E+00         8.55121E-01         1.57715E+01         1.00000E+00         6.32624E-03         1.57715E+01         2.65636E+00         1.31151E+01
+          1.36097E-02         1.61571E-02        -1.36375E-02         8.55012E-01         1.23451E+00         8.55121E-01         1.61407E+01         1.00000E+00         6.36156E-03         1.61407E+01         2.82932E+00         1.33114E+01
+          1.36097E-02         1.63270E-02        -1.38108E-02         8.55010E-01         1.24518E+00         8.55121E-01         1.65034E+01         1.00000E+00         6.39725E-03         1.65034E+01         3.00048E+00         1.35029E+01
+          1.36097E-02         1.64968E-02        -1.39859E-02         8.55008E-01         1.25585E+00         8.55122E-01         1.68565E+01         1.00000E+00         6.43326E-03         1.68565E+01         3.16889E+00         1.36876E+01
+          1.36097E-02         1.66666E-02        -1.41629E-02         8.55005E-01         1.26652E+00         8.55122E-01         1.71976E+01         1.00000E+00         6.46955E-03         1.71976E+01         3.33365E+00         1.38639E+01
+          1.36097E-02         1.68364E-02        -1.43416E-02         8.55003E-01         1.27719E+00         8.55123E-01         1.75242E+01         1.00000E+00         6.50606E-03         1.75242E+01         3.49393E+00         1.40303E+01
+          1.36097E-02         1.70063E-02        -1.45222E-02         8.55000E-01         1.28786E+00         8.55124E-01         1.78341E+01         1.00000E+00         6.54276E-03         1.78341E+01         3.64895E+00         1.41851E+01
+          1.36097E-02         1.71761E-02        -1.47046E-02         8.54998E-01         1.29853E+00         8.55124E-01         1.81252E+01         1.00000E+00         6.57959E-03         1.81252E+01         3.79800E+00         1.43272E+01
+          1.36097E-02         1.73459E-02        -1.48888E-02         8.54995E-01         1.30920E+00         8.55125E-01         1.83958E+01         1.00000E+00         6.61650E-03         1.83958E+01         3.94045E+00         1.44554E+01
+          1.36097E-02         1.75158E-02        -1.50748E-02         8.54993E-01         1.31987E+00         8.55126E-01         1.86443E+01         1.00000E+00         6.65347E-03         1.86443E+01         4.07571E+00         1.45686E+01
+          1.36097E-02         1.76856E-02        -1.52626E-02         8.54990E-01         1.33054E+00         8.55126E-01         1.88691E+01         1.00000E+00         6.69043E-03         1.88691E+01         4.20326E+00         1.46659E+01
+          1.36097E-02         1.78554E-02        -1.54522E-02         8.54988E-01         1.34121E+00         8.55127E-01         1.90691E+01         1.00000E+00         6.72736E-03         1.90691E+01         4.32264E+00         1.47465E+01
+          1.36097E-02         1.80252E-02        -1.56437E-02         8.54985E-01         1.35188E+00         8.55128E-01         1.92431E+01         1.00000E+00         6.76421E-03         1.92431E+01         4.43345E+00         1.48097E+01
+          1.36097E-02         1.81951E-02        -1.58369E-02         8.54982E-01         1.36255E+00         8.55129E-01         1.93904E+01         1.00000E+00         6.80093E-03         1.93904E+01         4.53535E+00         1.48550E+01
+          1.36097E-02         1.83649E-02        -1.60320E-02         8.54980E-01         1.37322E+00         8.55130E-01         1.95101E+01         1.00000E+00         6.83749E-03         1.95101E+01         4.62805E+00         1.48820E+01
+          1.36097E-02         1.85347E-02        -1.62289E-02         8.54977E-01         1.38389E+00         8.55131E-01         1.96018E+01         1.00000E+00         6.87385E-03         1.96017E+01         4.71134E+00         1.48904E+01
+          1.36097E-02         1.87045E-02        -1.64276E-02         8.54974E-01         1.39457E+00         8.55132E-01         1.96650E+01         1.00000E+00         6.90997E-03         1.96650E+01         4.78503E+00         1.48800E+01
+          1.36097E-02         1.88744E-02        -1.66281E-02         8.54972E-01         1.40524E+00         8.55133E-01         1.96996E+01         1.00000E+00         6.94581E-03         1.96996E+01         4.84900E+00         1.48506E+01
+          1.36097E-02         1.90442E-02        -1.68304E-02         8.54969E-01         1.41591E+00         8.55134E-01         1.97055E+01         1.00000E+00         6.98134E-03         1.97055E+01         4.90318E+00         1.48023E+01
+          1.36097E-02         1.92140E-02        -1.70346E-02         8.54966E-01         1.42658E+00         8.55136E-01         1.96827E+01         1.00000E+00         7.01653E-03         1.96827E+01         4.94754E+00         1.47352E+01
+          1.36097E-02         1.93839E-02        -1.72405E-02         8.54963E-01         1.43725E+00         8.55137E-01         1.96317E+01         1.00000E+00         7.05133E-03         1.96317E+01         4.98210E+00         1.46496E+01
+          1.36097E-02         1.95537E-02        -1.74483E-02         8.54960E-01         1.44792E+00         8.55138E-01         1.95525E+01         1.00000E+00         7.08572E-03         1.95525E+01         5.00693E+00         1.45456E+01
+          1.36097E-02         1.97235E-02        -1.76579E-02         8.54958E-01         1.45859E+00         8.55140E-01         1.94459E+01         1.00000E+00         7.11965E-03         1.94459E+01         5.02213E+00         1.44238E+01
+          1.36097E-02         1.98933E-02        -1.78692E-02         8.54955E-01         1.46926E+00         8.55141E-01         1.93124E+01         1.00000E+00         7.15311E-03         1.93124E+01         5.02785E+00         1.42845E+01
+          1.36097E-02         2.00632E-02        -1.80824E-02         8.54952E-01         1.47993E+00         8.55143E-01         1.91526E+01         1.00000E+00         7.18606E-03         1.91526E+01         5.02426E+00         1.41283E+01
+          1.36097E-02         2.02330E-02        -1.82975E-02         8.54949E-01         1.49060E+00         8.55145E-01         1.89675E+01         1.00000E+00         7.21847E-03         1.89675E+01         5.01158E+00         1.39559E+01
+          1.36097E-02         2.04028E-02        -1.85143E-02         8.54946E-01         1.50127E+00         8.55146E-01         1.87579E+01         1.00000E+00         7.25030E-03         1.87579E+01         4.99006E+00         1.37679E+01
+          1.36097E-02         2.05726E-02        -1.87329E-02         8.54943E-01         1.51194E+00         8.55148E-01         1.85249E+01         1.00000E+00         7.28154E-03         1.85249E+01         4.95996E+00         1.35649E+01
+          1.36097E-02         2.07425E-02        -1.89534E-02         8.54940E-01         1.52261E+00         8.55150E-01         1.82696E+01         1.00000E+00         7.31215E-03         1.82696E+01         4.92160E+00         1.33480E+01
+          1.36097E-02         2.09123E-02        -1.91757E-02         8.54937E-01         1.53328E+00         8.55152E-01         1.79930E+01         1.00000E+00         7.34211E-03         1.79930E+01         4.87528E+00         1.31177E+01
+          1.36097E-02         2.10821E-02        -1.93997E-02         8.54934E-01         1.54395E+00         8.55154E-01         1.76965E+01         1.00000E+00         7.37139E-03         1.76965E+01         4.82137E+00         1.28751E+01
+          1.36097E-02         2.12520E-02        -1.96256E-02         8.54931E-01         1.55462E+00         8.55156E-01         1.73813E+01         1.00000E+00         7.39996E-03         1.73813E+01         4.76022E+00         1.26211E+01
+          1.36097E-02         2.14218E-02        -1.98533E-02         8.54928E-01         1.56529E+00         8.55158E-01         1.70487E+01         1.00000E+00         7.42781E-03         1.70487E+01         4.69221E+00         1.23565E+01
+          1.36097E-02         2.15916E-02        -2.00829E-02         8.54925E-01         1.57596E+00         8.55160E-01         1.67002E+01         1.00000E+00         7.45490E-03         1.67002E+01         4.61775E+00         1.20825E+01
+          1.36097E-02         2.17614E-02        -2.03142E-02         8.54921E-01         1.58664E+00         8.55163E-01         1.63371E+01         1.00000E+00         7.48122E-03         1.63371E+01         4.53724E+00         1.17999E+01
+          1.36097E-02         2.19313E-02        -2.05473E-02         8.54918E-01         1.59731E+00         8.55165E-01         1.59609E+01         1.00000E+00         7.50674E-03         1.59609E+01         4.45109E+00         1.15098E+01
+          1.36097E-02         2.21011E-02        -2.07823E-02         8.54915E-01         1.60798E+00         8.55168E-01         1.55729E+01         1.00000E+00         7.53144E-03         1.55729E+01         4.35973E+00         1.12132E+01
+          1.36097E-02         2.22709E-02        -2.10191E-02         8.54912E-01         1.61865E+00         8.55170E-01         1.51747E+01         1.00000E+00         7.55530E-03         1.51747E+01         4.26359E+00         1.09111E+01
+          1.36097E-02         2.24407E-02        -2.12577E-02         8.54909E-01         1.62932E+00         8.55173E-01         1.47678E+01         1.00000E+00         7.57830E-03         1.47678E+01         4.16310E+00         1.06047E+01
+          1.36097E-02         2.26106E-02        -2.14981E-02         8.54905E-01         1.63999E+00         8.55176E-01         1.43535E+01         1.00000E+00         7.60042E-03         1.43535E+01         4.05870E+00         1.02948E+01
+          1.36097E-02         2.27804E-02        -2.17403E-02         8.54902E-01         1.65066E+00         8.55178E-01         1.39334E+01         1.00000E+00         7.62165E-03         1.39334E+01         3.95082E+00         9.98263E+00
+          1.36097E-02         2.29502E-02        -2.19843E-02         8.54899E-01         1.66133E+00         8.55181E-01         1.35089E+01         1.00000E+00         7.64196E-03         1.35089E+01         3.83989E+00         9.66906E+00
+          1.36097E-02         2.31201E-02        -2.22301E-02         8.54895E-01         1.67200E+00         8.55184E-01         1.30815E+01         1.00000E+00         7.66134E-03         1.30815E+01         3.72633E+00         9.35513E+00
+          1.36097E-02         2.32899E-02        -2.24778E-02         8.54892E-01         1.68267E+00         8.55187E-01         1.26524E+01         1.00000E+00         7.67977E-03         1.26524E+01         3.61058E+00         9.04181E+00
+          1.36097E-02         2.34597E-02        -2.27273E-02         8.54889E-01         1.69334E+00         8.55191E-01         1.22231E+01         1.00000E+00         7.69725E-03         1.22231E+01         3.49303E+00         8.73006E+00
+          1.36097E-02         2.36295E-02        -2.29785E-02         8.54885E-01         1.70401E+00         8.55194E-01         1.17949E+01         1.00000E+00         7.71374E-03         1.17949E+01         3.37410E+00         8.42080E+00
+          1.36097E-02         2.37994E-02        -2.32316E-02         8.54882E-01         1.71468E+00         8.55197E-01         1.13691E+01         1.00000E+00         7.72925E-03         1.13691E+01         3.25418E+00         8.11492E+00
+          1.36097E-02         2.39692E-02        -2.34865E-02         8.54878E-01         1.72535E+00         8.55201E-01         1.09469E+01         1.00000E+00         7.74376E-03         1.09469E+01         3.13365E+00         7.81328E+00
+          1.36097E-02         2.41390E-02        -2.37433E-02         8.54875E-01         1.73602E+00         8.55204E-01         1.05296E+01         1.00000E+00         7.75726E-03         1.05296E+01         3.01288E+00         7.51672E+00
+          1.36097E-02         2.43088E-02        -2.40018E-02         8.54871E-01         1.74669E+00         8.55208E-01         1.01182E+01         1.00000E+00         7.76973E-03         1.01182E+01         2.89223E+00         7.22600E+00
+          1.36097E-02         2.44787E-02        -2.42621E-02         8.54868E-01         1.75736E+00         8.55212E-01         9.71392E+00         1.00000E+00         7.78117E-03         9.71392E+00         2.77204E+00         6.94188E+00
+          1.36097E-02         2.46485E-02        -2.45243E-02         8.54864E-01         1.76804E+00         8.55216E-01         9.31770E+00         1.00000E+00         7.79157E-03         9.31770E+00         2.65264E+00         6.66506E+00
+          1.36097E-02         2.48183E-02        -2.47883E-02         8.54861E-01         1.77871E+00         8.55220E-01         8.93053E+00         1.00000E+00         7.80093E-03         8.93053E+00         2.53434E+00         6.39620E+00
+          1.36097E-02         2.49882E-02        -2.50541E-02         8.54857E-01         1.78938E+00         8.55224E-01         8.55332E+00         1.00000E+00         7.80922E-03         8.55332E+00         2.41742E+00         6.13589E+00
+          1.36097E-02         2.51580E-02        -2.53217E-02         8.54853E-01         1.80005E+00         8.55228E-01         8.18689E+00         1.00000E+00         7.81646E-03         8.18690E+00         2.30218E+00         5.88471E+00
+          1.36097E-02         2.53278E-02        -2.55911E-02         8.54850E-01         1.81072E+00         8.55233E-01         7.83204E+00         1.00000E+00         7.82263E-03         7.83204E+00         2.18887E+00         5.64317E+00
+          1.36097E-02         2.54976E-02        -2.58623E-02         8.54846E-01         1.82139E+00         8.55237E-01         7.48945E+00         1.00000E+00         7.82774E-03         7.48946E+00         2.07774E+00         5.41172E+00
+          1.36097E-02         2.56675E-02        -2.61354E-02         8.54842E-01         1.83206E+00         8.55242E-01         7.15977E+00         1.00000E+00         7.83177E-03         7.15978E+00         1.96900E+00         5.19078E+00
+          1.36097E-02         2.58373E-02        -2.64102E-02         8.54838E-01         1.84273E+00         8.55246E-01         6.84357E+00         1.00000E+00         7.83473E-03         6.84357E+00         1.86286E+00         4.98071E+00
+          1.36097E-02         2.60071E-02        -2.66869E-02         8.54835E-01         1.85340E+00         8.55251E-01         6.54132E+00         1.00000E+00         7.83662E-03         6.54133E+00         1.75951E+00         4.78181E+00
+          1.36097E-02         2.61769E-02        -2.69654E-02         8.54831E-01         1.86407E+00         8.55256E-01         6.25348E+00         1.00000E+00         7.83743E-03         6.25348E+00         1.65913E+00         4.59436E+00
+          1.37795E-02         8.72665E-04        -5.60654E-03         8.65794E-01         2.74155E-01         8.65812E-01         3.56738E+02         1.00000E+00         6.72688E-03         3.56738E+02         1.17475E+02         2.39263E+02
+          1.37795E-02         1.04249E-03        -5.61676E-03         8.65794E-01         2.84826E-01         8.65812E-01         3.49962E+02         1.00000E+00         6.67054E-03         3.49962E+02         1.15209E+02         2.34753E+02
+          1.37795E-02         1.21232E-03        -5.62879E-03         8.65794E-01         2.95496E-01         8.65812E-01         3.43044E+02         1.00000E+00         6.61319E-03         3.43044E+02         1.12894E+02         2.30149E+02
+          1.37795E-02         1.38215E-03        -5.64263E-03         8.65794E-01         3.06167E-01         8.65812E-01         3.35996E+02         1.00000E+00         6.55493E-03         3.35996E+02         1.10535E+02         2.25461E+02
+          1.37795E-02         1.55197E-03        -5.65828E-03         8.65793E-01         3.16838E-01         8.65812E-01         3.28829E+02         1.00000E+00         6.49588E-03         3.28829E+02         1.08133E+02         2.20695E+02
+          1.37795E-02         1.72180E-03        -5.67575E-03         8.65793E-01         3.27508E-01         8.65812E-01         3.21555E+02         1.00000E+00         6.43615E-03         3.21555E+02         1.05695E+02         2.15860E+02
+          1.37795E-02         1.89163E-03        -5.69502E-03         8.65793E-01         3.38179E-01         8.65812E-01         3.14185E+02         1.00000E+00         6.37584E-03         3.14185E+02         1.03222E+02         2.10963E+02
+          1.37795E-02         2.06146E-03        -5.71611E-03         8.65793E-01         3.48849E-01         8.65812E-01         3.06732E+02         1.00000E+00         6.31506E-03         3.06732E+02         1.00720E+02         2.06012E+02
+          1.37795E-02         2.23128E-03        -5.73901E-03         8.65792E-01         3.59520E-01         8.65811E-01         2.99206E+02         1.00000E+00         6.25393E-03         2.99206E+02         9.81916E+01         2.01014E+02
+          1.37795E-02         2.40111E-03        -5.76372E-03         8.65792E-01         3.70190E-01         8.65811E-01         2.91619E+02         1.00000E+00         6.19255E-03         2.91619E+02         9.56409E+01         1.95978E+02
+          1.37795E-02         2.57094E-03        -5.79025E-03         8.65792E-01         3.80861E-01         8.65811E-01         2.83983E+02         1.00000E+00         6.13104E-03         2.83983E+02         9.30718E+01         1.90912E+02
+          1.37795E-02         2.74077E-03        -5.81859E-03         8.65791E-01         3.91532E-01         8.65811E-01         2.76310E+02         1.00000E+00         6.06949E-03         2.76310E+02         9.04881E+01         1.85822E+02
+          1.37795E-02         2.91059E-03        -5.84874E-03         8.65791E-01         4.02202E-01         8.65811E-01         2.68610E+02         1.00000E+00         6.00801E-03         2.68610E+02         8.78935E+01         1.80717E+02
+          1.37795E-02         3.08042E-03        -5.88070E-03         8.65790E-01         4.12873E-01         8.65810E-01         2.60895E+02         1.00000E+00         5.94671E-03         2.60895E+02         8.52919E+01         1.75603E+02
+          1.37795E-02         3.25025E-03        -5.91447E-03         8.65790E-01         4.23543E-01         8.65810E-01         2.53176E+02         1.00000E+00         5.88569E-03         2.53176E+02         8.26870E+01         1.70489E+02
+          1.37795E-02         3.42008E-03        -5.95005E-03         8.65789E-01         4.34214E-01         8.65810E-01         2.45465E+02         1.00000E+00         5.82504E-03         2.45465E+02         8.00824E+01         1.65382E+02
+          1.37795E-02         3.58990E-03        -5.98745E-03         8.65789E-01         4.44884E-01         8.65810E-01         2.37770E+02         1.00000E+00         5.76487E-03         2.37770E+02         7.74817E+01         1.60289E+02
+          1.37795E-02         3.75973E-03        -6.02666E-03         8.65788E-01         4.55555E-01         8.65809E-01         2.30105E+02         1.00000E+00         5.70527E-03         2.30105E+02         7.48886E+01         1.55216E+02
+          1.37795E-02         3.92956E-03        -6.06768E-03         8.65788E-01         4.66225E-01         8.65809E-01         2.22477E+02         1.00000E+00         5.64632E-03         2.22477E+02         7.23065E+01         1.50171E+02
+          1.37795E-02         4.09939E-03        -6.11051E-03         8.65787E-01         4.76896E-01         8.65809E-01         2.14898E+02         1.00000E+00         5.58812E-03         2.14898E+02         6.97388E+01         1.45159E+02
+          1.37795E-02         4.26921E-03        -6.15516E-03         8.65787E-01         4.87567E-01         8.65808E-01         2.07378E+02         1.00000E+00         5.53075E-03         2.07378E+02         6.71889E+01         1.40189E+02
+          1.37795E-02         4.43904E-03        -6.20162E-03         8.65786E-01         4.98237E-01         8.65808E-01         1.99925E+02         1.00000E+00         5.47429E-03         1.99925E+02         6.46600E+01         1.35265E+02
+          1.37795E-02         4.60887E-03        -6.24988E-03         8.65785E-01         5.08908E-01         8.65808E-01         1.92549E+02         1.00000E+00         5.41883E-03         1.92549E+02         6.21552E+01         1.30394E+02
+          1.37795E-02         4.77869E-03        -6.29997E-03         8.65785E-01         5.19578E-01         8.65808E-01         1.85259E+02         1.00000E+00         5.36443E-03         1.85259E+02         5.96777E+01         1.25581E+02
+          1.37795E-02         4.94852E-03        -6.35186E-03         8.65784E-01         5.30249E-01         8.65807E-01         1.78063E+02         1.00000E+00         5.31117E-03         1.78063E+02         5.72302E+01         1.20833E+02
+          1.37795E-02         5.11835E-03        -6.40556E-03         8.65783E-01         5.40919E-01         8.65807E-01         1.70969E+02         1.00000E+00         5.25910E-03         1.70969E+02         5.48158E+01         1.16153E+02
+          1.37795E-02         5.28818E-03        -6.46108E-03         8.65782E-01         5.51590E-01         8.65807E-01         1.63985E+02         1.00000E+00         5.20831E-03         1.63985E+02         5.24370E+01         1.11548E+02
+          1.37795E-02         5.45800E-03        -6.51841E-03         8.65782E-01         5.62261E-01         8.65806E-01         1.57119E+02         1.00000E+00         5.15883E-03         1.57119E+02         5.00965E+01         1.07022E+02
+          1.37795E-02         5.62783E-03        -6.57755E-03         8.65781E-01         5.72931E-01         8.65806E-01         1.50377E+02         1.00000E+00         5.11074E-03         1.50377E+02         4.77968E+01         1.02580E+02
+          1.37795E-02         5.79766E-03        -6.63851E-03         8.65780E-01         5.83602E-01         8.65805E-01         1.43765E+02         1.00000E+00         5.06407E-03         1.43765E+02         4.55401E+01         9.82252E+01
+          1.37795E-02         5.96749E-03        -6.70127E-03         8.65779E-01         5.94272E-01         8.65805E-01         1.37291E+02         1.00000E+00         5.01888E-03         1.37291E+02         4.33287E+01         9.39625E+01
+          1.37795E-02         6.13731E-03        -6.76585E-03         8.65778E-01         6.04943E-01         8.65805E-01         1.30960E+02         1.00000E+00         4.97521E-03         1.30960E+02         4.11648E+01         8.97951E+01
+          1.37795E-02         6.30714E-03        -6.83224E-03         8.65777E-01         6.15613E-01         8.65804E-01         1.24777E+02         1.00000E+00         4.93310E-03         1.24777E+02         3.90501E+01         8.57266E+01
+          1.37795E-02         6.47697E-03        -6.90044E-03         8.65776E-01         6.26284E-01         8.65804E-01         1.18747E+02         1.00000E+00         4.89257E-03         1.18747E+02         3.69866E+01         8.17600E+01
+          1.37795E-02         6.64680E-03        -6.97045E-03         8.65775E-01         6.36955E-01         8.65803E-01         1.12874E+02         1.00000E+00         4.85367E-03         1.12874E+02         3.49758E+01         7.78982E+01
+          1.37795E-02         6.81662E-03        -7.04228E-03         8.65774E-01         6.47625E-01         8.65803E-01         1.07163E+02         1.00000E+00         4.81641E-03         1.07163E+02         3.30193E+01         7.41436E+01
+          1.37795E-02         6.98645E-03        -7.11592E-03         8.65773E-01         6.58296E-01         8.65803E-01         1.01617E+02         1.00000E+00         4.78083E-03         1.01617E+02         3.11185E+01         7.04986E+01
+          1.37795E-02         7.15628E-03        -7.19137E-03         8.65772E-01         6.68966E-01         8.65802E-01         9.62396E+01         1.00000E+00         4.74694E-03         9.62396E+01         2.92746E+01         6.69650E+01
+          1.37795E-02         7.32611E-03        -7.26863E-03         8.65771E-01         6.79637E-01         8.65802E-01         9.10333E+01         1.00000E+00         4.71475E-03         9.10333E+01         2.74886E+01         6.35446E+01
+          1.37795E-02         7.49593E-03        -7.34771E-03         8.65770E-01         6.90307E-01         8.65801E-01         8.60004E+01         1.00000E+00         4.68428E-03         8.60004E+01         2.57616E+01         6.02388E+01
+          1.37795E-02         7.66576E-03        -7.42859E-03         8.65769E-01         7.00978E-01         8.65801E-01         8.11430E+01         1.00000E+00         4.65554E-03         8.11430E+01         2.40943E+01         5.70487E+01
+          1.37795E-02         7.83559E-03        -7.51129E-03         8.65768E-01         7.11649E-01         8.65801E-01         7.64625E+01         1.00000E+00         4.62853E-03         7.64625E+01         2.24874E+01         5.39751E+01
+          1.37795E-02         8.00542E-03        -7.59580E-03         8.65767E-01         7.22319E-01         8.65800E-01         7.19599E+01         1.00000E+00         4.60326E-03         7.19599E+01         2.09414E+01         5.10185E+01
+          1.37795E-02         8.17524E-03        -7.68212E-03         8.65766E-01         7.32990E-01         8.65800E-01         6.76361E+01         1.00000E+00         4.57973E-03         6.76361E+01         1.94566E+01         4.81795E+01
+          1.37795E-02         8.34507E-03        -7.77026E-03         8.65764E-01         7.43660E-01         8.65799E-01         6.34912E+01         1.00000E+00         4.55793E-03         6.34912E+01         1.80333E+01         4.54579E+01
+          1.37795E-02         8.51490E-03        -7.86021E-03         8.65763E-01         7.54331E-01         8.65799E-01         5.95252E+01         1.00000E+00         4.53786E-03         5.95252E+01         1.66717E+01         4.28536E+01
+          1.37795E-02         8.68473E-03        -7.95197E-03         8.65762E-01         7.65001E-01         8.65798E-01         5.57377E+01         1.00000E+00         4.51951E-03         5.57377E+01         1.53716E+01         4.03661E+01
+          1.37795E-02         8.85455E-03        -8.04554E-03         8.65761E-01         7.75672E-01         8.65798E-01         5.21277E+01         1.00000E+00         4.50287E-03         5.21277E+01         1.41329E+01         3.79948E+01
+          1.37795E-02         9.02438E-03        -8.14092E-03         8.65759E-01         7.86343E-01         8.65798E-01         4.86942E+01         1.00000E+00         4.48793E-03         4.86942E+01         1.29554E+01         3.57388E+01
+          1.37795E-02         9.19421E-03        -8.23812E-03         8.65758E-01         7.97013E-01         8.65797E-01         4.54355E+01         1.00000E+00         4.47468E-03         4.54355E+01         1.18385E+01         3.35969E+01
+          1.37795E-02         9.36403E-03        -8.33713E-03         8.65757E-01         8.07684E-01         8.65797E-01         4.23498E+01         1.00000E+00         4.46309E-03         4.23498E+01         1.07819E+01         3.15679E+01
+          1.37795E-02         9.53386E-03        -8.43795E-03         8.65755E-01         8.18354E-01         8.65796E-01         3.94350E+01         1.00000E+00         4.45316E-03         3.94350E+01         9.78485E+00         2.96501E+01
+          1.37795E-02         9.70369E-03        -8.54058E-03         8.65754E-01         8.29025E-01         8.65796E-01         3.66885E+01         1.00000E+00         4.44486E-03         3.66885E+01         8.84657E+00         2.78419E+01
+          1.37795E-02         9.87352E-03        -8.64503E-03         8.65752E-01         8.39695E-01         8.65795E-01         3.41075E+01         1.00000E+00         4.43817E-03         3.41075E+01         7.96625E+00         2.61413E+01
+          1.37795E-02         1.00433E-02        -8.75128E-03         8.65751E-01         8.50366E-01         8.65795E-01         3.16891E+01         1.00000E+00         4.43308E-03         3.16891E+01         7.14290E+00         2.45462E+01
+          1.37795E-02         1.02132E-02        -8.85935E-03         8.65749E-01         8.61037E-01         8.65795E-01         2.94300E+01         1.00000E+00         4.42955E-03         2.94300E+01         6.37548E+00         2.30545E+01
+          1.37795E-02         1.03830E-02        -8.96923E-03         8.65748E-01         8.71707E-01         8.65794E-01         2.73265E+01         1.00000E+00         4.42755E-03         2.73265E+01         5.66285E+00         2.16636E+01
+          1.37795E-02         1.05528E-02        -9.08093E-03         8.65746E-01         8.82378E-01         8.65794E-01         2.53749E+01         1.00000E+00         4.42708E-03         2.53749E+01         5.00377E+00         2.03711E+01
+          1.37795E-02         1.07227E-02        -9.19444E-03         8.65745E-01         8.93048E-01         8.65794E-01         2.35711E+01         1.00000E+00         4.42809E-03         2.35711E+01         4.39692E+00         1.91742E+01
+          1.37795E-02         1.08925E-02        -9.30975E-03         8.65743E-01         9.03719E-01         8.65793E-01         2.19111E+01         1.00000E+00         4.43057E-03         2.19111E+01         3.84093E+00         1.80702E+01
+          1.37795E-02         1.10623E-02        -9.42688E-03         8.65742E-01         9.14389E-01         8.65793E-01         2.03905E+01         1.00000E+00         4.43447E-03         2.03905E+01         3.33433E+00         1.70562E+01
+          1.37795E-02         1.12321E-02        -9.54583E-03         8.65740E-01         9.25060E-01         8.65793E-01         1.90046E+01         1.00000E+00         4.43978E-03         1.90046E+01         2.87561E+00         1.61290E+01
+          1.37795E-02         1.14020E-02        -9.66658E-03         8.65738E-01         9.35731E-01         8.65792E-01         1.77489E+01         1.00000E+00         4.44646E-03         1.77489E+01         2.46318E+00         1.52858E+01
+          1.37795E-02         1.15718E-02        -9.78915E-03         8.65737E-01         9.46401E-01         8.65792E-01         1.66186E+01         1.00000E+00         4.45448E-03         1.66186E+01         2.09542E+00         1.45231E+01
+          1.37795E-02         1.17416E-02        -9.91353E-03         8.65735E-01         9.57072E-01         8.65792E-01         1.56086E+01         1.00000E+00         4.46380E-03         1.56086E+01         1.77066E+00         1.38379E+01
+          1.37795E-02         1.19114E-02        -1.00397E-02         8.65733E-01         9.67742E-01         8.65791E-01         1.47140E+01         1.00000E+00         4.47440E-03         1.47140E+01         1.48717E+00         1.32268E+01
+          1.37795E-02         1.20813E-02        -1.01677E-02         8.65731E-01         9.78413E-01         8.65791E-01         1.39297E+01         1.00000E+00         4.48624E-03         1.39297E+01         1.24320E+00         1.26865E+01
+          1.37795E-02         1.22511E-02        -1.02975E-02         8.65730E-01         9.89083E-01         8.65791E-01         1.32505E+01         1.00000E+00         4.49929E-03         1.32505E+01         1.03698E+00         1.22136E+01
+          1.37795E-02         1.24209E-02        -1.04292E-02         8.65728E-01         9.99754E-01         8.65791E-01         1.26713E+01         1.00000E+00         4.51351E-03         1.26713E+01         8.66707E-01         1.18046E+01
+          1.37795E-02         1.25908E-02        -1.05626E-02         8.65726E-01         1.01042E+00         8.65790E-01         1.21867E+01         1.00000E+00         4.52887E-03         1.21867E+01         7.30551E-01         1.14561E+01
+          1.37795E-02         1.27606E-02        -1.06979E-02         8.65724E-01         1.02110E+00         8.65790E-01         1.17915E+01         1.00000E+00         4.54533E-03         1.17915E+01         6.26683E-01         1.11648E+01
+          1.37795E-02         1.29304E-02        -1.08349E-02         8.65722E-01         1.03177E+00         8.65790E-01         1.14804E+01         1.00000E+00         4.56285E-03         1.14804E+01         5.53264E-01         1.09271E+01
+          1.37795E-02         1.31002E-02        -1.09738E-02         8.65720E-01         1.04244E+00         8.65790E-01         1.12481E+01         1.00000E+00         4.58140E-03         1.12481E+01         5.08452E-01         1.07397E+01
+          1.37795E-02         1.32701E-02        -1.11145E-02         8.65718E-01         1.05311E+00         8.65790E-01         1.10895E+01         1.00000E+00         4.60094E-03         1.10895E+01         4.90412E-01         1.05991E+01
+          1.37795E-02         1.34399E-02        -1.12570E-02         8.65716E-01         1.06378E+00         8.65789E-01         1.09993E+01         1.00000E+00         4.62144E-03         1.09993E+01         4.97314E-01         1.05020E+01
+          1.37795E-02         1.36097E-02        -1.14013E-02         8.65714E-01         1.07445E+00         8.65789E-01         1.09724E+01         1.00000E+00         4.64285E-03         1.09724E+01         5.27343E-01         1.04451E+01
+          1.37795E-02         1.37795E-02        -1.15475E-02         8.65712E-01         1.08512E+00         8.65789E-01         1.10037E+01         1.00000E+00         4.66514E-03         1.10037E+01         5.78704E-01         1.04250E+01
+          1.37795E-02         1.39494E-02        -1.16954E-02         8.65710E-01         1.09579E+00         8.65789E-01         1.10882E+01         1.00000E+00         4.68827E-03         1.10882E+01         6.49622E-01         1.04386E+01
+          1.37795E-02         1.41192E-02        -1.18452E-02         8.65708E-01         1.10646E+00         8.65789E-01         1.12209E+01         1.00000E+00         4.71220E-03         1.12209E+01         7.38352E-01         1.04826E+01
+          1.37795E-02         1.42890E-02        -1.19967E-02         8.65706E-01         1.11713E+00         8.65789E-01         1.13971E+01         1.00000E+00         4.73689E-03         1.13971E+01         8.43177E-01         1.05539E+01
+          1.37795E-02         1.44589E-02        -1.21501E-02         8.65704E-01         1.12780E+00         8.65789E-01         1.16120E+01         1.00000E+00         4.76230E-03         1.16120E+01         9.62419E-01         1.06496E+01
+          1.37795E-02         1.46287E-02        -1.23053E-02         8.65702E-01         1.13847E+00         8.65789E-01         1.18611E+01         1.00000E+00         4.78840E-03         1.18611E+01         1.09443E+00         1.07666E+01
+          1.37795E-02         1.47985E-02        -1.24623E-02         8.65700E-01         1.14914E+00         8.65789E-01         1.21398E+01         1.00000E+00         4.81515E-03         1.21398E+01         1.23763E+00         1.09021E+01
+          1.37795E-02         1.49683E-02        -1.26211E-02         8.65698E-01         1.15981E+00         8.65790E-01         1.24438E+01         1.00000E+00         4.84250E-03         1.24438E+01         1.39044E+00         1.10534E+01
+          1.37795E-02         1.51382E-02        -1.27817E-02         8.65695E-01         1.17048E+00         8.65790E-01         1.27690E+01         1.00000E+00         4.87043E-03         1.27690E+01         1.55137E+00         1.12176E+01
+          1.37795E-02         1.53080E-02        -1.29442E-02         8.65693E-01         1.18115E+00         8.65790E-01         1.31112E+01         1.00000E+00         4.89888E-03         1.31112E+01         1.71896E+00         1.13923E+01
+          1.37795E-02         1.54778E-02        -1.31084E-02         8.65691E-01         1.19182E+00         8.65790E-01         1.34667E+01         1.00000E+00         4.92782E-03         1.34667E+01         1.89181E+00         1.15749E+01
+          1.37795E-02         1.56476E-02        -1.32745E-02         8.65689E-01         1.20249E+00         8.65790E-01         1.38317E+01         1.00000E+00         4.95722E-03         1.38317E+01         2.06858E+00         1.17631E+01
+          1.37795E-02         1.58175E-02        -1.34424E-02         8.65686E-01         1.21317E+00         8.65791E-01         1.42026E+01         1.00000E+00         4.98703E-03         1.42026E+01         2.24798E+00         1.19546E+01
+          1.37795E-02         1.59873E-02        -1.36121E-02         8.65684E-01         1.22384E+00         8.65791E-01         1.45761E+01         1.00000E+00         5.01722E-03         1.45761E+01         2.42878E+00         1.21473E+01
+          1.37795E-02         1.61571E-02        -1.37836E-02         8.65681E-01         1.23451E+00         8.65791E-01         1.49489E+01         1.00000E+00         5.04775E-03         1.49489E+01         2.60981E+00         1.23391E+01
+          1.37795E-02         1.63270E-02        -1.39569E-02         8.65679E-01         1.24518E+00         8.65792E-01         1.53180E+01         1.00000E+00         5.07859E-03         1.53180E+01         2.78998E+00         1.25281E+01
+          1.37795E-02         1.64968E-02        -1.41320E-02         8.65677E-01         1.25585E+00         8.65792E-01         1.56807E+01         1.00000E+00         5.10969E-03         1.56807E+01         2.96823E+00         1.27124E+01
+          1.37795E-02         1.66666E-02        -1.43090E-02         8.65674E-01         1.26652E+00         8.65792E-01         1.60341E+01         1.00000E+00         5.14102E-03         1.60341E+01         3.14360E+00         1.28905E+01
+          1.37795E-02         1.68364E-02        -1.44877E-02         8.65672E-01         1.27719E+00         8.65793E-01         1.63759E+01         1.00000E+00         5.17255E-03         1.63759E+01         3.31516E+00         1.30607E+01
+          1.37795E-02         1.70063E-02        -1.46683E-02         8.65669E-01         1.28786E+00         8.65794E-01         1.67037E+01         1.00000E+00         5.20424E-03         1.67037E+01         3.48208E+00         1.32216E+01
+          1.37795E-02         1.71761E-02        -1.48507E-02         8.65667E-01         1.29853E+00         8.65794E-01         1.70154E+01         1.00000E+00         5.23605E-03         1.70154E+01         3.64356E+00         1.33719E+01
+          1.37795E-02         1.73459E-02        -1.50349E-02         8.65664E-01         1.30920E+00         8.65795E-01         1.73092E+01         1.00000E+00         5.26796E-03         1.73092E+01         3.79889E+00         1.35103E+01
+          1.37795E-02         1.75158E-02        -1.52209E-02         8.65662E-01         1.31987E+00         8.65795E-01         1.75832E+01         1.00000E+00         5.29992E-03         1.75832E+01         3.94741E+00         1.36358E+01
+          1.37795E-02         1.76856E-02        -1.54087E-02         8.65659E-01         1.33054E+00         8.65796E-01         1.78360E+01         1.00000E+00         5.33191E-03         1.78360E+01         4.08854E+00         1.37474E+01
+          1.37795E-02         1.78554E-02        -1.55984E-02         8.65656E-01         1.34121E+00         8.65797E-01         1.80660E+01         1.00000E+00         5.36389E-03         1.80660E+01         4.22174E+00         1.38443E+01
+          1.37795E-02         1.80252E-02        -1.57898E-02         8.65654E-01         1.35188E+00         8.65798E-01         1.82722E+01         1.00000E+00         5.39584E-03         1.82722E+01         4.34655E+00         1.39257E+01
+          1.37795E-02         1.81951E-02        -1.59831E-02         8.65651E-01         1.36255E+00         8.65799E-01         1.84535E+01         1.00000E+00         5.42771E-03         1.84535E+01         4.46256E+00         1.39910E+01
+          1.37795E-02         1.83649E-02        -1.61781E-02         8.65648E-01         1.37322E+00         8.65800E-01         1.86091E+01         1.00000E+00         5.45948E-03         1.86091E+01         4.56944E+00         1.40396E+01
+          1.37795E-02         1.85347E-02        -1.63750E-02         8.65646E-01         1.38389E+00         8.65801E-01         1.87382E+01         1.00000E+00         5.49112E-03         1.87382E+01         4.66687E+00         1.40713E+01
+          1.37795E-02         1.87045E-02        -1.65737E-02         8.65643E-01         1.39457E+00         8.65802E-01         1.88402E+01         1.00000E+00         5.52260E-03         1.88402E+01         4.75465E+00         1.40856E+01
+          1.37795E-02         1.88744E-02        -1.67742E-02         8.65640E-01         1.40524E+00         8.65803E-01         1.89150E+01         1.00000E+00         5.55389E-03         1.89150E+01         4.83259E+00         1.40824E+01
+          1.37795E-02         1.90442E-02        -1.69765E-02         8.65637E-01         1.41591E+00         8.65804E-01         1.89621E+01         1.00000E+00         5.58497E-03         1.89621E+01         4.90056E+00         1.40615E+01
+          1.37795E-02         1.92140E-02        -1.71807E-02         8.65635E-01         1.42658E+00         8.65805E-01         1.89816E+01         1.00000E+00         5.61580E-03         1.89816E+01         4.95850E+00         1.40231E+01
+          1.37795E-02         1.93839E-02        -1.73866E-02         8.65632E-01         1.43725E+00         8.65806E-01         1.89734E+01         1.00000E+00         5.64636E-03         1.89734E+01         5.00637E+00         1.39670E+01
+          1.37795E-02         1.95537E-02        -1.75944E-02         8.65629E-01         1.44792E+00         8.65808E-01         1.89378E+01         1.00000E+00         5.67663E-03         1.89378E+01         5.04420E+00         1.38936E+01
+          1.37795E-02         1.97235E-02        -1.78040E-02         8.65626E-01         1.45859E+00         8.65809E-01         1.88751E+01         1.00000E+00         5.70657E-03         1.88751E+01         5.07206E+00         1.38031E+01
+          1.37795E-02         1.98933E-02        -1.80154E-02         8.65623E-01         1.46926E+00         8.65811E-01         1.87858E+01         1.00000E+00         5.73616E-03         1.87858E+01         5.09004E+00         1.36957E+01
+          1.37795E-02         2.00632E-02        -1.82286E-02         8.65620E-01         1.47993E+00         8.65812E-01         1.86703E+01         1.00000E+00         5.76538E-03         1.86703E+01         5.09831E+00         1.35720E+01
+          1.37795E-02         2.02330E-02        -1.84436E-02         8.65617E-01         1.49060E+00         8.65814E-01         1.85294E+01         1.00000E+00         5.79420E-03         1.85294E+01         5.09704E+00         1.34323E+01
+          1.37795E-02         2.04028E-02        -1.86604E-02         8.65614E-01         1.50127E+00         8.65815E-01         1.83637E+01         1.00000E+00         5.82261E-03         1.83637E+01         5.08645E+00         1.32773E+01
+          1.37795E-02         2.05726E-02        -1.88790E-02         8.65611E-01         1.51194E+00         8.65817E-01         1.81742E+01         1.00000E+00         5.85057E-03         1.81742E+01         5.06679E+00         1.31075E+01
+          1.37795E-02         2.07425E-02        -1.90995E-02         8.65608E-01         1.52261E+00         8.65819E-01         1.79618E+01         1.00000E+00         5.87807E-03         1.79618E+01         5.03833E+00         1.29235E+01
+          1.37795E-02         2.09123E-02        -1.93218E-02         8.65605E-01         1.53328E+00         8.65821E-01         1.77275E+01         1.00000E+00         5.90508E-03         1.77275E+01         5.00140E+00         1.27261E+01
+          1.37795E-02         2.10821E-02        -1.95458E-02         8.65602E-01         1.54395E+00         8.65823E-01         1.74724E+01         1.00000E+00         5.93158E-03         1.74724E+01         4.95631E+00         1.25161E+01
+          1.37795E-02         2.12520E-02        -1.97717E-02         8.65599E-01         1.55462E+00         8.65825E-01         1.71976E+01         1.00000E+00         5.95755E-03         1.71976E+01         4.90342E+00         1.22942E+01
+          1.37795E-02         2.14218E-02        -1.99994E-02         8.65596E-01         1.56529E+00         8.65827E-01         1.69043E+01         1.00000E+00         5.98298E-03         1.69043E+01         4.84311E+00         1.20612E+01
+          1.37795E-02         2.15916E-02        -2.02290E-02         8.65593E-01         1.57596E+00         8.65829E-01         1.65938E+01         1.00000E+00         6.00784E-03         1.65938E+01         4.77575E+00         1.18181E+01
+          1.37795E-02         2.17614E-02        -2.04603E-02         8.65589E-01         1.58664E+00         8.65831E-01         1.62674E+01         1.00000E+00         6.03211E-03         1.62674E+01         4.70176E+00         1.15656E+01
+          1.37795E-02         2.19313E-02        -2.06934E-02         8.65586E-01         1.59731E+00         8.65834E-01         1.59263E+01         1.00000E+00         6.05578E-03         1.59263E+01         4.62154E+00         1.13048E+01
+          1.37795E-02         2.21011E-02        -2.09284E-02         8.65583E-01         1.60798E+00         8.65836E-01         1.55720E+01         1.00000E+00         6.07883E-03         1.55720E+01         4.53553E+00         1.10365E+01
+          1.37795E-02         2.22709E-02        -2.11652E-02         8.65580E-01         1.61865E+00         8.65838E-01         1.52058E+01         1.00000E+00         6.10124E-03         1.52058E+01         4.44416E+00         1.07616E+01
+          1.37795E-02         2.24407E-02        -2.14038E-02         8.65576E-01         1.62932E+00         8.65841E-01         1.48291E+01         1.00000E+00         6.12299E-03         1.48291E+01         4.34787E+00         1.04812E+01
+          1.37795E-02         2.26106E-02        -2.16442E-02         8.65573E-01         1.63999E+00         8.65844E-01         1.44433E+01         1.00000E+00         6.14407E-03         1.44433E+01         4.24709E+00         1.01962E+01
+          1.37795E-02         2.27804E-02        -2.18864E-02         8.65570E-01         1.65066E+00         8.65846E-01         1.40497E+01         1.00000E+00         6.16446E-03         1.40497E+01         4.14227E+00         9.90743E+00
+          1.37795E-02         2.29502E-02        -2.21304E-02         8.65566E-01         1.66133E+00         8.65849E-01         1.36498E+01         1.00000E+00         6.18415E-03         1.36498E+01         4.03385E+00         9.61596E+00
+          1.37795E-02         2.31201E-02        -2.23762E-02         8.65563E-01         1.67200E+00         8.65852E-01         1.32450E+01         1.00000E+00         6.20312E-03         1.32450E+01         3.92227E+00         9.32270E+00
+          1.37795E-02         2.32899E-02        -2.26239E-02         8.65560E-01         1.68267E+00         8.65855E-01         1.28365E+01         1.00000E+00         6.22137E-03         1.28365E+01         3.80797E+00         9.02856E+00
+          1.37795E-02         2.34597E-02        -2.28734E-02         8.65556E-01         1.69334E+00         8.65858E-01         1.24258E+01         1.00000E+00         6.23887E-03         1.24258E+01         3.69137E+00         8.73446E+00
+          1.37795E-02         2.36295E-02        -2.31246E-02         8.65553E-01         1.70401E+00         8.65862E-01         1.20142E+01         1.00000E+00         6.25562E-03         1.20142E+01         3.57290E+00         8.44128E+00
+          1.37795E-02         2.37994E-02        -2.33777E-02         8.65549E-01         1.71468E+00         8.65865E-01         1.16029E+01         1.00000E+00         6.27160E-03         1.16029E+01         3.45297E+00         8.14989E+00
+          1.37795E-02         2.39692E-02        -2.36326E-02         8.65546E-01         1.72535E+00         8.65868E-01         1.11931E+01         1.00000E+00         6.28681E-03         1.11931E+01         3.33197E+00         7.86114E+00
+          1.37795E-02         2.41390E-02        -2.38894E-02         8.65542E-01         1.73602E+00         8.65872E-01         1.07861E+01         1.00000E+00         6.30123E-03         1.07861E+01         3.21031E+00         7.57583E+00
+          1.37795E-02         2.43088E-02        -2.41479E-02         8.65539E-01         1.74669E+00         8.65875E-01         1.03831E+01         1.00000E+00         6.31486E-03         1.03831E+01         3.08836E+00         7.29475E+00
+          1.37795E-02         2.44787E-02        -2.44082E-02         8.65535E-01         1.75736E+00         8.65879E-01         9.98513E+00         1.00000E+00         6.32768E-03         9.98513E+00         2.96648E+00         7.01865E+00
+          1.37795E-02         2.46485E-02        -2.46704E-02         8.65531E-01         1.76804E+00         8.65883E-01         9.59326E+00         1.00000E+00         6.33969E-03         9.59326E+00         2.84503E+00         6.74823E+00
+          1.37795E-02         2.48183E-02        -2.49344E-02         8.65528E-01         1.77871E+00         8.65887E-01         9.20851E+00         1.00000E+00         6.35088E-03         9.20851E+00         2.72433E+00         6.48417E+00
+          1.37795E-02         2.49882E-02        -2.52002E-02         8.65524E-01         1.78938E+00         8.65891E-01         8.83182E+00         1.00000E+00         6.36125E-03         8.83182E+00         2.60471E+00         6.22711E+00
+          1.37795E-02         2.51580E-02        -2.54678E-02         8.65520E-01         1.80005E+00         8.65895E-01         8.46410E+00         1.00000E+00         6.37079E-03         8.46410E+00         2.48647E+00         5.97764E+00
+          1.37795E-02         2.53278E-02        -2.57372E-02         8.65517E-01         1.81072E+00         8.65899E-01         8.10618E+00         1.00000E+00         6.37949E-03         8.10618E+00         2.36988E+00         5.73630E+00
+          1.37795E-02         2.54976E-02        -2.60084E-02         8.65513E-01         1.82139E+00         8.65904E-01         7.75882E+00         1.00000E+00         6.38735E-03         7.75882E+00         2.25522E+00         5.50360E+00
+          1.37795E-02         2.56675E-02        -2.62815E-02         8.65509E-01         1.83206E+00         8.65908E-01         7.42273E+00         1.00000E+00         6.39437E-03         7.42273E+00         2.14274E+00         5.28000E+00
+          1.37795E-02         2.58373E-02        -2.65563E-02         8.65505E-01         1.84273E+00         8.65913E-01         7.09856E+00         1.00000E+00         6.40055E-03         7.09856E+00         2.03265E+00         5.06591E+00
+          1.37795E-02         2.60071E-02        -2.68330E-02         8.65502E-01         1.85340E+00         8.65918E-01         6.78689E+00         1.00000E+00         6.40588E-03         6.78689E+00         1.92518E+00         4.86171E+00
+          1.37795E-02         2.61769E-02        -2.71115E-02         8.65498E-01         1.86407E+00         8.65922E-01         6.48822E+00         1.00000E+00         6.41036E-03         6.48822E+00         1.82052E+00         4.66770E+00
+          1.39494E-02         8.72665E-04        -5.75450E-03         8.76465E-01         2.74155E-01         8.76484E-01         3.46722E+02         1.00000E+00         5.05728E-03         3.46722E+02         1.21400E+02         2.25322E+02
+          1.39494E-02         1.04249E-03        -5.76471E-03         8.76465E-01         2.84826E-01         8.76484E-01         3.40215E+02         1.00000E+00         5.01612E-03         3.40215E+02         1.19101E+02         2.21114E+02
+          1.39494E-02         1.21232E-03        -5.77674E-03         8.76464E-01         2.95496E-01         8.76483E-01         3.33571E+02         1.00000E+00         4.97424E-03         3.33571E+02         1.16751E+02         2.16820E+02
+          1.39494E-02         1.38215E-03        -5.79058E-03         8.76464E-01         3.06167E-01         8.76483E-01         3.26801E+02         1.00000E+00         4.93171E-03         3.26801E+02         1.14355E+02         2.12446E+02
+          1.39494E-02         1.55197E-03        -5.80624E-03         8.76464E-01         3.16838E-01         8.76483E-01         3.19915E+02         1.00000E+00         4.88862E-03         3.19915E+02         1.11916E+02         2.07999E+02
+          1.39494E-02         1.72180E-03        -5.82370E-03         8.76464E-01         3.27508E-01         8.76483E-01         3.12924E+02         1.00000E+00         4.84504E-03         3.12924E+02         1.09438E+02         2.03486E+02
+          1.39494E-02         1.89163E-03        -5.84298E-03         8.76464E-01         3.38179E-01         8.76483E-01         3.05840E+02         1.00000E+00         4.80107E-03         3.05840E+02         1.06924E+02         1.98916E+02
+          1.39494E-02         2.06146E-03        -5.86407E-03         8.76463E-01         3.48849E-01         8.76483E-01         2.98673E+02         1.00000E+00         4.75678E-03         2.98673E+02         1.04379E+02         1.94294E+02
+          1.39494E-02         2.23128E-03        -5.88697E-03         8.76463E-01         3.59520E-01         8.76483E-01         2.91435E+02         1.00000E+00         4.71225E-03         2.91435E+02         1.01807E+02         1.89629E+02
+          1.39494E-02         2.40111E-03        -5.91168E-03         8.76463E-01         3.70190E-01         8.76482E-01         2.84137E+02         1.00000E+00         4.66756E-03         2.84137E+02         9.92099E+01         1.84927E+02
+          1.39494E-02         2.57094E-03        -5.93821E-03         8.76462E-01         3.80861E-01         8.76482E-01         2.76789E+02         1.00000E+00         4.62280E-03         2.76789E+02         9.65933E+01         1.80195E+02
+          1.39494E-02         2.74077E-03        -5.96654E-03         8.76462E-01         3.91532E-01         8.76482E-01         2.69402E+02         1.00000E+00         4.57804E-03         2.69402E+02         9.39605E+01         1.75441E+02
+          1.39494E-02         2.91059E-03        -5.99669E-03         8.76461E-01         4.02202E-01         8.76482E-01         2.61988E+02         1.00000E+00         4.53336E-03         2.61988E+02         9.13153E+01         1.70672E+02
+          1.39494E-02         3.08042E-03        -6.02865E-03         8.76461E-01         4.12873E-01         8.76482E-01         2.54556E+02         1.00000E+00         4.48884E-03         2.54556E+02         8.86616E+01         1.65895E+02
+          1.39494E-02         3.25025E-03        -6.06242E-03         8.76460E-01         4.23543E-01         8.76481E-01         2.47119E+02         1.00000E+00         4.44455E-03         2.47119E+02         8.60030E+01         1.61116E+02
+          1.39494E-02         3.42008E-03        -6.09801E-03         8.76460E-01         4.34214E-01         8.76481E-01         2.39686E+02         1.00000E+00         4.40057E-03         2.39686E+02         8.33432E+01         1.56342E+02
+          1.39494E-02         3.58990E-03        -6.13541E-03         8.76459E-01         4.44884E-01         8.76481E-01         2.32266E+02         1.00000E+00         4.35697E-03         2.32266E+02         8.06860E+01         1.51580E+02
+          1.39494E-02         3.75973E-03        -6.17461E-03         8.76459E-01         4.55555E-01         8.76481E-01         2.24872E+02         1.00000E+00         4.31382E-03         2.24872E+02         7.80349E+01         1.46837E+02
+          1.39494E-02         3.92956E-03        -6.21564E-03         8.76458E-01         4.66225E-01         8.76480E-01         2.17511E+02         1.00000E+00         4.27118E-03         2.17511E+02         7.53934E+01         1.42118E+02
+          1.39494E-02         4.09939E-03        -6.25847E-03         8.76458E-01         4.76896E-01         8.76480E-01         2.10195E+02         1.00000E+00         4.22913E-03         2.10195E+02         7.27650E+01         1.37430E+02
+          1.39494E-02         4.26921E-03        -6.30311E-03         8.76457E-01         4.87567E-01         8.76480E-01         2.02931E+02         1.00000E+00         4.18772E-03         2.02931E+02         7.01531E+01         1.32778E+02
+          1.39494E-02         4.43904E-03        -6.34957E-03         8.76456E-01         4.98237E-01         8.76479E-01         1.95730E+02         1.00000E+00         4.14702E-03         1.95730E+02         6.75610E+01         1.28169E+02
+          1.39494E-02         4.60887E-03        -6.39784E-03         8.76456E-01         5.08908E-01         8.76479E-01         1.88599E+02         1.00000E+00         4.10708E-03         1.88599E+02         6.49918E+01         1.23608E+02
+          1.39494E-02         4.77869E-03        -6.44792E-03         8.76455E-01         5.19578E-01         8.76479E-01         1.81548E+02         1.00000E+00         4.06796E-03         1.81548E+02         6.24487E+01         1.19100E+02
+          1.39494E-02         4.94852E-03        -6.49981E-03         8.76454E-01         5.30249E-01         8.76478E-01         1.74585E+02         1.00000E+00         4.02971E-03         1.74585E+02         5.99348E+01         1.14650E+02
+          1.39494E-02         5.11835E-03        -6.55352E-03         8.76454E-01         5.40919E-01         8.76478E-01         1.67717E+02         1.00000E+00         3.99239E-03         1.67717E+02         5.74528E+01         1.10264E+02
+          1.39494E-02         5.28818E-03        -6.60904E-03         8.76453E-01         5.51590E-01         8.76478E-01         1.60952E+02         1.00000E+00         3.95603E-03         1.60952E+02         5.50056E+01         1.05946E+02
+          1.39494E-02         5.45800E-03        -6.66636E-03         8.76452E-01         5.62261E-01         8.76477E-01         1.54296E+02         1.00000E+00         3.92069E-03         1.54296E+02         5.25958E+01         1.01701E+02
+          1.39494E-02         5.62783E-03        -6.72551E-03         8.76451E-01         5.72931E-01         8.76477E-01         1.47758E+02         1.00000E+00         3.88640E-03         1.47758E+02         5.02260E+01         9.75318E+01
+          1.39494E-02         5.79766E-03        -6.78646E-03         8.76450E-01         5.83602E-01         8.76477E-01         1.41342E+02         1.00000E+00         3.85320E-03         1.41342E+02         4.78987E+01         9.34436E+01
+          1.39494E-02         5.96749E-03        -6.84922E-03         8.76449E-01         5.94272E-01         8.76476E-01         1.35056E+02         1.00000E+00         3.82112E-03         1.35056E+02         4.56160E+01         8.94396E+01
+          1.39494E-02         6.13731E-03        -6.91380E-03         8.76449E-01         6.04943E-01         8.76476E-01         1.28904E+02         1.00000E+00         3.79021E-03         1.28904E+02         4.33802E+01         8.55234E+01
+          1.39494E-02         6.30714E-03        -6.98019E-03         8.76448E-01         6.15613E-01         8.76475E-01         1.22891E+02         1.00000E+00         3.76048E-03         1.22891E+02         4.11934E+01         8.16981E+01
+          1.39494E-02         6.47697E-03        -7.04839E-03         8.76447E-01         6.26284E-01         8.76475E-01         1.17024E+02         1.00000E+00         3.73196E-03         1.17024E+02         3.90573E+01         7.79666E+01
+          1.39494E-02         6.64680E-03        -7.11841E-03         8.76446E-01         6.36955E-01         8.76475E-01         1.11305E+02         1.00000E+00         3.70468E-03         1.11305E+02         3.69737E+01         7.43316E+01
+          1.39494E-02         6.81662E-03        -7.19023E-03         8.76445E-01         6.47625E-01         8.76474E-01         1.05740E+02         1.00000E+00         3.67865E-03         1.05740E+02         3.49443E+01         7.07954E+01
+          1.39494E-02         6.98645E-03        -7.26387E-03         8.76444E-01         6.58296E-01         8.76474E-01         1.00331E+02         1.00000E+00         3.65390E-03         1.00331E+02         3.29705E+01         6.73602E+01
+          1.39494E-02         7.15628E-03        -7.33932E-03         8.76443E-01         6.68966E-01         8.76473E-01         9.50814E+01         1.00000E+00         3.63044E-03         9.50814E+01         3.10536E+01         6.40278E+01
+          1.39494E-02         7.32611E-03        -7.41658E-03         8.76442E-01         6.79637E-01         8.76473E-01         8.99947E+01         1.00000E+00         3.60827E-03         8.99947E+01         2.91949E+01         6.07998E+01
+          1.39494E-02         7.49593E-03        -7.49566E-03         8.76440E-01         6.90307E-01         8.76473E-01         8.50730E+01         1.00000E+00         3.58741E-03         8.50730E+01         2.73953E+01         5.76777E+01
+          1.39494E-02         7.66576E-03        -7.57654E-03         8.76439E-01         7.00978E-01         8.76472E-01         8.03182E+01         1.00000E+00         3.56787E-03         8.03182E+01         2.56558E+01         5.46624E+01
+          1.39494E-02         7.83559E-03        -7.65924E-03         8.76438E-01         7.11649E-01         8.76472E-01         7.57319E+01         1.00000E+00         3.54965E-03         7.57319E+01         2.39771E+01         5.17548E+01
+          1.39494E-02         8.00542E-03        -7.74375E-03         8.76437E-01         7.22319E-01         8.76471E-01         7.13153E+01         1.00000E+00         3.53276E-03         7.13153E+01         2.23598E+01         4.89555E+01
+          1.39494E-02         8.17524E-03        -7.83008E-03         8.76436E-01         7.32990E-01         8.76471E-01         6.70693E+01         1.00000E+00         3.51719E-03         6.70693E+01         2.08044E+01         4.62649E+01
+          1.39494E-02         8.34507E-03        -7.91821E-03         8.76435E-01         7.43660E-01         8.76470E-01         6.29943E+01         1.00000E+00         3.50294E-03         6.29943E+01         1.93112E+01         4.36830E+01
+          1.39494E-02         8.51490E-03        -8.00816E-03         8.76433E-01         7.54331E-01         8.76470E-01         5.90903E+01         1.00000E+00         3.49001E-03         5.90903E+01         1.78805E+01         4.12099E+01
+          1.39494E-02         8.68473E-03        -8.09992E-03         8.76432E-01         7.65001E-01         8.76469E-01         5.53572E+01         1.00000E+00         3.47839E-03         5.53572E+01         1.65122E+01         3.88450E+01
+          1.39494E-02         8.85455E-03        -8.19349E-03         8.76431E-01         7.75672E-01         8.76469E-01         5.17943E+01         1.00000E+00         3.46809E-03         5.17943E+01         1.52063E+01         3.65880E+01
+          1.39494E-02         9.02438E-03        -8.28887E-03         8.76429E-01         7.86343E-01         8.76469E-01         4.84006E+01         1.00000E+00         3.45907E-03         4.84006E+01         1.39626E+01         3.44380E+01
+          1.39494E-02         9.19421E-03        -8.38607E-03         8.76428E-01         7.97013E-01         8.76468E-01         4.51749E+01         1.00000E+00         3.45135E-03         4.51749E+01         1.27809E+01         3.23941E+01
+          1.39494E-02         9.36403E-03        -8.48508E-03         8.76427E-01         8.07684E-01         8.76468E-01         4.21155E+01         1.00000E+00         3.44490E-03         4.21155E+01         1.16605E+01         3.04550E+01
+          1.39494E-02         9.53386E-03        -8.58590E-03         8.76425E-01         8.18354E-01         8.76467E-01         3.92206E+01         1.00000E+00         3.43971E-03         3.92206E+01         1.06010E+01         2.86196E+01
+          1.39494E-02         9.70369E-03        -8.68853E-03         8.76424E-01         8.29025E-01         8.76467E-01         3.64879E+01         1.00000E+00         3.43578E-03         3.64879E+01         9.60175E+00         2.68862E+01
+          1.39494E-02         9.87352E-03        -8.79297E-03         8.76422E-01         8.39695E-01         8.76466E-01         3.39150E+01         1.00000E+00         3.43307E-03         3.39150E+01         8.66188E+00         2.52531E+01
+          1.39494E-02         1.00433E-02        -8.89923E-03         8.76421E-01         8.50366E-01         8.76466E-01         3.14991E+01         1.00000E+00         3.43158E-03         3.14991E+01         7.78054E+00         2.37186E+01
+          1.39494E-02         1.02132E-02        -9.00730E-03         8.76419E-01         8.61037E-01         8.76466E-01         2.92372E+01         1.00000E+00         3.43130E-03         2.92372E+01         6.95672E+00         2.22805E+01
+          1.39494E-02         1.03830E-02        -9.11718E-03         8.76418E-01         8.71707E-01         8.76465E-01         2.71262E+01         1.00000E+00         3.43219E-03         2.71262E+01         6.18934E+00         2.09368E+01
+          1.39494E-02         1.05528E-02        -9.22888E-03         8.76416E-01         8.82378E-01         8.76465E-01         2.51624E+01         1.00000E+00         3.43424E-03         2.51624E+01         5.47723E+00         1.96852E+01
+          1.39494E-02         1.07227E-02        -9.34238E-03         8.76415E-01         8.93048E-01         8.76464E-01         2.33424E+01         1.00000E+00         3.43744E-03         2.33424E+01         4.81913E+00         1.85233E+01
+          1.39494E-02         1.08925E-02        -9.45770E-03         8.76413E-01         9.03719E-01         8.76464E-01         2.16622E+01         1.00000E+00         3.44176E-03         2.16622E+01         4.21369E+00         1.74485E+01
+          1.39494E-02         1.10623E-02        -9.57483E-03         8.76411E-01         9.14389E-01         8.76464E-01         2.01179E+01         1.00000E+00         3.44717E-03         2.01179E+01         3.65950E+00         1.64584E+01
+          1.39494E-02         1.12321E-02        -9.69377E-03         8.76410E-01         9.25060E-01         8.76463E-01         1.87051E+01         1.00000E+00         3.45366E-03         1.87051E+01         3.15508E+00         1.55500E+01
+          1.39494E-02         1.14020E-02        -9.81453E-03         8.76408E-01         9.35731E-01         8.76463E-01         1.74196E+01         1.00000E+00         3.46121E-03         1.74196E+01         2.69889E+00         1.47208E+01
+          1.39494E-02         1.15718E-02        -9.93710E-03         8.76406E-01         9.46401E-01         8.76463E-01         1.62570E+01         1.00000E+00         3.46979E-03         1.62570E+01         2.28931E+00         1.39677E+01
+          1.39494E-02         1.17416E-02        -1.00615E-02         8.76405E-01         9.57072E-01         8.76462E-01         1.52126E+01         1.00000E+00         3.47937E-03         1.52126E+01         1.92471E+00         1.32879E+01
+          1.39494E-02         1.19114E-02        -1.01877E-02         8.76403E-01         9.67742E-01         8.76462E-01         1.42817E+01         1.00000E+00         3.48993E-03         1.42817E+01         1.60337E+00         1.26783E+01
+          1.39494E-02         1.20813E-02        -1.03157E-02         8.76401E-01         9.78413E-01         8.76462E-01         1.34596E+01         1.00000E+00         3.50145E-03         1.34596E+01         1.32356E+00         1.21360E+01
+          1.39494E-02         1.22511E-02        -1.04455E-02         8.76399E-01         9.89083E-01         8.76462E-01         1.27414E+01         1.00000E+00         3.51390E-03         1.27414E+01         1.08352E+00         1.16579E+01
+          1.39494E-02         1.24209E-02        -1.05771E-02         8.76397E-01         9.99754E-01         8.76461E-01         1.21222E+01         1.00000E+00         3.52725E-03         1.21222E+01         8.81432E-01         1.12408E+01
+          1.39494E-02         1.25908E-02        -1.07106E-02         8.76396E-01         1.01042E+00         8.76461E-01         1.15972E+01         1.00000E+00         3.54149E-03         1.15972E+01         7.15483E-01         1.08817E+01
+          1.39494E-02         1.27606E-02        -1.08458E-02         8.76394E-01         1.02110E+00         8.76461E-01         1.11612E+01         1.00000E+00         3.55657E-03         1.11612E+01         5.83831E-01         1.05774E+01
+          1.39494E-02         1.29304E-02        -1.09829E-02         8.76392E-01         1.03177E+00         8.76461E-01         1.08094E+01         1.00000E+00         3.57248E-03         1.08094E+01         4.84625E-01         1.03248E+01
+          1.39494E-02         1.31002E-02        -1.11218E-02         8.76390E-01         1.04244E+00         8.76460E-01         1.05368E+01         1.00000E+00         3.58918E-03         1.05368E+01         4.16009E-01         1.01207E+01
+          1.39494E-02         1.32701E-02        -1.12625E-02         8.76388E-01         1.05311E+00         8.76460E-01         1.03383E+01         1.00000E+00         3.60665E-03         1.03383E+01         3.76124E-01         9.96216E+00
+          1.39494E-02         1.34399E-02        -1.14050E-02         8.76386E-01         1.06378E+00         8.76460E-01         1.02091E+01         1.00000E+00         3.62486E-03         1.02091E+01         3.63117E-01         9.84594E+00
+          1.39494E-02         1.36097E-02        -1.15493E-02         8.76384E-01         1.07445E+00         8.76460E-01         1.01442E+01         1.00000E+00         3.64379E-03         1.01442E+01         3.75145E-01         9.76902E+00
+          1.39494E-02         1.37795E-02        -1.16954E-02         8.76382E-01         1.08512E+00         8.76460E-01         1.01388E+01         1.00000E+00         3.66339E-03         1.01388E+01         4.10377E-01         9.72838E+00
+          1.39494E-02         1.39494E-02        -1.18433E-02         8.76380E-01         1.09579E+00         8.76460E-01         1.01880E+01         1.00000E+00         3.68365E-03         1.01880E+01         4.67004E-01         9.72104E+00
+          1.39494E-02         1.41192E-02        -1.19931E-02         8.76378E-01         1.10646E+00         8.76460E-01         1.02873E+01         1.00000E+00         3.70454E-03         1.02873E+01         5.43236E-01         9.74407E+00
+          1.39494E-02         1.42890E-02        -1.21447E-02         8.76376E-01         1.11713E+00         8.76460E-01         1.04319E+01         1.00000E+00         3.72602E-03         1.04319E+01         6.37316E-01         9.79458E+00
+          1.39494E-02         1.44589E-02        -1.22980E-02         8.76373E-01         1.12780E+00         8.76460E-01         1.06173E+01         1.00000E+00         3.74807E-03         1.06173E+01         7.47514E-01         9.86978E+00
+          1.39494E-02         1.46287E-02        -1.24532E-02         8.76371E-01         1.13847E+00         8.76460E-01         1.08390E+01         1.00000E+00         3.77066E-03         1.08390E+01         8.72139E-01         9.96690E+00
+          1.39494E-02         1.47985E-02        -1.26102E-02         8.76369E-01         1.14914E+00         8.76460E-01         1.10928E+01         1.00000E+00         3.79375E-03         1.10928E+01         1.00954E+00         1.00833E+01
+          1.39494E-02         1.49683E-02        -1.27691E-02         8.76367E-01         1.15981E+00         8.76460E-01         1.13744E+01         1.00000E+00         3.81733E-03         1.13744E+01         1.15810E+00         1.02163E+01
+          1.39494E-02         1.51382E-02        -1.29297E-02         8.76365E-01         1.17048E+00         8.76460E-01         1.16797E+01         1.00000E+00         3.84136E-03         1.16797E+01         1.31626E+00         1.03635E+01
+          1.39494E-02         1.53080E-02        -1.30921E-02         8.76362E-01         1.18115E+00         8.76460E-01         1.20048E+01         1.00000E+00         3.86581E-03         1.20048E+01         1.48250E+00         1.05223E+01
+          1.39494E-02         1.54778E-02        -1.32564E-02         8.76360E-01         1.19182E+00         8.76460E-01         1.23459E+01         1.00000E+00         3.89065E-03         1.23459E+01         1.65536E+00         1.06906E+01
+          1.39494E-02         1.56476E-02        -1.34225E-02         8.76358E-01         1.20249E+00         8.76461E-01         1.26994E+01         1.00000E+00         3.91586E-03         1.26994E+01         1.83344E+00         1.08659E+01
+          1.39494E-02         1.58175E-02        -1.35903E-02         8.76355E-01         1.21317E+00         8.76461E-01         1.30616E+01         1.00000E+00         3.94141E-03         1.30616E+01         2.01536E+00         1.10462E+01
+          1.39494E-02         1.59873E-02        -1.37600E-02         8.76353E-01         1.22384E+00         8.76461E-01         1.34293E+01         1.00000E+00         3.96726E-03         1.34293E+01         2.19985E+00         1.12294E+01
+          1.39494E-02         1.61571E-02        -1.39315E-02         8.76351E-01         1.23451E+00         8.76461E-01         1.37993E+01         1.00000E+00         3.99339E-03         1.37993E+01         2.38566E+00         1.14136E+01
+          1.39494E-02         1.63270E-02        -1.41048E-02         8.76348E-01         1.24518E+00         8.76462E-01         1.41685E+01         1.00000E+00         4.01977E-03         1.41685E+01         2.57162E+00         1.15969E+01
+          1.39494E-02         1.64968E-02        -1.42800E-02         8.76346E-01         1.25585E+00         8.76462E-01         1.45341E+01         1.00000E+00         4.04638E-03         1.45341E+01         2.75662E+00         1.17775E+01
+          1.39494E-02         1.66666E-02        -1.44569E-02         8.76343E-01         1.26652E+00         8.76463E-01         1.48934E+01         1.00000E+00         4.07318E-03         1.48934E+01         2.93962E+00         1.19538E+01
+          1.39494E-02         1.68364E-02        -1.46357E-02         8.76341E-01         1.27719E+00         8.76463E-01         1.52439E+01         1.00000E+00         4.10016E-03         1.52439E+01         3.11961E+00         1.21243E+01
+          1.39494E-02         1.70063E-02        -1.48162E-02         8.76338E-01         1.28786E+00         8.76464E-01         1.55833E+01         1.00000E+00         4.12728E-03         1.55833E+01         3.29570E+00         1.22876E+01
+          1.39494E-02         1.71761E-02        -1.49986E-02         8.76336E-01         1.29853E+00         8.76464E-01         1.59093E+01         1.00000E+00         4.15451E-03         1.59093E+01         3.46703E+00         1.24422E+01
+          1.39494E-02         1.73459E-02        -1.51828E-02         8.76333E-01         1.30920E+00         8.76465E-01         1.62199E+01         1.00000E+00         4.18184E-03         1.62199E+01         3.63280E+00         1.25871E+01
+          1.39494E-02         1.75158E-02        -1.53688E-02         8.76331E-01         1.31987E+00         8.76465E-01         1.65134E+01         1.00000E+00         4.20923E-03         1.65134E+01         3.79229E+00         1.27211E+01
+          1.39494E-02         1.76856E-02        -1.55566E-02         8.76328E-01         1.33054E+00         8.76466E-01         1.67881E+01         1.00000E+00         4.23667E-03         1.67881E+01         3.94485E+00         1.28432E+01
+          1.39494E-02         1.78554E-02        -1.57463E-02         8.76325E-01         1.34121E+00         8.76467E-01         1.70424E+01         1.00000E+00         4.26412E-03         1.70424E+01         4.08988E+00         1.29525E+01
+          1.39494E-02         1.80252E-02        -1.59377E-02         8.76323E-01         1.35188E+00         8.76468E-01         1.72751E+01         1.00000E+00         4.29156E-03         1.72751E+01         4.22685E+00         1.30482E+01
+          1.39494E-02         1.81951E-02        -1.61310E-02         8.76320E-01         1.36255E+00         8.76468E-01         1.74850E+01         1.00000E+00         4.31897E-03         1.74850E+01         4.35530E+00         1.31297E+01
+          1.39494E-02         1.83649E-02        -1.63261E-02         8.76317E-01         1.37322E+00         8.76469E-01         1.76711E+01         1.00000E+00         4.34632E-03         1.76711E+01         4.47480E+00         1.31963E+01
+          1.39494E-02         1.85347E-02        -1.65229E-02         8.76315E-01         1.38389E+00         8.76470E-01         1.78326E+01         1.00000E+00         4.37360E-03         1.78326E+01         4.58502E+00         1.32476E+01
+          1.39494E-02         1.87045E-02        -1.67216E-02         8.76312E-01         1.39457E+00         8.76471E-01         1.79688E+01         1.00000E+00         4.40077E-03         1.79688E+01         4.68567E+00         1.32831E+01
+          1.39494E-02         1.88744E-02        -1.69221E-02         8.76309E-01         1.40524E+00         8.76472E-01         1.80792E+01         1.00000E+00         4.42783E-03         1.80792E+01         4.77651E+00         1.33026E+01
+          1.39494E-02         1.90442E-02        -1.71245E-02         8.76306E-01         1.41591E+00         8.76473E-01         1.81633E+01         1.00000E+00         4.45473E-03         1.81633E+01         4.85737E+00         1.33059E+01
+          1.39494E-02         1.92140E-02        -1.73286E-02         8.76303E-01         1.42658E+00         8.76475E-01         1.82210E+01         1.00000E+00         4.48147E-03         1.82210E+01         4.92812E+00         1.32929E+01
+          1.39494E-02         1.93839E-02        -1.75346E-02         8.76300E-01         1.43725E+00         8.76476E-01         1.82521E+01         1.00000E+00         4.50802E-03         1.82521E+01         4.98868E+00         1.32634E+01
+          1.39494E-02         1.95537E-02        -1.77423E-02         8.76298E-01         1.44792E+00         8.76477E-01         1.82567E+01         1.00000E+00         4.53437E-03         1.82567E+01         5.03904E+00         1.32177E+01
+          1.39494E-02         1.97235E-02        -1.79519E-02         8.76295E-01         1.45859E+00         8.76478E-01         1.82350E+01         1.00000E+00         4.56049E-03         1.82350E+01         5.07922E+00         1.31557E+01
+          1.39494E-02         1.98933E-02        -1.81633E-02         8.76292E-01         1.46926E+00         8.76480E-01         1.81871E+01         1.00000E+00         4.58635E-03         1.81871E+01         5.10927E+00         1.30778E+01
+          1.39494E-02         2.00632E-02        -1.83765E-02         8.76289E-01         1.47993E+00         8.76481E-01         1.81135E+01         1.00000E+00         4.61195E-03         1.81135E+01         5.12932E+00         1.29842E+01
+          1.39494E-02         2.02330E-02        -1.85915E-02         8.76286E-01         1.49060E+00         8.76483E-01         1.80147E+01         1.00000E+00         4.63727E-03         1.80147E+01         5.13950E+00         1.28752E+01
+          1.39494E-02         2.04028E-02        -1.88083E-02         8.76283E-01         1.50127E+00         8.76484E-01         1.78912E+01         1.00000E+00         4.66227E-03         1.78912E+01         5.14001E+00         1.27512E+01
+          1.39494E-02         2.05726E-02        -1.90270E-02         8.76280E-01         1.51194E+00         8.76486E-01         1.77439E+01         1.00000E+00         4.68696E-03         1.77439E+01         5.13107E+00         1.26128E+01
+          1.39494E-02         2.07425E-02        -1.92474E-02         8.76277E-01         1.52261E+00         8.76488E-01         1.75733E+01         1.00000E+00         4.71130E-03         1.75733E+01         5.11292E+00         1.24604E+01
+          1.39494E-02         2.09123E-02        -1.94697E-02         8.76273E-01         1.53328E+00         8.76490E-01         1.73805E+01         1.00000E+00         4.73529E-03         1.73805E+01         5.08585E+00         1.22947E+01
+          1.39494E-02         2.10821E-02        -1.96938E-02         8.76270E-01         1.54395E+00         8.76492E-01         1.71663E+01         1.00000E+00         4.75890E-03         1.71663E+01         5.05017E+00         1.21162E+01
+          1.39494E-02         2.12520E-02        -1.99197E-02         8.76267E-01         1.55462E+00         8.76494E-01         1.69318E+01         1.00000E+00         4.78212E-03         1.69318E+01         5.00622E+00         1.19256E+01
+          1.39494E-02         2.14218E-02        -2.01474E-02         8.76264E-01         1.56529E+00         8.76496E-01         1.66780E+01         1.00000E+00         4.80492E-03         1.66780E+01         4.95435E+00         1.17236E+01
+          1.39494E-02         2.15916E-02        -2.03769E-02         8.76261E-01         1.57596E+00         8.76498E-01         1.64060E+01         1.00000E+00         4.82731E-03         1.64060E+01         4.89493E+00         1.15110E+01
+          1.39494E-02         2.17614E-02        -2.06082E-02         8.76258E-01         1.58664E+00         8.76500E-01         1.61170E+01         1.00000E+00         4.84925E-03         1.61170E+01         4.82836E+00         1.12886E+01
+          1.39494E-02         2.19313E-02        -2.08414E-02         8.76254E-01         1.59731E+00         8.76502E-01         1.58122E+01         1.00000E+00         4.87074E-03         1.58122E+01         4.75505E+00         1.10571E+01
+          1.39494E-02         2.21011E-02        -2.10763E-02         8.76251E-01         1.60798E+00         8.76504E-01         1.54928E+01         1.00000E+00         4.89177E-03         1.54928E+01         4.67541E+00         1.08174E+01
+          1.39494E-02         2.22709E-02        -2.13131E-02         8.76248E-01         1.61865E+00         8.76507E-01         1.51601E+01         1.00000E+00         4.91230E-03         1.51601E+01         4.58987E+00         1.05703E+01
+          1.39494E-02         2.24407E-02        -2.15517E-02         8.76244E-01         1.62932E+00         8.76509E-01         1.48155E+01         1.00000E+00         4.93234E-03         1.48155E+01         4.49888E+00         1.03166E+01
+          1.39494E-02         2.26106E-02        -2.17921E-02         8.76241E-01         1.63999E+00         8.76512E-01         1.44601E+01         1.00000E+00         4.95188E-03         1.44601E+01         4.40287E+00         1.00573E+01
+          1.39494E-02         2.27804E-02        -2.20343E-02         8.76238E-01         1.65066E+00         8.76515E-01         1.40954E+01         1.00000E+00         4.97088E-03         1.40954E+01         4.30230E+00         9.79311E+00
+          1.39494E-02         2.29502E-02        -2.22783E-02         8.76234E-01         1.66133E+00         8.76517E-01         1.37226E+01         1.00000E+00         4.98936E-03         1.37226E+01         4.19760E+00         9.52502E+00
+          1.39494E-02         2.31201E-02        -2.25242E-02         8.76231E-01         1.67200E+00         8.76520E-01         1.33431E+01         1.00000E+00         5.00729E-03         1.33431E+01         4.08922E+00         9.25388E+00
+          1.39494E-02         2.32899E-02        -2.27718E-02         8.76227E-01         1.68267E+00         8.76523E-01         1.29581E+01         1.00000E+00         5.02466E-03         1.29581E+01         3.97762E+00         8.98053E+00
+          1.39494E-02         2.34597E-02        -2.30213E-02         8.76224E-01         1.69334E+00         8.76526E-01         1.25690E+01         1.00000E+00         5.04146E-03         1.25690E+01         3.86322E+00         8.70583E+00
+          1.39494E-02         2.36295E-02        -2.32726E-02         8.76220E-01         1.70401E+00         8.76529E-01         1.21771E+01         1.00000E+00         5.05768E-03         1.21771E+01         3.74646E+00         8.43064E+00
+          1.39494E-02         2.37994E-02        -2.35257E-02         8.76217E-01         1.71468E+00         8.76533E-01         1.17835E+01         1.00000E+00         5.07332E-03         1.17835E+01         3.62777E+00         8.15577E+00
+          1.39494E-02         2.39692E-02        -2.37806E-02         8.76213E-01         1.72535E+00         8.76536E-01         1.13896E+01         1.00000E+00         5.08835E-03         1.13896E+01         3.50756E+00         7.88205E+00
+          1.39494E-02         2.41390E-02        -2.40373E-02         8.76210E-01         1.73602E+00         8.76539E-01         1.09965E+01         1.00000E+00         5.10278E-03         1.09965E+01         3.38625E+00         7.61025E+00
+          1.39494E-02         2.43088E-02        -2.42958E-02         8.76206E-01         1.74669E+00         8.76543E-01         1.06054E+01         1.00000E+00         5.11660E-03         1.06054E+01         3.26422E+00         7.34114E+00
+          1.39494E-02         2.44787E-02        -2.45562E-02         8.76202E-01         1.75736E+00         8.76546E-01         1.02173E+01         1.00000E+00         5.12980E-03         1.02173E+01         3.14186E+00         7.07546E+00
+          1.39494E-02         2.46485E-02        -2.48183E-02         8.76199E-01         1.76804E+00         8.76550E-01         9.83346E+00         1.00000E+00         5.14237E-03         9.83346E+00         3.01954E+00         6.81393E+00
+          1.39494E-02         2.48183E-02        -2.50823E-02         8.76195E-01         1.77871E+00         8.76554E-01         9.45481E+00         1.00000E+00         5.15430E-03         9.45482E+00         2.89761E+00         6.55721E+00
+          1.39494E-02         2.49882E-02        -2.53481E-02         8.76191E-01         1.78938E+00         8.76558E-01         9.08236E+00         1.00000E+00         5.16560E-03         9.08236E+00         2.77641E+00         6.30596E+00
+          1.39494E-02         2.51580E-02        -2.56157E-02         8.76188E-01         1.80005E+00         8.76562E-01         8.71703E+00         1.00000E+00         5.17625E-03         8.71703E+00         2.65625E+00         6.06078E+00
+          1.39494E-02         2.53278E-02        -2.58851E-02         8.76184E-01         1.81072E+00         8.76566E-01         8.35971E+00         1.00000E+00         5.18625E-03         8.35971E+00         2.53746E+00         5.82225E+00
+          1.39494E-02         2.54976E-02        -2.61563E-02         8.76180E-01         1.82139E+00         8.76570E-01         8.01121E+00         1.00000E+00         5.19559E-03         8.01121E+00         2.42031E+00         5.59090E+00
+          1.39494E-02         2.56675E-02        -2.64294E-02         8.76176E-01         1.83206E+00         8.76575E-01         7.67230E+00         1.00000E+00         5.20428E-03         7.67230E+00         2.30507E+00         5.36724E+00
+          1.39494E-02         2.58373E-02        -2.67042E-02         8.76172E-01         1.84273E+00         8.76579E-01         7.34370E+00         1.00000E+00         5.21231E-03         7.34370E+00         2.19199E+00         5.15171E+00
+          1.39494E-02         2.60071E-02        -2.69809E-02         8.76169E-01         1.85340E+00         8.76584E-01         7.02604E+00         1.00000E+00         5.21967E-03         7.02604E+00         2.08131E+00         4.94473E+00
+          1.39494E-02         2.61769E-02        -2.72594E-02         8.76165E-01         1.86407E+00         8.76589E-01         6.71991E+00         1.00000E+00         5.22637E-03         6.71991E+00         1.97324E+00         4.74668E+00
+          1.41192E-02         8.72665E-04        -5.90427E-03         8.87135E-01         2.74155E-01         8.87155E-01         3.36415E+02         1.00000E+00         3.79180E-03         3.36415E+02         1.24210E+02         2.12205E+02
+          1.41192E-02         1.04249E-03        -5.91448E-03         8.87135E-01         2.84826E-01         8.87155E-01         3.30177E+02         1.00000E+00         3.76185E-03         3.30177E+02         1.21902E+02         2.08275E+02
+          1.41192E-02         1.21232E-03        -5.92651E-03         8.87135E-01         2.95496E-01         8.87155E-01         3.23807E+02         1.00000E+00         3.73138E-03         3.23807E+02         1.19544E+02         2.04263E+02
+          1.41192E-02         1.38215E-03        -5.94035E-03         8.87135E-01         3.06167E-01         8.87155E-01         3.17314E+02         1.00000E+00         3.70045E-03         3.17314E+02         1.17137E+02         2.00177E+02
+          1.41192E-02         1.55197E-03        -5.95600E-03         8.87135E-01         3.16838E-01         8.87155E-01         3.10709E+02         1.00000E+00         3.66913E-03         3.10709E+02         1.14687E+02         1.96022E+02
+          1.41192E-02         1.72180E-03        -5.97347E-03         8.87134E-01         3.27508E-01         8.87154E-01         3.04002E+02         1.00000E+00         3.63747E-03         3.04002E+02         1.12196E+02         1.91806E+02
+          1.41192E-02         1.89163E-03        -5.99275E-03         8.87134E-01         3.38179E-01         8.87154E-01         2.97203E+02         1.00000E+00         3.60553E-03         2.97203E+02         1.09668E+02         1.87535E+02
+          1.41192E-02         2.06146E-03        -6.01383E-03         8.87134E-01         3.48849E-01         8.87154E-01         2.90324E+02         1.00000E+00         3.57338E-03         2.90324E+02         1.07108E+02         1.83216E+02
+          1.41192E-02         2.23128E-03        -6.03674E-03         8.87133E-01         3.59520E-01         8.87154E-01         2.83375E+02         1.00000E+00         3.54107E-03         2.83375E+02         1.04519E+02         1.78856E+02
+          1.41192E-02         2.40111E-03        -6.06145E-03         8.87133E-01         3.70190E-01         8.87154E-01         2.76365E+02         1.00000E+00         3.50867E-03         2.76365E+02         1.01904E+02         1.74461E+02
+          1.41192E-02         2.57094E-03        -6.08797E-03         8.87133E-01         3.80861E-01         8.87154E-01         2.69307E+02         1.00000E+00         3.47623E-03         2.69307E+02         9.92679E+01         1.70039E+02
+          1.41192E-02         2.74077E-03        -6.11631E-03         8.87132E-01         3.91532E-01         8.87153E-01         2.62209E+02         1.00000E+00         3.44382E-03         2.62209E+02         9.66141E+01         1.65595E+02
+          1.41192E-02         2.91059E-03        -6.14646E-03         8.87132E-01         4.02202E-01         8.87153E-01         2.55083E+02         1.00000E+00         3.41149E-03         2.55083E+02         9.39466E+01         1.61136E+02
+          1.41192E-02         3.08042E-03        -6.17842E-03         8.87131E-01         4.12873E-01         8.87153E-01         2.47938E+02         1.00000E+00         3.37930E-03         2.47938E+02         9.12689E+01         1.56669E+02
+          1.41192E-02         3.25025E-03        -6.21219E-03         8.87131E-01         4.23543E-01         8.87153E-01         2.40785E+02         1.00000E+00         3.34730E-03         2.40785E+02         8.85848E+01         1.52200E+02
+          1.41192E-02         3.42008E-03        -6.24778E-03         8.87130E-01         4.34214E-01         8.87152E-01         2.33633E+02         1.00000E+00         3.31554E-03         2.33633E+02         8.58981E+01         1.47735E+02
+          1.41192E-02         3.58990E-03        -6.28517E-03         8.87130E-01         4.44884E-01         8.87152E-01         2.26493E+02         1.00000E+00         3.28410E-03         2.26493E+02         8.32123E+01         1.43280E+02
+          1.41192E-02         3.75973E-03        -6.32438E-03         8.87129E-01         4.55555E-01         8.87152E-01         2.19373E+02         1.00000E+00         3.25300E-03         2.19373E+02         8.05310E+01         1.38842E+02
+          1.41192E-02         3.92956E-03        -6.36540E-03         8.87129E-01         4.66225E-01         8.87152E-01         2.12284E+02         1.00000E+00         3.22231E-03         2.12284E+02         7.78578E+01         1.34426E+02
+          1.41192E-02         4.09939E-03        -6.40824E-03         8.87128E-01         4.76896E-01         8.87151E-01         2.05235E+02         1.00000E+00         3.19208E-03         2.05235E+02         7.51962E+01         1.30038E+02
+          1.41192E-02         4.26921E-03        -6.45288E-03         8.87128E-01         4.87567E-01         8.87151E-01         1.98233E+02         1.00000E+00         3.16234E-03         1.98233E+02         7.25495E+01         1.25684E+02
+          1.41192E-02         4.43904E-03        -6.49934E-03         8.87127E-01         4.98237E-01         8.87151E-01         1.91289E+02         1.00000E+00         3.13315E-03         1.91289E+02         6.99210E+01         1.21368E+02
+          1.41192E-02         4.60887E-03        -6.54761E-03         8.87126E-01         5.08908E-01         8.87150E-01         1.84410E+02         1.00000E+00         3.10455E-03         1.84410E+02         6.73140E+01         1.17096E+02
+          1.41192E-02         4.77869E-03        -6.59769E-03         8.87126E-01         5.19578E-01         8.87150E-01         1.77605E+02         1.00000E+00         3.07658E-03         1.77605E+02         6.47316E+01         1.12874E+02
+          1.41192E-02         4.94852E-03        -6.64958E-03         8.87125E-01         5.30249E-01         8.87150E-01         1.70881E+02         1.00000E+00         3.04928E-03         1.70881E+02         6.21768E+01         1.08704E+02
+          1.41192E-02         5.11835E-03        -6.70329E-03         8.87124E-01         5.40919E-01         8.87149E-01         1.64246E+02         1.00000E+00         3.02269E-03         1.64246E+02         5.96526E+01         1.04593E+02
+          1.41192E-02         5.28818E-03        -6.75880E-03         8.87123E-01         5.51590E-01         8.87149E-01         1.57707E+02         1.00000E+00         2.99683E-03         1.57707E+02         5.71617E+01         1.00545E+02
+          1.41192E-02         5.45800E-03        -6.81613E-03         8.87122E-01         5.62261E-01         8.87149E-01         1.51270E+02         1.00000E+00         2.97175E-03         1.51270E+02         5.47070E+01         9.65632E+01
+          1.41192E-02         5.62783E-03        -6.87527E-03         8.87122E-01         5.72931E-01         8.87148E-01         1.44943E+02         1.00000E+00         2.94748E-03         1.44943E+02         5.22911E+01         9.26520E+01
+          1.41192E-02         5.79766E-03        -6.93623E-03         8.87121E-01         5.83602E-01         8.87148E-01         1.38731E+02         1.00000E+00         2.92404E-03         1.38731E+02         4.99162E+01         8.88151E+01
+          1.41192E-02         5.96749E-03        -6.99899E-03         8.87120E-01         5.94272E-01         8.87147E-01         1.32641E+02         1.00000E+00         2.90145E-03         1.32641E+02         4.75850E+01         8.50559E+01
+          1.41192E-02         6.13731E-03        -7.06357E-03         8.87119E-01         6.04943E-01         8.87147E-01         1.26677E+02         1.00000E+00         2.87975E-03         1.26677E+02         4.52995E+01         8.13776E+01
+          1.41192E-02         6.30714E-03        -7.12996E-03         8.87118E-01         6.15613E-01         8.87147E-01         1.20845E+02         1.00000E+00         2.85895E-03         1.20845E+02         4.30619E+01         7.77830E+01
+          1.41192E-02         6.47697E-03        -7.19816E-03         8.87117E-01         6.26284E-01         8.87146E-01         1.15149E+02         1.00000E+00         2.83908E-03         1.15149E+02         4.08741E+01         7.42750E+01
+          1.41192E-02         6.64680E-03        -7.26817E-03         8.87116E-01         6.36955E-01         8.87146E-01         1.09594E+02         1.00000E+00         2.82014E-03         1.09594E+02         3.87379E+01         7.08560E+01
+          1.41192E-02         6.81662E-03        -7.34000E-03         8.87115E-01         6.47625E-01         8.87145E-01         1.04183E+02         1.00000E+00         2.80217E-03         1.04183E+02         3.66551E+01         6.75282E+01
+          1.41192E-02         6.98645E-03        -7.41364E-03         8.87114E-01         6.58296E-01         8.87145E-01         9.89209E+01         1.00000E+00         2.78516E-03         9.89209E+01         3.46272E+01         6.42937E+01
+          1.41192E-02         7.15628E-03        -7.48909E-03         8.87113E-01         6.68966E-01         8.87145E-01         9.38097E+01         1.00000E+00         2.76913E-03         9.38097E+01         3.26555E+01         6.11541E+01
+          1.41192E-02         7.32611E-03        -7.56635E-03         8.87112E-01         6.79637E-01         8.87144E-01         8.88525E+01         1.00000E+00         2.75409E-03         8.88525E+01         3.07415E+01         5.81111E+01
+          1.41192E-02         7.49593E-03        -7.64542E-03         8.87111E-01         6.90307E-01         8.87144E-01         8.40518E+01         1.00000E+00         2.74005E-03         8.40518E+01         2.88861E+01         5.51657E+01
+          1.41192E-02         7.66576E-03        -7.72631E-03         8.87110E-01         7.00978E-01         8.87143E-01         7.94097E+01         1.00000E+00         2.72701E-03         7.94097E+01         2.70904E+01         5.23192E+01
+          1.41192E-02         7.83559E-03        -7.80901E-03         8.87108E-01         7.11649E-01         8.87143E-01         7.49276E+01         1.00000E+00         2.71498E-03         7.49276E+01         2.53553E+01         4.95724E+01
+          1.41192E-02         8.00542E-03        -7.89352E-03         8.87107E-01         7.22319E-01         8.87142E-01         7.06070E+01         1.00000E+00         2.70395E-03         7.06070E+01         2.36813E+01         4.69257E+01
+          1.41192E-02         8.17524E-03        -7.97984E-03         8.87106E-01         7.32990E-01         8.87142E-01         6.64488E+01         1.00000E+00         2.69394E-03         6.64488E+01         2.20692E+01         4.43796E+01
+          1.41192E-02         8.34507E-03        -8.06797E-03         8.87105E-01         7.43660E-01         8.87141E-01         6.24535E+01         1.00000E+00         2.68493E-03         6.24535E+01         2.05193E+01         4.19343E+01
+          1.41192E-02         8.51490E-03        -8.15792E-03         8.87103E-01         7.54331E-01         8.87141E-01         5.86215E+01         1.00000E+00         2.67693E-03         5.86215E+01         1.90319E+01         3.95896E+01
+          1.41192E-02         8.68473E-03        -8.24968E-03         8.87102E-01         7.65001E-01         8.87141E-01         5.49525E+01         1.00000E+00         2.66992E-03         5.49525E+01         1.76071E+01         3.73454E+01
+          1.41192E-02         8.85455E-03        -8.34325E-03         8.87101E-01         7.75672E-01         8.87140E-01         5.14462E+01         1.00000E+00         2.66392E-03         5.14462E+01         1.62451E+01         3.52011E+01
+          1.41192E-02         9.02438E-03        -8.43864E-03         8.87100E-01         7.86343E-01         8.87140E-01         4.81017E+01         1.00000E+00         2.65890E-03         4.81017E+01         1.49456E+01         3.31561E+01
+          1.41192E-02         9.19421E-03        -8.53583E-03         8.87098E-01         7.97013E-01         8.87139E-01         4.49181E+01         1.00000E+00         2.65487E-03         4.49181E+01         1.37085E+01         3.12096E+01
+          1.41192E-02         9.36403E-03        -8.63484E-03         8.87097E-01         8.07684E-01         8.87139E-01         4.18940E+01         1.00000E+00         2.65181E-03         4.18940E+01         1.25334E+01         2.93606E+01
+          1.41192E-02         9.53386E-03        -8.73566E-03         8.87095E-01         8.18354E-01         8.87138E-01         3.90276E+01         1.00000E+00         2.64971E-03         3.90276E+01         1.14198E+01         2.76079E+01
+          1.41192E-02         9.70369E-03        -8.83829E-03         8.87094E-01         8.29025E-01         8.87138E-01         3.63171E+01         1.00000E+00         2.64857E-03         3.63171E+01         1.03671E+01         2.59500E+01
+          1.41192E-02         9.87352E-03        -8.94274E-03         8.87092E-01         8.39695E-01         8.87137E-01         3.37603E+01         1.00000E+00         2.64837E-03         3.37603E+01         9.37469E+00         2.43856E+01
+          1.41192E-02         1.00433E-02        -9.04899E-03         8.87091E-01         8.50366E-01         8.87137E-01         3.13547E+01         1.00000E+00         2.64910E-03         3.13547E+01         8.44169E+00         2.29130E+01
+          1.41192E-02         1.02132E-02        -9.15706E-03         8.87089E-01         8.61037E-01         8.87137E-01         2.90976E+01         1.00000E+00         2.65075E-03         2.90976E+01         7.56720E+00         2.15304E+01
+          1.41192E-02         1.03830E-02        -9.26694E-03         8.87088E-01         8.71707E-01         8.87136E-01         2.69860E+01         1.00000E+00         2.65330E-03         2.69860E+01         6.75021E+00         2.02358E+01
+          1.41192E-02         1.05528E-02        -9.37864E-03         8.87086E-01         8.82378E-01         8.87136E-01         2.50169E+01         1.00000E+00         2.65674E-03         2.50169E+01         5.98962E+00         1.90273E+01
+          1.41192E-02         1.07227E-02        -9.49214E-03         8.87085E-01         8.93048E-01         8.87135E-01         2.31869E+01         1.00000E+00         2.66106E-03         2.31869E+01         5.28424E+00         1.79026E+01
+          1.41192E-02         1.08925E-02        -9.60746E-03         8.87083E-01         9.03719E-01         8.87135E-01         2.14924E+01         1.00000E+00         2.66623E-03         2.14924E+01         4.63279E+00         1.68596E+01
+          1.41192E-02         1.10623E-02        -9.72459E-03         8.87081E-01         9.14389E-01         8.87135E-01         1.99298E+01         1.00000E+00         2.67225E-03         1.99298E+01         4.03392E+00         1.58959E+01
+          1.41192E-02         1.12321E-02        -9.84353E-03         8.87080E-01         9.25060E-01         8.87134E-01         1.84952E+01         1.00000E+00         2.67910E-03         1.84952E+01         3.48620E+00         1.50090E+01
+          1.41192E-02         1.14020E-02        -9.96429E-03         8.87078E-01         9.35731E-01         8.87134E-01         1.71846E+01         1.00000E+00         2.68675E-03         1.71846E+01         2.98815E+00         1.41965E+01
+          1.41192E-02         1.15718E-02        -1.00869E-02         8.87076E-01         9.46401E-01         8.87134E-01         1.59938E+01         1.00000E+00         2.69520E-03         1.59938E+01         2.53822E+00         1.34556E+01
+          1.41192E-02         1.17416E-02        -1.02112E-02         8.87074E-01         9.57072E-01         8.87133E-01         1.49187E+01         1.00000E+00         2.70442E-03         1.49187E+01         2.13478E+00         1.27839E+01
+          1.41192E-02         1.19114E-02        -1.03374E-02         8.87073E-01         9.67742E-01         8.87133E-01         1.39547E+01         1.00000E+00         2.71439E-03         1.39547E+01         1.77619E+00         1.21785E+01
+          1.41192E-02         1.20813E-02        -1.04654E-02         8.87071E-01         9.78413E-01         8.87133E-01         1.30976E+01         1.00000E+00         2.72511E-03         1.30976E+01         1.46073E+00         1.16368E+01
+          1.41192E-02         1.22511E-02        -1.05952E-02         8.87069E-01         9.89083E-01         8.87132E-01         1.23427E+01         1.00000E+00         2.73654E-03         1.23427E+01         1.18668E+00         1.11560E+01
+          1.41192E-02         1.24209E-02        -1.07269E-02         8.87067E-01         9.99754E-01         8.87132E-01         1.16854E+01         1.00000E+00         2.74866E-03         1.16854E+01         9.52253E-01         1.07332E+01
+          1.41192E-02         1.25908E-02        -1.08603E-02         8.87065E-01         1.01042E+00         8.87132E-01         1.11212E+01         1.00000E+00         2.76147E-03         1.11212E+01         7.55647E-01         1.03656E+01
+          1.41192E-02         1.27606E-02        -1.09956E-02         8.87063E-01         1.02110E+00         8.87132E-01         1.06454E+01         1.00000E+00         2.77493E-03         1.06454E+01         5.95040E-01         1.00504E+01
+          1.41192E-02         1.29304E-02        -1.11326E-02         8.87061E-01         1.03177E+00         8.87131E-01         1.02533E+01         1.00000E+00         2.78903E-03         1.02533E+01         4.68591E-01         9.78473E+00
+          1.41192E-02         1.31002E-02        -1.12715E-02         8.87060E-01         1.04244E+00         8.87131E-01         9.94019E+00         1.00000E+00         2.80375E-03         9.94019E+00         3.74452E-01         9.56574E+00
+          1.41192E-02         1.32701E-02        -1.14122E-02         8.87058E-01         1.05311E+00         8.87131E-01         9.70135E+00         1.00000E+00         2.81907E-03         9.70135E+00         3.10764E-01         9.39059E+00
+          1.41192E-02         1.34399E-02        -1.15547E-02         8.87056E-01         1.06378E+00         8.87131E-01         9.53214E+00         1.00000E+00         2.83496E-03         9.53214E+00         2.75673E-01         9.25646E+00
+          1.41192E-02         1.36097E-02        -1.16990E-02         8.87053E-01         1.07445E+00         8.87131E-01         9.42789E+00         1.00000E+00         2.85141E-03         9.42789E+00         2.67326E-01         9.16056E+00
+          1.41192E-02         1.37795E-02        -1.18452E-02         8.87051E-01         1.08512E+00         8.87131E-01         9.38399E+00         1.00000E+00         2.86839E-03         9.38399E+00         2.83881E-01         9.10011E+00
+          1.41192E-02         1.39494E-02        -1.19931E-02         8.87049E-01         1.09579E+00         8.87130E-01         9.39589E+00         1.00000E+00         2.88588E-03         9.39589E+00         3.23512E-01         9.07238E+00
+          1.41192E-02         1.41192E-02        -1.21429E-02         8.87047E-01         1.10646E+00         8.87130E-01         9.45908E+00         1.00000E+00         2.90386E-03         9.45908E+00         3.84411E-01         9.07467E+00
+          1.41192E-02         1.42890E-02        -1.22944E-02         8.87045E-01         1.11713E+00         8.87130E-01         9.56913E+00         1.00000E+00         2.92230E-03         9.56913E+00         4.64792E-01         9.10434E+00
+          1.41192E-02         1.44589E-02        -1.24478E-02         8.87043E-01         1.12780E+00         8.87130E-01         9.72169E+00         1.00000E+00         2.94120E-03         9.72169E+00         5.62900E-01         9.15879E+00
+          1.41192E-02         1.46287E-02        -1.26030E-02         8.87041E-01         1.13847E+00         8.87130E-01         9.91248E+00         1.00000E+00         2.96052E-03         9.91248E+00         6.77009E-01         9.23547E+00
+          1.41192E-02         1.47985E-02        -1.27600E-02         8.87039E-01         1.14914E+00         8.87130E-01         1.01373E+01         1.00000E+00         2.98024E-03         1.01373E+01         8.05431E-01         9.33191E+00
+          1.41192E-02         1.49683E-02        -1.29188E-02         8.87036E-01         1.15981E+00         8.87130E-01         1.03922E+01         1.00000E+00         3.00035E-03         1.03922E+01         9.46517E-01         9.44570E+00
+          1.41192E-02         1.51382E-02        -1.30794E-02         8.87034E-01         1.17048E+00         8.87130E-01         1.06732E+01         1.00000E+00         3.02082E-03         1.06732E+01         1.09866E+00         9.57450E+00
+          1.41192E-02         1.53080E-02        -1.32419E-02         8.87032E-01         1.18115E+00         8.87131E-01         1.09763E+01         1.00000E+00         3.04162E-03         1.09763E+01         1.26029E+00         9.71602E+00
+          1.41192E-02         1.54778E-02        -1.34061E-02         8.87029E-01         1.19182E+00         8.87131E-01         1.12980E+01         1.00000E+00         3.06274E-03         1.12980E+01         1.42991E+00         9.86808E+00
+          1.41192E-02         1.56476E-02        -1.35722E-02         8.87027E-01         1.20249E+00         8.87131E-01         1.16346E+01         1.00000E+00         3.08415E-03         1.16346E+01         1.60606E+00         1.00286E+01
+          1.41192E-02         1.58175E-02        -1.37401E-02         8.87025E-01         1.21317E+00         8.87131E-01         1.19828E+01         1.00000E+00         3.10584E-03         1.19828E+01         1.78731E+00         1.01955E+01
+          1.41192E-02         1.59873E-02        -1.39098E-02         8.87022E-01         1.22384E+00         8.87131E-01         1.23391E+01         1.00000E+00         3.12779E-03         1.23391E+01         1.97233E+00         1.03668E+01
+          1.41192E-02         1.61571E-02        -1.40813E-02         8.87020E-01         1.23451E+00         8.87132E-01         1.27006E+01         1.00000E+00         3.14996E-03         1.27006E+01         2.15983E+00         1.05407E+01
+          1.41192E-02         1.63270E-02        -1.42546E-02         8.87017E-01         1.24518E+00         8.87132E-01         1.30640E+01         1.00000E+00         3.17234E-03         1.30640E+01         2.34856E+00         1.07155E+01
+          1.41192E-02         1.64968E-02        -1.44297E-02         8.87015E-01         1.25585E+00         8.87132E-01         1.34267E+01         1.00000E+00         3.19492E-03         1.34267E+01         2.53736E+00         1.08894E+01
+          1.41192E-02         1.66666E-02        -1.46067E-02         8.87012E-01         1.26652E+00         8.87133E-01         1.37860E+01         1.00000E+00         3.21766E-03         1.37860E+01         2.72512E+00         1.10609E+01
+          1.41192E-02         1.68364E-02        -1.47854E-02         8.87010E-01         1.27719E+00         8.87133E-01         1.41392E+01         1.00000E+00         3.24055E-03         1.41392E+01         2.91080E+00         1.12284E+01
+          1.41192E-02         1.70063E-02        -1.49660E-02         8.87007E-01         1.28786E+00         8.87134E-01         1.44840E+01         1.00000E+00         3.26357E-03         1.44840E+01         3.09341E+00         1.13906E+01
+          1.41192E-02         1.71761E-02        -1.51484E-02         8.87005E-01         1.29853E+00         8.87134E-01         1.48183E+01         1.00000E+00         3.28670E-03         1.48183E+01         3.27203E+00         1.15463E+01
+          1.41192E-02         1.73459E-02        -1.53326E-02         8.87002E-01         1.30920E+00         8.87135E-01         1.51399E+01         1.00000E+00         3.30992E-03         1.51399E+01         3.44582E+00         1.16941E+01
+          1.41192E-02         1.75158E-02        -1.55186E-02         8.87000E-01         1.31987E+00         8.87135E-01         1.54469E+01         1.00000E+00         3.33321E-03         1.54469E+01         3.61399E+00         1.18329E+01
+          1.41192E-02         1.76856E-02        -1.57064E-02         8.86997E-01         1.33054E+00         8.87136E-01         1.57377E+01         1.00000E+00         3.35655E-03         1.57377E+01         3.77581E+00         1.19618E+01
+          1.41192E-02         1.78554E-02        -1.58960E-02         8.86994E-01         1.34121E+00         8.87137E-01         1.60105E+01         1.00000E+00         3.37992E-03         1.60105E+01         3.93064E+00         1.20799E+01
+          1.41192E-02         1.80252E-02        -1.60875E-02         8.86992E-01         1.35188E+00         8.87137E-01         1.62641E+01         1.00000E+00         3.40330E-03         1.62641E+01         4.07787E+00         1.21863E+01
+          1.41192E-02         1.81951E-02        -1.62807E-02         8.86989E-01         1.36255E+00         8.87138E-01         1.64972E+01         1.00000E+00         3.42668E-03         1.64972E+01         4.21698E+00         1.22802E+01
+          1.41192E-02         1.83649E-02        -1.64758E-02         8.86986E-01         1.37322E+00         8.87139E-01         1.67086E+01         1.00000E+00         3.45004E-03         1.67086E+01         4.34750E+00         1.23611E+01
+          1.41192E-02         1.85347E-02        -1.66727E-02         8.86983E-01         1.38389E+00         8.87140E-01         1.68974E+01         1.00000E+00         3.47335E-03         1.68974E+01         4.46902E+00         1.24284E+01
+          1.41192E-02         1.87045E-02        -1.68714E-02         8.86980E-01         1.39457E+00         8.87141E-01         1.70628E+01         1.00000E+00         3.49661E-03         1.70628E+01         4.58120E+00         1.24816E+01
+          1.41192E-02         1.88744E-02        -1.70719E-02         8.86978E-01         1.40524E+00         8.87142E-01         1.72041E+01         1.00000E+00         3.51979E-03         1.72041E+01         4.68374E+00         1.25204E+01
+          1.41192E-02         1.90442E-02        -1.72742E-02         8.86975E-01         1.41591E+00         8.87143E-01         1.73208E+01         1.00000E+00         3.54288E-03         1.73208E+01         4.77642E+00         1.25444E+01
+          1.41192E-02         1.92140E-02        -1.74783E-02         8.86972E-01         1.42658E+00         8.87144E-01         1.74125E+01         1.00000E+00         3.56585E-03         1.74125E+01         4.85906E+00         1.25535E+01
+          1.41192E-02         1.93839E-02        -1.76843E-02         8.86969E-01         1.43725E+00         8.87145E-01         1.74790E+01         1.00000E+00         3.58871E-03         1.74790E+01         4.93154E+00         1.25475E+01
+          1.41192E-02         1.95537E-02        -1.78921E-02         8.86966E-01         1.44792E+00         8.87146E-01         1.75201E+01         1.00000E+00         3.61142E-03         1.75201E+01         4.99377E+00         1.25263E+01
+          1.41192E-02         1.97235E-02        -1.81016E-02         8.86963E-01         1.45859E+00         8.87148E-01         1.75358E+01         1.00000E+00         3.63397E-03         1.75358E+01         5.04575E+00         1.24901E+01
+          1.41192E-02         1.98933E-02        -1.83130E-02         8.86960E-01         1.46926E+00         8.87149E-01         1.75263E+01         1.00000E+00         3.65635E-03         1.75263E+01         5.08748E+00         1.24388E+01
+          1.41192E-02         2.00632E-02        -1.85262E-02         8.86957E-01         1.47993E+00         8.87151E-01         1.74917E+01         1.00000E+00         3.67854E-03         1.74917E+01         5.11904E+00         1.23727E+01
+          1.41192E-02         2.02330E-02        -1.87412E-02         8.86954E-01         1.49060E+00         8.87152E-01         1.74325E+01         1.00000E+00         3.70052E-03         1.74325E+01         5.14054E+00         1.22920E+01
+          1.41192E-02         2.04028E-02        -1.89581E-02         8.86951E-01         1.50127E+00         8.87154E-01         1.73490E+01         1.00000E+00         3.72229E-03         1.73490E+01         5.15212E+00         1.21969E+01
+          1.41192E-02         2.05726E-02        -1.91767E-02         8.86948E-01         1.51194E+00         8.87155E-01         1.72418E+01         1.00000E+00         3.74382E-03         1.72418E+01         5.15398E+00         1.20879E+01
+          1.41192E-02         2.07425E-02        -1.93972E-02         8.86945E-01         1.52261E+00         8.87157E-01         1.71116E+01         1.00000E+00         3.76511E-03         1.71116E+01         5.14632E+00         1.19652E+01
+          1.41192E-02         2.09123E-02        -1.96194E-02         8.86942E-01         1.53328E+00         8.87159E-01         1.69589E+01         1.00000E+00         3.78613E-03         1.69589E+01         5.12942E+00         1.18295E+01
+          1.41192E-02         2.10821E-02        -1.98435E-02         8.86938E-01         1.54395E+00         8.87160E-01         1.67847E+01         1.00000E+00         3.80688E-03         1.67847E+01         5.10354E+00         1.16811E+01
+          1.41192E-02         2.12520E-02        -2.00694E-02         8.86935E-01         1.55462E+00         8.87162E-01         1.65897E+01         1.00000E+00         3.82734E-03         1.65897E+01         5.06900E+00         1.15207E+01
+          1.41192E-02         2.14218E-02        -2.02971E-02         8.86932E-01         1.56529E+00         8.87164E-01         1.63749E+01         1.00000E+00         3.84751E-03         1.63749E+01         5.02614E+00         1.13488E+01
+          1.41192E-02         2.15916E-02        -2.05266E-02         8.86929E-01         1.57596E+00         8.87166E-01         1.61413E+01         1.00000E+00         3.86735E-03         1.61413E+01         4.97530E+00         1.11660E+01
+          1.41192E-02         2.17614E-02        -2.07580E-02         8.86926E-01         1.58664E+00         8.87168E-01         1.58899E+01         1.00000E+00         3.88687E-03         1.58899E+01         4.91688E+00         1.09730E+01
+          1.41192E-02         2.19313E-02        -2.09911E-02         8.86922E-01         1.59731E+00         8.87171E-01         1.56218E+01         1.00000E+00         3.90606E-03         1.56218E+01         4.85125E+00         1.07705E+01
+          1.41192E-02         2.21011E-02        -2.12261E-02         8.86919E-01         1.60798E+00         8.87173E-01         1.53381E+01         1.00000E+00         3.92489E-03         1.53381E+01         4.77883E+00         1.05593E+01
+          1.41192E-02         2.22709E-02        -2.14628E-02         8.86916E-01         1.61865E+00         8.87175E-01         1.50400E+01         1.00000E+00         3.94336E-03         1.50400E+01         4.70004E+00         1.03399E+01
+          1.41192E-02         2.24407E-02        -2.17014E-02         8.86912E-01         1.62932E+00         8.87178E-01         1.47286E+01         1.00000E+00         3.96146E-03         1.47286E+01         4.61530E+00         1.01133E+01
+          1.41192E-02         2.26106E-02        -2.19418E-02         8.86909E-01         1.63999E+00         8.87180E-01         1.44052E+01         1.00000E+00         3.97917E-03         1.44052E+01         4.52507E+00         9.88018E+00
+          1.41192E-02         2.27804E-02        -2.21840E-02         8.86905E-01         1.65066E+00         8.87183E-01         1.40711E+01         1.00000E+00         3.99649E-03         1.40711E+01         4.42977E+00         9.64130E+00
+          1.41192E-02         2.29502E-02        -2.24280E-02         8.86902E-01         1.66133E+00         8.87186E-01         1.37273E+01         1.00000E+00         4.01341E-03         1.37273E+01         4.32987E+00         9.39747E+00
+          1.41192E-02         2.31201E-02        -2.26739E-02         8.86899E-01         1.67200E+00         8.87188E-01         1.33753E+01         1.00000E+00         4.02992E-03         1.33753E+01         4.22579E+00         9.14949E+00
+          1.41192E-02         2.32899E-02        -2.29215E-02         8.86895E-01         1.68267E+00         8.87191E-01         1.30162E+01         1.00000E+00         4.04600E-03         1.30162E+01         4.11800E+00         8.89815E+00
+          1.41192E-02         2.34597E-02        -2.31710E-02         8.86891E-01         1.69334E+00         8.87194E-01         1.26512E+01         1.00000E+00         4.06165E-03         1.26512E+01         4.00694E+00         8.64425E+00
+          1.41192E-02         2.36295E-02        -2.34223E-02         8.86888E-01         1.70401E+00         8.87197E-01         1.22816E+01         1.00000E+00         4.07686E-03         1.22816E+01         3.89305E+00         8.38857E+00
+          1.41192E-02         2.37994E-02        -2.36754E-02         8.86884E-01         1.71468E+00         8.87200E-01         1.19087E+01         1.00000E+00         4.09163E-03         1.19087E+01         3.77676E+00         8.13190E+00
+          1.41192E-02         2.39692E-02        -2.39303E-02         8.86881E-01         1.72535E+00         8.87204E-01         1.15335E+01         1.00000E+00         4.10594E-03         1.15335E+01         3.65851E+00         7.87501E+00
+          1.41192E-02         2.41390E-02        -2.41870E-02         8.86877E-01         1.73602E+00         8.87207E-01         1.11573E+01         1.00000E+00         4.11978E-03         1.11573E+01         3.53870E+00         7.61864E+00
+          1.41192E-02         2.43088E-02        -2.44455E-02         8.86873E-01         1.74669E+00         8.87210E-01         1.07813E+01         1.00000E+00         4.13316E-03         1.07813E+01         3.41775E+00         7.36354E+00
+          1.41192E-02         2.44787E-02        -2.47059E-02         8.86870E-01         1.75736E+00         8.87214E-01         1.04065E+01         1.00000E+00         4.14606E-03         1.04065E+01         3.29605E+00         7.11042E+00
+          1.41192E-02         2.46485E-02        -2.49680E-02         8.86866E-01         1.76804E+00         8.87218E-01         1.00340E+01         1.00000E+00         4.15848E-03         1.00340E+01         3.17400E+00         6.85998E+00
+          1.41192E-02         2.48183E-02        -2.52320E-02         8.86862E-01         1.77871E+00         8.87221E-01         9.66483E+00         1.00000E+00         4.17041E-03         9.66483E+00         3.05195E+00         6.61289E+00
+          1.41192E-02         2.49882E-02        -2.54978E-02         8.86859E-01         1.78938E+00         8.87225E-01         9.30005E+00         1.00000E+00         4.18185E-03         9.30005E+00         2.93026E+00         6.36979E+00
+          1.41192E-02         2.51580E-02        -2.57654E-02         8.86855E-01         1.80005E+00         8.87229E-01         8.94058E+00         1.00000E+00         4.19279E-03         8.94058E+00         2.80927E+00         6.13131E+00
+          1.41192E-02         2.53278E-02        -2.60348E-02         8.86851E-01         1.81072E+00         8.87233E-01         8.58733E+00         1.00000E+00         4.20322E-03         8.58733E+00         2.68931E+00         5.89802E+00
+          1.41192E-02         2.54976E-02        -2.63061E-02         8.86847E-01         1.82139E+00         8.87237E-01         8.24117E+00         1.00000E+00         4.21316E-03         8.24117E+00         2.57068E+00         5.67048E+00
+          1.41192E-02         2.56675E-02        -2.65791E-02         8.86843E-01         1.83206E+00         8.87242E-01         7.90289E+00         1.00000E+00         4.22258E-03         7.90289E+00         2.45367E+00         5.44922E+00
+          1.41192E-02         2.58373E-02        -2.68539E-02         8.86839E-01         1.84273E+00         8.87246E-01         7.57327E+00         1.00000E+00         4.23149E-03         7.57327E+00         2.33856E+00         5.23471E+00
+          1.41192E-02         2.60071E-02        -2.71306E-02         8.86836E-01         1.85340E+00         8.87250E-01         7.25299E+00         1.00000E+00         4.23988E-03         7.25299E+00         2.22558E+00         5.02741E+00
+          1.41192E-02         2.61769E-02        -2.74091E-02         8.86832E-01         1.86407E+00         8.87255E-01         6.94272E+00         1.00000E+00         4.24775E-03         6.94272E+00         2.11498E+00         4.82774E+00
+          1.42890E-02         8.72665E-04        -6.05585E-03         8.97806E-01         2.74155E-01         8.97826E-01         3.25898E+02         1.00000E+00         2.83531E-03         3.25898E+02         1.25919E+02         1.99979E+02
+          1.42890E-02         1.04249E-03        -6.06606E-03         8.97806E-01         2.84826E-01         8.97826E-01         3.19926E+02         1.00000E+00         2.81359E-03         3.19926E+02         1.23627E+02         1.96299E+02
+          1.42890E-02         1.21232E-03        -6.07809E-03         8.97806E-01         2.95496E-01         8.97826E-01         3.13826E+02         1.00000E+00         2.79150E-03         3.13826E+02         1.21283E+02         1.92543E+02
+          1.42890E-02         1.38215E-03        -6.09193E-03         8.97805E-01         3.06167E-01         8.97826E-01         3.07608E+02         1.00000E+00         2.76909E-03         3.07608E+02         1.18891E+02         1.88717E+02
+          1.42890E-02         1.55197E-03        -6.10759E-03         8.97805E-01         3.16838E-01         8.97826E-01         3.01281E+02         1.00000E+00         2.74641E-03         3.01281E+02         1.16453E+02         1.84828E+02
+          1.42890E-02         1.72180E-03        -6.12505E-03         8.97805E-01         3.27508E-01         8.97826E-01         2.94855E+02         1.00000E+00         2.72349E-03         2.94855E+02         1.13975E+02         1.80880E+02
+          1.42890E-02         1.89163E-03        -6.14433E-03         8.97805E-01         3.38179E-01         8.97826E-01         2.88341E+02         1.00000E+00         2.70039E-03         2.88341E+02         1.11459E+02         1.76882E+02
+          1.42890E-02         2.06146E-03        -6.16542E-03         8.97804E-01         3.48849E-01         8.97825E-01         2.81747E+02         1.00000E+00         2.67715E-03         2.81747E+02         1.08909E+02         1.72838E+02
+          1.42890E-02         2.23128E-03        -6.18832E-03         8.97804E-01         3.59520E-01         8.97825E-01         2.75085E+02         1.00000E+00         2.65380E-03         2.75085E+02         1.06329E+02         1.68755E+02
+          1.42890E-02         2.40111E-03        -6.21303E-03         8.97804E-01         3.70190E-01         8.97825E-01         2.68363E+02         1.00000E+00         2.63040E-03         2.68363E+02         1.03723E+02         1.64640E+02
+          1.42890E-02         2.57094E-03        -6.23955E-03         8.97803E-01         3.80861E-01         8.97825E-01         2.61593E+02         1.00000E+00         2.60700E-03         2.61593E+02         1.01094E+02         1.60499E+02
+          1.42890E-02         2.74077E-03        -6.26789E-03         8.97803E-01         3.91532E-01         8.97825E-01         2.54784E+02         1.00000E+00         2.58362E-03         2.54784E+02         9.84459E+01         1.56338E+02
+          1.42890E-02         2.91059E-03        -6.29804E-03         8.97802E-01         4.02202E-01         8.97825E-01         2.47945E+02         1.00000E+00         2.56033E-03         2.47945E+02         9.57826E+01         1.52162E+02
+          1.42890E-02         3.08042E-03        -6.33000E-03         8.97802E-01         4.12873E-01         8.97824E-01         2.41086E+02         1.00000E+00         2.53715E-03         2.41086E+02         9.31077E+01         1.47979E+02
+          1.42890E-02         3.25025E-03        -6.36377E-03         8.97801E-01         4.23543E-01         8.97824E-01         2.34218E+02         1.00000E+00         2.51413E-03         2.34218E+02         9.04249E+01         1.43793E+02
+          1.42890E-02         3.42008E-03        -6.39936E-03         8.97801E-01         4.34214E-01         8.97824E-01         2.27349E+02         1.00000E+00         2.49132E-03         2.27349E+02         8.77378E+01         1.39611E+02
+          1.42890E-02         3.58990E-03        -6.43675E-03         8.97800E-01         4.44884E-01         8.97824E-01         2.20489E+02         1.00000E+00         2.46874E-03         2.20489E+02         8.50501E+01         1.35438E+02
+          1.42890E-02         3.75973E-03        -6.47596E-03         8.97800E-01         4.55555E-01         8.97823E-01         2.13646E+02         1.00000E+00         2.44645E-03         2.13646E+02         8.23652E+01         1.31281E+02
+          1.42890E-02         3.92956E-03        -6.51698E-03         8.97799E-01         4.66225E-01         8.97823E-01         2.06830E+02         1.00000E+00         2.42447E-03         2.06830E+02         7.96867E+01         1.27144E+02
+          1.42890E-02         4.09939E-03        -6.55982E-03         8.97799E-01         4.76896E-01         8.97823E-01         2.00050E+02         1.00000E+00         2.40285E-03         2.00050E+02         7.70180E+01         1.23032E+02
+          1.42890E-02         4.26921E-03        -6.60446E-03         8.97798E-01         4.87567E-01         8.97822E-01         1.93314E+02         1.00000E+00         2.38161E-03         1.93314E+02         7.43625E+01         1.18951E+02
+          1.42890E-02         4.43904E-03        -6.65092E-03         8.97797E-01         4.98237E-01         8.97822E-01         1.86630E+02         1.00000E+00         2.36080E-03         1.86630E+02         7.17234E+01         1.14906E+02
+          1.42890E-02         4.60887E-03        -6.69919E-03         8.97797E-01         5.08908E-01         8.97822E-01         1.80006E+02         1.00000E+00         2.34044E-03         1.80006E+02         6.91039E+01         1.10902E+02
+          1.42890E-02         4.77869E-03        -6.74927E-03         8.97796E-01         5.19578E-01         8.97821E-01         1.73450E+02         1.00000E+00         2.32056E-03         1.73450E+02         6.65073E+01         1.06943E+02
+          1.42890E-02         4.94852E-03        -6.80116E-03         8.97795E-01         5.30249E-01         8.97821E-01         1.66970E+02         1.00000E+00         2.30120E-03         1.66970E+02         6.39365E+01         1.03033E+02
+          1.42890E-02         5.11835E-03        -6.85486E-03         8.97794E-01         5.40919E-01         8.97821E-01         1.60572E+02         1.00000E+00         2.28238E-03         1.60572E+02         6.13945E+01         9.91778E+01
+          1.42890E-02         5.28818E-03        -6.91038E-03         8.97794E-01         5.51590E-01         8.97820E-01         1.54264E+02         1.00000E+00         2.26412E-03         1.54264E+02         5.88841E+01         9.53800E+01
+          1.42890E-02         5.45800E-03        -6.96771E-03         8.97793E-01         5.62261E-01         8.97820E-01         1.48052E+02         1.00000E+00         2.24646E-03         1.48052E+02         5.64080E+01         9.16439E+01
+          1.42890E-02         5.62783E-03        -7.02685E-03         8.97792E-01         5.72931E-01         8.97819E-01         1.41942E+02         1.00000E+00         2.22941E-03         1.41942E+02         5.39690E+01         8.79731E+01
+          1.42890E-02         5.79766E-03        -7.08780E-03         8.97791E-01         5.83602E-01         8.97819E-01         1.35940E+02         1.00000E+00         2.21299E-03         1.35940E+02         5.15694E+01         8.43710E+01
+          1.42890E-02         5.96749E-03        -7.15057E-03         8.97790E-01         5.94272E-01         8.97819E-01         1.30052E+02         1.00000E+00         2.19723E-03         1.30052E+02         4.92116E+01         8.08408E+01
+          1.42890E-02         6.13731E-03        -7.21515E-03         8.97789E-01         6.04943E-01         8.97818E-01         1.24283E+02         1.00000E+00         2.18214E-03         1.24283E+02         4.68980E+01         7.73854E+01
+          1.42890E-02         6.30714E-03        -7.28154E-03         8.97788E-01         6.15613E-01         8.97818E-01         1.18638E+02         1.00000E+00         2.16775E-03         1.18638E+02         4.46307E+01         7.40077E+01
+          1.42890E-02         6.47697E-03        -7.34974E-03         8.97787E-01         6.26284E-01         8.97817E-01         1.13122E+02         1.00000E+00         2.15405E-03         1.13122E+02         4.24117E+01         7.07100E+01
+          1.42890E-02         6.64680E-03        -7.41975E-03         8.97786E-01         6.36955E-01         8.97817E-01         1.07738E+02         1.00000E+00         2.14107E-03         1.07738E+02         4.02429E+01         6.74947E+01
+          1.42890E-02         6.81662E-03        -7.49158E-03         8.97785E-01         6.47625E-01         8.97817E-01         1.02490E+02         1.00000E+00         2.12882E-03         1.02490E+02         3.81260E+01         6.43639E+01
+          1.42890E-02         6.98645E-03        -7.56521E-03         8.97784E-01         6.58296E-01         8.97816E-01         9.73820E+01         1.00000E+00         2.11730E-03         9.73820E+01         3.60626E+01         6.13194E+01
+          1.42890E-02         7.15628E-03        -7.64066E-03         8.97783E-01         6.68966E-01         8.97816E-01         9.24171E+01         1.00000E+00         2.10653E-03         9.24171E+01         3.40543E+01         5.83629E+01
+          1.42890E-02         7.32611E-03        -7.71792E-03         8.97782E-01         6.79637E-01         8.97815E-01         8.75980E+01         1.00000E+00         2.09651E-03         8.75980E+01         3.21023E+01         5.54957E+01
+          1.42890E-02         7.49593E-03        -7.79700E-03         8.97781E-01         6.90307E-01         8.97815E-01         8.29270E+01         1.00000E+00         2.08725E-03         8.29270E+01         3.02080E+01         5.27190E+01
+          1.42890E-02         7.66576E-03        -7.87788E-03         8.97780E-01         7.00978E-01         8.97814E-01         7.84062E+01         1.00000E+00         2.07876E-03         7.84062E+01         2.83723E+01         5.00339E+01
+          1.42890E-02         7.83559E-03        -7.96058E-03         8.97779E-01         7.11649E-01         8.97814E-01         7.40372E+01         1.00000E+00         2.07103E-03         7.40372E+01         2.65961E+01         4.74411E+01
+          1.42890E-02         8.00542E-03        -8.04509E-03         8.97777E-01         7.22319E-01         8.97813E-01         6.98215E+01         1.00000E+00         2.06406E-03         6.98215E+01         2.48804E+01         4.49411E+01
+          1.42890E-02         8.17524E-03        -8.13142E-03         8.97776E-01         7.32990E-01         8.97813E-01         6.57600E+01         1.00000E+00         2.05786E-03         6.57600E+01         2.32257E+01         4.25344E+01
+          1.42890E-02         8.34507E-03        -8.21955E-03         8.97775E-01         7.43660E-01         8.97813E-01         6.18535E+01         1.00000E+00         2.05243E-03         6.18535E+01         2.16325E+01         4.02210E+01
+          1.42890E-02         8.51490E-03        -8.30950E-03         8.97774E-01         7.54331E-01         8.97812E-01         5.81023E+01         1.00000E+00         2.04777E-03         5.81023E+01         2.01013E+01         3.80010E+01
+          1.42890E-02         8.68473E-03        -8.40126E-03         8.97772E-01         7.65001E-01         8.97812E-01         5.45063E+01         1.00000E+00         2.04386E-03         5.45063E+01         1.86322E+01         3.58741E+01
+          1.42890E-02         8.85455E-03        -8.49483E-03         8.97771E-01         7.75672E-01         8.97811E-01         5.10655E+01         1.00000E+00         2.04072E-03         5.10655E+01         1.72255E+01         3.38400E+01
+          1.42890E-02         9.02438E-03        -8.59021E-03         8.97770E-01         7.86343E-01         8.97811E-01         4.77791E+01         1.00000E+00         2.03833E-03         4.77791E+01         1.58811E+01         3.18980E+01
+          1.42890E-02         9.19421E-03        -8.68741E-03         8.97768E-01         7.97013E-01         8.97810E-01         4.46463E+01         1.00000E+00         2.03669E-03         4.46463E+01         1.45988E+01         3.00475E+01
+          1.42890E-02         9.36403E-03        -8.78641E-03         8.97767E-01         8.07684E-01         8.97810E-01         4.16659E+01         1.00000E+00         2.03579E-03         4.16659E+01         1.33785E+01         2.82874E+01
+          1.42890E-02         9.53386E-03        -8.88723E-03         8.97765E-01         8.18354E-01         8.97809E-01         3.88365E+01         1.00000E+00         2.03562E-03         3.88365E+01         1.22197E+01         2.66169E+01
+          1.42890E-02         9.70369E-03        -8.98987E-03         8.97764E-01         8.29025E-01         8.97809E-01         3.61565E+01         1.00000E+00         2.03619E-03         3.61565E+01         1.11219E+01         2.50346E+01
+          1.42890E-02         9.87352E-03        -9.09431E-03         8.97762E-01         8.39695E-01         8.97809E-01         3.36237E+01         1.00000E+00         2.03747E-03         3.36237E+01         1.00845E+01         2.35392E+01
+          1.42890E-02         1.00433E-02        -9.20057E-03         8.97761E-01         8.50366E-01         8.97808E-01         3.12361E+01         1.00000E+00         2.03946E-03         3.12361E+01         9.10693E+00         2.21292E+01
+          1.42890E-02         1.02132E-02        -9.30864E-03         8.97759E-01         8.61037E-01         8.97808E-01         2.89913E+01         1.00000E+00         2.04216E-03         2.89913E+01         8.18822E+00         2.08030E+01
+          1.42890E-02         1.03830E-02        -9.41852E-03         8.97758E-01         8.71707E-01         8.97807E-01         2.68865E+01         1.00000E+00         2.04554E-03         2.68865E+01         7.32749E+00         1.95590E+01
+          1.42890E-02         1.05528E-02        -9.53021E-03         8.97756E-01         8.82378E-01         8.97807E-01         2.49189E+01         1.00000E+00         2.04961E-03         2.49189E+01         6.52372E+00         1.83952E+01
+          1.42890E-02         1.07227E-02        -9.64372E-03         8.97755E-01         8.93048E-01         8.97806E-01         2.30855E+01         1.00000E+00         2.05435E-03         2.30855E+01         5.77581E+00         1.73097E+01
+          1.42890E-02         1.08925E-02        -9.75903E-03         8.97753E-01         9.03719E-01         8.97806E-01         2.13830E+01         1.00000E+00         2.05974E-03         2.13830E+01         5.08257E+00         1.63005E+01
+          1.42890E-02         1.10623E-02        -9.87616E-03         8.97751E-01         9.14389E-01         8.97806E-01         1.98081E+01         1.00000E+00         2.06578E-03         1.98081E+01         4.44272E+00         1.53654E+01
+          1.42890E-02         1.12321E-02        -9.99511E-03         8.97750E-01         9.25060E-01         8.97805E-01         1.83572E+01         1.00000E+00         2.07246E-03         1.83572E+01         3.85491E+00         1.45023E+01
+          1.42890E-02         1.14020E-02        -1.01159E-02         8.97748E-01         9.35731E-01         8.97805E-01         1.70267E+01         1.00000E+00         2.07975E-03         1.70267E+01         3.31773E+00         1.37089E+01
+          1.42890E-02         1.15718E-02        -1.02384E-02         8.97746E-01         9.46401E-01         8.97804E-01         1.58126E+01         1.00000E+00         2.08765E-03         1.58126E+01         2.82968E+00         1.29829E+01
+          1.42890E-02         1.17416E-02        -1.03628E-02         8.97744E-01         9.57072E-01         8.97804E-01         1.47110E+01         1.00000E+00         2.09615E-03         1.47110E+01         2.38923E+00         1.23218E+01
+          1.42890E-02         1.19114E-02        -1.04890E-02         8.97743E-01         9.67742E-01         8.97804E-01         1.37179E+01         1.00000E+00         2.10524E-03         1.37179E+01         1.99477E+00         1.17232E+01
+          1.42890E-02         1.20813E-02        -1.06170E-02         8.97741E-01         9.78413E-01         8.97803E-01         1.28293E+01         1.00000E+00         2.11488E-03         1.28293E+01         1.64466E+00         1.11846E+01
+          1.42890E-02         1.22511E-02        -1.07468E-02         8.97739E-01         9.89083E-01         8.97803E-01         1.20407E+01         1.00000E+00         2.12509E-03         1.20407E+01         1.33720E+00         1.07035E+01
+          1.42890E-02         1.24209E-02        -1.08784E-02         8.97737E-01         9.99754E-01         8.97803E-01         1.13481E+01         1.00000E+00         2.13583E-03         1.13481E+01         1.07066E+00         1.02775E+01
+          1.42890E-02         1.25908E-02        -1.10119E-02         8.97735E-01         1.01042E+00         8.97803E-01         1.07470E+01         1.00000E+00         2.14709E-03         1.07470E+01         8.43297E-01         9.90375E+00
+          1.42890E-02         1.27606E-02        -1.11471E-02         8.97733E-01         1.02110E+00         8.97802E-01         1.02332E+01         1.00000E+00         2.15887E-03         1.02332E+01         6.53308E-01         9.57986E+00
+          1.42890E-02         1.29304E-02        -1.12842E-02         8.97731E-01         1.03177E+00         8.97802E-01         9.80209E+00         1.00000E+00         2.17114E-03         9.80209E+00         4.98890E-01         9.30320E+00
+          1.42890E-02         1.31002E-02        -1.14231E-02         8.97729E-01         1.04244E+00         8.97802E-01         9.44940E+00         1.00000E+00         2.18389E-03         9.44940E+00         3.78219E-01         9.07118E+00
+          1.42890E-02         1.32701E-02        -1.15638E-02         8.97727E-01         1.05311E+00         8.97802E-01         9.17069E+00         1.00000E+00         2.19711E-03         9.17069E+00         2.89460E-01         8.88123E+00
+          1.42890E-02         1.34399E-02        -1.17063E-02         8.97725E-01         1.06378E+00         8.97801E-01         8.96153E+00         1.00000E+00         2.21077E-03         8.96153E+00         2.30776E-01         8.73076E+00
+          1.42890E-02         1.36097E-02        -1.18506E-02         8.97723E-01         1.07445E+00         8.97801E-01         8.81756E+00         1.00000E+00         2.22487E-03         8.81756E+00         2.00327E-01         8.61723E+00
+          1.42890E-02         1.37795E-02        -1.19967E-02         8.97721E-01         1.08512E+00         8.97801E-01         8.73439E+00         1.00000E+00         2.23938E-03         8.73439E+00         1.96280E-01         8.53811E+00
+          1.42890E-02         1.39494E-02        -1.21447E-02         8.97719E-01         1.09579E+00         8.97801E-01         8.70772E+00         1.00000E+00         2.25430E-03         8.70772E+00         2.16810E-01         8.49091E+00
+          1.42890E-02         1.41192E-02        -1.22944E-02         8.97717E-01         1.10646E+00         8.97801E-01         8.73326E+00         1.00000E+00         2.26960E-03         8.73325E+00         2.60108E-01         8.47315E+00
+          1.42890E-02         1.42890E-02        -1.24460E-02         8.97715E-01         1.11713E+00         8.97801E-01         8.80679E+00         1.00000E+00         2.28527E-03         8.80679E+00         3.24385E-01         8.48241E+00
+          1.42890E-02         1.44589E-02        -1.25994E-02         8.97712E-01         1.12780E+00         8.97801E-01         8.92417E+00         1.00000E+00         2.30129E-03         8.92417E+00         4.07872E-01         8.51630E+00
+          1.42890E-02         1.46287E-02        -1.27546E-02         8.97710E-01         1.13847E+00         8.97801E-01         9.08133E+00         1.00000E+00         2.31765E-03         9.08133E+00         5.08832E-01         8.57250E+00
+          1.42890E-02         1.47985E-02        -1.29116E-02         8.97708E-01         1.14914E+00         8.97801E-01         9.27426E+00         1.00000E+00         2.33433E-03         9.27426E+00         6.25556E-01         8.64871E+00
+          1.42890E-02         1.49683E-02        -1.30704E-02         8.97706E-01         1.15981E+00         8.97801E-01         9.49908E+00         1.00000E+00         2.35132E-03         9.49908E+00         7.56373E-01         8.74271E+00
+          1.42890E-02         1.51382E-02        -1.32310E-02         8.97703E-01         1.17048E+00         8.97801E-01         9.75198E+00         1.00000E+00         2.36860E-03         9.75198E+00         8.99649E-01         8.85233E+00
+          1.42890E-02         1.53080E-02        -1.33934E-02         8.97701E-01         1.18115E+00         8.97801E-01         1.00293E+01         1.00000E+00         2.38615E-03         1.00293E+01         1.05379E+00         8.97546E+00
+          1.42890E-02         1.54778E-02        -1.35577E-02         8.97699E-01         1.19182E+00         8.97801E-01         1.03273E+01         1.00000E+00         2.40395E-03         1.03273E+01         1.21726E+00         9.11007E+00
+          1.42890E-02         1.56476E-02        -1.37238E-02         8.97696E-01         1.20249E+00         8.97801E-01         1.06427E+01         1.00000E+00         2.42200E-03         1.06427E+01         1.38856E+00         9.25419E+00
+          1.42890E-02         1.58175E-02        -1.38916E-02         8.97694E-01         1.21317E+00         8.97801E-01         1.09721E+01         1.00000E+00         2.44027E-03         1.09721E+01         1.56623E+00         9.40591E+00
+          1.42890E-02         1.59873E-02        -1.40613E-02         8.97691E-01         1.22384E+00         8.97802E-01         1.13123E+01         1.00000E+00         2.45874E-03         1.13123E+01         1.74890E+00         9.56341E+00
+          1.42890E-02         1.61571E-02        -1.42328E-02         8.97689E-01         1.23451E+00         8.97802E-01         1.16601E+01         1.00000E+00         2.47741E-03         1.16601E+01         1.93521E+00         9.72494E+00
+          1.42890E-02         1.63270E-02        -1.44062E-02         8.97687E-01         1.24518E+00         8.97802E-01         1.20127E+01         1.00000E+00         2.49626E-03         1.20127E+01         2.12389E+00         9.88883E+00
+          1.42890E-02         1.64968E-02        -1.45813E-02         8.97684E-01         1.25585E+00         8.97802E-01         1.23672E+01         1.00000E+00         2.51527E-03         1.23672E+01         2.31373E+00         1.00535E+01
+          1.42890E-02         1.66666E-02        -1.47582E-02         8.97682E-01         1.26652E+00         8.97803E-01         1.27209E+01         1.00000E+00         2.53443E-03         1.27209E+01         2.50355E+00         1.02174E+01
+          1.42890E-02         1.68364E-02        -1.49370E-02         8.97679E-01         1.27719E+00         8.97803E-01         1.30714E+01         1.00000E+00         2.55371E-03         1.30714E+01         2.69227E+00         1.03791E+01
+          1.42890E-02         1.70063E-02        -1.51176E-02         8.97676E-01         1.28786E+00         8.97804E-01         1.34162E+01         1.00000E+00         2.57311E-03         1.34162E+01         2.87884E+00         1.05373E+01
+          1.42890E-02         1.71761E-02        -1.52999E-02         8.97674E-01         1.29853E+00         8.97804E-01         1.37531E+01         1.00000E+00         2.59261E-03         1.37531E+01         3.06230E+00         1.06908E+01
+          1.42890E-02         1.73459E-02        -1.54841E-02         8.97671E-01         1.30920E+00         8.97805E-01         1.40800E+01         1.00000E+00         2.61219E-03         1.40800E+01         3.24174E+00         1.08382E+01
+          1.42890E-02         1.75158E-02        -1.56701E-02         8.97668E-01         1.31987E+00         8.97805E-01         1.43950E+01         1.00000E+00         2.63185E-03         1.43950E+01         3.41632E+00         1.09787E+01
+          1.42890E-02         1.76856E-02        -1.58580E-02         8.97666E-01         1.33054E+00         8.97806E-01         1.46962E+01         1.00000E+00         2.65156E-03         1.46962E+01         3.58524E+00         1.11110E+01
+          1.42890E-02         1.78554E-02        -1.60476E-02         8.97663E-01         1.34121E+00         8.97807E-01         1.49822E+01         1.00000E+00         2.67131E-03         1.49822E+01         3.74781E+00         1.12343E+01
+          1.42890E-02         1.80252E-02        -1.62390E-02         8.97660E-01         1.35188E+00         8.97807E-01         1.52512E+01         1.00000E+00         2.69109E-03         1.52512E+01         3.90338E+00         1.13479E+01
+          1.42890E-02         1.81951E-02        -1.64323E-02         8.97658E-01         1.36255E+00         8.97808E-01         1.55021E+01         1.00000E+00         2.71088E-03         1.55021E+01         4.05134E+00         1.14508E+01
+          1.42890E-02         1.83649E-02        -1.66274E-02         8.97655E-01         1.37322E+00         8.97809E-01         1.57336E+01         1.00000E+00         2.73067E-03         1.57336E+01         4.19118E+00         1.15424E+01
+          1.42890E-02         1.85347E-02        -1.68242E-02         8.97652E-01         1.38389E+00         8.97810E-01         1.59446E+01         1.00000E+00         2.75044E-03         1.59446E+01         4.32244E+00         1.16221E+01
+          1.42890E-02         1.87045E-02        -1.70229E-02         8.97649E-01         1.39457E+00         8.97811E-01         1.61342E+01         1.00000E+00         2.77019E-03         1.61342E+01         4.44471E+00         1.16895E+01
+          1.42890E-02         1.88744E-02        -1.72234E-02         8.97646E-01         1.40524E+00         8.97812E-01         1.63017E+01         1.00000E+00         2.78989E-03         1.63017E+01         4.55765E+00         1.17440E+01
+          1.42890E-02         1.90442E-02        -1.74258E-02         8.97643E-01         1.41591E+00         8.97813E-01         1.64464E+01         1.00000E+00         2.80954E-03         1.64464E+01         4.66097E+00         1.17854E+01
+          1.42890E-02         1.92140E-02        -1.76299E-02         8.97640E-01         1.42658E+00         8.97814E-01         1.65677E+01         1.00000E+00         2.82912E-03         1.65677E+01         4.75445E+00         1.18133E+01
+          1.42890E-02         1.93839E-02        -1.78359E-02         8.97638E-01         1.43725E+00         8.97815E-01         1.66653E+01         1.00000E+00         2.84861E-03         1.66653E+01         4.83790E+00         1.18274E+01
+          1.42890E-02         1.95537E-02        -1.80436E-02         8.97635E-01         1.44792E+00         8.97816E-01         1.67390E+01         1.00000E+00         2.86802E-03         1.67390E+01         4.91121E+00         1.18278E+01
+          1.42890E-02         1.97235E-02        -1.82532E-02         8.97632E-01         1.45859E+00         8.97817E-01         1.67885E+01         1.00000E+00         2.88732E-03         1.67885E+01         4.97431E+00         1.18142E+01
+          1.42890E-02         1.98933E-02        -1.84646E-02         8.97629E-01         1.46926E+00         8.97818E-01         1.68139E+01         1.00000E+00         2.90650E-03         1.68139E+01         5.02716E+00         1.17867E+01
+          1.42890E-02         2.00632E-02        -1.86778E-02         8.97626E-01         1.47993E+00         8.97820E-01         1.68152E+01         1.00000E+00         2.92555E-03         1.68152E+01         5.06980E+00         1.17454E+01
+          1.42890E-02         2.02330E-02        -1.88928E-02         8.97622E-01         1.49060E+00         8.97821E-01         1.67926E+01         1.00000E+00         2.94445E-03         1.67926E+01         5.10229E+00         1.16903E+01
+          1.42890E-02         2.04028E-02        -1.91096E-02         8.97619E-01         1.50127E+00         8.97823E-01         1.67464E+01         1.00000E+00         2.96321E-03         1.67464E+01         5.12474E+00         1.16216E+01
+          1.42890E-02         2.05726E-02        -1.93283E-02         8.97616E-01         1.51194E+00         8.97824E-01         1.66770E+01         1.00000E+00         2.98180E-03         1.66770E+01         5.13729E+00         1.15397E+01
+          1.42890E-02         2.07425E-02        -1.95487E-02         8.97613E-01         1.52261E+00         8.97826E-01         1.65848E+01         1.00000E+00         3.00021E-03         1.65848E+01         5.14014E+00         1.14447E+01
+          1.42890E-02         2.09123E-02        -1.97710E-02         8.97610E-01         1.53328E+00         8.97828E-01         1.64705E+01         1.00000E+00         3.01843E-03         1.64705E+01         5.13350E+00         1.13370E+01
+          1.42890E-02         2.10821E-02        -1.99950E-02         8.97607E-01         1.54395E+00         8.97829E-01         1.63347E+01         1.00000E+00         3.03646E-03         1.63347E+01         5.11763E+00         1.12171E+01
+          1.42890E-02         2.12520E-02        -2.02209E-02         8.97603E-01         1.55462E+00         8.97831E-01         1.61780E+01         1.00000E+00         3.05428E-03         1.61780E+01         5.09280E+00         1.10852E+01
+          1.42890E-02         2.14218E-02        -2.04486E-02         8.97600E-01         1.56529E+00         8.97833E-01         1.60013E+01         1.00000E+00         3.07188E-03         1.60013E+01         5.05933E+00         1.09420E+01
+          1.42890E-02         2.15916E-02        -2.06782E-02         8.97597E-01         1.57596E+00         8.97835E-01         1.58054E+01         1.00000E+00         3.08925E-03         1.58054E+01         5.01754E+00         1.07879E+01
+          1.42890E-02         2.17614E-02        -2.09095E-02         8.97594E-01         1.58664E+00         8.97837E-01         1.55912E+01         1.00000E+00         3.10638E-03         1.55912E+01         4.96779E+00         1.06234E+01
+          1.42890E-02         2.19313E-02        -2.11426E-02         8.97590E-01         1.59731E+00         8.97839E-01         1.53597E+01         1.00000E+00         3.12326E-03         1.53597E+01         4.91047E+00         1.04492E+01
+          1.42890E-02         2.21011E-02        -2.13776E-02         8.97587E-01         1.60798E+00         8.97841E-01         1.51119E+01         1.00000E+00         3.13989E-03         1.51119E+01         4.84594E+00         1.02659E+01
+          1.42890E-02         2.22709E-02        -2.16144E-02         8.97584E-01         1.61865E+00         8.97844E-01         1.48487E+01         1.00000E+00         3.15625E-03         1.48487E+01         4.77464E+00         1.00741E+01
+          1.42890E-02         2.24407E-02        -2.18530E-02         8.97580E-01         1.62932E+00         8.97846E-01         1.45714E+01         1.00000E+00         3.17233E-03         1.45714E+01         4.69696E+00         9.87440E+00
+          1.42890E-02         2.26106E-02        -2.20934E-02         8.97577E-01         1.63999E+00         8.97849E-01         1.42809E+01         1.00000E+00         3.18813E-03         1.42809E+01         4.61334E+00         9.66755E+00
+          1.42890E-02         2.27804E-02        -2.23356E-02         8.97573E-01         1.65066E+00         8.97851E-01         1.39784E+01         1.00000E+00         3.20364E-03         1.39784E+01         4.52422E+00         9.45422E+00
+          1.42890E-02         2.29502E-02        -2.25796E-02         8.97570E-01         1.66133E+00         8.97854E-01         1.36651E+01         1.00000E+00         3.21884E-03         1.36651E+01         4.43004E+00         9.23511E+00
+          1.42890E-02         2.31201E-02        -2.28254E-02         8.97566E-01         1.67200E+00         8.97856E-01         1.33422E+01         1.00000E+00         3.23374E-03         1.33422E+01         4.33123E+00         9.01095E+00
+          1.42890E-02         2.32899E-02        -2.30731E-02         8.97563E-01         1.68267E+00         8.97859E-01         1.30107E+01         1.00000E+00         3.24832E-03         1.30107E+01         4.22826E+00         8.78245E+00
+          1.42890E-02         2.34597E-02        -2.33225E-02         8.97559E-01         1.69334E+00         8.97862E-01         1.26719E+01         1.00000E+00         3.26258E-03         1.26719E+01         4.12156E+00         8.55034E+00
+          1.42890E-02         2.36295E-02        -2.35738E-02         8.97556E-01         1.70401E+00         8.97865E-01         1.23269E+01         1.00000E+00         3.27651E-03         1.23269E+01         4.01157E+00         8.31534E+00
+          1.42890E-02         2.37994E-02        -2.38269E-02         8.97552E-01         1.71468E+00         8.97868E-01         1.19769E+01         1.00000E+00         3.29010E-03         1.19769E+01         3.89874E+00         8.07818E+00
+          1.42890E-02         2.39692E-02        -2.40818E-02         8.97548E-01         1.72535E+00         8.97871E-01         1.16231E+01         1.00000E+00         3.30334E-03         1.16231E+01         3.78350E+00         7.83957E+00
+          1.42890E-02         2.41390E-02        -2.43385E-02         8.97545E-01         1.73602E+00         8.97875E-01         1.12665E+01         1.00000E+00         3.31624E-03         1.12665E+01         3.66627E+00         7.60023E+00
+          1.42890E-02         2.43088E-02        -2.45971E-02         8.97541E-01         1.74669E+00         8.97878E-01         1.09083E+01         1.00000E+00         3.32878E-03         1.09083E+01         3.54748E+00         7.36085E+00
+          1.42890E-02         2.44787E-02        -2.48574E-02         8.97537E-01         1.75736E+00         8.97881E-01         1.05496E+01         1.00000E+00         3.34096E-03         1.05496E+01         3.42752E+00         7.12212E+00
+          1.42890E-02         2.46485E-02        -2.51196E-02         8.97533E-01         1.76804E+00         8.97885E-01         1.01915E+01         1.00000E+00         3.35277E-03         1.01915E+01         3.30679E+00         6.88471E+00
+          1.42890E-02         2.48183E-02        -2.53836E-02         8.97530E-01         1.77871E+00         8.97889E-01         9.83495E+00         1.00000E+00         3.36421E-03         9.83495E+00         3.18568E+00         6.64927E+00
+          1.42890E-02         2.49882E-02        -2.56493E-02         8.97526E-01         1.78938E+00         8.97892E-01         9.48098E+00         1.00000E+00         3.37527E-03         9.48099E+00         3.06455E+00         6.41643E+00
+          1.42890E-02         2.51580E-02        -2.59169E-02         8.97522E-01         1.80005E+00         8.97896E-01         9.13057E+00         1.00000E+00         3.38596E-03         9.13057E+00         2.94376E+00         6.18681E+00
+          1.42890E-02         2.53278E-02        -2.61864E-02         8.97518E-01         1.81072E+00         8.97900E-01         8.78464E+00         1.00000E+00         3.39625E-03         8.78464E+00         2.82365E+00         5.96100E+00
+          1.42890E-02         2.54976E-02        -2.64576E-02         8.97514E-01         1.82139E+00         8.97904E-01         8.44407E+00         1.00000E+00         3.40616E-03         8.44407E+00         2.70453E+00         5.73954E+00
+          1.42890E-02         2.56675E-02        -2.67306E-02         8.97510E-01         1.83206E+00         8.97908E-01         8.10970E+00         1.00000E+00         3.41568E-03         8.10970E+00         2.58671E+00         5.52298E+00
+          1.42890E-02         2.58373E-02        -2.70055E-02         8.97506E-01         1.84273E+00         8.97913E-01         7.78232E+00         1.00000E+00         3.42480E-03         7.78232E+00         2.47049E+00         5.31183E+00
+          1.42890E-02         2.60071E-02        -2.72821E-02         8.97503E-01         1.85340E+00         8.97917E-01         7.46268E+00         1.00000E+00         3.43352E-03         7.46268E+00         2.35613E+00         5.10655E+00
+          1.42890E-02         2.61769E-02        -2.75606E-02         8.97499E-01         1.86407E+00         8.97922E-01         7.15147E+00         1.00000E+00         3.44183E-03         7.15147E+00         2.24388E+00         4.90759E+00
+          1.44589E-02         8.72665E-04        -6.20924E-03         9.08476E-01         2.74155E-01         9.08498E-01         3.15250E+02         1.00000E+00         2.11433E-03         3.15250E+02         1.26562E+02         1.88688E+02
+          1.44589E-02         1.04249E-03        -6.21946E-03         9.08476E-01         2.84826E-01         9.08498E-01         3.09539E+02         1.00000E+00         2.09864E-03         3.09539E+02         1.24307E+02         1.85233E+02
+          1.44589E-02         1.21232E-03        -6.23149E-03         9.08476E-01         2.95496E-01         9.08497E-01         3.03705E+02         1.00000E+00         2.08269E-03         3.03705E+02         1.22000E+02         1.81705E+02
+          1.44589E-02         1.38215E-03        -6.24533E-03         9.08476E-01         3.06167E-01         9.08497E-01         2.97756E+02         1.00000E+00         2.06652E-03         2.97756E+02         1.19644E+02         1.78113E+02
+          1.44589E-02         1.55197E-03        -6.26098E-03         9.08476E-01         3.16838E-01         9.08497E-01         2.91703E+02         1.00000E+00         2.05015E-03         2.91703E+02         1.17243E+02         1.74460E+02
+          1.44589E-02         1.72180E-03        -6.27844E-03         9.08475E-01         3.27508E-01         9.08497E-01         2.85554E+02         1.00000E+00         2.03363E-03         2.85554E+02         1.14800E+02         1.70754E+02
+          1.44589E-02         1.89163E-03        -6.29772E-03         9.08475E-01         3.38179E-01         9.08497E-01         2.79319E+02         1.00000E+00         2.01698E-03         2.79319E+02         1.12319E+02         1.66999E+02
+          1.44589E-02         2.06146E-03        -6.31881E-03         9.08475E-01         3.48849E-01         9.08497E-01         2.73007E+02         1.00000E+00         2.00024E-03         2.73007E+02         1.09804E+02         1.63203E+02
+          1.44589E-02         2.23128E-03        -6.34171E-03         9.08475E-01         3.59520E-01         9.08497E-01         2.66627E+02         1.00000E+00         1.98344E-03         2.66627E+02         1.07258E+02         1.59370E+02
+          1.44589E-02         2.40111E-03        -6.36642E-03         9.08474E-01         3.70190E-01         9.08496E-01         2.60190E+02         1.00000E+00         1.96662E-03         2.60190E+02         1.04684E+02         1.55507E+02
+          1.44589E-02         2.57094E-03        -6.39295E-03         9.08474E-01         3.80861E-01         9.08496E-01         2.53705E+02         1.00000E+00         1.94980E-03         2.53705E+02         1.02086E+02         1.51619E+02
+          1.44589E-02         2.74077E-03        -6.42128E-03         9.08473E-01         3.91532E-01         9.08496E-01         2.47181E+02         1.00000E+00         1.93302E-03         2.47181E+02         9.94686E+01         1.47712E+02
+          1.44589E-02         2.91059E-03        -6.45143E-03         9.08473E-01         4.02202E-01         9.08496E-01         2.40627E+02         1.00000E+00         1.91631E-03         2.40627E+02         9.68343E+01         1.43792E+02
+          1.44589E-02         3.08042E-03        -6.48339E-03         9.08472E-01         4.12873E-01         9.08496E-01         2.34052E+02         1.00000E+00         1.89970E-03         2.34052E+02         9.41871E+01         1.39865E+02
+          1.44589E-02         3.25025E-03        -6.51717E-03         9.08472E-01         4.23543E-01         9.08495E-01         2.27467E+02         1.00000E+00         1.88322E-03         2.27467E+02         9.15305E+01         1.35936E+02
+          1.44589E-02         3.42008E-03        -6.55275E-03         9.08471E-01         4.34214E-01         9.08495E-01         2.20878E+02         1.00000E+00         1.86691E-03         2.20878E+02         8.88681E+01         1.32010E+02
+          1.44589E-02         3.58990E-03        -6.59015E-03         9.08471E-01         4.44884E-01         9.08495E-01         2.14297E+02         1.00000E+00         1.85079E-03         2.14297E+02         8.62033E+01         1.28093E+02
+          1.44589E-02         3.75973E-03        -6.62936E-03         9.08470E-01         4.55555E-01         9.08495E-01         2.07730E+02         1.00000E+00         1.83488E-03         2.07730E+02         8.35396E+01         1.24191E+02
+          1.44589E-02         3.92956E-03        -6.67038E-03         9.08470E-01         4.66225E-01         9.08494E-01         2.01187E+02         1.00000E+00         1.81923E-03         2.01187E+02         8.08805E+01         1.20307E+02
+          1.44589E-02         4.09939E-03        -6.71321E-03         9.08469E-01         4.76896E-01         9.08494E-01         1.94676E+02         1.00000E+00         1.80385E-03         1.94676E+02         7.82294E+01         1.16447E+02
+          1.44589E-02         4.26921E-03        -6.75785E-03         9.08469E-01         4.87567E-01         9.08494E-01         1.88205E+02         1.00000E+00         1.78878E-03         1.88205E+02         7.55894E+01         1.12616E+02
+          1.44589E-02         4.43904E-03        -6.80431E-03         9.08468E-01         4.98237E-01         9.08493E-01         1.81782E+02         1.00000E+00         1.77402E-03         1.81782E+02         7.29640E+01         1.08818E+02
+          1.44589E-02         4.60887E-03        -6.85258E-03         9.08467E-01         5.08908E-01         9.08493E-01         1.75415E+02         1.00000E+00         1.75962E-03         1.75415E+02         7.03562E+01         1.05058E+02
+          1.44589E-02         4.77869E-03        -6.90266E-03         9.08466E-01         5.19578E-01         9.08493E-01         1.69110E+02         1.00000E+00         1.74559E-03         1.69110E+02         6.77691E+01         1.01341E+02
+          1.44589E-02         4.94852E-03        -6.95455E-03         9.08466E-01         5.30249E-01         9.08492E-01         1.62875E+02         1.00000E+00         1.73196E-03         1.62875E+02         6.52058E+01         9.76695E+01
+          1.44589E-02         5.11835E-03        -7.00826E-03         9.08465E-01         5.40919E-01         9.08492E-01         1.56718E+02         1.00000E+00         1.71873E-03         1.56718E+02         6.26691E+01         9.40484E+01
+          1.44589E-02         5.28818E-03        -7.06377E-03         9.08464E-01         5.51590E-01         9.08492E-01         1.50643E+02         1.00000E+00         1.70595E-03         1.50643E+02         6.01620E+01         9.04812E+01
+          1.44589E-02         5.45800E-03        -7.12110E-03         9.08463E-01         5.62261E-01         9.08491E-01         1.44659E+02         1.00000E+00         1.69361E-03         1.44659E+02         5.76871E+01         8.69715E+01
+          1.44589E-02         5.62783E-03        -7.18024E-03         9.08462E-01         5.72931E-01         9.08491E-01         1.38770E+02         1.00000E+00         1.68174E-03         1.38770E+02         5.52470E+01         8.35226E+01
+          1.44589E-02         5.79766E-03        -7.24120E-03         9.08462E-01         5.83602E-01         9.08490E-01         1.32982E+02         1.00000E+00         1.67036E-03         1.32982E+02         5.28442E+01         8.01376E+01
+          1.44589E-02         5.96749E-03        -7.30396E-03         9.08461E-01         5.94272E-01         9.08490E-01         1.27301E+02         1.00000E+00         1.65947E-03         1.27301E+02         5.04812E+01         7.68196E+01
+          1.44589E-02         6.13731E-03        -7.36854E-03         9.08460E-01         6.04943E-01         9.08490E-01         1.21732E+02         1.00000E+00         1.64910E-03         1.21732E+02         4.81603E+01         7.35712E+01
+          1.44589E-02         6.30714E-03        -7.43493E-03         9.08459E-01         6.15613E-01         9.08489E-01         1.16279E+02         1.00000E+00         1.63925E-03         1.16279E+02         4.58836E+01         7.03950E+01
+          1.44589E-02         6.47697E-03        -7.50313E-03         9.08458E-01         6.26284E-01         9.08489E-01         1.10947E+02         1.00000E+00         1.62993E-03         1.10947E+02         4.36532E+01         6.72933E+01
+          1.44589E-02         6.64680E-03        -7.57314E-03         9.08457E-01         6.36955E-01         9.08488E-01         1.05739E+02         1.00000E+00         1.62116E-03         1.05739E+02         4.14710E+01         6.42683E+01
+          1.44589E-02         6.81662E-03        -7.64497E-03         9.08456E-01         6.47625E-01         9.08488E-01         1.00660E+02         1.00000E+00         1.61295E-03         1.00660E+02         3.93388E+01         6.13217E+01
+          1.44589E-02         6.98645E-03        -7.71860E-03         9.08455E-01         6.58296E-01         9.08487E-01         9.57136E+01         1.00000E+00         1.60529E-03         9.57136E+01         3.72582E+01         5.84554E+01
+          1.44589E-02         7.15628E-03        -7.79405E-03         9.08454E-01         6.68966E-01         9.08487E-01         9.09017E+01         1.00000E+00         1.59820E-03         9.09017E+01         3.52309E+01         5.56709E+01
+          1.44589E-02         7.32611E-03        -7.87131E-03         9.08452E-01         6.79637E-01         9.08487E-01         8.62275E+01         1.00000E+00         1.59168E-03         8.62275E+01         3.32581E+01         5.29694E+01
+          1.44589E-02         7.49593E-03        -7.95039E-03         9.08451E-01         6.90307E-01         9.08486E-01         8.16933E+01         1.00000E+00         1.58574E-03         8.16933E+01         3.13413E+01         5.03520E+01
+          1.44589E-02         7.66576E-03        -8.03127E-03         9.08450E-01         7.00978E-01         9.08486E-01         7.73012E+01         1.00000E+00         1.58037E-03         7.73012E+01         2.94815E+01         4.78197E+01
+          1.44589E-02         7.83559E-03        -8.11397E-03         9.08449E-01         7.11649E-01         9.08485E-01         7.30528E+01         1.00000E+00         1.57559E-03         7.30528E+01         2.76797E+01         4.53731E+01
+          1.44589E-02         8.00542E-03        -8.19848E-03         9.08448E-01         7.22319E-01         9.08485E-01         6.89497E+01         1.00000E+00         1.57139E-03         6.89497E+01         2.59369E+01         4.30128E+01
+          1.44589E-02         8.17524E-03        -8.28480E-03         9.08446E-01         7.32990E-01         9.08484E-01         6.49928E+01         1.00000E+00         1.56777E-03         6.49928E+01         2.42538E+01         4.07390E+01
+          1.44589E-02         8.34507E-03        -8.37294E-03         9.08445E-01         7.43660E-01         9.08484E-01         6.11829E+01         1.00000E+00         1.56473E-03         6.11829E+01         2.26309E+01         3.85521E+01
+          1.44589E-02         8.51490E-03        -8.46289E-03         9.08444E-01         7.54331E-01         9.08483E-01         5.75205E+01         1.00000E+00         1.56228E-03         5.75205E+01         2.10687E+01         3.64518E+01
+          1.44589E-02         8.68473E-03        -8.55464E-03         9.08443E-01         7.65001E-01         9.08483E-01         5.40057E+01         1.00000E+00         1.56040E-03         5.40057E+01         1.95677E+01         3.44380E+01
+          1.44589E-02         8.85455E-03        -8.64822E-03         9.08441E-01         7.75672E-01         9.08482E-01         5.06384E+01         1.00000E+00         1.55911E-03         5.06384E+01         1.81280E+01         3.25104E+01
+          1.44589E-02         9.02438E-03        -8.74360E-03         9.08440E-01         7.86343E-01         9.08482E-01         4.74181E+01         1.00000E+00         1.55838E-03         4.74181E+01         1.67497E+01         3.06685E+01
+          1.44589E-02         9.19421E-03        -8.84079E-03         9.08438E-01         7.97013E-01         9.08481E-01         4.43442E+01         1.00000E+00         1.55823E-03         4.43442E+01         1.54327E+01         2.89115E+01
+          1.44589E-02         9.36403E-03        -8.93980E-03         9.08437E-01         8.07684E-01         9.08481E-01         4.14156E+01         1.00000E+00         1.55864E-03         4.14156E+01         1.41770E+01         2.72386E+01
+          1.44589E-02         9.53386E-03        -9.04062E-03         9.08435E-01         8.18354E-01         9.08480E-01         3.86312E+01         1.00000E+00         1.55961E-03         3.86312E+01         1.29823E+01         2.56489E+01
+          1.44589E-02         9.70369E-03        -9.14325E-03         9.08434E-01         8.29025E-01         9.08480E-01         3.59893E+01         1.00000E+00         1.56113E-03         3.59893E+01         1.18481E+01         2.41412E+01
+          1.44589E-02         9.87352E-03        -9.24770E-03         9.08433E-01         8.39695E-01         9.08480E-01         3.34884E+01         1.00000E+00         1.56321E-03         3.34884E+01         1.07740E+01         2.27144E+01
+          1.44589E-02         1.00433E-02        -9.35395E-03         9.08431E-01         8.50366E-01         9.08479E-01         3.11264E+01         1.00000E+00         1.56582E-03         3.11264E+01         9.75927E+00         2.13671E+01
+          1.44589E-02         1.02132E-02        -9.46202E-03         9.08429E-01         8.61037E-01         9.08479E-01         2.89012E+01         1.00000E+00         1.56897E-03         2.89012E+01         8.80331E+00         2.00979E+01
+          1.44589E-02         1.03830E-02        -9.57190E-03         9.08428E-01         8.71707E-01         9.08478E-01         2.68103E+01         1.00000E+00         1.57265E-03         2.68103E+01         7.90525E+00         1.89051E+01
+          1.44589E-02         1.05528E-02        -9.68360E-03         9.08426E-01         8.82378E-01         9.08478E-01         2.48512E+01         1.00000E+00         1.57685E-03         2.48512E+01         7.06419E+00         1.77871E+01
+          1.44589E-02         1.07227E-02        -9.79710E-03         9.08425E-01         8.93048E-01         9.08477E-01         2.30212E+01         1.00000E+00         1.58156E-03         2.30212E+01         6.27911E+00         1.67421E+01
+          1.44589E-02         1.08925E-02        -9.91242E-03         9.08423E-01         9.03719E-01         9.08477E-01         2.13172E+01         1.00000E+00         1.58678E-03         2.13172E+01         5.54891E+00         1.57683E+01
+          1.44589E-02         1.10623E-02        -1.00295E-02         9.08421E-01         9.14389E-01         9.08477E-01         1.97362E+01         1.00000E+00         1.59249E-03         1.97362E+01         4.87242E+00         1.48637E+01
+          1.44589E-02         1.12321E-02        -1.01485E-02         9.08419E-01         9.25060E-01         9.08476E-01         1.82748E+01         1.00000E+00         1.59868E-03         1.82748E+01         4.24838E+00         1.40265E+01
+          1.44589E-02         1.14020E-02        -1.02692E-02         9.08418E-01         9.35731E-01         9.08476E-01         1.69298E+01         1.00000E+00         1.60536E-03         1.69298E+01         3.67544E+00         1.32544E+01
+          1.44589E-02         1.15718E-02        -1.03918E-02         9.08416E-01         9.46401E-01         9.08475E-01         1.56976E+01         1.00000E+00         1.61250E-03         1.56976E+01         3.15222E+00         1.25454E+01
+          1.44589E-02         1.17416E-02        -1.05162E-02         9.08414E-01         9.57072E-01         9.08475E-01         1.45746E+01         1.00000E+00         1.62010E-03         1.45746E+01         2.67724E+00         1.18973E+01
+          1.44589E-02         1.19114E-02        -1.06424E-02         9.08412E-01         9.67742E-01         9.08475E-01         1.35569E+01         1.00000E+00         1.62814E-03         1.35569E+01         2.24899E+00         1.13079E+01
+          1.44589E-02         1.20813E-02        -1.07704E-02         9.08410E-01         9.78413E-01         9.08474E-01         1.26408E+01         1.00000E+00         1.63663E-03         1.26408E+01         1.86588E+00         1.07750E+01
+          1.44589E-02         1.22511E-02        -1.09002E-02         9.08409E-01         9.89083E-01         9.08474E-01         1.18225E+01         1.00000E+00         1.64554E-03         1.18225E+01         1.52630E+00         1.02962E+01
+          1.44589E-02         1.24209E-02        -1.10318E-02         9.08407E-01         9.99754E-01         9.08474E-01         1.10978E+01         1.00000E+00         1.65487E-03         1.10978E+01         1.22858E+00         9.86922E+00
+          1.44589E-02         1.25908E-02        -1.11653E-02         9.08405E-01         1.01042E+00         9.08473E-01         1.04628E+01         1.00000E+00         1.66461E-03         1.04628E+01         9.71026E-01         9.49179E+00
+          1.44589E-02         1.27606E-02        -1.13005E-02         9.08403E-01         1.02110E+00         9.08473E-01         9.91343E+00         1.00000E+00         1.67474E-03         9.91343E+00         7.51896E-01         9.16153E+00
+          1.44589E-02         1.29304E-02        -1.14376E-02         9.08401E-01         1.03177E+00         9.08473E-01         9.44555E+00         1.00000E+00         1.68526E-03         9.44555E+00         5.69438E-01         8.87611E+00
+          1.44589E-02         1.31002E-02        -1.15765E-02         9.08399E-01         1.04244E+00         9.08473E-01         9.05505E+00         1.00000E+00         1.69615E-03         9.05505E+00         4.21873E-01         8.63318E+00
+          1.44589E-02         1.32701E-02        -1.17172E-02         9.08397E-01         1.05311E+00         9.08472E-01         8.73779E+00         1.00000E+00         1.70741E-03         8.73779E+00         3.07409E-01         8.43038E+00
+          1.44589E-02         1.34399E-02        -1.18597E-02         9.08395E-01         1.06378E+00         9.08472E-01         8.48963E+00         1.00000E+00         1.71901E-03         8.48963E+00         2.24244E-01         8.26539E+00
+          1.44589E-02         1.36097E-02        -1.20040E-02         9.08393E-01         1.07445E+00         9.08472E-01         8.30645E+00         1.00000E+00         1.73096E-03         8.30645E+00         1.70568E-01         8.13588E+00
+          1.44589E-02         1.37795E-02        -1.21501E-02         9.08391E-01         1.08512E+00         9.08472E-01         8.18413E+00         1.00000E+00         1.74323E-03         8.18413E+00         1.44576E-01         8.03956E+00
+          1.44589E-02         1.39494E-02        -1.22980E-02         9.08388E-01         1.09579E+00         9.08472E-01         8.11861E+00         1.00000E+00         1.75582E-03         8.11861E+00         1.44465E-01         7.97414E+00
+          1.44589E-02         1.41192E-02        -1.24478E-02         9.08386E-01         1.10646E+00         9.08472E-01         8.10583E+00         1.00000E+00         1.76871E-03         8.10583E+00         1.68442E-01         7.93739E+00
+          1.44589E-02         1.42890E-02        -1.25994E-02         9.08384E-01         1.11713E+00         9.08471E-01         8.14181E+00         1.00000E+00         1.78190E-03         8.14181E+00         2.14729E-01         7.92708E+00
+          1.44589E-02         1.44589E-02        -1.27527E-02         9.08382E-01         1.12780E+00         9.08471E-01         8.22260E+00         1.00000E+00         1.79536E-03         8.22260E+00         2.81568E-01         7.94103E+00
+          1.44589E-02         1.46287E-02        -1.29079E-02         9.08380E-01         1.13847E+00         9.08471E-01         8.34434E+00         1.00000E+00         1.80910E-03         8.34434E+00         3.67220E-01         7.97712E+00
+          1.44589E-02         1.47985E-02        -1.30649E-02         9.08377E-01         1.14914E+00         9.08471E-01         8.50322E+00         1.00000E+00         1.82309E-03         8.50322E+00         4.69979E-01         8.03325E+00
+          1.44589E-02         1.49683E-02        -1.32238E-02         9.08375E-01         1.15981E+00         9.08471E-01         8.69553E+00         1.00000E+00         1.83732E-03         8.69553E+00         5.88164E-01         8.10736E+00
+          1.44589E-02         1.51382E-02        -1.33844E-02         9.08373E-01         1.17048E+00         9.08471E-01         8.91761E+00         1.00000E+00         1.85179E-03         8.91761E+00         7.20134E-01         8.19748E+00
+          1.44589E-02         1.53080E-02        -1.35468E-02         9.08370E-01         1.18115E+00         9.08471E-01         9.16593E+00         1.00000E+00         1.86648E-03         9.16593E+00         8.64282E-01         8.30165E+00
+          1.44589E-02         1.54778E-02        -1.37111E-02         9.08368E-01         1.19182E+00         9.08471E-01         9.43704E+00         1.00000E+00         1.88138E-03         9.43704E+00         1.01904E+00         8.41800E+00
+          1.44589E-02         1.56476E-02        -1.38771E-02         9.08366E-01         1.20249E+00         9.08472E-01         9.72760E+00         1.00000E+00         1.89648E-03         9.72760E+00         1.18290E+00         8.54470E+00
+          1.44589E-02         1.58175E-02        -1.40450E-02         9.08363E-01         1.21317E+00         9.08472E-01         1.00344E+01         1.00000E+00         1.91176E-03         1.00344E+01         1.35439E+00         8.67998E+00
+          1.44589E-02         1.59873E-02        -1.42147E-02         9.08361E-01         1.22384E+00         9.08472E-01         1.03542E+01         1.00000E+00         1.92721E-03         1.03542E+01         1.53207E+00         8.82215E+00
+          1.44589E-02         1.61571E-02        -1.43862E-02         9.08358E-01         1.23451E+00         9.08472E-01         1.06842E+01         1.00000E+00         1.94282E-03         1.06842E+01         1.71459E+00         8.96957E+00
+          1.44589E-02         1.63270E-02        -1.45595E-02         9.08356E-01         1.24518E+00         9.08472E-01         1.10213E+01         1.00000E+00         1.95858E-03         1.10213E+01         1.90063E+00         9.12068E+00
+          1.44589E-02         1.64968E-02        -1.47347E-02         9.08353E-01         1.25585E+00         9.08473E-01         1.13629E+01         1.00000E+00         1.97448E-03         1.13629E+01         2.08892E+00         9.27398E+00
+          1.44589E-02         1.66666E-02        -1.49116E-02         9.08351E-01         1.26652E+00         9.08473E-01         1.17063E+01         1.00000E+00         1.99050E-03         1.17063E+01         2.27828E+00         9.42803E+00
+          1.44589E-02         1.68364E-02        -1.50904E-02         9.08348E-01         1.27719E+00         9.08473E-01         1.20490E+01         1.00000E+00         2.00664E-03         1.20490E+01         2.46756E+00         9.58149E+00
+          1.44589E-02         1.70063E-02        -1.52709E-02         9.08345E-01         1.28786E+00         9.08474E-01         1.23887E+01         1.00000E+00         2.02288E-03         1.23887E+01         2.65567E+00         9.73306E+00
+          1.44589E-02         1.71761E-02        -1.54533E-02         9.08343E-01         1.29853E+00         9.08474E-01         1.27231E+01         1.00000E+00         2.03920E-03         1.27231E+01         2.84160E+00         9.88153E+00
+          1.44589E-02         1.73459E-02        -1.56375E-02         9.08340E-01         1.30920E+00         9.08475E-01         1.30502E+01         1.00000E+00         2.05561E-03         1.30502E+01         3.02440E+00         1.00258E+01
+          1.44589E-02         1.75158E-02        -1.58235E-02         9.08337E-01         1.31987E+00         9.08475E-01         1.33679E+01         1.00000E+00         2.07208E-03         1.33679E+01         3.20317E+00         1.01647E+01
+          1.44589E-02         1.76856E-02        -1.60113E-02         9.08335E-01         1.33054E+00         9.08476E-01         1.36744E+01         1.00000E+00         2.08862E-03         1.36744E+01         3.37708E+00         1.02973E+01
+          1.44589E-02         1.78554E-02        -1.62010E-02         9.08332E-01         1.34121E+00         9.08476E-01         1.39681E+01         1.00000E+00         2.10519E-03         1.39681E+01         3.54536E+00         1.04228E+01
+          1.44589E-02         1.80252E-02        -1.63924E-02         9.08329E-01         1.35188E+00         9.08477E-01         1.42474E+01         1.00000E+00         2.12180E-03         1.42474E+01         3.70732E+00         1.05401E+01
+          1.44589E-02         1.81951E-02        -1.65857E-02         9.08326E-01         1.36255E+00         9.08478E-01         1.45109E+01         1.00000E+00         2.13844E-03         1.45109E+01         3.86230E+00         1.06486E+01
+          1.44589E-02         1.83649E-02        -1.67807E-02         9.08324E-01         1.37322E+00         9.08479E-01         1.47574E+01         1.00000E+00         2.15508E-03         1.47574E+01         4.00974E+00         1.07476E+01
+          1.44589E-02         1.85347E-02        -1.69776E-02         9.08321E-01         1.38389E+00         9.08479E-01         1.49856E+01         1.00000E+00         2.17173E-03         1.49856E+01         4.14912E+00         1.08365E+01
+          1.44589E-02         1.87045E-02        -1.71763E-02         9.08318E-01         1.39457E+00         9.08480E-01         1.51946E+01         1.00000E+00         2.18837E-03         1.51946E+01         4.27998E+00         1.09146E+01
+          1.44589E-02         1.88744E-02        -1.73768E-02         9.08315E-01         1.40524E+00         9.08481E-01         1.53834E+01         1.00000E+00         2.20499E-03         1.53834E+01         4.40192E+00         1.09815E+01
+          1.44589E-02         1.90442E-02        -1.75791E-02         9.08312E-01         1.41591E+00         9.08482E-01         1.55514E+01         1.00000E+00         2.22158E-03         1.55514E+01         4.51460E+00         1.10368E+01
+          1.44589E-02         1.92140E-02        -1.77833E-02         9.08309E-01         1.42658E+00         9.08483E-01         1.56979E+01         1.00000E+00         2.23814E-03         1.56979E+01         4.61775E+00         1.10801E+01
+          1.44589E-02         1.93839E-02        -1.79892E-02         9.08306E-01         1.43725E+00         9.08484E-01         1.58224E+01         1.00000E+00         2.25464E-03         1.58224E+01         4.71114E+00         1.11112E+01
+          1.44589E-02         1.95537E-02        -1.81970E-02         9.08303E-01         1.44792E+00         9.08485E-01         1.59244E+01         1.00000E+00         2.27109E-03         1.59244E+01         4.79459E+00         1.11298E+01
+          1.44589E-02         1.97235E-02        -1.84066E-02         9.08300E-01         1.45859E+00         9.08487E-01         1.60038E+01         1.00000E+00         2.28746E-03         1.60038E+01         4.86799E+00         1.11358E+01
+          1.44589E-02         1.98933E-02        -1.86179E-02         9.08297E-01         1.46926E+00         9.08488E-01         1.60603E+01         1.00000E+00         2.30376E-03         1.60603E+01         4.93126E+00         1.11291E+01
+          1.44589E-02         2.00632E-02        -1.88311E-02         9.08294E-01         1.47993E+00         9.08489E-01         1.60940E+01         1.00000E+00         2.31998E-03         1.60940E+01         4.98439E+00         1.11096E+01
+          1.44589E-02         2.02330E-02        -1.90461E-02         9.08291E-01         1.49060E+00         9.08490E-01         1.61048E+01         1.00000E+00         2.33609E-03         1.61048E+01         5.02739E+00         1.10774E+01
+          1.44589E-02         2.04028E-02        -1.92630E-02         9.08288E-01         1.50127E+00         9.08492E-01         1.60929E+01         1.00000E+00         2.35211E-03         1.60929E+01         5.06032E+00         1.10325E+01
+          1.44589E-02         2.05726E-02        -1.94816E-02         9.08285E-01         1.51194E+00         9.08493E-01         1.60585E+01         1.00000E+00         2.36800E-03         1.60585E+01         5.08331E+00         1.09752E+01
+          1.44589E-02         2.07425E-02        -1.97021E-02         9.08281E-01         1.52261E+00         9.08495E-01         1.60020E+01         1.00000E+00         2.38378E-03         1.60020E+01         5.09650E+00         1.09055E+01
+          1.44589E-02         2.09123E-02        -1.99243E-02         9.08278E-01         1.53328E+00         9.08497E-01         1.59238E+01         1.00000E+00         2.39942E-03         1.59238E+01         5.10006E+00         1.08237E+01
+          1.44589E-02         2.10821E-02        -2.01484E-02         9.08275E-01         1.54395E+00         9.08498E-01         1.58244E+01         1.00000E+00         2.41493E-03         1.58244E+01         5.09422E+00         1.07301E+01
+          1.44589E-02         2.12520E-02        -2.03743E-02         9.08272E-01         1.55462E+00         9.08500E-01         1.57043E+01         1.00000E+00         2.43028E-03         1.57043E+01         5.07922E+00         1.06251E+01
+          1.44589E-02         2.14218E-02        -2.06020E-02         9.08268E-01         1.56529E+00         9.08502E-01         1.55642E+01         1.00000E+00         2.44548E-03         1.55642E+01         5.05534E+00         1.05089E+01
+          1.44589E-02         2.15916E-02        -2.08315E-02         9.08265E-01         1.57596E+00         9.08504E-01         1.54049E+01         1.00000E+00         2.46052E-03         1.54049E+01         5.02289E+00         1.03820E+01
+          1.44589E-02         2.17614E-02        -2.10629E-02         9.08262E-01         1.58664E+00         9.08506E-01         1.52270E+01         1.00000E+00         2.47539E-03         1.52270E+01         4.98220E+00         1.02448E+01
+          1.44589E-02         2.19313E-02        -2.12960E-02         9.08258E-01         1.59731E+00         9.08508E-01         1.50314E+01         1.00000E+00         2.49007E-03         1.50314E+01         4.93361E+00         1.00978E+01
+          1.44589E-02         2.21011E-02        -2.15310E-02         9.08255E-01         1.60798E+00         9.08510E-01         1.48190E+01         1.00000E+00         2.50458E-03         1.48190E+01         4.87750E+00         9.94155E+00
+          1.44589E-02         2.22709E-02        -2.17677E-02         9.08251E-01         1.61865E+00         9.08512E-01         1.45908E+01         1.00000E+00         2.51888E-03         1.45908E+01         4.81425E+00         9.77652E+00
+          1.44589E-02         2.24407E-02        -2.20063E-02         9.08248E-01         1.62932E+00         9.08515E-01         1.43475E+01         1.00000E+00         2.53299E-03         1.43475E+01         4.74427E+00         9.60328E+00
+          1.44589E-02         2.26106E-02        -2.22467E-02         9.08245E-01         1.63999E+00         9.08517E-01         1.40904E+01         1.00000E+00         2.54689E-03         1.40904E+01         4.66796E+00         9.42241E+00
+          1.44589E-02         2.27804E-02        -2.24889E-02         9.08241E-01         1.65066E+00         9.08519E-01         1.38203E+01         1.00000E+00         2.56057E-03         1.38203E+01         4.58575E+00         9.23453E+00
+          1.44589E-02         2.29502E-02        -2.27329E-02         9.08238E-01         1.66133E+00         9.08522E-01         1.35383E+01         1.00000E+00         2.57403E-03         1.35383E+01         4.49808E+00         9.04023E+00
+          1.44589E-02         2.31201E-02        -2.29788E-02         9.08234E-01         1.67200E+00         9.08525E-01         1.32455E+01         1.00000E+00         2.58727E-03         1.32455E+01         4.40538E+00         8.84016E+00
+          1.44589E-02         2.32899E-02        -2.32264E-02         9.08230E-01         1.68267E+00         9.08527E-01         1.29430E+01         1.00000E+00         2.60027E-03         1.29430E+01         4.30808E+00         8.63495E+00
+          1.44589E-02         2.34597E-02        -2.34759E-02         9.08227E-01         1.69334E+00         9.08530E-01         1.26319E+01         1.00000E+00         2.61304E-03         1.26319E+01         4.20663E+00         8.42526E+00
+          1.44589E-02         2.36295E-02        -2.37272E-02         9.08223E-01         1.70401E+00         9.08533E-01         1.23132E+01         1.00000E+00         2.62556E-03         1.23132E+01         4.10148E+00         8.21173E+00
+          1.44589E-02         2.37994E-02        -2.39803E-02         9.08219E-01         1.71468E+00         9.08536E-01         1.19881E+01         1.00000E+00         2.63782E-03         1.19881E+01         3.99305E+00         7.99504E+00
+          1.44589E-02         2.39692E-02        -2.42352E-02         9.08216E-01         1.72535E+00         9.08539E-01         1.16576E+01         1.00000E+00         2.64983E-03         1.16576E+01         3.88179E+00         7.77583E+00
+          1.44589E-02         2.41390E-02        -2.44919E-02         9.08212E-01         1.73602E+00         9.08542E-01         1.13229E+01         1.00000E+00         2.66158E-03         1.13229E+01         3.76812E+00         7.55476E+00
+          1.44589E-02         2.43088E-02        -2.47504E-02         9.08208E-01         1.74669E+00         9.08546E-01         1.09850E+01         1.00000E+00         2.67306E-03         1.09850E+01         3.65246E+00         7.33250E+00
+          1.44589E-02         2.44787E-02        -2.50108E-02         9.08205E-01         1.75736E+00         9.08549E-01         1.06449E+01         1.00000E+00         2.68427E-03         1.06449E+01         3.53523E+00         7.10967E+00
+          1.44589E-02         2.46485E-02        -2.52729E-02         9.08201E-01         1.76804E+00         9.08552E-01         1.03037E+01         1.00000E+00         2.69521E-03         1.03037E+01         3.41682E+00         6.88692E+00
+          1.44589E-02         2.48183E-02        -2.55369E-02         9.08197E-01         1.77871E+00         9.08556E-01         9.96251E+00         1.00000E+00         2.70586E-03         9.96251E+00         3.29764E+00         6.66488E+00
+          1.44589E-02         2.49882E-02        -2.58027E-02         9.08193E-01         1.78938E+00         9.08560E-01         9.62219E+00         1.00000E+00         2.71623E-03         9.62219E+00         3.17805E+00         6.44414E+00
+          1.44589E-02         2.51580E-02        -2.60703E-02         9.08189E-01         1.80005E+00         9.08563E-01         9.28374E+00         1.00000E+00         2.72630E-03         9.28374E+00         3.05843E+00         6.22531E+00
+          1.44589E-02         2.53278E-02        -2.63397E-02         9.08185E-01         1.81072E+00         9.08567E-01         8.94809E+00         1.00000E+00         2.73609E-03         8.94809E+00         2.93912E+00         6.00896E+00
+          1.44589E-02         2.54976E-02        -2.66109E-02         9.08181E-01         1.82139E+00         9.08571E-01         8.61612E+00         1.00000E+00         2.74557E-03         8.61612E+00         2.82046E+00         5.79566E+00
+          1.44589E-02         2.56675E-02        -2.68840E-02         9.08177E-01         1.83206E+00         9.08575E-01         8.28870E+00         1.00000E+00         2.75476E-03         8.28870E+00         2.70277E+00         5.58592E+00
+          1.44589E-02         2.58373E-02        -2.71588E-02         9.08174E-01         1.84273E+00         9.08580E-01         7.96663E+00         1.00000E+00         2.76364E-03         7.96663E+00         2.58636E+00         5.38028E+00
+          1.44589E-02         2.60071E-02        -2.74355E-02         9.08170E-01         1.85340E+00         9.08584E-01         7.65070E+00         1.00000E+00         2.77221E-03         7.65070E+00         2.47149E+00         5.17920E+00
+          1.44589E-02         2.61769E-02        -2.77140E-02         9.08165E-01         1.86407E+00         9.08588E-01         7.34162E+00         1.00000E+00         2.78047E-03         7.34162E+00         2.35846E+00         4.98316E+00
+          1.46287E-02         8.72665E-04        -6.36445E-03         9.19147E-01         2.74155E-01         9.19169E-01         3.04549E+02         1.00000E+00         1.57237E-03         3.04549E+02         1.26189E+02         1.78359E+02
+          1.46287E-02         1.04249E-03        -6.37466E-03         9.19147E-01         2.84826E-01         9.19169E-01         2.99092E+02         1.00000E+00         1.56107E-03         2.99092E+02         1.23990E+02         1.75101E+02
+          1.46287E-02         1.21232E-03        -6.38669E-03         9.19147E-01         2.95496E-01         9.19169E-01         2.93516E+02         1.00000E+00         1.54960E-03         2.93516E+02         1.21740E+02         1.71776E+02
+          1.46287E-02         1.38215E-03        -6.40053E-03         9.19146E-01         3.06167E-01         9.19169E-01         2.87831E+02         1.00000E+00         1.53797E-03         2.87831E+02         1.19441E+02         1.68390E+02
+          1.46287E-02         1.55197E-03        -6.41619E-03         9.19146E-01         3.16838E-01         9.19169E-01         2.82044E+02         1.00000E+00         1.52621E-03         2.82044E+02         1.17097E+02         1.64947E+02
+          1.46287E-02         1.72180E-03        -6.43365E-03         9.19146E-01         3.27508E-01         9.19169E-01         2.76165E+02         1.00000E+00         1.51434E-03         2.76165E+02         1.14711E+02         1.61454E+02
+          1.46287E-02         1.89163E-03        -6.45293E-03         9.19146E-01         3.38179E-01         9.19168E-01         2.70203E+02         1.00000E+00         1.50239E-03         2.70203E+02         1.12287E+02         1.57916E+02
+          1.46287E-02         2.06146E-03        -6.47402E-03         9.19145E-01         3.48849E-01         9.19168E-01         2.64166E+02         1.00000E+00         1.49038E-03         2.64166E+02         1.09827E+02         1.54339E+02
+          1.46287E-02         2.23128E-03        -6.49692E-03         9.19145E-01         3.59520E-01         9.19168E-01         2.58064E+02         1.00000E+00         1.47834E-03         2.58064E+02         1.07336E+02         1.50728E+02
+          1.46287E-02         2.40111E-03        -6.52163E-03         9.19145E-01         3.70190E-01         9.19168E-01         2.51906E+02         1.00000E+00         1.46630E-03         2.51906E+02         1.04817E+02         1.47089E+02
+          1.46287E-02         2.57094E-03        -6.54815E-03         9.19144E-01         3.80861E-01         9.19168E-01         2.45700E+02         1.00000E+00         1.45426E-03         2.45700E+02         1.02274E+02         1.43426E+02
+          1.46287E-02         2.74077E-03        -6.57649E-03         9.19144E-01         3.91532E-01         9.19167E-01         2.39456E+02         1.00000E+00         1.44227E-03         2.39456E+02         9.97090E+01         1.39747E+02
+          1.46287E-02         2.91059E-03        -6.60664E-03         9.19143E-01         4.02202E-01         9.19167E-01         2.33182E+02         1.00000E+00         1.43034E-03         2.33182E+02         9.71265E+01         1.36056E+02
+          1.46287E-02         3.08042E-03        -6.63860E-03         9.19143E-01         4.12873E-01         9.19167E-01         2.26887E+02         1.00000E+00         1.41850E-03         2.26887E+02         9.45297E+01         1.32357E+02
+          1.46287E-02         3.25025E-03        -6.67237E-03         9.19143E-01         4.23543E-01         9.19167E-01         2.20580E+02         1.00000E+00         1.40676E-03         2.20580E+02         9.19221E+01         1.28658E+02
+          1.46287E-02         3.42008E-03        -6.70796E-03         9.19142E-01         4.34214E-01         9.19166E-01         2.14269E+02         1.00000E+00         1.39516E-03         2.14269E+02         8.93071E+01         1.24961E+02
+          1.46287E-02         3.58990E-03        -6.74535E-03         9.19141E-01         4.44884E-01         9.19166E-01         2.07962E+02         1.00000E+00         1.38371E-03         2.07962E+02         8.66882E+01         1.21274E+02
+          1.46287E-02         3.75973E-03        -6.78456E-03         9.19141E-01         4.55555E-01         9.19166E-01         2.01668E+02         1.00000E+00         1.37243E-03         2.01668E+02         8.40686E+01         1.17600E+02
+          1.46287E-02         3.92956E-03        -6.82558E-03         9.19140E-01         4.66225E-01         9.19166E-01         1.95395E+02         1.00000E+00         1.36135E-03         1.95395E+02         8.14517E+01         1.13944E+02
+          1.46287E-02         4.09939E-03        -6.86841E-03         9.19140E-01         4.76896E-01         9.19165E-01         1.89151E+02         1.00000E+00         1.35048E-03         1.89151E+02         7.88408E+01         1.10310E+02
+          1.46287E-02         4.26921E-03        -6.91306E-03         9.19139E-01         4.87567E-01         9.19165E-01         1.82944E+02         1.00000E+00         1.33984E-03         1.82944E+02         7.62391E+01         1.06705E+02
+          1.46287E-02         4.43904E-03        -6.95952E-03         9.19138E-01         4.98237E-01         9.19165E-01         1.76780E+02         1.00000E+00         1.32946E-03         1.76780E+02         7.36497E+01         1.03130E+02
+          1.46287E-02         4.60887E-03        -7.00778E-03         9.19138E-01         5.08908E-01         9.19164E-01         1.70668E+02         1.00000E+00         1.31934E-03         1.70668E+02         7.10759E+01         9.95917E+01
+          1.46287E-02         4.77869E-03        -7.05786E-03         9.19137E-01         5.19578E-01         9.19164E-01         1.64613E+02         1.00000E+00         1.30951E-03         1.64613E+02         6.85205E+01         9.60929E+01
+          1.46287E-02         4.94852E-03        -7.10976E-03         9.19136E-01         5.30249E-01         9.19164E-01         1.58624E+02         1.00000E+00         1.29999E-03         1.58624E+02         6.59865E+01         9.26376E+01
+          1.46287E-02         5.11835E-03        -7.16346E-03         9.19135E-01         5.40919E-01         9.19163E-01         1.52706E+02         1.00000E+00         1.29078E-03         1.52706E+02         6.34769E+01         8.92296E+01
+          1.46287E-02         5.28818E-03        -7.21898E-03         9.19135E-01         5.51590E-01         9.19163E-01         1.46867E+02         1.00000E+00         1.28190E-03         1.46867E+02         6.09943E+01         8.58723E+01
+          1.46287E-02         5.45800E-03        -7.27631E-03         9.19134E-01         5.62261E-01         9.19162E-01         1.41111E+02         1.00000E+00         1.27337E-03         1.41111E+02         5.85416E+01         8.25690E+01
+          1.46287E-02         5.62783E-03        -7.33545E-03         9.19133E-01         5.72931E-01         9.19162E-01         1.35444E+02         1.00000E+00         1.26519E-03         1.35444E+02         5.61212E+01         7.93228E+01
+          1.46287E-02         5.79766E-03        -7.39640E-03         9.19132E-01         5.83602E-01         9.19162E-01         1.29872E+02         1.00000E+00         1.25738E-03         1.29872E+02         5.37357E+01         7.61366E+01
+          1.46287E-02         5.96749E-03        -7.45916E-03         9.19131E-01         5.94272E-01         9.19161E-01         1.24401E+02         1.00000E+00         1.24995E-03         1.24401E+02         5.13875E+01         7.30131E+01
+          1.46287E-02         6.13731E-03        -7.52374E-03         9.19130E-01         6.04943E-01         9.19161E-01         1.19034E+02         1.00000E+00         1.24291E-03         1.19034E+02         4.90790E+01         6.99549E+01
+          1.46287E-02         6.30714E-03        -7.59013E-03         9.19129E-01         6.15613E-01         9.19160E-01         1.13776E+02         1.00000E+00         1.23627E-03         1.13776E+02         4.68121E+01         6.69643E+01
+          1.46287E-02         6.47697E-03        -7.65833E-03         9.19128E-01         6.26284E-01         9.19160E-01         1.08632E+02         1.00000E+00         1.23004E-03         1.08632E+02         4.45891E+01         6.40434E+01
+          1.46287E-02         6.64680E-03        -7.72834E-03         9.19127E-01         6.36955E-01         9.19160E-01         1.03606E+02         1.00000E+00         1.22422E-03         1.03606E+02         4.24119E+01         6.11941E+01
+          1.46287E-02         6.81662E-03        -7.80017E-03         9.19126E-01         6.47625E-01         9.19159E-01         9.87006E+01         1.00000E+00         1.21881E-03         9.87006E+01         4.02823E+01         5.84183E+01
+          1.46287E-02         6.98645E-03        -7.87381E-03         9.19125E-01         6.58296E-01         9.19159E-01         9.39195E+01         1.00000E+00         1.21384E-03         9.39195E+01         3.82020E+01         5.57175E+01
+          1.46287E-02         7.15628E-03        -7.94926E-03         9.19124E-01         6.68966E-01         9.19158E-01         8.92656E+01         1.00000E+00         1.20929E-03         8.92656E+01         3.61726E+01         5.30930E+01
+          1.46287E-02         7.32611E-03        -8.02652E-03         9.19123E-01         6.79637E-01         9.19158E-01         8.47416E+01         1.00000E+00         1.20517E-03         8.47416E+01         3.41955E+01         5.05461E+01
+          1.46287E-02         7.49593E-03        -8.10559E-03         9.19122E-01         6.90307E-01         9.19157E-01         8.03499E+01         1.00000E+00         1.20150E-03         8.03499E+01         3.22722E+01         4.80777E+01
+          1.46287E-02         7.66576E-03        -8.18648E-03         9.19120E-01         7.00978E-01         9.19157E-01         7.60924E+01         1.00000E+00         1.19826E-03         7.60924E+01         3.04038E+01         4.56886E+01
+          1.46287E-02         7.83559E-03        -8.26917E-03         9.19119E-01         7.11649E-01         9.19156E-01         7.19708E+01         1.00000E+00         1.19546E-03         7.19708E+01         2.85913E+01         4.33795E+01
+          1.46287E-02         8.00542E-03        -8.35368E-03         9.19118E-01         7.22319E-01         9.19156E-01         6.79866E+01         1.00000E+00         1.19310E-03         6.79866E+01         2.68358E+01         4.11508E+01
+          1.46287E-02         8.17524E-03        -8.44001E-03         9.19117E-01         7.32990E-01         9.19155E-01         6.41409E+01         1.00000E+00         1.19119E-03         6.41409E+01         2.51381E+01         3.90028E+01
+          1.46287E-02         8.34507E-03        -8.52814E-03         9.19115E-01         7.43660E-01         9.19155E-01         6.04345E+01         1.00000E+00         1.18971E-03         6.04345E+01         2.34988E+01         3.69357E+01
+          1.46287E-02         8.51490E-03        -8.61809E-03         9.19114E-01         7.54331E-01         9.19154E-01         5.68678E+01         1.00000E+00         1.18868E-03         5.68678E+01         2.19185E+01         3.49493E+01
+          1.46287E-02         8.68473E-03        -8.70985E-03         9.19113E-01         7.65001E-01         9.19154E-01         5.34412E+01         1.00000E+00         1.18809E-03         5.34412E+01         2.03977E+01         3.30436E+01
+          1.46287E-02         8.85455E-03        -8.80342E-03         9.19111E-01         7.75672E-01         9.19153E-01         5.01547E+01         1.00000E+00         1.18793E-03         5.01547E+01         1.89366E+01         3.12180E+01
+          1.46287E-02         9.02438E-03        -8.89880E-03         9.19110E-01         7.86343E-01         9.19153E-01         4.70078E+01         1.00000E+00         1.18821E-03         4.70078E+01         1.75356E+01         2.94722E+01
+          1.46287E-02         9.19421E-03        -8.99599E-03         9.19109E-01         7.97013E-01         9.19153E-01         4.40000E+01         1.00000E+00         1.18892E-03         4.40000E+01         1.61945E+01         2.78055E+01
+          1.46287E-02         9.36403E-03        -9.09500E-03         9.19107E-01         8.07684E-01         9.19152E-01         4.11306E+01         1.00000E+00         1.19007E-03         4.11306E+01         1.49135E+01         2.62171E+01
+          1.46287E-02         9.53386E-03        -9.19582E-03         9.19106E-01         8.18354E-01         9.19152E-01         3.83984E+01         1.00000E+00         1.19164E-03         3.83984E+01         1.36922E+01         2.47062E+01
+          1.46287E-02         9.70369E-03        -9.29845E-03         9.19104E-01         8.29025E-01         9.19151E-01         3.58022E+01         1.00000E+00         1.19363E-03         3.58022E+01         1.25305E+01         2.32716E+01
+          1.46287E-02         9.87352E-03        -9.40290E-03         9.19103E-01         8.39695E-01         9.19151E-01         3.33403E+01         1.00000E+00         1.19603E-03         3.33403E+01         1.14280E+01         2.19123E+01
+          1.46287E-02         1.00433E-02        -9.50915E-03         9.19101E-01         8.50366E-01         9.19150E-01         3.10111E+01         1.00000E+00         1.19885E-03         3.10111E+01         1.03840E+01         2.06271E+01
+          1.46287E-02         1.02132E-02        -9.61722E-03         9.19099E-01         8.61037E-01         9.19150E-01         2.88126E+01         1.00000E+00         1.20208E-03         2.88126E+01         9.39815E+00         1.94145E+01
+          1.46287E-02         1.03830E-02        -9.72710E-03         9.19098E-01         8.71707E-01         9.19149E-01         2.67427E+01         1.00000E+00         1.20572E-03         2.67427E+01         8.46958E+00         1.82731E+01
+          1.46287E-02         1.05528E-02        -9.83879E-03         9.19096E-01         8.82378E-01         9.19149E-01         2.47989E+01         1.00000E+00         1.20975E-03         2.47989E+01         7.59751E+00         1.72014E+01
+          1.46287E-02         1.07227E-02        -9.95230E-03         9.19095E-01         8.93048E-01         9.19148E-01         2.29789E+01         1.00000E+00         1.21417E-03         2.29789E+01         6.78105E+00         1.61978E+01
+          1.46287E-02         1.08925E-02        -1.00676E-02         9.19093E-01         9.03719E-01         9.19148E-01         2.12798E+01         1.00000E+00         1.21898E-03         2.12798E+01         6.01921E+00         1.52606E+01
+          1.46287E-02         1.10623E-02        -1.01847E-02         9.19091E-01         9.14389E-01         9.19148E-01         1.96989E+01         1.00000E+00         1.22416E-03         1.96989E+01         5.31091E+00         1.43880E+01
+          1.46287E-02         1.12321E-02        -1.03037E-02         9.19089E-01         9.25060E-01         9.19147E-01         1.82332E+01         1.00000E+00         1.22972E-03         1.82332E+01         4.65499E+00         1.35782E+01
+          1.46287E-02         1.14020E-02        -1.04244E-02         9.19088E-01         9.35731E-01         9.19147E-01         1.68795E+01         1.00000E+00         1.23565E-03         1.68795E+01         4.05022E+00         1.28293E+01
+          1.46287E-02         1.15718E-02        -1.05470E-02         9.19086E-01         9.46401E-01         9.19146E-01         1.56347E+01         1.00000E+00         1.24194E-03         1.56347E+01         3.49530E+00         1.21394E+01
+          1.46287E-02         1.17416E-02        -1.06714E-02         9.19084E-01         9.57072E-01         9.19146E-01         1.44953E+01         1.00000E+00         1.24858E-03         1.44953E+01         2.98885E+00         1.15065E+01
+          1.46287E-02         1.19114E-02        -1.07976E-02         9.19082E-01         9.67742E-01         9.19146E-01         1.34580E+01         1.00000E+00         1.25556E-03         1.34580E+01         2.52945E+00         1.09285E+01
+          1.46287E-02         1.20813E-02        -1.09256E-02         9.19080E-01         9.78413E-01         9.19145E-01         1.25191E+01         1.00000E+00         1.26289E-03         1.25191E+01         2.11560E+00         1.04035E+01
+          1.46287E-02         1.22511E-02        -1.10554E-02         9.19078E-01         9.89083E-01         9.19145E-01         1.16751E+01         1.00000E+00         1.27054E-03         1.16751E+01         1.74577E+00         9.92936E+00
+          1.46287E-02         1.24209E-02        -1.11870E-02         9.19076E-01         9.99754E-01         9.19145E-01         1.09223E+01         1.00000E+00         1.27852E-03         1.09223E+01         1.41837E+00         9.50396E+00
+          1.46287E-02         1.25908E-02        -1.13205E-02         9.19075E-01         1.01042E+00         9.19144E-01         1.02570E+01         1.00000E+00         1.28682E-03         1.02570E+01         1.13179E+00         9.12520E+00
+          1.46287E-02         1.27606E-02        -1.14557E-02         9.19073E-01         1.02110E+00         9.19144E-01         9.67529E+00         1.00000E+00         1.29542E-03         9.67529E+00         8.84346E-01         8.79094E+00
+          1.46287E-02         1.29304E-02        -1.15928E-02         9.19071E-01         1.03177E+00         9.19144E-01         9.17343E+00         1.00000E+00         1.30432E-03         9.17343E+00         6.74365E-01         8.49907E+00
+          1.46287E-02         1.31002E-02        -1.17317E-02         9.19068E-01         1.04244E+00         9.19143E-01         8.74757E+00         1.00000E+00         1.31352E-03         8.74757E+00         5.00128E-01         8.24744E+00
+          1.46287E-02         1.32701E-02        -1.18724E-02         9.19066E-01         1.05311E+00         9.19143E-01         8.39383E+00         1.00000E+00         1.32300E-03         8.39383E+00         3.59899E-01         8.03394E+00
+          1.46287E-02         1.34399E-02        -1.20149E-02         9.19064E-01         1.06378E+00         9.19143E-01         8.10836E+00         1.00000E+00         1.33275E-03         8.10836E+00         2.51928E-01         7.85643E+00
+          1.46287E-02         1.36097E-02        -1.21592E-02         9.19062E-01         1.07445E+00         9.19143E-01         7.88727E+00         1.00000E+00         1.34277E-03         7.88727E+00         1.74457E-01         7.71282E+00
+          1.46287E-02         1.37795E-02        -1.23053E-02         9.19060E-01         1.08512E+00         9.19142E-01         7.72673E+00         1.00000E+00         1.35305E-03         7.72673E+00         1.25721E-01         7.60101E+00
+          1.46287E-02         1.39494E-02        -1.24532E-02         9.19058E-01         1.09579E+00         9.19142E-01         7.62289E+00         1.00000E+00         1.36358E-03         7.62289E+00         1.03957E-01         7.51893E+00
+          1.46287E-02         1.41192E-02        -1.26030E-02         9.19056E-01         1.10646E+00         9.19142E-01         7.57196E+00         1.00000E+00         1.37435E-03         7.57196E+00         1.07406E-01         7.46455E+00
+          1.46287E-02         1.42890E-02        -1.27546E-02         9.19054E-01         1.11713E+00         9.19142E-01         7.57017E+00         1.00000E+00         1.38536E-03         7.57017E+00         1.34319E-01         7.43585E+00
+          1.46287E-02         1.44589E-02        -1.29079E-02         9.19051E-01         1.12780E+00         9.19142E-01         7.61380E+00         1.00000E+00         1.39659E-03         7.61380E+00         1.82958E-01         7.43084E+00
+          1.46287E-02         1.46287E-02        -1.30631E-02         9.19049E-01         1.13847E+00         9.19142E-01         7.69919E+00         1.00000E+00         1.40803E-03         7.69919E+00         2.51608E-01         7.44759E+00
+          1.46287E-02         1.47985E-02        -1.32201E-02         9.19047E-01         1.14914E+00         9.19142E-01         7.82274E+00         1.00000E+00         1.41968E-03         7.82274E+00         3.38574E-01         7.48417E+00
+          1.46287E-02         1.49683E-02        -1.33789E-02         9.19044E-01         1.15981E+00         9.19142E-01         7.98091E+00         1.00000E+00         1.43152E-03         7.98091E+00         4.42185E-01         7.53872E+00
+          1.46287E-02         1.51382E-02        -1.35396E-02         9.19042E-01         1.17048E+00         9.19142E-01         8.17023E+00         1.00000E+00         1.44355E-03         8.17023E+00         5.60805E-01         7.60942E+00
+          1.46287E-02         1.53080E-02        -1.37020E-02         9.19040E-01         1.18115E+00         9.19142E-01         8.38733E+00         1.00000E+00         1.45577E-03         8.38733E+00         6.92828E-01         7.69450E+00
+          1.46287E-02         1.54778E-02        -1.38663E-02         9.19037E-01         1.19182E+00         9.19142E-01         8.62890E+00         1.00000E+00         1.46815E-03         8.62890E+00         8.36686E-01         7.79222E+00
+          1.46287E-02         1.56476E-02        -1.40323E-02         9.19035E-01         1.20249E+00         9.19142E-01         8.89175E+00         1.00000E+00         1.48069E-03         8.89175E+00         9.90852E-01         7.90090E+00
+          1.46287E-02         1.58175E-02        -1.42002E-02         9.19032E-01         1.21317E+00         9.19142E-01         9.17276E+00         1.00000E+00         1.49338E-03         9.17276E+00         1.15384E+00         8.01892E+00
+          1.46287E-02         1.59873E-02        -1.43699E-02         9.19030E-01         1.22384E+00         9.19142E-01         9.46893E+00         1.00000E+00         1.50622E-03         9.46893E+00         1.32422E+00         8.14472E+00
+          1.46287E-02         1.61571E-02        -1.45414E-02         9.19027E-01         1.23451E+00         9.19142E-01         9.77736E+00         1.00000E+00         1.51919E-03         9.77736E+00         1.50059E+00         8.27677E+00
+          1.46287E-02         1.63270E-02        -1.47147E-02         9.19025E-01         1.24518E+00         9.19143E-01         1.00952E+01         1.00000E+00         1.53229E-03         1.00952E+01         1.68162E+00         8.41362E+00
+          1.46287E-02         1.64968E-02        -1.48898E-02         9.19022E-01         1.25585E+00         9.19143E-01         1.04199E+01         1.00000E+00         1.54550E-03         1.04199E+01         1.86603E+00         8.55388E+00
+          1.46287E-02         1.66666E-02        -1.50668E-02         9.19020E-01         1.26652E+00         9.19143E-01         1.07488E+01         1.00000E+00         1.55881E-03         1.07488E+01         2.05257E+00         8.69620E+00
+          1.46287E-02         1.68364E-02        -1.52455E-02         9.19017E-01         1.27719E+00         9.19144E-01         1.10794E+01         1.00000E+00         1.57223E-03         1.10794E+01         2.24009E+00         8.83931E+00
+          1.46287E-02         1.70063E-02        -1.54261E-02         9.19014E-01         1.28786E+00         9.19144E-01         1.14095E+01         1.00000E+00         1.58573E-03         1.14095E+01         2.42746E+00         8.98200E+00
+          1.46287E-02         1.71761E-02        -1.56085E-02         9.19012E-01         1.29853E+00         9.19144E-01         1.17368E+01         1.00000E+00         1.59932E-03         1.17368E+01         2.61363E+00         9.12312E+00
+          1.46287E-02         1.73459E-02        -1.57927E-02         9.19009E-01         1.30920E+00         9.19145E-01         1.20592E+01         1.00000E+00         1.61297E-03         1.20592E+01         2.79760E+00         9.26157E+00
+          1.46287E-02         1.75158E-02        -1.59787E-02         9.19006E-01         1.31987E+00         9.19145E-01         1.23748E+01         1.00000E+00         1.62669E-03         1.23748E+01         2.97844E+00         9.39634E+00
+          1.46287E-02         1.76856E-02        -1.61665E-02         9.19004E-01         1.33054E+00         9.19146E-01         1.26817E+01         1.00000E+00         1.64047E-03         1.26817E+01         3.15527E+00         9.52646E+00
+          1.46287E-02         1.78554E-02        -1.63561E-02         9.19001E-01         1.34121E+00         9.19146E-01         1.29783E+01         1.00000E+00         1.65429E-03         1.29783E+01         3.32728E+00         9.65103E+00
+          1.46287E-02         1.80252E-02        -1.65476E-02         9.18998E-01         1.35188E+00         9.19147E-01         1.32629E+01         1.00000E+00         1.66814E-03         1.32629E+01         3.49372E+00         9.76923E+00
+          1.46287E-02         1.81951E-02        -1.67408E-02         9.18995E-01         1.36255E+00         9.19148E-01         1.35342E+01         1.00000E+00         1.68203E-03         1.35342E+01         3.65391E+00         9.88027E+00
+          1.46287E-02         1.83649E-02        -1.69359E-02         9.18992E-01         1.37322E+00         9.19148E-01         1.37907E+01         1.00000E+00         1.69594E-03         1.37907E+01         3.80721E+00         9.98347E+00
+          1.46287E-02         1.85347E-02        -1.71328E-02         9.18989E-01         1.38389E+00         9.19149E-01         1.40312E+01         1.00000E+00         1.70986E-03         1.40312E+01         3.95306E+00         1.00782E+01
+          1.46287E-02         1.87045E-02        -1.73315E-02         9.18987E-01         1.39457E+00         9.19150E-01         1.42547E+01         1.00000E+00         1.72378E-03         1.42547E+01         4.09095E+00         1.01638E+01
+          1.46287E-02         1.88744E-02        -1.75320E-02         9.18984E-01         1.40524E+00         9.19151E-01         1.44603E+01         1.00000E+00         1.73770E-03         1.44603E+01         4.22044E+00         1.02398E+01
+          1.46287E-02         1.90442E-02        -1.77343E-02         9.18981E-01         1.41591E+00         9.19152E-01         1.46470E+01         1.00000E+00         1.75161E-03         1.46470E+01         4.34114E+00         1.03058E+01
+          1.46287E-02         1.92140E-02        -1.79384E-02         9.18978E-01         1.42658E+00         9.19153E-01         1.48141E+01         1.00000E+00         1.76551E-03         1.48141E+01         4.45271E+00         1.03614E+01
+          1.46287E-02         1.93839E-02        -1.81444E-02         9.18975E-01         1.43725E+00         9.19154E-01         1.49610E+01         1.00000E+00         1.77937E-03         1.49610E+01         4.55489E+00         1.04061E+01
+          1.46287E-02         1.95537E-02        -1.83522E-02         9.18972E-01         1.44792E+00         9.19155E-01         1.50873E+01         1.00000E+00         1.79321E-03         1.50873E+01         4.64745E+00         1.04398E+01
+          1.46287E-02         1.97235E-02        -1.85617E-02         9.18969E-01         1.45859E+00         9.19156E-01         1.51924E+01         1.00000E+00         1.80700E-03         1.51924E+01         4.73022E+00         1.04622E+01
+          1.46287E-02         1.98933E-02        -1.87731E-02         9.18965E-01         1.46926E+00         9.19157E-01         1.52763E+01         1.00000E+00         1.82074E-03         1.52763E+01         4.80308E+00         1.04732E+01
+          1.46287E-02         2.00632E-02        -1.89863E-02         9.18962E-01         1.47993E+00         9.19158E-01         1.53386E+01         1.00000E+00         1.83443E-03         1.53386E+01         4.86597E+00         1.04726E+01
+          1.46287E-02         2.02330E-02        -1.92013E-02         9.18959E-01         1.49060E+00         9.19160E-01         1.53792E+01         1.00000E+00         1.84806E-03         1.53792E+01         4.91885E+00         1.04604E+01
+          1.46287E-02         2.04028E-02        -1.94181E-02         9.18956E-01         1.50127E+00         9.19161E-01         1.53983E+01         1.00000E+00         1.86162E-03         1.53983E+01         4.96176E+00         1.04366E+01
+          1.46287E-02         2.05726E-02        -1.96368E-02         9.18953E-01         1.51194E+00         9.19163E-01         1.53959E+01         1.00000E+00         1.87511E-03         1.53959E+01         4.99476E+00         1.04011E+01
+          1.46287E-02         2.07425E-02        -1.98572E-02         9.18950E-01         1.52261E+00         9.19164E-01         1.53722E+01         1.00000E+00         1.88851E-03         1.53722E+01         5.01796E+00         1.03542E+01
+          1.46287E-02         2.09123E-02        -2.00795E-02         9.18946E-01         1.53328E+00         9.19166E-01         1.53275E+01         1.00000E+00         1.90182E-03         1.53275E+01         5.03150E+00         1.02960E+01
+          1.46287E-02         2.10821E-02        -2.03036E-02         9.18943E-01         1.54395E+00         9.19167E-01         1.52621E+01         1.00000E+00         1.91504E-03         1.52621E+01         5.03555E+00         1.02265E+01
+          1.46287E-02         2.12520E-02        -2.05295E-02         9.18940E-01         1.55462E+00         9.19169E-01         1.51765E+01         1.00000E+00         1.92816E-03         1.51765E+01         5.03034E+00         1.01462E+01
+          1.46287E-02         2.14218E-02        -2.07572E-02         9.18936E-01         1.56529E+00         9.19171E-01         1.50712E+01         1.00000E+00         1.94116E-03         1.50712E+01         5.01610E+00         1.00551E+01
+          1.46287E-02         2.15916E-02        -2.09867E-02         9.18933E-01         1.57596E+00         9.19173E-01         1.49468E+01         1.00000E+00         1.95406E-03         1.49468E+01         4.99311E+00         9.95367E+00
+          1.46287E-02         2.17614E-02        -2.12180E-02         9.18930E-01         1.58664E+00         9.19175E-01         1.48039E+01         1.00000E+00         1.96683E-03         1.48039E+01         4.96167E+00         9.84218E+00
+          1.46287E-02         2.19313E-02        -2.14512E-02         9.18926E-01         1.59731E+00         9.19177E-01         1.46431E+01         1.00000E+00         1.97948E-03         1.46431E+01         4.92210E+00         9.72103E+00
+          1.46287E-02         2.21011E-02        -2.16861E-02         9.18923E-01         1.60798E+00         9.19179E-01         1.44654E+01         1.00000E+00         1.99200E-03         1.44654E+01         4.87475E+00         9.59060E+00
+          1.46287E-02         2.22709E-02        -2.19229E-02         9.18919E-01         1.61865E+00         9.19181E-01         1.42713E+01         1.00000E+00         2.00438E-03         1.42713E+01         4.81998E+00         9.45135E+00
+          1.46287E-02         2.24407E-02        -2.21615E-02         9.18916E-01         1.62932E+00         9.19183E-01         1.40619E+01         1.00000E+00         2.01662E-03         1.40619E+01         4.75817E+00         9.30372E+00
+          1.46287E-02         2.26106E-02        -2.24019E-02         9.18912E-01         1.63999E+00         9.19185E-01         1.38379E+01         1.00000E+00         2.02871E-03         1.38379E+01         4.68972E+00         9.14820E+00
+          1.46287E-02         2.27804E-02        -2.26441E-02         9.18909E-01         1.65066E+00         9.19188E-01         1.36003E+01         1.00000E+00         2.04064E-03         1.36003E+01         4.61502E+00         8.98529E+00
+          1.46287E-02         2.29502E-02        -2.28881E-02         9.18905E-01         1.66133E+00         9.19190E-01         1.33500E+01         1.00000E+00         2.05242E-03         1.33500E+01         4.53450E+00         8.81553E+00
+          1.46287E-02         2.31201E-02        -2.31339E-02         9.18902E-01         1.67200E+00         9.19193E-01         1.30880E+01         1.00000E+00         2.06403E-03         1.30880E+01         4.44858E+00         8.63946E+00
+          1.46287E-02         2.32899E-02        -2.33816E-02         9.18898E-01         1.68267E+00         9.19195E-01         1.28153E+01         1.00000E+00         2.07547E-03         1.28153E+01         4.35770E+00         8.45763E+00
+          1.46287E-02         2.34597E-02        -2.36311E-02         9.18894E-01         1.69334E+00         9.19198E-01         1.25329E+01         1.00000E+00         2.08674E-03         1.25329E+01         4.26227E+00         8.27062E+00
+          1.46287E-02         2.36295E-02        -2.38823E-02         9.18891E-01         1.70401E+00         9.19201E-01         1.22417E+01         1.00000E+00         2.09783E-03         1.22417E+01         4.16274E+00         8.07901E+00
+          1.46287E-02         2.37994E-02        -2.41354E-02         9.18887E-01         1.71468E+00         9.19204E-01         1.19429E+01         1.00000E+00         2.10873E-03         1.19429E+01         4.05955E+00         7.88338E+00
+          1.46287E-02         2.39692E-02        -2.43903E-02         9.18883E-01         1.72535E+00         9.19207E-01         1.16374E+01         1.00000E+00         2.11944E-03         1.16374E+01         3.95311E+00         7.68433E+00
+          1.46287E-02         2.41390E-02        -2.46471E-02         9.18880E-01         1.73602E+00         9.19210E-01         1.13263E+01         1.00000E+00         2.12996E-03         1.13263E+01         3.84387E+00         7.48246E+00
+          1.46287E-02         2.43088E-02        -2.49056E-02         9.18876E-01         1.74669E+00         9.19213E-01         1.10106E+01         1.00000E+00         2.14028E-03         1.10106E+01         3.73223E+00         7.27837E+00
+          1.46287E-02         2.44787E-02        -2.51659E-02         9.18872E-01         1.75736E+00         9.19216E-01         1.06913E+01         1.00000E+00         2.15040E-03         1.06913E+01         3.61862E+00         7.07265E+00
+          1.46287E-02         2.46485E-02        -2.54281E-02         9.18868E-01         1.76804E+00         9.19220E-01         1.03693E+01         1.00000E+00         2.16032E-03         1.03693E+01         3.50345E+00         6.86590E+00
+          1.46287E-02         2.48183E-02        -2.56921E-02         9.18864E-01         1.77871E+00         9.19223E-01         1.00458E+01         1.00000E+00         2.17002E-03         1.00458E+01         3.38710E+00         6.65869E+00
+          1.46287E-02         2.49882E-02        -2.59578E-02         9.18860E-01         1.78938E+00         9.19227E-01         9.72159E+00         1.00000E+00         2.17950E-03         9.72159E+00         3.26997E+00         6.45162E+00
+          1.46287E-02         2.51580E-02        -2.62254E-02         9.18856E-01         1.80005E+00         9.19231E-01         9.39767E+00         1.00000E+00         2.18877E-03         9.39767E+00         3.15243E+00         6.24524E+00
+          1.46287E-02         2.53278E-02        -2.64949E-02         9.18852E-01         1.81072E+00         9.19234E-01         9.07495E+00         1.00000E+00         2.19781E-03         9.07495E+00         3.03483E+00         6.04012E+00
+          1.46287E-02         2.54976E-02        -2.67661E-02         9.18849E-01         1.82139E+00         9.19238E-01         8.75432E+00         1.00000E+00         2.20663E-03         8.75432E+00         2.91753E+00         5.83679E+00
+          1.46287E-02         2.56675E-02        -2.70391E-02         9.18845E-01         1.83206E+00         9.19242E-01         8.43663E+00         1.00000E+00         2.21522E-03         8.43663E+00         2.80085E+00         5.63578E+00
+          1.46287E-02         2.58373E-02        -2.73140E-02         9.18841E-01         1.84273E+00         9.19246E-01         8.12272E+00         1.00000E+00         2.22357E-03         8.12272E+00         2.68511E+00         5.43761E+00
+          1.46287E-02         2.60071E-02        -2.75906E-02         9.18836E-01         1.85340E+00         9.19251E-01         7.81336E+00         1.00000E+00         2.23169E-03         7.81336E+00         2.57060E+00         5.24275E+00
+          1.46287E-02         2.61769E-02        -2.78691E-02         9.18832E-01         1.86407E+00         9.19255E-01         7.50931E+00         1.00000E+00         2.23957E-03         7.50931E+00         2.45762E+00         5.05169E+00
+          1.47985E-02         8.72665E-04        -6.52147E-03         9.29818E-01         2.74155E-01         9.29840E-01         2.93867E+02         1.00000E+00         1.16607E-03         2.93867E+02         1.24865E+02         1.69002E+02
+          1.47985E-02         1.04249E-03        -6.53168E-03         9.29817E-01         2.84826E-01         9.29840E-01         2.88655E+02         1.00000E+00         1.15797E-03         2.88655E+02         1.22740E+02         1.65916E+02
+          1.47985E-02         1.21232E-03        -6.54371E-03         9.29817E-01         2.95496E-01         9.29840E-01         2.83330E+02         1.00000E+00         1.14974E-03         2.83330E+02         1.20563E+02         1.62767E+02
+          1.47985E-02         1.38215E-03        -6.55755E-03         9.29817E-01         3.06167E-01         9.29840E-01         2.77899E+02         1.00000E+00         1.14141E-03         2.77899E+02         1.18339E+02         1.59560E+02
+          1.47985E-02         1.55197E-03        -6.57321E-03         9.29817E-01         3.16838E-01         9.29840E-01         2.72371E+02         1.00000E+00         1.13299E-03         2.72371E+02         1.16070E+02         1.56301E+02
+          1.47985E-02         1.72180E-03        -6.59067E-03         9.29817E-01         3.27508E-01         9.29840E-01         2.66754E+02         1.00000E+00         1.12450E-03         2.66754E+02         1.13760E+02         1.52994E+02
+          1.47985E-02         1.89163E-03        -6.60995E-03         9.29816E-01         3.38179E-01         9.29840E-01         2.61057E+02         1.00000E+00         1.11596E-03         2.61057E+02         1.11411E+02         1.49646E+02
+          1.47985E-02         2.06146E-03        -6.63104E-03         9.29816E-01         3.48849E-01         9.29840E-01         2.55288E+02         1.00000E+00         1.10739E-03         2.55288E+02         1.09027E+02         1.46261E+02
+          1.47985E-02         2.23128E-03        -6.65394E-03         9.29816E-01         3.59520E-01         9.29839E-01         2.49456E+02         1.00000E+00         1.09880E-03         2.49456E+02         1.06612E+02         1.42844E+02
+          1.47985E-02         2.40111E-03        -6.67865E-03         9.29815E-01         3.70190E-01         9.29839E-01         2.43569E+02         1.00000E+00         1.09021E-03         2.43569E+02         1.04167E+02         1.39402E+02
+          1.47985E-02         2.57094E-03        -6.70517E-03         9.29815E-01         3.80861E-01         9.29839E-01         2.37635E+02         1.00000E+00         1.08165E-03         2.37635E+02         1.01697E+02         1.35938E+02
+          1.47985E-02         2.74077E-03        -6.73351E-03         9.29814E-01         3.91532E-01         9.29839E-01         2.31664E+02         1.00000E+00         1.07312E-03         2.31664E+02         9.92055E+01         1.32458E+02
+          1.47985E-02         2.91059E-03        -6.76366E-03         9.29814E-01         4.02202E-01         9.29839E-01         2.25663E+02         1.00000E+00         1.06465E-03         2.25663E+02         9.66950E+01         1.28968E+02
+          1.47985E-02         3.08042E-03        -6.79562E-03         9.29814E-01         4.12873E-01         9.29838E-01         2.19641E+02         1.00000E+00         1.05625E-03         2.19641E+02         9.41691E+01         1.25472E+02
+          1.47985E-02         3.25025E-03        -6.82939E-03         9.29813E-01         4.23543E-01         9.29838E-01         2.13606E+02         1.00000E+00         1.04793E-03         2.13606E+02         9.16310E+01         1.21975E+02
+          1.47985E-02         3.42008E-03        -6.86497E-03         9.29812E-01         4.34214E-01         9.29838E-01         2.07566E+02         1.00000E+00         1.03973E-03         2.07566E+02         8.90841E+01         1.18482E+02
+          1.47985E-02         3.58990E-03        -6.90237E-03         9.29812E-01         4.44884E-01         9.29838E-01         2.01529E+02         1.00000E+00         1.03164E-03         2.01529E+02         8.65316E+01         1.14997E+02
+          1.47985E-02         3.75973E-03        -6.94158E-03         9.29811E-01         4.55555E-01         9.29837E-01         1.95503E+02         1.00000E+00         1.02369E-03         1.95503E+02         8.39768E+01         1.11526E+02
+          1.47985E-02         3.92956E-03        -6.98260E-03         9.29811E-01         4.66225E-01         9.29837E-01         1.89496E+02         1.00000E+00         1.01590E-03         1.89496E+02         8.14228E+01         1.08073E+02
+          1.47985E-02         4.09939E-03        -7.02543E-03         9.29810E-01         4.76896E-01         9.29837E-01         1.83514E+02         1.00000E+00         1.00827E-03         1.83514E+02         7.88728E+01         1.04641E+02
+          1.47985E-02         4.26921E-03        -7.07008E-03         9.29809E-01         4.87567E-01         9.29836E-01         1.77566E+02         1.00000E+00         1.00082E-03         1.77566E+02         7.63298E+01         1.01236E+02
+          1.47985E-02         4.43904E-03        -7.11653E-03         9.29809E-01         4.98237E-01         9.29836E-01         1.71658E+02         1.00000E+00         9.93564E-04         1.71658E+02         7.37971E+01         9.78611E+01
+          1.47985E-02         4.60887E-03        -7.16480E-03         9.29808E-01         5.08908E-01         9.29836E-01         1.65798E+02         1.00000E+00         9.86517E-04         1.65798E+02         7.12775E+01         9.45203E+01
+          1.47985E-02         4.77869E-03        -7.21488E-03         9.29807E-01         5.19578E-01         9.29835E-01         1.59991E+02         1.00000E+00         9.79689E-04         1.59991E+02         6.87739E+01         9.12175E+01
+          1.47985E-02         4.94852E-03        -7.26677E-03         9.29807E-01         5.30249E-01         9.29835E-01         1.54246E+02         1.00000E+00         9.73093E-04         1.54246E+02         6.62894E+01         8.79561E+01
+          1.47985E-02         5.11835E-03        -7.32048E-03         9.29806E-01         5.40919E-01         9.29835E-01         1.48566E+02         1.00000E+00         9.66739E-04         1.48566E+02         6.38266E+01         8.47397E+01
+          1.47985E-02         5.28818E-03        -7.37600E-03         9.29805E-01         5.51590E-01         9.29834E-01         1.42960E+02         1.00000E+00         9.60638E-04         1.42960E+02         6.13883E+01         8.15714E+01
+          1.47985E-02         5.45800E-03        -7.43332E-03         9.29804E-01         5.62261E-01         9.29834E-01         1.37431E+02         1.00000E+00         9.54800E-04         1.37431E+02         5.89772E+01         7.84543E+01
+          1.47985E-02         5.62783E-03        -7.49246E-03         9.29803E-01         5.72931E-01         9.29833E-01         1.31987E+02         1.00000E+00         9.49234E-04         1.31987E+02         5.65957E+01         7.53912E+01
+          1.47985E-02         5.79766E-03        -7.55342E-03         9.29802E-01         5.83602E-01         9.29833E-01         1.26631E+02         1.00000E+00         9.43948E-04         1.26631E+02         5.42464E+01         7.23849E+01
+          1.47985E-02         5.96749E-03        -7.61618E-03         9.29801E-01         5.94272E-01         9.29833E-01         1.21370E+02         1.00000E+00         9.38950E-04         1.21370E+02         5.19316E+01         6.94380E+01
+          1.47985E-02         6.13731E-03        -7.68076E-03         9.29800E-01         6.04943E-01         9.29832E-01         1.16206E+02         1.00000E+00         9.34248E-04         1.16206E+02         4.96536E+01         6.65526E+01
+          1.47985E-02         6.30714E-03        -7.74715E-03         9.29799E-01         6.15613E-01         9.29832E-01         1.11146E+02         1.00000E+00         9.29847E-04         1.11146E+02         4.74146E+01         6.37310E+01
+          1.47985E-02         6.47697E-03        -7.81535E-03         9.29798E-01         6.26284E-01         9.29831E-01         1.06192E+02         1.00000E+00         9.25754E-04         1.06192E+02         4.52166E+01         6.09751E+01
+          1.47985E-02         6.64680E-03        -7.88536E-03         9.29797E-01         6.36955E-01         9.29831E-01         1.01348E+02         1.00000E+00         9.21974E-04         1.01348E+02         4.30617E+01         5.82868E+01
+          1.47985E-02         6.81662E-03        -7.95719E-03         9.29796E-01         6.47625E-01         9.29830E-01         9.66190E+01         1.00000E+00         9.18512E-04         9.66190E+01         4.09515E+01         5.56675E+01
+          1.47985E-02         6.98645E-03        -8.03082E-03         9.29795E-01         6.58296E-01         9.29830E-01         9.20067E+01         1.00000E+00         9.15371E-04         9.20067E+01         3.88879E+01         5.31187E+01
+          1.47985E-02         7.15628E-03        -8.10627E-03         9.29794E-01         6.68966E-01         9.29829E-01         8.75143E+01         1.00000E+00         9.12555E-04         8.75143E+01         3.68725E+01         5.06418E+01
+          1.47985E-02         7.32611E-03        -8.18353E-03         9.29793E-01         6.79637E-01         9.29829E-01         8.31444E+01         1.00000E+00         9.10067E-04         8.31444E+01         3.49068E+01         4.82376E+01
+          1.47985E-02         7.49593E-03        -8.26261E-03         9.29792E-01         6.90307E-01         9.29829E-01         7.88993E+01         1.00000E+00         9.07909E-04         7.88993E+01         3.29922E+01         4.59071E+01
+          1.47985E-02         7.66576E-03        -8.34349E-03         9.29791E-01         7.00978E-01         9.29828E-01         7.47809E+01         1.00000E+00         9.06082E-04         7.47809E+01         3.11299E+01         4.36510E+01
+          1.47985E-02         7.83559E-03        -8.42619E-03         9.29789E-01         7.11649E-01         9.29828E-01         7.07909E+01         1.00000E+00         9.04589E-04         7.07909E+01         2.93210E+01         4.14699E+01
+          1.47985E-02         8.00542E-03        -8.51070E-03         9.29788E-01         7.22319E-01         9.29827E-01         6.69308E+01         1.00000E+00         9.03430E-04         6.69308E+01         2.75667E+01         3.93641E+01
+          1.47985E-02         8.17524E-03        -8.59702E-03         9.29787E-01         7.32990E-01         9.29827E-01         6.32016E+01         1.00000E+00         9.02606E-04         6.32016E+01         2.58677E+01         3.73339E+01
+          1.47985E-02         8.34507E-03        -8.68515E-03         9.29786E-01         7.43660E-01         9.29826E-01         5.96042E+01         1.00000E+00         9.02115E-04         5.96042E+01         2.42249E+01         3.53794E+01
+          1.47985E-02         8.51490E-03        -8.77510E-03         9.29784E-01         7.54331E-01         9.29826E-01         5.61392E+01         1.00000E+00         9.01959E-04         5.61392E+01         2.26388E+01         3.35004E+01
+          1.47985E-02         8.68473E-03        -8.86686E-03         9.29783E-01         7.65001E-01         9.29825E-01         5.28068E+01         1.00000E+00         9.02135E-04         5.28068E+01         2.11101E+01         3.16967E+01
+          1.47985E-02         8.85455E-03        -8.96043E-03         9.29781E-01         7.75672E-01         9.29825E-01         4.96072E+01         1.00000E+00         9.02643E-04         4.96072E+01         1.96392E+01         2.99680E+01
+          1.47985E-02         9.02438E-03        -9.05581E-03         9.29780E-01         7.86343E-01         9.29824E-01         4.65401E+01         1.00000E+00         9.03481E-04         4.65401E+01         1.82263E+01         2.83138E+01
+          1.47985E-02         9.19421E-03        -9.15301E-03         9.29779E-01         7.97013E-01         9.29824E-01         4.36050E+01         1.00000E+00         9.04647E-04         4.36050E+01         1.68716E+01         2.67334E+01
+          1.47985E-02         9.36403E-03        -9.25201E-03         9.29777E-01         8.07684E-01         9.29823E-01         4.08013E+01         1.00000E+00         9.06139E-04         4.08013E+01         1.55751E+01         2.52262E+01
+          1.47985E-02         9.53386E-03        -9.35283E-03         9.29776E-01         8.18354E-01         9.29823E-01         3.81280E+01         1.00000E+00         9.07955E-04         3.81280E+01         1.43368E+01         2.37912E+01
+          1.47985E-02         9.70369E-03        -9.45546E-03         9.29774E-01         8.29025E-01         9.29822E-01         3.55840E+01         1.00000E+00         9.10092E-04         3.55840E+01         1.31566E+01         2.24275E+01
+          1.47985E-02         9.87352E-03        -9.55991E-03         9.29773E-01         8.39695E-01         9.29822E-01         3.31680E+01         1.00000E+00         9.12546E-04         3.31680E+01         1.20340E+01         2.11339E+01
+          1.47985E-02         1.00433E-02        -9.66616E-03         9.29771E-01         8.50366E-01         9.29821E-01         3.08783E+01         1.00000E+00         9.15315E-04         3.08783E+01         1.09689E+01         1.99094E+01
+          1.47985E-02         1.02132E-02        -9.77423E-03         9.29769E-01         8.61037E-01         9.29821E-01         2.87132E+01         1.00000E+00         9.18396E-04         2.87132E+01         9.96052E+00         1.87527E+01
+          1.47985E-02         1.03830E-02        -9.88411E-03         9.29768E-01         8.71707E-01         9.29820E-01         2.66708E+01         1.00000E+00         9.21784E-04         2.66708E+01         9.00844E+00         1.76624E+01
+          1.47985E-02         1.05528E-02        -9.99580E-03         9.29766E-01         8.82378E-01         9.29820E-01         2.47490E+01         1.00000E+00         9.25476E-04         2.47490E+01         8.11192E+00         1.66371E+01
+          1.47985E-02         1.07227E-02        -1.01093E-02         9.29764E-01         8.93048E-01         9.29819E-01         2.29454E+01         1.00000E+00         9.29468E-04         2.29454E+01         7.27017E+00         1.56752E+01
+          1.47985E-02         1.08925E-02        -1.02246E-02         9.29763E-01         9.03719E-01         9.29819E-01         2.12576E+01         1.00000E+00         9.33755E-04         2.12576E+01         6.48231E+00         1.47753E+01
+          1.47985E-02         1.10623E-02        -1.03418E-02         9.29761E-01         9.14389E-01         9.29819E-01         1.96830E+01         1.00000E+00         9.38334E-04         1.96830E+01         5.74738E+00         1.39356E+01
+          1.47985E-02         1.12321E-02        -1.04607E-02         9.29759E-01         9.25060E-01         9.29818E-01         1.82189E+01         1.00000E+00         9.43200E-04         1.82189E+01         5.06434E+00         1.31545E+01
+          1.47985E-02         1.14020E-02        -1.05815E-02         9.29757E-01         9.35731E-01         9.29818E-01         1.68624E+01         1.00000E+00         9.48348E-04         1.68624E+01         4.43206E+00         1.24303E+01
+          1.47985E-02         1.15718E-02        -1.07040E-02         9.29756E-01         9.46401E-01         9.29817E-01         1.56106E+01         1.00000E+00         9.53773E-04         1.56106E+01         3.84934E+00         1.17612E+01
+          1.47985E-02         1.17416E-02        -1.08284E-02         9.29754E-01         9.57072E-01         9.29817E-01         1.44603E+01         1.00000E+00         9.59471E-04         1.44603E+01         3.31493E+00         1.11454E+01
+          1.47985E-02         1.19114E-02        -1.09546E-02         9.29752E-01         9.67742E-01         9.29816E-01         1.34084E+01         1.00000E+00         9.65437E-04         1.34084E+01         2.82749E+00         1.05809E+01
+          1.47985E-02         1.20813E-02        -1.10826E-02         9.29750E-01         9.78413E-01         9.29816E-01         1.24516E+01         1.00000E+00         9.71665E-04         1.24516E+01         2.38563E+00         1.00660E+01
+          1.47985E-02         1.22511E-02        -1.12124E-02         9.29748E-01         9.89083E-01         9.29816E-01         1.15866E+01         1.00000E+00         9.78149E-04         1.15866E+01         1.98792E+00         9.59872E+00
+          1.47985E-02         1.24209E-02        -1.13440E-02         9.29746E-01         9.99754E-01         9.29815E-01         1.08100E+01         1.00000E+00         9.84886E-04         1.08100E+01         1.63285E+00         9.17716E+00
+          1.47985E-02         1.25908E-02        -1.14775E-02         9.29744E-01         1.01042E+00         9.29815E-01         1.01183E+01         1.00000E+00         9.91869E-04         1.01183E+01         1.31891E+00         8.79939E+00
+          1.47985E-02         1.27606E-02        -1.16127E-02         9.29742E-01         1.02110E+00         9.29815E-01         9.50798E+00         1.00000E+00         9.99092E-04         9.50798E+00         1.04451E+00         8.46348E+00
+          1.47985E-02         1.29304E-02        -1.17498E-02         9.29740E-01         1.03177E+00         9.29814E-01         8.97551E+00         1.00000E+00         1.00655E-03         8.97551E+00         8.08037E-01         8.16747E+00
+          1.47985E-02         1.31002E-02        -1.18887E-02         9.29738E-01         1.04244E+00         9.29814E-01         8.51730E+00         1.00000E+00         1.01424E-03         8.51730E+00         6.07864E-01         7.90944E+00
+          1.47985E-02         1.32701E-02        -1.20294E-02         9.29736E-01         1.05311E+00         9.29814E-01         8.12977E+00         1.00000E+00         1.02215E-03         8.12977E+00         4.42325E-01         7.68744E+00
+          1.47985E-02         1.34399E-02        -1.21719E-02         9.29734E-01         1.06378E+00         9.29814E-01         7.80930E+00         1.00000E+00         1.03027E-03         7.80930E+00         3.09739E-01         7.49956E+00
+          1.47985E-02         1.36097E-02        -1.23162E-02         9.29732E-01         1.07445E+00         9.29813E-01         7.55229E+00         1.00000E+00         1.03861E-03         7.55229E+00         2.08409E-01         7.34388E+00
+          1.47985E-02         1.37795E-02        -1.24623E-02         9.29730E-01         1.08512E+00         9.29813E-01         7.35513E+00         1.00000E+00         1.04715E-03         7.35513E+00         1.36631E-01         7.21850E+00
+          1.47985E-02         1.39494E-02        -1.26102E-02         9.29727E-01         1.09579E+00         9.29813E-01         7.21424E+00         1.00000E+00         1.05589E-03         7.21424E+00         9.26936E-02         7.12155E+00
+          1.47985E-02         1.41192E-02        -1.27600E-02         9.29725E-01         1.10646E+00         9.29813E-01         7.12605E+00         1.00000E+00         1.06482E-03         7.12605E+00         7.48873E-02         7.05116E+00
+          1.47985E-02         1.42890E-02        -1.29116E-02         9.29723E-01         1.11713E+00         9.29813E-01         7.08703E+00         1.00000E+00         1.07393E-03         7.08703E+00         8.15062E-02         7.00553E+00
+          1.47985E-02         1.44589E-02        -1.30649E-02         9.29721E-01         1.12780E+00         9.29813E-01         7.09369E+00         1.00000E+00         1.08323E-03         7.09369E+00         1.10853E-01         6.98284E+00
+          1.47985E-02         1.46287E-02        -1.32201E-02         9.29718E-01         1.13847E+00         9.29812E-01         7.14257E+00         1.00000E+00         1.09269E-03         7.14257E+00         1.61245E-01         6.98132E+00
+          1.47985E-02         1.47985E-02        -1.33771E-02         9.29716E-01         1.14914E+00         9.29812E-01         7.23027E+00         1.00000E+00         1.10233E-03         7.23027E+00         2.31015E-01         6.99925E+00
+          1.47985E-02         1.49683E-02        -1.35359E-02         9.29714E-01         1.15981E+00         9.29812E-01         7.35345E+00         1.00000E+00         1.11212E-03         7.35345E+00         3.18519E-01         7.03493E+00
+          1.47985E-02         1.51382E-02        -1.36966E-02         9.29711E-01         1.17048E+00         9.29812E-01         7.50883E+00         1.00000E+00         1.12206E-03         7.50883E+00         4.22136E-01         7.08670E+00
+          1.47985E-02         1.53080E-02        -1.38590E-02         9.29709E-01         1.18115E+00         9.29812E-01         7.69321E+00         1.00000E+00         1.13214E-03         7.69321E+00         5.40277E-01         7.15293E+00
+          1.47985E-02         1.54778E-02        -1.40233E-02         9.29707E-01         1.19182E+00         9.29812E-01         7.90344E+00         1.00000E+00         1.14237E-03         7.90344E+00         6.71384E-01         7.23206E+00
+          1.47985E-02         1.56476E-02        -1.41893E-02         9.29704E-01         1.20249E+00         9.29812E-01         8.13648E+00         1.00000E+00         1.15273E-03         8.13648E+00         8.13933E-01         7.32255E+00
+          1.47985E-02         1.58175E-02        -1.43572E-02         9.29702E-01         1.21317E+00         9.29812E-01         8.38935E+00         1.00000E+00         1.16321E-03         8.38935E+00         9.66442E-01         7.42291E+00
+          1.47985E-02         1.59873E-02        -1.45269E-02         9.29699E-01         1.22384E+00         9.29813E-01         8.65917E+00         1.00000E+00         1.17380E-03         8.65917E+00         1.12747E+00         7.53171E+00
+          1.47985E-02         1.61571E-02        -1.46984E-02         9.29697E-01         1.23451E+00         9.29813E-01         8.94316E+00         1.00000E+00         1.18451E-03         8.94316E+00         1.29562E+00         7.64755E+00
+          1.47985E-02         1.63270E-02        -1.48717E-02         9.29694E-01         1.24518E+00         9.29813E-01         9.23863E+00         1.00000E+00         1.19533E-03         9.23863E+00         1.46953E+00         7.76909E+00
+          1.47985E-02         1.64968E-02        -1.50468E-02         9.29691E-01         1.25585E+00         9.29813E-01         9.54297E+00         1.00000E+00         1.20624E-03         9.54297E+00         1.64792E+00         7.89505E+00
+          1.47985E-02         1.66666E-02        -1.52238E-02         9.29689E-01         1.26652E+00         9.29813E-01         9.85371E+00         1.00000E+00         1.21724E-03         9.85371E+00         1.82953E+00         8.02418E+00
+          1.47985E-02         1.68364E-02        -1.54025E-02         9.29686E-01         1.27719E+00         9.29814E-01         1.01685E+01         1.00000E+00         1.22832E-03         1.01685E+01         2.01316E+00         8.15530E+00
+          1.47985E-02         1.70063E-02        -1.55831E-02         9.29683E-01         1.28786E+00         9.29814E-01         1.04850E+01         1.00000E+00         1.23948E-03         1.04850E+01         2.19768E+00         8.28727E+00
+          1.47985E-02         1.71761E-02        -1.57655E-02         9.29681E-01         1.29853E+00         9.29814E-01         1.08010E+01         1.00000E+00         1.25071E-03         1.08010E+01         2.38200E+00         8.41901E+00
+          1.47985E-02         1.73459E-02        -1.59497E-02         9.29678E-01         1.30920E+00         9.29815E-01         1.11146E+01         1.00000E+00         1.26201E-03         1.11146E+01         2.56508E+00         8.54950E+00
+          1.47985E-02         1.75158E-02        -1.61357E-02         9.29675E-01         1.31987E+00         9.29815E-01         1.14237E+01         1.00000E+00         1.27336E-03         1.14237E+01         2.74597E+00         8.67777E+00
+          1.47985E-02         1.76856E-02        -1.63235E-02         9.29673E-01         1.33054E+00         9.29816E-01         1.17266E+01         1.00000E+00         1.28476E-03         1.17266E+01         2.92375E+00         8.80289E+00
+          1.47985E-02         1.78554E-02        -1.65131E-02         9.29670E-01         1.34121E+00         9.29816E-01         1.20216E+01         1.00000E+00         1.29621E-03         1.20216E+01         3.09757E+00         8.92401E+00
+          1.47985E-02         1.80252E-02        -1.67046E-02         9.29667E-01         1.35188E+00         9.29817E-01         1.23070E+01         1.00000E+00         1.30770E-03         1.23070E+01         3.26663E+00         9.04032E+00
+          1.47985E-02         1.81951E-02        -1.68978E-02         9.29664E-01         1.36255E+00         9.29818E-01         1.25813E+01         1.00000E+00         1.31921E-03         1.25813E+01         3.43022E+00         9.15106E+00
+          1.47985E-02         1.83649E-02        -1.70929E-02         9.29661E-01         1.37322E+00         9.29818E-01         1.28432E+01         1.00000E+00         1.33076E-03         1.28432E+01         3.58766E+00         9.25554E+00
+          1.47985E-02         1.85347E-02        -1.72898E-02         9.29658E-01         1.38389E+00         9.29819E-01         1.30915E+01         1.00000E+00         1.34232E-03         1.30915E+01         3.73834E+00         9.35312E+00
+          1.47985E-02         1.87045E-02        -1.74885E-02         9.29655E-01         1.39457E+00         9.29820E-01         1.33249E+01         1.00000E+00         1.35389E-03         1.33249E+01         3.88170E+00         9.44321E+00
+          1.47985E-02         1.88744E-02        -1.76890E-02         9.29652E-01         1.40524E+00         9.29821E-01         1.35425E+01         1.00000E+00         1.36547E-03         1.35425E+01         4.01726E+00         9.52527E+00
+          1.47985E-02         1.90442E-02        -1.78913E-02         9.29649E-01         1.41591E+00         9.29821E-01         1.37434E+01         1.00000E+00         1.37706E-03         1.37434E+01         4.14457E+00         9.59882E+00
+          1.47985E-02         1.92140E-02        -1.80954E-02         9.29646E-01         1.42658E+00         9.29822E-01         1.39267E+01         1.00000E+00         1.38864E-03         1.39267E+01         4.26327E+00         9.66344E+00
+          1.47985E-02         1.93839E-02        -1.83014E-02         9.29643E-01         1.43725E+00         9.29823E-01         1.40918E+01         1.00000E+00         1.40021E-03         1.40918E+01         4.37302E+00         9.71874E+00
+          1.47985E-02         1.95537E-02        -1.85091E-02         9.29640E-01         1.44792E+00         9.29824E-01         1.42380E+01         1.00000E+00         1.41177E-03         1.42380E+01         4.47356E+00         9.76440E+00
+          1.47985E-02         1.97235E-02        -1.87187E-02         9.29637E-01         1.45859E+00         9.29825E-01         1.43648E+01         1.00000E+00         1.42330E-03         1.43648E+01         4.56467E+00         9.80015E+00
+          1.47985E-02         1.98933E-02        -1.89301E-02         9.29634E-01         1.46926E+00         9.29827E-01         1.44719E+01         1.00000E+00         1.43481E-03         1.44719E+01         4.64618E+00         9.82576E+00
+          1.47985E-02         2.00632E-02        -1.91433E-02         9.29631E-01         1.47993E+00         9.29828E-01         1.45591E+01         1.00000E+00         1.44629E-03         1.45591E+01         4.71799E+00         9.84106E+00
+          1.47985E-02         2.02330E-02        -1.93583E-02         9.29628E-01         1.49060E+00         9.29829E-01         1.46259E+01         1.00000E+00         1.45773E-03         1.46259E+01         4.78003E+00         9.84592E+00
+          1.47985E-02         2.04028E-02        -1.95751E-02         9.29624E-01         1.50127E+00         9.29830E-01         1.46725E+01         1.00000E+00         1.46913E-03         1.46725E+01         4.83226E+00         9.84025E+00
+          1.47985E-02         2.05726E-02        -1.97938E-02         9.29621E-01         1.51194E+00         9.29832E-01         1.46988E+01         1.00000E+00         1.48048E-03         1.46988E+01         4.87472E+00         9.82403E+00
+          1.47985E-02         2.07425E-02        -2.00142E-02         9.29618E-01         1.52261E+00         9.29833E-01         1.47047E+01         1.00000E+00         1.49178E-03         1.47047E+01         4.90747E+00         9.79726E+00
+          1.47985E-02         2.09123E-02        -2.02365E-02         9.29615E-01         1.53328E+00         9.29835E-01         1.46906E+01         1.00000E+00         1.50302E-03         1.46906E+01         4.93060E+00         9.75999E+00
+          1.47985E-02         2.10821E-02        -2.04606E-02         9.29611E-01         1.54395E+00         9.29836E-01         1.46566E+01         1.00000E+00         1.51420E-03         1.46566E+01         4.94427E+00         9.71231E+00
+          1.47985E-02         2.12520E-02        -2.06865E-02         9.29608E-01         1.55462E+00         9.29838E-01         1.46030E+01         1.00000E+00         1.52532E-03         1.46030E+01         4.94865E+00         9.65435E+00
+          1.47985E-02         2.14218E-02        -2.09142E-02         9.29605E-01         1.56529E+00         9.29840E-01         1.45302E+01         1.00000E+00         1.53636E-03         1.45302E+01         4.94394E+00         9.58630E+00
+          1.47985E-02         2.15916E-02        -2.11437E-02         9.29601E-01         1.57596E+00         9.29842E-01         1.44387E+01         1.00000E+00         1.54733E-03         1.44387E+01         4.93038E+00         9.50834E+00
+          1.47985E-02         2.17614E-02        -2.13750E-02         9.29598E-01         1.58664E+00         9.29843E-01         1.43290E+01         1.00000E+00         1.55822E-03         1.43290E+01         4.90824E+00         9.42073E+00
+          1.47985E-02         2.19313E-02        -2.16081E-02         9.29594E-01         1.59731E+00         9.29845E-01         1.42016E+01         1.00000E+00         1.56902E-03         1.42016E+01         4.87782E+00         9.32375E+00
+          1.47985E-02         2.21011E-02        -2.18431E-02         9.29591E-01         1.60798E+00         9.29847E-01         1.40571E+01         1.00000E+00         1.57973E-03         1.40571E+01         4.83942E+00         9.21769E+00
+          1.47985E-02         2.22709E-02        -2.20799E-02         9.29587E-01         1.61865E+00         9.29849E-01         1.38963E+01         1.00000E+00         1.59035E-03         1.38963E+01         4.79339E+00         9.10289E+00
+          1.47985E-02         2.24407E-02        -2.23185E-02         9.29584E-01         1.62932E+00         9.29852E-01         1.37198E+01         1.00000E+00         1.60087E-03         1.37198E+01         4.74008E+00         8.97973E+00
+          1.47985E-02         2.26106E-02        -2.25589E-02         9.29580E-01         1.63999E+00         9.29854E-01         1.35285E+01         1.00000E+00         1.61128E-03         1.35285E+01         4.67987E+00         8.84859E+00
+          1.47985E-02         2.27804E-02        -2.28011E-02         9.29577E-01         1.65066E+00         9.29856E-01         1.33230E+01         1.00000E+00         1.62159E-03         1.33230E+01         4.61313E+00         8.70989E+00
+          1.47985E-02         2.29502E-02        -2.30451E-02         9.29573E-01         1.66133E+00         9.29859E-01         1.31043E+01         1.00000E+00         1.63178E-03         1.31043E+01         4.54026E+00         8.56406E+00
+          1.47985E-02         2.31201E-02        -2.32909E-02         9.29569E-01         1.67200E+00         9.29861E-01         1.28732E+01         1.00000E+00         1.64186E-03         1.28732E+01         4.46168E+00         8.41155E+00
+          1.47985E-02         2.32899E-02        -2.35386E-02         9.29566E-01         1.68267E+00         9.29864E-01         1.26306E+01         1.00000E+00         1.65182E-03         1.26306E+01         4.37779E+00         8.25285E+00
+          1.47985E-02         2.34597E-02        -2.37880E-02         9.29562E-01         1.69334E+00         9.29866E-01         1.23775E+01         1.00000E+00         1.66165E-03         1.23775E+01         4.28903E+00         8.08845E+00
+          1.47985E-02         2.36295E-02        -2.40393E-02         9.29558E-01         1.70401E+00         9.29869E-01         1.21146E+01         1.00000E+00         1.67135E-03         1.21146E+01         4.19580E+00         7.91884E+00
+          1.47985E-02         2.37994E-02        -2.42924E-02         9.29555E-01         1.71468E+00         9.29872E-01         1.18431E+01         1.00000E+00         1.68091E-03         1.18431E+01         4.09854E+00         7.74454E+00
+          1.47985E-02         2.39692E-02        -2.45473E-02         9.29551E-01         1.72535E+00         9.29875E-01         1.15638E+01         1.00000E+00         1.69034E-03         1.15638E+01         3.99767E+00         7.56609E+00
+          1.47985E-02         2.41390E-02        -2.48040E-02         9.29547E-01         1.73602E+00         9.29878E-01         1.12776E+01         1.00000E+00         1.69963E-03         1.12776E+01         3.89361E+00         7.38400E+00
+          1.47985E-02         2.43088E-02        -2.50626E-02         9.29543E-01         1.74669E+00         9.29881E-01         1.09856E+01         1.00000E+00         1.70877E-03         1.09856E+01         3.78678E+00         7.19882E+00
+          1.47985E-02         2.44787E-02        -2.53229E-02         9.29539E-01         1.75736E+00         9.29884E-01         1.06887E+01         1.00000E+00         1.71776E-03         1.06887E+01         3.67760E+00         7.01108E+00
+          1.47985E-02         2.46485E-02        -2.55851E-02         9.29535E-01         1.76804E+00         9.29887E-01         1.03878E+01         1.00000E+00         1.72660E-03         1.03878E+01         3.56647E+00         6.82134E+00
+          1.47985E-02         2.48183E-02        -2.58490E-02         9.29532E-01         1.77871E+00         9.29891E-01         1.00839E+01         1.00000E+00         1.73528E-03         1.00839E+01         3.45379E+00         6.63013E+00
+          1.47985E-02         2.49882E-02        -2.61148E-02         9.29528E-01         1.78938E+00         9.29894E-01         9.77793E+00         1.00000E+00         1.74379E-03         9.77793E+00         3.33994E+00         6.43799E+00
+          1.47985E-02         2.51580E-02        -2.63824E-02         9.29524E-01         1.80005E+00         9.29898E-01         9.47077E+00         1.00000E+00         1.75215E-03         9.47077E+00         3.22532E+00         6.24545E+00
+          1.47985E-02         2.53278E-02        -2.66518E-02         9.29520E-01         1.81072E+00         9.29902E-01         9.16331E+00         1.00000E+00         1.76033E-03         9.16331E+00         3.11027E+00         6.05304E+00
+          1.47985E-02         2.54976E-02        -2.69231E-02         9.29516E-01         1.82139E+00         9.29905E-01         8.85644E+00         1.00000E+00         1.76834E-03         8.85644E+00         2.99516E+00         5.86128E+00
+          1.47985E-02         2.56675E-02        -2.71961E-02         9.29512E-01         1.83206E+00         9.29909E-01         8.55099E+00         1.00000E+00         1.77618E-03         8.55099E+00         2.88032E+00         5.67067E+00
+          1.47985E-02         2.58373E-02        -2.74709E-02         9.29508E-01         1.84273E+00         9.29913E-01         8.24780E+00         1.00000E+00         1.78384E-03         8.24780E+00         2.76607E+00         5.48172E+00
+          1.47985E-02         2.60071E-02        -2.77476E-02         9.29503E-01         1.85340E+00         9.29917E-01         7.94764E+00         1.00000E+00         1.79132E-03         7.94764E+00         2.65274E+00         5.29490E+00
+          1.47985E-02         2.61769E-02        -2.80261E-02         9.29499E-01         1.86407E+00         9.29922E-01         7.65129E+00         1.00000E+00         1.79862E-03         7.65129E+00         2.54060E+00         5.11069E+00
+          1.49683E-02         8.72665E-04        -6.68030E-03         9.40488E-01         2.74155E-01         9.40512E-01         2.83272E+02         1.00000E+00         8.62303E-04         2.83272E+02         1.22664E+02         1.60608E+02
+          1.49683E-02         1.04249E-03        -6.69052E-03         9.40488E-01         2.84826E-01         9.40512E-01         2.78297E+02         1.00000E+00         8.56514E-04         2.78297E+02         1.20627E+02         1.57670E+02
+          1.49683E-02         1.21232E-03        -6.70254E-03         9.40488E-01         2.95496E-01         9.40512E-01         2.73212E+02         1.00000E+00         8.50642E-04         2.73212E+02         1.18540E+02         1.54672E+02
+          1.49683E-02         1.38215E-03        -6.71638E-03         9.40488E-01         3.06167E-01         9.40512E-01         2.68027E+02         1.00000E+00         8.44699E-04         2.68027E+02         1.16406E+02         1.51620E+02
+          1.49683E-02         1.55197E-03        -6.73204E-03         9.40487E-01         3.16838E-01         9.40511E-01         2.62748E+02         1.00000E+00         8.38699E-04         2.62748E+02         1.14229E+02         1.48519E+02
+          1.49683E-02         1.72180E-03        -6.74950E-03         9.40487E-01         3.27508E-01         9.40511E-01         2.57383E+02         1.00000E+00         8.32654E-04         2.57383E+02         1.12010E+02         1.45373E+02
+          1.49683E-02         1.89163E-03        -6.76878E-03         9.40487E-01         3.38179E-01         9.40511E-01         2.51942E+02         1.00000E+00         8.26578E-04         2.51942E+02         1.09753E+02         1.42189E+02
+          1.49683E-02         2.06146E-03        -6.78987E-03         9.40487E-01         3.48849E-01         9.40511E-01         2.46431E+02         1.00000E+00         8.20485E-04         2.46431E+02         1.07462E+02         1.38969E+02
+          1.49683E-02         2.23128E-03        -6.81277E-03         9.40486E-01         3.59520E-01         9.40511E-01         2.40859E+02         1.00000E+00         8.14387E-04         2.40859E+02         1.05138E+02         1.35721E+02
+          1.49683E-02         2.40111E-03        -6.83748E-03         9.40486E-01         3.70190E-01         9.40511E-01         2.35234E+02         1.00000E+00         8.08299E-04         2.35234E+02         1.02785E+02         1.32449E+02
+          1.49683E-02         2.57094E-03        -6.86400E-03         9.40485E-01         3.80861E-01         9.40510E-01         2.29564E+02         1.00000E+00         8.02232E-04         2.29564E+02         1.00407E+02         1.29157E+02
+          1.49683E-02         2.74077E-03        -6.89234E-03         9.40485E-01         3.91532E-01         9.40510E-01         2.23857E+02         1.00000E+00         7.96200E-04         2.23857E+02         9.80059E+01         1.25851E+02
+          1.49683E-02         2.91059E-03        -6.92249E-03         9.40485E-01         4.02202E-01         9.40510E-01         2.18121E+02         1.00000E+00         7.90216E-04         2.18121E+02         9.55853E+01         1.22536E+02
+          1.49683E-02         3.08042E-03        -6.95445E-03         9.40484E-01         4.12873E-01         9.40510E-01         2.12364E+02         1.00000E+00         7.84292E-04         2.12364E+02         9.31482E+01         1.19216E+02
+          1.49683E-02         3.25025E-03        -6.98822E-03         9.40484E-01         4.23543E-01         9.40509E-01         2.06593E+02         1.00000E+00         7.78441E-04         2.06593E+02         9.06978E+01         1.15896E+02
+          1.49683E-02         3.42008E-03        -7.02381E-03         9.40483E-01         4.34214E-01         9.40509E-01         2.00817E+02         1.00000E+00         7.72674E-04         2.00817E+02         8.82372E+01         1.12580E+02
+          1.49683E-02         3.58990E-03        -7.06120E-03         9.40482E-01         4.44884E-01         9.40509E-01         1.95043E+02         1.00000E+00         7.67004E-04         1.95043E+02         8.57695E+01         1.09273E+02
+          1.49683E-02         3.75973E-03        -7.10041E-03         9.40482E-01         4.55555E-01         9.40509E-01         1.89277E+02         1.00000E+00         7.61441E-04         1.89277E+02         8.32977E+01         1.05980E+02
+          1.49683E-02         3.92956E-03        -7.14143E-03         9.40481E-01         4.66225E-01         9.40508E-01         1.83529E+02         1.00000E+00         7.55997E-04         1.83529E+02         8.08250E+01         1.02704E+02
+          1.49683E-02         4.09939E-03        -7.18426E-03         9.40481E-01         4.76896E-01         9.40508E-01         1.77804E+02         1.00000E+00         7.50683E-04         1.77804E+02         7.83542E+01         9.94496E+01
+          1.49683E-02         4.26921E-03        -7.22891E-03         9.40480E-01         4.87567E-01         9.40508E-01         1.72109E+02         1.00000E+00         7.45509E-04         1.72109E+02         7.58884E+01         9.62211E+01
+          1.49683E-02         4.43904E-03        -7.27536E-03         9.40479E-01         4.98237E-01         9.40507E-01         1.66452E+02         1.00000E+00         7.40484E-04         1.66452E+02         7.34305E+01         9.30219E+01
+          1.49683E-02         4.60887E-03        -7.32363E-03         9.40479E-01         5.08908E-01         9.40507E-01         1.60839E+02         1.00000E+00         7.35619E-04         1.60839E+02         7.09833E+01         8.98559E+01
+          1.49683E-02         4.77869E-03        -7.37371E-03         9.40478E-01         5.19578E-01         9.40507E-01         1.55276E+02         1.00000E+00         7.30922E-04         1.55276E+02         6.85498E+01         8.67265E+01
+          1.49683E-02         4.94852E-03        -7.42560E-03         9.40477E-01         5.30249E-01         9.40506E-01         1.49770E+02         1.00000E+00         7.26402E-04         1.49770E+02         6.61327E+01         8.36370E+01
+          1.49683E-02         5.11835E-03        -7.47931E-03         9.40476E-01         5.40919E-01         9.40506E-01         1.44325E+02         1.00000E+00         7.22066E-04         1.44325E+02         6.37347E+01         8.05907E+01
+          1.49683E-02         5.28818E-03        -7.53483E-03         9.40475E-01         5.51590E-01         9.40506E-01         1.38949E+02         1.00000E+00         7.17924E-04         1.38949E+02         6.13585E+01         7.75906E+01
+          1.49683E-02         5.45800E-03        -7.59215E-03         9.40474E-01         5.62261E-01         9.40505E-01         1.33646E+02         1.00000E+00         7.13981E-04         1.33646E+02         5.90065E+01         7.46395E+01
+          1.49683E-02         5.62783E-03        -7.65129E-03         9.40474E-01         5.72931E-01         9.40505E-01         1.28421E+02         1.00000E+00         7.10244E-04         1.28421E+02         5.66814E+01         7.17401E+01
+          1.49683E-02         5.79766E-03        -7.71225E-03         9.40473E-01         5.83602E-01         9.40504E-01         1.23280E+02         1.00000E+00         7.06720E-04         1.23280E+02         5.43854E+01         6.88949E+01
+          1.49683E-02         5.96749E-03        -7.77501E-03         9.40472E-01         5.94272E-01         9.40504E-01         1.18227E+02         1.00000E+00         7.03414E-04         1.18227E+02         5.21210E+01         6.61063E+01
+          1.49683E-02         6.13731E-03        -7.83959E-03         9.40471E-01         6.04943E-01         9.40503E-01         1.13267E+02         1.00000E+00         7.00332E-04         1.13267E+02         4.98904E+01         6.33764E+01
+          1.49683E-02         6.30714E-03        -7.90598E-03         9.40470E-01         6.15613E-01         9.40503E-01         1.08403E+02         1.00000E+00         6.97478E-04         1.08403E+02         4.76957E+01         6.07071E+01
+          1.49683E-02         6.47697E-03        -7.97418E-03         9.40469E-01         6.26284E-01         9.40503E-01         1.03639E+02         1.00000E+00         6.94857E-04         1.03639E+02         4.55389E+01         5.81003E+01
+          1.49683E-02         6.64680E-03        -8.04419E-03         9.40468E-01         6.36955E-01         9.40502E-01         9.89796E+01         1.00000E+00         6.92472E-04         9.89796E+01         4.34221E+01         5.55575E+01
+          1.49683E-02         6.81662E-03        -8.11601E-03         9.40467E-01         6.47625E-01         9.40502E-01         9.44273E+01         1.00000E+00         6.90326E-04         9.44273E+01         4.13470E+01         5.30803E+01
+          1.49683E-02         6.98645E-03        -8.18965E-03         9.40466E-01         6.58296E-01         9.40501E-01         8.99853E+01         1.00000E+00         6.88423E-04         8.99853E+01         3.93154E+01         5.06699E+01
+          1.49683E-02         7.15628E-03        -8.26510E-03         9.40464E-01         6.68966E-01         9.40501E-01         8.56563E+01         1.00000E+00         6.86765E-04         8.56563E+01         3.73289E+01         4.83274E+01
+          1.49683E-02         7.32611E-03        -8.34236E-03         9.40463E-01         6.79637E-01         9.40500E-01         8.14428E+01         1.00000E+00         6.85355E-04         8.14428E+01         3.53891E+01         4.60537E+01
+          1.49683E-02         7.49593E-03        -8.42143E-03         9.40462E-01         6.90307E-01         9.40500E-01         7.73471E+01         1.00000E+00         6.84194E-04         7.73471E+01         3.34974E+01         4.38496E+01
+          1.49683E-02         7.66576E-03        -8.50232E-03         9.40461E-01         7.00978E-01         9.40499E-01         7.33709E+01         1.00000E+00         6.83282E-04         7.33709E+01         3.16551E+01         4.17158E+01
+          1.49683E-02         7.83559E-03        -8.58502E-03         9.40460E-01         7.11649E-01         9.40499E-01         6.95160E+01         1.00000E+00         6.82623E-04         6.95160E+01         2.98633E+01         3.96527E+01
+          1.49683E-02         8.00542E-03        -8.66953E-03         9.40458E-01         7.22319E-01         9.40498E-01         6.57837E+01         1.00000E+00         6.82215E-04         6.57837E+01         2.81232E+01         3.76606E+01
+          1.49683E-02         8.17524E-03        -8.75585E-03         9.40457E-01         7.32990E-01         9.40498E-01         6.21752E+01         1.00000E+00         6.82060E-04         6.21752E+01         2.64356E+01         3.57396E+01
+          1.49683E-02         8.34507E-03        -8.84398E-03         9.40456E-01         7.43660E-01         9.40497E-01         5.86913E+01         1.00000E+00         6.82157E-04         5.86913E+01         2.48015E+01         3.38897E+01
+          1.49683E-02         8.51490E-03        -8.93393E-03         9.40454E-01         7.54331E-01         9.40497E-01         5.53325E+01         1.00000E+00         6.82506E-04         5.53325E+01         2.32216E+01         3.21109E+01
+          1.49683E-02         8.68473E-03        -9.02568E-03         9.40453E-01         7.65001E-01         9.40496E-01         5.20993E+01         1.00000E+00         6.83107E-04         5.20993E+01         2.16965E+01         3.04028E+01
+          1.49683E-02         8.85455E-03        -9.11926E-03         9.40452E-01         7.75672E-01         9.40496E-01         4.89918E+01         1.00000E+00         6.83959E-04         4.89918E+01         2.02267E+01         2.87652E+01
+          1.49683E-02         9.02438E-03        -9.21464E-03         9.40450E-01         7.86343E-01         9.40495E-01         4.60098E+01         1.00000E+00         6.85061E-04         4.60098E+01         1.88125E+01         2.71974E+01
+          1.49683E-02         9.19421E-03        -9.31183E-03         9.40449E-01         7.97013E-01         9.40495E-01         4.31530E+01         1.00000E+00         6.86411E-04         4.31530E+01         1.74542E+01         2.56988E+01
+          1.49683E-02         9.36403E-03        -9.41084E-03         9.40447E-01         8.07684E-01         9.40494E-01         4.04207E+01         1.00000E+00         6.88009E-04         4.04207E+01         1.61520E+01         2.42687E+01
+          1.49683E-02         9.53386E-03        -9.51166E-03         9.40446E-01         8.18354E-01         9.40494E-01         3.78122E+01         1.00000E+00         6.89853E-04         3.78122E+01         1.49060E+01         2.29063E+01
+          1.49683E-02         9.70369E-03        -9.61429E-03         9.40444E-01         8.29025E-01         9.40493E-01         3.53265E+01         1.00000E+00         6.91940E-04         3.53265E+01         1.37160E+01         2.16105E+01
+          1.49683E-02         9.87352E-03        -9.71873E-03         9.40443E-01         8.39695E-01         9.40493E-01         3.29623E+01         1.00000E+00         6.94270E-04         3.29623E+01         1.25819E+01         2.03804E+01
+          1.49683E-02         1.00433E-02        -9.82499E-03         9.40441E-01         8.50366E-01         9.40492E-01         3.07183E+01         1.00000E+00         6.96839E-04         3.07183E+01         1.15034E+01         1.92149E+01
+          1.49683E-02         1.02132E-02        -9.93306E-03         9.40439E-01         8.61037E-01         9.40492E-01         2.85928E+01         1.00000E+00         6.99646E-04         2.85928E+01         1.04802E+01         1.81127E+01
+          1.49683E-02         1.03830E-02        -1.00429E-02         9.40438E-01         8.71707E-01         9.40491E-01         2.65842E+01         1.00000E+00         7.02688E-04         2.65842E+01         9.51166E+00         1.70725E+01
+          1.49683E-02         1.05528E-02        -1.01546E-02         9.40436E-01         8.82378E-01         9.40491E-01         2.46904E+01         1.00000E+00         7.05962E-04         2.46904E+01         8.59735E+00         1.60930E+01
+          1.49683E-02         1.07227E-02        -1.02681E-02         9.40434E-01         8.93048E-01         9.40490E-01         2.29094E+01         1.00000E+00         7.09467E-04         2.29094E+01         7.73655E+00         1.51728E+01
+          1.49683E-02         1.08925E-02        -1.03834E-02         9.40433E-01         9.03719E-01         9.40490E-01         2.12389E+01         1.00000E+00         7.13198E-04         2.12389E+01         6.92850E+00         1.43104E+01
+          1.49683E-02         1.10623E-02        -1.05006E-02         9.40431E-01         9.14389E-01         9.40490E-01         1.96767E+01         1.00000E+00         7.17153E-04         1.96767E+01         6.17237E+00         1.35043E+01
+          1.49683E-02         1.12321E-02        -1.06195E-02         9.40429E-01         9.25060E-01         9.40489E-01         1.82201E+01         1.00000E+00         7.21329E-04         1.82201E+01         5.46721E+00         1.27529E+01
+          1.49683E-02         1.14020E-02        -1.07403E-02         9.40427E-01         9.35731E-01         9.40489E-01         1.68665E+01         1.00000E+00         7.25723E-04         1.68665E+01         4.81203E+00         1.20545E+01
+          1.49683E-02         1.15718E-02        -1.08628E-02         9.40426E-01         9.46401E-01         9.40488E-01         1.56133E+01         1.00000E+00         7.30331E-04         1.56133E+01         4.20575E+00         1.14075E+01
+          1.49683E-02         1.17416E-02        -1.09872E-02         9.40424E-01         9.57072E-01         9.40488E-01         1.44576E+01         1.00000E+00         7.35150E-04         1.44576E+01         3.64722E+00         1.08103E+01
+          1.49683E-02         1.19114E-02        -1.11134E-02         9.40422E-01         9.67742E-01         9.40487E-01         1.33964E+01         1.00000E+00         7.40176E-04         1.33964E+01         3.13521E+00         1.02611E+01
+          1.49683E-02         1.20813E-02        -1.12414E-02         9.40420E-01         9.78413E-01         9.40487E-01         1.24267E+01         1.00000E+00         7.45407E-04         1.24267E+01         2.66846E+00         9.75826E+00
+          1.49683E-02         1.22511E-02        -1.13712E-02         9.40418E-01         9.89083E-01         9.40487E-01         1.15455E+01         1.00000E+00         7.50837E-04         1.15455E+01         2.24563E+00         9.29991E+00
+          1.49683E-02         1.24209E-02        -1.15029E-02         9.40416E-01         9.99754E-01         9.40486E-01         1.07497E+01         1.00000E+00         7.56463E-04         1.07497E+01         1.86533E+00         8.88435E+00
+          1.49683E-02         1.25908E-02        -1.16363E-02         9.40414E-01         1.01042E+00         9.40486E-01         1.00359E+01         1.00000E+00         7.62282E-04         1.00359E+01         1.52613E+00         8.50980E+00
+          1.49683E-02         1.27606E-02        -1.17715E-02         9.40412E-01         1.02110E+00         9.40486E-01         9.40103E+00         1.00000E+00         7.68289E-04         9.40103E+00         1.22655E+00         8.17448E+00
+          1.49683E-02         1.29304E-02        -1.19086E-02         9.40410E-01         1.03177E+00         9.40485E-01         8.84170E+00         1.00000E+00         7.74479E-04         8.84170E+00         9.65072E-01         7.87663E+00
+          1.49683E-02         1.31002E-02        -1.20475E-02         9.40408E-01         1.04244E+00         9.40485E-01         8.35463E+00         1.00000E+00         7.80850E-04         8.35463E+00         7.40154E-01         7.61447E+00
+          1.49683E-02         1.32701E-02        -1.21882E-02         9.40406E-01         1.05311E+00         9.40485E-01         7.93646E+00         1.00000E+00         7.87395E-04         7.93646E+00         5.50217E-01         7.38624E+00
+          1.49683E-02         1.34399E-02        -1.23307E-02         9.40404E-01         1.06378E+00         9.40484E-01         7.58385E+00         1.00000E+00         7.94112E-04         7.58385E+00         3.93661E-01         7.19019E+00
+          1.49683E-02         1.36097E-02        -1.24750E-02         9.40401E-01         1.07445E+00         9.40484E-01         7.29344E+00         1.00000E+00         8.00995E-04         7.29344E+00         2.68866E-01         7.02457E+00
+          1.49683E-02         1.37795E-02        -1.26211E-02         9.40399E-01         1.08512E+00         9.40484E-01         7.06187E+00         1.00000E+00         8.08039E-04         7.06187E+00         1.74199E-01         6.88767E+00
+          1.49683E-02         1.39494E-02        -1.27691E-02         9.40397E-01         1.09579E+00         9.40484E-01         6.88579E+00         1.00000E+00         8.15241E-04         6.88579E+00         1.08017E-01         6.77778E+00
+          1.49683E-02         1.41192E-02        -1.29188E-02         9.40395E-01         1.10646E+00         9.40483E-01         6.76189E+00         1.00000E+00         8.22595E-04         6.76189E+00         6.86723E-02         6.69321E+00
+          1.49683E-02         1.42890E-02        -1.30704E-02         9.40392E-01         1.11713E+00         9.40483E-01         6.68684E+00         1.00000E+00         8.30096E-04         6.68684E+00         5.45155E-02         6.63232E+00
+          1.49683E-02         1.44589E-02        -1.32238E-02         9.40390E-01         1.12780E+00         9.40483E-01         6.65738E+00         1.00000E+00         8.37740E-04         6.65738E+00         6.39025E-02         6.59348E+00
+          1.49683E-02         1.46287E-02        -1.33789E-02         9.40388E-01         1.13847E+00         9.40483E-01         6.67027E+00         1.00000E+00         8.45521E-04         6.67027E+00         9.51967E-02         6.57507E+00
+          1.49683E-02         1.47985E-02        -1.35359E-02         9.40386E-01         1.14914E+00         9.40483E-01         6.72232E+00         1.00000E+00         8.53435E-04         6.72232E+00         1.46774E-01         6.57554E+00
+          1.49683E-02         1.49683E-02        -1.36948E-02         9.40383E-01         1.15981E+00         9.40483E-01         6.81038E+00         1.00000E+00         8.61476E-04         6.81038E+00         2.17027E-01         6.59335E+00
+          1.49683E-02         1.51382E-02        -1.38554E-02         9.40381E-01         1.17048E+00         9.40483E-01         6.93135E+00         1.00000E+00         8.69639E-04         6.93135E+00         3.04368E-01         6.62699E+00
+          1.49683E-02         1.53080E-02        -1.40178E-02         9.40378E-01         1.18115E+00         9.40483E-01         7.08223E+00         1.00000E+00         8.77920E-04         7.08223E+00         4.07235E-01         6.67499E+00
+          1.49683E-02         1.54778E-02        -1.41821E-02         9.40376E-01         1.19182E+00         9.40483E-01         7.26002E+00         1.00000E+00         8.86312E-04         7.26002E+00         5.24090E-01         6.73593E+00
+          1.49683E-02         1.56476E-02        -1.43481E-02         9.40373E-01         1.20249E+00         9.40483E-01         7.46185E+00         1.00000E+00         8.94812E-04         7.46185E+00         6.53429E-01         6.80842E+00
+          1.49683E-02         1.58175E-02        -1.45160E-02         9.40371E-01         1.21317E+00         9.40483E-01         7.68489E+00         1.00000E+00         9.03413E-04         7.68489E+00         7.93782E-01         6.89111E+00
+          1.49683E-02         1.59873E-02        -1.46857E-02         9.40368E-01         1.22384E+00         9.40483E-01         7.92640E+00         1.00000E+00         9.12110E-04         7.92640E+00         9.43715E-01         6.98269E+00
+          1.49683E-02         1.61571E-02        -1.48572E-02         9.40366E-01         1.23451E+00         9.40483E-01         8.18372E+00         1.00000E+00         9.20899E-04         8.18372E+00         1.10184E+00         7.08188E+00
+          1.49683E-02         1.63270E-02        -1.50305E-02         9.40363E-01         1.24518E+00         9.40483E-01         8.45427E+00         1.00000E+00         9.29774E-04         8.45427E+00         1.26679E+00         7.18747E+00
+          1.49683E-02         1.64968E-02        -1.52057E-02         9.40361E-01         1.25585E+00         9.40483E-01         8.73556E+00         1.00000E+00         9.38730E-04         8.73556E+00         1.43728E+00         7.29828E+00
+          1.49683E-02         1.66666E-02        -1.53826E-02         9.40358E-01         1.26652E+00         9.40484E-01         9.02520E+00         1.00000E+00         9.47762E-04         9.02520E+00         1.61204E+00         7.41316E+00
+          1.49683E-02         1.68364E-02        -1.55613E-02         9.40355E-01         1.27719E+00         9.40484E-01         9.32089E+00         1.00000E+00         9.56864E-04         9.32089E+00         1.78986E+00         7.53103E+00
+          1.49683E-02         1.70063E-02        -1.57419E-02         9.40352E-01         1.28786E+00         9.40484E-01         9.62043E+00         1.00000E+00         9.66032E-04         9.62043E+00         1.96960E+00         7.65083E+00
+          1.49683E-02         1.71761E-02        -1.59243E-02         9.40350E-01         1.29853E+00         9.40485E-01         9.92170E+00         1.00000E+00         9.75261E-04         9.92170E+00         2.15013E+00         7.77158E+00
+          1.49683E-02         1.73459E-02        -1.61085E-02         9.40347E-01         1.30920E+00         9.40485E-01         1.02227E+01         1.00000E+00         9.84546E-04         1.02227E+01         2.33041E+00         7.89230E+00
+          1.49683E-02         1.75158E-02        -1.62945E-02         9.40344E-01         1.31987E+00         9.40485E-01         1.05215E+01         1.00000E+00         9.93881E-04         1.05215E+01         2.50946E+00         8.01209E+00
+          1.49683E-02         1.76856E-02        -1.64823E-02         9.40341E-01         1.33054E+00         9.40486E-01         1.08164E+01         1.00000E+00         1.00326E-03         1.08164E+01         2.68632E+00         8.13009E+00
+          1.49683E-02         1.78554E-02        -1.66719E-02         9.40339E-01         1.34121E+00         9.40486E-01         1.11056E+01         1.00000E+00         1.01269E-03         1.11056E+01         2.86011E+00         8.24548E+00
+          1.49683E-02         1.80252E-02        -1.68634E-02         9.40336E-01         1.35188E+00         9.40487E-01         1.13875E+01         1.00000E+00         1.02215E-03         1.13875E+01         3.03002E+00         8.35750E+00
+          1.49683E-02         1.81951E-02        -1.70566E-02         9.40333E-01         1.36255E+00         9.40487E-01         1.16607E+01         1.00000E+00         1.03164E-03         1.16607E+01         3.19527E+00         8.46541E+00
+          1.49683E-02         1.83649E-02        -1.72517E-02         9.40330E-01         1.37322E+00         9.40488E-01         1.19237E+01         1.00000E+00         1.04116E-03         1.19237E+01         3.35516E+00         8.56855E+00
+          1.49683E-02         1.85347E-02        -1.74486E-02         9.40327E-01         1.38389E+00         9.40489E-01         1.21753E+01         1.00000E+00         1.05070E-03         1.21753E+01         3.50904E+00         8.66628E+00
+          1.49683E-02         1.87045E-02        -1.76473E-02         9.40324E-01         1.39457E+00         9.40490E-01         1.24143E+01         1.00000E+00         1.06026E-03         1.24143E+01         3.65631E+00         8.75801E+00
+          1.49683E-02         1.88744E-02        -1.78478E-02         9.40321E-01         1.40524E+00         9.40490E-01         1.26397E+01         1.00000E+00         1.06984E-03         1.26397E+01         3.79644E+00         8.84322E+00
+          1.49683E-02         1.90442E-02        -1.80501E-02         9.40318E-01         1.41591E+00         9.40491E-01         1.28504E+01         1.00000E+00         1.07942E-03         1.28504E+01         3.92895E+00         8.92141E+00
+          1.49683E-02         1.92140E-02        -1.82542E-02         9.40315E-01         1.42658E+00         9.40492E-01         1.30455E+01         1.00000E+00         1.08901E-03         1.30455E+01         4.05342E+00         8.99212E+00
+          1.49683E-02         1.93839E-02        -1.84602E-02         9.40312E-01         1.43725E+00         9.40493E-01         1.32244E+01         1.00000E+00         1.09860E-03         1.32244E+01         4.16948E+00         9.05497E+00
+          1.49683E-02         1.95537E-02        -1.86679E-02         9.40309E-01         1.44792E+00         9.40494E-01         1.33864E+01         1.00000E+00         1.10820E-03         1.33864E+01         4.27682E+00         9.10958E+00
+          1.49683E-02         1.97235E-02        -1.88775E-02         9.40306E-01         1.45859E+00         9.40495E-01         1.35308E+01         1.00000E+00         1.11778E-03         1.35308E+01         4.37517E+00         9.15566E+00
+          1.49683E-02         1.98933E-02        -1.90889E-02         9.40302E-01         1.46926E+00         9.40496E-01         1.36573E+01         1.00000E+00         1.12735E-03         1.36573E+01         4.46433E+00         9.19293E+00
+          1.49683E-02         2.00632E-02        -1.93021E-02         9.40299E-01         1.47993E+00         9.40497E-01         1.37653E+01         1.00000E+00         1.13691E-03         1.37653E+01         4.54413E+00         9.22116E+00
+          1.49683E-02         2.02330E-02        -1.95171E-02         9.40296E-01         1.49060E+00         9.40499E-01         1.38546E+01         1.00000E+00         1.14646E-03         1.38546E+01         4.61447E+00         9.24016E+00
+          1.49683E-02         2.04028E-02        -1.97339E-02         9.40293E-01         1.50127E+00         9.40500E-01         1.39251E+01         1.00000E+00         1.15598E-03         1.39251E+01         4.67527E+00         9.24980E+00
+          1.49683E-02         2.05726E-02        -1.99526E-02         9.40289E-01         1.51194E+00         9.40501E-01         1.39765E+01         1.00000E+00         1.16547E-03         1.39765E+01         4.72651E+00         9.24998E+00
+          1.49683E-02         2.07425E-02        -2.01730E-02         9.40286E-01         1.52261E+00         9.40503E-01         1.40088E+01         1.00000E+00         1.17494E-03         1.40088E+01         4.76823E+00         9.24062E+00
+          1.49683E-02         2.09123E-02        -2.03953E-02         9.40283E-01         1.53328E+00         9.40504E-01         1.40222E+01         1.00000E+00         1.18437E-03         1.40222E+01         4.80047E+00         9.22171E+00
+          1.49683E-02         2.10821E-02        -2.06194E-02         9.40279E-01         1.54395E+00         9.40506E-01         1.40166E+01         1.00000E+00         1.19377E-03         1.40166E+01         4.82333E+00         9.19326E+00
+          1.49683E-02         2.12520E-02        -2.08453E-02         9.40276E-01         1.55462E+00         9.40507E-01         1.39923E+01         1.00000E+00         1.20312E-03         1.39923E+01         4.83696E+00         9.15532E+00
+          1.49683E-02         2.14218E-02        -2.10730E-02         9.40273E-01         1.56529E+00         9.40509E-01         1.39495E+01         1.00000E+00         1.21243E-03         1.39495E+01         4.84153E+00         9.10798E+00
+          1.49683E-02         2.15916E-02        -2.13025E-02         9.40269E-01         1.57596E+00         9.40511E-01         1.38886E+01         1.00000E+00         1.22169E-03         1.38886E+01         4.83723E+00         9.05135E+00
+          1.49683E-02         2.17614E-02        -2.15338E-02         9.40266E-01         1.58664E+00         9.40512E-01         1.38099E+01         1.00000E+00         1.23091E-03         1.38099E+01         4.82430E+00         8.98560E+00
+          1.49683E-02         2.19313E-02        -2.17669E-02         9.40262E-01         1.59731E+00         9.40514E-01         1.37139E+01         1.00000E+00         1.24006E-03         1.37139E+01         4.80299E+00         8.91091E+00
+          1.49683E-02         2.21011E-02        -2.20019E-02         9.40259E-01         1.60798E+00         9.40516E-01         1.36011E+01         1.00000E+00         1.24916E-03         1.36011E+01         4.77360E+00         8.82749E+00
+          1.49683E-02         2.22709E-02        -2.22387E-02         9.40255E-01         1.61865E+00         9.40518E-01         1.34720E+01         1.00000E+00         1.25819E-03         1.34720E+01         4.73643E+00         8.73559E+00
+          1.49683E-02         2.24407E-02        -2.24773E-02         9.40252E-01         1.62932E+00         9.40520E-01         1.33273E+01         1.00000E+00         1.26716E-03         1.33273E+01         4.69180E+00         8.63549E+00
+          1.49683E-02         2.26106E-02        -2.27176E-02         9.40248E-01         1.63999E+00         9.40522E-01         1.31676E+01         1.00000E+00         1.27606E-03         1.31676E+01         4.64007E+00         8.52749E+00
+          1.49683E-02         2.27804E-02        -2.29599E-02         9.40244E-01         1.65066E+00         9.40525E-01         1.29935E+01         1.00000E+00         1.28488E-03         1.29935E+01         4.58159E+00         8.41191E+00
+          1.49683E-02         2.29502E-02        -2.32039E-02         9.40241E-01         1.66133E+00         9.40527E-01         1.28058E+01         1.00000E+00         1.29363E-03         1.28058E+01         4.51674E+00         8.28910E+00
+          1.49683E-02         2.31201E-02        -2.34497E-02         9.40237E-01         1.67200E+00         9.40529E-01         1.26053E+01         1.00000E+00         1.30229E-03         1.26053E+01         4.44590E+00         8.15943E+00
+          1.49683E-02         2.32899E-02        -2.36974E-02         9.40233E-01         1.68267E+00         9.40532E-01         1.23928E+01         1.00000E+00         1.31087E-03         1.23928E+01         4.36948E+00         8.02329E+00
+          1.49683E-02         2.34597E-02        -2.39468E-02         9.40230E-01         1.69334E+00         9.40535E-01         1.21690E+01         1.00000E+00         1.31936E-03         1.21690E+01         4.28787E+00         7.88110E+00
+          1.49683E-02         2.36295E-02        -2.41981E-02         9.40226E-01         1.70401E+00         9.40537E-01         1.19348E+01         1.00000E+00         1.32776E-03         1.19348E+01         4.20149E+00         7.73327E+00
+          1.49683E-02         2.37994E-02        -2.44512E-02         9.40222E-01         1.71468E+00         9.40540E-01         1.16910E+01         1.00000E+00         1.33606E-03         1.16910E+01         4.11075E+00         7.58025E+00
+          1.49683E-02         2.39692E-02        -2.47061E-02         9.40218E-01         1.72535E+00         9.40543E-01         1.14385E+01         1.00000E+00         1.34426E-03         1.14385E+01         4.01606E+00         7.42248E+00
+          1.49683E-02         2.41390E-02        -2.49628E-02         9.40214E-01         1.73602E+00         9.40546E-01         1.11783E+01         1.00000E+00         1.35236E-03         1.11783E+01         3.91783E+00         7.26044E+00
+          1.49683E-02         2.43088E-02        -2.52213E-02         9.40211E-01         1.74669E+00         9.40549E-01         1.09111E+01         1.00000E+00         1.36036E-03         1.09111E+01         3.81649E+00         7.09459E+00
+          1.49683E-02         2.44787E-02        -2.54817E-02         9.40207E-01         1.75736E+00         9.40552E-01         1.06378E+01         1.00000E+00         1.36824E-03         1.06378E+01         3.71243E+00         6.92541E+00
+          1.49683E-02         2.46485E-02        -2.57438E-02         9.40203E-01         1.76804E+00         9.40555E-01         1.03595E+01         1.00000E+00         1.37601E-03         1.03595E+01         3.60606E+00         6.75339E+00
+          1.49683E-02         2.48183E-02        -2.60078E-02         9.40199E-01         1.77871E+00         9.40558E-01         1.00768E+01         1.00000E+00         1.38366E-03         1.00768E+01         3.49778E+00         6.57903E+00
+          1.49683E-02         2.49882E-02        -2.62736E-02         9.40195E-01         1.78938E+00         9.40562E-01         9.79077E+00         1.00000E+00         1.39119E-03         9.79077E+00         3.38797E+00         6.40280E+00
+          1.49683E-02         2.51580E-02        -2.65412E-02         9.40191E-01         1.80005E+00         9.40565E-01         9.50222E+00         1.00000E+00         1.39859E-03         9.50222E+00         3.27701E+00         6.22521E+00
+          1.49683E-02         2.53278E-02        -2.68106E-02         9.40187E-01         1.81072E+00         9.40569E-01         9.21201E+00         1.00000E+00         1.40588E-03         9.21201E+00         3.16528E+00         6.04673E+00
+          1.49683E-02         2.54976E-02        -2.70818E-02         9.40183E-01         1.82139E+00         9.40573E-01         8.92099E+00         1.00000E+00         1.41303E-03         8.92099E+00         3.05312E+00         5.86787E+00
+          1.49683E-02         2.56675E-02        -2.73549E-02         9.40179E-01         1.83206E+00         9.40577E-01         8.62998E+00         1.00000E+00         1.42004E-03         8.62998E+00         2.94089E+00         5.68909E+00
+          1.49683E-02         2.58373E-02        -2.76297E-02         9.40175E-01         1.84273E+00         9.40580E-01         8.33979E+00         1.00000E+00         1.42693E-03         8.33979E+00         2.82891E+00         5.51088E+00
+          1.49683E-02         2.60071E-02        -2.79064E-02         9.40170E-01         1.85340E+00         9.40584E-01         8.05120E+00         1.00000E+00         1.43367E-03         8.05120E+00         2.71750E+00         5.33370E+00
+          1.49683E-02         2.61769E-02        -2.81849E-02         9.40166E-01         1.86407E+00         9.40589E-01         7.76496E+00         1.00000E+00         1.44027E-03         7.76496E+00         2.60697E+00         5.15799E+00
+          1.51382E-02         8.72665E-04        -6.84094E-03         9.51159E-01         2.74155E-01         9.51183E-01         2.72826E+02         1.00000E+00         6.35815E-04         2.72826E+02         1.19668E+02         1.53158E+02
+          1.51382E-02         1.04249E-03        -6.85116E-03         9.51159E-01         2.84826E-01         9.51183E-01         2.68077E+02         1.00000E+00         6.31698E-04         2.68077E+02         1.17732E+02         1.50344E+02
+          1.51382E-02         1.21232E-03        -6.86319E-03         9.51158E-01         2.95496E-01         9.51183E-01         2.63223E+02         1.00000E+00         6.27525E-04         2.63223E+02         1.15748E+02         1.47475E+02
+          1.51382E-02         1.38215E-03        -6.87703E-03         9.51158E-01         3.06167E-01         9.51183E-01         2.58272E+02         1.00000E+00         6.23306E-04         2.58272E+02         1.13718E+02         1.44554E+02
+          1.51382E-02         1.55197E-03        -6.89268E-03         9.51158E-01         3.16838E-01         9.51183E-01         2.53231E+02         1.00000E+00         6.19050E-04         2.53231E+02         1.11645E+02         1.41586E+02
+          1.51382E-02         1.72180E-03        -6.91015E-03         9.51158E-01         3.27508E-01         9.51183E-01         2.48109E+02         1.00000E+00         6.14767E-04         2.48109E+02         1.09532E+02         1.38577E+02
+          1.51382E-02         1.89163E-03        -6.92942E-03         9.51157E-01         3.38179E-01         9.51183E-01         2.42912E+02         1.00000E+00         6.10467E-04         2.42912E+02         1.07381E+02         1.35531E+02
+          1.51382E-02         2.06146E-03        -6.95051E-03         9.51157E-01         3.48849E-01         9.51182E-01         2.37649E+02         1.00000E+00         6.06160E-04         2.37649E+02         1.05196E+02         1.32453E+02
+          1.51382E-02         2.23128E-03        -6.97341E-03         9.51157E-01         3.59520E-01         9.51182E-01         2.32327E+02         1.00000E+00         6.01856E-04         2.32327E+02         1.02979E+02         1.29349E+02
+          1.51382E-02         2.40111E-03        -6.99812E-03         9.51156E-01         3.70190E-01         9.51182E-01         2.26954E+02         1.00000E+00         5.97563E-04         2.26954E+02         1.00733E+02         1.26221E+02
+          1.51382E-02         2.57094E-03        -7.02465E-03         9.51156E-01         3.80861E-01         9.51182E-01         2.21538E+02         1.00000E+00         5.93292E-04         2.21538E+02         9.84608E+01         1.23077E+02
+          1.51382E-02         2.74077E-03        -7.05299E-03         9.51155E-01         3.91532E-01         9.51182E-01         2.16085E+02         1.00000E+00         5.89053E-04         2.16085E+02         9.61656E+01         1.19920E+02
+          1.51382E-02         2.91059E-03        -7.08313E-03         9.51155E-01         4.02202E-01         9.51181E-01         2.10604E+02         1.00000E+00         5.84854E-04         2.10604E+02         9.38502E+01         1.16754E+02
+          1.51382E-02         3.08042E-03        -7.11509E-03         9.51155E-01         4.12873E-01         9.51181E-01         2.05102E+02         1.00000E+00         5.80705E-04         2.05102E+02         9.15175E+01         1.13585E+02
+          1.51382E-02         3.25025E-03        -7.14887E-03         9.51154E-01         4.23543E-01         9.51181E-01         1.99587E+02         1.00000E+00         5.76614E-04         1.99587E+02         8.91704E+01         1.10417E+02
+          1.51382E-02         3.42008E-03        -7.18445E-03         9.51154E-01         4.34214E-01         9.51181E-01         1.94066E+02         1.00000E+00         5.72592E-04         1.94066E+02         8.68118E+01         1.07254E+02
+          1.51382E-02         3.58990E-03        -7.22185E-03         9.51153E-01         4.44884E-01         9.51180E-01         1.88545E+02         1.00000E+00         5.68645E-04         1.88545E+02         8.44447E+01         1.04100E+02
+          1.51382E-02         3.75973E-03        -7.26105E-03         9.51152E-01         4.55555E-01         9.51180E-01         1.83032E+02         1.00000E+00         5.64783E-04         1.83032E+02         8.20719E+01         1.00960E+02
+          1.51382E-02         3.92956E-03        -7.30207E-03         9.51152E-01         4.66225E-01         9.51180E-01         1.77535E+02         1.00000E+00         5.61014E-04         1.77535E+02         7.96963E+01         9.78384E+01
+          1.51382E-02         4.09939E-03        -7.34491E-03         9.51151E-01         4.76896E-01         9.51179E-01         1.72059E+02         1.00000E+00         5.57344E-04         1.72059E+02         7.73207E+01         9.47380E+01
+          1.51382E-02         4.26921E-03        -7.38955E-03         9.51150E-01         4.87567E-01         9.51179E-01         1.66611E+02         1.00000E+00         5.53783E-04         1.66611E+02         7.49481E+01         9.16628E+01
+          1.51382E-02         4.43904E-03        -7.43601E-03         9.51150E-01         4.98237E-01         9.51179E-01         1.61198E+02         1.00000E+00         5.50337E-04         1.61198E+02         7.25811E+01         8.86167E+01
+          1.51382E-02         4.60887E-03        -7.48428E-03         9.51149E-01         5.08908E-01         9.51178E-01         1.55825E+02         1.00000E+00         5.47013E-04         1.55825E+02         7.02225E+01         8.56030E+01
+          1.51382E-02         4.77869E-03        -7.53436E-03         9.51148E-01         5.19578E-01         9.51178E-01         1.50500E+02         1.00000E+00         5.43817E-04         1.50500E+02         6.78750E+01         8.26251E+01
+          1.51382E-02         4.94852E-03        -7.58625E-03         9.51147E-01         5.30249E-01         9.51178E-01         1.45227E+02         1.00000E+00         5.40756E-04         1.45227E+02         6.55412E+01         7.96862E+01
+          1.51382E-02         5.11835E-03        -7.63995E-03         9.51147E-01         5.40919E-01         9.51177E-01         1.40013E+02         1.00000E+00         5.37836E-04         1.40013E+02         6.32238E+01         7.67891E+01
+          1.51382E-02         5.28818E-03        -7.69547E-03         9.51146E-01         5.51590E-01         9.51177E-01         1.34862E+02         1.00000E+00         5.35062E-04         1.34862E+02         6.09254E+01         7.39368E+01
+          1.51382E-02         5.45800E-03        -7.75280E-03         9.51145E-01         5.62261E-01         9.51176E-01         1.29780E+02         1.00000E+00         5.32439E-04         1.29780E+02         5.86483E+01         7.11320E+01
+          1.51382E-02         5.62783E-03        -7.81194E-03         9.51144E-01         5.72931E-01         9.51176E-01         1.24772E+02         1.00000E+00         5.29972E-04         1.24772E+02         5.63949E+01         6.83771E+01
+          1.51382E-02         5.79766E-03        -7.87289E-03         9.51143E-01         5.83602E-01         9.51176E-01         1.19842E+02         1.00000E+00         5.27666E-04         1.19842E+02         5.41677E+01         6.56744E+01
+          1.51382E-02         5.96749E-03        -7.93565E-03         9.51142E-01         5.94272E-01         9.51175E-01         1.14995E+02         1.00000E+00         5.25524E-04         1.14995E+02         5.19689E+01         6.30262E+01
+          1.51382E-02         6.13731E-03        -8.00023E-03         9.51141E-01         6.04943E-01         9.51175E-01         1.10235E+02         1.00000E+00         5.23551E-04         1.10235E+02         4.98007E+01         6.04344E+01
+          1.51382E-02         6.30714E-03        -8.06662E-03         9.51140E-01         6.15613E-01         9.51174E-01         1.05566E+02         1.00000E+00         5.21750E-04         1.05566E+02         4.76651E+01         5.79008E+01
+          1.51382E-02         6.47697E-03        -8.13482E-03         9.51139E-01         6.26284E-01         9.51174E-01         1.00991E+02         1.00000E+00         5.20124E-04         1.00991E+02         4.55642E+01         5.54270E+01
+          1.51382E-02         6.64680E-03        -8.20483E-03         9.51138E-01         6.36955E-01         9.51173E-01         9.65146E+01         1.00000E+00         5.18676E-04         9.65146E+01         4.34999E+01         5.30147E+01
+          1.51382E-02         6.81662E-03        -8.27666E-03         9.51137E-01         6.47625E-01         9.51173E-01         9.21390E+01         1.00000E+00         5.17409E-04         9.21390E+01         4.14740E+01         5.06649E+01
+          1.51382E-02         6.98645E-03        -8.35029E-03         9.51136E-01         6.58296E-01         9.51173E-01         8.78673E+01         1.00000E+00         5.16323E-04         8.78673E+01         3.94884E+01         4.83789E+01
+          1.51382E-02         7.15628E-03        -8.42574E-03         9.51135E-01         6.68966E-01         9.51172E-01         8.37023E+01         1.00000E+00         5.15423E-04         8.37023E+01         3.75445E+01         4.61578E+01
+          1.51382E-02         7.32611E-03        -8.50300E-03         9.51134E-01         6.79637E-01         9.51172E-01         7.96462E+01         1.00000E+00         5.14708E-04         7.96462E+01         3.56440E+01         4.40021E+01
+          1.51382E-02         7.49593E-03        -8.58207E-03         9.51132E-01         6.90307E-01         9.51171E-01         7.57011E+01         1.00000E+00         5.14180E-04         7.57011E+01         3.37883E+01         4.19128E+01
+          1.51382E-02         7.66576E-03        -8.66296E-03         9.51131E-01         7.00978E-01         9.51171E-01         7.18689E+01         1.00000E+00         5.13841E-04         7.18689E+01         3.19788E+01         3.98902E+01
+          1.51382E-02         7.83559E-03        -8.74566E-03         9.51130E-01         7.11649E-01         9.51170E-01         6.81512E+01         1.00000E+00         5.13691E-04         6.81512E+01         3.02165E+01         3.79347E+01
+          1.51382E-02         8.00542E-03        -8.83017E-03         9.51129E-01         7.22319E-01         9.51170E-01         6.45493E+01         1.00000E+00         5.13731E-04         6.45493E+01         2.85028E+01         3.60465E+01
+          1.51382E-02         8.17524E-03        -8.91649E-03         9.51127E-01         7.32990E-01         9.51169E-01         6.10644E+01         1.00000E+00         5.13961E-04         6.10644E+01         2.68386E+01         3.42258E+01
+          1.51382E-02         8.34507E-03        -9.00462E-03         9.51126E-01         7.43660E-01         9.51169E-01         5.76971E+01         1.00000E+00         5.14381E-04         5.76971E+01         2.52247E+01         3.24724E+01
+          1.51382E-02         8.51490E-03        -9.09457E-03         9.51125E-01         7.54331E-01         9.51168E-01         5.44482E+01         1.00000E+00         5.14992E-04         5.44482E+01         2.36621E+01         3.07862E+01
+          1.51382E-02         8.68473E-03        -9.18632E-03         9.51123E-01         7.65001E-01         9.51168E-01         5.13181E+01         1.00000E+00         5.15793E-04         5.13181E+01         2.21513E+01         2.91668E+01
+          1.51382E-02         8.85455E-03        -9.27989E-03         9.51122E-01         7.75672E-01         9.51167E-01         4.83068E+01         1.00000E+00         5.16783E-04         4.83068E+01         2.06930E+01         2.76138E+01
+          1.51382E-02         9.02438E-03        -9.37528E-03         9.51120E-01         7.86343E-01         9.51167E-01         4.54143E+01         1.00000E+00         5.17963E-04         4.54143E+01         1.92876E+01         2.61267E+01
+          1.51382E-02         9.19421E-03        -9.47247E-03         9.51119E-01         7.97013E-01         9.51166E-01         4.26404E+01         1.00000E+00         5.19331E-04         4.26404E+01         1.79355E+01         2.47049E+01
+          1.51382E-02         9.36403E-03        -9.57148E-03         9.51117E-01         8.07684E-01         9.51166E-01         3.99844E+01         1.00000E+00         5.20887E-04         3.99844E+01         1.66369E+01         2.33475E+01
+          1.51382E-02         9.53386E-03        -9.67230E-03         9.51116E-01         8.18354E-01         9.51165E-01         3.74458E+01         1.00000E+00         5.22630E-04         3.74458E+01         1.53921E+01         2.20537E+01
+          1.51382E-02         9.70369E-03        -9.77493E-03         9.51114E-01         8.29025E-01         9.51165E-01         3.50235E+01         1.00000E+00         5.24558E-04         3.50235E+01         1.42009E+01         2.08226E+01
+          1.51382E-02         9.87352E-03        -9.87937E-03         9.51113E-01         8.39695E-01         9.51164E-01         3.27166E+01         1.00000E+00         5.26670E-04         3.27166E+01         1.30634E+01         1.96531E+01
+          1.51382E-02         1.00433E-02        -9.98562E-03         9.51111E-01         8.50366E-01         9.51164E-01         3.05237E+01         1.00000E+00         5.28965E-04         3.05237E+01         1.19794E+01         1.85442E+01
+          1.51382E-02         1.02132E-02        -1.00937E-02         9.51109E-01         8.61037E-01         9.51163E-01         2.84434E+01         1.00000E+00         5.31442E-04         2.84434E+01         1.09487E+01         1.74947E+01
+          1.51382E-02         1.03830E-02        -1.02036E-02         9.51108E-01         8.71707E-01         9.51163E-01         2.64741E+01         1.00000E+00         5.34099E-04         2.64741E+01         9.97082E+00         1.65033E+01
+          1.51382E-02         1.05528E-02        -1.03153E-02         9.51106E-01         8.82378E-01         9.51162E-01         2.46141E+01         1.00000E+00         5.36934E-04         2.46141E+01         9.04537E+00         1.55687E+01
+          1.51382E-02         1.07227E-02        -1.04288E-02         9.51104E-01         8.93048E-01         9.51162E-01         2.28614E+01         1.00000E+00         5.39946E-04         2.28614E+01         8.17180E+00         1.46896E+01
+          1.51382E-02         1.08925E-02        -1.05441E-02         9.51103E-01         9.03719E-01         9.51161E-01         2.12140E+01         1.00000E+00         5.43132E-04         2.12140E+01         7.34947E+00         1.38645E+01
+          1.51382E-02         1.10623E-02        -1.06612E-02         9.51101E-01         9.14389E-01         9.51161E-01         1.96697E+01         1.00000E+00         5.46491E-04         1.96697E+01         6.57765E+00         1.30921E+01
+          1.51382E-02         1.12321E-02        -1.07802E-02         9.51099E-01         9.25060E-01         9.51160E-01         1.82263E+01         1.00000E+00         5.50020E-04         1.82263E+01         5.85554E+00         1.23707E+01
+          1.51382E-02         1.14020E-02        -1.09009E-02         9.51097E-01         9.35731E-01         9.51160E-01         1.68813E+01         1.00000E+00         5.53718E-04         1.68813E+01         5.18227E+00         1.16990E+01
+          1.51382E-02         1.15718E-02        -1.10235E-02         9.51095E-01         9.46401E-01         9.51159E-01         1.56321E+01         1.00000E+00         5.57581E-04         1.56321E+01         4.55686E+00         1.10753E+01
+          1.51382E-02         1.17416E-02        -1.11479E-02         9.51094E-01         9.57072E-01         9.51159E-01         1.44763E+01         1.00000E+00         5.61609E-04         1.44763E+01         3.97830E+00         1.04980E+01
+          1.51382E-02         1.19114E-02        -1.12740E-02         9.51092E-01         9.67742E-01         9.51158E-01         1.34111E+01         1.00000E+00         5.65797E-04         1.34111E+01         3.44548E+00         9.96557E+00
+          1.51382E-02         1.20813E-02        -1.14020E-02         9.51090E-01         9.78413E-01         9.51158E-01         1.24336E+01         1.00000E+00         5.70144E-04         1.24336E+01         2.95725E+00         9.47638E+00
+          1.51382E-02         1.22511E-02        -1.15319E-02         9.51088E-01         9.89083E-01         9.51158E-01         1.15412E+01         1.00000E+00         5.74648E-04         1.15412E+01         2.51238E+00         9.02879E+00
+          1.51382E-02         1.24209E-02        -1.16635E-02         9.51086E-01         9.99754E-01         9.51157E-01         1.07308E+01         1.00000E+00         5.79304E-04         1.07308E+01         2.10961E+00         8.62118E+00
+          1.51382E-02         1.25908E-02        -1.17969E-02         9.51084E-01         1.01042E+00         9.51157E-01         9.99951E+00         1.00000E+00         5.84111E-04         9.99951E+00         1.74760E+00         8.25191E+00
+          1.51382E-02         1.27606E-02        -1.19322E-02         9.51082E-01         1.02110E+00         9.51156E-01         9.34433E+00         1.00000E+00         5.89065E-04         9.34433E+00         1.42499E+00         7.91934E+00
+          1.51382E-02         1.29304E-02        -1.20692E-02         9.51080E-01         1.03177E+00         9.51156E-01         8.76220E+00         1.00000E+00         5.94163E-04         8.76220E+00         1.14037E+00         7.62184E+00
+          1.51382E-02         1.31002E-02        -1.22081E-02         9.51077E-01         1.04244E+00         9.51156E-01         8.25006E+00         1.00000E+00         5.99403E-04         8.25006E+00         8.92282E-01         7.35778E+00
+          1.51382E-02         1.32701E-02        -1.23488E-02         9.51075E-01         1.05311E+00         9.51155E-01         7.80480E+00         1.00000E+00         6.04781E-04         7.80480E+00         6.79254E-01         7.12554E+00
+          1.51382E-02         1.34399E-02        -1.24913E-02         9.51073E-01         1.06378E+00         9.51155E-01         7.42331E+00         1.00000E+00         6.10293E-04         7.42331E+00         4.99775E-01         6.92353E+00
+          1.51382E-02         1.36097E-02        -1.26356E-02         9.51071E-01         1.07445E+00         9.51155E-01         7.10247E+00         1.00000E+00         6.15937E-04         7.10247E+00         3.52314E-01         6.75016E+00
+          1.51382E-02         1.37795E-02        -1.27817E-02         9.51069E-01         1.08512E+00         9.51155E-01         6.83918E+00         1.00000E+00         6.21709E-04         6.83918E+00         2.35319E-01         6.60386E+00
+          1.51382E-02         1.39494E-02        -1.29297E-02         9.51067E-01         1.09579E+00         9.51154E-01         6.63030E+00         1.00000E+00         6.27605E-04         6.63030E+00         1.47228E-01         6.48307E+00
+          1.51382E-02         1.41192E-02        -1.30794E-02         9.51064E-01         1.10646E+00         9.51154E-01         6.47275E+00         1.00000E+00         6.33622E-04         6.47275E+00         8.64647E-02         6.38628E+00
+          1.51382E-02         1.42890E-02        -1.32310E-02         9.51062E-01         1.11713E+00         9.51154E-01         6.36344E+00         1.00000E+00         6.39755E-04         6.36344E+00         5.14510E-02         6.31199E+00
+          1.51382E-02         1.44589E-02        -1.33844E-02         9.51060E-01         1.12780E+00         9.51154E-01         6.29931E+00         1.00000E+00         6.46003E-04         6.29931E+00         4.06061E-02         6.25871E+00
+          1.51382E-02         1.46287E-02        -1.35396E-02         9.51057E-01         1.13847E+00         9.51154E-01         6.27735E+00         1.00000E+00         6.52360E-04         6.27735E+00         5.23529E-02         6.22499E+00
+          1.51382E-02         1.47985E-02        -1.36966E-02         9.51055E-01         1.14914E+00         9.51154E-01         6.29455E+00         1.00000E+00         6.58822E-04         6.29455E+00         8.51216E-02         6.20943E+00
+          1.51382E-02         1.49683E-02        -1.38554E-02         9.51053E-01         1.15981E+00         9.51153E-01         6.34799E+00         1.00000E+00         6.65387E-04         6.34799E+00         1.37354E-01         6.21063E+00
+          1.51382E-02         1.51382E-02        -1.40160E-02         9.51050E-01         1.17048E+00         9.51153E-01         6.43475E+00         1.00000E+00         6.72050E-04         6.43475E+00         2.07506E-01         6.22724E+00
+          1.51382E-02         1.53080E-02        -1.41785E-02         9.51048E-01         1.18115E+00         9.51153E-01         6.55199E+00         1.00000E+00         6.78807E-04         6.55199E+00         2.94053E-01         6.25793E+00
+          1.51382E-02         1.54778E-02        -1.43427E-02         9.51045E-01         1.19182E+00         9.51153E-01         6.69692E+00         1.00000E+00         6.85655E-04         6.69692E+00         3.95495E-01         6.30142E+00
+          1.51382E-02         1.56476E-02        -1.45088E-02         9.51043E-01         1.20249E+00         9.51153E-01         6.86681E+00         1.00000E+00         6.92589E-04         6.86681E+00         5.10355E-01         6.35645E+00
+          1.51382E-02         1.58175E-02        -1.46766E-02         9.51040E-01         1.21317E+00         9.51153E-01         7.05899E+00         1.00000E+00         6.99605E-04         7.05899E+00         6.37188E-01         6.42180E+00
+          1.51382E-02         1.59873E-02        -1.48463E-02         9.51038E-01         1.22384E+00         9.51153E-01         7.27087E+00         1.00000E+00         7.06700E-04         7.27087E+00         7.74578E-01         6.49629E+00
+          1.51382E-02         1.61571E-02        -1.50178E-02         9.51035E-01         1.23451E+00         9.51153E-01         7.49992E+00         1.00000E+00         7.13869E-04         7.49992E+00         9.21148E-01         6.57878E+00
+          1.51382E-02         1.63270E-02        -1.51912E-02         9.51032E-01         1.24518E+00         9.51154E-01         7.74370E+00         1.00000E+00         7.21110E-04         7.74370E+00         1.07556E+00         6.66814E+00
+          1.51382E-02         1.64968E-02        -1.53663E-02         9.51030E-01         1.25585E+00         9.51154E-01         7.99983E+00         1.00000E+00         7.28417E-04         7.99983E+00         1.23651E+00         6.76333E+00
+          1.51382E-02         1.66666E-02        -1.55432E-02         9.51027E-01         1.26652E+00         9.51154E-01         8.26603E+00         1.00000E+00         7.35787E-04         8.26603E+00         1.40274E+00         6.86329E+00
+          1.51382E-02         1.68364E-02        -1.57220E-02         9.51024E-01         1.27719E+00         9.51154E-01         8.54008E+00         1.00000E+00         7.43217E-04         8.54008E+00         1.57304E+00         6.96704E+00
+          1.51382E-02         1.70063E-02        -1.59025E-02         9.51022E-01         1.28786E+00         9.51154E-01         8.81987E+00         1.00000E+00         7.50703E-04         8.81987E+00         1.74625E+00         7.07362E+00
+          1.51382E-02         1.71761E-02        -1.60849E-02         9.51019E-01         1.29853E+00         9.51155E-01         9.10336E+00         1.00000E+00         7.58240E-04         9.10336E+00         1.92125E+00         7.18211E+00
+          1.51382E-02         1.73459E-02        -1.62691E-02         9.51016E-01         1.30920E+00         9.51155E-01         9.38861E+00         1.00000E+00         7.65826E-04         9.38861E+00         2.09698E+00         7.29163E+00
+          1.51382E-02         1.75158E-02        -1.64551E-02         9.51013E-01         1.31987E+00         9.51156E-01         9.67378E+00         1.00000E+00         7.73457E-04         9.67378E+00         2.27243E+00         7.40135E+00
+          1.51382E-02         1.76856E-02        -1.66429E-02         9.51010E-01         1.33054E+00         9.51156E-01         9.95709E+00         1.00000E+00         7.81129E-04         9.95709E+00         2.44663E+00         7.51046E+00
+          1.51382E-02         1.78554E-02        -1.68326E-02         9.51007E-01         1.34121E+00         9.51156E-01         1.02369E+01         1.00000E+00         7.88839E-04         1.02369E+01         2.61867E+00         7.61820E+00
+          1.51382E-02         1.80252E-02        -1.70240E-02         9.51005E-01         1.35188E+00         9.51157E-01         1.05116E+01         1.00000E+00         7.96584E-04         1.05116E+01         2.78772E+00         7.72386E+00
+          1.51382E-02         1.81951E-02        -1.72173E-02         9.51002E-01         1.36255E+00         9.51157E-01         1.07797E+01         1.00000E+00         8.04360E-04         1.07797E+01         2.95297E+00         7.82673E+00
+          1.51382E-02         1.83649E-02        -1.74123E-02         9.50999E-01         1.37322E+00         9.51158E-01         1.10399E+01         1.00000E+00         8.12164E-04         1.10399E+01         3.11369E+00         7.92619E+00
+          1.51382E-02         1.85347E-02        -1.76092E-02         9.50996E-01         1.38389E+00         9.51159E-01         1.12908E+01         1.00000E+00         8.19992E-04         1.12908E+01         3.26919E+00         8.02162E+00
+          1.51382E-02         1.87045E-02        -1.78079E-02         9.50993E-01         1.39457E+00         9.51159E-01         1.15313E+01         1.00000E+00         8.27843E-04         1.15313E+01         3.41883E+00         8.11246E+00
+          1.51382E-02         1.88744E-02        -1.80084E-02         9.50990E-01         1.40524E+00         9.51160E-01         1.17602E+01         1.00000E+00         8.35712E-04         1.17602E+01         3.56206E+00         8.19818E+00
+          1.51382E-02         1.90442E-02        -1.82107E-02         9.50987E-01         1.41591E+00         9.51161E-01         1.19766E+01         1.00000E+00         8.43596E-04         1.19766E+01         3.69835E+00         8.27828E+00
+          1.51382E-02         1.92140E-02        -1.84149E-02         9.50983E-01         1.42658E+00         9.51162E-01         1.21796E+01         1.00000E+00         8.51493E-04         1.21796E+01         3.82723E+00         8.35233E+00
+          1.51382E-02         1.93839E-02        -1.86208E-02         9.50980E-01         1.43725E+00         9.51163E-01         1.23682E+01         1.00000E+00         8.59400E-04         1.23682E+01         3.94831E+00         8.41990E+00
+          1.51382E-02         1.95537E-02        -1.88286E-02         9.50977E-01         1.44792E+00         9.51164E-01         1.25418E+01         1.00000E+00         8.67314E-04         1.25418E+01         4.06122E+00         8.48062E+00
+          1.51382E-02         1.97235E-02        -1.90381E-02         9.50974E-01         1.45859E+00         9.51165E-01         1.26998E+01         1.00000E+00         8.75232E-04         1.26998E+01         4.16566E+00         8.53414E+00
+          1.51382E-02         1.98933E-02        -1.92495E-02         9.50971E-01         1.46926E+00         9.51166E-01         1.28416E+01         1.00000E+00         8.83151E-04         1.28416E+01         4.26138E+00         8.58017E+00
+          1.51382E-02         2.00632E-02        -1.94627E-02         9.50968E-01         1.47993E+00         9.51167E-01         1.29666E+01         1.00000E+00         8.91068E-04         1.29666E+01         4.34817E+00         8.61845E+00
+          1.51382E-02         2.02330E-02        -1.96777E-02         9.50964E-01         1.49060E+00         9.51168E-01         1.30746E+01         1.00000E+00         8.98980E-04         1.30746E+01         4.42588E+00         8.64874E+00
+          1.51382E-02         2.04028E-02        -1.98945E-02         9.50961E-01         1.50127E+00         9.51169E-01         1.31653E+01         1.00000E+00         9.06885E-04         1.31653E+01         4.49440E+00         8.67086E+00
+          1.51382E-02         2.05726E-02        -2.01132E-02         9.50958E-01         1.51194E+00         9.51170E-01         1.32383E+01         1.00000E+00         9.14780E-04         1.32383E+01         4.55367E+00         8.68464E+00
+          1.51382E-02         2.07425E-02        -2.03336E-02         9.50954E-01         1.52261E+00         9.51172E-01         1.32936E+01         1.00000E+00         9.22662E-04         1.32936E+01         4.60365E+00         8.68997E+00
+          1.51382E-02         2.09123E-02        -2.05559E-02         9.50951E-01         1.53328E+00         9.51173E-01         1.33311E+01         1.00000E+00         9.30528E-04         1.33311E+01         4.64438E+00         8.68675E+00
+          1.51382E-02         2.10821E-02        -2.07800E-02         9.50948E-01         1.54395E+00         9.51175E-01         1.33509E+01         1.00000E+00         9.38375E-04         1.33509E+01         4.67591E+00         8.67494E+00
+          1.51382E-02         2.12520E-02        -2.10059E-02         9.50944E-01         1.55462E+00         9.51176E-01         1.33529E+01         1.00000E+00         9.46201E-04         1.33529E+01         4.69834E+00         8.65452E+00
+          1.51382E-02         2.14218E-02        -2.12336E-02         9.50941E-01         1.56529E+00         9.51178E-01         1.33373E+01         1.00000E+00         9.54002E-04         1.33373E+01         4.71180E+00         8.62549E+00
+          1.51382E-02         2.15916E-02        -2.14631E-02         9.50937E-01         1.57596E+00         9.51180E-01         1.33044E+01         1.00000E+00         9.61776E-04         1.33044E+01         4.71646E+00         8.58790E+00
+          1.51382E-02         2.17614E-02        -2.16944E-02         9.50934E-01         1.58664E+00         9.51181E-01         1.32543E+01         1.00000E+00         9.69519E-04         1.32543E+01         4.71250E+00         8.54183E+00
+          1.51382E-02         2.19313E-02        -2.19275E-02         9.50930E-01         1.59731E+00         9.51183E-01         1.31875E+01         1.00000E+00         9.77229E-04         1.31875E+01         4.70016E+00         8.48738E+00
+          1.51382E-02         2.21011E-02        -2.21625E-02         9.50927E-01         1.60798E+00         9.51185E-01         1.31044E+01         1.00000E+00         9.84902E-04         1.31044E+01         4.67969E+00         8.42468E+00
+          1.51382E-02         2.22709E-02        -2.23993E-02         9.50923E-01         1.61865E+00         9.51187E-01         1.30053E+01         1.00000E+00         9.92536E-04         1.30053E+01         4.65135E+00         8.35390E+00
+          1.51382E-02         2.24407E-02        -2.26379E-02         9.50920E-01         1.62932E+00         9.51189E-01         1.28907E+01         1.00000E+00         1.00013E-03         1.28907E+01         4.61545E+00         8.27523E+00
+          1.51382E-02         2.26106E-02        -2.28782E-02         9.50916E-01         1.63999E+00         9.51191E-01         1.27612E+01         1.00000E+00         1.00767E-03         1.27612E+01         4.57230E+00         8.18888E+00
+          1.51382E-02         2.27804E-02        -2.31205E-02         9.50912E-01         1.65066E+00         9.51193E-01         1.26173E+01         1.00000E+00         1.01517E-03         1.26173E+01         4.52225E+00         8.09510E+00
+          1.51382E-02         2.29502E-02        -2.33645E-02         9.50909E-01         1.66133E+00         9.51196E-01         1.24598E+01         1.00000E+00         1.02261E-03         1.24598E+01         4.46563E+00         7.99414E+00
+          1.51382E-02         2.31201E-02        -2.36103E-02         9.50905E-01         1.67200E+00         9.51198E-01         1.22891E+01         1.00000E+00         1.03000E-03         1.22891E+01         4.40282E+00         7.88630E+00
+          1.51382E-02         2.32899E-02        -2.38580E-02         9.50901E-01         1.68267E+00         9.51200E-01         1.21061E+01         1.00000E+00         1.03733E-03         1.21061E+01         4.33419E+00         7.77188E+00
+          1.51382E-02         2.34597E-02        -2.41074E-02         9.50897E-01         1.69334E+00         9.51203E-01         1.19113E+01         1.00000E+00         1.04460E-03         1.19113E+01         4.26012E+00         7.65122E+00
+          1.51382E-02         2.36295E-02        -2.43587E-02         9.50893E-01         1.70401E+00         9.51205E-01         1.17057E+01         1.00000E+00         1.05180E-03         1.17057E+01         4.18101E+00         7.52464E+00
+          1.51382E-02         2.37994E-02        -2.46118E-02         9.50890E-01         1.71468E+00         9.51208E-01         1.14898E+01         1.00000E+00         1.05893E-03         1.14898E+01         4.09725E+00         7.39253E+00
+          1.51382E-02         2.39692E-02        -2.48667E-02         9.50886E-01         1.72535E+00         9.51211E-01         1.12645E+01         1.00000E+00         1.06600E-03         1.12645E+01         4.00924E+00         7.25526E+00
+          1.51382E-02         2.41390E-02        -2.51234E-02         9.50882E-01         1.73602E+00         9.51214E-01         1.10306E+01         1.00000E+00         1.07298E-03         1.10306E+01         3.91738E+00         7.11322E+00
+          1.51382E-02         2.43088E-02        -2.53819E-02         9.50878E-01         1.74669E+00         9.51217E-01         1.07889E+01         1.00000E+00         1.07989E-03         1.07889E+01         3.82208E+00         6.96681E+00
+          1.51382E-02         2.44787E-02        -2.56423E-02         9.50874E-01         1.75736E+00         9.51220E-01         1.05402E+01         1.00000E+00         1.08672E-03         1.05402E+01         3.72374E+00         6.81645E+00
+          1.51382E-02         2.46485E-02        -2.59044E-02         9.50870E-01         1.76804E+00         9.51223E-01         1.02853E+01         1.00000E+00         1.09347E-03         1.02853E+01         3.62274E+00         6.66258E+00
+          1.51382E-02         2.48183E-02        -2.61684E-02         9.50866E-01         1.77871E+00         9.51226E-01         1.00251E+01         1.00000E+00         1.10013E-03         1.00251E+01         3.51950E+00         6.50561E+00
+          1.51382E-02         2.49882E-02        -2.64342E-02         9.50862E-01         1.78938E+00         9.51229E-01         9.76037E+00         1.00000E+00         1.10670E-03         9.76037E+00         3.41438E+00         6.34599E+00
+          1.51382E-02         2.51580E-02        -2.67018E-02         9.50858E-01         1.80005E+00         9.51233E-01         9.49192E+00         1.00000E+00         1.11317E-03         9.49192E+00         3.30776E+00         6.18416E+00
+          1.51382E-02         2.53278E-02        -2.69712E-02         9.50854E-01         1.81072E+00         9.51236E-01         9.22060E+00         1.00000E+00         1.11955E-03         9.22060E+00         3.20002E+00         6.02057E+00
+          1.51382E-02         2.54976E-02        -2.72424E-02         9.50850E-01         1.82139E+00         9.51240E-01         8.94718E+00         1.00000E+00         1.12584E-03         8.94718E+00         3.09151E+00         5.85567E+00
+          1.51382E-02         2.56675E-02        -2.75155E-02         9.50846E-01         1.83206E+00         9.51244E-01         8.67248E+00         1.00000E+00         1.13202E-03         8.67248E+00         2.98259E+00         5.68990E+00
+          1.51382E-02         2.58373E-02        -2.77903E-02         9.50842E-01         1.84273E+00         9.51248E-01         8.39727E+00         1.00000E+00         1.13810E-03         8.39727E+00         2.87357E+00         5.52370E+00
+          1.51382E-02         2.60071E-02        -2.80670E-02         9.50837E-01         1.85340E+00         9.51252E-01         8.12232E+00         1.00000E+00         1.14408E-03         8.12232E+00         2.76480E+00         5.35752E+00
+          1.51382E-02         2.61769E-02        -2.83455E-02         9.50833E-01         1.86407E+00         9.51256E-01         7.84835E+00         1.00000E+00         1.14995E-03         7.84835E+00         2.65656E+00         5.19179E+00
+          1.53080E-02         8.72665E-04        -7.00340E-03         9.61829E-01         2.74155E-01         9.61855E-01         2.62584E+02         1.00000E+00         4.67423E-04         2.62584E+02         1.15967E+02         1.46617E+02
+          1.53080E-02         1.04249E-03        -7.01362E-03         9.61829E-01         2.84826E-01         9.61855E-01         2.58049E+02         1.00000E+00         4.64510E-04         2.58049E+02         1.14142E+02         1.43907E+02
+          1.53080E-02         1.21232E-03        -7.02565E-03         9.61829E-01         2.95496E-01         9.61855E-01         2.53414E+02         1.00000E+00         4.61561E-04         2.53414E+02         1.12270E+02         1.41144E+02
+          1.53080E-02         1.38215E-03        -7.03949E-03         9.61829E-01         3.06167E-01         9.61854E-01         2.48687E+02         1.00000E+00         4.58582E-04         2.48687E+02         1.10355E+02         1.38332E+02
+          1.53080E-02         1.55197E-03        -7.05514E-03         9.61828E-01         3.16838E-01         9.61854E-01         2.43873E+02         1.00000E+00         4.55581E-04         2.43873E+02         1.08398E+02         1.35476E+02
+          1.53080E-02         1.72180E-03        -7.07260E-03         9.61828E-01         3.27508E-01         9.61854E-01         2.38982E+02         1.00000E+00         4.52564E-04         2.38982E+02         1.06401E+02         1.32580E+02
+          1.53080E-02         1.89163E-03        -7.09188E-03         9.61828E-01         3.38179E-01         9.61854E-01         2.34019E+02         1.00000E+00         4.49540E-04         2.34019E+02         1.04368E+02         1.29651E+02
+          1.53080E-02         2.06146E-03        -7.11297E-03         9.61828E-01         3.48849E-01         9.61854E-01         2.28992E+02         1.00000E+00         4.46514E-04         2.28992E+02         1.02301E+02         1.26691E+02
+          1.53080E-02         2.23128E-03        -7.13587E-03         9.61827E-01         3.59520E-01         9.61854E-01         2.23909E+02         1.00000E+00         4.43495E-04         2.23909E+02         1.00203E+02         1.23706E+02
+          1.53080E-02         2.40111E-03        -7.16058E-03         9.61827E-01         3.70190E-01         9.61854E-01         2.18777E+02         1.00000E+00         4.40489E-04         2.18777E+02         9.80757E+01         1.20701E+02
+          1.53080E-02         2.57094E-03        -7.18711E-03         9.61826E-01         3.80861E-01         9.61853E-01         2.13602E+02         1.00000E+00         4.37503E-04         2.13602E+02         9.59225E+01         1.17680E+02
+          1.53080E-02         2.74077E-03        -7.21544E-03         9.61826E-01         3.91532E-01         9.61853E-01         2.08393E+02         1.00000E+00         4.34544E-04         2.08393E+02         9.37458E+01         1.14648E+02
+          1.53080E-02         2.91059E-03        -7.24559E-03         9.61826E-01         4.02202E-01         9.61853E-01         2.03157E+02         1.00000E+00         4.31620E-04         2.03157E+02         9.15484E+01         1.11608E+02
+          1.53080E-02         3.08042E-03        -7.27755E-03         9.61825E-01         4.12873E-01         9.61853E-01         1.97900E+02         1.00000E+00         4.28736E-04         1.97900E+02         8.93330E+01         1.08567E+02
+          1.53080E-02         3.25025E-03        -7.31132E-03         9.61825E-01         4.23543E-01         9.61852E-01         1.92630E+02         1.00000E+00         4.25899E-04         1.92630E+02         8.71023E+01         1.05527E+02
+          1.53080E-02         3.42008E-03        -7.34691E-03         9.61824E-01         4.34214E-01         9.61852E-01         1.87353E+02         1.00000E+00         4.23116E-04         1.87353E+02         8.48590E+01         1.02494E+02
+          1.53080E-02         3.58990E-03        -7.38430E-03         9.61823E-01         4.44884E-01         9.61852E-01         1.82076E+02         1.00000E+00         4.20393E-04         1.82076E+02         8.26057E+01         9.94707E+01
+          1.53080E-02         3.75973E-03        -7.42351E-03         9.61823E-01         4.55555E-01         9.61851E-01         1.76807E+02         1.00000E+00         4.17736E-04         1.76807E+02         8.03453E+01         9.64617E+01
+          1.53080E-02         3.92956E-03        -7.46453E-03         9.61822E-01         4.66225E-01         9.61851E-01         1.71551E+02         1.00000E+00         4.15150E-04         1.71551E+02         7.80804E+01         9.34707E+01
+          1.53080E-02         4.09939E-03        -7.50736E-03         9.61822E-01         4.76896E-01         9.61851E-01         1.66315E+02         1.00000E+00         4.12642E-04         1.66315E+02         7.58137E+01         9.05016E+01
+          1.53080E-02         4.26921E-03        -7.55201E-03         9.61821E-01         4.87567E-01         9.61851E-01         1.61106E+02         1.00000E+00         4.10217E-04         1.61106E+02         7.35478E+01         8.75578E+01
+          1.53080E-02         4.43904E-03        -7.59846E-03         9.61820E-01         4.98237E-01         9.61850E-01         1.55928E+02         1.00000E+00         4.07880E-04         1.55928E+02         7.12854E+01         8.46430E+01
+          1.53080E-02         4.60887E-03        -7.64673E-03         9.61819E-01         5.08908E-01         9.61850E-01         1.50789E+02         1.00000E+00         4.05636E-04         1.50789E+02         6.90290E+01         8.17603E+01
+          1.53080E-02         4.77869E-03        -7.69681E-03         9.61819E-01         5.19578E-01         9.61849E-01         1.45694E+02         1.00000E+00         4.03489E-04         1.45694E+02         6.67812E+01         7.89129E+01
+          1.53080E-02         4.94852E-03        -7.74870E-03         9.61818E-01         5.30249E-01         9.61849E-01         1.40648E+02         1.00000E+00         4.01444E-04         1.40648E+02         6.45446E+01         7.61038E+01
+          1.53080E-02         5.11835E-03        -7.80241E-03         9.61817E-01         5.40919E-01         9.61849E-01         1.35657E+02         1.00000E+00         3.99506E-04         1.35657E+02         6.23215E+01         7.33360E+01
+          1.53080E-02         5.28818E-03        -7.85792E-03         9.61816E-01         5.51590E-01         9.61848E-01         1.30726E+02         1.00000E+00         3.97679E-04         1.30726E+02         6.01145E+01         7.06119E+01
+          1.53080E-02         5.45800E-03        -7.91525E-03         9.61815E-01         5.62261E-01         9.61848E-01         1.25860E+02         1.00000E+00         3.95965E-04         1.25860E+02         5.79258E+01         6.79342E+01
+          1.53080E-02         5.62783E-03        -7.97439E-03         9.61814E-01         5.72931E-01         9.61847E-01         1.21063E+02         1.00000E+00         3.94369E-04         1.21063E+02         5.57579E+01         6.53052E+01
+          1.53080E-02         5.79766E-03        -8.03534E-03         9.61813E-01         5.83602E-01         9.61847E-01         1.16340E+02         1.00000E+00         3.92894E-04         1.16340E+02         5.36129E+01         6.27270E+01
+          1.53080E-02         5.96749E-03        -8.09811E-03         9.61813E-01         5.94272E-01         9.61847E-01         1.11695E+02         1.00000E+00         3.91542E-04         1.11695E+02         5.14930E+01         6.02017E+01
+          1.53080E-02         6.13731E-03        -8.16268E-03         9.61812E-01         6.04943E-01         9.61846E-01         1.07132E+02         1.00000E+00         3.90317E-04         1.07132E+02         4.94004E+01         5.77311E+01
+          1.53080E-02         6.30714E-03        -8.22907E-03         9.61811E-01         6.15613E-01         9.61846E-01         1.02654E+02         1.00000E+00         3.89221E-04         1.02654E+02         4.73371E+01         5.53169E+01
+          1.53080E-02         6.47697E-03        -8.29727E-03         9.61809E-01         6.26284E-01         9.61845E-01         9.82657E+01         1.00000E+00         3.88257E-04         9.82657E+01         4.53051E+01         5.29606E+01
+          1.53080E-02         6.64680E-03        -8.36728E-03         9.61808E-01         6.36955E-01         9.61845E-01         9.39697E+01         1.00000E+00         3.87425E-04         9.39697E+01         4.33062E+01         5.06635E+01
+          1.53080E-02         6.81662E-03        -8.43911E-03         9.61807E-01         6.47625E-01         9.61844E-01         8.97691E+01         1.00000E+00         3.86730E-04         8.97691E+01         4.13422E+01         4.84268E+01
+          1.53080E-02         6.98645E-03        -8.51275E-03         9.61806E-01         6.58296E-01         9.61844E-01         8.56665E+01         1.00000E+00         3.86170E-04         8.56665E+01         3.94150E+01         4.62516E+01
+          1.53080E-02         7.15628E-03        -8.58819E-03         9.61805E-01         6.68966E-01         9.61843E-01         8.16646E+01         1.00000E+00         3.85750E-04         8.16646E+01         3.75260E+01         4.41386E+01
+          1.53080E-02         7.32611E-03        -8.66545E-03         9.61804E-01         6.79637E-01         9.61843E-01         7.77654E+01         1.00000E+00         3.85468E-04         7.77654E+01         3.56769E+01         4.20886E+01
+          1.53080E-02         7.49593E-03        -8.74453E-03         9.61803E-01         6.90307E-01         9.61842E-01         7.39712E+01         1.00000E+00         3.85327E-04         7.39712E+01         3.38691E+01         4.01021E+01
+          1.53080E-02         7.66576E-03        -8.82541E-03         9.61801E-01         7.00978E-01         9.61842E-01         7.02835E+01         1.00000E+00         3.85328E-04         7.02835E+01         3.21039E+01         3.81796E+01
+          1.53080E-02         7.83559E-03        -8.90811E-03         9.61800E-01         7.11649E-01         9.61841E-01         6.67039E+01         1.00000E+00         3.85471E-04         6.67039E+01         3.03826E+01         3.63212E+01
+          1.53080E-02         8.00542E-03        -8.99262E-03         9.61799E-01         7.22319E-01         9.61841E-01         6.32337E+01         1.00000E+00         3.85757E-04         6.32337E+01         2.87064E+01         3.45272E+01
+          1.53080E-02         8.17524E-03        -9.07894E-03         9.61797E-01         7.32990E-01         9.61840E-01         5.98739E+01         1.00000E+00         3.86185E-04         5.98739E+01         2.70764E+01         3.27976E+01
+          1.53080E-02         8.34507E-03        -9.16707E-03         9.61796E-01         7.43660E-01         9.61840E-01         5.66255E+01         1.00000E+00         3.86758E-04         5.66255E+01         2.54934E+01         3.11321E+01
+          1.53080E-02         8.51490E-03        -9.25702E-03         9.61795E-01         7.54331E-01         9.61839E-01         5.34889E+01         1.00000E+00         3.87473E-04         5.34889E+01         2.39583E+01         2.95306E+01
+          1.53080E-02         8.68473E-03        -9.34878E-03         9.61793E-01         7.65001E-01         9.61839E-01         5.04645E+01         1.00000E+00         3.88333E-04         5.04645E+01         2.24719E+01         2.79926E+01
+          1.53080E-02         8.85455E-03        -9.44235E-03         9.61792E-01         7.75672E-01         9.61838E-01         4.75526E+01         1.00000E+00         3.89336E-04         4.75526E+01         2.10349E+01         2.65177E+01
+          1.53080E-02         9.02438E-03        -9.53773E-03         9.61790E-01         7.86343E-01         9.61838E-01         4.47531E+01         1.00000E+00         3.90482E-04         4.47531E+01         1.96478E+01         2.51053E+01
+          1.53080E-02         9.19421E-03        -9.63492E-03         9.61789E-01         7.97013E-01         9.61837E-01         4.20657E+01         1.00000E+00         3.91771E-04         4.20657E+01         1.83110E+01         2.37547E+01
+          1.53080E-02         9.36403E-03        -9.73393E-03         9.61787E-01         8.07684E-01         9.61837E-01         3.94900E+01         1.00000E+00         3.93202E-04         3.94900E+01         1.70248E+01         2.24651E+01
+          1.53080E-02         9.53386E-03        -9.83475E-03         9.61786E-01         8.18354E-01         9.61836E-01         3.70253E+01         1.00000E+00         3.94776E-04         3.70253E+01         1.57896E+01         2.12357E+01
+          1.53080E-02         9.70369E-03        -9.93738E-03         9.61784E-01         8.29025E-01         9.61836E-01         3.46709E+01         1.00000E+00         3.96491E-04         3.46709E+01         1.46055E+01         2.00654E+01
+          1.53080E-02         9.87352E-03        -1.00418E-02         9.61783E-01         8.39695E-01         9.61835E-01         3.24258E+01         1.00000E+00         3.98347E-04         3.24258E+01         1.34725E+01         1.89533E+01
+          1.53080E-02         1.00433E-02        -1.01481E-02         9.61781E-01         8.50366E-01         9.61835E-01         3.02889E+01         1.00000E+00         4.00343E-04         3.02889E+01         1.23906E+01         1.78983E+01
+          1.53080E-02         1.02132E-02        -1.02561E-02         9.61779E-01         8.61037E-01         9.61834E-01         2.82587E+01         1.00000E+00         4.02477E-04         2.82587E+01         1.13595E+01         1.68991E+01
+          1.53080E-02         1.03830E-02        -1.03660E-02         9.61778E-01         8.71707E-01         9.61834E-01         2.63338E+01         1.00000E+00         4.04750E-04         2.63338E+01         1.03791E+01         1.59547E+01
+          1.53080E-02         1.05528E-02        -1.04777E-02         9.61776E-01         8.82378E-01         9.61833E-01         2.45127E+01         1.00000E+00         4.07160E-04         2.45127E+01         9.44909E+00         1.50636E+01
+          1.53080E-02         1.07227E-02        -1.05912E-02         9.61774E-01         8.93048E-01         9.61833E-01         2.27935E+01         1.00000E+00         4.09706E-04         2.27935E+01         8.56895E+00         1.42246E+01
+          1.53080E-02         1.08925E-02        -1.07065E-02         9.61773E-01         9.03719E-01         9.61832E-01         2.11745E+01         1.00000E+00         4.12386E-04         2.11745E+01         7.73820E+00         1.34363E+01
+          1.53080E-02         1.10623E-02        -1.08237E-02         9.61771E-01         9.14389E-01         9.61832E-01         1.96535E+01         1.00000E+00         4.15200E-04         1.96535E+01         6.95624E+00         1.26973E+01
+          1.53080E-02         1.12321E-02        -1.09426E-02         9.61769E-01         9.25060E-01         9.61831E-01         1.82285E+01         1.00000E+00         4.18145E-04         1.82285E+01         6.22239E+00         1.20062E+01
+          1.53080E-02         1.14020E-02        -1.10634E-02         9.61767E-01         9.35731E-01         9.61831E-01         1.68973E+01         1.00000E+00         4.21221E-04         1.68973E+01         5.53591E+00         1.13614E+01
+          1.53080E-02         1.15718E-02        -1.11859E-02         9.61765E-01         9.46401E-01         9.61830E-01         1.56576E+01         1.00000E+00         4.24426E-04         1.56576E+01         4.89594E+00         1.07616E+01
+          1.53080E-02         1.17416E-02        -1.13103E-02         9.61763E-01         9.57072E-01         9.61830E-01         1.45068E+01         1.00000E+00         4.27758E-04         1.45068E+01         4.30159E+00         1.02052E+01
+          1.53080E-02         1.19114E-02        -1.14365E-02         9.61761E-01         9.67742E-01         9.61829E-01         1.34427E+01         1.00000E+00         4.31216E-04         1.34427E+01         3.75189E+00         9.69076E+00
+          1.53080E-02         1.20813E-02        -1.15645E-02         9.61759E-01         9.78413E-01         9.61829E-01         1.24625E+01         1.00000E+00         4.34797E-04         1.24625E+01         3.24580E+00         9.21667E+00
+          1.53080E-02         1.22511E-02        -1.16943E-02         9.61757E-01         9.89083E-01         9.61829E-01         1.15636E+01         1.00000E+00         4.38501E-04         1.15636E+01         2.78221E+00         8.78142E+00
+          1.53080E-02         1.24209E-02        -1.18259E-02         9.61755E-01         9.99754E-01         9.61828E-01         1.07435E+01         1.00000E+00         4.42323E-04         1.07435E+01         2.35998E+00         8.38351E+00
+          1.53080E-02         1.25908E-02        -1.19594E-02         9.61753E-01         1.01042E+00         9.61828E-01         9.99929E+00         1.00000E+00         4.46264E-04         9.99929E+00         1.97790E+00         8.02139E+00
+          1.53080E-02         1.27606E-02        -1.20946E-02         9.61751E-01         1.02110E+00         9.61827E-01         9.32824E+00         1.00000E+00         4.50320E-04         9.32824E+00         1.63471E+00         7.69354E+00
+          1.53080E-02         1.29304E-02        -1.22317E-02         9.61749E-01         1.03177E+00         9.61827E-01         8.72755E+00         1.00000E+00         4.54489E-04         8.72755E+00         1.32911E+00         7.39844E+00
+          1.53080E-02         1.31002E-02        -1.23706E-02         9.61747E-01         1.04244E+00         9.61827E-01         8.19436E+00         1.00000E+00         4.58770E-04         8.19436E+00         1.05976E+00         7.13460E+00
+          1.53080E-02         1.32701E-02        -1.25113E-02         9.61745E-01         1.05311E+00         9.61826E-01         7.72581E+00         1.00000E+00         4.63158E-04         7.72581E+00         8.25285E-01         6.90052E+00
+          1.53080E-02         1.34399E-02        -1.26538E-02         9.61743E-01         1.06378E+00         9.61826E-01         7.31901E+00         1.00000E+00         4.67653E-04         7.31901E+00         6.24277E-01         6.69473E+00
+          1.53080E-02         1.36097E-02        -1.27981E-02         9.61741E-01         1.07445E+00         9.61826E-01         6.97108E+00         1.00000E+00         4.72251E-04         6.97108E+00         4.55300E-01         6.51577E+00
+          1.53080E-02         1.37795E-02        -1.29442E-02         9.61738E-01         1.08512E+00         9.61825E-01         6.67911E+00         1.00000E+00         4.76950E-04         6.67911E+00         3.16898E-01         6.36221E+00
+          1.53080E-02         1.39494E-02        -1.30921E-02         9.61736E-01         1.09579E+00         9.61825E-01         6.44023E+00         1.00000E+00         4.81747E-04         6.44023E+00         2.07595E-01         6.23264E+00
+          1.53080E-02         1.41192E-02        -1.32419E-02         9.61734E-01         1.10646E+00         9.61825E-01         6.25156E+00         1.00000E+00         4.86640E-04         6.25156E+00         1.25900E-01         6.12566E+00
+          1.53080E-02         1.42890E-02        -1.33934E-02         9.61731E-01         1.11713E+00         9.61825E-01         6.11022E+00         1.00000E+00         4.91625E-04         6.11022E+00         7.03122E-02         6.03991E+00
+          1.53080E-02         1.44589E-02        -1.35468E-02         9.61729E-01         1.12780E+00         9.61825E-01         6.01338E+00         1.00000E+00         4.96700E-04         6.01338E+00         3.93270E-02         5.97405E+00
+          1.53080E-02         1.46287E-02        -1.37020E-02         9.61727E-01         1.13847E+00         9.61824E-01         5.95821E+00         1.00000E+00         5.01862E-04         5.95821E+00         3.14365E-02         5.92677E+00
+          1.53080E-02         1.47985E-02        -1.38590E-02         9.61724E-01         1.14914E+00         9.61824E-01         5.94194E+00         1.00000E+00         5.07109E-04         5.94194E+00         4.51355E-02         5.89680E+00
+          1.53080E-02         1.49683E-02        -1.40178E-02         9.61722E-01         1.15981E+00         9.61824E-01         5.96181E+00         1.00000E+00         5.12436E-04         5.96181E+00         7.89252E-02         5.88289E+00
+          1.53080E-02         1.51382E-02        -1.41785E-02         9.61719E-01         1.17048E+00         9.61824E-01         6.01512E+00         1.00000E+00         5.17842E-04         6.01512E+00         1.31317E-01         5.88380E+00
+          1.53080E-02         1.53080E-02        -1.43409E-02         9.61717E-01         1.18115E+00         9.61824E-01         6.09919E+00         1.00000E+00         5.23322E-04         6.09919E+00         2.00837E-01         5.89835E+00
+          1.53080E-02         1.54778E-02        -1.45051E-02         9.61714E-01         1.19182E+00         9.61824E-01         6.21142E+00         1.00000E+00         5.28876E-04         6.21142E+00         2.86028E-01         5.92539E+00
+          1.53080E-02         1.56476E-02        -1.46712E-02         9.61712E-01         1.20249E+00         9.61824E-01         6.34925E+00         1.00000E+00         5.34498E-04         6.34925E+00         3.85453E-01         5.96379E+00
+          1.53080E-02         1.58175E-02        -1.48391E-02         9.61709E-01         1.21317E+00         9.61824E-01         6.51016E+00         1.00000E+00         5.40187E-04         6.51016E+00         4.97702E-01         6.01246E+00
+          1.53080E-02         1.59873E-02        -1.50088E-02         9.61707E-01         1.22384E+00         9.61824E-01         6.69171E+00         1.00000E+00         5.45940E-04         6.69171E+00         6.21389E-01         6.07032E+00
+          1.53080E-02         1.61571E-02        -1.51803E-02         9.61704E-01         1.23451E+00         9.61824E-01         6.89153E+00         1.00000E+00         5.51754E-04         6.89153E+00         7.55162E-01         6.13637E+00
+          1.53080E-02         1.63270E-02        -1.53536E-02         9.61701E-01         1.24518E+00         9.61824E-01         7.10730E+00         1.00000E+00         5.57625E-04         7.10730E+00         8.97700E-01         6.20959E+00
+          1.53080E-02         1.64968E-02        -1.55287E-02         9.61699E-01         1.25585E+00         9.61824E-01         7.33676E+00         1.00000E+00         5.63551E-04         7.33676E+00         1.04772E+00         6.28904E+00
+          1.53080E-02         1.66666E-02        -1.57057E-02         9.61696E-01         1.26652E+00         9.61824E-01         7.57775E+00         1.00000E+00         5.69530E-04         7.57775E+00         1.20398E+00         6.37377E+00
+          1.53080E-02         1.68364E-02        -1.58844E-02         9.61693E-01         1.27719E+00         9.61824E-01         7.82816E+00         1.00000E+00         5.75559E-04         7.82816E+00         1.36526E+00         6.46290E+00
+          1.53080E-02         1.70063E-02        -1.60650E-02         9.61691E-01         1.28786E+00         9.61825E-01         8.08598E+00         1.00000E+00         5.81634E-04         8.08598E+00         1.53042E+00         6.55556E+00
+          1.53080E-02         1.71761E-02        -1.62473E-02         9.61688E-01         1.29853E+00         9.61825E-01         8.34925E+00         1.00000E+00         5.87754E-04         8.34925E+00         1.69832E+00         6.65092E+00
+          1.53080E-02         1.73459E-02        -1.64315E-02         9.61685E-01         1.30920E+00         9.61825E-01         8.61610E+00         1.00000E+00         5.93915E-04         8.61610E+00         1.86791E+00         6.74819E+00
+          1.53080E-02         1.75158E-02        -1.66175E-02         9.61682E-01         1.31987E+00         9.61826E-01         8.88476E+00         1.00000E+00         6.00116E-04         8.88476E+00         2.03817E+00         6.84659E+00
+          1.53080E-02         1.76856E-02        -1.68054E-02         9.61679E-01         1.33054E+00         9.61826E-01         9.15350E+00         1.00000E+00         6.06354E-04         9.15350E+00         2.20810E+00         6.94540E+00
+          1.53080E-02         1.78554E-02        -1.69950E-02         9.61676E-01         1.34121E+00         9.61826E-01         9.42072E+00         1.00000E+00         6.12626E-04         9.42072E+00         2.37681E+00         7.04392E+00
+          1.53080E-02         1.80252E-02        -1.71864E-02         9.61673E-01         1.35188E+00         9.61827E-01         9.68488E+00         1.00000E+00         6.18930E-04         9.68488E+00         2.54341E+00         7.14147E+00
+          1.53080E-02         1.81951E-02        -1.73797E-02         9.61670E-01         1.36255E+00         9.61827E-01         9.94452E+00         1.00000E+00         6.25264E-04         9.94452E+00         2.70709E+00         7.23743E+00
+          1.53080E-02         1.83649E-02        -1.75748E-02         9.61667E-01         1.37322E+00         9.61828E-01         1.01983E+01         1.00000E+00         6.31625E-04         1.01983E+01         2.86708E+00         7.33119E+00
+          1.53080E-02         1.85347E-02        -1.77716E-02         9.61664E-01         1.38389E+00         9.61829E-01         1.04449E+01         1.00000E+00         6.38013E-04         1.04449E+01         3.02267E+00         7.42219E+00
+          1.53080E-02         1.87045E-02        -1.79703E-02         9.61661E-01         1.39457E+00         9.61829E-01         1.06831E+01         1.00000E+00         6.44423E-04         1.06831E+01         3.17320E+00         7.50987E+00
+          1.53080E-02         1.88744E-02        -1.81708E-02         9.61658E-01         1.40524E+00         9.61830E-01         1.09118E+01         1.00000E+00         6.50855E-04         1.09118E+01         3.31808E+00         7.59373E+00
+          1.53080E-02         1.90442E-02        -1.83732E-02         9.61655E-01         1.41591E+00         9.61831E-01         1.11300E+01         1.00000E+00         6.57305E-04         1.11300E+01         3.45674E+00         7.67331E+00
+          1.53080E-02         1.92140E-02        -1.85773E-02         9.61652E-01         1.42658E+00         9.61832E-01         1.13368E+01         1.00000E+00         6.63773E-04         1.13368E+01         3.58869E+00         7.74814E+00
+          1.53080E-02         1.93839E-02        -1.87832E-02         9.61649E-01         1.43725E+00         9.61832E-01         1.15313E+01         1.00000E+00         6.70256E-04         1.15313E+01         3.71348E+00         7.81782E+00
+          1.53080E-02         1.95537E-02        -1.89910E-02         9.61646E-01         1.44792E+00         9.61833E-01         1.17127E+01         1.00000E+00         6.76752E-04         1.17127E+01         3.83072E+00         7.88197E+00
+          1.53080E-02         1.97235E-02        -1.92006E-02         9.61643E-01         1.45859E+00         9.61834E-01         1.18803E+01         1.00000E+00         6.83258E-04         1.18803E+01         3.94007E+00         7.94024E+00
+          1.53080E-02         1.98933E-02        -1.94119E-02         9.61639E-01         1.46926E+00         9.61835E-01         1.20335E+01         1.00000E+00         6.89774E-04         1.20335E+01         4.04123E+00         7.99230E+00
+          1.53080E-02         2.00632E-02        -1.96251E-02         9.61636E-01         1.47993E+00         9.61836E-01         1.21718E+01         1.00000E+00         6.96296E-04         1.21718E+01         4.13396E+00         8.03787E+00
+          1.53080E-02         2.02330E-02        -1.98401E-02         9.61633E-01         1.49060E+00         9.61837E-01         1.22947E+01         1.00000E+00         7.02824E-04         1.22947E+01         4.21806E+00         8.07668E+00
+          1.53080E-02         2.04028E-02        -2.00570E-02         9.61629E-01         1.50127E+00         9.61839E-01         1.24019E+01         1.00000E+00         7.09354E-04         1.24019E+01         4.29337E+00         8.10852E+00
+          1.53080E-02         2.05726E-02        -2.02756E-02         9.61626E-01         1.51194E+00         9.61840E-01         1.24930E+01         1.00000E+00         7.15884E-04         1.24930E+01         4.35981E+00         8.13317E+00
+          1.53080E-02         2.07425E-02        -2.04961E-02         9.61623E-01         1.52261E+00         9.61841E-01         1.25678E+01         1.00000E+00         7.22413E-04         1.25678E+01         4.41729E+00         8.15047E+00
+          1.53080E-02         2.09123E-02        -2.07183E-02         9.61619E-01         1.53328E+00         9.61842E-01         1.26261E+01         1.00000E+00         7.28939E-04         1.26261E+01         4.46580E+00         8.16029E+00
+          1.53080E-02         2.10821E-02        -2.09424E-02         9.61616E-01         1.54395E+00         9.61844E-01         1.26679E+01         1.00000E+00         7.35458E-04         1.26679E+01         4.50537E+00         8.16251E+00
+          1.53080E-02         2.12520E-02        -2.11683E-02         9.61612E-01         1.55462E+00         9.61845E-01         1.26931E+01         1.00000E+00         7.41969E-04         1.26931E+01         4.53603E+00         8.15706E+00
+          1.53080E-02         2.14218E-02        -2.13960E-02         9.61609E-01         1.56529E+00         9.61847E-01         1.27018E+01         1.00000E+00         7.48469E-04         1.27018E+01         4.55790E+00         8.14388E+00
+          1.53080E-02         2.15916E-02        -2.16255E-02         9.61605E-01         1.57596E+00         9.61849E-01         1.26940E+01         1.00000E+00         7.54956E-04         1.26940E+01         4.57108E+00         8.12295E+00
+          1.53080E-02         2.17614E-02        -2.18568E-02         9.61602E-01         1.58664E+00         9.61850E-01         1.26700E+01         1.00000E+00         7.61427E-04         1.26700E+01         4.57575E+00         8.09428E+00
+          1.53080E-02         2.19313E-02        -2.20900E-02         9.61598E-01         1.59731E+00         9.61852E-01         1.26300E+01         1.00000E+00         7.67880E-04         1.26300E+01         4.57209E+00         8.05789E+00
+          1.53080E-02         2.21011E-02        -2.23249E-02         9.61595E-01         1.60798E+00         9.61854E-01         1.25742E+01         1.00000E+00         7.74313E-04         1.25742E+01         4.56032E+00         8.01386E+00
+          1.53080E-02         2.22709E-02        -2.25617E-02         9.61591E-01         1.61865E+00         9.61856E-01         1.25029E+01         1.00000E+00         7.80722E-04         1.25029E+01         4.54067E+00         7.96226E+00
+          1.53080E-02         2.24407E-02        -2.28003E-02         9.61587E-01         1.62932E+00         9.61858E-01         1.24166E+01         1.00000E+00         7.87105E-04         1.24166E+01         4.51341E+00         7.90320E+00
+          1.53080E-02         2.26106E-02        -2.30407E-02         9.61584E-01         1.63999E+00         9.61860E-01         1.23157E+01         1.00000E+00         7.93459E-04         1.23157E+01         4.47884E+00         7.83683E+00
+          1.53080E-02         2.27804E-02        -2.32829E-02         9.61580E-01         1.65066E+00         9.61862E-01         1.22005E+01         1.00000E+00         7.99782E-04         1.22005E+01         4.43724E+00         7.76330E+00
+          1.53080E-02         2.29502E-02        -2.35269E-02         9.61576E-01         1.66133E+00         9.61864E-01         1.20718E+01         1.00000E+00         8.06070E-04         1.20718E+01         4.38896E+00         7.68280E+00
+          1.53080E-02         2.31201E-02        -2.37727E-02         9.61573E-01         1.67200E+00         9.61866E-01         1.19299E+01         1.00000E+00         8.12321E-04         1.19299E+01         4.33432E+00         7.59554E+00
+          1.53080E-02         2.32899E-02        -2.40204E-02         9.61569E-01         1.68267E+00         9.61869E-01         1.17754E+01         1.00000E+00         8.18533E-04         1.17754E+01         4.27368E+00         7.50174E+00
+          1.53080E-02         2.34597E-02        -2.42698E-02         9.61565E-01         1.69334E+00         9.61871E-01         1.16090E+01         1.00000E+00         8.24701E-04         1.16090E+01         4.20740E+00         7.40165E+00
+          1.53080E-02         2.36295E-02        -2.45211E-02         9.61561E-01         1.70401E+00         9.61874E-01         1.14314E+01         1.00000E+00         8.30824E-04         1.14314E+01         4.13585E+00         7.29554E+00
+          1.53080E-02         2.37994E-02        -2.47742E-02         9.61557E-01         1.71468E+00         9.61876E-01         1.12431E+01         1.00000E+00         8.36899E-04         1.12431E+01         4.05941E+00         7.18370E+00
+          1.53080E-02         2.39692E-02        -2.50291E-02         9.61553E-01         1.72535E+00         9.61879E-01         1.10449E+01         1.00000E+00         8.42923E-04         1.10449E+01         3.97846E+00         7.06644E+00
+          1.53080E-02         2.41390E-02        -2.52858E-02         9.61549E-01         1.73602E+00         9.61882E-01         1.08375E+01         1.00000E+00         8.48892E-04         1.08375E+01         3.89339E+00         6.94407E+00
+          1.53080E-02         2.43088E-02        -2.55443E-02         9.61545E-01         1.74669E+00         9.61885E-01         1.06215E+01         1.00000E+00         8.54805E-04         1.06215E+01         3.80459E+00         6.81694E+00
+          1.53080E-02         2.44787E-02        -2.58047E-02         9.61541E-01         1.75736E+00         9.61888E-01         1.03978E+01         1.00000E+00         8.60660E-04         1.03978E+01         3.71245E+00         6.68538E+00
+          1.53080E-02         2.46485E-02        -2.60668E-02         9.61537E-01         1.76804E+00         9.61891E-01         1.01671E+01         1.00000E+00         8.66452E-04         1.01671E+01         3.61735E+00         6.54977E+00
+          1.53080E-02         2.48183E-02        -2.63308E-02         9.61533E-01         1.77871E+00         9.61894E-01         9.93014E+00         1.00000E+00         8.72180E-04         9.93014E+00         3.51967E+00         6.41047E+00
+          1.53080E-02         2.49882E-02        -2.65966E-02         9.61529E-01         1.78938E+00         9.61897E-01         9.68767E+00         1.00000E+00         8.77841E-04         9.68767E+00         3.41980E+00         6.26787E+00
+          1.53080E-02         2.51580E-02        -2.68642E-02         9.61525E-01         1.80005E+00         9.61900E-01         9.44046E+00         1.00000E+00         8.83434E-04         9.44046E+00         3.31811E+00         6.12235E+00
+          1.53080E-02         2.53278E-02        -2.71336E-02         9.61521E-01         1.81072E+00         9.61904E-01         9.18929E+00         1.00000E+00         8.88955E-04         9.18929E+00         3.21497E+00         5.97432E+00
+          1.53080E-02         2.54976E-02        -2.74048E-02         9.61517E-01         1.82139E+00         9.61907E-01         8.93489E+00         1.00000E+00         8.94403E-04         8.93489E+00         3.11072E+00         5.82417E+00
+          1.53080E-02         2.56675E-02        -2.76779E-02         9.61513E-01         1.83206E+00         9.61911E-01         8.67804E+00         1.00000E+00         8.99776E-04         8.67804E+00         3.00572E+00         5.67232E+00
+          1.53080E-02         2.58373E-02        -2.79527E-02         9.61509E-01         1.84273E+00         9.61915E-01         8.41947E+00         1.00000E+00         9.05072E-04         8.41947E+00         2.90030E+00         5.51917E+00
+          1.53080E-02         2.60071E-02        -2.82294E-02         9.61504E-01         1.85340E+00         9.61919E-01         8.15991E+00         1.00000E+00         9.10289E-04         8.15991E+00         2.79479E+00         5.36512E+00
+          1.53080E-02         2.61769E-02        -2.85079E-02         9.61500E-01         1.86407E+00         9.61923E-01         7.90009E+00         1.00000E+00         9.15425E-04         7.90009E+00         2.68950E+00         5.21059E+00
+          1.54778E-02         8.72665E-04        -7.16767E-03         9.72500E-01         2.74155E-01         9.72526E-01         2.52594E+02         1.00000E+00         3.42591E-04         2.52594E+02         1.11652E+02         1.40942E+02
+          1.54778E-02         1.04249E-03        -7.17789E-03         9.72500E-01         2.84826E-01         9.72526E-01         2.48262E+02         1.00000E+00         3.40543E-04         2.48262E+02         1.09946E+02         1.38316E+02
+          1.54778E-02         1.21232E-03        -7.18992E-03         9.72499E-01         2.95496E-01         9.72526E-01         2.43835E+02         1.00000E+00         3.38472E-04         2.43835E+02         1.08195E+02         1.35639E+02
+          1.54778E-02         1.38215E-03        -7.20376E-03         9.72499E-01         3.06167E-01         9.72526E-01         2.39318E+02         1.00000E+00         3.36383E-04         2.39318E+02         1.06402E+02         1.32916E+02
+          1.54778E-02         1.55197E-03        -7.21941E-03         9.72499E-01         3.16838E-01         9.72526E-01         2.34720E+02         1.00000E+00         3.34280E-04         2.34720E+02         1.04569E+02         1.30151E+02
+          1.54778E-02         1.72180E-03        -7.23687E-03         9.72499E-01         3.27508E-01         9.72526E-01         2.30047E+02         1.00000E+00         3.32170E-04         2.30047E+02         1.02699E+02         1.27348E+02
+          1.54778E-02         1.89163E-03        -7.25615E-03         9.72498E-01         3.38179E-01         9.72526E-01         2.25306E+02         1.00000E+00         3.30058E-04         2.25306E+02         1.00793E+02         1.24514E+02
+          1.54778E-02         2.06146E-03        -7.27724E-03         9.72498E-01         3.48849E-01         9.72525E-01         2.20504E+02         1.00000E+00         3.27948E-04         2.20504E+02         9.88531E+01         1.21651E+02
+          1.54778E-02         2.23128E-03        -7.30014E-03         9.72498E-01         3.59520E-01         9.72525E-01         2.15648E+02         1.00000E+00         3.25846E-04         2.15648E+02         9.68829E+01         1.18765E+02
+          1.54778E-02         2.40111E-03        -7.32485E-03         9.72497E-01         3.70190E-01         9.72525E-01         2.10744E+02         1.00000E+00         3.23757E-04         2.10744E+02         9.48844E+01         1.15860E+02
+          1.54778E-02         2.57094E-03        -7.35138E-03         9.72497E-01         3.80861E-01         9.72525E-01         2.05800E+02         1.00000E+00         3.21686E-04         2.05800E+02         9.28598E+01         1.12941E+02
+          1.54778E-02         2.74077E-03        -7.37971E-03         9.72497E-01         3.91532E-01         9.72525E-01         2.00823E+02         1.00000E+00         3.19638E-04         2.00823E+02         9.08117E+01         1.10012E+02
+          1.54778E-02         2.91059E-03        -7.40986E-03         9.72496E-01         4.02202E-01         9.72524E-01         1.95820E+02         1.00000E+00         3.17619E-04         1.95820E+02         8.87426E+01         1.07077E+02
+          1.54778E-02         3.08042E-03        -7.44182E-03         9.72496E-01         4.12873E-01         9.72524E-01         1.90796E+02         1.00000E+00         3.15632E-04         1.90796E+02         8.66549E+01         1.04142E+02
+          1.54778E-02         3.25025E-03        -7.47559E-03         9.72495E-01         4.23543E-01         9.72524E-01         1.85760E+02         1.00000E+00         3.13682E-04         1.85760E+02         8.45511E+01         1.01209E+02
+          1.54778E-02         3.42008E-03        -7.51118E-03         9.72495E-01         4.34214E-01         9.72524E-01         1.80717E+02         1.00000E+00         3.11775E-04         1.80717E+02         8.24337E+01         9.82833E+01
+          1.54778E-02         3.58990E-03        -7.54857E-03         9.72494E-01         4.44884E-01         9.72523E-01         1.75674E+02         1.00000E+00         3.09915E-04         1.75674E+02         8.03053E+01         9.53687E+01
+          1.54778E-02         3.75973E-03        -7.58778E-03         9.72493E-01         4.55555E-01         9.72523E-01         1.70637E+02         1.00000E+00         3.08105E-04         1.70637E+02         7.81683E+01         9.24691E+01
+          1.54778E-02         3.92956E-03        -7.62880E-03         9.72493E-01         4.66225E-01         9.72523E-01         1.65613E+02         1.00000E+00         3.06351E-04         1.65613E+02         7.60252E+01         8.95881E+01
+          1.54778E-02         4.09939E-03        -7.67163E-03         9.72492E-01         4.76896E-01         9.72522E-01         1.60608E+02         1.00000E+00         3.04656E-04         1.60608E+02         7.38785E+01         8.67293E+01
+          1.54778E-02         4.26921E-03        -7.71628E-03         9.72491E-01         4.87567E-01         9.72522E-01         1.55627E+02         1.00000E+00         3.03024E-04         1.55627E+02         7.17306E+01         8.38962E+01
+          1.54778E-02         4.43904E-03        -7.76273E-03         9.72491E-01         4.98237E-01         9.72522E-01         1.50676E+02         1.00000E+00         3.01459E-04         1.50676E+02         6.95841E+01         8.10922E+01
+          1.54778E-02         4.60887E-03        -7.81100E-03         9.72490E-01         5.08908E-01         9.72521E-01         1.45762E+02         1.00000E+00         2.99964E-04         1.45762E+02         6.74414E+01         7.83203E+01
+          1.54778E-02         4.77869E-03        -7.86108E-03         9.72489E-01         5.19578E-01         9.72521E-01         1.40888E+02         1.00000E+00         2.98543E-04         1.40888E+02         6.53048E+01         7.55837E+01
+          1.54778E-02         4.94852E-03        -7.91297E-03         9.72488E-01         5.30249E-01         9.72520E-01         1.36062E+02         1.00000E+00         2.97199E-04         1.36062E+02         6.31767E+01         7.28851E+01
+          1.54778E-02         5.11835E-03        -7.96668E-03         9.72487E-01         5.40919E-01         9.72520E-01         1.31287E+02         1.00000E+00         2.95935E-04         1.31287E+02         6.10595E+01         7.02273E+01
+          1.54778E-02         5.28818E-03        -8.02219E-03         9.72487E-01         5.51590E-01         9.72520E-01         1.26568E+02         1.00000E+00         2.94754E-04         1.26568E+02         5.89555E+01         6.76128E+01
+          1.54778E-02         5.45800E-03        -8.07952E-03         9.72486E-01         5.62261E-01         9.72519E-01         1.21911E+02         1.00000E+00         2.93659E-04         1.21911E+02         5.68668E+01         6.50440E+01
+          1.54778E-02         5.62783E-03        -8.13866E-03         9.72485E-01         5.72931E-01         9.72519E-01         1.17319E+02         1.00000E+00         2.92651E-04         1.17319E+02         5.47958E+01         6.25231E+01
+          1.54778E-02         5.79766E-03        -8.19961E-03         9.72484E-01         5.83602E-01         9.72518E-01         1.12797E+02         1.00000E+00         2.91734E-04         1.12797E+02         5.27445E+01         6.00522E+01
+          1.54778E-02         5.96749E-03        -8.26238E-03         9.72483E-01         5.94272E-01         9.72518E-01         1.08348E+02         1.00000E+00         2.90910E-04         1.08348E+02         5.07150E+01         5.76331E+01
+          1.54778E-02         6.13731E-03        -8.32695E-03         9.72482E-01         6.04943E-01         9.72518E-01         1.03977E+02         1.00000E+00         2.90180E-04         1.03977E+02         4.87095E+01         5.52675E+01
+          1.54778E-02         6.30714E-03        -8.39334E-03         9.72481E-01         6.15613E-01         9.72517E-01         9.96867E+01         1.00000E+00         2.89547E-04         9.96867E+01         4.67298E+01         5.29570E+01
+          1.54778E-02         6.47697E-03        -8.46154E-03         9.72480E-01         6.26284E-01         9.72517E-01         9.54807E+01         1.00000E+00         2.89012E-04         9.54807E+01         4.47778E+01         5.07029E+01
+          1.54778E-02         6.64680E-03        -8.53155E-03         9.72479E-01         6.36955E-01         9.72516E-01         9.13620E+01         1.00000E+00         2.88576E-04         9.13620E+01         4.28555E+01         4.85065E+01
+          1.54778E-02         6.81662E-03        -8.60338E-03         9.72478E-01         6.47625E-01         9.72516E-01         8.73334E+01         1.00000E+00         2.88242E-04         8.73334E+01         4.09645E+01         4.63689E+01
+          1.54778E-02         6.98645E-03        -8.67701E-03         9.72476E-01         6.58296E-01         9.72515E-01         8.33975E+01         1.00000E+00         2.88010E-04         8.33975E+01         3.91066E+01         4.42908E+01
+          1.54778E-02         7.15628E-03        -8.75246E-03         9.72475E-01         6.68966E-01         9.72515E-01         7.95566E+01         1.00000E+00         2.87881E-04         7.95566E+01         3.72834E+01         4.22732E+01
+          1.54778E-02         7.32611E-03        -8.82972E-03         9.72474E-01         6.79637E-01         9.72514E-01         7.58129E+01         1.00000E+00         2.87857E-04         7.58129E+01         3.54964E+01         4.03165E+01
+          1.54778E-02         7.49593E-03        -8.90879E-03         9.72473E-01         6.90307E-01         9.72514E-01         7.21683E+01         1.00000E+00         2.87938E-04         7.21683E+01         3.37470E+01         3.84213E+01
+          1.54778E-02         7.66576E-03        -8.98968E-03         9.72472E-01         7.00978E-01         9.72513E-01         6.86244E+01         1.00000E+00         2.88125E-04         6.86244E+01         3.20366E+01         3.65878E+01
+          1.54778E-02         7.83559E-03        -9.07237E-03         9.72470E-01         7.11649E-01         9.72513E-01         6.51827E+01         1.00000E+00         2.88419E-04         6.51827E+01         3.03665E+01         3.48162E+01
+          1.54778E-02         8.00542E-03        -9.15688E-03         9.72469E-01         7.22319E-01         9.72512E-01         6.18444E+01         1.00000E+00         2.88821E-04         6.18444E+01         2.87378E+01         3.31065E+01
+          1.54778E-02         8.17524E-03        -9.24320E-03         9.72468E-01         7.32990E-01         9.72512E-01         5.86105E+01         1.00000E+00         2.89330E-04         5.86105E+01         2.71518E+01         3.14587E+01
+          1.54778E-02         8.34507E-03        -9.33134E-03         9.72466E-01         7.43660E-01         9.72511E-01         5.54817E+01         1.00000E+00         2.89947E-04         5.54817E+01         2.56092E+01         2.98725E+01
+          1.54778E-02         8.51490E-03        -9.42128E-03         9.72465E-01         7.54331E-01         9.72511E-01         5.24588E+01         1.00000E+00         2.90673E-04         5.24588E+01         2.41112E+01         2.83476E+01
+          1.54778E-02         8.68473E-03        -9.51304E-03         9.72464E-01         7.65001E-01         9.72510E-01         4.95420E+01         1.00000E+00         2.91507E-04         4.95420E+01         2.26584E+01         2.68836E+01
+          1.54778E-02         8.85455E-03        -9.60661E-03         9.72462E-01         7.75672E-01         9.72510E-01         4.67316E+01         1.00000E+00         2.92450E-04         4.67316E+01         2.12516E+01         2.54799E+01
+          1.54778E-02         9.02438E-03        -9.70199E-03         9.72461E-01         7.86343E-01         9.72509E-01         4.40274E+01         1.00000E+00         2.93502E-04         4.40274E+01         1.98914E+01         2.41359E+01
+          1.54778E-02         9.19421E-03        -9.79918E-03         9.72459E-01         7.97013E-01         9.72508E-01         4.14293E+01         1.00000E+00         2.94662E-04         4.14293E+01         1.85784E+01         2.28509E+01
+          1.54778E-02         9.36403E-03        -9.89819E-03         9.72458E-01         8.07684E-01         9.72508E-01         3.89369E+01         1.00000E+00         2.95931E-04         3.89369E+01         1.73130E+01         2.16239E+01
+          1.54778E-02         9.53386E-03        -9.99901E-03         9.72456E-01         8.18354E-01         9.72507E-01         3.65496E+01         1.00000E+00         2.97308E-04         3.65496E+01         1.60954E+01         2.04542E+01
+          1.54778E-02         9.70369E-03        -1.01016E-02         9.72454E-01         8.29025E-01         9.72507E-01         3.42666E+01         1.00000E+00         2.98793E-04         3.42666E+01         1.49260E+01         1.93406E+01
+          1.54778E-02         9.87352E-03        -1.02061E-02         9.72453E-01         8.39695E-01         9.72506E-01         3.20872E+01         1.00000E+00         3.00386E-04         3.20872E+01         1.38049E+01         1.82823E+01
+          1.54778E-02         1.00433E-02        -1.03123E-02         9.72451E-01         8.50366E-01         9.72506E-01         3.00101E+01         1.00000E+00         3.02086E-04         3.00101E+01         1.27321E+01         1.72780E+01
+          1.54778E-02         1.02132E-02        -1.04204E-02         9.72449E-01         8.61037E-01         9.72505E-01         2.80342E+01         1.00000E+00         3.03893E-04         2.80342E+01         1.17077E+01         1.63266E+01
+          1.54778E-02         1.03830E-02        -1.05303E-02         9.72448E-01         8.71707E-01         9.72505E-01         2.61582E+01         1.00000E+00         3.05806E-04         2.61582E+01         1.07314E+01         1.54268E+01
+          1.54778E-02         1.05528E-02        -1.06420E-02         9.72446E-01         8.82378E-01         9.72504E-01         2.43805E+01         1.00000E+00         3.07824E-04         2.43805E+01         9.80306E+00         1.45775E+01
+          1.54778E-02         1.07227E-02        -1.07555E-02         9.72444E-01         8.93048E-01         9.72504E-01         2.26996E+01         1.00000E+00         3.09948E-04         2.26996E+01         8.92238E+00         1.37772E+01
+          1.54778E-02         1.08925E-02        -1.08708E-02         9.72443E-01         9.03719E-01         9.72503E-01         2.11136E+01         1.00000E+00         3.12176E-04         2.11136E+01         8.08896E+00         1.30247E+01
+          1.54778E-02         1.10623E-02        -1.09879E-02         9.72441E-01         9.14389E-01         9.72503E-01         1.96208E+01         1.00000E+00         3.14506E-04         1.96208E+01         7.30232E+00         1.23185E+01
+          1.54778E-02         1.12321E-02        -1.11069E-02         9.72439E-01         9.25060E-01         9.72502E-01         1.82192E+01         1.00000E+00         3.16940E-04         1.82192E+01         6.56190E+00         1.16573E+01
+          1.54778E-02         1.14020E-02        -1.12276E-02         9.72437E-01         9.35731E-01         9.72502E-01         1.69067E+01         1.00000E+00         3.19474E-04         1.69067E+01         5.86708E+00         1.10397E+01
+          1.54778E-02         1.15718E-02        -1.13502E-02         9.72435E-01         9.46401E-01         9.72501E-01         1.56813E+01         1.00000E+00         3.22109E-04         1.56813E+01         5.21715E+00         1.04641E+01
+          1.54778E-02         1.17416E-02        -1.14746E-02         9.72433E-01         9.57072E-01         9.72501E-01         1.45406E+01         1.00000E+00         3.24842E-04         1.45406E+01         4.61134E+00         9.92926E+00
+          1.54778E-02         1.19114E-02        -1.16007E-02         9.72431E-01         9.67742E-01         9.72500E-01         1.34824E+01         1.00000E+00         3.27673E-04         1.34824E+01         4.04878E+00         9.43361E+00
+          1.54778E-02         1.20813E-02        -1.17287E-02         9.72429E-01         9.78413E-01         9.72500E-01         1.25043E+01         1.00000E+00         3.30601E-04         1.25043E+01         3.52858E+00         8.97572E+00
+          1.54778E-02         1.22511E-02        -1.18586E-02         9.72427E-01         9.89083E-01         9.72500E-01         1.16039E+01         1.00000E+00         3.33624E-04         1.16039E+01         3.04975E+00         8.55414E+00
+          1.54778E-02         1.24209E-02        -1.19902E-02         9.72425E-01         9.99754E-01         9.72499E-01         1.07787E+01         1.00000E+00         3.36740E-04         1.07787E+01         2.61127E+00         8.16741E+00
+          1.54778E-02         1.25908E-02        -1.21236E-02         9.72423E-01         1.01042E+00         9.72499E-01         1.00261E+01         1.00000E+00         3.39948E-04         1.00261E+01         2.21205E+00         7.81408E+00
+          1.54778E-02         1.27606E-02        -1.22589E-02         9.72421E-01         1.02110E+00         9.72498E-01         9.34369E+00         1.00000E+00         3.43246E-04         9.34369E+00         1.85095E+00         7.49274E+00
+          1.54778E-02         1.29304E-02        -1.23959E-02         9.72419E-01         1.03177E+00         9.72498E-01         8.72874E+00         1.00000E+00         3.46633E-04         8.72874E+00         1.52679E+00         7.20194E+00
+          1.54778E-02         1.31002E-02        -1.25348E-02         9.72417E-01         1.04244E+00         9.72498E-01         8.17865E+00         1.00000E+00         3.50107E-04         8.17865E+00         1.23835E+00         6.94030E+00
+          1.54778E-02         1.32701E-02        -1.26755E-02         9.72415E-01         1.05311E+00         9.72497E-01         7.69077E+00         1.00000E+00         3.53666E-04         7.69077E+00         9.84349E-01         6.70642E+00
+          1.54778E-02         1.34399E-02        -1.28180E-02         9.72412E-01         1.06378E+00         9.72497E-01         7.26244E+00         1.00000E+00         3.57308E-04         7.26244E+00         7.63496E-01         6.49894E+00
+          1.54778E-02         1.36097E-02        -1.29623E-02         9.72410E-01         1.07445E+00         9.72497E-01         6.89097E+00         1.00000E+00         3.61031E-04         6.89097E+00         5.74459E-01         6.31651E+00
+          1.54778E-02         1.37795E-02        -1.31084E-02         9.72408E-01         1.08512E+00         9.72496E-01         6.57369E+00         1.00000E+00         3.64833E-04         6.57369E+00         4.15881E-01         6.15781E+00
+          1.54778E-02         1.39494E-02        -1.32564E-02         9.72406E-01         1.09579E+00         9.72496E-01         6.30792E+00         1.00000E+00         3.68713E-04         6.30792E+00         2.86381E-01         6.02154E+00
+          1.54778E-02         1.41192E-02        -1.34061E-02         9.72403E-01         1.10646E+00         9.72496E-01         6.09099E+00         1.00000E+00         3.72667E-04         6.09099E+00         1.84562E-01         5.90643E+00
+          1.54778E-02         1.42890E-02        -1.35577E-02         9.72401E-01         1.11713E+00         9.72495E-01         5.92025E+00         1.00000E+00         3.76694E-04         5.92025E+00         1.09011E-01         5.81123E+00
+          1.54778E-02         1.44589E-02        -1.37111E-02         9.72399E-01         1.12780E+00         9.72495E-01         5.79305E+00         1.00000E+00         3.80792E-04         5.79305E+00         5.83055E-02         5.73474E+00
+          1.54778E-02         1.46287E-02        -1.38663E-02         9.72396E-01         1.13847E+00         9.72495E-01         5.70678E+00         1.00000E+00         3.84958E-04         5.70678E+00         3.10161E-02         5.67577E+00
+          1.54778E-02         1.47985E-02        -1.40233E-02         9.72394E-01         1.14914E+00         9.72495E-01         5.65886E+00         1.00000E+00         3.89191E-04         5.65886E+00         2.57116E-02         5.63314E+00
+          1.54778E-02         1.49683E-02        -1.41821E-02         9.72391E-01         1.15981E+00         9.72495E-01         5.64671E+00         1.00000E+00         3.93488E-04         5.64671E+00         4.09624E-02         5.60575E+00
+          1.54778E-02         1.51382E-02        -1.43427E-02         9.72389E-01         1.17048E+00         9.72495E-01         5.66783E+00         1.00000E+00         3.97847E-04         5.66783E+00         7.53439E-02         5.59249E+00
+          1.54778E-02         1.53080E-02        -1.45051E-02         9.72386E-01         1.18115E+00         9.72494E-01         5.71973E+00         1.00000E+00         4.02266E-04         5.71973E+00         1.27441E-01         5.59229E+00
+          1.54778E-02         1.54778E-02        -1.46694E-02         9.72384E-01         1.19182E+00         9.72494E-01         5.79997E+00         1.00000E+00         4.06742E-04         5.79997E+00         1.95850E-01         5.60412E+00
+          1.54778E-02         1.56476E-02        -1.48355E-02         9.72381E-01         1.20249E+00         9.72494E-01         5.90616E+00         1.00000E+00         4.11274E-04         5.90616E+00         2.79185E-01         5.62697E+00
+          1.54778E-02         1.58175E-02        -1.50033E-02         9.72379E-01         1.21317E+00         9.72494E-01         6.03595E+00         1.00000E+00         4.15859E-04         6.03595E+00         3.76078E-01         5.65987E+00
+          1.54778E-02         1.59873E-02        -1.51730E-02         9.72376E-01         1.22384E+00         9.72494E-01         6.18705E+00         1.00000E+00         4.20495E-04         6.18705E+00         4.85185E-01         5.70186E+00
+          1.54778E-02         1.61571E-02        -1.53445E-02         9.72373E-01         1.23451E+00         9.72494E-01         6.35722E+00         1.00000E+00         4.25181E-04         6.35722E+00         6.05186E-01         5.75204E+00
+          1.54778E-02         1.63270E-02        -1.55178E-02         9.72371E-01         1.24518E+00         9.72494E-01         6.54431E+00         1.00000E+00         4.29914E-04         6.54431E+00         7.34790E-01         5.80952E+00
+          1.54778E-02         1.64968E-02        -1.56930E-02         9.72368E-01         1.25585E+00         9.72494E-01         6.74617E+00         1.00000E+00         4.34692E-04         6.74617E+00         8.72739E-01         5.87343E+00
+          1.54778E-02         1.66666E-02        -1.58699E-02         9.72365E-01         1.26652E+00         9.72495E-01         6.96077E+00         1.00000E+00         4.39513E-04         6.96077E+00         1.01781E+00         5.94296E+00
+          1.54778E-02         1.68364E-02        -1.60487E-02         9.72362E-01         1.27719E+00         9.72495E-01         7.18612E+00         1.00000E+00         4.44376E-04         7.18612E+00         1.16880E+00         6.01731E+00
+          1.54778E-02         1.70063E-02        -1.62292E-02         9.72360E-01         1.28786E+00         9.72495E-01         7.42029E+00         1.00000E+00         4.49278E-04         7.42029E+00         1.32458E+00         6.09571E+00
+          1.54778E-02         1.71761E-02        -1.64116E-02         9.72357E-01         1.29853E+00         9.72495E-01         7.66144E+00         1.00000E+00         4.54218E-04         7.66144E+00         1.48403E+00         6.17741E+00
+          1.54778E-02         1.73459E-02        -1.65958E-02         9.72354E-01         1.30920E+00         9.72496E-01         7.90778E+00         1.00000E+00         4.59194E-04         7.90778E+00         1.64607E+00         6.26171E+00
+          1.54778E-02         1.75158E-02        -1.67818E-02         9.72351E-01         1.31987E+00         9.72496E-01         8.15760E+00         1.00000E+00         4.64205E-04         8.15760E+00         1.80970E+00         6.34791E+00
+          1.54778E-02         1.76856E-02        -1.69696E-02         9.72348E-01         1.33054E+00         9.72496E-01         8.40928E+00         1.00000E+00         4.69248E-04         8.40928E+00         1.97392E+00         6.43535E+00
+          1.54778E-02         1.78554E-02        -1.71592E-02         9.72345E-01         1.34121E+00         9.72497E-01         8.66123E+00         1.00000E+00         4.74323E-04         8.66123E+00         2.13782E+00         6.52341E+00
+          1.54778E-02         1.80252E-02        -1.73507E-02         9.72342E-01         1.35188E+00         9.72497E-01         8.91199E+00         1.00000E+00         4.79427E-04         8.91199E+00         2.30050E+00         6.61149E+00
+          1.54778E-02         1.81951E-02        -1.75439E-02         9.72339E-01         1.36255E+00         9.72497E-01         9.16013E+00         1.00000E+00         4.84560E-04         9.16013E+00         2.46114E+00         6.69899E+00
+          1.54778E-02         1.83649E-02        -1.77390E-02         9.72336E-01         1.37322E+00         9.72498E-01         9.40431E+00         1.00000E+00         4.89719E-04         9.40431E+00         2.61895E+00         6.78536E+00
+          1.54778E-02         1.85347E-02        -1.79359E-02         9.72333E-01         1.38389E+00         9.72499E-01         9.64328E+00         1.00000E+00         4.94904E-04         9.64328E+00         2.77320E+00         6.87008E+00
+          1.54778E-02         1.87045E-02        -1.81346E-02         9.72330E-01         1.39457E+00         9.72499E-01         9.87585E+00         1.00000E+00         5.00112E-04         9.87585E+00         2.92320E+00         6.95265E+00
+          1.54778E-02         1.88744E-02        -1.83351E-02         9.72327E-01         1.40524E+00         9.72500E-01         1.01009E+01         1.00000E+00         5.05343E-04         1.01009E+01         3.06833E+00         7.03259E+00
+          1.54778E-02         1.90442E-02        -1.85374E-02         9.72324E-01         1.41591E+00         9.72501E-01         1.03174E+01         1.00000E+00         5.10595E-04         1.03174E+01         3.20800E+00         7.10944E+00
+          1.54778E-02         1.92140E-02        -1.87415E-02         9.72321E-01         1.42658E+00         9.72501E-01         1.05245E+01         1.00000E+00         5.15867E-04         1.05245E+01         3.34168E+00         7.18278E+00
+          1.54778E-02         1.93839E-02        -1.89475E-02         9.72317E-01         1.43725E+00         9.72502E-01         1.07211E+01         1.00000E+00         5.21158E-04         1.07211E+01         3.46891E+00         7.25221E+00
+          1.54778E-02         1.95537E-02        -1.91552E-02         9.72314E-01         1.44792E+00         9.72503E-01         1.09066E+01         1.00000E+00         5.26465E-04         1.09066E+01         3.58924E+00         7.31735E+00
+          1.54778E-02         1.97235E-02        -1.93648E-02         9.72311E-01         1.45859E+00         9.72504E-01         1.10801E+01         1.00000E+00         5.31787E-04         1.10801E+01         3.70229E+00         7.37785E+00
+          1.54778E-02         1.98933E-02        -1.95762E-02         9.72308E-01         1.46926E+00         9.72505E-01         1.12411E+01         1.00000E+00         5.37124E-04         1.12411E+01         3.80775E+00         7.43338E+00
+          1.54778E-02         2.00632E-02        -1.97894E-02         9.72304E-01         1.47993E+00         9.72506E-01         1.13890E+01         1.00000E+00         5.42473E-04         1.13890E+01         3.90532E+00         7.48364E+00
+          1.54778E-02         2.02330E-02        -2.00044E-02         9.72301E-01         1.49060E+00         9.72507E-01         1.15231E+01         1.00000E+00         5.47833E-04         1.15231E+01         3.99478E+00         7.52835E+00
+          1.54778E-02         2.04028E-02        -2.02212E-02         9.72298E-01         1.50127E+00         9.72508E-01         1.16432E+01         1.00000E+00         5.53202E-04         1.16432E+01         4.07592E+00         7.56726E+00
+          1.54778E-02         2.05726E-02        -2.04398E-02         9.72294E-01         1.51194E+00         9.72509E-01         1.17488E+01         1.00000E+00         5.58579E-04         1.17488E+01         4.14861E+00         7.60014E+00
+          1.54778E-02         2.07425E-02        -2.06603E-02         9.72291E-01         1.52261E+00         9.72510E-01         1.18395E+01         1.00000E+00         5.63962E-04         1.18395E+01         4.21274E+00         7.62679E+00
+          1.54778E-02         2.09123E-02        -2.08826E-02         9.72288E-01         1.53328E+00         9.72512E-01         1.19153E+01         1.00000E+00         5.69349E-04         1.19153E+01         4.26826E+00         7.64703E+00
+          1.54778E-02         2.10821E-02        -2.11066E-02         9.72284E-01         1.54395E+00         9.72513E-01         1.19758E+01         1.00000E+00         5.74739E-04         1.19758E+01         4.31513E+00         7.66071E+00
+          1.54778E-02         2.12520E-02        -2.13325E-02         9.72281E-01         1.55462E+00         9.72515E-01         1.20211E+01         1.00000E+00         5.80128E-04         1.20211E+01         4.35338E+00         7.66769E+00
+          1.54778E-02         2.14218E-02        -2.15602E-02         9.72277E-01         1.56529E+00         9.72516E-01         1.20509E+01         1.00000E+00         5.85517E-04         1.20509E+01         4.38306E+00         7.66788E+00
+          1.54778E-02         2.15916E-02        -2.17897E-02         9.72273E-01         1.57596E+00         9.72518E-01         1.20655E+01         1.00000E+00         5.90901E-04         1.20655E+01         4.40426E+00         7.66119E+00
+          1.54778E-02         2.17614E-02        -2.20211E-02         9.72270E-01         1.58664E+00         9.72519E-01         1.20647E+01         1.00000E+00         5.96280E-04         1.20647E+01         4.41710E+00         7.64758E+00
+          1.54778E-02         2.19313E-02        -2.22542E-02         9.72266E-01         1.59731E+00         9.72521E-01         1.20487E+01         1.00000E+00         6.01650E-04         1.20487E+01         4.42173E+00         7.62700E+00
+          1.54778E-02         2.21011E-02        -2.24892E-02         9.72263E-01         1.60798E+00         9.72523E-01         1.20178E+01         1.00000E+00         6.07011E-04         1.20178E+01         4.41832E+00         7.59946E+00
+          1.54778E-02         2.22709E-02        -2.27259E-02         9.72259E-01         1.61865E+00         9.72525E-01         1.19721E+01         1.00000E+00         6.12359E-04         1.19721E+01         4.40710E+00         7.56497E+00
+          1.54778E-02         2.24407E-02        -2.29645E-02         9.72255E-01         1.62932E+00         9.72526E-01         1.19119E+01         1.00000E+00         6.17692E-04         1.19119E+01         4.38828E+00         7.52358E+00
+          1.54778E-02         2.26106E-02        -2.32049E-02         9.72252E-01         1.63999E+00         9.72528E-01         1.18375E+01         1.00000E+00         6.23008E-04         1.18375E+01         4.36213E+00         7.47535E+00
+          1.54778E-02         2.27804E-02        -2.34471E-02         9.72248E-01         1.65066E+00         9.72531E-01         1.17493E+01         1.00000E+00         6.28304E-04         1.17493E+01         4.32892E+00         7.42036E+00
+          1.54778E-02         2.29502E-02        -2.36911E-02         9.72244E-01         1.66133E+00         9.72533E-01         1.16477E+01         1.00000E+00         6.33579E-04         1.16477E+01         4.28894E+00         7.35873E+00
+          1.54778E-02         2.31201E-02        -2.39370E-02         9.72240E-01         1.67200E+00         9.72535E-01         1.15331E+01         1.00000E+00         6.38829E-04         1.15331E+01         4.24250E+00         7.29059E+00
+          1.54778E-02         2.32899E-02        -2.41846E-02         9.72236E-01         1.68267E+00         9.72537E-01         1.14060E+01         1.00000E+00         6.44051E-04         1.14060E+01         4.18993E+00         7.21609E+00
+          1.54778E-02         2.34597E-02        -2.44341E-02         9.72233E-01         1.69334E+00         9.72540E-01         1.12670E+01         1.00000E+00         6.49245E-04         1.12670E+01         4.13157E+00         7.13540E+00
+          1.54778E-02         2.36295E-02        -2.46853E-02         9.72229E-01         1.70401E+00         9.72542E-01         1.11165E+01         1.00000E+00         6.54407E-04         1.11165E+01         4.06776E+00         7.04873E+00
+          1.54778E-02         2.37994E-02        -2.49384E-02         9.72225E-01         1.71468E+00         9.72545E-01         1.09552E+01         1.00000E+00         6.59535E-04         1.09552E+01         3.99886E+00         6.95629E+00
+          1.54778E-02         2.39692E-02        -2.51933E-02         9.72221E-01         1.72535E+00         9.72547E-01         1.07835E+01         1.00000E+00         6.64626E-04         1.07835E+01         3.92524E+00         6.85830E+00
+          1.54778E-02         2.41390E-02        -2.54500E-02         9.72217E-01         1.73602E+00         9.72550E-01         1.06023E+01         1.00000E+00         6.69678E-04         1.06023E+01         3.84727E+00         6.75502E+00
+          1.54778E-02         2.43088E-02        -2.57086E-02         9.72213E-01         1.74669E+00         9.72553E-01         1.04120E+01         1.00000E+00         6.74690E-04         1.04120E+01         3.76531E+00         6.64672E+00
+          1.54778E-02         2.44787E-02        -2.59689E-02         9.72209E-01         1.75736E+00         9.72556E-01         1.02134E+01         1.00000E+00         6.79658E-04         1.02134E+01         3.67975E+00         6.53367E+00
+          1.54778E-02         2.46485E-02        -2.62311E-02         9.72205E-01         1.76804E+00         9.72559E-01         1.00071E+01         1.00000E+00         6.84581E-04         1.00071E+01         3.59095E+00         6.41617E+00
+          1.54778E-02         2.48183E-02        -2.64950E-02         9.72201E-01         1.77871E+00         9.72562E-01         9.79382E+00         1.00000E+00         6.89457E-04         9.79382E+00         3.49929E+00         6.29453E+00
+          1.54778E-02         2.49882E-02        -2.67608E-02         9.72197E-01         1.78938E+00         9.72565E-01         9.57423E+00         1.00000E+00         6.94284E-04         9.57423E+00         3.40514E+00         6.16908E+00
+          1.54778E-02         2.51580E-02        -2.70284E-02         9.72192E-01         1.80005E+00         9.72568E-01         9.34902E+00         1.00000E+00         6.99060E-04         9.34902E+00         3.30886E+00         6.04015E+00
+          1.54778E-02         2.53278E-02        -2.72978E-02         9.72188E-01         1.81072E+00         9.72571E-01         9.11891E+00         1.00000E+00         7.03783E-04         9.11891E+00         3.21082E+00         5.90809E+00
+          1.54778E-02         2.54976E-02        -2.75690E-02         9.72184E-01         1.82139E+00         9.72575E-01         8.88460E+00         1.00000E+00         7.08451E-04         8.88460E+00         3.11136E+00         5.77324E+00
+          1.54778E-02         2.56675E-02        -2.78421E-02         9.72180E-01         1.83206E+00         9.72578E-01         8.64680E+00         1.00000E+00         7.13064E-04         8.64680E+00         3.01083E+00         5.63596E+00
+          1.54778E-02         2.58373E-02        -2.81169E-02         9.72176E-01         1.84273E+00         9.72582E-01         8.40620E+00         1.00000E+00         7.17620E-04         8.40620E+00         2.90957E+00         5.49663E+00
+          1.54778E-02         2.60071E-02        -2.83936E-02         9.72171E-01         1.85340E+00         9.72586E-01         8.16349E+00         1.00000E+00         7.22117E-04         8.16349E+00         2.80789E+00         5.35560E+00
+          1.54778E-02         2.61769E-02        -2.86721E-02         9.72167E-01         1.86407E+00         9.72590E-01         7.91938E+00         1.00000E+00         7.26555E-04         7.91938E+00         2.70612E+00         5.21326E+00
+          1.56476E-02         8.72665E-04        -7.33376E-03         9.83170E-01         2.74155E-01         9.83198E-01         2.42896E+02         1.00000E+00         2.50332E-04         2.42896E+02         1.06817E+02         1.36079E+02
+          1.56476E-02         1.04249E-03        -7.34397E-03         9.83170E-01         2.84826E-01         9.83198E-01         2.38755E+02         1.00000E+00         2.48904E-04         2.38755E+02         1.05235E+02         1.33520E+02
+          1.56476E-02         1.21232E-03        -7.35600E-03         9.83170E-01         2.95496E-01         9.83198E-01         2.34523E+02         1.00000E+00         2.47460E-04         2.34523E+02         1.03612E+02         1.30912E+02
+          1.56476E-02         1.38215E-03        -7.36984E-03         9.83170E-01         3.06167E-01         9.83197E-01         2.30206E+02         1.00000E+00         2.46007E-04         2.30206E+02         1.01948E+02         1.28259E+02
+          1.56476E-02         1.55197E-03        -7.38549E-03         9.83170E-01         3.16838E-01         9.83197E-01         2.25811E+02         1.00000E+00         2.44546E-04         2.25811E+02         1.00245E+02         1.25566E+02
+          1.56476E-02         1.72180E-03        -7.40296E-03         9.83169E-01         3.27508E-01         9.83197E-01         2.21345E+02         1.00000E+00         2.43082E-04         2.21345E+02         9.85067E+01         1.22838E+02
+          1.56476E-02         1.89163E-03        -7.42223E-03         9.83169E-01         3.38179E-01         9.83197E-01         2.16813E+02         1.00000E+00         2.41619E-04         2.16813E+02         9.67339E+01         1.20079E+02
+          1.56476E-02         2.06146E-03        -7.44332E-03         9.83169E-01         3.48849E-01         9.83197E-01         2.12223E+02         1.00000E+00         2.40160E-04         2.12223E+02         9.49289E+01         1.17294E+02
+          1.56476E-02         2.23128E-03        -7.46622E-03         9.83168E-01         3.59520E-01         9.83197E-01         2.07581E+02         1.00000E+00         2.38709E-04         2.07581E+02         9.30940E+01         1.14487E+02
+          1.56476E-02         2.40111E-03        -7.49093E-03         9.83168E-01         3.70190E-01         9.83196E-01         2.02894E+02         1.00000E+00         2.37270E-04         2.02894E+02         9.12312E+01         1.11663E+02
+          1.56476E-02         2.57094E-03        -7.51746E-03         9.83168E-01         3.80861E-01         9.83196E-01         1.98169E+02         1.00000E+00         2.35847E-04         1.98169E+02         8.93428E+01         1.08826E+02
+          1.56476E-02         2.74077E-03        -7.54580E-03         9.83167E-01         3.91532E-01         9.83196E-01         1.93412E+02         1.00000E+00         2.34443E-04         1.93412E+02         8.74310E+01         1.05981E+02
+          1.56476E-02         2.91059E-03        -7.57594E-03         9.83167E-01         4.02202E-01         9.83196E-01         1.88629E+02         1.00000E+00         2.33061E-04         1.88629E+02         8.54979E+01         1.03131E+02
+          1.56476E-02         3.08042E-03        -7.60790E-03         9.83166E-01         4.12873E-01         9.83196E-01         1.83827E+02         1.00000E+00         2.31706E-04         1.83827E+02         8.35459E+01         1.00281E+02
+          1.56476E-02         3.25025E-03        -7.64168E-03         9.83166E-01         4.23543E-01         9.83195E-01         1.79013E+02         1.00000E+00         2.30380E-04         1.79013E+02         8.15771E+01         9.74357E+01
+          1.56476E-02         3.42008E-03        -7.67726E-03         9.83165E-01         4.34214E-01         9.83195E-01         1.74192E+02         1.00000E+00         2.29087E-04         1.74192E+02         7.95940E+01         9.45981E+01
+          1.56476E-02         3.58990E-03        -7.71465E-03         9.83164E-01         4.44884E-01         9.83195E-01         1.69371E+02         1.00000E+00         2.27830E-04         1.69371E+02         7.75988E+01         9.17725E+01
+          1.56476E-02         3.75973E-03        -7.75386E-03         9.83164E-01         4.55555E-01         9.83194E-01         1.64556E+02         1.00000E+00         2.26612E-04         1.64556E+02         7.55937E+01         8.89626E+01
+          1.56476E-02         3.92956E-03        -7.79488E-03         9.83163E-01         4.66225E-01         9.83194E-01         1.59753E+02         1.00000E+00         2.25436E-04         1.59753E+02         7.35811E+01         8.61720E+01
+          1.56476E-02         4.09939E-03        -7.83771E-03         9.83163E-01         4.76896E-01         9.83194E-01         1.54968E+02         1.00000E+00         2.24305E-04         1.54968E+02         7.15632E+01         8.34043E+01
+          1.56476E-02         4.26921E-03        -7.88236E-03         9.83162E-01         4.87567E-01         9.83193E-01         1.50205E+02         1.00000E+00         2.23221E-04         1.50205E+02         6.95424E+01         8.06627E+01
+          1.56476E-02         4.43904E-03        -7.92881E-03         9.83161E-01         4.98237E-01         9.83193E-01         1.45471E+02         1.00000E+00         2.22188E-04         1.45471E+02         6.75209E+01         7.79506E+01
+          1.56476E-02         4.60887E-03        -7.97708E-03         9.83160E-01         5.08908E-01         9.83193E-01         1.40772E+02         1.00000E+00         2.21208E-04         1.40772E+02         6.55009E+01         7.52708E+01
+          1.56476E-02         4.77869E-03        -8.02716E-03         9.83160E-01         5.19578E-01         9.83192E-01         1.36111E+02         1.00000E+00         2.20283E-04         1.36111E+02         6.34847E+01         7.26265E+01
+          1.56476E-02         4.94852E-03        -8.07905E-03         9.83159E-01         5.30249E-01         9.83192E-01         1.31495E+02         1.00000E+00         2.19416E-04         1.31495E+02         6.14745E+01         7.00203E+01
+          1.56476E-02         5.11835E-03        -8.13276E-03         9.83158E-01         5.40919E-01         9.83192E-01         1.26927E+02         1.00000E+00         2.18609E-04         1.26927E+02         5.94725E+01         6.74548E+01
+          1.56476E-02         5.28818E-03        -8.18827E-03         9.83157E-01         5.51590E-01         9.83191E-01         1.22413E+02         1.00000E+00         2.17863E-04         1.22413E+02         5.74809E+01         6.49324E+01
+          1.56476E-02         5.45800E-03        -8.24560E-03         9.83156E-01         5.62261E-01         9.83191E-01         1.17957E+02         1.00000E+00         2.17181E-04         1.17957E+02         5.55017E+01         6.24555E+01
+          1.56476E-02         5.62783E-03        -8.30474E-03         9.83155E-01         5.72931E-01         9.83190E-01         1.13563E+02         1.00000E+00         2.16565E-04         1.13563E+02         5.35371E+01         6.00260E+01
+          1.56476E-02         5.79766E-03        -8.36569E-03         9.83154E-01         5.83602E-01         9.83190E-01         1.09235E+02         1.00000E+00         2.16017E-04         1.09235E+02         5.15890E+01         5.76460E+01
+          1.56476E-02         5.96749E-03        -8.42846E-03         9.83153E-01         5.94272E-01         9.83189E-01         1.04977E+02         1.00000E+00         2.15537E-04         1.04977E+02         4.96595E+01         5.53172E+01
+          1.56476E-02         6.13731E-03        -8.49303E-03         9.83152E-01         6.04943E-01         9.83189E-01         1.00792E+02         1.00000E+00         2.15128E-04         1.00792E+02         4.77506E+01         5.30412E+01
+          1.56476E-02         6.30714E-03        -8.55942E-03         9.83151E-01         6.15613E-01         9.83188E-01         9.66834E+01         1.00000E+00         2.14790E-04         9.66834E+01         4.58640E+01         5.08194E+01
+          1.56476E-02         6.47697E-03        -8.62762E-03         9.83150E-01         6.26284E-01         9.83188E-01         9.26548E+01         1.00000E+00         2.14526E-04         9.26548E+01         4.40017E+01         4.86531E+01
+          1.56476E-02         6.64680E-03        -8.69763E-03         9.83149E-01         6.36955E-01         9.83188E-01         8.87089E+01         1.00000E+00         2.14336E-04         8.87089E+01         4.21654E+01         4.65435E+01
+          1.56476E-02         6.81662E-03        -8.76946E-03         9.83148E-01         6.47625E-01         9.83187E-01         8.48483E+01         1.00000E+00         2.14221E-04         8.48483E+01         4.03569E+01         4.44914E+01
+          1.56476E-02         6.98645E-03        -8.84309E-03         9.83147E-01         6.58296E-01         9.83187E-01         8.10754E+01         1.00000E+00         2.14183E-04         8.10754E+01         3.85778E+01         4.24976E+01
+          1.56476E-02         7.15628E-03        -8.91854E-03         9.83146E-01         6.68966E-01         9.83186E-01         7.73925E+01         1.00000E+00         2.14222E-04         7.73925E+01         3.68296E+01         4.05629E+01
+          1.56476E-02         7.32611E-03        -8.99580E-03         9.83144E-01         6.79637E-01         9.83186E-01         7.38016E+01         1.00000E+00         2.14340E-04         7.38016E+01         3.51139E+01         3.86877E+01
+          1.56476E-02         7.49593E-03        -9.07487E-03         9.83143E-01         6.90307E-01         9.83185E-01         7.03044E+01         1.00000E+00         2.14536E-04         7.03044E+01         3.34321E+01         3.68723E+01
+          1.56476E-02         7.66576E-03        -9.15576E-03         9.83142E-01         7.00978E-01         9.83185E-01         6.69026E+01         1.00000E+00         2.14812E-04         6.69026E+01         3.17855E+01         3.51170E+01
+          1.56476E-02         7.83559E-03        -9.23845E-03         9.83141E-01         7.11649E-01         9.83184E-01         6.35974E+01         1.00000E+00         2.15168E-04         6.35974E+01         3.01756E+01         3.34219E+01
+          1.56476E-02         8.00542E-03        -9.32296E-03         9.83139E-01         7.22319E-01         9.83183E-01         6.03902E+01         1.00000E+00         2.15605E-04         6.03902E+01         2.86033E+01         3.17868E+01
+          1.56476E-02         8.17524E-03        -9.40928E-03         9.83138E-01         7.32990E-01         9.83183E-01         5.72817E+01         1.00000E+00         2.16123E-04         5.72817E+01         2.70699E+01         3.02117E+01
+          1.56476E-02         8.34507E-03        -9.49742E-03         9.83137E-01         7.43660E-01         9.83182E-01         5.42727E+01         1.00000E+00         2.16722E-04         5.42727E+01         2.55765E+01         2.86962E+01
+          1.56476E-02         8.51490E-03        -9.58736E-03         9.83135E-01         7.54331E-01         9.83182E-01         5.13638E+01         1.00000E+00         2.17404E-04         5.13638E+01         2.41238E+01         2.72400E+01
+          1.56476E-02         8.68473E-03        -9.67912E-03         9.83134E-01         7.65001E-01         9.83181E-01         4.85553E+01         1.00000E+00         2.18168E-04         4.85553E+01         2.27129E+01         2.58424E+01
+          1.56476E-02         8.85455E-03        -9.77269E-03         9.83132E-01         7.75672E-01         9.83181E-01         4.58474E+01         1.00000E+00         2.19015E-04         4.58474E+01         2.13444E+01         2.45030E+01
+          1.56476E-02         9.02438E-03        -9.86807E-03         9.83131E-01         7.86343E-01         9.83180E-01         4.32401E+01         1.00000E+00         2.19944E-04         4.32401E+01         2.00192E+01         2.32209E+01
+          1.56476E-02         9.19421E-03        -9.96526E-03         9.83129E-01         7.97013E-01         9.83180E-01         4.07331E+01         1.00000E+00         2.20956E-04         4.07331E+01         1.87376E+01         2.19955E+01
+          1.56476E-02         9.36403E-03        -1.00643E-02         9.83128E-01         8.07684E-01         9.83179E-01         3.83262E+01         1.00000E+00         2.22051E-04         3.83262E+01         1.75004E+01         2.08258E+01
+          1.56476E-02         9.53386E-03        -1.01651E-02         9.83126E-01         8.18354E-01         9.83179E-01         3.60187E+01         1.00000E+00         2.23229E-04         3.60187E+01         1.63078E+01         1.97108E+01
+          1.56476E-02         9.70369E-03        -1.02677E-02         9.83124E-01         8.29025E-01         9.83178E-01         3.38099E+01         1.00000E+00         2.24489E-04         3.38099E+01         1.51603E+01         1.86496E+01
+          1.56476E-02         9.87352E-03        -1.03722E-02         9.83123E-01         8.39695E-01         9.83178E-01         3.16991E+01         1.00000E+00         2.25833E-04         3.16991E+01         1.40580E+01         1.76411E+01
+          1.56476E-02         1.00433E-02        -1.04784E-02         9.83121E-01         8.50366E-01         9.83177E-01         2.96853E+01         1.00000E+00         2.27258E-04         2.96853E+01         1.30011E+01         1.66841E+01
+          1.56476E-02         1.02132E-02        -1.05865E-02         9.83120E-01         8.61037E-01         9.83177E-01         2.77672E+01         1.00000E+00         2.28766E-04         2.77672E+01         1.19897E+01         1.57775E+01
+          1.56476E-02         1.03830E-02        -1.06964E-02         9.83118E-01         8.71707E-01         9.83176E-01         2.59437E+01         1.00000E+00         2.30356E-04         2.59437E+01         1.10238E+01         1.49199E+01
+          1.56476E-02         1.05528E-02        -1.08080E-02         9.83116E-01         8.82378E-01         9.83175E-01         2.42134E+01         1.00000E+00         2.32027E-04         2.42134E+01         1.01032E+01         1.41102E+01
+          1.56476E-02         1.07227E-02        -1.09216E-02         9.83114E-01         8.93048E-01         9.83175E-01         2.25747E+01         1.00000E+00         2.33780E-04         2.25747E+01         9.22776E+00         1.33469E+01
+          1.56476E-02         1.08925E-02        -1.10369E-02         9.83112E-01         9.03719E-01         9.83174E-01         2.10261E+01         1.00000E+00         2.35613E-04         2.10261E+01         8.39720E+00         1.26289E+01
+          1.56476E-02         1.10623E-02        -1.11540E-02         9.83111E-01         9.14389E-01         9.83174E-01         1.95657E+01         1.00000E+00         2.37526E-04         1.95657E+01         7.61117E+00         1.19546E+01
+          1.56476E-02         1.12321E-02        -1.12729E-02         9.83109E-01         9.25060E-01         9.83173E-01         1.81919E+01         1.00000E+00         2.39518E-04         1.81919E+01         6.86924E+00         1.13227E+01
+          1.56476E-02         1.14020E-02        -1.13937E-02         9.83107E-01         9.35731E-01         9.83173E-01         1.69028E+01         1.00000E+00         2.41589E-04         1.69028E+01         6.17089E+00         1.07319E+01
+          1.56476E-02         1.15718E-02        -1.15163E-02         9.83105E-01         9.46401E-01         9.83172E-01         1.56962E+01         1.00000E+00         2.43737E-04         1.56962E+01         5.51555E+00         1.01806E+01
+          1.56476E-02         1.17416E-02        -1.16406E-02         9.83103E-01         9.57072E-01         9.83172E-01         1.45702E+01         1.00000E+00         2.45963E-04         1.45702E+01         4.90256E+00         9.66759E+00
+          1.56476E-02         1.19114E-02        -1.17668E-02         9.83101E-01         9.67742E-01         9.83171E-01         1.35226E+01         1.00000E+00         2.48265E-04         1.35226E+01         4.33121E+00         9.19134E+00
+          1.56476E-02         1.20813E-02        -1.18948E-02         9.83099E-01         9.78413E-01         9.83171E-01         1.25512E+01         1.00000E+00         2.50641E-04         1.25512E+01         3.80071E+00         8.75047E+00
+          1.56476E-02         1.22511E-02        -1.20246E-02         9.83097E-01         9.89083E-01         9.83171E-01         1.16538E+01         1.00000E+00         2.53092E-04         1.16538E+01         3.31021E+00         8.34357E+00
+          1.56476E-02         1.24209E-02        -1.21563E-02         9.83095E-01         9.99754E-01         9.83170E-01         1.08280E+01         1.00000E+00         2.55615E-04         1.08280E+01         2.85880E+00         7.96925E+00
+          1.56476E-02         1.25908E-02        -1.22897E-02         9.83093E-01         1.01042E+00         9.83170E-01         1.00716E+01         1.00000E+00         2.58210E-04         1.00716E+01         2.44552E+00         7.62613E+00
+          1.56476E-02         1.27606E-02        -1.24249E-02         9.83091E-01         1.02110E+00         9.83169E-01         9.38220E+00         1.00000E+00         2.60875E-04         9.38220E+00         2.06935E+00         7.31284E+00
+          1.56476E-02         1.29304E-02        -1.25620E-02         9.83089E-01         1.03177E+00         9.83169E-01         8.75728E+00         1.00000E+00         2.63609E-04         8.75728E+00         1.72924E+00         7.02804E+00
+          1.56476E-02         1.31002E-02        -1.27009E-02         9.83086E-01         1.04244E+00         9.83168E-01         8.19447E+00         1.00000E+00         2.66411E-04         8.19447E+00         1.42407E+00         6.77040E+00
+          1.56476E-02         1.32701E-02        -1.28416E-02         9.83084E-01         1.05311E+00         9.83168E-01         7.69131E+00         1.00000E+00         2.69279E-04         7.69131E+00         1.15269E+00         6.53862E+00
+          1.56476E-02         1.34399E-02        -1.29841E-02         9.83082E-01         1.06378E+00         9.83168E-01         7.24532E+00         1.00000E+00         2.72211E-04         7.24532E+00         9.13917E-01         6.33141E+00
+          1.56476E-02         1.36097E-02        -1.31284E-02         9.83080E-01         1.07445E+00         9.83167E-01         6.85404E+00         1.00000E+00         2.75207E-04         6.85404E+00         7.06526E-01         6.14752E+00
+          1.56476E-02         1.37795E-02        -1.32745E-02         9.83077E-01         1.08512E+00         9.83167E-01         6.51498E+00         1.00000E+00         2.78265E-04         6.51498E+00         5.29266E-01         5.98571E+00
+          1.56476E-02         1.39494E-02        -1.34225E-02         9.83075E-01         1.09579E+00         9.83167E-01         6.22566E+00         1.00000E+00         2.81382E-04         6.22566E+00         3.80860E-01         5.84480E+00
+          1.56476E-02         1.41192E-02        -1.35722E-02         9.83073E-01         1.10646E+00         9.83166E-01         5.98362E+00         1.00000E+00         2.84559E-04         5.98362E+00         2.60008E-01         5.72361E+00
+          1.56476E-02         1.42890E-02        -1.37238E-02         9.83070E-01         1.11713E+00         9.83166E-01         5.78639E+00         1.00000E+00         2.87792E-04         5.78639E+00         1.65391E-01         5.62099E+00
+          1.56476E-02         1.44589E-02        -1.38771E-02         9.83068E-01         1.12780E+00         9.83166E-01         5.63152E+00         1.00000E+00         2.91080E-04         5.63152E+00         9.56771E-02         5.53585E+00
+          1.56476E-02         1.46287E-02        -1.40323E-02         9.83066E-01         1.13847E+00         9.83166E-01         5.51661E+00         1.00000E+00         2.94422E-04         5.51661E+00         4.95230E-02         5.46708E+00
+          1.56476E-02         1.47985E-02        -1.41893E-02         9.83063E-01         1.14914E+00         9.83166E-01         5.43924E+00         1.00000E+00         2.97816E-04         5.43924E+00         2.55785E-02         5.41366E+00
+          1.56476E-02         1.49683E-02        -1.43481E-02         9.83061E-01         1.15981E+00         9.83165E-01         5.39704E+00         1.00000E+00         3.01260E-04         5.39704E+00         2.24906E-02         5.37455E+00
+          1.56476E-02         1.51382E-02        -1.45088E-02         9.83058E-01         1.17048E+00         9.83165E-01         5.38768E+00         1.00000E+00         3.04754E-04         5.38768E+00         3.89067E-02         5.34877E+00
+          1.56476E-02         1.53080E-02        -1.46712E-02         9.83056E-01         1.18115E+00         9.83165E-01         5.40885E+00         1.00000E+00         3.08294E-04         5.40885E+00         7.34786E-02         5.33537E+00
+          1.56476E-02         1.54778E-02        -1.48355E-02         9.83053E-01         1.19182E+00         9.83165E-01         5.45827E+00         1.00000E+00         3.11880E-04         5.45827E+00         1.24866E-01         5.33341E+00
+          1.56476E-02         1.56476E-02        -1.50015E-02         9.83050E-01         1.20249E+00         9.83165E-01         5.53373E+00         1.00000E+00         3.15511E-04         5.53373E+00         1.91739E-01         5.34199E+00
+          1.56476E-02         1.58175E-02        -1.51694E-02         9.83048E-01         1.21317E+00         9.83165E-01         5.63305E+00         1.00000E+00         3.19184E-04         5.63305E+00         2.72783E-01         5.36026E+00
+          1.56476E-02         1.59873E-02        -1.53391E-02         9.83045E-01         1.22384E+00         9.83165E-01         5.75408E+00         1.00000E+00         3.22898E-04         5.75408E+00         3.66702E-01         5.38737E+00
+          1.56476E-02         1.61571E-02        -1.55106E-02         9.83042E-01         1.23451E+00         9.83165E-01         5.89474E+00         1.00000E+00         3.26652E-04         5.89474E+00         4.72218E-01         5.42252E+00
+          1.56476E-02         1.63270E-02        -1.56839E-02         9.83040E-01         1.24518E+00         9.83165E-01         6.05299E+00         1.00000E+00         3.30445E-04         6.05299E+00         5.88079E-01         5.46491E+00
+          1.56476E-02         1.64968E-02        -1.58590E-02         9.83037E-01         1.25585E+00         9.83165E-01         6.22686E+00         1.00000E+00         3.34275E-04         6.22686E+00         7.13058E-01         5.51380E+00
+          1.56476E-02         1.66666E-02        -1.60360E-02         9.83034E-01         1.26652E+00         9.83165E-01         6.41442E+00         1.00000E+00         3.38141E-04         6.41442E+00         8.45960E-01         5.56846E+00
+          1.56476E-02         1.68364E-02        -1.62147E-02         9.83031E-01         1.27719E+00         9.83165E-01         6.61380E+00         1.00000E+00         3.42041E-04         6.61380E+00         9.85618E-01         5.62818E+00
+          1.56476E-02         1.70063E-02        -1.63953E-02         9.83029E-01         1.28786E+00         9.83165E-01         6.82319E+00         1.00000E+00         3.45975E-04         6.82319E+00         1.13090E+00         5.69229E+00
+          1.56476E-02         1.71761E-02        -1.65777E-02         9.83026E-01         1.29853E+00         9.83166E-01         7.04085E+00         1.00000E+00         3.49941E-04         7.04085E+00         1.28071E+00         5.76013E+00
+          1.56476E-02         1.73459E-02        -1.67618E-02         9.83023E-01         1.30920E+00         9.83166E-01         7.26508E+00         1.00000E+00         3.53939E-04         7.26508E+00         1.43400E+00         5.83108E+00
+          1.56476E-02         1.75158E-02        -1.69478E-02         9.83020E-01         1.31987E+00         9.83166E-01         7.49427E+00         1.00000E+00         3.57967E-04         7.49427E+00         1.58974E+00         5.90453E+00
+          1.56476E-02         1.76856E-02        -1.71357E-02         9.83017E-01         1.33054E+00         9.83166E-01         7.72686E+00         1.00000E+00         3.62024E-04         7.72686E+00         1.74697E+00         5.97989E+00
+          1.56476E-02         1.78554E-02        -1.73253E-02         9.83014E-01         1.34121E+00         9.83167E-01         7.96135E+00         1.00000E+00         3.66110E-04         7.96135E+00         1.90474E+00         6.05661E+00
+          1.56476E-02         1.80252E-02        -1.75167E-02         9.83011E-01         1.35188E+00         9.83167E-01         8.19632E+00         1.00000E+00         3.70223E-04         8.19632E+00         2.06218E+00         6.13414E+00
+          1.56476E-02         1.81951E-02        -1.77100E-02         9.83008E-01         1.36255E+00         9.83168E-01         8.43040E+00         1.00000E+00         3.74363E-04         8.43040E+00         2.21843E+00         6.21197E+00
+          1.56476E-02         1.83649E-02        -1.79051E-02         9.83005E-01         1.37322E+00         9.83168E-01         8.66230E+00         1.00000E+00         3.78528E-04         8.66230E+00         2.37271E+00         6.28959E+00
+          1.56476E-02         1.85347E-02        -1.81019E-02         9.83002E-01         1.38389E+00         9.83169E-01         8.89080E+00         1.00000E+00         3.82717E-04         8.89080E+00         2.52426E+00         6.36654E+00
+          1.56476E-02         1.87045E-02        -1.83006E-02         9.82999E-01         1.39457E+00         9.83169E-01         9.11473E+00         1.00000E+00         3.86931E-04         9.11473E+00         2.67239E+00         6.44235E+00
+          1.56476E-02         1.88744E-02        -1.85011E-02         9.82996E-01         1.40524E+00         9.83170E-01         9.33302E+00         1.00000E+00         3.91167E-04         9.33302E+00         2.81644E+00         6.51658E+00
+          1.56476E-02         1.90442E-02        -1.87034E-02         9.82992E-01         1.41591E+00         9.83170E-01         9.54462E+00         1.00000E+00         3.95426E-04         9.54462E+00         2.95581E+00         6.58881E+00
+          1.56476E-02         1.92140E-02        -1.89076E-02         9.82989E-01         1.42658E+00         9.83171E-01         9.74860E+00         1.00000E+00         3.99705E-04         9.74860E+00         3.08995E+00         6.65865E+00
+          1.56476E-02         1.93839E-02        -1.91135E-02         9.82986E-01         1.43725E+00         9.83172E-01         9.94406E+00         1.00000E+00         4.04004E-04         9.94406E+00         3.21834E+00         6.72572E+00
+          1.56476E-02         1.95537E-02        -1.93213E-02         9.82983E-01         1.44792E+00         9.83173E-01         1.01302E+01         1.00000E+00         4.08323E-04         1.01302E+01         3.34053E+00         6.78965E+00
+          1.56476E-02         1.97235E-02        -1.95308E-02         9.82980E-01         1.45859E+00         9.83174E-01         1.03062E+01         1.00000E+00         4.12659E-04         1.03062E+01         3.45611E+00         6.85010E+00
+          1.56476E-02         1.98933E-02        -1.97422E-02         9.82976E-01         1.46926E+00         9.83174E-01         1.04715E+01         1.00000E+00         4.17012E-04         1.04715E+01         3.56472E+00         6.90675E+00
+          1.56476E-02         2.00632E-02        -1.99554E-02         9.82973E-01         1.47993E+00         9.83175E-01         1.06253E+01         1.00000E+00         4.21381E-04         1.06253E+01         3.66603E+00         6.95930E+00
+          1.56476E-02         2.02330E-02        -2.01704E-02         9.82970E-01         1.49060E+00         9.83176E-01         1.07672E+01         1.00000E+00         4.25764E-04         1.07672E+01         3.75978E+00         7.00746E+00
+          1.56476E-02         2.04028E-02        -2.03873E-02         9.82966E-01         1.50127E+00         9.83178E-01         1.08967E+01         1.00000E+00         4.30161E-04         1.08967E+01         3.84575E+00         7.05096E+00
+          1.56476E-02         2.05726E-02        -2.06059E-02         9.82963E-01         1.51194E+00         9.83179E-01         1.10133E+01         1.00000E+00         4.34569E-04         1.10133E+01         3.92374E+00         7.08955E+00
+          1.56476E-02         2.07425E-02        -2.08263E-02         9.82959E-01         1.52261E+00         9.83180E-01         1.11166E+01         1.00000E+00         4.38988E-04         1.11166E+01         3.99362E+00         7.12302E+00
+          1.56476E-02         2.09123E-02        -2.10486E-02         9.82956E-01         1.53328E+00         9.83181E-01         1.12064E+01         1.00000E+00         4.43415E-04         1.12064E+01         4.05529E+00         7.15116E+00
+          1.56476E-02         2.10821E-02        -2.12727E-02         9.82952E-01         1.54395E+00         9.83182E-01         1.12825E+01         1.00000E+00         4.47850E-04         1.12825E+01         4.10868E+00         7.17378E+00
+          1.56476E-02         2.12520E-02        -2.14986E-02         9.82949E-01         1.55462E+00         9.83184E-01         1.13445E+01         1.00000E+00         4.52290E-04         1.13445E+01         4.15379E+00         7.19071E+00
+          1.56476E-02         2.14218E-02        -2.17263E-02         9.82945E-01         1.56529E+00         9.83185E-01         1.13924E+01         1.00000E+00         4.56734E-04         1.13924E+01         4.19062E+00         7.20181E+00
+          1.56476E-02         2.15916E-02        -2.19558E-02         9.82942E-01         1.57596E+00         9.83187E-01         1.14262E+01         1.00000E+00         4.61180E-04         1.14262E+01         4.21922E+00         7.20695E+00
+          1.56476E-02         2.17614E-02        -2.21871E-02         9.82938E-01         1.58664E+00         9.83188E-01         1.14457E+01         1.00000E+00         4.65627E-04         1.14457E+01         4.23967E+00         7.20604E+00
+          1.56476E-02         2.19313E-02        -2.24202E-02         9.82934E-01         1.59731E+00         9.83190E-01         1.14511E+01         1.00000E+00         4.70071E-04         1.14511E+01         4.25210E+00         7.19897E+00
+          1.56476E-02         2.21011E-02        -2.26552E-02         9.82931E-01         1.60798E+00         9.83192E-01         1.14424E+01         1.00000E+00         4.74513E-04         1.14424E+01         4.25665E+00         7.18571E+00
+          1.56476E-02         2.22709E-02        -2.28920E-02         9.82927E-01         1.61865E+00         9.83193E-01         1.14197E+01         1.00000E+00         4.78948E-04         1.14197E+01         4.25348E+00         7.16619E+00
+          1.56476E-02         2.24407E-02        -2.31305E-02         9.82923E-01         1.62932E+00         9.83195E-01         1.13832E+01         1.00000E+00         4.83376E-04         1.13832E+01         4.24279E+00         7.14041E+00
+          1.56476E-02         2.26106E-02        -2.33709E-02         9.82919E-01         1.63999E+00         9.83197E-01         1.13332E+01         1.00000E+00         4.87794E-04         1.13332E+01         4.22481E+00         7.10836E+00
+          1.56476E-02         2.27804E-02        -2.36131E-02         9.82916E-01         1.65066E+00         9.83199E-01         1.12698E+01         1.00000E+00         4.92200E-04         1.12698E+01         4.19978E+00         7.07006E+00
+          1.56476E-02         2.29502E-02        -2.38572E-02         9.82912E-01         1.66133E+00         9.83201E-01         1.11935E+01         1.00000E+00         4.96592E-04         1.11935E+01         4.16797E+00         7.02557E+00
+          1.56476E-02         2.31201E-02        -2.41030E-02         9.82908E-01         1.67200E+00         9.83203E-01         1.11046E+01         1.00000E+00         5.00969E-04         1.11046E+01         4.12965E+00         6.97493E+00
+          1.56476E-02         2.32899E-02        -2.43506E-02         9.82904E-01         1.68267E+00         9.83206E-01         1.10034E+01         1.00000E+00         5.05327E-04         1.10034E+01         4.08512E+00         6.91824E+00
+          1.56476E-02         2.34597E-02        -2.46001E-02         9.82900E-01         1.69334E+00         9.83208E-01         1.08903E+01         1.00000E+00         5.09665E-04         1.08903E+01         4.03469E+00         6.85560E+00
+          1.56476E-02         2.36295E-02        -2.48514E-02         9.82896E-01         1.70401E+00         9.83210E-01         1.07658E+01         1.00000E+00         5.13981E-04         1.07658E+01         3.97869E+00         6.78713E+00
+          1.56476E-02         2.37994E-02        -2.51045E-02         9.82892E-01         1.71468E+00         9.83213E-01         1.06304E+01         1.00000E+00         5.18273E-04         1.06304E+01         3.91745E+00         6.71297E+00
+          1.56476E-02         2.39692E-02        -2.53594E-02         9.82888E-01         1.72535E+00         9.83215E-01         1.04846E+01         1.00000E+00         5.22539E-04         1.04846E+01         3.85131E+00         6.63330E+00
+          1.56476E-02         2.41390E-02        -2.56161E-02         9.82884E-01         1.73602E+00         9.83218E-01         1.03289E+01         1.00000E+00         5.26778E-04         1.03289E+01         3.78063E+00         6.54828E+00
+          1.56476E-02         2.43088E-02        -2.58746E-02         9.82880E-01         1.74669E+00         9.83221E-01         1.01639E+01         1.00000E+00         5.30986E-04         1.01639E+01         3.70576E+00         6.45813E+00
+          1.56476E-02         2.44787E-02        -2.61349E-02         9.82876E-01         1.75736E+00         9.83224E-01         9.99009E+00         1.00000E+00         5.35164E-04         9.99009E+00         3.62705E+00         6.36304E+00
+          1.56476E-02         2.46485E-02        -2.63971E-02         9.82872E-01         1.76804E+00         9.83226E-01         9.80812E+00         1.00000E+00         5.39308E-04         9.80812E+00         3.54486E+00         6.26326E+00
+          1.56476E-02         2.48183E-02        -2.66611E-02         9.82868E-01         1.77871E+00         9.83229E-01         9.61859E+00         1.00000E+00         5.43419E-04         9.61859E+00         3.45956E+00         6.15903E+00
+          1.56476E-02         2.49882E-02        -2.69268E-02         9.82864E-01         1.78938E+00         9.83233E-01         9.42211E+00         1.00000E+00         5.47493E-04         9.42211E+00         3.37149E+00         6.05062E+00
+          1.56476E-02         2.51580E-02        -2.71944E-02         9.82860E-01         1.80005E+00         9.83236E-01         9.21932E+00         1.00000E+00         5.51530E-04         9.21932E+00         3.28103E+00         5.93829E+00
+          1.56476E-02         2.53278E-02        -2.74639E-02         9.82855E-01         1.81072E+00         9.83239E-01         9.01085E+00         1.00000E+00         5.55529E-04         9.01085E+00         3.18851E+00         5.82233E+00
+          1.56476E-02         2.54976E-02        -2.77351E-02         9.82851E-01         1.82139E+00         9.83242E-01         8.79734E+00         1.00000E+00         5.59489E-04         8.79734E+00         3.09429E+00         5.70306E+00
+          1.56476E-02         2.56675E-02        -2.80081E-02         9.82847E-01         1.83206E+00         9.83246E-01         8.57945E+00         1.00000E+00         5.63408E-04         8.57945E+00         2.99869E+00         5.58076E+00
+          1.56476E-02         2.58373E-02        -2.82830E-02         9.82843E-01         1.84273E+00         9.83249E-01         8.35783E+00         1.00000E+00         5.67285E-04         8.35783E+00         2.90206E+00         5.45577E+00
+          1.56476E-02         2.60071E-02        -2.85596E-02         9.82838E-01         1.85340E+00         9.83253E-01         8.13312E+00         1.00000E+00         5.71121E-04         8.13312E+00         2.80471E+00         5.32841E+00
+          1.56476E-02         2.61769E-02        -2.88381E-02         9.82834E-01         1.86407E+00         9.83257E-01         7.90597E+00         1.00000E+00         5.74913E-04         7.90597E+00         2.70696E+00         5.19901E+00
+          1.58175E-02         8.72665E-04        -7.50165E-03         9.93841E-01         2.74155E-01         9.93869E-01         2.33524E+02         1.00000E+00         1.82366E-04         2.33524E+02         1.01555E+02         1.31969E+02
+          1.58175E-02         1.04249E-03        -7.51187E-03         9.93841E-01         2.84826E-01         9.93869E-01         2.29562E+02         1.00000E+00         1.81378E-04         2.29562E+02         1.00102E+02         1.29460E+02
+          1.58175E-02         1.21232E-03        -7.52390E-03         9.93841E-01         2.95496E-01         9.93869E-01         2.25513E+02         1.00000E+00         1.80381E-04         2.25513E+02         9.86085E+01         1.26905E+02
+          1.58175E-02         1.38215E-03        -7.53774E-03         9.93840E-01         3.06167E-01         9.93869E-01         2.21384E+02         1.00000E+00         1.79378E-04         2.21384E+02         9.70772E+01         1.24306E+02
+          1.58175E-02         1.55197E-03        -7.55339E-03         9.93840E-01         3.16838E-01         9.93869E-01         2.17179E+02         1.00000E+00         1.78373E-04         2.17179E+02         9.55096E+01         1.21670E+02
+          1.58175E-02         1.72180E-03        -7.57085E-03         9.93840E-01         3.27508E-01         9.93869E-01         2.12907E+02         1.00000E+00         1.77367E-04         2.12907E+02         9.39074E+01         1.18999E+02
+          1.58175E-02         1.89163E-03        -7.59013E-03         9.93840E-01         3.38179E-01         9.93869E-01         2.08572E+02         1.00000E+00         1.76363E-04         2.08572E+02         9.22725E+01         1.16299E+02
+          1.58175E-02         2.06146E-03        -7.61122E-03         9.93839E-01         3.48849E-01         9.93868E-01         2.04181E+02         1.00000E+00         1.75364E-04         2.04181E+02         9.06066E+01         1.13575E+02
+          1.58175E-02         2.23128E-03        -7.63412E-03         9.93839E-01         3.59520E-01         9.93868E-01         1.99742E+02         1.00000E+00         1.74372E-04         1.99742E+02         8.89117E+01         1.10830E+02
+          1.58175E-02         2.40111E-03        -7.65883E-03         9.93838E-01         3.70190E-01         9.93868E-01         1.95259E+02         1.00000E+00         1.73391E-04         1.95259E+02         8.71897E+01         1.08069E+02
+          1.58175E-02         2.57094E-03        -7.68535E-03         9.93838E-01         3.80861E-01         9.93868E-01         1.90739E+02         1.00000E+00         1.72423E-04         1.90739E+02         8.54426E+01         1.05297E+02
+          1.58175E-02         2.74077E-03        -7.71369E-03         9.93838E-01         3.91532E-01         9.93868E-01         1.86189E+02         1.00000E+00         1.71470E-04         1.86189E+02         8.36722E+01         1.02517E+02
+          1.58175E-02         2.91059E-03        -7.74384E-03         9.93837E-01         4.02202E-01         9.93867E-01         1.81615E+02         1.00000E+00         1.70536E-04         1.81615E+02         8.18806E+01         9.97346E+01
+          1.58175E-02         3.08042E-03        -7.77580E-03         9.93837E-01         4.12873E-01         9.93867E-01         1.77023E+02         1.00000E+00         1.69621E-04         1.77023E+02         8.00699E+01         9.69531E+01
+          1.58175E-02         3.25025E-03        -7.80957E-03         9.93836E-01         4.23543E-01         9.93867E-01         1.72419E+02         1.00000E+00         1.68729E-04         1.72419E+02         7.82420E+01         9.41767E+01
+          1.58175E-02         3.42008E-03        -7.84515E-03         9.93836E-01         4.34214E-01         9.93867E-01         1.67808E+02         1.00000E+00         1.67863E-04         1.67808E+02         7.63991E+01         9.14094E+01
+          1.58175E-02         3.58990E-03        -7.88255E-03         9.93835E-01         4.44884E-01         9.93866E-01         1.63198E+02         1.00000E+00         1.67024E-04         1.63198E+02         7.45431E+01         8.86549E+01
+          1.58175E-02         3.75973E-03        -7.92176E-03         9.93834E-01         4.55555E-01         9.93866E-01         1.58593E+02         1.00000E+00         1.66214E-04         1.58593E+02         7.26762E+01         8.59170E+01
+          1.58175E-02         3.92956E-03        -7.96278E-03         9.93834E-01         4.66225E-01         9.93866E-01         1.54000E+02         1.00000E+00         1.65436E-04         1.54000E+02         7.08005E+01         8.31992E+01
+          1.58175E-02         4.09939E-03        -8.00561E-03         9.93833E-01         4.76896E-01         9.93865E-01         1.49423E+02         1.00000E+00         1.64692E-04         1.49423E+02         6.89180E+01         8.05048E+01
+          1.58175E-02         4.26921E-03        -8.05025E-03         9.93832E-01         4.87567E-01         9.93865E-01         1.44868E+02         1.00000E+00         1.63984E-04         1.44868E+02         6.70308E+01         7.78373E+01
+          1.58175E-02         4.43904E-03        -8.09671E-03         9.93832E-01         4.98237E-01         9.93865E-01         1.40341E+02         1.00000E+00         1.63313E-04         1.40341E+02         6.51411E+01         7.51998E+01
+          1.58175E-02         4.60887E-03        -8.14498E-03         9.93831E-01         5.08908E-01         9.93864E-01         1.35846E+02         1.00000E+00         1.62681E-04         1.35846E+02         6.32508E+01         7.25951E+01
+          1.58175E-02         4.77869E-03        -8.19506E-03         9.93830E-01         5.19578E-01         9.93864E-01         1.31388E+02         1.00000E+00         1.62091E-04         1.31388E+02         6.13621E+01         7.00262E+01
+          1.58175E-02         4.94852E-03        -8.24695E-03         9.93829E-01         5.30249E-01         9.93863E-01         1.26973E+02         1.00000E+00         1.61544E-04         1.26973E+02         5.94769E+01         6.74957E+01
+          1.58175E-02         5.11835E-03        -8.30065E-03         9.93828E-01         5.40919E-01         9.93863E-01         1.22603E+02         1.00000E+00         1.61041E-04         1.22603E+02         5.75974E+01         6.50061E+01
+          1.58175E-02         5.28818E-03        -8.35617E-03         9.93827E-01         5.51590E-01         9.93863E-01         1.18285E+02         1.00000E+00         1.60584E-04         1.18285E+02         5.57255E+01         6.25597E+01
+          1.58175E-02         5.45800E-03        -8.41349E-03         9.93827E-01         5.62261E-01         9.93862E-01         1.14022E+02         1.00000E+00         1.60174E-04         1.14022E+02         5.38632E+01         6.01588E+01
+          1.58175E-02         5.62783E-03        -8.47263E-03         9.93826E-01         5.72931E-01         9.93862E-01         1.09818E+02         1.00000E+00         1.59813E-04         1.09818E+02         5.20125E+01         5.78053E+01
+          1.58175E-02         5.79766E-03        -8.53359E-03         9.93825E-01         5.83602E-01         9.93861E-01         1.05676E+02         1.00000E+00         1.59502E-04         1.05676E+02         5.01753E+01         5.55011E+01
+          1.58175E-02         5.96749E-03        -8.59635E-03         9.93824E-01         5.94272E-01         9.93861E-01         1.01601E+02         1.00000E+00         1.59242E-04         1.01601E+02         4.83534E+01         5.32478E+01
+          1.58175E-02         6.13731E-03        -8.66092E-03         9.93823E-01         6.04943E-01         9.93860E-01         9.75957E+01         1.00000E+00         1.59035E-04         9.75957E+01         4.65488E+01         5.10469E+01
+          1.58175E-02         6.30714E-03        -8.72731E-03         9.93822E-01         6.15613E-01         9.93860E-01         9.36630E+01         1.00000E+00         1.58881E-04         9.36630E+01         4.47631E+01         4.88999E+01
+          1.58175E-02         6.47697E-03        -8.79551E-03         9.93821E-01         6.26284E-01         9.93859E-01         8.98060E+01         1.00000E+00         1.58781E-04         8.98060E+01         4.29982E+01         4.68078E+01
+          1.58175E-02         6.64680E-03        -8.86552E-03         9.93819E-01         6.36955E-01         9.93859E-01         8.60275E+01         1.00000E+00         1.58737E-04         8.60275E+01         4.12558E+01         4.47717E+01
+          1.58175E-02         6.81662E-03        -8.93735E-03         9.93818E-01         6.47625E-01         9.93858E-01         8.23299E+01         1.00000E+00         1.58748E-04         8.23299E+01         3.95376E+01         4.27924E+01
+          1.58175E-02         6.98645E-03        -9.01098E-03         9.93817E-01         6.58296E-01         9.93858E-01         7.87156E+01         1.00000E+00         1.58817E-04         7.87156E+01         3.78450E+01         4.08706E+01
+          1.58175E-02         7.15628E-03        -9.08643E-03         9.93816E-01         6.68966E-01         9.93857E-01         7.51866E+01         1.00000E+00         1.58944E-04         7.51866E+01         3.61797E+01         3.90070E+01
+          1.58175E-02         7.32611E-03        -9.16369E-03         9.93815E-01         6.79637E-01         9.93857E-01         7.17449E+01         1.00000E+00         1.59129E-04         7.17449E+01         3.45431E+01         3.72018E+01
+          1.58175E-02         7.49593E-03        -9.24276E-03         9.93813E-01         6.90307E-01         9.93856E-01         6.83921E+01         1.00000E+00         1.59374E-04         6.83921E+01         3.29367E+01         3.54554E+01
+          1.58175E-02         7.66576E-03        -9.32365E-03         9.93812E-01         7.00978E-01         9.93856E-01         6.51296E+01         1.00000E+00         1.59678E-04         6.51296E+01         3.13617E+01         3.37679E+01
+          1.58175E-02         7.83559E-03        -9.40634E-03         9.93811E-01         7.11649E-01         9.93855E-01         6.19588E+01         1.00000E+00         1.60043E-04         6.19588E+01         2.98195E+01         3.21393E+01
+          1.58175E-02         8.00542E-03        -9.49085E-03         9.93810E-01         7.22319E-01         9.93855E-01         5.88808E+01         1.00000E+00         1.60468E-04         5.88808E+01         2.83113E+01         3.05695E+01
+          1.58175E-02         8.17524E-03        -9.57717E-03         9.93808E-01         7.32990E-01         9.93854E-01         5.58963E+01         1.00000E+00         1.60955E-04         5.58963E+01         2.68382E+01         2.90581E+01
+          1.58175E-02         8.34507E-03        -9.66531E-03         9.93807E-01         7.43660E-01         9.93854E-01         5.30061E+01         1.00000E+00         1.61504E-04         5.30061E+01         2.54012E+01         2.76049E+01
+          1.58175E-02         8.51490E-03        -9.75525E-03         9.93805E-01         7.54331E-01         9.93853E-01         5.02107E+01         1.00000E+00         1.62115E-04         5.02107E+01         2.40014E+01         2.62093E+01
+          1.58175E-02         8.68473E-03        -9.84701E-03         9.93804E-01         7.65001E-01         9.93853E-01         4.75103E+01         1.00000E+00         1.62789E-04         4.75103E+01         2.26396E+01         2.48707E+01
+          1.58175E-02         8.85455E-03        -9.94058E-03         9.93802E-01         7.75672E-01         9.93852E-01         4.49053E+01         1.00000E+00         1.63526E-04         4.49053E+01         2.13167E+01         2.35886E+01
+          1.58175E-02         9.02438E-03        -1.00360E-02         9.93801E-01         7.86343E-01         9.93852E-01         4.23954E+01         1.00000E+00         1.64325E-04         4.23954E+01         2.00333E+01         2.23620E+01
+          1.58175E-02         9.19421E-03        -1.01332E-02         9.93799E-01         7.97013E-01         9.93851E-01         3.99805E+01         1.00000E+00         1.65188E-04         3.99805E+01         1.87903E+01         2.11902E+01
+          1.58175E-02         9.36403E-03        -1.02322E-02         9.93798E-01         8.07684E-01         9.93850E-01         3.76603E+01         1.00000E+00         1.66115E-04         3.76603E+01         1.75880E+01         2.00723E+01
+          1.58175E-02         9.53386E-03        -1.03330E-02         9.93796E-01         8.18354E-01         9.93850E-01         3.54342E+01         1.00000E+00         1.67105E-04         3.54342E+01         1.64271E+01         1.90071E+01
+          1.58175E-02         9.70369E-03        -1.04356E-02         9.93795E-01         8.29025E-01         9.93849E-01         3.33017E+01         1.00000E+00         1.68159E-04         3.33017E+01         1.53079E+01         1.79937E+01
+          1.58175E-02         9.87352E-03        -1.05400E-02         9.93793E-01         8.39695E-01         9.93849E-01         3.12618E+01         1.00000E+00         1.69276E-04         3.12618E+01         1.42308E+01         1.70310E+01
+          1.58175E-02         1.00433E-02        -1.06463E-02         9.93791E-01         8.50366E-01         9.93848E-01         2.93136E+01         1.00000E+00         1.70457E-04         2.93136E+01         1.31960E+01         1.61176E+01
+          1.58175E-02         1.02132E-02        -1.07544E-02         9.93790E-01         8.61037E-01         9.93848E-01         2.74562E+01         1.00000E+00         1.71701E-04         2.74562E+01         1.22037E+01         1.52525E+01
+          1.58175E-02         1.03830E-02        -1.08642E-02         9.93788E-01         8.71707E-01         9.93847E-01         2.56882E+01         1.00000E+00         1.73009E-04         2.56882E+01         1.12539E+01         1.44343E+01
+          1.58175E-02         1.05528E-02        -1.09759E-02         9.93786E-01         8.82378E-01         9.93847E-01         2.40085E+01         1.00000E+00         1.74379E-04         2.40085E+01         1.03467E+01         1.36618E+01
+          1.58175E-02         1.07227E-02        -1.10894E-02         9.93784E-01         8.93048E-01         9.93846E-01         2.24155E+01         1.00000E+00         1.75812E-04         2.24155E+01         9.48195E+00         1.29336E+01
+          1.58175E-02         1.08925E-02        -1.12048E-02         9.93782E-01         9.03719E-01         9.93846E-01         2.09078E+01         1.00000E+00         1.77308E-04         2.09078E+01         8.65951E+00         1.22483E+01
+          1.58175E-02         1.10623E-02        -1.13219E-02         9.93781E-01         9.14389E-01         9.93845E-01         1.94838E+01         1.00000E+00         1.78865E-04         1.94838E+01         7.87914E+00         1.16046E+01
+          1.58175E-02         1.12321E-02        -1.14408E-02         9.93779E-01         9.25060E-01         9.93845E-01         1.81417E+01         1.00000E+00         1.80484E-04         1.81417E+01         7.14054E+00         1.10012E+01
+          1.58175E-02         1.14020E-02        -1.15616E-02         9.93777E-01         9.35731E-01         9.93844E-01         1.68798E+01         1.00000E+00         1.82164E-04         1.68798E+01         6.44332E+00         1.04365E+01
+          1.58175E-02         1.15718E-02        -1.16841E-02         9.93775E-01         9.46401E-01         9.93843E-01         1.56963E+01         1.00000E+00         1.83904E-04         1.56963E+01         5.78701E+00         9.90929E+00
+          1.58175E-02         1.17416E-02        -1.18085E-02         9.93773E-01         9.57072E-01         9.93843E-01         1.45892E+01         1.00000E+00         1.85703E-04         1.45892E+01         5.17108E+00         9.41807E+00
+          1.58175E-02         1.19114E-02        -1.19347E-02         9.93771E-01         9.67742E-01         9.93843E-01         1.35564E+01         1.00000E+00         1.87562E-04         1.35564E+01         4.59495E+00         8.96148E+00
+          1.58175E-02         1.20813E-02        -1.20627E-02         9.93769E-01         9.78413E-01         9.93842E-01         1.25961E+01         1.00000E+00         1.89478E-04         1.25961E+01         4.05795E+00         8.53814E+00
+          1.58175E-02         1.22511E-02        -1.21925E-02         9.93767E-01         9.89083E-01         9.93842E-01         1.17060E+01         1.00000E+00         1.91452E-04         1.17060E+01         3.55936E+00         8.14667E+00
+          1.58175E-02         1.24209E-02        -1.23241E-02         9.93765E-01         9.99754E-01         9.93841E-01         1.08841E+01         1.00000E+00         1.93482E-04         1.08841E+01         3.09839E+00         7.78572E+00
+          1.58175E-02         1.25908E-02        -1.24576E-02         9.93763E-01         1.01042E+00         9.93841E-01         1.01282E+01         1.00000E+00         1.95567E-04         1.01282E+01         2.67421E+00         7.45396E+00
+          1.58175E-02         1.27606E-02        -1.25928E-02         9.93760E-01         1.02110E+00         9.93840E-01         9.43598E+00         1.00000E+00         1.97707E-04         9.43598E+00         2.28593E+00         7.15005E+00
+          1.58175E-02         1.29304E-02        -1.27299E-02         9.93758E-01         1.03177E+00         9.93840E-01         8.80530E+00         1.00000E+00         1.99900E-04         8.80530E+00         1.93259E+00         6.87271E+00
+          1.58175E-02         1.31002E-02        -1.28688E-02         9.93756E-01         1.04244E+00         9.93839E-01         8.23390E+00         1.00000E+00         2.02146E-04         8.23390E+00         1.61322E+00         6.62068E+00
+          1.58175E-02         1.32701E-02        -1.30095E-02         9.93754E-01         1.05311E+00         9.93839E-01         7.71947E+00         1.00000E+00         2.04442E-04         7.71947E+00         1.32678E+00         6.39270E+00
+          1.58175E-02         1.34399E-02        -1.31520E-02         9.93752E-01         1.06378E+00         9.93839E-01         7.25975E+00         1.00000E+00         2.06789E-04         7.25975E+00         1.07219E+00         6.18756E+00
+          1.58175E-02         1.36097E-02        -1.32963E-02         9.93749E-01         1.07445E+00         9.93838E-01         6.85244E+00         1.00000E+00         2.09185E-04         6.85244E+00         8.48359E-01         6.00408E+00
+          1.58175E-02         1.37795E-02        -1.34424E-02         9.93747E-01         1.08512E+00         9.93838E-01         6.49524E+00         1.00000E+00         2.11628E-04         6.49524E+00         6.54130E-01         5.84111E+00
+          1.58175E-02         1.39494E-02        -1.35903E-02         9.93745E-01         1.09579E+00         9.93838E-01         6.18586E+00         1.00000E+00         2.14117E-04         6.18586E+00         4.88336E-01         5.69752E+00
+          1.58175E-02         1.41192E-02        -1.37401E-02         9.93742E-01         1.10646E+00         9.93837E-01         5.92201E+00         1.00000E+00         2.16653E-04         5.92201E+00         3.49781E-01         5.57223E+00
+          1.58175E-02         1.42890E-02        -1.38916E-02         9.93740E-01         1.11713E+00         9.93837E-01         5.70142E+00         1.00000E+00         2.19232E-04         5.70142E+00         2.37246E-01         5.46418E+00
+          1.58175E-02         1.44589E-02        -1.40450E-02         9.93737E-01         1.12780E+00         9.93837E-01         5.52183E+00         1.00000E+00         2.21854E-04         5.52183E+00         1.49492E-01         5.37234E+00
+          1.58175E-02         1.46287E-02        -1.42002E-02         9.93735E-01         1.13847E+00         9.93836E-01         5.38100E+00         1.00000E+00         2.24518E-04         5.38100E+00         8.52696E-02         5.29573E+00
+          1.58175E-02         1.47985E-02        -1.43572E-02         9.93733E-01         1.14914E+00         9.93836E-01         5.27670E+00         1.00000E+00         2.27222E-04         5.27670E+00         4.33145E-02         5.23338E+00
+          1.58175E-02         1.49683E-02        -1.45160E-02         9.93730E-01         1.15981E+00         9.93836E-01         5.20674E+00         1.00000E+00         2.29966E-04         5.20674E+00         2.23568E-02         5.18438E+00
+          1.58175E-02         1.51382E-02        -1.46766E-02         9.93727E-01         1.17048E+00         9.93836E-01         5.16896E+00         1.00000E+00         2.32748E-04         5.16896E+00         2.11227E-02         5.14784E+00
+          1.58175E-02         1.53080E-02        -1.48391E-02         9.93725E-01         1.18115E+00         9.93836E-01         5.16122E+00         1.00000E+00         2.35568E-04         5.16122E+00         3.83376E-02         5.12288E+00
+          1.58175E-02         1.54778E-02        -1.50033E-02         9.93722E-01         1.19182E+00         9.93836E-01         5.18142E+00         1.00000E+00         2.38423E-04         5.18142E+00         7.27303E-02         5.10869E+00
+          1.58175E-02         1.56476E-02        -1.51694E-02         9.93720E-01         1.20249E+00         9.93835E-01         5.22750E+00         1.00000E+00         2.41314E-04         5.22750E+00         1.23036E-01         5.10446E+00
+          1.58175E-02         1.58175E-02        -1.53373E-02         9.93717E-01         1.21317E+00         9.93835E-01         5.29742E+00         1.00000E+00         2.44239E-04         5.29742E+00         1.88000E-01         5.10942E+00
+          1.58175E-02         1.59873E-02        -1.55070E-02         9.93714E-01         1.22384E+00         9.93835E-01         5.38923E+00         1.00000E+00         2.47198E-04         5.38923E+00         2.66380E-01         5.12285E+00
+          1.58175E-02         1.61571E-02        -1.56785E-02         9.93712E-01         1.23451E+00         9.93835E-01         5.50096E+00         1.00000E+00         2.50188E-04         5.50096E+00         3.56950E-01         5.14401E+00
+          1.58175E-02         1.63270E-02        -1.58518E-02         9.93709E-01         1.24518E+00         9.93835E-01         5.63073E+00         1.00000E+00         2.53211E-04         5.63073E+00         4.58502E-01         5.17223E+00
+          1.58175E-02         1.64968E-02        -1.60269E-02         9.93706E-01         1.25585E+00         9.93835E-01         5.77669E+00         1.00000E+00         2.56264E-04         5.77669E+00         5.69852E-01         5.20684E+00
+          1.58175E-02         1.66666E-02        -1.62038E-02         9.93703E-01         1.26652E+00         9.93835E-01         5.93706E+00         1.00000E+00         2.59347E-04         5.93706E+00         6.89838E-01         5.24722E+00
+          1.58175E-02         1.68364E-02        -1.63826E-02         9.93700E-01         1.27719E+00         9.93836E-01         6.11007E+00         1.00000E+00         2.62459E-04         6.11007E+00         8.17327E-01         5.29275E+00
+          1.58175E-02         1.70063E-02        -1.65631E-02         9.93698E-01         1.28786E+00         9.93836E-01         6.29405E+00         1.00000E+00         2.65600E-04         6.29405E+00         9.51213E-01         5.34284E+00
+          1.58175E-02         1.71761E-02        -1.67455E-02         9.93695E-01         1.29853E+00         9.93836E-01         6.48735E+00         1.00000E+00         2.68769E-04         6.48735E+00         1.09043E+00         5.39692E+00
+          1.58175E-02         1.73459E-02        -1.69297E-02         9.93692E-01         1.30920E+00         9.93836E-01         6.68838E+00         1.00000E+00         2.71966E-04         6.68838E+00         1.23392E+00         5.45446E+00
+          1.58175E-02         1.75158E-02        -1.71157E-02         9.93689E-01         1.31987E+00         9.93836E-01         6.89562E+00         1.00000E+00         2.75189E-04         6.89562E+00         1.38070E+00         5.51491E+00
+          1.58175E-02         1.76856E-02        -1.73035E-02         9.93686E-01         1.33054E+00         9.93837E-01         7.10759E+00         1.00000E+00         2.78439E-04         7.10759E+00         1.52980E+00         5.57779E+00
+          1.58175E-02         1.78554E-02        -1.74932E-02         9.93683E-01         1.34121E+00         9.93837E-01         7.32289E+00         1.00000E+00         2.81714E-04         7.32289E+00         1.68029E+00         5.64260E+00
+          1.58175E-02         1.80252E-02        -1.76846E-02         9.93680E-01         1.35188E+00         9.93837E-01         7.54014E+00         1.00000E+00         2.85014E-04         7.54014E+00         1.83129E+00         5.70886E+00
+          1.58175E-02         1.81951E-02        -1.78779E-02         9.93677E-01         1.36255E+00         9.93838E-01         7.75807E+00         1.00000E+00         2.88339E-04         7.75807E+00         1.98194E+00         5.77612E+00
+          1.58175E-02         1.83649E-02        -1.80729E-02         9.93674E-01         1.37322E+00         9.93838E-01         7.97541E+00         1.00000E+00         2.91688E-04         7.97541E+00         2.13146E+00         5.84396E+00
+          1.58175E-02         1.85347E-02        -1.82698E-02         9.93671E-01         1.38389E+00         9.93839E-01         8.19101E+00         1.00000E+00         2.95061E-04         8.19101E+00         2.27907E+00         5.91193E+00
+          1.58175E-02         1.87045E-02        -1.84685E-02         9.93667E-01         1.39457E+00         9.93839E-01         8.40372E+00         1.00000E+00         2.98457E-04         8.40372E+00         2.42408E+00         5.97964E+00
+          1.58175E-02         1.88744E-02        -1.86690E-02         9.93664E-01         1.40524E+00         9.93840E-01         8.61251E+00         1.00000E+00         3.01875E-04         8.61251E+00         2.56581E+00         6.04670E+00
+          1.58175E-02         1.90442E-02        -1.88713E-02         9.93661E-01         1.41591E+00         9.93840E-01         8.81636E+00         1.00000E+00         3.05315E-04         8.81636E+00         2.70364E+00         6.11272E+00
+          1.58175E-02         1.92140E-02        -1.90754E-02         9.93658E-01         1.42658E+00         9.93841E-01         9.01433E+00         1.00000E+00         3.08776E-04         9.01433E+00         2.83699E+00         6.17734E+00
+          1.58175E-02         1.93839E-02        -1.92814E-02         9.93655E-01         1.43725E+00         9.93842E-01         9.20556E+00         1.00000E+00         3.12257E-04         9.20556E+00         2.96534E+00         6.24021E+00
+          1.58175E-02         1.95537E-02        -1.94891E-02         9.93651E-01         1.44792E+00         9.93842E-01         9.38920E+00         1.00000E+00         3.15759E-04         9.38920E+00         3.08821E+00         6.30100E+00
+          1.58175E-02         1.97235E-02        -1.96987E-02         9.93648E-01         1.45859E+00         9.93843E-01         9.56452E+00         1.00000E+00         3.19279E-04         9.56452E+00         3.20515E+00         6.35937E+00
+          1.58175E-02         1.98933E-02        -1.99101E-02         9.93645E-01         1.46926E+00         9.93844E-01         9.73079E+00         1.00000E+00         3.22816E-04         9.73079E+00         3.31577E+00         6.41503E+00
+          1.58175E-02         2.00632E-02        -2.01233E-02         9.93641E-01         1.47993E+00         9.93845E-01         9.88739E+00         1.00000E+00         3.26371E-04         9.88739E+00         3.41972E+00         6.46767E+00
+          1.58175E-02         2.02330E-02        -2.03383E-02         9.93638E-01         1.49060E+00         9.93846E-01         1.00337E+01         1.00000E+00         3.29942E-04         1.00337E+01         3.51671E+00         6.51702E+00
+          1.58175E-02         2.04028E-02        -2.05551E-02         9.93634E-01         1.50127E+00         9.93847E-01         1.01693E+01         1.00000E+00         3.33528E-04         1.01693E+01         3.60646E+00         6.56280E+00
+          1.58175E-02         2.05726E-02        -2.07738E-02         9.93631E-01         1.51194E+00         9.93848E-01         1.02935E+01         1.00000E+00         3.37127E-04         1.02935E+01         3.68877E+00         6.60477E+00
+          1.58175E-02         2.07425E-02        -2.09942E-02         9.93628E-01         1.52261E+00         9.93849E-01         1.04062E+01         1.00000E+00         3.40738E-04         1.04062E+01         3.76346E+00         6.64269E+00
+          1.58175E-02         2.09123E-02        -2.12165E-02         9.93624E-01         1.53328E+00         9.93851E-01         1.05067E+01         1.00000E+00         3.44361E-04         1.05067E+01         3.83040E+00         6.67633E+00
+          1.58175E-02         2.10821E-02        -2.14405E-02         9.93620E-01         1.54395E+00         9.93852E-01         1.05950E+01         1.00000E+00         3.47993E-04         1.05950E+01         3.88948E+00         6.70548E+00
+          1.58175E-02         2.12520E-02        -2.16664E-02         9.93617E-01         1.55462E+00         9.93853E-01         1.06706E+01         1.00000E+00         3.51634E-04         1.06706E+01         3.94065E+00         6.72995E+00
+          1.58175E-02         2.14218E-02        -2.18941E-02         9.93613E-01         1.56529E+00         9.93854E-01         1.07335E+01         1.00000E+00         3.55281E-04         1.07335E+01         3.98389E+00         6.74957E+00
+          1.58175E-02         2.15916E-02        -2.21236E-02         9.93610E-01         1.57596E+00         9.93856E-01         1.07834E+01         1.00000E+00         3.58933E-04         1.07834E+01         4.01922E+00         6.76418E+00
+          1.58175E-02         2.17614E-02        -2.23550E-02         9.93606E-01         1.58664E+00         9.93857E-01         1.08203E+01         1.00000E+00         3.62589E-04         1.08203E+01         4.04667E+00         6.77362E+00
+          1.58175E-02         2.19313E-02        -2.25881E-02         9.93602E-01         1.59731E+00         9.93859E-01         1.08441E+01         1.00000E+00         3.66246E-04         1.08441E+01         4.06632E+00         6.77778E+00
+          1.58175E-02         2.21011E-02        -2.28231E-02         9.93599E-01         1.60798E+00         9.93861E-01         1.08548E+01         1.00000E+00         3.69904E-04         1.08548E+01         4.07830E+00         6.77655E+00
+          1.58175E-02         2.22709E-02        -2.30598E-02         9.93595E-01         1.61865E+00         9.93862E-01         1.08525E+01         1.00000E+00         3.73560E-04         1.08525E+01         4.08272E+00         6.76983E+00
+          1.58175E-02         2.24407E-02        -2.32984E-02         9.93591E-01         1.62932E+00         9.93864E-01         1.08373E+01         1.00000E+00         3.77212E-04         1.08373E+01         4.07976E+00         6.75755E+00
+          1.58175E-02         2.26106E-02        -2.35388E-02         9.93587E-01         1.63999E+00         9.93866E-01         1.08093E+01         1.00000E+00         3.80859E-04         1.08093E+01         4.06961E+00         6.73965E+00
+          1.58175E-02         2.27804E-02        -2.37810E-02         9.93583E-01         1.65066E+00         9.93868E-01         1.07686E+01         1.00000E+00         3.84500E-04         1.07686E+01         4.05247E+00         6.71611E+00
+          1.58175E-02         2.29502E-02        -2.40250E-02         9.93580E-01         1.66133E+00         9.93870E-01         1.07155E+01         1.00000E+00         3.88131E-04         1.07155E+01         4.02857E+00         6.68690E+00
+          1.58175E-02         2.31201E-02        -2.42708E-02         9.93576E-01         1.67200E+00         9.93872E-01         1.06502E+01         1.00000E+00         3.91752E-04         1.06502E+01         3.99818E+00         6.65203E+00
+          1.58175E-02         2.32899E-02        -2.45185E-02         9.93572E-01         1.68267E+00         9.93874E-01         1.05731E+01         1.00000E+00         3.95361E-04         1.05731E+01         3.96155E+00         6.61150E+00
+          1.58175E-02         2.34597E-02        -2.47680E-02         9.93568E-01         1.69334E+00         9.93876E-01         1.04843E+01         1.00000E+00         3.98957E-04         1.04843E+01         3.91897E+00         6.56538E+00
+          1.58175E-02         2.36295E-02        -2.50192E-02         9.93564E-01         1.70401E+00         9.93879E-01         1.03844E+01         1.00000E+00         4.02537E-04         1.03844E+01         3.87074E+00         6.51370E+00
+          1.58175E-02         2.37994E-02        -2.52723E-02         9.93560E-01         1.71468E+00         9.93881E-01         1.02737E+01         1.00000E+00         4.06100E-04         1.02737E+01         3.81716E+00         6.45656E+00
+          1.58175E-02         2.39692E-02        -2.55272E-02         9.93556E-01         1.72535E+00         9.93884E-01         1.01526E+01         1.00000E+00         4.09645E-04         1.01526E+01         3.75856E+00         6.39404E+00
+          1.58175E-02         2.41390E-02        -2.57839E-02         9.93552E-01         1.73602E+00         9.93886E-01         1.00215E+01         1.00000E+00         4.13170E-04         1.00215E+01         3.69526E+00         6.32626E+00
+          1.58175E-02         2.43088E-02        -2.60425E-02         9.93548E-01         1.74669E+00         9.93889E-01         9.88096E+00         1.00000E+00         4.16674E-04         9.88096E+00         3.62760E+00         6.25335E+00
+          1.58175E-02         2.44787E-02        -2.63028E-02         9.93544E-01         1.75736E+00         9.93892E-01         9.73139E+00         1.00000E+00         4.20156E-04         9.73139E+00         3.55592E+00         6.17547E+00
+          1.58175E-02         2.46485E-02        -2.65649E-02         9.93539E-01         1.76804E+00         9.93894E-01         9.57333E+00         1.00000E+00         4.23615E-04         9.57333E+00         3.48056E+00         6.09278E+00
+          1.58175E-02         2.48183E-02        -2.68289E-02         9.93535E-01         1.77871E+00         9.93897E-01         9.40731E+00         1.00000E+00         4.27049E-04         9.40731E+00         3.40185E+00         6.00546E+00
+          1.58175E-02         2.49882E-02        -2.70947E-02         9.93531E-01         1.78938E+00         9.93900E-01         9.23387E+00         1.00000E+00         4.30458E-04         9.23387E+00         3.32016E+00         5.91371E+00
+          1.58175E-02         2.51580E-02        -2.73623E-02         9.93527E-01         1.80005E+00         9.93904E-01         9.05356E+00         1.00000E+00         4.33840E-04         9.05356E+00         3.23581E+00         5.81775E+00
+          1.58175E-02         2.53278E-02        -2.76317E-02         9.93523E-01         1.81072E+00         9.93907E-01         8.86697E+00         1.00000E+00         4.37196E-04         8.86697E+00         3.14915E+00         5.71782E+00
+          1.58175E-02         2.54976E-02        -2.79029E-02         9.93518E-01         1.82139E+00         9.93910E-01         8.67466E+00         1.00000E+00         4.40523E-04         8.67466E+00         3.06052E+00         5.61415E+00
+          1.58175E-02         2.56675E-02        -2.81760E-02         9.93514E-01         1.83206E+00         9.93913E-01         8.47723E+00         1.00000E+00         4.43823E-04         8.47723E+00         2.97024E+00         5.50700E+00
+          1.58175E-02         2.58373E-02        -2.84508E-02         9.93510E-01         1.84273E+00         9.93917E-01         8.27527E+00         1.00000E+00         4.47093E-04         8.27527E+00         2.87864E+00         5.39663E+00
+          1.58175E-02         2.60071E-02        -2.87275E-02         9.93505E-01         1.85340E+00         9.93920E-01         8.06938E+00         1.00000E+00         4.50335E-04         8.06938E+00         2.78604E+00         5.28334E+00
+          1.58175E-02         2.61769E-02        -2.90059E-02         9.93501E-01         1.86407E+00         9.93924E-01         7.86015E+00         1.00000E+00         4.53546E-04         7.86015E+00         2.69274E+00         5.16741E+00
+          1.59873E-02         8.72665E-04        -7.67136E-03         1.00451E+00         2.74155E-01         1.00454E+00         2.24503E+02         1.00000E+00         1.32460E-04         2.24503E+02         9.59581E+01         1.28544E+02
+          1.59873E-02         1.04249E-03        -7.68158E-03         1.00451E+00         2.84826E-01         1.00454E+00         2.20708E+02         1.00000E+00         1.31783E-04         2.20708E+02         9.46345E+01         1.26074E+02
+          1.59873E-02         1.21232E-03        -7.69361E-03         1.00451E+00         2.95496E-01         1.00454E+00         2.16831E+02         1.00000E+00         1.31102E-04         2.16831E+02         9.32736E+01         1.23558E+02
+          1.59873E-02         1.38215E-03        -7.70745E-03         1.00451E+00         3.06167E-01         1.00454E+00         2.12877E+02         1.00000E+00         1.30418E-04         2.12877E+02         9.18770E+01         1.21000E+02
+          1.59873E-02         1.55197E-03        -7.72310E-03         1.00451E+00         3.16838E-01         1.00454E+00         2.08851E+02         1.00000E+00         1.29733E-04         2.08851E+02         9.04462E+01         1.18405E+02
+          1.59873E-02         1.72180E-03        -7.74056E-03         1.00451E+00         3.27508E-01         1.00454E+00         2.04760E+02         1.00000E+00         1.29049E-04         2.04760E+02         8.89826E+01         1.15777E+02
+          1.59873E-02         1.89163E-03        -7.75984E-03         1.00451E+00         3.38179E-01         1.00454E+00         2.00610E+02         1.00000E+00         1.28367E-04         2.00610E+02         8.74878E+01         1.13122E+02
+          1.59873E-02         2.06146E-03        -7.78093E-03         1.00451E+00         3.48849E-01         1.00454E+00         1.96406E+02         1.00000E+00         1.27690E-04         1.96406E+02         8.59635E+01         1.10443E+02
+          1.59873E-02         2.23128E-03        -7.80383E-03         1.00451E+00         3.59520E-01         1.00454E+00         1.92156E+02         1.00000E+00         1.27020E-04         1.92156E+02         8.44112E+01         1.07745E+02
+          1.59873E-02         2.40111E-03        -7.82854E-03         1.00451E+00         3.70190E-01         1.00454E+00         1.87865E+02         1.00000E+00         1.26359E-04         1.87865E+02         8.28328E+01         1.05032E+02
+          1.59873E-02         2.57094E-03        -7.85506E-03         1.00451E+00         3.80861E-01         1.00454E+00         1.83539E+02         1.00000E+00         1.25707E-04         1.83539E+02         8.12297E+01         1.02309E+02
+          1.59873E-02         2.74077E-03        -7.88340E-03         1.00451E+00         3.91532E-01         1.00454E+00         1.79184E+02         1.00000E+00         1.25068E-04         1.79184E+02         7.96039E+01         9.95797E+01
+          1.59873E-02         2.91059E-03        -7.91355E-03         1.00451E+00         4.02202E-01         1.00454E+00         1.74806E+02         1.00000E+00         1.24443E-04         1.74806E+02         7.79571E+01         9.68484E+01
+          1.59873E-02         3.08042E-03        -7.94551E-03         1.00451E+00         4.12873E-01         1.00454E+00         1.70410E+02         1.00000E+00         1.23833E-04         1.70410E+02         7.62911E+01         9.41194E+01
+          1.59873E-02         3.25025E-03        -7.97928E-03         1.00451E+00         4.23543E-01         1.00454E+00         1.66004E+02         1.00000E+00         1.23241E-04         1.66004E+02         7.46076E+01         9.13964E+01
+          1.59873E-02         3.42008E-03        -8.01486E-03         1.00451E+00         4.34214E-01         1.00454E+00         1.61592E+02         1.00000E+00         1.22667E-04         1.61592E+02         7.29085E+01         8.86835E+01
+          1.59873E-02         3.58990E-03        -8.05226E-03         1.00451E+00         4.44884E-01         1.00454E+00         1.57180E+02         1.00000E+00         1.22114E-04         1.57180E+02         7.11957E+01         8.59843E+01
+          1.59873E-02         3.75973E-03        -8.09147E-03         1.00450E+00         4.55555E-01         1.00454E+00         1.52774E+02         1.00000E+00         1.21584E-04         1.52774E+02         6.94711E+01         8.33025E+01
+          1.59873E-02         3.92956E-03        -8.13249E-03         1.00450E+00         4.66225E-01         1.00454E+00         1.48378E+02         1.00000E+00         1.21077E-04         1.48378E+02         6.77364E+01         8.06417E+01
+          1.59873E-02         4.09939E-03        -8.17532E-03         1.00450E+00         4.76896E-01         1.00454E+00         1.43999E+02         1.00000E+00         1.20595E-04         1.43999E+02         6.59936E+01         7.80051E+01
+          1.59873E-02         4.26921E-03        -8.21996E-03         1.00450E+00         4.87567E-01         1.00454E+00         1.39641E+02         1.00000E+00         1.20139E-04         1.39641E+02         6.42446E+01         7.53961E+01
+          1.59873E-02         4.43904E-03        -8.26642E-03         1.00450E+00         4.98237E-01         1.00454E+00         1.35309E+02         1.00000E+00         1.19712E-04         1.35309E+02         6.24913E+01         7.28176E+01
+          1.59873E-02         4.60887E-03        -8.31468E-03         1.00450E+00         5.08908E-01         1.00454E+00         1.31008E+02         1.00000E+00         1.19313E-04         1.31008E+02         6.07355E+01         7.02726E+01
+          1.59873E-02         4.77869E-03        -8.36476E-03         1.00450E+00         5.19578E-01         1.00454E+00         1.26743E+02         1.00000E+00         1.18945E-04         1.26743E+02         5.89791E+01         6.77639E+01
+          1.59873E-02         4.94852E-03        -8.41665E-03         1.00450E+00         5.30249E-01         1.00453E+00         1.22518E+02         1.00000E+00         1.18609E-04         1.22518E+02         5.72241E+01         6.52940E+01
+          1.59873E-02         5.11835E-03        -8.47036E-03         1.00450E+00         5.40919E-01         1.00453E+00         1.18338E+02         1.00000E+00         1.18305E-04         1.18338E+02         5.54723E+01         6.28655E+01
+          1.59873E-02         5.28818E-03        -8.52587E-03         1.00450E+00         5.51590E-01         1.00453E+00         1.14206E+02         1.00000E+00         1.18036E-04         1.14206E+02         5.37255E+01         6.04805E+01
+          1.59873E-02         5.45800E-03        -8.58320E-03         1.00450E+00         5.62261E-01         1.00453E+00         1.10127E+02         1.00000E+00         1.17801E-04         1.10127E+02         5.19856E+01         5.81412E+01
+          1.59873E-02         5.62783E-03        -8.64234E-03         1.00450E+00         5.72931E-01         1.00453E+00         1.06104E+02         1.00000E+00         1.17602E-04         1.06104E+02         5.02544E+01         5.58495E+01
+          1.59873E-02         5.79766E-03        -8.70329E-03         1.00450E+00         5.83602E-01         1.00453E+00         1.02141E+02         1.00000E+00         1.17441E-04         1.02141E+02         4.85337E+01         5.36071E+01
+          1.59873E-02         5.96749E-03        -8.76606E-03         1.00449E+00         5.94272E-01         1.00453E+00         9.82411E+01         1.00000E+00         1.17317E-04         9.82411E+01         4.68253E+01         5.14158E+01
+          1.59873E-02         6.13731E-03        -8.83063E-03         1.00449E+00         6.04943E-01         1.00453E+00         9.44076E+01         1.00000E+00         1.17232E-04         9.44076E+01         4.51308E+01         4.92768E+01
+          1.59873E-02         6.30714E-03        -8.89702E-03         1.00449E+00         6.15613E-01         1.00453E+00         9.06436E+01         1.00000E+00         1.17187E-04         9.06436E+01         4.34521E+01         4.71915E+01
+          1.59873E-02         6.47697E-03        -8.96522E-03         1.00449E+00         6.26284E-01         1.00453E+00         8.69517E+01         1.00000E+00         1.17182E-04         8.69517E+01         4.17907E+01         4.51610E+01
+          1.59873E-02         6.64680E-03        -9.03523E-03         1.00449E+00         6.36955E-01         1.00453E+00         8.33344E+01         1.00000E+00         1.17218E-04         8.33344E+01         4.01483E+01         4.31861E+01
+          1.59873E-02         6.81662E-03        -9.10705E-03         1.00449E+00         6.47625E-01         1.00453E+00         7.97942E+01         1.00000E+00         1.17297E-04         7.97942E+01         3.85265E+01         4.12677E+01
+          1.59873E-02         6.98645E-03        -9.18069E-03         1.00449E+00         6.58296E-01         1.00453E+00         7.63332E+01         1.00000E+00         1.17418E-04         7.63332E+01         3.69267E+01         3.94065E+01
+          1.59873E-02         7.15628E-03        -9.25614E-03         1.00449E+00         6.68966E-01         1.00453E+00         7.29534E+01         1.00000E+00         1.17582E-04         7.29534E+01         3.53506E+01         3.76028E+01
+          1.59873E-02         7.32611E-03        -9.33340E-03         1.00448E+00         6.79637E-01         1.00453E+00         6.96564E+01         1.00000E+00         1.17791E-04         6.96564E+01         3.37995E+01         3.58569E+01
+          1.59873E-02         7.49593E-03        -9.41247E-03         1.00448E+00         6.90307E-01         1.00453E+00         6.64440E+01         1.00000E+00         1.18043E-04         6.64440E+01         3.22748E+01         3.41692E+01
+          1.59873E-02         7.66576E-03        -9.49335E-03         1.00448E+00         7.00978E-01         1.00453E+00         6.33174E+01         1.00000E+00         1.18342E-04         6.33174E+01         3.07778E+01         3.25396E+01
+          1.59873E-02         7.83559E-03        -9.57605E-03         1.00448E+00         7.11649E-01         1.00453E+00         6.02779E+01         1.00000E+00         1.18685E-04         6.02779E+01         2.93098E+01         3.09681E+01
+          1.59873E-02         8.00542E-03        -9.66056E-03         1.00448E+00         7.22319E-01         1.00453E+00         5.73264E+01         1.00000E+00         1.19075E-04         5.73264E+01         2.78720E+01         2.94544E+01
+          1.59873E-02         8.17524E-03        -9.74688E-03         1.00448E+00         7.32990E-01         1.00453E+00         5.44637E+01         1.00000E+00         1.19512E-04         5.44637E+01         2.64655E+01         2.79981E+01
+          1.59873E-02         8.34507E-03        -9.83501E-03         1.00448E+00         7.43660E-01         1.00453E+00         5.16904E+01         1.00000E+00         1.19995E-04         5.16904E+01         2.50914E+01         2.65990E+01
+          1.59873E-02         8.51490E-03        -9.92495E-03         1.00448E+00         7.54331E-01         1.00452E+00         4.90071E+01         1.00000E+00         1.20526E-04         4.90071E+01         2.37508E+01         2.52563E+01
+          1.59873E-02         8.68473E-03        -1.00167E-02         1.00447E+00         7.65001E-01         1.00452E+00         4.64139E+01         1.00000E+00         1.21105E-04         4.64139E+01         2.24444E+01         2.39695E+01
+          1.59873E-02         8.85455E-03        -1.01103E-02         1.00447E+00         7.75672E-01         1.00452E+00         4.39111E+01         1.00000E+00         1.21732E-04         4.39111E+01         2.11732E+01         2.27379E+01
+          1.59873E-02         9.02438E-03        -1.02057E-02         1.00447E+00         7.86343E-01         1.00452E+00         4.14984E+01         1.00000E+00         1.22407E-04         4.14984E+01         1.99380E+01         2.15604E+01
+          1.59873E-02         9.19421E-03        -1.03029E-02         1.00447E+00         7.97013E-01         1.00452E+00         3.91758E+01         1.00000E+00         1.23131E-04         3.91758E+01         1.87394E+01         2.04364E+01
+          1.59873E-02         9.36403E-03        -1.04019E-02         1.00447E+00         8.07684E-01         1.00452E+00         3.69428E+01         1.00000E+00         1.23903E-04         3.69428E+01         1.75782E+01         1.93646E+01
+          1.59873E-02         9.53386E-03        -1.05027E-02         1.00447E+00         8.18354E-01         1.00452E+00         3.47991E+01         1.00000E+00         1.24725E-04         3.47991E+01         1.64549E+01         1.83442E+01
+          1.59873E-02         9.70369E-03        -1.06053E-02         1.00446E+00         8.29025E-01         1.00452E+00         3.27438E+01         1.00000E+00         1.25595E-04         3.27438E+01         1.53699E+01         1.73739E+01
+          1.59873E-02         9.87352E-03        -1.07097E-02         1.00446E+00         8.39695E-01         1.00452E+00         3.07763E+01         1.00000E+00         1.26514E-04         3.07763E+01         1.43237E+01         1.64527E+01
+          1.59873E-02         1.00433E-02        -1.08160E-02         1.00446E+00         8.50366E-01         1.00452E+00         2.88957E+01         1.00000E+00         1.27482E-04         2.88957E+01         1.33165E+01         1.55792E+01
+          1.59873E-02         1.02132E-02        -1.09241E-02         1.00446E+00         8.61037E-01         1.00452E+00         2.71009E+01         1.00000E+00         1.28500E-04         2.71009E+01         1.23488E+01         1.47522E+01
+          1.59873E-02         1.03830E-02        -1.10339E-02         1.00446E+00         8.71707E-01         1.00452E+00         2.53909E+01         1.00000E+00         1.29566E-04         2.53909E+01         1.14205E+01         1.39704E+01
+          1.59873E-02         1.05528E-02        -1.11456E-02         1.00446E+00         8.82378E-01         1.00452E+00         2.37643E+01         1.00000E+00         1.30680E-04         2.37643E+01         1.05319E+01         1.32324E+01
+          1.59873E-02         1.07227E-02        -1.12591E-02         1.00445E+00         8.93048E-01         1.00452E+00         2.22199E+01         1.00000E+00         1.31843E-04         2.22199E+01         9.68289E+00         1.25370E+01
+          1.59873E-02         1.08925E-02        -1.13745E-02         1.00445E+00         9.03719E-01         1.00452E+00         2.07561E+01         1.00000E+00         1.33054E-04         2.07561E+01         8.87349E+00         1.18826E+01
+          1.59873E-02         1.10623E-02        -1.14916E-02         1.00445E+00         9.14389E-01         1.00452E+00         1.93716E+01         1.00000E+00         1.34313E-04         1.93716E+01         8.10356E+00         1.12680E+01
+          1.59873E-02         1.12321E-02        -1.16105E-02         1.00445E+00         9.25060E-01         1.00452E+00         1.80647E+01         1.00000E+00         1.35619E-04         1.80647E+01         7.37290E+00         1.06918E+01
+          1.59873E-02         1.14020E-02        -1.17313E-02         1.00445E+00         9.35731E-01         1.00452E+00         1.68336E+01         1.00000E+00         1.36973E-04         1.68336E+01         6.68123E+00         1.01524E+01
+          1.59873E-02         1.15718E-02        -1.18538E-02         1.00444E+00         9.46401E-01         1.00451E+00         1.56768E+01         1.00000E+00         1.38372E-04         1.56768E+01         6.02822E+00         9.64858E+00
+          1.59873E-02         1.17416E-02        -1.19782E-02         1.00444E+00         9.57072E-01         1.00451E+00         1.45923E+01         1.00000E+00         1.39818E-04         1.45923E+01         5.41345E+00         9.17889E+00
+          1.59873E-02         1.19114E-02        -1.21044E-02         1.00444E+00         9.67742E-01         1.00451E+00         1.35784E+01         1.00000E+00         1.41308E-04         1.35784E+01         4.83645E+00         8.74193E+00
+          1.59873E-02         1.20813E-02        -1.22324E-02         1.00444E+00         9.78413E-01         1.00451E+00         1.26330E+01         1.00000E+00         1.42844E-04         1.26330E+01         4.29669E+00         8.33634E+00
+          1.59873E-02         1.22511E-02        -1.23622E-02         1.00444E+00         9.89083E-01         1.00451E+00         1.17543E+01         1.00000E+00         1.44423E-04         1.17543E+01         3.79356E+00         7.96076E+00
+          1.59873E-02         1.24209E-02        -1.24938E-02         1.00443E+00         9.99754E-01         1.00451E+00         1.09403E+01         1.00000E+00         1.46046E-04         1.09403E+01         3.32640E+00         7.61386E+00
+          1.59873E-02         1.25908E-02        -1.26273E-02         1.00443E+00         1.01042E+00         1.00451E+00         1.01888E+01         1.00000E+00         1.47711E-04         1.01888E+01         2.89450E+00         7.29433E+00
+          1.59873E-02         1.27606E-02        -1.27625E-02         1.00443E+00         1.02110E+00         1.00451E+00         9.49796E+00         1.00000E+00         1.49418E-04         9.49796E+00         2.49709E+00         7.00087E+00
+          1.59873E-02         1.29304E-02        -1.28996E-02         1.00443E+00         1.03177E+00         1.00451E+00         8.86556E+00         1.00000E+00         1.51166E-04         8.86556E+00         2.13334E+00         6.73223E+00
+          1.59873E-02         1.31002E-02        -1.30385E-02         1.00443E+00         1.04244E+00         1.00451E+00         8.28956E+00         1.00000E+00         1.52954E-04         8.28956E+00         1.80239E+00         6.48717E+00
+          1.59873E-02         1.32701E-02        -1.31792E-02         1.00442E+00         1.05311E+00         1.00451E+00         7.76782E+00         1.00000E+00         1.54782E-04         7.76782E+00         1.50332E+00         6.26450E+00
+          1.59873E-02         1.34399E-02        -1.33217E-02         1.00442E+00         1.06378E+00         1.00451E+00         7.29823E+00         1.00000E+00         1.56647E-04         7.29823E+00         1.23517E+00         6.06306E+00
+          1.59873E-02         1.36097E-02        -1.34660E-02         1.00442E+00         1.07445E+00         1.00451E+00         6.87867E+00         1.00000E+00         1.58550E-04         6.87867E+00         9.96957E-01         5.88171E+00
+          1.59873E-02         1.37795E-02        -1.36121E-02         1.00442E+00         1.08512E+00         1.00451E+00         6.50700E+00         1.00000E+00         1.60490E-04         6.50700E+00         7.87644E-01         5.71935E+00
+          1.59873E-02         1.39494E-02        -1.37600E-02         1.00441E+00         1.09579E+00         1.00451E+00         6.18110E+00         1.00000E+00         1.62465E-04         6.18110E+00         6.06168E-01         5.57493E+00
+          1.59873E-02         1.41192E-02        -1.39098E-02         1.00441E+00         1.10646E+00         1.00451E+00         5.89887E+00         1.00000E+00         1.64476E-04         5.89887E+00         4.51440E-01         5.44743E+00
+          1.59873E-02         1.42890E-02        -1.40613E-02         1.00441E+00         1.11713E+00         1.00451E+00         5.65819E+00         1.00000E+00         1.66520E-04         5.65819E+00         3.22343E-01         5.33584E+00
+          1.59873E-02         1.44589E-02        -1.42147E-02         1.00441E+00         1.12780E+00         1.00451E+00         5.45697E+00         1.00000E+00         1.68598E-04         5.45697E+00         2.17738E-01         5.23923E+00
+          1.59873E-02         1.46287E-02        -1.43699E-02         1.00440E+00         1.13847E+00         1.00451E+00         5.29315E+00         1.00000E+00         1.70707E-04         5.29315E+00         1.36470E-01         5.15668E+00
+          1.59873E-02         1.47985E-02        -1.45269E-02         1.00440E+00         1.14914E+00         1.00451E+00         5.16467E+00         1.00000E+00         1.72849E-04         5.16467E+00         7.73679E-02         5.08730E+00
+          1.59873E-02         1.49683E-02        -1.46857E-02         1.00440E+00         1.15981E+00         1.00451E+00         5.06950E+00         1.00000E+00         1.75021E-04         5.06950E+00         3.92484E-02         5.03025E+00
+          1.59873E-02         1.51382E-02        -1.48463E-02         1.00440E+00         1.17048E+00         1.00451E+00         5.00565E+00         1.00000E+00         1.77224E-04         5.00565E+00         2.09215E-02         4.98473E+00
+          1.59873E-02         1.53080E-02        -1.50088E-02         1.00439E+00         1.18115E+00         1.00451E+00         4.97114E+00         1.00000E+00         1.79456E-04         4.97114E+00         2.11920E-02         4.94995E+00
+          1.59873E-02         1.54778E-02        -1.51730E-02         1.00439E+00         1.19182E+00         1.00451E+00         4.96404E+00         1.00000E+00         1.81716E-04         4.96404E+00         3.88636E-02         4.92517E+00
+          1.59873E-02         1.56476E-02        -1.53391E-02         1.00439E+00         1.20249E+00         1.00451E+00         4.98243E+00         1.00000E+00         1.84005E-04         4.98243E+00         7.27419E-02         4.90968E+00
+          1.59873E-02         1.58175E-02        -1.55070E-02         1.00439E+00         1.21317E+00         1.00451E+00         5.02444E+00         1.00000E+00         1.86322E-04         5.02444E+00         1.21638E-01         4.90281E+00
+          1.59873E-02         1.59873E-02        -1.56766E-02         1.00438E+00         1.22384E+00         1.00451E+00         5.08825E+00         1.00000E+00         1.88665E-04         5.08825E+00         1.84371E-01         4.90388E+00
+          1.59873E-02         1.61571E-02        -1.58481E-02         1.00438E+00         1.23451E+00         1.00451E+00         5.17206E+00         1.00000E+00         1.91035E-04         5.17206E+00         2.59771E-01         4.91229E+00
+          1.59873E-02         1.63270E-02        -1.60215E-02         1.00438E+00         1.24518E+00         1.00451E+00         5.27412E+00         1.00000E+00         1.93431E-04         5.27412E+00         3.46683E-01         4.92744E+00
+          1.59873E-02         1.64968E-02        -1.61966E-02         1.00438E+00         1.25585E+00         1.00451E+00         5.39271E+00         1.00000E+00         1.95853E-04         5.39271E+00         4.43970E-01         4.94874E+00
+          1.59873E-02         1.66666E-02        -1.63735E-02         1.00437E+00         1.26652E+00         1.00451E+00         5.52618E+00         1.00000E+00         1.98300E-04         5.52618E+00         5.50513E-01         4.97567E+00
+          1.59873E-02         1.68364E-02        -1.65523E-02         1.00437E+00         1.27719E+00         1.00451E+00         5.67289E+00         1.00000E+00         2.00772E-04         5.67289E+00         6.65216E-01         5.00768E+00
+          1.59873E-02         1.70063E-02        -1.67328E-02         1.00437E+00         1.28786E+00         1.00451E+00         5.83128E+00         1.00000E+00         2.03269E-04         5.83128E+00         7.87009E-01         5.04427E+00
+          1.59873E-02         1.71761E-02        -1.69152E-02         1.00436E+00         1.29853E+00         1.00451E+00         5.99982E+00         1.00000E+00         2.05790E-04         5.99982E+00         9.14848E-01         5.08497E+00
+          1.59873E-02         1.73459E-02        -1.70994E-02         1.00436E+00         1.30920E+00         1.00451E+00         6.17703E+00         1.00000E+00         2.08336E-04         6.17703E+00         1.04772E+00         5.12931E+00
+          1.59873E-02         1.75158E-02        -1.72854E-02         1.00436E+00         1.31987E+00         1.00451E+00         6.36147E+00         1.00000E+00         2.10905E-04         6.36147E+00         1.18464E+00         5.17683E+00
+          1.59873E-02         1.76856E-02        -1.74732E-02         1.00435E+00         1.33054E+00         1.00451E+00         6.55178E+00         1.00000E+00         2.13497E-04         6.55178E+00         1.32466E+00         5.22712E+00
+          1.59873E-02         1.78554E-02        -1.76628E-02         1.00435E+00         1.34121E+00         1.00451E+00         6.74661E+00         1.00000E+00         2.16113E-04         6.74661E+00         1.46686E+00         5.27975E+00
+          1.59873E-02         1.80252E-02        -1.78543E-02         1.00435E+00         1.35188E+00         1.00451E+00         6.94470E+00         1.00000E+00         2.18752E-04         6.94470E+00         1.61037E+00         5.33432E+00
+          1.59873E-02         1.81951E-02        -1.80475E-02         1.00435E+00         1.36255E+00         1.00451E+00         7.14480E+00         1.00000E+00         2.21414E-04         7.14480E+00         1.75435E+00         5.39045E+00
+          1.59873E-02         1.83649E-02        -1.82426E-02         1.00434E+00         1.37322E+00         1.00451E+00         7.34576E+00         1.00000E+00         2.24098E-04         7.34576E+00         1.89800E+00         5.44776E+00
+          1.59873E-02         1.85347E-02        -1.84395E-02         1.00434E+00         1.38389E+00         1.00451E+00         7.54644E+00         1.00000E+00         2.26805E-04         7.54644E+00         2.04055E+00         5.50588E+00
+          1.59873E-02         1.87045E-02        -1.86382E-02         1.00434E+00         1.39457E+00         1.00451E+00         7.74577E+00         1.00000E+00         2.29532E-04         7.74577E+00         2.18130E+00         5.56447E+00
+          1.59873E-02         1.88744E-02        -1.88387E-02         1.00433E+00         1.40524E+00         1.00451E+00         7.94274E+00         1.00000E+00         2.32282E-04         7.94274E+00         2.31955E+00         5.62319E+00
+          1.59873E-02         1.90442E-02        -1.90410E-02         1.00433E+00         1.41591E+00         1.00451E+00         8.13637E+00         1.00000E+00         2.35052E-04         8.13637E+00         2.45468E+00         5.68169E+00
+          1.59873E-02         1.92140E-02        -1.92451E-02         1.00433E+00         1.42658E+00         1.00451E+00         8.32576E+00         1.00000E+00         2.37842E-04         8.32576E+00         2.58610E+00         5.73966E+00
+          1.59873E-02         1.93839E-02        -1.94511E-02         1.00432E+00         1.43725E+00         1.00451E+00         8.51004E+00         1.00000E+00         2.40652E-04         8.51004E+00         2.71326E+00         5.79678E+00
+          1.59873E-02         1.95537E-02        -1.96588E-02         1.00432E+00         1.44792E+00         1.00451E+00         8.68841E+00         1.00000E+00         2.43482E-04         8.68841E+00         2.83565E+00         5.85276E+00
+          1.59873E-02         1.97235E-02        -1.98684E-02         1.00432E+00         1.45859E+00         1.00451E+00         8.86011E+00         1.00000E+00         2.46329E-04         8.86011E+00         2.95282E+00         5.90729E+00
+          1.59873E-02         1.98933E-02        -2.00798E-02         1.00431E+00         1.46926E+00         1.00451E+00         9.02444E+00         1.00000E+00         2.49194E-04         9.02444E+00         3.06435E+00         5.96009E+00
+          1.59873E-02         2.00632E-02        -2.02930E-02         1.00431E+00         1.47993E+00         1.00451E+00         9.18074E+00         1.00000E+00         2.52076E-04         9.18074E+00         3.16986E+00         6.01088E+00
+          1.59873E-02         2.02330E-02        -2.05080E-02         1.00431E+00         1.49060E+00         1.00452E+00         9.32841E+00         1.00000E+00         2.54974E-04         9.32841E+00         3.26902E+00         6.05939E+00
+          1.59873E-02         2.04028E-02        -2.07248E-02         1.00430E+00         1.50127E+00         1.00452E+00         9.46691E+00         1.00000E+00         2.57887E-04         9.46691E+00         3.36154E+00         6.10537E+00
+          1.59873E-02         2.05726E-02        -2.09434E-02         1.00430E+00         1.51194E+00         1.00452E+00         9.59573E+00         1.00000E+00         2.60813E-04         9.59573E+00         3.44718E+00         6.14855E+00
+          1.59873E-02         2.07425E-02        -2.11639E-02         1.00430E+00         1.52261E+00         1.00452E+00         9.71444E+00         1.00000E+00         2.63753E-04         9.71444E+00         3.52573E+00         6.18871E+00
+          1.59873E-02         2.09123E-02        -2.13861E-02         1.00429E+00         1.53328E+00         1.00452E+00         9.82262E+00         1.00000E+00         2.66703E-04         9.82262E+00         3.59701E+00         6.22561E+00
+          1.59873E-02         2.10821E-02        -2.16102E-02         1.00429E+00         1.54395E+00         1.00452E+00         9.91993E+00         1.00000E+00         2.69664E-04         9.91993E+00         3.66090E+00         6.25903E+00
+          1.59873E-02         2.12520E-02        -2.18361E-02         1.00429E+00         1.55462E+00         1.00452E+00         1.00061E+01         1.00000E+00         2.72634E-04         1.00061E+01         3.71731E+00         6.28876E+00
+          1.59873E-02         2.14218E-02        -2.20638E-02         1.00428E+00         1.56529E+00         1.00452E+00         1.00808E+01         1.00000E+00         2.75611E-04         1.00808E+01         3.76618E+00         6.31460E+00
+          1.59873E-02         2.15916E-02        -2.22933E-02         1.00428E+00         1.57596E+00         1.00453E+00         1.01439E+01         1.00000E+00         2.78595E-04         1.01439E+01         3.80748E+00         6.33638E+00
+          1.59873E-02         2.17614E-02        -2.25246E-02         1.00427E+00         1.58664E+00         1.00453E+00         1.01951E+01         1.00000E+00         2.81583E-04         1.01951E+01         3.84124E+00         6.35391E+00
+          1.59873E-02         2.19313E-02        -2.27578E-02         1.00427E+00         1.59731E+00         1.00453E+00         1.02345E+01         1.00000E+00         2.84575E-04         1.02345E+01         3.86749E+00         6.36704E+00
+          1.59873E-02         2.21011E-02        -2.29927E-02         1.00427E+00         1.60798E+00         1.00453E+00         1.02619E+01         1.00000E+00         2.87568E-04         1.02619E+01         3.88630E+00         6.37562E+00
+          1.59873E-02         2.22709E-02        -2.32295E-02         1.00426E+00         1.61865E+00         1.00453E+00         1.02773E+01         1.00000E+00         2.90562E-04         1.02773E+01         3.89778E+00         6.37951E+00
+          1.59873E-02         2.24407E-02        -2.34681E-02         1.00426E+00         1.62932E+00         1.00453E+00         1.02807E+01         1.00000E+00         2.93555E-04         1.02807E+01         3.90206E+00         6.37861E+00
+          1.59873E-02         2.26106E-02        -2.37085E-02         1.00426E+00         1.63999E+00         1.00453E+00         1.02721E+01         1.00000E+00         2.96545E-04         1.02721E+01         3.89930E+00         6.37281E+00
+          1.59873E-02         2.27804E-02        -2.39507E-02         1.00425E+00         1.65066E+00         1.00454E+00         1.02517E+01         1.00000E+00         2.99531E-04         1.02517E+01         3.88966E+00         6.36203E+00
+          1.59873E-02         2.29502E-02        -2.41947E-02         1.00425E+00         1.66133E+00         1.00454E+00         1.02195E+01         1.00000E+00         3.02512E-04         1.02195E+01         3.87336E+00         6.34619E+00
+          1.59873E-02         2.31201E-02        -2.44405E-02         1.00424E+00         1.67200E+00         1.00454E+00         1.01758E+01         1.00000E+00         3.05486E-04         1.01758E+01         3.85060E+00         6.32524E+00
+          1.59873E-02         2.32899E-02        -2.46882E-02         1.00424E+00         1.68267E+00         1.00454E+00         1.01208E+01         1.00000E+00         3.08453E-04         1.01208E+01         3.82164E+00         6.29914E+00
+          1.59873E-02         2.34597E-02        -2.49376E-02         1.00424E+00         1.69334E+00         1.00455E+00         1.00546E+01         1.00000E+00         3.11410E-04         1.00546E+01         3.78672E+00         6.26789E+00
+          1.59873E-02         2.36295E-02        -2.51889E-02         1.00423E+00         1.70401E+00         1.00455E+00         9.97758E+00         1.00000E+00         3.14356E-04         9.97758E+00         3.74612E+00         6.23147E+00
+          1.59873E-02         2.37994E-02        -2.54420E-02         1.00423E+00         1.71468E+00         1.00455E+00         9.89001E+00         1.00000E+00         3.17291E-04         9.89001E+00         3.70011E+00         6.18989E+00
+          1.59873E-02         2.39692E-02        -2.56969E-02         1.00422E+00         1.72535E+00         1.00455E+00         9.79221E+00         1.00000E+00         3.20213E-04         9.79221E+00         3.64900E+00         6.14321E+00
+          1.59873E-02         2.41390E-02        -2.59536E-02         1.00422E+00         1.73602E+00         1.00455E+00         9.68455E+00         1.00000E+00         3.23122E-04         9.68455E+00         3.59309E+00         6.09146E+00
+          1.59873E-02         2.43088E-02        -2.62121E-02         1.00422E+00         1.74669E+00         1.00456E+00         9.56740E+00         1.00000E+00         3.26016E-04         9.56740E+00         3.53268E+00         6.03472E+00
+          1.59873E-02         2.44787E-02        -2.64724E-02         1.00421E+00         1.75736E+00         1.00456E+00         9.44118E+00         1.00000E+00         3.28895E-04         9.44118E+00         3.46810E+00         5.97308E+00
+          1.59873E-02         2.46485E-02        -2.67346E-02         1.00421E+00         1.76804E+00         1.00456E+00         9.30631E+00         1.00000E+00         3.31759E-04         9.30631E+00         3.39967E+00         5.90664E+00
+          1.59873E-02         2.48183E-02        -2.69986E-02         1.00420E+00         1.77871E+00         1.00457E+00         9.16324E+00         1.00000E+00         3.34605E-04         9.16324E+00         3.32772E+00         5.83552E+00
+          1.59873E-02         2.49882E-02        -2.72643E-02         1.00420E+00         1.78938E+00         1.00457E+00         9.01244E+00         1.00000E+00         3.37434E-04         9.01244E+00         3.25257E+00         5.75987E+00
+          1.59873E-02         2.51580E-02        -2.75319E-02         1.00419E+00         1.80005E+00         1.00457E+00         8.85439E+00         1.00000E+00         3.40246E-04         8.85439E+00         3.17456E+00         5.67983E+00
+          1.59873E-02         2.53278E-02        -2.78014E-02         1.00419E+00         1.81072E+00         1.00457E+00         8.68959E+00         1.00000E+00         3.43040E-04         8.68959E+00         3.09400E+00         5.59559E+00
+          1.59873E-02         2.54976E-02        -2.80726E-02         1.00419E+00         1.82139E+00         1.00458E+00         8.51856E+00         1.00000E+00         3.45816E-04         8.51856E+00         3.01123E+00         5.50733E+00
+          1.59873E-02         2.56675E-02        -2.83456E-02         1.00418E+00         1.83206E+00         1.00458E+00         8.34182E+00         1.00000E+00         3.48572E-04         8.34182E+00         2.92657E+00         5.41525E+00
+          1.59873E-02         2.58373E-02        -2.86205E-02         1.00418E+00         1.84273E+00         1.00458E+00         8.15989E+00         1.00000E+00         3.51311E-04         8.15989E+00         2.84032E+00         5.31957E+00
+          1.59873E-02         2.60071E-02        -2.88971E-02         1.00417E+00         1.85340E+00         1.00459E+00         7.97333E+00         1.00000E+00         3.54030E-04         7.97333E+00         2.75281E+00         5.22051E+00
+          1.59873E-02         2.61769E-02        -2.91756E-02         1.00417E+00         1.86407E+00         1.00459E+00         7.78267E+00         1.00000E+00         3.56730E-04         7.78267E+00         2.66434E+00         5.11833E+00
+          1.61571E-02         8.72665E-04        -7.84288E-03         1.01518E+00         2.74155E-01         1.01521E+00         2.15852E+02         1.00000E+00         9.59384E-05         2.15852E+02         9.01146E+01         1.25737E+02
+          1.61571E-02         1.04249E-03        -7.85310E-03         1.01518E+00         2.84826E-01         1.01521E+00         2.12214E+02         1.00000E+00         9.54806E-05         2.12214E+02         8.89206E+01         1.23294E+02
+          1.61571E-02         1.21232E-03        -7.86513E-03         1.01518E+00         2.95496E-01         1.01521E+00         2.08497E+02         1.00000E+00         9.50202E-05         2.08497E+02         8.76921E+01         1.20805E+02
+          1.61571E-02         1.38215E-03        -7.87897E-03         1.01518E+00         3.06167E-01         1.01521E+00         2.04706E+02         1.00000E+00         9.45585E-05         2.04706E+02         8.64302E+01         1.18276E+02
+          1.61571E-02         1.55197E-03        -7.89462E-03         1.01518E+00         3.16838E-01         1.01521E+00         2.00847E+02         1.00000E+00         9.40970E-05         2.00847E+02         8.51362E+01         1.15710E+02
+          1.61571E-02         1.72180E-03        -7.91208E-03         1.01518E+00         3.27508E-01         1.01521E+00         1.96925E+02         1.00000E+00         9.36368E-05         1.96925E+02         8.38114E+01         1.13114E+02
+          1.61571E-02         1.89163E-03        -7.93136E-03         1.01518E+00         3.38179E-01         1.01521E+00         1.92947E+02         1.00000E+00         9.31795E-05         1.92947E+02         8.24571E+01         1.10490E+02
+          1.61571E-02         2.06146E-03        -7.95245E-03         1.01518E+00         3.48849E-01         1.01521E+00         1.88919E+02         1.00000E+00         9.27262E-05         1.88919E+02         8.10748E+01         1.07844E+02
+          1.61571E-02         2.23128E-03        -7.97535E-03         1.01518E+00         3.59520E-01         1.01521E+00         1.84846E+02         1.00000E+00         9.22784E-05         1.84846E+02         7.96658E+01         1.05180E+02
+          1.61571E-02         2.40111E-03        -8.00006E-03         1.01518E+00         3.70190E-01         1.01521E+00         1.80734E+02         1.00000E+00         9.18374E-05         1.80734E+02         7.82316E+01         1.02502E+02
+          1.61571E-02         2.57094E-03        -8.02658E-03         1.01518E+00         3.80861E-01         1.01521E+00         1.76588E+02         1.00000E+00         9.14043E-05         1.76588E+02         7.67736E+01         9.98148E+01
+          1.61571E-02         2.74077E-03        -8.05492E-03         1.01518E+00         3.91532E-01         1.01521E+00         1.72416E+02         1.00000E+00         9.09806E-05         1.72416E+02         7.52934E+01         9.71224E+01
+          1.61571E-02         2.91059E-03        -8.08507E-03         1.01518E+00         4.02202E-01         1.01521E+00         1.68221E+02         1.00000E+00         9.05674E-05         1.68221E+02         7.37925E+01         9.44290E+01
+          1.61571E-02         3.08042E-03        -8.11703E-03         1.01518E+00         4.12873E-01         1.01521E+00         1.64011E+02         1.00000E+00         9.01659E-05         1.64011E+02         7.22724E+01         9.17388E+01
+          1.61571E-02         3.25025E-03        -8.15080E-03         1.01518E+00         4.23543E-01         1.01521E+00         1.59790E+02         1.00000E+00         8.97774E-05         1.59790E+02         7.07348E+01         8.90556E+01
+          1.61571E-02         3.42008E-03        -8.18638E-03         1.01518E+00         4.34214E-01         1.01521E+00         1.55565E+02         1.00000E+00         8.94030E-05         1.55565E+02         6.91813E+01         8.63833E+01
+          1.61571E-02         3.58990E-03        -8.22378E-03         1.01518E+00         4.44884E-01         1.01521E+00         1.51339E+02         1.00000E+00         8.90438E-05         1.51339E+02         6.76134E+01         8.37257E+01
+          1.61571E-02         3.75973E-03        -8.26299E-03         1.01518E+00         4.55555E-01         1.01521E+00         1.47119E+02         1.00000E+00         8.87010E-05         1.47119E+02         6.60329E+01         8.10863E+01
+          1.61571E-02         3.92956E-03        -8.30401E-03         1.01517E+00         4.66225E-01         1.01521E+00         1.42910E+02         1.00000E+00         8.83757E-05         1.42910E+02         6.44414E+01         7.84686E+01
+          1.61571E-02         4.09939E-03        -8.34684E-03         1.01517E+00         4.76896E-01         1.01521E+00         1.38717E+02         1.00000E+00         8.80688E-05         1.38717E+02         6.28407E+01         7.58760E+01
+          1.61571E-02         4.26921E-03        -8.39148E-03         1.01517E+00         4.87567E-01         1.01521E+00         1.34544E+02         1.00000E+00         8.77814E-05         1.34544E+02         6.12323E+01         7.33116E+01
+          1.61571E-02         4.43904E-03        -8.43794E-03         1.01517E+00         4.98237E-01         1.01521E+00         1.30397E+02         1.00000E+00         8.75146E-05         1.30397E+02         5.96180E+01         7.07786E+01
+          1.61571E-02         4.60887E-03        -8.48620E-03         1.01517E+00         5.08908E-01         1.01521E+00         1.26279E+02         1.00000E+00         8.72691E-05         1.26279E+02         5.79995E+01         6.82797E+01
+          1.61571E-02         4.77869E-03        -8.53628E-03         1.01517E+00         5.19578E-01         1.01521E+00         1.22196E+02         1.00000E+00         8.70460E-05         1.22196E+02         5.63785E+01         6.58177E+01
+          1.61571E-02         4.94852E-03        -8.58817E-03         1.01517E+00         5.30249E-01         1.01521E+00         1.18152E+02         1.00000E+00         8.68463E-05         1.18152E+02         5.47567E+01         6.33951E+01
+          1.61571E-02         5.11835E-03        -8.64188E-03         1.01517E+00         5.40919E-01         1.01521E+00         1.14150E+02         1.00000E+00         8.66706E-05         1.14150E+02         5.31359E+01         6.10143E+01
+          1.61571E-02         5.28818E-03        -8.69739E-03         1.01517E+00         5.51590E-01         1.01521E+00         1.10195E+02         1.00000E+00         8.65200E-05         1.10195E+02         5.15177E+01         5.86776E+01
+          1.61571E-02         5.45800E-03        -8.75472E-03         1.01517E+00         5.62261E-01         1.01521E+00         1.06291E+02         1.00000E+00         8.63951E-05         1.06291E+02         4.99037E+01         5.63870E+01
+          1.61571E-02         5.62783E-03        -8.81386E-03         1.01517E+00         5.72931E-01         1.01520E+00         1.02440E+02         1.00000E+00         8.62969E-05         1.02440E+02         4.82958E+01         5.41444E+01
+          1.61571E-02         5.79766E-03        -8.87481E-03         1.01517E+00         5.83602E-01         1.01520E+00         9.86469E+01         1.00000E+00         8.62260E-05         9.86469E+01         4.66955E+01         5.19514E+01
+          1.61571E-02         5.96749E-03        -8.93757E-03         1.01516E+00         5.94272E-01         1.01520E+00         9.49142E+01         1.00000E+00         8.61833E-05         9.49142E+01         4.51045E+01         4.98097E+01
+          1.61571E-02         6.13731E-03        -9.00215E-03         1.01516E+00         6.04943E-01         1.01520E+00         9.12450E+01         1.00000E+00         8.61693E-05         9.12450E+01         4.35245E+01         4.77205E+01
+          1.61571E-02         6.30714E-03        -9.06854E-03         1.01516E+00         6.15613E-01         1.01520E+00         8.76421E+01         1.00000E+00         8.61849E-05         8.76421E+01         4.19569E+01         4.56852E+01
+          1.61571E-02         6.47697E-03        -9.13674E-03         1.01516E+00         6.26284E-01         1.01520E+00         8.41081E+01         1.00000E+00         8.62307E-05         8.41081E+01         4.04035E+01         4.37047E+01
+          1.61571E-02         6.64680E-03        -9.20675E-03         1.01516E+00         6.36955E-01         1.01520E+00         8.06455E+01         1.00000E+00         8.63072E-05         8.06455E+01         3.88656E+01         4.17799E+01
+          1.61571E-02         6.81662E-03        -9.27857E-03         1.01516E+00         6.47625E-01         1.01520E+00         7.72563E+01         1.00000E+00         8.64153E-05         7.72563E+01         3.73449E+01         3.99115E+01
+          1.61571E-02         6.98645E-03        -9.35221E-03         1.01516E+00         6.58296E-01         1.01520E+00         7.39428E+01         1.00000E+00         8.65554E-05         7.39428E+01         3.58427E+01         3.81000E+01
+          1.61571E-02         7.15628E-03        -9.42765E-03         1.01516E+00         6.68966E-01         1.01520E+00         7.07066E+01         1.00000E+00         8.67281E-05         7.07066E+01         3.43606E+01         3.63459E+01
+          1.61571E-02         7.32611E-03        -9.50491E-03         1.01516E+00         6.79637E-01         1.01520E+00         6.75494E+01         1.00000E+00         8.69340E-05         6.75494E+01         3.28999E+01         3.46495E+01
+          1.61571E-02         7.49593E-03        -9.58398E-03         1.01515E+00         6.90307E-01         1.01520E+00         6.44728E+01         1.00000E+00         8.71736E-05         6.44728E+01         3.14619E+01         3.30108E+01
+          1.61571E-02         7.66576E-03        -9.66487E-03         1.01515E+00         7.00978E-01         1.01520E+00         6.14778E+01         1.00000E+00         8.74474E-05         6.14778E+01         3.00480E+01         3.14298E+01
+          1.61571E-02         7.83559E-03        -9.74756E-03         1.01515E+00         7.11649E-01         1.01520E+00         5.85658E+01         1.00000E+00         8.77559E-05         5.85658E+01         2.86593E+01         2.99064E+01
+          1.61571E-02         8.00542E-03        -9.83207E-03         1.01515E+00         7.22319E-01         1.01520E+00         5.57374E+01         1.00000E+00         8.80995E-05         5.57374E+01         2.72971E+01         2.84403E+01
+          1.61571E-02         8.17524E-03        -9.91839E-03         1.01515E+00         7.32990E-01         1.01520E+00         5.29936E+01         1.00000E+00         8.84786E-05         5.29936E+01         2.59625E+01         2.70311E+01
+          1.61571E-02         8.34507E-03        -1.00065E-02         1.01515E+00         7.43660E-01         1.01520E+00         5.03347E+01         1.00000E+00         8.88937E-05         5.03347E+01         2.46565E+01         2.56782E+01
+          1.61571E-02         8.51490E-03        -1.00965E-02         1.01515E+00         7.54331E-01         1.01520E+00         4.77613E+01         1.00000E+00         8.93450E-05         4.77613E+01         2.33802E+01         2.43811E+01
+          1.61571E-02         8.68473E-03        -1.01882E-02         1.01514E+00         7.65001E-01         1.01520E+00         4.52736E+01         1.00000E+00         8.98329E-05         4.52736E+01         2.21345E+01         2.31391E+01
+          1.61571E-02         8.85455E-03        -1.02818E-02         1.01514E+00         7.75672E-01         1.01519E+00         4.28715E+01         1.00000E+00         9.03576E-05         4.28715E+01         2.09203E+01         2.19512E+01
+          1.61571E-02         9.02438E-03        -1.03772E-02         1.01514E+00         7.86343E-01         1.01519E+00         4.05551E+01         1.00000E+00         9.09195E-05         4.05551E+01         1.97385E+01         2.08167E+01
+          1.61571E-02         9.19421E-03        -1.04744E-02         1.01514E+00         7.97013E-01         1.01519E+00         3.83242E+01         1.00000E+00         9.15187E-05         3.83242E+01         1.85897E+01         1.97345E+01
+          1.61571E-02         9.36403E-03        -1.05734E-02         1.01514E+00         8.07684E-01         1.01519E+00         3.61782E+01         1.00000E+00         9.21554E-05         3.61782E+01         1.74747E+01         1.87036E+01
+          1.61571E-02         9.53386E-03        -1.06742E-02         1.01514E+00         8.18354E-01         1.01519E+00         3.41169E+01         1.00000E+00         9.28296E-05         3.41169E+01         1.63941E+01         1.77228E+01
+          1.61571E-02         9.70369E-03        -1.07768E-02         1.01513E+00         8.29025E-01         1.01519E+00         3.21394E+01         1.00000E+00         9.35416E-05         3.21394E+01         1.53484E+01         1.67910E+01
+          1.61571E-02         9.87352E-03        -1.08813E-02         1.01513E+00         8.39695E-01         1.01519E+00         3.02451E+01         1.00000E+00         9.42912E-05         3.02451E+01         1.43381E+01         1.59070E+01
+          1.61571E-02         1.00433E-02        -1.09875E-02         1.01513E+00         8.50366E-01         1.01519E+00         2.84331E+01         1.00000E+00         9.50785E-05         2.84331E+01         1.33637E+01         1.50694E+01
+          1.61571E-02         1.02132E-02        -1.10956E-02         1.01513E+00         8.61037E-01         1.01519E+00         2.67024E+01         1.00000E+00         9.59035E-05         2.67024E+01         1.24253E+01         1.42770E+01
+          1.61571E-02         1.03830E-02        -1.12055E-02         1.01513E+00         8.71707E-01         1.01519E+00         2.50519E+01         1.00000E+00         9.67660E-05         2.50519E+01         1.15234E+01         1.35284E+01
+          1.61571E-02         1.05528E-02        -1.13171E-02         1.01513E+00         8.82378E-01         1.01519E+00         2.34804E+01         1.00000E+00         9.76659E-05         2.34804E+01         1.06581E+01         1.28223E+01
+          1.61571E-02         1.07227E-02        -1.14306E-02         1.01512E+00         8.93048E-01         1.01519E+00         2.19867E+01         1.00000E+00         9.86029E-05         2.19867E+01         9.82955E+00         1.21571E+01
+          1.61571E-02         1.08925E-02        -1.15460E-02         1.01512E+00         9.03719E-01         1.01519E+00         2.05694E+01         1.00000E+00         9.95769E-05         2.05694E+01         9.03773E+00         1.15316E+01
+          1.61571E-02         1.10623E-02        -1.16631E-02         1.01512E+00         9.14389E-01         1.01519E+00         1.92270E+01         1.00000E+00         1.00588E-04         1.92270E+01         8.28266E+00         1.09443E+01
+          1.61571E-02         1.12321E-02        -1.17820E-02         1.01512E+00         9.25060E-01         1.01519E+00         1.79580E+01         1.00000E+00         1.01635E-04         1.79580E+01         7.56423E+00         1.03938E+01
+          1.61571E-02         1.14020E-02        -1.19028E-02         1.01512E+00         9.35731E-01         1.01519E+00         1.67608E+01         1.00000E+00         1.02717E-04         1.67608E+01         6.88230E+00         9.87855E+00
+          1.61571E-02         1.15718E-02        -1.20253E-02         1.01511E+00         9.46401E-01         1.01519E+00         1.56339E+01         1.00000E+00         1.03836E-04         1.56339E+01         6.23662E+00         9.39728E+00
+          1.61571E-02         1.17416E-02        -1.21497E-02         1.01511E+00         9.57072E-01         1.01519E+00         1.45754E+01         1.00000E+00         1.04989E-04         1.45754E+01         5.62691E+00         8.94852E+00
+          1.61571E-02         1.19114E-02        -1.22759E-02         1.01511E+00         9.67742E-01         1.01518E+00         1.35837E+01         1.00000E+00         1.06177E-04         1.35837E+01         5.05281E+00         8.53089E+00
+          1.61571E-02         1.20813E-02        -1.24039E-02         1.01511E+00         9.78413E-01         1.01518E+00         1.26569E+01         1.00000E+00         1.07400E-04         1.26569E+01         4.51390E+00         8.14300E+00
+          1.61571E-02         1.22511E-02        -1.25337E-02         1.01511E+00         9.89083E-01         1.01518E+00         1.17932E+01         1.00000E+00         1.08655E-04         1.17932E+01         4.00970E+00         7.78350E+00
+          1.61571E-02         1.24209E-02        -1.26653E-02         1.01510E+00         9.99754E-01         1.01518E+00         1.09907E+01         1.00000E+00         1.09944E-04         1.09907E+01         3.53966E+00         7.45106E+00
+          1.61571E-02         1.25908E-02        -1.27988E-02         1.01510E+00         1.01042E+00         1.01518E+00         1.02476E+01         1.00000E+00         1.11265E-04         1.02476E+01         3.10319E+00         7.14437E+00
+          1.61571E-02         1.27606E-02        -1.29340E-02         1.01510E+00         1.02110E+00         1.01518E+00         9.56181E+00         1.00000E+00         1.12618E-04         9.56181E+00         2.69965E+00         6.86217E+00
+          1.61571E-02         1.29304E-02        -1.30711E-02         1.01510E+00         1.03177E+00         1.01518E+00         8.93152E+00         1.00000E+00         1.14001E-04         8.93152E+00         2.32831E+00         6.60320E+00
+          1.61571E-02         1.31002E-02        -1.32100E-02         1.01510E+00         1.04244E+00         1.01518E+00         8.35473E+00         1.00000E+00         1.15416E-04         8.35473E+00         1.98845E+00         6.36627E+00
+          1.61571E-02         1.32701E-02        -1.33507E-02         1.01509E+00         1.05311E+00         1.01518E+00         7.82946E+00         1.00000E+00         1.16860E-04         7.82946E+00         1.67926E+00         6.15021E+00
+          1.61571E-02         1.34399E-02        -1.34932E-02         1.01509E+00         1.06378E+00         1.01518E+00         7.35376E+00         1.00000E+00         1.18333E-04         7.35376E+00         1.39989E+00         5.95387E+00
+          1.61571E-02         1.36097E-02        -1.36375E-02         1.01509E+00         1.07445E+00         1.01518E+00         6.92565E+00         1.00000E+00         1.19835E-04         6.92565E+00         1.14948E+00         5.77617E+00
+          1.61571E-02         1.37795E-02        -1.37836E-02         1.01509E+00         1.08512E+00         1.01518E+00         6.54314E+00         1.00000E+00         1.21365E-04         6.54314E+00         9.27093E-01         5.61605E+00
+          1.61571E-02         1.39494E-02        -1.39315E-02         1.01508E+00         1.09579E+00         1.01518E+00         6.20427E+00         1.00000E+00         1.22922E-04         6.20427E+00         7.31786E-01         5.47249E+00
+          1.61571E-02         1.41192E-02        -1.40813E-02         1.01508E+00         1.10646E+00         1.01518E+00         5.90709E+00         1.00000E+00         1.24506E-04         5.90709E+00         5.62574E-01         5.34452E+00
+          1.61571E-02         1.42890E-02        -1.42328E-02         1.01508E+00         1.11713E+00         1.01518E+00         5.64965E+00         1.00000E+00         1.26116E-04         5.64965E+00         4.18444E-01         5.23120E+00
+          1.61571E-02         1.44589E-02        -1.43862E-02         1.01508E+00         1.12780E+00         1.01518E+00         5.43000E+00         1.00000E+00         1.27752E-04         5.43000E+00         2.98360E-01         5.13164E+00
+          1.61571E-02         1.46287E-02        -1.45414E-02         1.01507E+00         1.13847E+00         1.01518E+00         5.24625E+00         1.00000E+00         1.29412E-04         5.24625E+00         2.01264E-01         5.04499E+00
+          1.61571E-02         1.47985E-02        -1.46984E-02         1.01507E+00         1.14914E+00         1.01518E+00         5.09649E+00         1.00000E+00         1.31098E-04         5.09649E+00         1.26079E-01         4.97041E+00
+          1.61571E-02         1.49683E-02        -1.48572E-02         1.01507E+00         1.15981E+00         1.01518E+00         4.97886E+00         1.00000E+00         1.32808E-04         4.97886E+00         7.17142E-02         4.90714E+00
+          1.61571E-02         1.51382E-02        -1.50178E-02         1.01507E+00         1.17048E+00         1.01518E+00         4.89151E+00         1.00000E+00         1.34541E-04         4.89151E+00         3.70663E-02         4.85444E+00
+          1.61571E-02         1.53080E-02        -1.51803E-02         1.01506E+00         1.18115E+00         1.01518E+00         4.83261E+00         1.00000E+00         1.36298E-04         4.83261E+00         2.10236E-02         4.81159E+00
+          1.61571E-02         1.54778E-02        -1.53445E-02         1.01506E+00         1.19182E+00         1.01518E+00         4.80040E+00         1.00000E+00         1.38078E-04         4.80040E+00         2.24689E-02         4.77793E+00
+          1.61571E-02         1.56476E-02        -1.55106E-02         1.01506E+00         1.20249E+00         1.01518E+00         4.79310E+00         1.00000E+00         1.39880E-04         4.79310E+00         4.02829E-02         4.75281E+00
+          1.61571E-02         1.58175E-02        -1.56785E-02         1.01506E+00         1.21317E+00         1.01518E+00         4.80899E+00         1.00000E+00         1.41705E-04         4.80899E+00         7.33475E-02         4.73564E+00
+          1.61571E-02         1.59873E-02        -1.58481E-02         1.01505E+00         1.22384E+00         1.01518E+00         4.84639E+00         1.00000E+00         1.43553E-04         4.84639E+00         1.20548E-01         4.72584E+00
+          1.61571E-02         1.61571E-02        -1.60196E-02         1.01505E+00         1.23451E+00         1.01518E+00         4.90364E+00         1.00000E+00         1.45422E-04         4.90364E+00         1.80777E-01         4.72286E+00
+          1.61571E-02         1.63270E-02        -1.61930E-02         1.01505E+00         1.24518E+00         1.01518E+00         4.97913E+00         1.00000E+00         1.47313E-04         4.97913E+00         2.52938E-01         4.72619E+00
+          1.61571E-02         1.64968E-02        -1.63681E-02         1.01504E+00         1.25585E+00         1.01518E+00         5.07127E+00         1.00000E+00         1.49226E-04         5.07127E+00         3.35945E-01         4.73533E+00
+          1.61571E-02         1.66666E-02        -1.65450E-02         1.01504E+00         1.26652E+00         1.01518E+00         5.17854E+00         1.00000E+00         1.51161E-04         5.17854E+00         4.28729E-01         4.74981E+00
+          1.61571E-02         1.68364E-02        -1.67238E-02         1.01504E+00         1.27719E+00         1.01518E+00         5.29943E+00         1.00000E+00         1.53117E-04         5.29943E+00         5.30238E-01         4.76919E+00
+          1.61571E-02         1.70063E-02        -1.69043E-02         1.01504E+00         1.28786E+00         1.01518E+00         5.43248E+00         1.00000E+00         1.55095E-04         5.43248E+00         6.39441E-01         4.79304E+00
+          1.61571E-02         1.71761E-02        -1.70867E-02         1.01503E+00         1.29853E+00         1.01518E+00         5.57629E+00         1.00000E+00         1.57093E-04         5.57629E+00         7.55330E-01         4.82096E+00
+          1.61571E-02         1.73459E-02        -1.72709E-02         1.01503E+00         1.30920E+00         1.01518E+00         5.72949E+00         1.00000E+00         1.59113E-04         5.72949E+00         8.76922E-01         4.85257E+00
+          1.61571E-02         1.75158E-02        -1.74569E-02         1.01503E+00         1.31987E+00         1.01518E+00         5.89074E+00         1.00000E+00         1.61155E-04         5.89074E+00         1.00326E+00         4.88748E+00
+          1.61571E-02         1.76856E-02        -1.76447E-02         1.01502E+00         1.33054E+00         1.01518E+00         6.05876E+00         1.00000E+00         1.63217E-04         6.05876E+00         1.13342E+00         4.92534E+00
+          1.61571E-02         1.78554E-02        -1.78343E-02         1.01502E+00         1.34121E+00         1.01518E+00         6.23231E+00         1.00000E+00         1.65300E-04         6.23231E+00         1.26650E+00         4.96581E+00
+          1.61571E-02         1.80252E-02        -1.80258E-02         1.01502E+00         1.35188E+00         1.01518E+00         6.41020E+00         1.00000E+00         1.67404E-04         6.41020E+00         1.40164E+00         5.00856E+00
+          1.61571E-02         1.81951E-02        -1.82190E-02         1.01501E+00         1.36255E+00         1.01518E+00         6.59128E+00         1.00000E+00         1.69529E-04         6.59128E+00         1.53801E+00         5.05326E+00
+          1.61571E-02         1.83649E-02        -1.84141E-02         1.01501E+00         1.37322E+00         1.01518E+00         6.77443E+00         1.00000E+00         1.71674E-04         6.77443E+00         1.67482E+00         5.09961E+00
+          1.61571E-02         1.85347E-02        -1.86110E-02         1.01501E+00         1.38389E+00         1.01518E+00         6.95862E+00         1.00000E+00         1.73840E-04         6.95862E+00         1.81131E+00         5.14730E+00
+          1.61571E-02         1.87045E-02        -1.88097E-02         1.01500E+00         1.39457E+00         1.01518E+00         7.14280E+00         1.00000E+00         1.76025E-04         7.14280E+00         1.94676E+00         5.19604E+00
+          1.61571E-02         1.88744E-02        -1.90102E-02         1.01500E+00         1.40524E+00         1.01518E+00         7.32603E+00         1.00000E+00         1.78231E-04         7.32603E+00         2.08049E+00         5.24554E+00
+          1.61571E-02         1.90442E-02        -1.92125E-02         1.01500E+00         1.41591E+00         1.01518E+00         7.50738E+00         1.00000E+00         1.80455E-04         7.50738E+00         2.21186E+00         5.29552E+00
+          1.61571E-02         1.92140E-02        -1.94166E-02         1.01500E+00         1.42658E+00         1.01518E+00         7.68597E+00         1.00000E+00         1.82698E-04         7.68597E+00         2.34027E+00         5.34571E+00
+          1.61571E-02         1.93839E-02        -1.96226E-02         1.01499E+00         1.43725E+00         1.01518E+00         7.86098E+00         1.00000E+00         1.84959E-04         7.86098E+00         2.46515E+00         5.39582E+00
+          1.61571E-02         1.95537E-02        -1.98303E-02         1.01499E+00         1.44792E+00         1.01518E+00         8.03160E+00         1.00000E+00         1.87238E-04         8.03160E+00         2.58600E+00         5.44561E+00
+          1.61571E-02         1.97235E-02        -2.00399E-02         1.01499E+00         1.45859E+00         1.01518E+00         8.19712E+00         1.00000E+00         1.89534E-04         8.19712E+00         2.70232E+00         5.49480E+00
+          1.61571E-02         1.98933E-02        -2.02513E-02         1.01498E+00         1.46926E+00         1.01518E+00         8.35682E+00         1.00000E+00         1.91846E-04         8.35682E+00         2.81369E+00         5.54314E+00
+          1.61571E-02         2.00632E-02        -2.04644E-02         1.01498E+00         1.47993E+00         1.01518E+00         8.51007E+00         1.00000E+00         1.94174E-04         8.51007E+00         2.91970E+00         5.59037E+00
+          1.61571E-02         2.02330E-02        -2.06795E-02         1.01497E+00         1.49060E+00         1.01519E+00         8.65626E+00         1.00000E+00         1.96517E-04         8.65626E+00         3.02000E+00         5.63626E+00
+          1.61571E-02         2.04028E-02        -2.08963E-02         1.01497E+00         1.50127E+00         1.01519E+00         8.79483E+00         1.00000E+00         1.98873E-04         8.79483E+00         3.11428E+00         5.68055E+00
+          1.61571E-02         2.05726E-02        -2.11149E-02         1.01497E+00         1.51194E+00         1.01519E+00         8.92527E+00         1.00000E+00         2.01242E-04         8.92527E+00         3.20226E+00         5.72301E+00
+          1.61571E-02         2.07425E-02        -2.13354E-02         1.01496E+00         1.52261E+00         1.01519E+00         9.04710E+00         1.00000E+00         2.03623E-04         9.04710E+00         3.28370E+00         5.76340E+00
+          1.61571E-02         2.09123E-02        -2.15576E-02         1.01496E+00         1.53328E+00         1.01519E+00         9.15990E+00         1.00000E+00         2.06014E-04         9.15990E+00         3.35840E+00         5.80150E+00
+          1.61571E-02         2.10821E-02        -2.17817E-02         1.01496E+00         1.54395E+00         1.01519E+00         9.26329E+00         1.00000E+00         2.08416E-04         9.26329E+00         3.42621E+00         5.83708E+00
+          1.61571E-02         2.12520E-02        -2.20076E-02         1.01495E+00         1.55462E+00         1.01519E+00         9.35693E+00         1.00000E+00         2.10825E-04         9.35693E+00         3.48700E+00         5.86993E+00
+          1.61571E-02         2.14218E-02        -2.22353E-02         1.01495E+00         1.56529E+00         1.01519E+00         9.44051E+00         1.00000E+00         2.13242E-04         9.44051E+00         3.54067E+00         5.89984E+00
+          1.61571E-02         2.15916E-02        -2.24648E-02         1.01495E+00         1.57596E+00         1.01519E+00         9.51379E+00         1.00000E+00         2.15665E-04         9.51379E+00         3.58718E+00         5.92661E+00
+          1.61571E-02         2.17614E-02        -2.26961E-02         1.01494E+00         1.58664E+00         1.01520E+00         9.57655E+00         1.00000E+00         2.18093E-04         9.57655E+00         3.62650E+00         5.95005E+00
+          1.61571E-02         2.19313E-02        -2.29292E-02         1.01494E+00         1.59731E+00         1.01520E+00         9.62861E+00         1.00000E+00         2.20525E-04         9.62861E+00         3.65865E+00         5.96997E+00
+          1.61571E-02         2.21011E-02        -2.31642E-02         1.01493E+00         1.60798E+00         1.01520E+00         9.66985E+00         1.00000E+00         2.22959E-04         9.66985E+00         3.68365E+00         5.98620E+00
+          1.61571E-02         2.22709E-02        -2.34010E-02         1.01493E+00         1.61865E+00         1.01520E+00         9.70017E+00         1.00000E+00         2.25394E-04         9.70017E+00         3.70159E+00         5.99858E+00
+          1.61571E-02         2.24407E-02        -2.36395E-02         1.01493E+00         1.62932E+00         1.01520E+00         9.71951E+00         1.00000E+00         2.27830E-04         9.71951E+00         3.71255E+00         6.00695E+00
+          1.61571E-02         2.26106E-02        -2.38799E-02         1.01492E+00         1.63999E+00         1.01520E+00         9.72785E+00         1.00000E+00         2.30264E-04         9.72785E+00         3.71666E+00         6.01118E+00
+          1.61571E-02         2.27804E-02        -2.41221E-02         1.01492E+00         1.65066E+00         1.01521E+00         9.72522E+00         1.00000E+00         2.32697E-04         9.72522E+00         3.71407E+00         6.01114E+00
+          1.61571E-02         2.29502E-02        -2.43662E-02         1.01492E+00         1.66133E+00         1.01521E+00         9.71166E+00         1.00000E+00         2.35126E-04         9.71166E+00         3.70494E+00         6.00672E+00
+          1.61571E-02         2.31201E-02        -2.46120E-02         1.01491E+00         1.67200E+00         1.01521E+00         9.68727E+00         1.00000E+00         2.37551E-04         9.68727E+00         3.68946E+00         5.99781E+00
+          1.61571E-02         2.32899E-02        -2.48596E-02         1.01491E+00         1.68267E+00         1.01521E+00         9.65218E+00         1.00000E+00         2.39971E-04         9.65218E+00         3.66784E+00         5.98433E+00
+          1.61571E-02         2.34597E-02        -2.51091E-02         1.01490E+00         1.69334E+00         1.01521E+00         9.60653E+00         1.00000E+00         2.42385E-04         9.60653E+00         3.64031E+00         5.96621E+00
+          1.61571E-02         2.36295E-02        -2.53604E-02         1.01490E+00         1.70401E+00         1.01522E+00         9.55051E+00         1.00000E+00         2.44792E-04         9.55051E+00         3.60711E+00         5.94340E+00
+          1.61571E-02         2.37994E-02        -2.56134E-02         1.01489E+00         1.71468E+00         1.01522E+00         9.48435E+00         1.00000E+00         2.47191E-04         9.48435E+00         3.56850E+00         5.91585E+00
+          1.61571E-02         2.39692E-02        -2.58683E-02         1.01489E+00         1.72535E+00         1.01522E+00         9.40828E+00         1.00000E+00         2.49583E-04         9.40828E+00         3.52473E+00         5.88355E+00
+          1.61571E-02         2.41390E-02        -2.61251E-02         1.01489E+00         1.73602E+00         1.01522E+00         9.32259E+00         1.00000E+00         2.51965E-04         9.32259E+00         3.47610E+00         5.84649E+00
+          1.61571E-02         2.43088E-02        -2.63836E-02         1.01488E+00         1.74669E+00         1.01523E+00         9.22757E+00         1.00000E+00         2.54339E-04         9.22757E+00         3.42289E+00         5.80468E+00
+          1.61571E-02         2.44787E-02        -2.66439E-02         1.01488E+00         1.75736E+00         1.01523E+00         9.12355E+00         1.00000E+00         2.56703E-04         9.12355E+00         3.36540E+00         5.75815E+00
+          1.61571E-02         2.46485E-02        -2.69061E-02         1.01487E+00         1.76804E+00         1.01523E+00         9.01088E+00         1.00000E+00         2.59056E-04         9.01088E+00         3.30393E+00         5.70695E+00
+          1.61571E-02         2.48183E-02        -2.71700E-02         1.01487E+00         1.77871E+00         1.01523E+00         8.88993E+00         1.00000E+00         2.61400E-04         8.88993E+00         3.23879E+00         5.65114E+00
+          1.61571E-02         2.49882E-02        -2.74358E-02         1.01487E+00         1.78938E+00         1.01524E+00         8.76109E+00         1.00000E+00         2.63733E-04         8.76109E+00         3.17029E+00         5.59080E+00
+          1.61571E-02         2.51580E-02        -2.77034E-02         1.01486E+00         1.80005E+00         1.01524E+00         8.62477E+00         1.00000E+00         2.66055E-04         8.62477E+00         3.09874E+00         5.52603E+00
+          1.61571E-02         2.53278E-02        -2.79728E-02         1.01486E+00         1.81072E+00         1.01524E+00         8.48140E+00         1.00000E+00         2.68366E-04         8.48140E+00         3.02445E+00         5.45695E+00
+          1.61571E-02         2.54976E-02        -2.82440E-02         1.01485E+00         1.82139E+00         1.01525E+00         8.33142E+00         1.00000E+00         2.70667E-04         8.33142E+00         2.94773E+00         5.38369E+00
+          1.61571E-02         2.56675E-02        -2.85171E-02         1.01485E+00         1.83206E+00         1.01525E+00         8.17529E+00         1.00000E+00         2.72957E-04         8.17529E+00         2.86890E+00         5.30639E+00
+          1.61571E-02         2.58373E-02        -2.87919E-02         1.01484E+00         1.84273E+00         1.01525E+00         8.01348E+00         1.00000E+00         2.75235E-04         8.01348E+00         2.78826E+00         5.22522E+00
+          1.61571E-02         2.60071E-02        -2.90686E-02         1.01484E+00         1.85340E+00         1.01526E+00         7.84646E+00         1.00000E+00         2.77503E-04         7.84646E+00         2.70610E+00         5.14036E+00
+          1.61571E-02         2.61769E-02        -2.93471E-02         1.01483E+00         1.86407E+00         1.01526E+00         7.67473E+00         1.00000E+00         2.79760E-04         7.67473E+00         2.62273E+00         5.05200E+00
+          1.63270E-02         8.72665E-04        -8.01622E-03         1.02585E+00         2.74155E-01         1.02588E+00         2.07585E+02         1.00000E+00         6.93014E-05         2.07585E+02         8.41089E+01         1.23476E+02
+          1.63270E-02         1.04249E-03        -8.02643E-03         1.02585E+00         2.84826E-01         1.02588E+00         2.04092E+02         1.00000E+00         6.89951E-05         2.04092E+02         8.30429E+01         1.21050E+02
+          1.63270E-02         1.21232E-03        -8.03846E-03         1.02585E+00         2.95496E-01         1.02588E+00         2.00524E+02         1.00000E+00         6.86876E-05         2.00524E+02         8.19449E+01         1.18579E+02
+          1.63270E-02         1.38215E-03        -8.05230E-03         1.02585E+00         3.06167E-01         1.02588E+00         1.96885E+02         1.00000E+00         6.83797E-05         1.96885E+02         8.08160E+01         1.16069E+02
+          1.63270E-02         1.55197E-03        -8.06795E-03         1.02585E+00         3.16838E-01         1.02588E+00         1.93181E+02         1.00000E+00         6.80723E-05         1.93181E+02         7.96572E+01         1.13523E+02
+          1.63270E-02         1.72180E-03        -8.08542E-03         1.02585E+00         3.27508E-01         1.02588E+00         1.89417E+02         1.00000E+00         6.77664E-05         1.89417E+02         7.84697E+01         1.10947E+02
+          1.63270E-02         1.89163E-03        -8.10469E-03         1.02585E+00         3.38179E-01         1.02588E+00         1.85600E+02         1.00000E+00         6.74629E-05         1.85600E+02         7.72546E+01         1.08345E+02
+          1.63270E-02         2.06146E-03        -8.12578E-03         1.02585E+00         3.48849E-01         1.02588E+00         1.81734E+02         1.00000E+00         6.71628E-05         1.81734E+02         7.60129E+01         1.05721E+02
+          1.63270E-02         2.23128E-03        -8.14868E-03         1.02585E+00         3.59520E-01         1.02588E+00         1.77826E+02         1.00000E+00         6.68670E-05         1.77826E+02         7.47459E+01         1.03080E+02
+          1.63270E-02         2.40111E-03        -8.17339E-03         1.02585E+00         3.70190E-01         1.02588E+00         1.73881E+02         1.00000E+00         6.65763E-05         1.73881E+02         7.34548E+01         1.00426E+02
+          1.63270E-02         2.57094E-03        -8.19992E-03         1.02585E+00         3.80861E-01         1.02588E+00         1.69905E+02         1.00000E+00         6.62917E-05         1.69905E+02         7.21408E+01         9.77640E+01
+          1.63270E-02         2.74077E-03        -8.22825E-03         1.02585E+00         3.91532E-01         1.02588E+00         1.65903E+02         1.00000E+00         6.60141E-05         1.65903E+02         7.08053E+01         9.50973E+01
+          1.63270E-02         2.91059E-03        -8.25840E-03         1.02585E+00         4.02202E-01         1.02588E+00         1.61880E+02         1.00000E+00         6.57443E-05         1.61880E+02         6.94496E+01         9.24305E+01
+          1.63270E-02         3.08042E-03        -8.29036E-03         1.02585E+00         4.12873E-01         1.02588E+00         1.57843E+02         1.00000E+00         6.54832E-05         1.57843E+02         6.80750E+01         8.97676E+01
+          1.63270E-02         3.25025E-03        -8.32413E-03         1.02585E+00         4.23543E-01         1.02588E+00         1.53795E+02         1.00000E+00         6.52317E-05         1.53795E+02         6.66828E+01         8.71125E+01
+          1.63270E-02         3.42008E-03        -8.35972E-03         1.02585E+00         4.34214E-01         1.02588E+00         1.49744E+02         1.00000E+00         6.49905E-05         1.49744E+02         6.52745E+01         8.44692E+01
+          1.63270E-02         3.58990E-03        -8.39711E-03         1.02585E+00         4.44884E-01         1.02588E+00         1.45693E+02         1.00000E+00         6.47605E-05         1.45693E+02         6.38515E+01         8.18414E+01
+          1.63270E-02         3.75973E-03        -8.43632E-03         1.02585E+00         4.55555E-01         1.02588E+00         1.41648E+02         1.00000E+00         6.45425E-05         1.41648E+02         6.24152E+01         7.92326E+01
+          1.63270E-02         3.92956E-03        -8.47734E-03         1.02585E+00         4.66225E-01         1.02588E+00         1.37613E+02         1.00000E+00         6.43372E-05         1.37613E+02         6.09672E+01         7.66463E+01
+          1.63270E-02         4.09939E-03        -8.52017E-03         1.02584E+00         4.76896E-01         1.02588E+00         1.33595E+02         1.00000E+00         6.41454E-05         1.33595E+02         5.95088E+01         7.40858E+01
+          1.63270E-02         4.26921E-03        -8.56481E-03         1.02584E+00         4.87567E-01         1.02588E+00         1.29596E+02         1.00000E+00         6.39679E-05         1.29596E+02         5.80416E+01         7.15543E+01
+          1.63270E-02         4.43904E-03        -8.61127E-03         1.02584E+00         4.98237E-01         1.02588E+00         1.25622E+02         1.00000E+00         6.38054E-05         1.25622E+02         5.65671E+01         6.90549E+01
+          1.63270E-02         4.60887E-03        -8.65954E-03         1.02584E+00         5.08908E-01         1.02588E+00         1.21677E+02         1.00000E+00         6.36587E-05         1.21677E+02         5.50868E+01         6.65903E+01
+          1.63270E-02         4.77869E-03        -8.70962E-03         1.02584E+00         5.19578E-01         1.02588E+00         1.17766E+02         1.00000E+00         6.35283E-05         1.17766E+02         5.36023E+01         6.41632E+01
+          1.63270E-02         4.94852E-03        -8.76151E-03         1.02584E+00         5.30249E-01         1.02588E+00         1.13891E+02         1.00000E+00         6.34150E-05         1.13891E+02         5.21151E+01         6.17762E+01
+          1.63270E-02         5.11835E-03        -8.81521E-03         1.02584E+00         5.40919E-01         1.02588E+00         1.10058E+02         1.00000E+00         6.33196E-05         1.10058E+02         5.06267E+01         5.94317E+01
+          1.63270E-02         5.28818E-03        -8.87073E-03         1.02584E+00         5.51590E-01         1.02588E+00         1.06270E+02         1.00000E+00         6.32425E-05         1.06270E+02         4.91387E+01         5.71318E+01
+          1.63270E-02         5.45800E-03        -8.92805E-03         1.02584E+00         5.62261E-01         1.02588E+00         1.02531E+02         1.00000E+00         6.31845E-05         1.02531E+02         4.76526E+01         5.48785E+01
+          1.63270E-02         5.62783E-03        -8.98719E-03         1.02584E+00         5.72931E-01         1.02588E+00         9.88436E+01         1.00000E+00         6.31462E-05         9.88436E+01         4.61699E+01         5.26737E+01
+          1.63270E-02         5.79766E-03        -9.04814E-03         1.02584E+00         5.83602E-01         1.02588E+00         9.52113E+01         1.00000E+00         6.31283E-05         9.52113E+01         4.46923E+01         5.05190E+01
+          1.63270E-02         5.96749E-03        -9.11091E-03         1.02583E+00         5.94272E-01         1.02588E+00         9.16371E+01         1.00000E+00         6.31312E-05         9.16371E+01         4.32211E+01         4.84160E+01
+          1.63270E-02         6.13731E-03        -9.17548E-03         1.02583E+00         6.04943E-01         1.02587E+00         8.81239E+01         1.00000E+00         6.31557E-05         8.81239E+01         4.17580E+01         4.63659E+01
+          1.63270E-02         6.30714E-03        -9.24187E-03         1.02583E+00         6.15613E-01         1.02587E+00         8.46743E+01         1.00000E+00         6.32022E-05         8.46743E+01         4.03043E+01         4.43700E+01
+          1.63270E-02         6.47697E-03        -9.31007E-03         1.02583E+00         6.26284E-01         1.02587E+00         8.12907E+01         1.00000E+00         6.32714E-05         8.12907E+01         3.88616E+01         4.24291E+01
+          1.63270E-02         6.64680E-03        -9.38008E-03         1.02583E+00         6.36955E-01         1.02587E+00         7.79755E+01         1.00000E+00         6.33637E-05         7.79755E+01         3.74313E+01         4.05442E+01
+          1.63270E-02         6.81662E-03        -9.45190E-03         1.02583E+00         6.47625E-01         1.02587E+00         7.47307E+01         1.00000E+00         6.34797E-05         7.47307E+01         3.60148E+01         3.87158E+01
+          1.63270E-02         6.98645E-03        -9.52554E-03         1.02583E+00         6.58296E-01         1.02587E+00         7.15581E+01         1.00000E+00         6.36199E-05         7.15581E+01         3.46136E+01         3.69446E+01
+          1.63270E-02         7.15628E-03        -9.60098E-03         1.02583E+00         6.68966E-01         1.02587E+00         6.84596E+01         1.00000E+00         6.37849E-05         6.84596E+01         3.32289E+01         3.52307E+01
+          1.63270E-02         7.32611E-03        -9.67824E-03         1.02583E+00         6.79637E-01         1.02587E+00         6.54366E+01         1.00000E+00         6.39750E-05         6.54366E+01         3.18621E+01         3.35745E+01
+          1.63270E-02         7.49593E-03        -9.75731E-03         1.02582E+00         6.90307E-01         1.02587E+00         6.24905E+01         1.00000E+00         6.41907E-05         6.24905E+01         3.05145E+01         3.19760E+01
+          1.63270E-02         7.66576E-03        -9.83820E-03         1.02582E+00         7.00978E-01         1.02587E+00         5.96225E+01         1.00000E+00         6.44325E-05         5.96225E+01         2.91874E+01         3.04351E+01
+          1.63270E-02         7.83559E-03        -9.92089E-03         1.02582E+00         7.11649E-01         1.02587E+00         5.68335E+01         1.00000E+00         6.47007E-05         5.68335E+01         2.78819E+01         2.89516E+01
+          1.63270E-02         8.00542E-03        -1.00054E-02         1.02582E+00         7.22319E-01         1.02587E+00         5.41243E+01         1.00000E+00         6.49957E-05         5.41243E+01         2.65993E+01         2.75251E+01
+          1.63270E-02         8.17524E-03        -1.00917E-02         1.02582E+00         7.32990E-01         1.02587E+00         5.14957E+01         1.00000E+00         6.53180E-05         5.14957E+01         2.53405E+01         2.61552E+01
+          1.63270E-02         8.34507E-03        -1.01799E-02         1.02582E+00         7.43660E-01         1.02587E+00         4.89481E+01         1.00000E+00         6.56677E-05         4.89481E+01         2.41068E+01         2.48413E+01
+          1.63270E-02         8.51490E-03        -1.02698E-02         1.02582E+00         7.54331E-01         1.02587E+00         4.64818E+01         1.00000E+00         6.60452E-05         4.64818E+01         2.28991E+01         2.35828E+01
+          1.63270E-02         8.68473E-03        -1.03616E-02         1.02581E+00         7.65001E-01         1.02587E+00         4.40971E+01         1.00000E+00         6.64509E-05         4.40971E+01         2.17183E+01         2.23787E+01
+          1.63270E-02         8.85455E-03        -1.04551E-02         1.02581E+00         7.75672E-01         1.02587E+00         4.17938E+01         1.00000E+00         6.68848E-05         4.17938E+01         2.05654E+01         2.12284E+01
+          1.63270E-02         9.02438E-03        -1.05505E-02         1.02581E+00         7.86343E-01         1.02587E+00         3.95721E+01         1.00000E+00         6.73472E-05         3.95721E+01         1.94413E+01         2.01308E+01
+          1.63270E-02         9.19421E-03        -1.06477E-02         1.02581E+00         7.97013E-01         1.02586E+00         3.74315E+01         1.00000E+00         6.78383E-05         3.74315E+01         1.83466E+01         1.90848E+01
+          1.63270E-02         9.36403E-03        -1.07467E-02         1.02581E+00         8.07684E-01         1.02586E+00         3.53716E+01         1.00000E+00         6.83581E-05         3.53716E+01         1.72822E+01         1.80894E+01
+          1.63270E-02         9.53386E-03        -1.08475E-02         1.02581E+00         8.18354E-01         1.02586E+00         3.33921E+01         1.00000E+00         6.89068E-05         3.33921E+01         1.62488E+01         1.71433E+01
+          1.63270E-02         9.70369E-03        -1.09501E-02         1.02580E+00         8.29025E-01         1.02586E+00         3.14922E+01         1.00000E+00         6.94845E-05         3.14922E+01         1.52468E+01         1.62454E+01
+          1.63270E-02         9.87352E-03        -1.10546E-02         1.02580E+00         8.39695E-01         1.02586E+00         2.96712E+01         1.00000E+00         7.00910E-05         2.96712E+01         1.42768E+01         1.53944E+01
+          1.63270E-02         1.00433E-02        -1.11608E-02         1.02580E+00         8.50366E-01         1.02586E+00         2.79282E+01         1.00000E+00         7.07265E-05         2.79282E+01         1.33394E+01         1.45889E+01
+          1.63270E-02         1.02132E-02        -1.12689E-02         1.02580E+00         8.61037E-01         1.02586E+00         2.62623E+01         1.00000E+00         7.13907E-05         2.62623E+01         1.24348E+01         1.38275E+01
+          1.63270E-02         1.03830E-02        -1.13788E-02         1.02580E+00         8.71707E-01         1.02586E+00         2.46724E+01         1.00000E+00         7.20837E-05         2.46724E+01         1.15636E+01         1.31088E+01
+          1.63270E-02         1.05528E-02        -1.14905E-02         1.02580E+00         8.82378E-01         1.02586E+00         2.31574E+01         1.00000E+00         7.28052E-05         2.31574E+01         1.07258E+01         1.24315E+01
+          1.63270E-02         1.07227E-02        -1.16040E-02         1.02579E+00         8.93048E-01         1.02586E+00         2.17159E+01         1.00000E+00         7.35551E-05         2.17159E+01         9.92183E+00         1.17941E+01
+          1.63270E-02         1.08925E-02        -1.17193E-02         1.02579E+00         9.03719E-01         1.02586E+00         2.03468E+01         1.00000E+00         7.43332E-05         2.03468E+01         9.15170E+00         1.11951E+01
+          1.63270E-02         1.10623E-02        -1.18364E-02         1.02579E+00         9.14389E-01         1.02586E+00         1.90487E+01         1.00000E+00         7.51391E-05         1.90487E+01         8.41551E+00         1.06331E+01
+          1.63270E-02         1.12321E-02        -1.19554E-02         1.02579E+00         9.25060E-01         1.02586E+00         1.78199E+01         1.00000E+00         7.59727E-05         1.78199E+01         7.71328E+00         1.01067E+01
+          1.63270E-02         1.14020E-02        -1.20761E-02         1.02579E+00         9.35731E-01         1.02586E+00         1.66592E+01         1.00000E+00         7.68335E-05         1.66592E+01         7.04494E+00         9.61423E+00
+          1.63270E-02         1.15718E-02        -1.21987E-02         1.02578E+00         9.46401E-01         1.02586E+00         1.55648E+01         1.00000E+00         7.77212E-05         1.55648E+01         6.41038E+00         9.15442E+00
+          1.63270E-02         1.17416E-02        -1.23230E-02         1.02578E+00         9.57072E-01         1.02586E+00         1.45352E+01         1.00000E+00         7.86355E-05         1.45352E+01         5.80940E+00         8.72578E+00
+          1.63270E-02         1.19114E-02        -1.24492E-02         1.02578E+00         9.67742E-01         1.02586E+00         1.35687E+01         1.00000E+00         7.95759E-05         1.35687E+01         5.24176E+00         8.32691E+00
+          1.63270E-02         1.20813E-02        -1.25772E-02         1.02578E+00         9.78413E-01         1.02586E+00         1.26636E+01         1.00000E+00         8.05420E-05         1.26636E+01         4.70715E+00         7.95641E+00
+          1.63270E-02         1.22511E-02        -1.27070E-02         1.02578E+00         9.89083E-01         1.02585E+00         1.18181E+01         1.00000E+00         8.15335E-05         1.18181E+01         4.20520E+00         7.61291E+00
+          1.63270E-02         1.24209E-02        -1.28387E-02         1.02577E+00         9.99754E-01         1.02585E+00         1.10306E+01         1.00000E+00         8.25497E-05         1.10306E+01         3.73549E+00         7.29507E+00
+          1.63270E-02         1.25908E-02        -1.29721E-02         1.02577E+00         1.01042E+00         1.02585E+00         1.02991E+01         1.00000E+00         8.35904E-05         1.02991E+01         3.29754E+00         7.00159E+00
+          1.63270E-02         1.27606E-02        -1.31074E-02         1.02577E+00         1.02110E+00         1.02585E+00         9.62200E+00         1.00000E+00         8.46550E-05         9.62200E+00         2.89080E+00         6.73120E+00
+          1.63270E-02         1.29304E-02        -1.32444E-02         1.02577E+00         1.03177E+00         1.02585E+00         8.99735E+00         1.00000E+00         8.57430E-05         8.99735E+00         2.51470E+00         6.48264E+00
+          1.63270E-02         1.31002E-02        -1.33833E-02         1.02577E+00         1.04244E+00         1.02585E+00         8.42334E+00         1.00000E+00         8.68541E-05         8.42334E+00         2.16860E+00         6.25474E+00
+          1.63270E-02         1.32701E-02        -1.35240E-02         1.02576E+00         1.05311E+00         1.02585E+00         7.89814E+00         1.00000E+00         8.79877E-05         7.89814E+00         1.85182E+00         6.04633E+00
+          1.63270E-02         1.34399E-02        -1.36665E-02         1.02576E+00         1.06378E+00         1.02585E+00         7.41991E+00         1.00000E+00         8.91434E-05         7.41991E+00         1.56362E+00         5.85629E+00
+          1.63270E-02         1.36097E-02        -1.38108E-02         1.02576E+00         1.07445E+00         1.02585E+00         6.98681E+00         1.00000E+00         9.03208E-05         6.98681E+00         1.30325E+00         5.68355E+00
+          1.63270E-02         1.37795E-02        -1.39569E-02         1.02576E+00         1.08512E+00         1.02585E+00         6.59699E+00         1.00000E+00         9.15194E-05         6.59699E+00         1.06990E+00         5.52709E+00
+          1.63270E-02         1.39494E-02        -1.41048E-02         1.02575E+00         1.09579E+00         1.02585E+00         6.24863E+00         1.00000E+00         9.27390E-05         6.24863E+00         8.62714E-01         5.38591E+00
+          1.63270E-02         1.41192E-02        -1.42546E-02         1.02575E+00         1.10646E+00         1.02585E+00         5.93990E+00         1.00000E+00         9.39790E-05         5.93990E+00         6.80827E-01         5.25908E+00
+          1.63270E-02         1.42890E-02        -1.44062E-02         1.02575E+00         1.11713E+00         1.02585E+00         5.66902E+00         1.00000E+00         9.52393E-05         5.66902E+00         5.23328E-01         5.14569E+00
+          1.63270E-02         1.44589E-02        -1.45595E-02         1.02575E+00         1.12780E+00         1.02585E+00         5.43418E+00         1.00000E+00         9.65194E-05         5.43418E+00         3.89284E-01         5.04489E+00
+          1.63270E-02         1.46287E-02        -1.47147E-02         1.02574E+00         1.13847E+00         1.02585E+00         5.23361E+00         1.00000E+00         9.78191E-05         5.23361E+00         2.77735E-01         4.95588E+00
+          1.63270E-02         1.47985E-02        -1.48717E-02         1.02574E+00         1.14914E+00         1.02585E+00         5.06557E+00         1.00000E+00         9.91382E-05         5.06557E+00         1.87703E-01         4.87787E+00
+          1.63270E-02         1.49683E-02        -1.50305E-02         1.02574E+00         1.15981E+00         1.02585E+00         4.92834E+00         1.00000E+00         1.00476E-04         4.92834E+00         1.18188E-01         4.81015E+00
+          1.63270E-02         1.51382E-02        -1.51912E-02         1.02574E+00         1.17048E+00         1.02585E+00         4.82020E+00         1.00000E+00         1.01834E-04         4.82020E+00         6.81762E-02         4.75202E+00
+          1.63270E-02         1.53080E-02        -1.53536E-02         1.02573E+00         1.18115E+00         1.02585E+00         4.73949E+00         1.00000E+00         1.03209E-04         4.73949E+00         3.66431E-02         4.70285E+00
+          1.63270E-02         1.54778E-02        -1.55178E-02         1.02573E+00         1.19182E+00         1.02585E+00         4.68456E+00         1.00000E+00         1.04604E-04         4.68456E+00         2.25537E-02         4.66201E+00
+          1.63270E-02         1.56476E-02        -1.56839E-02         1.02573E+00         1.20249E+00         1.02585E+00         4.65379E+00         1.00000E+00         1.06017E-04         4.65379E+00         2.48672E-02         4.62893E+00
+          1.63270E-02         1.58175E-02        -1.58518E-02         1.02572E+00         1.21317E+00         1.02585E+00         4.64561E+00         1.00000E+00         1.07449E-04         4.64561E+00         4.25398E-02         4.60307E+00
+          1.63270E-02         1.59873E-02        -1.60215E-02         1.02572E+00         1.22384E+00         1.02585E+00         4.65845E+00         1.00000E+00         1.08900E-04         4.65845E+00         7.45278E-02         4.58392E+00
+          1.63270E-02         1.61571E-02        -1.61930E-02         1.02572E+00         1.23451E+00         1.02585E+00         4.69080E+00         1.00000E+00         1.10368E-04         4.69080E+00         1.19790E-01         4.57101E+00
+          1.63270E-02         1.63270E-02        -1.63663E-02         1.02572E+00         1.24518E+00         1.02585E+00         4.74118E+00         1.00000E+00         1.11856E-04         4.74118E+00         1.77291E-01         4.56389E+00
+          1.63270E-02         1.64968E-02        -1.65414E-02         1.02571E+00         1.25585E+00         1.02585E+00         4.80814E+00         1.00000E+00         1.13362E-04         4.80814E+00         2.46004E-01         4.56213E+00
+          1.63270E-02         1.66666E-02        -1.67183E-02         1.02571E+00         1.26652E+00         1.02585E+00         4.89026E+00         1.00000E+00         1.14886E-04         4.89026E+00         3.24913E-01         4.56535E+00
+          1.63270E-02         1.68364E-02        -1.68971E-02         1.02571E+00         1.27719E+00         1.02585E+00         4.98617E+00         1.00000E+00         1.16429E-04         4.98617E+00         4.13016E-01         4.57315E+00
+          1.63270E-02         1.70063E-02        -1.70776E-02         1.02570E+00         1.28786E+00         1.02585E+00         5.09453E+00         1.00000E+00         1.17991E-04         5.09453E+00         5.09327E-01         4.58520E+00
+          1.63270E-02         1.71761E-02        -1.72600E-02         1.02570E+00         1.29853E+00         1.02585E+00         5.21404E+00         1.00000E+00         1.19571E-04         5.21404E+00         6.12878E-01         4.60116E+00
+          1.63270E-02         1.73459E-02        -1.74442E-02         1.02570E+00         1.30920E+00         1.02585E+00         5.34343E+00         1.00000E+00         1.21170E-04         5.34343E+00         7.22721E-01         4.62071E+00
+          1.63270E-02         1.75158E-02        -1.76302E-02         1.02570E+00         1.31987E+00         1.02585E+00         5.48149E+00         1.00000E+00         1.22788E-04         5.48149E+00         8.37935E-01         4.64355E+00
+          1.63270E-02         1.76856E-02        -1.78180E-02         1.02569E+00         1.33054E+00         1.02585E+00         5.62702E+00         1.00000E+00         1.24425E-04         5.62702E+00         9.57618E-01         4.66941E+00
+          1.63270E-02         1.78554E-02        -1.80076E-02         1.02569E+00         1.34121E+00         1.02585E+00         5.77889E+00         1.00000E+00         1.26080E-04         5.77889E+00         1.08090E+00         4.69799E+00
+          1.63270E-02         1.80252E-02        -1.81991E-02         1.02569E+00         1.35188E+00         1.02585E+00         5.93598E+00         1.00000E+00         1.27754E-04         5.93598E+00         1.20694E+00         4.72904E+00
+          1.63270E-02         1.81951E-02        -1.83923E-02         1.02568E+00         1.36255E+00         1.02585E+00         6.09722E+00         1.00000E+00         1.29446E-04         6.09722E+00         1.33492E+00         4.76230E+00
+          1.63270E-02         1.83649E-02        -1.85874E-02         1.02568E+00         1.37322E+00         1.02585E+00         6.26159E+00         1.00000E+00         1.31156E-04         6.26159E+00         1.46406E+00         4.79753E+00
+          1.63270E-02         1.85347E-02        -1.87843E-02         1.02568E+00         1.38389E+00         1.02585E+00         6.42810E+00         1.00000E+00         1.32885E-04         6.42810E+00         1.59361E+00         4.83449E+00
+          1.63270E-02         1.87045E-02        -1.89830E-02         1.02567E+00         1.39457E+00         1.02585E+00         6.59579E+00         1.00000E+00         1.34631E-04         6.59579E+00         1.72285E+00         4.87294E+00
+          1.63270E-02         1.88744E-02        -1.91835E-02         1.02567E+00         1.40524E+00         1.02585E+00         6.76377E+00         1.00000E+00         1.36395E-04         6.76377E+00         1.85112E+00         4.91264E+00
+          1.63270E-02         1.90442E-02        -1.93858E-02         1.02567E+00         1.41591E+00         1.02585E+00         6.93115E+00         1.00000E+00         1.38176E-04         6.93115E+00         1.97777E+00         4.95338E+00
+          1.63270E-02         1.92140E-02        -1.95899E-02         1.02566E+00         1.42658E+00         1.02585E+00         7.09711E+00         1.00000E+00         1.39974E-04         7.09711E+00         2.10218E+00         4.99493E+00
+          1.63270E-02         1.93839E-02        -1.97959E-02         1.02566E+00         1.43725E+00         1.02585E+00         7.26085E+00         1.00000E+00         1.41788E-04         7.26085E+00         2.22380E+00         5.03705E+00
+          1.63270E-02         1.95537E-02        -2.00036E-02         1.02566E+00         1.44792E+00         1.02585E+00         7.42162E+00         1.00000E+00         1.43618E-04         7.42162E+00         2.34209E+00         5.07954E+00
+          1.63270E-02         1.97235E-02        -2.02132E-02         1.02565E+00         1.45859E+00         1.02585E+00         7.57872E+00         1.00000E+00         1.45462E-04         7.57872E+00         2.45655E+00         5.12216E+00
+          1.63270E-02         1.98933E-02        -2.04246E-02         1.02565E+00         1.46926E+00         1.02585E+00         7.73146E+00         1.00000E+00         1.47321E-04         7.73146E+00         2.56675E+00         5.16471E+00
+          1.63270E-02         2.00632E-02        -2.06377E-02         1.02565E+00         1.47993E+00         1.02585E+00         7.87921E+00         1.00000E+00         1.49194E-04         7.87921E+00         2.67226E+00         5.20695E+00
+          1.63270E-02         2.02330E-02        -2.08528E-02         1.02564E+00         1.49060E+00         1.02586E+00         8.02138E+00         1.00000E+00         1.51079E-04         8.02138E+00         2.77271E+00         5.24867E+00
+          1.63270E-02         2.04028E-02        -2.10696E-02         1.02564E+00         1.50127E+00         1.02586E+00         8.15740E+00         1.00000E+00         1.52977E-04         8.15740E+00         2.86776E+00         5.28964E+00
+          1.63270E-02         2.05726E-02        -2.12882E-02         1.02564E+00         1.51194E+00         1.02586E+00         8.28677E+00         1.00000E+00         1.54885E-04         8.28677E+00         2.95711E+00         5.32966E+00
+          1.63270E-02         2.07425E-02        -2.15087E-02         1.02563E+00         1.52261E+00         1.02586E+00         8.40899E+00         1.00000E+00         1.56804E-04         8.40899E+00         3.04049E+00         5.36850E+00
+          1.63270E-02         2.09123E-02        -2.17309E-02         1.02563E+00         1.53328E+00         1.02586E+00         8.52363E+00         1.00000E+00         1.58732E-04         8.52363E+00         3.11769E+00         5.40594E+00
+          1.63270E-02         2.10821E-02        -2.19550E-02         1.02563E+00         1.54395E+00         1.02586E+00         8.63028E+00         1.00000E+00         1.60669E-04         8.63028E+00         3.18851E+00         5.44176E+00
+          1.63270E-02         2.12520E-02        -2.21809E-02         1.02562E+00         1.55462E+00         1.02586E+00         8.72857E+00         1.00000E+00         1.62612E-04         8.72857E+00         3.25280E+00         5.47577E+00
+          1.63270E-02         2.14218E-02        -2.24086E-02         1.02562E+00         1.56529E+00         1.02586E+00         8.81818E+00         1.00000E+00         1.64563E-04         8.81818E+00         3.31044E+00         5.50774E+00
+          1.63270E-02         2.15916E-02        -2.26381E-02         1.02561E+00         1.57596E+00         1.02586E+00         8.89881E+00         1.00000E+00         1.66518E-04         8.89881E+00         3.36135E+00         5.53747E+00
+          1.63270E-02         2.17614E-02        -2.28694E-02         1.02561E+00         1.58664E+00         1.02587E+00         8.97022E+00         1.00000E+00         1.68478E-04         8.97022E+00         3.40546E+00         5.56475E+00
+          1.63270E-02         2.19313E-02        -2.31025E-02         1.02561E+00         1.59731E+00         1.02587E+00         9.03216E+00         1.00000E+00         1.70442E-04         9.03216E+00         3.44277E+00         5.58939E+00
+          1.63270E-02         2.21011E-02        -2.33375E-02         1.02560E+00         1.60798E+00         1.02587E+00         9.08448E+00         1.00000E+00         1.72408E-04         9.08448E+00         3.47327E+00         5.61121E+00
+          1.63270E-02         2.22709E-02        -2.35743E-02         1.02560E+00         1.61865E+00         1.02587E+00         9.12701E+00         1.00000E+00         1.74375E-04         9.12701E+00         3.49701E+00         5.63000E+00
+          1.63270E-02         2.24407E-02        -2.38128E-02         1.02559E+00         1.62932E+00         1.02587E+00         9.15964E+00         1.00000E+00         1.76344E-04         9.15964E+00         3.51404E+00         5.64560E+00
+          1.63270E-02         2.26106E-02        -2.40532E-02         1.02559E+00         1.63999E+00         1.02587E+00         9.18229E+00         1.00000E+00         1.78312E-04         9.18229E+00         3.52446E+00         5.65783E+00
+          1.63270E-02         2.27804E-02        -2.42954E-02         1.02559E+00         1.65066E+00         1.02587E+00         9.19493E+00         1.00000E+00         1.80279E-04         9.19493E+00         3.52838E+00         5.66654E+00
+          1.63270E-02         2.29502E-02        -2.45394E-02         1.02558E+00         1.66133E+00         1.02588E+00         9.19752E+00         1.00000E+00         1.82245E-04         9.19752E+00         3.52594E+00         5.67158E+00
+          1.63270E-02         2.31201E-02        -2.47853E-02         1.02558E+00         1.67200E+00         1.02588E+00         9.19011E+00         1.00000E+00         1.84208E-04         9.19011E+00         3.51730E+00         5.67281E+00
+          1.63270E-02         2.32899E-02        -2.50329E-02         1.02557E+00         1.68267E+00         1.02588E+00         9.17273E+00         1.00000E+00         1.86169E-04         9.17273E+00         3.50263E+00         5.67010E+00
+          1.63270E-02         2.34597E-02        -2.52824E-02         1.02557E+00         1.69334E+00         1.02588E+00         9.14547E+00         1.00000E+00         1.88126E-04         9.14547E+00         3.48214E+00         5.66333E+00
+          1.63270E-02         2.36295E-02        -2.55336E-02         1.02557E+00         1.70401E+00         1.02588E+00         9.10845E+00         1.00000E+00         1.90079E-04         9.10845E+00         3.45603E+00         5.65242E+00
+          1.63270E-02         2.37994E-02        -2.57867E-02         1.02556E+00         1.71468E+00         1.02589E+00         9.06180E+00         1.00000E+00         1.92028E-04         9.06180E+00         3.42454E+00         5.63726E+00
+          1.63270E-02         2.39692E-02        -2.60416E-02         1.02556E+00         1.72535E+00         1.02589E+00         9.00569E+00         1.00000E+00         1.93972E-04         9.00569E+00         3.38790E+00         5.61779E+00
+          1.63270E-02         2.41390E-02        -2.62983E-02         1.02555E+00         1.73602E+00         1.02589E+00         8.94033E+00         1.00000E+00         1.95912E-04         8.94033E+00         3.34638E+00         5.59395E+00
+          1.63270E-02         2.43088E-02        -2.65569E-02         1.02555E+00         1.74669E+00         1.02589E+00         8.86593E+00         1.00000E+00         1.97846E-04         8.86593E+00         3.30023E+00         5.56571E+00
+          1.63270E-02         2.44787E-02        -2.68172E-02         1.02555E+00         1.75736E+00         1.02590E+00         8.78275E+00         1.00000E+00         1.99775E-04         8.78275E+00         3.24973E+00         5.53303E+00
+          1.63270E-02         2.46485E-02        -2.70794E-02         1.02554E+00         1.76804E+00         1.02590E+00         8.69106E+00         1.00000E+00         2.01699E-04         8.69106E+00         3.19516E+00         5.49590E+00
+          1.63270E-02         2.48183E-02        -2.73433E-02         1.02554E+00         1.77871E+00         1.02590E+00         8.59115E+00         1.00000E+00         2.03618E-04         8.59115E+00         3.13680E+00         5.45434E+00
+          1.63270E-02         2.49882E-02        -2.76091E-02         1.02553E+00         1.78938E+00         1.02590E+00         8.48333E+00         1.00000E+00         2.05531E-04         8.48333E+00         3.07496E+00         5.40838E+00
+          1.63270E-02         2.51580E-02        -2.78767E-02         1.02553E+00         1.80005E+00         1.02591E+00         8.36796E+00         1.00000E+00         2.07439E-04         8.36796E+00         3.00991E+00         5.35805E+00
+          1.63270E-02         2.53278E-02        -2.81461E-02         1.02552E+00         1.81072E+00         1.02591E+00         8.24537E+00         1.00000E+00         2.09342E-04         8.24537E+00         2.94197E+00         5.30341E+00
+          1.63270E-02         2.54976E-02        -2.84173E-02         1.02552E+00         1.82139E+00         1.02591E+00         8.11595E+00         1.00000E+00         2.11240E-04         8.11595E+00         2.87141E+00         5.24454E+00
+          1.63270E-02         2.56675E-02        -2.86903E-02         1.02552E+00         1.83206E+00         1.02592E+00         7.98009E+00         1.00000E+00         2.13133E-04         7.98009E+00         2.79855E+00         5.18154E+00
+          1.63270E-02         2.58373E-02        -2.89652E-02         1.02551E+00         1.84273E+00         1.02592E+00         7.83818E+00         1.00000E+00         2.15020E-04         7.83818E+00         2.72367E+00         5.11451E+00
+          1.63270E-02         2.60071E-02        -2.92419E-02         1.02551E+00         1.85340E+00         1.02592E+00         7.69065E+00         1.00000E+00         2.16903E-04         7.69065E+00         2.64707E+00         5.04358E+00
+          1.63270E-02         2.61769E-02        -2.95203E-02         1.02550E+00         1.86407E+00         1.02593E+00         7.53792E+00         1.00000E+00         2.18782E-04         7.53792E+00         2.56902E+00         4.96890E+00
+          1.64968E-02         8.72665E-04        -8.19136E-03         1.03652E+00         2.74155E-01         1.03656E+00         1.99709E+02         1.00000E+00         4.99361E-05         1.99709E+02         7.80203E+01         1.21689E+02
+          1.64968E-02         1.04249E-03        -8.20158E-03         1.03652E+00         2.84826E-01         1.03656E+00         1.96351E+02         1.00000E+00         4.97336E-05         1.96351E+02         7.70789E+01         1.19272E+02
+          1.64968E-02         1.21232E-03        -8.21361E-03         1.03652E+00         2.95496E-01         1.03656E+00         1.92920E+02         1.00000E+00         4.95304E-05         1.92920E+02         7.61083E+01         1.16812E+02
+          1.64968E-02         1.38215E-03        -8.22745E-03         1.03652E+00         3.06167E-01         1.03656E+00         1.89422E+02         1.00000E+00         4.93272E-05         1.89422E+02         7.51092E+01         1.14313E+02
+          1.64968E-02         1.55197E-03        -8.24310E-03         1.03652E+00         3.16838E-01         1.03656E+00         1.85862E+02         1.00000E+00         4.91247E-05         1.85862E+02         7.40826E+01         1.11780E+02
+          1.64968E-02         1.72180E-03        -8.26057E-03         1.03652E+00         3.27508E-01         1.03656E+00         1.82245E+02         1.00000E+00         4.89235E-05         1.82245E+02         7.30293E+01         1.09216E+02
+          1.64968E-02         1.89163E-03        -8.27984E-03         1.03652E+00         3.38179E-01         1.03655E+00         1.78577E+02         1.00000E+00         4.87243E-05         1.78577E+02         7.19502E+01         1.06627E+02
+          1.64968E-02         2.06146E-03        -8.30093E-03         1.03652E+00         3.48849E-01         1.03655E+00         1.74863E+02         1.00000E+00         4.85277E-05         1.74863E+02         7.08462E+01         1.04017E+02
+          1.64968E-02         2.23128E-03        -8.32383E-03         1.03652E+00         3.59520E-01         1.03655E+00         1.71109E+02         1.00000E+00         4.83343E-05         1.71109E+02         6.97183E+01         1.01390E+02
+          1.64968E-02         2.40111E-03        -8.34854E-03         1.03652E+00         3.70190E-01         1.03655E+00         1.67319E+02         1.00000E+00         4.81448E-05         1.67319E+02         6.85676E+01         9.87517E+01
+          1.64968E-02         2.57094E-03        -8.37507E-03         1.03652E+00         3.80861E-01         1.03655E+00         1.63500E+02         1.00000E+00         4.79597E-05         1.63500E+02         6.73950E+01         9.61051E+01
+          1.64968E-02         2.74077E-03        -8.40340E-03         1.03652E+00         3.91532E-01         1.03655E+00         1.59657E+02         1.00000E+00         4.77798E-05         1.59657E+02         6.62017E+01         9.34549E+01
+          1.64968E-02         2.91059E-03        -8.43355E-03         1.03652E+00         4.02202E-01         1.03655E+00         1.55794E+02         1.00000E+00         4.76057E-05         1.55794E+02         6.49887E+01         9.08053E+01
+          1.64968E-02         3.08042E-03        -8.46551E-03         1.03652E+00         4.12873E-01         1.03655E+00         1.51917E+02         1.00000E+00         4.74378E-05         1.51917E+02         6.37572E+01         8.81603E+01
+          1.64968E-02         3.25025E-03        -8.49928E-03         1.03652E+00         4.23543E-01         1.03655E+00         1.48032E+02         1.00000E+00         4.72770E-05         1.48032E+02         6.25083E+01         8.55239E+01
+          1.64968E-02         3.42008E-03        -8.53486E-03         1.03652E+00         4.34214E-01         1.03655E+00         1.44143E+02         1.00000E+00         4.71236E-05         1.44143E+02         6.12432E+01         8.29000E+01
+          1.64968E-02         3.58990E-03        -8.57226E-03         1.03652E+00         4.44884E-01         1.03655E+00         1.40255E+02         1.00000E+00         4.69784E-05         1.40255E+02         5.99632E+01         8.02922E+01
+          1.64968E-02         3.75973E-03        -8.61147E-03         1.03652E+00         4.55555E-01         1.03655E+00         1.36374E+02         1.00000E+00         4.68420E-05         1.36374E+02         5.86695E+01         7.77042E+01
+          1.64968E-02         3.92956E-03        -8.65249E-03         1.03652E+00         4.66225E-01         1.03655E+00         1.32503E+02         1.00000E+00         4.67148E-05         1.32503E+02         5.73633E+01         7.51394E+01
+          1.64968E-02         4.09939E-03        -8.69532E-03         1.03651E+00         4.76896E-01         1.03655E+00         1.28647E+02         1.00000E+00         4.65975E-05         1.28647E+02         5.60460E+01         7.26012E+01
+          1.64968E-02         4.26921E-03        -8.73996E-03         1.03651E+00         4.87567E-01         1.03655E+00         1.24812E+02         1.00000E+00         4.64906E-05         1.24812E+02         5.47188E+01         7.00927E+01
+          1.64968E-02         4.43904E-03        -8.78642E-03         1.03651E+00         4.98237E-01         1.03655E+00         1.21000E+02         1.00000E+00         4.63946E-05         1.21000E+02         5.33832E+01         6.76168E+01
+          1.64968E-02         4.60887E-03        -8.83468E-03         1.03651E+00         5.08908E-01         1.03655E+00         1.17217E+02         1.00000E+00         4.63103E-05         1.17217E+02         5.20404E+01         6.51766E+01
+          1.64968E-02         4.77869E-03        -8.88476E-03         1.03651E+00         5.19578E-01         1.03655E+00         1.13466E+02         1.00000E+00         4.62379E-05         1.13466E+02         5.06917E+01         6.27745E+01
+          1.64968E-02         4.94852E-03        -8.93665E-03         1.03651E+00         5.30249E-01         1.03655E+00         1.09752E+02         1.00000E+00         4.61782E-05         1.09752E+02         4.93386E+01         6.04132E+01
+          1.64968E-02         5.11835E-03        -8.99036E-03         1.03651E+00         5.40919E-01         1.03655E+00         1.06077E+02         1.00000E+00         4.61316E-05         1.06077E+02         4.79825E+01         5.80949E+01
+          1.64968E-02         5.28818E-03        -9.04587E-03         1.03651E+00         5.51590E-01         1.03655E+00         1.02447E+02         1.00000E+00         4.60987E-05         1.02447E+02         4.66247E+01         5.58219E+01
+          1.64968E-02         5.45800E-03        -9.10320E-03         1.03651E+00         5.62261E-01         1.03655E+00         9.88628E+01         1.00000E+00         4.60799E-05         9.88628E+01         4.52666E+01         5.35962E+01
+          1.64968E-02         5.62783E-03        -9.16234E-03         1.03651E+00         5.72931E-01         1.03655E+00         9.53291E+01         1.00000E+00         4.60758E-05         9.53291E+01         4.39097E+01         5.14195E+01
+          1.64968E-02         5.79766E-03        -9.22329E-03         1.03651E+00         5.83602E-01         1.03655E+00         9.18487E+01         1.00000E+00         4.60869E-05         9.18487E+01         4.25553E+01         4.92934E+01
+          1.64968E-02         5.96749E-03        -9.28605E-03         1.03651E+00         5.94272E-01         1.03655E+00         8.84243E+01         1.00000E+00         4.61137E-05         8.84243E+01         4.12047E+01         4.72196E+01
+          1.64968E-02         6.13731E-03        -9.35062E-03         1.03650E+00         6.04943E-01         1.03655E+00         8.50586E+01         1.00000E+00         4.61566E-05         8.50586E+01         3.98595E+01         4.51991E+01
+          1.64968E-02         6.30714E-03        -9.41701E-03         1.03650E+00         6.15613E-01         1.03655E+00         8.17541E+01         1.00000E+00         4.62161E-05         8.17541E+01         3.85209E+01         4.32333E+01
+          1.64968E-02         6.47697E-03        -9.48521E-03         1.03650E+00         6.26284E-01         1.03655E+00         7.85132E+01         1.00000E+00         4.62927E-05         7.85132E+01         3.71903E+01         4.13229E+01
+          1.64968E-02         6.64680E-03        -9.55522E-03         1.03650E+00         6.36955E-01         1.03654E+00         7.53380E+01         1.00000E+00         4.63869E-05         7.53380E+01         3.58691E+01         3.94689E+01
+          1.64968E-02         6.81662E-03        -9.62705E-03         1.03650E+00         6.47625E-01         1.03654E+00         7.22304E+01         1.00000E+00         4.64990E-05         7.22304E+01         3.45586E+01         3.76718E+01
+          1.64968E-02         6.98645E-03        -9.70068E-03         1.03650E+00         6.58296E-01         1.03654E+00         6.91922E+01         1.00000E+00         4.66295E-05         6.91922E+01         3.32602E+01         3.59320E+01
+          1.64968E-02         7.15628E-03        -9.77613E-03         1.03650E+00         6.68966E-01         1.03654E+00         6.62250E+01         1.00000E+00         4.67788E-05         6.62250E+01         3.19750E+01         3.42500E+01
+          1.64968E-02         7.32611E-03        -9.85339E-03         1.03650E+00         6.79637E-01         1.03654E+00         6.33302E+01         1.00000E+00         4.69473E-05         6.33302E+01         3.07044E+01         3.26258E+01
+          1.64968E-02         7.49593E-03        -9.93246E-03         1.03649E+00         6.90307E-01         1.03654E+00         6.05090E+01         1.00000E+00         4.71354E-05         6.05090E+01         2.94497E+01         3.10594E+01
+          1.64968E-02         7.66576E-03        -1.00133E-02         1.03649E+00         7.00978E-01         1.03654E+00         5.77626E+01         1.00000E+00         4.73434E-05         5.77626E+01         2.82119E+01         2.95507E+01
+          1.64968E-02         7.83559E-03        -1.00960E-02         1.03649E+00         7.11649E-01         1.03654E+00         5.50918E+01         1.00000E+00         4.75716E-05         5.50918E+01         2.69923E+01         2.80995E+01
+          1.64968E-02         8.00542E-03        -1.01805E-02         1.03649E+00         7.22319E-01         1.03654E+00         5.24974E+01         1.00000E+00         4.78204E-05         5.24974E+01         2.57920E+01         2.67054E+01
+          1.64968E-02         8.17524E-03        -1.02669E-02         1.03649E+00         7.32990E-01         1.03654E+00         4.99799E+01         1.00000E+00         4.80901E-05         4.99799E+01         2.46121E+01         2.53678E+01
+          1.64968E-02         8.34507E-03        -1.03550E-02         1.03649E+00         7.43660E-01         1.03654E+00         4.75397E+01         1.00000E+00         4.83808E-05         4.75397E+01         2.34537E+01         2.40860E+01
+          1.64968E-02         8.51490E-03        -1.04449E-02         1.03649E+00         7.54331E-01         1.03654E+00         4.51772E+01         1.00000E+00         4.86929E-05         4.51772E+01         2.23177E+01         2.28595E+01
+          1.64968E-02         8.68473E-03        -1.05367E-02         1.03648E+00         7.65001E-01         1.03654E+00         4.28925E+01         1.00000E+00         4.90265E-05         4.28925E+01         2.12051E+01         2.16873E+01
+          1.64968E-02         8.85455E-03        -1.06303E-02         1.03648E+00         7.75672E-01         1.03654E+00         4.06855E+01         1.00000E+00         4.93818E-05         4.06855E+01         2.01169E+01         2.05685E+01
+          1.64968E-02         9.02438E-03        -1.07256E-02         1.03648E+00         7.86343E-01         1.03654E+00         3.85561E+01         1.00000E+00         4.97589E-05         3.85561E+01         1.90539E+01         1.95021E+01
+          1.64968E-02         9.19421E-03        -1.08228E-02         1.03648E+00         7.97013E-01         1.03654E+00         3.65039E+01         1.00000E+00         5.01579E-05         3.65039E+01         1.80169E+01         1.84870E+01
+          1.64968E-02         9.36403E-03        -1.09218E-02         1.03648E+00         8.07684E-01         1.03654E+00         3.45287E+01         1.00000E+00         5.05790E-05         3.45287E+01         1.70067E+01         1.75220E+01
+          1.64968E-02         9.53386E-03        -1.10227E-02         1.03648E+00         8.18354E-01         1.03654E+00         3.26298E+01         1.00000E+00         5.10222E-05         3.26298E+01         1.60239E+01         1.66059E+01
+          1.64968E-02         9.70369E-03        -1.11253E-02         1.03647E+00         8.29025E-01         1.03653E+00         3.08067E+01         1.00000E+00         5.14874E-05         3.08067E+01         1.50693E+01         1.57374E+01
+          1.64968E-02         9.87352E-03        -1.12297E-02         1.03647E+00         8.39695E-01         1.03653E+00         2.90584E+01         1.00000E+00         5.19746E-05         2.90584E+01         1.41433E+01         1.49151E+01
+          1.64968E-02         1.00433E-02        -1.13360E-02         1.03647E+00         8.50366E-01         1.03653E+00         2.73843E+01         1.00000E+00         5.24839E-05         2.73843E+01         1.32466E+01         1.41377E+01
+          1.64968E-02         1.02132E-02        -1.14440E-02         1.03647E+00         8.61037E-01         1.03653E+00         2.57833E+01         1.00000E+00         5.30150E-05         2.57833E+01         1.23795E+01         1.34038E+01
+          1.64968E-02         1.03830E-02        -1.15539E-02         1.03647E+00         8.71707E-01         1.03653E+00         2.42545E+01         1.00000E+00         5.35679E-05         2.42545E+01         1.15426E+01         1.27119E+01
+          1.64968E-02         1.05528E-02        -1.16656E-02         1.03647E+00         8.82378E-01         1.03653E+00         2.27966E+01         1.00000E+00         5.41425E-05         2.27966E+01         1.07362E+01         1.20604E+01
+          1.64968E-02         1.07227E-02        -1.17791E-02         1.03646E+00         8.93048E-01         1.03653E+00         2.14085E+01         1.00000E+00         5.47384E-05         2.14085E+01         9.96041E+00         1.14481E+01
+          1.64968E-02         1.08925E-02        -1.18944E-02         1.03646E+00         9.03719E-01         1.03653E+00         2.00888E+01         1.00000E+00         5.53557E-05         2.00888E+01         9.21563E+00         1.08732E+01
+          1.64968E-02         1.10623E-02        -1.20116E-02         1.03646E+00         9.14389E-01         1.03653E+00         1.88364E+01         1.00000E+00         5.59939E-05         1.88364E+01         8.50196E+00         1.03344E+01
+          1.64968E-02         1.12321E-02        -1.21305E-02         1.03646E+00         9.25060E-01         1.03653E+00         1.76497E+01         1.00000E+00         5.66529E-05         1.76497E+01         7.81950E+00         9.83016E+00
+          1.64968E-02         1.14020E-02        -1.22512E-02         1.03646E+00         9.35731E-01         1.03653E+00         1.65272E+01         1.00000E+00         5.73323E-05         1.65272E+01         7.16829E+00         9.35895E+00
+          1.64968E-02         1.15718E-02        -1.23738E-02         1.03645E+00         9.46401E-01         1.03653E+00         1.54676E+01         1.00000E+00         5.80320E-05         1.54676E+01         6.54831E+00         8.91930E+00
+          1.64968E-02         1.17416E-02        -1.24982E-02         1.03645E+00         9.57072E-01         1.03653E+00         1.44692E+01         1.00000E+00         5.87515E-05         1.44692E+01         5.95946E+00         8.50975E+00
+          1.64968E-02         1.19114E-02        -1.26244E-02         1.03645E+00         9.67742E-01         1.03653E+00         1.35305E+01         1.00000E+00         5.94906E-05         1.35305E+01         5.40161E+00         8.12885E+00
+          1.64968E-02         1.20813E-02        -1.27524E-02         1.03645E+00         9.78413E-01         1.03653E+00         1.26497E+01         1.00000E+00         6.02490E-05         1.26497E+01         4.87455E+00         7.77518E+00
+          1.64968E-02         1.22511E-02        -1.28822E-02         1.03645E+00         9.89083E-01         1.03653E+00         1.18254E+01         1.00000E+00         6.10262E-05         1.18254E+01         4.37801E+00         7.44736E+00
+          1.64968E-02         1.24209E-02        -1.30138E-02         1.03644E+00         9.99754E-01         1.03653E+00         1.10557E+01         1.00000E+00         6.18220E-05         1.10557E+01         3.91169E+00         7.14403E+00
+          1.64968E-02         1.25908E-02        -1.31472E-02         1.03644E+00         1.01042E+00         1.03652E+00         1.03391E+01         1.00000E+00         6.26361E-05         1.03391E+01         3.47521E+00         6.86386E+00
+          1.64968E-02         1.27606E-02        -1.32825E-02         1.03644E+00         1.02110E+00         1.03652E+00         9.67372E+00         1.00000E+00         6.34681E-05         9.67372E+00         3.06815E+00         6.60557E+00
+          1.64968E-02         1.29304E-02        -1.34195E-02         1.03644E+00         1.03177E+00         1.03652E+00         9.05795E+00         1.00000E+00         6.43177E-05         9.05795E+00         2.69003E+00         6.36792E+00
+          1.64968E-02         1.31002E-02        -1.35584E-02         1.03643E+00         1.04244E+00         1.03652E+00         8.49003E+00         1.00000E+00         6.51845E-05         8.49003E+00         2.34033E+00         6.14971E+00
+          1.64968E-02         1.32701E-02        -1.36991E-02         1.03643E+00         1.05311E+00         1.03652E+00         7.96824E+00         1.00000E+00         6.60684E-05         7.96824E+00         2.01847E+00         5.94977E+00
+          1.64968E-02         1.34399E-02        -1.38416E-02         1.03643E+00         1.06378E+00         1.03652E+00         7.49085E+00         1.00000E+00         6.69690E-05         7.49085E+00         1.72385E+00         5.76700E+00
+          1.64968E-02         1.36097E-02        -1.39859E-02         1.03643E+00         1.07445E+00         1.03652E+00         7.05612E+00         1.00000E+00         6.78860E-05         7.05612E+00         1.45580E+00         5.60033E+00
+          1.64968E-02         1.37795E-02        -1.41320E-02         1.03643E+00         1.08512E+00         1.03652E+00         6.66236E+00         1.00000E+00         6.88193E-05         6.66236E+00         1.21362E+00         5.44874E+00
+          1.64968E-02         1.39494E-02        -1.42800E-02         1.03642E+00         1.09579E+00         1.03652E+00         6.30785E+00         1.00000E+00         6.97686E-05         6.30785E+00         9.96585E-01         5.31127E+00
+          1.64968E-02         1.41192E-02        -1.44297E-02         1.03642E+00         1.10646E+00         1.03652E+00         5.99090E+00         1.00000E+00         7.07337E-05         5.99090E+00         8.03916E-01         5.18699E+00
+          1.64968E-02         1.42890E-02        -1.45813E-02         1.03642E+00         1.11713E+00         1.03652E+00         5.70984E+00         1.00000E+00         7.17146E-05         5.70984E+00         6.34813E-01         5.07503E+00
+          1.64968E-02         1.44589E-02        -1.47347E-02         1.03642E+00         1.12780E+00         1.03652E+00         5.46300E+00         1.00000E+00         7.27109E-05         5.46300E+00         4.88441E-01         4.97456E+00
+          1.64968E-02         1.46287E-02        -1.48898E-02         1.03641E+00         1.13847E+00         1.03652E+00         5.24874E+00         1.00000E+00         7.37227E-05         5.24874E+00         3.63943E-01         4.88480E+00
+          1.64968E-02         1.47985E-02        -1.50468E-02         1.03641E+00         1.14914E+00         1.03652E+00         5.06545E+00         1.00000E+00         7.47499E-05         5.06545E+00         2.60434E-01         4.80501E+00
+          1.64968E-02         1.49683E-02        -1.52057E-02         1.03641E+00         1.15981E+00         1.03652E+00         4.91153E+00         1.00000E+00         7.57924E-05         4.91153E+00         1.77011E-01         4.73452E+00
+          1.64968E-02         1.51382E-02        -1.53663E-02         1.03640E+00         1.17048E+00         1.03652E+00         4.78542E+00         1.00000E+00         7.68502E-05         4.78542E+00         1.12750E-01         4.67267E+00
+          1.64968E-02         1.53080E-02        -1.55287E-02         1.03640E+00         1.18115E+00         1.03652E+00         4.68557E+00         1.00000E+00         7.79234E-05         4.68557E+00         6.67143E-02         4.61885E+00
+          1.64968E-02         1.54778E-02        -1.56930E-02         1.03640E+00         1.19182E+00         1.03652E+00         4.61047E+00         1.00000E+00         7.90119E-05         4.61047E+00         3.79528E-02         4.57251E+00
+          1.64968E-02         1.56476E-02        -1.58590E-02         1.03640E+00         1.20249E+00         1.03652E+00         4.55863E+00         1.00000E+00         8.01159E-05         4.55863E+00         2.55059E-02         4.53313E+00
+          1.64968E-02         1.58175E-02        -1.60269E-02         1.03639E+00         1.21317E+00         1.03652E+00         4.52861E+00         1.00000E+00         8.12353E-05         4.52861E+00         2.84070E-02         4.50020E+00
+          1.64968E-02         1.59873E-02        -1.61966E-02         1.03639E+00         1.22384E+00         1.03652E+00         4.51897E+00         1.00000E+00         8.23704E-05         4.51897E+00         4.56858E-02         4.47328E+00
+          1.64968E-02         1.61571E-02        -1.63681E-02         1.03639E+00         1.23451E+00         1.03652E+00         4.52833E+00         1.00000E+00         8.35211E-05         4.52833E+00         7.63708E-02         4.45196E+00
+          1.64968E-02         1.63270E-02        -1.65414E-02         1.03639E+00         1.24518E+00         1.03652E+00         4.55533E+00         1.00000E+00         8.46876E-05         4.55533E+00         1.19492E-01         4.43584E+00
+          1.64968E-02         1.64968E-02        -1.67165E-02         1.03638E+00         1.25585E+00         1.03652E+00         4.59864E+00         1.00000E+00         8.58701E-05         4.59864E+00         1.74085E-01         4.42455E+00
+          1.64968E-02         1.66666E-02        -1.68935E-02         1.03638E+00         1.26652E+00         1.03652E+00         4.65697E+00         1.00000E+00         8.70685E-05         4.65697E+00         2.39191E-01         4.41778E+00
+          1.64968E-02         1.68364E-02        -1.70722E-02         1.03638E+00         1.27719E+00         1.03652E+00         4.72906E+00         1.00000E+00         8.82831E-05         4.72906E+00         3.13861E-01         4.41520E+00
+          1.64968E-02         1.70063E-02        -1.72528E-02         1.03637E+00         1.28786E+00         1.03652E+00         4.81369E+00         1.00000E+00         8.95139E-05         4.81369E+00         3.97159E-01         4.41653E+00
+          1.64968E-02         1.71761E-02        -1.74351E-02         1.03637E+00         1.29853E+00         1.03652E+00         4.90967E+00         1.00000E+00         9.07610E-05         4.90967E+00         4.88162E-01         4.42151E+00
+          1.64968E-02         1.73459E-02        -1.76193E-02         1.03637E+00         1.30920E+00         1.03652E+00         5.01584E+00         1.00000E+00         9.20245E-05         5.01584E+00         5.85965E-01         4.42987E+00
+          1.64968E-02         1.75158E-02        -1.78053E-02         1.03636E+00         1.31987E+00         1.03652E+00         5.13108E+00         1.00000E+00         9.33043E-05         5.13108E+00         6.89681E-01         4.44140E+00
+          1.64968E-02         1.76856E-02        -1.79931E-02         1.03636E+00         1.33054E+00         1.03652E+00         5.25430E+00         1.00000E+00         9.46005E-05         5.25430E+00         7.98444E-01         4.45586E+00
+          1.64968E-02         1.78554E-02        -1.81828E-02         1.03636E+00         1.34121E+00         1.03652E+00         5.38446E+00         1.00000E+00         9.59130E-05         5.38446E+00         9.11412E-01         4.47304E+00
+          1.64968E-02         1.80252E-02        -1.83742E-02         1.03636E+00         1.35188E+00         1.03652E+00         5.52053E+00         1.00000E+00         9.72417E-05         5.52053E+00         1.02777E+00         4.49276E+00
+          1.64968E-02         1.81951E-02        -1.85675E-02         1.03635E+00         1.36255E+00         1.03652E+00         5.66153E+00         1.00000E+00         9.85866E-05         5.66153E+00         1.14671E+00         4.51481E+00
+          1.64968E-02         1.83649E-02        -1.87625E-02         1.03635E+00         1.37322E+00         1.03652E+00         5.80651E+00         1.00000E+00         9.99474E-05         5.80651E+00         1.26749E+00         4.53902E+00
+          1.64968E-02         1.85347E-02        -1.89594E-02         1.03635E+00         1.38389E+00         1.03652E+00         5.95457E+00         1.00000E+00         1.01324E-04         5.95457E+00         1.38936E+00         4.56520E+00
+          1.64968E-02         1.87045E-02        -1.91581E-02         1.03634E+00         1.39457E+00         1.03652E+00         6.10481E+00         1.00000E+00         1.02716E-04         6.10481E+00         1.51163E+00         4.59318E+00
+          1.64968E-02         1.88744E-02        -1.93586E-02         1.03634E+00         1.40524E+00         1.03652E+00         6.25639E+00         1.00000E+00         1.04123E-04         6.25639E+00         1.63361E+00         4.62278E+00
+          1.64968E-02         1.90442E-02        -1.95609E-02         1.03634E+00         1.41591E+00         1.03652E+00         6.40851E+00         1.00000E+00         1.05545E-04         6.40851E+00         1.75468E+00         4.65383E+00
+          1.64968E-02         1.92140E-02        -1.97650E-02         1.03633E+00         1.42658E+00         1.03652E+00         6.56037E+00         1.00000E+00         1.06981E-04         6.56037E+00         1.87422E+00         4.68616E+00
+          1.64968E-02         1.93839E-02        -1.99710E-02         1.03633E+00         1.43725E+00         1.03652E+00         6.71125E+00         1.00000E+00         1.08431E-04         6.71125E+00         1.99166E+00         4.71959E+00
+          1.64968E-02         1.95537E-02        -2.01787E-02         1.03633E+00         1.44792E+00         1.03652E+00         6.86042E+00         1.00000E+00         1.09894E-04         6.86042E+00         2.10647E+00         4.75395E+00
+          1.64968E-02         1.97235E-02        -2.03883E-02         1.03632E+00         1.45859E+00         1.03652E+00         7.00720E+00         1.00000E+00         1.11370E-04         7.00720E+00         2.21815E+00         4.78905E+00
+          1.64968E-02         1.98933E-02        -2.05997E-02         1.03632E+00         1.46926E+00         1.03652E+00         7.15097E+00         1.00000E+00         1.12858E-04         7.15097E+00         2.32623E+00         4.82473E+00
+          1.64968E-02         2.00632E-02        -2.08129E-02         1.03632E+00         1.47993E+00         1.03652E+00         7.29109E+00         1.00000E+00         1.14358E-04         7.29109E+00         2.43029E+00         4.86080E+00
+          1.64968E-02         2.02330E-02        -2.10279E-02         1.03631E+00         1.49060E+00         1.03652E+00         7.42700E+00         1.00000E+00         1.15868E-04         7.42700E+00         2.52994E+00         4.89706E+00
+          1.64968E-02         2.04028E-02        -2.12447E-02         1.03631E+00         1.50127E+00         1.03653E+00         7.55815E+00         1.00000E+00         1.17388E-04         7.55815E+00         2.62481E+00         4.93334E+00
+          1.64968E-02         2.05726E-02        -2.14633E-02         1.03630E+00         1.51194E+00         1.03653E+00         7.68402E+00         1.00000E+00         1.18917E-04         7.68402E+00         2.71459E+00         4.96943E+00
+          1.64968E-02         2.07425E-02        -2.16838E-02         1.03630E+00         1.52261E+00         1.03653E+00         7.80414E+00         1.00000E+00         1.20455E-04         7.80414E+00         2.79899E+00         5.00515E+00
+          1.64968E-02         2.09123E-02        -2.19060E-02         1.03630E+00         1.53328E+00         1.03653E+00         7.91807E+00         1.00000E+00         1.22000E-04         7.91807E+00         2.87777E+00         5.04029E+00
+          1.64968E-02         2.10821E-02        -2.21301E-02         1.03629E+00         1.54395E+00         1.03653E+00         8.02537E+00         1.00000E+00         1.23553E-04         8.02537E+00         2.95071E+00         5.07466E+00
+          1.64968E-02         2.12520E-02        -2.23560E-02         1.03629E+00         1.55462E+00         1.03653E+00         8.12568E+00         1.00000E+00         1.25111E-04         8.12568E+00         3.01764E+00         5.10804E+00
+          1.64968E-02         2.14218E-02        -2.25837E-02         1.03629E+00         1.56529E+00         1.03653E+00         8.21864E+00         1.00000E+00         1.26675E-04         8.21864E+00         3.07840E+00         5.14024E+00
+          1.64968E-02         2.15916E-02        -2.28132E-02         1.03628E+00         1.57596E+00         1.03653E+00         8.30393E+00         1.00000E+00         1.28243E-04         8.30393E+00         3.13288E+00         5.17106E+00
+          1.64968E-02         2.17614E-02        -2.30445E-02         1.03628E+00         1.58664E+00         1.03653E+00         8.38128E+00         1.00000E+00         1.29814E-04         8.38128E+00         3.18099E+00         5.20028E+00
+          1.64968E-02         2.19313E-02        -2.32776E-02         1.03627E+00         1.59731E+00         1.03654E+00         8.45041E+00         1.00000E+00         1.31389E-04         8.45041E+00         3.22270E+00         5.22771E+00
+          1.64968E-02         2.21011E-02        -2.35126E-02         1.03627E+00         1.60798E+00         1.03654E+00         8.51112E+00         1.00000E+00         1.32967E-04         8.51112E+00         3.25797E+00         5.25315E+00
+          1.64968E-02         2.22709E-02        -2.37494E-02         1.03627E+00         1.61865E+00         1.03654E+00         8.56320E+00         1.00000E+00         1.34545E-04         8.56320E+00         3.28681E+00         5.27639E+00
+          1.64968E-02         2.24407E-02        -2.39879E-02         1.03626E+00         1.62932E+00         1.03654E+00         8.60650E+00         1.00000E+00         1.36125E-04         8.60650E+00         3.30926E+00         5.29724E+00
+          1.64968E-02         2.26106E-02        -2.42283E-02         1.03626E+00         1.63999E+00         1.03654E+00         8.64089E+00         1.00000E+00         1.37706E-04         8.64089E+00         3.32537E+00         5.31552E+00
+          1.64968E-02         2.27804E-02        -2.44705E-02         1.03625E+00         1.65066E+00         1.03654E+00         8.66626E+00         1.00000E+00         1.39287E-04         8.66626E+00         3.33522E+00         5.33103E+00
+          1.64968E-02         2.29502E-02        -2.47145E-02         1.03625E+00         1.66133E+00         1.03655E+00         8.68255E+00         1.00000E+00         1.40867E-04         8.68255E+00         3.33893E+00         5.34361E+00
+          1.64968E-02         2.31201E-02        -2.49604E-02         1.03625E+00         1.67200E+00         1.03655E+00         8.68971E+00         1.00000E+00         1.42446E-04         8.68971E+00         3.33663E+00         5.35309E+00
+          1.64968E-02         2.32899E-02        -2.52080E-02         1.03624E+00         1.68267E+00         1.03655E+00         8.68775E+00         1.00000E+00         1.44025E-04         8.68775E+00         3.32845E+00         5.35929E+00
+          1.64968E-02         2.34597E-02        -2.54575E-02         1.03624E+00         1.69334E+00         1.03655E+00         8.67666E+00         1.00000E+00         1.45602E-04         8.67666E+00         3.31457E+00         5.36209E+00
+          1.64968E-02         2.36295E-02        -2.57087E-02         1.03623E+00         1.70401E+00         1.03655E+00         8.65650E+00         1.00000E+00         1.47178E-04         8.65650E+00         3.29518E+00         5.36132E+00
+          1.64968E-02         2.37994E-02        -2.59618E-02         1.03623E+00         1.71468E+00         1.03656E+00         8.62735E+00         1.00000E+00         1.48752E-04         8.62735E+00         3.27048E+00         5.35687E+00
+          1.64968E-02         2.39692E-02        -2.62167E-02         1.03623E+00         1.72535E+00         1.03656E+00         8.58929E+00         1.00000E+00         1.50324E-04         8.58929E+00         3.24067E+00         5.34862E+00
+          1.64968E-02         2.41390E-02        -2.64734E-02         1.03622E+00         1.73602E+00         1.03656E+00         8.54246E+00         1.00000E+00         1.51894E-04         8.54246E+00         3.20599E+00         5.33647E+00
+          1.64968E-02         2.43088E-02        -2.67320E-02         1.03622E+00         1.74669E+00         1.03656E+00         8.48701E+00         1.00000E+00         1.53463E-04         8.48701E+00         3.16668E+00         5.32033E+00
+          1.64968E-02         2.44787E-02        -2.69923E-02         1.03621E+00         1.75736E+00         1.03656E+00         8.42312E+00         1.00000E+00         1.55031E-04         8.42312E+00         3.12300E+00         5.30012E+00
+          1.64968E-02         2.46485E-02        -2.72544E-02         1.03621E+00         1.76804E+00         1.03657E+00         8.35098E+00         1.00000E+00         1.56596E-04         8.35098E+00         3.07518E+00         5.27579E+00
+          1.64968E-02         2.48183E-02        -2.75184E-02         1.03620E+00         1.77871E+00         1.03657E+00         8.27081E+00         1.00000E+00         1.58160E-04         8.27081E+00         3.02351E+00         5.24730E+00
+          1.64968E-02         2.49882E-02        -2.77842E-02         1.03620E+00         1.78938E+00         1.03657E+00         8.18287E+00         1.00000E+00         1.59723E-04         8.18287E+00         2.96826E+00         5.21462E+00
+          1.64968E-02         2.51580E-02        -2.80518E-02         1.03620E+00         1.80005E+00         1.03658E+00         8.08742E+00         1.00000E+00         1.61285E-04         8.08742E+00         2.90969E+00         5.17773E+00
+          1.64968E-02         2.53278E-02        -2.83212E-02         1.03619E+00         1.81072E+00         1.03658E+00         7.98474E+00         1.00000E+00         1.62846E-04         7.98474E+00         2.84809E+00         5.13665E+00
+          1.64968E-02         2.54976E-02        -2.85924E-02         1.03619E+00         1.82139E+00         1.03658E+00         7.87514E+00         1.00000E+00         1.64407E-04         7.87514E+00         2.78373E+00         5.09141E+00
+          1.64968E-02         2.56675E-02        -2.88654E-02         1.03618E+00         1.83206E+00         1.03658E+00         7.75894E+00         1.00000E+00         1.65966E-04         7.75894E+00         2.71691E+00         5.04203E+00
+          1.64968E-02         2.58373E-02        -2.91403E-02         1.03618E+00         1.84273E+00         1.03659E+00         7.63648E+00         1.00000E+00         1.67525E-04         7.63648E+00         2.64789E+00         4.98859E+00
+          1.64968E-02         2.60071E-02        -2.94169E-02         1.03617E+00         1.85340E+00         1.03659E+00         7.50810E+00         1.00000E+00         1.69084E-04         7.50810E+00         2.57695E+00         4.93116E+00
+          1.64968E-02         2.61769E-02        -2.96954E-02         1.03617E+00         1.86407E+00         1.03659E+00         7.37419E+00         1.00000E+00         1.70642E-04         7.37419E+00         2.50437E+00         4.86982E+00
+          1.66666E-02         8.72665E-04        -8.36832E-03         1.04719E+00         2.74155E-01         1.04723E+00         1.92225E+02         1.00000E+00         3.58996E-05         1.92225E+02         7.19221E+01         1.20303E+02
+          1.66666E-02         1.04249E-03        -8.37854E-03         1.04719E+00         2.84826E-01         1.04723E+00         1.88992E+02         1.00000E+00         3.57669E-05         1.88992E+02         7.11009E+01         1.17892E+02
+          1.66666E-02         1.21232E-03        -8.39057E-03         1.04719E+00         2.95496E-01         1.04723E+00         1.85690E+02         1.00000E+00         3.56339E-05         1.85690E+02         7.02531E+01         1.15437E+02
+          1.66666E-02         1.38215E-03        -8.40441E-03         1.04719E+00         3.06167E-01         1.04723E+00         1.82322E+02         1.00000E+00         3.55010E-05         1.82322E+02         6.93794E+01         1.12943E+02
+          1.66666E-02         1.55197E-03        -8.42006E-03         1.04719E+00         3.16838E-01         1.04723E+00         1.78896E+02         1.00000E+00         3.53688E-05         1.78896E+02         6.84804E+01         1.10415E+02
+          1.66666E-02         1.72180E-03        -8.43753E-03         1.04719E+00         3.27508E-01         1.04723E+00         1.75415E+02         1.00000E+00         3.52376E-05         1.75415E+02         6.75568E+01         1.07858E+02
+          1.66666E-02         1.89163E-03        -8.45680E-03         1.04719E+00         3.38179E-01         1.04723E+00         1.71885E+02         1.00000E+00         3.51079E-05         1.71885E+02         6.66093E+01         1.05276E+02
+          1.66666E-02         2.06146E-03        -8.47789E-03         1.04719E+00         3.48849E-01         1.04723E+00         1.68312E+02         1.00000E+00         3.49802E-05         1.68312E+02         6.56387E+01         1.02673E+02
+          1.66666E-02         2.23128E-03        -8.50079E-03         1.04719E+00         3.59520E-01         1.04723E+00         1.64700E+02         1.00000E+00         3.48548E-05         1.64700E+02         6.46456E+01         1.00054E+02
+          1.66666E-02         2.40111E-03        -8.52550E-03         1.04719E+00         3.70190E-01         1.04723E+00         1.61055E+02         1.00000E+00         3.47323E-05         1.61055E+02         6.36310E+01         9.74238E+01
+          1.66666E-02         2.57094E-03        -8.55203E-03         1.04719E+00         3.80861E-01         1.04723E+00         1.57382E+02         1.00000E+00         3.46131E-05         1.57382E+02         6.25956E+01         9.47860E+01
+          1.66666E-02         2.74077E-03        -8.58036E-03         1.04719E+00         3.91532E-01         1.04723E+00         1.53686E+02         1.00000E+00         3.44975E-05         1.53686E+02         6.15404E+01         9.21451E+01
+          1.66666E-02         2.91059E-03        -8.61051E-03         1.04719E+00         4.02202E-01         1.04723E+00         1.49972E+02         1.00000E+00         3.43862E-05         1.49972E+02         6.04662E+01         8.95054E+01
+          1.66666E-02         3.08042E-03        -8.64247E-03         1.04719E+00         4.12873E-01         1.04722E+00         1.46245E+02         1.00000E+00         3.42794E-05         1.46245E+02         5.93740E+01         8.68710E+01
+          1.66666E-02         3.25025E-03        -8.67624E-03         1.04719E+00         4.23543E-01         1.04722E+00         1.42510E+02         1.00000E+00         3.41777E-05         1.42510E+02         5.82647E+01         8.42457E+01
+          1.66666E-02         3.42008E-03        -8.71182E-03         1.04719E+00         4.34214E-01         1.04722E+00         1.38773E+02         1.00000E+00         3.40814E-05         1.38773E+02         5.71393E+01         8.16334E+01
+          1.66666E-02         3.58990E-03        -8.74922E-03         1.04719E+00         4.44884E-01         1.04722E+00         1.35037E+02         1.00000E+00         3.39911E-05         1.35037E+02         5.59989E+01         7.90380E+01
+          1.66666E-02         3.75973E-03        -8.78843E-03         1.04719E+00         4.55555E-01         1.04722E+00         1.31307E+02         1.00000E+00         3.39071E-05         1.31307E+02         5.48445E+01         7.64629E+01
+          1.66666E-02         3.92956E-03        -8.82944E-03         1.04719E+00         4.66225E-01         1.04722E+00         1.27589E+02         1.00000E+00         3.38299E-05         1.27589E+02         5.36771E+01         7.39117E+01
+          1.66666E-02         4.09939E-03        -8.87228E-03         1.04719E+00         4.76896E-01         1.04722E+00         1.23886E+02         1.00000E+00         3.37599E-05         1.23886E+02         5.24980E+01         7.13877E+01
+          1.66666E-02         4.26921E-03        -8.91692E-03         1.04718E+00         4.87567E-01         1.04722E+00         1.20202E+02         1.00000E+00         3.36976E-05         1.20202E+02         5.13082E+01         6.88940E+01
+          1.66666E-02         4.43904E-03        -8.96337E-03         1.04718E+00         4.98237E-01         1.04722E+00         1.16542E+02         1.00000E+00         3.36434E-05         1.16542E+02         5.01088E+01         6.64336E+01
+          1.66666E-02         4.60887E-03        -9.01164E-03         1.04718E+00         5.08908E-01         1.04722E+00         1.12911E+02         1.00000E+00         3.35976E-05         1.12911E+02         4.89011E+01         6.40095E+01
+          1.66666E-02         4.77869E-03        -9.06172E-03         1.04718E+00         5.19578E-01         1.04722E+00         1.09310E+02         1.00000E+00         3.35608E-05         1.09310E+02         4.76863E+01         6.16242E+01
+          1.66666E-02         4.94852E-03        -9.11361E-03         1.04718E+00         5.30249E-01         1.04722E+00         1.05746E+02         1.00000E+00         3.35333E-05         1.05746E+02         4.64654E+01         5.92803E+01
+          1.66666E-02         5.11835E-03        -9.16731E-03         1.04718E+00         5.40919E-01         1.04722E+00         1.02220E+02         1.00000E+00         3.35157E-05         1.02220E+02         4.52399E+01         5.69800E+01
+          1.66666E-02         5.28818E-03        -9.22283E-03         1.04718E+00         5.51590E-01         1.04722E+00         9.87365E+01         1.00000E+00         3.35082E-05         9.87365E+01         4.40108E+01         5.47257E+01
+          1.66666E-02         5.45800E-03        -9.28016E-03         1.04718E+00         5.62261E-01         1.04722E+00         9.52986E+01         1.00000E+00         3.35113E-05         9.52986E+01         4.27795E+01         5.25192E+01
+          1.66666E-02         5.62783E-03        -9.33929E-03         1.04718E+00         5.72931E-01         1.04722E+00         9.19094E+01         1.00000E+00         3.35255E-05         9.19094E+01         4.15471E+01         5.03623E+01
+          1.66666E-02         5.79766E-03        -9.40024E-03         1.04718E+00         5.83602E-01         1.04722E+00         8.85718E+01         1.00000E+00         3.35511E-05         8.85718E+01         4.03151E+01         4.82567E+01
+          1.66666E-02         5.96749E-03        -9.46301E-03         1.04718E+00         5.94272E-01         1.04722E+00         8.52884E+01         1.00000E+00         3.35885E-05         8.52884E+01         3.90845E+01         4.62039E+01
+          1.66666E-02         6.13731E-03        -9.52758E-03         1.04717E+00         6.04943E-01         1.04722E+00         8.20618E+01         1.00000E+00         3.36382E-05         8.20618E+01         3.78567E+01         4.42050E+01
+          1.66666E-02         6.30714E-03        -9.59397E-03         1.04717E+00         6.15613E-01         1.04722E+00         7.88943E+01         1.00000E+00         3.37005E-05         7.88943E+01         3.66330E+01         4.22612E+01
+          1.66666E-02         6.47697E-03        -9.66217E-03         1.04717E+00         6.26284E-01         1.04722E+00         7.57881E+01         1.00000E+00         3.37757E-05         7.57881E+01         3.54146E+01         4.03735E+01
+          1.66666E-02         6.64680E-03        -9.73218E-03         1.04717E+00         6.36955E-01         1.04722E+00         7.27453E+01         1.00000E+00         3.38644E-05         7.27453E+01         3.42028E+01         3.85425E+01
+          1.66666E-02         6.81662E-03        -9.80400E-03         1.04717E+00         6.47625E-01         1.04722E+00         6.97676E+01         1.00000E+00         3.39667E-05         6.97676E+01         3.29987E+01         3.67689E+01
+          1.66666E-02         6.98645E-03        -9.87764E-03         1.04717E+00         6.58296E-01         1.04722E+00         6.68568E+01         1.00000E+00         3.40831E-05         6.68568E+01         3.18036E+01         3.50531E+01
+          1.66666E-02         7.15628E-03        -9.95308E-03         1.04717E+00         6.68966E-01         1.04721E+00         6.40142E+01         1.00000E+00         3.42139E-05         6.40142E+01         3.06188E+01         3.33954E+01
+          1.66666E-02         7.32611E-03        -1.00303E-02         1.04717E+00         6.79637E-01         1.04721E+00         6.12413E+01         1.00000E+00         3.43594E-05         6.12413E+01         2.94454E+01         3.17959E+01
+          1.66666E-02         7.49593E-03        -1.01094E-02         1.04716E+00         6.90307E-01         1.04721E+00         5.85392E+01         1.00000E+00         3.45198E-05         5.85392E+01         2.82847E+01         3.02545E+01
+          1.66666E-02         7.66576E-03        -1.01903E-02         1.04716E+00         7.00978E-01         1.04721E+00         5.59088E+01         1.00000E+00         3.46956E-05         5.59088E+01         2.71376E+01         2.87711E+01
+          1.66666E-02         7.83559E-03        -1.02730E-02         1.04716E+00         7.11649E-01         1.04721E+00         5.33509E+01         1.00000E+00         3.48868E-05         5.33509E+01         2.60055E+01         2.73454E+01
+          1.66666E-02         8.00542E-03        -1.03575E-02         1.04716E+00         7.22319E-01         1.04721E+00         5.08663E+01         1.00000E+00         3.50938E-05         5.08663E+01         2.48893E+01         2.59770E+01
+          1.66666E-02         8.17524E-03        -1.04438E-02         1.04716E+00         7.32990E-01         1.04721E+00         4.84554E+01         1.00000E+00         3.53168E-05         4.84554E+01         2.37901E+01         2.46653E+01
+          1.66666E-02         8.34507E-03        -1.05319E-02         1.04716E+00         7.43660E-01         1.04721E+00         4.61186E+01         1.00000E+00         3.55559E-05         4.61186E+01         2.27090E+01         2.34095E+01
+          1.66666E-02         8.51490E-03        -1.06219E-02         1.04716E+00         7.54331E-01         1.04721E+00         4.38560E+01         1.00000E+00         3.58114E-05         4.38560E+01         2.16470E+01         2.22090E+01
+          1.66666E-02         8.68473E-03        -1.07136E-02         1.04715E+00         7.65001E-01         1.04721E+00         4.16678E+01         1.00000E+00         3.60833E-05         4.16678E+01         2.06049E+01         2.10629E+01
+          1.66666E-02         8.85455E-03        -1.08072E-02         1.04715E+00         7.75672E-01         1.04721E+00         3.95540E+01         1.00000E+00         3.63717E-05         3.95540E+01         1.95838E+01         1.99701E+01
+          1.66666E-02         9.02438E-03        -1.09026E-02         1.04715E+00         7.86343E-01         1.04721E+00         3.75142E+01         1.00000E+00         3.66768E-05         3.75142E+01         1.85845E+01         1.89297E+01
+          1.66666E-02         9.19421E-03        -1.09998E-02         1.04715E+00         7.97013E-01         1.04721E+00         3.55481E+01         1.00000E+00         3.69986E-05         3.55481E+01         1.76078E+01         1.79403E+01
+          1.66666E-02         9.36403E-03        -1.10988E-02         1.04715E+00         8.07684E-01         1.04721E+00         3.36554E+01         1.00000E+00         3.73371E-05         3.36554E+01         1.66545E+01         1.70010E+01
+          1.66666E-02         9.53386E-03        -1.11996E-02         1.04715E+00         8.18354E-01         1.04721E+00         3.18355E+01         1.00000E+00         3.76924E-05         3.18355E+01         1.57253E+01         1.61102E+01
+          1.66666E-02         9.70369E-03        -1.13022E-02         1.04714E+00         8.29025E-01         1.04721E+00         3.00877E+01         1.00000E+00         3.80643E-05         3.00877E+01         1.48209E+01         1.52668E+01
+          1.66666E-02         9.87352E-03        -1.14067E-02         1.04714E+00         8.39695E-01         1.04721E+00         2.84112E+01         1.00000E+00         3.84529E-05         2.84112E+01         1.39419E+01         1.44693E+01
+          1.66666E-02         1.00433E-02        -1.15129E-02         1.04714E+00         8.50366E-01         1.04720E+00         2.68052E+01         1.00000E+00         3.88581E-05         2.68052E+01         1.30890E+01         1.37162E+01
+          1.66666E-02         1.02132E-02        -1.16210E-02         1.04714E+00         8.61037E-01         1.04720E+00         2.52687E+01         1.00000E+00         3.92797E-05         2.52687E+01         1.22625E+01         1.30062E+01
+          1.66666E-02         1.03830E-02        -1.17309E-02         1.04714E+00         8.71707E-01         1.04720E+00         2.38008E+01         1.00000E+00         3.97177E-05         2.38008E+01         1.14631E+01         1.23377E+01
+          1.66666E-02         1.05528E-02        -1.18426E-02         1.04714E+00         8.82378E-01         1.04720E+00         2.24002E+01         1.00000E+00         4.01719E-05         2.24002E+01         1.06910E+01         1.17092E+01
+          1.66666E-02         1.07227E-02        -1.19561E-02         1.04713E+00         8.93048E-01         1.04720E+00         2.10658E+01         1.00000E+00         4.06421E-05         2.10658E+01         9.94675E+00         1.11191E+01
+          1.66666E-02         1.08925E-02        -1.20714E-02         1.04713E+00         9.03719E-01         1.04720E+00         1.97964E+01         1.00000E+00         4.11282E-05         1.97964E+01         9.23050E+00         1.05659E+01
+          1.66666E-02         1.10623E-02        -1.21885E-02         1.04713E+00         9.14389E-01         1.04720E+00         1.85906E+01         1.00000E+00         4.16299E-05         1.85906E+01         8.54254E+00         1.00481E+01
+          1.66666E-02         1.12321E-02        -1.23074E-02         1.04713E+00         9.25060E-01         1.04720E+00         1.74472E+01         1.00000E+00         4.21470E-05         1.74472E+01         7.88304E+00         9.56411E+00
+          1.66666E-02         1.14020E-02        -1.24282E-02         1.04713E+00         9.35731E-01         1.04720E+00         1.63645E+01         1.00000E+00         4.26794E-05         1.63645E+01         7.25212E+00         9.11240E+00
+          1.66666E-02         1.15718E-02        -1.25508E-02         1.04712E+00         9.46401E-01         1.04720E+00         1.53413E+01         1.00000E+00         4.32267E-05         1.53413E+01         6.64985E+00         8.69145E+00
+          1.66666E-02         1.17416E-02        -1.26751E-02         1.04712E+00         9.57072E-01         1.04720E+00         1.43760E+01         1.00000E+00         4.37888E-05         1.43760E+01         6.07624E+00         8.29976E+00
+          1.66666E-02         1.19114E-02        -1.28013E-02         1.04712E+00         9.67742E-01         1.04720E+00         1.34671E+01         1.00000E+00         4.43654E-05         1.34671E+01         5.53123E+00         7.93584E+00
+          1.66666E-02         1.20813E-02        -1.29293E-02         1.04712E+00         9.78413E-01         1.04720E+00         1.26130E+01         1.00000E+00         4.49563E-05         1.26130E+01         5.01472E+00         7.59826E+00
+          1.66666E-02         1.22511E-02        -1.30591E-02         1.04712E+00         9.89083E-01         1.04720E+00         1.18121E+01         1.00000E+00         4.55612E-05         1.18121E+01         4.52656E+00         7.28557E+00
+          1.66666E-02         1.24209E-02        -1.31907E-02         1.04711E+00         9.99754E-01         1.04720E+00         1.10629E+01         1.00000E+00         4.61800E-05         1.10629E+01         4.06651E+00         6.99641E+00
+          1.66666E-02         1.25908E-02        -1.33242E-02         1.04711E+00         1.01042E+00         1.04720E+00         1.03637E+01         1.00000E+00         4.68123E-05         1.03637E+01         3.63432E+00         6.72943E+00
+          1.66666E-02         1.27606E-02        -1.34594E-02         1.04711E+00         1.02110E+00         1.04720E+00         9.71298E+00         1.00000E+00         4.74580E-05         9.71298E+00         3.22967E+00         6.48332E+00
+          1.66666E-02         1.29304E-02        -1.35965E-02         1.04711E+00         1.03177E+00         1.04719E+00         9.10899E+00         1.00000E+00         4.81168E-05         9.10899E+00         2.85218E+00         6.25681E+00
+          1.66666E-02         1.31002E-02        -1.37354E-02         1.04710E+00         1.04244E+00         1.04719E+00         8.55015E+00         1.00000E+00         4.87887E-05         8.55015E+00         2.50144E+00         6.04871E+00
+          1.66666E-02         1.32701E-02        -1.38761E-02         1.04710E+00         1.05311E+00         1.04719E+00         8.03481E+00         1.00000E+00         4.94734E-05         8.03481E+00         2.17698E+00         5.85783E+00
+          1.66666E-02         1.34399E-02        -1.40186E-02         1.04710E+00         1.06378E+00         1.04719E+00         7.56136E+00         1.00000E+00         5.01708E-05         7.56136E+00         1.87830E+00         5.68306E+00
+          1.66666E-02         1.36097E-02        -1.41629E-02         1.04710E+00         1.07445E+00         1.04719E+00         7.12817E+00         1.00000E+00         5.08808E-05         7.12817E+00         1.60484E+00         5.52334E+00
+          1.66666E-02         1.37795E-02        -1.43090E-02         1.04709E+00         1.08512E+00         1.04719E+00         6.73364E+00         1.00000E+00         5.16033E-05         6.73364E+00         1.35600E+00         5.37763E+00
+          1.66666E-02         1.39494E-02        -1.44569E-02         1.04709E+00         1.09579E+00         1.04719E+00         6.37616E+00         1.00000E+00         5.23381E-05         6.37616E+00         1.13116E+00         5.24499E+00
+          1.66666E-02         1.41192E-02        -1.46067E-02         1.04709E+00         1.10646E+00         1.04719E+00         6.05415E+00         1.00000E+00         5.30853E-05         6.05415E+00         9.29656E-01         5.12449E+00
+          1.66666E-02         1.42890E-02        -1.47582E-02         1.04709E+00         1.11713E+00         1.04719E+00         5.76605E+00         1.00000E+00         5.38449E-05         5.76605E+00         7.50775E-01         5.01528E+00
+          1.66666E-02         1.44589E-02        -1.49116E-02         1.04708E+00         1.12780E+00         1.04719E+00         5.51032E+00         1.00000E+00         5.46168E-05         5.51032E+00         5.93790E-01         4.91653E+00
+          1.66666E-02         1.46287E-02        -1.50668E-02         1.04708E+00         1.13847E+00         1.04719E+00         5.28544E+00         1.00000E+00         5.54010E-05         5.28544E+00         4.57937E-01         4.82750E+00
+          1.66666E-02         1.47985E-02        -1.52238E-02         1.04708E+00         1.14914E+00         1.04719E+00         5.08989E+00         1.00000E+00         5.61976E-05         5.08989E+00         3.42431E-01         4.74746E+00
+          1.66666E-02         1.49683E-02        -1.53826E-02         1.04708E+00         1.15981E+00         1.04719E+00         4.92222E+00         1.00000E+00         5.70068E-05         4.92222E+00         2.46460E-01         4.67576E+00
+          1.66666E-02         1.51382E-02        -1.55432E-02         1.04707E+00         1.17048E+00         1.04719E+00         4.78097E+00         1.00000E+00         5.78284E-05         4.78097E+00         1.69193E-01         4.61177E+00
+          1.66666E-02         1.53080E-02        -1.57057E-02         1.04707E+00         1.18115E+00         1.04719E+00         4.66472E+00         1.00000E+00         5.86628E-05         4.66472E+00         1.09779E-01         4.55494E+00
+          1.66666E-02         1.54778E-02        -1.58699E-02         1.04707E+00         1.19182E+00         1.04719E+00         4.57207E+00         1.00000E+00         5.95099E-05         4.57207E+00         6.73534E-02         4.50472E+00
+          1.66666E-02         1.56476E-02        -1.60360E-02         1.04707E+00         1.20249E+00         1.04719E+00         4.50167E+00         1.00000E+00         6.03700E-05         4.50167E+00         4.10385E-02         4.46064E+00
+          1.66666E-02         1.58175E-02        -1.62038E-02         1.04706E+00         1.21317E+00         1.04719E+00         4.45219E+00         1.00000E+00         6.12431E-05         4.45219E+00         2.99464E-02         4.42224E+00
+          1.66666E-02         1.59873E-02        -1.63735E-02         1.04706E+00         1.22384E+00         1.04719E+00         4.42231E+00         1.00000E+00         6.21295E-05         4.42231E+00         3.31823E-02         4.38913E+00
+          1.66666E-02         1.61571E-02        -1.65450E-02         1.04706E+00         1.23451E+00         1.04719E+00         4.41077E+00         1.00000E+00         6.30292E-05         4.41077E+00         4.98464E-02         4.36092E+00
+          1.66666E-02         1.63270E-02        -1.67183E-02         1.04705E+00         1.24518E+00         1.04719E+00         4.41632E+00         1.00000E+00         6.39424E-05         4.41632E+00         7.90374E-02         4.33728E+00
+          1.66666E-02         1.64968E-02        -1.68935E-02         1.04705E+00         1.25585E+00         1.04719E+00         4.43776E+00         1.00000E+00         6.48693E-05         4.43776E+00         1.19855E-01         4.31790E+00
+          1.66666E-02         1.66666E-02        -1.70704E-02         1.04705E+00         1.26652E+00         1.04719E+00         4.47390E+00         1.00000E+00         6.58100E-05         4.47390E+00         1.71400E-01         4.30250E+00
+          1.66666E-02         1.68364E-02        -1.72491E-02         1.04705E+00         1.27719E+00         1.04719E+00         4.52361E+00         1.00000E+00         6.67646E-05         4.52361E+00         2.32783E-01         4.29083E+00
+          1.66666E-02         1.70063E-02        -1.74297E-02         1.04704E+00         1.28786E+00         1.04719E+00         4.58576E+00         1.00000E+00         6.77331E-05         4.58576E+00         3.03119E-01         4.28264E+00
+          1.66666E-02         1.71761E-02        -1.76121E-02         1.04704E+00         1.29853E+00         1.04719E+00         4.65928E+00         1.00000E+00         6.87157E-05         4.65928E+00         3.81536E-01         4.27774E+00
+          1.66666E-02         1.73459E-02        -1.77963E-02         1.04704E+00         1.30920E+00         1.04719E+00         4.74311E+00         1.00000E+00         6.97124E-05         4.74311E+00         4.67172E-01         4.27594E+00
+          1.66666E-02         1.75158E-02        -1.79823E-02         1.04703E+00         1.31987E+00         1.04719E+00         4.83623E+00         1.00000E+00         7.07231E-05         4.83623E+00         5.59183E-01         4.27705E+00
+          1.66666E-02         1.76856E-02        -1.81701E-02         1.04703E+00         1.33054E+00         1.04719E+00         4.93766E+00         1.00000E+00         7.17480E-05         4.93766E+00         6.56740E-01         4.28092E+00
+          1.66666E-02         1.78554E-02        -1.83597E-02         1.04703E+00         1.34121E+00         1.04719E+00         5.04644E+00         1.00000E+00         7.27868E-05         5.04644E+00         7.59034E-01         4.28740E+00
+          1.66666E-02         1.80252E-02        -1.85511E-02         1.04702E+00         1.35188E+00         1.04719E+00         5.16163E+00         1.00000E+00         7.38394E-05         5.16163E+00         8.65276E-01         4.29635E+00
+          1.66666E-02         1.81951E-02        -1.87444E-02         1.04702E+00         1.36255E+00         1.04719E+00         5.28234E+00         1.00000E+00         7.49058E-05         5.28234E+00         9.74701E-01         4.30764E+00
+          1.66666E-02         1.83649E-02        -1.89394E-02         1.04702E+00         1.37322E+00         1.04719E+00         5.40771E+00         1.00000E+00         7.59858E-05         5.40771E+00         1.08657E+00         4.32115E+00
+          1.66666E-02         1.85347E-02        -1.91363E-02         1.04701E+00         1.38389E+00         1.04719E+00         5.53690E+00         1.00000E+00         7.70789E-05         5.53690E+00         1.20016E+00         4.33675E+00
+          1.66666E-02         1.87045E-02        -1.93350E-02         1.04701E+00         1.39457E+00         1.04719E+00         5.66910E+00         1.00000E+00         7.81851E-05         5.66910E+00         1.31478E+00         4.35432E+00
+          1.66666E-02         1.88744E-02        -1.95355E-02         1.04701E+00         1.40524E+00         1.04719E+00         5.80354E+00         1.00000E+00         7.93039E-05         5.80354E+00         1.42978E+00         4.37375E+00
+          1.66666E-02         1.90442E-02        -1.97378E-02         1.04700E+00         1.41591E+00         1.04719E+00         5.93946E+00         1.00000E+00         8.04350E-05         5.93946E+00         1.54453E+00         4.39493E+00
+          1.66666E-02         1.92140E-02        -1.99420E-02         1.04700E+00         1.42658E+00         1.04719E+00         6.07614E+00         1.00000E+00         8.15779E-05         6.07614E+00         1.65842E+00         4.41772E+00
+          1.66666E-02         1.93839E-02        -2.01479E-02         1.04700E+00         1.43725E+00         1.04719E+00         6.21289E+00         1.00000E+00         8.27322E-05         6.21289E+00         1.77088E+00         4.44201E+00
+          1.66666E-02         1.95537E-02        -2.03556E-02         1.04699E+00         1.44792E+00         1.04719E+00         6.34906E+00         1.00000E+00         8.38973E-05         6.34906E+00         1.88139E+00         4.46767E+00
+          1.66666E-02         1.97235E-02        -2.05652E-02         1.04699E+00         1.45859E+00         1.04719E+00         6.48400E+00         1.00000E+00         8.50728E-05         6.48400E+00         1.98942E+00         4.49457E+00
+          1.66666E-02         1.98933E-02        -2.07766E-02         1.04699E+00         1.46926E+00         1.04719E+00         6.61710E+00         1.00000E+00         8.62580E-05         6.61710E+00         2.09452E+00         4.52258E+00
+          1.66666E-02         2.00632E-02        -2.09898E-02         1.04698E+00         1.47993E+00         1.04719E+00         6.74780E+00         1.00000E+00         8.74524E-05         6.74780E+00         2.19625E+00         4.55155E+00
+          1.66666E-02         2.02330E-02        -2.12048E-02         1.04698E+00         1.49060E+00         1.04719E+00         6.87553E+00         1.00000E+00         8.86553E-05         6.87553E+00         2.29420E+00         4.58133E+00
+          1.66666E-02         2.04028E-02        -2.14216E-02         1.04698E+00         1.50127E+00         1.04720E+00         6.99977E+00         1.00000E+00         8.98662E-05         6.99977E+00         2.38800E+00         4.61177E+00
+          1.66666E-02         2.05726E-02        -2.16402E-02         1.04697E+00         1.51194E+00         1.04720E+00         7.12003E+00         1.00000E+00         9.10844E-05         7.12003E+00         2.47732E+00         4.64271E+00
+          1.66666E-02         2.07425E-02        -2.18607E-02         1.04697E+00         1.52261E+00         1.04720E+00         7.23583E+00         1.00000E+00         9.23093E-05         7.23583E+00         2.56185E+00         4.67398E+00
+          1.66666E-02         2.09123E-02        -2.20829E-02         1.04697E+00         1.53328E+00         1.04720E+00         7.34674E+00         1.00000E+00         9.35402E-05         7.34674E+00         2.64133E+00         4.70541E+00
+          1.66666E-02         2.10821E-02        -2.23070E-02         1.04696E+00         1.54395E+00         1.04720E+00         7.45233E+00         1.00000E+00         9.47765E-05         7.45233E+00         2.71551E+00         4.73682E+00
+          1.66666E-02         2.12520E-02        -2.25329E-02         1.04696E+00         1.55462E+00         1.04720E+00         7.55223E+00         1.00000E+00         9.60176E-05         7.55223E+00         2.78421E+00         4.76801E+00
+          1.66666E-02         2.14218E-02        -2.27606E-02         1.04695E+00         1.56529E+00         1.04720E+00         7.64606E+00         1.00000E+00         9.72630E-05         7.64606E+00         2.84725E+00         4.79881E+00
+          1.66666E-02         2.15916E-02        -2.29901E-02         1.04695E+00         1.57596E+00         1.04720E+00         7.73350E+00         1.00000E+00         9.85120E-05         7.73350E+00         2.90448E+00         4.82902E+00
+          1.66666E-02         2.17614E-02        -2.32214E-02         1.04695E+00         1.58664E+00         1.04720E+00         7.81424E+00         1.00000E+00         9.97642E-05         7.81424E+00         2.95580E+00         4.85845E+00
+          1.66666E-02         2.19313E-02        -2.34546E-02         1.04694E+00         1.59731E+00         1.04721E+00         7.88801E+00         1.00000E+00         1.01019E-04         7.88801E+00         3.00113E+00         4.88688E+00
+          1.66666E-02         2.21011E-02        -2.36895E-02         1.04694E+00         1.60798E+00         1.04721E+00         7.95454E+00         1.00000E+00         1.02276E-04         7.95454E+00         3.04042E+00         4.91412E+00
+          1.66666E-02         2.22709E-02        -2.39263E-02         1.04693E+00         1.61865E+00         1.04721E+00         8.01362E+00         1.00000E+00         1.03535E-04         8.01362E+00         3.07365E+00         4.93997E+00
+          1.66666E-02         2.24407E-02        -2.41649E-02         1.04693E+00         1.62932E+00         1.04721E+00         8.06504E+00         1.00000E+00         1.04795E-04         8.06504E+00         3.10082E+00         4.96422E+00
+          1.66666E-02         2.26106E-02        -2.44052E-02         1.04693E+00         1.63999E+00         1.04721E+00         8.10863E+00         1.00000E+00         1.06057E-04         8.10863E+00         3.12196E+00         4.98667E+00
+          1.66666E-02         2.27804E-02        -2.46474E-02         1.04692E+00         1.65066E+00         1.04721E+00         8.14426E+00         1.00000E+00         1.07319E-04         8.14426E+00         3.13713E+00         5.00713E+00
+          1.66666E-02         2.29502E-02        -2.48915E-02         1.04692E+00         1.66133E+00         1.04721E+00         8.17179E+00         1.00000E+00         1.08582E-04         8.17179E+00         3.14640E+00         5.02539E+00
+          1.66666E-02         2.31201E-02        -2.51373E-02         1.04691E+00         1.67200E+00         1.04722E+00         8.19115E+00         1.00000E+00         1.09846E-04         8.19115E+00         3.14988E+00         5.04127E+00
+          1.66666E-02         2.32899E-02        -2.53849E-02         1.04691E+00         1.68267E+00         1.04722E+00         8.20226E+00         1.00000E+00         1.11110E-04         8.20226E+00         3.14768E+00         5.05457E+00
+          1.66666E-02         2.34597E-02        -2.56344E-02         1.04691E+00         1.69334E+00         1.04722E+00         8.20508E+00         1.00000E+00         1.12374E-04         8.20508E+00         3.13995E+00         5.06513E+00
+          1.66666E-02         2.36295E-02        -2.58857E-02         1.04690E+00         1.70401E+00         1.04722E+00         8.19960E+00         1.00000E+00         1.13640E-04         8.19960E+00         3.12683E+00         5.07277E+00
+          1.66666E-02         2.37994E-02        -2.61387E-02         1.04690E+00         1.71468E+00         1.04722E+00         8.18584E+00         1.00000E+00         1.14905E-04         8.18584E+00         3.10851E+00         5.07732E+00
+          1.66666E-02         2.39692E-02        -2.63936E-02         1.04689E+00         1.72535E+00         1.04723E+00         8.16382E+00         1.00000E+00         1.16171E-04         8.16382E+00         3.08517E+00         5.07864E+00
+          1.66666E-02         2.41390E-02        -2.66503E-02         1.04689E+00         1.73602E+00         1.04723E+00         8.13361E+00         1.00000E+00         1.17438E-04         8.13361E+00         3.05702E+00         5.07659E+00
+          1.66666E-02         2.43088E-02        -2.69089E-02         1.04688E+00         1.74669E+00         1.04723E+00         8.09530E+00         1.00000E+00         1.18706E-04         8.09530E+00         3.02427E+00         5.07103E+00
+          1.66666E-02         2.44787E-02        -2.71692E-02         1.04688E+00         1.75736E+00         1.04723E+00         8.04899E+00         1.00000E+00         1.19975E-04         8.04899E+00         2.98715E+00         5.06185E+00
+          1.66666E-02         2.46485E-02        -2.74314E-02         1.04688E+00         1.76804E+00         1.04724E+00         7.99482E+00         1.00000E+00         1.21246E-04         7.99482E+00         2.94588E+00         5.04894E+00
+          1.66666E-02         2.48183E-02        -2.76953E-02         1.04687E+00         1.77871E+00         1.04724E+00         7.93294E+00         1.00000E+00         1.22517E-04         7.93294E+00         2.90072E+00         5.03222E+00
+          1.66666E-02         2.49882E-02        -2.79611E-02         1.04687E+00         1.78938E+00         1.04724E+00         7.86353E+00         1.00000E+00         1.23791E-04         7.86353E+00         2.85192E+00         5.01161E+00
+          1.66666E-02         2.51580E-02        -2.82287E-02         1.04686E+00         1.80005E+00         1.04724E+00         7.78679E+00         1.00000E+00         1.25066E-04         7.78679E+00         2.79972E+00         4.98706E+00
+          1.66666E-02         2.53278E-02        -2.84981E-02         1.04686E+00         1.81072E+00         1.04725E+00         7.70292E+00         1.00000E+00         1.26344E-04         7.70292E+00         2.74439E+00         4.95853E+00
+          1.66666E-02         2.54976E-02        -2.87693E-02         1.04685E+00         1.82139E+00         1.04725E+00         7.61218E+00         1.00000E+00         1.27624E-04         7.61218E+00         2.68620E+00         4.92598E+00
+          1.66666E-02         2.56675E-02        -2.90423E-02         1.04685E+00         1.83206E+00         1.04725E+00         7.51481E+00         1.00000E+00         1.28906E-04         7.51481E+00         2.62540E+00         4.88942E+00
+          1.66666E-02         2.58373E-02        -2.93172E-02         1.04684E+00         1.84273E+00         1.04726E+00         7.41109E+00         1.00000E+00         1.30190E-04         7.41109E+00         2.56225E+00         4.84884E+00
+          1.66666E-02         2.60071E-02        -2.95938E-02         1.04684E+00         1.85340E+00         1.04726E+00         7.30132E+00         1.00000E+00         1.31477E-04         7.30132E+00         2.49704E+00         4.80428E+00
+          1.66666E-02         2.61769E-02        -2.98723E-02         1.04684E+00         1.86407E+00         1.04726E+00         7.18578E+00         1.00000E+00         1.32767E-04         7.18578E+00         2.43001E+00         4.75578E+00
+          1.68364E-02         8.72665E-04        -8.54710E-03         1.05786E+00         2.74155E-01         1.05790E+00         1.85132E+02         1.00000E+00         2.57527E-05         1.85132E+02         6.58811E+01         1.19251E+02
+          1.68364E-02         1.04249E-03        -8.55731E-03         1.05786E+00         2.84826E-01         1.05790E+00         1.82014E+02         1.00000E+00         2.56662E-05         1.82014E+02         6.51745E+01         1.16840E+02
+          1.68364E-02         1.21232E-03        -8.56934E-03         1.05786E+00         2.95496E-01         1.05790E+00         1.78830E+02         1.00000E+00         2.55796E-05         1.78830E+02         6.44440E+01         1.14386E+02
+          1.68364E-02         1.38215E-03        -8.58318E-03         1.05786E+00         3.06167E-01         1.05790E+00         1.75584E+02         1.00000E+00         2.54932E-05         1.75584E+02         6.36900E+01         1.11894E+02
+          1.68364E-02         1.55197E-03        -8.59884E-03         1.05786E+00         3.16838E-01         1.05790E+00         1.72281E+02         1.00000E+00         2.54073E-05         1.72281E+02         6.29130E+01         1.09368E+02
+          1.68364E-02         1.72180E-03        -8.61630E-03         1.05786E+00         3.27508E-01         1.05790E+00         1.68926E+02         1.00000E+00         2.53222E-05         1.68926E+02         6.21135E+01         1.06813E+02
+          1.68364E-02         1.89163E-03        -8.63558E-03         1.05786E+00         3.38179E-01         1.05790E+00         1.65525E+02         1.00000E+00         2.52382E-05         1.65525E+02         6.12920E+01         1.04233E+02
+          1.68364E-02         2.06146E-03        -8.65666E-03         1.05786E+00         3.48849E-01         1.05790E+00         1.62081E+02         1.00000E+00         2.51557E-05         1.62081E+02         6.04491E+01         1.01632E+02
+          1.68364E-02         2.23128E-03        -8.67956E-03         1.05786E+00         3.59520E-01         1.05790E+00         1.58602E+02         1.00000E+00         2.50749E-05         1.58602E+02         5.95853E+01         9.90165E+01
+          1.68364E-02         2.40111E-03        -8.70427E-03         1.05786E+00         3.70190E-01         1.05790E+00         1.55091E+02         1.00000E+00         2.49961E-05         1.55091E+02         5.87013E+01         9.63893E+01
+          1.68364E-02         2.57094E-03        -8.73080E-03         1.05786E+00         3.80861E-01         1.05790E+00         1.51553E+02         1.00000E+00         2.49197E-05         1.51553E+02         5.77977E+01         9.37552E+01
+          1.68364E-02         2.74077E-03        -8.75913E-03         1.05786E+00         3.91532E-01         1.05790E+00         1.47994E+02         1.00000E+00         2.48460E-05         1.47994E+02         5.68752E+01         9.11184E+01
+          1.68364E-02         2.91059E-03        -8.78928E-03         1.05786E+00         4.02202E-01         1.05790E+00         1.44418E+02         1.00000E+00         2.47753E-05         1.44418E+02         5.59346E+01         8.84833E+01
+          1.68364E-02         3.08042E-03        -8.82124E-03         1.05786E+00         4.12873E-01         1.05790E+00         1.40830E+02         1.00000E+00         2.47080E-05         1.40830E+02         5.49765E+01         8.58537E+01
+          1.68364E-02         3.25025E-03        -8.85501E-03         1.05786E+00         4.23543E-01         1.05790E+00         1.37236E+02         1.00000E+00         2.46443E-05         1.37236E+02         5.40017E+01         8.32339E+01
+          1.68364E-02         3.42008E-03        -8.89060E-03         1.05786E+00         4.34214E-01         1.05790E+00         1.33639E+02         1.00000E+00         2.45847E-05         1.33639E+02         5.30112E+01         8.06275E+01
+          1.68364E-02         3.58990E-03        -8.92799E-03         1.05786E+00         4.44884E-01         1.05790E+00         1.30044E+02         1.00000E+00         2.45293E-05         1.30044E+02         5.20056E+01         7.80385E+01
+          1.68364E-02         3.75973E-03        -8.96720E-03         1.05786E+00         4.55555E-01         1.05790E+00         1.26456E+02         1.00000E+00         2.44786E-05         1.26456E+02         5.09859E+01         7.54703E+01
+          1.68364E-02         3.92956E-03        -9.00822E-03         1.05786E+00         4.66225E-01         1.05789E+00         1.22879E+02         1.00000E+00         2.44330E-05         1.22879E+02         4.99530E+01         7.29265E+01
+          1.68364E-02         4.09939E-03        -9.05105E-03         1.05786E+00         4.76896E-01         1.05789E+00         1.19318E+02         1.00000E+00         2.43926E-05         1.19318E+02         4.89078E+01         7.04104E+01
+          1.68364E-02         4.26921E-03        -9.09569E-03         1.05786E+00         4.87567E-01         1.05789E+00         1.15776E+02         1.00000E+00         2.43579E-05         1.15776E+02         4.78512E+01         6.79252E+01
+          1.68364E-02         4.43904E-03        -9.14215E-03         1.05785E+00         4.98237E-01         1.05789E+00         1.12258E+02         1.00000E+00         2.43293E-05         1.12258E+02         4.67843E+01         6.54740E+01
+          1.68364E-02         4.60887E-03        -9.19041E-03         1.05785E+00         5.08908E-01         1.05789E+00         1.08767E+02         1.00000E+00         2.43069E-05         1.08767E+02         4.57080E+01         6.30594E+01
+          1.68364E-02         4.77869E-03        -9.24049E-03         1.05785E+00         5.19578E-01         1.05789E+00         1.05308E+02         1.00000E+00         2.42913E-05         1.05308E+02         4.46234E+01         6.06843E+01
+          1.68364E-02         4.94852E-03        -9.29238E-03         1.05785E+00         5.30249E-01         1.05789E+00         1.01883E+02         1.00000E+00         2.42827E-05         1.01883E+02         4.35316E+01         5.83512E+01
+          1.68364E-02         5.11835E-03        -9.34608E-03         1.05785E+00         5.40919E-01         1.05789E+00         9.84958E+01         1.00000E+00         2.42814E-05         9.84958E+01         4.24335E+01         5.60623E+01
+          1.68364E-02         5.28818E-03        -9.40160E-03         1.05785E+00         5.51590E-01         1.05789E+00         9.51502E+01         1.00000E+00         2.42879E-05         9.51502E+01         4.13303E+01         5.38199E+01
+          1.68364E-02         5.45800E-03        -9.45893E-03         1.05785E+00         5.62261E-01         1.05789E+00         9.18490E+01         1.00000E+00         2.43024E-05         9.18490E+01         4.02231E+01         5.16259E+01
+          1.68364E-02         5.62783E-03        -9.51806E-03         1.05785E+00         5.72931E-01         1.05789E+00         8.85952E+01         1.00000E+00         2.43253E-05         8.85952E+01         3.91130E+01         4.94821E+01
+          1.68364E-02         5.79766E-03        -9.57902E-03         1.05785E+00         5.83602E-01         1.05789E+00         8.53914E+01         1.00000E+00         2.43568E-05         8.53914E+01         3.80012E+01         4.73902E+01
+          1.68364E-02         5.96749E-03        -9.64178E-03         1.05785E+00         5.94272E-01         1.05789E+00         8.22403E+01         1.00000E+00         2.43974E-05         8.22403E+01         3.68887E+01         4.53516E+01
+          1.68364E-02         6.13731E-03        -9.70635E-03         1.05784E+00         6.04943E-01         1.05789E+00         7.91443E+01         1.00000E+00         2.44473E-05         7.91443E+01         3.57767E+01         4.33675E+01
+          1.68364E-02         6.30714E-03        -9.77274E-03         1.05784E+00         6.15613E-01         1.05789E+00         7.61055E+01         1.00000E+00         2.45068E-05         7.61055E+01         3.46664E+01         4.14391E+01
+          1.68364E-02         6.47697E-03        -9.84094E-03         1.05784E+00         6.26284E-01         1.05789E+00         7.31262E+01         1.00000E+00         2.45763E-05         7.31262E+01         3.35589E+01         3.95673E+01
+          1.68364E-02         6.64680E-03        -9.91095E-03         1.05784E+00         6.36955E-01         1.05789E+00         7.02081E+01         1.00000E+00         2.46561E-05         7.02081E+01         3.24554E+01         3.77528E+01
+          1.68364E-02         6.81662E-03        -9.98277E-03         1.05784E+00         6.47625E-01         1.05789E+00         6.73530E+01         1.00000E+00         2.47463E-05         6.73530E+01         3.13569E+01         3.59961E+01
+          1.68364E-02         6.98645E-03        -1.00564E-02         1.05784E+00         6.58296E-01         1.05789E+00         6.45625E+01         1.00000E+00         2.48473E-05         6.45625E+01         3.02648E+01         3.42977E+01
+          1.68364E-02         7.15628E-03        -1.01319E-02         1.05784E+00         6.68966E-01         1.05789E+00         6.18378E+01         1.00000E+00         2.49593E-05         6.18378E+01         2.91800E+01         3.26579E+01
+          1.68364E-02         7.32611E-03        -1.02091E-02         1.05784E+00         6.79637E-01         1.05789E+00         5.91803E+01         1.00000E+00         2.50827E-05         5.91803E+01         2.81037E+01         3.10767E+01
+          1.68364E-02         7.49593E-03        -1.02882E-02         1.05784E+00         6.90307E-01         1.05789E+00         5.65910E+01         1.00000E+00         2.52174E-05         5.65910E+01         2.70370E+01         2.95541E+01
+          1.68364E-02         7.66576E-03        -1.03691E-02         1.05783E+00         7.00978E-01         1.05788E+00         5.40708E+01         1.00000E+00         2.53639E-05         5.40708E+01         2.59810E+01         2.80899E+01
+          1.68364E-02         7.83559E-03        -1.04518E-02         1.05783E+00         7.11649E-01         1.05788E+00         5.16204E+01         1.00000E+00         2.55223E-05         5.16204E+01         2.49368E+01         2.66837E+01
+          1.68364E-02         8.00542E-03        -1.05363E-02         1.05783E+00         7.22319E-01         1.05788E+00         4.92404E+01         1.00000E+00         2.56927E-05         4.92404E+01         2.39054E+01         2.53351E+01
+          1.68364E-02         8.17524E-03        -1.06226E-02         1.05783E+00         7.32990E-01         1.05788E+00         4.69313E+01         1.00000E+00         2.58752E-05         4.69313E+01         2.28878E+01         2.40435E+01
+          1.68364E-02         8.34507E-03        -1.07107E-02         1.05783E+00         7.43660E-01         1.05788E+00         4.46933E+01         1.00000E+00         2.60701E-05         4.46933E+01         2.18851E+01         2.28081E+01
+          1.68364E-02         8.51490E-03        -1.08007E-02         1.05783E+00         7.54331E-01         1.05788E+00         4.25265E+01         1.00000E+00         2.62774E-05         4.25265E+01         2.08982E+01         2.16283E+01
+          1.68364E-02         8.68473E-03        -1.08924E-02         1.05782E+00         7.65001E-01         1.05788E+00         4.04310E+01         1.00000E+00         2.64972E-05         4.04310E+01         1.99281E+01         2.05029E+01
+          1.68364E-02         8.85455E-03        -1.09860E-02         1.05782E+00         7.75672E-01         1.05788E+00         3.84068E+01         1.00000E+00         2.67295E-05         3.84068E+01         1.89757E+01         1.94311E+01
+          1.68364E-02         9.02438E-03        -1.10814E-02         1.05782E+00         7.86343E-01         1.05788E+00         3.64534E+01         1.00000E+00         2.69744E-05         3.64534E+01         1.80417E+01         1.84117E+01
+          1.68364E-02         9.19421E-03        -1.11786E-02         1.05782E+00         7.97013E-01         1.05788E+00         3.45706E+01         1.00000E+00         2.72319E-05         3.45706E+01         1.71271E+01         1.74435E+01
+          1.68364E-02         9.36403E-03        -1.12776E-02         1.05782E+00         8.07684E-01         1.05788E+00         3.27579E+01         1.00000E+00         2.75019E-05         3.27579E+01         1.62327E+01         1.65252E+01
+          1.68364E-02         9.53386E-03        -1.13784E-02         1.05782E+00         8.18354E-01         1.05788E+00         3.10148E+01         1.00000E+00         2.77845E-05         3.10148E+01         1.53592E+01         1.56556E+01
+          1.68364E-02         9.70369E-03        -1.14810E-02         1.05781E+00         8.29025E-01         1.05788E+00         2.93404E+01         1.00000E+00         2.80797E-05         2.93404E+01         1.45073E+01         1.48332E+01
+          1.68364E-02         9.87352E-03        -1.15854E-02         1.05781E+00         8.39695E-01         1.05788E+00         2.77342E+01         1.00000E+00         2.83872E-05         2.77342E+01         1.36776E+01         1.40565E+01
+          1.68364E-02         1.00433E-02        -1.16917E-02         1.05781E+00         8.50366E-01         1.05788E+00         2.61951E+01         1.00000E+00         2.87071E-05         2.61951E+01         1.28708E+01         1.33242E+01
+          1.68364E-02         1.02132E-02        -1.17998E-02         1.05781E+00         8.61037E-01         1.05788E+00         2.47222E+01         1.00000E+00         2.90392E-05         2.47222E+01         1.20875E+01         1.26347E+01
+          1.68364E-02         1.03830E-02        -1.19096E-02         1.05781E+00         8.71707E-01         1.05787E+00         2.33145E+01         1.00000E+00         2.93835E-05         2.33145E+01         1.13281E+01         1.19864E+01
+          1.68364E-02         1.05528E-02        -1.20213E-02         1.05781E+00         8.82378E-01         1.05787E+00         2.19709E+01         1.00000E+00         2.97397E-05         2.19709E+01         1.05931E+01         1.13778E+01
+          1.68364E-02         1.07227E-02        -1.21348E-02         1.05780E+00         8.93048E-01         1.05787E+00         2.06902E+01         1.00000E+00         3.01078E-05         2.06902E+01         9.88289E+00         1.08073E+01
+          1.68364E-02         1.08925E-02        -1.22501E-02         1.05780E+00         9.03719E-01         1.05787E+00         1.94712E+01         1.00000E+00         3.04876E-05         1.94712E+01         9.19790E+00         1.02733E+01
+          1.68364E-02         1.10623E-02        -1.23673E-02         1.05780E+00         9.14389E-01         1.05787E+00         1.83126E+01         1.00000E+00         3.08789E-05         1.83126E+01         8.53839E+00         9.77425E+00
+          1.68364E-02         1.12321E-02        -1.24862E-02         1.05780E+00         9.25060E-01         1.05787E+00         1.72131E+01         1.00000E+00         3.12816E-05         1.72131E+01         7.90461E+00         9.30848E+00
+          1.68364E-02         1.14020E-02        -1.26070E-02         1.05780E+00         9.35731E-01         1.05787E+00         1.61712E+01         1.00000E+00         3.16955E-05         1.61712E+01         7.29677E+00         8.87445E+00
+          1.68364E-02         1.15718E-02        -1.27295E-02         1.05779E+00         9.46401E-01         1.05787E+00         1.51856E+01         1.00000E+00         3.21204E-05         1.51856E+01         6.71500E+00         8.47061E+00
+          1.68364E-02         1.17416E-02        -1.28539E-02         1.05779E+00         9.57072E-01         1.05787E+00         1.42548E+01         1.00000E+00         3.25562E-05         1.42548E+01         6.15941E+00         8.09540E+00
+          1.68364E-02         1.19114E-02        -1.29801E-02         1.05779E+00         9.67742E-01         1.05787E+00         1.33773E+01         1.00000E+00         3.30027E-05         1.33773E+01         5.63001E+00         7.74731E+00
+          1.68364E-02         1.20813E-02        -1.31081E-02         1.05779E+00         9.78413E-01         1.05787E+00         1.25517E+01         1.00000E+00         3.34597E-05         1.25517E+01         5.12681E+00         7.42485E+00
+          1.68364E-02         1.22511E-02        -1.32379E-02         1.05779E+00         9.89083E-01         1.05787E+00         1.17763E+01         1.00000E+00         3.39271E-05         1.17763E+01         4.64972E+00         7.12657E+00
+          1.68364E-02         1.24209E-02        -1.33695E-02         1.05778E+00         9.99754E-01         1.05787E+00         1.10497E+01         1.00000E+00         3.44047E-05         1.10497E+01         4.19863E+00         6.85105E+00
+          1.68364E-02         1.25908E-02        -1.35029E-02         1.05778E+00         1.01042E+00         1.05787E+00         1.03703E+01         1.00000E+00         3.48925E-05         1.03703E+01         3.77336E+00         6.59690E+00
+          1.68364E-02         1.27606E-02        -1.36382E-02         1.05778E+00         1.02110E+00         1.05787E+00         9.73650E+00         1.00000E+00         3.53903E-05         9.73650E+00         3.37369E+00         6.36281E+00
+          1.68364E-02         1.29304E-02        -1.37753E-02         1.05778E+00         1.03177E+00         1.05787E+00         9.14684E+00         1.00000E+00         3.58980E-05         9.14684E+00         2.99936E+00         6.14748E+00
+          1.68364E-02         1.31002E-02        -1.39141E-02         1.05777E+00         1.04244E+00         1.05787E+00         8.59972E+00         1.00000E+00         3.64155E-05         8.59972E+00         2.65004E+00         5.94968E+00
+          1.68364E-02         1.32701E-02        -1.40548E-02         1.05777E+00         1.05311E+00         1.05787E+00         8.09359E+00         1.00000E+00         3.69428E-05         8.09359E+00         2.32537E+00         5.76822E+00
+          1.68364E-02         1.34399E-02        -1.41973E-02         1.05777E+00         1.06378E+00         1.05786E+00         7.62690E+00         1.00000E+00         3.74799E-05         7.62690E+00         2.02494E+00         5.60197E+00
+          1.68364E-02         1.36097E-02        -1.43416E-02         1.05777E+00         1.07445E+00         1.05786E+00         7.19813E+00         1.00000E+00         3.80267E-05         7.19813E+00         1.74829E+00         5.44984E+00
+          1.68364E-02         1.37795E-02        -1.44877E-02         1.05776E+00         1.08512E+00         1.05786E+00         6.80576E+00         1.00000E+00         3.85832E-05         6.80576E+00         1.49494E+00         5.31081E+00
+          1.68364E-02         1.39494E-02        -1.46357E-02         1.05776E+00         1.09579E+00         1.05786E+00         6.44827E+00         1.00000E+00         3.91494E-05         6.44827E+00         1.26436E+00         5.18391E+00
+          1.68364E-02         1.41192E-02        -1.47854E-02         1.05776E+00         1.10646E+00         1.05786E+00         6.12419E+00         1.00000E+00         3.97254E-05         6.12419E+00         1.05597E+00         5.06822E+00
+          1.68364E-02         1.42890E-02        -1.49370E-02         1.05776E+00         1.11713E+00         1.05786E+00         5.83206E+00         1.00000E+00         4.03113E-05         5.83206E+00         8.69174E-01         4.96288E+00
+          1.68364E-02         1.44589E-02        -1.50904E-02         1.05775E+00         1.12780E+00         1.05786E+00         5.57042E+00         1.00000E+00         4.09071E-05         5.57042E+00         7.03335E-01         4.86708E+00
+          1.68364E-02         1.46287E-02        -1.52455E-02         1.05775E+00         1.13847E+00         1.05786E+00         5.33786E+00         1.00000E+00         4.15130E-05         5.33786E+00         5.57789E-01         4.78007E+00
+          1.68364E-02         1.47985E-02        -1.54025E-02         1.05775E+00         1.14914E+00         1.05786E+00         5.13299E+00         1.00000E+00         4.21290E-05         5.13299E+00         4.31841E-01         4.70115E+00
+          1.68364E-02         1.49683E-02        -1.55613E-02         1.05775E+00         1.15981E+00         1.05786E+00         4.95444E+00         1.00000E+00         4.27553E-05         4.95444E+00         3.24772E-01         4.62967E+00
+          1.68364E-02         1.51382E-02        -1.57220E-02         1.05774E+00         1.17048E+00         1.05786E+00         4.80086E+00         1.00000E+00         4.33920E-05         4.80086E+00         2.35840E-01         4.56502E+00
+          1.68364E-02         1.53080E-02        -1.58844E-02         1.05774E+00         1.18115E+00         1.05786E+00         4.67096E+00         1.00000E+00         4.40393E-05         4.67096E+00         1.64283E-01         4.50667E+00
+          1.68364E-02         1.54778E-02        -1.60487E-02         1.05774E+00         1.19182E+00         1.05786E+00         4.56343E+00         1.00000E+00         4.46973E-05         4.56343E+00         1.09321E-01         4.45411E+00
+          1.68364E-02         1.56476E-02        -1.62147E-02         1.05774E+00         1.20249E+00         1.05786E+00         4.47704E+00         1.00000E+00         4.53662E-05         4.47704E+00         7.01588E-02         4.40688E+00
+          1.68364E-02         1.58175E-02        -1.63826E-02         1.05773E+00         1.21317E+00         1.05786E+00         4.41055E+00         1.00000E+00         4.60463E-05         4.41055E+00         4.59868E-02         4.36456E+00
+          1.68364E-02         1.59873E-02        -1.65523E-02         1.05773E+00         1.22384E+00         1.05786E+00         4.36277E+00         1.00000E+00         4.67375E-05         4.36277E+00         3.59869E-02         4.32679E+00
+          1.68364E-02         1.61571E-02        -1.67238E-02         1.05773E+00         1.23451E+00         1.05786E+00         4.33255E+00         1.00000E+00         4.74401E-05         4.33255E+00         3.93326E-02         4.29322E+00
+          1.68364E-02         1.63270E-02        -1.68971E-02         1.05772E+00         1.24518E+00         1.05786E+00         4.31875E+00         1.00000E+00         4.81542E-05         4.31875E+00         5.51923E-02         4.26356E+00
+          1.68364E-02         1.64968E-02        -1.70722E-02         1.05772E+00         1.25585E+00         1.05786E+00         4.32026E+00         1.00000E+00         4.88799E-05         4.32026E+00         8.27320E-02         4.23753E+00
+          1.68364E-02         1.66666E-02        -1.72491E-02         1.05772E+00         1.26652E+00         1.05786E+00         4.33603E+00         1.00000E+00         4.96174E-05         4.33603E+00         1.21117E-01         4.21491E+00
+          1.68364E-02         1.68364E-02        -1.74279E-02         1.05771E+00         1.27719E+00         1.05786E+00         4.36500E+00         1.00000E+00         5.03667E-05         4.36500E+00         1.69515E-01         4.19548E+00
+          1.68364E-02         1.70063E-02        -1.76084E-02         1.05771E+00         1.28786E+00         1.05786E+00         4.40617E+00         1.00000E+00         5.11279E-05         4.40617E+00         2.27099E-01         4.17907E+00
+          1.68364E-02         1.71761E-02        -1.77908E-02         1.05771E+00         1.29853E+00         1.05786E+00         4.45855E+00         1.00000E+00         5.19010E-05         4.45855E+00         2.93047E-01         4.16550E+00
+          1.68364E-02         1.73459E-02        -1.79750E-02         1.05771E+00         1.30920E+00         1.05786E+00         4.52120E+00         1.00000E+00         5.26859E-05         4.52120E+00         3.66549E-01         4.15465E+00
+          1.68364E-02         1.75158E-02        -1.81610E-02         1.05770E+00         1.31987E+00         1.05786E+00         4.59320E+00         1.00000E+00         5.34828E-05         4.59320E+00         4.46802E-01         4.14640E+00
+          1.68364E-02         1.76856E-02        -1.83488E-02         1.05770E+00         1.33054E+00         1.05786E+00         4.67364E+00         1.00000E+00         5.42915E-05         4.67364E+00         5.33021E-01         4.14062E+00
+          1.68364E-02         1.78554E-02        -1.85384E-02         1.05770E+00         1.34121E+00         1.05786E+00         4.76167E+00         1.00000E+00         5.51118E-05         4.76167E+00         6.24434E-01         4.13724E+00
+          1.68364E-02         1.80252E-02        -1.87299E-02         1.05769E+00         1.35188E+00         1.05786E+00         4.85645E+00         1.00000E+00         5.59437E-05         4.85645E+00         7.20284E-01         4.13617E+00
+          1.68364E-02         1.81951E-02        -1.89231E-02         1.05769E+00         1.36255E+00         1.05786E+00         4.95716E+00         1.00000E+00         5.67870E-05         4.95716E+00         8.19838E-01         4.13733E+00
+          1.68364E-02         1.83649E-02        -1.91182E-02         1.05769E+00         1.37322E+00         1.05786E+00         5.06303E+00         1.00000E+00         5.76414E-05         5.06303E+00         9.22379E-01         4.14065E+00
+          1.68364E-02         1.85347E-02        -1.93151E-02         1.05768E+00         1.38389E+00         1.05786E+00         5.17329E+00         1.00000E+00         5.85066E-05         5.17329E+00         1.02721E+00         4.14607E+00
+          1.68364E-02         1.87045E-02        -1.95138E-02         1.05768E+00         1.39457E+00         1.05786E+00         5.28720E+00         1.00000E+00         5.93824E-05         5.28720E+00         1.13368E+00         4.15353E+00
+          1.68364E-02         1.88744E-02        -1.97143E-02         1.05768E+00         1.40524E+00         1.05786E+00         5.40408E+00         1.00000E+00         6.02684E-05         5.40408E+00         1.24112E+00         4.16296E+00
+          1.68364E-02         1.90442E-02        -1.99166E-02         1.05767E+00         1.41591E+00         1.05786E+00         5.52322E+00         1.00000E+00         6.11643E-05         5.52322E+00         1.34892E+00         4.17430E+00
+          1.68364E-02         1.92140E-02        -2.01207E-02         1.05767E+00         1.42658E+00         1.05786E+00         5.64398E+00         1.00000E+00         6.20697E-05         5.64398E+00         1.45650E+00         4.18748E+00
+          1.68364E-02         1.93839E-02        -2.03266E-02         1.05767E+00         1.43725E+00         1.05786E+00         5.76572E+00         1.00000E+00         6.29841E-05         5.76572E+00         1.56328E+00         4.20244E+00
+          1.68364E-02         1.95537E-02        -2.05344E-02         1.05766E+00         1.44792E+00         1.05786E+00         5.88782E+00         1.00000E+00         6.39070E-05         5.88782E+00         1.66874E+00         4.21908E+00
+          1.68364E-02         1.97235E-02        -2.07440E-02         1.05766E+00         1.45859E+00         1.05786E+00         6.00971E+00         1.00000E+00         6.48381E-05         6.00971E+00         1.77237E+00         4.23734E+00
+          1.68364E-02         1.98933E-02        -2.09553E-02         1.05766E+00         1.46926E+00         1.05786E+00         6.13082E+00         1.00000E+00         6.57768E-05         6.13082E+00         1.87370E+00         4.25712E+00
+          1.68364E-02         2.00632E-02        -2.11685E-02         1.05765E+00         1.47993E+00         1.05786E+00         6.25061E+00         1.00000E+00         6.67226E-05         6.25061E+00         1.97229E+00         4.27832E+00
+          1.68364E-02         2.02330E-02        -2.13835E-02         1.05765E+00         1.49060E+00         1.05786E+00         6.36856E+00         1.00000E+00         6.76750E-05         6.36856E+00         2.06772E+00         4.30084E+00
+          1.68364E-02         2.04028E-02        -2.16003E-02         1.05764E+00         1.50127E+00         1.05787E+00         6.48417E+00         1.00000E+00         6.86335E-05         6.48417E+00         2.15961E+00         4.32456E+00
+          1.68364E-02         2.05726E-02        -2.18190E-02         1.05764E+00         1.51194E+00         1.05787E+00         6.59698E+00         1.00000E+00         6.95977E-05         6.59698E+00         2.24763E+00         4.34935E+00
+          1.68364E-02         2.07425E-02        -2.20394E-02         1.05764E+00         1.52261E+00         1.05787E+00         6.70653E+00         1.00000E+00         7.05670E-05         6.70653E+00         2.33144E+00         4.37509E+00
+          1.68364E-02         2.09123E-02        -2.22617E-02         1.05763E+00         1.53328E+00         1.05787E+00         6.81239E+00         1.00000E+00         7.15410E-05         6.81239E+00         2.41077E+00         4.40162E+00
+          1.68364E-02         2.10821E-02        -2.24857E-02         1.05763E+00         1.54395E+00         1.05787E+00         6.91416E+00         1.00000E+00         7.25192E-05         6.91416E+00         2.48537E+00         4.42879E+00
+          1.68364E-02         2.12520E-02        -2.27116E-02         1.05763E+00         1.55462E+00         1.05787E+00         7.01146E+00         1.00000E+00         7.35013E-05         7.01146E+00         2.55500E+00         4.45645E+00
+          1.68364E-02         2.14218E-02        -2.29393E-02         1.05762E+00         1.56529E+00         1.05787E+00         7.10391E+00         1.00000E+00         7.44867E-05         7.10391E+00         2.61949E+00         4.48443E+00
+          1.68364E-02         2.15916E-02        -2.31688E-02         1.05762E+00         1.57596E+00         1.05787E+00         7.19120E+00         1.00000E+00         7.54751E-05         7.19120E+00         2.67866E+00         4.51254E+00
+          1.68364E-02         2.17614E-02        -2.34002E-02         1.05761E+00         1.58664E+00         1.05787E+00         7.27299E+00         1.00000E+00         7.64663E-05         7.27299E+00         2.73239E+00         4.54060E+00
+          1.68364E-02         2.19313E-02        -2.36333E-02         1.05761E+00         1.59731E+00         1.05787E+00         7.34899E+00         1.00000E+00         7.74600E-05         7.34899E+00         2.78056E+00         4.56843E+00
+          1.68364E-02         2.21011E-02        -2.38682E-02         1.05761E+00         1.60798E+00         1.05788E+00         7.41894E+00         1.00000E+00         7.84558E-05         7.41894E+00         2.82312E+00         4.59582E+00
+          1.68364E-02         2.22709E-02        -2.41050E-02         1.05760E+00         1.61865E+00         1.05788E+00         7.48258E+00         1.00000E+00         7.94537E-05         7.48258E+00         2.86000E+00         4.62258E+00
+          1.68364E-02         2.24407E-02        -2.43436E-02         1.05760E+00         1.62932E+00         1.05788E+00         7.53969E+00         1.00000E+00         8.04534E-05         7.53969E+00         2.89119E+00         4.64850E+00
+          1.68364E-02         2.26106E-02        -2.45840E-02         1.05759E+00         1.63999E+00         1.05788E+00         7.59007E+00         1.00000E+00         8.14548E-05         7.59007E+00         2.91668E+00         4.67338E+00
+          1.68364E-02         2.27804E-02        -2.48262E-02         1.05759E+00         1.65066E+00         1.05788E+00         7.63353E+00         1.00000E+00         8.24580E-05         7.63353E+00         2.93652E+00         4.69701E+00
+          1.68364E-02         2.29502E-02        -2.50702E-02         1.05759E+00         1.66133E+00         1.05788E+00         7.66992E+00         1.00000E+00         8.34628E-05         7.66992E+00         2.95073E+00         4.71919E+00
+          1.68364E-02         2.31201E-02        -2.53160E-02         1.05758E+00         1.67200E+00         1.05788E+00         7.69910E+00         1.00000E+00         8.44694E-05         7.69910E+00         2.95940E+00         4.73970E+00
+          1.68364E-02         2.32899E-02        -2.55637E-02         1.05758E+00         1.68267E+00         1.05789E+00         7.72097E+00         1.00000E+00         8.54778E-05         7.72097E+00         2.96263E+00         4.75834E+00
+          1.68364E-02         2.34597E-02        -2.58131E-02         1.05757E+00         1.69334E+00         1.05789E+00         7.73543E+00         1.00000E+00         8.64881E-05         7.73543E+00         2.96051E+00         4.77492E+00
+          1.68364E-02         2.36295E-02        -2.60644E-02         1.05757E+00         1.70401E+00         1.05789E+00         7.74242E+00         1.00000E+00         8.75004E-05         7.74242E+00         2.95318E+00         4.78924E+00
+          1.68364E-02         2.37994E-02        -2.63175E-02         1.05757E+00         1.71468E+00         1.05789E+00         7.74190E+00         1.00000E+00         8.85150E-05         7.74190E+00         2.94080E+00         4.80111E+00
+          1.68364E-02         2.39692E-02        -2.65724E-02         1.05756E+00         1.72535E+00         1.05789E+00         7.73386E+00         1.00000E+00         8.95320E-05         7.73386E+00         2.92351E+00         4.81034E+00
+          1.68364E-02         2.41390E-02        -2.68291E-02         1.05756E+00         1.73602E+00         1.05790E+00         7.71828E+00         1.00000E+00         9.05516E-05         7.71828E+00         2.90151E+00         4.81677E+00
+          1.68364E-02         2.43088E-02        -2.70876E-02         1.05755E+00         1.74669E+00         1.05790E+00         7.69520E+00         1.00000E+00         9.15740E-05         7.69520E+00         2.87496E+00         4.82024E+00
+          1.68364E-02         2.44787E-02        -2.73479E-02         1.05755E+00         1.75736E+00         1.05790E+00         7.66467E+00         1.00000E+00         9.25996E-05         7.66467E+00         2.84409E+00         4.82058E+00
+          1.68364E-02         2.46485E-02        -2.76101E-02         1.05754E+00         1.76804E+00         1.05790E+00         7.62676E+00         1.00000E+00         9.36284E-05         7.62676E+00         2.80910E+00         4.81766E+00
+          1.68364E-02         2.48183E-02        -2.78740E-02         1.05754E+00         1.77871E+00         1.05791E+00         7.58156E+00         1.00000E+00         9.46607E-05         7.58156E+00         2.77021E+00         4.81135E+00
+          1.68364E-02         2.49882E-02        -2.81398E-02         1.05753E+00         1.78938E+00         1.05791E+00         7.52918E+00         1.00000E+00         9.56968E-05         7.52918E+00         2.72765E+00         4.80153E+00
+          1.68364E-02         2.51580E-02        -2.84074E-02         1.05753E+00         1.80005E+00         1.05791E+00         7.46975E+00         1.00000E+00         9.67367E-05         7.46975E+00         2.68166E+00         4.78810E+00
+          1.68364E-02         2.53278E-02        -2.86768E-02         1.05753E+00         1.81072E+00         1.05791E+00         7.40344E+00         1.00000E+00         9.77806E-05         7.40344E+00         2.63246E+00         4.77097E+00
+          1.68364E-02         2.54976E-02        -2.89480E-02         1.05752E+00         1.82139E+00         1.05792E+00         7.33040E+00         1.00000E+00         9.88286E-05         7.33040E+00         2.58032E+00         4.75008E+00
+          1.68364E-02         2.56675E-02        -2.92211E-02         1.05752E+00         1.83206E+00         1.05792E+00         7.25084E+00         1.00000E+00         9.98807E-05         7.25084E+00         2.52547E+00         4.72537E+00
+          1.68364E-02         2.58373E-02        -2.94959E-02         1.05751E+00         1.84273E+00         1.05792E+00         7.16496E+00         1.00000E+00         1.00937E-04         7.16496E+00         2.46817E+00         4.69680E+00
+          1.68364E-02         2.60071E-02        -2.97726E-02         1.05751E+00         1.85340E+00         1.05793E+00         7.07300E+00         1.00000E+00         1.01997E-04         7.07300E+00         2.40865E+00         4.66434E+00
+          1.68364E-02         2.61769E-02        -3.00510E-02         1.05750E+00         1.86407E+00         1.05793E+00         6.97519E+00         1.00000E+00         1.03062E-04         6.97519E+00         2.34718E+00         4.62801E+00
+          1.70063E-02         8.72665E-04        -8.72768E-03         1.06853E+00         2.74155E-01         1.06857E+00         1.78421E+02         1.00000E+00         1.84342E-05         1.78421E+02         5.99572E+01         1.18464E+02
+          1.70063E-02         1.04249E-03        -8.73790E-03         1.06853E+00         2.84826E-01         1.06857E+00         1.75411E+02         1.00000E+00         1.83779E-05         1.75411E+02         5.93588E+01         1.16052E+02
+          1.70063E-02         1.21232E-03        -8.74993E-03         1.06853E+00         2.95496E-01         1.06857E+00         1.72336E+02         1.00000E+00         1.83216E-05         1.72336E+02         5.87391E+01         1.13597E+02
+          1.70063E-02         1.38215E-03        -8.76377E-03         1.06853E+00         3.06167E-01         1.06857E+00         1.69202E+02         1.00000E+00         1.82654E-05         1.69202E+02         5.80983E+01         1.11104E+02
+          1.70063E-02         1.55197E-03        -8.77942E-03         1.06853E+00         3.16838E-01         1.06857E+00         1.66013E+02         1.00000E+00         1.82097E-05         1.66013E+02         5.74367E+01         1.08577E+02
+          1.70063E-02         1.72180E-03        -8.79689E-03         1.06853E+00         3.27508E-01         1.06857E+00         1.62775E+02         1.00000E+00         1.81545E-05         1.62775E+02         5.67547E+01         1.06021E+02
+          1.70063E-02         1.89163E-03        -8.81616E-03         1.06853E+00         3.38179E-01         1.06857E+00         1.59493E+02         1.00000E+00         1.81001E-05         1.59493E+02         5.60526E+01         1.03440E+02
+          1.70063E-02         2.06146E-03        -8.83725E-03         1.06853E+00         3.48849E-01         1.06857E+00         1.56170E+02         1.00000E+00         1.80468E-05         1.56170E+02         5.53307E+01         1.00840E+02
+          1.70063E-02         2.23128E-03        -8.86015E-03         1.06853E+00         3.59520E-01         1.06857E+00         1.52813E+02         1.00000E+00         1.79948E-05         1.52813E+02         5.45896E+01         9.82235E+01
+          1.70063E-02         2.40111E-03        -8.88486E-03         1.06853E+00         3.70190E-01         1.06857E+00         1.49426E+02         1.00000E+00         1.79443E-05         1.49426E+02         5.38297E+01         9.55963E+01
+          1.70063E-02         2.57094E-03        -8.91138E-03         1.06853E+00         3.80861E-01         1.06857E+00         1.46014E+02         1.00000E+00         1.78955E-05         1.46014E+02         5.30513E+01         9.29625E+01
+          1.70063E-02         2.74077E-03        -8.93972E-03         1.06853E+00         3.91532E-01         1.06857E+00         1.42582E+02         1.00000E+00         1.78486E-05         1.42582E+02         5.22552E+01         9.03264E+01
+          1.70063E-02         2.91059E-03        -8.96987E-03         1.06853E+00         4.02202E-01         1.06857E+00         1.39134E+02         1.00000E+00         1.78040E-05         1.39134E+02         5.14417E+01         8.76920E+01
+          1.70063E-02         3.08042E-03        -9.00183E-03         1.06853E+00         4.12873E-01         1.06857E+00         1.35675E+02         1.00000E+00         1.77619E-05         1.35675E+02         5.06115E+01         8.50637E+01
+          1.70063E-02         3.25025E-03        -9.03560E-03         1.06853E+00         4.23543E-01         1.06857E+00         1.32210E+02         1.00000E+00         1.77224E-05         1.32210E+02         4.97652E+01         8.24453E+01
+          1.70063E-02         3.42008E-03        -9.07118E-03         1.06853E+00         4.34214E-01         1.06857E+00         1.28744E+02         1.00000E+00         1.76859E-05         1.28744E+02         4.89033E+01         7.98408E+01
+          1.70063E-02         3.58990E-03        -9.10858E-03         1.06853E+00         4.44884E-01         1.06857E+00         1.25281E+02         1.00000E+00         1.76527E-05         1.25281E+02         4.80267E+01         7.72539E+01
+          1.70063E-02         3.75973E-03        -9.14778E-03         1.06853E+00         4.55555E-01         1.06857E+00         1.21824E+02         1.00000E+00         1.76229E-05         1.21824E+02         4.71360E+01         7.46883E+01
+          1.70063E-02         3.92956E-03        -9.18880E-03         1.06853E+00         4.66225E-01         1.06857E+00         1.18379E+02         1.00000E+00         1.75968E-05         1.18379E+02         4.62319E+01         7.21475E+01
+          1.70063E-02         4.09939E-03        -9.23163E-03         1.06853E+00         4.76896E-01         1.06857E+00         1.14950E+02         1.00000E+00         1.75747E-05         1.14950E+02         4.53151E+01         6.96348E+01
+          1.70063E-02         4.26921E-03        -9.27628E-03         1.06853E+00         4.87567E-01         1.06857E+00         1.11540E+02         1.00000E+00         1.75569E-05         1.11540E+02         4.43866E+01         6.71535E+01
+          1.70063E-02         4.43904E-03        -9.32273E-03         1.06852E+00         4.98237E-01         1.06857E+00         1.08153E+02         1.00000E+00         1.75437E-05         1.08153E+02         4.34470E+01         6.47064E+01
+          1.70063E-02         4.60887E-03        -9.37100E-03         1.06852E+00         5.08908E-01         1.06857E+00         1.04794E+02         1.00000E+00         1.75352E-05         1.04794E+02         4.24973E+01         6.22966E+01
+          1.70063E-02         4.77869E-03        -9.42108E-03         1.06852E+00         5.19578E-01         1.06856E+00         1.01465E+02         1.00000E+00         1.75319E-05         1.01465E+02         4.15383E+01         5.99268E+01
+          1.70063E-02         4.94852E-03        -9.47297E-03         1.06852E+00         5.30249E-01         1.06856E+00         9.81703E+01         1.00000E+00         1.75338E-05         9.81703E+01         4.05710E+01         5.75993E+01
+          1.70063E-02         5.11835E-03        -9.52667E-03         1.06852E+00         5.40919E-01         1.06856E+00         9.49128E+01         1.00000E+00         1.75414E-05         9.49128E+01         3.95962E+01         5.53166E+01
+          1.70063E-02         5.28818E-03        -9.58218E-03         1.06852E+00         5.51590E-01         1.06856E+00         9.16958E+01         1.00000E+00         1.75549E-05         9.16958E+01         3.86149E+01         5.30809E+01
+          1.70063E-02         5.45800E-03        -9.63951E-03         1.06852E+00         5.62261E-01         1.06856E+00         8.85222E+01         1.00000E+00         1.75745E-05         8.85222E+01         3.76280E+01         5.08942E+01
+          1.70063E-02         5.62783E-03        -9.69865E-03         1.06852E+00         5.72931E-01         1.06856E+00         8.53948E+01         1.00000E+00         1.76005E-05         8.53948E+01         3.66366E+01         4.87582E+01
+          1.70063E-02         5.79766E-03        -9.75960E-03         1.06852E+00         5.83602E-01         1.06856E+00         8.23162E+01         1.00000E+00         1.76332E-05         8.23162E+01         3.56417E+01         4.66745E+01
+          1.70063E-02         5.96749E-03        -9.82236E-03         1.06852E+00         5.94272E-01         1.06856E+00         7.92889E+01         1.00000E+00         1.76728E-05         7.92889E+01         3.46442E+01         4.46448E+01
+          1.70063E-02         6.13731E-03        -9.88694E-03         1.06852E+00         6.04943E-01         1.06856E+00         7.63152E+01         1.00000E+00         1.77195E-05         7.63152E+01         3.36451E+01         4.26700E+01
+          1.70063E-02         6.30714E-03        -9.95332E-03         1.06851E+00         6.15613E-01         1.06856E+00         7.33971E+01         1.00000E+00         1.77737E-05         7.33971E+01         3.26456E+01         4.07515E+01
+          1.70063E-02         6.47697E-03        -1.00215E-02         1.06851E+00         6.26284E-01         1.06856E+00         7.05368E+01         1.00000E+00         1.78355E-05         7.05368E+01         3.16467E+01         3.88901E+01
+          1.70063E-02         6.64680E-03        -1.00915E-02         1.06851E+00         6.36955E-01         1.06856E+00         6.77358E+01         1.00000E+00         1.79052E-05         6.77358E+01         3.06494E+01         3.70865E+01
+          1.70063E-02         6.81662E-03        -1.01634E-02         1.06851E+00         6.47625E-01         1.06856E+00         6.49960E+01         1.00000E+00         1.79829E-05         6.49960E+01         2.96547E+01         3.53413E+01
+          1.70063E-02         6.98645E-03        -1.02370E-02         1.06851E+00         6.58296E-01         1.06856E+00         6.23186E+01         1.00000E+00         1.80689E-05         6.23186E+01         2.86637E+01         3.36549E+01
+          1.70063E-02         7.15628E-03        -1.03124E-02         1.06851E+00         6.68966E-01         1.06856E+00         5.97051E+01         1.00000E+00         1.81633E-05         5.97051E+01         2.76776E+01         3.20275E+01
+          1.70063E-02         7.32611E-03        -1.03897E-02         1.06851E+00         6.79637E-01         1.06856E+00         5.71565E+01         1.00000E+00         1.82664E-05         5.71565E+01         2.66972E+01         3.04593E+01
+          1.70063E-02         7.49593E-03        -1.04688E-02         1.06851E+00         6.90307E-01         1.06856E+00         5.46738E+01         1.00000E+00         1.83782E-05         5.46738E+01         2.57237E+01         2.89501E+01
+          1.70063E-02         7.66576E-03        -1.05496E-02         1.06850E+00         7.00978E-01         1.06856E+00         5.22578E+01         1.00000E+00         1.84989E-05         5.22578E+01         2.47580E+01         2.74997E+01
+          1.70063E-02         7.83559E-03        -1.06323E-02         1.06850E+00         7.11649E-01         1.06856E+00         4.99091E+01         1.00000E+00         1.86287E-05         4.99091E+01         2.38013E+01         2.61079E+01
+          1.70063E-02         8.00542E-03        -1.07168E-02         1.06850E+00         7.22319E-01         1.06855E+00         4.76284E+01         1.00000E+00         1.87675E-05         4.76284E+01         2.28544E+01         2.47740E+01
+          1.70063E-02         8.17524E-03        -1.08032E-02         1.06850E+00         7.32990E-01         1.06855E+00         4.54159E+01         1.00000E+00         1.89157E-05         4.54159E+01         2.19184E+01         2.34975E+01
+          1.70063E-02         8.34507E-03        -1.08913E-02         1.06850E+00         7.43660E-01         1.06855E+00         4.32720E+01         1.00000E+00         1.90731E-05         4.32720E+01         2.09943E+01         2.22776E+01
+          1.70063E-02         8.51490E-03        -1.09812E-02         1.06850E+00         7.54331E-01         1.06855E+00         4.11965E+01         1.00000E+00         1.92398E-05         4.11965E+01         2.00829E+01         2.11136E+01
+          1.70063E-02         8.68473E-03        -1.10730E-02         1.06850E+00         7.65001E-01         1.06855E+00         3.91897E+01         1.00000E+00         1.94160E-05         3.91897E+01         1.91853E+01         2.00044E+01
+          1.70063E-02         8.85455E-03        -1.11666E-02         1.06849E+00         7.75672E-01         1.06855E+00         3.72512E+01         1.00000E+00         1.96015E-05         3.72512E+01         1.83022E+01         1.89489E+01
+          1.70063E-02         9.02438E-03        -1.12619E-02         1.06849E+00         7.86343E-01         1.06855E+00         3.53807E+01         1.00000E+00         1.97964E-05         3.53807E+01         1.74346E+01         1.79461E+01
+          1.70063E-02         9.19421E-03        -1.13591E-02         1.06849E+00         7.97013E-01         1.06855E+00         3.35780E+01         1.00000E+00         2.00008E-05         3.35780E+01         1.65832E+01         1.69948E+01
+          1.70063E-02         9.36403E-03        -1.14581E-02         1.06849E+00         8.07684E-01         1.06855E+00         3.18425E+01         1.00000E+00         2.02144E-05         3.18425E+01         1.57489E+01         1.60935E+01
+          1.70063E-02         9.53386E-03        -1.15590E-02         1.06849E+00         8.18354E-01         1.06855E+00         3.01735E+01         1.00000E+00         2.04374E-05         3.01735E+01         1.49325E+01         1.52410E+01
+          1.70063E-02         9.70369E-03        -1.16616E-02         1.06849E+00         8.29025E-01         1.06855E+00         2.85704E+01         1.00000E+00         2.06696E-05         2.85704E+01         1.41346E+01         1.44358E+01
+          1.70063E-02         9.87352E-03        -1.17660E-02         1.06848E+00         8.39695E-01         1.06855E+00         2.70323E+01         1.00000E+00         2.09110E-05         2.70323E+01         1.33559E+01         1.36765E+01
+          1.70063E-02         1.00433E-02        -1.18723E-02         1.06848E+00         8.50366E-01         1.06855E+00         2.55584E+01         1.00000E+00         2.11615E-05         2.55584E+01         1.25970E+01         1.29614E+01
+          1.70063E-02         1.02132E-02        -1.19803E-02         1.06848E+00         8.61037E-01         1.06855E+00         2.41478E+01         1.00000E+00         2.14209E-05         2.41478E+01         1.18586E+01         1.22892E+01
+          1.70063E-02         1.03830E-02        -1.20902E-02         1.06848E+00         8.71707E-01         1.06855E+00         2.27993E+01         1.00000E+00         2.16893E-05         2.27993E+01         1.11412E+01         1.16581E+01
+          1.70063E-02         1.05528E-02        -1.22019E-02         1.06848E+00         8.82378E-01         1.06855E+00         2.15119E+01         1.00000E+00         2.19664E-05         2.15119E+01         1.04454E+01         1.10665E+01
+          1.70063E-02         1.07227E-02        -1.23154E-02         1.06847E+00         8.93048E-01         1.06854E+00         2.02844E+01         1.00000E+00         2.22522E-05         2.02844E+01         9.77147E+00         1.05129E+01
+          1.70063E-02         1.08925E-02        -1.24307E-02         1.06847E+00         9.03719E-01         1.06854E+00         1.91156E+01         1.00000E+00         2.25465E-05         1.91156E+01         9.11996E+00         9.99560E+00
+          1.70063E-02         1.10623E-02        -1.25478E-02         1.06847E+00         9.14389E-01         1.06854E+00         1.80041E+01         1.00000E+00         2.28492E-05         1.80041E+01         8.49120E+00         9.51294E+00
+          1.70063E-02         1.12321E-02        -1.26668E-02         1.06847E+00         9.25060E-01         1.06854E+00         1.69488E+01         1.00000E+00         2.31603E-05         1.69488E+01         7.88549E+00         9.06331E+00
+          1.70063E-02         1.14020E-02        -1.27875E-02         1.06847E+00         9.35731E-01         1.06854E+00         1.59482E+01         1.00000E+00         2.34795E-05         1.59482E+01         7.30311E+00         8.64509E+00
+          1.70063E-02         1.15718E-02        -1.29101E-02         1.06846E+00         9.46401E-01         1.06854E+00         1.50009E+01         1.00000E+00         2.38068E-05         1.50009E+01         6.74427E+00         8.25666E+00
+          1.70063E-02         1.17416E-02        -1.30345E-02         1.06846E+00         9.57072E-01         1.06854E+00         1.41056E+01         1.00000E+00         2.41421E-05         1.41056E+01         6.20913E+00         7.89645E+00
+          1.70063E-02         1.19114E-02        -1.31606E-02         1.06846E+00         9.67742E-01         1.06854E+00         1.32607E+01         1.00000E+00         2.44852E-05         1.32607E+01         5.69781E+00         7.56290E+00
+          1.70063E-02         1.20813E-02        -1.32886E-02         1.06846E+00         9.78413E-01         1.06854E+00         1.24648E+01         1.00000E+00         2.48362E-05         1.24648E+01         5.21037E+00         7.25447E+00
+          1.70063E-02         1.22511E-02        -1.34185E-02         1.06846E+00         9.89083E-01         1.06854E+00         1.17165E+01         1.00000E+00         2.51948E-05         1.17165E+01         4.74682E+00         6.96968E+00
+          1.70063E-02         1.24209E-02        -1.35501E-02         1.06845E+00         9.99754E-01         1.06854E+00         1.10142E+01         1.00000E+00         2.55611E-05         1.10142E+01         4.30713E+00         6.70707E+00
+          1.70063E-02         1.25908E-02        -1.36835E-02         1.06845E+00         1.01042E+00         1.06854E+00         1.03565E+01         1.00000E+00         2.59350E-05         1.03565E+01         3.89122E+00         6.46524E+00
+          1.70063E-02         1.27606E-02        -1.38188E-02         1.06845E+00         1.02110E+00         1.06854E+00         9.74175E+00         1.00000E+00         2.63164E-05         9.74175E+00         3.49894E+00         6.24281E+00
+          1.70063E-02         1.29304E-02        -1.39558E-02         1.06845E+00         1.03177E+00         1.06854E+00         9.16860E+00         1.00000E+00         2.67054E-05         9.16860E+00         3.13013E+00         6.03847E+00
+          1.70063E-02         1.31002E-02        -1.40947E-02         1.06844E+00         1.04244E+00         1.06854E+00         8.63551E+00         1.00000E+00         2.71019E-05         8.63551E+00         2.78455E+00         5.85096E+00
+          1.70063E-02         1.32701E-02        -1.42354E-02         1.06844E+00         1.05311E+00         1.06854E+00         8.14100E+00         1.00000E+00         2.75060E-05         8.14100E+00         2.46194E+00         5.67905E+00
+          1.70063E-02         1.34399E-02        -1.43779E-02         1.06844E+00         1.06378E+00         1.06854E+00         7.68359E+00         1.00000E+00         2.79177E-05         7.68359E+00         2.16198E+00         5.52161E+00
+          1.70063E-02         1.36097E-02        -1.45222E-02         1.06844E+00         1.07445E+00         1.06854E+00         7.26183E+00         1.00000E+00         2.83369E-05         7.26183E+00         1.88431E+00         5.37752E+00
+          1.70063E-02         1.37795E-02        -1.46683E-02         1.06843E+00         1.08512E+00         1.06853E+00         6.87428E+00         1.00000E+00         2.87639E-05         6.87428E+00         1.62854E+00         5.24574E+00
+          1.70063E-02         1.39494E-02        -1.48162E-02         1.06843E+00         1.09579E+00         1.06853E+00         6.51952E+00         1.00000E+00         2.91987E-05         6.51952E+00         1.39423E+00         5.12528E+00
+          1.70063E-02         1.41192E-02        -1.49660E-02         1.06843E+00         1.10646E+00         1.06853E+00         6.19613E+00         1.00000E+00         2.96414E-05         6.19613E+00         1.18091E+00         5.01522E+00
+          1.70063E-02         1.42890E-02        -1.51176E-02         1.06843E+00         1.11713E+00         1.06853E+00         5.90275E+00         1.00000E+00         3.00920E-05         5.90275E+00         9.88064E-01         4.91469E+00
+          1.70063E-02         1.44589E-02        -1.52709E-02         1.06842E+00         1.12780E+00         1.06853E+00         5.63802E+00         1.00000E+00         3.05508E-05         5.63802E+00         8.15154E-01         4.82287E+00
+          1.70063E-02         1.46287E-02        -1.54261E-02         1.06842E+00         1.13847E+00         1.06853E+00         5.40061E+00         1.00000E+00         3.10178E-05         5.40061E+00         6.61607E-01         4.73900E+00
+          1.70063E-02         1.47985E-02        -1.55831E-02         1.06842E+00         1.14914E+00         1.06853E+00         5.18922E+00         1.00000E+00         3.14932E-05         5.18922E+00         5.26821E-01         4.66239E+00
+          1.70063E-02         1.49683E-02        -1.57419E-02         1.06842E+00         1.15981E+00         1.06853E+00         5.00257E+00         1.00000E+00         3.19772E-05         5.00257E+00         4.10164E-01         4.59240E+00
+          1.70063E-02         1.51382E-02        -1.59025E-02         1.06841E+00         1.17048E+00         1.06853E+00         4.83942E+00         1.00000E+00         3.24699E-05         4.83942E+00         3.10985E-01         4.52843E+00
+          1.70063E-02         1.53080E-02        -1.60650E-02         1.06841E+00         1.18115E+00         1.06853E+00         4.69856E+00         1.00000E+00         3.29715E-05         4.69856E+00         2.28605E-01         4.46995E+00
+          1.70063E-02         1.54778E-02        -1.62292E-02         1.06841E+00         1.19182E+00         1.06853E+00         4.57879E+00         1.00000E+00         3.34821E-05         4.57879E+00         1.62329E-01         4.41646E+00
+          1.70063E-02         1.56476E-02        -1.63953E-02         1.06840E+00         1.20249E+00         1.06853E+00         4.47897E+00         1.00000E+00         3.40019E-05         4.47897E+00         1.11442E-01         4.36753E+00
+          1.70063E-02         1.58175E-02        -1.65631E-02         1.06840E+00         1.21317E+00         1.06853E+00         4.39798E+00         1.00000E+00         3.45310E-05         4.39798E+00         7.52155E-02         4.32276E+00
+          1.70063E-02         1.59873E-02        -1.67328E-02         1.06840E+00         1.22384E+00         1.06853E+00         4.33471E+00         1.00000E+00         3.50696E-05         4.33471E+00         5.29060E-02         4.28180E+00
+          1.70063E-02         1.61571E-02        -1.69043E-02         1.06840E+00         1.23451E+00         1.06853E+00         4.28811E+00         1.00000E+00         3.56178E-05         4.28811E+00         4.37610E-02         4.24435E+00
+          1.70063E-02         1.63270E-02        -1.70776E-02         1.06839E+00         1.24518E+00         1.06853E+00         4.25714E+00         1.00000E+00         3.61757E-05         4.25714E+00         4.70196E-02         4.21013E+00
+          1.70063E-02         1.64968E-02        -1.72528E-02         1.06839E+00         1.25585E+00         1.06853E+00         4.24081E+00         1.00000E+00         3.67434E-05         4.24081E+00         6.19151E-02         4.17890E+00
+          1.70063E-02         1.66666E-02        -1.74297E-02         1.06839E+00         1.26652E+00         1.06853E+00         4.23815E+00         1.00000E+00         3.73209E-05         4.23815E+00         8.76776E-02         4.15047E+00
+          1.70063E-02         1.68364E-02        -1.76084E-02         1.06838E+00         1.27719E+00         1.06853E+00         4.24820E+00         1.00000E+00         3.79083E-05         4.24820E+00         1.23536E-01         4.12467E+00
+          1.70063E-02         1.70063E-02        -1.77890E-02         1.06838E+00         1.28786E+00         1.06853E+00         4.27006E+00         1.00000E+00         3.85056E-05         4.27006E+00         1.68720E-01         4.10134E+00
+          1.70063E-02         1.71761E-02        -1.79714E-02         1.06838E+00         1.29853E+00         1.06853E+00         4.30285E+00         1.00000E+00         3.91127E-05         4.30285E+00         2.22465E-01         4.08039E+00
+          1.70063E-02         1.73459E-02        -1.81556E-02         1.06837E+00         1.30920E+00         1.06853E+00         4.34571E+00         1.00000E+00         3.97297E-05         4.34571E+00         2.84008E-01         4.06170E+00
+          1.70063E-02         1.75158E-02        -1.83416E-02         1.06837E+00         1.31987E+00         1.06853E+00         4.39781E+00         1.00000E+00         4.03565E-05         4.39781E+00         3.52598E-01         4.04521E+00
+          1.70063E-02         1.76856E-02        -1.85294E-02         1.06837E+00         1.33054E+00         1.06853E+00         4.45834E+00         1.00000E+00         4.09929E-05         4.45834E+00         4.27491E-01         4.03085E+00
+          1.70063E-02         1.78554E-02        -1.87190E-02         1.06837E+00         1.34121E+00         1.06853E+00         4.52654E+00         1.00000E+00         4.16389E-05         4.52654E+00         5.07957E-01         4.01858E+00
+          1.70063E-02         1.80252E-02        -1.89104E-02         1.06836E+00         1.35188E+00         1.06853E+00         4.60164E+00         1.00000E+00         4.22941E-05         4.60164E+00         5.93277E-01         4.00837E+00
+          1.70063E-02         1.81951E-02        -1.91037E-02         1.06836E+00         1.36255E+00         1.06853E+00         4.68293E+00         1.00000E+00         4.29585E-05         4.68293E+00         6.82749E-01         4.00019E+00
+          1.70063E-02         1.83649E-02        -1.92987E-02         1.06836E+00         1.37322E+00         1.06853E+00         4.76971E+00         1.00000E+00         4.36318E-05         4.76971E+00         7.75689E-01         3.99402E+00
+          1.70063E-02         1.85347E-02        -1.94956E-02         1.06835E+00         1.38389E+00         1.06853E+00         4.86128E+00         1.00000E+00         4.43137E-05         4.86128E+00         8.71430E-01         3.98985E+00
+          1.70063E-02         1.87045E-02        -1.96943E-02         1.06835E+00         1.39457E+00         1.06853E+00         4.95700E+00         1.00000E+00         4.50039E-05         4.95700E+00         9.69326E-01         3.98767E+00
+          1.70063E-02         1.88744E-02        -1.98948E-02         1.06835E+00         1.40524E+00         1.06853E+00         5.05622E+00         1.00000E+00         4.57022E-05         5.05622E+00         1.06875E+00         3.98747E+00
+          1.70063E-02         1.90442E-02        -2.00971E-02         1.06834E+00         1.41591E+00         1.06853E+00         5.15834E+00         1.00000E+00         4.64081E-05         5.15834E+00         1.16911E+00         3.98923E+00
+          1.70063E-02         1.92140E-02        -2.03012E-02         1.06834E+00         1.42658E+00         1.06853E+00         5.26277E+00         1.00000E+00         4.71213E-05         5.26277E+00         1.26982E+00         3.99295E+00
+          1.70063E-02         1.93839E-02        -2.05072E-02         1.06833E+00         1.43725E+00         1.06853E+00         5.36892E+00         1.00000E+00         4.78415E-05         5.36892E+00         1.37033E+00         3.99859E+00
+          1.70063E-02         1.95537E-02        -2.07149E-02         1.06833E+00         1.44792E+00         1.06853E+00         5.47625E+00         1.00000E+00         4.85683E-05         5.47625E+00         1.47011E+00         4.00614E+00
+          1.70063E-02         1.97235E-02        -2.09245E-02         1.06833E+00         1.45859E+00         1.06853E+00         5.58422E+00         1.00000E+00         4.93012E-05         5.58422E+00         1.56867E+00         4.01555E+00
+          1.70063E-02         1.98933E-02        -2.11359E-02         1.06832E+00         1.46926E+00         1.06853E+00         5.69231E+00         1.00000E+00         5.00400E-05         5.69231E+00         1.66553E+00         4.02679E+00
+          1.70063E-02         2.00632E-02        -2.13491E-02         1.06832E+00         1.47993E+00         1.06853E+00         5.80004E+00         1.00000E+00         5.07841E-05         5.80004E+00         1.76025E+00         4.03979E+00
+          1.70063E-02         2.02330E-02        -2.15641E-02         1.06832E+00         1.49060E+00         1.06853E+00         5.90692E+00         1.00000E+00         5.15332E-05         5.90692E+00         1.85241E+00         4.05451E+00
+          1.70063E-02         2.04028E-02        -2.17809E-02         1.06831E+00         1.50127E+00         1.06853E+00         6.01250E+00         1.00000E+00         5.22870E-05         6.01250E+00         1.94164E+00         4.07086E+00
+          1.70063E-02         2.05726E-02        -2.19995E-02         1.06831E+00         1.51194E+00         1.06854E+00         6.11632E+00         1.00000E+00         5.30451E-05         6.11632E+00         2.02757E+00         4.08875E+00
+          1.70063E-02         2.07425E-02        -2.22200E-02         1.06831E+00         1.52261E+00         1.06854E+00         6.21797E+00         1.00000E+00         5.38071E-05         6.21797E+00         2.10988E+00         4.10809E+00
+          1.70063E-02         2.09123E-02        -2.24422E-02         1.06830E+00         1.53328E+00         1.06854E+00         6.31704E+00         1.00000E+00         5.45728E-05         6.31704E+00         2.18827E+00         4.12878E+00
+          1.70063E-02         2.10821E-02        -2.26663E-02         1.06830E+00         1.54395E+00         1.06854E+00         6.41315E+00         1.00000E+00         5.53418E-05         6.41315E+00         2.26247E+00         4.15068E+00
+          1.70063E-02         2.12520E-02        -2.28922E-02         1.06829E+00         1.55462E+00         1.06854E+00         6.50591E+00         1.00000E+00         5.61139E-05         6.50591E+00         2.33224E+00         4.17367E+00
+          1.70063E-02         2.14218E-02        -2.31199E-02         1.06829E+00         1.56529E+00         1.06854E+00         6.59498E+00         1.00000E+00         5.68889E-05         6.59498E+00         2.39738E+00         4.19760E+00
+          1.70063E-02         2.15916E-02        -2.33494E-02         1.06829E+00         1.57596E+00         1.06854E+00         6.68003E+00         1.00000E+00         5.76665E-05         6.68003E+00         2.45770E+00         4.22232E+00
+          1.70063E-02         2.17614E-02        -2.35807E-02         1.06828E+00         1.58664E+00         1.06854E+00         6.76072E+00         1.00000E+00         5.84467E-05         6.76072E+00         2.51306E+00         4.24767E+00
+          1.70063E-02         2.19313E-02        -2.38138E-02         1.06828E+00         1.59731E+00         1.06854E+00         6.83678E+00         1.00000E+00         5.92292E-05         6.83678E+00         2.56332E+00         4.27346E+00
+          1.70063E-02         2.21011E-02        -2.40488E-02         1.06827E+00         1.60798E+00         1.06855E+00         6.90791E+00         1.00000E+00         6.00141E-05         6.90791E+00         2.60838E+00         4.29953E+00
+          1.70063E-02         2.22709E-02        -2.42855E-02         1.06827E+00         1.61865E+00         1.06855E+00         6.97385E+00         1.00000E+00         6.08013E-05         6.97385E+00         2.64818E+00         4.32567E+00
+          1.70063E-02         2.24407E-02        -2.45241E-02         1.06827E+00         1.62932E+00         1.06855E+00         7.03436E+00         1.00000E+00         6.15907E-05         7.03436E+00         2.68267E+00         4.35168E+00
+          1.70063E-02         2.26106E-02        -2.47645E-02         1.06826E+00         1.63999E+00         1.06855E+00         7.08921E+00         1.00000E+00         6.23825E-05         7.08921E+00         2.71183E+00         4.37738E+00
+          1.70063E-02         2.27804E-02        -2.50067E-02         1.06826E+00         1.65066E+00         1.06855E+00         7.13820E+00         1.00000E+00         6.31767E-05         7.13820E+00         2.73565E+00         4.40255E+00
+          1.70063E-02         2.29502E-02        -2.52507E-02         1.06825E+00         1.66133E+00         1.06855E+00         7.18113E+00         1.00000E+00         6.39734E-05         7.18113E+00         2.75416E+00         4.42697E+00
+          1.70063E-02         2.31201E-02        -2.54966E-02         1.06825E+00         1.67200E+00         1.06855E+00         7.21786E+00         1.00000E+00         6.47728E-05         7.21786E+00         2.76742E+00         4.45044E+00
+          1.70063E-02         2.32899E-02        -2.57442E-02         1.06825E+00         1.68267E+00         1.06856E+00         7.24821E+00         1.00000E+00         6.55751E-05         7.24821E+00         2.77547E+00         4.47274E+00
+          1.70063E-02         2.34597E-02        -2.59936E-02         1.06824E+00         1.69334E+00         1.06856E+00         7.27208E+00         1.00000E+00         6.63803E-05         7.27208E+00         2.77841E+00         4.49366E+00
+          1.70063E-02         2.36295E-02        -2.62449E-02         1.06824E+00         1.70401E+00         1.06856E+00         7.28935E+00         1.00000E+00         6.71887E-05         7.28935E+00         2.77635E+00         4.51299E+00
+          1.70063E-02         2.37994E-02        -2.64980E-02         1.06823E+00         1.71468E+00         1.06856E+00         7.29993E+00         1.00000E+00         6.80007E-05         7.29993E+00         2.76940E+00         4.53052E+00
+          1.70063E-02         2.39692E-02        -2.67529E-02         1.06823E+00         1.72535E+00         1.06856E+00         7.30375E+00         1.00000E+00         6.88162E-05         7.30375E+00         2.75771E+00         4.54605E+00
+          1.70063E-02         2.41390E-02        -2.70096E-02         1.06822E+00         1.73602E+00         1.06857E+00         7.30078E+00         1.00000E+00         6.96357E-05         7.30078E+00         2.74141E+00         4.55936E+00
+          1.70063E-02         2.43088E-02        -2.72681E-02         1.06822E+00         1.74669E+00         1.06857E+00         7.29098E+00         1.00000E+00         7.04593E-05         7.29098E+00         2.72069E+00         4.57029E+00
+          1.70063E-02         2.44787E-02        -2.75285E-02         1.06822E+00         1.75736E+00         1.06857E+00         7.27434E+00         1.00000E+00         7.12873E-05         7.27434E+00         2.69570E+00         4.57864E+00
+          1.70063E-02         2.46485E-02        -2.77906E-02         1.06821E+00         1.76804E+00         1.06857E+00         7.25089E+00         1.00000E+00         7.21197E-05         7.25089E+00         2.66666E+00         4.58423E+00
+          1.70063E-02         2.48183E-02        -2.80546E-02         1.06821E+00         1.77871E+00         1.06857E+00         7.22065E+00         1.00000E+00         7.29568E-05         7.22065E+00         2.63374E+00         4.58691E+00
+          1.70063E-02         2.49882E-02        -2.83203E-02         1.06820E+00         1.78938E+00         1.06858E+00         7.18368E+00         1.00000E+00         7.37988E-05         7.18368E+00         2.59716E+00         4.58652E+00
+          1.70063E-02         2.51580E-02        -2.85879E-02         1.06820E+00         1.80005E+00         1.06858E+00         7.14006E+00         1.00000E+00         7.46457E-05         7.14006E+00         2.55713E+00         4.58292E+00
+          1.70063E-02         2.53278E-02        -2.88573E-02         1.06819E+00         1.81072E+00         1.06858E+00         7.08987E+00         1.00000E+00         7.54976E-05         7.08987E+00         2.51388E+00         4.57599E+00
+          1.70063E-02         2.54976E-02        -2.91286E-02         1.06819E+00         1.82139E+00         1.06859E+00         7.03323E+00         1.00000E+00         7.63544E-05         7.03323E+00         2.46762E+00         4.56561E+00
+          1.70063E-02         2.56675E-02        -2.94016E-02         1.06818E+00         1.83206E+00         1.06859E+00         6.97028E+00         1.00000E+00         7.72162E-05         6.97028E+00         2.41859E+00         4.55169E+00
+          1.70063E-02         2.58373E-02        -2.96764E-02         1.06818E+00         1.84273E+00         1.06859E+00         6.90116E+00         1.00000E+00         7.80828E-05         6.90116E+00         2.36701E+00         4.53415E+00
+          1.70063E-02         2.60071E-02        -2.99531E-02         1.06817E+00         1.85340E+00         1.06859E+00         6.82603E+00         1.00000E+00         7.89541E-05         6.82603E+00         2.31312E+00         4.51291E+00
+          1.70063E-02         2.61769E-02        -3.02316E-02         1.06817E+00         1.86407E+00         1.06860E+00         6.74510E+00         1.00000E+00         7.98299E-05         6.74510E+00         2.25716E+00         4.48794E+00
+          1.71761E-02         8.72665E-04        -8.91008E-03         1.07921E+00         2.74155E-01         1.07924E+00         1.72083E+02         1.00000E+00         1.31660E-05         1.72083E+02         5.42034E+01         1.17880E+02
+          1.71761E-02         1.04249E-03        -8.92030E-03         1.07921E+00         2.84826E-01         1.07924E+00         1.69172E+02         1.00000E+00         1.31292E-05         1.69172E+02         5.37061E+01         1.15466E+02
+          1.71761E-02         1.21232E-03        -8.93233E-03         1.07921E+00         2.95496E-01         1.07924E+00         1.66199E+02         1.00000E+00         1.30923E-05         1.66199E+02         5.31899E+01         1.13009E+02
+          1.71761E-02         1.38215E-03        -8.94617E-03         1.07920E+00         3.06167E-01         1.07924E+00         1.63169E+02         1.00000E+00         1.30556E-05         1.63169E+02         5.26550E+01         1.10514E+02
+          1.71761E-02         1.55197E-03        -8.96182E-03         1.07920E+00         3.16838E-01         1.07924E+00         1.60086E+02         1.00000E+00         1.30192E-05         1.60086E+02         5.21015E+01         1.07985E+02
+          1.71761E-02         1.72180E-03        -8.97928E-03         1.07920E+00         3.27508E-01         1.07924E+00         1.56956E+02         1.00000E+00         1.29833E-05         1.56956E+02         5.15295E+01         1.05427E+02
+          1.71761E-02         1.89163E-03        -8.99856E-03         1.07920E+00         3.38179E-01         1.07924E+00         1.53784E+02         1.00000E+00         1.29480E-05         1.53784E+02         5.09393E+01         1.02844E+02
+          1.71761E-02         2.06146E-03        -9.01965E-03         1.07920E+00         3.48849E-01         1.07924E+00         1.50573E+02         1.00000E+00         1.29134E-05         1.50573E+02         5.03311E+01         1.00242E+02
+          1.71761E-02         2.23128E-03        -9.04255E-03         1.07920E+00         3.59520E-01         1.07924E+00         1.47329E+02         1.00000E+00         1.28799E-05         1.47329E+02         4.97052E+01         9.76240E+01
+          1.71761E-02         2.40111E-03        -9.06726E-03         1.07920E+00         3.70190E-01         1.07924E+00         1.44057E+02         1.00000E+00         1.28474E-05         1.44057E+02         4.90619E+01         9.49953E+01
+          1.71761E-02         2.57094E-03        -9.09378E-03         1.07920E+00         3.80861E-01         1.07924E+00         1.40761E+02         1.00000E+00         1.28162E-05         1.40761E+02         4.84015E+01         9.23599E+01
+          1.71761E-02         2.74077E-03        -9.12212E-03         1.07920E+00         3.91532E-01         1.07924E+00         1.37447E+02         1.00000E+00         1.27866E-05         1.37447E+02         4.77243E+01         8.97224E+01
+          1.71761E-02         2.91059E-03        -9.15227E-03         1.07920E+00         4.02202E-01         1.07924E+00         1.34118E+02         1.00000E+00         1.27585E-05         1.34118E+02         4.70307E+01         8.70868E+01
+          1.71761E-02         3.08042E-03        -9.18422E-03         1.07920E+00         4.12873E-01         1.07924E+00         1.30779E+02         1.00000E+00         1.27324E-05         1.30779E+02         4.63212E+01         8.44574E+01
+          1.71761E-02         3.25025E-03        -9.21800E-03         1.07920E+00         4.23543E-01         1.07924E+00         1.27434E+02         1.00000E+00         1.27082E-05         1.27434E+02         4.55962E+01         8.18382E+01
+          1.71761E-02         3.42008E-03        -9.25358E-03         1.07920E+00         4.34214E-01         1.07924E+00         1.24089E+02         1.00000E+00         1.26863E-05         1.24089E+02         4.48561E+01         7.92330E+01
+          1.71761E-02         3.58990E-03        -9.29097E-03         1.07920E+00         4.44884E-01         1.07924E+00         1.20747E+02         1.00000E+00         1.26669E-05         1.20747E+02         4.41016E+01         7.66458E+01
+          1.71761E-02         3.75973E-03        -9.33018E-03         1.07920E+00         4.55555E-01         1.07924E+00         1.17413E+02         1.00000E+00         1.26501E-05         1.17413E+02         4.33331E+01         7.40800E+01
+          1.71761E-02         3.92956E-03        -9.37120E-03         1.07920E+00         4.66225E-01         1.07924E+00         1.14090E+02         1.00000E+00         1.26361E-05         1.14090E+02         4.25512E+01         7.15393E+01
+          1.71761E-02         4.09939E-03        -9.41403E-03         1.07920E+00         4.76896E-01         1.07924E+00         1.10784E+02         1.00000E+00         1.26252E-05         1.10784E+02         4.17565E+01         6.90270E+01
+          1.71761E-02         4.26921E-03        -9.45867E-03         1.07920E+00         4.87567E-01         1.07924E+00         1.07496E+02         1.00000E+00         1.26176E-05         1.07496E+02         4.09497E+01         6.65463E+01
+          1.71761E-02         4.43904E-03        -9.50513E-03         1.07920E+00         4.98237E-01         1.07924E+00         1.04232E+02         1.00000E+00         1.26134E-05         1.04232E+02         4.01315E+01         6.41003E+01
+          1.71761E-02         4.60887E-03        -9.55339E-03         1.07919E+00         5.08908E-01         1.07924E+00         1.00994E+02         1.00000E+00         1.26129E-05         1.00994E+02         3.93024E+01         6.16919E+01
+          1.71761E-02         4.77869E-03        -9.60347E-03         1.07919E+00         5.19578E-01         1.07924E+00         9.77871E+01         1.00000E+00         1.26164E-05         9.77871E+01         3.84634E+01         5.93237E+01
+          1.71761E-02         4.94852E-03        -9.65536E-03         1.07919E+00         5.30249E-01         1.07924E+00         9.46134E+01         1.00000E+00         1.26239E-05         9.46134E+01         3.76151E+01         5.69984E+01
+          1.71761E-02         5.11835E-03        -9.70907E-03         1.07919E+00         5.40919E-01         1.07924E+00         9.14765E+01         1.00000E+00         1.26358E-05         9.14765E+01         3.67583E+01         5.47182E+01
+          1.71761E-02         5.28818E-03        -9.76458E-03         1.07919E+00         5.51590E-01         1.07924E+00         8.83792E+01         1.00000E+00         1.26521E-05         8.83792E+01         3.58938E+01         5.24854E+01
+          1.71761E-02         5.45800E-03        -9.82191E-03         1.07919E+00         5.62261E-01         1.07923E+00         8.53244E+01         1.00000E+00         1.26733E-05         8.53244E+01         3.50225E+01         5.03019E+01
+          1.71761E-02         5.62783E-03        -9.88104E-03         1.07919E+00         5.72931E-01         1.07923E+00         8.23149E+01         1.00000E+00         1.26993E-05         8.23149E+01         3.41452E+01         4.81697E+01
+          1.71761E-02         5.79766E-03        -9.94199E-03         1.07919E+00         5.83602E-01         1.07923E+00         7.93531E+01         1.00000E+00         1.27305E-05         7.93531E+01         3.32628E+01         4.60903E+01
+          1.71761E-02         5.96749E-03        -1.00048E-02         1.07919E+00         5.94272E-01         1.07923E+00         7.64413E+01         1.00000E+00         1.27671E-05         7.64413E+01         3.23762E+01         4.40651E+01
+          1.71761E-02         6.13731E-03        -1.00693E-02         1.07919E+00         6.04943E-01         1.07923E+00         7.35818E+01         1.00000E+00         1.28091E-05         7.35818E+01         3.14863E+01         4.20956E+01
+          1.71761E-02         6.30714E-03        -1.01357E-02         1.07918E+00         6.15613E-01         1.07923E+00         7.07766E+01         1.00000E+00         1.28569E-05         7.07766E+01         3.05940E+01         4.01826E+01
+          1.71761E-02         6.47697E-03        -1.02039E-02         1.07918E+00         6.26284E-01         1.07923E+00         6.80276E+01         1.00000E+00         1.29104E-05         6.80276E+01         2.97003E+01         3.83273E+01
+          1.71761E-02         6.64680E-03        -1.02739E-02         1.07918E+00         6.36955E-01         1.07923E+00         6.53363E+01         1.00000E+00         1.29701E-05         6.53363E+01         2.88061E+01         3.65303E+01
+          1.71761E-02         6.81662E-03        -1.03457E-02         1.07918E+00         6.47625E-01         1.07923E+00         6.27044E+01         1.00000E+00         1.30358E-05         6.27044E+01         2.79123E+01         3.47921E+01
+          1.71761E-02         6.98645E-03        -1.04194E-02         1.07918E+00         6.58296E-01         1.07923E+00         6.01333E+01         1.00000E+00         1.31079E-05         6.01333E+01         2.70200E+01         3.31133E+01
+          1.71761E-02         7.15628E-03        -1.04948E-02         1.07918E+00         6.68966E-01         1.07923E+00         5.76240E+01         1.00000E+00         1.31864E-05         5.76240E+01         2.61301E+01         3.14939E+01
+          1.71761E-02         7.32611E-03        -1.05721E-02         1.07918E+00         6.79637E-01         1.07923E+00         5.51778E+01         1.00000E+00         1.32715E-05         5.51778E+01         2.52436E+01         2.99342E+01
+          1.71761E-02         7.49593E-03        -1.06512E-02         1.07918E+00         6.90307E-01         1.07923E+00         5.27954E+01         1.00000E+00         1.33632E-05         5.27954E+01         2.43614E+01         2.84340E+01
+          1.71761E-02         7.66576E-03        -1.07320E-02         1.07917E+00         7.00978E-01         1.07923E+00         5.04776E+01         1.00000E+00         1.34616E-05         5.04776E+01         2.34845E+01         2.69931E+01
+          1.71761E-02         7.83559E-03        -1.08147E-02         1.07917E+00         7.11649E-01         1.07923E+00         4.82250E+01         1.00000E+00         1.35669E-05         4.82250E+01         2.26139E+01         2.56112E+01
+          1.71761E-02         8.00542E-03        -1.08992E-02         1.07917E+00         7.22319E-01         1.07923E+00         4.60381E+01         1.00000E+00         1.36790E-05         4.60381E+01         2.17504E+01         2.42877E+01
+          1.71761E-02         8.17524E-03        -1.09856E-02         1.07917E+00         7.32990E-01         1.07923E+00         4.39171E+01         1.00000E+00         1.37980E-05         4.39171E+01         2.08951E+01         2.30220E+01
+          1.71761E-02         8.34507E-03        -1.10737E-02         1.07917E+00         7.43660E-01         1.07923E+00         4.18622E+01         1.00000E+00         1.39239E-05         4.18622E+01         2.00489E+01         2.18133E+01
+          1.71761E-02         8.51490E-03        -1.11636E-02         1.07917E+00         7.54331E-01         1.07922E+00         3.98735E+01         1.00000E+00         1.40568E-05         3.98735E+01         1.92126E+01         2.06609E+01
+          1.71761E-02         8.68473E-03        -1.12554E-02         1.07917E+00         7.65001E-01         1.07922E+00         3.79509E+01         1.00000E+00         1.41967E-05         3.79509E+01         1.83872E+01         1.95637E+01
+          1.71761E-02         8.85455E-03        -1.13490E-02         1.07916E+00         7.75672E-01         1.07922E+00         3.60941E+01         1.00000E+00         1.43435E-05         3.60941E+01         1.75735E+01         1.85206E+01
+          1.71761E-02         9.02438E-03        -1.14443E-02         1.07916E+00         7.86343E-01         1.07922E+00         3.43028E+01         1.00000E+00         1.44973E-05         3.43028E+01         1.67723E+01         1.75305E+01
+          1.71761E-02         9.19421E-03        -1.15415E-02         1.07916E+00         7.97013E-01         1.07922E+00         3.25767E+01         1.00000E+00         1.46579E-05         3.25767E+01         1.59845E+01         1.65921E+01
+          1.71761E-02         9.36403E-03        -1.16405E-02         1.07916E+00         8.07684E-01         1.07922E+00         3.09151E+01         1.00000E+00         1.48254E-05         3.09151E+01         1.52109E+01         1.57042E+01
+          1.71761E-02         9.53386E-03        -1.17413E-02         1.07916E+00         8.18354E-01         1.07922E+00         2.93174E+01         1.00000E+00         1.49997E-05         2.93174E+01         1.44522E+01         1.48652E+01
+          1.71761E-02         9.70369E-03        -1.18440E-02         1.07916E+00         8.29025E-01         1.07922E+00         2.77829E+01         1.00000E+00         1.51808E-05         2.77829E+01         1.37092E+01         1.40737E+01
+          1.71761E-02         9.87352E-03        -1.19484E-02         1.07915E+00         8.39695E-01         1.07922E+00         2.63108E+01         1.00000E+00         1.53685E-05         2.63108E+01         1.29825E+01         1.33283E+01
+          1.71761E-02         1.00433E-02        -1.20547E-02         1.07915E+00         8.50366E-01         1.07922E+00         2.49001E+01         1.00000E+00         1.55629E-05         2.49001E+01         1.22727E+01         1.26273E+01
+          1.71761E-02         1.02132E-02        -1.21627E-02         1.07915E+00         8.61037E-01         1.07922E+00         2.35499E+01         1.00000E+00         1.57638E-05         2.35499E+01         1.15806E+01         1.19693E+01
+          1.71761E-02         1.03830E-02        -1.22726E-02         1.07915E+00         8.71707E-01         1.07922E+00         2.22591E+01         1.00000E+00         1.59711E-05         2.22591E+01         1.09067E+01         1.13524E+01
+          1.71761E-02         1.05528E-02        -1.23843E-02         1.07915E+00         8.82378E-01         1.07922E+00         2.10267E+01         1.00000E+00         1.61848E-05         2.10267E+01         1.02515E+01         1.07752E+01
+          1.71761E-02         1.07227E-02        -1.24978E-02         1.07914E+00         8.93048E-01         1.07922E+00         1.98514E+01         1.00000E+00         1.64047E-05         1.98514E+01         9.61556E+00         1.02359E+01
+          1.71761E-02         1.08925E-02        -1.26131E-02         1.07914E+00         9.03719E-01         1.07922E+00         1.87321E+01         1.00000E+00         1.66309E-05         1.87321E+01         8.99929E+00         9.73280E+00
+          1.71761E-02         1.10623E-02        -1.27302E-02         1.07914E+00         9.14389E-01         1.07921E+00         1.76674E+01         1.00000E+00         1.68632E-05         1.76674E+01         8.40311E+00         9.26432E+00
+          1.71761E-02         1.12321E-02        -1.28492E-02         1.07914E+00         9.25060E-01         1.07921E+00         1.66561E+01         1.00000E+00         1.71015E-05         1.66561E+01         7.82740E+00         8.82874E+00
+          1.71761E-02         1.14020E-02        -1.29699E-02         1.07914E+00         9.35731E-01         1.07921E+00         1.56969E+01         1.00000E+00         1.73458E-05         1.56969E+01         7.27248E+00         8.42439E+00
+          1.71761E-02         1.15718E-02        -1.30925E-02         1.07913E+00         9.46401E-01         1.07921E+00         1.47883E+01         1.00000E+00         1.75960E-05         1.47883E+01         6.73861E+00         8.04965E+00
+          1.71761E-02         1.17416E-02        -1.32168E-02         1.07913E+00         9.57072E-01         1.07921E+00         1.39289E+01         1.00000E+00         1.78521E-05         1.39289E+01         6.22603E+00         7.70287E+00
+          1.71761E-02         1.19114E-02        -1.33430E-02         1.07913E+00         9.67742E-01         1.07921E+00         1.31174E+01         1.00000E+00         1.81141E-05         1.31174E+01         5.73492E+00         7.38245E+00
+          1.71761E-02         1.20813E-02        -1.34710E-02         1.07913E+00         9.78413E-01         1.07921E+00         1.23523E+01         1.00000E+00         1.83818E-05         1.23523E+01         5.26541E+00         7.08684E+00
+          1.71761E-02         1.22511E-02        -1.36008E-02         1.07912E+00         9.89083E-01         1.07921E+00         1.16321E+01         1.00000E+00         1.86553E-05         1.16321E+01         4.81759E+00         6.81450E+00
+          1.71761E-02         1.24209E-02        -1.37325E-02         1.07912E+00         9.99754E-01         1.07921E+00         1.09554E+01         1.00000E+00         1.89345E-05         1.09554E+01         4.39151E+00         6.56394E+00
+          1.71761E-02         1.25908E-02        -1.38659E-02         1.07912E+00         1.01042E+00         1.07921E+00         1.03209E+01         1.00000E+00         1.92195E-05         1.03209E+01         3.98715E+00         6.33370E+00
+          1.71761E-02         1.27606E-02        -1.40011E-02         1.07912E+00         1.02110E+00         1.07921E+00         9.72687E+00         1.00000E+00         1.95103E-05         9.72687E+00         3.60446E+00         6.12240E+00
+          1.71761E-02         1.29304E-02        -1.41382E-02         1.07912E+00         1.03177E+00         1.07921E+00         9.17204E+00         1.00000E+00         1.98069E-05         9.17204E+00         3.24336E+00         5.92868E+00
+          1.71761E-02         1.31002E-02        -1.42771E-02         1.07911E+00         1.04244E+00         1.07921E+00         8.65493E+00         1.00000E+00         2.01094E-05         8.65493E+00         2.90370E+00         5.75123E+00
+          1.71761E-02         1.32701E-02        -1.44178E-02         1.07911E+00         1.05311E+00         1.07921E+00         8.17412E+00         1.00000E+00         2.04179E-05         8.17412E+00         2.58528E+00         5.58883E+00
+          1.71761E-02         1.34399E-02        -1.45603E-02         1.07911E+00         1.06378E+00         1.07921E+00         7.72818E+00         1.00000E+00         2.07323E-05         7.72818E+00         2.28790E+00         5.44028E+00
+          1.71761E-02         1.36097E-02        -1.47046E-02         1.07911E+00         1.07445E+00         1.07921E+00         7.31573E+00         1.00000E+00         2.10528E-05         7.31573E+00         2.01127E+00         5.30446E+00
+          1.71761E-02         1.37795E-02        -1.48507E-02         1.07910E+00         1.08512E+00         1.07921E+00         6.93539E+00         1.00000E+00         2.13796E-05         6.93539E+00         1.75510E+00         5.18029E+00
+          1.71761E-02         1.39494E-02        -1.49986E-02         1.07910E+00         1.09579E+00         1.07921E+00         6.58580E+00         1.00000E+00         2.17126E-05         6.58580E+00         1.51903E+00         5.06677E+00
+          1.71761E-02         1.41192E-02        -1.51484E-02         1.07910E+00         1.10646E+00         1.07920E+00         6.26563E+00         1.00000E+00         2.20521E-05         6.26563E+00         1.30267E+00         4.96296E+00
+          1.71761E-02         1.42890E-02        -1.52999E-02         1.07910E+00         1.11713E+00         1.07920E+00         5.97358E+00         1.00000E+00         2.23981E-05         5.97358E+00         1.10562E+00         4.86796E+00
+          1.71761E-02         1.44589E-02        -1.54533E-02         1.07909E+00         1.12780E+00         1.07920E+00         5.70837E+00         1.00000E+00         2.27509E-05         5.70837E+00         9.27411E-01         4.78096E+00
+          1.71761E-02         1.46287E-02        -1.56085E-02         1.07909E+00         1.13847E+00         1.07920E+00         5.46874E+00         1.00000E+00         2.31105E-05         5.46874E+00         7.67565E-01         4.70117E+00
+          1.71761E-02         1.47985E-02        -1.57655E-02         1.07909E+00         1.14914E+00         1.07920E+00         5.25347E+00         1.00000E+00         2.34770E-05         5.25347E+00         6.25565E-01         4.62791E+00
+          1.71761E-02         1.49683E-02        -1.59243E-02         1.07909E+00         1.15981E+00         1.07920E+00         5.06138E+00         1.00000E+00         2.38507E-05         5.06138E+00         5.00867E-01         4.56051E+00
+          1.71761E-02         1.51382E-02        -1.60849E-02         1.07908E+00         1.17048E+00         1.07920E+00         4.89129E+00         1.00000E+00         2.42317E-05         4.89129E+00         3.92903E-01         4.49839E+00
+          1.71761E-02         1.53080E-02        -1.62473E-02         1.07908E+00         1.18115E+00         1.07920E+00         4.74209E+00         1.00000E+00         2.46202E-05         4.74209E+00         3.01080E-01         4.44101E+00
+          1.71761E-02         1.54778E-02        -1.64116E-02         1.07908E+00         1.19182E+00         1.07920E+00         4.61267E+00         1.00000E+00         2.50161E-05         4.61267E+00         2.24782E-01         4.38789E+00
+          1.71761E-02         1.56476E-02        -1.65777E-02         1.07907E+00         1.20249E+00         1.07920E+00         4.50197E+00         1.00000E+00         2.54198E-05         4.50197E+00         1.63375E-01         4.33859E+00
+          1.71761E-02         1.58175E-02        -1.67455E-02         1.07907E+00         1.21317E+00         1.07920E+00         4.40894E+00         1.00000E+00         2.58312E-05         4.40894E+00         1.16207E-01         4.29274E+00
+          1.71761E-02         1.59873E-02        -1.69152E-02         1.07907E+00         1.22384E+00         1.07920E+00         4.33260E+00         1.00000E+00         2.62506E-05         4.33260E+00         8.26110E-02         4.24998E+00
+          1.71761E-02         1.61571E-02        -1.70867E-02         1.07907E+00         1.23451E+00         1.07920E+00         4.27196E+00         1.00000E+00         2.66778E-05         4.27196E+00         6.19076E-02         4.21005E+00
+          1.71761E-02         1.63270E-02        -1.72600E-02         1.07906E+00         1.24518E+00         1.07920E+00         4.22608E+00         1.00000E+00         2.71132E-05         4.22608E+00         5.34060E-02         4.17267E+00
+          1.71761E-02         1.64968E-02        -1.74351E-02         1.07906E+00         1.25585E+00         1.07920E+00         4.19406E+00         1.00000E+00         2.75566E-05         4.19406E+00         5.64074E-02         4.13765E+00
+          1.71761E-02         1.66666E-02        -1.76121E-02         1.07906E+00         1.26652E+00         1.07920E+00         4.17501E+00         1.00000E+00         2.80081E-05         4.17501E+00         7.02068E-02         4.10481E+00
+          1.71761E-02         1.68364E-02        -1.77908E-02         1.07905E+00         1.27719E+00         1.07920E+00         4.16809E+00         1.00000E+00         2.84676E-05         4.16809E+00         9.40954E-02         4.07400E+00
+          1.71761E-02         1.70063E-02        -1.79714E-02         1.07905E+00         1.28786E+00         1.07920E+00         4.17247E+00         1.00000E+00         2.89353E-05         4.17247E+00         1.27362E-01         4.04511E+00
+          1.71761E-02         1.71761E-02        -1.81538E-02         1.07905E+00         1.29853E+00         1.07920E+00         4.18736E+00         1.00000E+00         2.94109E-05         4.18736E+00         1.69298E-01         4.01806E+00
+          1.71761E-02         1.73459E-02        -1.83379E-02         1.07904E+00         1.30920E+00         1.07920E+00         4.21199E+00         1.00000E+00         2.98944E-05         4.21199E+00         2.19194E-01         3.99279E+00
+          1.71761E-02         1.75158E-02        -1.85239E-02         1.07904E+00         1.31987E+00         1.07920E+00         4.24561E+00         1.00000E+00         3.03858E-05         4.24561E+00         2.76348E-01         3.96926E+00
+          1.71761E-02         1.76856E-02        -1.87117E-02         1.07904E+00         1.33054E+00         1.07920E+00         4.28752E+00         1.00000E+00         3.08848E-05         4.28752E+00         3.40062E-01         3.94746E+00
+          1.71761E-02         1.78554E-02        -1.89014E-02         1.07903E+00         1.34121E+00         1.07920E+00         4.33702E+00         1.00000E+00         3.13914E-05         4.33702E+00         4.09650E-01         3.92737E+00
+          1.71761E-02         1.80252E-02        -1.90928E-02         1.07903E+00         1.35188E+00         1.07920E+00         4.39345E+00         1.00000E+00         3.19053E-05         4.39345E+00         4.84433E-01         3.90902E+00
+          1.71761E-02         1.81951E-02        -1.92861E-02         1.07903E+00         1.36255E+00         1.07920E+00         4.45615E+00         1.00000E+00         3.24262E-05         4.45615E+00         5.63746E-01         3.89241E+00
+          1.71761E-02         1.83649E-02        -1.94811E-02         1.07902E+00         1.37322E+00         1.07920E+00         4.52451E+00         1.00000E+00         3.29541E-05         4.52451E+00         6.46937E-01         3.87758E+00
+          1.71761E-02         1.85347E-02        -1.96780E-02         1.07902E+00         1.38389E+00         1.07920E+00         4.59793E+00         1.00000E+00         3.34887E-05         4.59793E+00         7.33371E-01         3.86456E+00
+          1.71761E-02         1.87045E-02        -1.98767E-02         1.07902E+00         1.39457E+00         1.07920E+00         4.67581E+00         1.00000E+00         3.40296E-05         4.67581E+00         8.22428E-01         3.85338E+00
+          1.71761E-02         1.88744E-02        -2.00772E-02         1.07901E+00         1.40524E+00         1.07920E+00         4.75760E+00         1.00000E+00         3.45766E-05         4.75760E+00         9.13507E-01         3.84410E+00
+          1.71761E-02         1.90442E-02        -2.02795E-02         1.07901E+00         1.41591E+00         1.07920E+00         4.84276E+00         1.00000E+00         3.51295E-05         4.84276E+00         1.00603E+00         3.83673E+00
+          1.71761E-02         1.92140E-02        -2.04836E-02         1.07901E+00         1.42658E+00         1.07920E+00         4.93074E+00         1.00000E+00         3.56878E-05         4.93074E+00         1.09943E+00         3.83131E+00
+          1.71761E-02         1.93839E-02        -2.06896E-02         1.07900E+00         1.43725E+00         1.07920E+00         5.02106E+00         1.00000E+00         3.62514E-05         5.02106E+00         1.19318E+00         3.82788E+00
+          1.71761E-02         1.95537E-02        -2.08973E-02         1.07900E+00         1.44792E+00         1.07920E+00         5.11320E+00         1.00000E+00         3.68199E-05         5.11320E+00         1.28675E+00         3.82645E+00
+          1.71761E-02         1.97235E-02        -2.11069E-02         1.07900E+00         1.45859E+00         1.07920E+00         5.20669E+00         1.00000E+00         3.73930E-05         5.20669E+00         1.37966E+00         3.82703E+00
+          1.71761E-02         1.98933E-02        -2.13182E-02         1.07899E+00         1.46926E+00         1.07920E+00         5.30108E+00         1.00000E+00         3.79705E-05         5.30108E+00         1.47145E+00         3.82963E+00
+          1.71761E-02         2.00632E-02        -2.15314E-02         1.07899E+00         1.47993E+00         1.07920E+00         5.39591E+00         1.00000E+00         3.85520E-05         5.39591E+00         1.56167E+00         3.83424E+00
+          1.71761E-02         2.02330E-02        -2.17464E-02         1.07898E+00         1.49060E+00         1.07920E+00         5.49074E+00         1.00000E+00         3.91373E-05         5.49074E+00         1.64990E+00         3.84084E+00
+          1.71761E-02         2.04028E-02        -2.19633E-02         1.07898E+00         1.50127E+00         1.07920E+00         5.58517E+00         1.00000E+00         3.97262E-05         5.58517E+00         1.73577E+00         3.84940E+00
+          1.71761E-02         2.05726E-02        -2.21819E-02         1.07898E+00         1.51194E+00         1.07921E+00         5.67878E+00         1.00000E+00         4.03183E-05         5.67878E+00         1.81891E+00         3.85987E+00
+          1.71761E-02         2.07425E-02        -2.24023E-02         1.07897E+00         1.52261E+00         1.07921E+00         5.77118E+00         1.00000E+00         4.09136E-05         5.77118E+00         1.89898E+00         3.87220E+00
+          1.71761E-02         2.09123E-02        -2.26246E-02         1.07897E+00         1.53328E+00         1.07921E+00         5.86200E+00         1.00000E+00         4.15118E-05         5.86200E+00         1.97569E+00         3.88631E+00
+          1.71761E-02         2.10821E-02        -2.28487E-02         1.07897E+00         1.54395E+00         1.07921E+00         5.95087E+00         1.00000E+00         4.21127E-05         5.95087E+00         2.04874E+00         3.90212E+00
+          1.71761E-02         2.12520E-02        -2.30745E-02         1.07896E+00         1.55462E+00         1.07921E+00         6.03744E+00         1.00000E+00         4.27163E-05         6.03744E+00         2.11790E+00         3.91953E+00
+          1.71761E-02         2.14218E-02        -2.33022E-02         1.07896E+00         1.56529E+00         1.07921E+00         6.12137E+00         1.00000E+00         4.33225E-05         6.12137E+00         2.18294E+00         3.93843E+00
+          1.71761E-02         2.15916E-02        -2.35317E-02         1.07895E+00         1.57596E+00         1.07921E+00         6.20233E+00         1.00000E+00         4.39311E-05         6.20233E+00         2.24365E+00         3.95868E+00
+          1.71761E-02         2.17614E-02        -2.37631E-02         1.07895E+00         1.58664E+00         1.07921E+00         6.28003E+00         1.00000E+00         4.45423E-05         6.28003E+00         2.29988E+00         3.98015E+00
+          1.71761E-02         2.19313E-02        -2.39962E-02         1.07895E+00         1.59731E+00         1.07921E+00         6.35415E+00         1.00000E+00         4.51559E-05         6.35415E+00         2.35147E+00         4.00268E+00
+          1.71761E-02         2.21011E-02        -2.42311E-02         1.07894E+00         1.60798E+00         1.07921E+00         6.42443E+00         1.00000E+00         4.57721E-05         6.42443E+00         2.39831E+00         4.02612E+00
+          1.71761E-02         2.22709E-02        -2.44679E-02         1.07894E+00         1.61865E+00         1.07922E+00         6.49058E+00         1.00000E+00         4.63908E-05         6.49058E+00         2.44030E+00         4.05028E+00
+          1.71761E-02         2.24407E-02        -2.47065E-02         1.07893E+00         1.62932E+00         1.07922E+00         6.55237E+00         1.00000E+00         4.70123E-05         6.55237E+00         2.47738E+00         4.07499E+00
+          1.71761E-02         2.26106E-02        -2.49469E-02         1.07893E+00         1.63999E+00         1.07922E+00         6.60954E+00         1.00000E+00         4.76366E-05         6.60954E+00         2.50950E+00         4.10005E+00
+          1.71761E-02         2.27804E-02        -2.51891E-02         1.07893E+00         1.65066E+00         1.07922E+00         6.66189E+00         1.00000E+00         4.82638E-05         6.66189E+00         2.53664E+00         4.12525E+00
+          1.71761E-02         2.29502E-02        -2.54331E-02         1.07892E+00         1.66133E+00         1.07922E+00         6.70919E+00         1.00000E+00         4.88942E-05         6.70919E+00         2.55879E+00         4.15039E+00
+          1.71761E-02         2.31201E-02        -2.56789E-02         1.07892E+00         1.67200E+00         1.07922E+00         6.75126E+00         1.00000E+00         4.95280E-05         6.75126E+00         2.57599E+00         4.17527E+00
+          1.71761E-02         2.32899E-02        -2.59265E-02         1.07891E+00         1.68267E+00         1.07922E+00         6.78792E+00         1.00000E+00         5.01653E-05         6.78792E+00         2.58827E+00         4.19965E+00
+          1.71761E-02         2.34597E-02        -2.61760E-02         1.07891E+00         1.69334E+00         1.07923E+00         6.81902E+00         1.00000E+00         5.08064E-05         6.81902E+00         2.59569E+00         4.22333E+00
+          1.71761E-02         2.36295E-02        -2.64273E-02         1.07890E+00         1.70401E+00         1.07923E+00         6.84441E+00         1.00000E+00         5.14515E-05         6.84441E+00         2.59833E+00         4.24608E+00
+          1.71761E-02         2.37994E-02        -2.66803E-02         1.07890E+00         1.71468E+00         1.07923E+00         6.86397E+00         1.00000E+00         5.21008E-05         6.86397E+00         2.59629E+00         4.26767E+00
+          1.71761E-02         2.39692E-02        -2.69352E-02         1.07890E+00         1.72535E+00         1.07923E+00         6.87759E+00         1.00000E+00         5.27545E-05         6.87759E+00         2.58969E+00         4.28790E+00
+          1.71761E-02         2.41390E-02        -2.71919E-02         1.07889E+00         1.73602E+00         1.07923E+00         6.88518E+00         1.00000E+00         5.34127E-05         6.88518E+00         2.57863E+00         4.30654E+00
+          1.71761E-02         2.43088E-02        -2.74505E-02         1.07889E+00         1.74669E+00         1.07924E+00         6.88667E+00         1.00000E+00         5.40758E-05         6.88667E+00         2.56328E+00         4.32339E+00
+          1.71761E-02         2.44787E-02        -2.77108E-02         1.07888E+00         1.75736E+00         1.07924E+00         6.88200E+00         1.00000E+00         5.47438E-05         6.88200E+00         2.54378E+00         4.33822E+00
+          1.71761E-02         2.46485E-02        -2.79729E-02         1.07888E+00         1.76804E+00         1.07924E+00         6.87115E+00         1.00000E+00         5.54169E-05         6.87115E+00         2.52030E+00         4.35085E+00
+          1.71761E-02         2.48183E-02        -2.82369E-02         1.07887E+00         1.77871E+00         1.07924E+00         6.85410E+00         1.00000E+00         5.60951E-05         6.85410E+00         2.49301E+00         4.36109E+00
+          1.71761E-02         2.49882E-02        -2.85027E-02         1.07887E+00         1.78938E+00         1.07925E+00         6.83084E+00         1.00000E+00         5.67786E-05         6.83084E+00         2.46210E+00         4.36874E+00
+          1.71761E-02         2.51580E-02        -2.87703E-02         1.07886E+00         1.80005E+00         1.07925E+00         6.80140E+00         1.00000E+00         5.74673E-05         6.80140E+00         2.42776E+00         4.37364E+00
+          1.71761E-02         2.53278E-02        -2.90397E-02         1.07886E+00         1.81072E+00         1.07925E+00         6.76581E+00         1.00000E+00         5.81611E-05         6.76581E+00         2.39018E+00         4.37563E+00
+          1.71761E-02         2.54976E-02        -2.93109E-02         1.07886E+00         1.82139E+00         1.07925E+00         6.72414E+00         1.00000E+00         5.88601E-05         6.72414E+00         2.34959E+00         4.37455E+00
+          1.71761E-02         2.56675E-02        -2.95839E-02         1.07885E+00         1.83206E+00         1.07926E+00         6.67645E+00         1.00000E+00         5.95641E-05         6.67645E+00         2.30618E+00         4.37027E+00
+          1.71761E-02         2.58373E-02        -2.98588E-02         1.07885E+00         1.84273E+00         1.07926E+00         6.62285E+00         1.00000E+00         6.02729E-05         6.62285E+00         2.26017E+00         4.36268E+00
+          1.71761E-02         2.60071E-02        -3.01354E-02         1.07884E+00         1.85340E+00         1.07926E+00         6.56344E+00         1.00000E+00         6.09862E-05         6.56344E+00         2.21178E+00         4.35166E+00
+          1.71761E-02         2.61769E-02        -3.04139E-02         1.07884E+00         1.86407E+00         1.07926E+00         6.49835E+00         1.00000E+00         6.17038E-05         6.49835E+00         2.16122E+00         4.33713E+00
+          1.73459E-02         8.72665E-04        -9.09430E-03         1.08988E+00         2.74155E-01         1.08991E+00         1.66105E+02         1.00000E+00         9.38001E-06         1.66105E+02         4.86652E+01         1.17440E+02
+          1.73459E-02         1.04249E-03        -9.10451E-03         1.08988E+00         2.84826E-01         1.08991E+00         1.63286E+02         1.00000E+00         9.35562E-06         1.63286E+02         4.82614E+01         1.15024E+02
+          1.73459E-02         1.21232E-03        -9.11654E-03         1.08988E+00         2.95496E-01         1.08991E+00         1.60407E+02         1.00000E+00         9.33126E-06         1.60407E+02         4.78410E+01         1.12566E+02
+          1.73459E-02         1.38215E-03        -9.13038E-03         1.08988E+00         3.06167E-01         1.08991E+00         1.57473E+02         1.00000E+00         9.30705E-06         1.57473E+02         4.74041E+01         1.10069E+02
+          1.73459E-02         1.55197E-03        -9.14603E-03         1.08988E+00         3.16838E-01         1.08991E+00         1.54489E+02         1.00000E+00         9.28309E-06         1.54489E+02         4.69507E+01         1.07538E+02
+          1.73459E-02         1.72180E-03        -9.16350E-03         1.08987E+00         3.27508E-01         1.08991E+00         1.51459E+02         1.00000E+00         9.25949E-06         1.51459E+02         4.64808E+01         1.04978E+02
+          1.73459E-02         1.89163E-03        -9.18277E-03         1.08987E+00         3.38179E-01         1.08991E+00         1.48388E+02         1.00000E+00         9.23639E-06         1.48388E+02         4.59944E+01         1.02394E+02
+          1.73459E-02         2.06146E-03        -9.20386E-03         1.08987E+00         3.48849E-01         1.08991E+00         1.45281E+02         1.00000E+00         9.21389E-06         1.45281E+02         4.54918E+01         9.97896E+01
+          1.73459E-02         2.23128E-03        -9.22676E-03         1.08987E+00         3.59520E-01         1.08991E+00         1.42143E+02         1.00000E+00         9.19213E-06         1.42143E+02         4.49731E+01         9.71699E+01
+          1.73459E-02         2.40111E-03        -9.25147E-03         1.08987E+00         3.70190E-01         1.08991E+00         1.38977E+02         1.00000E+00         9.17124E-06         1.38977E+02         4.44383E+01         9.45392E+01
+          1.73459E-02         2.57094E-03        -9.27799E-03         1.08987E+00         3.80861E-01         1.08991E+00         1.35790E+02         1.00000E+00         9.15135E-06         1.35790E+02         4.38876E+01         9.19019E+01
+          1.73459E-02         2.74077E-03        -9.30633E-03         1.08987E+00         3.91532E-01         1.08991E+00         1.32584E+02         1.00000E+00         9.13261E-06         1.32584E+02         4.33214E+01         8.92625E+01
+          1.73459E-02         2.91059E-03        -9.33648E-03         1.08987E+00         4.02202E-01         1.08991E+00         1.29365E+02         1.00000E+00         9.11515E-06         1.29365E+02         4.27398E+01         8.66251E+01
+          1.73459E-02         3.08042E-03        -9.36844E-03         1.08987E+00         4.12873E-01         1.08991E+00         1.26137E+02         1.00000E+00         9.09912E-06         1.26137E+02         4.21430E+01         8.39938E+01
+          1.73459E-02         3.25025E-03        -9.40221E-03         1.08987E+00         4.23543E-01         1.08991E+00         1.22904E+02         1.00000E+00         9.08468E-06         1.22904E+02         4.15315E+01         8.13728E+01
+          1.73459E-02         3.42008E-03        -9.43779E-03         1.08987E+00         4.34214E-01         1.08991E+00         1.19671E+02         1.00000E+00         9.07197E-06         1.19671E+02         4.09055E+01         7.87660E+01
+          1.73459E-02         3.58990E-03        -9.47518E-03         1.08987E+00         4.44884E-01         1.08991E+00         1.16442E+02         1.00000E+00         9.06115E-06         1.16442E+02         4.02653E+01         7.61771E+01
+          1.73459E-02         3.75973E-03        -9.51439E-03         1.08987E+00         4.55555E-01         1.08991E+00         1.13221E+02         1.00000E+00         9.05238E-06         1.13221E+02         3.96116E+01         7.36099E+01
+          1.73459E-02         3.92956E-03        -9.55541E-03         1.08987E+00         4.66225E-01         1.08991E+00         1.10012E+02         1.00000E+00         9.04582E-06         1.10012E+02         3.89445E+01         7.10678E+01
+          1.73459E-02         4.09939E-03        -9.59824E-03         1.08987E+00         4.76896E-01         1.08991E+00         1.06819E+02         1.00000E+00         9.04163E-06         1.06819E+02         3.82647E+01         6.85543E+01
+          1.73459E-02         4.26921E-03        -9.64288E-03         1.08987E+00         4.87567E-01         1.08991E+00         1.03645E+02         1.00000E+00         9.03997E-06         1.03645E+02         3.75726E+01         6.60726E+01
+          1.73459E-02         4.43904E-03        -9.68934E-03         1.08987E+00         4.98237E-01         1.08991E+00         1.00494E+02         1.00000E+00         9.04101E-06         1.00494E+02         3.68687E+01         6.36258E+01
+          1.73459E-02         4.60887E-03        -9.73760E-03         1.08986E+00         5.08908E-01         1.08991E+00         9.73704E+01         1.00000E+00         9.04492E-06         9.73704E+01         3.61537E+01         6.12167E+01
+          1.73459E-02         4.77869E-03        -9.78768E-03         1.08986E+00         5.19578E-01         1.08991E+00         9.42762E+01         1.00000E+00         9.05186E-06         9.42762E+01         3.54280E+01         5.88481E+01
+          1.73459E-02         4.94852E-03        -9.83957E-03         1.08986E+00         5.30249E-01         1.08991E+00         9.12150E+01         1.00000E+00         9.06198E-06         9.12150E+01         3.46924E+01         5.65226E+01
+          1.73459E-02         5.11835E-03        -9.89328E-03         1.08986E+00         5.40919E-01         1.08991E+00         8.81901E+01         1.00000E+00         9.07545E-06         8.81901E+01         3.39475E+01         5.42425E+01
+          1.73459E-02         5.28818E-03        -9.94879E-03         1.08986E+00         5.51590E-01         1.08991E+00         8.52041E+01         1.00000E+00         9.09243E-06         8.52041E+01         3.31940E+01         5.20101E+01
+          1.73459E-02         5.45800E-03        -1.00061E-02         1.08986E+00         5.62261E-01         1.08991E+00         8.22600E+01         1.00000E+00         9.11307E-06         8.22600E+01         3.24326E+01         4.98274E+01
+          1.73459E-02         5.62783E-03        -1.00653E-02         1.08986E+00         5.72931E-01         1.08991E+00         7.93601E+01         1.00000E+00         9.13752E-06         7.93601E+01         3.16640E+01         4.76961E+01
+          1.73459E-02         5.79766E-03        -1.01262E-02         1.08986E+00         5.83602E-01         1.08991E+00         7.65070E+01         1.00000E+00         9.16593E-06         7.65070E+01         3.08890E+01         4.56181E+01
+          1.73459E-02         5.96749E-03        -1.01890E-02         1.08986E+00         5.94272E-01         1.08990E+00         7.37029E+01         1.00000E+00         9.19844E-06         7.37029E+01         3.01083E+01         4.35946E+01
+          1.73459E-02         6.13731E-03        -1.02535E-02         1.08986E+00         6.04943E-01         1.08990E+00         7.09499E+01         1.00000E+00         9.23517E-06         7.09499E+01         2.93228E+01         4.16271E+01
+          1.73459E-02         6.30714E-03        -1.03199E-02         1.08985E+00         6.15613E-01         1.08990E+00         6.82499E+01         1.00000E+00         9.27626E-06         6.82499E+01         2.85333E+01         3.97167E+01
+          1.73459E-02         6.47697E-03        -1.03881E-02         1.08985E+00         6.26284E-01         1.08990E+00         6.56048E+01         1.00000E+00         9.32182E-06         6.56048E+01         2.77406E+01         3.78642E+01
+          1.73459E-02         6.64680E-03        -1.04581E-02         1.08985E+00         6.36955E-01         1.08990E+00         6.30160E+01         1.00000E+00         9.37196E-06         6.30160E+01         2.69456E+01         3.60704E+01
+          1.73459E-02         6.81662E-03        -1.05300E-02         1.08985E+00         6.47625E-01         1.08990E+00         6.04850E+01         1.00000E+00         9.42677E-06         6.04850E+01         2.61491E+01         3.43359E+01
+          1.73459E-02         6.98645E-03        -1.06036E-02         1.08985E+00         6.58296E-01         1.08990E+00         5.80132E+01         1.00000E+00         9.48636E-06         5.80132E+01         2.53520E+01         3.26612E+01
+          1.73459E-02         7.15628E-03        -1.06790E-02         1.08985E+00         6.68966E-01         1.08990E+00         5.56016E+01         1.00000E+00         9.55080E-06         5.56016E+01         2.45552E+01         3.10464E+01
+          1.73459E-02         7.32611E-03        -1.07563E-02         1.08985E+00         6.79637E-01         1.08990E+00         5.32513E+01         1.00000E+00         9.62015E-06         5.32513E+01         2.37596E+01         2.94917E+01
+          1.73459E-02         7.49593E-03        -1.08354E-02         1.08985E+00         6.90307E-01         1.08990E+00         5.09630E+01         1.00000E+00         9.69448E-06         5.09630E+01         2.29661E+01         2.79969E+01
+          1.73459E-02         7.66576E-03        -1.09162E-02         1.08984E+00         7.00978E-01         1.08990E+00         4.87375E+01         1.00000E+00         9.77384E-06         4.87375E+01         2.21756E+01         2.65619E+01
+          1.73459E-02         7.83559E-03        -1.09989E-02         1.08984E+00         7.11649E-01         1.08990E+00         4.65752E+01         1.00000E+00         9.85826E-06         4.65752E+01         2.13889E+01         2.51863E+01
+          1.73459E-02         8.00542E-03        -1.10834E-02         1.08984E+00         7.22319E-01         1.08990E+00         4.44765E+01         1.00000E+00         9.94777E-06         4.44765E+01         2.06070E+01         2.38695E+01
+          1.73459E-02         8.17524E-03        -1.11698E-02         1.08984E+00         7.32990E-01         1.08990E+00         4.24418E+01         1.00000E+00         1.00424E-05         4.24418E+01         1.98307E+01         2.26110E+01
+          1.73459E-02         8.34507E-03        -1.12579E-02         1.08984E+00         7.43660E-01         1.08990E+00         4.04710E+01         1.00000E+00         1.01421E-05         4.04710E+01         1.90610E+01         2.14101E+01
+          1.73459E-02         8.51490E-03        -1.13478E-02         1.08984E+00         7.54331E-01         1.08990E+00         3.85643E+01         1.00000E+00         1.02469E-05         3.85643E+01         1.82986E+01         2.02657E+01
+          1.73459E-02         8.68473E-03        -1.14396E-02         1.08984E+00         7.65001E-01         1.08990E+00         3.67214E+01         1.00000E+00         1.03569E-05         3.67214E+01         1.75444E+01         1.91769E+01
+          1.73459E-02         8.85455E-03        -1.15332E-02         1.08983E+00         7.75672E-01         1.08989E+00         3.49421E+01         1.00000E+00         1.04719E-05         3.49421E+01         1.67994E+01         1.81427E+01
+          1.73459E-02         9.02438E-03        -1.16285E-02         1.08983E+00         7.86343E-01         1.08989E+00         3.32261E+01         1.00000E+00         1.05919E-05         3.32261E+01         1.60642E+01         1.71619E+01
+          1.73459E-02         9.19421E-03        -1.17257E-02         1.08983E+00         7.97013E-01         1.08989E+00         3.15728E+01         1.00000E+00         1.07169E-05         3.15728E+01         1.53396E+01         1.62331E+01
+          1.73459E-02         9.36403E-03        -1.18247E-02         1.08983E+00         8.07684E-01         1.08989E+00         2.99817E+01         1.00000E+00         1.08470E-05         2.99817E+01         1.46266E+01         1.53551E+01
+          1.73459E-02         9.53386E-03        -1.19255E-02         1.08983E+00         8.18354E-01         1.08989E+00         2.84522E+01         1.00000E+00         1.09819E-05         2.84522E+01         1.39257E+01         1.45265E+01
+          1.73459E-02         9.70369E-03        -1.20282E-02         1.08983E+00         8.29025E-01         1.08989E+00         2.69834E+01         1.00000E+00         1.11217E-05         2.69834E+01         1.32378E+01         1.37456E+01
+          1.73459E-02         9.87352E-03        -1.21326E-02         1.08982E+00         8.39695E-01         1.08989E+00         2.55746E+01         1.00000E+00         1.12663E-05         2.55746E+01         1.25635E+01         1.30111E+01
+          1.73459E-02         1.00433E-02        -1.22389E-02         1.08982E+00         8.50366E-01         1.08989E+00         2.42247E+01         1.00000E+00         1.14157E-05         2.42247E+01         1.19035E+01         1.23212E+01
+          1.73459E-02         1.02132E-02        -1.23469E-02         1.08982E+00         8.61037E-01         1.08989E+00         2.29329E+01         1.00000E+00         1.15698E-05         2.29329E+01         1.12584E+01         1.16745E+01
+          1.73459E-02         1.03830E-02        -1.24568E-02         1.08982E+00         8.71707E-01         1.08989E+00         2.16981E+01         1.00000E+00         1.17285E-05         2.16981E+01         1.06289E+01         1.10692E+01
+          1.73459E-02         1.05528E-02        -1.25685E-02         1.08982E+00         8.82378E-01         1.08989E+00         2.05191E+01         1.00000E+00         1.18918E-05         2.05191E+01         1.00154E+01         1.05037E+01
+          1.73459E-02         1.07227E-02        -1.26820E-02         1.08981E+00         8.93048E-01         1.08989E+00         1.93948E+01         1.00000E+00         1.20596E-05         1.93948E+01         9.41859E+00         9.97617E+00
+          1.73459E-02         1.08925E-02        -1.27973E-02         1.08981E+00         9.03719E-01         1.08989E+00         1.83239E+01         1.00000E+00         1.22320E-05         1.83239E+01         8.83886E+00         9.48502E+00
+          1.73459E-02         1.10623E-02        -1.29144E-02         1.08981E+00         9.14389E-01         1.08989E+00         1.73052E+01         1.00000E+00         1.24088E-05         1.73052E+01         8.27669E+00         9.02850E+00
+          1.73459E-02         1.12321E-02        -1.30334E-02         1.08981E+00         9.25060E-01         1.08989E+00         1.63374E+01         1.00000E+00         1.25900E-05         1.63374E+01         7.73248E+00         8.60491E+00
+          1.73459E-02         1.14020E-02        -1.31541E-02         1.08981E+00         9.35731E-01         1.08989E+00         1.54191E+01         1.00000E+00         1.27756E-05         1.54191E+01         7.20660E+00         8.21253E+00
+          1.73459E-02         1.15718E-02        -1.32767E-02         1.08980E+00         9.46401E-01         1.08988E+00         1.45491E+01         1.00000E+00         1.29656E-05         1.45491E+01         6.69939E+00         7.84970E+00
+          1.73459E-02         1.17416E-02        -1.34010E-02         1.08980E+00         9.57072E-01         1.08988E+00         1.37258E+01         1.00000E+00         1.31599E-05         1.37258E+01         6.21111E+00         7.51473E+00
+          1.73459E-02         1.19114E-02        -1.35272E-02         1.08980E+00         9.67742E-01         1.08988E+00         1.29480E+01         1.00000E+00         1.33586E-05         1.29480E+01         5.74202E+00         7.20600E+00
+          1.73459E-02         1.20813E-02        -1.36552E-02         1.08980E+00         9.78413E-01         1.08988E+00         1.22142E+01         1.00000E+00         1.35617E-05         1.22142E+01         5.29231E+00         6.92190E+00
+          1.73459E-02         1.22511E-02        -1.37850E-02         1.08979E+00         9.89083E-01         1.08988E+00         1.15230E+01         1.00000E+00         1.37692E-05         1.15230E+01         4.86213E+00         6.66085E+00
+          1.73459E-02         1.24209E-02        -1.39167E-02         1.08979E+00         9.99754E-01         1.08988E+00         1.08729E+01         1.00000E+00         1.39810E-05         1.08729E+01         4.45159E+00         6.42133E+00
+          1.73459E-02         1.25908E-02        -1.40501E-02         1.08979E+00         1.01042E+00         1.08988E+00         1.02626E+01         1.00000E+00         1.41973E-05         1.02626E+01         4.06075E+00         6.20186E+00
+          1.73459E-02         1.27606E-02        -1.41853E-02         1.08979E+00         1.02110E+00         1.08988E+00         9.69064E+00         1.00000E+00         1.44182E-05         9.69064E+00         3.68964E+00         6.00099E+00
+          1.73459E-02         1.29304E-02        -1.43224E-02         1.08979E+00         1.03177E+00         1.08988E+00         9.15558E+00         1.00000E+00         1.46436E-05         9.15558E+00         3.33824E+00         5.81734E+00
+          1.73459E-02         1.31002E-02        -1.44613E-02         1.08978E+00         1.04244E+00         1.08988E+00         8.65606E+00         1.00000E+00         1.48736E-05         8.65606E+00         3.00647E+00         5.64958E+00
+          1.73459E-02         1.32701E-02        -1.46020E-02         1.08978E+00         1.05311E+00         1.08988E+00         8.19068E+00         1.00000E+00         1.51084E-05         8.19068E+00         2.69425E+00         5.49643E+00
+          1.73459E-02         1.34399E-02        -1.47445E-02         1.08978E+00         1.06378E+00         1.08988E+00         7.75808E+00         1.00000E+00         1.53481E-05         7.75808E+00         2.40141E+00         5.35667E+00
+          1.73459E-02         1.36097E-02        -1.48888E-02         1.08978E+00         1.07445E+00         1.08988E+00         7.35692E+00         1.00000E+00         1.55927E-05         7.35692E+00         2.12777E+00         5.22915E+00
+          1.73459E-02         1.37795E-02        -1.50349E-02         1.08977E+00         1.08512E+00         1.08988E+00         6.98587E+00         1.00000E+00         1.58423E-05         6.98587E+00         1.87310E+00         5.11277E+00
+          1.73459E-02         1.39494E-02        -1.51828E-02         1.08977E+00         1.09579E+00         1.08988E+00         6.64364E+00         1.00000E+00         1.60971E-05         6.64364E+00         1.63715E+00         5.00648E+00
+          1.73459E-02         1.41192E-02        -1.53326E-02         1.08977E+00         1.10646E+00         1.08988E+00         6.32894E+00         1.00000E+00         1.63572E-05         6.32894E+00         1.41961E+00         4.90933E+00
+          1.73459E-02         1.42890E-02        -1.54841E-02         1.08977E+00         1.11713E+00         1.08988E+00         6.04055E+00         1.00000E+00         1.66227E-05         6.04055E+00         1.22014E+00         4.82041E+00
+          1.73459E-02         1.44589E-02        -1.56375E-02         1.08976E+00         1.12780E+00         1.08987E+00         5.77723E+00         1.00000E+00         1.68937E-05         5.77723E+00         1.03838E+00         4.73886E+00
+          1.73459E-02         1.46287E-02        -1.57927E-02         1.08976E+00         1.13847E+00         1.08987E+00         5.53782E+00         1.00000E+00         1.71704E-05         5.53782E+00         8.73914E-01         4.66390E+00
+          1.73459E-02         1.47985E-02        -1.59497E-02         1.08976E+00         1.14914E+00         1.08987E+00         5.32114E+00         1.00000E+00         1.74529E-05         5.32114E+00         7.26323E-01         4.59482E+00
+          1.73459E-02         1.49683E-02        -1.61085E-02         1.08975E+00         1.15981E+00         1.08987E+00         5.12609E+00         1.00000E+00         1.77414E-05         5.12609E+00         5.95141E-01         4.53095E+00
+          1.73459E-02         1.51382E-02        -1.62691E-02         1.08975E+00         1.17048E+00         1.08987E+00         4.95156E+00         1.00000E+00         1.80358E-05         4.95156E+00         4.79879E-01         4.47169E+00
+          1.73459E-02         1.53080E-02        -1.64315E-02         1.08975E+00         1.18115E+00         1.08987E+00         4.79652E+00         1.00000E+00         1.83365E-05         4.79652E+00         3.80026E-01         4.41649E+00
+          1.73459E-02         1.54778E-02        -1.65958E-02         1.08975E+00         1.19182E+00         1.08987E+00         4.65992E+00         1.00000E+00         1.86433E-05         4.65992E+00         2.95045E-01         4.36488E+00
+          1.73459E-02         1.56476E-02        -1.67618E-02         1.08974E+00         1.20249E+00         1.08987E+00         4.54079E+00         1.00000E+00         1.89565E-05         4.54079E+00         2.24378E-01         4.31641E+00
+          1.73459E-02         1.58175E-02        -1.69297E-02         1.08974E+00         1.21317E+00         1.08987E+00         4.43817E+00         1.00000E+00         1.92760E-05         4.43817E+00         1.67450E-01         4.27072E+00
+          1.73459E-02         1.59873E-02        -1.70994E-02         1.08974E+00         1.22384E+00         1.08987E+00         4.35112E+00         1.00000E+00         1.96021E-05         4.35112E+00         1.23667E-01         4.22746E+00
+          1.73459E-02         1.61571E-02        -1.72709E-02         1.08973E+00         1.23451E+00         1.08987E+00         4.27877E+00         1.00000E+00         1.99346E-05         4.27877E+00         9.24208E-02         4.18635E+00
+          1.73459E-02         1.63270E-02        -1.74442E-02         1.08973E+00         1.24518E+00         1.08987E+00         4.22025E+00         1.00000E+00         2.02736E-05         4.22025E+00         7.30912E-02         4.14716E+00
+          1.73459E-02         1.64968E-02        -1.76193E-02         1.08973E+00         1.25585E+00         1.08987E+00         4.17473E+00         1.00000E+00         2.06191E-05         4.17473E+00         6.50462E-02         4.10968E+00
+          1.73459E-02         1.66666E-02        -1.77963E-02         1.08973E+00         1.26652E+00         1.08987E+00         4.14141E+00         1.00000E+00         2.09711E-05         4.14141E+00         6.76458E-02         4.07376E+00
+          1.73459E-02         1.68364E-02        -1.79750E-02         1.08972E+00         1.27719E+00         1.08987E+00         4.11953E+00         1.00000E+00         2.13296E-05         4.11953E+00         8.02433E-02         4.03929E+00
+          1.73459E-02         1.70063E-02        -1.81556E-02         1.08972E+00         1.28786E+00         1.08987E+00         4.10835E+00         1.00000E+00         2.16945E-05         4.10835E+00         1.02188E-01         4.00616E+00
+          1.73459E-02         1.71761E-02        -1.83379E-02         1.08972E+00         1.29853E+00         1.08987E+00         4.10715E+00         1.00000E+00         2.20656E-05         4.10715E+00         1.32826E-01         3.97432E+00
+          1.73459E-02         1.73459E-02        -1.85221E-02         1.08971E+00         1.30920E+00         1.08987E+00         4.11524E+00         1.00000E+00         2.24430E-05         4.11524E+00         1.71504E-01         3.94374E+00
+          1.73459E-02         1.75158E-02        -1.87081E-02         1.08971E+00         1.31987E+00         1.08987E+00         4.13198E+00         1.00000E+00         2.28264E-05         4.13198E+00         2.17571E-01         3.91441E+00
+          1.73459E-02         1.76856E-02        -1.88959E-02         1.08971E+00         1.33054E+00         1.08987E+00         4.15672E+00         1.00000E+00         2.32158E-05         4.15672E+00         2.70377E-01         3.88635E+00
+          1.73459E-02         1.78554E-02        -1.90856E-02         1.08970E+00         1.34121E+00         1.08987E+00         4.18886E+00         1.00000E+00         2.36109E-05         4.18886E+00         3.29280E-01         3.85958E+00
+          1.73459E-02         1.80252E-02        -1.92770E-02         1.08970E+00         1.35188E+00         1.08987E+00         4.22780E+00         1.00000E+00         2.40117E-05         4.22780E+00         3.93645E-01         3.83415E+00
+          1.73459E-02         1.81951E-02        -1.94702E-02         1.08970E+00         1.36255E+00         1.08987E+00         4.27297E+00         1.00000E+00         2.44179E-05         4.27297E+00         4.62845E-01         3.81013E+00
+          1.73459E-02         1.83649E-02        -1.96653E-02         1.08969E+00         1.37322E+00         1.08987E+00         4.32384E+00         1.00000E+00         2.48292E-05         4.32384E+00         5.36264E-01         3.78757E+00
+          1.73459E-02         1.85347E-02        -1.98622E-02         1.08969E+00         1.38389E+00         1.08987E+00         4.37986E+00         1.00000E+00         2.52456E-05         4.37986E+00         6.13300E-01         3.76656E+00
+          1.73459E-02         1.87045E-02        -2.00609E-02         1.08969E+00         1.39457E+00         1.08987E+00         4.44054E+00         1.00000E+00         2.56667E-05         4.44054E+00         6.93362E-01         3.74718E+00
+          1.73459E-02         1.88744E-02        -2.02614E-02         1.08968E+00         1.40524E+00         1.08987E+00         4.50537E+00         1.00000E+00         2.60924E-05         4.50537E+00         7.75878E-01         3.72949E+00
+          1.73459E-02         1.90442E-02        -2.04637E-02         1.08968E+00         1.41591E+00         1.08987E+00         4.57388E+00         1.00000E+00         2.65224E-05         4.57388E+00         8.60289E-01         3.71360E+00
+          1.73459E-02         1.92140E-02        -2.06678E-02         1.08968E+00         1.42658E+00         1.08987E+00         4.64562E+00         1.00000E+00         2.69565E-05         4.64562E+00         9.46057E-01         3.69956E+00
+          1.73459E-02         1.93839E-02        -2.08737E-02         1.08967E+00         1.43725E+00         1.08987E+00         4.72012E+00         1.00000E+00         2.73945E-05         4.72012E+00         1.03266E+00         3.68746E+00
+          1.73459E-02         1.95537E-02        -2.10815E-02         1.08967E+00         1.44792E+00         1.08987E+00         4.79697E+00         1.00000E+00         2.78361E-05         4.79697E+00         1.11960E+00         3.67736E+00
+          1.73459E-02         1.97235E-02        -2.12910E-02         1.08966E+00         1.45859E+00         1.08987E+00         4.87573E+00         1.00000E+00         2.82812E-05         4.87573E+00         1.20640E+00         3.66933E+00
+          1.73459E-02         1.98933E-02        -2.15024E-02         1.08966E+00         1.46926E+00         1.08987E+00         4.95600E+00         1.00000E+00         2.87295E-05         4.95600E+00         1.29260E+00         3.66340E+00
+          1.73459E-02         2.00632E-02        -2.17156E-02         1.08966E+00         1.47993E+00         1.08987E+00         5.03738E+00         1.00000E+00         2.91809E-05         5.03738E+00         1.37777E+00         3.65961E+00
+          1.73459E-02         2.02330E-02        -2.19306E-02         1.08965E+00         1.49060E+00         1.08987E+00         5.11950E+00         1.00000E+00         2.96352E-05         5.11950E+00         1.46150E+00         3.65800E+00
+          1.73459E-02         2.04028E-02        -2.21474E-02         1.08965E+00         1.50127E+00         1.08987E+00         5.20197E+00         1.00000E+00         3.00923E-05         5.20197E+00         1.54339E+00         3.65857E+00
+          1.73459E-02         2.05726E-02        -2.23661E-02         1.08965E+00         1.51194E+00         1.08988E+00         5.28442E+00         1.00000E+00         3.05520E-05         5.28442E+00         1.62310E+00         3.66132E+00
+          1.73459E-02         2.07425E-02        -2.25865E-02         1.08964E+00         1.52261E+00         1.08988E+00         5.36652E+00         1.00000E+00         3.10143E-05         5.36652E+00         1.70029E+00         3.66623E+00
+          1.73459E-02         2.09123E-02        -2.28088E-02         1.08964E+00         1.53328E+00         1.08988E+00         5.44790E+00         1.00000E+00         3.14791E-05         5.44790E+00         1.77463E+00         3.67327E+00
+          1.73459E-02         2.10821E-02        -2.30328E-02         1.08963E+00         1.54395E+00         1.08988E+00         5.52824E+00         1.00000E+00         3.19464E-05         5.52824E+00         1.84585E+00         3.68239E+00
+          1.73459E-02         2.12520E-02        -2.32587E-02         1.08963E+00         1.55462E+00         1.08988E+00         5.60722E+00         1.00000E+00         3.24160E-05         5.60722E+00         1.91369E+00         3.69353E+00
+          1.73459E-02         2.14218E-02        -2.34864E-02         1.08963E+00         1.56529E+00         1.08988E+00         5.68451E+00         1.00000E+00         3.28881E-05         5.68451E+00         1.97791E+00         3.70660E+00
+          1.73459E-02         2.15916E-02        -2.37159E-02         1.08962E+00         1.57596E+00         1.08988E+00         5.75981E+00         1.00000E+00         3.33626E-05         5.75981E+00         2.03830E+00         3.72151E+00
+          1.73459E-02         2.17614E-02        -2.39472E-02         1.08962E+00         1.58664E+00         1.08988E+00         5.83283E+00         1.00000E+00         3.38397E-05         5.83283E+00         2.09468E+00         3.73815E+00
+          1.73459E-02         2.19313E-02        -2.41804E-02         1.08961E+00         1.59731E+00         1.08988E+00         5.90328E+00         1.00000E+00         3.43194E-05         5.90328E+00         2.14689E+00         3.75639E+00
+          1.73459E-02         2.21011E-02        -2.44153E-02         1.08961E+00         1.60798E+00         1.08988E+00         5.97088E+00         1.00000E+00         3.48018E-05         5.97088E+00         2.19478E+00         3.77610E+00
+          1.73459E-02         2.22709E-02        -2.46521E-02         1.08961E+00         1.61865E+00         1.08989E+00         6.03537E+00         1.00000E+00         3.52871E-05         6.03537E+00         2.23826E+00         3.79711E+00
+          1.73459E-02         2.24407E-02        -2.48906E-02         1.08960E+00         1.62932E+00         1.08989E+00         6.09650E+00         1.00000E+00         3.57754E-05         6.09650E+00         2.27723E+00         3.81927E+00
+          1.73459E-02         2.26106E-02        -2.51310E-02         1.08960E+00         1.63999E+00         1.08989E+00         6.15402E+00         1.00000E+00         3.62669E-05         6.15402E+00         2.31162E+00         3.84240E+00
+          1.73459E-02         2.27804E-02        -2.53732E-02         1.08959E+00         1.65066E+00         1.08989E+00         6.20771E+00         1.00000E+00         3.67617E-05         6.20771E+00         2.34140E+00         3.86630E+00
+          1.73459E-02         2.29502E-02        -2.56172E-02         1.08959E+00         1.66133E+00         1.08989E+00         6.25733E+00         1.00000E+00         3.72601E-05         6.25733E+00         2.36654E+00         3.89078E+00
+          1.73459E-02         2.31201E-02        -2.58631E-02         1.08959E+00         1.67200E+00         1.08989E+00         6.30268E+00         1.00000E+00         3.77623E-05         6.30268E+00         2.38705E+00         3.91564E+00
+          1.73459E-02         2.32899E-02        -2.61107E-02         1.08958E+00         1.68267E+00         1.08989E+00         6.34358E+00         1.00000E+00         3.82684E-05         6.34358E+00         2.40293E+00         3.94065E+00
+          1.73459E-02         2.34597E-02        -2.63602E-02         1.08958E+00         1.69334E+00         1.08990E+00         6.37983E+00         1.00000E+00         3.87787E-05         6.37983E+00         2.41423E+00         3.96561E+00
+          1.73459E-02         2.36295E-02        -2.66114E-02         1.08957E+00         1.70401E+00         1.08990E+00         6.41127E+00         1.00000E+00         3.92932E-05         6.41127E+00         2.42100E+00         3.99028E+00
+          1.73459E-02         2.37994E-02        -2.68645E-02         1.08957E+00         1.71468E+00         1.08990E+00         6.43775E+00         1.00000E+00         3.98123E-05         6.43775E+00         2.42332E+00         4.01444E+00
+          1.73459E-02         2.39692E-02        -2.71194E-02         1.08956E+00         1.72535E+00         1.08990E+00         6.45913E+00         1.00000E+00         4.03361E-05         6.45913E+00         2.42127E+00         4.03786E+00
+          1.73459E-02         2.41390E-02        -2.73761E-02         1.08956E+00         1.73602E+00         1.08990E+00         6.47527E+00         1.00000E+00         4.08646E-05         6.47527E+00         2.41496E+00         4.06031E+00
+          1.73459E-02         2.43088E-02        -2.76346E-02         1.08955E+00         1.74669E+00         1.08990E+00         6.48608E+00         1.00000E+00         4.13981E-05         6.48608E+00         2.40451E+00         4.08158E+00
+          1.73459E-02         2.44787E-02        -2.78950E-02         1.08955E+00         1.75736E+00         1.08991E+00         6.49146E+00         1.00000E+00         4.19366E-05         6.49146E+00         2.39004E+00         4.10142E+00
+          1.73459E-02         2.46485E-02        -2.81571E-02         1.08955E+00         1.76804E+00         1.08991E+00         6.49134E+00         1.00000E+00         4.24802E-05         6.49134E+00         2.37171E+00         4.11963E+00
+          1.73459E-02         2.48183E-02        -2.84211E-02         1.08954E+00         1.77871E+00         1.08991E+00         6.48564E+00         1.00000E+00         4.30288E-05         6.48564E+00         2.34966E+00         4.13598E+00
+          1.73459E-02         2.49882E-02        -2.86868E-02         1.08954E+00         1.78938E+00         1.08991E+00         6.47434E+00         1.00000E+00         4.35824E-05         6.47434E+00         2.32405E+00         4.15028E+00
+          1.73459E-02         2.51580E-02        -2.89544E-02         1.08953E+00         1.80005E+00         1.08992E+00         6.45739E+00         1.00000E+00         4.41411E-05         6.45739E+00         2.29507E+00         4.16232E+00
+          1.73459E-02         2.53278E-02        -2.92238E-02         1.08953E+00         1.81072E+00         1.08992E+00         6.43479E+00         1.00000E+00         4.47046E-05         6.43479E+00         2.26288E+00         4.17191E+00
+          1.73459E-02         2.54976E-02        -2.94950E-02         1.08952E+00         1.82139E+00         1.08992E+00         6.40655E+00         1.00000E+00         4.52728E-05         6.40655E+00         2.22768E+00         4.17887E+00
+          1.73459E-02         2.56675E-02        -2.97681E-02         1.08952E+00         1.83206E+00         1.08992E+00         6.37269E+00         1.00000E+00         4.58456E-05         6.37269E+00         2.18965E+00         4.18304E+00
+          1.73459E-02         2.58373E-02        -3.00429E-02         1.08951E+00         1.84273E+00         1.08993E+00         6.33325E+00         1.00000E+00         4.64226E-05         6.33325E+00         2.14900E+00         4.18425E+00
+          1.73459E-02         2.60071E-02        -3.03196E-02         1.08951E+00         1.85340E+00         1.08993E+00         6.28829E+00         1.00000E+00         4.70036E-05         6.28829E+00         2.10592E+00         4.18238E+00
+          1.73459E-02         2.61769E-02        -3.05980E-02         1.08950E+00         1.86407E+00         1.08993E+00         6.23788E+00         1.00000E+00         4.75883E-05         6.23788E+00         2.06061E+00         4.17728E+00
+          1.75158E-02         8.72665E-04        -9.28032E-03         1.10055E+00         2.74155E-01         1.10059E+00         1.60472E+02         1.00000E+00         6.66357E-06         1.60472E+02         4.33812E+01         1.17090E+02
+          1.75158E-02         1.04249E-03        -9.29054E-03         1.10055E+00         2.84826E-01         1.10059E+00         1.57737E+02         1.00000E+00         6.64721E-06         1.57737E+02         4.30628E+01         1.14675E+02
+          1.75158E-02         1.21232E-03        -9.30257E-03         1.10055E+00         2.95496E-01         1.10059E+00         1.54946E+02         1.00000E+00         6.63090E-06         1.54946E+02         4.27301E+01         1.12216E+02
+          1.75158E-02         1.38215E-03        -9.31641E-03         1.10055E+00         3.06167E-01         1.10059E+00         1.52101E+02         1.00000E+00         6.61474E-06         1.52101E+02         4.23829E+01         1.09718E+02
+          1.75158E-02         1.55197E-03        -9.33206E-03         1.10055E+00         3.16838E-01         1.10059E+00         1.49208E+02         1.00000E+00         6.59881E-06         1.49208E+02         4.20212E+01         1.07187E+02
+          1.75158E-02         1.72180E-03        -9.34952E-03         1.10055E+00         3.27508E-01         1.10059E+00         1.46272E+02         1.00000E+00         6.58319E-06         1.46272E+02         4.16449E+01         1.04627E+02
+          1.75158E-02         1.89163E-03        -9.36880E-03         1.10055E+00         3.38179E-01         1.10058E+00         1.43296E+02         1.00000E+00         6.56798E-06         1.43296E+02         4.12540E+01         1.02042E+02
+          1.75158E-02         2.06146E-03        -9.38988E-03         1.10054E+00         3.48849E-01         1.10058E+00         1.40285E+02         1.00000E+00         6.55326E-06         1.40285E+02         4.08485E+01         9.94368E+01
+          1.75158E-02         2.23128E-03        -9.41278E-03         1.10054E+00         3.59520E-01         1.10058E+00         1.37244E+02         1.00000E+00         6.53914E-06         1.37244E+02         4.04282E+01         9.68162E+01
+          1.75158E-02         2.40111E-03        -9.43750E-03         1.10054E+00         3.70190E-01         1.10058E+00         1.34178E+02         1.00000E+00         6.52572E-06         1.34178E+02         3.99934E+01         9.41845E+01
+          1.75158E-02         2.57094E-03        -9.46402E-03         1.10054E+00         3.80861E-01         1.10058E+00         1.31090E+02         1.00000E+00         6.51311E-06         1.31090E+02         3.95440E+01         9.15462E+01
+          1.75158E-02         2.74077E-03        -9.49235E-03         1.10054E+00         3.91532E-01         1.10058E+00         1.27986E+02         1.00000E+00         6.50140E-06         1.27986E+02         3.90801E+01         8.89056E+01
+          1.75158E-02         2.91059E-03        -9.52250E-03         1.10054E+00         4.02202E-01         1.10058E+00         1.24869E+02         1.00000E+00         6.49072E-06         1.24869E+02         3.86019E+01         8.62669E+01
+          1.75158E-02         3.08042E-03        -9.55446E-03         1.10054E+00         4.12873E-01         1.10058E+00         1.21744E+02         1.00000E+00         6.48117E-06         1.21744E+02         3.81095E+01         8.36343E+01
+          1.75158E-02         3.25025E-03        -9.58823E-03         1.10054E+00         4.23543E-01         1.10058E+00         1.18615E+02         1.00000E+00         6.47288E-06         1.18615E+02         3.76030E+01         8.10119E+01
+          1.75158E-02         3.42008E-03        -9.62381E-03         1.10054E+00         4.34214E-01         1.10058E+00         1.15486E+02         1.00000E+00         6.46596E-06         1.15486E+02         3.70827E+01         7.84036E+01
+          1.75158E-02         3.58990E-03        -9.66121E-03         1.10054E+00         4.44884E-01         1.10058E+00         1.12362E+02         1.00000E+00         6.46052E-06         1.12362E+02         3.65488E+01         7.58132E+01
+          1.75158E-02         3.75973E-03        -9.70042E-03         1.10054E+00         4.55555E-01         1.10058E+00         1.09246E+02         1.00000E+00         6.45670E-06         1.09246E+02         3.60016E+01         7.32445E+01
+          1.75158E-02         3.92956E-03        -9.74143E-03         1.10054E+00         4.66225E-01         1.10058E+00         1.06142E+02         1.00000E+00         6.45462E-06         1.06142E+02         3.54414E+01         7.07009E+01
+          1.75158E-02         4.09939E-03        -9.78426E-03         1.10054E+00         4.76896E-01         1.10058E+00         1.03054E+02         1.00000E+00         6.45440E-06         1.03054E+02         3.48686E+01         6.81858E+01
+          1.75158E-02         4.26921E-03        -9.82891E-03         1.10054E+00         4.87567E-01         1.10058E+00         9.99861E+01         1.00000E+00         6.45616E-06         9.99861E+01         3.42834E+01         6.57026E+01
+          1.75158E-02         4.43904E-03        -9.87536E-03         1.10054E+00         4.98237E-01         1.10058E+00         9.69408E+01         1.00000E+00         6.46003E-06         9.69408E+01         3.36864E+01         6.32543E+01
+          1.75158E-02         4.60887E-03        -9.92363E-03         1.10054E+00         5.08908E-01         1.10058E+00         9.39219E+01         1.00000E+00         6.46614E-06         9.39219E+01         3.30780E+01         6.08439E+01
+          1.75158E-02         4.77869E-03        -9.97371E-03         1.10053E+00         5.19578E-01         1.10058E+00         9.09326E+01         1.00000E+00         6.47460E-06         9.09326E+01         3.24586E+01         5.84740E+01
+          1.75158E-02         4.94852E-03        -1.00256E-02         1.10053E+00         5.30249E-01         1.10058E+00         8.79760E+01         1.00000E+00         6.48554E-06         8.79760E+01         3.18288E+01         5.61473E+01
+          1.75158E-02         5.11835E-03        -1.00793E-02         1.10053E+00         5.40919E-01         1.10058E+00         8.50551E+01         1.00000E+00         6.49908E-06         8.50551E+01         3.11890E+01         5.38661E+01
+          1.75158E-02         5.28818E-03        -1.01348E-02         1.10053E+00         5.51590E-01         1.10058E+00         8.21726E+01         1.00000E+00         6.51532E-06         8.21726E+01         3.05398E+01         5.16328E+01
+          1.75158E-02         5.45800E-03        -1.01921E-02         1.10053E+00         5.62261E-01         1.10058E+00         7.93312E+01         1.00000E+00         6.53439E-06         7.93312E+01         2.98819E+01         4.94492E+01
+          1.75158E-02         5.62783E-03        -1.02513E-02         1.10053E+00         5.72931E-01         1.10058E+00         7.65333E+01         1.00000E+00         6.55638E-06         7.65333E+01         2.92159E+01         4.73174E+01
+          1.75158E-02         5.79766E-03        -1.03122E-02         1.10053E+00         5.83602E-01         1.10058E+00         7.37813E+01         1.00000E+00         6.58140E-06         7.37813E+01         2.85423E+01         4.52390E+01
+          1.75158E-02         5.96749E-03        -1.03750E-02         1.10053E+00         5.94272E-01         1.10058E+00         7.10774E+01         1.00000E+00         6.60955E-06         7.10774E+01         2.78620E+01         4.32154E+01
+          1.75158E-02         6.13731E-03        -1.04396E-02         1.10053E+00         6.04943E-01         1.10058E+00         6.84235E+01         1.00000E+00         6.64092E-06         6.84235E+01         2.71755E+01         4.12480E+01
+          1.75158E-02         6.30714E-03        -1.05059E-02         1.10053E+00         6.15613E-01         1.10058E+00         6.58215E+01         1.00000E+00         6.67558E-06         6.58215E+01         2.64836E+01         3.93379E+01
+          1.75158E-02         6.47697E-03        -1.05741E-02         1.10052E+00         6.26284E-01         1.10057E+00         6.32731E+01         1.00000E+00         6.71363E-06         6.32731E+01         2.57870E+01         3.74861E+01
+          1.75158E-02         6.64680E-03        -1.06442E-02         1.10052E+00         6.36955E-01         1.10057E+00         6.07798E+01         1.00000E+00         6.75512E-06         6.07798E+01         2.50865E+01         3.56933E+01
+          1.75158E-02         6.81662E-03        -1.07160E-02         1.10052E+00         6.47625E-01         1.10057E+00         5.83430E+01         1.00000E+00         6.80011E-06         5.83430E+01         2.43829E+01         3.39601E+01
+          1.75158E-02         6.98645E-03        -1.07896E-02         1.10052E+00         6.58296E-01         1.10057E+00         5.59639E+01         1.00000E+00         6.84867E-06         5.59639E+01         2.36769E+01         3.22869E+01
+          1.75158E-02         7.15628E-03        -1.08651E-02         1.10052E+00         6.68966E-01         1.10057E+00         5.36435E+01         1.00000E+00         6.90084E-06         5.36435E+01         2.29694E+01         3.06741E+01
+          1.75158E-02         7.32611E-03        -1.09423E-02         1.10052E+00         6.79637E-01         1.10057E+00         5.13829E+01         1.00000E+00         6.95666E-06         5.13829E+01         2.22612E+01         2.91217E+01
+          1.75158E-02         7.49593E-03        -1.10214E-02         1.10052E+00         6.90307E-01         1.10057E+00         4.91826E+01         1.00000E+00         7.01615E-06         4.91826E+01         2.15530E+01         2.76297E+01
+          1.75158E-02         7.66576E-03        -1.11023E-02         1.10051E+00         7.00978E-01         1.10057E+00         4.70435E+01         1.00000E+00         7.07934E-06         4.70435E+01         2.08457E+01         2.61978E+01
+          1.75158E-02         7.83559E-03        -1.11850E-02         1.10051E+00         7.11649E-01         1.10057E+00         4.49658E+01         1.00000E+00         7.14624E-06         4.49658E+01         2.01402E+01         2.48256E+01
+          1.75158E-02         8.00542E-03        -1.12695E-02         1.10051E+00         7.22319E-01         1.10057E+00         4.29500E+01         1.00000E+00         7.21686E-06         4.29500E+01         1.94372E+01         2.35128E+01
+          1.75158E-02         8.17524E-03        -1.13558E-02         1.10051E+00         7.32990E-01         1.10057E+00         4.09962E+01         1.00000E+00         7.29119E-06         4.09962E+01         1.87376E+01         2.22586E+01
+          1.75158E-02         8.34507E-03        -1.14439E-02         1.10051E+00         7.43660E-01         1.10057E+00         3.91046E+01         1.00000E+00         7.36924E-06         3.91046E+01         1.80422E+01         2.10623E+01
+          1.75158E-02         8.51490E-03        -1.15339E-02         1.10051E+00         7.54331E-01         1.10057E+00         3.72750E+01         1.00000E+00         7.45098E-06         3.72750E+01         1.73519E+01         1.99231E+01
+          1.75158E-02         8.68473E-03        -1.16256E-02         1.10051E+00         7.65001E-01         1.10057E+00         3.55073E+01         1.00000E+00         7.53640E-06         3.55073E+01         1.66674E+01         1.88399E+01
+          1.75158E-02         8.85455E-03        -1.17192E-02         1.10050E+00         7.75672E-01         1.10057E+00         3.38012E+01         1.00000E+00         7.62547E-06         3.38012E+01         1.59896E+01         1.78116E+01
+          1.75158E-02         9.02438E-03        -1.18146E-02         1.10050E+00         7.86343E-01         1.10057E+00         3.21563E+01         1.00000E+00         7.71816E-06         3.21563E+01         1.53192E+01         1.68371E+01
+          1.75158E-02         9.19421E-03        -1.19117E-02         1.10050E+00         7.97013E-01         1.10057E+00         3.05721E+01         1.00000E+00         7.81445E-06         3.05721E+01         1.46570E+01         1.59151E+01
+          1.75158E-02         9.36403E-03        -1.20107E-02         1.10050E+00         8.07684E-01         1.10056E+00         2.90480E+01         1.00000E+00         7.91429E-06         2.90480E+01         1.40038E+01         1.50442E+01
+          1.75158E-02         9.53386E-03        -1.21116E-02         1.10050E+00         8.18354E-01         1.10056E+00         2.75832E+01         1.00000E+00         8.01766E-06         2.75832E+01         1.33603E+01         1.42229E+01
+          1.75158E-02         9.70369E-03        -1.22142E-02         1.10050E+00         8.29025E-01         1.10056E+00         2.61771E+01         1.00000E+00         8.12451E-06         2.61771E+01         1.27272E+01         1.34499E+01
+          1.75158E-02         9.87352E-03        -1.23186E-02         1.10049E+00         8.39695E-01         1.10056E+00         2.48288E+01         1.00000E+00         8.23481E-06         2.48288E+01         1.21052E+01         1.27235E+01
+          1.75158E-02         1.00433E-02        -1.24249E-02         1.10049E+00         8.50366E-01         1.10056E+00         2.35372E+01         1.00000E+00         8.34852E-06         2.35372E+01         1.14950E+01         1.20422E+01
+          1.75158E-02         1.02132E-02        -1.25329E-02         1.10049E+00         8.61037E-01         1.10056E+00         2.23014E+01         1.00000E+00         8.46561E-06         2.23014E+01         1.08972E+01         1.14042E+01
+          1.75158E-02         1.03830E-02        -1.26428E-02         1.10049E+00         8.71707E-01         1.10056E+00         2.11204E+01         1.00000E+00         8.58604E-06         2.11204E+01         1.03125E+01         1.08079E+01
+          1.75158E-02         1.05528E-02        -1.27545E-02         1.10049E+00         8.82378E-01         1.10056E+00         1.99930E+01         1.00000E+00         8.70980E-06         1.99930E+01         9.74131E+00         1.02517E+01
+          1.75158E-02         1.07227E-02        -1.28680E-02         1.10048E+00         8.93048E-01         1.10056E+00         1.89180E+01         1.00000E+00         8.83685E-06         1.89180E+01         9.18431E+00         9.73370E+00
+          1.75158E-02         1.08925E-02        -1.29833E-02         1.10048E+00         9.03719E-01         1.10056E+00         1.78942E+01         1.00000E+00         8.96718E-06         1.78942E+01         8.64197E+00         9.25225E+00
+          1.75158E-02         1.10623E-02        -1.31004E-02         1.10048E+00         9.14389E-01         1.10056E+00         1.69204E+01         1.00000E+00         9.10077E-06         1.69204E+01         8.11477E+00         8.80559E+00
+          1.75158E-02         1.12321E-02        -1.32194E-02         1.10048E+00         9.25060E-01         1.10056E+00         1.59952E+01         1.00000E+00         9.23762E-06         1.59952E+01         7.60317E+00         8.39199E+00
+          1.75158E-02         1.14020E-02        -1.33401E-02         1.10048E+00         9.35731E-01         1.10056E+00         1.51173E+01         1.00000E+00         9.37773E-06         1.51173E+01         7.10756E+00         8.00971E+00
+          1.75158E-02         1.15718E-02        -1.34627E-02         1.10047E+00         9.46401E-01         1.10056E+00         1.42853E+01         1.00000E+00         9.52112E-06         1.42853E+01         6.62830E+00         7.65702E+00
+          1.75158E-02         1.17416E-02        -1.35871E-02         1.10047E+00         9.57072E-01         1.10056E+00         1.34980E+01         1.00000E+00         9.66779E-06         1.34980E+01         6.16574E+00         7.33225E+00
+          1.75158E-02         1.19114E-02        -1.37132E-02         1.10047E+00         9.67742E-01         1.10055E+00         1.27539E+01         1.00000E+00         9.81777E-06         1.27539E+01         5.72016E+00         7.03370E+00
+          1.75158E-02         1.20813E-02        -1.38412E-02         1.10047E+00         9.78413E-01         1.10055E+00         1.20515E+01         1.00000E+00         9.97111E-06         1.20515E+01         5.29180E+00         6.75974E+00
+          1.75158E-02         1.22511E-02        -1.39711E-02         1.10046E+00         9.89083E-01         1.10055E+00         1.13896E+01         1.00000E+00         1.01278E-05         1.13896E+01         4.88087E+00         6.50876E+00
+          1.75158E-02         1.24209E-02        -1.41027E-02         1.10046E+00         9.99754E-01         1.10055E+00         1.07667E+01         1.00000E+00         1.02880E-05         1.07667E+01         4.48755E+00         6.27919E+00
+          1.75158E-02         1.25908E-02        -1.42361E-02         1.10046E+00         1.01042E+00         1.10055E+00         1.01815E+01         1.00000E+00         1.04517E-05         1.01815E+01         4.11195E+00         6.06952E+00
+          1.75158E-02         1.27606E-02        -1.43714E-02         1.10046E+00         1.02110E+00         1.10055E+00         9.63244E+00         1.00000E+00         1.06190E-05         9.63244E+00         3.75417E+00         5.87827E+00
+          1.75158E-02         1.29304E-02        -1.45084E-02         1.10046E+00         1.03177E+00         1.10055E+00         9.11826E+00         1.00000E+00         1.07899E-05         9.11826E+00         3.41424E+00         5.70402E+00
+          1.75158E-02         1.31002E-02        -1.46473E-02         1.10045E+00         1.04244E+00         1.10055E+00         8.63757E+00         1.00000E+00         1.09645E-05         8.63757E+00         3.09218E+00         5.54540E+00
+          1.75158E-02         1.32701E-02        -1.47880E-02         1.10045E+00         1.05311E+00         1.10055E+00         8.18903E+00         1.00000E+00         1.11430E-05         8.18903E+00         2.78794E+00         5.40109E+00
+          1.75158E-02         1.34399E-02        -1.49305E-02         1.10045E+00         1.06378E+00         1.10055E+00         7.77131E+00         1.00000E+00         1.13254E-05         7.77131E+00         2.50146E+00         5.26985E+00
+          1.75158E-02         1.36097E-02        -1.50748E-02         1.10045E+00         1.07445E+00         1.10055E+00         7.38310E+00         1.00000E+00         1.15119E-05         7.38310E+00         2.23262E+00         5.15048E+00
+          1.75158E-02         1.37795E-02        -1.52209E-02         1.10044E+00         1.08512E+00         1.10055E+00         7.02313E+00         1.00000E+00         1.17024E-05         7.02313E+00         1.98127E+00         5.04186E+00
+          1.75158E-02         1.39494E-02        -1.53688E-02         1.10044E+00         1.09579E+00         1.10055E+00         6.69013E+00         1.00000E+00         1.18973E-05         6.69013E+00         1.74721E+00         4.94292E+00
+          1.75158E-02         1.41192E-02        -1.55186E-02         1.10044E+00         1.10646E+00         1.10055E+00         6.38290E+00         1.00000E+00         1.20964E-05         6.38290E+00         1.53024E+00         4.85266E+00
+          1.75158E-02         1.42890E-02        -1.56701E-02         1.10043E+00         1.11713E+00         1.10055E+00         6.10022E+00         1.00000E+00         1.23001E-05         6.10022E+00         1.33008E+00         4.77015E+00
+          1.75158E-02         1.44589E-02        -1.58235E-02         1.10043E+00         1.12780E+00         1.10055E+00         5.84095E+00         1.00000E+00         1.25082E-05         5.84095E+00         1.14644E+00         4.69451E+00
+          1.75158E-02         1.46287E-02        -1.59787E-02         1.10043E+00         1.13847E+00         1.10055E+00         5.60395E+00         1.00000E+00         1.27211E-05         5.60395E+00         9.79008E-01         4.62494E+00
+          1.75158E-02         1.47985E-02        -1.61357E-02         1.10043E+00         1.14914E+00         1.10054E+00         5.38812E+00         1.00000E+00         1.29387E-05         5.38812E+00         8.27421E-01         4.56069E+00
+          1.75158E-02         1.49683E-02        -1.62945E-02         1.10042E+00         1.15981E+00         1.10054E+00         5.19240E+00         1.00000E+00         1.31612E-05         5.19240E+00         6.91298E-01         4.50110E+00
+          1.75158E-02         1.51382E-02        -1.64551E-02         1.10042E+00         1.17048E+00         1.10054E+00         5.01576E+00         1.00000E+00         1.33885E-05         5.01576E+00         5.70227E-01         4.44553E+00
+          1.75158E-02         1.53080E-02        -1.66175E-02         1.10042E+00         1.18115E+00         1.10054E+00         4.85721E+00         1.00000E+00         1.36209E-05         4.85721E+00         4.63771E-01         4.39344E+00
+          1.75158E-02         1.54778E-02        -1.67818E-02         1.10042E+00         1.19182E+00         1.10054E+00         4.71579E+00         1.00000E+00         1.38584E-05         4.71579E+00         3.71470E-01         4.34432E+00
+          1.75158E-02         1.56476E-02        -1.69478E-02         1.10041E+00         1.20249E+00         1.10054E+00         4.59058E+00         1.00000E+00         1.41009E-05         4.59058E+00         2.92839E-01         4.29774E+00
+          1.75158E-02         1.58175E-02        -1.71157E-02         1.10041E+00         1.21317E+00         1.10054E+00         4.48069E+00         1.00000E+00         1.43486E-05         4.48069E+00         2.27377E-01         4.25331E+00
+          1.75158E-02         1.59873E-02        -1.72854E-02         1.10041E+00         1.22384E+00         1.10054E+00         4.38526E+00         1.00000E+00         1.46014E-05         4.38526E+00         1.74560E-01         4.21070E+00
+          1.75158E-02         1.61571E-02        -1.74569E-02         1.10040E+00         1.23451E+00         1.10054E+00         4.30348E+00         1.00000E+00         1.48594E-05         4.30348E+00         1.33852E-01         4.16962E+00
+          1.75158E-02         1.63270E-02        -1.76302E-02         1.10040E+00         1.24518E+00         1.10054E+00         4.23454E+00         1.00000E+00         1.51226E-05         4.23454E+00         1.04698E-01         4.12984E+00
+          1.75158E-02         1.64968E-02        -1.78053E-02         1.10040E+00         1.25585E+00         1.10054E+00         4.17771E+00         1.00000E+00         1.53909E-05         4.17771E+00         8.65330E-02         4.09117E+00
+          1.75158E-02         1.66666E-02        -1.79823E-02         1.10039E+00         1.26652E+00         1.10054E+00         4.13224E+00         1.00000E+00         1.56642E-05         4.13224E+00         7.87815E-02         4.05346E+00
+          1.75158E-02         1.68364E-02        -1.81610E-02         1.10039E+00         1.27719E+00         1.10054E+00         4.09746E+00         1.00000E+00         1.59425E-05         4.09746E+00         8.08583E-02         4.01660E+00
+          1.75158E-02         1.70063E-02        -1.83416E-02         1.10039E+00         1.28786E+00         1.10054E+00         4.07268E+00         1.00000E+00         1.62258E-05         4.07268E+00         9.21719E-02         3.98051E+00
+          1.75158E-02         1.71761E-02        -1.85239E-02         1.10038E+00         1.29853E+00         1.10054E+00         4.05728E+00         1.00000E+00         1.65139E-05         4.05728E+00         1.12126E-01         3.94516E+00
+          1.75158E-02         1.73459E-02        -1.87081E-02         1.10038E+00         1.30920E+00         1.10054E+00         4.05065E+00         1.00000E+00         1.68068E-05         4.05065E+00         1.40122E-01         3.91053E+00
+          1.75158E-02         1.75158E-02        -1.88941E-02         1.10038E+00         1.31987E+00         1.10054E+00         4.05219E+00         1.00000E+00         1.71042E-05         4.05219E+00         1.75558E-01         3.87664E+00
+          1.75158E-02         1.76856E-02        -1.90819E-02         1.10037E+00         1.33054E+00         1.10054E+00         4.06136E+00         1.00000E+00         1.74062E-05         4.06136E+00         2.17838E-01         3.84352E+00
+          1.75158E-02         1.78554E-02        -1.92715E-02         1.10037E+00         1.34121E+00         1.10054E+00         4.07760E+00         1.00000E+00         1.77124E-05         4.07760E+00         2.66363E-01         3.81124E+00
+          1.75158E-02         1.80252E-02        -1.94630E-02         1.10037E+00         1.35188E+00         1.10054E+00         4.10041E+00         1.00000E+00         1.80228E-05         4.10041E+00         3.20542E-01         3.77987E+00
+          1.75158E-02         1.81951E-02        -1.96562E-02         1.10036E+00         1.36255E+00         1.10054E+00         4.12930E+00         1.00000E+00         1.83373E-05         4.12930E+00         3.79790E-01         3.74951E+00
+          1.75158E-02         1.83649E-02        -1.98513E-02         1.10036E+00         1.37322E+00         1.10054E+00         4.16377E+00         1.00000E+00         1.86556E-05         4.16377E+00         4.43529E-01         3.72024E+00
+          1.75158E-02         1.85347E-02        -2.00482E-02         1.10036E+00         1.38389E+00         1.10054E+00         4.20339E+00         1.00000E+00         1.89776E-05         4.20339E+00         5.11191E-01         3.69220E+00
+          1.75158E-02         1.87045E-02        -2.02468E-02         1.10035E+00         1.39457E+00         1.10054E+00         4.24770E+00         1.00000E+00         1.93031E-05         4.24770E+00         5.82219E-01         3.66548E+00
+          1.75158E-02         1.88744E-02        -2.04473E-02         1.10035E+00         1.40524E+00         1.10054E+00         4.29628E+00         1.00000E+00         1.96320E-05         4.29628E+00         6.56068E-01         3.64022E+00
+          1.75158E-02         1.90442E-02        -2.06497E-02         1.10035E+00         1.41591E+00         1.10054E+00         4.34873E+00         1.00000E+00         1.99640E-05         4.34873E+00         7.32207E-01         3.61652E+00
+          1.75158E-02         1.92140E-02        -2.08538E-02         1.10034E+00         1.42658E+00         1.10054E+00         4.40464E+00         1.00000E+00         2.02991E-05         4.40464E+00         8.10122E-01         3.59452E+00
+          1.75158E-02         1.93839E-02        -2.10597E-02         1.10034E+00         1.43725E+00         1.10054E+00         4.46363E+00         1.00000E+00         2.06370E-05         4.46363E+00         8.89312E-01         3.57432E+00
+          1.75158E-02         1.95537E-02        -2.12675E-02         1.10034E+00         1.44792E+00         1.10054E+00         4.52533E+00         1.00000E+00         2.09777E-05         4.52533E+00         9.69296E-01         3.55603E+00
+          1.75158E-02         1.97235E-02        -2.14770E-02         1.10033E+00         1.45859E+00         1.10054E+00         4.58937E+00         1.00000E+00         2.13210E-05         4.58937E+00         1.04961E+00         3.53976E+00
+          1.75158E-02         1.98933E-02        -2.16884E-02         1.10033E+00         1.46926E+00         1.10054E+00         4.65540E+00         1.00000E+00         2.16668E-05         4.65540E+00         1.12981E+00         3.52559E+00
+          1.75158E-02         2.00632E-02        -2.19016E-02         1.10033E+00         1.47993E+00         1.10054E+00         4.72308E+00         1.00000E+00         2.20151E-05         4.72308E+00         1.20947E+00         3.51361E+00
+          1.75158E-02         2.02330E-02        -2.21166E-02         1.10032E+00         1.49060E+00         1.10054E+00         4.79208E+00         1.00000E+00         2.23657E-05         4.79208E+00         1.28820E+00         3.50388E+00
+          1.75158E-02         2.04028E-02        -2.23334E-02         1.10032E+00         1.50127E+00         1.10054E+00         4.86206E+00         1.00000E+00         2.27185E-05         4.86206E+00         1.36560E+00         3.49646E+00
+          1.75158E-02         2.05726E-02        -2.25520E-02         1.10031E+00         1.51194E+00         1.10055E+00         4.93271E+00         1.00000E+00         2.30736E-05         4.93271E+00         1.44133E+00         3.49138E+00
+          1.75158E-02         2.07425E-02        -2.27725E-02         1.10031E+00         1.52261E+00         1.10055E+00         5.00371E+00         1.00000E+00         2.34310E-05         5.00371E+00         1.51503E+00         3.48868E+00
+          1.75158E-02         2.09123E-02        -2.29947E-02         1.10031E+00         1.53328E+00         1.10055E+00         5.07476E+00         1.00000E+00         2.37905E-05         5.07476E+00         1.58641E+00         3.48835E+00
+          1.75158E-02         2.10821E-02        -2.32188E-02         1.10030E+00         1.54395E+00         1.10055E+00         5.14556E+00         1.00000E+00         2.41524E-05         5.14556E+00         1.65517E+00         3.49039E+00
+          1.75158E-02         2.12520E-02        -2.34447E-02         1.10030E+00         1.55462E+00         1.10055E+00         5.21581E+00         1.00000E+00         2.45165E-05         5.21581E+00         1.72105E+00         3.49477E+00
+          1.75158E-02         2.14218E-02        -2.36724E-02         1.10029E+00         1.56529E+00         1.10055E+00         5.28523E+00         1.00000E+00         2.48831E-05         5.28523E+00         1.78379E+00         3.50144E+00
+          1.75158E-02         2.15916E-02        -2.39019E-02         1.10029E+00         1.57596E+00         1.10055E+00         5.35354E+00         1.00000E+00         2.52521E-05         5.35354E+00         1.84319E+00         3.51035E+00
+          1.75158E-02         2.17614E-02        -2.41332E-02         1.10029E+00         1.58664E+00         1.10055E+00         5.42046E+00         1.00000E+00         2.56238E-05         5.42046E+00         1.89905E+00         3.52141E+00
+          1.75158E-02         2.19313E-02        -2.43663E-02         1.10028E+00         1.59731E+00         1.10055E+00         5.48571E+00         1.00000E+00         2.59981E-05         5.48571E+00         1.95119E+00         3.53453E+00
+          1.75158E-02         2.21011E-02        -2.46013E-02         1.10028E+00         1.60798E+00         1.10055E+00         5.54906E+00         1.00000E+00         2.63753E-05         5.54906E+00         1.99946E+00         3.54960E+00
+          1.75158E-02         2.22709E-02        -2.48380E-02         1.10027E+00         1.61865E+00         1.10055E+00         5.61022E+00         1.00000E+00         2.67555E-05         5.61022E+00         2.04374E+00         3.56648E+00
+          1.75158E-02         2.24407E-02        -2.50766E-02         1.10027E+00         1.62932E+00         1.10056E+00         5.66896E+00         1.00000E+00         2.71389E-05         5.66896E+00         2.08392E+00         3.58504E+00
+          1.75158E-02         2.26106E-02        -2.53170E-02         1.10027E+00         1.63999E+00         1.10056E+00         5.72505E+00         1.00000E+00         2.75257E-05         5.72505E+00         2.11992E+00         3.60512E+00
+          1.75158E-02         2.27804E-02        -2.55592E-02         1.10026E+00         1.65066E+00         1.10056E+00         5.77823E+00         1.00000E+00         2.79160E-05         5.77823E+00         2.15168E+00         3.62655E+00
+          1.75158E-02         2.29502E-02        -2.58032E-02         1.10026E+00         1.66133E+00         1.10056E+00         5.82829E+00         1.00000E+00         2.83099E-05         5.82829E+00         2.17915E+00         3.64914E+00
+          1.75158E-02         2.31201E-02        -2.60490E-02         1.10025E+00         1.67200E+00         1.10056E+00         5.87502E+00         1.00000E+00         2.87078E-05         5.87502E+00         2.20232E+00         3.67270E+00
+          1.75158E-02         2.32899E-02        -2.62967E-02         1.10025E+00         1.68267E+00         1.10056E+00         5.91821E+00         1.00000E+00         2.91096E-05         5.91821E+00         2.22118E+00         3.69703E+00
+          1.75158E-02         2.34597E-02        -2.65461E-02         1.10024E+00         1.69334E+00         1.10056E+00         5.95766E+00         1.00000E+00         2.95157E-05         5.95766E+00         2.23575E+00         3.72191E+00
+          1.75158E-02         2.36295E-02        -2.67974E-02         1.10024E+00         1.70401E+00         1.10057E+00         5.99319E+00         1.00000E+00         2.99260E-05         5.99319E+00         2.24607E+00         3.74712E+00
+          1.75158E-02         2.37994E-02        -2.70505E-02         1.10024E+00         1.71468E+00         1.10057E+00         6.02462E+00         1.00000E+00         3.03408E-05         6.02462E+00         2.25217E+00         3.77244E+00
+          1.75158E-02         2.39692E-02        -2.73054E-02         1.10023E+00         1.72535E+00         1.10057E+00         6.05178E+00         1.00000E+00         3.07602E-05         6.05178E+00         2.25414E+00         3.79764E+00
+          1.75158E-02         2.41390E-02        -2.75621E-02         1.10023E+00         1.73602E+00         1.10057E+00         6.07454E+00         1.00000E+00         3.11841E-05         6.07454E+00         2.25206E+00         3.82248E+00
+          1.75158E-02         2.43088E-02        -2.78206E-02         1.10022E+00         1.74669E+00         1.10057E+00         6.09274E+00         1.00000E+00         3.16127E-05         6.09274E+00         2.24601E+00         3.84673E+00
+          1.75158E-02         2.44787E-02        -2.80809E-02         1.10022E+00         1.75736E+00         1.10058E+00         6.10626E+00         1.00000E+00         3.20459E-05         6.10626E+00         2.23610E+00         3.87015E+00
+          1.75158E-02         2.46485E-02        -2.83431E-02         1.10021E+00         1.76804E+00         1.10058E+00         6.11499E+00         1.00000E+00         3.24838E-05         6.11499E+00         2.22247E+00         3.89252E+00
+          1.75158E-02         2.48183E-02        -2.86070E-02         1.10021E+00         1.77871E+00         1.10058E+00         6.11883E+00         1.00000E+00         3.29262E-05         6.11883E+00         2.20524E+00         3.91359E+00
+          1.75158E-02         2.49882E-02        -2.88728E-02         1.10020E+00         1.78938E+00         1.10058E+00         6.11770E+00         1.00000E+00         3.33732E-05         6.11770E+00         2.18455E+00         3.93315E+00
+          1.75158E-02         2.51580E-02        -2.91404E-02         1.10020E+00         1.80005E+00         1.10058E+00         6.11152E+00         1.00000E+00         3.38245E-05         6.11152E+00         2.16055E+00         3.95097E+00
+          1.75158E-02         2.53278E-02        -2.94098E-02         1.10019E+00         1.81072E+00         1.10059E+00         6.10025E+00         1.00000E+00         3.42800E-05         6.10025E+00         2.13341E+00         3.96684E+00
+          1.75158E-02         2.54976E-02        -2.96810E-02         1.10019E+00         1.82139E+00         1.10059E+00         6.08385E+00         1.00000E+00         3.47395E-05         6.08385E+00         2.10329E+00         3.98056E+00
+          1.75158E-02         2.56675E-02        -2.99540E-02         1.10018E+00         1.83206E+00         1.10059E+00         6.06229E+00         1.00000E+00         3.52028E-05         6.06229E+00         2.07036E+00         3.99193E+00
+          1.75158E-02         2.58373E-02        -3.02289E-02         1.10018E+00         1.84273E+00         1.10059E+00         6.03556E+00         1.00000E+00         3.56696E-05         6.03556E+00         2.03481E+00         4.00076E+00
+          1.75158E-02         2.60071E-02        -3.05055E-02         1.10017E+00         1.85340E+00         1.10060E+00         6.00368E+00         1.00000E+00         3.61397E-05         6.00368E+00         1.99680E+00         4.00688E+00
+          1.75158E-02         2.61769E-02        -3.07840E-02         1.10017E+00         1.86407E+00         1.10060E+00         5.96668E+00         1.00000E+00         3.66125E-05         5.96668E+00         1.95654E+00         4.01014E+00
+          1.76856E-02         8.72665E-04        -9.46816E-03         1.11122E+00         2.74155E-01         1.11126E+00         1.55165E+02         1.00000E+00         4.71805E-06         1.55165E+02         3.83827E+01         1.16783E+02
+          1.76856E-02         1.04249E-03        -9.47838E-03         1.11122E+00         2.84826E-01         1.11126E+00         1.52510E+02         1.00000E+00         4.70695E-06         1.52510E+02         3.81415E+01         1.14369E+02
+          1.76856E-02         1.21232E-03        -9.49040E-03         1.11122E+00         2.95496E-01         1.11126E+00         1.49800E+02         1.00000E+00         4.69594E-06         1.49800E+02         3.78880E+01         1.11912E+02
+          1.76856E-02         1.38215E-03        -9.50424E-03         1.11122E+00         3.06167E-01         1.11126E+00         1.47039E+02         1.00000E+00         4.68508E-06         1.47039E+02         3.76222E+01         1.09417E+02
+          1.76856E-02         1.55197E-03        -9.51990E-03         1.11122E+00         3.16838E-01         1.11126E+00         1.44231E+02         1.00000E+00         4.67443E-06         1.44231E+02         3.73436E+01         1.06888E+02
+          1.76856E-02         1.72180E-03        -9.53736E-03         1.11122E+00         3.27508E-01         1.11126E+00         1.41381E+02         1.00000E+00         4.66406E-06         1.41381E+02         3.70523E+01         1.04329E+02
+          1.76856E-02         1.89163E-03        -9.55664E-03         1.11122E+00         3.38179E-01         1.11126E+00         1.38493E+02         1.00000E+00         4.65404E-06         1.38493E+02         3.67480E+01         1.01745E+02
+          1.76856E-02         2.06146E-03        -9.57772E-03         1.11122E+00         3.48849E-01         1.11126E+00         1.35572E+02         1.00000E+00         4.64445E-06         1.35572E+02         3.64306E+01         9.91417E+01
+          1.76856E-02         2.23128E-03        -9.60062E-03         1.11121E+00         3.59520E-01         1.11126E+00         1.32622E+02         1.00000E+00         4.63536E-06         1.32622E+02         3.61001E+01         9.65222E+01
+          1.76856E-02         2.40111E-03        -9.62533E-03         1.11121E+00         3.70190E-01         1.11126E+00         1.29648E+02         1.00000E+00         4.62684E-06         1.29648E+02         3.57563E+01         9.38915E+01
+          1.76856E-02         2.57094E-03        -9.65186E-03         1.11121E+00         3.80861E-01         1.11126E+00         1.26653E+02         1.00000E+00         4.61899E-06         1.26653E+02         3.53992E+01         9.12540E+01
+          1.76856E-02         2.74077E-03        -9.68019E-03         1.11121E+00         3.91532E-01         1.11126E+00         1.23643E+02         1.00000E+00         4.61187E-06         1.23643E+02         3.50289E+01         8.86139E+01
+          1.76856E-02         2.91059E-03        -9.71034E-03         1.11121E+00         4.02202E-01         1.11126E+00         1.20621E+02         1.00000E+00         4.60559E-06         1.20621E+02         3.46452E+01         8.59756E+01
+          1.76856E-02         3.08042E-03        -9.74230E-03         1.11121E+00         4.12873E-01         1.11126E+00         1.17591E+02         1.00000E+00         4.60022E-06         1.17591E+02         3.42482E+01         8.33433E+01
+          1.76856E-02         3.25025E-03        -9.77607E-03         1.11121E+00         4.23543E-01         1.11125E+00         1.14559E+02         1.00000E+00         4.59585E-06         1.14559E+02         3.38380E+01         8.07209E+01
+          1.76856E-02         3.42008E-03        -9.81165E-03         1.11121E+00         4.34214E-01         1.11125E+00         1.11527E+02         1.00000E+00         4.59258E-06         1.11527E+02         3.34147E+01         7.81124E+01
+          1.76856E-02         3.58990E-03        -9.84905E-03         1.11121E+00         4.44884E-01         1.11125E+00         1.08500E+02         1.00000E+00         4.59049E-06         1.08500E+02         3.29784E+01         7.55218E+01
+          1.76856E-02         3.75973E-03        -9.88825E-03         1.11121E+00         4.55555E-01         1.11125E+00         1.05482E+02         1.00000E+00         4.58969E-06         1.05482E+02         3.25293E+01         7.29525E+01
+          1.76856E-02         3.92956E-03        -9.92927E-03         1.11121E+00         4.66225E-01         1.11125E+00         1.02476E+02         1.00000E+00         4.59025E-06         1.02476E+02         3.20675E+01         7.04083E+01
+          1.76856E-02         4.09939E-03        -9.97210E-03         1.11121E+00         4.76896E-01         1.11125E+00         9.94859E+01         1.00000E+00         4.59228E-06         9.94859E+01         3.15933E+01         6.78926E+01
+          1.76856E-02         4.26921E-03        -1.00167E-02         1.11121E+00         4.87567E-01         1.11125E+00         9.65156E+01         1.00000E+00         4.59587E-06         9.65156E+01         3.11070E+01         6.54085E+01
+          1.76856E-02         4.43904E-03        -1.00632E-02         1.11121E+00         4.98237E-01         1.11125E+00         9.35681E+01         1.00000E+00         4.60110E-06         9.35681E+01         3.06089E+01         6.29593E+01
+          1.76856E-02         4.60887E-03        -1.01115E-02         1.11121E+00         5.08908E-01         1.11125E+00         9.06469E+01         1.00000E+00         4.60807E-06         9.06469E+01         3.00992E+01         6.05477E+01
+          1.76856E-02         4.77869E-03        -1.01615E-02         1.11120E+00         5.19578E-01         1.11125E+00         8.77551E+01         1.00000E+00         4.61686E-06         8.77551E+01         2.95784E+01         5.81767E+01
+          1.76856E-02         4.94852E-03        -1.02134E-02         1.11120E+00         5.30249E-01         1.11125E+00         8.48956E+01         1.00000E+00         4.62757E-06         8.48956E+01         2.90467E+01         5.58489E+01
+          1.76856E-02         5.11835E-03        -1.02671E-02         1.11120E+00         5.40919E-01         1.11125E+00         8.20713E+01         1.00000E+00         4.64028E-06         8.20713E+01         2.85048E+01         5.35665E+01
+          1.76856E-02         5.28818E-03        -1.03226E-02         1.11120E+00         5.51590E-01         1.11125E+00         7.92849E+01         1.00000E+00         4.65506E-06         7.92849E+01         2.79529E+01         5.13320E+01
+          1.76856E-02         5.45800E-03        -1.03800E-02         1.11120E+00         5.62261E-01         1.11125E+00         7.65389E+01         1.00000E+00         4.67199E-06         7.65389E+01         2.73916E+01         4.91473E+01
+          1.76856E-02         5.62783E-03        -1.04391E-02         1.11120E+00         5.72931E-01         1.11125E+00         7.38358E+01         1.00000E+00         4.69115E-06         7.38358E+01         2.68215E+01         4.70143E+01
+          1.76856E-02         5.79766E-03        -1.05001E-02         1.11120E+00         5.83602E-01         1.11125E+00         7.11777E+01         1.00000E+00         4.71260E-06         7.11777E+01         2.62430E+01         4.49348E+01
+          1.76856E-02         5.96749E-03        -1.05628E-02         1.11120E+00         5.94272E-01         1.11125E+00         6.85669E+01         1.00000E+00         4.73641E-06         6.85669E+01         2.56567E+01         4.29102E+01
+          1.76856E-02         6.13731E-03        -1.06274E-02         1.11120E+00         6.04943E-01         1.11125E+00         6.60051E+01         1.00000E+00         4.76264E-06         6.60051E+01         2.50632E+01         4.09419E+01
+          1.76856E-02         6.30714E-03        -1.06938E-02         1.11120E+00         6.15613E-01         1.11125E+00         6.34942E+01         1.00000E+00         4.79133E-06         6.34942E+01         2.44632E+01         3.90311E+01
+          1.76856E-02         6.47697E-03        -1.07620E-02         1.11119E+00         6.26284E-01         1.11125E+00         6.10359E+01         1.00000E+00         4.82253E-06         6.10359E+01         2.38572E+01         3.71786E+01
+          1.76856E-02         6.64680E-03        -1.08320E-02         1.11119E+00         6.36955E-01         1.11125E+00         5.86314E+01         1.00000E+00         4.85630E-06         5.86314E+01         2.32460E+01         3.53854E+01
+          1.76856E-02         6.81662E-03        -1.09038E-02         1.11119E+00         6.47625E-01         1.11125E+00         5.62823E+01         1.00000E+00         4.89265E-06         5.62823E+01         2.26303E+01         3.36520E+01
+          1.76856E-02         6.98645E-03        -1.09774E-02         1.11119E+00         6.58296E-01         1.11124E+00         5.39896E+01         1.00000E+00         4.93162E-06         5.39896E+01         2.20107E+01         3.19789E+01
+          1.76856E-02         7.15628E-03        -1.10529E-02         1.11119E+00         6.68966E-01         1.11124E+00         5.17543E+01         1.00000E+00         4.97324E-06         5.17543E+01         2.13880E+01         3.03663E+01
+          1.76856E-02         7.32611E-03        -1.11301E-02         1.11119E+00         6.79637E-01         1.11124E+00         4.95772E+01         1.00000E+00         5.01752E-06         4.95772E+01         2.07628E+01         2.88144E+01
+          1.76856E-02         7.49593E-03        -1.12092E-02         1.11119E+00         6.90307E-01         1.11124E+00         4.74592E+01         1.00000E+00         5.06447E-06         4.74592E+01         2.01360E+01         2.73231E+01
+          1.76856E-02         7.66576E-03        -1.12901E-02         1.11118E+00         7.00978E-01         1.11124E+00         4.54006E+01         1.00000E+00         5.11410E-06         4.54006E+01         1.95083E+01         2.58923E+01
+          1.76856E-02         7.83559E-03        -1.13728E-02         1.11118E+00         7.11649E-01         1.11124E+00         4.34021E+01         1.00000E+00         5.16641E-06         4.34021E+01         1.88805E+01         2.45216E+01
+          1.76856E-02         8.00542E-03        -1.14573E-02         1.11118E+00         7.22319E-01         1.11124E+00         4.14638E+01         1.00000E+00         5.22140E-06         4.14638E+01         1.82533E+01         2.32105E+01
+          1.76856E-02         8.17524E-03        -1.15436E-02         1.11118E+00         7.32990E-01         1.11124E+00         3.95858E+01         1.00000E+00         5.27905E-06         3.95858E+01         1.76275E+01         2.19584E+01
+          1.76856E-02         8.34507E-03        -1.16317E-02         1.11118E+00         7.43660E-01         1.11124E+00         3.77684E+01         1.00000E+00         5.33937E-06         3.77684E+01         1.70038E+01         2.07645E+01
+          1.76856E-02         8.51490E-03        -1.17217E-02         1.11118E+00         7.54331E-01         1.11124E+00         3.60112E+01         1.00000E+00         5.40232E-06         3.60112E+01         1.63832E+01         1.96281E+01
+          1.76856E-02         8.68473E-03        -1.18134E-02         1.11118E+00         7.65001E-01         1.11124E+00         3.43142E+01         1.00000E+00         5.46790E-06         3.43142E+01         1.57662E+01         1.85480E+01
+          1.76856E-02         8.85455E-03        -1.19070E-02         1.11117E+00         7.75672E-01         1.11124E+00         3.26769E+01         1.00000E+00         5.53608E-06         3.26769E+01         1.51537E+01         1.75233E+01
+          1.76856E-02         9.02438E-03        -1.20024E-02         1.11117E+00         7.86343E-01         1.11124E+00         3.10991E+01         1.00000E+00         5.60684E-06         3.10991E+01         1.45464E+01         1.65527E+01
+          1.76856E-02         9.19421E-03        -1.20996E-02         1.11117E+00         7.97013E-01         1.11124E+00         2.95800E+01         1.00000E+00         5.68016E-06         2.95800E+01         1.39451E+01         1.56349E+01
+          1.76856E-02         9.36403E-03        -1.21986E-02         1.11117E+00         8.07684E-01         1.11124E+00         2.81191E+01         1.00000E+00         5.75602E-06         2.81191E+01         1.33505E+01         1.47687E+01
+          1.76856E-02         9.53386E-03        -1.22994E-02         1.11117E+00         8.18354E-01         1.11124E+00         2.67158E+01         1.00000E+00         5.83438E-06         2.67158E+01         1.27633E+01         1.39525E+01
+          1.76856E-02         9.70369E-03        -1.24020E-02         1.11117E+00         8.29025E-01         1.11123E+00         2.53691E+01         1.00000E+00         5.91524E-06         2.53691E+01         1.21842E+01         1.31849E+01
+          1.76856E-02         9.87352E-03        -1.25065E-02         1.11116E+00         8.39695E-01         1.11123E+00         2.40782E+01         1.00000E+00         5.99856E-06         2.40782E+01         1.16139E+01         1.24643E+01
+          1.76856E-02         1.00433E-02        -1.26127E-02         1.11116E+00         8.50366E-01         1.11123E+00         2.28421E+01         1.00000E+00         6.08434E-06         2.28421E+01         1.10531E+01         1.17890E+01
+          1.76856E-02         1.02132E-02        -1.27208E-02         1.11116E+00         8.61037E-01         1.11123E+00         2.16598E+01         1.00000E+00         6.17255E-06         2.16598E+01         1.05023E+01         1.11575E+01
+          1.76856E-02         1.03830E-02        -1.28306E-02         1.11116E+00         8.71707E-01         1.11123E+00         2.05303E+01         1.00000E+00         6.26319E-06         2.05303E+01         9.96229E+00         1.05680E+01
+          1.76856E-02         1.05528E-02        -1.29423E-02         1.11116E+00         8.82378E-01         1.11123E+00         1.94524E+01         1.00000E+00         6.35625E-06         1.94524E+01         9.43355E+00         1.00189E+01
+          1.76856E-02         1.07227E-02        -1.30558E-02         1.11115E+00         8.93048E-01         1.11123E+00         1.84249E+01         1.00000E+00         6.45173E-06         1.84249E+01         8.91666E+00         9.50824E+00
+          1.76856E-02         1.08925E-02        -1.31711E-02         1.11115E+00         9.03719E-01         1.11123E+00         1.74466E+01         1.00000E+00         6.54962E-06         1.74466E+01         8.41214E+00         9.03442E+00
+          1.76856E-02         1.10623E-02        -1.32883E-02         1.11115E+00         9.14389E-01         1.11123E+00         1.65161E+01         1.00000E+00         6.64994E-06         1.65161E+01         7.92050E+00         8.59564E+00
+          1.76856E-02         1.12321E-02        -1.34072E-02         1.11115E+00         9.25060E-01         1.11123E+00         1.56323E+01         1.00000E+00         6.75271E-06         1.56323E+01         7.44221E+00         8.19012E+00
+          1.76856E-02         1.14020E-02        -1.35280E-02         1.11115E+00         9.35731E-01         1.11123E+00         1.47938E+01         1.00000E+00         6.85794E-06         1.47938E+01         6.97770E+00         7.81612E+00
+          1.76856E-02         1.15718E-02        -1.36505E-02         1.11114E+00         9.46401E-01         1.11123E+00         1.39993E+01         1.00000E+00         6.96566E-06         1.39993E+01         6.52737E+00         7.47189E+00
+          1.76856E-02         1.17416E-02        -1.37749E-02         1.11114E+00         9.57072E-01         1.11123E+00         1.32473E+01         1.00000E+00         7.07592E-06         1.32473E+01         6.09158E+00         7.15569E+00
+          1.76856E-02         1.19114E-02        -1.39011E-02         1.11114E+00         9.67742E-01         1.11123E+00         1.25365E+01         1.00000E+00         7.18873E-06         1.25365E+01         5.67065E+00         6.86582E+00
+          1.76856E-02         1.20813E-02        -1.40291E-02         1.11114E+00         9.78413E-01         1.11123E+00         1.18655E+01         1.00000E+00         7.30417E-06         1.18655E+01         5.26490E+00         6.60061E+00
+          1.76856E-02         1.22511E-02        -1.41589E-02         1.11113E+00         9.89083E-01         1.11122E+00         1.12330E+01         1.00000E+00         7.42227E-06         1.12330E+01         4.87456E+00         6.35842E+00
+          1.76856E-02         1.24209E-02        -1.42905E-02         1.11113E+00         9.99754E-01         1.11122E+00         1.06375E+01         1.00000E+00         7.54311E-06         1.06375E+01         4.49985E+00         6.13764E+00
+          1.76856E-02         1.25908E-02        -1.44239E-02         1.11113E+00         1.01042E+00         1.11122E+00         1.00777E+01         1.00000E+00         7.66674E-06         1.00777E+01         4.14096E+00         5.93674E+00
+          1.76856E-02         1.27606E-02        -1.45592E-02         1.11113E+00         1.02110E+00         1.11122E+00         9.55220E+00         1.00000E+00         7.79325E-06         9.55220E+00         3.79802E+00         5.75418E+00
+          1.76856E-02         1.29304E-02        -1.46962E-02         1.11112E+00         1.03177E+00         1.11122E+00         9.05966E+00         1.00000E+00         7.92270E-06         9.05966E+00         3.47113E+00         5.58853E+00
+          1.76856E-02         1.31002E-02        -1.48351E-02         1.11112E+00         1.04244E+00         1.11122E+00         8.59873E+00         1.00000E+00         8.05518E-06         8.59873E+00         3.16037E+00         5.43836E+00
+          1.76856E-02         1.32701E-02        -1.49758E-02         1.11112E+00         1.05311E+00         1.11122E+00         8.16810E+00         1.00000E+00         8.19076E-06         8.16810E+00         2.86575E+00         5.30235E+00
+          1.76856E-02         1.34399E-02        -1.51183E-02         1.11112E+00         1.06378E+00         1.11122E+00         7.76647E+00         1.00000E+00         8.32955E-06         7.76647E+00         2.58727E+00         5.17920E+00
+          1.76856E-02         1.36097E-02        -1.52626E-02         1.11111E+00         1.07445E+00         1.11122E+00         7.39256E+00         1.00000E+00         8.47162E-06         7.39256E+00         2.32489E+00         5.06768E+00
+          1.76856E-02         1.37795E-02        -1.54087E-02         1.11111E+00         1.08512E+00         1.11122E+00         7.04514E+00         1.00000E+00         8.61706E-06         7.04514E+00         2.07850E+00         4.96664E+00
+          1.76856E-02         1.39494E-02        -1.55566E-02         1.11111E+00         1.09579E+00         1.11122E+00         6.72298E+00         1.00000E+00         8.76597E-06         6.72298E+00         1.84801E+00         4.87497E+00
+          1.76856E-02         1.41192E-02        -1.57064E-02         1.11111E+00         1.10646E+00         1.11122E+00         6.42490E+00         1.00000E+00         8.91841E-06         6.42490E+00         1.63324E+00         4.79166E+00
+          1.76856E-02         1.42890E-02        -1.58580E-02         1.11110E+00         1.11713E+00         1.11122E+00         6.14975E+00         1.00000E+00         9.07449E-06         6.14975E+00         1.43403E+00         4.71572E+00
+          1.76856E-02         1.44589E-02        -1.60113E-02         1.11110E+00         1.12780E+00         1.11122E+00         5.89640E+00         1.00000E+00         9.23426E-06         5.89640E+00         1.25013E+00         4.64626E+00
+          1.76856E-02         1.46287E-02        -1.61665E-02         1.11110E+00         1.13847E+00         1.11122E+00         5.66377E+00         1.00000E+00         9.39781E-06         5.66377E+00         1.08131E+00         4.58246E+00
+          1.76856E-02         1.47985E-02        -1.63235E-02         1.11110E+00         1.14914E+00         1.11122E+00         5.45081E+00         1.00000E+00         9.56520E-06         5.45081E+00         9.27281E-01         4.52353E+00
+          1.76856E-02         1.49683E-02        -1.64823E-02         1.11109E+00         1.15981E+00         1.11122E+00         5.25651E+00         1.00000E+00         9.73648E-06         5.25651E+00         7.87728E-01         4.46878E+00
+          1.76856E-02         1.51382E-02        -1.66429E-02         1.11109E+00         1.17048E+00         1.11121E+00         5.07989E+00         1.00000E+00         9.91171E-06         5.07989E+00         6.62314E-01         4.41757E+00
+          1.76856E-02         1.53080E-02        -1.68054E-02         1.11109E+00         1.18115E+00         1.11121E+00         4.92000E+00         1.00000E+00         1.00909E-05         4.92000E+00         5.50674E-01         4.36933E+00
+          1.76856E-02         1.54778E-02        -1.69696E-02         1.11108E+00         1.19182E+00         1.11121E+00         4.77596E+00         1.00000E+00         1.02741E-05         4.77596E+00         4.52419E-01         4.32354E+00
+          1.76856E-02         1.56476E-02        -1.71357E-02         1.11108E+00         1.20249E+00         1.11121E+00         4.64687E+00         1.00000E+00         1.04614E-05         4.64687E+00         3.67136E-01         4.27974E+00
+          1.76856E-02         1.58175E-02        -1.73035E-02         1.11108E+00         1.21317E+00         1.11121E+00         4.53193E+00         1.00000E+00         1.06527E-05         4.53193E+00         2.94390E-01         4.23754E+00
+          1.76856E-02         1.59873E-02        -1.74732E-02         1.11108E+00         1.22384E+00         1.11121E+00         4.43033E+00         1.00000E+00         1.08479E-05         4.43033E+00         2.33729E-01         4.19660E+00
+          1.76856E-02         1.61571E-02        -1.76447E-02         1.11107E+00         1.23451E+00         1.11121E+00         4.34130E+00         1.00000E+00         1.10472E-05         4.34130E+00         1.84681E-01         4.15662E+00
+          1.76856E-02         1.63270E-02        -1.78180E-02         1.11107E+00         1.24518E+00         1.11121E+00         4.26413E+00         1.00000E+00         1.12505E-05         4.26413E+00         1.46760E-01         4.11737E+00
+          1.76856E-02         1.64968E-02        -1.79931E-02         1.11107E+00         1.25585E+00         1.11121E+00         4.19812E+00         1.00000E+00         1.14577E-05         4.19812E+00         1.19463E-01         4.07866E+00
+          1.76856E-02         1.66666E-02        -1.81701E-02         1.11106E+00         1.26652E+00         1.11121E+00         4.14261E+00         1.00000E+00         1.16687E-05         4.14261E+00         1.02277E-01         4.04033E+00
+          1.76856E-02         1.68364E-02        -1.83488E-02         1.11106E+00         1.27719E+00         1.11121E+00         4.09697E+00         1.00000E+00         1.18835E-05         4.09697E+00         9.46777E-02         4.00229E+00
+          1.76856E-02         1.70063E-02        -1.85294E-02         1.11106E+00         1.28786E+00         1.11121E+00         4.06060E+00         1.00000E+00         1.21021E-05         4.06060E+00         9.61326E-02         3.96446E+00
+          1.76856E-02         1.71761E-02        -1.87117E-02         1.11105E+00         1.29853E+00         1.11121E+00         4.03292E+00         1.00000E+00         1.23242E-05         4.03292E+00         1.06102E-01         3.92682E+00
+          1.76856E-02         1.73459E-02        -1.88959E-02         1.11105E+00         1.30920E+00         1.11121E+00         4.01340E+00         1.00000E+00         1.25499E-05         4.01340E+00         1.24040E-01         3.88936E+00
+          1.76856E-02         1.75158E-02        -1.90819E-02         1.11105E+00         1.31987E+00         1.11121E+00         4.00152E+00         1.00000E+00         1.27790E-05         4.00152E+00         1.49400E-01         3.85212E+00
+          1.76856E-02         1.76856E-02        -1.92697E-02         1.11104E+00         1.33054E+00         1.11121E+00         3.99679E+00         1.00000E+00         1.30115E-05         3.99679E+00         1.81632E-01         3.81516E+00
+          1.76856E-02         1.78554E-02        -1.94594E-02         1.11104E+00         1.34121E+00         1.11121E+00         3.99873E+00         1.00000E+00         1.32471E-05         3.99873E+00         2.20186E-01         3.77854E+00
+          1.76856E-02         1.80252E-02        -1.96508E-02         1.11104E+00         1.35188E+00         1.11121E+00         4.00689E+00         1.00000E+00         1.34857E-05         4.00689E+00         2.64517E-01         3.74238E+00
+          1.76856E-02         1.81951E-02        -1.98440E-02         1.11103E+00         1.36255E+00         1.11121E+00         4.02086E+00         1.00000E+00         1.37273E-05         4.02086E+00         3.14080E-01         3.70678E+00
+          1.76856E-02         1.83649E-02        -2.00391E-02         1.11103E+00         1.37322E+00         1.11121E+00         4.04022E+00         1.00000E+00         1.39718E-05         4.04022E+00         3.68337E-01         3.67188E+00
+          1.76856E-02         1.85347E-02        -2.02360E-02         1.11103E+00         1.38389E+00         1.11121E+00         4.06457E+00         1.00000E+00         1.42189E-05         4.06457E+00         4.26756E-01         3.63782E+00
+          1.76856E-02         1.87045E-02        -2.04347E-02         1.11102E+00         1.39457E+00         1.11121E+00         4.09355E+00         1.00000E+00         1.44686E-05         4.09355E+00         4.88816E-01         3.60474E+00
+          1.76856E-02         1.88744E-02        -2.06352E-02         1.11102E+00         1.40524E+00         1.11121E+00         4.12679E+00         1.00000E+00         1.47208E-05         4.12679E+00         5.54003E-01         3.57279E+00
+          1.76856E-02         1.90442E-02        -2.08375E-02         1.11102E+00         1.41591E+00         1.11121E+00         4.16395E+00         1.00000E+00         1.49754E-05         4.16395E+00         6.21815E-01         3.54214E+00
+          1.76856E-02         1.92140E-02        -2.10416E-02         1.11101E+00         1.42658E+00         1.11121E+00         4.20470E+00         1.00000E+00         1.52322E-05         4.20470E+00         6.91762E-01         3.51293E+00
+          1.76856E-02         1.93839E-02        -2.12475E-02         1.11101E+00         1.43725E+00         1.11121E+00         4.24869E+00         1.00000E+00         1.54913E-05         4.24869E+00         7.63368E-01         3.48533E+00
+          1.76856E-02         1.95537E-02        -2.14553E-02         1.11101E+00         1.44792E+00         1.11121E+00         4.29564E+00         1.00000E+00         1.57525E-05         4.29564E+00         8.36173E-01         3.45946E+00
+          1.76856E-02         1.97235E-02        -2.16648E-02         1.11100E+00         1.45859E+00         1.11121E+00         4.34522E+00         1.00000E+00         1.60157E-05         4.34522E+00         9.09731E-01         3.43549E+00
+          1.76856E-02         1.98933E-02        -2.18762E-02         1.11100E+00         1.46926E+00         1.11121E+00         4.39714E+00         1.00000E+00         1.62809E-05         4.39714E+00         9.83614E-01         3.41353E+00
+          1.76856E-02         2.00632E-02        -2.20894E-02         1.11099E+00         1.47993E+00         1.11121E+00         4.45112E+00         1.00000E+00         1.65482E-05         4.45112E+00         1.05741E+00         3.39371E+00
+          1.76856E-02         2.02330E-02        -2.23044E-02         1.11099E+00         1.49060E+00         1.11121E+00         4.50687E+00         1.00000E+00         1.68174E-05         4.50687E+00         1.13073E+00         3.37614E+00
+          1.76856E-02         2.04028E-02        -2.25212E-02         1.11099E+00         1.50127E+00         1.11121E+00         4.56410E+00         1.00000E+00         1.70886E-05         4.56410E+00         1.20320E+00         3.36090E+00
+          1.76856E-02         2.05726E-02        -2.27398E-02         1.11098E+00         1.51194E+00         1.11122E+00         4.62255E+00         1.00000E+00         1.73618E-05         4.62255E+00         1.27446E+00         3.34809E+00
+          1.76856E-02         2.07425E-02        -2.29603E-02         1.11098E+00         1.52261E+00         1.11122E+00         4.68195E+00         1.00000E+00         1.76371E-05         4.68195E+00         1.34419E+00         3.33776E+00
+          1.76856E-02         2.09123E-02        -2.31825E-02         1.11097E+00         1.53328E+00         1.11122E+00         4.74203E+00         1.00000E+00         1.79144E-05         4.74203E+00         1.41207E+00         3.32997E+00
+          1.76856E-02         2.10821E-02        -2.34066E-02         1.11097E+00         1.54395E+00         1.11122E+00         4.80254E+00         1.00000E+00         1.81940E-05         4.80254E+00         1.47781E+00         3.32473E+00
+          1.76856E-02         2.12520E-02        -2.36325E-02         1.11097E+00         1.55462E+00         1.11122E+00         4.86320E+00         1.00000E+00         1.84758E-05         4.86320E+00         1.54114E+00         3.32207E+00
+          1.76856E-02         2.14218E-02        -2.38602E-02         1.11096E+00         1.56529E+00         1.11122E+00         4.92378E+00         1.00000E+00         1.87599E-05         4.92378E+00         1.60181E+00         3.32197E+00
+          1.76856E-02         2.15916E-02        -2.40897E-02         1.11096E+00         1.57596E+00         1.11122E+00         4.98401E+00         1.00000E+00         1.90465E-05         4.98401E+00         1.65960E+00         3.32441E+00
+          1.76856E-02         2.17614E-02        -2.43210E-02         1.11095E+00         1.58664E+00         1.11122E+00         5.04365E+00         1.00000E+00         1.93357E-05         5.04365E+00         1.71431E+00         3.32934E+00
+          1.76856E-02         2.19313E-02        -2.45541E-02         1.11095E+00         1.59731E+00         1.11122E+00         5.10245E+00         1.00000E+00         1.96277E-05         5.10245E+00         1.76575E+00         3.33670E+00
+          1.76856E-02         2.21011E-02        -2.47891E-02         1.11095E+00         1.60798E+00         1.11122E+00         5.16017E+00         1.00000E+00         1.99225E-05         5.16017E+00         1.81375E+00         3.34642E+00
+          1.76856E-02         2.22709E-02        -2.50258E-02         1.11094E+00         1.61865E+00         1.11122E+00         5.21657E+00         1.00000E+00         2.02204E-05         5.21657E+00         1.85819E+00         3.35838E+00
+          1.76856E-02         2.24407E-02        -2.52644E-02         1.11094E+00         1.62932E+00         1.11123E+00         5.27141E+00         1.00000E+00         2.05214E-05         5.27141E+00         1.89894E+00         3.37247E+00
+          1.76856E-02         2.26106E-02        -2.55048E-02         1.11093E+00         1.63999E+00         1.11123E+00         5.32447E+00         1.00000E+00         2.08257E-05         5.32447E+00         1.93590E+00         3.38857E+00
+          1.76856E-02         2.27804E-02        -2.57470E-02         1.11093E+00         1.65066E+00         1.11123E+00         5.37551E+00         1.00000E+00         2.11335E-05         5.37551E+00         1.96899E+00         3.40652E+00
+          1.76856E-02         2.29502E-02        -2.59910E-02         1.11092E+00         1.66133E+00         1.11123E+00         5.42432E+00         1.00000E+00         2.14449E-05         5.42432E+00         1.99816E+00         3.42616E+00
+          1.76856E-02         2.31201E-02        -2.62368E-02         1.11092E+00         1.67200E+00         1.11123E+00         5.47068E+00         1.00000E+00         2.17600E-05         5.47068E+00         2.02337E+00         3.44731E+00
+          1.76856E-02         2.32899E-02        -2.64845E-02         1.11092E+00         1.68267E+00         1.11123E+00         5.51438E+00         1.00000E+00         2.20789E-05         5.51438E+00         2.04460E+00         3.46978E+00
+          1.76856E-02         2.34597E-02        -2.67339E-02         1.11091E+00         1.69334E+00         1.11123E+00         5.55521E+00         1.00000E+00         2.24018E-05         5.55521E+00         2.06184E+00         3.49338E+00
+          1.76856E-02         2.36295E-02        -2.69852E-02         1.11091E+00         1.70401E+00         1.11124E+00         5.59299E+00         1.00000E+00         2.27286E-05         5.59299E+00         2.07511E+00         3.51788E+00
+          1.76856E-02         2.37994E-02        -2.72383E-02         1.11090E+00         1.71468E+00         1.11124E+00         5.62751E+00         1.00000E+00         2.30596E-05         5.62751E+00         2.08443E+00         3.54308E+00
+          1.76856E-02         2.39692E-02        -2.74932E-02         1.11090E+00         1.72535E+00         1.11124E+00         5.65860E+00         1.00000E+00         2.33946E-05         5.65860E+00         2.08986E+00         3.56874E+00
+          1.76856E-02         2.41390E-02        -2.77499E-02         1.11089E+00         1.73602E+00         1.11124E+00         5.68609E+00         1.00000E+00         2.37337E-05         5.68609E+00         2.09146E+00         3.59463E+00
+          1.76856E-02         2.43088E-02        -2.80084E-02         1.11089E+00         1.74669E+00         1.11124E+00         5.70982E+00         1.00000E+00         2.40770E-05         5.70982E+00         2.08930E+00         3.62052E+00
+          1.76856E-02         2.44787E-02        -2.82687E-02         1.11088E+00         1.75736E+00         1.11124E+00         5.72963E+00         1.00000E+00         2.44242E-05         5.72963E+00         2.08347E+00         3.64616E+00
+          1.76856E-02         2.46485E-02        -2.85309E-02         1.11088E+00         1.76804E+00         1.11125E+00         5.74539E+00         1.00000E+00         2.47755E-05         5.74539E+00         2.07406E+00         3.67132E+00
+          1.76856E-02         2.48183E-02        -2.87948E-02         1.11088E+00         1.77871E+00         1.11125E+00         5.75696E+00         1.00000E+00         2.51306E-05         5.75696E+00         2.06120E+00         3.69576E+00
+          1.76856E-02         2.49882E-02        -2.90606E-02         1.11087E+00         1.78938E+00         1.11125E+00         5.76423E+00         1.00000E+00         2.54895E-05         5.76423E+00         2.04500E+00         3.71923E+00
+          1.76856E-02         2.51580E-02        -2.93282E-02         1.11087E+00         1.80005E+00         1.11125E+00         5.76710E+00         1.00000E+00         2.58519E-05         5.76710E+00         2.02560E+00         3.74150E+00
+          1.76856E-02         2.53278E-02        -2.95976E-02         1.11086E+00         1.81072E+00         1.11126E+00         5.76548E+00         1.00000E+00         2.62178E-05         5.76548E+00         2.00313E+00         3.76235E+00
+          1.76856E-02         2.54976E-02        -2.98688E-02         1.11086E+00         1.82139E+00         1.11126E+00         5.75928E+00         1.00000E+00         2.65868E-05         5.75928E+00         1.97774E+00         3.78153E+00
+          1.76856E-02         2.56675E-02        -3.01418E-02         1.11085E+00         1.83206E+00         1.11126E+00         5.74845E+00         1.00000E+00         2.69587E-05         5.74845E+00         1.94959E+00         3.79885E+00
+          1.76856E-02         2.58373E-02        -3.04167E-02         1.11085E+00         1.84273E+00         1.11126E+00         5.73293E+00         1.00000E+00         2.73334E-05         5.73293E+00         1.91884E+00         3.81409E+00
+          1.76856E-02         2.60071E-02        -3.06933E-02         1.11084E+00         1.85340E+00         1.11127E+00         5.71269E+00         1.00000E+00         2.77104E-05         5.71269E+00         1.88565E+00         3.82704E+00
+          1.76856E-02         2.61769E-02        -3.09718E-02         1.11084E+00         1.86407E+00         1.11127E+00         5.68771E+00         1.00000E+00         2.80895E-05         5.68771E+00         1.85018E+00         3.83753E+00
+          1.78554E-02         8.72665E-04        -9.65781E-03         1.12189E+00         2.74155E-01         1.12193E+00         1.50168E+02         1.00000E+00         3.32785E-06         1.50168E+02         3.36943E+01         1.16474E+02
+          1.78554E-02         1.04249E-03        -9.66803E-03         1.12189E+00         2.84826E-01         1.12193E+00         1.47587E+02         1.00000E+00         3.32031E-06         1.47587E+02         3.35220E+01         1.14065E+02
+          1.78554E-02         1.21232E-03        -9.68005E-03         1.12189E+00         2.95496E-01         1.12193E+00         1.44953E+02         1.00000E+00         3.31288E-06         1.44953E+02         3.33394E+01         1.11614E+02
+          1.78554E-02         1.38215E-03        -9.69389E-03         1.12189E+00         3.06167E-01         1.12193E+00         1.42270E+02         1.00000E+00         3.30560E-06         1.42270E+02         3.31462E+01         1.09123E+02
+          1.78554E-02         1.55197E-03        -9.70955E-03         1.12189E+00         3.16838E-01         1.12193E+00         1.39541E+02         1.00000E+00         3.29852E-06         1.39541E+02         3.29421E+01         1.06599E+02
+          1.78554E-02         1.72180E-03        -9.72701E-03         1.12189E+00         3.27508E-01         1.12193E+00         1.36772E+02         1.00000E+00         3.29170E-06         1.36772E+02         3.27269E+01         1.04045E+02
+          1.78554E-02         1.89163E-03        -9.74629E-03         1.12189E+00         3.38179E-01         1.12193E+00         1.33966E+02         1.00000E+00         3.28519E-06         1.33966E+02         3.25004E+01         1.01466E+02
+          1.78554E-02         2.06146E-03        -9.76737E-03         1.12189E+00         3.48849E-01         1.12193E+00         1.31129E+02         1.00000E+00         3.27905E-06         1.31129E+02         3.22623E+01         9.88666E+01
+          1.78554E-02         2.23128E-03        -9.79027E-03         1.12189E+00         3.59520E-01         1.12193E+00         1.28264E+02         1.00000E+00         3.27333E-06         1.28264E+02         3.20124E+01         9.62512E+01
+          1.78554E-02         2.40111E-03        -9.81498E-03         1.12188E+00         3.70190E-01         1.12193E+00         1.25375E+02         1.00000E+00         3.26810E-06         1.25375E+02         3.17506E+01         9.36242E+01
+          1.78554E-02         2.57094E-03        -9.84151E-03         1.12188E+00         3.80861E-01         1.12193E+00         1.22467E+02         1.00000E+00         3.26341E-06         1.22467E+02         3.14768E+01         9.09902E+01
+          1.78554E-02         2.74077E-03        -9.86984E-03         1.12188E+00         3.91532E-01         1.12193E+00         1.19544E+02         1.00000E+00         3.25933E-06         1.19544E+02         3.11908E+01         8.83534E+01
+          1.78554E-02         2.91059E-03        -9.89999E-03         1.12188E+00         4.02202E-01         1.12193E+00         1.16611E+02         1.00000E+00         3.25592E-06         1.16611E+02         3.08926E+01         8.57181E+01
+          1.78554E-02         3.08042E-03        -9.93195E-03         1.12188E+00         4.12873E-01         1.12193E+00         1.13670E+02         1.00000E+00         3.25326E-06         1.13670E+02         3.05820E+01         8.30884E+01
+          1.78554E-02         3.25025E-03        -9.96572E-03         1.12188E+00         4.23543E-01         1.12193E+00         1.10727E+02         1.00000E+00         3.25140E-06         1.10727E+02         3.02591E+01         8.04684E+01
+          1.78554E-02         3.42008E-03        -1.00013E-02         1.12188E+00         4.34214E-01         1.12193E+00         1.07786E+02         1.00000E+00         3.25041E-06         1.07786E+02         2.99238E+01         7.78621E+01
+          1.78554E-02         3.58990E-03        -1.00387E-02         1.12188E+00         4.44884E-01         1.12193E+00         1.04849E+02         1.00000E+00         3.25037E-06         1.04849E+02         2.95762E+01         7.52732E+01
+          1.78554E-02         3.75973E-03        -1.00779E-02         1.12188E+00         4.55555E-01         1.12193E+00         1.01922E+02         1.00000E+00         3.25133E-06         1.01922E+02         2.92164E+01         7.27055E+01
+          1.78554E-02         3.92956E-03        -1.01189E-02         1.12188E+00         4.66225E-01         1.12193E+00         9.90069E+01         1.00000E+00         3.25337E-06         9.90069E+01         2.88443E+01         7.01626E+01
+          1.78554E-02         4.09939E-03        -1.01618E-02         1.12188E+00         4.76896E-01         1.12192E+00         9.61081E+01         1.00000E+00         3.25656E-06         9.61081E+01         2.84603E+01         6.76478E+01
+          1.78554E-02         4.26921E-03        -1.02064E-02         1.12188E+00         4.87567E-01         1.12192E+00         9.32288E+01         1.00000E+00         3.26095E-06         9.32288E+01         2.80643E+01         6.51645E+01
+          1.78554E-02         4.43904E-03        -1.02528E-02         1.12188E+00         4.98237E-01         1.12192E+00         9.03724E+01         1.00000E+00         3.26662E-06         9.03724E+01         2.76567E+01         6.27157E+01
+          1.78554E-02         4.60887E-03        -1.03011E-02         1.12188E+00         5.08908E-01         1.12192E+00         8.75420E+01         1.00000E+00         3.27363E-06         8.75420E+01         2.72376E+01         6.03044E+01
+          1.78554E-02         4.77869E-03        -1.03512E-02         1.12188E+00         5.19578E-01         1.12192E+00         8.47407E+01         1.00000E+00         3.28203E-06         8.47407E+01         2.68072E+01         5.79335E+01
+          1.78554E-02         4.94852E-03        -1.04031E-02         1.12187E+00         5.30249E-01         1.12192E+00         8.19714E+01         1.00000E+00         3.29190E-06         8.19714E+01         2.63660E+01         5.56054E+01
+          1.78554E-02         5.11835E-03        -1.04568E-02         1.12187E+00         5.40919E-01         1.12192E+00         7.92369E+01         1.00000E+00         3.30328E-06         7.92369E+01         2.59141E+01         5.33227E+01
+          1.78554E-02         5.28818E-03        -1.05123E-02         1.12187E+00         5.51590E-01         1.12192E+00         7.65397E+01         1.00000E+00         3.31622E-06         7.65397E+01         2.54521E+01         5.10876E+01
+          1.78554E-02         5.45800E-03        -1.05696E-02         1.12187E+00         5.62261E-01         1.12192E+00         7.38824E+01         1.00000E+00         3.33079E-06         7.38824E+01         2.49801E+01         4.89023E+01
+          1.78554E-02         5.62783E-03        -1.06288E-02         1.12187E+00         5.72931E-01         1.12192E+00         7.12673E+01         1.00000E+00         3.34702E-06         7.12673E+01         2.44988E+01         4.67685E+01
+          1.78554E-02         5.79766E-03        -1.06897E-02         1.12187E+00         5.83602E-01         1.12192E+00         6.86966E+01         1.00000E+00         3.36496E-06         6.86966E+01         2.40084E+01         4.46881E+01
+          1.78554E-02         5.96749E-03        -1.07525E-02         1.12187E+00         5.94272E-01         1.12192E+00         6.61722E+01         1.00000E+00         3.38465E-06         6.61722E+01         2.35096E+01         4.26626E+01
+          1.78554E-02         6.13731E-03        -1.08170E-02         1.12187E+00         6.04943E-01         1.12192E+00         6.36960E+01         1.00000E+00         3.40612E-06         6.36960E+01         2.30027E+01         4.06933E+01
+          1.78554E-02         6.30714E-03        -1.08834E-02         1.12187E+00         6.15613E-01         1.12192E+00         6.12698E+01         1.00000E+00         3.42940E-06         6.12698E+01         2.24884E+01         3.87815E+01
+          1.78554E-02         6.47697E-03        -1.09516E-02         1.12186E+00         6.26284E-01         1.12192E+00         5.88952E+01         1.00000E+00         3.45453E-06         5.88952E+01         2.19671E+01         3.69280E+01
+          1.78554E-02         6.64680E-03        -1.10216E-02         1.12186E+00         6.36955E-01         1.12192E+00         5.65734E+01         1.00000E+00         3.48152E-06         5.65734E+01         2.14395E+01         3.51339E+01
+          1.78554E-02         6.81662E-03        -1.10935E-02         1.12186E+00         6.47625E-01         1.12192E+00         5.43057E+01         1.00000E+00         3.51039E-06         5.43057E+01         2.09062E+01         3.33995E+01
+          1.78554E-02         6.98645E-03        -1.11671E-02         1.12186E+00         6.58296E-01         1.12192E+00         5.20934E+01         1.00000E+00         3.54115E-06         5.20934E+01         2.03678E+01         3.17256E+01
+          1.78554E-02         7.15628E-03        -1.12425E-02         1.12186E+00         6.68966E-01         1.12192E+00         4.99372E+01         1.00000E+00         3.57383E-06         4.99372E+01         1.98249E+01         3.01123E+01
+          1.78554E-02         7.32611E-03        -1.13198E-02         1.12186E+00         6.79637E-01         1.12192E+00         4.78380E+01         1.00000E+00         3.60841E-06         4.78380E+01         1.92782E+01         2.85598E+01
+          1.78554E-02         7.49593E-03        -1.13989E-02         1.12186E+00         6.90307E-01         1.12191E+00         4.57965E+01         1.00000E+00         3.64491E-06         4.57965E+01         1.87283E+01         2.70682E+01
+          1.78554E-02         7.66576E-03        -1.14797E-02         1.12186E+00         7.00978E-01         1.12191E+00         4.38131E+01         1.00000E+00         3.68332E-06         4.38131E+01         1.81760E+01         2.56371E+01
+          1.78554E-02         7.83559E-03        -1.15624E-02         1.12185E+00         7.11649E-01         1.12191E+00         4.18884E+01         1.00000E+00         3.72365E-06         4.18884E+01         1.76220E+01         2.42664E+01
+          1.78554E-02         8.00542E-03        -1.16469E-02         1.12185E+00         7.22319E-01         1.12191E+00         4.00224E+01         1.00000E+00         3.76587E-06         4.00224E+01         1.70668E+01         2.29555E+01
+          1.78554E-02         8.17524E-03        -1.17333E-02         1.12185E+00         7.32990E-01         1.12191E+00         3.82153E+01         1.00000E+00         3.81000E-06         3.82153E+01         1.65114E+01         2.17039E+01
+          1.78554E-02         8.34507E-03        -1.18214E-02         1.12185E+00         7.43660E-01         1.12191E+00         3.64671E+01         1.00000E+00         3.85600E-06         3.64671E+01         1.59563E+01         2.05108E+01
+          1.78554E-02         8.51490E-03        -1.19113E-02         1.12185E+00         7.54331E-01         1.12191E+00         3.47777E+01         1.00000E+00         3.90388E-06         3.47777E+01         1.54024E+01         1.93753E+01
+          1.78554E-02         8.68473E-03        -1.20031E-02         1.12185E+00         7.65001E-01         1.12191E+00         3.31469E+01         1.00000E+00         3.95362E-06         3.31469E+01         1.48502E+01         1.82966E+01
+          1.78554E-02         8.85455E-03        -1.20967E-02         1.12184E+00         7.75672E-01         1.12191E+00         3.15742E+01         1.00000E+00         4.00520E-06         3.15742E+01         1.43006E+01         1.72735E+01
+          1.78554E-02         9.02438E-03        -1.21920E-02         1.12184E+00         7.86343E-01         1.12191E+00         3.00592E+01         1.00000E+00         4.05862E-06         3.00592E+01         1.37543E+01         1.63049E+01
+          1.78554E-02         9.19421E-03        -1.22892E-02         1.12184E+00         7.97013E-01         1.12191E+00         2.86014E+01         1.00000E+00         4.11385E-06         2.86014E+01         1.32119E+01         1.53895E+01
+          1.78554E-02         9.36403E-03        -1.23882E-02         1.12184E+00         8.07684E-01         1.12191E+00         2.72001E+01         1.00000E+00         4.17089E-06         2.72001E+01         1.26741E+01         1.45259E+01
+          1.78554E-02         9.53386E-03        -1.24890E-02         1.12184E+00         8.18354E-01         1.12191E+00         2.58546E+01         1.00000E+00         4.22973E-06         2.58546E+01         1.21418E+01         1.37128E+01
+          1.78554E-02         9.70369E-03        -1.25917E-02         1.12184E+00         8.29025E-01         1.12191E+00         2.45640E+01         1.00000E+00         4.29036E-06         2.45640E+01         1.16154E+01         1.29485E+01
+          1.78554E-02         9.87352E-03        -1.26961E-02         1.12183E+00         8.39695E-01         1.12191E+00         2.33274E+01         1.00000E+00         4.35277E-06         2.33274E+01         1.10957E+01         1.22317E+01
+          1.78554E-02         1.00433E-02        -1.28024E-02         1.12183E+00         8.50366E-01         1.12190E+00         2.21439E+01         1.00000E+00         4.41695E-06         2.21439E+01         1.05834E+01         1.15605E+01
+          1.78554E-02         1.02132E-02        -1.29104E-02         1.12183E+00         8.61037E-01         1.12190E+00         2.10125E+01         1.00000E+00         4.48292E-06         2.10125E+01         1.00791E+01         1.09334E+01
+          1.78554E-02         1.03830E-02        -1.30203E-02         1.12183E+00         8.71707E-01         1.12190E+00         1.99320E+01         1.00000E+00         4.55067E-06         1.99320E+01         9.58327E+00         1.03487E+01
+          1.78554E-02         1.05528E-02        -1.31320E-02         1.12183E+00         8.82378E-01         1.12190E+00         1.89013E+01         1.00000E+00         4.62020E-06         1.89013E+01         9.09664E+00         9.80464E+00
+          1.78554E-02         1.07227E-02        -1.32455E-02         1.12182E+00         8.93048E-01         1.12190E+00         1.79192E+01         1.00000E+00         4.69154E-06         1.79192E+01         8.61973E+00         9.29945E+00
+          1.78554E-02         1.08925E-02        -1.33608E-02         1.12182E+00         9.03719E-01         1.12190E+00         1.69844E+01         1.00000E+00         4.76470E-06         1.69844E+01         8.15307E+00         8.83137E+00
+          1.78554E-02         1.10623E-02        -1.34779E-02         1.12182E+00         9.14389E-01         1.12190E+00         1.60958E+01         1.00000E+00         4.83970E-06         1.60958E+01         7.69719E+00         8.39863E+00
+          1.78554E-02         1.12321E-02        -1.35968E-02         1.12182E+00         9.25060E-01         1.12190E+00         1.52520E+01         1.00000E+00         4.91656E-06         1.52520E+01         7.25255E+00         7.99943E+00
+          1.78554E-02         1.14020E-02        -1.37176E-02         1.12182E+00         9.35731E-01         1.12190E+00         1.44516E+01         1.00000E+00         4.99532E-06         1.44516E+01         6.81962E+00         7.63199E+00
+          1.78554E-02         1.15718E-02        -1.38402E-02         1.12181E+00         9.46401E-01         1.12190E+00         1.36934E+01         1.00000E+00         5.07601E-06         1.36934E+01         6.39882E+00         7.29456E+00
+          1.78554E-02         1.17416E-02        -1.39645E-02         1.12181E+00         9.57072E-01         1.12190E+00         1.29759E+01         1.00000E+00         5.15867E-06         1.29759E+01         5.99053E+00         6.98537E+00
+          1.78554E-02         1.19114E-02        -1.40907E-02         1.12181E+00         9.67742E-01         1.12190E+00         1.22978E+01         1.00000E+00         5.24336E-06         1.22978E+01         5.59512E+00         6.70270E+00
+          1.78554E-02         1.20813E-02        -1.42187E-02         1.12181E+00         9.78413E-01         1.12190E+00         1.16578E+01         1.00000E+00         5.33012E-06         1.16578E+01         5.21291E+00         6.44485E+00
+          1.78554E-02         1.22511E-02        -1.43485E-02         1.12180E+00         9.89083E-01         1.12190E+00         1.10544E+01         1.00000E+00         5.41900E-06         1.10544E+01         4.84420E+00         6.21015E+00
+          1.78554E-02         1.24209E-02        -1.44801E-02         1.12180E+00         9.99754E-01         1.12190E+00         1.04862E+01         1.00000E+00         5.51007E-06         1.04862E+01         4.48924E+00         5.99697E+00
+          1.78554E-02         1.25908E-02        -1.46136E-02         1.12180E+00         1.01042E+00         1.12189E+00         9.95198E+00         1.00000E+00         5.60338E-06         9.95198E+00         4.14826E+00         5.80372E+00
+          1.78554E-02         1.27606E-02        -1.47488E-02         1.12180E+00         1.02110E+00         1.12189E+00         9.45031E+00         1.00000E+00         5.69900E-06         9.45031E+00         3.82144E+00         5.62887E+00
+          1.78554E-02         1.29304E-02        -1.48859E-02         1.12179E+00         1.03177E+00         1.12189E+00         8.97985E+00         1.00000E+00         5.79700E-06         8.97985E+00         3.50893E+00         5.47093E+00
+          1.78554E-02         1.31002E-02        -1.50247E-02         1.12179E+00         1.04244E+00         1.12189E+00         8.53930E+00         1.00000E+00         5.89745E-06         8.53930E+00         3.21085E+00         5.32845E+00
+          1.78554E-02         1.32701E-02        -1.51654E-02         1.12179E+00         1.05311E+00         1.12189E+00         8.12734E+00         1.00000E+00         6.00041E-06         8.12734E+00         2.92728E+00         5.20006E+00
+          1.78554E-02         1.34399E-02        -1.53079E-02         1.12179E+00         1.06378E+00         1.12189E+00         7.74271E+00         1.00000E+00         6.10596E-06         7.74271E+00         2.65828E+00         5.08443E+00
+          1.78554E-02         1.36097E-02        -1.54522E-02         1.12178E+00         1.07445E+00         1.12189E+00         7.38416E+00         1.00000E+00         6.21415E-06         7.38416E+00         2.40383E+00         4.98032E+00
+          1.78554E-02         1.37795E-02        -1.55984E-02         1.12178E+00         1.08512E+00         1.12189E+00         7.05046E+00         1.00000E+00         6.32507E-06         7.05046E+00         2.16394E+00         4.88653E+00
+          1.78554E-02         1.39494E-02        -1.57463E-02         1.12178E+00         1.09579E+00         1.12189E+00         6.74044E+00         1.00000E+00         6.43876E-06         6.74044E+00         1.93852E+00         4.80192E+00
+          1.78554E-02         1.41192E-02        -1.58960E-02         1.12178E+00         1.10646E+00         1.12189E+00         6.45293E+00         1.00000E+00         6.55530E-06         6.45293E+00         1.72751E+00         4.72543E+00
+          1.78554E-02         1.42890E-02        -1.60476E-02         1.12177E+00         1.11713E+00         1.12189E+00         6.18682E+00         1.00000E+00         6.67474E-06         6.18682E+00         1.53076E+00         4.65606E+00
+          1.78554E-02         1.44589E-02        -1.62010E-02         1.12177E+00         1.12780E+00         1.12189E+00         5.94101E+00         1.00000E+00         6.79712E-06         5.94101E+00         1.34813E+00         4.59289E+00
+          1.78554E-02         1.46287E-02        -1.63561E-02         1.12177E+00         1.13847E+00         1.12189E+00         5.71447E+00         1.00000E+00         6.92250E-06         5.71447E+00         1.17942E+00         4.53505E+00
+          1.78554E-02         1.47985E-02        -1.65131E-02         1.12177E+00         1.14914E+00         1.12189E+00         5.50617E+00         1.00000E+00         7.05090E-06         5.50617E+00         1.02443E+00         4.48174E+00
+          1.78554E-02         1.49683E-02        -1.66719E-02         1.12176E+00         1.15981E+00         1.12189E+00         5.31515E+00         1.00000E+00         7.18237E-06         5.31515E+00         8.82909E-01         4.43224E+00
+          1.78554E-02         1.51382E-02        -1.68326E-02         1.12176E+00         1.17048E+00         1.12189E+00         5.14046E+00         1.00000E+00         7.31691E-06         5.14046E+00         7.54580E-01         4.38588E+00
+          1.78554E-02         1.53080E-02        -1.69950E-02         1.12176E+00         1.18115E+00         1.12189E+00         4.98121E+00         1.00000E+00         7.45455E-06         4.98121E+00         6.39149E-01         4.34206E+00
+          1.78554E-02         1.54778E-02        -1.71592E-02         1.12175E+00         1.19182E+00         1.12189E+00         4.83654E+00         1.00000E+00         7.59529E-06         4.83654E+00         5.36291E-01         4.30025E+00
+          1.78554E-02         1.56476E-02        -1.73253E-02         1.12175E+00         1.20249E+00         1.12188E+00         4.70564E+00         1.00000E+00         7.73912E-06         4.70564E+00         4.45660E-01         4.25998E+00
+          1.78554E-02         1.58175E-02        -1.74932E-02         1.12175E+00         1.21317E+00         1.12188E+00         4.58771E+00         1.00000E+00         7.88603E-06         4.58771E+00         3.66889E-01         4.22082E+00
+          1.78554E-02         1.59873E-02        -1.76628E-02         1.12174E+00         1.22384E+00         1.12188E+00         4.48201E+00         1.00000E+00         8.03600E-06         4.48201E+00         2.99588E-01         4.18242E+00
+          1.78554E-02         1.61571E-02        -1.78343E-02         1.12174E+00         1.23451E+00         1.12188E+00         4.38783E+00         1.00000E+00         8.18899E-06         4.38783E+00         2.43350E-01         4.14448E+00
+          1.78554E-02         1.63270E-02        -1.80076E-02         1.12174E+00         1.24518E+00         1.12188E+00         4.30450E+00         1.00000E+00         8.34496E-06         4.30450E+00         1.97752E-01         4.10675E+00
+          1.78554E-02         1.64968E-02        -1.81828E-02         1.12174E+00         1.25585E+00         1.12188E+00         4.23139E+00         1.00000E+00         8.50386E-06         4.23139E+00         1.62353E-01         4.06903E+00
+          1.78554E-02         1.66666E-02        -1.83597E-02         1.12173E+00         1.26652E+00         1.12188E+00         4.16787E+00         1.00000E+00         8.66564E-06         4.16787E+00         1.36700E-01         4.03117E+00
+          1.78554E-02         1.68364E-02        -1.85384E-02         1.12173E+00         1.27719E+00         1.12188E+00         4.11338E+00         1.00000E+00         8.83023E-06         4.11338E+00         1.20328E-01         3.99305E+00
+          1.78554E-02         1.70063E-02        -1.87190E-02         1.12173E+00         1.28786E+00         1.12188E+00         4.06738E+00         1.00000E+00         8.99755E-06         4.06738E+00         1.12760E-01         3.95462E+00
+          1.78554E-02         1.71761E-02        -1.89014E-02         1.12172E+00         1.29853E+00         1.12188E+00         4.02936E+00         1.00000E+00         9.16754E-06         4.02936E+00         1.13514E-01         3.91584E+00
+          1.78554E-02         1.73459E-02        -1.90856E-02         1.12172E+00         1.30920E+00         1.12188E+00         3.99883E+00         1.00000E+00         9.34012E-06         3.99883E+00         1.22097E-01         3.87673E+00
+          1.78554E-02         1.75158E-02        -1.92715E-02         1.12172E+00         1.31987E+00         1.12188E+00         3.97532E+00         1.00000E+00         9.51519E-06         3.97532E+00         1.38013E-01         3.83731E+00
+          1.78554E-02         1.76856E-02        -1.94594E-02         1.12171E+00         1.33054E+00         1.12188E+00         3.95842E+00         1.00000E+00         9.69267E-06         3.95842E+00         1.60762E-01         3.79766E+00
+          1.78554E-02         1.78554E-02        -1.96490E-02         1.12171E+00         1.34121E+00         1.12188E+00         3.94771E+00         1.00000E+00         9.87248E-06         3.94771E+00         1.89843E-01         3.75787E+00
+          1.78554E-02         1.80252E-02        -1.98404E-02         1.12171E+00         1.35188E+00         1.12188E+00         3.94281E+00         1.00000E+00         1.00545E-05         3.94281E+00         2.24753E-01         3.71805E+00
+          1.78554E-02         1.81951E-02        -2.00337E-02         1.12170E+00         1.36255E+00         1.12188E+00         3.94334E+00         1.00000E+00         1.02388E-05         3.94334E+00         2.64992E-01         3.67835E+00
+          1.78554E-02         1.83649E-02        -2.02287E-02         1.12170E+00         1.37322E+00         1.12188E+00         3.94896E+00         1.00000E+00         1.04250E-05         3.94896E+00         3.10062E-01         3.63890E+00
+          1.78554E-02         1.85347E-02        -2.04256E-02         1.12170E+00         1.38389E+00         1.12188E+00         3.95934E+00         1.00000E+00         1.06133E-05         3.95934E+00         3.59469E-01         3.59988E+00
+          1.78554E-02         1.87045E-02        -2.06243E-02         1.12169E+00         1.39457E+00         1.12188E+00         3.97417E+00         1.00000E+00         1.08036E-05         3.97417E+00         4.12728E-01         3.56145E+00
+          1.78554E-02         1.88744E-02        -2.08248E-02         1.12169E+00         1.40524E+00         1.12188E+00         3.99315E+00         1.00000E+00         1.09957E-05         3.99315E+00         4.69356E-01         3.52379E+00
+          1.78554E-02         1.90442E-02        -2.10271E-02         1.12168E+00         1.41591E+00         1.12188E+00         4.01598E+00         1.00000E+00         1.11896E-05         4.01598E+00         5.28884E-01         3.48710E+00
+          1.78554E-02         1.92140E-02        -2.12312E-02         1.12168E+00         1.42658E+00         1.12188E+00         4.04239E+00         1.00000E+00         1.13853E-05         4.04239E+00         5.90849E-01         3.45155E+00
+          1.78554E-02         1.93839E-02        -2.14371E-02         1.12168E+00         1.43725E+00         1.12188E+00         4.07213E+00         1.00000E+00         1.15827E-05         4.07213E+00         6.54802E-01         3.41732E+00
+          1.78554E-02         1.95537E-02        -2.16449E-02         1.12167E+00         1.44792E+00         1.12188E+00         4.10492E+00         1.00000E+00         1.17819E-05         4.10492E+00         7.20304E-01         3.38461E+00
+          1.78554E-02         1.97235E-02        -2.18545E-02         1.12167E+00         1.45859E+00         1.12188E+00         4.14052E+00         1.00000E+00         1.19828E-05         4.14052E+00         7.86930E-01         3.35359E+00
+          1.78554E-02         1.98933E-02        -2.20658E-02         1.12167E+00         1.46926E+00         1.12188E+00         4.17869E+00         1.00000E+00         1.21853E-05         4.17869E+00         8.54271E-01         3.32442E+00
+          1.78554E-02         2.00632E-02        -2.22790E-02         1.12166E+00         1.47993E+00         1.12188E+00         4.21920E+00         1.00000E+00         1.23896E-05         4.21920E+00         9.21931E-01         3.29727E+00
+          1.78554E-02         2.02330E-02        -2.24940E-02         1.12166E+00         1.49060E+00         1.12188E+00         4.26180E+00         1.00000E+00         1.25957E-05         4.26180E+00         9.89531E-01         3.27227E+00
+          1.78554E-02         2.04028E-02        -2.27108E-02         1.12165E+00         1.50127E+00         1.12188E+00         4.30627E+00         1.00000E+00         1.28036E-05         4.30627E+00         1.05671E+00         3.24956E+00
+          1.78554E-02         2.05726E-02        -2.29295E-02         1.12165E+00         1.51194E+00         1.12189E+00         4.35239E+00         1.00000E+00         1.30133E-05         4.35239E+00         1.12312E+00         3.22926E+00
+          1.78554E-02         2.07425E-02        -2.31499E-02         1.12165E+00         1.52261E+00         1.12189E+00         4.39992E+00         1.00000E+00         1.32249E-05         4.39992E+00         1.18844E+00         3.21148E+00
+          1.78554E-02         2.09123E-02        -2.33721E-02         1.12164E+00         1.53328E+00         1.12189E+00         4.44866E+00         1.00000E+00         1.34385E-05         4.44866E+00         1.25236E+00         3.19629E+00
+          1.78554E-02         2.10821E-02        -2.35962E-02         1.12164E+00         1.54395E+00         1.12189E+00         4.49837E+00         1.00000E+00         1.36542E-05         4.49837E+00         1.31460E+00         3.18377E+00
+          1.78554E-02         2.12520E-02        -2.38221E-02         1.12163E+00         1.55462E+00         1.12189E+00         4.54884E+00         1.00000E+00         1.38720E-05         4.54884E+00         1.37487E+00         3.17397E+00
+          1.78554E-02         2.14218E-02        -2.40498E-02         1.12163E+00         1.56529E+00         1.12189E+00         4.59985E+00         1.00000E+00         1.40922E-05         4.59985E+00         1.43294E+00         3.16691E+00
+          1.78554E-02         2.15916E-02        -2.42793E-02         1.12163E+00         1.57596E+00         1.12189E+00         4.65118E+00         1.00000E+00         1.43147E-05         4.65118E+00         1.48857E+00         3.16261E+00
+          1.78554E-02         2.17614E-02        -2.45106E-02         1.12162E+00         1.58664E+00         1.12189E+00         4.70261E+00         1.00000E+00         1.45398E-05         4.70261E+00         1.54156E+00         3.16105E+00
+          1.78554E-02         2.19313E-02        -2.47437E-02         1.12162E+00         1.59731E+00         1.12189E+00         4.75392E+00         1.00000E+00         1.47675E-05         4.75392E+00         1.59170E+00         3.16221E+00
+          1.78554E-02         2.21011E-02        -2.49787E-02         1.12161E+00         1.60798E+00         1.12189E+00         4.80489E+00         1.00000E+00         1.49979E-05         4.80489E+00         1.63885E+00         3.16604E+00
+          1.78554E-02         2.22709E-02        -2.52154E-02         1.12161E+00         1.61865E+00         1.12189E+00         4.85532E+00         1.00000E+00         1.52312E-05         4.85532E+00         1.68284E+00         3.17248E+00
+          1.78554E-02         2.24407E-02        -2.54540E-02         1.12161E+00         1.62932E+00         1.12189E+00         4.90497E+00         1.00000E+00         1.54675E-05         4.90497E+00         1.72354E+00         3.18143E+00
+          1.78554E-02         2.26106E-02        -2.56944E-02         1.12160E+00         1.63999E+00         1.12190E+00         4.95363E+00         1.00000E+00         1.57069E-05         4.95363E+00         1.76085E+00         3.19278E+00
+          1.78554E-02         2.27804E-02        -2.59366E-02         1.12160E+00         1.65066E+00         1.12190E+00         5.00110E+00         1.00000E+00         1.59495E-05         5.00110E+00         1.79467E+00         3.20643E+00
+          1.78554E-02         2.29502E-02        -2.61806E-02         1.12159E+00         1.66133E+00         1.12190E+00         5.04715E+00         1.00000E+00         1.61954E-05         5.04715E+00         1.82493E+00         3.22222E+00
+          1.78554E-02         2.31201E-02        -2.64264E-02         1.12159E+00         1.67200E+00         1.12190E+00         5.09158E+00         1.00000E+00         1.64446E-05         5.09158E+00         1.85157E+00         3.24001E+00
+          1.78554E-02         2.32899E-02        -2.66741E-02         1.12158E+00         1.68267E+00         1.12190E+00         5.13417E+00         1.00000E+00         1.66973E-05         5.13417E+00         1.87456E+00         3.25961E+00
+          1.78554E-02         2.34597E-02        -2.69235E-02         1.12158E+00         1.69334E+00         1.12190E+00         5.17473E+00         1.00000E+00         1.69534E-05         5.17473E+00         1.89388E+00         3.28086E+00
+          1.78554E-02         2.36295E-02        -2.71748E-02         1.12157E+00         1.70401E+00         1.12190E+00         5.21306E+00         1.00000E+00         1.72131E-05         5.21306E+00         1.90952E+00         3.30354E+00
+          1.78554E-02         2.37994E-02        -2.74279E-02         1.12157E+00         1.71468E+00         1.12191E+00         5.24895E+00         1.00000E+00         1.74762E-05         5.24895E+00         1.92149E+00         3.32746E+00
+          1.78554E-02         2.39692E-02        -2.76828E-02         1.12157E+00         1.72535E+00         1.12191E+00         5.28222E+00         1.00000E+00         1.77428E-05         5.28222E+00         1.92983E+00         3.35239E+00
+          1.78554E-02         2.41390E-02        -2.79395E-02         1.12156E+00         1.73602E+00         1.12191E+00         5.31269E+00         1.00000E+00         1.80129E-05         5.31269E+00         1.93457E+00         3.37812E+00
+          1.78554E-02         2.43088E-02        -2.81980E-02         1.12156E+00         1.74669E+00         1.12191E+00         5.34017E+00         1.00000E+00         1.82864E-05         5.34017E+00         1.93578E+00         3.40440E+00
+          1.78554E-02         2.44787E-02        -2.84583E-02         1.12155E+00         1.75736E+00         1.12191E+00         5.36451E+00         1.00000E+00         1.85632E-05         5.36451E+00         1.93351E+00         3.43100E+00
+          1.78554E-02         2.46485E-02        -2.87204E-02         1.12155E+00         1.76804E+00         1.12192E+00         5.38553E+00         1.00000E+00         1.88432E-05         5.38553E+00         1.92785E+00         3.45768E+00
+          1.78554E-02         2.48183E-02        -2.89844E-02         1.12154E+00         1.77871E+00         1.12192E+00         5.40308E+00         1.00000E+00         1.91263E-05         5.40308E+00         1.91890E+00         3.48418E+00
+          1.78554E-02         2.49882E-02        -2.92502E-02         1.12154E+00         1.78938E+00         1.12192E+00         5.41703E+00         1.00000E+00         1.94123E-05         5.41703E+00         1.90675E+00         3.51028E+00
+          1.78554E-02         2.51580E-02        -2.95178E-02         1.12153E+00         1.80005E+00         1.12192E+00         5.42723E+00         1.00000E+00         1.97011E-05         5.42723E+00         1.89151E+00         3.53572E+00
+          1.78554E-02         2.53278E-02        -2.97872E-02         1.12153E+00         1.81072E+00         1.12192E+00         5.43357E+00         1.00000E+00         1.99925E-05         5.43357E+00         1.87332E+00         3.56026E+00
+          1.78554E-02         2.54976E-02        -3.00584E-02         1.12152E+00         1.82139E+00         1.12193E+00         5.43594E+00         1.00000E+00         2.02862E-05         5.43594E+00         1.85229E+00         3.58365E+00
+          1.78554E-02         2.56675E-02        -3.03314E-02         1.12152E+00         1.83206E+00         1.12193E+00         5.43424E+00         1.00000E+00         2.05821E-05         5.43424E+00         1.82857E+00         3.60568E+00
+          1.78554E-02         2.58373E-02        -3.06062E-02         1.12151E+00         1.84273E+00         1.12193E+00         5.42839E+00         1.00000E+00         2.08800E-05         5.42839E+00         1.80229E+00         3.62610E+00
+          1.78554E-02         2.60071E-02        -3.08829E-02         1.12151E+00         1.85340E+00         1.12193E+00         5.41830E+00         1.00000E+00         2.11795E-05         5.41830E+00         1.77360E+00         3.64470E+00
+          1.78554E-02         2.61769E-02        -3.11614E-02         1.12150E+00         1.86407E+00         1.12194E+00         5.40393E+00         1.00000E+00         2.14804E-05         5.40393E+00         1.74267E+00         3.66126E+00
+          1.80252E-02         8.72665E-04        -9.84927E-03         1.13256E+00         2.74155E-01         1.13260E+00         1.45461E+02         1.00000E+00         2.33747E-06         1.45461E+02         2.93341E+01         1.16126E+02
+          1.80252E-02         1.04249E-03        -9.85949E-03         1.13256E+00         2.84826E-01         1.13260E+00         1.42950E+02         1.00000E+00         2.33243E-06         1.42950E+02         2.92225E+01         1.13727E+02
+          1.80252E-02         1.21232E-03        -9.87152E-03         1.13256E+00         2.95496E-01         1.13260E+00         1.40387E+02         1.00000E+00         2.32749E-06         1.40387E+02         2.91024E+01         1.11284E+02
+          1.80252E-02         1.38215E-03        -9.88536E-03         1.13256E+00         3.06167E-01         1.13260E+00         1.37776E+02         1.00000E+00         2.32271E-06         1.37776E+02         2.89733E+01         1.08803E+02
+          1.80252E-02         1.55197E-03        -9.90101E-03         1.13256E+00         3.16838E-01         1.13260E+00         1.35122E+02         1.00000E+00         2.31812E-06         1.35122E+02         2.88350E+01         1.06287E+02
+          1.80252E-02         1.72180E-03        -9.91847E-03         1.13256E+00         3.27508E-01         1.13260E+00         1.32428E+02         1.00000E+00         2.31375E-06         1.32428E+02         2.86872E+01         1.03741E+02
+          1.80252E-02         1.89163E-03        -9.93775E-03         1.13256E+00         3.38179E-01         1.13260E+00         1.29700E+02         1.00000E+00         2.30966E-06         1.29700E+02         2.85295E+01         1.01170E+02
+          1.80252E-02         2.06146E-03        -9.95884E-03         1.13256E+00         3.48849E-01         1.13260E+00         1.26940E+02         1.00000E+00         2.30588E-06         1.26940E+02         2.83617E+01         9.85786E+01
+          1.80252E-02         2.23128E-03        -9.98174E-03         1.13256E+00         3.59520E-01         1.13260E+00         1.24154E+02         1.00000E+00         2.30247E-06         1.24154E+02         2.81835E+01         9.59708E+01
+          1.80252E-02         2.40111E-03        -1.00064E-02         1.13256E+00         3.70190E-01         1.13260E+00         1.21346E+02         1.00000E+00         2.29945E-06         1.21346E+02         2.79947E+01         9.33511E+01
+          1.80252E-02         2.57094E-03        -1.00330E-02         1.13256E+00         3.80861E-01         1.13260E+00         1.18519E+02         1.00000E+00         2.29688E-06         1.18519E+02         2.77950E+01         9.07240E+01
+          1.80252E-02         2.74077E-03        -1.00613E-02         1.13255E+00         3.91532E-01         1.13260E+00         1.15678E+02         1.00000E+00         2.29481E-06         1.15678E+02         2.75843E+01         8.80938E+01
+          1.80252E-02         2.91059E-03        -1.00915E-02         1.13255E+00         4.02202E-01         1.13260E+00         1.12827E+02         1.00000E+00         2.29329E-06         1.12827E+02         2.73624E+01         8.54647E+01
+          1.80252E-02         3.08042E-03        -1.01234E-02         1.13255E+00         4.12873E-01         1.13260E+00         1.09970E+02         1.00000E+00         2.29235E-06         1.09970E+02         2.71291E+01         8.28409E+01
+          1.80252E-02         3.25025E-03        -1.01572E-02         1.13255E+00         4.23543E-01         1.13260E+00         1.07111E+02         1.00000E+00         2.29206E-06         1.07111E+02         2.68844E+01         8.02264E+01
+          1.80252E-02         3.42008E-03        -1.01928E-02         1.13255E+00         4.34214E-01         1.13260E+00         1.04253E+02         1.00000E+00         2.29245E-06         1.04253E+02         2.66281E+01         7.76252E+01
+          1.80252E-02         3.58990E-03        -1.02302E-02         1.13255E+00         4.44884E-01         1.13260E+00         1.01401E+02         1.00000E+00         2.29359E-06         1.01401E+02         2.63602E+01         7.50410E+01
+          1.80252E-02         3.75973E-03        -1.02694E-02         1.13255E+00         4.55555E-01         1.13260E+00         9.85584E+01         1.00000E+00         2.29550E-06         9.85584E+01         2.60807E+01         7.24776E+01
+          1.80252E-02         3.92956E-03        -1.03104E-02         1.13255E+00         4.66225E-01         1.13260E+00         9.57282E+01         1.00000E+00         2.29825E-06         9.57282E+01         2.57896E+01         6.99386E+01
+          1.80252E-02         4.09939E-03        -1.03532E-02         1.13255E+00         4.76896E-01         1.13260E+00         9.29142E+01         1.00000E+00         2.30188E-06         9.29142E+01         2.54869E+01         6.74273E+01
+          1.80252E-02         4.26921E-03        -1.03979E-02         1.13255E+00         4.87567E-01         1.13260E+00         9.01198E+01         1.00000E+00         2.30644E-06         9.01198E+01         2.51727E+01         6.49471E+01
+          1.80252E-02         4.43904E-03        -1.04443E-02         1.13255E+00         4.98237E-01         1.13260E+00         8.73481E+01         1.00000E+00         2.31196E-06         8.73481E+01         2.48470E+01         6.25010E+01
+          1.80252E-02         4.60887E-03        -1.04926E-02         1.13255E+00         5.08908E-01         1.13260E+00         8.46022E+01         1.00000E+00         2.31850E-06         8.46022E+01         2.45101E+01         6.00921E+01
+          1.80252E-02         4.77869E-03        -1.05427E-02         1.13255E+00         5.19578E-01         1.13259E+00         8.18852E+01         1.00000E+00         2.32609E-06         8.18852E+01         2.41620E+01         5.77231E+01
+          1.80252E-02         4.94852E-03        -1.05945E-02         1.13254E+00         5.30249E-01         1.13259E+00         7.91998E+01         1.00000E+00         2.33477E-06         7.91998E+01         2.38031E+01         5.53967E+01
+          1.80252E-02         5.11835E-03        -1.06482E-02         1.13254E+00         5.40919E-01         1.13259E+00         7.65487E+01         1.00000E+00         2.34458E-06         7.65487E+01         2.34335E+01         5.31153E+01
+          1.80252E-02         5.28818E-03        -1.07038E-02         1.13254E+00         5.51590E-01         1.13259E+00         7.39346E+01         1.00000E+00         2.35555E-06         7.39346E+01         2.30534E+01         5.08811E+01
+          1.80252E-02         5.45800E-03        -1.07611E-02         1.13254E+00         5.62261E-01         1.13259E+00         7.13597E+01         1.00000E+00         2.36771E-06         7.13597E+01         2.26633E+01         4.86964E+01
+          1.80252E-02         5.62783E-03        -1.08202E-02         1.13254E+00         5.72931E-01         1.13259E+00         6.88265E+01         1.00000E+00         2.38110E-06         6.88265E+01         2.22634E+01         4.65631E+01
+          1.80252E-02         5.79766E-03        -1.08812E-02         1.13254E+00         5.83602E-01         1.13259E+00         6.63368E+01         1.00000E+00         2.39574E-06         6.63368E+01         2.18540E+01         4.44828E+01
+          1.80252E-02         5.96749E-03        -1.09439E-02         1.13254E+00         5.94272E-01         1.13259E+00         6.38928E+01         1.00000E+00         2.41165E-06         6.38928E+01         2.14357E+01         4.24572E+01
+          1.80252E-02         6.13731E-03        -1.10085E-02         1.13254E+00         6.04943E-01         1.13259E+00         6.14963E+01         1.00000E+00         2.42886E-06         6.14963E+01         2.10087E+01         4.04876E+01
+          1.80252E-02         6.30714E-03        -1.10749E-02         1.13254E+00         6.15613E-01         1.13259E+00         5.91488E+01         1.00000E+00         2.44737E-06         5.91488E+01         2.05735E+01         3.85752E+01
+          1.80252E-02         6.47697E-03        -1.11431E-02         1.13254E+00         6.26284E-01         1.13259E+00         5.68518E+01         1.00000E+00         2.46721E-06         5.68518E+01         2.01307E+01         3.67211E+01
+          1.80252E-02         6.64680E-03        -1.12131E-02         1.13253E+00         6.36955E-01         1.13259E+00         5.46068E+01         1.00000E+00         2.48838E-06         5.46068E+01         1.96807E+01         3.49262E+01
+          1.80252E-02         6.81662E-03        -1.12849E-02         1.13253E+00         6.47625E-01         1.13259E+00         5.24150E+01         1.00000E+00         2.51090E-06         5.24150E+01         1.92240E+01         3.31910E+01
+          1.80252E-02         6.98645E-03        -1.13586E-02         1.13253E+00         6.58296E-01         1.13259E+00         5.02773E+01         1.00000E+00         2.53477E-06         5.02773E+01         1.87611E+01         3.15161E+01
+          1.80252E-02         7.15628E-03        -1.14340E-02         1.13253E+00         6.68966E-01         1.13259E+00         4.81947E+01         1.00000E+00         2.56000E-06         4.81947E+01         1.82928E+01         2.99019E+01
+          1.80252E-02         7.32611E-03        -1.15113E-02         1.13253E+00         6.79637E-01         1.13259E+00         4.61679E+01         1.00000E+00         2.58658E-06         4.61679E+01         1.78194E+01         2.83485E+01
+          1.80252E-02         7.49593E-03        -1.15903E-02         1.13253E+00         6.90307E-01         1.13259E+00         4.41976E+01         1.00000E+00         2.61452E-06         4.41976E+01         1.73417E+01         2.68559E+01
+          1.80252E-02         7.66576E-03        -1.16712E-02         1.13253E+00         7.00978E-01         1.13259E+00         4.22842E+01         1.00000E+00         2.64381E-06         4.22842E+01         1.68602E+01         2.54240E+01
+          1.80252E-02         7.83559E-03        -1.17539E-02         1.13252E+00         7.11649E-01         1.13258E+00         4.04280E+01         1.00000E+00         2.67445E-06         4.04280E+01         1.63756E+01         2.40524E+01
+          1.80252E-02         8.00542E-03        -1.18384E-02         1.13252E+00         7.22319E-01         1.13258E+00         3.86294E+01         1.00000E+00         2.70643E-06         3.86294E+01         1.58885E+01         2.27409E+01
+          1.80252E-02         8.17524E-03        -1.19247E-02         1.13252E+00         7.32990E-01         1.13258E+00         3.68883E+01         1.00000E+00         2.73975E-06         3.68883E+01         1.53996E+01         2.14887E+01
+          1.80252E-02         8.34507E-03        -1.20128E-02         1.13252E+00         7.43660E-01         1.13258E+00         3.52048E+01         1.00000E+00         2.77440E-06         3.52048E+01         1.49095E+01         2.02953E+01
+          1.80252E-02         8.51490E-03        -1.21028E-02         1.13252E+00         7.54331E-01         1.13258E+00         3.35786E+01         1.00000E+00         2.81038E-06         3.35786E+01         1.44190E+01         1.91597E+01
+          1.80252E-02         8.68473E-03        -1.21945E-02         1.13252E+00         7.65001E-01         1.13258E+00         3.20096E+01         1.00000E+00         2.84768E-06         3.20096E+01         1.39286E+01         1.80810E+01
+          1.80252E-02         8.85455E-03        -1.22881E-02         1.13251E+00         7.75672E-01         1.13258E+00         3.04972E+01         1.00000E+00         2.88628E-06         3.04972E+01         1.34390E+01         1.70582E+01
+          1.80252E-02         9.02438E-03        -1.23835E-02         1.13251E+00         7.86343E-01         1.13258E+00         2.90411E+01         1.00000E+00         2.92620E-06         2.90411E+01         1.29510E+01         1.60901E+01
+          1.80252E-02         9.19421E-03        -1.24807E-02         1.13251E+00         7.97013E-01         1.13258E+00         2.76407E+01         1.00000E+00         2.96741E-06         2.76407E+01         1.24652E+01         1.51755E+01
+          1.80252E-02         9.36403E-03        -1.25797E-02         1.13251E+00         8.07684E-01         1.13258E+00         2.62952E+01         1.00000E+00         3.00993E-06         2.62952E+01         1.19822E+01         1.43130E+01
+          1.80252E-02         9.53386E-03        -1.26805E-02         1.13251E+00         8.18354E-01         1.13258E+00         2.50040E+01         1.00000E+00         3.05375E-06         2.50040E+01         1.15027E+01         1.35013E+01
+          1.80252E-02         9.70369E-03        -1.27831E-02         1.13251E+00         8.29025E-01         1.13258E+00         2.37661E+01         1.00000E+00         3.09886E-06         2.37661E+01         1.10274E+01         1.27387E+01
+          1.80252E-02         9.87352E-03        -1.28876E-02         1.13250E+00         8.39695E-01         1.13258E+00         2.25808E+01         1.00000E+00         3.14528E-06         2.25808E+01         1.05569E+01         1.20239E+01
+          1.80252E-02         1.00433E-02        -1.29938E-02         1.13250E+00         8.50366E-01         1.13258E+00         2.14469E+01         1.00000E+00         3.19302E-06         2.14469E+01         1.00918E+01         1.13551E+01
+          1.80252E-02         1.02132E-02        -1.31019E-02         1.13250E+00         8.61037E-01         1.13258E+00         2.03635E+01         1.00000E+00         3.24207E-06         2.03635E+01         9.63274E+00         1.07307E+01
+          1.80252E-02         1.03830E-02        -1.32117E-02         1.13250E+00         8.71707E-01         1.13257E+00         1.93294E+01         1.00000E+00         3.29245E-06         1.93294E+01         9.18032E+00         1.01491E+01
+          1.80252E-02         1.05528E-02        -1.33234E-02         1.13250E+00         8.82378E-01         1.13257E+00         1.83435E+01         1.00000E+00         3.34419E-06         1.83435E+01         8.73512E+00         9.60837E+00
+          1.80252E-02         1.07227E-02        -1.34369E-02         1.13249E+00         8.93048E-01         1.13257E+00         1.74046E+01         1.00000E+00         3.39729E-06         1.74046E+01         8.29769E+00         9.10690E+00
+          1.80252E-02         1.08925E-02        -1.35522E-02         1.13249E+00         9.03719E-01         1.13257E+00         1.65114E+01         1.00000E+00         3.45178E-06         1.65114E+01         7.86857E+00         8.64286E+00
+          1.80252E-02         1.10623E-02        -1.36694E-02         1.13249E+00         9.14389E-01         1.13257E+00         1.56627E+01         1.00000E+00         3.50769E-06         1.56627E+01         7.44827E+00         8.21447E+00
+          1.80252E-02         1.12321E-02        -1.37883E-02         1.13249E+00         9.25060E-01         1.13257E+00         1.48572E+01         1.00000E+00         3.56505E-06         1.48572E+01         7.03729E+00         7.81994E+00
+          1.80252E-02         1.14020E-02        -1.39090E-02         1.13249E+00         9.35731E-01         1.13257E+00         1.40936E+01         1.00000E+00         3.62389E-06         1.40936E+01         6.63608E+00         7.45748E+00
+          1.80252E-02         1.15718E-02        -1.40316E-02         1.13248E+00         9.46401E-01         1.13257E+00         1.33704E+01         1.00000E+00         3.68425E-06         1.33704E+01         6.24509E+00         7.12530E+00
+          1.80252E-02         1.17416E-02        -1.41560E-02         1.13248E+00         9.57072E-01         1.13257E+00         1.26864E+01         1.00000E+00         3.74617E-06         1.26864E+01         5.86472E+00         6.82163E+00
+          1.80252E-02         1.19114E-02        -1.42822E-02         1.13248E+00         9.67742E-01         1.13257E+00         1.20401E+01         1.00000E+00         3.80968E-06         1.20401E+01         5.49537E+00         6.54473E+00
+          1.80252E-02         1.20813E-02        -1.44102E-02         1.13248E+00         9.78413E-01         1.13257E+00         1.14302E+01         1.00000E+00         3.87485E-06         1.14302E+01         5.13737E+00         6.29288E+00
+          1.80252E-02         1.22511E-02        -1.45400E-02         1.13247E+00         9.89083E-01         1.13257E+00         1.08554E+01         1.00000E+00         3.94171E-06         1.08554E+01         4.79105E+00         6.06438E+00
+          1.80252E-02         1.24209E-02        -1.46716E-02         1.13247E+00         9.99754E-01         1.13257E+00         1.03143E+01         1.00000E+00         4.01032E-06         1.03143E+01         4.45671E+00         5.85758E+00
+          1.80252E-02         1.25908E-02        -1.48050E-02         1.13247E+00         1.01042E+00         1.13257E+00         9.80545E+00         1.00000E+00         4.08072E-06         9.80545E+00         4.13459E+00         5.67086E+00
+          1.80252E-02         1.27606E-02        -1.49403E-02         1.13247E+00         1.02110E+00         1.13257E+00         9.32759E+00         1.00000E+00         4.15298E-06         9.32759E+00         3.82492E+00         5.50267E+00
+          1.80252E-02         1.29304E-02        -1.50773E-02         1.13246E+00         1.03177E+00         1.13256E+00         8.87938E+00         1.00000E+00         4.22713E-06         8.87938E+00         3.52790E+00         5.35148E+00
+          1.80252E-02         1.31002E-02        -1.52162E-02         1.13246E+00         1.04244E+00         1.13256E+00         8.45951E+00         1.00000E+00         4.30324E-06         8.45951E+00         3.24368E+00         5.21583E+00
+          1.80252E-02         1.32701E-02        -1.53569E-02         1.13246E+00         1.05311E+00         1.13256E+00         8.06669E+00         1.00000E+00         4.38135E-06         8.06669E+00         2.97239E+00         5.09430E+00
+          1.80252E-02         1.34399E-02        -1.54994E-02         1.13246E+00         1.06378E+00         1.13256E+00         7.69968E+00         1.00000E+00         4.46153E-06         7.69968E+00         2.71413E+00         4.98555E+00
+          1.80252E-02         1.36097E-02        -1.56437E-02         1.13245E+00         1.07445E+00         1.13256E+00         7.35723E+00         1.00000E+00         4.54380E-06         7.35723E+00         2.46896E+00         4.88828E+00
+          1.80252E-02         1.37795E-02        -1.57898E-02         1.13245E+00         1.08512E+00         1.13256E+00         7.03816E+00         1.00000E+00         4.62823E-06         7.03816E+00         2.23690E+00         4.80126E+00
+          1.80252E-02         1.39494E-02        -1.59377E-02         1.13245E+00         1.09579E+00         1.13256E+00         6.74129E+00         1.00000E+00         4.71485E-06         6.74129E+00         2.01795E+00         4.72335E+00
+          1.80252E-02         1.41192E-02        -1.60875E-02         1.13245E+00         1.10646E+00         1.13256E+00         6.46550E+00         1.00000E+00         4.80369E-06         6.46550E+00         1.81207E+00         4.65343E+00
+          1.80252E-02         1.42890E-02        -1.62390E-02         1.13244E+00         1.11713E+00         1.13256E+00         6.20968E+00         1.00000E+00         4.89480E-06         6.20968E+00         1.61921E+00         4.59047E+00
+          1.80252E-02         1.44589E-02        -1.63924E-02         1.13244E+00         1.12780E+00         1.13256E+00         5.97278E+00         1.00000E+00         4.98820E-06         5.97278E+00         1.43925E+00         4.53353E+00
+          1.80252E-02         1.46287E-02        -1.65476E-02         1.13244E+00         1.13847E+00         1.13256E+00         5.75377E+00         1.00000E+00         5.08392E-06         5.75377E+00         1.27208E+00         4.48169E+00
+          1.80252E-02         1.47985E-02        -1.67046E-02         1.13243E+00         1.14914E+00         1.13256E+00         5.55167E+00         1.00000E+00         5.18197E-06         5.55167E+00         1.11753E+00         4.43414E+00
+          1.80252E-02         1.49683E-02        -1.68634E-02         1.13243E+00         1.15981E+00         1.13256E+00         5.36555E+00         1.00000E+00         5.28236E-06         5.36555E+00         9.75428E-01         4.39012E+00
+          1.80252E-02         1.51382E-02        -1.70240E-02         1.13243E+00         1.17048E+00         1.13256E+00         5.19449E+00         1.00000E+00         5.38510E-06         5.19449E+00         8.45557E-01         4.34894E+00
+          1.80252E-02         1.53080E-02        -1.71864E-02         1.13243E+00         1.18115E+00         1.13256E+00         5.03764E+00         1.00000E+00         5.49019E-06         5.03764E+00         7.27681E-01         4.30996E+00
+          1.80252E-02         1.54778E-02        -1.73507E-02         1.13242E+00         1.19182E+00         1.13256E+00         4.89417E+00         1.00000E+00         5.59761E-06         4.89417E+00         6.21539E-01         4.27263E+00
+          1.80252E-02         1.56476E-02        -1.75167E-02         1.13242E+00         1.20249E+00         1.13256E+00         4.76330E+00         1.00000E+00         5.70735E-06         4.76330E+00         5.26845E-01         4.23646E+00
+          1.80252E-02         1.58175E-02        -1.76846E-02         1.13242E+00         1.21317E+00         1.13256E+00         4.64429E+00         1.00000E+00         5.81939E-06         4.64429E+00         4.43293E-01         4.20100E+00
+          1.80252E-02         1.59873E-02        -1.78543E-02         1.13241E+00         1.22384E+00         1.13255E+00         4.53642E+00         1.00000E+00         5.93370E-06         4.53642E+00         3.70555E-01         4.16587E+00
+          1.80252E-02         1.61571E-02        -1.80258E-02         1.13241E+00         1.23451E+00         1.13255E+00         4.43904E+00         1.00000E+00         6.05025E-06         4.43904E+00         3.08285E-01         4.13076E+00
+          1.80252E-02         1.63270E-02        -1.81991E-02         1.13241E+00         1.24518E+00         1.13255E+00         4.35152E+00         1.00000E+00         6.16899E-06         4.35152E+00         2.56118E-01         4.09540E+00
+          1.80252E-02         1.64968E-02        -1.83742E-02         1.13240E+00         1.25585E+00         1.13255E+00         4.27325E+00         1.00000E+00         6.28989E-06         4.27325E+00         2.13673E-01         4.05958E+00
+          1.80252E-02         1.66666E-02        -1.85511E-02         1.13240E+00         1.26652E+00         1.13255E+00         4.20369E+00         1.00000E+00         6.41290E-06         4.20369E+00         1.80554E-01         4.02314E+00
+          1.80252E-02         1.68364E-02        -1.87299E-02         1.13240E+00         1.27719E+00         1.13255E+00         4.14230E+00         1.00000E+00         6.53795E-06         4.14230E+00         1.56353E-01         3.98595E+00
+          1.80252E-02         1.70063E-02        -1.89104E-02         1.13239E+00         1.28786E+00         1.13255E+00         4.08860E+00         1.00000E+00         6.66501E-06         4.08860E+00         1.40648E-01         3.94795E+00
+          1.80252E-02         1.71761E-02        -1.90928E-02         1.13239E+00         1.29853E+00         1.13255E+00         4.04211E+00         1.00000E+00         6.79400E-06         4.04211E+00         1.33011E-01         3.90910E+00
+          1.80252E-02         1.73459E-02        -1.92770E-02         1.13239E+00         1.30920E+00         1.13255E+00         4.00241E+00         1.00000E+00         6.92488E-06         4.00241E+00         1.33001E-01         3.86941E+00
+          1.80252E-02         1.75158E-02        -1.94630E-02         1.13239E+00         1.31987E+00         1.13255E+00         3.96909E+00         1.00000E+00         7.05759E-06         3.96909E+00         1.40174E-01         3.82892E+00
+          1.80252E-02         1.76856E-02        -1.96508E-02         1.13238E+00         1.33054E+00         1.13255E+00         3.94178E+00         1.00000E+00         7.19206E-06         3.94178E+00         1.54077E-01         3.78770E+00
+          1.80252E-02         1.78554E-02        -1.98404E-02         1.13238E+00         1.34121E+00         1.13255E+00         3.92011E+00         1.00000E+00         7.32824E-06         3.92011E+00         1.74256E-01         3.74586E+00
+          1.80252E-02         1.80252E-02        -2.00318E-02         1.13237E+00         1.35188E+00         1.13255E+00         3.90376E+00         1.00000E+00         7.46609E-06         3.90376E+00         2.00254E-01         3.70351E+00
+          1.80252E-02         1.81951E-02        -2.02251E-02         1.13237E+00         1.36255E+00         1.13255E+00         3.89241E+00         1.00000E+00         7.60555E-06         3.89241E+00         2.31614E-01         3.66080E+00
+          1.80252E-02         1.83649E-02        -2.04201E-02         1.13237E+00         1.37322E+00         1.13255E+00         3.88577E+00         1.00000E+00         7.74657E-06         3.88577E+00         2.67878E-01         3.61789E+00
+          1.80252E-02         1.85347E-02        -2.06170E-02         1.13236E+00         1.38389E+00         1.13255E+00         3.88357E+00         1.00000E+00         7.88912E-06         3.88357E+00         3.08592E-01         3.57497E+00
+          1.80252E-02         1.87045E-02        -2.08157E-02         1.13236E+00         1.39457E+00         1.13255E+00         3.88554E+00         1.00000E+00         8.03317E-06         3.88554E+00         3.53306E-01         3.53223E+00
+          1.80252E-02         1.88744E-02        -2.10162E-02         1.13236E+00         1.40524E+00         1.13255E+00         3.89145E+00         1.00000E+00         8.17869E-06         3.89145E+00         4.01573E-01         3.48987E+00
+          1.80252E-02         1.90442E-02        -2.12185E-02         1.13235E+00         1.41591E+00         1.13255E+00         3.90105E+00         1.00000E+00         8.32566E-06         3.90105E+00         4.52953E-01         3.44810E+00
+          1.80252E-02         1.92140E-02        -2.14226E-02         1.13235E+00         1.42658E+00         1.13255E+00         3.91414E+00         1.00000E+00         8.47408E-06         3.91414E+00         5.07016E-01         3.40713E+00
+          1.80252E-02         1.93839E-02        -2.16286E-02         1.13235E+00         1.43725E+00         1.13255E+00         3.93050E+00         1.00000E+00         8.62395E-06         3.93050E+00         5.63337E-01         3.36716E+00
+          1.80252E-02         1.95537E-02        -2.18363E-02         1.13234E+00         1.44792E+00         1.13255E+00         3.94992E+00         1.00000E+00         8.77527E-06         3.94992E+00         6.21505E-01         3.32842E+00
+          1.80252E-02         1.97235E-02        -2.20459E-02         1.13234E+00         1.45859E+00         1.13255E+00         3.97222E+00         1.00000E+00         8.92807E-06         3.97222E+00         6.81117E-01         3.29110E+00
+          1.80252E-02         1.98933E-02        -2.22573E-02         1.13233E+00         1.46926E+00         1.13255E+00         3.99719E+00         1.00000E+00         9.08237E-06         3.99719E+00         7.41782E-01         3.25541E+00
+          1.80252E-02         2.00632E-02        -2.24704E-02         1.13233E+00         1.47993E+00         1.13255E+00         4.02467E+00         1.00000E+00         9.23822E-06         4.02467E+00         8.03125E-01         3.22154E+00
+          1.80252E-02         2.02330E-02        -2.26854E-02         1.13233E+00         1.49060E+00         1.13255E+00         4.05445E+00         1.00000E+00         9.39566E-06         4.05445E+00         8.64781E-01         3.18967E+00
+          1.80252E-02         2.04028E-02        -2.29023E-02         1.13232E+00         1.50127E+00         1.13255E+00         4.08636E+00         1.00000E+00         9.55474E-06         4.08636E+00         9.26402E-01         3.15996E+00
+          1.80252E-02         2.05726E-02        -2.31209E-02         1.13232E+00         1.51194E+00         1.13256E+00         4.12023E+00         1.00000E+00         9.71555E-06         4.12023E+00         9.87656E-01         3.13258E+00
+          1.80252E-02         2.07425E-02        -2.33413E-02         1.13232E+00         1.52261E+00         1.13256E+00         4.15588E+00         1.00000E+00         9.87813E-06         4.15588E+00         1.04822E+00         3.10766E+00
+          1.80252E-02         2.09123E-02        -2.35636E-02         1.13231E+00         1.53328E+00         1.13256E+00         4.19313E+00         1.00000E+00         1.00426E-05         4.19313E+00         1.10781E+00         3.08532E+00
+          1.80252E-02         2.10821E-02        -2.37876E-02         1.13231E+00         1.54395E+00         1.13256E+00         4.23179E+00         1.00000E+00         1.02090E-05         4.23179E+00         1.16612E+00         3.06567E+00
+          1.80252E-02         2.12520E-02        -2.40135E-02         1.13230E+00         1.55462E+00         1.13256E+00         4.27169E+00         1.00000E+00         1.03774E-05         4.27169E+00         1.22290E+00         3.04879E+00
+          1.80252E-02         2.14218E-02        -2.42412E-02         1.13230E+00         1.56529E+00         1.13256E+00         4.31266E+00         1.00000E+00         1.05480E-05         4.31266E+00         1.27789E+00         3.03476E+00
+          1.80252E-02         2.15916E-02        -2.44707E-02         1.13229E+00         1.57596E+00         1.13256E+00         4.35449E+00         1.00000E+00         1.07208E-05         4.35449E+00         1.33087E+00         3.02362E+00
+          1.80252E-02         2.17614E-02        -2.47020E-02         1.13229E+00         1.58664E+00         1.13256E+00         4.39702E+00         1.00000E+00         1.08959E-05         4.39702E+00         1.38163E+00         3.01540E+00
+          1.80252E-02         2.19313E-02        -2.49352E-02         1.13229E+00         1.59731E+00         1.13256E+00         4.44005E+00         1.00000E+00         1.10735E-05         4.44005E+00         1.42996E+00         3.01009E+00
+          1.80252E-02         2.21011E-02        -2.51701E-02         1.13228E+00         1.60798E+00         1.13256E+00         4.48340E+00         1.00000E+00         1.12535E-05         4.48340E+00         1.47570E+00         3.00770E+00
+          1.80252E-02         2.22709E-02        -2.54069E-02         1.13228E+00         1.61865E+00         1.13256E+00         4.52686E+00         1.00000E+00         1.14362E-05         4.52686E+00         1.51868E+00         3.00818E+00
+          1.80252E-02         2.24407E-02        -2.56454E-02         1.13227E+00         1.62932E+00         1.13256E+00         4.57025E+00         1.00000E+00         1.16215E-05         4.57025E+00         1.55878E+00         3.01147E+00
+          1.80252E-02         2.26106E-02        -2.58858E-02         1.13227E+00         1.63999E+00         1.13257E+00         4.61337E+00         1.00000E+00         1.18095E-05         4.61337E+00         1.59586E+00         3.01751E+00
+          1.80252E-02         2.27804E-02        -2.61280E-02         1.13226E+00         1.65066E+00         1.13257E+00         4.65602E+00         1.00000E+00         1.20003E-05         4.65602E+00         1.62983E+00         3.02620E+00
+          1.80252E-02         2.29502E-02        -2.63720E-02         1.13226E+00         1.66133E+00         1.13257E+00         4.69801E+00         1.00000E+00         1.21940E-05         4.69801E+00         1.66059E+00         3.03742E+00
+          1.80252E-02         2.31201E-02        -2.66178E-02         1.13226E+00         1.67200E+00         1.13257E+00         4.73914E+00         1.00000E+00         1.23905E-05         4.73914E+00         1.68809E+00         3.05105E+00
+          1.80252E-02         2.32899E-02        -2.68655E-02         1.13225E+00         1.68267E+00         1.13257E+00         4.77921E+00         1.00000E+00         1.25899E-05         4.77921E+00         1.71226E+00         3.06694E+00
+          1.80252E-02         2.34597E-02        -2.71149E-02         1.13225E+00         1.69334E+00         1.13257E+00         4.81801E+00         1.00000E+00         1.27923E-05         4.81801E+00         1.73308E+00         3.08493E+00
+          1.80252E-02         2.36295E-02        -2.73662E-02         1.13224E+00         1.70401E+00         1.13257E+00         4.85536E+00         1.00000E+00         1.29975E-05         4.85536E+00         1.75053E+00         3.10483E+00
+          1.80252E-02         2.37994E-02        -2.76193E-02         1.13224E+00         1.71468E+00         1.13257E+00         4.89105E+00         1.00000E+00         1.32056E-05         4.89105E+00         1.76459E+00         3.12646E+00
+          1.80252E-02         2.39692E-02        -2.78742E-02         1.13223E+00         1.72535E+00         1.13258E+00         4.92489E+00         1.00000E+00         1.34165E-05         4.92489E+00         1.77529E+00         3.14961E+00
+          1.80252E-02         2.41390E-02        -2.81309E-02         1.13223E+00         1.73602E+00         1.13258E+00         4.95670E+00         1.00000E+00         1.36301E-05         4.95670E+00         1.78264E+00         3.17406E+00
+          1.80252E-02         2.43088E-02        -2.83894E-02         1.13222E+00         1.74669E+00         1.13258E+00         4.98629E+00         1.00000E+00         1.38464E-05         4.98629E+00         1.78668E+00         3.19961E+00
+          1.80252E-02         2.44787E-02        -2.86497E-02         1.13222E+00         1.75736E+00         1.13258E+00         5.01347E+00         1.00000E+00         1.40653E-05         5.01347E+00         1.78747E+00         3.22600E+00
+          1.80252E-02         2.46485E-02        -2.89119E-02         1.13221E+00         1.76804E+00         1.13258E+00         5.03808E+00         1.00000E+00         1.42867E-05         5.03808E+00         1.78507E+00         3.25301E+00
+          1.80252E-02         2.48183E-02        -2.91758E-02         1.13221E+00         1.77871E+00         1.13259E+00         5.05994E+00         1.00000E+00         1.45104E-05         5.05994E+00         1.77955E+00         3.28039E+00
+          1.80252E-02         2.49882E-02        -2.94416E-02         1.13221E+00         1.78938E+00         1.13259E+00         5.07888E+00         1.00000E+00         1.47363E-05         5.07888E+00         1.77099E+00         3.30789E+00
+          1.80252E-02         2.51580E-02        -2.97092E-02         1.13220E+00         1.80005E+00         1.13259E+00         5.09476E+00         1.00000E+00         1.49643E-05         5.09476E+00         1.75949E+00         3.33527E+00
+          1.80252E-02         2.53278E-02        -2.99786E-02         1.13220E+00         1.81072E+00         1.13259E+00         5.10743E+00         1.00000E+00         1.51941E-05         5.10743E+00         1.74515E+00         3.36228E+00
+          1.80252E-02         2.54976E-02        -3.02498E-02         1.13219E+00         1.82139E+00         1.13259E+00         5.11675E+00         1.00000E+00         1.54257E-05         5.11675E+00         1.72809E+00         3.38866E+00
+          1.80252E-02         2.56675E-02        -3.05228E-02         1.13219E+00         1.83206E+00         1.13260E+00         5.12259E+00         1.00000E+00         1.56587E-05         5.12259E+00         1.70842E+00         3.41418E+00
+          1.80252E-02         2.58373E-02        -3.07976E-02         1.13218E+00         1.84273E+00         1.13260E+00         5.12485E+00         1.00000E+00         1.58931E-05         5.12485E+00         1.68626E+00         3.43858E+00
+          1.80252E-02         2.60071E-02        -3.10743E-02         1.13218E+00         1.85340E+00         1.13260E+00         5.12340E+00         1.00000E+00         1.61287E-05         5.12340E+00         1.66176E+00         3.46165E+00
+          1.80252E-02         2.61769E-02        -3.13528E-02         1.13217E+00         1.86407E+00         1.13260E+00         5.11817E+00         1.00000E+00         1.63652E-05         5.11817E+00         1.63503E+00         3.48314E+00
+          1.81951E-02         8.72665E-04        -1.00426E-02         1.14323E+00         2.74155E-01         1.14327E+00         1.41024E+02         1.00000E+00         1.63475E-06         1.41024E+02         2.53140E+01         1.15710E+02
+          1.81951E-02         1.04249E-03        -1.00528E-02         1.14323E+00         2.84826E-01         1.14327E+00         1.38578E+02         1.00000E+00         1.63147E-06         1.38578E+02         2.52551E+01         1.13323E+02
+          1.81951E-02         1.21232E-03        -1.00648E-02         1.14323E+00         2.95496E-01         1.14327E+00         1.36083E+02         1.00000E+00         1.62832E-06         1.36083E+02         2.51892E+01         1.10893E+02
+          1.81951E-02         1.38215E-03        -1.00786E-02         1.14323E+00         3.06167E-01         1.14327E+00         1.33540E+02         1.00000E+00         1.62530E-06         1.33540E+02         2.51159E+01         1.08424E+02
+          1.81951E-02         1.55197E-03        -1.00943E-02         1.14323E+00         3.16838E-01         1.14327E+00         1.30956E+02         1.00000E+00         1.62246E-06         1.30956E+02         2.50349E+01         1.05921E+02
+          1.81951E-02         1.72180E-03        -1.01118E-02         1.14323E+00         3.27508E-01         1.14327E+00         1.28334E+02         1.00000E+00         1.61982E-06         1.28334E+02         2.49458E+01         1.03388E+02
+          1.81951E-02         1.89163E-03        -1.01310E-02         1.14323E+00         3.38179E-01         1.14327E+00         1.25677E+02         1.00000E+00         1.61741E-06         1.25677E+02         2.48483E+01         1.00829E+02
+          1.81951E-02         2.06146E-03        -1.01521E-02         1.14323E+00         3.48849E-01         1.14327E+00         1.22991E+02         1.00000E+00         1.61526E-06         1.22991E+02         2.47420E+01         9.82494E+01
+          1.81951E-02         2.23128E-03        -1.01750E-02         1.14323E+00         3.59520E-01         1.14327E+00         1.20280E+02         1.00000E+00         1.61341E-06         1.20280E+02         2.46266E+01         9.56531E+01
+          1.81951E-02         2.40111E-03        -1.01997E-02         1.14323E+00         3.70190E-01         1.14327E+00         1.17546E+02         1.00000E+00         1.61189E-06         1.17546E+02         2.45017E+01         9.30447E+01
+          1.81951E-02         2.57094E-03        -1.02262E-02         1.14323E+00         3.80861E-01         1.14327E+00         1.14796E+02         1.00000E+00         1.61073E-06         1.14796E+02         2.43672E+01         9.04285E+01
+          1.81951E-02         2.74077E-03        -1.02546E-02         1.14323E+00         3.91532E-01         1.14327E+00         1.12032E+02         1.00000E+00         1.60996E-06         1.12032E+02         2.42228E+01         8.78088E+01
+          1.81951E-02         2.91059E-03        -1.02847E-02         1.14322E+00         4.02202E-01         1.14327E+00         1.09258E+02         1.00000E+00         1.60962E-06         1.09258E+02         2.40682E+01         8.51898E+01
+          1.81951E-02         3.08042E-03        -1.03167E-02         1.14322E+00         4.12873E-01         1.14327E+00         1.06479E+02         1.00000E+00         1.60975E-06         1.06479E+02         2.39032E+01         8.25756E+01
+          1.81951E-02         3.25025E-03        -1.03505E-02         1.14322E+00         4.23543E-01         1.14327E+00         1.03698E+02         1.00000E+00         1.61038E-06         1.03698E+02         2.37277E+01         7.99702E+01
+          1.81951E-02         3.42008E-03        -1.03860E-02         1.14322E+00         4.34214E-01         1.14327E+00         1.00919E+02         1.00000E+00         1.61153E-06         1.00919E+02         2.35414E+01         7.73777E+01
+          1.81951E-02         3.58990E-03        -1.04234E-02         1.14322E+00         4.44884E-01         1.14327E+00         9.81460E+01         1.00000E+00         1.61325E-06         9.81460E+01         2.33443E+01         7.48017E+01
+          1.81951E-02         3.75973E-03        -1.04626E-02         1.14322E+00         4.55555E-01         1.14327E+00         9.53823E+01         1.00000E+00         1.61557E-06         9.53823E+01         2.31362E+01         7.22460E+01
+          1.81951E-02         3.92956E-03        -1.05037E-02         1.14322E+00         4.66225E-01         1.14327E+00         9.26313E+01         1.00000E+00         1.61852E-06         9.26313E+01         2.29172E+01         6.97142E+01
+          1.81951E-02         4.09939E-03        -1.05465E-02         1.14322E+00         4.76896E-01         1.14327E+00         8.98966E+01         1.00000E+00         1.62213E-06         8.98966E+01         2.26871E+01         6.72095E+01
+          1.81951E-02         4.26921E-03        -1.05911E-02         1.14322E+00         4.87567E-01         1.14327E+00         8.71813E+01         1.00000E+00         1.62643E-06         8.71813E+01         2.24459E+01         6.47354E+01
+          1.81951E-02         4.43904E-03        -1.06376E-02         1.14322E+00         4.98237E-01         1.14327E+00         8.44887E+01         1.00000E+00         1.63146E-06         8.44887E+01         2.21937E+01         6.22950E+01
+          1.81951E-02         4.60887E-03        -1.06859E-02         1.14322E+00         5.08908E-01         1.14327E+00         8.18217E+01         1.00000E+00         1.63723E-06         8.18217E+01         2.19305E+01         5.98911E+01
+          1.81951E-02         4.77869E-03        -1.07359E-02         1.14322E+00         5.19578E-01         1.14327E+00         7.91832E+01         1.00000E+00         1.64377E-06         7.91832E+01         2.16565E+01         5.75267E+01
+          1.81951E-02         4.94852E-03        -1.07878E-02         1.14322E+00         5.30249E-01         1.14327E+00         7.65760E+01         1.00000E+00         1.65112E-06         7.65760E+01         2.13717E+01         5.52043E+01
+          1.81951E-02         5.11835E-03        -1.08415E-02         1.14321E+00         5.40919E-01         1.14327E+00         7.40027E+01         1.00000E+00         1.65929E-06         7.40027E+01         2.10763E+01         5.29265E+01
+          1.81951E-02         5.28818E-03        -1.08970E-02         1.14321E+00         5.51590E-01         1.14327E+00         7.14659E+01         1.00000E+00         1.66830E-06         7.14659E+01         2.07704E+01         5.06955E+01
+          1.81951E-02         5.45800E-03        -1.09544E-02         1.14321E+00         5.62261E-01         1.14326E+00         6.89678E+01         1.00000E+00         1.67818E-06         6.89678E+01         2.04544E+01         4.85134E+01
+          1.81951E-02         5.62783E-03        -1.10135E-02         1.14321E+00         5.72931E-01         1.14326E+00         6.65107E+01         1.00000E+00         1.68893E-06         6.65107E+01         2.01284E+01         4.63822E+01
+          1.81951E-02         5.79766E-03        -1.10744E-02         1.14321E+00         5.83602E-01         1.14326E+00         6.40965E+01         1.00000E+00         1.70059E-06         6.40965E+01         1.97928E+01         4.43037E+01
+          1.81951E-02         5.96749E-03        -1.11372E-02         1.14321E+00         5.94272E-01         1.14326E+00         6.17273E+01         1.00000E+00         1.71315E-06         6.17273E+01         1.94478E+01         4.22795E+01
+          1.81951E-02         6.13731E-03        -1.12018E-02         1.14321E+00         6.04943E-01         1.14326E+00         5.94047E+01         1.00000E+00         1.72663E-06         5.94047E+01         1.90938E+01         4.03109E+01
+          1.81951E-02         6.30714E-03        -1.12682E-02         1.14321E+00         6.15613E-01         1.14326E+00         5.71303E+01         1.00000E+00         1.74105E-06         5.71303E+01         1.87311E+01         3.83992E+01
+          1.81951E-02         6.47697E-03        -1.13364E-02         1.14321E+00         6.26284E-01         1.14326E+00         5.49057E+01         1.00000E+00         1.75640E-06         5.49057E+01         1.83602E+01         3.65455E+01
+          1.81951E-02         6.64680E-03        -1.14064E-02         1.14320E+00         6.36955E-01         1.14326E+00         5.27321E+01         1.00000E+00         1.77270E-06         5.27321E+01         1.79814E+01         3.47506E+01
+          1.81951E-02         6.81662E-03        -1.14782E-02         1.14320E+00         6.47625E-01         1.14326E+00         5.06106E+01         1.00000E+00         1.78995E-06         5.06106E+01         1.75953E+01         3.30153E+01
+          1.81951E-02         6.98645E-03        -1.15518E-02         1.14320E+00         6.58296E-01         1.14326E+00         4.85423E+01         1.00000E+00         1.80815E-06         4.85423E+01         1.72023E+01         3.13400E+01
+          1.81951E-02         7.15628E-03        -1.16273E-02         1.14320E+00         6.68966E-01         1.14326E+00         4.65280E+01         1.00000E+00         1.82731E-06         4.65280E+01         1.68028E+01         2.97252E+01
+          1.81951E-02         7.32611E-03        -1.17045E-02         1.14320E+00         6.79637E-01         1.14326E+00         4.45685E+01         1.00000E+00         1.84742E-06         4.45685E+01         1.63974E+01         2.81711E+01
+          1.81951E-02         7.49593E-03        -1.17836E-02         1.14320E+00         6.90307E-01         1.14326E+00         4.26644E+01         1.00000E+00         1.86849E-06         4.26644E+01         1.59867E+01         2.66776E+01
+          1.81951E-02         7.66576E-03        -1.18645E-02         1.14320E+00         7.00978E-01         1.14326E+00         4.08160E+01         1.00000E+00         1.89050E-06         4.08160E+01         1.55712E+01         2.52448E+01
+          1.81951E-02         7.83559E-03        -1.19472E-02         1.14319E+00         7.11649E-01         1.14326E+00         3.90237E+01         1.00000E+00         1.91347E-06         3.90237E+01         1.51514E+01         2.38723E+01
+          1.81951E-02         8.00542E-03        -1.20317E-02         1.14319E+00         7.22319E-01         1.14326E+00         3.72877E+01         1.00000E+00         1.93739E-06         3.72877E+01         1.47280E+01         2.25597E+01
+          1.81951E-02         8.17524E-03        -1.21180E-02         1.14319E+00         7.32990E-01         1.14326E+00         3.56080E+01         1.00000E+00         1.96226E-06         3.56080E+01         1.43015E+01         2.13066E+01
+          1.81951E-02         8.34507E-03        -1.22061E-02         1.14319E+00         7.43660E-01         1.14325E+00         3.39847E+01         1.00000E+00         1.98807E-06         3.39847E+01         1.38725E+01         2.01122E+01
+          1.81951E-02         8.51490E-03        -1.22961E-02         1.14319E+00         7.54331E-01         1.14325E+00         3.24174E+01         1.00000E+00         2.01483E-06         3.24174E+01         1.34417E+01         1.89757E+01
+          1.81951E-02         8.68473E-03        -1.23878E-02         1.14319E+00         7.65001E-01         1.14325E+00         3.09059E+01         1.00000E+00         2.04253E-06         3.09059E+01         1.30096E+01         1.78963E+01
+          1.81951E-02         8.85455E-03        -1.24814E-02         1.14318E+00         7.75672E-01         1.14325E+00         2.94498E+01         1.00000E+00         2.07117E-06         2.94498E+01         1.25769E+01         1.68728E+01
+          1.81951E-02         9.02438E-03        -1.25768E-02         1.14318E+00         7.86343E-01         1.14325E+00         2.80486E+01         1.00000E+00         2.10075E-06         2.80486E+01         1.21443E+01         1.59043E+01
+          1.81951E-02         9.19421E-03        -1.26739E-02         1.14318E+00         7.97013E-01         1.14325E+00         2.67017E+01         1.00000E+00         2.13129E-06         2.67017E+01         1.17123E+01         1.49894E+01
+          1.81951E-02         9.36403E-03        -1.27729E-02         1.14318E+00         8.07684E-01         1.14325E+00         2.54084E+01         1.00000E+00         2.16277E-06         2.54084E+01         1.12815E+01         1.41269E+01
+          1.81951E-02         9.53386E-03        -1.28738E-02         1.14318E+00         8.18354E-01         1.14325E+00         2.41680E+01         1.00000E+00         2.19521E-06         2.41680E+01         1.08527E+01         1.33153E+01
+          1.81951E-02         9.70369E-03        -1.29764E-02         1.14318E+00         8.29025E-01         1.14325E+00         2.29796E+01         1.00000E+00         2.22861E-06         2.29796E+01         1.04264E+01         1.25532E+01
+          1.81951E-02         9.87352E-03        -1.30808E-02         1.14317E+00         8.39695E-01         1.14325E+00         2.18422E+01         1.00000E+00         2.26298E-06         2.18422E+01         1.00032E+01         1.18390E+01
+          1.81951E-02         1.00433E-02        -1.31871E-02         1.14317E+00         8.50366E-01         1.14325E+00         2.07549E+01         1.00000E+00         2.29834E-06         2.07549E+01         9.58372E+00         1.11712E+01
+          1.81951E-02         1.02132E-02        -1.32951E-02         1.14317E+00         8.61037E-01         1.14325E+00         1.97167E+01         1.00000E+00         2.33469E-06         1.97167E+01         9.16856E+00         1.05481E+01
+          1.81951E-02         1.03830E-02        -1.34050E-02         1.14317E+00         8.71707E-01         1.14325E+00         1.87264E+01         1.00000E+00         2.37207E-06         1.87264E+01         8.75831E+00         9.96805E+00
+          1.81951E-02         1.05528E-02        -1.35167E-02         1.14317E+00         8.82378E-01         1.14325E+00         1.77828E+01         1.00000E+00         2.41047E-06         1.77828E+01         8.35351E+00         9.42925E+00
+          1.81951E-02         1.07227E-02        -1.36302E-02         1.14316E+00         8.93048E-01         1.14324E+00         1.68847E+01         1.00000E+00         2.44993E-06         1.68847E+01         7.95472E+00         8.93000E+00
+          1.81951E-02         1.08925E-02        -1.37455E-02         1.14316E+00         9.03719E-01         1.14324E+00         1.60310E+01         1.00000E+00         2.49047E-06         1.60310E+01         7.56247E+00         8.46851E+00
+          1.81951E-02         1.10623E-02        -1.38626E-02         1.14316E+00         9.14389E-01         1.14324E+00         1.52203E+01         1.00000E+00         2.53211E-06         1.52203E+01         7.17727E+00         8.04300E+00
+          1.81951E-02         1.12321E-02        -1.39816E-02         1.14316E+00         9.25060E-01         1.14324E+00         1.44513E+01         1.00000E+00         2.57489E-06         1.44513E+01         6.79961E+00         7.65166E+00
+          1.81951E-02         1.14020E-02        -1.41023E-02         1.14316E+00         9.35731E-01         1.14324E+00         1.37227E+01         1.00000E+00         2.61883E-06         1.37227E+01         6.42996E+00         7.29271E+00
+          1.81951E-02         1.15718E-02        -1.42249E-02         1.14315E+00         9.46401E-01         1.14324E+00         1.30331E+01         1.00000E+00         2.66397E-06         1.30331E+01         6.06877E+00         6.96435E+00
+          1.81951E-02         1.17416E-02        -1.43492E-02         1.14315E+00         9.57072E-01         1.14324E+00         1.23812E+01         1.00000E+00         2.71034E-06         1.23812E+01         5.71645E+00         6.66480E+00
+          1.81951E-02         1.19114E-02        -1.44754E-02         1.14315E+00         9.67742E-01         1.14324E+00         1.17657E+01         1.00000E+00         2.75798E-06         1.17657E+01         5.37340E+00         6.39231E+00
+          1.81951E-02         1.20813E-02        -1.46034E-02         1.14315E+00         9.78413E-01         1.14324E+00         1.11851E+01         1.00000E+00         2.80692E-06         1.11851E+01         5.03999E+00         6.14514E+00
+          1.81951E-02         1.22511E-02        -1.47332E-02         1.14314E+00         9.89083E-01         1.14324E+00         1.06381E+01         1.00000E+00         2.85720E-06         1.06381E+01         4.71656E+00         5.92158E+00
+          1.81951E-02         1.24209E-02        -1.48648E-02         1.14314E+00         9.99754E-01         1.14324E+00         1.01234E+01         1.00000E+00         2.90886E-06         1.01234E+01         4.40343E+00         5.71996E+00
+          1.81951E-02         1.25908E-02        -1.49983E-02         1.14314E+00         1.01042E+00         1.14324E+00         9.63954E+00         1.00000E+00         2.96195E-06         9.63954E+00         4.10089E+00         5.53865E+00
+          1.81951E-02         1.27606E-02        -1.51335E-02         1.14314E+00         1.02110E+00         1.14324E+00         9.18522E+00         1.00000E+00         3.01648E-06         9.18522E+00         3.80917E+00         5.37605E+00
+          1.81951E-02         1.29304E-02        -1.52706E-02         1.14313E+00         1.03177E+00         1.14324E+00         8.75915E+00         1.00000E+00         3.07252E-06         8.75915E+00         3.52852E+00         5.23063E+00
+          1.81951E-02         1.31002E-02        -1.54095E-02         1.14313E+00         1.04244E+00         1.14324E+00         8.36001E+00         1.00000E+00         3.13009E-06         8.36001E+00         3.25912E+00         5.10089E+00
+          1.81951E-02         1.32701E-02        -1.55501E-02         1.14313E+00         1.05311E+00         1.14323E+00         7.98653E+00         1.00000E+00         3.18922E-06         7.98653E+00         3.00114E+00         4.98539E+00
+          1.81951E-02         1.34399E-02        -1.56926E-02         1.14313E+00         1.06378E+00         1.14323E+00         7.63748E+00         1.00000E+00         3.24996E-06         7.63748E+00         2.75472E+00         4.88276E+00
+          1.81951E-02         1.36097E-02        -1.58369E-02         1.14312E+00         1.07445E+00         1.14323E+00         7.31162E+00         1.00000E+00         3.31233E-06         7.31162E+00         2.51995E+00         4.79167E+00
+          1.81951E-02         1.37795E-02        -1.59831E-02         1.14312E+00         1.08512E+00         1.14323E+00         7.00779E+00         1.00000E+00         3.37636E-06         7.00779E+00         2.29692E+00         4.71087E+00
+          1.81951E-02         1.39494E-02        -1.61310E-02         1.14312E+00         1.09579E+00         1.14323E+00         6.72482E+00         1.00000E+00         3.44207E-06         6.72482E+00         2.08566E+00         4.63917E+00
+          1.81951E-02         1.41192E-02        -1.62807E-02         1.14312E+00         1.10646E+00         1.14323E+00         6.46161E+00         1.00000E+00         3.50949E-06         6.46161E+00         1.88618E+00         4.57543E+00
+          1.81951E-02         1.42890E-02        -1.64323E-02         1.14311E+00         1.11713E+00         1.14323E+00         6.21707E+00         1.00000E+00         3.57863E-06         6.21707E+00         1.69848E+00         4.51860E+00
+          1.81951E-02         1.44589E-02        -1.65857E-02         1.14311E+00         1.12780E+00         1.14323E+00         5.99017E+00         1.00000E+00         3.64952E-06         5.99017E+00         1.52249E+00         4.46768E+00
+          1.81951E-02         1.46287E-02        -1.67408E-02         1.14311E+00         1.13847E+00         1.14323E+00         5.77990E+00         1.00000E+00         3.72214E-06         5.77990E+00         1.35816E+00         4.42174E+00
+          1.81951E-02         1.47985E-02        -1.68978E-02         1.14310E+00         1.14914E+00         1.14323E+00         5.58531E+00         1.00000E+00         3.79652E-06         5.58531E+00         1.20537E+00         4.37994E+00
+          1.81951E-02         1.49683E-02        -1.70566E-02         1.14310E+00         1.15981E+00         1.14323E+00         5.40547E+00         1.00000E+00         3.87265E-06         5.40547E+00         1.06399E+00         4.34148E+00
+          1.81951E-02         1.51382E-02        -1.72173E-02         1.14310E+00         1.17048E+00         1.14323E+00         5.23952E+00         1.00000E+00         3.95053E-06         5.23952E+00         9.33882E-01         4.30563E+00
+          1.81951E-02         1.53080E-02        -1.73797E-02         1.14310E+00         1.18115E+00         1.14323E+00         5.08660E+00         1.00000E+00         4.03015E-06         5.08660E+00         8.14849E-01         4.27176E+00
+          1.81951E-02         1.54778E-02        -1.75439E-02         1.14309E+00         1.19182E+00         1.14323E+00         4.94594E+00         1.00000E+00         4.11149E-06         4.94594E+00         7.06691E-01         4.23925E+00
+          1.81951E-02         1.56476E-02        -1.77100E-02         1.14309E+00         1.20249E+00         1.14323E+00         4.81678E+00         1.00000E+00         4.19454E-06         4.81678E+00         6.09180E-01         4.20760E+00
+          1.81951E-02         1.58175E-02        -1.78779E-02         1.14309E+00         1.21317E+00         1.14323E+00         4.69839E+00         1.00000E+00         4.27928E-06         4.69839E+00         5.22065E-01         4.17633E+00
+          1.81951E-02         1.59873E-02        -1.80475E-02         1.14308E+00         1.22384E+00         1.14323E+00         4.59013E+00         1.00000E+00         4.36567E-06         4.59013E+00         4.45076E-01         4.14505E+00
+          1.81951E-02         1.61571E-02        -1.82190E-02         1.14308E+00         1.23451E+00         1.14323E+00         4.49134E+00         1.00000E+00         4.45370E-06         4.49134E+00         3.77923E-01         4.11341E+00
+          1.81951E-02         1.63270E-02        -1.83923E-02         1.14308E+00         1.24518E+00         1.14322E+00         4.40143E+00         1.00000E+00         4.54333E-06         4.40143E+00         3.20296E-01         4.08114E+00
+          1.81951E-02         1.64968E-02        -1.85675E-02         1.14307E+00         1.25585E+00         1.14322E+00         4.31986E+00         1.00000E+00         4.63454E-06         4.31986E+00         2.71870E-01         4.04799E+00
+          1.81951E-02         1.66666E-02        -1.87444E-02         1.14307E+00         1.26652E+00         1.14322E+00         4.24609E+00         1.00000E+00         4.72727E-06         4.24609E+00         2.32304E-01         4.01379E+00
+          1.81951E-02         1.68364E-02        -1.89231E-02         1.14307E+00         1.27719E+00         1.14322E+00         4.17965E+00         1.00000E+00         4.82150E-06         4.17965E+00         2.01244E-01         3.97841E+00
+          1.81951E-02         1.70063E-02        -1.91037E-02         1.14306E+00         1.28786E+00         1.14322E+00         4.12008E+00         1.00000E+00         4.91719E-06         4.12008E+00         1.78322E-01         3.94176E+00
+          1.81951E-02         1.71761E-02        -1.92861E-02         1.14306E+00         1.29853E+00         1.14322E+00         4.06696E+00         1.00000E+00         5.01431E-06         4.06696E+00         1.63158E-01         3.90380E+00
+          1.81951E-02         1.73459E-02        -1.94702E-02         1.14306E+00         1.30920E+00         1.14322E+00         4.01990E+00         1.00000E+00         5.11281E-06         4.01990E+00         1.55366E-01         3.86454E+00
+          1.81951E-02         1.75158E-02        -1.96562E-02         1.14305E+00         1.31987E+00         1.14322E+00         3.97855E+00         1.00000E+00         5.21266E-06         3.97855E+00         1.54547E-01         3.82400E+00
+          1.81951E-02         1.76856E-02        -1.98440E-02         1.14305E+00         1.33054E+00         1.14322E+00         3.94256E+00         1.00000E+00         5.31384E-06         3.94256E+00         1.60299E-01         3.78226E+00
+          1.81951E-02         1.78554E-02        -2.00337E-02         1.14305E+00         1.34121E+00         1.14322E+00         3.91163E+00         1.00000E+00         5.41631E-06         3.91163E+00         1.72212E-01         3.73941E+00
+          1.81951E-02         1.80252E-02        -2.02251E-02         1.14304E+00         1.35188E+00         1.14322E+00         3.88547E+00         1.00000E+00         5.52004E-06         3.88547E+00         1.89875E-01         3.69560E+00
+          1.81951E-02         1.81951E-02        -2.04183E-02         1.14304E+00         1.36255E+00         1.14322E+00         3.86383E+00         1.00000E+00         5.62501E-06         3.86383E+00         2.12872E-01         3.65095E+00
+          1.81951E-02         1.83649E-02        -2.06134E-02         1.14304E+00         1.37322E+00         1.14322E+00         3.84645E+00         1.00000E+00         5.73121E-06         3.84645E+00         2.40788E-01         3.60566E+00
+          1.81951E-02         1.85347E-02        -2.08103E-02         1.14303E+00         1.38389E+00         1.14322E+00         3.83311E+00         1.00000E+00         5.83862E-06         3.83311E+00         2.73206E-01         3.55991E+00
+          1.81951E-02         1.87045E-02        -2.10089E-02         1.14303E+00         1.39457E+00         1.14322E+00         3.82361E+00         1.00000E+00         5.94725E-06         3.82361E+00         3.09712E-01         3.51390E+00
+          1.81951E-02         1.88744E-02        -2.12094E-02         1.14303E+00         1.40524E+00         1.14322E+00         3.81775E+00         1.00000E+00         6.05707E-06         3.81775E+00         3.49896E-01         3.46785E+00
+          1.81951E-02         1.90442E-02        -2.14118E-02         1.14302E+00         1.41591E+00         1.14322E+00         3.81534E+00         1.00000E+00         6.16811E-06         3.81534E+00         3.93352E-01         3.42199E+00
+          1.81951E-02         1.92140E-02        -2.16159E-02         1.14302E+00         1.42658E+00         1.14322E+00         3.81623E+00         1.00000E+00         6.28038E-06         3.81623E+00         4.39677E-01         3.37655E+00
+          1.81951E-02         1.93839E-02        -2.18218E-02         1.14301E+00         1.43725E+00         1.14322E+00         3.82024E+00         1.00000E+00         6.39389E-06         3.82024E+00         4.88478E-01         3.33176E+00
+          1.81951E-02         1.95537E-02        -2.20296E-02         1.14301E+00         1.44792E+00         1.14322E+00         3.82723E+00         1.00000E+00         6.50867E-06         3.82723E+00         5.39368E-01         3.28786E+00
+          1.81951E-02         1.97235E-02        -2.22391E-02         1.14301E+00         1.45859E+00         1.14322E+00         3.83705E+00         1.00000E+00         6.62476E-06         3.83705E+00         5.91969E-01         3.24508E+00
+          1.81951E-02         1.98933E-02        -2.24505E-02         1.14300E+00         1.46926E+00         1.14322E+00         3.84955E+00         1.00000E+00         6.74219E-06         3.84955E+00         6.45914E-01         3.20364E+00
+          1.81951E-02         2.00632E-02        -2.26637E-02         1.14300E+00         1.47993E+00         1.14322E+00         3.86461E+00         1.00000E+00         6.86101E-06         3.86461E+00         7.00845E-01         3.16377E+00
+          1.81951E-02         2.02330E-02        -2.28787E-02         1.14300E+00         1.49060E+00         1.14322E+00         3.88209E+00         1.00000E+00         6.98128E-06         3.88209E+00         7.56416E-01         3.12568E+00
+          1.81951E-02         2.04028E-02        -2.30955E-02         1.14299E+00         1.50127E+00         1.14322E+00         3.90186E+00         1.00000E+00         7.10304E-06         3.90186E+00         8.12296E-01         3.08956E+00
+          1.81951E-02         2.05726E-02        -2.33141E-02         1.14299E+00         1.51194E+00         1.14323E+00         3.92378E+00         1.00000E+00         7.22637E-06         3.92378E+00         8.68164E-01         3.05562E+00
+          1.81951E-02         2.07425E-02        -2.35346E-02         1.14298E+00         1.52261E+00         1.14323E+00         3.94772E+00         1.00000E+00         7.35132E-06         3.94772E+00         9.23716E-01         3.02401E+00
+          1.81951E-02         2.09123E-02        -2.37568E-02         1.14298E+00         1.53328E+00         1.14323E+00         3.97355E+00         1.00000E+00         7.47796E-06         3.97355E+00         9.78658E-01         2.99489E+00
+          1.81951E-02         2.10821E-02        -2.39809E-02         1.14298E+00         1.54395E+00         1.14323E+00         4.00113E+00         1.00000E+00         7.60637E-06         4.00113E+00         1.03272E+00         2.96841E+00
+          1.81951E-02         2.12520E-02        -2.42067E-02         1.14297E+00         1.55462E+00         1.14323E+00         4.03032E+00         1.00000E+00         7.73661E-06         4.03032E+00         1.08563E+00         2.94469E+00
+          1.81951E-02         2.14218E-02        -2.44344E-02         1.14297E+00         1.56529E+00         1.14323E+00         4.06099E+00         1.00000E+00         7.86875E-06         4.06099E+00         1.13715E+00         2.92384E+00
+          1.81951E-02         2.15916E-02        -2.46639E-02         1.14296E+00         1.57596E+00         1.14323E+00         4.09298E+00         1.00000E+00         8.00287E-06         4.09298E+00         1.18706E+00         2.90592E+00
+          1.81951E-02         2.17614E-02        -2.48953E-02         1.14296E+00         1.58664E+00         1.14323E+00         4.12614E+00         1.00000E+00         8.13904E-06         4.12614E+00         1.23513E+00         2.89101E+00
+          1.81951E-02         2.19313E-02        -2.51284E-02         1.14295E+00         1.59731E+00         1.14323E+00         4.16032E+00         1.00000E+00         8.27730E-06         4.16032E+00         1.28118E+00         2.87915E+00
+          1.81951E-02         2.21011E-02        -2.53633E-02         1.14295E+00         1.60798E+00         1.14323E+00         4.19537E+00         1.00000E+00         8.41772E-06         4.19537E+00         1.32502E+00         2.87035E+00
+          1.81951E-02         2.22709E-02        -2.56001E-02         1.14295E+00         1.61865E+00         1.14323E+00         4.23112E+00         1.00000E+00         8.56035E-06         4.23112E+00         1.36650E+00         2.86462E+00
+          1.81951E-02         2.24407E-02        -2.58387E-02         1.14294E+00         1.62932E+00         1.14323E+00         4.26740E+00         1.00000E+00         8.70524E-06         4.26740E+00         1.40547E+00         2.86193E+00
+          1.81951E-02         2.26106E-02        -2.60790E-02         1.14294E+00         1.63999E+00         1.14323E+00         4.30404E+00         1.00000E+00         8.85242E-06         4.30404E+00         1.44179E+00         2.86224E+00
+          1.81951E-02         2.27804E-02        -2.63212E-02         1.14293E+00         1.65066E+00         1.14324E+00         4.34086E+00         1.00000E+00         9.00190E-06         4.34086E+00         1.47537E+00         2.86549E+00
+          1.81951E-02         2.29502E-02        -2.65652E-02         1.14293E+00         1.66133E+00         1.14324E+00         4.37769E+00         1.00000E+00         9.15372E-06         4.37769E+00         1.50610E+00         2.87160E+00
+          1.81951E-02         2.31201E-02        -2.68111E-02         1.14292E+00         1.67200E+00         1.14324E+00         4.41435E+00         1.00000E+00         9.30787E-06         4.41435E+00         1.53390E+00         2.88045E+00
+          1.81951E-02         2.32899E-02        -2.70587E-02         1.14292E+00         1.68267E+00         1.14324E+00         4.45064E+00         1.00000E+00         9.46434E-06         4.45064E+00         1.55871E+00         2.89193E+00
+          1.81951E-02         2.34597E-02        -2.73082E-02         1.14291E+00         1.69334E+00         1.14324E+00         4.48639E+00         1.00000E+00         9.62312E-06         4.48639E+00         1.58049E+00         2.90590E+00
+          1.81951E-02         2.36295E-02        -2.75594E-02         1.14291E+00         1.70401E+00         1.14324E+00         4.52140E+00         1.00000E+00         9.78417E-06         4.52140E+00         1.59919E+00         2.92221E+00
+          1.81951E-02         2.37994E-02        -2.78125E-02         1.14291E+00         1.71468E+00         1.14324E+00         4.55548E+00         1.00000E+00         9.94744E-06         4.55548E+00         1.61480E+00         2.94068E+00
+          1.81951E-02         2.39692E-02        -2.80674E-02         1.14290E+00         1.72535E+00         1.14325E+00         4.58845E+00         1.00000E+00         1.01129E-05         4.58845E+00         1.62732E+00         2.96113E+00
+          1.81951E-02         2.41390E-02        -2.83241E-02         1.14290E+00         1.73602E+00         1.14325E+00         4.62011E+00         1.00000E+00         1.02804E-05         4.62011E+00         1.63675E+00         2.98335E+00
+          1.81951E-02         2.43088E-02        -2.85826E-02         1.14289E+00         1.74669E+00         1.14325E+00         4.65027E+00         1.00000E+00         1.04500E-05         4.65027E+00         1.64312E+00         3.00715E+00
+          1.81951E-02         2.44787E-02        -2.88429E-02         1.14289E+00         1.75736E+00         1.14325E+00         4.67876E+00         1.00000E+00         1.06215E-05         4.67876E+00         1.64647E+00         3.03229E+00
+          1.81951E-02         2.46485E-02        -2.91051E-02         1.14288E+00         1.76804E+00         1.14325E+00         4.70538E+00         1.00000E+00         1.07948E-05         4.70538E+00         1.64682E+00         3.05856E+00
+          1.81951E-02         2.48183E-02        -2.93690E-02         1.14288E+00         1.77871E+00         1.14325E+00         4.72995E+00         1.00000E+00         1.09698E-05         4.72995E+00         1.64425E+00         3.08570E+00
+          1.81951E-02         2.49882E-02        -2.96348E-02         1.14287E+00         1.78938E+00         1.14326E+00         4.75230E+00         1.00000E+00         1.11465E-05         4.75230E+00         1.63882E+00         3.11348E+00
+          1.81951E-02         2.51580E-02        -2.99024E-02         1.14287E+00         1.80005E+00         1.14326E+00         4.77227E+00         1.00000E+00         1.13246E-05         4.77227E+00         1.63061E+00         3.14165E+00
+          1.81951E-02         2.53278E-02        -3.01718E-02         1.14286E+00         1.81072E+00         1.14326E+00         4.78968E+00         1.00000E+00         1.15040E-05         4.78968E+00         1.61970E+00         3.16997E+00
+          1.81951E-02         2.54976E-02        -3.04430E-02         1.14286E+00         1.82139E+00         1.14326E+00         4.80437E+00         1.00000E+00         1.16847E-05         4.80437E+00         1.60619E+00         3.19818E+00
+          1.81951E-02         2.56675E-02        -3.07160E-02         1.14285E+00         1.83206E+00         1.14327E+00         4.81621E+00         1.00000E+00         1.18665E-05         4.81621E+00         1.59018E+00         3.22602E+00
+          1.81951E-02         2.58373E-02        -3.09909E-02         1.14285E+00         1.84273E+00         1.14327E+00         4.82504E+00         1.00000E+00         1.20492E-05         4.82504E+00         1.57178E+00         3.25326E+00
+          1.81951E-02         2.60071E-02        -3.12675E-02         1.14284E+00         1.85340E+00         1.14327E+00         4.83074E+00         1.00000E+00         1.22327E-05         4.83074E+00         1.55110E+00         3.27963E+00
+          1.81951E-02         2.61769E-02        -3.15460E-02         1.14284E+00         1.86407E+00         1.14327E+00         4.83318E+00         1.00000E+00         1.24168E-05         4.83318E+00         1.52826E+00         3.30491E+00
+          1.83649E-02         8.72665E-04        -1.02376E-02         1.15390E+00         2.74155E-01         1.15394E+00         1.36838E+02         1.00000E+00         1.13858E-06         1.36838E+02         2.16405E+01         1.15198E+02
+          1.83649E-02         1.04249E-03        -1.02479E-02         1.15390E+00         2.84826E-01         1.15394E+00         1.34455E+02         1.00000E+00         1.13658E-06         1.34455E+02         2.16264E+01         1.12828E+02
+          1.83649E-02         1.21232E-03        -1.02599E-02         1.15390E+00         2.95496E-01         1.15394E+00         1.32022E+02         1.00000E+00         1.13469E-06         1.32022E+02         2.16068E+01         1.10416E+02
+          1.83649E-02         1.38215E-03        -1.02737E-02         1.15390E+00         3.06167E-01         1.15394E+00         1.29545E+02         1.00000E+00         1.13293E-06         1.29545E+02         2.15812E+01         1.07964E+02
+          1.83649E-02         1.55197E-03        -1.02894E-02         1.15390E+00         3.16838E-01         1.15394E+00         1.27027E+02         1.00000E+00         1.13131E-06         1.27027E+02         2.15493E+01         1.05477E+02
+          1.83649E-02         1.72180E-03        -1.03068E-02         1.15390E+00         3.27508E-01         1.15394E+00         1.24471E+02         1.00000E+00         1.12986E-06         1.24471E+02         2.15106E+01         1.02961E+02
+          1.83649E-02         1.89163E-03        -1.03261E-02         1.15390E+00         3.38179E-01         1.15394E+00         1.21883E+02         1.00000E+00         1.12860E-06         1.21883E+02         2.14647E+01         1.00419E+02
+          1.83649E-02         2.06146E-03        -1.03472E-02         1.15390E+00         3.48849E-01         1.15394E+00         1.19266E+02         1.00000E+00         1.12755E-06         1.19266E+02         2.14113E+01         9.78551E+01
+          1.83649E-02         2.23128E-03        -1.03701E-02         1.15390E+00         3.59520E-01         1.15394E+00         1.16625E+02         1.00000E+00         1.12673E-06         1.16625E+02         2.13500E+01         9.52747E+01
+          1.83649E-02         2.40111E-03        -1.03948E-02         1.15390E+00         3.70190E-01         1.15394E+00         1.13962E+02         1.00000E+00         1.12618E-06         1.13962E+02         2.12805E+01         9.26819E+01
+          1.83649E-02         2.57094E-03        -1.04213E-02         1.15390E+00         3.80861E-01         1.15394E+00         1.11283E+02         1.00000E+00         1.12591E-06         1.11283E+02         2.12024E+01         9.00809E+01
+          1.83649E-02         2.74077E-03        -1.04497E-02         1.15390E+00         3.91532E-01         1.15394E+00         1.08591E+02         1.00000E+00         1.12594E-06         1.08591E+02         2.11154E+01         8.74759E+01
+          1.83649E-02         2.91059E-03        -1.04798E-02         1.15390E+00         4.02202E-01         1.15394E+00         1.05891E+02         1.00000E+00         1.12630E-06         1.05891E+02         2.10193E+01         8.48712E+01
+          1.83649E-02         3.08042E-03        -1.05118E-02         1.15389E+00         4.12873E-01         1.15394E+00         1.03185E+02         1.00000E+00         1.12702E-06         1.03185E+02         2.09138E+01         8.22708E+01
+          1.83649E-02         3.25025E-03        -1.05455E-02         1.15389E+00         4.23543E-01         1.15394E+00         1.00477E+02         1.00000E+00         1.12811E-06         1.00477E+02         2.07985E+01         7.96787E+01
+          1.83649E-02         3.42008E-03        -1.05811E-02         1.15389E+00         4.34214E-01         1.15394E+00         9.77724E+01         1.00000E+00         1.12960E-06         9.77724E+01         2.06735E+01         7.70989E+01
+          1.83649E-02         3.58990E-03        -1.06185E-02         1.15389E+00         4.44884E-01         1.15394E+00         9.50734E+01         1.00000E+00         1.13150E-06         9.50734E+01         2.05383E+01         7.45350E+01
+          1.83649E-02         3.75973E-03        -1.06577E-02         1.15389E+00         4.55555E-01         1.15394E+00         9.23838E+01         1.00000E+00         1.13385E-06         9.23838E+01         2.03930E+01         7.19908E+01
+          1.83649E-02         3.92956E-03        -1.06987E-02         1.15389E+00         4.66225E-01         1.15394E+00         8.97072E+01         1.00000E+00         1.13667E-06         8.97072E+01         2.02373E+01         6.94699E+01
+          1.83649E-02         4.09939E-03        -1.07416E-02         1.15389E+00         4.76896E-01         1.15394E+00         8.70467E+01         1.00000E+00         1.13996E-06         8.70467E+01         2.00712E+01         6.69755E+01
+          1.83649E-02         4.26921E-03        -1.07862E-02         1.15389E+00         4.87567E-01         1.15394E+00         8.44055E+01         1.00000E+00         1.14377E-06         8.44055E+01         1.98945E+01         6.45110E+01
+          1.83649E-02         4.43904E-03        -1.08327E-02         1.15389E+00         4.98237E-01         1.15394E+00         8.17869E+01         1.00000E+00         1.14809E-06         8.17869E+01         1.97073E+01         6.20795E+01
+          1.83649E-02         4.60887E-03        -1.08809E-02         1.15389E+00         5.08908E-01         1.15394E+00         7.91936E+01         1.00000E+00         1.15296E-06         7.91936E+01         1.95096E+01         5.96840E+01
+          1.83649E-02         4.77869E-03        -1.09310E-02         1.15389E+00         5.19578E-01         1.15394E+00         7.66285E+01         1.00000E+00         1.15838E-06         7.66285E+01         1.93013E+01         5.73273E+01
+          1.83649E-02         4.94852E-03        -1.09829E-02         1.15389E+00         5.30249E-01         1.15394E+00         7.40944E+01         1.00000E+00         1.16437E-06         7.40944E+01         1.90825E+01         5.50119E+01
+          1.83649E-02         5.11835E-03        -1.10366E-02         1.15388E+00         5.40919E-01         1.15394E+00         7.15938E+01         1.00000E+00         1.17096E-06         7.15938E+01         1.88533E+01         5.27405E+01
+          1.83649E-02         5.28818E-03        -1.10921E-02         1.15388E+00         5.51590E-01         1.15394E+00         6.91291E+01         1.00000E+00         1.17814E-06         6.91291E+01         1.86138E+01         5.05153E+01
+          1.83649E-02         5.45800E-03        -1.11494E-02         1.15388E+00         5.62261E-01         1.15394E+00         6.67026E+01         1.00000E+00         1.18594E-06         6.67026E+01         1.83642E+01         4.83384E+01
+          1.83649E-02         5.62783E-03        -1.12086E-02         1.15388E+00         5.72931E-01         1.15394E+00         6.43164E+01         1.00000E+00         1.19435E-06         6.43164E+01         1.81046E+01         4.62118E+01
+          1.83649E-02         5.79766E-03        -1.12695E-02         1.15388E+00         5.83602E-01         1.15394E+00         6.19726E+01         1.00000E+00         1.20341E-06         6.19726E+01         1.78353E+01         4.41373E+01
+          1.83649E-02         5.96749E-03        -1.13323E-02         1.15388E+00         5.94272E-01         1.15394E+00         5.96730E+01         1.00000E+00         1.21310E-06         5.96730E+01         1.75565E+01         4.21165E+01
+          1.83649E-02         6.13731E-03        -1.13969E-02         1.15388E+00         6.04943E-01         1.15393E+00         5.74192E+01         1.00000E+00         1.22344E-06         5.74192E+01         1.72684E+01         4.01508E+01
+          1.83649E-02         6.30714E-03        -1.14632E-02         1.15388E+00         6.15613E-01         1.15393E+00         5.52130E+01         1.00000E+00         1.23444E-06         5.52130E+01         1.69714E+01         3.82415E+01
+          1.83649E-02         6.47697E-03        -1.15314E-02         1.15388E+00         6.26284E-01         1.15393E+00         5.30556E+01         1.00000E+00         1.24610E-06         5.30556E+01         1.66658E+01         3.63898E+01
+          1.83649E-02         6.64680E-03        -1.16015E-02         1.15387E+00         6.36955E-01         1.15393E+00         5.09483E+01         1.00000E+00         1.25842E-06         5.09483E+01         1.63520E+01         3.45964E+01
+          1.83649E-02         6.81662E-03        -1.16733E-02         1.15387E+00         6.47625E-01         1.15393E+00         4.88923E+01         1.00000E+00         1.27140E-06         4.88923E+01         1.60302E+01         3.28621E+01
+          1.83649E-02         6.98645E-03        -1.17469E-02         1.15387E+00         6.58296E-01         1.15393E+00         4.68885E+01         1.00000E+00         1.28506E-06         4.68885E+01         1.57010E+01         3.11875E+01
+          1.83649E-02         7.15628E-03        -1.18224E-02         1.15387E+00         6.68966E-01         1.15393E+00         4.49378E+01         1.00000E+00         1.29939E-06         4.49378E+01         1.53647E+01         2.95731E+01
+          1.83649E-02         7.32611E-03        -1.18996E-02         1.15387E+00         6.79637E-01         1.15393E+00         4.30408E+01         1.00000E+00         1.31440E-06         4.30408E+01         1.50218E+01         2.80190E+01
+          1.83649E-02         7.49593E-03        -1.19787E-02         1.15387E+00         6.90307E-01         1.15393E+00         4.11981E+01         1.00000E+00         1.33007E-06         4.11981E+01         1.46728E+01         2.65253E+01
+          1.83649E-02         7.66576E-03        -1.20596E-02         1.15387E+00         7.00978E-01         1.15393E+00         3.94101E+01         1.00000E+00         1.34643E-06         3.94101E+01         1.43181E+01         2.50920E+01
+          1.83649E-02         7.83559E-03        -1.21423E-02         1.15386E+00         7.11649E-01         1.15393E+00         3.76771E+01         1.00000E+00         1.36346E-06         3.76771E+01         1.39583E+01         2.37188E+01
+          1.83649E-02         8.00542E-03        -1.22268E-02         1.15386E+00         7.22319E-01         1.15393E+00         3.59993E+01         1.00000E+00         1.38116E-06         3.59993E+01         1.35939E+01         2.24054E+01
+          1.83649E-02         8.17524E-03        -1.23131E-02         1.15386E+00         7.32990E-01         1.15393E+00         3.43767E+01         1.00000E+00         1.39955E-06         3.43767E+01         1.32254E+01         2.11513E+01
+          1.83649E-02         8.34507E-03        -1.24012E-02         1.15386E+00         7.43660E-01         1.15393E+00         3.28092E+01         1.00000E+00         1.41862E-06         3.28092E+01         1.28534E+01         1.99558E+01
+          1.83649E-02         8.51490E-03        -1.24911E-02         1.15386E+00         7.54331E-01         1.15393E+00         3.12966E+01         1.00000E+00         1.43837E-06         3.12966E+01         1.24784E+01         1.88183E+01
+          1.83649E-02         8.68473E-03        -1.25829E-02         1.15386E+00         7.65001E-01         1.15393E+00         2.98387E+01         1.00000E+00         1.45880E-06         2.98387E+01         1.21009E+01         1.77377E+01
+          1.83649E-02         8.85455E-03        -1.26765E-02         1.15385E+00         7.75672E-01         1.15392E+00         2.84349E+01         1.00000E+00         1.47993E-06         2.84349E+01         1.17217E+01         1.67132E+01
+          1.83649E-02         9.02438E-03        -1.27718E-02         1.15385E+00         7.86343E-01         1.15392E+00         2.70848E+01         1.00000E+00         1.50175E-06         2.70848E+01         1.13412E+01         1.57436E+01
+          1.83649E-02         9.19421E-03        -1.28690E-02         1.15385E+00         7.97013E-01         1.15392E+00         2.57878E+01         1.00000E+00         1.52427E-06         2.57878E+01         1.09600E+01         1.48278E+01
+          1.83649E-02         9.36403E-03        -1.29680E-02         1.15385E+00         8.07684E-01         1.15392E+00         2.45432E+01         1.00000E+00         1.54750E-06         2.45432E+01         1.05788E+01         1.39644E+01
+          1.83649E-02         9.53386E-03        -1.30688E-02         1.15385E+00         8.18354E-01         1.15392E+00         2.33501E+01         1.00000E+00         1.57145E-06         2.33501E+01         1.01980E+01         1.31521E+01
+          1.83649E-02         9.70369E-03        -1.31715E-02         1.15385E+00         8.29025E-01         1.15392E+00         2.22079E+01         1.00000E+00         1.59612E-06         2.22079E+01         9.81834E+00         1.23895E+01
+          1.83649E-02         9.87352E-03        -1.32759E-02         1.15384E+00         8.39695E-01         1.15392E+00         2.11154E+01         1.00000E+00         1.62153E-06         2.11154E+01         9.44033E+00         1.16750E+01
+          1.83649E-02         1.00433E-02        -1.33822E-02         1.15384E+00         8.50366E-01         1.15392E+00         2.00717E+01         1.00000E+00         1.64769E-06         2.00717E+01         9.06455E+00         1.10071E+01
+          1.83649E-02         1.02132E-02        -1.34902E-02         1.15384E+00         8.61037E-01         1.15392E+00         1.90758E+01         1.00000E+00         1.67462E-06         1.90758E+01         8.69158E+00         1.03842E+01
+          1.83649E-02         1.03830E-02        -1.36001E-02         1.15384E+00         8.71707E-01         1.15392E+00         1.81264E+01         1.00000E+00         1.70233E-06         1.81264E+01         8.32196E+00         9.80449E+00
+          1.83649E-02         1.05528E-02        -1.37118E-02         1.15384E+00         8.82378E-01         1.15392E+00         1.72226E+01         1.00000E+00         1.73084E-06         1.72226E+01         7.95624E+00         9.26637E+00
+          1.83649E-02         1.07227E-02        -1.38253E-02         1.15383E+00         8.93048E-01         1.15392E+00         1.63630E+01         1.00000E+00         1.76017E-06         1.63630E+01         7.59495E+00         8.76809E+00
+          1.83649E-02         1.08925E-02        -1.39406E-02         1.15383E+00         9.03719E-01         1.15392E+00         1.55465E+01         1.00000E+00         1.79034E-06         1.55465E+01         7.23862E+00         8.30786E+00
+          1.83649E-02         1.10623E-02        -1.40577E-02         1.15383E+00         9.14389E-01         1.15391E+00         1.47717E+01         1.00000E+00         1.82137E-06         1.47717E+01         6.88773E+00         7.88392E+00
+          1.83649E-02         1.12321E-02        -1.41766E-02         1.15383E+00         9.25060E-01         1.15391E+00         1.40373E+01         1.00000E+00         1.85328E-06         1.40373E+01         6.54278E+00         7.49447E+00
+          1.83649E-02         1.14020E-02        -1.42974E-02         1.15382E+00         9.35731E-01         1.15391E+00         1.33420E+01         1.00000E+00         1.88611E-06         1.33420E+01         6.20423E+00         7.13773E+00
+          1.83649E-02         1.15718E-02        -1.44199E-02         1.15382E+00         9.46401E-01         1.15391E+00         1.26844E+01         1.00000E+00         1.91987E-06         1.26844E+01         5.87253E+00         6.81189E+00
+          1.83649E-02         1.17416E-02        -1.45443E-02         1.15382E+00         9.57072E-01         1.15391E+00         1.20633E+01         1.00000E+00         1.95460E-06         1.20633E+01         5.54810E+00         6.51518E+00
+          1.83649E-02         1.19114E-02        -1.46705E-02         1.15382E+00         9.67742E-01         1.15391E+00         1.14772E+01         1.00000E+00         1.99031E-06         1.14772E+01         5.23134E+00         6.24583E+00
+          1.83649E-02         1.20813E-02        -1.47985E-02         1.15382E+00         9.78413E-01         1.15391E+00         1.09248E+01         1.00000E+00         2.02704E-06         1.09248E+01         4.92264E+00         6.00211E+00
+          1.83649E-02         1.22511E-02        -1.49283E-02         1.15381E+00         9.89083E-01         1.15391E+00         1.04046E+01         1.00000E+00         2.06481E-06         1.04046E+01         4.62235E+00         5.78229E+00
+          1.83649E-02         1.24209E-02        -1.50599E-02         1.15381E+00         9.99754E-01         1.15391E+00         9.91548E+00         1.00000E+00         2.10366E-06         9.91548E+00         4.33080E+00         5.58468E+00
+          1.83649E-02         1.25908E-02        -1.51934E-02         1.15381E+00         1.01042E+00         1.15391E+00         9.45594E+00         1.00000E+00         2.14360E-06         9.45594E+00         4.04829E+00         5.40765E+00
+          1.83649E-02         1.27606E-02        -1.53286E-02         1.15381E+00         1.02110E+00         1.15391E+00         9.02468E+00         1.00000E+00         2.18467E-06         9.02468E+00         3.77509E+00         5.24958E+00
+          1.83649E-02         1.29304E-02        -1.54657E-02         1.15380E+00         1.03177E+00         1.15391E+00         8.62039E+00         1.00000E+00         2.22688E-06         8.62039E+00         3.51147E+00         5.10892E+00
+          1.83649E-02         1.31002E-02        -1.56045E-02         1.15380E+00         1.04244E+00         1.15391E+00         8.24179E+00         1.00000E+00         2.27027E-06         8.24179E+00         3.25764E+00         4.98414E+00
+          1.83649E-02         1.32701E-02        -1.57452E-02         1.15380E+00         1.05311E+00         1.15391E+00         7.88760E+00         1.00000E+00         2.31485E-06         7.88760E+00         3.01380E+00         4.87380E+00
+          1.83649E-02         1.34399E-02        -1.58877E-02         1.15380E+00         1.06378E+00         1.15391E+00         7.55660E+00         1.00000E+00         2.36064E-06         7.55660E+00         2.78012E+00         4.77648E+00
+          1.83649E-02         1.36097E-02        -1.60320E-02         1.15379E+00         1.07445E+00         1.15390E+00         7.24757E+00         1.00000E+00         2.40767E-06         7.24757E+00         2.55672E+00         4.69085E+00
+          1.83649E-02         1.37795E-02        -1.61781E-02         1.15379E+00         1.08512E+00         1.15390E+00         6.95933E+00         1.00000E+00         2.45595E-06         6.95933E+00         2.34373E+00         4.61561E+00
+          1.83649E-02         1.39494E-02        -1.63261E-02         1.15379E+00         1.09579E+00         1.15390E+00         6.69076E+00         1.00000E+00         2.50549E-06         6.69076E+00         2.14122E+00         4.54954E+00
+          1.83649E-02         1.41192E-02        -1.64758E-02         1.15378E+00         1.10646E+00         1.15390E+00         6.44075E+00         1.00000E+00         2.55630E-06         6.44075E+00         1.94925E+00         4.49149E+00
+          1.83649E-02         1.42890E-02        -1.66274E-02         1.15378E+00         1.11713E+00         1.15390E+00         6.20823E+00         1.00000E+00         2.60840E-06         6.20823E+00         1.76785E+00         4.44038E+00
+          1.83649E-02         1.44589E-02        -1.67807E-02         1.15378E+00         1.12780E+00         1.15390E+00         5.99217E+00         1.00000E+00         2.66178E-06         5.99217E+00         1.59701E+00         4.39516E+00
+          1.83649E-02         1.46287E-02        -1.69359E-02         1.15378E+00         1.13847E+00         1.15390E+00         5.79160E+00         1.00000E+00         2.71645E-06         5.79160E+00         1.43670E+00         4.35489E+00
+          1.83649E-02         1.47985E-02        -1.70929E-02         1.15377E+00         1.14914E+00         1.15390E+00         5.60556E+00         1.00000E+00         2.77241E-06         5.60556E+00         1.28688E+00         4.31869E+00
+          1.83649E-02         1.49683E-02        -1.72517E-02         1.15377E+00         1.15981E+00         1.15390E+00         5.43317E+00         1.00000E+00         2.82966E-06         5.43317E+00         1.14745E+00         4.28572E+00
+          1.83649E-02         1.51382E-02        -1.74123E-02         1.15377E+00         1.17048E+00         1.15390E+00         5.27355E+00         1.00000E+00         2.88818E-06         5.27355E+00         1.01831E+00         4.25524E+00
+          1.83649E-02         1.53080E-02        -1.75748E-02         1.15376E+00         1.18115E+00         1.15390E+00         5.12590E+00         1.00000E+00         2.94798E-06         5.12590E+00         8.99337E-01         4.22656E+00
+          1.83649E-02         1.54778E-02        -1.77390E-02         1.15376E+00         1.19182E+00         1.15390E+00         4.98944E+00         1.00000E+00         3.00903E-06         4.98944E+00         7.90371E-01         4.19907E+00
+          1.83649E-02         1.56476E-02        -1.79051E-02         1.15376E+00         1.20249E+00         1.15390E+00         4.86344E+00         1.00000E+00         3.07132E-06         4.86344E+00         6.91236E-01         4.17221E+00
+          1.83649E-02         1.58175E-02        -1.80729E-02         1.15376E+00         1.21317E+00         1.15390E+00         4.74722E+00         1.00000E+00         3.13485E-06         4.74722E+00         6.01734E-01         4.14549E+00
+          1.83649E-02         1.59873E-02        -1.82426E-02         1.15375E+00         1.22384E+00         1.15390E+00         4.64012E+00         1.00000E+00         3.19958E-06         4.64012E+00         5.21646E-01         4.11848E+00
+          1.83649E-02         1.61571E-02        -1.84141E-02         1.15375E+00         1.23451E+00         1.15390E+00         4.54155E+00         1.00000E+00         3.26551E-06         4.54155E+00         4.50735E-01         4.09081E+00
+          1.83649E-02         1.63270E-02        -1.85874E-02         1.15375E+00         1.24518E+00         1.15390E+00         4.45093E+00         1.00000E+00         3.33260E-06         4.45093E+00         3.88743E-01         4.06219E+00
+          1.83649E-02         1.64968E-02        -1.87625E-02         1.15374E+00         1.25585E+00         1.15390E+00         4.36774E+00         1.00000E+00         3.40085E-06         4.36774E+00         3.35397E-01         4.03234E+00
+          1.83649E-02         1.66666E-02        -1.89394E-02         1.15374E+00         1.26652E+00         1.15390E+00         4.29149E+00         1.00000E+00         3.47022E-06         4.29149E+00         2.90407E-01         4.00108E+00
+          1.83649E-02         1.68364E-02        -1.91182E-02         1.15374E+00         1.27719E+00         1.15389E+00         4.22172E+00         1.00000E+00         3.54070E-06         4.22172E+00         2.53469E-01         3.96825E+00
+          1.83649E-02         1.70063E-02        -1.92987E-02         1.15373E+00         1.28786E+00         1.15389E+00         4.15803E+00         1.00000E+00         3.61227E-06         4.15803E+00         2.24265E-01         3.93376E+00
+          1.83649E-02         1.71761E-02        -1.94811E-02         1.15373E+00         1.29853E+00         1.15389E+00         4.10001E+00         1.00000E+00         3.68491E-06         4.10001E+00         2.02467E-01         3.89755E+00
+          1.83649E-02         1.73459E-02        -1.96653E-02         1.15373E+00         1.30920E+00         1.15389E+00         4.04733E+00         1.00000E+00         3.75860E-06         4.04733E+00         1.87733E-01         3.85959E+00
+          1.83649E-02         1.75158E-02        -1.98513E-02         1.15372E+00         1.31987E+00         1.15389E+00         3.99965E+00         1.00000E+00         3.83332E-06         3.99965E+00         1.79715E-01         3.81993E+00
+          1.83649E-02         1.76856E-02        -2.00391E-02         1.15372E+00         1.33054E+00         1.15389E+00         3.95668E+00         1.00000E+00         3.90906E-06         3.95668E+00         1.78056E-01         3.77863E+00
+          1.83649E-02         1.78554E-02        -2.02287E-02         1.15372E+00         1.34121E+00         1.15389E+00         3.91816E+00         1.00000E+00         3.98581E-06         3.91816E+00         1.82390E-01         3.73577E+00
+          1.83649E-02         1.80252E-02        -2.04201E-02         1.15371E+00         1.35188E+00         1.15389E+00         3.88383E+00         1.00000E+00         4.06357E-06         3.88383E+00         1.92350E-01         3.69148E+00
+          1.83649E-02         1.81951E-02        -2.06134E-02         1.15371E+00         1.36255E+00         1.15389E+00         3.85348E+00         1.00000E+00         4.14232E-06         3.85348E+00         2.07561E-01         3.64592E+00
+          1.83649E-02         1.83649E-02        -2.08084E-02         1.15371E+00         1.37322E+00         1.15389E+00         3.82691E+00         1.00000E+00         4.22206E-06         3.82691E+00         2.27649E-01         3.59926E+00
+          1.83649E-02         1.85347E-02        -2.10053E-02         1.15370E+00         1.38389E+00         1.15389E+00         3.80393E+00         1.00000E+00         4.30281E-06         3.80393E+00         2.52235E-01         3.55170E+00
+          1.83649E-02         1.87045E-02        -2.12040E-02         1.15370E+00         1.39457E+00         1.15389E+00         3.78438E+00         1.00000E+00         4.38457E-06         3.78438E+00         2.80944E-01         3.50344E+00
+          1.83649E-02         1.88744E-02        -2.14045E-02         1.15369E+00         1.40524E+00         1.15389E+00         3.76811E+00         1.00000E+00         4.46735E-06         3.76811E+00         3.13400E-01         3.45471E+00
+          1.83649E-02         1.90442E-02        -2.16068E-02         1.15369E+00         1.41591E+00         1.15389E+00         3.75499E+00         1.00000E+00         4.55117E-06         3.75499E+00         3.49228E-01         3.40576E+00
+          1.83649E-02         1.92140E-02        -2.18109E-02         1.15369E+00         1.42658E+00         1.15389E+00         3.74489E+00         1.00000E+00         4.63605E-06         3.74489E+00         3.88060E-01         3.35683E+00
+          1.83649E-02         1.93839E-02        -2.20169E-02         1.15368E+00         1.43725E+00         1.15389E+00         3.73769E+00         1.00000E+00         4.72202E-06         3.73769E+00         4.29530E-01         3.30816E+00
+          1.83649E-02         1.95537E-02        -2.22246E-02         1.15368E+00         1.44792E+00         1.15389E+00         3.73329E+00         1.00000E+00         4.80910E-06         3.73329E+00         4.73280E-01         3.26001E+00
+          1.83649E-02         1.97235E-02        -2.24342E-02         1.15368E+00         1.45859E+00         1.15389E+00         3.73160E+00         1.00000E+00         4.89734E-06         3.73160E+00         5.18957E-01         3.21264E+00
+          1.83649E-02         1.98933E-02        -2.26455E-02         1.15367E+00         1.46926E+00         1.15389E+00         3.73251E+00         1.00000E+00         4.98676E-06         3.73251E+00         5.66217E-01         3.16629E+00
+          1.83649E-02         2.00632E-02        -2.28587E-02         1.15367E+00         1.47993E+00         1.15389E+00         3.73593E+00         1.00000E+00         5.07742E-06         3.73593E+00         6.14724E-01         3.12121E+00
+          1.83649E-02         2.02330E-02        -2.30737E-02         1.15366E+00         1.49060E+00         1.15389E+00         3.74179E+00         1.00000E+00         5.16935E-06         3.74179E+00         6.64153E-01         3.07764E+00
+          1.83649E-02         2.04028E-02        -2.32905E-02         1.15366E+00         1.50127E+00         1.15389E+00         3.74998E+00         1.00000E+00         5.26260E-06         3.74998E+00         7.14188E-01         3.03579E+00
+          1.83649E-02         2.05726E-02        -2.35092E-02         1.15366E+00         1.51194E+00         1.15390E+00         3.76043E+00         1.00000E+00         5.35723E-06         3.76043E+00         7.64525E-01         2.99590E+00
+          1.83649E-02         2.07425E-02        -2.37296E-02         1.15365E+00         1.52261E+00         1.15390E+00         3.77304E+00         1.00000E+00         5.45328E-06         3.77304E+00         8.14872E-01         2.95817E+00
+          1.83649E-02         2.09123E-02        -2.39519E-02         1.15365E+00         1.53328E+00         1.15390E+00         3.78772E+00         1.00000E+00         5.55080E-06         3.78772E+00         8.64949E-01         2.92277E+00
+          1.83649E-02         2.10821E-02        -2.41759E-02         1.15364E+00         1.54395E+00         1.15390E+00         3.80438E+00         1.00000E+00         5.64984E-06         3.80438E+00         9.14490E-01         2.88989E+00
+          1.83649E-02         2.12520E-02        -2.44018E-02         1.15364E+00         1.55462E+00         1.15390E+00         3.82293E+00         1.00000E+00         5.75045E-06         3.82293E+00         9.63242E-01         2.85969E+00
+          1.83649E-02         2.14218E-02        -2.46295E-02         1.15364E+00         1.56529E+00         1.15390E+00         3.84325E+00         1.00000E+00         5.85268E-06         3.84325E+00         1.01097E+00         2.83228E+00
+          1.83649E-02         2.15916E-02        -2.48590E-02         1.15363E+00         1.57596E+00         1.15390E+00         3.86524E+00         1.00000E+00         5.95657E-06         3.86524E+00         1.05744E+00         2.80780E+00
+          1.83649E-02         2.17614E-02        -2.50903E-02         1.15363E+00         1.58664E+00         1.15390E+00         3.88880E+00         1.00000E+00         6.06216E-06         3.88880E+00         1.10245E+00         2.78635E+00
+          1.83649E-02         2.19313E-02        -2.53234E-02         1.15362E+00         1.59731E+00         1.15390E+00         3.91379E+00         1.00000E+00         6.16949E-06         3.91379E+00         1.14581E+00         2.76798E+00
+          1.83649E-02         2.21011E-02        -2.55584E-02         1.15362E+00         1.60798E+00         1.15390E+00         3.94009E+00         1.00000E+00         6.27859E-06         3.94009E+00         1.18733E+00         2.75277E+00
+          1.83649E-02         2.22709E-02        -2.57951E-02         1.15361E+00         1.61865E+00         1.15390E+00         3.96758E+00         1.00000E+00         6.38948E-06         3.96758E+00         1.22685E+00         2.74073E+00
+          1.83649E-02         2.24407E-02        -2.60337E-02         1.15361E+00         1.62932E+00         1.15390E+00         3.99611E+00         1.00000E+00         6.50218E-06         3.99611E+00         1.26422E+00         2.73189E+00
+          1.83649E-02         2.26106E-02        -2.62741E-02         1.15360E+00         1.63999E+00         1.15390E+00         4.02555E+00         1.00000E+00         6.61670E-06         4.02555E+00         1.29931E+00         2.72623E+00
+          1.83649E-02         2.27804E-02        -2.65163E-02         1.15360E+00         1.65066E+00         1.15391E+00         4.05573E+00         1.00000E+00         6.73305E-06         4.05573E+00         1.33201E+00         2.72373E+00
+          1.83649E-02         2.29502E-02        -2.67603E-02         1.15360E+00         1.66133E+00         1.15391E+00         4.08651E+00         1.00000E+00         6.85122E-06         4.08651E+00         1.36219E+00         2.72432E+00
+          1.83649E-02         2.31201E-02        -2.70061E-02         1.15359E+00         1.67200E+00         1.15391E+00         4.11773E+00         1.00000E+00         6.97119E-06         4.11773E+00         1.38979E+00         2.72793E+00
+          1.83649E-02         2.32899E-02        -2.72537E-02         1.15359E+00         1.68267E+00         1.15391E+00         4.14921E+00         1.00000E+00         7.09295E-06         4.14921E+00         1.41473E+00         2.73448E+00
+          1.83649E-02         2.34597E-02        -2.75032E-02         1.15358E+00         1.69334E+00         1.15391E+00         4.18078E+00         1.00000E+00         7.21647E-06         4.18078E+00         1.43694E+00         2.74385E+00
+          1.83649E-02         2.36295E-02        -2.77545E-02         1.15358E+00         1.70401E+00         1.15391E+00         4.21228E+00         1.00000E+00         7.34170E-06         4.21228E+00         1.45638E+00         2.75590E+00
+          1.83649E-02         2.37994E-02        -2.80075E-02         1.15357E+00         1.71468E+00         1.15391E+00         4.24352E+00         1.00000E+00         7.46861E-06         4.24352E+00         1.47303E+00         2.77049E+00
+          1.83649E-02         2.39692E-02        -2.82624E-02         1.15357E+00         1.72535E+00         1.15391E+00         4.27432E+00         1.00000E+00         7.59713E-06         4.27432E+00         1.48685E+00         2.78746E+00
+          1.83649E-02         2.41390E-02        -2.85191E-02         1.15356E+00         1.73602E+00         1.15392E+00         4.30449E+00         1.00000E+00         7.72721E-06         4.30449E+00         1.49786E+00         2.80663E+00
+          1.83649E-02         2.43088E-02        -2.87776E-02         1.15356E+00         1.74669E+00         1.15392E+00         4.33385E+00         1.00000E+00         7.85878E-06         4.33385E+00         1.50605E+00         2.82780E+00
+          1.83649E-02         2.44787E-02        -2.90380E-02         1.15355E+00         1.75736E+00         1.15392E+00         4.36222E+00         1.00000E+00         7.99176E-06         4.36222E+00         1.51145E+00         2.85077E+00
+          1.83649E-02         2.46485E-02        -2.93001E-02         1.15355E+00         1.76804E+00         1.15392E+00         4.38941E+00         1.00000E+00         8.12608E-06         4.38941E+00         1.51408E+00         2.87533E+00
+          1.83649E-02         2.48183E-02        -2.95641E-02         1.15354E+00         1.77871E+00         1.15392E+00         4.41523E+00         1.00000E+00         8.26164E-06         4.41523E+00         1.51399E+00         2.90124E+00
+          1.83649E-02         2.49882E-02        -2.98298E-02         1.15354E+00         1.78938E+00         1.15393E+00         4.43950E+00         1.00000E+00         8.39838E-06         4.43950E+00         1.51123E+00         2.92827E+00
+          1.83649E-02         2.51580E-02        -3.00974E-02         1.15353E+00         1.80005E+00         1.15393E+00         4.46204E+00         1.00000E+00         8.53618E-06         4.46204E+00         1.50585E+00         2.95619E+00
+          1.83649E-02         2.53278E-02        -3.03668E-02         1.15353E+00         1.81072E+00         1.15393E+00         4.48268E+00         1.00000E+00         8.67497E-06         4.48268E+00         1.49794E+00         2.98474E+00
+          1.83649E-02         2.54976E-02        -3.06380E-02         1.15352E+00         1.82139E+00         1.15393E+00         4.50125E+00         1.00000E+00         8.81466E-06         4.50125E+00         1.48757E+00         3.01368E+00
+          1.83649E-02         2.56675E-02        -3.09110E-02         1.15352E+00         1.83206E+00         1.15393E+00         4.51757E+00         1.00000E+00         8.95515E-06         4.51757E+00         1.47482E+00         3.04275E+00
+          1.83649E-02         2.58373E-02        -3.11859E-02         1.15351E+00         1.84273E+00         1.15394E+00         4.53149E+00         1.00000E+00         9.09636E-06         4.53149E+00         1.45978E+00         3.07170E+00
+          1.83649E-02         2.60071E-02        -3.14625E-02         1.15351E+00         1.85340E+00         1.15394E+00         4.54285E+00         1.00000E+00         9.23821E-06         4.54285E+00         1.44256E+00         3.10029E+00
+          1.83649E-02         2.61769E-02        -3.17410E-02         1.15350E+00         1.86407E+00         1.15394E+00         4.55151E+00         1.00000E+00         9.38061E-06         4.55151E+00         1.42326E+00         3.12825E+00
+          1.85347E-02         8.72665E-04        -1.04345E-02         1.16457E+00         2.74155E-01         1.16462E+00         1.32885E+02         1.00000E+00         7.90265E-07         1.32885E+02         1.83146E+01         1.14570E+02
+          1.85347E-02         1.04249E-03        -1.04448E-02         1.16457E+00         2.84826E-01         1.16462E+00         1.30560E+02         1.00000E+00         7.89158E-07         1.30560E+02         1.83379E+01         1.12222E+02
+          1.85347E-02         1.21232E-03        -1.04568E-02         1.16457E+00         2.95496E-01         1.16462E+00         1.28188E+02         1.00000E+00         7.88141E-07         1.28188E+02         1.83570E+01         1.09831E+02
+          1.85347E-02         1.38215E-03        -1.04706E-02         1.16457E+00         3.06167E-01         1.16462E+00         1.25772E+02         1.00000E+00         7.87228E-07         1.25772E+02         1.83713E+01         1.07401E+02
+          1.85347E-02         1.55197E-03        -1.04863E-02         1.16457E+00         3.16838E-01         1.16462E+00         1.23316E+02         1.00000E+00         7.86433E-07         1.23316E+02         1.83806E+01         1.04936E+02
+          1.85347E-02         1.72180E-03        -1.05037E-02         1.16457E+00         3.27508E-01         1.16462E+00         1.20824E+02         1.00000E+00         7.85772E-07         1.20824E+02         1.83843E+01         1.02440E+02
+          1.85347E-02         1.89163E-03        -1.05230E-02         1.16457E+00         3.38179E-01         1.16462E+00         1.18301E+02         1.00000E+00         7.85259E-07         1.18301E+02         1.83820E+01         9.99191E+01
+          1.85347E-02         2.06146E-03        -1.05441E-02         1.16457E+00         3.48849E-01         1.16462E+00         1.15750E+02         1.00000E+00         7.84910E-07         1.15750E+02         1.83733E+01         9.73764E+01
+          1.85347E-02         2.23128E-03        -1.05670E-02         1.16457E+00         3.59520E-01         1.16462E+00         1.13174E+02         1.00000E+00         7.84740E-07         1.13174E+02         1.83578E+01         9.48166E+01
+          1.85347E-02         2.40111E-03        -1.05917E-02         1.16457E+00         3.70190E-01         1.16462E+00         1.10579E+02         1.00000E+00         7.84766E-07         1.10579E+02         1.83352E+01         9.22439E+01
+          1.85347E-02         2.57094E-03        -1.06182E-02         1.16457E+00         3.80861E-01         1.16462E+00         1.07968E+02         1.00000E+00         7.85003E-07         1.07968E+02         1.83051E+01         8.96626E+01
+          1.85347E-02         2.74077E-03        -1.06466E-02         1.16457E+00         3.91532E-01         1.16461E+00         1.05344E+02         1.00000E+00         7.85466E-07         1.05344E+02         1.82671E+01         8.70769E+01
+          1.85347E-02         2.91059E-03        -1.06767E-02         1.16457E+00         4.02202E-01         1.16461E+00         1.02712E+02         1.00000E+00         7.86172E-07         1.02712E+02         1.82209E+01         8.44909E+01
+          1.85347E-02         3.08042E-03        -1.07087E-02         1.16456E+00         4.12873E-01         1.16461E+00         1.00075E+02         1.00000E+00         7.87135E-07         1.00075E+02         1.81663E+01         8.19087E+01
+          1.85347E-02         3.25025E-03        -1.07425E-02         1.16456E+00         4.23543E-01         1.16461E+00         9.74371E+01         1.00000E+00         7.88372E-07         9.74371E+01         1.81029E+01         7.93342E+01
+          1.85347E-02         3.42008E-03        -1.07780E-02         1.16456E+00         4.34214E-01         1.16461E+00         9.48018E+01         1.00000E+00         7.89898E-07         9.48018E+01         1.80304E+01         7.67714E+01
+          1.85347E-02         3.58990E-03        -1.08154E-02         1.16456E+00         4.44884E-01         1.16461E+00         9.21726E+01         1.00000E+00         7.91726E-07         9.21726E+01         1.79488E+01         7.42238E+01
+          1.85347E-02         3.75973E-03        -1.08546E-02         1.16456E+00         4.55555E-01         1.16461E+00         8.95529E+01         1.00000E+00         7.93872E-07         8.95529E+01         1.78576E+01         7.16953E+01
+          1.85347E-02         3.92956E-03        -1.08957E-02         1.16456E+00         4.66225E-01         1.16461E+00         8.69461E+01         1.00000E+00         7.96350E-07         8.69461E+01         1.77568E+01         6.91893E+01
+          1.85347E-02         4.09939E-03        -1.09385E-02         1.16456E+00         4.76896E-01         1.16461E+00         8.43554E+01         1.00000E+00         7.99172E-07         8.43554E+01         1.76463E+01         6.67091E+01
+          1.85347E-02         4.26921E-03        -1.09831E-02         1.16456E+00         4.87567E-01         1.16461E+00         8.17839E+01         1.00000E+00         8.02352E-07         8.17839E+01         1.75258E+01         6.42581E+01
+          1.85347E-02         4.43904E-03        -1.10296E-02         1.16456E+00         4.98237E-01         1.16461E+00         7.92347E+01         1.00000E+00         8.05902E-07         7.92347E+01         1.73953E+01         6.18393E+01
+          1.85347E-02         4.60887E-03        -1.10778E-02         1.16456E+00         5.08908E-01         1.16461E+00         7.67106E+01         1.00000E+00         8.09834E-07         7.67106E+01         1.72548E+01         5.94558E+01
+          1.85347E-02         4.77869E-03        -1.11279E-02         1.16456E+00         5.19578E-01         1.16461E+00         7.42143E+01         1.00000E+00         8.14158E-07         7.42143E+01         1.71041E+01         5.71102E+01
+          1.85347E-02         4.94852E-03        -1.11798E-02         1.16456E+00         5.30249E-01         1.16461E+00         7.17487E+01         1.00000E+00         8.18885E-07         7.17487E+01         1.69434E+01         5.48053E+01
+          1.85347E-02         5.11835E-03        -1.12335E-02         1.16456E+00         5.40919E-01         1.16461E+00         6.93160E+01         1.00000E+00         8.24025E-07         6.93160E+01         1.67726E+01         5.25435E+01
+          1.85347E-02         5.28818E-03        -1.12890E-02         1.16455E+00         5.51590E-01         1.16461E+00         6.69188E+01         1.00000E+00         8.29586E-07         6.69188E+01         1.65917E+01         5.03271E+01
+          1.85347E-02         5.45800E-03        -1.13463E-02         1.16455E+00         5.62261E-01         1.16461E+00         6.45592E+01         1.00000E+00         8.35577E-07         6.45592E+01         1.64009E+01         4.81583E+01
+          1.85347E-02         5.62783E-03        -1.14055E-02         1.16455E+00         5.72931E-01         1.16461E+00         6.22394E+01         1.00000E+00         8.42004E-07         6.22394E+01         1.62003E+01         4.60391E+01
+          1.85347E-02         5.79766E-03        -1.14664E-02         1.16455E+00         5.83602E-01         1.16461E+00         5.99613E+01         1.00000E+00         8.48875E-07         5.99613E+01         1.59900E+01         4.39712E+01
+          1.85347E-02         5.96749E-03        -1.15292E-02         1.16455E+00         5.94272E-01         1.16461E+00         5.77266E+01         1.00000E+00         8.56196E-07         5.77266E+01         1.57703E+01         4.19564E+01
+          1.85347E-02         6.13731E-03        -1.15938E-02         1.16455E+00         6.04943E-01         1.16461E+00         5.55371E+01         1.00000E+00         8.63972E-07         5.55371E+01         1.55412E+01         3.99959E+01
+          1.85347E-02         6.30714E-03        -1.16601E-02         1.16455E+00         6.15613E-01         1.16461E+00         5.33943E+01         1.00000E+00         8.72208E-07         5.33943E+01         1.53031E+01         3.80913E+01
+          1.85347E-02         6.47697E-03        -1.17283E-02         1.16455E+00         6.26284E-01         1.16461E+00         5.12996E+01         1.00000E+00         8.80909E-07         5.12996E+01         1.50562E+01         3.62434E+01
+          1.85347E-02         6.64680E-03        -1.17984E-02         1.16454E+00         6.36955E-01         1.16460E+00         4.92541E+01         1.00000E+00         8.90078E-07         4.92541E+01         1.48008E+01         3.44534E+01
+          1.85347E-02         6.81662E-03        -1.18702E-02         1.16454E+00         6.47625E-01         1.16460E+00         4.72590E+01         1.00000E+00         8.99719E-07         4.72590E+01         1.45371E+01         3.27219E+01
+          1.85347E-02         6.98645E-03        -1.19438E-02         1.16454E+00         6.58296E-01         1.16460E+00         4.53152E+01         1.00000E+00         9.09835E-07         4.53152E+01         1.42657E+01         3.10495E+01
+          1.85347E-02         7.15628E-03        -1.20193E-02         1.16454E+00         6.68966E-01         1.16460E+00         4.34236E+01         1.00000E+00         9.20429E-07         4.34236E+01         1.39868E+01         2.94368E+01
+          1.85347E-02         7.32611E-03        -1.20965E-02         1.16454E+00         6.79637E-01         1.16460E+00         4.15847E+01         1.00000E+00         9.31504E-07         4.15847E+01         1.37007E+01         2.78839E+01
+          1.85347E-02         7.49593E-03        -1.21756E-02         1.16454E+00         6.90307E-01         1.16460E+00         3.97991E+01         1.00000E+00         9.43063E-07         3.97991E+01         1.34080E+01         2.63911E+01
+          1.85347E-02         7.66576E-03        -1.22565E-02         1.16454E+00         7.00978E-01         1.16460E+00         3.80672E+01         1.00000E+00         9.55109E-07         3.80672E+01         1.31090E+01         2.49582E+01
+          1.85347E-02         7.83559E-03        -1.23391E-02         1.16453E+00         7.11649E-01         1.16460E+00         3.63893E+01         1.00000E+00         9.67645E-07         3.63893E+01         1.28042E+01         2.35851E+01
+          1.85347E-02         8.00542E-03        -1.24237E-02         1.16453E+00         7.22319E-01         1.16460E+00         3.47655E+01         1.00000E+00         9.80673E-07         3.47655E+01         1.24940E+01         2.22715E+01
+          1.85347E-02         8.17524E-03        -1.25100E-02         1.16453E+00         7.32990E-01         1.16460E+00         3.31959E+01         1.00000E+00         9.94197E-07         3.31959E+01         1.21790E+01         2.10169E+01
+          1.85347E-02         8.34507E-03        -1.25981E-02         1.16453E+00         7.43660E-01         1.16460E+00         3.16803E+01         1.00000E+00         1.00822E-06         3.16803E+01         1.18595E+01         1.98207E+01
+          1.85347E-02         8.51490E-03        -1.26880E-02         1.16453E+00         7.54331E-01         1.16460E+00         3.02185E+01         1.00000E+00         1.02275E-06         3.02185E+01         1.15362E+01         1.86822E+01
+          1.85347E-02         8.68473E-03        -1.27798E-02         1.16453E+00         7.65001E-01         1.16460E+00         2.88102E+01         1.00000E+00         1.03779E-06         2.88102E+01         1.12096E+01         1.76006E+01
+          1.85347E-02         8.85455E-03        -1.28734E-02         1.16452E+00         7.75672E-01         1.16460E+00         2.74551E+01         1.00000E+00         1.05334E-06         2.74551E+01         1.08801E+01         1.65750E+01
+          1.85347E-02         9.02438E-03        -1.29687E-02         1.16452E+00         7.86343E-01         1.16460E+00         2.61524E+01         1.00000E+00         1.06942E-06         2.61524E+01         1.05483E+01         1.56042E+01
+          1.85347E-02         9.19421E-03        -1.30659E-02         1.16452E+00         7.97013E-01         1.16459E+00         2.49018E+01         1.00000E+00         1.08602E-06         2.49018E+01         1.02147E+01         1.46871E+01
+          1.85347E-02         9.36403E-03        -1.31649E-02         1.16452E+00         8.07684E-01         1.16459E+00         2.37024E+01         1.00000E+00         1.10316E-06         2.37024E+01         9.87992E+00         1.38225E+01
+          1.85347E-02         9.53386E-03        -1.32657E-02         1.16452E+00         8.18354E-01         1.16459E+00         2.25534E+01         1.00000E+00         1.12085E-06         2.25534E+01         9.54444E+00         1.30090E+01
+          1.85347E-02         9.70369E-03        -1.33684E-02         1.16452E+00         8.29025E-01         1.16459E+00         2.14541E+01         1.00000E+00         1.13909E-06         2.14541E+01         9.20884E+00         1.22452E+01
+          1.85347E-02         9.87352E-03        -1.34728E-02         1.16451E+00         8.39695E-01         1.16459E+00         2.04034E+01         1.00000E+00         1.15790E-06         2.04034E+01         8.87364E+00         1.15297E+01
+          1.85347E-02         1.00433E-02        -1.35790E-02         1.16451E+00         8.50366E-01         1.16459E+00         1.94003E+01         1.00000E+00         1.17728E-06         1.94003E+01         8.53938E+00         1.08610E+01
+          1.85347E-02         1.02132E-02        -1.36871E-02         1.16451E+00         8.61037E-01         1.16459E+00         1.84439E+01         1.00000E+00         1.19725E-06         1.84439E+01         8.20661E+00         1.02373E+01
+          1.85347E-02         1.03830E-02        -1.37970E-02         1.16451E+00         8.71707E-01         1.16459E+00         1.75330E+01         1.00000E+00         1.21783E-06         1.75330E+01         7.87585E+00         9.65711E+00
+          1.85347E-02         1.05528E-02        -1.39087E-02         1.16451E+00         8.82378E-01         1.16459E+00         1.66663E+01         1.00000E+00         1.23902E-06         1.66663E+01         7.54762E+00         9.11870E+00
+          1.85347E-02         1.07227E-02        -1.40222E-02         1.16450E+00         8.93048E-01         1.16459E+00         1.58428E+01         1.00000E+00         1.26085E-06         1.58428E+01         7.22243E+00         8.62036E+00
+          1.85347E-02         1.08925E-02        -1.41375E-02         1.16450E+00         9.03719E-01         1.16459E+00         1.50611E+01         1.00000E+00         1.28332E-06         1.50611E+01         6.90079E+00         8.16034E+00
+          1.85347E-02         1.10623E-02        -1.42546E-02         1.16450E+00         9.14389E-01         1.16459E+00         1.43200E+01         1.00000E+00         1.30646E-06         1.43200E+01         6.58317E+00         7.73688E+00
+          1.85347E-02         1.12321E-02        -1.43735E-02         1.16450E+00         9.25060E-01         1.16459E+00         1.36182E+01         1.00000E+00         1.33028E-06         1.36182E+01         6.27005E+00         7.34819E+00
+          1.85347E-02         1.14020E-02        -1.44943E-02         1.16449E+00         9.35731E-01         1.16458E+00         1.29544E+01         1.00000E+00         1.35480E-06         1.29544E+01         5.96189E+00         6.99251E+00
+          1.85347E-02         1.15718E-02        -1.46168E-02         1.16449E+00         9.46401E-01         1.16458E+00         1.23272E+01         1.00000E+00         1.38004E-06         1.23272E+01         5.65912E+00         6.66803E+00
+          1.85347E-02         1.17416E-02        -1.47412E-02         1.16449E+00         9.57072E-01         1.16458E+00         1.17352E+01         1.00000E+00         1.40602E-06         1.17352E+01         5.36217E+00         6.37300E+00
+          1.85347E-02         1.19114E-02        -1.48674E-02         1.16449E+00         9.67742E-01         1.16458E+00         1.11771E+01         1.00000E+00         1.43275E-06         1.11771E+01         5.07145E+00         6.10564E+00
+          1.85347E-02         1.20813E-02        -1.49954E-02         1.16449E+00         9.78413E-01         1.16458E+00         1.06515E+01         1.00000E+00         1.46025E-06         1.06515E+01         4.78732E+00         5.86422E+00
+          1.85347E-02         1.22511E-02        -1.51252E-02         1.16448E+00         9.89083E-01         1.16458E+00         1.01572E+01         1.00000E+00         1.48855E-06         1.01572E+01         4.51017E+00         5.64701E+00
+          1.85347E-02         1.24209E-02        -1.52568E-02         1.16448E+00         9.99754E-01         1.16458E+00         9.69263E+00         1.00000E+00         1.51765E-06         9.69263E+00         4.24031E+00         5.45231E+00
+          1.85347E-02         1.25908E-02        -1.53902E-02         1.16448E+00         1.01042E+00         1.16458E+00         9.25657E+00         1.00000E+00         1.54758E-06         9.25657E+00         3.97808E+00         5.27849E+00
+          1.85347E-02         1.27606E-02        -1.55255E-02         1.16448E+00         1.02110E+00         1.16458E+00         8.84767E+00         1.00000E+00         1.57835E-06         8.84767E+00         3.72376E+00         5.12391E+00
+          1.85347E-02         1.29304E-02        -1.56625E-02         1.16447E+00         1.03177E+00         1.16458E+00         8.46462E+00         1.00000E+00         1.60998E-06         8.46462E+00         3.47762E+00         4.98701E+00
+          1.85347E-02         1.31002E-02        -1.58014E-02         1.16447E+00         1.04244E+00         1.16458E+00         8.10615E+00         1.00000E+00         1.64249E-06         8.10615E+00         3.23990E+00         4.86625E+00
+          1.85347E-02         1.32701E-02        -1.59421E-02         1.16447E+00         1.05311E+00         1.16458E+00         7.77098E+00         1.00000E+00         1.67588E-06         7.77098E+00         3.01083E+00         4.76015E+00
+          1.85347E-02         1.34399E-02        -1.60846E-02         1.16447E+00         1.06378E+00         1.16458E+00         7.45789E+00         1.00000E+00         1.71016E-06         7.45789E+00         2.79058E+00         4.66731E+00
+          1.85347E-02         1.36097E-02        -1.62289E-02         1.16446E+00         1.07445E+00         1.16458E+00         7.16568E+00         1.00000E+00         1.74536E-06         7.16568E+00         2.57934E+00         4.58634E+00
+          1.85347E-02         1.37795E-02        -1.63750E-02         1.16446E+00         1.08512E+00         1.16458E+00         6.89318E+00         1.00000E+00         1.78147E-06         6.89318E+00         2.37724E+00         4.51594E+00
+          1.85347E-02         1.39494E-02        -1.65229E-02         1.16446E+00         1.09579E+00         1.16457E+00         6.63925E+00         1.00000E+00         1.81851E-06         6.63925E+00         2.18439E+00         4.45486E+00
+          1.85347E-02         1.41192E-02        -1.66727E-02         1.16445E+00         1.10646E+00         1.16457E+00         6.40281E+00         1.00000E+00         1.85648E-06         6.40281E+00         2.00088E+00         4.40193E+00
+          1.85347E-02         1.42890E-02        -1.68242E-02         1.16445E+00         1.11713E+00         1.16457E+00         6.18280E+00         1.00000E+00         1.89538E-06         6.18280E+00         1.82678E+00         4.35602E+00
+          1.85347E-02         1.44589E-02        -1.69776E-02         1.16445E+00         1.12780E+00         1.16457E+00         5.97820E+00         1.00000E+00         1.93523E-06         5.97820E+00         1.66212E+00         4.31608E+00
+          1.85347E-02         1.46287E-02        -1.71328E-02         1.16445E+00         1.13847E+00         1.16457E+00         5.78804E+00         1.00000E+00         1.97601E-06         5.78804E+00         1.50691E+00         4.28113E+00
+          1.85347E-02         1.47985E-02        -1.72898E-02         1.16444E+00         1.14914E+00         1.16457E+00         5.61139E+00         1.00000E+00         2.01772E-06         5.61139E+00         1.36114E+00         4.25025E+00
+          1.85347E-02         1.49683E-02        -1.74486E-02         1.16444E+00         1.15981E+00         1.16457E+00         5.44735E+00         1.00000E+00         2.06038E-06         5.44735E+00         1.22477E+00         4.22258E+00
+          1.85347E-02         1.51382E-02        -1.76092E-02         1.16444E+00         1.17048E+00         1.16457E+00         5.29509E+00         1.00000E+00         2.10396E-06         5.29509E+00         1.09773E+00         4.19736E+00
+          1.85347E-02         1.53080E-02        -1.77716E-02         1.16443E+00         1.18115E+00         1.16457E+00         5.15380E+00         1.00000E+00         2.14847E-06         5.15380E+00         9.79948E-01         4.17385E+00
+          1.85347E-02         1.54778E-02        -1.79359E-02         1.16443E+00         1.19182E+00         1.16457E+00         5.02273E+00         1.00000E+00         2.19389E-06         5.02273E+00         8.71306E-01         4.15142E+00
+          1.85347E-02         1.56476E-02        -1.81019E-02         1.16443E+00         1.20249E+00         1.16457E+00         4.90116E+00         1.00000E+00         2.24023E-06         4.90116E+00         7.71677E-01         4.12948E+00
+          1.85347E-02         1.58175E-02        -1.82698E-02         1.16442E+00         1.21317E+00         1.16457E+00         4.78842E+00         1.00000E+00         2.28747E-06         4.78842E+00         6.80908E-01         4.10751E+00
+          1.85347E-02         1.59873E-02        -1.84395E-02         1.16442E+00         1.22384E+00         1.16457E+00         4.68388E+00         1.00000E+00         2.33560E-06         4.68388E+00         5.98829E-01         4.08505E+00
+          1.85347E-02         1.61571E-02        -1.86110E-02         1.16442E+00         1.23451E+00         1.16457E+00         4.58696E+00         1.00000E+00         2.38461E-06         4.58696E+00         5.25250E-01         4.06171E+00
+          1.85347E-02         1.63270E-02        -1.87843E-02         1.16442E+00         1.24518E+00         1.16457E+00         4.49712E+00         1.00000E+00         2.43450E-06         4.49712E+00         4.59960E-01         4.03716E+00
+          1.85347E-02         1.64968E-02        -1.89594E-02         1.16441E+00         1.25585E+00         1.16457E+00         4.41385E+00         1.00000E+00         2.48525E-06         4.41385E+00         4.02734E-01         4.01111E+00
+          1.85347E-02         1.66666E-02        -1.91363E-02         1.16441E+00         1.26652E+00         1.16457E+00         4.33668E+00         1.00000E+00         2.53686E-06         4.33668E+00         3.53331E-01         3.98335E+00
+          1.85347E-02         1.68364E-02        -1.93151E-02         1.16441E+00         1.27719E+00         1.16457E+00         4.26519E+00         1.00000E+00         2.58930E-06         4.26519E+00         3.11493E-01         3.95370E+00
+          1.85347E-02         1.70063E-02        -1.94956E-02         1.16440E+00         1.28786E+00         1.16457E+00         4.19899E+00         1.00000E+00         2.64259E-06         4.19899E+00         2.76951E-01         3.92204E+00
+          1.85347E-02         1.71761E-02        -1.96780E-02         1.16440E+00         1.29853E+00         1.16456E+00         4.13771E+00         1.00000E+00         2.69671E-06         4.13771E+00         2.49420E-01         3.88829E+00
+          1.85347E-02         1.73459E-02        -1.98622E-02         1.16440E+00         1.30920E+00         1.16456E+00         4.08104E+00         1.00000E+00         2.75165E-06         4.08104E+00         2.28608E-01         3.85243E+00
+          1.85347E-02         1.75158E-02        -2.00482E-02         1.16439E+00         1.31987E+00         1.16456E+00         4.02868E+00         1.00000E+00         2.80741E-06         4.02868E+00         2.14208E-01         3.81447E+00
+          1.85347E-02         1.76856E-02        -2.02360E-02         1.16439E+00         1.33054E+00         1.16456E+00         3.98036E+00         1.00000E+00         2.86399E-06         3.98036E+00         2.05909E-01         3.77445E+00
+          1.85347E-02         1.78554E-02        -2.04256E-02         1.16438E+00         1.34121E+00         1.16456E+00         3.93586E+00         1.00000E+00         2.92139E-06         3.93586E+00         2.03388E-01         3.73247E+00
+          1.85347E-02         1.80252E-02        -2.06170E-02         1.16438E+00         1.35188E+00         1.16456E+00         3.89496E+00         1.00000E+00         2.97961E-06         3.89496E+00         2.06320E-01         3.68864E+00
+          1.85347E-02         1.81951E-02        -2.08103E-02         1.16438E+00         1.36255E+00         1.16456E+00         3.85748E+00         1.00000E+00         3.03866E-06         3.85748E+00         2.14371E-01         3.64311E+00
+          1.85347E-02         1.83649E-02        -2.10053E-02         1.16437E+00         1.37322E+00         1.16456E+00         3.82324E+00         1.00000E+00         3.09854E-06         3.82324E+00         2.27205E-01         3.59604E+00
+          1.85347E-02         1.85347E-02        -2.12022E-02         1.16437E+00         1.38389E+00         1.16456E+00         3.79212E+00         1.00000E+00         3.15927E-06         3.79212E+00         2.44483E-01         3.54763E+00
+          1.85347E-02         1.87045E-02        -2.14009E-02         1.16437E+00         1.39457E+00         1.16456E+00         3.76397E+00         1.00000E+00         3.22086E-06         3.76397E+00         2.65864E-01         3.49811E+00
+          1.85347E-02         1.88744E-02        -2.16014E-02         1.16436E+00         1.40524E+00         1.16456E+00         3.73869E+00         1.00000E+00         3.28332E-06         3.73869E+00         2.91009E-01         3.44769E+00
+          1.85347E-02         1.90442E-02        -2.18037E-02         1.16436E+00         1.41591E+00         1.16456E+00         3.71619E+00         1.00000E+00         3.34667E-06         3.71619E+00         3.19576E-01         3.39662E+00
+          1.85347E-02         1.92140E-02        -2.20078E-02         1.16436E+00         1.42658E+00         1.16456E+00         3.69638E+00         1.00000E+00         3.41094E-06         3.69638E+00         3.51228E-01         3.34515E+00
+          1.85347E-02         1.93839E-02        -2.22137E-02         1.16435E+00         1.43725E+00         1.16456E+00         3.67919E+00         1.00000E+00         3.47614E-06         3.67919E+00         3.85630E-01         3.29356E+00
+          1.85347E-02         1.95537E-02        -2.24215E-02         1.16435E+00         1.44792E+00         1.16456E+00         3.66454E+00         1.00000E+00         3.54231E-06         3.66454E+00         4.22451E-01         3.24209E+00
+          1.85347E-02         1.97235E-02        -2.26310E-02         1.16434E+00         1.45859E+00         1.16456E+00         3.65240E+00         1.00000E+00         3.60946E-06         3.65240E+00         4.61366E-01         3.19103E+00
+          1.85347E-02         1.98933E-02        -2.28424E-02         1.16434E+00         1.46926E+00         1.16456E+00         3.64270E+00         1.00000E+00         3.67764E-06         3.64270E+00         5.02054E-01         3.14064E+00
+          1.85347E-02         2.00632E-02        -2.30556E-02         1.16434E+00         1.47993E+00         1.16456E+00         3.63539E+00         1.00000E+00         3.74687E-06         3.63539E+00         5.44202E-01         3.09119E+00
+          1.85347E-02         2.02330E-02        -2.32706E-02         1.16433E+00         1.49060E+00         1.16456E+00         3.63043E+00         1.00000E+00         3.81719E-06         3.63043E+00         5.87506E-01         3.04292E+00
+          1.85347E-02         2.04028E-02        -2.34874E-02         1.16433E+00         1.50127E+00         1.16456E+00         3.62777E+00         1.00000E+00         3.88862E-06         3.62777E+00         6.31670E-01         2.99610E+00
+          1.85347E-02         2.05726E-02        -2.37060E-02         1.16432E+00         1.51194E+00         1.16457E+00         3.62738E+00         1.00000E+00         3.96120E-06         3.62738E+00         6.76406E-01         2.95097E+00
+          1.85347E-02         2.07425E-02        -2.39265E-02         1.16432E+00         1.52261E+00         1.16457E+00         3.62920E+00         1.00000E+00         4.03496E-06         3.62920E+00         7.21438E-01         2.90776E+00
+          1.85347E-02         2.09123E-02        -2.41487E-02         1.16432E+00         1.53328E+00         1.16457E+00         3.63318E+00         1.00000E+00         4.10994E-06         3.63318E+00         7.66500E-01         2.86668E+00
+          1.85347E-02         2.10821E-02        -2.43728E-02         1.16431E+00         1.54395E+00         1.16457E+00         3.63927E+00         1.00000E+00         4.18616E-06         3.63927E+00         8.11336E-01         2.82793E+00
+          1.85347E-02         2.12520E-02        -2.45987E-02         1.16431E+00         1.55462E+00         1.16457E+00         3.64741E+00         1.00000E+00         4.26366E-06         3.64741E+00         8.55705E-01         2.79170E+00
+          1.85347E-02         2.14218E-02        -2.48263E-02         1.16430E+00         1.56529E+00         1.16457E+00         3.65754E+00         1.00000E+00         4.34246E-06         3.65754E+00         8.99374E-01         2.75816E+00
+          1.85347E-02         2.15916E-02        -2.50558E-02         1.16430E+00         1.57596E+00         1.16457E+00         3.66959E+00         1.00000E+00         4.42259E-06         3.66959E+00         9.42127E-01         2.72746E+00
+          1.85347E-02         2.17614E-02        -2.52872E-02         1.16429E+00         1.58664E+00         1.16457E+00         3.68348E+00         1.00000E+00         4.50406E-06         3.68348E+00         9.83760E-01         2.69972E+00
+          1.85347E-02         2.19313E-02        -2.55203E-02         1.16429E+00         1.59731E+00         1.16457E+00         3.69913E+00         1.00000E+00         4.58690E-06         3.69913E+00         1.02408E+00         2.67505E+00
+          1.85347E-02         2.21011E-02        -2.57552E-02         1.16429E+00         1.60798E+00         1.16457E+00         3.71645E+00         1.00000E+00         4.67111E-06         3.71645E+00         1.06291E+00         2.65355E+00
+          1.85347E-02         2.22709E-02        -2.59920E-02         1.16428E+00         1.61865E+00         1.16457E+00         3.73535E+00         1.00000E+00         4.75670E-06         3.73535E+00         1.10008E+00         2.63527E+00
+          1.85347E-02         2.24407E-02        -2.62306E-02         1.16428E+00         1.62932E+00         1.16457E+00         3.75571E+00         1.00000E+00         4.84369E-06         3.75571E+00         1.13545E+00         2.62026E+00
+          1.85347E-02         2.26106E-02        -2.64709E-02         1.16427E+00         1.63999E+00         1.16457E+00         3.77742E+00         1.00000E+00         4.93206E-06         3.77742E+00         1.16888E+00         2.60854E+00
+          1.85347E-02         2.27804E-02        -2.67131E-02         1.16427E+00         1.65066E+00         1.16457E+00         3.80036E+00         1.00000E+00         5.02182E-06         3.80036E+00         1.20025E+00         2.60011E+00
+          1.85347E-02         2.29502E-02        -2.69571E-02         1.16426E+00         1.66133E+00         1.16458E+00         3.82440E+00         1.00000E+00         5.11294E-06         3.82440E+00         1.22944E+00         2.59495E+00
+          1.85347E-02         2.31201E-02        -2.72030E-02         1.16426E+00         1.67200E+00         1.16458E+00         3.84939E+00         1.00000E+00         5.20542E-06         3.84939E+00         1.25637E+00         2.59302E+00
+          1.85347E-02         2.32899E-02        -2.74506E-02         1.16425E+00         1.68267E+00         1.16458E+00         3.87521E+00         1.00000E+00         5.29923E-06         3.87521E+00         1.28095E+00         2.59426E+00
+          1.85347E-02         2.34597E-02        -2.77000E-02         1.16425E+00         1.69334E+00         1.16458E+00         3.90169E+00         1.00000E+00         5.39435E-06         3.90169E+00         1.30312E+00         2.59858E+00
+          1.85347E-02         2.36295E-02        -2.79513E-02         1.16425E+00         1.70401E+00         1.16458E+00         3.92868E+00         1.00000E+00         5.49073E-06         3.92868E+00         1.32282E+00         2.60587E+00
+          1.85347E-02         2.37994E-02        -2.82044E-02         1.16424E+00         1.71468E+00         1.16458E+00         3.95602E+00         1.00000E+00         5.58835E-06         3.95602E+00         1.34000E+00         2.61602E+00
+          1.85347E-02         2.39692E-02        -2.84593E-02         1.16424E+00         1.72535E+00         1.16458E+00         3.98353E+00         1.00000E+00         5.68716E-06         3.98353E+00         1.35465E+00         2.62888E+00
+          1.85347E-02         2.41390E-02        -2.87160E-02         1.16423E+00         1.73602E+00         1.16459E+00         4.01104E+00         1.00000E+00         5.78713E-06         4.01104E+00         1.36674E+00         2.64430E+00
+          1.85347E-02         2.43088E-02        -2.89745E-02         1.16423E+00         1.74669E+00         1.16459E+00         4.03838E+00         1.00000E+00         5.88819E-06         4.03838E+00         1.37627E+00         2.66211E+00
+          1.85347E-02         2.44787E-02        -2.92348E-02         1.16422E+00         1.75736E+00         1.16459E+00         4.06536E+00         1.00000E+00         5.99031E-06         4.06536E+00         1.38324E+00         2.68212E+00
+          1.85347E-02         2.46485E-02        -2.94969E-02         1.16422E+00         1.76804E+00         1.16459E+00         4.09181E+00         1.00000E+00         6.09342E-06         4.09181E+00         1.38767E+00         2.70413E+00
+          1.85347E-02         2.48183E-02        -2.97609E-02         1.16421E+00         1.77871E+00         1.16459E+00         4.11753E+00         1.00000E+00         6.19748E-06         4.11753E+00         1.38960E+00         2.72793E+00
+          1.85347E-02         2.49882E-02        -3.00267E-02         1.16421E+00         1.78938E+00         1.16459E+00         4.14235E+00         1.00000E+00         6.30242E-06         4.14235E+00         1.38904E+00         2.75330E+00
+          1.85347E-02         2.51580E-02        -3.02943E-02         1.16420E+00         1.80005E+00         1.16460E+00         4.16608E+00         1.00000E+00         6.40820E-06         4.16608E+00         1.38606E+00         2.78001E+00
+          1.85347E-02         2.53278E-02        -3.05637E-02         1.16420E+00         1.81072E+00         1.16460E+00         4.18853E+00         1.00000E+00         6.51475E-06         4.18853E+00         1.38071E+00         2.80782E+00
+          1.85347E-02         2.54976E-02        -3.08349E-02         1.16419E+00         1.82139E+00         1.16460E+00         4.20954E+00         1.00000E+00         6.62203E-06         4.20954E+00         1.37305E+00         2.83649E+00
+          1.85347E-02         2.56675E-02        -3.11079E-02         1.16419E+00         1.83206E+00         1.16460E+00         4.22891E+00         1.00000E+00         6.72997E-06         4.22891E+00         1.36316E+00         2.86576E+00
+          1.85347E-02         2.58373E-02        -3.13827E-02         1.16418E+00         1.84273E+00         1.16460E+00         4.24649E+00         1.00000E+00         6.83854E-06         4.24649E+00         1.35110E+00         2.89539E+00
+          1.85347E-02         2.60071E-02        -3.16594E-02         1.16418E+00         1.85340E+00         1.16461E+00         4.26209E+00         1.00000E+00         6.94769E-06         4.26209E+00         1.33696E+00         2.92513E+00
+          1.85347E-02         2.61769E-02        -3.19378E-02         1.16417E+00         1.86407E+00         1.16461E+00         4.27556E+00         1.00000E+00         7.05737E-06         4.27556E+00         1.32084E+00         2.95472E+00
+          1.87045E-02         8.72665E-04        -1.06333E-02         1.17524E+00         2.74155E-01         1.17529E+00         1.29145E+02         1.00000E+00         5.47217E-07         1.29145E+02         1.53328E+01         1.13812E+02
+          1.87045E-02         1.04249E-03        -1.06435E-02         1.17524E+00         2.84826E-01         1.17529E+00         1.26876E+02         1.00000E+00         5.46697E-07         1.26876E+02         1.53865E+01         1.11490E+02
+          1.87045E-02         1.21232E-03        -1.06555E-02         1.17524E+00         2.95496E-01         1.17529E+00         1.24561E+02         1.00000E+00         5.46246E-07         1.24561E+02         1.54371E+01         1.09124E+02
+          1.87045E-02         1.38215E-03        -1.06693E-02         1.17524E+00         3.06167E-01         1.17529E+00         1.22204E+02         1.00000E+00         5.45876E-07         1.22204E+02         1.54841E+01         1.06720E+02
+          1.87045E-02         1.55197E-03        -1.06850E-02         1.17524E+00         3.16838E-01         1.17529E+00         1.19808E+02         1.00000E+00         5.45595E-07         1.19808E+02         1.55270E+01         1.04281E+02
+          1.87045E-02         1.72180E-03        -1.07025E-02         1.17524E+00         3.27508E-01         1.17529E+00         1.17377E+02         1.00000E+00         5.45413E-07         1.17377E+02         1.55655E+01         1.01811E+02
+          1.87045E-02         1.89163E-03        -1.07217E-02         1.17524E+00         3.38179E-01         1.17529E+00         1.14915E+02         1.00000E+00         5.45341E-07         1.14915E+02         1.55991E+01         9.93158E+01
+          1.87045E-02         2.06146E-03        -1.07428E-02         1.17524E+00         3.48849E-01         1.17529E+00         1.12426E+02         1.00000E+00         5.45388E-07         1.12426E+02         1.56273E+01         9.67985E+01
+          1.87045E-02         2.23128E-03        -1.07657E-02         1.17524E+00         3.59520E-01         1.17529E+00         1.09914E+02         1.00000E+00         5.45566E-07         1.09914E+02         1.56498E+01         9.42637E+01
+          1.87045E-02         2.40111E-03        -1.07904E-02         1.17524E+00         3.70190E-01         1.17529E+00         1.07382E+02         1.00000E+00         5.45884E-07         1.07382E+02         1.56662E+01         9.17158E+01
+          1.87045E-02         2.57094E-03        -1.08170E-02         1.17524E+00         3.80861E-01         1.17529E+00         1.04835E+02         1.00000E+00         5.46353E-07         1.04835E+02         1.56760E+01         8.91588E+01
+          1.87045E-02         2.74077E-03        -1.08453E-02         1.17524E+00         3.91532E-01         1.17529E+00         1.02276E+02         1.00000E+00         5.46984E-07         1.02276E+02         1.56789E+01         8.65969E+01
+          1.87045E-02         2.91059E-03        -1.08754E-02         1.17524E+00         4.02202E-01         1.17529E+00         9.97089E+01         1.00000E+00         5.47786E-07         9.97089E+01         1.56746E+01         8.40343E+01
+          1.87045E-02         3.08042E-03        -1.09074E-02         1.17524E+00         4.12873E-01         1.17529E+00         9.71375E+01         1.00000E+00         5.48769E-07         9.71375E+01         1.56627E+01         8.14748E+01
+          1.87045E-02         3.25025E-03        -1.09412E-02         1.17523E+00         4.23543E-01         1.17529E+00         9.45653E+01         1.00000E+00         5.49945E-07         9.45653E+01         1.56429E+01         7.89224E+01
+          1.87045E-02         3.42008E-03        -1.09767E-02         1.17523E+00         4.34214E-01         1.17529E+00         9.19959E+01         1.00000E+00         5.51324E-07         9.19959E+01         1.56150E+01         7.63809E+01
+          1.87045E-02         3.58990E-03        -1.10141E-02         1.17523E+00         4.44884E-01         1.17529E+00         8.94327E+01         1.00000E+00         5.52914E-07         8.94327E+01         1.55786E+01         7.38541E+01
+          1.87045E-02         3.75973E-03        -1.10533E-02         1.17523E+00         4.55555E-01         1.17528E+00         8.68790E+01         1.00000E+00         5.54725E-07         8.68790E+01         1.55335E+01         7.13455E+01
+          1.87045E-02         3.92956E-03        -1.10944E-02         1.17523E+00         4.66225E-01         1.17528E+00         8.43382E+01         1.00000E+00         5.56768E-07         8.43382E+01         1.54795E+01         6.88587E+01
+          1.87045E-02         4.09939E-03        -1.11372E-02         1.17523E+00         4.76896E-01         1.17528E+00         8.18133E+01         1.00000E+00         5.59051E-07         8.18133E+01         1.54164E+01         6.63969E+01
+          1.87045E-02         4.26921E-03        -1.11818E-02         1.17523E+00         4.87567E-01         1.17528E+00         7.93075E+01         1.00000E+00         5.61583E-07         7.93075E+01         1.53441E+01         6.39634E+01
+          1.87045E-02         4.43904E-03        -1.12283E-02         1.17523E+00         4.98237E-01         1.17528E+00         7.68237E+01         1.00000E+00         5.64373E-07         7.68237E+01         1.52623E+01         6.15613E+01
+          1.87045E-02         4.60887E-03        -1.12766E-02         1.17523E+00         5.08908E-01         1.17528E+00         7.43647E+01         1.00000E+00         5.67428E-07         7.43647E+01         1.51711E+01         5.91936E+01
+          1.87045E-02         4.77869E-03        -1.13266E-02         1.17523E+00         5.19578E-01         1.17528E+00         7.19332E+01         1.00000E+00         5.70757E-07         7.19332E+01         1.50703E+01         5.68629E+01
+          1.87045E-02         4.94852E-03        -1.13785E-02         1.17523E+00         5.30249E-01         1.17528E+00         6.95319E+01         1.00000E+00         5.74367E-07         6.95319E+01         1.49598E+01         5.45720E+01
+          1.87045E-02         5.11835E-03        -1.14322E-02         1.17523E+00         5.40919E-01         1.17528E+00         6.71631E+01         1.00000E+00         5.78265E-07         6.71631E+01         1.48397E+01         5.23234E+01
+          1.87045E-02         5.28818E-03        -1.14877E-02         1.17522E+00         5.51590E-01         1.17528E+00         6.48292E+01         1.00000E+00         5.82457E-07         6.48292E+01         1.47100E+01         5.01193E+01
+          1.87045E-02         5.45800E-03        -1.15451E-02         1.17522E+00         5.62261E-01         1.17528E+00         6.25324E+01         1.00000E+00         5.86951E-07         6.25324E+01         1.45706E+01         4.79618E+01
+          1.87045E-02         5.62783E-03        -1.16042E-02         1.17522E+00         5.72931E-01         1.17528E+00         6.02747E+01         1.00000E+00         5.91751E-07         6.02747E+01         1.44216E+01         4.58531E+01
+          1.87045E-02         5.79766E-03        -1.16651E-02         1.17522E+00         5.83602E-01         1.17528E+00         5.80581E+01         1.00000E+00         5.96865E-07         5.80581E+01         1.42632E+01         4.37949E+01
+          1.87045E-02         5.96749E-03        -1.17279E-02         1.17522E+00         5.94272E-01         1.17528E+00         5.58843E+01         1.00000E+00         6.02296E-07         5.58843E+01         1.40955E+01         4.17887E+01
+          1.87045E-02         6.13731E-03        -1.17925E-02         1.17522E+00         6.04943E-01         1.17528E+00         5.37548E+01         1.00000E+00         6.08050E-07         5.37548E+01         1.39186E+01         3.98363E+01
+          1.87045E-02         6.30714E-03        -1.18589E-02         1.17522E+00         6.15613E-01         1.17528E+00         5.16713E+01         1.00000E+00         6.14132E-07         5.16713E+01         1.37326E+01         3.79387E+01
+          1.87045E-02         6.47697E-03        -1.19271E-02         1.17522E+00         6.26284E-01         1.17528E+00         4.96350E+01         1.00000E+00         6.20545E-07         4.96350E+01         1.35379E+01         3.60972E+01
+          1.87045E-02         6.64680E-03        -1.19971E-02         1.17522E+00         6.36955E-01         1.17528E+00         4.76472E+01         1.00000E+00         6.27295E-07         4.76472E+01         1.33345E+01         3.43127E+01
+          1.87045E-02         6.81662E-03        -1.20689E-02         1.17521E+00         6.47625E-01         1.17528E+00         4.57089E+01         1.00000E+00         6.34385E-07         4.57089E+01         1.31229E+01         3.25860E+01
+          1.87045E-02         6.98645E-03        -1.21425E-02         1.17521E+00         6.58296E-01         1.17528E+00         4.38210E+01         1.00000E+00         6.41819E-07         4.38210E+01         1.29032E+01         3.09178E+01
+          1.87045E-02         7.15628E-03        -1.22180E-02         1.17521E+00         6.68966E-01         1.17527E+00         4.19843E+01         1.00000E+00         6.49601E-07         4.19843E+01         1.26758E+01         2.93086E+01
+          1.87045E-02         7.32611E-03        -1.22952E-02         1.17521E+00         6.79637E-01         1.17527E+00         4.01995E+01         1.00000E+00         6.57734E-07         4.01995E+01         1.24410E+01         2.77586E+01
+          1.87045E-02         7.49593E-03        -1.23743E-02         1.17521E+00         6.90307E-01         1.17527E+00         3.84670E+01         1.00000E+00         6.66223E-07         3.84670E+01         1.21991E+01         2.62680E+01
+          1.87045E-02         7.66576E-03        -1.24552E-02         1.17521E+00         7.00978E-01         1.17527E+00         3.67873E+01         1.00000E+00         6.75070E-07         3.67873E+01         1.19505E+01         2.48368E+01
+          1.87045E-02         7.83559E-03        -1.25379E-02         1.17520E+00         7.11649E-01         1.17527E+00         3.51606E+01         1.00000E+00         6.84281E-07         3.51606E+01         1.16956E+01         2.34649E+01
+          1.87045E-02         8.00542E-03        -1.26224E-02         1.17520E+00         7.22319E-01         1.17527E+00         3.35870E+01         1.00000E+00         6.93858E-07         3.35870E+01         1.14349E+01         2.21521E+01
+          1.87045E-02         8.17524E-03        -1.27087E-02         1.17520E+00         7.32990E-01         1.17527E+00         3.20665E+01         1.00000E+00         7.03807E-07         3.20665E+01         1.11687E+01         2.08978E+01
+          1.87045E-02         8.34507E-03        -1.27968E-02         1.17520E+00         7.43660E-01         1.17527E+00         3.05990E+01         1.00000E+00         7.14130E-07         3.05990E+01         1.08974E+01         1.97016E+01
+          1.87045E-02         8.51490E-03        -1.28867E-02         1.17520E+00         7.54331E-01         1.17527E+00         2.91844E+01         1.00000E+00         7.24835E-07         2.91844E+01         1.06216E+01         1.85628E+01
+          1.87045E-02         8.68473E-03        -1.29785E-02         1.17520E+00         7.65001E-01         1.17527E+00         2.78222E+01         1.00000E+00         7.35924E-07         2.78222E+01         1.03417E+01         1.74806E+01
+          1.87045E-02         8.85455E-03        -1.30721E-02         1.17519E+00         7.75672E-01         1.17527E+00         2.65121E+01         1.00000E+00         7.47404E-07         2.65121E+01         1.00581E+01         1.64540E+01
+          1.87045E-02         9.02438E-03        -1.31674E-02         1.17519E+00         7.86343E-01         1.17527E+00         2.52536E+01         1.00000E+00         7.59280E-07         2.52536E+01         9.77143E+00         1.54821E+01
+          1.87045E-02         9.19421E-03        -1.32646E-02         1.17519E+00         7.97013E-01         1.17527E+00         2.40459E+01         1.00000E+00         7.71559E-07         2.40459E+01         9.48207E+00         1.45638E+01
+          1.87045E-02         9.36403E-03        -1.33636E-02         1.17519E+00         8.07684E-01         1.17527E+00         2.28884E+01         1.00000E+00         7.84247E-07         2.28884E+01         9.19056E+00         1.36979E+01
+          1.87045E-02         9.53386E-03        -1.34644E-02         1.17519E+00         8.18354E-01         1.17526E+00         2.17804E+01         1.00000E+00         7.97351E-07         2.17804E+01         8.89738E+00         1.28830E+01
+          1.87045E-02         9.70369E-03        -1.35671E-02         1.17519E+00         8.29025E-01         1.17526E+00         2.07209E+01         1.00000E+00         8.10879E-07         2.07209E+01         8.60306E+00         1.21179E+01
+          1.87045E-02         9.87352E-03        -1.36715E-02         1.17518E+00         8.39695E-01         1.17526E+00         1.97091E+01         1.00000E+00         8.24839E-07         1.97091E+01         8.30809E+00         1.14010E+01
+          1.87045E-02         1.00433E-02        -1.37778E-02         1.17518E+00         8.50366E-01         1.17526E+00         1.87438E+01         1.00000E+00         8.39239E-07         1.87438E+01         8.01298E+00         1.07308E+01
+          1.87045E-02         1.02132E-02        -1.38858E-02         1.17518E+00         8.61037E-01         1.17526E+00         1.78241E+01         1.00000E+00         8.54089E-07         1.78241E+01         7.71823E+00         1.01059E+01
+          1.87045E-02         1.03830E-02        -1.39957E-02         1.17518E+00         8.71707E-01         1.17526E+00         1.69489E+01         1.00000E+00         8.69398E-07         1.69489E+01         7.42433E+00         9.52453E+00
+          1.87045E-02         1.05528E-02        -1.41074E-02         1.17518E+00         8.82378E-01         1.17526E+00         1.61169E+01         1.00000E+00         8.85176E-07         1.61169E+01         7.13178E+00         8.98511E+00
+          1.87045E-02         1.07227E-02        -1.42209E-02         1.17517E+00         8.93048E-01         1.17526E+00         1.53270E+01         1.00000E+00         9.01433E-07         1.53270E+01         6.84106E+00         8.48593E+00
+          1.87045E-02         1.08925E-02        -1.43362E-02         1.17517E+00         9.03719E-01         1.17526E+00         1.45779E+01         1.00000E+00         9.18180E-07         1.45779E+01         6.55266E+00         8.02527E+00
+          1.87045E-02         1.10623E-02        -1.44533E-02         1.17517E+00         9.14389E-01         1.17526E+00         1.38684E+01         1.00000E+00         9.35428E-07         1.38684E+01         6.26703E+00         7.60139E+00
+          1.87045E-02         1.12321E-02        -1.45722E-02         1.17517E+00         9.25060E-01         1.17526E+00         1.31972E+01         1.00000E+00         9.53188E-07         1.31972E+01         5.98463E+00         7.21254E+00
+          1.87045E-02         1.14020E-02        -1.46930E-02         1.17516E+00         9.35731E-01         1.17526E+00         1.25629E+01         1.00000E+00         9.71471E-07         1.25629E+01         5.70591E+00         6.85694E+00
+          1.87045E-02         1.15718E-02        -1.48155E-02         1.17516E+00         9.46401E-01         1.17526E+00         1.19641E+01         1.00000E+00         9.90290E-07         1.19641E+01         5.43129E+00         6.53284E+00
+          1.87045E-02         1.17416E-02        -1.49399E-02         1.17516E+00         9.57072E-01         1.17526E+00         1.13996E+01         1.00000E+00         1.00966E-06         1.13996E+01         5.16119E+00         6.23846E+00
+          1.87045E-02         1.19114E-02        -1.50661E-02         1.17516E+00         9.67742E-01         1.17525E+00         1.08681E+01         1.00000E+00         1.02958E-06         1.08681E+01         4.89600E+00         5.97206E+00
+          1.87045E-02         1.20813E-02        -1.51941E-02         1.17516E+00         9.78413E-01         1.17525E+00         1.03680E+01         1.00000E+00         1.05007E-06         1.03680E+01         4.63611E+00         5.73189E+00
+          1.87045E-02         1.22511E-02        -1.53239E-02         1.17515E+00         9.89083E-01         1.17525E+00         9.89811E+00         1.00000E+00         1.07115E-06         9.89811E+00         4.38186E+00         5.51625E+00
+          1.87045E-02         1.24209E-02        -1.54555E-02         1.17515E+00         9.99754E-01         1.17525E+00         9.45705E+00         1.00000E+00         1.09282E-06         9.45705E+00         4.13362E+00         5.32344E+00
+          1.87045E-02         1.25908E-02        -1.55889E-02         1.17515E+00         1.01042E+00         1.17525E+00         9.04349E+00         1.00000E+00         1.11509E-06         9.04349E+00         3.89169E+00         5.15180E+00
+          1.87045E-02         1.27606E-02        -1.57242E-02         1.17515E+00         1.02110E+00         1.17525E+00         8.65609E+00         1.00000E+00         1.13798E-06         8.65609E+00         3.65638E+00         4.99971E+00
+          1.87045E-02         1.29304E-02        -1.58612E-02         1.17514E+00         1.03177E+00         1.17525E+00         8.29356E+00         1.00000E+00         1.16149E-06         8.29356E+00         3.42797E+00         4.86559E+00
+          1.87045E-02         1.31002E-02        -1.60001E-02         1.17514E+00         1.04244E+00         1.17525E+00         7.95461E+00         1.00000E+00         1.18563E-06         7.95461E+00         3.20671E+00         4.74791E+00
+          1.87045E-02         1.32701E-02        -1.61408E-02         1.17514E+00         1.05311E+00         1.17525E+00         7.63800E+00         1.00000E+00         1.21042E-06         7.63800E+00         2.99283E+00         4.64517E+00
+          1.87045E-02         1.34399E-02        -1.62833E-02         1.17513E+00         1.06378E+00         1.17525E+00         7.34249E+00         1.00000E+00         1.23585E-06         7.34249E+00         2.78656E+00         4.55593E+00
+          1.87045E-02         1.36097E-02        -1.64276E-02         1.17513E+00         1.07445E+00         1.17525E+00         7.06689E+00         1.00000E+00         1.26195E-06         7.06689E+00         2.58807E+00         4.47882E+00
+          1.87045E-02         1.37795E-02        -1.65737E-02         1.17513E+00         1.08512E+00         1.17525E+00         6.81003E+00         1.00000E+00         1.28870E-06         6.81003E+00         2.39754E+00         4.41250E+00
+          1.87045E-02         1.39494E-02        -1.67216E-02         1.17513E+00         1.09579E+00         1.17525E+00         6.57080E+00         1.00000E+00         1.31613E-06         6.57080E+00         2.21509E+00         4.35571E+00
+          1.87045E-02         1.41192E-02        -1.68714E-02         1.17512E+00         1.10646E+00         1.17525E+00         6.34809E+00         1.00000E+00         1.34423E-06         6.34809E+00         2.04084E+00         4.30725E+00
+          1.87045E-02         1.42890E-02        -1.70229E-02         1.17512E+00         1.11713E+00         1.17524E+00         6.14086E+00         1.00000E+00         1.37300E-06         6.14086E+00         1.87490E+00         4.26596E+00
+          1.87045E-02         1.44589E-02        -1.71763E-02         1.17512E+00         1.12780E+00         1.17524E+00         5.94810E+00         1.00000E+00         1.40246E-06         5.94810E+00         1.71731E+00         4.23079E+00
+          1.87045E-02         1.46287E-02        -1.73315E-02         1.17512E+00         1.13847E+00         1.17524E+00         5.76885E+00         1.00000E+00         1.43260E-06         5.76885E+00         1.56814E+00         4.20071E+00
+          1.87045E-02         1.47985E-02        -1.74885E-02         1.17511E+00         1.14914E+00         1.17524E+00         5.60217E+00         1.00000E+00         1.46342E-06         5.60217E+00         1.42740E+00         4.17477E+00
+          1.87045E-02         1.49683E-02        -1.76473E-02         1.17511E+00         1.15981E+00         1.17524E+00         5.44720E+00         1.00000E+00         1.49494E-06         5.44720E+00         1.29508E+00         4.15211E+00
+          1.87045E-02         1.51382E-02        -1.78079E-02         1.17511E+00         1.17048E+00         1.17524E+00         5.30308E+00         1.00000E+00         1.52713E-06         5.30308E+00         1.17117E+00         4.13191E+00
+          1.87045E-02         1.53080E-02        -1.79703E-02         1.17510E+00         1.18115E+00         1.17524E+00         5.16904E+00         1.00000E+00         1.56001E-06         5.16904E+00         1.05561E+00         4.11343E+00
+          1.87045E-02         1.54778E-02        -1.81346E-02         1.17510E+00         1.19182E+00         1.17524E+00         5.04432E+00         1.00000E+00         1.59357E-06         5.04432E+00         9.48346E-01         4.09598E+00
+          1.87045E-02         1.56476E-02        -1.83006E-02         1.17510E+00         1.20249E+00         1.17524E+00         4.92823E+00         1.00000E+00         1.62782E-06         4.92823E+00         8.49277E-01         4.07895E+00
+          1.87045E-02         1.58175E-02        -1.84685E-02         1.17509E+00         1.21317E+00         1.17524E+00         4.82010E+00         1.00000E+00         1.66274E-06         4.82010E+00         7.58296E-01         4.06180E+00
+          1.87045E-02         1.59873E-02        -1.86382E-02         1.17509E+00         1.22384E+00         1.17524E+00         4.71932E+00         1.00000E+00         1.69835E-06         4.71932E+00         6.75276E-01         4.04404E+00
+          1.87045E-02         1.61571E-02        -1.88097E-02         1.17509E+00         1.23451E+00         1.17524E+00         4.62532E+00         1.00000E+00         1.73463E-06         4.62532E+00         6.00069E-01         4.02525E+00
+          1.87045E-02         1.63270E-02        -1.89830E-02         1.17508E+00         1.24518E+00         1.17524E+00         4.53757E+00         1.00000E+00         1.77158E-06         4.53757E+00         5.32508E-01         4.00506E+00
+          1.87045E-02         1.64968E-02        -1.91581E-02         1.17508E+00         1.25585E+00         1.17524E+00         4.45558E+00         1.00000E+00         1.80921E-06         4.45558E+00         4.72413E-01         3.98317E+00
+          1.87045E-02         1.66666E-02        -1.93350E-02         1.17508E+00         1.26652E+00         1.17524E+00         4.37891E+00         1.00000E+00         1.84750E-06         4.37891E+00         4.19584E-01         3.95932E+00
+          1.87045E-02         1.68364E-02        -1.95138E-02         1.17507E+00         1.27719E+00         1.17524E+00         4.30714E+00         1.00000E+00         1.88647E-06         4.30714E+00         3.73810E-01         3.93333E+00
+          1.87045E-02         1.70063E-02        -1.96943E-02         1.17507E+00         1.28786E+00         1.17524E+00         4.23991E+00         1.00000E+00         1.92610E-06         4.23991E+00         3.34862E-01         3.90504E+00
+          1.87045E-02         1.71761E-02        -1.98767E-02         1.17507E+00         1.29853E+00         1.17524E+00         4.17687E+00         1.00000E+00         1.96641E-06         4.17687E+00         3.02502E-01         3.87437E+00
+          1.87045E-02         1.73459E-02        -2.00609E-02         1.17506E+00         1.30920E+00         1.17524E+00         4.11774E+00         1.00000E+00         2.00738E-06         4.11774E+00         2.76478E-01         3.84126E+00
+          1.87045E-02         1.75158E-02        -2.02468E-02         1.17506E+00         1.31987E+00         1.17524E+00         4.06223E+00         1.00000E+00         2.04903E-06         4.06223E+00         2.56528E-01         3.80570E+00
+          1.87045E-02         1.76856E-02        -2.04347E-02         1.17506E+00         1.33054E+00         1.17523E+00         4.01011E+00         1.00000E+00         2.09135E-06         4.01011E+00         2.42380E-01         3.76773E+00
+          1.87045E-02         1.78554E-02        -2.06243E-02         1.17505E+00         1.34121E+00         1.17523E+00         3.96117E+00         1.00000E+00         2.13435E-06         3.96117E+00         2.33755E-01         3.72742E+00
+          1.87045E-02         1.80252E-02        -2.08157E-02         1.17505E+00         1.35188E+00         1.17523E+00         3.91523E+00         1.00000E+00         2.17804E-06         3.91523E+00         2.30365E-01         3.68487E+00
+          1.87045E-02         1.81951E-02        -2.10089E-02         1.17505E+00         1.36255E+00         1.17523E+00         3.87213E+00         1.00000E+00         2.22243E-06         3.87213E+00         2.31918E-01         3.64022E+00
+          1.87045E-02         1.83649E-02        -2.12040E-02         1.17504E+00         1.37322E+00         1.17523E+00         3.83174E+00         1.00000E+00         2.26751E-06         3.83174E+00         2.38114E-01         3.59363E+00
+          1.87045E-02         1.85347E-02        -2.14009E-02         1.17504E+00         1.38389E+00         1.17523E+00         3.79394E+00         1.00000E+00         2.31331E-06         3.79394E+00         2.48652E-01         3.54529E+00
+          1.87045E-02         1.87045E-02        -2.15996E-02         1.17504E+00         1.39457E+00         1.17523E+00         3.75864E+00         1.00000E+00         2.35983E-06         3.75864E+00         2.63227E-01         3.49542E+00
+          1.87045E-02         1.88744E-02        -2.18000E-02         1.17503E+00         1.40524E+00         1.17523E+00         3.72576E+00         1.00000E+00         2.40709E-06         3.72576E+00         2.81534E-01         3.44423E+00
+          1.87045E-02         1.90442E-02        -2.20024E-02         1.17503E+00         1.41591E+00         1.17523E+00         3.69525E+00         1.00000E+00         2.45510E-06         3.69525E+00         3.03264E-01         3.39198E+00
+          1.87045E-02         1.92140E-02        -2.22065E-02         1.17502E+00         1.42658E+00         1.17523E+00         3.66704E+00         1.00000E+00         2.50387E-06         3.66704E+00         3.28111E-01         3.33893E+00
+          1.87045E-02         1.93839E-02        -2.24124E-02         1.17502E+00         1.43725E+00         1.17523E+00         3.64111E+00         1.00000E+00         2.55342E-06         3.64111E+00         3.55771E-01         3.28534E+00
+          1.87045E-02         1.95537E-02        -2.26202E-02         1.17502E+00         1.44792E+00         1.17523E+00         3.61742E+00         1.00000E+00         2.60377E-06         3.61742E+00         3.85941E-01         3.23148E+00
+          1.87045E-02         1.97235E-02        -2.28297E-02         1.17501E+00         1.45859E+00         1.17523E+00         3.59596E+00         1.00000E+00         2.65494E-06         3.59596E+00         4.18322E-01         3.17764E+00
+          1.87045E-02         1.98933E-02        -2.30411E-02         1.17501E+00         1.46926E+00         1.17523E+00         3.57672E+00         1.00000E+00         2.70694E-06         3.57672E+00         4.52621E-01         3.12409E+00
+          1.87045E-02         2.00632E-02        -2.32543E-02         1.17500E+00         1.47993E+00         1.17523E+00         3.55967E+00         1.00000E+00         2.75979E-06         3.55967E+00         4.88546E-01         3.07113E+00
+          1.87045E-02         2.02330E-02        -2.34693E-02         1.17500E+00         1.49060E+00         1.17523E+00         3.54482E+00         1.00000E+00         2.81352E-06         3.54482E+00         5.25817E-01         3.01901E+00
+          1.87045E-02         2.04028E-02        -2.36861E-02         1.17500E+00         1.50127E+00         1.17524E+00         3.53216E+00         1.00000E+00         2.86814E-06         3.53216E+00         5.64156E-01         2.96801E+00
+          1.87045E-02         2.05726E-02        -2.39047E-02         1.17499E+00         1.51194E+00         1.17524E+00         3.52169E+00         1.00000E+00         2.92367E-06         3.52169E+00         6.03294E-01         2.91840E+00
+          1.87045E-02         2.07425E-02        -2.41251E-02         1.17499E+00         1.52261E+00         1.17524E+00         3.51339E+00         1.00000E+00         2.98013E-06         3.51339E+00         6.42973E-01         2.87042E+00
+          1.87045E-02         2.09123E-02        -2.43474E-02         1.17498E+00         1.53328E+00         1.17524E+00         3.50726E+00         1.00000E+00         3.03754E-06         3.50726E+00         6.82941E-01         2.82432E+00
+          1.87045E-02         2.10821E-02        -2.45714E-02         1.17498E+00         1.54395E+00         1.17524E+00         3.50328E+00         1.00000E+00         3.09591E-06         3.50328E+00         7.22956E-01         2.78032E+00
+          1.87045E-02         2.12520E-02        -2.47973E-02         1.17498E+00         1.55462E+00         1.17524E+00         3.50142E+00         1.00000E+00         3.15526E-06         3.50142E+00         7.62788E-01         2.73864E+00
+          1.87045E-02         2.14218E-02        -2.50250E-02         1.17497E+00         1.56529E+00         1.17524E+00         3.50168E+00         1.00000E+00         3.21561E-06         3.50168E+00         8.02215E-01         2.69947E+00
+          1.87045E-02         2.15916E-02        -2.52545E-02         1.17497E+00         1.57596E+00         1.17524E+00         3.50401E+00         1.00000E+00         3.27696E-06         3.50401E+00         8.41029E-01         2.66298E+00
+          1.87045E-02         2.17614E-02        -2.54858E-02         1.17496E+00         1.58664E+00         1.17524E+00         3.50838E+00         1.00000E+00         3.33932E-06         3.50838E+00         8.79031E-01         2.62935E+00
+          1.87045E-02         2.19313E-02        -2.57190E-02         1.17496E+00         1.59731E+00         1.17524E+00         3.51474E+00         1.00000E+00         3.40271E-06         3.51474E+00         9.16034E-01         2.59870E+00
+          1.87045E-02         2.21011E-02        -2.59539E-02         1.17495E+00         1.60798E+00         1.17524E+00         3.52302E+00         1.00000E+00         3.46712E-06         3.52302E+00         9.51866E-01         2.57116E+00
+          1.87045E-02         2.22709E-02        -2.61907E-02         1.17495E+00         1.61865E+00         1.17524E+00         3.53318E+00         1.00000E+00         3.53256E-06         3.53318E+00         9.86363E-01         2.54682E+00
+          1.87045E-02         2.24407E-02        -2.64292E-02         1.17495E+00         1.62932E+00         1.17524E+00         3.54513E+00         1.00000E+00         3.59903E-06         3.54513E+00         1.01938E+00         2.52575E+00
+          1.87045E-02         2.26106E-02        -2.66696E-02         1.17494E+00         1.63999E+00         1.17524E+00         3.55879E+00         1.00000E+00         3.66653E-06         3.55879E+00         1.05077E+00         2.50802E+00
+          1.87045E-02         2.27804E-02        -2.69118E-02         1.17494E+00         1.65066E+00         1.17524E+00         3.57408E+00         1.00000E+00         3.73504E-06         3.57408E+00         1.08042E+00         2.49366E+00
+          1.87045E-02         2.29502E-02        -2.71558E-02         1.17493E+00         1.66133E+00         1.17525E+00         3.59088E+00         1.00000E+00         3.80457E-06         3.59088E+00         1.10821E+00         2.48266E+00
+          1.87045E-02         2.31201E-02        -2.74016E-02         1.17493E+00         1.67200E+00         1.17525E+00         3.60908E+00         1.00000E+00         3.87510E-06         3.60908E+00         1.13405E+00         2.47503E+00
+          1.87045E-02         2.32899E-02        -2.76493E-02         1.17492E+00         1.68267E+00         1.17525E+00         3.62858E+00         1.00000E+00         3.94661E-06         3.62858E+00         1.15785E+00         2.47073E+00
+          1.87045E-02         2.34597E-02        -2.78987E-02         1.17492E+00         1.69334E+00         1.17525E+00         3.64923E+00         1.00000E+00         4.01910E-06         3.64923E+00         1.17953E+00         2.46970E+00
+          1.87045E-02         2.36295E-02        -2.81500E-02         1.17491E+00         1.70401E+00         1.17525E+00         3.67091E+00         1.00000E+00         4.09253E-06         3.67091E+00         1.19903E+00         2.47188E+00
+          1.87045E-02         2.37994E-02        -2.84030E-02         1.17491E+00         1.71468E+00         1.17525E+00         3.69346E+00         1.00000E+00         4.16689E-06         3.69346E+00         1.21630E+00         2.47716E+00
+          1.87045E-02         2.39692E-02        -2.86579E-02         1.17490E+00         1.72535E+00         1.17525E+00         3.71674E+00         1.00000E+00         4.24215E-06         3.71674E+00         1.23131E+00         2.48543E+00
+          1.87045E-02         2.41390E-02        -2.89146E-02         1.17490E+00         1.73602E+00         1.17525E+00         3.74058E+00         1.00000E+00         4.31830E-06         3.74058E+00         1.24402E+00         2.49656E+00
+          1.87045E-02         2.43088E-02        -2.91731E-02         1.17489E+00         1.74669E+00         1.17526E+00         3.76483E+00         1.00000E+00         4.39529E-06         3.76483E+00         1.25443E+00         2.51040E+00
+          1.87045E-02         2.44787E-02        -2.94335E-02         1.17489E+00         1.75736E+00         1.17526E+00         3.78931E+00         1.00000E+00         4.47311E-06         3.78931E+00         1.26252E+00         2.52679E+00
+          1.87045E-02         2.46485E-02        -2.96956E-02         1.17488E+00         1.76804E+00         1.17526E+00         3.81385E+00         1.00000E+00         4.55173E-06         3.81385E+00         1.26830E+00         2.54555E+00
+          1.87045E-02         2.48183E-02        -2.99596E-02         1.17488E+00         1.77871E+00         1.17526E+00         3.83827E+00         1.00000E+00         4.63111E-06         3.83827E+00         1.27178E+00         2.56649E+00
+          1.87045E-02         2.49882E-02        -3.02253E-02         1.17487E+00         1.78938E+00         1.17526E+00         3.86239E+00         1.00000E+00         4.71124E-06         3.86239E+00         1.27300E+00         2.58939E+00
+          1.87045E-02         2.51580E-02        -3.04929E-02         1.17487E+00         1.80005E+00         1.17526E+00         3.88603E+00         1.00000E+00         4.79207E-06         3.88603E+00         1.27198E+00         2.61405E+00
+          1.87045E-02         2.53278E-02        -3.07623E-02         1.17486E+00         1.81072E+00         1.17527E+00         3.90900E+00         1.00000E+00         4.87358E-06         3.90900E+00         1.26876E+00         2.64024E+00
+          1.87045E-02         2.54976E-02        -3.10335E-02         1.17486E+00         1.82139E+00         1.17527E+00         3.93112E+00         1.00000E+00         4.95574E-06         3.93112E+00         1.26340E+00         2.66773E+00
+          1.87045E-02         2.56675E-02        -3.13065E-02         1.17485E+00         1.83206E+00         1.17527E+00         3.95222E+00         1.00000E+00         5.03853E-06         3.95222E+00         1.25595E+00         2.69627E+00
+          1.87045E-02         2.58373E-02        -3.15814E-02         1.17485E+00         1.84273E+00         1.17527E+00         3.97209E+00         1.00000E+00         5.12193E-06         3.97209E+00         1.24647E+00         2.72562E+00
+          1.87045E-02         2.60071E-02        -3.18580E-02         1.17484E+00         1.85340E+00         1.17528E+00         3.99058E+00         1.00000E+00         5.20590E-06         3.99058E+00         1.23504E+00         2.75554E+00
+          1.87045E-02         2.61769E-02        -3.21365E-02         1.17484E+00         1.86407E+00         1.17528E+00         4.00750E+00         1.00000E+00         5.29044E-06         4.00750E+00         1.22174E+00         2.78576E+00
+          1.88744E-02         8.72665E-04        -1.08338E-02         1.18591E+00         2.74155E-01         1.18596E+00         1.25601E+02         1.00000E+00         3.78571E-07         1.25601E+02         1.26874E+01         1.12913E+02
+          1.88744E-02         1.04249E-03        -1.08440E-02         1.18591E+00         2.84826E-01         1.18596E+00         1.23386E+02         1.00000E+00         3.78397E-07         1.23386E+02         1.27650E+01         1.10621E+02
+          1.88744E-02         1.21232E-03        -1.08560E-02         1.18591E+00         2.95496E-01         1.18596E+00         1.21126E+02         1.00000E+00         3.78273E-07         1.21126E+02         1.28404E+01         1.08286E+02
+          1.88744E-02         1.38215E-03        -1.08699E-02         1.18591E+00         3.06167E-01         1.18596E+00         1.18825E+02         1.00000E+00         3.78206E-07         1.18825E+02         1.29132E+01         1.05911E+02
+          1.88744E-02         1.55197E-03        -1.08855E-02         1.18591E+00         3.16838E-01         1.18596E+00         1.16485E+02         1.00000E+00         3.78202E-07         1.16485E+02         1.29829E+01         1.03503E+02
+          1.88744E-02         1.72180E-03        -1.09030E-02         1.18591E+00         3.27508E-01         1.18596E+00         1.14112E+02         1.00000E+00         3.78267E-07         1.14112E+02         1.30491E+01         1.01063E+02
+          1.88744E-02         1.89163E-03        -1.09223E-02         1.18591E+00         3.38179E-01         1.18596E+00         1.11709E+02         1.00000E+00         3.78408E-07         1.11709E+02         1.31113E+01         9.85979E+01
+          1.88744E-02         2.06146E-03        -1.09434E-02         1.18591E+00         3.48849E-01         1.18596E+00         1.09280E+02         1.00000E+00         3.78632E-07         1.09280E+02         1.31692E+01         9.61105E+01
+          1.88744E-02         2.23128E-03        -1.09663E-02         1.18591E+00         3.59520E-01         1.18596E+00         1.06828E+02         1.00000E+00         3.78945E-07         1.06828E+02         1.32223E+01         9.36054E+01
+          1.88744E-02         2.40111E-03        -1.09910E-02         1.18591E+00         3.70190E-01         1.18596E+00         1.04357E+02         1.00000E+00         3.79355E-07         1.04357E+02         1.32701E+01         9.10867E+01
+          1.88744E-02         2.57094E-03        -1.10175E-02         1.18591E+00         3.80861E-01         1.18596E+00         1.01871E+02         1.00000E+00         3.79867E-07         1.01871E+02         1.33124E+01         8.85586E+01
+          1.88744E-02         2.74077E-03        -1.10458E-02         1.18591E+00         3.91532E-01         1.18596E+00         9.93737E+01         1.00000E+00         3.80490E-07         9.93737E+01         1.33486E+01         8.60251E+01
+          1.88744E-02         2.91059E-03        -1.10760E-02         1.18591E+00         4.02202E-01         1.18596E+00         9.68688E+01         1.00000E+00         3.81229E-07         9.68688E+01         1.33785E+01         8.34903E+01
+          1.88744E-02         3.08042E-03        -1.11079E-02         1.18591E+00         4.12873E-01         1.18596E+00         9.43597E+01         1.00000E+00         3.82093E-07         9.43597E+01         1.34016E+01         8.09580E+01
+          1.88744E-02         3.25025E-03        -1.11417E-02         1.18591E+00         4.23543E-01         1.18596E+00         9.18500E+01         1.00000E+00         3.83088E-07         9.18500E+01         1.34178E+01         7.84322E+01
+          1.88744E-02         3.42008E-03        -1.11773E-02         1.18590E+00         4.34214E-01         1.18596E+00         8.93432E+01         1.00000E+00         3.84221E-07         8.93432E+01         1.34266E+01         7.59167E+01
+          1.88744E-02         3.58990E-03        -1.12147E-02         1.18590E+00         4.44884E-01         1.18596E+00         8.68426E+01         1.00000E+00         3.85499E-07         8.68426E+01         1.34277E+01         7.34150E+01
+          1.88744E-02         3.75973E-03        -1.12539E-02         1.18590E+00         4.55555E-01         1.18596E+00         8.43516E+01         1.00000E+00         3.86930E-07         8.43516E+01         1.34209E+01         7.09307E+01
+          1.88744E-02         3.92956E-03        -1.12949E-02         1.18590E+00         4.66225E-01         1.18596E+00         8.18733E+01         1.00000E+00         3.88519E-07         8.18733E+01         1.34060E+01         6.84673E+01
+          1.88744E-02         4.09939E-03        -1.13377E-02         1.18590E+00         4.76896E-01         1.18596E+00         7.94108E+01         1.00000E+00         3.90274E-07         7.94108E+01         1.33827E+01         6.60281E+01
+          1.88744E-02         4.26921E-03        -1.13824E-02         1.18590E+00         4.87567E-01         1.18596E+00         7.69672E+01         1.00000E+00         3.92202E-07         7.69672E+01         1.33509E+01         6.36163E+01
+          1.88744E-02         4.43904E-03        -1.14288E-02         1.18590E+00         4.98237E-01         1.18596E+00         7.45452E+01         1.00000E+00         3.94308E-07         7.45452E+01         1.33103E+01         6.12350E+01
+          1.88744E-02         4.60887E-03        -1.14771E-02         1.18590E+00         5.08908E-01         1.18595E+00         7.21478E+01         1.00000E+00         3.96600E-07         7.21478E+01         1.32608E+01         5.88870E+01
+          1.88744E-02         4.77869E-03        -1.15272E-02         1.18590E+00         5.19578E-01         1.18595E+00         6.97775E+01         1.00000E+00         3.99083E-07         6.97775E+01         1.32023E+01         5.65752E+01
+          1.88744E-02         4.94852E-03        -1.15790E-02         1.18590E+00         5.30249E-01         1.18595E+00         6.74368E+01         1.00000E+00         4.01763E-07         6.74368E+01         1.31347E+01         5.43021E+01
+          1.88744E-02         5.11835E-03        -1.16327E-02         1.18590E+00         5.40919E-01         1.18595E+00         6.51283E+01         1.00000E+00         4.04648E-07         6.51283E+01         1.30580E+01         5.20703E+01
+          1.88744E-02         5.28818E-03        -1.16883E-02         1.18590E+00         5.51590E-01         1.18595E+00         6.28540E+01         1.00000E+00         4.07741E-07         6.28540E+01         1.29721E+01         4.98819E+01
+          1.88744E-02         5.45800E-03        -1.17456E-02         1.18589E+00         5.62261E-01         1.18595E+00         6.06163E+01         1.00000E+00         4.11049E-07         6.06163E+01         1.28770E+01         4.77393E+01
+          1.88744E-02         5.62783E-03        -1.18047E-02         1.18589E+00         5.72931E-01         1.18595E+00         5.84170E+01         1.00000E+00         4.14577E-07         5.84170E+01         1.27727E+01         4.56444E+01
+          1.88744E-02         5.79766E-03        -1.18657E-02         1.18589E+00         5.83602E-01         1.18595E+00         5.62582E+01         1.00000E+00         4.18331E-07         5.62582E+01         1.26592E+01         4.35989E+01
+          1.88744E-02         5.96749E-03        -1.19284E-02         1.18589E+00         5.94272E-01         1.18595E+00         5.41414E+01         1.00000E+00         4.22315E-07         5.41414E+01         1.25367E+01         4.16046E+01
+          1.88744E-02         6.13731E-03        -1.19930E-02         1.18589E+00         6.04943E-01         1.18595E+00         5.20682E+01         1.00000E+00         4.26533E-07         5.20682E+01         1.24053E+01         3.96630E+01
+          1.88744E-02         6.30714E-03        -1.20594E-02         1.18589E+00         6.15613E-01         1.18595E+00         5.00403E+01         1.00000E+00         4.30992E-07         5.00403E+01         1.22650E+01         3.77753E+01
+          1.88744E-02         6.47697E-03        -1.21276E-02         1.18589E+00         6.26284E-01         1.18595E+00         4.80587E+01         1.00000E+00         4.35694E-07         4.80587E+01         1.21160E+01         3.59428E+01
+          1.88744E-02         6.64680E-03        -1.21976E-02         1.18589E+00         6.36955E-01         1.18595E+00         4.61248E+01         1.00000E+00         4.40645E-07         4.61248E+01         1.19585E+01         3.41663E+01
+          1.88744E-02         6.81662E-03        -1.22694E-02         1.18588E+00         6.47625E-01         1.18595E+00         4.42396E+01         1.00000E+00         4.45848E-07         4.42396E+01         1.17927E+01         3.24468E+01
+          1.88744E-02         6.98645E-03        -1.23430E-02         1.18588E+00         6.58296E-01         1.18595E+00         4.24039E+01         1.00000E+00         4.51307E-07         4.24039E+01         1.16189E+01         3.07850E+01
+          1.88744E-02         7.15628E-03        -1.24185E-02         1.18588E+00         6.68966E-01         1.18595E+00         4.06185E+01         1.00000E+00         4.57027E-07         4.06185E+01         1.14372E+01         2.91812E+01
+          1.88744E-02         7.32611E-03        -1.24957E-02         1.18588E+00         6.79637E-01         1.18595E+00         3.88840E+01         1.00000E+00         4.63010E-07         3.88840E+01         1.12481E+01         2.76360E+01
+          1.88744E-02         7.49593E-03        -1.25748E-02         1.18588E+00         6.90307E-01         1.18594E+00         3.72010E+01         1.00000E+00         4.69262E-07         3.72010E+01         1.10516E+01         2.61494E+01
+          1.88744E-02         7.66576E-03        -1.26557E-02         1.18588E+00         7.00978E-01         1.18594E+00         3.55698E+01         1.00000E+00         4.75784E-07         3.55698E+01         1.08482E+01         2.47216E+01
+          1.88744E-02         7.83559E-03        -1.27384E-02         1.18588E+00         7.11649E-01         1.18594E+00         3.39906E+01         1.00000E+00         4.82582E-07         3.39906E+01         1.06383E+01         2.33524E+01
+          1.88744E-02         8.00542E-03        -1.28229E-02         1.18587E+00         7.22319E-01         1.18594E+00         3.24637E+01         1.00000E+00         4.89657E-07         3.24637E+01         1.04221E+01         2.20416E+01
+          1.88744E-02         8.17524E-03        -1.29092E-02         1.18587E+00         7.32990E-01         1.18594E+00         3.09889E+01         1.00000E+00         4.97015E-07         3.09889E+01         1.02001E+01         2.07888E+01
+          1.88744E-02         8.34507E-03        -1.29973E-02         1.18587E+00         7.43660E-01         1.18594E+00         2.95661E+01         1.00000E+00         5.04659E-07         2.95661E+01         9.97252E+00         1.95936E+01
+          1.88744E-02         8.51490E-03        -1.30873E-02         1.18587E+00         7.54331E-01         1.18594E+00         2.81952E+01         1.00000E+00         5.12592E-07         2.81952E+01         9.73992E+00         1.84553E+01
+          1.88744E-02         8.68473E-03        -1.31790E-02         1.18587E+00         7.65001E-01         1.18594E+00         2.68758E+01         1.00000E+00         5.20818E-07         2.68758E+01         9.50266E+00         1.73731E+01
+          1.88744E-02         8.85455E-03        -1.32726E-02         1.18587E+00         7.75672E-01         1.18594E+00         2.56075E+01         1.00000E+00         5.29341E-07         2.56075E+01         9.26116E+00         1.63463E+01
+          1.88744E-02         9.02438E-03        -1.33680E-02         1.18586E+00         7.86343E-01         1.18594E+00         2.43897E+01         1.00000E+00         5.38164E-07         2.43897E+01         9.01587E+00         1.53739E+01
+          1.88744E-02         9.19421E-03        -1.34652E-02         1.18586E+00         7.97013E-01         1.18594E+00         2.32219E+01         1.00000E+00         5.47293E-07         2.32219E+01         8.76723E+00         1.44547E+01
+          1.88744E-02         9.36403E-03        -1.35642E-02         1.18586E+00         8.07684E-01         1.18594E+00         2.21033E+01         1.00000E+00         5.56732E-07         2.21033E+01         8.51569E+00         1.35876E+01
+          1.88744E-02         9.53386E-03        -1.36650E-02         1.18586E+00         8.18354E-01         1.18594E+00         2.10332E+01         1.00000E+00         5.66484E-07         2.10332E+01         8.26171E+00         1.27715E+01
+          1.88744E-02         9.70369E-03        -1.37676E-02         1.18586E+00         8.29025E-01         1.18594E+00         2.00106E+01         1.00000E+00         5.76554E-07         2.00106E+01         8.00576E+00         1.20049E+01
+          1.88744E-02         9.87352E-03        -1.38720E-02         1.18585E+00         8.39695E-01         1.18593E+00         1.90348E+01         1.00000E+00         5.86949E-07         1.90348E+01         7.74829E+00         1.12865E+01
+          1.88744E-02         1.00433E-02        -1.39783E-02         1.18585E+00         8.50366E-01         1.18593E+00         1.81045E+01         1.00000E+00         5.97671E-07         1.81045E+01         7.48978E+00         1.06147E+01
+          1.88744E-02         1.02132E-02        -1.40863E-02         1.18585E+00         8.61037E-01         1.18593E+00         1.72189E+01         1.00000E+00         6.08728E-07         1.72189E+01         7.23069E+00         9.98822E+00
+          1.88744E-02         1.03830E-02        -1.41962E-02         1.18585E+00         8.71707E-01         1.18593E+00         1.63768E+01         1.00000E+00         6.20124E-07         1.63768E+01         6.97148E+00         9.40531E+00
+          1.88744E-02         1.05528E-02        -1.43079E-02         1.18585E+00         8.82378E-01         1.18593E+00         1.55770E+01         1.00000E+00         6.31866E-07         1.55770E+01         6.71262E+00         8.86439E+00
+          1.88744E-02         1.07227E-02        -1.44214E-02         1.18584E+00         8.93048E-01         1.18593E+00         1.48184E+01         1.00000E+00         6.43959E-07         1.48184E+01         6.45457E+00         8.36381E+00
+          1.88744E-02         1.08925E-02        -1.45367E-02         1.18584E+00         9.03719E-01         1.18593E+00         1.40996E+01         1.00000E+00         6.56409E-07         1.40996E+01         6.19776E+00         7.90188E+00
+          1.88744E-02         1.10623E-02        -1.46538E-02         1.18584E+00         9.14389E-01         1.18593E+00         1.34196E+01         1.00000E+00         6.69224E-07         1.34196E+01         5.94266E+00         7.47690E+00
+          1.88744E-02         1.12321E-02        -1.47728E-02         1.18584E+00         9.25060E-01         1.18593E+00         1.27768E+01         1.00000E+00         6.82410E-07         1.27768E+01         5.68968E+00         7.08712E+00
+          1.88744E-02         1.14020E-02        -1.48935E-02         1.18583E+00         9.35731E-01         1.18593E+00         1.21701E+01         1.00000E+00         6.95973E-07         1.21701E+01         5.43925E+00         6.73082E+00
+          1.88744E-02         1.15718E-02        -1.50161E-02         1.18583E+00         9.46401E-01         1.18593E+00         1.15980E+01         1.00000E+00         7.09922E-07         1.15980E+01         5.19179E+00         6.40625E+00
+          1.88744E-02         1.17416E-02        -1.51404E-02         1.18583E+00         9.57072E-01         1.18593E+00         1.10593E+01         1.00000E+00         7.24262E-07         1.10593E+01         4.94769E+00         6.11165E+00
+          1.88744E-02         1.19114E-02        -1.52666E-02         1.18583E+00         9.67742E-01         1.18593E+00         1.05526E+01         1.00000E+00         7.39003E-07         1.05526E+01         4.70734E+00         5.84531E+00
+          1.88744E-02         1.20813E-02        -1.53946E-02         1.18583E+00         9.78413E-01         1.18593E+00         1.00766E+01         1.00000E+00         7.54150E-07         1.00766E+01         4.47112E+00         5.60548E+00
+          1.88744E-02         1.22511E-02        -1.55244E-02         1.18582E+00         9.89083E-01         1.18592E+00         9.62984E+00         1.00000E+00         7.69711E-07         9.62984E+00         4.23937E+00         5.39047E+00
+          1.88744E-02         1.24209E-02        -1.56560E-02         1.18582E+00         9.99754E-01         1.18592E+00         9.21103E+00         1.00000E+00         7.85695E-07         9.21103E+00         4.01244E+00         5.19859E+00
+          1.88744E-02         1.25908E-02        -1.57895E-02         1.18582E+00         1.01042E+00         1.18592E+00         8.81884E+00         1.00000E+00         8.02108E-07         8.81884E+00         3.79064E+00         5.02820E+00
+          1.88744E-02         1.27606E-02        -1.59247E-02         1.18582E+00         1.02110E+00         1.18592E+00         8.45195E+00         1.00000E+00         8.18958E-07         8.45195E+00         3.57428E+00         4.87767E+00
+          1.88744E-02         1.29304E-02        -1.60618E-02         1.18581E+00         1.03177E+00         1.18592E+00         8.10906E+00         1.00000E+00         8.36252E-07         8.10906E+00         3.36365E+00         4.74541E+00
+          1.88744E-02         1.31002E-02        -1.62006E-02         1.18581E+00         1.04244E+00         1.18592E+00         7.78890E+00         1.00000E+00         8.53999E-07         7.78890E+00         3.15901E+00         4.62989E+00
+          1.88744E-02         1.32701E-02        -1.63413E-02         1.18581E+00         1.05311E+00         1.18592E+00         7.49021E+00         1.00000E+00         8.72204E-07         7.49021E+00         2.96059E+00         4.52962E+00
+          1.88744E-02         1.34399E-02        -1.64838E-02         1.18580E+00         1.06378E+00         1.18592E+00         7.21177E+00         1.00000E+00         8.90875E-07         7.21177E+00         2.76864E+00         4.44314E+00
+          1.88744E-02         1.36097E-02        -1.66281E-02         1.18580E+00         1.07445E+00         1.18592E+00         6.95239E+00         1.00000E+00         9.10019E-07         6.95239E+00         2.58333E+00         4.36906E+00
+          1.88744E-02         1.37795E-02        -1.67742E-02         1.18580E+00         1.08512E+00         1.18592E+00         6.71091E+00         1.00000E+00         9.29642E-07         6.71091E+00         2.40487E+00         4.30604E+00
+          1.88744E-02         1.39494E-02        -1.69221E-02         1.18580E+00         1.09579E+00         1.18592E+00         6.48620E+00         1.00000E+00         9.49751E-07         6.48620E+00         2.23340E+00         4.25280E+00
+          1.88744E-02         1.41192E-02        -1.70719E-02         1.18579E+00         1.10646E+00         1.18592E+00         6.27718E+00         1.00000E+00         9.70352E-07         6.27718E+00         2.06907E+00         4.20812E+00
+          1.88744E-02         1.42890E-02        -1.72234E-02         1.18579E+00         1.11713E+00         1.18592E+00         6.08281E+00         1.00000E+00         9.91449E-07         6.08281E+00         1.91198E+00         4.17083E+00
+          1.88744E-02         1.44589E-02        -1.73768E-02         1.18579E+00         1.12780E+00         1.18591E+00         5.90207E+00         1.00000E+00         1.01305E-06         5.90207E+00         1.76224E+00         4.13983E+00
+          1.88744E-02         1.46287E-02        -1.75320E-02         1.18578E+00         1.13847E+00         1.18591E+00         5.73401E+00         1.00000E+00         1.03516E-06         5.73401E+00         1.61991E+00         4.11410E+00
+          1.88744E-02         1.47985E-02        -1.76890E-02         1.18578E+00         1.14914E+00         1.18591E+00         5.57770E+00         1.00000E+00         1.05778E-06         5.57770E+00         1.48505E+00         4.09266E+00
+          1.88744E-02         1.49683E-02        -1.78478E-02         1.18578E+00         1.15981E+00         1.18591E+00         5.43227E+00         1.00000E+00         1.08091E-06         5.43227E+00         1.35767E+00         4.07460E+00
+          1.88744E-02         1.51382E-02        -1.80084E-02         1.18578E+00         1.17048E+00         1.18591E+00         5.29689E+00         1.00000E+00         1.10457E-06         5.29689E+00         1.23780E+00         4.05910E+00
+          1.88744E-02         1.53080E-02        -1.81708E-02         1.18577E+00         1.18115E+00         1.18591E+00         5.17077E+00         1.00000E+00         1.12875E-06         5.17077E+00         1.12541E+00         4.04537E+00
+          1.88744E-02         1.54778E-02        -1.83351E-02         1.18577E+00         1.19182E+00         1.18591E+00         5.05318E+00         1.00000E+00         1.15346E-06         5.05318E+00         1.02047E+00         4.03271E+00
+          1.88744E-02         1.56476E-02        -1.85011E-02         1.18577E+00         1.20249E+00         1.18591E+00         4.94341E+00         1.00000E+00         1.17870E-06         4.94341E+00         9.22931E-01         4.02048E+00
+          1.88744E-02         1.58175E-02        -1.86690E-02         1.18576E+00         1.21317E+00         1.18591E+00         4.84081E+00         1.00000E+00         1.20447E-06         4.84081E+00         8.32718E-01         4.00810E+00
+          1.88744E-02         1.59873E-02        -1.88387E-02         1.18576E+00         1.22384E+00         1.18591E+00         4.74479E+00         1.00000E+00         1.23078E-06         4.74479E+00         7.49739E-01         3.99505E+00
+          1.88744E-02         1.61571E-02        -1.90102E-02         1.18576E+00         1.23451E+00         1.18591E+00         4.65478E+00         1.00000E+00         1.25763E-06         4.65478E+00         6.73886E-01         3.98089E+00
+          1.88744E-02         1.63270E-02        -1.91835E-02         1.18575E+00         1.24518E+00         1.18591E+00         4.57025E+00         1.00000E+00         1.28502E-06         4.57025E+00         6.05031E-01         3.96522E+00
+          1.88744E-02         1.64968E-02        -1.93586E-02         1.18575E+00         1.25585E+00         1.18591E+00         4.49074E+00         1.00000E+00         1.31295E-06         4.49074E+00         5.43033E-01         3.94771E+00
+          1.88744E-02         1.66666E-02        -1.95355E-02         1.18575E+00         1.26652E+00         1.18591E+00         4.41581E+00         1.00000E+00         1.34143E-06         4.41581E+00         4.87732E-01         3.92807E+00
+          1.88744E-02         1.68364E-02        -1.97143E-02         1.18574E+00         1.27719E+00         1.18591E+00         4.34505E+00         1.00000E+00         1.37045E-06         4.34505E+00         4.38956E-01         3.90610E+00
+          1.88744E-02         1.70063E-02        -1.98948E-02         1.18574E+00         1.28786E+00         1.18591E+00         4.27813E+00         1.00000E+00         1.40003E-06         4.27813E+00         3.96518E-01         3.88161E+00
+          1.88744E-02         1.71761E-02        -2.00772E-02         1.18574E+00         1.29853E+00         1.18591E+00         4.21470E+00         1.00000E+00         1.43016E-06         4.21470E+00         3.60218E-01         3.85449E+00
+          1.88744E-02         1.73459E-02        -2.02614E-02         1.18573E+00         1.30920E+00         1.18591E+00         4.15450E+00         1.00000E+00         1.46084E-06         4.15450E+00         3.29846E-01         3.82466E+00
+          1.88744E-02         1.75158E-02        -2.04473E-02         1.18573E+00         1.31987E+00         1.18591E+00         4.09727E+00         1.00000E+00         1.49208E-06         4.09727E+00         3.05177E-01         3.79209E+00
+          1.88744E-02         1.76856E-02        -2.06352E-02         1.18573E+00         1.33054E+00         1.18591E+00         4.04278E+00         1.00000E+00         1.52389E-06         4.04278E+00         2.85980E-01         3.75680E+00
+          1.88744E-02         1.78554E-02        -2.08248E-02         1.18572E+00         1.34121E+00         1.18591E+00         3.99086E+00         1.00000E+00         1.55625E-06         3.99086E+00         2.72014E-01         3.71884E+00
+          1.88744E-02         1.80252E-02        -2.10162E-02         1.18572E+00         1.35188E+00         1.18591E+00         3.94133E+00         1.00000E+00         1.58919E-06         3.94133E+00         2.63030E-01         3.67830E+00
+          1.88744E-02         1.81951E-02        -2.12094E-02         1.18572E+00         1.36255E+00         1.18590E+00         3.89407E+00         1.00000E+00         1.62270E-06         3.89407E+00         2.58771E-01         3.63530E+00
+          1.88744E-02         1.83649E-02        -2.14045E-02         1.18571E+00         1.37322E+00         1.18590E+00         3.84896E+00         1.00000E+00         1.65679E-06         3.84896E+00         2.58977E-01         3.58999E+00
+          1.88744E-02         1.85347E-02        -2.16014E-02         1.18571E+00         1.38389E+00         1.18590E+00         3.80592E+00         1.00000E+00         1.69146E-06         3.80592E+00         2.63380E-01         3.54254E+00
+          1.88744E-02         1.87045E-02        -2.18000E-02         1.18570E+00         1.39457E+00         1.18590E+00         3.76488E+00         1.00000E+00         1.72672E-06         3.76488E+00         2.71710E-01         3.49317E+00
+          1.88744E-02         1.88744E-02        -2.20005E-02         1.18570E+00         1.40524E+00         1.18590E+00         3.72579E+00         1.00000E+00         1.76257E-06         3.72579E+00         2.83695E-01         3.44209E+00
+          1.88744E-02         1.90442E-02        -2.22028E-02         1.18570E+00         1.41591E+00         1.18590E+00         3.68861E+00         1.00000E+00         1.79903E-06         3.68861E+00         2.99060E-01         3.38955E+00
+          1.88744E-02         1.92140E-02        -2.24070E-02         1.18569E+00         1.42658E+00         1.18590E+00         3.65333E+00         1.00000E+00         1.83609E-06         3.65333E+00         3.17530E-01         3.33580E+00
+          1.88744E-02         1.93839E-02        -2.26129E-02         1.18569E+00         1.43725E+00         1.18590E+00         3.61994E+00         1.00000E+00         1.87377E-06         3.61994E+00         3.38829E-01         3.28111E+00
+          1.88744E-02         1.95537E-02        -2.28206E-02         1.18568E+00         1.44792E+00         1.18590E+00         3.58844E+00         1.00000E+00         1.91208E-06         3.58844E+00         3.62684E-01         3.22576E+00
+          1.88744E-02         1.97235E-02        -2.30302E-02         1.18568E+00         1.45859E+00         1.18590E+00         3.55885E+00         1.00000E+00         1.95102E-06         3.55885E+00         3.88822E-01         3.17003E+00
+          1.88744E-02         1.98933E-02        -2.32416E-02         1.18568E+00         1.46926E+00         1.18590E+00         3.53119E+00         1.00000E+00         1.99060E-06         3.53119E+00         4.16976E-01         3.11422E+00
+          1.88744E-02         2.00632E-02        -2.34548E-02         1.18567E+00         1.47993E+00         1.18590E+00         3.50548E+00         1.00000E+00         2.03083E-06         3.50548E+00         4.46879E-01         3.05860E+00
+          1.88744E-02         2.02330E-02        -2.36698E-02         1.18567E+00         1.49060E+00         1.18591E+00         3.48175E+00         1.00000E+00         2.07172E-06         3.48175E+00         4.78272E-01         3.00347E+00
+          1.88744E-02         2.04028E-02        -2.38866E-02         1.18566E+00         1.50127E+00         1.18591E+00         3.46002E+00         1.00000E+00         2.11328E-06         3.46002E+00         5.10899E-01         2.94912E+00
+          1.88744E-02         2.05726E-02        -2.41052E-02         1.18566E+00         1.51194E+00         1.18591E+00         3.44033E+00         1.00000E+00         2.15551E-06         3.44033E+00         5.44512E-01         2.89582E+00
+          1.88744E-02         2.07425E-02        -2.43256E-02         1.18566E+00         1.52261E+00         1.18591E+00         3.42270E+00         1.00000E+00         2.19844E-06         3.42270E+00         5.78868E-01         2.84384E+00
+          1.88744E-02         2.09123E-02        -2.45479E-02         1.18565E+00         1.53328E+00         1.18591E+00         3.40717E+00         1.00000E+00         2.24206E-06         3.40717E+00         6.13732E-01         2.79344E+00
+          1.88744E-02         2.10821E-02        -2.47719E-02         1.18565E+00         1.54395E+00         1.18591E+00         3.39375E+00         1.00000E+00         2.28639E-06         3.39375E+00         6.48878E-01         2.74487E+00
+          1.88744E-02         2.12520E-02        -2.49978E-02         1.18564E+00         1.55462E+00         1.18591E+00         3.38246E+00         1.00000E+00         2.33143E-06         3.38246E+00         6.84088E-01         2.69837E+00
+          1.88744E-02         2.14218E-02        -2.52255E-02         1.18564E+00         1.56529E+00         1.18591E+00         3.37331E+00         1.00000E+00         2.37719E-06         3.37331E+00         7.19153E-01         2.65416E+00
+          1.88744E-02         2.15916E-02        -2.54550E-02         1.18564E+00         1.57596E+00         1.18591E+00         3.36631E+00         1.00000E+00         2.42369E-06         3.36631E+00         7.53873E-01         2.61244E+00
+          1.88744E-02         2.17614E-02        -2.56863E-02         1.18563E+00         1.58664E+00         1.18591E+00         3.36145E+00         1.00000E+00         2.47091E-06         3.36145E+00         7.88058E-01         2.57339E+00
+          1.88744E-02         2.19313E-02        -2.59194E-02         1.18563E+00         1.59731E+00         1.18591E+00         3.35871E+00         1.00000E+00         2.51888E-06         3.35871E+00         8.21531E-01         2.53718E+00
+          1.88744E-02         2.21011E-02        -2.61544E-02         1.18562E+00         1.60798E+00         1.18591E+00         3.35809E+00         1.00000E+00         2.56760E-06         3.35809E+00         8.54121E-01         2.50397E+00
+          1.88744E-02         2.22709E-02        -2.63911E-02         1.18562E+00         1.61865E+00         1.18591E+00         3.35954E+00         1.00000E+00         2.61707E-06         3.35954E+00         8.85671E-01         2.47387E+00
+          1.88744E-02         2.24407E-02        -2.66297E-02         1.18561E+00         1.62932E+00         1.18591E+00         3.36303E+00         1.00000E+00         2.66729E-06         3.36303E+00         9.16034E-01         2.44700E+00
+          1.88744E-02         2.26106E-02        -2.68701E-02         1.18561E+00         1.63999E+00         1.18591E+00         3.36851E+00         1.00000E+00         2.71827E-06         3.36851E+00         9.45076E-01         2.42343E+00
+          1.88744E-02         2.27804E-02        -2.71123E-02         1.18560E+00         1.65066E+00         1.18591E+00         3.37591E+00         1.00000E+00         2.77001E-06         3.37591E+00         9.72671E-01         2.40323E+00
+          1.88744E-02         2.29502E-02        -2.73563E-02         1.18560E+00         1.66133E+00         1.18591E+00         3.38516E+00         1.00000E+00         2.82250E-06         3.38516E+00         9.98707E-01         2.38645E+00
+          1.88744E-02         2.31201E-02        -2.76021E-02         1.18559E+00         1.67200E+00         1.18592E+00         3.39618E+00         1.00000E+00         2.87575E-06         3.39618E+00         1.02308E+00         2.37310E+00
+          1.88744E-02         2.32899E-02        -2.78497E-02         1.18559E+00         1.68267E+00         1.18592E+00         3.40887E+00         1.00000E+00         2.92975E-06         3.40887E+00         1.04571E+00         2.36317E+00
+          1.88744E-02         2.34597E-02        -2.80992E-02         1.18559E+00         1.69334E+00         1.18592E+00         3.42314E+00         1.00000E+00         2.98450E-06         3.42314E+00         1.06650E+00         2.35664E+00
+          1.88744E-02         2.36295E-02        -2.83504E-02         1.18558E+00         1.70401E+00         1.18592E+00         3.43888E+00         1.00000E+00         3.03999E-06         3.43888E+00         1.08540E+00         2.35348E+00
+          1.88744E-02         2.37994E-02        -2.86035E-02         1.18558E+00         1.71468E+00         1.18592E+00         3.45595E+00         1.00000E+00         3.09623E-06         3.45595E+00         1.10234E+00         2.35360E+00
+          1.88744E-02         2.39692E-02        -2.88584E-02         1.18557E+00         1.72535E+00         1.18592E+00         3.47422E+00         1.00000E+00         3.15319E-06         3.47422E+00         1.11729E+00         2.35694E+00
+          1.88744E-02         2.41390E-02        -2.91151E-02         1.18557E+00         1.73602E+00         1.18592E+00         3.49356E+00         1.00000E+00         3.21088E-06         3.49356E+00         1.13019E+00         2.36337E+00
+          1.88744E-02         2.43088E-02        -2.93736E-02         1.18556E+00         1.74669E+00         1.18593E+00         3.51382E+00         1.00000E+00         3.26928E-06         3.51382E+00         1.14104E+00         2.37278E+00
+          1.88744E-02         2.44787E-02        -2.96339E-02         1.18556E+00         1.75736E+00         1.18593E+00         3.53485E+00         1.00000E+00         3.32838E-06         3.53485E+00         1.14982E+00         2.38503E+00
+          1.88744E-02         2.46485E-02        -2.98961E-02         1.18555E+00         1.76804E+00         1.18593E+00         3.55647E+00         1.00000E+00         3.38818E-06         3.55647E+00         1.15651E+00         2.39996E+00
+          1.88744E-02         2.48183E-02        -3.01600E-02         1.18555E+00         1.77871E+00         1.18593E+00         3.57853E+00         1.00000E+00         3.44866E-06         3.57853E+00         1.16113E+00         2.41740E+00
+          1.88744E-02         2.49882E-02        -3.04258E-02         1.18554E+00         1.78938E+00         1.18593E+00         3.60085E+00         1.00000E+00         3.50981E-06         3.60085E+00         1.16368E+00         2.43716E+00
+          1.88744E-02         2.51580E-02        -3.06934E-02         1.18554E+00         1.80005E+00         1.18593E+00         3.62325E+00         1.00000E+00         3.57162E-06         3.62325E+00         1.16420E+00         2.45905E+00
+          1.88744E-02         2.53278E-02        -3.09628E-02         1.18553E+00         1.81072E+00         1.18594E+00         3.64556E+00         1.00000E+00         3.63407E-06         3.64556E+00         1.16270E+00         2.48286E+00
+          1.88744E-02         2.54976E-02        -3.12340E-02         1.18553E+00         1.82139E+00         1.18594E+00         3.66759E+00         1.00000E+00         3.69716E-06         3.66759E+00         1.15923E+00         2.50836E+00
+          1.88744E-02         2.56675E-02        -3.15070E-02         1.18552E+00         1.83206E+00         1.18594E+00         3.68916E+00         1.00000E+00         3.76088E-06         3.68916E+00         1.15382E+00         2.53534E+00
+          1.88744E-02         2.58373E-02        -3.17818E-02         1.18552E+00         1.84273E+00         1.18594E+00         3.71009E+00         1.00000E+00         3.82520E-06         3.71009E+00         1.14654E+00         2.56354E+00
+          1.88744E-02         2.60071E-02        -3.20585E-02         1.18551E+00         1.85340E+00         1.18594E+00         3.73018E+00         1.00000E+00         3.89013E-06         3.73018E+00         1.13744E+00         2.59274E+00
+          1.88744E-02         2.61769E-02        -3.23369E-02         1.18551E+00         1.86407E+00         1.18595E+00         3.74927E+00         1.00000E+00         3.95564E-06         3.74927E+00         1.12658E+00         2.62269E+00
+          1.90442E-02         8.72665E-04        -1.10361E-02         1.19658E+00         2.74155E-01         1.19663E+00         1.22235E+02         1.00000E+00         2.62036E-07         1.22235E+02         1.03672E+01         1.11868E+02
+          1.90442E-02         1.04249E-03        -1.10464E-02         1.19658E+00         2.84826E-01         1.19663E+00         1.20073E+02         1.00000E+00         2.62029E-07         1.20073E+02         1.04626E+01         1.09610E+02
+          1.90442E-02         1.21232E-03        -1.10584E-02         1.19658E+00         2.95496E-01         1.19663E+00         1.17865E+02         1.00000E+00         2.62055E-07         1.17865E+02         1.05567E+01         1.07309E+02
+          1.90442E-02         1.38215E-03        -1.10722E-02         1.19658E+00         3.06167E-01         1.19663E+00         1.15618E+02         1.00000E+00         2.62117E-07         1.15618E+02         1.06490E+01         1.04969E+02
+          1.90442E-02         1.55197E-03        -1.10879E-02         1.19658E+00         3.16838E-01         1.19663E+00         1.13334E+02         1.00000E+00         2.62221E-07         1.13334E+02         1.07390E+01         1.02594E+02
+          1.90442E-02         1.72180E-03        -1.11053E-02         1.19658E+00         3.27508E-01         1.19663E+00         1.11016E+02         1.00000E+00         2.62370E-07         1.11016E+02         1.08264E+01         1.00190E+02
+          1.90442E-02         1.89163E-03        -1.11246E-02         1.19658E+00         3.38179E-01         1.19663E+00         1.08669E+02         1.00000E+00         2.62568E-07         1.08669E+02         1.09107E+01         9.77586E+01
+          1.90442E-02         2.06146E-03        -1.11457E-02         1.19658E+00         3.48849E-01         1.19663E+00         1.06297E+02         1.00000E+00         2.62820E-07         1.06297E+02         1.09915E+01         9.53055E+01
+          1.90442E-02         2.23128E-03        -1.11686E-02         1.19658E+00         3.59520E-01         1.19663E+00         1.03903E+02         1.00000E+00         2.63131E-07         1.03903E+02         1.10682E+01         9.28343E+01
+          1.90442E-02         2.40111E-03        -1.11933E-02         1.19658E+00         3.70190E-01         1.19663E+00         1.01490E+02         1.00000E+00         2.63504E-07         1.01490E+02         1.11407E+01         9.03493E+01
+          1.90442E-02         2.57094E-03        -1.12198E-02         1.19658E+00         3.80861E-01         1.19663E+00         9.90628E+01         1.00000E+00         2.63946E-07         9.90628E+01         1.12083E+01         8.78545E+01
+          1.90442E-02         2.74077E-03        -1.12482E-02         1.19658E+00         3.91532E-01         1.19663E+00         9.66246E+01         1.00000E+00         2.64461E-07         9.66246E+01         1.12708E+01         8.53538E+01
+          1.90442E-02         2.91059E-03        -1.12783E-02         1.19658E+00         4.02202E-01         1.19663E+00         9.41790E+01         1.00000E+00         2.65054E-07         9.41790E+01         1.13277E+01         8.28512E+01
+          1.90442E-02         3.08042E-03        -1.13103E-02         1.19658E+00         4.12873E-01         1.19663E+00         9.17294E+01         1.00000E+00         2.65730E-07         9.17294E+01         1.13788E+01         8.03506E+01
+          1.90442E-02         3.25025E-03        -1.13440E-02         1.19658E+00         4.23543E-01         1.19663E+00         8.92795E+01         1.00000E+00         2.66495E-07         8.92795E+01         1.14237E+01         7.78558E+01
+          1.90442E-02         3.42008E-03        -1.13796E-02         1.19658E+00         4.34214E-01         1.19663E+00         8.68324E+01         1.00000E+00         2.67353E-07         8.68324E+01         1.14620E+01         7.53705E+01
+          1.90442E-02         3.58990E-03        -1.14170E-02         1.19657E+00         4.44884E-01         1.19663E+00         8.43916E+01         1.00000E+00         2.68311E-07         8.43916E+01         1.14934E+01         7.28982E+01
+          1.90442E-02         3.75973E-03        -1.14562E-02         1.19657E+00         4.55555E-01         1.19663E+00         8.19603E+01         1.00000E+00         2.69374E-07         8.19603E+01         1.15177E+01         7.04426E+01
+          1.90442E-02         3.92956E-03        -1.14972E-02         1.19657E+00         4.66225E-01         1.19663E+00         7.95415E+01         1.00000E+00         2.70547E-07         7.95415E+01         1.15346E+01         6.80069E+01
+          1.90442E-02         4.09939E-03        -1.15401E-02         1.19657E+00         4.76896E-01         1.19663E+00         7.71384E+01         1.00000E+00         2.71836E-07         7.71384E+01         1.15439E+01         6.55945E+01
+          1.90442E-02         4.26921E-03        -1.15847E-02         1.19657E+00         4.87567E-01         1.19663E+00         7.47538E+01         1.00000E+00         2.73246E-07         7.47538E+01         1.15453E+01         6.32085E+01
+          1.90442E-02         4.43904E-03        -1.16312E-02         1.19657E+00         4.98237E-01         1.19663E+00         7.23907E+01         1.00000E+00         2.74784E-07         7.23907E+01         1.15386E+01         6.08520E+01
+          1.90442E-02         4.60887E-03        -1.16794E-02         1.19657E+00         5.08908E-01         1.19663E+00         7.00516E+01         1.00000E+00         2.76454E-07         7.00516E+01         1.15238E+01         5.85278E+01
+          1.90442E-02         4.77869E-03        -1.17295E-02         1.19657E+00         5.19578E-01         1.19663E+00         6.77393E+01         1.00000E+00         2.78261E-07         6.77393E+01         1.15005E+01         5.62387E+01
+          1.90442E-02         4.94852E-03        -1.17814E-02         1.19657E+00         5.30249E-01         1.19663E+00         6.54561E+01         1.00000E+00         2.80212E-07         6.54561E+01         1.14688E+01         5.39873E+01
+          1.90442E-02         5.11835E-03        -1.18351E-02         1.19657E+00         5.40919E-01         1.19663E+00         6.32045E+01         1.00000E+00         2.82312E-07         6.32045E+01         1.14285E+01         5.17760E+01
+          1.90442E-02         5.28818E-03        -1.18906E-02         1.19657E+00         5.51590E-01         1.19662E+00         6.09867E+01         1.00000E+00         2.84565E-07         6.09867E+01         1.13795E+01         4.96071E+01
+          1.90442E-02         5.45800E-03        -1.19479E-02         1.19656E+00         5.62261E-01         1.19662E+00         5.88047E+01         1.00000E+00         2.86976E-07         5.88047E+01         1.13219E+01         4.74828E+01
+          1.90442E-02         5.62783E-03        -1.20071E-02         1.19656E+00         5.72931E-01         1.19662E+00         5.66606E+01         1.00000E+00         2.89552E-07         5.66606E+01         1.12555E+01         4.54051E+01
+          1.90442E-02         5.79766E-03        -1.20680E-02         1.19656E+00         5.83602E-01         1.19662E+00         5.45561E+01         1.00000E+00         2.92296E-07         5.45561E+01         1.11804E+01         4.33758E+01
+          1.90442E-02         5.96749E-03        -1.21308E-02         1.19656E+00         5.94272E-01         1.19662E+00         5.24931E+01         1.00000E+00         2.95213E-07         5.24931E+01         1.10966E+01         4.13965E+01
+          1.90442E-02         6.13731E-03        -1.21953E-02         1.19656E+00         6.04943E-01         1.19662E+00         5.04729E+01         1.00000E+00         2.98307E-07         5.04729E+01         1.10042E+01         3.94687E+01
+          1.90442E-02         6.30714E-03        -1.22617E-02         1.19656E+00         6.15613E-01         1.19662E+00         4.84971E+01         1.00000E+00         3.01583E-07         4.84971E+01         1.09033E+01         3.75939E+01
+          1.90442E-02         6.47697E-03        -1.23299E-02         1.19656E+00         6.26284E-01         1.19662E+00         4.65670E+01         1.00000E+00         3.05044E-07         4.65670E+01         1.07939E+01         3.57731E+01
+          1.90442E-02         6.64680E-03        -1.23999E-02         1.19656E+00         6.36955E-01         1.19662E+00         4.46836E+01         1.00000E+00         3.08695E-07         4.46836E+01         1.06763E+01         3.40074E+01
+          1.90442E-02         6.81662E-03        -1.24717E-02         1.19655E+00         6.47625E-01         1.19662E+00         4.28481E+01         1.00000E+00         3.12539E-07         4.28481E+01         1.05505E+01         3.22976E+01
+          1.90442E-02         6.98645E-03        -1.25454E-02         1.19655E+00         6.58296E-01         1.19662E+00         4.10612E+01         1.00000E+00         3.16579E-07         4.10612E+01         1.04167E+01         3.06445E+01
+          1.90442E-02         7.15628E-03        -1.26208E-02         1.19655E+00         6.68966E-01         1.19662E+00         3.93238E+01         1.00000E+00         3.20819E-07         3.93238E+01         1.02753E+01         2.90485E+01
+          1.90442E-02         7.32611E-03        -1.26981E-02         1.19655E+00         6.79637E-01         1.19662E+00         3.76364E+01         1.00000E+00         3.25261E-07         3.76364E+01         1.01263E+01         2.75101E+01
+          1.90442E-02         7.49593E-03        -1.27771E-02         1.19655E+00         6.90307E-01         1.19662E+00         3.59995E+01         1.00000E+00         3.29909E-07         3.59995E+01         9.96997E+00         2.60295E+01
+          1.90442E-02         7.66576E-03        -1.28580E-02         1.19655E+00         7.00978E-01         1.19662E+00         3.44136E+01         1.00000E+00         3.34765E-07         3.44136E+01         9.80669E+00         2.46069E+01
+          1.90442E-02         7.83559E-03        -1.29407E-02         1.19655E+00         7.11649E-01         1.19662E+00         3.28787E+01         1.00000E+00         3.39831E-07         3.28787E+01         9.63669E+00         2.32420E+01
+          1.90442E-02         8.00542E-03        -1.30252E-02         1.19654E+00         7.22319E-01         1.19661E+00         3.13951E+01         1.00000E+00         3.45109E-07         3.13951E+01         9.46027E+00         2.19349E+01
+          1.90442E-02         8.17524E-03        -1.31115E-02         1.19654E+00         7.32990E-01         1.19661E+00         2.99628E+01         1.00000E+00         3.50603E-07         2.99628E+01         9.27776E+00         2.06850E+01
+          1.90442E-02         8.34507E-03        -1.31997E-02         1.19654E+00         7.43660E-01         1.19661E+00         2.85816E+01         1.00000E+00         3.56313E-07         2.85816E+01         9.08950E+00         1.94921E+01
+          1.90442E-02         8.51490E-03        -1.32896E-02         1.19654E+00         7.54331E-01         1.19661E+00         2.72512E+01         1.00000E+00         3.62242E-07         2.72512E+01         8.89584E+00         1.83554E+01
+          1.90442E-02         8.68473E-03        -1.33814E-02         1.19654E+00         7.65001E-01         1.19661E+00         2.59715E+01         1.00000E+00         3.68391E-07         2.59715E+01         8.69715E+00         1.72744E+01
+          1.90442E-02         8.85455E-03        -1.34749E-02         1.19654E+00         7.75672E-01         1.19661E+00         2.47419E+01         1.00000E+00         3.74762E-07         2.47419E+01         8.49380E+00         1.62481E+01
+          1.90442E-02         9.02438E-03        -1.35703E-02         1.19653E+00         7.86343E-01         1.19661E+00         2.35620E+01         1.00000E+00         3.81358E-07         2.35620E+01         8.28618E+00         1.52758E+01
+          1.90442E-02         9.19421E-03        -1.36675E-02         1.19653E+00         7.97013E-01         1.19661E+00         2.24311E+01         1.00000E+00         3.88179E-07         2.24311E+01         8.07471E+00         1.43564E+01
+          1.90442E-02         9.36403E-03        -1.37665E-02         1.19653E+00         8.07684E-01         1.19661E+00         2.13485E+01         1.00000E+00         3.95228E-07         2.13485E+01         7.85977E+00         1.34887E+01
+          1.90442E-02         9.53386E-03        -1.38673E-02         1.19653E+00         8.18354E-01         1.19661E+00         2.03134E+01         1.00000E+00         4.02506E-07         2.03134E+01         7.64179E+00         1.26716E+01
+          1.90442E-02         9.70369E-03        -1.39699E-02         1.19653E+00         8.29025E-01         1.19661E+00         1.93250E+01         1.00000E+00         4.10015E-07         1.93250E+01         7.42120E+00         1.19038E+01
+          1.90442E-02         9.87352E-03        -1.40744E-02         1.19652E+00         8.39695E-01         1.19661E+00         1.83824E+01         1.00000E+00         4.17757E-07         1.83824E+01         7.19840E+00         1.11840E+01
+          1.90442E-02         1.00433E-02        -1.41806E-02         1.19652E+00         8.50366E-01         1.19661E+00         1.74846E+01         1.00000E+00         4.25736E-07         1.74846E+01         6.97384E+00         1.05108E+01
+          1.90442E-02         1.02132E-02        -1.42887E-02         1.19652E+00         8.61037E-01         1.19661E+00         1.66305E+01         1.00000E+00         4.33952E-07         1.66305E+01         6.74794E+00         9.88258E+00
+          1.90442E-02         1.03830E-02        -1.43985E-02         1.19652E+00         8.71707E-01         1.19660E+00         1.58191E+01         1.00000E+00         4.42408E-07         1.58191E+01         6.52112E+00         9.29794E+00
+          1.90442E-02         1.05528E-02        -1.45102E-02         1.19652E+00         8.82378E-01         1.19660E+00         1.50491E+01         1.00000E+00         4.51108E-07         1.50491E+01         6.29382E+00         8.75526E+00
+          1.90442E-02         1.07227E-02        -1.46237E-02         1.19651E+00         8.93048E-01         1.19660E+00         1.43194E+01         1.00000E+00         4.60054E-07         1.43194E+01         6.06647E+00         8.25294E+00
+          1.90442E-02         1.08925E-02        -1.47390E-02         1.19651E+00         9.03719E-01         1.19660E+00         1.36288E+01         1.00000E+00         4.69250E-07         1.36288E+01         5.83947E+00         7.78932E+00
+          1.90442E-02         1.10623E-02        -1.48561E-02         1.19651E+00         9.14389E-01         1.19660E+00         1.29760E+01         1.00000E+00         4.78700E-07         1.29760E+01         5.61325E+00         7.36274E+00
+          1.90442E-02         1.12321E-02        -1.49751E-02         1.19651E+00         9.25060E-01         1.19660E+00         1.23597E+01         1.00000E+00         4.88406E-07         1.23597E+01         5.38821E+00         6.97148E+00
+          1.90442E-02         1.14020E-02        -1.50958E-02         1.19650E+00         9.35731E-01         1.19660E+00         1.17786E+01         1.00000E+00         4.98375E-07         1.17786E+01         5.16477E+00         6.61385E+00
+          1.90442E-02         1.15718E-02        -1.52184E-02         1.19650E+00         9.46401E-01         1.19660E+00         1.12314E+01         1.00000E+00         5.08609E-07         1.12314E+01         4.94330E+00         6.28813E+00
+          1.90442E-02         1.17416E-02        -1.53428E-02         1.19650E+00         9.57072E-01         1.19660E+00         1.07168E+01         1.00000E+00         5.19115E-07         1.07168E+01         4.72418E+00         5.99261E+00
+          1.90442E-02         1.19114E-02        -1.54689E-02         1.19650E+00         9.67742E-01         1.19660E+00         1.02334E+01         1.00000E+00         5.29898E-07         1.02334E+01         4.50780E+00         5.72555E+00
+          1.90442E-02         1.20813E-02        -1.55969E-02         1.19649E+00         9.78413E-01         1.19660E+00         9.77978E+00         1.00000E+00         5.40963E-07         9.77978E+00         4.29451E+00         5.48527E+00
+          1.90442E-02         1.22511E-02        -1.57267E-02         1.19649E+00         9.89083E-01         1.19660E+00         9.35473E+00         1.00000E+00         5.52315E-07         9.35473E+00         4.08465E+00         5.27007E+00
+          1.90442E-02         1.24209E-02        -1.58584E-02         1.19649E+00         9.99754E-01         1.19659E+00         8.95685E+00         1.00000E+00         5.63963E-07         8.95685E+00         3.87855E+00         5.07830E+00
+          1.90442E-02         1.25908E-02        -1.59918E-02         1.19649E+00         1.01042E+00         1.19659E+00         8.58483E+00         1.00000E+00         5.75912E-07         8.58483E+00         3.67654E+00         4.90829E+00
+          1.90442E-02         1.27606E-02        -1.61270E-02         1.19648E+00         1.02110E+00         1.19659E+00         8.23735E+00         1.00000E+00         5.88169E-07         8.23735E+00         3.47890E+00         4.75845E+00
+          1.90442E-02         1.29304E-02        -1.62641E-02         1.19648E+00         1.03177E+00         1.19659E+00         7.91311E+00         1.00000E+00         6.00741E-07         7.91311E+00         3.28592E+00         4.62719E+00
+          1.90442E-02         1.31002E-02        -1.64030E-02         1.19648E+00         1.04244E+00         1.19659E+00         7.61085E+00         1.00000E+00         6.13636E-07         7.61085E+00         3.09787E+00         4.51298E+00
+          1.90442E-02         1.32701E-02        -1.65436E-02         1.19648E+00         1.05311E+00         1.19659E+00         7.32932E+00         1.00000E+00         6.26862E-07         7.32932E+00         2.91500E+00         4.41432E+00
+          1.90442E-02         1.34399E-02        -1.66861E-02         1.19647E+00         1.06378E+00         1.19659E+00         7.06730E+00         1.00000E+00         6.40425E-07         7.06730E+00         2.73753E+00         4.32976E+00
+          1.90442E-02         1.36097E-02        -1.68304E-02         1.19647E+00         1.07445E+00         1.19659E+00         6.82359E+00         1.00000E+00         6.54335E-07         6.82359E+00         2.56568E+00         4.25791E+00
+          1.90442E-02         1.37795E-02        -1.69765E-02         1.19647E+00         1.08512E+00         1.19659E+00         6.59705E+00         1.00000E+00         6.68598E-07         6.59705E+00         2.39964E+00         4.19741E+00
+          1.90442E-02         1.39494E-02        -1.71245E-02         1.19647E+00         1.09579E+00         1.19659E+00         6.38654E+00         1.00000E+00         6.83224E-07         6.38654E+00         2.23958E+00         4.14696E+00
+          1.90442E-02         1.41192E-02        -1.72742E-02         1.19646E+00         1.10646E+00         1.19659E+00         6.19100E+00         1.00000E+00         6.98219E-07         6.19100E+00         2.08565E+00         4.10534E+00
+          1.90442E-02         1.42890E-02        -1.74258E-02         1.19646E+00         1.11713E+00         1.19659E+00         6.00936E+00         1.00000E+00         7.13592E-07         6.00936E+00         1.93799E+00         4.07137E+00
+          1.90442E-02         1.44589E-02        -1.75791E-02         1.19646E+00         1.12780E+00         1.19659E+00         5.84064E+00         1.00000E+00         7.29350E-07         5.84064E+00         1.79671E+00         4.04393E+00
+          1.90442E-02         1.46287E-02        -1.77343E-02         1.19645E+00         1.13847E+00         1.19659E+00         5.68386E+00         1.00000E+00         7.45501E-07         5.68386E+00         1.66189E+00         4.02197E+00
+          1.90442E-02         1.47985E-02        -1.78913E-02         1.19645E+00         1.14914E+00         1.19658E+00         5.53811E+00         1.00000E+00         7.62052E-07         5.53811E+00         1.53363E+00         4.00449E+00
+          1.90442E-02         1.49683E-02        -1.80501E-02         1.19645E+00         1.15981E+00         1.19658E+00         5.40253E+00         1.00000E+00         7.79009E-07         5.40253E+00         1.41196E+00         3.99057E+00
+          1.90442E-02         1.51382E-02        -1.82107E-02         1.19645E+00         1.17048E+00         1.19658E+00         5.27627E+00         1.00000E+00         7.96380E-07         5.27627E+00         1.29693E+00         3.97934E+00
+          1.90442E-02         1.53080E-02        -1.83732E-02         1.19644E+00         1.18115E+00         1.19658E+00         5.15855E+00         1.00000E+00         8.14171E-07         5.15855E+00         1.18854E+00         3.97002E+00
+          1.90442E-02         1.54778E-02        -1.85374E-02         1.19644E+00         1.19182E+00         1.19658E+00         5.04865E+00         1.00000E+00         8.32388E-07         5.04865E+00         1.08679E+00         3.96186E+00
+          1.90442E-02         1.56476E-02        -1.87034E-02         1.19644E+00         1.20249E+00         1.19658E+00         4.94585E+00         1.00000E+00         8.51035E-07         4.94585E+00         9.91662E-01         3.95419E+00
+          1.90442E-02         1.58175E-02        -1.88713E-02         1.19643E+00         1.21317E+00         1.19658E+00         4.84953E+00         1.00000E+00         8.70117E-07         4.84953E+00         9.03113E-01         3.94642E+00
+          1.90442E-02         1.59873E-02        -1.90410E-02         1.19643E+00         1.22384E+00         1.19658E+00         4.75908E+00         1.00000E+00         8.89640E-07         4.75908E+00         8.21084E-01         3.93799E+00
+          1.90442E-02         1.61571E-02        -1.92125E-02         1.19643E+00         1.23451E+00         1.19658E+00         4.67393E+00         1.00000E+00         9.09606E-07         4.67393E+00         7.45499E-01         3.92843E+00
+          1.90442E-02         1.63270E-02        -1.93858E-02         1.19642E+00         1.24518E+00         1.19658E+00         4.59359E+00         1.00000E+00         9.30019E-07         4.59359E+00         6.76267E-01         3.91732E+00
+          1.90442E-02         1.64968E-02        -1.95609E-02         1.19642E+00         1.25585E+00         1.19658E+00         4.51757E+00         1.00000E+00         9.50881E-07         4.51757E+00         6.13280E-01         3.90429E+00
+          1.90442E-02         1.66666E-02        -1.97378E-02         1.19642E+00         1.26652E+00         1.19658E+00         4.44545E+00         1.00000E+00         9.72196E-07         4.44545E+00         5.56416E-01         3.88903E+00
+          1.90442E-02         1.68364E-02        -1.99166E-02         1.19641E+00         1.27719E+00         1.19658E+00         4.37684E+00         1.00000E+00         9.93964E-07         4.37684E+00         5.05536E-01         3.87130E+00
+          1.90442E-02         1.70063E-02        -2.00971E-02         1.19641E+00         1.28786E+00         1.19658E+00         4.31140E+00         1.00000E+00         1.01619E-06         4.31140E+00         4.60492E-01         3.85090E+00
+          1.90442E-02         1.71761E-02        -2.02795E-02         1.19641E+00         1.29853E+00         1.19658E+00         4.24881E+00         1.00000E+00         1.03886E-06         4.24881E+00         4.21119E-01         3.82769E+00
+          1.90442E-02         1.73459E-02        -2.04637E-02         1.19640E+00         1.30920E+00         1.19658E+00         4.18879E+00         1.00000E+00         1.06200E-06         4.18879E+00         3.87243E-01         3.80155E+00
+          1.90442E-02         1.75158E-02        -2.06497E-02         1.19640E+00         1.31987E+00         1.19658E+00         4.13112E+00         1.00000E+00         1.08559E-06         4.13112E+00         3.58679E-01         3.77245E+00
+          1.90442E-02         1.76856E-02        -2.08375E-02         1.19640E+00         1.33054E+00         1.19658E+00         4.07559E+00         1.00000E+00         1.10964E-06         4.07559E+00         3.35229E-01         3.74036E+00
+          1.90442E-02         1.78554E-02        -2.10271E-02         1.19639E+00         1.34121E+00         1.19658E+00         4.02202E+00         1.00000E+00         1.13414E-06         4.02202E+00         3.16689E-01         3.70533E+00
+          1.90442E-02         1.80252E-02        -2.12185E-02         1.19639E+00         1.35188E+00         1.19658E+00         3.97026E+00         1.00000E+00         1.15909E-06         3.97026E+00         3.02846E-01         3.66741E+00
+          1.90442E-02         1.81951E-02        -2.14118E-02         1.19638E+00         1.36255E+00         1.19658E+00         3.92020E+00         1.00000E+00         1.18450E-06         3.92020E+00         2.93479E-01         3.62672E+00
+          1.90442E-02         1.83649E-02        -2.16068E-02         1.19638E+00         1.37322E+00         1.19658E+00         3.87175E+00         1.00000E+00         1.21037E-06         3.87175E+00         2.88360E-01         3.58339E+00
+          1.90442E-02         1.85347E-02        -2.18037E-02         1.19638E+00         1.38389E+00         1.19658E+00         3.82483E+00         1.00000E+00         1.23668E-06         3.82483E+00         2.87258E-01         3.53757E+00
+          1.90442E-02         1.87045E-02        -2.20024E-02         1.19637E+00         1.39457E+00         1.19658E+00         3.77941E+00         1.00000E+00         1.26345E-06         3.77941E+00         2.89935E-01         3.48947E+00
+          1.90442E-02         1.88744E-02        -2.22028E-02         1.19637E+00         1.40524E+00         1.19658E+00         3.73544E+00         1.00000E+00         1.29067E-06         3.73544E+00         2.96151E-01         3.43929E+00
+          1.90442E-02         1.90442E-02        -2.24052E-02         1.19637E+00         1.41591E+00         1.19657E+00         3.69294E+00         1.00000E+00         1.31834E-06         3.69294E+00         3.05663E-01         3.38727E+00
+          1.90442E-02         1.92140E-02        -2.26093E-02         1.19636E+00         1.42658E+00         1.19657E+00         3.65189E+00         1.00000E+00         1.34646E-06         3.65189E+00         3.18224E-01         3.33366E+00
+          1.90442E-02         1.93839E-02        -2.28152E-02         1.19636E+00         1.43725E+00         1.19657E+00         3.61232E+00         1.00000E+00         1.37503E-06         3.61232E+00         3.33590E-01         3.27873E+00
+          1.90442E-02         1.95537E-02        -2.30229E-02         1.19635E+00         1.44792E+00         1.19657E+00         3.57425E+00         1.00000E+00         1.40406E-06         3.57425E+00         3.51515E-01         3.22274E+00
+          1.90442E-02         1.97235E-02        -2.32325E-02         1.19635E+00         1.45859E+00         1.19657E+00         3.53774E+00         1.00000E+00         1.43354E-06         3.53774E+00         3.71754E-01         3.16599E+00
+          1.90442E-02         1.98933E-02        -2.34439E-02         1.19635E+00         1.46926E+00         1.19658E+00         3.50282E+00         1.00000E+00         1.46348E-06         3.50282E+00         3.94063E-01         3.10876E+00
+          1.90442E-02         2.00632E-02        -2.36571E-02         1.19634E+00         1.47993E+00         1.19658E+00         3.46955E+00         1.00000E+00         1.49388E-06         3.46955E+00         4.18202E-01         3.05135E+00
+          1.90442E-02         2.02330E-02        -2.38721E-02         1.19634E+00         1.49060E+00         1.19658E+00         3.43799E+00         1.00000E+00         1.52474E-06         3.43799E+00         4.43933E-01         2.99406E+00
+          1.90442E-02         2.04028E-02        -2.40889E-02         1.19633E+00         1.50127E+00         1.19658E+00         3.40820E+00         1.00000E+00         1.55607E-06         3.40820E+00         4.71023E-01         2.93718E+00
+          1.90442E-02         2.05726E-02        -2.43075E-02         1.19633E+00         1.51194E+00         1.19658E+00         3.38024E+00         1.00000E+00         1.58788E-06         3.38024E+00         4.99243E-01         2.88100E+00
+          1.90442E-02         2.07425E-02        -2.45279E-02         1.19632E+00         1.52261E+00         1.19658E+00         3.35417E+00         1.00000E+00         1.62016E-06         3.35417E+00         5.28369E-01         2.82580E+00
+          1.90442E-02         2.09123E-02        -2.47502E-02         1.19632E+00         1.53328E+00         1.19658E+00         3.33005E+00         1.00000E+00         1.65293E-06         3.33005E+00         5.58184E-01         2.77187E+00
+          1.90442E-02         2.10821E-02        -2.49742E-02         1.19632E+00         1.54395E+00         1.19658E+00         3.30794E+00         1.00000E+00         1.68620E-06         3.30794E+00         5.88478E-01         2.71946E+00
+          1.90442E-02         2.12520E-02        -2.52001E-02         1.19631E+00         1.55462E+00         1.19658E+00         3.28788E+00         1.00000E+00         1.71996E-06         3.28788E+00         6.19045E-01         2.66883E+00
+          1.90442E-02         2.14218E-02        -2.54278E-02         1.19631E+00         1.56529E+00         1.19658E+00         3.26992E+00         1.00000E+00         1.75423E-06         3.26992E+00         6.49691E-01         2.62023E+00
+          1.90442E-02         2.15916E-02        -2.56573E-02         1.19630E+00         1.57596E+00         1.19658E+00         3.25409E+00         1.00000E+00         1.78902E-06         3.25409E+00         6.80228E-01         2.57387E+00
+          1.90442E-02         2.17614E-02        -2.58886E-02         1.19630E+00         1.58664E+00         1.19658E+00         3.24044E+00         1.00000E+00         1.82434E-06         3.24044E+00         7.10475E-01         2.52997E+00
+          1.90442E-02         2.19313E-02        -2.61217E-02         1.19629E+00         1.59731E+00         1.19658E+00         3.22898E+00         1.00000E+00         1.86020E-06         3.22898E+00         7.40262E-01         2.48871E+00
+          1.90442E-02         2.21011E-02        -2.63567E-02         1.19629E+00         1.60798E+00         1.19658E+00         3.21971E+00         1.00000E+00         1.89661E-06         3.21971E+00         7.69427E-01         2.45029E+00
+          1.90442E-02         2.22709E-02        -2.65934E-02         1.19629E+00         1.61865E+00         1.19658E+00         3.21266E+00         1.00000E+00         1.93357E-06         3.21266E+00         7.97820E-01         2.41484E+00
+          1.90442E-02         2.24407E-02        -2.68320E-02         1.19628E+00         1.62932E+00         1.19658E+00         3.20779E+00         1.00000E+00         1.97110E-06         3.20779E+00         8.25296E-01         2.38250E+00
+          1.90442E-02         2.26106E-02        -2.70724E-02         1.19628E+00         1.63999E+00         1.19658E+00         3.20511E+00         1.00000E+00         2.00921E-06         3.20511E+00         8.51725E-01         2.35338E+00
+          1.90442E-02         2.27804E-02        -2.73146E-02         1.19627E+00         1.65066E+00         1.19658E+00         3.20457E+00         1.00000E+00         2.04791E-06         3.20457E+00         8.76983E-01         2.32758E+00
+          1.90442E-02         2.29502E-02        -2.75586E-02         1.19627E+00         1.66133E+00         1.19658E+00         3.20613E+00         1.00000E+00         2.08721E-06         3.20613E+00         9.00959E-01         2.30517E+00
+          1.90442E-02         2.31201E-02        -2.78044E-02         1.19626E+00         1.67200E+00         1.19659E+00         3.20975E+00         1.00000E+00         2.12712E-06         3.20975E+00         9.23550E-01         2.28620E+00
+          1.90442E-02         2.32899E-02        -2.80520E-02         1.19626E+00         1.68267E+00         1.19659E+00         3.21535E+00         1.00000E+00         2.16764E-06         3.21535E+00         9.44665E-01         2.27068E+00
+          1.90442E-02         2.34597E-02        -2.83015E-02         1.19625E+00         1.69334E+00         1.19659E+00         3.22286E+00         1.00000E+00         2.20879E-06         3.22286E+00         9.64221E-01         2.25864E+00
+          1.90442E-02         2.36295E-02        -2.85527E-02         1.19625E+00         1.70401E+00         1.19659E+00         3.23220E+00         1.00000E+00         2.25057E-06         3.23220E+00         9.82149E-01         2.25005E+00
+          1.90442E-02         2.37994E-02        -2.88058E-02         1.19624E+00         1.71468E+00         1.19659E+00         3.24326E+00         1.00000E+00         2.29299E-06         3.24326E+00         9.98386E-01         2.24487E+00
+          1.90442E-02         2.39692E-02        -2.90607E-02         1.19624E+00         1.72535E+00         1.19659E+00         3.25593E+00         1.00000E+00         2.33605E-06         3.25593E+00         1.01288E+00         2.24305E+00
+          1.90442E-02         2.41390E-02        -2.93174E-02         1.19623E+00         1.73602E+00         1.19659E+00         3.27010E+00         1.00000E+00         2.37975E-06         3.27010E+00         1.02559E+00         2.24451E+00
+          1.90442E-02         2.43088E-02        -2.95759E-02         1.19623E+00         1.74669E+00         1.19659E+00         3.28565E+00         1.00000E+00         2.42411E-06         3.28565E+00         1.03649E+00         2.24916E+00
+          1.90442E-02         2.44787E-02        -2.98362E-02         1.19622E+00         1.75736E+00         1.19660E+00         3.30242E+00         1.00000E+00         2.46911E-06         3.30242E+00         1.04554E+00         2.25687E+00
+          1.90442E-02         2.46485E-02        -3.00984E-02         1.19622E+00         1.76804E+00         1.19660E+00         3.32027E+00         1.00000E+00         2.51476E-06         3.32027E+00         1.05274E+00         2.26753E+00
+          1.90442E-02         2.48183E-02        -3.03623E-02         1.19621E+00         1.77871E+00         1.19660E+00         3.33906E+00         1.00000E+00         2.56106E-06         3.33906E+00         1.05809E+00         2.28097E+00
+          1.90442E-02         2.49882E-02        -3.06281E-02         1.19621E+00         1.78938E+00         1.19660E+00         3.35862E+00         1.00000E+00         2.60800E-06         3.35862E+00         1.06158E+00         2.29704E+00
+          1.90442E-02         2.51580E-02        -3.08957E-02         1.19620E+00         1.80005E+00         1.19660E+00         3.37878E+00         1.00000E+00         2.65558E-06         3.37878E+00         1.06322E+00         2.31556E+00
+          1.90442E-02         2.53278E-02        -3.11650E-02         1.19620E+00         1.81072E+00         1.19660E+00         3.39937E+00         1.00000E+00         2.70379E-06         3.39937E+00         1.06304E+00         2.33633E+00
+          1.90442E-02         2.54976E-02        -3.14363E-02         1.19619E+00         1.82139E+00         1.19661E+00         3.42023E+00         1.00000E+00         2.75262E-06         3.42023E+00         1.06107E+00         2.35916E+00
+          1.90442E-02         2.56675E-02        -3.17093E-02         1.19619E+00         1.83206E+00         1.19661E+00         3.44115E+00         1.00000E+00         2.80207E-06         3.44115E+00         1.05732E+00         2.38383E+00
+          1.90442E-02         2.58373E-02        -3.19841E-02         1.19618E+00         1.84273E+00         1.19661E+00         3.46198E+00         1.00000E+00         2.85211E-06         3.46198E+00         1.05186E+00         2.41012E+00
+          1.90442E-02         2.60071E-02        -3.22608E-02         1.19618E+00         1.85340E+00         1.19661E+00         3.48251E+00         1.00000E+00         2.90275E-06         3.48251E+00         1.04471E+00         2.43780E+00
+          1.90442E-02         2.61769E-02        -3.25392E-02         1.19617E+00         1.86407E+00         1.19661E+00         3.50257E+00         1.00000E+00         2.95396E-06         3.50257E+00         1.03593E+00         2.46664E+00
+          1.92140E-02         8.72665E-04        -1.12403E-02         1.20725E+00         2.74155E-01         1.20730E+00         1.19033E+02         1.00000E+00         1.81647E-07         1.19033E+02         8.35781E+00         1.10675E+02
+          1.92140E-02         1.04249E-03        -1.12505E-02         1.20725E+00         2.84826E-01         1.20730E+00         1.16920E+02         1.00000E+00         1.81684E-07         1.16920E+02         8.46563E+00         1.08455E+02
+          1.92140E-02         1.21232E-03        -1.12625E-02         1.20725E+00         2.95496E-01         1.20730E+00         1.14764E+02         1.00000E+00         1.81741E-07         1.14764E+02         8.57280E+00         1.06191E+02
+          1.92140E-02         1.38215E-03        -1.12764E-02         1.20725E+00         3.06167E-01         1.20730E+00         1.12569E+02         1.00000E+00         1.81819E-07         1.12569E+02         8.67888E+00         1.03890E+02
+          1.92140E-02         1.55197E-03        -1.12920E-02         1.20725E+00         3.16838E-01         1.20730E+00         1.10337E+02         1.00000E+00         1.81923E-07         1.10337E+02         8.78344E+00         1.01554E+02
+          1.92140E-02         1.72180E-03        -1.13095E-02         1.20725E+00         3.27508E-01         1.20730E+00         1.08073E+02         1.00000E+00         1.82054E-07         1.08073E+02         8.88606E+00         9.91874E+01
+          1.92140E-02         1.89163E-03        -1.13288E-02         1.20725E+00         3.38179E-01         1.20730E+00         1.05781E+02         1.00000E+00         1.82216E-07         1.05781E+02         8.98630E+00         9.67948E+01
+          1.92140E-02         2.06146E-03        -1.13499E-02         1.20725E+00         3.48849E-01         1.20730E+00         1.03464E+02         1.00000E+00         1.82411E-07         1.03464E+02         9.08374E+00         9.43799E+01
+          1.92140E-02         2.23128E-03        -1.13727E-02         1.20725E+00         3.59520E-01         1.20730E+00         1.01125E+02         1.00000E+00         1.82644E-07         1.01125E+02         9.17798E+00         9.19469E+01
+          1.92140E-02         2.40111E-03        -1.13975E-02         1.20725E+00         3.70190E-01         1.20730E+00         9.87683E+01         1.00000E+00         1.82918E-07         9.87683E+01         9.26861E+00         8.94997E+01
+          1.92140E-02         2.57094E-03        -1.14240E-02         1.20725E+00         3.80861E-01         1.20730E+00         9.63975E+01         1.00000E+00         1.83236E-07         9.63975E+01         9.35524E+00         8.70423E+01
+          1.92140E-02         2.74077E-03        -1.14523E-02         1.20725E+00         3.91532E-01         1.20730E+00         9.40161E+01         1.00000E+00         1.83603E-07         9.40161E+01         9.43748E+00         8.45786E+01
+          1.92140E-02         2.91059E-03        -1.14825E-02         1.20725E+00         4.02202E-01         1.20730E+00         9.16274E+01         1.00000E+00         1.84022E-07         9.16274E+01         9.51497E+00         8.21125E+01
+          1.92140E-02         3.08042E-03        -1.15144E-02         1.20725E+00         4.12873E-01         1.20730E+00         8.92351E+01         1.00000E+00         1.84498E-07         8.92351E+01         9.58734E+00         7.96477E+01
+          1.92140E-02         3.25025E-03        -1.15482E-02         1.20725E+00         4.23543E-01         1.20730E+00         8.68423E+01         1.00000E+00         1.85035E-07         8.68423E+01         9.65426E+00         7.71881E+01
+          1.92140E-02         3.42008E-03        -1.15838E-02         1.20725E+00         4.34214E-01         1.20730E+00         8.44526E+01         1.00000E+00         1.85637E-07         8.44526E+01         9.71539E+00         7.47372E+01
+          1.92140E-02         3.58990E-03        -1.16212E-02         1.20724E+00         4.44884E-01         1.20730E+00         8.20690E+01         1.00000E+00         1.86310E-07         8.20690E+01         9.77044E+00         7.22985E+01
+          1.92140E-02         3.75973E-03        -1.16604E-02         1.20724E+00         4.55555E-01         1.20730E+00         7.96947E+01         1.00000E+00         1.87058E-07         7.96947E+01         9.81910E+00         6.98756E+01
+          1.92140E-02         3.92956E-03        -1.17014E-02         1.20724E+00         4.66225E-01         1.20730E+00         7.73329E+01         1.00000E+00         1.87886E-07         7.73329E+01         9.86111E+00         6.74718E+01
+          1.92140E-02         4.09939E-03        -1.17442E-02         1.20724E+00         4.76896E-01         1.20730E+00         7.49865E+01         1.00000E+00         1.88798E-07         7.49865E+01         9.89622E+00         6.50903E+01
+          1.92140E-02         4.26921E-03        -1.17889E-02         1.20724E+00         4.87567E-01         1.20730E+00         7.26583E+01         1.00000E+00         1.89800E-07         7.26583E+01         9.92419E+00         6.27342E+01
+          1.92140E-02         4.43904E-03        -1.18353E-02         1.20724E+00         4.98237E-01         1.20730E+00         7.03512E+01         1.00000E+00         1.90896E-07         7.03512E+01         9.94480E+00         6.04064E+01
+          1.92140E-02         4.60887E-03        -1.18836E-02         1.20724E+00         5.08908E-01         1.20730E+00         6.80678E+01         1.00000E+00         1.92091E-07         6.80678E+01         9.95788E+00         5.81099E+01
+          1.92140E-02         4.77869E-03        -1.19337E-02         1.20724E+00         5.19578E-01         1.20730E+00         6.58106E+01         1.00000E+00         1.93391E-07         6.58106E+01         9.96326E+00         5.58474E+01
+          1.92140E-02         4.94852E-03        -1.19855E-02         1.20724E+00         5.30249E-01         1.20730E+00         6.35822E+01         1.00000E+00         1.94800E-07         6.35822E+01         9.96079E+00         5.36214E+01
+          1.92140E-02         5.11835E-03        -1.20392E-02         1.20724E+00         5.40919E-01         1.20730E+00         6.13847E+01         1.00000E+00         1.96323E-07         6.13847E+01         9.95035E+00         5.14343E+01
+          1.92140E-02         5.28818E-03        -1.20948E-02         1.20724E+00         5.51590E-01         1.20730E+00         5.92204E+01         1.00000E+00         1.97964E-07         5.92204E+01         9.93185E+00         4.92885E+01
+          1.92140E-02         5.45800E-03        -1.21521E-02         1.20723E+00         5.62261E-01         1.20730E+00         5.70913E+01         1.00000E+00         1.99728E-07         5.70913E+01         9.90522E+00         4.71861E+01
+          1.92140E-02         5.62783E-03        -1.22112E-02         1.20723E+00         5.72931E-01         1.20730E+00         5.49994E+01         1.00000E+00         2.01619E-07         5.49994E+01         9.87040E+00         4.51290E+01
+          1.92140E-02         5.79766E-03        -1.22722E-02         1.20723E+00         5.83602E-01         1.20729E+00         5.29465E+01         1.00000E+00         2.03641E-07         5.29465E+01         9.82737E+00         4.31191E+01
+          1.92140E-02         5.96749E-03        -1.23349E-02         1.20723E+00         5.94272E-01         1.20729E+00         5.09342E+01         1.00000E+00         2.05799E-07         5.09342E+01         9.77614E+00         4.11581E+01
+          1.92140E-02         6.13731E-03        -1.23995E-02         1.20723E+00         6.04943E-01         1.20729E+00         4.89641E+01         1.00000E+00         2.08095E-07         4.89641E+01         9.71672E+00         3.92474E+01
+          1.92140E-02         6.30714E-03        -1.24659E-02         1.20723E+00         6.15613E-01         1.20729E+00         4.70375E+01         1.00000E+00         2.10533E-07         4.70375E+01         9.64917E+00         3.73883E+01
+          1.92140E-02         6.47697E-03        -1.25341E-02         1.20723E+00         6.26284E-01         1.20729E+00         4.51558E+01         1.00000E+00         2.13117E-07         4.51558E+01         9.57355E+00         3.55822E+01
+          1.92140E-02         6.64680E-03        -1.26041E-02         1.20723E+00         6.36955E-01         1.20729E+00         4.33200E+01         1.00000E+00         2.15848E-07         4.33200E+01         9.48997E+00         3.38300E+01
+          1.92140E-02         6.81662E-03        -1.26759E-02         1.20722E+00         6.47625E-01         1.20729E+00         4.15311E+01         1.00000E+00         2.18730E-07         4.15311E+01         9.39853E+00         3.21326E+01
+          1.92140E-02         6.98645E-03        -1.27495E-02         1.20722E+00         6.58296E-01         1.20729E+00         3.97901E+01         1.00000E+00         2.21765E-07         3.97901E+01         9.29938E+00         3.04907E+01
+          1.92140E-02         7.15628E-03        -1.28250E-02         1.20722E+00         6.68966E-01         1.20729E+00         3.80976E+01         1.00000E+00         2.24955E-07         3.80976E+01         9.19268E+00         2.89050E+01
+          1.92140E-02         7.32611E-03        -1.29022E-02         1.20722E+00         6.79637E-01         1.20729E+00         3.64543E+01         1.00000E+00         2.28301E-07         3.64543E+01         9.07860E+00         2.73757E+01
+          1.92140E-02         7.49593E-03        -1.29813E-02         1.20722E+00         6.90307E-01         1.20729E+00         3.48607E+01         1.00000E+00         2.31804E-07         3.48607E+01         8.95737E+00         2.59033E+01
+          1.92140E-02         7.66576E-03        -1.30622E-02         1.20722E+00         7.00978E-01         1.20729E+00         3.33170E+01         1.00000E+00         2.35466E-07         3.33170E+01         8.82919E+00         2.44878E+01
+          1.92140E-02         7.83559E-03        -1.31449E-02         1.20722E+00         7.11649E-01         1.20729E+00         3.18235E+01         1.00000E+00         2.39288E-07         3.18235E+01         8.69431E+00         2.31292E+01
+          1.92140E-02         8.00542E-03        -1.32294E-02         1.20721E+00         7.22319E-01         1.20729E+00         3.03803E+01         1.00000E+00         2.43270E-07         3.03803E+01         8.55299E+00         2.18274E+01
+          1.92140E-02         8.17524E-03        -1.33157E-02         1.20721E+00         7.32990E-01         1.20729E+00         2.89875E+01         1.00000E+00         2.47412E-07         2.89875E+01         8.40550E+00         2.05820E+01
+          1.92140E-02         8.34507E-03        -1.34038E-02         1.20721E+00         7.43660E-01         1.20729E+00         2.76450E+01         1.00000E+00         2.51715E-07         2.76450E+01         8.25213E+00         1.93928E+01
+          1.92140E-02         8.51490E-03        -1.34938E-02         1.20721E+00         7.54331E-01         1.20728E+00         2.63524E+01         1.00000E+00         2.56178E-07         2.63524E+01         8.09320E+00         1.82592E+01
+          1.92140E-02         8.68473E-03        -1.35855E-02         1.20721E+00         7.65001E-01         1.20728E+00         2.51095E+01         1.00000E+00         2.60801E-07         2.51095E+01         7.92903E+00         1.71805E+01
+          1.92140E-02         8.85455E-03        -1.36791E-02         1.20721E+00         7.75672E-01         1.20728E+00         2.39158E+01         1.00000E+00         2.65585E-07         2.39158E+01         7.75994E+00         1.61559E+01
+          1.92140E-02         9.02438E-03        -1.37744E-02         1.20720E+00         7.86343E-01         1.20728E+00         2.27709E+01         1.00000E+00         2.70528E-07         2.27709E+01         7.58628E+00         1.51847E+01
+          1.92140E-02         9.19421E-03        -1.38716E-02         1.20720E+00         7.97013E-01         1.20728E+00         2.16742E+01         1.00000E+00         2.75631E-07         2.16742E+01         7.40841E+00         1.42658E+01
+          1.92140E-02         9.36403E-03        -1.39706E-02         1.20720E+00         8.07684E-01         1.20728E+00         2.06249E+01         1.00000E+00         2.80894E-07         2.06249E+01         7.22669E+00         1.33982E+01
+          1.92140E-02         9.53386E-03        -1.40714E-02         1.20720E+00         8.18354E-01         1.20728E+00         1.96223E+01         1.00000E+00         2.86315E-07         1.96223E+01         7.04149E+00         1.25808E+01
+          1.92140E-02         9.70369E-03        -1.41741E-02         1.20720E+00         8.29025E-01         1.20728E+00         1.86655E+01         1.00000E+00         2.91895E-07         1.86655E+01         6.85319E+00         1.18123E+01
+          1.92140E-02         9.87352E-03        -1.42785E-02         1.20719E+00         8.39695E-01         1.20728E+00         1.77536E+01         1.00000E+00         2.97635E-07         1.77536E+01         6.66218E+00         1.10915E+01
+          1.92140E-02         1.00433E-02        -1.43848E-02         1.20719E+00         8.50366E-01         1.20728E+00         1.68857E+01         1.00000E+00         3.03534E-07         1.68857E+01         6.46884E+00         1.04169E+01
+          1.92140E-02         1.02132E-02        -1.44928E-02         1.20719E+00         8.61037E-01         1.20728E+00         1.60608E+01         1.00000E+00         3.09593E-07         1.60608E+01         6.27356E+00         9.78721E+00
+          1.92140E-02         1.03830E-02        -1.46027E-02         1.20719E+00         8.71707E-01         1.20728E+00         1.52776E+01         1.00000E+00         3.15812E-07         1.52776E+01         6.07674E+00         9.20088E+00
+          1.92140E-02         1.05528E-02        -1.47144E-02         1.20719E+00         8.82378E-01         1.20728E+00         1.45352E+01         1.00000E+00         3.22194E-07         1.45352E+01         5.87877E+00         8.65640E+00
+          1.92140E-02         1.07227E-02        -1.48279E-02         1.20718E+00         8.93048E-01         1.20727E+00         1.38322E+01         1.00000E+00         3.28739E-07         1.38322E+01         5.68004E+00         8.15219E+00
+          1.92140E-02         1.08925E-02        -1.49432E-02         1.20718E+00         9.03719E-01         1.20727E+00         1.31676E+01         1.00000E+00         3.35450E-07         1.31676E+01         5.48093E+00         7.68666E+00
+          1.92140E-02         1.10623E-02        -1.50603E-02         1.20718E+00         9.14389E-01         1.20727E+00         1.25400E+01         1.00000E+00         3.42328E-07         1.25400E+01         5.28184E+00         7.25817E+00
+          1.92140E-02         1.12321E-02        -1.51792E-02         1.20718E+00         9.25060E-01         1.20727E+00         1.19482E+01         1.00000E+00         3.49377E-07         1.19482E+01         5.08314E+00         6.86505E+00
+          1.92140E-02         1.14020E-02        -1.53000E-02         1.20717E+00         9.35731E-01         1.20727E+00         1.13909E+01         1.00000E+00         3.56601E-07         1.13909E+01         4.88521E+00         6.50565E+00
+          1.92140E-02         1.15718E-02        -1.54225E-02         1.20717E+00         9.46401E-01         1.20727E+00         1.08667E+01         1.00000E+00         3.64002E-07         1.08667E+01         4.68842E+00         6.17828E+00
+          1.92140E-02         1.17416E-02        -1.55469E-02         1.20717E+00         9.57072E-01         1.20727E+00         1.03744E+01         1.00000E+00         3.71586E-07         1.03744E+01         4.49313E+00         5.88125E+00
+          1.92140E-02         1.19114E-02        -1.56731E-02         1.20717E+00         9.67742E-01         1.20727E+00         9.91255E+00         1.00000E+00         3.79358E-07         9.91255E+00         4.29968E+00         5.61287E+00
+          1.92140E-02         1.20813E-02        -1.58011E-02         1.20716E+00         9.78413E-01         1.20727E+00         9.47990E+00         1.00000E+00         3.87323E-07         9.47990E+00         4.10842E+00         5.37147E+00
+          1.92140E-02         1.22511E-02        -1.59309E-02         1.20716E+00         9.89083E-01         1.20727E+00         9.07508E+00         1.00000E+00         3.95487E-07         9.07508E+00         3.91969E+00         5.15539E+00
+          1.92140E-02         1.24209E-02        -1.60625E-02         1.20716E+00         9.99754E-01         1.20727E+00         8.69676E+00         1.00000E+00         4.03857E-07         8.69676E+00         3.73379E+00         4.96297E+00
+          1.92140E-02         1.25908E-02        -1.61959E-02         1.20716E+00         1.01042E+00         1.20727E+00         8.34364E+00         1.00000E+00         4.12441E-07         8.34364E+00         3.55103E+00         4.79260E+00
+          1.92140E-02         1.27606E-02        -1.63312E-02         1.20715E+00         1.02110E+00         1.20726E+00         8.01439E+00         1.00000E+00         4.21245E-07         8.01439E+00         3.37171E+00         4.64267E+00
+          1.92140E-02         1.29304E-02        -1.64682E-02         1.20715E+00         1.03177E+00         1.20726E+00         7.70773E+00         1.00000E+00         4.30277E-07         7.70773E+00         3.19610E+00         4.51163E+00
+          1.92140E-02         1.31002E-02        -1.66071E-02         1.20715E+00         1.04244E+00         1.20726E+00         7.42240E+00         1.00000E+00         4.39548E-07         7.42240E+00         3.02447E+00         4.39793E+00
+          1.92140E-02         1.32701E-02        -1.67478E-02         1.20715E+00         1.05311E+00         1.20726E+00         7.15714E+00         1.00000E+00         4.49064E-07         7.15714E+00         2.85706E+00         4.30009E+00
+          1.92140E-02         1.34399E-02        -1.68903E-02         1.20714E+00         1.06378E+00         1.20726E+00         6.91076E+00         1.00000E+00         4.58835E-07         6.91076E+00         2.69410E+00         4.21666E+00
+          1.92140E-02         1.36097E-02        -1.70346E-02         1.20714E+00         1.07445E+00         1.20726E+00         6.68205E+00         1.00000E+00         4.68871E-07         6.68205E+00         2.53581E+00         4.14625E+00
+          1.92140E-02         1.37795E-02        -1.71807E-02         1.20714E+00         1.08512E+00         1.20726E+00         6.46987E+00         1.00000E+00         4.79181E-07         6.46987E+00         2.38238E+00         4.08749E+00
+          1.92140E-02         1.39494E-02        -1.73286E-02         1.20714E+00         1.09579E+00         1.20726E+00         6.27310E+00         1.00000E+00         4.89774E-07         6.27310E+00         2.23400E+00         4.03910E+00
+          1.92140E-02         1.41192E-02        -1.74783E-02         1.20713E+00         1.10646E+00         1.20726E+00         6.09065E+00         1.00000E+00         5.00659E-07         6.09065E+00         2.09083E+00         3.99982E+00
+          1.92140E-02         1.42890E-02        -1.76299E-02         1.20713E+00         1.11713E+00         1.20726E+00         5.92148E+00         1.00000E+00         5.11847E-07         5.92148E+00         1.95301E+00         3.96847E+00
+          1.92140E-02         1.44589E-02        -1.77833E-02         1.20713E+00         1.12780E+00         1.20726E+00         5.76460E+00         1.00000E+00         5.23346E-07         5.76460E+00         1.82067E+00         3.94393E+00
+          1.92140E-02         1.46287E-02        -1.79384E-02         1.20712E+00         1.13847E+00         1.20726E+00         5.61903E+00         1.00000E+00         5.35164E-07         5.61903E+00         1.69392E+00         3.92511E+00
+          1.92140E-02         1.47985E-02        -1.80954E-02         1.20712E+00         1.14914E+00         1.20726E+00         5.48387E+00         1.00000E+00         5.47310E-07         5.48387E+00         1.57285E+00         3.91102E+00
+          1.92140E-02         1.49683E-02        -1.82542E-02         1.20712E+00         1.15981E+00         1.20726E+00         5.35823E+00         1.00000E+00         5.59792E-07         5.35823E+00         1.45753E+00         3.90070E+00
+          1.92140E-02         1.51382E-02        -1.84149E-02         1.20711E+00         1.17048E+00         1.20725E+00         5.24130E+00         1.00000E+00         5.72617E-07         5.24130E+00         1.34802E+00         3.89328E+00
+          1.92140E-02         1.53080E-02        -1.85773E-02         1.20711E+00         1.18115E+00         1.20725E+00         5.13228E+00         1.00000E+00         5.85791E-07         5.13228E+00         1.24436E+00         3.88793E+00
+          1.92140E-02         1.54778E-02        -1.87415E-02         1.20711E+00         1.19182E+00         1.20725E+00         5.03045E+00         1.00000E+00         5.99320E-07         5.03045E+00         1.14656E+00         3.88389E+00
+          1.92140E-02         1.56476E-02        -1.89076E-02         1.20710E+00         1.20249E+00         1.20725E+00         4.93511E+00         1.00000E+00         6.13209E-07         4.93511E+00         1.05463E+00         3.88048E+00
+          1.92140E-02         1.58175E-02        -1.90754E-02         1.20710E+00         1.21317E+00         1.20725E+00         4.84561E+00         1.00000E+00         6.27462E-07         4.84561E+00         9.68553E-01         3.87705E+00
+          1.92140E-02         1.59873E-02        -1.92451E-02         1.20710E+00         1.22384E+00         1.20725E+00         4.76135E+00         1.00000E+00         6.42082E-07         4.76135E+00         8.88301E-01         3.87305E+00
+          1.92140E-02         1.61571E-02        -1.94166E-02         1.20710E+00         1.23451E+00         1.20725E+00         4.68178E+00         1.00000E+00         6.57073E-07         4.68178E+00         8.13825E-01         3.86795E+00
+          1.92140E-02         1.63270E-02        -1.95899E-02         1.20709E+00         1.24518E+00         1.20725E+00         4.60638E+00         1.00000E+00         6.72434E-07         4.60638E+00         7.45065E-01         3.86132E+00
+          1.92140E-02         1.64968E-02        -1.97650E-02         1.20709E+00         1.25585E+00         1.20725E+00         4.53470E+00         1.00000E+00         6.88166E-07         4.53470E+00         6.81943E-01         3.85276E+00
+          1.92140E-02         1.66666E-02        -1.99420E-02         1.20709E+00         1.26652E+00         1.20725E+00         4.46630E+00         1.00000E+00         7.04270E-07         4.46630E+00         6.24368E-01         3.84193E+00
+          1.92140E-02         1.68364E-02        -2.01207E-02         1.20708E+00         1.27719E+00         1.20725E+00         4.40080E+00         1.00000E+00         7.20743E-07         4.40080E+00         5.72237E-01         3.82856E+00
+          1.92140E-02         1.70063E-02        -2.03012E-02         1.20708E+00         1.28786E+00         1.20725E+00         4.33785E+00         1.00000E+00         7.37583E-07         4.33785E+00         5.25430E-01         3.81242E+00
+          1.92140E-02         1.71761E-02        -2.04836E-02         1.20707E+00         1.29853E+00         1.20725E+00         4.27716E+00         1.00000E+00         7.54787E-07         4.27716E+00         4.83818E-01         3.79335E+00
+          1.92140E-02         1.73459E-02        -2.06678E-02         1.20707E+00         1.30920E+00         1.20725E+00         4.21846E+00         1.00000E+00         7.72352E-07         4.21846E+00         4.47259E-01         3.77120E+00
+          1.92140E-02         1.75158E-02        -2.08538E-02         1.20707E+00         1.31987E+00         1.20725E+00         4.16150E+00         1.00000E+00         7.90274E-07         4.16150E+00         4.15601E-01         3.74590E+00
+          1.92140E-02         1.76856E-02        -2.10416E-02         1.20706E+00         1.33054E+00         1.20725E+00         4.10611E+00         1.00000E+00         8.08547E-07         4.10611E+00         3.88681E-01         3.71743E+00
+          1.92140E-02         1.78554E-02        -2.12312E-02         1.20706E+00         1.34121E+00         1.20725E+00         4.05210E+00         1.00000E+00         8.27165E-07         4.05210E+00         3.66328E-01         3.68578E+00
+          1.92140E-02         1.80252E-02        -2.14226E-02         1.20706E+00         1.35188E+00         1.20725E+00         3.99936E+00         1.00000E+00         8.46125E-07         3.99936E+00         3.48361E-01         3.65100E+00
+          1.92140E-02         1.81951E-02        -2.16159E-02         1.20705E+00         1.36255E+00         1.20725E+00         3.94776E+00         1.00000E+00         8.65419E-07         3.94776E+00         3.34592E-01         3.61317E+00
+          1.92140E-02         1.83649E-02        -2.18109E-02         1.20705E+00         1.37322E+00         1.20725E+00         3.89724E+00         1.00000E+00         8.85042E-07         3.89724E+00         3.24826E-01         3.57241E+00
+          1.92140E-02         1.85347E-02        -2.20078E-02         1.20705E+00         1.38389E+00         1.20725E+00         3.84773E+00         1.00000E+00         9.04989E-07         3.84773E+00         3.18864E-01         3.52887E+00
+          1.92140E-02         1.87045E-02        -2.22065E-02         1.20704E+00         1.39457E+00         1.20725E+00         3.79922E+00         1.00000E+00         9.25253E-07         3.79922E+00         3.16500E-01         3.48272E+00
+          1.92140E-02         1.88744E-02        -2.24070E-02         1.20704E+00         1.40524E+00         1.20725E+00         3.75167E+00         1.00000E+00         9.45830E-07         3.75167E+00         3.17524E-01         3.43415E+00
+          1.92140E-02         1.90442E-02        -2.26093E-02         1.20703E+00         1.41591E+00         1.20725E+00         3.70512E+00         1.00000E+00         9.66716E-07         3.70512E+00         3.21722E-01         3.38339E+00
+          1.92140E-02         1.92140E-02        -2.28134E-02         1.20703E+00         1.42658E+00         1.20725E+00         3.65957E+00         1.00000E+00         9.87905E-07         3.65957E+00         3.28880E-01         3.33069E+00
+          1.92140E-02         1.93839E-02        -2.30193E-02         1.20703E+00         1.43725E+00         1.20725E+00         3.61507E+00         1.00000E+00         1.00940E-06         3.61507E+00         3.38778E-01         3.27629E+00
+          1.92140E-02         1.95537E-02        -2.32271E-02         1.20702E+00         1.44792E+00         1.20725E+00         3.57167E+00         1.00000E+00         1.03119E-06         3.57167E+00         3.51200E-01         3.22047E+00
+          1.92140E-02         1.97235E-02        -2.34366E-02         1.20702E+00         1.45859E+00         1.20725E+00         3.52943E+00         1.00000E+00         1.05327E-06         3.52943E+00         3.65926E-01         3.16350E+00
+          1.92140E-02         1.98933E-02        -2.36480E-02         1.20701E+00         1.46926E+00         1.20725E+00         3.48843E+00         1.00000E+00         1.07566E-06         3.48843E+00         3.82739E-01         3.10569E+00
+          1.92140E-02         2.00632E-02        -2.38612E-02         1.20701E+00         1.47993E+00         1.20725E+00         3.44874E+00         1.00000E+00         1.09835E-06         3.44874E+00         4.01421E-01         3.04732E+00
+          1.92140E-02         2.02330E-02        -2.40762E-02         1.20701E+00         1.49060E+00         1.20725E+00         3.41044E+00         1.00000E+00         1.12134E-06         3.41044E+00         4.21759E-01         2.98869E+00
+          1.92140E-02         2.04028E-02        -2.42930E-02         1.20700E+00         1.50127E+00         1.20725E+00         3.37364E+00         1.00000E+00         1.14463E-06         3.37364E+00         4.43540E-01         2.93010E+00
+          1.92140E-02         2.05726E-02        -2.45116E-02         1.20700E+00         1.51194E+00         1.20725E+00         3.33840E+00         1.00000E+00         1.16824E-06         3.33840E+00         4.66556E-01         2.87185E+00
+          1.92140E-02         2.07425E-02        -2.47320E-02         1.20699E+00         1.52261E+00         1.20725E+00         3.30483E+00         1.00000E+00         1.19216E-06         3.30483E+00         4.90604E-01         2.81423E+00
+          1.92140E-02         2.09123E-02        -2.49543E-02         1.20699E+00         1.53328E+00         1.20725E+00         3.27301E+00         1.00000E+00         1.21642E-06         3.27301E+00         5.15483E-01         2.75753E+00
+          1.92140E-02         2.10821E-02        -2.51783E-02         1.20698E+00         1.54395E+00         1.20725E+00         3.24303E+00         1.00000E+00         1.24101E-06         3.24303E+00         5.41000E-01         2.70203E+00
+          1.92140E-02         2.12520E-02        -2.54042E-02         1.20698E+00         1.55462E+00         1.20725E+00         3.21496E+00         1.00000E+00         1.26595E-06         3.21496E+00         5.66965E-01         2.64799E+00
+          1.92140E-02         2.14218E-02        -2.56319E-02         1.20698E+00         1.56529E+00         1.20725E+00         3.18888E+00         1.00000E+00         1.29126E-06         3.18888E+00         5.93197E-01         2.59569E+00
+          1.92140E-02         2.15916E-02        -2.58614E-02         1.20697E+00         1.57596E+00         1.20725E+00         3.16487E+00         1.00000E+00         1.31694E-06         3.16487E+00         6.19520E-01         2.54535E+00
+          1.92140E-02         2.17614E-02        -2.60927E-02         1.20697E+00         1.58664E+00         1.20725E+00         3.14298E+00         1.00000E+00         1.34301E-06         3.14298E+00         6.45767E-01         2.49722E+00
+          1.92140E-02         2.19313E-02        -2.63258E-02         1.20696E+00         1.59731E+00         1.20725E+00         3.12327E+00         1.00000E+00         1.36949E-06         3.12327E+00         6.71775E-01         2.45150E+00
+          1.92140E-02         2.21011E-02        -2.65608E-02         1.20696E+00         1.60798E+00         1.20725E+00         3.10578E+00         1.00000E+00         1.39640E-06         3.10578E+00         6.97393E-01         2.40839E+00
+          1.92140E-02         2.22709E-02        -2.67975E-02         1.20695E+00         1.61865E+00         1.20725E+00         3.09055E+00         1.00000E+00         1.42375E-06         3.09055E+00         7.22475E-01         2.36807E+00
+          1.92140E-02         2.24407E-02        -2.70361E-02         1.20695E+00         1.62932E+00         1.20725E+00         3.07759E+00         1.00000E+00         1.45157E-06         3.07759E+00         7.46886E-01         2.33070E+00
+          1.92140E-02         2.26106E-02        -2.72765E-02         1.20694E+00         1.63999E+00         1.20725E+00         3.06692E+00         1.00000E+00         1.47986E-06         3.06692E+00         7.70498E-01         2.29642E+00
+          1.92140E-02         2.27804E-02        -2.75187E-02         1.20694E+00         1.65066E+00         1.20725E+00         3.05854E+00         1.00000E+00         1.50866E-06         3.05854E+00         7.93191E-01         2.26535E+00
+          1.92140E-02         2.29502E-02        -2.77627E-02         1.20693E+00         1.66133E+00         1.20725E+00         3.05244E+00         1.00000E+00         1.53797E-06         3.05244E+00         8.14857E-01         2.23759E+00
+          1.92140E-02         2.31201E-02        -2.80085E-02         1.20693E+00         1.67200E+00         1.20726E+00         3.04860E+00         1.00000E+00         1.56781E-06         3.04860E+00         8.35393E-01         2.21320E+00
+          1.92140E-02         2.32899E-02        -2.82561E-02         1.20693E+00         1.68267E+00         1.20726E+00         3.04697E+00         1.00000E+00         1.59821E-06         3.04697E+00         8.54710E-01         2.19226E+00
+          1.92140E-02         2.34597E-02        -2.85056E-02         1.20692E+00         1.69334E+00         1.20726E+00         3.04751E+00         1.00000E+00         1.62917E-06         3.04751E+00         8.72723E-01         2.17479E+00
+          1.92140E-02         2.36295E-02        -2.87568E-02         1.20692E+00         1.70401E+00         1.20726E+00         3.05017E+00         1.00000E+00         1.66071E-06         3.05017E+00         8.89360E-01         2.16081E+00
+          1.92140E-02         2.37994E-02        -2.90099E-02         1.20691E+00         1.71468E+00         1.20726E+00         3.05486E+00         1.00000E+00         1.69284E-06         3.05486E+00         9.04557E-01         2.15030E+00
+          1.92140E-02         2.39692E-02        -2.92648E-02         1.20691E+00         1.72535E+00         1.20726E+00         3.06150E+00         1.00000E+00         1.72558E-06         3.06150E+00         9.18257E-01         2.14325E+00
+          1.92140E-02         2.41390E-02        -2.95215E-02         1.20690E+00         1.73602E+00         1.20726E+00         3.07000E+00         1.00000E+00         1.75893E-06         3.07000E+00         9.30414E-01         2.13959E+00
+          1.92140E-02         2.43088E-02        -2.97800E-02         1.20690E+00         1.74669E+00         1.20726E+00         3.08025E+00         1.00000E+00         1.79289E-06         3.08025E+00         9.40991E-01         2.13926E+00
+          1.92140E-02         2.44787E-02        -3.00403E-02         1.20689E+00         1.75736E+00         1.20726E+00         3.09214E+00         1.00000E+00         1.82748E-06         3.09214E+00         9.49958E-01         2.14218E+00
+          1.92140E-02         2.46485E-02        -3.03024E-02         1.20689E+00         1.76804E+00         1.20727E+00         3.10553E+00         1.00000E+00         1.86269E-06         3.10553E+00         9.57294E-01         2.14824E+00
+          1.92140E-02         2.48183E-02        -3.05664E-02         1.20688E+00         1.77871E+00         1.20727E+00         3.12029E+00         1.00000E+00         1.89851E-06         3.12029E+00         9.62987E-01         2.15730E+00
+          1.92140E-02         2.49882E-02        -3.08322E-02         1.20688E+00         1.78938E+00         1.20727E+00         3.13628E+00         1.00000E+00         1.93496E-06         3.13628E+00         9.67030E-01         2.16925E+00
+          1.92140E-02         2.51580E-02        -3.10997E-02         1.20687E+00         1.80005E+00         1.20727E+00         3.15333E+00         1.00000E+00         1.97201E-06         3.15333E+00         9.69428E-01         2.18391E+00
+          1.92140E-02         2.53278E-02        -3.13691E-02         1.20687E+00         1.81072E+00         1.20727E+00         3.17130E+00         1.00000E+00         2.00965E-06         3.17130E+00         9.70188E-01         2.20112E+00
+          1.92140E-02         2.54976E-02        -3.16403E-02         1.20686E+00         1.82139E+00         1.20727E+00         3.19002E+00         1.00000E+00         2.04788E-06         3.19002E+00         9.69329E-01         2.22069E+00
+          1.92140E-02         2.56675E-02        -3.19134E-02         1.20686E+00         1.83206E+00         1.20728E+00         3.20931E+00         1.00000E+00         2.08668E-06         3.20931E+00         9.66873E-01         2.24244E+00
+          1.92140E-02         2.58373E-02        -3.21882E-02         1.20685E+00         1.84273E+00         1.20728E+00         3.22900E+00         1.00000E+00         2.12603E-06         3.22900E+00         9.62850E-01         2.26615E+00
+          1.92140E-02         2.60071E-02        -3.24648E-02         1.20684E+00         1.85340E+00         1.20728E+00         3.24891E+00         1.00000E+00         2.16591E-06         3.24891E+00         9.57295E-01         2.29161E+00
+          1.92140E-02         2.61769E-02        -3.27433E-02         1.20684E+00         1.86407E+00         1.20728E+00         3.26885E+00         1.00000E+00         2.20630E-06         3.26885E+00         9.50249E-01         2.31860E+00
+          1.93839E-02         8.72665E-04        -1.14463E-02         1.21792E+00         2.74155E-01         1.21798E+00         1.15980E+02         1.00000E+00         1.26110E-07         1.15980E+02         6.64249E+00         1.09337E+02
+          1.93839E-02         1.04249E-03        -1.14565E-02         1.21792E+00         2.84826E-01         1.21798E+00         1.13915E+02         1.00000E+00         1.26121E-07         1.13915E+02         6.75783E+00         1.07157E+02
+          1.93839E-02         1.21232E-03        -1.14685E-02         1.21792E+00         2.95496E-01         1.21798E+00         1.11808E+02         1.00000E+00         1.26142E-07         1.11808E+02         6.87306E+00         1.04935E+02
+          1.93839E-02         1.38215E-03        -1.14823E-02         1.21792E+00         3.06167E-01         1.21798E+00         1.09663E+02         1.00000E+00         1.26176E-07         1.09663E+02         6.98779E+00         1.02675E+02
+          1.93839E-02         1.55197E-03        -1.14980E-02         1.21792E+00         3.16838E-01         1.21798E+00         1.07483E+02         1.00000E+00         1.26224E-07         1.07483E+02         7.10159E+00         1.00381E+02
+          1.93839E-02         1.72180E-03        -1.15155E-02         1.21792E+00         3.27508E-01         1.21798E+00         1.05271E+02         1.00000E+00         1.26288E-07         1.05271E+02         7.21405E+00         9.80570E+01
+          1.93839E-02         1.89163E-03        -1.15347E-02         1.21792E+00         3.38179E-01         1.21798E+00         1.03031E+02         1.00000E+00         1.26371E-07         1.03031E+02         7.32477E+00         9.57064E+01
+          1.93839E-02         2.06146E-03        -1.15558E-02         1.21792E+00         3.48849E-01         1.21798E+00         1.00767E+02         1.00000E+00         1.26476E-07         1.00767E+02         7.43335E+00         9.33336E+01
+          1.93839E-02         2.23128E-03        -1.15787E-02         1.21792E+00         3.59520E-01         1.21798E+00         9.84819E+01         1.00000E+00         1.26604E-07         9.84819E+01         7.53939E+00         9.09425E+01
+          1.93839E-02         2.40111E-03        -1.16034E-02         1.21792E+00         3.70190E-01         1.21798E+00         9.61794E+01         1.00000E+00         1.26761E-07         9.61794E+01         7.64250E+00         8.85369E+01
+          1.93839E-02         2.57094E-03        -1.16300E-02         1.21792E+00         3.80861E-01         1.21797E+00         9.38631E+01         1.00000E+00         1.26947E-07         9.38631E+01         7.74230E+00         8.61208E+01
+          1.93839E-02         2.74077E-03        -1.16583E-02         1.21792E+00         3.91532E-01         1.21797E+00         9.15364E+01         1.00000E+00         1.27168E-07         9.15364E+01         7.83841E+00         8.36980E+01
+          1.93839E-02         2.91059E-03        -1.16884E-02         1.21792E+00         4.02202E-01         1.21797E+00         8.92027E+01         1.00000E+00         1.27426E-07         8.92027E+01         7.93048E+00         8.12722E+01
+          1.93839E-02         3.08042E-03        -1.17204E-02         1.21792E+00         4.12873E-01         1.21797E+00         8.68654E+01         1.00000E+00         1.27725E-07         8.68654E+01         8.01815E+00         7.88472E+01
+          1.93839E-02         3.25025E-03        -1.17542E-02         1.21792E+00         4.23543E-01         1.21797E+00         8.45278E+01         1.00000E+00         1.28069E-07         8.45278E+01         8.10109E+00         7.64267E+01
+          1.93839E-02         3.42008E-03        -1.17897E-02         1.21792E+00         4.34214E-01         1.21797E+00         8.21931E+01         1.00000E+00         1.28462E-07         8.21931E+01         8.17898E+00         7.40141E+01
+          1.93839E-02         3.58990E-03        -1.18271E-02         1.21792E+00         4.44884E-01         1.21797E+00         7.98645E+01         1.00000E+00         1.28909E-07         7.98645E+01         8.25151E+00         7.16130E+01
+          1.93839E-02         3.75973E-03        -1.18663E-02         1.21791E+00         4.55555E-01         1.21797E+00         7.75452E+01         1.00000E+00         1.29412E-07         7.75452E+01         8.31839E+00         6.92268E+01
+          1.93839E-02         3.92956E-03        -1.19074E-02         1.21791E+00         4.66225E-01         1.21797E+00         7.52380E+01         1.00000E+00         1.29978E-07         7.52380E+01         8.37934E+00         6.68587E+01
+          1.93839E-02         4.09939E-03        -1.19502E-02         1.21791E+00         4.76896E-01         1.21797E+00         7.29460E+01         1.00000E+00         1.30610E-07         7.29460E+01         8.43412E+00         6.45119E+01
+          1.93839E-02         4.26921E-03        -1.19948E-02         1.21791E+00         4.87567E-01         1.21797E+00         7.06719E+01         1.00000E+00         1.31312E-07         7.06719E+01         8.48247E+00         6.21894E+01
+          1.93839E-02         4.43904E-03        -1.20413E-02         1.21791E+00         4.98237E-01         1.21797E+00         6.84184E+01         1.00000E+00         1.32089E-07         6.84184E+01         8.52418E+00         5.98943E+01
+          1.93839E-02         4.60887E-03        -1.20895E-02         1.21791E+00         5.08908E-01         1.21797E+00         6.61883E+01         1.00000E+00         1.32945E-07         6.61883E+01         8.55905E+00         5.76292E+01
+          1.93839E-02         4.77869E-03        -1.21396E-02         1.21791E+00         5.19578E-01         1.21797E+00         6.39839E+01         1.00000E+00         1.33885E-07         6.39839E+01         8.58691E+00         5.53970E+01
+          1.93839E-02         4.94852E-03        -1.21915E-02         1.21791E+00         5.30249E-01         1.21797E+00         6.18076E+01         1.00000E+00         1.34913E-07         6.18076E+01         8.60759E+00         5.32000E+01
+          1.93839E-02         5.11835E-03        -1.22452E-02         1.21791E+00         5.40919E-01         1.21797E+00         5.96618E+01         1.00000E+00         1.36032E-07         5.96618E+01         8.62096E+00         5.10408E+01
+          1.93839E-02         5.28818E-03        -1.23007E-02         1.21791E+00         5.51590E-01         1.21797E+00         5.75485E+01         1.00000E+00         1.37247E-07         5.75485E+01         8.62690E+00         4.89216E+01
+          1.93839E-02         5.45800E-03        -1.23580E-02         1.21791E+00         5.62261E-01         1.21797E+00         5.54698E+01         1.00000E+00         1.38561E-07         5.54698E+01         8.62532E+00         4.68445E+01
+          1.93839E-02         5.62783E-03        -1.24172E-02         1.21790E+00         5.72931E-01         1.21797E+00         5.34276E+01         1.00000E+00         1.39977E-07         5.34276E+01         8.61615E+00         4.48114E+01
+          1.93839E-02         5.79766E-03        -1.24781E-02         1.21790E+00         5.83602E-01         1.21797E+00         5.14236E+01         1.00000E+00         1.41499E-07         5.14236E+01         8.59934E+00         4.28242E+01
+          1.93839E-02         5.96749E-03        -1.25409E-02         1.21790E+00         5.94272E-01         1.21797E+00         4.94595E+01         1.00000E+00         1.43129E-07         4.94595E+01         8.57486E+00         4.08846E+01
+          1.93839E-02         6.13731E-03        -1.26055E-02         1.21790E+00         6.04943E-01         1.21797E+00         4.75367E+01         1.00000E+00         1.44870E-07         4.75367E+01         8.54271E+00         3.89940E+01
+          1.93839E-02         6.30714E-03        -1.26718E-02         1.21790E+00         6.15613E-01         1.21797E+00         4.56568E+01         1.00000E+00         1.46725E-07         4.56568E+01         8.50290E+00         3.71539E+01
+          1.93839E-02         6.47697E-03        -1.27400E-02         1.21790E+00         6.26284E-01         1.21796E+00         4.38208E+01         1.00000E+00         1.48694E-07         4.38208E+01         8.45548E+00         3.53653E+01
+          1.93839E-02         6.64680E-03        -1.28100E-02         1.21790E+00         6.36955E-01         1.21796E+00         4.20299E+01         1.00000E+00         1.50779E-07         4.20299E+01         8.40051E+00         3.36294E+01
+          1.93839E-02         6.81662E-03        -1.28819E-02         1.21790E+00         6.47625E-01         1.21796E+00         4.02852E+01         1.00000E+00         1.52981E-07         4.02852E+01         8.33806E+00         3.19471E+01
+          1.93839E-02         6.98645E-03        -1.29555E-02         1.21789E+00         6.58296E-01         1.21796E+00         3.85873E+01         1.00000E+00         1.55302E-07         3.85873E+01         8.26824E+00         3.03191E+01
+          1.93839E-02         7.15628E-03        -1.30309E-02         1.21789E+00         6.68966E-01         1.21796E+00         3.69372E+01         1.00000E+00         1.57741E-07         3.69372E+01         8.19119E+00         2.87460E+01
+          1.93839E-02         7.32611E-03        -1.31082E-02         1.21789E+00         6.79637E-01         1.21796E+00         3.53353E+01         1.00000E+00         1.60299E-07         3.53353E+01         8.10702E+00         2.72282E+01
+          1.93839E-02         7.49593E-03        -1.31873E-02         1.21789E+00         6.90307E-01         1.21796E+00         3.37821E+01         1.00000E+00         1.62975E-07         3.37821E+01         8.01593E+00         2.57662E+01
+          1.93839E-02         7.66576E-03        -1.32681E-02         1.21789E+00         7.00978E-01         1.21796E+00         3.22780E+01         1.00000E+00         1.65768E-07         3.22780E+01         7.91807E+00         2.43600E+01
+          1.93839E-02         7.83559E-03        -1.33508E-02         1.21789E+00         7.11649E-01         1.21796E+00         3.08233E+01         1.00000E+00         1.68679E-07         3.08233E+01         7.81366E+00         2.30096E+01
+          1.93839E-02         8.00542E-03        -1.34353E-02         1.21788E+00         7.22319E-01         1.21796E+00         2.94179E+01         1.00000E+00         1.71705E-07         2.94179E+01         7.70291E+00         2.17150E+01
+          1.93839E-02         8.17524E-03        -1.35217E-02         1.21788E+00         7.32990E-01         1.21796E+00         2.80621E+01         1.00000E+00         1.74846E-07         2.80621E+01         7.58606E+00         2.04760E+01
+          1.93839E-02         8.34507E-03        -1.36098E-02         1.21788E+00         7.43660E-01         1.21796E+00         2.67555E+01         1.00000E+00         1.78100E-07         2.67555E+01         7.46335E+00         1.92921E+01
+          1.93839E-02         8.51490E-03        -1.36997E-02         1.21788E+00         7.54331E-01         1.21796E+00         2.54980E+01         1.00000E+00         1.81465E-07         2.54980E+01         7.33504E+00         1.81630E+01
+          1.93839E-02         8.68473E-03        -1.37915E-02         1.21788E+00         7.65001E-01         1.21796E+00         2.42894E+01         1.00000E+00         1.84941E-07         2.42894E+01         7.20142E+00         1.70880E+01
+          1.93839E-02         8.85455E-03        -1.38850E-02         1.21788E+00         7.75672E-01         1.21795E+00         2.31291E+01         1.00000E+00         1.88524E-07         2.31291E+01         7.06278E+00         1.60664E+01
+          1.93839E-02         9.02438E-03        -1.39804E-02         1.21787E+00         7.86343E-01         1.21795E+00         2.20168E+01         1.00000E+00         1.92214E-07         2.20168E+01         6.91941E+00         1.50974E+01
+          1.93839E-02         9.19421E-03        -1.40776E-02         1.21787E+00         7.97013E-01         1.21795E+00         2.09517E+01         1.00000E+00         1.96010E-07         2.09517E+01         6.77162E+00         1.41801E+01
+          1.93839E-02         9.36403E-03        -1.41766E-02         1.21787E+00         8.07684E-01         1.21795E+00         1.99332E+01         1.00000E+00         1.99908E-07         1.99332E+01         6.61975E+00         1.33135E+01
+          1.93839E-02         9.53386E-03        -1.42774E-02         1.21787E+00         8.18354E-01         1.21795E+00         1.89606E+01         1.00000E+00         2.03909E-07         1.89606E+01         6.46411E+00         1.24965E+01
+          1.93839E-02         9.70369E-03        -1.43800E-02         1.21787E+00         8.29025E-01         1.21795E+00         1.80330E+01         1.00000E+00         2.08012E-07         1.80330E+01         6.30505E+00         1.17280E+01
+          1.93839E-02         9.87352E-03        -1.44845E-02         1.21786E+00         8.39695E-01         1.21795E+00         1.71496E+01         1.00000E+00         2.12214E-07         1.71496E+01         6.14291E+00         1.10066E+01
+          1.93839E-02         1.00433E-02        -1.45907E-02         1.21786E+00         8.50366E-01         1.21795E+00         1.63093E+01         1.00000E+00         2.16516E-07         1.63093E+01         5.97804E+00         1.03312E+01
+          1.93839E-02         1.02132E-02        -1.46988E-02         1.21786E+00         8.61037E-01         1.21795E+00         1.55111E+01         1.00000E+00         2.20918E-07         1.55111E+01         5.81079E+00         9.70036E+00
+          1.93839E-02         1.03830E-02        -1.48086E-02         1.21786E+00         8.71707E-01         1.21795E+00         1.47541E+01         1.00000E+00         2.25420E-07         1.47541E+01         5.64151E+00         9.11259E+00
+          1.93839E-02         1.05528E-02        -1.49203E-02         1.21786E+00         8.82378E-01         1.21795E+00         1.40370E+01         1.00000E+00         2.30023E-07         1.40370E+01         5.47056E+00         8.56644E+00
+          1.93839E-02         1.07227E-02        -1.50338E-02         1.21785E+00         8.93048E-01         1.21795E+00         1.33587E+01         1.00000E+00         2.34728E-07         1.33587E+01         5.29830E+00         8.06040E+00
+          1.93839E-02         1.08925E-02        -1.51491E-02         1.21785E+00         9.03719E-01         1.21795E+00         1.27180E+01         1.00000E+00         2.39537E-07         1.27180E+01         5.12508E+00         7.59291E+00
+          1.93839E-02         1.10623E-02        -1.52662E-02         1.21785E+00         9.14389E-01         1.21794E+00         1.21136E+01         1.00000E+00         2.44451E-07         1.21136E+01         4.95126E+00         7.16238E+00
+          1.93839E-02         1.12321E-02        -1.53852E-02         1.21785E+00         9.25060E-01         1.21794E+00         1.15444E+01         1.00000E+00         2.49476E-07         1.15444E+01         4.77719E+00         6.76720E+00
+          1.93839E-02         1.14020E-02        -1.55059E-02         1.21784E+00         9.35731E-01         1.21794E+00         1.10089E+01         1.00000E+00         2.54613E-07         1.10089E+01         4.60321E+00         6.40574E+00
+          1.93839E-02         1.15718E-02        -1.56285E-02         1.21784E+00         9.46401E-01         1.21794E+00         1.05060E+01         1.00000E+00         2.59868E-07         1.05060E+01         4.42966E+00         6.07636E+00
+          1.93839E-02         1.17416E-02        -1.57529E-02         1.21784E+00         9.57072E-01         1.21794E+00         1.00343E+01         1.00000E+00         2.65245E-07         1.00343E+01         4.25689E+00         5.77741E+00
+          1.93839E-02         1.19114E-02        -1.58790E-02         1.21784E+00         9.67742E-01         1.21794E+00         9.59246E+00         1.00000E+00         2.70750E-07         9.59246E+00         4.08522E+00         5.50724E+00
+          1.93839E-02         1.20813E-02        -1.60070E-02         1.21783E+00         9.78413E-01         1.21794E+00         9.17917E+00         1.00000E+00         2.76390E-07         9.17917E+00         3.91497E+00         5.26420E+00
+          1.93839E-02         1.22511E-02        -1.61368E-02         1.21783E+00         9.89083E-01         1.21794E+00         8.79311E+00         1.00000E+00         2.82171E-07         8.79311E+00         3.74645E+00         5.04666E+00
+          1.93839E-02         1.24209E-02        -1.62684E-02         1.21783E+00         9.99754E-01         1.21794E+00         8.43296E+00         1.00000E+00         2.88102E-07         8.43296E+00         3.57997E+00         4.85299E+00
+          1.93839E-02         1.25908E-02        -1.64019E-02         1.21783E+00         1.01042E+00         1.21794E+00         8.09742E+00         1.00000E+00         2.94190E-07         8.09742E+00         3.41581E+00         4.68160E+00
+          1.93839E-02         1.27606E-02        -1.65371E-02         1.21782E+00         1.02110E+00         1.21794E+00         7.78517E+00         1.00000E+00         3.00444E-07         7.78517E+00         3.25426E+00         4.53091E+00
+          1.93839E-02         1.29304E-02        -1.66742E-02         1.21782E+00         1.03177E+00         1.21794E+00         7.49495E+00         1.00000E+00         3.06873E-07         7.49495E+00         3.09558E+00         4.39937E+00
+          1.93839E-02         1.31002E-02        -1.68130E-02         1.21782E+00         1.04244E+00         1.21793E+00         7.22549E+00         1.00000E+00         3.13487E-07         7.22549E+00         2.94003E+00         4.28546E+00
+          1.93839E-02         1.32701E-02        -1.69537E-02         1.21782E+00         1.05311E+00         1.21793E+00         6.97556E+00         1.00000E+00         3.20295E-07         6.97556E+00         2.78785E+00         4.18770E+00
+          1.93839E-02         1.34399E-02        -1.70962E-02         1.21781E+00         1.06378E+00         1.21793E+00         6.74394E+00         1.00000E+00         3.27309E-07         6.74394E+00         2.63927E+00         4.10467E+00
+          1.93839E-02         1.36097E-02        -1.72405E-02         1.21781E+00         1.07445E+00         1.21793E+00         6.52945E+00         1.00000E+00         3.34537E-07         6.52945E+00         2.49450E+00         4.03495E+00
+          1.93839E-02         1.37795E-02        -1.73866E-02         1.21781E+00         1.08512E+00         1.21793E+00         6.33095E+00         1.00000E+00         3.41991E-07         6.33095E+00         2.35374E+00         3.97720E+00
+          1.93839E-02         1.39494E-02        -1.75346E-02         1.21780E+00         1.09579E+00         1.21793E+00         6.14731E+00         1.00000E+00         3.49679E-07         6.14731E+00         2.21717E+00         3.93013E+00
+          1.93839E-02         1.41192E-02        -1.76843E-02         1.21780E+00         1.10646E+00         1.21793E+00         5.97745E+00         1.00000E+00         3.57613E-07         5.97745E+00         2.08497E+00         3.89248E+00
+          1.93839E-02         1.42890E-02        -1.78359E-02         1.21780E+00         1.11713E+00         1.21793E+00         5.82034E+00         1.00000E+00         3.65800E-07         5.82034E+00         1.95727E+00         3.86307E+00
+          1.93839E-02         1.44589E-02        -1.79892E-02         1.21780E+00         1.12780E+00         1.21793E+00         5.67498E+00         1.00000E+00         3.74251E-07         5.67498E+00         1.83423E+00         3.84075E+00
+          1.93839E-02         1.46287E-02        -1.81444E-02         1.21779E+00         1.13847E+00         1.21793E+00         5.54039E+00         1.00000E+00         3.82973E-07         5.54039E+00         1.71595E+00         3.82444E+00
+          1.93839E-02         1.47985E-02        -1.83014E-02         1.21779E+00         1.14914E+00         1.21793E+00         5.41567E+00         1.00000E+00         3.91974E-07         5.41567E+00         1.60255E+00         3.81312E+00
+          1.93839E-02         1.49683E-02        -1.84602E-02         1.21779E+00         1.15981E+00         1.21793E+00         5.29995E+00         1.00000E+00         4.01260E-07         5.29995E+00         1.49411E+00         3.80584E+00
+          1.93839E-02         1.51382E-02        -1.86208E-02         1.21778E+00         1.17048E+00         1.21793E+00         5.19238E+00         1.00000E+00         4.10838E-07         5.19238E+00         1.39070E+00         3.80168E+00
+          1.93839E-02         1.53080E-02        -1.87832E-02         1.21778E+00         1.18115E+00         1.21793E+00         5.09220E+00         1.00000E+00         4.20712E-07         5.09220E+00         1.29238E+00         3.79982E+00
+          1.93839E-02         1.54778E-02        -1.89475E-02         1.21778E+00         1.19182E+00         1.21792E+00         4.99865E+00         1.00000E+00         4.30885E-07         4.99865E+00         1.19918E+00         3.79947E+00
+          1.93839E-02         1.56476E-02        -1.91135E-02         1.21777E+00         1.20249E+00         1.21792E+00         4.91105E+00         1.00000E+00         4.41361E-07         4.91105E+00         1.11113E+00         3.79991E+00
+          1.93839E-02         1.58175E-02        -1.92814E-02         1.21777E+00         1.21317E+00         1.21792E+00         4.82874E+00         1.00000E+00         4.52140E-07         4.82874E+00         1.02825E+00         3.80050E+00
+          1.93839E-02         1.59873E-02        -1.94511E-02         1.21777E+00         1.22384E+00         1.21792E+00         4.75114E+00         1.00000E+00         4.63223E-07         4.75114E+00         9.50509E-01         3.80063E+00
+          1.93839E-02         1.61571E-02        -1.96226E-02         1.21776E+00         1.23451E+00         1.21792E+00         4.67767E+00         1.00000E+00         4.74609E-07         4.67767E+00         8.77902E-01         3.79977E+00
+          1.93839E-02         1.63270E-02        -1.97959E-02         1.21776E+00         1.24518E+00         1.21792E+00         4.60783E+00         1.00000E+00         4.86295E-07         4.60783E+00         8.10389E-01         3.79744E+00
+          1.93839E-02         1.64968E-02        -1.99710E-02         1.21776E+00         1.25585E+00         1.21792E+00         4.54115E+00         1.00000E+00         4.98278E-07         4.54115E+00         7.47919E-01         3.79323E+00
+          1.93839E-02         1.66666E-02        -2.01479E-02         1.21775E+00         1.26652E+00         1.21792E+00         4.47721E+00         1.00000E+00         5.10554E-07         4.47721E+00         6.90428E-01         3.78678E+00
+          1.93839E-02         1.68364E-02        -2.03266E-02         1.21775E+00         1.27719E+00         1.21792E+00         4.41562E+00         1.00000E+00         5.23117E-07         4.41562E+00         6.37842E-01         3.77777E+00
+          1.93839E-02         1.70063E-02        -2.05072E-02         1.21775E+00         1.28786E+00         1.21792E+00         4.35603E+00         1.00000E+00         5.35961E-07         4.35603E+00         5.90069E-01         3.76596E+00
+          1.93839E-02         1.71761E-02        -2.06896E-02         1.21774E+00         1.29853E+00         1.21792E+00         4.29815E+00         1.00000E+00         5.49079E-07         4.29815E+00         5.47010E-01         3.75114E+00
+          1.93839E-02         1.73459E-02        -2.08737E-02         1.21774E+00         1.30920E+00         1.21792E+00         4.24171E+00         1.00000E+00         5.62463E-07         4.24171E+00         5.08553E-01         3.73316E+00
+          1.93839E-02         1.75158E-02        -2.10597E-02         1.21774E+00         1.31987E+00         1.21792E+00         4.18649E+00         1.00000E+00         5.76105E-07         4.18649E+00         4.74576E-01         3.71191E+00
+          1.93839E-02         1.76856E-02        -2.12475E-02         1.21773E+00         1.33054E+00         1.21792E+00         4.13228E+00         1.00000E+00         5.89995E-07         4.13228E+00         4.44946E-01         3.68733E+00
+          1.93839E-02         1.78554E-02        -2.14371E-02         1.21773E+00         1.34121E+00         1.21792E+00         4.07893E+00         1.00000E+00         6.04125E-07         4.07893E+00         4.19522E-01         3.65941E+00
+          1.93839E-02         1.80252E-02        -2.16286E-02         1.21773E+00         1.35188E+00         1.21792E+00         4.02632E+00         1.00000E+00         6.18486E-07         4.02632E+00         3.98154E-01         3.62816E+00
+          1.93839E-02         1.81951E-02        -2.18218E-02         1.21772E+00         1.36255E+00         1.21792E+00         3.97434E+00         1.00000E+00         6.33069E-07         3.97434E+00         3.80685E-01         3.59365E+00
+          1.93839E-02         1.83649E-02        -2.20169E-02         1.21772E+00         1.37322E+00         1.21792E+00         3.92291E+00         1.00000E+00         6.47864E-07         3.92291E+00         3.66950E-01         3.55596E+00
+          1.93839E-02         1.85347E-02        -2.22137E-02         1.21771E+00         1.38389E+00         1.21792E+00         3.87201E+00         1.00000E+00         6.62864E-07         3.87201E+00         3.56780E-01         3.51523E+00
+          1.93839E-02         1.87045E-02        -2.24124E-02         1.21771E+00         1.39457E+00         1.21792E+00         3.82160E+00         1.00000E+00         6.78061E-07         3.82160E+00         3.49997E-01         3.47161E+00
+          1.93839E-02         1.88744E-02        -2.26129E-02         1.21771E+00         1.40524E+00         1.21792E+00         3.77169E+00         1.00000E+00         6.93448E-07         3.77169E+00         3.46421E-01         3.42527E+00
+          1.93839E-02         1.90442E-02        -2.28152E-02         1.21770E+00         1.41591E+00         1.21792E+00         3.72230E+00         1.00000E+00         7.09018E-07         3.72230E+00         3.45868E-01         3.37643E+00
+          1.93839E-02         1.92140E-02        -2.30193E-02         1.21770E+00         1.42658E+00         1.21792E+00         3.67346E+00         1.00000E+00         7.24769E-07         3.67346E+00         3.48149E-01         3.32531E+00
+          1.93839E-02         1.93839E-02        -2.32253E-02         1.21769E+00         1.43725E+00         1.21792E+00         3.62524E+00         1.00000E+00         7.40695E-07         3.62524E+00         3.53075E-01         3.27216E+00
+          1.93839E-02         1.95537E-02        -2.34330E-02         1.21769E+00         1.44792E+00         1.21792E+00         3.57770E+00         1.00000E+00         7.56796E-07         3.57770E+00         3.60452E-01         3.21724E+00
+          1.93839E-02         1.97235E-02        -2.36426E-02         1.21769E+00         1.45859E+00         1.21792E+00         3.53091E+00         1.00000E+00         7.73070E-07         3.53091E+00         3.70089E-01         3.16082E+00
+          1.93839E-02         1.98933E-02        -2.38539E-02         1.21768E+00         1.46926E+00         1.21792E+00         3.48498E+00         1.00000E+00         7.89520E-07         3.48498E+00         3.81793E-01         3.10319E+00
+          1.93839E-02         2.00632E-02        -2.40671E-02         1.21768E+00         1.47993E+00         1.21792E+00         3.44000E+00         1.00000E+00         8.06149E-07         3.44000E+00         3.95369E-01         3.04463E+00
+          1.93839E-02         2.02330E-02        -2.42821E-02         1.21767E+00         1.49060E+00         1.21792E+00         3.39608E+00         1.00000E+00         8.22963E-07         3.39608E+00         4.10627E-01         2.98545E+00
+          1.93839E-02         2.04028E-02        -2.44989E-02         1.21767E+00         1.50127E+00         1.21792E+00         3.35332E+00         1.00000E+00         8.39967E-07         3.35332E+00         4.27376E-01         2.92595E+00
+          1.93839E-02         2.05726E-02        -2.47175E-02         1.21767E+00         1.51194E+00         1.21792E+00         3.31184E+00         1.00000E+00         8.57173E-07         3.31184E+00         4.45429E-01         2.86641E+00
+          1.93839E-02         2.07425E-02        -2.49380E-02         1.21766E+00         1.52261E+00         1.21792E+00         3.27176E+00         1.00000E+00         8.74591E-07         3.27176E+00         4.64600E-01         2.80716E+00
+          1.93839E-02         2.09123E-02        -2.51602E-02         1.21766E+00         1.53328E+00         1.21792E+00         3.23318E+00         1.00000E+00         8.92235E-07         3.23318E+00         4.84710E-01         2.74847E+00
+          1.93839E-02         2.10821E-02        -2.53843E-02         1.21765E+00         1.54395E+00         1.21792E+00         3.19621E+00         1.00000E+00         9.10120E-07         3.19621E+00         5.05580E-01         2.69063E+00
+          1.93839E-02         2.12520E-02        -2.56101E-02         1.21765E+00         1.55462E+00         1.21792E+00         3.16097E+00         1.00000E+00         9.28263E-07         3.16097E+00         5.27039E-01         2.63394E+00
+          1.93839E-02         2.14218E-02        -2.58378E-02         1.21764E+00         1.56529E+00         1.21792E+00         3.12756E+00         1.00000E+00         9.46684E-07         3.12756E+00         5.48918E-01         2.57865E+00
+          1.93839E-02         2.15916E-02        -2.60673E-02         1.21764E+00         1.57596E+00         1.21792E+00         3.09608E+00         1.00000E+00         9.65402E-07         3.09608E+00         5.71056E-01         2.52503E+00
+          1.93839E-02         2.17614E-02        -2.62986E-02         1.21763E+00         1.58664E+00         1.21792E+00         3.06662E+00         1.00000E+00         9.84440E-07         3.06662E+00         5.93296E-01         2.47332E+00
+          1.93839E-02         2.19313E-02        -2.65318E-02         1.21763E+00         1.59731E+00         1.21792E+00         3.03925E+00         1.00000E+00         1.00382E-06         3.03925E+00         6.15490E-01         2.42376E+00
+          1.93839E-02         2.21011E-02        -2.67667E-02         1.21763E+00         1.60798E+00         1.21792E+00         3.01405E+00         1.00000E+00         1.02357E-06         3.01405E+00         6.37493E-01         2.37656E+00
+          1.93839E-02         2.22709E-02        -2.70034E-02         1.21762E+00         1.61865E+00         1.21792E+00         2.99110E+00         1.00000E+00         1.04370E-06         2.99110E+00         6.59170E-01         2.33192E+00
+          1.93839E-02         2.24407E-02        -2.72420E-02         1.21762E+00         1.62932E+00         1.21792E+00         2.97043E+00         1.00000E+00         1.06425E-06         2.97043E+00         6.80392E-01         2.29003E+00
+          1.93839E-02         2.26106E-02        -2.74824E-02         1.21761E+00         1.63999E+00         1.21792E+00         2.95209E+00         1.00000E+00         1.08524E-06         2.95209E+00         7.01037E-01         2.25105E+00
+          1.93839E-02         2.27804E-02        -2.77246E-02         1.21761E+00         1.65066E+00         1.21792E+00         2.93611E+00         1.00000E+00         1.10669E-06         2.93611E+00         7.20992E-01         2.21512E+00
+          1.93839E-02         2.29502E-02        -2.79686E-02         1.21760E+00         1.66133E+00         1.21792E+00         2.92251E+00         1.00000E+00         1.12863E-06         2.92251E+00         7.40150E-01         2.18236E+00
+          1.93839E-02         2.31201E-02        -2.82144E-02         1.21760E+00         1.67200E+00         1.21792E+00         2.91130E+00         1.00000E+00         1.15107E-06         2.91130E+00         7.58414E-01         2.15288E+00
+          1.93839E-02         2.32899E-02        -2.84620E-02         1.21759E+00         1.68267E+00         1.21793E+00         2.90246E+00         1.00000E+00         1.17403E-06         2.90246E+00         7.75693E-01         2.12677E+00
+          1.93839E-02         2.34597E-02        -2.87115E-02         1.21759E+00         1.69334E+00         1.21793E+00         2.89598E+00         1.00000E+00         1.19754E-06         2.89598E+00         7.91906E-01         2.10408E+00
+          1.93839E-02         2.36295E-02        -2.89627E-02         1.21758E+00         1.70401E+00         1.21793E+00         2.89182E+00         1.00000E+00         1.22160E-06         2.89182E+00         8.06978E-01         2.08485E+00
+          1.93839E-02         2.37994E-02        -2.92158E-02         1.21758E+00         1.71468E+00         1.21793E+00         2.88994E+00         1.00000E+00         1.24624E-06         2.88994E+00         8.20844E-01         2.06910E+00
+          1.93839E-02         2.39692E-02        -2.94707E-02         1.21757E+00         1.72535E+00         1.21793E+00         2.89028E+00         1.00000E+00         1.27145E-06         2.89028E+00         8.33447E-01         2.05684E+00
+          1.93839E-02         2.41390E-02        -2.97274E-02         1.21757E+00         1.73602E+00         1.21793E+00         2.89277E+00         1.00000E+00         1.29725E-06         2.89277E+00         8.44735E-01         2.04803E+00
+          1.93839E-02         2.43088E-02        -2.99859E-02         1.21756E+00         1.74669E+00         1.21793E+00         2.89732E+00         1.00000E+00         1.32363E-06         2.89732E+00         8.54669E-01         2.04265E+00
+          1.93839E-02         2.44787E-02        -3.02462E-02         1.21756E+00         1.75736E+00         1.21793E+00         2.90384E+00         1.00000E+00         1.35060E-06         2.90384E+00         8.63213E-01         2.04063E+00
+          1.93839E-02         2.46485E-02        -3.05084E-02         1.21755E+00         1.76804E+00         1.21794E+00         2.91222E+00         1.00000E+00         1.37815E-06         2.91222E+00         8.70342E-01         2.04188E+00
+          1.93839E-02         2.48183E-02        -3.07723E-02         1.21755E+00         1.77871E+00         1.21794E+00         2.92235E+00         1.00000E+00         1.40628E-06         2.92235E+00         8.76035E-01         2.04632E+00
+          1.93839E-02         2.49882E-02        -3.10381E-02         1.21754E+00         1.78938E+00         1.21794E+00         2.93410E+00         1.00000E+00         1.43497E-06         2.93410E+00         8.80282E-01         2.05382E+00
+          1.93839E-02         2.51580E-02        -3.13056E-02         1.21754E+00         1.80005E+00         1.21794E+00         2.94734E+00         1.00000E+00         1.46420E-06         2.94734E+00         8.83077E-01         2.06426E+00
+          1.93839E-02         2.53278E-02        -3.15750E-02         1.21753E+00         1.81072E+00         1.21794E+00         2.96191E+00         1.00000E+00         1.49395E-06         2.96191E+00         8.84422E-01         2.07749E+00
+          1.93839E-02         2.54976E-02        -3.18462E-02         1.21753E+00         1.82139E+00         1.21794E+00         2.97767E+00         1.00000E+00         1.52422E-06         2.97767E+00         8.84326E-01         2.09335E+00
+          1.93839E-02         2.56675E-02        -3.21193E-02         1.21752E+00         1.83206E+00         1.21795E+00         2.99446E+00         1.00000E+00         1.55496E-06         2.99446E+00         8.82802E-01         2.11166E+00
+          1.93839E-02         2.58373E-02        -3.23941E-02         1.21752E+00         1.84273E+00         1.21795E+00         3.01211E+00         1.00000E+00         1.58615E-06         3.01211E+00         8.79872E-01         2.13223E+00
+          1.93839E-02         2.60071E-02        -3.26707E-02         1.21751E+00         1.85340E+00         1.21795E+00         3.03044E+00         1.00000E+00         1.61776E-06         3.03044E+00         8.75561E-01         2.15488E+00
+          1.93839E-02         2.61769E-02        -3.29492E-02         1.21751E+00         1.86407E+00         1.21795E+00         3.04929E+00         1.00000E+00         1.64976E-06         3.04929E+00         8.69901E-01         2.17939E+00
+          1.95537E-02         8.72665E-04        -1.16540E-02         1.22859E+00         2.74155E-01         1.22865E+00         1.13061E+02         1.00000E+00         8.75666E-08         1.13061E+02         5.20240E+00         1.07858E+02
+          1.95537E-02         1.04249E-03        -1.16643E-02         1.22859E+00         2.84826E-01         1.22865E+00         1.11043E+02         1.00000E+00         8.75220E-08         1.11043E+02         5.32093E+00         1.05722E+02
+          1.95537E-02         1.21232E-03        -1.16763E-02         1.22859E+00         2.95496E-01         1.22865E+00         1.08985E+02         1.00000E+00         8.74826E-08         1.08985E+02         5.43980E+00         1.03545E+02
+          1.95537E-02         1.38215E-03        -1.16901E-02         1.22859E+00         3.06167E-01         1.22865E+00         1.06888E+02         1.00000E+00         8.74499E-08         1.06888E+02         5.55862E+00         1.01330E+02
+          1.95537E-02         1.55197E-03        -1.17058E-02         1.22859E+00         3.16838E-01         1.22865E+00         1.04758E+02         1.00000E+00         8.74258E-08         1.04758E+02         5.67700E+00         9.90807E+01
+          1.95537E-02         1.72180E-03        -1.17232E-02         1.22859E+00         3.27508E-01         1.22865E+00         1.02596E+02         1.00000E+00         8.74122E-08         1.02596E+02         5.79456E+00         9.68017E+01
+          1.95537E-02         1.89163E-03        -1.17425E-02         1.22859E+00         3.38179E-01         1.22865E+00         1.00407E+02         1.00000E+00         8.74113E-08         1.00407E+02         5.91091E+00         9.44965E+01
+          1.95537E-02         2.06146E-03        -1.17636E-02         1.22859E+00         3.48849E-01         1.22865E+00         9.81948E+01         1.00000E+00         8.74255E-08         9.81948E+01         6.02567E+00         9.21691E+01
+          1.95537E-02         2.23128E-03        -1.17865E-02         1.22859E+00         3.59520E-01         1.22865E+00         9.59617E+01         1.00000E+00         8.74572E-08         9.59617E+01         6.13847E+00         8.98233E+01
+          1.95537E-02         2.40111E-03        -1.18112E-02         1.22859E+00         3.70190E-01         1.22865E+00         9.37117E+01         1.00000E+00         8.75092E-08         9.37117E+01         6.24893E+00         8.74628E+01
+          1.95537E-02         2.57094E-03        -1.18377E-02         1.22859E+00         3.80861E-01         1.22865E+00         9.14481E+01         1.00000E+00         8.75845E-08         9.14481E+01         6.35670E+00         8.50914E+01
+          1.95537E-02         2.74077E-03        -1.18661E-02         1.22859E+00         3.91532E-01         1.22865E+00         8.91744E+01         1.00000E+00         8.76861E-08         8.91744E+01         6.46142E+00         8.27130E+01
+          1.95537E-02         2.91059E-03        -1.18962E-02         1.22859E+00         4.02202E-01         1.22865E+00         8.68939E+01         1.00000E+00         8.78174E-08         8.68939E+01         6.56274E+00         8.03311E+01
+          1.95537E-02         3.08042E-03        -1.19282E-02         1.22859E+00         4.12873E-01         1.22865E+00         8.46098E+01         1.00000E+00         8.79816E-08         8.46098E+01         6.66033E+00         7.79495E+01
+          1.95537E-02         3.25025E-03        -1.19619E-02         1.22859E+00         4.23543E-01         1.22865E+00         8.23255E+01         1.00000E+00         8.81823E-08         8.23255E+01         6.75386E+00         7.55716E+01
+          1.95537E-02         3.42008E-03        -1.19975E-02         1.22859E+00         4.34214E-01         1.22865E+00         8.00440E+01         1.00000E+00         8.84233E-08         8.00440E+01         6.84302E+00         7.32010E+01
+          1.95537E-02         3.58990E-03        -1.20349E-02         1.22859E+00         4.44884E-01         1.22864E+00         7.77685E+01         1.00000E+00         8.87083E-08         7.77685E+01         6.92751E+00         7.08410E+01
+          1.95537E-02         3.75973E-03        -1.20741E-02         1.22859E+00         4.55555E-01         1.22864E+00         7.55021E+01         1.00000E+00         8.90410E-08         7.55021E+01         7.00705E+00         6.84950E+01
+          1.95537E-02         3.92956E-03        -1.21151E-02         1.22858E+00         4.66225E-01         1.22864E+00         7.32476E+01         1.00000E+00         8.94253E-08         7.32476E+01         7.08137E+00         6.61662E+01
+          1.95537E-02         4.09939E-03        -1.21580E-02         1.22858E+00         4.76896E-01         1.22864E+00         7.10080E+01         1.00000E+00         8.98650E-08         7.10080E+01         7.15022E+00         6.38578E+01
+          1.95537E-02         4.26921E-03        -1.22026E-02         1.22858E+00         4.87567E-01         1.22864E+00         6.87859E+01         1.00000E+00         9.03640E-08         6.87859E+01         7.21335E+00         6.15726E+01
+          1.95537E-02         4.43904E-03        -1.22491E-02         1.22858E+00         4.98237E-01         1.22864E+00         6.65841E+01         1.00000E+00         9.09260E-08         6.65841E+01         7.27054E+00         5.93135E+01
+          1.95537E-02         4.60887E-03        -1.22973E-02         1.22858E+00         5.08908E-01         1.22864E+00         6.44050E+01         1.00000E+00         9.15546E-08         6.44050E+01         7.32160E+00         5.70835E+01
+          1.95537E-02         4.77869E-03        -1.23474E-02         1.22858E+00         5.19578E-01         1.22864E+00         6.22513E+01         1.00000E+00         9.22532E-08         6.22513E+01         7.36633E+00         5.48849E+01
+          1.95537E-02         4.94852E-03        -1.23993E-02         1.22858E+00         5.30249E-01         1.22864E+00         6.01251E+01         1.00000E+00         9.30251E-08         6.01251E+01         7.40457E+00         5.27205E+01
+          1.95537E-02         5.11835E-03        -1.24530E-02         1.22858E+00         5.40919E-01         1.22864E+00         5.80287E+01         1.00000E+00         9.38735E-08         5.80287E+01         7.43618E+00         5.05925E+01
+          1.95537E-02         5.28818E-03        -1.25085E-02         1.22858E+00         5.51590E-01         1.22864E+00         5.59643E+01         1.00000E+00         9.48010E-08         5.59643E+01         7.46102E+00         4.85033E+01
+          1.95537E-02         5.45800E-03        -1.25658E-02         1.22858E+00         5.62261E-01         1.22864E+00         5.39337E+01         1.00000E+00         9.58102E-08         5.39337E+01         7.47899E+00         4.64547E+01
+          1.95537E-02         5.62783E-03        -1.26250E-02         1.22857E+00         5.72931E-01         1.22864E+00         5.19389E+01         1.00000E+00         9.69033E-08         5.19389E+01         7.49000E+00         4.44489E+01
+          1.95537E-02         5.79766E-03        -1.26859E-02         1.22857E+00         5.83602E-01         1.22864E+00         4.99816E+01         1.00000E+00         9.80821E-08         4.99816E+01         7.49398E+00         4.24876E+01
+          1.95537E-02         5.96749E-03        -1.27487E-02         1.22857E+00         5.94272E-01         1.22864E+00         4.80634E+01         1.00000E+00         9.93482E-08         4.80634E+01         7.49089E+00         4.05725E+01
+          1.95537E-02         6.13731E-03        -1.28132E-02         1.22857E+00         6.04943E-01         1.22864E+00         4.61858E+01         1.00000E+00         1.00703E-07         4.61858E+01         7.48069E+00         3.87051E+01
+          1.95537E-02         6.30714E-03        -1.28796E-02         1.22857E+00         6.15613E-01         1.22864E+00         4.43501E+01         1.00000E+00         1.02146E-07         4.43501E+01         7.46339E+00         3.68868E+01
+          1.95537E-02         6.47697E-03        -1.29478E-02         1.22857E+00         6.26284E-01         1.22864E+00         4.25576E+01         1.00000E+00         1.03679E-07         4.25576E+01         7.43899E+00         3.51186E+01
+          1.95537E-02         6.64680E-03        -1.30178E-02         1.22857E+00         6.36955E-01         1.22864E+00         4.08094E+01         1.00000E+00         1.05301E-07         4.08094E+01         7.40752E+00         3.34018E+01
+          1.95537E-02         6.81662E-03        -1.30896E-02         1.22857E+00         6.47625E-01         1.22864E+00         3.91063E+01         1.00000E+00         1.07013E-07         3.91063E+01         7.36905E+00         3.17373E+01
+          1.95537E-02         6.98645E-03        -1.31633E-02         1.22856E+00         6.58296E-01         1.22863E+00         3.74493E+01         1.00000E+00         1.08812E-07         3.74493E+01         7.32364E+00         3.01257E+01
+          1.95537E-02         7.15628E-03        -1.32387E-02         1.22856E+00         6.68966E-01         1.22863E+00         3.58391E+01         1.00000E+00         1.10699E-07         3.58391E+01         7.27138E+00         2.85677E+01
+          1.95537E-02         7.32611E-03        -1.33160E-02         1.22856E+00         6.79637E-01         1.22863E+00         3.42763E+01         1.00000E+00         1.12672E-07         3.42763E+01         7.21238E+00         2.70639E+01
+          1.95537E-02         7.49593E-03        -1.33950E-02         1.22856E+00         6.90307E-01         1.22863E+00         3.27613E+01         1.00000E+00         1.14729E-07         3.27613E+01         7.14677E+00         2.56145E+01
+          1.95537E-02         7.66576E-03        -1.34759E-02         1.22856E+00         7.00978E-01         1.22863E+00         3.12944E+01         1.00000E+00         1.16869E-07         3.12944E+01         7.07470E+00         2.42197E+01
+          1.95537E-02         7.83559E-03        -1.35586E-02         1.22856E+00         7.11649E-01         1.22863E+00         2.98760E+01         1.00000E+00         1.19089E-07         2.98760E+01         6.99633E+00         2.28797E+01
+          1.95537E-02         8.00542E-03        -1.36431E-02         1.22855E+00         7.22319E-01         1.22863E+00         2.85062E+01         1.00000E+00         1.21387E-07         2.85062E+01         6.91184E+00         2.15943E+01
+          1.95537E-02         8.17524E-03        -1.37294E-02         1.22855E+00         7.32990E-01         1.22863E+00         2.71848E+01         1.00000E+00         1.23761E-07         2.71848E+01         6.82142E+00         2.03634E+01
+          1.95537E-02         8.34507E-03        -1.38176E-02         1.22855E+00         7.43660E-01         1.22863E+00         2.59119E+01         1.00000E+00         1.26209E-07         2.59119E+01         6.72528E+00         1.91867E+01
+          1.95537E-02         8.51490E-03        -1.39075E-02         1.22855E+00         7.54331E-01         1.22863E+00         2.46873E+01         1.00000E+00         1.28728E-07         2.46873E+01         6.62364E+00         1.80636E+01
+          1.95537E-02         8.68473E-03        -1.39992E-02         1.22855E+00         7.65001E-01         1.22863E+00         2.35106E+01         1.00000E+00         1.31315E-07         2.35106E+01         6.51674E+00         1.69938E+01
+          1.95537E-02         8.85455E-03        -1.40928E-02         1.22855E+00         7.75672E-01         1.22863E+00         2.23814E+01         1.00000E+00         1.33968E-07         2.23814E+01         6.40484E+00         1.59765E+01
+          1.95537E-02         9.02438E-03        -1.41882E-02         1.22854E+00         7.86343E-01         1.22863E+00         2.12992E+01         1.00000E+00         1.36686E-07         2.12992E+01         6.28818E+00         1.50110E+01
+          1.95537E-02         9.19421E-03        -1.42854E-02         1.22854E+00         7.97013E-01         1.22863E+00         2.02635E+01         1.00000E+00         1.39466E-07         2.02635E+01         6.16705E+00         1.40965E+01
+          1.95537E-02         9.36403E-03        -1.43844E-02         1.22854E+00         8.07684E-01         1.22862E+00         1.92736E+01         1.00000E+00         1.42305E-07         1.92736E+01         6.04171E+00         1.32319E+01
+          1.95537E-02         9.53386E-03        -1.44852E-02         1.22854E+00         8.18354E-01         1.22862E+00         1.83288E+01         1.00000E+00         1.45204E-07         1.83288E+01         5.91247E+00         1.24163E+01
+          1.95537E-02         9.70369E-03        -1.45878E-02         1.22854E+00         8.29025E-01         1.22862E+00         1.74282E+01         1.00000E+00         1.48160E-07         1.74282E+01         5.77962E+00         1.16486E+01
+          1.95537E-02         9.87352E-03        -1.46922E-02         1.22853E+00         8.39695E-01         1.22862E+00         1.65710E+01         1.00000E+00         1.51173E-07         1.65710E+01         5.64346E+00         1.09275E+01
+          1.95537E-02         1.00433E-02        -1.47985E-02         1.22853E+00         8.50366E-01         1.22862E+00         1.57562E+01         1.00000E+00         1.54242E-07         1.57562E+01         5.50430E+00         1.02519E+01
+          1.95537E-02         1.02132E-02        -1.49065E-02         1.22853E+00         8.61037E-01         1.22862E+00         1.49828E+01         1.00000E+00         1.57367E-07         1.49828E+01         5.36246E+00         9.62033E+00
+          1.95537E-02         1.03830E-02        -1.50164E-02         1.22853E+00         8.71707E-01         1.22862E+00         1.42498E+01         1.00000E+00         1.60549E-07         1.42498E+01         5.21825E+00         9.03152E+00
+          1.95537E-02         1.05528E-02        -1.51281E-02         1.22853E+00         8.82378E-01         1.22862E+00         1.35560E+01         1.00000E+00         1.63790E-07         1.35560E+01         5.07199E+00         8.48402E+00
+          1.95537E-02         1.07227E-02        -1.52416E-02         1.22852E+00         8.93048E-01         1.22862E+00         1.29004E+01         1.00000E+00         1.67091E-07         1.29004E+01         4.92400E+00         7.97635E+00
+          1.95537E-02         1.08925E-02        -1.53569E-02         1.22852E+00         9.03719E-01         1.22862E+00         1.22816E+01         1.00000E+00         1.70454E-07         1.22816E+01         4.77461E+00         7.50703E+00
+          1.95537E-02         1.10623E-02        -1.54740E-02         1.22852E+00         9.14389E-01         1.22862E+00         1.16986E+01         1.00000E+00         1.73882E-07         1.16986E+01         4.62413E+00         7.07450E+00
+          1.95537E-02         1.12321E-02        -1.55929E-02         1.22852E+00         9.25060E-01         1.22862E+00         1.11501E+01         1.00000E+00         1.77380E-07         1.11501E+01         4.47290E+00         6.67721E+00
+          1.95537E-02         1.14020E-02        -1.57137E-02         1.22851E+00         9.35731E-01         1.22861E+00         1.06348E+01         1.00000E+00         1.80952E-07         1.06348E+01         4.32121E+00         6.31357E+00
+          1.95537E-02         1.15718E-02        -1.58362E-02         1.22851E+00         9.46401E-01         1.22861E+00         1.01514E+01         1.00000E+00         1.84604E-07         1.01514E+01         4.16939E+00         5.98199E+00
+          1.95537E-02         1.17416E-02        -1.59606E-02         1.22851E+00         9.57072E-01         1.22861E+00         9.69860E+00         1.00000E+00         1.88341E-07         9.69860E+00         4.01775E+00         5.68085E+00
+          1.95537E-02         1.19114E-02        -1.60868E-02         1.22851E+00         9.67742E-01         1.22861E+00         9.27514E+00         1.00000E+00         1.92170E-07         9.27514E+00         3.86659E+00         5.40855E+00
+          1.95537E-02         1.20813E-02        -1.62148E-02         1.22850E+00         9.78413E-01         1.22861E+00         8.87968E+00         1.00000E+00         1.96098E-07         8.87968E+00         3.71620E+00         5.16348E+00
+          1.95537E-02         1.22511E-02        -1.63446E-02         1.22850E+00         9.89083E-01         1.22861E+00         8.51091E+00         1.00000E+00         2.00134E-07         8.51091E+00         3.56688E+00         4.94403E+00
+          1.95537E-02         1.24209E-02        -1.64762E-02         1.22850E+00         9.99754E-01         1.22861E+00         8.16753E+00         1.00000E+00         2.04286E-07         8.16753E+00         3.41891E+00         4.74862E+00
+          1.95537E-02         1.25908E-02        -1.66096E-02         1.22850E+00         1.01042E+00         1.22861E+00         7.84824E+00         1.00000E+00         2.08563E-07         7.84824E+00         3.27256E+00         4.57567E+00
+          1.95537E-02         1.27606E-02        -1.67449E-02         1.22849E+00         1.02110E+00         1.22861E+00         7.55175E+00         1.00000E+00         2.12975E-07         7.55175E+00         3.12811E+00         4.42364E+00
+          1.95537E-02         1.29304E-02        -1.68819E-02         1.22849E+00         1.03177E+00         1.22861E+00         7.27679E+00         1.00000E+00         2.17532E-07         7.27679E+00         2.98579E+00         4.29099E+00
+          1.95537E-02         1.31002E-02        -1.70208E-02         1.22849E+00         1.04244E+00         1.22861E+00         7.02210E+00         1.00000E+00         2.22243E-07         7.02210E+00         2.84586E+00         4.17624E+00
+          1.95537E-02         1.32701E-02        -1.71615E-02         1.22849E+00         1.05311E+00         1.22861E+00         6.78646E+00         1.00000E+00         2.27120E-07         6.78646E+00         2.70856E+00         4.07791E+00
+          1.95537E-02         1.34399E-02        -1.73040E-02         1.22848E+00         1.06378E+00         1.22860E+00         6.56867E+00         1.00000E+00         2.32171E-07         6.56867E+00         2.57408E+00         3.99458E+00
+          1.95537E-02         1.36097E-02        -1.74483E-02         1.22848E+00         1.07445E+00         1.22860E+00         6.36754E+00         1.00000E+00         2.37408E-07         6.36754E+00         2.44266E+00         3.92488E+00
+          1.95537E-02         1.37795E-02        -1.75944E-02         1.22848E+00         1.08512E+00         1.22860E+00         6.18193E+00         1.00000E+00         2.42840E-07         6.18193E+00         2.31448E+00         3.86745E+00
+          1.95537E-02         1.39494E-02        -1.77423E-02         1.22847E+00         1.09579E+00         1.22860E+00         6.01073E+00         1.00000E+00         2.48477E-07         6.01073E+00         2.18972E+00         3.82101E+00
+          1.95537E-02         1.41192E-02        -1.78921E-02         1.22847E+00         1.10646E+00         1.22860E+00         5.85286E+00         1.00000E+00         2.54326E-07         5.85286E+00         2.06856E+00         3.78430E+00
+          1.95537E-02         1.42890E-02        -1.80436E-02         1.22847E+00         1.11713E+00         1.22860E+00         5.70728E+00         1.00000E+00         2.60397E-07         5.70728E+00         1.95115E+00         3.75613E+00
+          1.95537E-02         1.44589E-02        -1.81970E-02         1.22847E+00         1.12780E+00         1.22860E+00         5.57299E+00         1.00000E+00         2.66696E-07         5.57299E+00         1.83762E+00         3.73537E+00
+          1.95537E-02         1.46287E-02        -1.83522E-02         1.22846E+00         1.13847E+00         1.22860E+00         5.44903E+00         1.00000E+00         2.73230E-07         5.44903E+00         1.72811E+00         3.72093E+00
+          1.95537E-02         1.47985E-02        -1.85091E-02         1.22846E+00         1.14914E+00         1.22860E+00         5.33449E+00         1.00000E+00         2.80003E-07         5.33449E+00         1.62272E+00         3.71176E+00
+          1.95537E-02         1.49683E-02        -1.86679E-02         1.22846E+00         1.15981E+00         1.22860E+00         5.22848E+00         1.00000E+00         2.87020E-07         5.22848E+00         1.52156E+00         3.70692E+00
+          1.95537E-02         1.51382E-02        -1.88286E-02         1.22845E+00         1.17048E+00         1.22860E+00         5.13017E+00         1.00000E+00         2.94284E-07         5.13017E+00         1.42471E+00         3.70546E+00
+          1.95537E-02         1.53080E-02        -1.89910E-02         1.22845E+00         1.18115E+00         1.22860E+00         5.03879E+00         1.00000E+00         3.01796E-07         5.03879E+00         1.33223E+00         3.70656E+00
+          1.95537E-02         1.54778E-02        -1.91552E-02         1.22845E+00         1.19182E+00         1.22860E+00         4.95359E+00         1.00000E+00         3.09556E-07         4.95359E+00         1.24419E+00         3.70940E+00
+          1.95537E-02         1.56476E-02        -1.93213E-02         1.22844E+00         1.20249E+00         1.22860E+00         4.87386E+00         1.00000E+00         3.17563E-07         4.87386E+00         1.16061E+00         3.71325E+00
+          1.95537E-02         1.58175E-02        -1.94891E-02         1.22844E+00         1.21317E+00         1.22859E+00         4.79897E+00         1.00000E+00         3.25815E-07         4.79897E+00         1.08153E+00         3.71744E+00
+          1.95537E-02         1.59873E-02        -1.96588E-02         1.22844E+00         1.22384E+00         1.22859E+00         4.72831E+00         1.00000E+00         3.34309E-07         4.72831E+00         1.00696E+00         3.72135E+00
+          1.95537E-02         1.61571E-02        -1.98303E-02         1.22843E+00         1.23451E+00         1.22859E+00         4.66131E+00         1.00000E+00         3.43038E-07         4.66131E+00         9.36902E-01         3.72441E+00
+          1.95537E-02         1.63270E-02        -2.00036E-02         1.22843E+00         1.24518E+00         1.22859E+00         4.59747E+00         1.00000E+00         3.51998E-07         4.59747E+00         8.71332E-01         3.72614E+00
+          1.95537E-02         1.64968E-02        -2.01787E-02         1.22843E+00         1.25585E+00         1.22859E+00         4.53630E+00         1.00000E+00         3.61182E-07         4.53630E+00         8.10228E-01         3.72607E+00
+          1.95537E-02         1.66666E-02        -2.03556E-02         1.22842E+00         1.26652E+00         1.22859E+00         4.47739E+00         1.00000E+00         3.70580E-07         4.47739E+00         7.53549E-01         3.72384E+00
+          1.95537E-02         1.68364E-02        -2.05344E-02         1.22842E+00         1.27719E+00         1.22859E+00         4.42034E+00         1.00000E+00         3.80184E-07         4.42034E+00         7.01244E-01         3.71910E+00
+          1.95537E-02         1.70063E-02        -2.07149E-02         1.22842E+00         1.28786E+00         1.22859E+00         4.36482E+00         1.00000E+00         3.89985E-07         4.36482E+00         6.53247E-01         3.71157E+00
+          1.95537E-02         1.71761E-02        -2.08973E-02         1.22841E+00         1.29853E+00         1.22859E+00         4.31051E+00         1.00000E+00         3.99972E-07         4.31051E+00         6.09485E-01         3.70103E+00
+          1.95537E-02         1.73459E-02        -2.10815E-02         1.22841E+00         1.30920E+00         1.22859E+00         4.25715E+00         1.00000E+00         4.10134E-07         4.25715E+00         5.69872E-01         3.68728E+00
+          1.95537E-02         1.75158E-02        -2.12675E-02         1.22841E+00         1.31987E+00         1.22859E+00         4.20452E+00         1.00000E+00         4.20461E-07         4.20452E+00         5.34312E-01         3.67021E+00
+          1.95537E-02         1.76856E-02        -2.14553E-02         1.22840E+00         1.33054E+00         1.22859E+00         4.15241E+00         1.00000E+00         4.30943E-07         4.15241E+00         5.02701E-01         3.64971E+00
+          1.95537E-02         1.78554E-02        -2.16449E-02         1.22840E+00         1.34121E+00         1.22859E+00         4.10068E+00         1.00000E+00         4.41567E-07         4.10068E+00         4.74924E-01         3.62575E+00
+          1.95537E-02         1.80252E-02        -2.18363E-02         1.22839E+00         1.35188E+00         1.22859E+00         4.04918E+00         1.00000E+00         4.52324E-07         4.04918E+00         4.50860E-01         3.59832E+00
+          1.95537E-02         1.81951E-02        -2.20296E-02         1.22839E+00         1.36255E+00         1.22859E+00         3.99784E+00         1.00000E+00         4.63204E-07         3.99784E+00         4.30379E-01         3.56746E+00
+          1.95537E-02         1.83649E-02        -2.22246E-02         1.22839E+00         1.37322E+00         1.22859E+00         3.94658E+00         1.00000E+00         4.74197E-07         3.94658E+00         4.13344E-01         3.53324E+00
+          1.95537E-02         1.85347E-02        -2.24215E-02         1.22838E+00         1.38389E+00         1.22859E+00         3.89536E+00         1.00000E+00         4.85295E-07         3.89536E+00         3.99613E-01         3.49575E+00
+          1.95537E-02         1.87045E-02        -2.26202E-02         1.22838E+00         1.39457E+00         1.22859E+00         3.84417E+00         1.00000E+00         4.96491E-07         3.84417E+00         3.89036E-01         3.45513E+00
+          1.95537E-02         1.88744E-02        -2.28206E-02         1.22838E+00         1.40524E+00         1.22859E+00         3.79301E+00         1.00000E+00         5.07780E-07         3.79301E+00         3.81460E-01         3.41155E+00
+          1.95537E-02         1.90442E-02        -2.30229E-02         1.22837E+00         1.41591E+00         1.22859E+00         3.74192E+00         1.00000E+00         5.19156E-07         3.74192E+00         3.76728E-01         3.36519E+00
+          1.95537E-02         1.92140E-02        -2.32271E-02         1.22837E+00         1.42658E+00         1.22859E+00         3.69093E+00         1.00000E+00         5.30616E-07         3.69093E+00         3.74678E-01         3.31626E+00
+          1.95537E-02         1.93839E-02        -2.34330E-02         1.22836E+00         1.43725E+00         1.22859E+00         3.64013E+00         1.00000E+00         5.42160E-07         3.64013E+00         3.75145E-01         3.26499E+00
+          1.95537E-02         1.95537E-02        -2.36407E-02         1.22836E+00         1.44792E+00         1.22859E+00         3.58959E+00         1.00000E+00         5.53790E-07         3.58959E+00         3.77962E-01         3.21163E+00
+          1.95537E-02         1.97235E-02        -2.38503E-02         1.22835E+00         1.45859E+00         1.22859E+00         3.53940E+00         1.00000E+00         5.65506E-07         3.53940E+00         3.82962E-01         3.15644E+00
+          1.95537E-02         1.98933E-02        -2.40617E-02         1.22835E+00         1.46926E+00         1.22859E+00         3.48967E+00         1.00000E+00         5.77316E-07         3.48967E+00         3.89975E-01         3.09969E+00
+          1.95537E-02         2.00632E-02        -2.42748E-02         1.22835E+00         1.47993E+00         1.22859E+00         3.44051E+00         1.00000E+00         5.89226E-07         3.44051E+00         3.98831E-01         3.04168E+00
+          1.95537E-02         2.02330E-02        -2.44898E-02         1.22834E+00         1.49060E+00         1.22859E+00         3.39204E+00         1.00000E+00         6.01247E-07         3.39204E+00         4.09360E-01         2.98268E+00
+          1.95537E-02         2.04028E-02        -2.47066E-02         1.22834E+00         1.50127E+00         1.22859E+00         3.34440E+00         1.00000E+00         6.13390E-07         3.34440E+00         4.21394E-01         2.92301E+00
+          1.95537E-02         2.05726E-02        -2.49253E-02         1.22833E+00         1.51194E+00         1.22859E+00         3.29772E+00         1.00000E+00         6.25670E-07         3.29772E+00         4.34766E-01         2.86295E+00
+          1.95537E-02         2.07425E-02        -2.51457E-02         1.22833E+00         1.52261E+00         1.22859E+00         3.25212E+00         1.00000E+00         6.38104E-07         3.25212E+00         4.49310E-01         2.80281E+00
+          1.95537E-02         2.09123E-02        -2.53679E-02         1.22833E+00         1.53328E+00         1.22859E+00         3.20775E+00         1.00000E+00         6.50710E-07         3.20775E+00         4.64864E-01         2.74289E+00
+          1.95537E-02         2.10821E-02        -2.55920E-02         1.22832E+00         1.54395E+00         1.22859E+00         3.16474E+00         1.00000E+00         6.63510E-07         3.16474E+00         4.81267E-01         2.68347E+00
+          1.95537E-02         2.12520E-02        -2.58179E-02         1.22832E+00         1.55462E+00         1.22859E+00         3.12321E+00         1.00000E+00         6.76527E-07         3.12321E+00         4.98365E-01         2.62485E+00
+          1.95537E-02         2.14218E-02        -2.60456E-02         1.22831E+00         1.56529E+00         1.22859E+00         3.08331E+00         1.00000E+00         6.89784E-07         3.08331E+00         5.16004E-01         2.56730E+00
+          1.95537E-02         2.15916E-02        -2.62751E-02         1.22831E+00         1.57596E+00         1.22859E+00         3.04514E+00         1.00000E+00         7.03307E-07         3.04514E+00         5.34036E-01         2.51110E+00
+          1.95537E-02         2.17614E-02        -2.65064E-02         1.22830E+00         1.58664E+00         1.22859E+00         3.00883E+00         1.00000E+00         7.17123E-07         3.00883E+00         5.52319E-01         2.45651E+00
+          1.95537E-02         2.19313E-02        -2.67395E-02         1.22830E+00         1.59731E+00         1.22859E+00         2.97448E+00         1.00000E+00         7.31260E-07         2.97448E+00         5.70715E-01         2.40377E+00
+          1.95537E-02         2.21011E-02        -2.69744E-02         1.22829E+00         1.60798E+00         1.22859E+00         2.94220E+00         1.00000E+00         7.45745E-07         2.94220E+00         5.89091E-01         2.35311E+00
+          1.95537E-02         2.22709E-02        -2.72112E-02         1.22829E+00         1.61865E+00         1.22859E+00         2.91208E+00         1.00000E+00         7.60604E-07         2.91208E+00         6.07322E-01         2.30476E+00
+          1.95537E-02         2.24407E-02        -2.74497E-02         1.22828E+00         1.62932E+00         1.22859E+00         2.88419E+00         1.00000E+00         7.75866E-07         2.88419E+00         6.25285E-01         2.25891E+00
+          1.95537E-02         2.26106E-02        -2.76901E-02         1.22828E+00         1.63999E+00         1.22859E+00         2.85861E+00         1.00000E+00         7.91556E-07         2.85861E+00         6.42868E-01         2.21574E+00
+          1.95537E-02         2.27804E-02        -2.79323E-02         1.22828E+00         1.65066E+00         1.22859E+00         2.83540E+00         1.00000E+00         8.07697E-07         2.83540E+00         6.59962E-01         2.17543E+00
+          1.95537E-02         2.29502E-02        -2.81763E-02         1.22827E+00         1.66133E+00         1.22859E+00         2.81459E+00         1.00000E+00         8.24313E-07         2.81459E+00         6.76468E-01         2.13813E+00
+          1.95537E-02         2.31201E-02        -2.84221E-02         1.22827E+00         1.67200E+00         1.22859E+00         2.79623E+00         1.00000E+00         8.41422E-07         2.79623E+00         6.92290E-01         2.10394E+00
+          1.95537E-02         2.32899E-02        -2.86698E-02         1.22826E+00         1.68267E+00         1.22860E+00         2.78034E+00         1.00000E+00         8.59042E-07         2.78034E+00         7.07343E-01         2.07300E+00
+          1.95537E-02         2.34597E-02        -2.89192E-02         1.22826E+00         1.69334E+00         1.22860E+00         2.76692E+00         1.00000E+00         8.77187E-07         2.76692E+00         7.21545E-01         2.04538E+00
+          1.95537E-02         2.36295E-02        -2.91705E-02         1.22825E+00         1.70401E+00         1.22860E+00         2.75597E+00         1.00000E+00         8.95866E-07         2.75597E+00         7.34825E-01         2.02114E+00
+          1.95537E-02         2.37994E-02        -2.94235E-02         1.22825E+00         1.71468E+00         1.22860E+00         2.74746E+00         1.00000E+00         9.15086E-07         2.74746E+00         7.47116E-01         2.00034E+00
+          1.95537E-02         2.39692E-02        -2.96784E-02         1.22824E+00         1.72535E+00         1.22860E+00         2.74137E+00         1.00000E+00         9.34850E-07         2.74137E+00         7.58361E-01         1.98301E+00
+          1.95537E-02         2.41390E-02        -2.99351E-02         1.22824E+00         1.73602E+00         1.22860E+00         2.73765E+00         1.00000E+00         9.55155E-07         2.73765E+00         7.68508E-01         1.96914E+00
+          1.95537E-02         2.43088E-02        -3.01936E-02         1.22823E+00         1.74669E+00         1.22860E+00         2.73624E+00         1.00000E+00         9.75997E-07         2.73624E+00         7.77512E-01         1.95872E+00
+          1.95537E-02         2.44787E-02        -3.04539E-02         1.22823E+00         1.75736E+00         1.22860E+00         2.73707E+00         1.00000E+00         9.97364E-07         2.73707E+00         7.85337E-01         1.95173E+00
+          1.95537E-02         2.46485E-02        -3.07161E-02         1.22822E+00         1.76804E+00         1.22860E+00         2.74005E+00         1.00000E+00         1.01924E-06         2.74005E+00         7.91952E-01         1.94810E+00
+          1.95537E-02         2.48183E-02        -3.09800E-02         1.22822E+00         1.77871E+00         1.22861E+00         2.74510E+00         1.00000E+00         1.04162E-06         2.74510E+00         7.97332E-01         1.94776E+00
+          1.95537E-02         2.49882E-02        -3.12458E-02         1.22821E+00         1.78938E+00         1.22861E+00         2.75210E+00         1.00000E+00         1.06446E-06         2.75210E+00         8.01462E-01         1.95064E+00
+          1.95537E-02         2.51580E-02        -3.15134E-02         1.22821E+00         1.80005E+00         1.22861E+00         2.76094E+00         1.00000E+00         1.08775E-06         2.76094E+00         8.04330E-01         1.95661E+00
+          1.95537E-02         2.53278E-02        -3.17828E-02         1.22820E+00         1.81072E+00         1.22861E+00         2.77148E+00         1.00000E+00         1.11145E-06         2.77148E+00         8.05931E-01         1.96555E+00
+          1.95537E-02         2.54976E-02        -3.20540E-02         1.22819E+00         1.82139E+00         1.22861E+00         2.78360E+00         1.00000E+00         1.13554E-06         2.78360E+00         8.06266E-01         1.97734E+00
+          1.95537E-02         2.56675E-02        -3.23270E-02         1.22819E+00         1.83206E+00         1.22861E+00         2.79715E+00         1.00000E+00         1.15998E-06         2.79715E+00         8.05344E-01         1.99181E+00
+          1.95537E-02         2.58373E-02        -3.26018E-02         1.22818E+00         1.84273E+00         1.22862E+00         2.81198E+00         1.00000E+00         1.18473E-06         2.81198E+00         8.03176E-01         2.00880E+00
+          1.95537E-02         2.60071E-02        -3.28785E-02         1.22818E+00         1.85340E+00         1.22862E+00         2.82792E+00         1.00000E+00         1.20976E-06         2.82792E+00         7.99779E-01         2.02814E+00
+          1.95537E-02         2.61769E-02        -3.31569E-02         1.22817E+00         1.86407E+00         1.22862E+00         2.84481E+00         1.00000E+00         1.23502E-06         2.84481E+00         7.95177E-01         2.04963E+00
+          1.97235E-02         8.72665E-04        -1.18636E-02         1.23926E+00         2.74155E-01         1.23932E+00         1.10264E+02         1.00000E+00         6.06366E-08         1.10264E+02         4.01719E+00         1.06247E+02
+          1.97235E-02         1.04249E-03        -1.18739E-02         1.23926E+00         2.84826E-01         1.23932E+00         1.08293E+02         1.00000E+00         6.05360E-08         1.08293E+02         4.13517E+00         1.04157E+02
+          1.97235E-02         1.21232E-03        -1.18859E-02         1.23926E+00         2.95496E-01         1.23932E+00         1.06281E+02         1.00000E+00         6.04385E-08         1.06281E+02         4.25383E+00         1.02027E+02
+          1.97235E-02         1.38215E-03        -1.18997E-02         1.23926E+00         3.06167E-01         1.23932E+00         1.04232E+02         1.00000E+00         6.03456E-08         1.04232E+02         4.37279E+00         9.98594E+01
+          1.97235E-02         1.55197E-03        -1.19154E-02         1.23926E+00         3.16838E-01         1.23932E+00         1.02150E+02         1.00000E+00         6.02590E-08         1.02150E+02         4.49169E+00         9.76583E+01
+          1.97235E-02         1.72180E-03        -1.19328E-02         1.23926E+00         3.27508E-01         1.23932E+00         1.00038E+02         1.00000E+00         6.01806E-08         1.00038E+02         4.61019E+00         9.54274E+01
+          1.97235E-02         1.89163E-03        -1.19521E-02         1.23926E+00         3.38179E-01         1.23932E+00         9.78985E+01         1.00000E+00         6.01125E-08         9.78985E+01         4.72792E+00         9.31706E+01
+          1.97235E-02         2.06146E-03        -1.19732E-02         1.23926E+00         3.48849E-01         1.23932E+00         9.57360E+01         1.00000E+00         6.00569E-08         9.57360E+01         4.84453E+00         9.08915E+01
+          1.97235E-02         2.23128E-03        -1.19961E-02         1.23926E+00         3.59520E-01         1.23932E+00         9.35535E+01         1.00000E+00         6.00163E-08         9.35535E+01         4.95967E+00         8.85939E+01
+          1.97235E-02         2.40111E-03        -1.20208E-02         1.23926E+00         3.70190E-01         1.23932E+00         9.13545E+01         1.00000E+00         5.99932E-08         9.13545E+01         5.07300E+00         8.62815E+01
+          1.97235E-02         2.57094E-03        -1.20473E-02         1.23926E+00         3.80861E-01         1.23932E+00         8.91421E+01         1.00000E+00         5.99904E-08         8.91421E+01         5.18417E+00         8.39580E+01
+          1.97235E-02         2.74077E-03        -1.20757E-02         1.23926E+00         3.91532E-01         1.23932E+00         8.69199E+01         1.00000E+00         6.00107E-08         8.69199E+01         5.29285E+00         8.16270E+01
+          1.97235E-02         2.91059E-03        -1.21058E-02         1.23926E+00         4.02202E-01         1.23932E+00         8.46909E+01         1.00000E+00         6.00572E-08         8.46909E+01         5.39872E+00         7.92922E+01
+          1.97235E-02         3.08042E-03        -1.21378E-02         1.23926E+00         4.12873E-01         1.23932E+00         8.24585E+01         1.00000E+00         6.01330E-08         8.24585E+01         5.50146E+00         7.69570E+01
+          1.97235E-02         3.25025E-03        -1.21715E-02         1.23926E+00         4.23543E-01         1.23932E+00         8.02258E+01         1.00000E+00         6.02412E-08         8.02258E+01         5.60076E+00         7.46250E+01
+          1.97235E-02         3.42008E-03        -1.22071E-02         1.23926E+00         4.34214E-01         1.23932E+00         7.79959E+01         1.00000E+00         6.03852E-08         7.79959E+01         5.69632E+00         7.22996E+01
+          1.97235E-02         3.58990E-03        -1.22445E-02         1.23926E+00         4.44884E-01         1.23932E+00         7.57718E+01         1.00000E+00         6.05682E-08         7.57718E+01         5.78787E+00         6.99840E+01
+          1.97235E-02         3.75973E-03        -1.22837E-02         1.23926E+00         4.55555E-01         1.23932E+00         7.35566E+01         1.00000E+00         6.07936E-08         7.35566E+01         5.87513E+00         6.76815E+01
+          1.97235E-02         3.92956E-03        -1.23247E-02         1.23925E+00         4.66225E-01         1.23932E+00         7.13531E+01         1.00000E+00         6.10645E-08         7.13531E+01         5.95783E+00         6.53953E+01
+          1.97235E-02         4.09939E-03        -1.23676E-02         1.23925E+00         4.76896E-01         1.23932E+00         6.91641E+01         1.00000E+00         6.13842E-08         6.91641E+01         6.03574E+00         6.31283E+01
+          1.97235E-02         4.26921E-03        -1.24122E-02         1.23925E+00         4.87567E-01         1.23932E+00         6.69922E+01         1.00000E+00         6.17558E-08         6.69922E+01         6.10862E+00         6.08836E+01
+          1.97235E-02         4.43904E-03        -1.24587E-02         1.23925E+00         4.98237E-01         1.23931E+00         6.48402E+01         1.00000E+00         6.21821E-08         6.48402E+01         6.17626E+00         5.86640E+01
+          1.97235E-02         4.60887E-03        -1.25069E-02         1.23925E+00         5.08908E-01         1.23931E+00         6.27105E+01         1.00000E+00         6.26658E-08         6.27105E+01         6.23844E+00         5.64721E+01
+          1.97235E-02         4.77869E-03        -1.25570E-02         1.23925E+00         5.19578E-01         1.23931E+00         6.06055E+01         1.00000E+00         6.32095E-08         6.06055E+01         6.29499E+00         5.43105E+01
+          1.97235E-02         4.94852E-03        -1.26089E-02         1.23925E+00         5.30249E-01         1.23931E+00         5.85276E+01         1.00000E+00         6.38154E-08         5.85276E+01         6.34574E+00         5.21818E+01
+          1.97235E-02         5.11835E-03        -1.26626E-02         1.23925E+00         5.40919E-01         1.23931E+00         5.64788E+01         1.00000E+00         6.44853E-08         5.64788E+01         6.39054E+00         5.00882E+01
+          1.97235E-02         5.28818E-03        -1.27181E-02         1.23925E+00         5.51590E-01         1.23931E+00         5.44612E+01         1.00000E+00         6.52209E-08         5.44612E+01         6.42925E+00         4.80320E+01
+          1.97235E-02         5.45800E-03        -1.27754E-02         1.23925E+00         5.62261E-01         1.23931E+00         5.24769E+01         1.00000E+00         6.60235E-08         5.24769E+01         6.46176E+00         4.60151E+01
+          1.97235E-02         5.62783E-03        -1.28346E-02         1.23924E+00         5.72931E-01         1.23931E+00         5.05276E+01         1.00000E+00         6.68938E-08         5.05276E+01         6.48796E+00         4.40396E+01
+          1.97235E-02         5.79766E-03        -1.28955E-02         1.23924E+00         5.83602E-01         1.23931E+00         4.86150E+01         1.00000E+00         6.78325E-08         4.86150E+01         6.50778E+00         4.21072E+01
+          1.97235E-02         5.96749E-03        -1.29583E-02         1.23924E+00         5.94272E-01         1.23931E+00         4.67407E+01         1.00000E+00         6.88397E-08         4.67407E+01         6.52116E+00         4.02196E+01
+          1.97235E-02         6.13731E-03        -1.30228E-02         1.23924E+00         6.04943E-01         1.23931E+00         4.49062E+01         1.00000E+00         6.99151E-08         4.49062E+01         6.52804E+00         3.83782E+01
+          1.97235E-02         6.30714E-03        -1.30892E-02         1.23924E+00         6.15613E-01         1.23931E+00         4.31128E+01         1.00000E+00         7.10582E-08         4.31128E+01         6.52840E+00         3.65844E+01
+          1.97235E-02         6.47697E-03        -1.31574E-02         1.23924E+00         6.26284E-01         1.23931E+00         4.13618E+01         1.00000E+00         7.22680E-08         4.13618E+01         6.52225E+00         3.48395E+01
+          1.97235E-02         6.64680E-03        -1.32274E-02         1.23924E+00         6.36955E-01         1.23931E+00         3.96540E+01         1.00000E+00         7.35433E-08         3.96540E+01         6.50957E+00         3.31445E+01
+          1.97235E-02         6.81662E-03        -1.32992E-02         1.23924E+00         6.47625E-01         1.23931E+00         3.79907E+01         1.00000E+00         7.48824E-08         3.79907E+01         6.49042E+00         3.15003E+01
+          1.97235E-02         6.98645E-03        -1.33729E-02         1.23923E+00         6.58296E-01         1.23931E+00         3.63725E+01         1.00000E+00         7.62837E-08         3.63725E+01         6.46482E+00         2.99076E+01
+          1.97235E-02         7.15628E-03        -1.34483E-02         1.23923E+00         6.68966E-01         1.23931E+00         3.48001E+01         1.00000E+00         7.77449E-08         3.48001E+01         6.43285E+00         2.83673E+01
+          1.97235E-02         7.32611E-03        -1.35256E-02         1.23923E+00         6.79637E-01         1.23931E+00         3.32743E+01         1.00000E+00         7.92638E-08         3.32743E+01         6.39458E+00         2.68797E+01
+          1.97235E-02         7.49593E-03        -1.36046E-02         1.23923E+00         6.90307E-01         1.23930E+00         3.17953E+01         1.00000E+00         8.08380E-08         3.17953E+01         6.35011E+00         2.54452E+01
+          1.97235E-02         7.66576E-03        -1.36855E-02         1.23923E+00         7.00978E-01         1.23930E+00         3.03637E+01         1.00000E+00         8.24648E-08         3.03637E+01         6.29955E+00         2.40641E+01
+          1.97235E-02         7.83559E-03        -1.37682E-02         1.23923E+00         7.11649E-01         1.23930E+00         2.89795E+01         1.00000E+00         8.41415E-08         2.89795E+01         6.24304E+00         2.27365E+01
+          1.97235E-02         8.00542E-03        -1.38527E-02         1.23922E+00         7.22319E-01         1.23930E+00         2.76430E+01         1.00000E+00         8.58655E-08         2.76430E+01         6.18072E+00         2.14623E+01
+          1.97235E-02         8.17524E-03        -1.39390E-02         1.23922E+00         7.32990E-01         1.23930E+00         2.63541E+01         1.00000E+00         8.76340E-08         2.63541E+01         6.11275E+00         2.02414E+01
+          1.97235E-02         8.34507E-03        -1.40271E-02         1.23922E+00         7.43660E-01         1.23930E+00         2.51128E+01         1.00000E+00         8.94443E-08         2.51128E+01         6.03929E+00         1.90735E+01
+          1.97235E-02         8.51490E-03        -1.41171E-02         1.23922E+00         7.54331E-01         1.23930E+00         2.39189E+01         1.00000E+00         9.12938E-08         2.39189E+01         5.96055E+00         1.79583E+01
+          1.97235E-02         8.68473E-03        -1.42088E-02         1.23922E+00         7.65001E-01         1.23930E+00         2.27720E+01         1.00000E+00         9.31800E-08         2.27720E+01         5.87671E+00         1.68953E+01
+          1.97235E-02         8.85455E-03        -1.43024E-02         1.23922E+00         7.75672E-01         1.23930E+00         2.16718E+01         1.00000E+00         9.51006E-08         2.16718E+01         5.78799E+00         1.58838E+01
+          1.97235E-02         9.02438E-03        -1.43978E-02         1.23921E+00         7.86343E-01         1.23930E+00         2.06178E+01         1.00000E+00         9.70534E-08         2.06178E+01         5.69460E+00         1.49232E+01
+          1.97235E-02         9.19421E-03        -1.44950E-02         1.23921E+00         7.97013E-01         1.23930E+00         1.96094E+01         1.00000E+00         9.90368E-08         1.96094E+01         5.59679E+00         1.40126E+01
+          1.97235E-02         9.36403E-03        -1.45940E-02         1.23921E+00         8.07684E-01         1.23930E+00         1.86461E+01         1.00000E+00         1.01049E-07         1.86461E+01         5.49479E+00         1.31513E+01
+          1.97235E-02         9.53386E-03        -1.46948E-02         1.23921E+00         8.18354E-01         1.23930E+00         1.77270E+01         1.00000E+00         1.03089E-07         1.77270E+01         5.38886E+00         1.23381E+01
+          1.97235E-02         9.70369E-03        -1.47974E-02         1.23921E+00         8.29025E-01         1.23929E+00         1.68514E+01         1.00000E+00         1.05157E-07         1.68514E+01         5.27925E+00         1.15721E+01
+          1.97235E-02         9.87352E-03        -1.49018E-02         1.23920E+00         8.39695E-01         1.23929E+00         1.60184E+01         1.00000E+00         1.07251E-07         1.60184E+01         5.16623E+00         1.08522E+01
+          1.97235E-02         1.00433E-02        -1.50081E-02         1.23920E+00         8.50366E-01         1.23929E+00         1.52271E+01         1.00000E+00         1.09372E-07         1.52271E+01         5.05007E+00         1.01770E+01
+          1.97235E-02         1.02132E-02        -1.51161E-02         1.23920E+00         8.61037E-01         1.23929E+00         1.44765E+01         1.00000E+00         1.11522E-07         1.44765E+01         4.93104E+00         9.54546E+00
+          1.97235E-02         1.03830E-02        -1.52260E-02         1.23920E+00         8.71707E-01         1.23929E+00         1.37656E+01         1.00000E+00         1.13700E-07         1.37656E+01         4.80943E+00         8.95616E+00
+          1.97235E-02         1.05528E-02        -1.53377E-02         1.23920E+00         8.82378E-01         1.23929E+00         1.30933E+01         1.00000E+00         1.15910E-07         1.30933E+01         4.68552E+00         8.40776E+00
+          1.97235E-02         1.07227E-02        -1.54512E-02         1.23919E+00         8.93048E-01         1.23929E+00         1.24584E+01         1.00000E+00         1.18155E-07         1.24584E+01         4.55959E+00         7.89884E+00
+          1.97235E-02         1.08925E-02        -1.55665E-02         1.23919E+00         9.03719E-01         1.23929E+00         1.18599E+01         1.00000E+00         1.20436E-07         1.18599E+01         4.43194E+00         7.42796E+00
+          1.97235E-02         1.10623E-02        -1.56836E-02         1.23919E+00         9.14389E-01         1.23929E+00         1.12965E+01         1.00000E+00         1.22759E-07         1.12965E+01         4.30286E+00         6.99362E+00
+          1.97235E-02         1.12321E-02        -1.58025E-02         1.23919E+00         9.25060E-01         1.23929E+00         1.07669E+01         1.00000E+00         1.25129E-07         1.07669E+01         4.17262E+00         6.59432E+00
+          1.97235E-02         1.14020E-02        -1.59233E-02         1.23918E+00         9.35731E-01         1.23929E+00         1.02700E+01         1.00000E+00         1.27551E-07         1.02700E+01         4.04151E+00         6.22853E+00
+          1.97235E-02         1.15718E-02        -1.60458E-02         1.23918E+00         9.46401E-01         1.23929E+00         9.80451E+00         1.00000E+00         1.30031E-07         9.80451E+00         3.90983E+00         5.89468E+00
+          1.97235E-02         1.17416E-02        -1.61702E-02         1.23918E+00         9.57072E-01         1.23928E+00         9.36908E+00         1.00000E+00         1.32576E-07         9.36908E+00         3.77785E+00         5.59123E+00
+          1.97235E-02         1.19114E-02        -1.62964E-02         1.23918E+00         9.67742E-01         1.23928E+00         8.96245E+00         1.00000E+00         1.35194E-07         8.96245E+00         3.64584E+00         5.31661E+00
+          1.97235E-02         1.20813E-02        -1.64244E-02         1.23917E+00         9.78413E-01         1.23928E+00         8.58332E+00         1.00000E+00         1.37893E-07         8.58332E+00         3.51408E+00         5.06924E+00
+          1.97235E-02         1.22511E-02        -1.65542E-02         1.23917E+00         9.89083E-01         1.23928E+00         8.23041E+00         1.00000E+00         1.40682E-07         8.23041E+00         3.38285E+00         4.84757E+00
+          1.97235E-02         1.24209E-02        -1.66858E-02         1.23917E+00         9.99754E-01         1.23928E+00         7.90242E+00         1.00000E+00         1.43570E-07         7.90242E+00         3.25239E+00         4.65004E+00
+          1.97235E-02         1.25908E-02        -1.68192E-02         1.23917E+00         1.01042E+00         1.23928E+00         7.59807E+00         1.00000E+00         1.46566E-07         7.59807E+00         3.12296E+00         4.47511E+00
+          1.97235E-02         1.27606E-02        -1.69545E-02         1.23916E+00         1.02110E+00         1.23928E+00         7.31607E+00         1.00000E+00         1.49681E-07         7.31607E+00         2.99481E+00         4.32126E+00
+          1.97235E-02         1.29304E-02        -1.70915E-02         1.23916E+00         1.03177E+00         1.23928E+00         7.05518E+00         1.00000E+00         1.52923E-07         7.05518E+00         2.86818E+00         4.18700E+00
+          1.97235E-02         1.31002E-02        -1.72304E-02         1.23916E+00         1.04244E+00         1.23928E+00         6.81414E+00         1.00000E+00         1.56304E-07         6.81414E+00         2.74329E+00         4.07085E+00
+          1.97235E-02         1.32701E-02        -1.73711E-02         1.23916E+00         1.05311E+00         1.23928E+00         6.59174E+00         1.00000E+00         1.59832E-07         6.59174E+00         2.62037E+00         3.97137E+00
+          1.97235E-02         1.34399E-02        -1.75136E-02         1.23915E+00         1.06378E+00         1.23928E+00         6.38678E+00         1.00000E+00         1.63516E-07         6.38678E+00         2.49962E+00         3.88716E+00
+          1.97235E-02         1.36097E-02        -1.76579E-02         1.23915E+00         1.07445E+00         1.23928E+00         6.19809E+00         1.00000E+00         1.67366E-07         6.19809E+00         2.38125E+00         3.81684E+00
+          1.97235E-02         1.37795E-02        -1.78040E-02         1.23915E+00         1.08512E+00         1.23927E+00         6.02453E+00         1.00000E+00         1.71390E-07         6.02453E+00         2.26544E+00         3.75909E+00
+          1.97235E-02         1.39494E-02        -1.79519E-02         1.23914E+00         1.09579E+00         1.23927E+00         5.86500E+00         1.00000E+00         1.75595E-07         5.86500E+00         2.15237E+00         3.71263E+00
+          1.97235E-02         1.41192E-02        -1.81016E-02         1.23914E+00         1.10646E+00         1.23927E+00         5.71842E+00         1.00000E+00         1.79988E-07         5.71842E+00         2.04220E+00         3.67621E+00
+          1.97235E-02         1.42890E-02        -1.82532E-02         1.23914E+00         1.11713E+00         1.23927E+00         5.58375E+00         1.00000E+00         1.84574E-07         5.58375E+00         1.93510E+00         3.64865E+00
+          1.97235E-02         1.44589E-02        -1.84066E-02         1.23913E+00         1.12780E+00         1.23927E+00         5.45999E+00         1.00000E+00         1.89357E-07         5.45999E+00         1.83119E+00         3.62880E+00
+          1.97235E-02         1.46287E-02        -1.85617E-02         1.23913E+00         1.13847E+00         1.23927E+00         5.34619E+00         1.00000E+00         1.94340E-07         5.34619E+00         1.73061E+00         3.61558E+00
+          1.97235E-02         1.47985E-02        -1.87187E-02         1.23913E+00         1.14914E+00         1.23927E+00         5.24142E+00         1.00000E+00         1.99526E-07         5.24142E+00         1.63348E+00         3.60795E+00
+          1.97235E-02         1.49683E-02        -1.88775E-02         1.23913E+00         1.15981E+00         1.23927E+00         5.14482E+00         1.00000E+00         2.04914E-07         5.14482E+00         1.53989E+00         3.60493E+00
+          1.97235E-02         1.51382E-02        -1.90381E-02         1.23912E+00         1.17048E+00         1.23927E+00         5.05554E+00         1.00000E+00         2.10504E-07         5.05554E+00         1.44994E+00         3.60560E+00
+          1.97235E-02         1.53080E-02        -1.92006E-02         1.23912E+00         1.18115E+00         1.23927E+00         4.97280E+00         1.00000E+00         2.16294E-07         4.97280E+00         1.36371E+00         3.60909E+00
+          1.97235E-02         1.54778E-02        -1.93648E-02         1.23912E+00         1.19182E+00         1.23927E+00         4.89586E+00         1.00000E+00         2.22280E-07         4.89586E+00         1.28126E+00         3.61460E+00
+          1.97235E-02         1.56476E-02        -1.95308E-02         1.23911E+00         1.20249E+00         1.23927E+00         4.82401E+00         1.00000E+00         2.28457E-07         4.82401E+00         1.20264E+00         3.62137E+00
+          1.97235E-02         1.58175E-02        -1.96987E-02         1.23911E+00         1.21317E+00         1.23927E+00         4.75660E+00         1.00000E+00         2.34820E-07         4.75660E+00         1.12790E+00         3.62870E+00
+          1.97235E-02         1.59873E-02        -1.98684E-02         1.23911E+00         1.22384E+00         1.23927E+00         4.69302E+00         1.00000E+00         2.41361E-07         4.69302E+00         1.05706E+00         3.63597E+00
+          1.97235E-02         1.61571E-02        -2.00399E-02         1.23910E+00         1.23451E+00         1.23926E+00         4.63271E+00         1.00000E+00         2.48072E-07         4.63271E+00         9.90130E-01         3.64258E+00
+          1.97235E-02         1.63270E-02        -2.02132E-02         1.23910E+00         1.24518E+00         1.23926E+00         4.57515E+00         1.00000E+00         2.54945E-07         4.57515E+00         9.27120E-01         3.64803E+00
+          1.97235E-02         1.64968E-02        -2.03883E-02         1.23910E+00         1.25585E+00         1.23926E+00         4.51985E+00         1.00000E+00         2.61969E-07         4.51985E+00         8.68020E-01         3.65183E+00
+          1.97235E-02         1.66666E-02        -2.05652E-02         1.23909E+00         1.26652E+00         1.23926E+00         4.46639E+00         1.00000E+00         2.69134E-07         4.46639E+00         8.12808E-01         3.65358E+00
+          1.97235E-02         1.68364E-02        -2.07440E-02         1.23909E+00         1.27719E+00         1.23926E+00         4.41438E+00         1.00000E+00         2.76428E-07         4.41438E+00         7.61454E-01         3.65292E+00
+          1.97235E-02         1.70063E-02        -2.09245E-02         1.23909E+00         1.28786E+00         1.23926E+00         4.36346E+00         1.00000E+00         2.83842E-07         4.36346E+00         7.13914E-01         3.64955E+00
+          1.97235E-02         1.71761E-02        -2.11069E-02         1.23908E+00         1.29853E+00         1.23926E+00         4.31333E+00         1.00000E+00         2.91362E-07         4.31333E+00         6.70137E-01         3.64319E+00
+          1.97235E-02         1.73459E-02        -2.12910E-02         1.23908E+00         1.30920E+00         1.23926E+00         4.26372E+00         1.00000E+00         2.98978E-07         4.26372E+00         6.30061E-01         3.63366E+00
+          1.97235E-02         1.75158E-02        -2.14770E-02         1.23907E+00         1.31987E+00         1.23926E+00         4.21439E+00         1.00000E+00         3.06679E-07         4.21439E+00         5.93612E-01         3.62078E+00
+          1.97235E-02         1.76856E-02        -2.16648E-02         1.23907E+00         1.33054E+00         1.23926E+00         4.16516E+00         1.00000E+00         3.14453E-07         4.16516E+00         5.60710E-01         3.60445E+00
+          1.97235E-02         1.78554E-02        -2.18545E-02         1.23907E+00         1.34121E+00         1.23926E+00         4.11585E+00         1.00000E+00         3.22290E-07         4.11585E+00         5.31267E-01         3.58458E+00
+          1.97235E-02         1.80252E-02        -2.20459E-02         1.23906E+00         1.35188E+00         1.23926E+00         4.06634E+00         1.00000E+00         3.30181E-07         4.06634E+00         5.05184E-01         3.56116E+00
+          1.97235E-02         1.81951E-02        -2.22391E-02         1.23906E+00         1.36255E+00         1.23926E+00         4.01654E+00         1.00000E+00         3.38116E-07         4.01654E+00         4.82357E-01         3.53418E+00
+          1.97235E-02         1.83649E-02        -2.24342E-02         1.23906E+00         1.37322E+00         1.23926E+00         3.96637E+00         1.00000E+00         3.46089E-07         3.96637E+00         4.62674E-01         3.50370E+00
+          1.97235E-02         1.85347E-02        -2.26310E-02         1.23905E+00         1.38389E+00         1.23926E+00         3.91581E+00         1.00000E+00         3.54092E-07         3.91581E+00         4.46019E-01         3.46979E+00
+          1.97235E-02         1.87045E-02        -2.28297E-02         1.23905E+00         1.39457E+00         1.23926E+00         3.86483E+00         1.00000E+00         3.62121E-07         3.86483E+00         4.32266E-01         3.43256E+00
+          1.97235E-02         1.88744E-02        -2.30302E-02         1.23904E+00         1.40524E+00         1.23926E+00         3.81344E+00         1.00000E+00         3.70173E-07         3.81344E+00         4.21289E-01         3.39215E+00
+          1.97235E-02         1.90442E-02        -2.32325E-02         1.23904E+00         1.41591E+00         1.23926E+00         3.76169E+00         1.00000E+00         3.78247E-07         3.76169E+00         4.12954E-01         3.34874E+00
+          1.97235E-02         1.92140E-02        -2.34366E-02         1.23904E+00         1.42658E+00         1.23926E+00         3.70962E+00         1.00000E+00         3.86343E-07         3.70962E+00         4.07124E-01         3.30250E+00
+          1.97235E-02         1.93839E-02        -2.36426E-02         1.23903E+00         1.43725E+00         1.23926E+00         3.65731E+00         1.00000E+00         3.94465E-07         3.65731E+00         4.03659E-01         3.25365E+00
+          1.97235E-02         1.95537E-02        -2.38503E-02         1.23903E+00         1.44792E+00         1.23926E+00         3.60484E+00         1.00000E+00         4.02616E-07         3.60484E+00         4.02416E-01         3.20243E+00
+          1.97235E-02         1.97235E-02        -2.40598E-02         1.23902E+00         1.45859E+00         1.23926E+00         3.55232E+00         1.00000E+00         4.10805E-07         3.55232E+00         4.03251E-01         3.14907E+00
+          1.97235E-02         1.98933E-02        -2.42712E-02         1.23902E+00         1.46926E+00         1.23926E+00         3.49987E+00         1.00000E+00         4.19042E-07         3.49987E+00         4.06015E-01         3.09385E+00
+          1.97235E-02         2.00632E-02        -2.44844E-02         1.23902E+00         1.47993E+00         1.23926E+00         3.44760E+00         1.00000E+00         4.27338E-07         3.44760E+00         4.10563E-01         3.03704E+00
+          1.97235E-02         2.02330E-02        -2.46994E-02         1.23901E+00         1.49060E+00         1.23926E+00         3.39566E+00         1.00000E+00         4.35709E-07         3.39566E+00         4.16746E-01         2.97892E+00
+          1.97235E-02         2.04028E-02        -2.49162E-02         1.23901E+00         1.50127E+00         1.23926E+00         3.34419E+00         1.00000E+00         4.44172E-07         3.34419E+00         4.24416E-01         2.91977E+00
+          1.97235E-02         2.05726E-02        -2.51348E-02         1.23900E+00         1.51194E+00         1.23926E+00         3.29332E+00         1.00000E+00         4.52746E-07         3.29332E+00         4.33426E-01         2.85990E+00
+          1.97235E-02         2.07425E-02        -2.53552E-02         1.23900E+00         1.52261E+00         1.23926E+00         3.24322E+00         1.00000E+00         4.61452E-07         3.24322E+00         4.43630E-01         2.79959E+00
+          1.97235E-02         2.09123E-02        -2.55775E-02         1.23899E+00         1.53328E+00         1.23926E+00         3.19404E+00         1.00000E+00         4.70316E-07         3.19404E+00         4.54882E-01         2.73916E+00
+          1.97235E-02         2.10821E-02        -2.58016E-02         1.23899E+00         1.54395E+00         1.23926E+00         3.14593E+00         1.00000E+00         4.79361E-07         3.14593E+00         4.67042E-01         2.67888E+00
+          1.97235E-02         2.12520E-02        -2.60274E-02         1.23898E+00         1.55462E+00         1.23926E+00         3.09903E+00         1.00000E+00         4.88614E-07         3.09903E+00         4.79970E-01         2.61906E+00
+          1.97235E-02         2.14218E-02        -2.62551E-02         1.23898E+00         1.56529E+00         1.23926E+00         3.05350E+00         1.00000E+00         4.98105E-07         3.05350E+00         4.93528E-01         2.55997E+00
+          1.97235E-02         2.15916E-02        -2.64846E-02         1.23898E+00         1.57596E+00         1.23926E+00         3.00949E+00         1.00000E+00         5.07861E-07         3.00949E+00         5.07583E-01         2.50190E+00
+          1.97235E-02         2.17614E-02        -2.67159E-02         1.23897E+00         1.58664E+00         1.23926E+00         2.96712E+00         1.00000E+00         5.17911E-07         2.96712E+00         5.22005E-01         2.44512E+00
+          1.97235E-02         2.19313E-02        -2.69490E-02         1.23897E+00         1.59731E+00         1.23926E+00         2.92654E+00         1.00000E+00         5.28284E-07         2.92654E+00         5.36671E-01         2.38987E+00
+          1.97235E-02         2.21011E-02        -2.71840E-02         1.23896E+00         1.60798E+00         1.23926E+00         2.88786E+00         1.00000E+00         5.39008E-07         2.88786E+00         5.51457E-01         2.33641E+00
+          1.97235E-02         2.22709E-02        -2.74207E-02         1.23896E+00         1.61865E+00         1.23926E+00         2.85121E+00         1.00000E+00         5.50110E-07         2.85121E+00         5.66249E-01         2.28496E+00
+          1.97235E-02         2.24407E-02        -2.76593E-02         1.23895E+00         1.62932E+00         1.23926E+00         2.81669E+00         1.00000E+00         5.61615E-07         2.81669E+00         5.80935E-01         2.23576E+00
+          1.97235E-02         2.26106E-02        -2.78997E-02         1.23895E+00         1.63999E+00         1.23926E+00         2.78440E+00         1.00000E+00         5.73546E-07         2.78440E+00         5.95410E-01         2.18899E+00
+          1.97235E-02         2.27804E-02        -2.81418E-02         1.23894E+00         1.65066E+00         1.23926E+00         2.75441E+00         1.00000E+00         5.85923E-07         2.75441E+00         6.09573E-01         2.14484E+00
+          1.97235E-02         2.29502E-02        -2.83859E-02         1.23894E+00         1.66133E+00         1.23926E+00         2.72680E+00         1.00000E+00         5.98764E-07         2.72680E+00         6.23330E-01         2.10347E+00
+          1.97235E-02         2.31201E-02        -2.86317E-02         1.23893E+00         1.67200E+00         1.23926E+00         2.70164E+00         1.00000E+00         6.12082E-07         2.70164E+00         6.36592E-01         2.06505E+00
+          1.97235E-02         2.32899E-02        -2.88793E-02         1.23893E+00         1.68267E+00         1.23926E+00         2.67897E+00         1.00000E+00         6.25886E-07         2.67897E+00         6.49277E-01         2.02969E+00
+          1.97235E-02         2.34597E-02        -2.91287E-02         1.23892E+00         1.69334E+00         1.23927E+00         2.65882E+00         1.00000E+00         6.40183E-07         2.65882E+00         6.61307E-01         1.99751E+00
+          1.97235E-02         2.36295E-02        -2.93800E-02         1.23892E+00         1.70401E+00         1.23927E+00         2.64121E+00         1.00000E+00         6.54973E-07         2.64121E+00         6.72613E-01         1.96860E+00
+          1.97235E-02         2.37994E-02        -2.96331E-02         1.23891E+00         1.71468E+00         1.23927E+00         2.62616E+00         1.00000E+00         6.70254E-07         2.62616E+00         6.83131E-01         1.94303E+00
+          1.97235E-02         2.39692E-02        -2.98879E-02         1.23891E+00         1.72535E+00         1.23927E+00         2.61365E+00         1.00000E+00         6.86018E-07         2.61365E+00         6.92802E-01         1.92085E+00
+          1.97235E-02         2.41390E-02        -3.01446E-02         1.23890E+00         1.73602E+00         1.23927E+00         2.60366E+00         1.00000E+00         7.02251E-07         2.60366E+00         7.01575E-01         1.90209E+00
+          1.97235E-02         2.43088E-02        -3.04031E-02         1.23890E+00         1.74669E+00         1.23927E+00         2.59617E+00         1.00000E+00         7.18940E-07         2.59617E+00         7.09405E-01         1.88677E+00
+          1.97235E-02         2.44787E-02        -3.06635E-02         1.23889E+00         1.75736E+00         1.23927E+00         2.59112E+00         1.00000E+00         7.36061E-07         2.59112E+00         7.16253E-01         1.87487E+00
+          1.97235E-02         2.46485E-02        -3.09256E-02         1.23889E+00         1.76804E+00         1.23927E+00         2.58846E+00         1.00000E+00         7.53592E-07         2.58846E+00         7.22085E-01         1.86638E+00
+          1.97235E-02         2.48183E-02        -3.11896E-02         1.23888E+00         1.77871E+00         1.23928E+00         2.58811E+00         1.00000E+00         7.71504E-07         2.58811E+00         7.26874E-01         1.86124E+00
+          1.97235E-02         2.49882E-02        -3.14553E-02         1.23888E+00         1.78938E+00         1.23928E+00         2.58999E+00         1.00000E+00         7.89765E-07         2.58999E+00         7.30600E-01         1.85939E+00
+          1.97235E-02         2.51580E-02        -3.17229E-02         1.23887E+00         1.80005E+00         1.23928E+00         2.59400E+00         1.00000E+00         8.08341E-07         2.59400E+00         7.33246E-01         1.86075E+00
+          1.97235E-02         2.53278E-02        -3.19923E-02         1.23887E+00         1.81072E+00         1.23928E+00         2.60003E+00         1.00000E+00         8.27197E-07         2.60003E+00         7.34803E-01         1.86522E+00
+          1.97235E-02         2.54976E-02        -3.22635E-02         1.23886E+00         1.82139E+00         1.23928E+00         2.60796E+00         1.00000E+00         8.46293E-07         2.60796E+00         7.35267E-01         1.87270E+00
+          1.97235E-02         2.56675E-02        -3.25365E-02         1.23886E+00         1.83206E+00         1.23928E+00         2.61768E+00         1.00000E+00         8.65589E-07         2.61768E+00         7.34639E-01         1.88304E+00
+          1.97235E-02         2.58373E-02        -3.28113E-02         1.23885E+00         1.84273E+00         1.23929E+00         2.62903E+00         1.00000E+00         8.85046E-07         2.62903E+00         7.32924E-01         1.89611E+00
+          1.97235E-02         2.60071E-02        -3.30880E-02         1.23885E+00         1.85340E+00         1.23929E+00         2.64188E+00         1.00000E+00         9.04621E-07         2.64188E+00         7.30133E-01         1.91174E+00
+          1.97235E-02         2.61769E-02        -3.33664E-02         1.23884E+00         1.86407E+00         1.23929E+00         2.65606E+00         1.00000E+00         9.24275E-07         2.65606E+00         7.26281E-01         1.92978E+00
+          1.98933E-02         8.72665E-04        -1.20750E-02         1.24993E+00         2.74155E-01         1.24999E+00         1.07579E+02         1.00000E+00         4.16868E-08         1.07579E+02         3.06545E+00         1.04514E+02
+          1.98933E-02         1.04249E-03        -1.20853E-02         1.24993E+00         2.84826E-01         1.24999E+00         1.05652E+02         1.00000E+00         4.15464E-08         1.05652E+02         3.17972E+00         1.02473E+02
+          1.98933E-02         1.21232E-03        -1.20973E-02         1.24993E+00         2.95496E-01         1.24999E+00         1.03686E+02         1.00000E+00         4.14088E-08         1.03686E+02         3.29488E+00         1.00391E+02
+          1.98933E-02         1.38215E-03        -1.21111E-02         1.24993E+00         3.06167E-01         1.24999E+00         1.01684E+02         1.00000E+00         4.12757E-08         1.01684E+02         3.41060E+00         9.82736E+01
+          1.98933E-02         1.55197E-03        -1.21268E-02         1.24993E+00         3.16838E-01         1.24999E+00         9.96492E+01         1.00000E+00         4.11487E-08         9.96492E+01         3.52657E+00         9.61226E+01
+          1.98933E-02         1.72180E-03        -1.21442E-02         1.24993E+00         3.27508E-01         1.24999E+00         9.75847E+01         1.00000E+00         4.10298E-08         9.75847E+01         3.64245E+00         9.39422E+01
+          1.98933E-02         1.89163E-03        -1.21635E-02         1.24993E+00         3.38179E-01         1.24999E+00         9.54940E+01         1.00000E+00         4.09209E-08         9.54940E+01         3.75792E+00         9.17360E+01
+          1.98933E-02         2.06146E-03        -1.21846E-02         1.24993E+00         3.48849E-01         1.24999E+00         9.33804E+01         1.00000E+00         4.08243E-08         9.33804E+01         3.87266E+00         8.95077E+01
+          1.98933E-02         2.23128E-03        -1.22075E-02         1.24993E+00         3.59520E-01         1.24999E+00         9.12472E+01         1.00000E+00         4.07422E-08         9.12472E+01         3.98634E+00         8.72609E+01
+          1.98933E-02         2.40111E-03        -1.22322E-02         1.24993E+00         3.70190E-01         1.24999E+00         8.90978E+01         1.00000E+00         4.06771E-08         8.90978E+01         4.09864E+00         8.49992E+01
+          1.98933E-02         2.57094E-03        -1.22587E-02         1.24993E+00         3.80861E-01         1.24999E+00         8.69354E+01         1.00000E+00         4.06315E-08         8.69354E+01         4.20926E+00         8.27261E+01
+          1.98933E-02         2.74077E-03        -1.22871E-02         1.24993E+00         3.91532E-01         1.24999E+00         8.47632E+01         1.00000E+00         4.06080E-08         8.47632E+01         4.31789E+00         8.04453E+01
+          1.98933E-02         2.91059E-03        -1.23172E-02         1.24993E+00         4.02202E-01         1.24999E+00         8.25844E+01         1.00000E+00         4.06094E-08         8.25844E+01         4.42422E+00         7.81602E+01
+          1.98933E-02         3.08042E-03        -1.23492E-02         1.24993E+00         4.12873E-01         1.24999E+00         8.04023E+01         1.00000E+00         4.06384E-08         8.04023E+01         4.52796E+00         7.58743E+01
+          1.98933E-02         3.25025E-03        -1.23829E-02         1.24993E+00         4.23543E-01         1.24999E+00         7.82198E+01         1.00000E+00         4.06978E-08         7.82198E+01         4.62883E+00         7.35909E+01
+          1.98933E-02         3.42008E-03        -1.24185E-02         1.24993E+00         4.34214E-01         1.24999E+00         7.60400E+01         1.00000E+00         4.07905E-08         7.60400E+01         4.72655E+00         7.13134E+01
+          1.98933E-02         3.58990E-03        -1.24559E-02         1.24993E+00         4.44884E-01         1.24999E+00         7.38659E+01         1.00000E+00         4.09191E-08         7.38659E+01         4.82085E+00         6.90450E+01
+          1.98933E-02         3.75973E-03        -1.24951E-02         1.24993E+00         4.55555E-01         1.24999E+00         7.17004E+01         1.00000E+00         4.10863E-08         7.17004E+01         4.91148E+00         6.67889E+01
+          1.98933E-02         3.92956E-03        -1.25361E-02         1.24993E+00         4.66225E-01         1.24999E+00         6.95463E+01         1.00000E+00         4.12947E-08         6.95463E+01         4.99819E+00         6.45481E+01
+          1.98933E-02         4.09939E-03        -1.25790E-02         1.24992E+00         4.76896E-01         1.24999E+00         6.74064E+01         1.00000E+00         4.15466E-08         6.74064E+01         5.08075E+00         6.23256E+01
+          1.98933E-02         4.26921E-03        -1.26236E-02         1.24992E+00         4.87567E-01         1.24999E+00         6.52832E+01         1.00000E+00         4.18442E-08         6.52832E+01         5.15894E+00         6.01243E+01
+          1.98933E-02         4.43904E-03        -1.26701E-02         1.24992E+00         4.98237E-01         1.24999E+00         6.31794E+01         1.00000E+00         4.21895E-08         6.31794E+01         5.23255E+00         5.79469E+01
+          1.98933E-02         4.60887E-03        -1.27183E-02         1.24992E+00         5.08908E-01         1.24999E+00         6.10974E+01         1.00000E+00         4.25842E-08         6.10974E+01         5.30138E+00         5.57961E+01
+          1.98933E-02         4.77869E-03        -1.27684E-02         1.24992E+00         5.19578E-01         1.24999E+00         5.90396E+01         1.00000E+00         4.30296E-08         5.90396E+01         5.36525E+00         5.36744E+01
+          1.98933E-02         4.94852E-03        -1.28203E-02         1.24992E+00         5.30249E-01         1.24999E+00         5.70082E+01         1.00000E+00         4.35267E-08         5.70082E+01         5.42400E+00         5.15842E+01
+          1.98933E-02         5.11835E-03        -1.28740E-02         1.24992E+00         5.40919E-01         1.24998E+00         5.50053E+01         1.00000E+00         4.40764E-08         5.50053E+01         5.47748E+00         4.95279E+01
+          1.98933E-02         5.28818E-03        -1.29295E-02         1.24992E+00         5.51590E-01         1.24998E+00         5.30331E+01         1.00000E+00         4.46791E-08         5.30331E+01         5.52555E+00         4.75075E+01
+          1.98933E-02         5.45800E-03        -1.29868E-02         1.24992E+00         5.62261E-01         1.24998E+00         5.10933E+01         1.00000E+00         4.53346E-08         5.10933E+01         5.56809E+00         4.55252E+01
+          1.98933E-02         5.62783E-03        -1.30460E-02         1.24992E+00         5.72931E-01         1.24998E+00         4.91877E+01         1.00000E+00         4.60428E-08         4.91877E+01         5.60500E+00         4.35827E+01
+          1.98933E-02         5.79766E-03        -1.31069E-02         1.24991E+00         5.83602E-01         1.24998E+00         4.73182E+01         1.00000E+00         4.68029E-08         4.73182E+01         5.63618E+00         4.16820E+01
+          1.98933E-02         5.96749E-03        -1.31697E-02         1.24991E+00         5.94272E-01         1.24998E+00         4.54861E+01         1.00000E+00         4.76139E-08         4.54861E+01         5.66156E+00         3.98245E+01
+          1.98933E-02         6.13731E-03        -1.32342E-02         1.24991E+00         6.04943E-01         1.24998E+00         4.36930E+01         1.00000E+00         4.84746E-08         4.36930E+01         5.68110E+00         3.80119E+01
+          1.98933E-02         6.30714E-03        -1.33006E-02         1.24991E+00         6.15613E-01         1.24998E+00         4.19401E+01         1.00000E+00         4.93834E-08         4.19401E+01         5.69474E+00         3.62454E+01
+          1.98933E-02         6.47697E-03        -1.33688E-02         1.24991E+00         6.26284E-01         1.24998E+00         4.02287E+01         1.00000E+00         5.03384E-08         4.02287E+01         5.70246E+00         3.45262E+01
+          1.98933E-02         6.64680E-03        -1.34388E-02         1.24991E+00         6.36955E-01         1.24998E+00         3.85597E+01         1.00000E+00         5.13375E-08         3.85597E+01         5.70427E+00         3.28555E+01
+          1.98933E-02         6.81662E-03        -1.35106E-02         1.24991E+00         6.47625E-01         1.24998E+00         3.69342E+01         1.00000E+00         5.23784E-08         3.69342E+01         5.70015E+00         3.12341E+01
+          1.98933E-02         6.98645E-03        -1.35843E-02         1.24990E+00         6.58296E-01         1.24998E+00         3.53530E+01         1.00000E+00         5.34588E-08         3.53530E+01         5.69015E+00         2.96628E+01
+          1.98933E-02         7.15628E-03        -1.36597E-02         1.24990E+00         6.68966E-01         1.24998E+00         3.38167E+01         1.00000E+00         5.45760E-08         3.38167E+01         5.67430E+00         2.81424E+01
+          1.98933E-02         7.32611E-03        -1.37370E-02         1.24990E+00         6.79637E-01         1.24998E+00         3.23260E+01         1.00000E+00         5.57275E-08         3.23260E+01         5.65265E+00         2.66734E+01
+          1.98933E-02         7.49593E-03        -1.38160E-02         1.24990E+00         6.90307E-01         1.24998E+00         3.08813E+01         1.00000E+00         5.69104E-08         3.08813E+01         5.62528E+00         2.52560E+01
+          1.98933E-02         7.66576E-03        -1.38969E-02         1.24990E+00         7.00978E-01         1.24998E+00         2.94830E+01         1.00000E+00         5.81221E-08         2.94830E+01         5.59227E+00         2.38907E+01
+          1.98933E-02         7.83559E-03        -1.39796E-02         1.24990E+00         7.11649E-01         1.24997E+00         2.81312E+01         1.00000E+00         5.93598E-08         2.81312E+01         5.55373E+00         2.25775E+01
+          1.98933E-02         8.00542E-03        -1.40641E-02         1.24989E+00         7.22319E-01         1.24997E+00         2.68262E+01         1.00000E+00         6.06208E-08         2.68262E+01         5.50976E+00         2.13165E+01
+          1.98933E-02         8.17524E-03        -1.41504E-02         1.24989E+00         7.32990E-01         1.24997E+00         2.55680E+01         1.00000E+00         6.19026E-08         2.55680E+01         5.46049E+00         2.01075E+01
+          1.98933E-02         8.34507E-03        -1.42385E-02         1.24989E+00         7.43660E-01         1.24997E+00         2.43564E+01         1.00000E+00         6.32028E-08         2.43564E+01         5.40608E+00         1.89503E+01
+          1.98933E-02         8.51490E-03        -1.43285E-02         1.24989E+00         7.54331E-01         1.24997E+00         2.31913E+01         1.00000E+00         6.45190E-08         2.31913E+01         5.34665E+00         1.78446E+01
+          1.98933E-02         8.68473E-03        -1.44202E-02         1.24989E+00         7.65001E-01         1.24997E+00         2.20724E+01         1.00000E+00         6.58491E-08         2.20724E+01         5.28239E+00         1.67900E+01
+          1.98933E-02         8.85455E-03        -1.45138E-02         1.24989E+00         7.75672E-01         1.24997E+00         2.09993E+01         1.00000E+00         6.71913E-08         2.09993E+01         5.21348E+00         1.57858E+01
+          1.98933E-02         9.02438E-03        -1.46092E-02         1.24988E+00         7.86343E-01         1.24997E+00         1.99716E+01         1.00000E+00         6.85442E-08         1.99716E+01         5.14008E+00         1.48315E+01
+          1.98933E-02         9.19421E-03        -1.47064E-02         1.24988E+00         7.97013E-01         1.24997E+00         1.89887E+01         1.00000E+00         6.99064E-08         1.89887E+01         5.06241E+00         1.39263E+01
+          1.98933E-02         9.36403E-03        -1.48054E-02         1.24988E+00         8.07684E-01         1.24997E+00         1.80501E+01         1.00000E+00         7.12771E-08         1.80501E+01         4.98067E+00         1.30694E+01
+          1.98933E-02         9.53386E-03        -1.49062E-02         1.24988E+00         8.18354E-01         1.24997E+00         1.71549E+01         1.00000E+00         7.26559E-08         1.71549E+01         4.89506E+00         1.22598E+01
+          1.98933E-02         9.70369E-03        -1.50088E-02         1.24988E+00         8.29025E-01         1.24997E+00         1.63025E+01         1.00000E+00         7.40429E-08         1.63025E+01         4.80583E+00         1.14966E+01
+          1.98933E-02         9.87352E-03        -1.51132E-02         1.24987E+00         8.39695E-01         1.24997E+00         1.54919E+01         1.00000E+00         7.54386E-08         1.54919E+01         4.71318E+00         1.07787E+01
+          1.98933E-02         1.00433E-02        -1.52195E-02         1.24987E+00         8.50366E-01         1.24996E+00         1.47223E+01         1.00000E+00         7.68441E-08         1.47223E+01         4.61737E+00         1.01050E+01
+          1.98933E-02         1.02132E-02        -1.53275E-02         1.24987E+00         8.61037E-01         1.24996E+00         1.39928E+01         1.00000E+00         7.82610E-08         1.39928E+01         4.51862E+00         9.47416E+00
+          1.98933E-02         1.03830E-02        -1.54374E-02         1.24987E+00         8.71707E-01         1.24996E+00         1.33022E+01         1.00000E+00         7.96917E-08         1.33022E+01         4.41718E+00         8.88505E+00
+          1.98933E-02         1.05528E-02        -1.55491E-02         1.24987E+00         8.82378E-01         1.24996E+00         1.26496E+01         1.00000E+00         8.11392E-08         1.26496E+01         4.31331E+00         8.33634E+00
+          1.98933E-02         1.07227E-02        -1.56626E-02         1.24986E+00         8.93048E-01         1.24996E+00         1.20339E+01         1.00000E+00         8.26070E-08         1.20339E+01         4.20725E+00         7.82666E+00
+          1.98933E-02         1.08925E-02        -1.57779E-02         1.24986E+00         9.03719E-01         1.24996E+00         1.14539E+01         1.00000E+00         8.40994E-08         1.14539E+01         4.09925E+00         7.35462E+00
+          1.98933E-02         1.10623E-02        -1.58950E-02         1.24986E+00         9.14389E-01         1.24996E+00         1.09084E+01         1.00000E+00         8.56215E-08         1.09084E+01         3.98958E+00         6.91879E+00
+          1.98933E-02         1.12321E-02        -1.60139E-02         1.24986E+00         9.25060E-01         1.24996E+00         1.03962E+01         1.00000E+00         8.71789E-08         1.03962E+01         3.87848E+00         6.51772E+00
+          1.98933E-02         1.14020E-02        -1.61347E-02         1.24985E+00         9.35731E-01         1.24996E+00         9.91613E+00         1.00000E+00         8.87780E-08         9.91613E+00         3.76621E+00         6.14992E+00
+          1.98933E-02         1.15718E-02        -1.62572E-02         1.24985E+00         9.46401E-01         1.24996E+00         9.46692E+00         1.00000E+00         9.04258E-08         9.46692E+00         3.65303E+00         5.81389E+00
+          1.98933E-02         1.17416E-02        -1.63816E-02         1.24985E+00         9.57072E-01         1.24996E+00         9.04732E+00         1.00000E+00         9.21300E-08         9.04732E+00         3.53919E+00         5.50813E+00
+          1.98933E-02         1.19114E-02        -1.65078E-02         1.24985E+00         9.67742E-01         1.24996E+00         8.65605E+00         1.00000E+00         9.38985E-08         8.65605E+00         3.42493E+00         5.23112E+00
+          1.98933E-02         1.20813E-02        -1.66358E-02         1.24984E+00         9.78413E-01         1.24995E+00         8.29183E+00         1.00000E+00         9.57400E-08         8.29183E+00         3.31051E+00         4.98132E+00
+          1.98933E-02         1.22511E-02        -1.67656E-02         1.24984E+00         9.89083E-01         1.24995E+00         7.95338E+00         1.00000E+00         9.76634E-08         7.95338E+00         3.19616E+00         4.75722E+00
+          1.98933E-02         1.24209E-02        -1.68972E-02         1.24984E+00         9.99754E-01         1.24995E+00         7.63944E+00         1.00000E+00         9.96777E-08         7.63944E+00         3.08212E+00         4.55732E+00
+          1.98933E-02         1.25908E-02        -1.70306E-02         1.24984E+00         1.01042E+00         1.24995E+00         7.34873E+00         1.00000E+00         1.01792E-07         7.34873E+00         2.96863E+00         4.38010E+00
+          1.98933E-02         1.27606E-02        -1.71659E-02         1.24983E+00         1.02110E+00         1.24995E+00         7.07999E+00         1.00000E+00         1.04016E-07         7.07999E+00         2.85591E+00         4.22407E+00
+          1.98933E-02         1.29304E-02        -1.73029E-02         1.24983E+00         1.03177E+00         1.24995E+00         6.83197E+00         1.00000E+00         1.06357E-07         6.83197E+00         2.74418E+00         4.08779E+00
+          1.98933E-02         1.31002E-02        -1.74418E-02         1.24983E+00         1.04244E+00         1.24995E+00         6.60345E+00         1.00000E+00         1.08826E-07         6.60345E+00         2.63366E+00         3.96979E+00
+          1.98933E-02         1.32701E-02        -1.75824E-02         1.24982E+00         1.05311E+00         1.24995E+00         6.39321E+00         1.00000E+00         1.11429E-07         6.39321E+00         2.52454E+00         3.86868E+00
+          1.98933E-02         1.34399E-02        -1.77249E-02         1.24982E+00         1.06378E+00         1.24995E+00         6.20007E+00         1.00000E+00         1.14174E-07         6.20007E+00         2.41702E+00         3.78305E+00
+          1.98933E-02         1.36097E-02        -1.78692E-02         1.24982E+00         1.07445E+00         1.24995E+00         6.02287E+00         1.00000E+00         1.17068E-07         6.02287E+00         2.31129E+00         3.71158E+00
+          1.98933E-02         1.37795E-02        -1.80154E-02         1.24982E+00         1.08512E+00         1.24995E+00         5.86048E+00         1.00000E+00         1.20116E-07         5.86048E+00         2.20753E+00         3.65295E+00
+          1.98933E-02         1.39494E-02        -1.81633E-02         1.24981E+00         1.09579E+00         1.24995E+00         5.71178E+00         1.00000E+00         1.23323E-07         5.71178E+00         2.10591E+00         3.60587E+00
+          1.98933E-02         1.41192E-02        -1.83130E-02         1.24981E+00         1.10646E+00         1.24994E+00         5.57573E+00         1.00000E+00         1.26691E-07         5.57573E+00         2.00658E+00         3.56914E+00
+          1.98933E-02         1.42890E-02        -1.84646E-02         1.24981E+00         1.11713E+00         1.24994E+00         5.45127E+00         1.00000E+00         1.30224E-07         5.45127E+00         1.90970E+00         3.54157E+00
+          1.98933E-02         1.44589E-02        -1.86179E-02         1.24980E+00         1.12780E+00         1.24994E+00         5.33742E+00         1.00000E+00         1.33921E-07         5.33742E+00         1.81540E+00         3.52202E+00
+          1.98933E-02         1.46287E-02        -1.87731E-02         1.24980E+00         1.13847E+00         1.24994E+00         5.23322E+00         1.00000E+00         1.37783E-07         5.23322E+00         1.72382E+00         3.50941E+00
+          1.98933E-02         1.47985E-02        -1.89301E-02         1.24980E+00         1.14914E+00         1.24994E+00         5.13775E+00         1.00000E+00         1.41807E-07         5.13775E+00         1.63505E+00         3.50270E+00
+          1.98933E-02         1.49683E-02        -1.90889E-02         1.24980E+00         1.15981E+00         1.24994E+00         5.05013E+00         1.00000E+00         1.45991E-07         5.05013E+00         1.54922E+00         3.50091E+00
+          1.98933E-02         1.51382E-02        -1.92495E-02         1.24979E+00         1.17048E+00         1.24994E+00         4.96954E+00         1.00000E+00         1.50331E-07         4.96954E+00         1.46642E+00         3.50311E+00
+          1.98933E-02         1.53080E-02        -1.94119E-02         1.24979E+00         1.18115E+00         1.24994E+00         4.89517E+00         1.00000E+00         1.54820E-07         4.89517E+00         1.38673E+00         3.50844E+00
+          1.98933E-02         1.54778E-02        -1.95762E-02         1.24979E+00         1.19182E+00         1.24994E+00         4.82628E+00         1.00000E+00         1.59452E-07         4.82628E+00         1.31022E+00         3.51606E+00
+          1.98933E-02         1.56476E-02        -1.97422E-02         1.24978E+00         1.20249E+00         1.24994E+00         4.76217E+00         1.00000E+00         1.64220E-07         4.76217E+00         1.23695E+00         3.52523E+00
+          1.98933E-02         1.58175E-02        -1.99101E-02         1.24978E+00         1.21317E+00         1.24994E+00         4.70218E+00         1.00000E+00         1.69115E-07         4.70218E+00         1.16697E+00         3.53521E+00
+          1.98933E-02         1.59873E-02        -2.00798E-02         1.24978E+00         1.22384E+00         1.24994E+00         4.64570E+00         1.00000E+00         1.74128E-07         4.64570E+00         1.10032E+00         3.54538E+00
+          1.98933E-02         1.61571E-02        -2.02513E-02         1.24977E+00         1.23451E+00         1.24994E+00         4.59215E+00         1.00000E+00         1.79249E-07         4.59215E+00         1.03703E+00         3.55512E+00
+          1.98933E-02         1.63270E-02        -2.04246E-02         1.24977E+00         1.24518E+00         1.24994E+00         4.54100E+00         1.00000E+00         1.84468E-07         4.54100E+00         9.77110E-01         3.56389E+00
+          1.98933E-02         1.64968E-02        -2.05997E-02         1.24976E+00         1.25585E+00         1.24993E+00         4.49179E+00         1.00000E+00         1.89773E-07         4.49179E+00         9.20572E-01         3.57122E+00
+          1.98933E-02         1.66666E-02        -2.07766E-02         1.24976E+00         1.26652E+00         1.24993E+00         4.44406E+00         1.00000E+00         1.95154E-07         4.44406E+00         8.67409E-01         3.57665E+00
+          1.98933E-02         1.68364E-02        -2.09553E-02         1.24976E+00         1.27719E+00         1.24993E+00         4.39742E+00         1.00000E+00         2.00599E-07         4.39742E+00         8.17607E-01         3.57981E+00
+          1.98933E-02         1.70063E-02        -2.11359E-02         1.24975E+00         1.28786E+00         1.24993E+00         4.35151E+00         1.00000E+00         2.06097E-07         4.35151E+00         7.71142E-01         3.58037E+00
+          1.98933E-02         1.71761E-02        -2.13182E-02         1.24975E+00         1.29853E+00         1.24993E+00         4.30603E+00         1.00000E+00         2.11638E-07         4.30603E+00         7.27979E-01         3.57805E+00
+          1.98933E-02         1.73459E-02        -2.15024E-02         1.24975E+00         1.30920E+00         1.24993E+00         4.26068E+00         1.00000E+00         2.17210E-07         4.26068E+00         6.88077E-01         3.57261E+00
+          1.98933E-02         1.75158E-02        -2.16884E-02         1.24974E+00         1.31987E+00         1.24993E+00         4.21524E+00         1.00000E+00         2.22804E-07         4.21524E+00         6.51383E-01         3.56386E+00
+          1.98933E-02         1.76856E-02        -2.18762E-02         1.24974E+00         1.33054E+00         1.24993E+00         4.16951E+00         1.00000E+00         2.28410E-07         4.16951E+00         6.17838E-01         3.55167E+00
+          1.98933E-02         1.78554E-02        -2.20658E-02         1.24974E+00         1.34121E+00         1.24993E+00         4.12331E+00         1.00000E+00         2.34020E-07         4.12331E+00         5.87374E-01         3.53593E+00
+          1.98933E-02         1.80252E-02        -2.22573E-02         1.24973E+00         1.35188E+00         1.24993E+00         4.07651E+00         1.00000E+00         2.39626E-07         4.07651E+00         5.59915E-01         3.51660E+00
+          1.98933E-02         1.81951E-02        -2.24505E-02         1.24973E+00         1.36255E+00         1.24993E+00         4.02902E+00         1.00000E+00         2.45223E-07         4.02902E+00         5.35379E-01         3.49364E+00
+          1.98933E-02         1.83649E-02        -2.26455E-02         1.24972E+00         1.37322E+00         1.24993E+00         3.98076E+00         1.00000E+00         2.50805E-07         3.98076E+00         5.13677E-01         3.46709E+00
+          1.98933E-02         1.85347E-02        -2.28424E-02         1.24972E+00         1.38389E+00         1.24993E+00         3.93170E+00         1.00000E+00         2.56369E-07         3.93170E+00         4.94715E-01         3.43699E+00
+          1.98933E-02         1.87045E-02        -2.30411E-02         1.24972E+00         1.39457E+00         1.24993E+00         3.88182E+00         1.00000E+00         2.61915E-07         3.88182E+00         4.78392E-01         3.40343E+00
+          1.98933E-02         1.88744E-02        -2.32416E-02         1.24971E+00         1.40524E+00         1.24993E+00         3.83112E+00         1.00000E+00         2.67442E-07         3.83112E+00         4.64602E-01         3.36652E+00
+          1.98933E-02         1.90442E-02        -2.34439E-02         1.24971E+00         1.41591E+00         1.24993E+00         3.77965E+00         1.00000E+00         2.72953E-07         3.77965E+00         4.53235E-01         3.32642E+00
+          1.98933E-02         1.92140E-02        -2.36480E-02         1.24970E+00         1.42658E+00         1.24993E+00         3.72746E+00         1.00000E+00         2.78453E-07         3.72746E+00         4.44177E-01         3.28328E+00
+          1.98933E-02         1.93839E-02        -2.38539E-02         1.24970E+00         1.43725E+00         1.24993E+00         3.67462E+00         1.00000E+00         2.83949E-07         3.67462E+00         4.37312E-01         3.23731E+00
+          1.98933E-02         1.95537E-02        -2.40617E-02         1.24970E+00         1.44792E+00         1.24993E+00         3.62123E+00         1.00000E+00         2.89450E-07         3.62123E+00         4.32517E-01         3.18871E+00
+          1.98933E-02         1.97235E-02        -2.42712E-02         1.24969E+00         1.45859E+00         1.24993E+00         3.56739E+00         1.00000E+00         2.94968E-07         3.56739E+00         4.29670E-01         3.13772E+00
+          1.98933E-02         1.98933E-02        -2.44826E-02         1.24969E+00         1.46926E+00         1.24993E+00         3.51323E+00         1.00000E+00         3.00518E-07         3.51323E+00         4.28646E-01         3.08458E+00
+          1.98933E-02         2.00632E-02        -2.46958E-02         1.24968E+00         1.47993E+00         1.24993E+00         3.45887E+00         1.00000E+00         3.06116E-07         3.45887E+00         4.29319E-01         3.02955E+00
+          1.98933E-02         2.02330E-02        -2.49108E-02         1.24968E+00         1.49060E+00         1.24993E+00         3.40447E+00         1.00000E+00         3.11781E-07         3.40447E+00         4.31560E-01         2.97291E+00
+          1.98933E-02         2.04028E-02        -2.51276E-02         1.24967E+00         1.50127E+00         1.24993E+00         3.35017E+00         1.00000E+00         3.17534E-07         3.35017E+00         4.35244E-01         2.91492E+00
+          1.98933E-02         2.05726E-02        -2.53462E-02         1.24967E+00         1.51194E+00         1.24993E+00         3.29613E+00         1.00000E+00         3.23400E-07         3.29613E+00         4.40240E-01         2.85589E+00
+          1.98933E-02         2.07425E-02        -2.55666E-02         1.24967E+00         1.52261E+00         1.24993E+00         3.24251E+00         1.00000E+00         3.29403E-07         3.24251E+00         4.46422E-01         2.79609E+00
+          1.98933E-02         2.09123E-02        -2.57889E-02         1.24966E+00         1.53328E+00         1.24993E+00         3.18949E+00         1.00000E+00         3.35569E-07         3.18949E+00         4.53664E-01         2.73583E+00
+          1.98933E-02         2.10821E-02        -2.60129E-02         1.24966E+00         1.54395E+00         1.24993E+00         3.13722E+00         1.00000E+00         3.41928E-07         3.13722E+00         4.61840E-01         2.67538E+00
+          1.98933E-02         2.12520E-02        -2.62388E-02         1.24965E+00         1.55462E+00         1.24993E+00         3.08588E+00         1.00000E+00         3.48507E-07         3.08588E+00         4.70827E-01         2.61505E+00
+          1.98933E-02         2.14218E-02        -2.64665E-02         1.24965E+00         1.56529E+00         1.24993E+00         3.03563E+00         1.00000E+00         3.55335E-07         3.03563E+00         4.80504E-01         2.55512E+00
+          1.98933E-02         2.15916E-02        -2.66960E-02         1.24964E+00         1.57596E+00         1.24993E+00         2.98662E+00         1.00000E+00         3.62442E-07         2.98662E+00         4.90752E-01         2.49587E+00
+          1.98933E-02         2.17614E-02        -2.69273E-02         1.24964E+00         1.58664E+00         1.24993E+00         2.93903E+00         1.00000E+00         3.69854E-07         2.93903E+00         5.01456E-01         2.43758E+00
+          1.98933E-02         2.19313E-02        -2.71604E-02         1.24963E+00         1.59731E+00         1.24993E+00         2.89300E+00         1.00000E+00         3.77600E-07         2.89300E+00         5.12502E-01         2.38050E+00
+          1.98933E-02         2.21011E-02        -2.73953E-02         1.24963E+00         1.60798E+00         1.24993E+00         2.84868E+00         1.00000E+00         3.85702E-07         2.84868E+00         5.23783E-01         2.32490E+00
+          1.98933E-02         2.22709E-02        -2.76321E-02         1.24963E+00         1.61865E+00         1.24993E+00         2.80621E+00         1.00000E+00         3.94185E-07         2.80621E+00         5.35192E-01         2.27101E+00
+          1.98933E-02         2.24407E-02        -2.78706E-02         1.24962E+00         1.62932E+00         1.24993E+00         2.76570E+00         1.00000E+00         4.03068E-07         2.76570E+00         5.46629E-01         2.21907E+00
+          1.98933E-02         2.26106E-02        -2.81110E-02         1.24962E+00         1.63999E+00         1.24993E+00         2.72729E+00         1.00000E+00         4.12366E-07         2.72729E+00         5.57998E-01         2.16929E+00
+          1.98933E-02         2.27804E-02        -2.83532E-02         1.24961E+00         1.65066E+00         1.24993E+00         2.69108E+00         1.00000E+00         4.22092E-07         2.69108E+00         5.69207E-01         2.12188E+00
+          1.98933E-02         2.29502E-02        -2.85972E-02         1.24961E+00         1.66133E+00         1.24993E+00         2.65717E+00         1.00000E+00         4.32254E-07         2.65717E+00         5.80167E-01         2.07700E+00
+          1.98933E-02         2.31201E-02        -2.88430E-02         1.24960E+00         1.67200E+00         1.24993E+00         2.62564E+00         1.00000E+00         4.42858E-07         2.62564E+00         5.90797E-01         2.03485E+00
+          1.98933E-02         2.32899E-02        -2.90906E-02         1.24960E+00         1.68267E+00         1.24993E+00         2.59657E+00         1.00000E+00         4.53901E-07         2.59657E+00         6.01019E-01         1.99555E+00
+          1.98933E-02         2.34597E-02        -2.93401E-02         1.24959E+00         1.69334E+00         1.24994E+00         2.57001E+00         1.00000E+00         4.65379E-07         2.57001E+00         6.10762E-01         1.95925E+00
+          1.98933E-02         2.36295E-02        -2.95913E-02         1.24959E+00         1.70401E+00         1.24994E+00         2.54601E+00         1.00000E+00         4.77283E-07         2.54601E+00         6.19958E-01         1.92605E+00
+          1.98933E-02         2.37994E-02        -2.98444E-02         1.24958E+00         1.71468E+00         1.24994E+00         2.52461E+00         1.00000E+00         4.89599E-07         2.52461E+00         6.28547E-01         1.89606E+00
+          1.98933E-02         2.39692E-02        -3.00993E-02         1.24958E+00         1.72535E+00         1.24994E+00         2.50582E+00         1.00000E+00         5.02308E-07         2.50582E+00         6.36472E-01         1.86935E+00
+          1.98933E-02         2.41390E-02        -3.03560E-02         1.24957E+00         1.73602E+00         1.24994E+00         2.48965E+00         1.00000E+00         5.15389E-07         2.48965E+00         6.43682E-01         1.84596E+00
+          1.98933E-02         2.43088E-02        -3.06145E-02         1.24957E+00         1.74669E+00         1.24994E+00         2.47608E+00         1.00000E+00         5.28815E-07         2.47608E+00         6.50133E-01         1.82595E+00
+          1.98933E-02         2.44787E-02        -3.08748E-02         1.24956E+00         1.75736E+00         1.24994E+00         2.46510E+00         1.00000E+00         5.42558E-07         2.46510E+00         6.55785E-01         1.80932E+00
+          1.98933E-02         2.46485E-02        -3.11370E-02         1.24956E+00         1.76804E+00         1.24994E+00         2.45668E+00         1.00000E+00         5.56585E-07         2.45668E+00         6.60603E-01         1.79607E+00
+          1.98933E-02         2.48183E-02        -3.14009E-02         1.24955E+00         1.77871E+00         1.24994E+00         2.45075E+00         1.00000E+00         5.70861E-07         2.45075E+00         6.64559E-01         1.78619E+00
+          1.98933E-02         2.49882E-02        -3.16667E-02         1.24954E+00         1.78938E+00         1.24995E+00         2.44727E+00         1.00000E+00         5.85351E-07         2.44727E+00         6.67628E-01         1.77964E+00
+          1.98933E-02         2.51580E-02        -3.19342E-02         1.24954E+00         1.80005E+00         1.24995E+00         2.44615E+00         1.00000E+00         6.00015E-07         2.44615E+00         6.69792E-01         1.77636E+00
+          1.98933E-02         2.53278E-02        -3.22036E-02         1.24953E+00         1.81072E+00         1.24995E+00         2.44731E+00         1.00000E+00         6.14814E-07         2.44731E+00         6.71038E-01         1.77627E+00
+          1.98933E-02         2.54976E-02        -3.24748E-02         1.24953E+00         1.82139E+00         1.24995E+00         2.45065E+00         1.00000E+00         6.29709E-07         2.45065E+00         6.71355E-01         1.77929E+00
+          1.98933E-02         2.56675E-02        -3.27478E-02         1.24952E+00         1.83206E+00         1.24995E+00         2.45606E+00         1.00000E+00         6.44659E-07         2.45606E+00         6.70742E-01         1.78532E+00
+          1.98933E-02         2.58373E-02        -3.30227E-02         1.24952E+00         1.84273E+00         1.24995E+00         2.46342E+00         1.00000E+00         6.59625E-07         2.46342E+00         6.69196E-01         1.79423E+00
+          1.98933E-02         2.60071E-02        -3.32993E-02         1.24951E+00         1.85340E+00         1.24996E+00         2.47261E+00         1.00000E+00         6.74568E-07         2.47261E+00         6.66725E-01         1.80588E+00
+          1.98933E-02         2.61769E-02        -3.35778E-02         1.24951E+00         1.86407E+00         1.24996E+00         2.48348E+00         1.00000E+00         6.89451E-07         2.48348E+00         6.63336E-01         1.82014E+00
+          2.00632E-02         8.72665E-04        -1.22883E-02         1.26061E+00         2.74155E-01         1.26067E+00         1.04995E+02         1.00000E+00         2.82818E-08         1.04995E+02         2.32518E+00         1.02670E+02
+          2.00632E-02         1.04249E-03        -1.22985E-02         1.26060E+00         2.84826E-01         1.26066E+00         1.03113E+02         1.00000E+00         2.81237E-08         1.03113E+02         2.43308E+00         1.00680E+02
+          2.00632E-02         1.21232E-03        -1.23105E-02         1.26060E+00         2.95496E-01         1.26066E+00         1.01191E+02         1.00000E+00         2.79693E-08         1.01191E+02         2.54202E+00         9.86492E+01
+          2.00632E-02         1.38215E-03        -1.23243E-02         1.26060E+00         3.06167E-01         1.26066E+00         9.92345E+01         1.00000E+00         2.78202E-08         9.92345E+01         2.65170E+00         9.65828E+01
+          2.00632E-02         1.55197E-03        -1.23400E-02         1.26060E+00         3.16838E-01         1.26066E+00         9.72456E+01         1.00000E+00         2.76781E-08         9.72456E+01         2.76183E+00         9.44838E+01
+          2.00632E-02         1.72180E-03        -1.23575E-02         1.26060E+00         3.27508E-01         1.26066E+00         9.52279E+01         1.00000E+00         2.75449E-08         9.52279E+01         2.87212E+00         9.23558E+01
+          2.00632E-02         1.89163E-03        -1.23767E-02         1.26060E+00         3.38179E-01         1.26066E+00         9.31845E+01         1.00000E+00         2.74224E-08         9.31845E+01         2.98228E+00         9.02022E+01
+          2.00632E-02         2.06146E-03        -1.23978E-02         1.26060E+00         3.48849E-01         1.26066E+00         9.11187E+01         1.00000E+00         2.73127E-08         9.11187E+01         3.09200E+00         8.80267E+01
+          2.00632E-02         2.23128E-03        -1.24207E-02         1.26060E+00         3.59520E-01         1.26066E+00         8.90337E+01         1.00000E+00         2.72180E-08         8.90337E+01         3.20101E+00         8.58327E+01
+          2.00632E-02         2.40111E-03        -1.24454E-02         1.26060E+00         3.70190E-01         1.26066E+00         8.69328E+01         1.00000E+00         2.71405E-08         8.69328E+01         3.30902E+00         8.36238E+01
+          2.00632E-02         2.57094E-03        -1.24720E-02         1.26060E+00         3.80861E-01         1.26066E+00         8.48191E+01         1.00000E+00         2.70825E-08         8.48191E+01         3.41573E+00         8.14033E+01
+          2.00632E-02         2.74077E-03        -1.25003E-02         1.26060E+00         3.91532E-01         1.26066E+00         8.26957E+01         1.00000E+00         2.70464E-08         8.26957E+01         3.52089E+00         7.91748E+01
+          2.00632E-02         2.91059E-03        -1.25304E-02         1.26060E+00         4.02202E-01         1.26066E+00         8.05659E+01         1.00000E+00         2.70345E-08         8.05659E+01         3.62420E+00         7.69417E+01
+          2.00632E-02         3.08042E-03        -1.25624E-02         1.26060E+00         4.12873E-01         1.26066E+00         7.84327E+01         1.00000E+00         2.70492E-08         7.84327E+01         3.72541E+00         7.47073E+01
+          2.00632E-02         3.25025E-03        -1.25962E-02         1.26060E+00         4.23543E-01         1.26066E+00         7.62992E+01         1.00000E+00         2.70927E-08         7.62992E+01         3.82426E+00         7.24749E+01
+          2.00632E-02         3.42008E-03        -1.26317E-02         1.26060E+00         4.34214E-01         1.26066E+00         7.41682E+01         1.00000E+00         2.71672E-08         7.41682E+01         3.92048E+00         7.02477E+01
+          2.00632E-02         3.58990E-03        -1.26691E-02         1.26060E+00         4.44884E-01         1.26066E+00         7.20428E+01         1.00000E+00         2.72749E-08         7.20428E+01         4.01384E+00         6.80289E+01
+          2.00632E-02         3.75973E-03        -1.27083E-02         1.26060E+00         4.55555E-01         1.26066E+00         6.99257E+01         1.00000E+00         2.74175E-08         6.99257E+01         4.10410E+00         6.58216E+01
+          2.00632E-02         3.92956E-03        -1.27494E-02         1.26060E+00         4.66225E-01         1.26066E+00         6.78197E+01         1.00000E+00         2.75969E-08         6.78197E+01         4.19103E+00         6.36286E+01
+          2.00632E-02         4.09939E-03        -1.27922E-02         1.26060E+00         4.76896E-01         1.26066E+00         6.57274E+01         1.00000E+00         2.78144E-08         6.57274E+01         4.27441E+00         6.14530E+01
+          2.00632E-02         4.26921E-03        -1.28368E-02         1.26059E+00         4.87567E-01         1.26066E+00         6.36516E+01         1.00000E+00         2.80714E-08         6.36516E+01         4.35404E+00         5.92976E+01
+          2.00632E-02         4.43904E-03        -1.28833E-02         1.26059E+00         4.98237E-01         1.26066E+00         6.15947E+01         1.00000E+00         2.83687E-08         6.15947E+01         4.42973E+00         5.71649E+01
+          2.00632E-02         4.60887E-03        -1.29315E-02         1.26059E+00         5.08908E-01         1.26066E+00         5.95590E+01         1.00000E+00         2.87070E-08         5.95590E+01         4.50129E+00         5.50577E+01
+          2.00632E-02         4.77869E-03        -1.29816E-02         1.26059E+00         5.19578E-01         1.26066E+00         5.75469E+01         1.00000E+00         2.90865E-08         5.75469E+01         4.56854E+00         5.29784E+01
+          2.00632E-02         4.94852E-03        -1.30335E-02         1.26059E+00         5.30249E-01         1.26066E+00         5.55606E+01         1.00000E+00         2.95072E-08         5.55606E+01         4.63133E+00         5.09293E+01
+          2.00632E-02         5.11835E-03        -1.30872E-02         1.26059E+00         5.40919E-01         1.26066E+00         5.36023E+01         1.00000E+00         2.99687E-08         5.36023E+01         4.68951E+00         4.89127E+01
+          2.00632E-02         5.28818E-03        -1.31427E-02         1.26059E+00         5.51590E-01         1.26066E+00         5.16738E+01         1.00000E+00         3.04705E-08         5.16738E+01         4.74296E+00         4.69308E+01
+          2.00632E-02         5.45800E-03        -1.32000E-02         1.26059E+00         5.62261E-01         1.26066E+00         4.97770E+01         1.00000E+00         3.10115E-08         4.97770E+01         4.79154E+00         4.49855E+01
+          2.00632E-02         5.62783E-03        -1.32592E-02         1.26059E+00         5.72931E-01         1.26066E+00         4.79138E+01         1.00000E+00         3.15905E-08         4.79138E+01         4.83515E+00         4.30786E+01
+          2.00632E-02         5.79766E-03        -1.33201E-02         1.26058E+00         5.83602E-01         1.26065E+00         4.60857E+01         1.00000E+00         3.22059E-08         4.60857E+01         4.87371E+00         4.12120E+01
+          2.00632E-02         5.96749E-03        -1.33829E-02         1.26058E+00         5.94272E-01         1.26065E+00         4.42944E+01         1.00000E+00         3.28561E-08         4.42944E+01         4.90713E+00         3.93872E+01
+          2.00632E-02         6.13731E-03        -1.34475E-02         1.26058E+00         6.04943E-01         1.26065E+00         4.25411E+01         1.00000E+00         3.35391E-08         4.25411E+01         4.93534E+00         3.76057E+01
+          2.00632E-02         6.30714E-03        -1.35138E-02         1.26058E+00         6.15613E-01         1.26065E+00         4.08272E+01         1.00000E+00         3.42527E-08         4.08272E+01         4.95831E+00         3.58689E+01
+          2.00632E-02         6.47697E-03        -1.35820E-02         1.26058E+00         6.26284E-01         1.26065E+00         3.91539E+01         1.00000E+00         3.49948E-08         3.91539E+01         4.97599E+00         3.41779E+01
+          2.00632E-02         6.64680E-03        -1.36520E-02         1.26058E+00         6.36955E-01         1.26065E+00         3.75222E+01         1.00000E+00         3.57630E-08         3.75222E+01         4.98837E+00         3.25338E+01
+          2.00632E-02         6.81662E-03        -1.37239E-02         1.26058E+00         6.47625E-01         1.26065E+00         3.59330E+01         1.00000E+00         3.65548E-08         3.59330E+01         4.99543E+00         3.09375E+01
+          2.00632E-02         6.98645E-03        -1.37975E-02         1.26057E+00         6.58296E-01         1.26065E+00         3.43871E+01         1.00000E+00         3.73677E-08         3.43871E+01         4.99718E+00         2.93900E+01
+          2.00632E-02         7.15628E-03        -1.38729E-02         1.26057E+00         6.68966E-01         1.26065E+00         3.28854E+01         1.00000E+00         3.81991E-08         3.28854E+01         4.99366E+00         2.78917E+01
+          2.00632E-02         7.32611E-03        -1.39502E-02         1.26057E+00         6.79637E-01         1.26065E+00         3.14282E+01         1.00000E+00         3.90466E-08         3.14282E+01         4.98488E+00         2.64433E+01
+          2.00632E-02         7.49593E-03        -1.40292E-02         1.26057E+00         6.90307E-01         1.26065E+00         3.00161E+01         1.00000E+00         3.99077E-08         3.00161E+01         4.97090E+00         2.50452E+01
+          2.00632E-02         7.66576E-03        -1.41101E-02         1.26057E+00         7.00978E-01         1.26065E+00         2.86495E+01         1.00000E+00         4.07798E-08         2.86495E+01         4.95179E+00         2.36977E+01
+          2.00632E-02         7.83559E-03        -1.41928E-02         1.26057E+00         7.11649E-01         1.26065E+00         2.73285E+01         1.00000E+00         4.16606E-08         2.73285E+01         4.92761E+00         2.24009E+01
+          2.00632E-02         8.00542E-03        -1.42773E-02         1.26057E+00         7.22319E-01         1.26065E+00         2.60534E+01         1.00000E+00         4.25480E-08         2.60534E+01         4.89846E+00         2.11550E+01
+          2.00632E-02         8.17524E-03        -1.43636E-02         1.26056E+00         7.32990E-01         1.26065E+00         2.48241E+01         1.00000E+00         4.34398E-08         2.48241E+01         4.86443E+00         1.99597E+01
+          2.00632E-02         8.34507E-03        -1.44518E-02         1.26056E+00         7.43660E-01         1.26064E+00         2.36406E+01         1.00000E+00         4.43340E-08         2.36406E+01         4.82564E+00         1.88150E+01
+          2.00632E-02         8.51490E-03        -1.45417E-02         1.26056E+00         7.54331E-01         1.26064E+00         2.25027E+01         1.00000E+00         4.52291E-08         2.25027E+01         4.78221E+00         1.77205E+01
+          2.00632E-02         8.68473E-03        -1.46334E-02         1.26056E+00         7.65001E-01         1.26064E+00         2.14102E+01         1.00000E+00         4.61236E-08         2.14102E+01         4.73428E+00         1.66759E+01
+          2.00632E-02         8.85455E-03        -1.47270E-02         1.26056E+00         7.75672E-01         1.26064E+00         2.03626E+01         1.00000E+00         4.70162E-08         2.03626E+01         4.68198E+00         1.56806E+01
+          2.00632E-02         9.02438E-03        -1.48224E-02         1.26055E+00         7.86343E-01         1.26064E+00         1.93596E+01         1.00000E+00         4.79062E-08         1.93596E+01         4.62548E+00         1.47341E+01
+          2.00632E-02         9.19421E-03        -1.49196E-02         1.26055E+00         7.97013E-01         1.26064E+00         1.84006E+01         1.00000E+00         4.87930E-08         1.84006E+01         4.56493E+00         1.38356E+01
+          2.00632E-02         9.36403E-03        -1.50186E-02         1.26055E+00         8.07684E-01         1.26064E+00         1.74850E+01         1.00000E+00         4.96766E-08         1.74850E+01         4.50051E+00         1.29845E+01
+          2.00632E-02         9.53386E-03        -1.51194E-02         1.26055E+00         8.18354E-01         1.26064E+00         1.66121E+01         1.00000E+00         5.05574E-08         1.66121E+01         4.43240E+00         1.21797E+01
+          2.00632E-02         9.70369E-03        -1.52220E-02         1.26055E+00         8.29025E-01         1.26064E+00         1.57812E+01         1.00000E+00         5.14361E-08         1.57812E+01         4.36079E+00         1.14204E+01
+          2.00632E-02         9.87352E-03        -1.53264E-02         1.26054E+00         8.39695E-01         1.26064E+00         1.49914E+01         1.00000E+00         5.23140E-08         1.49914E+01         4.28587E+00         1.07056E+01
+          2.00632E-02         1.00433E-02        -1.54327E-02         1.26054E+00         8.50366E-01         1.26064E+00         1.42420E+01         1.00000E+00         5.31932E-08         1.42420E+01         4.20784E+00         1.00341E+01
+          2.00632E-02         1.02132E-02        -1.55407E-02         1.26054E+00         8.61037E-01         1.26064E+00         1.35318E+01         1.00000E+00         5.40760E-08         1.35318E+01         4.12691E+00         9.40494E+00
+          2.00632E-02         1.03830E-02        -1.56506E-02         1.26054E+00         8.71707E-01         1.26063E+00         1.28601E+01         1.00000E+00         5.49655E-08         1.28601E+01         4.04328E+00         8.81679E+00
+          2.00632E-02         1.05528E-02        -1.57623E-02         1.26054E+00         8.82378E-01         1.26063E+00         1.22256E+01         1.00000E+00         5.58656E-08         1.22256E+01         3.95718E+00         8.26845E+00
+          2.00632E-02         1.07227E-02        -1.58758E-02         1.26053E+00         8.93048E-01         1.26063E+00         1.16274E+01         1.00000E+00         5.67805E-08         1.16274E+01         3.86882E+00         7.75860E+00
+          2.00632E-02         1.08925E-02        -1.59911E-02         1.26053E+00         9.03719E-01         1.26063E+00         1.10643E+01         1.00000E+00         5.77154E-08         1.10643E+01         3.77842E+00         7.28592E+00
+          2.00632E-02         1.10623E-02        -1.61082E-02         1.26053E+00         9.14389E-01         1.26063E+00         1.05352E+01         1.00000E+00         5.86758E-08         1.05352E+01         3.68620E+00         6.84904E+00
+          2.00632E-02         1.12321E-02        -1.62271E-02         1.26053E+00         9.25060E-01         1.26063E+00         1.00389E+01         1.00000E+00         5.96680E-08         1.00389E+01         3.59238E+00         6.44655E+00
+          2.00632E-02         1.14020E-02        -1.63479E-02         1.26052E+00         9.35731E-01         1.26063E+00         9.57422E+00         1.00000E+00         6.06989E-08         9.57422E+00         3.49720E+00         6.07702E+00
+          2.00632E-02         1.15718E-02        -1.64704E-02         1.26052E+00         9.46401E-01         1.26063E+00         9.13989E+00         1.00000E+00         6.17758E-08         9.13989E+00         3.40087E+00         5.73902E+00
+          2.00632E-02         1.17416E-02        -1.65948E-02         1.26052E+00         9.57072E-01         1.26063E+00         8.73469E+00         1.00000E+00         6.29066E-08         8.73469E+00         3.30362E+00         5.43107E+00
+          2.00632E-02         1.19114E-02        -1.67210E-02         1.26052E+00         9.67742E-01         1.26063E+00         8.35738E+00         1.00000E+00         6.40993E-08         8.35738E+00         3.20566E+00         5.15171E+00
+          2.00632E-02         1.20813E-02        -1.68490E-02         1.26051E+00         9.78413E-01         1.26063E+00         8.00670E+00         1.00000E+00         6.53622E-08         8.00670E+00         3.10723E+00         4.89947E+00
+          2.00632E-02         1.22511E-02        -1.69788E-02         1.26051E+00         9.89083E-01         1.26063E+00         7.68140E+00         1.00000E+00         6.67037E-08         7.68140E+00         3.00853E+00         4.67288E+00
+          2.00632E-02         1.24209E-02        -1.71104E-02         1.26051E+00         9.99754E-01         1.26062E+00         7.38022E+00         1.00000E+00         6.81322E-08         7.38022E+00         2.90977E+00         4.47045E+00
+          2.00632E-02         1.25908E-02        -1.72438E-02         1.26051E+00         1.01042E+00         1.26062E+00         7.10190E+00         1.00000E+00         6.96556E-08         7.10190E+00         2.81117E+00         4.29073E+00
+          2.00632E-02         1.27606E-02        -1.73791E-02         1.26050E+00         1.02110E+00         1.26062E+00         6.84520E+00         1.00000E+00         7.12818E-08         6.84520E+00         2.71292E+00         4.13228E+00
+          2.00632E-02         1.29304E-02        -1.75161E-02         1.26050E+00         1.03177E+00         1.26062E+00         6.60890E+00         1.00000E+00         7.30178E-08         6.60890E+00         2.61524E+00         3.99366E+00
+          2.00632E-02         1.31002E-02        -1.76550E-02         1.26050E+00         1.04244E+00         1.26062E+00         6.39178E+00         1.00000E+00         7.48700E-08         6.39178E+00         2.51831E+00         3.87347E+00
+          2.00632E-02         1.32701E-02        -1.77957E-02         1.26049E+00         1.05311E+00         1.26062E+00         6.19263E+00         1.00000E+00         7.68439E-08         6.19263E+00         2.42231E+00         3.77032E+00
+          2.00632E-02         1.34399E-02        -1.79381E-02         1.26049E+00         1.06378E+00         1.26062E+00         6.01029E+00         1.00000E+00         7.89443E-08         6.01029E+00         2.32744E+00         3.68286E+00
+          2.00632E-02         1.36097E-02        -1.80824E-02         1.26049E+00         1.07445E+00         1.26062E+00         5.84361E+00         1.00000E+00         8.11745E-08         5.84361E+00         2.23385E+00         3.60976E+00
+          2.00632E-02         1.37795E-02        -1.82286E-02         1.26049E+00         1.08512E+00         1.26062E+00         5.69146E+00         1.00000E+00         8.35370E-08         5.69146E+00         2.14173E+00         3.54973E+00
+          2.00632E-02         1.39494E-02        -1.83765E-02         1.26048E+00         1.09579E+00         1.26062E+00         5.55274E+00         1.00000E+00         8.60329E-08         5.55274E+00         2.05121E+00         3.50153E+00
+          2.00632E-02         1.41192E-02        -1.85262E-02         1.26048E+00         1.10646E+00         1.26062E+00         5.42641E+00         1.00000E+00         8.86621E-08         5.42641E+00         1.96247E+00         3.46394E+00
+          2.00632E-02         1.42890E-02        -1.86778E-02         1.26048E+00         1.11713E+00         1.26062E+00         5.31142E+00         1.00000E+00         9.14234E-08         5.31142E+00         1.87562E+00         3.43580E+00
+          2.00632E-02         1.44589E-02        -1.88311E-02         1.26047E+00         1.12780E+00         1.26061E+00         5.20679E+00         1.00000E+00         9.43142E-08         5.20679E+00         1.79082E+00         3.41598E+00
+          2.00632E-02         1.46287E-02        -1.89863E-02         1.26047E+00         1.13847E+00         1.26061E+00         5.11157E+00         1.00000E+00         9.73309E-08         5.11157E+00         1.70817E+00         3.40339E+00
+          2.00632E-02         1.47985E-02        -1.91433E-02         1.26047E+00         1.14914E+00         1.26061E+00         5.02482E+00         1.00000E+00         1.00469E-07         5.02482E+00         1.62780E+00         3.39702E+00
+          2.00632E-02         1.49683E-02        -1.93021E-02         1.26046E+00         1.15981E+00         1.26061E+00         4.94569E+00         1.00000E+00         1.03722E-07         4.94569E+00         1.54981E+00         3.39589E+00
+          2.00632E-02         1.51382E-02        -1.94627E-02         1.26046E+00         1.17048E+00         1.26061E+00         4.87334E+00         1.00000E+00         1.07084E-07         4.87334E+00         1.47429E+00         3.39905E+00
+          2.00632E-02         1.53080E-02        -1.96251E-02         1.26046E+00         1.18115E+00         1.26061E+00         4.80697E+00         1.00000E+00         1.10547E-07         4.80697E+00         1.40133E+00         3.40564E+00
+          2.00632E-02         1.54778E-02        -1.97894E-02         1.26045E+00         1.19182E+00         1.26061E+00         4.74583E+00         1.00000E+00         1.14103E-07         4.74583E+00         1.33100E+00         3.41483E+00
+          2.00632E-02         1.56476E-02        -1.99554E-02         1.26045E+00         1.20249E+00         1.26061E+00         4.68922E+00         1.00000E+00         1.17742E-07         4.68922E+00         1.26337E+00         3.42585E+00
+          2.00632E-02         1.58175E-02        -2.01233E-02         1.26045E+00         1.21317E+00         1.26061E+00         4.63647E+00         1.00000E+00         1.21456E-07         4.63647E+00         1.19849E+00         3.43798E+00
+          2.00632E-02         1.59873E-02        -2.02930E-02         1.26044E+00         1.22384E+00         1.26061E+00         4.58696E+00         1.00000E+00         1.25235E-07         4.58696E+00         1.13641E+00         3.45055E+00
+          2.00632E-02         1.61571E-02        -2.04644E-02         1.26044E+00         1.23451E+00         1.26061E+00         4.54013E+00         1.00000E+00         1.29068E-07         4.54013E+00         1.07717E+00         3.46296E+00
+          2.00632E-02         1.63270E-02        -2.06377E-02         1.26044E+00         1.24518E+00         1.26061E+00         4.49543E+00         1.00000E+00         1.32945E-07         4.49543E+00         1.02079E+00         3.47463E+00
+          2.00632E-02         1.64968E-02        -2.08129E-02         1.26043E+00         1.25585E+00         1.26061E+00         4.45237E+00         1.00000E+00         1.36856E-07         4.45237E+00         9.67296E-01         3.48508E+00
+          2.00632E-02         1.66666E-02        -2.09898E-02         1.26043E+00         1.26652E+00         1.26061E+00         4.41052E+00         1.00000E+00         1.40790E-07         4.41052E+00         9.16688E-01         3.49383E+00
+          2.00632E-02         1.68364E-02        -2.11685E-02         1.26043E+00         1.27719E+00         1.26060E+00         4.36946E+00         1.00000E+00         1.44737E-07         4.36946E+00         8.68968E-01         3.50049E+00
+          2.00632E-02         1.70063E-02        -2.13491E-02         1.26042E+00         1.28786E+00         1.26060E+00         4.32883E+00         1.00000E+00         1.48688E-07         4.32883E+00         8.24126E-01         3.50471E+00
+          2.00632E-02         1.71761E-02        -2.15314E-02         1.26042E+00         1.29853E+00         1.26060E+00         4.28831E+00         1.00000E+00         1.52634E-07         4.28831E+00         7.82143E-01         3.50617E+00
+          2.00632E-02         1.73459E-02        -2.17156E-02         1.26042E+00         1.30920E+00         1.26060E+00         4.24762E+00         1.00000E+00         1.56565E-07         4.24762E+00         7.42995E-01         3.50463E+00
+          2.00632E-02         1.75158E-02        -2.19016E-02         1.26041E+00         1.31987E+00         1.26060E+00         4.20651E+00         1.00000E+00         1.60475E-07         4.20651E+00         7.06646E-01         3.49986E+00
+          2.00632E-02         1.76856E-02        -2.20894E-02         1.26041E+00         1.33054E+00         1.26060E+00         4.16476E+00         1.00000E+00         1.64355E-07         4.16476E+00         6.73054E-01         3.49171E+00
+          2.00632E-02         1.78554E-02        -2.22790E-02         1.26040E+00         1.34121E+00         1.26060E+00         4.12222E+00         1.00000E+00         1.68202E-07         4.12222E+00         6.42171E-01         3.48005E+00
+          2.00632E-02         1.80252E-02        -2.24704E-02         1.26040E+00         1.35188E+00         1.26060E+00         4.07873E+00         1.00000E+00         1.72009E-07         4.07873E+00         6.13939E-01         3.46479E+00
+          2.00632E-02         1.81951E-02        -2.26637E-02         1.26040E+00         1.36255E+00         1.26060E+00         4.03419E+00         1.00000E+00         1.75774E-07         4.03419E+00         5.88297E-01         3.44590E+00
+          2.00632E-02         1.83649E-02        -2.28587E-02         1.26039E+00         1.37322E+00         1.26060E+00         3.98853E+00         1.00000E+00         1.79496E-07         3.98853E+00         5.65174E-01         3.42336E+00
+          2.00632E-02         1.85347E-02        -2.30556E-02         1.26039E+00         1.38389E+00         1.26060E+00         3.94170E+00         1.00000E+00         1.83175E-07         3.94170E+00         5.44497E-01         3.39721E+00
+          2.00632E-02         1.87045E-02        -2.32543E-02         1.26039E+00         1.39457E+00         1.26060E+00         3.89368E+00         1.00000E+00         1.86812E-07         3.89368E+00         5.26186E-01         3.36750E+00
+          2.00632E-02         1.88744E-02        -2.34548E-02         1.26038E+00         1.40524E+00         1.26060E+00         3.84448E+00         1.00000E+00         1.90413E-07         3.84448E+00         5.10156E-01         3.33432E+00
+          2.00632E-02         1.90442E-02        -2.36571E-02         1.26038E+00         1.41591E+00         1.26060E+00         3.79412E+00         1.00000E+00         1.93983E-07         3.79412E+00         4.96317E-01         3.29781E+00
+          2.00632E-02         1.92140E-02        -2.38612E-02         1.26037E+00         1.42658E+00         1.26060E+00         3.74267E+00         1.00000E+00         1.97531E-07         3.74267E+00         4.84577E-01         3.25809E+00
+          2.00632E-02         1.93839E-02        -2.40671E-02         1.26037E+00         1.43725E+00         1.26060E+00         3.69019E+00         1.00000E+00         2.01068E-07         3.69019E+00         4.74838E-01         3.21536E+00
+          2.00632E-02         1.95537E-02        -2.42748E-02         1.26036E+00         1.44792E+00         1.26060E+00         3.63678E+00         1.00000E+00         2.04607E-07         3.63678E+00         4.67001E-01         3.16978E+00
+          2.00632E-02         1.97235E-02        -2.44844E-02         1.26036E+00         1.45859E+00         1.26060E+00         3.58255E+00         1.00000E+00         2.08164E-07         3.58255E+00         4.60962E-01         3.12159E+00
+          2.00632E-02         1.98933E-02        -2.46958E-02         1.26036E+00         1.46926E+00         1.26060E+00         3.52762E+00         1.00000E+00         2.11756E-07         3.52762E+00         4.56617E-01         3.07100E+00
+          2.00632E-02         2.00632E-02        -2.49089E-02         1.26035E+00         1.47993E+00         1.26060E+00         3.47213E+00         1.00000E+00         2.15405E-07         3.47213E+00         4.53860E-01         3.01827E+00
+          2.00632E-02         2.02330E-02        -2.51239E-02         1.26035E+00         1.49060E+00         1.26060E+00         3.41622E+00         1.00000E+00         2.19132E-07         3.41622E+00         4.52583E-01         2.96364E+00
+          2.00632E-02         2.04028E-02        -2.53407E-02         1.26034E+00         1.50127E+00         1.26060E+00         3.36006E+00         1.00000E+00         2.22961E-07         3.36006E+00         4.52675E-01         2.90738E+00
+          2.00632E-02         2.05726E-02        -2.55594E-02         1.26034E+00         1.51194E+00         1.26060E+00         3.30380E+00         1.00000E+00         2.26919E-07         3.30380E+00         4.54030E-01         2.84977E+00
+          2.00632E-02         2.07425E-02        -2.57798E-02         1.26033E+00         1.52261E+00         1.26060E+00         3.24763E+00         1.00000E+00         2.31031E-07         3.24763E+00         4.56535E-01         2.79109E+00
+          2.00632E-02         2.09123E-02        -2.60020E-02         1.26033E+00         1.53328E+00         1.26060E+00         3.19171E+00         1.00000E+00         2.35326E-07         3.19171E+00         4.60084E-01         2.73162E+00
+          2.00632E-02         2.10821E-02        -2.62261E-02         1.26033E+00         1.54395E+00         1.26060E+00         3.13622E+00         1.00000E+00         2.39832E-07         3.13622E+00         4.64567E-01         2.67165E+00
+          2.00632E-02         2.12520E-02        -2.64520E-02         1.26032E+00         1.55462E+00         1.26060E+00         3.08135E+00         1.00000E+00         2.44577E-07         3.08135E+00         4.69877E-01         2.61147E+00
+          2.00632E-02         2.14218E-02        -2.66796E-02         1.26032E+00         1.56529E+00         1.26060E+00         3.02727E+00         1.00000E+00         2.49587E-07         3.02727E+00         4.75908E-01         2.55136E+00
+          2.00632E-02         2.15916E-02        -2.69091E-02         1.26031E+00         1.57596E+00         1.26060E+00         2.97415E+00         1.00000E+00         2.54888E-07         2.97415E+00         4.82557E-01         2.49160E+00
+          2.00632E-02         2.17614E-02        -2.71404E-02         1.26031E+00         1.58664E+00         1.26060E+00         2.92218E+00         1.00000E+00         2.60504E-07         2.92218E+00         4.89721E-01         2.43246E+00
+          2.00632E-02         2.19313E-02        -2.73736E-02         1.26030E+00         1.59731E+00         1.26060E+00         2.87152E+00         1.00000E+00         2.66456E-07         2.87152E+00         4.97301E-01         2.37422E+00
+          2.00632E-02         2.21011E-02        -2.76085E-02         1.26030E+00         1.60798E+00         1.26060E+00         2.82233E+00         1.00000E+00         2.72762E-07         2.82233E+00         5.05201E-01         2.31713E+00
+          2.00632E-02         2.22709E-02        -2.78452E-02         1.26029E+00         1.61865E+00         1.26060E+00         2.77477E+00         1.00000E+00         2.79436E-07         2.77477E+00         5.13326E-01         2.26145E+00
+          2.00632E-02         2.24407E-02        -2.80838E-02         1.26029E+00         1.62932E+00         1.26060E+00         2.72899E+00         1.00000E+00         2.86490E-07         2.72899E+00         5.21586E-01         2.20741E+00
+          2.00632E-02         2.26106E-02        -2.83242E-02         1.26028E+00         1.63999E+00         1.26060E+00         2.68513E+00         1.00000E+00         2.93930E-07         2.68513E+00         5.29895E-01         2.15524E+00
+          2.00632E-02         2.27804E-02        -2.85664E-02         1.26028E+00         1.65066E+00         1.26060E+00         2.64332E+00         1.00000E+00         3.01758E-07         2.64332E+00         5.38170E-01         2.10515E+00
+          2.00632E-02         2.29502E-02        -2.88104E-02         1.26027E+00         1.66133E+00         1.26060E+00         2.60367E+00         1.00000E+00         3.09971E-07         2.60367E+00         5.46330E-01         2.05734E+00
+          2.00632E-02         2.31201E-02        -2.90562E-02         1.26027E+00         1.67200E+00         1.26060E+00         2.56630E+00         1.00000E+00         3.18563E-07         2.56630E+00         5.54301E-01         2.01200E+00
+          2.00632E-02         2.32899E-02        -2.93038E-02         1.26026E+00         1.68267E+00         1.26060E+00         2.53129E+00         1.00000E+00         3.27523E-07         2.53129E+00         5.62011E-01         1.96928E+00
+          2.00632E-02         2.34597E-02        -2.95533E-02         1.26026E+00         1.69334E+00         1.26061E+00         2.49874E+00         1.00000E+00         3.36835E-07         2.49874E+00         5.69395E-01         1.92934E+00
+          2.00632E-02         2.36295E-02        -2.98045E-02         1.26025E+00         1.70401E+00         1.26061E+00         2.46871E+00         1.00000E+00         3.46481E-07         2.46871E+00         5.76390E-01         1.89232E+00
+          2.00632E-02         2.37994E-02        -3.00576E-02         1.26025E+00         1.71468E+00         1.26061E+00         2.44126E+00         1.00000E+00         3.56438E-07         2.44126E+00         5.82938E-01         1.85832E+00
+          2.00632E-02         2.39692E-02        -3.03125E-02         1.26024E+00         1.72535E+00         1.26061E+00         2.41643E+00         1.00000E+00         3.66678E-07         2.41643E+00         5.88986E-01         1.82745E+00
+          2.00632E-02         2.41390E-02        -3.05691E-02         1.26024E+00         1.73602E+00         1.26061E+00         2.39426E+00         1.00000E+00         3.77174E-07         2.39426E+00         5.94486E-01         1.79977E+00
+          2.00632E-02         2.43088E-02        -3.08277E-02         1.26023E+00         1.74669E+00         1.26061E+00         2.37475E+00         1.00000E+00         3.87894E-07         2.37475E+00         5.99394E-01         1.77535E+00
+          2.00632E-02         2.44787E-02        -3.10880E-02         1.26023E+00         1.75736E+00         1.26061E+00         2.35791E+00         1.00000E+00         3.98804E-07         2.35791E+00         6.03671E-01         1.75424E+00
+          2.00632E-02         2.46485E-02        -3.13501E-02         1.26022E+00         1.76804E+00         1.26061E+00         2.34373E+00         1.00000E+00         4.09869E-07         2.34373E+00         6.07283E-01         1.73645E+00
+          2.00632E-02         2.48183E-02        -3.16141E-02         1.26022E+00         1.77871E+00         1.26061E+00         2.33218E+00         1.00000E+00         4.21053E-07         2.33218E+00         6.10200E-01         1.72198E+00
+          2.00632E-02         2.49882E-02        -3.18798E-02         1.26021E+00         1.78938E+00         1.26062E+00         2.32322E+00         1.00000E+00         4.32317E-07         2.32322E+00         6.12396E-01         1.71083E+00
+          2.00632E-02         2.51580E-02        -3.21474E-02         1.26021E+00         1.80005E+00         1.26062E+00         2.31681E+00         1.00000E+00         4.43626E-07         2.31681E+00         6.13850E-01         1.70296E+00
+          2.00632E-02         2.53278E-02        -3.24168E-02         1.26020E+00         1.81072E+00         1.26062E+00         2.31287E+00         1.00000E+00         4.54941E-07         2.31287E+00         6.14547E-01         1.69832E+00
+          2.00632E-02         2.54976E-02        -3.26880E-02         1.26020E+00         1.82139E+00         1.26062E+00         2.31133E+00         1.00000E+00         4.66225E-07         2.31133E+00         6.14475E-01         1.69686E+00
+          2.00632E-02         2.56675E-02        -3.29610E-02         1.26019E+00         1.83206E+00         1.26062E+00         2.31210E+00         1.00000E+00         4.77444E-07         2.31210E+00         6.13625E-01         1.69848E+00
+          2.00632E-02         2.58373E-02        -3.32358E-02         1.26018E+00         1.84273E+00         1.26062E+00         2.31508E+00         1.00000E+00         4.88561E-07         2.31508E+00         6.11994E-01         1.70309E+00
+          2.00632E-02         2.60071E-02        -3.35125E-02         1.26018E+00         1.85340E+00         1.26062E+00         2.32016E+00         1.00000E+00         4.99546E-07         2.32016E+00         6.09582E-01         1.71058E+00
+          2.00632E-02         2.61769E-02        -3.37909E-02         1.26017E+00         1.86407E+00         1.26063E+00         2.32722E+00         1.00000E+00         5.10369E-07         2.32722E+00         6.06393E-01         1.72082E+00
+          2.02330E-02         8.72665E-04        -1.25033E-02         1.27128E+00         2.74155E-01         1.27134E+00         1.02504E+02         1.00000E+00         1.87881E-08         1.02504E+02         1.77410E+00         1.00730E+02
+          2.02330E-02         1.04249E-03        -1.25135E-02         1.27128E+00         2.84826E-01         1.27134E+00         1.00664E+02         1.00000E+00         1.86336E-08         1.00664E+02         1.87352E+00         9.87909E+01
+          2.02330E-02         1.21232E-03        -1.25255E-02         1.27128E+00         2.95496E-01         1.27134E+00         9.87867E+01         1.00000E+00         1.84840E-08         9.87867E+01         1.97404E+00         9.68127E+01
+          2.02330E-02         1.38215E-03        -1.25394E-02         1.27127E+00         3.06167E-01         1.27134E+00         9.68745E+01         1.00000E+00         1.83407E-08         9.68745E+01         2.07540E+00         9.47991E+01
+          2.02330E-02         1.55197E-03        -1.25550E-02         1.27127E+00         3.16838E-01         1.27134E+00         9.49308E+01         1.00000E+00         1.82055E-08         9.49308E+01         2.17734E+00         9.27535E+01
+          2.02330E-02         1.72180E-03        -1.25725E-02         1.27127E+00         3.27508E-01         1.27134E+00         9.29588E+01         1.00000E+00         1.80800E-08         9.29588E+01         2.27962E+00         9.06792E+01
+          2.02330E-02         1.89163E-03        -1.25918E-02         1.27127E+00         3.38179E-01         1.27134E+00         9.09617E+01         1.00000E+00         1.79663E-08         9.09617E+01         2.38196E+00         8.85798E+01
+          2.02330E-02         2.06146E-03        -1.26129E-02         1.27127E+00         3.48849E-01         1.27134E+00         8.89426E+01         1.00000E+00         1.78660E-08         8.89426E+01         2.48411E+00         8.64585E+01
+          2.02330E-02         2.23128E-03        -1.26358E-02         1.27127E+00         3.59520E-01         1.27134E+00         8.69048E+01         1.00000E+00         1.77813E-08         8.69048E+01         2.58581E+00         8.43189E+01
+          2.02330E-02         2.40111E-03        -1.26605E-02         1.27127E+00         3.70190E-01         1.27134E+00         8.48512E+01         1.00000E+00         1.77141E-08         8.48512E+01         2.68681E+00         8.21644E+01
+          2.02330E-02         2.57094E-03        -1.26870E-02         1.27127E+00         3.80861E-01         1.27134E+00         8.27851E+01         1.00000E+00         1.76663E-08         8.27851E+01         2.78687E+00         7.99982E+01
+          2.02330E-02         2.74077E-03        -1.27153E-02         1.27127E+00         3.91532E-01         1.27134E+00         8.07096E+01         1.00000E+00         1.76399E-08         8.07096E+01         2.88572E+00         7.78238E+01
+          2.02330E-02         2.91059E-03        -1.27455E-02         1.27127E+00         4.02202E-01         1.27133E+00         7.86276E+01         1.00000E+00         1.76369E-08         7.86276E+01         2.98312E+00         7.56445E+01
+          2.02330E-02         3.08042E-03        -1.27774E-02         1.27127E+00         4.12873E-01         1.27133E+00         7.65422E+01         1.00000E+00         1.76590E-08         7.65422E+01         3.07885E+00         7.34634E+01
+          2.02330E-02         3.25025E-03        -1.28112E-02         1.27127E+00         4.23543E-01         1.27133E+00         7.44565E+01         1.00000E+00         1.77079E-08         7.44565E+01         3.17265E+00         7.12838E+01
+          2.02330E-02         3.42008E-03        -1.28468E-02         1.27127E+00         4.34214E-01         1.27133E+00         7.23732E+01         1.00000E+00         1.77851E-08         7.23732E+01         3.26432E+00         6.91088E+01
+          2.02330E-02         3.58990E-03        -1.28842E-02         1.27127E+00         4.44884E-01         1.27133E+00         7.02952E+01         1.00000E+00         1.78919E-08         7.02952E+01         3.35361E+00         6.69415E+01
+          2.02330E-02         3.75973E-03        -1.29234E-02         1.27127E+00         4.55555E-01         1.27133E+00         6.82253E+01         1.00000E+00         1.80294E-08         6.82253E+01         3.44033E+00         6.47849E+01
+          2.02330E-02         3.92956E-03        -1.29644E-02         1.27127E+00         4.66225E-01         1.27133E+00         6.61662E+01         1.00000E+00         1.81984E-08         6.61662E+01         3.52427E+00         6.26419E+01
+          2.02330E-02         4.09939E-03        -1.30072E-02         1.27127E+00         4.76896E-01         1.27133E+00         6.41205E+01         1.00000E+00         1.83994E-08         6.41205E+01         3.60522E+00         6.05152E+01
+          2.02330E-02         4.26921E-03        -1.30519E-02         1.27126E+00         4.87567E-01         1.27133E+00         6.20907E+01         1.00000E+00         1.86327E-08         6.20907E+01         3.68301E+00         5.84077E+01
+          2.02330E-02         4.43904E-03        -1.30983E-02         1.27126E+00         4.98237E-01         1.27133E+00         6.00794E+01         1.00000E+00         1.88982E-08         6.00794E+01         3.75744E+00         5.63219E+01
+          2.02330E-02         4.60887E-03        -1.31466E-02         1.27126E+00         5.08908E-01         1.27133E+00         5.80888E+01         1.00000E+00         1.91955E-08         5.80888E+01         3.82835E+00         5.42604E+01
+          2.02330E-02         4.77869E-03        -1.31967E-02         1.27126E+00         5.19578E-01         1.27133E+00         5.61212E+01         1.00000E+00         1.95241E-08         5.61212E+01         3.89559E+00         5.22256E+01
+          2.02330E-02         4.94852E-03        -1.32485E-02         1.27126E+00         5.30249E-01         1.27133E+00         5.41788E+01         1.00000E+00         1.98830E-08         5.41788E+01         3.95899E+00         5.02198E+01
+          2.02330E-02         5.11835E-03        -1.33022E-02         1.27126E+00         5.40919E-01         1.27133E+00         5.22636E+01         1.00000E+00         2.02711E-08         5.22636E+01         4.01844E+00         4.82452E+01
+          2.02330E-02         5.28818E-03        -1.33577E-02         1.27126E+00         5.51590E-01         1.27133E+00         5.03777E+01         1.00000E+00         2.06871E-08         5.03777E+01         4.07379E+00         4.63039E+01
+          2.02330E-02         5.45800E-03        -1.34151E-02         1.27126E+00         5.62261E-01         1.27133E+00         4.85227E+01         1.00000E+00         2.11292E-08         4.85227E+01         4.12493E+00         4.43978E+01
+          2.02330E-02         5.62783E-03        -1.34742E-02         1.27126E+00         5.72931E-01         1.27133E+00         4.67005E+01         1.00000E+00         2.15959E-08         4.67005E+01         4.17176E+00         4.25287E+01
+          2.02330E-02         5.79766E-03        -1.35352E-02         1.27125E+00         5.83602E-01         1.27133E+00         4.49126E+01         1.00000E+00         2.20852E-08         4.49126E+01         4.21419E+00         4.06984E+01
+          2.02330E-02         5.96749E-03        -1.35979E-02         1.27125E+00         5.94272E-01         1.27133E+00         4.31606E+01         1.00000E+00         2.25952E-08         4.31606E+01         4.25213E+00         3.89085E+01
+          2.02330E-02         6.13731E-03        -1.36625E-02         1.27125E+00         6.04943E-01         1.27133E+00         4.14459E+01         1.00000E+00         2.31237E-08         4.14459E+01         4.28553E+00         3.71603E+01
+          2.02330E-02         6.30714E-03        -1.37289E-02         1.27125E+00         6.15613E-01         1.27133E+00         3.97696E+01         1.00000E+00         2.36686E-08         3.97696E+01         4.31432E+00         3.54553E+01
+          2.02330E-02         6.47697E-03        -1.37971E-02         1.27125E+00         6.26284E-01         1.27132E+00         3.81331E+01         1.00000E+00         2.42277E-08         3.81331E+01         4.33846E+00         3.37946E+01
+          2.02330E-02         6.64680E-03        -1.38671E-02         1.27125E+00         6.36955E-01         1.27132E+00         3.65372E+01         1.00000E+00         2.47987E-08         3.65372E+01         4.35793E+00         3.21793E+01
+          2.02330E-02         6.81662E-03        -1.39389E-02         1.27125E+00         6.47625E-01         1.27132E+00         3.49830E+01         1.00000E+00         2.53795E-08         3.49830E+01         4.37270E+00         3.06103E+01
+          2.02330E-02         6.98645E-03        -1.40125E-02         1.27125E+00         6.58296E-01         1.27132E+00         3.34712E+01         1.00000E+00         2.59679E-08         3.34712E+01         4.38277E+00         2.90884E+01
+          2.02330E-02         7.15628E-03        -1.40880E-02         1.27124E+00         6.68966E-01         1.27132E+00         3.20025E+01         1.00000E+00         2.65617E-08         3.20025E+01         4.38815E+00         2.76143E+01
+          2.02330E-02         7.32611E-03        -1.41652E-02         1.27124E+00         6.79637E-01         1.27132E+00         3.05775E+01         1.00000E+00         2.71588E-08         3.05775E+01         4.38886E+00         2.61886E+01
+          2.02330E-02         7.49593E-03        -1.42443E-02         1.27124E+00         6.90307E-01         1.27132E+00         2.91967E+01         1.00000E+00         2.77571E-08         2.91967E+01         4.38491E+00         2.48117E+01
+          2.02330E-02         7.66576E-03        -1.43252E-02         1.27124E+00         7.00978E-01         1.27132E+00         2.78603E+01         1.00000E+00         2.83548E-08         2.78603E+01         4.37637E+00         2.34840E+01
+          2.02330E-02         7.83559E-03        -1.44078E-02         1.27124E+00         7.11649E-01         1.27132E+00         2.65688E+01         1.00000E+00         2.89500E-08         2.65688E+01         4.36328E+00         2.22055E+01
+          2.02330E-02         8.00542E-03        -1.44923E-02         1.27124E+00         7.22319E-01         1.27132E+00         2.53221E+01         1.00000E+00         2.95412E-08         2.53221E+01         4.34571E+00         2.09764E+01
+          2.02330E-02         8.17524E-03        -1.45787E-02         1.27123E+00         7.32990E-01         1.27132E+00         2.41204E+01         1.00000E+00         3.01267E-08         2.41204E+01         4.32374E+00         1.97967E+01
+          2.02330E-02         8.34507E-03        -1.46668E-02         1.27123E+00         7.43660E-01         1.27132E+00         2.29635E+01         1.00000E+00         3.07054E-08         2.29635E+01         4.29744E+00         1.86661E+01
+          2.02330E-02         8.51490E-03        -1.47567E-02         1.27123E+00         7.54331E-01         1.27132E+00         2.18514E+01         1.00000E+00         3.12761E-08         2.18514E+01         4.26692E+00         1.75845E+01
+          2.02330E-02         8.68473E-03        -1.48485E-02         1.27123E+00         7.65001E-01         1.27131E+00         2.07838E+01         1.00000E+00         3.18382E-08         2.07838E+01         4.23229E+00         1.65515E+01
+          2.02330E-02         8.85455E-03        -1.49420E-02         1.27123E+00         7.75672E-01         1.27131E+00         1.97603E+01         1.00000E+00         3.23910E-08         1.97603E+01         4.19365E+00         1.55666E+01
+          2.02330E-02         9.02438E-03        -1.50374E-02         1.27122E+00         7.86343E-01         1.27131E+00         1.87804E+01         1.00000E+00         3.29343E-08         1.87804E+01         4.15114E+00         1.46293E+01
+          2.02330E-02         9.19421E-03        -1.51346E-02         1.27122E+00         7.97013E-01         1.27131E+00         1.78438E+01         1.00000E+00         3.34685E-08         1.78438E+01         4.10489E+00         1.37389E+01
+          2.02330E-02         9.36403E-03        -1.52336E-02         1.27122E+00         8.07684E-01         1.27131E+00         1.69498E+01         1.00000E+00         3.39940E-08         1.69498E+01         4.05505E+00         1.28948E+01
+          2.02330E-02         9.53386E-03        -1.53344E-02         1.27122E+00         8.18354E-01         1.27131E+00         1.60978E+01         1.00000E+00         3.45119E-08         1.60978E+01         4.00175E+00         1.20960E+01
+          2.02330E-02         9.70369E-03        -1.54370E-02         1.27122E+00         8.29025E-01         1.27131E+00         1.52870E+01         1.00000E+00         3.50237E-08         1.52870E+01         3.94515E+00         1.13418E+01
+          2.02330E-02         9.87352E-03        -1.55415E-02         1.27121E+00         8.39695E-01         1.27131E+00         1.45166E+01         1.00000E+00         3.55313E-08         1.45166E+01         3.88543E+00         1.06312E+01
+          2.02330E-02         1.00433E-02        -1.56477E-02         1.27121E+00         8.50366E-01         1.27131E+00         1.37858E+01         1.00000E+00         3.60374E-08         1.37858E+01         3.82274E+00         9.96305E+00
+          2.02330E-02         1.02132E-02        -1.57558E-02         1.27121E+00         8.61037E-01         1.27131E+00         1.30937E+01         1.00000E+00         3.65451E-08         1.30937E+01         3.75726E+00         9.33640E+00
+          2.02330E-02         1.03830E-02        -1.58656E-02         1.27121E+00         8.71707E-01         1.27131E+00         1.24392E+01         1.00000E+00         3.70580E-08         1.24392E+01         3.68917E+00         8.75006E+00
+          2.02330E-02         1.05528E-02        -1.59773E-02         1.27121E+00         8.82378E-01         1.27131E+00         1.18215E+01         1.00000E+00         3.75806E-08         1.18215E+01         3.61865E+00         8.20285E+00
+          2.02330E-02         1.07227E-02        -1.60908E-02         1.27120E+00         8.93048E-01         1.27130E+00         1.12394E+01         1.00000E+00         3.81176E-08         1.12394E+01         3.54588E+00         7.69353E+00
+          2.02330E-02         1.08925E-02        -1.62061E-02         1.27120E+00         9.03719E-01         1.27130E+00         1.06919E+01         1.00000E+00         3.86746E-08         1.06919E+01         3.47106E+00         7.22082E+00
+          2.02330E-02         1.10623E-02        -1.63232E-02         1.27120E+00         9.14389E-01         1.27130E+00         1.01778E+01         1.00000E+00         3.92577E-08         1.01778E+01         3.39437E+00         6.78341E+00
+          2.02330E-02         1.12321E-02        -1.64422E-02         1.27120E+00         9.25060E-01         1.27130E+00         9.69597E+00         1.00000E+00         3.98734E-08         9.69597E+00         3.31601E+00         6.37996E+00
+          2.02330E-02         1.14020E-02        -1.65629E-02         1.27119E+00         9.35731E-01         1.27130E+00         9.24525E+00         1.00000E+00         4.05286E-08         9.24525E+00         3.23617E+00         6.00908E+00
+          2.02330E-02         1.15718E-02        -1.66855E-02         1.27119E+00         9.46401E-01         1.27130E+00         8.82444E+00         1.00000E+00         4.12306E-08         8.82444E+00         3.15504E+00         5.66940E+00
+          2.02330E-02         1.17416E-02        -1.68098E-02         1.27119E+00         9.57072E-01         1.27130E+00         8.43233E+00         1.00000E+00         4.19869E-08         8.43233E+00         3.07283E+00         5.35950E+00
+          2.02330E-02         1.19114E-02        -1.69360E-02         1.27119E+00         9.67742E-01         1.27130E+00         8.06768E+00         1.00000E+00         4.28051E-08         8.06768E+00         2.98971E+00         5.07797E+00
+          2.02330E-02         1.20813E-02        -1.70640E-02         1.27118E+00         9.78413E-01         1.27130E+00         7.72927E+00         1.00000E+00         4.36927E-08         7.72927E+00         2.90589E+00         4.82337E+00
+          2.02330E-02         1.22511E-02        -1.71938E-02         1.27118E+00         9.89083E-01         1.27130E+00         7.41585E+00         1.00000E+00         4.46568E-08         7.41585E+00         2.82155E+00         4.59430E+00
+          2.02330E-02         1.24209E-02        -1.73254E-02         1.27118E+00         9.99754E-01         1.27130E+00         7.12620E+00         1.00000E+00         4.57043E-08         7.12620E+00         2.73689E+00         4.38932E+00
+          2.02330E-02         1.25908E-02        -1.74588E-02         1.27118E+00         1.01042E+00         1.27130E+00         6.85909E+00         1.00000E+00         4.68413E-08         6.85909E+00         2.65207E+00         4.20701E+00
+          2.02330E-02         1.27606E-02        -1.75941E-02         1.27117E+00         1.02110E+00         1.27129E+00         6.61328E+00         1.00000E+00         4.80734E-08         6.61328E+00         2.56730E+00         4.04598E+00
+          2.02330E-02         1.29304E-02        -1.77311E-02         1.27117E+00         1.03177E+00         1.27129E+00         6.38756E+00         1.00000E+00         4.94051E-08         6.38756E+00         2.48274E+00         3.90482E+00
+          2.02330E-02         1.31002E-02        -1.78700E-02         1.27117E+00         1.04244E+00         1.27129E+00         6.18074E+00         1.00000E+00         5.08402E-08         6.18074E+00         2.39857E+00         3.78218E+00
+          2.02330E-02         1.32701E-02        -1.80107E-02         1.27116E+00         1.05311E+00         1.27129E+00         5.99164E+00         1.00000E+00         5.23811E-08         5.99164E+00         2.31495E+00         3.67669E+00
+          2.02330E-02         1.34399E-02        -1.81532E-02         1.27116E+00         1.06378E+00         1.27129E+00         5.81909E+00         1.00000E+00         5.40293E-08         5.81909E+00         2.23205E+00         3.58704E+00
+          2.02330E-02         1.36097E-02        -1.82975E-02         1.27116E+00         1.07445E+00         1.27129E+00         5.66195E+00         1.00000E+00         5.57851E-08         5.66195E+00         2.15002E+00         3.51193E+00
+          2.02330E-02         1.37795E-02        -1.84436E-02         1.27116E+00         1.08512E+00         1.27129E+00         5.51912E+00         1.00000E+00         5.76477E-08         5.51912E+00         2.06902E+00         3.45010E+00
+          2.02330E-02         1.39494E-02        -1.85915E-02         1.27115E+00         1.09579E+00         1.27129E+00         5.38951E+00         1.00000E+00         5.96152E-08         5.38951E+00         1.98919E+00         3.40032E+00
+          2.02330E-02         1.41192E-02        -1.87412E-02         1.27115E+00         1.10646E+00         1.27129E+00         5.27206E+00         1.00000E+00         6.16845E-08         5.27206E+00         1.91067E+00         3.36139E+00
+          2.02330E-02         1.42890E-02        -1.88928E-02         1.27115E+00         1.11713E+00         1.27129E+00         5.16577E+00         1.00000E+00         6.38516E-08         5.16577E+00         1.83359E+00         3.33218E+00
+          2.02330E-02         1.44589E-02        -1.90461E-02         1.27114E+00         1.12780E+00         1.27129E+00         5.06963E+00         1.00000E+00         6.61115E-08         5.06963E+00         1.75807E+00         3.31156E+00
+          2.02330E-02         1.46287E-02        -1.92013E-02         1.27114E+00         1.13847E+00         1.27129E+00         4.98270E+00         1.00000E+00         6.84587E-08         4.98270E+00         1.68422E+00         3.29847E+00
+          2.02330E-02         1.47985E-02        -1.93583E-02         1.27114E+00         1.14914E+00         1.27128E+00         4.90406E+00         1.00000E+00         7.08864E-08         4.90406E+00         1.61216E+00         3.29190E+00
+          2.02330E-02         1.49683E-02        -1.95171E-02         1.27113E+00         1.15981E+00         1.27128E+00         4.83285E+00         1.00000E+00         7.33876E-08         4.83285E+00         1.54199E+00         3.29086E+00
+          2.02330E-02         1.51382E-02        -1.96777E-02         1.27113E+00         1.17048E+00         1.27128E+00         4.76823E+00         1.00000E+00         7.59545E-08         4.76823E+00         1.47380E+00         3.29443E+00
+          2.02330E-02         1.53080E-02        -1.98401E-02         1.27113E+00         1.18115E+00         1.27128E+00         4.70940E+00         1.00000E+00         7.85790E-08         4.70940E+00         1.40766E+00         3.30174E+00
+          2.02330E-02         1.54778E-02        -2.00044E-02         1.27112E+00         1.19182E+00         1.27128E+00         4.65561E+00         1.00000E+00         8.12524E-08         4.65561E+00         1.34367E+00         3.31195E+00
+          2.02330E-02         1.56476E-02        -2.01704E-02         1.27112E+00         1.20249E+00         1.27128E+00         4.60616E+00         1.00000E+00         8.39659E-08         4.60616E+00         1.28187E+00         3.32429E+00
+          2.02330E-02         1.58175E-02        -2.03383E-02         1.27112E+00         1.21317E+00         1.27128E+00         4.56038E+00         1.00000E+00         8.67105E-08         4.56038E+00         1.22235E+00         3.33804E+00
+          2.02330E-02         1.59873E-02        -2.05080E-02         1.27111E+00         1.22384E+00         1.27128E+00         4.51764E+00         1.00000E+00         8.94770E-08         4.51764E+00         1.16513E+00         3.35251E+00
+          2.02330E-02         1.61571E-02        -2.06795E-02         1.27111E+00         1.23451E+00         1.27128E+00         4.47736E+00         1.00000E+00         9.22563E-08         4.47736E+00         1.11027E+00         3.36709E+00
+          2.02330E-02         1.63270E-02        -2.08528E-02         1.27111E+00         1.24518E+00         1.27128E+00         4.43901E+00         1.00000E+00         9.50392E-08         4.43901E+00         1.05780E+00         3.38121E+00
+          2.02330E-02         1.64968E-02        -2.10279E-02         1.27110E+00         1.25585E+00         1.27128E+00         4.40208E+00         1.00000E+00         9.78171E-08         4.40208E+00         1.00774E+00         3.39434E+00
+          2.02330E-02         1.66666E-02        -2.12048E-02         1.27110E+00         1.26652E+00         1.27128E+00         4.36612E+00         1.00000E+00         1.00581E-07         4.36612E+00         9.60113E-01         3.40601E+00
+          2.02330E-02         1.68364E-02        -2.13835E-02         1.27110E+00         1.27719E+00         1.27128E+00         4.33073E+00         1.00000E+00         1.03324E-07         4.33073E+00         9.14930E-01         3.41580E+00
+          2.02330E-02         1.70063E-02        -2.15641E-02         1.27109E+00         1.28786E+00         1.27128E+00         4.29552E+00         1.00000E+00         1.06037E-07         4.29552E+00         8.72190E-01         3.42333E+00
+          2.02330E-02         1.71761E-02        -2.17464E-02         1.27109E+00         1.29853E+00         1.27127E+00         4.26017E+00         1.00000E+00         1.08713E-07         4.26017E+00         8.31889E-01         3.42828E+00
+          2.02330E-02         1.73459E-02        -2.19306E-02         1.27108E+00         1.30920E+00         1.27127E+00         4.22438E+00         1.00000E+00         1.11348E-07         4.22438E+00         7.94012E-01         3.43037E+00
+          2.02330E-02         1.75158E-02        -2.21166E-02         1.27108E+00         1.31987E+00         1.27127E+00         4.18791E+00         1.00000E+00         1.13934E-07         4.18791E+00         7.58540E-01         3.42937E+00
+          2.02330E-02         1.76856E-02        -2.23044E-02         1.27108E+00         1.33054E+00         1.27127E+00         4.15053E+00         1.00000E+00         1.16469E-07         4.15053E+00         7.25445E-01         3.42508E+00
+          2.02330E-02         1.78554E-02        -2.24940E-02         1.27107E+00         1.34121E+00         1.27127E+00         4.11205E+00         1.00000E+00         1.18950E-07         4.11205E+00         6.94695E-01         3.41736E+00
+          2.02330E-02         1.80252E-02        -2.26854E-02         1.27107E+00         1.35188E+00         1.27127E+00         4.07234E+00         1.00000E+00         1.21374E-07         4.07234E+00         6.66249E-01         3.40609E+00
+          2.02330E-02         1.81951E-02        -2.28787E-02         1.27107E+00         1.36255E+00         1.27127E+00         4.03127E+00         1.00000E+00         1.23742E-07         4.03127E+00         6.40061E-01         3.39121E+00
+          2.02330E-02         1.83649E-02        -2.30737E-02         1.27106E+00         1.37322E+00         1.27127E+00         3.98877E+00         1.00000E+00         1.26055E-07         3.98877E+00         6.16081E-01         3.37269E+00
+          2.02330E-02         1.85347E-02        -2.32706E-02         1.27106E+00         1.38389E+00         1.27127E+00         3.94478E+00         1.00000E+00         1.28317E-07         3.94478E+00         5.94250E-01         3.35053E+00
+          2.02330E-02         1.87045E-02        -2.34693E-02         1.27105E+00         1.39457E+00         1.27127E+00         3.89927E+00         1.00000E+00         1.30532E-07         3.89927E+00         5.74508E-01         3.32476E+00
+          2.02330E-02         1.88744E-02        -2.36698E-02         1.27105E+00         1.40524E+00         1.27127E+00         3.85225E+00         1.00000E+00         1.32710E-07         3.85225E+00         5.56787E-01         3.29546E+00
+          2.02330E-02         1.90442E-02        -2.38721E-02         1.27105E+00         1.41591E+00         1.27127E+00         3.80373E+00         1.00000E+00         1.34858E-07         3.80373E+00         5.41018E-01         3.26271E+00
+          2.02330E-02         1.92140E-02        -2.40762E-02         1.27104E+00         1.42658E+00         1.27127E+00         3.75377E+00         1.00000E+00         1.36990E-07         3.75377E+00         5.27125E-01         3.22665E+00
+          2.02330E-02         1.93839E-02        -2.42821E-02         1.27104E+00         1.43725E+00         1.27127E+00         3.70244E+00         1.00000E+00         1.39118E-07         3.70244E+00         5.15031E-01         3.18741E+00
+          2.02330E-02         1.95537E-02        -2.44898E-02         1.27103E+00         1.44792E+00         1.27127E+00         3.64983E+00         1.00000E+00         1.41259E-07         3.64983E+00         5.04655E-01         3.14518E+00
+          2.02330E-02         1.97235E-02        -2.46994E-02         1.27103E+00         1.45859E+00         1.27127E+00         3.59604E+00         1.00000E+00         1.43432E-07         3.59604E+00         4.95913E-01         3.10013E+00
+          2.02330E-02         1.98933E-02        -2.49108E-02         1.27102E+00         1.46926E+00         1.27127E+00         3.54120E+00         1.00000E+00         1.45657E-07         3.54120E+00         4.88717E-01         3.05249E+00
+          2.02330E-02         2.00632E-02        -2.51239E-02         1.27102E+00         1.47993E+00         1.27127E+00         3.48545E+00         1.00000E+00         1.47957E-07         3.48545E+00         4.82981E-01         3.00247E+00
+          2.02330E-02         2.02330E-02        -2.53389E-02         1.27102E+00         1.49060E+00         1.27127E+00         3.42892E+00         1.00000E+00         1.50356E-07         3.42892E+00         4.78615E-01         2.95031E+00
+          2.02330E-02         2.04028E-02        -2.55557E-02         1.27101E+00         1.50127E+00         1.27127E+00         3.37179E+00         1.00000E+00         1.52879E-07         3.37179E+00         4.75527E-01         2.89627E+00
+          2.02330E-02         2.05726E-02        -2.57743E-02         1.27101E+00         1.51194E+00         1.27127E+00         3.31423E+00         1.00000E+00         1.55553E-07         3.31423E+00         4.73626E-01         2.84060E+00
+          2.02330E-02         2.07425E-02        -2.59948E-02         1.27100E+00         1.52261E+00         1.27127E+00         3.25640E+00         1.00000E+00         1.58404E-07         3.25640E+00         4.72820E-01         2.78358E+00
+          2.02330E-02         2.09123E-02        -2.62170E-02         1.27100E+00         1.53328E+00         1.27127E+00         3.19849E+00         1.00000E+00         1.61458E-07         3.19849E+00         4.73015E-01         2.72548E+00
+          2.02330E-02         2.10821E-02        -2.64411E-02         1.27099E+00         1.54395E+00         1.27127E+00         3.14069E+00         1.00000E+00         1.64742E-07         3.14069E+00         4.74121E-01         2.66657E+00
+          2.02330E-02         2.12520E-02        -2.66669E-02         1.27099E+00         1.55462E+00         1.27127E+00         3.08318E+00         1.00000E+00         1.68278E-07         3.08318E+00         4.76044E-01         2.60713E+00
+          2.02330E-02         2.14218E-02        -2.68946E-02         1.27098E+00         1.56529E+00         1.27127E+00         3.02615E+00         1.00000E+00         1.72090E-07         3.02615E+00         4.78695E-01         2.54745E+00
+          2.02330E-02         2.15916E-02        -2.71241E-02         1.27098E+00         1.57596E+00         1.27127E+00         2.96979E+00         1.00000E+00         1.76196E-07         2.96979E+00         4.81983E-01         2.48781E+00
+          2.02330E-02         2.17614E-02        -2.73554E-02         1.27098E+00         1.58664E+00         1.27127E+00         2.91428E+00         1.00000E+00         1.80613E-07         2.91428E+00         4.85821E-01         2.42846E+00
+          2.02330E-02         2.19313E-02        -2.75885E-02         1.27097E+00         1.59731E+00         1.27127E+00         2.85981E+00         1.00000E+00         1.85353E-07         2.85981E+00         4.90122E-01         2.36969E+00
+          2.02330E-02         2.21011E-02        -2.78235E-02         1.27097E+00         1.60798E+00         1.27127E+00         2.80656E+00         1.00000E+00         1.90425E-07         2.80656E+00         4.94803E-01         2.31176E+00
+          2.02330E-02         2.22709E-02        -2.80602E-02         1.27096E+00         1.61865E+00         1.27127E+00         2.75469E+00         1.00000E+00         1.95834E-07         2.75469E+00         4.99780E-01         2.25491E+00
+          2.02330E-02         2.24407E-02        -2.82988E-02         1.27096E+00         1.62932E+00         1.27127E+00         2.70438E+00         1.00000E+00         2.01579E-07         2.70438E+00         5.04975E-01         2.19940E+00
+          2.02330E-02         2.26106E-02        -2.85392E-02         1.27095E+00         1.63999E+00         1.27127E+00         2.65577E+00         1.00000E+00         2.07656E-07         2.65577E+00         5.10310E-01         2.14546E+00
+          2.02330E-02         2.27804E-02        -2.87813E-02         1.27095E+00         1.65066E+00         1.27127E+00         2.60902E+00         1.00000E+00         2.14057E-07         2.60902E+00         5.15712E-01         2.09331E+00
+          2.02330E-02         2.29502E-02        -2.90253E-02         1.27094E+00         1.66133E+00         1.27127E+00         2.56426E+00         1.00000E+00         2.20770E-07         2.56426E+00         5.21110E-01         2.04315E+00
+          2.02330E-02         2.31201E-02        -2.92712E-02         1.27094E+00         1.67200E+00         1.27127E+00         2.52162E+00         1.00000E+00         2.27778E-07         2.52162E+00         5.26436E-01         1.99519E+00
+          2.02330E-02         2.32899E-02        -2.95188E-02         1.27093E+00         1.68267E+00         1.27127E+00         2.48123E+00         1.00000E+00         2.35062E-07         2.48123E+00         5.31628E-01         1.94960E+00
+          2.02330E-02         2.34597E-02        -2.97682E-02         1.27093E+00         1.69334E+00         1.27127E+00         2.44317E+00         1.00000E+00         2.42599E-07         2.44317E+00         5.36623E-01         1.90655E+00
+          2.02330E-02         2.36295E-02        -3.00195E-02         1.27092E+00         1.70401E+00         1.27128E+00         2.40756E+00         1.00000E+00         2.50364E-07         2.40756E+00         5.41366E-01         1.86619E+00
+          2.02330E-02         2.37994E-02        -3.02725E-02         1.27092E+00         1.71468E+00         1.27128E+00         2.37445E+00         1.00000E+00         2.58328E-07         2.37445E+00         5.45803E-01         1.82865E+00
+          2.02330E-02         2.39692E-02        -3.05274E-02         1.27091E+00         1.72535E+00         1.27128E+00         2.34393E+00         1.00000E+00         2.66462E-07         2.34393E+00         5.49886E-01         1.79404E+00
+          2.02330E-02         2.41390E-02        -3.07841E-02         1.27091E+00         1.73602E+00         1.27128E+00         2.31603E+00         1.00000E+00         2.74735E-07         2.31603E+00         5.53568E-01         1.76247E+00
+          2.02330E-02         2.43088E-02        -3.10426E-02         1.27090E+00         1.74669E+00         1.27128E+00         2.29081E+00         1.00000E+00         2.83113E-07         2.29081E+00         5.56809E-01         1.73401E+00
+          2.02330E-02         2.44787E-02        -3.13029E-02         1.27090E+00         1.75736E+00         1.27128E+00         2.26829E+00         1.00000E+00         2.91565E-07         2.26829E+00         5.59572E-01         1.70872E+00
+          2.02330E-02         2.46485E-02        -3.15651E-02         1.27089E+00         1.76804E+00         1.27128E+00         2.24848E+00         1.00000E+00         3.00055E-07         2.24848E+00         5.61822E-01         1.68665E+00
+          2.02330E-02         2.48183E-02        -3.18290E-02         1.27088E+00         1.77871E+00         1.27128E+00         2.23137E+00         1.00000E+00         3.08551E-07         2.23137E+00         5.63531E-01         1.66784E+00
+          2.02330E-02         2.49882E-02        -3.20948E-02         1.27088E+00         1.78938E+00         1.27128E+00         2.21695E+00         1.00000E+00         3.17018E-07         2.21695E+00         5.64672E-01         1.65228E+00
+          2.02330E-02         2.51580E-02        -3.23624E-02         1.27087E+00         1.80005E+00         1.27129E+00         2.20519E+00         1.00000E+00         3.25424E-07         2.20519E+00         5.65224E-01         1.63996E+00
+          2.02330E-02         2.53278E-02        -3.26317E-02         1.27087E+00         1.81072E+00         1.27129E+00         2.19605E+00         1.00000E+00         3.33737E-07         2.19605E+00         5.65170E-01         1.63088E+00
+          2.02330E-02         2.54976E-02        -3.29029E-02         1.27086E+00         1.82139E+00         1.27129E+00         2.18947E+00         1.00000E+00         3.41925E-07         2.18947E+00         5.64495E-01         1.62497E+00
+          2.02330E-02         2.56675E-02        -3.31760E-02         1.27086E+00         1.83206E+00         1.27129E+00         2.18538E+00         1.00000E+00         3.49961E-07         2.18538E+00         5.63189E-01         1.62219E+00
+          2.02330E-02         2.58373E-02        -3.34508E-02         1.27085E+00         1.84273E+00         1.27129E+00         2.18371E+00         1.00000E+00         3.57818E-07         2.18371E+00         5.61244E-01         1.62246E+00
+          2.02330E-02         2.60071E-02        -3.37274E-02         1.27085E+00         1.85340E+00         1.27129E+00         2.18436E+00         1.00000E+00         3.65472E-07         2.18436E+00         5.58658E-01         1.62570E+00
+          2.02330E-02         2.61769E-02        -3.40059E-02         1.27084E+00         1.86407E+00         1.27130E+00         2.18723E+00         1.00000E+00         3.72901E-07         2.18723E+00         5.55430E-01         1.63180E+00
+          2.04028E-02         8.72665E-04        -1.27201E-02         1.28195E+00         2.74155E-01         1.28201E+00         1.00098E+02         1.00000E+00         1.21004E-08         1.00098E+02         1.39007E+00         9.87078E+01
+          2.04028E-02         1.04249E-03        -1.27304E-02         1.28195E+00         2.84826E-01         1.28201E+00         9.82999E+01         1.00000E+00         1.19655E-08         9.82999E+01         1.47936E+00         9.68206E+01
+          2.04028E-02         1.21232E-03        -1.27424E-02         1.28195E+00         2.95496E-01         1.28201E+00         9.64651E+01         1.00000E+00         1.18364E-08         9.64651E+01         1.56976E+00         9.48954E+01
+          2.04028E-02         1.38215E-03        -1.27562E-02         1.28195E+00         3.06167E-01         1.28201E+00         9.45965E+01         1.00000E+00         1.17149E-08         9.45965E+01         1.66103E+00         9.29355E+01
+          2.04028E-02         1.55197E-03        -1.27719E-02         1.28195E+00         3.16838E-01         1.28201E+00         9.26970E+01         1.00000E+00         1.16023E-08         9.26970E+01         1.75295E+00         9.09441E+01
+          2.04028E-02         1.72180E-03        -1.27893E-02         1.28194E+00         3.27508E-01         1.28201E+00         9.07699E+01         1.00000E+00         1.15004E-08         9.07699E+01         1.84531E+00         8.89246E+01
+          2.04028E-02         1.89163E-03        -1.28086E-02         1.28194E+00         3.38179E-01         1.28201E+00         8.88181E+01         1.00000E+00         1.14108E-08         8.88181E+01         1.93787E+00         8.68802E+01
+          2.04028E-02         2.06146E-03        -1.28297E-02         1.28194E+00         3.48849E-01         1.28201E+00         8.68448E+01         1.00000E+00         1.13352E-08         8.68448E+01         2.03041E+00         8.48144E+01
+          2.04028E-02         2.23128E-03        -1.28526E-02         1.28194E+00         3.59520E-01         1.28201E+00         8.48530E+01         1.00000E+00         1.12753E-08         8.48530E+01         2.12272E+00         8.27303E+01
+          2.04028E-02         2.40111E-03        -1.28773E-02         1.28194E+00         3.70190E-01         1.28201E+00         8.28459E+01         1.00000E+00         1.12328E-08         8.28459E+01         2.21456E+00         8.06313E+01
+          2.04028E-02         2.57094E-03        -1.29038E-02         1.28194E+00         3.80861E-01         1.28201E+00         8.08264E+01         1.00000E+00         1.12092E-08         8.08264E+01         2.30573E+00         7.85206E+01
+          2.04028E-02         2.74077E-03        -1.29322E-02         1.28194E+00         3.91532E-01         1.28201E+00         7.87976E+01         1.00000E+00         1.12060E-08         7.87976E+01         2.39600E+00         7.64016E+01
+          2.04028E-02         2.91059E-03        -1.29623E-02         1.28194E+00         4.02202E-01         1.28201E+00         7.67624E+01         1.00000E+00         1.12245E-08         7.67624E+01         2.48516E+00         7.42772E+01
+          2.04028E-02         3.08042E-03        -1.29943E-02         1.28194E+00         4.12873E-01         1.28201E+00         7.47238E+01         1.00000E+00         1.12660E-08         7.47238E+01         2.57300E+00         7.21508E+01
+          2.04028E-02         3.25025E-03        -1.30280E-02         1.28194E+00         4.23543E-01         1.28201E+00         7.26848E+01         1.00000E+00         1.13313E-08         7.26848E+01         2.65932E+00         7.00255E+01
+          2.04028E-02         3.42008E-03        -1.30636E-02         1.28194E+00         4.34214E-01         1.28201E+00         7.06481E+01         1.00000E+00         1.14213E-08         7.06481E+01         2.74392E+00         6.79042E+01
+          2.04028E-02         3.58990E-03        -1.31010E-02         1.28194E+00         4.44884E-01         1.28201E+00         6.86165E+01         1.00000E+00         1.15363E-08         6.86165E+01         2.82660E+00         6.57899E+01
+          2.04028E-02         3.75973E-03        -1.31402E-02         1.28194E+00         4.55555E-01         1.28201E+00         6.65927E+01         1.00000E+00         1.16766E-08         6.65927E+01         2.90717E+00         6.36855E+01
+          2.04028E-02         3.92956E-03        -1.31812E-02         1.28194E+00         4.66225E-01         1.28200E+00         6.45794E+01         1.00000E+00         1.18421E-08         6.45794E+01         2.98546E+00         6.15940E+01
+          2.04028E-02         4.09939E-03        -1.32241E-02         1.28194E+00         4.76896E-01         1.28200E+00         6.25791E+01         1.00000E+00         1.20324E-08         6.25791E+01         3.06127E+00         5.95179E+01
+          2.04028E-02         4.26921E-03        -1.32687E-02         1.28194E+00         4.87567E-01         1.28200E+00         6.05944E+01         1.00000E+00         1.22470E-08         6.05944E+01         3.13446E+00         5.74599E+01
+          2.04028E-02         4.43904E-03        -1.33152E-02         1.28193E+00         4.98237E-01         1.28200E+00         5.86276E+01         1.00000E+00         1.24851E-08         5.86276E+01         3.20485E+00         5.54227E+01
+          2.04028E-02         4.60887E-03        -1.33634E-02         1.28193E+00         5.08908E-01         1.28200E+00         5.66809E+01         1.00000E+00         1.27456E-08         5.66809E+01         3.27229E+00         5.34086E+01
+          2.04028E-02         4.77869E-03        -1.34135E-02         1.28193E+00         5.19578E-01         1.28200E+00         5.47567E+01         1.00000E+00         1.30272E-08         5.47567E+01         3.33664E+00         5.14201E+01
+          2.04028E-02         4.94852E-03        -1.34654E-02         1.28193E+00         5.30249E-01         1.28200E+00         5.28571E+01         1.00000E+00         1.33286E-08         5.28571E+01         3.39776E+00         4.94593E+01
+          2.04028E-02         5.11835E-03        -1.35191E-02         1.28193E+00         5.40919E-01         1.28200E+00         5.09840E+01         1.00000E+00         1.36483E-08         5.09840E+01         3.45553E+00         4.75285E+01
+          2.04028E-02         5.28818E-03        -1.35746E-02         1.28193E+00         5.51590E-01         1.28200E+00         4.91394E+01         1.00000E+00         1.39846E-08         4.91394E+01         3.50983E+00         4.56296E+01
+          2.04028E-02         5.45800E-03        -1.36319E-02         1.28193E+00         5.62261E-01         1.28200E+00         4.73251E+01         1.00000E+00         1.43357E-08         4.73251E+01         3.56055E+00         4.37645E+01
+          2.04028E-02         5.62783E-03        -1.36911E-02         1.28193E+00         5.72931E-01         1.28200E+00         4.55427E+01         1.00000E+00         1.47000E-08         4.55427E+01         3.60759E+00         4.19351E+01
+          2.04028E-02         5.79766E-03        -1.37520E-02         1.28193E+00         5.83602E-01         1.28200E+00         4.37939E+01         1.00000E+00         1.50756E-08         4.37939E+01         3.65086E+00         4.01430E+01
+          2.04028E-02         5.96749E-03        -1.38148E-02         1.28192E+00         5.94272E-01         1.28200E+00         4.20801E+01         1.00000E+00         1.54607E-08         4.20801E+01         3.69030E+00         3.83898E+01
+          2.04028E-02         6.13731E-03        -1.38793E-02         1.28192E+00         6.04943E-01         1.28200E+00         4.04027E+01         1.00000E+00         1.58534E-08         4.04027E+01         3.72582E+00         3.66769E+01
+          2.04028E-02         6.30714E-03        -1.39457E-02         1.28192E+00         6.15613E-01         1.28200E+00         3.87630E+01         1.00000E+00         1.62518E-08         3.87630E+01         3.75738E+00         3.50056E+01
+          2.04028E-02         6.47697E-03        -1.40139E-02         1.28192E+00         6.26284E-01         1.28200E+00         3.71620E+01         1.00000E+00         1.66541E-08         3.71620E+01         3.78493E+00         3.33771E+01
+          2.04028E-02         6.64680E-03        -1.40839E-02         1.28192E+00         6.36955E-01         1.28200E+00         3.56008E+01         1.00000E+00         1.70585E-08         3.56008E+01         3.80843E+00         3.17924E+01
+          2.04028E-02         6.81662E-03        -1.41557E-02         1.28192E+00         6.47625E-01         1.28200E+00         3.40804E+01         1.00000E+00         1.74633E-08         3.40804E+01         3.82786E+00         3.02525E+01
+          2.04028E-02         6.98645E-03        -1.42294E-02         1.28192E+00         6.58296E-01         1.28199E+00         3.26014E+01         1.00000E+00         1.78667E-08         3.26014E+01         3.84319E+00         2.87582E+01
+          2.04028E-02         7.15628E-03        -1.43048E-02         1.28191E+00         6.68966E-01         1.28199E+00         3.11646E+01         1.00000E+00         1.82671E-08         3.11646E+01         3.85444E+00         2.73102E+01
+          2.04028E-02         7.32611E-03        -1.43821E-02         1.28191E+00         6.79637E-01         1.28199E+00         2.97706E+01         1.00000E+00         1.86629E-08         2.97706E+01         3.86160E+00         2.59090E+01
+          2.04028E-02         7.49593E-03        -1.44611E-02         1.28191E+00         6.90307E-01         1.28199E+00         2.84198E+01         1.00000E+00         1.90527E-08         2.84198E+01         3.86469E+00         2.45551E+01
+          2.04028E-02         7.66576E-03        -1.45420E-02         1.28191E+00         7.00978E-01         1.28199E+00         2.71126E+01         1.00000E+00         1.94350E-08         2.71126E+01         3.86374E+00         2.32488E+01
+          2.04028E-02         7.83559E-03        -1.46247E-02         1.28191E+00         7.11649E-01         1.28199E+00         2.58492E+01         1.00000E+00         1.98087E-08         2.58492E+01         3.85878E+00         2.19904E+01
+          2.04028E-02         8.00542E-03        -1.47092E-02         1.28191E+00         7.22319E-01         1.28199E+00         2.46297E+01         1.00000E+00         2.01726E-08         2.46297E+01         3.84986E+00         2.07799E+01
+          2.04028E-02         8.17524E-03        -1.47955E-02         1.28190E+00         7.32990E-01         1.28199E+00         2.34543E+01         1.00000E+00         2.05258E-08         2.34543E+01         3.83704E+00         1.96173E+01
+          2.04028E-02         8.34507E-03        -1.48836E-02         1.28190E+00         7.43660E-01         1.28199E+00         2.23229E+01         1.00000E+00         2.08677E-08         2.23229E+01         3.82037E+00         1.85025E+01
+          2.04028E-02         8.51490E-03        -1.49736E-02         1.28190E+00         7.54331E-01         1.28199E+00         2.12353E+01         1.00000E+00         2.11976E-08         2.12353E+01         3.79995E+00         1.74354E+01
+          2.04028E-02         8.68473E-03        -1.50653E-02         1.28190E+00         7.65001E-01         1.28199E+00         2.01913E+01         1.00000E+00         2.15155E-08         2.01913E+01         3.77584E+00         1.64155E+01
+          2.04028E-02         8.85455E-03        -1.51589E-02         1.28190E+00         7.75672E-01         1.28199E+00         1.91906E+01         1.00000E+00         2.18212E-08         1.91906E+01         3.74814E+00         1.54424E+01
+          2.04028E-02         9.02438E-03        -1.52542E-02         1.28189E+00         7.86343E-01         1.28199E+00         1.82327E+01         1.00000E+00         2.21153E-08         1.82327E+01         3.71695E+00         1.45158E+01
+          2.04028E-02         9.19421E-03        -1.53514E-02         1.28189E+00         7.97013E-01         1.28198E+00         1.73172E+01         1.00000E+00         2.23983E-08         1.73172E+01         3.68238E+00         1.36349E+01
+          2.04028E-02         9.36403E-03        -1.54504E-02         1.28189E+00         8.07684E-01         1.28198E+00         1.64436E+01         1.00000E+00         2.26715E-08         1.64436E+01         3.64453E+00         1.27990E+01
+          2.04028E-02         9.53386E-03        -1.55512E-02         1.28189E+00         8.18354E-01         1.28198E+00         1.56111E+01         1.00000E+00         2.29364E-08         1.56111E+01         3.60354E+00         1.20076E+01
+          2.04028E-02         9.70369E-03        -1.56539E-02         1.28189E+00         8.29025E-01         1.28198E+00         1.48191E+01         1.00000E+00         2.31949E-08         1.48191E+01         3.55952E+00         1.12596E+01
+          2.04028E-02         9.87352E-03        -1.57583E-02         1.28188E+00         8.39695E-01         1.28198E+00         1.40668E+01         1.00000E+00         2.34497E-08         1.40668E+01         3.51261E+00         1.05542E+01
+          2.04028E-02         1.00433E-02        -1.58645E-02         1.28188E+00         8.50366E-01         1.28198E+00         1.33534E+01         1.00000E+00         2.37037E-08         1.33534E+01         3.46295E+00         9.89043E+00
+          2.04028E-02         1.02132E-02        -1.59726E-02         1.28188E+00         8.61037E-01         1.28198E+00         1.26779E+01         1.00000E+00         2.39606E-08         1.26779E+01         3.41068E+00         9.26727E+00
+          2.04028E-02         1.03830E-02        -1.60825E-02         1.28188E+00         8.71707E-01         1.28198E+00         1.20396E+01         1.00000E+00         2.42245E-08         1.20396E+01         3.35595E+00         8.68364E+00
+          2.04028E-02         1.05528E-02        -1.61941E-02         1.28188E+00         8.82378E-01         1.28198E+00         1.14373E+01         1.00000E+00         2.45001E-08         1.14373E+01         3.29891E+00         8.13839E+00
+          2.04028E-02         1.07227E-02        -1.63076E-02         1.28187E+00         8.93048E-01         1.28198E+00         1.08701E+01         1.00000E+00         2.47927E-08         1.08701E+01         3.23971E+00         7.63034E+00
+          2.04028E-02         1.08925E-02        -1.64229E-02         1.28187E+00         9.03719E-01         1.28198E+00         1.03368E+01         1.00000E+00         2.51080E-08         1.03368E+01         3.17852E+00         7.15829E+00
+          2.04028E-02         1.10623E-02        -1.65401E-02         1.28187E+00         9.14389E-01         1.28198E+00         9.83646E+00         1.00000E+00         2.54521E-08         9.83646E+00         3.11550E+00         6.72096E+00
+          2.04028E-02         1.12321E-02        -1.66590E-02         1.28187E+00         9.25060E-01         1.28197E+00         9.36788E+00         1.00000E+00         2.58316E-08         9.36788E+00         3.05080E+00         6.31707E+00
+          2.04028E-02         1.14020E-02        -1.67797E-02         1.28186E+00         9.35731E-01         1.28197E+00         8.92991E+00         1.00000E+00         2.62531E-08         8.92991E+00         2.98460E+00         5.94532E+00
+          2.04028E-02         1.15718E-02        -1.69023E-02         1.28186E+00         9.46401E-01         1.28197E+00         8.52140E+00         1.00000E+00         2.67234E-08         8.52140E+00         2.91705E+00         5.60435E+00
+          2.04028E-02         1.17416E-02        -1.70267E-02         1.28186E+00         9.57072E-01         1.28197E+00         8.14115E+00         1.00000E+00         2.72492E-08         8.14115E+00         2.84832E+00         5.29282E+00
+          2.04028E-02         1.19114E-02        -1.71528E-02         1.28186E+00         9.67742E-01         1.28197E+00         7.78796E+00         1.00000E+00         2.78369E-08         7.78796E+00         2.77858E+00         5.00937E+00
+          2.04028E-02         1.20813E-02        -1.72808E-02         1.28185E+00         9.78413E-01         1.28197E+00         7.46062E+00         1.00000E+00         2.84924E-08         7.46062E+00         2.70800E+00         4.75262E+00
+          2.04028E-02         1.22511E-02        -1.74106E-02         1.28185E+00         9.89083E-01         1.28197E+00         7.15793E+00         1.00000E+00         2.92212E-08         7.15793E+00         2.63673E+00         4.52120E+00
+          2.04028E-02         1.24209E-02        -1.75422E-02         1.28185E+00         9.99754E-01         1.28197E+00         6.87867E+00         1.00000E+00         3.00277E-08         6.87867E+00         2.56494E+00         4.31373E+00
+          2.04028E-02         1.25908E-02        -1.76757E-02         1.28185E+00         1.01042E+00         1.28197E+00         6.62162E+00         1.00000E+00         3.09158E-08         6.62162E+00         2.49279E+00         4.12884E+00
+          2.04028E-02         1.27606E-02        -1.78109E-02         1.28184E+00         1.02110E+00         1.28197E+00         6.38560E+00         1.00000E+00         3.18880E-08         6.38560E+00         2.42043E+00         3.96517E+00
+          2.04028E-02         1.29304E-02        -1.79480E-02         1.28184E+00         1.03177E+00         1.28197E+00         6.16939E+00         1.00000E+00         3.29461E-08         6.16939E+00         2.34803E+00         3.82137E+00
+          2.04028E-02         1.31002E-02        -1.80868E-02         1.28184E+00         1.04244E+00         1.28196E+00         5.97183E+00         1.00000E+00         3.40906E-08         5.97183E+00         2.27573E+00         3.69611E+00
+          2.04028E-02         1.32701E-02        -1.82275E-02         1.28183E+00         1.05311E+00         1.28196E+00         5.79175E+00         1.00000E+00         3.53210E-08         5.79175E+00         2.20368E+00         3.58807E+00
+          2.04028E-02         1.34399E-02        -1.83700E-02         1.28183E+00         1.06378E+00         1.28196E+00         5.62800E+00         1.00000E+00         3.66359E-08         5.62800E+00         2.13202E+00         3.49598E+00
+          2.04028E-02         1.36097E-02        -1.85143E-02         1.28183E+00         1.07445E+00         1.28196E+00         5.47946E+00         1.00000E+00         3.80328E-08         5.47946E+00         2.06090E+00         3.41856E+00
+          2.04028E-02         1.37795E-02        -1.86604E-02         1.28183E+00         1.08512E+00         1.28196E+00         5.34503E+00         1.00000E+00         3.95084E-08         5.34503E+00         1.99045E+00         3.35458E+00
+          2.04028E-02         1.39494E-02        -1.88083E-02         1.28182E+00         1.09579E+00         1.28196E+00         5.22365E+00         1.00000E+00         4.10584E-08         5.22365E+00         1.92080E+00         3.30284E+00
+          2.04028E-02         1.41192E-02        -1.89581E-02         1.28182E+00         1.10646E+00         1.28196E+00         5.11425E+00         1.00000E+00         4.26781E-08         5.11425E+00         1.85208E+00         3.26218E+00
+          2.04028E-02         1.42890E-02        -1.91096E-02         1.28182E+00         1.11713E+00         1.28196E+00         5.01584E+00         1.00000E+00         4.43618E-08         5.01584E+00         1.78439E+00         3.23145E+00
+          2.04028E-02         1.44589E-02        -1.92630E-02         1.28181E+00         1.12780E+00         1.28196E+00         4.92744E+00         1.00000E+00         4.61037E-08         4.92744E+00         1.71786E+00         3.20958E+00
+          2.04028E-02         1.46287E-02        -1.94181E-02         1.28181E+00         1.13847E+00         1.28196E+00         4.84810E+00         1.00000E+00         4.78972E-08         4.84810E+00         1.65259E+00         3.19551E+00
+          2.04028E-02         1.47985E-02        -1.95751E-02         1.28181E+00         1.14914E+00         1.28196E+00         4.77691E+00         1.00000E+00         4.97354E-08         4.77691E+00         1.58867E+00         3.18823E+00
+          2.04028E-02         1.49683E-02        -1.97339E-02         1.28180E+00         1.15981E+00         1.28196E+00         4.71300E+00         1.00000E+00         5.16111E-08         4.71300E+00         1.52622E+00         3.18678E+00
+          2.04028E-02         1.51382E-02        -1.98945E-02         1.28180E+00         1.17048E+00         1.28195E+00         4.65554E+00         1.00000E+00         5.35169E-08         4.65554E+00         1.46530E+00         3.19024E+00
+          2.04028E-02         1.53080E-02        -2.00570E-02         1.28180E+00         1.18115E+00         1.28195E+00         4.60374E+00         1.00000E+00         5.54453E-08         4.60374E+00         1.40601E+00         3.19773E+00
+          2.04028E-02         1.54778E-02        -2.02212E-02         1.28179E+00         1.19182E+00         1.28195E+00         4.55684E+00         1.00000E+00         5.73884E-08         4.55684E+00         1.34840E+00         3.20844E+00
+          2.04028E-02         1.56476E-02        -2.03873E-02         1.28179E+00         1.20249E+00         1.28195E+00         4.51414E+00         1.00000E+00         5.93386E-08         4.51414E+00         1.29256E+00         3.22158E+00
+          2.04028E-02         1.58175E-02        -2.05551E-02         1.28179E+00         1.21317E+00         1.28195E+00         4.47496E+00         1.00000E+00         6.12880E-08         4.47496E+00         1.23854E+00         3.23643E+00
+          2.04028E-02         1.59873E-02        -2.07248E-02         1.28178E+00         1.22384E+00         1.28195E+00         4.43868E+00         1.00000E+00         6.32291E-08         4.43868E+00         1.18639E+00         3.25230E+00
+          2.04028E-02         1.61571E-02        -2.08963E-02         1.28178E+00         1.23451E+00         1.28195E+00         4.40471E+00         1.00000E+00         6.51544E-08         4.40471E+00         1.13615E+00         3.26856E+00
+          2.04028E-02         1.63270E-02        -2.10696E-02         1.28178E+00         1.24518E+00         1.28195E+00         4.37251E+00         1.00000E+00         6.70566E-08         4.37251E+00         1.08787E+00         3.28464E+00
+          2.04028E-02         1.64968E-02        -2.12447E-02         1.28177E+00         1.25585E+00         1.28195E+00         4.34157E+00         1.00000E+00         6.89288E-08         4.34157E+00         1.04157E+00         3.30000E+00
+          2.04028E-02         1.66666E-02        -2.14216E-02         1.28177E+00         1.26652E+00         1.28195E+00         4.31143E+00         1.00000E+00         7.07646E-08         4.31143E+00         9.97282E-01         3.31414E+00
+          2.04028E-02         1.68364E-02        -2.16003E-02         1.28177E+00         1.27719E+00         1.28195E+00         4.28167E+00         1.00000E+00         7.25579E-08         4.28167E+00         9.55018E-01         3.32665E+00
+          2.04028E-02         1.70063E-02        -2.17809E-02         1.28176E+00         1.28786E+00         1.28195E+00         4.25191E+00         1.00000E+00         7.43035E-08         4.25191E+00         9.14790E-01         3.33712E+00
+          2.04028E-02         1.71761E-02        -2.19633E-02         1.28176E+00         1.29853E+00         1.28195E+00         4.22181E+00         1.00000E+00         7.59967E-08         4.22181E+00         8.76601E-01         3.34521E+00
+          2.04028E-02         1.73459E-02        -2.21474E-02         1.28175E+00         1.30920E+00         1.28195E+00         4.19107E+00         1.00000E+00         7.76338E-08         4.19107E+00         8.40450E-01         3.35062E+00
+          2.04028E-02         1.75158E-02        -2.23334E-02         1.28175E+00         1.31987E+00         1.28194E+00         4.15943E+00         1.00000E+00         7.92119E-08         4.15943E+00         8.06326E-01         3.35310E+00
+          2.04028E-02         1.76856E-02        -2.25212E-02         1.28175E+00         1.33054E+00         1.28194E+00         4.12665E+00         1.00000E+00         8.07294E-08         4.12665E+00         7.74217E-01         3.35243E+00
+          2.04028E-02         1.78554E-02        -2.27108E-02         1.28174E+00         1.34121E+00         1.28194E+00         4.09254E+00         1.00000E+00         8.21859E-08         4.09254E+00         7.44100E-01         3.34844E+00
+          2.04028E-02         1.80252E-02        -2.29023E-02         1.28174E+00         1.35188E+00         1.28194E+00         4.05695E+00         1.00000E+00         8.35824E-08         4.05695E+00         7.15950E-01         3.34100E+00
+          2.04028E-02         1.81951E-02        -2.30955E-02         1.28173E+00         1.36255E+00         1.28194E+00         4.01975E+00         1.00000E+00         8.49213E-08         4.01975E+00         6.89734E-01         3.33002E+00
+          2.04028E-02         1.83649E-02        -2.32905E-02         1.28173E+00         1.37322E+00         1.28194E+00         3.98085E+00         1.00000E+00         8.62068E-08         3.98085E+00         6.65417E-01         3.31543E+00
+          2.04028E-02         1.85347E-02        -2.34874E-02         1.28173E+00         1.38389E+00         1.28194E+00         3.94019E+00         1.00000E+00         8.74451E-08         3.94019E+00         6.42957E-01         3.29723E+00
+          2.04028E-02         1.87045E-02        -2.36861E-02         1.28172E+00         1.39457E+00         1.28194E+00         3.89772E+00         1.00000E+00         8.86440E-08         3.89772E+00         6.22308E-01         3.27541E+00
+          2.04028E-02         1.88744E-02        -2.38866E-02         1.28172E+00         1.40524E+00         1.28194E+00         3.85345E+00         1.00000E+00         8.98136E-08         3.85345E+00         6.03419E-01         3.25003E+00
+          2.04028E-02         1.90442E-02        -2.40889E-02         1.28171E+00         1.41591E+00         1.28194E+00         3.80738E+00         1.00000E+00         9.09660E-08         3.80738E+00         5.86236E-01         3.22115E+00
+          2.04028E-02         1.92140E-02        -2.42930E-02         1.28171E+00         1.42658E+00         1.28194E+00         3.75957E+00         1.00000E+00         9.21155E-08         3.75957E+00         5.70702E-01         3.18887E+00
+          2.04028E-02         1.93839E-02        -2.44989E-02         1.28171E+00         1.43725E+00         1.28194E+00         3.71007E+00         1.00000E+00         9.32786E-08         3.71007E+00         5.56755E-01         3.15331E+00
+          2.04028E-02         1.95537E-02        -2.47066E-02         1.28170E+00         1.44792E+00         1.28194E+00         3.65897E+00         1.00000E+00         9.44740E-08         3.65897E+00         5.44332E-01         3.11464E+00
+          2.04028E-02         1.97235E-02        -2.49162E-02         1.28170E+00         1.45859E+00         1.28194E+00         3.60637E+00         1.00000E+00         9.57221E-08         3.60637E+00         5.33365E-01         3.07300E+00
+          2.04028E-02         1.98933E-02        -2.51276E-02         1.28169E+00         1.46926E+00         1.28194E+00         3.55239E+00         1.00000E+00         9.70450E-08         3.55239E+00         5.23785E-01         3.02860E+00
+          2.04028E-02         2.00632E-02        -2.53407E-02         1.28169E+00         1.47993E+00         1.28194E+00         3.49716E+00         1.00000E+00         9.84665E-08         3.49716E+00         5.15521E-01         2.98164E+00
+          2.04028E-02         2.02330E-02        -2.55557E-02         1.28168E+00         1.49060E+00         1.28194E+00         3.44083E+00         1.00000E+00         1.00011E-07         3.44083E+00         5.08500E-01         2.93233E+00
+          2.04028E-02         2.04028E-02        -2.57725E-02         1.28168E+00         1.50127E+00         1.28194E+00         3.38356E+00         1.00000E+00         1.01703E-07         3.38356E+00         5.02647E-01         2.88091E+00
+          2.04028E-02         2.05726E-02        -2.59911E-02         1.28168E+00         1.51194E+00         1.28194E+00         3.32552E+00         1.00000E+00         1.03568E-07         3.32552E+00         4.97888E-01         2.82763E+00
+          2.04028E-02         2.07425E-02        -2.62116E-02         1.28167E+00         1.52261E+00         1.28194E+00         3.26689E+00         1.00000E+00         1.05630E-07         3.26689E+00         4.94145E-01         2.77274E+00
+          2.04028E-02         2.09123E-02        -2.64338E-02         1.28167E+00         1.53328E+00         1.28194E+00         3.20784E+00         1.00000E+00         1.07911E-07         3.20784E+00         4.91343E-01         2.71650E+00
+          2.04028E-02         2.10821E-02        -2.66579E-02         1.28166E+00         1.54395E+00         1.28194E+00         3.14858E+00         1.00000E+00         1.10431E-07         3.14858E+00         4.89405E-01         2.65917E+00
+          2.04028E-02         2.12520E-02        -2.68837E-02         1.28166E+00         1.55462E+00         1.28194E+00         3.08929E+00         1.00000E+00         1.13208E-07         3.08929E+00         4.88253E-01         2.60103E+00
+          2.04028E-02         2.14218E-02        -2.71114E-02         1.28165E+00         1.56529E+00         1.28194E+00         3.03016E+00         1.00000E+00         1.16256E-07         3.03016E+00         4.87812E-01         2.54235E+00
+          2.04028E-02         2.15916E-02        -2.73409E-02         1.28165E+00         1.57596E+00         1.28194E+00         2.97140E+00         1.00000E+00         1.19585E-07         2.97140E+00         4.88005E-01         2.48340E+00
+          2.04028E-02         2.17614E-02        -2.75722E-02         1.28164E+00         1.58664E+00         1.28194E+00         2.91320E+00         1.00000E+00         1.23202E-07         2.91320E+00         4.88759E-01         2.42444E+00
+          2.04028E-02         2.19313E-02        -2.78053E-02         1.28164E+00         1.59731E+00         1.28194E+00         2.85574E+00         1.00000E+00         1.27108E-07         2.85574E+00         4.89999E-01         2.36574E+00
+          2.04028E-02         2.21011E-02        -2.80403E-02         1.28163E+00         1.60798E+00         1.28194E+00         2.79922E+00         1.00000E+00         1.31302E-07         2.79922E+00         4.91653E-01         2.30757E+00
+          2.04028E-02         2.22709E-02        -2.82770E-02         1.28163E+00         1.61865E+00         1.28194E+00         2.74382E+00         1.00000E+00         1.35777E-07         2.74382E+00         4.93652E-01         2.25017E+00
+          2.04028E-02         2.24407E-02        -2.85156E-02         1.28162E+00         1.62932E+00         1.28194E+00         2.68973E+00         1.00000E+00         1.40524E-07         2.68973E+00         4.95927E-01         2.19380E+00
+          2.04028E-02         2.26106E-02        -2.87560E-02         1.28162E+00         1.63999E+00         1.28194E+00         2.63710E+00         1.00000E+00         1.45528E-07         2.63710E+00         4.98410E-01         2.13869E+00
+          2.04028E-02         2.27804E-02        -2.89981E-02         1.28161E+00         1.65066E+00         1.28194E+00         2.58611E+00         1.00000E+00         1.50775E-07         2.58611E+00         5.01039E-01         2.08508E+00
+          2.04028E-02         2.29502E-02        -2.92421E-02         1.28161E+00         1.66133E+00         1.28194E+00         2.53691E+00         1.00000E+00         1.56243E-07         2.53691E+00         5.03750E-01         2.03316E+00
+          2.04028E-02         2.31201E-02        -2.94880E-02         1.28160E+00         1.67200E+00         1.28194E+00         2.48965E+00         1.00000E+00         1.61911E-07         2.48965E+00         5.06486E-01         1.98316E+00
+          2.04028E-02         2.32899E-02        -2.97356E-02         1.28160E+00         1.68267E+00         1.28194E+00         2.44445E+00         1.00000E+00         1.67755E-07         2.44445E+00         5.09189E-01         1.93527E+00
+          2.04028E-02         2.34597E-02        -2.99850E-02         1.28159E+00         1.69334E+00         1.28194E+00         2.40145E+00         1.00000E+00         1.73749E-07         2.40145E+00         5.11806E-01         1.88965E+00
+          2.04028E-02         2.36295E-02        -3.02363E-02         1.28159E+00         1.70401E+00         1.28195E+00         2.36076E+00         1.00000E+00         1.79866E-07         2.36076E+00         5.14286E-01         1.84647E+00
+          2.04028E-02         2.37994E-02        -3.04893E-02         1.28158E+00         1.71468E+00         1.28195E+00         2.32246E+00         1.00000E+00         1.86078E-07         2.32246E+00         5.16582E-01         1.80588E+00
+          2.04028E-02         2.39692E-02        -3.07442E-02         1.28158E+00         1.72535E+00         1.28195E+00         2.28666E+00         1.00000E+00         1.92357E-07         2.28666E+00         5.18649E-01         1.76801E+00
+          2.04028E-02         2.41390E-02        -3.10009E-02         1.28157E+00         1.73602E+00         1.28195E+00         2.25343E+00         1.00000E+00         1.98673E-07         2.25343E+00         5.20445E-01         1.73298E+00
+          2.04028E-02         2.43088E-02        -3.12594E-02         1.28157E+00         1.74669E+00         1.28195E+00         2.22282E+00         1.00000E+00         2.04995E-07         2.22282E+00         5.21933E-01         1.70088E+00
+          2.04028E-02         2.44787E-02        -3.15197E-02         1.28156E+00         1.75736E+00         1.28195E+00         2.19488E+00         1.00000E+00         2.11296E-07         2.19488E+00         5.23079E-01         1.67180E+00
+          2.04028E-02         2.46485E-02        -3.17819E-02         1.28156E+00         1.76804E+00         1.28195E+00         2.16965E+00         1.00000E+00         2.17546E-07         2.16965E+00         5.23850E-01         1.64580E+00
+          2.04028E-02         2.48183E-02        -3.20458E-02         1.28155E+00         1.77871E+00         1.28195E+00         2.14715E+00         1.00000E+00         2.23717E-07         2.14715E+00         5.24218E-01         1.62293E+00
+          2.04028E-02         2.49882E-02        -3.23116E-02         1.28155E+00         1.78938E+00         1.28195E+00         2.12738E+00         1.00000E+00         2.29781E-07         2.12738E+00         5.24159E-01         1.60322E+00
+          2.04028E-02         2.51580E-02        -3.25791E-02         1.28154E+00         1.80005E+00         1.28196E+00         2.11033E+00         1.00000E+00         2.35712E-07         2.11033E+00         5.23651E-01         1.58668E+00
+          2.04028E-02         2.53278E-02        -3.28485E-02         1.28154E+00         1.81072E+00         1.28196E+00         2.09599E+00         1.00000E+00         2.41484E-07         2.09599E+00         5.22675E-01         1.57332E+00
+          2.04028E-02         2.54976E-02        -3.31197E-02         1.28153E+00         1.82139E+00         1.28196E+00         2.08433E+00         1.00000E+00         2.47076E-07         2.08433E+00         5.21217E-01         1.56311E+00
+          2.04028E-02         2.56675E-02        -3.33927E-02         1.28152E+00         1.83206E+00         1.28196E+00         2.07528E+00         1.00000E+00         2.52465E-07         2.07528E+00         5.19264E-01         1.55602E+00
+          2.04028E-02         2.58373E-02        -3.36676E-02         1.28152E+00         1.84273E+00         1.28196E+00         2.06881E+00         1.00000E+00         2.57634E-07         2.06881E+00         5.16808E-01         1.55200E+00
+          2.04028E-02         2.60071E-02        -3.39442E-02         1.28151E+00         1.85340E+00         1.28196E+00         2.06482E+00         1.00000E+00         2.62566E-07         2.06482E+00         5.13842E-01         1.55098E+00
+          2.04028E-02         2.61769E-02        -3.42227E-02         1.28151E+00         1.86407E+00         1.28196E+00         2.06325E+00         1.00000E+00         2.67248E-07         2.06325E+00         5.10364E-01         1.55289E+00
+          2.05726E-02         8.72665E-04        -1.29388E-02         1.29262E+00         2.74155E-01         1.29268E+00         9.77692E+01         1.00000E+00         7.45611E-09         9.77692E+01         1.15137E+00         9.66178E+01
+          2.05726E-02         1.04249E-03        -1.29490E-02         1.29262E+00         2.84826E-01         1.29268E+00         9.60125E+01         1.00000E+00         7.35026E-09         9.60125E+01         1.22935E+00         9.47831E+01
+          2.05726E-02         1.21232E-03        -1.29611E-02         1.29262E+00         2.95496E-01         1.29268E+00         9.42197E+01         1.00000E+00         7.25134E-09         9.42197E+01         1.30837E+00         9.29113E+01
+          2.05726E-02         1.38215E-03        -1.29749E-02         1.29262E+00         3.06167E-01         1.29268E+00         9.23938E+01         1.00000E+00         7.16074E-09         9.23938E+01         1.38825E+00         9.10055E+01
+          2.05726E-02         1.55197E-03        -1.29905E-02         1.29262E+00         3.16838E-01         1.29268E+00         9.05377E+01         1.00000E+00         7.07991E-09         9.05377E+01         1.46880E+00         8.90689E+01
+          2.05726E-02         1.72180E-03        -1.30080E-02         1.29262E+00         3.27508E-01         1.29268E+00         8.86544E+01         1.00000E+00         7.01033E-09         8.86544E+01         1.54982E+00         8.71046E+01
+          2.05726E-02         1.89163E-03        -1.30273E-02         1.29262E+00         3.38179E-01         1.29268E+00         8.67471E+01         1.00000E+00         6.95344E-09         8.67471E+01         1.63113E+00         8.51159E+01
+          2.05726E-02         2.06146E-03        -1.30484E-02         1.29261E+00         3.48849E-01         1.29268E+00         8.48186E+01         1.00000E+00         6.91066E-09         8.48186E+01         1.71254E+00         8.31060E+01
+          2.05726E-02         2.23128E-03        -1.30713E-02         1.29261E+00         3.59520E-01         1.29268E+00         8.28720E+01         1.00000E+00         6.88332E-09         8.28720E+01         1.79386E+00         8.10781E+01
+          2.05726E-02         2.40111E-03        -1.30960E-02         1.29261E+00         3.70190E-01         1.29268E+00         8.09103E+01         1.00000E+00         6.87263E-09         8.09103E+01         1.87490E+00         7.90354E+01
+          2.05726E-02         2.57094E-03        -1.31225E-02         1.29261E+00         3.80861E-01         1.29268E+00         7.89364E+01         1.00000E+00         6.87966E-09         7.89364E+01         1.95548E+00         7.69810E+01
+          2.05726E-02         2.74077E-03        -1.31508E-02         1.29261E+00         3.91532E-01         1.29268E+00         7.69534E+01         1.00000E+00         6.90527E-09         7.69534E+01         2.03541E+00         7.49180E+01
+          2.05726E-02         2.91059E-03        -1.31810E-02         1.29261E+00         4.02202E-01         1.29268E+00         7.49641E+01         1.00000E+00         6.95013E-09         7.49641E+01         2.11451E+00         7.28496E+01
+          2.05726E-02         3.08042E-03        -1.32129E-02         1.29261E+00         4.12873E-01         1.29268E+00         7.29714E+01         1.00000E+00         7.01465E-09         7.29714E+01         2.19261E+00         7.07788E+01
+          2.05726E-02         3.25025E-03        -1.32467E-02         1.29261E+00         4.23543E-01         1.29268E+00         7.09781E+01         1.00000E+00         7.09897E-09         7.09781E+01         2.26952E+00         6.87085E+01
+          2.05726E-02         3.42008E-03        -1.32823E-02         1.29261E+00         4.34214E-01         1.29268E+00         6.89870E+01         1.00000E+00         7.20302E-09         6.89870E+01         2.34507E+00         6.66419E+01
+          2.05726E-02         3.58990E-03        -1.33197E-02         1.29261E+00         4.44884E-01         1.29268E+00         6.70008E+01         1.00000E+00         7.32643E-09         6.70008E+01         2.41910E+00         6.45817E+01
+          2.05726E-02         3.75973E-03        -1.33589E-02         1.29261E+00         4.55555E-01         1.29268E+00         6.50221E+01         1.00000E+00         7.46864E-09         6.50221E+01         2.49144E+00         6.25307E+01
+          2.05726E-02         3.92956E-03        -1.33999E-02         1.29261E+00         4.66225E-01         1.29268E+00         6.30536E+01         1.00000E+00         7.62885E-09         6.30536E+01         2.56194E+00         6.04917E+01
+          2.05726E-02         4.09939E-03        -1.34427E-02         1.29261E+00         4.76896E-01         1.29268E+00         6.10978E+01         1.00000E+00         7.80609E-09         6.10978E+01         2.63044E+00         5.84674E+01
+          2.05726E-02         4.26921E-03        -1.34874E-02         1.29261E+00         4.87567E-01         1.29268E+00         5.91570E+01         1.00000E+00         7.99925E-09         5.91570E+01         2.69680E+00         5.64602E+01
+          2.05726E-02         4.43904E-03        -1.35338E-02         1.29260E+00         4.98237E-01         1.29268E+00         5.72337E+01         1.00000E+00         8.20709E-09         5.72337E+01         2.76087E+00         5.44728E+01
+          2.05726E-02         4.60887E-03        -1.35821E-02         1.29260E+00         5.08908E-01         1.29267E+00         5.53300E+01         1.00000E+00         8.42827E-09         5.53300E+01         2.82252E+00         5.25075E+01
+          2.05726E-02         4.77869E-03        -1.36322E-02         1.29260E+00         5.19578E-01         1.29267E+00         5.34482E+01         1.00000E+00         8.66139E-09         5.34482E+01         2.88163E+00         5.05666E+01
+          2.05726E-02         4.94852E-03        -1.36840E-02         1.29260E+00         5.30249E-01         1.29267E+00         5.15903E+01         1.00000E+00         8.90501E-09         5.15903E+01         2.93807E+00         4.86523E+01
+          2.05726E-02         5.11835E-03        -1.37377E-02         1.29260E+00         5.40919E-01         1.29267E+00         4.97583E+01         1.00000E+00         9.15764E-09         4.97583E+01         2.99172E+00         4.67666E+01
+          2.05726E-02         5.28818E-03        -1.37933E-02         1.29260E+00         5.51590E-01         1.29267E+00         4.79541E+01         1.00000E+00         9.41780E-09         4.79541E+01         3.04250E+00         4.49116E+01
+          2.05726E-02         5.45800E-03        -1.38506E-02         1.29260E+00         5.62261E-01         1.29267E+00         4.61794E+01         1.00000E+00         9.68399E-09         4.61794E+01         3.09029E+00         4.30891E+01
+          2.05726E-02         5.62783E-03        -1.39097E-02         1.29260E+00         5.72931E-01         1.29267E+00         4.44358E+01         1.00000E+00         9.95472E-09         4.44358E+01         3.13501E+00         4.13008E+01
+          2.05726E-02         5.79766E-03        -1.39707E-02         1.29260E+00         5.83602E-01         1.29267E+00         4.27251E+01         1.00000E+00         1.02285E-08         4.27251E+01         3.17658E+00         3.95485E+01
+          2.05726E-02         5.96749E-03        -1.40334E-02         1.29259E+00         5.94272E-01         1.29267E+00         4.10485E+01         1.00000E+00         1.05040E-08         4.10485E+01         3.21492E+00         3.78336E+01
+          2.05726E-02         6.13731E-03        -1.40980E-02         1.29259E+00         6.04943E-01         1.29267E+00         3.94074E+01         1.00000E+00         1.07796E-08         3.94074E+01         3.24997E+00         3.61575E+01
+          2.05726E-02         6.30714E-03        -1.41644E-02         1.29259E+00         6.15613E-01         1.29267E+00         3.78031E+01         1.00000E+00         1.10540E-08         3.78031E+01         3.28168E+00         3.45215E+01
+          2.05726E-02         6.47697E-03        -1.42326E-02         1.29259E+00         6.26284E-01         1.29267E+00         3.62367E+01         1.00000E+00         1.13258E-08         3.62367E+01         3.30999E+00         3.29268E+01
+          2.05726E-02         6.64680E-03        -1.43026E-02         1.29259E+00         6.36955E-01         1.29267E+00         3.47092E+01         1.00000E+00         1.15938E-08         3.47092E+01         3.33487E+00         3.13743E+01
+          2.05726E-02         6.81662E-03        -1.43744E-02         1.29259E+00         6.47625E-01         1.29267E+00         3.32215E+01         1.00000E+00         1.18566E-08         3.32215E+01         3.35630E+00         2.98652E+01
+          2.05726E-02         6.98645E-03        -1.44480E-02         1.29259E+00         6.58296E-01         1.29267E+00         3.17743E+01         1.00000E+00         1.21130E-08         3.17743E+01         3.37424E+00         2.84001E+01
+          2.05726E-02         7.15628E-03        -1.45235E-02         1.29258E+00         6.68966E-01         1.29267E+00         3.03684E+01         1.00000E+00         1.23619E-08         3.03684E+01         3.38869E+00         2.69797E+01
+          2.05726E-02         7.32611E-03        -1.46007E-02         1.29258E+00         6.79637E-01         1.29267E+00         2.90043E+01         1.00000E+00         1.26022E-08         2.90043E+01         3.39965E+00         2.56046E+01
+          2.05726E-02         7.49593E-03        -1.46798E-02         1.29258E+00         6.90307E-01         1.29266E+00         2.76825E+01         1.00000E+00         1.28329E-08         2.76825E+01         3.40711E+00         2.42753E+01
+          2.05726E-02         7.66576E-03        -1.47607E-02         1.29258E+00         7.00978E-01         1.29266E+00         2.64033E+01         1.00000E+00         1.30532E-08         2.64033E+01         3.41111E+00         2.29922E+01
+          2.05726E-02         7.83559E-03        -1.48433E-02         1.29258E+00         7.11649E-01         1.29266E+00         2.51670E+01         1.00000E+00         1.32621E-08         2.51670E+01         3.41165E+00         2.17553E+01
+          2.05726E-02         8.00542E-03        -1.49278E-02         1.29258E+00         7.22319E-01         1.29266E+00         2.39737E+01         1.00000E+00         1.34592E-08         2.39737E+01         3.40877E+00         2.05649E+01
+          2.05726E-02         8.17524E-03        -1.50142E-02         1.29257E+00         7.32990E-01         1.29266E+00         2.28235E+01         1.00000E+00         1.36440E-08         2.28235E+01         3.40250E+00         1.94210E+01
+          2.05726E-02         8.34507E-03        -1.51023E-02         1.29257E+00         7.43660E-01         1.29266E+00         2.17165E+01         1.00000E+00         1.38161E-08         2.17165E+01         3.39290E+00         1.83236E+01
+          2.05726E-02         8.51490E-03        -1.51922E-02         1.29257E+00         7.54331E-01         1.29266E+00         2.06523E+01         1.00000E+00         1.39756E-08         2.06523E+01         3.38002E+00         1.72723E+01
+          2.05726E-02         8.68473E-03        -1.52840E-02         1.29257E+00         7.65001E-01         1.29266E+00         1.96309E+01         1.00000E+00         1.41225E-08         1.96309E+01         3.36393E+00         1.62669E+01
+          2.05726E-02         8.85455E-03        -1.53775E-02         1.29257E+00         7.75672E-01         1.29266E+00         1.86518E+01         1.00000E+00         1.42575E-08         1.86518E+01         3.34468E+00         1.53072E+01
+          2.05726E-02         9.02438E-03        -1.54729E-02         1.29256E+00         7.86343E-01         1.29266E+00         1.77148E+01         1.00000E+00         1.43811E-08         1.77148E+01         3.32236E+00         1.43925E+01
+          2.05726E-02         9.19421E-03        -1.55701E-02         1.29256E+00         7.97013E-01         1.29266E+00         1.68194E+01         1.00000E+00         1.44946E-08         1.68194E+01         3.29706E+00         1.35223E+01
+          2.05726E-02         9.36403E-03        -1.56691E-02         1.29256E+00         8.07684E-01         1.29266E+00         1.59649E+01         1.00000E+00         1.45995E-08         1.59649E+01         3.26885E+00         1.26961E+01
+          2.05726E-02         9.53386E-03        -1.57699E-02         1.29256E+00         8.18354E-01         1.29265E+00         1.51509E+01         1.00000E+00         1.46978E-08         1.51509E+01         3.23784E+00         1.19131E+01
+          2.05726E-02         9.70369E-03        -1.58725E-02         1.29256E+00         8.29025E-01         1.29265E+00         1.43766E+01         1.00000E+00         1.47917E-08         1.43766E+01         3.20412E+00         1.11725E+01
+          2.05726E-02         9.87352E-03        -1.59769E-02         1.29255E+00         8.39695E-01         1.29265E+00         1.36413E+01         1.00000E+00         1.48843E-08         1.36413E+01         3.16780E+00         1.04735E+01
+          2.05726E-02         1.00433E-02        -1.60832E-02         1.29255E+00         8.50366E-01         1.29265E+00         1.29441E+01         1.00000E+00         1.49790E-08         1.29441E+01         3.12900E+00         9.81509E+00
+          2.05726E-02         1.02132E-02        -1.61912E-02         1.29255E+00         8.61037E-01         1.29265E+00         1.22843E+01         1.00000E+00         1.50797E-08         1.22843E+01         3.08783E+00         9.19642E+00
+          2.05726E-02         1.03830E-02        -1.63011E-02         1.29255E+00         8.71707E-01         1.29265E+00         1.16608E+01         1.00000E+00         1.51909E-08         1.16608E+01         3.04441E+00         8.61640E+00
+          2.05726E-02         1.05528E-02        -1.64128E-02         1.29255E+00         8.82378E-01         1.29265E+00         1.10728E+01         1.00000E+00         1.53176E-08         1.10728E+01         2.99886E+00         8.07397E+00
+          2.05726E-02         1.07227E-02        -1.65263E-02         1.29254E+00         8.93048E-01         1.29265E+00         1.05193E+01         1.00000E+00         1.54652E-08         1.05193E+01         2.95131E+00         7.56800E+00
+          2.05726E-02         1.08925E-02        -1.66416E-02         1.29254E+00         9.03719E-01         1.29265E+00         9.99922E+00         1.00000E+00         1.56395E-08         9.99922E+00         2.90189E+00         7.09733E+00
+          2.05726E-02         1.10623E-02        -1.67587E-02         1.29254E+00         9.14389E-01         1.29265E+00         9.51149E+00         1.00000E+00         1.58465E-08         9.51149E+00         2.85073E+00         6.66075E+00
+          2.05726E-02         1.12321E-02        -1.68776E-02         1.29254E+00         9.25060E-01         1.29265E+00         9.05502E+00         1.00000E+00         1.60922E-08         9.05502E+00         2.79797E+00         6.25704E+00
+          2.05726E-02         1.14020E-02        -1.69984E-02         1.29253E+00         9.35731E-01         1.29265E+00         8.62868E+00         1.00000E+00         1.63827E-08         8.62868E+00         2.74374E+00         5.88494E+00
+          2.05726E-02         1.15718E-02        -1.71209E-02         1.29253E+00         9.46401E-01         1.29264E+00         8.23135E+00         1.00000E+00         1.67237E-08         8.23135E+00         2.68818E+00         5.54316E+00
+          2.05726E-02         1.17416E-02        -1.72453E-02         1.29253E+00         9.57072E-01         1.29264E+00         7.86185E+00         1.00000E+00         1.71203E-08         7.86185E+00         2.63143E+00         5.23042E+00
+          2.05726E-02         1.19114E-02        -1.73715E-02         1.29253E+00         9.67742E-01         1.29264E+00         7.51902E+00         1.00000E+00         1.75772E-08         7.51902E+00         2.57363E+00         4.94539E+00
+          2.05726E-02         1.20813E-02        -1.74995E-02         1.29252E+00         9.78413E-01         1.29264E+00         7.20167E+00         1.00000E+00         1.80981E-08         7.20167E+00         2.51491E+00         4.68676E+00
+          2.05726E-02         1.22511E-02        -1.76293E-02         1.29252E+00         9.89083E-01         1.29264E+00         6.90862E+00         1.00000E+00         1.86856E-08         6.90862E+00         2.45541E+00         4.45321E+00
+          2.05726E-02         1.24209E-02        -1.77609E-02         1.29252E+00         9.99754E-01         1.29264E+00         6.63868E+00         1.00000E+00         1.93417E-08         6.63868E+00         2.39528E+00         4.24340E+00
+          2.05726E-02         1.25908E-02        -1.78943E-02         1.29251E+00         1.01042E+00         1.29264E+00         6.39066E+00         1.00000E+00         2.00671E-08         6.39066E+00         2.33464E+00         4.05603E+00
+          2.05726E-02         1.27606E-02        -1.80296E-02         1.29251E+00         1.02110E+00         1.29264E+00         6.16339E+00         1.00000E+00         2.08614E-08         6.16339E+00         2.27363E+00         3.88976E+00
+          2.05726E-02         1.29304E-02        -1.81666E-02         1.29251E+00         1.03177E+00         1.29264E+00         5.95568E+00         1.00000E+00         2.17234E-08         5.95568E+00         2.21238E+00         3.74330E+00
+          2.05726E-02         1.31002E-02        -1.83055E-02         1.29251E+00         1.04244E+00         1.29264E+00         5.76638E+00         1.00000E+00         2.26510E-08         5.76638E+00         2.15103E+00         3.61535E+00
+          2.05726E-02         1.32701E-02        -1.84461E-02         1.29250E+00         1.05311E+00         1.29264E+00         5.59435E+00         1.00000E+00         2.36414E-08         5.59435E+00         2.08970E+00         3.50465E+00
+          2.05726E-02         1.34399E-02        -1.85886E-02         1.29250E+00         1.06378E+00         1.29263E+00         5.43845E+00         1.00000E+00         2.46909E-08         5.43845E+00         2.02851E+00         3.40994E+00
+          2.05726E-02         1.36097E-02        -1.87329E-02         1.29250E+00         1.07445E+00         1.29263E+00         5.29759E+00         1.00000E+00         2.57955E-08         5.29759E+00         1.96759E+00         3.33000E+00
+          2.05726E-02         1.37795E-02        -1.88790E-02         1.29249E+00         1.08512E+00         1.29263E+00         5.17067E+00         1.00000E+00         2.69505E-08         5.17067E+00         1.90705E+00         3.26362E+00
+          2.05726E-02         1.39494E-02        -1.90270E-02         1.29249E+00         1.09579E+00         1.29263E+00         5.05664E+00         1.00000E+00         2.81508E-08         5.05664E+00         1.84701E+00         3.20962E+00
+          2.05726E-02         1.41192E-02        -1.91767E-02         1.29249E+00         1.10646E+00         1.29263E+00         4.95446E+00         1.00000E+00         2.93912E-08         4.95446E+00         1.78758E+00         3.16688E+00
+          2.05726E-02         1.42890E-02        -1.93283E-02         1.29249E+00         1.11713E+00         1.29263E+00         4.86315E+00         1.00000E+00         3.06661E-08         4.86315E+00         1.72886E+00         3.13429E+00
+          2.05726E-02         1.44589E-02        -1.94816E-02         1.29248E+00         1.12780E+00         1.29263E+00         4.78171E+00         1.00000E+00         3.19695E-08         4.78171E+00         1.67095E+00         3.11077E+00
+          2.05726E-02         1.46287E-02        -1.96368E-02         1.29248E+00         1.13847E+00         1.29263E+00         4.70923E+00         1.00000E+00         3.32955E-08         4.70923E+00         1.61394E+00         3.09529E+00
+          2.05726E-02         1.47985E-02        -1.97938E-02         1.29248E+00         1.14914E+00         1.29263E+00         4.64480E+00         1.00000E+00         3.46379E-08         4.64480E+00         1.55793E+00         3.08686E+00
+          2.05726E-02         1.49683E-02        -1.99526E-02         1.29247E+00         1.15981E+00         1.29263E+00         4.58754E+00         1.00000E+00         3.59905E-08         4.58754E+00         1.50301E+00         3.08453E+00
+          2.05726E-02         1.51382E-02        -2.01132E-02         1.29247E+00         1.17048E+00         1.29263E+00         4.53664E+00         1.00000E+00         3.73470E-08         4.53664E+00         1.44924E+00         3.08740E+00
+          2.05726E-02         1.53080E-02        -2.02756E-02         1.29247E+00         1.18115E+00         1.29262E+00         4.49131E+00         1.00000E+00         3.87010E-08         4.49131E+00         1.39671E+00         3.09459E+00
+          2.05726E-02         1.54778E-02        -2.04398E-02         1.29246E+00         1.19182E+00         1.29262E+00         4.45078E+00         1.00000E+00         4.00465E-08         4.45078E+00         1.34549E+00         3.10529E+00
+          2.05726E-02         1.56476E-02        -2.06059E-02         1.29246E+00         1.20249E+00         1.29262E+00         4.41436E+00         1.00000E+00         4.13770E-08         4.41436E+00         1.29563E+00         3.11873E+00
+          2.05726E-02         1.58175E-02        -2.07738E-02         1.29246E+00         1.21317E+00         1.29262E+00         4.38136E+00         1.00000E+00         4.26866E-08         4.38136E+00         1.24719E+00         3.13417E+00
+          2.05726E-02         1.59873E-02        -2.09434E-02         1.29245E+00         1.22384E+00         1.29262E+00         4.35116E+00         1.00000E+00         4.39694E-08         4.35116E+00         1.20022E+00         3.15094E+00
+          2.05726E-02         1.61571E-02        -2.11149E-02         1.29245E+00         1.23451E+00         1.29262E+00         4.32317E+00         1.00000E+00         4.52197E-08         4.32317E+00         1.15478E+00         3.16839E+00
+          2.05726E-02         1.63270E-02        -2.12882E-02         1.29245E+00         1.24518E+00         1.29262E+00         4.29684E+00         1.00000E+00         4.64320E-08         4.29684E+00         1.11089E+00         3.18595E+00
+          2.05726E-02         1.64968E-02        -2.14633E-02         1.29244E+00         1.25585E+00         1.29262E+00         4.27166E+00         1.00000E+00         4.76015E-08         4.27166E+00         1.06859E+00         3.20306E+00
+          2.05726E-02         1.66666E-02        -2.16402E-02         1.29244E+00         1.26652E+00         1.29262E+00         4.24716E+00         1.00000E+00         4.87235E-08         4.24716E+00         1.02792E+00         3.21924E+00
+          2.05726E-02         1.68364E-02        -2.18190E-02         1.29243E+00         1.27719E+00         1.29262E+00         4.22291E+00         1.00000E+00         4.97941E-08         4.22291E+00         9.88883E-01         3.23403E+00
+          2.05726E-02         1.70063E-02        -2.19995E-02         1.29243E+00         1.28786E+00         1.29262E+00         4.19853E+00         1.00000E+00         5.08098E-08         4.19853E+00         9.51504E-01         3.24702E+00
+          2.05726E-02         1.71761E-02        -2.21819E-02         1.29243E+00         1.29853E+00         1.29262E+00         4.17366E+00         1.00000E+00         5.17681E-08         4.17366E+00         9.15794E-01         3.25787E+00
+          2.05726E-02         1.73459E-02        -2.23661E-02         1.29242E+00         1.30920E+00         1.29262E+00         4.14800E+00         1.00000E+00         5.26672E-08         4.14800E+00         8.81758E-01         3.26624E+00
+          2.05726E-02         1.75158E-02        -2.25520E-02         1.29242E+00         1.31987E+00         1.29262E+00         4.12126E+00         1.00000E+00         5.35063E-08         4.12126E+00         8.49394E-01         3.27187E+00
+          2.05726E-02         1.76856E-02        -2.27398E-02         1.29242E+00         1.33054E+00         1.29262E+00         4.09322E+00         1.00000E+00         5.42857E-08         4.09322E+00         8.18698E-01         3.27452E+00
+          2.05726E-02         1.78554E-02        -2.29295E-02         1.29241E+00         1.34121E+00         1.29261E+00         4.06366E+00         1.00000E+00         5.50071E-08         4.06366E+00         7.89660E-01         3.27400E+00
+          2.05726E-02         1.80252E-02        -2.31209E-02         1.29241E+00         1.35188E+00         1.29261E+00         4.03243E+00         1.00000E+00         5.56734E-08         4.03243E+00         7.62263E-01         3.27017E+00
+          2.05726E-02         1.81951E-02        -2.33141E-02         1.29240E+00         1.36255E+00         1.29261E+00         3.99938E+00         1.00000E+00         5.62892E-08         3.99938E+00         7.36490E-01         3.26289E+00
+          2.05726E-02         1.83649E-02        -2.35092E-02         1.29240E+00         1.37322E+00         1.29261E+00         3.96441E+00         1.00000E+00         5.68609E-08         3.96441E+00         7.12314E-01         3.25209E+00
+          2.05726E-02         1.85347E-02        -2.37060E-02         1.29240E+00         1.38389E+00         1.29261E+00         3.92744E+00         1.00000E+00         5.73964E-08         3.92744E+00         6.89708E-01         3.23773E+00
+          2.05726E-02         1.87045E-02        -2.39047E-02         1.29239E+00         1.39457E+00         1.29261E+00         3.88843E+00         1.00000E+00         5.79060E-08         3.88843E+00         6.68639E-01         3.21980E+00
+          2.05726E-02         1.88744E-02        -2.41052E-02         1.29239E+00         1.40524E+00         1.29261E+00         3.84737E+00         1.00000E+00         5.84017E-08         3.84737E+00         6.49071E-01         3.19830E+00
+          2.05726E-02         1.90442E-02        -2.43075E-02         1.29238E+00         1.41591E+00         1.29261E+00         3.80426E+00         1.00000E+00         5.88979E-08         3.80426E+00         6.30963E-01         3.17330E+00
+          2.05726E-02         1.92140E-02        -2.45116E-02         1.29238E+00         1.42658E+00         1.29261E+00         3.75913E+00         1.00000E+00         5.94109E-08         3.75913E+00         6.14273E-01         3.14486E+00
+          2.05726E-02         1.93839E-02        -2.47175E-02         1.29237E+00         1.43725E+00         1.29261E+00         3.71204E+00         1.00000E+00         5.99590E-08         3.71204E+00         5.98954E-01         3.11309E+00
+          2.05726E-02         1.95537E-02        -2.49253E-02         1.29237E+00         1.44792E+00         1.29261E+00         3.66306E+00         1.00000E+00         6.05626E-08         3.66306E+00         5.84958E-01         3.07810E+00
+          2.05726E-02         1.97235E-02        -2.51348E-02         1.29237E+00         1.45859E+00         1.29261E+00         3.61229E+00         1.00000E+00         6.12434E-08         3.61229E+00         5.72232E-01         3.04006E+00
+          2.05726E-02         1.98933E-02        -2.53462E-02         1.29236E+00         1.46926E+00         1.29261E+00         3.55984E+00         1.00000E+00         6.20242E-08         3.55984E+00         5.60722E-01         2.99912E+00
+          2.05726E-02         2.00632E-02        -2.55594E-02         1.29236E+00         1.47993E+00         1.29261E+00         3.50584E+00         1.00000E+00         6.29284E-08         3.50584E+00         5.50374E-01         2.95547E+00
+          2.05726E-02         2.02330E-02        -2.57743E-02         1.29235E+00         1.49060E+00         1.29261E+00         3.45043E+00         1.00000E+00         6.39793E-08         3.45043E+00         5.41129E-01         2.90930E+00
+          2.05726E-02         2.04028E-02        -2.59911E-02         1.29235E+00         1.50127E+00         1.29261E+00         3.39377E+00         1.00000E+00         6.51995E-08         3.39377E+00         5.32928E-01         2.86084E+00
+          2.05726E-02         2.05726E-02        -2.62098E-02         1.29234E+00         1.51194E+00         1.29261E+00         3.33602E+00         1.00000E+00         6.66095E-08         3.33602E+00         5.25711E-01         2.81031E+00
+          2.05726E-02         2.07425E-02        -2.64302E-02         1.29234E+00         1.52261E+00         1.29261E+00         3.27736E+00         1.00000E+00         6.82281E-08         3.27736E+00         5.19416E-01         2.75795E+00
+          2.05726E-02         2.09123E-02        -2.66524E-02         1.29233E+00         1.53328E+00         1.29261E+00         3.21798E+00         1.00000E+00         7.00703E-08         3.21798E+00         5.13982E-01         2.70399E+00
+          2.05726E-02         2.10821E-02        -2.68765E-02         1.29233E+00         1.54395E+00         1.29261E+00         3.15805E+00         1.00000E+00         7.21481E-08         3.15805E+00         5.09346E-01         2.64871E+00
+          2.05726E-02         2.12520E-02        -2.71024E-02         1.29233E+00         1.55462E+00         1.29261E+00         3.09779E+00         1.00000E+00         7.44691E-08         3.09779E+00         5.05446E-01         2.59234E+00
+          2.05726E-02         2.14218E-02        -2.73300E-02         1.29232E+00         1.56529E+00         1.29261E+00         3.03738E+00         1.00000E+00         7.70370E-08         3.03738E+00         5.02219E-01         2.53516E+00
+          2.05726E-02         2.15916E-02        -2.75595E-02         1.29232E+00         1.57596E+00         1.29261E+00         2.97702E+00         1.00000E+00         7.98512E-08         2.97702E+00         4.99603E-01         2.47742E+00
+          2.05726E-02         2.17614E-02        -2.77908E-02         1.29231E+00         1.58664E+00         1.29261E+00         2.91692E+00         1.00000E+00         8.29071E-08         2.91692E+00         4.97536E-01         2.41939E+00
+          2.05726E-02         2.19313E-02        -2.80240E-02         1.29231E+00         1.59731E+00         1.29261E+00         2.85728E+00         1.00000E+00         8.61966E-08         2.85728E+00         4.95958E-01         2.36132E+00
+          2.05726E-02         2.21011E-02        -2.82589E-02         1.29230E+00         1.60798E+00         1.29261E+00         2.79828E+00         1.00000E+00         8.97081E-08         2.79828E+00         4.94807E-01         2.30348E+00
+          2.05726E-02         2.22709E-02        -2.84956E-02         1.29230E+00         1.61865E+00         1.29261E+00         2.74013E+00         1.00000E+00         9.34273E-08         2.74013E+00         4.94025E-01         2.24611E+00
+          2.05726E-02         2.24407E-02        -2.87342E-02         1.29229E+00         1.62932E+00         1.29261E+00         2.68302E+00         1.00000E+00         9.73374E-08         2.68302E+00         4.93555E-01         2.18946E+00
+          2.05726E-02         2.26106E-02        -2.89746E-02         1.29229E+00         1.63999E+00         1.29261E+00         2.62711E+00         1.00000E+00         1.01419E-07         2.62711E+00         4.93341E-01         2.13377E+00
+          2.05726E-02         2.27804E-02        -2.92167E-02         1.29228E+00         1.65066E+00         1.29261E+00         2.57260E+00         1.00000E+00         1.05653E-07         2.57260E+00         4.93327E-01         2.07928E+00
+          2.05726E-02         2.29502E-02        -2.94607E-02         1.29228E+00         1.66133E+00         1.29261E+00         2.51965E+00         1.00000E+00         1.10016E-07         2.51965E+00         4.93462E-01         2.02619E+00
+          2.05726E-02         2.31201E-02        -2.97066E-02         1.29227E+00         1.67200E+00         1.29261E+00         2.46842E+00         1.00000E+00         1.14485E-07         2.46842E+00         4.93695E-01         1.97473E+00
+          2.05726E-02         2.32899E-02        -2.99542E-02         1.29227E+00         1.68267E+00         1.29261E+00         2.41906E+00         1.00000E+00         1.19038E-07         2.41906E+00         4.93976E-01         1.92509E+00
+          2.05726E-02         2.34597E-02        -3.02036E-02         1.29226E+00         1.69334E+00         1.29261E+00         2.37171E+00         1.00000E+00         1.23649E-07         2.37171E+00         4.94260E-01         1.87745E+00
+          2.05726E-02         2.36295E-02        -3.04549E-02         1.29226E+00         1.70401E+00         1.29262E+00         2.32650E+00         1.00000E+00         1.28295E-07         2.32650E+00         4.94503E-01         1.83199E+00
+          2.05726E-02         2.37994E-02        -3.07079E-02         1.29225E+00         1.71468E+00         1.29262E+00         2.28354E+00         1.00000E+00         1.32951E-07         2.28354E+00         4.94663E-01         1.78888E+00
+          2.05726E-02         2.39692E-02        -3.09628E-02         1.29225E+00         1.72535E+00         1.29262E+00         2.24295E+00         1.00000E+00         1.37591E-07         2.24295E+00         4.94701E-01         1.74825E+00
+          2.05726E-02         2.41390E-02        -3.12195E-02         1.29224E+00         1.73602E+00         1.29262E+00         2.20481E+00         1.00000E+00         1.42192E-07         2.20481E+00         4.94580E-01         1.71023E+00
+          2.05726E-02         2.43088E-02        -3.14780E-02         1.29224E+00         1.74669E+00         1.29262E+00         2.16921E+00         1.00000E+00         1.46730E-07         2.16921E+00         4.94266E-01         1.67494E+00
+          2.05726E-02         2.44787E-02        -3.17383E-02         1.29223E+00         1.75736E+00         1.29262E+00         2.13621E+00         1.00000E+00         1.51181E-07         2.13621E+00         4.93729E-01         1.64248E+00
+          2.05726E-02         2.46485E-02        -3.20005E-02         1.29222E+00         1.76804E+00         1.29262E+00         2.10587E+00         1.00000E+00         1.55521E-07         2.10587E+00         4.92938E-01         1.61293E+00
+          2.05726E-02         2.48183E-02        -3.22644E-02         1.29222E+00         1.77871E+00         1.29262E+00         2.07823E+00         1.00000E+00         1.59730E-07         2.07823E+00         4.91869E-01         1.58637E+00
+          2.05726E-02         2.49882E-02        -3.25302E-02         1.29221E+00         1.78938E+00         1.29262E+00         2.05332E+00         1.00000E+00         1.63786E-07         2.05332E+00         4.90498E-01         1.56282E+00
+          2.05726E-02         2.51580E-02        -3.27977E-02         1.29221E+00         1.80005E+00         1.29262E+00         2.03115E+00         1.00000E+00         1.67671E-07         2.03115E+00         4.88804E-01         1.54235E+00
+          2.05726E-02         2.53278E-02        -3.30671E-02         1.29220E+00         1.81072E+00         1.29263E+00         2.01172E+00         1.00000E+00         1.71365E-07         2.01172E+00         4.86770E-01         1.52495E+00
+          2.05726E-02         2.54976E-02        -3.33383E-02         1.29220E+00         1.82139E+00         1.29263E+00         1.99503E+00         1.00000E+00         1.74854E-07         1.99503E+00         4.84381E-01         1.51064E+00
+          2.05726E-02         2.56675E-02        -3.36113E-02         1.29219E+00         1.83206E+00         1.29263E+00         1.98103E+00         1.00000E+00         1.78123E-07         1.98103E+00         4.81623E-01         1.49941E+00
+          2.05726E-02         2.58373E-02        -3.38862E-02         1.29219E+00         1.84273E+00         1.29263E+00         1.96970E+00         1.00000E+00         1.81161E-07         1.96970E+00         4.78486E-01         1.49122E+00
+          2.05726E-02         2.60071E-02        -3.41628E-02         1.29218E+00         1.85340E+00         1.29263E+00         1.96099E+00         1.00000E+00         1.83959E-07         1.96099E+00         4.74964E-01         1.48603E+00
+          2.05726E-02         2.61769E-02        -3.44412E-02         1.29217E+00         1.86407E+00         1.29263E+00         1.95483E+00         1.00000E+00         1.86511E-07         1.95483E+00         4.71051E-01         1.48378E+00
+          2.07425E-02         8.72665E-04        -1.31593E-02         1.30329E+00         2.74155E-01         1.30335E+00         9.55124E+01         1.00000E+00         4.31503E-09         9.55124E+01         1.03698E+00         9.44754E+01
+          2.07425E-02         1.04249E-03        -1.31695E-02         1.30329E+00         2.84826E-01         1.30335E+00         9.37961E+01         1.00000E+00         4.24227E-09         9.37961E+01         1.10287E+00         9.26932E+01
+          2.07425E-02         1.21232E-03        -1.31815E-02         1.30329E+00         2.95496E-01         1.30335E+00         9.20445E+01         1.00000E+00         4.17735E-09         9.20445E+01         1.16969E+00         9.08748E+01
+          2.07425E-02         1.38215E-03        -1.31954E-02         1.30329E+00         3.06167E-01         1.30335E+00         9.02604E+01         1.00000E+00         4.12158E-09         9.02604E+01         1.23731E+00         8.90231E+01
+          2.07425E-02         1.55197E-03        -1.32110E-02         1.30329E+00         3.16838E-01         1.30335E+00         8.84468E+01         1.00000E+00         4.07624E-09         8.84468E+01         1.30555E+00         8.71413E+01
+          2.07425E-02         1.72180E-03        -1.32285E-02         1.30329E+00         3.27508E-01         1.30335E+00         8.66066E+01         1.00000E+00         4.04255E-09         8.66066E+01         1.37427E+00         8.52324E+01
+          2.07425E-02         1.89163E-03        -1.32478E-02         1.30329E+00         3.38179E-01         1.30335E+00         8.47428E+01         1.00000E+00         4.02164E-09         8.47428E+01         1.44331E+00         8.32995E+01
+          2.07425E-02         2.06146E-03        -1.32688E-02         1.30329E+00         3.48849E-01         1.30335E+00         8.28582E+01         1.00000E+00         4.01451E-09         8.28582E+01         1.51251E+00         8.13457E+01
+          2.07425E-02         2.23128E-03        -1.32917E-02         1.30328E+00         3.59520E-01         1.30335E+00         8.09559E+01         1.00000E+00         4.02196E-09         8.09559E+01         1.58173E+00         7.93742E+01
+          2.07425E-02         2.40111E-03        -1.33165E-02         1.30328E+00         3.70190E-01         1.30335E+00         7.90388E+01         1.00000E+00         4.04458E-09         7.90388E+01         1.65080E+00         7.73880E+01
+          2.07425E-02         2.57094E-03        -1.33430E-02         1.30328E+00         3.80861E-01         1.30335E+00         7.71097E+01         1.00000E+00         4.08273E-09         7.71097E+01         1.71957E+00         7.53901E+01
+          2.07425E-02         2.74077E-03        -1.33713E-02         1.30328E+00         3.91532E-01         1.30335E+00         7.51715E+01         1.00000E+00         4.13649E-09         7.51715E+01         1.78788E+00         7.33836E+01
+          2.07425E-02         2.91059E-03        -1.34015E-02         1.30328E+00         4.02202E-01         1.30335E+00         7.32271E+01         1.00000E+00         4.20570E-09         7.32271E+01         1.85560E+00         7.13715E+01
+          2.07425E-02         3.08042E-03        -1.34334E-02         1.30328E+00         4.12873E-01         1.30335E+00         7.12793E+01         1.00000E+00         4.28996E-09         7.12793E+01         1.92256E+00         6.93567E+01
+          2.07425E-02         3.25025E-03        -1.34672E-02         1.30328E+00         4.23543E-01         1.30335E+00         6.93308E+01         1.00000E+00         4.38865E-09         6.93308E+01         1.98862E+00         6.73422E+01
+          2.07425E-02         3.42008E-03        -1.35028E-02         1.30328E+00         4.34214E-01         1.30335E+00         6.73844E+01         1.00000E+00         4.50097E-09         6.73844E+01         2.05365E+00         6.53307E+01
+          2.07425E-02         3.58990E-03        -1.35402E-02         1.30328E+00         4.44884E-01         1.30335E+00         6.54426E+01         1.00000E+00         4.62597E-09         6.54426E+01         2.11749E+00         6.33252E+01
+          2.07425E-02         3.75973E-03        -1.35794E-02         1.30328E+00         4.55555E-01         1.30335E+00         6.35082E+01         1.00000E+00         4.76262E-09         6.35082E+01         2.18001E+00         6.13282E+01
+          2.07425E-02         3.92956E-03        -1.36204E-02         1.30328E+00         4.66225E-01         1.30335E+00         6.15836E+01         1.00000E+00         4.90978E-09         6.15836E+01         2.24109E+00         5.93425E+01
+          2.07425E-02         4.09939E-03        -1.36632E-02         1.30328E+00         4.76896E-01         1.30335E+00         5.96713E+01         1.00000E+00         5.06629E-09         5.96713E+01         2.30058E+00         5.73707E+01
+          2.07425E-02         4.26921E-03        -1.37078E-02         1.30328E+00         4.87567E-01         1.30335E+00         5.77736E+01         1.00000E+00         5.23094E-09         5.77736E+01         2.35837E+00         5.54152E+01
+          2.07425E-02         4.43904E-03        -1.37543E-02         1.30328E+00         4.98237E-01         1.30335E+00         5.58928E+01         1.00000E+00         5.40253E-09         5.58928E+01         2.41433E+00         5.34785E+01
+          2.07425E-02         4.60887E-03        -1.38026E-02         1.30327E+00         5.08908E-01         1.30335E+00         5.40312E+01         1.00000E+00         5.57988E-09         5.40312E+01         2.46836E+00         5.15628E+01
+          2.07425E-02         4.77869E-03        -1.38526E-02         1.30327E+00         5.19578E-01         1.30335E+00         5.21908E+01         1.00000E+00         5.76180E-09         5.21908E+01         2.52034E+00         4.96705E+01
+          2.07425E-02         4.94852E-03        -1.39045E-02         1.30327E+00         5.30249E-01         1.30335E+00         5.03738E+01         1.00000E+00         5.94714E-09         5.03738E+01         2.57017E+00         4.78036E+01
+          2.07425E-02         5.11835E-03        -1.39582E-02         1.30327E+00         5.40919E-01         1.30335E+00         4.85819E+01         1.00000E+00         6.13475E-09         4.85819E+01         2.61776E+00         4.59642E+01
+          2.07425E-02         5.28818E-03        -1.40137E-02         1.30327E+00         5.51590E-01         1.30335E+00         4.68171E+01         1.00000E+00         6.32354E-09         4.68171E+01         2.66300E+00         4.41541E+01
+          2.07425E-02         5.45800E-03        -1.40710E-02         1.30327E+00         5.62261E-01         1.30334E+00         4.50811E+01         1.00000E+00         6.51240E-09         4.50811E+01         2.70582E+00         4.23753E+01
+          2.07425E-02         5.62783E-03        -1.41302E-02         1.30327E+00         5.72931E-01         1.30334E+00         4.33755E+01         1.00000E+00         6.70028E-09         4.33755E+01         2.74614E+00         4.06294E+01
+          2.07425E-02         5.79766E-03        -1.41911E-02         1.30327E+00         5.83602E-01         1.30334E+00         4.17019E+01         1.00000E+00         6.88615E-09         4.17019E+01         2.78388E+00         3.89180E+01
+          2.07425E-02         5.96749E-03        -1.42539E-02         1.30326E+00         5.94272E-01         1.30334E+00         4.00616E+01         1.00000E+00         7.06899E-09         4.00616E+01         2.81898E+00         3.72426E+01
+          2.07425E-02         6.13731E-03        -1.43185E-02         1.30326E+00         6.04943E-01         1.30334E+00         3.84559E+01         1.00000E+00         7.24781E-09         3.84559E+01         2.85139E+00         3.56046E+01
+          2.07425E-02         6.30714E-03        -1.43848E-02         1.30326E+00         6.15613E-01         1.30334E+00         3.68862E+01         1.00000E+00         7.42166E-09         3.68862E+01         2.88104E+00         3.40052E+01
+          2.07425E-02         6.47697E-03        -1.44530E-02         1.30326E+00         6.26284E-01         1.30334E+00         3.53535E+01         1.00000E+00         7.58960E-09         3.53535E+01         2.90789E+00         3.24456E+01
+          2.07425E-02         6.64680E-03        -1.45230E-02         1.30326E+00         6.36955E-01         1.30334E+00         3.38587E+01         1.00000E+00         7.75075E-09         3.38587E+01         2.93191E+00         3.09268E+01
+          2.07425E-02         6.81662E-03        -1.45949E-02         1.30326E+00         6.47625E-01         1.30334E+00         3.24028E+01         1.00000E+00         7.90425E-09         3.24028E+01         2.95307E+00         2.94497E+01
+          2.07425E-02         6.98645E-03        -1.46685E-02         1.30326E+00         6.58296E-01         1.30334E+00         3.09865E+01         1.00000E+00         8.04928E-09         3.09865E+01         2.97134E+00         2.80152E+01
+          2.07425E-02         7.15628E-03        -1.47439E-02         1.30325E+00         6.68966E-01         1.30334E+00         2.96105E+01         1.00000E+00         8.18509E-09         2.96105E+01         2.98670E+00         2.66238E+01
+          2.07425E-02         7.32611E-03        -1.48212E-02         1.30325E+00         6.79637E-01         1.30334E+00         2.82754E+01         1.00000E+00         8.31099E-09         2.82754E+01         2.99916E+00         2.52763E+01
+          2.07425E-02         7.49593E-03        -1.49002E-02         1.30325E+00         6.90307E-01         1.30334E+00         2.69817E+01         1.00000E+00         8.42637E-09         2.69817E+01         3.00869E+00         2.39730E+01
+          2.07425E-02         7.66576E-03        -1.49811E-02         1.30325E+00         7.00978E-01         1.30334E+00         2.57296E+01         1.00000E+00         8.53069E-09         2.57296E+01         3.01532E+00         2.27143E+01
+          2.07425E-02         7.83559E-03        -1.50638E-02         1.30325E+00         7.11649E-01         1.30333E+00         2.45195E+01         1.00000E+00         8.62355E-09         2.45195E+01         3.01905E+00         2.15004E+01
+          2.07425E-02         8.00542E-03        -1.51483E-02         1.30325E+00         7.22319E-01         1.30333E+00         2.33515E+01         1.00000E+00         8.70466E-09         2.33515E+01         3.01990E+00         2.03315E+01
+          2.07425E-02         8.17524E-03        -1.52346E-02         1.30324E+00         7.32990E-01         1.30333E+00         2.22256E+01         1.00000E+00         8.77388E-09         2.22256E+01         3.01790E+00         1.92077E+01
+          2.07425E-02         8.34507E-03        -1.53227E-02         1.30324E+00         7.43660E-01         1.30333E+00         2.11419E+01         1.00000E+00         8.83125E-09         2.11419E+01         3.01308E+00         1.81289E+01
+          2.07425E-02         8.51490E-03        -1.54127E-02         1.30324E+00         7.54331E-01         1.30333E+00         2.01003E+01         1.00000E+00         8.87700E-09         2.01003E+01         3.00548E+00         1.70948E+01
+          2.07425E-02         8.68473E-03        -1.55044E-02         1.30324E+00         7.65001E-01         1.30333E+00         1.91005E+01         1.00000E+00         8.91163E-09         1.91005E+01         2.99513E+00         1.61053E+01
+          2.07425E-02         8.85455E-03        -1.55980E-02         1.30324E+00         7.75672E-01         1.30333E+00         1.81422E+01         1.00000E+00         8.93589E-09         1.81422E+01         2.98210E+00         1.51601E+01
+          2.07425E-02         9.02438E-03        -1.56934E-02         1.30323E+00         7.86343E-01         1.30333E+00         1.72251E+01         1.00000E+00         8.95085E-09         1.72251E+01         2.96645E+00         1.42587E+01
+          2.07425E-02         9.19421E-03        -1.57905E-02         1.30323E+00         7.97013E-01         1.30333E+00         1.63487E+01         1.00000E+00         8.95794E-09         1.63487E+01         2.94822E+00         1.34005E+01
+          2.07425E-02         9.36403E-03        -1.58895E-02         1.30323E+00         8.07684E-01         1.30333E+00         1.55126E+01         1.00000E+00         8.95899E-09         1.55126E+01         2.92749E+00         1.25851E+01
+          2.07425E-02         9.53386E-03        -1.59904E-02         1.30323E+00         8.18354E-01         1.30333E+00         1.47160E+01         1.00000E+00         8.95627E-09         1.47160E+01         2.90434E+00         1.18117E+01
+          2.07425E-02         9.70369E-03        -1.60930E-02         1.30323E+00         8.29025E-01         1.30333E+00         1.39584E+01         1.00000E+00         8.95254E-09         1.39584E+01         2.87884E+00         1.10796E+01
+          2.07425E-02         9.87352E-03        -1.61974E-02         1.30322E+00         8.39695E-01         1.30333E+00         1.32391E+01         1.00000E+00         8.95107E-09         1.32391E+01         2.85107E+00         1.03880E+01
+          2.07425E-02         1.00433E-02        -1.63037E-02         1.30322E+00         8.50366E-01         1.30332E+00         1.25572E+01         1.00000E+00         8.95565E-09         1.25572E+01         2.82112E+00         9.73605E+00
+          2.07425E-02         1.02132E-02        -1.64117E-02         1.30322E+00         8.61037E-01         1.30332E+00         1.19119E+01         1.00000E+00         8.97060E-09         1.19119E+01         2.78909E+00         9.12283E+00
+          2.07425E-02         1.03830E-02        -1.65216E-02         1.30322E+00         8.71707E-01         1.30332E+00         1.13024E+01         1.00000E+00         9.00072E-09         1.13024E+01         2.75506E+00         8.54737E+00
+          2.07425E-02         1.05528E-02        -1.66333E-02         1.30322E+00         8.82378E-01         1.30332E+00         1.07278E+01         1.00000E+00         9.05119E-09         1.07278E+01         2.71913E+00         8.00863E+00
+          2.07425E-02         1.07227E-02        -1.67467E-02         1.30321E+00         8.93048E-01         1.30332E+00         1.01870E+01         1.00000E+00         9.12751E-09         1.01870E+01         2.68141E+00         7.50556E+00
+          2.07425E-02         1.08925E-02        -1.68621E-02         1.30321E+00         9.03719E-01         1.30332E+00         9.67902E+00         1.00000E+00         9.23524E-09         9.67902E+00         2.64199E+00         7.03703E+00
+          2.07425E-02         1.10623E-02        -1.69792E-02         1.30321E+00         9.14389E-01         1.30332E+00         9.20290E+00         1.00000E+00         9.37988E-09         9.20290E+00         2.60099E+00         6.60192E+00
+          2.07425E-02         1.12321E-02        -1.70981E-02         1.30321E+00         9.25060E-01         1.30332E+00         8.75754E+00         1.00000E+00         9.56655E-09         8.75754E+00         2.55851E+00         6.19903E+00
+          2.07425E-02         1.14020E-02        -1.72188E-02         1.30320E+00         9.35731E-01         1.30332E+00         8.34184E+00         1.00000E+00         9.79982E-09         8.34184E+00         2.51466E+00         5.82717E+00
+          2.07425E-02         1.15718E-02        -1.73414E-02         1.30320E+00         9.46401E-01         1.30332E+00         7.95468E+00         1.00000E+00         1.00835E-08         7.95468E+00         2.46956E+00         5.48512E+00
+          2.07425E-02         1.17416E-02        -1.74658E-02         1.30320E+00         9.57072E-01         1.30332E+00         7.59494E+00         1.00000E+00         1.04203E-08         7.59494E+00         2.42331E+00         5.17163E+00
+          2.07425E-02         1.19114E-02        -1.75919E-02         1.30320E+00         9.67742E-01         1.30331E+00         7.26147E+00         1.00000E+00         1.08121E-08         7.26147E+00         2.37603E+00         4.88544E+00
+          2.07425E-02         1.20813E-02        -1.77199E-02         1.30319E+00         9.78413E-01         1.30331E+00         6.95312E+00         1.00000E+00         1.12595E-08         6.95312E+00         2.32783E+00         4.62529E+00
+          2.07425E-02         1.22511E-02        -1.78497E-02         1.30319E+00         9.89083E-01         1.30331E+00         6.66873E+00         1.00000E+00         1.17622E-08         6.66873E+00         2.27883E+00         4.38990E+00
+          2.07425E-02         1.24209E-02        -1.79813E-02         1.30319E+00         9.99754E-01         1.30331E+00         6.40713E+00         1.00000E+00         1.23191E-08         6.40713E+00         2.22913E+00         4.17800E+00
+          2.07425E-02         1.25908E-02        -1.81148E-02         1.30318E+00         1.01042E+00         1.30331E+00         6.16717E+00         1.00000E+00         1.29280E-08         6.16717E+00         2.17886E+00         3.98831E+00
+          2.07425E-02         1.27606E-02        -1.82500E-02         1.30318E+00         1.02110E+00         1.30331E+00         5.94768E+00         1.00000E+00         1.35864E-08         5.94768E+00         2.12811E+00         3.81957E+00
+          2.07425E-02         1.29304E-02        -1.83871E-02         1.30318E+00         1.03177E+00         1.30331E+00         5.74752E+00         1.00000E+00         1.42908E-08         5.74752E+00         2.07701E+00         3.67052E+00
+          2.07425E-02         1.31002E-02        -1.85259E-02         1.30318E+00         1.04244E+00         1.30331E+00         5.56556E+00         1.00000E+00         1.50378E-08         5.56556E+00         2.02566E+00         3.53990E+00
+          2.07425E-02         1.32701E-02        -1.86666E-02         1.30317E+00         1.05311E+00         1.30331E+00         5.40066E+00         1.00000E+00         1.58234E-08         5.40066E+00         1.97416E+00         3.42650E+00
+          2.07425E-02         1.34399E-02        -1.88091E-02         1.30317E+00         1.06378E+00         1.30331E+00         5.25172E+00         1.00000E+00         1.66435E-08         5.25172E+00         1.92263E+00         3.32909E+00
+          2.07425E-02         1.36097E-02        -1.89534E-02         1.30317E+00         1.07445E+00         1.30331E+00         5.11764E+00         1.00000E+00         1.74935E-08         5.11764E+00         1.87116E+00         3.24649E+00
+          2.07425E-02         1.37795E-02        -1.90995E-02         1.30316E+00         1.08512E+00         1.30330E+00         4.99737E+00         1.00000E+00         1.83692E-08         4.99737E+00         1.81985E+00         3.17753E+00
+          2.07425E-02         1.39494E-02        -1.92474E-02         1.30316E+00         1.09579E+00         1.30330E+00         4.88986E+00         1.00000E+00         1.92658E-08         4.88986E+00         1.76880E+00         3.12106E+00
+          2.07425E-02         1.41192E-02        -1.93972E-02         1.30316E+00         1.10646E+00         1.30330E+00         4.79410E+00         1.00000E+00         2.01787E-08         4.79410E+00         1.71811E+00         3.07599E+00
+          2.07425E-02         1.42890E-02        -1.95487E-02         1.30315E+00         1.11713E+00         1.30330E+00         4.70908E+00         1.00000E+00         2.11031E-08         4.70908E+00         1.66786E+00         3.04122E+00
+          2.07425E-02         1.44589E-02        -1.97021E-02         1.30315E+00         1.12780E+00         1.30330E+00         4.63386E+00         1.00000E+00         2.20342E-08         4.63386E+00         1.61814E+00         3.01572E+00
+          2.07425E-02         1.46287E-02        -1.98572E-02         1.30315E+00         1.13847E+00         1.30330E+00         4.56751E+00         1.00000E+00         2.29672E-08         4.56751E+00         1.56903E+00         2.99848E+00
+          2.07425E-02         1.47985E-02        -2.00142E-02         1.30315E+00         1.14914E+00         1.30330E+00         4.50913E+00         1.00000E+00         2.38972E-08         4.50913E+00         1.52061E+00         2.98852E+00
+          2.07425E-02         1.49683E-02        -2.01730E-02         1.30314E+00         1.15981E+00         1.30330E+00         4.45787E+00         1.00000E+00         2.48194E-08         4.45787E+00         1.47296E+00         2.98491E+00
+          2.07425E-02         1.51382E-02        -2.03336E-02         1.30314E+00         1.17048E+00         1.30330E+00         4.41290E+00         1.00000E+00         2.57288E-08         4.41290E+00         1.42614E+00         2.98675E+00
+          2.07425E-02         1.53080E-02        -2.04961E-02         1.30314E+00         1.18115E+00         1.30330E+00         4.37343E+00         1.00000E+00         2.66207E-08         4.37343E+00         1.38023E+00         2.99320E+00
+          2.07425E-02         1.54778E-02        -2.06603E-02         1.30313E+00         1.19182E+00         1.30330E+00         4.33872E+00         1.00000E+00         2.74903E-08         4.33872E+00         1.33528E+00         3.00344E+00
+          2.07425E-02         1.56476E-02        -2.08263E-02         1.30313E+00         1.20249E+00         1.30329E+00         4.30806E+00         1.00000E+00         2.83331E-08         4.30806E+00         1.29136E+00         3.01670E+00
+          2.07425E-02         1.58175E-02        -2.09942E-02         1.30312E+00         1.21317E+00         1.30329E+00         4.28077E+00         1.00000E+00         2.91445E-08         4.28077E+00         1.24851E+00         3.03226E+00
+          2.07425E-02         1.59873E-02        -2.11639E-02         1.30312E+00         1.22384E+00         1.30329E+00         4.25622E+00         1.00000E+00         2.99202E-08         4.25622E+00         1.20678E+00         3.04944E+00
+          2.07425E-02         1.61571E-02        -2.13354E-02         1.30312E+00         1.23451E+00         1.30329E+00         4.23382E+00         1.00000E+00         3.06562E-08         4.23382E+00         1.16621E+00         3.06761E+00
+          2.07425E-02         1.63270E-02        -2.15087E-02         1.30311E+00         1.24518E+00         1.30329E+00         4.21301E+00         1.00000E+00         3.13487E-08         4.21301E+00         1.12685E+00         3.08616E+00
+          2.07425E-02         1.64968E-02        -2.16838E-02         1.30311E+00         1.25585E+00         1.30329E+00         4.19329E+00         1.00000E+00         3.19944E-08         4.19329E+00         1.08872E+00         3.10456E+00
+          2.07425E-02         1.66666E-02        -2.18607E-02         1.30311E+00         1.26652E+00         1.30329E+00         4.17417E+00         1.00000E+00         3.25902E-08         4.17417E+00         1.05187E+00         3.12231E+00
+          2.07425E-02         1.68364E-02        -2.20394E-02         1.30310E+00         1.27719E+00         1.30329E+00         4.15523E+00         1.00000E+00         3.31337E-08         4.15523E+00         1.01630E+00         3.13893E+00
+          2.07425E-02         1.70063E-02        -2.22200E-02         1.30310E+00         1.28786E+00         1.30329E+00         4.13606E+00         1.00000E+00         3.36233E-08         4.13606E+00         9.82040E-01         3.15402E+00
+          2.07425E-02         1.71761E-02        -2.24023E-02         1.30310E+00         1.29853E+00         1.30329E+00         4.11631E+00         1.00000E+00         3.40577E-08         4.11631E+00         9.49107E-01         3.16720E+00
+          2.07425E-02         1.73459E-02        -2.25865E-02         1.30309E+00         1.30920E+00         1.30329E+00         4.09566E+00         1.00000E+00         3.44368E-08         4.09566E+00         9.17510E-01         3.17815E+00
+          2.07425E-02         1.75158E-02        -2.27725E-02         1.30309E+00         1.31987E+00         1.30329E+00         4.07382E+00         1.00000E+00         3.47613E-08         4.07382E+00         8.87254E-01         3.18656E+00
+          2.07425E-02         1.76856E-02        -2.29603E-02         1.30308E+00         1.33054E+00         1.30329E+00         4.05054E+00         1.00000E+00         3.50331E-08         4.05054E+00         8.58342E-01         3.19220E+00
+          2.07425E-02         1.78554E-02        -2.31499E-02         1.30308E+00         1.34121E+00         1.30329E+00         4.02562E+00         1.00000E+00         3.52554E-08         4.02562E+00         8.30770E-01         3.19485E+00
+          2.07425E-02         1.80252E-02        -2.33413E-02         1.30308E+00         1.35188E+00         1.30329E+00         3.99886E+00         1.00000E+00         3.54327E-08         3.99886E+00         8.04533E-01         3.19433E+00
+          2.07425E-02         1.81951E-02        -2.35346E-02         1.30307E+00         1.36255E+00         1.30328E+00         3.97013E+00         1.00000E+00         3.55714E-08         3.97013E+00         7.79620E-01         3.19051E+00
+          2.07425E-02         1.83649E-02        -2.37296E-02         1.30307E+00         1.37322E+00         1.30328E+00         3.93930E+00         1.00000E+00         3.56793E-08         3.93930E+00         7.56016E-01         3.18329E+00
+          2.07425E-02         1.85347E-02        -2.39265E-02         1.30306E+00         1.38389E+00         1.30328E+00         3.90630E+00         1.00000E+00         3.57664E-08         3.90630E+00         7.33705E-01         3.17260E+00
+          2.07425E-02         1.87045E-02        -2.41251E-02         1.30306E+00         1.39457E+00         1.30328E+00         3.87107E+00         1.00000E+00         3.58448E-08         3.87107E+00         7.12663E-01         3.15840E+00
+          2.07425E-02         1.88744E-02        -2.43256E-02         1.30306E+00         1.40524E+00         1.30328E+00         3.83357E+00         1.00000E+00         3.59286E-08         3.83357E+00         6.92868E-01         3.14070E+00
+          2.07425E-02         1.90442E-02        -2.45279E-02         1.30305E+00         1.41591E+00         1.30328E+00         3.79380E+00         1.00000E+00         3.60342E-08         3.79380E+00         6.74290E-01         3.11951E+00
+          2.07425E-02         1.92140E-02        -2.47320E-02         1.30305E+00         1.42658E+00         1.30328E+00         3.75179E+00         1.00000E+00         3.61799E-08         3.75179E+00         6.56900E-01         3.09489E+00
+          2.07425E-02         1.93839E-02        -2.49380E-02         1.30304E+00         1.43725E+00         1.30328E+00         3.70758E+00         1.00000E+00         3.63858E-08         3.70758E+00         6.40664E-01         3.06692E+00
+          2.07425E-02         1.95537E-02        -2.51457E-02         1.30304E+00         1.44792E+00         1.30328E+00         3.66124E+00         1.00000E+00         3.66736E-08         3.66124E+00         6.25546E-01         3.03569E+00
+          2.07425E-02         1.97235E-02        -2.53552E-02         1.30303E+00         1.45859E+00         1.30328E+00         3.61284E+00         1.00000E+00         3.70655E-08         3.61284E+00         6.11507E-01         3.00133E+00
+          2.07425E-02         1.98933E-02        -2.55666E-02         1.30303E+00         1.46926E+00         1.30328E+00         3.56250E+00         1.00000E+00         3.75838E-08         3.56250E+00         5.98509E-01         2.96399E+00
+          2.07425E-02         2.00632E-02        -2.57798E-02         1.30303E+00         1.47993E+00         1.30328E+00         3.51034E+00         1.00000E+00         3.82499E-08         3.51034E+00         5.86508E-01         2.92383E+00
+          2.07425E-02         2.02330E-02        -2.59948E-02         1.30302E+00         1.49060E+00         1.30328E+00         3.45648E+00         1.00000E+00         3.90831E-08         3.45648E+00         5.75461E-01         2.88102E+00
+          2.07425E-02         2.04028E-02        -2.62116E-02         1.30302E+00         1.50127E+00         1.30328E+00         3.40109E+00         1.00000E+00         4.01002E-08         3.40109E+00         5.65322E-01         2.83576E+00
+          2.07425E-02         2.05726E-02        -2.64302E-02         1.30301E+00         1.51194E+00         1.30328E+00         3.34431E+00         1.00000E+00         4.13140E-08         3.34431E+00         5.56045E-01         2.78827E+00
+          2.07425E-02         2.07425E-02        -2.66506E-02         1.30301E+00         1.52261E+00         1.30328E+00         3.28633E+00         1.00000E+00         4.27334E-08         3.28633E+00         5.47582E-01         2.73875E+00
+          2.07425E-02         2.09123E-02        -2.68729E-02         1.30300E+00         1.53328E+00         1.30328E+00         3.22733E+00         1.00000E+00         4.43627E-08         3.22733E+00         5.39886E-01         2.68744E+00
+          2.07425E-02         2.10821E-02        -2.70969E-02         1.30300E+00         1.54395E+00         1.30328E+00         3.16748E+00         1.00000E+00         4.62021E-08         3.16748E+00         5.32906E-01         2.63458E+00
+          2.07425E-02         2.12520E-02        -2.73228E-02         1.30299E+00         1.55462E+00         1.30328E+00         3.10699E+00         1.00000E+00         4.82475E-08         3.10699E+00         5.26594E-01         2.58040E+00
+          2.07425E-02         2.14218E-02        -2.75505E-02         1.30299E+00         1.56529E+00         1.30328E+00         3.04606E+00         1.00000E+00         5.04912E-08         3.04606E+00         5.20901E-01         2.52515E+00
+          2.07425E-02         2.15916E-02        -2.77800E-02         1.30298E+00         1.57596E+00         1.30328E+00         2.98487E+00         1.00000E+00         5.29227E-08         2.98487E+00         5.15776E-01         2.46910E+00
+          2.07425E-02         2.17614E-02        -2.80113E-02         1.30298E+00         1.58664E+00         1.30328E+00         2.92365E+00         1.00000E+00         5.55287E-08         2.92365E+00         5.11170E-01         2.41248E+00
+          2.07425E-02         2.19313E-02        -2.82444E-02         1.30297E+00         1.59731E+00         1.30328E+00         2.86258E+00         1.00000E+00         5.82941E-08         2.86258E+00         5.07034E-01         2.35554E+00
+          2.07425E-02         2.21011E-02        -2.84793E-02         1.30297E+00         1.60798E+00         1.30328E+00         2.80187E+00         1.00000E+00         6.12025E-08         2.80187E+00         5.03320E-01         2.29855E+00
+          2.07425E-02         2.22709E-02        -2.87161E-02         1.30296E+00         1.61865E+00         1.30328E+00         2.74172E+00         1.00000E+00         6.42362E-08         2.74172E+00         4.99980E-01         2.24174E+00
+          2.07425E-02         2.24407E-02        -2.89546E-02         1.30296E+00         1.62932E+00         1.30328E+00         2.68233E+00         1.00000E+00         6.73767E-08         2.68233E+00         4.96967E-01         2.18536E+00
+          2.07425E-02         2.26106E-02        -2.91950E-02         1.30295E+00         1.63999E+00         1.30328E+00         2.62389E+00         1.00000E+00         7.06050E-08         2.62389E+00         4.94235E-01         2.12965E+00
+          2.07425E-02         2.27804E-02        -2.94372E-02         1.30295E+00         1.65066E+00         1.30328E+00         2.56657E+00         1.00000E+00         7.39018E-08         2.56657E+00         4.91739E-01         2.07483E+00
+          2.07425E-02         2.29502E-02        -2.96812E-02         1.30294E+00         1.66133E+00         1.30328E+00         2.51057E+00         1.00000E+00         7.72474E-08         2.51057E+00         4.89436E-01         2.02114E+00
+          2.07425E-02         2.31201E-02        -2.99270E-02         1.30294E+00         1.67200E+00         1.30328E+00         2.45605E+00         1.00000E+00         8.06222E-08         2.45605E+00         4.87284E-01         1.96877E+00
+          2.07425E-02         2.32899E-02        -3.01746E-02         1.30293E+00         1.68267E+00         1.30328E+00         2.40318E+00         1.00000E+00         8.40063E-08         2.40318E+00         4.85242E-01         1.91794E+00
+          2.07425E-02         2.34597E-02        -3.04240E-02         1.30293E+00         1.69334E+00         1.30328E+00         2.35211E+00         1.00000E+00         8.73800E-08         2.35211E+00         4.83272E-01         1.86884E+00
+          2.07425E-02         2.36295E-02        -3.06753E-02         1.30292E+00         1.70401E+00         1.30329E+00         2.30298E+00         1.00000E+00         9.07238E-08         2.30298E+00         4.81337E-01         1.82164E+00
+          2.07425E-02         2.37994E-02        -3.09283E-02         1.30292E+00         1.71468E+00         1.30329E+00         2.25593E+00         1.00000E+00         9.40182E-08         2.25593E+00         4.79401E-01         1.77653E+00
+          2.07425E-02         2.39692E-02        -3.11832E-02         1.30291E+00         1.72535E+00         1.30329E+00         2.21108E+00         1.00000E+00         9.72442E-08         2.21108E+00         4.77430E-01         1.73365E+00
+          2.07425E-02         2.41390E-02        -3.14399E-02         1.30291E+00         1.73602E+00         1.30329E+00         2.16853E+00         1.00000E+00         1.00383E-07         2.16853E+00         4.75395E-01         1.69314E+00
+          2.07425E-02         2.43088E-02        -3.16984E-02         1.30290E+00         1.74669E+00         1.30329E+00         2.12840E+00         1.00000E+00         1.03417E-07         2.12840E+00         4.73264E-01         1.65514E+00
+          2.07425E-02         2.44787E-02        -3.19587E-02         1.30290E+00         1.75736E+00         1.30329E+00         2.09076E+00         1.00000E+00         1.06328E-07         2.09076E+00         4.71012E-01         1.61975E+00
+          2.07425E-02         2.46485E-02        -3.22209E-02         1.30289E+00         1.76804E+00         1.30329E+00         2.05569E+00         1.00000E+00         1.09099E-07         2.05569E+00         4.68612E-01         1.58708E+00
+          2.07425E-02         2.48183E-02        -3.24848E-02         1.30289E+00         1.77871E+00         1.30329E+00         2.02325E+00         1.00000E+00         1.11715E-07         2.02325E+00         4.66042E-01         1.55721E+00
+          2.07425E-02         2.49882E-02        -3.27506E-02         1.30288E+00         1.78938E+00         1.30329E+00         1.99349E+00         1.00000E+00         1.14161E-07         1.99349E+00         4.63281E-01         1.53021E+00
+          2.07425E-02         2.51580E-02        -3.30181E-02         1.30288E+00         1.80005E+00         1.30329E+00         1.96644E+00         1.00000E+00         1.16423E-07         1.96644E+00         4.60311E-01         1.50613E+00
+          2.07425E-02         2.53278E-02        -3.32875E-02         1.30287E+00         1.81072E+00         1.30329E+00         1.94212E+00         1.00000E+00         1.18491E-07         1.94212E+00         4.57113E-01         1.48501E+00
+          2.07425E-02         2.54976E-02        -3.35587E-02         1.30286E+00         1.82139E+00         1.30330E+00         1.92054E+00         1.00000E+00         1.20352E-07         1.92054E+00         4.53675E-01         1.46686E+00
+          2.07425E-02         2.56675E-02        -3.38317E-02         1.30286E+00         1.83206E+00         1.30330E+00         1.90170E+00         1.00000E+00         1.22000E-07         1.90170E+00         4.49983E-01         1.45171E+00
+          2.07425E-02         2.58373E-02        -3.41066E-02         1.30285E+00         1.84273E+00         1.30330E+00         1.88557E+00         1.00000E+00         1.23429E-07         1.88557E+00         4.46028E-01         1.43954E+00
+          2.07425E-02         2.60071E-02        -3.43832E-02         1.30285E+00         1.85340E+00         1.30330E+00         1.87214E+00         1.00000E+00         1.24635E-07         1.87214E+00         4.41801E-01         1.43033E+00
+          2.07425E-02         2.61769E-02        -3.46616E-02         1.30284E+00         1.86407E+00         1.30330E+00         1.86134E+00         1.00000E+00         1.25618E-07         1.86134E+00         4.37297E-01         1.42405E+00
+          2.09123E-02         8.72665E-04        -1.33816E-02         1.31396E+00         2.74155E-01         1.31403E+00         9.33224E+01         1.00000E+00         2.28383E-09         9.33224E+01         1.02681E+00         9.22956E+01
+          2.09123E-02         1.04249E-03        -1.33918E-02         1.31396E+00         2.84826E-01         1.31403E+00         9.16457E+01         1.00000E+00         2.24512E-09         9.16457E+01         1.08019E+00         9.05655E+01
+          2.09123E-02         1.21232E-03        -1.34038E-02         1.31396E+00         2.95496E-01         1.31403E+00         8.99344E+01         1.00000E+00         2.21537E-09         8.99344E+01         1.13437E+00         8.88000E+01
+          2.09123E-02         1.38215E-03        -1.34177E-02         1.31396E+00         3.06167E-01         1.31403E+00         8.81913E+01         1.00000E+00         2.19566E-09         8.81913E+01         1.18924E+00         8.70021E+01
+          2.09123E-02         1.55197E-03        -1.34333E-02         1.31396E+00         3.16838E-01         1.31403E+00         8.64194E+01         1.00000E+00         2.18695E-09         8.64194E+01         1.24465E+00         8.51747E+01
+          2.09123E-02         1.72180E-03        -1.34508E-02         1.31396E+00         3.27508E-01         1.31403E+00         8.46214E+01         1.00000E+00         2.18999E-09         8.46214E+01         1.30051E+00         8.33209E+01
+          2.09123E-02         1.89163E-03        -1.34700E-02         1.31396E+00         3.38179E-01         1.31403E+00         8.28002E+01         1.00000E+00         2.20529E-09         8.28002E+01         1.35667E+00         8.14436E+01
+          2.09123E-02         2.06146E-03        -1.34911E-02         1.31396E+00         3.48849E-01         1.31402E+00         8.09588E+01         1.00000E+00         2.23308E-09         8.09588E+01         1.41302E+00         7.95457E+01
+          2.09123E-02         2.23128E-03        -1.35140E-02         1.31396E+00         3.59520E-01         1.31402E+00         7.90998E+01         1.00000E+00         2.27331E-09         7.90998E+01         1.46943E+00         7.76304E+01
+          2.09123E-02         2.40111E-03        -1.35387E-02         1.31395E+00         3.70190E-01         1.31402E+00         7.72263E+01         1.00000E+00         2.32566E-09         7.72263E+01         1.52579E+00         7.57005E+01
+          2.09123E-02         2.57094E-03        -1.35653E-02         1.31395E+00         3.80861E-01         1.31402E+00         7.53411E+01         1.00000E+00         2.38957E-09         7.53411E+01         1.58196E+00         7.37591E+01
+          2.09123E-02         2.74077E-03        -1.35936E-02         1.31395E+00         3.91532E-01         1.31402E+00         7.34469E+01         1.00000E+00         2.46431E-09         7.34469E+01         1.63782E+00         7.18090E+01
+          2.09123E-02         2.91059E-03        -1.36237E-02         1.31395E+00         4.02202E-01         1.31402E+00         7.15465E+01         1.00000E+00         2.54900E-09         7.15465E+01         1.69326E+00         6.98532E+01
+          2.09123E-02         3.08042E-03        -1.36557E-02         1.31395E+00         4.12873E-01         1.31402E+00         6.96427E+01         1.00000E+00         2.64266E-09         6.96427E+01         1.74816E+00         6.78945E+01
+          2.09123E-02         3.25025E-03        -1.36895E-02         1.31395E+00         4.23543E-01         1.31402E+00         6.77381E+01         1.00000E+00         2.74428E-09         6.77381E+01         1.80240E+00         6.59357E+01
+          2.09123E-02         3.42008E-03        -1.37250E-02         1.31395E+00         4.34214E-01         1.31402E+00         6.58355E+01         1.00000E+00         2.85283E-09         6.58355E+01         1.85586E+00         6.39796E+01
+          2.09123E-02         3.58990E-03        -1.37624E-02         1.31395E+00         4.44884E-01         1.31402E+00         6.39374E+01         1.00000E+00         2.96731E-09         6.39374E+01         1.90842E+00         6.20289E+01
+          2.09123E-02         3.75973E-03        -1.38016E-02         1.31395E+00         4.55555E-01         1.31402E+00         6.20463E+01         1.00000E+00         3.08671E-09         6.20463E+01         1.95999E+00         6.00863E+01
+          2.09123E-02         3.92956E-03        -1.38427E-02         1.31395E+00         4.66225E-01         1.31402E+00         6.01647E+01         1.00000E+00         3.21009E-09         6.01647E+01         2.01045E+00         5.81542E+01
+          2.09123E-02         4.09939E-03        -1.38855E-02         1.31395E+00         4.76896E-01         1.31402E+00         5.82949E+01         1.00000E+00         3.33654E-09         5.82949E+01         2.05970E+00         5.62352E+01
+          2.09123E-02         4.26921E-03        -1.39301E-02         1.31395E+00         4.87567E-01         1.31402E+00         5.64394E+01         1.00000E+00         3.46517E-09         5.64394E+01         2.10763E+00         5.43318E+01
+          2.09123E-02         4.43904E-03        -1.39766E-02         1.31395E+00         4.98237E-01         1.31402E+00         5.46004E+01         1.00000E+00         3.59515E-09         5.46004E+01         2.15416E+00         5.24462E+01
+          2.09123E-02         4.60887E-03        -1.40248E-02         1.31394E+00         5.08908E-01         1.31402E+00         5.27799E+01         1.00000E+00         3.72568E-09         5.27799E+01         2.19917E+00         5.05808E+01
+          2.09123E-02         4.77869E-03        -1.40749E-02         1.31394E+00         5.19578E-01         1.31402E+00         5.09802E+01         1.00000E+00         3.85597E-09         5.09802E+01         2.24260E+00         4.87376E+01
+          2.09123E-02         4.94852E-03        -1.41268E-02         1.31394E+00         5.30249E-01         1.31402E+00         4.92031E+01         1.00000E+00         3.98528E-09         4.92031E+01         2.28434E+00         4.69187E+01
+          2.09123E-02         5.11835E-03        -1.41805E-02         1.31394E+00         5.40919E-01         1.31402E+00         4.74505E+01         1.00000E+00         4.11287E-09         4.74505E+01         2.32432E+00         4.51262E+01
+          2.09123E-02         5.28818E-03        -1.42360E-02         1.31394E+00         5.51590E-01         1.31402E+00         4.57244E+01         1.00000E+00         4.23804E-09         4.57244E+01         2.36247E+00         4.33619E+01
+          2.09123E-02         5.45800E-03        -1.42933E-02         1.31394E+00         5.62261E-01         1.31402E+00         4.40262E+01         1.00000E+00         4.36009E-09         4.40262E+01         2.39870E+00         4.16275E+01
+          2.09123E-02         5.62783E-03        -1.43525E-02         1.31394E+00         5.72931E-01         1.31402E+00         4.23577E+01         1.00000E+00         4.47834E-09         4.23577E+01         2.43296E+00         3.99248E+01
+          2.09123E-02         5.79766E-03        -1.44134E-02         1.31394E+00         5.83602E-01         1.31402E+00         4.07204E+01         1.00000E+00         4.59213E-09         4.07204E+01         2.46519E+00         3.82552E+01
+          2.09123E-02         5.96749E-03        -1.44762E-02         1.31394E+00         5.94272E-01         1.31401E+00         3.91155E+01         1.00000E+00         4.70079E-09         3.91155E+01         2.49532E+00         3.66202E+01
+          2.09123E-02         6.13731E-03        -1.45407E-02         1.31393E+00         6.04943E-01         1.31401E+00         3.75445E+01         1.00000E+00         4.80370E-09         3.75445E+01         2.52330E+00         3.50212E+01
+          2.09123E-02         6.30714E-03        -1.46071E-02         1.31393E+00         6.15613E-01         1.31401E+00         3.60086E+01         1.00000E+00         4.90022E-09         3.60086E+01         2.54909E+00         3.34595E+01
+          2.09123E-02         6.47697E-03        -1.46753E-02         1.31393E+00         6.26284E-01         1.31401E+00         3.45087E+01         1.00000E+00         4.98976E-09         3.45087E+01         2.57266E+00         3.19360E+01
+          2.09123E-02         6.64680E-03        -1.47453E-02         1.31393E+00         6.36955E-01         1.31401E+00         3.30458E+01         1.00000E+00         5.07174E-09         3.30458E+01         2.59395E+00         3.04519E+01
+          2.09123E-02         6.81662E-03        -1.48171E-02         1.31393E+00         6.47625E-01         1.31401E+00         3.16209E+01         1.00000E+00         5.14560E-09         3.16209E+01         2.61295E+00         2.90080E+01
+          2.09123E-02         6.98645E-03        -1.48908E-02         1.31393E+00         6.58296E-01         1.31401E+00         3.02347E+01         1.00000E+00         5.21082E-09         3.02347E+01         2.62964E+00         2.76051E+01
+          2.09123E-02         7.15628E-03        -1.49662E-02         1.31392E+00         6.68966E-01         1.31401E+00         2.88879E+01         1.00000E+00         5.26695E-09         2.88879E+01         2.64398E+00         2.62439E+01
+          2.09123E-02         7.32611E-03        -1.50435E-02         1.31392E+00         6.79637E-01         1.31401E+00         2.75810E+01         1.00000E+00         5.31354E-09         2.75810E+01         2.65598E+00         2.49251E+01
+          2.09123E-02         7.49593E-03        -1.51225E-02         1.31392E+00         6.90307E-01         1.31401E+00         2.63145E+01         1.00000E+00         5.35026E-09         2.63145E+01         2.66562E+00         2.36489E+01
+          2.09123E-02         7.66576E-03        -1.52034E-02         1.31392E+00         7.00978E-01         1.31401E+00         2.50888E+01         1.00000E+00         5.37683E-09         2.50888E+01         2.67290E+00         2.24159E+01
+          2.09123E-02         7.83559E-03        -1.52861E-02         1.31392E+00         7.11649E-01         1.31401E+00         2.39040E+01         1.00000E+00         5.39308E-09         2.39040E+01         2.67783E+00         2.12262E+01
+          2.09123E-02         8.00542E-03        -1.53706E-02         1.31392E+00         7.22319E-01         1.31401E+00         2.27605E+01         1.00000E+00         5.39894E-09         2.27605E+01         2.68042E+00         2.00801E+01
+          2.09123E-02         8.17524E-03        -1.54569E-02         1.31391E+00         7.32990E-01         1.31401E+00         2.16582E+01         1.00000E+00         5.39450E-09         2.16582E+01         2.68068E+00         1.89775E+01
+          2.09123E-02         8.34507E-03        -1.55450E-02         1.31391E+00         7.43660E-01         1.31400E+00         2.05971E+01         1.00000E+00         5.38001E-09         2.05971E+01         2.67863E+00         1.79185E+01
+          2.09123E-02         8.51490E-03        -1.56350E-02         1.31391E+00         7.54331E-01         1.31400E+00         1.95772E+01         1.00000E+00         5.35593E-09         1.95772E+01         2.67430E+00         1.69029E+01
+          2.09123E-02         8.68473E-03        -1.57267E-02         1.31391E+00         7.65001E-01         1.31400E+00         1.85982E+01         1.00000E+00         5.32296E-09         1.85982E+01         2.66771E+00         1.59305E+01
+          2.09123E-02         8.85455E-03        -1.58203E-02         1.31391E+00         7.75672E-01         1.31400E+00         1.76598E+01         1.00000E+00         5.28209E-09         1.76598E+01         2.65891E+00         1.50009E+01
+          2.09123E-02         9.02438E-03        -1.59156E-02         1.31390E+00         7.86343E-01         1.31400E+00         1.67618E+01         1.00000E+00         5.23464E-09         1.67618E+01         2.64794E+00         1.41139E+01
+          2.09123E-02         9.19421E-03        -1.60128E-02         1.31390E+00         7.97013E-01         1.31400E+00         1.59037E+01         1.00000E+00         5.18232E-09         1.59037E+01         2.63483E+00         1.32689E+01
+          2.09123E-02         9.36403E-03        -1.61118E-02         1.31390E+00         8.07684E-01         1.31400E+00         1.50850E+01         1.00000E+00         5.12729E-09         1.50850E+01         2.61965E+00         1.24653E+01
+          2.09123E-02         9.53386E-03        -1.62126E-02         1.31390E+00         8.18354E-01         1.31400E+00         1.43051E+01         1.00000E+00         5.07223E-09         1.43051E+01         2.60243E+00         1.17026E+01
+          2.09123E-02         9.70369E-03        -1.63153E-02         1.31390E+00         8.29025E-01         1.31400E+00         1.35633E+01         1.00000E+00         5.02034E-09         1.35633E+01         2.58325E+00         1.09801E+01
+          2.09123E-02         9.87352E-03        -1.64197E-02         1.31389E+00         8.39695E-01         1.31400E+00         1.28591E+01         1.00000E+00         4.97543E-09         1.28591E+01         2.56216E+00         1.02970E+01
+          2.09123E-02         1.00433E-02        -1.65259E-02         1.31389E+00         8.50366E-01         1.31400E+00         1.21917E+01         1.00000E+00         4.94183E-09         1.21917E+01         2.53922E+00         9.65246E+00
+          2.09123E-02         1.02132E-02        -1.66340E-02         1.31389E+00         8.61037E-01         1.31400E+00         1.15602E+01         1.00000E+00         4.92442E-09         1.15602E+01         2.51451E+00         9.04566E+00
+          2.09123E-02         1.03830E-02        -1.67439E-02         1.31389E+00         8.71707E-01         1.31399E+00         1.09638E+01         1.00000E+00         4.92840E-09         1.09638E+01         2.48810E+00         8.47566E+00
+          2.09123E-02         1.05528E-02        -1.68555E-02         1.31389E+00         8.82378E-01         1.31399E+00         1.04015E+01         1.00000E+00         4.95912E-09         1.04015E+01         2.46005E+00         7.94149E+00
+          2.09123E-02         1.07227E-02        -1.69690E-02         1.31388E+00         8.93048E-01         1.31399E+00         9.87260E+00         1.00000E+00         5.02181E-09         9.87260E+00         2.43046E+00         7.44214E+00
+          2.09123E-02         1.08925E-02        -1.70843E-02         1.31388E+00         9.03719E-01         1.31399E+00         9.37594E+00         1.00000E+00         5.12118E-09         9.37594E+00         2.39940E+00         6.97654E+00
+          2.09123E-02         1.10623E-02        -1.72014E-02         1.31388E+00         9.14389E-01         1.31399E+00         8.91056E+00         1.00000E+00         5.26113E-09         8.91056E+00         2.36694E+00         6.54362E+00
+          2.09123E-02         1.12321E-02        -1.73204E-02         1.31388E+00         9.25060E-01         1.31399E+00         8.47542E+00         1.00000E+00         5.44449E-09         8.47542E+00         2.33318E+00         6.14224E+00
+          2.09123E-02         1.14020E-02        -1.74411E-02         1.31387E+00         9.35731E-01         1.31399E+00         8.06946E+00         1.00000E+00         5.67286E-09         8.06946E+00         2.29820E+00         5.77126E+00
+          2.09123E-02         1.15718E-02        -1.75637E-02         1.31387E+00         9.46401E-01         1.31399E+00         7.69159E+00         1.00000E+00         5.94661E-09         7.69159E+00         2.26208E+00         5.42950E+00
+          2.09123E-02         1.17416E-02        -1.76880E-02         1.31387E+00         9.57072E-01         1.31399E+00         7.34071E+00         1.00000E+00         6.26500E-09         7.34071E+00         2.22492E+00         5.11579E+00
+          2.09123E-02         1.19114E-02        -1.78142E-02         1.31387E+00         9.67742E-01         1.31399E+00         7.01572E+00         1.00000E+00         6.62639E-09         7.01572E+00         2.18681E+00         4.82891E+00
+          2.09123E-02         1.20813E-02        -1.79422E-02         1.31386E+00         9.78413E-01         1.31399E+00         6.71547E+00         1.00000E+00         7.02840E-09         6.71547E+00         2.14782E+00         4.56765E+00
+          2.09123E-02         1.22511E-02        -1.80720E-02         1.31386E+00         9.89083E-01         1.31398E+00         6.43885E+00         1.00000E+00         7.46822E-09         6.43885E+00         2.10806E+00         4.33079E+00
+          2.09123E-02         1.24209E-02        -1.82036E-02         1.31386E+00         9.99754E-01         1.31398E+00         6.18471E+00         1.00000E+00         7.94269E-09         6.18471E+00         2.06761E+00         4.11710E+00
+          2.09123E-02         1.25908E-02        -1.83370E-02         1.31385E+00         1.01042E+00         1.31398E+00         5.95192E+00         1.00000E+00         8.44850E-09         5.95192E+00         2.02656E+00         3.92535E+00
+          2.09123E-02         1.27606E-02        -1.84723E-02         1.31385E+00         1.02110E+00         1.31398E+00         5.73935E+00         1.00000E+00         8.98222E-09         5.73935E+00         1.98501E+00         3.75434E+00
+          2.09123E-02         1.29304E-02        -1.86093E-02         1.31385E+00         1.03177E+00         1.31398E+00         5.54587E+00         1.00000E+00         9.54040E-09         5.54587E+00         1.94303E+00         3.60284E+00
+          2.09123E-02         1.31002E-02        -1.87482E-02         1.31385E+00         1.04244E+00         1.31398E+00         5.37037E+00         1.00000E+00         1.01196E-08         5.37037E+00         1.90072E+00         3.46965E+00
+          2.09123E-02         1.32701E-02        -1.88889E-02         1.31384E+00         1.05311E+00         1.31398E+00         5.21175E+00         1.00000E+00         1.07163E-08         5.21175E+00         1.85816E+00         3.35359E+00
+          2.09123E-02         1.34399E-02        -1.90314E-02         1.31384E+00         1.06378E+00         1.31398E+00         5.06892E+00         1.00000E+00         1.13270E-08         5.06892E+00         1.81544E+00         3.25348E+00
+          2.09123E-02         1.36097E-02        -1.91757E-02         1.31384E+00         1.07445E+00         1.31398E+00         4.94081E+00         1.00000E+00         1.19484E-08         4.94081E+00         1.77265E+00         3.16817E+00
+          2.09123E-02         1.37795E-02        -1.93218E-02         1.31383E+00         1.08512E+00         1.31398E+00         4.82638E+00         1.00000E+00         1.25768E-08         4.82638E+00         1.72985E+00         3.09653E+00
+          2.09123E-02         1.39494E-02        -1.94697E-02         1.31383E+00         1.09579E+00         1.31397E+00         4.72458E+00         1.00000E+00         1.32089E-08         4.72458E+00         1.68714E+00         3.03745E+00
+          2.09123E-02         1.41192E-02        -1.96194E-02         1.31383E+00         1.10646E+00         1.31397E+00         4.63444E+00         1.00000E+00         1.38411E-08         4.63444E+00         1.64458E+00         2.98986E+00
+          2.09123E-02         1.42890E-02        -1.97710E-02         1.31382E+00         1.11713E+00         1.31397E+00         4.55496E+00         1.00000E+00         1.44699E-08         4.55496E+00         1.60226E+00         2.95270E+00
+          2.09123E-02         1.44589E-02        -1.99243E-02         1.31382E+00         1.12780E+00         1.31397E+00         4.48521E+00         1.00000E+00         1.50918E-08         4.48521E+00         1.56025E+00         2.92497E+00
+          2.09123E-02         1.46287E-02        -2.00795E-02         1.31382E+00         1.13847E+00         1.31397E+00         4.42427E+00         1.00000E+00         1.57031E-08         4.42427E+00         1.51861E+00         2.90567E+00
+          2.09123E-02         1.47985E-02        -2.02365E-02         1.31381E+00         1.14914E+00         1.31397E+00         4.37126E+00         1.00000E+00         1.63003E-08         4.37126E+00         1.47741E+00         2.89385E+00
+          2.09123E-02         1.49683E-02        -2.03953E-02         1.31381E+00         1.15981E+00         1.31397E+00         4.32532E+00         1.00000E+00         1.68799E-08         4.32532E+00         1.43671E+00         2.88860E+00
+          2.09123E-02         1.51382E-02        -2.05559E-02         1.31381E+00         1.17048E+00         1.31397E+00         4.28563E+00         1.00000E+00         1.74384E-08         4.28563E+00         1.39658E+00         2.88905E+00
+          2.09123E-02         1.53080E-02        -2.07183E-02         1.31380E+00         1.18115E+00         1.31397E+00         4.25143E+00         1.00000E+00         1.79722E-08         4.25143E+00         1.35708E+00         2.89435E+00
+          2.09123E-02         1.54778E-02        -2.08826E-02         1.31380E+00         1.19182E+00         1.31397E+00         4.22195E+00         1.00000E+00         1.84780E-08         4.22195E+00         1.31825E+00         2.90371E+00
+          2.09123E-02         1.56476E-02        -2.10486E-02         1.31380E+00         1.20249E+00         1.31397E+00         4.19650E+00         1.00000E+00         1.89525E-08         4.19650E+00         1.28014E+00         2.91636E+00
+          2.09123E-02         1.58175E-02        -2.12165E-02         1.31379E+00         1.21317E+00         1.31397E+00         4.17441E+00         1.00000E+00         1.93924E-08         4.17441E+00         1.24281E+00         2.93160E+00
+          2.09123E-02         1.59873E-02        -2.13861E-02         1.31379E+00         1.22384E+00         1.31396E+00         4.15503E+00         1.00000E+00         1.97948E-08         4.15503E+00         1.20629E+00         2.94874E+00
+          2.09123E-02         1.61571E-02        -2.15576E-02         1.31379E+00         1.23451E+00         1.31396E+00         4.13778E+00         1.00000E+00         2.01570E-08         4.13778E+00         1.17062E+00         2.96716E+00
+          2.09123E-02         1.63270E-02        -2.17309E-02         1.31378E+00         1.24518E+00         1.31396E+00         4.12210E+00         1.00000E+00         2.04764E-08         4.12210E+00         1.13585E+00         2.98626E+00
+          2.09123E-02         1.64968E-02        -2.19060E-02         1.31378E+00         1.25585E+00         1.31396E+00         4.10748E+00         1.00000E+00         2.07509E-08         4.10748E+00         1.10199E+00         3.00549E+00
+          2.09123E-02         1.66666E-02        -2.20829E-02         1.31378E+00         1.26652E+00         1.31396E+00         4.09343E+00         1.00000E+00         2.09788E-08         4.09343E+00         1.06909E+00         3.02434E+00
+          2.09123E-02         1.68364E-02        -2.22617E-02         1.31377E+00         1.27719E+00         1.31396E+00         4.07951E+00         1.00000E+00         2.11588E-08         4.07951E+00         1.03716E+00         3.04235E+00
+          2.09123E-02         1.70063E-02        -2.24422E-02         1.31377E+00         1.28786E+00         1.31396E+00         4.06532E+00         1.00000E+00         2.12902E-08         4.06532E+00         1.00622E+00         3.05910E+00
+          2.09123E-02         1.71761E-02        -2.26246E-02         1.31376E+00         1.29853E+00         1.31396E+00         4.05049E+00         1.00000E+00         2.13733E-08         4.05049E+00         9.76299E-01         3.07420E+00
+          2.09123E-02         1.73459E-02        -2.28088E-02         1.31376E+00         1.30920E+00         1.31396E+00         4.03470E+00         1.00000E+00         2.14087E-08         4.03470E+00         9.47402E-01         3.08730E+00
+          2.09123E-02         1.75158E-02        -2.29947E-02         1.31376E+00         1.31987E+00         1.31396E+00         4.01765E+00         1.00000E+00         2.13986E-08         4.01765E+00         9.19540E-01         3.09811E+00
+          2.09123E-02         1.76856E-02        -2.31825E-02         1.31375E+00         1.33054E+00         1.31396E+00         3.99908E+00         1.00000E+00         2.13459E-08         3.99908E+00         8.92722E-01         3.10636E+00
+          2.09123E-02         1.78554E-02        -2.33721E-02         1.31375E+00         1.34121E+00         1.31396E+00         3.97877E+00         1.00000E+00         2.12550E-08         3.97877E+00         8.66949E-01         3.11182E+00
+          2.09123E-02         1.80252E-02        -2.35636E-02         1.31375E+00         1.35188E+00         1.31396E+00         3.95652E+00         1.00000E+00         2.11320E-08         3.95652E+00         8.42221E-01         3.11430E+00
+          2.09123E-02         1.81951E-02        -2.37568E-02         1.31374E+00         1.36255E+00         1.31396E+00         3.93219E+00         1.00000E+00         2.09847E-08         3.93219E+00         8.18536E-01         3.11365E+00
+          2.09123E-02         1.83649E-02        -2.39519E-02         1.31374E+00         1.37322E+00         1.31396E+00         3.90563E+00         1.00000E+00         2.08229E-08         3.90563E+00         7.95886E-01         3.10975E+00
+          2.09123E-02         1.85347E-02        -2.41487E-02         1.31373E+00         1.38389E+00         1.31395E+00         3.87676E+00         1.00000E+00         2.06587E-08         3.87676E+00         7.74263E-01         3.10250E+00
+          2.09123E-02         1.87045E-02        -2.43474E-02         1.31373E+00         1.39457E+00         1.31395E+00         3.84550E+00         1.00000E+00         2.05065E-08         3.84550E+00         7.53653E-01         3.09185E+00
+          2.09123E-02         1.88744E-02        -2.45479E-02         1.31372E+00         1.40524E+00         1.31395E+00         3.81181E+00         1.00000E+00         2.03834E-08         3.81181E+00         7.34043E-01         3.07777E+00
+          2.09123E-02         1.90442E-02        -2.47502E-02         1.31372E+00         1.41591E+00         1.31395E+00         3.77569E+00         1.00000E+00         2.03084E-08         3.77569E+00         7.15413E-01         3.06027E+00
+          2.09123E-02         1.92140E-02        -2.49543E-02         1.31372E+00         1.42658E+00         1.31395E+00         3.73713E+00         1.00000E+00         2.03026E-08         3.73713E+00         6.97745E-01         3.03938E+00
+          2.09123E-02         1.93839E-02        -2.51602E-02         1.31371E+00         1.43725E+00         1.31395E+00         3.69617E+00         1.00000E+00         2.03882E-08         3.69617E+00         6.81016E-01         3.01515E+00
+          2.09123E-02         1.95537E-02        -2.53679E-02         1.31371E+00         1.44792E+00         1.31395E+00         3.65286E+00         1.00000E+00         2.05875E-08         3.65286E+00         6.65201E-01         2.98766E+00
+          2.09123E-02         1.97235E-02        -2.55775E-02         1.31370E+00         1.45859E+00         1.31395E+00         3.60729E+00         1.00000E+00         2.09214E-08         3.60729E+00         6.50274E-01         2.95702E+00
+          2.09123E-02         1.98933E-02        -2.57889E-02         1.31370E+00         1.46926E+00         1.31395E+00         3.55954E+00         1.00000E+00         2.14083E-08         3.55954E+00         6.36206E-01         2.92333E+00
+          2.09123E-02         2.00632E-02        -2.60020E-02         1.31369E+00         1.47993E+00         1.31395E+00         3.50972E+00         1.00000E+00         2.20625E-08         3.50972E+00         6.22967E-01         2.88675E+00
+          2.09123E-02         2.02330E-02        -2.62170E-02         1.31369E+00         1.49060E+00         1.31395E+00         3.45797E+00         1.00000E+00         2.28935E-08         3.45797E+00         6.10525E-01         2.84744E+00
+          2.09123E-02         2.04028E-02        -2.64338E-02         1.31368E+00         1.50127E+00         1.31395E+00         3.40441E+00         1.00000E+00         2.39054E-08         3.40441E+00         5.98849E-01         2.80556E+00
+          2.09123E-02         2.05726E-02        -2.66524E-02         1.31368E+00         1.51194E+00         1.31395E+00         3.34921E+00         1.00000E+00         2.50975E-08         3.34921E+00         5.87903E-01         2.76131E+00
+          2.09123E-02         2.07425E-02        -2.68729E-02         1.31368E+00         1.52261E+00         1.31395E+00         3.29254E+00         1.00000E+00         2.64643E-08         3.29254E+00         5.77652E-01         2.71489E+00
+          2.09123E-02         2.09123E-02        -2.70951E-02         1.31367E+00         1.53328E+00         1.31395E+00         3.23456E+00         1.00000E+00         2.79969E-08         3.23456E+00         5.68061E-01         2.66650E+00
+          2.09123E-02         2.10821E-02        -2.73192E-02         1.31367E+00         1.54395E+00         1.31395E+00         3.17546E+00         1.00000E+00         2.96840E-08         3.17546E+00         5.59093E-01         2.61636E+00
+          2.09123E-02         2.12520E-02        -2.75450E-02         1.31366E+00         1.55462E+00         1.31395E+00         3.11543E+00         1.00000E+00         3.15122E-08         3.11543E+00         5.50711E-01         2.56472E+00
+          2.09123E-02         2.14218E-02        -2.77727E-02         1.31366E+00         1.56529E+00         1.31395E+00         3.05466E+00         1.00000E+00         3.34671E-08         3.05466E+00         5.42876E-01         2.51178E+00
+          2.09123E-02         2.15916E-02        -2.80022E-02         1.31365E+00         1.57596E+00         1.31395E+00         2.99335E+00         1.00000E+00         3.55337E-08         2.99335E+00         5.35552E-01         2.45780E+00
+          2.09123E-02         2.17614E-02        -2.82335E-02         1.31365E+00         1.58664E+00         1.31395E+00         2.93172E+00         1.00000E+00         3.76968E-08         2.93172E+00         5.28701E-01         2.40302E+00
+          2.09123E-02         2.19313E-02        -2.84666E-02         1.31364E+00         1.59731E+00         1.31395E+00         2.86995E+00         1.00000E+00         3.99410E-08         2.86995E+00         5.22285E-01         2.34766E+00
+          2.09123E-02         2.21011E-02        -2.87015E-02         1.31364E+00         1.60798E+00         1.31395E+00         2.80825E+00         1.00000E+00         4.22511E-08         2.80825E+00         5.16266E-01         2.29199E+00
+          2.09123E-02         2.22709E-02        -2.89383E-02         1.31363E+00         1.61865E+00         1.31395E+00         2.74683E+00         1.00000E+00         4.46117E-08         2.74683E+00         5.10607E-01         2.23623E+00
+          2.09123E-02         2.24407E-02        -2.91768E-02         1.31363E+00         1.62932E+00         1.31395E+00         2.68589E+00         1.00000E+00         4.70077E-08         2.68589E+00         5.05272E-01         2.18062E+00
+          2.09123E-02         2.26106E-02        -2.94172E-02         1.31362E+00         1.63999E+00         1.31395E+00         2.62562E+00         1.00000E+00         4.94241E-08         2.62562E+00         5.00225E-01         2.12539E+00
+          2.09123E-02         2.27804E-02        -2.96594E-02         1.31362E+00         1.65066E+00         1.31395E+00         2.56621E+00         1.00000E+00         5.18460E-08         2.56621E+00         4.95431E-01         2.07078E+00
+          2.09123E-02         2.29502E-02        -2.99034E-02         1.31361E+00         1.66133E+00         1.31395E+00         2.50786E+00         1.00000E+00         5.42584E-08         2.50786E+00         4.90855E-01         2.01700E+00
+          2.09123E-02         2.31201E-02        -3.01492E-02         1.31361E+00         1.67200E+00         1.31395E+00         2.45073E+00         1.00000E+00         5.66467E-08         2.45073E+00         4.86464E-01         1.96427E+00
+          2.09123E-02         2.32899E-02        -3.03968E-02         1.31360E+00         1.68267E+00         1.31395E+00         2.39501E+00         1.00000E+00         5.89961E-08         2.39501E+00         4.82226E-01         1.91279E+00
+          2.09123E-02         2.34597E-02        -3.06463E-02         1.31360E+00         1.69334E+00         1.31395E+00         2.34086E+00         1.00000E+00         6.12922E-08         2.34086E+00         4.78109E-01         1.86275E+00
+          2.09123E-02         2.36295E-02        -3.08975E-02         1.31359E+00         1.70401E+00         1.31395E+00         2.28844E+00         1.00000E+00         6.35207E-08         2.28844E+00         4.74084E-01         1.81436E+00
+          2.09123E-02         2.37994E-02        -3.11506E-02         1.31359E+00         1.71468E+00         1.31396E+00         2.23789E+00         1.00000E+00         6.56674E-08         2.23789E+00         4.70122E-01         1.76777E+00
+          2.09123E-02         2.39692E-02        -3.14054E-02         1.31358E+00         1.72535E+00         1.31396E+00         2.18935E+00         1.00000E+00         6.77186E-08         2.18935E+00         4.66195E-01         1.72315E+00
+          2.09123E-02         2.41390E-02        -3.16621E-02         1.31358E+00         1.73602E+00         1.31396E+00         2.14294E+00         1.00000E+00         6.96608E-08         2.14294E+00         4.62279E-01         1.68066E+00
+          2.09123E-02         2.43088E-02        -3.19206E-02         1.31357E+00         1.74669E+00         1.31396E+00         2.09878E+00         1.00000E+00         7.14811E-08         2.09878E+00         4.58349E-01         1.64043E+00
+          2.09123E-02         2.44787E-02        -3.21810E-02         1.31356E+00         1.75736E+00         1.31396E+00         2.05698E+00         1.00000E+00         7.31670E-08         2.05698E+00         4.54383E-01         1.60260E+00
+          2.09123E-02         2.46485E-02        -3.24431E-02         1.31356E+00         1.76804E+00         1.31396E+00         2.01761E+00         1.00000E+00         7.47070E-08         2.01761E+00         4.50358E-01         1.56726E+00
+          2.09123E-02         2.48183E-02        -3.27070E-02         1.31355E+00         1.77871E+00         1.31396E+00         1.98077E+00         1.00000E+00         7.60900E-08         1.98077E+00         4.46256E-01         1.53452E+00
+          2.09123E-02         2.49882E-02        -3.29728E-02         1.31355E+00         1.78938E+00         1.31396E+00         1.94652E+00         1.00000E+00         7.73064E-08         1.94652E+00         4.42059E-01         1.50446E+00
+          2.09123E-02         2.51580E-02        -3.32404E-02         1.31354E+00         1.80005E+00         1.31396E+00         1.91490E+00         1.00000E+00         7.83474E-08         1.91490E+00         4.37751E-01         1.47715E+00
+          2.09123E-02         2.53278E-02        -3.35097E-02         1.31354E+00         1.81072E+00         1.31396E+00         1.88597E+00         1.00000E+00         7.92057E-08         1.88597E+00         4.33316E-01         1.45265E+00
+          2.09123E-02         2.54976E-02        -3.37809E-02         1.31353E+00         1.82139E+00         1.31397E+00         1.85974E+00         1.00000E+00         7.98756E-08         1.85974E+00         4.28743E-01         1.43100E+00
+          2.09123E-02         2.56675E-02        -3.40539E-02         1.31353E+00         1.83206E+00         1.31397E+00         1.83623E+00         1.00000E+00         8.03532E-08         1.83623E+00         4.24019E-01         1.41222E+00
+          2.09123E-02         2.58373E-02        -3.43288E-02         1.31352E+00         1.84273E+00         1.31397E+00         1.81546E+00         1.00000E+00         8.06371E-08         1.81546E+00         4.19136E-01         1.39632E+00
+          2.09123E-02         2.60071E-02        -3.46054E-02         1.31351E+00         1.85340E+00         1.31397E+00         1.79739E+00         1.00000E+00         8.07280E-08         1.79739E+00         4.14085E-01         1.38331E+00
+          2.09123E-02         2.61769E-02        -3.48839E-02         1.31351E+00         1.86407E+00         1.31397E+00         1.78202E+00         1.00000E+00         8.06298E-08         1.78202E+00         4.08859E-01         1.37316E+00
+          2.10821E-02         8.72665E-04        -1.36057E-02         1.32463E+00         2.74155E-01         1.32470E+00         9.11948E+01         1.00000E+00         1.07786E-09         9.11948E+01         1.10188E+00         9.00929E+01
+          2.10821E-02         1.04249E-03        -1.36159E-02         1.32463E+00         2.84826E-01         1.32470E+00         8.95568E+01         1.00000E+00         1.07558E-09         8.95568E+01         1.14268E+00         8.84141E+01
+          2.10821E-02         1.21232E-03        -1.36279E-02         1.32463E+00         2.95496E-01         1.32470E+00         8.78850E+01         1.00000E+00         1.08335E-09         8.78850E+01         1.18411E+00         8.67009E+01
+          2.10821E-02         1.38215E-03        -1.36418E-02         1.32463E+00         3.06167E-01         1.32470E+00         8.61822E+01         1.00000E+00         1.10145E-09         8.61822E+01         1.22608E+00         8.49561E+01
+          2.10821E-02         1.55197E-03        -1.36574E-02         1.32463E+00         3.16838E-01         1.32470E+00         8.44511E+01         1.00000E+00         1.12981E-09         8.44511E+01         1.26850E+00         8.31826E+01
+          2.10821E-02         1.72180E-03        -1.36749E-02         1.32463E+00         3.27508E-01         1.32470E+00         8.26944E+01         1.00000E+00         1.16801E-09         8.26944E+01         1.31128E+00         8.13831E+01
+          2.10821E-02         1.89163E-03        -1.36941E-02         1.32463E+00         3.38179E-01         1.32470E+00         8.09150E+01         1.00000E+00         1.21538E-09         8.09150E+01         1.35433E+00         7.95607E+01
+          2.10821E-02         2.06146E-03        -1.37152E-02         1.32463E+00         3.48849E-01         1.32470E+00         7.91158E+01         1.00000E+00         1.27106E-09         7.91158E+01         1.39755E+00         7.77182E+01
+          2.10821E-02         2.23128E-03        -1.37381E-02         1.32463E+00         3.59520E-01         1.32470E+00         7.72994E+01         1.00000E+00         1.33409E-09         7.72994E+01         1.44084E+00         7.58585E+01
+          2.10821E-02         2.40111E-03        -1.37628E-02         1.32463E+00         3.70190E-01         1.32470E+00         7.54686E+01         1.00000E+00         1.40351E-09         7.54686E+01         1.48413E+00         7.39845E+01
+          2.10821E-02         2.57094E-03        -1.37894E-02         1.32462E+00         3.80861E-01         1.32470E+00         7.36264E+01         1.00000E+00         1.47835E-09         7.36264E+01         1.52730E+00         7.20991E+01
+          2.10821E-02         2.74077E-03        -1.38177E-02         1.32462E+00         3.91532E-01         1.32470E+00         7.17752E+01         1.00000E+00         1.55770E-09         7.17752E+01         1.57027E+00         7.02050E+01
+          2.10821E-02         2.91059E-03        -1.38478E-02         1.32462E+00         4.02202E-01         1.32470E+00         6.99180E+01         1.00000E+00         1.64072E-09         6.99180E+01         1.61296E+00         6.83051E+01
+          2.10821E-02         3.08042E-03        -1.38798E-02         1.32462E+00         4.12873E-01         1.32470E+00         6.80573E+01         1.00000E+00         1.72663E-09         6.80573E+01         1.65526E+00         6.64021E+01
+          2.10821E-02         3.25025E-03        -1.39136E-02         1.32462E+00         4.23543E-01         1.32470E+00         6.61959E+01         1.00000E+00         1.81472E-09         6.61959E+01         1.69708E+00         6.44988E+01
+          2.10821E-02         3.42008E-03        -1.39491E-02         1.32462E+00         4.34214E-01         1.32469E+00         6.43362E+01         1.00000E+00         1.90434E-09         6.43362E+01         1.73835E+00         6.25978E+01
+          2.10821E-02         3.58990E-03        -1.39865E-02         1.32462E+00         4.44884E-01         1.32469E+00         6.24807E+01         1.00000E+00         1.99487E-09         6.24807E+01         1.77897E+00         6.07018E+01
+          2.10821E-02         3.75973E-03        -1.40257E-02         1.32462E+00         4.55555E-01         1.32469E+00         6.06321E+01         1.00000E+00         2.08575E-09         6.06321E+01         1.81886E+00         5.88132E+01
+          2.10821E-02         3.92956E-03        -1.40668E-02         1.32462E+00         4.66225E-01         1.32469E+00         5.87927E+01         1.00000E+00         2.17645E-09         5.87927E+01         1.85794E+00         5.69347E+01
+          2.10821E-02         4.09939E-03        -1.41096E-02         1.32462E+00         4.76896E-01         1.32469E+00         5.69647E+01         1.00000E+00         2.26648E-09         5.69647E+01         1.89612E+00         5.50686E+01
+          2.10821E-02         4.26921E-03        -1.41542E-02         1.32462E+00         4.87567E-01         1.32469E+00         5.51506E+01         1.00000E+00         2.35533E-09         5.51506E+01         1.93333E+00         5.32172E+01
+          2.10821E-02         4.43904E-03        -1.42007E-02         1.32462E+00         4.98237E-01         1.32469E+00         5.33524E+01         1.00000E+00         2.44256E-09         5.33524E+01         1.96948E+00         5.13829E+01
+          2.10821E-02         4.60887E-03        -1.42489E-02         1.32461E+00         5.08908E-01         1.32469E+00         5.15723E+01         1.00000E+00         2.52770E-09         5.15723E+01         2.00452E+00         4.95678E+01
+          2.10821E-02         4.77869E-03        -1.42990E-02         1.32461E+00         5.19578E-01         1.32469E+00         4.98123E+01         1.00000E+00         2.61032E-09         4.98123E+01         2.03836E+00         4.77740E+01
+          2.10821E-02         4.94852E-03        -1.43509E-02         1.32461E+00         5.30249E-01         1.32469E+00         4.80744E+01         1.00000E+00         2.68997E-09         4.80744E+01         2.07095E+00         4.60035E+01
+          2.10821E-02         5.11835E-03        -1.44046E-02         1.32461E+00         5.40919E-01         1.32469E+00         4.63604E+01         1.00000E+00         2.76622E-09         4.63604E+01         2.10221E+00         4.42582E+01
+          2.10821E-02         5.28818E-03        -1.44601E-02         1.32461E+00         5.51590E-01         1.32469E+00         4.46720E+01         1.00000E+00         2.83866E-09         4.46720E+01         2.13209E+00         4.25399E+01
+          2.10821E-02         5.45800E-03        -1.45174E-02         1.32461E+00         5.62261E-01         1.32469E+00         4.30110E+01         1.00000E+00         2.90684E-09         4.30110E+01         2.16053E+00         4.08505E+01
+          2.10821E-02         5.62783E-03        -1.45766E-02         1.32461E+00         5.72931E-01         1.32469E+00         4.13788E+01         1.00000E+00         2.97034E-09         4.13788E+01         2.18748E+00         3.91913E+01
+          2.10821E-02         5.79766E-03        -1.46375E-02         1.32461E+00         5.83602E-01         1.32469E+00         3.97770E+01         1.00000E+00         3.02876E-09         3.97770E+01         2.21288E+00         3.75641E+01
+          2.10821E-02         5.96749E-03        -1.47003E-02         1.32461E+00         5.94272E-01         1.32469E+00         3.82069E+01         1.00000E+00         3.08168E-09         3.82069E+01         2.23669E+00         3.59702E+01
+          2.10821E-02         6.13731E-03        -1.47648E-02         1.32460E+00         6.04943E-01         1.32469E+00         3.66698E+01         1.00000E+00         3.12868E-09         3.66698E+01         2.25887E+00         3.44109E+01
+          2.10821E-02         6.30714E-03        -1.48312E-02         1.32460E+00         6.15613E-01         1.32469E+00         3.51668E+01         1.00000E+00         3.16937E-09         3.51668E+01         2.27938E+00         3.28874E+01
+          2.10821E-02         6.47697E-03        -1.48994E-02         1.32460E+00         6.26284E-01         1.32469E+00         3.36990E+01         1.00000E+00         3.20337E-09         3.36990E+01         2.29819E+00         3.14008E+01
+          2.10821E-02         6.64680E-03        -1.49694E-02         1.32460E+00         6.36955E-01         1.32468E+00         3.22674E+01         1.00000E+00         3.23031E-09         3.22674E+01         2.31526E+00         2.99522E+01
+          2.10821E-02         6.81662E-03        -1.50412E-02         1.32460E+00         6.47625E-01         1.32468E+00         3.08728E+01         1.00000E+00         3.24984E-09         3.08728E+01         2.33057E+00         2.85423E+01
+          2.10821E-02         6.98645E-03        -1.51149E-02         1.32460E+00         6.58296E-01         1.32468E+00         2.95160E+01         1.00000E+00         3.26165E-09         2.95160E+01         2.34410E+00         2.71719E+01
+          2.10821E-02         7.15628E-03        -1.51903E-02         1.32460E+00         6.68966E-01         1.32468E+00         2.81977E+01         1.00000E+00         3.26545E-09         2.81977E+01         2.35583E+00         2.58418E+01
+          2.10821E-02         7.32611E-03        -1.52676E-02         1.32459E+00         6.79637E-01         1.32468E+00         2.69183E+01         1.00000E+00         3.26100E-09         2.69183E+01         2.36575E+00         2.45525E+01
+          2.10821E-02         7.49593E-03        -1.53466E-02         1.32459E+00         6.90307E-01         1.32468E+00         2.56783E+01         1.00000E+00         3.24813E-09         2.56783E+01         2.37385E+00         2.33045E+01
+          2.10821E-02         7.66576E-03        -1.54275E-02         1.32459E+00         7.00978E-01         1.32468E+00         2.44782E+01         1.00000E+00         3.22673E-09         2.44782E+01         2.38012E+00         2.20981E+01
+          2.10821E-02         7.83559E-03        -1.55102E-02         1.32459E+00         7.11649E-01         1.32468E+00         2.33182E+01         1.00000E+00         3.19679E-09         2.33182E+01         2.38457E+00         2.09336E+01
+          2.10821E-02         8.00542E-03        -1.55947E-02         1.32459E+00         7.22319E-01         1.32468E+00         2.21984E+01         1.00000E+00         3.15840E-09         2.21984E+01         2.38719E+00         1.98112E+01
+          2.10821E-02         8.17524E-03        -1.56810E-02         1.32458E+00         7.32990E-01         1.32468E+00         2.11189E+01         1.00000E+00         3.11180E-09         2.11189E+01         2.38799E+00         1.87309E+01
+          2.10821E-02         8.34507E-03        -1.57691E-02         1.32458E+00         7.43660E-01         1.32468E+00         2.00797E+01         1.00000E+00         3.05741E-09         2.00797E+01         2.38699E+00         1.76928E+01
+          2.10821E-02         8.51490E-03        -1.58591E-02         1.32458E+00         7.54331E-01         1.32468E+00         1.90808E+01         1.00000E+00         2.99585E-09         1.90808E+01         2.38420E+00         1.66966E+01
+          2.10821E-02         8.68473E-03        -1.59508E-02         1.32458E+00         7.65001E-01         1.32468E+00         1.81219E+01         1.00000E+00         2.92805E-09         1.81219E+01         2.37964E+00         1.57423E+01
+          2.10821E-02         8.85455E-03        -1.60444E-02         1.32458E+00         7.75672E-01         1.32467E+00         1.72029E+01         1.00000E+00         2.85524E-09         1.72029E+01         2.37333E+00         1.48295E+01
+          2.10821E-02         9.02438E-03        -1.61397E-02         1.32458E+00         7.86343E-01         1.32467E+00         1.63232E+01         1.00000E+00         2.77910E-09         1.63232E+01         2.36530E+00         1.39579E+01
+          2.10821E-02         9.19421E-03        -1.62369E-02         1.32457E+00         7.97013E-01         1.32467E+00         1.54827E+01         1.00000E+00         2.70182E-09         1.54827E+01         2.35558E+00         1.31271E+01
+          2.10821E-02         9.36403E-03        -1.63359E-02         1.32457E+00         8.07684E-01         1.32467E+00         1.46807E+01         1.00000E+00         2.62618E-09         1.46807E+01         2.34421E+00         1.23364E+01
+          2.10821E-02         9.53386E-03        -1.64367E-02         1.32457E+00         8.18354E-01         1.32467E+00         1.39167E+01         1.00000E+00         2.55569E-09         1.39167E+01         2.33122E+00         1.15855E+01
+          2.10821E-02         9.70369E-03        -1.65393E-02         1.32457E+00         8.29025E-01         1.32467E+00         1.31901E+01         1.00000E+00         2.49458E-09         1.31901E+01         2.31665E+00         1.08735E+01
+          2.10821E-02         9.87352E-03        -1.66438E-02         1.32456E+00         8.39695E-01         1.32467E+00         1.25004E+01         1.00000E+00         2.44781E-09         1.25004E+01         2.30054E+00         1.01998E+01
+          2.10821E-02         1.00433E-02        -1.67500E-02         1.32456E+00         8.50366E-01         1.32467E+00         1.18466E+01         1.00000E+00         2.42086E-09         1.18466E+01         2.28295E+00         9.56366E+00
+          2.10821E-02         1.02132E-02        -1.68581E-02         1.32456E+00         8.61037E-01         1.32467E+00         1.12281E+01         1.00000E+00         2.41938E-09         1.12281E+01         2.26392E+00         8.96419E+00
+          2.10821E-02         1.03830E-02        -1.69679E-02         1.32456E+00         8.71707E-01         1.32467E+00         1.06440E+01         1.00000E+00         2.44862E-09         1.06440E+01         2.24350E+00         8.40054E+00
+          2.10821E-02         1.05528E-02        -1.70796E-02         1.32456E+00         8.82378E-01         1.32467E+00         1.00935E+01         1.00000E+00         2.51282E-09         1.00935E+01         2.22174E+00         7.87179E+00
+          2.10821E-02         1.07227E-02        -1.71931E-02         1.32455E+00         8.93048E-01         1.32466E+00         9.57569E+00         1.00000E+00         2.61466E-09         9.57569E+00         2.19871E+00         7.37698E+00
+          2.10821E-02         1.08925E-02        -1.73084E-02         1.32455E+00         9.03719E-01         1.32466E+00         9.08955E+00         1.00000E+00         2.75507E-09         9.08955E+00         2.17446E+00         6.91509E+00
+          2.10821E-02         1.10623E-02        -1.74255E-02         1.32455E+00         9.14389E-01         1.32466E+00         8.63414E+00         1.00000E+00         2.93331E-09         8.63414E+00         2.14904E+00         6.48509E+00
+          2.10821E-02         1.12321E-02        -1.75445E-02         1.32455E+00         9.25060E-01         1.32466E+00         8.20845E+00         1.00000E+00         3.14741E-09         8.20845E+00         2.12254E+00         6.08592E+00
+          2.10821E-02         1.14020E-02        -1.76652E-02         1.32454E+00         9.35731E-01         1.32466E+00         7.81146E+00         1.00000E+00         3.39460E-09         7.81146E+00         2.09499E+00         5.71647E+00
+          2.10821E-02         1.15718E-02        -1.77878E-02         1.32454E+00         9.46401E-01         1.32466E+00         7.44210E+00         1.00000E+00         3.67172E-09         7.44210E+00         2.06648E+00         5.37562E+00
+          2.10821E-02         1.17416E-02        -1.79121E-02         1.32454E+00         9.57072E-01         1.32466E+00         7.09931E+00         1.00000E+00         3.97555E-09         7.09931E+00         2.03706E+00         5.06225E+00
+          2.10821E-02         1.19114E-02        -1.80383E-02         1.32454E+00         9.67742E-01         1.32466E+00         6.78200E+00         1.00000E+00         4.30296E-09         6.78200E+00         2.00681E+00         4.77519E+00
+          2.10821E-02         1.20813E-02        -1.81663E-02         1.32453E+00         9.78413E-01         1.32466E+00         6.48907E+00         1.00000E+00         4.65095E-09         6.48907E+00         1.97578E+00         4.51329E+00
+          2.10821E-02         1.22511E-02        -1.82961E-02         1.32453E+00         9.89083E-01         1.32466E+00         6.21942E+00         1.00000E+00         5.01673E-09         6.21942E+00         1.94406E+00         4.27537E+00
+          2.10821E-02         1.24209E-02        -1.84277E-02         1.32453E+00         9.99754E-01         1.32466E+00         5.97195E+00         1.00000E+00         5.39765E-09         5.97195E+00         1.91169E+00         4.06025E+00
+          2.10821E-02         1.25908E-02        -1.85611E-02         1.32452E+00         1.01042E+00         1.32465E+00         5.74553E+00         1.00000E+00         5.79119E-09         5.74553E+00         1.87877E+00         3.86677E+00
+          2.10821E-02         1.27606E-02        -1.86964E-02         1.32452E+00         1.02110E+00         1.32465E+00         5.53908E+00         1.00000E+00         6.19491E-09         5.53908E+00         1.84534E+00         3.69374E+00
+          2.10821E-02         1.29304E-02        -1.88334E-02         1.32452E+00         1.03177E+00         1.32465E+00         5.35149E+00         1.00000E+00         6.60644E-09         5.35149E+00         1.81148E+00         3.54001E+00
+          2.10821E-02         1.31002E-02        -1.89723E-02         1.32452E+00         1.04244E+00         1.32465E+00         5.18167E+00         1.00000E+00         7.02346E-09         5.18167E+00         1.77725E+00         3.40442E+00
+          2.10821E-02         1.32701E-02        -1.91129E-02         1.32451E+00         1.05311E+00         1.32465E+00         5.02854E+00         1.00000E+00         7.44363E-09         5.02854E+00         1.74273E+00         3.28581E+00
+          2.10821E-02         1.34399E-02        -1.92554E-02         1.32451E+00         1.06378E+00         1.32465E+00         4.89104E+00         1.00000E+00         7.86462E-09         4.89104E+00         1.70798E+00         3.18306E+00
+          2.10821E-02         1.36097E-02        -1.93997E-02         1.32451E+00         1.07445E+00         1.32465E+00         4.76812E+00         1.00000E+00         8.28409E-09         4.76812E+00         1.67306E+00         3.09506E+00
+          2.10821E-02         1.37795E-02        -1.95458E-02         1.32450E+00         1.08512E+00         1.32465E+00         4.65876E+00         1.00000E+00         8.69965E-09         4.65876E+00         1.63804E+00         3.02072E+00
+          2.10821E-02         1.39494E-02        -1.96938E-02         1.32450E+00         1.09579E+00         1.32465E+00         4.56193E+00         1.00000E+00         9.10891E-09         4.56193E+00         1.60297E+00         2.95896E+00
+          2.10821E-02         1.41192E-02        -1.98435E-02         1.32450E+00         1.10646E+00         1.32465E+00         4.47666E+00         1.00000E+00         9.50943E-09         4.47666E+00         1.56792E+00         2.90874E+00
+          2.10821E-02         1.42890E-02        -1.99950E-02         1.32449E+00         1.11713E+00         1.32464E+00         4.40200E+00         1.00000E+00         9.89874E-09         4.40200E+00         1.53295E+00         2.86905E+00
+          2.10821E-02         1.44589E-02        -2.01484E-02         1.32449E+00         1.12780E+00         1.32464E+00         4.33701E+00         1.00000E+00         1.02744E-08         4.33701E+00         1.49812E+00         2.83889E+00
+          2.10821E-02         1.46287E-02        -2.03036E-02         1.32449E+00         1.13847E+00         1.32464E+00         4.28078E+00         1.00000E+00         1.06338E-08         4.28078E+00         1.46347E+00         2.81731E+00
+          2.10821E-02         1.47985E-02        -2.04606E-02         1.32448E+00         1.14914E+00         1.32464E+00         4.23245E+00         1.00000E+00         1.09745E-08         4.23245E+00         1.42907E+00         2.80337E+00
+          2.10821E-02         1.49683E-02        -2.06194E-02         1.32448E+00         1.15981E+00         1.32464E+00         4.19117E+00         1.00000E+00         1.12940E-08         4.19117E+00         1.39496E+00         2.79620E+00
+          2.10821E-02         1.51382E-02        -2.07800E-02         1.32448E+00         1.17048E+00         1.32464E+00         4.15613E+00         1.00000E+00         1.15899E-08         4.15613E+00         1.36120E+00         2.79493E+00
+          2.10821E-02         1.53080E-02        -2.09424E-02         1.32447E+00         1.18115E+00         1.32464E+00         4.12657E+00         1.00000E+00         1.18596E-08         4.12657E+00         1.32783E+00         2.79874E+00
+          2.10821E-02         1.54778E-02        -2.11066E-02         1.32447E+00         1.19182E+00         1.32464E+00         4.10174E+00         1.00000E+00         1.21009E-08         4.10174E+00         1.29489E+00         2.80685E+00
+          2.10821E-02         1.56476E-02        -2.12727E-02         1.32447E+00         1.20249E+00         1.32464E+00         4.08094E+00         1.00000E+00         1.23113E-08         4.08094E+00         1.26243E+00         2.81852E+00
+          2.10821E-02         1.58175E-02        -2.14405E-02         1.32446E+00         1.21317E+00         1.32464E+00         4.06351E+00         1.00000E+00         1.24889E-08         4.06351E+00         1.23048E+00         2.83303E+00
+          2.10821E-02         1.59873E-02        -2.16102E-02         1.32446E+00         1.22384E+00         1.32464E+00         4.04880E+00         1.00000E+00         1.26315E-08         4.04880E+00         1.19908E+00         2.84972E+00
+          2.10821E-02         1.61571E-02        -2.17817E-02         1.32446E+00         1.23451E+00         1.32464E+00         4.03623E+00         1.00000E+00         1.27373E-08         4.03623E+00         1.16827E+00         2.86796E+00
+          2.10821E-02         1.63270E-02        -2.19550E-02         1.32445E+00         1.24518E+00         1.32463E+00         4.02523E+00         1.00000E+00         1.28049E-08         4.02523E+00         1.13808E+00         2.88716E+00
+          2.10821E-02         1.64968E-02        -2.21301E-02         1.32445E+00         1.25585E+00         1.32463E+00         4.01530E+00         1.00000E+00         1.28330E-08         4.01530E+00         1.10853E+00         2.90677E+00
+          2.10821E-02         1.66666E-02        -2.23070E-02         1.32445E+00         1.26652E+00         1.32463E+00         4.00594E+00         1.00000E+00         1.28206E-08         4.00594E+00         1.07965E+00         2.92630E+00
+          2.10821E-02         1.68364E-02        -2.24857E-02         1.32444E+00         1.27719E+00         1.32463E+00         3.99671E+00         1.00000E+00         1.27675E-08         3.99671E+00         1.05146E+00         2.94526E+00
+          2.10821E-02         1.70063E-02        -2.26663E-02         1.32444E+00         1.28786E+00         1.32463E+00         3.98721E+00         1.00000E+00         1.26738E-08         3.98721E+00         1.02398E+00         2.96322E+00
+          2.10821E-02         1.71761E-02        -2.28487E-02         1.32443E+00         1.29853E+00         1.32463E+00         3.97705E+00         1.00000E+00         1.25403E-08         3.97705E+00         9.97242E-01         2.97980E+00
+          2.10821E-02         1.73459E-02        -2.30328E-02         1.32443E+00         1.30920E+00         1.32463E+00         3.96590E+00         1.00000E+00         1.23690E-08         3.96590E+00         9.71245E-01         2.99465E+00
+          2.10821E-02         1.75158E-02        -2.32188E-02         1.32443E+00         1.31987E+00         1.32463E+00         3.95346E+00         1.00000E+00         1.21626E-08         3.95346E+00         9.46005E-01         3.00745E+00
+          2.10821E-02         1.76856E-02        -2.34066E-02         1.32442E+00         1.33054E+00         1.32463E+00         3.93946E+00         1.00000E+00         1.19253E-08         3.93946E+00         9.21531E-01         3.01793E+00
+          2.10821E-02         1.78554E-02        -2.35962E-02         1.32442E+00         1.34121E+00         1.32463E+00         3.92366E+00         1.00000E+00         1.16631E-08         3.92366E+00         8.97831E-01         3.02583E+00
+          2.10821E-02         1.80252E-02        -2.37876E-02         1.32441E+00         1.35188E+00         1.32463E+00         3.90587E+00         1.00000E+00         1.13837E-08         3.90587E+00         8.74909E-01         3.03096E+00
+          2.10821E-02         1.81951E-02        -2.39809E-02         1.32441E+00         1.36255E+00         1.32463E+00         3.88592E+00         1.00000E+00         1.10974E-08         3.88592E+00         8.52766E-01         3.03315E+00
+          2.10821E-02         1.83649E-02        -2.41759E-02         1.32441E+00         1.37322E+00         1.32463E+00         3.86366E+00         1.00000E+00         1.08175E-08         3.86366E+00         8.31402E-01         3.03225E+00
+          2.10821E-02         1.85347E-02        -2.43728E-02         1.32440E+00         1.38389E+00         1.32463E+00         3.83898E+00         1.00000E+00         1.05601E-08         3.83898E+00         8.10813E-01         3.02817E+00
+          2.10821E-02         1.87045E-02        -2.45714E-02         1.32440E+00         1.39457E+00         1.32463E+00         3.81181E+00         1.00000E+00         1.03449E-08         3.81181E+00         7.90995E-01         3.02082E+00
+          2.10821E-02         1.88744E-02        -2.47719E-02         1.32439E+00         1.40524E+00         1.32462E+00         3.78209E+00         1.00000E+00         1.01943E-08         3.78209E+00         7.71939E-01         3.01015E+00
+          2.10821E-02         1.90442E-02        -2.49742E-02         1.32439E+00         1.41591E+00         1.32462E+00         3.74980E+00         1.00000E+00         1.01329E-08         3.74980E+00         7.53637E-01         2.99616E+00
+          2.10821E-02         1.92140E-02        -2.51783E-02         1.32438E+00         1.42658E+00         1.32462E+00         3.71492E+00         1.00000E+00         1.01848E-08         3.71492E+00         7.36077E-01         2.97884E+00
+          2.10821E-02         1.93839E-02        -2.53843E-02         1.32438E+00         1.43725E+00         1.32462E+00         3.67749E+00         1.00000E+00         1.03717E-08         3.67749E+00         7.19246E-01         2.95824E+00
+          2.10821E-02         1.95537E-02        -2.55920E-02         1.32438E+00         1.44792E+00         1.32462E+00         3.63754E+00         1.00000E+00         1.07099E-08         3.63754E+00         7.03128E-01         2.93441E+00
+          2.10821E-02         1.97235E-02        -2.58016E-02         1.32437E+00         1.45859E+00         1.32462E+00         3.59513E+00         1.00000E+00         1.12082E-08         3.59513E+00         6.87707E-01         2.90743E+00
+          2.10821E-02         1.98933E-02        -2.60129E-02         1.32437E+00         1.46926E+00         1.32462E+00         3.55036E+00         1.00000E+00         1.18679E-08         3.55036E+00         6.72965E-01         2.87739E+00
+          2.10821E-02         2.00632E-02        -2.62261E-02         1.32436E+00         1.47993E+00         1.32462E+00         3.50331E+00         1.00000E+00         1.26834E-08         3.50331E+00         6.58882E-01         2.84443E+00
+          2.10821E-02         2.02330E-02        -2.64411E-02         1.32436E+00         1.49060E+00         1.32462E+00         3.45411E+00         1.00000E+00         1.36445E-08         3.45411E+00         6.45437E-01         2.80867E+00
+          2.10821E-02         2.04028E-02        -2.66579E-02         1.32435E+00         1.50127E+00         1.32462E+00         3.40288E+00         1.00000E+00         1.47381E-08         3.40288E+00         6.32607E-01         2.77027E+00
+          2.10821E-02         2.05726E-02        -2.68765E-02         1.32435E+00         1.51194E+00         1.32462E+00         3.34977E+00         1.00000E+00         1.59498E-08         3.34977E+00         6.20371E-01         2.72940E+00
+          2.10821E-02         2.07425E-02        -2.70969E-02         1.32434E+00         1.52261E+00         1.32462E+00         3.29494E+00         1.00000E+00         1.72653E-08         3.29494E+00         6.08703E-01         2.68624E+00
+          2.10821E-02         2.09123E-02        -2.73192E-02         1.32434E+00         1.53328E+00         1.32462E+00         3.23855E+00         1.00000E+00         1.86706E-08         3.23855E+00         5.97580E-01         2.64097E+00
+          2.10821E-02         2.10821E-02        -2.75432E-02         1.32433E+00         1.54395E+00         1.32462E+00         3.18078E+00         1.00000E+00         2.01527E-08         3.18078E+00         5.86974E-01         2.59381E+00
+          2.10821E-02         2.12520E-02        -2.77691E-02         1.32433E+00         1.55462E+00         1.32462E+00         3.12182E+00         1.00000E+00         2.16990E-08         3.12182E+00         5.76861E-01         2.54496E+00
+          2.10821E-02         2.14218E-02        -2.79967E-02         1.32433E+00         1.56529E+00         1.32462E+00         3.06185E+00         1.00000E+00         2.32978E-08         3.06185E+00         5.67214E-01         2.49464E+00
+          2.10821E-02         2.15916E-02        -2.82262E-02         1.32432E+00         1.57596E+00         1.32462E+00         3.00108E+00         1.00000E+00         2.49378E-08         3.00108E+00         5.58006E-01         2.44307E+00
+          2.10821E-02         2.17614E-02        -2.84575E-02         1.32432E+00         1.58664E+00         1.32462E+00         2.93969E+00         1.00000E+00         2.66079E-08         2.93969E+00         5.49210E-01         2.39048E+00
+          2.10821E-02         2.19313E-02        -2.86907E-02         1.32431E+00         1.59731E+00         1.32462E+00         2.87789E+00         1.00000E+00         2.82977E-08         2.87789E+00         5.40798E-01         2.33709E+00
+          2.10821E-02         2.21011E-02        -2.89256E-02         1.32431E+00         1.60798E+00         1.32462E+00         2.81588E+00         1.00000E+00         2.99965E-08         2.81588E+00         5.32744E-01         2.28314E+00
+          2.10821E-02         2.22709E-02        -2.91623E-02         1.32430E+00         1.61865E+00         1.32462E+00         2.75388E+00         1.00000E+00         3.16941E-08         2.75388E+00         5.25022E-01         2.22886E+00
+          2.10821E-02         2.24407E-02        -2.94009E-02         1.32430E+00         1.62932E+00         1.32462E+00         2.69207E+00         1.00000E+00         3.33802E-08         2.69207E+00         5.17603E-01         2.17447E+00
+          2.10821E-02         2.26106E-02        -2.96413E-02         1.32429E+00         1.63999E+00         1.32462E+00         2.63066E+00         1.00000E+00         3.50445E-08         2.63066E+00         5.10461E-01         2.12020E+00
+          2.10821E-02         2.27804E-02        -2.98834E-02         1.32429E+00         1.65066E+00         1.32462E+00         2.56984E+00         1.00000E+00         3.66767E-08         2.56984E+00         5.03572E-01         2.06627E+00
+          2.10821E-02         2.29502E-02        -3.01274E-02         1.32428E+00         1.66133E+00         1.32462E+00         2.50981E+00         1.00000E+00         3.82665E-08         2.50981E+00         4.96908E-01         2.01290E+00
+          2.10821E-02         2.31201E-02        -3.03732E-02         1.32427E+00         1.67200E+00         1.32462E+00         2.45075E+00         1.00000E+00         3.98038E-08         2.45075E+00         4.90446E-01         1.96030E+00
+          2.10821E-02         2.32899E-02        -3.06209E-02         1.32427E+00         1.68267E+00         1.32462E+00         2.39285E+00         1.00000E+00         4.12783E-08         2.39285E+00         4.84162E-01         1.90868E+00
+          2.10821E-02         2.34597E-02        -3.08703E-02         1.32426E+00         1.69334E+00         1.32462E+00         2.33627E+00         1.00000E+00         4.26799E-08         2.33627E+00         4.78030E-01         1.85824E+00
+          2.10821E-02         2.36295E-02        -3.11215E-02         1.32426E+00         1.70401E+00         1.32462E+00         2.28118E+00         1.00000E+00         4.39985E-08         2.28118E+00         4.72030E-01         1.80915E+00
+          2.10821E-02         2.37994E-02        -3.13746E-02         1.32425E+00         1.71468E+00         1.32463E+00         2.22774E+00         1.00000E+00         4.52245E-08         2.22774E+00         4.66140E-01         1.76160E+00
+          2.10821E-02         2.39692E-02        -3.16295E-02         1.32425E+00         1.72535E+00         1.32463E+00         2.17610E+00         1.00000E+00         4.63480E-08         2.17610E+00         4.60337E-01         1.71577E+00
+          2.10821E-02         2.41390E-02        -3.18862E-02         1.32424E+00         1.73602E+00         1.32463E+00         2.12640E+00         1.00000E+00         4.73600E-08         2.12640E+00         4.54604E-01         1.67179E+00
+          2.10821E-02         2.43088E-02        -3.21447E-02         1.32424E+00         1.74669E+00         1.32463E+00         2.07876E+00         1.00000E+00         4.82514E-08         2.07876E+00         4.48920E-01         1.62984E+00
+          2.10821E-02         2.44787E-02        -3.24050E-02         1.32423E+00         1.75736E+00         1.32463E+00         2.03329E+00         1.00000E+00         4.90138E-08         2.03329E+00         4.43269E-01         1.59002E+00
+          2.10821E-02         2.46485E-02        -3.26671E-02         1.32423E+00         1.76804E+00         1.32463E+00         1.99012E+00         1.00000E+00         4.96394E-08         1.99012E+00         4.37634E-01         1.55248E+00
+          2.10821E-02         2.48183E-02        -3.29311E-02         1.32422E+00         1.77871E+00         1.32463E+00         1.94932E+00         1.00000E+00         5.01211E-08         1.94932E+00         4.31998E-01         1.51732E+00
+          2.10821E-02         2.49882E-02        -3.31968E-02         1.32422E+00         1.78938E+00         1.32463E+00         1.91099E+00         1.00000E+00         5.04526E-08         1.91099E+00         4.26349E-01         1.48464E+00
+          2.10821E-02         2.51580E-02        -3.34644E-02         1.32421E+00         1.80005E+00         1.32463E+00         1.87519E+00         1.00000E+00         5.06287E-08         1.87519E+00         4.20673E-01         1.45452E+00
+          2.10821E-02         2.53278E-02        -3.37338E-02         1.32420E+00         1.81072E+00         1.32463E+00         1.84198E+00         1.00000E+00         5.06453E-08         1.84198E+00         4.14957E-01         1.42702E+00
+          2.10821E-02         2.54976E-02        -3.40050E-02         1.32420E+00         1.82139E+00         1.32463E+00         1.81141E+00         1.00000E+00         5.05000E-08         1.81141E+00         4.09192E-01         1.40222E+00
+          2.10821E-02         2.56675E-02        -3.42780E-02         1.32419E+00         1.83206E+00         1.32464E+00         1.78351E+00         1.00000E+00         5.01917E-08         1.78351E+00         4.03367E-01         1.38014E+00
+          2.10821E-02         2.58373E-02        -3.45528E-02         1.32419E+00         1.84273E+00         1.32464E+00         1.75830E+00         1.00000E+00         4.97219E-08         1.75830E+00         3.97474E-01         1.36082E+00
+          2.10821E-02         2.60071E-02        -3.48294E-02         1.32418E+00         1.85340E+00         1.32464E+00         1.73579E+00         1.00000E+00         4.90941E-08         1.73579E+00         3.91507E-01         1.34428E+00
+          2.10821E-02         2.61769E-02        -3.51079E-02         1.32418E+00         1.86407E+00         1.32464E+00         1.71597E+00         1.00000E+00         4.83149E-08         1.71597E+00         3.85458E-01         1.33051E+00
+          2.12520E-02         8.72665E-04        -1.38316E-02         1.33530E+00         2.74155E-01         1.33537E+00         8.91258E+01         1.00000E+00         5.21817E-10         8.91258E+01         1.24450E+00         8.78813E+01
+          2.12520E-02         1.04249E-03        -1.38418E-02         1.33530E+00         2.84826E-01         1.33537E+00         8.75258E+01         1.00000E+00         5.57868E-10         8.75258E+01         1.27291E+00         8.62529E+01
+          2.12520E-02         1.21232E-03        -1.38538E-02         1.33530E+00         2.95496E-01         1.33537E+00         8.58927E+01         1.00000E+00         6.00202E-10         8.58927E+01         1.30177E+00         8.45910E+01
+          2.12520E-02         1.38215E-03        -1.38677E-02         1.33530E+00         3.06167E-01         1.33537E+00         8.42292E+01         1.00000E+00         6.47762E-10         8.42292E+01         1.33102E+00         8.28982E+01
+          2.12520E-02         1.55197E-03        -1.38833E-02         1.33530E+00         3.16838E-01         1.33537E+00         8.25381E+01         1.00000E+00         6.99579E-10         8.25381E+01         1.36058E+00         8.11775E+01
+          2.12520E-02         1.72180E-03        -1.39008E-02         1.33530E+00         3.27508E-01         1.33537E+00         8.08219E+01         1.00000E+00         7.54801E-10         8.08219E+01         1.39040E+00         7.94315E+01
+          2.12520E-02         1.89163E-03        -1.39201E-02         1.33530E+00         3.38179E-01         1.33537E+00         7.90835E+01         1.00000E+00         8.12695E-10         7.90835E+01         1.42042E+00         7.76630E+01
+          2.12520E-02         2.06146E-03        -1.39411E-02         1.33530E+00         3.48849E-01         1.33537E+00         7.73255E+01         1.00000E+00         8.72634E-10         7.73255E+01         1.45055E+00         7.58750E+01
+          2.12520E-02         2.23128E-03        -1.39640E-02         1.33530E+00         3.59520E-01         1.33537E+00         7.55508E+01         1.00000E+00         9.34080E-10         7.55508E+01         1.48075E+00         7.40700E+01
+          2.12520E-02         2.40111E-03        -1.39888E-02         1.33530E+00         3.70190E-01         1.33537E+00         7.37620E+01         1.00000E+00         9.96562E-10         7.37620E+01         1.51095E+00         7.22510E+01
+          2.12520E-02         2.57094E-03        -1.40153E-02         1.33530E+00         3.80861E-01         1.33537E+00         7.19618E+01         1.00000E+00         1.05967E-09         7.19618E+01         1.54107E+00         7.04207E+01
+          2.12520E-02         2.74077E-03        -1.40436E-02         1.33529E+00         3.91532E-01         1.33537E+00         7.01529E+01         1.00000E+00         1.12302E-09         7.01529E+01         1.57107E+00         6.85818E+01
+          2.12520E-02         2.91059E-03        -1.40738E-02         1.33529E+00         4.02202E-01         1.33537E+00         6.83379E+01         1.00000E+00         1.18628E-09         6.83379E+01         1.60086E+00         6.67371E+01
+          2.12520E-02         3.08042E-03        -1.41057E-02         1.33529E+00         4.12873E-01         1.33537E+00         6.65195E+01         1.00000E+00         1.24913E-09         6.65195E+01         1.63039E+00         6.48892E+01
+          2.12520E-02         3.25025E-03        -1.41395E-02         1.33529E+00         4.23543E-01         1.33537E+00         6.47003E+01         1.00000E+00         1.31127E-09         6.47003E+01         1.65959E+00         6.30407E+01
+          2.12520E-02         3.42008E-03        -1.41751E-02         1.33529E+00         4.34214E-01         1.33537E+00         6.28826E+01         1.00000E+00         1.37241E-09         6.28826E+01         1.68841E+00         6.11942E+01
+          2.12520E-02         3.58990E-03        -1.42125E-02         1.33529E+00         4.44884E-01         1.33537E+00         6.10691E+01         1.00000E+00         1.43228E-09         6.10691E+01         1.71678E+00         5.93523E+01
+          2.12520E-02         3.75973E-03        -1.42517E-02         1.33529E+00         4.55555E-01         1.33537E+00         5.92621E+01         1.00000E+00         1.49061E-09         5.92621E+01         1.74464E+00         5.75175E+01
+          2.12520E-02         3.92956E-03        -1.42927E-02         1.33529E+00         4.66225E-01         1.33537E+00         5.74640E+01         1.00000E+00         1.54713E-09         5.74640E+01         1.77193E+00         5.56920E+01
+          2.12520E-02         4.09939E-03        -1.43355E-02         1.33529E+00         4.76896E-01         1.33537E+00         5.56770E+01         1.00000E+00         1.60157E-09         5.56770E+01         1.79859E+00         5.38784E+01
+          2.12520E-02         4.26921E-03        -1.43801E-02         1.33529E+00         4.87567E-01         1.33536E+00         5.39034E+01         1.00000E+00         1.65368E-09         5.39034E+01         1.82457E+00         5.20788E+01
+          2.12520E-02         4.43904E-03        -1.44266E-02         1.33529E+00         4.98237E-01         1.33536E+00         5.21453E+01         1.00000E+00         1.70319E-09         5.21453E+01         1.84982E+00         5.02955E+01
+          2.12520E-02         4.60887E-03        -1.44749E-02         1.33529E+00         5.08908E-01         1.33536E+00         5.04048E+01         1.00000E+00         1.74984E-09         5.04048E+01         1.87428E+00         4.85305E+01
+          2.12520E-02         4.77869E-03        -1.45249E-02         1.33528E+00         5.19578E-01         1.33536E+00         4.86838E+01         1.00000E+00         1.79336E-09         4.86838E+01         1.89790E+00         4.67859E+01
+          2.12520E-02         4.94852E-03        -1.45768E-02         1.33528E+00         5.30249E-01         1.33536E+00         4.69843E+01         1.00000E+00         1.83348E-09         4.69843E+01         1.92063E+00         4.50637E+01
+          2.12520E-02         5.11835E-03        -1.46305E-02         1.33528E+00         5.40919E-01         1.33536E+00         4.53080E+01         1.00000E+00         1.86994E-09         4.53080E+01         1.94242E+00         4.33656E+01
+          2.12520E-02         5.28818E-03        -1.46860E-02         1.33528E+00         5.51590E-01         1.33536E+00         4.36567E+01         1.00000E+00         1.90247E-09         4.36567E+01         1.96324E+00         4.16935E+01
+          2.12520E-02         5.45800E-03        -1.47433E-02         1.33528E+00         5.62261E-01         1.33536E+00         4.20321E+01         1.00000E+00         1.93081E-09         4.20321E+01         1.98304E+00         4.00490E+01
+          2.12520E-02         5.62783E-03        -1.48025E-02         1.33528E+00         5.72931E-01         1.33536E+00         4.04355E+01         1.00000E+00         1.95467E-09         4.04355E+01         2.00177E+00         3.84337E+01
+          2.12520E-02         5.79766E-03        -1.48634E-02         1.33528E+00         5.83602E-01         1.33536E+00         3.88685E+01         1.00000E+00         1.97381E-09         3.88685E+01         2.01941E+00         3.68491E+01
+          2.12520E-02         5.96749E-03        -1.49262E-02         1.33528E+00         5.94272E-01         1.33536E+00         3.73324E+01         1.00000E+00         1.98795E-09         3.73324E+01         2.03592E+00         3.52965E+01
+          2.12520E-02         6.13731E-03        -1.49907E-02         1.33527E+00         6.04943E-01         1.33536E+00         3.58285E+01         1.00000E+00         1.99683E-09         3.58285E+01         2.05126E+00         3.37772E+01
+          2.12520E-02         6.30714E-03        -1.50571E-02         1.33527E+00         6.15613E-01         1.33536E+00         3.43579E+01         1.00000E+00         2.00021E-09         3.43579E+01         2.06541E+00         3.22924E+01
+          2.12520E-02         6.47697E-03        -1.51253E-02         1.33527E+00         6.26284E-01         1.33536E+00         3.29215E+01         1.00000E+00         1.99785E-09         3.29215E+01         2.07834E+00         3.08432E+01
+          2.12520E-02         6.64680E-03        -1.51953E-02         1.33527E+00         6.36955E-01         1.33536E+00         3.15205E+01         1.00000E+00         1.98952E-09         3.15205E+01         2.09003E+00         2.94305E+01
+          2.12520E-02         6.81662E-03        -1.52671E-02         1.33527E+00         6.47625E-01         1.33536E+00         3.01556E+01         1.00000E+00         1.97501E-09         3.01556E+01         2.10046E+00         2.80551E+01
+          2.12520E-02         6.98645E-03        -1.53408E-02         1.33527E+00         6.58296E-01         1.33536E+00         2.88275E+01         1.00000E+00         1.95414E-09         2.88275E+01         2.10960E+00         2.67179E+01
+          2.12520E-02         7.15628E-03        -1.54162E-02         1.33527E+00         6.68966E-01         1.33535E+00         2.75370E+01         1.00000E+00         1.92676E-09         2.75370E+01         2.11744E+00         2.54195E+01
+          2.12520E-02         7.32611E-03        -1.54935E-02         1.33526E+00         6.79637E-01         1.33535E+00         2.62845E+01         1.00000E+00         1.89277E-09         2.62845E+01         2.12398E+00         2.41605E+01
+          2.12520E-02         7.49593E-03        -1.55725E-02         1.33526E+00         6.90307E-01         1.33535E+00         2.50705E+01         1.00000E+00         1.85210E-09         2.50705E+01         2.12920E+00         2.29413E+01
+          2.12520E-02         7.66576E-03        -1.56534E-02         1.33526E+00         7.00978E-01         1.33535E+00         2.38954E+01         1.00000E+00         1.80477E-09         2.38954E+01         2.13309E+00         2.17623E+01
+          2.12520E-02         7.83559E-03        -1.57361E-02         1.33526E+00         7.11649E-01         1.33535E+00         2.27594E+01         1.00000E+00         1.75089E-09         2.27594E+01         2.13566E+00         2.06238E+01
+          2.12520E-02         8.00542E-03        -1.58206E-02         1.33526E+00         7.22319E-01         1.33535E+00         2.16628E+01         1.00000E+00         1.69069E-09         2.16628E+01         2.13690E+00         1.95259E+01
+          2.12520E-02         8.17524E-03        -1.59069E-02         1.33525E+00         7.32990E-01         1.33535E+00         2.06056E+01         1.00000E+00         1.62457E-09         2.06056E+01         2.13681E+00         1.84687E+01
+          2.12520E-02         8.34507E-03        -1.59950E-02         1.33525E+00         7.43660E-01         1.33535E+00         1.95877E+01         1.00000E+00         1.55312E-09         1.95877E+01         2.13540E+00         1.74523E+01
+          2.12520E-02         8.51490E-03        -1.60850E-02         1.33525E+00         7.54331E-01         1.33535E+00         1.86092E+01         1.00000E+00         1.47727E-09         1.86092E+01         2.13267E+00         1.64765E+01
+          2.12520E-02         8.68473E-03        -1.61767E-02         1.33525E+00         7.65001E-01         1.33535E+00         1.76699E+01         1.00000E+00         1.39836E-09         1.76699E+01         2.12865E+00         1.55412E+01
+          2.12520E-02         8.85455E-03        -1.62703E-02         1.33525E+00         7.75672E-01         1.33535E+00         1.67694E+01         1.00000E+00         1.31829E-09         1.67694E+01         2.12333E+00         1.46461E+01
+          2.12520E-02         9.02438E-03        -1.63656E-02         1.33525E+00         7.86343E-01         1.33535E+00         1.59076E+01         1.00000E+00         1.23976E-09         1.59076E+01         2.11675E+00         1.37908E+01
+          2.12520E-02         9.19421E-03        -1.64628E-02         1.33524E+00         7.97013E-01         1.33534E+00         1.50840E+01         1.00000E+00         1.16651E-09         1.50840E+01         2.10891E+00         1.29751E+01
+          2.12520E-02         9.36403E-03        -1.65618E-02         1.33524E+00         8.07684E-01         1.33534E+00         1.42981E+01         1.00000E+00         1.10354E-09         1.42981E+01         2.09983E+00         1.21983E+01
+          2.12520E-02         9.53386E-03        -1.66626E-02         1.33524E+00         8.18354E-01         1.33534E+00         1.35495E+01         1.00000E+00         1.05713E-09         1.35495E+01         2.08955E+00         1.14599E+01
+          2.12520E-02         9.70369E-03        -1.67652E-02         1.33524E+00         8.29025E-01         1.33534E+00         1.28375E+01         1.00000E+00         1.03435E-09         1.28375E+01         2.07808E+00         1.07594E+01
+          2.12520E-02         9.87352E-03        -1.68697E-02         1.33523E+00         8.39695E-01         1.33534E+00         1.21615E+01         1.00000E+00         1.04181E-09         1.21615E+01         2.06546E+00         1.00961E+01
+          2.12520E-02         1.00433E-02        -1.69759E-02         1.33523E+00         8.50366E-01         1.33534E+00         1.15208E+01         1.00000E+00         1.08392E-09         1.15208E+01         2.05171E+00         9.46913E+00
+          2.12520E-02         1.02132E-02        -1.70840E-02         1.33523E+00         8.61037E-01         1.33534E+00         1.09147E+01         1.00000E+00         1.16174E-09         1.09147E+01         2.03687E+00         8.87786E+00
+          2.12520E-02         1.03830E-02        -1.71938E-02         1.33523E+00         8.71707E-01         1.33534E+00         1.03424E+01         1.00000E+00         1.27320E-09         1.03424E+01         2.02098E+00         8.32140E+00
+          2.12520E-02         1.05528E-02        -1.73055E-02         1.33523E+00         8.82378E-01         1.33534E+00         9.80295E+00         1.00000E+00         1.41437E-09         9.80295E+00         2.00406E+00         7.79889E+00
+          2.12520E-02         1.07227E-02        -1.74190E-02         1.33522E+00         8.93048E-01         1.33534E+00         9.29556E+00         1.00000E+00         1.58084E-09         9.29556E+00         1.98615E+00         7.30941E+00
+          2.12520E-02         1.08925E-02        -1.75343E-02         1.33522E+00         9.03719E-01         1.33534E+00         8.81929E+00         1.00000E+00         1.76853E-09         8.81929E+00         1.96730E+00         6.85199E+00
+          2.12520E-02         1.10623E-02        -1.76514E-02         1.33522E+00         9.14389E-01         1.33533E+00         8.37320E+00         1.00000E+00         1.97397E-09         8.37320E+00         1.94755E+00         6.42566E+00
+          2.12520E-02         1.12321E-02        -1.77704E-02         1.33522E+00         9.25060E-01         1.33533E+00         7.95631E+00         1.00000E+00         2.19431E-09         7.95631E+00         1.92693E+00         6.02938E+00
+          2.12520E-02         1.14020E-02        -1.78911E-02         1.33521E+00         9.35731E-01         1.33533E+00         7.56762E+00         1.00000E+00         2.42720E-09         7.56762E+00         1.90549E+00         5.66212E+00
+          2.12520E-02         1.15718E-02        -1.80137E-02         1.33521E+00         9.46401E-01         1.33533E+00         7.20610E+00         1.00000E+00         2.67064E-09         7.20610E+00         1.88328E+00         5.32281E+00
+          2.12520E-02         1.17416E-02        -1.81380E-02         1.33521E+00         9.57072E-01         1.33533E+00         6.87071E+00         1.00000E+00         2.92289E-09         6.87071E+00         1.86034E+00         5.01036E+00
+          2.12520E-02         1.19114E-02        -1.82642E-02         1.33520E+00         9.67742E-01         1.33533E+00         6.56039E+00         1.00000E+00         3.18239E-09         6.56039E+00         1.83672E+00         4.72367E+00
+          2.12520E-02         1.20813E-02        -1.83922E-02         1.33520E+00         9.78413E-01         1.33533E+00         6.27408E+00         1.00000E+00         3.44767E-09         6.27408E+00         1.81246E+00         4.46162E+00
+          2.12520E-02         1.22511E-02        -1.85220E-02         1.33520E+00         9.89083E-01         1.33533E+00         6.01071E+00         1.00000E+00         3.71730E-09         6.01071E+00         1.78761E+00         4.22310E+00
+          2.12520E-02         1.24209E-02        -1.86536E-02         1.33520E+00         9.99754E-01         1.33533E+00         5.76919E+00         1.00000E+00         3.98991E-09         5.76919E+00         1.76222E+00         4.00697E+00
+          2.12520E-02         1.25908E-02        -1.87870E-02         1.33519E+00         1.01042E+00         1.33533E+00         5.54845E+00         1.00000E+00         4.26410E-09         5.54845E+00         1.73634E+00         3.81211E+00
+          2.12520E-02         1.27606E-02        -1.89223E-02         1.33519E+00         1.02110E+00         1.33532E+00         5.34741E+00         1.00000E+00         4.53846E-09         5.34741E+00         1.71001E+00         3.63740E+00
+          2.12520E-02         1.29304E-02        -1.90593E-02         1.33519E+00         1.03177E+00         1.33532E+00         5.16499E+00         1.00000E+00         4.81156E-09         5.16499E+00         1.68328E+00         3.48171E+00
+          2.12520E-02         1.31002E-02        -1.91982E-02         1.33519E+00         1.04244E+00         1.33532E+00         5.00013E+00         1.00000E+00         5.08194E-09         5.00013E+00         1.65620E+00         3.34393E+00
+          2.12520E-02         1.32701E-02        -1.93388E-02         1.33518E+00         1.05311E+00         1.33532E+00         4.85179E+00         1.00000E+00         5.34809E-09         4.85179E+00         1.62882E+00         3.22296E+00
+          2.12520E-02         1.34399E-02        -1.94813E-02         1.33518E+00         1.06378E+00         1.33532E+00         4.71890E+00         1.00000E+00         5.60847E-09         4.71890E+00         1.60119E+00         3.11772E+00
+          2.12520E-02         1.36097E-02        -1.96256E-02         1.33518E+00         1.07445E+00         1.33532E+00         4.60046E+00         1.00000E+00         5.86149E-09         4.60046E+00         1.57335E+00         3.02712E+00
+          2.12520E-02         1.37795E-02        -1.97717E-02         1.33517E+00         1.08512E+00         1.33532E+00         4.49546E+00         1.00000E+00         6.10554E-09         4.49546E+00         1.54534E+00         2.95012E+00
+          2.12520E-02         1.39494E-02        -1.99197E-02         1.33517E+00         1.09579E+00         1.33532E+00         4.40290E+00         1.00000E+00         6.33894E-09         4.40290E+00         1.51722E+00         2.88568E+00
+          2.12520E-02         1.41192E-02        -2.00694E-02         1.33517E+00         1.10646E+00         1.33532E+00         4.32181E+00         1.00000E+00         6.56003E-09         4.32181E+00         1.48902E+00         2.83279E+00
+          2.12520E-02         1.42890E-02        -2.02209E-02         1.33516E+00         1.11713E+00         1.33532E+00         4.25127E+00         1.00000E+00         6.76708E-09         4.25127E+00         1.46080E+00         2.79048E+00
+          2.12520E-02         1.44589E-02        -2.03743E-02         1.33516E+00         1.12780E+00         1.33532E+00         4.19036E+00         1.00000E+00         6.95836E-09         4.19036E+00         1.43258E+00         2.75777E+00
+          2.12520E-02         1.46287E-02        -2.05295E-02         1.33516E+00         1.13847E+00         1.33531E+00         4.13818E+00         1.00000E+00         7.13215E-09         4.13818E+00         1.40443E+00         2.73375E+00
+          2.12520E-02         1.47985E-02        -2.06865E-02         1.33515E+00         1.14914E+00         1.33531E+00         4.09387E+00         1.00000E+00         7.28669E-09         4.09387E+00         1.37636E+00         2.71751E+00
+          2.12520E-02         1.49683E-02        -2.08453E-02         1.33515E+00         1.15981E+00         1.33531E+00         4.05661E+00         1.00000E+00         7.42028E-09         4.05661E+00         1.34843E+00         2.70819E+00
+          2.12520E-02         1.51382E-02        -2.10059E-02         1.33515E+00         1.17048E+00         1.33531E+00         4.02561E+00         1.00000E+00         7.53121E-09         4.02561E+00         1.32066E+00         2.70494E+00
+          2.12520E-02         1.53080E-02        -2.11683E-02         1.33514E+00         1.18115E+00         1.33531E+00         4.00008E+00         1.00000E+00         7.61783E-09         4.00008E+00         1.29310E+00         2.70698E+00
+          2.12520E-02         1.54778E-02        -2.13325E-02         1.33514E+00         1.19182E+00         1.33531E+00         3.97931E+00         1.00000E+00         7.67854E-09         3.97931E+00         1.26578E+00         2.71353E+00
+          2.12520E-02         1.56476E-02        -2.14986E-02         1.33514E+00         1.20249E+00         1.33531E+00         3.96260E+00         1.00000E+00         7.71184E-09         3.96260E+00         1.23873E+00         2.72387E+00
+          2.12520E-02         1.58175E-02        -2.16664E-02         1.33513E+00         1.21317E+00         1.33531E+00         3.94927E+00         1.00000E+00         7.71631E-09         3.94927E+00         1.21198E+00         2.73729E+00
+          2.12520E-02         1.59873E-02        -2.18361E-02         1.33513E+00         1.22384E+00         1.33531E+00         3.93871E+00         1.00000E+00         7.69070E-09         3.93871E+00         1.18556E+00         2.75315E+00
+          2.12520E-02         1.61571E-02        -2.20076E-02         1.33513E+00         1.23451E+00         1.33531E+00         3.93032E+00         1.00000E+00         7.63391E-09         3.93032E+00         1.15950E+00         2.77082E+00
+          2.12520E-02         1.63270E-02        -2.21809E-02         1.33512E+00         1.24518E+00         1.33531E+00         3.92354E+00         1.00000E+00         7.54507E-09         3.92354E+00         1.13382E+00         2.78972E+00
+          2.12520E-02         1.64968E-02        -2.23560E-02         1.33512E+00         1.25585E+00         1.33531E+00         3.91786E+00         1.00000E+00         7.42361E-09         3.91786E+00         1.10855E+00         2.80931E+00
+          2.12520E-02         1.66666E-02        -2.25329E-02         1.33511E+00         1.26652E+00         1.33530E+00         3.91279E+00         1.00000E+00         7.26929E-09         3.91279E+00         1.08370E+00         2.82908E+00
+          2.12520E-02         1.68364E-02        -2.27116E-02         1.33511E+00         1.27719E+00         1.33530E+00         3.90787E+00         1.00000E+00         7.08236E-09         3.90787E+00         1.05930E+00         2.84856E+00
+          2.12520E-02         1.70063E-02        -2.28922E-02         1.33511E+00         1.28786E+00         1.33530E+00         3.90270E+00         1.00000E+00         6.86369E-09         3.90270E+00         1.03537E+00         2.86733E+00
+          2.12520E-02         1.71761E-02        -2.30745E-02         1.33510E+00         1.29853E+00         1.33530E+00         3.89689E+00         1.00000E+00         6.61494E-09         3.89689E+00         1.01192E+00         2.88497E+00
+          2.12520E-02         1.73459E-02        -2.32587E-02         1.33510E+00         1.30920E+00         1.33530E+00         3.89011E+00         1.00000E+00         6.33887E-09         3.89011E+00         9.88961E-01         2.90114E+00
+          2.12520E-02         1.75158E-02        -2.34447E-02         1.33509E+00         1.31987E+00         1.33530E+00         3.88203E+00         1.00000E+00         6.03974E-09         3.88203E+00         9.66510E-01         2.91552E+00
+          2.12520E-02         1.76856E-02        -2.36325E-02         1.33509E+00         1.33054E+00         1.33530E+00         3.87240E+00         1.00000E+00         5.72387E-09         3.87240E+00         9.44576E-01         2.92782E+00
+          2.12520E-02         1.78554E-02        -2.38221E-02         1.33509E+00         1.34121E+00         1.33530E+00         3.86095E+00         1.00000E+00         5.40043E-09         3.86095E+00         9.23168E-01         2.93778E+00
+          2.12520E-02         1.80252E-02        -2.40135E-02         1.33508E+00         1.35188E+00         1.33530E+00         3.84748E+00         1.00000E+00         5.08248E-09         3.84748E+00         9.02293E-01         2.94519E+00
+          2.12520E-02         1.81951E-02        -2.42067E-02         1.33508E+00         1.36255E+00         1.33530E+00         3.83182E+00         1.00000E+00         4.78823E-09         3.83182E+00         8.81955E-01         2.94986E+00
+          2.12520E-02         1.83649E-02        -2.44018E-02         1.33507E+00         1.37322E+00         1.33530E+00         3.81380E+00         1.00000E+00         4.54202E-09         3.81380E+00         8.62157E-01         2.95164E+00
+          2.12520E-02         1.85347E-02        -2.45987E-02         1.33507E+00         1.38389E+00         1.33530E+00         3.79331E+00         1.00000E+00         4.37403E-09         3.79331E+00         8.42901E-01         2.95041E+00
+          2.12520E-02         1.87045E-02        -2.47973E-02         1.33507E+00         1.39457E+00         1.33530E+00         3.77026E+00         1.00000E+00         4.31715E-09         3.77026E+00         8.24187E-01         2.94607E+00
+          2.12520E-02         1.88744E-02        -2.49978E-02         1.33506E+00         1.40524E+00         1.33530E+00         3.74457E+00         1.00000E+00         4.40003E-09         3.74457E+00         8.06013E-01         2.93856E+00
+          2.12520E-02         1.90442E-02        -2.52001E-02         1.33506E+00         1.41591E+00         1.33530E+00         3.71621E+00         1.00000E+00         4.63895E-09         3.71621E+00         7.88376E-01         2.92783E+00
+          2.12520E-02         1.92140E-02        -2.54042E-02         1.33505E+00         1.42658E+00         1.33529E+00         3.68516E+00         1.00000E+00         5.03393E-09         3.68516E+00         7.71271E-01         2.91389E+00
+          2.12520E-02         1.93839E-02        -2.56101E-02         1.33505E+00         1.43725E+00         1.33529E+00         3.65144E+00         1.00000E+00         5.57188E-09         3.65144E+00         7.54692E-01         2.89675E+00
+          2.12520E-02         1.95537E-02        -2.58179E-02         1.33504E+00         1.44792E+00         1.33529E+00         3.61506E+00         1.00000E+00         6.23345E-09         3.61506E+00         7.38633E-01         2.87643E+00
+          2.12520E-02         1.97235E-02        -2.60274E-02         1.33504E+00         1.45859E+00         1.33529E+00         3.57608E+00         1.00000E+00         6.99873E-09         3.57608E+00         7.23083E-01         2.85300E+00
+          2.12520E-02         1.98933E-02        -2.62388E-02         1.33504E+00         1.46926E+00         1.33529E+00         3.53458E+00         1.00000E+00         7.85006E-09         3.53458E+00         7.08035E-01         2.82654E+00
+          2.12520E-02         2.00632E-02        -2.64520E-02         1.33503E+00         1.47993E+00         1.33529E+00         3.49063E+00         1.00000E+00         8.77268E-09         3.49063E+00         6.93475E-01         2.79715E+00
+          2.12520E-02         2.02330E-02        -2.66669E-02         1.33503E+00         1.49060E+00         1.33529E+00         3.44434E+00         1.00000E+00         9.75446E-09         3.44434E+00         6.79394E-01         2.76495E+00
+          2.12520E-02         2.04028E-02        -2.68837E-02         1.33502E+00         1.50127E+00         1.33529E+00         3.39583E+00         1.00000E+00         1.07852E-08         3.39583E+00         6.65778E-01         2.73005E+00
+          2.12520E-02         2.05726E-02        -2.71024E-02         1.33502E+00         1.51194E+00         1.33529E+00         3.34524E+00         1.00000E+00         1.18562E-08         3.34524E+00         6.52613E-01         2.69263E+00
+          2.12520E-02         2.07425E-02        -2.73228E-02         1.33501E+00         1.52261E+00         1.33529E+00         3.29271E+00         1.00000E+00         1.29597E-08         3.29271E+00         6.39886E-01         2.65283E+00
+          2.12520E-02         2.09123E-02        -2.75450E-02         1.33501E+00         1.53328E+00         1.33529E+00         3.23840E+00         1.00000E+00         1.40885E-08         3.23840E+00         6.27580E-01         2.61082E+00
+          2.12520E-02         2.10821E-02        -2.77691E-02         1.33500E+00         1.54395E+00         1.33529E+00         3.18248E+00         1.00000E+00         1.52358E-08         3.18248E+00         6.15681E-01         2.56680E+00
+          2.12520E-02         2.12520E-02        -2.79949E-02         1.33500E+00         1.55462E+00         1.33529E+00         3.12512E+00         1.00000E+00         1.63950E-08         3.12512E+00         6.04173E-01         2.52095E+00
+          2.12520E-02         2.14218E-02        -2.82226E-02         1.33499E+00         1.56529E+00         1.33529E+00         3.06651E+00         1.00000E+00         1.75596E-08         3.06651E+00         5.93038E-01         2.47347E+00
+          2.12520E-02         2.15916E-02        -2.84521E-02         1.33499E+00         1.57596E+00         1.33529E+00         3.00684E+00         1.00000E+00         1.87231E-08         3.00684E+00         5.82260E-01         2.42458E+00
+          2.12520E-02         2.17614E-02        -2.86834E-02         1.33498E+00         1.58664E+00         1.33529E+00         2.94629E+00         1.00000E+00         1.98791E-08         2.94629E+00         5.71821E-01         2.37447E+00
+          2.12520E-02         2.19313E-02        -2.89165E-02         1.33498E+00         1.59731E+00         1.33529E+00         2.88508E+00         1.00000E+00         2.10209E-08         2.88508E+00         5.61705E-01         2.32337E+00
+          2.12520E-02         2.21011E-02        -2.91514E-02         1.33497E+00         1.60798E+00         1.33529E+00         2.82339E+00         1.00000E+00         2.21418E-08         2.82339E+00         5.51894E-01         2.27149E+00
+          2.12520E-02         2.22709E-02        -2.93882E-02         1.33497E+00         1.61865E+00         1.33529E+00         2.76143E+00         1.00000E+00         2.32352E-08         2.76143E+00         5.42370E-01         2.21906E+00
+          2.12520E-02         2.24407E-02        -2.96267E-02         1.33496E+00         1.62932E+00         1.33529E+00         2.69940E+00         1.00000E+00         2.42940E-08         2.69940E+00         5.33116E-01         2.16628E+00
+          2.12520E-02         2.26106E-02        -2.98671E-02         1.33496E+00         1.63999E+00         1.33529E+00         2.63750E+00         1.00000E+00         2.53114E-08         2.63750E+00         5.24114E-01         2.11338E+00
+          2.12520E-02         2.27804E-02        -3.01093E-02         1.33495E+00         1.65066E+00         1.33529E+00         2.57592E+00         1.00000E+00         2.62804E-08         2.57592E+00         5.15347E-01         2.06057E+00
+          2.12520E-02         2.29502E-02        -3.03533E-02         1.33495E+00         1.66133E+00         1.33529E+00         2.51487E+00         1.00000E+00         2.71939E-08         2.51487E+00         5.06799E-01         2.00807E+00
+          2.12520E-02         2.31201E-02        -3.05991E-02         1.33494E+00         1.67200E+00         1.33529E+00         2.45452E+00         1.00000E+00         2.80449E-08         2.45452E+00         4.98453E-01         1.95607E+00
+          2.12520E-02         2.32899E-02        -3.08467E-02         1.33494E+00         1.68267E+00         1.33529E+00         2.39508E+00         1.00000E+00         2.88264E-08         2.39508E+00         4.90291E-01         1.90479E+00
+          2.12520E-02         2.34597E-02        -3.10962E-02         1.33493E+00         1.69334E+00         1.33529E+00         2.33671E+00         1.00000E+00         2.95314E-08         2.33671E+00         4.82300E-01         1.85441E+00
+          2.12520E-02         2.36295E-02        -3.13474E-02         1.33493E+00         1.70401E+00         1.33529E+00         2.27958E+00         1.00000E+00         3.01531E-08         2.27958E+00         4.74462E-01         1.80512E+00
+          2.12520E-02         2.37994E-02        -3.16005E-02         1.33492E+00         1.71468E+00         1.33530E+00         2.22387E+00         1.00000E+00         3.06847E-08         2.22387E+00         4.66763E-01         1.75711E+00
+          2.12520E-02         2.39692E-02        -3.18553E-02         1.33492E+00         1.72535E+00         1.33530E+00         2.16973E+00         1.00000E+00         3.11199E-08         2.16973E+00         4.59190E-01         1.71054E+00
+          2.12520E-02         2.41390E-02        -3.21120E-02         1.33491E+00         1.73602E+00         1.33530E+00         2.11731E+00         1.00000E+00         3.14523E-08         2.11731E+00         4.51727E-01         1.66558E+00
+          2.12520E-02         2.43088E-02        -3.23705E-02         1.33491E+00         1.74669E+00         1.33530E+00         2.06675E+00         1.00000E+00         3.16761E-08         2.06675E+00         4.44362E-01         1.62238E+00
+          2.12520E-02         2.44787E-02        -3.26308E-02         1.33490E+00         1.75736E+00         1.33530E+00         2.01817E+00         1.00000E+00         3.17857E-08         2.01817E+00         4.37083E-01         1.58108E+00
+          2.12520E-02         2.46485E-02        -3.28930E-02         1.33489E+00         1.76804E+00         1.33530E+00         1.97169E+00         1.00000E+00         3.17763E-08         1.97169E+00         4.29878E-01         1.54182E+00
+          2.12520E-02         2.48183E-02        -3.31569E-02         1.33489E+00         1.77871E+00         1.33530E+00         1.92743E+00         1.00000E+00         3.16434E-08         1.92743E+00         4.22736E-01         1.50470E+00
+          2.12520E-02         2.49882E-02        -3.34227E-02         1.33488E+00         1.78938E+00         1.33530E+00         1.88548E+00         1.00000E+00         3.13833E-08         1.88548E+00         4.15645E-01         1.46983E+00
+          2.12520E-02         2.51580E-02        -3.36902E-02         1.33488E+00         1.80005E+00         1.33530E+00         1.84592E+00         1.00000E+00         3.09934E-08         1.84592E+00         4.08598E-01         1.43733E+00
+          2.12520E-02         2.53278E-02        -3.39596E-02         1.33487E+00         1.81072E+00         1.33530E+00         1.80884E+00         1.00000E+00         3.04718E-08         1.80884E+00         4.01585E-01         1.40725E+00
+          2.12520E-02         2.54976E-02        -3.42308E-02         1.33487E+00         1.82139E+00         1.33530E+00         1.77428E+00         1.00000E+00         2.98183E-08         1.77428E+00         3.94598E-01         1.37968E+00
+          2.12520E-02         2.56675E-02        -3.45038E-02         1.33486E+00         1.83206E+00         1.33531E+00         1.74230E+00         1.00000E+00         2.90339E-08         1.74230E+00         3.87630E-01         1.35467E+00
+          2.12520E-02         2.58373E-02        -3.47786E-02         1.33485E+00         1.84273E+00         1.33531E+00         1.71295E+00         1.00000E+00         2.81220E-08         1.71295E+00         3.80674E-01         1.33228E+00
+          2.12520E-02         2.60071E-02        -3.50553E-02         1.33485E+00         1.85340E+00         1.33531E+00         1.68624E+00         1.00000E+00         2.70884E-08         1.68624E+00         3.73725E-01         1.31252E+00
+          2.12520E-02         2.61769E-02        -3.53337E-02         1.33484E+00         1.86407E+00         1.33531E+00         1.66219E+00         1.00000E+00         2.59425E-08         1.66219E+00         3.66778E-01         1.29542E+00
+          2.14218E-02         8.72665E-04        -1.40593E-02         1.34597E+00         2.74155E-01         1.34604E+00         8.71124E+01         1.00000E+00         4.31528E-10         8.71124E+01         1.43835E+00         8.56741E+01
+          2.14218E-02         1.04249E-03        -1.40695E-02         1.34597E+00         2.84826E-01         1.34604E+00         8.55495E+01         1.00000E+00         4.73427E-10         8.55495E+01         1.45482E+00         8.40947E+01
+          2.14218E-02         1.21232E-03        -1.40816E-02         1.34597E+00         2.95496E-01         1.34604E+00         8.39543E+01         1.00000E+00         5.16123E-10         8.39543E+01         1.47155E+00         8.24828E+01
+          2.14218E-02         1.38215E-03        -1.40954E-02         1.34597E+00         3.06167E-01         1.34604E+00         8.23293E+01         1.00000E+00         5.59364E-10         8.23293E+01         1.48849E+00         8.08408E+01
+          2.14218E-02         1.55197E-03        -1.41111E-02         1.34597E+00         3.16838E-01         1.34604E+00         8.06772E+01         1.00000E+00         6.02923E-10         8.06772E+01         1.50560E+00         7.91716E+01
+          2.14218E-02         1.72180E-03        -1.41285E-02         1.34597E+00         3.27508E-01         1.34604E+00         7.90007E+01         1.00000E+00         6.46590E-10         7.90007E+01         1.52284E+00         7.74778E+01
+          2.14218E-02         1.89163E-03        -1.41478E-02         1.34597E+00         3.38179E-01         1.34604E+00         7.73023E+01         1.00000E+00         6.90170E-10         7.73023E+01         1.54018E+00         7.57621E+01
+          2.14218E-02         2.06146E-03        -1.41689E-02         1.34597E+00         3.48849E-01         1.34604E+00         7.55848E+01         1.00000E+00         7.33480E-10         7.55848E+01         1.55758E+00         7.40272E+01
+          2.14218E-02         2.23128E-03        -1.41918E-02         1.34597E+00         3.59520E-01         1.34604E+00         7.38509E+01         1.00000E+00         7.76338E-10         7.38509E+01         1.57499E+00         7.22759E+01
+          2.14218E-02         2.40111E-03        -1.42165E-02         1.34597E+00         3.70190E-01         1.34604E+00         7.21031E+01         1.00000E+00         8.18570E-10         7.21031E+01         1.59238E+00         7.05107E+01
+          2.14218E-02         2.57094E-03        -1.42430E-02         1.34597E+00         3.80861E-01         1.34604E+00         7.03441E+01         1.00000E+00         8.60006E-10         7.03441E+01         1.60970E+00         6.87344E+01
+          2.14218E-02         2.74077E-03        -1.42713E-02         1.34597E+00         3.91532E-01         1.34604E+00         6.85766E+01         1.00000E+00         9.00475E-10         6.85766E+01         1.62692E+00         6.69497E+01
+          2.14218E-02         2.91059E-03        -1.43015E-02         1.34596E+00         4.02202E-01         1.34604E+00         6.68031E+01         1.00000E+00         9.39810E-10         6.68031E+01         1.64401E+00         6.51591E+01
+          2.14218E-02         3.08042E-03        -1.43334E-02         1.34596E+00         4.12873E-01         1.34604E+00         6.50261E+01         1.00000E+00         9.77844E-10         6.50261E+01         1.66091E+00         6.33652E+01
+          2.14218E-02         3.25025E-03        -1.43672E-02         1.34596E+00         4.23543E-01         1.34604E+00         6.32482E+01         1.00000E+00         1.01441E-09         6.32482E+01         1.67759E+00         6.15706E+01
+          2.14218E-02         3.42008E-03        -1.44028E-02         1.34596E+00         4.34214E-01         1.34604E+00         6.14717E+01         1.00000E+00         1.04934E-09         6.14717E+01         1.69402E+00         5.97777E+01
+          2.14218E-02         3.58990E-03        -1.44402E-02         1.34596E+00         4.44884E-01         1.34604E+00         5.96993E+01         1.00000E+00         1.08246E-09         5.96993E+01         1.71015E+00         5.79891E+01
+          2.14218E-02         3.75973E-03        -1.44794E-02         1.34596E+00         4.55555E-01         1.34604E+00         5.79330E+01         1.00000E+00         1.11361E-09         5.79330E+01         1.72595E+00         5.62071E+01
+          2.14218E-02         3.92956E-03        -1.45204E-02         1.34596E+00         4.66225E-01         1.34604E+00         5.61754E+01         1.00000E+00         1.14262E-09         5.61754E+01         1.74139E+00         5.44340E+01
+          2.14218E-02         4.09939E-03        -1.45632E-02         1.34596E+00         4.76896E-01         1.34604E+00         5.44286E+01         1.00000E+00         1.16931E-09         5.44286E+01         1.75642E+00         5.26722E+01
+          2.14218E-02         4.26921E-03        -1.46079E-02         1.34596E+00         4.87567E-01         1.34604E+00         5.26947E+01         1.00000E+00         1.19352E-09         5.26947E+01         1.77101E+00         5.09237E+01
+          2.14218E-02         4.43904E-03        -1.46543E-02         1.34596E+00         4.98237E-01         1.34604E+00         5.09759E+01         1.00000E+00         1.21507E-09         5.09759E+01         1.78513E+00         4.91908E+01
+          2.14218E-02         4.60887E-03        -1.47026E-02         1.34596E+00         5.08908E-01         1.34604E+00         4.92742E+01         1.00000E+00         1.23379E-09         4.92742E+01         1.79875E+00         4.74755E+01
+          2.14218E-02         4.77869E-03        -1.47527E-02         1.34595E+00         5.19578E-01         1.34604E+00         4.75915E+01         1.00000E+00         1.24951E-09         4.75915E+01         1.81183E+00         4.57797E+01
+          2.14218E-02         4.94852E-03        -1.48045E-02         1.34595E+00         5.30249E-01         1.34604E+00         4.59296E+01         1.00000E+00         1.26205E-09         4.59296E+01         1.82434E+00         4.41053E+01
+          2.14218E-02         5.11835E-03        -1.48582E-02         1.34595E+00         5.40919E-01         1.34603E+00         4.42904E+01         1.00000E+00         1.27123E-09         4.42904E+01         1.83626E+00         4.24541E+01
+          2.14218E-02         5.28818E-03        -1.49137E-02         1.34595E+00         5.51590E-01         1.34603E+00         4.26755E+01         1.00000E+00         1.27690E-09         4.26755E+01         1.84755E+00         4.08279E+01
+          2.14218E-02         5.45800E-03        -1.49711E-02         1.34595E+00         5.62261E-01         1.34603E+00         4.10865E+01         1.00000E+00         1.27887E-09         4.10865E+01         1.85819E+00         3.92283E+01
+          2.14218E-02         5.62783E-03        -1.50302E-02         1.34595E+00         5.72931E-01         1.34603E+00         3.95248E+01         1.00000E+00         1.27697E-09         3.95248E+01         1.86816E+00         3.76567E+01
+          2.14218E-02         5.79766E-03        -1.50911E-02         1.34595E+00         5.83602E-01         1.34603E+00         3.79920E+01         1.00000E+00         1.27105E-09         3.79920E+01         1.87742E+00         3.61146E+01
+          2.14218E-02         5.96749E-03        -1.51539E-02         1.34595E+00         5.94272E-01         1.34603E+00         3.64893E+01         1.00000E+00         1.26094E-09         3.64893E+01         1.88596E+00         3.46033E+01
+          2.14218E-02         6.13731E-03        -1.52185E-02         1.34594E+00         6.04943E-01         1.34603E+00         3.50179E+01         1.00000E+00         1.24648E-09         3.50179E+01         1.89376E+00         3.31241E+01
+          2.14218E-02         6.30714E-03        -1.52849E-02         1.34594E+00         6.15613E-01         1.34603E+00         3.35789E+01         1.00000E+00         1.22754E-09         3.35789E+01         1.90080E+00         3.16781E+01
+          2.14218E-02         6.47697E-03        -1.53530E-02         1.34594E+00         6.26284E-01         1.34603E+00         3.21735E+01         1.00000E+00         1.20398E-09         3.21735E+01         1.90705E+00         3.02664E+01
+          2.14218E-02         6.64680E-03        -1.54230E-02         1.34594E+00         6.36955E-01         1.34603E+00         3.08024E+01         1.00000E+00         1.17567E-09         3.08024E+01         1.91251E+00         2.88899E+01
+          2.14218E-02         6.81662E-03        -1.54949E-02         1.34594E+00         6.47625E-01         1.34603E+00         2.94665E+01         1.00000E+00         1.14253E-09         2.94665E+01         1.91715E+00         2.75494E+01
+          2.14218E-02         6.98645E-03        -1.55685E-02         1.34594E+00         6.58296E-01         1.34603E+00         2.81666E+01         1.00000E+00         1.10447E-09         2.81666E+01         1.92098E+00         2.62457E+01
+          2.14218E-02         7.15628E-03        -1.56439E-02         1.34594E+00         6.68966E-01         1.34603E+00         2.69033E+01         1.00000E+00         1.06145E-09         2.69033E+01         1.92396E+00         2.49794E+01
+          2.14218E-02         7.32611E-03        -1.57212E-02         1.34593E+00         6.79637E-01         1.34603E+00         2.56772E+01         1.00000E+00         1.01347E-09         2.56772E+01         1.92611E+00         2.37511E+01
+          2.14218E-02         7.49593E-03        -1.58003E-02         1.34593E+00         6.90307E-01         1.34603E+00         2.44886E+01         1.00000E+00         9.60612E-10         2.44886E+01         1.92740E+00         2.25612E+01
+          2.14218E-02         7.66576E-03        -1.58811E-02         1.34593E+00         7.00978E-01         1.34602E+00         2.33380E+01         1.00000E+00         9.03024E-10         2.33380E+01         1.92783E+00         2.14101E+01
+          2.14218E-02         7.83559E-03        -1.59638E-02         1.34593E+00         7.11649E-01         1.34602E+00         2.22256E+01         1.00000E+00         8.40997E-10         2.22256E+01         1.92740E+00         2.02982E+01
+          2.14218E-02         8.00542E-03        -1.60483E-02         1.34593E+00         7.22319E-01         1.34602E+00         2.11515E+01         1.00000E+00         7.75026E-10         2.11515E+01         1.92611E+00         1.92254E+01
+          2.14218E-02         8.17524E-03        -1.61346E-02         1.34593E+00         7.32990E-01         1.34602E+00         2.01160E+01         1.00000E+00         7.05925E-10         2.01160E+01         1.92395E+00         1.81921E+01
+          2.14218E-02         8.34507E-03        -1.62227E-02         1.34592E+00         7.43660E-01         1.34602E+00         1.91190E+01         1.00000E+00         6.35041E-10         1.91190E+01         1.92093E+00         1.71980E+01
+          2.14218E-02         8.51490E-03        -1.63127E-02         1.34592E+00         7.54331E-01         1.34602E+00         1.81604E+01         1.00000E+00         5.64625E-10         1.81604E+01         1.91705E+00         1.62433E+01
+          2.14218E-02         8.68473E-03        -1.64044E-02         1.34592E+00         7.65001E-01         1.34602E+00         1.72400E+01         1.00000E+00         4.98466E-10         1.72400E+01         1.91231E+00         1.53277E+01
+          2.14218E-02         8.85455E-03        -1.64980E-02         1.34592E+00         7.75672E-01         1.34602E+00         1.63577E+01         1.00000E+00         4.42835E-10         1.63577E+01         1.90672E+00         1.44510E+01
+          2.14218E-02         9.02438E-03        -1.65934E-02         1.34592E+00         7.86343E-01         1.34602E+00         1.55132E+01         1.00000E+00         4.07133E-10         1.55132E+01         1.90030E+00         1.36129E+01
+          2.14218E-02         9.19421E-03        -1.66905E-02         1.34591E+00         7.97013E-01         1.34602E+00         1.47060E+01         1.00000E+00         4.02094E-10         1.47060E+01         1.89304E+00         1.28130E+01
+          2.14218E-02         9.36403E-03        -1.67895E-02         1.34591E+00         8.07684E-01         1.34602E+00         1.39358E+01         1.00000E+00         4.33908E-10         1.39358E+01         1.88496E+00         1.20508E+01
+          2.14218E-02         9.53386E-03        -1.68903E-02         1.34591E+00         8.18354E-01         1.34601E+00         1.32020E+01         1.00000E+00         5.00060E-10         1.32020E+01         1.87607E+00         1.13259E+01
+          2.14218E-02         9.70369E-03        -1.69930E-02         1.34591E+00         8.29025E-01         1.34601E+00         1.25040E+01         1.00000E+00         5.92954E-10         1.25040E+01         1.86639E+00         1.06376E+01
+          2.14218E-02         9.87352E-03        -1.70974E-02         1.34590E+00         8.39695E-01         1.34601E+00         1.18414E+01         1.00000E+00         7.05287E-10         1.18414E+01         1.85593E+00         9.98542E+00
+          2.14218E-02         1.00433E-02        -1.72036E-02         1.34590E+00         8.50366E-01         1.34601E+00         1.12132E+01         1.00000E+00         8.31883E-10         1.12132E+01         1.84471E+00         9.36854E+00
+          2.14218E-02         1.02132E-02        -1.73117E-02         1.34590E+00         8.61037E-01         1.34601E+00         1.06190E+01         1.00000E+00         9.69372E-10         1.06190E+01         1.83274E+00         8.78625E+00
+          2.14218E-02         1.03830E-02        -1.74216E-02         1.34590E+00         8.71707E-01         1.34601E+00         1.00578E+01         1.00000E+00         1.11554E-09         1.00578E+01         1.82005E+00         8.23777E+00
+          2.14218E-02         1.05528E-02        -1.75332E-02         1.34590E+00         8.82378E-01         1.34601E+00         9.52893E+00         1.00000E+00         1.26883E-09         9.52893E+00         1.80666E+00         7.72227E+00
+          2.14218E-02         1.07227E-02        -1.76467E-02         1.34589E+00         8.93048E-01         1.34601E+00         9.03146E+00         1.00000E+00         1.42809E-09         9.03146E+00         1.79259E+00         7.23887E+00
+          2.14218E-02         1.08925E-02        -1.77620E-02         1.34589E+00         9.03719E-01         1.34601E+00         8.56452E+00         1.00000E+00         1.59235E-09         8.56452E+00         1.77786E+00         6.78665E+00
+          2.14218E-02         1.10623E-02        -1.78791E-02         1.34589E+00         9.14389E-01         1.34601E+00         8.12719E+00         1.00000E+00         1.76079E-09         8.12719E+00         1.76250E+00         6.36469E+00
+          2.14218E-02         1.12321E-02        -1.79981E-02         1.34589E+00         9.25060E-01         1.34601E+00         7.71853E+00         1.00000E+00         1.93262E-09         7.71853E+00         1.74653E+00         5.97200E+00
+          2.14218E-02         1.14020E-02        -1.81188E-02         1.34588E+00         9.35731E-01         1.34600E+00         7.33756E+00         1.00000E+00         2.10707E-09         7.33756E+00         1.72997E+00         5.60759E+00
+          2.14218E-02         1.15718E-02        -1.82414E-02         1.34588E+00         9.46401E-01         1.34600E+00         6.98330E+00         1.00000E+00         2.28340E-09         6.98330E+00         1.71286E+00         5.27044E+00
+          2.14218E-02         1.17416E-02        -1.83657E-02         1.34588E+00         9.57072E-01         1.34600E+00         6.65472E+00         1.00000E+00         2.46083E-09         6.65472E+00         1.69521E+00         4.95951E+00
+          2.14218E-02         1.19114E-02        -1.84919E-02         1.34587E+00         9.67742E-01         1.34600E+00         6.35081E+00         1.00000E+00         2.63856E-09         6.35081E+00         1.67707E+00         4.67374E+00
+          2.14218E-02         1.20813E-02        -1.86199E-02         1.34587E+00         9.78413E-01         1.34600E+00         6.07052E+00         1.00000E+00         2.81576E-09         6.07052E+00         1.65845E+00         4.41207E+00
+          2.14218E-02         1.22511E-02        -1.87497E-02         1.34587E+00         9.89083E-01         1.34600E+00         5.81282E+00         1.00000E+00         2.99157E-09         5.81282E+00         1.63938E+00         4.17343E+00
+          2.14218E-02         1.24209E-02        -1.88813E-02         1.34587E+00         9.99754E-01         1.34600E+00         5.57664E+00         1.00000E+00         3.16510E-09         5.57664E+00         1.61990E+00         3.95674E+00
+          2.14218E-02         1.25908E-02        -1.90147E-02         1.34586E+00         1.01042E+00         1.34600E+00         5.36095E+00         1.00000E+00         3.33541E-09         5.36095E+00         1.60004E+00         3.76091E+00
+          2.14218E-02         1.27606E-02        -1.91500E-02         1.34586E+00         1.02110E+00         1.34600E+00         5.16469E+00         1.00000E+00         3.50153E-09         5.16469E+00         1.57982E+00         3.58487E+00
+          2.14218E-02         1.29304E-02        -1.92870E-02         1.34586E+00         1.03177E+00         1.34600E+00         4.98681E+00         1.00000E+00         3.66245E-09         4.98681E+00         1.55927E+00         3.42755E+00
+          2.14218E-02         1.31002E-02        -1.94259E-02         1.34585E+00         1.04244E+00         1.34599E+00         4.82629E+00         1.00000E+00         3.81714E-09         4.82629E+00         1.53842E+00         3.28787E+00
+          2.14218E-02         1.32701E-02        -1.95666E-02         1.34585E+00         1.05311E+00         1.34599E+00         4.68208E+00         1.00000E+00         3.96452E-09         4.68208E+00         1.51730E+00         3.16477E+00
+          2.14218E-02         1.34399E-02        -1.97090E-02         1.34585E+00         1.06378E+00         1.34599E+00         4.55317E+00         1.00000E+00         4.10348E-09         4.55317E+00         1.49595E+00         3.05722E+00
+          2.14218E-02         1.36097E-02        -1.98533E-02         1.34585E+00         1.07445E+00         1.34599E+00         4.43857E+00         1.00000E+00         4.23291E-09         4.43857E+00         1.47439E+00         2.96418E+00
+          2.14218E-02         1.37795E-02        -1.99994E-02         1.34584E+00         1.08512E+00         1.34599E+00         4.33728E+00         1.00000E+00         4.35164E-09         4.33728E+00         1.45265E+00         2.88462E+00
+          2.14218E-02         1.39494E-02        -2.01474E-02         1.34584E+00         1.09579E+00         1.34599E+00         4.24833E+00         1.00000E+00         4.45852E-09         4.24833E+00         1.43076E+00         2.81757E+00
+          2.14218E-02         1.41192E-02        -2.02971E-02         1.34584E+00         1.10646E+00         1.34599E+00         4.17080E+00         1.00000E+00         4.55236E-09         4.17080E+00         1.40875E+00         2.76205E+00
+          2.14218E-02         1.42890E-02        -2.04486E-02         1.34583E+00         1.11713E+00         1.34599E+00         4.10374E+00         1.00000E+00         4.63198E-09         4.10374E+00         1.38665E+00         2.71709E+00
+          2.14218E-02         1.44589E-02        -2.06020E-02         1.34583E+00         1.12780E+00         1.34599E+00         4.04627E+00         1.00000E+00         4.69618E-09         4.04627E+00         1.36448E+00         2.68179E+00
+          2.14218E-02         1.46287E-02        -2.07572E-02         1.34583E+00         1.13847E+00         1.34599E+00         3.99750E+00         1.00000E+00         4.74378E-09         3.99750E+00         1.34227E+00         2.65523E+00
+          2.14218E-02         1.47985E-02        -2.09142E-02         1.34582E+00         1.14914E+00         1.34599E+00         3.95660E+00         1.00000E+00         4.77363E-09         3.95660E+00         1.32005E+00         2.63656E+00
+          2.14218E-02         1.49683E-02        -2.10730E-02         1.34582E+00         1.15981E+00         1.34598E+00         3.92276E+00         1.00000E+00         4.78458E-09         3.92276E+00         1.29784E+00         2.62492E+00
+          2.14218E-02         1.51382E-02        -2.12336E-02         1.34582E+00         1.17048E+00         1.34598E+00         3.89517E+00         1.00000E+00         4.77552E-09         3.89517E+00         1.27567E+00         2.61950E+00
+          2.14218E-02         1.53080E-02        -2.13960E-02         1.34581E+00         1.18115E+00         1.34598E+00         3.87310E+00         1.00000E+00         4.74539E-09         3.87310E+00         1.25356E+00         2.61954E+00
+          2.14218E-02         1.54778E-02        -2.15602E-02         1.34581E+00         1.19182E+00         1.34598E+00         3.85581E+00         1.00000E+00         4.69320E-09         3.85581E+00         1.23154E+00         2.62427E+00
+          2.14218E-02         1.56476E-02        -2.17263E-02         1.34581E+00         1.20249E+00         1.34598E+00         3.84261E+00         1.00000E+00         4.61803E-09         3.84261E+00         1.20962E+00         2.63299E+00
+          2.14218E-02         1.58175E-02        -2.18941E-02         1.34580E+00         1.21317E+00         1.34598E+00         3.83286E+00         1.00000E+00         4.51905E-09         3.83286E+00         1.18783E+00         2.64503E+00
+          2.14218E-02         1.59873E-02        -2.20638E-02         1.34580E+00         1.22384E+00         1.34598E+00         3.82592E+00         1.00000E+00         4.39559E-09         3.82592E+00         1.16620E+00         2.65972E+00
+          2.14218E-02         1.61571E-02        -2.22353E-02         1.34579E+00         1.23451E+00         1.34598E+00         3.82121E+00         1.00000E+00         4.24712E-09         3.82121E+00         1.14473E+00         2.67648E+00
+          2.14218E-02         1.63270E-02        -2.24086E-02         1.34579E+00         1.24518E+00         1.34598E+00         3.81816E+00         1.00000E+00         4.07334E-09         3.81816E+00         1.12345E+00         2.69472E+00
+          2.14218E-02         1.64968E-02        -2.25837E-02         1.34579E+00         1.25585E+00         1.34598E+00         3.81627E+00         1.00000E+00         3.87425E-09         3.81627E+00         1.10237E+00         2.71390E+00
+          2.14218E-02         1.66666E-02        -2.27606E-02         1.34578E+00         1.26652E+00         1.34598E+00         3.81504E+00         1.00000E+00         3.65028E-09         3.81504E+00         1.08151E+00         2.73353E+00
+          2.14218E-02         1.68364E-02        -2.29393E-02         1.34578E+00         1.27719E+00         1.34597E+00         3.81402E+00         1.00000E+00         3.40246E-09         3.81402E+00         1.06089E+00         2.75313E+00
+          2.14218E-02         1.70063E-02        -2.31199E-02         1.34578E+00         1.28786E+00         1.34597E+00         3.81280E+00         1.00000E+00         3.13278E-09         3.81280E+00         1.04052E+00         2.77228E+00
+          2.14218E-02         1.71761E-02        -2.33022E-02         1.34577E+00         1.29853E+00         1.34597E+00         3.81099E+00         1.00000E+00         2.84471E-09         3.81099E+00         1.02041E+00         2.79058E+00
+          2.14218E-02         1.73459E-02        -2.34864E-02         1.34577E+00         1.30920E+00         1.34597E+00         3.80825E+00         1.00000E+00         2.54434E-09         3.80825E+00         1.00057E+00         2.80767E+00
+          2.14218E-02         1.75158E-02        -2.36724E-02         1.34576E+00         1.31987E+00         1.34597E+00         3.80425E+00         1.00000E+00         2.24226E-09         3.80425E+00         9.81025E-01         2.82322E+00
+          2.14218E-02         1.76856E-02        -2.38602E-02         1.34576E+00         1.33054E+00         1.34597E+00         3.79871E+00         1.00000E+00         1.95729E-09         3.79871E+00         9.61771E-01         2.83694E+00
+          2.14218E-02         1.78554E-02        -2.40498E-02         1.34576E+00         1.34121E+00         1.34597E+00         3.79139E+00         1.00000E+00         1.72216E-09         3.79139E+00         9.42820E-01         2.84857E+00
+          2.14218E-02         1.80252E-02        -2.42412E-02         1.34575E+00         1.35188E+00         1.34597E+00         3.78205E+00         1.00000E+00         1.58749E-09         3.78205E+00         9.24180E-01         2.85787E+00
+          2.14218E-02         1.81951E-02        -2.44344E-02         1.34575E+00         1.36255E+00         1.34597E+00         3.77052E+00         1.00000E+00         1.60814E-09         3.77052E+00         9.05857E-01         2.86466E+00
+          2.14218E-02         1.83649E-02        -2.46295E-02         1.34574E+00         1.37322E+00         1.34597E+00         3.75662E+00         1.00000E+00         1.80535E-09         3.75662E+00         8.87857E-01         2.86876E+00
+          2.14218E-02         1.85347E-02        -2.48263E-02         1.34574E+00         1.38389E+00         1.34597E+00         3.74023E+00         1.00000E+00         2.15340E-09         3.74023E+00         8.70183E-01         2.87005E+00
+          2.14218E-02         1.87045E-02        -2.50250E-02         1.34573E+00         1.39457E+00         1.34597E+00         3.72124E+00         1.00000E+00         2.61105E-09         3.72124E+00         8.52840E-01         2.86840E+00
+          2.14218E-02         1.88744E-02        -2.52255E-02         1.34573E+00         1.40524E+00         1.34597E+00         3.69957E+00         1.00000E+00         3.14597E-09         3.69957E+00         8.35829E-01         2.86374E+00
+          2.14218E-02         1.90442E-02        -2.54278E-02         1.34573E+00         1.41591E+00         1.34597E+00         3.67517E+00         1.00000E+00         3.73756E-09         3.67517E+00         8.19152E-01         2.85602E+00
+          2.14218E-02         1.92140E-02        -2.56319E-02         1.34572E+00         1.42658E+00         1.34597E+00         3.64802E+00         1.00000E+00         4.37291E-09         3.64802E+00         8.02810E-01         2.84521E+00
+          2.14218E-02         1.93839E-02        -2.58378E-02         1.34572E+00         1.43725E+00         1.34597E+00         3.61810E+00         1.00000E+00         5.04352E-09         3.61810E+00         7.86801E-01         2.83129E+00
+          2.14218E-02         1.95537E-02        -2.60456E-02         1.34571E+00         1.44792E+00         1.34596E+00         3.58543E+00         1.00000E+00         5.74323E-09         3.58543E+00         7.71124E-01         2.81430E+00
+          2.14218E-02         1.97235E-02        -2.62551E-02         1.34571E+00         1.45859E+00         1.34596E+00         3.55005E+00         1.00000E+00         6.46718E-09         3.55005E+00         7.55778E-01         2.79427E+00
+          2.14218E-02         1.98933E-02        -2.64665E-02         1.34570E+00         1.46926E+00         1.34596E+00         3.51202E+00         1.00000E+00         7.21119E-09         3.51202E+00         7.40760E-01         2.77126E+00
+          2.14218E-02         2.00632E-02        -2.66796E-02         1.34570E+00         1.47993E+00         1.34596E+00         3.47141E+00         1.00000E+00         7.97141E-09         3.47141E+00         7.26065E-01         2.74534E+00
+          2.14218E-02         2.02330E-02        -2.68946E-02         1.34569E+00         1.49060E+00         1.34596E+00         3.42831E+00         1.00000E+00         8.74413E-09         3.42831E+00         7.11690E-01         2.71662E+00
+          2.14218E-02         2.04028E-02        -2.71114E-02         1.34569E+00         1.50127E+00         1.34596E+00         3.38283E+00         1.00000E+00         9.52569E-09         3.38283E+00         6.97630E-01         2.68520E+00
+          2.14218E-02         2.05726E-02        -2.73300E-02         1.34569E+00         1.51194E+00         1.34596E+00         3.33510E+00         1.00000E+00         1.03124E-08         3.33510E+00         6.83879E-01         2.65122E+00
+          2.14218E-02         2.07425E-02        -2.75505E-02         1.34568E+00         1.52261E+00         1.34596E+00         3.28525E+00         1.00000E+00         1.11003E-08         3.28525E+00         6.70432E-01         2.61482E+00
+          2.14218E-02         2.09123E-02        -2.77727E-02         1.34568E+00         1.53328E+00         1.34596E+00         3.23342E+00         1.00000E+00         1.18857E-08         3.23342E+00         6.57281E-01         2.57614E+00
+          2.14218E-02         2.10821E-02        -2.79967E-02         1.34567E+00         1.54395E+00         1.34596E+00         3.17978E+00         1.00000E+00         1.26644E-08         3.17978E+00         6.44420E-01         2.53536E+00
+          2.14218E-02         2.12520E-02        -2.82226E-02         1.34567E+00         1.55462E+00         1.34596E+00         3.12448E+00         1.00000E+00         1.34324E-08         3.12448E+00         6.31841E-01         2.49264E+00
+          2.14218E-02         2.14218E-02        -2.84503E-02         1.34566E+00         1.56529E+00         1.34596E+00         3.06771E+00         1.00000E+00         1.41852E-08         3.06771E+00         6.19536E-01         2.44817E+00
+          2.14218E-02         2.15916E-02        -2.86798E-02         1.34566E+00         1.57596E+00         1.34596E+00         3.00964E+00         1.00000E+00         1.49186E-08         3.00964E+00         6.07498E-01         2.40215E+00
+          2.14218E-02         2.17614E-02        -2.89111E-02         1.34565E+00         1.58664E+00         1.34596E+00         2.95047E+00         1.00000E+00         1.56278E-08         2.95047E+00         5.95718E-01         2.35475E+00
+          2.14218E-02         2.19313E-02        -2.91442E-02         1.34565E+00         1.59731E+00         1.34596E+00         2.89038E+00         1.00000E+00         1.63085E-08         2.89038E+00         5.84188E-01         2.30620E+00
+          2.14218E-02         2.21011E-02        -2.93791E-02         1.34564E+00         1.60798E+00         1.34596E+00         2.82957E+00         1.00000E+00         1.69557E-08         2.82957E+00         5.72899E-01         2.25668E+00
+          2.14218E-02         2.22709E-02        -2.96159E-02         1.34564E+00         1.61865E+00         1.34596E+00         2.76824E+00         1.00000E+00         1.75647E-08         2.76824E+00         5.61842E-01         2.20640E+00
+          2.14218E-02         2.24407E-02        -2.98544E-02         1.34563E+00         1.62932E+00         1.34596E+00         2.70658E+00         1.00000E+00         1.81306E-08         2.70658E+00         5.51008E-01         2.15557E+00
+          2.14218E-02         2.26106E-02        -3.00948E-02         1.34563E+00         1.63999E+00         1.34596E+00         2.64479E+00         1.00000E+00         1.86487E-08         2.64479E+00         5.40388E-01         2.10440E+00
+          2.14218E-02         2.27804E-02        -3.03370E-02         1.34562E+00         1.65066E+00         1.34596E+00         2.58307E+00         1.00000E+00         1.91138E-08         2.58307E+00         5.29973E-01         2.05309E+00
+          2.14218E-02         2.29502E-02        -3.05810E-02         1.34562E+00         1.66133E+00         1.34596E+00         2.52161E+00         1.00000E+00         1.95213E-08         2.52161E+00         5.19755E-01         2.00185E+00
+          2.14218E-02         2.31201E-02        -3.08268E-02         1.34561E+00         1.67200E+00         1.34596E+00         2.46060E+00         1.00000E+00         1.98662E-08         2.46060E+00         5.09725E-01         1.95087E+00
+          2.14218E-02         2.32899E-02        -3.10744E-02         1.34561E+00         1.68267E+00         1.34596E+00         2.40023E+00         1.00000E+00         2.01438E-08         2.40023E+00         4.99873E-01         1.90035E+00
+          2.14218E-02         2.34597E-02        -3.13238E-02         1.34560E+00         1.69334E+00         1.34596E+00         2.34068E+00         1.00000E+00         2.03493E-08         2.34068E+00         4.90192E-01         1.85049E+00
+          2.14218E-02         2.36295E-02        -3.15751E-02         1.34559E+00         1.70401E+00         1.34596E+00         2.28213E+00         1.00000E+00         2.04783E-08         2.28213E+00         4.80673E-01         1.80146E+00
+          2.14218E-02         2.37994E-02        -3.18281E-02         1.34559E+00         1.71468E+00         1.34597E+00         2.22475E+00         1.00000E+00         2.05264E-08         2.22475E+00         4.71307E-01         1.75345E+00
+          2.14218E-02         2.39692E-02        -3.20830E-02         1.34558E+00         1.72535E+00         1.34597E+00         2.16871E+00         1.00000E+00         2.04894E-08         2.16871E+00         4.62087E-01         1.70662E+00
+          2.14218E-02         2.41390E-02        -3.23397E-02         1.34558E+00         1.73602E+00         1.34597E+00         2.11416E+00         1.00000E+00         2.03634E-08         2.11416E+00         4.53006E-01         1.66115E+00
+          2.14218E-02         2.43088E-02        -3.25982E-02         1.34557E+00         1.74669E+00         1.34597E+00         2.06124E+00         1.00000E+00         2.01449E-08         2.06124E+00         4.44056E-01         1.61718E+00
+          2.14218E-02         2.44787E-02        -3.28585E-02         1.34557E+00         1.75736E+00         1.34597E+00         2.01009E+00         1.00000E+00         1.98305E-08         2.01009E+00         4.35229E-01         1.57486E+00
+          2.14218E-02         2.46485E-02        -3.31206E-02         1.34556E+00         1.76804E+00         1.34597E+00         1.96086E+00         1.00000E+00         1.94175E-08         1.96086E+00         4.26519E-01         1.53434E+00
+          2.14218E-02         2.48183E-02        -3.33846E-02         1.34556E+00         1.77871E+00         1.34597E+00         1.91364E+00         1.00000E+00         1.89037E-08         1.91364E+00         4.17921E-01         1.49572E+00
+          2.14218E-02         2.49882E-02        -3.36503E-02         1.34555E+00         1.78938E+00         1.34597E+00         1.86856E+00         1.00000E+00         1.82873E-08         1.86856E+00         4.09427E-01         1.45913E+00
+          2.14218E-02         2.51580E-02        -3.39179E-02         1.34554E+00         1.80005E+00         1.34597E+00         1.82571E+00         1.00000E+00         1.75676E-08         1.82571E+00         4.01032E-01         1.42468E+00
+          2.14218E-02         2.53278E-02        -3.41873E-02         1.34554E+00         1.81072E+00         1.34597E+00         1.78518E+00         1.00000E+00         1.67447E-08         1.78518E+00         3.92731E-01         1.39245E+00
+          2.14218E-02         2.54976E-02        -3.44585E-02         1.34553E+00         1.82139E+00         1.34597E+00         1.74705E+00         1.00000E+00         1.58201E-08         1.74705E+00         3.84519E-01         1.36253E+00
+          2.14218E-02         2.56675E-02        -3.47315E-02         1.34553E+00         1.83206E+00         1.34597E+00         1.71137E+00         1.00000E+00         1.47969E-08         1.71137E+00         3.76391E-01         1.33498E+00
+          2.14218E-02         2.58373E-02        -3.50063E-02         1.34552E+00         1.84273E+00         1.34598E+00         1.67822E+00         1.00000E+00         1.36812E-08         1.67822E+00         3.68344E-01         1.30988E+00
+          2.14218E-02         2.60071E-02        -3.52829E-02         1.34551E+00         1.85340E+00         1.34598E+00         1.64762E+00         1.00000E+00         1.24829E-08         1.64762E+00         3.60374E-01         1.28725E+00
+          2.14218E-02         2.61769E-02        -3.55614E-02         1.34551E+00         1.86407E+00         1.34598E+00         1.61962E+00         1.00000E+00         1.12182E-08         1.61962E+00         3.52478E-01         1.26714E+00
+          2.15916E-02         8.72665E-04        -1.42889E-02         1.35664E+00         2.74155E-01         1.35672E+00         8.51519E+01         1.00000E+00         4.33266E-10         8.51519E+01         1.66858E+00         8.34833E+01
+          2.15916E-02         1.04249E-03        -1.42991E-02         1.35664E+00         2.84826E-01         1.35672E+00         8.36253E+01         1.00000E+00         4.63488E-10         8.36253E+01         1.67377E+00         8.19515E+01
+          2.15916E-02         1.21232E-03        -1.43111E-02         1.35664E+00         2.95496E-01         1.35672E+00         8.20671E+01         1.00000E+00         4.93605E-10         8.20671E+01         1.67901E+00         8.03881E+01
+          2.15916E-02         1.38215E-03        -1.43249E-02         1.35664E+00         3.06167E-01         1.35672E+00         8.04797E+01         1.00000E+00         5.23489E-10         8.04797E+01         1.68427E+00         7.87955E+01
+          2.15916E-02         1.55197E-03        -1.43406E-02         1.35664E+00         3.16838E-01         1.35671E+00         7.88659E+01         1.00000E+00         5.53014E-10         7.88659E+01         1.68955E+00         7.71763E+01
+          2.15916E-02         1.72180E-03        -1.43581E-02         1.35664E+00         3.27508E-01         1.35671E+00         7.72280E+01         1.00000E+00         5.82052E-10         7.72280E+01         1.69483E+00         7.55332E+01
+          2.15916E-02         1.89163E-03        -1.43773E-02         1.35664E+00         3.38179E-01         1.35671E+00         7.55689E+01         1.00000E+00         6.10477E-10         7.55689E+01         1.70009E+00         7.38688E+01
+          2.15916E-02         2.06146E-03        -1.43984E-02         1.35664E+00         3.48849E-01         1.35671E+00         7.38910E+01         1.00000E+00         6.38163E-10         7.38910E+01         1.70532E+00         7.21857E+01
+          2.15916E-02         2.23128E-03        -1.44213E-02         1.35664E+00         3.59520E-01         1.35671E+00         7.21969E+01         1.00000E+00         6.64982E-10         7.21969E+01         1.71050E+00         7.04864E+01
+          2.15916E-02         2.40111E-03        -1.44460E-02         1.35664E+00         3.70190E-01         1.35671E+00         7.04893E+01         1.00000E+00         6.90810E-10         7.04893E+01         1.71561E+00         6.87737E+01
+          2.15916E-02         2.57094E-03        -1.44725E-02         1.35664E+00         3.80861E-01         1.35671E+00         6.87707E+01         1.00000E+00         7.15520E-10         6.87707E+01         1.72064E+00         6.70501E+01
+          2.15916E-02         2.74077E-03        -1.45009E-02         1.35664E+00         3.91532E-01         1.35671E+00         6.70436E+01         1.00000E+00         7.38987E-10         6.70436E+01         1.72557E+00         6.53181E+01
+          2.15916E-02         2.91059E-03        -1.45310E-02         1.35664E+00         4.02202E-01         1.35671E+00         6.53106E+01         1.00000E+00         7.61086E-10         6.53106E+01         1.73038E+00         6.35803E+01
+          2.15916E-02         3.08042E-03        -1.45630E-02         1.35663E+00         4.12873E-01         1.35671E+00         6.35742E+01         1.00000E+00         7.81693E-10         6.35742E+01         1.73507E+00         6.18391E+01
+          2.15916E-02         3.25025E-03        -1.45967E-02         1.35663E+00         4.23543E-01         1.35671E+00         6.18368E+01         1.00000E+00         8.00685E-10         6.18368E+01         1.73960E+00         6.00972E+01
+          2.15916E-02         3.42008E-03        -1.46323E-02         1.35663E+00         4.34214E-01         1.35671E+00         6.01007E+01         1.00000E+00         8.17937E-10         6.01007E+01         1.74398E+00         5.83567E+01
+          2.15916E-02         3.58990E-03        -1.46697E-02         1.35663E+00         4.44884E-01         1.35671E+00         5.83684E+01         1.00000E+00         8.33327E-10         5.83684E+01         1.74817E+00         5.66202E+01
+          2.15916E-02         3.75973E-03        -1.47089E-02         1.35663E+00         4.55555E-01         1.35671E+00         5.66422E+01         1.00000E+00         8.46733E-10         5.66422E+01         1.75217E+00         5.48900E+01
+          2.15916E-02         3.92956E-03        -1.47499E-02         1.35663E+00         4.66225E-01         1.35671E+00         5.49242E+01         1.00000E+00         8.58034E-10         5.49242E+01         1.75597E+00         5.31683E+01
+          2.15916E-02         4.09939E-03        -1.47928E-02         1.35663E+00         4.76896E-01         1.35671E+00         5.32167E+01         1.00000E+00         8.67110E-10         5.32167E+01         1.75953E+00         5.14572E+01
+          2.15916E-02         4.26921E-03        -1.48374E-02         1.35663E+00         4.87567E-01         1.35671E+00         5.15218E+01         1.00000E+00         8.73843E-10         5.15218E+01         1.76286E+00         4.97590E+01
+          2.15916E-02         4.43904E-03        -1.48839E-02         1.35663E+00         4.98237E-01         1.35671E+00         4.98416E+01         1.00000E+00         8.78114E-10         4.98416E+01         1.76593E+00         4.80756E+01
+          2.15916E-02         4.60887E-03        -1.49321E-02         1.35663E+00         5.08908E-01         1.35671E+00         4.81779E+01         1.00000E+00         8.79808E-10         4.81779E+01         1.76874E+00         4.64091E+01
+          2.15916E-02         4.77869E-03        -1.49822E-02         1.35663E+00         5.19578E-01         1.35671E+00         4.65326E+01         1.00000E+00         8.78811E-10         4.65326E+01         1.77127E+00         4.47614E+01
+          2.15916E-02         4.94852E-03        -1.50341E-02         1.35662E+00         5.30249E-01         1.35671E+00         4.49077E+01         1.00000E+00         8.75013E-10         4.49077E+01         1.77350E+00         4.31342E+01
+          2.15916E-02         5.11835E-03        -1.50878E-02         1.35662E+00         5.40919E-01         1.35671E+00         4.33048E+01         1.00000E+00         8.68304E-10         4.33048E+01         1.77542E+00         4.15294E+01
+          2.15916E-02         5.28818E-03        -1.51433E-02         1.35662E+00         5.51590E-01         1.35671E+00         4.17255E+01         1.00000E+00         8.58581E-10         4.17255E+01         1.77702E+00         3.99485E+01
+          2.15916E-02         5.45800E-03        -1.52006E-02         1.35662E+00         5.62261E-01         1.35671E+00         4.01715E+01         1.00000E+00         8.45742E-10         4.01715E+01         1.77829E+00         3.83932E+01
+          2.15916E-02         5.62783E-03        -1.52597E-02         1.35662E+00         5.72931E-01         1.35671E+00         3.86441E+01         1.00000E+00         8.29692E-10         3.86441E+01         1.77922E+00         3.68649E+01
+          2.15916E-02         5.79766E-03        -1.53207E-02         1.35662E+00         5.83602E-01         1.35670E+00         3.71448E+01         1.00000E+00         8.10343E-10         3.71448E+01         1.77979E+00         3.53650E+01
+          2.15916E-02         5.96749E-03        -1.53834E-02         1.35662E+00         5.94272E-01         1.35670E+00         3.56748E+01         1.00000E+00         7.87614E-10         3.56748E+01         1.78000E+00         3.38948E+01
+          2.15916E-02         6.13731E-03        -1.54480E-02         1.35662E+00         6.04943E-01         1.35670E+00         3.42354E+01         1.00000E+00         7.61434E-10         3.42354E+01         1.77984E+00         3.24555E+01
+          2.15916E-02         6.30714E-03        -1.55144E-02         1.35661E+00         6.15613E-01         1.35670E+00         3.28275E+01         1.00000E+00         7.31745E-10         3.28275E+01         1.77929E+00         3.10482E+01
+          2.15916E-02         6.47697E-03        -1.55826E-02         1.35661E+00         6.26284E-01         1.35670E+00         3.14523E+01         1.00000E+00         6.98506E-10         3.14523E+01         1.77836E+00         2.96739E+01
+          2.15916E-02         6.64680E-03        -1.56526E-02         1.35661E+00         6.36955E-01         1.35670E+00         3.01106E+01         1.00000E+00         6.61700E-10         3.01106E+01         1.77702E+00         2.83336E+01
+          2.15916E-02         6.81662E-03        -1.57244E-02         1.35661E+00         6.47625E-01         1.35670E+00         2.88033E+01         1.00000E+00         6.21337E-10         2.88033E+01         1.77528E+00         2.70280E+01
+          2.15916E-02         6.98645E-03        -1.57980E-02         1.35661E+00         6.58296E-01         1.35670E+00         2.75310E+01         1.00000E+00         5.77476E-10         2.75310E+01         1.77313E+00         2.57579E+01
+          2.15916E-02         7.15628E-03        -1.58735E-02         1.35661E+00         6.68966E-01         1.35670E+00         2.62944E+01         1.00000E+00         5.30242E-10         2.62944E+01         1.77056E+00         2.45238E+01
+          2.15916E-02         7.32611E-03        -1.59507E-02         1.35660E+00         6.79637E-01         1.35670E+00         2.50940E+01         1.00000E+00         4.79869E-10         2.50940E+01         1.76757E+00         2.33265E+01
+          2.15916E-02         7.49593E-03        -1.60298E-02         1.35660E+00         6.90307E-01         1.35670E+00         2.39304E+01         1.00000E+00         4.26777E-10         2.39304E+01         1.76415E+00         2.21662E+01
+          2.15916E-02         7.66576E-03        -1.61107E-02         1.35660E+00         7.00978E-01         1.35670E+00         2.28037E+01         1.00000E+00         3.71727E-10         2.28037E+01         1.76030E+00         2.10434E+01
+          2.15916E-02         7.83559E-03        -1.61933E-02         1.35660E+00         7.11649E-01         1.35670E+00         2.17144E+01         1.00000E+00         3.16149E-10         2.17144E+01         1.75601E+00         1.99584E+01
+          2.15916E-02         8.00542E-03        -1.62778E-02         1.35660E+00         7.22319E-01         1.35669E+00         2.06625E+01         1.00000E+00         2.62881E-10         2.06625E+01         1.75130E+00         1.89112E+01
+          2.15916E-02         8.17524E-03        -1.63642E-02         1.35660E+00         7.32990E-01         1.35669E+00         1.96482E+01         1.00000E+00         2.17742E-10         1.96482E+01         1.74614E+00         1.79021E+01
+          2.15916E-02         8.34507E-03        -1.64523E-02         1.35659E+00         7.43660E-01         1.35669E+00         1.86716E+01         1.00000E+00         1.91612E-10         1.86716E+01         1.74055E+00         1.69310E+01
+          2.15916E-02         8.51490E-03        -1.65422E-02         1.35659E+00         7.54331E-01         1.35669E+00         1.77324E+01         1.00000E+00         1.97332E-10         1.77324E+01         1.73452E+00         1.59979E+01
+          2.15916E-02         8.68473E-03        -1.66340E-02         1.35659E+00         7.65001E-01         1.35669E+00         1.68306E+01         1.00000E+00         2.36771E-10         1.68306E+01         1.72805E+00         1.51026E+01
+          2.15916E-02         8.85455E-03        -1.67275E-02         1.35659E+00         7.75672E-01         1.35669E+00         1.59660E+01         1.00000E+00         3.00138E-10         1.59660E+01         1.72115E+00         1.42449E+01
+          2.15916E-02         9.02438E-03        -1.68229E-02         1.35659E+00         7.86343E-01         1.35669E+00         1.51383E+01         1.00000E+00         3.78173E-10         1.51383E+01         1.71382E+00         1.34245E+01
+          2.15916E-02         9.19421E-03        -1.69201E-02         1.35658E+00         7.97013E-01         1.35669E+00         1.43472E+01         1.00000E+00         4.65662E-10         1.43472E+01         1.70606E+00         1.26411E+01
+          2.15916E-02         9.36403E-03        -1.70191E-02         1.35658E+00         8.07684E-01         1.35669E+00         1.35921E+01         1.00000E+00         5.59898E-10         1.35921E+01         1.69787E+00         1.18943E+01
+          2.15916E-02         9.53386E-03        -1.71199E-02         1.35658E+00         8.18354E-01         1.35669E+00         1.28727E+01         1.00000E+00         6.59377E-10         1.28727E+01         1.68925E+00         1.11835E+01
+          2.15916E-02         9.70369E-03        -1.72225E-02         1.35658E+00         8.29025E-01         1.35669E+00         1.21884E+01         1.00000E+00         7.63159E-10         1.21884E+01         1.68022E+00         1.05082E+01
+          2.15916E-02         9.87352E-03        -1.73269E-02         1.35657E+00         8.39695E-01         1.35669E+00         1.15386E+01         1.00000E+00         8.70575E-10         1.15386E+01         1.67078E+00         9.86781E+00
+          2.15916E-02         1.00433E-02        -1.74332E-02         1.35657E+00         8.50366E-01         1.35668E+00         1.09226E+01         1.00000E+00         9.81091E-10         1.09226E+01         1.66094E+00         9.26168E+00
+          2.15916E-02         1.02132E-02        -1.75412E-02         1.35657E+00         8.61037E-01         1.35668E+00         1.03398E+01         1.00000E+00         1.09423E-09         1.03398E+01         1.65069E+00         8.68910E+00
+          2.15916E-02         1.03830E-02        -1.76511E-02         1.35657E+00         8.71707E-01         1.35668E+00         9.78937E+00         1.00000E+00         1.20956E-09         9.78937E+00         1.64006E+00         8.14931E+00
+          2.15916E-02         1.05528E-02        -1.77628E-02         1.35657E+00         8.82378E-01         1.35668E+00         9.27056E+00         1.00000E+00         1.32662E-09         9.27056E+00         1.62904E+00         7.64152E+00
+          2.15916E-02         1.07227E-02        -1.78763E-02         1.35656E+00         8.93048E-01         1.35668E+00         8.78255E+00         1.00000E+00         1.44497E-09         8.78255E+00         1.61765E+00         7.16490E+00
+          2.15916E-02         1.08925E-02        -1.79916E-02         1.35656E+00         9.03719E-01         1.35668E+00         8.32448E+00         1.00000E+00         1.56413E-09         8.32448E+00         1.60589E+00         6.71859E+00
+          2.15916E-02         1.10623E-02        -1.81087E-02         1.35656E+00         9.14389E-01         1.35668E+00         7.89545E+00         1.00000E+00         1.68363E-09         7.89545E+00         1.59377E+00         6.30167E+00
+          2.15916E-02         1.12321E-02        -1.82276E-02         1.35656E+00         9.25060E-01         1.35668E+00         7.49455E+00         1.00000E+00         1.80294E-09         7.49455E+00         1.58131E+00         5.91323E+00
+          2.15916E-02         1.14020E-02        -1.83483E-02         1.35655E+00         9.35731E-01         1.35668E+00         7.12083E+00         1.00000E+00         1.92154E-09         7.12083E+00         1.56852E+00         5.55231E+00
+          2.15916E-02         1.15718E-02        -1.84709E-02         1.35655E+00         9.46401E-01         1.35668E+00         6.77333E+00         1.00000E+00         2.03884E-09         6.77333E+00         1.55540E+00         5.21793E+00
+          2.15916E-02         1.17416E-02        -1.85953E-02         1.35655E+00         9.57072E-01         1.35667E+00         6.45107E+00         1.00000E+00         2.15427E-09         6.45107E+00         1.54196E+00         4.90911E+00
+          2.15916E-02         1.19114E-02        -1.87214E-02         1.35654E+00         9.67742E-01         1.35667E+00         6.15306E+00         1.00000E+00         2.26719E-09         6.15306E+00         1.52822E+00         4.62483E+00
+          2.15916E-02         1.20813E-02        -1.88494E-02         1.35654E+00         9.78413E-01         1.35667E+00         5.87828E+00         1.00000E+00         2.37696E-09         5.87828E+00         1.51420E+00         4.36408E+00
+          2.15916E-02         1.22511E-02        -1.89792E-02         1.35654E+00         9.89083E-01         1.35667E+00         5.62572E+00         1.00000E+00         2.48290E-09         5.62572E+00         1.49989E+00         4.12582E+00
+          2.15916E-02         1.24209E-02        -1.91108E-02         1.35654E+00         9.99754E-01         1.35667E+00         5.39436E+00         1.00000E+00         2.58431E-09         5.39436E+00         1.48532E+00         3.90903E+00
+          2.15916E-02         1.25908E-02        -1.92443E-02         1.35653E+00         1.01042E+00         1.35667E+00         5.18317E+00         1.00000E+00         2.68046E-09         5.18317E+00         1.47050E+00         3.71267E+00
+          2.15916E-02         1.27606E-02        -1.93795E-02         1.35653E+00         1.02110E+00         1.35667E+00         4.99115E+00         1.00000E+00         2.77062E-09         4.99115E+00         1.45544E+00         3.53571E+00
+          2.15916E-02         1.29304E-02        -1.95165E-02         1.35653E+00         1.03177E+00         1.35667E+00         4.81726E+00         1.00000E+00         2.85401E-09         4.81726E+00         1.44016E+00         3.37711E+00
+          2.15916E-02         1.31002E-02        -1.96554E-02         1.35652E+00         1.04244E+00         1.35667E+00         4.66050E+00         1.00000E+00         2.92984E-09         4.66050E+00         1.42465E+00         3.23585E+00
+          2.15916E-02         1.32701E-02        -1.97961E-02         1.35652E+00         1.05311E+00         1.35667E+00         4.51987E+00         1.00000E+00         2.99733E-09         4.51987E+00         1.40895E+00         3.11091E+00
+          2.15916E-02         1.34399E-02        -1.99386E-02         1.35652E+00         1.06378E+00         1.35666E+00         4.39437E+00         1.00000E+00         3.05566E-09         4.39437E+00         1.39307E+00         3.00130E+00
+          2.15916E-02         1.36097E-02        -2.00829E-02         1.35652E+00         1.07445E+00         1.35666E+00         4.28302E+00         1.00000E+00         3.10401E-09         4.28302E+00         1.37701E+00         2.90601E+00
+          2.15916E-02         1.37795E-02        -2.02290E-02         1.35651E+00         1.08512E+00         1.35666E+00         4.18487E+00         1.00000E+00         3.14156E-09         4.18487E+00         1.36079E+00         2.82407E+00
+          2.15916E-02         1.39494E-02        -2.03769E-02         1.35651E+00         1.09579E+00         1.35666E+00         4.09896E+00         1.00000E+00         3.16748E-09         4.09896E+00         1.34443E+00         2.75453E+00
+          2.15916E-02         1.41192E-02        -2.05266E-02         1.35651E+00         1.10646E+00         1.35666E+00         4.02438E+00         1.00000E+00         3.18097E-09         4.02438E+00         1.32793E+00         2.69645E+00
+          2.15916E-02         1.42890E-02        -2.06782E-02         1.35650E+00         1.11713E+00         1.35666E+00         3.96022E+00         1.00000E+00         3.18121E-09         3.96022E+00         1.31132E+00         2.64890E+00
+          2.15916E-02         1.44589E-02        -2.08315E-02         1.35650E+00         1.12780E+00         1.35666E+00         3.90560E+00         1.00000E+00         3.16741E-09         3.90560E+00         1.29460E+00         2.61100E+00
+          2.15916E-02         1.46287E-02        -2.09867E-02         1.35650E+00         1.13847E+00         1.35666E+00         3.85967E+00         1.00000E+00         3.13881E-09         3.85967E+00         1.27779E+00         2.58189E+00
+          2.15916E-02         1.47985E-02        -2.11437E-02         1.35649E+00         1.14914E+00         1.35666E+00         3.82160E+00         1.00000E+00         3.09466E-09         3.82160E+00         1.26090E+00         2.56070E+00
+          2.15916E-02         1.49683E-02        -2.13025E-02         1.35649E+00         1.15981E+00         1.35666E+00         3.79059E+00         1.00000E+00         3.03426E-09         3.79059E+00         1.24394E+00         2.54665E+00
+          2.15916E-02         1.51382E-02        -2.14631E-02         1.35649E+00         1.17048E+00         1.35666E+00         3.76585E+00         1.00000E+00         2.95696E-09         3.76585E+00         1.22693E+00         2.53892E+00
+          2.15916E-02         1.53080E-02        -2.16255E-02         1.35648E+00         1.18115E+00         1.35665E+00         3.74666E+00         1.00000E+00         2.86218E-09         3.74666E+00         1.20988E+00         2.53678E+00
+          2.15916E-02         1.54778E-02        -2.17897E-02         1.35648E+00         1.19182E+00         1.35665E+00         3.73230E+00         1.00000E+00         2.74939E-09         3.73230E+00         1.19280E+00         2.53950E+00
+          2.15916E-02         1.56476E-02        -2.19558E-02         1.35647E+00         1.20249E+00         1.35665E+00         3.72209E+00         1.00000E+00         2.61818E-09         3.72209E+00         1.17570E+00         2.54638E+00
+          2.15916E-02         1.58175E-02        -2.21236E-02         1.35647E+00         1.21317E+00         1.35665E+00         3.71537E+00         1.00000E+00         2.46828E-09         3.71537E+00         1.15860E+00         2.55677E+00
+          2.15916E-02         1.59873E-02        -2.22933E-02         1.35647E+00         1.22384E+00         1.35665E+00         3.71153E+00         1.00000E+00         2.29960E-09         3.71153E+00         1.14150E+00         2.57002E+00
+          2.15916E-02         1.61571E-02        -2.24648E-02         1.35646E+00         1.23451E+00         1.35665E+00         3.70998E+00         1.00000E+00         2.11231E-09         3.70998E+00         1.12442E+00         2.58556E+00
+          2.15916E-02         1.63270E-02        -2.26381E-02         1.35646E+00         1.24518E+00         1.35665E+00         3.71018E+00         1.00000E+00         1.90705E-09         3.71018E+00         1.10737E+00         2.60281E+00
+          2.15916E-02         1.64968E-02        -2.28132E-02         1.35646E+00         1.25585E+00         1.35665E+00         3.71161E+00         1.00000E+00         1.68517E-09         3.71161E+00         1.09036E+00         2.62125E+00
+          2.15916E-02         1.66666E-02        -2.29901E-02         1.35645E+00         1.26652E+00         1.35665E+00         3.71377E+00         1.00000E+00         1.44947E-09         3.71377E+00         1.07340E+00         2.64038E+00
+          2.15916E-02         1.68364E-02        -2.31688E-02         1.35645E+00         1.27719E+00         1.35665E+00         3.71622E+00         1.00000E+00         1.20579E-09         3.71622E+00         1.05649E+00         2.65974E+00
+          2.15916E-02         1.70063E-02        -2.33494E-02         1.35644E+00         1.28786E+00         1.35665E+00         3.71855E+00         1.00000E+00         9.67137E-10         3.71855E+00         1.03965E+00         2.67890E+00
+          2.15916E-02         1.71761E-02        -2.35317E-02         1.35644E+00         1.29853E+00         1.35664E+00         3.72035E+00         1.00000E+00         7.64743E-10         3.72035E+00         1.02288E+00         2.69747E+00
+          2.15916E-02         1.73459E-02        -2.37159E-02         1.35644E+00         1.30920E+00         1.35664E+00         3.72129E+00         1.00000E+00         6.66676E-10         3.72129E+00         1.00620E+00         2.71508E+00
+          2.15916E-02         1.75158E-02        -2.39019E-02         1.35643E+00         1.31987E+00         1.35664E+00         3.72103E+00         1.00000E+00         7.47247E-10         3.72103E+00         9.89616E-01         2.73141E+00
+          2.15916E-02         1.76856E-02        -2.40897E-02         1.35643E+00         1.33054E+00         1.35664E+00         3.71929E+00         1.00000E+00         9.86035E-10         3.71929E+00         9.73129E-01         2.74616E+00
+          2.15916E-02         1.78554E-02        -2.42793E-02         1.35642E+00         1.34121E+00         1.35664E+00         3.71581E+00         1.00000E+00         1.31630E-09         3.71581E+00         9.56748E-01         2.75906E+00
+          2.15916E-02         1.80252E-02        -2.44707E-02         1.35642E+00         1.35188E+00         1.35664E+00         3.71036E+00         1.00000E+00         1.69889E-09         3.71036E+00         9.40481E-01         2.76988E+00
+          2.15916E-02         1.81951E-02        -2.46639E-02         1.35642E+00         1.36255E+00         1.35664E+00         3.70274E+00         1.00000E+00         2.11635E-09         3.70274E+00         9.24334E-01         2.77841E+00
+          2.15916E-02         1.83649E-02        -2.48590E-02         1.35641E+00         1.37322E+00         1.35664E+00         3.69278E+00         1.00000E+00         2.56031E-09         3.69278E+00         9.08313E-01         2.78446E+00
+          2.15916E-02         1.85347E-02        -2.50558E-02         1.35641E+00         1.38389E+00         1.35664E+00         3.68033E+00         1.00000E+00         3.02601E-09         3.68033E+00         8.92424E-01         2.78791E+00
+          2.15916E-02         1.87045E-02        -2.52545E-02         1.35640E+00         1.39457E+00         1.35664E+00         3.66529E+00         1.00000E+00         3.51025E-09         3.66529E+00         8.76672E-01         2.78862E+00
+          2.15916E-02         1.88744E-02        -2.54550E-02         1.35640E+00         1.40524E+00         1.35664E+00         3.64756E+00         1.00000E+00         4.01047E-09         3.64756E+00         8.61061E-01         2.78649E+00
+          2.15916E-02         1.90442E-02        -2.56573E-02         1.35639E+00         1.41591E+00         1.35664E+00         3.62707E+00         1.00000E+00         4.52442E-09         3.62707E+00         8.45597E-01         2.78147E+00
+          2.15916E-02         1.92140E-02        -2.58614E-02         1.35639E+00         1.42658E+00         1.35664E+00         3.60379E+00         1.00000E+00         5.04994E-09         3.60379E+00         8.30282E-01         2.77350E+00
+          2.15916E-02         1.93839E-02        -2.60673E-02         1.35639E+00         1.43725E+00         1.35664E+00         3.57769E+00         1.00000E+00         5.58487E-09         3.57769E+00         8.15120E-01         2.76257E+00
+          2.15916E-02         1.95537E-02        -2.62751E-02         1.35638E+00         1.44792E+00         1.35664E+00         3.54879E+00         1.00000E+00         6.12699E-09         3.54879E+00         8.00115E-01         2.74867E+00
+          2.15916E-02         1.97235E-02        -2.64846E-02         1.35638E+00         1.45859E+00         1.35664E+00         3.51710E+00         1.00000E+00         6.67399E-09         3.51710E+00         7.85269E-01         2.73183E+00
+          2.15916E-02         1.98933E-02        -2.66960E-02         1.35637E+00         1.46926E+00         1.35663E+00         3.48266E+00         1.00000E+00         7.22347E-09         3.48266E+00         7.70586E-01         2.71208E+00
+          2.15916E-02         2.00632E-02        -2.69091E-02         1.35637E+00         1.47993E+00         1.35663E+00         3.44555E+00         1.00000E+00         7.77291E-09         3.44555E+00         7.56066E-01         2.68949E+00
+          2.15916E-02         2.02330E-02        -2.71241E-02         1.35636E+00         1.49060E+00         1.35663E+00         3.40584E+00         1.00000E+00         8.31967E-09         3.40584E+00         7.41712E-01         2.66413E+00
+          2.15916E-02         2.04028E-02        -2.73409E-02         1.35636E+00         1.50127E+00         1.35663E+00         3.36363E+00         1.00000E+00         8.86099E-09         3.36363E+00         7.27525E-01         2.63610E+00
+          2.15916E-02         2.05726E-02        -2.75595E-02         1.35635E+00         1.51194E+00         1.35663E+00         3.31901E+00         1.00000E+00         9.39400E-09         3.31901E+00         7.13507E-01         2.60550E+00
+          2.15916E-02         2.07425E-02        -2.77800E-02         1.35635E+00         1.52261E+00         1.35663E+00         3.27213E+00         1.00000E+00         9.91572E-09         3.27213E+00         6.99659E-01         2.57247E+00
+          2.15916E-02         2.09123E-02        -2.80022E-02         1.35634E+00         1.53328E+00         1.35663E+00         3.22310E+00         1.00000E+00         1.04231E-08         3.22310E+00         6.85980E-01         2.53712E+00
+          2.15916E-02         2.10821E-02        -2.82262E-02         1.35634E+00         1.54395E+00         1.35663E+00         3.17208E+00         1.00000E+00         1.09129E-08         3.17208E+00         6.72472E-01         2.49961E+00
+          2.15916E-02         2.12520E-02        -2.84521E-02         1.35633E+00         1.55462E+00         1.35663E+00         3.11923E+00         1.00000E+00         1.13818E-08         3.11923E+00         6.59134E-01         2.46010E+00
+          2.15916E-02         2.14218E-02        -2.86798E-02         1.35633E+00         1.56529E+00         1.35663E+00         3.06471E+00         1.00000E+00         1.18266E-08         3.06471E+00         6.45967E-01         2.41874E+00
+          2.15916E-02         2.15916E-02        -2.89093E-02         1.35632E+00         1.57596E+00         1.35663E+00         3.00869E+00         1.00000E+00         1.22439E-08         3.00869E+00         6.32971E-01         2.37572E+00
+          2.15916E-02         2.17614E-02        -2.91406E-02         1.35632E+00         1.58664E+00         1.35663E+00         2.95134E+00         1.00000E+00         1.26300E-08         2.95134E+00         6.20144E-01         2.33120E+00
+          2.15916E-02         2.19313E-02        -2.93737E-02         1.35631E+00         1.59731E+00         1.35663E+00         2.89286E+00         1.00000E+00         1.29817E-08         2.89286E+00         6.07486E-01         2.28538E+00
+          2.15916E-02         2.21011E-02        -2.96086E-02         1.35631E+00         1.60798E+00         1.35663E+00         2.83343E+00         1.00000E+00         1.32953E-08         2.83343E+00         5.94997E-01         2.23844E+00
+          2.15916E-02         2.22709E-02        -2.98453E-02         1.35630E+00         1.61865E+00         1.35663E+00         2.77324E+00         1.00000E+00         1.35673E-08         2.77324E+00         5.82675E-01         2.19057E+00
+          2.15916E-02         2.24407E-02        -3.00839E-02         1.35630E+00         1.62932E+00         1.35663E+00         2.71249E+00         1.00000E+00         1.37942E-08         2.71249E+00         5.70519E-01         2.14197E+00
+          2.15916E-02         2.26106E-02        -3.03243E-02         1.35629E+00         1.63999E+00         1.35663E+00         2.65136E+00         1.00000E+00         1.39725E-08         2.65136E+00         5.58529E-01         2.09283E+00
+          2.15916E-02         2.27804E-02        -3.05664E-02         1.35629E+00         1.65066E+00         1.35663E+00         2.59005E+00         1.00000E+00         1.40988E-08         2.59005E+00         5.46702E-01         2.04335E+00
+          2.15916E-02         2.29502E-02        -3.08104E-02         1.35628E+00         1.66133E+00         1.35663E+00         2.52875E+00         1.00000E+00         1.41697E-08         2.52875E+00         5.35038E-01         1.99371E+00
+          2.15916E-02         2.31201E-02        -3.10562E-02         1.35628E+00         1.67200E+00         1.35663E+00         2.46765E+00         1.00000E+00         1.41820E-08         2.46765E+00         5.23534E-01         1.94412E+00
+          2.15916E-02         2.32899E-02        -3.13039E-02         1.35627E+00         1.68267E+00         1.35663E+00         2.40695E+00         1.00000E+00         1.41326E-08         2.40695E+00         5.12190E-01         1.89476E+00
+          2.15916E-02         2.34597E-02        -3.15533E-02         1.35627E+00         1.69334E+00         1.35663E+00         2.34681E+00         1.00000E+00         1.40183E-08         2.34681E+00         5.01004E-01         1.84581E+00
+          2.15916E-02         2.36295E-02        -3.18045E-02         1.35626E+00         1.70401E+00         1.35663E+00         2.28743E+00         1.00000E+00         1.38365E-08         2.28743E+00         4.89974E-01         1.79745E+00
+          2.15916E-02         2.37994E-02        -3.20576E-02         1.35626E+00         1.71468E+00         1.35664E+00         2.22897E+00         1.00000E+00         1.35845E-08         2.22897E+00         4.79099E-01         1.74987E+00
+          2.15916E-02         2.39692E-02        -3.23125E-02         1.35625E+00         1.72535E+00         1.35664E+00         2.17160E+00         1.00000E+00         1.32598E-08         2.17160E+00         4.68376E-01         1.70323E+00
+          2.15916E-02         2.41390E-02        -3.25692E-02         1.35625E+00         1.73602E+00         1.35664E+00         2.11549E+00         1.00000E+00         1.28605E-08         2.11549E+00         4.57805E-01         1.65768E+00
+          2.15916E-02         2.43088E-02        -3.28277E-02         1.35624E+00         1.74669E+00         1.35664E+00         2.06078E+00         1.00000E+00         1.23847E-08         2.06078E+00         4.47384E-01         1.61340E+00
+          2.15916E-02         2.44787E-02        -3.30880E-02         1.35623E+00         1.75736E+00         1.35664E+00         2.00763E+00         1.00000E+00         1.18311E-08         2.00763E+00         4.37110E-01         1.57052E+00
+          2.15916E-02         2.46485E-02        -3.33501E-02         1.35623E+00         1.76804E+00         1.35664E+00         1.95617E+00         1.00000E+00         1.11987E-08         1.95617E+00         4.26984E-01         1.52919E+00
+          2.15916E-02         2.48183E-02        -3.36140E-02         1.35622E+00         1.77871E+00         1.35664E+00         1.90653E+00         1.00000E+00         1.04872E-08         1.90653E+00         4.17002E-01         1.48953E+00
+          2.15916E-02         2.49882E-02        -3.38798E-02         1.35622E+00         1.78938E+00         1.35664E+00         1.85883E+00         1.00000E+00         9.69704E-09         1.85883E+00         4.07163E-01         1.45166E+00
+          2.15916E-02         2.51580E-02        -3.41474E-02         1.35621E+00         1.80005E+00         1.35664E+00         1.81317E+00         1.00000E+00         8.82992E-09         1.81317E+00         3.97467E-01         1.41570E+00
+          2.15916E-02         2.53278E-02        -3.44167E-02         1.35621E+00         1.81072E+00         1.35664E+00         1.76966E+00         1.00000E+00         7.88916E-09         1.76966E+00         3.87911E-01         1.38175E+00
+          2.15916E-02         2.54976E-02        -3.46879E-02         1.35620E+00         1.82139E+00         1.35664E+00         1.72840E+00         1.00000E+00         6.88115E-09         1.72840E+00         3.78494E-01         1.34990E+00
+          2.15916E-02         2.56675E-02        -3.49609E-02         1.35619E+00         1.83206E+00         1.35664E+00         1.68944E+00         1.00000E+00         5.81818E-09         1.68944E+00         3.69216E-01         1.32023E+00
+          2.15916E-02         2.58373E-02        -3.52357E-02         1.35619E+00         1.84273E+00         1.35665E+00         1.65288E+00         1.00000E+00         4.72567E-09         1.65288E+00         3.60074E-01         1.29280E+00
+          2.15916E-02         2.60071E-02        -3.55124E-02         1.35618E+00         1.85340E+00         1.35665E+00         1.61875E+00         1.00000E+00         3.66293E-09         1.61875E+00         3.51067E-01         1.26768E+00
+          2.15916E-02         2.61769E-02        -3.57908E-02         1.35618E+00         1.86407E+00         1.35665E+00         1.58711E+00         1.00000E+00         2.78524E-09         1.58711E+00         3.42195E-01         1.24492E+00
+          2.17614E-02         8.72665E-04        -1.45202E-02         1.36731E+00         2.74155E-01         1.36739E+00         8.32420E+01         1.00000E+00         3.90119E-10         8.32420E+01         1.92186E+00         8.13202E+01
+          2.17614E-02         1.04249E-03        -1.45304E-02         1.36731E+00         2.84826E-01         1.36739E+00         8.17509E+01         1.00000E+00         4.11822E-10         8.17509E+01         1.91658E+00         7.98343E+01
+          2.17614E-02         1.21232E-03        -1.45425E-02         1.36731E+00         2.95496E-01         1.36739E+00         8.02288E+01         1.00000E+00         4.33176E-10         8.02288E+01         1.91114E+00         7.83177E+01
+          2.17614E-02         1.38215E-03        -1.45563E-02         1.36731E+00         3.06167E-01         1.36739E+00         7.86782E+01         1.00000E+00         4.54073E-10         7.86782E+01         1.90555E+00         7.67727E+01
+          2.17614E-02         1.55197E-03        -1.45719E-02         1.36731E+00         3.16838E-01         1.36739E+00         7.71017E+01         1.00000E+00         4.74409E-10         7.71017E+01         1.89981E+00         7.52019E+01
+          2.17614E-02         1.72180E-03        -1.45894E-02         1.36731E+00         3.27508E-01         1.36739E+00         7.55018E+01         1.00000E+00         4.94076E-10         7.55018E+01         1.89392E+00         7.36078E+01
+          2.17614E-02         1.89163E-03        -1.46087E-02         1.36731E+00         3.38179E-01         1.36739E+00         7.38809E+01         1.00000E+00         5.12970E-10         7.38809E+01         1.88789E+00         7.19930E+01
+          2.17614E-02         2.06146E-03        -1.46298E-02         1.36731E+00         3.48849E-01         1.36739E+00         7.22417E+01         1.00000E+00         5.30985E-10         7.22417E+01         1.88172E+00         7.03600E+01
+          2.17614E-02         2.23128E-03        -1.46527E-02         1.36731E+00         3.59520E-01         1.36739E+00         7.05866E+01         1.00000E+00         5.48019E-10         7.05866E+01         1.87542E+00         6.87112E+01
+          2.17614E-02         2.40111E-03        -1.46774E-02         1.36731E+00         3.70190E-01         1.36739E+00         6.89183E+01         1.00000E+00         5.63968E-10         6.89183E+01         1.86899E+00         6.70493E+01
+          2.17614E-02         2.57094E-03        -1.47039E-02         1.36731E+00         3.80861E-01         1.36739E+00         6.72391E+01         1.00000E+00         5.78731E-10         6.72391E+01         1.86243E+00         6.53767E+01
+          2.17614E-02         2.74077E-03        -1.47322E-02         1.36731E+00         3.91532E-01         1.36739E+00         6.55517E+01         1.00000E+00         5.92208E-10         6.55517E+01         1.85576E+00         6.36959E+01
+          2.17614E-02         2.91059E-03        -1.47624E-02         1.36731E+00         4.02202E-01         1.36739E+00         6.38583E+01         1.00000E+00         6.04301E-10         6.38583E+01         1.84897E+00         6.20093E+01
+          2.17614E-02         3.08042E-03        -1.47943E-02         1.36730E+00         4.12873E-01         1.36738E+00         6.21615E+01         1.00000E+00         6.14912E-10         6.21615E+01         1.84207E+00         6.03195E+01
+          2.17614E-02         3.25025E-03        -1.48281E-02         1.36730E+00         4.23543E-01         1.36738E+00         6.04637E+01         1.00000E+00         6.23947E-10         6.04637E+01         1.83507E+00         5.86287E+01
+          2.17614E-02         3.42008E-03        -1.48637E-02         1.36730E+00         4.34214E-01         1.36738E+00         5.87672E+01         1.00000E+00         6.31314E-10         5.87672E+01         1.82796E+00         5.69392E+01
+          2.17614E-02         3.58990E-03        -1.49011E-02         1.36730E+00         4.44884E-01         1.36738E+00         5.70742E+01         1.00000E+00         6.36920E-10         5.70742E+01         1.82075E+00         5.52535E+01
+          2.17614E-02         3.75973E-03        -1.49403E-02         1.36730E+00         4.55555E-01         1.36738E+00         5.53871E+01         1.00000E+00         6.40678E-10         5.53871E+01         1.81345E+00         5.35737E+01
+          2.17614E-02         3.92956E-03        -1.49813E-02         1.36730E+00         4.66225E-01         1.36738E+00         5.37080E+01         1.00000E+00         6.42502E-10         5.37080E+01         1.80606E+00         5.19020E+01
+          2.17614E-02         4.09939E-03        -1.50241E-02         1.36730E+00         4.76896E-01         1.36738E+00         5.20391E+01         1.00000E+00         6.42310E-10         5.20391E+01         1.79858E+00         5.02405E+01
+          2.17614E-02         4.26921E-03        -1.50688E-02         1.36730E+00         4.87567E-01         1.36738E+00         5.03823E+01         1.00000E+00         6.40020E-10         5.03823E+01         1.79102E+00         4.85913E+01
+          2.17614E-02         4.43904E-03        -1.51152E-02         1.36730E+00         4.98237E-01         1.36738E+00         4.87398E+01         1.00000E+00         6.35556E-10         4.87398E+01         1.78337E+00         4.69564E+01
+          2.17614E-02         4.60887E-03        -1.51635E-02         1.36730E+00         5.08908E-01         1.36738E+00         4.71134E+01         1.00000E+00         6.28847E-10         4.71134E+01         1.77566E+00         4.53377E+01
+          2.17614E-02         4.77869E-03        -1.52135E-02         1.36730E+00         5.19578E-01         1.36738E+00         4.55049E+01         1.00000E+00         6.19822E-10         4.55049E+01         1.76786E+00         4.37370E+01
+          2.17614E-02         4.94852E-03        -1.52654E-02         1.36729E+00         5.30249E-01         1.36738E+00         4.39162E+01         1.00000E+00         6.08420E-10         4.39162E+01         1.76000E+00         4.21562E+01
+          2.17614E-02         5.11835E-03        -1.53191E-02         1.36729E+00         5.40919E-01         1.36738E+00         4.23489E+01         1.00000E+00         5.94582E-10         4.23489E+01         1.75207E+00         4.05968E+01
+          2.17614E-02         5.28818E-03        -1.53746E-02         1.36729E+00         5.51590E-01         1.36738E+00         4.08046E+01         1.00000E+00         5.78258E-10         4.08046E+01         1.74408E+00         3.90605E+01
+          2.17614E-02         5.45800E-03        -1.54320E-02         1.36729E+00         5.62261E-01         1.36738E+00         3.92848E+01         1.00000E+00         5.59405E-10         3.92848E+01         1.73602E+00         3.75488E+01
+          2.17614E-02         5.62783E-03        -1.54911E-02         1.36729E+00         5.72931E-01         1.36738E+00         3.77911E+01         1.00000E+00         5.37992E-10         3.77911E+01         1.72791E+00         3.60632E+01
+          2.17614E-02         5.79766E-03        -1.55520E-02         1.36729E+00         5.83602E-01         1.36738E+00         3.63246E+01         1.00000E+00         5.13999E-10         3.63246E+01         1.71973E+00         3.46049E+01
+          2.17614E-02         5.96749E-03        -1.56148E-02         1.36729E+00         5.94272E-01         1.36738E+00         3.48867E+01         1.00000E+00         4.87426E-10         3.48867E+01         1.71151E+00         3.31752E+01
+          2.17614E-02         6.13731E-03        -1.56794E-02         1.36729E+00         6.04943E-01         1.36738E+00         3.34786E+01         1.00000E+00         4.58295E-10         3.34786E+01         1.70322E+00         3.17754E+01
+          2.17614E-02         6.30714E-03        -1.57457E-02         1.36728E+00         6.15613E-01         1.36737E+00         3.21013E+01         1.00000E+00         4.26663E-10         3.21013E+01         1.69489E+00         3.04064E+01
+          2.17614E-02         6.47697E-03        -1.58139E-02         1.36728E+00         6.26284E-01         1.36737E+00         3.07558E+01         1.00000E+00         3.92639E-10         3.07558E+01         1.68651E+00         2.90693E+01
+          2.17614E-02         6.64680E-03        -1.58839E-02         1.36728E+00         6.36955E-01         1.36737E+00         2.94429E+01         1.00000E+00         3.56411E-10         2.94429E+01         1.67807E+00         2.77648E+01
+          2.17614E-02         6.81662E-03        -1.59558E-02         1.36728E+00         6.47625E-01         1.36737E+00         2.81636E+01         1.00000E+00         3.18307E-10         2.81636E+01         1.66959E+00         2.64940E+01
+          2.17614E-02         6.98645E-03        -1.60294E-02         1.36728E+00         6.58296E-01         1.36737E+00         2.69184E+01         1.00000E+00         2.78898E-10         2.69184E+01         1.66107E+00         2.52573E+01
+          2.17614E-02         7.15628E-03        -1.61048E-02         1.36728E+00         6.68966E-01         1.36737E+00         2.57080E+01         1.00000E+00         2.39227E-10         2.57080E+01         1.65249E+00         2.40556E+01
+          2.17614E-02         7.32611E-03        -1.61821E-02         1.36727E+00         6.79637E-01         1.36737E+00         2.45330E+01         1.00000E+00         2.01284E-10         2.45330E+01         1.64387E+00         2.28892E+01
+          2.17614E-02         7.49593E-03        -1.62611E-02         1.36727E+00         6.90307E-01         1.36737E+00         2.33938E+01         1.00000E+00         1.68968E-10         2.33938E+01         1.63520E+00         2.17586E+01
+          2.17614E-02         7.66576E-03        -1.63420E-02         1.36727E+00         7.00978E-01         1.36737E+00         2.22907E+01         1.00000E+00         1.49284E-10         2.22907E+01         1.62649E+00         2.06642E+01
+          2.17614E-02         7.83559E-03        -1.64247E-02         1.36727E+00         7.11649E-01         1.36737E+00         2.12240E+01         1.00000E+00         1.50690E-10         2.12240E+01         1.61773E+00         1.96062E+01
+          2.17614E-02         8.00542E-03        -1.65092E-02         1.36727E+00         7.22319E-01         1.36737E+00         2.01938E+01         1.00000E+00         1.75570E-10         2.01938E+01         1.60893E+00         1.85849E+01
+          2.17614E-02         8.17524E-03        -1.65955E-02         1.36727E+00         7.32990E-01         1.36737E+00         1.92004E+01         1.00000E+00         2.18314E-10         1.92004E+01         1.60007E+00         1.76003E+01
+          2.17614E-02         8.34507E-03        -1.66836E-02         1.36726E+00         7.43660E-01         1.36737E+00         1.82436E+01         1.00000E+00         2.72468E-10         1.82436E+01         1.59117E+00         1.66525E+01
+          2.17614E-02         8.51490E-03        -1.67736E-02         1.36726E+00         7.54331E-01         1.36736E+00         1.73235E+01         1.00000E+00         3.34017E-10         1.73235E+01         1.58222E+00         1.57413E+01
+          2.17614E-02         8.68473E-03        -1.68653E-02         1.36726E+00         7.65001E-01         1.36736E+00         1.64400E+01         1.00000E+00         4.00779E-10         1.64400E+01         1.57323E+00         1.48667E+01
+          2.17614E-02         8.85455E-03        -1.69589E-02         1.36726E+00         7.75672E-01         1.36736E+00         1.55927E+01         1.00000E+00         4.71528E-10         1.55927E+01         1.56418E+00         1.40285E+01
+          2.17614E-02         9.02438E-03        -1.70542E-02         1.36726E+00         7.86343E-01         1.36736E+00         1.47815E+01         1.00000E+00         5.45502E-10         1.47815E+01         1.55507E+00         1.32264E+01
+          2.17614E-02         9.19421E-03        -1.71514E-02         1.36725E+00         7.97013E-01         1.36736E+00         1.40060E+01         1.00000E+00         6.22171E-10         1.40060E+01         1.54592E+00         1.24600E+01
+          2.17614E-02         9.36403E-03        -1.72504E-02         1.36725E+00         8.07684E-01         1.36736E+00         1.32657E+01         1.00000E+00         7.01124E-10         1.32657E+01         1.53671E+00         1.17290E+01
+          2.17614E-02         9.53386E-03        -1.73512E-02         1.36725E+00         8.18354E-01         1.36736E+00         1.25604E+01         1.00000E+00         7.82004E-10         1.25604E+01         1.52744E+00         1.10329E+01
+          2.17614E-02         9.70369E-03        -1.74538E-02         1.36725E+00         8.29025E-01         1.36736E+00         1.18893E+01         1.00000E+00         8.64483E-10         1.18893E+01         1.51811E+00         1.03712E+01
+          2.17614E-02         9.87352E-03        -1.75583E-02         1.36724E+00         8.39695E-01         1.36736E+00         1.12520E+01         1.00000E+00         9.48241E-10         1.12520E+01         1.50872E+00         9.74326E+00
+          2.17614E-02         1.00433E-02        -1.76645E-02         1.36724E+00         8.50366E-01         1.36736E+00         1.06478E+01         1.00000E+00         1.03296E-09         1.06478E+01         1.49926E+00         9.14851E+00
+          2.17614E-02         1.02132E-02        -1.77726E-02         1.36724E+00         8.61037E-01         1.36736E+00         1.00760E+01         1.00000E+00         1.11830E-09         1.00760E+01         1.48975E+00         8.58626E+00
+          2.17614E-02         1.03830E-02        -1.78824E-02         1.36724E+00         8.71707E-01         1.36735E+00         9.53596E+00         1.00000E+00         1.20392E-09         9.53596E+00         1.48016E+00         8.05580E+00
+          2.17614E-02         1.05528E-02        -1.79941E-02         1.36724E+00         8.82378E-01         1.36735E+00         9.02687E+00         1.00000E+00         1.28946E-09         9.02687E+00         1.47050E+00         7.55637E+00
+          2.17614E-02         1.07227E-02        -1.81076E-02         1.36723E+00         8.93048E-01         1.36735E+00         8.54795E+00         1.00000E+00         1.37454E-09         8.54795E+00         1.46077E+00         7.08718E+00
+          2.17614E-02         1.08925E-02        -1.82229E-02         1.36723E+00         9.03719E-01         1.36735E+00         8.09837E+00         1.00000E+00         1.45877E-09         8.09837E+00         1.45096E+00         6.64740E+00
+          2.17614E-02         1.10623E-02        -1.83400E-02         1.36723E+00         9.14389E-01         1.36735E+00         7.67725E+00         1.00000E+00         1.54172E-09         7.67725E+00         1.44108E+00         6.23617E+00
+          2.17614E-02         1.12321E-02        -1.84589E-02         1.36723E+00         9.25060E-01         1.36735E+00         7.28371E+00         1.00000E+00         1.62296E-09         7.28371E+00         1.43112E+00         5.85259E+00
+          2.17614E-02         1.14020E-02        -1.85797E-02         1.36722E+00         9.35731E-01         1.36735E+00         6.91684E+00         1.00000E+00         1.70204E-09         6.91684E+00         1.42107E+00         5.49577E+00
+          2.17614E-02         1.15718E-02        -1.87022E-02         1.36722E+00         9.46401E-01         1.36735E+00         6.57571E+00         1.00000E+00         1.77847E-09         6.57571E+00         1.41094E+00         5.16477E+00
+          2.17614E-02         1.17416E-02        -1.88266E-02         1.36722E+00         9.57072E-01         1.36735E+00         6.25935E+00         1.00000E+00         1.85176E-09         6.25935E+00         1.40072E+00         4.85863E+00
+          2.17614E-02         1.19114E-02        -1.89528E-02         1.36721E+00         9.67742E-01         1.36735E+00         5.96681E+00         1.00000E+00         1.92140E-09         5.96681E+00         1.39042E+00         4.57640E+00
+          2.17614E-02         1.20813E-02        -1.90808E-02         1.36721E+00         9.78413E-01         1.36734E+00         5.69711E+00         1.00000E+00         1.98685E-09         5.69711E+00         1.38002E+00         4.31709E+00
+          2.17614E-02         1.22511E-02        -1.92106E-02         1.36721E+00         9.89083E-01         1.36734E+00         5.44925E+00         1.00000E+00         2.04758E-09         5.44925E+00         1.36952E+00         4.07973E+00
+          2.17614E-02         1.24209E-02        -1.93422E-02         1.36721E+00         9.99754E-01         1.36734E+00         5.22226E+00         1.00000E+00         2.10302E-09         5.22226E+00         1.35893E+00         3.86333E+00
+          2.17614E-02         1.25908E-02        -1.94756E-02         1.36720E+00         1.01042E+00         1.36734E+00         5.01513E+00         1.00000E+00         2.15260E-09         5.01513E+00         1.34824E+00         3.66689E+00
+          2.17614E-02         1.27606E-02        -1.96108E-02         1.36720E+00         1.02110E+00         1.36734E+00         4.82687E+00         1.00000E+00         2.19575E-09         4.82687E+00         1.33746E+00         3.48942E+00
+          2.17614E-02         1.29304E-02        -1.97479E-02         1.36720E+00         1.03177E+00         1.36734E+00         4.65650E+00         1.00000E+00         2.23186E-09         4.65650E+00         1.32656E+00         3.32993E+00
+          2.17614E-02         1.31002E-02        -1.98867E-02         1.36719E+00         1.04244E+00         1.36734E+00         4.50302E+00         1.00000E+00         2.26035E-09         4.50302E+00         1.31557E+00         3.18745E+00
+          2.17614E-02         1.32701E-02        -2.00274E-02         1.36719E+00         1.05311E+00         1.36734E+00         4.36547E+00         1.00000E+00         2.28063E-09         4.36547E+00         1.30447E+00         3.06100E+00
+          2.17614E-02         1.34399E-02        -2.01699E-02         1.36719E+00         1.06378E+00         1.36734E+00         4.24287E+00         1.00000E+00         2.29209E-09         4.24287E+00         1.29326E+00         2.94961E+00
+          2.17614E-02         1.36097E-02        -2.03142E-02         1.36718E+00         1.07445E+00         1.36734E+00         4.13427E+00         1.00000E+00         2.29415E-09         4.13427E+00         1.28195E+00         2.85232E+00
+          2.17614E-02         1.37795E-02        -2.04603E-02         1.36718E+00         1.08512E+00         1.36733E+00         4.03874E+00         1.00000E+00         2.28623E-09         4.03874E+00         1.27052E+00         2.76822E+00
+          2.17614E-02         1.39494E-02        -2.06082E-02         1.36718E+00         1.09579E+00         1.36733E+00         3.95535E+00         1.00000E+00         2.26776E-09         3.95535E+00         1.25899E+00         2.69636E+00
+          2.17614E-02         1.41192E-02        -2.07580E-02         1.36718E+00         1.10646E+00         1.36733E+00         3.88320E+00         1.00000E+00         2.23820E-09         3.88320E+00         1.24735E+00         2.63585E+00
+          2.17614E-02         1.42890E-02        -2.09095E-02         1.36717E+00         1.11713E+00         1.36733E+00         3.82141E+00         1.00000E+00         2.19702E-09         3.82141E+00         1.23559E+00         2.58582E+00
+          2.17614E-02         1.44589E-02        -2.10629E-02         1.36717E+00         1.12780E+00         1.36733E+00         3.76912E+00         1.00000E+00         2.14374E-09         3.76912E+00         1.22373E+00         2.54539E+00
+          2.17614E-02         1.46287E-02        -2.12180E-02         1.36717E+00         1.13847E+00         1.36733E+00         3.72549E+00         1.00000E+00         2.07791E-09         3.72549E+00         1.21175E+00         2.51373E+00
+          2.17614E-02         1.47985E-02        -2.13750E-02         1.36716E+00         1.14914E+00         1.36733E+00         3.68970E+00         1.00000E+00         1.99915E-09         3.68970E+00         1.19967E+00         2.49004E+00
+          2.17614E-02         1.49683E-02        -2.15338E-02         1.36716E+00         1.15981E+00         1.36733E+00         3.66098E+00         1.00000E+00         1.90714E-09         3.66098E+00         1.18747E+00         2.47351E+00
+          2.17614E-02         1.51382E-02        -2.16944E-02         1.36715E+00         1.17048E+00         1.36733E+00         3.63857E+00         1.00000E+00         1.80166E-09         3.63857E+00         1.17516E+00         2.46341E+00
+          2.17614E-02         1.53080E-02        -2.18568E-02         1.36715E+00         1.18115E+00         1.36733E+00         3.62173E+00         1.00000E+00         1.68264E-09         3.62173E+00         1.16275E+00         2.45898E+00
+          2.17614E-02         1.54778E-02        -2.20211E-02         1.36715E+00         1.19182E+00         1.36732E+00         3.60977E+00         1.00000E+00         1.55020E-09         3.60977E+00         1.15023E+00         2.45954E+00
+          2.17614E-02         1.56476E-02        -2.21871E-02         1.36714E+00         1.20249E+00         1.36732E+00         3.60201E+00         1.00000E+00         1.40479E-09         3.60201E+00         1.13760E+00         2.46441E+00
+          2.17614E-02         1.58175E-02        -2.23550E-02         1.36714E+00         1.21317E+00         1.36732E+00         3.59781E+00         1.00000E+00         1.24743E-09         3.59781E+00         1.12487E+00         2.47294E+00
+          2.17614E-02         1.59873E-02        -2.25246E-02         1.36714E+00         1.22384E+00         1.36732E+00         3.59657E+00         1.00000E+00         1.08017E-09         3.59657E+00         1.11204E+00         2.48452E+00
+          2.17614E-02         1.61571E-02        -2.26961E-02         1.36713E+00         1.23451E+00         1.36732E+00         3.59770E+00         1.00000E+00         9.07220E-10         3.59770E+00         1.09911E+00         2.49859E+00
+          2.17614E-02         1.63270E-02        -2.28694E-02         1.36713E+00         1.24518E+00         1.36732E+00         3.60065E+00         1.00000E+00         7.37745E-10         3.60065E+00         1.08608E+00         2.51457E+00
+          2.17614E-02         1.64968E-02        -2.30445E-02         1.36713E+00         1.25585E+00         1.36732E+00         3.60493E+00         1.00000E+00         5.92800E-10         3.60493E+00         1.07296E+00         2.53196E+00
+          2.17614E-02         1.66666E-02        -2.32214E-02         1.36712E+00         1.26652E+00         1.36732E+00         3.61003E+00         1.00000E+00         5.16658E-10         3.61003E+00         1.05975E+00         2.55028E+00
+          2.17614E-02         1.68364E-02        -2.34002E-02         1.36712E+00         1.27719E+00         1.36732E+00         3.61551E+00         1.00000E+00         5.60848E-10         3.61551E+00         1.04645E+00         2.56906E+00
+          2.17614E-02         1.70063E-02        -2.35807E-02         1.36711E+00         1.28786E+00         1.36732E+00         3.62095E+00         1.00000E+00         7.20379E-10         3.62095E+00         1.03306E+00         2.58789E+00
+          2.17614E-02         1.71761E-02        -2.37631E-02         1.36711E+00         1.29853E+00         1.36732E+00         3.62597E+00         1.00000E+00         9.51560E-10         3.62597E+00         1.01959E+00         2.60637E+00
+          2.17614E-02         1.73459E-02        -2.39472E-02         1.36711E+00         1.30920E+00         1.36732E+00         3.63020E+00         1.00000E+00         1.22464E-09         3.63020E+00         1.00605E+00         2.62414E+00
+          2.17614E-02         1.75158E-02        -2.41332E-02         1.36710E+00         1.31987E+00         1.36731E+00         3.63332E+00         1.00000E+00         1.52552E-09         3.63332E+00         9.92437E-01         2.64088E+00
+          2.17614E-02         1.76856E-02        -2.43210E-02         1.36710E+00         1.33054E+00         1.36731E+00         3.63504E+00         1.00000E+00         1.84736E-09         3.63504E+00         9.78754E-01         2.65628E+00
+          2.17614E-02         1.78554E-02        -2.45106E-02         1.36709E+00         1.34121E+00         1.36731E+00         3.63509E+00         1.00000E+00         2.18632E-09         3.63509E+00         9.65007E-01         2.67008E+00
+          2.17614E-02         1.80252E-02        -2.47020E-02         1.36709E+00         1.35188E+00         1.36731E+00         3.63323E+00         1.00000E+00         2.53988E-09         3.63323E+00         9.51203E-01         2.68203E+00
+          2.17614E-02         1.81951E-02        -2.48953E-02         1.36708E+00         1.36255E+00         1.36731E+00         3.62926E+00         1.00000E+00         2.90607E-09         3.62926E+00         9.37345E-01         2.69192E+00
+          2.17614E-02         1.83649E-02        -2.50903E-02         1.36708E+00         1.37322E+00         1.36731E+00         3.62301E+00         1.00000E+00         3.28323E-09         3.62301E+00         9.23438E-01         2.69957E+00
+          2.17614E-02         1.85347E-02        -2.52872E-02         1.36708E+00         1.38389E+00         1.36731E+00         3.61430E+00         1.00000E+00         3.66975E-09         3.61430E+00         9.09489E-01         2.70481E+00
+          2.17614E-02         1.87045E-02        -2.54858E-02         1.36707E+00         1.39457E+00         1.36731E+00         3.60303E+00         1.00000E+00         4.06405E-09         3.60303E+00         8.95503E-01         2.70753E+00
+          2.17614E-02         1.88744E-02        -2.56863E-02         1.36707E+00         1.40524E+00         1.36731E+00         3.58909E+00         1.00000E+00         4.46452E-09         3.58909E+00         8.81485E-01         2.70760E+00
+          2.17614E-02         1.90442E-02        -2.58886E-02         1.36706E+00         1.41591E+00         1.36731E+00         3.57240E+00         1.00000E+00         4.86947E-09         3.57240E+00         8.67442E-01         2.70496E+00
+          2.17614E-02         1.92140E-02        -2.60927E-02         1.36706E+00         1.42658E+00         1.36731E+00         3.55291E+00         1.00000E+00         5.27716E-09         3.55291E+00         8.53379E-01         2.69953E+00
+          2.17614E-02         1.93839E-02        -2.62986E-02         1.36705E+00         1.43725E+00         1.36731E+00         3.53059E+00         1.00000E+00         5.68574E-09         3.53059E+00         8.39303E-01         2.69129E+00
+          2.17614E-02         1.95537E-02        -2.65064E-02         1.36705E+00         1.44792E+00         1.36731E+00         3.50544E+00         1.00000E+00         6.09328E-09         3.50544E+00         8.25220E-01         2.68022E+00
+          2.17614E-02         1.97235E-02        -2.67159E-02         1.36705E+00         1.45859E+00         1.36731E+00         3.47745E+00         1.00000E+00         6.49775E-09         3.47745E+00         8.11135E-01         2.66632E+00
+          2.17614E-02         1.98933E-02        -2.69273E-02         1.36704E+00         1.46926E+00         1.36731E+00         3.44667E+00         1.00000E+00         6.89704E-09         3.44667E+00         7.97056E-01         2.64962E+00
+          2.17614E-02         2.00632E-02        -2.71404E-02         1.36704E+00         1.47993E+00         1.36731E+00         3.41314E+00         1.00000E+00         7.28895E-09         3.41314E+00         7.82989E-01         2.63015E+00
+          2.17614E-02         2.02330E-02        -2.73554E-02         1.36703E+00         1.49060E+00         1.36731E+00         3.37693E+00         1.00000E+00         7.67119E-09         3.37693E+00         7.68941E-01         2.60799E+00
+          2.17614E-02         2.04028E-02        -2.75722E-02         1.36703E+00         1.50127E+00         1.36730E+00         3.33812E+00         1.00000E+00         8.04138E-09         3.33812E+00         7.54917E-01         2.58321E+00
+          2.17614E-02         2.05726E-02        -2.77908E-02         1.36702E+00         1.51194E+00         1.36730E+00         3.29681E+00         1.00000E+00         8.39709E-09         3.29681E+00         7.40925E-01         2.55589E+00
+          2.17614E-02         2.07425E-02        -2.80113E-02         1.36702E+00         1.52261E+00         1.36730E+00         3.25310E+00         1.00000E+00         8.73582E-09         3.25310E+00         7.26970E-01         2.52613E+00
+          2.17614E-02         2.09123E-02        -2.82335E-02         1.36701E+00         1.53328E+00         1.36730E+00         3.20713E+00         1.00000E+00         9.05499E-09         3.20713E+00         7.13061E-01         2.49407E+00
+          2.17614E-02         2.10821E-02        -2.84575E-02         1.36701E+00         1.54395E+00         1.36730E+00         3.15902E+00         1.00000E+00         9.35199E-09         3.15902E+00         6.99202E-01         2.45981E+00
+          2.17614E-02         2.12520E-02        -2.86834E-02         1.36700E+00         1.55462E+00         1.36730E+00         3.10891E+00         1.00000E+00         9.62418E-09         3.10891E+00         6.85402E-01         2.42351E+00
+          2.17614E-02         2.14218E-02        -2.89111E-02         1.36700E+00         1.56529E+00         1.36730E+00         3.05697E+00         1.00000E+00         9.86887E-09         3.05697E+00         6.71665E-01         2.38530E+00
+          2.17614E-02         2.15916E-02        -2.91406E-02         1.36699E+00         1.57596E+00         1.36730E+00         3.00335E+00         1.00000E+00         1.00834E-08         3.00335E+00         6.57999E-01         2.34535E+00
+          2.17614E-02         2.17614E-02        -2.93719E-02         1.36699E+00         1.58664E+00         1.36730E+00         2.94822E+00         1.00000E+00         1.02650E-08         2.94822E+00         6.44409E-01         2.30381E+00
+          2.17614E-02         2.19313E-02        -2.96050E-02         1.36698E+00         1.59731E+00         1.36730E+00         2.89176E+00         1.00000E+00         1.04110E-08         2.89176E+00         6.30903E-01         2.26085E+00
+          2.17614E-02         2.21011E-02        -2.98399E-02         1.36698E+00         1.60798E+00         1.36730E+00         2.83414E+00         1.00000E+00         1.05189E-08         2.83414E+00         6.17486E-01         2.21665E+00
+          2.17614E-02         2.22709E-02        -3.00766E-02         1.36697E+00         1.61865E+00         1.36730E+00         2.77555E+00         1.00000E+00         1.05859E-08         2.77555E+00         6.04165E-01         2.17138E+00
+          2.17614E-02         2.24407E-02        -3.03152E-02         1.36697E+00         1.62932E+00         1.36730E+00         2.71617E+00         1.00000E+00         1.06095E-08         2.71617E+00         5.90944E-01         2.12522E+00
+          2.17614E-02         2.26106E-02        -3.05556E-02         1.36696E+00         1.63999E+00         1.36730E+00         2.65619E+00         1.00000E+00         1.05872E-08         2.65619E+00         5.77831E-01         2.07836E+00
+          2.17614E-02         2.27804E-02        -3.07977E-02         1.36696E+00         1.65066E+00         1.36730E+00         2.59580E+00         1.00000E+00         1.05168E-08         2.59580E+00         5.64830E-01         2.03097E+00
+          2.17614E-02         2.29502E-02        -3.10417E-02         1.36695E+00         1.66133E+00         1.36730E+00         2.53519E+00         1.00000E+00         1.03958E-08         2.53519E+00         5.51948E-01         1.98324E+00
+          2.17614E-02         2.31201E-02        -3.12875E-02         1.36695E+00         1.67200E+00         1.36730E+00         2.47453E+00         1.00000E+00         1.02223E-08         2.47453E+00         5.39189E-01         1.93535E+00
+          2.17614E-02         2.32899E-02        -3.15352E-02         1.36694E+00         1.68267E+00         1.36730E+00         2.41403E+00         1.00000E+00         9.99423E-09         2.41403E+00         5.26558E-01         1.88747E+00
+          2.17614E-02         2.34597E-02        -3.17846E-02         1.36694E+00         1.69334E+00         1.36730E+00         2.35386E+00         1.00000E+00         9.70992E-09         2.35386E+00         5.14061E-01         1.83979E+00
+          2.17614E-02         2.36295E-02        -3.20358E-02         1.36693E+00         1.70401E+00         1.36730E+00         2.29419E+00         1.00000E+00         9.36786E-09         2.29419E+00         5.01703E-01         1.79249E+00
+          2.17614E-02         2.37994E-02        -3.22889E-02         1.36692E+00         1.71468E+00         1.36731E+00         2.23521E+00         1.00000E+00         8.96686E-09         2.23521E+00         4.89488E-01         1.74572E+00
+          2.17614E-02         2.39692E-02        -3.25438E-02         1.36692E+00         1.72535E+00         1.36731E+00         2.17708E+00         1.00000E+00         8.50607E-09         2.17708E+00         4.77420E-01         1.69966E+00
+          2.17614E-02         2.41390E-02        -3.28004E-02         1.36691E+00         1.73602E+00         1.36731E+00         2.11997E+00         1.00000E+00         7.98513E-09         2.11997E+00         4.65503E-01         1.65446E+00
+          2.17614E-02         2.43088E-02        -3.30589E-02         1.36691E+00         1.74669E+00         1.36731E+00         2.06403E+00         1.00000E+00         7.40426E-09         2.06403E+00         4.53742E-01         1.61029E+00
+          2.17614E-02         2.44787E-02        -3.33193E-02         1.36690E+00         1.75736E+00         1.36731E+00         2.00941E+00         1.00000E+00         6.76458E-09         2.00941E+00         4.42141E-01         1.56727E+00
+          2.17614E-02         2.46485E-02        -3.35814E-02         1.36690E+00         1.76804E+00         1.36731E+00         1.95627E+00         1.00000E+00         6.06858E-09         1.95627E+00         4.30702E-01         1.52557E+00
+          2.17614E-02         2.48183E-02        -3.38453E-02         1.36689E+00         1.77871E+00         1.36731E+00         1.90473E+00         1.00000E+00         5.32110E-09         1.90473E+00         4.19429E-01         1.48530E+00
+          2.17614E-02         2.49882E-02        -3.41111E-02         1.36688E+00         1.78938E+00         1.36731E+00         1.85492E+00         1.00000E+00         4.53148E-09         1.85492E+00         4.08326E-01         1.44659E+00
+          2.17614E-02         2.51580E-02        -3.43786E-02         1.36688E+00         1.80005E+00         1.36731E+00         1.80696E+00         1.00000E+00         3.71888E-09         1.80696E+00         3.97395E-01         1.40957E+00
+          2.17614E-02         2.53278E-02        -3.46480E-02         1.36687E+00         1.81072E+00         1.36731E+00         1.76096E+00         1.00000E+00         2.92673E-09         1.76096E+00         3.86638E-01         1.37432E+00
+          2.17614E-02         2.54976E-02        -3.49192E-02         1.36687E+00         1.82139E+00         1.36731E+00         1.71702E+00         1.00000E+00         2.26376E-09         1.71702E+00         3.76059E-01         1.34096E+00
+          2.17614E-02         2.56675E-02        -3.51922E-02         1.36686E+00         1.83206E+00         1.36731E+00         1.67523E+00         1.00000E+00         1.97569E-09         1.67523E+00         3.65659E-01         1.30958E+00
+          2.17614E-02         2.58373E-02        -3.54670E-02         1.36685E+00         1.84273E+00         1.36731E+00         1.63567E+00         1.00000E+00         2.30358E-09         1.63567E+00         3.55439E-01         1.28024E+00
+          2.17614E-02         2.60071E-02        -3.57437E-02         1.36685E+00         1.85340E+00         1.36732E+00         1.59842E+00         1.00000E+00         3.12088E-09         1.59842E+00         3.45403E-01         1.25301E+00
+          2.17614E-02         2.61769E-02        -3.60221E-02         1.36684E+00         1.86407E+00         1.36732E+00         1.56352E+00         1.00000E+00         4.19563E-09         1.56352E+00         3.35551E-01         1.22797E+00
+          2.19313E-02         8.72665E-04        -1.47534E-02         1.37798E+00         2.74155E-01         1.37806E+00         8.13810E+01         1.00000E+00         3.19066E-10         8.13810E+01         2.18640E+00         7.91946E+01
+          2.19313E-02         1.04249E-03        -1.47636E-02         1.37798E+00         2.84826E-01         1.37806E+00         7.99244E+01         1.00000E+00         3.35136E-10         7.99244E+01         2.17159E+00         7.77528E+01
+          2.19313E-02         1.21232E-03        -1.47756E-02         1.37798E+00         2.95496E-01         1.37806E+00         7.84376E+01         1.00000E+00         3.50788E-10         7.84376E+01         2.15642E+00         7.62812E+01
+          2.19313E-02         1.38215E-03        -1.47895E-02         1.37798E+00         3.06167E-01         1.37806E+00         7.69229E+01         1.00000E+00         3.65930E-10         7.69229E+01         2.14092E+00         7.47820E+01
+          2.19313E-02         1.55197E-03        -1.48051E-02         1.37798E+00         3.16838E-01         1.37806E+00         7.53829E+01         1.00000E+00         3.80473E-10         7.53829E+01         2.12510E+00         7.32578E+01
+          2.19313E-02         1.72180E-03        -1.48226E-02         1.37798E+00         3.27508E-01         1.37806E+00         7.38199E+01         1.00000E+00         3.94328E-10         7.38199E+01         2.10898E+00         7.17109E+01
+          2.19313E-02         1.89163E-03        -1.48419E-02         1.37798E+00         3.38179E-01         1.37806E+00         7.22364E+01         1.00000E+00         4.07406E-10         7.22364E+01         2.09260E+00         7.01438E+01
+          2.19313E-02         2.06146E-03        -1.48629E-02         1.37798E+00         3.48849E-01         1.37806E+00         7.06350E+01         1.00000E+00         4.19622E-10         7.06350E+01         2.07596E+00         6.85590E+01
+          2.19313E-02         2.23128E-03        -1.48858E-02         1.37798E+00         3.59520E-01         1.37806E+00         6.90181E+01         1.00000E+00         4.30889E-10         6.90181E+01         2.05910E+00         6.69590E+01
+          2.19313E-02         2.40111E-03        -1.49105E-02         1.37798E+00         3.70190E-01         1.37806E+00         6.73881E+01         1.00000E+00         4.41125E-10         6.73881E+01         2.04203E+00         6.53460E+01
+          2.19313E-02         2.57094E-03        -1.49371E-02         1.37798E+00         3.80861E-01         1.37806E+00         6.57475E+01         1.00000E+00         4.50249E-10         6.57475E+01         2.02478E+00         6.37227E+01
+          2.19313E-02         2.74077E-03        -1.49654E-02         1.37798E+00         3.91532E-01         1.37806E+00         6.40987E+01         1.00000E+00         4.58181E-10         6.40987E+01         2.00737E+00         6.20913E+01
+          2.19313E-02         2.91059E-03        -1.49955E-02         1.37798E+00         4.02202E-01         1.37806E+00         6.24441E+01         1.00000E+00         4.64846E-10         6.24441E+01         1.98982E+00         6.04543E+01
+          2.19313E-02         3.08042E-03        -1.50275E-02         1.37798E+00         4.12873E-01         1.37806E+00         6.07861E+01         1.00000E+00         4.70168E-10         6.07861E+01         1.97216E+00         5.88140E+01
+          2.19313E-02         3.25025E-03        -1.50613E-02         1.37797E+00         4.23543E-01         1.37806E+00         5.91270E+01         1.00000E+00         4.74077E-10         5.91270E+01         1.95440E+00         5.71726E+01
+          2.19313E-02         3.42008E-03        -1.50968E-02         1.37797E+00         4.34214E-01         1.37806E+00         5.74692E+01         1.00000E+00         4.76504E-10         5.74692E+01         1.93657E+00         5.55326E+01
+          2.19313E-02         3.58990E-03        -1.51342E-02         1.37797E+00         4.44884E-01         1.37806E+00         5.58147E+01         1.00000E+00         4.77384E-10         5.58147E+01         1.91869E+00         5.38960E+01
+          2.19313E-02         3.75973E-03        -1.51734E-02         1.37797E+00         4.55555E-01         1.37806E+00         5.41659E+01         1.00000E+00         4.76656E-10         5.41659E+01         1.90078E+00         5.22651E+01
+          2.19313E-02         3.92956E-03        -1.52145E-02         1.37797E+00         4.66225E-01         1.37806E+00         5.25248E+01         1.00000E+00         4.74262E-10         5.25248E+01         1.88286E+00         5.06419E+01
+          2.19313E-02         4.09939E-03        -1.52573E-02         1.37797E+00         4.76896E-01         1.37805E+00         5.08936E+01         1.00000E+00         4.70148E-10         5.08936E+01         1.86496E+00         4.90286E+01
+          2.19313E-02         4.26921E-03        -1.53019E-02         1.37797E+00         4.87567E-01         1.37805E+00         4.92742E+01         1.00000E+00         4.64265E-10         4.92742E+01         1.84709E+00         4.74271E+01
+          2.19313E-02         4.43904E-03        -1.53484E-02         1.37797E+00         4.98237E-01         1.37805E+00         4.76686E+01         1.00000E+00         4.56571E-10         4.76686E+01         1.82927E+00         4.58393E+01
+          2.19313E-02         4.60887E-03        -1.53966E-02         1.37797E+00         5.08908E-01         1.37805E+00         4.60787E+01         1.00000E+00         4.47028E-10         4.60787E+01         1.81153E+00         4.42671E+01
+          2.19313E-02         4.77869E-03        -1.54467E-02         1.37797E+00         5.19578E-01         1.37805E+00         4.45062E+01         1.00000E+00         4.35605E-10         4.45062E+01         1.79387E+00         4.27123E+01
+          2.19313E-02         4.94852E-03        -1.54986E-02         1.37797E+00         5.30249E-01         1.37805E+00         4.29530E+01         1.00000E+00         4.22282E-10         4.29530E+01         1.77633E+00         4.11766E+01
+          2.19313E-02         5.11835E-03        -1.55523E-02         1.37796E+00         5.40919E-01         1.37805E+00         4.14205E+01         1.00000E+00         4.07047E-10         4.14205E+01         1.75891E+00         3.96616E+01
+          2.19313E-02         5.28818E-03        -1.56078E-02         1.37796E+00         5.51590E-01         1.37805E+00         3.99105E+01         1.00000E+00         3.89905E-10         3.99105E+01         1.74163E+00         3.81689E+01
+          2.19313E-02         5.45800E-03        -1.56651E-02         1.37796E+00         5.62261E-01         1.37805E+00         3.84244E+01         1.00000E+00         3.70877E-10         3.84244E+01         1.72452E+00         3.66999E+01
+          2.19313E-02         5.62783E-03        -1.57243E-02         1.37796E+00         5.72931E-01         1.37805E+00         3.69636E+01         1.00000E+00         3.50009E-10         3.69636E+01         1.70758E+00         3.52560E+01
+          2.19313E-02         5.79766E-03        -1.57852E-02         1.37796E+00         5.83602E-01         1.37805E+00         3.55294E+01         1.00000E+00         3.27382E-10         3.55294E+01         1.69083E+00         3.38386E+01
+          2.19313E-02         5.96749E-03        -1.58480E-02         1.37796E+00         5.94272E-01         1.37805E+00         3.41230E+01         1.00000E+00         3.03129E-10         3.41230E+01         1.67428E+00         3.24487E+01
+          2.19313E-02         6.13731E-03        -1.59125E-02         1.37796E+00         6.04943E-01         1.37805E+00         3.27456E+01         1.00000E+00         2.77467E-10         3.27456E+01         1.65795E+00         3.10877E+01
+          2.19313E-02         6.30714E-03        -1.59789E-02         1.37795E+00         6.15613E-01         1.37805E+00         3.13983E+01         1.00000E+00         2.50741E-10         3.13983E+01         1.64185E+00         2.97564E+01
+          2.19313E-02         6.47697E-03        -1.60471E-02         1.37795E+00         6.26284E-01         1.37805E+00         3.00819E+01         1.00000E+00         2.23518E-10         3.00819E+01         1.62600E+00         2.84559E+01
+          2.19313E-02         6.64680E-03        -1.61171E-02         1.37795E+00         6.36955E-01         1.37805E+00         2.87974E+01         1.00000E+00         1.96754E-10         2.87974E+01         1.61039E+00         2.71870E+01
+          2.19313E-02         6.81662E-03        -1.61889E-02         1.37795E+00         6.47625E-01         1.37804E+00         2.75455E+01         1.00000E+00         1.72080E-10         2.75455E+01         1.59504E+00         2.59504E+01
+          2.19313E-02         6.98645E-03        -1.62625E-02         1.37795E+00         6.58296E-01         1.37804E+00         2.63269E+01         1.00000E+00         1.52218E-10         2.63269E+01         1.57996E+00         2.47470E+01
+          2.19313E-02         7.15628E-03        -1.63380E-02         1.37795E+00         6.68966E-01         1.37804E+00         2.51423E+01         1.00000E+00         1.41145E-10         2.51423E+01         1.56515E+00         2.35772E+01
+          2.19313E-02         7.32611E-03        -1.64152E-02         1.37794E+00         6.79637E-01         1.37804E+00         2.39922E+01         1.00000E+00         1.42892E-10         2.39922E+01         1.55063E+00         2.24416E+01
+          2.19313E-02         7.49593E-03        -1.64943E-02         1.37794E+00         6.90307E-01         1.37804E+00         2.28770E+01         1.00000E+00         1.58818E-10         2.28770E+01         1.53640E+00         2.13406E+01
+          2.19313E-02         7.66576E-03        -1.65752E-02         1.37794E+00         7.00978E-01         1.37804E+00         2.17970E+01         1.00000E+00         1.86834E-10         2.17970E+01         1.52246E+00         2.02745E+01
+          2.19313E-02         7.83559E-03        -1.66579E-02         1.37794E+00         7.11649E-01         1.37804E+00         2.07525E+01         1.00000E+00         2.23695E-10         2.07525E+01         1.50882E+00         1.92437E+01
+          2.19313E-02         8.00542E-03        -1.67424E-02         1.37794E+00         7.22319E-01         1.37804E+00         1.97437E+01         1.00000E+00         2.66797E-10         1.97437E+01         1.49548E+00         1.82482E+01
+          2.19313E-02         8.17524E-03        -1.68287E-02         1.37794E+00         7.32990E-01         1.37804E+00         1.87707E+01         1.00000E+00         3.14442E-10         1.87707E+01         1.48244E+00         1.72882E+01
+          2.19313E-02         8.34507E-03        -1.69168E-02         1.37793E+00         7.43660E-01         1.37804E+00         1.78335E+01         1.00000E+00         3.65562E-10         1.78335E+01         1.46970E+00         1.63638E+01
+          2.19313E-02         8.51490E-03        -1.70067E-02         1.37793E+00         7.54331E-01         1.37804E+00         1.69321E+01         1.00000E+00         4.19455E-10         1.69321E+01         1.45726E+00         1.54749E+01
+          2.19313E-02         8.68473E-03        -1.70985E-02         1.37793E+00         7.65001E-01         1.37804E+00         1.60664E+01         1.00000E+00         4.75632E-10         1.60664E+01         1.44513E+00         1.46213E+01
+          2.19313E-02         8.85455E-03        -1.71920E-02         1.37793E+00         7.75672E-01         1.37804E+00         1.52361E+01         1.00000E+00         5.33716E-10         1.52361E+01         1.43329E+00         1.38028E+01
+          2.19313E-02         9.02438E-03        -1.72874E-02         1.37793E+00         7.86343E-01         1.37803E+00         1.44410E+01         1.00000E+00         5.93395E-10         1.44410E+01         1.42175E+00         1.30193E+01
+          2.19313E-02         9.19421E-03        -1.73846E-02         1.37792E+00         7.97013E-01         1.37803E+00         1.36809E+01         1.00000E+00         6.54394E-10         1.36809E+01         1.41050E+00         1.22704E+01
+          2.19313E-02         9.36403E-03        -1.74836E-02         1.37792E+00         8.07684E-01         1.37803E+00         1.29552E+01         1.00000E+00         7.16451E-10         1.29552E+01         1.39953E+00         1.15556E+01
+          2.19313E-02         9.53386E-03        -1.75844E-02         1.37792E+00         8.18354E-01         1.37803E+00         1.22635E+01         1.00000E+00         7.79311E-10         1.22635E+01         1.38885E+00         1.08746E+01
+          2.19313E-02         9.70369E-03        -1.76870E-02         1.37792E+00         8.29025E-01         1.37803E+00         1.16054E+01         1.00000E+00         8.42717E-10         1.16054E+01         1.37844E+00         1.02269E+01
+          2.19313E-02         9.87352E-03        -1.77914E-02         1.37791E+00         8.39695E-01         1.37803E+00         1.09803E+01         1.00000E+00         9.06408E-10         1.09803E+01         1.36830E+00         9.61197E+00
+          2.19313E-02         1.00433E-02        -1.78977E-02         1.37791E+00         8.50366E-01         1.37803E+00         1.03875E+01         1.00000E+00         9.70112E-10         1.03875E+01         1.35841E+00         9.02911E+00
+          2.19313E-02         1.02132E-02        -1.80057E-02         1.37791E+00         8.61037E-01         1.37803E+00         9.82652E+00         1.00000E+00         1.03354E-09         9.82652E+00         1.34878E+00         8.47774E+00
+          2.19313E-02         1.03830E-02        -1.81156E-02         1.37791E+00         8.71707E-01         1.37803E+00         9.29655E+00         1.00000E+00         1.09641E-09         9.29655E+00         1.33938E+00         7.95716E+00
+          2.19313E-02         1.05528E-02        -1.82273E-02         1.37791E+00         8.82378E-01         1.37803E+00         8.79688E+00         1.00000E+00         1.15841E-09         8.79688E+00         1.33022E+00         7.46666E+00
+          2.19313E-02         1.07227E-02        -1.83408E-02         1.37790E+00         8.93048E-01         1.37802E+00         8.32674E+00         1.00000E+00         1.21920E-09         8.32674E+00         1.32127E+00         7.00547E+00
+          2.19313E-02         1.08925E-02        -1.84561E-02         1.37790E+00         9.03719E-01         1.37802E+00         7.88533E+00         1.00000E+00         1.27846E-09         7.88533E+00         1.31253E+00         6.57280E+00
+          2.19313E-02         1.10623E-02        -1.85732E-02         1.37790E+00         9.14389E-01         1.37802E+00         7.47181E+00         1.00000E+00         1.33584E-09         7.47181E+00         1.30399E+00         6.16783E+00
+          2.19313E-02         1.12321E-02        -1.86921E-02         1.37789E+00         9.25060E-01         1.37802E+00         7.08533E+00         1.00000E+00         1.39097E-09         7.08533E+00         1.29563E+00         5.78970E+00
+          2.19313E-02         1.14020E-02        -1.88128E-02         1.37789E+00         9.35731E-01         1.37802E+00         6.72498E+00         1.00000E+00         1.44346E-09         6.72498E+00         1.28743E+00         5.43755E+00
+          2.19313E-02         1.15718E-02        -1.89354E-02         1.37789E+00         9.46401E-01         1.37802E+00         6.38988E+00         1.00000E+00         1.49294E-09         6.38988E+00         1.27940E+00         5.11048E+00
+          2.19313E-02         1.17416E-02        -1.90597E-02         1.37789E+00         9.57072E-01         1.37802E+00         6.07909E+00         1.00000E+00         1.53900E-09         6.07909E+00         1.27150E+00         4.80758E+00
+          2.19313E-02         1.19114E-02        -1.91859E-02         1.37788E+00         9.67742E-01         1.37802E+00         5.79167E+00         1.00000E+00         1.58122E-09         5.79167E+00         1.26373E+00         4.52794E+00
+          2.19313E-02         1.20813E-02        -1.93139E-02         1.37788E+00         9.78413E-01         1.37802E+00         5.52669E+00         1.00000E+00         1.61918E-09         5.52669E+00         1.25608E+00         4.27061E+00
+          2.19313E-02         1.22511E-02        -1.94437E-02         1.37788E+00         9.89083E-01         1.37802E+00         5.28317E+00         1.00000E+00         1.65245E-09         5.28317E+00         1.24853E+00         4.03465E+00
+          2.19313E-02         1.24209E-02        -1.95753E-02         1.37788E+00         9.99754E-01         1.37801E+00         5.06017E+00         1.00000E+00         1.68060E-09         5.06017E+00         1.24106E+00         3.81911E+00
+          2.19313E-02         1.25908E-02        -1.97087E-02         1.37787E+00         1.01042E+00         1.37801E+00         4.85671E+00         1.00000E+00         1.70318E-09         4.85671E+00         1.23365E+00         3.62305E+00
+          2.19313E-02         1.27606E-02        -1.98440E-02         1.37787E+00         1.02110E+00         1.37801E+00         4.67182E+00         1.00000E+00         1.71975E-09         4.67182E+00         1.22631E+00         3.44552E+00
+          2.19313E-02         1.29304E-02        -1.99810E-02         1.37787E+00         1.03177E+00         1.37801E+00         4.50456E+00         1.00000E+00         1.72987E-09         4.50456E+00         1.21900E+00         3.28556E+00
+          2.19313E-02         1.31002E-02        -2.01199E-02         1.37786E+00         1.04244E+00         1.37801E+00         4.35395E+00         1.00000E+00         1.73310E-09         4.35395E+00         1.21172E+00         3.14223E+00
+          2.19313E-02         1.32701E-02        -2.02606E-02         1.37786E+00         1.05311E+00         1.37801E+00         4.21905E+00         1.00000E+00         1.72902E-09         4.21905E+00         1.20444E+00         3.01461E+00
+          2.19313E-02         1.34399E-02        -2.04030E-02         1.37786E+00         1.06378E+00         1.37801E+00         4.09892E+00         1.00000E+00         1.71720E-09         4.09892E+00         1.19716E+00         2.90176E+00
+          2.19313E-02         1.36097E-02        -2.05473E-02         1.37785E+00         1.07445E+00         1.37801E+00         3.99264E+00         1.00000E+00         1.69725E-09         3.99264E+00         1.18987E+00         2.80277E+00
+          2.19313E-02         1.37795E-02        -2.06934E-02         1.37785E+00         1.08512E+00         1.37801E+00         3.89928E+00         1.00000E+00         1.66878E-09         3.89928E+00         1.18253E+00         2.71674E+00
+          2.19313E-02         1.39494E-02        -2.08414E-02         1.37785E+00         1.09579E+00         1.37801E+00         3.81794E+00         1.00000E+00         1.63146E-09         3.81794E+00         1.17515E+00         2.64279E+00
+          2.19313E-02         1.41192E-02        -2.09911E-02         1.37784E+00         1.10646E+00         1.37800E+00         3.74776E+00         1.00000E+00         1.58497E-09         3.74776E+00         1.16771E+00         2.58005E+00
+          2.19313E-02         1.42890E-02        -2.11426E-02         1.37784E+00         1.11713E+00         1.37800E+00         3.68787E+00         1.00000E+00         1.52907E-09         3.68787E+00         1.16020E+00         2.52767E+00
+          2.19313E-02         1.44589E-02        -2.12960E-02         1.37784E+00         1.12780E+00         1.37800E+00         3.63742E+00         1.00000E+00         1.46358E-09         3.63742E+00         1.15260E+00         2.48482E+00
+          2.19313E-02         1.46287E-02        -2.14512E-02         1.37783E+00         1.13847E+00         1.37800E+00         3.59560E+00         1.00000E+00         1.38844E-09         3.59560E+00         1.14489E+00         2.45071E+00
+          2.19313E-02         1.47985E-02        -2.16081E-02         1.37783E+00         1.14914E+00         1.37800E+00         3.56162E+00         1.00000E+00         1.30371E-09         3.56162E+00         1.13708E+00         2.42454E+00
+          2.19313E-02         1.49683E-02        -2.17669E-02         1.37783E+00         1.15981E+00         1.37800E+00         3.53471E+00         1.00000E+00         1.20970E-09         3.53471E+00         1.12914E+00         2.40557E+00
+          2.19313E-02         1.51382E-02        -2.19275E-02         1.37782E+00         1.17048E+00         1.37800E+00         3.51412E+00         1.00000E+00         1.10706E-09         3.51412E+00         1.12108E+00         2.39305E+00
+          2.19313E-02         1.53080E-02        -2.20900E-02         1.37782E+00         1.18115E+00         1.37800E+00         3.49914E+00         1.00000E+00         9.97040E-10         3.49914E+00         1.11286E+00         2.38628E+00
+          2.19313E-02         1.54778E-02        -2.22542E-02         1.37782E+00         1.19182E+00         1.37800E+00         3.48909E+00         1.00000E+00         8.81935E-10         3.48909E+00         1.10450E+00         2.38459E+00
+          2.19313E-02         1.56476E-02        -2.24202E-02         1.37781E+00         1.20249E+00         1.37800E+00         3.48329E+00         1.00000E+00         7.66002E-10         3.48329E+00         1.09597E+00         2.38732E+00
+          2.19313E-02         1.58175E-02        -2.25881E-02         1.37781E+00         1.21317E+00         1.37799E+00         3.48113E+00         1.00000E+00         6.57290E-10         3.48113E+00         1.08727E+00         2.39385E+00
+          2.19313E-02         1.59873E-02        -2.27578E-02         1.37781E+00         1.22384E+00         1.37799E+00         3.48199E+00         1.00000E+00         5.70722E-10         3.48199E+00         1.07840E+00         2.40359E+00
+          2.19313E-02         1.61571E-02        -2.29292E-02         1.37780E+00         1.23451E+00         1.37799E+00         3.48532E+00         1.00000E+00         5.29968E-10         3.48532E+00         1.06934E+00         2.41597E+00
+          2.19313E-02         1.63270E-02        -2.31025E-02         1.37780E+00         1.24518E+00         1.37799E+00         3.49056E+00         1.00000E+00         5.57935E-10         3.49056E+00         1.06010E+00         2.43047E+00
+          2.19313E-02         1.64968E-02        -2.32776E-02         1.37779E+00         1.25585E+00         1.37799E+00         3.49722E+00         1.00000E+00         6.56880E-10         3.49722E+00         1.05065E+00         2.44656E+00
+          2.19313E-02         1.66666E-02        -2.34546E-02         1.37779E+00         1.26652E+00         1.37799E+00         3.50480E+00         1.00000E+00         8.10211E-10         3.50480E+00         1.04101E+00         2.46379E+00
+          2.19313E-02         1.68364E-02        -2.36333E-02         1.37779E+00         1.27719E+00         1.37799E+00         3.51287E+00         1.00000E+00         1.00070E-09         3.51287E+00         1.03117E+00         2.48170E+00
+          2.19313E-02         1.70063E-02        -2.38138E-02         1.37778E+00         1.28786E+00         1.37799E+00         3.52100E+00         1.00000E+00         1.21722E-09         3.52100E+00         1.02112E+00         2.49989E+00
+          2.19313E-02         1.71761E-02        -2.39962E-02         1.37778E+00         1.29853E+00         1.37799E+00         3.52881E+00         1.00000E+00         1.45332E-09         3.52881E+00         1.01086E+00         2.51795E+00
+          2.19313E-02         1.73459E-02        -2.41804E-02         1.37777E+00         1.30920E+00         1.37799E+00         3.53594E+00         1.00000E+00         1.70513E-09         3.53594E+00         1.00039E+00         2.53555E+00
+          2.19313E-02         1.75158E-02        -2.43663E-02         1.37777E+00         1.31987E+00         1.37799E+00         3.54207E+00         1.00000E+00         1.97008E-09         3.54207E+00         9.89718E-01         2.55235E+00
+          2.19313E-02         1.76856E-02        -2.45541E-02         1.37777E+00         1.33054E+00         1.37799E+00         3.54688E+00         1.00000E+00         2.24628E-09         3.54688E+00         9.78833E-01         2.56805E+00
+          2.19313E-02         1.78554E-02        -2.47437E-02         1.37776E+00         1.34121E+00         1.37798E+00         3.55012E+00         1.00000E+00         2.53217E-09         3.55012E+00         9.67741E-01         2.58238E+00
+          2.19313E-02         1.80252E-02        -2.49352E-02         1.37776E+00         1.35188E+00         1.37798E+00         3.55154E+00         1.00000E+00         2.82637E-09         3.55154E+00         9.56442E-01         2.59510E+00
+          2.19313E-02         1.81951E-02        -2.51284E-02         1.37775E+00         1.36255E+00         1.37798E+00         3.55093E+00         1.00000E+00         3.12757E-09         3.55093E+00         9.44940E-01         2.60599E+00
+          2.19313E-02         1.83649E-02        -2.53234E-02         1.37775E+00         1.37322E+00         1.37798E+00         3.54810E+00         1.00000E+00         3.43445E-09         3.54810E+00         9.33237E-01         2.61486E+00
+          2.19313E-02         1.85347E-02        -2.55203E-02         1.37775E+00         1.38389E+00         1.37798E+00         3.54289E+00         1.00000E+00         3.74567E-09         3.54289E+00         9.21339E-01         2.62155E+00
+          2.19313E-02         1.87045E-02        -2.57190E-02         1.37774E+00         1.39457E+00         1.37798E+00         3.53517E+00         1.00000E+00         4.05988E-09         3.53517E+00         9.09250E-01         2.62592E+00
+          2.19313E-02         1.88744E-02        -2.59194E-02         1.37774E+00         1.40524E+00         1.37798E+00         3.52482E+00         1.00000E+00         4.37562E-09         3.52482E+00         8.96975E-01         2.62784E+00
+          2.19313E-02         1.90442E-02        -2.61217E-02         1.37773E+00         1.41591E+00         1.37798E+00         3.51176E+00         1.00000E+00         4.69140E-09         3.51176E+00         8.84521E-01         2.62724E+00
+          2.19313E-02         1.92140E-02        -2.63258E-02         1.37773E+00         1.42658E+00         1.37798E+00         3.49593E+00         1.00000E+00         5.00566E-09         3.49593E+00         8.71894E-01         2.62404E+00
+          2.19313E-02         1.93839E-02        -2.65318E-02         1.37772E+00         1.43725E+00         1.37798E+00         3.47728E+00         1.00000E+00         5.31675E-09         3.47728E+00         8.59101E-01         2.61818E+00
+          2.19313E-02         1.95537E-02        -2.67395E-02         1.37772E+00         1.44792E+00         1.37798E+00         3.45579E+00         1.00000E+00         5.62298E-09         3.45579E+00         8.46151E-01         2.60964E+00
+          2.19313E-02         1.97235E-02        -2.69490E-02         1.37771E+00         1.45859E+00         1.37798E+00         3.43147E+00         1.00000E+00         5.92257E-09         3.43147E+00         8.33052E-01         2.59841E+00
+          2.19313E-02         1.98933E-02        -2.71604E-02         1.37771E+00         1.46926E+00         1.37798E+00         3.40432E+00         1.00000E+00         6.21367E-09         3.40432E+00         8.19813E-01         2.58451E+00
+          2.19313E-02         2.00632E-02        -2.73736E-02         1.37770E+00         1.47993E+00         1.37798E+00         3.37439E+00         1.00000E+00         6.49440E-09         3.37439E+00         8.06443E-01         2.56795E+00
+          2.19313E-02         2.02330E-02        -2.75885E-02         1.37770E+00         1.49060E+00         1.37798E+00         3.34173E+00         1.00000E+00         6.76280E-09         3.34173E+00         7.92952E-01         2.54877E+00
+          2.19313E-02         2.04028E-02        -2.78053E-02         1.37770E+00         1.50127E+00         1.37798E+00         3.30640E+00         1.00000E+00         7.01686E-09         3.30640E+00         7.79351E-01         2.52705E+00
+          2.19313E-02         2.05726E-02        -2.80240E-02         1.37769E+00         1.51194E+00         1.37798E+00         3.26850E+00         1.00000E+00         7.25454E-09         3.26850E+00         7.65650E-01         2.50285E+00
+          2.19313E-02         2.07425E-02        -2.82444E-02         1.37769E+00         1.52261E+00         1.37797E+00         3.22811E+00         1.00000E+00         7.47375E-09         3.22811E+00         7.51860E-01         2.47625E+00
+          2.19313E-02         2.09123E-02        -2.84666E-02         1.37768E+00         1.53328E+00         1.37797E+00         3.18535E+00         1.00000E+00         7.67240E-09         3.18535E+00         7.37993E-01         2.44736E+00
+          2.19313E-02         2.10821E-02        -2.86907E-02         1.37768E+00         1.54395E+00         1.37797E+00         3.14034E+00         1.00000E+00         7.84835E-09         3.14034E+00         7.24059E-01         2.41628E+00
+          2.19313E-02         2.12520E-02        -2.89165E-02         1.37767E+00         1.55462E+00         1.37797E+00         3.09321E+00         1.00000E+00         7.99947E-09         3.09321E+00         7.10070E-01         2.38314E+00
+          2.19313E-02         2.14218E-02        -2.91442E-02         1.37767E+00         1.56529E+00         1.37797E+00         3.04411E+00         1.00000E+00         8.12365E-09         3.04411E+00         6.96039E-01         2.34807E+00
+          2.19313E-02         2.15916E-02        -2.93737E-02         1.37766E+00         1.57596E+00         1.37797E+00         2.99318E+00         1.00000E+00         8.21877E-09         2.99318E+00         6.81978E-01         2.31120E+00
+          2.19313E-02         2.17614E-02        -2.96050E-02         1.37766E+00         1.58664E+00         1.37797E+00         2.94058E+00         1.00000E+00         8.28276E-09         2.94058E+00         6.67897E-01         2.27268E+00
+          2.19313E-02         2.19313E-02        -2.98381E-02         1.37765E+00         1.59731E+00         1.37797E+00         2.88647E+00         1.00000E+00         8.31359E-09         2.88647E+00         6.53811E-01         2.23266E+00
+          2.19313E-02         2.21011E-02        -3.00730E-02         1.37765E+00         1.60798E+00         1.37797E+00         2.83103E+00         1.00000E+00         8.30929E-09         2.83103E+00         6.39730E-01         2.19130E+00
+          2.19313E-02         2.22709E-02        -3.03098E-02         1.37764E+00         1.61865E+00         1.37797E+00         2.77443E+00         1.00000E+00         8.26798E-09         2.77443E+00         6.25667E-01         2.14876E+00
+          2.19313E-02         2.24407E-02        -3.05483E-02         1.37763E+00         1.62932E+00         1.37797E+00         2.71684E+00         1.00000E+00         8.18787E-09         2.71684E+00         6.11634E-01         2.10520E+00
+          2.19313E-02         2.26106E-02        -3.07887E-02         1.37763E+00         1.63999E+00         1.37797E+00         2.65844E+00         1.00000E+00         8.06731E-09         2.65844E+00         5.97642E-01         2.06080E+00
+          2.19313E-02         2.27804E-02        -3.10308E-02         1.37762E+00         1.65066E+00         1.37797E+00         2.59942E+00         1.00000E+00         7.90479E-09         2.59942E+00         5.83705E-01         2.01571E+00
+          2.19313E-02         2.29502E-02        -3.12748E-02         1.37762E+00         1.66133E+00         1.37797E+00         2.53995E+00         1.00000E+00         7.69899E-09         2.53995E+00         5.69833E-01         1.97012E+00
+          2.19313E-02         2.31201E-02        -3.15206E-02         1.37761E+00         1.67200E+00         1.37797E+00         2.48023E+00         1.00000E+00         7.44885E-09         2.48023E+00         5.56039E-01         1.92419E+00
+          2.19313E-02         2.32899E-02        -3.17683E-02         1.37761E+00         1.68267E+00         1.37797E+00         2.42042E+00         1.00000E+00         7.15356E-09         2.42042E+00         5.42332E-01         1.87809E+00
+          2.19313E-02         2.34597E-02        -3.20177E-02         1.37760E+00         1.69334E+00         1.37797E+00         2.36071E+00         1.00000E+00         6.81273E-09         2.36071E+00         5.28725E-01         1.83199E+00
+          2.19313E-02         2.36295E-02        -3.22689E-02         1.37760E+00         1.70401E+00         1.37798E+00         2.30128E+00         1.00000E+00         6.42647E-09         2.30128E+00         5.15228E-01         1.78606E+00
+          2.19313E-02         2.37994E-02        -3.25220E-02         1.37759E+00         1.71468E+00         1.37798E+00         2.24230E+00         1.00000E+00         5.99559E-09         2.24230E+00         5.01851E-01         1.74045E+00
+          2.19313E-02         2.39692E-02        -3.27769E-02         1.37759E+00         1.72535E+00         1.37798E+00         2.18393E+00         1.00000E+00         5.52196E-09         2.18393E+00         4.88606E-01         1.69533E+00
+          2.19313E-02         2.41390E-02        -3.30335E-02         1.37758E+00         1.73602E+00         1.37798E+00         2.12635E+00         1.00000E+00         5.00912E-09         2.12635E+00         4.75500E-01         1.65085E+00
+          2.19313E-02         2.43088E-02        -3.32920E-02         1.37757E+00         1.74669E+00         1.37798E+00         2.06971E+00         1.00000E+00         4.46341E-09         2.06971E+00         4.62544E-01         1.60717E+00
+          2.19313E-02         2.44787E-02        -3.35524E-02         1.37757E+00         1.75736E+00         1.37798E+00         2.01417E+00         1.00000E+00         3.89624E-09         2.01417E+00         4.49747E-01         1.56442E+00
+          2.19313E-02         2.46485E-02        -3.38145E-02         1.37756E+00         1.76804E+00         1.37798E+00         1.95987E+00         1.00000E+00         3.32891E-09         1.95987E+00         4.37117E-01         1.52275E+00
+          2.19313E-02         2.48183E-02        -3.40784E-02         1.37756E+00         1.77871E+00         1.37798E+00         1.90695E+00         1.00000E+00         2.80273E-09         1.90695E+00         4.24662E-01         1.48229E+00
+          2.19313E-02         2.49882E-02        -3.43442E-02         1.37755E+00         1.78938E+00         1.37798E+00         1.85555E+00         1.00000E+00         2.39701E-09         1.85555E+00         4.12391E-01         1.44316E+00
+          2.19313E-02         2.51580E-02        -3.46117E-02         1.37755E+00         1.80005E+00         1.37798E+00         1.80579E+00         1.00000E+00         2.23766E-09         1.80579E+00         4.00310E-01         1.40548E+00
+          2.19313E-02         2.53278E-02        -3.48811E-02         1.37754E+00         1.81072E+00         1.37798E+00         1.75779E+00         1.00000E+00         2.42926E-09         1.75779E+00         3.88425E-01         1.36936E+00
+          2.19313E-02         2.54976E-02        -3.51523E-02         1.37753E+00         1.82139E+00         1.37798E+00         1.71166E+00         1.00000E+00         2.94833E-09         1.71166E+00         3.76744E-01         1.33491E+00
+          2.19313E-02         2.56675E-02        -3.54253E-02         1.37753E+00         1.83206E+00         1.37798E+00         1.66749E+00         1.00000E+00         3.69383E-09         1.66749E+00         3.65272E-01         1.30222E+00
+          2.19313E-02         2.58373E-02        -3.57001E-02         1.37752E+00         1.84273E+00         1.37798E+00         1.62538E+00         1.00000E+00         4.58400E-09         1.62538E+00         3.54014E-01         1.27137E+00
+          2.19313E-02         2.60071E-02        -3.59767E-02         1.37752E+00         1.85340E+00         1.37799E+00         1.58542E+00         1.00000E+00         5.57170E-09         1.58542E+00         3.42975E-01         1.24244E+00
+          2.19313E-02         2.61769E-02        -3.62552E-02         1.37751E+00         1.86407E+00         1.37799E+00         1.54766E+00         1.00000E+00         6.63054E-09         1.54766E+00         3.32159E-01         1.21550E+00
+          2.21011E-02         8.72665E-04        -1.49884E-02         1.38865E+00         2.74155E-01         1.38873E+00         7.95672E+01         1.00000E+00         2.47870E-10         7.95672E+01         2.45194E+00         7.71152E+01
+          2.21011E-02         1.04249E-03        -1.49986E-02         1.38865E+00         2.84826E-01         1.38873E+00         7.81443E+01         1.00000E+00         2.59471E-10         7.81443E+01         2.42862E+00         7.57157E+01
+          2.21011E-02         1.21232E-03        -1.50106E-02         1.38865E+00         2.95496E-01         1.38873E+00         7.66919E+01         1.00000E+00         2.70712E-10         7.66919E+01         2.40477E+00         7.42871E+01
+          2.21011E-02         1.38215E-03        -1.50244E-02         1.38865E+00         3.06167E-01         1.38873E+00         7.52122E+01         1.00000E+00         2.81515E-10         7.52122E+01         2.38040E+00         7.28318E+01
+          2.21011E-02         1.55197E-03        -1.50401E-02         1.38865E+00         3.16838E-01         1.38873E+00         7.37077E+01         1.00000E+00         2.91802E-10         7.37077E+01         2.35555E+00         7.13522E+01
+          2.21011E-02         1.72180E-03        -1.50576E-02         1.38865E+00         3.27508E-01         1.38873E+00         7.21808E+01         1.00000E+00         3.01496E-10         7.21808E+01         2.33026E+00         6.98505E+01
+          2.21011E-02         1.89163E-03        -1.50768E-02         1.38865E+00         3.38179E-01         1.38873E+00         7.06339E+01         1.00000E+00         3.10524E-10         7.06339E+01         2.30458E+00         6.83293E+01
+          2.21011E-02         2.06146E-03        -1.50979E-02         1.38865E+00         3.48849E-01         1.38873E+00         6.90693E+01         1.00000E+00         3.18814E-10         6.90693E+01         2.27852E+00         6.67908E+01
+          2.21011E-02         2.23128E-03        -1.51208E-02         1.38865E+00         3.59520E-01         1.38873E+00         6.74895E+01         1.00000E+00         3.26297E-10         6.74895E+01         2.25213E+00         6.52374E+01
+          2.21011E-02         2.40111E-03        -1.51455E-02         1.38865E+00         3.70190E-01         1.38873E+00         6.58970E+01         1.00000E+00         3.32905E-10         6.58970E+01         2.22546E+00         6.36715E+01
+          2.21011E-02         2.57094E-03        -1.51720E-02         1.38865E+00         3.80861E-01         1.38873E+00         6.42940E+01         1.00000E+00         3.38574E-10         6.42940E+01         2.19852E+00         6.20955E+01
+          2.21011E-02         2.74077E-03        -1.52004E-02         1.38865E+00         3.91532E-01         1.38873E+00         6.26830E+01         1.00000E+00         3.43242E-10         6.26830E+01         2.17137E+00         6.05117E+01
+          2.21011E-02         2.91059E-03        -1.52305E-02         1.38865E+00         4.02202E-01         1.38873E+00         6.10663E+01         1.00000E+00         3.46851E-10         6.10663E+01         2.14405E+00         5.89223E+01
+          2.21011E-02         3.08042E-03        -1.52625E-02         1.38865E+00         4.12873E-01         1.38873E+00         5.94462E+01         1.00000E+00         3.49343E-10         5.94462E+01         2.11658E+00         5.73297E+01
+          2.21011E-02         3.25025E-03        -1.52962E-02         1.38865E+00         4.23543E-01         1.38873E+00         5.78250E+01         1.00000E+00         3.50668E-10         5.78250E+01         2.08900E+00         5.57360E+01
+          2.21011E-02         3.42008E-03        -1.53318E-02         1.38864E+00         4.34214E-01         1.38873E+00         5.62049E+01         1.00000E+00         3.50775E-10         5.62049E+01         2.06136E+00         5.41435E+01
+          2.21011E-02         3.58990E-03        -1.53692E-02         1.38864E+00         4.44884E-01         1.38873E+00         5.45881E+01         1.00000E+00         3.49621E-10         5.45881E+01         2.03369E+00         5.25544E+01
+          2.21011E-02         3.75973E-03        -1.54084E-02         1.38864E+00         4.55555E-01         1.38873E+00         5.29767E+01         1.00000E+00         3.47166E-10         5.29767E+01         2.00603E+00         5.09706E+01
+          2.21011E-02         3.92956E-03        -1.54494E-02         1.38864E+00         4.66225E-01         1.38873E+00         5.13728E+01         1.00000E+00         3.43372E-10         5.13728E+01         1.97841E+00         4.93944E+01
+          2.21011E-02         4.09939E-03        -1.54923E-02         1.38864E+00         4.76896E-01         1.38873E+00         4.97785E+01         1.00000E+00         3.38212E-10         4.97785E+01         1.95087E+00         4.78276E+01
+          2.21011E-02         4.26921E-03        -1.55369E-02         1.38864E+00         4.87567E-01         1.38873E+00         4.81956E+01         1.00000E+00         3.31660E-10         4.81956E+01         1.92344E+00         4.62722E+01
+          2.21011E-02         4.43904E-03        -1.55834E-02         1.38864E+00         4.98237E-01         1.38873E+00         4.66262E+01         1.00000E+00         3.23702E-10         4.66262E+01         1.89616E+00         4.47300E+01
+          2.21011E-02         4.60887E-03        -1.56316E-02         1.38864E+00         5.08908E-01         1.38873E+00         4.50720E+01         1.00000E+00         3.14331E-10         4.50720E+01         1.86907E+00         4.32029E+01
+          2.21011E-02         4.77869E-03        -1.56817E-02         1.38864E+00         5.19578E-01         1.38873E+00         4.35348E+01         1.00000E+00         3.03551E-10         4.35348E+01         1.84218E+00         4.16926E+01
+          2.21011E-02         4.94852E-03        -1.57336E-02         1.38864E+00         5.30249E-01         1.38872E+00         4.20163E+01         1.00000E+00         2.91382E-10         4.20163E+01         1.81554E+00         4.02007E+01
+          2.21011E-02         5.11835E-03        -1.57873E-02         1.38863E+00         5.40919E-01         1.38872E+00         4.05180E+01         1.00000E+00         2.77862E-10         4.05180E+01         1.78918E+00         3.87288E+01
+          2.21011E-02         5.28818E-03        -1.58428E-02         1.38863E+00         5.51590E-01         1.38872E+00         3.90416E+01         1.00000E+00         2.63057E-10         3.90416E+01         1.76313E+00         3.72785E+01
+          2.21011E-02         5.45800E-03        -1.59001E-02         1.38863E+00         5.62261E-01         1.38872E+00         3.75885E+01         1.00000E+00         2.47070E-10         3.75885E+01         1.73741E+00         3.58510E+01
+          2.21011E-02         5.62783E-03        -1.59592E-02         1.38863E+00         5.72931E-01         1.38872E+00         3.61599E+01         1.00000E+00         2.30058E-10         3.61599E+01         1.71206E+00         3.44479E+01
+          2.21011E-02         5.79766E-03        -1.60202E-02         1.38863E+00         5.83602E-01         1.38872E+00         3.47574E+01         1.00000E+00         2.12261E-10         3.47574E+01         1.68709E+00         3.30703E+01
+          2.21011E-02         5.96749E-03        -1.60829E-02         1.38863E+00         5.94272E-01         1.38872E+00         3.33819E+01         1.00000E+00         1.94046E-10         3.33819E+01         1.66254E+00         3.17193E+01
+          2.21011E-02         6.13731E-03        -1.61475E-02         1.38863E+00         6.04943E-01         1.38872E+00         3.20346E+01         1.00000E+00         1.75982E-10         3.20346E+01         1.63843E+00         3.03962E+01
+          2.21011E-02         6.30714E-03        -1.62139E-02         1.38862E+00         6.15613E-01         1.38872E+00         3.07167E+01         1.00000E+00         1.58950E-10         3.07167E+01         1.61478E+00         2.91019E+01
+          2.21011E-02         6.47697E-03        -1.62821E-02         1.38862E+00         6.26284E-01         1.38872E+00         2.94289E+01         1.00000E+00         1.44290E-10         2.94289E+01         1.59162E+00         2.78373E+01
+          2.21011E-02         6.64680E-03        -1.63521E-02         1.38862E+00         6.36955E-01         1.38872E+00         2.81722E+01         1.00000E+00         1.33892E-10         2.81722E+01         1.56895E+00         2.66032E+01
+          2.21011E-02         6.81662E-03        -1.64239E-02         1.38862E+00         6.47625E-01         1.38872E+00         2.69472E+01         1.00000E+00         1.29974E-10         2.69472E+01         1.54680E+00         2.54004E+01
+          2.21011E-02         6.98645E-03        -1.64975E-02         1.38862E+00         6.58296E-01         1.38872E+00         2.57548E+01         1.00000E+00         1.34288E-10         2.57548E+01         1.52519E+00         2.42297E+01
+          2.21011E-02         7.15628E-03        -1.65730E-02         1.38862E+00         6.68966E-01         1.38872E+00         2.45955E+01         1.00000E+00         1.47202E-10         2.45955E+01         1.50413E+00         2.30914E+01
+          2.21011E-02         7.32611E-03        -1.66502E-02         1.38862E+00         6.79637E-01         1.38872E+00         2.34698E+01         1.00000E+00         1.67698E-10         2.34698E+01         1.48364E+00         2.19862E+01
+          2.21011E-02         7.49593E-03        -1.67293E-02         1.38861E+00         6.90307E-01         1.38871E+00         2.23782E+01         1.00000E+00         1.94213E-10         2.23782E+01         1.46372E+00         2.09145E+01
+          2.21011E-02         7.66576E-03        -1.68101E-02         1.38861E+00         7.00978E-01         1.38871E+00         2.13209E+01         1.00000E+00         2.25328E-10         2.13209E+01         1.44439E+00         1.98765E+01
+          2.21011E-02         7.83559E-03        -1.68928E-02         1.38861E+00         7.11649E-01         1.38871E+00         2.02983E+01         1.00000E+00         2.59983E-10         2.02983E+01         1.42565E+00         1.88726E+01
+          2.21011E-02         8.00542E-03        -1.69773E-02         1.38861E+00         7.22319E-01         1.38871E+00         1.93104E+01         1.00000E+00         2.97426E-10         1.93104E+01         1.40751E+00         1.79029E+01
+          2.21011E-02         8.17524E-03        -1.70636E-02         1.38861E+00         7.32990E-01         1.38871E+00         1.83575E+01         1.00000E+00         3.37127E-10         1.83575E+01         1.38998E+00         1.69676E+01
+          2.21011E-02         8.34507E-03        -1.71518E-02         1.38860E+00         7.43660E-01         1.38871E+00         1.74396E+01         1.00000E+00         3.78690E-10         1.74396E+01         1.37306E+00         1.60666E+01
+          2.21011E-02         8.51490E-03        -1.72417E-02         1.38860E+00         7.54331E-01         1.38871E+00         1.65566E+01         1.00000E+00         4.21806E-10         1.65566E+01         1.35675E+00         1.51999E+01
+          2.21011E-02         8.68473E-03        -1.73334E-02         1.38860E+00         7.65001E-01         1.38871E+00         1.57084E+01         1.00000E+00         4.66218E-10         1.57084E+01         1.34106E+00         1.43673E+01
+          2.21011E-02         8.85455E-03        -1.74270E-02         1.38860E+00         7.75672E-01         1.38871E+00         1.48948E+01         1.00000E+00         5.11699E-10         1.48948E+01         1.32597E+00         1.35688E+01
+          2.21011E-02         9.02438E-03        -1.75224E-02         1.38860E+00         7.86343E-01         1.38871E+00         1.41156E+01         1.00000E+00         5.58037E-10         1.41156E+01         1.31150E+00         1.28041E+01
+          2.21011E-02         9.19421E-03        -1.76196E-02         1.38859E+00         7.97013E-01         1.38871E+00         1.33705E+01         1.00000E+00         6.05029E-10         1.33705E+01         1.29762E+00         1.20728E+01
+          2.21011E-02         9.36403E-03        -1.77185E-02         1.38859E+00         8.07684E-01         1.38870E+00         1.26590E+01         1.00000E+00         6.52474E-10         1.26590E+01         1.28434E+00         1.13747E+01
+          2.21011E-02         9.53386E-03        -1.78194E-02         1.38859E+00         8.18354E-01         1.38870E+00         1.19808E+01         1.00000E+00         7.00167E-10         1.19808E+01         1.27165E+00         1.07092E+01
+          2.21011E-02         9.70369E-03        -1.79220E-02         1.38859E+00         8.29025E-01         1.38870E+00         1.13354E+01         1.00000E+00         7.47899E-10         1.13354E+01         1.25954E+00         1.00759E+01
+          2.21011E-02         9.87352E-03        -1.80264E-02         1.38858E+00         8.39695E-01         1.38870E+00         1.07222E+01         1.00000E+00         7.95455E-10         1.07222E+01         1.24800E+00         9.47423E+00
+          2.21011E-02         1.00433E-02        -1.81326E-02         1.38858E+00         8.50366E-01         1.38870E+00         1.01407E+01         1.00000E+00         8.42610E-10         1.01407E+01         1.23701E+00         8.90369E+00
+          2.21011E-02         1.02132E-02        -1.82407E-02         1.38858E+00         8.61037E-01         1.38870E+00         9.59021E+00         1.00000E+00         8.89130E-10         9.59021E+00         1.22657E+00         8.36364E+00
+          2.21011E-02         1.03830E-02        -1.83506E-02         1.38858E+00         8.71707E-01         1.38870E+00         9.07007E+00         1.00000E+00         9.34772E-10         9.07007E+00         1.21665E+00         7.85342E+00
+          2.21011E-02         1.05528E-02        -1.84622E-02         1.38858E+00         8.82378E-01         1.38870E+00         8.57958E+00         1.00000E+00         9.79283E-10         8.57958E+00         1.20725E+00         7.37233E+00
+          2.21011E-02         1.07227E-02        -1.85757E-02         1.38857E+00         8.93048E-01         1.38870E+00         8.11798E+00         1.00000E+00         1.02240E-09         8.11798E+00         1.19834E+00         6.91964E+00
+          2.21011E-02         1.08925E-02        -1.86910E-02         1.38857E+00         9.03719E-01         1.38870E+00         7.68450E+00         1.00000E+00         1.06385E-09         7.68450E+00         1.18991E+00         6.49459E+00
+          2.21011E-02         1.10623E-02        -1.88081E-02         1.38857E+00         9.14389E-01         1.38869E+00         7.27833E+00         1.00000E+00         1.10335E-09         7.27833E+00         1.18193E+00         6.09640E+00
+          2.21011E-02         1.12321E-02        -1.89271E-02         1.38856E+00         9.25060E-01         1.38869E+00         6.89863E+00         1.00000E+00         1.14060E-09         6.89863E+00         1.17439E+00         5.72424E+00
+          2.21011E-02         1.14020E-02        -1.90478E-02         1.38856E+00         9.35731E-01         1.38869E+00         6.54455E+00         1.00000E+00         1.17531E-09         6.54455E+00         1.16726E+00         5.37729E+00
+          2.21011E-02         1.15718E-02        -1.91704E-02         1.38856E+00         9.46401E-01         1.38869E+00         6.21521E+00         1.00000E+00         1.20717E-09         6.21521E+00         1.16053E+00         5.05468E+00
+          2.21011E-02         1.17416E-02        -1.92947E-02         1.38856E+00         9.57072E-01         1.38869E+00         5.90971E+00         1.00000E+00         1.23586E-09         5.90971E+00         1.15416E+00         4.75555E+00
+          2.21011E-02         1.19114E-02        -1.94209E-02         1.38855E+00         9.67742E-01         1.38869E+00         5.62714E+00         1.00000E+00         1.26105E-09         5.62714E+00         1.14814E+00         4.47900E+00
+          2.21011E-02         1.20813E-02        -1.95489E-02         1.38855E+00         9.78413E-01         1.38869E+00         5.36659E+00         1.00000E+00         1.28244E-09         5.36659E+00         1.14244E+00         4.22415E+00
+          2.21011E-02         1.22511E-02        -1.96787E-02         1.38855E+00         9.89083E-01         1.38869E+00         5.12712E+00         1.00000E+00         1.29967E-09         5.12712E+00         1.13704E+00         3.99008E+00
+          2.21011E-02         1.24209E-02        -1.98103E-02         1.38855E+00         9.99754E-01         1.38869E+00         4.90780E+00         1.00000E+00         1.31244E-09         4.90780E+00         1.13190E+00         3.77590E+00
+          2.21011E-02         1.25908E-02        -1.99437E-02         1.38854E+00         1.01042E+00         1.38869E+00         4.70769E+00         1.00000E+00         1.32042E-09         4.70769E+00         1.12701E+00         3.58068E+00
+          2.21011E-02         1.27606E-02        -2.00789E-02         1.38854E+00         1.02110E+00         1.38868E+00         4.52586E+00         1.00000E+00         1.32327E-09         4.52586E+00         1.12234E+00         3.40351E+00
+          2.21011E-02         1.29304E-02        -2.02160E-02         1.38854E+00         1.03177E+00         1.38868E+00         4.36136E+00         1.00000E+00         1.32069E-09         4.36136E+00         1.11786E+00         3.24350E+00
+          2.21011E-02         1.31002E-02        -2.03548E-02         1.38853E+00         1.04244E+00         1.38868E+00         4.21328E+00         1.00000E+00         1.31239E-09         4.21328E+00         1.11355E+00         3.09973E+00
+          2.21011E-02         1.32701E-02        -2.04955E-02         1.38853E+00         1.05311E+00         1.38868E+00         4.08068E+00         1.00000E+00         1.29807E-09         4.08068E+00         1.10938E+00         2.97130E+00
+          2.21011E-02         1.34399E-02        -2.06380E-02         1.38853E+00         1.06378E+00         1.38868E+00         3.96266E+00         1.00000E+00         1.27748E-09         3.96266E+00         1.10532E+00         2.85734E+00
+          2.21011E-02         1.36097E-02        -2.07823E-02         1.38852E+00         1.07445E+00         1.38868E+00         3.85830E+00         1.00000E+00         1.25039E-09         3.85830E+00         1.10135E+00         2.75696E+00
+          2.21011E-02         1.37795E-02        -2.09284E-02         1.38852E+00         1.08512E+00         1.38868E+00         3.76673E+00         1.00000E+00         1.21662E-09         3.76673E+00         1.09743E+00         2.66929E+00
+          2.21011E-02         1.39494E-02        -2.10763E-02         1.38852E+00         1.09579E+00         1.38868E+00         3.68706E+00         1.00000E+00         1.17605E-09         3.68706E+00         1.09356E+00         2.59350E+00
+          2.21011E-02         1.41192E-02        -2.12261E-02         1.38851E+00         1.10646E+00         1.38868E+00         3.61844E+00         1.00000E+00         1.12864E-09         3.61844E+00         1.08969E+00         2.52875E+00
+          2.21011E-02         1.42890E-02        -2.13776E-02         1.38851E+00         1.11713E+00         1.38868E+00         3.56003E+00         1.00000E+00         1.07446E-09         3.56003E+00         1.08581E+00         2.47422E+00
+          2.21011E-02         1.44589E-02        -2.15310E-02         1.38851E+00         1.12780E+00         1.38867E+00         3.51100E+00         1.00000E+00         1.01375E-09         3.51100E+00         1.08189E+00         2.42911E+00
+          2.21011E-02         1.46287E-02        -2.16861E-02         1.38850E+00         1.13847E+00         1.38867E+00         3.47057E+00         1.00000E+00         9.46997E-10         3.47057E+00         1.07791E+00         2.39266E+00
+          2.21011E-02         1.47985E-02        -2.18431E-02         1.38850E+00         1.14914E+00         1.38867E+00         3.43796E+00         1.00000E+00         8.75088E-10         3.43796E+00         1.07384E+00         2.36412E+00
+          2.21011E-02         1.49683E-02        -2.20019E-02         1.38850E+00         1.15981E+00         1.38867E+00         3.41241E+00         1.00000E+00         7.99514E-10         3.41241E+00         1.06966E+00         2.34275E+00
+          2.21011E-02         1.51382E-02        -2.21625E-02         1.38849E+00         1.17048E+00         1.38867E+00         3.39320E+00         1.00000E+00         7.22787E-10         3.39320E+00         1.06535E+00         2.32784E+00
+          2.21011E-02         1.53080E-02        -2.23249E-02         1.38849E+00         1.18115E+00         1.38867E+00         3.37963E+00         1.00000E+00         6.49098E-10         3.37963E+00         1.06090E+00         2.31873E+00
+          2.21011E-02         1.54778E-02        -2.24892E-02         1.38849E+00         1.19182E+00         1.38867E+00         3.37102E+00         1.00000E+00         5.85277E-10         3.37102E+00         1.05627E+00         2.31475E+00
+          2.21011E-02         1.56476E-02        -2.26552E-02         1.38848E+00         1.20249E+00         1.38867E+00         3.36673E+00         1.00000E+00         5.41580E-10         3.36673E+00         1.05145E+00         2.31528E+00
+          2.21011E-02         1.58175E-02        -2.28231E-02         1.38848E+00         1.21317E+00         1.38867E+00         3.36614E+00         1.00000E+00         5.30473E-10         3.36614E+00         1.04643E+00         2.31971E+00
+          2.21011E-02         1.59873E-02        -2.29927E-02         1.38847E+00         1.22384E+00         1.38867E+00         3.36866E+00         1.00000E+00         5.61363E-10         3.36866E+00         1.04119E+00         2.32748E+00
+          2.21011E-02         1.61571E-02        -2.31642E-02         1.38847E+00         1.23451E+00         1.38866E+00         3.37373E+00         1.00000E+00         6.34992E-10         3.37373E+00         1.03570E+00         2.33803E+00
+          2.21011E-02         1.63270E-02        -2.33375E-02         1.38847E+00         1.24518E+00         1.38866E+00         3.38081E+00         1.00000E+00         7.44782E-10         3.38081E+00         1.02997E+00         2.35085E+00
+          2.21011E-02         1.64968E-02        -2.35126E-02         1.38846E+00         1.25585E+00         1.38866E+00         3.38940E+00         1.00000E+00         8.82512E-10         3.38940E+00         1.02396E+00         2.36544E+00
+          2.21011E-02         1.66666E-02        -2.36895E-02         1.38846E+00         1.26652E+00         1.38866E+00         3.39903E+00         1.00000E+00         1.04158E-09         3.39903E+00         1.01768E+00         2.38135E+00
+          2.21011E-02         1.68364E-02        -2.38682E-02         1.38846E+00         1.27719E+00         1.38866E+00         3.40926E+00         1.00000E+00         1.21740E-09         3.40926E+00         1.01111E+00         2.39815E+00
+          2.21011E-02         1.70063E-02        -2.40488E-02         1.38845E+00         1.28786E+00         1.38866E+00         3.41966E+00         1.00000E+00         1.40687E-09         3.41966E+00         1.00424E+00         2.41542E+00
+          2.21011E-02         1.71761E-02        -2.42311E-02         1.38845E+00         1.29853E+00         1.38866E+00         3.42985E+00         1.00000E+00         1.60776E-09         3.42985E+00         9.97063E-01         2.43278E+00
+          2.21011E-02         1.73459E-02        -2.44153E-02         1.38844E+00         1.30920E+00         1.38866E+00         3.43947E+00         1.00000E+00         1.81843E-09         3.43947E+00         9.89572E-01         2.44990E+00
+          2.21011E-02         1.75158E-02        -2.46013E-02         1.38844E+00         1.31987E+00         1.38866E+00         3.44820E+00         1.00000E+00         2.03751E-09         3.44820E+00         9.81762E-01         2.46644E+00
+          2.21011E-02         1.76856E-02        -2.47891E-02         1.38844E+00         1.33054E+00         1.38866E+00         3.45574E+00         1.00000E+00         2.26380E-09         3.45574E+00         9.73627E-01         2.48211E+00
+          2.21011E-02         1.78554E-02        -2.49787E-02         1.38843E+00         1.34121E+00         1.38866E+00         3.46180E+00         1.00000E+00         2.49618E-09         3.46180E+00         9.65165E-01         2.49664E+00
+          2.21011E-02         1.80252E-02        -2.51701E-02         1.38843E+00         1.35188E+00         1.38865E+00         3.46616E+00         1.00000E+00         2.73358E-09         3.46616E+00         9.56374E-01         2.50979E+00
+          2.21011E-02         1.81951E-02        -2.53633E-02         1.38842E+00         1.36255E+00         1.38865E+00         3.46858E+00         1.00000E+00         2.97491E-09         3.46858E+00         9.47252E-01         2.52133E+00
+          2.21011E-02         1.83649E-02        -2.55584E-02         1.38842E+00         1.37322E+00         1.38865E+00         3.46888E+00         1.00000E+00         3.21906E-09         3.46888E+00         9.37801E-01         2.53107E+00
+          2.21011E-02         1.85347E-02        -2.57552E-02         1.38841E+00         1.38389E+00         1.38865E+00         3.46688E+00         1.00000E+00         3.46490E-09         3.46688E+00         9.28023E-01         2.53886E+00
+          2.21011E-02         1.87045E-02        -2.59539E-02         1.38841E+00         1.39457E+00         1.38865E+00         3.46245E+00         1.00000E+00         3.71123E-09         3.46245E+00         9.17920E-01         2.54453E+00
+          2.21011E-02         1.88744E-02        -2.61544E-02         1.38841E+00         1.40524E+00         1.38865E+00         3.45546E+00         1.00000E+00         3.95681E-09         3.45546E+00         9.07496E-01         2.54796E+00
+          2.21011E-02         1.90442E-02        -2.63567E-02         1.38840E+00         1.41591E+00         1.38865E+00         3.44582E+00         1.00000E+00         4.20037E-09         3.44582E+00         8.96757E-01         2.54906E+00
+          2.21011E-02         1.92140E-02        -2.65608E-02         1.38840E+00         1.42658E+00         1.38865E+00         3.43346E+00         1.00000E+00         4.44054E-09         3.43346E+00         8.85709E-01         2.54775E+00
+          2.21011E-02         1.93839E-02        -2.67667E-02         1.38839E+00         1.43725E+00         1.38865E+00         3.41831E+00         1.00000E+00         4.67595E-09         3.41831E+00         8.74359E-01         2.54396E+00
+          2.21011E-02         1.95537E-02        -2.69744E-02         1.38839E+00         1.44792E+00         1.38865E+00         3.40036E+00         1.00000E+00         4.90513E-09         3.40036E+00         8.62717E-01         2.53765E+00
+          2.21011E-02         1.97235E-02        -2.71840E-02         1.38838E+00         1.45859E+00         1.38865E+00         3.37959E+00         1.00000E+00         5.12661E-09         3.37959E+00         8.50790E-01         2.52880E+00
+          2.21011E-02         1.98933E-02        -2.73953E-02         1.38838E+00         1.46926E+00         1.38865E+00         3.35600E+00         1.00000E+00         5.33883E-09         3.35600E+00         8.38590E-01         2.51741E+00
+          2.21011E-02         2.00632E-02        -2.76085E-02         1.38837E+00         1.47993E+00         1.38865E+00         3.32962E+00         1.00000E+00         5.54022E-09         3.32962E+00         8.26128E-01         2.50349E+00
+          2.21011E-02         2.02330E-02        -2.78235E-02         1.38837E+00         1.49060E+00         1.38865E+00         3.30049E+00         1.00000E+00         5.72916E-09         3.30049E+00         8.13416E-01         2.48707E+00
+          2.21011E-02         2.04028E-02        -2.80403E-02         1.38836E+00         1.50127E+00         1.38865E+00         3.26866E+00         1.00000E+00         5.90401E-09         3.26866E+00         8.00466E-01         2.46819E+00
+          2.21011E-02         2.05726E-02        -2.82589E-02         1.38836E+00         1.51194E+00         1.38865E+00         3.23420E+00         1.00000E+00         6.06311E-09         3.23420E+00         7.87293E-01         2.44691E+00
+          2.21011E-02         2.07425E-02        -2.84793E-02         1.38835E+00         1.52261E+00         1.38865E+00         3.19721E+00         1.00000E+00         6.20478E-09         3.19721E+00         7.73909E-01         2.42330E+00
+          2.21011E-02         2.09123E-02        -2.87015E-02         1.38835E+00         1.53328E+00         1.38865E+00         3.15777E+00         1.00000E+00         6.32733E-09         3.15777E+00         7.60331E-01         2.39744E+00
+          2.21011E-02         2.10821E-02        -2.89256E-02         1.38834E+00         1.54395E+00         1.38865E+00         3.11599E+00         1.00000E+00         6.42909E-09         3.11599E+00         7.46573E-01         2.36942E+00
+          2.21011E-02         2.12520E-02        -2.91514E-02         1.38834E+00         1.55462E+00         1.38864E+00         3.07200E+00         1.00000E+00         6.50840E-09         3.07200E+00         7.32650E-01         2.33935E+00
+          2.21011E-02         2.14218E-02        -2.93791E-02         1.38833E+00         1.56529E+00         1.38864E+00         3.02592E+00         1.00000E+00         6.56363E-09         3.02592E+00         7.18580E-01         2.30734E+00
+          2.21011E-02         2.15916E-02        -2.96086E-02         1.38833E+00         1.57596E+00         1.38864E+00         2.97790E+00         1.00000E+00         6.59318E-09         2.97790E+00         7.04379E-01         2.27352E+00
+          2.21011E-02         2.17614E-02        -2.98399E-02         1.38832E+00         1.58664E+00         1.38864E+00         2.92807E+00         1.00000E+00         6.59552E-09         2.92807E+00         6.90063E-01         2.23801E+00
+          2.21011E-02         2.19313E-02        -3.00730E-02         1.38832E+00         1.59731E+00         1.38864E+00         2.87659E+00         1.00000E+00         6.56921E-09         2.87659E+00         6.75650E-01         2.20094E+00
+          2.21011E-02         2.21011E-02        -3.03079E-02         1.38831E+00         1.60798E+00         1.38864E+00         2.82362E+00         1.00000E+00         6.51287E-09         2.82362E+00         6.61157E-01         2.16247E+00
+          2.21011E-02         2.22709E-02        -3.05447E-02         1.38831E+00         1.61865E+00         1.38864E+00         2.76933E+00         1.00000E+00         6.42529E-09         2.76933E+00         6.46600E-01         2.12273E+00
+          2.21011E-02         2.24407E-02        -3.07832E-02         1.38830E+00         1.62932E+00         1.38864E+00         2.71387E+00         1.00000E+00         6.30538E-09         2.71387E+00         6.31998E-01         2.08187E+00
+          2.21011E-02         2.26106E-02        -3.10236E-02         1.38830E+00         1.63999E+00         1.38864E+00         2.65742E+00         1.00000E+00         6.15227E-09         2.65742E+00         6.17368E-01         2.04005E+00
+          2.21011E-02         2.27804E-02        -3.12658E-02         1.38829E+00         1.65066E+00         1.38864E+00         2.60016E+00         1.00000E+00         5.96533E-09         2.60016E+00         6.02728E-01         1.99743E+00
+          2.21011E-02         2.29502E-02        -3.15098E-02         1.38829E+00         1.66133E+00         1.38864E+00         2.54225E+00         1.00000E+00         5.74427E-09         2.54225E+00         5.88093E-01         1.95416E+00
+          2.21011E-02         2.31201E-02        -3.17556E-02         1.38828E+00         1.67200E+00         1.38864E+00         2.48388E+00         1.00000E+00         5.48922E-09         2.48388E+00         5.73482E-01         1.91039E+00
+          2.21011E-02         2.32899E-02        -3.20032E-02         1.38828E+00         1.68267E+00         1.38864E+00         2.42521E+00         1.00000E+00         5.20093E-09         2.42521E+00         5.58911E-01         1.86630E+00
+          2.21011E-02         2.34597E-02        -3.22526E-02         1.38827E+00         1.69334E+00         1.38864E+00         2.36643E+00         1.00000E+00         4.88100E-09         2.36643E+00         5.44397E-01         1.82203E+00
+          2.21011E-02         2.36295E-02        -3.25039E-02         1.38826E+00         1.70401E+00         1.38865E+00         2.30770E+00         1.00000E+00         4.53231E-09         2.30770E+00         5.29955E-01         1.77775E+00
+          2.21011E-02         2.37994E-02        -3.27569E-02         1.38826E+00         1.71468E+00         1.38865E+00         2.24920E+00         1.00000E+00         4.15969E-09         2.24920E+00         5.15602E-01         1.73360E+00
+          2.21011E-02         2.39692E-02        -3.30118E-02         1.38825E+00         1.72535E+00         1.38865E+00         2.19109E+00         1.00000E+00         3.77116E-09         2.19109E+00         5.01353E-01         1.68973E+00
+          2.21011E-02         2.41390E-02        -3.32685E-02         1.38825E+00         1.73602E+00         1.38865E+00         2.13353E+00         1.00000E+00         3.38000E-09         2.13353E+00         4.87224E-01         1.64631E+00
+          2.21011E-02         2.43088E-02        -3.35270E-02         1.38824E+00         1.74669E+00         1.38865E+00         2.07669E+00         1.00000E+00         3.00835E-09         2.07669E+00         4.73227E-01         1.60347E+00
+          2.21011E-02         2.44787E-02        -3.37873E-02         1.38824E+00         1.75736E+00         1.38865E+00         2.02072E+00         1.00000E+00         2.69231E-09         2.02072E+00         4.59378E-01         1.56134E+00
+          2.21011E-02         2.46485E-02        -3.40494E-02         1.38823E+00         1.76804E+00         1.38865E+00         1.96577E+00         1.00000E+00         2.48567E-09         1.96577E+00         4.45690E-01         1.52008E+00
+          2.21011E-02         2.48183E-02        -3.43133E-02         1.38822E+00         1.77871E+00         1.38865E+00         1.91198E+00         1.00000E+00         2.45087E-09         1.91198E+00         4.32176E-01         1.47981E+00
+          2.21011E-02         2.49882E-02        -3.45791E-02         1.38822E+00         1.78938E+00         1.38865E+00         1.85949E+00         1.00000E+00         2.62775E-09         1.85949E+00         4.18847E-01         1.44064E+00
+          2.21011E-02         2.51580E-02        -3.48466E-02         1.38821E+00         1.80005E+00         1.38865E+00         1.80843E+00         1.00000E+00         3.00798E-09         1.80843E+00         4.05715E-01         1.40271E+00
+          2.21011E-02         2.53278E-02        -3.51160E-02         1.38821E+00         1.81072E+00         1.38865E+00         1.75892E+00         1.00000E+00         3.55103E-09         1.75892E+00         3.92792E-01         1.36612E+00
+          2.21011E-02         2.54976E-02        -3.53872E-02         1.38820E+00         1.82139E+00         1.38865E+00         1.71107E+00         1.00000E+00         4.21447E-09         1.71107E+00         3.80086E-01         1.33098E+00
+          2.21011E-02         2.56675E-02        -3.56602E-02         1.38819E+00         1.83206E+00         1.38865E+00         1.66500E+00         1.00000E+00         4.96668E-09         1.66500E+00         3.67609E-01         1.29739E+00
+          2.21011E-02         2.58373E-02        -3.59350E-02         1.38819E+00         1.84273E+00         1.38865E+00         1.62080E+00         1.00000E+00         5.78636E-09         1.62080E+00         3.55368E-01         1.26543E+00
+          2.21011E-02         2.60071E-02        -3.62117E-02         1.38818E+00         1.85340E+00         1.38865E+00         1.57856E+00         1.00000E+00         6.65904E-09         1.57856E+00         3.43372E-01         1.23519E+00
+          2.21011E-02         2.61769E-02        -3.64901E-02         1.38818E+00         1.86407E+00         1.38866E+00         1.53837E+00         1.00000E+00         7.57437E-09         1.53837E+00         3.31627E-01         1.20674E+00
+          2.22709E-02         8.72665E-04        -1.52252E-02         1.39932E+00         2.74155E-01         1.39941E+00         7.77992E+01         1.00000E+00         1.90357E-10         7.77992E+01         2.70969E+00         7.50895E+01
+          2.22709E-02         1.04249E-03        -1.52354E-02         1.39932E+00         2.84826E-01         1.39941E+00         7.64092E+01         1.00000E+00         1.97902E-10         7.64092E+01         2.67897E+00         7.37303E+01
+          2.22709E-02         1.21232E-03        -1.52474E-02         1.39932E+00         2.95496E-01         1.39941E+00         7.49903E+01         1.00000E+00         2.05231E-10         7.49903E+01         2.64753E+00         7.23428E+01
+          2.22709E-02         1.38215E-03        -1.52612E-02         1.39932E+00         3.06167E-01         1.39940E+00         7.35448E+01         1.00000E+00         2.12271E-10         7.35448E+01         2.61541E+00         7.09294E+01
+          2.22709E-02         1.55197E-03        -1.52769E-02         1.39932E+00         3.16838E-01         1.39940E+00         7.20749E+01         1.00000E+00         2.18955E-10         7.20749E+01         2.58266E+00         6.94923E+01
+          2.22709E-02         1.72180E-03        -1.52944E-02         1.39932E+00         3.27508E-01         1.39940E+00         7.05832E+01         1.00000E+00         2.25216E-10         7.05832E+01         2.54933E+00         6.80338E+01
+          2.22709E-02         1.89163E-03        -1.53136E-02         1.39932E+00         3.38179E-01         1.39940E+00         6.90718E+01         1.00000E+00         2.30992E-10         6.90718E+01         2.51546E+00         6.65563E+01
+          2.22709E-02         2.06146E-03        -1.53347E-02         1.39932E+00         3.48849E-01         1.39940E+00         6.75432E+01         1.00000E+00         2.36221E-10         6.75432E+01         2.48111E+00         6.50621E+01
+          2.22709E-02         2.23128E-03        -1.53576E-02         1.39932E+00         3.59520E-01         1.39940E+00         6.59997E+01         1.00000E+00         2.40847E-10         6.59997E+01         2.44633E+00         6.35534E+01
+          2.22709E-02         2.40111E-03        -1.53823E-02         1.39932E+00         3.70190E-01         1.39940E+00         6.44437E+01         1.00000E+00         2.44813E-10         6.44437E+01         2.41115E+00         6.20325E+01
+          2.22709E-02         2.57094E-03        -1.54088E-02         1.39932E+00         3.80861E-01         1.39940E+00         6.28775E+01         1.00000E+00         2.48068E-10         6.28775E+01         2.37565E+00         6.05018E+01
+          2.22709E-02         2.74077E-03        -1.54372E-02         1.39932E+00         3.91532E-01         1.39940E+00         6.13033E+01         1.00000E+00         2.50564E-10         6.13033E+01         2.33986E+00         5.89635E+01
+          2.22709E-02         2.91059E-03        -1.54673E-02         1.39932E+00         4.02202E-01         1.39940E+00         5.97236E+01         1.00000E+00         2.52254E-10         5.97236E+01         2.30383E+00         5.74197E+01
+          2.22709E-02         3.08042E-03        -1.54993E-02         1.39932E+00         4.12873E-01         1.39940E+00         5.81404E+01         1.00000E+00         2.53098E-10         5.81404E+01         2.26762E+00         5.58728E+01
+          2.22709E-02         3.25025E-03        -1.55330E-02         1.39932E+00         4.23543E-01         1.39940E+00         5.65562E+01         1.00000E+00         2.53055E-10         5.65562E+01         2.23128E+00         5.43249E+01
+          2.22709E-02         3.42008E-03        -1.55686E-02         1.39931E+00         4.34214E-01         1.39940E+00         5.49729E+01         1.00000E+00         2.52093E-10         5.49729E+01         2.19486E+00         5.27781E+01
+          2.22709E-02         3.58990E-03        -1.56060E-02         1.39931E+00         4.44884E-01         1.39940E+00         5.33929E+01         1.00000E+00         2.50181E-10         5.33929E+01         2.15840E+00         5.12345E+01
+          2.22709E-02         3.75973E-03        -1.56452E-02         1.39931E+00         4.55555E-01         1.39940E+00         5.18181E+01         1.00000E+00         2.47294E-10         5.18181E+01         2.12196E+00         4.96961E+01
+          2.22709E-02         3.92956E-03        -1.56862E-02         1.39931E+00         4.66225E-01         1.39940E+00         5.02505E+01         1.00000E+00         2.43414E-10         5.02505E+01         2.08558E+00         4.81649E+01
+          2.22709E-02         4.09939E-03        -1.57291E-02         1.39931E+00         4.76896E-01         1.39940E+00         4.86922E+01         1.00000E+00         2.38529E-10         4.86922E+01         2.04932E+00         4.66429E+01
+          2.22709E-02         4.26921E-03        -1.57737E-02         1.39931E+00         4.87567E-01         1.39940E+00         4.71451E+01         1.00000E+00         2.32634E-10         4.71451E+01         2.01322E+00         4.51319E+01
+          2.22709E-02         4.43904E-03        -1.58201E-02         1.39931E+00         4.98237E-01         1.39940E+00         4.56111E+01         1.00000E+00         2.25735E-10         4.56111E+01         1.97733E+00         4.36337E+01
+          2.22709E-02         4.60887E-03        -1.58684E-02         1.39931E+00         5.08908E-01         1.39940E+00         4.40918E+01         1.00000E+00         2.17850E-10         4.40918E+01         1.94169E+00         4.21501E+01
+          2.22709E-02         4.77869E-03        -1.59185E-02         1.39931E+00         5.19578E-01         1.39940E+00         4.25891E+01         1.00000E+00         2.09013E-10         4.25891E+01         1.90635E+00         4.06828E+01
+          2.22709E-02         4.94852E-03        -1.59704E-02         1.39931E+00         5.30249E-01         1.39940E+00         4.11046E+01         1.00000E+00         1.99282E-10         4.11046E+01         1.87136E+00         3.92332E+01
+          2.22709E-02         5.11835E-03        -1.60241E-02         1.39930E+00         5.40919E-01         1.39940E+00         3.96398E+01         1.00000E+00         1.88741E-10         3.96398E+01         1.83675E+00         3.78030E+01
+          2.22709E-02         5.28818E-03        -1.60796E-02         1.39930E+00         5.51590E-01         1.39940E+00         3.81963E+01         1.00000E+00         1.77520E-10         3.81963E+01         1.80257E+00         3.63937E+01
+          2.22709E-02         5.45800E-03        -1.61369E-02         1.39930E+00         5.62261E-01         1.39940E+00         3.67754E+01         1.00000E+00         1.65806E-10         3.67754E+01         1.76886E+00         3.50065E+01
+          2.22709E-02         5.62783E-03        -1.61960E-02         1.39930E+00         5.72931E-01         1.39939E+00         3.53785E+01         1.00000E+00         1.53877E-10         3.53785E+01         1.73566E+00         3.36429E+01
+          2.22709E-02         5.79766E-03        -1.62570E-02         1.39930E+00         5.83602E-01         1.39939E+00         3.40069E+01         1.00000E+00         1.42139E-10         3.40069E+01         1.70300E+00         3.23039E+01
+          2.22709E-02         5.96749E-03        -1.63197E-02         1.39930E+00         5.94272E-01         1.39939E+00         3.26617E+01         1.00000E+00         1.31184E-10         3.26617E+01         1.67092E+00         3.09908E+01
+          2.22709E-02         6.13731E-03        -1.63843E-02         1.39930E+00         6.04943E-01         1.39939E+00         3.13441E+01         1.00000E+00         1.21843E-10         3.13441E+01         1.63946E+00         2.97046E+01
+          2.22709E-02         6.30714E-03        -1.64507E-02         1.39930E+00         6.15613E-01         1.39939E+00         3.00549E+01         1.00000E+00         1.15207E-10         3.00549E+01         1.60864E+00         2.84463E+01
+          2.22709E-02         6.47697E-03        -1.65189E-02         1.39929E+00         6.26284E-01         1.39939E+00         2.87952E+01         1.00000E+00         1.12500E-10         2.87952E+01         1.57850E+00         2.72167E+01
+          2.22709E-02         6.64680E-03        -1.65889E-02         1.39929E+00         6.36955E-01         1.39939E+00         2.75657E+01         1.00000E+00         1.14758E-10         2.75657E+01         1.54906E+00         2.60167E+01
+          2.22709E-02         6.81662E-03        -1.66607E-02         1.39929E+00         6.47625E-01         1.39939E+00         2.63673E+01         1.00000E+00         1.22430E-10         2.63673E+01         1.52035E+00         2.48470E+01
+          2.22709E-02         6.98645E-03        -1.67343E-02         1.39929E+00         6.58296E-01         1.39939E+00         2.52006E+01         1.00000E+00         1.35257E-10         2.52006E+01         1.49240E+00         2.37082E+01
+          2.22709E-02         7.15628E-03        -1.68097E-02         1.39929E+00         6.68966E-01         1.39939E+00         2.40661E+01         1.00000E+00         1.52529E-10         2.40661E+01         1.46523E+00         2.26009E+01
+          2.22709E-02         7.32611E-03        -1.68870E-02         1.39929E+00         6.79637E-01         1.39939E+00         2.29644E+01         1.00000E+00         1.73432E-10         2.29644E+01         1.43886E+00         2.15256E+01
+          2.22709E-02         7.49593E-03        -1.69661E-02         1.39928E+00         6.90307E-01         1.39939E+00         2.18959E+01         1.00000E+00         1.97251E-10         2.18959E+01         1.41330E+00         2.04826E+01
+          2.22709E-02         7.66576E-03        -1.70469E-02         1.39928E+00         7.00978E-01         1.39939E+00         2.08610E+01         1.00000E+00         2.23424E-10         2.08610E+01         1.38858E+00         1.94724E+01
+          2.22709E-02         7.83559E-03        -1.71296E-02         1.39928E+00         7.11649E-01         1.39938E+00         1.98598E+01         1.00000E+00         2.51523E-10         1.98598E+01         1.36470E+00         1.84951E+01
+          2.22709E-02         8.00542E-03        -1.72141E-02         1.39928E+00         7.22319E-01         1.39938E+00         1.88926E+01         1.00000E+00         2.81221E-10         1.88926E+01         1.34168E+00         1.75509E+01
+          2.22709E-02         8.17524E-03        -1.73004E-02         1.39928E+00         7.32990E-01         1.39938E+00         1.79595E+01         1.00000E+00         3.12258E-10         1.79595E+01         1.31953E+00         1.66400E+01
+          2.22709E-02         8.34507E-03        -1.73886E-02         1.39927E+00         7.43660E-01         1.39938E+00         1.70605E+01         1.00000E+00         3.44421E-10         1.70605E+01         1.29825E+00         1.57622E+01
+          2.22709E-02         8.51490E-03        -1.74785E-02         1.39927E+00         7.54331E-01         1.39938E+00         1.61956E+01         1.00000E+00         3.77523E-10         1.61956E+01         1.27786E+00         1.49177E+01
+          2.22709E-02         8.68473E-03        -1.75702E-02         1.39927E+00         7.65001E-01         1.39938E+00         1.53646E+01         1.00000E+00         4.11394E-10         1.53646E+01         1.25834E+00         1.41063E+01
+          2.22709E-02         8.85455E-03        -1.76638E-02         1.39927E+00         7.75672E-01         1.39938E+00         1.45674E+01         1.00000E+00         4.45875E-10         1.45674E+01         1.23971E+00         1.33277E+01
+          2.22709E-02         9.02438E-03        -1.77592E-02         1.39927E+00         7.86343E-01         1.39938E+00         1.38038E+01         1.00000E+00         4.80811E-10         1.38038E+01         1.22197E+00         1.25819E+01
+          2.22709E-02         9.19421E-03        -1.78563E-02         1.39926E+00         7.97013E-01         1.39938E+00         1.30735E+01         1.00000E+00         5.16048E-10         1.30735E+01         1.20509E+00         1.18684E+01
+          2.22709E-02         9.36403E-03        -1.79553E-02         1.39926E+00         8.07684E-01         1.39938E+00         1.23760E+01         1.00000E+00         5.51428E-10         1.23760E+01         1.18910E+00         1.11869E+01
+          2.22709E-02         9.53386E-03        -1.80561E-02         1.39926E+00         8.18354E-01         1.39938E+00         1.17111E+01         1.00000E+00         5.86792E-10         1.17111E+01         1.17396E+00         1.05371E+01
+          2.22709E-02         9.70369E-03        -1.81588E-02         1.39926E+00         8.29025E-01         1.39937E+00         1.10781E+01         1.00000E+00         6.21974E-10         1.10781E+01         1.15968E+00         9.91846E+00
+          2.22709E-02         9.87352E-03        -1.82632E-02         1.39925E+00         8.39695E-01         1.39937E+00         1.04767E+01         1.00000E+00         6.56802E-10         1.04767E+01         1.14623E+00         9.33046E+00
+          2.22709E-02         1.00433E-02        -1.83694E-02         1.39925E+00         8.50366E-01         1.39937E+00         9.90619E+00         1.00000E+00         6.91100E-10         9.90619E+00         1.13362E+00         8.77257E+00
+          2.22709E-02         1.02132E-02        -1.84775E-02         1.39925E+00         8.61037E-01         1.39937E+00         9.36600E+00         1.00000E+00         7.24682E-10         9.36600E+00         1.12181E+00         8.24419E+00
+          2.22709E-02         1.03830E-02        -1.85873E-02         1.39925E+00         8.71707E-01         1.39937E+00         8.85550E+00         1.00000E+00         7.57357E-10         8.85550E+00         1.11080E+00         7.74470E+00
+          2.22709E-02         1.05528E-02        -1.86990E-02         1.39925E+00         8.82378E-01         1.39937E+00         8.37398E+00         1.00000E+00         7.88924E-10         8.37398E+00         1.10056E+00         7.27342E+00
+          2.22709E-02         1.07227E-02        -1.88125E-02         1.39924E+00         8.93048E-01         1.39937E+00         7.92072E+00         1.00000E+00         8.19178E-10         7.92072E+00         1.09106E+00         6.82966E+00
+          2.22709E-02         1.08925E-02        -1.89278E-02         1.39924E+00         9.03719E-01         1.39937E+00         7.49498E+00         1.00000E+00         8.47906E-10         7.49498E+00         1.08230E+00         6.41268E+00
+          2.22709E-02         1.10623E-02        -1.90449E-02         1.39924E+00         9.14389E-01         1.39937E+00         7.09596E+00         1.00000E+00         8.74887E-10         7.09596E+00         1.07424E+00         6.02172E+00
+          2.22709E-02         1.12321E-02        -1.91638E-02         1.39923E+00         9.25060E-01         1.39937E+00         6.72285E+00         1.00000E+00         8.99897E-10         6.72285E+00         1.06685E+00         5.65600E+00
+          2.22709E-02         1.14020E-02        -1.92846E-02         1.39923E+00         9.35731E-01         1.39936E+00         6.37483E+00         1.00000E+00         9.22704E-10         6.37483E+00         1.06011E+00         5.31472E+00
+          2.22709E-02         1.15718E-02        -1.94071E-02         1.39923E+00         9.46401E-01         1.39936E+00         6.05104E+00         1.00000E+00         9.43075E-10         6.05104E+00         1.05399E+00         4.99706E+00
+          2.22709E-02         1.17416E-02        -1.95315E-02         1.39923E+00         9.57072E-01         1.39936E+00         5.75062E+00         1.00000E+00         9.60771E-10         5.75062E+00         1.04846E+00         4.70217E+00
+          2.22709E-02         1.19114E-02        -1.96577E-02         1.39922E+00         9.67742E-01         1.39936E+00         5.47268E+00         1.00000E+00         9.75552E-10         5.47268E+00         1.04348E+00         4.42920E+00
+          2.22709E-02         1.20813E-02        -1.97857E-02         1.39922E+00         9.78413E-01         1.39936E+00         5.21633E+00         1.00000E+00         9.87179E-10         5.21633E+00         1.03903E+00         4.17730E+00
+          2.22709E-02         1.22511E-02        -1.99155E-02         1.39922E+00         9.89083E-01         1.39936E+00         4.98067E+00         1.00000E+00         9.95415E-10         4.98067E+00         1.03507E+00         3.94560E+00
+          2.22709E-02         1.24209E-02        -2.00471E-02         1.39922E+00         9.99754E-01         1.39936E+00         4.76479E+00         1.00000E+00         1.00002E-09         4.76479E+00         1.03157E+00         3.73322E+00
+          2.22709E-02         1.25908E-02        -2.01805E-02         1.39921E+00         1.01042E+00         1.39936E+00         4.56778E+00         1.00000E+00         1.00078E-09         4.56778E+00         1.02849E+00         3.53929E+00
+          2.22709E-02         1.27606E-02        -2.03157E-02         1.39921E+00         1.02110E+00         1.39936E+00         4.38873E+00         1.00000E+00         9.97470E-10         4.38873E+00         1.02580E+00         3.36294E+00
+          2.22709E-02         1.29304E-02        -2.04528E-02         1.39921E+00         1.03177E+00         1.39936E+00         4.22674E+00         1.00000E+00         9.89889E-10         4.22674E+00         1.02346E+00         3.20329E+00
+          2.22709E-02         1.31002E-02        -2.05916E-02         1.39920E+00         1.04244E+00         1.39935E+00         4.08090E+00         1.00000E+00         9.77858E-10         4.08090E+00         1.02143E+00         3.05947E+00
+          2.22709E-02         1.32701E-02        -2.07323E-02         1.39920E+00         1.05311E+00         1.39935E+00         3.95031E+00         1.00000E+00         9.61224E-10         3.95031E+00         1.01969E+00         2.93063E+00
+          2.22709E-02         1.34399E-02        -2.08748E-02         1.39920E+00         1.06378E+00         1.39935E+00         3.83409E+00         1.00000E+00         9.39872E-10         3.83409E+00         1.01818E+00         2.81590E+00
+          2.22709E-02         1.36097E-02        -2.10191E-02         1.39919E+00         1.07445E+00         1.39935E+00         3.73135E+00         1.00000E+00         9.13739E-10         3.73135E+00         1.01689E+00         2.71446E+00
+          2.22709E-02         1.37795E-02        -2.11652E-02         1.39919E+00         1.08512E+00         1.39935E+00         3.64124E+00         1.00000E+00         8.82832E-10         3.64124E+00         1.01576E+00         2.62547E+00
+          2.22709E-02         1.39494E-02        -2.13131E-02         1.39919E+00         1.09579E+00         1.39935E+00         3.56289E+00         1.00000E+00         8.47253E-10         3.56289E+00         1.01477E+00         2.54812E+00
+          2.22709E-02         1.41192E-02        -2.14628E-02         1.39918E+00         1.10646E+00         1.39935E+00         3.49549E+00         1.00000E+00         8.07246E-10         3.49549E+00         1.01388E+00         2.48161E+00
+          2.22709E-02         1.42890E-02        -2.16144E-02         1.39918E+00         1.11713E+00         1.39935E+00         3.43820E+00         1.00000E+00         7.63251E-10         3.43820E+00         1.01305E+00         2.42515E+00
+          2.22709E-02         1.44589E-02        -2.17677E-02         1.39918E+00         1.12780E+00         1.39935E+00         3.39023E+00         1.00000E+00         7.16003E-10         3.39023E+00         1.01225E+00         2.37799E+00
+          2.22709E-02         1.46287E-02        -2.19229E-02         1.39917E+00         1.13847E+00         1.39935E+00         3.35081E+00         1.00000E+00         6.66676E-10         3.35081E+00         1.01144E+00         2.33937E+00
+          2.22709E-02         1.47985E-02        -2.20799E-02         1.39917E+00         1.14914E+00         1.39934E+00         3.31918E+00         1.00000E+00         6.17109E-10         3.31918E+00         1.01060E+00         2.30858E+00
+          2.22709E-02         1.49683E-02        -2.22387E-02         1.39917E+00         1.15981E+00         1.39934E+00         3.29460E+00         1.00000E+00         5.70117E-10         3.29460E+00         1.00968E+00         2.28492E+00
+          2.22709E-02         1.51382E-02        -2.23993E-02         1.39916E+00         1.17048E+00         1.39934E+00         3.27637E+00         1.00000E+00         5.29866E-10         3.27637E+00         1.00867E+00         2.26771E+00
+          2.22709E-02         1.53080E-02        -2.25617E-02         1.39916E+00         1.18115E+00         1.39934E+00         3.26380E+00         1.00000E+00         5.02042E-10         3.26380E+00         1.00751E+00         2.25629E+00
+          2.22709E-02         1.54778E-02        -2.27259E-02         1.39916E+00         1.19182E+00         1.39934E+00         3.25624E+00         1.00000E+00         4.93262E-10         3.25624E+00         1.00620E+00         2.25003E+00
+          2.22709E-02         1.56476E-02        -2.28920E-02         1.39915E+00         1.20249E+00         1.39934E+00         3.25304E+00         1.00000E+00         5.09195E-10         3.25304E+00         1.00470E+00         2.24834E+00
+          2.22709E-02         1.58175E-02        -2.30598E-02         1.39915E+00         1.21317E+00         1.39934E+00         3.25360E+00         1.00000E+00         5.52259E-10         3.25360E+00         1.00298E+00         2.25063E+00
+          2.22709E-02         1.59873E-02        -2.32295E-02         1.39914E+00         1.22384E+00         1.39934E+00         3.25735E+00         1.00000E+00         6.21049E-10         3.25735E+00         1.00101E+00         2.25634E+00
+          2.22709E-02         1.61571E-02        -2.34010E-02         1.39914E+00         1.23451E+00         1.39934E+00         3.26374E+00         1.00000E+00         7.11935E-10         3.26374E+00         9.98785E-01         2.26495E+00
+          2.22709E-02         1.63270E-02        -2.35743E-02         1.39914E+00         1.24518E+00         1.39934E+00         3.27223E+00         1.00000E+00         8.20954E-10         3.27223E+00         9.96264E-01         2.27596E+00
+          2.22709E-02         1.64968E-02        -2.37494E-02         1.39913E+00         1.25585E+00         1.39933E+00         3.28233E+00         1.00000E+00         9.44769E-10         3.28233E+00         9.93433E-01         2.28890E+00
+          2.22709E-02         1.66666E-02        -2.39263E-02         1.39913E+00         1.26652E+00         1.39933E+00         3.29358E+00         1.00000E+00         1.08082E-09         3.29358E+00         9.90271E-01         2.30331E+00
+          2.22709E-02         1.68364E-02        -2.41050E-02         1.39912E+00         1.27719E+00         1.39933E+00         3.30554E+00         1.00000E+00         1.22717E-09         3.30554E+00         9.86761E-01         2.31878E+00
+          2.22709E-02         1.70063E-02        -2.42855E-02         1.39912E+00         1.28786E+00         1.39933E+00         3.31779E+00         1.00000E+00         1.38233E-09         3.31779E+00         9.82885E-01         2.33491E+00
+          2.22709E-02         1.71761E-02        -2.44679E-02         1.39912E+00         1.29853E+00         1.39933E+00         3.32996E+00         1.00000E+00         1.54510E-09         3.32996E+00         9.78629E-01         2.35133E+00
+          2.22709E-02         1.73459E-02        -2.46521E-02         1.39911E+00         1.30920E+00         1.39933E+00         3.34168E+00         1.00000E+00         1.71445E-09         3.34168E+00         9.73979E-01         2.36770E+00
+          2.22709E-02         1.75158E-02        -2.48380E-02         1.39911E+00         1.31987E+00         1.39933E+00         3.35263E+00         1.00000E+00         1.88942E-09         3.35263E+00         9.68925E-01         2.38370E+00
+          2.22709E-02         1.76856E-02        -2.50258E-02         1.39910E+00         1.33054E+00         1.39933E+00         3.36250E+00         1.00000E+00         2.06915E-09         3.36250E+00         9.63456E-01         2.39905E+00
+          2.22709E-02         1.78554E-02        -2.52154E-02         1.39910E+00         1.34121E+00         1.39933E+00         3.37103E+00         1.00000E+00         2.25277E-09         3.37103E+00         9.57564E-01         2.41347E+00
+          2.22709E-02         1.80252E-02        -2.54069E-02         1.39910E+00         1.35188E+00         1.39933E+00         3.37797E+00         1.00000E+00         2.43941E-09         3.37797E+00         9.51243E-01         2.42672E+00
+          2.22709E-02         1.81951E-02        -2.56001E-02         1.39909E+00         1.36255E+00         1.39933E+00         3.38308E+00         1.00000E+00         2.62818E-09         3.38308E+00         9.44489E-01         2.43859E+00
+          2.22709E-02         1.83649E-02        -2.57951E-02         1.39909E+00         1.37322E+00         1.39932E+00         3.38618E+00         1.00000E+00         2.81818E-09         3.38618E+00         9.37297E-01         2.44888E+00
+          2.22709E-02         1.85347E-02        -2.59920E-02         1.39908E+00         1.38389E+00         1.39932E+00         3.38708E+00         1.00000E+00         3.00844E-09         3.38708E+00         9.29667E-01         2.45742E+00
+          2.22709E-02         1.87045E-02        -2.61907E-02         1.39908E+00         1.39457E+00         1.39932E+00         3.38565E+00         1.00000E+00         3.19800E-09         3.38565E+00         9.21600E-01         2.46405E+00
+          2.22709E-02         1.88744E-02        -2.63911E-02         1.39907E+00         1.40524E+00         1.39932E+00         3.38176E+00         1.00000E+00         3.38582E-09         3.38176E+00         9.13096E-01         2.46866E+00
+          2.22709E-02         1.90442E-02        -2.65934E-02         1.39907E+00         1.41591E+00         1.39932E+00         3.37529E+00         1.00000E+00         3.57085E-09         3.37529E+00         9.04160E-01         2.47113E+00
+          2.22709E-02         1.92140E-02        -2.67975E-02         1.39906E+00         1.42658E+00         1.39932E+00         3.36617E+00         1.00000E+00         3.75197E-09         3.36617E+00         8.94796E-01         2.47137E+00
+          2.22709E-02         1.93839E-02        -2.70034E-02         1.39906E+00         1.43725E+00         1.39932E+00         3.35433E+00         1.00000E+00         3.92804E-09         3.35433E+00         8.85010E-01         2.46932E+00
+          2.22709E-02         1.95537E-02        -2.72112E-02         1.39906E+00         1.44792E+00         1.39932E+00         3.33974E+00         1.00000E+00         4.09788E-09         3.33974E+00         8.74812E-01         2.46493E+00
+          2.22709E-02         1.97235E-02        -2.74207E-02         1.39905E+00         1.45859E+00         1.39932E+00         3.32236E+00         1.00000E+00         4.26028E-09         3.32236E+00         8.64209E-01         2.45816E+00
+          2.22709E-02         1.98933E-02        -2.76321E-02         1.39905E+00         1.46926E+00         1.39932E+00         3.30220E+00         1.00000E+00         4.41400E-09         3.30220E+00         8.53213E-01         2.44899E+00
+          2.22709E-02         2.00632E-02        -2.78452E-02         1.39904E+00         1.47993E+00         1.39932E+00         3.27927E+00         1.00000E+00         4.55777E-09         3.27927E+00         8.41835E-01         2.43744E+00
+          2.22709E-02         2.02330E-02        -2.80602E-02         1.39904E+00         1.49060E+00         1.39932E+00         3.25359E+00         1.00000E+00         4.69030E-09         3.25359E+00         8.30089E-01         2.42350E+00
+          2.22709E-02         2.04028E-02        -2.82770E-02         1.39903E+00         1.50127E+00         1.39932E+00         3.22521E+00         1.00000E+00         4.81029E-09         3.22521E+00         8.17988E-01         2.40722E+00
+          2.22709E-02         2.05726E-02        -2.84956E-02         1.39903E+00         1.51194E+00         1.39932E+00         3.19419E+00         1.00000E+00         4.91644E-09         3.19419E+00         8.05548E-01         2.38864E+00
+          2.22709E-02         2.07425E-02        -2.87161E-02         1.39902E+00         1.52261E+00         1.39932E+00         3.16059E+00         1.00000E+00         5.00743E-09         3.16059E+00         7.92785E-01         2.36780E+00
+          2.22709E-02         2.09123E-02        -2.89383E-02         1.39902E+00         1.53328E+00         1.39932E+00         3.12450E+00         1.00000E+00         5.08199E-09         3.12450E+00         7.79716E-01         2.34479E+00
+          2.22709E-02         2.10821E-02        -2.91623E-02         1.39901E+00         1.54395E+00         1.39932E+00         3.08603E+00         1.00000E+00         5.13884E-09         3.08603E+00         7.66359E-01         2.31967E+00
+          2.22709E-02         2.12520E-02        -2.93882E-02         1.39901E+00         1.55462E+00         1.39932E+00         3.04527E+00         1.00000E+00         5.17674E-09         3.04527E+00         7.52734E-01         2.29254E+00
+          2.22709E-02         2.14218E-02        -2.96159E-02         1.39900E+00         1.56529E+00         1.39932E+00         3.00234E+00         1.00000E+00         5.19450E-09         3.00234E+00         7.38858E-01         2.26348E+00
+          2.22709E-02         2.15916E-02        -2.98453E-02         1.39900E+00         1.57596E+00         1.39932E+00         2.95737E+00         1.00000E+00         5.19100E-09         2.95737E+00         7.24753E-01         2.23262E+00
+          2.22709E-02         2.17614E-02        -3.00766E-02         1.39899E+00         1.58664E+00         1.39931E+00         2.91049E+00         1.00000E+00         5.16521E-09         2.91049E+00         7.10439E-01         2.20005E+00
+          2.22709E-02         2.19313E-02        -3.03098E-02         1.39899E+00         1.59731E+00         1.39931E+00         2.86185E+00         1.00000E+00         5.11619E-09         2.86185E+00         6.95937E-01         2.16591E+00
+          2.22709E-02         2.21011E-02        -3.05447E-02         1.39898E+00         1.60798E+00         1.39931E+00         2.81158E+00         1.00000E+00         5.04315E-09         2.81158E+00         6.81268E-01         2.13031E+00
+          2.22709E-02         2.22709E-02        -3.07814E-02         1.39898E+00         1.61865E+00         1.39931E+00         2.75985E+00         1.00000E+00         4.94547E-09         2.75985E+00         6.66453E-01         2.09339E+00
+          2.22709E-02         2.24407E-02        -3.10200E-02         1.39897E+00         1.62932E+00         1.39931E+00         2.70680E+00         1.00000E+00         4.82279E-09         2.70680E+00         6.51515E-01         2.05529E+00
+          2.22709E-02         2.26106E-02        -3.12603E-02         1.39897E+00         1.63999E+00         1.39931E+00         2.65261E+00         1.00000E+00         4.67500E-09         2.65261E+00         6.36476E-01         2.01613E+00
+          2.22709E-02         2.27804E-02        -3.15025E-02         1.39896E+00         1.65066E+00         1.39931E+00         2.59743E+00         1.00000E+00         4.50245E-09         2.59743E+00         6.21357E-01         1.97607E+00
+          2.22709E-02         2.29502E-02        -3.17465E-02         1.39895E+00         1.66133E+00         1.39931E+00         2.54143E+00         1.00000E+00         4.30597E-09         2.54143E+00         6.06181E-01         1.93525E+00
+          2.22709E-02         2.31201E-02        -3.19923E-02         1.39895E+00         1.67200E+00         1.39931E+00         2.48478E+00         1.00000E+00         4.08720E-09         2.48478E+00         5.90969E-01         1.89381E+00
+          2.22709E-02         2.32899E-02        -3.22399E-02         1.39894E+00         1.68267E+00         1.39931E+00         2.42764E+00         1.00000E+00         3.84883E-09         2.42764E+00         5.75742E-01         1.85190E+00
+          2.22709E-02         2.34597E-02        -3.24893E-02         1.39894E+00         1.69334E+00         1.39932E+00         2.37018E+00         1.00000E+00         3.59514E-09         2.37018E+00         5.60523E-01         1.80966E+00
+          2.22709E-02         2.36295E-02        -3.27406E-02         1.39893E+00         1.70401E+00         1.39932E+00         2.31258E+00         1.00000E+00         3.33276E-09         2.31258E+00         5.45332E-01         1.76725E+00
+          2.22709E-02         2.37994E-02        -3.29936E-02         1.39893E+00         1.71468E+00         1.39932E+00         2.25499E+00         1.00000E+00         3.07186E-09         2.25499E+00         5.30191E-01         1.72480E+00
+          2.22709E-02         2.39692E-02        -3.32485E-02         1.39892E+00         1.72535E+00         1.39932E+00         2.19758E+00         1.00000E+00         2.82778E-09         2.19758E+00         5.15118E-01         1.68246E+00
+          2.22709E-02         2.41390E-02        -3.35052E-02         1.39892E+00         1.73602E+00         1.39932E+00         2.14051E+00         1.00000E+00         2.62281E-09         2.14051E+00         5.00134E-01         1.64038E+00
+          2.22709E-02         2.43088E-02        -3.37637E-02         1.39891E+00         1.74669E+00         1.39932E+00         2.08394E+00         1.00000E+00         2.48660E-09         2.08394E+00         4.85259E-01         1.59868E+00
+          2.22709E-02         2.44787E-02        -3.40240E-02         1.39890E+00         1.75736E+00         1.39932E+00         2.02802E+00         1.00000E+00         2.45208E-09         2.02802E+00         4.70510E-01         1.55751E+00
+          2.22709E-02         2.46485E-02        -3.42861E-02         1.39890E+00         1.76804E+00         1.39932E+00         1.97289E+00         1.00000E+00         2.54491E-09         1.97289E+00         4.55906E-01         1.51699E+00
+          2.22709E-02         2.48183E-02        -3.45500E-02         1.39889E+00         1.77871E+00         1.39932E+00         1.91871E+00         1.00000E+00         2.77243E-09         1.91871E+00         4.41464E-01         1.47725E+00
+          2.22709E-02         2.49882E-02        -3.48158E-02         1.39889E+00         1.78938E+00         1.39932E+00         1.86562E+00         1.00000E+00         3.12333E-09         1.86562E+00         4.27200E-01         1.43842E+00
+          2.22709E-02         2.51580E-02        -3.50834E-02         1.39888E+00         1.80005E+00         1.39932E+00         1.81373E+00         1.00000E+00         3.57706E-09         1.81373E+00         4.13131E-01         1.40060E+00
+          2.22709E-02         2.53278E-02        -3.53527E-02         1.39887E+00         1.81072E+00         1.39932E+00         1.76319E+00         1.00000E+00         4.11295E-09         1.76319E+00         3.99270E-01         1.36392E+00
+          2.22709E-02         2.54976E-02        -3.56239E-02         1.39887E+00         1.82139E+00         1.39932E+00         1.71410E+00         1.00000E+00         4.71410E-09         1.71410E+00         3.85633E-01         1.32847E+00
+          2.22709E-02         2.56675E-02        -3.58969E-02         1.39886E+00         1.83206E+00         1.39932E+00         1.66659E+00         1.00000E+00         5.36762E-09         1.66659E+00         3.72232E-01         1.29436E+00
+          2.22709E-02         2.58373E-02        -3.61717E-02         1.39886E+00         1.84273E+00         1.39932E+00         1.62075E+00         1.00000E+00         6.06374E-09         1.62075E+00         3.59079E-01         1.26167E+00
+          2.22709E-02         2.60071E-02        -3.64484E-02         1.39885E+00         1.85340E+00         1.39932E+00         1.57669E+00         1.00000E+00         6.79478E-09         1.57669E+00         3.46187E-01         1.23051E+00
+          2.22709E-02         2.61769E-02        -3.67268E-02         1.39884E+00         1.86407E+00         1.39933E+00         1.53450E+00         1.00000E+00         7.55448E-09         1.53450E+00         3.33565E-01         1.20093E+00
+          2.24407E-02         8.72665E-04        -1.54638E-02         1.40999E+00         2.74155E-01         1.41008E+00         7.60760E+01         1.00000E+00         1.47043E-10         7.60760E+01         2.95236E+00         7.31237E+01
+          2.24407E-02         1.04249E-03        -1.54740E-02         1.40999E+00         2.84826E-01         1.41008E+00         7.47180E+01         1.00000E+00         1.51155E-10         7.47180E+01         2.91535E+00         7.18027E+01
+          2.24407E-02         1.21232E-03        -1.54860E-02         1.40999E+00         2.95496E-01         1.41008E+00         7.33317E+01         1.00000E+00         1.55183E-10         7.33317E+01         2.87745E+00         7.04543E+01
+          2.24407E-02         1.38215E-03        -1.54999E-02         1.40999E+00         3.06167E-01         1.41008E+00         7.19194E+01         1.00000E+00         1.59072E-10         7.19194E+01         2.83873E+00         6.90807E+01
+          2.24407E-02         1.55197E-03        -1.55155E-02         1.40999E+00         3.16838E-01         1.41008E+00         7.04833E+01         1.00000E+00         1.62765E-10         7.04833E+01         2.79924E+00         6.76841E+01
+          2.24407E-02         1.72180E-03        -1.55330E-02         1.40999E+00         3.27508E-01         1.41008E+00         6.90258E+01         1.00000E+00         1.66209E-10         6.90258E+01         2.75903E+00         6.62668E+01
+          2.24407E-02         1.89163E-03        -1.55522E-02         1.40999E+00         3.38179E-01         1.41008E+00         6.75491E+01         1.00000E+00         1.69353E-10         6.75491E+01         2.71816E+00         6.48309E+01
+          2.24407E-02         2.06146E-03        -1.55733E-02         1.40999E+00         3.48849E-01         1.41008E+00         6.60555E+01         1.00000E+00         1.72147E-10         6.60555E+01         2.67669E+00         6.33788E+01
+          2.24407E-02         2.23128E-03        -1.55962E-02         1.40999E+00         3.59520E-01         1.41008E+00         6.45474E+01         1.00000E+00         1.74546E-10         6.45474E+01         2.63468E+00         6.19127E+01
+          2.24407E-02         2.40111E-03        -1.56209E-02         1.40999E+00         3.70190E-01         1.41008E+00         6.30269E+01         1.00000E+00         1.76505E-10         6.30269E+01         2.59219E+00         6.04347E+01
+          2.24407E-02         2.57094E-03        -1.56475E-02         1.40999E+00         3.80861E-01         1.41008E+00         6.14965E+01         1.00000E+00         1.77984E-10         6.14965E+01         2.54928E+00         5.89472E+01
+          2.24407E-02         2.74077E-03        -1.56758E-02         1.40999E+00         3.91532E-01         1.41008E+00         5.99583E+01         1.00000E+00         1.78944E-10         5.99583E+01         2.50601E+00         5.74523E+01
+          2.24407E-02         2.91059E-03        -1.57059E-02         1.40999E+00         4.02202E-01         1.41008E+00         5.84146E+01         1.00000E+00         1.79351E-10         5.84146E+01         2.46243E+00         5.59522E+01
+          2.24407E-02         3.08042E-03        -1.57379E-02         1.40999E+00         4.12873E-01         1.41007E+00         5.68676E+01         1.00000E+00         1.79174E-10         5.68676E+01         2.41862E+00         5.44489E+01
+          2.24407E-02         3.25025E-03        -1.57717E-02         1.40999E+00         4.23543E-01         1.41007E+00         5.53193E+01         1.00000E+00         1.78384E-10         5.53193E+01         2.37463E+00         5.29447E+01
+          2.24407E-02         3.42008E-03        -1.58072E-02         1.40999E+00         4.34214E-01         1.41007E+00         5.37721E+01         1.00000E+00         1.76958E-10         5.37721E+01         2.33052E+00         5.14416E+01
+          2.24407E-02         3.58990E-03        -1.58446E-02         1.40998E+00         4.44884E-01         1.41007E+00         5.22279E+01         1.00000E+00         1.74878E-10         5.22279E+01         2.28636E+00         4.99415E+01
+          2.24407E-02         3.75973E-03        -1.58838E-02         1.40998E+00         4.55555E-01         1.41007E+00         5.06888E+01         1.00000E+00         1.72129E-10         5.06888E+01         2.24220E+00         4.84466E+01
+          2.24407E-02         3.92956E-03        -1.59248E-02         1.40998E+00         4.66225E-01         1.41007E+00         4.91567E+01         1.00000E+00         1.68705E-10         4.91567E+01         2.19810E+00         4.69586E+01
+          2.24407E-02         4.09939E-03        -1.59677E-02         1.40998E+00         4.76896E-01         1.41007E+00         4.76337E+01         1.00000E+00         1.64605E-10         4.76337E+01         2.15413E+00         4.54795E+01
+          2.24407E-02         4.26921E-03        -1.60123E-02         1.40998E+00         4.87567E-01         1.41007E+00         4.61215E+01         1.00000E+00         1.59839E-10         4.61215E+01         2.11034E+00         4.40111E+01
+          2.24407E-02         4.43904E-03        -1.60588E-02         1.40998E+00         4.98237E-01         1.41007E+00         4.46220E+01         1.00000E+00         1.54428E-10         4.46220E+01         2.06678E+00         4.25552E+01
+          2.24407E-02         4.60887E-03        -1.61070E-02         1.40998E+00         5.08908E-01         1.41007E+00         4.31369E+01         1.00000E+00         1.48407E-10         4.31369E+01         2.02352E+00         4.11133E+01
+          2.24407E-02         4.77869E-03        -1.61571E-02         1.40998E+00         5.19578E-01         1.41007E+00         4.16679E+01         1.00000E+00         1.41834E-10         4.16679E+01         1.98062E+00         3.96873E+01
+          2.24407E-02         4.94852E-03        -1.62090E-02         1.40998E+00         5.30249E-01         1.41007E+00         4.02166E+01         1.00000E+00         1.34792E-10         4.02166E+01         1.93811E+00         3.82785E+01
+          2.24407E-02         5.11835E-03        -1.62627E-02         1.40998E+00         5.40919E-01         1.41007E+00         3.87845E+01         1.00000E+00         1.27401E-10         3.87845E+01         1.89607E+00         3.68885E+01
+          2.24407E-02         5.28818E-03        -1.63182E-02         1.40997E+00         5.51590E-01         1.41007E+00         3.73732E+01         1.00000E+00         1.19836E-10         3.73732E+01         1.85454E+00         3.55186E+01
+          2.24407E-02         5.45800E-03        -1.63755E-02         1.40997E+00         5.62261E-01         1.41007E+00         3.59839E+01         1.00000E+00         1.12342E-10         3.59839E+01         1.81357E+00         3.41703E+01
+          2.24407E-02         5.62783E-03        -1.64346E-02         1.40997E+00         5.72931E-01         1.41007E+00         3.46180E+01         1.00000E+00         1.05263E-10         3.46180E+01         1.77321E+00         3.28448E+01
+          2.24407E-02         5.79766E-03        -1.64956E-02         1.40997E+00         5.83602E-01         1.41007E+00         3.32768E+01         1.00000E+00         9.90644E-11         3.32768E+01         1.73351E+00         3.15433E+01
+          2.24407E-02         5.96749E-03        -1.65583E-02         1.40997E+00         5.94272E-01         1.41007E+00         3.19612E+01         1.00000E+00         9.43453E-11         3.19612E+01         1.69450E+00         3.02667E+01
+          2.24407E-02         6.13731E-03        -1.66229E-02         1.40997E+00         6.04943E-01         1.41007E+00         3.06725E+01         1.00000E+00         9.17951E-11         3.06725E+01         1.65625E+00         2.90163E+01
+          2.24407E-02         6.30714E-03        -1.66893E-02         1.40997E+00         6.15613E-01         1.41006E+00         2.94116E+01         1.00000E+00         9.20759E-11         2.94116E+01         1.61878E+00         2.77929E+01
+          2.24407E-02         6.47697E-03        -1.67575E-02         1.40996E+00         6.26284E-01         1.41006E+00         2.81794E+01         1.00000E+00         9.56416E-11         2.81794E+01         1.58213E+00         2.65973E+01
+          2.24407E-02         6.64680E-03        -1.68275E-02         1.40996E+00         6.36955E-01         1.41006E+00         2.69768E+01         1.00000E+00         1.02607E-10         2.69768E+01         1.54635E+00         2.54304E+01
+          2.24407E-02         6.81662E-03        -1.68993E-02         1.40996E+00         6.47625E-01         1.41006E+00         2.58043E+01         1.00000E+00         1.12763E-10         2.58043E+01         1.51146E+00         2.42929E+01
+          2.24407E-02         6.98645E-03        -1.69729E-02         1.40996E+00         6.58296E-01         1.41006E+00         2.46628E+01         1.00000E+00         1.25715E-10         2.46628E+01         1.47751E+00         2.31853E+01
+          2.24407E-02         7.15628E-03        -1.70484E-02         1.40996E+00         6.68966E-01         1.41006E+00         2.35527E+01         1.00000E+00         1.41028E-10         2.35527E+01         1.44451E+00         2.21082E+01
+          2.24407E-02         7.32611E-03        -1.71256E-02         1.40996E+00         6.79637E-01         1.41006E+00         2.24746E+01         1.00000E+00         1.58305E-10         2.24746E+01         1.41250E+00         2.10621E+01
+          2.24407E-02         7.49593E-03        -1.72047E-02         1.40995E+00         6.90307E-01         1.41006E+00         2.14289E+01         1.00000E+00         1.77218E-10         2.14289E+01         1.38150E+00         2.00474E+01
+          2.24407E-02         7.66576E-03        -1.72855E-02         1.40995E+00         7.00978E-01         1.41006E+00         2.04159E+01         1.00000E+00         1.97504E-10         2.04159E+01         1.35153E+00         1.90643E+01
+          2.24407E-02         7.83559E-03        -1.73682E-02         1.40995E+00         7.11649E-01         1.41006E+00         1.94358E+01         1.00000E+00         2.18951E-10         1.94358E+01         1.32262E+00         1.81132E+01
+          2.24407E-02         8.00542E-03        -1.74527E-02         1.40995E+00         7.22319E-01         1.41006E+00         1.84889E+01         1.00000E+00         2.41382E-10         1.84889E+01         1.29478E+00         1.71941E+01
+          2.24407E-02         8.17524E-03        -1.75390E-02         1.40995E+00         7.32990E-01         1.41006E+00         1.75752E+01         1.00000E+00         2.64648E-10         1.75752E+01         1.26803E+00         1.63072E+01
+          2.24407E-02         8.34507E-03        -1.76272E-02         1.40994E+00         7.43660E-01         1.41005E+00         1.66948E+01         1.00000E+00         2.88615E-10         1.66948E+01         1.24237E+00         1.54525E+01
+          2.24407E-02         8.51490E-03        -1.77171E-02         1.40994E+00         7.54331E-01         1.41005E+00         1.58477E+01         1.00000E+00         3.13160E-10         1.58477E+01         1.21781E+00         1.46299E+01
+          2.24407E-02         8.68473E-03        -1.78088E-02         1.40994E+00         7.65001E-01         1.41005E+00         1.50337E+01         1.00000E+00         3.38166E-10         1.50337E+01         1.19437E+00         1.38393E+01
+          2.24407E-02         8.85455E-03        -1.79024E-02         1.40994E+00         7.75672E-01         1.41005E+00         1.42527E+01         1.00000E+00         3.63519E-10         1.42527E+01         1.17205E+00         1.30807E+01
+          2.24407E-02         9.02438E-03        -1.79978E-02         1.40994E+00         7.86343E-01         1.41005E+00         1.35045E+01         1.00000E+00         3.89104E-10         1.35045E+01         1.15084E+00         1.23536E+01
+          2.24407E-02         9.19421E-03        -1.80949E-02         1.40993E+00         7.97013E-01         1.41005E+00         1.27887E+01         1.00000E+00         4.14806E-10         1.27887E+01         1.13074E+00         1.16580E+01
+          2.24407E-02         9.36403E-03        -1.81939E-02         1.40993E+00         8.07684E-01         1.41005E+00         1.21051E+01         1.00000E+00         4.40506E-10         1.21051E+01         1.11176E+00         1.09933E+01
+          2.24407E-02         9.53386E-03        -1.82947E-02         1.40993E+00         8.18354E-01         1.41005E+00         1.14531E+01         1.00000E+00         4.66084E-10         1.14531E+01         1.09388E+00         1.03592E+01
+          2.24407E-02         9.70369E-03        -1.83974E-02         1.40993E+00         8.29025E-01         1.41005E+00         1.08325E+01         1.00000E+00         4.91412E-10         1.08325E+01         1.07709E+00         9.75538E+00
+          2.24407E-02         9.87352E-03        -1.85018E-02         1.40992E+00         8.39695E-01         1.41005E+00         1.02426E+01         1.00000E+00         5.16360E-10         1.02426E+01         1.06138E+00         9.18119E+00
+          2.24407E-02         1.00433E-02        -1.86080E-02         1.40992E+00         8.50366E-01         1.41005E+00         9.68290E+00         1.00000E+00         5.40791E-10         9.68290E+00         1.04674E+00         8.63616E+00
+          2.24407E-02         1.02132E-02        -1.87161E-02         1.40992E+00         8.61037E-01         1.41004E+00         9.15286E+00         1.00000E+00         5.64566E-10         9.15286E+00         1.03314E+00         8.11972E+00
+          2.24407E-02         1.03830E-02        -1.88259E-02         1.40992E+00         8.71707E-01         1.41004E+00         8.65182E+00         1.00000E+00         5.87539E-10         8.65182E+00         1.02058E+00         7.63124E+00
+          2.24407E-02         1.05528E-02        -1.89376E-02         1.40992E+00         8.82378E-01         1.41004E+00         8.17912E+00         1.00000E+00         6.09557E-10         8.17912E+00         1.00902E+00         7.17010E+00
+          2.24407E-02         1.07227E-02        -1.90511E-02         1.40991E+00         8.93048E-01         1.41004E+00         7.73405E+00         1.00000E+00         6.30466E-10         7.73405E+00         9.98449E-01         6.73560E+00
+          2.24407E-02         1.08925E-02        -1.91664E-02         1.40991E+00         9.03719E-01         1.41004E+00         7.31588E+00         1.00000E+00         6.50106E-10         7.31588E+00         9.88832E-01         6.32705E+00
+          2.24407E-02         1.10623E-02        -1.92835E-02         1.40991E+00         9.14389E-01         1.41004E+00         6.92386E+00         1.00000E+00         6.68312E-10         6.92386E+00         9.80143E-01         5.94371E+00
+          2.24407E-02         1.12321E-02        -1.94024E-02         1.40990E+00         9.25060E-01         1.41004E+00         6.55719E+00         1.00000E+00         6.84918E-10         6.55719E+00         9.72351E-01         5.58484E+00
+          2.24407E-02         1.14020E-02        -1.95232E-02         1.40990E+00         9.35731E-01         1.41004E+00         6.21507E+00         1.00000E+00         6.99753E-10         6.21507E+00         9.65425E-01         5.24965E+00
+          2.24407E-02         1.15718E-02        -1.96457E-02         1.40990E+00         9.46401E-01         1.41004E+00         5.89668E+00         1.00000E+00         7.12646E-10         5.89668E+00         9.59331E-01         4.93735E+00
+          2.24407E-02         1.17416E-02        -1.97701E-02         1.40990E+00         9.57072E-01         1.41004E+00         5.60117E+00         1.00000E+00         7.23426E-10         5.60117E+00         9.54034E-01         4.64714E+00
+          2.24407E-02         1.19114E-02        -1.98963E-02         1.40989E+00         9.67742E-01         1.41003E+00         5.32769E+00         1.00000E+00         7.31921E-10         5.32769E+00         9.49495E-01         4.37820E+00
+          2.24407E-02         1.20813E-02        -2.00242E-02         1.40989E+00         9.78413E-01         1.41003E+00         5.07537E+00         1.00000E+00         7.37965E-10         5.07537E+00         9.45678E-01         4.12969E+00
+          2.24407E-02         1.22511E-02        -2.01540E-02         1.40989E+00         9.89083E-01         1.41003E+00         4.84334E+00         1.00000E+00         7.41395E-10         4.84334E+00         9.42542E-01         3.90080E+00
+          2.24407E-02         1.24209E-02        -2.02857E-02         1.40988E+00         9.99754E-01         1.41003E+00         4.63071E+00         1.00000E+00         7.42055E-10         4.63071E+00         9.40046E-01         3.69066E+00
+          2.24407E-02         1.25908E-02        -2.04191E-02         1.40988E+00         1.01042E+00         1.41003E+00         4.43660E+00         1.00000E+00         7.39803E-10         4.43660E+00         9.38148E-01         3.49846E+00
+          2.24407E-02         1.27606E-02        -2.05543E-02         1.40988E+00         1.02110E+00         1.41003E+00         4.26014E+00         1.00000E+00         7.34509E-10         4.26014E+00         9.36807E-01         3.32333E+00
+          2.24407E-02         1.29304E-02        -2.06914E-02         1.40988E+00         1.03177E+00         1.41003E+00         4.10043E+00         1.00000E+00         7.26066E-10         4.10043E+00         9.35978E-01         3.16446E+00
+          2.24407E-02         1.31002E-02        -2.08302E-02         1.40987E+00         1.04244E+00         1.41003E+00         3.95661E+00         1.00000E+00         7.14394E-10         3.95661E+00         9.35618E-01         3.02099E+00
+          2.24407E-02         1.32701E-02        -2.09709E-02         1.40987E+00         1.05311E+00         1.41003E+00         3.82779E+00         1.00000E+00         6.99452E-10         3.82779E+00         9.35682E-01         2.89211E+00
+          2.24407E-02         1.34399E-02        -2.11134E-02         1.40987E+00         1.06378E+00         1.41002E+00         3.71313E+00         1.00000E+00         6.81248E-10         3.71313E+00         9.36126E-01         2.77700E+00
+          2.24407E-02         1.36097E-02        -2.12577E-02         1.40986E+00         1.07445E+00         1.41002E+00         3.61175E+00         1.00000E+00         6.59862E-10         3.61175E+00         9.36904E-01         2.67485E+00
+          2.24407E-02         1.37795E-02        -2.14038E-02         1.40986E+00         1.08512E+00         1.41002E+00         3.52283E+00         1.00000E+00         6.35466E-10         3.52283E+00         9.37971E-01         2.58486E+00
+          2.24407E-02         1.39494E-02        -2.15517E-02         1.40986E+00         1.09579E+00         1.41002E+00         3.44553E+00         1.00000E+00         6.08369E-10         3.44553E+00         9.39283E-01         2.50625E+00
+          2.24407E-02         1.41192E-02        -2.17014E-02         1.40985E+00         1.10646E+00         1.41002E+00         3.37905E+00         1.00000E+00         5.79063E-10         3.37905E+00         9.40796E-01         2.43826E+00
+          2.24407E-02         1.42890E-02        -2.18530E-02         1.40985E+00         1.11713E+00         1.41002E+00         3.32259E+00         1.00000E+00         5.48306E-10         3.32259E+00         9.42464E-01         2.38013E+00
+          2.24407E-02         1.44589E-02        -2.20063E-02         1.40985E+00         1.12780E+00         1.41002E+00         3.27537E+00         1.00000E+00         5.17231E-10         3.27537E+00         9.44244E-01         2.33113E+00
+          2.24407E-02         1.46287E-02        -2.21615E-02         1.40984E+00         1.13847E+00         1.41002E+00         3.23664E+00         1.00000E+00         4.87479E-10         3.23664E+00         9.46094E-01         2.29054E+00
+          2.24407E-02         1.47985E-02        -2.23185E-02         1.40984E+00         1.14914E+00         1.41002E+00         3.20565E+00         1.00000E+00         4.61356E-10         3.20565E+00         9.47970E-01         2.25768E+00
+          2.24407E-02         1.49683E-02        -2.24773E-02         1.40984E+00         1.15981E+00         1.41001E+00         3.18171E+00         1.00000E+00         4.41900E-10         3.18171E+00         9.49831E-01         2.23187E+00
+          2.24407E-02         1.51382E-02        -2.26379E-02         1.40983E+00         1.17048E+00         1.41001E+00         3.16410E+00         1.00000E+00         4.32711E-10         3.16410E+00         9.51636E-01         2.21246E+00
+          2.24407E-02         1.53080E-02        -2.28003E-02         1.40983E+00         1.18115E+00         1.41001E+00         3.15217E+00         1.00000E+00         4.37343E-10         3.15217E+00         9.53347E-01         2.19883E+00
+          2.24407E-02         1.54778E-02        -2.29645E-02         1.40982E+00         1.19182E+00         1.41001E+00         3.14528E+00         1.00000E+00         4.58350E-10         3.14528E+00         9.54924E-01         2.19035E+00
+          2.24407E-02         1.56476E-02        -2.31305E-02         1.40982E+00         1.20249E+00         1.41001E+00         3.14279E+00         1.00000E+00         4.96559E-10         3.14279E+00         9.56332E-01         2.18646E+00
+          2.24407E-02         1.58175E-02        -2.32984E-02         1.40982E+00         1.21317E+00         1.41001E+00         3.14413E+00         1.00000E+00         5.51130E-10         3.14413E+00         9.57534E-01         2.18660E+00
+          2.24407E-02         1.59873E-02        -2.34681E-02         1.40981E+00         1.22384E+00         1.41001E+00         3.14873E+00         1.00000E+00         6.20263E-10         3.14873E+00         9.58497E-01         2.19023E+00
+          2.24407E-02         1.61571E-02        -2.36395E-02         1.40981E+00         1.23451E+00         1.41001E+00         3.15603E+00         1.00000E+00         7.01918E-10         3.15603E+00         9.59187E-01         2.19685E+00
+          2.24407E-02         1.63270E-02        -2.38128E-02         1.40981E+00         1.24518E+00         1.41001E+00         3.16554E+00         1.00000E+00         7.94238E-10         3.16554E+00         9.59575E-01         2.20597E+00
+          2.24407E-02         1.64968E-02        -2.39879E-02         1.40980E+00         1.25585E+00         1.41001E+00         3.17676E+00         1.00000E+00         8.95674E-10         3.17676E+00         9.59632E-01         2.21713E+00
+          2.24407E-02         1.66666E-02        -2.41649E-02         1.40980E+00         1.26652E+00         1.41000E+00         3.18924E+00         1.00000E+00         1.00497E-09         3.18924E+00         9.59329E-01         2.22991E+00
+          2.24407E-02         1.68364E-02        -2.43436E-02         1.40979E+00         1.27719E+00         1.41000E+00         3.20253E+00         1.00000E+00         1.12108E-09         3.20253E+00         9.58643E-01         2.24389E+00
+          2.24407E-02         1.70063E-02        -2.45241E-02         1.40979E+00         1.28786E+00         1.41000E+00         3.21624E+00         1.00000E+00         1.24314E-09         3.21624E+00         9.57548E-01         2.25869E+00
+          2.24407E-02         1.71761E-02        -2.47065E-02         1.40979E+00         1.29853E+00         1.41000E+00         3.22999E+00         1.00000E+00         1.37037E-09         3.22999E+00         9.56024E-01         2.27396E+00
+          2.24407E-02         1.73459E-02        -2.48906E-02         1.40978E+00         1.30920E+00         1.41000E+00         3.24341E+00         1.00000E+00         1.50206E-09         3.24341E+00         9.54052E-01         2.28936E+00
+          2.24407E-02         1.75158E-02        -2.50766E-02         1.40978E+00         1.31987E+00         1.41000E+00         3.25620E+00         1.00000E+00         1.63752E-09         3.25620E+00         9.51613E-01         2.30458E+00
+          2.24407E-02         1.76856E-02        -2.52644E-02         1.40977E+00         1.33054E+00         1.41000E+00         3.26804E+00         1.00000E+00         1.77610E-09         3.26804E+00         9.48693E-01         2.31934E+00
+          2.24407E-02         1.78554E-02        -2.54540E-02         1.40977E+00         1.34121E+00         1.41000E+00         3.27866E+00         1.00000E+00         1.91712E-09         3.27866E+00         9.45278E-01         2.33338E+00
+          2.24407E-02         1.80252E-02        -2.56454E-02         1.40976E+00         1.35188E+00         1.41000E+00         3.28781E+00         1.00000E+00         2.05990E-09         3.28781E+00         9.41356E-01         2.34645E+00
+          2.24407E-02         1.81951E-02        -2.58387E-02         1.40976E+00         1.36255E+00         1.41000E+00         3.29527E+00         1.00000E+00         2.20374E-09         3.29527E+00         9.36919E-01         2.35835E+00
+          2.24407E-02         1.83649E-02        -2.60337E-02         1.40976E+00         1.37322E+00         1.41000E+00         3.30083E+00         1.00000E+00         2.34791E-09         3.30083E+00         9.31959E-01         2.36887E+00
+          2.24407E-02         1.85347E-02        -2.62306E-02         1.40975E+00         1.38389E+00         1.41000E+00         3.30432E+00         1.00000E+00         2.49165E-09         3.30432E+00         9.26471E-01         2.37785E+00
+          2.24407E-02         1.87045E-02        -2.64292E-02         1.40975E+00         1.39457E+00         1.40999E+00         3.30558E+00         1.00000E+00         2.63418E-09         3.30558E+00         9.20451E-01         2.38513E+00
+          2.24407E-02         1.88744E-02        -2.66297E-02         1.40974E+00         1.40524E+00         1.40999E+00         3.30448E+00         1.00000E+00         2.77467E-09         3.30448E+00         9.13900E-01         2.39058E+00
+          2.24407E-02         1.90442E-02        -2.68320E-02         1.40974E+00         1.41591E+00         1.40999E+00         3.30091E+00         1.00000E+00         2.91230E-09         3.30091E+00         9.06817E-01         2.39409E+00
+          2.24407E-02         1.92140E-02        -2.70361E-02         1.40973E+00         1.42658E+00         1.40999E+00         3.29478E+00         1.00000E+00         3.04617E-09         3.29478E+00         8.99205E-01         2.39557E+00
+          2.24407E-02         1.93839E-02        -2.72420E-02         1.40973E+00         1.43725E+00         1.40999E+00         3.28601E+00         1.00000E+00         3.17539E-09         3.28601E+00         8.91069E-01         2.39494E+00
+          2.24407E-02         1.95537E-02        -2.74497E-02         1.40972E+00         1.44792E+00         1.40999E+00         3.27456E+00         1.00000E+00         3.29904E-09         3.27456E+00         8.82416E-01         2.39214E+00
+          2.24407E-02         1.97235E-02        -2.76593E-02         1.40972E+00         1.45859E+00         1.40999E+00         3.26039E+00         1.00000E+00         3.41616E-09         3.26039E+00         8.73252E-01         2.38714E+00
+          2.24407E-02         1.98933E-02        -2.78706E-02         1.40971E+00         1.46926E+00         1.40999E+00         3.24349E+00         1.00000E+00         3.52579E-09         3.24349E+00         8.63590E-01         2.37990E+00
+          2.24407E-02         2.00632E-02        -2.80838E-02         1.40971E+00         1.47993E+00         1.40999E+00         3.22385E+00         1.00000E+00         3.62696E-09         3.22385E+00         8.53439E-01         2.37041E+00
+          2.24407E-02         2.02330E-02        -2.82988E-02         1.40970E+00         1.49060E+00         1.40999E+00         3.20150E+00         1.00000E+00         3.71867E-09         3.20150E+00         8.42813E-01         2.35869E+00
+          2.24407E-02         2.04028E-02        -2.85156E-02         1.40970E+00         1.50127E+00         1.40999E+00         3.17647E+00         1.00000E+00         3.79994E-09         3.17647E+00         8.31727E-01         2.34474E+00
+          2.24407E-02         2.05726E-02        -2.87342E-02         1.40970E+00         1.51194E+00         1.40999E+00         3.14880E+00         1.00000E+00         3.86979E-09         3.14880E+00         8.20196E-01         2.32861E+00
+          2.24407E-02         2.07425E-02        -2.89546E-02         1.40969E+00         1.52261E+00         1.40999E+00         3.11856E+00         1.00000E+00         3.92725E-09         3.11856E+00         8.08238E-01         2.31032E+00
+          2.24407E-02         2.09123E-02        -2.91768E-02         1.40969E+00         1.53328E+00         1.40999E+00         3.08581E+00         1.00000E+00         3.97139E-09         3.08581E+00         7.95871E-01         2.28994E+00
+          2.24407E-02         2.10821E-02        -2.94009E-02         1.40968E+00         1.54395E+00         1.40999E+00         3.05064E+00         1.00000E+00         4.00129E-09         3.05064E+00         7.83115E-01         2.26752E+00
+          2.24407E-02         2.12520E-02        -2.96267E-02         1.40968E+00         1.55462E+00         1.40999E+00         3.01314E+00         1.00000E+00         4.01611E-09         3.01314E+00         7.69991E-01         2.24315E+00
+          2.24407E-02         2.14218E-02        -2.98544E-02         1.40967E+00         1.56529E+00         1.40999E+00         2.97342E+00         1.00000E+00         4.01504E-09         2.97342E+00         7.56521E-01         2.21690E+00
+          2.24407E-02         2.15916E-02        -3.00839E-02         1.40966E+00         1.57596E+00         1.40999E+00         2.93160E+00         1.00000E+00         3.99738E-09         2.93160E+00         7.42726E-01         2.18887E+00
+          2.24407E-02         2.17614E-02        -3.03152E-02         1.40966E+00         1.58664E+00         1.40999E+00         2.88778E+00         1.00000E+00         3.96255E-09         2.88778E+00         7.28630E-01         2.15915E+00
+          2.24407E-02         2.19313E-02        -3.05483E-02         1.40965E+00         1.59731E+00         1.40999E+00         2.84211E+00         1.00000E+00         3.91008E-09         2.84211E+00         7.14258E-01         2.12785E+00
+          2.24407E-02         2.21011E-02        -3.07832E-02         1.40965E+00         1.60798E+00         1.40999E+00         2.79471E+00         1.00000E+00         3.83971E-09         2.79471E+00         6.99633E-01         2.09508E+00
+          2.24407E-02         2.22709E-02        -3.10200E-02         1.40964E+00         1.61865E+00         1.40999E+00         2.74573E+00         1.00000E+00         3.75140E-09         2.74573E+00         6.84781E-01         2.06095E+00
+          2.24407E-02         2.24407E-02        -3.12585E-02         1.40964E+00         1.62932E+00         1.40999E+00         2.69532E+00         1.00000E+00         3.64543E-09         2.69532E+00         6.69726E-01         2.02559E+00
+          2.24407E-02         2.26106E-02        -3.14989E-02         1.40963E+00         1.63999E+00         1.40999E+00         2.64362E+00         1.00000E+00         3.52250E-09         2.64362E+00         6.54496E-01         1.98913E+00
+          2.24407E-02         2.27804E-02        -3.17411E-02         1.40963E+00         1.65066E+00         1.40999E+00         2.59079E+00         1.00000E+00         3.38385E-09         2.59079E+00         6.39114E-01         1.95168E+00
+          2.24407E-02         2.29502E-02        -3.19850E-02         1.40962E+00         1.66133E+00         1.40999E+00         2.53699E+00         1.00000E+00         3.23151E-09         2.53699E+00         6.23609E-01         1.91338E+00
+          2.24407E-02         2.31201E-02        -3.22308E-02         1.40962E+00         1.67200E+00         1.40999E+00         2.48237E+00         1.00000E+00         3.06853E-09         2.48237E+00         6.08004E-01         1.87436E+00
+          2.24407E-02         2.32899E-02        -3.24785E-02         1.40961E+00         1.68267E+00         1.40999E+00         2.42709E+00         1.00000E+00         2.89946E-09         2.42709E+00         5.92326E-01         1.83476E+00
+          2.24407E-02         2.34597E-02        -3.27279E-02         1.40961E+00         1.69334E+00         1.40999E+00         2.37131E+00         1.00000E+00         2.73090E-09         2.37131E+00         5.76601E-01         1.79471E+00
+          2.24407E-02         2.36295E-02        -3.29791E-02         1.40960E+00         1.70401E+00         1.40999E+00         2.31520E+00         1.00000E+00         2.57215E-09         2.31520E+00         5.60854E-01         1.75435E+00
+          2.24407E-02         2.37994E-02        -3.32322E-02         1.40959E+00         1.71468E+00         1.40999E+00         2.25891E+00         1.00000E+00         2.43591E-09         2.25891E+00         5.45110E-01         1.71380E+00
+          2.24407E-02         2.39692E-02        -3.34870E-02         1.40959E+00         1.72535E+00         1.40999E+00         2.20260E+00         1.00000E+00         2.33835E-09         2.20260E+00         5.29394E-01         1.67321E+00
+          2.24407E-02         2.41390E-02        -3.37437E-02         1.40958E+00         1.73602E+00         1.40999E+00         2.14643E+00         1.00000E+00         2.29778E-09         2.14643E+00         5.13730E-01         1.63270E+00
+          2.24407E-02         2.43088E-02        -3.40022E-02         1.40958E+00         1.74669E+00         1.40999E+00         2.09055E+00         1.00000E+00         2.33111E-09         2.09055E+00         4.98140E-01         1.59241E+00
+          2.24407E-02         2.44787E-02        -3.42625E-02         1.40957E+00         1.75736E+00         1.40999E+00         2.03511E+00         1.00000E+00         2.44910E-09         2.03511E+00         4.82649E-01         1.55246E+00
+          2.24407E-02         2.46485E-02        -3.45246E-02         1.40957E+00         1.76804E+00         1.40999E+00         1.98026E+00         1.00000E+00         2.65351E-09         1.98026E+00         4.67277E-01         1.51298E+00
+          2.24407E-02         2.48183E-02        -3.47886E-02         1.40956E+00         1.77871E+00         1.40999E+00         1.92614E+00         1.00000E+00         2.93821E-09         1.92614E+00         4.52048E-01         1.47409E+00
+          2.24407E-02         2.49882E-02        -3.50543E-02         1.40955E+00         1.78938E+00         1.40999E+00         1.87289E+00         1.00000E+00         3.29294E-09         1.87289E+00         4.36980E-01         1.43591E+00
+          2.24407E-02         2.51580E-02        -3.53219E-02         1.40955E+00         1.80005E+00         1.40999E+00         1.82064E+00         1.00000E+00         3.70676E-09         1.82064E+00         4.22095E-01         1.39855E+00
+          2.24407E-02         2.53278E-02        -3.55913E-02         1.40954E+00         1.81072E+00         1.40999E+00         1.76953E+00         1.00000E+00         4.16983E-09         1.76953E+00         4.07410E-01         1.36212E+00
+          2.24407E-02         2.54976E-02        -3.58625E-02         1.40954E+00         1.82139E+00         1.40999E+00         1.71966E+00         1.00000E+00         4.67389E-09         1.71966E+00         3.92944E-01         1.32672E+00
+          2.24407E-02         2.56675E-02        -3.61355E-02         1.40953E+00         1.83206E+00         1.40999E+00         1.67116E+00         1.00000E+00         5.21218E-09         1.67116E+00         3.78713E-01         1.29245E+00
+          2.24407E-02         2.58373E-02        -3.64103E-02         1.40952E+00         1.84273E+00         1.40999E+00         1.62415E+00         1.00000E+00         5.77905E-09         1.62415E+00         3.64734E-01         1.25941E+00
+          2.24407E-02         2.60071E-02        -3.66869E-02         1.40952E+00         1.85340E+00         1.40999E+00         1.57871E+00         1.00000E+00         6.36964E-09         1.57871E+00         3.51020E-01         1.22769E+00
+          2.24407E-02         2.61769E-02        -3.69653E-02         1.40951E+00         1.86407E+00         1.41000E+00         1.53495E+00         1.00000E+00         6.97966E-09         1.53495E+00         3.37586E-01         1.19736E+00
+          2.26106E-02         8.72665E-04        -1.57042E-02         1.42066E+00         2.74155E-01         1.42075E+00         7.43966E+01         1.00000E+00         1.12427E-10         7.43966E+01         3.17398E+00         7.12226E+01
+          2.26106E-02         1.04249E-03        -1.57144E-02         1.42066E+00         2.84826E-01         1.42075E+00         7.30697E+01         1.00000E+00         1.14179E-10         7.30697E+01         3.13181E+00         6.99379E+01
+          2.26106E-02         1.21232E-03        -1.57264E-02         1.42066E+00         2.95496E-01         1.42075E+00         7.17151E+01         1.00000E+00         1.15911E-10         7.17151E+01         3.08862E+00         6.86265E+01
+          2.26106E-02         1.38215E-03        -1.57403E-02         1.42066E+00         3.06167E-01         1.42075E+00         7.03351E+01         1.00000E+00         1.17587E-10         7.03351E+01         3.04445E+00         6.72907E+01
+          2.26106E-02         1.55197E-03        -1.57559E-02         1.42066E+00         3.16838E-01         1.42075E+00         6.89319E+01         1.00000E+00         1.19168E-10         6.89319E+01         2.99939E+00         6.59325E+01
+          2.26106E-02         1.72180E-03        -1.57734E-02         1.42066E+00         3.27508E-01         1.42075E+00         6.75077E+01         1.00000E+00         1.20620E-10         6.75077E+01         2.95348E+00         6.45542E+01
+          2.26106E-02         1.89163E-03        -1.57927E-02         1.42066E+00         3.38179E-01         1.42075E+00         6.60647E+01         1.00000E+00         1.21906E-10         6.60647E+01         2.90680E+00         6.31579E+01
+          2.26106E-02         2.06146E-03        -1.58137E-02         1.42066E+00         3.48849E-01         1.42075E+00         6.46052E+01         1.00000E+00         1.22993E-10         6.46052E+01         2.85941E+00         6.17458E+01
+          2.26106E-02         2.23128E-03        -1.58366E-02         1.42066E+00         3.59520E-01         1.42075E+00         6.31315E+01         1.00000E+00         1.23846E-10         6.31315E+01         2.81137E+00         6.03201E+01
+          2.26106E-02         2.40111E-03        -1.58614E-02         1.42066E+00         3.70190E-01         1.42075E+00         6.16458E+01         1.00000E+00         1.24435E-10         6.16458E+01         2.76276E+00         5.88830E+01
+          2.26106E-02         2.57094E-03        -1.58879E-02         1.42066E+00         3.80861E-01         1.42075E+00         6.01502E+01         1.00000E+00         1.24730E-10         6.01502E+01         2.71364E+00         5.74365E+01
+          2.26106E-02         2.74077E-03        -1.59162E-02         1.42066E+00         3.91532E-01         1.42075E+00         5.86470E+01         1.00000E+00         1.24705E-10         5.86470E+01         2.66407E+00         5.59829E+01
+          2.26106E-02         2.91059E-03        -1.59463E-02         1.42066E+00         4.02202E-01         1.42075E+00         5.71384E+01         1.00000E+00         1.24336E-10         5.71384E+01         2.61414E+00         5.45243E+01
+          2.26106E-02         3.08042E-03        -1.59783E-02         1.42066E+00         4.12873E-01         1.42075E+00         5.56265E+01         1.00000E+00         1.23600E-10         5.56265E+01         2.56390E+00         5.30626E+01
+          2.26106E-02         3.25025E-03        -1.60121E-02         1.42066E+00         4.23543E-01         1.42075E+00         5.41134E+01         1.00000E+00         1.22479E-10         5.41134E+01         2.51342E+00         5.16000E+01
+          2.26106E-02         3.42008E-03        -1.60477E-02         1.42066E+00         4.34214E-01         1.42075E+00         5.26013E+01         1.00000E+00         1.20959E-10         5.26013E+01         2.46278E+00         5.01385E+01
+          2.26106E-02         3.58990E-03        -1.60850E-02         1.42066E+00         4.44884E-01         1.42075E+00         5.10921E+01         1.00000E+00         1.19030E-10         5.10921E+01         2.41204E+00         4.86800E+01
+          2.26106E-02         3.75973E-03        -1.61242E-02         1.42065E+00         4.55555E-01         1.42075E+00         4.95878E+01         1.00000E+00         1.16686E-10         4.95878E+01         2.36128E+00         4.72265E+01
+          2.26106E-02         3.92956E-03        -1.61653E-02         1.42065E+00         4.66225E-01         1.42075E+00         4.80903E+01         1.00000E+00         1.13928E-10         4.80903E+01         2.31055E+00         4.57798E+01
+          2.26106E-02         4.09939E-03        -1.62081E-02         1.42065E+00         4.76896E-01         1.42074E+00         4.66016E+01         1.00000E+00         1.10765E-10         4.66016E+01         2.25994E+00         4.43417E+01
+          2.26106E-02         4.26921E-03        -1.62527E-02         1.42065E+00         4.87567E-01         1.42074E+00         4.51235E+01         1.00000E+00         1.07215E-10         4.51235E+01         2.20950E+00         4.29140E+01
+          2.26106E-02         4.43904E-03        -1.62992E-02         1.42065E+00         4.98237E-01         1.42074E+00         4.36578E+01         1.00000E+00         1.03309E-10         4.36578E+01         2.15930E+00         4.14985E+01
+          2.26106E-02         4.60887E-03        -1.63474E-02         1.42065E+00         5.08908E-01         1.42074E+00         4.22060E+01         1.00000E+00         9.90937E-11         4.22060E+01         2.10941E+00         4.00966E+01
+          2.26106E-02         4.77869E-03        -1.63975E-02         1.42065E+00         5.19578E-01         1.42074E+00         4.07700E+01         1.00000E+00         9.46366E-11         4.07700E+01         2.05989E+00         3.87101E+01
+          2.26106E-02         4.94852E-03        -1.64494E-02         1.42065E+00         5.30249E-01         1.42074E+00         3.93512E+01         1.00000E+00         9.00347E-11         3.93512E+01         2.01081E+00         3.73404E+01
+          2.26106E-02         5.11835E-03        -1.65031E-02         1.42065E+00         5.40919E-01         1.42074E+00         3.79511E+01         1.00000E+00         8.54229E-11         3.79511E+01         1.96223E+00         3.59889E+01
+          2.26106E-02         5.28818E-03        -1.65586E-02         1.42064E+00         5.51590E-01         1.42074E+00         3.65712E+01         1.00000E+00         8.09855E-11         3.65712E+01         1.91420E+00         3.46570E+01
+          2.26106E-02         5.45800E-03        -1.66159E-02         1.42064E+00         5.62261E-01         1.42074E+00         3.52129E+01         1.00000E+00         7.69678E-11         3.52129E+01         1.86680E+00         3.33461E+01
+          2.26106E-02         5.62783E-03        -1.66750E-02         1.42064E+00         5.72931E-01         1.42074E+00         3.38773E+01         1.00000E+00         7.36832E-11         3.38773E+01         1.82006E+00         3.20572E+01
+          2.26106E-02         5.79766E-03        -1.67360E-02         1.42064E+00         5.83602E-01         1.42074E+00         3.25657E+01         1.00000E+00         7.15036E-11         3.25657E+01         1.77406E+00         3.07916E+01
+          2.26106E-02         5.96749E-03        -1.67987E-02         1.42064E+00         5.94272E-01         1.42074E+00         3.12792E+01         1.00000E+00         7.08216E-11         3.12792E+01         1.72884E+00         2.95504E+01
+          2.26106E-02         6.13731E-03        -1.68633E-02         1.42064E+00         6.04943E-01         1.42074E+00         3.00189E+01         1.00000E+00         7.19804E-11         3.00189E+01         1.68446E+00         2.83345E+01
+          2.26106E-02         6.30714E-03        -1.69297E-02         1.42064E+00         6.15613E-01         1.42074E+00         2.87857E+01         1.00000E+00         7.51937E-11         2.87857E+01         1.64096E+00         2.71447E+01
+          2.26106E-02         6.47697E-03        -1.69979E-02         1.42063E+00         6.26284E-01         1.42074E+00         2.75805E+01         1.00000E+00         8.05024E-11         2.75805E+01         1.59839E+00         2.59821E+01
+          2.26106E-02         6.64680E-03        -1.70679E-02         1.42063E+00         6.36955E-01         1.42074E+00         2.64040E+01         1.00000E+00         8.77946E-11         2.64040E+01         1.55681E+00         2.48472E+01
+          2.26106E-02         6.81662E-03        -1.71397E-02         1.42063E+00         6.47625E-01         1.42073E+00         2.52571E+01         1.00000E+00         9.68667E-11         2.52571E+01         1.51624E+00         2.37408E+01
+          2.26106E-02         6.98645E-03        -1.72133E-02         1.42063E+00         6.58296E-01         1.42073E+00         2.41402E+01         1.00000E+00         1.07487E-10         2.41402E+01         1.47672E+00         2.26635E+01
+          2.26106E-02         7.15628E-03        -1.72888E-02         1.42063E+00         6.68966E-01         1.42073E+00         2.30541E+01         1.00000E+00         1.19434E-10         2.30541E+01         1.43831E+00         2.16158E+01
+          2.26106E-02         7.32611E-03        -1.73660E-02         1.42063E+00         6.79637E-01         1.42073E+00         2.19992E+01         1.00000E+00         1.32517E-10         2.19992E+01         1.40102E+00         2.05981E+01
+          2.26106E-02         7.49593E-03        -1.74451E-02         1.42062E+00         6.90307E-01         1.42073E+00         2.09758E+01         1.00000E+00         1.46572E-10         2.09758E+01         1.36490E+00         1.96109E+01
+          2.26106E-02         7.66576E-03        -1.75260E-02         1.42062E+00         7.00978E-01         1.42073E+00         1.99843E+01         1.00000E+00         1.61462E-10         1.99843E+01         1.32997E+00         1.86544E+01
+          2.26106E-02         7.83559E-03        -1.76086E-02         1.42062E+00         7.11649E-01         1.42073E+00         1.90250E+01         1.00000E+00         1.77072E-10         1.90250E+01         1.29625E+00         1.77288E+01
+          2.26106E-02         8.00542E-03        -1.76931E-02         1.42062E+00         7.22319E-01         1.42073E+00         1.80980E+01         1.00000E+00         1.93299E-10         1.80980E+01         1.26378E+00         1.68343E+01
+          2.26106E-02         8.17524E-03        -1.77794E-02         1.42062E+00         7.32990E-01         1.42073E+00         1.72035E+01         1.00000E+00         2.10051E-10         1.72035E+01         1.23256E+00         1.59709E+01
+          2.26106E-02         8.34507E-03        -1.78676E-02         1.42061E+00         7.43660E-01         1.42073E+00         1.63414E+01         1.00000E+00         2.27240E-10         1.63414E+01         1.20262E+00         1.51388E+01
+          2.26106E-02         8.51490E-03        -1.79575E-02         1.42061E+00         7.54331E-01         1.42073E+00         1.55118E+01         1.00000E+00         2.44786E-10         1.55118E+01         1.17397E+00         1.43379E+01
+          2.26106E-02         8.68473E-03        -1.80492E-02         1.42061E+00         7.65001E-01         1.42073E+00         1.47146E+01         1.00000E+00         2.62606E-10         1.47146E+01         1.14662E+00         1.35679E+01
+          2.26106E-02         8.85455E-03        -1.81428E-02         1.42061E+00         7.75672E-01         1.42072E+00         1.39495E+01         1.00000E+00         2.80621E-10         1.39495E+01         1.12057E+00         1.28289E+01
+          2.26106E-02         9.02438E-03        -1.82382E-02         1.42061E+00         7.86343E-01         1.42072E+00         1.32164E+01         1.00000E+00         2.98747E-10         1.32164E+01         1.09584E+00         1.21206E+01
+          2.26106E-02         9.19421E-03        -1.83353E-02         1.42060E+00         7.97013E-01         1.42072E+00         1.25150E+01         1.00000E+00         3.16902E-10         1.25150E+01         1.07242E+00         1.14426E+01
+          2.26106E-02         9.36403E-03        -1.84343E-02         1.42060E+00         8.07684E-01         1.42072E+00         1.18449E+01         1.00000E+00         3.34998E-10         1.18449E+01         1.05031E+00         1.07946E+01
+          2.26106E-02         9.53386E-03        -1.85351E-02         1.42060E+00         8.18354E-01         1.42072E+00         1.12059E+01         1.00000E+00         3.52946E-10         1.12059E+01         1.02951E+00         1.01763E+01
+          2.26106E-02         9.70369E-03        -1.86378E-02         1.42060E+00         8.29025E-01         1.42072E+00         1.05973E+01         1.00000E+00         3.70654E-10         1.05973E+01         1.01001E+00         9.58730E+00
+          2.26106E-02         9.87352E-03        -1.87422E-02         1.42059E+00         8.39695E-01         1.42072E+00         1.00188E+01         1.00000E+00         3.88025E-10         1.00188E+01         9.91793E-01         9.02701E+00
+          2.26106E-02         1.00433E-02        -1.88484E-02         1.42059E+00         8.50366E-01         1.42072E+00         9.46982E+00         1.00000E+00         4.04959E-10         9.46982E+00         9.74851E-01         8.49497E+00
+          2.26106E-02         1.02132E-02        -1.89565E-02         1.42059E+00         8.61037E-01         1.42072E+00         8.94978E+00         1.00000E+00         4.21355E-10         8.94978E+00         9.59166E-01         7.99062E+00
+          2.26106E-02         1.03830E-02        -1.90663E-02         1.42059E+00         8.71707E-01         1.42072E+00         8.45808E+00         1.00000E+00         4.37104E-10         8.45808E+00         9.44719E-01         7.51336E+00
+          2.26106E-02         1.05528E-02        -1.91780E-02         1.42059E+00         8.82378E-01         1.42071E+00         7.99406E+00         1.00000E+00         4.52098E-10         7.99406E+00         9.31486E-01         7.06258E+00
+          2.26106E-02         1.07227E-02        -1.92915E-02         1.42058E+00         8.93048E-01         1.42071E+00         7.55706E+00         1.00000E+00         4.66222E-10         7.55706E+00         9.19442E-01         6.63761E+00
+          2.26106E-02         1.08925E-02        -1.94068E-02         1.42058E+00         9.03719E-01         1.42071E+00         7.14635E+00         1.00000E+00         4.79363E-10         7.14635E+00         9.08561E-01         6.23779E+00
+          2.26106E-02         1.10623E-02        -1.95239E-02         1.42058E+00         9.14389E-01         1.42071E+00         6.76120E+00         1.00000E+00         4.91403E-10         6.76120E+00         8.98812E-01         5.86239E+00
+          2.26106E-02         1.12321E-02        -1.96428E-02         1.42057E+00         9.25060E-01         1.42071E+00         6.40085E+00         1.00000E+00         5.02224E-10         6.40085E+00         8.90163E-01         5.51069E+00
+          2.26106E-02         1.14020E-02        -1.97636E-02         1.42057E+00         9.35731E-01         1.42071E+00         6.06452E+00         1.00000E+00         5.11706E-10         6.06452E+00         8.82578E-01         5.18195E+00
+          2.26106E-02         1.15718E-02        -1.98861E-02         1.42057E+00         9.46401E-01         1.42071E+00         5.75141E+00         1.00000E+00         5.19730E-10         5.75141E+00         8.76021E-01         4.87539E+00
+          2.26106E-02         1.17416E-02        -2.00105E-02         1.42057E+00         9.57072E-01         1.42071E+00         5.46070E+00         1.00000E+00         5.26181E-10         5.46070E+00         8.70454E-01         4.59024E+00
+          2.26106E-02         1.19114E-02        -2.01367E-02         1.42056E+00         9.67742E-01         1.42071E+00         5.19155E+00         1.00000E+00         5.30944E-10         5.19155E+00         8.65834E-01         4.32572E+00
+          2.26106E-02         1.20813E-02        -2.02647E-02         1.42056E+00         9.78413E-01         1.42071E+00         4.94313E+00         1.00000E+00         5.33911E-10         4.94313E+00         8.62120E-01         4.08101E+00
+          2.26106E-02         1.22511E-02        -2.03944E-02         1.42056E+00         9.89083E-01         1.42070E+00         4.71459E+00         1.00000E+00         5.34981E-10         4.71459E+00         8.59267E-01         3.85532E+00
+          2.26106E-02         1.24209E-02        -2.05261E-02         1.42055E+00         9.99754E-01         1.42070E+00         4.50508E+00         1.00000E+00         5.34063E-10         4.50508E+00         8.57230E-01         3.64785E+00
+          2.26106E-02         1.25908E-02        -2.06595E-02         1.42055E+00         1.01042E+00         1.42070E+00         4.31373E+00         1.00000E+00         5.31082E-10         4.31373E+00         8.55962E-01         3.45777E+00
+          2.26106E-02         1.27606E-02        -2.07947E-02         1.42055E+00         1.02110E+00         1.42070E+00         4.13969E+00         1.00000E+00         5.25980E-10         4.13969E+00         8.55414E-01         3.28428E+00
+          2.26106E-02         1.29304E-02        -2.09318E-02         1.42055E+00         1.03177E+00         1.42070E+00         3.98211E+00         1.00000E+00         5.18726E-10         3.98211E+00         8.55536E-01         3.12658E+00
+          2.26106E-02         1.31002E-02        -2.10706E-02         1.42054E+00         1.04244E+00         1.42070E+00         3.84013E+00         1.00000E+00         5.09320E-10         3.84013E+00         8.56280E-01         2.98385E+00
+          2.26106E-02         1.32701E-02        -2.12113E-02         1.42054E+00         1.05311E+00         1.42070E+00         3.71291E+00         1.00000E+00         4.97810E-10         3.71291E+00         8.57594E-01         2.85532E+00
+          2.26106E-02         1.34399E-02        -2.13538E-02         1.42054E+00         1.06378E+00         1.42070E+00         3.59960E+00         1.00000E+00         4.84304E-10         3.59960E+00         8.59426E-01         2.74018E+00
+          2.26106E-02         1.36097E-02        -2.14981E-02         1.42053E+00         1.07445E+00         1.42070E+00         3.49939E+00         1.00000E+00         4.68991E-10         3.49939E+00         8.61724E-01         2.63766E+00
+          2.26106E-02         1.37795E-02        -2.16442E-02         1.42053E+00         1.08512E+00         1.42069E+00         3.41145E+00         1.00000E+00         4.52169E-10         3.41145E+00         8.64438E-01         2.54701E+00
+          2.26106E-02         1.39494E-02        -2.17921E-02         1.42053E+00         1.09579E+00         1.42069E+00         3.33497E+00         1.00000E+00         4.34285E-10         3.33497E+00         8.67513E-01         2.46746E+00
+          2.26106E-02         1.41192E-02        -2.19418E-02         1.42052E+00         1.10646E+00         1.42069E+00         3.26918E+00         1.00000E+00         4.15987E-10         3.26918E+00         8.70899E-01         2.39828E+00
+          2.26106E-02         1.42890E-02        -2.20934E-02         1.42052E+00         1.11713E+00         1.42069E+00         3.21330E+00         1.00000E+00         3.98182E-10         3.21330E+00         8.74543E-01         2.33875E+00
+          2.26106E-02         1.44589E-02        -2.22467E-02         1.42052E+00         1.12780E+00         1.42069E+00         3.16656E+00         1.00000E+00         3.82101E-10         3.16656E+00         8.78394E-01         2.28817E+00
+          2.26106E-02         1.46287E-02        -2.24019E-02         1.42051E+00         1.13847E+00         1.42069E+00         3.12825E+00         1.00000E+00         3.69336E-10         3.12825E+00         8.82401E-01         2.24584E+00
+          2.26106E-02         1.47985E-02        -2.25589E-02         1.42051E+00         1.14914E+00         1.42069E+00         3.09763E+00         1.00000E+00         3.61802E-10         3.09763E+00         8.86514E-01         2.21112E+00
+          2.26106E-02         1.49683E-02        -2.27176E-02         1.42051E+00         1.15981E+00         1.42069E+00         3.07402E+00         1.00000E+00         3.61553E-10         3.07402E+00         8.90682E-01         2.18334E+00
+          2.26106E-02         1.51382E-02        -2.28782E-02         1.42050E+00         1.17048E+00         1.42069E+00         3.05674E+00         1.00000E+00         3.70440E-10         3.05674E+00         8.94858E-01         2.16188E+00
+          2.26106E-02         1.53080E-02        -2.30407E-02         1.42050E+00         1.18115E+00         1.42068E+00         3.04514E+00         1.00000E+00         3.89712E-10         3.04514E+00         8.98993E-01         2.14614E+00
+          2.26106E-02         1.54778E-02        -2.32049E-02         1.42049E+00         1.19182E+00         1.42068E+00         3.03859E+00         1.00000E+00         4.19788E-10         3.03859E+00         9.03043E-01         2.13554E+00
+          2.26106E-02         1.56476E-02        -2.33709E-02         1.42049E+00         1.20249E+00         1.42068E+00         3.03649E+00         1.00000E+00         4.60315E-10         3.03649E+00         9.06961E-01         2.12953E+00
+          2.26106E-02         1.58175E-02        -2.35388E-02         1.42049E+00         1.21317E+00         1.42068E+00         3.03826E+00         1.00000E+00         5.10455E-10         3.03826E+00         9.10705E-01         2.12756E+00
+          2.26106E-02         1.59873E-02        -2.37085E-02         1.42048E+00         1.22384E+00         1.42068E+00         3.04335E+00         1.00000E+00         5.69177E-10         3.04335E+00         9.14233E-01         2.12912E+00
+          2.26106E-02         1.61571E-02        -2.38799E-02         1.42048E+00         1.23451E+00         1.42068E+00         3.05123E+00         1.00000E+00         6.35460E-10         3.05123E+00         9.17505E-01         2.13372E+00
+          2.26106E-02         1.63270E-02        -2.40532E-02         1.42047E+00         1.24518E+00         1.42068E+00         3.06139E+00         1.00000E+00         7.08383E-10         3.06139E+00         9.20482E-01         2.14091E+00
+          2.26106E-02         1.64968E-02        -2.42283E-02         1.42047E+00         1.25585E+00         1.42068E+00         3.07336E+00         1.00000E+00         7.87147E-10         3.07336E+00         9.23128E-01         2.15023E+00
+          2.26106E-02         1.66666E-02        -2.44052E-02         1.42047E+00         1.26652E+00         1.42068E+00         3.08669E+00         1.00000E+00         8.71057E-10         3.08669E+00         9.25408E-01         2.16128E+00
+          2.26106E-02         1.68364E-02        -2.45840E-02         1.42046E+00         1.27719E+00         1.42068E+00         3.10095E+00         1.00000E+00         9.59501E-10         3.10095E+00         9.27291E-01         2.17366E+00
+          2.26106E-02         1.70063E-02        -2.47645E-02         1.42046E+00         1.28786E+00         1.42067E+00         3.11574E+00         1.00000E+00         1.05192E-09         3.11574E+00         9.28745E-01         2.18700E+00
+          2.26106E-02         1.71761E-02        -2.49469E-02         1.42045E+00         1.29853E+00         1.42067E+00         3.13070E+00         1.00000E+00         1.14781E-09         3.13070E+00         9.29744E-01         2.20095E+00
+          2.26106E-02         1.73459E-02        -2.51310E-02         1.42045E+00         1.30920E+00         1.42067E+00         3.14546E+00         1.00000E+00         1.24665E-09         3.14546E+00         9.30260E-01         2.21520E+00
+          2.26106E-02         1.75158E-02        -2.53170E-02         1.42045E+00         1.31987E+00         1.42067E+00         3.15970E+00         1.00000E+00         1.34795E-09         3.15970E+00         9.30271E-01         2.22943E+00
+          2.26106E-02         1.76856E-02        -2.55048E-02         1.42044E+00         1.33054E+00         1.42067E+00         3.17314E+00         1.00000E+00         1.45123E-09         3.17314E+00         9.29755E-01         2.24338E+00
+          2.26106E-02         1.78554E-02        -2.56944E-02         1.42044E+00         1.34121E+00         1.42067E+00         3.18549E+00         1.00000E+00         1.55597E-09         3.18549E+00         9.28693E-01         2.25680E+00
+          2.26106E-02         1.80252E-02        -2.58858E-02         1.42043E+00         1.35188E+00         1.42067E+00         3.19650E+00         1.00000E+00         1.66165E-09         3.19650E+00         9.27069E-01         2.26943E+00
+          2.26106E-02         1.81951E-02        -2.60790E-02         1.42043E+00         1.36255E+00         1.42067E+00         3.20595E+00         1.00000E+00         1.76773E-09         3.20595E+00         9.24868E-01         2.28109E+00
+          2.26106E-02         1.83649E-02        -2.62741E-02         1.42042E+00         1.37322E+00         1.42067E+00         3.21364E+00         1.00000E+00         1.87366E-09         3.21364E+00         9.22079E-01         2.29156E+00
+          2.26106E-02         1.85347E-02        -2.64709E-02         1.42042E+00         1.38389E+00         1.42067E+00         3.21938E+00         1.00000E+00         1.97885E-09         3.21938E+00         9.18692E-01         2.30069E+00
+          2.26106E-02         1.87045E-02        -2.66696E-02         1.42042E+00         1.39457E+00         1.42067E+00         3.22301E+00         1.00000E+00         2.08271E-09         3.22301E+00         9.14700E-01         2.30831E+00
+          2.26106E-02         1.88744E-02        -2.68701E-02         1.42041E+00         1.40524E+00         1.42067E+00         3.22441E+00         1.00000E+00         2.18461E-09         3.22441E+00         9.10099E-01         2.31431E+00
+          2.26106E-02         1.90442E-02        -2.70724E-02         1.42041E+00         1.41591E+00         1.42066E+00         3.22344E+00         1.00000E+00         2.28390E-09         3.22344E+00         9.04885E-01         2.31855E+00
+          2.26106E-02         1.92140E-02        -2.72765E-02         1.42040E+00         1.42658E+00         1.42066E+00         3.22001E+00         1.00000E+00         2.37993E-09         3.22001E+00         8.99060E-01         2.32095E+00
+          2.26106E-02         1.93839E-02        -2.74824E-02         1.42040E+00         1.43725E+00         1.42066E+00         3.21405E+00         1.00000E+00         2.47201E-09         3.21405E+00         8.92624E-01         2.32143E+00
+          2.26106E-02         1.95537E-02        -2.76901E-02         1.42039E+00         1.44792E+00         1.42066E+00         3.20550E+00         1.00000E+00         2.55944E-09         3.20550E+00         8.85582E-01         2.31991E+00
+          2.26106E-02         1.97235E-02        -2.78997E-02         1.42039E+00         1.45859E+00         1.42066E+00         3.19431E+00         1.00000E+00         2.64152E-09         3.19431E+00         8.77940E-01         2.31637E+00
+          2.26106E-02         1.98933E-02        -2.81110E-02         1.42038E+00         1.46926E+00         1.42066E+00         3.18045E+00         1.00000E+00         2.71754E-09         3.18045E+00         8.69707E-01         2.31075E+00
+          2.26106E-02         2.00632E-02        -2.83242E-02         1.42038E+00         1.47993E+00         1.42066E+00         3.16393E+00         1.00000E+00         2.78678E-09         3.16393E+00         8.60893E-01         2.30304E+00
+          2.26106E-02         2.02330E-02        -2.85392E-02         1.42037E+00         1.49060E+00         1.42066E+00         3.14475E+00         1.00000E+00         2.84851E-09         3.14475E+00         8.51511E-01         2.29324E+00
+          2.26106E-02         2.04028E-02        -2.87560E-02         1.42037E+00         1.50127E+00         1.42066E+00         3.12293E+00         1.00000E+00         2.90204E-09         3.12293E+00         8.41573E-01         2.28135E+00
+          2.26106E-02         2.05726E-02        -2.89746E-02         1.42036E+00         1.51194E+00         1.42066E+00         3.09849E+00         1.00000E+00         2.94668E-09         3.09849E+00         8.31097E-01         2.26740E+00
+          2.26106E-02         2.07425E-02        -2.91950E-02         1.42036E+00         1.52261E+00         1.42066E+00         3.07151E+00         1.00000E+00         2.98176E-09         3.07151E+00         8.20099E-01         2.25141E+00
+          2.26106E-02         2.09123E-02        -2.94172E-02         1.42035E+00         1.53328E+00         1.42066E+00         3.04202E+00         1.00000E+00         3.00664E-09         3.04202E+00         8.08599E-01         2.23342E+00
+          2.26106E-02         2.10821E-02        -2.96413E-02         1.42035E+00         1.54395E+00         1.42066E+00         3.01011E+00         1.00000E+00         3.02074E-09         3.01011E+00         7.96616E-01         2.21349E+00
+          2.26106E-02         2.12520E-02        -2.98671E-02         1.42034E+00         1.55462E+00         1.42066E+00         2.97585E+00         1.00000E+00         3.02355E-09         2.97585E+00         7.84173E-01         2.19168E+00
+          2.26106E-02         2.14218E-02        -3.00948E-02         1.42034E+00         1.56529E+00         1.42066E+00         2.93935E+00         1.00000E+00         3.01462E-09         2.93935E+00         7.71293E-01         2.16806E+00
+          2.26106E-02         2.15916E-02        -3.03243E-02         1.42033E+00         1.57596E+00         1.42066E+00         2.90069E+00         1.00000E+00         2.99361E-09         2.90069E+00         7.57999E-01         2.14269E+00
+          2.26106E-02         2.17614E-02        -3.05556E-02         1.42033E+00         1.58664E+00         1.42066E+00         2.86000E+00         1.00000E+00         2.96032E-09         2.86000E+00         7.44317E-01         2.11568E+00
+          2.26106E-02         2.19313E-02        -3.07887E-02         1.42032E+00         1.59731E+00         1.42066E+00         2.81738E+00         1.00000E+00         2.91473E-09         2.81738E+00         7.30273E-01         2.08710E+00
+          2.26106E-02         2.21011E-02        -3.10236E-02         1.42032E+00         1.60798E+00         1.42066E+00         2.77296E+00         1.00000E+00         2.85702E-09         2.77296E+00         7.15894E-01         2.05706E+00
+          2.26106E-02         2.22709E-02        -3.12603E-02         1.42031E+00         1.61865E+00         1.42066E+00         2.72687E+00         1.00000E+00         2.78767E-09         2.72687E+00         7.01207E-01         2.02566E+00
+          2.26106E-02         2.24407E-02        -3.14989E-02         1.42031E+00         1.62932E+00         1.42066E+00         2.67924E+00         1.00000E+00         2.70753E-09         2.67924E+00         6.86240E-01         1.99300E+00
+          2.26106E-02         2.26106E-02        -3.17392E-02         1.42030E+00         1.63999E+00         1.42066E+00         2.63022E+00         1.00000E+00         2.61797E-09         2.63022E+00         6.71021E-01         1.95920E+00
+          2.26106E-02         2.27804E-02        -3.19814E-02         1.42030E+00         1.65066E+00         1.42066E+00         2.57995E+00         1.00000E+00         2.52097E-09         2.57995E+00         6.55581E-01         1.92437E+00
+          2.26106E-02         2.29502E-02        -3.22254E-02         1.42029E+00         1.66133E+00         1.42066E+00         2.52857E+00         1.00000E+00         2.41944E-09         2.52857E+00         6.39947E-01         1.88862E+00
+          2.26106E-02         2.31201E-02        -3.24712E-02         1.42028E+00         1.67200E+00         1.42066E+00         2.47623E+00         1.00000E+00         2.31735E-09         2.47623E+00         6.24149E-01         1.85208E+00
+          2.26106E-02         2.32899E-02        -3.27188E-02         1.42028E+00         1.68267E+00         1.42066E+00         2.42308E+00         1.00000E+00         2.22015E-09         2.42308E+00         6.08217E-01         1.81487E+00
+          2.26106E-02         2.34597E-02        -3.29682E-02         1.42027E+00         1.69334E+00         1.42066E+00         2.36928E+00         1.00000E+00         2.13495E-09         2.36928E+00         5.92179E-01         1.77710E+00
+          2.26106E-02         2.36295E-02        -3.32195E-02         1.42027E+00         1.70401E+00         1.42066E+00         2.31498E+00         1.00000E+00         2.07055E-09         2.31498E+00         5.76064E-01         1.73891E+00
+          2.26106E-02         2.37994E-02        -3.34725E-02         1.42026E+00         1.71468E+00         1.42066E+00         2.26032E+00         1.00000E+00         2.03708E-09         2.26032E+00         5.59902E-01         1.70042E+00
+          2.26106E-02         2.39692E-02        -3.37274E-02         1.42026E+00         1.72535E+00         1.42066E+00         2.20546E+00         1.00000E+00         2.04475E-09         2.20546E+00         5.43720E-01         1.66174E+00
+          2.26106E-02         2.41390E-02        -3.39841E-02         1.42025E+00         1.73602E+00         1.42066E+00         2.15056E+00         1.00000E+00         2.10205E-09         2.15056E+00         5.27547E-01         1.62301E+00
+          2.26106E-02         2.43088E-02        -3.42426E-02         1.42024E+00         1.74669E+00         1.42066E+00         2.09575E+00         1.00000E+00         2.21398E-09         2.09575E+00         5.11410E-01         1.58434E+00
+          2.26106E-02         2.44787E-02        -3.45029E-02         1.42024E+00         1.75736E+00         1.42066E+00         2.04119E+00         1.00000E+00         2.38126E-09         2.04119E+00         4.95335E-01         1.54585E+00
+          2.26106E-02         2.46485E-02        -3.47650E-02         1.42023E+00         1.76804E+00         1.42066E+00         1.98701E+00         1.00000E+00         2.60105E-09         1.98701E+00         4.79349E-01         1.50767E+00
+          2.26106E-02         2.48183E-02        -3.50289E-02         1.42023E+00         1.77871E+00         1.42066E+00         1.93337E+00         1.00000E+00         2.86833E-09         1.93337E+00         4.63477E-01         1.46989E+00
+          2.26106E-02         2.49882E-02        -3.52947E-02         1.42022E+00         1.78938E+00         1.42066E+00         1.88039E+00         1.00000E+00         3.17732E-09         1.88039E+00         4.47743E-01         1.43265E+00
+          2.26106E-02         2.51580E-02        -3.55622E-02         1.42021E+00         1.80005E+00         1.42066E+00         1.82821E+00         1.00000E+00         3.52240E-09         1.82821E+00         4.32171E-01         1.39604E+00
+          2.26106E-02         2.53278E-02        -3.58316E-02         1.42021E+00         1.81072E+00         1.42066E+00         1.77695E+00         1.00000E+00         3.89844E-09         1.77695E+00         4.16783E-01         1.36017E+00
+          2.26106E-02         2.54976E-02        -3.61028E-02         1.42020E+00         1.82139E+00         1.42066E+00         1.72675E+00         1.00000E+00         4.30096E-09         1.72675E+00         4.01600E-01         1.32515E+00
+          2.26106E-02         2.56675E-02        -3.63758E-02         1.42020E+00         1.83206E+00         1.42066E+00         1.67771E+00         1.00000E+00         4.72598E-09         1.67771E+00         3.86643E-01         1.29106E+00
+          2.26106E-02         2.58373E-02        -3.66506E-02         1.42019E+00         1.84273E+00         1.42066E+00         1.62994E+00         1.00000E+00         5.16996E-09         1.62994E+00         3.71932E-01         1.25801E+00
+          2.26106E-02         2.60071E-02        -3.69272E-02         1.42018E+00         1.85340E+00         1.42066E+00         1.58356E+00         1.00000E+00         5.62965E-09         1.58356E+00         3.57484E-01         1.22608E+00
+          2.26106E-02         2.61769E-02        -3.72057E-02         1.42018E+00         1.86407E+00         1.42066E+00         1.53867E+00         1.00000E+00         6.10203E-09         1.53867E+00         3.43317E-01         1.19535E+00
+          2.27804E-02         8.72665E-04        -1.59464E-02         1.43133E+00         2.74155E-01         1.43142E+00         7.27600E+01         1.00000E+00         8.21013E-11         7.27600E+01         3.36993E+00         6.93901E+01
+          2.27804E-02         1.04249E-03        -1.59566E-02         1.43133E+00         2.84826E-01         1.43142E+00         7.14633E+01         1.00000E+00         8.26075E-11         7.14633E+01         3.32371E+00         6.81396E+01
+          2.27804E-02         1.21232E-03        -1.59687E-02         1.43133E+00         2.95496E-01         1.43142E+00         7.01396E+01         1.00000E+00         8.31041E-11         7.01396E+01         3.27634E+00         6.68633E+01
+          2.27804E-02         1.38215E-03        -1.59825E-02         1.43133E+00         3.06167E-01         1.43142E+00         6.87911E+01         1.00000E+00         8.35714E-11         6.87911E+01         3.22788E+00         6.55632E+01
+          2.27804E-02         1.55197E-03        -1.59982E-02         1.43133E+00         3.16838E-01         1.43142E+00         6.74198E+01         1.00000E+00         8.39893E-11         6.74198E+01         3.17840E+00         6.42414E+01
+          2.27804E-02         1.72180E-03        -1.60156E-02         1.43133E+00         3.27508E-01         1.43142E+00         6.60280E+01         1.00000E+00         8.43370E-11         6.60280E+01         3.12797E+00         6.29000E+01
+          2.27804E-02         1.89163E-03        -1.60349E-02         1.43133E+00         3.38179E-01         1.43142E+00         6.46178E+01         1.00000E+00         8.45941E-11         6.46178E+01         3.07665E+00         6.15411E+01
+          2.27804E-02         2.06146E-03        -1.60560E-02         1.43133E+00         3.48849E-01         1.43142E+00         6.31915E+01         1.00000E+00         8.47404E-11         6.31915E+01         3.02453E+00         6.01670E+01
+          2.27804E-02         2.23128E-03        -1.60789E-02         1.43133E+00         3.59520E-01         1.43142E+00         6.17513E+01         1.00000E+00         8.47562E-11         6.17513E+01         2.97166E+00         5.87796E+01
+          2.27804E-02         2.40111E-03        -1.61036E-02         1.43133E+00         3.70190E-01         1.43142E+00         6.02992E+01         1.00000E+00         8.46228E-11         6.02992E+01         2.91812E+00         5.73811E+01
+          2.27804E-02         2.57094E-03        -1.61301E-02         1.43133E+00         3.80861E-01         1.43142E+00         5.88376E+01         1.00000E+00         8.43227E-11         5.88376E+01         2.86398E+00         5.59736E+01
+          2.27804E-02         2.74077E-03        -1.61584E-02         1.43133E+00         3.91532E-01         1.43142E+00         5.73685E+01         1.00000E+00         8.38398E-11         5.73685E+01         2.80932E+00         5.45592E+01
+          2.27804E-02         2.91059E-03        -1.61886E-02         1.43133E+00         4.02202E-01         1.43142E+00         5.58941E+01         1.00000E+00         8.31598E-11         5.58941E+01         2.75422E+00         5.31399E+01
+          2.27804E-02         3.08042E-03        -1.62205E-02         1.43133E+00         4.12873E-01         1.43142E+00         5.44164E+01         1.00000E+00         8.22705E-11         5.44164E+01         2.69873E+00         5.17177E+01
+          2.27804E-02         3.25025E-03        -1.62543E-02         1.43133E+00         4.23543E-01         1.43142E+00         5.29376E+01         1.00000E+00         8.11622E-11         5.29376E+01         2.64295E+00         5.02947E+01
+          2.27804E-02         3.42008E-03        -1.62899E-02         1.43133E+00         4.34214E-01         1.43142E+00         5.14596E+01         1.00000E+00         7.98284E-11         5.14596E+01         2.58694E+00         4.88727E+01
+          2.27804E-02         3.58990E-03        -1.63273E-02         1.43133E+00         4.44884E-01         1.43142E+00         4.99845E+01         1.00000E+00         7.82661E-11         4.99845E+01         2.53079E+00         4.74537E+01
+          2.27804E-02         3.75973E-03        -1.63665E-02         1.43132E+00         4.55555E-01         1.43142E+00         4.85141E+01         1.00000E+00         7.64770E-11         4.85141E+01         2.47456E+00         4.60396E+01
+          2.27804E-02         3.92956E-03        -1.64075E-02         1.43132E+00         4.66225E-01         1.43142E+00         4.70505E+01         1.00000E+00         7.44683E-11         4.70505E+01         2.41833E+00         4.46321E+01
+          2.27804E-02         4.09939E-03        -1.64503E-02         1.43132E+00         4.76896E-01         1.43142E+00         4.55953E+01         1.00000E+00         7.22542E-11         4.55953E+01         2.36217E+00         4.32331E+01
+          2.27804E-02         4.26921E-03        -1.64950E-02         1.43132E+00         4.87567E-01         1.43142E+00         4.41504E+01         1.00000E+00         6.98581E-11         4.41504E+01         2.30617E+00         4.18442E+01
+          2.27804E-02         4.43904E-03        -1.65414E-02         1.43132E+00         4.98237E-01         1.43142E+00         4.27175E+01         1.00000E+00         6.73147E-11         4.27175E+01         2.25039E+00         4.04672E+01
+          2.27804E-02         4.60887E-03        -1.65897E-02         1.43132E+00         5.08908E-01         1.43142E+00         4.12984E+01         1.00000E+00         6.46738E-11         4.12984E+01         2.19490E+00         3.91035E+01
+          2.27804E-02         4.77869E-03        -1.66397E-02         1.43132E+00         5.19578E-01         1.43142E+00         3.98945E+01         1.00000E+00         6.20040E-11         3.98945E+01         2.13978E+00         3.77547E+01
+          2.27804E-02         4.94852E-03        -1.66916E-02         1.43132E+00         5.30249E-01         1.43141E+00         3.85074E+01         1.00000E+00         5.93982E-11         3.85074E+01         2.08510E+00         3.64223E+01
+          2.27804E-02         5.11835E-03        -1.67453E-02         1.43132E+00         5.40919E-01         1.43141E+00         3.71386E+01         1.00000E+00         5.69784E-11         3.71386E+01         2.03092E+00         3.51077E+01
+          2.27804E-02         5.28818E-03        -1.68008E-02         1.43131E+00         5.51590E-01         1.43141E+00         3.57894E+01         1.00000E+00         5.48994E-11         3.57894E+01         1.97732E+00         3.38121E+01
+          2.27804E-02         5.45800E-03        -1.68582E-02         1.43131E+00         5.62261E-01         1.43141E+00         3.44613E+01         1.00000E+00         5.33477E-11         3.44613E+01         1.92436E+00         3.25369E+01
+          2.27804E-02         5.62783E-03        -1.69173E-02         1.43131E+00         5.72931E-01         1.43141E+00         3.31553E+01         1.00000E+00         5.25313E-11         3.31553E+01         1.87211E+00         3.12832E+01
+          2.27804E-02         5.79766E-03        -1.69782E-02         1.43131E+00         5.83602E-01         1.43141E+00         3.18728E+01         1.00000E+00         5.26562E-11         3.18728E+01         1.82062E+00         3.00522E+01
+          2.27804E-02         5.96749E-03        -1.70410E-02         1.43131E+00         5.94272E-01         1.43141E+00         3.06147E+01         1.00000E+00         5.38937E-11         3.06147E+01         1.76997E+00         2.88448E+01
+          2.27804E-02         6.13731E-03        -1.71055E-02         1.43131E+00         6.04943E-01         1.43141E+00         2.93822E+01         1.00000E+00         5.63484E-11         2.93822E+01         1.72020E+00         2.76620E+01
+          2.27804E-02         6.30714E-03        -1.71719E-02         1.43131E+00         6.15613E-01         1.43141E+00         2.81761E+01         1.00000E+00         6.00440E-11         2.81761E+01         1.67138E+00         2.65047E+01
+          2.27804E-02         6.47697E-03        -1.72401E-02         1.43130E+00         6.26284E-01         1.43141E+00         2.69972E+01         1.00000E+00         6.49327E-11         2.69972E+01         1.62356E+00         2.53737E+01
+          2.27804E-02         6.64680E-03        -1.73101E-02         1.43130E+00         6.36955E-01         1.43141E+00         2.58465E+01         1.00000E+00         7.09200E-11         2.58465E+01         1.57679E+00         2.42697E+01
+          2.27804E-02         6.81662E-03        -1.73819E-02         1.43130E+00         6.47625E-01         1.43141E+00         2.47245E+01         1.00000E+00         7.78911E-11         2.47245E+01         1.53112E+00         2.31934E+01
+          2.27804E-02         6.98645E-03        -1.74556E-02         1.43130E+00         6.58296E-01         1.43141E+00         2.36319E+01         1.00000E+00         8.57302E-11         2.36319E+01         1.48660E+00         2.21453E+01
+          2.27804E-02         7.15628E-03        -1.75310E-02         1.43130E+00         6.68966E-01         1.43141E+00         2.25693E+01         1.00000E+00         9.43302E-11         2.25693E+01         1.44327E+00         2.11260E+01
+          2.27804E-02         7.32611E-03        -1.76082E-02         1.43130E+00         6.79637E-01         1.43140E+00         2.15371E+01         1.00000E+00         1.03596E-10         2.15371E+01         1.40117E+00         2.01359E+01
+          2.27804E-02         7.49593E-03        -1.76873E-02         1.43129E+00         6.90307E-01         1.43140E+00         2.05356E+01         1.00000E+00         1.13445E-10         2.05356E+01         1.36034E+00         1.91753E+01
+          2.27804E-02         7.66576E-03        -1.77682E-02         1.43129E+00         7.00978E-01         1.43140E+00         1.95653E+01         1.00000E+00         1.23803E-10         1.95653E+01         1.32082E+00         1.82445E+01
+          2.27804E-02         7.83559E-03        -1.78509E-02         1.43129E+00         7.11649E-01         1.43140E+00         1.86264E+01         1.00000E+00         1.34604E-10         1.86264E+01         1.28264E+00         1.73438E+01
+          2.27804E-02         8.00542E-03        -1.79354E-02         1.43129E+00         7.22319E-01         1.43140E+00         1.77190E+01         1.00000E+00         1.45787E-10         1.77190E+01         1.24582E+00         1.64732E+01
+          2.27804E-02         8.17524E-03        -1.80217E-02         1.43129E+00         7.32990E-01         1.43140E+00         1.68433E+01         1.00000E+00         1.57296E-10         1.68433E+01         1.21039E+00         1.56329E+01
+          2.27804E-02         8.34507E-03        -1.81098E-02         1.43128E+00         7.43660E-01         1.43140E+00         1.59993E+01         1.00000E+00         1.69074E-10         1.59993E+01         1.17638E+00         1.48229E+01
+          2.27804E-02         8.51490E-03        -1.81997E-02         1.43128E+00         7.54331E-01         1.43140E+00         1.51869E+01         1.00000E+00         1.81068E-10         1.51869E+01         1.14380E+00         1.40431E+01
+          2.27804E-02         8.68473E-03        -1.82915E-02         1.43128E+00         7.65001E-01         1.43140E+00         1.44061E+01         1.00000E+00         1.93223E-10         1.44061E+01         1.11266E+00         1.32935E+01
+          2.27804E-02         8.85455E-03        -1.83850E-02         1.43128E+00         7.75672E-01         1.43140E+00         1.36567E+01         1.00000E+00         2.05483E-10         1.36567E+01         1.08299E+00         1.25737E+01
+          2.27804E-02         9.02438E-03        -1.84804E-02         1.43128E+00         7.86343E-01         1.43140E+00         1.29386E+01         1.00000E+00         2.17791E-10         1.29386E+01         1.05478E+00         1.18838E+01
+          2.27804E-02         9.19421E-03        -1.85776E-02         1.43127E+00         7.97013E-01         1.43139E+00         1.22513E+01         1.00000E+00         2.30090E-10         1.22513E+01         1.02805E+00         1.12233E+01
+          2.27804E-02         9.36403E-03        -1.86766E-02         1.43127E+00         8.07684E-01         1.43139E+00         1.15947E+01         1.00000E+00         2.42318E-10         1.15947E+01         1.00280E+00         1.05919E+01
+          2.27804E-02         9.53386E-03        -1.87774E-02         1.43127E+00         8.18354E-01         1.43139E+00         1.09683E+01         1.00000E+00         2.54413E-10         1.09683E+01         9.79012E-01         9.98926E+00
+          2.27804E-02         9.70369E-03        -1.88800E-02         1.43127E+00         8.29025E-01         1.43139E+00         1.03717E+01         1.00000E+00         2.66310E-10         1.03717E+01         9.56698E-01         9.41498E+00
+          2.27804E-02         9.87352E-03        -1.89844E-02         1.43126E+00         8.39695E-01         1.43139E+00         9.80442E+00         1.00000E+00         2.77941E-10         9.80442E+00         9.35843E-01         8.86858E+00
+          2.27804E-02         1.00433E-02        -1.90907E-02         1.43126E+00         8.50366E-01         1.43139E+00         9.26599E+00         1.00000E+00         2.89238E-10         9.26599E+00         9.16437E-01         8.34956E+00
+          2.27804E-02         1.02132E-02        -1.91987E-02         1.43126E+00         8.61037E-01         1.43139E+00         8.75584E+00         1.00000E+00         3.00127E-10         8.75584E+00         8.98463E-01         7.85737E+00
+          2.27804E-02         1.03830E-02        -1.93086E-02         1.43126E+00         8.71707E-01         1.43139E+00         8.27335E+00         1.00000E+00         3.10536E-10         8.27335E+00         8.81905E-01         7.39145E+00
+          2.27804E-02         1.05528E-02        -1.94202E-02         1.43126E+00         8.82378E-01         1.43139E+00         7.81792E+00         1.00000E+00         3.20388E-10         7.81792E+00         8.66741E-01         6.95118E+00
+          2.27804E-02         1.07227E-02        -1.95337E-02         1.43125E+00         8.93048E-01         1.43139E+00         7.38888E+00         1.00000E+00         3.29607E-10         7.38888E+00         8.52945E-01         6.53593E+00
+          2.27804E-02         1.08925E-02        -1.96490E-02         1.43125E+00         9.03719E-01         1.43138E+00         6.98553E+00         1.00000E+00         3.38114E-10         6.98553E+00         8.40492E-01         6.14504E+00
+          2.27804E-02         1.10623E-02        -1.97661E-02         1.43125E+00         9.14389E-01         1.43138E+00         6.60718E+00         1.00000E+00         3.45830E-10         6.60718E+00         8.29350E-01         5.77783E+00
+          2.27804E-02         1.12321E-02        -1.98851E-02         1.43124E+00         9.25060E-01         1.43138E+00         6.25306E+00         1.00000E+00         3.52677E-10         6.25306E+00         8.19486E-01         5.43358E+00
+          2.27804E-02         1.14020E-02        -2.00058E-02         1.43124E+00         9.35731E-01         1.43138E+00         5.92244E+00         1.00000E+00         3.58578E-10         5.92244E+00         8.10865E-01         5.11157E+00
+          2.27804E-02         1.15718E-02        -2.01284E-02         1.43124E+00         9.46401E-01         1.43138E+00         5.61452E+00         1.00000E+00         3.63457E-10         5.61452E+00         8.03448E-01         4.81107E+00
+          2.27804E-02         1.17416E-02        -2.02527E-02         1.43124E+00         9.57072E-01         1.43138E+00         5.32851E+00         1.00000E+00         3.67242E-10         5.32851E+00         7.97195E-01         4.53132E+00
+          2.27804E-02         1.19114E-02        -2.03789E-02         1.43123E+00         9.67742E-01         1.43138E+00         5.06361E+00         1.00000E+00         3.69865E-10         5.06361E+00         7.92063E-01         4.27155E+00
+          2.27804E-02         1.20813E-02        -2.05069E-02         1.43123E+00         9.78413E-01         1.43138E+00         4.81901E+00         1.00000E+00         3.71267E-10         4.81901E+00         7.88007E-01         4.03100E+00
+          2.27804E-02         1.22511E-02        -2.06367E-02         1.43123E+00         9.89083E-01         1.43138E+00         4.59387E+00         1.00000E+00         3.71396E-10         4.59387E+00         7.84979E-01         3.80889E+00
+          2.27804E-02         1.24209E-02        -2.07683E-02         1.43122E+00         9.99754E-01         1.43138E+00         4.38737E+00         1.00000E+00         3.70212E-10         4.38737E+00         7.82931E-01         3.60444E+00
+          2.27804E-02         1.25908E-02        -2.09017E-02         1.43122E+00         1.01042E+00         1.43137E+00         4.19868E+00         1.00000E+00         3.67693E-10         4.19868E+00         7.81812E-01         3.41687E+00
+          2.27804E-02         1.27606E-02        -2.10369E-02         1.43122E+00         1.02110E+00         1.43137E+00         4.02696E+00         1.00000E+00         3.63838E-10         4.02696E+00         7.81569E-01         3.24539E+00
+          2.27804E-02         1.29304E-02        -2.11740E-02         1.43122E+00         1.03177E+00         1.43137E+00         3.87139E+00         1.00000E+00         3.58672E-10         3.87139E+00         7.82150E-01         3.08924E+00
+          2.27804E-02         1.31002E-02        -2.13128E-02         1.43121E+00         1.04244E+00         1.43137E+00         3.73113E+00         1.00000E+00         3.52259E-10         3.73113E+00         7.83500E-01         2.94763E+00
+          2.27804E-02         1.32701E-02        -2.14535E-02         1.43121E+00         1.05311E+00         1.43137E+00         3.60536E+00         1.00000E+00         3.44709E-10         3.60536E+00         7.85563E-01         2.81980E+00
+          2.27804E-02         1.34399E-02        -2.15960E-02         1.43121E+00         1.06378E+00         1.43137E+00         3.49328E+00         1.00000E+00         3.36194E-10         3.49328E+00         7.88282E-01         2.70500E+00
+          2.27804E-02         1.36097E-02        -2.17403E-02         1.43120E+00         1.07445E+00         1.43137E+00         3.39407E+00         1.00000E+00         3.26967E-10         3.39407E+00         7.91600E-01         2.60247E+00
+          2.27804E-02         1.37795E-02        -2.18864E-02         1.43120E+00         1.08512E+00         1.43137E+00         3.30694E+00         1.00000E+00         3.17387E-10         3.30694E+00         7.95459E-01         2.51148E+00
+          2.27804E-02         1.39494E-02        -2.20343E-02         1.43120E+00         1.09579E+00         1.43137E+00         3.23112E+00         1.00000E+00         3.07940E-10         3.23112E+00         7.99802E-01         2.43131E+00
+          2.27804E-02         1.41192E-02        -2.21840E-02         1.43119E+00         1.10646E+00         1.43136E+00         3.16583E+00         1.00000E+00         2.99270E-10         3.16583E+00         8.04570E-01         2.36126E+00
+          2.27804E-02         1.42890E-02        -2.23356E-02         1.43119E+00         1.11713E+00         1.43136E+00         3.11032E+00         1.00000E+00         2.92191E-10         3.11032E+00         8.09705E-01         2.30061E+00
+          2.27804E-02         1.44589E-02        -2.24889E-02         1.43119E+00         1.12780E+00         1.43136E+00         3.06386E+00         1.00000E+00         2.87684E-10         3.06386E+00         8.15149E-01         2.24871E+00
+          2.27804E-02         1.46287E-02        -2.26441E-02         1.43118E+00         1.13847E+00         1.43136E+00         3.02574E+00         1.00000E+00         2.86840E-10         3.02574E+00         8.20844E-01         2.20490E+00
+          2.27804E-02         1.47985E-02        -2.28011E-02         1.43118E+00         1.14914E+00         1.43136E+00         2.99526E+00         1.00000E+00         2.90748E-10         2.99526E+00         8.26734E-01         2.16853E+00
+          2.27804E-02         1.49683E-02        -2.29599E-02         1.43117E+00         1.15981E+00         1.43136E+00         2.97174E+00         1.00000E+00         3.00336E-10         2.97174E+00         8.32762E-01         2.13898E+00
+          2.27804E-02         1.51382E-02        -2.31205E-02         1.43117E+00         1.17048E+00         1.43136E+00         2.95453E+00         1.00000E+00         3.16230E-10         2.95453E+00         8.38873E-01         2.11565E+00
+          2.27804E-02         1.53080E-02        -2.32829E-02         1.43117E+00         1.18115E+00         1.43136E+00         2.94299E+00         1.00000E+00         3.38674E-10         2.94299E+00         8.45012E-01         2.09797E+00
+          2.27804E-02         1.54778E-02        -2.34471E-02         1.43116E+00         1.19182E+00         1.43136E+00         2.93651E+00         1.00000E+00         3.67565E-10         2.93651E+00         8.51126E-01         2.08538E+00
+          2.27804E-02         1.56476E-02        -2.36131E-02         1.43116E+00         1.20249E+00         1.43135E+00         2.93450E+00         1.00000E+00         4.02554E-10         2.93450E+00         8.57162E-01         2.07734E+00
+          2.27804E-02         1.58175E-02        -2.37810E-02         1.43116E+00         1.21317E+00         1.43135E+00         2.93641E+00         1.00000E+00         4.43162E-10         2.93641E+00         8.63072E-01         2.07334E+00
+          2.27804E-02         1.59873E-02        -2.39507E-02         1.43115E+00         1.22384E+00         1.43135E+00         2.94169E+00         1.00000E+00         4.88868E-10         2.94169E+00         8.68806E-01         2.07288E+00
+          2.27804E-02         1.61571E-02        -2.41221E-02         1.43115E+00         1.23451E+00         1.43135E+00         2.94982E+00         1.00000E+00         5.39167E-10         2.94982E+00         8.74316E-01         2.07550E+00
+          2.27804E-02         1.63270E-02        -2.42954E-02         1.43114E+00         1.24518E+00         1.43135E+00         2.96031E+00         1.00000E+00         5.93587E-10         2.96031E+00         8.79558E-01         2.08076E+00
+          2.27804E-02         1.64968E-02        -2.44705E-02         1.43114E+00         1.25585E+00         1.43135E+00         2.97271E+00         1.00000E+00         6.51695E-10         2.97271E+00         8.84487E-01         2.08822E+00
+          2.27804E-02         1.66666E-02        -2.46474E-02         1.43114E+00         1.26652E+00         1.43135E+00         2.98655E+00         1.00000E+00         7.13095E-10         2.98655E+00         8.89064E-01         2.09749E+00
+          2.27804E-02         1.68364E-02        -2.48262E-02         1.43113E+00         1.27719E+00         1.43135E+00         3.00144E+00         1.00000E+00         7.77411E-10         3.00144E+00         8.93249E-01         2.10819E+00
+          2.27804E-02         1.70063E-02        -2.50067E-02         1.43113E+00         1.28786E+00         1.43135E+00         3.01697E+00         1.00000E+00         8.44289E-10         3.01697E+00         8.97005E-01         2.11996E+00
+          2.27804E-02         1.71761E-02        -2.51891E-02         1.43112E+00         1.29853E+00         1.43135E+00         3.03277E+00         1.00000E+00         9.13379E-10         3.03277E+00         9.00298E-01         2.13248E+00
+          2.27804E-02         1.73459E-02        -2.53732E-02         1.43112E+00         1.30920E+00         1.43134E+00         3.04852E+00         1.00000E+00         9.84336E-10         3.04852E+00         9.03095E-01         2.14542E+00
+          2.27804E-02         1.75158E-02        -2.55592E-02         1.43112E+00         1.31987E+00         1.43134E+00         3.06388E+00         1.00000E+00         1.05681E-09         3.06388E+00         9.05367E-01         2.15851E+00
+          2.27804E-02         1.76856E-02        -2.57470E-02         1.43111E+00         1.33054E+00         1.43134E+00         3.07856E+00         1.00000E+00         1.13045E-09         3.07856E+00         9.07088E-01         2.17147E+00
+          2.27804E-02         1.78554E-02        -2.59366E-02         1.43111E+00         1.34121E+00         1.43134E+00         3.09228E+00         1.00000E+00         1.20487E-09         3.09228E+00         9.08231E-01         2.18405E+00
+          2.27804E-02         1.80252E-02        -2.61280E-02         1.43110E+00         1.35188E+00         1.43134E+00         3.10481E+00         1.00000E+00         1.27971E-09         3.10481E+00         9.08777E-01         2.19603E+00
+          2.27804E-02         1.81951E-02        -2.63212E-02         1.43110E+00         1.36255E+00         1.43134E+00         3.11591E+00         1.00000E+00         1.35458E-09         3.11591E+00         9.08704E-01         2.20721E+00
+          2.27804E-02         1.83649E-02        -2.65163E-02         1.43109E+00         1.37322E+00         1.43134E+00         3.12538E+00         1.00000E+00         1.42905E-09         3.12538E+00         9.07997E-01         2.21739E+00
+          2.27804E-02         1.85347E-02        -2.67131E-02         1.43109E+00         1.38389E+00         1.43134E+00         3.13304E+00         1.00000E+00         1.50271E-09         3.13304E+00         9.06642E-01         2.22640E+00
+          2.27804E-02         1.87045E-02        -2.69118E-02         1.43108E+00         1.39457E+00         1.43134E+00         3.13872E+00         1.00000E+00         1.57512E-09         3.13872E+00         9.04626E-01         2.23410E+00
+          2.27804E-02         1.88744E-02        -2.71123E-02         1.43108E+00         1.40524E+00         1.43134E+00         3.14229E+00         1.00000E+00         1.64583E-09         3.14229E+00         9.01942E-01         2.24035E+00
+          2.27804E-02         1.90442E-02        -2.73146E-02         1.43108E+00         1.41591E+00         1.43134E+00         3.14362E+00         1.00000E+00         1.71438E-09         3.14362E+00         8.98583E-01         2.24504E+00
+          2.27804E-02         1.92140E-02        -2.75187E-02         1.43107E+00         1.42658E+00         1.43134E+00         3.14261E+00         1.00000E+00         1.78028E-09         3.14261E+00         8.94545E-01         2.24806E+00
+          2.27804E-02         1.93839E-02        -2.77246E-02         1.43107E+00         1.43725E+00         1.43133E+00         3.13918E+00         1.00000E+00         1.84306E-09         3.13918E+00         8.89828E-01         2.24935E+00
+          2.27804E-02         1.95537E-02        -2.79323E-02         1.43106E+00         1.44792E+00         1.43133E+00         3.13325E+00         1.00000E+00         1.90223E-09         3.13325E+00         8.84432E-01         2.24882E+00
+          2.27804E-02         1.97235E-02        -2.81418E-02         1.43106E+00         1.45859E+00         1.43133E+00         3.12479E+00         1.00000E+00         1.95728E-09         3.12479E+00         8.78362E-01         2.24643E+00
+          2.27804E-02         1.98933E-02        -2.83532E-02         1.43105E+00         1.46926E+00         1.43133E+00         3.11375E+00         1.00000E+00         2.00773E-09         3.11375E+00         8.71624E-01         2.24213E+00
+          2.27804E-02         2.00632E-02        -2.85664E-02         1.43105E+00         1.47993E+00         1.43133E+00         3.10013E+00         1.00000E+00         2.05309E-09         3.10013E+00         8.64225E-01         2.23590E+00
+          2.27804E-02         2.02330E-02        -2.87813E-02         1.43104E+00         1.49060E+00         1.43133E+00         3.08391E+00         1.00000E+00         2.09288E-09         3.08391E+00         8.56177E-01         2.22773E+00
+          2.27804E-02         2.04028E-02        -2.89981E-02         1.43104E+00         1.50127E+00         1.43133E+00         3.06512E+00         1.00000E+00         2.12663E-09         3.06512E+00         8.47492E-01         2.21762E+00
+          2.27804E-02         2.05726E-02        -2.92167E-02         1.43103E+00         1.51194E+00         1.43133E+00         3.04376E+00         1.00000E+00         2.15391E-09         3.04376E+00         8.38186E-01         2.20558E+00
+          2.27804E-02         2.07425E-02        -2.94372E-02         1.43103E+00         1.52261E+00         1.43133E+00         3.01989E+00         1.00000E+00         2.17432E-09         3.01989E+00         8.28274E-01         2.19162E+00
+          2.27804E-02         2.09123E-02        -2.96594E-02         1.43102E+00         1.53328E+00         1.43133E+00         2.99356E+00         1.00000E+00         2.18750E-09         2.99356E+00         8.17776E-01         2.17578E+00
+          2.27804E-02         2.10821E-02        -2.98834E-02         1.43102E+00         1.54395E+00         1.43133E+00         2.96481E+00         1.00000E+00         2.19313E-09         2.96481E+00         8.06712E-01         2.15810E+00
+          2.27804E-02         2.12520E-02        -3.01093E-02         1.43101E+00         1.55462E+00         1.43133E+00         2.93373E+00         1.00000E+00         2.19099E-09         2.93373E+00         7.95103E-01         2.13862E+00
+          2.27804E-02         2.14218E-02        -3.03370E-02         1.43101E+00         1.56529E+00         1.43133E+00         2.90039E+00         1.00000E+00         2.18094E-09         2.90039E+00         7.82974E-01         2.11741E+00
+          2.27804E-02         2.15916E-02        -3.05664E-02         1.43100E+00         1.57596E+00         1.43133E+00         2.86488E+00         1.00000E+00         2.16295E-09         2.86488E+00         7.70348E-01         2.09453E+00
+          2.27804E-02         2.17614E-02        -3.07977E-02         1.43100E+00         1.58664E+00         1.43133E+00         2.82731E+00         1.00000E+00         2.13715E-09         2.82731E+00         7.57252E-01         2.07005E+00
+          2.27804E-02         2.19313E-02        -3.10308E-02         1.43099E+00         1.59731E+00         1.43133E+00         2.78777E+00         1.00000E+00         2.10387E-09         2.78777E+00         7.43714E-01         2.04405E+00
+          2.27804E-02         2.21011E-02        -3.12658E-02         1.43099E+00         1.60798E+00         1.43133E+00         2.74638E+00         1.00000E+00         2.06366E-09         2.74638E+00         7.29761E-01         2.01661E+00
+          2.27804E-02         2.22709E-02        -3.15025E-02         1.43098E+00         1.61865E+00         1.43133E+00         2.70325E+00         1.00000E+00         2.01739E-09         2.70325E+00         7.15423E-01         1.98783E+00
+          2.27804E-02         2.24407E-02        -3.17411E-02         1.43097E+00         1.62932E+00         1.43133E+00         2.65851E+00         1.00000E+00         1.96632E-09         2.65851E+00         7.00730E-01         1.95778E+00
+          2.27804E-02         2.26106E-02        -3.19814E-02         1.43097E+00         1.63999E+00         1.43133E+00         2.61229E+00         1.00000E+00         1.91221E-09         2.61229E+00         6.85712E-01         1.92658E+00
+          2.27804E-02         2.27804E-02        -3.22236E-02         1.43096E+00         1.65066E+00         1.43133E+00         2.56472E+00         1.00000E+00         1.85743E-09         2.56472E+00         6.70401E-01         1.89432E+00
+          2.27804E-02         2.29502E-02        -3.24676E-02         1.43096E+00         1.66133E+00         1.43133E+00         2.51594E+00         1.00000E+00         1.80508E-09         2.51594E+00         6.54828E-01         1.86111E+00
+          2.27804E-02         2.31201E-02        -3.27134E-02         1.43095E+00         1.67200E+00         1.43133E+00         2.46608E+00         1.00000E+00         1.75907E-09         2.46608E+00         6.39024E-01         1.82706E+00
+          2.27804E-02         2.32899E-02        -3.29610E-02         1.43095E+00         1.68267E+00         1.43133E+00         2.41528E+00         1.00000E+00         1.72418E-09         2.41528E+00         6.23023E-01         1.79226E+00
+          2.27804E-02         2.34597E-02        -3.32104E-02         1.43094E+00         1.69334E+00         1.43133E+00         2.36369E+00         1.00000E+00         1.70583E-09         2.36369E+00         6.06857E-01         1.75684E+00
+          2.27804E-02         2.36295E-02        -3.34616E-02         1.43094E+00         1.70401E+00         1.43133E+00         2.31146E+00         1.00000E+00         1.70971E-09         2.31146E+00         5.90556E-01         1.72090E+00
+          2.27804E-02         2.37994E-02        -3.37147E-02         1.43093E+00         1.71468E+00         1.43133E+00         2.25871E+00         1.00000E+00         1.74110E-09         2.25871E+00         5.74154E-01         1.68456E+00
+          2.27804E-02         2.39692E-02        -3.39696E-02         1.43092E+00         1.72535E+00         1.43133E+00         2.20561E+00         1.00000E+00         1.80410E-09         2.20561E+00         5.57681E-01         1.64792E+00
+          2.27804E-02         2.41390E-02        -3.42262E-02         1.43092E+00         1.73602E+00         1.43133E+00         2.15228E+00         1.00000E+00         1.90106E-09         2.15228E+00         5.41169E-01         1.61111E+00
+          2.27804E-02         2.43088E-02        -3.44847E-02         1.43091E+00         1.74669E+00         1.43133E+00         2.09888E+00         1.00000E+00         2.03236E-09         2.09888E+00         5.24649E-01         1.57423E+00
+          2.27804E-02         2.44787E-02        -3.47450E-02         1.43091E+00         1.75736E+00         1.43133E+00         2.04554E+00         1.00000E+00         2.19680E-09         2.04554E+00         5.08150E-01         1.53739E+00
+          2.27804E-02         2.46485E-02        -3.50072E-02         1.43090E+00         1.76804E+00         1.43133E+00         1.99241E+00         1.00000E+00         2.39202E-09         1.99241E+00         4.91702E-01         1.50071E+00
+          2.27804E-02         2.48183E-02        -3.52711E-02         1.43089E+00         1.77871E+00         1.43133E+00         1.93962E+00         1.00000E+00         2.61515E-09         1.93962E+00         4.75335E-01         1.46428E+00
+          2.27804E-02         2.49882E-02        -3.55368E-02         1.43089E+00         1.78938E+00         1.43133E+00         1.88730E+00         1.00000E+00         2.86316E-09         1.88730E+00         4.59075E-01         1.42822E+00
+          2.27804E-02         2.51580E-02        -3.58044E-02         1.43088E+00         1.80005E+00         1.43133E+00         1.83558E+00         1.00000E+00         3.13310E-09         1.83558E+00         4.42949E-01         1.39263E+00
+          2.27804E-02         2.53278E-02        -3.60738E-02         1.43088E+00         1.81072E+00         1.43133E+00         1.78459E+00         1.00000E+00         3.42220E-09         1.78459E+00         4.26984E-01         1.35760E+00
+          2.27804E-02         2.54976E-02        -3.63450E-02         1.43087E+00         1.82139E+00         1.43133E+00         1.73445E+00         1.00000E+00         3.72788E-09         1.73445E+00         4.11204E-01         1.32324E+00
+          2.27804E-02         2.56675E-02        -3.66180E-02         1.43086E+00         1.83206E+00         1.43133E+00         1.68528E+00         1.00000E+00         4.04774E-09         1.68528E+00         3.95633E-01         1.28964E+00
+          2.27804E-02         2.58373E-02        -3.68928E-02         1.43086E+00         1.84273E+00         1.43133E+00         1.63719E+00         1.00000E+00         4.37952E-09         1.63719E+00         3.80294E-01         1.25689E+00
+          2.27804E-02         2.60071E-02        -3.71694E-02         1.43085E+00         1.85340E+00         1.43133E+00         1.59029E+00         1.00000E+00         4.72104E-09         1.59029E+00         3.65207E-01         1.22508E+00
+          2.27804E-02         2.61769E-02        -3.74478E-02         1.43084E+00         1.86407E+00         1.43133E+00         1.54468E+00         1.00000E+00         5.07019E-09         1.54468E+00         3.50394E-01         1.19428E+00
+          2.29502E-02         8.72665E-04        -1.61905E-02         1.44200E+00         2.74155E-01         1.44210E+00         7.11654E+01         1.00000E+00         5.50396E-11         7.11654E+01         3.53678E+00         6.76286E+01
+          2.29502E-02         1.04249E-03        -1.62007E-02         1.44200E+00         2.84826E-01         1.44210E+00         6.98981E+01         1.00000E+00         5.50950E-11         6.98981E+01         3.48757E+00         6.64106E+01
+          2.29502E-02         1.21232E-03        -1.62127E-02         1.44200E+00         2.95496E-01         1.44210E+00         6.86044E+01         1.00000E+00         5.51364E-11         6.86044E+01         3.43711E+00         6.51673E+01
+          2.29502E-02         1.38215E-03        -1.62266E-02         1.44200E+00         3.06167E-01         1.44210E+00         6.72864E+01         1.00000E+00         5.51545E-11         6.72864E+01         3.38546E+00         6.39009E+01
+          2.29502E-02         1.55197E-03        -1.62422E-02         1.44200E+00         3.16838E-01         1.44210E+00         6.59461E+01         1.00000E+00         5.51397E-11         6.59461E+01         3.33269E+00         6.26134E+01
+          2.29502E-02         1.72180E-03        -1.62597E-02         1.44200E+00         3.27508E-01         1.44209E+00         6.45858E+01         1.00000E+00         5.50821E-11         6.45858E+01         3.27887E+00         6.13069E+01
+          2.29502E-02         1.89163E-03        -1.62789E-02         1.44200E+00         3.38179E-01         1.44209E+00         6.32076E+01         1.00000E+00         5.49716E-11         6.32076E+01         3.22407E+00         5.99835E+01
+          2.29502E-02         2.06146E-03        -1.63000E-02         1.44200E+00         3.48849E-01         1.44209E+00         6.18135E+01         1.00000E+00         5.47984E-11         6.18135E+01         3.16837E+00         5.86451E+01
+          2.29502E-02         2.23128E-03        -1.63229E-02         1.44200E+00         3.59520E-01         1.44209E+00         6.04058E+01         1.00000E+00         5.45528E-11         6.04058E+01         3.11184E+00         5.72940E+01
+          2.29502E-02         2.40111E-03        -1.63476E-02         1.44200E+00         3.70190E-01         1.44209E+00         5.89866E+01         1.00000E+00         5.42259E-11         5.89866E+01         3.05454E+00         5.59321E+01
+          2.29502E-02         2.57094E-03        -1.63742E-02         1.44200E+00         3.80861E-01         1.44209E+00         5.75580E+01         1.00000E+00         5.38093E-11         5.75580E+01         2.99657E+00         5.45614E+01
+          2.29502E-02         2.74077E-03        -1.64025E-02         1.44200E+00         3.91532E-01         1.44209E+00         5.61221E+01         1.00000E+00         5.32956E-11         5.61221E+01         2.93799E+00         5.31841E+01
+          2.29502E-02         2.91059E-03        -1.64326E-02         1.44200E+00         4.02202E-01         1.44209E+00         5.46809E+01         1.00000E+00         5.26789E-11         5.46809E+01         2.87889E+00         5.18020E+01
+          2.29502E-02         3.08042E-03        -1.64646E-02         1.44200E+00         4.12873E-01         1.44209E+00         5.32366E+01         1.00000E+00         5.19543E-11         5.32366E+01         2.81933E+00         5.04172E+01
+          2.29502E-02         3.25025E-03        -1.64984E-02         1.44200E+00         4.23543E-01         1.44209E+00         5.17911E+01         1.00000E+00         5.11195E-11         5.17911E+01         2.75941E+00         4.90317E+01
+          2.29502E-02         3.42008E-03        -1.65339E-02         1.44200E+00         4.34214E-01         1.44209E+00         5.03464E+01         1.00000E+00         5.01740E-11         5.03464E+01         2.69919E+00         4.76472E+01
+          2.29502E-02         3.58990E-03        -1.65713E-02         1.44200E+00         4.44884E-01         1.44209E+00         4.89044E+01         1.00000E+00         4.91207E-11         4.89044E+01         2.63877E+00         4.62657E+01
+          2.29502E-02         3.75973E-03        -1.66105E-02         1.44200E+00         4.55555E-01         1.44209E+00         4.74671E+01         1.00000E+00         4.79660E-11         4.74671E+01         2.57821E+00         4.48889E+01
+          2.29502E-02         3.92956E-03        -1.66515E-02         1.44199E+00         4.66225E-01         1.44209E+00         4.60363E+01         1.00000E+00         4.67209E-11         4.60363E+01         2.51760E+00         4.35187E+01
+          2.29502E-02         4.09939E-03        -1.66944E-02         1.44199E+00         4.76896E-01         1.44209E+00         4.46138E+01         1.00000E+00         4.54024E-11         4.46138E+01         2.45701E+00         4.21568E+01
+          2.29502E-02         4.26921E-03        -1.67390E-02         1.44199E+00         4.87567E-01         1.44209E+00         4.32013E+01         1.00000E+00         4.40344E-11         4.32013E+01         2.39654E+00         4.08048E+01
+          2.29502E-02         4.43904E-03        -1.67855E-02         1.44199E+00         4.98237E-01         1.44209E+00         4.18005E+01         1.00000E+00         4.26500E-11         4.18005E+01         2.33624E+00         3.94643E+01
+          2.29502E-02         4.60887E-03        -1.68337E-02         1.44199E+00         5.08908E-01         1.44209E+00         4.04131E+01         1.00000E+00         4.12931E-11         4.04131E+01         2.27621E+00         3.81369E+01
+          2.29502E-02         4.77869E-03        -1.68838E-02         1.44199E+00         5.19578E-01         1.44209E+00         3.90406E+01         1.00000E+00         4.00204E-11         3.90406E+01         2.21652E+00         3.68241E+01
+          2.29502E-02         4.94852E-03        -1.69357E-02         1.44199E+00         5.30249E-01         1.44209E+00         3.76844E+01         1.00000E+00         3.89029E-11         3.76844E+01         2.15724E+00         3.55272E+01
+          2.29502E-02         5.11835E-03        -1.69894E-02         1.44199E+00         5.40919E-01         1.44209E+00         3.63461E+01         1.00000E+00         3.80259E-11         3.63461E+01         2.09845E+00         3.42477E+01
+          2.29502E-02         5.28818E-03        -1.70449E-02         1.44199E+00         5.51590E-01         1.44209E+00         3.50270E+01         1.00000E+00         3.74861E-11         3.50270E+01         2.04023E+00         3.29868E+01
+          2.29502E-02         5.45800E-03        -1.71022E-02         1.44198E+00         5.62261E-01         1.44209E+00         3.37283E+01         1.00000E+00         3.73854E-11         3.37283E+01         1.98264E+00         3.17457E+01
+          2.29502E-02         5.62783E-03        -1.71613E-02         1.44198E+00         5.72931E-01         1.44208E+00         3.24513E+01         1.00000E+00         3.78204E-11         3.24513E+01         1.92576E+00         3.05256E+01
+          2.29502E-02         5.79766E-03        -1.72223E-02         1.44198E+00         5.83602E-01         1.44208E+00         3.11972E+01         1.00000E+00         3.88694E-11         3.11972E+01         1.86966E+00         2.93275E+01
+          2.29502E-02         5.96749E-03        -1.72850E-02         1.44198E+00         5.94272E-01         1.44208E+00         2.99669E+01         1.00000E+00         4.05824E-11         2.99669E+01         1.81439E+00         2.81525E+01
+          2.29502E-02         6.13731E-03        -1.73496E-02         1.44198E+00         6.04943E-01         1.44208E+00         2.87615E+01         1.00000E+00         4.29759E-11         2.87615E+01         1.76004E+00         2.70014E+01
+          2.29502E-02         6.30714E-03        -1.74160E-02         1.44198E+00         6.15613E-01         1.44208E+00         2.75819E+01         1.00000E+00         4.60366E-11         2.75819E+01         1.70666E+00         2.58752E+01
+          2.29502E-02         6.47697E-03        -1.74842E-02         1.44198E+00         6.26284E-01         1.44208E+00         2.64289E+01         1.00000E+00         4.97290E-11         2.64289E+01         1.65430E+00         2.47746E+01
+          2.29502E-02         6.64680E-03        -1.75542E-02         1.44197E+00         6.36955E-01         1.44208E+00         2.53033E+01         1.00000E+00         5.40049E-11         2.53033E+01         1.60304E+00         2.37003E+01
+          2.29502E-02         6.81662E-03        -1.76260E-02         1.44197E+00         6.47625E-01         1.44208E+00         2.42058E+01         1.00000E+00         5.88115E-11         2.42058E+01         1.55292E+00         2.26529E+01
+          2.29502E-02         6.98645E-03        -1.76996E-02         1.44197E+00         6.58296E-01         1.44208E+00         2.31369E+01         1.00000E+00         6.40963E-11         2.31369E+01         1.50401E+00         2.16329E+01
+          2.29502E-02         7.15628E-03        -1.77750E-02         1.44197E+00         6.68966E-01         1.44208E+00         2.20973E+01         1.00000E+00         6.98098E-11         2.20973E+01         1.45634E+00         2.06410E+01
+          2.29502E-02         7.32611E-03        -1.78523E-02         1.44197E+00         6.79637E-01         1.44208E+00         2.10874E+01         1.00000E+00         7.59062E-11         2.10874E+01         1.40996E+00         1.96774E+01
+          2.29502E-02         7.49593E-03        -1.79314E-02         1.44196E+00         6.90307E-01         1.44208E+00         2.01075E+01         1.00000E+00         8.23433E-11         2.01075E+01         1.36493E+00         1.87426E+01
+          2.29502E-02         7.66576E-03        -1.80122E-02         1.44196E+00         7.00978E-01         1.44208E+00         1.91580E+01         1.00000E+00         8.90821E-11         1.91580E+01         1.32127E+00         1.78367E+01
+          2.29502E-02         7.83559E-03        -1.80949E-02         1.44196E+00         7.11649E-01         1.44207E+00         1.82391E+01         1.00000E+00         9.60857E-11         1.82391E+01         1.27904E+00         1.69600E+01
+          2.29502E-02         8.00542E-03        -1.81794E-02         1.44196E+00         7.22319E-01         1.44207E+00         1.73510E+01         1.00000E+00         1.03319E-10         1.73510E+01         1.23825E+00         1.61127E+01
+          2.29502E-02         8.17524E-03        -1.82657E-02         1.44196E+00         7.32990E-01         1.44207E+00         1.64937E+01         1.00000E+00         1.10747E-10         1.64937E+01         1.19896E+00         1.52948E+01
+          2.29502E-02         8.34507E-03        -1.83538E-02         1.44196E+00         7.43660E-01         1.44207E+00         1.56674E+01         1.00000E+00         1.18336E-10         1.56674E+01         1.16117E+00         1.45063E+01
+          2.29502E-02         8.51490E-03        -1.84438E-02         1.44195E+00         7.54331E-01         1.44207E+00         1.48720E+01         1.00000E+00         1.26051E-10         1.48720E+01         1.12492E+00         1.37471E+01
+          2.29502E-02         8.68473E-03        -1.85355E-02         1.44195E+00         7.65001E-01         1.44207E+00         1.41074E+01         1.00000E+00         1.33858E-10         1.41074E+01         1.09023E+00         1.30172E+01
+          2.29502E-02         8.85455E-03        -1.86291E-02         1.44195E+00         7.75672E-01         1.44207E+00         1.33735E+01         1.00000E+00         1.41719E-10         1.33735E+01         1.05711E+00         1.23164E+01
+          2.29502E-02         9.02438E-03        -1.87244E-02         1.44195E+00         7.86343E-01         1.44207E+00         1.26700E+01         1.00000E+00         1.49600E-10         1.26700E+01         1.02557E+00         1.16444E+01
+          2.29502E-02         9.19421E-03        -1.88216E-02         1.44194E+00         7.97013E-01         1.44207E+00         1.19967E+01         1.00000E+00         1.57460E-10         1.19967E+01         9.95638E-01         1.10011E+01
+          2.29502E-02         9.36403E-03        -1.89206E-02         1.44194E+00         8.07684E-01         1.44207E+00         1.13533E+01         1.00000E+00         1.65261E-10         1.13533E+01         9.67304E-01         1.03860E+01
+          2.29502E-02         9.53386E-03        -1.90214E-02         1.44194E+00         8.18354E-01         1.44207E+00         1.07395E+01         1.00000E+00         1.72961E-10         1.07395E+01         9.40575E-01         9.79888E+00
+          2.29502E-02         9.70369E-03        -1.91240E-02         1.44194E+00         8.29025E-01         1.44206E+00         1.01547E+01         1.00000E+00         1.80518E-10         1.01547E+01         9.15449E-01         9.23922E+00
+          2.29502E-02         9.87352E-03        -1.92285E-02         1.44194E+00         8.39695E-01         1.44206E+00         9.59853E+00         1.00000E+00         1.87888E-10         9.59853E+00         8.91922E-01         8.70661E+00
+          2.29502E-02         1.00433E-02        -1.93347E-02         1.44193E+00         8.50366E-01         1.44206E+00         9.07053E+00         1.00000E+00         1.95026E-10         9.07053E+00         8.69984E-01         8.20055E+00
+          2.29502E-02         1.02132E-02        -1.94427E-02         1.44193E+00         8.61037E-01         1.44206E+00         8.57014E+00         1.00000E+00         2.01886E-10         8.57014E+00         8.49624E-01         7.72052E+00
+          2.29502E-02         1.03830E-02        -1.95526E-02         1.44193E+00         8.71707E-01         1.44206E+00         8.09679E+00         1.00000E+00         2.08420E-10         8.09679E+00         8.30826E-01         7.26596E+00
+          2.29502E-02         1.05528E-02        -1.96643E-02         1.44193E+00         8.82378E-01         1.44206E+00         7.64985E+00         1.00000E+00         2.14582E-10         7.64985E+00         8.13571E-01         6.83628E+00
+          2.29502E-02         1.07227E-02        -1.97778E-02         1.44192E+00         8.93048E-01         1.44206E+00         7.22869E+00         1.00000E+00         2.20322E-10         7.22869E+00         7.97835E-01         6.43085E+00
+          2.29502E-02         1.08925E-02        -1.98931E-02         1.44192E+00         9.03719E-01         1.44206E+00         6.83264E+00         1.00000E+00         2.25592E-10         6.83264E+00         7.83594E-01         6.04904E+00
+          2.29502E-02         1.10623E-02        -2.00102E-02         1.44192E+00         9.14389E-01         1.44206E+00         6.46100E+00         1.00000E+00         2.30347E-10         6.46100E+00         7.70818E-01         5.69018E+00
+          2.29502E-02         1.12321E-02        -2.01291E-02         1.44191E+00         9.25060E-01         1.44205E+00         6.11306E+00         1.00000E+00         2.34539E-10         6.11306E+00         7.59475E-01         5.35358E+00
+          2.29502E-02         1.14020E-02        -2.02498E-02         1.44191E+00         9.35731E-01         1.44205E+00         5.78807E+00         1.00000E+00         2.38124E-10         5.78807E+00         7.49529E-01         5.03855E+00
+          2.29502E-02         1.15718E-02        -2.03724E-02         1.44191E+00         9.46401E-01         1.44205E+00         5.48529E+00         1.00000E+00         2.41063E-10         5.48529E+00         7.40942E-01         4.74435E+00
+          2.29502E-02         1.17416E-02        -2.04967E-02         1.44191E+00         9.57072E-01         1.44205E+00         5.20394E+00         1.00000E+00         2.43319E-10         5.20394E+00         7.33674E-01         4.47027E+00
+          2.29502E-02         1.19114E-02        -2.06229E-02         1.44190E+00         9.67742E-01         1.44205E+00         4.94324E+00         1.00000E+00         2.44860E-10         4.94324E+00         7.27681E-01         4.21556E+00
+          2.29502E-02         1.20813E-02        -2.07509E-02         1.44190E+00         9.78413E-01         1.44205E+00         4.70239E+00         1.00000E+00         2.45665E-10         4.70239E+00         7.22917E-01         3.97947E+00
+          2.29502E-02         1.22511E-02        -2.08807E-02         1.44190E+00         9.89083E-01         1.44205E+00         4.48060E+00         1.00000E+00         2.45720E-10         4.48060E+00         7.19333E-01         3.76127E+00
+          2.29502E-02         1.24209E-02        -2.10123E-02         1.44189E+00         9.99754E-01         1.44205E+00         4.27705E+00         1.00000E+00         2.45026E-10         4.27705E+00         7.16878E-01         3.56018E+00
+          2.29502E-02         1.25908E-02        -2.11457E-02         1.44189E+00         1.01042E+00         1.44205E+00         4.09095E+00         1.00000E+00         2.43599E-10         4.09095E+00         7.15501E-01         3.37545E+00
+          2.29502E-02         1.27606E-02        -2.12810E-02         1.44189E+00         1.02110E+00         1.44204E+00         3.92148E+00         1.00000E+00         2.41476E-10         3.92148E+00         7.15147E-01         3.20633E+00
+          2.29502E-02         1.29304E-02        -2.14180E-02         1.44188E+00         1.03177E+00         1.44204E+00         3.76783E+00         1.00000E+00         2.38722E-10         3.76783E+00         7.15759E-01         3.05207E+00
+          2.29502E-02         1.31002E-02        -2.15569E-02         1.44188E+00         1.04244E+00         1.44204E+00         3.62921E+00         1.00000E+00         2.35435E-10         3.62921E+00         7.17280E-01         2.91193E+00
+          2.29502E-02         1.32701E-02        -2.16975E-02         1.44188E+00         1.05311E+00         1.44204E+00         3.50481E+00         1.00000E+00         2.31755E-10         3.50481E+00         7.19650E-01         2.78516E+00
+          2.29502E-02         1.34399E-02        -2.18400E-02         1.44188E+00         1.06378E+00         1.44204E+00         3.39384E+00         1.00000E+00         2.27874E-10         3.39384E+00         7.22811E-01         2.67103E+00
+          2.29502E-02         1.36097E-02        -2.19843E-02         1.44187E+00         1.07445E+00         1.44204E+00         3.29553E+00         1.00000E+00         2.24044E-10         3.29553E+00         7.26700E-01         2.56883E+00
+          2.29502E-02         1.37795E-02        -2.21304E-02         1.44187E+00         1.08512E+00         1.44204E+00         3.20910E+00         1.00000E+00         2.20589E-10         3.20910E+00         7.31256E-01         2.47784E+00
+          2.29502E-02         1.39494E-02        -2.22783E-02         1.44187E+00         1.09579E+00         1.44204E+00         3.13379E+00         1.00000E+00         2.17909E-10         3.13379E+00         7.36416E-01         2.39738E+00
+          2.29502E-02         1.41192E-02        -2.24280E-02         1.44186E+00         1.10646E+00         1.44204E+00         3.06886E+00         1.00000E+00         2.16478E-10         3.06886E+00         7.42117E-01         2.32675E+00
+          2.29502E-02         1.42890E-02        -2.25796E-02         1.44186E+00         1.11713E+00         1.44203E+00         3.01358E+00         1.00000E+00         2.16823E-10         3.01358E+00         7.48297E-01         2.26529E+00
+          2.29502E-02         1.44589E-02        -2.27329E-02         1.44185E+00         1.12780E+00         1.44203E+00         2.96724E+00         1.00000E+00         2.19493E-10         2.96724E+00         7.54892E-01         2.21235E+00
+          2.29502E-02         1.46287E-02        -2.28881E-02         1.44185E+00         1.13847E+00         1.44203E+00         2.92914E+00         1.00000E+00         2.25005E-10         2.92914E+00         7.61840E-01         2.16730E+00
+          2.29502E-02         1.47985E-02        -2.30451E-02         1.44185E+00         1.14914E+00         1.44203E+00         2.89861E+00         1.00000E+00         2.33788E-10         2.89861E+00         7.69077E-01         2.12953E+00
+          2.29502E-02         1.49683E-02        -2.32039E-02         1.44184E+00         1.15981E+00         1.44203E+00         2.87498E+00         1.00000E+00         2.46137E-10         2.87498E+00         7.76543E-01         2.09844E+00
+          2.29502E-02         1.51382E-02        -2.33645E-02         1.44184E+00         1.17048E+00         1.44203E+00         2.85762E+00         1.00000E+00         2.62193E-10         2.85762E+00         7.84175E-01         2.07345E+00
+          2.29502E-02         1.53080E-02        -2.35269E-02         1.44184E+00         1.18115E+00         1.44203E+00         2.84592E+00         1.00000E+00         2.81952E-10         2.84592E+00         7.91914E-01         2.05401E+00
+          2.29502E-02         1.54778E-02        -2.36911E-02         1.44183E+00         1.19182E+00         1.44203E+00         2.83928E+00         1.00000E+00         3.05300E-10         2.83928E+00         7.99700E-01         2.03958E+00
+          2.29502E-02         1.56476E-02        -2.38572E-02         1.44183E+00         1.20249E+00         1.44203E+00         2.83712E+00         1.00000E+00         3.32048E-10         2.83712E+00         8.07475E-01         2.02965E+00
+          2.29502E-02         1.58175E-02        -2.40250E-02         1.44182E+00         1.21317E+00         1.44203E+00         2.83891E+00         1.00000E+00         3.61968E-10         2.83891E+00         8.15183E-01         2.02373E+00
+          2.29502E-02         1.59873E-02        -2.41947E-02         1.44182E+00         1.22384E+00         1.44202E+00         2.84411E+00         1.00000E+00         3.94816E-10         2.84411E+00         8.22769E-01         2.02134E+00
+          2.29502E-02         1.61571E-02        -2.43662E-02         1.44182E+00         1.23451E+00         1.44202E+00         2.85222E+00         1.00000E+00         4.30349E-10         2.85222E+00         8.30178E-01         2.02204E+00
+          2.29502E-02         1.63270E-02        -2.45394E-02         1.44181E+00         1.24518E+00         1.44202E+00         2.86276E+00         1.00000E+00         4.68327E-10         2.86276E+00         8.37361E-01         2.02540E+00
+          2.29502E-02         1.64968E-02        -2.47145E-02         1.44181E+00         1.25585E+00         1.44202E+00         2.87528E+00         1.00000E+00         5.08517E-10         2.87528E+00         8.44266E-01         2.03101E+00
+          2.29502E-02         1.66666E-02        -2.48915E-02         1.44181E+00         1.26652E+00         1.44202E+00         2.88934E+00         1.00000E+00         5.50692E-10         2.88934E+00         8.50848E-01         2.03849E+00
+          2.29502E-02         1.68364E-02        -2.50702E-02         1.44180E+00         1.27719E+00         1.44202E+00         2.90453E+00         1.00000E+00         5.94629E-10         2.90453E+00         8.57059E-01         2.04748E+00
+          2.29502E-02         1.70063E-02        -2.52507E-02         1.44180E+00         1.28786E+00         1.44202E+00         2.92049E+00         1.00000E+00         6.40106E-10         2.92049E+00         8.62859E-01         2.05763E+00
+          2.29502E-02         1.71761E-02        -2.54331E-02         1.44179E+00         1.29853E+00         1.44202E+00         2.93683E+00         1.00000E+00         6.86897E-10         2.93683E+00         8.68205E-01         2.06862E+00
+          2.29502E-02         1.73459E-02        -2.56172E-02         1.44179E+00         1.30920E+00         1.44202E+00         2.95323E+00         1.00000E+00         7.34775E-10         2.95323E+00         8.73061E-01         2.08017E+00
+          2.29502E-02         1.75158E-02        -2.58032E-02         1.44178E+00         1.31987E+00         1.44201E+00         2.96937E+00         1.00000E+00         7.83505E-10         2.96937E+00         8.77390E-01         2.09198E+00
+          2.29502E-02         1.76856E-02        -2.59910E-02         1.44178E+00         1.33054E+00         1.44201E+00         2.98496E+00         1.00000E+00         8.32845E-10         2.98496E+00         8.81161E-01         2.10380E+00
+          2.29502E-02         1.78554E-02        -2.61806E-02         1.44178E+00         1.34121E+00         1.44201E+00         2.99973E+00         1.00000E+00         8.82545E-10         2.99973E+00         8.84342E-01         2.11539E+00
+          2.29502E-02         1.80252E-02        -2.63720E-02         1.44177E+00         1.35188E+00         1.44201E+00         3.01344E+00         1.00000E+00         9.32347E-10         3.01344E+00         8.86907E-01         2.12653E+00
+          2.29502E-02         1.81951E-02        -2.65652E-02         1.44177E+00         1.36255E+00         1.44201E+00         3.02586E+00         1.00000E+00         9.81983E-10         3.02586E+00         8.88831E-01         2.13703E+00
+          2.29502E-02         1.83649E-02        -2.67603E-02         1.44176E+00         1.37322E+00         1.44201E+00         3.03678E+00         1.00000E+00         1.03117E-09         3.03678E+00         8.90093E-01         2.14669E+00
+          2.29502E-02         1.85347E-02        -2.69571E-02         1.44176E+00         1.38389E+00         1.44201E+00         3.04603E+00         1.00000E+00         1.07963E-09         3.04603E+00         8.90673E-01         2.15536E+00
+          2.29502E-02         1.87045E-02        -2.71558E-02         1.44175E+00         1.39457E+00         1.44201E+00         3.05344E+00         1.00000E+00         1.12707E-09         3.05344E+00         8.90556E-01         2.16289E+00
+          2.29502E-02         1.88744E-02        -2.73563E-02         1.44175E+00         1.40524E+00         1.44201E+00         3.05887E+00         1.00000E+00         1.17318E-09         3.05887E+00         8.89728E-01         2.16914E+00
+          2.29502E-02         1.90442E-02        -2.75586E-02         1.44174E+00         1.41591E+00         1.44201E+00         3.06219E+00         1.00000E+00         1.21765E-09         3.06219E+00         8.88180E-01         2.17401E+00
+          2.29502E-02         1.92140E-02        -2.77627E-02         1.44174E+00         1.42658E+00         1.44201E+00         3.06329E+00         1.00000E+00         1.26018E-09         3.06329E+00         8.85903E-01         2.17739E+00
+          2.29502E-02         1.93839E-02        -2.79686E-02         1.44173E+00         1.43725E+00         1.44201E+00         3.06209E+00         1.00000E+00         1.30045E-09         3.06209E+00         8.82894E-01         2.17920E+00
+          2.29502E-02         1.95537E-02        -2.81763E-02         1.44173E+00         1.44792E+00         1.44200E+00         3.05852E+00         1.00000E+00         1.33814E-09         3.05852E+00         8.79149E-01         2.17937E+00
+          2.29502E-02         1.97235E-02        -2.83859E-02         1.44172E+00         1.45859E+00         1.44200E+00         3.05252E+00         1.00000E+00         1.37296E-09         3.05252E+00         8.74671E-01         2.17784E+00
+          2.29502E-02         1.98933E-02        -2.85972E-02         1.44172E+00         1.46926E+00         1.44200E+00         3.04404E+00         1.00000E+00         1.40458E-09         3.04404E+00         8.69461E-01         2.17458E+00
+          2.29502E-02         2.00632E-02        -2.88104E-02         1.44172E+00         1.47993E+00         1.44200E+00         3.03307E+00         1.00000E+00         1.43274E-09         3.03307E+00         8.63526E-01         2.16955E+00
+          2.29502E-02         2.02330E-02        -2.90253E-02         1.44171E+00         1.49060E+00         1.44200E+00         3.01960E+00         1.00000E+00         1.45714E-09         3.01960E+00         8.56875E-01         2.16272E+00
+          2.29502E-02         2.04028E-02        -2.92421E-02         1.44171E+00         1.50127E+00         1.44200E+00         3.00362E+00         1.00000E+00         1.47754E-09         3.00362E+00         8.49517E-01         2.15410E+00
+          2.29502E-02         2.05726E-02        -2.94607E-02         1.44170E+00         1.51194E+00         1.44200E+00         2.98516E+00         1.00000E+00         1.49371E-09         2.98516E+00         8.41467E-01         2.14369E+00
+          2.29502E-02         2.07425E-02        -2.96812E-02         1.44170E+00         1.52261E+00         1.44200E+00         2.96423E+00         1.00000E+00         1.50548E-09         2.96423E+00         8.32739E-01         2.13149E+00
+          2.29502E-02         2.09123E-02        -2.99034E-02         1.44169E+00         1.53328E+00         1.44200E+00         2.94089E+00         1.00000E+00         1.51270E-09         2.94089E+00         8.23352E-01         2.11754E+00
+          2.29502E-02         2.10821E-02        -3.01274E-02         1.44168E+00         1.54395E+00         1.44200E+00         2.91518E+00         1.00000E+00         1.51531E-09         2.91518E+00         8.13323E-01         2.10185E+00
+          2.29502E-02         2.12520E-02        -3.03533E-02         1.44168E+00         1.55462E+00         1.44200E+00         2.88715E+00         1.00000E+00         1.51331E-09         2.88715E+00         8.02676E-01         2.08448E+00
+          2.29502E-02         2.14218E-02        -3.05810E-02         1.44167E+00         1.56529E+00         1.44200E+00         2.85689E+00         1.00000E+00         1.50681E-09         2.85689E+00         7.91432E-01         2.06546E+00
+          2.29502E-02         2.15916E-02        -3.08104E-02         1.44167E+00         1.57596E+00         1.44200E+00         2.82447E+00         1.00000E+00         1.49601E-09         2.82447E+00         7.79617E-01         2.04485E+00
+          2.29502E-02         2.17614E-02        -3.10417E-02         1.44166E+00         1.58664E+00         1.44200E+00         2.78997E+00         1.00000E+00         1.48130E-09         2.78997E+00         7.67256E-01         2.02271E+00
+          2.29502E-02         2.19313E-02        -3.12748E-02         1.44166E+00         1.59731E+00         1.44200E+00         2.75348E+00         1.00000E+00         1.46323E-09         2.75348E+00         7.54379E-01         1.99911E+00
+          2.29502E-02         2.21011E-02        -3.15098E-02         1.44165E+00         1.60798E+00         1.44200E+00         2.71512E+00         1.00000E+00         1.44257E-09         2.71512E+00         7.41012E-01         1.97411E+00
+          2.29502E-02         2.22709E-02        -3.17465E-02         1.44165E+00         1.61865E+00         1.44200E+00         2.67498E+00         1.00000E+00         1.42037E-09         2.67498E+00         7.27188E-01         1.94779E+00
+          2.29502E-02         2.24407E-02        -3.19850E-02         1.44164E+00         1.62932E+00         1.44200E+00         2.63318E+00         1.00000E+00         1.39798E-09         2.63318E+00         7.12936E-01         1.92025E+00
+          2.29502E-02         2.26106E-02        -3.22254E-02         1.44164E+00         1.63999E+00         1.44200E+00         2.58984E+00         1.00000E+00         1.37711E-09         2.58984E+00         6.98289E-01         1.89155E+00
+          2.29502E-02         2.27804E-02        -3.24676E-02         1.44163E+00         1.65066E+00         1.44200E+00         2.54506E+00         1.00000E+00         1.35985E-09         2.54506E+00         6.83280E-01         1.86178E+00
+          2.29502E-02         2.29502E-02        -3.27116E-02         1.44163E+00         1.66133E+00         1.44200E+00         2.49899E+00         1.00000E+00         1.34866E-09         2.49899E+00         6.67941E-01         1.83105E+00
+          2.29502E-02         2.31201E-02        -3.29574E-02         1.44162E+00         1.67200E+00         1.44200E+00         2.45175E+00         1.00000E+00         1.34630E-09         2.45175E+00         6.52307E-01         1.79945E+00
+          2.29502E-02         2.32899E-02        -3.32050E-02         1.44161E+00         1.68267E+00         1.44200E+00         2.40347E+00         1.00000E+00         1.35563E-09         2.40347E+00         6.36412E-01         1.76706E+00
+          2.29502E-02         2.34597E-02        -3.34544E-02         1.44161E+00         1.69334E+00         1.44200E+00         2.35428E+00         1.00000E+00         1.37946E-09         2.35428E+00         6.20290E-01         1.73399E+00
+          2.29502E-02         2.36295E-02        -3.37056E-02         1.44160E+00         1.70401E+00         1.44200E+00         2.30431E+00         1.00000E+00         1.42020E-09         2.30431E+00         6.03975E-01         1.70034E+00
+          2.29502E-02         2.37994E-02        -3.39587E-02         1.44160E+00         1.71468E+00         1.44200E+00         2.25371E+00         1.00000E+00         1.47964E-09         2.25371E+00         5.87503E-01         1.66620E+00
+          2.29502E-02         2.39692E-02        -3.42135E-02         1.44159E+00         1.72535E+00         1.44200E+00         2.20260E+00         1.00000E+00         1.55878E-09         2.20260E+00         5.70907E-01         1.63169E+00
+          2.29502E-02         2.41390E-02        -3.44702E-02         1.44159E+00         1.73602E+00         1.44200E+00         2.15112E+00         1.00000E+00         1.65783E-09         2.15112E+00         5.54220E-01         1.59690E+00
+          2.29502E-02         2.43088E-02        -3.47287E-02         1.44158E+00         1.74669E+00         1.44200E+00         2.09941E+00         1.00000E+00         1.77632E-09         2.09941E+00         5.37478E-01         1.56194E+00
+          2.29502E-02         2.44787E-02        -3.49890E-02         1.44157E+00         1.75736E+00         1.44200E+00         2.04760E+00         1.00000E+00         1.91326E-09         2.04760E+00         5.20711E-01         1.52689E+00
+          2.29502E-02         2.46485E-02        -3.52511E-02         1.44157E+00         1.76804E+00         1.44200E+00         1.99583E+00         1.00000E+00         2.06736E-09         1.99583E+00         5.03954E-01         1.49187E+00
+          2.29502E-02         2.48183E-02        -3.55151E-02         1.44156E+00         1.77871E+00         1.44200E+00         1.94422E+00         1.00000E+00         2.23713E-09         1.94422E+00         4.87238E-01         1.45698E+00
+          2.29502E-02         2.49882E-02        -3.57808E-02         1.44156E+00         1.78938E+00         1.44200E+00         1.89290E+00         1.00000E+00         2.42105E-09         1.89290E+00         4.70594E-01         1.42231E+00
+          2.29502E-02         2.51580E-02        -3.60484E-02         1.44155E+00         1.80005E+00         1.44200E+00         1.84200E+00         1.00000E+00         2.61759E-09         1.84200E+00         4.54051E-01         1.38795E+00
+          2.29502E-02         2.53278E-02        -3.63177E-02         1.44154E+00         1.81072E+00         1.44200E+00         1.79165E+00         1.00000E+00         2.82524E-09         1.79165E+00         4.37638E-01         1.35401E+00
+          2.29502E-02         2.54976E-02        -3.65889E-02         1.44154E+00         1.82139E+00         1.44200E+00         1.74195E+00         1.00000E+00         3.04254E-09         1.74195E+00         4.21384E-01         1.32057E+00
+          2.29502E-02         2.56675E-02        -3.68619E-02         1.44153E+00         1.83206E+00         1.44200E+00         1.69304E+00         1.00000E+00         3.26804E-09         1.69304E+00         4.05316E-01         1.28772E+00
+          2.29502E-02         2.58373E-02        -3.71367E-02         1.44152E+00         1.84273E+00         1.44200E+00         1.64502E+00         1.00000E+00         3.50033E-09         1.64502E+00         3.89458E-01         1.25556E+00
+          2.29502E-02         2.60071E-02        -3.74134E-02         1.44152E+00         1.85340E+00         1.44200E+00         1.59799E+00         1.00000E+00         3.73800E-09         1.59799E+00         3.73836E-01         1.22415E+00
+          2.29502E-02         2.61769E-02        -3.76918E-02         1.44151E+00         1.86407E+00         1.44200E+00         1.55206E+00         1.00000E+00         3.97967E-09         1.55206E+00         3.58472E-01         1.19359E+00
+          2.31201E-02         8.72665E-04        -1.64363E-02         1.45268E+00         2.74155E-01         1.45277E+00         6.96121E+01         1.00000E+00         3.24233E-11         6.96121E+01         3.67219E+00         6.59399E+01
+          2.31201E-02         1.04249E-03        -1.64466E-02         1.45268E+00         2.84826E-01         1.45277E+00         6.83733E+01         1.00000E+00         3.24498E-11         6.83733E+01         3.62101E+00         6.47523E+01
+          2.31201E-02         1.21232E-03        -1.64586E-02         1.45267E+00         2.95496E-01         1.45277E+00         6.71087E+01         1.00000E+00         3.24624E-11         6.71087E+01         3.56849E+00         6.35402E+01
+          2.31201E-02         1.38215E-03        -1.64724E-02         1.45267E+00         3.06167E-01         1.45277E+00         6.58203E+01         1.00000E+00         3.24573E-11         6.58203E+01         3.51471E+00         6.23056E+01
+          2.31201E-02         1.55197E-03        -1.64881E-02         1.45267E+00         3.16838E-01         1.45277E+00         6.45102E+01         1.00000E+00         3.24303E-11         6.45102E+01         3.45972E+00         6.10505E+01
+          2.31201E-02         1.72180E-03        -1.65055E-02         1.45267E+00         3.27508E-01         1.45277E+00         6.31805E+01         1.00000E+00         3.23773E-11         6.31805E+01         3.40360E+00         5.97769E+01
+          2.31201E-02         1.89163E-03        -1.65248E-02         1.45267E+00         3.38179E-01         1.45277E+00         6.18333E+01         1.00000E+00         3.22943E-11         6.18333E+01         3.34642E+00         5.84868E+01
+          2.31201E-02         2.06146E-03        -1.65459E-02         1.45267E+00         3.48849E-01         1.45277E+00         6.04706E+01         1.00000E+00         3.21775E-11         6.04706E+01         3.28825E+00         5.71823E+01
+          2.31201E-02         2.23128E-03        -1.65688E-02         1.45267E+00         3.59520E-01         1.45277E+00         5.90945E+01         1.00000E+00         3.20235E-11         5.90945E+01         3.22917E+00         5.58653E+01
+          2.31201E-02         2.40111E-03        -1.65935E-02         1.45267E+00         3.70190E-01         1.45277E+00         5.77072E+01         1.00000E+00         3.18290E-11         5.77072E+01         3.16925E+00         5.45379E+01
+          2.31201E-02         2.57094E-03        -1.66200E-02         1.45267E+00         3.80861E-01         1.45277E+00         5.63107E+01         1.00000E+00         3.15916E-11         5.63107E+01         3.10857E+00         5.32021E+01
+          2.31201E-02         2.74077E-03        -1.66484E-02         1.45267E+00         3.91532E-01         1.45277E+00         5.49070E+01         1.00000E+00         3.13093E-11         5.49070E+01         3.04721E+00         5.18598E+01
+          2.31201E-02         2.91059E-03        -1.66785E-02         1.45267E+00         4.02202E-01         1.45277E+00         5.34982E+01         1.00000E+00         3.09813E-11         5.34982E+01         2.98525E+00         5.05129E+01
+          2.31201E-02         3.08042E-03        -1.67105E-02         1.45267E+00         4.12873E-01         1.45277E+00         5.20862E+01         1.00000E+00         3.06077E-11         5.20862E+01         2.92276E+00         4.91635E+01
+          2.31201E-02         3.25025E-03        -1.67442E-02         1.45267E+00         4.23543E-01         1.45276E+00         5.06731E+01         1.00000E+00         3.01901E-11         5.06731E+01         2.85982E+00         4.78133E+01
+          2.31201E-02         3.42008E-03        -1.67798E-02         1.45267E+00         4.34214E-01         1.45276E+00         4.92608E+01         1.00000E+00         2.97318E-11         4.92608E+01         2.79653E+00         4.64643E+01
+          2.31201E-02         3.58990E-03        -1.68172E-02         1.45267E+00         4.44884E-01         1.45276E+00         4.78512E+01         1.00000E+00         2.92382E-11         4.78512E+01         2.73296E+00         4.51182E+01
+          2.31201E-02         3.75973E-03        -1.68564E-02         1.45267E+00         4.55555E-01         1.45276E+00         4.64460E+01         1.00000E+00         2.87171E-11         4.64460E+01         2.66918E+00         4.37769E+01
+          2.31201E-02         3.92956E-03        -1.68974E-02         1.45266E+00         4.66225E-01         1.45276E+00         4.50472E+01         1.00000E+00         2.81795E-11         4.50472E+01         2.60530E+00         4.24419E+01
+          2.31201E-02         4.09939E-03        -1.69402E-02         1.45266E+00         4.76896E-01         1.45276E+00         4.36565E+01         1.00000E+00         2.76400E-11         4.36565E+01         2.54137E+00         4.11151E+01
+          2.31201E-02         4.26921E-03        -1.69849E-02         1.45266E+00         4.87567E-01         1.45276E+00         4.22756E+01         1.00000E+00         2.71171E-11         4.22756E+01         2.47750E+00         3.97981E+01
+          2.31201E-02         4.43904E-03        -1.70313E-02         1.45266E+00         4.98237E-01         1.45276E+00         4.09061E+01         1.00000E+00         2.66343E-11         4.09061E+01         2.41376E+00         3.84923E+01
+          2.31201E-02         4.60887E-03        -1.70796E-02         1.45266E+00         5.08908E-01         1.45276E+00         3.95496E+01         1.00000E+00         2.62199E-11         3.95496E+01         2.35023E+00         3.71993E+01
+          2.31201E-02         4.77869E-03        -1.71296E-02         1.45266E+00         5.19578E-01         1.45276E+00         3.82076E+01         1.00000E+00         2.59073E-11         3.82076E+01         2.28699E+00         3.59206E+01
+          2.31201E-02         4.94852E-03        -1.71815E-02         1.45266E+00         5.30249E-01         1.45276E+00         3.68816E+01         1.00000E+00         2.57339E-11         3.68816E+01         2.22412E+00         3.46575E+01
+          2.31201E-02         5.11835E-03        -1.72352E-02         1.45266E+00         5.40919E-01         1.45276E+00         3.55731E+01         1.00000E+00         2.57402E-11         3.55731E+01         2.16171E+00         3.34113E+01
+          2.31201E-02         5.28818E-03        -1.72907E-02         1.45266E+00         5.51590E-01         1.45276E+00         3.42832E+01         1.00000E+00         2.59668E-11         3.42832E+01         2.09982E+00         3.21834E+01
+          2.31201E-02         5.45800E-03        -1.73481E-02         1.45265E+00         5.62261E-01         1.45276E+00         3.30133E+01         1.00000E+00         2.64514E-11         3.30133E+01         2.03854E+00         3.09748E+01
+          2.31201E-02         5.62783E-03        -1.74072E-02         1.45265E+00         5.72931E-01         1.45276E+00         3.17646E+01         1.00000E+00         2.72255E-11         3.17646E+01         1.97795E+00         2.97866E+01
+          2.31201E-02         5.79766E-03        -1.74681E-02         1.45265E+00         5.83602E-01         1.45276E+00         3.05381E+01         1.00000E+00         2.83116E-11         3.05381E+01         1.91810E+00         2.86200E+01
+          2.31201E-02         5.96749E-03        -1.75309E-02         1.45265E+00         5.94272E-01         1.45276E+00         2.93350E+01         1.00000E+00         2.97220E-11         2.93350E+01         1.85909E+00         2.74759E+01
+          2.31201E-02         6.13731E-03        -1.75955E-02         1.45265E+00         6.04943E-01         1.45276E+00         2.81561E+01         1.00000E+00         3.14587E-11         2.81561E+01         1.80097E+00         2.63551E+01
+          2.31201E-02         6.30714E-03        -1.76618E-02         1.45265E+00         6.15613E-01         1.45275E+00         2.70024E+01         1.00000E+00         3.35153E-11         2.70024E+01         1.74382E+00         2.52586E+01
+          2.31201E-02         6.47697E-03        -1.77300E-02         1.45265E+00         6.26284E-01         1.45275E+00         2.58747E+01         1.00000E+00         3.58789E-11         2.58747E+01         1.68770E+00         2.41870E+01
+          2.31201E-02         6.64680E-03        -1.78000E-02         1.45264E+00         6.36955E-01         1.45275E+00         2.47737E+01         1.00000E+00         3.85323E-11         2.47737E+01         1.63267E+00         2.31410E+01
+          2.31201E-02         6.81662E-03        -1.78718E-02         1.45264E+00         6.47625E-01         1.45275E+00         2.37001E+01         1.00000E+00         4.14563E-11         2.37001E+01         1.57881E+00         2.21213E+01
+          2.31201E-02         6.98645E-03        -1.79455E-02         1.45264E+00         6.58296E-01         1.45275E+00         2.26545E+01         1.00000E+00         4.46307E-11         2.26545E+01         1.52615E+00         2.11284E+01
+          2.31201E-02         7.15628E-03        -1.80209E-02         1.45264E+00         6.68966E-01         1.45275E+00         2.16375E+01         1.00000E+00         4.80350E-11         2.16375E+01         1.47477E+00         2.01627E+01
+          2.31201E-02         7.32611E-03        -1.80981E-02         1.45264E+00         6.79637E-01         1.45275E+00         2.06493E+01         1.00000E+00         5.16491E-11         2.06493E+01         1.42471E+00         1.92246E+01
+          2.31201E-02         7.49593E-03        -1.81772E-02         1.45264E+00         6.90307E-01         1.45275E+00         1.96906E+01         1.00000E+00         5.54535E-11         1.96906E+01         1.37602E+00         1.83145E+01
+          2.31201E-02         7.66576E-03        -1.82581E-02         1.45263E+00         7.00978E-01         1.45275E+00         1.87614E+01         1.00000E+00         5.94287E-11         1.87614E+01         1.32876E+00         1.74327E+01
+          2.31201E-02         7.83559E-03        -1.83408E-02         1.45263E+00         7.11649E-01         1.45275E+00         1.78622E+01         1.00000E+00         6.35557E-11         1.78622E+01         1.28295E+00         1.65792E+01
+          2.31201E-02         8.00542E-03        -1.84253E-02         1.45263E+00         7.22319E-01         1.45275E+00         1.69930E+01         1.00000E+00         6.78155E-11         1.69930E+01         1.23865E+00         1.57543E+01
+          2.31201E-02         8.17524E-03        -1.85116E-02         1.45263E+00         7.32990E-01         1.45275E+00         1.61539E+01         1.00000E+00         7.21890E-11         1.61539E+01         1.19589E+00         1.49580E+01
+          2.31201E-02         8.34507E-03        -1.85997E-02         1.45263E+00         7.43660E-01         1.45274E+00         1.53450E+01         1.00000E+00         7.66568E-11         1.53450E+01         1.15471E+00         1.41903E+01
+          2.31201E-02         8.51490E-03        -1.86896E-02         1.45262E+00         7.54331E-01         1.45274E+00         1.45663E+01         1.00000E+00         8.11991E-11         1.45663E+01         1.11512E+00         1.34512E+01
+          2.31201E-02         8.68473E-03        -1.87814E-02         1.45262E+00         7.65001E-01         1.45274E+00         1.38177E+01         1.00000E+00         8.57956E-11         1.38177E+01         1.07717E+00         1.27405E+01
+          2.31201E-02         8.85455E-03        -1.88749E-02         1.45262E+00         7.75672E-01         1.45274E+00         1.30990E+01         1.00000E+00         9.04255E-11         1.30990E+01         1.04087E+00         1.20581E+01
+          2.31201E-02         9.02438E-03        -1.89703E-02         1.45262E+00         7.86343E-01         1.45274E+00         1.24100E+01         1.00000E+00         9.50670E-11         1.24100E+01         1.00623E+00         1.14037E+01
+          2.31201E-02         9.19421E-03        -1.90675E-02         1.45261E+00         7.97013E-01         1.45274E+00         1.17505E+01         1.00000E+00         9.96980E-11         1.17505E+01         9.73279E-01         1.07772E+01
+          2.31201E-02         9.36403E-03        -1.91665E-02         1.45261E+00         8.07684E-01         1.45274E+00         1.11201E+01         1.00000E+00         1.04295E-10         1.11201E+01         9.42022E-01         1.01781E+01
+          2.31201E-02         9.53386E-03        -1.92673E-02         1.45261E+00         8.18354E-01         1.45274E+00         1.05186E+01         1.00000E+00         1.08835E-10         1.05186E+01         9.12467E-01         9.60611E+00
+          2.31201E-02         9.70369E-03        -1.93699E-02         1.45261E+00         8.29025E-01         1.45274E+00         9.94545E+00         1.00000E+00         1.13294E-10         9.94545E+00         8.84615E-01         9.06084E+00
+          2.31201E-02         9.87352E-03        -1.94743E-02         1.45261E+00         8.39695E-01         1.45274E+00         9.40030E+00         1.00000E+00         1.17646E-10         9.40030E+00         8.58467E-01         8.54183E+00
+          2.31201E-02         1.00433E-02        -1.95805E-02         1.45260E+00         8.50366E-01         1.45273E+00         8.88262E+00         1.00000E+00         1.21866E-10         8.88262E+00         8.34018E-01         8.04860E+00
+          2.31201E-02         1.02132E-02        -1.96886E-02         1.45260E+00         8.61037E-01         1.45273E+00         8.39190E+00         1.00000E+00         1.25929E-10         8.39190E+00         8.11259E-01         7.58064E+00
+          2.31201E-02         1.03830E-02        -1.97985E-02         1.45260E+00         8.71707E-01         1.45273E+00         7.92758E+00         1.00000E+00         1.29810E-10         7.92758E+00         7.90177E-01         7.13740E+00
+          2.31201E-02         1.05528E-02        -1.99101E-02         1.45260E+00         8.82378E-01         1.45273E+00         7.48906E+00         1.00000E+00         1.33482E-10         7.48906E+00         7.70758E-01         6.71830E+00
+          2.31201E-02         1.07227E-02        -2.00236E-02         1.45259E+00         8.93048E-01         1.45273E+00         7.07571E+00         1.00000E+00         1.36921E-10         7.07571E+00         7.52980E-01         6.32273E+00
+          2.31201E-02         1.08925E-02        -2.01389E-02         1.45259E+00         9.03719E-01         1.45273E+00         6.68689E+00         1.00000E+00         1.40104E-10         6.68689E+00         7.36822E-01         5.95007E+00
+          2.31201E-02         1.10623E-02        -2.02560E-02         1.45259E+00         9.14389E-01         1.45273E+00         6.32193E+00         1.00000E+00         1.43009E-10         6.32193E+00         7.22255E-01         5.59967E+00
+          2.31201E-02         1.12321E-02        -2.03750E-02         1.45258E+00         9.25060E-01         1.45273E+00         5.98011E+00         1.00000E+00         1.45614E-10         5.98011E+00         7.09250E-01         5.27086E+00
+          2.31201E-02         1.14020E-02        -2.04957E-02         1.45258E+00         9.35731E-01         1.45273E+00         5.66073E+00         1.00000E+00         1.47902E-10         5.66073E+00         6.97773E-01         4.96296E+00
+          2.31201E-02         1.15718E-02        -2.06182E-02         1.45258E+00         9.46401E-01         1.45272E+00         5.36305E+00         1.00000E+00         1.49859E-10         5.36305E+00         6.87788E-01         4.67527E+00
+          2.31201E-02         1.17416E-02        -2.07426E-02         1.45258E+00         9.57072E-01         1.45272E+00         5.08632E+00         1.00000E+00         1.51476E-10         5.08632E+00         6.79254E-01         4.40707E+00
+          2.31201E-02         1.19114E-02        -2.08688E-02         1.45257E+00         9.67742E-01         1.45272E+00         4.82978E+00         1.00000E+00         1.52749E-10         4.82978E+00         6.72129E-01         4.15766E+00
+          2.31201E-02         1.20813E-02        -2.09967E-02         1.45257E+00         9.78413E-01         1.45272E+00         4.59266E+00         1.00000E+00         1.53681E-10         4.59266E+00         6.66367E-01         3.92630E+00
+          2.31201E-02         1.22511E-02        -2.11265E-02         1.45257E+00         9.89083E-01         1.45272E+00         4.37418E+00         1.00000E+00         1.54286E-10         4.37418E+00         6.61919E-01         3.71226E+00
+          2.31201E-02         1.24209E-02        -2.12581E-02         1.45256E+00         9.99754E-01         1.45272E+00         4.17356E+00         1.00000E+00         1.54587E-10         4.17356E+00         6.58736E-01         3.51482E+00
+          2.31201E-02         1.25908E-02        -2.13916E-02         1.45256E+00         1.01042E+00         1.45272E+00         3.99001E+00         1.00000E+00         1.54621E-10         3.99001E+00         6.56763E-01         3.33325E+00
+          2.31201E-02         1.27606E-02        -2.15268E-02         1.45256E+00         1.02110E+00         1.45272E+00         3.82275E+00         1.00000E+00         1.54441E-10         3.82275E+00         6.55946E-01         3.16680E+00
+          2.31201E-02         1.29304E-02        -2.16638E-02         1.45255E+00         1.03177E+00         1.45272E+00         3.67099E+00         1.00000E+00         1.54119E-10         3.67099E+00         6.56226E-01         3.01476E+00
+          2.31201E-02         1.31002E-02        -2.18027E-02         1.45255E+00         1.04244E+00         1.45271E+00         3.53395E+00         1.00000E+00         1.53751E-10         3.53395E+00         6.57545E-01         2.87640E+00
+          2.31201E-02         1.32701E-02        -2.19434E-02         1.45255E+00         1.05311E+00         1.45271E+00         3.41086E+00         1.00000E+00         1.53456E-10         3.41086E+00         6.59843E-01         2.75102E+00
+          2.31201E-02         1.34399E-02        -2.20858E-02         1.45254E+00         1.06378E+00         1.45271E+00         3.30095E+00         1.00000E+00         1.53380E-10         3.30095E+00         6.63056E-01         2.63789E+00
+          2.31201E-02         1.36097E-02        -2.22301E-02         1.45254E+00         1.07445E+00         1.45271E+00         3.20346E+00         1.00000E+00         1.53698E-10         3.20346E+00         6.67121E-01         2.53634E+00
+          2.31201E-02         1.37795E-02        -2.23762E-02         1.45254E+00         1.08512E+00         1.45271E+00         3.11765E+00         1.00000E+00         1.54608E-10         3.11765E+00         6.71974E-01         2.44567E+00
+          2.31201E-02         1.39494E-02        -2.25242E-02         1.45253E+00         1.09579E+00         1.45271E+00         3.04277E+00         1.00000E+00         1.56330E-10         3.04277E+00         6.77549E-01         2.36522E+00
+          2.31201E-02         1.41192E-02        -2.26739E-02         1.45253E+00         1.10646E+00         1.45271E+00         2.97810E+00         1.00000E+00         1.59092E-10         2.97810E+00         6.83779E-01         2.29432E+00
+          2.31201E-02         1.42890E-02        -2.28254E-02         1.45253E+00         1.11713E+00         1.45271E+00         2.92294E+00         1.00000E+00         1.63118E-10         2.92294E+00         6.90599E-01         2.23234E+00
+          2.31201E-02         1.44589E-02        -2.29788E-02         1.45252E+00         1.12780E+00         1.45271E+00         2.87659E+00         1.00000E+00         1.68614E-10         2.87659E+00         6.97942E-01         2.17865E+00
+          2.31201E-02         1.46287E-02        -2.31339E-02         1.45252E+00         1.13847E+00         1.45270E+00         2.83838E+00         1.00000E+00         1.75753E-10         2.83838E+00         7.05740E-01         2.13264E+00
+          2.31201E-02         1.47985E-02        -2.32909E-02         1.45252E+00         1.14914E+00         1.45270E+00         2.80765E+00         1.00000E+00         1.84661E-10         2.80765E+00         7.13928E-01         2.09372E+00
+          2.31201E-02         1.49683E-02        -2.34497E-02         1.45251E+00         1.15981E+00         1.45270E+00         2.78376E+00         1.00000E+00         1.95414E-10         2.78376E+00         7.22438E-01         2.06132E+00
+          2.31201E-02         1.51382E-02        -2.36103E-02         1.45251E+00         1.17048E+00         1.45270E+00         2.76609E+00         1.00000E+00         2.08043E-10         2.76609E+00         7.31204E-01         2.03488E+00
+          2.31201E-02         1.53080E-02        -2.37727E-02         1.45251E+00         1.18115E+00         1.45270E+00         2.75404E+00         1.00000E+00         2.22532E-10         2.75404E+00         7.40162E-01         2.01388E+00
+          2.31201E-02         1.54778E-02        -2.39370E-02         1.45250E+00         1.19182E+00         1.45270E+00         2.74705E+00         1.00000E+00         2.38836E-10         2.74705E+00         7.49248E-01         1.99780E+00
+          2.31201E-02         1.56476E-02        -2.41030E-02         1.45250E+00         1.20249E+00         1.45270E+00         2.74454E+00         1.00000E+00         2.56881E-10         2.74454E+00         7.58398E-01         1.98614E+00
+          2.31201E-02         1.58175E-02        -2.42708E-02         1.45249E+00         1.21317E+00         1.45270E+00         2.74599E+00         1.00000E+00         2.76580E-10         2.74599E+00         7.67550E-01         1.97844E+00
+          2.31201E-02         1.59873E-02        -2.44405E-02         1.45249E+00         1.22384E+00         1.45270E+00         2.75089E+00         1.00000E+00         2.97832E-10         2.75089E+00         7.76644E-01         1.97424E+00
+          2.31201E-02         1.61571E-02        -2.46120E-02         1.45249E+00         1.23451E+00         1.45269E+00         2.75874E+00         1.00000E+00         3.20530E-10         2.75874E+00         7.85622E-01         1.97312E+00
+          2.31201E-02         1.63270E-02        -2.47853E-02         1.45248E+00         1.24518E+00         1.45269E+00         2.76908E+00         1.00000E+00         3.44561E-10         2.76908E+00         7.94425E-01         1.97465E+00
+          2.31201E-02         1.64968E-02        -2.49604E-02         1.45248E+00         1.25585E+00         1.45269E+00         2.78146E+00         1.00000E+00         3.69810E-10         2.78146E+00         8.03000E-01         1.97846E+00
+          2.31201E-02         1.66666E-02        -2.51373E-02         1.45247E+00         1.26652E+00         1.45269E+00         2.79547E+00         1.00000E+00         3.96155E-10         2.79547E+00         8.11293E-01         1.98418E+00
+          2.31201E-02         1.68364E-02        -2.53160E-02         1.45247E+00         1.27719E+00         1.45269E+00         2.81071E+00         1.00000E+00         4.23475E-10         2.81071E+00         8.19254E-01         1.99145E+00
+          2.31201E-02         1.70063E-02        -2.54966E-02         1.45247E+00         1.28786E+00         1.45269E+00         2.82679E+00         1.00000E+00         4.51642E-10         2.82679E+00         8.26833E-01         1.99996E+00
+          2.31201E-02         1.71761E-02        -2.56789E-02         1.45246E+00         1.29853E+00         1.45269E+00         2.84338E+00         1.00000E+00         4.80524E-10         2.84338E+00         8.33985E-01         2.00939E+00
+          2.31201E-02         1.73459E-02        -2.58631E-02         1.45246E+00         1.30920E+00         1.45269E+00         2.86014E+00         1.00000E+00         5.09987E-10         2.86014E+00         8.40667E-01         2.01947E+00
+          2.31201E-02         1.75158E-02        -2.60490E-02         1.45245E+00         1.31987E+00         1.45269E+00         2.87675E+00         1.00000E+00         5.39889E-10         2.87675E+00         8.46836E-01         2.02992E+00
+          2.31201E-02         1.76856E-02        -2.62368E-02         1.45245E+00         1.33054E+00         1.45269E+00         2.89295E+00         1.00000E+00         5.70084E-10         2.89295E+00         8.52456E-01         2.04049E+00
+          2.31201E-02         1.78554E-02        -2.64264E-02         1.45244E+00         1.34121E+00         1.45268E+00         2.90845E+00         1.00000E+00         6.00421E-10         2.90845E+00         8.57491E-01         2.05096E+00
+          2.31201E-02         1.80252E-02        -2.66178E-02         1.45244E+00         1.35188E+00         1.45268E+00         2.92303E+00         1.00000E+00         6.30745E-10         2.92303E+00         8.61908E-01         2.06112E+00
+          2.31201E-02         1.81951E-02        -2.68111E-02         1.45244E+00         1.36255E+00         1.45268E+00         2.93645E+00         1.00000E+00         6.60894E-10         2.93645E+00         8.65678E-01         2.07077E+00
+          2.31201E-02         1.83649E-02        -2.70061E-02         1.45243E+00         1.37322E+00         1.45268E+00         2.94851E+00         1.00000E+00         6.90703E-10         2.94851E+00         8.68774E-01         2.07974E+00
+          2.31201E-02         1.85347E-02        -2.72030E-02         1.45243E+00         1.38389E+00         1.45268E+00         2.95904E+00         1.00000E+00         7.20005E-10         2.95904E+00         8.71172E-01         2.08786E+00
+          2.31201E-02         1.87045E-02        -2.74016E-02         1.45242E+00         1.39457E+00         1.45268E+00         2.96786E+00         1.00000E+00         7.48627E-10         2.96786E+00         8.72852E-01         2.09500E+00
+          2.31201E-02         1.88744E-02        -2.76021E-02         1.45242E+00         1.40524E+00         1.45268E+00         2.97483E+00         1.00000E+00         7.76397E-10         2.97483E+00         8.73796E-01         2.10104E+00
+          2.31201E-02         1.90442E-02        -2.78044E-02         1.45241E+00         1.41591E+00         1.45268E+00         2.97983E+00         1.00000E+00         8.03141E-10         2.97983E+00         8.73990E-01         2.10584E+00
+          2.31201E-02         1.92140E-02        -2.80085E-02         1.45241E+00         1.42658E+00         1.45268E+00         2.98275E+00         1.00000E+00         8.28689E-10         2.98275E+00         8.73421E-01         2.10933E+00
+          2.31201E-02         1.93839E-02        -2.82144E-02         1.45240E+00         1.43725E+00         1.45268E+00         2.98349E+00         1.00000E+00         8.52871E-10         2.98349E+00         8.72082E-01         2.11141E+00
+          2.31201E-02         1.95537E-02        -2.84221E-02         1.45240E+00         1.44792E+00         1.45268E+00         2.98198E+00         1.00000E+00         8.75526E-10         2.98198E+00         8.69966E-01         2.11202E+00
+          2.31201E-02         1.97235E-02        -2.86317E-02         1.45239E+00         1.45859E+00         1.45268E+00         2.97816E+00         1.00000E+00         8.96500E-10         2.97816E+00         8.67071E-01         2.11109E+00
+          2.31201E-02         1.98933E-02        -2.88430E-02         1.45239E+00         1.46926E+00         1.45267E+00         2.97198E+00         1.00000E+00         9.15650E-10         2.97198E+00         8.63397E-01         2.10859E+00
+          2.31201E-02         2.00632E-02        -2.90562E-02         1.45238E+00         1.47993E+00         1.45267E+00         2.96341E+00         1.00000E+00         9.32850E-10         2.96341E+00         8.58946E-01         2.10447E+00
+          2.31201E-02         2.02330E-02        -2.92712E-02         1.45238E+00         1.49060E+00         1.45267E+00         2.95244E+00         1.00000E+00         9.47994E-10         2.95244E+00         8.53725E-01         2.09871E+00
+          2.31201E-02         2.04028E-02        -2.94880E-02         1.45237E+00         1.50127E+00         1.45267E+00         2.93905E+00         1.00000E+00         9.61001E-10         2.93905E+00         8.47741E-01         2.09131E+00
+          2.31201E-02         2.05726E-02        -2.97066E-02         1.45237E+00         1.51194E+00         1.45267E+00         2.92326E+00         1.00000E+00         9.71822E-10         2.92326E+00         8.41006E-01         2.08225E+00
+          2.31201E-02         2.07425E-02        -2.99270E-02         1.45236E+00         1.52261E+00         1.45267E+00         2.90508E+00         1.00000E+00         9.80446E-10         2.90508E+00         8.33533E-01         2.07155E+00
+          2.31201E-02         2.09123E-02        -3.01492E-02         1.45236E+00         1.53328E+00         1.45267E+00         2.88455E+00         1.00000E+00         9.86910E-10         2.88455E+00         8.25337E-01         2.05921E+00
+          2.31201E-02         2.10821E-02        -3.03732E-02         1.45235E+00         1.54395E+00         1.45267E+00         2.86170E+00         1.00000E+00         9.91310E-10         2.86170E+00         8.16436E-01         2.04527E+00
+          2.31201E-02         2.12520E-02        -3.05991E-02         1.45235E+00         1.55462E+00         1.45267E+00         2.83659E+00         1.00000E+00         9.93806E-10         2.83659E+00         8.06850E-01         2.02974E+00
+          2.31201E-02         2.14218E-02        -3.08268E-02         1.45234E+00         1.56529E+00         1.45267E+00         2.80928E+00         1.00000E+00         9.94644E-10         2.80928E+00         7.96602E-01         2.01268E+00
+          2.31201E-02         2.15916E-02        -3.10562E-02         1.45234E+00         1.57596E+00         1.45267E+00         2.77983E+00         1.00000E+00         9.94162E-10         2.77983E+00         7.85715E-01         1.99411E+00
+          2.31201E-02         2.17614E-02        -3.12875E-02         1.45233E+00         1.58664E+00         1.45267E+00         2.74831E+00         1.00000E+00         9.92809E-10         2.74831E+00         7.74216E-01         1.97410E+00
+          2.31201E-02         2.19313E-02        -3.15206E-02         1.45233E+00         1.59731E+00         1.45267E+00         2.71482E+00         1.00000E+00         9.91157E-10         2.71482E+00         7.62131E-01         1.95269E+00
+          2.31201E-02         2.21011E-02        -3.17556E-02         1.45232E+00         1.60798E+00         1.45267E+00         2.67944E+00         1.00000E+00         9.89914E-10         2.67944E+00         7.49490E-01         1.92995E+00
+          2.31201E-02         2.22709E-02        -3.19923E-02         1.45232E+00         1.61865E+00         1.45267E+00         2.64227E+00         1.00000E+00         9.89929E-10         2.64227E+00         7.36322E-01         1.90594E+00
+          2.31201E-02         2.24407E-02        -3.22308E-02         1.45231E+00         1.62932E+00         1.45267E+00         2.60340E+00         1.00000E+00         9.92191E-10         2.60340E+00         7.22660E-01         1.88074E+00
+          2.31201E-02         2.26106E-02        -3.24712E-02         1.45230E+00         1.63999E+00         1.45267E+00         2.56295E+00         1.00000E+00         9.97808E-10         2.56295E+00         7.08536E-01         1.85441E+00
+          2.31201E-02         2.27804E-02        -3.27134E-02         1.45230E+00         1.65066E+00         1.45267E+00         2.52102E+00         1.00000E+00         1.00798E-09         2.52102E+00         6.93984E-01         1.82704E+00
+          2.31201E-02         2.29502E-02        -3.29574E-02         1.45229E+00         1.66133E+00         1.45267E+00         2.47773E+00         1.00000E+00         1.02395E-09         2.47773E+00         6.79038E-01         1.79869E+00
+          2.31201E-02         2.31201E-02        -3.32032E-02         1.45229E+00         1.67200E+00         1.45267E+00         2.43319E+00         1.00000E+00         1.04690E-09         2.43319E+00         6.63733E-01         1.76946E+00
+          2.31201E-02         2.32899E-02        -3.34508E-02         1.45228E+00         1.68267E+00         1.45267E+00         2.38754E+00         1.00000E+00         1.07794E-09         2.38754E+00         6.48104E-01         1.73943E+00
+          2.31201E-02         2.34597E-02        -3.37002E-02         1.45228E+00         1.69334E+00         1.45267E+00         2.34088E+00         1.00000E+00         1.11795E-09         2.34088E+00         6.32188E-01         1.70869E+00
+          2.31201E-02         2.36295E-02        -3.39514E-02         1.45227E+00         1.70401E+00         1.45267E+00         2.29334E+00         1.00000E+00         1.16760E-09         2.29334E+00         6.16021E-01         1.67732E+00
+          2.31201E-02         2.37994E-02        -3.42045E-02         1.45226E+00         1.71468E+00         1.45267E+00         2.24505E+00         1.00000E+00         1.22727E-09         2.24505E+00         5.99638E-01         1.64541E+00
+          2.31201E-02         2.39692E-02        -3.44593E-02         1.45226E+00         1.72535E+00         1.45267E+00         2.19613E+00         1.00000E+00         1.29708E-09         2.19613E+00         5.83077E-01         1.61306E+00
+          2.31201E-02         2.41390E-02        -3.47160E-02         1.45225E+00         1.73602E+00         1.45267E+00         2.14672E+00         1.00000E+00         1.37691E-09         2.14672E+00         5.66374E-01         1.58035E+00
+          2.31201E-02         2.43088E-02        -3.49745E-02         1.45225E+00         1.74669E+00         1.45267E+00         2.09694E+00         1.00000E+00         1.46642E-09         2.09694E+00         5.49563E-01         1.54737E+00
+          2.31201E-02         2.44787E-02        -3.52348E-02         1.45224E+00         1.75736E+00         1.45267E+00         2.04691E+00         1.00000E+00         1.56515E-09         2.04691E+00         5.32682E-01         1.51423E+00
+          2.31201E-02         2.46485E-02        -3.54969E-02         1.45223E+00         1.76804E+00         1.45267E+00         1.99676E+00         1.00000E+00         1.67250E-09         1.99676E+00         5.15764E-01         1.48100E+00
+          2.31201E-02         2.48183E-02        -3.57609E-02         1.45223E+00         1.77871E+00         1.45267E+00         1.94663E+00         1.00000E+00         1.78782E-09         1.94663E+00         4.98843E-01         1.44778E+00
+          2.31201E-02         2.49882E-02        -3.60266E-02         1.45222E+00         1.78938E+00         1.45267E+00         1.89661E+00         1.00000E+00         1.91038E-09         1.89661E+00         4.81954E-01         1.41466E+00
+          2.31201E-02         2.51580E-02        -3.62942E-02         1.45222E+00         1.80005E+00         1.45267E+00         1.84685E+00         1.00000E+00         2.03944E-09         1.84685E+00         4.65129E-01         1.38173E+00
+          2.31201E-02         2.53278E-02        -3.65635E-02         1.45221E+00         1.81072E+00         1.45267E+00         1.79746E+00         1.00000E+00         2.17424E-09         1.79746E+00         4.48400E-01         1.34906E+00
+          2.31201E-02         2.54976E-02        -3.68347E-02         1.45220E+00         1.82139E+00         1.45267E+00         1.74856E+00         1.00000E+00         2.31398E-09         1.74856E+00         4.31798E-01         1.31676E+00
+          2.31201E-02         2.56675E-02        -3.71077E-02         1.45220E+00         1.83206E+00         1.45267E+00         1.70025E+00         1.00000E+00         2.45787E-09         1.70025E+00         4.15351E-01         1.28490E+00
+          2.31201E-02         2.58373E-02        -3.73825E-02         1.45219E+00         1.84273E+00         1.45267E+00         1.65265E+00         1.00000E+00         2.60510E-09         1.65265E+00         3.99089E-01         1.25356E+00
+          2.31201E-02         2.60071E-02        -3.76591E-02         1.45218E+00         1.85340E+00         1.45267E+00         1.60587E+00         1.00000E+00         2.75483E-09         1.60587E+00         3.83039E-01         1.22283E+00
+          2.31201E-02         2.61769E-02        -3.79376E-02         1.45218E+00         1.86407E+00         1.45267E+00         1.56000E+00         1.00000E+00         2.90624E-09         1.56000E+00         3.67226E-01         1.19278E+00
+          2.32899E-02         8.72665E-04        -1.66840E-02         1.46335E+00         2.74155E-01         1.46344E+00         6.80992E+01         1.00000E+00         1.61148E-11         6.80992E+01         3.77483E+00         6.43244E+01
+          2.32899E-02         1.04249E-03        -1.66942E-02         1.46335E+00         2.84826E-01         1.46344E+00         6.68881E+01         1.00000E+00         1.62711E-11         6.68881E+01         3.72263E+00         6.31655E+01
+          2.32899E-02         1.21232E-03        -1.67063E-02         1.46335E+00         2.95496E-01         1.46344E+00         6.56518E+01         1.00000E+00         1.64212E-11         6.56518E+01         3.66903E+00         6.19828E+01
+          2.32899E-02         1.38215E-03        -1.67201E-02         1.46335E+00         3.06167E-01         1.46344E+00         6.43922E+01         1.00000E+00         1.65636E-11         6.43922E+01         3.61410E+00         6.07781E+01
+          2.32899E-02         1.55197E-03        -1.67358E-02         1.46334E+00         3.16838E-01         1.46344E+00         6.31114E+01         1.00000E+00         1.66969E-11         6.31114E+01         3.55789E+00         5.95535E+01
+          2.32899E-02         1.72180E-03        -1.67532E-02         1.46334E+00         3.27508E-01         1.46344E+00         6.18114E+01         1.00000E+00         1.68197E-11         6.18114E+01         3.50049E+00         5.83109E+01
+          2.32899E-02         1.89163E-03        -1.67725E-02         1.46334E+00         3.38179E-01         1.46344E+00         6.04942E+01         1.00000E+00         1.69307E-11         6.04942E+01         3.44196E+00         5.70523E+01
+          2.32899E-02         2.06146E-03        -1.67936E-02         1.46334E+00         3.48849E-01         1.46344E+00         5.91620E+01         1.00000E+00         1.70289E-11         5.91620E+01         3.38238E+00         5.57796E+01
+          2.32899E-02         2.23128E-03        -1.68165E-02         1.46334E+00         3.59520E-01         1.46344E+00         5.78166E+01         1.00000E+00         1.71134E-11         5.78166E+01         3.32180E+00         5.44948E+01
+          2.32899E-02         2.40111E-03        -1.68412E-02         1.46334E+00         3.70190E-01         1.46344E+00         5.64603E+01         1.00000E+00         1.71836E-11         5.64603E+01         3.26032E+00         5.32000E+01
+          2.32899E-02         2.57094E-03        -1.68677E-02         1.46334E+00         3.80861E-01         1.46344E+00         5.50949E+01         1.00000E+00         1.72392E-11         5.50949E+01         3.19801E+00         5.18969E+01
+          2.32899E-02         2.74077E-03        -1.68960E-02         1.46334E+00         3.91532E-01         1.46344E+00         5.37226E+01         1.00000E+00         1.72803E-11         5.37226E+01         3.13494E+00         5.05877E+01
+          2.32899E-02         2.91059E-03        -1.69262E-02         1.46334E+00         4.02202E-01         1.46344E+00         5.23452E+01         1.00000E+00         1.73076E-11         5.23452E+01         3.07120E+00         4.92740E+01
+          2.32899E-02         3.08042E-03        -1.69581E-02         1.46334E+00         4.12873E-01         1.46344E+00         5.09648E+01         1.00000E+00         1.73222E-11         5.09648E+01         3.00685E+00         4.79579E+01
+          2.32899E-02         3.25025E-03        -1.69919E-02         1.46334E+00         4.23543E-01         1.46344E+00         4.95832E+01         1.00000E+00         1.73257E-11         4.95832E+01         2.94199E+00         4.66412E+01
+          2.32899E-02         3.42008E-03        -1.70275E-02         1.46334E+00         4.34214E-01         1.46344E+00         4.82024E+01         1.00000E+00         1.73207E-11         4.82024E+01         2.87670E+00         4.53257E+01
+          2.32899E-02         3.58990E-03        -1.70649E-02         1.46334E+00         4.44884E-01         1.46344E+00         4.68241E+01         1.00000E+00         1.73106E-11         4.68241E+01         2.81106E+00         4.40131E+01
+          2.32899E-02         3.75973E-03        -1.71041E-02         1.46334E+00         4.55555E-01         1.46344E+00         4.54503E+01         1.00000E+00         1.72996E-11         4.54503E+01         2.74514E+00         4.27052E+01
+          2.32899E-02         3.92956E-03        -1.71451E-02         1.46334E+00         4.66225E-01         1.46344E+00         4.40826E+01         1.00000E+00         1.72931E-11         4.40826E+01         2.67904E+00         4.14036E+01
+          2.32899E-02         4.09939E-03        -1.71879E-02         1.46333E+00         4.76896E-01         1.46344E+00         4.27229E+01         1.00000E+00         1.72975E-11         4.27229E+01         2.61284E+00         4.01100E+01
+          2.32899E-02         4.26921E-03        -1.72325E-02         1.46333E+00         4.87567E-01         1.46343E+00         4.13726E+01         1.00000E+00         1.73205E-11         4.13726E+01         2.54662E+00         3.88260E+01
+          2.32899E-02         4.43904E-03        -1.72790E-02         1.46333E+00         4.98237E-01         1.46343E+00         4.00335E+01         1.00000E+00         1.73709E-11         4.00335E+01         2.48046E+00         3.75531E+01
+          2.32899E-02         4.60887E-03        -1.73273E-02         1.46333E+00         5.08908E-01         1.46343E+00         3.87072E+01         1.00000E+00         1.74588E-11         3.87072E+01         2.41445E+00         3.62927E+01
+          2.32899E-02         4.77869E-03        -1.73773E-02         1.46333E+00         5.19578E-01         1.46343E+00         3.73950E+01         1.00000E+00         1.75951E-11         3.73950E+01         2.34867E+00         3.50463E+01
+          2.32899E-02         4.94852E-03        -1.74292E-02         1.46333E+00         5.30249E-01         1.46343E+00         3.60984E+01         1.00000E+00         1.77916E-11         3.60984E+01         2.28320E+00         3.38152E+01
+          2.32899E-02         5.11835E-03        -1.74829E-02         1.46333E+00         5.40919E-01         1.46343E+00         3.48188E+01         1.00000E+00         1.80604E-11         3.48188E+01         2.21813E+00         3.26007E+01
+          2.32899E-02         5.28818E-03        -1.75384E-02         1.46333E+00         5.51590E-01         1.46343E+00         3.35575E+01         1.00000E+00         1.84135E-11         3.35575E+01         2.15354E+00         3.14039E+01
+          2.32899E-02         5.45800E-03        -1.75957E-02         1.46332E+00         5.62261E-01         1.46343E+00         3.23156E+01         1.00000E+00         1.88624E-11         3.23156E+01         2.08949E+00         3.02261E+01
+          2.32899E-02         5.62783E-03        -1.76549E-02         1.46332E+00         5.72931E-01         1.46343E+00         3.10945E+01         1.00000E+00         1.94175E-11         3.10945E+01         2.02609E+00         2.90684E+01
+          2.32899E-02         5.79766E-03        -1.77158E-02         1.46332E+00         5.83602E-01         1.46343E+00         2.98950E+01         1.00000E+00         2.00876E-11         2.98950E+01         1.96339E+00         2.79316E+01
+          2.32899E-02         5.96749E-03        -1.77786E-02         1.46332E+00         5.94272E-01         1.46343E+00         2.87184E+01         1.00000E+00         2.08798E-11         2.87184E+01         1.90149E+00         2.68169E+01
+          2.32899E-02         6.13731E-03        -1.78431E-02         1.46332E+00         6.04943E-01         1.46343E+00         2.75654E+01         1.00000E+00         2.17990E-11         2.75654E+01         1.84044E+00         2.57250E+01
+          2.32899E-02         6.30714E-03        -1.79095E-02         1.46332E+00         6.15613E-01         1.46343E+00         2.64370E+01         1.00000E+00         2.28478E-11         2.64370E+01         1.78033E+00         2.46567E+01
+          2.32899E-02         6.47697E-03        -1.79777E-02         1.46332E+00         6.26284E-01         1.46343E+00         2.53340E+01         1.00000E+00         2.40272E-11         2.53340E+01         1.72122E+00         2.36128E+01
+          2.32899E-02         6.64680E-03        -1.80477E-02         1.46331E+00         6.36955E-01         1.46343E+00         2.42571E+01         1.00000E+00         2.53360E-11         2.42571E+01         1.66318E+00         2.25939E+01
+          2.32899E-02         6.81662E-03        -1.81195E-02         1.46331E+00         6.47625E-01         1.46342E+00         2.32069E+01         1.00000E+00         2.67718E-11         2.32069E+01         1.60628E+00         2.16006E+01
+          2.32899E-02         6.98645E-03        -1.81931E-02         1.46331E+00         6.58296E-01         1.46342E+00         2.21840E+01         1.00000E+00         2.83307E-11         2.21840E+01         1.55059E+00         2.06335E+01
+          2.32899E-02         7.15628E-03        -1.82686E-02         1.46331E+00         6.68966E-01         1.46342E+00         2.11890E+01         1.00000E+00         3.00079E-11         2.11890E+01         1.49615E+00         1.96929E+01
+          2.32899E-02         7.32611E-03        -1.83458E-02         1.46331E+00         6.79637E-01         1.46342E+00         2.02223E+01         1.00000E+00         3.17977E-11         2.02223E+01         1.44303E+00         1.87793E+01
+          2.32899E-02         7.49593E-03        -1.84249E-02         1.46331E+00         6.90307E-01         1.46342E+00         1.92842E+01         1.00000E+00         3.36937E-11         1.92842E+01         1.39129E+00         1.78929E+01
+          2.32899E-02         7.66576E-03        -1.85058E-02         1.46330E+00         7.00978E-01         1.46342E+00         1.83750E+01         1.00000E+00         3.56893E-11         1.83750E+01         1.34097E+00         1.70341E+01
+          2.32899E-02         7.83559E-03        -1.85884E-02         1.46330E+00         7.11649E-01         1.46342E+00         1.74951E+01         1.00000E+00         3.77771E-11         1.74951E+01         1.29213E+00         1.62029E+01
+          2.32899E-02         8.00542E-03        -1.86729E-02         1.46330E+00         7.22319E-01         1.46342E+00         1.66444E+01         1.00000E+00         3.99494E-11         1.66444E+01         1.24481E+00         1.53996E+01
+          2.32899E-02         8.17524E-03        -1.87592E-02         1.46330E+00         7.32990E-01         1.46342E+00         1.58232E+01         1.00000E+00         4.21983E-11         1.58232E+01         1.19905E+00         1.46241E+01
+          2.32899E-02         8.34507E-03        -1.88474E-02         1.46330E+00         7.43660E-01         1.46342E+00         1.50314E+01         1.00000E+00         4.45155E-11         1.50314E+01         1.15489E+00         1.38765E+01
+          2.32899E-02         8.51490E-03        -1.89373E-02         1.46329E+00         7.54331E-01         1.46342E+00         1.42691E+01         1.00000E+00         4.68922E-11         1.42691E+01         1.11237E+00         1.31567E+01
+          2.32899E-02         8.68473E-03        -1.90290E-02         1.46329E+00         7.65001E-01         1.46342E+00         1.35361E+01         1.00000E+00         4.93197E-11         1.35361E+01         1.07151E+00         1.24646E+01
+          2.32899E-02         8.85455E-03        -1.91226E-02         1.46329E+00         7.75672E-01         1.46341E+00         1.28324E+01         1.00000E+00         5.17886E-11         1.28324E+01         1.03234E+00         1.18000E+01
+          2.32899E-02         9.02438E-03        -1.92180E-02         1.46329E+00         7.86343E-01         1.46341E+00         1.21577E+01         1.00000E+00         5.42894E-11         1.21577E+01         9.94898E-01         1.11628E+01
+          2.32899E-02         9.19421E-03        -1.93151E-02         1.46328E+00         7.97013E-01         1.46341E+00         1.15117E+01         1.00000E+00         5.68126E-11         1.15117E+01         9.59189E-01         1.05525E+01
+          2.32899E-02         9.36403E-03        -1.94141E-02         1.46328E+00         8.07684E-01         1.46341E+00         1.08942E+01         1.00000E+00         5.93480E-11         1.08942E+01         9.25232E-01         9.96900E+00
+          2.32899E-02         9.53386E-03        -1.95149E-02         1.46328E+00         8.18354E-01         1.46341E+00         1.03049E+01         1.00000E+00         6.18857E-11         1.03049E+01         8.93040E-01         9.41185E+00
+          2.32899E-02         9.70369E-03        -1.96175E-02         1.46328E+00         8.29025E-01         1.46341E+00         9.74329E+00         1.00000E+00         6.44155E-11         9.74329E+00         8.62620E-01         8.88067E+00
+          2.32899E-02         9.87352E-03        -1.97220E-02         1.46328E+00         8.39695E-01         1.46341E+00         9.20899E+00         1.00000E+00         6.69272E-11         9.20899E+00         8.33977E-01         8.37501E+00
+          2.32899E-02         1.00433E-02        -1.98282E-02         1.46327E+00         8.50366E-01         1.46341E+00         8.70152E+00         1.00000E+00         6.94109E-11         8.70152E+00         8.07109E-01         7.89441E+00
+          2.32899E-02         1.02132E-02        -1.99363E-02         1.46327E+00         8.61037E-01         1.46341E+00         8.22037E+00         1.00000E+00         7.18567E-11         8.22037E+00         7.82013E-01         7.43836E+00
+          2.32899E-02         1.03830E-02        -2.00461E-02         1.46327E+00         8.71707E-01         1.46340E+00         7.76500E+00         1.00000E+00         7.42551E-11         7.76500E+00         7.58680E-01         7.00631E+00
+          2.32899E-02         1.05528E-02        -2.01578E-02         1.46326E+00         8.82378E-01         1.46340E+00         7.33482E+00         1.00000E+00         7.65973E-11         7.33482E+00         7.37099E-01         6.59772E+00
+          2.32899E-02         1.07227E-02        -2.02713E-02         1.46326E+00         8.93048E-01         1.46340E+00         6.92923E+00         1.00000E+00         7.88753E-11         6.92923E+00         7.17254E-01         6.21197E+00
+          2.32899E-02         1.08925E-02        -2.03866E-02         1.46326E+00         9.03719E-01         1.46340E+00         6.54759E+00         1.00000E+00         8.10819E-11         6.54759E+00         6.99124E-01         5.84847E+00
+          2.32899E-02         1.10623E-02        -2.05037E-02         1.46326E+00         9.14389E-01         1.46340E+00         6.18926E+00         1.00000E+00         8.32114E-11         6.18926E+00         6.82686E-01         5.50657E+00
+          2.32899E-02         1.12321E-02        -2.06226E-02         1.46325E+00         9.25060E-01         1.46340E+00         5.85354E+00         1.00000E+00         8.52597E-11         5.85354E+00         6.67913E-01         5.18562E+00
+          2.32899E-02         1.14020E-02        -2.07433E-02         1.46325E+00         9.35731E-01         1.46340E+00         5.53973E+00         1.00000E+00         8.72245E-11         5.53973E+00         6.54774E-01         4.88496E+00
+          2.32899E-02         1.15718E-02        -2.08659E-02         1.46325E+00         9.46401E-01         1.46340E+00         5.24714E+00         1.00000E+00         8.91063E-11         5.24714E+00         6.43235E-01         4.60390E+00
+          2.32899E-02         1.17416E-02        -2.09903E-02         1.46325E+00         9.57072E-01         1.46340E+00         4.97501E+00         1.00000E+00         9.09081E-11         4.97501E+00         6.33258E-01         4.34175E+00
+          2.32899E-02         1.19114E-02        -2.11164E-02         1.46324E+00         9.67742E-01         1.46340E+00         4.72262E+00         1.00000E+00         9.26364E-11         4.72262E+00         6.24803E-01         4.09782E+00
+          2.32899E-02         1.20813E-02        -2.12444E-02         1.46324E+00         9.78413E-01         1.46339E+00         4.48922E+00         1.00000E+00         9.43017E-11         4.48922E+00         6.17824E-01         3.87139E+00
+          2.32899E-02         1.22511E-02        -2.13742E-02         1.46324E+00         9.89083E-01         1.46339E+00         4.27404E+00         1.00000E+00         9.59190E-11         4.27404E+00         6.12276E-01         3.66177E+00
+          2.32899E-02         1.24209E-02        -2.15058E-02         1.46323E+00         9.99754E-01         1.46339E+00         4.07633E+00         1.00000E+00         9.75084E-11         4.07633E+00         6.08108E-01         3.46822E+00
+          2.32899E-02         1.25908E-02        -2.16392E-02         1.46323E+00         1.01042E+00         1.46339E+00         3.89532E+00         1.00000E+00         9.90954E-11         3.89532E+00         6.05268E-01         3.29006E+00
+          2.32899E-02         1.27606E-02        -2.17745E-02         1.46323E+00         1.02110E+00         1.46339E+00         3.73026E+00         1.00000E+00         1.00712E-10         3.73026E+00         6.03701E-01         3.12656E+00
+          2.32899E-02         1.29304E-02        -2.19115E-02         1.46322E+00         1.03177E+00         1.46339E+00         3.58037E+00         1.00000E+00         1.02396E-10         3.58037E+00         6.03350E-01         2.97702E+00
+          2.32899E-02         1.31002E-02        -2.20504E-02         1.46322E+00         1.04244E+00         1.46339E+00         3.44490E+00         1.00000E+00         1.04193E-10         3.44490E+00         6.04156E-01         2.84074E+00
+          2.32899E-02         1.32701E-02        -2.21910E-02         1.46322E+00         1.05311E+00         1.46339E+00         3.32309E+00         1.00000E+00         1.06153E-10         3.32309E+00         6.06056E-01         2.71704E+00
+          2.32899E-02         1.34399E-02        -2.23335E-02         1.46321E+00         1.06378E+00         1.46338E+00         3.21421E+00         1.00000E+00         1.08335E-10         3.21421E+00         6.08989E-01         2.60522E+00
+          2.32899E-02         1.36097E-02        -2.24778E-02         1.46321E+00         1.07445E+00         1.46338E+00         3.11751E+00         1.00000E+00         1.10800E-10         3.11751E+00         6.12889E-01         2.50462E+00
+          2.32899E-02         1.37795E-02        -2.26239E-02         1.46321E+00         1.08512E+00         1.46338E+00         3.03226E+00         1.00000E+00         1.13614E-10         3.03226E+00         6.17690E-01         2.41457E+00
+          2.32899E-02         1.39494E-02        -2.27718E-02         1.46320E+00         1.09579E+00         1.46338E+00         2.95775E+00         1.00000E+00         1.16845E-10         2.95775E+00         6.23325E-01         2.33443E+00
+          2.32899E-02         1.41192E-02        -2.29215E-02         1.46320E+00         1.10646E+00         1.46338E+00         2.89329E+00         1.00000E+00         1.20560E-10         2.89329E+00         6.29727E-01         2.26356E+00
+          2.32899E-02         1.42890E-02        -2.30731E-02         1.46320E+00         1.11713E+00         1.46338E+00         2.83817E+00         1.00000E+00         1.24824E-10         2.83817E+00         6.36825E-01         2.20135E+00
+          2.32899E-02         1.44589E-02        -2.32264E-02         1.46319E+00         1.12780E+00         1.46338E+00         2.79173E+00         1.00000E+00         1.29695E-10         2.79173E+00         6.44552E-01         2.14718E+00
+          2.32899E-02         1.46287E-02        -2.33816E-02         1.46319E+00         1.13847E+00         1.46338E+00         2.75332E+00         1.00000E+00         1.35226E-10         2.75332E+00         6.52837E-01         2.10048E+00
+          2.32899E-02         1.47985E-02        -2.35386E-02         1.46319E+00         1.14914E+00         1.46338E+00         2.72228E+00         1.00000E+00         1.41460E-10         2.72228E+00         6.61610E-01         2.06067E+00
+          2.32899E-02         1.49683E-02        -2.36974E-02         1.46318E+00         1.15981E+00         1.46337E+00         2.69802E+00         1.00000E+00         1.48429E-10         2.69802E+00         6.70802E-01         2.02721E+00
+          2.32899E-02         1.51382E-02        -2.38580E-02         1.46318E+00         1.17048E+00         1.46337E+00         2.67991E+00         1.00000E+00         1.56157E-10         2.67991E+00         6.80344E-01         1.99957E+00
+          2.32899E-02         1.53080E-02        -2.40204E-02         1.46318E+00         1.18115E+00         1.46337E+00         2.66739E+00         1.00000E+00         1.64655E-10         2.66739E+00         6.90166E-01         1.97722E+00
+          2.32899E-02         1.54778E-02        -2.41846E-02         1.46317E+00         1.19182E+00         1.46337E+00         2.65989E+00         1.00000E+00         1.73925E-10         2.65989E+00         7.00201E-01         1.95969E+00
+          2.32899E-02         1.56476E-02        -2.43506E-02         1.46317E+00         1.20249E+00         1.46337E+00         2.65686E+00         1.00000E+00         1.83960E-10         2.65686E+00         7.10381E-01         1.94648E+00
+          2.32899E-02         1.58175E-02        -2.45185E-02         1.46316E+00         1.21317E+00         1.46337E+00         2.65780E+00         1.00000E+00         1.94745E-10         2.65780E+00         7.20641E-01         1.93716E+00
+          2.32899E-02         1.59873E-02        -2.46882E-02         1.46316E+00         1.22384E+00         1.46337E+00         2.66221E+00         1.00000E+00         2.06258E-10         2.66221E+00         7.30915E-01         1.93129E+00
+          2.32899E-02         1.61571E-02        -2.48596E-02         1.46316E+00         1.23451E+00         1.46337E+00         2.66960E+00         1.00000E+00         2.18468E-10         2.66960E+00         7.41140E-01         1.92846E+00
+          2.32899E-02         1.63270E-02        -2.50329E-02         1.46315E+00         1.24518E+00         1.46337E+00         2.67953E+00         1.00000E+00         2.31341E-10         2.67953E+00         7.51255E-01         1.92828E+00
+          2.32899E-02         1.64968E-02        -2.52080E-02         1.46315E+00         1.25585E+00         1.46336E+00         2.69156E+00         1.00000E+00         2.44836E-10         2.69156E+00         7.61199E-01         1.93036E+00
+          2.32899E-02         1.66666E-02        -2.53849E-02         1.46314E+00         1.26652E+00         1.46336E+00         2.70529E+00         1.00000E+00         2.58911E-10         2.70529E+00         7.70915E-01         1.93437E+00
+          2.32899E-02         1.68364E-02        -2.55637E-02         1.46314E+00         1.27719E+00         1.46336E+00         2.72032E+00         1.00000E+00         2.73515E-10         2.72032E+00         7.80347E-01         1.93997E+00
+          2.32899E-02         1.70063E-02        -2.57442E-02         1.46313E+00         1.28786E+00         1.46336E+00         2.73629E+00         1.00000E+00         2.88597E-10         2.73629E+00         7.89441E-01         1.94685E+00
+          2.32899E-02         1.71761E-02        -2.59265E-02         1.46313E+00         1.29853E+00         1.46336E+00         2.75287E+00         1.00000E+00         3.04101E-10         2.75287E+00         7.98147E-01         1.95472E+00
+          2.32899E-02         1.73459E-02        -2.61107E-02         1.46313E+00         1.30920E+00         1.46336E+00         2.76971E+00         1.00000E+00         3.19969E-10         2.76971E+00         8.06416E-01         1.96330E+00
+          2.32899E-02         1.75158E-02        -2.62967E-02         1.46312E+00         1.31987E+00         1.46336E+00         2.78653E+00         1.00000E+00         3.36138E-10         2.78653E+00         8.14201E-01         1.97233E+00
+          2.32899E-02         1.76856E-02        -2.64845E-02         1.46312E+00         1.33054E+00         1.46336E+00         2.80305E+00         1.00000E+00         3.52546E-10         2.80305E+00         8.21460E-01         1.98159E+00
+          2.32899E-02         1.78554E-02        -2.66741E-02         1.46311E+00         1.34121E+00         1.46336E+00         2.81900E+00         1.00000E+00         3.69127E-10         2.81900E+00         8.28153E-01         1.99085E+00
+          2.32899E-02         1.80252E-02        -2.68655E-02         1.46311E+00         1.35188E+00         1.46336E+00         2.83415E+00         1.00000E+00         3.85812E-10         2.83415E+00         8.34241E-01         1.99991E+00
+          2.32899E-02         1.81951E-02        -2.70587E-02         1.46310E+00         1.36255E+00         1.46335E+00         2.84827E+00         1.00000E+00         4.02535E-10         2.84827E+00         8.39690E-01         2.00858E+00
+          2.32899E-02         1.83649E-02        -2.72537E-02         1.46310E+00         1.37322E+00         1.46335E+00         2.86118E+00         1.00000E+00         4.19224E-10         2.86118E+00         8.44469E-01         2.01671E+00
+          2.32899E-02         1.85347E-02        -2.74506E-02         1.46310E+00         1.38389E+00         1.46335E+00         2.87267E+00         1.00000E+00         4.35812E-10         2.87267E+00         8.48549E-01         2.02413E+00
+          2.32899E-02         1.87045E-02        -2.76493E-02         1.46309E+00         1.39457E+00         1.46335E+00         2.88261E+00         1.00000E+00         4.52230E-10         2.88261E+00         8.51905E-01         2.03070E+00
+          2.32899E-02         1.88744E-02        -2.78497E-02         1.46309E+00         1.40524E+00         1.46335E+00         2.89083E+00         1.00000E+00         4.68412E-10         2.89083E+00         8.54515E-01         2.03631E+00
+          2.32899E-02         1.90442E-02        -2.80520E-02         1.46308E+00         1.41591E+00         1.46335E+00         2.89721E+00         1.00000E+00         4.84295E-10         2.89721E+00         8.56360E-01         2.04085E+00
+          2.32899E-02         1.92140E-02        -2.82561E-02         1.46308E+00         1.42658E+00         1.46335E+00         2.90165E+00         1.00000E+00         4.99819E-10         2.90165E+00         8.57423E-01         2.04422E+00
+          2.32899E-02         1.93839E-02        -2.84620E-02         1.46307E+00         1.43725E+00         1.46335E+00         2.90404E+00         1.00000E+00         5.14931E-10         2.90404E+00         8.57693E-01         2.04635E+00
+          2.32899E-02         1.95537E-02        -2.86698E-02         1.46307E+00         1.44792E+00         1.46335E+00         2.90431E+00         1.00000E+00         5.29584E-10         2.90431E+00         8.57159E-01         2.04715E+00
+          2.32899E-02         1.97235E-02        -2.88793E-02         1.46306E+00         1.45859E+00         1.46335E+00         2.90238E+00         1.00000E+00         5.43741E-10         2.90238E+00         8.55815E-01         2.04657E+00
+          2.32899E-02         1.98933E-02        -2.90906E-02         1.46306E+00         1.46926E+00         1.46335E+00         2.89822E+00         1.00000E+00         5.57373E-10         2.89822E+00         8.53658E-01         2.04457E+00
+          2.32899E-02         2.00632E-02        -2.93038E-02         1.46305E+00         1.47993E+00         1.46335E+00         2.89179E+00         1.00000E+00         5.70468E-10         2.89179E+00         8.50686E-01         2.04110E+00
+          2.32899E-02         2.02330E-02        -2.95188E-02         1.46305E+00         1.49060E+00         1.46334E+00         2.88306E+00         1.00000E+00         5.83026E-10         2.88306E+00         8.46903E-01         2.03615E+00
+          2.32899E-02         2.04028E-02        -2.97356E-02         1.46304E+00         1.50127E+00         1.46334E+00         2.87201E+00         1.00000E+00         5.95065E-10         2.87201E+00         8.42314E-01         2.02970E+00
+          2.32899E-02         2.05726E-02        -2.99542E-02         1.46304E+00         1.51194E+00         1.46334E+00         2.85866E+00         1.00000E+00         6.06625E-10         2.85866E+00         8.36926E-01         2.02173E+00
+          2.32899E-02         2.07425E-02        -3.01746E-02         1.46303E+00         1.52261E+00         1.46334E+00         2.84301E+00         1.00000E+00         6.17768E-10         2.84301E+00         8.30751E-01         2.01226E+00
+          2.32899E-02         2.09123E-02        -3.03968E-02         1.46303E+00         1.53328E+00         1.46334E+00         2.82508E+00         1.00000E+00         6.28584E-10         2.82508E+00         8.23802E-01         2.00128E+00
+          2.32899E-02         2.10821E-02        -3.06209E-02         1.46302E+00         1.54395E+00         1.46334E+00         2.80491E+00         1.00000E+00         6.39189E-10         2.80491E+00         8.16094E-01         1.98882E+00
+          2.32899E-02         2.12520E-02        -3.08467E-02         1.46302E+00         1.55462E+00         1.46334E+00         2.78254E+00         1.00000E+00         6.49733E-10         2.78254E+00         8.07647E-01         1.97489E+00
+          2.32899E-02         2.14218E-02        -3.10744E-02         1.46301E+00         1.56529E+00         1.46334E+00         2.75801E+00         1.00000E+00         6.60396E-10         2.75801E+00         7.98479E-01         1.95953E+00
+          2.32899E-02         2.15916E-02        -3.13039E-02         1.46301E+00         1.57596E+00         1.46334E+00         2.73139E+00         1.00000E+00         6.71394E-10         2.73139E+00         7.88615E-01         1.94278E+00
+          2.32899E-02         2.17614E-02        -3.15352E-02         1.46300E+00         1.58664E+00         1.46334E+00         2.70274E+00         1.00000E+00         6.82977E-10         2.70274E+00         7.78078E-01         1.92466E+00
+          2.32899E-02         2.19313E-02        -3.17683E-02         1.46299E+00         1.59731E+00         1.46334E+00         2.67213E+00         1.00000E+00         6.95427E-10         2.67213E+00         7.66896E-01         1.90524E+00
+          2.32899E-02         2.21011E-02        -3.20032E-02         1.46299E+00         1.60798E+00         1.46334E+00         2.63965E+00         1.00000E+00         7.09053E-10         2.63965E+00         7.55096E-01         1.88456E+00
+          2.32899E-02         2.22709E-02        -3.22399E-02         1.46298E+00         1.61865E+00         1.46334E+00         2.60538E+00         1.00000E+00         7.24189E-10         2.60538E+00         7.42708E-01         1.86267E+00
+          2.32899E-02         2.24407E-02        -3.24785E-02         1.46298E+00         1.62932E+00         1.46334E+00         2.56940E+00         1.00000E+00         7.41184E-10         2.56940E+00         7.29764E-01         1.83964E+00
+          2.32899E-02         2.26106E-02        -3.27188E-02         1.46297E+00         1.63999E+00         1.46334E+00         2.53182E+00         1.00000E+00         7.60391E-10         2.53182E+00         7.16296E-01         1.81552E+00
+          2.32899E-02         2.27804E-02        -3.29610E-02         1.46297E+00         1.65066E+00         1.46334E+00         2.49273E+00         1.00000E+00         7.82159E-10         2.49273E+00         7.02338E-01         1.79039E+00
+          2.32899E-02         2.29502E-02        -3.32050E-02         1.46296E+00         1.66133E+00         1.46334E+00         2.45224E+00         1.00000E+00         8.06818E-10         2.45224E+00         6.87925E-01         1.76432E+00
+          2.32899E-02         2.31201E-02        -3.34508E-02         1.46296E+00         1.67200E+00         1.46334E+00         2.41045E+00         1.00000E+00         8.34667E-10         2.41045E+00         6.73092E-01         1.73736E+00
+          2.32899E-02         2.32899E-02        -3.36984E-02         1.46295E+00         1.68267E+00         1.46334E+00         2.36748E+00         1.00000E+00         8.65965E-10         2.36748E+00         6.57875E-01         1.70961E+00
+          2.32899E-02         2.34597E-02        -3.39478E-02         1.46294E+00         1.69334E+00         1.46334E+00         2.32344E+00         1.00000E+00         9.00922E-10         2.32344E+00         6.42313E-01         1.68112E+00
+          2.32899E-02         2.36295E-02        -3.41990E-02         1.46294E+00         1.70401E+00         1.46334E+00         2.27843E+00         1.00000E+00         9.39691E-10         2.27843E+00         6.26441E-01         1.65199E+00
+          2.32899E-02         2.37994E-02        -3.44521E-02         1.46293E+00         1.71468E+00         1.46334E+00         2.23258E+00         1.00000E+00         9.82367E-10         2.23258E+00         6.10298E-01         1.62228E+00
+          2.32899E-02         2.39692E-02        -3.47069E-02         1.46293E+00         1.72535E+00         1.46334E+00         2.18601E+00         1.00000E+00         1.02899E-09         2.18601E+00         5.93921E-01         1.59209E+00
+          2.32899E-02         2.41390E-02        -3.49636E-02         1.46292E+00         1.73602E+00         1.46334E+00         2.13883E+00         1.00000E+00         1.07953E-09         2.13883E+00         5.77348E-01         1.56148E+00
+          2.32899E-02         2.43088E-02        -3.52221E-02         1.46291E+00         1.74669E+00         1.46334E+00         2.09116E+00         1.00000E+00         1.13391E-09         2.09116E+00         5.60617E-01         1.53054E+00
+          2.32899E-02         2.44787E-02        -3.54824E-02         1.46291E+00         1.75736E+00         1.46334E+00         2.04312E+00         1.00000E+00         1.19202E-09         2.04312E+00         5.43765E-01         1.49935E+00
+          2.32899E-02         2.46485E-02        -3.57445E-02         1.46290E+00         1.76804E+00         1.46334E+00         1.99483E+00         1.00000E+00         1.25368E-09         1.99483E+00         5.26828E-01         1.46800E+00
+          2.32899E-02         2.48183E-02        -3.60085E-02         1.46290E+00         1.77871E+00         1.46334E+00         1.94640E+00         1.00000E+00         1.31869E-09         1.94640E+00         5.09844E-01         1.43655E+00
+          2.32899E-02         2.49882E-02        -3.62742E-02         1.46289E+00         1.78938E+00         1.46334E+00         1.89795E+00         1.00000E+00         1.38681E-09         1.89795E+00         4.92848E-01         1.40511E+00
+          2.32899E-02         2.51580E-02        -3.65418E-02         1.46288E+00         1.80005E+00         1.46334E+00         1.84961E+00         1.00000E+00         1.45777E-09         1.84961E+00         4.75874E-01         1.37373E+00
+          2.32899E-02         2.53278E-02        -3.68111E-02         1.46288E+00         1.81072E+00         1.46334E+00         1.80147E+00         1.00000E+00         1.53129E-09         1.80147E+00         4.58958E-01         1.34251E+00
+          2.32899E-02         2.54976E-02        -3.70823E-02         1.46287E+00         1.82139E+00         1.46334E+00         1.75365E+00         1.00000E+00         1.60704E-09         1.75365E+00         4.42132E-01         1.31152E+00
+          2.32899E-02         2.56675E-02        -3.73553E-02         1.46286E+00         1.83206E+00         1.46334E+00         1.70627E+00         1.00000E+00         1.68470E-09         1.70627E+00         4.25427E-01         1.28084E+00
+          2.32899E-02         2.58373E-02        -3.76301E-02         1.46286E+00         1.84273E+00         1.46334E+00         1.65943E+00         1.00000E+00         1.76391E-09         1.65943E+00         4.08876E-01         1.25055E+00
+          2.32899E-02         2.60071E-02        -3.79067E-02         1.46285E+00         1.85340E+00         1.46334E+00         1.61322E+00         1.00000E+00         1.84433E-09         1.61322E+00         3.92508E-01         1.22071E+00
+          2.32899E-02         2.61769E-02        -3.81852E-02         1.46285E+00         1.86407E+00         1.46334E+00         1.56776E+00         1.00000E+00         1.92557E-09         1.56776E+00         3.76351E-01         1.19141E+00
+          2.34597E-02         8.72665E-04        -1.69335E-02         1.47402E+00         2.74155E-01         1.47411E+00         6.66261E+01         1.00000E+00         7.93152E-12         6.66261E+01         3.84426E+00         6.27818E+01
+          2.34597E-02         1.04249E-03        -1.69437E-02         1.47402E+00         2.84826E-01         1.47411E+00         6.54419E+01         1.00000E+00         8.23840E-12         6.54419E+01         3.79191E+00         6.16499E+01
+          2.34597E-02         1.21232E-03        -1.69558E-02         1.47402E+00         2.95496E-01         1.47411E+00         6.42330E+01         1.00000E+00         8.54607E-12         6.42330E+01         3.73812E+00         6.04948E+01
+          2.34597E-02         1.38215E-03        -1.69696E-02         1.47402E+00         3.06167E-01         1.47411E+00         6.30013E+01         1.00000E+00         8.85328E-12         6.30013E+01         3.68295E+00         5.93184E+01
+          2.34597E-02         1.55197E-03        -1.69852E-02         1.47402E+00         3.16838E-01         1.47411E+00         6.17489E+01         1.00000E+00         9.15876E-12         6.17489E+01         3.62646E+00         5.81224E+01
+          2.34597E-02         1.72180E-03        -1.70027E-02         1.47401E+00         3.27508E-01         1.47411E+00         6.04777E+01         1.00000E+00         9.46122E-12         6.04777E+01         3.56872E+00         5.69090E+01
+          2.34597E-02         1.89163E-03        -1.70220E-02         1.47401E+00         3.38179E-01         1.47411E+00         5.91898E+01         1.00000E+00         9.75938E-12         5.91898E+01         3.50979E+00         5.56800E+01
+          2.34597E-02         2.06146E-03        -1.70431E-02         1.47401E+00         3.48849E-01         1.47411E+00         5.78871E+01         1.00000E+00         1.00520E-11         5.78871E+01         3.44975E+00         5.44373E+01
+          2.34597E-02         2.23128E-03        -1.70660E-02         1.47401E+00         3.59520E-01         1.47411E+00         5.65716E+01         1.00000E+00         1.03377E-11         5.65716E+01         3.38867E+00         5.31829E+01
+          2.34597E-02         2.40111E-03        -1.70907E-02         1.47401E+00         3.70190E-01         1.47411E+00         5.52453E+01         1.00000E+00         1.06154E-11         5.52453E+01         3.32662E+00         5.19187E+01
+          2.34597E-02         2.57094E-03        -1.71172E-02         1.47401E+00         3.80861E-01         1.47411E+00         5.39103E+01         1.00000E+00         1.08839E-11         5.39103E+01         3.26367E+00         5.06466E+01
+          2.34597E-02         2.74077E-03        -1.71455E-02         1.47401E+00         3.91532E-01         1.47411E+00         5.25683E+01         1.00000E+00         1.11419E-11         5.25683E+01         3.19990E+00         4.93685E+01
+          2.34597E-02         2.91059E-03        -1.71757E-02         1.47401E+00         4.02202E-01         1.47411E+00         5.12215E+01         1.00000E+00         1.13885E-11         5.12215E+01         3.13538E+00         4.80861E+01
+          2.34597E-02         3.08042E-03        -1.72076E-02         1.47401E+00         4.12873E-01         1.47411E+00         4.98717E+01         1.00000E+00         1.16226E-11         4.98717E+01         3.07020E+00         4.68015E+01
+          2.34597E-02         3.25025E-03        -1.72414E-02         1.47401E+00         4.23543E-01         1.47411E+00         4.85207E+01         1.00000E+00         1.18434E-11         4.85207E+01         3.00443E+00         4.55163E+01
+          2.34597E-02         3.42008E-03        -1.72770E-02         1.47401E+00         4.34214E-01         1.47411E+00         4.71705E+01         1.00000E+00         1.20502E-11         4.71705E+01         2.93816E+00         4.42323E+01
+          2.34597E-02         3.58990E-03        -1.73144E-02         1.47401E+00         4.44884E-01         1.47411E+00         4.58228E+01         1.00000E+00         1.22423E-11         4.58228E+01         2.87146E+00         4.29513E+01
+          2.34597E-02         3.75973E-03        -1.73536E-02         1.47401E+00         4.55555E-01         1.47411E+00         4.44794E+01         1.00000E+00         1.24195E-11         4.44794E+01         2.80441E+00         4.16750E+01
+          2.34597E-02         3.92956E-03        -1.73946E-02         1.47401E+00         4.66225E-01         1.47411E+00         4.31420E+01         1.00000E+00         1.25817E-11         4.31420E+01         2.73711E+00         4.04049E+01
+          2.34597E-02         4.09939E-03        -1.74374E-02         1.47400E+00         4.76896E-01         1.47411E+00         4.18123E+01         1.00000E+00         1.27289E-11         4.18123E+01         2.66963E+00         3.91427E+01
+          2.34597E-02         4.26921E-03        -1.74820E-02         1.47400E+00         4.87567E-01         1.47411E+00         4.04919E+01         1.00000E+00         1.28617E-11         4.04919E+01         2.60205E+00         3.78899E+01
+          2.34597E-02         4.43904E-03        -1.75285E-02         1.47400E+00         4.98237E-01         1.47411E+00         3.91825E+01         1.00000E+00         1.29812E-11         3.91825E+01         2.53446E+00         3.66480E+01
+          2.34597E-02         4.60887E-03        -1.75767E-02         1.47400E+00         5.08908E-01         1.47411E+00         3.78854E+01         1.00000E+00         1.30885E-11         3.78854E+01         2.46695E+00         3.54184E+01
+          2.34597E-02         4.77869E-03        -1.76268E-02         1.47400E+00         5.19578E-01         1.47411E+00         3.66022E+01         1.00000E+00         1.31858E-11         3.66022E+01         2.39960E+00         3.42026E+01
+          2.34597E-02         4.94852E-03        -1.76787E-02         1.47400E+00         5.30249E-01         1.47411E+00         3.53342E+01         1.00000E+00         1.32754E-11         3.53342E+01         2.33248E+00         3.30017E+01
+          2.34597E-02         5.11835E-03        -1.77324E-02         1.47400E+00         5.40919E-01         1.47410E+00         3.40828E+01         1.00000E+00         1.33608E-11         3.40828E+01         2.26569E+00         3.18171E+01
+          2.34597E-02         5.28818E-03        -1.77879E-02         1.47400E+00         5.51590E-01         1.47410E+00         3.28493E+01         1.00000E+00         1.34457E-11         3.28493E+01         2.19931E+00         3.06500E+01
+          2.34597E-02         5.45800E-03        -1.78452E-02         1.47400E+00         5.62261E-01         1.47410E+00         3.16348E+01         1.00000E+00         1.35352E-11         3.16348E+01         2.13341E+00         2.95014E+01
+          2.34597E-02         5.62783E-03        -1.79043E-02         1.47399E+00         5.72931E-01         1.47410E+00         3.04405E+01         1.00000E+00         1.36348E-11         3.04405E+01         2.06808E+00         2.83724E+01
+          2.34597E-02         5.79766E-03        -1.79653E-02         1.47399E+00         5.83602E-01         1.47410E+00         2.92674E+01         1.00000E+00         1.37513E-11         2.92674E+01         2.00341E+00         2.72640E+01
+          2.34597E-02         5.96749E-03        -1.80280E-02         1.47399E+00         5.94272E-01         1.47410E+00         2.81166E+01         1.00000E+00         1.38919E-11         2.81166E+01         1.93945E+00         2.61771E+01
+          2.34597E-02         6.13731E-03        -1.80926E-02         1.47399E+00         6.04943E-01         1.47410E+00         2.69889E+01         1.00000E+00         1.40650E-11         2.69889E+01         1.87630E+00         2.51126E+01
+          2.34597E-02         6.30714E-03        -1.81590E-02         1.47399E+00         6.15613E-01         1.47410E+00         2.58852E+01         1.00000E+00         1.42794E-11         2.58852E+01         1.81403E+00         2.40712E+01
+          2.34597E-02         6.47697E-03        -1.82272E-02         1.47399E+00         6.26284E-01         1.47410E+00         2.48063E+01         1.00000E+00         1.45445E-11         2.48063E+01         1.75272E+00         2.30536E+01
+          2.34597E-02         6.64680E-03        -1.82972E-02         1.47398E+00         6.36955E-01         1.47410E+00         2.37528E+01         1.00000E+00         1.48696E-11         2.37528E+01         1.69242E+00         2.20604E+01
+          2.34597E-02         6.81662E-03        -1.83690E-02         1.47398E+00         6.47625E-01         1.47410E+00         2.27255E+01         1.00000E+00         1.52641E-11         2.27255E+01         1.63322E+00         2.10923E+01
+          2.34597E-02         6.98645E-03        -1.84426E-02         1.47398E+00         6.58296E-01         1.47410E+00         2.17249E+01         1.00000E+00         1.57364E-11         2.17249E+01         1.57518E+00         2.01497E+01
+          2.34597E-02         7.15628E-03        -1.85181E-02         1.47398E+00         6.68966E-01         1.47410E+00         2.07515E+01         1.00000E+00         1.62946E-11         2.07515E+01         1.51837E+00         1.92331E+01
+          2.34597E-02         7.32611E-03        -1.85953E-02         1.47398E+00         6.79637E-01         1.47409E+00         1.98057E+01         1.00000E+00         1.69451E-11         1.98057E+01         1.46284E+00         1.83428E+01
+          2.34597E-02         7.49593E-03        -1.86744E-02         1.47398E+00         6.90307E-01         1.47409E+00         1.88878E+01         1.00000E+00         1.76933E-11         1.88878E+01         1.40866E+00         1.74791E+01
+          2.34597E-02         7.66576E-03        -1.87552E-02         1.47397E+00         7.00978E-01         1.47409E+00         1.79982E+01         1.00000E+00         1.85429E-11         1.79982E+01         1.35588E+00         1.66423E+01
+          2.34597E-02         7.83559E-03        -1.88379E-02         1.47397E+00         7.11649E-01         1.47409E+00         1.71371E+01         1.00000E+00         1.94965E-11         1.71371E+01         1.30456E+00         1.58325E+01
+          2.34597E-02         8.00542E-03        -1.89224E-02         1.47397E+00         7.22319E-01         1.47409E+00         1.63046E+01         1.00000E+00         2.05550E-11         1.63046E+01         1.25474E+00         1.50499E+01
+          2.34597E-02         8.17524E-03        -1.90087E-02         1.47397E+00         7.32990E-01         1.47409E+00         1.55009E+01         1.00000E+00         2.17183E-11         1.55009E+01         1.20648E+00         1.42944E+01
+          2.34597E-02         8.34507E-03        -1.90968E-02         1.47397E+00         7.43660E-01         1.47409E+00         1.47259E+01         1.00000E+00         2.29851E-11         1.47259E+01         1.15981E+00         1.35661E+01
+          2.34597E-02         8.51490E-03        -1.91868E-02         1.47396E+00         7.54331E-01         1.47409E+00         1.39797E+01         1.00000E+00         2.43534E-11         1.39797E+01         1.11478E+00         1.28649E+01
+          2.34597E-02         8.68473E-03        -1.92785E-02         1.47396E+00         7.65001E-01         1.47409E+00         1.32621E+01         1.00000E+00         2.58203E-11         1.32621E+01         1.07143E+00         1.21907E+01
+          2.34597E-02         8.85455E-03        -1.93721E-02         1.47396E+00         7.75672E-01         1.47409E+00         1.25731E+01         1.00000E+00         2.73826E-11         1.25731E+01         1.02978E+00         1.15434E+01
+          2.34597E-02         9.02438E-03        -1.94674E-02         1.47396E+00         7.86343E-01         1.47409E+00         1.19124E+01         1.00000E+00         2.90363E-11         1.19124E+01         9.89861E-01         1.09226E+01
+          2.34597E-02         9.19421E-03        -1.95646E-02         1.47395E+00         7.97013E-01         1.47408E+00         1.12799E+01         1.00000E+00         3.07772E-11         1.12799E+01         9.51703E-01         1.03282E+01
+          2.34597E-02         9.36403E-03        -1.96636E-02         1.47395E+00         8.07684E-01         1.47408E+00         1.06751E+01         1.00000E+00         3.26007E-11         1.06751E+01         9.15325E-01         9.75974E+00
+          2.34597E-02         9.53386E-03        -1.97644E-02         1.47395E+00         8.18354E-01         1.47408E+00         1.00977E+01         1.00000E+00         3.45019E-11         1.00977E+01         8.80744E-01         9.21700E+00
+          2.34597E-02         9.70369E-03        -1.98670E-02         1.47395E+00         8.29025E-01         1.47408E+00         9.54751E+00         1.00000E+00         3.64758E-11         9.54751E+00         8.47972E-01         8.69954E+00
+          2.34597E-02         9.87352E-03        -1.99714E-02         1.47395E+00         8.39695E-01         1.47408E+00         9.02393E+00         1.00000E+00         3.85169E-11         9.02393E+00         8.17019E-01         8.20691E+00
+          2.34597E-02         1.00433E-02        -2.00777E-02         1.47394E+00         8.50366E-01         1.47408E+00         8.52656E+00         1.00000E+00         4.06197E-11         8.52656E+00         7.87888E-01         7.73867E+00
+          2.34597E-02         1.02132E-02        -2.01857E-02         1.47394E+00         8.61037E-01         1.47408E+00         8.05488E+00         1.00000E+00         4.27783E-11         8.05488E+00         7.60582E-01         7.29430E+00
+          2.34597E-02         1.03830E-02        -2.02956E-02         1.47394E+00         8.71707E-01         1.47408E+00         7.60837E+00         1.00000E+00         4.49867E-11         7.60837E+00         7.35095E-01         6.87327E+00
+          2.34597E-02         1.05528E-02        -2.04073E-02         1.47393E+00         8.82378E-01         1.47408E+00         7.18646E+00         1.00000E+00         4.72389E-11         7.18646E+00         7.11421E-01         6.47504E+00
+          2.34597E-02         1.07227E-02        -2.05208E-02         1.47393E+00         8.93048E-01         1.47408E+00         6.78857E+00         1.00000E+00         4.95285E-11         6.78857E+00         6.89547E-01         6.09903E+00
+          2.34597E-02         1.08925E-02        -2.06361E-02         1.47393E+00         9.03719E-01         1.47407E+00         6.41408E+00         1.00000E+00         5.18490E-11         6.41408E+00         6.69459E-01         5.74462E+00
+          2.34597E-02         1.10623E-02        -2.07532E-02         1.47393E+00         9.14389E-01         1.47407E+00         6.06233E+00         1.00000E+00         5.41940E-11         6.06233E+00         6.51137E-01         5.41120E+00
+          2.34597E-02         1.12321E-02        -2.08721E-02         1.47392E+00         9.25060E-01         1.47407E+00         5.73268E+00         1.00000E+00         5.65570E-11         5.73268E+00         6.34558E-01         5.09812E+00
+          2.34597E-02         1.14020E-02        -2.09928E-02         1.47392E+00         9.35731E-01         1.47407E+00         5.42444E+00         1.00000E+00         5.89314E-11         5.42444E+00         6.19693E-01         4.80475E+00
+          2.34597E-02         1.15718E-02        -2.11154E-02         1.47392E+00         9.46401E-01         1.47407E+00         5.13691E+00         1.00000E+00         6.13110E-11         5.13691E+00         6.06513E-01         4.53040E+00
+          2.34597E-02         1.17416E-02        -2.12397E-02         1.47392E+00         9.57072E-01         1.47407E+00         4.86939E+00         1.00000E+00         6.36894E-11         4.86939E+00         5.94983E-01         4.27441E+00
+          2.34597E-02         1.19114E-02        -2.13659E-02         1.47391E+00         9.67742E-01         1.47407E+00         4.62115E+00         1.00000E+00         6.60610E-11         4.62115E+00         5.85065E-01         4.03609E+00
+          2.34597E-02         1.20813E-02        -2.14939E-02         1.47391E+00         9.78413E-01         1.47407E+00         4.39147E+00         1.00000E+00         6.84201E-11         4.39147E+00         5.76717E-01         3.81475E+00
+          2.34597E-02         1.22511E-02        -2.16237E-02         1.47391E+00         9.89083E-01         1.47407E+00         4.17960E+00         1.00000E+00         7.07619E-11         4.17960E+00         5.69895E-01         3.60971E+00
+          2.34597E-02         1.24209E-02        -2.17553E-02         1.47390E+00         9.99754E-01         1.47406E+00         3.98481E+00         1.00000E+00         7.30822E-11         3.98481E+00         5.64552E-01         3.42026E+00
+          2.34597E-02         1.25908E-02        -2.18887E-02         1.47390E+00         1.01042E+00         1.47406E+00         3.80636E+00         1.00000E+00         7.53776E-11         3.80636E+00         5.60636E-01         3.24572E+00
+          2.34597E-02         1.27606E-02        -2.20239E-02         1.47390E+00         1.02110E+00         1.47406E+00         3.64350E+00         1.00000E+00         7.76458E-11         3.64350E+00         5.58094E-01         3.08540E+00
+          2.34597E-02         1.29304E-02        -2.21610E-02         1.47389E+00         1.03177E+00         1.47406E+00         3.49548E+00         1.00000E+00         7.98858E-11         3.49548E+00         5.56871E-01         2.93861E+00
+          2.34597E-02         1.31002E-02        -2.22998E-02         1.47389E+00         1.04244E+00         1.47406E+00         3.36158E+00         1.00000E+00         8.20980E-11         3.36158E+00         5.56908E-01         2.80467E+00
+          2.34597E-02         1.32701E-02        -2.24405E-02         1.47389E+00         1.05311E+00         1.47406E+00         3.24106E+00         1.00000E+00         8.42846E-11         3.24106E+00         5.58145E-01         2.68292E+00
+          2.34597E-02         1.34399E-02        -2.25830E-02         1.47388E+00         1.06378E+00         1.47406E+00         3.13320E+00         1.00000E+00         8.64499E-11         3.13320E+00         5.60518E-01         2.57268E+00
+          2.34597E-02         1.36097E-02        -2.27273E-02         1.47388E+00         1.07445E+00         1.47406E+00         3.03728E+00         1.00000E+00         8.86003E-11         3.03728E+00         5.63963E-01         2.47331E+00
+          2.34597E-02         1.37795E-02        -2.28734E-02         1.47388E+00         1.08512E+00         1.47405E+00         2.95259E+00         1.00000E+00         9.07446E-11         2.95259E+00         5.68414E-01         2.38417E+00
+          2.34597E-02         1.39494E-02        -2.30213E-02         1.47387E+00         1.09579E+00         1.47405E+00         2.87843E+00         1.00000E+00         9.28948E-11         2.87843E+00         5.73804E-01         2.30463E+00
+          2.34597E-02         1.41192E-02        -2.31710E-02         1.47387E+00         1.10646E+00         1.47405E+00         2.81413E+00         1.00000E+00         9.50656E-11         2.81413E+00         5.80063E-01         2.23407E+00
+          2.34597E-02         1.42890E-02        -2.33225E-02         1.47387E+00         1.11713E+00         1.47405E+00         2.75902E+00         1.00000E+00         9.72750E-11         2.75902E+00         5.87122E-01         2.17190E+00
+          2.34597E-02         1.44589E-02        -2.34759E-02         1.47386E+00         1.12780E+00         1.47405E+00         2.71245E+00         1.00000E+00         9.95446E-11         2.71245E+00         5.94910E-01         2.11754E+00
+          2.34597E-02         1.46287E-02        -2.36311E-02         1.47386E+00         1.13847E+00         1.47405E+00         2.67377E+00         1.00000E+00         1.01899E-10         2.67377E+00         6.03355E-01         2.07041E+00
+          2.34597E-02         1.47985E-02        -2.37880E-02         1.47386E+00         1.14914E+00         1.47405E+00         2.64237E+00         1.00000E+00         1.04368E-10         2.64237E+00         6.12387E-01         2.02998E+00
+          2.34597E-02         1.49683E-02        -2.39468E-02         1.47385E+00         1.15981E+00         1.47405E+00         2.61764E+00         1.00000E+00         1.06981E-10         2.61764E+00         6.21933E-01         1.99571E+00
+          2.34597E-02         1.51382E-02        -2.41074E-02         1.47385E+00         1.17048E+00         1.47405E+00         2.59901E+00         1.00000E+00         1.09775E-10         2.59901E+00         6.31921E-01         1.96709E+00
+          2.34597E-02         1.53080E-02        -2.42698E-02         1.47384E+00         1.18115E+00         1.47404E+00         2.58590E+00         1.00000E+00         1.12787E-10         2.58590E+00         6.42280E-01         1.94362E+00
+          2.34597E-02         1.54778E-02        -2.44341E-02         1.47384E+00         1.19182E+00         1.47404E+00         2.57778E+00         1.00000E+00         1.16056E-10         2.57778E+00         6.52940E-01         1.92484E+00
+          2.34597E-02         1.56476E-02        -2.46001E-02         1.47384E+00         1.20249E+00         1.47404E+00         2.57412E+00         1.00000E+00         1.19623E-10         2.57412E+00         6.63830E-01         1.91029E+00
+          2.34597E-02         1.58175E-02        -2.47680E-02         1.47383E+00         1.21317E+00         1.47404E+00         2.57441E+00         1.00000E+00         1.23529E-10         2.57441E+00         6.74880E-01         1.89953E+00
+          2.34597E-02         1.59873E-02        -2.49376E-02         1.47383E+00         1.22384E+00         1.47404E+00         2.57818E+00         1.00000E+00         1.27814E-10         2.57818E+00         6.86022E-01         1.89216E+00
+          2.34597E-02         1.61571E-02        -2.51091E-02         1.47382E+00         1.23451E+00         1.47404E+00         2.58495E+00         1.00000E+00         1.32519E-10         2.58495E+00         6.97190E-01         1.88776E+00
+          2.34597E-02         1.63270E-02        -2.52824E-02         1.47382E+00         1.24518E+00         1.47404E+00         2.59430E+00         1.00000E+00         1.37679E-10         2.59430E+00         7.08317E-01         1.88598E+00
+          2.34597E-02         1.64968E-02        -2.54575E-02         1.47382E+00         1.25585E+00         1.47404E+00         2.60579E+00         1.00000E+00         1.43328E-10         2.60579E+00         7.19341E-01         1.88645E+00
+          2.34597E-02         1.66666E-02        -2.56344E-02         1.47381E+00         1.26652E+00         1.47404E+00         2.61904E+00         1.00000E+00         1.49495E-10         2.61904E+00         7.30198E-01         1.88884E+00
+          2.34597E-02         1.68364E-02        -2.58131E-02         1.47381E+00         1.27719E+00         1.47403E+00         2.63367E+00         1.00000E+00         1.56204E-10         2.63367E+00         7.40830E-01         1.89284E+00
+          2.34597E-02         1.70063E-02        -2.59936E-02         1.47380E+00         1.28786E+00         1.47403E+00         2.64931E+00         1.00000E+00         1.63476E-10         2.64931E+00         7.51177E-01         1.89813E+00
+          2.34597E-02         1.71761E-02        -2.61760E-02         1.47380E+00         1.29853E+00         1.47403E+00         2.66564E+00         1.00000E+00         1.71324E-10         2.66564E+00         7.61185E-01         1.90445E+00
+          2.34597E-02         1.73459E-02        -2.63602E-02         1.47380E+00         1.30920E+00         1.47403E+00         2.68234E+00         1.00000E+00         1.79759E-10         2.68234E+00         7.70801E-01         1.91154E+00
+          2.34597E-02         1.75158E-02        -2.65461E-02         1.47379E+00         1.31987E+00         1.47403E+00         2.69912E+00         1.00000E+00         1.88783E-10         2.69912E+00         7.79974E-01         1.91915E+00
+          2.34597E-02         1.76856E-02        -2.67339E-02         1.47379E+00         1.33054E+00         1.47403E+00         2.71571E+00         1.00000E+00         1.98397E-10         2.71571E+00         7.88656E-01         1.92705E+00
+          2.34597E-02         1.78554E-02        -2.69235E-02         1.47378E+00         1.34121E+00         1.47403E+00         2.73184E+00         1.00000E+00         2.08596E-10         2.73184E+00         7.96802E-01         1.93504E+00
+          2.34597E-02         1.80252E-02        -2.71149E-02         1.47378E+00         1.35188E+00         1.47403E+00         2.74730E+00         1.00000E+00         2.19370E-10         2.74730E+00         8.04370E-01         1.94293E+00
+          2.34597E-02         1.81951E-02        -2.73082E-02         1.47377E+00         1.36255E+00         1.47403E+00         2.76186E+00         1.00000E+00         2.30706E-10         2.76186E+00         8.11321E-01         1.95053E+00
+          2.34597E-02         1.83649E-02        -2.75032E-02         1.47377E+00         1.37322E+00         1.47403E+00         2.77532E+00         1.00000E+00         2.42586E-10         2.77532E+00         8.17619E-01         1.95770E+00
+          2.34597E-02         1.85347E-02        -2.77000E-02         1.47376E+00         1.38389E+00         1.47402E+00         2.78751E+00         1.00000E+00         2.54992E-10         2.78751E+00         8.23230E-01         1.96428E+00
+          2.34597E-02         1.87045E-02        -2.78987E-02         1.47376E+00         1.39457E+00         1.47402E+00         2.79827E+00         1.00000E+00         2.67901E-10         2.79827E+00         8.28126E-01         1.97015E+00
+          2.34597E-02         1.88744E-02        -2.80992E-02         1.47375E+00         1.40524E+00         1.47402E+00         2.80746E+00         1.00000E+00         2.81286E-10         2.80746E+00         8.32278E-01         1.97518E+00
+          2.34597E-02         1.90442E-02        -2.83015E-02         1.47375E+00         1.41591E+00         1.47402E+00         2.81494E+00         1.00000E+00         2.95121E-10         2.81494E+00         8.35665E-01         1.97927E+00
+          2.34597E-02         1.92140E-02        -2.85056E-02         1.47374E+00         1.42658E+00         1.47402E+00         2.82060E+00         1.00000E+00         3.09375E-10         2.82060E+00         8.38265E-01         1.98234E+00
+          2.34597E-02         1.93839E-02        -2.87115E-02         1.47374E+00         1.43725E+00         1.47402E+00         2.82435E+00         1.00000E+00         3.24017E-10         2.82435E+00         8.40061E-01         1.98429E+00
+          2.34597E-02         1.95537E-02        -2.89192E-02         1.47374E+00         1.44792E+00         1.47402E+00         2.82611E+00         1.00000E+00         3.39014E-10         2.82611E+00         8.41041E-01         1.98507E+00
+          2.34597E-02         1.97235E-02        -2.91287E-02         1.47373E+00         1.45859E+00         1.47402E+00         2.82581E+00         1.00000E+00         3.54333E-10         2.82581E+00         8.41194E-01         1.98462E+00
+          2.34597E-02         1.98933E-02        -2.93401E-02         1.47373E+00         1.46926E+00         1.47402E+00         2.82340E+00         1.00000E+00         3.69938E-10         2.82340E+00         8.40511E-01         1.98289E+00
+          2.34597E-02         2.00632E-02        -2.95533E-02         1.47372E+00         1.47993E+00         1.47402E+00         2.81883E+00         1.00000E+00         3.85795E-10         2.81883E+00         8.38990E-01         1.97984E+00
+          2.34597E-02         2.02330E-02        -2.97682E-02         1.47372E+00         1.49060E+00         1.47402E+00         2.81207E+00         1.00000E+00         4.01868E-10         2.81207E+00         8.36629E-01         1.97544E+00
+          2.34597E-02         2.04028E-02        -2.99850E-02         1.47371E+00         1.50127E+00         1.47402E+00         2.80312E+00         1.00000E+00         4.18122E-10         2.80312E+00         8.33430E-01         1.96969E+00
+          2.34597E-02         2.05726E-02        -3.02036E-02         1.47371E+00         1.51194E+00         1.47401E+00         2.79196E+00         1.00000E+00         4.34523E-10         2.79196E+00         8.29398E-01         1.96256E+00
+          2.34597E-02         2.07425E-02        -3.04240E-02         1.47370E+00         1.52261E+00         1.47401E+00         2.77860E+00         1.00000E+00         4.51038E-10         2.77860E+00         8.24541E-01         1.95406E+00
+          2.34597E-02         2.09123E-02        -3.06463E-02         1.47369E+00         1.53328E+00         1.47401E+00         2.76305E+00         1.00000E+00         4.67636E-10         2.76305E+00         8.18869E-01         1.94418E+00
+          2.34597E-02         2.10821E-02        -3.08703E-02         1.47369E+00         1.54395E+00         1.47401E+00         2.74535E+00         1.00000E+00         4.84289E-10         2.74535E+00         8.12397E-01         1.93295E+00
+          2.34597E-02         2.12520E-02        -3.10962E-02         1.47368E+00         1.55462E+00         1.47401E+00         2.72551E+00         1.00000E+00         5.00970E-10         2.72551E+00         8.05139E-01         1.92037E+00
+          2.34597E-02         2.14218E-02        -3.13238E-02         1.47368E+00         1.56529E+00         1.47401E+00         2.70359E+00         1.00000E+00         5.17659E-10         2.70359E+00         7.97113E-01         1.90648E+00
+          2.34597E-02         2.15916E-02        -3.15533E-02         1.47367E+00         1.57596E+00         1.47401E+00         2.67963E+00         1.00000E+00         5.34336E-10         2.67963E+00         7.88342E-01         1.89129E+00
+          2.34597E-02         2.17614E-02        -3.17846E-02         1.47367E+00         1.58664E+00         1.47401E+00         2.65369E+00         1.00000E+00         5.50990E-10         2.65369E+00         7.78848E-01         1.87484E+00
+          2.34597E-02         2.19313E-02        -3.20177E-02         1.47366E+00         1.59731E+00         1.47401E+00         2.62583E+00         1.00000E+00         5.67615E-10         2.62583E+00         7.68655E-01         1.85718E+00
+          2.34597E-02         2.21011E-02        -3.22526E-02         1.47366E+00         1.60798E+00         1.47401E+00         2.59613E+00         1.00000E+00         5.84210E-10         2.59613E+00         7.57790E-01         1.83834E+00
+          2.34597E-02         2.22709E-02        -3.24893E-02         1.47365E+00         1.61865E+00         1.47401E+00         2.56466E+00         1.00000E+00         6.00783E-10         2.56466E+00         7.46284E-01         1.81837E+00
+          2.34597E-02         2.24407E-02        -3.27279E-02         1.47365E+00         1.62932E+00         1.47401E+00         2.53149E+00         1.00000E+00         6.17351E-10         2.53149E+00         7.34165E-01         1.79732E+00
+          2.34597E-02         2.26106E-02        -3.29682E-02         1.47364E+00         1.63999E+00         1.47401E+00         2.49671E+00         1.00000E+00         6.33940E-10         2.49671E+00         7.21466E-01         1.77525E+00
+          2.34597E-02         2.27804E-02        -3.32104E-02         1.47363E+00         1.65066E+00         1.47401E+00         2.46042E+00         1.00000E+00         6.50585E-10         2.46042E+00         7.08221E-01         1.75220E+00
+          2.34597E-02         2.29502E-02        -3.34544E-02         1.47363E+00         1.66133E+00         1.47401E+00         2.42271E+00         1.00000E+00         6.67332E-10         2.42271E+00         6.94463E-01         1.72824E+00
+          2.34597E-02         2.31201E-02        -3.37002E-02         1.47362E+00         1.67200E+00         1.47401E+00         2.38366E+00         1.00000E+00         6.84238E-10         2.38366E+00         6.80229E-01         1.70343E+00
+          2.34597E-02         2.32899E-02        -3.39478E-02         1.47362E+00         1.68267E+00         1.47401E+00         2.34339E+00         1.00000E+00         7.01374E-10         2.34339E+00         6.65555E-01         1.67784E+00
+          2.34597E-02         2.34597E-02        -3.41972E-02         1.47361E+00         1.69334E+00         1.47401E+00         2.30200E+00         1.00000E+00         7.18821E-10         2.30200E+00         6.50478E-01         1.65152E+00
+          2.34597E-02         2.36295E-02        -3.44485E-02         1.47361E+00         1.70401E+00         1.47401E+00         2.25959E+00         1.00000E+00         7.36671E-10         2.25959E+00         6.35037E-01         1.62455E+00
+          2.34597E-02         2.37994E-02        -3.47015E-02         1.47360E+00         1.71468E+00         1.47401E+00         2.21626E+00         1.00000E+00         7.55031E-10         2.21626E+00         6.19269E-01         1.59699E+00
+          2.34597E-02         2.39692E-02        -3.49564E-02         1.47359E+00         1.72535E+00         1.47401E+00         2.17213E+00         1.00000E+00         7.74017E-10         2.17213E+00         6.03213E-01         1.56891E+00
+          2.34597E-02         2.41390E-02        -3.52130E-02         1.47359E+00         1.73602E+00         1.47401E+00         2.12730E+00         1.00000E+00         7.93756E-10         2.12730E+00         5.86908E-01         1.54039E+00
+          2.34597E-02         2.43088E-02        -3.54715E-02         1.47358E+00         1.74669E+00         1.47401E+00         2.08188E+00         1.00000E+00         8.14384E-10         2.08188E+00         5.70393E-01         1.51149E+00
+          2.34597E-02         2.44787E-02        -3.57318E-02         1.47358E+00         1.75736E+00         1.47401E+00         2.03599E+00         1.00000E+00         8.36045E-10         2.03599E+00         5.53707E-01         1.48228E+00
+          2.34597E-02         2.46485E-02        -3.59939E-02         1.47357E+00         1.76804E+00         1.47401E+00         1.98973E+00         1.00000E+00         8.58889E-10         1.98973E+00         5.36888E-01         1.45284E+00
+          2.34597E-02         2.48183E-02        -3.62579E-02         1.47356E+00         1.77871E+00         1.47401E+00         1.94321E+00         1.00000E+00         8.83068E-10         1.94321E+00         5.19974E-01         1.42324E+00
+          2.34597E-02         2.49882E-02        -3.65236E-02         1.47356E+00         1.78938E+00         1.47401E+00         1.89654E+00         1.00000E+00         9.08734E-10         1.89654E+00         5.03002E-01         1.39354E+00
+          2.34597E-02         2.51580E-02        -3.67912E-02         1.47355E+00         1.80005E+00         1.47401E+00         1.84984E+00         1.00000E+00         9.36041E-10         1.84984E+00         4.86009E-01         1.36383E+00
+          2.34597E-02         2.53278E-02        -3.70605E-02         1.47354E+00         1.81072E+00         1.47401E+00         1.80320E+00         1.00000E+00         9.65133E-10         1.80320E+00         4.69032E-01         1.33417E+00
+          2.34597E-02         2.54976E-02        -3.73317E-02         1.47354E+00         1.82139E+00         1.47401E+00         1.75674E+00         1.00000E+00         9.96151E-10         1.75674E+00         4.52105E-01         1.30464E+00
+          2.34597E-02         2.56675E-02        -3.76047E-02         1.47353E+00         1.83206E+00         1.47401E+00         1.71056E+00         1.00000E+00         1.02922E-09         1.71056E+00         4.35263E-01         1.27530E+00
+          2.34597E-02         2.58373E-02        -3.78795E-02         1.47352E+00         1.84273E+00         1.47401E+00         1.66475E+00         1.00000E+00         1.06446E-09         1.66475E+00         4.18538E-01         1.24622E+00
+          2.34597E-02         2.60071E-02        -3.81561E-02         1.47352E+00         1.85340E+00         1.47401E+00         1.61943E+00         1.00000E+00         1.10197E-09         1.61943E+00         4.01963E-01         1.21747E+00
+          2.34597E-02         2.61769E-02        -3.84346E-02         1.47351E+00         1.86407E+00         1.47401E+00         1.57469E+00         1.00000E+00         1.14183E-09         1.57469E+00         3.85569E-01         1.18912E+00
+          2.36295E-02         8.72665E-04        -1.71848E-02         1.48469E+00         2.74155E-01         1.48479E+00         6.51919E+01         1.00000E+00         5.76916E-12         6.51919E+01         3.88083E+00         6.13111E+01
+          2.36295E-02         1.04249E-03        -1.71950E-02         1.48469E+00         2.84826E-01         1.48479E+00         6.40338E+01         1.00000E+00         6.18778E-12         6.40338E+01         3.82912E+00         6.02047E+01
+          2.36295E-02         1.21232E-03        -1.72071E-02         1.48469E+00         2.95496E-01         1.48479E+00         6.28515E+01         1.00000E+00         6.60617E-12         6.28515E+01         3.77593E+00         5.90755E+01
+          2.36295E-02         1.38215E-03        -1.72209E-02         1.48469E+00         3.06167E-01         1.48479E+00         6.16469E+01         1.00000E+00         7.02149E-12         6.16469E+01         3.72134E+00         5.79256E+01
+          2.36295E-02         1.55197E-03        -1.72365E-02         1.48469E+00         3.16838E-01         1.48479E+00         6.04221E+01         1.00000E+00         7.43096E-12         6.04221E+01         3.66540E+00         5.67567E+01
+          2.36295E-02         1.72180E-03        -1.72540E-02         1.48469E+00         3.27508E-01         1.48479E+00         5.91789E+01         1.00000E+00         7.83188E-12         5.91789E+01         3.60817E+00         5.55707E+01
+          2.36295E-02         1.89163E-03        -1.72733E-02         1.48468E+00         3.38179E-01         1.48479E+00         5.79193E+01         1.00000E+00         8.22160E-12         5.79193E+01         3.54972E+00         5.43696E+01
+          2.36295E-02         2.06146E-03        -1.72944E-02         1.48468E+00         3.48849E-01         1.48479E+00         5.66453E+01         1.00000E+00         8.59752E-12         5.66453E+01         3.49012E+00         5.31552E+01
+          2.36295E-02         2.23128E-03        -1.73173E-02         1.48468E+00         3.59520E-01         1.48478E+00         5.53588E+01         1.00000E+00         8.95704E-12         5.53588E+01         3.42942E+00         5.19294E+01
+          2.36295E-02         2.40111E-03        -1.73420E-02         1.48468E+00         3.70190E-01         1.48478E+00         5.40617E+01         1.00000E+00         9.29762E-12         5.40617E+01         3.36770E+00         5.06940E+01
+          2.36295E-02         2.57094E-03        -1.73685E-02         1.48468E+00         3.80861E-01         1.48478E+00         5.27560E+01         1.00000E+00         9.61672E-12         5.27560E+01         3.30502E+00         4.94510E+01
+          2.36295E-02         2.74077E-03        -1.73968E-02         1.48468E+00         3.91532E-01         1.48478E+00         5.14437E+01         1.00000E+00         9.91185E-12         5.14437E+01         3.24147E+00         4.82022E+01
+          2.36295E-02         2.91059E-03        -1.74270E-02         1.48468E+00         4.02202E-01         1.48478E+00         5.01265E+01         1.00000E+00         1.01806E-11         5.01265E+01         3.17711E+00         4.69494E+01
+          2.36295E-02         3.08042E-03        -1.74589E-02         1.48468E+00         4.12873E-01         1.48478E+00         4.88064E+01         1.00000E+00         1.04205E-11         4.88064E+01         3.11203E+00         4.56943E+01
+          2.36295E-02         3.25025E-03        -1.74927E-02         1.48468E+00         4.23543E-01         1.48478E+00         4.74852E+01         1.00000E+00         1.06292E-11         4.74852E+01         3.04628E+00         4.44389E+01
+          2.36295E-02         3.42008E-03        -1.75283E-02         1.48468E+00         4.34214E-01         1.48478E+00         4.61646E+01         1.00000E+00         1.08045E-11         4.61646E+01         2.97997E+00         4.31847E+01
+          2.36295E-02         3.58990E-03        -1.75657E-02         1.48468E+00         4.44884E-01         1.48478E+00         4.48466E+01         1.00000E+00         1.09442E-11         4.48466E+01         2.91315E+00         4.19334E+01
+          2.36295E-02         3.75973E-03        -1.76049E-02         1.48468E+00         4.55555E-01         1.48478E+00         4.35328E+01         1.00000E+00         1.10463E-11         4.35328E+01         2.84592E+00         4.06868E+01
+          2.36295E-02         3.92956E-03        -1.76459E-02         1.48468E+00         4.66225E-01         1.48478E+00         4.22248E+01         1.00000E+00         1.11089E-11         4.22248E+01         2.77835E+00         3.94464E+01
+          2.36295E-02         4.09939E-03        -1.76887E-02         1.48468E+00         4.76896E-01         1.48478E+00         4.09244E+01         1.00000E+00         1.11304E-11         4.09244E+01         2.71052E+00         3.82138E+01
+          2.36295E-02         4.26921E-03        -1.77333E-02         1.48467E+00         4.87567E-01         1.48478E+00         3.96330E+01         1.00000E+00         1.11095E-11         3.96330E+01         2.64253E+00         3.69905E+01
+          2.36295E-02         4.43904E-03        -1.77798E-02         1.48467E+00         4.98237E-01         1.48478E+00         3.83523E+01         1.00000E+00         1.10449E-11         3.83523E+01         2.57444E+00         3.57779E+01
+          2.36295E-02         4.60887E-03        -1.78280E-02         1.48467E+00         5.08908E-01         1.48478E+00         3.70838E+01         1.00000E+00         1.09363E-11         3.70838E+01         2.50635E+00         3.45774E+01
+          2.36295E-02         4.77869E-03        -1.78781E-02         1.48467E+00         5.19578E-01         1.48478E+00         3.58288E+01         1.00000E+00         1.07835E-11         3.58288E+01         2.43833E+00         3.33904E+01
+          2.36295E-02         4.94852E-03        -1.79300E-02         1.48467E+00         5.30249E-01         1.48478E+00         3.45886E+01         1.00000E+00         1.05873E-11         3.45886E+01         2.37047E+00         3.22182E+01
+          2.36295E-02         5.11835E-03        -1.79837E-02         1.48467E+00         5.40919E-01         1.48478E+00         3.33647E+01         1.00000E+00         1.03495E-11         3.33647E+01         2.30285E+00         3.10619E+01
+          2.36295E-02         5.28818E-03        -1.80392E-02         1.48467E+00         5.51590E-01         1.48478E+00         3.21583E+01         1.00000E+00         1.00731E-11         3.21583E+01         2.23556E+00         2.99227E+01
+          2.36295E-02         5.45800E-03        -1.80965E-02         1.48467E+00         5.62261E-01         1.48478E+00         3.09704E+01         1.00000E+00         9.76283E-12         3.09704E+01         2.16867E+00         2.88017E+01
+          2.36295E-02         5.62783E-03        -1.81556E-02         1.48466E+00         5.72931E-01         1.48478E+00         2.98022E+01         1.00000E+00         9.42598E-12         2.98022E+01         2.10228E+00         2.77000E+01
+          2.36295E-02         5.79766E-03        -1.82166E-02         1.48466E+00         5.83602E-01         1.48477E+00         2.86548E+01         1.00000E+00         9.07282E-12         2.86548E+01         2.03645E+00         2.66184E+01
+          2.36295E-02         5.96749E-03        -1.82793E-02         1.48466E+00         5.94272E-01         1.48477E+00         2.75292E+01         1.00000E+00         8.71775E-12         2.75292E+01         1.97127E+00         2.55579E+01
+          2.36295E-02         6.13731E-03        -1.83439E-02         1.48466E+00         6.04943E-01         1.48477E+00         2.64261E+01         1.00000E+00         8.38047E-12         2.64261E+01         1.90682E+00         2.45193E+01
+          2.36295E-02         6.30714E-03        -1.84103E-02         1.48466E+00         6.15613E-01         1.48477E+00         2.53465E+01         1.00000E+00         8.08689E-12         2.53465E+01         1.84318E+00         2.35033E+01
+          2.36295E-02         6.47697E-03        -1.84785E-02         1.48466E+00         6.26284E-01         1.48477E+00         2.42911E+01         1.00000E+00         7.86950E-12         2.42911E+01         1.78041E+00         2.25107E+01
+          2.36295E-02         6.64680E-03        -1.85485E-02         1.48465E+00         6.36955E-01         1.48477E+00         2.32606E+01         1.00000E+00         7.76604E-12         2.32606E+01         1.71860E+00         2.15420E+01
+          2.36295E-02         6.81662E-03        -1.86203E-02         1.48465E+00         6.47625E-01         1.48477E+00         2.22556E+01         1.00000E+00         7.81543E-12         2.22556E+01         1.65782E+00         2.05978E+01
+          2.36295E-02         6.98645E-03        -1.86939E-02         1.48465E+00         6.58296E-01         1.48477E+00         2.12767E+01         1.00000E+00         8.05143E-12         2.12767E+01         1.59814E+00         1.96786E+01
+          2.36295E-02         7.15628E-03        -1.87694E-02         1.48465E+00         6.68966E-01         1.48477E+00         2.03243E+01         1.00000E+00         8.49602E-12         2.03243E+01         1.53962E+00         1.87847E+01
+          2.36295E-02         7.32611E-03        -1.88466E-02         1.48465E+00         6.79637E-01         1.48477E+00         1.93990E+01         1.00000E+00         9.15619E-12         1.93990E+01         1.48233E+00         1.79166E+01
+          2.36295E-02         7.49593E-03        -1.89257E-02         1.48465E+00         6.90307E-01         1.48477E+00         1.85009E+01         1.00000E+00         1.00257E-11         1.85009E+01         1.42633E+00         1.70746E+01
+          2.36295E-02         7.66576E-03        -1.90065E-02         1.48464E+00         7.00978E-01         1.48477E+00         1.76304E+01         1.00000E+00         1.10898E-11         1.76304E+01         1.37169E+00         1.62587E+01
+          2.36295E-02         7.83559E-03        -1.90892E-02         1.48464E+00         7.11649E-01         1.48476E+00         1.67878E+01         1.00000E+00         1.23306E-11         1.67878E+01         1.31846E+00         1.54693E+01
+          2.36295E-02         8.00542E-03        -1.91737E-02         1.48464E+00         7.22319E-01         1.48476E+00         1.59731E+01         1.00000E+00         1.37303E-11         1.59731E+01         1.26670E+00         1.47064E+01
+          2.36295E-02         8.17524E-03        -1.92600E-02         1.48464E+00         7.32990E-01         1.48476E+00         1.51865E+01         1.00000E+00         1.52728E-11         1.51865E+01         1.21646E+00         1.39701E+01
+          2.36295E-02         8.34507E-03        -1.93481E-02         1.48464E+00         7.43660E-01         1.48476E+00         1.44280E+01         1.00000E+00         1.69441E-11         1.44280E+01         1.16778E+00         1.32603E+01
+          2.36295E-02         8.51490E-03        -1.94381E-02         1.48463E+00         7.54331E-01         1.48476E+00         1.36976E+01         1.00000E+00         1.87322E-11         1.36976E+01         1.12071E+00         1.25769E+01
+          2.36295E-02         8.68473E-03        -1.95298E-02         1.48463E+00         7.65001E-01         1.48476E+00         1.29952E+01         1.00000E+00         2.06267E-11         1.29952E+01         1.07529E+00         1.19199E+01
+          2.36295E-02         8.85455E-03        -1.96234E-02         1.48463E+00         7.75672E-01         1.48476E+00         1.23206E+01         1.00000E+00         2.26183E-11         1.23206E+01         1.03156E+00         1.12891E+01
+          2.36295E-02         9.02438E-03        -1.97187E-02         1.48463E+00         7.86343E-01         1.48476E+00         1.16738E+01         1.00000E+00         2.46984E-11         1.16738E+01         9.89547E-01         1.06842E+01
+          2.36295E-02         9.19421E-03        -1.98159E-02         1.48462E+00         7.97013E-01         1.48476E+00         1.10543E+01         1.00000E+00         2.68588E-11         1.10543E+01         9.49290E-01         1.01050E+01
+          2.36295E-02         9.36403E-03        -1.99149E-02         1.48462E+00         8.07684E-01         1.48476E+00         1.04620E+01         1.00000E+00         2.90917E-11         1.04620E+01         9.10812E-01         9.55121E+00
+          2.36295E-02         9.53386E-03        -2.00157E-02         1.48462E+00         8.18354E-01         1.48476E+00         9.89655E+00         1.00000E+00         3.13889E-11         9.89655E+00         8.74134E-01         9.02242E+00
+          2.36295E-02         9.70369E-03        -2.01183E-02         1.48462E+00         8.29025E-01         1.48475E+00         9.35753E+00         1.00000E+00         3.37422E-11         9.35753E+00         8.39274E-01         8.51825E+00
+          2.36295E-02         9.87352E-03        -2.02227E-02         1.48462E+00         8.39695E-01         1.48475E+00         8.84454E+00         1.00000E+00         3.61431E-11         8.84454E+00         8.06246E-01         8.03829E+00
+          2.36295E-02         1.00433E-02        -2.03290E-02         1.48461E+00         8.50366E-01         1.48475E+00         8.35713E+00         1.00000E+00         3.85827E-11         8.35713E+00         7.75059E-01         7.58207E+00
+          2.36295E-02         1.02132E-02        -2.04370E-02         1.48461E+00         8.61037E-01         1.48475E+00         7.89483E+00         1.00000E+00         4.10516E-11         7.89483E+00         7.45721E-01         7.14911E+00
+          2.36295E-02         1.03830E-02        -2.05469E-02         1.48461E+00         8.71707E-01         1.48475E+00         7.45710E+00         1.00000E+00         4.35399E-11         7.45710E+00         7.18231E-01         6.73886E+00
+          2.36295E-02         1.05528E-02        -2.06586E-02         1.48460E+00         8.82378E-01         1.48475E+00         7.04339E+00         1.00000E+00         4.60371E-11         7.04339E+00         6.92588E-01         6.35081E+00
+          2.36295E-02         1.07227E-02        -2.07720E-02         1.48460E+00         8.93048E-01         1.48475E+00         6.65314E+00         1.00000E+00         4.85321E-11         6.65314E+00         6.68784E-01         5.98436E+00
+          2.36295E-02         1.08925E-02        -2.08873E-02         1.48460E+00         9.03719E-01         1.48475E+00         6.28574E+00         1.00000E+00         5.10134E-11         6.28574E+00         6.46810E-01         5.63893E+00
+          2.36295E-02         1.10623E-02        -2.10045E-02         1.48460E+00         9.14389E-01         1.48475E+00         5.94055E+00         1.00000E+00         5.34685E-11         5.94055E+00         6.26649E-01         5.31390E+00
+          2.36295E-02         1.12321E-02        -2.11234E-02         1.48459E+00         9.25060E-01         1.48474E+00         5.61695E+00         1.00000E+00         5.58847E-11         5.61695E+00         6.08283E-01         5.00866E+00
+          2.36295E-02         1.14020E-02        -2.12441E-02         1.48459E+00         9.35731E-01         1.48474E+00         5.31425E+00         1.00000E+00         5.82486E-11         5.31425E+00         5.91689E-01         4.72256E+00
+          2.36295E-02         1.15718E-02        -2.13667E-02         1.48459E+00         9.46401E-01         1.48474E+00         5.03179E+00         1.00000E+00         6.05463E-11         5.03179E+00         5.76841E-01         4.45495E+00
+          2.36295E-02         1.17416E-02        -2.14910E-02         1.48459E+00         9.57072E-01         1.48474E+00         4.76888E+00         1.00000E+00         6.27633E-11         4.76888E+00         5.63708E-01         4.20517E+00
+          2.36295E-02         1.19114E-02        -2.16172E-02         1.48458E+00         9.67742E-01         1.48474E+00         4.52480E+00         1.00000E+00         6.48848E-11         4.52480E+00         5.52255E-01         3.97254E+00
+          2.36295E-02         1.20813E-02        -2.17452E-02         1.48458E+00         9.78413E-01         1.48474E+00         4.29885E+00         1.00000E+00         6.68959E-11         4.29885E+00         5.42445E-01         3.75640E+00
+          2.36295E-02         1.22511E-02        -2.18750E-02         1.48458E+00         9.89083E-01         1.48474E+00         4.09031E+00         1.00000E+00         6.87813E-11         4.09031E+00         5.34236E-01         3.55608E+00
+          2.36295E-02         1.24209E-02        -2.20066E-02         1.48457E+00         9.99754E-01         1.48474E+00         3.89847E+00         1.00000E+00         7.05257E-11         3.89847E+00         5.27584E-01         3.37088E+00
+          2.36295E-02         1.25908E-02        -2.21400E-02         1.48457E+00         1.01042E+00         1.48474E+00         3.72259E+00         1.00000E+00         7.21141E-11         3.72259E+00         5.22442E-01         3.20015E+00
+          2.36295E-02         1.27606E-02        -2.22752E-02         1.48457E+00         1.02110E+00         1.48473E+00         3.56195E+00         1.00000E+00         7.35317E-11         3.56195E+00         5.18758E-01         3.04320E+00
+          2.36295E-02         1.29304E-02        -2.24123E-02         1.48456E+00         1.03177E+00         1.48473E+00         3.41584E+00         1.00000E+00         7.47645E-11         3.41584E+00         5.16478E-01         2.89936E+00
+          2.36295E-02         1.31002E-02        -2.25511E-02         1.48456E+00         1.04244E+00         1.48473E+00         3.28354E+00         1.00000E+00         7.57996E-11         3.28354E+00         5.15547E-01         2.76799E+00
+          2.36295E-02         1.32701E-02        -2.26918E-02         1.48456E+00         1.05311E+00         1.48473E+00         3.16432E+00         1.00000E+00         7.66254E-11         3.16432E+00         5.15906E-01         2.64842E+00
+          2.36295E-02         1.34399E-02        -2.28342E-02         1.48455E+00         1.06378E+00         1.48473E+00         3.05750E+00         1.00000E+00         7.72324E-11         3.05750E+00         5.17493E-01         2.54001E+00
+          2.36295E-02         1.36097E-02        -2.29785E-02         1.48455E+00         1.07445E+00         1.48473E+00         2.96237E+00         1.00000E+00         7.76137E-11         2.96237E+00         5.20245E-01         2.44212E+00
+          2.36295E-02         1.37795E-02        -2.31246E-02         1.48455E+00         1.08512E+00         1.48473E+00         2.87824E+00         1.00000E+00         7.77661E-11         2.87824E+00         5.24097E-01         2.35414E+00
+          2.36295E-02         1.39494E-02        -2.32726E-02         1.48454E+00         1.09579E+00         1.48473E+00         2.80444E+00         1.00000E+00         7.76905E-11         2.80444E+00         5.28982E-01         2.27546E+00
+          2.36295E-02         1.41192E-02        -2.34223E-02         1.48454E+00         1.10646E+00         1.48472E+00         2.74031E+00         1.00000E+00         7.73939E-11         2.74031E+00         5.34831E-01         2.20548E+00
+          2.36295E-02         1.42890E-02        -2.35738E-02         1.48454E+00         1.11713E+00         1.48472E+00         2.68519E+00         1.00000E+00         7.68908E-11         2.68519E+00         5.41575E-01         2.14362E+00
+          2.36295E-02         1.44589E-02        -2.37272E-02         1.48453E+00         1.12780E+00         1.48472E+00         2.63846E+00         1.00000E+00         7.62047E-11         2.63846E+00         5.49142E-01         2.08932E+00
+          2.36295E-02         1.46287E-02        -2.38823E-02         1.48453E+00         1.13847E+00         1.48472E+00         2.59949E+00         1.00000E+00         7.53713E-11         2.59949E+00         5.57461E-01         2.04203E+00
+          2.36295E-02         1.47985E-02        -2.40393E-02         1.48453E+00         1.14914E+00         1.48472E+00         2.56768E+00         1.00000E+00         7.44406E-11         2.56768E+00         5.66460E-01         2.00122E+00
+          2.36295E-02         1.49683E-02        -2.41981E-02         1.48452E+00         1.15981E+00         1.48472E+00         2.54246E+00         1.00000E+00         7.34802E-11         2.54246E+00         5.76065E-01         1.96639E+00
+          2.36295E-02         1.51382E-02        -2.43587E-02         1.48452E+00         1.17048E+00         1.48472E+00         2.52324E+00         1.00000E+00         7.25789E-11         2.52324E+00         5.86204E-01         1.93703E+00
+          2.36295E-02         1.53080E-02        -2.45211E-02         1.48451E+00         1.18115E+00         1.48472E+00         2.50948E+00         1.00000E+00         7.18480E-11         2.50948E+00         5.96804E-01         1.91268E+00
+          2.36295E-02         1.54778E-02        -2.46853E-02         1.48451E+00         1.19182E+00         1.48471E+00         2.50066E+00         1.00000E+00         7.14233E-11         2.50066E+00         6.07791E-01         1.89287E+00
+          2.36295E-02         1.56476E-02        -2.48514E-02         1.48451E+00         1.20249E+00         1.48471E+00         2.49627E+00         1.00000E+00         7.14613E-11         2.49627E+00         6.19094E-01         1.87718E+00
+          2.36295E-02         1.58175E-02        -2.50192E-02         1.48450E+00         1.21317E+00         1.48471E+00         2.49582E+00         1.00000E+00         7.21332E-11         2.49582E+00         6.30641E-01         1.86517E+00
+          2.36295E-02         1.59873E-02        -2.51889E-02         1.48450E+00         1.22384E+00         1.48471E+00         2.49883E+00         1.00000E+00         7.36111E-11         2.49883E+00         6.42361E-01         1.85647E+00
+          2.36295E-02         1.61571E-02        -2.53604E-02         1.48449E+00         1.23451E+00         1.48471E+00         2.50486E+00         1.00000E+00         7.60529E-11         2.50486E+00         6.54184E-01         1.85068E+00
+          2.36295E-02         1.63270E-02        -2.55336E-02         1.48449E+00         1.24518E+00         1.48471E+00         2.51348E+00         1.00000E+00         7.95850E-11         2.51348E+00         6.66042E-01         1.84744E+00
+          2.36295E-02         1.64968E-02        -2.57087E-02         1.48449E+00         1.25585E+00         1.48471E+00         2.52430E+00         1.00000E+00         8.42913E-11         2.52430E+00         6.77868E-01         1.84643E+00
+          2.36295E-02         1.66666E-02        -2.58857E-02         1.48448E+00         1.26652E+00         1.48471E+00         2.53691E+00         1.00000E+00         9.02100E-11         2.53691E+00         6.89596E-01         1.84731E+00
+          2.36295E-02         1.68364E-02        -2.60644E-02         1.48448E+00         1.27719E+00         1.48471E+00         2.55095E+00         1.00000E+00         9.73390E-11         2.55095E+00         7.01163E-01         1.84979E+00
+          2.36295E-02         1.70063E-02        -2.62449E-02         1.48447E+00         1.28786E+00         1.48470E+00         2.56608E+00         1.00000E+00         1.05645E-10         2.56608E+00         7.12508E-01         1.85357E+00
+          2.36295E-02         1.71761E-02        -2.64273E-02         1.48447E+00         1.29853E+00         1.48470E+00         2.58197E+00         1.00000E+00         1.15075E-10         2.58197E+00         7.23572E-01         1.85840E+00
+          2.36295E-02         1.73459E-02        -2.66114E-02         1.48446E+00         1.30920E+00         1.48470E+00         2.59833E+00         1.00000E+00         1.25564E-10         2.59833E+00         7.34296E-01         1.86403E+00
+          2.36295E-02         1.75158E-02        -2.67974E-02         1.48446E+00         1.31987E+00         1.48470E+00         2.61485E+00         1.00000E+00         1.37046E-10         2.61485E+00         7.44628E-01         1.87022E+00
+          2.36295E-02         1.76856E-02        -2.69852E-02         1.48446E+00         1.33054E+00         1.48470E+00         2.63128E+00         1.00000E+00         1.49450E-10         2.63128E+00         7.54514E-01         1.87677E+00
+          2.36295E-02         1.78554E-02        -2.71748E-02         1.48445E+00         1.34121E+00         1.48470E+00         2.64737E+00         1.00000E+00         1.62709E-10         2.64737E+00         7.63906E-01         1.88347E+00
+          2.36295E-02         1.80252E-02        -2.73662E-02         1.48445E+00         1.35188E+00         1.48470E+00         2.66290E+00         1.00000E+00         1.76755E-10         2.66290E+00         7.72758E-01         1.89014E+00
+          2.36295E-02         1.81951E-02        -2.75594E-02         1.48444E+00         1.36255E+00         1.48470E+00         2.67764E+00         1.00000E+00         1.91522E-10         2.67764E+00         7.81025E-01         1.89662E+00
+          2.36295E-02         1.83649E-02        -2.77545E-02         1.48444E+00         1.37322E+00         1.48470E+00         2.69141E+00         1.00000E+00         2.06944E-10         2.69141E+00         7.88668E-01         1.90275E+00
+          2.36295E-02         1.85347E-02        -2.79513E-02         1.48443E+00         1.38389E+00         1.48470E+00         2.70404E+00         1.00000E+00         2.22954E-10         2.70404E+00         7.95649E-01         1.90839E+00
+          2.36295E-02         1.87045E-02        -2.81500E-02         1.48443E+00         1.39457E+00         1.48469E+00         2.71537E+00         1.00000E+00         2.39485E-10         2.71537E+00         8.01934E-01         1.91343E+00
+          2.36295E-02         1.88744E-02        -2.83504E-02         1.48442E+00         1.40524E+00         1.48469E+00         2.72524E+00         1.00000E+00         2.56467E-10         2.72524E+00         8.07492E-01         1.91775E+00
+          2.36295E-02         1.90442E-02        -2.85527E-02         1.48442E+00         1.41591E+00         1.48469E+00         2.73355E+00         1.00000E+00         2.73827E-10         2.73355E+00         8.12295E-01         1.92125E+00
+          2.36295E-02         1.92140E-02        -2.87568E-02         1.48441E+00         1.42658E+00         1.48469E+00         2.74017E+00         1.00000E+00         2.91490E-10         2.74017E+00         8.16320E-01         1.92385E+00
+          2.36295E-02         1.93839E-02        -2.89627E-02         1.48441E+00         1.43725E+00         1.48469E+00         2.74501E+00         1.00000E+00         3.09378E-10         2.74501E+00         8.19544E-01         1.92547E+00
+          2.36295E-02         1.95537E-02        -2.91705E-02         1.48440E+00         1.44792E+00         1.48469E+00         2.74799E+00         1.00000E+00         3.27409E-10         2.74799E+00         8.21951E-01         1.92604E+00
+          2.36295E-02         1.97235E-02        -2.93800E-02         1.48440E+00         1.45859E+00         1.48469E+00         2.74904E+00         1.00000E+00         3.45496E-10         2.74904E+00         8.23525E-01         1.92551E+00
+          2.36295E-02         1.98933E-02        -2.95913E-02         1.48439E+00         1.46926E+00         1.48469E+00         2.74809E+00         1.00000E+00         3.63551E-10         2.74809E+00         8.24256E-01         1.92384E+00
+          2.36295E-02         2.00632E-02        -2.98045E-02         1.48439E+00         1.47993E+00         1.48469E+00         2.74512E+00         1.00000E+00         3.81481E-10         2.74512E+00         8.24136E-01         1.92099E+00
+          2.36295E-02         2.02330E-02        -3.00195E-02         1.48438E+00         1.49060E+00         1.48469E+00         2.74008E+00         1.00000E+00         3.99190E-10         2.74008E+00         8.23159E-01         1.91693E+00
+          2.36295E-02         2.04028E-02        -3.02363E-02         1.48438E+00         1.50127E+00         1.48469E+00         2.73296E+00         1.00000E+00         4.16580E-10         2.73296E+00         8.21325E-01         1.91164E+00
+          2.36295E-02         2.05726E-02        -3.04549E-02         1.48437E+00         1.51194E+00         1.48469E+00         2.72375E+00         1.00000E+00         4.33548E-10         2.72375E+00         8.18635E-01         1.90511E+00
+          2.36295E-02         2.07425E-02        -3.06753E-02         1.48437E+00         1.52261E+00         1.48469E+00         2.71243E+00         1.00000E+00         4.49993E-10         2.71243E+00         8.15093E-01         1.89734E+00
+          2.36295E-02         2.09123E-02        -3.08975E-02         1.48436E+00         1.53328E+00         1.48468E+00         2.69903E+00         1.00000E+00         4.65807E-10         2.69903E+00         8.10707E-01         1.88833E+00
+          2.36295E-02         2.10821E-02        -3.11215E-02         1.48436E+00         1.54395E+00         1.48468E+00         2.68356E+00         1.00000E+00         4.80888E-10         2.68356E+00         8.05488E-01         1.87808E+00
+          2.36295E-02         2.12520E-02        -3.13474E-02         1.48435E+00         1.55462E+00         1.48468E+00         2.66605E+00         1.00000E+00         4.95129E-10         2.66605E+00         7.99448E-01         1.86660E+00
+          2.36295E-02         2.14218E-02        -3.15751E-02         1.48435E+00         1.56529E+00         1.48468E+00         2.64653E+00         1.00000E+00         5.08427E-10         2.64653E+00         7.92604E-01         1.85393E+00
+          2.36295E-02         2.15916E-02        -3.18045E-02         1.48434E+00         1.57596E+00         1.48468E+00         2.62504E+00         1.00000E+00         5.20682E-10         2.62504E+00         7.84974E-01         1.84007E+00
+          2.36295E-02         2.17614E-02        -3.20358E-02         1.48434E+00         1.58664E+00         1.48468E+00         2.60164E+00         1.00000E+00         5.31800E-10         2.60164E+00         7.76578E-01         1.82506E+00
+          2.36295E-02         2.19313E-02        -3.22689E-02         1.48433E+00         1.59731E+00         1.48468E+00         2.57637E+00         1.00000E+00         5.41689E-10         2.57637E+00         7.67440E-01         1.80893E+00
+          2.36295E-02         2.21011E-02        -3.25039E-02         1.48432E+00         1.60798E+00         1.48468E+00         2.54930E+00         1.00000E+00         5.50271E-10         2.54930E+00         7.57585E-01         1.79171E+00
+          2.36295E-02         2.22709E-02        -3.27406E-02         1.48432E+00         1.61865E+00         1.48468E+00         2.52049E+00         1.00000E+00         5.57477E-10         2.52049E+00         7.47039E-01         1.77345E+00
+          2.36295E-02         2.24407E-02        -3.29791E-02         1.48431E+00         1.62932E+00         1.48468E+00         2.49001E+00         1.00000E+00         5.63253E-10         2.49001E+00         7.35833E-01         1.75418E+00
+          2.36295E-02         2.26106E-02        -3.32195E-02         1.48431E+00         1.63999E+00         1.48468E+00         2.45795E+00         1.00000E+00         5.67564E-10         2.45795E+00         7.23997E-01         1.73395E+00
+          2.36295E-02         2.27804E-02        -3.34616E-02         1.48430E+00         1.65066E+00         1.48468E+00         2.42437E+00         1.00000E+00         5.70398E-10         2.42437E+00         7.11564E-01         1.71281E+00
+          2.36295E-02         2.29502E-02        -3.37056E-02         1.48430E+00         1.66133E+00         1.48468E+00         2.38937E+00         1.00000E+00         5.71774E-10         2.38937E+00         6.98567E-01         1.69081E+00
+          2.36295E-02         2.31201E-02        -3.39514E-02         1.48429E+00         1.67200E+00         1.48468E+00         2.35303E+00         1.00000E+00         5.71744E-10         2.35303E+00         6.85040E-01         1.66799E+00
+          2.36295E-02         2.32899E-02        -3.41990E-02         1.48428E+00         1.68267E+00         1.48468E+00         2.31544E+00         1.00000E+00         5.70404E-10         2.31544E+00         6.71022E-01         1.64442E+00
+          2.36295E-02         2.34597E-02        -3.44485E-02         1.48428E+00         1.69334E+00         1.48468E+00         2.27670E+00         1.00000E+00         5.67906E-10         2.27670E+00         6.56548E-01         1.62015E+00
+          2.36295E-02         2.36295E-02        -3.46997E-02         1.48427E+00         1.70401E+00         1.48468E+00         2.23689E+00         1.00000E+00         5.64460E-10         2.23689E+00         6.41656E-01         1.59524E+00
+          2.36295E-02         2.37994E-02        -3.49527E-02         1.48427E+00         1.71468E+00         1.48468E+00         2.19612E+00         1.00000E+00         5.60356E-10         2.19612E+00         6.26386E-01         1.56974E+00
+          2.36295E-02         2.39692E-02        -3.52076E-02         1.48426E+00         1.72535E+00         1.48468E+00         2.15449E+00         1.00000E+00         5.55968E-10         2.15449E+00         6.10775E-01         1.54371E+00
+          2.36295E-02         2.41390E-02        -3.54643E-02         1.48425E+00         1.73602E+00         1.48468E+00         2.11208E+00         1.00000E+00         5.51772E-10         2.11208E+00         5.94864E-01         1.51722E+00
+          2.36295E-02         2.43088E-02        -3.57228E-02         1.48425E+00         1.74669E+00         1.48468E+00         2.06901E+00         1.00000E+00         5.48346E-10         2.06901E+00         5.78692E-01         1.49032E+00
+          2.36295E-02         2.44787E-02        -3.59831E-02         1.48424E+00         1.75736E+00         1.48468E+00         2.02538E+00         1.00000E+00         5.46380E-10         2.02538E+00         5.62299E-01         1.46308E+00
+          2.36295E-02         2.46485E-02        -3.62452E-02         1.48424E+00         1.76804E+00         1.48468E+00         1.98128E+00         1.00000E+00         5.46659E-10         1.98128E+00         5.45723E-01         1.43556E+00
+          2.36295E-02         2.48183E-02        -3.65091E-02         1.48423E+00         1.77871E+00         1.48468E+00         1.93683E+00         1.00000E+00         5.50041E-10         1.93683E+00         5.29005E-01         1.40782E+00
+          2.36295E-02         2.49882E-02        -3.67748E-02         1.48422E+00         1.78938E+00         1.48468E+00         1.89211E+00         1.00000E+00         5.57414E-10         1.89211E+00         5.12182E-01         1.37993E+00
+          2.36295E-02         2.51580E-02        -3.70424E-02         1.48422E+00         1.80005E+00         1.48468E+00         1.84724E+00         1.00000E+00         5.69629E-10         1.84724E+00         4.95294E-01         1.35195E+00
+          2.36295E-02         2.53278E-02        -3.73118E-02         1.48421E+00         1.81072E+00         1.48468E+00         1.80231E+00         1.00000E+00         5.87441E-10         1.80231E+00         4.78377E-01         1.32393E+00
+          2.36295E-02         2.54976E-02        -3.75829E-02         1.48420E+00         1.82139E+00         1.48468E+00         1.75742E+00         1.00000E+00         6.11439E-10         1.75742E+00         4.61469E-01         1.29595E+00
+          2.36295E-02         2.56675E-02        -3.78559E-02         1.48420E+00         1.83206E+00         1.48468E+00         1.71267E+00         1.00000E+00         6.42011E-10         1.71267E+00         4.44605E-01         1.26807E+00
+          2.36295E-02         2.58373E-02        -3.81307E-02         1.48419E+00         1.84273E+00         1.48468E+00         1.66816E+00         1.00000E+00         6.79329E-10         1.66816E+00         4.27821E-01         1.24034E+00
+          2.36295E-02         2.60071E-02        -3.84074E-02         1.48419E+00         1.85340E+00         1.48468E+00         1.62398E+00         1.00000E+00         7.23367E-10         1.62398E+00         4.11150E-01         1.21283E+00
+          2.36295E-02         2.61769E-02        -3.86858E-02         1.48418E+00         1.86407E+00         1.48468E+00         1.58023E+00         1.00000E+00         7.73938E-10         1.58023E+00         3.94625E-01         1.18561E+00
+          2.37994E-02         8.72665E-04        -1.74379E-02         1.49536E+00         2.74155E-01         1.49546E+00         6.37960E+01         1.00000E+00         3.54242E-12         6.37960E+01         3.88554E+00         5.99104E+01
+          2.37994E-02         1.04249E-03        -1.74481E-02         1.49536E+00         2.84826E-01         1.49546E+00         6.26631E+01         1.00000E+00         3.94436E-12         6.26631E+01         3.83515E+00         5.88280E+01
+          2.37994E-02         1.21232E-03        -1.74602E-02         1.49536E+00         2.95496E-01         1.49546E+00         6.15066E+01         1.00000E+00         4.42125E-12         6.15066E+01         3.78329E+00         5.77233E+01
+          2.37994E-02         1.38215E-03        -1.74740E-02         1.49536E+00         3.06167E-01         1.49546E+00         6.03284E+01         1.00000E+00         4.94198E-12         6.03284E+01         3.73001E+00         5.65984E+01
+          2.37994E-02         1.55197E-03        -1.74897E-02         1.49536E+00         3.16838E-01         1.49546E+00         5.91303E+01         1.00000E+00         5.48374E-12         5.91303E+01         3.67536E+00         5.54549E+01
+          2.37994E-02         1.72180E-03        -1.75071E-02         1.49536E+00         3.27508E-01         1.49546E+00         5.79143E+01         1.00000E+00         6.03001E-12         5.79143E+01         3.61941E+00         5.42949E+01
+          2.37994E-02         1.89163E-03        -1.75264E-02         1.49536E+00         3.38179E-01         1.49546E+00         5.66822E+01         1.00000E+00         6.56849E-12         5.66822E+01         3.56221E+00         5.31200E+01
+          2.37994E-02         2.06146E-03        -1.75475E-02         1.49536E+00         3.48849E-01         1.49546E+00         5.54360E+01         1.00000E+00         7.08969E-12         5.54360E+01         3.50382E+00         5.19322E+01
+          2.37994E-02         2.23128E-03        -1.75704E-02         1.49535E+00         3.59520E-01         1.49546E+00         5.41776E+01         1.00000E+00         7.58598E-12         5.41776E+01         3.44430E+00         5.07333E+01
+          2.37994E-02         2.40111E-03        -1.75951E-02         1.49535E+00         3.70190E-01         1.49546E+00         5.29089E+01         1.00000E+00         8.05095E-12         5.29089E+01         3.38372E+00         4.95251E+01
+          2.37994E-02         2.57094E-03        -1.76216E-02         1.49535E+00         3.80861E-01         1.49546E+00         5.16317E+01         1.00000E+00         8.47911E-12         5.16317E+01         3.32215E+00         4.83096E+01
+          2.37994E-02         2.74077E-03        -1.76499E-02         1.49535E+00         3.91532E-01         1.49546E+00         5.03480E+01         1.00000E+00         8.86559E-12         5.03480E+01         3.25965E+00         4.70884E+01
+          2.37994E-02         2.91059E-03        -1.76801E-02         1.49535E+00         4.02202E-01         1.49546E+00         4.90596E+01         1.00000E+00         9.20603E-12         4.90596E+01         3.19628E+00         4.58633E+01
+          2.37994E-02         3.08042E-03        -1.77120E-02         1.49535E+00         4.12873E-01         1.49546E+00         4.77683E+01         1.00000E+00         9.49648E-12         4.77683E+01         3.13213E+00         4.46362E+01
+          2.37994E-02         3.25025E-03        -1.77458E-02         1.49535E+00         4.23543E-01         1.49546E+00         4.64760E+01         1.00000E+00         9.73333E-12         4.64760E+01         3.06727E+00         4.34087E+01
+          2.37994E-02         3.42008E-03        -1.77814E-02         1.49535E+00         4.34214E-01         1.49546E+00         4.51844E+01         1.00000E+00         9.91331E-12         4.51844E+01         3.00176E+00         4.21826E+01
+          2.37994E-02         3.58990E-03        -1.78188E-02         1.49535E+00         4.44884E-01         1.49545E+00         4.38951E+01         1.00000E+00         1.00335E-11         4.38951E+01         2.93569E+00         4.09594E+01
+          2.37994E-02         3.75973E-03        -1.78580E-02         1.49535E+00         4.55555E-01         1.49545E+00         4.26100E+01         1.00000E+00         1.00912E-11         4.26100E+01         2.86913E+00         3.97409E+01
+          2.37994E-02         3.92956E-03        -1.78990E-02         1.49535E+00         4.66225E-01         1.49545E+00         4.13306E+01         1.00000E+00         1.00842E-11         4.13306E+01         2.80215E+00         3.85285E+01
+          2.37994E-02         4.09939E-03        -1.79418E-02         1.49535E+00         4.76896E-01         1.49545E+00         4.00586E+01         1.00000E+00         1.00106E-11         4.00586E+01         2.73485E+00         3.73238E+01
+          2.37994E-02         4.26921E-03        -1.79864E-02         1.49534E+00         4.87567E-01         1.49545E+00         3.87955E+01         1.00000E+00         9.86917E-12         3.87955E+01         2.66729E+00         3.61282E+01
+          2.37994E-02         4.43904E-03        -1.80329E-02         1.49534E+00         4.98237E-01         1.49545E+00         3.75428E+01         1.00000E+00         9.65911E-12         3.75428E+01         2.59956E+00         3.49432E+01
+          2.37994E-02         4.60887E-03        -1.80812E-02         1.49534E+00         5.08908E-01         1.49545E+00         3.63019E+01         1.00000E+00         9.38053E-12         3.63019E+01         2.53173E+00         3.37702E+01
+          2.37994E-02         4.77869E-03        -1.81312E-02         1.49534E+00         5.19578E-01         1.49545E+00         3.50743E+01         1.00000E+00         9.03461E-12         3.50743E+01         2.46389E+00         3.26104E+01
+          2.37994E-02         4.94852E-03        -1.81831E-02         1.49534E+00         5.30249E-01         1.49545E+00         3.38613E+01         1.00000E+00         8.62408E-12         3.38613E+01         2.39613E+00         3.14652E+01
+          2.37994E-02         5.11835E-03        -1.82368E-02         1.49534E+00         5.40919E-01         1.49545E+00         3.26641E+01         1.00000E+00         8.15390E-12         3.26641E+01         2.32852E+00         3.03356E+01
+          2.37994E-02         5.28818E-03        -1.82923E-02         1.49534E+00         5.51590E-01         1.49545E+00         3.14839E+01         1.00000E+00         7.63243E-12         3.14839E+01         2.26114E+00         2.92228E+01
+          2.37994E-02         5.45800E-03        -1.83496E-02         1.49534E+00         5.62261E-01         1.49545E+00         3.03220E+01         1.00000E+00         7.07331E-12         3.03220E+01         2.19408E+00         2.81279E+01
+          2.37994E-02         5.62783E-03        -1.84088E-02         1.49533E+00         5.72931E-01         1.49545E+00         2.91793E+01         1.00000E+00         6.49851E-12         2.91793E+01         2.12742E+00         2.70519E+01
+          2.37994E-02         5.79766E-03        -1.84697E-02         1.49533E+00         5.83602E-01         1.49545E+00         2.80569E+01         1.00000E+00         5.94315E-12         2.80569E+01         2.06123E+00         2.59957E+01
+          2.37994E-02         5.96749E-03        -1.85325E-02         1.49533E+00         5.94272E-01         1.49545E+00         2.69557E+01         1.00000E+00         5.46184E-12         2.69557E+01         1.99561E+00         2.49601E+01
+          2.37994E-02         6.13731E-03        -1.85970E-02         1.49533E+00         6.04943E-01         1.49545E+00         2.58767E+01         1.00000E+00         5.13317E-12         2.58767E+01         1.93062E+00         2.39460E+01
+          2.37994E-02         6.30714E-03        -1.86634E-02         1.49533E+00         6.15613E-01         1.49544E+00         2.48205E+01         1.00000E+00         5.05136E-12         2.48205E+01         1.86635E+00         2.29542E+01
+          2.37994E-02         6.47697E-03        -1.87316E-02         1.49533E+00         6.26284E-01         1.49544E+00         2.37880E+01         1.00000E+00         5.29409E-12         2.37880E+01         1.80287E+00         2.19852E+01
+          2.37994E-02         6.64680E-03        -1.88016E-02         1.49533E+00         6.36955E-01         1.49544E+00         2.27799E+01         1.00000E+00         5.88448E-12         2.27799E+01         1.74027E+00         2.10396E+01
+          2.37994E-02         6.81662E-03        -1.88734E-02         1.49532E+00         6.47625E-01         1.49544E+00         2.17967E+01         1.00000E+00         6.78997E-12         2.17967E+01         1.67860E+00         2.01181E+01
+          2.37994E-02         6.98645E-03        -1.89470E-02         1.49532E+00         6.58296E-01         1.49544E+00         2.08390E+01         1.00000E+00         7.95506E-12         2.08390E+01         1.61795E+00         1.92210E+01
+          2.37994E-02         7.15628E-03        -1.90225E-02         1.49532E+00         6.68966E-01         1.49544E+00         1.99072E+01         1.00000E+00         9.32855E-12         1.99072E+01         1.55839E+00         1.83488E+01
+          2.37994E-02         7.32611E-03        -1.90997E-02         1.49532E+00         6.79637E-01         1.49544E+00         1.90018E+01         1.00000E+00         1.08719E-11         1.90018E+01         1.49998E+00         1.75018E+01
+          2.37994E-02         7.49593E-03        -1.91788E-02         1.49532E+00         6.90307E-01         1.49544E+00         1.81231E+01         1.00000E+00         1.25580E-11         1.81231E+01         1.44279E+00         1.66803E+01
+          2.37994E-02         7.66576E-03        -1.92596E-02         1.49531E+00         7.00978E-01         1.49544E+00         1.72713E+01         1.00000E+00         1.43674E-11         1.72713E+01         1.38688E+00         1.58844E+01
+          2.37994E-02         7.83559E-03        -1.93423E-02         1.49531E+00         7.11649E-01         1.49544E+00         1.64467E+01         1.00000E+00         1.62860E-11         1.64467E+01         1.33232E+00         1.51144E+01
+          2.37994E-02         8.00542E-03        -1.94268E-02         1.49531E+00         7.22319E-01         1.49544E+00         1.56495E+01         1.00000E+00         1.83026E-11         1.56495E+01         1.27916E+00         1.43703E+01
+          2.37994E-02         8.17524E-03        -1.95131E-02         1.49531E+00         7.32990E-01         1.49544E+00         1.48797E+01         1.00000E+00         2.04078E-11         1.48797E+01         1.22746E+00         1.36522E+01
+          2.37994E-02         8.34507E-03        -1.96012E-02         1.49531E+00         7.43660E-01         1.49543E+00         1.41373E+01         1.00000E+00         2.25932E-11         1.41373E+01         1.17727E+00         1.29601E+01
+          2.37994E-02         8.51490E-03        -1.96912E-02         1.49530E+00         7.54331E-01         1.49543E+00         1.34224E+01         1.00000E+00         2.48509E-11         1.34224E+01         1.12864E+00         1.22938E+01
+          2.37994E-02         8.68473E-03        -1.97829E-02         1.49530E+00         7.65001E-01         1.49543E+00         1.27348E+01         1.00000E+00         2.71730E-11         1.27348E+01         1.08161E+00         1.16532E+01
+          2.37994E-02         8.85455E-03        -1.98765E-02         1.49530E+00         7.75672E-01         1.49543E+00         1.20745E+01         1.00000E+00         2.95516E-11         1.20745E+01         1.03623E+00         1.10382E+01
+          2.37994E-02         9.02438E-03        -1.99718E-02         1.49530E+00         7.86343E-01         1.49543E+00         1.14411E+01         1.00000E+00         3.19786E-11         1.14411E+01         9.92533E-01         1.04486E+01
+          2.37994E-02         9.19421E-03        -2.00690E-02         1.49529E+00         7.97013E-01         1.49543E+00         1.08346E+01         1.00000E+00         3.44452E-11         1.08346E+01         9.50556E-01         9.88406E+00
+          2.37994E-02         9.36403E-03        -2.01680E-02         1.49529E+00         8.07684E-01         1.49543E+00         1.02546E+01         1.00000E+00         3.69424E-11         1.02546E+01         9.10329E-01         9.34428E+00
+          2.37994E-02         9.53386E-03        -2.02688E-02         1.49529E+00         8.18354E-01         1.49543E+00         9.70081E+00         1.00000E+00         3.94604E-11         9.70081E+00         8.71879E-01         8.82893E+00
+          2.37994E-02         9.70369E-03        -2.03714E-02         1.49529E+00         8.29025E-01         1.49543E+00         9.17283E+00         1.00000E+00         4.19890E-11         9.17283E+00         8.35230E-01         8.33760E+00
+          2.37994E-02         9.87352E-03        -2.04758E-02         1.49529E+00         8.39695E-01         1.49543E+00         8.67028E+00         1.00000E+00         4.45172E-11         8.67028E+00         8.00401E-01         7.86988E+00
+          2.37994E-02         1.00433E-02        -2.05821E-02         1.49528E+00         8.50366E-01         1.49542E+00         8.19273E+00         1.00000E+00         4.70332E-11         8.19273E+00         7.67406E-01         7.42532E+00
+          2.37994E-02         1.02132E-02        -2.06901E-02         1.49528E+00         8.61037E-01         1.49542E+00         7.73968E+00         1.00000E+00         4.95247E-11         7.73968E+00         7.36257E-01         7.00342E+00
+          2.37994E-02         1.03830E-02        -2.08000E-02         1.49528E+00         8.71707E-01         1.49542E+00         7.31064E+00         1.00000E+00         5.19785E-11         7.31064E+00         7.06960E-01         6.60368E+00
+          2.37994E-02         1.05528E-02        -2.09117E-02         1.49527E+00         8.82378E-01         1.49542E+00         6.90506E+00         1.00000E+00         5.43807E-11         6.90506E+00         6.79518E-01         6.22554E+00
+          2.37994E-02         1.07227E-02        -2.10252E-02         1.49527E+00         8.93048E-01         1.49542E+00         6.52239E+00         1.00000E+00         5.67167E-11         6.52239E+00         6.53929E-01         5.86846E+00
+          2.37994E-02         1.08925E-02        -2.11404E-02         1.49527E+00         9.03719E-01         1.49542E+00         6.16202E+00         1.00000E+00         5.89712E-11         6.16202E+00         6.30188E-01         5.53184E+00
+          2.37994E-02         1.10623E-02        -2.12576E-02         1.49527E+00         9.14389E-01         1.49542E+00         5.82337E+00         1.00000E+00         6.11281E-11         5.82337E+00         6.08284E-01         5.21508E+00
+          2.37994E-02         1.12321E-02        -2.13765E-02         1.49526E+00         9.25060E-01         1.49542E+00         5.50578E+00         1.00000E+00         6.31705E-11         5.50578E+00         5.88204E-01         4.91758E+00
+          2.37994E-02         1.14020E-02        -2.14972E-02         1.49526E+00         9.35731E-01         1.49542E+00         5.20863E+00         1.00000E+00         6.50813E-11         5.20863E+00         5.69930E-01         4.63870E+00
+          2.37994E-02         1.15718E-02        -2.16198E-02         1.49526E+00         9.46401E-01         1.49541E+00         4.93123E+00         1.00000E+00         6.68425E-11         4.93123E+00         5.53439E-01         4.37779E+00
+          2.37994E-02         1.17416E-02        -2.17441E-02         1.49526E+00         9.57072E-01         1.49541E+00         4.67292E+00         1.00000E+00         6.84357E-11         4.67292E+00         5.38705E-01         4.13422E+00
+          2.37994E-02         1.19114E-02        -2.18703E-02         1.49525E+00         9.67742E-01         1.49541E+00         4.43302E+00         1.00000E+00         6.98422E-11         4.43302E+00         5.25699E-01         3.90732E+00
+          2.37994E-02         1.20813E-02        -2.19983E-02         1.49525E+00         9.78413E-01         1.49541E+00         4.21083E+00         1.00000E+00         7.10430E-11         4.21083E+00         5.14388E-01         3.69644E+00
+          2.37994E-02         1.22511E-02        -2.21281E-02         1.49525E+00         9.89083E-01         1.49541E+00         4.00564E+00         1.00000E+00         7.20192E-11         4.00564E+00         5.04733E-01         3.50091E+00
+          2.37994E-02         1.24209E-02        -2.22597E-02         1.49524E+00         9.99754E-01         1.49541E+00         3.81677E+00         1.00000E+00         7.27520E-11         3.81677E+00         4.96694E-01         3.32008E+00
+          2.37994E-02         1.25908E-02        -2.23931E-02         1.49524E+00         1.01042E+00         1.49541E+00         3.64350E+00         1.00000E+00         7.32230E-11         3.64350E+00         4.90228E-01         3.15327E+00
+          2.37994E-02         1.27606E-02        -2.25283E-02         1.49524E+00         1.02110E+00         1.49541E+00         3.48513E+00         1.00000E+00         7.34148E-11         3.48513E+00         4.85286E-01         2.99985E+00
+          2.37994E-02         1.29304E-02        -2.26653E-02         1.49523E+00         1.03177E+00         1.49540E+00         3.34096E+00         1.00000E+00         7.33111E-11         3.34096E+00         4.81818E-01         2.85914E+00
+          2.37994E-02         1.31002E-02        -2.28042E-02         1.49523E+00         1.04244E+00         1.49540E+00         3.21029E+00         1.00000E+00         7.28976E-11         3.21029E+00         4.79771E-01         2.73051E+00
+          2.37994E-02         1.32701E-02        -2.29449E-02         1.49523E+00         1.05311E+00         1.49540E+00         3.09242E+00         1.00000E+00         7.21626E-11         3.09242E+00         4.79089E-01         2.61333E+00
+          2.37994E-02         1.34399E-02        -2.30873E-02         1.49522E+00         1.06378E+00         1.49540E+00         2.98667E+00         1.00000E+00         7.10983E-11         2.98667E+00         4.79713E-01         2.50695E+00
+          2.37994E-02         1.36097E-02        -2.32316E-02         1.49522E+00         1.07445E+00         1.49540E+00         2.89236E+00         1.00000E+00         6.97020E-11         2.89236E+00         4.81582E-01         2.41078E+00
+          2.37994E-02         1.37795E-02        -2.33777E-02         1.49522E+00         1.08512E+00         1.49540E+00         2.80882E+00         1.00000E+00         6.79783E-11         2.80882E+00         4.84632E-01         2.32419E+00
+          2.37994E-02         1.39494E-02        -2.35257E-02         1.49521E+00         1.09579E+00         1.49540E+00         2.73540E+00         1.00000E+00         6.59418E-11         2.73540E+00         4.88799E-01         2.24660E+00
+          2.37994E-02         1.41192E-02        -2.36754E-02         1.49521E+00         1.10646E+00         1.49540E+00         2.67146E+00         1.00000E+00         6.36213E-11         2.67146E+00         4.94014E-01         2.17744E+00
+          2.37994E-02         1.42890E-02        -2.38269E-02         1.49521E+00         1.11713E+00         1.49540E+00         2.61635E+00         1.00000E+00         6.10655E-11         2.61635E+00         5.00210E-01         2.11614E+00
+          2.37994E-02         1.44589E-02        -2.39803E-02         1.49520E+00         1.12780E+00         1.49539E+00         2.56947E+00         1.00000E+00         5.83507E-11         2.56947E+00         5.07316E-01         2.06215E+00
+          2.37994E-02         1.46287E-02        -2.41354E-02         1.49520E+00         1.13847E+00         1.49539E+00         2.53021E+00         1.00000E+00         5.55925E-11         2.53021E+00         5.15262E-01         2.01494E+00
+          2.37994E-02         1.47985E-02        -2.42924E-02         1.49519E+00         1.14914E+00         1.49539E+00         2.49798E+00         1.00000E+00         5.29586E-11         2.49798E+00         5.23974E-01         1.97401E+00
+          2.37994E-02         1.49683E-02        -2.44512E-02         1.49519E+00         1.15981E+00         1.49539E+00         2.47223E+00         1.00000E+00         5.06831E-11         2.47223E+00         5.33380E-01         1.93885E+00
+          2.37994E-02         1.51382E-02        -2.46118E-02         1.49519E+00         1.17048E+00         1.49539E+00         2.45240E+00         1.00000E+00         4.90722E-11         2.45240E+00         5.43407E-01         1.90900E+00
+          2.37994E-02         1.53080E-02        -2.47742E-02         1.49518E+00         1.18115E+00         1.49539E+00         2.43796E+00         1.00000E+00         4.84879E-11         2.43796E+00         5.53981E-01         1.88398E+00
+          2.37994E-02         1.54778E-02        -2.49384E-02         1.49518E+00         1.19182E+00         1.49539E+00         2.42840E+00         1.00000E+00         4.92928E-11         2.42840E+00         5.65028E-01         1.86337E+00
+          2.37994E-02         1.56476E-02        -2.51045E-02         1.49518E+00         1.20249E+00         1.49539E+00         2.42322E+00         1.00000E+00         5.17658E-11         2.42322E+00         5.76475E-01         1.84674E+00
+          2.37994E-02         1.58175E-02        -2.52723E-02         1.49517E+00         1.21317E+00         1.49538E+00         2.42194E+00         1.00000E+00         5.60328E-11         2.42194E+00         5.88250E-01         1.83369E+00
+          2.37994E-02         1.59873E-02        -2.54420E-02         1.49517E+00         1.22384E+00         1.49538E+00         2.42412E+00         1.00000E+00         6.20619E-11         2.42412E+00         6.00278E-01         1.82384E+00
+          2.37994E-02         1.61571E-02        -2.56134E-02         1.49516E+00         1.23451E+00         1.49538E+00         2.42932E+00         1.00000E+00         6.97180E-11         2.42932E+00         6.12490E-01         1.81683E+00
+          2.37994E-02         1.63270E-02        -2.57867E-02         1.49516E+00         1.24518E+00         1.49538E+00         2.43712E+00         1.00000E+00         7.88275E-11         2.43712E+00         6.24814E-01         1.81231E+00
+          2.37994E-02         1.64968E-02        -2.59618E-02         1.49515E+00         1.25585E+00         1.49538E+00         2.44713E+00         1.00000E+00         8.92218E-11         2.44713E+00         6.37181E-01         1.80995E+00
+          2.37994E-02         1.66666E-02        -2.61387E-02         1.49515E+00         1.26652E+00         1.49538E+00         2.45898E+00         1.00000E+00         1.00755E-10         2.45898E+00         6.49524E-01         1.80945E+00
+          2.37994E-02         1.68364E-02        -2.63175E-02         1.49515E+00         1.27719E+00         1.49538E+00         2.47230E+00         1.00000E+00         1.13306E-10         2.47230E+00         6.61775E-01         1.81053E+00
+          2.37994E-02         1.70063E-02        -2.64980E-02         1.49514E+00         1.28786E+00         1.49538E+00         2.48677E+00         1.00000E+00         1.26773E-10         2.48677E+00         6.73871E-01         1.81290E+00
+          2.37994E-02         1.71761E-02        -2.66803E-02         1.49514E+00         1.29853E+00         1.49538E+00         2.50207E+00         1.00000E+00         1.41071E-10         2.50207E+00         6.85750E-01         1.81632E+00
+          2.37994E-02         1.73459E-02        -2.68645E-02         1.49513E+00         1.30920E+00         1.49537E+00         2.51790E+00         1.00000E+00         1.56125E-10         2.51790E+00         6.97351E-01         1.82055E+00
+          2.37994E-02         1.75158E-02        -2.70505E-02         1.49513E+00         1.31987E+00         1.49537E+00         2.53399E+00         1.00000E+00         1.71863E-10         2.53399E+00         7.08616E-01         1.82537E+00
+          2.37994E-02         1.76856E-02        -2.72383E-02         1.49512E+00         1.33054E+00         1.49537E+00         2.55007E+00         1.00000E+00         1.88217E-10         2.55007E+00         7.19489E-01         1.83059E+00
+          2.37994E-02         1.78554E-02        -2.74279E-02         1.49512E+00         1.34121E+00         1.49537E+00         2.56592E+00         1.00000E+00         2.05121E-10         2.56592E+00         7.29919E-01         1.83600E+00
+          2.37994E-02         1.80252E-02        -2.76193E-02         1.49512E+00         1.35188E+00         1.49537E+00         2.58130E+00         1.00000E+00         2.22506E-10         2.58130E+00         7.39854E-01         1.84144E+00
+          2.37994E-02         1.81951E-02        -2.78125E-02         1.49511E+00         1.36255E+00         1.49537E+00         2.59601E+00         1.00000E+00         2.40300E-10         2.59601E+00         7.49248E-01         1.84676E+00
+          2.37994E-02         1.83649E-02        -2.80075E-02         1.49511E+00         1.37322E+00         1.49537E+00         2.60986E+00         1.00000E+00         2.58429E-10         2.60986E+00         7.58057E-01         1.85181E+00
+          2.37994E-02         1.85347E-02        -2.82044E-02         1.49510E+00         1.38389E+00         1.49537E+00         2.62269E+00         1.00000E+00         2.76813E-10         2.62269E+00         7.66238E-01         1.85645E+00
+          2.37994E-02         1.87045E-02        -2.84030E-02         1.49510E+00         1.39457E+00         1.49537E+00         2.63433E+00         1.00000E+00         2.95369E-10         2.63433E+00         7.73754E-01         1.86058E+00
+          2.37994E-02         1.88744E-02        -2.86035E-02         1.49509E+00         1.40524E+00         1.49537E+00         2.64466E+00         1.00000E+00         3.14008E-10         2.64466E+00         7.80570E-01         1.86409E+00
+          2.37994E-02         1.90442E-02        -2.88058E-02         1.49509E+00         1.41591E+00         1.49536E+00         2.65354E+00         1.00000E+00         3.32636E-10         2.65354E+00         7.86654E-01         1.86688E+00
+          2.37994E-02         1.92140E-02        -2.90099E-02         1.49508E+00         1.42658E+00         1.49536E+00         2.66086E+00         1.00000E+00         3.51155E-10         2.66086E+00         7.91978E-01         1.86888E+00
+          2.37994E-02         1.93839E-02        -2.92158E-02         1.49508E+00         1.43725E+00         1.49536E+00         2.66653E+00         1.00000E+00         3.69460E-10         2.66653E+00         7.96516E-01         1.87001E+00
+          2.37994E-02         1.95537E-02        -2.94235E-02         1.49507E+00         1.44792E+00         1.49536E+00         2.67047E+00         1.00000E+00         3.87442E-10         2.67047E+00         8.00247E-01         1.87022E+00
+          2.37994E-02         1.97235E-02        -2.96331E-02         1.49507E+00         1.45859E+00         1.49536E+00         2.67260E+00         1.00000E+00         4.04987E-10         2.67260E+00         8.03153E-01         1.86945E+00
+          2.37994E-02         1.98933E-02        -2.98444E-02         1.49506E+00         1.46926E+00         1.49536E+00         2.67287E+00         1.00000E+00         4.21976E-10         2.67287E+00         8.05217E-01         1.86765E+00
+          2.37994E-02         2.00632E-02        -3.00576E-02         1.49506E+00         1.47993E+00         1.49536E+00         2.67124E+00         1.00000E+00         4.38286E-10         2.67124E+00         8.06430E-01         1.86481E+00
+          2.37994E-02         2.02330E-02        -3.02725E-02         1.49505E+00         1.49060E+00         1.49536E+00         2.66766E+00         1.00000E+00         4.53791E-10         2.66766E+00         8.06781E-01         1.86088E+00
+          2.37994E-02         2.04028E-02        -3.04893E-02         1.49505E+00         1.50127E+00         1.49536E+00         2.66211E+00         1.00000E+00         4.68362E-10         2.66211E+00         8.06266E-01         1.85584E+00
+          2.37994E-02         2.05726E-02        -3.07079E-02         1.49504E+00         1.51194E+00         1.49536E+00         2.65458E+00         1.00000E+00         4.81865E-10         2.65458E+00         8.04883E-01         1.84970E+00
+          2.37994E-02         2.07425E-02        -3.09283E-02         1.49504E+00         1.52261E+00         1.49536E+00         2.64507E+00         1.00000E+00         4.94168E-10         2.64507E+00         8.02633E-01         1.84244E+00
+          2.37994E-02         2.09123E-02        -3.11506E-02         1.49503E+00         1.53328E+00         1.49536E+00         2.63358E+00         1.00000E+00         5.05138E-10         2.63358E+00         7.99521E-01         1.83406E+00
+          2.37994E-02         2.10821E-02        -3.13746E-02         1.49503E+00         1.54395E+00         1.49536E+00         2.62011E+00         1.00000E+00         5.14642E-10         2.62011E+00         7.95553E-01         1.82456E+00
+          2.37994E-02         2.12520E-02        -3.16005E-02         1.49502E+00         1.55462E+00         1.49535E+00         2.60470E+00         1.00000E+00         5.22550E-10         2.60470E+00         7.90739E-01         1.81396E+00
+          2.37994E-02         2.14218E-02        -3.18281E-02         1.49502E+00         1.56529E+00         1.49535E+00         2.58736E+00         1.00000E+00         5.28736E-10         2.58736E+00         7.85093E-01         1.80227E+00
+          2.37994E-02         2.15916E-02        -3.20576E-02         1.49501E+00         1.57596E+00         1.49535E+00         2.56814E+00         1.00000E+00         5.33083E-10         2.56814E+00         7.78631E-01         1.78951E+00
+          2.37994E-02         2.17614E-02        -3.22889E-02         1.49500E+00         1.58664E+00         1.49535E+00         2.54707E+00         1.00000E+00         5.35481E-10         2.54707E+00         7.71370E-01         1.77570E+00
+          2.37994E-02         2.19313E-02        -3.25220E-02         1.49500E+00         1.59731E+00         1.49535E+00         2.52421E+00         1.00000E+00         5.35834E-10         2.52421E+00         7.63331E-01         1.76088E+00
+          2.37994E-02         2.21011E-02        -3.27569E-02         1.49499E+00         1.60798E+00         1.49535E+00         2.49960E+00         1.00000E+00         5.34066E-10         2.49960E+00         7.54537E-01         1.74506E+00
+          2.37994E-02         2.22709E-02        -3.29936E-02         1.49499E+00         1.61865E+00         1.49535E+00         2.47330E+00         1.00000E+00         5.30120E-10         2.47330E+00         7.45013E-01         1.72829E+00
+          2.37994E-02         2.24407E-02        -3.32322E-02         1.49498E+00         1.62932E+00         1.49535E+00         2.44538E+00         1.00000E+00         5.23974E-10         2.44538E+00         7.34787E-01         1.71059E+00
+          2.37994E-02         2.26106E-02        -3.34725E-02         1.49498E+00         1.63999E+00         1.49535E+00         2.41590E+00         1.00000E+00         5.15643E-10         2.41590E+00         7.23888E-01         1.69201E+00
+          2.37994E-02         2.27804E-02        -3.37147E-02         1.49497E+00         1.65066E+00         1.49535E+00         2.38493E+00         1.00000E+00         5.05199E-10         2.38493E+00         7.12347E-01         1.67258E+00
+          2.37994E-02         2.29502E-02        -3.39587E-02         1.49496E+00         1.66133E+00         1.49535E+00         2.35255E+00         1.00000E+00         4.92779E-10         2.35255E+00         7.00197E-01         1.65235E+00
+          2.37994E-02         2.31201E-02        -3.42045E-02         1.49496E+00         1.67200E+00         1.49535E+00         2.31883E+00         1.00000E+00         4.78619E-10         2.31883E+00         6.87470E-01         1.63136E+00
+          2.37994E-02         2.32899E-02        -3.44521E-02         1.49495E+00         1.68267E+00         1.49535E+00         2.28387E+00         1.00000E+00         4.63075E-10         2.28387E+00         6.74203E-01         1.60966E+00
+          2.37994E-02         2.34597E-02        -3.47015E-02         1.49495E+00         1.69334E+00         1.49535E+00         2.24773E+00         1.00000E+00         4.46668E-10         2.24773E+00         6.60433E-01         1.58730E+00
+          2.37994E-02         2.36295E-02        -3.49527E-02         1.49494E+00         1.70401E+00         1.49535E+00         2.21051E+00         1.00000E+00         4.30131E-10         2.21051E+00         6.46196E-01         1.56431E+00
+          2.37994E-02         2.37994E-02        -3.52058E-02         1.49493E+00         1.71468E+00         1.49535E+00         2.17229E+00         1.00000E+00         4.14467E-10         2.17229E+00         6.31530E-01         1.54076E+00
+          2.37994E-02         2.39692E-02        -3.54606E-02         1.49493E+00         1.72535E+00         1.49535E+00         2.13316E+00         1.00000E+00         4.00986E-10         2.13316E+00         6.16476E-01         1.51669E+00
+          2.37994E-02         2.41390E-02        -3.57173E-02         1.49492E+00         1.73602E+00         1.49535E+00         2.09322E+00         1.00000E+00         3.91320E-10         2.09322E+00         6.01071E-01         1.49215E+00
+          2.37994E-02         2.43088E-02        -3.59758E-02         1.49492E+00         1.74669E+00         1.49535E+00         2.05255E+00         1.00000E+00         3.87338E-10         2.05255E+00         5.85356E-01         1.46719E+00
+          2.37994E-02         2.44787E-02        -3.62361E-02         1.49491E+00         1.75736E+00         1.49535E+00         2.01125E+00         1.00000E+00         3.90935E-10         2.01125E+00         5.69371E-01         1.44188E+00
+          2.37994E-02         2.46485E-02        -3.64982E-02         1.49490E+00         1.76804E+00         1.49535E+00         1.96941E+00         1.00000E+00         4.03714E-10         1.96941E+00         5.53156E-01         1.41625E+00
+          2.37994E-02         2.48183E-02        -3.67621E-02         1.49490E+00         1.77871E+00         1.49535E+00         1.92712E+00         1.00000E+00         4.26670E-10         1.92712E+00         5.36750E-01         1.39037E+00
+          2.37994E-02         2.49882E-02        -3.70279E-02         1.49489E+00         1.78938E+00         1.49535E+00         1.88448E+00         1.00000E+00         4.60062E-10         1.88448E+00         5.20194E-01         1.36429E+00
+          2.37994E-02         2.51580E-02        -3.72954E-02         1.49488E+00         1.80005E+00         1.49535E+00         1.84159E+00         1.00000E+00         5.03504E-10         1.84159E+00         5.03526E-01         1.33806E+00
+          2.37994E-02         2.53278E-02        -3.75648E-02         1.49488E+00         1.81072E+00         1.49535E+00         1.79852E+00         1.00000E+00         5.56209E-10         1.79852E+00         4.86785E-01         1.31174E+00
+          2.37994E-02         2.54976E-02        -3.78360E-02         1.49487E+00         1.82139E+00         1.49535E+00         1.75539E+00         1.00000E+00         6.17231E-10         1.75539E+00         4.70009E-01         1.28538E+00
+          2.37994E-02         2.56675E-02        -3.81090E-02         1.49487E+00         1.83206E+00         1.49535E+00         1.71227E+00         1.00000E+00         6.85621E-10         1.71227E+00         4.53236E-01         1.25903E+00
+          2.37994E-02         2.58373E-02        -3.83838E-02         1.49486E+00         1.84273E+00         1.49535E+00         1.66926E+00         1.00000E+00         7.60503E-10         1.66926E+00         4.36502E-01         1.23276E+00
+          2.37994E-02         2.60071E-02        -3.86604E-02         1.49485E+00         1.85340E+00         1.49535E+00         1.62646E+00         1.00000E+00         8.41099E-10         1.62646E+00         4.19843E-01         1.20661E+00
+          2.37994E-02         2.61769E-02        -3.89388E-02         1.49485E+00         1.86407E+00         1.49535E+00         1.58394E+00         1.00000E+00         9.26713E-10         1.58394E+00         4.03292E-01         1.18064E+00
+          2.39692E-02         8.72665E-04        -1.76929E-02         1.50603E+00         2.74155E-01         1.50613E+00         6.24375E+01         1.00000E+00         7.78456E-12         6.24375E+01         3.85995E+00         5.85775E+01
+          2.39692E-02         1.04249E-03        -1.77031E-02         1.50603E+00         2.84826E-01         1.50613E+00         6.13292E+01         1.00000E+00         6.93811E-12         6.13292E+01         3.81149E+00         5.75177E+01
+          2.39692E-02         1.21232E-03        -1.77151E-02         1.50603E+00         2.95496E-01         1.50613E+00         6.01977E+01         1.00000E+00         6.22600E-12         6.01977E+01         3.76156E+00         5.64361E+01
+          2.39692E-02         1.38215E-03        -1.77289E-02         1.50603E+00         3.06167E-01         1.50613E+00         5.90450E+01         1.00000E+00         5.68306E-12         5.90450E+01         3.71023E+00         5.53347E+01
+          2.39692E-02         1.55197E-03        -1.77446E-02         1.50603E+00         3.16838E-01         1.50613E+00         5.78728E+01         1.00000E+00         5.33959E-12         5.78728E+01         3.65753E+00         5.42153E+01
+          2.39692E-02         1.72180E-03        -1.77621E-02         1.50603E+00         3.27508E-01         1.50613E+00         5.66831E+01         1.00000E+00         5.20913E-12         5.66831E+01         3.60351E+00         5.30796E+01
+          2.39692E-02         1.89163E-03        -1.77813E-02         1.50603E+00         3.38179E-01         1.50613E+00         5.54777E+01         1.00000E+00         5.27848E-12         5.54777E+01         3.54824E+00         5.19295E+01
+          2.39692E-02         2.06146E-03        -1.78024E-02         1.50603E+00         3.48849E-01         1.50613E+00         5.42585E+01         1.00000E+00         5.50992E-12         5.42585E+01         3.49175E+00         5.07668E+01
+          2.39692E-02         2.23128E-03        -1.78253E-02         1.50603E+00         3.59520E-01         1.50613E+00         5.30274E+01         1.00000E+00         5.85413E-12         5.30274E+01         3.43412E+00         4.95933E+01
+          2.39692E-02         2.40111E-03        -1.78500E-02         1.50602E+00         3.70190E-01         1.50613E+00         5.17861E+01         1.00000E+00         6.26345E-12         5.17861E+01         3.37540E+00         4.84107E+01
+          2.39692E-02         2.57094E-03        -1.78765E-02         1.50602E+00         3.80861E-01         1.50613E+00         5.05367E+01         1.00000E+00         6.69842E-12         5.05367E+01         3.31565E+00         4.72210E+01
+          2.39692E-02         2.74077E-03        -1.79049E-02         1.50602E+00         3.91532E-01         1.50613E+00         4.92808E+01         1.00000E+00         7.12876E-12         4.92808E+01         3.25493E+00         4.60259E+01
+          2.39692E-02         2.91059E-03        -1.79350E-02         1.50602E+00         4.02202E-01         1.50613E+00         4.80204E+01         1.00000E+00         7.53194E-12         4.80204E+01         3.19330E+00         4.48271E+01
+          2.39692E-02         3.08042E-03        -1.79670E-02         1.50602E+00         4.12873E-01         1.50613E+00         4.67571E+01         1.00000E+00         7.89119E-12         4.67571E+01         3.13084E+00         4.36263E+01
+          2.39692E-02         3.25025E-03        -1.80007E-02         1.50602E+00         4.23543E-01         1.50613E+00         4.54928E+01         1.00000E+00         8.19393E-12         4.54928E+01         3.06761E+00         4.24252E+01
+          2.39692E-02         3.42008E-03        -1.80363E-02         1.50602E+00         4.34214E-01         1.50613E+00         4.42292E+01         1.00000E+00         8.43062E-12         4.42292E+01         3.00367E+00         4.12255E+01
+          2.39692E-02         3.58990E-03        -1.80737E-02         1.50602E+00         4.44884E-01         1.50613E+00         4.29679E+01         1.00000E+00         8.59398E-12         4.29679E+01         2.93911E+00         4.00288E+01
+          2.39692E-02         3.75973E-03        -1.81129E-02         1.50602E+00         4.55555E-01         1.50613E+00         4.17106E+01         1.00000E+00         8.67845E-12         4.17106E+01         2.87399E+00         3.88367E+01
+          2.39692E-02         3.92956E-03        -1.81539E-02         1.50602E+00         4.66225E-01         1.50613E+00         4.04590E+01         1.00000E+00         8.67996E-12         4.04590E+01         2.80838E+00         3.76507E+01
+          2.39692E-02         4.09939E-03        -1.81967E-02         1.50602E+00         4.76896E-01         1.50613E+00         3.92146E+01         1.00000E+00         8.59571E-12         3.92146E+01         2.74237E+00         3.64723E+01
+          2.39692E-02         4.26921E-03        -1.82414E-02         1.50602E+00         4.87567E-01         1.50613E+00         3.79789E+01         1.00000E+00         8.42421E-12         3.79789E+01         2.67602E+00         3.53029E+01
+          2.39692E-02         4.43904E-03        -1.82878E-02         1.50601E+00         4.98237E-01         1.50612E+00         3.67534E+01         1.00000E+00         8.16540E-12         3.67534E+01         2.60942E+00         3.41440E+01
+          2.39692E-02         4.60887E-03        -1.83361E-02         1.50601E+00         5.08908E-01         1.50612E+00         3.55395E+01         1.00000E+00         7.82101E-12         3.55395E+01         2.54264E+00         3.29968E+01
+          2.39692E-02         4.77869E-03        -1.83862E-02         1.50601E+00         5.19578E-01         1.50612E+00         3.43385E+01         1.00000E+00         7.39516E-12         3.43385E+01         2.47576E+00         3.18628E+01
+          2.39692E-02         4.94852E-03        -1.84380E-02         1.50601E+00         5.30249E-01         1.50612E+00         3.31518E+01         1.00000E+00         6.89556E-12         3.31518E+01         2.40885E+00         3.07429E+01
+          2.39692E-02         5.11835E-03        -1.84917E-02         1.50601E+00         5.40919E-01         1.50612E+00         3.19806E+01         1.00000E+00         6.33565E-12         3.19806E+01         2.34201E+00         2.96386E+01
+          2.39692E-02         5.28818E-03        -1.85472E-02         1.50601E+00         5.51590E-01         1.50612E+00         3.08260E+01         1.00000E+00         5.73853E-12         3.08260E+01         2.27531E+00         2.85507E+01
+          2.39692E-02         5.45800E-03        -1.86046E-02         1.50601E+00         5.62261E-01         1.50612E+00         2.96893E+01         1.00000E+00         5.14397E-12         2.96893E+01         2.20883E+00         2.74804E+01
+          2.39692E-02         5.62783E-03        -1.86637E-02         1.50600E+00         5.72931E-01         1.50612E+00         2.85714E+01         1.00000E+00         4.61974E-12         2.85714E+01         2.14264E+00         2.64287E+01
+          2.39692E-02         5.79766E-03        -1.87246E-02         1.50600E+00         5.83602E-01         1.50612E+00         2.74733E+01         1.00000E+00         4.27259E-12         2.74733E+01         2.07684E+00         2.53964E+01
+          2.39692E-02         5.96749E-03        -1.87874E-02         1.50600E+00         5.94272E-01         1.50612E+00         2.63960E+01         1.00000E+00         4.23573E-12         2.63960E+01         2.01149E+00         2.43845E+01
+          2.39692E-02         6.13731E-03        -1.88519E-02         1.50600E+00         6.04943E-01         1.50612E+00         2.53403E+01         1.00000E+00         4.60426E-12         2.53403E+01         1.94668E+00         2.33936E+01
+          2.39692E-02         6.30714E-03        -1.89183E-02         1.50600E+00         6.15613E-01         1.50612E+00         2.43070E+01         1.00000E+00         5.37360E-12         2.43070E+01         1.88249E+00         2.24245E+01
+          2.39692E-02         6.47697E-03        -1.89865E-02         1.50600E+00         6.26284E-01         1.50612E+00         2.32968E+01         1.00000E+00         6.46981E-12         2.32968E+01         1.81900E+00         2.14778E+01
+          2.39692E-02         6.64680E-03        -1.90565E-02         1.50600E+00         6.36955E-01         1.50612E+00         2.23105E+01         1.00000E+00         7.81452E-12         2.23105E+01         1.75627E+00         2.05542E+01
+          2.39692E-02         6.81662E-03        -1.91283E-02         1.50599E+00         6.47625E-01         1.50612E+00         2.13485E+01         1.00000E+00         9.35092E-12         2.13485E+01         1.69439E+00         1.96541E+01
+          2.39692E-02         6.98645E-03        -1.92020E-02         1.50599E+00         6.58296E-01         1.50611E+00         2.04114E+01         1.00000E+00         1.10420E-11         2.04114E+01         1.63342E+00         1.87780E+01
+          2.39692E-02         7.15628E-03        -1.92774E-02         1.50599E+00         6.68966E-01         1.50611E+00         1.94997E+01         1.00000E+00         1.28633E-11         1.94997E+01         1.57345E+00         1.79263E+01
+          2.39692E-02         7.32611E-03        -1.93546E-02         1.50599E+00         6.79637E-01         1.50611E+00         1.86138E+01         1.00000E+00         1.47981E-11         1.86138E+01         1.51454E+00         1.70992E+01
+          2.39692E-02         7.49593E-03        -1.94337E-02         1.50599E+00         6.90307E-01         1.50611E+00         1.77539E+01         1.00000E+00         1.68336E-11         1.77539E+01         1.45675E+00         1.62972E+01
+          2.39692E-02         7.66576E-03        -1.95146E-02         1.50598E+00         7.00978E-01         1.50611E+00         1.69205E+01         1.00000E+00         1.89594E-11         1.69205E+01         1.40017E+00         1.55203E+01
+          2.39692E-02         7.83559E-03        -1.95972E-02         1.50598E+00         7.11649E-01         1.50611E+00         1.61136E+01         1.00000E+00         2.11663E-11         1.61136E+01         1.34484E+00         1.47687E+01
+          2.39692E-02         8.00542E-03        -1.96817E-02         1.50598E+00         7.22319E-01         1.50611E+00         1.53334E+01         1.00000E+00         2.34460E-11         1.53334E+01         1.29083E+00         1.40425E+01
+          2.39692E-02         8.17524E-03        -1.97680E-02         1.50598E+00         7.32990E-01         1.50611E+00         1.45800E+01         1.00000E+00         2.57899E-11         1.45800E+01         1.23820E+00         1.33418E+01
+          2.39692E-02         8.34507E-03        -1.98562E-02         1.50598E+00         7.43660E-01         1.50611E+00         1.38534E+01         1.00000E+00         2.81899E-11         1.38534E+01         1.18700E+00         1.26664E+01
+          2.39692E-02         8.51490E-03        -1.99461E-02         1.50597E+00         7.54331E-01         1.50611E+00         1.31537E+01         1.00000E+00         3.06372E-11         1.31537E+01         1.13729E+00         1.20164E+01
+          2.39692E-02         8.68473E-03        -2.00378E-02         1.50597E+00         7.65001E-01         1.50611E+00         1.24806E+01         1.00000E+00         3.31230E-11         1.24806E+01         1.08911E+00         1.13915E+01
+          2.39692E-02         8.85455E-03        -2.01314E-02         1.50597E+00         7.75672E-01         1.50610E+00         1.18342E+01         1.00000E+00         3.56378E-11         1.18342E+01         1.04252E+00         1.07917E+01
+          2.39692E-02         9.02438E-03        -2.02268E-02         1.50597E+00         7.86343E-01         1.50610E+00         1.12142E+01         1.00000E+00         3.81717E-11         1.12142E+01         9.97550E-01         1.02166E+01
+          2.39692E-02         9.19421E-03        -2.03239E-02         1.50597E+00         7.97013E-01         1.50610E+00         1.06203E+01         1.00000E+00         4.07143E-11         1.06203E+01         9.54245E-01         9.66608E+00
+          2.39692E-02         9.36403E-03        -2.04229E-02         1.50596E+00         8.07684E-01         1.50610E+00         1.00524E+01         1.00000E+00         4.32544E-11         1.00524E+01         9.12641E-01         9.13976E+00
+          2.39692E-02         9.53386E-03        -2.05237E-02         1.50596E+00         8.18354E-01         1.50610E+00         9.51007E+00         1.00000E+00         4.57803E-11         9.51007E+00         8.72768E-01         8.63730E+00
+          2.39692E-02         9.70369E-03        -2.06263E-02         1.50596E+00         8.29025E-01         1.50610E+00         8.99297E+00         1.00000E+00         4.82795E-11         8.99297E+00         8.34654E-01         8.15832E+00
+          2.39692E-02         9.87352E-03        -2.07308E-02         1.50596E+00         8.39695E-01         1.50610E+00         8.50072E+00         1.00000E+00         5.07388E-11         8.50072E+00         7.98325E-01         7.70239E+00
+          2.39692E-02         1.00433E-02        -2.08370E-02         1.50595E+00         8.50366E-01         1.50610E+00         8.03287E+00         1.00000E+00         5.31445E-11         8.03287E+00         7.63799E-01         7.26907E+00
+          2.39692E-02         1.02132E-02        -2.09451E-02         1.50595E+00         8.61037E-01         1.50610E+00         7.58897E+00         1.00000E+00         5.54819E-11         7.58897E+00         7.31094E-01         6.85787E+00
+          2.39692E-02         1.03830E-02        -2.10549E-02         1.50595E+00         8.71707E-01         1.50609E+00         7.16851E+00         1.00000E+00         5.77358E-11         7.16851E+00         7.00220E-01         6.46829E+00
+          2.39692E-02         1.05528E-02        -2.11666E-02         1.50594E+00         8.82378E-01         1.50609E+00         6.77098E+00         1.00000E+00         5.98899E-11         6.77098E+00         6.71187E-01         6.09979E+00
+          2.39692E-02         1.07227E-02        -2.12801E-02         1.50594E+00         8.93048E-01         1.50609E+00         6.39582E+00         1.00000E+00         6.19277E-11         6.39582E+00         6.43996E-01         5.75182E+00
+          2.39692E-02         1.08925E-02        -2.13954E-02         1.50594E+00         9.03719E-01         1.50609E+00         6.04245E+00         1.00000E+00         6.38318E-11         6.04245E+00         6.18649E-01         5.42380E+00
+          2.39692E-02         1.10623E-02        -2.15125E-02         1.50594E+00         9.14389E-01         1.50609E+00         5.71028E+00         1.00000E+00         6.55839E-11         5.71028E+00         5.95140E-01         5.11514E+00
+          2.39692E-02         1.12321E-02        -2.16314E-02         1.50593E+00         9.25060E-01         1.50609E+00         5.39869E+00         1.00000E+00         6.71657E-11         5.39869E+00         5.73461E-01         4.82523E+00
+          2.39692E-02         1.14020E-02        -2.17521E-02         1.50593E+00         9.35731E-01         1.50609E+00         5.10705E+00         1.00000E+00         6.85578E-11         5.10705E+00         5.53599E-01         4.55345E+00
+          2.39692E-02         1.15718E-02        -2.18747E-02         1.50593E+00         9.46401E-01         1.50609E+00         4.83472E+00         1.00000E+00         6.97409E-11         4.83472E+00         5.35536E-01         4.29918E+00
+          2.39692E-02         1.17416E-02        -2.19990E-02         1.50592E+00         9.57072E-01         1.50609E+00         4.58103E+00         1.00000E+00         7.06951E-11         4.58103E+00         5.19253E-01         4.06177E+00
+          2.39692E-02         1.19114E-02        -2.21252E-02         1.50592E+00         9.67742E-01         1.50608E+00         4.34531E+00         1.00000E+00         7.14006E-11         4.34531E+00         5.04723E-01         3.84059E+00
+          2.39692E-02         1.20813E-02        -2.22532E-02         1.50592E+00         9.78413E-01         1.50608E+00         4.12690E+00         1.00000E+00         7.18375E-11         4.12690E+00         4.91918E-01         3.63498E+00
+          2.39692E-02         1.22511E-02        -2.23830E-02         1.50592E+00         9.89083E-01         1.50608E+00         3.92510E+00         1.00000E+00         7.19864E-11         3.92510E+00         4.80805E-01         3.44429E+00
+          2.39692E-02         1.24209E-02        -2.25146E-02         1.50591E+00         9.99754E-01         1.50608E+00         3.73923E+00         1.00000E+00         7.18287E-11         3.73923E+00         4.71349E-01         3.26788E+00
+          2.39692E-02         1.25908E-02        -2.26480E-02         1.50591E+00         1.01042E+00         1.50608E+00         3.56861E+00         1.00000E+00         7.13467E-11         3.56861E+00         4.63510E-01         3.10510E+00
+          2.39692E-02         1.27606E-02        -2.27832E-02         1.50591E+00         1.02110E+00         1.50608E+00         3.41255E+00         1.00000E+00         7.05247E-11         3.41255E+00         4.57243E-01         2.95531E+00
+          2.39692E-02         1.29304E-02        -2.29203E-02         1.50590E+00         1.03177E+00         1.50608E+00         3.27036E+00         1.00000E+00         6.93495E-11         3.27036E+00         4.52503E-01         2.81786E+00
+          2.39692E-02         1.31002E-02        -2.30591E-02         1.50590E+00         1.04244E+00         1.50608E+00         3.14137E+00         1.00000E+00         6.78115E-11         3.14137E+00         4.49240E-01         2.69213E+00
+          2.39692E-02         1.32701E-02        -2.31998E-02         1.50590E+00         1.05311E+00         1.50607E+00         3.02489E+00         1.00000E+00         6.59066E-11         3.02489E+00         4.47402E-01         2.57749E+00
+          2.39692E-02         1.34399E-02        -2.33423E-02         1.50589E+00         1.06378E+00         1.50607E+00         2.92027E+00         1.00000E+00         6.36384E-11         2.92027E+00         4.46932E-01         2.47334E+00
+          2.39692E-02         1.36097E-02        -2.34865E-02         1.50589E+00         1.07445E+00         1.50607E+00         2.82683E+00         1.00000E+00         6.10213E-11         2.82683E+00         4.47773E-01         2.37906E+00
+          2.39692E-02         1.37795E-02        -2.36326E-02         1.50589E+00         1.08512E+00         1.50607E+00         2.74393E+00         1.00000E+00         5.80862E-11         2.74393E+00         4.49864E-01         2.29407E+00
+          2.39692E-02         1.39494E-02        -2.37806E-02         1.50588E+00         1.09579E+00         1.50607E+00         2.67093E+00         1.00000E+00         5.48882E-11         2.67093E+00         4.53143E-01         2.21779E+00
+          2.39692E-02         1.41192E-02        -2.39303E-02         1.50588E+00         1.10646E+00         1.50607E+00         2.60721E+00         1.00000E+00         5.15188E-11         2.60721E+00         4.57544E-01         2.14966E+00
+          2.39692E-02         1.42890E-02        -2.40818E-02         1.50587E+00         1.11713E+00         1.50607E+00         2.55214E+00         1.00000E+00         4.81239E-11         2.55214E+00         4.63001E-01         2.08914E+00
+          2.39692E-02         1.44589E-02        -2.42352E-02         1.50587E+00         1.12780E+00         1.50607E+00         2.50514E+00         1.00000E+00         4.49287E-11         2.50514E+00         4.69445E-01         2.03569E+00
+          2.39692E-02         1.46287E-02        -2.43903E-02         1.50587E+00         1.13847E+00         1.50607E+00         2.46561E+00         1.00000E+00         4.22651E-11         2.46561E+00         4.76808E-01         1.98880E+00
+          2.39692E-02         1.47985E-02        -2.45473E-02         1.50586E+00         1.14914E+00         1.50606E+00         2.43298E+00         1.00000E+00         4.05797E-11         2.43298E+00         4.85016E-01         1.94797E+00
+          2.39692E-02         1.49683E-02        -2.47061E-02         1.50586E+00         1.15981E+00         1.50606E+00         2.40672E+00         1.00000E+00         4.03840E-11         2.40672E+00         4.94000E-01         1.91272E+00
+          2.39692E-02         1.51382E-02        -2.48667E-02         1.50586E+00         1.17048E+00         1.50606E+00         2.38628E+00         1.00000E+00         4.21124E-11         2.38628E+00         5.03685E-01         1.88259E+00
+          2.39692E-02         1.53080E-02        -2.50291E-02         1.50585E+00         1.18115E+00         1.50606E+00         2.37114E+00         1.00000E+00         4.59634E-11         2.37114E+00         5.14000E-01         1.85714E+00
+          2.39692E-02         1.54778E-02        -2.51933E-02         1.50585E+00         1.19182E+00         1.50606E+00         2.36081E+00         1.00000E+00         5.18637E-11         2.36081E+00         5.24869E-01         1.83594E+00
+          2.39692E-02         1.56476E-02        -2.53594E-02         1.50584E+00         1.20249E+00         1.50606E+00         2.35481E+00         1.00000E+00         5.95785E-11         2.35481E+00         5.36220E-01         1.81859E+00
+          2.39692E-02         1.58175E-02        -2.55272E-02         1.50584E+00         1.21317E+00         1.50606E+00         2.35267E+00         1.00000E+00         6.88409E-11         2.35267E+00         5.47979E-01         1.80470E+00
+          2.39692E-02         1.59873E-02        -2.56969E-02         1.50584E+00         1.22384E+00         1.50606E+00         2.35397E+00         1.00000E+00         7.94210E-11         2.35397E+00         5.60072E-01         1.79390E+00
+          2.39692E-02         1.61571E-02        -2.58683E-02         1.50583E+00         1.23451E+00         1.50605E+00         2.35827E+00         1.00000E+00         9.11400E-11         2.35827E+00         5.72428E-01         1.78584E+00
+          2.39692E-02         1.63270E-02        -2.60416E-02         1.50583E+00         1.24518E+00         1.50605E+00         2.36518E+00         1.00000E+00         1.03863E-10         2.36518E+00         5.84974E-01         1.78020E+00
+          2.39692E-02         1.64968E-02        -2.62167E-02         1.50582E+00         1.25585E+00         1.50605E+00         2.37430E+00         1.00000E+00         1.17485E-10         2.37430E+00         5.97640E-01         1.77666E+00
+          2.39692E-02         1.66666E-02        -2.63936E-02         1.50582E+00         1.26652E+00         1.50605E+00         2.38529E+00         1.00000E+00         1.31921E-10         2.38529E+00         6.10357E-01         1.77493E+00
+          2.39692E-02         1.68364E-02        -2.65724E-02         1.50582E+00         1.27719E+00         1.50605E+00         2.39779E+00         1.00000E+00         1.47098E-10         2.39779E+00         6.23055E-01         1.77473E+00
+          2.39692E-02         1.70063E-02        -2.67529E-02         1.50581E+00         1.28786E+00         1.50605E+00         2.41148E+00         1.00000E+00         1.62951E-10         2.41148E+00         6.35668E-01         1.77581E+00
+          2.39692E-02         1.71761E-02        -2.69352E-02         1.50581E+00         1.29853E+00         1.50605E+00         2.42605E+00         1.00000E+00         1.79416E-10         2.42605E+00         6.48132E-01         1.77792E+00
+          2.39692E-02         1.73459E-02        -2.71194E-02         1.50580E+00         1.30920E+00         1.50605E+00         2.44122E+00         1.00000E+00         1.96427E-10         2.44122E+00         6.60385E-01         1.78083E+00
+          2.39692E-02         1.75158E-02        -2.73054E-02         1.50580E+00         1.31987E+00         1.50605E+00         2.45672E+00         1.00000E+00         2.13920E-10         2.45672E+00         6.72364E-01         1.78435E+00
+          2.39692E-02         1.76856E-02        -2.74932E-02         1.50579E+00         1.33054E+00         1.50604E+00         2.47230E+00         1.00000E+00         2.31826E-10         2.47230E+00         6.84012E-01         1.78828E+00
+          2.39692E-02         1.78554E-02        -2.76828E-02         1.50579E+00         1.34121E+00         1.50604E+00         2.48772E+00         1.00000E+00         2.50070E-10         2.48772E+00         6.95274E-01         1.79245E+00
+          2.39692E-02         1.80252E-02        -2.78742E-02         1.50578E+00         1.35188E+00         1.50604E+00         2.50277E+00         1.00000E+00         2.68576E-10         2.50277E+00         7.06095E-01         1.79668E+00
+          2.39692E-02         1.81951E-02        -2.80674E-02         1.50578E+00         1.36255E+00         1.50604E+00         2.51726E+00         1.00000E+00         2.87260E-10         2.51726E+00         7.16425E-01         1.80083E+00
+          2.39692E-02         1.83649E-02        -2.82624E-02         1.50577E+00         1.37322E+00         1.50604E+00         2.53099E+00         1.00000E+00         3.06033E-10         2.53099E+00         7.26217E-01         1.80478E+00
+          2.39692E-02         1.85347E-02        -2.84593E-02         1.50577E+00         1.38389E+00         1.50604E+00         2.54381E+00         1.00000E+00         3.24801E-10         2.54381E+00         7.35425E-01         1.80839E+00
+          2.39692E-02         1.87045E-02        -2.86579E-02         1.50577E+00         1.39457E+00         1.50604E+00         2.55556E+00         1.00000E+00         3.43463E-10         2.55556E+00         7.44007E-01         1.81156E+00
+          2.39692E-02         1.88744E-02        -2.88584E-02         1.50576E+00         1.40524E+00         1.50604E+00         2.56611E+00         1.00000E+00         3.61913E-10         2.56611E+00         7.51926E-01         1.81418E+00
+          2.39692E-02         1.90442E-02        -2.90607E-02         1.50576E+00         1.41591E+00         1.50604E+00         2.57533E+00         1.00000E+00         3.80037E-10         2.57533E+00         7.59145E-01         1.81619E+00
+          2.39692E-02         1.92140E-02        -2.92648E-02         1.50575E+00         1.42658E+00         1.50604E+00         2.58312E+00         1.00000E+00         3.97720E-10         2.58312E+00         7.65633E-01         1.81749E+00
+          2.39692E-02         1.93839E-02        -2.94707E-02         1.50575E+00         1.43725E+00         1.50603E+00         2.58938E+00         1.00000E+00         4.14836E-10         2.58938E+00         7.71360E-01         1.81802E+00
+          2.39692E-02         1.95537E-02        -2.96784E-02         1.50574E+00         1.44792E+00         1.50603E+00         2.59403E+00         1.00000E+00         4.31258E-10         2.59403E+00         7.76300E-01         1.81773E+00
+          2.39692E-02         1.97235E-02        -2.98879E-02         1.50574E+00         1.45859E+00         1.50603E+00         2.59700E+00         1.00000E+00         4.46852E-10         2.59700E+00         7.80432E-01         1.81657E+00
+          2.39692E-02         1.98933E-02        -3.00993E-02         1.50573E+00         1.46926E+00         1.50603E+00         2.59824E+00         1.00000E+00         4.61481E-10         2.59824E+00         7.83737E-01         1.81450E+00
+          2.39692E-02         2.00632E-02        -3.03125E-02         1.50573E+00         1.47993E+00         1.50603E+00         2.59769E+00         1.00000E+00         4.75005E-10         2.59769E+00         7.86199E-01         1.81149E+00
+          2.39692E-02         2.02330E-02        -3.05274E-02         1.50572E+00         1.49060E+00         1.50603E+00         2.59532E+00         1.00000E+00         4.87280E-10         2.59532E+00         7.87805E-01         1.80751E+00
+          2.39692E-02         2.04028E-02        -3.07442E-02         1.50572E+00         1.50127E+00         1.50603E+00         2.59110E+00         1.00000E+00         4.98161E-10         2.59110E+00         7.88547E-01         1.80255E+00
+          2.39692E-02         2.05726E-02        -3.09628E-02         1.50571E+00         1.51194E+00         1.50603E+00         2.58501E+00         1.00000E+00         5.07502E-10         2.58501E+00         7.88420E-01         1.79659E+00
+          2.39692E-02         2.07425E-02        -3.11832E-02         1.50570E+00         1.52261E+00         1.50603E+00         2.57705E+00         1.00000E+00         5.15158E-10         2.57705E+00         7.87420E-01         1.78963E+00
+          2.39692E-02         2.09123E-02        -3.14054E-02         1.50570E+00         1.53328E+00         1.50603E+00         2.56722E+00         1.00000E+00         5.20988E-10         2.56722E+00         7.85549E-01         1.78167E+00
+          2.39692E-02         2.10821E-02        -3.16295E-02         1.50569E+00         1.54395E+00         1.50603E+00         2.55553E+00         1.00000E+00         5.24852E-10         2.55553E+00         7.82810E-01         1.77272E+00
+          2.39692E-02         2.12520E-02        -3.18553E-02         1.50569E+00         1.55462E+00         1.50603E+00         2.54198E+00         1.00000E+00         5.26621E-10         2.54198E+00         7.79211E-01         1.76277E+00
+          2.39692E-02         2.14218E-02        -3.20830E-02         1.50568E+00         1.56529E+00         1.50602E+00         2.52661E+00         1.00000E+00         5.26172E-10         2.52661E+00         7.74761E-01         1.75185E+00
+          2.39692E-02         2.15916E-02        -3.23125E-02         1.50568E+00         1.57596E+00         1.50602E+00         2.50943E+00         1.00000E+00         5.23398E-10         2.50943E+00         7.69473E-01         1.73996E+00
+          2.39692E-02         2.17614E-02        -3.25438E-02         1.50567E+00         1.58664E+00         1.50602E+00         2.49050E+00         1.00000E+00         5.18212E-10         2.49050E+00         7.63362E-01         1.72714E+00
+          2.39692E-02         2.19313E-02        -3.27769E-02         1.50567E+00         1.59731E+00         1.50602E+00         2.46984E+00         1.00000E+00         5.10550E-10         2.46984E+00         7.56447E-01         1.71339E+00
+          2.39692E-02         2.21011E-02        -3.30118E-02         1.50566E+00         1.60798E+00         1.50602E+00         2.44750E+00         1.00000E+00         5.00383E-10         2.44750E+00         7.48747E-01         1.69876E+00
+          2.39692E-02         2.22709E-02        -3.32485E-02         1.50566E+00         1.61865E+00         1.50602E+00         2.42354E+00         1.00000E+00         4.87730E-10         2.42354E+00         7.40286E-01         1.68325E+00
+          2.39692E-02         2.24407E-02        -3.34870E-02         1.50565E+00         1.62932E+00         1.50602E+00         2.39801E+00         1.00000E+00         4.72673E-10         2.39801E+00         7.31088E-01         1.66692E+00
+          2.39692E-02         2.26106E-02        -3.37274E-02         1.50564E+00         1.63999E+00         1.50602E+00         2.37096E+00         1.00000E+00         4.55381E-10         2.37096E+00         7.21182E-01         1.64978E+00
+          2.39692E-02         2.27804E-02        -3.39696E-02         1.50564E+00         1.65066E+00         1.50602E+00         2.34246E+00         1.00000E+00         4.36148E-10         2.34246E+00         7.10595E-01         1.63187E+00
+          2.39692E-02         2.29502E-02        -3.42135E-02         1.50563E+00         1.66133E+00         1.50602E+00         2.31258E+00         1.00000E+00         4.15438E-10         2.31258E+00         6.99359E-01         1.61322E+00
+          2.39692E-02         2.31201E-02        -3.44593E-02         1.50563E+00         1.67200E+00         1.50602E+00         2.28139E+00         1.00000E+00         3.93961E-10         2.28139E+00         6.87506E-01         1.59388E+00
+          2.39692E-02         2.32899E-02        -3.47069E-02         1.50562E+00         1.68267E+00         1.50602E+00         2.24895E+00         1.00000E+00         3.72762E-10         2.24895E+00         6.75070E-01         1.57388E+00
+          2.39692E-02         2.34597E-02        -3.49564E-02         1.50561E+00         1.69334E+00         1.50602E+00         2.21535E+00         1.00000E+00         3.53331E-10         2.21535E+00         6.62087E-01         1.55326E+00
+          2.39692E-02         2.36295E-02        -3.52076E-02         1.50561E+00         1.70401E+00         1.50602E+00         2.18065E+00         1.00000E+00         3.37692E-10         2.18065E+00         6.48593E-01         1.53206E+00
+          2.39692E-02         2.37994E-02        -3.54606E-02         1.50560E+00         1.71468E+00         1.50602E+00         2.14495E+00         1.00000E+00         3.28367E-10         2.14495E+00         6.34626E-01         1.51032E+00
+          2.39692E-02         2.39692E-02        -3.57155E-02         1.50560E+00         1.72535E+00         1.50602E+00         2.10831E+00         1.00000E+00         3.28082E-10         2.10831E+00         6.20223E-01         1.48808E+00
+          2.39692E-02         2.41390E-02        -3.59722E-02         1.50559E+00         1.73602E+00         1.50602E+00         2.07082E+00         1.00000E+00         3.39156E-10         2.07082E+00         6.05424E-01         1.46540E+00
+          2.39692E-02         2.43088E-02        -3.62307E-02         1.50558E+00         1.74669E+00         1.50602E+00         2.03256E+00         1.00000E+00         3.62845E-10         2.03256E+00         5.90268E-01         1.44230E+00
+          2.39692E-02         2.44787E-02        -3.64910E-02         1.50558E+00         1.75736E+00         1.50602E+00         1.99363E+00         1.00000E+00         3.99111E-10         1.99363E+00         5.74795E-01         1.41883E+00
+          2.39692E-02         2.46485E-02        -3.67531E-02         1.50557E+00         1.76804E+00         1.50602E+00         1.95409E+00         1.00000E+00         4.46949E-10         1.95409E+00         5.59045E-01         1.39505E+00
+          2.39692E-02         2.48183E-02        -3.70170E-02         1.50556E+00         1.77871E+00         1.50602E+00         1.91404E+00         1.00000E+00         5.04945E-10         1.91404E+00         5.43059E-01         1.37098E+00
+          2.39692E-02         2.49882E-02        -3.72827E-02         1.50556E+00         1.78938E+00         1.50602E+00         1.87357E+00         1.00000E+00         5.71682E-10         1.87357E+00         5.26876E-01         1.34669E+00
+          2.39692E-02         2.51580E-02        -3.75503E-02         1.50555E+00         1.80005E+00         1.50602E+00         1.83275E+00         1.00000E+00         6.45925E-10         1.83275E+00         5.10536E-01         1.32221E+00
+          2.39692E-02         2.53278E-02        -3.78196E-02         1.50555E+00         1.81072E+00         1.50602E+00         1.79168E+00         1.00000E+00         7.26653E-10         1.79168E+00         4.94079E-01         1.29760E+00
+          2.39692E-02         2.54976E-02        -3.80908E-02         1.50554E+00         1.82139E+00         1.50602E+00         1.75043E+00         1.00000E+00         8.13020E-10         1.75043E+00         4.77543E-01         1.27289E+00
+          2.39692E-02         2.56675E-02        -3.83638E-02         1.50553E+00         1.83206E+00         1.50602E+00         1.70910E+00         1.00000E+00         9.04316E-10         1.70910E+00         4.60967E-01         1.24813E+00
+          2.39692E-02         2.58373E-02        -3.86386E-02         1.50553E+00         1.84273E+00         1.50602E+00         1.66777E+00         1.00000E+00         9.99917E-10         1.66777E+00         4.44389E-01         1.22338E+00
+          2.39692E-02         2.60071E-02        -3.89152E-02         1.50552E+00         1.85340E+00         1.50602E+00         1.62652E+00         1.00000E+00         1.09926E-09         1.62652E+00         4.27844E-01         1.19868E+00
+          2.39692E-02         2.61769E-02        -3.91937E-02         1.50551E+00         1.86407E+00         1.50602E+00         1.58544E+00         1.00000E+00         1.20180E-09         1.58544E+00         4.11369E-01         1.17407E+00
+          2.41390E-02         8.72665E-04        -1.79496E-02         1.51670E+00         2.74155E-01         1.51680E+00         6.11156E+01         1.00000E+00         1.78526E-11         6.11156E+01         3.80609E+00         5.73096E+01
+          2.41390E-02         1.04249E-03        -1.79598E-02         1.51670E+00         2.84826E-01         1.51680E+00         6.00311E+01         1.00000E+00         1.62051E-11         6.00311E+01         3.76006E+00         5.62710E+01
+          2.41390E-02         1.21232E-03        -1.79719E-02         1.51670E+00         2.95496E-01         1.51680E+00         5.89239E+01         1.00000E+00         1.46355E-11         5.89239E+01         3.71259E+00         5.52113E+01
+          2.41390E-02         1.38215E-03        -1.79857E-02         1.51670E+00         3.06167E-01         1.51680E+00         5.77959E+01         1.00000E+00         1.31600E-11         5.77959E+01         3.66374E+00         5.41322E+01
+          2.41390E-02         1.55197E-03        -1.80013E-02         1.51670E+00         3.16838E-01         1.51680E+00         5.66489E+01         1.00000E+00         1.17966E-11         5.66489E+01         3.61353E+00         5.30354E+01
+          2.41390E-02         1.72180E-03        -1.80188E-02         1.51670E+00         3.27508E-01         1.51680E+00         5.54848E+01         1.00000E+00         1.05649E-11         5.54848E+01         3.56202E+00         5.19227E+01
+          2.41390E-02         1.89163E-03        -1.80381E-02         1.51670E+00         3.38179E-01         1.51680E+00         5.43053E+01         1.00000E+00         9.48588E-12         5.43053E+01         3.50925E+00         5.07960E+01
+          2.41390E-02         2.06146E-03        -1.80592E-02         1.51670E+00         3.48849E-01         1.51680E+00         5.31122E+01         1.00000E+00         8.58013E-12         5.31122E+01         3.45526E+00         4.96570E+01
+          2.41390E-02         2.23128E-03        -1.80821E-02         1.51670E+00         3.59520E-01         1.51680E+00         5.19076E+01         1.00000E+00         7.86456E-12         5.19076E+01         3.40012E+00         4.85074E+01
+          2.41390E-02         2.40111E-03        -1.81068E-02         1.51669E+00         3.70190E-01         1.51680E+00         5.06930E+01         1.00000E+00         7.34710E-12         5.06930E+01         3.34386E+00         4.73491E+01
+          2.41390E-02         2.57094E-03        -1.81333E-02         1.51669E+00         3.80861E-01         1.51680E+00         4.94704E+01         1.00000E+00         7.02122E-12         4.94704E+01         3.28656E+00         4.61838E+01
+          2.41390E-02         2.74077E-03        -1.81616E-02         1.51669E+00         3.91532E-01         1.51680E+00         4.82415E+01         1.00000E+00         6.86347E-12         4.82415E+01         3.22825E+00         4.50133E+01
+          2.41390E-02         2.91059E-03        -1.81918E-02         1.51669E+00         4.02202E-01         1.51680E+00         4.70082E+01         1.00000E+00         6.83652E-12         4.70082E+01         3.16901E+00         4.38392E+01
+          2.41390E-02         3.08042E-03        -1.82237E-02         1.51669E+00         4.12873E-01         1.51680E+00         4.57721E+01         1.00000E+00         6.89630E-12         4.57721E+01         3.10888E+00         4.26632E+01
+          2.41390E-02         3.25025E-03        -1.82575E-02         1.51669E+00         4.23543E-01         1.51680E+00         4.45350E+01         1.00000E+00         6.99953E-12         4.45350E+01         3.04794E+00         4.14871E+01
+          2.41390E-02         3.42008E-03        -1.82931E-02         1.51669E+00         4.34214E-01         1.51680E+00         4.32986E+01         1.00000E+00         7.10850E-12         4.32986E+01         2.98625E+00         4.03123E+01
+          2.41390E-02         3.58990E-03        -1.83304E-02         1.51669E+00         4.44884E-01         1.51680E+00         4.20644E+01         1.00000E+00         7.19284E-12         4.20644E+01         2.92386E+00         3.91406E+01
+          2.41390E-02         3.75973E-03        -1.83696E-02         1.51669E+00         4.55555E-01         1.51680E+00         4.08343E+01         1.00000E+00         7.22934E-12         4.08343E+01         2.86086E+00         3.79734E+01
+          2.41390E-02         3.92956E-03        -1.84107E-02         1.51669E+00         4.66225E-01         1.51680E+00         3.96096E+01         1.00000E+00         7.20101E-12         3.96096E+01         2.79731E+00         3.68123E+01
+          2.41390E-02         4.09939E-03        -1.84535E-02         1.51669E+00         4.76896E-01         1.51680E+00         3.83920E+01         1.00000E+00         7.09599E-12         3.83920E+01         2.73327E+00         3.56587E+01
+          2.41390E-02         4.26921E-03        -1.84981E-02         1.51669E+00         4.87567E-01         1.51680E+00         3.71829E+01         1.00000E+00         6.90681E-12         3.71829E+01         2.66882E+00         3.45141E+01
+          2.41390E-02         4.43904E-03        -1.85446E-02         1.51668E+00         4.98237E-01         1.51680E+00         3.59838E+01         1.00000E+00         6.62995E-12         3.59838E+01         2.60404E+00         3.33798E+01
+          2.41390E-02         4.60887E-03        -1.85928E-02         1.51668E+00         5.08908E-01         1.51680E+00         3.47961E+01         1.00000E+00         6.26607E-12         3.47961E+01         2.53899E+00         3.22571E+01
+          2.41390E-02         4.77869E-03        -1.86429E-02         1.51668E+00         5.19578E-01         1.51680E+00         3.36210E+01         1.00000E+00         5.82093E-12         3.36210E+01         2.47375E+00         3.11472E+01
+          2.41390E-02         4.94852E-03        -1.86948E-02         1.51668E+00         5.30249E-01         1.51680E+00         3.24598E+01         1.00000E+00         5.30786E-12         3.24598E+01         2.40840E+00         3.00514E+01
+          2.41390E-02         5.11835E-03        -1.87485E-02         1.51668E+00         5.40919E-01         1.51680E+00         3.13138E+01         1.00000E+00         4.75275E-12         3.13138E+01         2.34302E+00         2.89708E+01
+          2.41390E-02         5.28818E-03        -1.88040E-02         1.51668E+00         5.51590E-01         1.51679E+00         3.01842E+01         1.00000E+00         4.20422E-12         3.01842E+01         2.27768E+00         2.79065E+01
+          2.41390E-02         5.45800E-03        -1.88613E-02         1.51668E+00         5.62261E-01         1.51679E+00         2.90719E+01         1.00000E+00         3.75028E-12         2.90719E+01         2.21245E+00         2.68595E+01
+          2.41390E-02         5.62783E-03        -1.89204E-02         1.51668E+00         5.72931E-01         1.51679E+00         2.79781E+01         1.00000E+00         3.53035E-12         2.79781E+01         2.14743E+00         2.58307E+01
+          2.41390E-02         5.79766E-03        -1.89814E-02         1.51667E+00         5.83602E-01         1.51679E+00         2.69037E+01         1.00000E+00         3.69419E-12         2.69037E+01         2.08267E+00         2.48210E+01
+          2.41390E-02         5.96749E-03        -1.90441E-02         1.51667E+00         5.94272E-01         1.51679E+00         2.58496E+01         1.00000E+00         4.29513E-12         2.58496E+01         2.01827E+00         2.38313E+01
+          2.41390E-02         6.13731E-03        -1.91087E-02         1.51667E+00         6.04943E-01         1.51679E+00         2.48166E+01         1.00000E+00         5.26742E-12         2.48166E+01         1.95431E+00         2.28623E+01
+          2.41390E-02         6.30714E-03        -1.91751E-02         1.51667E+00         6.15613E-01         1.51679E+00         2.38056E+01         1.00000E+00         6.51562E-12         2.38056E+01         1.89085E+00         2.19147E+01
+          2.41390E-02         6.47697E-03        -1.92433E-02         1.51667E+00         6.26284E-01         1.51679E+00         2.28171E+01         1.00000E+00         7.96905E-12         2.28171E+01         1.82797E+00         2.09892E+01
+          2.41390E-02         6.64680E-03        -1.93133E-02         1.51667E+00         6.36955E-01         1.51679E+00         2.18520E+01         1.00000E+00         9.58359E-12         2.18520E+01         1.76576E+00         2.00862E+01
+          2.41390E-02         6.81662E-03        -1.93851E-02         1.51666E+00         6.47625E-01         1.51679E+00         2.09107E+01         1.00000E+00         1.13317E-11         2.09107E+01         1.70428E+00         1.92064E+01
+          2.41390E-02         6.98645E-03        -1.94587E-02         1.51666E+00         6.58296E-01         1.51679E+00         1.99938E+01         1.00000E+00         1.31948E-11         1.99938E+01         1.64362E+00         1.83502E+01
+          2.41390E-02         7.15628E-03        -1.95341E-02         1.51666E+00         6.68966E-01         1.51679E+00         1.91016E+01         1.00000E+00         1.51594E-11         1.91016E+01         1.58383E+00         1.75178E+01
+          2.41390E-02         7.32611E-03        -1.96114E-02         1.51666E+00         6.79637E-01         1.51679E+00         1.82347E+01         1.00000E+00         1.72145E-11         1.82347E+01         1.52501E+00         1.67097E+01
+          2.41390E-02         7.49593E-03        -1.96904E-02         1.51666E+00         6.90307E-01         1.51678E+00         1.73933E+01         1.00000E+00         1.93504E-11         1.73933E+01         1.46720E+00         1.59261E+01
+          2.41390E-02         7.66576E-03        -1.97713E-02         1.51665E+00         7.00978E-01         1.51678E+00         1.65776E+01         1.00000E+00         2.15582E-11         1.65776E+01         1.41049E+00         1.51672E+01
+          2.41390E-02         7.83559E-03        -1.98540E-02         1.51665E+00         7.11649E-01         1.51678E+00         1.57880E+01         1.00000E+00         2.38292E-11         1.57880E+01         1.35493E+00         1.44330E+01
+          2.41390E-02         8.00542E-03        -1.99385E-02         1.51665E+00         7.22319E-01         1.51678E+00         1.50244E+01         1.00000E+00         2.61548E-11         1.50244E+01         1.30060E+00         1.37238E+01
+          2.41390E-02         8.17524E-03        -2.00248E-02         1.51665E+00         7.32990E-01         1.51678E+00         1.42871E+01         1.00000E+00         2.85261E-11         1.42871E+01         1.24755E+00         1.30395E+01
+          2.41390E-02         8.34507E-03        -2.01129E-02         1.51665E+00         7.43660E-01         1.51678E+00         1.35760E+01         1.00000E+00         3.09339E-11         1.35760E+01         1.19584E+00         1.23801E+01
+          2.41390E-02         8.51490E-03        -2.02028E-02         1.51664E+00         7.54331E-01         1.51678E+00         1.28910E+01         1.00000E+00         3.33689E-11         1.28910E+01         1.14553E+00         1.17455E+01
+          2.41390E-02         8.68473E-03        -2.02946E-02         1.51664E+00         7.65001E-01         1.51678E+00         1.22323E+01         1.00000E+00         3.58210E-11         1.22323E+01         1.09666E+00         1.11356E+01
+          2.41390E-02         8.85455E-03        -2.03881E-02         1.51664E+00         7.75672E-01         1.51678E+00         1.15995E+01         1.00000E+00         3.82797E-11         1.15995E+01         1.04930E+00         1.05502E+01
+          2.41390E-02         9.02438E-03        -2.04835E-02         1.51664E+00         7.86343E-01         1.51678E+00         1.09925E+01         1.00000E+00         4.07343E-11         1.09925E+01         1.00348E+00         9.98900E+00
+          2.41390E-02         9.19421E-03        -2.05807E-02         1.51664E+00         7.97013E-01         1.51677E+00         1.04111E+01         1.00000E+00         4.31730E-11         1.04111E+01         9.59246E-01         9.45184E+00
+          2.41390E-02         9.36403E-03        -2.06797E-02         1.51663E+00         8.07684E-01         1.51677E+00         9.85502E+00         1.00000E+00         4.55839E-11         9.85502E+00         9.16645E-01         8.93837E+00
+          2.41390E-02         9.53386E-03        -2.07805E-02         1.51663E+00         8.18354E-01         1.51677E+00         9.32396E+00         1.00000E+00         4.79541E-11         9.32396E+00         8.75710E-01         8.44825E+00
+          2.41390E-02         9.70369E-03        -2.08831E-02         1.51663E+00         8.29025E-01         1.51677E+00         8.81756E+00         1.00000E+00         5.02703E-11         8.81756E+00         8.36473E-01         7.98109E+00
+          2.41390E-02         9.87352E-03        -2.09875E-02         1.51663E+00         8.39695E-01         1.51677E+00         8.33544E+00         1.00000E+00         5.25184E-11         8.33544E+00         7.98962E-01         7.53648E+00
+          2.41390E-02         1.00433E-02        -2.10937E-02         1.51662E+00         8.50366E-01         1.51677E+00         7.87717E+00         1.00000E+00         5.46838E-11         7.87717E+00         7.63205E-01         7.11396E+00
+          2.41390E-02         1.02132E-02        -2.12018E-02         1.51662E+00         8.61037E-01         1.51677E+00         7.44229E+00         1.00000E+00         5.67511E-11         7.44229E+00         7.29220E-01         6.71307E+00
+          2.41390E-02         1.03830E-02        -2.13116E-02         1.51662E+00         8.71707E-01         1.51677E+00         7.03031E+00         1.00000E+00         5.87043E-11         7.03031E+00         6.97026E-01         6.33329E+00
+          2.41390E-02         1.05528E-02        -2.14233E-02         1.51661E+00         8.82378E-01         1.51677E+00         6.64073E+00         1.00000E+00         6.05267E-11         6.64073E+00         6.66636E-01         5.97410E+00
+          2.41390E-02         1.07227E-02        -2.15368E-02         1.51661E+00         8.93048E-01         1.51677E+00         6.27301E+00         1.00000E+00         6.22011E-11         6.27301E+00         6.38058E-01         5.63495E+00
+          2.41390E-02         1.08925E-02        -2.16521E-02         1.51661E+00         9.03719E-01         1.51676E+00         5.92657E+00         1.00000E+00         6.37097E-11         5.92657E+00         6.11298E-01         5.31527E+00
+          2.41390E-02         1.10623E-02        -2.17692E-02         1.51661E+00         9.14389E-01         1.51676E+00         5.60084E+00         1.00000E+00         6.50341E-11         5.60084E+00         5.86355E-01         5.01449E+00
+          2.41390E-02         1.12321E-02        -2.18881E-02         1.51660E+00         9.25060E-01         1.51676E+00         5.29522E+00         1.00000E+00         6.61556E-11         5.29522E+00         5.63228E-01         4.73199E+00
+          2.41390E-02         1.14020E-02        -2.20089E-02         1.51660E+00         9.35731E-01         1.51676E+00         5.00908E+00         1.00000E+00         6.70550E-11         5.00908E+00         5.41908E-01         4.46717E+00
+          2.41390E-02         1.15718E-02        -2.21314E-02         1.51660E+00         9.46401E-01         1.51676E+00         4.74180E+00         1.00000E+00         6.77130E-11         4.74180E+00         5.22383E-01         4.21942E+00
+          2.41390E-02         1.17416E-02        -2.22558E-02         1.51659E+00         9.57072E-01         1.51676E+00         4.49273E+00         1.00000E+00         6.81103E-11         4.49273E+00         5.04638E-01         3.98809E+00
+          2.41390E-02         1.19114E-02        -2.23819E-02         1.51659E+00         9.67742E-01         1.51676E+00         4.26121E+00         1.00000E+00         6.82275E-11         4.26121E+00         4.88654E-01         3.77256E+00
+          2.41390E-02         1.20813E-02        -2.25099E-02         1.51659E+00         9.78413E-01         1.51676E+00         4.04660E+00         1.00000E+00         6.80458E-11         4.04660E+00         4.74406E-01         3.57219E+00
+          2.41390E-02         1.22511E-02        -2.26397E-02         1.51659E+00         9.89083E-01         1.51675E+00         3.84821E+00         1.00000E+00         6.75473E-11         3.84821E+00         4.61867E-01         3.38635E+00
+          2.41390E-02         1.24209E-02        -2.27713E-02         1.51658E+00         9.99754E-01         1.51675E+00         3.66539E+00         1.00000E+00         6.67151E-11         3.66539E+00         4.51006E-01         3.21439E+00
+          2.41390E-02         1.25908E-02        -2.29047E-02         1.51658E+00         1.01042E+00         1.51675E+00         3.49747E+00         1.00000E+00         6.55344E-11         3.49747E+00         4.41787E-01         3.05568E+00
+          2.41390E-02         1.27606E-02        -2.30399E-02         1.51658E+00         1.02110E+00         1.51675E+00         3.34376E+00         1.00000E+00         6.39932E-11         3.34376E+00         4.34172E-01         2.90959E+00
+          2.41390E-02         1.29304E-02        -2.31770E-02         1.51657E+00         1.03177E+00         1.51675E+00         3.20361E+00         1.00000E+00         6.20837E-11         3.20361E+00         4.28120E-01         2.77549E+00
+          2.41390E-02         1.31002E-02        -2.33158E-02         1.51657E+00         1.04244E+00         1.51675E+00         3.07635E+00         1.00000E+00         5.98041E-11         3.07635E+00         4.23584E-01         2.65276E+00
+          2.41390E-02         1.32701E-02        -2.34565E-02         1.51657E+00         1.05311E+00         1.51675E+00         2.96132E+00         1.00000E+00         5.71616E-11         2.96132E+00         4.20517E-01         2.54080E+00
+          2.41390E-02         1.34399E-02        -2.35990E-02         1.51656E+00         1.06378E+00         1.51675E+00         2.85787E+00         1.00000E+00         5.41771E-11         2.85787E+00         4.18866E-01         2.43901E+00
+          2.41390E-02         1.36097E-02        -2.37433E-02         1.51656E+00         1.07445E+00         1.51674E+00         2.76536E+00         1.00000E+00         5.08919E-11         2.76536E+00         4.18578E-01         2.34678E+00
+          2.41390E-02         1.37795E-02        -2.38894E-02         1.51656E+00         1.08512E+00         1.51674E+00         2.68316E+00         1.00000E+00         4.73797E-11         2.68316E+00         4.19594E-01         2.26356E+00
+          2.41390E-02         1.39494E-02        -2.40373E-02         1.51655E+00         1.09579E+00         1.51674E+00         2.61064E+00         1.00000E+00         4.37651E-11         2.61064E+00         4.21857E-01         2.18878E+00
+          2.41390E-02         1.41192E-02        -2.41870E-02         1.51655E+00         1.10646E+00         1.51674E+00         2.54719E+00         1.00000E+00         4.02522E-11         2.54719E+00         4.25303E-01         2.12188E+00
+          2.41390E-02         1.42890E-02        -2.43385E-02         1.51654E+00         1.11713E+00         1.51674E+00         2.49221E+00         1.00000E+00         3.71637E-11         2.49221E+00         4.29870E-01         2.06234E+00
+          2.41390E-02         1.44589E-02        -2.44919E-02         1.51654E+00         1.12780E+00         1.51674E+00         2.44513E+00         1.00000E+00         3.49718E-11         2.44513E+00         4.35491E-01         2.00964E+00
+          2.41390E-02         1.46287E-02        -2.46471E-02         1.51654E+00         1.13847E+00         1.51674E+00         2.40537E+00         1.00000E+00         3.42658E-11         2.40537E+00         4.42098E-01         1.96327E+00
+          2.41390E-02         1.47985E-02        -2.48040E-02         1.51653E+00         1.14914E+00         1.51674E+00         2.37238E+00         1.00000E+00         3.55816E-11         2.37238E+00         4.49623E-01         1.92275E+00
+          2.41390E-02         1.49683E-02        -2.49628E-02         1.51653E+00         1.15981E+00         1.51673E+00         2.34562E+00         1.00000E+00         3.91606E-11         2.34562E+00         4.57995E-01         1.88763E+00
+          2.41390E-02         1.51382E-02        -2.51234E-02         1.51653E+00         1.17048E+00         1.51673E+00         2.32459E+00         1.00000E+00         4.48842E-11         2.32459E+00         4.67144E-01         1.85744E+00
+          2.41390E-02         1.53080E-02        -2.52858E-02         1.51652E+00         1.18115E+00         1.51673E+00         2.30876E+00         1.00000E+00         5.24406E-11         2.30876E+00         4.76996E-01         1.83177E+00
+          2.41390E-02         1.54778E-02        -2.54500E-02         1.51652E+00         1.19182E+00         1.51673E+00         2.29767E+00         1.00000E+00         6.15083E-11         2.29767E+00         4.87480E-01         1.81019E+00
+          2.41390E-02         1.56476E-02        -2.56161E-02         1.51651E+00         1.20249E+00         1.51673E+00         2.29085E+00         1.00000E+00         7.18331E-11         2.29085E+00         4.98523E-01         1.79232E+00
+          2.41390E-02         1.58175E-02        -2.57839E-02         1.51651E+00         1.21317E+00         1.51673E+00         2.28784E+00         1.00000E+00         8.32315E-11         2.28784E+00         5.10051E-01         1.77779E+00
+          2.41390E-02         1.59873E-02        -2.59536E-02         1.51651E+00         1.22384E+00         1.51673E+00         2.28823E+00         1.00000E+00         9.55723E-11         2.28823E+00         5.21991E-01         1.76624E+00
+          2.41390E-02         1.61571E-02        -2.61251E-02         1.51650E+00         1.23451E+00         1.51673E+00         2.29160E+00         1.00000E+00         1.08758E-10         2.29160E+00         5.34270E-01         1.75733E+00
+          2.41390E-02         1.63270E-02        -2.62983E-02         1.51650E+00         1.24518E+00         1.51673E+00         2.29756E+00         1.00000E+00         1.22711E-10         2.29756E+00         5.46817E-01         1.75075E+00
+          2.41390E-02         1.64968E-02        -2.64734E-02         1.51649E+00         1.25585E+00         1.51672E+00         2.30575E+00         1.00000E+00         1.37366E-10         2.30575E+00         5.59559E-01         1.74619E+00
+          2.41390E-02         1.66666E-02        -2.66503E-02         1.51649E+00         1.26652E+00         1.51672E+00         2.31581E+00         1.00000E+00         1.52663E-10         2.31581E+00         5.72427E-01         1.74338E+00
+          2.41390E-02         1.68364E-02        -2.68291E-02         1.51648E+00         1.27719E+00         1.51672E+00         2.32741E+00         1.00000E+00         1.68544E-10         2.32741E+00         5.85350E-01         1.74206E+00
+          2.41390E-02         1.70063E-02        -2.70096E-02         1.51648E+00         1.28786E+00         1.51672E+00         2.34023E+00         1.00000E+00         1.84950E-10         2.34023E+00         5.98262E-01         1.74197E+00
+          2.41390E-02         1.71761E-02        -2.71919E-02         1.51648E+00         1.29853E+00         1.51672E+00         2.35398E+00         1.00000E+00         2.01820E-10         2.35398E+00         6.11095E-01         1.74288E+00
+          2.41390E-02         1.73459E-02        -2.73761E-02         1.51647E+00         1.30920E+00         1.51672E+00         2.36837E+00         1.00000E+00         2.19089E-10         2.36837E+00         6.23785E-01         1.74459E+00
+          2.41390E-02         1.75158E-02        -2.75621E-02         1.51647E+00         1.31987E+00         1.51672E+00         2.38316E+00         1.00000E+00         2.36689E-10         2.38316E+00         6.36269E-01         1.74689E+00
+          2.41390E-02         1.76856E-02        -2.77499E-02         1.51646E+00         1.33054E+00         1.51672E+00         2.39810E+00         1.00000E+00         2.54544E-10         2.39810E+00         6.48487E-01         1.74961E+00
+          2.41390E-02         1.78554E-02        -2.79395E-02         1.51646E+00         1.34121E+00         1.51671E+00         2.41296E+00         1.00000E+00         2.72575E-10         2.41296E+00         6.60379E-01         1.75258E+00
+          2.41390E-02         1.80252E-02        -2.81309E-02         1.51645E+00         1.35188E+00         1.51671E+00         2.42753E+00         1.00000E+00         2.90696E-10         2.42753E+00         6.71891E-01         1.75564E+00
+          2.41390E-02         1.81951E-02        -2.83241E-02         1.51645E+00         1.36255E+00         1.51671E+00         2.44163E+00         1.00000E+00         3.08816E-10         2.44163E+00         6.82969E-01         1.75866E+00
+          2.41390E-02         1.83649E-02        -2.85191E-02         1.51644E+00         1.37322E+00         1.51671E+00         2.45507E+00         1.00000E+00         3.26838E-10         2.45507E+00         6.93562E-01         1.76151E+00
+          2.41390E-02         1.85347E-02        -2.87160E-02         1.51644E+00         1.38389E+00         1.51671E+00         2.46770E+00         1.00000E+00         3.44656E-10         2.46770E+00         7.03622E-01         1.76408E+00
+          2.41390E-02         1.87045E-02        -2.89146E-02         1.51643E+00         1.39457E+00         1.51671E+00         2.47937E+00         1.00000E+00         3.62163E-10         2.47937E+00         7.13104E-01         1.76626E+00
+          2.41390E-02         1.88744E-02        -2.91151E-02         1.51643E+00         1.40524E+00         1.51671E+00         2.48994E+00         1.00000E+00         3.79240E-10         2.48994E+00         7.21966E-01         1.76797E+00
+          2.41390E-02         1.90442E-02        -2.93174E-02         1.51642E+00         1.41591E+00         1.51671E+00         2.49929E+00         1.00000E+00         3.95768E-10         2.49929E+00         7.30170E-01         1.76912E+00
+          2.41390E-02         1.92140E-02        -2.95215E-02         1.51642E+00         1.42658E+00         1.51671E+00         2.50733E+00         1.00000E+00         4.11618E-10         2.50733E+00         7.37679E-01         1.76966E+00
+          2.41390E-02         1.93839E-02        -2.97274E-02         1.51641E+00         1.43725E+00         1.51671E+00         2.51397E+00         1.00000E+00         4.26659E-10         2.51397E+00         7.44460E-01         1.76950E+00
+          2.41390E-02         1.95537E-02        -2.99351E-02         1.51641E+00         1.44792E+00         1.51670E+00         2.51911E+00         1.00000E+00         4.40755E-10         2.51911E+00         7.50486E-01         1.76862E+00
+          2.41390E-02         1.97235E-02        -3.01446E-02         1.51640E+00         1.45859E+00         1.51670E+00         2.52269E+00         1.00000E+00         4.53763E-10         2.52269E+00         7.55729E-01         1.76696E+00
+          2.41390E-02         1.98933E-02        -3.03560E-02         1.51640E+00         1.46926E+00         1.51670E+00         2.52465E+00         1.00000E+00         4.65541E-10         2.52465E+00         7.60168E-01         1.76448E+00
+          2.41390E-02         2.00632E-02        -3.05691E-02         1.51639E+00         1.47993E+00         1.51670E+00         2.52495E+00         1.00000E+00         4.75941E-10         2.52495E+00         7.63782E-01         1.76117E+00
+          2.41390E-02         2.02330E-02        -3.07841E-02         1.51639E+00         1.49060E+00         1.51670E+00         2.52355E+00         1.00000E+00         4.84816E-10         2.52355E+00         7.66557E-01         1.75699E+00
+          2.41390E-02         2.04028E-02        -3.10009E-02         1.51638E+00         1.50127E+00         1.51670E+00         2.52041E+00         1.00000E+00         4.92018E-10         2.52041E+00         7.68479E-01         1.75193E+00
+          2.41390E-02         2.05726E-02        -3.12195E-02         1.51638E+00         1.51194E+00         1.51670E+00         2.51553E+00         1.00000E+00         4.97401E-10         2.51553E+00         7.69539E-01         1.74599E+00
+          2.41390E-02         2.07425E-02        -3.14399E-02         1.51637E+00         1.52261E+00         1.51670E+00         2.50889E+00         1.00000E+00         5.00819E-10         2.50889E+00         7.69732E-01         1.73916E+00
+          2.41390E-02         2.09123E-02        -3.16621E-02         1.51637E+00         1.53328E+00         1.51670E+00         2.50048E+00         1.00000E+00         5.02136E-10         2.50048E+00         7.69054E-01         1.73143E+00
+          2.41390E-02         2.10821E-02        -3.18862E-02         1.51636E+00         1.54395E+00         1.51670E+00         2.49032E+00         1.00000E+00         5.01219E-10         2.49032E+00         7.67506E-01         1.72281E+00
+          2.41390E-02         2.12520E-02        -3.21120E-02         1.51636E+00         1.55462E+00         1.51670E+00         2.47841E+00         1.00000E+00         4.97951E-10         2.47841E+00         7.65092E-01         1.71332E+00
+          2.41390E-02         2.14218E-02        -3.23397E-02         1.51635E+00         1.56529E+00         1.51670E+00         2.46477E+00         1.00000E+00         4.92228E-10         2.46477E+00         7.61817E-01         1.70295E+00
+          2.41390E-02         2.15916E-02        -3.25692E-02         1.51635E+00         1.57596E+00         1.51670E+00         2.44943E+00         1.00000E+00         4.83969E-10         2.44943E+00         7.57693E-01         1.69174E+00
+          2.41390E-02         2.17614E-02        -3.28004E-02         1.51634E+00         1.58664E+00         1.51669E+00         2.43241E+00         1.00000E+00         4.73124E-10         2.43241E+00         7.52730E-01         1.67968E+00
+          2.41390E-02         2.19313E-02        -3.30335E-02         1.51633E+00         1.59731E+00         1.51669E+00         2.41375E+00         1.00000E+00         4.59683E-10         2.41375E+00         7.46944E-01         1.66681E+00
+          2.41390E-02         2.21011E-02        -3.32685E-02         1.51633E+00         1.60798E+00         1.51669E+00         2.39349E+00         1.00000E+00         4.43694E-10         2.39349E+00         7.40352E-01         1.65314E+00
+          2.41390E-02         2.22709E-02        -3.35052E-02         1.51632E+00         1.61865E+00         1.51669E+00         2.37167E+00         1.00000E+00         4.25289E-10         2.37167E+00         7.32975E-01         1.63870E+00
+          2.41390E-02         2.24407E-02        -3.37437E-02         1.51632E+00         1.62932E+00         1.51669E+00         2.34835E+00         1.00000E+00         4.04717E-10         2.34835E+00         7.24836E-01         1.62351E+00
+          2.41390E-02         2.26106E-02        -3.39841E-02         1.51631E+00         1.63999E+00         1.51669E+00         2.32356E+00         1.00000E+00         3.82396E-10         2.32356E+00         7.15958E-01         1.60761E+00
+          2.41390E-02         2.27804E-02        -3.42262E-02         1.51631E+00         1.65066E+00         1.51669E+00         2.29738E+00         1.00000E+00         3.59002E-10         2.29738E+00         7.06370E-01         1.59101E+00
+          2.41390E-02         2.29502E-02        -3.44702E-02         1.51630E+00         1.66133E+00         1.51669E+00         2.26986E+00         1.00000E+00         3.35577E-10         2.26986E+00         6.96099E-01         1.57376E+00
+          2.41390E-02         2.31201E-02        -3.47160E-02         1.51629E+00         1.67200E+00         1.51669E+00         2.24105E+00         1.00000E+00         3.13696E-10         2.24105E+00         6.85176E-01         1.55588E+00
+          2.41390E-02         2.32899E-02        -3.49636E-02         1.51629E+00         1.68267E+00         1.51669E+00         2.21103E+00         1.00000E+00         2.95614E-10         2.21103E+00         6.73634E-01         1.53740E+00
+          2.41390E-02         2.34597E-02        -3.52130E-02         1.51628E+00         1.69334E+00         1.51669E+00         2.17986E+00         1.00000E+00         2.84296E-10         2.17986E+00         6.61507E-01         1.51835E+00
+          2.41390E-02         2.36295E-02        -3.54643E-02         1.51628E+00         1.70401E+00         1.51669E+00         2.14760E+00         1.00000E+00         2.83042E-10         2.14760E+00         6.48829E-01         1.49877E+00
+          2.41390E-02         2.37994E-02        -3.57173E-02         1.51627E+00         1.71468E+00         1.51669E+00         2.11434E+00         1.00000E+00         2.94576E-10         2.11434E+00         6.35636E-01         1.47870E+00
+          2.41390E-02         2.39692E-02        -3.59722E-02         1.51626E+00         1.72535E+00         1.51669E+00         2.08013E+00         1.00000E+00         3.20075E-10         2.08013E+00         6.21967E-01         1.45817E+00
+          2.41390E-02         2.41390E-02        -3.62288E-02         1.51626E+00         1.73602E+00         1.51669E+00         2.04506E+00         1.00000E+00         3.58979E-10         2.04506E+00         6.07858E-01         1.43720E+00
+          2.41390E-02         2.43088E-02        -3.64873E-02         1.51625E+00         1.74669E+00         1.51669E+00         2.00920E+00         1.00000E+00         4.09685E-10         2.00920E+00         5.93350E-01         1.41585E+00
+          2.41390E-02         2.44787E-02        -3.67476E-02         1.51624E+00         1.75736E+00         1.51669E+00         1.97262E+00         1.00000E+00         4.70365E-10         1.97262E+00         5.78480E-01         1.39414E+00
+          2.41390E-02         2.46485E-02        -3.70097E-02         1.51624E+00         1.76804E+00         1.51669E+00         1.93540E+00         1.00000E+00         5.39412E-10         1.93540E+00         5.63290E-01         1.37211E+00
+          2.41390E-02         2.48183E-02        -3.72737E-02         1.51623E+00         1.77871E+00         1.51669E+00         1.89762E+00         1.00000E+00         6.15545E-10         1.89762E+00         5.47819E-01         1.34980E+00
+          2.41390E-02         2.49882E-02        -3.75394E-02         1.51623E+00         1.78938E+00         1.51669E+00         1.85936E+00         1.00000E+00         6.97768E-10         1.85936E+00         5.32106E-01         1.32725E+00
+          2.41390E-02         2.51580E-02        -3.78069E-02         1.51622E+00         1.80005E+00         1.51669E+00         1.82069E+00         1.00000E+00         7.85288E-10         1.82069E+00         5.16193E-01         1.30449E+00
+          2.41390E-02         2.53278E-02        -3.80763E-02         1.51621E+00         1.81072E+00         1.51669E+00         1.78168E+00         1.00000E+00         8.77450E-10         1.78168E+00         5.00118E-01         1.28156E+00
+          2.41390E-02         2.54976E-02        -3.83475E-02         1.51621E+00         1.82139E+00         1.51669E+00         1.74243E+00         1.00000E+00         9.73683E-10         1.74243E+00         4.83922E-01         1.25851E+00
+          2.41390E-02         2.56675E-02        -3.86205E-02         1.51620E+00         1.83206E+00         1.51669E+00         1.70300E+00         1.00000E+00         1.07346E-09         1.70300E+00         4.67642E-01         1.23536E+00
+          2.41390E-02         2.58373E-02        -3.88953E-02         1.51619E+00         1.84273E+00         1.51669E+00         1.66348E+00         1.00000E+00         1.17629E-09         1.66348E+00         4.51318E-01         1.21216E+00
+          2.41390E-02         2.60071E-02        -3.91719E-02         1.51619E+00         1.85340E+00         1.51669E+00         1.62393E+00         1.00000E+00         1.28167E-09         1.62393E+00         4.34986E-01         1.18895E+00
+          2.41390E-02         2.61769E-02        -3.94503E-02         1.51618E+00         1.86407E+00         1.51669E+00         1.58445E+00         1.00000E+00         1.38911E-09         1.58445E+00         4.18684E-01         1.16576E+00
+          2.43088E-02         8.72665E-04        -1.82082E-02         1.52737E+00         2.74155E-01         1.52748E+00         5.98296E+01         1.00000E+00         2.96910E-11         5.98296E+01         3.72633E+00         5.61033E+01
+          2.43088E-02         1.04249E-03        -1.82184E-02         1.52737E+00         2.84826E-01         1.52748E+00         5.87681E+01         1.00000E+00         2.72767E-11         5.87681E+01         3.68315E+00         5.50850E+01
+          2.43088E-02         1.21232E-03        -1.82304E-02         1.52737E+00         2.95496E-01         1.52748E+00         5.76845E+01         1.00000E+00         2.49404E-11         5.76845E+01         3.63857E+00         5.40459E+01
+          2.43088E-02         1.38215E-03        -1.82442E-02         1.52737E+00         3.06167E-01         1.52748E+00         5.65805E+01         1.00000E+00         2.26954E-11         5.65805E+01         3.59264E+00         5.29878E+01
+          2.43088E-02         1.55197E-03        -1.82599E-02         1.52737E+00         3.16838E-01         1.52748E+00         5.54579E+01         1.00000E+00         2.05550E-11         5.54579E+01         3.54538E+00         5.19125E+01
+          2.43088E-02         1.72180E-03        -1.82774E-02         1.52737E+00         3.27508E-01         1.52748E+00         5.43185E+01         1.00000E+00         1.85325E-11         5.43185E+01         3.49683E+00         5.08217E+01
+          2.43088E-02         1.89163E-03        -1.82966E-02         1.52737E+00         3.38179E-01         1.52748E+00         5.31641E+01         1.00000E+00         1.66410E-11         5.31641E+01         3.44704E+00         4.97171E+01
+          2.43088E-02         2.06146E-03        -1.83177E-02         1.52737E+00         3.48849E-01         1.52748E+00         5.19965E+01         1.00000E+00         1.48935E-11         5.19965E+01         3.39605E+00         4.86005E+01
+          2.43088E-02         2.23128E-03        -1.83406E-02         1.52737E+00         3.59520E-01         1.52748E+00         5.08175E+01         1.00000E+00         1.33028E-11         5.08175E+01         3.34389E+00         4.74736E+01
+          2.43088E-02         2.40111E-03        -1.83653E-02         1.52737E+00         3.70190E-01         1.52748E+00         4.96288E+01         1.00000E+00         1.18806E-11         4.96288E+01         3.29062E+00         4.63382E+01
+          2.43088E-02         2.57094E-03        -1.83918E-02         1.52736E+00         3.80861E-01         1.52748E+00         4.84323E+01         1.00000E+00         1.06368E-11         4.84323E+01         3.23628E+00         4.51960E+01
+          2.43088E-02         2.74077E-03        -1.84202E-02         1.52736E+00         3.91532E-01         1.52748E+00         4.72296E+01         1.00000E+00         9.57738E-12         4.72296E+01         3.18092E+00         4.40487E+01
+          2.43088E-02         2.91059E-03        -1.84503E-02         1.52736E+00         4.02202E-01         1.52747E+00         4.60226E+01         1.00000E+00         8.70251E-12         4.60226E+01         3.12460E+00         4.28980E+01
+          2.43088E-02         3.08042E-03        -1.84823E-02         1.52736E+00         4.12873E-01         1.52747E+00         4.48129E+01         1.00000E+00         8.00353E-12         4.48129E+01         3.06737E+00         4.17455E+01
+          2.43088E-02         3.25025E-03        -1.85160E-02         1.52736E+00         4.23543E-01         1.52747E+00         4.36021E+01         1.00000E+00         7.46152E-12         4.36021E+01         3.00927E+00         4.05929E+01
+          2.43088E-02         3.42008E-03        -1.85516E-02         1.52736E+00         4.34214E-01         1.52747E+00         4.23921E+01         1.00000E+00         7.04767E-12         4.23921E+01         2.95039E+00         3.94417E+01
+          2.43088E-02         3.58990E-03        -1.85890E-02         1.52736E+00         4.44884E-01         1.52747E+00         4.11843E+01         1.00000E+00         6.72632E-12         4.11843E+01         2.89076E+00         3.82936E+01
+          2.43088E-02         3.75973E-03        -1.86282E-02         1.52736E+00         4.55555E-01         1.52747E+00         3.99804E+01         1.00000E+00         6.45948E-12         3.99804E+01         2.83045E+00         3.71500E+01
+          2.43088E-02         3.92956E-03        -1.86692E-02         1.52736E+00         4.66225E-01         1.52747E+00         3.87820E+01         1.00000E+00         6.21124E-12         3.87820E+01         2.76954E+00         3.60124E+01
+          2.43088E-02         4.09939E-03        -1.87120E-02         1.52736E+00         4.76896E-01         1.52747E+00         3.75904E+01         1.00000E+00         5.95094E-12         3.75904E+01         2.70807E+00         3.48823E+01
+          2.43088E-02         4.26921E-03        -1.87567E-02         1.52736E+00         4.87567E-01         1.52747E+00         3.64071E+01         1.00000E+00         5.65476E-12         3.64071E+01         2.64612E+00         3.37610E+01
+          2.43088E-02         4.43904E-03        -1.88031E-02         1.52735E+00         4.98237E-01         1.52747E+00         3.52337E+01         1.00000E+00         5.30632E-12         3.52337E+01         2.58375E+00         3.26499E+01
+          2.43088E-02         4.60887E-03        -1.88514E-02         1.52735E+00         5.08908E-01         1.52747E+00         3.40713E+01         1.00000E+00         4.89729E-12         3.40713E+01         2.52104E+00         3.15503E+01
+          2.43088E-02         4.77869E-03        -1.89015E-02         1.52735E+00         5.19578E-01         1.52747E+00         3.29213E+01         1.00000E+00         4.42883E-12         3.29213E+01         2.45806E+00         3.04633E+01
+          2.43088E-02         4.94852E-03        -1.89533E-02         1.52735E+00         5.30249E-01         1.52747E+00         3.17850E+01         1.00000E+00         3.91570E-12         3.17850E+01         2.39487E+00         2.93902E+01
+          2.43088E-02         5.11835E-03        -1.90070E-02         1.52735E+00         5.40919E-01         1.52747E+00         3.06636E+01         1.00000E+00         3.39631E-12         3.06636E+01         2.33155E+00         2.83320E+01
+          2.43088E-02         5.28818E-03        -1.90625E-02         1.52735E+00         5.51590E-01         1.52747E+00         2.95581E+01         1.00000E+00         2.95311E-12         2.95581E+01         2.26818E+00         2.72899E+01
+          2.43088E-02         5.45800E-03        -1.91199E-02         1.52735E+00         5.62261E-01         1.52747E+00         2.84696E+01         1.00000E+00         2.73523E-12         2.84696E+01         2.20482E+00         2.62648E+01
+          2.43088E-02         5.62783E-03        -1.91790E-02         1.52735E+00         5.72931E-01         1.52747E+00         2.73992E+01         1.00000E+00         2.91303E-12         2.73992E+01         2.14156E+00         2.52577E+01
+          2.43088E-02         5.79766E-03        -1.92399E-02         1.52734E+00         5.83602E-01         1.52747E+00         2.63478E+01         1.00000E+00         3.53083E-12         2.63478E+01         2.07846E+00         2.42694E+01
+          2.43088E-02         5.96749E-03        -1.93027E-02         1.52734E+00         5.94272E-01         1.52746E+00         2.53163E+01         1.00000E+00         4.49529E-12         2.53163E+01         2.01561E+00         2.33007E+01
+          2.43088E-02         6.13731E-03        -1.93672E-02         1.52734E+00         6.04943E-01         1.52746E+00         2.43054E+01         1.00000E+00         5.70321E-12         2.43054E+01         1.95307E+00         2.23524E+01
+          2.43088E-02         6.30714E-03        -1.94336E-02         1.52734E+00         6.15613E-01         1.52746E+00         2.33160E+01         1.00000E+00         7.08958E-12         2.33160E+01         1.89094E+00         2.14251E+01
+          2.43088E-02         6.47697E-03        -1.95018E-02         1.52734E+00         6.26284E-01         1.52746E+00         2.23488E+01         1.00000E+00         8.61726E-12         2.23488E+01         1.82927E+00         2.05195E+01
+          2.43088E-02         6.64680E-03        -1.95718E-02         1.52734E+00         6.36955E-01         1.52746E+00         2.14043E+01         1.00000E+00         1.02637E-11         2.14043E+01         1.76815E+00         1.96361E+01
+          2.43088E-02         6.81662E-03        -1.96436E-02         1.52733E+00         6.47625E-01         1.52746E+00         2.04831E+01         1.00000E+00         1.20137E-11         2.04831E+01         1.70765E+00         1.87754E+01
+          2.43088E-02         6.98645E-03        -1.97172E-02         1.52733E+00         6.58296E-01         1.52746E+00         1.95858E+01         1.00000E+00         1.38556E-11         1.95858E+01         1.64785E+00         1.79379E+01
+          2.43088E-02         7.15628E-03        -1.97927E-02         1.52733E+00         6.68966E-01         1.52746E+00         1.87127E+01         1.00000E+00         1.57794E-11         1.87127E+01         1.58881E+00         1.71239E+01
+          2.43088E-02         7.32611E-03        -1.98699E-02         1.52733E+00         6.79637E-01         1.52746E+00         1.78643E+01         1.00000E+00         1.77764E-11         1.78643E+01         1.53062E+00         1.63337E+01
+          2.43088E-02         7.49593E-03        -1.99490E-02         1.52733E+00         6.90307E-01         1.52746E+00         1.70408E+01         1.00000E+00         1.98380E-11         1.70408E+01         1.47333E+00         1.55675E+01
+          2.43088E-02         7.66576E-03        -2.00299E-02         1.52733E+00         7.00978E-01         1.52746E+00         1.62426E+01         1.00000E+00         2.19559E-11         1.62426E+01         1.41702E+00         1.48256E+01
+          2.43088E-02         7.83559E-03        -2.01125E-02         1.52732E+00         7.11649E-01         1.52746E+00         1.54697E+01         1.00000E+00         2.41216E-11         1.54697E+01         1.36175E+00         1.41080E+01
+          2.43088E-02         8.00542E-03        -2.01970E-02         1.52732E+00         7.22319E-01         1.52745E+00         1.47224E+01         1.00000E+00         2.63265E-11         1.47224E+01         1.30760E+00         1.34148E+01
+          2.43088E-02         8.17524E-03        -2.02833E-02         1.52732E+00         7.32990E-01         1.52745E+00         1.40008E+01         1.00000E+00         2.85617E-11         1.40008E+01         1.25462E+00         1.27461E+01
+          2.43088E-02         8.34507E-03        -2.03715E-02         1.52732E+00         7.43660E-01         1.52745E+00         1.33047E+01         1.00000E+00         3.08180E-11         1.33047E+01         1.20287E+00         1.21019E+01
+          2.43088E-02         8.51490E-03        -2.04614E-02         1.52731E+00         7.54331E-01         1.52745E+00         1.26343E+01         1.00000E+00         3.30856E-11         1.26343E+01         1.15241E+00         1.14819E+01
+          2.43088E-02         8.68473E-03        -2.05531E-02         1.52731E+00         7.65001E-01         1.52745E+00         1.19895E+01         1.00000E+00         3.53547E-11         1.19895E+01         1.10331E+00         1.08862E+01
+          2.43088E-02         8.85455E-03        -2.06467E-02         1.52731E+00         7.75672E-01         1.52745E+00         1.13700E+01         1.00000E+00         3.76145E-11         1.13700E+01         1.05560E+00         1.03144E+01
+          2.43088E-02         9.02438E-03        -2.07420E-02         1.52731E+00         7.86343E-01         1.52745E+00         1.07758E+01         1.00000E+00         3.98541E-11         1.07758E+01         1.00934E+00         9.76645E+00
+          2.43088E-02         9.19421E-03        -2.08392E-02         1.52731E+00         7.97013E-01         1.52745E+00         1.02066E+01         1.00000E+00         4.20620E-11         1.02066E+01         9.64586E-01         9.24202E+00
+          2.43088E-02         9.36403E-03        -2.09382E-02         1.52730E+00         8.07684E-01         1.52745E+00         9.66216E+00         1.00000E+00         4.42260E-11         9.66216E+00         9.21371E-01         8.74079E+00
+          2.43088E-02         9.53386E-03        -2.10390E-02         1.52730E+00         8.18354E-01         1.52745E+00         9.14217E+00         1.00000E+00         4.63334E-11         9.14217E+00         8.79737E-01         8.26244E+00
+          2.43088E-02         9.70369E-03        -2.11416E-02         1.52730E+00         8.29025E-01         1.52744E+00         8.64629E+00         1.00000E+00         4.83710E-11         8.64629E+00         8.39723E-01         7.80656E+00
+          2.43088E-02         9.87352E-03        -2.12460E-02         1.52730E+00         8.39695E-01         1.52744E+00         8.17413E+00         1.00000E+00         5.03250E-11         8.17413E+00         8.01362E-01         7.37276E+00
+          2.43088E-02         1.00433E-02        -2.13523E-02         1.52729E+00         8.50366E-01         1.52744E+00         7.72527E+00         1.00000E+00         5.21808E-11         7.72527E+00         7.64683E-01         6.96059E+00
+          2.43088E-02         1.02132E-02        -2.14603E-02         1.52729E+00         8.61037E-01         1.52744E+00         7.29928E+00         1.00000E+00         5.39235E-11         7.29928E+00         7.29712E-01         6.56957E+00
+          2.43088E-02         1.03830E-02        -2.15702E-02         1.52729E+00         8.71707E-01         1.52744E+00         6.89567E+00         1.00000E+00         5.55375E-11         6.89567E+00         6.96472E-01         6.19920E+00
+          2.43088E-02         1.05528E-02        -2.16819E-02         1.52728E+00         8.82378E-01         1.52744E+00         6.51395E+00         1.00000E+00         5.70064E-11         6.51395E+00         6.64980E-01         5.84897E+00
+          2.43088E-02         1.07227E-02        -2.17953E-02         1.52728E+00         8.93048E-01         1.52744E+00         6.15357E+00         1.00000E+00         5.83137E-11         6.15357E+00         6.35250E-01         5.51832E+00
+          2.43088E-02         1.08925E-02        -2.19106E-02         1.52728E+00         9.03719E-01         1.52744E+00         5.81400E+00         1.00000E+00         5.94422E-11         5.81400E+00         6.07294E-01         5.20671E+00
+          2.43088E-02         1.10623E-02        -2.20277E-02         1.52728E+00         9.14389E-01         1.52744E+00         5.49466E+00         1.00000E+00         6.03742E-11         5.49466E+00         5.81116E-01         4.91355E+00
+          2.43088E-02         1.12321E-02        -2.21467E-02         1.52727E+00         9.25060E-01         1.52743E+00         5.19497E+00         1.00000E+00         6.10918E-11         5.19497E+00         5.56719E-01         4.63825E+00
+          2.43088E-02         1.14020E-02        -2.22674E-02         1.52727E+00         9.35731E-01         1.52743E+00         4.91430E+00         1.00000E+00         6.15768E-11         4.91430E+00         5.34101E-01         4.38020E+00
+          2.43088E-02         1.15718E-02        -2.23899E-02         1.52727E+00         9.46401E-01         1.52743E+00         4.65206E+00         1.00000E+00         6.18110E-11         4.65206E+00         5.13255E-01         4.13881E+00
+          2.43088E-02         1.17416E-02        -2.25143E-02         1.52726E+00         9.57072E-01         1.52743E+00         4.40761E+00         1.00000E+00         6.17761E-11         4.40761E+00         4.94171E-01         3.91344E+00
+          2.43088E-02         1.19114E-02        -2.26405E-02         1.52726E+00         9.67742E-01         1.52743E+00         4.18031E+00         1.00000E+00         6.14542E-11         4.18031E+00         4.76836E-01         3.70347E+00
+          2.43088E-02         1.20813E-02        -2.27684E-02         1.52726E+00         9.78413E-01         1.52743E+00         3.96951E+00         1.00000E+00         6.08281E-11         3.96951E+00         4.61230E-01         3.50828E+00
+          2.43088E-02         1.22511E-02        -2.28982E-02         1.52726E+00         9.89083E-01         1.52743E+00         3.77457E+00         1.00000E+00         5.98815E-11         3.77457E+00         4.47332E-01         3.32723E+00
+          2.43088E-02         1.24209E-02        -2.30298E-02         1.52725E+00         9.99754E-01         1.52743E+00         3.59482E+00         1.00000E+00         5.85999E-11         3.59482E+00         4.35115E-01         3.15971E+00
+          2.43088E-02         1.25908E-02        -2.31633E-02         1.52725E+00         1.01042E+00         1.52742E+00         3.42963E+00         1.00000E+00         5.69710E-11         3.42963E+00         4.24550E-01         3.00508E+00
+          2.43088E-02         1.27606E-02        -2.32985E-02         1.52725E+00         1.02110E+00         1.52742E+00         3.27833E+00         1.00000E+00         5.49863E-11         3.27833E+00         4.15602E-01         2.86272E+00
+          2.43088E-02         1.29304E-02        -2.34355E-02         1.52724E+00         1.03177E+00         1.52742E+00         3.14026E+00         1.00000E+00         5.26428E-11         3.14026E+00         4.08236E-01         2.73203E+00
+          2.43088E-02         1.31002E-02        -2.35744E-02         1.52724E+00         1.04244E+00         1.52742E+00         3.01479E+00         1.00000E+00         4.99455E-11         3.01479E+00         4.02410E-01         2.61238E+00
+          2.43088E-02         1.32701E-02        -2.37150E-02         1.52724E+00         1.05311E+00         1.52742E+00         2.90127E+00         1.00000E+00         4.69123E-11         2.90127E+00         3.98081E-01         2.50319E+00
+          2.43088E-02         1.34399E-02        -2.38575E-02         1.52723E+00         1.06378E+00         1.52742E+00         2.79907E+00         1.00000E+00         4.35816E-11         2.79907E+00         3.95201E-01         2.40387E+00
+          2.43088E-02         1.36097E-02        -2.40018E-02         1.52723E+00         1.07445E+00         1.52742E+00         2.70755E+00         1.00000E+00         4.00249E-11         2.70755E+00         3.93721E-01         2.31383E+00
+          2.43088E-02         1.37795E-02        -2.41479E-02         1.52722E+00         1.08512E+00         1.52742E+00         2.62611E+00         1.00000E+00         3.63695E-11         2.62611E+00         3.93587E-01         2.23252E+00
+          2.43088E-02         1.39494E-02        -2.42958E-02         1.52722E+00         1.09579E+00         1.52741E+00         2.55412E+00         1.00000E+00         3.28360E-11         2.55412E+00         3.94744E-01         2.15938E+00
+          2.43088E-02         1.41192E-02        -2.44455E-02         1.52722E+00         1.10646E+00         1.52741E+00         2.49101E+00         1.00000E+00         2.97937E-11         2.49101E+00         3.97133E-01         2.09388E+00
+          2.43088E-02         1.42890E-02        -2.45971E-02         1.52721E+00         1.11713E+00         1.52741E+00         2.43619E+00         1.00000E+00         2.78059E-11         2.43619E+00         4.00695E-01         2.03549E+00
+          2.43088E-02         1.44589E-02        -2.47504E-02         1.52721E+00         1.12780E+00         1.52741E+00         2.38908E+00         1.00000E+00         2.75604E-11         2.38908E+00         4.05367E-01         1.98371E+00
+          2.43088E-02         1.46287E-02        -2.49056E-02         1.52721E+00         1.13847E+00         1.52741E+00         2.34914E+00         1.00000E+00         2.95728E-11         2.34914E+00         4.11084E-01         1.93806E+00
+          2.43088E-02         1.47985E-02        -2.50626E-02         1.52720E+00         1.14914E+00         1.52741E+00         2.31584E+00         1.00000E+00         3.38898E-11         2.31584E+00         4.17779E-01         1.89806E+00
+          2.43088E-02         1.49683E-02        -2.52213E-02         1.52720E+00         1.15981E+00         1.52741E+00         2.28864E+00         1.00000E+00         4.01810E-11         2.28864E+00         4.25386E-01         1.86325E+00
+          2.43088E-02         1.51382E-02        -2.53819E-02         1.52719E+00         1.17048E+00         1.52741E+00         2.26705E+00         1.00000E+00         4.80416E-11         2.26705E+00         4.33835E-01         1.83321E+00
+          2.43088E-02         1.53080E-02        -2.55443E-02         1.52719E+00         1.18115E+00         1.52740E+00         2.25057E+00         1.00000E+00         5.71538E-11         2.25057E+00         4.43056E-01         1.80752E+00
+          2.43088E-02         1.54778E-02        -2.57086E-02         1.52719E+00         1.19182E+00         1.52740E+00         2.23874E+00         1.00000E+00         6.73019E-11         2.23874E+00         4.52978E-01         1.78577E+00
+          2.43088E-02         1.56476E-02        -2.58746E-02         1.52718E+00         1.20249E+00         1.52740E+00         2.23111E+00         1.00000E+00         7.83427E-11         2.23111E+00         4.63529E-01         1.76758E+00
+          2.43088E-02         1.58175E-02        -2.60425E-02         1.52718E+00         1.21317E+00         1.52740E+00         2.22724E+00         1.00000E+00         9.01772E-11         2.22724E+00         4.74638E-01         1.75260E+00
+          2.43088E-02         1.59873E-02        -2.62121E-02         1.52717E+00         1.22384E+00         1.52740E+00         2.22672E+00         1.00000E+00         1.02732E-10         2.22672E+00         4.86232E-01         1.74049E+00
+          2.43088E-02         1.61571E-02        -2.63836E-02         1.52717E+00         1.23451E+00         1.52740E+00         2.22915E+00         1.00000E+00         1.15948E-10         2.22915E+00         4.98239E-01         1.73091E+00
+          2.43088E-02         1.63270E-02        -2.65569E-02         1.52717E+00         1.24518E+00         1.52740E+00         2.23416E+00         1.00000E+00         1.29772E-10         2.23416E+00         5.10587E-01         1.72357E+00
+          2.43088E-02         1.64968E-02        -2.67320E-02         1.52716E+00         1.25585E+00         1.52740E+00         2.24137E+00         1.00000E+00         1.44155E-10         2.24137E+00         5.23205E-01         1.71817E+00
+          2.43088E-02         1.66666E-02        -2.69089E-02         1.52716E+00         1.26652E+00         1.52739E+00         2.25047E+00         1.00000E+00         1.59045E-10         2.25047E+00         5.36022E-01         1.71444E+00
+          2.43088E-02         1.68364E-02        -2.70876E-02         1.52715E+00         1.27719E+00         1.52739E+00         2.26111E+00         1.00000E+00         1.74391E-10         2.26111E+00         5.48968E-01         1.71214E+00
+          2.43088E-02         1.70063E-02        -2.72681E-02         1.52715E+00         1.28786E+00         1.52739E+00         2.27300E+00         1.00000E+00         1.90136E-10         2.27300E+00         5.61974E-01         1.71102E+00
+          2.43088E-02         1.71761E-02        -2.74505E-02         1.52714E+00         1.29853E+00         1.52739E+00         2.28585E+00         1.00000E+00         2.06221E-10         2.28585E+00         5.74974E-01         1.71088E+00
+          2.43088E-02         1.73459E-02        -2.76346E-02         1.52714E+00         1.30920E+00         1.52739E+00         2.29939E+00         1.00000E+00         2.22580E-10         2.29939E+00         5.87902E-01         1.71149E+00
+          2.43088E-02         1.75158E-02        -2.78206E-02         1.52714E+00         1.31987E+00         1.52739E+00         2.31338E+00         1.00000E+00         2.39145E-10         2.31338E+00         6.00692E-01         1.71269E+00
+          2.43088E-02         1.76856E-02        -2.80084E-02         1.52713E+00         1.33054E+00         1.52739E+00         2.32757E+00         1.00000E+00         2.55838E-10         2.32757E+00         6.13283E-01         1.71429E+00
+          2.43088E-02         1.78554E-02        -2.81980E-02         1.52713E+00         1.34121E+00         1.52739E+00         2.34175E+00         1.00000E+00         2.72579E-10         2.34175E+00         6.25615E-01         1.71614E+00
+          2.43088E-02         1.80252E-02        -2.83894E-02         1.52712E+00         1.35188E+00         1.52739E+00         2.35572E+00         1.00000E+00         2.89280E-10         2.35572E+00         6.37630E-01         1.71809E+00
+          2.43088E-02         1.81951E-02        -2.85826E-02         1.52712E+00         1.36255E+00         1.52738E+00         2.36929E+00         1.00000E+00         3.05848E-10         2.36929E+00         6.49271E-01         1.72002E+00
+          2.43088E-02         1.83649E-02        -2.87776E-02         1.52711E+00         1.37322E+00         1.52738E+00         2.38230E+00         1.00000E+00         3.22183E-10         2.38230E+00         6.60487E-01         1.72181E+00
+          2.43088E-02         1.85347E-02        -2.89745E-02         1.52711E+00         1.38389E+00         1.52738E+00         2.39458E+00         1.00000E+00         3.38179E-10         2.39458E+00         6.71226E-01         1.72335E+00
+          2.43088E-02         1.87045E-02        -2.91731E-02         1.52710E+00         1.39457E+00         1.52738E+00         2.40599E+00         1.00000E+00         3.53727E-10         2.40599E+00         6.81440E-01         1.72455E+00
+          2.43088E-02         1.88744E-02        -2.93736E-02         1.52710E+00         1.40524E+00         1.52738E+00         2.41641E+00         1.00000E+00         3.68707E-10         2.41641E+00         6.91085E-01         1.72533E+00
+          2.43088E-02         1.90442E-02        -2.95759E-02         1.52709E+00         1.41591E+00         1.52738E+00         2.42572E+00         1.00000E+00         3.82999E-10         2.42572E+00         7.00118E-01         1.72560E+00
+          2.43088E-02         1.92140E-02        -2.97800E-02         1.52709E+00         1.42658E+00         1.52738E+00         2.43383E+00         1.00000E+00         3.96475E-10         2.43383E+00         7.08502E-01         1.72532E+00
+          2.43088E-02         1.93839E-02        -2.99859E-02         1.52708E+00         1.43725E+00         1.52738E+00         2.44063E+00         1.00000E+00         4.09003E-10         2.44063E+00         7.16199E-01         1.72443E+00
+          2.43088E-02         1.95537E-02        -3.01936E-02         1.52708E+00         1.44792E+00         1.52738E+00         2.44605E+00         1.00000E+00         4.20447E-10         2.44605E+00         7.23178E-01         1.72288E+00
+          2.43088E-02         1.97235E-02        -3.04031E-02         1.52707E+00         1.45859E+00         1.52738E+00         2.45003E+00         1.00000E+00         4.30669E-10         2.45003E+00         7.29409E-01         1.72062E+00
+          2.43088E-02         1.98933E-02        -3.06145E-02         1.52707E+00         1.46926E+00         1.52737E+00         2.45251E+00         1.00000E+00         4.39526E-10         2.45251E+00         7.34867E-01         1.71764E+00
+          2.43088E-02         2.00632E-02        -3.08277E-02         1.52706E+00         1.47993E+00         1.52737E+00         2.45344E+00         1.00000E+00         4.46875E-10         2.45344E+00         7.39527E-01         1.71391E+00
+          2.43088E-02         2.02330E-02        -3.10426E-02         1.52706E+00         1.49060E+00         1.52737E+00         2.45278E+00         1.00000E+00         4.52572E-10         2.45278E+00         7.43372E-01         1.70941E+00
+          2.43088E-02         2.04028E-02        -3.12594E-02         1.52705E+00         1.50127E+00         1.52737E+00         2.45051E+00         1.00000E+00         4.56474E-10         2.45051E+00         7.46385E-01         1.70412E+00
+          2.43088E-02         2.05726E-02        -3.14780E-02         1.52705E+00         1.51194E+00         1.52737E+00         2.44660E+00         1.00000E+00         4.58442E-10         2.44660E+00         7.48552E-01         1.69805E+00
+          2.43088E-02         2.07425E-02        -3.16984E-02         1.52704E+00         1.52261E+00         1.52737E+00         2.44104E+00         1.00000E+00         4.58337E-10         2.44104E+00         7.49866E-01         1.69118E+00
+          2.43088E-02         2.09123E-02        -3.19206E-02         1.52704E+00         1.53328E+00         1.52737E+00         2.43384E+00         1.00000E+00         4.56033E-10         2.43384E+00         7.50318E-01         1.68352E+00
+          2.43088E-02         2.10821E-02        -3.21447E-02         1.52703E+00         1.54395E+00         1.52737E+00         2.42498E+00         1.00000E+00         4.51410E-10         2.42498E+00         7.49907E-01         1.67507E+00
+          2.43088E-02         2.12520E-02        -3.23705E-02         1.52702E+00         1.55462E+00         1.52737E+00         2.41448E+00         1.00000E+00         4.44364E-10         2.41448E+00         7.48632E-01         1.66584E+00
+          2.43088E-02         2.14218E-02        -3.25982E-02         1.52702E+00         1.56529E+00         1.52737E+00         2.40235E+00         1.00000E+00         4.34813E-10         2.40235E+00         7.46497E-01         1.65585E+00
+          2.43088E-02         2.15916E-02        -3.28277E-02         1.52701E+00         1.57596E+00         1.52737E+00         2.38861E+00         1.00000E+00         4.22700E-10         2.38861E+00         7.43508E-01         1.64510E+00
+          2.43088E-02         2.17614E-02        -3.30589E-02         1.52701E+00         1.58664E+00         1.52737E+00         2.37329E+00         1.00000E+00         4.08012E-10         2.37329E+00         7.39673E-01         1.63362E+00
+          2.43088E-02         2.19313E-02        -3.32920E-02         1.52700E+00         1.59731E+00         1.52737E+00         2.35642E+00         1.00000E+00         3.90791E-10         2.35642E+00         7.35006E-01         1.62141E+00
+          2.43088E-02         2.21011E-02        -3.35270E-02         1.52700E+00         1.60798E+00         1.52736E+00         2.33803E+00         1.00000E+00         3.71165E-10         2.33803E+00         7.29519E-01         1.60851E+00
+          2.43088E-02         2.22709E-02        -3.37637E-02         1.52699E+00         1.61865E+00         1.52736E+00         2.31816E+00         1.00000E+00         3.49387E-10         2.31816E+00         7.23232E-01         1.59493E+00
+          2.43088E-02         2.24407E-02        -3.40022E-02         1.52699E+00         1.62932E+00         1.52736E+00         2.29685E+00         1.00000E+00         3.25900E-10         2.29685E+00         7.16163E-01         1.58069E+00
+          2.43088E-02         2.26106E-02        -3.42426E-02         1.52698E+00         1.63999E+00         1.52736E+00         2.27415E+00         1.00000E+00         3.01448E-10         2.27415E+00         7.08334E-01         1.56582E+00
+          2.43088E-02         2.27804E-02        -3.44847E-02         1.52697E+00         1.65066E+00         1.52736E+00         2.25011E+00         1.00000E+00         2.77238E-10         2.25011E+00         6.99771E-01         1.55034E+00
+          2.43088E-02         2.29502E-02        -3.47287E-02         1.52697E+00         1.66133E+00         1.52736E+00         2.22478E+00         1.00000E+00         2.55179E-10         2.22478E+00         6.90499E-01         1.53428E+00
+          2.43088E-02         2.31201E-02        -3.49745E-02         1.52696E+00         1.67200E+00         1.52736E+00         2.19821E+00         1.00000E+00         2.38109E-10         2.19821E+00         6.80546E-01         1.51767E+00
+          2.43088E-02         2.32899E-02        -3.52221E-02         1.52696E+00         1.68267E+00         1.52736E+00         2.17047E+00         1.00000E+00         2.29744E-10         2.17047E+00         6.69944E-01         1.50052E+00
+          2.43088E-02         2.34597E-02        -3.54715E-02         1.52695E+00         1.69334E+00         1.52736E+00         2.14160E+00         1.00000E+00         2.33830E-10         2.14160E+00         6.58724E-01         1.48288E+00
+          2.43088E-02         2.36295E-02        -3.57228E-02         1.52694E+00         1.70401E+00         1.52736E+00         2.11168E+00         1.00000E+00         2.52565E-10         2.11168E+00         6.46919E-01         1.46476E+00
+          2.43088E-02         2.37994E-02        -3.59758E-02         1.52694E+00         1.71468E+00         1.52736E+00         2.08076E+00         1.00000E+00         2.85707E-10         2.08076E+00         6.34563E-01         1.44619E+00
+          2.43088E-02         2.39692E-02        -3.62307E-02         1.52693E+00         1.72535E+00         1.52736E+00         2.04890E+00         1.00000E+00         3.31343E-10         2.04890E+00         6.21694E-01         1.42721E+00
+          2.43088E-02         2.41390E-02        -3.64873E-02         1.52692E+00         1.73602E+00         1.52736E+00         2.01618E+00         1.00000E+00         3.87199E-10         2.01618E+00         6.08347E-01         1.40783E+00
+          2.43088E-02         2.43088E-02        -3.67458E-02         1.52692E+00         1.74669E+00         1.52736E+00         1.98266E+00         1.00000E+00         4.51365E-10         1.98266E+00         5.94561E-01         1.38810E+00
+          2.43088E-02         2.44787E-02        -3.70061E-02         1.52691E+00         1.75736E+00         1.52736E+00         1.94840E+00         1.00000E+00         5.22419E-10         1.94840E+00         5.80373E-01         1.36803E+00
+          2.43088E-02         2.46485E-02        -3.72682E-02         1.52691E+00         1.76804E+00         1.52736E+00         1.91348E+00         1.00000E+00         5.99323E-10         1.91348E+00         5.65823E-01         1.34766E+00
+          2.43088E-02         2.48183E-02        -3.75321E-02         1.52690E+00         1.77871E+00         1.52736E+00         1.87796E+00         1.00000E+00         6.81301E-10         1.87796E+00         5.50951E-01         1.32701E+00
+          2.43088E-02         2.49882E-02        -3.77979E-02         1.52689E+00         1.78938E+00         1.52736E+00         1.84192E+00         1.00000E+00         7.67736E-10         1.84192E+00         5.35795E-01         1.30612E+00
+          2.43088E-02         2.51580E-02        -3.80654E-02         1.52689E+00         1.80005E+00         1.52736E+00         1.80542E+00         1.00000E+00         8.58106E-10         1.80542E+00         5.20397E-01         1.28502E+00
+          2.43088E-02         2.53278E-02        -3.83348E-02         1.52688E+00         1.81072E+00         1.52736E+00         1.76853E+00         1.00000E+00         9.51939E-10         1.76853E+00         5.04794E-01         1.26374E+00
+          2.43088E-02         2.54976E-02        -3.86060E-02         1.52687E+00         1.82139E+00         1.52736E+00         1.73133E+00         1.00000E+00         1.04879E-09         1.73133E+00         4.89027E-01         1.24231E+00
+          2.43088E-02         2.56675E-02        -3.88789E-02         1.52687E+00         1.83206E+00         1.52736E+00         1.69389E+00         1.00000E+00         1.14821E-09         1.69389E+00         4.73135E-01         1.22075E+00
+          2.43088E-02         2.58373E-02        -3.91537E-02         1.52686E+00         1.84273E+00         1.52736E+00         1.65627E+00         1.00000E+00         1.24975E-09         1.65627E+00         4.57156E-01         1.19911E+00
+          2.43088E-02         2.60071E-02        -3.94304E-02         1.52685E+00         1.85340E+00         1.52736E+00         1.61854E+00         1.00000E+00         1.35296E-09         1.61854E+00         4.41129E-01         1.17741E+00
+          2.43088E-02         2.61769E-02        -3.97088E-02         1.52685E+00         1.86407E+00         1.52736E+00         1.58078E+00         1.00000E+00         1.45734E-09         1.58078E+00         4.25091E-01         1.15569E+00
+          2.44787E-02         8.72665E-04        -1.84685E-02         1.53804E+00         2.74155E-01         1.53815E+00         5.85785E+01         1.00000E+00         4.16485E-11         5.85785E+01         3.62332E+00         5.49552E+01
+          2.44787E-02         1.04249E-03        -1.84788E-02         1.53804E+00         2.84826E-01         1.53815E+00         5.75394E+01         1.00000E+00         3.84616E-11         5.75394E+01         3.58331E+00         5.39561E+01
+          2.44787E-02         1.21232E-03        -1.84908E-02         1.53804E+00         2.95496E-01         1.53815E+00         5.64786E+01         1.00000E+00         3.53633E-11         5.64786E+01         3.54196E+00         5.29366E+01
+          2.44787E-02         1.38215E-03        -1.85046E-02         1.53804E+00         3.06167E-01         1.53815E+00         5.53979E+01         1.00000E+00         3.23675E-11         5.53979E+01         3.49929E+00         5.18986E+01
+          2.44787E-02         1.55197E-03        -1.85203E-02         1.53804E+00         3.16838E-01         1.53815E+00         5.42990E+01         1.00000E+00         2.94878E-11         5.42990E+01         3.45534E+00         5.08436E+01
+          2.44787E-02         1.72180E-03        -1.85377E-02         1.53804E+00         3.27508E-01         1.53815E+00         5.31836E+01         1.00000E+00         2.67366E-11         5.31836E+01         3.41013E+00         4.97735E+01
+          2.44787E-02         1.89163E-03        -1.85570E-02         1.53804E+00         3.38179E-01         1.53815E+00         5.20536E+01         1.00000E+00         2.41255E-11         5.20536E+01         3.36371E+00         4.86899E+01
+          2.44787E-02         2.06146E-03        -1.85781E-02         1.53804E+00         3.48849E-01         1.53815E+00         5.09106E+01         1.00000E+00         2.16654E-11         5.09106E+01         3.31609E+00         4.75946E+01
+          2.44787E-02         2.23128E-03        -1.86010E-02         1.53804E+00         3.59520E-01         1.53815E+00         4.97565E+01         1.00000E+00         1.93660E-11         4.97565E+01         3.26733E+00         4.64892E+01
+          2.44787E-02         2.40111E-03        -1.86257E-02         1.53804E+00         3.70190E-01         1.53815E+00         4.85930E+01         1.00000E+00         1.72359E-11         4.85930E+01         3.21745E+00         4.53755E+01
+          2.44787E-02         2.57094E-03        -1.86522E-02         1.53804E+00         3.80861E-01         1.53815E+00         4.74217E+01         1.00000E+00         1.52824E-11         4.74217E+01         3.16651E+00         4.42552E+01
+          2.44787E-02         2.74077E-03        -1.86805E-02         1.53803E+00         3.91532E-01         1.53815E+00         4.62445E+01         1.00000E+00         1.35111E-11         4.62445E+01         3.11453E+00         4.31299E+01
+          2.44787E-02         2.91059E-03        -1.87107E-02         1.53803E+00         4.02202E-01         1.53815E+00         4.50629E+01         1.00000E+00         1.19254E-11         4.50629E+01         3.06157E+00         4.20014E+01
+          2.44787E-02         3.08042E-03        -1.87426E-02         1.53803E+00         4.12873E-01         1.53815E+00         4.38788E+01         1.00000E+00         1.05256E-11         4.38788E+01         3.00768E+00         4.08711E+01
+          2.44787E-02         3.25025E-03        -1.87764E-02         1.53803E+00         4.23543E-01         1.53815E+00         4.26937E+01         1.00000E+00         9.30797E-12         4.26937E+01         2.95290E+00         3.97408E+01
+          2.44787E-02         3.42008E-03        -1.88120E-02         1.53803E+00         4.34214E-01         1.53815E+00         4.15093E+01         1.00000E+00         8.26314E-12         4.15093E+01         2.89729E+00         3.86120E+01
+          2.44787E-02         3.58990E-03        -1.88494E-02         1.53803E+00         4.44884E-01         1.53815E+00         4.03271E+01         1.00000E+00         7.37550E-12         4.03271E+01         2.84090E+00         3.74862E+01
+          2.44787E-02         3.75973E-03        -1.88886E-02         1.53803E+00         4.55555E-01         1.53815E+00         3.91487E+01         1.00000E+00         6.62270E-12         3.91487E+01         2.78378E+00         3.63649E+01
+          2.44787E-02         3.92956E-03        -1.89296E-02         1.53803E+00         4.66225E-01         1.53815E+00         3.79756E+01         1.00000E+00         5.97662E-12         3.79756E+01         2.72599E+00         3.52496E+01
+          2.44787E-02         4.09939E-03        -1.89724E-02         1.53803E+00         4.76896E-01         1.53814E+00         3.68093E+01         1.00000E+00         5.40579E-12         3.68093E+01         2.66759E+00         3.41417E+01
+          2.44787E-02         4.26921E-03        -1.90170E-02         1.53803E+00         4.87567E-01         1.53814E+00         3.56511E+01         1.00000E+00         4.87867E-12         3.56511E+01         2.60864E+00         3.30425E+01
+          2.44787E-02         4.43904E-03        -1.90635E-02         1.53803E+00         4.98237E-01         1.53814E+00         3.45026E+01         1.00000E+00         4.36727E-12         3.45026E+01         2.54920E+00         3.19534E+01
+          2.44787E-02         4.60887E-03        -1.91118E-02         1.53802E+00         5.08908E-01         1.53814E+00         3.33649E+01         1.00000E+00         3.85063E-12         3.33649E+01         2.48934E+00         3.08755E+01
+          2.44787E-02         4.77869E-03        -1.91618E-02         1.53802E+00         5.19578E-01         1.53814E+00         3.22393E+01         1.00000E+00         3.31901E-12         3.22393E+01         2.42913E+00         2.98102E+01
+          2.44787E-02         4.94852E-03        -1.92137E-02         1.53802E+00         5.30249E-01         1.53814E+00         3.11271E+01         1.00000E+00         2.78160E-12         3.11271E+01         2.36862E+00         2.87585E+01
+          2.44787E-02         5.11835E-03        -1.92674E-02         1.53802E+00         5.40919E-01         1.53814E+00         3.00295E+01         1.00000E+00         2.28518E-12         3.00295E+01         2.30790E+00         2.77216E+01
+          2.44787E-02         5.28818E-03        -1.93229E-02         1.53802E+00         5.51590E-01         1.53814E+00         2.89475E+01         1.00000E+00         1.95327E-12         2.89475E+01         2.24702E+00         2.67005E+01
+          2.44787E-02         5.45800E-03        -1.93802E-02         1.53802E+00         5.62261E-01         1.53814E+00         2.78822E+01         1.00000E+00         1.98974E-12         2.78822E+01         2.18605E+00         2.56961E+01
+          2.44787E-02         5.62783E-03        -1.94394E-02         1.53802E+00         5.72931E-01         1.53814E+00         2.68345E+01         1.00000E+00         2.48499E-12         2.68345E+01         2.12508E+00         2.47094E+01
+          2.44787E-02         5.79766E-03        -1.95003E-02         1.53801E+00         5.83602E-01         1.53814E+00         2.58055E+01         1.00000E+00         3.32373E-12         2.58055E+01         2.06417E+00         2.37413E+01
+          2.44787E-02         5.96749E-03        -1.95630E-02         1.53801E+00         5.94272E-01         1.53814E+00         2.47959E+01         1.00000E+00         4.38215E-12         2.47959E+01         2.00340E+00         2.27925E+01
+          2.44787E-02         6.13731E-03        -1.96276E-02         1.53801E+00         6.04943E-01         1.53814E+00         2.38065E+01         1.00000E+00         5.59460E-12         2.38065E+01         1.94283E+00         2.18637E+01
+          2.44787E-02         6.30714E-03        -1.96940E-02         1.53801E+00         6.15613E-01         1.53814E+00         2.28381E+01         1.00000E+00         6.92852E-12         2.28381E+01         1.88254E+00         2.09556E+01
+          2.44787E-02         6.47697E-03        -1.97622E-02         1.53801E+00         6.26284E-01         1.53814E+00         2.18915E+01         1.00000E+00         8.36553E-12         2.18915E+01         1.82261E+00         2.00688E+01
+          2.44787E-02         6.64680E-03        -1.98322E-02         1.53801E+00         6.36955E-01         1.53813E+00         2.09671E+01         1.00000E+00         9.89342E-12         2.09671E+01         1.76311E+00         1.92039E+01
+          2.44787E-02         6.81662E-03        -1.99040E-02         1.53800E+00         6.47625E-01         1.53813E+00         2.00655E+01         1.00000E+00         1.15027E-11         2.00655E+01         1.70410E+00         1.83614E+01
+          2.44787E-02         6.98645E-03        -1.99776E-02         1.53800E+00         6.58296E-01         1.53813E+00         1.91872E+01         1.00000E+00         1.31851E-11         1.91872E+01         1.64568E+00         1.75416E+01
+          2.44787E-02         7.15628E-03        -2.00530E-02         1.53800E+00         6.68966E-01         1.53813E+00         1.83327E+01         1.00000E+00         1.49331E-11         1.83327E+01         1.58789E+00         1.67448E+01
+          2.44787E-02         7.32611E-03        -2.01303E-02         1.53800E+00         6.79637E-01         1.53813E+00         1.75023E+01         1.00000E+00         1.67392E-11         1.75023E+01         1.53083E+00         1.59715E+01
+          2.44787E-02         7.49593E-03        -2.02093E-02         1.53800E+00         6.90307E-01         1.53813E+00         1.66964E+01         1.00000E+00         1.85961E-11         1.66964E+01         1.47455E+00         1.52218E+01
+          2.44787E-02         7.66576E-03        -2.02902E-02         1.53800E+00         7.00978E-01         1.53813E+00         1.59151E+01         1.00000E+00         2.04962E-11         1.59151E+01         1.41913E+00         1.44959E+01
+          2.44787E-02         7.83559E-03        -2.03729E-02         1.53799E+00         7.11649E-01         1.53813E+00         1.51586E+01         1.00000E+00         2.24319E-11         1.51586E+01         1.36463E+00         1.37940E+01
+          2.44787E-02         8.00542E-03        -2.04574E-02         1.53799E+00         7.22319E-01         1.53813E+00         1.44272E+01         1.00000E+00         2.43954E-11         1.44272E+01         1.31112E+00         1.31161E+01
+          2.44787E-02         8.17524E-03        -2.05437E-02         1.53799E+00         7.32990E-01         1.53813E+00         1.37208E+01         1.00000E+00         2.63784E-11         1.37208E+01         1.25867E+00         1.24621E+01
+          2.44787E-02         8.34507E-03        -2.06318E-02         1.53799E+00         7.43660E-01         1.53813E+00         1.30395E+01         1.00000E+00         2.83725E-11         1.30395E+01         1.20733E+00         1.18322E+01
+          2.44787E-02         8.51490E-03        -2.07217E-02         1.53798E+00         7.54331E-01         1.53812E+00         1.23833E+01         1.00000E+00         3.03688E-11         1.23833E+01         1.15717E+00         1.12261E+01
+          2.44787E-02         8.68473E-03        -2.08135E-02         1.53798E+00         7.65001E-01         1.53812E+00         1.17520E+01         1.00000E+00         3.23580E-11         1.17520E+01         1.10825E+00         1.06437E+01
+          2.44787E-02         8.85455E-03        -2.09070E-02         1.53798E+00         7.75672E-01         1.53812E+00         1.11456E+01         1.00000E+00         3.43303E-11         1.11456E+01         1.06062E+00         1.00850E+01
+          2.44787E-02         9.02438E-03        -2.10024E-02         1.53798E+00         7.86343E-01         1.53812E+00         1.05639E+01         1.00000E+00         3.62755E-11         1.05639E+01         1.01433E+00         9.54956E+00
+          2.44787E-02         9.19421E-03        -2.10996E-02         1.53798E+00         7.97013E-01         1.53812E+00         1.00066E+01         1.00000E+00         3.81829E-11         1.00066E+01         9.69431E-01         9.03720E+00
+          2.44787E-02         9.36403E-03        -2.11986E-02         1.53797E+00         8.07684E-01         1.53812E+00         9.47359E+00         1.00000E+00         4.00412E-11         9.47359E+00         9.25976E-01         8.54761E+00
+          2.44787E-02         9.53386E-03        -2.12994E-02         1.53797E+00         8.18354E-01         1.53812E+00         8.96445E+00         1.00000E+00         4.18386E-11         8.96445E+00         8.84005E-01         8.08044E+00
+          2.44787E-02         9.70369E-03        -2.14020E-02         1.53797E+00         8.29025E-01         1.53812E+00         8.47887E+00         1.00000E+00         4.35628E-11         8.47887E+00         8.43561E-01         7.63531E+00
+          2.44787E-02         9.87352E-03        -2.15064E-02         1.53797E+00         8.39695E-01         1.53812E+00         8.01649E+00         1.00000E+00         4.52007E-11         8.01649E+00         8.04679E-01         7.21181E+00
+          2.44787E-02         1.00433E-02        -2.16126E-02         1.53796E+00         8.50366E-01         1.53811E+00         7.57690E+00         1.00000E+00         4.67388E-11         7.57690E+00         7.67394E-01         6.80950E+00
+          2.44787E-02         1.02132E-02        -2.17207E-02         1.53796E+00         8.61037E-01         1.53811E+00         7.15965E+00         1.00000E+00         4.81632E-11         7.15965E+00         7.31737E-01         6.42791E+00
+          2.44787E-02         1.03830E-02        -2.18305E-02         1.53796E+00         8.71707E-01         1.53811E+00         6.76429E+00         1.00000E+00         4.94590E-11         6.76429E+00         6.97734E-01         6.06655E+00
+          2.44787E-02         1.05528E-02        -2.19422E-02         1.53795E+00         8.82378E-01         1.53811E+00         6.39031E+00         1.00000E+00         5.06111E-11         6.39031E+00         6.65407E-01         5.72490E+00
+          2.44787E-02         1.07227E-02        -2.20557E-02         1.53795E+00         8.93048E-01         1.53811E+00         6.03720E+00         1.00000E+00         5.16039E-11         6.03720E+00         6.34777E-01         5.40242E+00
+          2.44787E-02         1.08925E-02        -2.21710E-02         1.53795E+00         9.03719E-01         1.53811E+00         5.70441E+00         1.00000E+00         5.24212E-11         5.70441E+00         6.05858E-01         5.09856E+00
+          2.44787E-02         1.10623E-02        -2.22881E-02         1.53795E+00         9.14389E-01         1.53811E+00         5.39140E+00         1.00000E+00         5.30465E-11         5.39140E+00         5.78662E-01         4.81274E+00
+          2.44787E-02         1.12321E-02        -2.24070E-02         1.53794E+00         9.25060E-01         1.53811E+00         5.09758E+00         1.00000E+00         5.34631E-11         5.09758E+00         5.53195E-01         4.54439E+00
+          2.44787E-02         1.14020E-02        -2.25278E-02         1.53794E+00         9.35731E-01         1.53811E+00         4.82236E+00         1.00000E+00         5.36539E-11         4.82236E+00         5.29462E-01         4.29290E+00
+          2.44787E-02         1.15718E-02        -2.26503E-02         1.53794E+00         9.46401E-01         1.53810E+00         4.56514E+00         1.00000E+00         5.36018E-11         4.56514E+00         5.07461E-01         4.05768E+00
+          2.44787E-02         1.17416E-02        -2.27747E-02         1.53793E+00         9.57072E-01         1.53810E+00         4.32530E+00         1.00000E+00         5.32898E-11         4.32530E+00         4.87188E-01         3.83811E+00
+          2.44787E-02         1.19114E-02        -2.29008E-02         1.53793E+00         9.67742E-01         1.53810E+00         4.10221E+00         1.00000E+00         5.27013E-11         4.10221E+00         4.68633E-01         3.63357E+00
+          2.44787E-02         1.20813E-02        -2.30288E-02         1.53793E+00         9.78413E-01         1.53810E+00         3.89524E+00         1.00000E+00         5.18201E-11         3.89524E+00         4.51784E-01         3.44346E+00
+          2.44787E-02         1.22511E-02        -2.31586E-02         1.53793E+00         9.89083E-01         1.53810E+00         3.70376E+00         1.00000E+00         5.06313E-11         3.70376E+00         4.36624E-01         3.26714E+00
+          2.44787E-02         1.24209E-02        -2.32902E-02         1.53792E+00         9.99754E-01         1.53810E+00         3.52713E+00         1.00000E+00         4.91212E-11         3.52713E+00         4.23133E-01         3.10400E+00
+          2.44787E-02         1.25908E-02        -2.34236E-02         1.53792E+00         1.01042E+00         1.53810E+00         3.36471E+00         1.00000E+00         4.72790E-11         3.36471E+00         4.11286E-01         2.95342E+00
+          2.44787E-02         1.27606E-02        -2.35588E-02         1.53792E+00         1.02110E+00         1.53810E+00         3.21585E+00         1.00000E+00         4.50972E-11         3.21585E+00         4.01054E-01         2.81480E+00
+          2.44787E-02         1.29304E-02        -2.36959E-02         1.53791E+00         1.03177E+00         1.53809E+00         3.07993E+00         1.00000E+00         4.25741E-11         3.07993E+00         3.92407E-01         2.68753E+00
+          2.44787E-02         1.31002E-02        -2.38347E-02         1.53791E+00         1.04244E+00         1.53809E+00         2.95631E+00         1.00000E+00         3.97174E-11         2.95631E+00         3.85308E-01         2.57100E+00
+          2.44787E-02         1.32701E-02        -2.39754E-02         1.53791E+00         1.05311E+00         1.53809E+00         2.84436E+00         1.00000E+00         3.65494E-11         2.84436E+00         3.79720E-01         2.46464E+00
+          2.44787E-02         1.34399E-02        -2.41179E-02         1.53790E+00         1.06378E+00         1.53809E+00         2.74346E+00         1.00000E+00         3.31186E-11         2.74346E+00         3.75598E-01         2.36787E+00
+          2.44787E-02         1.36097E-02        -2.42621E-02         1.53790E+00         1.07445E+00         1.53809E+00         2.65301E+00         1.00000E+00         2.95199E-11         2.65301E+00         3.72899E-01         2.28011E+00
+          2.44787E-02         1.37795E-02        -2.44082E-02         1.53789E+00         1.08512E+00         1.53809E+00         2.57239E+00         1.00000E+00         2.59349E-11         2.57239E+00         3.71574E-01         2.20081E+00
+          2.44787E-02         1.39494E-02        -2.45562E-02         1.53789E+00         1.09579E+00         1.53809E+00         2.50101E+00         1.00000E+00         2.27059E-11         2.50101E+00         3.71571E-01         2.12944E+00
+          2.44787E-02         1.41192E-02        -2.47059E-02         1.53789E+00         1.10646E+00         1.53809E+00         2.43831E+00         1.00000E+00         2.04338E-11         2.43831E+00         3.72838E-01         2.06547E+00
+          2.44787E-02         1.42890E-02        -2.48574E-02         1.53788E+00         1.11713E+00         1.53808E+00         2.38370E+00         1.00000E+00         1.99523E-11         2.38370E+00         3.75316E-01         2.00839E+00
+          2.44787E-02         1.44589E-02        -2.50108E-02         1.53788E+00         1.12780E+00         1.53808E+00         2.33665E+00         1.00000E+00         2.18855E-11         2.33665E+00         3.78948E-01         1.95770E+00
+          2.44787E-02         1.46287E-02        -2.51659E-02         1.53788E+00         1.13847E+00         1.53808E+00         2.29660E+00         1.00000E+00         2.61555E-11         2.29660E+00         3.83673E-01         1.91293E+00
+          2.44787E-02         1.47985E-02        -2.53229E-02         1.53787E+00         1.14914E+00         1.53808E+00         2.26304E+00         1.00000E+00         3.22414E-11         2.26304E+00         3.89428E-01         1.87361E+00
+          2.44787E-02         1.49683E-02        -2.54817E-02         1.53787E+00         1.15981E+00         1.53808E+00         2.23545E+00         1.00000E+00         3.96623E-11         2.23545E+00         3.96147E-01         1.83931E+00
+          2.44787E-02         1.51382E-02        -2.56423E-02         1.53786E+00         1.17048E+00         1.53808E+00         2.21336E+00         1.00000E+00         4.81093E-11         2.21336E+00         4.03766E-01         1.80959E+00
+          2.44787E-02         1.53080E-02        -2.58047E-02         1.53786E+00         1.18115E+00         1.53808E+00         2.19628E+00         1.00000E+00         5.74000E-11         2.19628E+00         4.12216E-01         1.78406E+00
+          2.44787E-02         1.54778E-02        -2.59689E-02         1.53786E+00         1.19182E+00         1.53808E+00         2.18375E+00         1.00000E+00         6.74231E-11         2.18375E+00         4.21429E-01         1.76232E+00
+          2.44787E-02         1.56476E-02        -2.61349E-02         1.53785E+00         1.20249E+00         1.53807E+00         2.17535E+00         1.00000E+00         7.81054E-11         2.17535E+00         4.31335E-01         1.74401E+00
+          2.44787E-02         1.58175E-02        -2.63028E-02         1.53785E+00         1.21317E+00         1.53807E+00         2.17064E+00         1.00000E+00         8.93929E-11         2.17064E+00         4.41864E-01         1.72878E+00
+          2.44787E-02         1.59873E-02        -2.64724E-02         1.53784E+00         1.22384E+00         1.53807E+00         2.16923E+00         1.00000E+00         1.01241E-10         2.16923E+00         4.52946E-01         1.71628E+00
+          2.44787E-02         1.61571E-02        -2.66439E-02         1.53784E+00         1.23451E+00         1.53807E+00         2.17073E+00         1.00000E+00         1.13609E-10         2.17073E+00         4.64510E-01         1.70622E+00
+          2.44787E-02         1.63270E-02        -2.68172E-02         1.53784E+00         1.24518E+00         1.53807E+00         2.17478E+00         1.00000E+00         1.26457E-10         2.17478E+00         4.76485E-01         1.69829E+00
+          2.44787E-02         1.64968E-02        -2.69923E-02         1.53783E+00         1.25585E+00         1.53807E+00         2.18102E+00         1.00000E+00         1.39743E-10         2.18102E+00         4.88799E-01         1.69222E+00
+          2.44787E-02         1.66666E-02        -2.71692E-02         1.53783E+00         1.26652E+00         1.53807E+00         2.18913E+00         1.00000E+00         1.53423E-10         2.18913E+00         5.01384E-01         1.68774E+00
+          2.44787E-02         1.68364E-02        -2.73479E-02         1.53782E+00         1.27719E+00         1.53807E+00         2.19879E+00         1.00000E+00         1.67449E-10         2.19879E+00         5.14169E-01         1.68462E+00
+          2.44787E-02         1.70063E-02        -2.75285E-02         1.53782E+00         1.28786E+00         1.53806E+00         2.20972E+00         1.00000E+00         1.81769E-10         2.20972E+00         5.27086E-01         1.68263E+00
+          2.44787E-02         1.71761E-02        -2.77108E-02         1.53781E+00         1.29853E+00         1.53806E+00         2.22163E+00         1.00000E+00         1.96325E-10         2.22163E+00         5.40068E-01         1.68156E+00
+          2.44787E-02         1.73459E-02        -2.78950E-02         1.53781E+00         1.30920E+00         1.53806E+00         2.23426E+00         1.00000E+00         2.11057E-10         2.23426E+00         5.53046E-01         1.68121E+00
+          2.44787E-02         1.75158E-02        -2.80809E-02         1.53780E+00         1.31987E+00         1.53806E+00         2.24737E+00         1.00000E+00         2.25895E-10         2.24737E+00         5.65958E-01         1.68141E+00
+          2.44787E-02         1.76856E-02        -2.82687E-02         1.53780E+00         1.33054E+00         1.53806E+00         2.26074E+00         1.00000E+00         2.40768E-10         2.26074E+00         5.78739E-01         1.68200E+00
+          2.44787E-02         1.78554E-02        -2.84583E-02         1.53780E+00         1.34121E+00         1.53806E+00         2.27415E+00         1.00000E+00         2.55598E-10         2.27415E+00         5.91328E-01         1.68283E+00
+          2.44787E-02         1.80252E-02        -2.86497E-02         1.53779E+00         1.35188E+00         1.53806E+00         2.28742E+00         1.00000E+00         2.70299E-10         2.28742E+00         6.03666E-01         1.68375E+00
+          2.44787E-02         1.81951E-02        -2.88429E-02         1.53779E+00         1.36255E+00         1.53806E+00         2.30036E+00         1.00000E+00         2.84782E-10         2.30036E+00         6.15695E-01         1.68466E+00
+          2.44787E-02         1.83649E-02        -2.90380E-02         1.53778E+00         1.37322E+00         1.53806E+00         2.31280E+00         1.00000E+00         2.98952E-10         2.31280E+00         6.27359E-01         1.68544E+00
+          2.44787E-02         1.85347E-02        -2.92348E-02         1.53778E+00         1.38389E+00         1.53805E+00         2.32460E+00         1.00000E+00         3.12708E-10         2.32460E+00         6.38608E-01         1.68600E+00
+          2.44787E-02         1.87045E-02        -2.94335E-02         1.53777E+00         1.39457E+00         1.53805E+00         2.33563E+00         1.00000E+00         3.25943E-10         2.33563E+00         6.49389E-01         1.68624E+00
+          2.44787E-02         1.88744E-02        -2.96339E-02         1.53777E+00         1.40524E+00         1.53805E+00         2.34575E+00         1.00000E+00         3.38546E-10         2.34575E+00         6.59657E-01         1.68609E+00
+          2.44787E-02         1.90442E-02        -2.98362E-02         1.53776E+00         1.41591E+00         1.53805E+00         2.35486E+00         1.00000E+00         3.50401E-10         2.35486E+00         6.69367E-01         1.68549E+00
+          2.44787E-02         1.92140E-02        -3.00403E-02         1.53776E+00         1.42658E+00         1.53805E+00         2.36285E+00         1.00000E+00         3.61386E-10         2.36285E+00         6.78476E-01         1.68438E+00
+          2.44787E-02         1.93839E-02        -3.02462E-02         1.53775E+00         1.43725E+00         1.53805E+00         2.36965E+00         1.00000E+00         3.71377E-10         2.36965E+00         6.86947E-01         1.68271E+00
+          2.44787E-02         1.95537E-02        -3.04539E-02         1.53775E+00         1.44792E+00         1.53805E+00         2.37518E+00         1.00000E+00         3.80246E-10         2.37518E+00         6.94744E-01         1.68044E+00
+          2.44787E-02         1.97235E-02        -3.06635E-02         1.53774E+00         1.45859E+00         1.53805E+00         2.37937E+00         1.00000E+00         3.87861E-10         2.37937E+00         7.01834E-01         1.67754E+00
+          2.44787E-02         1.98933E-02        -3.08748E-02         1.53774E+00         1.46926E+00         1.53805E+00         2.38217E+00         1.00000E+00         3.94088E-10         2.38217E+00         7.08188E-01         1.67398E+00
+          2.44787E-02         2.00632E-02        -3.10880E-02         1.53773E+00         1.47993E+00         1.53805E+00         2.38352E+00         1.00000E+00         3.98794E-10         2.38352E+00         7.13781E-01         1.66974E+00
+          2.44787E-02         2.02330E-02        -3.13029E-02         1.53773E+00         1.49060E+00         1.53804E+00         2.38340E+00         1.00000E+00         4.01842E-10         2.38340E+00         7.18589E-01         1.66482E+00
+          2.44787E-02         2.04028E-02        -3.15197E-02         1.53772E+00         1.50127E+00         1.53804E+00         2.38178E+00         1.00000E+00         4.03100E-10         2.38178E+00         7.22593E-01         1.65919E+00
+          2.44787E-02         2.05726E-02        -3.17383E-02         1.53771E+00         1.51194E+00         1.53804E+00         2.37863E+00         1.00000E+00         4.02435E-10         2.37863E+00         7.25777E-01         1.65286E+00
+          2.44787E-02         2.07425E-02        -3.19587E-02         1.53771E+00         1.52261E+00         1.53804E+00         2.37395E+00         1.00000E+00         3.99721E-10         2.37395E+00         7.28128E-01         1.64582E+00
+          2.44787E-02         2.09123E-02        -3.21810E-02         1.53770E+00         1.53328E+00         1.53804E+00         2.36772E+00         1.00000E+00         3.94840E-10         2.36772E+00         7.29636E-01         1.63808E+00
+          2.44787E-02         2.10821E-02        -3.24050E-02         1.53770E+00         1.54395E+00         1.53804E+00         2.35994E+00         1.00000E+00         3.87681E-10         2.35994E+00         7.30295E-01         1.62965E+00
+          2.44787E-02         2.12520E-02        -3.26308E-02         1.53769E+00         1.55462E+00         1.53804E+00         2.35063E+00         1.00000E+00         3.78150E-10         2.35063E+00         7.30101E-01         1.62053E+00
+          2.44787E-02         2.14218E-02        -3.28585E-02         1.53769E+00         1.56529E+00         1.53804E+00         2.33979E+00         1.00000E+00         3.66175E-10         2.33979E+00         7.29055E-01         1.61073E+00
+          2.44787E-02         2.15916E-02        -3.30880E-02         1.53768E+00         1.57596E+00         1.53804E+00         2.32744E+00         1.00000E+00         3.51712E-10         2.32744E+00         7.27158E-01         1.60028E+00
+          2.44787E-02         2.17614E-02        -3.33193E-02         1.53768E+00         1.58664E+00         1.53804E+00         2.31360E+00         1.00000E+00         3.34762E-10         2.31360E+00         7.24418E-01         1.58919E+00
+          2.44787E-02         2.19313E-02        -3.35524E-02         1.53767E+00         1.59731E+00         1.53804E+00         2.29831E+00         1.00000E+00         3.15395E-10         2.29831E+00         7.20842E-01         1.57746E+00
+          2.44787E-02         2.21011E-02        -3.37873E-02         1.53766E+00         1.60798E+00         1.53804E+00         2.28158E+00         1.00000E+00         2.93780E-10         2.28158E+00         7.16442E-01         1.56514E+00
+          2.44787E-02         2.22709E-02        -3.40240E-02         1.53766E+00         1.61865E+00         1.53804E+00         2.26345E+00         1.00000E+00         2.70254E-10         2.26345E+00         7.11233E-01         1.55222E+00
+          2.44787E-02         2.24407E-02        -3.42625E-02         1.53765E+00         1.62932E+00         1.53803E+00         2.24397E+00         1.00000E+00         2.45433E-10         2.24397E+00         7.05230E-01         1.53874E+00
+          2.44787E-02         2.26106E-02        -3.45029E-02         1.53765E+00         1.63999E+00         1.53803E+00         2.22316E+00         1.00000E+00         2.20405E-10         2.22316E+00         6.98455E-01         1.52471E+00
+          2.44787E-02         2.27804E-02        -3.47450E-02         1.53764E+00         1.65066E+00         1.53803E+00         2.20108E+00         1.00000E+00         1.97068E-10         2.20108E+00         6.90927E-01         1.51015E+00
+          2.44787E-02         2.29502E-02        -3.49890E-02         1.53764E+00         1.66133E+00         1.53803E+00         2.17777E+00         1.00000E+00         1.78576E-10         2.17777E+00         6.82671E-01         1.49510E+00
+          2.44787E-02         2.31201E-02        -3.52348E-02         1.53763E+00         1.67200E+00         1.53803E+00         2.15328E+00         1.00000E+00         1.69473E-10         2.15328E+00         6.73713E-01         1.47957E+00
+          2.44787E-02         2.32899E-02        -3.54824E-02         1.53762E+00         1.68267E+00         1.53803E+00         2.12765E+00         1.00000E+00         1.74390E-10         2.12765E+00         6.64081E-01         1.46357E+00
+          2.44787E-02         2.34597E-02        -3.57318E-02         1.53762E+00         1.69334E+00         1.53803E+00         2.10095E+00         1.00000E+00         1.95278E-10         2.10095E+00         6.53804E-01         1.44715E+00
+          2.44787E-02         2.36295E-02        -3.59831E-02         1.53761E+00         1.70401E+00         1.53803E+00         2.07322E+00         1.00000E+00         2.30524E-10         2.07322E+00         6.42914E-01         1.43031E+00
+          2.44787E-02         2.37994E-02        -3.62361E-02         1.53760E+00         1.71468E+00         1.53803E+00         2.04452E+00         1.00000E+00         2.77054E-10         2.04452E+00         6.31443E-01         1.41308E+00
+          2.44787E-02         2.39692E-02        -3.64910E-02         1.53760E+00         1.72535E+00         1.53803E+00         2.01491E+00         1.00000E+00         3.32211E-10         2.01491E+00         6.19425E-01         1.39549E+00
+          2.44787E-02         2.41390E-02        -3.67476E-02         1.53759E+00         1.73602E+00         1.53803E+00         1.98444E+00         1.00000E+00         3.94170E-10         1.98444E+00         6.06897E-01         1.37755E+00
+          2.44787E-02         2.43088E-02        -3.70061E-02         1.53759E+00         1.74669E+00         1.53803E+00         1.95318E+00         1.00000E+00         4.61734E-10         1.95318E+00         5.93894E-01         1.35929E+00
+          2.44787E-02         2.44787E-02        -3.72664E-02         1.53758E+00         1.75736E+00         1.53803E+00         1.92118E+00         1.00000E+00         5.34097E-10         1.92118E+00         5.80453E-01         1.34073E+00
+          2.44787E-02         2.46485E-02        -3.75285E-02         1.53757E+00         1.76804E+00         1.53803E+00         1.88851E+00         1.00000E+00         6.10669E-10         1.88851E+00         5.66612E-01         1.32189E+00
+          2.44787E-02         2.48183E-02        -3.77924E-02         1.53757E+00         1.77871E+00         1.53803E+00         1.85522E+00         1.00000E+00         6.90984E-10         1.85522E+00         5.52411E-01         1.30281E+00
+          2.44787E-02         2.49882E-02        -3.80582E-02         1.53756E+00         1.78938E+00         1.53803E+00         1.82138E+00         1.00000E+00         7.74635E-10         1.82138E+00         5.37887E-01         1.28349E+00
+          2.44787E-02         2.51580E-02        -3.83257E-02         1.53755E+00         1.80005E+00         1.53803E+00         1.78705E+00         1.00000E+00         8.61244E-10         1.78705E+00         5.23079E-01         1.26397E+00
+          2.44787E-02         2.53278E-02        -3.85951E-02         1.53755E+00         1.81072E+00         1.53803E+00         1.75229E+00         1.00000E+00         9.50442E-10         1.75229E+00         5.08028E-01         1.24426E+00
+          2.44787E-02         2.54976E-02        -3.88662E-02         1.53754E+00         1.82139E+00         1.53803E+00         1.71717E+00         1.00000E+00         1.04185E-09         1.71717E+00         4.92772E-01         1.22440E+00
+          2.44787E-02         2.56675E-02        -3.91392E-02         1.53753E+00         1.83206E+00         1.53803E+00         1.68175E+00         1.00000E+00         1.13509E-09         1.68175E+00         4.77350E-01         1.20440E+00
+          2.44787E-02         2.58373E-02        -3.94140E-02         1.53753E+00         1.84273E+00         1.53803E+00         1.64609E+00         1.00000E+00         1.22973E-09         1.64609E+00         4.61801E-01         1.18429E+00
+          2.44787E-02         2.60071E-02        -3.96907E-02         1.53752E+00         1.85340E+00         1.53803E+00         1.61026E+00         1.00000E+00         1.32536E-09         1.61026E+00         4.46162E-01         1.16410E+00
+          2.44787E-02         2.61769E-02        -3.99691E-02         1.53751E+00         1.86407E+00         1.53803E+00         1.57431E+00         1.00000E+00         1.42150E-09         1.57431E+00         4.30472E-01         1.14384E+00
+          2.46485E-02         8.72665E-04        -1.87307E-02         1.54871E+00         2.74155E-01         1.54882E+00         5.73615E+01         1.00000E+00         5.25588E-11         5.73615E+01         3.49989E+00         5.38617E+01
+          2.46485E-02         1.04249E-03        -1.87409E-02         1.54871E+00         2.84826E-01         1.54882E+00         5.63441E+01         1.00000E+00         4.86478E-11         5.63441E+01         3.46329E+00         5.28808E+01
+          2.46485E-02         1.21232E-03        -1.87530E-02         1.54871E+00         2.95496E-01         1.54882E+00         5.53055E+01         1.00000E+00         4.48381E-11         5.53055E+01         3.42541E+00         5.18801E+01
+          2.46485E-02         1.38215E-03        -1.87668E-02         1.54871E+00         3.06167E-01         1.54882E+00         5.42473E+01         1.00000E+00         4.11454E-11         5.42473E+01         3.38627E+00         5.08611E+01
+          2.46485E-02         1.55197E-03        -1.87825E-02         1.54871E+00         3.16838E-01         1.54882E+00         5.31714E+01         1.00000E+00         3.75843E-11         5.31714E+01         3.34589E+00         4.98255E+01
+          2.46485E-02         1.72180E-03        -1.87999E-02         1.54871E+00         3.27508E-01         1.54882E+00         5.20794E+01         1.00000E+00         3.41682E-11         5.20794E+01         3.30431E+00         4.87751E+01
+          2.46485E-02         1.89163E-03        -1.88192E-02         1.54871E+00         3.38179E-01         1.54882E+00         5.09730E+01         1.00000E+00         3.09090E-11         5.09730E+01         3.26153E+00         4.77115E+01
+          2.46485E-02         2.06146E-03        -1.88403E-02         1.54871E+00         3.48849E-01         1.54882E+00         4.98540E+01         1.00000E+00         2.78176E-11         4.98540E+01         3.21760E+00         4.66364E+01
+          2.46485E-02         2.23128E-03        -1.88632E-02         1.54871E+00         3.59520E-01         1.54882E+00         4.87240E+01         1.00000E+00         2.49030E-11         4.87240E+01         3.17253E+00         4.55514E+01
+          2.46485E-02         2.40111E-03        -1.88879E-02         1.54871E+00         3.70190E-01         1.54882E+00         4.75848E+01         1.00000E+00         2.21732E-11         4.75848E+01         3.12637E+00         4.44584E+01
+          2.46485E-02         2.57094E-03        -1.89144E-02         1.54871E+00         3.80861E-01         1.54882E+00         4.64381E+01         1.00000E+00         1.96342E-11         4.64381E+01         3.07915E+00         4.33589E+01
+          2.46485E-02         2.74077E-03        -1.89427E-02         1.54871E+00         3.91532E-01         1.54882E+00         4.52855E+01         1.00000E+00         1.72905E-11         4.52855E+01         3.03089E+00         4.22546E+01
+          2.46485E-02         2.91059E-03        -1.89729E-02         1.54870E+00         4.02202E-01         1.54882E+00         4.41287E+01         1.00000E+00         1.51448E-11         4.41287E+01         2.98165E+00         4.11471E+01
+          2.46485E-02         3.08042E-03        -1.90048E-02         1.54870E+00         4.12873E-01         1.54882E+00         4.29694E+01         1.00000E+00         1.31976E-11         4.29694E+01         2.93146E+00         4.00380E+01
+          2.46485E-02         3.25025E-03        -1.90386E-02         1.54870E+00         4.23543E-01         1.54882E+00         4.18092E+01         1.00000E+00         1.14471E-11         4.18092E+01         2.88035E+00         3.89289E+01
+          2.46485E-02         3.42008E-03        -1.90742E-02         1.54870E+00         4.34214E-01         1.54882E+00         4.06496E+01         1.00000E+00         9.88849E-12         4.06496E+01         2.82839E+00         3.78212E+01
+          2.46485E-02         3.58990E-03        -1.91116E-02         1.54870E+00         4.44884E-01         1.54882E+00         3.94923E+01         1.00000E+00         8.51360E-12         3.94923E+01         2.77561E+00         3.67167E+01
+          2.46485E-02         3.75973E-03        -1.91508E-02         1.54870E+00         4.55555E-01         1.54882E+00         3.83386E+01         1.00000E+00         7.31024E-12         3.83386E+01         2.72207E+00         3.56166E+01
+          2.46485E-02         3.92956E-03        -1.91918E-02         1.54870E+00         4.66225E-01         1.54882E+00         3.71902E+01         1.00000E+00         6.26174E-12         3.71902E+01         2.66780E+00         3.45224E+01
+          2.46485E-02         4.09939E-03        -1.92346E-02         1.54870E+00         4.76896E-01         1.54882E+00         3.60484E+01         1.00000E+00         5.34697E-12         3.60484E+01         2.61288E+00         3.34355E+01
+          2.46485E-02         4.26921E-03        -1.92792E-02         1.54870E+00         4.87567E-01         1.54882E+00         3.49146E+01         1.00000E+00         4.54106E-12         3.49146E+01         2.55734E+00         3.23572E+01
+          2.46485E-02         4.43904E-03        -1.93257E-02         1.54870E+00         4.98237E-01         1.54882E+00         3.37902E+01         1.00000E+00         3.81732E-12         3.37902E+01         2.50125E+00         3.12889E+01
+          2.46485E-02         4.60887E-03        -1.93739E-02         1.54869E+00         5.08908E-01         1.54882E+00         3.26764E+01         1.00000E+00         3.15040E-12         3.26764E+01         2.44467E+00         3.02317E+01
+          2.46485E-02         4.77869E-03        -1.94240E-02         1.54869E+00         5.19578E-01         1.54882E+00         3.15746E+01         1.00000E+00         2.52158E-12         3.15746E+01         2.38766E+00         2.91869E+01
+          2.46485E-02         4.94852E-03        -1.94759E-02         1.54869E+00         5.30249E-01         1.54881E+00         3.04858E+01         1.00000E+00         1.92972E-12         3.04858E+01         2.33027E+00         2.81556E+01
+          2.46485E-02         5.11835E-03        -1.95296E-02         1.54869E+00         5.40919E-01         1.54881E+00         2.94113E+01         1.00000E+00         1.42303E-12         2.94113E+01         2.27258E+00         2.71387E+01
+          2.46485E-02         5.28818E-03        -1.95851E-02         1.54869E+00         5.51590E-01         1.54881E+00         2.83521E+01         1.00000E+00         1.18082E-12         2.83521E+01         2.21464E+00         2.61375E+01
+          2.46485E-02         5.45800E-03        -1.96424E-02         1.54869E+00         5.62261E-01         1.54881E+00         2.73093E+01         1.00000E+00         1.43877E-12         2.73093E+01         2.15652E+00         2.51527E+01
+          2.46485E-02         5.62783E-03        -1.97015E-02         1.54869E+00         5.72931E-01         1.54881E+00         2.62837E+01         1.00000E+00         2.09152E-12         2.62837E+01         2.09830E+00         2.41854E+01
+          2.46485E-02         5.79766E-03        -1.97625E-02         1.54869E+00         5.83602E-01         1.54881E+00         2.52764E+01         1.00000E+00         2.94837E-12         2.52764E+01         2.04003E+00         2.32363E+01
+          2.46485E-02         5.96749E-03        -1.98252E-02         1.54868E+00         5.94272E-01         1.54881E+00         2.42881E+01         1.00000E+00         3.93122E-12         2.42881E+01         1.98179E+00         2.23063E+01
+          2.46485E-02         6.13731E-03        -1.98898E-02         1.54868E+00         6.04943E-01         1.54881E+00         2.33196E+01         1.00000E+00         5.01147E-12         2.33196E+01         1.92364E+00         2.13960E+01
+          2.46485E-02         6.30714E-03        -1.99562E-02         1.54868E+00         6.15613E-01         1.54881E+00         2.23717E+01         1.00000E+00         6.17577E-12         2.23717E+01         1.86567E+00         2.05061E+01
+          2.46485E-02         6.47697E-03        -2.00244E-02         1.54868E+00         6.26284E-01         1.54881E+00         2.14450E+01         1.00000E+00         7.41573E-12         2.14450E+01         1.80793E+00         1.96371E+01
+          2.46485E-02         6.64680E-03        -2.00944E-02         1.54868E+00         6.36955E-01         1.54881E+00         2.05402E+01         1.00000E+00         8.72473E-12         2.05402E+01         1.75050E+00         1.87897E+01
+          2.46485E-02         6.81662E-03        -2.01662E-02         1.54868E+00         6.47625E-01         1.54881E+00         1.96576E+01         1.00000E+00         1.00968E-11         1.96576E+01         1.69345E+00         1.79642E+01
+          2.46485E-02         6.98645E-03        -2.02398E-02         1.54867E+00         6.58296E-01         1.54881E+00         1.87980E+01         1.00000E+00         1.15261E-11         1.87980E+01         1.63685E+00         1.71611E+01
+          2.46485E-02         7.15628E-03        -2.03152E-02         1.54867E+00         6.68966E-01         1.54880E+00         1.79615E+01         1.00000E+00         1.30068E-11         1.79615E+01         1.58077E+00         1.63807E+01
+          2.46485E-02         7.32611E-03        -2.03925E-02         1.54867E+00         6.79637E-01         1.54880E+00         1.71487E+01         1.00000E+00         1.45331E-11         1.71487E+01         1.52529E+00         1.56234E+01
+          2.46485E-02         7.49593E-03        -2.04715E-02         1.54867E+00         6.90307E-01         1.54880E+00         1.63597E+01         1.00000E+00         1.60991E-11         1.63597E+01         1.47046E+00         1.48893E+01
+          2.46485E-02         7.66576E-03        -2.05524E-02         1.54867E+00         7.00978E-01         1.54880E+00         1.55950E+01         1.00000E+00         1.76988E-11         1.55950E+01         1.41637E+00         1.41786E+01
+          2.46485E-02         7.83559E-03        -2.06351E-02         1.54866E+00         7.11649E-01         1.54880E+00         1.48545E+01         1.00000E+00         1.93259E-11         1.48545E+01         1.36308E+00         1.34914E+01
+          2.46485E-02         8.00542E-03        -2.07196E-02         1.54866E+00         7.22319E-01         1.54880E+00         1.41385E+01         1.00000E+00         2.09740E-11         1.41385E+01         1.31065E+00         1.28278E+01
+          2.46485E-02         8.17524E-03        -2.08059E-02         1.54866E+00         7.32990E-01         1.54880E+00         1.34470E+01         1.00000E+00         2.26364E-11         1.34470E+01         1.25915E+00         1.21879E+01
+          2.46485E-02         8.34507E-03        -2.08940E-02         1.54866E+00         7.43660E-01         1.54880E+00         1.27801E+01         1.00000E+00         2.43060E-11         1.27801E+01         1.20864E+00         1.15714E+01
+          2.46485E-02         8.51490E-03        -2.09839E-02         1.54865E+00         7.54331E-01         1.54880E+00         1.21377E+01         1.00000E+00         2.59757E-11         1.21377E+01         1.15919E+00         1.09785E+01
+          2.46485E-02         8.68473E-03        -2.10757E-02         1.54865E+00         7.65001E-01         1.54880E+00         1.15197E+01         1.00000E+00         2.76375E-11         1.15197E+01         1.11085E+00         1.04088E+01
+          2.46485E-02         8.85455E-03        -2.11692E-02         1.54865E+00         7.75672E-01         1.54879E+00         1.09260E+01         1.00000E+00         2.92833E-11         1.09260E+01         1.06368E+00         9.86236E+00
+          2.46485E-02         9.02438E-03        -2.12646E-02         1.54865E+00         7.86343E-01         1.54879E+00         1.03565E+01         1.00000E+00         3.09044E-11         1.03565E+01         1.01774E+00         9.33880E+00
+          2.46485E-02         9.19421E-03        -2.13618E-02         1.54865E+00         7.97013E-01         1.54879E+00         9.81097E+00         1.00000E+00         3.24916E-11         9.81097E+00         9.73078E-01         8.83789E+00
+          2.46485E-02         9.36403E-03        -2.14607E-02         1.54864E+00         8.07684E-01         1.54879E+00         9.28907E+00         1.00000E+00         3.40349E-11         9.28907E+00         9.29745E-01         8.35933E+00
+          2.46485E-02         9.53386E-03        -2.15615E-02         1.54864E+00         8.18354E-01         1.54879E+00         8.79056E+00         1.00000E+00         3.55241E-11         8.79056E+00         8.87787E-01         7.90277E+00
+          2.46485E-02         9.70369E-03        -2.16642E-02         1.54864E+00         8.29025E-01         1.54879E+00         8.31509E+00         1.00000E+00         3.69481E-11         8.31509E+00         8.47250E-01         7.46784E+00
+          2.46485E-02         9.87352E-03        -2.17686E-02         1.54864E+00         8.39695E-01         1.54879E+00         7.86230E+00         1.00000E+00         3.82953E-11         7.86230E+00         8.08174E-01         7.05413E+00
+          2.46485E-02         1.00433E-02        -2.18748E-02         1.54863E+00         8.50366E-01         1.54879E+00         7.43180E+00         1.00000E+00         3.95534E-11         7.43180E+00         7.70597E-01         6.66121E+00
+          2.46485E-02         1.02132E-02        -2.19829E-02         1.54863E+00         8.61037E-01         1.54879E+00         7.02315E+00         1.00000E+00         4.07095E-11         7.02315E+00         7.34553E-01         6.28860E+00
+          2.46485E-02         1.03830E-02        -2.20927E-02         1.54863E+00         8.71707E-01         1.54879E+00         6.63589E+00         1.00000E+00         4.17503E-11         6.63589E+00         7.00074E-01         5.93582E+00
+          2.46485E-02         1.05528E-02        -2.22044E-02         1.54862E+00         8.82378E-01         1.54878E+00         6.26954E+00         1.00000E+00         4.26617E-11         6.26954E+00         6.67186E-01         5.60236E+00
+          2.46485E-02         1.07227E-02        -2.23179E-02         1.54862E+00         8.93048E-01         1.54878E+00         5.92359E+00         1.00000E+00         4.34291E-11         5.92359E+00         6.35914E-01         5.28768E+00
+          2.46485E-02         1.08925E-02        -2.24332E-02         1.54862E+00         9.03719E-01         1.54878E+00         5.59752E+00         1.00000E+00         4.40376E-11         5.59752E+00         6.06277E-01         4.99124E+00
+          2.46485E-02         1.10623E-02        -2.25503E-02         1.54862E+00         9.14389E-01         1.54878E+00         5.29076E+00         1.00000E+00         4.44717E-11         5.29076E+00         5.78292E-01         4.71247E+00
+          2.46485E-02         1.12321E-02        -2.26692E-02         1.54861E+00         9.25060E-01         1.54878E+00         5.00277E+00         1.00000E+00         4.47158E-11         5.00277E+00         5.51971E-01         4.45080E+00
+          2.46485E-02         1.14020E-02        -2.27899E-02         1.54861E+00         9.35731E-01         1.54878E+00         4.73295E+00         1.00000E+00         4.47537E-11         4.73295E+00         5.27322E-01         4.20563E+00
+          2.46485E-02         1.15718E-02        -2.29125E-02         1.54861E+00         9.46401E-01         1.54878E+00         4.48072E+00         1.00000E+00         4.45694E-11         4.48072E+00         5.04350E-01         3.97637E+00
+          2.46485E-02         1.17416E-02        -2.30368E-02         1.54860E+00         9.57072E-01         1.54878E+00         4.24546E+00         1.00000E+00         4.41468E-11         4.24546E+00         4.83055E-01         3.76241E+00
+          2.46485E-02         1.19114E-02        -2.31630E-02         1.54860E+00         9.67742E-01         1.54877E+00         4.02658E+00         1.00000E+00         4.34699E-11         4.02658E+00         4.63435E-01         3.56315E+00
+          2.46485E-02         1.20813E-02        -2.32910E-02         1.54860E+00         9.78413E-01         1.54877E+00         3.82345E+00         1.00000E+00         4.25232E-11         3.82345E+00         4.45481E-01         3.37797E+00
+          2.46485E-02         1.22511E-02        -2.34208E-02         1.54859E+00         9.89083E-01         1.54877E+00         3.63545E+00         1.00000E+00         4.12918E-11         3.63545E+00         4.29183E-01         3.20627E+00
+          2.46485E-02         1.24209E-02        -2.35524E-02         1.54859E+00         9.99754E-01         1.54877E+00         3.46196E+00         1.00000E+00         3.97621E-11         3.46196E+00         4.14525E-01         3.04744E+00
+          2.46485E-02         1.25908E-02        -2.36858E-02         1.54859E+00         1.01042E+00         1.54877E+00         3.30234E+00         1.00000E+00         3.79222E-11         3.30234E+00         4.01488E-01         2.90086E+00
+          2.46485E-02         1.27606E-02        -2.38210E-02         1.54858E+00         1.02110E+00         1.54877E+00         3.15598E+00         1.00000E+00         3.57630E-11         3.15598E+00         3.90050E-01         2.76593E+00
+          2.46485E-02         1.29304E-02        -2.39580E-02         1.54858E+00         1.03177E+00         1.54877E+00         3.02225E+00         1.00000E+00         3.32797E-11         3.02225E+00         3.80184E-01         2.64207E+00
+          2.46485E-02         1.31002E-02        -2.40969E-02         1.54858E+00         1.04244E+00         1.54877E+00         2.90053E+00         1.00000E+00         3.04754E-11         2.90053E+00         3.71861E-01         2.52867E+00
+          2.46485E-02         1.32701E-02        -2.42375E-02         1.54857E+00         1.05311E+00         1.54876E+00         2.79021E+00         1.00000E+00         2.73662E-11         2.79021E+00         3.65045E-01         2.42517E+00
+          2.46485E-02         1.34399E-02        -2.43800E-02         1.54857E+00         1.06378E+00         1.54876E+00         2.69069E+00         1.00000E+00         2.39935E-11         2.69069E+00         3.59701E-01         2.33098E+00
+          2.46485E-02         1.36097E-02        -2.45243E-02         1.54857E+00         1.07445E+00         1.54876E+00         2.60136E+00         1.00000E+00         2.04511E-11         2.60136E+00         3.55789E-01         2.24557E+00
+          2.46485E-02         1.37795E-02        -2.46704E-02         1.54856E+00         1.08512E+00         1.54876E+00         2.52164E+00         1.00000E+00         1.69502E-11         2.52164E+00         3.53264E-01         2.16837E+00
+          2.46485E-02         1.39494E-02        -2.48183E-02         1.54856E+00         1.09579E+00         1.54876E+00         2.45095E+00         1.00000E+00         1.39721E-11         2.45095E+00         3.52081E-01         2.09887E+00
+          2.46485E-02         1.41192E-02        -2.49680E-02         1.54856E+00         1.10646E+00         1.54876E+00         2.38872E+00         1.00000E+00         1.24895E-11         2.38872E+00         3.52189E-01         2.03653E+00
+          2.46485E-02         1.42890E-02        -2.51196E-02         1.54855E+00         1.11713E+00         1.54876E+00         2.33441E+00         1.00000E+00         1.36120E-11         2.33441E+00         3.53538E-01         1.98087E+00
+          2.46485E-02         1.44589E-02        -2.52729E-02         1.54855E+00         1.12780E+00         1.54876E+00         2.28747E+00         1.00000E+00         1.73333E-11         2.28747E+00         3.56073E-01         1.93140E+00
+          2.46485E-02         1.46287E-02        -2.54281E-02         1.54855E+00         1.13847E+00         1.54875E+00         2.24739E+00         1.00000E+00         2.28114E-11         2.24739E+00         3.59736E-01         1.88765E+00
+          2.46485E-02         1.47985E-02        -2.55851E-02         1.54854E+00         1.14914E+00         1.54875E+00         2.21364E+00         1.00000E+00         2.94180E-11         2.21364E+00         3.64469E-01         1.84917E+00
+          2.46485E-02         1.49683E-02        -2.57438E-02         1.54854E+00         1.15981E+00         1.54875E+00         2.18574E+00         1.00000E+00         3.68418E-11         2.18574E+00         3.70211E-01         1.81552E+00
+          2.46485E-02         1.51382E-02        -2.59044E-02         1.54853E+00         1.17048E+00         1.54875E+00         2.16320E+00         1.00000E+00         4.49318E-11         2.16320E+00         3.76899E-01         1.78630E+00
+          2.46485E-02         1.53080E-02        -2.60668E-02         1.54853E+00         1.18115E+00         1.54875E+00         2.14557E+00         1.00000E+00         5.36072E-11         2.14557E+00         3.84469E-01         1.76110E+00
+          2.46485E-02         1.54778E-02        -2.62311E-02         1.54853E+00         1.19182E+00         1.54875E+00         2.13241E+00         1.00000E+00         6.28179E-11         2.13241E+00         3.92855E-01         1.73955E+00
+          2.46485E-02         1.56476E-02        -2.63971E-02         1.54852E+00         1.20249E+00         1.54875E+00         2.12328E+00         1.00000E+00         7.25274E-11         2.12328E+00         4.01990E-01         1.72129E+00
+          2.46485E-02         1.58175E-02        -2.65649E-02         1.54852E+00         1.21317E+00         1.54875E+00         2.11778E+00         1.00000E+00         8.27049E-11         2.11778E+00         4.11807E-01         1.70597E+00
+          2.46485E-02         1.59873E-02        -2.67346E-02         1.54851E+00         1.22384E+00         1.54874E+00         2.11552E+00         1.00000E+00         9.33213E-11         2.11552E+00         4.22238E-01         1.69328E+00
+          2.46485E-02         1.61571E-02        -2.69061E-02         1.54851E+00         1.23451E+00         1.54874E+00         2.11612E+00         1.00000E+00         1.04346E-10         2.11612E+00         4.33212E-01         1.68291E+00
+          2.46485E-02         1.63270E-02        -2.70794E-02         1.54850E+00         1.24518E+00         1.54874E+00         2.11923E+00         1.00000E+00         1.15747E-10         2.11923E+00         4.44663E-01         1.67456E+00
+          2.46485E-02         1.64968E-02        -2.72544E-02         1.54850E+00         1.25585E+00         1.54874E+00         2.12451E+00         1.00000E+00         1.27490E-10         2.12451E+00         4.56519E-01         1.66799E+00
+          2.46485E-02         1.66666E-02        -2.74314E-02         1.54850E+00         1.26652E+00         1.54874E+00         2.13164E+00         1.00000E+00         1.39534E-10         2.13164E+00         4.68712E-01         1.66293E+00
+          2.46485E-02         1.68364E-02        -2.76101E-02         1.54849E+00         1.27719E+00         1.54874E+00         2.14032E+00         1.00000E+00         1.51837E-10         2.14032E+00         4.81173E-01         1.65915E+00
+          2.46485E-02         1.70063E-02        -2.77906E-02         1.54849E+00         1.28786E+00         1.54874E+00         2.15026E+00         1.00000E+00         1.64352E-10         2.15026E+00         4.93835E-01         1.65643E+00
+          2.46485E-02         1.71761E-02        -2.79729E-02         1.54848E+00         1.29853E+00         1.54874E+00         2.16121E+00         1.00000E+00         1.77027E-10         2.16121E+00         5.06629E-01         1.65458E+00
+          2.46485E-02         1.73459E-02        -2.81571E-02         1.54848E+00         1.30920E+00         1.54873E+00         2.17289E+00         1.00000E+00         1.89805E-10         2.17289E+00         5.19491E-01         1.65340E+00
+          2.46485E-02         1.75158E-02        -2.83431E-02         1.54847E+00         1.31987E+00         1.54873E+00         2.18509E+00         1.00000E+00         2.02624E-10         2.18509E+00         5.32353E-01         1.65274E+00
+          2.46485E-02         1.76856E-02        -2.85309E-02         1.54847E+00         1.33054E+00         1.54873E+00         2.19758E+00         1.00000E+00         2.15418E-10         2.19758E+00         5.45154E-01         1.65243E+00
+          2.46485E-02         1.78554E-02        -2.87204E-02         1.54846E+00         1.34121E+00         1.54873E+00         2.21017E+00         1.00000E+00         2.28114E-10         2.21017E+00         5.57830E-01         1.65234E+00
+          2.46485E-02         1.80252E-02        -2.89119E-02         1.54846E+00         1.35188E+00         1.54873E+00         2.22265E+00         1.00000E+00         2.40636E-10         2.22265E+00         5.70322E-01         1.65233E+00
+          2.46485E-02         1.81951E-02        -2.91051E-02         1.54845E+00         1.36255E+00         1.54873E+00         2.23487E+00         1.00000E+00         2.52902E-10         2.23487E+00         5.82570E-01         1.65230E+00
+          2.46485E-02         1.83649E-02        -2.93001E-02         1.54845E+00         1.37322E+00         1.54873E+00         2.24666E+00         1.00000E+00         2.64824E-10         2.24666E+00         5.94519E-01         1.65215E+00
+          2.46485E-02         1.85347E-02        -2.94969E-02         1.54844E+00         1.38389E+00         1.54873E+00         2.25788E+00         1.00000E+00         2.76311E-10         2.25788E+00         6.06114E-01         1.65177E+00
+          2.46485E-02         1.87045E-02        -2.96956E-02         1.54844E+00         1.39457E+00         1.54872E+00         2.26840E+00         1.00000E+00         2.87265E-10         2.26840E+00         6.17303E-01         1.65110E+00
+          2.46485E-02         1.88744E-02        -2.98961E-02         1.54844E+00         1.40524E+00         1.54872E+00         2.27810E+00         1.00000E+00         2.97585E-10         2.27810E+00         6.28038E-01         1.65006E+00
+          2.46485E-02         1.90442E-02        -3.00984E-02         1.54843E+00         1.41591E+00         1.54872E+00         2.28687E+00         1.00000E+00         3.07165E-10         2.28687E+00         6.38271E-01         1.64860E+00
+          2.46485E-02         1.92140E-02        -3.03024E-02         1.54843E+00         1.42658E+00         1.54872E+00         2.29462E+00         1.00000E+00         3.15896E-10         2.29462E+00         6.47959E-01         1.64666E+00
+          2.46485E-02         1.93839E-02        -3.05084E-02         1.54842E+00         1.43725E+00         1.54872E+00         2.30127E+00         1.00000E+00         3.23663E-10         2.30127E+00         6.57061E-01         1.64421E+00
+          2.46485E-02         1.95537E-02        -3.07161E-02         1.54841E+00         1.44792E+00         1.54872E+00         2.30674E+00         1.00000E+00         3.30350E-10         2.30674E+00         6.65538E-01         1.64120E+00
+          2.46485E-02         1.97235E-02        -3.09256E-02         1.54841E+00         1.45859E+00         1.54872E+00         2.31097E+00         1.00000E+00         3.35837E-10         2.31097E+00         6.73356E-01         1.63762E+00
+          2.46485E-02         1.98933E-02        -3.11370E-02         1.54840E+00         1.46926E+00         1.54872E+00         2.31391E+00         1.00000E+00         3.40004E-10         2.31391E+00         6.80481E-01         1.63343E+00
+          2.46485E-02         2.00632E-02        -3.13501E-02         1.54840E+00         1.47993E+00         1.54872E+00         2.31552E+00         1.00000E+00         3.42727E-10         2.31552E+00         6.86886E-01         1.62863E+00
+          2.46485E-02         2.02330E-02        -3.15651E-02         1.54839E+00         1.49060E+00         1.54872E+00         2.31575E+00         1.00000E+00         3.43882E-10         2.31575E+00         6.92545E-01         1.62320E+00
+          2.46485E-02         2.04028E-02        -3.17819E-02         1.54839E+00         1.50127E+00         1.54871E+00         2.31458E+00         1.00000E+00         3.43348E-10         2.31458E+00         6.97434E-01         1.61715E+00
+          2.46485E-02         2.05726E-02        -3.20005E-02         1.54838E+00         1.51194E+00         1.54871E+00         2.31199E+00         1.00000E+00         3.41002E-10         2.31199E+00         7.01535E-01         1.61046E+00
+          2.46485E-02         2.07425E-02        -3.22209E-02         1.54838E+00         1.52261E+00         1.54871E+00         2.30797E+00         1.00000E+00         3.36727E-10         2.30797E+00         7.04831E-01         1.60314E+00
+          2.46485E-02         2.09123E-02        -3.24431E-02         1.54837E+00         1.53328E+00         1.54871E+00         2.30252E+00         1.00000E+00         3.30410E-10         2.30252E+00         7.07310E-01         1.59521E+00
+          2.46485E-02         2.10821E-02        -3.26671E-02         1.54837E+00         1.54395E+00         1.54871E+00         2.29562E+00         1.00000E+00         3.21947E-10         2.29562E+00         7.08961E-01         1.58666E+00
+          2.46485E-02         2.12520E-02        -3.28930E-02         1.54836E+00         1.55462E+00         1.54871E+00         2.28728E+00         1.00000E+00         3.11243E-10         2.28728E+00         7.09778E-01         1.57751E+00
+          2.46485E-02         2.14218E-02        -3.31206E-02         1.54836E+00         1.56529E+00         1.54871E+00         2.27752E+00         1.00000E+00         2.98222E-10         2.27752E+00         7.09757E-01         1.56777E+00
+          2.46485E-02         2.15916E-02        -3.33501E-02         1.54835E+00         1.57596E+00         1.54871E+00         2.26635E+00         1.00000E+00         2.82830E-10         2.26635E+00         7.08898E-01         1.55745E+00
+          2.46485E-02         2.17614E-02        -3.35814E-02         1.54834E+00         1.58664E+00         1.54871E+00         2.25379E+00         1.00000E+00         2.65052E-10         2.25379E+00         7.07204E-01         1.54659E+00
+          2.46485E-02         2.19313E-02        -3.38145E-02         1.54834E+00         1.59731E+00         1.54871E+00         2.23986E+00         1.00000E+00         2.44928E-10         2.23986E+00         7.04679E-01         1.53518E+00
+          2.46485E-02         2.21011E-02        -3.40494E-02         1.54833E+00         1.60798E+00         1.54871E+00         2.22458E+00         1.00000E+00         2.22598E-10         2.22458E+00         7.01333E-01         1.52325E+00
+          2.46485E-02         2.22709E-02        -3.42861E-02         1.54833E+00         1.61865E+00         1.54871E+00         2.20800E+00         1.00000E+00         1.98374E-10         2.20800E+00         6.97177E-01         1.51082E+00
+          2.46485E-02         2.24407E-02        -3.45246E-02         1.54832E+00         1.62932E+00         1.54871E+00         2.19014E+00         1.00000E+00         1.72897E-10         2.19014E+00         6.92223E-01         1.49791E+00
+          2.46485E-02         2.26106E-02        -3.47650E-02         1.54832E+00         1.63999E+00         1.54871E+00         2.17103E+00         1.00000E+00         1.47482E-10         2.17103E+00         6.86488E-01         1.48454E+00
+          2.46485E-02         2.27804E-02        -3.50072E-02         1.54831E+00         1.65066E+00         1.54870E+00         2.15072E+00         1.00000E+00         1.24833E-10         2.15072E+00         6.79992E-01         1.47073E+00
+          2.46485E-02         2.29502E-02        -3.52511E-02         1.54830E+00         1.66133E+00         1.54870E+00         2.12925E+00         1.00000E+00         1.10130E-10         2.12925E+00         6.72755E-01         1.45649E+00
+          2.46485E-02         2.31201E-02        -3.54969E-02         1.54830E+00         1.67200E+00         1.54870E+00         2.10665E+00         1.00000E+00         1.10472E-10         2.10665E+00         6.64800E-01         1.44185E+00
+          2.46485E-02         2.32899E-02        -3.57445E-02         1.54829E+00         1.68267E+00         1.54870E+00         2.08298E+00         1.00000E+00         1.29228E-10         2.08298E+00         6.56153E-01         1.42683E+00
+          2.46485E-02         2.34597E-02        -3.59939E-02         1.54828E+00         1.69334E+00         1.54870E+00         2.05828E+00         1.00000E+00         1.63014E-10         2.05828E+00         6.46841E-01         1.41144E+00
+          2.46485E-02         2.36295E-02        -3.62452E-02         1.54828E+00         1.70401E+00         1.54870E+00         2.03260E+00         1.00000E+00         2.06979E-10         2.03260E+00         6.36893E-01         1.39571E+00
+          2.46485E-02         2.37994E-02        -3.64982E-02         1.54827E+00         1.71468E+00         1.54870E+00         2.00599E+00         1.00000E+00         2.57995E-10         2.00599E+00         6.26339E-01         1.37965E+00
+          2.46485E-02         2.39692E-02        -3.67531E-02         1.54827E+00         1.72535E+00         1.54870E+00         1.97849E+00         1.00000E+00         3.14375E-10         1.97849E+00         6.15212E-01         1.36328E+00
+          2.46485E-02         2.41390E-02        -3.70097E-02         1.54826E+00         1.73602E+00         1.54870E+00         1.95017E+00         1.00000E+00         3.75178E-10         1.95017E+00         6.03545E-01         1.34662E+00
+          2.46485E-02         2.43088E-02        -3.72682E-02         1.54825E+00         1.74669E+00         1.54870E+00         1.92106E+00         1.00000E+00         4.39827E-10         1.92106E+00         5.91373E-01         1.32969E+00
+          2.46485E-02         2.44787E-02        -3.75285E-02         1.54825E+00         1.75736E+00         1.54870E+00         1.89123E+00         1.00000E+00         5.07912E-10         1.89123E+00         5.78731E-01         1.31250E+00
+          2.46485E-02         2.46485E-02        -3.77906E-02         1.54824E+00         1.76804E+00         1.54870E+00         1.86072E+00         1.00000E+00         5.79108E-10         1.86072E+00         5.65655E-01         1.29507E+00
+          2.46485E-02         2.48183E-02        -3.80545E-02         1.54823E+00         1.77871E+00         1.54870E+00         1.82960E+00         1.00000E+00         6.53121E-10         1.82960E+00         5.52184E-01         1.27742E+00
+          2.46485E-02         2.49882E-02        -3.83203E-02         1.54823E+00         1.78938E+00         1.54870E+00         1.79791E+00         1.00000E+00         7.29667E-10         1.79791E+00         5.38354E-01         1.25956E+00
+          2.46485E-02         2.51580E-02        -3.85878E-02         1.54822E+00         1.80005E+00         1.54870E+00         1.76572E+00         1.00000E+00         8.08458E-10         1.76572E+00         5.24204E-01         1.24151E+00
+          2.46485E-02         2.53278E-02        -3.88572E-02         1.54821E+00         1.81072E+00         1.54870E+00         1.73307E+00         1.00000E+00         8.89191E-10         1.73307E+00         5.09773E-01         1.22330E+00
+          2.46485E-02         2.54976E-02        -3.91283E-02         1.54821E+00         1.82139E+00         1.54870E+00         1.70003E+00         1.00000E+00         9.71547E-10         1.70003E+00         4.95098E-01         1.20493E+00
+          2.46485E-02         2.56675E-02        -3.94013E-02         1.54820E+00         1.83206E+00         1.54870E+00         1.66664E+00         1.00000E+00         1.05518E-09         1.66664E+00         4.80219E-01         1.18642E+00
+          2.46485E-02         2.58373E-02        -3.96761E-02         1.54819E+00         1.84273E+00         1.54870E+00         1.63297E+00         1.00000E+00         1.13973E-09         1.63297E+00         4.65174E-01         1.16780E+00
+          2.46485E-02         2.60071E-02        -3.99527E-02         1.54819E+00         1.85340E+00         1.54870E+00         1.59908E+00         1.00000E+00         1.22480E-09         1.59908E+00         4.50000E-01         1.14908E+00
+          2.46485E-02         2.61769E-02        -4.02312E-02         1.54818E+00         1.86407E+00         1.54870E+00         1.56501E+00         1.00000E+00         1.30998E-09         1.56501E+00         4.34735E-01         1.13027E+00
+          2.48183E-02         8.72665E-04        -1.89947E-02         1.55938E+00         2.74155E-01         1.55950E+00         5.61778E+01         1.00000E+00         6.16425E-11         5.61778E+01         3.35896E+00         5.28188E+01
+          2.48183E-02         1.04249E-03        -1.90049E-02         1.55938E+00         2.84826E-01         1.55950E+00         5.51814E+01         1.00000E+00         5.71179E-11         5.51814E+01         3.32593E+00         5.18555E+01
+          2.48183E-02         1.21232E-03        -1.90170E-02         1.55938E+00         2.95496E-01         1.55950E+00         5.41643E+01         1.00000E+00         5.27059E-11         5.41643E+01         3.29169E+00         5.08726E+01
+          2.48183E-02         1.38215E-03        -1.90308E-02         1.55938E+00         3.06167E-01         1.55950E+00         5.31280E+01         1.00000E+00         4.84238E-11         5.31280E+01         3.25625E+00         4.98718E+01
+          2.48183E-02         1.55197E-03        -1.90465E-02         1.55938E+00         3.16838E-01         1.55950E+00         5.20744E+01         1.00000E+00         4.42877E-11         5.20744E+01         3.21964E+00         4.88548E+01
+          2.48183E-02         1.72180E-03        -1.90639E-02         1.55938E+00         3.27508E-01         1.55950E+00         5.10050E+01         1.00000E+00         4.03122E-11         5.10050E+01         3.18186E+00         4.78231E+01
+          2.48183E-02         1.89163E-03        -1.90832E-02         1.55938E+00         3.38179E-01         1.55950E+00         4.99216E+01         1.00000E+00         3.65101E-11         4.99216E+01         3.14294E+00         4.67786E+01
+          2.48183E-02         2.06146E-03        -1.91043E-02         1.55938E+00         3.48849E-01         1.55950E+00         4.88257E+01         1.00000E+00         3.28928E-11         4.88257E+01         3.10290E+00         4.57228E+01
+          2.48183E-02         2.23128E-03        -1.91272E-02         1.55938E+00         3.59520E-01         1.55950E+00         4.77192E+01         1.00000E+00         2.94699E-11         4.77192E+01         3.06175E+00         4.46574E+01
+          2.48183E-02         2.40111E-03        -1.91519E-02         1.55938E+00         3.70190E-01         1.55949E+00         4.66036E+01         1.00000E+00         2.62492E-11         4.66036E+01         3.01953E+00         4.35841E+01
+          2.48183E-02         2.57094E-03        -1.91784E-02         1.55938E+00         3.80861E-01         1.55949E+00         4.54807E+01         1.00000E+00         2.32368E-11         4.54807E+01         2.97627E+00         4.25045E+01
+          2.48183E-02         2.74077E-03        -1.92067E-02         1.55938E+00         3.91532E-01         1.55949E+00         4.43521E+01         1.00000E+00         2.04369E-11         4.43521E+01         2.93198E+00         4.14201E+01
+          2.48183E-02         2.91059E-03        -1.92369E-02         1.55937E+00         4.02202E-01         1.55949E+00         4.32194E+01         1.00000E+00         1.78520E-11         4.32194E+01         2.88670E+00         4.03327E+01
+          2.48183E-02         3.08042E-03        -1.92688E-02         1.55937E+00         4.12873E-01         1.55949E+00         4.20842E+01         1.00000E+00         1.54824E-11         4.20842E+01         2.84047E+00         3.92437E+01
+          2.48183E-02         3.25025E-03        -1.93026E-02         1.55937E+00         4.23543E-01         1.55949E+00         4.09481E+01         1.00000E+00         1.33264E-11         4.09481E+01         2.79332E+00         3.81548E+01
+          2.48183E-02         3.42008E-03        -1.93382E-02         1.55937E+00         4.34214E-01         1.55949E+00         3.98126E+01         1.00000E+00         1.13803E-11         3.98126E+01         2.74529E+00         3.70673E+01
+          2.48183E-02         3.58990E-03        -1.93756E-02         1.55937E+00         4.44884E-01         1.55949E+00         3.86794E+01         1.00000E+00         9.63773E-12         3.86794E+01         2.69642E+00         3.59829E+01
+          2.48183E-02         3.75973E-03        -1.94148E-02         1.55937E+00         4.55555E-01         1.55949E+00         3.75497E+01         1.00000E+00         8.08994E-12         3.75497E+01         2.64675E+00         3.49030E+01
+          2.48183E-02         3.92956E-03        -1.94558E-02         1.55937E+00         4.66225E-01         1.55949E+00         3.64252E+01         1.00000E+00         6.72518E-12         3.64252E+01         2.59632E+00         3.38289E+01
+          2.48183E-02         4.09939E-03        -1.94986E-02         1.55937E+00         4.76896E-01         1.55949E+00         3.53072E+01         1.00000E+00         5.52857E-12         3.53072E+01         2.54518E+00         3.27620E+01
+          2.48183E-02         4.26921E-03        -1.95432E-02         1.55937E+00         4.87567E-01         1.55949E+00         3.41971E+01         1.00000E+00         4.48196E-12         3.41971E+01         2.49338E+00         3.17037E+01
+          2.48183E-02         4.43904E-03        -1.95897E-02         1.55937E+00         4.98237E-01         1.55949E+00         3.30961E+01         1.00000E+00         3.56420E-12         3.30961E+01         2.44097E+00         3.06551E+01
+          2.48183E-02         4.60887E-03        -1.96379E-02         1.55937E+00         5.08908E-01         1.55949E+00         3.20056E+01         1.00000E+00         2.75222E-12         3.20056E+01         2.38801E+00         2.96176E+01
+          2.48183E-02         4.77869E-03        -1.96880E-02         1.55936E+00         5.19578E-01         1.55949E+00         3.09268E+01         1.00000E+00         2.02368E-12         3.09268E+01         2.33454E+00         2.85922E+01
+          2.48183E-02         4.94852E-03        -1.97399E-02         1.55936E+00         5.30249E-01         1.55949E+00         2.98608E+01         1.00000E+00         1.36463E-12         2.98608E+01         2.28062E+00         2.75801E+01
+          2.48183E-02         5.11835E-03        -1.97936E-02         1.55936E+00         5.40919E-01         1.55949E+00         2.88087E+01         1.00000E+00         8.04666E-13         2.88087E+01         2.22632E+00         2.65824E+01
+          2.48183E-02         5.28818E-03        -1.98491E-02         1.55936E+00         5.51590E-01         1.55949E+00         2.77717E+01         1.00000E+00         6.07407E-13         2.77717E+01         2.17169E+00         2.56000E+01
+          2.48183E-02         5.45800E-03        -1.99064E-02         1.55936E+00         5.62261E-01         1.55949E+00         2.67506E+01         1.00000E+00         1.03085E-12         2.67506E+01         2.11679E+00         2.46339E+01
+          2.48183E-02         5.62783E-03        -1.99655E-02         1.55936E+00         5.72931E-01         1.55948E+00         2.57466E+01         1.00000E+00         1.69017E-12         2.57466E+01         2.06168E+00         2.36849E+01
+          2.48183E-02         5.79766E-03        -2.00265E-02         1.55936E+00         5.83602E-01         1.55948E+00         2.47603E+01         1.00000E+00         2.43868E-12         2.47603E+01         2.00643E+00         2.27539E+01
+          2.48183E-02         5.96749E-03        -2.00892E-02         1.55935E+00         5.94272E-01         1.55948E+00         2.37927E+01         1.00000E+00         3.25227E-12         2.37927E+01         1.95111E+00         2.18416E+01
+          2.48183E-02         6.13731E-03        -2.01538E-02         1.55935E+00         6.04943E-01         1.55948E+00         2.28446E+01         1.00000E+00         4.12538E-12         2.28446E+01         1.89577E+00         2.09488E+01
+          2.48183E-02         6.30714E-03        -2.02202E-02         1.55935E+00         6.15613E-01         1.55948E+00         2.19165E+01         1.00000E+00         5.05539E-12         2.19165E+01         1.84050E+00         2.00760E+01
+          2.48183E-02         6.47697E-03        -2.02884E-02         1.55935E+00         6.26284E-01         1.55948E+00         2.10093E+01         1.00000E+00         6.03970E-12         2.10093E+01         1.78534E+00         1.92240E+01
+          2.48183E-02         6.64680E-03        -2.03584E-02         1.55935E+00         6.36955E-01         1.55948E+00         2.01234E+01         1.00000E+00         7.07526E-12         2.01234E+01         1.73038E+00         1.83930E+01
+          2.48183E-02         6.81662E-03        -2.04302E-02         1.55935E+00         6.47625E-01         1.55948E+00         1.92594E+01         1.00000E+00         8.15856E-12         1.92594E+01         1.67568E+00         1.75837E+01
+          2.48183E-02         6.98645E-03        -2.05038E-02         1.55934E+00         6.58296E-01         1.55948E+00         1.84178E+01         1.00000E+00         9.28576E-12         1.84178E+01         1.62131E+00         1.67965E+01
+          2.48183E-02         7.15628E-03        -2.05792E-02         1.55934E+00         6.68966E-01         1.55948E+00         1.75989E+01         1.00000E+00         1.04528E-11         1.75989E+01         1.56733E+00         1.60316E+01
+          2.48183E-02         7.32611E-03        -2.06565E-02         1.55934E+00         6.79637E-01         1.55948E+00         1.68032E+01         1.00000E+00         1.16556E-11         1.68032E+01         1.51383E+00         1.52893E+01
+          2.48183E-02         7.49593E-03        -2.07355E-02         1.55934E+00         6.90307E-01         1.55948E+00         1.60308E+01         1.00000E+00         1.28900E-11         1.60308E+01         1.46086E+00         1.45699E+01
+          2.48183E-02         7.66576E-03        -2.08164E-02         1.55934E+00         7.00978E-01         1.55947E+00         1.52821E+01         1.00000E+00         1.41515E-11         1.52821E+01         1.40849E+00         1.38736E+01
+          2.48183E-02         7.83559E-03        -2.08991E-02         1.55933E+00         7.11649E-01         1.55947E+00         1.45572E+01         1.00000E+00         1.54361E-11         1.45572E+01         1.35679E+00         1.32004E+01
+          2.48183E-02         8.00542E-03        -2.09836E-02         1.55933E+00         7.22319E-01         1.55947E+00         1.38562E+01         1.00000E+00         1.67391E-11         1.38562E+01         1.30582E+00         1.25504E+01
+          2.48183E-02         8.17524E-03        -2.10699E-02         1.55933E+00         7.32990E-01         1.55947E+00         1.31792E+01         1.00000E+00         1.80559E-11         1.31792E+01         1.25566E+00         1.19236E+01
+          2.48183E-02         8.34507E-03        -2.11580E-02         1.55933E+00         7.43660E-01         1.55947E+00         1.25263E+01         1.00000E+00         1.93817E-11         1.25263E+01         1.20636E+00         1.13200E+01
+          2.48183E-02         8.51490E-03        -2.12479E-02         1.55933E+00         7.54331E-01         1.55947E+00         1.18974E+01         1.00000E+00         2.07113E-11         1.18974E+01         1.15799E+00         1.07394E+01
+          2.48183E-02         8.68473E-03        -2.13397E-02         1.55932E+00         7.65001E-01         1.55947E+00         1.12924E+01         1.00000E+00         2.20389E-11         1.12924E+01         1.11061E+00         1.01818E+01
+          2.48183E-02         8.85455E-03        -2.14332E-02         1.55932E+00         7.75672E-01         1.55947E+00         1.07112E+01         1.00000E+00         2.33586E-11         1.07112E+01         1.06427E+00         9.64691E+00
+          2.48183E-02         9.02438E-03        -2.15286E-02         1.55932E+00         7.86343E-01         1.55947E+00         1.01536E+01         1.00000E+00         2.46635E-11         1.01536E+01         1.01903E+00         9.13457E+00
+          2.48183E-02         9.19421E-03        -2.16257E-02         1.55932E+00         7.97013E-01         1.55947E+00         9.61944E+00         1.00000E+00         2.59466E-11         9.61944E+00         9.74954E-01         8.64449E+00
+          2.48183E-02         9.36403E-03        -2.17247E-02         1.55931E+00         8.07684E-01         1.55946E+00         9.10845E+00         1.00000E+00         2.71997E-11         9.10845E+00         9.32084E-01         8.17637E+00
+          2.48183E-02         9.53386E-03        -2.18255E-02         1.55931E+00         8.18354E-01         1.55946E+00         8.62033E+00         1.00000E+00         2.84142E-11         8.62033E+00         8.90473E-01         7.72986E+00
+          2.48183E-02         9.70369E-03        -2.19281E-02         1.55931E+00         8.29025E-01         1.55946E+00         8.15476E+00         1.00000E+00         2.95809E-11         8.15476E+00         8.50168E-01         7.30459E+00
+          2.48183E-02         9.87352E-03        -2.20326E-02         1.55931E+00         8.39695E-01         1.55946E+00         7.71138E+00         1.00000E+00         3.06895E-11         7.71138E+00         8.11212E-01         6.90016E+00
+          2.48183E-02         1.00433E-02        -2.21388E-02         1.55930E+00         8.50366E-01         1.55946E+00         7.28979E+00         1.00000E+00         3.17293E-11         7.28979E+00         7.73648E-01         6.51614E+00
+          2.48183E-02         1.02132E-02        -2.22468E-02         1.55930E+00         8.61037E-01         1.55946E+00         6.88957E+00         1.00000E+00         3.26888E-11         6.88957E+00         7.37512E-01         6.15206E+00
+          2.48183E-02         1.03830E-02        -2.23567E-02         1.55930E+00         8.71707E-01         1.55946E+00         6.51028E+00         1.00000E+00         3.35556E-11         6.51028E+00         7.02840E-01         5.80744E+00
+          2.48183E-02         1.05528E-02        -2.24684E-02         1.55929E+00         8.82378E-01         1.55946E+00         6.15143E+00         1.00000E+00         3.43169E-11         6.15143E+00         6.69664E-01         5.48177E+00
+          2.48183E-02         1.07227E-02        -2.25819E-02         1.55929E+00         8.93048E-01         1.55946E+00         5.81254E+00         1.00000E+00         3.49592E-11         5.81254E+00         6.38010E-01         5.17453E+00
+          2.48183E-02         1.08925E-02        -2.26972E-02         1.55929E+00         9.03719E-01         1.55945E+00         5.49307E+00         1.00000E+00         3.54686E-11         5.49307E+00         6.07904E-01         4.88517E+00
+          2.48183E-02         1.10623E-02        -2.28143E-02         1.55929E+00         9.14389E-01         1.55945E+00         5.19249E+00         1.00000E+00         3.58304E-11         5.19249E+00         5.79365E-01         4.61313E+00
+          2.48183E-02         1.12321E-02        -2.29332E-02         1.55928E+00         9.25060E-01         1.55945E+00         4.91026E+00         1.00000E+00         3.60300E-11         4.91026E+00         5.52413E-01         4.35784E+00
+          2.48183E-02         1.14020E-02        -2.30539E-02         1.55928E+00         9.35731E-01         1.55945E+00         4.64579E+00         1.00000E+00         3.60521E-11         4.64579E+00         5.27059E-01         4.11873E+00
+          2.48183E-02         1.15718E-02        -2.31764E-02         1.55928E+00         9.46401E-01         1.55945E+00         4.39851E+00         1.00000E+00         3.58813E-11         4.39851E+00         5.03313E-01         3.89519E+00
+          2.48183E-02         1.17416E-02        -2.33008E-02         1.55927E+00         9.57072E-01         1.55945E+00         4.16782E+00         1.00000E+00         3.55021E-11         4.16782E+00         4.81181E-01         3.68664E+00
+          2.48183E-02         1.19114E-02        -2.34270E-02         1.55927E+00         9.67742E-01         1.55945E+00         3.95314E+00         1.00000E+00         3.48990E-11         3.95314E+00         4.60665E-01         3.49247E+00
+          2.48183E-02         1.20813E-02        -2.35549E-02         1.55927E+00         9.78413E-01         1.55945E+00         3.75384E+00         1.00000E+00         3.40569E-11         3.75384E+00         4.41763E-01         3.31208E+00
+          2.48183E-02         1.22511E-02        -2.36847E-02         1.55926E+00         9.89083E-01         1.55944E+00         3.56933E+00         1.00000E+00         3.29606E-11         3.56933E+00         4.24469E-01         3.14487E+00
+          2.48183E-02         1.24209E-02        -2.38163E-02         1.55926E+00         9.99754E-01         1.55944E+00         3.39899E+00         1.00000E+00         3.15958E-11         3.39899E+00         4.08773E-01         2.99022E+00
+          2.48183E-02         1.25908E-02        -2.39498E-02         1.55926E+00         1.01042E+00         1.55944E+00         3.24221E+00         1.00000E+00         2.99491E-11         3.24221E+00         3.94661E-01         2.84755E+00
+          2.48183E-02         1.27606E-02        -2.40850E-02         1.55925E+00         1.02110E+00         1.55944E+00         3.09838E+00         1.00000E+00         2.80082E-11         3.09838E+00         3.82118E-01         2.71626E+00
+          2.48183E-02         1.29304E-02        -2.42220E-02         1.55925E+00         1.03177E+00         1.55944E+00         2.96688E+00         1.00000E+00         2.57631E-11         2.96688E+00         3.71120E-01         2.59576E+00
+          2.48183E-02         1.31002E-02        -2.43609E-02         1.55925E+00         1.04244E+00         1.55944E+00         2.84711E+00         1.00000E+00         2.32074E-11         2.84711E+00         3.61645E-01         2.48547E+00
+          2.48183E-02         1.32701E-02        -2.45015E-02         1.55924E+00         1.05311E+00         1.55944E+00         2.73848E+00         1.00000E+00         2.03412E-11         2.73848E+00         3.53663E-01         2.38482E+00
+          2.48183E-02         1.34399E-02        -2.46440E-02         1.55924E+00         1.06378E+00         1.55944E+00         2.64039E+00         1.00000E+00         1.71785E-11         2.64039E+00         3.47143E-01         2.29325E+00
+          2.48183E-02         1.36097E-02        -2.47883E-02         1.55924E+00         1.07445E+00         1.55943E+00         2.55226E+00         1.00000E+00         1.37664E-11         2.55226E+00         3.42050E-01         2.21021E+00
+          2.48183E-02         1.37795E-02        -2.49344E-02         1.55923E+00         1.08512E+00         1.55943E+00         2.47350E+00         1.00000E+00         1.02512E-11         2.47350E+00         3.38346E-01         2.13516E+00
+          2.48183E-02         1.39494E-02        -2.50823E-02         1.55923E+00         1.09579E+00         1.55943E+00         2.40357E+00         1.00000E+00         7.14864E-12         2.40357E+00         3.35989E-01         2.06758E+00
+          2.48183E-02         1.41192E-02        -2.52320E-02         1.55923E+00         1.10646E+00         1.55943E+00         2.34190E+00         1.00000E+00         6.16890E-12         2.34190E+00         3.34935E-01         2.00697E+00
+          2.48183E-02         1.42890E-02        -2.53836E-02         1.55922E+00         1.11713E+00         1.55943E+00         2.28796E+00         1.00000E+00         8.81164E-12         2.28796E+00         3.35138E-01         1.95283E+00
+          2.48183E-02         1.44589E-02        -2.55369E-02         1.55922E+00         1.12780E+00         1.55943E+00         2.24122E+00         1.00000E+00         1.35185E-11         2.24122E+00         3.36546E-01         1.90468E+00
+          2.48183E-02         1.46287E-02        -2.56921E-02         1.55921E+00         1.13847E+00         1.55943E+00         2.20117E+00         1.00000E+00         1.91666E-11         2.20117E+00         3.39107E-01         1.86207E+00
+          2.48183E-02         1.47985E-02        -2.58490E-02         1.55921E+00         1.14914E+00         1.55943E+00         2.16732E+00         1.00000E+00         2.54262E-11         2.16732E+00         3.42768E-01         1.82455E+00
+          2.48183E-02         1.49683E-02        -2.60078E-02         1.55921E+00         1.15981E+00         1.55942E+00         2.13917E+00         1.00000E+00         3.21876E-11         2.13917E+00         3.47471E-01         1.79170E+00
+          2.48183E-02         1.51382E-02        -2.61684E-02         1.55920E+00         1.17048E+00         1.55942E+00         2.11627E+00         1.00000E+00         3.94035E-11         2.11627E+00         3.53157E-01         1.76311E+00
+          2.48183E-02         1.53080E-02        -2.63308E-02         1.55920E+00         1.18115E+00         1.55942E+00         2.09816E+00         1.00000E+00         4.70468E-11         2.09816E+00         3.59766E-01         1.73840E+00
+          2.48183E-02         1.54778E-02        -2.64950E-02         1.55919E+00         1.19182E+00         1.55942E+00         2.08442E+00         1.00000E+00         5.50973E-11         2.08442E+00         3.67235E-01         1.71719E+00
+          2.48183E-02         1.56476E-02        -2.66611E-02         1.55919E+00         1.20249E+00         1.55942E+00         2.07463E+00         1.00000E+00         6.35367E-11         2.07463E+00         3.75501E-01         1.69913E+00
+          2.48183E-02         1.58175E-02        -2.68289E-02         1.55919E+00         1.21317E+00         1.55942E+00         2.06839E+00         1.00000E+00         7.23458E-11         2.06839E+00         3.84500E-01         1.68389E+00
+          2.48183E-02         1.59873E-02        -2.69986E-02         1.55918E+00         1.22384E+00         1.55942E+00         2.06533E+00         1.00000E+00         8.15036E-11         2.06533E+00         3.94165E-01         1.67116E+00
+          2.48183E-02         1.61571E-02        -2.71700E-02         1.55918E+00         1.23451E+00         1.55941E+00         2.06507E+00         1.00000E+00         9.09866E-11         2.06507E+00         4.04430E-01         1.66064E+00
+          2.48183E-02         1.63270E-02        -2.73433E-02         1.55917E+00         1.24518E+00         1.55941E+00         2.06728E+00         1.00000E+00         1.00768E-10         2.06728E+00         4.15229E-01         1.65205E+00
+          2.48183E-02         1.64968E-02        -2.75184E-02         1.55917E+00         1.25585E+00         1.55941E+00         2.07163E+00         1.00000E+00         1.10819E-10         2.07163E+00         4.26494E-01         1.64513E+00
+          2.48183E-02         1.66666E-02        -2.76953E-02         1.55917E+00         1.26652E+00         1.55941E+00         2.07780E+00         1.00000E+00         1.21104E-10         2.07780E+00         4.38158E-01         1.63965E+00
+          2.48183E-02         1.68364E-02        -2.78740E-02         1.55916E+00         1.27719E+00         1.55941E+00         2.08552E+00         1.00000E+00         1.31587E-10         2.08552E+00         4.50153E-01         1.63536E+00
+          2.48183E-02         1.70063E-02        -2.80546E-02         1.55916E+00         1.28786E+00         1.55941E+00         2.09449E+00         1.00000E+00         1.42226E-10         2.09449E+00         4.62414E-01         1.63207E+00
+          2.48183E-02         1.71761E-02        -2.82369E-02         1.55915E+00         1.29853E+00         1.55941E+00         2.10446E+00         1.00000E+00         1.52976E-10         2.10446E+00         4.74872E-01         1.62959E+00
+          2.48183E-02         1.73459E-02        -2.84211E-02         1.55915E+00         1.30920E+00         1.55941E+00         2.11519E+00         1.00000E+00         1.63787E-10         2.11519E+00         4.87464E-01         1.62772E+00
+          2.48183E-02         1.75158E-02        -2.86070E-02         1.55914E+00         1.31987E+00         1.55940E+00         2.12645E+00         1.00000E+00         1.74605E-10         2.12645E+00         5.00124E-01         1.62633E+00
+          2.48183E-02         1.76856E-02        -2.87948E-02         1.55914E+00         1.33054E+00         1.55940E+00         2.13804E+00         1.00000E+00         1.85372E-10         2.13804E+00         5.12788E-01         1.62525E+00
+          2.48183E-02         1.78554E-02        -2.89844E-02         1.55913E+00         1.34121E+00         1.55940E+00         2.14975E+00         1.00000E+00         1.96024E-10         2.14975E+00         5.25395E-01         1.62435E+00
+          2.48183E-02         1.80252E-02        -2.91758E-02         1.55913E+00         1.35188E+00         1.55940E+00         2.16141E+00         1.00000E+00         2.06494E-10         2.16141E+00         5.37884E-01         1.62352E+00
+          2.48183E-02         1.81951E-02        -2.93690E-02         1.55912E+00         1.36255E+00         1.55940E+00         2.17284E+00         1.00000E+00         2.16710E-10         2.17284E+00         5.50195E-01         1.62265E+00
+          2.48183E-02         1.83649E-02        -2.95641E-02         1.55912E+00         1.37322E+00         1.55940E+00         2.18391E+00         1.00000E+00         2.26596E-10         2.18391E+00         5.62272E-01         1.62164E+00
+          2.48183E-02         1.85347E-02        -2.97609E-02         1.55911E+00         1.38389E+00         1.55940E+00         2.19447E+00         1.00000E+00         2.36072E-10         2.19447E+00         5.74059E-01         1.62041E+00
+          2.48183E-02         1.87045E-02        -2.99596E-02         1.55911E+00         1.39457E+00         1.55940E+00         2.20439E+00         1.00000E+00         2.45052E-10         2.20439E+00         5.85504E-01         1.61889E+00
+          2.48183E-02         1.88744E-02        -3.01600E-02         1.55910E+00         1.40524E+00         1.55940E+00         2.21357E+00         1.00000E+00         2.53449E-10         2.21357E+00         5.96555E-01         1.61701E+00
+          2.48183E-02         1.90442E-02        -3.03623E-02         1.55910E+00         1.41591E+00         1.55939E+00         2.22189E+00         1.00000E+00         2.61169E-10         2.22189E+00         6.07165E-01         1.61473E+00
+          2.48183E-02         1.92140E-02        -3.05664E-02         1.55909E+00         1.42658E+00         1.55939E+00         2.22928E+00         1.00000E+00         2.68117E-10         2.22928E+00         6.17287E-01         1.61199E+00
+          2.48183E-02         1.93839E-02        -3.07723E-02         1.55909E+00         1.43725E+00         1.55939E+00         2.23564E+00         1.00000E+00         2.74192E-10         2.23564E+00         6.26878E-01         1.60876E+00
+          2.48183E-02         1.95537E-02        -3.09800E-02         1.55908E+00         1.44792E+00         1.55939E+00         2.24092E+00         1.00000E+00         2.79294E-10         2.24092E+00         6.35899E-01         1.60502E+00
+          2.48183E-02         1.97235E-02        -3.11896E-02         1.55908E+00         1.45859E+00         1.55939E+00         2.24505E+00         1.00000E+00         2.83315E-10         2.24505E+00         6.44311E-01         1.60074E+00
+          2.48183E-02         1.98933E-02        -3.14009E-02         1.55907E+00         1.46926E+00         1.55939E+00         2.24798E+00         1.00000E+00         2.86150E-10         2.24798E+00         6.52080E-01         1.59590E+00
+          2.48183E-02         2.00632E-02        -3.16141E-02         1.55907E+00         1.47993E+00         1.55939E+00         2.24967E+00         1.00000E+00         2.87690E-10         2.24967E+00         6.59175E-01         1.59049E+00
+          2.48183E-02         2.02330E-02        -3.18290E-02         1.55906E+00         1.49060E+00         1.55939E+00         2.25009E+00         1.00000E+00         2.87825E-10         2.25009E+00         6.65567E-01         1.58452E+00
+          2.48183E-02         2.04028E-02        -3.20458E-02         1.55906E+00         1.50127E+00         1.55939E+00         2.24920E+00         1.00000E+00         2.86444E-10         2.24920E+00         6.71230E-01         1.57797E+00
+          2.48183E-02         2.05726E-02        -3.22644E-02         1.55905E+00         1.51194E+00         1.55939E+00         2.24700E+00         1.00000E+00         2.83439E-10         2.24700E+00         6.76143E-01         1.57086E+00
+          2.48183E-02         2.07425E-02        -3.24848E-02         1.55905E+00         1.52261E+00         1.55938E+00         2.24346E+00         1.00000E+00         2.78700E-10         2.24346E+00         6.80285E-01         1.56318E+00
+          2.48183E-02         2.09123E-02        -3.27070E-02         1.55904E+00         1.53328E+00         1.55938E+00         2.23858E+00         1.00000E+00         2.72121E-10         2.23858E+00         6.83641E-01         1.55494E+00
+          2.48183E-02         2.10821E-02        -3.29311E-02         1.55904E+00         1.54395E+00         1.55938E+00         2.23237E+00         1.00000E+00         2.63601E-10         2.23237E+00         6.86198E-01         1.54617E+00
+          2.48183E-02         2.12520E-02        -3.31569E-02         1.55903E+00         1.55462E+00         1.55938E+00         2.22482E+00         1.00000E+00         2.53043E-10         2.22482E+00         6.87946E-01         1.53687E+00
+          2.48183E-02         2.14218E-02        -3.33846E-02         1.55902E+00         1.56529E+00         1.55938E+00         2.21594E+00         1.00000E+00         2.40359E-10         2.21594E+00         6.88878E-01         1.52706E+00
+          2.48183E-02         2.15916E-02        -3.36140E-02         1.55902E+00         1.57596E+00         1.55938E+00         2.20574E+00         1.00000E+00         2.25472E-10         2.20574E+00         6.88991E-01         1.51675E+00
+          2.48183E-02         2.17614E-02        -3.38453E-02         1.55901E+00         1.58664E+00         1.55938E+00         2.19425E+00         1.00000E+00         2.08324E-10         2.19425E+00         6.88284E-01         1.50596E+00
+          2.48183E-02         2.19313E-02        -3.40784E-02         1.55901E+00         1.59731E+00         1.55938E+00         2.18148E+00         1.00000E+00         1.88886E-10         2.18148E+00         6.86759E-01         1.49472E+00
+          2.48183E-02         2.21011E-02        -3.43133E-02         1.55900E+00         1.60798E+00         1.55938E+00         2.16746E+00         1.00000E+00         1.67180E-10         2.16746E+00         6.84422E-01         1.48304E+00
+          2.48183E-02         2.22709E-02        -3.45500E-02         1.55899E+00         1.61865E+00         1.55938E+00         2.15222E+00         1.00000E+00         1.43329E-10         2.15222E+00         6.81279E-01         1.47094E+00
+          2.48183E-02         2.24407E-02        -3.47886E-02         1.55899E+00         1.62932E+00         1.55938E+00         2.13578E+00         1.00000E+00         1.17681E-10         2.13578E+00         6.77343E-01         1.45843E+00
+          2.48183E-02         2.26106E-02        -3.50289E-02         1.55898E+00         1.63999E+00         1.55938E+00         2.11817E+00         1.00000E+00         9.11809E-11         2.11817E+00         6.72625E-01         1.44555E+00
+          2.48183E-02         2.27804E-02        -3.52711E-02         1.55898E+00         1.65066E+00         1.55938E+00         2.09944E+00         1.00000E+00         6.66885E-11         2.09944E+00         6.67143E-01         1.43230E+00
+          2.48183E-02         2.29502E-02        -3.55151E-02         1.55897E+00         1.66133E+00         1.55938E+00         2.07962E+00         1.00000E+00         5.30738E-11         2.07962E+00         6.60913E-01         1.41871E+00
+          2.48183E-02         2.31201E-02        -3.57609E-02         1.55896E+00         1.67200E+00         1.55937E+00         2.05875E+00         1.00000E+00         6.36184E-11         2.05875E+00         6.53956E-01         1.40479E+00
+          2.48183E-02         2.32899E-02        -3.60085E-02         1.55896E+00         1.68267E+00         1.55937E+00         2.03686E+00         1.00000E+00         9.38989E-11         2.03686E+00         6.46296E-01         1.39056E+00
+          2.48183E-02         2.34597E-02        -3.62579E-02         1.55895E+00         1.69334E+00         1.55937E+00         2.01399E+00         1.00000E+00         1.33612E-10         2.01399E+00         6.37956E-01         1.37604E+00
+          2.48183E-02         2.36295E-02        -3.65091E-02         1.55895E+00         1.70401E+00         1.55937E+00         1.99020E+00         1.00000E+00         1.78660E-10         1.99020E+00         6.28963E-01         1.36124E+00
+          2.48183E-02         2.37994E-02        -3.67621E-02         1.55894E+00         1.71468E+00         1.55937E+00         1.96552E+00         1.00000E+00         2.27632E-10         1.96552E+00         6.19345E-01         1.34618E+00
+          2.48183E-02         2.39692E-02        -3.70170E-02         1.55893E+00         1.72535E+00         1.55937E+00         1.94000E+00         1.00000E+00         2.79932E-10         1.94000E+00         6.09133E-01         1.33087E+00
+          2.48183E-02         2.41390E-02        -3.72737E-02         1.55893E+00         1.73602E+00         1.55937E+00         1.91368E+00         1.00000E+00         3.35232E-10         1.91368E+00         5.98356E-01         1.31532E+00
+          2.48183E-02         2.43088E-02        -3.75321E-02         1.55892E+00         1.74669E+00         1.55937E+00         1.88661E+00         1.00000E+00         3.93303E-10         1.88661E+00         5.87049E-01         1.29956E+00
+          2.48183E-02         2.44787E-02        -3.77924E-02         1.55891E+00         1.75736E+00         1.55937E+00         1.85883E+00         1.00000E+00         4.53954E-10         1.85883E+00         5.75245E-01         1.28359E+00
+          2.48183E-02         2.46485E-02        -3.80545E-02         1.55891E+00         1.76804E+00         1.55937E+00         1.83040E+00         1.00000E+00         5.16995E-10         1.83040E+00         5.62978E-01         1.26742E+00
+          2.48183E-02         2.48183E-02        -3.83185E-02         1.55890E+00         1.77871E+00         1.55937E+00         1.80136E+00         1.00000E+00         5.82233E-10         1.80136E+00         5.50284E-01         1.25107E+00
+          2.48183E-02         2.49882E-02        -3.85842E-02         1.55889E+00         1.78938E+00         1.55937E+00         1.77175E+00         1.00000E+00         6.49459E-10         1.77175E+00         5.37200E-01         1.23455E+00
+          2.48183E-02         2.51580E-02        -3.88517E-02         1.55889E+00         1.80005E+00         1.55937E+00         1.74163E+00         1.00000E+00         7.18447E-10         1.74163E+00         5.23762E-01         1.21787E+00
+          2.48183E-02         2.53278E-02        -3.91211E-02         1.55888E+00         1.81072E+00         1.55937E+00         1.71105E+00         1.00000E+00         7.88947E-10         1.71105E+00         5.10008E-01         1.20104E+00
+          2.48183E-02         2.54976E-02        -3.93923E-02         1.55887E+00         1.82139E+00         1.55937E+00         1.68005E+00         1.00000E+00         8.60691E-10         1.68005E+00         4.95976E-01         1.18407E+00
+          2.48183E-02         2.56675E-02        -3.96652E-02         1.55887E+00         1.83206E+00         1.55937E+00         1.64868E+00         1.00000E+00         9.33383E-10         1.64868E+00         4.81703E-01         1.16698E+00
+          2.48183E-02         2.58373E-02        -3.99400E-02         1.55886E+00         1.84273E+00         1.55937E+00         1.61700E+00         1.00000E+00         1.00671E-09         1.61700E+00         4.67226E-01         1.14977E+00
+          2.48183E-02         2.60071E-02        -4.02167E-02         1.55885E+00         1.85340E+00         1.55937E+00         1.58504E+00         1.00000E+00         1.08032E-09         1.58504E+00         4.52584E-01         1.13246E+00
+          2.48183E-02         2.61769E-02        -4.04951E-02         1.55885E+00         1.86407E+00         1.55937E+00         1.55288E+00         1.00000E+00         1.15385E-09         1.55288E+00         4.37813E-01         1.11506E+00
+          2.49882E-02         8.72665E-04        -1.92605E-02         1.57005E+00         2.74155E-01         1.57017E+00         5.50263E+01         1.00000E+00         6.84775E-11         5.50263E+01         3.20351E+00         5.18228E+01
+          2.49882E-02         1.04249E-03        -1.92708E-02         1.57005E+00         2.84826E-01         1.57017E+00         5.40503E+01         1.00000E+00         6.35002E-11         5.40503E+01         3.17413E+00         5.08762E+01
+          2.49882E-02         1.21232E-03        -1.92828E-02         1.57005E+00         2.95496E-01         1.57017E+00         5.30541E+01         1.00000E+00         5.86425E-11         5.30541E+01         3.14362E+00         4.99105E+01
+          2.49882E-02         1.38215E-03        -1.92966E-02         1.57005E+00         3.06167E-01         1.57017E+00         5.20391E+01         1.00000E+00         5.39233E-11         5.20391E+01         3.11198E+00         4.89272E+01
+          2.49882E-02         1.55197E-03        -1.93123E-02         1.57005E+00         3.16838E-01         1.57017E+00         5.10071E+01         1.00000E+00         4.93599E-11         5.10071E+01         3.07923E+00         4.79279E+01
+          2.49882E-02         1.72180E-03        -1.93297E-02         1.57005E+00         3.27508E-01         1.57017E+00         4.99597E+01         1.00000E+00         4.49677E-11         4.99597E+01         3.04538E+00         4.69143E+01
+          2.49882E-02         1.89163E-03        -1.93490E-02         1.57005E+00         3.38179E-01         1.57017E+00         4.88985E+01         1.00000E+00         4.07608E-11         4.88985E+01         3.01043E+00         4.58881E+01
+          2.49882E-02         2.06146E-03        -1.93701E-02         1.57005E+00         3.48849E-01         1.57017E+00         4.78252E+01         1.00000E+00         3.67512E-11         4.78252E+01         2.97441E+00         4.48508E+01
+          2.49882E-02         2.23128E-03        -1.93930E-02         1.57005E+00         3.59520E-01         1.57017E+00         4.67415E+01         1.00000E+00         3.29491E-11         4.67415E+01         2.93732E+00         4.38041E+01
+          2.49882E-02         2.40111E-03        -1.94177E-02         1.57005E+00         3.70190E-01         1.57017E+00         4.56489E+01         1.00000E+00         2.93628E-11         4.56489E+01         2.89918E+00         4.27497E+01
+          2.49882E-02         2.57094E-03        -1.94442E-02         1.57005E+00         3.80861E-01         1.57017E+00         4.45491E+01         1.00000E+00         2.59989E-11         4.45491E+01         2.86003E+00         4.16890E+01
+          2.49882E-02         2.74077E-03        -1.94725E-02         1.57005E+00         3.91532E-01         1.57017E+00         4.34437E+01         1.00000E+00         2.28617E-11         4.34437E+01         2.81987E+00         4.06238E+01
+          2.49882E-02         2.91059E-03        -1.95027E-02         1.57005E+00         4.02202E-01         1.57017E+00         4.23343E+01         1.00000E+00         1.99538E-11         4.23343E+01         2.77873E+00         3.95556E+01
+          2.49882E-02         3.08042E-03        -1.95346E-02         1.57004E+00         4.12873E-01         1.57017E+00         4.12225E+01         1.00000E+00         1.72758E-11         4.12225E+01         2.73664E+00         3.84858E+01
+          2.49882E-02         3.25025E-03        -1.95684E-02         1.57004E+00         4.23543E-01         1.57017E+00         4.01098E+01         1.00000E+00         1.48263E-11         4.01098E+01         2.69362E+00         3.74162E+01
+          2.49882E-02         3.42008E-03        -1.96040E-02         1.57004E+00         4.34214E-01         1.57017E+00         3.89978E+01         1.00000E+00         1.26020E-11         3.89978E+01         2.64972E+00         3.63481E+01
+          2.49882E-02         3.58990E-03        -1.96414E-02         1.57004E+00         4.44884E-01         1.57016E+00         3.78879E+01         1.00000E+00         1.05975E-11         3.78879E+01         2.60495E+00         3.52829E+01
+          2.49882E-02         3.75973E-03        -1.96806E-02         1.57004E+00         4.55555E-01         1.57016E+00         3.67816E+01         1.00000E+00         8.80529E-12         3.67816E+01         2.55937E+00         3.42222E+01
+          2.49882E-02         3.92956E-03        -1.97216E-02         1.57004E+00         4.66225E-01         1.57016E+00         3.56803E+01         1.00000E+00         7.21589E-12         3.56803E+01         2.51299E+00         3.31673E+01
+          2.49882E-02         4.09939E-03        -1.97644E-02         1.57004E+00         4.76896E-01         1.57016E+00         3.45854E+01         1.00000E+00         5.81742E-12         3.45854E+01         2.46587E+00         3.21195E+01
+          2.49882E-02         4.26921E-03        -1.98090E-02         1.57004E+00         4.87567E-01         1.57016E+00         3.34982E+01         1.00000E+00         4.59563E-12         3.34982E+01         2.41805E+00         3.10801E+01
+          2.49882E-02         4.43904E-03        -1.98555E-02         1.57004E+00         4.98237E-01         1.57016E+00         3.24200E+01         1.00000E+00         3.53375E-12         3.24200E+01         2.36957E+00         3.00504E+01
+          2.49882E-02         4.60887E-03        -1.99037E-02         1.57004E+00         5.08908E-01         1.57016E+00         3.13521E+01         1.00000E+00         2.61251E-12         3.13521E+01         2.32047E+00         2.90316E+01
+          2.49882E-02         4.77869E-03        -1.99538E-02         1.57003E+00         5.19578E-01         1.57016E+00         3.02956E+01         1.00000E+00         1.81042E-12         3.02956E+01         2.27081E+00         2.80248E+01
+          2.49882E-02         4.94852E-03        -2.00057E-02         1.57003E+00         5.30249E-01         1.57016E+00         2.92517E+01         1.00000E+00         1.10494E-12         2.92517E+01         2.22064E+00         2.70310E+01
+          2.49882E-02         5.11835E-03        -2.00594E-02         1.57003E+00         5.40919E-01         1.57016E+00         2.82214E+01         1.00000E+00         4.79181E-13         2.82214E+01         2.17000E+00         2.60514E+01
+          2.49882E-02         5.28818E-03        -2.01149E-02         1.57003E+00         5.51590E-01         1.57016E+00         2.72059E+01         1.00000E+00         2.07560E-13         2.72059E+01         2.11896E+00         2.50869E+01
+          2.49882E-02         5.45800E-03        -2.01722E-02         1.57003E+00         5.62261E-01         1.57016E+00         2.62061E+01         1.00000E+00         7.30122E-13         2.62061E+01         2.06757E+00         2.41385E+01
+          2.49882E-02         5.62783E-03        -2.02313E-02         1.57003E+00         5.72931E-01         1.57016E+00         2.52228E+01         1.00000E+00         1.29382E-12         2.52228E+01         2.01588E+00         2.32069E+01
+          2.49882E-02         5.79766E-03        -2.02923E-02         1.57003E+00         5.83602E-01         1.57016E+00         2.42571E+01         1.00000E+00         1.87503E-12         2.42571E+01         1.96396E+00         2.22931E+01
+          2.49882E-02         5.96749E-03        -2.03550E-02         1.57002E+00         5.94272E-01         1.57016E+00         2.33096E+01         1.00000E+00         2.48210E-12         2.33096E+01         1.91186E+00         2.13977E+01
+          2.49882E-02         6.13731E-03        -2.04196E-02         1.57002E+00         6.04943E-01         1.57016E+00         2.23811E+01         1.00000E+00         3.12159E-12         2.23811E+01         1.85965E+00         2.05215E+01
+          2.49882E-02         6.30714E-03        -2.04860E-02         1.57002E+00         6.15613E-01         1.57015E+00         2.14724E+01         1.00000E+00         3.79722E-12         2.14724E+01         1.80739E+00         1.96650E+01
+          2.49882E-02         6.47697E-03        -2.05542E-02         1.57002E+00         6.26284E-01         1.57015E+00         2.05841E+01         1.00000E+00         4.51025E-12         2.05841E+01         1.75515E+00         1.88289E+01
+          2.49882E-02         6.64680E-03        -2.06242E-02         1.57002E+00         6.36955E-01         1.57015E+00         1.97167E+01         1.00000E+00         5.26021E-12         1.97167E+01         1.70299E+00         1.80137E+01
+          2.49882E-02         6.81662E-03        -2.06960E-02         1.57002E+00         6.47625E-01         1.57015E+00         1.88707E+01         1.00000E+00         6.04550E-12         1.88707E+01         1.65097E+00         1.72197E+01
+          2.49882E-02         6.98645E-03        -2.07696E-02         1.57001E+00         6.58296E-01         1.57015E+00         1.80466E+01         1.00000E+00         6.86388E-12         1.80466E+01         1.59916E+00         1.64474E+01
+          2.49882E-02         7.15628E-03        -2.08450E-02         1.57001E+00         6.68966E-01         1.57015E+00         1.72448E+01         1.00000E+00         7.71283E-12         1.72448E+01         1.54763E+00         1.56972E+01
+          2.49882E-02         7.32611E-03        -2.09223E-02         1.57001E+00         6.79637E-01         1.57015E+00         1.64656E+01         1.00000E+00         8.58974E-12         1.64656E+01         1.49644E+00         1.49692E+01
+          2.49882E-02         7.49593E-03        -2.10013E-02         1.57001E+00         6.90307E-01         1.57015E+00         1.57094E+01         1.00000E+00         9.49211E-12         1.57094E+01         1.44566E+00         1.42637E+01
+          2.49882E-02         7.66576E-03        -2.10822E-02         1.57001E+00         7.00978E-01         1.57015E+00         1.49763E+01         1.00000E+00         1.04176E-11         1.49763E+01         1.39536E+00         1.35810E+01
+          2.49882E-02         7.83559E-03        -2.11649E-02         1.57000E+00         7.11649E-01         1.57015E+00         1.42665E+01         1.00000E+00         1.13638E-11         1.42665E+01         1.34559E+00         1.29210E+01
+          2.49882E-02         8.00542E-03        -2.12494E-02         1.57000E+00         7.22319E-01         1.57015E+00         1.35802E+01         1.00000E+00         1.23287E-11         1.35802E+01         1.29644E+00         1.22838E+01
+          2.49882E-02         8.17524E-03        -2.13357E-02         1.57000E+00         7.32990E-01         1.57014E+00         1.29174E+01         1.00000E+00         1.33099E-11         1.29174E+01         1.24795E+00         1.16695E+01
+          2.49882E-02         8.34507E-03        -2.14238E-02         1.57000E+00         7.43660E-01         1.57014E+00         1.22781E+01         1.00000E+00         1.43051E-11         1.22781E+01         1.20021E+00         1.10779E+01
+          2.49882E-02         8.51490E-03        -2.15137E-02         1.57000E+00         7.54331E-01         1.57014E+00         1.16623E+01         1.00000E+00         1.53116E-11         1.16623E+01         1.15325E+00         1.05091E+01
+          2.49882E-02         8.68473E-03        -2.16055E-02         1.56999E+00         7.65001E-01         1.57014E+00         1.10700E+01         1.00000E+00         1.63263E-11         1.10700E+01         1.10716E+00         9.96281E+00
+          2.49882E-02         8.85455E-03        -2.16990E-02         1.56999E+00         7.75672E-01         1.57014E+00         1.05009E+01         1.00000E+00         1.73455E-11         1.05009E+01         1.06198E+00         9.43892E+00
+          2.49882E-02         9.02438E-03        -2.17944E-02         1.56999E+00         7.86343E-01         1.57014E+00         9.95495E+00         1.00000E+00         1.83651E-11         9.95495E+00         1.01778E+00         8.93718E+00
+          2.49882E-02         9.19421E-03        -2.18915E-02         1.56999E+00         7.97013E-01         1.57014E+00         9.43193E+00         1.00000E+00         1.93800E-11         9.43193E+00         9.74603E-01         8.45733E+00
+          2.49882E-02         9.36403E-03        -2.19905E-02         1.56998E+00         8.07684E-01         1.57014E+00         8.93158E+00         1.00000E+00         2.03843E-11         8.93158E+00         9.32515E-01         7.99907E+00
+          2.49882E-02         9.53386E-03        -2.20913E-02         1.56998E+00         8.18354E-01         1.57014E+00         8.45362E+00         1.00000E+00         2.13715E-11         8.45362E+00         8.91562E-01         7.56206E+00
+          2.49882E-02         9.70369E-03        -2.21939E-02         1.56998E+00         8.29025E-01         1.57014E+00         7.99773E+00         1.00000E+00         2.23338E-11         7.99773E+00         8.51795E-01         7.14594E+00
+          2.49882E-02         9.87352E-03        -2.22984E-02         1.56998E+00         8.39695E-01         1.57013E+00         7.56355E+00         1.00000E+00         2.32628E-11         7.56355E+00         8.13259E-01         6.75029E+00
+          2.49882E-02         1.00433E-02        -2.24046E-02         1.56997E+00         8.50366E-01         1.57013E+00         7.15069E+00         1.00000E+00         2.41490E-11         7.15069E+00         7.75999E-01         6.37469E+00
+          2.49882E-02         1.02132E-02        -2.25126E-02         1.56997E+00         8.61037E-01         1.57013E+00         6.75874E+00         1.00000E+00         2.49823E-11         6.75874E+00         7.40055E-01         6.01869E+00
+          2.49882E-02         1.03830E-02        -2.26225E-02         1.56997E+00         8.71707E-01         1.57013E+00         6.38727E+00         1.00000E+00         2.57513E-11         6.38727E+00         7.05466E-01         5.68180E+00
+          2.49882E-02         1.05528E-02        -2.27342E-02         1.56996E+00         8.82378E-01         1.57013E+00         6.03579E+00         1.00000E+00         2.64444E-11         6.03579E+00         6.72266E-01         5.36353E+00
+          2.49882E-02         1.07227E-02        -2.28477E-02         1.56996E+00         8.93048E-01         1.57013E+00         5.70383E+00         1.00000E+00         2.70489E-11         5.70383E+00         6.40488E-01         5.06334E+00
+          2.49882E-02         1.08925E-02        -2.29630E-02         1.56996E+00         9.03719E-01         1.57013E+00         5.39087E+00         1.00000E+00         2.75516E-11         5.39087E+00         6.10159E-01         4.78071E+00
+          2.49882E-02         1.10623E-02        -2.30801E-02         1.56996E+00         9.14389E-01         1.57013E+00         5.09638E+00         1.00000E+00         2.79389E-11         5.09638E+00         5.81305E-01         4.51508E+00
+          2.49882E-02         1.12321E-02        -2.31990E-02         1.56995E+00         9.25060E-01         1.57012E+00         4.81983E+00         1.00000E+00         2.81967E-11         4.81983E+00         5.53948E-01         4.26588E+00
+          2.49882E-02         1.14020E-02        -2.33197E-02         1.56995E+00         9.35731E-01         1.57012E+00         4.56065E+00         1.00000E+00         2.83104E-11         4.56065E+00         5.28104E-01         4.03255E+00
+          2.49882E-02         1.15718E-02        -2.34422E-02         1.56995E+00         9.46401E-01         1.57012E+00         4.31828E+00         1.00000E+00         2.82654E-11         4.31828E+00         5.03789E-01         3.81449E+00
+          2.49882E-02         1.17416E-02        -2.35666E-02         1.56994E+00         9.57072E-01         1.57012E+00         4.09213E+00         1.00000E+00         2.80469E-11         4.09213E+00         4.81013E-01         3.61112E+00
+          2.49882E-02         1.19114E-02        -2.36928E-02         1.56994E+00         9.67742E-01         1.57012E+00         3.88162E+00         1.00000E+00         2.76401E-11         3.88162E+00         4.59783E-01         3.42183E+00
+          2.49882E-02         1.20813E-02        -2.38207E-02         1.56994E+00         9.78413E-01         1.57012E+00         3.68615E+00         1.00000E+00         2.70301E-11         3.68615E+00         4.40101E-01         3.24605E+00
+          2.49882E-02         1.22511E-02        -2.39505E-02         1.56993E+00         9.89083E-01         1.57012E+00         3.50513E+00         1.00000E+00         2.62023E-11         3.50513E+00         4.21968E-01         3.08316E+00
+          2.49882E-02         1.24209E-02        -2.40821E-02         1.56993E+00         9.99754E-01         1.57012E+00         3.33795E+00         1.00000E+00         2.51426E-11         3.33795E+00         4.05379E-01         2.93257E+00
+          2.49882E-02         1.25908E-02        -2.42155E-02         1.56993E+00         1.01042E+00         1.57011E+00         3.18403E+00         1.00000E+00         2.38369E-11         3.18403E+00         3.90326E-01         2.79370E+00
+          2.49882E-02         1.27606E-02        -2.43508E-02         1.56992E+00         1.02110E+00         1.57011E+00         3.04275E+00         1.00000E+00         2.22718E-11         3.04275E+00         3.76796E-01         2.66595E+00
+          2.49882E-02         1.29304E-02        -2.44878E-02         1.56992E+00         1.03177E+00         1.57011E+00         2.91352E+00         1.00000E+00         2.04346E-11         2.91352E+00         3.64774E-01         2.54875E+00
+          2.49882E-02         1.31002E-02        -2.46267E-02         1.56992E+00         1.04244E+00         1.57011E+00         2.79576E+00         1.00000E+00         1.83134E-11         2.79576E+00         3.54242E-01         2.44151E+00
+          2.49882E-02         1.32701E-02        -2.47673E-02         1.56991E+00         1.05311E+00         1.57011E+00         2.68886E+00         1.00000E+00         1.58974E-11         2.68886E+00         3.45176E-01         2.34369E+00
+          2.49882E-02         1.34399E-02        -2.49098E-02         1.56991E+00         1.06378E+00         1.57011E+00         2.59226E+00         1.00000E+00         1.31773E-11         2.59226E+00         3.37550E-01         2.25471E+00
+          2.49882E-02         1.36097E-02        -2.50541E-02         1.56991E+00         1.07445E+00         1.57011E+00         2.50538E+00         1.00000E+00         1.01473E-11         2.50538E+00         3.31334E-01         2.17405E+00
+          2.49882E-02         1.37795E-02        -2.52002E-02         1.56990E+00         1.08512E+00         1.57011E+00         2.42767E+00         1.00000E+00         6.81076E-12         2.42767E+00         3.26496E-01         2.10117E+00
+          2.49882E-02         1.39494E-02        -2.53481E-02         1.56990E+00         1.09579E+00         1.57010E+00         2.35856E+00         1.00000E+00         3.23208E-12         2.35856E+00         3.22999E-01         2.03556E+00
+          2.49882E-02         1.41192E-02        -2.54978E-02         1.56990E+00         1.10646E+00         1.57010E+00         2.29753E+00         1.00000E+00         1.60344E-12         2.29753E+00         3.20804E-01         1.97672E+00
+          2.49882E-02         1.42890E-02        -2.56493E-02         1.56989E+00         1.11713E+00         1.57010E+00         2.24403E+00         1.00000E+00         5.57233E-12         2.24403E+00         3.19869E-01         1.92416E+00
+          2.49882E-02         1.44589E-02        -2.58027E-02         1.56989E+00         1.12780E+00         1.57010E+00         2.19757E+00         1.00000E+00         1.02477E-11         2.19757E+00         3.20149E-01         1.87742E+00
+          2.49882E-02         1.46287E-02        -2.59578E-02         1.56988E+00         1.13847E+00         1.57010E+00         2.15764E+00         1.00000E+00         1.53098E-11         2.15764E+00         3.21596E-01         1.83604E+00
+          2.49882E-02         1.47985E-02        -2.61148E-02         1.56988E+00         1.14914E+00         1.57010E+00         2.12375E+00         1.00000E+00         2.07318E-11         2.12375E+00         3.24160E-01         1.79959E+00
+          2.49882E-02         1.49683E-02        -2.62736E-02         1.56988E+00         1.15981E+00         1.57010E+00         2.09543E+00         1.00000E+00         2.65055E-11         2.09543E+00         3.27790E-01         1.76764E+00
+          2.49882E-02         1.51382E-02        -2.64342E-02         1.56987E+00         1.17048E+00         1.57009E+00         2.07224E+00         1.00000E+00         3.26242E-11         2.07224E+00         3.32429E-01         1.73981E+00
+          2.49882E-02         1.53080E-02        -2.65966E-02         1.56987E+00         1.18115E+00         1.57009E+00         2.05374E+00         1.00000E+00         3.90807E-11         2.05374E+00         3.38022E-01         1.71571E+00
+          2.49882E-02         1.54778E-02        -2.67608E-02         1.56986E+00         1.19182E+00         1.57009E+00         2.03949E+00         1.00000E+00         4.58659E-11         2.03949E+00         3.44511E-01         1.69498E+00
+          2.49882E-02         1.56476E-02        -2.69268E-02         1.56986E+00         1.20249E+00         1.57009E+00         2.02911E+00         1.00000E+00         5.29685E-11         2.02911E+00         3.51836E-01         1.67727E+00
+          2.49882E-02         1.58175E-02        -2.70947E-02         1.56986E+00         1.21317E+00         1.57009E+00         2.02220E+00         1.00000E+00         6.03748E-11         2.02220E+00         3.59935E-01         1.66226E+00
+          2.49882E-02         1.59873E-02        -2.72643E-02         1.56985E+00         1.22384E+00         1.57009E+00         2.01839E+00         1.00000E+00         6.80686E-11         2.01839E+00         3.68746E-01         1.64965E+00
+          2.49882E-02         1.61571E-02        -2.74358E-02         1.56985E+00         1.23451E+00         1.57009E+00         2.01733E+00         1.00000E+00         7.60306E-11         2.01733E+00         3.78205E-01         1.63913E+00
+          2.49882E-02         1.63270E-02        -2.76091E-02         1.56984E+00         1.24518E+00         1.57009E+00         2.01870E+00         1.00000E+00         8.42389E-11         2.01870E+00         3.88250E-01         1.63045E+00
+          2.49882E-02         1.64968E-02        -2.77842E-02         1.56984E+00         1.25585E+00         1.57008E+00         2.02215E+00         1.00000E+00         9.26685E-11         2.02215E+00         3.98814E-01         1.62334E+00
+          2.49882E-02         1.66666E-02        -2.79611E-02         1.56983E+00         1.26652E+00         1.57008E+00         2.02741E+00         1.00000E+00         1.01291E-10         2.02741E+00         4.09833E-01         1.61758E+00
+          2.49882E-02         1.68364E-02        -2.81398E-02         1.56983E+00         1.27719E+00         1.57008E+00         2.03418E+00         1.00000E+00         1.10075E-10         2.03418E+00         4.21241E-01         1.61294E+00
+          2.49882E-02         1.70063E-02        -2.83203E-02         1.56983E+00         1.28786E+00         1.57008E+00         2.04220E+00         1.00000E+00         1.18986E-10         2.04220E+00         4.32975E-01         1.60923E+00
+          2.49882E-02         1.71761E-02        -2.85027E-02         1.56982E+00         1.29853E+00         1.57008E+00         2.05122E+00         1.00000E+00         1.27985E-10         2.05122E+00         4.44967E-01         1.60625E+00
+          2.49882E-02         1.73459E-02        -2.86868E-02         1.56982E+00         1.30920E+00         1.57008E+00         2.06100E+00         1.00000E+00         1.37030E-10         2.06100E+00         4.57156E-01         1.60384E+00
+          2.49882E-02         1.75158E-02        -2.88728E-02         1.56981E+00         1.31987E+00         1.57008E+00         2.07132E+00         1.00000E+00         1.46076E-10         2.07132E+00         4.69475E-01         1.60185E+00
+          2.49882E-02         1.76856E-02        -2.90606E-02         1.56981E+00         1.33054E+00         1.57008E+00         2.08199E+00         1.00000E+00         1.55074E-10         2.08199E+00         4.81864E-01         1.60012E+00
+          2.49882E-02         1.78554E-02        -2.92502E-02         1.56980E+00         1.34121E+00         1.57007E+00         2.09281E+00         1.00000E+00         1.63970E-10         2.09281E+00         4.94260E-01         1.59855E+00
+          2.49882E-02         1.80252E-02        -2.94416E-02         1.56980E+00         1.35188E+00         1.57007E+00         2.10361E+00         1.00000E+00         1.72708E-10         2.10361E+00         5.06603E-01         1.59701E+00
+          2.49882E-02         1.81951E-02        -2.96348E-02         1.56979E+00         1.36255E+00         1.57007E+00         2.11423E+00         1.00000E+00         1.81227E-10         2.11423E+00         5.18833E-01         1.59540E+00
+          2.49882E-02         1.83649E-02        -2.98298E-02         1.56979E+00         1.37322E+00         1.57007E+00         2.12452E+00         1.00000E+00         1.89463E-10         2.12452E+00         5.30893E-01         1.59363E+00
+          2.49882E-02         1.85347E-02        -3.00267E-02         1.56978E+00         1.38389E+00         1.57007E+00         2.13436E+00         1.00000E+00         1.97349E-10         2.13436E+00         5.42728E-01         1.59163E+00
+          2.49882E-02         1.87045E-02        -3.02253E-02         1.56978E+00         1.39457E+00         1.57007E+00         2.14362E+00         1.00000E+00         2.04813E-10         2.14362E+00         5.54284E-01         1.58934E+00
+          2.49882E-02         1.88744E-02        -3.04258E-02         1.56977E+00         1.40524E+00         1.57007E+00         2.15220E+00         1.00000E+00         2.11781E-10         2.15220E+00         5.65508E-01         1.58669E+00
+          2.49882E-02         1.90442E-02        -3.06281E-02         1.56977E+00         1.41591E+00         1.57007E+00         2.15999E+00         1.00000E+00         2.18173E-10         2.15999E+00         5.76353E-01         1.58364E+00
+          2.49882E-02         1.92140E-02        -3.08322E-02         1.56976E+00         1.42658E+00         1.57007E+00         2.16691E+00         1.00000E+00         2.23910E-10         2.16691E+00         5.86769E-01         1.58014E+00
+          2.49882E-02         1.93839E-02        -3.10381E-02         1.56976E+00         1.43725E+00         1.57006E+00         2.17289E+00         1.00000E+00         2.28907E-10         2.17289E+00         5.96714E-01         1.57618E+00
+          2.49882E-02         1.95537E-02        -3.12458E-02         1.56975E+00         1.44792E+00         1.57006E+00         2.17786E+00         1.00000E+00         2.33077E-10         2.17786E+00         6.06144E-01         1.57172E+00
+          2.49882E-02         1.97235E-02        -3.14553E-02         1.56975E+00         1.45859E+00         1.57006E+00         2.18176E+00         1.00000E+00         2.36330E-10         2.18176E+00         6.15020E-01         1.56674E+00
+          2.49882E-02         1.98933E-02        -3.16667E-02         1.56974E+00         1.46926E+00         1.57006E+00         2.18455E+00         1.00000E+00         2.38577E-10         2.18455E+00         6.23306E-01         1.56125E+00
+          2.49882E-02         2.00632E-02        -3.18798E-02         1.56974E+00         1.47993E+00         1.57006E+00         2.18619E+00         1.00000E+00         2.39723E-10         2.18619E+00         6.30967E-01         1.55523E+00
+          2.49882E-02         2.02330E-02        -3.20948E-02         1.56973E+00         1.49060E+00         1.57006E+00         2.18665E+00         1.00000E+00         2.39674E-10         2.18665E+00         6.37973E-01         1.54867E+00
+          2.49882E-02         2.04028E-02        -3.23116E-02         1.56973E+00         1.50127E+00         1.57006E+00         2.18589E+00         1.00000E+00         2.38335E-10         2.18589E+00         6.44296E-01         1.54159E+00
+          2.49882E-02         2.05726E-02        -3.25302E-02         1.56972E+00         1.51194E+00         1.57006E+00         2.18391E+00         1.00000E+00         2.35610E-10         2.18391E+00         6.49911E-01         1.53400E+00
+          2.49882E-02         2.07425E-02        -3.27506E-02         1.56971E+00         1.52261E+00         1.57006E+00         2.18069E+00         1.00000E+00         2.31405E-10         2.18069E+00         6.54795E-01         1.52589E+00
+          2.49882E-02         2.09123E-02        -3.29728E-02         1.56971E+00         1.53328E+00         1.57006E+00         2.17622E+00         1.00000E+00         2.25623E-10         2.17622E+00         6.58930E-01         1.51729E+00
+          2.49882E-02         2.10821E-02        -3.31968E-02         1.56970E+00         1.54395E+00         1.57005E+00         2.17051E+00         1.00000E+00         2.18172E-10         2.17051E+00         6.62300E-01         1.50821E+00
+          2.49882E-02         2.12520E-02        -3.34227E-02         1.56970E+00         1.55462E+00         1.57005E+00         2.16356E+00         1.00000E+00         2.08960E-10         2.16356E+00         6.64892E-01         1.49866E+00
+          2.49882E-02         2.14218E-02        -3.36503E-02         1.56969E+00         1.56529E+00         1.57005E+00         2.15537E+00         1.00000E+00         1.97899E-10         2.15537E+00         6.66697E-01         1.48867E+00
+          2.49882E-02         2.15916E-02        -3.38798E-02         1.56969E+00         1.57596E+00         1.57005E+00         2.14596E+00         1.00000E+00         1.84902E-10         2.14596E+00         6.67707E-01         1.47826E+00
+          2.49882E-02         2.17614E-02        -3.41111E-02         1.56968E+00         1.58664E+00         1.57005E+00         2.13535E+00         1.00000E+00         1.69890E-10         2.13535E+00         6.67918E-01         1.46743E+00
+          2.49882E-02         2.19313E-02        -3.43442E-02         1.56967E+00         1.59731E+00         1.57005E+00         2.12355E+00         1.00000E+00         1.52788E-10         2.12355E+00         6.67331E-01         1.45622E+00
+          2.49882E-02         2.21011E-02        -3.45791E-02         1.56967E+00         1.60798E+00         1.57005E+00         2.11059E+00         1.00000E+00         1.33529E-10         2.11059E+00         6.65946E-01         1.44465E+00
+          2.49882E-02         2.22709E-02        -3.48158E-02         1.56966E+00         1.61865E+00         1.57005E+00         2.09650E+00         1.00000E+00         1.12056E-10         2.09650E+00         6.63768E-01         1.43273E+00
+          2.49882E-02         2.24407E-02        -3.50543E-02         1.56966E+00         1.62932E+00         1.57005E+00         2.08129E+00         1.00000E+00         8.83327E-11         2.08129E+00         6.60806E-01         1.42048E+00
+          2.49882E-02         2.26106E-02        -3.52947E-02         1.56965E+00         1.63999E+00         1.57005E+00         2.06500E+00         1.00000E+00         6.23683E-11         2.06500E+00         6.57069E-01         1.40793E+00
+          2.49882E-02         2.27804E-02        -3.55368E-02         1.56964E+00         1.65066E+00         1.57005E+00         2.04765E+00         1.00000E+00         3.43977E-11         2.04765E+00         6.52569E-01         1.39508E+00
+          2.49882E-02         2.29502E-02        -3.57808E-02         1.56964E+00         1.66133E+00         1.57005E+00         2.02930E+00         1.00000E+00         9.54022E-12         2.02930E+00         6.47323E-01         1.38197E+00
+          2.49882E-02         2.31201E-02        -3.60266E-02         1.56963E+00         1.67200E+00         1.57005E+00         2.00995E+00         1.00000E+00         3.26031E-11         2.00995E+00         6.41347E-01         1.36861E+00
+          2.49882E-02         2.32899E-02        -3.62742E-02         1.56963E+00         1.68267E+00         1.57005E+00         1.98967E+00         1.00000E+00         6.77327E-11         1.98967E+00         6.34662E-01         1.35500E+00
+          2.49882E-02         2.34597E-02        -3.65236E-02         1.56962E+00         1.69334E+00         1.57004E+00         1.96847E+00         1.00000E+00         1.05779E-10         1.96847E+00         6.27288E-01         1.34118E+00
+          2.49882E-02         2.36295E-02        -3.67748E-02         1.56961E+00         1.70401E+00         1.57004E+00         1.94640E+00         1.00000E+00         1.46359E-10         1.94640E+00         6.19251E-01         1.32714E+00
+          2.49882E-02         2.37994E-02        -3.70279E-02         1.56961E+00         1.71468E+00         1.57004E+00         1.92349E+00         1.00000E+00         1.89370E-10         1.92349E+00         6.10575E-01         1.31291E+00
+          2.49882E-02         2.39692E-02        -3.72827E-02         1.56960E+00         1.72535E+00         1.57004E+00         1.89979E+00         1.00000E+00         2.34737E-10         1.89979E+00         6.01288E-01         1.29850E+00
+          2.49882E-02         2.41390E-02        -3.75394E-02         1.56959E+00         1.73602E+00         1.57004E+00         1.87533E+00         1.00000E+00         2.82386E-10         1.87533E+00         5.91419E-01         1.28391E+00
+          2.49882E-02         2.43088E-02        -3.77979E-02         1.56959E+00         1.74669E+00         1.57004E+00         1.85016E+00         1.00000E+00         3.32228E-10         1.85016E+00         5.80999E-01         1.26916E+00
+          2.49882E-02         2.44787E-02        -3.80582E-02         1.56958E+00         1.75736E+00         1.57004E+00         1.82431E+00         1.00000E+00         3.84160E-10         1.82431E+00         5.70058E-01         1.25426E+00
+          2.49882E-02         2.46485E-02        -3.83203E-02         1.56958E+00         1.76804E+00         1.57004E+00         1.79784E+00         1.00000E+00         4.38059E-10         1.79784E+00         5.58631E-01         1.23921E+00
+          2.49882E-02         2.48183E-02        -3.85842E-02         1.56957E+00         1.77871E+00         1.57004E+00         1.77077E+00         1.00000E+00         4.93785E-10         1.77077E+00         5.46750E-01         1.22402E+00
+          2.49882E-02         2.49882E-02        -3.88499E-02         1.56956E+00         1.78938E+00         1.57004E+00         1.74315E+00         1.00000E+00         5.51178E-10         1.74315E+00         5.34451E-01         1.20870E+00
+          2.49882E-02         2.51580E-02        -3.91175E-02         1.56956E+00         1.80005E+00         1.57004E+00         1.71502E+00         1.00000E+00         6.10057E-10         1.71502E+00         5.21769E-01         1.19325E+00
+          2.49882E-02         2.53278E-02        -3.93868E-02         1.56955E+00         1.81072E+00         1.57004E+00         1.68643E+00         1.00000E+00         6.70219E-10         1.68643E+00         5.08739E-01         1.17769E+00
+          2.49882E-02         2.54976E-02        -3.96580E-02         1.56954E+00         1.82139E+00         1.57004E+00         1.65742E+00         1.00000E+00         7.31442E-10         1.65742E+00         4.95399E-01         1.16202E+00
+          2.49882E-02         2.56675E-02        -3.99310E-02         1.56953E+00         1.83206E+00         1.57004E+00         1.62802E+00         1.00000E+00         7.93479E-10         1.62802E+00         4.81784E-01         1.14624E+00
+          2.49882E-02         2.58373E-02        -4.02058E-02         1.56953E+00         1.84273E+00         1.57004E+00         1.59829E+00         1.00000E+00         8.56063E-10         1.59829E+00         4.67932E-01         1.13036E+00
+          2.49882E-02         2.60071E-02        -4.04824E-02         1.56952E+00         1.85340E+00         1.57004E+00         1.56827E+00         1.00000E+00         9.18904E-10         1.56827E+00         4.53880E-01         1.11439E+00
+          2.49882E-02         2.61769E-02        -4.07608E-02         1.56951E+00         1.86407E+00         1.57004E+00         1.53800E+00         1.00000E+00         9.81691E-10         1.53800E+00         4.39663E-01         1.09834E+00
+          2.51580E-02         8.72665E-04        -1.95282E-02         1.58072E+00         2.74155E-01         1.58084E+00         5.39062E+01         1.00000E+00         7.29311E-11         5.39062E+01         3.03646E+00         5.08697E+01
+          2.51580E-02         1.04249E-03        -1.95384E-02         1.58072E+00         2.84826E-01         1.58084E+00         5.29501E+01         1.00000E+00         6.76892E-11         5.29501E+01         3.01075E+00         4.99393E+01
+          2.51580E-02         1.21232E-03        -1.95504E-02         1.58072E+00         2.95496E-01         1.58084E+00         5.19741E+01         1.00000E+00         6.25685E-11         5.19741E+01         2.98400E+00         4.89901E+01
+          2.51580E-02         1.38215E-03        -1.95642E-02         1.58072E+00         3.06167E-01         1.58084E+00         5.09798E+01         1.00000E+00         5.75885E-11         5.09798E+01         2.95619E+00         4.80236E+01
+          2.51580E-02         1.55197E-03        -1.95799E-02         1.58072E+00         3.16838E-01         1.58084E+00         4.99688E+01         1.00000E+00         5.27674E-11         4.99688E+01         2.92734E+00         4.70415E+01
+          2.51580E-02         1.72180E-03        -1.95974E-02         1.58072E+00         3.27508E-01         1.58084E+00         4.89428E+01         1.00000E+00         4.81215E-11         4.89428E+01         2.89744E+00         4.60453E+01
+          2.51580E-02         1.89163E-03        -1.96166E-02         1.58072E+00         3.38179E-01         1.58084E+00         4.79032E+01         1.00000E+00         4.36655E-11         4.79032E+01         2.86651E+00         4.50367E+01
+          2.51580E-02         2.06146E-03        -1.96377E-02         1.58072E+00         3.48849E-01         1.58084E+00         4.68518E+01         1.00000E+00         3.94120E-11         4.68518E+01         2.83456E+00         4.40172E+01
+          2.51580E-02         2.23128E-03        -1.96606E-02         1.58072E+00         3.59520E-01         1.58084E+00         4.57901E+01         1.00000E+00         3.53719E-11         4.57901E+01         2.80158E+00         4.29885E+01
+          2.51580E-02         2.40111E-03        -1.96853E-02         1.58072E+00         3.70190E-01         1.58084E+00         4.47198E+01         1.00000E+00         3.15542E-11         4.47198E+01         2.76760E+00         4.19522E+01
+          2.51580E-02         2.57094E-03        -1.97118E-02         1.58072E+00         3.80861E-01         1.58084E+00         4.36424E+01         1.00000E+00         2.79657E-11         4.36424E+01         2.73263E+00         4.09098E+01
+          2.51580E-02         2.74077E-03        -1.97402E-02         1.58072E+00         3.91532E-01         1.58084E+00         4.25596E+01         1.00000E+00         2.46114E-11         4.25596E+01         2.69667E+00         3.98629E+01
+          2.51580E-02         2.91059E-03        -1.97703E-02         1.58072E+00         4.02202E-01         1.58084E+00         4.14728E+01         1.00000E+00         2.14943E-11         4.14728E+01         2.65976E+00         3.88131E+01
+          2.51580E-02         3.08042E-03        -1.98023E-02         1.58072E+00         4.12873E-01         1.58084E+00         4.03837E+01         1.00000E+00         1.86156E-11         4.03837E+01         2.62191E+00         3.77618E+01
+          2.51580E-02         3.25025E-03        -1.98360E-02         1.58071E+00         4.23543E-01         1.58084E+00         3.92938E+01         1.00000E+00         1.59743E-11         3.92938E+01         2.58314E+00         3.67107E+01
+          2.51580E-02         3.42008E-03        -1.98716E-02         1.58071E+00         4.34214E-01         1.58084E+00         3.82045E+01         1.00000E+00         1.35677E-11         3.82045E+01         2.54347E+00         3.56610E+01
+          2.51580E-02         3.58990E-03        -1.99090E-02         1.58071E+00         4.44884E-01         1.58084E+00         3.71173E+01         1.00000E+00         1.13913E-11         3.71173E+01         2.50294E+00         3.46144E+01
+          2.51580E-02         3.75973E-03        -1.99482E-02         1.58071E+00         4.55555E-01         1.58084E+00         3.60337E+01         1.00000E+00         9.43850E-12         3.60337E+01         2.46157E+00         3.35721E+01
+          2.51580E-02         3.92956E-03        -1.99892E-02         1.58071E+00         4.66225E-01         1.58084E+00         3.49549E+01         1.00000E+00         7.70126E-12         3.49549E+01         2.41939E+00         3.25355E+01
+          2.51580E-02         4.09939E-03        -2.00320E-02         1.58071E+00         4.76896E-01         1.58084E+00         3.38824E+01         1.00000E+00         6.16956E-12         3.38824E+01         2.37644E+00         3.15060E+01
+          2.51580E-02         4.26921E-03        -2.00767E-02         1.58071E+00         4.87567E-01         1.58084E+00         3.28175E+01         1.00000E+00         4.83167E-12         3.28175E+01         2.33275E+00         3.04848E+01
+          2.51580E-02         4.43904E-03        -2.01231E-02         1.58071E+00         4.98237E-01         1.58084E+00         3.17615E+01         1.00000E+00         3.67403E-12         3.17615E+01         2.28836E+00         2.94731E+01
+          2.51580E-02         4.60887E-03        -2.01714E-02         1.58071E+00         5.08908E-01         1.58083E+00         3.07155E+01         1.00000E+00         2.68129E-12         3.07155E+01         2.24331E+00         2.84721E+01
+          2.51580E-02         4.77869E-03        -2.02214E-02         1.58070E+00         5.19578E-01         1.58083E+00         2.96807E+01         1.00000E+00         1.83634E-12         2.96807E+01         2.19764E+00         2.74830E+01
+          2.51580E-02         4.94852E-03        -2.02733E-02         1.58070E+00         5.30249E-01         1.58083E+00         2.86582E+01         1.00000E+00         1.12078E-12         2.86582E+01         2.15140E+00         2.65068E+01
+          2.51580E-02         5.11835E-03        -2.03270E-02         1.58070E+00         5.40919E-01         1.58083E+00         2.76491E+01         1.00000E+00         5.18261E-13         2.76491E+01         2.10463E+00         2.55445E+01
+          2.51580E-02         5.28818E-03        -2.03825E-02         1.58070E+00         5.51590E-01         1.58083E+00         2.66545E+01         1.00000E+00         1.35708E-13         2.66545E+01         2.05739E+00         2.45971E+01
+          2.51580E-02         5.45800E-03        -2.04398E-02         1.58070E+00         5.62261E-01         1.58083E+00         2.56752E+01         1.00000E+00         5.10907E-13         2.56752E+01         2.00972E+00         2.36655E+01
+          2.51580E-02         5.62783E-03        -2.04990E-02         1.58070E+00         5.72931E-01         1.58083E+00         2.47122E+01         1.00000E+00         9.30348E-13         2.47122E+01         1.96167E+00         2.27506E+01
+          2.51580E-02         5.79766E-03        -2.05599E-02         1.58070E+00         5.83602E-01         1.58083E+00         2.37664E+01         1.00000E+00         1.33617E-12         2.37664E+01         1.91331E+00         2.18531E+01
+          2.51580E-02         5.96749E-03        -2.06227E-02         1.58069E+00         5.94272E-01         1.58083E+00         2.28384E+01         1.00000E+00         1.74144E-12         2.28384E+01         1.86468E+00         2.09738E+01
+          2.51580E-02         6.13731E-03        -2.06872E-02         1.58069E+00         6.04943E-01         1.58083E+00         2.19292E+01         1.00000E+00         2.15799E-12         2.19292E+01         1.81584E+00         2.01133E+01
+          2.51580E-02         6.30714E-03        -2.07536E-02         1.58069E+00         6.15613E-01         1.58083E+00         2.10392E+01         1.00000E+00         2.59400E-12         2.10392E+01         1.76685E+00         1.92723E+01
+          2.51580E-02         6.47697E-03        -2.08218E-02         1.58069E+00         6.26284E-01         1.58083E+00         2.01692E+01         1.00000E+00         3.05406E-12         2.01692E+01         1.71778E+00         1.84514E+01
+          2.51580E-02         6.64680E-03        -2.08918E-02         1.58069E+00         6.36955E-01         1.58083E+00         1.93197E+01         1.00000E+00         3.53995E-12         1.93197E+01         1.66868E+00         1.76510E+01
+          2.51580E-02         6.81662E-03        -2.09636E-02         1.58069E+00         6.47625E-01         1.58083E+00         1.84912E+01         1.00000E+00         4.05157E-12         1.84912E+01         1.61961E+00         1.68716E+01
+          2.51580E-02         6.98645E-03        -2.10372E-02         1.58068E+00         6.58296E-01         1.58082E+00         1.76842E+01         1.00000E+00         4.58775E-12         1.76842E+01         1.57064E+00         1.61135E+01
+          2.51580E-02         7.15628E-03        -2.11126E-02         1.58068E+00         6.68966E-01         1.58082E+00         1.68990E+01         1.00000E+00         5.14689E-12         1.68990E+01         1.52183E+00         1.53772E+01
+          2.51580E-02         7.32611E-03        -2.11899E-02         1.58068E+00         6.79637E-01         1.58082E+00         1.61360E+01         1.00000E+00         5.72743E-12         1.61360E+01         1.47324E+00         1.46627E+01
+          2.51580E-02         7.49593E-03        -2.12689E-02         1.58068E+00         6.90307E-01         1.58082E+00         1.53954E+01         1.00000E+00         6.32812E-12         1.53954E+01         1.42494E+00         1.39705E+01
+          2.51580E-02         7.66576E-03        -2.13498E-02         1.58068E+00         7.00978E-01         1.58082E+00         1.46775E+01         1.00000E+00         6.94816E-12         1.46775E+01         1.37700E+00         1.33006E+01
+          2.51580E-02         7.83559E-03        -2.14325E-02         1.58067E+00         7.11649E-01         1.58082E+00         1.39825E+01         1.00000E+00         7.58720E-12         1.39825E+01         1.32947E+00         1.26530E+01
+          2.51580E-02         8.00542E-03        -2.15170E-02         1.58067E+00         7.22319E-01         1.58082E+00         1.33104E+01         1.00000E+00         8.24531E-12         1.33104E+01         1.28241E+00         1.20280E+01
+          2.51580E-02         8.17524E-03        -2.16033E-02         1.58067E+00         7.32990E-01         1.58082E+00         1.26614E+01         1.00000E+00         8.92277E-12         1.26614E+01         1.23591E+00         1.14255E+01
+          2.51580E-02         8.34507E-03        -2.16914E-02         1.58067E+00         7.43660E-01         1.58082E+00         1.20354E+01         1.00000E+00         9.61993E-12         1.20354E+01         1.19000E+00         1.08454E+01
+          2.51580E-02         8.51490E-03        -2.17813E-02         1.58067E+00         7.54331E-01         1.58082E+00         1.14324E+01         1.00000E+00         1.03370E-11         1.14324E+01         1.14477E+00         1.02876E+01
+          2.51580E-02         8.68473E-03        -2.18731E-02         1.58066E+00         7.65001E-01         1.58081E+00         1.08523E+01         1.00000E+00         1.10737E-11         1.08523E+01         1.10026E+00         9.75207E+00
+          2.51580E-02         8.85455E-03        -2.19666E-02         1.58066E+00         7.75672E-01         1.58081E+00         1.02951E+01         1.00000E+00         1.18293E-11         1.02951E+01         1.05654E+00         9.23855E+00
+          2.51580E-02         9.02438E-03        -2.20620E-02         1.58066E+00         7.86343E-01         1.58081E+00         9.76048E+00         1.00000E+00         1.26022E-11         9.76048E+00         1.01366E+00         8.74682E+00
+          2.51580E-02         9.19421E-03        -2.21592E-02         1.58066E+00         7.97013E-01         1.58081E+00         9.24833E+00         1.00000E+00         1.33899E-11         9.24833E+00         9.71686E-01         8.27664E+00
+          2.51580E-02         9.36403E-03        -2.22582E-02         1.58065E+00         8.07684E-01         1.58081E+00         8.75837E+00         1.00000E+00         1.41888E-11         8.75837E+00         9.30669E-01         7.82770E+00
+          2.51580E-02         9.53386E-03        -2.23589E-02         1.58065E+00         8.18354E-01         1.58081E+00         8.29033E+00         1.00000E+00         1.49941E-11         8.29033E+00         8.90661E-01         7.39967E+00
+          2.51580E-02         9.70369E-03        -2.24616E-02         1.58065E+00         8.29025E-01         1.58081E+00         7.84389E+00         1.00000E+00         1.57999E-11         7.84389E+00         8.51714E-01         6.99217E+00
+          2.51580E-02         9.87352E-03        -2.25660E-02         1.58065E+00         8.39695E-01         1.58081E+00         7.41870E+00         1.00000E+00         1.65992E-11         7.41870E+00         8.13877E-01         6.60482E+00
+          2.51580E-02         1.00433E-02        -2.26722E-02         1.58064E+00         8.50366E-01         1.58081E+00         7.01439E+00         1.00000E+00         1.73838E-11         7.01439E+00         7.77194E-01         6.23719E+00
+          2.51580E-02         1.02132E-02        -2.27803E-02         1.58064E+00         8.61037E-01         1.58080E+00         6.63054E+00         1.00000E+00         1.81445E-11         6.63054E+00         7.41710E-01         5.88883E+00
+          2.51580E-02         1.03830E-02        -2.28901E-02         1.58064E+00         8.71707E-01         1.58080E+00         6.26672E+00         1.00000E+00         1.88709E-11         6.26672E+00         7.07466E-01         5.55925E+00
+          2.51580E-02         1.05528E-02        -2.30018E-02         1.58063E+00         8.82378E-01         1.58080E+00         5.92247E+00         1.00000E+00         1.95521E-11         5.92247E+00         6.74499E-01         5.24797E+00
+          2.51580E-02         1.07227E-02        -2.31153E-02         1.58063E+00         8.93048E-01         1.58080E+00         5.59731E+00         1.00000E+00         2.01760E-11         5.59731E+00         6.42845E-01         4.95447E+00
+          2.51580E-02         1.08925E-02        -2.32306E-02         1.58063E+00         9.03719E-01         1.58080E+00         5.29075E+00         1.00000E+00         2.07302E-11         5.29075E+00         6.12535E-01         4.67821E+00
+          2.51580E-02         1.10623E-02        -2.33477E-02         1.58063E+00         9.14389E-01         1.58080E+00         5.00226E+00         1.00000E+00         2.12017E-11         5.00226E+00         5.83599E-01         4.41866E+00
+          2.51580E-02         1.12321E-02        -2.34666E-02         1.58062E+00         9.25060E-01         1.58080E+00         4.73131E+00         1.00000E+00         2.15768E-11         4.73131E+00         5.56061E-01         4.17525E+00
+          2.51580E-02         1.14020E-02        -2.35873E-02         1.58062E+00         9.35731E-01         1.58080E+00         4.47735E+00         1.00000E+00         2.18418E-11         4.47735E+00         5.29944E-01         3.94741E+00
+          2.51580E-02         1.15718E-02        -2.37099E-02         1.58062E+00         9.46401E-01         1.58079E+00         4.23983E+00         1.00000E+00         2.19828E-11         4.23983E+00         5.05267E-01         3.73456E+00
+          2.51580E-02         1.17416E-02        -2.38342E-02         1.58061E+00         9.57072E-01         1.58079E+00         4.01817E+00         1.00000E+00         2.19856E-11         4.01817E+00         4.82044E-01         3.53612E+00
+          2.51580E-02         1.19114E-02        -2.39604E-02         1.58061E+00         9.67742E-01         1.58079E+00         3.81180E+00         1.00000E+00         2.18362E-11         3.81180E+00         4.60287E-01         3.35151E+00
+          2.51580E-02         1.20813E-02        -2.40883E-02         1.58061E+00         9.78413E-01         1.58079E+00         3.62014E+00         1.00000E+00         2.15208E-11         3.62014E+00         4.40003E-01         3.18013E+00
+          2.51580E-02         1.22511E-02        -2.42181E-02         1.58060E+00         9.89083E-01         1.58079E+00         3.44260E+00         1.00000E+00         2.10257E-11         3.44260E+00         4.21199E-01         3.02140E+00
+          2.51580E-02         1.24209E-02        -2.43497E-02         1.58060E+00         9.99754E-01         1.58079E+00         3.27859E+00         1.00000E+00         2.03376E-11         3.27859E+00         4.03873E-01         2.87472E+00
+          2.51580E-02         1.25908E-02        -2.44832E-02         1.58060E+00         1.01042E+00         1.58079E+00         3.12753E+00         1.00000E+00         1.94439E-11         3.12753E+00         3.88022E-01         2.73951E+00
+          2.51580E-02         1.27606E-02        -2.46184E-02         1.58059E+00         1.02110E+00         1.58079E+00         2.98883E+00         1.00000E+00         1.83322E-11         2.98883E+00         3.73641E-01         2.61519E+00
+          2.51580E-02         1.29304E-02        -2.47554E-02         1.58059E+00         1.03177E+00         1.58078E+00         2.86191E+00         1.00000E+00         1.69913E-11         2.86191E+00         3.60719E-01         2.50119E+00
+          2.51580E-02         1.31002E-02        -2.48943E-02         1.58059E+00         1.04244E+00         1.58078E+00         2.74618E+00         1.00000E+00         1.54108E-11         2.74618E+00         3.49242E-01         2.39694E+00
+          2.51580E-02         1.32701E-02        -2.50349E-02         1.58058E+00         1.05311E+00         1.58078E+00         2.64107E+00         1.00000E+00         1.35820E-11         2.64107E+00         3.39192E-01         2.30188E+00
+          2.51580E-02         1.34399E-02        -2.51774E-02         1.58058E+00         1.06378E+00         1.58078E+00         2.54601E+00         1.00000E+00         1.14985E-11         2.54601E+00         3.30549E-01         2.21546E+00
+          2.51580E-02         1.36097E-02        -2.53217E-02         1.58058E+00         1.07445E+00         1.58078E+00         2.46045E+00         1.00000E+00         9.15933E-12         2.46045E+00         3.23289E-01         2.13716E+00
+          2.51580E-02         1.37795E-02        -2.54678E-02         1.58057E+00         1.08512E+00         1.58078E+00         2.38383E+00         1.00000E+00         6.57847E-12         2.38383E+00         3.17383E-01         2.06645E+00
+          2.51580E-02         1.39494E-02        -2.56157E-02         1.58057E+00         1.09579E+00         1.58078E+00         2.31562E+00         1.00000E+00         3.84326E-12         2.31562E+00         3.12801E-01         2.00282E+00
+          2.51580E-02         1.41192E-02        -2.57654E-02         1.58057E+00         1.10646E+00         1.58078E+00         2.25529E+00         1.00000E+00         1.84957E-12         2.25529E+00         3.09508E-01         1.94578E+00
+          2.51580E-02         1.42890E-02        -2.59169E-02         1.58056E+00         1.11713E+00         1.58077E+00         2.20232E+00         1.00000E+00         3.86100E-12         2.20232E+00         3.07469E-01         1.89485E+00
+          2.51580E-02         1.44589E-02        -2.60703E-02         1.58056E+00         1.12780E+00         1.58077E+00         2.15621E+00         1.00000E+00         7.45175E-12         2.15621E+00         3.06642E-01         1.84956E+00
+          2.51580E-02         1.46287E-02        -2.62254E-02         1.58055E+00         1.13847E+00         1.58077E+00         2.11647E+00         1.00000E+00         1.14965E-11         2.11647E+00         3.06986E-01         1.80948E+00
+          2.51580E-02         1.47985E-02        -2.63824E-02         1.58055E+00         1.14914E+00         1.58077E+00         2.08263E+00         1.00000E+00         1.58825E-11         2.08263E+00         3.08455E-01         1.77418E+00
+          2.51580E-02         1.49683E-02        -2.65412E-02         1.58055E+00         1.15981E+00         1.58077E+00         2.05423E+00         1.00000E+00         2.05833E-11         2.05423E+00         3.11000E-01         1.74323E+00
+          2.51580E-02         1.51382E-02        -2.67018E-02         1.58054E+00         1.17048E+00         1.58077E+00         2.03083E+00         1.00000E+00         2.55872E-11         2.03083E+00         3.14574E-01         1.71626E+00
+          2.51580E-02         1.53080E-02        -2.68642E-02         1.58054E+00         1.18115E+00         1.58077E+00         2.01200E+00         1.00000E+00         3.08855E-11         2.01200E+00         3.19122E-01         1.69288E+00
+          2.51580E-02         1.54778E-02        -2.70284E-02         1.58053E+00         1.19182E+00         1.58076E+00         1.99733E+00         1.00000E+00         3.64691E-11         1.99733E+00         3.24591E-01         1.67274E+00
+          2.51580E-02         1.56476E-02        -2.71944E-02         1.58053E+00         1.20249E+00         1.58076E+00         1.98643E+00         1.00000E+00         4.23282E-11         1.98643E+00         3.30926E-01         1.65550E+00
+          2.51580E-02         1.58175E-02        -2.73623E-02         1.58052E+00         1.21317E+00         1.58076E+00         1.97892E+00         1.00000E+00         4.84509E-11         1.97892E+00         3.38069E-01         1.64085E+00
+          2.51580E-02         1.59873E-02        -2.75319E-02         1.58052E+00         1.22384E+00         1.58076E+00         1.97444E+00         1.00000E+00         5.48235E-11         1.97444E+00         3.45960E-01         1.62848E+00
+          2.51580E-02         1.61571E-02        -2.77034E-02         1.58052E+00         1.23451E+00         1.58076E+00         1.97265E+00         1.00000E+00         6.14302E-11         1.97265E+00         3.54541E-01         1.61810E+00
+          2.51580E-02         1.63270E-02        -2.78767E-02         1.58051E+00         1.24518E+00         1.58076E+00         1.97322E+00         1.00000E+00         6.82528E-11         1.97322E+00         3.63751E-01         1.60947E+00
+          2.51580E-02         1.64968E-02        -2.80518E-02         1.58051E+00         1.25585E+00         1.58076E+00         1.97584E+00         1.00000E+00         7.52707E-11         1.97584E+00         3.73526E-01         1.60232E+00
+          2.51580E-02         1.66666E-02        -2.82287E-02         1.58050E+00         1.26652E+00         1.58076E+00         1.98023E+00         1.00000E+00         8.24608E-11         1.98023E+00         3.83806E-01         1.59642E+00
+          2.51580E-02         1.68364E-02        -2.84074E-02         1.58050E+00         1.27719E+00         1.58075E+00         1.98611E+00         1.00000E+00         8.97973E-11         1.98611E+00         3.94528E-01         1.59158E+00
+          2.51580E-02         1.70063E-02        -2.85879E-02         1.58049E+00         1.28786E+00         1.58075E+00         1.99321E+00         1.00000E+00         9.72517E-11         1.99321E+00         4.05628E-01         1.58758E+00
+          2.51580E-02         1.71761E-02        -2.87703E-02         1.58049E+00         1.29853E+00         1.58075E+00         2.00130E+00         1.00000E+00         1.04793E-10         2.00130E+00         4.17044E-01         1.58426E+00
+          2.51580E-02         1.73459E-02        -2.89544E-02         1.58048E+00         1.30920E+00         1.58075E+00         2.01015E+00         1.00000E+00         1.12386E-10         2.01015E+00         4.28714E-01         1.58144E+00
+          2.51580E-02         1.75158E-02        -2.91404E-02         1.58048E+00         1.31987E+00         1.58075E+00         2.01955E+00         1.00000E+00         1.19994E-10         2.01955E+00         4.40574E-01         1.57898E+00
+          2.51580E-02         1.76856E-02        -2.93282E-02         1.58048E+00         1.33054E+00         1.58075E+00         2.02931E+00         1.00000E+00         1.27578E-10         2.02931E+00         4.52564E-01         1.57674E+00
+          2.51580E-02         1.78554E-02        -2.95178E-02         1.58047E+00         1.34121E+00         1.58075E+00         2.03923E+00         1.00000E+00         1.35093E-10         2.03923E+00         4.64623E-01         1.57461E+00
+          2.51580E-02         1.80252E-02        -2.97092E-02         1.58047E+00         1.35188E+00         1.58075E+00         2.04916E+00         1.00000E+00         1.42494E-10         2.04916E+00         4.76691E-01         1.57247E+00
+          2.51580E-02         1.81951E-02        -2.99024E-02         1.58046E+00         1.36255E+00         1.58074E+00         2.05895E+00         1.00000E+00         1.49731E-10         2.05895E+00         4.88709E-01         1.57024E+00
+          2.51580E-02         1.83649E-02        -3.00974E-02         1.58046E+00         1.37322E+00         1.58074E+00         2.06844E+00         1.00000E+00         1.56752E-10         2.06844E+00         5.00621E-01         1.56782E+00
+          2.51580E-02         1.85347E-02        -3.02943E-02         1.58045E+00         1.38389E+00         1.58074E+00         2.07752E+00         1.00000E+00         1.63501E-10         2.07752E+00         5.12370E-01         1.56515E+00
+          2.51580E-02         1.87045E-02        -3.04929E-02         1.58045E+00         1.39457E+00         1.58074E+00         2.08607E+00         1.00000E+00         1.69920E-10         2.08607E+00         5.23902E-01         1.56217E+00
+          2.51580E-02         1.88744E-02        -3.06934E-02         1.58044E+00         1.40524E+00         1.58074E+00         2.09399E+00         1.00000E+00         1.75947E-10         2.09399E+00         5.35167E-01         1.55882E+00
+          2.51580E-02         1.90442E-02        -3.08957E-02         1.58044E+00         1.41591E+00         1.58074E+00         2.10118E+00         1.00000E+00         1.81519E-10         2.10118E+00         5.46112E-01         1.55507E+00
+          2.51580E-02         1.92140E-02        -3.10997E-02         1.58043E+00         1.42658E+00         1.58074E+00         2.10757E+00         1.00000E+00         1.86568E-10         2.10757E+00         5.56690E-01         1.55088E+00
+          2.51580E-02         1.93839E-02        -3.13056E-02         1.58043E+00         1.43725E+00         1.58074E+00         2.11308E+00         1.00000E+00         1.91025E-10         2.11308E+00         5.66856E-01         1.54622E+00
+          2.51580E-02         1.95537E-02        -3.15134E-02         1.58042E+00         1.44792E+00         1.58073E+00         2.11765E+00         1.00000E+00         1.94819E-10         2.11765E+00         5.76566E-01         1.54108E+00
+          2.51580E-02         1.97235E-02        -3.17229E-02         1.58042E+00         1.45859E+00         1.58073E+00         2.12123E+00         1.00000E+00         1.97875E-10         2.12123E+00         5.85779E-01         1.53545E+00
+          2.51580E-02         1.98933E-02        -3.19342E-02         1.58041E+00         1.46926E+00         1.58073E+00         2.12377E+00         1.00000E+00         2.00117E-10         2.12377E+00         5.94456E-01         1.52931E+00
+          2.51580E-02         2.00632E-02        -3.21474E-02         1.58040E+00         1.47993E+00         1.58073E+00         2.12524E+00         1.00000E+00         2.01468E-10         2.12524E+00         6.02562E-01         1.52267E+00
+          2.51580E-02         2.02330E-02        -3.23624E-02         1.58040E+00         1.49060E+00         1.58073E+00         2.12560E+00         1.00000E+00         2.01850E-10         2.12560E+00         6.10064E-01         1.51554E+00
+          2.51580E-02         2.04028E-02        -3.25791E-02         1.58039E+00         1.50127E+00         1.58073E+00         2.12484E+00         1.00000E+00         2.01182E-10         2.12484E+00         6.16932E-01         1.50791E+00
+          2.51580E-02         2.05726E-02        -3.27977E-02         1.58039E+00         1.51194E+00         1.58073E+00         2.12294E+00         1.00000E+00         1.99384E-10         2.12294E+00         6.23138E-01         1.49980E+00
+          2.51580E-02         2.07425E-02        -3.30181E-02         1.58038E+00         1.52261E+00         1.58073E+00         2.11989E+00         1.00000E+00         1.96377E-10         2.11989E+00         6.28657E-01         1.49123E+00
+          2.51580E-02         2.09123E-02        -3.32404E-02         1.58038E+00         1.53328E+00         1.58073E+00         2.11568E+00         1.00000E+00         1.92080E-10         2.11568E+00         6.33469E-01         1.48221E+00
+          2.51580E-02         2.10821E-02        -3.34644E-02         1.58037E+00         1.54395E+00         1.58073E+00         2.11031E+00         1.00000E+00         1.86415E-10         2.11031E+00         6.37555E-01         1.47275E+00
+          2.51580E-02         2.12520E-02        -3.36902E-02         1.58037E+00         1.55462E+00         1.58072E+00         2.10379E+00         1.00000E+00         1.79304E-10         2.10379E+00         6.40899E-01         1.46289E+00
+          2.51580E-02         2.14218E-02        -3.39179E-02         1.58036E+00         1.56529E+00         1.58072E+00         2.09613E+00         1.00000E+00         1.70674E-10         2.09613E+00         6.43488E-01         1.45264E+00
+          2.51580E-02         2.15916E-02        -3.41474E-02         1.58035E+00         1.57596E+00         1.58072E+00         2.08733E+00         1.00000E+00         1.60453E-10         2.08733E+00         6.45313E-01         1.44202E+00
+          2.51580E-02         2.17614E-02        -3.43786E-02         1.58035E+00         1.58664E+00         1.58072E+00         2.07742E+00         1.00000E+00         1.48576E-10         2.07742E+00         6.46367E-01         1.43106E+00
+          2.51580E-02         2.19313E-02        -3.46117E-02         1.58034E+00         1.59731E+00         1.58072E+00         2.06642E+00         1.00000E+00         1.34986E-10         2.06642E+00         6.46646E-01         1.41977E+00
+          2.51580E-02         2.21011E-02        -3.48466E-02         1.58034E+00         1.60798E+00         1.58072E+00         2.05433E+00         1.00000E+00         1.19636E-10         2.05433E+00         6.46149E-01         1.40818E+00
+          2.51580E-02         2.22709E-02        -3.50834E-02         1.58033E+00         1.61865E+00         1.58072E+00         2.04120E+00         1.00000E+00         1.02501E-10         2.04120E+00         6.44878E-01         1.39632E+00
+          2.51580E-02         2.24407E-02        -3.53219E-02         1.58032E+00         1.62932E+00         1.58072E+00         2.02703E+00         1.00000E+00         8.36019E-11         2.02703E+00         6.42837E-01         1.38419E+00
+          2.51580E-02         2.26106E-02        -3.55622E-02         1.58032E+00         1.63999E+00         1.58072E+00         2.01187E+00         1.00000E+00         6.30778E-11         2.01187E+00         6.40033E-01         1.37183E+00
+          2.51580E-02         2.27804E-02        -3.58044E-02         1.58031E+00         1.65066E+00         1.58072E+00         1.99573E+00         1.00000E+00         4.15245E-11         1.99573E+00         6.36476E-01         1.35925E+00
+          2.51580E-02         2.29502E-02        -3.60484E-02         1.58031E+00         1.66133E+00         1.58072E+00         1.97865E+00         1.00000E+00         2.25055E-11         1.97865E+00         6.32178E-01         1.34647E+00
+          2.51580E-02         2.31201E-02        -3.62942E-02         1.58030E+00         1.67200E+00         1.58072E+00         1.96066E+00         1.00000E+00         2.52446E-11         1.96066E+00         6.27154E-01         1.33351E+00
+          2.51580E-02         2.32899E-02        -3.65418E-02         1.58029E+00         1.68267E+00         1.58072E+00         1.94180E+00         1.00000E+00         4.95798E-11         1.94180E+00         6.21420E-01         1.32037E+00
+          2.51580E-02         2.34597E-02        -3.67912E-02         1.58029E+00         1.69334E+00         1.58072E+00         1.92208E+00         1.00000E+00         7.96118E-11         1.92208E+00         6.14996E-01         1.30709E+00
+          2.51580E-02         2.36295E-02        -3.70424E-02         1.58028E+00         1.70401E+00         1.58072E+00         1.90156E+00         1.00000E+00         1.12562E-10         1.90156E+00         6.07902E-01         1.29366E+00
+          2.51580E-02         2.37994E-02        -3.72954E-02         1.58028E+00         1.71468E+00         1.58072E+00         1.88026E+00         1.00000E+00         1.47878E-10         1.88026E+00         6.00162E-01         1.28010E+00
+          2.51580E-02         2.39692E-02        -3.75503E-02         1.58027E+00         1.72535E+00         1.58071E+00         1.85822E+00         1.00000E+00         1.85365E-10         1.85822E+00         5.91800E-01         1.26642E+00
+          2.51580E-02         2.41390E-02        -3.78069E-02         1.58026E+00         1.73602E+00         1.58071E+00         1.83547E+00         1.00000E+00         2.24907E-10         1.83547E+00         5.82843E-01         1.25263E+00
+          2.51580E-02         2.43088E-02        -3.80654E-02         1.58026E+00         1.74669E+00         1.58071E+00         1.81206E+00         1.00000E+00         2.66414E-10         1.81206E+00         5.73319E-01         1.23874E+00
+          2.51580E-02         2.44787E-02        -3.83257E-02         1.58025E+00         1.75736E+00         1.58071E+00         1.78800E+00         1.00000E+00         3.09791E-10         1.78800E+00         5.63257E-01         1.22475E+00
+          2.51580E-02         2.46485E-02        -3.85878E-02         1.58024E+00         1.76804E+00         1.58071E+00         1.76335E+00         1.00000E+00         3.54936E-10         1.76335E+00         5.52688E-01         1.21066E+00
+          2.51580E-02         2.48183E-02        -3.88517E-02         1.58024E+00         1.77871E+00         1.58071E+00         1.73813E+00         1.00000E+00         4.01734E-10         1.73813E+00         5.41644E-01         1.19649E+00
+          2.51580E-02         2.49882E-02        -3.91175E-02         1.58023E+00         1.78938E+00         1.58071E+00         1.71239E+00         1.00000E+00         4.50056E-10         1.71239E+00         5.30158E-01         1.18223E+00
+          2.51580E-02         2.51580E-02        -3.93850E-02         1.58022E+00         1.80005E+00         1.58071E+00         1.68616E+00         1.00000E+00         4.99756E-10         1.68616E+00         5.18263E-01         1.16789E+00
+          2.51580E-02         2.53278E-02        -3.96544E-02         1.58022E+00         1.81072E+00         1.58071E+00         1.65947E+00         1.00000E+00         5.50669E-10         1.65947E+00         5.05994E-01         1.15347E+00
+          2.51580E-02         2.54976E-02        -3.99255E-02         1.58021E+00         1.82139E+00         1.58071E+00         1.63236E+00         1.00000E+00         6.02615E-10         1.63236E+00         4.93385E-01         1.13898E+00
+          2.51580E-02         2.56675E-02        -4.01985E-02         1.58020E+00         1.83206E+00         1.58071E+00         1.60488E+00         1.00000E+00         6.55393E-10         1.60488E+00         4.80472E-01         1.12440E+00
+          2.51580E-02         2.58373E-02        -4.04733E-02         1.58020E+00         1.84273E+00         1.58071E+00         1.57705E+00         1.00000E+00         7.08785E-10         1.57705E+00         4.67290E-01         1.10976E+00
+          2.51580E-02         2.60071E-02        -4.07499E-02         1.58019E+00         1.85340E+00         1.58071E+00         1.54891E+00         1.00000E+00         7.62553E-10         1.54891E+00         4.53876E-01         1.09504E+00
+          2.51580E-02         2.61769E-02        -4.10283E-02         1.58018E+00         1.86407E+00         1.58071E+00         1.52051E+00         1.00000E+00         8.16439E-10         1.52051E+00         4.40264E-01         1.08024E+00
+          2.53278E-02         8.72665E-04        -1.97976E-02         1.59139E+00         2.74155E-01         1.59152E+00         5.28166E+01         1.00000E+00         7.50590E-11         5.28166E+01         2.86069E+00         4.99559E+01
+          2.53278E-02         1.04249E-03        -1.98078E-02         1.59139E+00         2.84826E-01         1.59152E+00         5.18798E+01         1.00000E+00         6.97409E-11         5.18798E+01         2.83860E+00         4.90412E+01
+          2.53278E-02         1.21232E-03        -1.98199E-02         1.59139E+00         2.95496E-01         1.59152E+00         5.09235E+01         1.00000E+00         6.45397E-11         5.09235E+01         2.81556E+00         4.81079E+01
+          2.53278E-02         1.38215E-03        -1.98337E-02         1.59139E+00         3.06167E-01         1.59152E+00         4.99493E+01         1.00000E+00         5.94753E-11         4.99493E+01         2.79154E+00         4.71577E+01
+          2.53278E-02         1.55197E-03        -1.98493E-02         1.59139E+00         3.16838E-01         1.59152E+00         4.89587E+01         1.00000E+00         5.45661E-11         4.89587E+01         2.76655E+00         4.61921E+01
+          2.53278E-02         1.72180E-03        -1.98668E-02         1.59139E+00         3.27508E-01         1.59151E+00         4.79533E+01         1.00000E+00         4.98287E-11         4.79533E+01         2.74059E+00         4.52127E+01
+          2.53278E-02         1.89163E-03        -1.98861E-02         1.59139E+00         3.38179E-01         1.59151E+00         4.69347E+01         1.00000E+00         4.52782E-11         4.69347E+01         2.71366E+00         4.42211E+01
+          2.53278E-02         2.06146E-03        -1.99072E-02         1.59139E+00         3.48849E-01         1.59151E+00         4.59045E+01         1.00000E+00         4.09277E-11         4.59045E+01         2.68576E+00         4.32188E+01
+          2.53278E-02         2.23128E-03        -1.99301E-02         1.59139E+00         3.59520E-01         1.59151E+00         4.48643E+01         1.00000E+00         3.67883E-11         4.48643E+01         2.65689E+00         4.22074E+01
+          2.53278E-02         2.40111E-03        -1.99548E-02         1.59139E+00         3.70190E-01         1.59151E+00         4.38157E+01         1.00000E+00         3.28696E-11         4.38157E+01         2.62705E+00         4.11886E+01
+          2.53278E-02         2.57094E-03        -1.99813E-02         1.59139E+00         3.80861E-01         1.59151E+00         4.27601E+01         1.00000E+00         2.91791E-11         4.27601E+01         2.59626E+00         4.01638E+01
+          2.53278E-02         2.74077E-03        -2.00096E-02         1.59139E+00         3.91532E-01         1.59151E+00         4.16992E+01         1.00000E+00         2.57221E-11         4.16992E+01         2.56453E+00         3.91346E+01
+          2.53278E-02         2.91059E-03        -2.00398E-02         1.59139E+00         4.02202E-01         1.59151E+00         4.06344E+01         1.00000E+00         2.25024E-11         4.06344E+01         2.53186E+00         3.81026E+01
+          2.53278E-02         3.08042E-03        -2.00717E-02         1.59139E+00         4.12873E-01         1.59151E+00         3.95674E+01         1.00000E+00         1.95217E-11         3.95674E+01         2.49827E+00         3.70691E+01
+          2.53278E-02         3.25025E-03        -2.01055E-02         1.59138E+00         4.23543E-01         1.59151E+00         3.84995E+01         1.00000E+00         1.67799E-11         3.84995E+01         2.46377E+00         3.60358E+01
+          2.53278E-02         3.42008E-03        -2.01410E-02         1.59138E+00         4.34214E-01         1.59151E+00         3.74323E+01         1.00000E+00         1.42749E-11         3.74323E+01         2.42838E+00         3.50039E+01
+          2.53278E-02         3.58990E-03        -2.01784E-02         1.59138E+00         4.44884E-01         1.59151E+00         3.63672E+01         1.00000E+00         1.20032E-11         3.63672E+01         2.39213E+00         3.39751E+01
+          2.53278E-02         3.75973E-03        -2.02176E-02         1.59138E+00         4.55555E-01         1.59151E+00         3.53055E+01         1.00000E+00         9.95922E-12         3.53055E+01         2.35503E+00         3.29505E+01
+          2.53278E-02         3.92956E-03        -2.02586E-02         1.59138E+00         4.66225E-01         1.59151E+00         3.42487E+01         1.00000E+00         8.13611E-12         3.42487E+01         2.31711E+00         3.19316E+01
+          2.53278E-02         4.09939E-03        -2.03015E-02         1.59138E+00         4.76896E-01         1.59151E+00         3.31980E+01         1.00000E+00         6.52533E-12         3.31980E+01         2.27840E+00         3.09196E+01
+          2.53278E-02         4.26921E-03        -2.03461E-02         1.59138E+00         4.87567E-01         1.59151E+00         3.21547E+01         1.00000E+00         5.11694E-12         3.21547E+01         2.23892E+00         2.99158E+01
+          2.53278E-02         4.43904E-03        -2.03926E-02         1.59138E+00         4.98237E-01         1.59151E+00         3.11201E+01         1.00000E+00         3.89967E-12         3.11201E+01         2.19872E+00         2.89214E+01
+          2.53278E-02         4.60887E-03        -2.04408E-02         1.59138E+00         5.08908E-01         1.59151E+00         3.00954E+01         1.00000E+00         2.86109E-12         3.00954E+01         2.15781E+00         2.79376E+01
+          2.53278E-02         4.77869E-03        -2.04909E-02         1.59138E+00         5.19578E-01         1.59151E+00         2.90816E+01         1.00000E+00         1.98790E-12         2.90816E+01         2.11624E+00         2.69654E+01
+          2.53278E-02         4.94852E-03        -2.05428E-02         1.59137E+00         5.30249E-01         1.59151E+00         2.80800E+01         1.00000E+00         1.26700E-12         2.80800E+01         2.07406E+00         2.60059E+01
+          2.53278E-02         5.11835E-03        -2.05965E-02         1.59137E+00         5.40919E-01         1.59151E+00         2.70915E+01         1.00000E+00         6.90464E-13         2.70915E+01         2.03129E+00         2.50602E+01
+          2.53278E-02         5.28818E-03        -2.06520E-02         1.59137E+00         5.51590E-01         1.59151E+00         2.61171E+01         1.00000E+00         2.99729E-13         2.61171E+01         1.98798E+00         2.41292E+01
+          2.53278E-02         5.45800E-03        -2.07093E-02         1.59137E+00         5.62261E-01         1.59150E+00         2.51579E+01         1.00000E+00         3.54314E-13         2.51579E+01         1.94417E+00         2.32137E+01
+          2.53278E-02         5.62783E-03        -2.07684E-02         1.59137E+00         5.72931E-01         1.59150E+00         2.42145E+01         1.00000E+00         6.22960E-13         2.42145E+01         1.89993E+00         2.23146E+01
+          2.53278E-02         5.79766E-03        -2.08293E-02         1.59137E+00         5.83602E-01         1.59150E+00         2.32880E+01         1.00000E+00         8.79783E-13         2.32880E+01         1.85528E+00         2.14327E+01
+          2.53278E-02         5.96749E-03        -2.08921E-02         1.59136E+00         5.94272E-01         1.59150E+00         2.23791E+01         1.00000E+00         1.11584E-12         2.23791E+01         1.81029E+00         2.05688E+01
+          2.53278E-02         6.13731E-03        -2.09567E-02         1.59136E+00         6.04943E-01         1.59150E+00         2.14884E+01         1.00000E+00         1.34364E-12         2.14884E+01         1.76500E+00         1.97234E+01
+          2.53278E-02         6.30714E-03        -2.10230E-02         1.59136E+00         6.15613E-01         1.59150E+00         2.06167E+01         1.00000E+00         1.57575E-12         2.06167E+01         1.71948E+00         1.88972E+01
+          2.53278E-02         6.47697E-03        -2.10912E-02         1.59136E+00         6.26284E-01         1.59150E+00         1.97645E+01         1.00000E+00         1.82110E-12         1.97645E+01         1.67377E+00         1.80907E+01
+          2.53278E-02         6.64680E-03        -2.11612E-02         1.59136E+00         6.36955E-01         1.59150E+00         1.89324E+01         1.00000E+00         2.08446E-12         1.89324E+01         1.62793E+00         1.73045E+01
+          2.53278E-02         6.81662E-03        -2.12330E-02         1.59136E+00         6.47625E-01         1.59150E+00         1.81209E+01         1.00000E+00         2.36722E-12         1.81209E+01         1.58203E+00         1.65389E+01
+          2.53278E-02         6.98645E-03        -2.13066E-02         1.59135E+00         6.58296E-01         1.59150E+00         1.73305E+01         1.00000E+00         2.66857E-12         1.73305E+01         1.53611E+00         1.57943E+01
+          2.53278E-02         7.15628E-03        -2.13821E-02         1.59135E+00         6.68966E-01         1.59150E+00         1.65614E+01         1.00000E+00         2.98675E-12         1.65614E+01         1.49024E+00         1.50712E+01
+          2.53278E-02         7.32611E-03        -2.14593E-02         1.59135E+00         6.79637E-01         1.59150E+00         1.58141E+01         1.00000E+00         3.32000E-12         1.58141E+01         1.44449E+00         1.43696E+01
+          2.53278E-02         7.49593E-03        -2.15384E-02         1.59135E+00         6.90307E-01         1.59149E+00         1.50888E+01         1.00000E+00         3.66722E-12         1.50888E+01         1.39890E+00         1.36899E+01
+          2.53278E-02         7.66576E-03        -2.16193E-02         1.59135E+00         7.00978E-01         1.59149E+00         1.43857E+01         1.00000E+00         4.02834E-12         1.43857E+01         1.35355E+00         1.30321E+01
+          2.53278E-02         7.83559E-03        -2.17019E-02         1.59134E+00         7.11649E-01         1.59149E+00         1.37050E+01         1.00000E+00         4.40441E-12         1.37050E+01         1.30849E+00         1.23965E+01
+          2.53278E-02         8.00542E-03        -2.17864E-02         1.59134E+00         7.22319E-01         1.59149E+00         1.30467E+01         1.00000E+00         4.79757E-12         1.30467E+01         1.26379E+00         1.17830E+01
+          2.53278E-02         8.17524E-03        -2.18727E-02         1.59134E+00         7.32990E-01         1.59149E+00         1.24111E+01         1.00000E+00         5.21083E-12         1.24111E+01         1.21951E+00         1.11916E+01
+          2.53278E-02         8.34507E-03        -2.19608E-02         1.59134E+00         7.43660E-01         1.59149E+00         1.17980E+01         1.00000E+00         5.64771E-12         1.17980E+01         1.17570E+00         1.06223E+01
+          2.53278E-02         8.51490E-03        -2.20508E-02         1.59134E+00         7.54331E-01         1.59149E+00         1.12075E+01         1.00000E+00         6.11184E-12         1.12075E+01         1.13244E+00         1.00750E+01
+          2.53278E-02         8.68473E-03        -2.21425E-02         1.59133E+00         7.65001E-01         1.59149E+00         1.06394E+01         1.00000E+00         6.60654E-12         1.06394E+01         1.08977E+00         9.54961E+00
+          2.53278E-02         8.85455E-03        -2.22361E-02         1.59133E+00         7.75672E-01         1.59149E+00         1.00937E+01         1.00000E+00         7.13435E-12         1.00937E+01         1.04777E+00         9.04589E+00
+          2.53278E-02         9.02438E-03        -2.23314E-02         1.59133E+00         7.86343E-01         1.59149E+00         9.57011E+00         1.00000E+00         7.69673E-12         9.57011E+00         1.00648E+00         8.56363E+00
+          2.53278E-02         9.19421E-03        -2.24286E-02         1.59133E+00         7.97013E-01         1.59148E+00         9.06855E+00         1.00000E+00         8.29376E-12         9.06855E+00         9.65962E-01         8.10258E+00
+          2.53278E-02         9.36403E-03        -2.25276E-02         1.59132E+00         8.07684E-01         1.59148E+00         8.58872E+00         1.00000E+00         8.92395E-12         8.58872E+00         9.26276E-01         7.66244E+00
+          2.53278E-02         9.53386E-03        -2.26284E-02         1.59132E+00         8.18354E-01         1.59148E+00         8.13035E+00         1.00000E+00         9.58425E-12         8.13035E+00         8.87472E-01         7.24288E+00
+          2.53278E-02         9.70369E-03        -2.27310E-02         1.59132E+00         8.29025E-01         1.59148E+00         7.69314E+00         1.00000E+00         1.02700E-11         7.69314E+00         8.49603E-01         6.84354E+00
+          2.53278E-02         9.87352E-03        -2.28354E-02         1.59132E+00         8.39695E-01         1.59148E+00         7.27674E+00         1.00000E+00         1.09750E-11         7.27674E+00         8.12719E-01         6.46402E+00
+          2.53278E-02         1.00433E-02        -2.29416E-02         1.59131E+00         8.50366E-01         1.59148E+00         6.88077E+00         1.00000E+00         1.16917E-11         6.88077E+00         7.76866E-01         6.10390E+00
+          2.53278E-02         1.02132E-02        -2.30497E-02         1.59131E+00         8.61037E-01         1.59148E+00         6.50484E+00         1.00000E+00         1.24113E-11         6.50484E+00         7.42091E-01         5.76275E+00
+          2.53278E-02         1.03830E-02        -2.31595E-02         1.59131E+00         8.71707E-01         1.59148E+00         6.14851E+00         1.00000E+00         1.31241E-11         6.14851E+00         7.08437E-01         5.44008E+00
+          2.53278E-02         1.05528E-02        -2.32712E-02         1.59130E+00         8.82378E-01         1.59147E+00         5.81135E+00         1.00000E+00         1.38191E-11         5.81135E+00         6.75944E-01         5.13540E+00
+          2.53278E-02         1.07227E-02        -2.33847E-02         1.59130E+00         8.93048E-01         1.59147E+00         5.49286E+00         1.00000E+00         1.44849E-11         5.49286E+00         6.44651E-01         4.84821E+00
+          2.53278E-02         1.08925E-02        -2.35000E-02         1.59130E+00         9.03719E-01         1.59147E+00         5.19258E+00         1.00000E+00         1.51093E-11         5.19258E+00         6.14591E-01         4.57799E+00
+          2.53278E-02         1.10623E-02        -2.36171E-02         1.59130E+00         9.14389E-01         1.59147E+00         4.90998E+00         1.00000E+00         1.56797E-11         4.90998E+00         5.85797E-01         4.32418E+00
+          2.53278E-02         1.12321E-02        -2.37360E-02         1.59129E+00         9.25060E-01         1.59147E+00         4.64454E+00         1.00000E+00         1.61830E-11         4.64454E+00         5.58298E-01         4.08624E+00
+          2.53278E-02         1.14020E-02        -2.38567E-02         1.59129E+00         9.35731E-01         1.59147E+00         4.39572E+00         1.00000E+00         1.66060E-11         4.39572E+00         5.32120E-01         3.86360E+00
+          2.53278E-02         1.15718E-02        -2.39793E-02         1.59129E+00         9.46401E-01         1.59147E+00         4.16299E+00         1.00000E+00         1.69355E-11         4.16299E+00         5.07285E-01         3.65570E+00
+          2.53278E-02         1.17416E-02        -2.41036E-02         1.59128E+00         9.57072E-01         1.59147E+00         3.94577E+00         1.00000E+00         1.71579E-11         3.94577E+00         4.83813E-01         3.46196E+00
+          2.53278E-02         1.19114E-02        -2.42298E-02         1.59128E+00         9.67742E-01         1.59146E+00         3.74350E+00         1.00000E+00         1.72601E-11         3.74350E+00         4.61719E-01         3.28178E+00
+          2.53278E-02         1.20813E-02        -2.43578E-02         1.59128E+00         9.78413E-01         1.59146E+00         3.55562E+00         1.00000E+00         1.72291E-11         3.55562E+00         4.41015E-01         3.11461E+00
+          2.53278E-02         1.22511E-02        -2.44876E-02         1.59127E+00         9.89083E-01         1.59146E+00         3.38155E+00         1.00000E+00         1.70522E-11         3.38155E+00         4.21711E-01         2.95983E+00
+          2.53278E-02         1.24209E-02        -2.46192E-02         1.59127E+00         9.99754E-01         1.59146E+00         3.22070E+00         1.00000E+00         1.67171E-11         3.22070E+00         4.03812E-01         2.81689E+00
+          2.53278E-02         1.25908E-02        -2.47526E-02         1.59127E+00         1.01042E+00         1.59146E+00         3.07251E+00         1.00000E+00         1.62122E-11         3.07251E+00         3.87319E-01         2.68520E+00
+          2.53278E-02         1.27606E-02        -2.48878E-02         1.59126E+00         1.02110E+00         1.59146E+00         2.93641E+00         1.00000E+00         1.55267E-11         2.93641E+00         3.72231E-01         2.56417E+00
+          2.53278E-02         1.29304E-02        -2.50248E-02         1.59126E+00         1.03177E+00         1.59146E+00         2.81180E+00         1.00000E+00         1.46508E-11         2.81180E+00         3.58544E-01         2.45326E+00
+          2.53278E-02         1.31002E-02        -2.51637E-02         1.59126E+00         1.04244E+00         1.59146E+00         2.69814E+00         1.00000E+00         1.35763E-11         2.69814E+00         3.46247E-01         2.35189E+00
+          2.53278E-02         1.32701E-02        -2.53043E-02         1.59125E+00         1.05311E+00         1.59145E+00         2.59485E+00         1.00000E+00         1.22971E-11         2.59485E+00         3.35329E-01         2.25953E+00
+          2.53278E-02         1.34399E-02        -2.54468E-02         1.59125E+00         1.06378E+00         1.59145E+00         2.50139E+00         1.00000E+00         1.08111E-11         2.50139E+00         3.25773E-01         2.17561E+00
+          2.53278E-02         1.36097E-02        -2.55911E-02         1.59125E+00         1.07445E+00         1.59145E+00         2.41719E+00         1.00000E+00         9.12413E-12         2.41719E+00         3.17562E-01         2.09963E+00
+          2.53278E-02         1.37795E-02        -2.57372E-02         1.59124E+00         1.08512E+00         1.59145E+00         2.34173E+00         1.00000E+00         7.26127E-12         2.34173E+00         3.10673E-01         2.03106E+00
+          2.53278E-02         1.39494E-02        -2.58851E-02         1.59124E+00         1.09579E+00         1.59145E+00         2.27448E+00         1.00000E+00         5.30803E-12         2.27448E+00         3.05079E-01         1.96940E+00
+          2.53278E-02         1.41192E-02        -2.60348E-02         1.59123E+00         1.10646E+00         1.59145E+00         2.21491E+00         1.00000E+00         3.59771E-12         2.21491E+00         3.00753E-01         1.91416E+00
+          2.53278E-02         1.42890E-02        -2.61864E-02         1.59123E+00         1.11713E+00         1.59145E+00         2.16253E+00         1.00000E+00         3.29546E-12         2.16253E+00         2.97662E-01         1.86487E+00
+          2.53278E-02         1.44589E-02        -2.63397E-02         1.59123E+00         1.12780E+00         1.59144E+00         2.11685E+00         1.00000E+00         5.12156E-12         2.11685E+00         2.95771E-01         1.82108E+00
+          2.53278E-02         1.46287E-02        -2.64949E-02         1.59122E+00         1.13847E+00         1.59144E+00         2.07738E+00         1.00000E+00         7.98866E-12         2.07738E+00         2.95044E-01         1.78234E+00
+          2.53278E-02         1.47985E-02        -2.66518E-02         1.59122E+00         1.14914E+00         1.59144E+00         2.04367E+00         1.00000E+00         1.13499E-11         2.04367E+00         2.95439E-01         1.74823E+00
+          2.53278E-02         1.49683E-02        -2.68106E-02         1.59122E+00         1.15981E+00         1.59144E+00         2.01527E+00         1.00000E+00         1.50604E-11         2.01527E+00         2.96913E-01         1.71835E+00
+          2.53278E-02         1.51382E-02        -2.69712E-02         1.59121E+00         1.17048E+00         1.59144E+00         1.99174E+00         1.00000E+00         1.90715E-11         1.99174E+00         2.99423E-01         1.69231E+00
+          2.53278E-02         1.53080E-02        -2.71336E-02         1.59121E+00         1.18115E+00         1.59144E+00         1.97266E+00         1.00000E+00         2.33606E-11         1.97266E+00         3.02919E-01         1.66975E+00
+          2.53278E-02         1.54778E-02        -2.72978E-02         1.59120E+00         1.19182E+00         1.59144E+00         1.95765E+00         1.00000E+00         2.79136E-11         1.95765E+00         3.07353E-01         1.65030E+00
+          2.53278E-02         1.56476E-02        -2.74639E-02         1.59120E+00         1.20249E+00         1.59144E+00         1.94631E+00         1.00000E+00         3.27187E-11         1.94631E+00         3.12672E-01         1.63364E+00
+          2.53278E-02         1.58175E-02        -2.76317E-02         1.59119E+00         1.21317E+00         1.59143E+00         1.93827E+00         1.00000E+00         3.77645E-11         1.93827E+00         3.18824E-01         1.61945E+00
+          2.53278E-02         1.59873E-02        -2.78014E-02         1.59119E+00         1.22384E+00         1.59143E+00         1.93319E+00         1.00000E+00         4.30390E-11         1.93319E+00         3.25754E-01         1.60744E+00
+          2.53278E-02         1.61571E-02        -2.79728E-02         1.59119E+00         1.23451E+00         1.59143E+00         1.93074E+00         1.00000E+00         4.85288E-11         1.93074E+00         3.33405E-01         1.59733E+00
+          2.53278E-02         1.63270E-02        -2.81461E-02         1.59118E+00         1.24518E+00         1.59143E+00         1.93059E+00         1.00000E+00         5.42189E-11         1.93059E+00         3.41721E-01         1.58887E+00
+          2.53278E-02         1.64968E-02        -2.83212E-02         1.59118E+00         1.25585E+00         1.59143E+00         1.93244E+00         1.00000E+00         6.00926E-11         1.93244E+00         3.50642E-01         1.58180E+00
+          2.53278E-02         1.66666E-02        -2.84981E-02         1.59117E+00         1.26652E+00         1.59143E+00         1.93602E+00         1.00000E+00         6.61313E-11         1.93602E+00         3.60110E-01         1.57591E+00
+          2.53278E-02         1.68364E-02        -2.86768E-02         1.59117E+00         1.27719E+00         1.59143E+00         1.94105E+00         1.00000E+00         7.23143E-11         1.94105E+00         3.70065E-01         1.57099E+00
+          2.53278E-02         1.70063E-02        -2.88573E-02         1.59116E+00         1.28786E+00         1.59142E+00         1.94729E+00         1.00000E+00         7.86187E-11         1.94729E+00         3.80447E-01         1.56685E+00
+          2.53278E-02         1.71761E-02        -2.90397E-02         1.59116E+00         1.29853E+00         1.59142E+00         1.95450E+00         1.00000E+00         8.50193E-11         1.95450E+00         3.91194E-01         1.56331E+00
+          2.53278E-02         1.73459E-02        -2.92238E-02         1.59115E+00         1.30920E+00         1.59142E+00         1.96246E+00         1.00000E+00         9.14889E-11         1.96246E+00         4.02248E-01         1.56021E+00
+          2.53278E-02         1.75158E-02        -2.94098E-02         1.59115E+00         1.31987E+00         1.59142E+00         1.97096E+00         1.00000E+00         9.79974E-11         1.97096E+00         4.13547E-01         1.55742E+00
+          2.53278E-02         1.76856E-02        -2.95976E-02         1.59114E+00         1.33054E+00         1.59142E+00         1.97983E+00         1.00000E+00         1.04513E-10         1.97983E+00         4.25032E-01         1.55479E+00
+          2.53278E-02         1.78554E-02        -2.97872E-02         1.59114E+00         1.34121E+00         1.59142E+00         1.98887E+00         1.00000E+00         1.11000E-10         1.98887E+00         4.36644E-01         1.55223E+00
+          2.53278E-02         1.80252E-02        -2.99786E-02         1.59113E+00         1.35188E+00         1.59142E+00         1.99794E+00         1.00000E+00         1.17422E-10         1.99794E+00         4.48323E-01         1.54962E+00
+          2.53278E-02         1.81951E-02        -3.01718E-02         1.59113E+00         1.36255E+00         1.59142E+00         2.00688E+00         1.00000E+00         1.23739E-10         2.00688E+00         4.60013E-01         1.54687E+00
+          2.53278E-02         1.83649E-02        -3.03668E-02         1.59112E+00         1.37322E+00         1.59141E+00         2.01557E+00         1.00000E+00         1.29908E-10         2.01557E+00         4.71657E-01         1.54391E+00
+          2.53278E-02         1.85347E-02        -3.05637E-02         1.59112E+00         1.38389E+00         1.59141E+00         2.02387E+00         1.00000E+00         1.35884E-10         2.02387E+00         4.83199E-01         1.54067E+00
+          2.53278E-02         1.87045E-02        -3.07623E-02         1.59111E+00         1.39457E+00         1.59141E+00         2.03169E+00         1.00000E+00         1.41621E-10         2.03169E+00         4.94586E-01         1.53710E+00
+          2.53278E-02         1.88744E-02        -3.09628E-02         1.59111E+00         1.40524E+00         1.59141E+00         2.03891E+00         1.00000E+00         1.47067E-10         2.03891E+00         5.05766E-01         1.53314E+00
+          2.53278E-02         1.90442E-02        -3.11650E-02         1.59110E+00         1.41591E+00         1.59141E+00         2.04546E+00         1.00000E+00         1.52171E-10         2.04546E+00         5.16688E-01         1.52877E+00
+          2.53278E-02         1.92140E-02        -3.13691E-02         1.59110E+00         1.42658E+00         1.59141E+00         2.05126E+00         1.00000E+00         1.56877E-10         2.05126E+00         5.27304E-01         1.52395E+00
+          2.53278E-02         1.93839E-02        -3.15750E-02         1.59109E+00         1.43725E+00         1.59141E+00         2.05623E+00         1.00000E+00         1.61128E-10         2.05623E+00         5.37567E-01         1.51867E+00
+          2.53278E-02         1.95537E-02        -3.17828E-02         1.59109E+00         1.44792E+00         1.59141E+00         2.06033E+00         1.00000E+00         1.64866E-10         2.06033E+00         5.47433E-01         1.51290E+00
+          2.53278E-02         1.97235E-02        -3.19923E-02         1.59108E+00         1.45859E+00         1.59141E+00         2.06350E+00         1.00000E+00         1.68028E-10         2.06350E+00         5.56860E-01         1.50664E+00
+          2.53278E-02         1.98933E-02        -3.22036E-02         1.59108E+00         1.46926E+00         1.59140E+00         2.06571E+00         1.00000E+00         1.70553E-10         2.06571E+00         5.65808E-01         1.49990E+00
+          2.53278E-02         2.00632E-02        -3.24168E-02         1.59107E+00         1.47993E+00         1.59140E+00         2.06691E+00         1.00000E+00         1.72374E-10         2.06691E+00         5.74240E-01         1.49266E+00
+          2.53278E-02         2.02330E-02        -3.26317E-02         1.59107E+00         1.49060E+00         1.59140E+00         2.06708E+00         1.00000E+00         1.73427E-10         2.06708E+00         5.82122E-01         1.48495E+00
+          2.53278E-02         2.04028E-02        -3.28485E-02         1.59106E+00         1.50127E+00         1.59140E+00         2.06620E+00         1.00000E+00         1.73645E-10         2.06620E+00         5.89420E-01         1.47678E+00
+          2.53278E-02         2.05726E-02        -3.30671E-02         1.59106E+00         1.51194E+00         1.59140E+00         2.06426E+00         1.00000E+00         1.72959E-10         2.06426E+00         5.96106E-01         1.46815E+00
+          2.53278E-02         2.07425E-02        -3.32875E-02         1.59105E+00         1.52261E+00         1.59140E+00         2.06124E+00         1.00000E+00         1.71303E-10         2.06124E+00         6.02154E-01         1.45909E+00
+          2.53278E-02         2.09123E-02        -3.35097E-02         1.59105E+00         1.53328E+00         1.59140E+00         2.05715E+00         1.00000E+00         1.68609E-10         2.05715E+00         6.07539E-01         1.44961E+00
+          2.53278E-02         2.10821E-02        -3.37338E-02         1.59104E+00         1.54395E+00         1.59140E+00         2.05199E+00         1.00000E+00         1.64811E-10         2.05199E+00         6.12240E-01         1.43975E+00
+          2.53278E-02         2.12520E-02        -3.39596E-02         1.59103E+00         1.55462E+00         1.59140E+00         2.04576E+00         1.00000E+00         1.59843E-10         2.04576E+00         6.16240E-01         1.42952E+00
+          2.53278E-02         2.14218E-02        -3.41873E-02         1.59103E+00         1.56529E+00         1.59140E+00         2.03847E+00         1.00000E+00         1.53645E-10         2.03847E+00         6.19523E-01         1.41894E+00
+          2.53278E-02         2.15916E-02        -3.44167E-02         1.59102E+00         1.57596E+00         1.59139E+00         2.03013E+00         1.00000E+00         1.46159E-10         2.03013E+00         6.22076E-01         1.40805E+00
+          2.53278E-02         2.17614E-02        -3.46480E-02         1.59102E+00         1.58664E+00         1.59139E+00         2.02076E+00         1.00000E+00         1.37334E-10         2.02076E+00         6.23891E-01         1.39686E+00
+          2.53278E-02         2.19313E-02        -3.48811E-02         1.59101E+00         1.59731E+00         1.59139E+00         2.01037E+00         1.00000E+00         1.27128E-10         2.01037E+00         6.24959E-01         1.38541E+00
+          2.53278E-02         2.21011E-02        -3.51160E-02         1.59100E+00         1.60798E+00         1.59139E+00         1.99899E+00         1.00000E+00         1.15517E-10         1.99899E+00         6.25279E-01         1.37371E+00
+          2.53278E-02         2.22709E-02        -3.53527E-02         1.59100E+00         1.61865E+00         1.59139E+00         1.98664E+00         1.00000E+00         1.02506E-10         1.98664E+00         6.24847E-01         1.36180E+00
+          2.53278E-02         2.24407E-02        -3.55913E-02         1.59099E+00         1.62932E+00         1.59139E+00         1.97335E+00         1.00000E+00         8.81558E-11         1.97335E+00         6.23666E-01         1.34968E+00
+          2.53278E-02         2.26106E-02        -3.58316E-02         1.59099E+00         1.63999E+00         1.59139E+00         1.95913E+00         1.00000E+00         7.26558E-11         1.95913E+00         6.21740E-01         1.33739E+00
+          2.53278E-02         2.27804E-02        -3.60738E-02         1.59098E+00         1.65066E+00         1.59139E+00         1.94402E+00         1.00000E+00         5.65315E-11         1.94402E+00         6.19075E-01         1.32494E+00
+          2.53278E-02         2.29502E-02        -3.63177E-02         1.59097E+00         1.66133E+00         1.59139E+00         1.92804E+00         1.00000E+00         4.13803E-11         1.92804E+00         6.15681E-01         1.31236E+00
+          2.53278E-02         2.31201E-02        -3.65635E-02         1.59097E+00         1.67200E+00         1.59139E+00         1.91123E+00         1.00000E+00         3.22885E-11         1.91123E+00         6.11569E-01         1.29966E+00
+          2.53278E-02         2.32899E-02        -3.68111E-02         1.59096E+00         1.68267E+00         1.59139E+00         1.89361E+00         1.00000E+00         3.77386E-11         1.89361E+00         6.06753E-01         1.28685E+00
+          2.53278E-02         2.34597E-02        -3.70605E-02         1.59096E+00         1.69334E+00         1.59139E+00         1.87521E+00         1.00000E+00         5.58363E-11         1.87521E+00         6.01250E-01         1.27396E+00
+          2.53278E-02         2.36295E-02        -3.73118E-02         1.59095E+00         1.70401E+00         1.59139E+00         1.85607E+00         1.00000E+00         8.00279E-11         1.85607E+00         5.95077E-01         1.26099E+00
+          2.53278E-02         2.37994E-02        -3.75648E-02         1.59094E+00         1.71468E+00         1.59139E+00         1.83621E+00         1.00000E+00         1.07632E-10         1.83621E+00         5.88255E-01         1.24795E+00
+          2.53278E-02         2.39692E-02        -3.78196E-02         1.59094E+00         1.72535E+00         1.59139E+00         1.81566E+00         1.00000E+00         1.37746E-10         1.81566E+00         5.80806E-01         1.23486E+00
+          2.53278E-02         2.41390E-02        -3.80763E-02         1.59093E+00         1.73602E+00         1.59139E+00         1.79446E+00         1.00000E+00         1.69999E-10         1.79446E+00         5.72754E-01         1.22171E+00
+          2.53278E-02         2.43088E-02        -3.83348E-02         1.59092E+00         1.74669E+00         1.59138E+00         1.77264E+00         1.00000E+00         2.04198E-10         1.77264E+00         5.64125E-01         1.20852E+00
+          2.53278E-02         2.44787E-02        -3.85951E-02         1.59092E+00         1.75736E+00         1.59138E+00         1.75024E+00         1.00000E+00         2.40208E-10         1.75024E+00         5.54945E-01         1.19529E+00
+          2.53278E-02         2.46485E-02        -3.88572E-02         1.59091E+00         1.76804E+00         1.59138E+00         1.72727E+00         1.00000E+00         2.77922E-10         1.72727E+00         5.45242E-01         1.18202E+00
+          2.53278E-02         2.48183E-02        -3.91211E-02         1.59090E+00         1.77871E+00         1.59138E+00         1.70377E+00         1.00000E+00         3.17232E-10         1.70377E+00         5.35048E-01         1.16872E+00
+          2.53278E-02         2.49882E-02        -3.93868E-02         1.59090E+00         1.78938E+00         1.59138E+00         1.67978E+00         1.00000E+00         3.58028E-10         1.67978E+00         5.24391E-01         1.15539E+00
+          2.53278E-02         2.51580E-02        -3.96544E-02         1.59089E+00         1.80005E+00         1.59138E+00         1.65532E+00         1.00000E+00         4.00189E-10         1.65532E+00         5.13305E-01         1.14202E+00
+          2.53278E-02         2.53278E-02        -3.99237E-02         1.59088E+00         1.81072E+00         1.59138E+00         1.63043E+00         1.00000E+00         4.43584E-10         1.63043E+00         5.01821E-01         1.12861E+00
+          2.53278E-02         2.54976E-02        -4.01949E-02         1.59088E+00         1.82139E+00         1.59138E+00         1.60514E+00         1.00000E+00         4.88066E-10         1.60514E+00         4.89973E-01         1.11516E+00
+          2.53278E-02         2.56675E-02        -4.04679E-02         1.59087E+00         1.83206E+00         1.59138E+00         1.57947E+00         1.00000E+00         5.33475E-10         1.57947E+00         4.77794E-01         1.10168E+00
+          2.53278E-02         2.58373E-02        -4.07427E-02         1.59086E+00         1.84273E+00         1.59138E+00         1.55347E+00         1.00000E+00         5.79633E-10         1.55347E+00         4.65319E-01         1.08815E+00
+          2.53278E-02         2.60071E-02        -4.10193E-02         1.59086E+00         1.85340E+00         1.59138E+00         1.52716E+00         1.00000E+00         6.26348E-10         1.52716E+00         4.52582E-01         1.07457E+00
+          2.53278E-02         2.61769E-02        -4.12977E-02         1.59085E+00         1.86407E+00         1.59138E+00         1.50057E+00         1.00000E+00         6.73411E-10         1.50057E+00         4.39617E-01         1.06095E+00
+          2.54976E-02         8.72665E-04        -2.00689E-02         1.60206E+00         2.74155E-01         1.60219E+00         5.17565E+01         1.00000E+00         7.50032E-11         5.17565E+01         2.67891E+00         4.90776E+01
+          2.54976E-02         1.04249E-03        -2.00791E-02         1.60206E+00         2.84826E-01         1.60219E+00         5.08384E+01         1.00000E+00         6.97740E-11         5.08384E+01         2.66036E+00         4.81781E+01
+          2.54976E-02         1.21232E-03        -2.00911E-02         1.60206E+00         2.95496E-01         1.60219E+00         4.99013E+01         1.00000E+00         6.46533E-11         4.99013E+01         2.64093E+00         4.72604E+01
+          2.54976E-02         1.38215E-03        -2.01049E-02         1.60206E+00         3.06167E-01         1.60219E+00         4.89466E+01         1.00000E+00         5.96606E-11         4.89466E+01         2.62062E+00         4.63259E+01
+          2.54976E-02         1.55197E-03        -2.01206E-02         1.60206E+00         3.16838E-01         1.60219E+00         4.79758E+01         1.00000E+00         5.48139E-11         4.79758E+01         2.59941E+00         4.53764E+01
+          2.54976E-02         1.72180E-03        -2.01381E-02         1.60206E+00         3.27508E-01         1.60219E+00         4.69906E+01         1.00000E+00         5.01298E-11         4.69906E+01         2.57730E+00         4.44133E+01
+          2.54976E-02         1.89163E-03        -2.01573E-02         1.60206E+00         3.38179E-01         1.60219E+00         4.59924E+01         1.00000E+00         4.56233E-11         4.59924E+01         2.55428E+00         4.34381E+01
+          2.54976E-02         2.06146E-03        -2.01784E-02         1.60206E+00         3.48849E-01         1.60219E+00         4.49829E+01         1.00000E+00         4.13075E-11         4.49829E+01         2.53035E+00         4.24525E+01
+          2.54976E-02         2.23128E-03        -2.02013E-02         1.60206E+00         3.59520E-01         1.60219E+00         4.39635E+01         1.00000E+00         3.71940E-11         4.39635E+01         2.50551E+00         4.14580E+01
+          2.54976E-02         2.40111E-03        -2.02260E-02         1.60206E+00         3.70190E-01         1.60219E+00         4.29358E+01         1.00000E+00         3.32924E-11         4.29358E+01         2.47975E+00         4.04561E+01
+          2.54976E-02         2.57094E-03        -2.02525E-02         1.60206E+00         3.80861E-01         1.60219E+00         4.19014E+01         1.00000E+00         2.96107E-11         4.19014E+01         2.45309E+00         3.94483E+01
+          2.54976E-02         2.74077E-03        -2.02809E-02         1.60206E+00         3.91532E-01         1.60219E+00         4.08618E+01         1.00000E+00         2.61548E-11         4.08618E+01         2.42551E+00         3.84363E+01
+          2.54976E-02         2.91059E-03        -2.03110E-02         1.60206E+00         4.02202E-01         1.60219E+00         3.98184E+01         1.00000E+00         2.29289E-11         3.98184E+01         2.39704E+00         3.74214E+01
+          2.54976E-02         3.08042E-03        -2.03430E-02         1.60206E+00         4.12873E-01         1.60219E+00         3.87728E+01         1.00000E+00         1.99356E-11         3.87728E+01         2.36766E+00         3.64052E+01
+          2.54976E-02         3.25025E-03        -2.03767E-02         1.60206E+00         4.23543E-01         1.60219E+00         3.77264E+01         1.00000E+00         1.71754E-11         3.77264E+01         2.33740E+00         3.53890E+01
+          2.54976E-02         3.42008E-03        -2.04123E-02         1.60205E+00         4.34214E-01         1.60218E+00         3.66807E+01         1.00000E+00         1.46472E-11         3.66807E+01         2.30627E+00         3.43744E+01
+          2.54976E-02         3.58990E-03        -2.04497E-02         1.60205E+00         4.44884E-01         1.60218E+00         3.56369E+01         1.00000E+00         1.23483E-11         3.56369E+01         2.27428E+00         3.33627E+01
+          2.54976E-02         3.75973E-03        -2.04889E-02         1.60205E+00         4.55555E-01         1.60218E+00         3.45966E+01         1.00000E+00         1.02744E-11         3.45966E+01         2.24144E+00         3.23552E+01
+          2.54976E-02         3.92956E-03        -2.05299E-02         1.60205E+00         4.66225E-01         1.60218E+00         3.35610E+01         1.00000E+00         8.41957E-12         3.35610E+01         2.20778E+00         3.13533E+01
+          2.54976E-02         4.09939E-03        -2.05727E-02         1.60205E+00         4.76896E-01         1.60218E+00         3.25315E+01         1.00000E+00         6.77664E-12         3.25315E+01         2.17331E+00         3.03582E+01
+          2.54976E-02         4.26921E-03        -2.06174E-02         1.60205E+00         4.87567E-01         1.60218E+00         3.15093E+01         1.00000E+00         5.33703E-12         3.15093E+01         2.13806E+00         2.93712E+01
+          2.54976E-02         4.43904E-03        -2.06638E-02         1.60205E+00         4.98237E-01         1.60218E+00         3.04955E+01         1.00000E+00         4.09103E-12         3.04955E+01         2.10206E+00         2.83935E+01
+          2.54976E-02         4.60887E-03        -2.07121E-02         1.60205E+00         5.08908E-01         1.60218E+00         2.94915E+01         1.00000E+00         3.02796E-12         2.94915E+01         2.06533E+00         2.74261E+01
+          2.54976E-02         4.77869E-03        -2.07621E-02         1.60205E+00         5.19578E-01         1.60218E+00         2.84982E+01         1.00000E+00         2.13643E-12         2.84982E+01         2.02791E+00         2.64703E+01
+          2.54976E-02         4.94852E-03        -2.08140E-02         1.60204E+00         5.30249E-01         1.60218E+00         2.75168E+01         1.00000E+00         1.40506E-12         2.75168E+01         1.98982E+00         2.55269E+01
+          2.54976E-02         5.11835E-03        -2.08677E-02         1.60204E+00         5.40919E-01         1.60218E+00         2.65483E+01         1.00000E+00         8.24810E-13         2.65483E+01         1.95111E+00         2.45971E+01
+          2.54976E-02         5.28818E-03        -2.09232E-02         1.60204E+00         5.51590E-01         1.60218E+00         2.55936E+01         1.00000E+00         4.02494E-13         2.55936E+01         1.91181E+00         2.36818E+01
+          2.54976E-02         5.45800E-03        -2.09805E-02         1.60204E+00         5.62261E-01         1.60218E+00         2.46537E+01         1.00000E+00         2.46440E-13         2.46537E+01         1.87195E+00         2.27818E+01
+          2.54976E-02         5.62783E-03        -2.10397E-02         1.60204E+00         5.72931E-01         1.60218E+00         2.37295E+01         1.00000E+00         3.83168E-13         2.37295E+01         1.83159E+00         2.18979E+01
+          2.54976E-02         5.79766E-03        -2.11006E-02         1.60204E+00         5.83602E-01         1.60218E+00         2.28218E+01         1.00000E+00         5.37090E-13         2.28218E+01         1.79076E+00         2.10310E+01
+          2.54976E-02         5.96749E-03        -2.11633E-02         1.60204E+00         5.94272E-01         1.60218E+00         2.19312E+01         1.00000E+00         6.51263E-13         2.19312E+01         1.74952E+00         2.01817E+01
+          2.54976E-02         6.13731E-03        -2.12279E-02         1.60203E+00         6.04943E-01         1.60217E+00         2.10586E+01         1.00000E+00         7.34042E-13         2.10586E+01         1.70790E+00         1.93507E+01
+          2.54976E-02         6.30714E-03        -2.12943E-02         1.60203E+00         6.15613E-01         1.60217E+00         2.02046E+01         1.00000E+00         8.02767E-13         2.02046E+01         1.66596E+00         1.85386E+01
+          2.54976E-02         6.47697E-03        -2.13625E-02         1.60203E+00         6.26284E-01         1.60217E+00         1.93697E+01         1.00000E+00         8.74526E-13         1.93697E+01         1.62375E+00         1.77460E+01
+          2.54976E-02         6.64680E-03        -2.14325E-02         1.60203E+00         6.36955E-01         1.60217E+00         1.85546E+01         1.00000E+00         9.61638E-13         1.85546E+01         1.58132E+00         1.69733E+01
+          2.54976E-02         6.81662E-03        -2.15043E-02         1.60203E+00         6.47625E-01         1.60217E+00         1.77596E+01         1.00000E+00         1.06931E-12         1.77596E+01         1.53872E+00         1.62209E+01
+          2.54976E-02         6.98645E-03        -2.15779E-02         1.60202E+00         6.58296E-01         1.60217E+00         1.69853E+01         1.00000E+00         1.19632E-12         1.69853E+01         1.49602E+00         1.54892E+01
+          2.54976E-02         7.15628E-03        -2.16533E-02         1.60202E+00         6.68966E-01         1.60217E+00         1.62319E+01         1.00000E+00         1.33773E-12         1.62319E+01         1.45326E+00         1.47786E+01
+          2.54976E-02         7.32611E-03        -2.17306E-02         1.60202E+00         6.79637E-01         1.60217E+00         1.54998E+01         1.00000E+00         1.48784E-12         1.54998E+01         1.41051E+00         1.40893E+01
+          2.54976E-02         7.49593E-03        -2.18096E-02         1.60202E+00         6.90307E-01         1.60217E+00         1.47893E+01         1.00000E+00         1.64217E-12         1.47893E+01         1.36782E+00         1.34215E+01
+          2.54976E-02         7.66576E-03        -2.18905E-02         1.60202E+00         7.00978E-01         1.60217E+00         1.41006E+01         1.00000E+00         1.79859E-12         1.41006E+01         1.32525E+00         1.27753E+01
+          2.54976E-02         7.83559E-03        -2.19732E-02         1.60201E+00         7.11649E-01         1.60217E+00         1.34338E+01         1.00000E+00         1.95791E-12         1.34338E+01         1.28285E+00         1.21509E+01
+          2.54976E-02         8.00542E-03        -2.20577E-02         1.60201E+00         7.22319E-01         1.60216E+00         1.27891E+01         1.00000E+00         2.12402E-12         1.27891E+01         1.24070E+00         1.15484E+01
+          2.54976E-02         8.17524E-03        -2.21440E-02         1.60201E+00         7.32990E-01         1.60216E+00         1.21664E+01         1.00000E+00         2.30368E-12         1.21664E+01         1.19885E+00         1.09676E+01
+          2.54976E-02         8.34507E-03        -2.22321E-02         1.60201E+00         7.43660E-01         1.60216E+00         1.15659E+01         1.00000E+00         2.50586E-12         1.15659E+01         1.15735E+00         1.04086E+01
+          2.54976E-02         8.51490E-03        -2.23220E-02         1.60201E+00         7.54331E-01         1.60216E+00         1.09875E+01         1.00000E+00         2.74064E-12         1.09875E+01         1.11627E+00         9.87121E+00
+          2.54976E-02         8.68473E-03        -2.24138E-02         1.60200E+00         7.65001E-01         1.60216E+00         1.04311E+01         1.00000E+00         3.01776E-12         1.04311E+01         1.07567E+00         9.35540E+00
+          2.54976E-02         8.85455E-03        -2.25073E-02         1.60200E+00         7.75672E-01         1.60216E+00         9.89656E+00         1.00000E+00         3.34525E-12         9.89656E+00         1.03560E+00         8.86096E+00
+          2.54976E-02         9.02438E-03        -2.26027E-02         1.60200E+00         7.86343E-01         1.60216E+00         9.38377E+00         1.00000E+00         3.72840E-12         9.38377E+00         9.96120E-01         8.38765E+00
+          2.54976E-02         9.19421E-03        -2.26998E-02         1.60200E+00         7.97013E-01         1.60216E+00         8.89252E+00         1.00000E+00         4.16938E-12         8.89252E+00         9.57289E-01         7.93523E+00
+          2.54976E-02         9.36403E-03        -2.27988E-02         1.60199E+00         8.07684E-01         1.60216E+00         8.42256E+00         1.00000E+00         4.66734E-12         8.42256E+00         9.19161E-01         7.50340E+00
+          2.54976E-02         9.53386E-03        -2.28996E-02         1.60199E+00         8.18354E-01         1.60215E+00         7.97363E+00         1.00000E+00         5.21882E-12         7.97363E+00         8.81789E-01         7.09184E+00
+          2.54976E-02         9.70369E-03        -2.30022E-02         1.60199E+00         8.29025E-01         1.60215E+00         7.54542E+00         1.00000E+00         5.81829E-12         7.54542E+00         8.45227E-01         6.70019E+00
+          2.54976E-02         9.87352E-03        -2.31067E-02         1.60199E+00         8.39695E-01         1.60215E+00         7.13759E+00         1.00000E+00         6.45858E-12         7.13759E+00         8.09524E-01         6.32806E+00
+          2.54976E-02         1.00433E-02        -2.32129E-02         1.60198E+00         8.50366E-01         1.60215E+00         6.74977E+00         1.00000E+00         7.13131E-12         6.74977E+00         7.74730E-01         5.97504E+00
+          2.54976E-02         1.02132E-02        -2.33209E-02         1.60198E+00         8.61037E-01         1.60215E+00         6.38157E+00         1.00000E+00         7.82707E-12         6.38157E+00         7.40891E-01         5.64068E+00
+          2.54976E-02         1.03830E-02        -2.34308E-02         1.60198E+00         8.71707E-01         1.60215E+00         6.03257E+00         1.00000E+00         8.53572E-12         6.03257E+00         7.08053E-01         5.32452E+00
+          2.54976E-02         1.05528E-02        -2.35425E-02         1.60197E+00         8.82378E-01         1.60215E+00         5.70233E+00         1.00000E+00         9.24644E-12         5.70233E+00         6.76258E-01         5.02607E+00
+          2.54976E-02         1.07227E-02        -2.36559E-02         1.60197E+00         8.93048E-01         1.60215E+00         5.39038E+00         1.00000E+00         9.94792E-12         5.39038E+00         6.45545E-01         4.74484E+00
+          2.54976E-02         1.08925E-02        -2.37712E-02         1.60197E+00         9.03719E-01         1.60215E+00         5.09625E+00         1.00000E+00         1.06284E-11         5.09625E+00         6.15953E-01         4.48030E+00
+          2.54976E-02         1.10623E-02        -2.38883E-02         1.60197E+00         9.14389E-01         1.60214E+00         4.81943E+00         1.00000E+00         1.12759E-11         4.81943E+00         5.87515E-01         4.23191E+00
+          2.54976E-02         1.12321E-02        -2.40072E-02         1.60196E+00         9.25060E-01         1.60214E+00         4.55940E+00         1.00000E+00         1.18780E-11         4.55940E+00         5.60265E-01         3.99914E+00
+          2.54976E-02         1.14020E-02        -2.41280E-02         1.60196E+00         9.35731E-01         1.60214E+00         4.31565E+00         1.00000E+00         1.24223E-11         4.31565E+00         5.34230E-01         3.78142E+00
+          2.54976E-02         1.15718E-02        -2.42505E-02         1.60196E+00         9.46401E-01         1.60214E+00         4.08763E+00         1.00000E+00         1.28963E-11         4.08763E+00         5.09437E-01         3.57819E+00
+          2.54976E-02         1.17416E-02        -2.43749E-02         1.60195E+00         9.57072E-01         1.60214E+00         3.87479E+00         1.00000E+00         1.32875E-11         3.87479E+00         4.85909E-01         3.38888E+00
+          2.54976E-02         1.19114E-02        -2.45010E-02         1.60195E+00         9.67742E-01         1.60214E+00         3.67658E+00         1.00000E+00         1.35833E-11         3.67658E+00         4.63665E-01         3.21291E+00
+          2.54976E-02         1.20813E-02        -2.46290E-02         1.60195E+00         9.78413E-01         1.60214E+00         3.49244E+00         1.00000E+00         1.37717E-11         3.49244E+00         4.42722E-01         3.04971E+00
+          2.54976E-02         1.22511E-02        -2.47588E-02         1.60194E+00         9.89083E-01         1.60213E+00         3.32180E+00         1.00000E+00         1.38407E-11         3.32180E+00         4.23093E-01         2.89871E+00
+          2.54976E-02         1.24209E-02        -2.48904E-02         1.60194E+00         9.99754E-01         1.60213E+00         3.16410E+00         1.00000E+00         1.37787E-11         3.16410E+00         4.04787E-01         2.75932E+00
+          2.54976E-02         1.25908E-02        -2.50238E-02         1.60194E+00         1.01042E+00         1.60213E+00         3.01878E+00         1.00000E+00         1.35746E-11         3.01878E+00         3.87811E-01         2.63097E+00
+          2.54976E-02         1.27606E-02        -2.51590E-02         1.60193E+00         1.02110E+00         1.60213E+00         2.88527E+00         1.00000E+00         1.32182E-11         2.88527E+00         3.72168E-01         2.51310E+00
+          2.54976E-02         1.29304E-02        -2.52961E-02         1.60193E+00         1.03177E+00         1.60213E+00         2.76301E+00         1.00000E+00         1.26998E-11         2.76301E+00         3.57858E-01         2.40515E+00
+          2.54976E-02         1.31002E-02        -2.54349E-02         1.60193E+00         1.04244E+00         1.60213E+00         2.65143E+00         1.00000E+00         1.20110E-11         2.65143E+00         3.44875E-01         2.30656E+00
+          2.54976E-02         1.32701E-02        -2.55756E-02         1.60192E+00         1.05311E+00         1.60213E+00         2.55000E+00         1.00000E+00         1.11451E-11         2.55000E+00         3.33214E-01         2.21678E+00
+          2.54976E-02         1.34399E-02        -2.57180E-02         1.60192E+00         1.06378E+00         1.60213E+00         2.45815E+00         1.00000E+00         1.00976E-11         2.45815E+00         3.22864E-01         2.13529E+00
+          2.54976E-02         1.36097E-02        -2.58623E-02         1.60192E+00         1.07445E+00         1.60212E+00         2.37537E+00         1.00000E+00         8.86891E-12         2.37537E+00         3.13810E-01         2.06156E+00
+          2.54976E-02         1.37795E-02        -2.60084E-02         1.60191E+00         1.08512E+00         1.60212E+00         2.30112E+00         1.00000E+00         7.46832E-12         2.30112E+00         3.06035E-01         1.99508E+00
+          2.54976E-02         1.39494E-02        -2.61563E-02         1.60191E+00         1.09579E+00         1.60212E+00         2.23488E+00         1.00000E+00         5.92862E-12         2.23488E+00         2.99519E-01         1.93536E+00
+          2.54976E-02         1.41192E-02        -2.63061E-02         1.60190E+00         1.10646E+00         1.60212E+00         2.17614E+00         1.00000E+00         4.35616E-12         2.17614E+00         2.94238E-01         1.88190E+00
+          2.54976E-02         1.42890E-02        -2.64576E-02         1.60190E+00         1.11713E+00         1.60212E+00         2.12442E+00         1.00000E+00         3.13621E-12         2.12442E+00         2.90165E-01         1.83426E+00
+          2.54976E-02         1.44589E-02        -2.66109E-02         1.60190E+00         1.12780E+00         1.60212E+00         2.07924E+00         1.00000E+00         3.26848E-12         2.07924E+00         2.87271E-01         1.79196E+00
+          2.54976E-02         1.46287E-02        -2.67661E-02         1.60189E+00         1.13847E+00         1.60212E+00         2.04011E+00         1.00000E+00         4.98450E-12         2.04011E+00         2.85522E-01         1.75459E+00
+          2.54976E-02         1.47985E-02        -2.69231E-02         1.60189E+00         1.14914E+00         1.60211E+00         2.00661E+00         1.00000E+00         7.48381E-12         2.00661E+00         2.84885E-01         1.72172E+00
+          2.54976E-02         1.49683E-02        -2.70818E-02         1.60188E+00         1.15981E+00         1.60211E+00         1.97827E+00         1.00000E+00         1.04013E-11         1.97827E+00         2.85320E-01         1.69295E+00
+          2.54976E-02         1.51382E-02        -2.72424E-02         1.60188E+00         1.17048E+00         1.60211E+00         1.95469E+00         1.00000E+00         1.36273E-11         1.95469E+00         2.86788E-01         1.66790E+00
+          2.54976E-02         1.53080E-02        -2.74048E-02         1.60188E+00         1.18115E+00         1.60211E+00         1.93546E+00         1.00000E+00         1.71210E-11         1.93546E+00         2.89245E-01         1.64621E+00
+          2.54976E-02         1.54778E-02        -2.75690E-02         1.60187E+00         1.19182E+00         1.60211E+00         1.92018E+00         1.00000E+00         2.08622E-11         1.92018E+00         2.92647E-01         1.62753E+00
+          2.54976E-02         1.56476E-02        -2.77351E-02         1.60187E+00         1.20249E+00         1.60211E+00         1.90847E+00         1.00000E+00         2.48381E-11         1.90847E+00         2.96946E-01         1.61153E+00
+          2.54976E-02         1.58175E-02        -2.79029E-02         1.60186E+00         1.21317E+00         1.60211E+00         1.89999E+00         1.00000E+00         2.90376E-11         1.89999E+00         3.02094E-01         1.59790E+00
+          2.54976E-02         1.59873E-02        -2.80726E-02         1.60186E+00         1.22384E+00         1.60211E+00         1.89439E+00         1.00000E+00         3.34503E-11         1.89439E+00         3.08040E-01         1.58635E+00
+          2.54976E-02         1.61571E-02        -2.82440E-02         1.60185E+00         1.23451E+00         1.60210E+00         1.89135E+00         1.00000E+00         3.80651E-11         1.89135E+00         3.14732E-01         1.57662E+00
+          2.54976E-02         1.63270E-02        -2.84173E-02         1.60185E+00         1.24518E+00         1.60210E+00         1.89055E+00         1.00000E+00         4.28700E-11         1.89055E+00         3.22116E-01         1.56843E+00
+          2.54976E-02         1.64968E-02        -2.85924E-02         1.60185E+00         1.25585E+00         1.60210E+00         1.89170E+00         1.00000E+00         4.78514E-11         1.89170E+00         3.30137E-01         1.56157E+00
+          2.54976E-02         1.66666E-02        -2.87693E-02         1.60184E+00         1.26652E+00         1.60210E+00         1.89454E+00         1.00000E+00         5.29944E-11         1.89454E+00         3.38740E-01         1.55580E+00
+          2.54976E-02         1.68364E-02        -2.89480E-02         1.60184E+00         1.27719E+00         1.60210E+00         1.89879E+00         1.00000E+00         5.82825E-11         1.89879E+00         3.47868E-01         1.55092E+00
+          2.54976E-02         1.70063E-02        -2.91286E-02         1.60183E+00         1.28786E+00         1.60210E+00         1.90422E+00         1.00000E+00         6.36972E-11         1.90422E+00         3.57464E-01         1.54675E+00
+          2.54976E-02         1.71761E-02        -2.93109E-02         1.60183E+00         1.29853E+00         1.60210E+00         1.91059E+00         1.00000E+00         6.92185E-11         1.91059E+00         3.67471E-01         1.54312E+00
+          2.54976E-02         1.73459E-02        -2.94950E-02         1.60182E+00         1.30920E+00         1.60209E+00         1.91771E+00         1.00000E+00         7.48241E-11         1.91771E+00         3.77830E-01         1.53988E+00
+          2.54976E-02         1.75158E-02        -2.96810E-02         1.60182E+00         1.31987E+00         1.60209E+00         1.92536E+00         1.00000E+00         8.04901E-11         1.92536E+00         3.88484E-01         1.53687E+00
+          2.54976E-02         1.76856E-02        -2.98688E-02         1.60181E+00         1.33054E+00         1.60209E+00         1.93336E+00         1.00000E+00         8.61902E-11         1.93336E+00         3.99375E-01         1.53399E+00
+          2.54976E-02         1.78554E-02        -3.00584E-02         1.60181E+00         1.34121E+00         1.60209E+00         1.94156E+00         1.00000E+00         9.18963E-11         1.94156E+00         4.10445E-01         1.53111E+00
+          2.54976E-02         1.80252E-02        -3.02498E-02         1.60180E+00         1.35188E+00         1.60209E+00         1.94978E+00         1.00000E+00         9.75780E-11         1.94978E+00         4.21638E-01         1.52814E+00
+          2.54976E-02         1.81951E-02        -3.04430E-02         1.60180E+00         1.36255E+00         1.60209E+00         1.95790E+00         1.00000E+00         1.03203E-10         1.95790E+00         4.32898E-01         1.52500E+00
+          2.54976E-02         1.83649E-02        -3.06380E-02         1.60179E+00         1.37322E+00         1.60209E+00         1.96578E+00         1.00000E+00         1.08735E-10         1.96578E+00         4.44169E-01         1.52161E+00
+          2.54976E-02         1.85347E-02        -3.08349E-02         1.60179E+00         1.38389E+00         1.60209E+00         1.97330E+00         1.00000E+00         1.14140E-10         1.97330E+00         4.55396E-01         1.51791E+00
+          2.54976E-02         1.87045E-02        -3.10335E-02         1.60178E+00         1.39457E+00         1.60208E+00         1.98037E+00         1.00000E+00         1.19376E-10         1.98037E+00         4.66528E-01         1.51384E+00
+          2.54976E-02         1.88744E-02        -3.12340E-02         1.60178E+00         1.40524E+00         1.60208E+00         1.98688E+00         1.00000E+00         1.24402E-10         1.98688E+00         4.77511E-01         1.50937E+00
+          2.54976E-02         1.90442E-02        -3.14363E-02         1.60177E+00         1.41591E+00         1.60208E+00         1.99276E+00         1.00000E+00         1.29175E-10         1.99276E+00         4.88296E-01         1.50447E+00
+          2.54976E-02         1.92140E-02        -3.16403E-02         1.60177E+00         1.42658E+00         1.60208E+00         1.99793E+00         1.00000E+00         1.33650E-10         1.99793E+00         4.98834E-01         1.49910E+00
+          2.54976E-02         1.93839E-02        -3.18462E-02         1.60176E+00         1.43725E+00         1.60208E+00         2.00233E+00         1.00000E+00         1.37777E-10         2.00233E+00         5.09079E-01         1.49326E+00
+          2.54976E-02         1.95537E-02        -3.20540E-02         1.60176E+00         1.44792E+00         1.60208E+00         2.00591E+00         1.00000E+00         1.41507E-10         2.00591E+00         5.18985E-01         1.48692E+00
+          2.54976E-02         1.97235E-02        -3.22635E-02         1.60175E+00         1.45859E+00         1.60208E+00         2.00861E+00         1.00000E+00         1.44789E-10         2.00861E+00         5.28511E-01         1.48010E+00
+          2.54976E-02         1.98933E-02        -3.24748E-02         1.60175E+00         1.46926E+00         1.60208E+00         2.01041E+00         1.00000E+00         1.47568E-10         2.01041E+00         5.37614E-01         1.47279E+00
+          2.54976E-02         2.00632E-02        -3.26880E-02         1.60174E+00         1.47993E+00         1.60207E+00         2.01126E+00         1.00000E+00         1.49790E-10         2.01126E+00         5.46258E-01         1.46500E+00
+          2.54976E-02         2.02330E-02        -3.29029E-02         1.60174E+00         1.49060E+00         1.60207E+00         2.01115E+00         1.00000E+00         1.51397E-10         2.01115E+00         5.54406E-01         1.45675E+00
+          2.54976E-02         2.04028E-02        -3.31197E-02         1.60173E+00         1.50127E+00         1.60207E+00         2.01006E+00         1.00000E+00         1.52331E-10         2.01006E+00         5.62024E-01         1.44804E+00
+          2.54976E-02         2.05726E-02        -3.33383E-02         1.60172E+00         1.51194E+00         1.60207E+00         2.00798E+00         1.00000E+00         1.52535E-10         2.00798E+00         5.69081E-01         1.43890E+00
+          2.54976E-02         2.07425E-02        -3.35587E-02         1.60172E+00         1.52261E+00         1.60207E+00         2.00490E+00         1.00000E+00         1.51947E-10         2.00490E+00         5.75550E-01         1.42935E+00
+          2.54976E-02         2.09123E-02        -3.37809E-02         1.60171E+00         1.53328E+00         1.60207E+00         2.00081E+00         1.00000E+00         1.50509E-10         2.00081E+00         5.81404E-01         1.41941E+00
+          2.54976E-02         2.10821E-02        -3.40050E-02         1.60171E+00         1.54395E+00         1.60207E+00         1.99573E+00         1.00000E+00         1.48161E-10         1.99573E+00         5.86620E-01         1.40911E+00
+          2.54976E-02         2.12520E-02        -3.42308E-02         1.60170E+00         1.55462E+00         1.60207E+00         1.98965E+00         1.00000E+00         1.44844E-10         1.98965E+00         5.91178E-01         1.39847E+00
+          2.54976E-02         2.14218E-02        -3.44585E-02         1.60170E+00         1.56529E+00         1.60207E+00         1.98259E+00         1.00000E+00         1.40501E-10         1.98259E+00         5.95060E-01         1.38753E+00
+          2.54976E-02         2.15916E-02        -3.46879E-02         1.60169E+00         1.57596E+00         1.60207E+00         1.97457E+00         1.00000E+00         1.35077E-10         1.97457E+00         5.98252E-01         1.37632E+00
+          2.54976E-02         2.17614E-02        -3.49192E-02         1.60168E+00         1.58664E+00         1.60207E+00         1.96559E+00         1.00000E+00         1.28522E-10         1.96559E+00         6.00741E-01         1.36485E+00
+          2.54976E-02         2.19313E-02        -3.51523E-02         1.60168E+00         1.59731E+00         1.60206E+00         1.95567E+00         1.00000E+00         1.20791E-10         1.95567E+00         6.02518E-01         1.35315E+00
+          2.54976E-02         2.21011E-02        -3.53872E-02         1.60167E+00         1.60798E+00         1.60206E+00         1.94484E+00         1.00000E+00         1.11848E-10         1.94484E+00         6.03576E-01         1.34127E+00
+          2.54976E-02         2.22709E-02        -3.56239E-02         1.60167E+00         1.61865E+00         1.60206E+00         1.93312E+00         1.00000E+00         1.01676E-10         1.93312E+00         6.03911E-01         1.32921E+00
+          2.54976E-02         2.24407E-02        -3.58625E-02         1.60166E+00         1.62932E+00         1.60206E+00         1.92053E+00         1.00000E+00         9.02838E-11         1.92053E+00         6.03522E-01         1.31701E+00
+          2.54976E-02         2.26106E-02        -3.61028E-02         1.60165E+00         1.63999E+00         1.60206E+00         1.90709E+00         1.00000E+00         7.77364E-11         1.90709E+00         6.02411E-01         1.30468E+00
+          2.54976E-02         2.27804E-02        -3.63450E-02         1.60165E+00         1.65066E+00         1.60206E+00         1.89284E+00         1.00000E+00         6.42257E-11         1.89284E+00         6.00580E-01         1.29226E+00
+          2.54976E-02         2.29502E-02        -3.65889E-02         1.60164E+00         1.66133E+00         1.60206E+00         1.87780E+00         1.00000E+00         5.02716E-11         1.87780E+00         5.98036E-01         1.27976E+00
+          2.54976E-02         2.31201E-02        -3.68347E-02         1.60164E+00         1.67200E+00         1.60206E+00         1.86199E+00         1.00000E+00         3.74043E-11         1.86199E+00         5.94789E-01         1.26720E+00
+          2.54976E-02         2.32899E-02        -3.70823E-02         1.60163E+00         1.68267E+00         1.60206E+00         1.84544E+00         1.00000E+00         3.01503E-11         1.84544E+00         5.90849E-01         1.25459E+00
+          2.54976E-02         2.34597E-02        -3.73317E-02         1.60162E+00         1.69334E+00         1.60206E+00         1.82819E+00         1.00000E+00         3.52812E-11         1.82819E+00         5.86229E-01         1.24196E+00
+          2.54976E-02         2.36295E-02        -3.75829E-02         1.60162E+00         1.70401E+00         1.60206E+00         1.81025E+00         1.00000E+00         5.11107E-11         1.81025E+00         5.80945E-01         1.22931E+00
+          2.54976E-02         2.37994E-02        -3.78360E-02         1.60161E+00         1.71468E+00         1.60206E+00         1.79166E+00         1.00000E+00         7.23530E-11         1.79166E+00         5.75014E-01         1.21665E+00
+          2.54976E-02         2.39692E-02        -3.80908E-02         1.60160E+00         1.72535E+00         1.60206E+00         1.77245E+00         1.00000E+00         9.67035E-11         1.77245E+00         5.68456E-01         1.20400E+00
+          2.54976E-02         2.41390E-02        -3.83475E-02         1.60160E+00         1.73602E+00         1.60206E+00         1.75264E+00         1.00000E+00         1.23345E-10         1.75264E+00         5.61292E-01         1.19135E+00
+          2.54976E-02         2.43088E-02        -3.86060E-02         1.60159E+00         1.74669E+00         1.60206E+00         1.73227E+00         1.00000E+00         1.51936E-10         1.73227E+00         5.53545E-01         1.17872E+00
+          2.54976E-02         2.44787E-02        -3.88662E-02         1.60158E+00         1.75736E+00         1.60206E+00         1.71135E+00         1.00000E+00         1.82296E-10         1.71135E+00         5.45240E-01         1.16611E+00
+          2.54976E-02         2.46485E-02        -3.91283E-02         1.60158E+00         1.76804E+00         1.60206E+00         1.68992E+00         1.00000E+00         2.14304E-10         1.68992E+00         5.36402E-01         1.15352E+00
+          2.54976E-02         2.48183E-02        -3.93923E-02         1.60157E+00         1.77871E+00         1.60205E+00         1.66800E+00         1.00000E+00         2.47862E-10         1.66800E+00         5.27059E-01         1.14094E+00
+          2.54976E-02         2.49882E-02        -3.96580E-02         1.60156E+00         1.78938E+00         1.60205E+00         1.64563E+00         1.00000E+00         2.82875E-10         1.64563E+00         5.17239E-01         1.12839E+00
+          2.54976E-02         2.51580E-02        -3.99255E-02         1.60156E+00         1.80005E+00         1.60205E+00         1.62282E+00         1.00000E+00         3.19246E-10         1.62282E+00         5.06972E-01         1.11585E+00
+          2.54976E-02         2.53278E-02        -4.01949E-02         1.60155E+00         1.81072E+00         1.60205E+00         1.59961E+00         1.00000E+00         3.56869E-10         1.59961E+00         4.96288E-01         1.10332E+00
+          2.54976E-02         2.54976E-02        -4.04661E-02         1.60154E+00         1.82139E+00         1.60205E+00         1.57601E+00         1.00000E+00         3.95627E-10         1.57601E+00         4.85220E-01         1.09079E+00
+          2.54976E-02         2.56675E-02        -4.07390E-02         1.60154E+00         1.83206E+00         1.60205E+00         1.55207E+00         1.00000E+00         4.35391E-10         1.55207E+00         4.73798E-01         1.07827E+00
+          2.54976E-02         2.58373E-02        -4.10138E-02         1.60153E+00         1.84273E+00         1.60205E+00         1.52780E+00         1.00000E+00         4.76018E-10         1.52780E+00         4.62055E-01         1.06574E+00
+          2.54976E-02         2.60071E-02        -4.12904E-02         1.60152E+00         1.85340E+00         1.60205E+00         1.50323E+00         1.00000E+00         5.17353E-10         1.50323E+00         4.50025E-01         1.05320E+00
+          2.54976E-02         2.61769E-02        -4.15689E-02         1.60151E+00         1.86407E+00         1.60205E+00         1.47838E+00         1.00000E+00         5.59223E-10         1.47838E+00         4.37740E-01         1.04064E+00
+          2.56675E-02         8.72665E-04        -2.03419E-02         1.61273E+00         2.74155E-01         1.61286E+00         5.07251E+01         1.00000E+00         7.29286E-11         5.07251E+01         2.49372E+00         4.82314E+01
+          2.56675E-02         1.04249E-03        -2.03522E-02         1.61273E+00         2.84826E-01         1.61286E+00         4.98253E+01         1.00000E+00         6.79171E-11         4.98253E+01         2.47856E+00         4.73467E+01
+          2.56675E-02         1.21232E-03        -2.03642E-02         1.61273E+00         2.95496E-01         1.61286E+00         4.89067E+01         1.00000E+00         6.30036E-11         4.89067E+01         2.46260E+00         4.64441E+01
+          2.56675E-02         1.38215E-03        -2.03780E-02         1.61273E+00         3.06167E-01         1.61286E+00         4.79709E+01         1.00000E+00         5.82068E-11         4.79709E+01         2.44585E+00         4.55251E+01
+          2.56675E-02         1.55197E-03        -2.03937E-02         1.61273E+00         3.16838E-01         1.61286E+00         4.70194E+01         1.00000E+00         5.35442E-11         4.70194E+01         2.42828E+00         4.45911E+01
+          2.56675E-02         1.72180E-03        -2.04111E-02         1.61273E+00         3.27508E-01         1.61286E+00         4.60538E+01         1.00000E+00         4.90317E-11         4.60538E+01         2.40988E+00         4.36439E+01
+          2.56675E-02         1.89163E-03        -2.04304E-02         1.61273E+00         3.38179E-01         1.61286E+00         4.50754E+01         1.00000E+00         4.46839E-11         4.50754E+01         2.39065E+00         4.26848E+01
+          2.56675E-02         2.06146E-03        -2.04515E-02         1.61273E+00         3.48849E-01         1.61286E+00         4.40859E+01         1.00000E+00         4.05138E-11         4.40859E+01         2.37056E+00         4.17154E+01
+          2.56675E-02         2.23128E-03        -2.04744E-02         1.61273E+00         3.59520E-01         1.61286E+00         4.30868E+01         1.00000E+00         3.65327E-11         4.30868E+01         2.34963E+00         4.07372E+01
+          2.56675E-02         2.40111E-03        -2.04991E-02         1.61273E+00         3.70190E-01         1.61286E+00         4.20796E+01         1.00000E+00         3.27504E-11         4.20796E+01         2.32783E+00         3.97518E+01
+          2.56675E-02         2.57094E-03        -2.05256E-02         1.61273E+00         3.80861E-01         1.61286E+00         4.10658E+01         1.00000E+00         2.91749E-11         4.10658E+01         2.30517E+00         3.87606E+01
+          2.56675E-02         2.74077E-03        -2.05539E-02         1.61273E+00         3.91532E-01         1.61286E+00         4.00468E+01         1.00000E+00         2.58126E-11         4.00468E+01         2.28165E+00         3.77652E+01
+          2.56675E-02         2.91059E-03        -2.05841E-02         1.61273E+00         4.02202E-01         1.61286E+00         3.90242E+01         1.00000E+00         2.26681E-11         3.90242E+01         2.25726E+00         3.67670E+01
+          2.56675E-02         3.08042E-03        -2.06160E-02         1.61273E+00         4.12873E-01         1.61286E+00         3.79994E+01         1.00000E+00         1.97444E-11         3.79994E+01         2.23200E+00         3.57674E+01
+          2.56675E-02         3.25025E-03        -2.06498E-02         1.61273E+00         4.23543E-01         1.61286E+00         3.69739E+01         1.00000E+00         1.70428E-11         3.69739E+01         2.20589E+00         3.47680E+01
+          2.56675E-02         3.42008E-03        -2.06854E-02         1.61273E+00         4.34214E-01         1.61286E+00         3.59490E+01         1.00000E+00         1.45630E-11         3.59490E+01         2.17892E+00         3.37700E+01
+          2.56675E-02         3.58990E-03        -2.07228E-02         1.61272E+00         4.44884E-01         1.61286E+00         3.49260E+01         1.00000E+00         1.23032E-11         3.49260E+01         2.15110E+00         3.27749E+01
+          2.56675E-02         3.75973E-03        -2.07620E-02         1.61272E+00         4.55555E-01         1.61286E+00         3.39065E+01         1.00000E+00         1.02600E-11         3.39065E+01         2.12245E+00         3.17840E+01
+          2.56675E-02         3.92956E-03        -2.08030E-02         1.61272E+00         4.66225E-01         1.61286E+00         3.28916E+01         1.00000E+00         8.42849E-12         3.28916E+01         2.09298E+00         3.07986E+01
+          2.56675E-02         4.09939E-03        -2.08458E-02         1.61272E+00         4.76896E-01         1.61286E+00         3.18826E+01         1.00000E+00         6.80262E-12         3.18826E+01         2.06271E+00         2.98199E+01
+          2.56675E-02         4.26921E-03        -2.08904E-02         1.61272E+00         4.87567E-01         1.61286E+00         3.08808E+01         1.00000E+00         5.37498E-12         3.08808E+01         2.03164E+00         2.88491E+01
+          2.56675E-02         4.43904E-03        -2.09369E-02         1.61272E+00         4.98237E-01         1.61285E+00         2.98873E+01         1.00000E+00         4.13705E-12         2.98873E+01         1.99981E+00         2.78875E+01
+          2.56675E-02         4.60887E-03        -2.09851E-02         1.61272E+00         5.08908E-01         1.61285E+00         2.89033E+01         1.00000E+00         3.07933E-12         2.89033E+01         1.96723E+00         2.69361E+01
+          2.56675E-02         4.77869E-03        -2.10352E-02         1.61272E+00         5.19578E-01         1.61285E+00         2.79299E+01         1.00000E+00         2.19151E-12         2.79299E+01         1.93393E+00         2.59960E+01
+          2.56675E-02         4.94852E-03        -2.10871E-02         1.61271E+00         5.30249E-01         1.61285E+00         2.69682E+01         1.00000E+00         1.46279E-12         2.69682E+01         1.89993E+00         2.50682E+01
+          2.56675E-02         5.11835E-03        -2.11408E-02         1.61271E+00         5.40919E-01         1.61285E+00         2.60190E+01         1.00000E+00         8.82688E-13         2.60190E+01         1.86528E+00         2.41538E+01
+          2.56675E-02         5.28818E-03        -2.11963E-02         1.61271E+00         5.51590E-01         1.61285E+00         2.50835E+01         1.00000E+00         4.44629E-13         2.50835E+01         1.82999E+00         2.32535E+01
+          2.56675E-02         5.45800E-03        -2.12536E-02         1.61271E+00         5.62261E-01         1.61285E+00         2.41625E+01         1.00000E+00         1.77263E-13         2.41625E+01         1.79410E+00         2.23684E+01
+          2.56675E-02         5.62783E-03        -2.13127E-02         1.61271E+00         5.72931E-01         1.61285E+00         2.32569E+01         1.00000E+00         2.10638E-13         2.32569E+01         1.75765E+00         2.14992E+01
+          2.56675E-02         5.79766E-03        -2.13737E-02         1.61271E+00         5.83602E-01         1.61285E+00         2.23673E+01         1.00000E+00         3.15074E-13         2.23673E+01         1.72068E+00         2.06467E+01
+          2.56675E-02         5.96749E-03        -2.14364E-02         1.61271E+00         5.94272E-01         1.61285E+00         2.14947E+01         1.00000E+00         3.61672E-13         2.14947E+01         1.68322E+00         1.98115E+01
+          2.56675E-02         6.13731E-03        -2.15010E-02         1.61270E+00         6.04943E-01         1.61285E+00         2.06397E+01         1.00000E+00         3.49401E-13         2.06397E+01         1.64533E+00         1.89943E+01
+          2.56675E-02         6.30714E-03        -2.15673E-02         1.61270E+00         6.15613E-01         1.61285E+00         1.98028E+01         1.00000E+00         2.91271E-13         1.98028E+01         1.60704E+00         1.81958E+01
+          2.56675E-02         6.47697E-03        -2.16355E-02         1.61270E+00         6.26284E-01         1.61285E+00         1.89848E+01         1.00000E+00         2.08803E-13         1.89848E+01         1.56841E+00         1.74164E+01
+          2.56675E-02         6.64680E-03        -2.17055E-02         1.61270E+00         6.36955E-01         1.61284E+00         1.81861E+01         1.00000E+00         1.54255E-13         1.81861E+01         1.52947E+00         1.66566E+01
+          2.56675E-02         6.81662E-03        -2.17773E-02         1.61270E+00         6.47625E-01         1.61284E+00         1.74072E+01         1.00000E+00         2.09256E-13         1.74072E+01         1.49028E+00         1.59169E+01
+          2.56675E-02         6.98645E-03        -2.18510E-02         1.61270E+00         6.58296E-01         1.61284E+00         1.66485E+01         1.00000E+00         3.32370E-13         1.66485E+01         1.45089E+00         1.51976E+01
+          2.56675E-02         7.15628E-03        -2.19264E-02         1.61269E+00         6.68966E-01         1.61284E+00         1.59103E+01         1.00000E+00         4.66947E-13         1.59103E+01         1.41136E+00         1.44990E+01
+          2.56675E-02         7.32611E-03        -2.20036E-02         1.61269E+00         6.79637E-01         1.61284E+00         1.51931E+01         1.00000E+00         5.91145E-13         1.51931E+01         1.37173E+00         1.38214E+01
+          2.56675E-02         7.49593E-03        -2.20827E-02         1.61269E+00         6.90307E-01         1.61284E+00         1.44970E+01         1.00000E+00         6.92768E-13         1.44970E+01         1.33206E+00         1.31649E+01
+          2.56675E-02         7.66576E-03        -2.21636E-02         1.61269E+00         7.00978E-01         1.61284E+00         1.38222E+01         1.00000E+00         7.62826E-13         1.38222E+01         1.29241E+00         1.25298E+01
+          2.56675E-02         7.83559E-03        -2.22462E-02         1.61268E+00         7.11649E-01         1.61284E+00         1.31690E+01         1.00000E+00         7.94225E-13         1.31690E+01         1.25283E+00         1.19161E+01
+          2.56675E-02         8.00542E-03        -2.23307E-02         1.61268E+00         7.22319E-01         1.61284E+00         1.25373E+01         1.00000E+00         7.81602E-13         1.25373E+01         1.21338E+00         1.13239E+01
+          2.56675E-02         8.17524E-03        -2.24170E-02         1.61268E+00         7.32990E-01         1.61284E+00         1.19273E+01         1.00000E+00         7.21762E-13         1.19273E+01         1.17411E+00         1.07532E+01
+          2.56675E-02         8.34507E-03        -2.25051E-02         1.61268E+00         7.43660E-01         1.61284E+00         1.13390E+01         1.00000E+00         6.15329E-13         1.13390E+01         1.13509E+00         1.02039E+01
+          2.56675E-02         8.51490E-03        -2.25951E-02         1.61268E+00         7.54331E-01         1.61283E+00         1.07724E+01         1.00000E+00         4.73235E-13         1.07724E+01         1.09637E+00         9.67603E+00
+          2.56675E-02         8.68473E-03        -2.26868E-02         1.61267E+00         7.65001E-01         1.61283E+00         1.02273E+01         1.00000E+00         3.47480E-13         1.02273E+01         1.05800E+00         9.16933E+00
+          2.56675E-02         8.85455E-03        -2.27804E-02         1.61267E+00         7.75672E-01         1.61283E+00         9.70372E+00         1.00000E+00         3.95510E-13         9.70372E+00         1.02005E+00         8.68367E+00
+          2.56675E-02         9.02438E-03        -2.28757E-02         1.61267E+00         7.86343E-01         1.61283E+00         9.20141E+00         1.00000E+00         6.63169E-13         9.20141E+00         9.82565E-01         8.21884E+00
+          2.56675E-02         9.19421E-03        -2.29729E-02         1.61267E+00         7.97013E-01         1.61283E+00         8.72020E+00         1.00000E+00         1.04730E-12         8.72020E+00         9.45608E-01         7.77459E+00
+          2.56675E-02         9.36403E-03        -2.30719E-02         1.61266E+00         8.07684E-01         1.61283E+00         8.25986E+00         1.00000E+00         1.50492E-12         8.25986E+00         9.09232E-01         7.35062E+00
+          2.56675E-02         9.53386E-03        -2.31727E-02         1.61266E+00         8.18354E-01         1.61283E+00         7.82011E+00         1.00000E+00         2.02106E-12         7.82011E+00         8.73489E-01         6.94662E+00
+          2.56675E-02         9.70369E-03        -2.32753E-02         1.61266E+00         8.29025E-01         1.61283E+00         7.40067E+00         1.00000E+00         2.58703E-12         7.40067E+00         8.38431E-01         6.56224E+00
+          2.56675E-02         9.87352E-03        -2.33797E-02         1.61266E+00         8.39695E-01         1.61283E+00         7.00119E+00         1.00000E+00         3.19540E-12         7.00119E+00         8.04111E-01         6.19708E+00
+          2.56675E-02         1.00433E-02        -2.34859E-02         1.61265E+00         8.50366E-01         1.61282E+00         6.62132E+00         1.00000E+00         3.83875E-12         6.62132E+00         7.70578E-01         5.85074E+00
+          2.56675E-02         1.02132E-02        -2.35940E-02         1.61265E+00         8.61037E-01         1.61282E+00         6.26067E+00         1.00000E+00         4.50918E-12         6.26067E+00         7.37879E-01         5.52279E+00
+          2.56675E-02         1.03830E-02        -2.37038E-02         1.61265E+00         8.71707E-01         1.61282E+00         5.91883E+00         1.00000E+00         5.19826E-12         5.91883E+00         7.06060E-01         5.21277E+00
+          2.56675E-02         1.05528E-02        -2.38155E-02         1.61264E+00         8.82378E-01         1.61282E+00         5.59536E+00         1.00000E+00         5.89697E-12         5.59536E+00         6.75165E-01         4.92019E+00
+          2.56675E-02         1.07227E-02        -2.39290E-02         1.61264E+00         8.93048E-01         1.61282E+00         5.28980E+00         1.00000E+00         6.59579E-12         5.28980E+00         6.45236E-01         4.64456E+00
+          2.56675E-02         1.08925E-02        -2.40443E-02         1.61264E+00         9.03719E-01         1.61282E+00         5.00169E+00         1.00000E+00         7.28469E-12         5.00169E+00         6.16312E-01         4.38537E+00
+          2.56675E-02         1.10623E-02        -2.41614E-02         1.61264E+00         9.14389E-01         1.61282E+00         4.73053E+00         1.00000E+00         7.95325E-12         4.73053E+00         5.88430E-01         4.14210E+00
+          2.56675E-02         1.12321E-02        -2.42803E-02         1.61263E+00         9.25060E-01         1.61282E+00         4.47581E+00         1.00000E+00         8.59069E-12         4.47581E+00         5.61625E-01         3.91419E+00
+          2.56675E-02         1.14020E-02        -2.44010E-02         1.61263E+00         9.35731E-01         1.61281E+00         4.23702E+00         1.00000E+00         9.18600E-12         4.23702E+00         5.35927E-01         3.70110E+00
+          2.56675E-02         1.15718E-02        -2.45236E-02         1.61263E+00         9.46401E-01         1.61281E+00         4.01363E+00         1.00000E+00         9.72796E-12         4.01363E+00         5.11367E-01         3.50227E+00
+          2.56675E-02         1.17416E-02        -2.46479E-02         1.61262E+00         9.57072E-01         1.61281E+00         3.80511E+00         1.00000E+00         1.02053E-11         3.80511E+00         4.87969E-01         3.31714E+00
+          2.56675E-02         1.19114E-02        -2.47741E-02         1.61262E+00         9.67742E-01         1.61281E+00         3.61090E+00         1.00000E+00         1.06067E-11         3.61090E+00         4.65758E-01         3.14514E+00
+          2.56675E-02         1.20813E-02        -2.49021E-02         1.61262E+00         9.78413E-01         1.61281E+00         3.43045E+00         1.00000E+00         1.09209E-11         3.43045E+00         4.44753E-01         2.98570E+00
+          2.56675E-02         1.22511E-02        -2.50318E-02         1.61261E+00         9.89083E-01         1.61281E+00         3.26322E+00         1.00000E+00         1.11368E-11         3.26322E+00         4.24970E-01         2.83825E+00
+          2.56675E-02         1.24209E-02        -2.51634E-02         1.61261E+00         9.99754E-01         1.61281E+00         3.10865E+00         1.00000E+00         1.12435E-11         3.10865E+00         4.06425E-01         2.70223E+00
+          2.56675E-02         1.25908E-02        -2.52969E-02         1.61261E+00         1.01042E+00         1.61281E+00         2.96618E+00         1.00000E+00         1.12305E-11         2.96618E+00         3.89126E-01         2.57706E+00
+          2.56675E-02         1.27606E-02        -2.54321E-02         1.61260E+00         1.02110E+00         1.61280E+00         2.83526E+00         1.00000E+00         1.10878E-11         2.83526E+00         3.73081E-01         2.46218E+00
+          2.56675E-02         1.29304E-02        -2.55691E-02         1.61260E+00         1.03177E+00         1.61280E+00         2.71534E+00         1.00000E+00         1.08056E-11         2.71534E+00         3.58295E-01         2.35704E+00
+          2.56675E-02         1.31002E-02        -2.57080E-02         1.61260E+00         1.04244E+00         1.61280E+00         2.60587E+00         1.00000E+00         1.03750E-11         2.60587E+00         3.44768E-01         2.26110E+00
+          2.56675E-02         1.32701E-02        -2.58486E-02         1.61259E+00         1.05311E+00         1.61280E+00         2.50631E+00         1.00000E+00         9.78793E-12         2.50631E+00         3.32496E-01         2.17381E+00
+          2.56675E-02         1.34399E-02        -2.59911E-02         1.61259E+00         1.06378E+00         1.61280E+00         2.41612E+00         1.00000E+00         9.03749E-12         2.41612E+00         3.21476E-01         2.09464E+00
+          2.56675E-02         1.36097E-02        -2.61354E-02         1.61259E+00         1.07445E+00         1.61280E+00         2.33478E+00         1.00000E+00         8.11850E-12         2.33478E+00         3.11696E-01         2.02309E+00
+          2.56675E-02         1.37795E-02        -2.62815E-02         1.61258E+00         1.08512E+00         1.61280E+00         2.26178E+00         1.00000E+00         7.02885E-12         2.26178E+00         3.03145E-01         1.95864E+00
+          2.56675E-02         1.39494E-02        -2.64294E-02         1.61258E+00         1.09579E+00         1.61279E+00         2.19660E+00         1.00000E+00         5.77308E-12         2.19660E+00         2.95807E-01         1.90079E+00
+          2.56675E-02         1.41192E-02        -2.65791E-02         1.61257E+00         1.10646E+00         1.61279E+00         2.13875E+00         1.00000E+00         4.37406E-12         2.13875E+00         2.89663E-01         1.84909E+00
+          2.56675E-02         1.42890E-02        -2.67306E-02         1.61257E+00         1.11713E+00         1.61279E+00         2.08775E+00         1.00000E+00         2.92616E-12         2.08775E+00         2.84692E-01         1.80306E+00
+          2.56675E-02         1.44589E-02        -2.68840E-02         1.61257E+00         1.12780E+00         1.61279E+00         2.04312E+00         1.00000E+00         1.91434E-12         2.04312E+00         2.80869E-01         1.76226E+00
+          2.56675E-02         1.46287E-02        -2.70391E-02         1.61256E+00         1.13847E+00         1.61279E+00         2.00442E+00         1.00000E+00         2.60502E-12         2.00442E+00         2.78167E-01         1.72625E+00
+          2.56675E-02         1.47985E-02        -2.71961E-02         1.61256E+00         1.14914E+00         1.61279E+00         1.97118E+00         1.00000E+00         4.53519E-12         1.97118E+00         2.76554E-01         1.69463E+00
+          2.56675E-02         1.49683E-02        -2.73549E-02         1.61255E+00         1.15981E+00         1.61279E+00         1.94299E+00         1.00000E+00         6.92337E-12         1.94299E+00         2.75999E-01         1.66700E+00
+          2.56675E-02         1.51382E-02        -2.75155E-02         1.61255E+00         1.17048E+00         1.61278E+00         1.91944E+00         1.00000E+00         9.59505E-12         1.91944E+00         2.76465E-01         1.64297E+00
+          2.56675E-02         1.53080E-02        -2.76779E-02         1.61255E+00         1.18115E+00         1.61278E+00         1.90012E+00         1.00000E+00         1.25052E-11         1.90012E+00         2.77914E-01         1.62220E+00
+          2.56675E-02         1.54778E-02        -2.78421E-02         1.61254E+00         1.19182E+00         1.61278E+00         1.88465E+00         1.00000E+00         1.56362E-11         1.88465E+00         2.80306E-01         1.60434E+00
+          2.56675E-02         1.56476E-02        -2.80081E-02         1.61254E+00         1.20249E+00         1.61278E+00         1.87267E+00         1.00000E+00         1.89779E-11         1.87267E+00         2.83599E-01         1.58907E+00
+          2.56675E-02         1.58175E-02        -2.81760E-02         1.61253E+00         1.21317E+00         1.61278E+00         1.86382E+00         1.00000E+00         2.25222E-11         1.86382E+00         2.87748E-01         1.57607E+00
+          2.56675E-02         1.59873E-02        -2.83456E-02         1.61253E+00         1.22384E+00         1.61278E+00         1.85778E+00         1.00000E+00         2.62613E-11         1.85778E+00         2.92707E-01         1.56507E+00
+          2.56675E-02         1.61571E-02        -2.85171E-02         1.61252E+00         1.23451E+00         1.61278E+00         1.85422E+00         1.00000E+00         3.01866E-11         1.85422E+00         2.98428E-01         1.55579E+00
+          2.56675E-02         1.63270E-02        -2.86903E-02         1.61252E+00         1.24518E+00         1.61277E+00         1.85285E+00         1.00000E+00         3.42888E-11         1.85285E+00         3.04861E-01         1.54799E+00
+          2.56675E-02         1.64968E-02        -2.88654E-02         1.61251E+00         1.25585E+00         1.61277E+00         1.85338E+00         1.00000E+00         3.85571E-11         1.85338E+00         3.11955E-01         1.54142E+00
+          2.56675E-02         1.66666E-02        -2.90423E-02         1.61251E+00         1.26652E+00         1.61277E+00         1.85554E+00         1.00000E+00         4.29798E-11         1.85554E+00         3.19659E-01         1.53588E+00
+          2.56675E-02         1.68364E-02        -2.92211E-02         1.61251E+00         1.27719E+00         1.61277E+00         1.85907E+00         1.00000E+00         4.75433E-11         1.85907E+00         3.27919E-01         1.53116E+00
+          2.56675E-02         1.70063E-02        -2.94016E-02         1.61250E+00         1.28786E+00         1.61277E+00         1.86376E+00         1.00000E+00         5.22328E-11         1.86376E+00         3.36681E-01         1.52708E+00
+          2.56675E-02         1.71761E-02        -2.95839E-02         1.61250E+00         1.29853E+00         1.61277E+00         1.86936E+00         1.00000E+00         5.70317E-11         1.86936E+00         3.45892E-01         1.52347E+00
+          2.56675E-02         1.73459E-02        -2.97681E-02         1.61249E+00         1.30920E+00         1.61277E+00         1.87568E+00         1.00000E+00         6.19220E-11         1.87568E+00         3.55496E-01         1.52019E+00
+          2.56675E-02         1.75158E-02        -2.99540E-02         1.61249E+00         1.31987E+00         1.61277E+00         1.88253E+00         1.00000E+00         6.68837E-11         1.88253E+00         3.65437E-01         1.51709E+00
+          2.56675E-02         1.76856E-02        -3.01418E-02         1.61248E+00         1.33054E+00         1.61276E+00         1.88972E+00         1.00000E+00         7.18952E-11         1.88972E+00         3.75662E-01         1.51406E+00
+          2.56675E-02         1.78554E-02        -3.03314E-02         1.61248E+00         1.34121E+00         1.61276E+00         1.89710E+00         1.00000E+00         7.69331E-11         1.89710E+00         3.86114E-01         1.51099E+00
+          2.56675E-02         1.80252E-02        -3.05228E-02         1.61247E+00         1.35188E+00         1.61276E+00         1.90452E+00         1.00000E+00         8.19721E-11         1.90452E+00         3.96738E-01         1.50778E+00
+          2.56675E-02         1.81951E-02        -3.07160E-02         1.61247E+00         1.36255E+00         1.61276E+00         1.91183E+00         1.00000E+00         8.69849E-11         1.91183E+00         4.07481E-01         1.50435E+00
+          2.56675E-02         1.83649E-02        -3.09110E-02         1.61246E+00         1.37322E+00         1.61276E+00         1.91892E+00         1.00000E+00         9.19423E-11         1.91892E+00         4.18288E-01         1.50064E+00
+          2.56675E-02         1.85347E-02        -3.11079E-02         1.61246E+00         1.38389E+00         1.61276E+00         1.92568E+00         1.00000E+00         9.68133E-11         1.92568E+00         4.29106E-01         1.49658E+00
+          2.56675E-02         1.87045E-02        -3.13065E-02         1.61245E+00         1.39457E+00         1.61276E+00         1.93201E+00         1.00000E+00         1.01565E-10         1.93201E+00         4.39884E-01         1.49212E+00
+          2.56675E-02         1.88744E-02        -3.15070E-02         1.61245E+00         1.40524E+00         1.61275E+00         1.93781E+00         1.00000E+00         1.06161E-10         1.93781E+00         4.50571E-01         1.48724E+00
+          2.56675E-02         1.90442E-02        -3.17093E-02         1.61244E+00         1.41591E+00         1.61275E+00         1.94301E+00         1.00000E+00         1.10566E-10         1.94301E+00         4.61116E-01         1.48189E+00
+          2.56675E-02         1.92140E-02        -3.19134E-02         1.61244E+00         1.42658E+00         1.61275E+00         1.94753E+00         1.00000E+00         1.14740E-10         1.94753E+00         4.71472E-01         1.47606E+00
+          2.56675E-02         1.93839E-02        -3.21193E-02         1.61243E+00         1.43725E+00         1.61275E+00         1.95133E+00         1.00000E+00         1.18642E-10         1.95133E+00         4.81593E-01         1.46974E+00
+          2.56675E-02         1.95537E-02        -3.23270E-02         1.61243E+00         1.44792E+00         1.61275E+00         1.95435E+00         1.00000E+00         1.22228E-10         1.95435E+00         4.91432E-01         1.46292E+00
+          2.56675E-02         1.97235E-02        -3.25365E-02         1.61242E+00         1.45859E+00         1.61275E+00         1.95654E+00         1.00000E+00         1.25455E-10         1.95654E+00         5.00948E-01         1.45559E+00
+          2.56675E-02         1.98933E-02        -3.27478E-02         1.61242E+00         1.46926E+00         1.61275E+00         1.95788E+00         1.00000E+00         1.28276E-10         1.95788E+00         5.10099E-01         1.44778E+00
+          2.56675E-02         2.00632E-02        -3.29610E-02         1.61241E+00         1.47993E+00         1.61275E+00         1.95833E+00         1.00000E+00         1.30642E-10         1.95833E+00         5.18846E-01         1.43948E+00
+          2.56675E-02         2.02330E-02        -3.31760E-02         1.61240E+00         1.49060E+00         1.61275E+00         1.95787E+00         1.00000E+00         1.32503E-10         1.95787E+00         5.27152E-01         1.43072E+00
+          2.56675E-02         2.04028E-02        -3.33927E-02         1.61240E+00         1.50127E+00         1.61274E+00         1.95650E+00         1.00000E+00         1.33808E-10         1.95650E+00         5.34983E-01         1.42151E+00
+          2.56675E-02         2.05726E-02        -3.36113E-02         1.61239E+00         1.51194E+00         1.61274E+00         1.95419E+00         1.00000E+00         1.34506E-10         1.95419E+00         5.42306E-01         1.41188E+00
+          2.56675E-02         2.07425E-02        -3.38317E-02         1.61239E+00         1.52261E+00         1.61274E+00         1.95094E+00         1.00000E+00         1.34541E-10         1.95094E+00         5.49092E-01         1.40185E+00
+          2.56675E-02         2.09123E-02        -3.40539E-02         1.61238E+00         1.53328E+00         1.61274E+00         1.94677E+00         1.00000E+00         1.33861E-10         1.94677E+00         5.55312E-01         1.39145E+00
+          2.56675E-02         2.10821E-02        -3.42780E-02         1.61238E+00         1.54395E+00         1.61274E+00         1.94166E+00         1.00000E+00         1.32410E-10         1.94166E+00         5.60943E-01         1.38071E+00
+          2.56675E-02         2.12520E-02        -3.45038E-02         1.61237E+00         1.55462E+00         1.61274E+00         1.93563E+00         1.00000E+00         1.30134E-10         1.93563E+00         5.65962E-01         1.36966E+00
+          2.56675E-02         2.14218E-02        -3.47315E-02         1.61236E+00         1.56529E+00         1.61274E+00         1.92868E+00         1.00000E+00         1.26977E-10         1.92868E+00         5.70349E-01         1.35833E+00
+          2.56675E-02         2.15916E-02        -3.49609E-02         1.61236E+00         1.57596E+00         1.61274E+00         1.92084E+00         1.00000E+00         1.22887E-10         1.92084E+00         5.74087E-01         1.34676E+00
+          2.56675E-02         2.17614E-02        -3.51922E-02         1.61235E+00         1.58664E+00         1.61274E+00         1.91212E+00         1.00000E+00         1.17811E-10         1.91212E+00         5.77162E-01         1.33496E+00
+          2.56675E-02         2.19313E-02        -3.54253E-02         1.61235E+00         1.59731E+00         1.61274E+00         1.90254E+00         1.00000E+00         1.11699E-10         1.90254E+00         5.79562E-01         1.32298E+00
+          2.56675E-02         2.21011E-02        -3.56602E-02         1.61234E+00         1.60798E+00         1.61273E+00         1.89212E+00         1.00000E+00         1.04504E-10         1.89212E+00         5.81278E-01         1.31084E+00
+          2.56675E-02         2.22709E-02        -3.58969E-02         1.61233E+00         1.61865E+00         1.61273E+00         1.88088E+00         1.00000E+00         9.61852E-11         1.88088E+00         5.82303E-01         1.29857E+00
+          2.56675E-02         2.24407E-02        -3.61355E-02         1.61233E+00         1.62932E+00         1.61273E+00         1.86884E+00         1.00000E+00         8.67119E-11         1.86884E+00         5.82633E-01         1.28621E+00
+          2.56675E-02         2.26106E-02        -3.63758E-02         1.61232E+00         1.63999E+00         1.61273E+00         1.85603E+00         1.00000E+00         7.60689E-11         1.85603E+00         5.82268E-01         1.27377E+00
+          2.56675E-02         2.27804E-02        -3.66180E-02         1.61232E+00         1.65066E+00         1.61273E+00         1.84248E+00         1.00000E+00         6.42751E-11         1.84248E+00         5.81207E-01         1.26128E+00
+          2.56675E-02         2.29502E-02        -3.68619E-02         1.61231E+00         1.66133E+00         1.61273E+00         1.82821E+00         1.00000E+00         5.14306E-11         1.82821E+00         5.79454E-01         1.24876E+00
+          2.56675E-02         2.31201E-02        -3.71077E-02         1.61230E+00         1.67200E+00         1.61273E+00         1.81324E+00         1.00000E+00         3.78794E-11         1.81324E+00         5.77016E-01         1.23623E+00
+          2.56675E-02         2.32899E-02        -3.73553E-02         1.61230E+00         1.68267E+00         1.61273E+00         1.79761E+00         1.00000E+00         2.49623E-11         1.79761E+00         5.73901E-01         1.22371E+00
+          2.56675E-02         2.34597E-02        -3.76047E-02         1.61229E+00         1.69334E+00         1.61273E+00         1.78134E+00         1.00000E+00         1.86622E-11         1.78134E+00         5.70119E-01         1.21122E+00
+          2.56675E-02         2.36295E-02        -3.78559E-02         1.61228E+00         1.70401E+00         1.61273E+00         1.76445E+00         1.00000E+00         2.76468E-11         1.76445E+00         5.65683E-01         1.19876E+00
+          2.56675E-02         2.37994E-02        -3.81090E-02         1.61228E+00         1.71468E+00         1.61273E+00         1.74697E+00         1.00000E+00         4.51709E-11         1.74697E+00         5.60608E-01         1.18636E+00
+          2.56675E-02         2.39692E-02        -3.83638E-02         1.61227E+00         1.72535E+00         1.61273E+00         1.72893E+00         1.00000E+00         6.60280E-11         1.72893E+00         5.54910E-01         1.17402E+00
+          2.56675E-02         2.41390E-02        -3.86205E-02         1.61226E+00         1.73602E+00         1.61273E+00         1.71035E+00         1.00000E+00         8.89838E-11         1.71035E+00         5.48608E-01         1.16174E+00
+          2.56675E-02         2.43088E-02        -3.88789E-02         1.61226E+00         1.74669E+00         1.61273E+00         1.69126E+00         1.00000E+00         1.13677E-10         1.69126E+00         5.41722E-01         1.14953E+00
+          2.56675E-02         2.44787E-02        -3.91392E-02         1.61225E+00         1.75736E+00         1.61273E+00         1.67168E+00         1.00000E+00         1.39955E-10         1.67168E+00         5.34274E-01         1.13740E+00
+          2.56675E-02         2.46485E-02        -3.94013E-02         1.61224E+00         1.76804E+00         1.61273E+00         1.65163E+00         1.00000E+00         1.67730E-10         1.65163E+00         5.26288E-01         1.12535E+00
+          2.56675E-02         2.48183E-02        -3.96652E-02         1.61224E+00         1.77871E+00         1.61273E+00         1.63115E+00         1.00000E+00         1.96932E-10         1.63115E+00         5.17789E-01         1.11336E+00
+          2.56675E-02         2.49882E-02        -3.99310E-02         1.61223E+00         1.78938E+00         1.61273E+00         1.61025E+00         1.00000E+00         2.27493E-10         1.61025E+00         5.08802E-01         1.10145E+00
+          2.56675E-02         2.51580E-02        -4.01985E-02         1.61222E+00         1.80005E+00         1.61273E+00         1.58896E+00         1.00000E+00         2.59341E-10         1.58896E+00         4.99356E-01         1.08960E+00
+          2.56675E-02         2.53278E-02        -4.04679E-02         1.61222E+00         1.81072E+00         1.61272E+00         1.56729E+00         1.00000E+00         2.92394E-10         1.56729E+00         4.89478E-01         1.07782E+00
+          2.56675E-02         2.54976E-02        -4.07390E-02         1.61221E+00         1.82139E+00         1.61272E+00         1.54528E+00         1.00000E+00         3.26563E-10         1.54528E+00         4.79198E-01         1.06608E+00
+          2.56675E-02         2.56675E-02        -4.10120E-02         1.61220E+00         1.83206E+00         1.61272E+00         1.52294E+00         1.00000E+00         3.61743E-10         1.52294E+00         4.68547E-01         1.05439E+00
+          2.56675E-02         2.58373E-02        -4.12868E-02         1.61220E+00         1.84273E+00         1.61272E+00         1.50030E+00         1.00000E+00         3.97821E-10         1.50030E+00         4.57554E-01         1.04274E+00
+          2.56675E-02         2.60071E-02        -4.15634E-02         1.61219E+00         1.85340E+00         1.61272E+00         1.47737E+00         1.00000E+00         4.34668E-10         1.47737E+00         4.46252E-01         1.03112E+00
+          2.56675E-02         2.61769E-02        -4.18418E-02         1.61218E+00         1.86407E+00         1.61272E+00         1.45418E+00         1.00000E+00         4.72141E-10         1.45418E+00         4.34671E-01         1.01951E+00
+          2.58373E-02         8.72665E-04        -2.06168E-02         1.62340E+00         2.74155E-01         1.62354E+00         4.97214E+01         1.00000E+00         6.90183E-11         4.97214E+01         2.30749E+00         4.74139E+01
+          2.58373E-02         1.04249E-03        -2.06270E-02         1.62340E+00         2.84826E-01         1.62354E+00         4.88393E+01         1.00000E+00         6.43150E-11         4.88393E+01         2.29554E+00         4.65438E+01
+          2.58373E-02         1.21232E-03        -2.06391E-02         1.62340E+00         2.95496E-01         1.62354E+00         4.79388E+01         1.00000E+00         5.97000E-11         4.79388E+01         2.28288E+00         4.56559E+01
+          2.58373E-02         1.38215E-03        -2.06529E-02         1.62340E+00         3.06167E-01         1.62353E+00         4.70215E+01         1.00000E+00         5.51908E-11         4.70215E+01         2.26951E+00         4.47520E+01
+          2.58373E-02         1.55197E-03        -2.06685E-02         1.62340E+00         3.16838E-01         1.62353E+00         4.60887E+01         1.00000E+00         5.08038E-11         4.60887E+01         2.25540E+00         4.38333E+01
+          2.58373E-02         1.72180E-03        -2.06860E-02         1.62340E+00         3.27508E-01         1.62353E+00         4.51421E+01         1.00000E+00         4.65543E-11         4.51421E+01         2.24054E+00         4.29015E+01
+          2.58373E-02         1.89163E-03        -2.07053E-02         1.62340E+00         3.38179E-01         1.62353E+00         4.41830E+01         1.00000E+00         4.24559E-11         4.41830E+01         2.22491E+00         4.19581E+01
+          2.58373E-02         2.06146E-03        -2.07264E-02         1.62340E+00         3.48849E-01         1.62353E+00         4.32130E+01         1.00000E+00         3.85211E-11         4.32130E+01         2.20850E+00         4.10045E+01
+          2.58373E-02         2.23128E-03        -2.07493E-02         1.62340E+00         3.59520E-01         1.62353E+00         4.22336E+01         1.00000E+00         3.47608E-11         4.22336E+01         2.19129E+00         4.00423E+01
+          2.58373E-02         2.40111E-03        -2.07740E-02         1.62340E+00         3.70190E-01         1.62353E+00         4.12463E+01         1.00000E+00         3.11845E-11         4.12463E+01         2.17329E+00         3.90730E+01
+          2.58373E-02         2.57094E-03        -2.08005E-02         1.62340E+00         3.80861E-01         1.62353E+00         4.02524E+01         1.00000E+00         2.78000E-11         4.02524E+01         2.15447E+00         3.80980E+01
+          2.58373E-02         2.74077E-03        -2.08288E-02         1.62340E+00         3.91532E-01         1.62353E+00         3.92536E+01         1.00000E+00         2.46138E-11         3.92536E+01         2.13484E+00         3.71188E+01
+          2.58373E-02         2.91059E-03        -2.08590E-02         1.62340E+00         4.02202E-01         1.62353E+00         3.82512E+01         1.00000E+00         2.16307E-11         3.82512E+01         2.11438E+00         3.61368E+01
+          2.58373E-02         3.08042E-03        -2.08909E-02         1.62340E+00         4.12873E-01         1.62353E+00         3.72466E+01         1.00000E+00         1.88538E-11         3.72466E+01         2.09309E+00         3.51535E+01
+          2.58373E-02         3.25025E-03        -2.09247E-02         1.62340E+00         4.23543E-01         1.62353E+00         3.62413E+01         1.00000E+00         1.62849E-11         3.62413E+01         2.07097E+00         3.41704E+01
+          2.58373E-02         3.42008E-03        -2.09603E-02         1.62340E+00         4.34214E-01         1.62353E+00         3.52367E+01         1.00000E+00         1.39243E-11         3.52367E+01         2.04803E+00         3.31886E+01
+          2.58373E-02         3.58990E-03        -2.09976E-02         1.62339E+00         4.44884E-01         1.62353E+00         3.42340E+01         1.00000E+00         1.17707E-11         3.42340E+01         2.02427E+00         3.22097E+01
+          2.58373E-02         3.75973E-03        -2.10368E-02         1.62339E+00         4.55555E-01         1.62353E+00         3.32346E+01         1.00000E+00         9.82141E-12         3.32346E+01         1.99968E+00         3.12349E+01
+          2.58373E-02         3.92956E-03        -2.10779E-02         1.62339E+00         4.66225E-01         1.62353E+00         3.22398E+01         1.00000E+00         8.07250E-12         3.22398E+01         1.97429E+00         3.02655E+01
+          2.58373E-02         4.09939E-03        -2.11207E-02         1.62339E+00         4.76896E-01         1.62353E+00         3.12508E+01         1.00000E+00         6.51870E-12         3.12508E+01         1.94809E+00         2.93027E+01
+          2.58373E-02         4.26921E-03        -2.11653E-02         1.62339E+00         4.87567E-01         1.62353E+00         3.02688E+01         1.00000E+00         5.15354E-12         3.02688E+01         1.92111E+00         2.83477E+01
+          2.58373E-02         4.43904E-03        -2.12118E-02         1.62339E+00         4.98237E-01         1.62353E+00         2.92950E+01         1.00000E+00         3.96947E-12         2.92950E+01         1.89335E+00         2.74017E+01
+          2.58373E-02         4.60887E-03        -2.12600E-02         1.62339E+00         5.08908E-01         1.62353E+00         2.83305E+01         1.00000E+00         2.95792E-12         2.83305E+01         1.86483E+00         2.64657E+01
+          2.58373E-02         4.77869E-03        -2.13101E-02         1.62339E+00         5.19578E-01         1.62353E+00         2.73765E+01         1.00000E+00         2.10941E-12         2.73765E+01         1.83558E+00         2.55409E+01
+          2.58373E-02         4.94852E-03        -2.13620E-02         1.62339E+00         5.30249E-01         1.62353E+00         2.64338E+01         1.00000E+00         1.41369E-12         2.64338E+01         1.80561E+00         2.46282E+01
+          2.58373E-02         5.11835E-03        -2.14157E-02         1.62338E+00         5.40919E-01         1.62353E+00         2.55035E+01         1.00000E+00         8.59879E-13         2.55035E+01         1.77495E+00         2.37286E+01
+          2.58373E-02         5.28818E-03        -2.14712E-02         1.62338E+00         5.51590E-01         1.62352E+00         2.45866E+01         1.00000E+00         4.37017E-13         2.45866E+01         1.74363E+00         2.28430E+01
+          2.58373E-02         5.45800E-03        -2.15285E-02         1.62338E+00         5.62261E-01         1.62352E+00         2.36839E+01         1.00000E+00         1.38898E-13         2.36839E+01         1.71167E+00         2.19723E+01
+          2.58373E-02         5.62783E-03        -2.15876E-02         1.62338E+00         5.72931E-01         1.62352E+00         2.27963E+01         1.00000E+00         9.88813E-14         2.27963E+01         1.67911E+00         2.11172E+01
+          2.58373E-02         5.79766E-03        -2.16485E-02         1.62338E+00         5.83602E-01         1.62352E+00         2.19245E+01         1.00000E+00         2.01926E-13         2.19245E+01         1.64597E+00         2.02785E+01
+          2.58373E-02         5.96749E-03        -2.17113E-02         1.62338E+00         5.94272E-01         1.62352E+00         2.10693E+01         1.00000E+00         2.42726E-13         2.10693E+01         1.61231E+00         1.94570E+01
+          2.58373E-02         6.13731E-03        -2.17759E-02         1.62337E+00         6.04943E-01         1.62352E+00         2.02313E+01         1.00000E+00         2.39134E-13         2.02313E+01         1.57814E+00         1.86532E+01
+          2.58373E-02         6.30714E-03        -2.18422E-02         1.62337E+00         6.15613E-01         1.62352E+00         1.94112E+01         1.00000E+00         2.36776E-13         1.94112E+01         1.54352E+00         1.78677E+01
+          2.58373E-02         6.47697E-03        -2.19104E-02         1.62337E+00         6.26284E-01         1.62352E+00         1.86095E+01         1.00000E+00         2.96762E-13         1.86095E+01         1.50848E+00         1.71010E+01
+          2.58373E-02         6.64680E-03        -2.19804E-02         1.62337E+00         6.36955E-01         1.62352E+00         1.78268E+01         1.00000E+00         4.31054E-13         1.78268E+01         1.47307E+00         1.63537E+01
+          2.58373E-02         6.81662E-03        -2.20522E-02         1.62337E+00         6.47625E-01         1.62352E+00         1.70634E+01         1.00000E+00         6.11158E-13         1.70634E+01         1.43733E+00         1.56261E+01
+          2.58373E-02         6.98645E-03        -2.21258E-02         1.62337E+00         6.58296E-01         1.62352E+00         1.63199E+01         1.00000E+00         8.13564E-13         1.63199E+01         1.40131E+00         1.49186E+01
+          2.58373E-02         7.15628E-03        -2.22013E-02         1.62336E+00         6.68966E-01         1.62352E+00         1.55966E+01         1.00000E+00         1.02272E-12         1.55966E+01         1.36506E+00         1.42315E+01
+          2.58373E-02         7.32611E-03        -2.22785E-02         1.62336E+00         6.79637E-01         1.62351E+00         1.48937E+01         1.00000E+00         1.22699E-12         1.48937E+01         1.32863E+00         1.35651E+01
+          2.58373E-02         7.49593E-03        -2.23576E-02         1.62336E+00         6.90307E-01         1.62351E+00         1.42116E+01         1.00000E+00         1.41695E-12         1.42116E+01         1.29207E+00         1.29195E+01
+          2.58373E-02         7.66576E-03        -2.24384E-02         1.62336E+00         7.00978E-01         1.62351E+00         1.35504E+01         1.00000E+00         1.58475E-12         1.35504E+01         1.25542E+00         1.22950E+01
+          2.58373E-02         7.83559E-03        -2.25211E-02         1.62336E+00         7.11649E-01         1.62351E+00         1.29103E+01         1.00000E+00         1.72401E-12         1.29103E+01         1.21875E+00         1.16916E+01
+          2.58373E-02         8.00542E-03        -2.26056E-02         1.62335E+00         7.22319E-01         1.62351E+00         1.22914E+01         1.00000E+00         1.82985E-12         1.22914E+01         1.18211E+00         1.11093E+01
+          2.58373E-02         8.17524E-03        -2.26919E-02         1.62335E+00         7.32990E-01         1.62351E+00         1.16937E+01         1.00000E+00         1.89905E-12         1.16937E+01         1.14555E+00         1.05482E+01
+          2.58373E-02         8.34507E-03        -2.27800E-02         1.62335E+00         7.43660E-01         1.62351E+00         1.11173E+01         1.00000E+00         1.93043E-12         1.11173E+01         1.10912E+00         1.00082E+01
+          2.58373E-02         8.51490E-03        -2.28699E-02         1.62335E+00         7.54331E-01         1.62351E+00         1.05621E+01         1.00000E+00         1.92534E-12         1.05621E+01         1.07288E+00         9.48925E+00
+          2.58373E-02         8.68473E-03        -2.29617E-02         1.62334E+00         7.65001E-01         1.62351E+00         1.00281E+01         1.00000E+00         1.88852E-12         1.00281E+01         1.03689E+00         8.99121E+00
+          2.58373E-02         8.85455E-03        -2.30552E-02         1.62334E+00         7.75672E-01         1.62351E+00         9.51510E+00         1.00000E+00         1.82944E-12         9.51510E+00         1.00120E+00         8.51390E+00
+          2.58373E-02         9.02438E-03        -2.31506E-02         1.62334E+00         7.86343E-01         1.62350E+00         9.02298E+00         1.00000E+00         1.76405E-12         9.02298E+00         9.65865E-01         8.05711E+00
+          2.58373E-02         9.19421E-03        -2.32478E-02         1.62334E+00         7.97013E-01         1.62350E+00         8.55154E+00         1.00000E+00         1.71638E-12         8.55154E+00         9.30937E-01         7.62060E+00
+          2.58373E-02         9.36403E-03        -2.33468E-02         1.62333E+00         8.07684E-01         1.62350E+00         8.10055E+00         1.00000E+00         1.71774E-12         8.10055E+00         8.96471E-01         7.20408E+00
+          2.58373E-02         9.53386E-03        -2.34476E-02         1.62333E+00         8.18354E-01         1.62350E+00         7.66975E+00         1.00000E+00         1.79984E-12         7.66975E+00         8.62521E-01         6.80723E+00
+          2.58373E-02         9.70369E-03        -2.35502E-02         1.62333E+00         8.29025E-01         1.62350E+00         7.25885E+00         1.00000E+00         1.98281E-12         7.25885E+00         8.29137E-01         6.42971E+00
+          2.58373E-02         9.87352E-03        -2.36546E-02         1.62333E+00         8.39695E-01         1.62350E+00         6.86751E+00         1.00000E+00         2.26816E-12         6.86751E+00         7.96372E-01         6.07114E+00
+          2.58373E-02         1.00433E-02        -2.37608E-02         1.62332E+00         8.50366E-01         1.62350E+00         6.49539E+00         1.00000E+00         2.64320E-12         6.49539E+00         7.64274E-01         5.73112E+00
+          2.58373E-02         1.02132E-02        -2.38689E-02         1.62332E+00         8.61037E-01         1.62350E+00         6.14210E+00         1.00000E+00         3.08991E-12         6.14210E+00         7.32892E-01         5.40921E+00
+          2.58373E-02         1.03830E-02        -2.39787E-02         1.62332E+00         8.71707E-01         1.62349E+00         5.80723E+00         1.00000E+00         3.59055E-12         5.80723E+00         7.02272E-01         5.10496E+00
+          2.58373E-02         1.05528E-02        -2.40904E-02         1.62331E+00         8.82378E-01         1.62349E+00         5.49037E+00         1.00000E+00         4.12928E-12         5.49037E+00         6.72459E-01         4.81791E+00
+          2.58373E-02         1.07227E-02        -2.42039E-02         1.62331E+00         8.93048E-01         1.62349E+00         5.19106E+00         1.00000E+00         4.69209E-12         5.19106E+00         6.43495E-01         4.54756E+00
+          2.58373E-02         1.08925E-02        -2.43191E-02         1.62331E+00         9.03719E-01         1.62349E+00         4.90883E+00         1.00000E+00         5.26621E-12         4.90883E+00         6.15422E-01         4.29341E+00
+          2.58373E-02         1.10623E-02        -2.44363E-02         1.62331E+00         9.14389E-01         1.62349E+00         4.64321E+00         1.00000E+00         5.83967E-12         4.64321E+00         5.88277E-01         4.05493E+00
+          2.58373E-02         1.12321E-02        -2.45552E-02         1.62330E+00         9.25060E-01         1.62349E+00         4.39369E+00         1.00000E+00         6.40096E-12         4.39369E+00         5.62098E-01         3.83159E+00
+          2.58373E-02         1.14020E-02        -2.46759E-02         1.62330E+00         9.35731E-01         1.62349E+00         4.15977E+00         1.00000E+00         6.93883E-12         4.15977E+00         5.36919E-01         3.62285E+00
+          2.58373E-02         1.15718E-02        -2.47984E-02         1.62330E+00         9.46401E-01         1.62349E+00         3.94093E+00         1.00000E+00         7.44220E-12         3.94093E+00         5.12769E-01         3.42816E+00
+          2.58373E-02         1.17416E-02        -2.49228E-02         1.62329E+00         9.57072E-01         1.62348E+00         3.73664E+00         1.00000E+00         7.90013E-12         3.73664E+00         4.89679E-01         3.24696E+00
+          2.58373E-02         1.19114E-02        -2.50489E-02         1.62329E+00         9.67742E-01         1.62348E+00         3.54637E+00         1.00000E+00         8.30176E-12         3.54637E+00         4.67674E-01         3.07869E+00
+          2.58373E-02         1.20813E-02        -2.51769E-02         1.62329E+00         9.78413E-01         1.62348E+00         3.36957E+00         1.00000E+00         8.63640E-12         3.36957E+00         4.46778E-01         2.92279E+00
+          2.58373E-02         1.22511E-02        -2.53067E-02         1.62328E+00         9.89083E-01         1.62348E+00         3.20570E+00         1.00000E+00         8.89351E-12         3.20570E+00         4.27009E-01         2.77869E+00
+          2.58373E-02         1.24209E-02        -2.54383E-02         1.62328E+00         9.99754E-01         1.62348E+00         3.05422E+00         1.00000E+00         9.06276E-12         3.05422E+00         4.08386E-01         2.64583E+00
+          2.58373E-02         1.25908E-02        -2.55717E-02         1.62328E+00         1.01042E+00         1.62348E+00         2.91458E+00         1.00000E+00         9.13409E-12         2.91458E+00         3.90923E-01         2.52366E+00
+          2.58373E-02         1.27606E-02        -2.57069E-02         1.62327E+00         1.02110E+00         1.62348E+00         2.78624E+00         1.00000E+00         9.09777E-12         2.78624E+00         3.74631E-01         2.41161E+00
+          2.58373E-02         1.29304E-02        -2.58440E-02         1.62327E+00         1.03177E+00         1.62348E+00         2.66866E+00         1.00000E+00         8.94444E-12         2.66866E+00         3.59517E-01         2.30914E+00
+          2.58373E-02         1.31002E-02        -2.59828E-02         1.62327E+00         1.04244E+00         1.62347E+00         2.56130E+00         1.00000E+00         8.66516E-12         2.56130E+00         3.45587E-01         2.21571E+00
+          2.58373E-02         1.32701E-02        -2.61235E-02         1.62326E+00         1.05311E+00         1.62347E+00         2.46362E+00         1.00000E+00         8.25149E-12         2.46362E+00         3.32842E-01         2.13078E+00
+          2.58373E-02         1.34399E-02        -2.62659E-02         1.62326E+00         1.06378E+00         1.62347E+00         2.37511E+00         1.00000E+00         7.69557E-12         2.37511E+00         3.21281E-01         2.05383E+00
+          2.58373E-02         1.36097E-02        -2.64102E-02         1.62325E+00         1.07445E+00         1.62347E+00         2.29525E+00         1.00000E+00         6.99020E-12         2.29525E+00         3.10899E-01         1.98435E+00
+          2.58373E-02         1.37795E-02        -2.65563E-02         1.62325E+00         1.08512E+00         1.62347E+00         2.22353E+00         1.00000E+00         6.12901E-12         2.22353E+00         3.01689E-01         1.92184E+00
+          2.58373E-02         1.39494E-02        -2.67042E-02         1.62325E+00         1.09579E+00         1.62347E+00         2.15946E+00         1.00000E+00         5.10677E-12         2.15946E+00         2.93638E-01         1.86582E+00
+          2.58373E-02         1.41192E-02        -2.68539E-02         1.62324E+00         1.10646E+00         1.62347E+00         2.10254E+00         1.00000E+00         3.92043E-12         2.10254E+00         2.86734E-01         1.81581E+00
+          2.58373E-02         1.42890E-02        -2.70055E-02         1.62324E+00         1.11713E+00         1.62346E+00         2.05231E+00         1.00000E+00         2.57363E-12         2.05231E+00         2.80960E-01         1.77135E+00
+          2.58373E-02         1.44589E-02        -2.71588E-02         1.62324E+00         1.12780E+00         1.62346E+00         2.00830E+00         1.00000E+00         1.12144E-12         2.00830E+00         2.76295E-01         1.73201E+00
+          2.58373E-02         1.46287E-02        -2.73140E-02         1.62323E+00         1.13847E+00         1.62346E+00         1.97007E+00         1.00000E+00         9.60531E-13         1.97007E+00         2.72717E-01         1.69735E+00
+          2.58373E-02         1.47985E-02        -2.74709E-02         1.62323E+00         1.14914E+00         1.62346E+00         1.93718E+00         1.00000E+00         2.73876E-12         1.93718E+00         2.70200E-01         1.66698E+00
+          2.58373E-02         1.49683E-02        -2.76297E-02         1.62322E+00         1.15981E+00         1.62346E+00         1.90920E+00         1.00000E+00         4.80617E-12         1.90920E+00         2.68717E-01         1.64049E+00
+          2.58373E-02         1.51382E-02        -2.77903E-02         1.62322E+00         1.17048E+00         1.62346E+00         1.88574E+00         1.00000E+00         7.07370E-12         1.88574E+00         2.68236E-01         1.61751E+00
+          2.58373E-02         1.53080E-02        -2.79527E-02         1.62321E+00         1.18115E+00         1.62346E+00         1.86641E+00         1.00000E+00         9.53036E-12         1.86641E+00         2.68723E-01         1.59769E+00
+          2.58373E-02         1.54778E-02        -2.81169E-02         1.62321E+00         1.19182E+00         1.62345E+00         1.85083E+00         1.00000E+00         1.21718E-11         1.85083E+00         2.70145E-01         1.58069E+00
+          2.58373E-02         1.56476E-02        -2.82830E-02         1.62321E+00         1.20249E+00         1.62345E+00         1.83865E+00         1.00000E+00         1.49943E-11         1.83865E+00         2.72461E-01         1.56619E+00
+          2.58373E-02         1.58175E-02        -2.84508E-02         1.62320E+00         1.21317E+00         1.62345E+00         1.82951E+00         1.00000E+00         1.79939E-11         1.82951E+00         2.75633E-01         1.55388E+00
+          2.58373E-02         1.59873E-02        -2.86205E-02         1.62320E+00         1.22384E+00         1.62345E+00         1.82310E+00         1.00000E+00         2.11653E-11         1.82310E+00         2.79619E-01         1.54348E+00
+          2.58373E-02         1.61571E-02        -2.87919E-02         1.62319E+00         1.23451E+00         1.62345E+00         1.81911E+00         1.00000E+00         2.45027E-11         1.81911E+00         2.84375E-01         1.53474E+00
+          2.58373E-02         1.63270E-02        -2.89652E-02         1.62319E+00         1.24518E+00         1.62345E+00         1.81724E+00         1.00000E+00         2.79988E-11         1.81724E+00         2.89856E-01         1.52738E+00
+          2.58373E-02         1.64968E-02        -2.91403E-02         1.62318E+00         1.25585E+00         1.62345E+00         1.81722E+00         1.00000E+00         3.16451E-11         1.81722E+00         2.96014E-01         1.52120E+00
+          2.58373E-02         1.66666E-02        -2.93172E-02         1.62318E+00         1.26652E+00         1.62344E+00         1.81877E+00         1.00000E+00         3.54321E-11         1.81877E+00         3.02802E-01         1.51597E+00
+          2.58373E-02         1.68364E-02        -2.94959E-02         1.62317E+00         1.27719E+00         1.62344E+00         1.82167E+00         1.00000E+00         3.93487E-11         1.82167E+00         3.10170E-01         1.51150E+00
+          2.58373E-02         1.70063E-02        -2.96764E-02         1.62317E+00         1.28786E+00         1.62344E+00         1.82567E+00         1.00000E+00         4.33826E-11         1.82567E+00         3.18068E-01         1.50761E+00
+          2.58373E-02         1.71761E-02        -2.98588E-02         1.62317E+00         1.29853E+00         1.62344E+00         1.83057E+00         1.00000E+00         4.75200E-11         1.83057E+00         3.26445E-01         1.50413E+00
+          2.58373E-02         1.73459E-02        -3.00429E-02         1.62316E+00         1.30920E+00         1.62344E+00         1.83616E+00         1.00000E+00         5.17458E-11         1.83616E+00         3.35250E-01         1.50091E+00
+          2.58373E-02         1.75158E-02        -3.02289E-02         1.62316E+00         1.31987E+00         1.62344E+00         1.84226E+00         1.00000E+00         5.60432E-11         1.84226E+00         3.44429E-01         1.49783E+00
+          2.58373E-02         1.76856E-02        -3.04167E-02         1.62315E+00         1.33054E+00         1.62344E+00         1.84869E+00         1.00000E+00         6.03941E-11         1.84869E+00         3.53930E-01         1.49476E+00
+          2.58373E-02         1.78554E-02        -3.06062E-02         1.62315E+00         1.34121E+00         1.62343E+00         1.85530E+00         1.00000E+00         6.47785E-11         1.85530E+00         3.63702E-01         1.49160E+00
+          2.58373E-02         1.80252E-02        -3.07976E-02         1.62314E+00         1.35188E+00         1.62343E+00         1.86195E+00         1.00000E+00         6.91751E-11         1.86195E+00         3.73691E-01         1.48826E+00
+          2.58373E-02         1.81951E-02        -3.09909E-02         1.62314E+00         1.36255E+00         1.62343E+00         1.86850E+00         1.00000E+00         7.35607E-11         1.86850E+00         3.83845E-01         1.48466E+00
+          2.58373E-02         1.83649E-02        -3.11859E-02         1.62313E+00         1.37322E+00         1.62343E+00         1.87484E+00         1.00000E+00         7.79105E-11         1.87484E+00         3.94112E-01         1.48073E+00
+          2.58373E-02         1.85347E-02        -3.13827E-02         1.62313E+00         1.38389E+00         1.62343E+00         1.88086E+00         1.00000E+00         8.21980E-11         1.88086E+00         4.04441E-01         1.47642E+00
+          2.58373E-02         1.87045E-02        -3.15814E-02         1.62312E+00         1.39457E+00         1.62343E+00         1.88646E+00         1.00000E+00         8.63948E-11         1.88646E+00         4.14781E-01         1.47168E+00
+          2.58373E-02         1.88744E-02        -3.17818E-02         1.62312E+00         1.40524E+00         1.62343E+00         1.89155E+00         1.00000E+00         9.04709E-11         1.89155E+00         4.25083E-01         1.46647E+00
+          2.58373E-02         1.90442E-02        -3.19841E-02         1.62311E+00         1.41591E+00         1.62343E+00         1.89608E+00         1.00000E+00         9.43945E-11         1.89608E+00         4.35298E-01         1.46078E+00
+          2.58373E-02         1.92140E-02        -3.21882E-02         1.62311E+00         1.42658E+00         1.62342E+00         1.89996E+00         1.00000E+00         9.81319E-11         1.89996E+00         4.45378E-01         1.45458E+00
+          2.58373E-02         1.93839E-02        -3.23941E-02         1.62310E+00         1.43725E+00         1.62342E+00         1.90314E+00         1.00000E+00         1.01648E-10         1.90314E+00         4.55278E-01         1.44786E+00
+          2.58373E-02         1.95537E-02        -3.26018E-02         1.62309E+00         1.44792E+00         1.62342E+00         1.90558E+00         1.00000E+00         1.04905E-10         1.90558E+00         4.64953E-01         1.44063E+00
+          2.58373E-02         1.97235E-02        -3.28113E-02         1.62309E+00         1.45859E+00         1.62342E+00         1.90724E+00         1.00000E+00         1.07865E-10         1.90724E+00         4.74361E-01         1.43288E+00
+          2.58373E-02         1.98933E-02        -3.30227E-02         1.62308E+00         1.46926E+00         1.62342E+00         1.90808E+00         1.00000E+00         1.10487E-10         1.90808E+00         4.83458E-01         1.42462E+00
+          2.58373E-02         2.00632E-02        -3.32358E-02         1.62308E+00         1.47993E+00         1.62342E+00         1.90809E+00         1.00000E+00         1.12729E-10         1.90809E+00         4.92208E-01         1.41588E+00
+          2.58373E-02         2.02330E-02        -3.34508E-02         1.62307E+00         1.49060E+00         1.62342E+00         1.90724E+00         1.00000E+00         1.14547E-10         1.90724E+00         5.00571E-01         1.40666E+00
+          2.58373E-02         2.04028E-02        -3.36676E-02         1.62307E+00         1.50127E+00         1.62342E+00         1.90551E+00         1.00000E+00         1.15897E-10         1.90551E+00         5.08514E-01         1.39700E+00
+          2.58373E-02         2.05726E-02        -3.38862E-02         1.62306E+00         1.51194E+00         1.62342E+00         1.90292E+00         1.00000E+00         1.16732E-10         1.90292E+00         5.16001E-01         1.38692E+00
+          2.58373E-02         2.07425E-02        -3.41066E-02         1.62306E+00         1.52261E+00         1.62341E+00         1.89944E+00         1.00000E+00         1.17006E-10         1.89944E+00         5.23004E-01         1.37644E+00
+          2.58373E-02         2.09123E-02        -3.43288E-02         1.62305E+00         1.53328E+00         1.62341E+00         1.89509E+00         1.00000E+00         1.16669E-10         1.89509E+00         5.29492E-01         1.36560E+00
+          2.58373E-02         2.10821E-02        -3.45528E-02         1.62304E+00         1.54395E+00         1.62341E+00         1.88987E+00         1.00000E+00         1.15672E-10         1.88987E+00         5.35440E-01         1.35443E+00
+          2.58373E-02         2.12520E-02        -3.47786E-02         1.62304E+00         1.55462E+00         1.62341E+00         1.88379E+00         1.00000E+00         1.13967E-10         1.88379E+00         5.40823E-01         1.34296E+00
+          2.58373E-02         2.14218E-02        -3.50063E-02         1.62303E+00         1.56529E+00         1.62341E+00         1.87686E+00         1.00000E+00         1.11503E-10         1.87686E+00         5.45621E-01         1.33124E+00
+          2.58373E-02         2.15916E-02        -3.52357E-02         1.62303E+00         1.57596E+00         1.62341E+00         1.86910E+00         1.00000E+00         1.08230E-10         1.86910E+00         5.49814E-01         1.31928E+00
+          2.58373E-02         2.17614E-02        -3.54670E-02         1.62302E+00         1.58664E+00         1.62341E+00         1.86052E+00         1.00000E+00         1.04099E-10         1.86052E+00         5.53386E-01         1.30714E+00
+          2.58373E-02         2.19313E-02        -3.57001E-02         1.62301E+00         1.59731E+00         1.62341E+00         1.85116E+00         1.00000E+00         9.90610E-11         1.85116E+00         5.56323E-01         1.29483E+00
+          2.58373E-02         2.21011E-02        -3.59350E-02         1.62301E+00         1.60798E+00         1.62341E+00         1.84101E+00         1.00000E+00         9.30674E-11         1.84101E+00         5.58613E-01         1.28240E+00
+          2.58373E-02         2.22709E-02        -3.61717E-02         1.62300E+00         1.61865E+00         1.62341E+00         1.83012E+00         1.00000E+00         8.60720E-11         1.83012E+00         5.60247E-01         1.26988E+00
+          2.58373E-02         2.24407E-02        -3.64103E-02         1.62300E+00         1.62932E+00         1.62340E+00         1.81851E+00         1.00000E+00         7.80307E-11         1.81851E+00         5.61220E-01         1.25729E+00
+          2.58373E-02         2.26106E-02        -3.66506E-02         1.62299E+00         1.63999E+00         1.62340E+00         1.80619E+00         1.00000E+00         6.89020E-11         1.80619E+00         5.61528E-01         1.24466E+00
+          2.58373E-02         2.27804E-02        -3.68928E-02         1.62298E+00         1.65066E+00         1.62340E+00         1.79319E+00         1.00000E+00         5.86490E-11         1.79319E+00         5.61167E-01         1.23202E+00
+          2.58373E-02         2.29502E-02        -3.71367E-02         1.62298E+00         1.66133E+00         1.62340E+00         1.77954E+00         1.00000E+00         4.72428E-11         1.77954E+00         5.60141E-01         1.21940E+00
+          2.58373E-02         2.31201E-02        -3.73825E-02         1.62297E+00         1.67200E+00         1.62340E+00         1.76527E+00         1.00000E+00         3.46733E-11         1.76527E+00         5.58452E-01         1.20682E+00
+          2.58373E-02         2.32899E-02        -3.76301E-02         1.62296E+00         1.68267E+00         1.62340E+00         1.75040E+00         1.00000E+00         2.10059E-11         1.75040E+00         5.56105E-01         1.19429E+00
+          2.58373E-02         2.34597E-02        -3.78795E-02         1.62296E+00         1.69334E+00         1.62340E+00         1.73495E+00         1.00000E+00         7.20425E-12         1.73495E+00         5.53109E-01         1.18184E+00
+          2.58373E-02         2.36295E-02        -3.81307E-02         1.62295E+00         1.70401E+00         1.62340E+00         1.71895E+00         1.00000E+00         1.22352E-11         1.71895E+00         5.49473E-01         1.16947E+00
+          2.58373E-02         2.37994E-02        -3.83838E-02         1.62295E+00         1.71468E+00         1.62340E+00         1.70242E+00         1.00000E+00         2.93671E-11         1.70242E+00         5.45209E-01         1.15721E+00
+          2.58373E-02         2.39692E-02        -3.86386E-02         1.62294E+00         1.72535E+00         1.62340E+00         1.68539E+00         1.00000E+00         4.82658E-11         1.68539E+00         5.40332E-01         1.14506E+00
+          2.58373E-02         2.41390E-02        -3.88953E-02         1.62293E+00         1.73602E+00         1.62340E+00         1.66789E+00         1.00000E+00         6.85673E-11         1.66789E+00         5.34857E-01         1.13303E+00
+          2.58373E-02         2.43088E-02        -3.91537E-02         1.62293E+00         1.74669E+00         1.62340E+00         1.64993E+00         1.00000E+00         9.02102E-11         1.64993E+00         5.28803E-01         1.12112E+00
+          2.58373E-02         2.44787E-02        -3.94140E-02         1.62292E+00         1.75736E+00         1.62340E+00         1.63153E+00         1.00000E+00         1.13165E-10         1.63153E+00         5.22187E-01         1.10934E+00
+          2.58373E-02         2.46485E-02        -3.96761E-02         1.62291E+00         1.76804E+00         1.62340E+00         1.61273E+00         1.00000E+00         1.37404E-10         1.61273E+00         5.15032E-01         1.09769E+00
+          2.58373E-02         2.48183E-02        -3.99400E-02         1.62290E+00         1.77871E+00         1.62340E+00         1.59353E+00         1.00000E+00         1.62895E-10         1.59353E+00         5.07360E-01         1.08617E+00
+          2.58373E-02         2.49882E-02        -4.02058E-02         1.62290E+00         1.78938E+00         1.62340E+00         1.57396E+00         1.00000E+00         1.89597E-10         1.57396E+00         4.99195E-01         1.07477E+00
+          2.58373E-02         2.51580E-02        -4.04733E-02         1.62289E+00         1.80005E+00         1.62340E+00         1.55404E+00         1.00000E+00         2.17458E-10         1.55404E+00         4.90562E-01         1.06348E+00
+          2.58373E-02         2.53278E-02        -4.07427E-02         1.62288E+00         1.81072E+00         1.62340E+00         1.53380E+00         1.00000E+00         2.46419E-10         1.53380E+00         4.81486E-01         1.05231E+00
+          2.58373E-02         2.54976E-02        -4.10138E-02         1.62288E+00         1.82139E+00         1.62340E+00         1.51323E+00         1.00000E+00         2.76408E-10         1.51323E+00         4.71996E-01         1.04124E+00
+          2.58373E-02         2.56675E-02        -4.12868E-02         1.62287E+00         1.83206E+00         1.62340E+00         1.49238E+00         1.00000E+00         3.07342E-10         1.49238E+00         4.62119E-01         1.03026E+00
+          2.58373E-02         2.58373E-02        -4.15616E-02         1.62286E+00         1.84273E+00         1.62340E+00         1.47124E+00         1.00000E+00         3.39126E-10         1.47124E+00         4.51884E-01         1.01936E+00
+          2.58373E-02         2.60071E-02        -4.18382E-02         1.62286E+00         1.85340E+00         1.62340E+00         1.44985E+00         1.00000E+00         3.71653E-10         1.44985E+00         4.41321E-01         1.00853E+00
+          2.58373E-02         2.61769E-02        -4.21166E-02         1.62285E+00         1.86407E+00         1.62340E+00         1.42822E+00         1.00000E+00         4.04804E-10         1.42822E+00         4.30459E-01         9.97757E-01
+          2.60071E-02         8.72665E-04        -2.08935E-02         1.63407E+00         2.74155E-01         1.63421E+00         4.87446E+01         1.00000E+00         6.35110E-11         4.87446E+01         2.12239E+00         4.66222E+01
+          2.60071E-02         1.04249E-03        -2.09037E-02         1.63407E+00         2.84826E-01         1.63421E+00         4.78797E+01         1.00000E+00         5.91762E-11         4.78797E+01         2.11344E+00         4.57663E+01
+          2.60071E-02         1.21232E-03        -2.09158E-02         1.63407E+00         2.95496E-01         1.63421E+00         4.69968E+01         1.00000E+00         5.49223E-11         4.69968E+01         2.10388E+00         4.48929E+01
+          2.60071E-02         1.38215E-03        -2.09296E-02         1.63407E+00         3.06167E-01         1.63421E+00         4.60974E+01         1.00000E+00         5.07655E-11         4.60974E+01         2.09368E+00         4.40037E+01
+          2.60071E-02         1.55197E-03        -2.09452E-02         1.63407E+00         3.16838E-01         1.63421E+00         4.51829E+01         1.00000E+00         4.67210E-11         4.51829E+01         2.08282E+00         4.31001E+01
+          2.60071E-02         1.72180E-03        -2.09627E-02         1.63407E+00         3.27508E-01         1.63421E+00         4.42547E+01         1.00000E+00         4.28028E-11         4.42547E+01         2.07128E+00         4.21835E+01
+          2.60071E-02         1.89163E-03        -2.09820E-02         1.63407E+00         3.38179E-01         1.63421E+00         4.33144E+01         1.00000E+00         3.90236E-11         4.33144E+01         2.05904E+00         4.12554E+01
+          2.60071E-02         2.06146E-03        -2.10031E-02         1.63407E+00         3.48849E-01         1.63421E+00         4.23634E+01         1.00000E+00         3.53950E-11         4.23634E+01         2.04609E+00         4.03173E+01
+          2.60071E-02         2.23128E-03        -2.10260E-02         1.63407E+00         3.59520E-01         1.63421E+00         4.14032E+01         1.00000E+00         3.19272E-11         4.14032E+01         2.03242E+00         3.93707E+01
+          2.60071E-02         2.40111E-03        -2.10507E-02         1.63407E+00         3.70190E-01         1.63421E+00         4.04351E+01         1.00000E+00         2.86290E-11         4.04351E+01         2.01799E+00         3.84171E+01
+          2.60071E-02         2.57094E-03        -2.10772E-02         1.63407E+00         3.80861E-01         1.63421E+00         3.94607E+01         1.00000E+00         2.55077E-11         3.94607E+01         2.00281E+00         3.74579E+01
+          2.60071E-02         2.74077E-03        -2.11055E-02         1.63407E+00         3.91532E-01         1.63421E+00         3.84815E+01         1.00000E+00         2.25694E-11         3.84815E+01         1.98687E+00         3.64946E+01
+          2.60071E-02         2.91059E-03        -2.11357E-02         1.63407E+00         4.02202E-01         1.63421E+00         3.74987E+01         1.00000E+00         1.98186E-11         3.74987E+01         1.97014E+00         3.55285E+01
+          2.60071E-02         3.08042E-03        -2.11676E-02         1.63407E+00         4.12873E-01         1.63420E+00         3.65138E+01         1.00000E+00         1.72586E-11         3.65138E+01         1.95263E+00         3.45612E+01
+          2.60071E-02         3.25025E-03        -2.12014E-02         1.63407E+00         4.23543E-01         1.63420E+00         3.55282E+01         1.00000E+00         1.48910E-11         3.55282E+01         1.93433E+00         3.35939E+01
+          2.60071E-02         3.42008E-03        -2.12369E-02         1.63407E+00         4.34214E-01         1.63420E+00         3.45433E+01         1.00000E+00         1.27163E-11         3.45433E+01         1.91523E+00         3.26280E+01
+          2.60071E-02         3.58990E-03        -2.12743E-02         1.63407E+00         4.44884E-01         1.63420E+00         3.35602E+01         1.00000E+00         1.07335E-11         3.35602E+01         1.89534E+00         3.16649E+01
+          2.60071E-02         3.75973E-03        -2.13135E-02         1.63406E+00         4.55555E-01         1.63420E+00         3.25805E+01         1.00000E+00         8.94022E-12         3.25805E+01         1.87465E+00         3.07058E+01
+          2.60071E-02         3.92956E-03        -2.13545E-02         1.63406E+00         4.66225E-01         1.63420E+00         3.16052E+01         1.00000E+00         7.33311E-12         3.16052E+01         1.85316E+00         2.97520E+01
+          2.60071E-02         4.09939E-03        -2.13974E-02         1.63406E+00         4.76896E-01         1.63420E+00         3.06356E+01         1.00000E+00         5.90742E-12         3.06356E+01         1.83089E+00         2.88047E+01
+          2.60071E-02         4.26921E-03        -2.14420E-02         1.63406E+00         4.87567E-01         1.63420E+00         2.96729E+01         1.00000E+00         4.65735E-12         2.96729E+01         1.80784E+00         2.78651E+01
+          2.60071E-02         4.43904E-03        -2.14884E-02         1.63406E+00         4.98237E-01         1.63420E+00         2.87183E+01         1.00000E+00         3.57603E-12         2.87183E+01         1.78402E+00         2.69342E+01
+          2.60071E-02         4.60887E-03        -2.15367E-02         1.63406E+00         5.08908E-01         1.63420E+00         2.77728E+01         1.00000E+00         2.65558E-12         2.77728E+01         1.75943E+00         2.60133E+01
+          2.60071E-02         4.77869E-03        -2.15868E-02         1.63406E+00         5.19578E-01         1.63420E+00         2.68375E+01         1.00000E+00         1.88718E-12         2.68375E+01         1.73411E+00         2.51033E+01
+          2.60071E-02         4.94852E-03        -2.16387E-02         1.63406E+00         5.30249E-01         1.63420E+00         2.59134E+01         1.00000E+00         1.26105E-12         2.59134E+01         1.70805E+00         2.42053E+01
+          2.60071E-02         5.11835E-03        -2.16923E-02         1.63405E+00         5.40919E-01         1.63420E+00         2.50014E+01         1.00000E+00         7.66432E-13         2.50014E+01         1.68129E+00         2.33201E+01
+          2.60071E-02         5.28818E-03        -2.17479E-02         1.63405E+00         5.51590E-01         1.63420E+00         2.41026E+01         1.00000E+00         3.91381E-13         2.41026E+01         1.65383E+00         2.24487E+01
+          2.60071E-02         5.45800E-03        -2.18052E-02         1.63405E+00         5.62261E-01         1.63420E+00         2.32177E+01         1.00000E+00         1.22652E-13         2.32177E+01         1.62572E+00         2.15920E+01
+          2.60071E-02         5.62783E-03        -2.18643E-02         1.63405E+00         5.72931E-01         1.63420E+00         2.23476E+01         1.00000E+00         6.19014E-14         2.23476E+01         1.59697E+00         2.07506E+01
+          2.60071E-02         5.79766E-03        -2.19252E-02         1.63405E+00         5.83602E-01         1.63420E+00         2.14930E+01         1.00000E+00         1.75012E-13         2.14930E+01         1.56761E+00         1.99254E+01
+          2.60071E-02         5.96749E-03        -2.19880E-02         1.63405E+00         5.94272E-01         1.63419E+00         2.06547E+01         1.00000E+00         2.55606E-13         2.06547E+01         1.53767E+00         1.91170E+01
+          2.60071E-02         6.13731E-03        -2.20525E-02         1.63404E+00         6.04943E-01         1.63419E+00         1.98333E+01         1.00000E+00         3.42584E-13         1.98333E+01         1.50719E+00         1.83261E+01
+          2.60071E-02         6.30714E-03        -2.21189E-02         1.63404E+00         6.15613E-01         1.63419E+00         1.90294E+01         1.00000E+00         4.67897E-13         1.90294E+01         1.47620E+00         1.75532E+01
+          2.60071E-02         6.47697E-03        -2.21871E-02         1.63404E+00         6.26284E-01         1.63419E+00         1.82436E+01         1.00000E+00         6.41212E-13         1.82436E+01         1.44473E+00         1.67989E+01
+          2.60071E-02         6.64680E-03        -2.22571E-02         1.63404E+00         6.36955E-01         1.63419E+00         1.74764E+01         1.00000E+00         8.56269E-13         1.74764E+01         1.41283E+00         1.60636E+01
+          2.60071E-02         6.81662E-03        -2.23289E-02         1.63404E+00         6.47625E-01         1.63419E+00         1.67282E+01         1.00000E+00         1.10197E-12         1.67282E+01         1.38054E+00         1.53477E+01
+          2.60071E-02         6.98645E-03        -2.24025E-02         1.63404E+00         6.58296E-01         1.63419E+00         1.59995E+01         1.00000E+00         1.36710E-12         1.59995E+01         1.34790E+00         1.46516E+01
+          2.60071E-02         7.15628E-03        -2.24780E-02         1.63403E+00         6.68966E-01         1.63419E+00         1.52905E+01         1.00000E+00         1.64139E-12         1.52905E+01         1.31495E+00         1.39756E+01
+          2.60071E-02         7.32611E-03        -2.25552E-02         1.63403E+00         6.79637E-01         1.63419E+00         1.46017E+01         1.00000E+00         1.91566E-12         1.46017E+01         1.28174E+00         1.33199E+01
+          2.60071E-02         7.49593E-03        -2.26343E-02         1.63403E+00         6.90307E-01         1.63419E+00         1.39331E+01         1.00000E+00         2.18178E-12         1.39331E+01         1.24832E+00         1.26848E+01
+          2.60071E-02         7.66576E-03        -2.27151E-02         1.63403E+00         7.00978E-01         1.63419E+00         1.32851E+01         1.00000E+00         2.43266E-12         1.32851E+01         1.21473E+00         1.20704E+01
+          2.60071E-02         7.83559E-03        -2.27978E-02         1.63403E+00         7.11649E-01         1.63418E+00         1.26578E+01         1.00000E+00         2.66233E-12         1.26578E+01         1.18102E+00         1.14768E+01
+          2.60071E-02         8.00542E-03        -2.28823E-02         1.63402E+00         7.22319E-01         1.63418E+00         1.20513E+01         1.00000E+00         2.86592E-12         1.20513E+01         1.14725E+00         1.09040E+01
+          2.60071E-02         8.17524E-03        -2.29686E-02         1.63402E+00         7.32990E-01         1.63418E+00         1.14656E+01         1.00000E+00         3.03981E-12         1.14656E+01         1.11347E+00         1.03521E+01
+          2.60071E-02         8.34507E-03        -2.30567E-02         1.63402E+00         7.43660E-01         1.63418E+00         1.09007E+01         1.00000E+00         3.18169E-12         1.09007E+01         1.07972E+00         9.82098E+00
+          2.60071E-02         8.51490E-03        -2.31466E-02         1.63402E+00         7.54331E-01         1.63418E+00         1.03566E+01         1.00000E+00         3.29070E-12         1.03566E+01         1.04606E+00         9.31059E+00
+          2.60071E-02         8.68473E-03        -2.32384E-02         1.63401E+00         7.65001E-01         1.63418E+00         9.83334E+00         1.00000E+00         3.36757E-12         9.83334E+00         1.01254E+00         8.82080E+00
+          2.60071E-02         8.85455E-03        -2.33319E-02         1.63401E+00         7.75672E-01         1.63418E+00         9.33065E+00         1.00000E+00         3.41480E-12         9.33065E+00         9.79214E-01         8.35144E+00
+          2.60071E-02         9.02438E-03        -2.34273E-02         1.63401E+00         7.86343E-01         1.63418E+00         8.84843E+00         1.00000E+00         3.43682E-12         8.84843E+00         9.46135E-01         7.90230E+00
+          2.60071E-02         9.19421E-03        -2.35245E-02         1.63401E+00         7.97013E-01         1.63418E+00         8.38650E+00         1.00000E+00         3.44018E-12         8.38650E+00         9.13356E-01         7.47314E+00
+          2.60071E-02         9.36403E-03        -2.36234E-02         1.63400E+00         8.07684E-01         1.63417E+00         7.94461E+00         1.00000E+00         3.43364E-12         7.94461E+00         8.80928E-01         7.06368E+00
+          2.60071E-02         9.53386E-03        -2.37242E-02         1.63400E+00         8.18354E-01         1.63417E+00         7.52252E+00         1.00000E+00         3.42803E-12         7.52252E+00         8.48902E-01         6.67362E+00
+          2.60071E-02         9.70369E-03        -2.38268E-02         1.63400E+00         8.29025E-01         1.63417E+00         7.11993E+00         1.00000E+00         3.43582E-12         7.11993E+00         8.17330E-01         6.30260E+00
+          2.60071E-02         9.87352E-03        -2.39313E-02         1.63400E+00         8.39695E-01         1.63417E+00         6.73652E+00         1.00000E+00         3.47005E-12         6.73652E+00         7.86262E-01         5.95025E+00
+          2.60071E-02         1.00433E-02        -2.40375E-02         1.63399E+00         8.50366E-01         1.63417E+00         6.37194E+00         1.00000E+00         3.54276E-12         6.37194E+00         7.55747E-01         5.61619E+00
+          2.60071E-02         1.02132E-02        -2.41455E-02         1.63399E+00         8.61037E-01         1.63417E+00         6.02582E+00         1.00000E+00         3.66318E-12         6.02582E+00         7.25833E-01         5.29999E+00
+          2.60071E-02         1.03830E-02        -2.42554E-02         1.63399E+00         8.71707E-01         1.63417E+00         5.69776E+00         1.00000E+00         3.83608E-12         5.69776E+00         6.96566E-01         5.00119E+00
+          2.60071E-02         1.05528E-02        -2.43671E-02         1.63398E+00         8.82378E-01         1.63417E+00         5.38734E+00         1.00000E+00         4.06116E-12         5.38734E+00         6.67992E-01         4.71934E+00
+          2.60071E-02         1.07227E-02        -2.44805E-02         1.63398E+00         8.93048E-01         1.63417E+00         5.09411E+00         1.00000E+00         4.33344E-12         5.09411E+00         6.40154E-01         4.45396E+00
+          2.60071E-02         1.08925E-02        -2.45958E-02         1.63398E+00         9.03719E-01         1.63416E+00         4.81763E+00         1.00000E+00         4.64441E-12         4.81763E+00         6.13093E-01         4.20454E+00
+          2.60071E-02         1.10623E-02        -2.47129E-02         1.63398E+00         9.14389E-01         1.63416E+00         4.55742E+00         1.00000E+00         4.98331E-12         4.55742E+00         5.86850E-01         3.97057E+00
+          2.60071E-02         1.12321E-02        -2.48318E-02         1.63397E+00         9.25060E-01         1.63416E+00         4.31299E+00         1.00000E+00         5.33828E-12         4.31299E+00         5.61462E-01         3.75153E+00
+          2.60071E-02         1.14020E-02        -2.49526E-02         1.63397E+00         9.35731E-01         1.63416E+00         4.08384E+00         1.00000E+00         5.69710E-12         4.08384E+00         5.36965E-01         3.54687E+00
+          2.60071E-02         1.15718E-02        -2.50751E-02         1.63397E+00         9.46401E-01         1.63416E+00         3.86945E+00         1.00000E+00         6.04763E-12         3.86945E+00         5.13391E-01         3.35606E+00
+          2.60071E-02         1.17416E-02        -2.51995E-02         1.63396E+00         9.57072E-01         1.63416E+00         3.66932E+00         1.00000E+00         6.37798E-12         3.66932E+00         4.90773E-01         3.17855E+00
+          2.60071E-02         1.19114E-02        -2.53256E-02         1.63396E+00         9.67742E-01         1.63416E+00         3.48291E+00         1.00000E+00         6.67667E-12         3.48291E+00         4.69137E-01         3.01378E+00
+          2.60071E-02         1.20813E-02        -2.54536E-02         1.63396E+00         9.78413E-01         1.63415E+00         3.30970E+00         1.00000E+00         6.93261E-12         3.30970E+00         4.48510E-01         2.86119E+00
+          2.60071E-02         1.22511E-02        -2.55834E-02         1.63395E+00         9.89083E-01         1.63415E+00         3.14915E+00         1.00000E+00         7.13511E-12         3.14915E+00         4.28915E-01         2.72023E+00
+          2.60071E-02         1.24209E-02        -2.57150E-02         1.63395E+00         9.99754E-01         1.63415E+00         3.00072E+00         1.00000E+00         7.27390E-12         3.00072E+00         4.10372E-01         2.59035E+00
+          2.60071E-02         1.25908E-02        -2.58484E-02         1.63395E+00         1.01042E+00         1.63415E+00         2.86388E+00         1.00000E+00         7.33912E-12         2.86388E+00         3.92898E-01         2.47098E+00
+          2.60071E-02         1.27606E-02        -2.59836E-02         1.63394E+00         1.02110E+00         1.63415E+00         2.73810E+00         1.00000E+00         7.32134E-12         2.73810E+00         3.76508E-01         2.36159E+00
+          2.60071E-02         1.29304E-02        -2.61206E-02         1.63394E+00         1.03177E+00         1.63415E+00         2.62285E+00         1.00000E+00         7.21158E-12         2.62285E+00         3.61214E-01         2.26163E+00
+          2.60071E-02         1.31002E-02        -2.62595E-02         1.63394E+00         1.04244E+00         1.63415E+00         2.51759E+00         1.00000E+00         7.00130E-12         2.51759E+00         3.47023E-01         2.17056E+00
+          2.60071E-02         1.32701E-02        -2.64002E-02         1.63393E+00         1.05311E+00         1.63414E+00         2.42181E+00         1.00000E+00         6.68249E-12         2.42181E+00         3.33943E-01         2.08786E+00
+          2.60071E-02         1.34399E-02        -2.65426E-02         1.63393E+00         1.06378E+00         1.63414E+00         2.33499E+00         1.00000E+00         6.24769E-12         2.33499E+00         3.21974E-01         2.01301E+00
+          2.60071E-02         1.36097E-02        -2.66869E-02         1.63392E+00         1.07445E+00         1.63414E+00         2.25662E+00         1.00000E+00         5.69001E-12         2.25662E+00         3.11116E-01         1.94551E+00
+          2.60071E-02         1.37795E-02        -2.68330E-02         1.63392E+00         1.08512E+00         1.63414E+00         2.18622E+00         1.00000E+00         5.00332E-12         2.18622E+00         3.01367E-01         1.88485E+00
+          2.60071E-02         1.39494E-02        -2.69809E-02         1.63392E+00         1.09579E+00         1.63414E+00         2.12328E+00         1.00000E+00         4.18242E-12         2.12328E+00         2.92720E-01         1.83056E+00
+          2.60071E-02         1.41192E-02        -2.71306E-02         1.63391E+00         1.10646E+00         1.63414E+00         2.06734E+00         1.00000E+00         3.22374E-12         2.06734E+00         2.85165E-01         1.78217E+00
+          2.60071E-02         1.42890E-02        -2.72821E-02         1.63391E+00         1.11713E+00         1.63414E+00         2.01792E+00         1.00000E+00         2.12844E-12         2.01792E+00         2.78689E-01         1.73923E+00
+          2.60071E-02         1.44589E-02        -2.74355E-02         1.63390E+00         1.12780E+00         1.63414E+00         1.97458E+00         1.00000E+00         9.32434E-13         1.97458E+00         2.73278E-01         1.70131E+00
+          2.60071E-02         1.46287E-02        -2.75906E-02         1.63390E+00         1.13847E+00         1.63413E+00         1.93688E+00         1.00000E+00         7.37009E-13         1.93688E+00         2.68914E-01         1.66797E+00
+          2.60071E-02         1.47985E-02        -2.77476E-02         1.63390E+00         1.14914E+00         1.63413E+00         1.90439E+00         1.00000E+00         2.20327E-12         1.90439E+00         2.65574E-01         1.63881E+00
+          2.60071E-02         1.49683E-02        -2.79064E-02         1.63389E+00         1.15981E+00         1.63413E+00         1.87669E+00         1.00000E+00         3.90796E-12         1.87669E+00         2.63237E-01         1.61345E+00
+          2.60071E-02         1.51382E-02        -2.80670E-02         1.63389E+00         1.17048E+00         1.63413E+00         1.85339E+00         1.00000E+00         5.78134E-12         1.85339E+00         2.61876E-01         1.59152E+00
+          2.60071E-02         1.53080E-02        -2.82294E-02         1.63388E+00         1.18115E+00         1.63413E+00         1.83412E+00         1.00000E+00         7.81557E-12         1.83412E+00         2.61462E-01         1.57266E+00
+          2.60071E-02         1.54778E-02        -2.83936E-02         1.63388E+00         1.19182E+00         1.63413E+00         1.81850E+00         1.00000E+00         1.00077E-11         1.81850E+00         2.61964E-01         1.55654E+00
+          2.60071E-02         1.56476E-02        -2.85596E-02         1.63388E+00         1.20249E+00         1.63413E+00         1.80618E+00         1.00000E+00         1.23549E-11         1.80618E+00         2.63348E-01         1.54283E+00
+          2.60071E-02         1.58175E-02        -2.87275E-02         1.63387E+00         1.21317E+00         1.63412E+00         1.79683E+00         1.00000E+00         1.48543E-11         1.79683E+00         2.65581E-01         1.53125E+00
+          2.60071E-02         1.59873E-02        -2.88971E-02         1.63387E+00         1.22384E+00         1.63412E+00         1.79013E+00         1.00000E+00         1.75017E-11         1.79013E+00         2.68623E-01         1.52151E+00
+          2.60071E-02         1.61571E-02        -2.90686E-02         1.63386E+00         1.23451E+00         1.63412E+00         1.78578E+00         1.00000E+00         2.02922E-11         1.78578E+00         2.72435E-01         1.51335E+00
+          2.60071E-02         1.63270E-02        -2.92419E-02         1.63386E+00         1.24518E+00         1.63412E+00         1.78349E+00         1.00000E+00         2.32201E-11         1.78349E+00         2.76978E-01         1.50651E+00
+          2.60071E-02         1.64968E-02        -2.94169E-02         1.63385E+00         1.25585E+00         1.63412E+00         1.78299E+00         1.00000E+00         2.62783E-11         1.78299E+00         2.82207E-01         1.50078E+00
+          2.60071E-02         1.66666E-02        -2.95938E-02         1.63385E+00         1.26652E+00         1.63412E+00         1.78402E+00         1.00000E+00         2.94589E-11         1.78402E+00         2.88078E-01         1.49594E+00
+          2.60071E-02         1.68364E-02        -2.97726E-02         1.63384E+00         1.27719E+00         1.63412E+00         1.78635E+00         1.00000E+00         3.27525E-11         1.78635E+00         2.94547E-01         1.49180E+00
+          2.60071E-02         1.70063E-02        -2.99531E-02         1.63384E+00         1.28786E+00         1.63411E+00         1.78974E+00         1.00000E+00         3.61490E-11         1.78974E+00         3.01566E-01         1.48818E+00
+          2.60071E-02         1.71761E-02        -3.01354E-02         1.63383E+00         1.29853E+00         1.63411E+00         1.79400E+00         1.00000E+00         3.96367E-11         1.79400E+00         3.09088E-01         1.48491E+00
+          2.60071E-02         1.73459E-02        -3.03196E-02         1.63383E+00         1.30920E+00         1.63411E+00         1.79892E+00         1.00000E+00         4.32029E-11         1.79892E+00         3.17065E-01         1.48186E+00
+          2.60071E-02         1.75158E-02        -3.05055E-02         1.63382E+00         1.31987E+00         1.63411E+00         1.80433E+00         1.00000E+00         4.68333E-11         1.80433E+00         3.25448E-01         1.47889E+00
+          2.60071E-02         1.76856E-02        -3.06933E-02         1.63382E+00         1.33054E+00         1.63411E+00         1.81007E+00         1.00000E+00         5.05127E-11         1.81007E+00         3.34186E-01         1.47588E+00
+          2.60071E-02         1.78554E-02        -3.08829E-02         1.63382E+00         1.34121E+00         1.63411E+00         1.81597E+00         1.00000E+00         5.42241E-11         1.81597E+00         3.43231E-01         1.47274E+00
+          2.60071E-02         1.80252E-02        -3.10743E-02         1.63381E+00         1.35188E+00         1.63411E+00         1.82190E+00         1.00000E+00         5.79494E-11         1.82190E+00         3.52533E-01         1.46936E+00
+          2.60071E-02         1.81951E-02        -3.12675E-02         1.63381E+00         1.36255E+00         1.63410E+00         1.82773E+00         1.00000E+00         6.16690E-11         1.82773E+00         3.62041E-01         1.46569E+00
+          2.60071E-02         1.83649E-02        -3.14625E-02         1.63380E+00         1.37322E+00         1.63410E+00         1.83335E+00         1.00000E+00         6.53617E-11         1.83335E+00         3.71706E-01         1.46165E+00
+          2.60071E-02         1.85347E-02        -3.16594E-02         1.63379E+00         1.38389E+00         1.63410E+00         1.83866E+00         1.00000E+00         6.90051E-11         1.83866E+00         3.81479E-01         1.45718E+00
+          2.60071E-02         1.87045E-02        -3.18580E-02         1.63379E+00         1.39457E+00         1.63410E+00         1.84356E+00         1.00000E+00         7.25749E-11         1.84356E+00         3.91310E-01         1.45225E+00
+          2.60071E-02         1.88744E-02        -3.20585E-02         1.63378E+00         1.40524E+00         1.63410E+00         1.84798E+00         1.00000E+00         7.60457E-11         1.84798E+00         4.01152E-01         1.44683E+00
+          2.60071E-02         1.90442E-02        -3.22608E-02         1.63378E+00         1.41591E+00         1.63410E+00         1.85184E+00         1.00000E+00         7.93902E-11         1.85184E+00         4.10958E-01         1.44088E+00
+          2.60071E-02         1.92140E-02        -3.24648E-02         1.63377E+00         1.42658E+00         1.63410E+00         1.85508E+00         1.00000E+00         8.25799E-11         1.85508E+00         4.20681E-01         1.43440E+00
+          2.60071E-02         1.93839E-02        -3.26707E-02         1.63377E+00         1.43725E+00         1.63410E+00         1.85765E+00         1.00000E+00         8.55846E-11         1.85765E+00         4.30276E-01         1.42738E+00
+          2.60071E-02         1.95537E-02        -3.28785E-02         1.63376E+00         1.44792E+00         1.63409E+00         1.85951E+00         1.00000E+00         8.83725E-11         1.85951E+00         4.39699E-01         1.41982E+00
+          2.60071E-02         1.97235E-02        -3.30880E-02         1.63376E+00         1.45859E+00         1.63409E+00         1.86063E+00         1.00000E+00         9.09105E-11         1.86063E+00         4.48908E-01         1.41172E+00
+          2.60071E-02         1.98933E-02        -3.32993E-02         1.63375E+00         1.46926E+00         1.63409E+00         1.86096E+00         1.00000E+00         9.31641E-11         1.86096E+00         4.57862E-01         1.40310E+00
+          2.60071E-02         2.00632E-02        -3.35125E-02         1.63375E+00         1.47993E+00         1.63409E+00         1.86049E+00         1.00000E+00         9.50971E-11         1.86049E+00         4.66521E-01         1.39397E+00
+          2.60071E-02         2.02330E-02        -3.37274E-02         1.63374E+00         1.49060E+00         1.63409E+00         1.85921E+00         1.00000E+00         9.66725E-11         1.85921E+00         4.74848E-01         1.38436E+00
+          2.60071E-02         2.04028E-02        -3.39442E-02         1.63374E+00         1.50127E+00         1.63409E+00         1.85711E+00         1.00000E+00         9.78516E-11         1.85711E+00         4.82807E-01         1.37430E+00
+          2.60071E-02         2.05726E-02        -3.41628E-02         1.63373E+00         1.51194E+00         1.63409E+00         1.85417E+00         1.00000E+00         9.85949E-11         1.85417E+00         4.90364E-01         1.36381E+00
+          2.60071E-02         2.07425E-02        -3.43832E-02         1.63372E+00         1.52261E+00         1.63409E+00         1.85041E+00         1.00000E+00         9.88616E-11         1.85041E+00         4.97488E-01         1.35292E+00
+          2.60071E-02         2.09123E-02        -3.46054E-02         1.63372E+00         1.53328E+00         1.63408E+00         1.84582E+00         1.00000E+00         9.86104E-11         1.84582E+00         5.04149E-01         1.34167E+00
+          2.60071E-02         2.10821E-02        -3.48294E-02         1.63371E+00         1.54395E+00         1.63408E+00         1.84042E+00         1.00000E+00         9.77991E-11         1.84042E+00         5.10319E-01         1.33010E+00
+          2.60071E-02         2.12520E-02        -3.50553E-02         1.63371E+00         1.55462E+00         1.63408E+00         1.83421E+00         1.00000E+00         9.63849E-11         1.83421E+00         5.15974E-01         1.31823E+00
+          2.60071E-02         2.14218E-02        -3.52829E-02         1.63370E+00         1.56529E+00         1.63408E+00         1.82721E+00         1.00000E+00         9.43248E-11         1.82721E+00         5.21091E-01         1.30612E+00
+          2.60071E-02         2.15916E-02        -3.55124E-02         1.63369E+00         1.57596E+00         1.63408E+00         1.81944E+00         1.00000E+00         9.15760E-11         1.81944E+00         5.25648E-01         1.29379E+00
+          2.60071E-02         2.17614E-02        -3.57437E-02         1.63369E+00         1.58664E+00         1.63408E+00         1.81091E+00         1.00000E+00         8.80954E-11         1.81091E+00         5.29628E-01         1.28128E+00
+          2.60071E-02         2.19313E-02        -3.59767E-02         1.63368E+00         1.59731E+00         1.63408E+00         1.80165E+00         1.00000E+00         8.38409E-11         1.80165E+00         5.33015E-01         1.26864E+00
+          2.60071E-02         2.21011E-02        -3.62117E-02         1.63368E+00         1.60798E+00         1.63408E+00         1.79168E+00         1.00000E+00         7.87711E-11         1.79168E+00         5.35795E-01         1.25589E+00
+          2.60071E-02         2.22709E-02        -3.64484E-02         1.63367E+00         1.61865E+00         1.63408E+00         1.78103E+00         1.00000E+00         7.28461E-11         1.78103E+00         5.37958E-01         1.24307E+00
+          2.60071E-02         2.24407E-02        -3.66869E-02         1.63366E+00         1.62932E+00         1.63408E+00         1.76971E+00         1.00000E+00         6.60282E-11         1.76971E+00         5.39495E-01         1.23021E+00
+          2.60071E-02         2.26106E-02        -3.69272E-02         1.63366E+00         1.63999E+00         1.63408E+00         1.75775E+00         1.00000E+00         5.82826E-11         1.75775E+00         5.40400E-01         1.21735E+00
+          2.60071E-02         2.27804E-02        -3.71694E-02         1.63365E+00         1.65066E+00         1.63407E+00         1.74518E+00         1.00000E+00         4.95801E-11         1.74518E+00         5.40668E-01         1.20451E+00
+          2.60071E-02         2.29502E-02        -3.74134E-02         1.63365E+00         1.66133E+00         1.63407E+00         1.73202E+00         1.00000E+00         3.99020E-11         1.73202E+00         5.40299E-01         1.19173E+00
+          2.60071E-02         2.31201E-02        -3.76591E-02         1.63364E+00         1.67200E+00         1.63407E+00         1.71830E+00         1.00000E+00         2.92580E-11         1.71830E+00         5.39293E-01         1.17901E+00
+          2.60071E-02         2.32899E-02        -3.79067E-02         1.63363E+00         1.68267E+00         1.63407E+00         1.70405E+00         1.00000E+00         1.77789E-11         1.70405E+00         5.37653E-01         1.16640E+00
+          2.60071E-02         2.34597E-02        -3.81561E-02         1.63363E+00         1.69334E+00         1.63407E+00         1.68928E+00         1.00000E+00         6.92864E-12         1.68928E+00         5.35385E-01         1.15390E+00
+          2.60071E-02         2.36295E-02        -3.84074E-02         1.63362E+00         1.70401E+00         1.63407E+00         1.67402E+00         1.00000E+00         1.16967E-11         1.67402E+00         5.32495E-01         1.14153E+00
+          2.60071E-02         2.37994E-02        -3.86604E-02         1.63361E+00         1.71468E+00         1.63407E+00         1.65830E+00         1.00000E+00         2.60150E-11         1.65830E+00         5.28994E-01         1.12931E+00
+          2.60071E-02         2.39692E-02        -3.89152E-02         1.63361E+00         1.72535E+00         1.63407E+00         1.64214E+00         1.00000E+00         4.20837E-11         1.64214E+00         5.24892E-01         1.11725E+00
+          2.60071E-02         2.41390E-02        -3.91719E-02         1.63360E+00         1.73602E+00         1.63407E+00         1.62556E+00         1.00000E+00         5.94217E-11         1.62556E+00         5.20203E-01         1.10535E+00
+          2.60071E-02         2.43088E-02        -3.94304E-02         1.63359E+00         1.74669E+00         1.63407E+00         1.60858E+00         1.00000E+00         7.79429E-11         1.60858E+00         5.14943E-01         1.09363E+00
+          2.60071E-02         2.44787E-02        -3.96907E-02         1.63359E+00         1.75736E+00         1.63407E+00         1.59122E+00         1.00000E+00         9.76127E-11         1.59122E+00         5.09127E-01         1.08209E+00
+          2.60071E-02         2.46485E-02        -3.99527E-02         1.63358E+00         1.76804E+00         1.63407E+00         1.57350E+00         1.00000E+00         1.18404E-10         1.57350E+00         5.02774E-01         1.07072E+00
+          2.60071E-02         2.48183E-02        -4.02167E-02         1.63357E+00         1.77871E+00         1.63407E+00         1.55544E+00         1.00000E+00         1.40287E-10         1.55544E+00         4.95905E-01         1.05954E+00
+          2.60071E-02         2.49882E-02        -4.04824E-02         1.63357E+00         1.78938E+00         1.63407E+00         1.53706E+00         1.00000E+00         1.63228E-10         1.53706E+00         4.88541E-01         1.04852E+00
+          2.60071E-02         2.51580E-02        -4.07499E-02         1.63356E+00         1.80005E+00         1.63407E+00         1.51838E+00         1.00000E+00         1.87183E-10         1.51838E+00         4.80704E-01         1.03768E+00
+          2.60071E-02         2.53278E-02        -4.10193E-02         1.63355E+00         1.81072E+00         1.63407E+00         1.49941E+00         1.00000E+00         2.12100E-10         1.49941E+00         4.72419E-01         1.02699E+00
+          2.60071E-02         2.54976E-02        -4.12904E-02         1.63354E+00         1.82139E+00         1.63407E+00         1.48016E+00         1.00000E+00         2.37920E-10         1.48016E+00         4.63710E-01         1.01645E+00
+          2.60071E-02         2.56675E-02        -4.15634E-02         1.63354E+00         1.83206E+00         1.63407E+00         1.46066E+00         1.00000E+00         2.64571E-10         1.46066E+00         4.54603E-01         1.00606E+00
+          2.60071E-02         2.58373E-02        -4.18382E-02         1.63353E+00         1.84273E+00         1.63407E+00         1.44092E+00         1.00000E+00         2.91973E-10         1.44092E+00         4.45126E-01         9.95789E-01
+          2.60071E-02         2.60071E-02        -4.21148E-02         1.63352E+00         1.85340E+00         1.63407E+00         1.42094E+00         1.00000E+00         3.20034E-10         1.42094E+00         4.35306E-01         9.85635E-01
+          2.60071E-02         2.61769E-02        -4.23932E-02         1.63352E+00         1.86407E+00         1.63407E+00         1.40075E+00         1.00000E+00         3.48651E-10         1.40075E+00         4.25170E-01         9.75579E-01
+          2.61769E-02         8.72665E-04        -2.11720E-02         1.64475E+00         2.74155E-01         1.64488E+00         4.77938E+01         1.00000E+00         5.67345E-11         4.77938E+01         1.94038E+00         4.58534E+01
+          2.61769E-02         1.04249E-03        -2.11822E-02         1.64475E+00         2.84826E-01         1.64488E+00         4.69456E+01         1.00000E+00         5.28101E-11         4.69456E+01         1.93421E+00         4.50114E+01
+          2.61769E-02         1.21232E-03        -2.11943E-02         1.64474E+00         2.95496E-01         1.64488E+00         4.60799E+01         1.00000E+00         4.89618E-11         4.60799E+01         1.92750E+00         4.41524E+01
+          2.61769E-02         1.38215E-03        -2.12081E-02         1.64474E+00         3.06167E-01         1.64488E+00         4.51979E+01         1.00000E+00         4.52042E-11         4.51979E+01         1.92023E+00         4.32776E+01
+          2.61769E-02         1.55197E-03        -2.12238E-02         1.64474E+00         3.16838E-01         1.64488E+00         4.43011E+01         1.00000E+00         4.15512E-11         4.43011E+01         1.91238E+00         4.23887E+01
+          2.61769E-02         1.72180E-03        -2.12412E-02         1.64474E+00         3.27508E-01         1.64488E+00         4.33910E+01         1.00000E+00         3.80153E-11         4.33910E+01         1.90392E+00         4.14870E+01
+          2.61769E-02         1.89163E-03        -2.12605E-02         1.64474E+00         3.38179E-01         1.64488E+00         4.24689E+01         1.00000E+00         3.46082E-11         4.24689E+01         1.89484E+00         4.05740E+01
+          2.61769E-02         2.06146E-03        -2.12816E-02         1.64474E+00         3.48849E-01         1.64488E+00         4.15363E+01         1.00000E+00         3.13402E-11         4.15363E+01         1.88512E+00         3.96512E+01
+          2.61769E-02         2.23128E-03        -2.13045E-02         1.64474E+00         3.59520E-01         1.64488E+00         4.05947E+01         1.00000E+00         2.82204E-11         4.05947E+01         1.87473E+00         3.87200E+01
+          2.61769E-02         2.40111E-03        -2.13292E-02         1.64474E+00         3.70190E-01         1.64488E+00         3.96455E+01         1.00000E+00         2.52568E-11         3.96455E+01         1.86365E+00         3.77818E+01
+          2.61769E-02         2.57094E-03        -2.13557E-02         1.64474E+00         3.80861E-01         1.64488E+00         3.86900E+01         1.00000E+00         2.24559E-11         3.86900E+01         1.85187E+00         3.68382E+01
+          2.61769E-02         2.74077E-03        -2.13840E-02         1.64474E+00         3.91532E-01         1.64488E+00         3.77298E+01         1.00000E+00         1.98231E-11         3.77298E+01         1.83938E+00         3.58904E+01
+          2.61769E-02         2.91059E-03        -2.14142E-02         1.64474E+00         4.02202E-01         1.64488E+00         3.67661E+01         1.00000E+00         1.73623E-11         3.67661E+01         1.82616E+00         3.49399E+01
+          2.61769E-02         3.08042E-03        -2.14461E-02         1.64474E+00         4.12873E-01         1.64488E+00         3.58004E+01         1.00000E+00         1.50763E-11         3.58004E+01         1.81220E+00         3.39882E+01
+          2.61769E-02         3.25025E-03        -2.14799E-02         1.64474E+00         4.23543E-01         1.64488E+00         3.48339E+01         1.00000E+00         1.29664E-11         3.48339E+01         1.79749E+00         3.30365E+01
+          2.61769E-02         3.42008E-03        -2.15155E-02         1.64474E+00         4.34214E-01         1.64488E+00         3.38681E+01         1.00000E+00         1.10330E-11         3.38681E+01         1.78202E+00         3.20861E+01
+          2.61769E-02         3.58990E-03        -2.15528E-02         1.64474E+00         4.44884E-01         1.64488E+00         3.29042E+01         1.00000E+00         9.27485E-12         3.29042E+01         1.76578E+00         3.11385E+01
+          2.61769E-02         3.75973E-03        -2.15920E-02         1.64473E+00         4.55555E-01         1.64488E+00         3.19435E+01         1.00000E+00         7.68986E-12         3.19435E+01         1.74878E+00         3.01948E+01
+          2.61769E-02         3.92956E-03        -2.16331E-02         1.64473E+00         4.66225E-01         1.64488E+00         3.09872E+01         1.00000E+00         6.27466E-12         3.09872E+01         1.73101E+00         2.92562E+01
+          2.61769E-02         4.09939E-03        -2.16759E-02         1.64473E+00         4.76896E-01         1.64488E+00         3.00365E+01         1.00000E+00         5.02482E-12         3.00365E+01         1.71247E+00         2.83241E+01
+          2.61769E-02         4.26921E-03        -2.17205E-02         1.64473E+00         4.87567E-01         1.64487E+00         2.90926E+01         1.00000E+00         3.93486E-12         2.90926E+01         1.69316E+00         2.73995E+01
+          2.61769E-02         4.43904E-03        -2.17670E-02         1.64473E+00         4.98237E-01         1.64487E+00         2.81566E+01         1.00000E+00         2.99835E-12         2.81566E+01         1.67309E+00         2.64835E+01
+          2.61769E-02         4.60887E-03        -2.18152E-02         1.64473E+00         5.08908E-01         1.64487E+00         2.72295E+01         1.00000E+00         2.20783E-12         2.72295E+01         1.65227E+00         2.55773E+01
+          2.61769E-02         4.77869E-03        -2.18653E-02         1.64473E+00         5.19578E-01         1.64487E+00         2.63125E+01         1.00000E+00         1.55489E-12         2.63125E+01         1.63071E+00         2.46818E+01
+          2.61769E-02         4.94852E-03        -2.19172E-02         1.64473E+00         5.30249E-01         1.64487E+00         2.54064E+01         1.00000E+00         1.03006E-12         2.54064E+01         1.60841E+00         2.37980E+01
+          2.61769E-02         5.11835E-03        -2.19709E-02         1.64472E+00         5.40919E-01         1.64487E+00         2.45123E+01         1.00000E+00         6.22634E-13         2.45123E+01         1.58539E+00         2.29269E+01
+          2.61769E-02         5.28818E-03        -2.20264E-02         1.64472E+00         5.51590E-01         1.64487E+00         2.36311E+01         1.00000E+00         3.20827E-13         2.36311E+01         1.56167E+00         2.20694E+01
+          2.61769E-02         5.45800E-03        -2.20837E-02         1.64472E+00         5.62261E-01         1.64487E+00         2.27635E+01         1.00000E+00         1.18465E-13         2.27635E+01         1.53727E+00         2.12262E+01
+          2.61769E-02         5.62783E-03        -2.21428E-02         1.64472E+00         5.72931E-01         1.64487E+00         2.19104E+01         1.00000E+00         1.00709E-13         2.19104E+01         1.51222E+00         2.03982E+01
+          2.61769E-02         5.79766E-03        -2.22037E-02         1.64472E+00         5.83602E-01         1.64487E+00         2.10726E+01         1.00000E+00         2.07794E-13         2.10726E+01         1.48652E+00         1.95861E+01
+          2.61769E-02         5.96749E-03        -2.22665E-02         1.64472E+00         5.94272E-01         1.64487E+00         2.02507E+01         1.00000E+00         3.31765E-13         2.02507E+01         1.46021E+00         1.87905E+01
+          2.61769E-02         6.13731E-03        -2.23311E-02         1.64472E+00         6.04943E-01         1.64487E+00         1.94454E+01         1.00000E+00         4.86632E-13         1.94454E+01         1.43333E+00         1.80121E+01
+          2.61769E-02         6.30714E-03        -2.23974E-02         1.64471E+00         6.15613E-01         1.64487E+00         1.86573E+01         1.00000E+00         6.81703E-13         1.86573E+01         1.40589E+00         1.72514E+01
+          2.61769E-02         6.47697E-03        -2.24656E-02         1.64471E+00         6.26284E-01         1.64487E+00         1.78869E+01         1.00000E+00         9.15985E-13         1.78869E+01         1.37793E+00         1.65090E+01
+          2.61769E-02         6.64680E-03        -2.25356E-02         1.64471E+00         6.36955E-01         1.64486E+00         1.71348E+01         1.00000E+00         1.18321E-12         1.71348E+01         1.34948E+00         1.57853E+01
+          2.61769E-02         6.81662E-03        -2.26074E-02         1.64471E+00         6.47625E-01         1.64486E+00         1.64014E+01         1.00000E+00         1.47527E-12         1.64014E+01         1.32059E+00         1.50808E+01
+          2.61769E-02         6.98645E-03        -2.26810E-02         1.64471E+00         6.58296E-01         1.64486E+00         1.56870E+01         1.00000E+00         1.78371E-12         1.56870E+01         1.29129E+00         1.43957E+01
+          2.61769E-02         7.15628E-03        -2.27565E-02         1.64470E+00         6.68966E-01         1.64486E+00         1.49920E+01         1.00000E+00         2.10037E-12         1.49920E+01         1.26162E+00         1.37304E+01
+          2.61769E-02         7.32611E-03        -2.28337E-02         1.64470E+00         6.79637E-01         1.64486E+00         1.43167E+01         1.00000E+00         2.41759E-12         1.43167E+01         1.23161E+00         1.30851E+01
+          2.61769E-02         7.49593E-03        -2.29128E-02         1.64470E+00         6.90307E-01         1.64486E+00         1.36614E+01         1.00000E+00         2.72839E-12         1.36614E+01         1.20133E+00         1.24601E+01
+          2.61769E-02         7.66576E-03        -2.29936E-02         1.64470E+00         7.00978E-01         1.64486E+00         1.30262E+01         1.00000E+00         3.02653E-12         1.30262E+01         1.17080E+00         1.18554E+01
+          2.61769E-02         7.83559E-03        -2.30763E-02         1.64470E+00         7.11649E-01         1.64486E+00         1.24113E+01         1.00000E+00         3.30655E-12         1.24113E+01         1.14007E+00         1.12713E+01
+          2.61769E-02         8.00542E-03        -2.31608E-02         1.64469E+00         7.22319E-01         1.64486E+00         1.18168E+01         1.00000E+00         3.56387E-12         1.18168E+01         1.10920E+00         1.07076E+01
+          2.61769E-02         8.17524E-03        -2.32471E-02         1.64469E+00         7.32990E-01         1.64486E+00         1.12427E+01         1.00000E+00         3.79481E-12         1.12427E+01         1.07822E+00         1.01645E+01
+          2.61769E-02         8.34507E-03        -2.33352E-02         1.64469E+00         7.43660E-01         1.64485E+00         1.06891E+01         1.00000E+00         3.99664E-12         1.06891E+01         1.04720E+00         9.64190E+00
+          2.61769E-02         8.51490E-03        -2.34251E-02         1.64469E+00         7.54331E-01         1.64485E+00         1.01559E+01         1.00000E+00         4.16766E-12         1.01559E+01         1.01617E+00         9.13971E+00
+          2.61769E-02         8.68473E-03        -2.35169E-02         1.64468E+00         7.65001E-01         1.64485E+00         9.64299E+00         1.00000E+00         4.30718E-12         9.64299E+00         9.85181E-01         8.65781E+00
+          2.61769E-02         8.85455E-03        -2.36104E-02         1.64468E+00         7.75672E-01         1.64485E+00         9.15033E+00         1.00000E+00         4.41560E-12         9.15033E+00         9.54292E-01         8.19604E+00
+          2.61769E-02         9.02438E-03        -2.37058E-02         1.64468E+00         7.86343E-01         1.64485E+00         8.67775E+00         1.00000E+00         4.49445E-12         8.67775E+00         9.23550E-01         7.75420E+00
+          2.61769E-02         9.19421E-03        -2.38030E-02         1.64468E+00         7.97013E-01         1.64485E+00         8.22505E+00         1.00000E+00         4.54637E-12         8.22505E+00         8.93005E-01         7.33204E+00
+          2.61769E-02         9.36403E-03        -2.39019E-02         1.64467E+00         8.07684E-01         1.64485E+00         7.79201E+00         1.00000E+00         4.57514E-12         7.79201E+00         8.62708E-01         6.92930E+00
+          2.61769E-02         9.53386E-03        -2.40027E-02         1.64467E+00         8.18354E-01         1.64485E+00         7.37839E+00         1.00000E+00         4.58563E-12         7.37839E+00         8.32707E-01         6.54568E+00
+          2.61769E-02         9.70369E-03        -2.41053E-02         1.64467E+00         8.29025E-01         1.64485E+00         6.98388E+00         1.00000E+00         4.58369E-12         6.98388E+00         8.03054E-01         6.18083E+00
+          2.61769E-02         9.87352E-03        -2.42098E-02         1.64467E+00         8.39695E-01         1.64484E+00         6.60818E+00         1.00000E+00         4.57594E-12         6.60818E+00         7.73797E-01         5.83439E+00
+          2.61769E-02         1.00433E-02        -2.43160E-02         1.64466E+00         8.50366E-01         1.64484E+00         6.25095E+00         1.00000E+00         4.56952E-12         6.25095E+00         7.44984E-01         5.50597E+00
+          2.61769E-02         1.02132E-02        -2.44240E-02         1.64466E+00         8.61037E-01         1.64484E+00         5.91181E+00         1.00000E+00         4.57157E-12         5.91181E+00         7.16662E-01         5.19515E+00
+          2.61769E-02         1.03830E-02        -2.45339E-02         1.64466E+00         8.71707E-01         1.64484E+00         5.59038E+00         1.00000E+00         4.58868E-12         5.59038E+00         6.88877E-01         4.90150E+00
+          2.61769E-02         1.05528E-02        -2.46456E-02         1.64465E+00         8.82378E-01         1.64484E+00         5.28623E+00         1.00000E+00         4.62627E-12         5.28623E+00         6.61676E-01         4.62456E+00
+          2.61769E-02         1.07227E-02        -2.47590E-02         1.64465E+00         8.93048E-01         1.64484E+00         4.99895E+00         1.00000E+00         4.68787E-12         4.99895E+00         6.35100E-01         4.36385E+00
+          2.61769E-02         1.08925E-02        -2.48743E-02         1.64465E+00         9.03719E-01         1.64484E+00         4.72808E+00         1.00000E+00         4.77475E-12         4.72808E+00         6.09193E-01         4.11888E+00
+          2.61769E-02         1.10623E-02        -2.49914E-02         1.64465E+00         9.14389E-01         1.64484E+00         4.47315E+00         1.00000E+00         4.88563E-12         4.47315E+00         5.83994E-01         3.88915E+00
+          2.61769E-02         1.12321E-02        -2.51103E-02         1.64464E+00         9.25060E-01         1.64483E+00         4.23368E+00         1.00000E+00         5.01680E-12         4.23368E+00         5.59543E-01         3.67414E+00
+          2.61769E-02         1.14020E-02        -2.52311E-02         1.64464E+00         9.35731E-01         1.64483E+00         4.00918E+00         1.00000E+00         5.16239E-12         4.00918E+00         5.35876E-01         3.47331E+00
+          2.61769E-02         1.15718E-02        -2.53536E-02         1.64464E+00         9.46401E-01         1.64483E+00         3.79916E+00         1.00000E+00         5.31494E-12         3.79916E+00         5.13027E-01         3.28613E+00
+          2.61769E-02         1.17416E-02        -2.54780E-02         1.64463E+00         9.57072E-01         1.64483E+00         3.60310E+00         1.00000E+00         5.46583E-12         3.60310E+00         4.91030E-01         3.11207E+00
+          2.61769E-02         1.19114E-02        -2.56041E-02         1.64463E+00         9.67742E-01         1.64483E+00         3.42048E+00         1.00000E+00         5.60575E-12         3.42048E+00         4.69914E-01         2.95057E+00
+          2.61769E-02         1.20813E-02        -2.57321E-02         1.64463E+00         9.78413E-01         1.64483E+00         3.25079E+00         1.00000E+00         5.72514E-12         3.25079E+00         4.49707E-01         2.80108E+00
+          2.61769E-02         1.22511E-02        -2.58619E-02         1.64462E+00         9.89083E-01         1.64483E+00         3.09349E+00         1.00000E+00         5.81437E-12         3.09349E+00         4.30434E-01         2.66306E+00
+          2.61769E-02         1.24209E-02        -2.59935E-02         1.64462E+00         9.99754E-01         1.64482E+00         2.94807E+00         1.00000E+00         5.86400E-12         2.94807E+00         4.12119E-01         2.53596E+00
+          2.61769E-02         1.25908E-02        -2.61269E-02         1.64462E+00         1.01042E+00         1.64482E+00         2.81400E+00         1.00000E+00         5.86492E-12         2.81400E+00         3.94781E-01         2.41922E+00
+          2.61769E-02         1.27606E-02        -2.62621E-02         1.64461E+00         1.02110E+00         1.64482E+00         2.69075E+00         1.00000E+00         5.80837E-12         2.69075E+00         3.78439E-01         2.31232E+00
+          2.61769E-02         1.29304E-02        -2.63991E-02         1.64461E+00         1.03177E+00         1.64482E+00         2.57781E+00         1.00000E+00         5.68609E-12         2.57781E+00         3.63105E-01         2.21470E+00
+          2.61769E-02         1.31002E-02        -2.65380E-02         1.64461E+00         1.04244E+00         1.64482E+00         2.47464E+00         1.00000E+00         5.49034E-12         2.47464E+00         3.48793E-01         2.12585E+00
+          2.61769E-02         1.32701E-02        -2.66786E-02         1.64460E+00         1.05311E+00         1.64482E+00         2.38075E+00         1.00000E+00         5.21400E-12         2.38075E+00         3.35512E-01         2.04524E+00
+          2.61769E-02         1.34399E-02        -2.68211E-02         1.64460E+00         1.06378E+00         1.64482E+00         2.29563E+00         1.00000E+00         4.85072E-12         2.29563E+00         3.23267E-01         1.97236E+00
+          2.61769E-02         1.36097E-02        -2.69654E-02         1.64459E+00         1.07445E+00         1.64481E+00         2.21877E+00         1.00000E+00         4.39512E-12         2.21877E+00         3.12063E-01         1.90671E+00
+          2.61769E-02         1.37795E-02        -2.71115E-02         1.64459E+00         1.08512E+00         1.64481E+00         2.14970E+00         1.00000E+00         3.84344E-12         2.14970E+00         3.01899E-01         1.84780E+00
+          2.61769E-02         1.39494E-02        -2.72594E-02         1.64459E+00         1.09579E+00         1.64481E+00         2.08793E+00         1.00000E+00         3.19494E-12         2.08793E+00         2.92773E-01         1.79515E+00
+          2.61769E-02         1.41192E-02        -2.74091E-02         1.64458E+00         1.10646E+00         1.64481E+00         2.03299E+00         1.00000E+00         2.45682E-12         2.03299E+00         2.84679E-01         1.74831E+00
+          2.61769E-02         1.42890E-02        -2.75606E-02         1.64458E+00         1.11713E+00         1.64481E+00         1.98443E+00         1.00000E+00         1.66562E-12         1.98443E+00         2.77611E-01         1.70682E+00
+          2.61769E-02         1.44589E-02        -2.77140E-02         1.64457E+00         1.12780E+00         1.64481E+00         1.94180E+00         1.00000E+00         1.02492E-12         1.94180E+00         2.71556E-01         1.67024E+00
+          2.61769E-02         1.46287E-02        -2.78691E-02         1.64457E+00         1.13847E+00         1.64481E+00         1.90467E+00         1.00000E+00         1.26718E-12         1.90467E+00         2.66500E-01         1.63817E+00
+          2.61769E-02         1.47985E-02        -2.80261E-02         1.64457E+00         1.14914E+00         1.64480E+00         1.87263E+00         1.00000E+00         2.30125E-12         1.87263E+00         2.62429E-01         1.61020E+00
+          2.61769E-02         1.49683E-02        -2.81849E-02         1.64456E+00         1.15981E+00         1.64480E+00         1.84527E+00         1.00000E+00         3.61781E-12         1.84527E+00         2.59321E-01         1.58595E+00
+          2.61769E-02         1.51382E-02        -2.83455E-02         1.64456E+00         1.17048E+00         1.64480E+00         1.82220E+00         1.00000E+00         5.10491E-12         1.82220E+00         2.57157E-01         1.56504E+00
+          2.61769E-02         1.53080E-02        -2.85079E-02         1.64455E+00         1.18115E+00         1.64480E+00         1.80304E+00         1.00000E+00         6.73696E-12         1.80304E+00         2.55911E-01         1.54713E+00
+          2.61769E-02         1.54778E-02        -2.86721E-02         1.64455E+00         1.19182E+00         1.64480E+00         1.78745E+00         1.00000E+00         8.50493E-12         1.78745E+00         2.55557E-01         1.53189E+00
+          2.61769E-02         1.56476E-02        -2.88381E-02         1.64454E+00         1.20249E+00         1.64480E+00         1.77507E+00         1.00000E+00         1.04040E-11         1.77507E+00         2.56066E-01         1.51900E+00
+          2.61769E-02         1.58175E-02        -2.90059E-02         1.64454E+00         1.21317E+00         1.64480E+00         1.76558E+00         1.00000E+00         1.24302E-11         1.76558E+00         2.57408E-01         1.50817E+00
+          2.61769E-02         1.59873E-02        -2.91756E-02         1.64454E+00         1.22384E+00         1.64479E+00         1.75866E+00         1.00000E+00         1.45799E-11         1.75866E+00         2.59548E-01         1.49911E+00
+          2.61769E-02         1.61571E-02        -2.93471E-02         1.64453E+00         1.23451E+00         1.64479E+00         1.75402E+00         1.00000E+00         1.68486E-11         1.75402E+00         2.62453E-01         1.49157E+00
+          2.61769E-02         1.63270E-02        -2.95203E-02         1.64453E+00         1.24518E+00         1.64479E+00         1.75138E+00         1.00000E+00         1.92314E-11         1.75138E+00         2.66085E-01         1.48529E+00
+          2.61769E-02         1.64968E-02        -2.96954E-02         1.64452E+00         1.25585E+00         1.64479E+00         1.75047E+00         1.00000E+00         2.17225E-11         1.75047E+00         2.70406E-01         1.48007E+00
+          2.61769E-02         1.66666E-02        -2.98723E-02         1.64452E+00         1.26652E+00         1.64479E+00         1.75105E+00         1.00000E+00         2.43151E-11         1.75105E+00         2.75375E-01         1.47568E+00
+          2.61769E-02         1.68364E-02        -3.00510E-02         1.64451E+00         1.27719E+00         1.64479E+00         1.75288E+00         1.00000E+00         2.70017E-11         1.75288E+00         2.80952E-01         1.47193E+00
+          2.61769E-02         1.70063E-02        -3.02316E-02         1.64451E+00         1.28786E+00         1.64479E+00         1.75574E+00         1.00000E+00         2.97738E-11         1.75574E+00         2.87092E-01         1.46865E+00
+          2.61769E-02         1.71761E-02        -3.04139E-02         1.64450E+00         1.29853E+00         1.64478E+00         1.75943E+00         1.00000E+00         3.26216E-11         1.75943E+00         2.93753E-01         1.46567E+00
+          2.61769E-02         1.73459E-02        -3.05980E-02         1.64450E+00         1.30920E+00         1.64478E+00         1.76375E+00         1.00000E+00         3.55346E-11         1.76375E+00         3.00890E-01         1.46286E+00
+          2.61769E-02         1.75158E-02        -3.07840E-02         1.64449E+00         1.31987E+00         1.64478E+00         1.76854E+00         1.00000E+00         3.85010E-11         1.76854E+00         3.08456E-01         1.46009E+00
+          2.61769E-02         1.76856E-02        -3.09718E-02         1.64449E+00         1.33054E+00         1.64478E+00         1.77363E+00         1.00000E+00         4.15079E-11         1.77363E+00         3.16406E-01         1.45723E+00
+          2.61769E-02         1.78554E-02        -3.11614E-02         1.64448E+00         1.34121E+00         1.64478E+00         1.77888E+00         1.00000E+00         4.45413E-11         1.77888E+00         3.24693E-01         1.45419E+00
+          2.61769E-02         1.80252E-02        -3.13528E-02         1.64448E+00         1.35188E+00         1.64478E+00         1.78415E+00         1.00000E+00         4.75860E-11         1.78415E+00         3.33270E-01         1.45088E+00
+          2.61769E-02         1.81951E-02        -3.15460E-02         1.64447E+00         1.36255E+00         1.64478E+00         1.78931E+00         1.00000E+00         5.06256E-11         1.78931E+00         3.42089E-01         1.44722E+00
+          2.61769E-02         1.83649E-02        -3.17410E-02         1.64447E+00         1.37322E+00         1.64478E+00         1.79427E+00         1.00000E+00         5.36424E-11         1.79427E+00         3.51104E-01         1.44316E+00
+          2.61769E-02         1.85347E-02        -3.19378E-02         1.64446E+00         1.38389E+00         1.64477E+00         1.79891E+00         1.00000E+00         5.66175E-11         1.79891E+00         3.60268E-01         1.43864E+00
+          2.61769E-02         1.87045E-02        -3.21365E-02         1.64446E+00         1.39457E+00         1.64477E+00         1.80315E+00         1.00000E+00         5.95308E-11         1.80315E+00         3.69533E-01         1.43362E+00
+          2.61769E-02         1.88744E-02        -3.23369E-02         1.64445E+00         1.40524E+00         1.64477E+00         1.80692E+00         1.00000E+00         6.23609E-11         1.80692E+00         3.78853E-01         1.42807E+00
+          2.61769E-02         1.90442E-02        -3.25392E-02         1.64445E+00         1.41591E+00         1.64477E+00         1.81014E+00         1.00000E+00         6.50849E-11         1.81014E+00         3.88184E-01         1.42196E+00
+          2.61769E-02         1.92140E-02        -3.27433E-02         1.64444E+00         1.42658E+00         1.64477E+00         1.81277E+00         1.00000E+00         6.76789E-11         1.81277E+00         3.97479E-01         1.41529E+00
+          2.61769E-02         1.93839E-02        -3.29492E-02         1.64444E+00         1.43725E+00         1.64477E+00         1.81475E+00         1.00000E+00         7.01177E-11         1.81475E+00         4.06695E-01         1.40805E+00
+          2.61769E-02         1.95537E-02        -3.31569E-02         1.64443E+00         1.44792E+00         1.64477E+00         1.81603E+00         1.00000E+00         7.23747E-11         1.81603E+00         4.15790E-01         1.40024E+00
+          2.61769E-02         1.97235E-02        -3.33664E-02         1.64443E+00         1.45859E+00         1.64476E+00         1.81660E+00         1.00000E+00         7.44223E-11         1.81660E+00         4.24721E-01         1.39188E+00
+          2.61769E-02         1.98933E-02        -3.35778E-02         1.64442E+00         1.46926E+00         1.64476E+00         1.81642E+00         1.00000E+00         7.62314E-11         1.81642E+00         4.33449E-01         1.38297E+00
+          2.61769E-02         2.00632E-02        -3.37909E-02         1.64442E+00         1.47993E+00         1.64476E+00         1.81547E+00         1.00000E+00         7.77721E-11         1.81547E+00         4.41933E-01         1.37354E+00
+          2.61769E-02         2.02330E-02        -3.40059E-02         1.64441E+00         1.49060E+00         1.64476E+00         1.81374E+00         1.00000E+00         7.90133E-11         1.81374E+00         4.50138E-01         1.36360E+00
+          2.61769E-02         2.04028E-02        -3.42227E-02         1.64440E+00         1.50127E+00         1.64476E+00         1.81122E+00         1.00000E+00         7.99229E-11         1.81122E+00         4.58026E-01         1.35320E+00
+          2.61769E-02         2.05726E-02        -3.44412E-02         1.64440E+00         1.51194E+00         1.64476E+00         1.80792E+00         1.00000E+00         8.04679E-11         1.80792E+00         4.65565E-01         1.34235E+00
+          2.61769E-02         2.07425E-02        -3.46616E-02         1.64439E+00         1.52261E+00         1.64476E+00         1.80383E+00         1.00000E+00         8.06147E-11         1.80383E+00         4.72722E-01         1.33111E+00
+          2.61769E-02         2.09123E-02        -3.48839E-02         1.64439E+00         1.53328E+00         1.64476E+00         1.79896E+00         1.00000E+00         8.03290E-11         1.79896E+00         4.79466E-01         1.31949E+00
+          2.61769E-02         2.10821E-02        -3.51079E-02         1.64438E+00         1.54395E+00         1.64476E+00         1.79332E+00         1.00000E+00         7.95758E-11         1.79332E+00         4.85769E-01         1.30755E+00
+          2.61769E-02         2.12520E-02        -3.53337E-02         1.64437E+00         1.55462E+00         1.64475E+00         1.78692E+00         1.00000E+00         7.83202E-11         1.78692E+00         4.91606E-01         1.29532E+00
+          2.61769E-02         2.14218E-02        -3.55614E-02         1.64437E+00         1.56529E+00         1.64475E+00         1.77979E+00         1.00000E+00         7.65272E-11         1.77979E+00         4.96953E-01         1.28283E+00
+          2.61769E-02         2.15916E-02        -3.57908E-02         1.64436E+00         1.57596E+00         1.64475E+00         1.77193E+00         1.00000E+00         7.41619E-11         1.77193E+00         5.01787E-01         1.27014E+00
+          2.61769E-02         2.17614E-02        -3.60221E-02         1.64436E+00         1.58664E+00         1.64475E+00         1.76337E+00         1.00000E+00         7.11903E-11         1.76337E+00         5.06088E-01         1.25728E+00
+          2.61769E-02         2.19313E-02        -3.62552E-02         1.64435E+00         1.59731E+00         1.64475E+00         1.75414E+00         1.00000E+00         6.75797E-11         1.75414E+00         5.09840E-01         1.24430E+00
+          2.61769E-02         2.21011E-02        -3.64901E-02         1.64434E+00         1.60798E+00         1.64475E+00         1.74424E+00         1.00000E+00         6.32991E-11         1.74424E+00         5.13027E-01         1.23122E+00
+          2.61769E-02         2.22709E-02        -3.67268E-02         1.64434E+00         1.61865E+00         1.64475E+00         1.73372E+00         1.00000E+00         5.83211E-11         1.73372E+00         5.15637E-01         1.21809E+00
+          2.61769E-02         2.24407E-02        -3.69653E-02         1.64433E+00         1.62932E+00         1.64475E+00         1.72260E+00         1.00000E+00         5.26239E-11         1.72260E+00         5.17658E-01         1.20494E+00
+          2.61769E-02         2.26106E-02        -3.72057E-02         1.64433E+00         1.63999E+00         1.64475E+00         1.71089E+00         1.00000E+00         4.61957E-11         1.71089E+00         5.19083E-01         1.19181E+00
+          2.61769E-02         2.27804E-02        -3.74478E-02         1.64432E+00         1.65066E+00         1.64475E+00         1.69863E+00         1.00000E+00         3.90460E-11         1.69863E+00         5.19906E-01         1.17872E+00
+          2.61769E-02         2.29502E-02        -3.76918E-02         1.64431E+00         1.66133E+00         1.64474E+00         1.68584E+00         1.00000E+00         3.12352E-11         1.68584E+00         5.20122E-01         1.16572E+00
+          2.61769E-02         2.31201E-02        -3.79376E-02         1.64431E+00         1.67200E+00         1.64474E+00         1.67255E+00         1.00000E+00         2.29792E-11         1.67255E+00         5.19731E-01         1.15282E+00
+          2.61769E-02         2.32899E-02        -3.81852E-02         1.64430E+00         1.68267E+00         1.64474E+00         1.65878E+00         1.00000E+00         1.51332E-11         1.65878E+00         5.18733E-01         1.14005E+00
+          2.61769E-02         2.34597E-02        -3.84346E-02         1.64429E+00         1.69334E+00         1.64474E+00         1.64456E+00         1.00000E+00         1.15007E-11         1.64456E+00         5.17131E-01         1.12743E+00
+          2.61769E-02         2.36295E-02        -3.86858E-02         1.64429E+00         1.70401E+00         1.64474E+00         1.62992E+00         1.00000E+00         1.72643E-11         1.62992E+00         5.14929E-01         1.11499E+00
+          2.61769E-02         2.37994E-02        -3.89388E-02         1.64428E+00         1.71468E+00         1.64474E+00         1.61486E+00         1.00000E+00         2.81609E-11         1.61486E+00         5.12135E-01         1.10272E+00
+          2.61769E-02         2.39692E-02        -3.91937E-02         1.64427E+00         1.72535E+00         1.64474E+00         1.59942E+00         1.00000E+00         4.11095E-11         1.59942E+00         5.08758E-01         1.09066E+00
+          2.61769E-02         2.41390E-02        -3.94503E-02         1.64427E+00         1.73602E+00         1.64474E+00         1.58362E+00         1.00000E+00         5.53838E-11         1.58362E+00         5.04808E-01         1.07881E+00
+          2.61769E-02         2.43088E-02        -3.97088E-02         1.64426E+00         1.74669E+00         1.64474E+00         1.56748E+00         1.00000E+00         7.07712E-11         1.56748E+00         5.00298E-01         1.06718E+00
+          2.61769E-02         2.44787E-02        -3.99691E-02         1.64425E+00         1.75736E+00         1.64474E+00         1.55101E+00         1.00000E+00         8.71843E-11         1.55101E+00         4.95242E-01         1.05577E+00
+          2.61769E-02         2.46485E-02        -4.02312E-02         1.64425E+00         1.76804E+00         1.64474E+00         1.53424E+00         1.00000E+00         1.04573E-10         1.53424E+00         4.89657E-01         1.04458E+00
+          2.61769E-02         2.48183E-02        -4.04951E-02         1.64424E+00         1.77871E+00         1.64474E+00         1.51718E+00         1.00000E+00         1.22897E-10         1.51718E+00         4.83559E-01         1.03362E+00
+          2.61769E-02         2.49882E-02        -4.07608E-02         1.64423E+00         1.78938E+00         1.64474E+00         1.49984E+00         1.00000E+00         1.42118E-10         1.49984E+00         4.76968E-01         1.02288E+00
+          2.61769E-02         2.51580E-02        -4.10283E-02         1.64423E+00         1.80005E+00         1.64474E+00         1.48225E+00         1.00000E+00         1.62194E-10         1.48225E+00         4.69905E-01         1.01235E+00
+          2.61769E-02         2.53278E-02        -4.12977E-02         1.64422E+00         1.81072E+00         1.64474E+00         1.46442E+00         1.00000E+00         1.83079E-10         1.46442E+00         4.62390E-01         1.00203E+00
+          2.61769E-02         2.54976E-02        -4.15689E-02         1.64421E+00         1.82139E+00         1.64474E+00         1.44636E+00         1.00000E+00         2.04718E-10         1.44636E+00         4.54447E-01         9.91913E-01
+          2.61769E-02         2.56675E-02        -4.18418E-02         1.64420E+00         1.83206E+00         1.64474E+00         1.42808E+00         1.00000E+00         2.27049E-10         1.42808E+00         4.46099E-01         9.81981E-01
+          2.61769E-02         2.58373E-02        -4.21166E-02         1.64420E+00         1.84273E+00         1.64474E+00         1.40959E+00         1.00000E+00         2.50003E-10         1.40959E+00         4.37371E-01         9.72223E-01
+          2.61769E-02         2.60071E-02        -4.23932E-02         1.64419E+00         1.85340E+00         1.64474E+00         1.39091E+00         1.00000E+00         2.73500E-10         1.39091E+00         4.28289E-01         9.62625E-01
+          2.61769E-02         2.61769E-02        -4.26716E-02         1.64418E+00         1.86407E+00         1.64474E+00         1.37205E+00         1.00000E+00         2.97453E-10         1.37205E+00         4.18879E-01         9.53169E-01
diff --git a/Tests/ReferenceData/IsGISAXS/ex-15/SSCA.inp b/Tests/ReferenceData/IsGISAXS/ex-15/SSCA.inp
new file mode 100755
index 0000000..32afaf3
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-15/SSCA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+SSCA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         SSCA               0             25             ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.05     1.5         0.05    1.5             150    150
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       F         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           gaussian           0.25      0.1         11      30   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          1DDL 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               15                    5      gau	      0.5            4.02698E+00            1000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.   
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-15/isgi_SSCA.ima b/Tests/ReferenceData/IsGISAXS/ex-15/isgi_SSCA.ima
new file mode 100644
index 0000000..03f512c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-15/isgi_SSCA.ima
@@ -0,0 +1,150 @@
+    6.0711767553E+03    5.9736601927E+03    5.8743689400E+03    5.7734820319E+03    5.6711785468E+03    5.5676370859E+03    5.4630352622E+03    5.3575492024E+03    5.2513530617E+03    5.1446185550E+03    5.0375145054E+03    4.9302064114E+03    4.8228560346E+03    4.7156210092E+03    4.6086544744E+03    4.5021047309E+03    4.3961149224E+03    4.2908227427E+03    4.1863601696E+03    4.0828532257E+03    3.9804217669E+03    3.8791792979E+03    3.7792328167E+03    3.6806826858E+03    3.583622 [...]
+    6.0592972254E+03    5.9548732124E+03    5.8486871809E+03    5.7409416357E+03    5.6318387605E+03    5.5215798049E+03    5.4103644843E+03    5.2983903949E+03    5.1858524469E+03    5.0729423173E+03    4.9598479241E+03    4.8467529248E+03    4.7338362404E+03    4.6212716051E+03    4.5092271467E+03    4.3978649943E+03    4.2873409190E+03    4.1778040046E+03    4.0693963526E+03    3.9622528187E+03    3.8565007842E+03    3.7522599610E+03    3.6496422301E+03    3.5487515150E+03    3.449683 [...]
+    6.2659107242E+03    6.1490807512E+03    6.0304138929E+03    5.9101474055E+03    5.7885178694E+03    5.6657604508E+03    5.5421081796E+03    5.4177912465E+03    5.2930363231E+03    5.1680659053E+03    5.0430976851E+03    4.9183439511E+03    4.7940110211E+03    4.6702987075E+03    4.5473998187E+03    4.4254996968E+03    4.3047757935E+03    4.1853972856E+03    4.0675247301E+03    3.9513097611E+03    3.8368948274E+03    3.7244129719E+03    3.6139876538E+03    3.5057326113E+03    3.399751 [...]
+    6.6519823943E+03    6.5181547359E+03    6.3823411980E+03    6.2448231794E+03    6.1058810659E+03    5.9657933395E+03    5.8248357080E+03    5.6832802578E+03    5.5413946345E+03    5.3994412524E+03    5.2576765388E+03    5.1163502132E+03    4.9757046054E+03    4.8359740142E+03    4.6973841096E+03    4.5601513797E+03    4.4244826240E+03    4.2905744946E+03    4.1586130868E+03    4.0287735794E+03    3.9012199257E+03    3.7761045951E+03    3.6535683664E+03    3.5337401714E+03    3.416736 [...]
+    7.2077851771E+03    7.0527429115E+03    6.8954934453E+03    6.7363706601E+03    6.5757071227E+03    6.4138330189E+03    6.2510751111E+03    6.0877557245E+03    5.9241917657E+03    5.7606937771E+03    5.5975650315E+03    5.4351006690E+03    5.2735868810E+03    5.1133001419E+03    4.9545064941E+03    4.7974608846E+03    4.6424065597E+03    4.4895745152E+03    4.3391830068E+03    4.1914371197E+03    4.0465283994E+03    3.9046345432E+03    3.7659191539E+03    3.6305315533E+03    3.498606 [...]
+    7.9346049107E+03    7.7543565522E+03    7.5716047631E+03    7.3867433464E+03    7.2001645458E+03    7.0122577854E+03    6.8234084364E+03    6.6339966174E+03    6.4443960324E+03    6.2549728508E+03    6.0660846341E+03    5.8780793126E+03    5.6912942166E+03    5.5060551648E+03    5.3226756135E+03    5.1414558686E+03    4.9626823634E+03    4.7866270040E+03    4.6135465843E+03    4.4436822710E+03    4.2772591611E+03    4.1144859103E+03    3.9555544355E+03    3.8006396883E+03    3.649899 [...]
+    8.8353905987E+03    8.6262229631E+03    8.4141776073E+03    8.1997145687E+03    7.9832921650E+03    7.7653655246E+03    7.5463851486E+03    7.3267955108E+03    7.1070336997E+03    6.8875281096E+03    6.6686971846E+03    6.4509482205E+03    6.2346762285E+03    6.0202628648E+03    5.8080754307E+03    5.5984659441E+03    5.3917702880E+03    5.1883074360E+03    4.9883787585E+03    4.7922674100E+03    4.6002377999E+03    4.4125351464E+03    4.2293851146E+03    4.0509935390E+03    3.877546 [...]
+    9.9081518547E+03    9.6668251837E+03    9.4221675427E+03    9.1747099161E+03    8.9249815187E+03    8.6735081089E+03    8.4208103377E+03    8.1674021385E+03    7.9137891661E+03    7.6604672882E+03    7.4079211375E+03    7.1566227279E+03    6.9070301410E+03    6.6595862865E+03    6.4147177414E+03    6.1728336707E+03    5.9343248344E+03    5.6995626823E+03    5.4688985392E+03    5.2426628832E+03    5.0211647177E+03    4.8046910388E+03    4.5935063981E+03    4.3878525607E+03    4.187948 [...]
+    1.1140145620E+04    1.0864204183E+04    1.0584403509E+04    1.0301347981E+04    1.0015640300E+04    9.7278795773E+03    9.4386594706E+03    9.1485663651E+03    8.8581776055E+03    8.5680597866E+03    8.2787671105E+03    7.9908398138E+03    7.7048026721E+03    7.4211635862E+03    7.1404122548E+03    6.8630189380E+03    6.5894333157E+03    6.3200834435E+03    6.0553748090E+03    5.7956894918E+03    5.5413854274E+03    5.2927957774E+03    5.0502284064E+03    4.8139654657E+03    4.584263 [...]
+    1.2502592163E+04    1.2190760905E+04    1.1874478349E+04    1.1554421717E+04    1.1231266782E+04    1.0905685759E+04    1.0578345237E+04    1.0249904159E+04    9.9210118550E+03    9.5923061380E+03    9.2644114739E+03    8.9379372230E+03    8.6134759667E+03    8.2916019217E+03    7.9728694476E+03    7.6578116531E+03    7.3469391044E+03    7.0407386401E+03    6.7396722954E+03    6.4441763380E+03    6.1546604186E+03    5.8715068368E+03    5.5950699238E+03    5.3256755425E+03    5.063620 [...]
+    1.3946697750E+04    1.3599312203E+04    1.3246839942E+04    1.2890026719E+04    1.2529617233E+04    1.2166352838E+04    1.1800969294E+04    1.1434194562E+04    1.1066746660E+04    1.0699331586E+04    1.0332641308E+04    9.9673518410E+03    9.6041214080E+03    9.2435886925E+03    8.8863711919E+03    8.5330636742E+03    8.1842367435E+03    7.8404355178E+03    7.5021784237E+03    7.1699561106E+03    6.8442304857E+03    6.5254338742E+03    6.2139683028E+03    5.9102049102E+03    5.614483 [...]
+    1.5402503630E+04    1.5021886333E+04    1.4635533881E+04    1.4244252012E+04    1.3848845960E+04    1.3450118012E+04    1.3048865110E+04    1.2645876495E+04    1.2241931421E+04    1.1837796924E+04    1.1434225672E+04    1.1031953895E+04    1.0631699408E+04    1.0234159721E+04    9.8400102609E+03    9.4499026932E+03    9.0644633623E+03    8.6842918446E+03    8.3099596244E+03    7.9420088937E+03    7.5809514795E+03    7.2272679003E+03    6.8814065525E+03    6.5437830301E+03    6.214779 [...]
+    1.6782316286E+04    1.6372984147E+04    1.5957294249E+04    1.5536099493E+04    1.5110252950E+04    1.4680605306E+04    1.4248002369E+04    1.3813282605E+04    1.3377274744E+04    1.2940795444E+04    1.2504647037E+04    1.2069615346E+04    1.1636467605E+04    1.1205950464E+04    1.0778788102E+04    1.0355680445E+04    9.9373015040E+03    9.5242978267E+03    9.1172870719E+03    8.7168567133E+03    8.3235628705E+03    7.9379292739E+03    7.5604463613E+03    7.1915705115E+03    6.831723 [...]
+    1.7989771868E+04    1.7558358549E+04    1.7120034127E+04    1.6675682161E+04    1.6226187123E+04    1.5772431807E+04    1.5315294774E+04    1.4855647842E+04    1.4394353635E+04    1.3932263193E+04    1.3470213649E+04    1.3009025998E+04    1.2549502942E+04    1.2092426833E+04    1.1638557720E+04    1.1188631498E+04    1.0743358173E+04    1.0303420243E+04    9.8694712022E+03    9.4421341663E+03    9.0220006340E+03    8.6096293741E+03    8.2055454490E+03    7.8102393726E+03    7.424166 [...]
+    1.8933754568E+04    1.8488580573E+04    1.8036053105E+04    1.7577067468E+04    1.7112520649E+04    1.6643308735E+04    1.6170324364E+04    1.5694454225E+04    1.5216576600E+04    1.4737558974E+04    1.4258255706E+04    1.3779505785E+04    1.3302130656E+04    1.2826932150E+04    1.2354690502E+04    1.1886162476E+04    1.1422079595E+04    1.0963146487E+04    1.0510039349E+04    1.0063404529E+04    9.6238572417E+03    9.1919804015E+03    8.7683235939E+03    8.3534021758E+03    7.947696 [...]
+    1.9543986589E+04    1.9094306768E+04    1.8636974901E+04    1.8172878534E+04    1.7702907618E+04    1.7227951996E+04    1.6748898921E+04    1.6266630608E+04    1.5782021839E+04    1.5295937614E+04    1.4809230876E+04    1.4322740293E+04    1.3837288133E+04    1.3353678209E+04    1.2872693922E+04    1.2395096400E+04    1.1921622739E+04    1.1452984350E+04    1.0989865416E+04    1.0532921468E+04    1.0082778078E+04    9.6400296738E+03    9.2052384794E+03    8.7789335784E+03    8.361610 [...]
+    1.9783515837E+04    1.9338584891E+04    1.8885865179E+04    1.8426218343E+04    1.7960509054E+04    1.7489602624E+04    1.7014362624E+04    1.6535648554E+04    1.6054313546E+04    1.5571202110E+04    1.5087147955E+04    1.4602971850E+04    1.4119479580E+04    1.3637459957E+04    1.3157682932E+04    1.2680897780E+04    1.2207831396E+04    1.1739186675E+04    1.1275641002E+04    1.0817844849E+04    1.0366420481E+04    9.9219607771E+03    9.4850281667E+03    9.0561536814E+03    8.635836 [...]
+    1.9653889903E+04    1.9222055627E+04    1.8782458362E+04    1.8335918734E+04    1.7883260893E+04    1.7425310265E+04    1.6962891332E+04    1.6496825441E+04    1.6027928645E+04    1.5557009591E+04    1.5084867459E+04    1.4612289952E+04    1.4140051353E+04    1.3668910656E+04    1.3199609761E+04    1.2732871760E+04    1.2269399298E+04    1.1809873033E+04    1.1354950182E+04    1.0905263172E+04    1.0461418383E+04    1.0023995001E+04    9.5935439784E+03    9.1705870950E+03    8.755616 [...]
+    1.9191569457E+04    1.8779591164E+04    1.8360022785E+04    1.7933632893E+04    1.7501193914E+04    1.7063480060E+04    1.6621265285E+04    1.6175321259E+04    1.5726415374E+04    1.5275308795E+04    1.4822754546E+04    1.4369495646E+04    1.3916263311E+04    1.3463775203E+04    1.3012733754E+04    1.2563824560E+04    1.2117714852E+04    1.1675052039E+04    1.1236462347E+04    1.0802549536E+04    1.0373893709E+04    9.9510502228E+03    9.5345486790E+03    9.1248920268E+03    8.722555 [...]
+    1.8457539368E+04    1.8070242942E+04    1.7675649659E+04    1.7274469337E+04    1.6867415822E+04    1.6455205115E+04    1.6038553504E+04    1.5618175729E+04    1.5194783162E+04    1.4769082025E+04    1.4341771644E+04    1.3913542745E+04    1.3485075805E+04    1.3057039445E+04    1.2630088891E+04    1.2204864495E+04    1.1781990317E+04    1.1362072788E+04    1.0945699439E+04    1.0533437708E+04    1.0125833832E+04    9.7234118175E+03    9.3266724991E+03    8.9360926805E+03    8.552124 [...]
+    1.7524158611E+04    1.7164428137E+04    1.6797782098E+04    1.6424868803E+04    1.6046340632E+04    1.5662852347E+04    1.5275059417E+04    1.4883616355E+04    1.4489175081E+04    1.4092383316E+04    1.3693882999E+04    1.3294308748E+04    1.2894286363E+04    1.2494431371E+04    1.2095347624E+04    1.1697625955E+04    1.1301842884E+04    1.0908559395E+04    1.0518319772E+04    1.0131650504E+04    9.7490592602E+03    9.3710339441E+03    8.9980418123E+03    8.6305286782E+03    8.268918 [...]
+    1.6463219894E+04    1.6132241284E+04    1.5794784235E+04    1.5451435948E+04    1.5102787625E+04    1.4749432964E+04    1.4391966658E+04    1.4030982911E+04    1.3667073973E+04    1.3300828698E+04    1.2932831124E+04    1.2563659095E+04    1.2193882912E+04    1.1824064024E+04    1.1454753769E+04    1.1086492152E+04    1.0719806684E+04    1.0355211269E+04    9.9932051505E+03    9.6342719132E+03    9.2788785518E+03    8.9274746003E+03    8.5804913283E+03    8.2383410039E+03    7.901416 [...]
+    1.5337610786E+04    1.5035249769E+04    1.4726875006E+04    1.4413015185E+04    1.4094202846E+04    1.3770973051E+04    1.3443862041E+04    1.3113405920E+04    1.2780139348E+04    1.2444594253E+04    1.2107298572E+04    1.1768775013E+04    1.1429539850E+04    1.1090101757E+04    1.0750960672E+04    1.0412606709E+04    1.0075519108E+04    9.7401652407E+03    9.4069996525E+03    9.0764631685E+03    8.7489820465E+03    8.4249671881E+03    8.1048134068E+03    7.7888987553E+03    7.477583 [...]
+    1.4197115669E+04    1.3922324179E+04    1.3641988895E+04    1.3356583896E+04    1.3066586918E+04    1.2772478172E+04    1.2474739160E+04    1.2173851500E+04    1.1870295771E+04    1.1564550364E+04    1.1257090365E+04    1.0948386455E+04    1.0638903834E+04    1.0329101179E+04    1.0019429638E+04    9.7103318504E+03    9.4022410125E+03    9.0955799820E+03    8.7907604241E+03    8.4881820043E+03    8.1882316267E+03    7.8912827222E+03    7.5976945860E+03    7.3078117673E+03    7.021963 [...]
+    1.3077632417E+04    1.2828811573E+04    1.2574906231E+04    1.2316340356E+04    1.2053541352E+04    1.1786939011E+04    1.1516964464E+04    1.1244049147E+04    1.0968623769E+04    1.0691117300E+04    1.0411955978E+04    1.0131562326E+04    9.8503542056E+03    9.5687438860E+03    9.2871371446E+03    9.0059323994E+03    8.7255198728E+03    8.4462807918E+03    8.1685866244E+03    7.8927983561E+03    7.6192658068E+03    7.3483269902E+03    7.0803075172E+03    6.8155200440E+03    6.554263 [...]
+    1.2002591742E+04    1.1777876296E+04    1.1548514833E+04    1.1314885795E+04    1.1077370832E+04    1.0836353873E+04    1.0592220199E+04    1.0345355526E+04    1.0096145095E+04    9.8449727750E+03    9.5922201796E+03    9.3382658017E+03    9.0834841679E+03    8.8282450140E+03    8.5729124863E+03    8.3178443681E+03    8.0633913360E+03    7.8098962459E+03    7.5576934516E+03    7.3071081580E+03    7.0584558091E+03    6.8120415133E+03    6.5681595069E+03    6.3270926570E+03    6.089112 [...]
+    1.0985434963E+04    1.0782892141E+04    1.0576115423E+04    1.0365442105E+04    1.0151212461E+04    9.9337689235E+03    9.7134552648E+03    9.4906157880E+03    9.2655945221E+03    9.0387344282E+03    8.8103766187E+03    8.5808595899E+03    8.3505184731E+03    8.1196843037E+03    7.8886833110E+03    7.6578362320E+03    7.4274576493E+03    7.1978553551E+03    6.9693297443E+03    6.7421732361E+03    6.5166697270E+03    6.2930940765E+03    6.0717116245E+03    5.8527777450E+03    5.636537 [...]
+    1.0032317992E+04    9.8500704610E+03    9.6639725947E+03    9.4743245529E+03    9.2814292529E+03    9.0855916470E+03    8.8871180027E+03    8.6863151866E+03    8.4834899551E+03    8.2789482535E+03    8.0729945260E+03    7.8659310373E+03    7.6580572090E+03    7.4496689733E+03    7.2410581428E+03    7.0325118017E+03    6.8243117173E+03    6.6167337752E+03    6.4100474378E+03    6.2045152294E+03    6.0003922471E+03    5.7979257005E+03    5.5973544797E+03    5.3989087533E+03    5.202809 [...]
+    9.1445493184E+03    8.9808393885E+03    8.8136340980E+03    8.6432000752E+03    8.4698064962E+03    8.2937244506E+03    8.1152263078E+03    7.9345850872E+03    7.7520738336E+03    7.5679649997E+03    7.3825298367E+03    7.1960377968E+03    7.0087559465E+03    6.8209483949E+03    6.6328757369E+03    6.4447945131E+03    6.2569566882E+03    6.0696091498E+03    5.8829932265E+03    5.6973442295E+03    5.5128910167E+03    5.3298555811E+03    5.1484526639E+03    4.9688893941E+03    4.791364 [...]
+    8.3205390815E+03    8.1737522746E+03    8.0237977279E+03    7.8709117537E+03    7.7153330151E+03    7.5573019702E+03    7.3970603160E+03    7.2348504362E+03    7.0709148523E+03    6.9054956809E+03    6.7388340981E+03    6.5711698134E+03    6.4027405526E+03    6.2337815541E+03    6.0645250768E+03    5.8951999232E+03    5.7260309781E+03    5.5572387638E+03    5.3890390132E+03    5.2216422621E+03    5.0552534616E+03    4.8900716101E+03    4.7262894085E+03    4.5640929365E+03    4.403661 [...]
+    7.5572136622E+03    7.4258774767E+03    7.2916756262E+03    7.1548169865E+03    7.0155125987E+03    6.8739751834E+03    6.7304186553E+03    6.5850576397E+03    6.4381069928E+03    6.2897813259E+03    6.1402945361E+03    5.9898593445E+03    5.8386868428E+03    5.6869860494E+03    5.5349634775E+03    5.3828227138E+03    5.2307640125E+03    5.0789839015E+03    4.9276748053E+03    4.7770246833E+03    4.6272166854E+03    4.4784288254E+03    4.3308336726E+03    4.1845980629E+03    4.039882 [...]
+    6.8509495629E+03    6.7337195124E+03    6.6139022740E+03    6.4916818891E+03    6.3672443887E+03    6.2407773713E+03    6.1124695801E+03    5.9825104823E+03    5.8510898502E+03    5.7183973470E+03    5.5846221170E+03    5.4499523811E+03    5.3145750413E+03    5.1786752912E+03    5.0424362374E+03    4.9060385300E+03    4.7696600052E+03    4.6334753387E+03    4.4976557133E+03    4.3623684994E+03    4.2277769500E+03    4.0940399108E+03    3.9613115464E+03    3.8297410822E+03    3.699472 [...]
+    6.1981240140E+03    6.0937652111E+03    5.9870759360E+03    5.8782177752E+03    5.7673541380E+03    5.6546498911E+03    5.5402709922E+03    5.4243841256E+03    5.3071563387E+03    5.1887546819E+03    5.0693458525E+03    4.9490958433E+03    4.8281695973E+03    4.7067306685E+03    4.5849408910E+03    4.4629600563E+03    4.3409456001E+03    4.2190522986E+03    4.0974319760E+03    3.9762332241E+03    3.8556011325E+03    3.7356770331E+03    3.6165982573E+03    3.4984979065E+03    3.381504 [...]
+    5.5953884476E+03    5.5027577150E+03    5.4080330767E+03    5.3113558641E+03    5.2128690727E+03    5.1127170468E+03    5.0110451639E+03    4.9079995201E+03    4.8037266163E+03    4.6983730472E+03    4.5920851927E+03    4.4850089141E+03    4.3772892543E+03    4.2690701434E+03    4.1604941114E+03    4.0517020073E+03    3.9428327254E+03    3.8340229412E+03    3.7254068549E+03    3.6171159460E+03    3.5092787362E+03    3.4020205650E+03    3.2954633747E+03    3.1897255085E+03    3.084921 [...]
+    5.0397601867E+03    4.9577912019E+03    4.8739460898E+03    4.7883479791E+03    4.7011215103E+03    4.6123925657E+03    4.5222879987E+03    4.4309353634E+03    4.3384626455E+03    4.2449979940E+03    4.1506694562E+03    4.0556047156E+03    3.9599308331E+03    3.8637739931E+03    3.7672592543E+03    3.6705103071E+03    3.5736492357E+03    3.4767962888E+03    3.3800696567E+03    3.2835852563E+03    3.1874565255E+03    3.0917942248E+03    2.9967062504E+03    2.9022974548E+03    2.808669 [...]
+    4.5286082533E+03    4.4563005468E+03    4.3823168409E+03    4.3067639851E+03    4.2297501954E+03    4.1513848241E+03    4.0717781282E+03    3.9910410389E+03    3.9092849308E+03    3.8266213928E+03    3.7431620010E+03    3.6590180932E+03    3.5743005476E+03    3.4891195638E+03    3.4035844491E+03    3.3178034083E+03    3.2318833394E+03    3.1459296349E+03    3.0600459884E+03    2.9743342091E+03    2.8888940416E+03    2.8038229949E+03    2.7192161772E+03    2.6351661403E+03    2.551762 [...]
+    4.0595879795E+03    3.9959996117E+03    3.9309186826E+03    3.8644375693E+03    3.7966498769E+03    3.7276502422E+03    3.6575341379E+03    3.5863976754E+03    3.5143374089E+03    3.4414501403E+03    3.3678327245E+03    3.2935818782E+03    3.2187939897E+03    3.1435649319E+03    3.0679898794E+03    2.9921631278E+03    2.9161779187E+03    2.8401262682E+03    2.7640988008E+03    2.6881845890E+03    2.6124709978E+03    2.5370435356E+03    2.4619857122E+03    2.3873789020E+03    2.313302 [...]
+    3.6305600785E+03    3.5748033235E+03    3.5177215939E+03    3.4593944890E+03    3.3999027037E+03    3.3393278635E+03    3.2777523571E+03    3.2152591705E+03    3.1519317200E+03    3.0878536864E+03    3.0231088507E+03    2.9577809299E+03    2.8919534164E+03    2.8257094182E+03    2.7591315025E+03    2.6923015421E+03    2.6253005652E+03    2.5582086090E+03    2.4911045772E+03    2.4240661020E+03    2.3571694106E+03    2.2904891970E+03    2.2240984985E+03    2.1580685783E+03    2.092468 [...]
+    3.2395147633E+03    3.1907539773E+03    3.1408207146E+03    3.0897833800E+03    3.0377113493E+03    2.9846748296E+03    2.9307447178E+03    2.8759924603E+03    2.8204899117E+03    2.7643091946E+03    2.7075225597E+03    2.6502022474E+03    2.5924203509E+03    2.5342486810E+03    2.4757586327E+03    2.4170210550E+03    2.3581061228E+03    2.2990832122E+03    2.2400207785E+03    2.1809862391E+03    2.1220458585E+03    2.0632646387E+03    2.0047062134E+03    1.9464327466E+03    1.888504 [...]
+    2.8845107558E+03    2.8419616461E+03    2.7983781936E+03    2.7538190806E+03    2.7083438429E+03    2.6620127517E+03    2.6148866947E+03    2.5670270565E+03    2.5184955997E+03    2.4693543463E+03    2.4196654591E+03    2.3694911245E+03    2.3188934369E+03    2.2679342838E+03    2.2166752331E+03    2.1651774223E+03    2.1135014500E+03    2.0617072698E+03    2.0098540871E+03    1.9580002588E+03    1.9062031959E+03    1.8545192698E+03    1.8030037222E+03    1.7517105781E+03    1.700692 [...]
+    2.5636321151E+03    2.5265617629E+03    2.4885815514E+03    2.4497417991E+03    2.4100935688E+03    2.3696885667E+03    2.3285790425E+03    2.2868176876E+03    2.2444575347E+03    2.2015518570E+03    2.1581540682E+03    2.1143176230E+03    2.0700959193E+03    2.0255422009E+03    1.9807094620E+03    1.9356503535E+03    1.8904170909E+03    1.8450613647E+03    1.7996342528E+03    1.7541861351E+03    1.7087666118E+03    1.6634244231E+03    1.6182073730E+03    1.5731622554E+03    1.528334 [...]
+    2.2749618833E+03    2.2426890351E+03    2.2096178792E+03    2.1757916158E+03    2.1412540876E+03    2.1060496945E+03    2.0702233074E+03    2.0338201827E+03    1.9968858764E+03    1.9594661582E+03    1.9216069269E+03    1.8833541260E+03    1.8447536601E+03    1.8058513130E+03    1.7666926662E+03    1.7273230200E+03    1.6877873153E+03    1.6481300577E+03    1.6083952431E+03    1.5686262864E+03    1.5288659513E+03    1.4891562830E+03    1.4495385440E+03    1.4100531514E+03    1.370739 [...]
+    2.0165697087E+03    1.9884650023E+03    1.9596613404E+03    1.9301959364E+03    1.9001065530E+03    1.8694314284E+03    1.8382092032E+03    1.8064788458E+03    1.7742795794E+03    1.7416508086E+03    1.7086320466E+03    1.6752628430E+03    1.6415827132E+03    1.6076310676E+03    1.5734471433E+03    1.5390699360E+03    1.5045381342E+03    1.4698900548E+03    1.4351635802E+03    1.4003960974E+03    1.3656244397E+03    1.3308848292E+03    1.2962128232E+03    1.2616432612E+03    1.227210 [...]
+    1.7865100661E+03    1.7619959842E+03    1.7368708479E+03    1.7111669029E+03    1.6849168592E+03    1.6581538273E+03    1.6309112533E+03    1.6032228554E+03    1.5751225596E+03    1.5466444365E+03    1.5178226383E+03    1.4886913366E+03    1.4592846614E+03    1.4296366403E+03    1.3997811398E+03    1.3697518076E+03    1.3395820156E+03    1.3093048056E+03    1.2789528358E+03    1.2485583291E+03    1.2181530237E+03    1.1877681254E+03    1.1574342614E+03    1.1271814369E+03    1.097038 [...]
+    1.5828278817E+03    1.5613783190E+03    1.5393949147E+03    1.5169058557E+03    1.4939397168E+03    1.4705254038E+03    1.4466920962E+03    1.4224691910E+03    1.3978862459E+03    1.3729729237E+03    1.3477589370E+03    1.3222739939E+03    1.2965477444E+03    1.2706097280E+03    1.2444893222E+03    1.2182156931E+03    1.1918177460E+03    1.1653240787E+03    1.1387629362E+03    1.1121621662E+03    1.0855491773E+03    1.0589508988E+03    1.0323937420E+03    1.0059035636E+03    9.795056 [...]
+    1.4035688723E+03    1.3847082716E+03    1.3653811263E+03    1.3456123668E+03    1.3254272431E+03    1.3048512733E+03    1.2839101917E+03    1.2626298981E+03    1.2410364066E+03    1.2191557958E+03    1.1970141595E+03    1.1746375579E+03    1.1520519701E+03    1.1292832479E+03    1.1063570706E+03    1.0832989009E+03    1.0601339425E+03    1.0368870992E+03    1.0135829355E+03    9.9024563886E+02    9.6689898357E+02    9.4356629669E+02    9.2027042548E+02    8.9703370691E+02    8.738779 [...]
+    1.2467925023E+03    1.2300945577E+03    1.2129882267E+03    1.1954958829E+03    1.1776401594E+03    1.1594439009E+03    1.1409301161E+03    1.1221219302E+03    1.1030425385E+03    1.0837151601E+03    1.0641629929E+03    1.0444091693E+03    1.0244767135E+03    1.0043884989E+03    9.8416720797E+02    9.6383529300E+02    9.4341493802E+02    9.2292802283E+02    9.0239608835E+02    8.8184030365E+02    8.6128143487E+02    8.4073981578E+02    8.2023532024E+02    7.9978733652E+02    7.794147 [...]
+    1.1105860083E+03    1.0956719647E+03    1.0803993284E+03    1.0647885185E+03    1.0488601617E+03    1.0326350468E+03    1.0161340789E+03    9.9937823537E+02    9.8238852115E+02    9.6518592605E+02    9.4779138227E+02    9.3022572323E+02    9.1250964355E+02    8.9466366032E+02    8.7670807576E+02    8.5866294134E+02    8.4054802344E+02    8.2238277071E+02    8.0418628301E+02    7.8597728224E+02    7.6777408487E+02    7.4959457635E+02    7.3145618740E+02    7.1337587216E+02    6.953700 [...]
+    9.9307840037E+02    9.7961499336E+02    9.6583518731E+02    9.5175795858E+02    9.3740244660E+02    9.2278790945E+02    9.0793368004E+02    8.9285912283E+02    8.7758359143E+02    8.6212638704E+02    8.4650671797E+02    8.3074366036E+02    8.1485612012E+02    7.9886279634E+02    7.8278214607E+02    7.6663235077E+02    7.5043128442E+02    7.3419648326E+02    7.1794511744E+02    7.0169396440E+02    6.8545938423E+02    6.6925729692E+02    6.5310316152E+02    6.3701195729E+02    6.209981 [...]
+    8.9245370235E+02    8.8015079165E+02    8.6756682492E+02    8.5471976248E+02    8.4162769038E+02    8.2830877652E+02    8.1478122726E+02    8.0106324484E+02    7.8717298565E+02    7.7312851949E+02    7.5894778999E+02    7.4464857635E+02    7.3024845633E+02    7.1576477089E+02    7.0121459030E+02    6.8661468197E+02    6.7198148004E+02    6.5733105683E+02    6.4267909610E+02    6.2804086836E+02    6.1343120807E+02    5.9886449290E+02    5.8435462508E+02    5.6991501468E+02    5.555585 [...]
+    8.0696295716E+02    7.9557091197E+02    7.8392703041E+02    7.7204860570E+02    7.5995302626E+02    7.4765773158E+02    7.3518016878E+02    7.2253774998E+02    7.0974781063E+02    6.9682756886E+02    6.8379408616E+02    6.7066422938E+02    6.5745463415E+02    6.4418167000E+02    6.3086140704E+02    6.1750958453E+02    6.0414158124E+02    5.9077238778E+02    5.7741658089E+02    5.6408829987E+02    5.5080122494E+02    5.3756855791E+02    5.2440300484E+02    5.1131676096E+02    4.983214 [...]
+    7.3493471211E+02    7.2424160586E+02    7.1332045970E+02    7.0218817805E+02    6.9086173617E+02    6.7935813545E+02    6.6769435942E+02    6.5588733058E+02    6.4395386831E+02    6.3191064787E+02    6.1977416073E+02    6.0756067641E+02    5.9528620572E+02    5.8296646585E+02    5.7061684708E+02    5.5825238148E+02    5.4588771352E+02    5.3353707268E+02    5.2121424824E+02    5.0893256613E+02    4.9670486806E+02    4.8454349281E+02    4.7246025978E+02    4.6046645486E+02    4.485728 [...]
+    6.7478383322E+02    6.6461250413E+02    6.5423217675E+02    6.4365958147E+02    6.3291150086E+02    6.2200472412E+02    6.1095600217E+02    5.9978200374E+02    5.8849927245E+02    5.7712418511E+02    5.6567291147E+02    5.5416137535E+02    5.4260521747E+02    5.3101976002E+02    5.1941997304E+02    5.0782044282E+02    4.9623534230E+02    4.8467840356E+02    4.7316289260E+02    4.6170158626E+02    4.5030675149E+02    4.3899012691E+02    4.2776290678E+02    4.1663572721E+02    4.056186 [...]
+    6.2501859080E+02    6.1522362171E+02    6.0523457373E+02    5.9506816162E+02    5.8474113891E+02    5.7427025118E+02    5.6367219020E+02    5.5296354901E+02    5.4216077802E+02    5.3128014250E+02    5.2033768130E+02    5.0934916730E+02    4.9833006939E+02    4.8729551635E+02    4.7626026256E+02    4.6523865586E+02    4.5424460736E+02    4.4329156358E+02    4.3239248079E+02    4.2155980169E+02    4.1080543445E+02    4.0014073420E+02    3.8957648692E+02    3.7912289579E+02    3.687895 [...]
+    5.8424602418E+02    5.7471069134E+02    5.6499267035E+02    5.5510876964E+02    5.4507582744E+02    5.3491066405E+02    5.2463003488E+02    5.1425058454E+02    5.0378880187E+02    4.9326097642E+02    4.8268315628E+02    4.7207110744E+02    4.6144027500E+02    4.5080574610E+02    4.4018221487E+02    4.2958394943E+02    4.1902476108E+02    4.0851797569E+02    3.9807640752E+02    3.8771233526E+02    3.7743748073E+02    3.6726298987E+02    3.5719941633E+02    3.4725670761E+02    3.374441 [...]
+    5.5117563971E+02    5.4180887558E+02    5.3226783769E+02    5.2256949494E+02    5.1273084109E+02    5.0276884599E+02    4.9270040770E+02    4.8254230546E+02    4.7231115384E+02    4.6202335813E+02    4.5169507120E+02    4.4134215198E+02    4.3098012560E+02    4.2062414548E+02    4.1028895735E+02    3.9998886537E+02    3.8973770051E+02    3.7954879116E+02    3.6943493614E+02    3.5940838011E+02    3.4948079157E+02    3.3966324325E+02    3.2996619520E+02    3.2039948041E+02    3.109722 [...]
+    5.2462152859E+02    5.1535493932E+02    5.0592002349E+02    4.9633394143E+02    4.8661387679E+02    4.7677698695E+02    4.6684035420E+02    4.5682093786E+02    4.4673552751E+02    4.3660069747E+02    4.2643276280E+02    4.1624773677E+02    4.0606129018E+02    3.9588871250E+02    3.8574487498E+02    3.7564419598E+02    3.6560060835E+02    3.5562752930E+02    3.4573783253E+02    3.3594382288E+02    3.2625721351E+02    3.1668910564E+02    3.0724997091E+02    2.9794963633E+02    2.887972 [...]
+    5.0350301415E+02    4.9428798729E+02    4.8490857886E+02    4.7538214193E+02    4.6572605422E+02    4.5595766784E+02    4.4609425975E+02    4.3615298321E+02    4.2615082024E+02    4.1610453536E+02    4.0603063076E+02    3.9594530306E+02    3.8586440176E+02    3.7580338957E+02    3.6577730474E+02    3.5580072546E+02    3.4588773653E+02    3.3605189828E+02    3.2630621793E+02    3.1666312342E+02    3.0713443976E+02    2.9773136800E+02    2.8846446676E+02    2.7934363650E+02    2.703781 [...]
+    4.8684395473E+02    4.7764888753E+02    4.6829180206E+02    4.5879022153E+02    4.4916169742E+02    4.3942375884E+02    4.2959386249E+02    4.1968934361E+02    4.0972736790E+02    3.9972488473E+02    3.8969858168E+02    3.7966484066E+02    3.6963969574E+02    3.5963879278E+02    3.4967735104E+02    3.3977012686E+02    3.2993137957E+02    3.2017483969E+02    3.1051367941E+02    3.0096048574E+02    2.9152723594E+02    2.8222527578E+02    2.7306530021E+02    2.6405733682E+02    2.552107 [...]
+    4.7377083866E+02    4.6457851265E+02    4.5522532616E+02    4.4572893130E+02    4.3610701394E+02    4.2637724282E+02    4.1655721941E+02    4.0666442849E+02    3.9671618986E+02    3.8672961110E+02    3.7672154185E+02    3.6670852943E+02    3.5670677618E+02    3.4673209864E+02    3.3679988859E+02    3.2692507612E+02    3.1712209494E+02    3.0740484985E+02    2.9778668667E+02    2.8828036450E+02    2.7889803052E+02    2.6965119742E+02    2.6055072327E+02    2.5160679424E+02    2.428289 [...]
+    4.6350981498E+02    4.5431493725E+02    4.4495948390E+02    4.3546118093E+02    4.2583779491E+02    4.1610708221E+02    4.0628673887E+02    3.9639435120E+02    3.8644734741E+02    3.7646295038E+02    3.6645813161E+02    3.5644956679E+02    3.4645359283E+02    3.3648616672E+02    3.2656282617E+02    3.1669865234E+02    3.0690823462E+02    2.9720563761E+02    2.8760437043E+02    2.7811735843E+02    2.6875691728E+02    2.5953472971E+02    2.5046182465E+02    2.4154855914E+02    2.328046 [...]
+    4.5538280635E+02    4.4618973328E+02    4.3683578675E+02    4.2733870217E+02    4.1771626323E+02    4.0798625152E+02    3.9816639670E+02    3.8827432737E+02    3.7832752293E+02    3.6834326646E+02    3.5833859882E+02    3.4833027419E+02    3.3833471710E+02    3.2836798116E+02    3.1844570960E+02    3.0858309770E+02    2.9879485730E+02    2.8909518342E+02    2.7949772317E+02    2.7001554693E+02    2.6066112193E+02    2.5144628836E+02    2.4238223789E+02    2.3347949481E+02    2.247478 [...]
+    4.4880285098E+02    4.3962350565E+02    4.3028265586E+02    4.2079797624E+02    4.1118719795E+02    4.0146805891E+02    3.9165825457E+02    3.8177538932E+02    3.7183692878E+02    3.6186015306E+02    3.5186211127E+02    3.4185957727E+02    3.3186900692E+02    3.2190649689E+02    3.1198774528E+02    3.0212801403E+02    2.9234209328E+02    2.8264426785E+02    2.7304828585E+02    2.6356732955E+02    2.5421398857E+02    2.4500023543E+02    2.3593740360E+02    2.2703616801E+02    2.183065 [...]
+    4.4326881805E+02    4.3412080819E+02    4.2481054053E+02    4.1535555635E+02    4.0577346187E+02    3.9608187936E+02    3.8629839876E+02    3.7644052983E+02    3.6652565516E+02    3.5657098410E+02    3.4659350779E+02    3.3660995542E+02    3.2663675192E+02    3.1668997709E+02    3.0678532649E+02    2.9693807398E+02    2.8716303621E+02    2.7747453909E+02    2.6788638630E+02    2.5841182998E+02    2.4906354366E+02    2.3985359750E+02    2.3079343588E+02    2.2189385737E+02    2.131649 [...]
+    4.3835963621E+02    4.2926457570E+02    4.2000655614E+02    4.1060291328E+02    4.0107105606E+02    3.9142841894E+02    3.8169241443E+02    3.7188038636E+02    3.6200956373E+02    3.5209701558E+02    3.4215960676E+02    3.3221395493E+02    3.2227638886E+02    3.1236290813E+02    3.0248914446E+02    2.9267032464E+02    2.8292123528E+02    2.7325618944E+02    2.6368899527E+02    2.5423292666E+02    2.4490069609E+02    2.3570442964E+02    2.2665564430E+02    2.1776522757E+02    2.090434 [...]
+    4.3372816880E+02    4.2471020203E+02    4.1552876762E+02    4.0620092629E+02    3.9674381991E+02    3.8717462504E+02    3.7751050678E+02    3.6776857320E+02    3.5796583040E+02    3.4811913834E+02    3.3824516769E+02    3.2836035772E+02    3.1848087541E+02    3.0862257593E+02    2.9880096458E+02    2.8903116029E+02    2.7932786085E+02    2.6970530989E+02    2.6017726573E+02    2.5075697226E+02    2.4145713178E+02    2.3228988000E+02    2.2326676319E+02    2.1439871752E+02    2.056960 [...]
+    4.2909486073E+02    4.2017938606E+02    4.1110023723E+02    4.0187413507E+02    3.9251788887E+02    3.8304835137E+02    3.7348237411E+02    3.6383676320E+02    3.5412823567E+02    3.4437337660E+02    3.3458859711E+02    3.2479009336E+02    3.1499380664E+02    3.0521538482E+02    2.9547014508E+02    2.8577303814E+02    2.7613861414E+02    2.6658099010E+02    2.5711381927E+02    2.4775026224E+02    2.3850296006E+02    2.2938400927E+02    2.2040493909E+02    2.1157669061E+02    2.029095 [...]
+    4.2424127328E+02    4.1545385894E+02    4.0650294715E+02    3.9740485996E+02    3.8817601441E+02    3.7883287922E+02    3.6939193160E+02    3.5986961461E+02    3.5028229500E+02    3.4064622171E+02    3.3097748517E+02    3.2129197757E+02    3.1160535414E+02    3.0193299563E+02    2.9228997206E+02    2.8269100782E+02    2.7315044831E+02    2.6368222815E+02    2.5429984103E+02    2.4501631133E+02    2.3584416753E+02    2.2679541761E+02    2.1788152620E+02    2.0911339396E+02    2.005013 [...]
+    4.1900361209E+02    4.1036909565E+02    4.0157169741E+02    3.9262728884E+02    3.8355184208E+02    3.7436138826E+02    3.6507197617E+02    3.5569963115E+02    3.4626031454E+02    3.3676988371E+02    3.2724405284E+02    3.1769835454E+02    3.0814810247E+02    2.9860835495E+02    2.8909387989E+02    2.7961912094E+02    2.7019816496E+02    2.6084471115E+02    2.5157204151E+02    2.4239299314E+02    2.3331993214E+02    2.2436472928E+02    2.1553873759E+02    2.0685277172E+02    1.983170 [...]
+    4.1326634328E+02    4.0480810360E+02    3.9618807004E+02    3.8742161943E+02    3.7852423395E+02    3.6951146127E+02    3.6039887499E+02    3.5120203526E+02    3.4193644994E+02    3.3261753623E+02    3.2326058299E+02    3.1388071391E+02    3.0449285140E+02    2.9511168171E+02    2.8575162092E+02    2.7642678231E+02    2.6715094489E+02    2.5793752337E+02    2.4879953959E+02    2.3974959543E+02    2.3079984736E+02    2.2196198264E+02    2.1324719722E+02    2.0466617548E+02    1.962290 [...]
+    4.0695598036E+02    3.9869536981E+02    3.9027453928E+02    3.8170833505E+02    3.7301171241E+02    3.6419969766E+02    3.5528735038E+02    3.4628972586E+02    3.3722183797E+02    3.2809862252E+02    3.1893490121E+02    3.0974534630E+02    3.0054444609E+02    2.9134647132E+02    2.8216544261E+02    2.7301509896E+02    2.6390886747E+02    2.5485983434E+02    2.4588071721E+02    2.3698383894E+02    2.2818110284E+02    2.1948396951E+02    2.1090343524E+02    2.0245001210E+02    1.941337 [...]
+    4.0003511361E+02    3.9199103676E+02    3.8378879680E+02    3.7544268182E+02    3.6696709151E+02    3.5837650111E+02    3.4968542544E+02    3.4090838327E+02    3.3205986188E+02    3.2315428220E+02    3.1420596445E+02    3.0522909434E+02    2.9623769022E+02    2.8724557083E+02    2.7826632419E+02    2.6931327740E+02    2.6039946754E+02    2.5153761384E+02    2.4274009098E+02    2.3401890383E+02    2.2538566347E+02    2.1685156476E+02    2.0842736534E+02    2.0012336614E+02    1.919493 [...]
+    3.9249674142E+02    3.8468536595E+02    3.7671835017E+02    3.6860940449E+02    3.6037235247E+02    3.5202109667E+02    3.4356958456E+02    3.3503177471E+02    3.2642160314E+02    3.1775295024E+02    3.0903960805E+02    3.0029524817E+02    2.9153339041E+02    2.8276737213E+02    2.7401031850E+02    2.6527511364E+02    2.5657437288E+02    2.4792041598E+02    2.3932524163E+02    2.3080050309E+02    2.2235748518E+02    2.1400708257E+02    2.0575977947E+02    1.9762563079E+02    1.896142 [...]
+    3.8435895186E+02    3.7679353680E+02    3.6907544175E+02    3.6121778774E+02    3.5323380950E+02    3.4513682320E+02    3.3694019417E+02    3.2865730495E+02    3.2030152338E+02    3.1188617130E+02    3.0342449348E+02    2.9492962725E+02    2.8641457264E+02    2.7789216332E+02    2.6937503828E+02    2.6087561438E+02    2.5240605984E+02    2.4397826877E+02    2.3560383674E+02    2.2729403750E+02    2.1905980088E+02    2.1091169196E+02    2.0285989153E+02    1.9491417783E+02    1.870839 [...]
+    3.7565999162E+02    3.6835081810E+02    3.6089232501E+02    3.5329703964E+02    3.4557760259E+02    3.3774673733E+02    3.2981721975E+02    3.2180184791E+02    3.1371341202E+02    3.0556466468E+02    2.9736829163E+02    2.8913688292E+02    2.8088290470E+02    2.7261867162E+02    2.6435631996E+02    2.5610778162E+02    2.4788475893E+02    2.3969870036E+02    2.3156077729E+02    2.2348186181E+02    2.1547250562E+02    2.0754292005E+02    1.9970295739E+02    1.9196209331E+02    1.843294 [...]
+    3.6645374892E+02    3.5940813870E+02    3.5221692524E+02    3.4489204448E+02    3.3744554441E+02    3.2988955638E+02    3.2223626641E+02    3.1449788662E+02    3.0668662695E+02    2.9881466707E+02    2.9089412877E+02    2.8293704867E+02    2.7495535163E+02    2.6696082459E+02    2.5896509122E+02    2.5097958720E+02    2.4301553638E+02    2.3508392777E+02    2.2719549343E+02    2.1936068742E+02    2.1158966566E+02    2.0389226695E+02    1.9627799507E+02    1.8875600202E+02    1.813350 [...]
+    3.5680566737E+02    3.5002807471E+02    3.4310890221E+02    3.3605950289E+02    3.2889133979E+02    3.2161595892E+02    3.1424496223E+02    3.0678998077E+02    2.9926264795E+02    2.9167457312E+02    2.8403731549E+02    2.7636235847E+02    2.6866108450E+02    2.6094475038E+02    2.5322446334E+02    2.4551115768E+02    2.3781557220E+02    2.3014822845E+02    2.2251940982E+02    2.1493914150E+02    2.0741717146E+02    1.9996295237E+02    1.9258562459E+02    1.8529400018E+02    1.780965 [...]
+    3.4678909838E+02    3.4028126174E+02    3.3363612401E+02    3.2686446906E+02    3.1997718799E+02    3.1298525375E+02    3.0589969564E+02    2.9873157404E+02    2.9149195523E+02    2.8419188654E+02    2.7684237177E+02    2.6945434697E+02    2.6203865677E+02    2.5460603111E+02    2.4716706263E+02    2.3973218471E+02    2.3231165009E+02    2.2491551039E+02    2.1755359628E+02    2.1023549862E+02    2.0297055041E+02    1.9576780968E+02    1.8863604334E+02    1.8158371206E+02    1.746189 [...]
+    3.3648209208E+02    3.3024323263E+02    3.2387155329E+02    3.1737728703E+02    3.1077077071E+02    3.0406242118E+02    2.9726271126E+02    2.9038214597E+02    2.8343123884E+02    2.7642048846E+02    2.6936035534E+02    2.6226123919E+02    2.5513345648E+02    2.4798721867E+02    2.4083261081E+02    2.3367957087E+02    2.2653786960E+02    2.1941709122E+02    2.1232661472E+02    2.0527559604E+02    1.9827295105E+02    1.9132733938E+02    1.8444714918E+02    1.7764048278E+02    1.709151 [...]
+    3.2596461899E+02    3.1999167407E+02    3.1389054020E+02    3.0767092146E+02    3.0134262197E+02    2.9491552338E+02    2.8839956227E+02    2.8180470771E+02    2.7514093897E+02    2.6841822347E+02    2.6164649495E+02    2.5483563207E+02    2.4799543731E+02    2.4113561645E+02    2.3426575843E+02    2.2739531585E+02    2.2053358608E+02    2.1368969299E+02    2.0687256938E+02    2.0009094021E+02    1.9335330652E+02    1.8666793021E+02    1.8004281968E+02    1.7348571629E+02    1.670040 [...]
+    3.1531620874E+02    3.0960408937E+02    3.0376851046E+02    2.9781867214E+02    2.9176387037E+02    2.8561347566E+02    2.7937691179E+02    2.7306363468E+02    2.6668311131E+02    2.6024479898E+02    2.5375812476E+02    2.4723246526E+02    2.4067712685E+02    2.3410132624E+02    2.2751417157E+02    2.2092464406E+02    2.1434158019E+02    2.0777365452E+02    2.0122936317E+02    1.9471700802E+02    1.8824468158E+02    1.8182025271E+02    1.7545135304E+02    1.6914536427E+02    1.629094 [...]
+    3.0461398683E+02    2.9915584953E+02    2.9357903167E+02    2.8789225662E+02    2.8210433905E+02    2.7622416482E+02    2.7026067089E+02    2.6422282537E+02    2.5811960764E+02    2.5195998874E+02    2.4575291202E+02    2.3950727405E+02    2.3323190598E+02    2.2693555521E+02    2.2062686763E+02    2.1431437027E+02    2.0800645459E+02    2.0171136025E+02    1.9543715965E+02    1.8919174297E+02    1.8298280403E+02    1.7681782680E+02    1.7070407273E+02    1.6464856875E+02    1.586580 [...]
+    2.9393108595E+02    2.8871861013E+02    2.8339223672E+02    2.7796024097E+02    2.7243098474E+02    2.6681289740E+02    2.6111445688E+02    2.5534417073E+02    2.4951055738E+02    2.4362212759E+02    2.3768736614E+02    2.3171471382E+02    2.2571254986E+02    2.1968917458E+02    2.1365279270E+02    2.0761149696E+02    2.0157325234E+02    1.9554588088E+02    1.8953704701E+02    1.8355424359E+02    1.7760477855E+02    1.7169576228E+02    1.6583409565E+02    1.6002645888E+02    1.542793 [...]
+    2.8333540502E+02    2.7835906874E+02    2.7327358002E+02    2.6808679553E+02    2.6280665371E+02    2.5744115667E+02    2.5199835220E+02    2.4648631579E+02    2.4091313292E+02    2.3528688144E+02    2.2961561424E+02    2.2390734229E+02    2.1817001786E+02    2.1241151832E+02    2.0663963023E+02    2.0086203392E+02    1.9508628867E+02    1.8931981832E+02    1.8356989749E+02    1.7784363845E+02    1.7214797857E+02    1.6648966846E+02    1.6087526077E+02    1.5531109967E+02    1.498033 [...]
+    2.7288868676E+02    2.6813803437E+02    2.6328289940E+02    2.5833074972E+02    2.5328913013E+02    2.4816564512E+02    2.4296794174E+02    2.3770369258E+02    2.3238057884E+02    2.2700627368E+02    2.2158842575E+02    2.1613464307E+02    2.1065247721E+02    2.0514940784E+02    1.9963282775E+02    1.9411002828E+02    1.8858818526E+02    1.8307434548E+02    1.7757541368E+02    1.7209814018E+02    1.6664910909E+02    1.6123472714E+02    1.5586121319E+02    1.5053458843E+02    1.452606 [...]
+    2.6264588267E+02    2.5810977931E+02    2.5347375505E+02    2.4874491849E+02    2.4393045037E+02    2.3903758711E+02    2.3407360445E+02    2.2904580125E+02    2.2396148333E+02    2.1882794763E+02    2.1365246654E+02    2.0844227256E+02    2.0320454328E+02    1.9794638673E+02    1.9267482713E+02    1.8739679111E+02    1.8211909440E+02    1.7684842902E+02    1.7159135103E+02    1.6635426881E+02    1.6114343201E+02    1.5596492101E+02    1.5082463707E+02    1.4572829315E+02    1.406814 [...]
+    2.5265477363E+02    2.4832164245E+02    2.4389301570E+02    2.3937567158E+02    2.3477645571E+02    2.3010226540E+02    2.2536003404E+02    2.2055671552E+02    2.1569926885E+02    2.1079464301E+02    2.0584976200E+02    2.0087151021E+02    1.9586671810E+02    1.9084214825E+02    1.8580448184E+02    1.8076030553E+02    1.7571609884E+02    1.7067822198E+02    1.6565290432E+02    1.6064623324E+02    1.5566414375E+02    1.5071240853E+02    1.4579662872E+02    1.4092222526E+02    1.360944 [...]
+    2.4295581386E+02    2.3881385290E+02    2.3458066201E+02    2.3026271671E+02    2.2586655544E+02    2.2139876446E+02    2.1686596278E+02    2.1227478733E+02    2.0763187815E+02    2.0294386386E+02    1.9821734740E+02    1.9345889198E+02    1.8867500745E+02    1.8387213692E+02    1.7905664392E+02    1.7423479987E+02    1.6941277206E+02    1.6459661212E+02    1.5979224504E+02    1.5500545863E+02    1.5024189370E+02    1.4550703464E+02    1.4080620076E+02    1.3614453814E+02    1.315270 [...]
+    2.3358216664E+02    2.2961954328E+02    2.2556977722E+02    2.2143906769E+02    2.1723367254E+02    2.1295989367E+02    2.0862406260E+02    2.0423252606E+02    1.9979163189E+02    1.9530771497E+02    1.9078708357E+02    1.8623600587E+02    1.8166069686E+02    1.7706730560E+02    1.7246190281E+02    1.6785046901E+02    1.6323888300E+02    1.5863291085E+02    1.5403819547E+02    1.4946024664E+02    1.4490443158E+02    1.4037596615E+02    1.3587990661E+02    1.3142114196E+02    1.270043 [...]
+    2.2455990091E+02    2.2076492254E+02    2.1688669609E+02    2.1293116928E+02    2.0890434435E+02    2.0481226409E+02    2.0066099778E+02    1.9645662742E+02    1.9220523398E+02    1.8791288394E+02    1.8358561611E+02    1.7922942863E+02    1.7485026640E+02    1.7045400881E+02    1.6604645788E+02    1.6163332679E+02    1.5722022896E+02    1.5281266748E+02    1.4841602509E+02    1.4403555475E+02    1.3967637066E+02    1.3534343986E+02    1.3104157448E+02    1.2677542446E+02    1.225494 [...]
+    2.1590831941E+02    2.1226957974E+02    2.0855128410E+02    2.0475915162E+02    2.0089895222E+02    1.9697649301E+02    1.9299760472E+02    1.8896812831E+02    1.8489390173E+02    1.8078074686E+02    1.7663445679E+02    1.7246078325E+02    1.6826542452E+02    1.6405401356E+02    1.5983210661E+02    1.5560517217E+02    1.5137858045E+02    1.4715759329E+02    1.4294735457E+02    1.3875288110E+02    1.3457905414E+02    1.3043061135E+02    1.2631213943E+02    1.2222806724E+02    1.181826 [...]
+    2.0764039064E+02    2.0414689181E+02    2.0057732061E+02    1.9693718864E+02    1.9323205486E+02    1.8946751231E+02    1.8564917497E+02    1.8178266474E+02    1.7787359862E+02    1.7392757601E+02    1.6995016640E+02    1.6594689721E+02    1.6192324205E+02    1.5788460931E+02    1.5383633108E+02    1.4978365253E+02    1.4573172180E+02    1.4168558021E+02    1.3765015306E+02    1.3363024095E+02    1.2963051157E+02    1.2565549206E+02    1.2170956195E+02    1.1779694666E+02    1.139217 [...]
+    1.9976325905E+02    1.9640451016E+02    1.9297296157E+02    1.8947393648E+02    1.8591280229E+02    1.8229495765E+02    1.7862581969E+02    1.7491081137E+02    1.7115534892E+02    1.6736482961E+02    1.6354461972E+02    1.5970004274E+02    1.5583636802E+02    1.5195879961E+02    1.4807246562E+02    1.4418240792E+02    1.4029357233E+02    1.3641079916E+02    1.3253881442E+02    1.2868222132E+02    1.2484549249E+02    1.2103296260E+02    1.1724882162E+02    1.1349710856E+02    1.097817 [...]
+    1.9227881015E+02    1.8904490323E+02    1.8574125919E+02    1.8237302996E+02    1.7894540880E+02    1.7546361772E+02    1.7193289497E+02    1.6835848269E+02    1.6474561472E+02    1.6109950468E+02    1.5742533418E+02    1.5372824146E+02    1.5001331020E+02    1.4628555879E+02    1.4254992996E+02    1.3881128074E+02    1.3507437297E+02    1.3134386417E+02    1.2762429896E+02    1.2392010094E+02    1.2023556506E+02    1.1657485063E+02    1.1294197475E+02    1.0934080635E+02    1.057750 [...]
+    1.8518426951E+02    1.8206593452E+02    1.7888071849E+02    1.7563361731E+02    1.7232966560E+02    1.6897392449E+02    1.6557146937E+02    1.6212737784E+02    1.5864671780E+02    1.5513453579E+02    1.5159584554E+02    1.4803561682E+02    1.4445876459E+02    1.4087013852E+02    1.3727451285E+02    1.3367657671E+02    1.3008092480E+02    1.2649204857E+02    1.2291432789E+02    1.1935202311E+02    1.1580926778E+02    1.1229006180E+02    1.0879826511E+02    1.0533759197E+02    1.019116 [...]
+    1.7847281718E+02    1.7546145766E+02    1.7238587274E+02    1.6925091553E+02    1.6606147569E+02    1.6282246733E+02    1.5953881716E+02    1.5621545259E+02    1.5285729017E+02    1.4946922413E+02    1.4605611524E+02    1.4262277984E+02    1.3917397933E+02    1.3571440986E+02    1.3224869250E+02    1.2878136373E+02    1.2531686642E+02    1.2185954118E+02    1.1841361828E+02    1.1498320993E+02    1.1157230319E+02    1.0818475333E+02    1.0482427773E+02    1.0149445031E+02    9.819869 [...]
+    1.7213420158E+02    1.6922191298E+02    1.6624786214E+02    1.6321677098E+02    1.6013339598E+02    1.5700251636E+02    1.5382892247E+02    1.5061740413E+02    1.4737273931E+02    1.4409968293E+02    1.4080295591E+02    1.3748723451E+02    1.3415713996E+02    1.3081722847E+02    1.2747198153E+02    1.2412579667E+02    1.2078297862E+02    1.1744773090E+02    1.1412414788E+02    1.1081620731E+02    1.0752776337E+02    1.0426254021E+02    1.0102412603E+02    9.7815967677E+01    9.464136 [...]
+    1.6615533926E+02    1.6333491191E+02    1.6045500263E+02    1.5752021201E+02    1.5453517350E+02    1.5150454187E+02    1.4843298171E+02    1.4532515616E+02    1.4218571567E+02    1.3901928714E+02    1.3583046311E+02    1.3262379137E+02    1.2940376478E+02    1.2617481147E+02    1.2294128539E+02    1.1970745722E+02    1.1647750574E+02    1.1325550960E+02    1.1004543953E+02    1.0685115107E+02    1.0367637779E+02    1.0052472494E+02    9.7399663693E+01    9.4304525911E+01    9.124249 [...]
+    1.6052088945E+02    1.5778579838E+02    1.5499333360E+02    1.5214798277E+02    1.4925426493E+02    1.4631671921E+02    1.4333989355E+02    1.4032833365E+02    1.3728657198E+02    1.3421911707E+02    1.3113044298E+02    1.2802497906E+02    1.2490710000E+02    1.2178111621E+02    1.1865126457E+02    1.1552169950E+02    1.1239648451E+02    1.0927958414E+02    1.0617485635E+02    1.0308604535E+02    1.0001677499E+02    9.6970542560E+01    9.3950713136E+01    9.0960514461E+01    8.800303 [...]
+    1.5521379442E+02    1.5255817797E+02    1.4984713568E+02    1.4708504923E+02    1.4427633046E+02    1.4142541027E+02    1.3853672759E+02    1.3561471852E+02    1.3266380558E+02    1.2968838717E+02    1.2669282723E+02    1.2368144528E+02    1.2065850656E+02    1.1762821266E+02    1.1459469239E+02    1.1156199308E+02    1.0853407225E+02    1.0551478972E+02    1.0250790011E+02    9.9517045889E+01    9.6545750782E+01    9.3597413770E+01    9.0675303525E+01    8.7782553381E+01    8.492215 [...]
+    1.5021577889E+02    1.4763440840E+02    1.4499941178E+02    1.4231507049E+02    1.3958569510E+02    1.3681561445E+02    1.3400916481E+02    1.3117067919E+02    1.2830447686E+02    1.2541485298E+02    1.2250606846E+02    1.1958234019E+02    1.1664783135E+02    1.1370664224E+02    1.1076280132E+02    1.0782025663E+02    1.0488286766E+02    1.0195439755E+02    9.9038505807E+01    9.6138741376E+01    9.3258536255E+01    9.0401199545E+01    8.7569912007E+01    8.4767721116E+01    8.199753 [...]
+    1.4550780368E+02    1.4299604602E+02    1.4043232624E+02    1.3782083025E+02    1.3516577226E+02    1.3247138402E+02    1.2974190434E+02    1.2698156853E+02    1.2419459813E+02    1.2138519075E+02    1.1855751015E+02    1.1571567656E+02    1.1286375732E+02    1.1000575774E+02    1.0714561236E+02    1.0428717656E+02    1.0143421850E+02    9.8590411541E+01    9.5759327000E+01    9.2944427415E+01    9.0149060225E+01    8.7376451934E+01    8.4629702751E+01    8.1911781726E+01    7.922552 [...]
+    1.4107047054E+02    1.3862424535E+02    1.3612759885E+02    1.3358462514E+02    1.3099944593E+02    1.2837619999E+02    1.2571903285E+02    1.2303208646E+02    1.2031948914E+02    1.1758534560E+02    1.1483372722E+02    1.1206866257E+02    1.0929412816E+02    1.0651403956E+02    1.0373224278E+02    1.0095250598E+02    9.8178511649E+01    9.5413849085E+01    9.2662007307E+01    8.9926368417E+01    8.7210201392E+01    8.4516656334E+01    8.1848759194E+01    7.9209406979E+01    7.660136 [...]
+    1.3688437651E+02    1.3450010997E+02    1.3206685192E+02    1.2958860767E+02    1.2706940951E+02    1.2451330645E+02    1.2192435408E+02    1.1930660450E+02    1.1666409642E+02    1.1400084539E+02    1.1132083429E+02    1.0862800399E+02    1.0592624435E+02    1.0321938544E+02    1.0051118909E+02    9.7805340794E+01    9.5105441982E+01    9.2415002640E+01    8.9737434359E+01    8.7076043792E+01    8.4434026545E+01    8.1814461524E+01    7.9220305726E+01    7.6654389519E+01    7.411941 [...]
+    1.3293041782E+02    1.3060499427E+02    1.2823190986E+02    1.2581508341E+02    1.2335846025E+02    1.2086600216E+02    1.1834167745E+02    1.1578945113E+02    1.1321327513E+02    1.1061707884E+02    1.0800475970E+02    1.0538017412E+02    1.0274712860E+02    1.0010937111E+02    9.7470582871E+01    9.4834370339E+01    9.2204257643E+01    8.9583679336E+01    8.6975973559E+01    8.4384375607E+01    8.1812011917E+01    7.9261894497E+01    7.6736915800E+01    7.4239844058E+01    7.177331 [...]
+    1.2919004417E+02    1.2692075707E+02    1.2460505185E+02    1.2224676267E+02    1.1984974978E+02    1.1741788972E+02    1.1495506561E+02    1.1246515748E+02    1.0995203278E+02    1.0741953706E+02    1.0487148476E+02    1.0231165033E+02    9.9743759528E+01    9.7171480972E+01    9.4598418051E+01    9.2028101107E+01    8.9463979974E+01    8.6909416879E+01    8.4367679718E+01    8.1841935731E+01    7.9335245588E+01    7.6850557906E+01    7.4390704188E+01    7.1958394228E+01    6.955621 [...]
+    1.2564546544E+02    1.2342996876E+02    1.2116921935E+02    1.1886696813E+02    1.1652699177E+02    1.1415308312E+02    1.1174904169E+02    1.0931866426E+02    1.0686573553E+02    1.0439401903E+02    1.0190724810E+02    9.9409117223E+01    9.6903273441E+01    9.4393308149E+01    9.1882749121E+01    8.9375052863E+01    8.6873597287E+01    8.4381674747E+01    8.1902485432E+01    7.9439131153E+01    7.6994609527E+01    7.4571808574E+01    7.2173501741E+01    6.9802343358E+01    6.746086 [...]
+    1.2227981350E+02    1.2011607450E+02    1.1790818062E+02    1.1565980064E+02    1.1337462883E+02    1.1105637557E+02    1.0870875806E+02    1.0633549111E+02    1.0394027807E+02    1.0152680185E+02    9.9098716203E+01    9.6659637136E+01    9.4213134599E+01    9.1762724402E+01    8.9311860420E+01    8.6863927098E+01    8.4422232268E+01    8.1990000319E+01    7.9570365713E+01    7.7166366880E+01    7.4780940504E+01    7.2416916207E+01    7.0077011647E+01    6.7763828043E+01    6.547984 [...]
+    1.1907726244E+02    1.1696351670E+02    1.1480665529E+02    1.1261026582E+02    1.1037796110E+02    1.0811337004E+02    1.0582012854E+02    1.0350187053E+02    1.0116221905E+02    9.8804777568E+01    9.6433121360E+01    9.4050789189E+01    9.1661275139E+01    8.9268020716E+01    8.6874407221E+01    8.4483748403E+01    8.2099283433E+01    7.9724170198E+01    7.7361478951E+01    7.5014186312E+01    7.2685169662E+01    7.0377201910E+01    6.8092946674E+01    6.5834953870E+01    6.360565 [...]
+    1.1602311097E+02    1.1395782016E+02    1.1185040236E+02    1.0970436478E+02    1.0752323965E+02    1.0531057522E+02    1.0306992696E+02    1.0080484879E+02    9.8518884354E+01    9.6215558561E+01    9.3898369176E+01    9.1570778661E+01    8.9236206210E+01    8.6898020029E+01    8.4559529868E+01    8.2223979837E+01    7.9894541529E+01    7.7574307446E+01    7.5266284780E+01    7.2973389531E+01    7.0698440998E+01    6.8444156649E+01    6.6213147373E+01    6.4007913146E+01    6.183083 [...]
+    1.1310383094E+02    1.1108564393E+02    1.0902627524E+02    1.0692915249E+02    1.0479772801E+02    1.0263547021E+02    1.0044585490E+02    9.8232356731E+01    9.5998440763E+01    9.3747554120E+01    9.1483117834E+01    8.9208518860E+01    8.6927102306E+01    8.4642163878E+01    8.2356942591E+01    8.0074613743E+01    7.7798282181E+01    7.5530975878E+01    7.3275639830E+01    7.1035130303E+01    6.8812209428E+01    6.6609540160E+01    6.4429681626E+01    6.2275084848E+01    6.014808 [...]
+    1.1030708617E+02    1.0833480372E+02    1.0632224787E+02    1.0427276734E+02    1.0218973539E+02    1.0007654130E+02    9.7936581956E+01    9.5773253503E+01    9.3589943112E+01    9.1390020852E+01    8.9176831727E+01    8.6953687886E+01    8.4723861033E+01    8.2490575062E+01    8.0256998926E+01    7.8026239778E+01    7.5801336386E+01    7.3585252852E+01    7.1380872644E+01    6.9190992957E+01    6.7018319419E+01    6.4865461156E+01    6.2734926214E+01    6.0629117367E+01    5.855032 [...]
+    1.0762172580E+02    1.0569426902E+02    1.0372741549E+02    1.0172443589E+02    9.9688625164E+01    9.7623294238E+01    9.5531761841E+01    9.3417346356E+01    9.1283357790E+01    8.9133089859E+01    8.6969812221E+01    8.4796762879E+01    8.2617140779E+01    8.0434098615E+01    7.8250735879E+01    7.6070092155E+01    7.3895140690E+01    7.1728782258E+01    6.9573839320E+01    6.7433050510E+01    6.5309065456E+01    6.3204439938E+01    6.1121631408E+01    5.9062994871E+01    5.703077 [...]
+    1.0503775617E+02    1.0315413877E+02    1.0123197432E+02    9.9274456330E+01    9.7284802274E+01    9.5266245582E+01    9.3222027633E+01    9.1155389838E+01    8.9069565805E+01    8.6967773634E+01    8.4853208341E+01    8.2729034456E+01    8.0598378804E+01    7.8464323489E+01    7.6329899111E+01    7.4198078227E+01    7.2071769070E+01    6.9953809558E+01    6.7846961590E+01    6.5753905656E+01    6.3677235769E+01    6.1619454730E+01    5.9582969737E+01    5.7570088350E+01    5.558301 [...]
+    1.0254629518E+02    1.0070559959E+02    9.8827183580E+01    9.6914164427E+01    9.4969683120E+01    9.2996896508E+01    9.0998969528E+01    8.8979067484E+01    8.6940348425E+01    8.4885955630E+01    8.2819010237E+01    8.0742604023E+01    7.8659792367E+01    7.6573587420E+01    7.4486951481E+01    7.2402790621E+01    7.0323948564E+01    6.8253200828E+01    6.6193249163E+01    6.4146716286E+01    6.2116140926E+01    6.0103973195E+01    5.8112570293E+01    5.6144192554E+01    5.420099 [...]
+    1.0013951295E+02    9.8340870086E+01    9.6505313500E+01    9.4635885352E+01    9.2735651190E+01    9.0807692324E+01    8.8855098248E+01    8.6880959131E+01    8.4888358392E+01    8.2880365378E+01    8.0860028190E+01    7.8830366646E+01    7.6794365429E+01    7.4754967425E+01    7.2715067275E+01    7.0677505155E+01    6.8645060807E+01    6.6620447827E+01    6.4606308241E+01    6.2605207360E+01    6.0619628944E+01    5.8651970682E+01    5.6704539989E+01    5.4779550141E+01    5.287911 [...]
+    9.7810562039E+01    9.6053134567E+01    9.4259582678E+01    9.2432874618E+01    9.0576001680E+01    8.8691970782E+01    8.6783797099E+01    8.4854496742E+01    8.2907079535E+01    8.0944541890E+01    7.8969859808E+01    7.6985982040E+01    7.4995823406E+01    7.3002258305E+01    7.1008114434E+01    6.9016166728E+01    6.7029131539E+01    6.5049661071E+01    6.3080338087E+01    6.1123670894E+01    5.9182088620E+01    5.7257936803E+01    5.5353473288E+01    5.3470864444E+01    5.161218 [...]
+    9.5553500554E+01    9.3836469402E+01    9.2084087704E+01    9.0299251111E+01    8.8484877959E+01    8.6643902049E+01    8.4779265467E+01    8.2893911468E+01    8.0990777431E+01    7.9072787933E+01    7.7142847934E+01    7.5203836108E+01    7.3258598349E+01    7.1309941442E+01    6.9360626949E+01    6.7413365303E+01    6.5470810138E+01    6.3535552869E+01    6.1610117524E+01    5.9696955862E+01    5.7798442767E+01    5.5916871940E+01    5.4054451898E+01    5.2213302278E+01    5.039545 [...]
+    9.3363210733E+01    9.1685764612E+01    8.9973727824E+01    8.8229924864E+01    8.6457202528E+01    8.4658422883E+01    8.2836456281E+01    8.0994174428E+01    7.9134443533E+01    7.7260117553E+01    7.5374031568E+01    7.3478995288E+01    7.1577786721E+01    6.9673146017E+01    6.7767769515E+01    6.5864303983E+01    6.3965341105E+01    6.2073412192E+01    6.0190983153E+01    5.8320449731E+01    5.6464133022E+01    5.4624275265E+01    5.2803035947E+01    5.1002488195E+01    4.922461 [...]
+    9.1235315608E+01    8.9596643197E+01    8.7924127020E+01    8.6220521960E+01    8.4488604792E+01    8.2731167345E+01    8.0951009700E+01    7.9150933438E+01    7.7333734972E+01    7.5502198975E+01    7.3659091923E+01    7.1807155774E+01    6.9949101807E+01    6.8087604626E+01    6.6225296358E+01    6.4364761055E+01    6.2508529313E+01    6.0659073126E+01    5.8818800989E+01    5.6990053257E+01    5.5175097771E+01    5.3376125768E+01    5.1595248073E+01    4.9834491588E+01    4.809579 [...]
+    8.9166095761E+01    8.7565380267E+01    8.5931555573E+01    8.4267308586E+01    8.2575347679E+01    8.0858396036E+01    7.9119185028E+01    7.7360447636E+01    7.5584911962E+01    7.3795294826E+01    7.1994295481E+01    7.0184589459E+01    6.8368822569E+01    6.6549605060E+01    6.4729505975E+01    6.2911047689E+01    6.1096700684E+01    5.9288878524E+01    5.7489933097E+01    5.5702150084E+01    5.3927744709E+01    5.2168857747E+01    5.0427551817E+01    4.8705807963E+01    4.700552 [...]
+    8.7152407945E+01    8.5588823709E+01    8.3992852847E+01    8.2367116001E+01    8.0714254845E+01    7.9036925595E+01    7.7337792558E+01    7.5619521734E+01    7.3884774487E+01    7.2136201313E+01    7.0376435719E+01    6.8608088232E+01    6.6833740551E+01    6.5055939863E+01    6.3277193345E+01    6.1499962850E+01    5.9726659809E+01    5.7959640351E+01    5.6201200656E+01    5.4453572552E+01    5.2718919372E+01    5.0999332069E+01    4.9296825604E+01    4.7613335615E+01    4.595071 [...]
+    8.5191606999E+01    8.3664317846E+01    8.2105352740E+01    8.0517267843E+01    7.8902639891E+01    7.7264059882E+01    7.5604126784E+01    7.3925441302E+01    7.2230599718E+01    7.0522187814E+01    6.8802774914E+01    6.7074908046E+01    6.5341106244E+01    6.3603855020E+01    6.1865601001E+01    6.0128746757E+01    5.8395645836E+01    5.6668598013E+01    5.4949844761E+01    5.3241564970E+01    5.1545870908E+01    4.9864804438E+01    4.8200333504E+01    4.6554348885E+01    4.492866 [...]
+    8.3281472170E+01    8.1789631187E+01    8.0266812935E+01    7.8715510919E+01    7.7138238759E+01    7.5537524034E+01    7.3915902153E+01    7.2275910279E+01    7.0620081328E+01    6.8950938048E+01    6.7270987211E+01    6.5582713924E+01    6.3888576087E+01    6.2190998995E+01    6.0492370122E+01    5.8795034082E+01    5.7101287791E+01    5.5413375842E+01    5.3733486094E+01    5.2063745502E+01    5.0406216184E+01    4.8762891744E+01    4.7135693839E+01    4.5526469030E+01    4.393698 [...]
+    8.1420138676E+01    7.9962889147E+01    7.8475348813E+01    7.6959950380E+01    7.5419146203E+01    7.3855402283E+01    7.2271192292E+01    7.0668991649E+01    6.9051271668E+01    6.7420493794E+01    6.5779103934E+01    6.4129526919E+01    6.2474161096E+01    6.0815373076E+01    5.9155492645E+01    5.7496807861E+01    5.5841560335E+01    5.4191940727E+01    5.2550084453E+01    5.0918067624E+01    4.9297903211E+01    4.7691537466E+01    4.6100846588E+01    4.4527633648E+01    4.297362 [...]
+    7.9606035083E+01    7.8182512312E+01    7.6729372655E+01    7.5248989895E+01    7.3743756994E+01    7.2216080235E+01    7.0668373401E+01    6.9103051993E+01    6.7522527527E+01    6.5929201908E+01    6.4325461907E+01    6.2713673764E+01    6.1096177911E+01    5.9475283855E+01    5.7853265218E+01    5.6232354959E+01    5.4614740774E+01    5.3002560710E+01    5.1397898983E+01    4.9802782017E+01    4.8219174716E+01    4.6648976976E+01    4.5094020437E+01    4.3556065494E+01    4.203679 [...]
+    7.7837826840E+01    7.6447160626E+01    7.5027538525E+01    7.3581277270E+01    7.2110712304E+01    7.0618192066E+01    6.9106072304E+01    6.7576710446E+01    6.6032460023E+01    6.4475665191E+01    6.2908655344E+01    6.1333739840E+01    5.9753202870E+01    5.8169298456E+01    5.6584245620E+01    5.5000223728E+01    5.3419368001E+01    5.1843765248E+01    5.0275449781E+01    4.8716399564E+01    4.7168532578E+01    4.5633703422E+01    4.4113700157E+01    4.2610241388E+01    4.112497 [...]
+    7.6114366129E+01    7.4755683684E+01    7.3368693030E+01    7.1955655712E+01    7.0518851522E+01    6.9060572915E+01    6.7583119462E+01    6.6088792354E+01    6.4579888963E+01    6.3058697493E+01    6.1527491724E+01    5.9988525868E+01    5.8444029559E+01    5.6896202979E+01    5.5347212148E+01    5.3799184372E+01    5.2254203880E+01    5.0714307652E+01    4.9181481445E+01    4.7657656037E+01    4.6144703683E+01    4.4644434809E+01    4.3158594931E+01    4.1688861819E+01    4.023684 [...]
+    7.4434647998E+01    7.3107077121E+01    7.1751831998E+01    7.0371120827E+01    6.8967169588E+01    6.7542216597E+01    6.6098507089E+01    6.4638287844E+01    6.3163801888E+01    6.1677283264E+01    6.0180951899E+01    5.8677008595E+01    5.7167630125E+01    5.5654964487E+01    5.4141126304E+01    5.2628192382E+01    5.1118197458E+01    4.9613130129E+01    4.8114928975E+01    4.6625478899E+01    4.5146607673E+01    4.3680082714E+01    4.2227608085E+01    4.0790821732E+01    3.937129 [...]
+    7.2797772616E+01    7.1500444966E+01    7.0176062957E+01    6.8826783238E+01    6.7454779790E+01    6.6062238603E+01    6.4651352382E+01    6.3224315305E+01    6.1783317840E+01    6.0330541639E+01    5.8868154532E+01    5.7398305628E+01    5.5923120532E+01    5.4444696710E+01    5.2965098997E+01    5.1486355266E+01    5.0010452275E+01    4.8539331696E+01    4.7074886332E+01    4.5618956549E+01    4.4173326909E+01    4.2739723022E+01    4.1319808625E+01    3.9915182895E+01    3.852737 [...]
+    7.1202913383E+01    6.9934967729E+01    6.8640573204E+01    6.7321836669E+01    6.5980881871E+01    6.4619844247E+01    6.3240865746E+01    6.1846089710E+01    6.0437655807E+01    5.9017695045E+01    5.7588324879E+01    5.6151644426E+01    5.4709729796E+01    5.3264629560E+01    5.1818360369E+01    5.0372902721E+01    4.8930196908E+01    4.7492139140E+01    4.6060577853E+01    4.4637310229E+01    4.3224078905E+01    4.1822568912E+01    4.0434404823E+01    3.9061148127E+01    3.770429 [...]
+    6.9649290523E+01    6.8409875854E+01    6.7144603145E+01    6.5855531172E+01    6.4544735168E+01    6.3214301739E+01    6.1866323806E+01    6.0502895598E+01    5.9126107699E+01    5.7738042180E+01    5.6340767811E+01    5.4936335385E+01    5.3526773161E+01    5.2114082432E+01    5.0700233243E+01    4.9287160262E+01    4.7876758818E+01    4.6470881114E+01    4.5071332627E+01    4.3679868707E+01    4.2298191367E+01    4.0927946295E+01    3.9570720073E+01    3.8228037616E+01    3.690135 [...]
+    6.8136149745E+01    6.6924428167E+01    6.5687424530E+01    6.4427151171E+01    6.3145636470E+01    6.1844919870E+01    6.0527046938E+01    5.9194064461E+01    5.7848015612E+01    5.6490935180E+01    5.5124844896E+01    5.3751748862E+01    5.2373629091E+01    5.0992441178E+01    4.9610110118E+01    4.8228526265E+01    4.6849541465E+01    4.5474965355E+01    4.4106561848E+01    4.2746045806E+01    4.1395079915E+01    4.0055271759E+01    3.8728171111E+01    3.7415267434E+01    3.611798 [...]
+    6.6662745491E+01    6.5477894854E+01    6.4268323162E+01    6.3035997905E+01    6.1782902205E+01    6.0511029954E+01    5.9222380976E+01    5.7918956237E+01    5.6602753106E+01    5.5275760702E+01    5.3939955313E+01    5.2597295931E+01    5.1249719885E+01    4.9899138616E+01    4.8547433581E+01    4.7196452306E+01    4.5848004605E+01    4.4503858964E+01    4.3165739104E+01    4.1835320731E+01    4.0514228483E+01    3.9204033074E+01    3.7906248646E+01    3.6622330333E+01    3.535367 [...]
+    6.5228328299E+01    6.4069544497E+01    6.2886585627E+01    6.1681375846E+01    6.0455854555E+01    5.9211971640E+01    5.7951682735E+01    5.6676944536E+01    5.5389710169E+01    5.4091924628E+01    5.2785520303E+01    5.1472412600E+01    5.0154495682E+01    4.8833638329E+01    4.7511679931E+01    4.6190426629E+01    4.4871647622E+01    4.3557071624E+01    4.2248383506E+01    4.0947221127E+01    3.9655172336E+01    3.8373772194E+01    3.7104500379E+01    3.5848778813E+01    3.460796 [...]
+    6.3832135760E+01    6.2698634706E+01    6.1541489573E+01    6.0362582640E+01    5.9163811056E+01    5.7947082178E+01    5.6714308940E+01    5.5467405260E+01    5.4208281511E+01    5.2938840051E+01    5.1660970853E+01    5.0376547213E+01    4.9087421587E+01    4.7795421532E+01    4.6502345795E+01    4.5209960533E+01    4.3919995698E+01    4.2634141574E+01    4.1354045496E+01    4.0081308741E+01    3.8817483608E+01    3.7564070695E+01    3.6322516365E+01    3.5094210427E+01    3.388048 [...]
+    6.2473386595E+01    6.1364405834E+01    6.0232297080E+01    5.9078902122E+01    5.7906077258E+01    5.6715688729E+01    5.5509608188E+01    5.4289708203E+01    5.3057857819E+01    5.1815918188E+01    5.0565738284E+01    4.9309150708E+01    4.8047967606E+01    4.6783976704E+01    4.5518937473E+01    4.4254577434E+01    4.2992588615E+01    4.1734624170E+01    4.0482295162E+01    3.9237167525E+01    3.8000759207E+01    3.6774537504E+01    3.5559916588E+01    3.4358255233E+01    3.317085 [...]
+    6.1151277362E+01    6.0066077340E+01    5.8958250671E+01    5.7829599971E+01    5.6681942021E+01    5.5517103293E+01    5.4336915515E+01    5.3143211261E+01    5.1937819615E+01    5.0722561881E+01    4.9499247394E+01    4.8269669411E+01    4.7035601111E+01    4.5798791717E+01    4.4560962737E+01    4.3323804350E+01    4.2088971937E+01    4.0858082769E+01    3.9632712860E+01    3.8414393994E+01    3.7204610928E+01    3.6004798786E+01    3.4816340636E+01    3.3640565269E+01    3.247874 [...]
+    5.9864981349E+01    5.8802846347E+01    5.7718571521E+01    5.6613921570E+01    5.5490675025E+01    5.4350619869E+01    5.3195549192E+01    5.2027256874E+01    5.0847533329E+01    4.9658161315E+01    4.8460911822E+01    4.7257540051E+01    4.6049781498E+01    4.4839348150E+01    4.3627924809E+01    4.2417165552E+01    4.1208690333E+01    4.0004081739E+01    3.8804881909E+01    3.7612589626E+01    3.6428657576E+01    3.5254489794E+01    3.4091439303E+01    3.2940805930E+01    3.180383 [...]
+    5.8613649223E+01    5.7573887972E+01    5.6512459470E+01    5.5431091689E+01    5.4331526115E+01    5.3215513458E+01    5.2084809394E+01    5.0941170337E+01    4.9786349269E+01    4.8622091634E+01    4.7450131310E+01    4.6272186670E+01    4.5089956745E+01    4.3905117499E+01    4.2719318226E+01    4.1534178085E+01    4.0351282768E+01    3.9172181323E+01    3.7998383142E+01    3.6831355105E+01    3.5672518900E+01    3.4523248524E+01    3.3384867964E+01    3.2258649067E+01    3.114580 [...]
+    5.7396411068E+01    5.6378357069E+01    5.5339094460E+01    5.4280315615E+01    5.3203726117E+01    5.2111040559E+01    5.1003978363E+01    4.9884259647E+01    4.8753601131E+01    4.7613712117E+01    4.6466290544E+01    4.5313019122E+01    4.4155561579E+01    4.2995559007E+01    4.1834626334E+01    4.0674348926E+01    3.9516279324E+01    3.8361934136E+01    3.7212791075E+01    3.6070286171E+01    3.4935811143E+01    3.3810710949E+01    3.2696281514E+01    3.1593767648E+01    3.050436 [...]
+    5.6212379443E+01    5.5215391022E+01    5.4197639057E+01    5.3160781394E+01    5.2106488798E+01    5.1036440836E+01    4.9952321782E+01    4.8855816564E+01    4.7748606753E+01    4.6632366622E+01    4.5508759280E+01    4.4379432885E+01    4.3246016963E+01    4.2110118829E+01    4.0973320127E+01    3.9837173504E+01    3.8703199408E+01    3.7572883044E+01    3.6447671472E+01    3.5328970874E+01    3.4218143978E+01    3.3116507658E+01    3.2025330710E+01    3.0945831811E+01    2.987917 [...]
+    5.5060653171E+01    5.4084113305E+01    5.3087241770E+01    5.2071662901E+01    5.1039013672E+01    4.9990939664E+01    4.8929091048E+01    4.7855118614E+01    4.6770669837E+01    4.5677385019E+01    4.4576893492E+01    4.3470809913E+01    4.2360730653E+01    4.1248230287E+01    4.0134858208E+01    3.9022135356E+01    3.7911551094E+01    3.6804560211E+01    3.5702580088E+01    3.4606988011E+01    3.3519118648E+01    3.2440261702E+01    3.1371659727E+01    3.0314506122E+01    2.926994 [...]
+    5.3940321595E+01    5.2983637525E+01    5.2007040881E+01    5.1012123450E+01    5.0000489393E+01    4.8973751289E+01    4.7933526199E+01    4.6881431770E+01    4.5819082385E+01    4.4748085372E+01    4.3670037290E+01    4.2586520292E+01    4.1499098584E+01    4.0409314989E+01    3.9318687620E+01    3.8228706682E+01    3.7140831402E+01    3.6056487094E+01    3.4977062379E+01    3.3903906553E+01    3.2838327114E+01    3.1781587455E+01    3.0734904729E+01    2.9699447882E+01    2.867633 [...]
+    5.2850469055E+01    5.1913071736E+01    5.0956168583E+01    4.9981319753E+01    4.8990097518E+01    4.7984082392E+01    4.6964859268E+01    4.5934013598E+01    4.4893127621E+01    4.3843776643E+01    4.2787525398E+01    4.1725924481E+01    4.0660506875E+01    3.9592784583E+01    3.8524245367E+01    3.7456349611E+01    3.6390527309E+01    3.5328175192E+01    3.4270653995E+01    3.3219285882E+01    3.2175352020E+01    3.1140090315E+01    3.0114693318E+01    2.9100306300E+01    2.809802 [...]
+    5.1790179424E+01    5.0871522829E+01    4.9933755222E+01    4.8978406000E+01    4.8007016430E+01    4.7021135848E+01    4.6022317875E+01    4.5012116668E+01    4.3992083223E+01    4.2963761729E+01    4.1928685994E+01    4.0888375953E+01    3.9844334259E+01    3.8798042984E+01    3.7750960415E+01    3.6704517984E+01    3.5660117309E+01    3.4619127379E+01    3.3582881877E+01    3.2552676647E+01    3.1529767321E+01    3.0515367094E+01    2.9510644676E+01    2.8516722397E+01    2.753467 [...]
+    5.0758540523E+01    4.9858100840E+01    4.8938933488E+01    4.8002537934E+01    4.7050425281E+01    4.6084114533E+01    4.5105128890E+01    4.4114992073E+01    4.3115224690E+01    4.2107340670E+01    4.1092843755E+01    4.0073224071E+01    3.9049954791E+01    3.8024488894E+01    3.6998256030E+01    3.5972659499E+01    3.4949073359E+01    3.3928839656E+01    3.2913265806E+01    3.1903622105E+01    3.0901139404E+01    2.9907006925E+01    2.8922370254E+01    2.7948329480E+01    2.698593 [...]
+    4.9754648316E+01    4.8871923057E+01    4.7970842432E+01    4.7052876773E+01    4.6119507816E+01    4.5172225043E+01    4.4212522046E+01    4.3241892920E+01    4.2261828709E+01    4.1273813896E+01    4.0279322970E+01    3.9279817062E+01    3.8276740671E+01    3.7271518483E+01    3.6265552302E+01    3.5260218080E+01    3.4256863083E+01    3.3256803179E+01    3.2261320257E+01    3.1271659800E+01    3.0289028589E+01    2.9314592576E+01    2.8349474898E+01    2.7394754065E+01    2.645146 [...]
+    4.8777610779E+01    4.7912117829E+01    4.7028631215E+01    4.6128592886E+01    4.5213455979E+01    4.4284681223E+01    4.3343733378E+01    4.2392077694E+01    4.1431176425E+01    4.0462485391E+01    3.9487450604E+01    3.8507504972E+01    3.7524065088E+01    3.6538528110E+01    3.5552268744E+01    3.4566636340E+01    3.3582952108E+01    3.2602506452E+01    3.1626556450E+01    3.0656323458E+01    2.9692990871E+01    2.8737702026E+01    2.7791558261E+01    2.6855617130E+01    2.593089 [...]
+    4.7826551375E+01    4.6977828013E+01    4.6111462508E+01    4.5228869155E+01    4.4331473222E+01    4.3420707424E+01    4.2498008430E+01    4.1564813389E+01    4.0622556513E+01    3.9672665698E+01    3.8716559224E+01    3.7755642514E+01    3.6791304986E+01    3.5824916994E+01    3.4857826867E+01    3.3891358061E+01    3.2926806424E+01    3.1965437587E+01    3.1008484484E+01    3.0057145006E+01    2.9112579804E+01    2.8175910228E+01    2.7248216426E+01    2.6330535589E+01    2.542386 [...]
diff --git a/Tests/ReferenceData/IsGISAXS/ex-2/isgi_bimodal.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-2/isgi_bimodal.ima.gz
new file mode 100644
index 0000000..27486aa
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-2/isgi_bimodal.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-2/isgi_bimodal.inp b/Tests/ReferenceData/IsGISAXS/ex-2/isgi_bimodal.inp
new file mode 100755
index 0000000..87da415
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-2/isgi_bimodal.inp
@@ -0,0 +1,82 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_bimodal
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA          LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)
+                             0.      2      0    2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+2
+# Particle type,     Probability
+cylinder                0.95
+cylinder                0.05
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73                 1.		          1.    0.8    0.8
+	                       54.73                 1.		          1.    0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,   dW
+                           0    0     0
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm), Rmax(nm), nR, xR
+                           5         gaussian            0.2       0.1        11      150   6
+                          10         gaussian            0.02       0.1        11      150  6
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,  Hmax/R,   nH, xH,   rho_H
+                           1           none            0.1          0.1        11      25   2    0
+                           1           none            0.1          0.1        11      25   2    0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,    Wmax/R,   nW, xW,   rho_W
+                            2          none              0.4        1         300      15   2     0
+                            2          none              0.4        1         300      15   2     0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               15                     5      gau	      0.5           5            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1. 
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA.ima.gz
new file mode 100644
index 0000000..f9f0ab2
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA.inp b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA.inp
new file mode 100755
index 0000000..ad8022c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_cylinder_BA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         LMA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_qxqy.inp b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_qxqy.inp
new file mode 100755
index 0000000..b953f4b
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_qxqy.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_cylinder_BA_qxqy
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA           LMA               0             25              ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  F
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,   dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_size.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_size.ima.gz
new file mode 100644
index 0000000..01eae15
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_size.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_size.inp b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_size.inp
new file mode 100755
index 0000000..3a4243d
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_BA_size.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_cylinder_BA_size
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+     BA        LMA               0            25                ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           gaussian         0.2       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none             0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_w
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1. 
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_DWBA.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_DWBA.ima.gz
new file mode 100644
index 0000000..7f25aa7
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_DWBA.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_DWBA.inp b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_DWBA.inp
new file mode 100755
index 0000000..6107ade
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-3/isgi_cylinder_DWBA.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_cylinder_DWBA
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA               0             25             ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0  2             100    100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-4/1DDL.inp b/Tests/ReferenceData/IsGISAXS/ex-4/1DDL.inp
new file mode 100755
index 0000000..ec1f7b5
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-4/1DDL.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+1DDL
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA              0             25              ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.  2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          1DDL 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            1000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-4/2DDLh.inp b/Tests/ReferenceData/IsGISAXS/ex-4/2DDLh.inp
new file mode 100755
index 0000000..bae2f0b
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-4/2DDLh.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+2DDLh
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA          0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.  2       100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2       0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          2DDLh 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     1     cau	      0.5            0            1000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           none          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-4/isgi_1DDL.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-4/isgi_1DDL.ima.gz
new file mode 100644
index 0000000..5ec6484
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-4/isgi_1DDL.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-4/isgi_2DDLh.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-4/isgi_2DDLh.ima.gz
new file mode 100644
index 0000000..50639d4
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-4/isgi_2DDLh.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-5/README b/Tests/ReferenceData/IsGISAXS/ex-5/README
new file mode 100644
index 0000000..9757b3d
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-5/README
@@ -0,0 +1,19 @@
+IsGISAXS ex-5 example
+LMA fitting: cylinders with size distribution and radial paracrystal inderference function.
+
+Directory content:
+
+isgi_fitexample.inp
+IsGISAXS file with model description. Modified to have 100x100 points 2D output data.
+
+isgi_fitexample.ima.gz
+IsGISAXS simulation output obtained with isgi_fitexample.inp
+
+isgi_fitexample.dat
+IsGISAXS data files with points to fit
+
+isgi_fitexample.fit
+IsGISAXS fit settings
+
+isgi_fitexample.out
+IsGISAXS fit output
diff --git a/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.dat b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.dat
new file mode 100644
index 0000000..32a93e1
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.dat
@@ -0,0 +1,819 @@
+################################################################################################     
+# Parallel cut at alphaf=0.2deg
+# fit-example
+# Weight,   Scale factor,   Shift factor
+  1.        1.   F			0.   F	      
+            0  1e5          0   1e5
+             F  F           F  F
+# DeltaOmega(deg), DeltaOmega(deg)
+	 0.                0 
+# Fitted, Sin(2Thetaf), Sin(Alphaf), Intensity, Error bars
+T	8.74674e-05	0.00349065	23199.7
+T	0.000174935	0.00349065	23180.5
+T	0.000262402	0.00349065	23148.7
+T	0.00034987	0.00349065	23104.3
+T	0.000437337	0.00349065	23047.5
+T	0.000524805	0.00349065	22978.6
+T	0.000612272	0.00349065	22897.6
+T	0.000699739	0.00349065	22804.9
+T	0.000787207	0.00349065	22700.9
+T	0.000874674	0.00349065	22586
+T	0.000962142	0.00349065	22460.5
+T	0.00104961	0.00349065	22324.9
+T	0.00113708	0.00349065	22179.7
+T	0.00122454	0.00349065	22025.5
+T	0.00131201	0.00349065	21862.8
+T	0.00139948	0.00349065	21692.3
+T	0.00148695	0.00349065	21514.7
+T	0.00157441	0.00349065	21330.8
+T	0.00166188	0.00349065	21141.2
+T	0.00174935	0.00349065	20946.7
+T	0.00183682	0.00349065	20748.3
+T	0.00192428	0.00349065	20546.9
+T	0.00201175	0.00349065	20343.4
+T	0.00209922	0.00349065	20138.8
+T	0.00218669	0.00349065	19934.2
+T	0.00227415	0.00349065	19730.7
+T	0.00236162	0.00349065	19529.4
+T	0.00244909	0.00349065	19331.6
+T	0.00253656	0.00349065	19138.7
+T	0.00262402	0.00349065	18951.9
+T	0.00271149	0.00349065	18772.8
+T	0.00279896	0.00349065	18602.8
+T	0.00288643	0.00349065	18443.8
+T	0.00297389	0.00349065	18297.3
+T	0.00306136	0.00349065	18165.3
+T	0.00314883	0.00349065	18049.7
+T	0.00323629	0.00349065	17952.9
+T	0.00332376	0.00349065	17877.1
+T	0.00341123	0.00349065	17824.8
+T	0.0034987	0.00349065	17798.9
+T	0.00358616	0.00349065	17802.4
+T	0.00367363	0.00349065	17838.7
+T	0.0037611	0.00349065	17911.6
+T	0.00384857	0.00349065	18025.1
+T	0.00393603	0.00349065	18183.9
+T	0.0040235	0.00349065	18393.3
+T	0.00411097	0.00349065	18659.1
+T	0.00419844	0.00349065	18987.9
+T	0.0042859	0.00349065	19387.4
+T	0.00437337	0.00349065	19866.3
+T	0.00446084	0.00349065	20434.4
+T	0.00454831	0.00349065	21103.3
+T	0.00463577	0.00349065	21886
+T	0.00472324	0.00349065	22798
+T	0.00481071	0.00349065	23856.8
+T	0.00489818	0.00349065	25082.9
+T	0.00498564	0.00349065	26500
+T	0.00507311	0.00349065	28135
+T	0.00516058	0.00349065	30018.9
+T	0.00524805	0.00349065	32186.4
+T	0.00533551	0.00349065	34675.9
+T	0.00542298	0.00349065	37527.9
+T	0.00551045	0.00349065	40783
+T	0.00559792	0.00349065	44477.4
+T	0.00568538	0.00349065	48634.8
+T	0.00577285	0.00349065	53254.5
+T	0.00586032	0.00349065	58293.5
+T	0.00594779	0.00349065	63642.3
+T	0.00603525	0.00349065	69098.1
+T	0.00612272	0.00349065	74343.8
+T	0.00621019	0.00349065	78947.2
+T	0.00629766	0.00349065	82403
+T	0.00638512	0.00349065	84224.9
+T	0.00647259	0.00349065	84075.3
+T	0.00656006	0.00349065	81877.3
+T	0.00664753	0.00349065	77850.5
+T	0.00673499	0.00349065	72445.7
+T	0.00682246	0.00349065	66214.3
+T	0.00690993	0.00349065	59678.8
+T	0.0069974	0.00349065	53250
+T	0.00708486	0.00349065	47201.7
+T	0.00717233	0.00349065	41684.8
+T	0.0072598	0.00349065	36758.1
+T	0.00734727	0.00349065	32419.8
+T	0.00743473	0.00349065	28633.9
+T	0.0075222	0.00349065	25347.5
+T	0.00760967	0.00349065	22502.3
+T	0.00769714	0.00349065	20041.2
+T	0.0077846	0.00349065	17911.4
+T	0.00787207	0.00349065	16066.1
+T	0.00795954	0.00349065	14464.2
+T	0.00804701	0.00349065	13070.7
+T	0.00813447	0.00349065	11855.4
+T	0.00822194	0.00349065	10792.8
+T	0.00830941	0.00349065	9861.35
+T	0.00839687	0.00349065	9042.77
+T	0.00848434	0.00349065	8321.49
+T	0.00857181	0.00349065	7684.34
+T	0.00865927	0.00349065	7120.09
+T	0.00874674	0.00349065	6619.17
+T	0.00883421	0.00349065	6173.37
+T	0.00892168	0.00349065	5775.65
+T	0.00900914	0.00349065	5419.95
+T	0.00909661	0.00349065	5101.03
+T	0.00918408	0.00349065	4814.36
+T	0.00927154	0.00349065	4556
+T	0.00935901	0.00349065	4322.51
+T	0.00944648	0.00349065	4110.92
+T	0.00953394	0.00349065	3918.6
+T	0.00962141	0.00349065	3743.28
+T	0.00970888	0.00349065	3582.94
+T	0.00979635	0.00349065	3435.84
+T	0.00988381	0.00349065	3300.45
+T	0.00997128	0.00349065	3175.43
+T	0.0100587	0.00349065	3059.61
+T	0.0101462	0.00349065	2951.98
+T	0.0102337	0.00349065	2851.67
+T	0.0103211	0.00349065	2757.92
+T	0.0104086	0.00349065	2670.09
+T	0.0104961	0.00349065	2587.64
+T	0.0105835	0.00349065	2510.13
+T	0.010671	0.00349065	2437.2
+T	0.0107585	0.00349065	2368.53
+T	0.0108459	0.00349065	2303.91
+T	0.0109334	0.00349065	2243.17
+T	0.0110209	0.00349065	2186.17
+T	0.0111084	0.00349065	2132.84
+T	0.0111958	0.00349065	2083.11
+T	0.0112833	0.00349065	2036.95
+T	0.0113708	0.00349065	1994.34
+T	0.0114582	0.00349065	1955.26
+T	0.0115457	0.00349065	1919.71
+T	0.0116332	0.00349065	1887.64
+T	0.0117206	0.00349065	1859.02
+T	0.0118081	0.00349065	1833.76
+T	0.0118956	0.00349065	1811.78
+T	0.011983	0.00349065	1792.95
+T	0.0120705	0.00349065	1777.09
+T	0.012158	0.00349065	1764.03
+T	0.0122454	0.00349065	1753.54
+T	0.0123329	0.00349065	1745.36
+T	0.0124204	0.00349065	1739.23
+T	0.0125078	0.00349065	1734.86
+T	0.0125953	0.00349065	1731.95
+T	0.0126828	0.00349065	1730.2
+T	0.0127702	0.00349065	1729.31
+T	0.0128577	0.00349065	1728.99
+T	0.0129452	0.00349065	1728.96
+T	0.0130326	0.00349065	1728.97
+T	0.0131201	0.00349065	1728.79
+T	0.0132076	0.00349065	1728.2
+T	0.013295	0.00349065	1727.02
+T	0.0133825	0.00349065	1725.11
+T	0.01347	0.00349065	1722.34
+T	0.0135574	0.00349065	1718.61
+T	0.0136449	0.00349065	1713.85
+T	0.0137324	0.00349065	1708.01
+T	0.0138198	0.00349065	1701.07
+T	0.0139073	0.00349065	1693.02
+T	0.0139948	0.00349065	1683.86
+T	0.0140822	0.00349065	1673.62
+T	0.0141697	0.00349065	1662.34
+T	0.0142572	0.00349065	1650.06
+T	0.0143446	0.00349065	1636.83
+T	0.0144321	0.00349065	1622.71
+T	0.0145196	0.00349065	1607.77
+T	0.014607	0.00349065	1592.05
+T	0.0146945	0.00349065	1575.64
+T	0.014782	0.00349065	1558.58
+T	0.0148694	0.00349065	1540.95
+T	0.0149569	0.00349065	1522.81
+T	0.0150444	0.00349065	1504.2
+T	0.0151318	0.00349065	1485.2
+T	0.0152193	0.00349065	1465.84
+T	0.0153068	0.00349065	1446.19
+T	0.0153942	0.00349065	1426.27
+T	0.0154817	0.00349065	1406.15
+T	0.0155692	0.00349065	1385.85
+T	0.0156566	0.00349065	1365.41
+T	0.0157441	0.00349065	1344.87
+T	0.0158316	0.00349065	1324.25
+T	0.015919	0.00349065	1303.59
+T	0.0160065	0.00349065	1282.91
+T	0.016094	0.00349065	1262.23
+T	0.0161814	0.00349065	1241.57
+T	0.0162689	0.00349065	1220.97
+T	0.0163564	0.00349065	1200.42
+T	0.0164438	0.00349065	1179.97
+T	0.0165313	0.00349065	1159.61
+T	0.0166188	0.00349065	1139.37
+T	0.0167063	0.00349065	1119.27
+T	0.0167937	0.00349065	1099.32
+T	0.0168812	0.00349065	1079.53
+T	0.0169687	0.00349065	1059.93
+T	0.0170561	0.00349065	1040.52
+T	0.0171436	0.00349065	1021.32
+T	0.0172311	0.00349065	1002.34
+T	0.0173185	0.00349065	983.608
+T	0.017406	0.00349065	965.125
+T	0.0174935	0.00349065	946.907
+T	0.0175809	0.00349065	928.968
+T	0.0176684	0.00349065	911.317
+T	0.0177559	0.00349065	893.97
+T	0.0178433	0.00349065	876.935
+T	0.0179308	0.00349065	860.221
+T	0.0180183	0.00349065	843.839
+T	0.0181057	0.00349065	827.797
+T	0.0181932	0.00349065	812.102
+T	0.0182807	0.00349065	796.76
+T	0.0183681	0.00349065	781.776
+T	0.0184556	0.00349065	767.154
+T	0.0185431	0.00349065	752.898
+T	0.0186305	0.00349065	739.009
+T	0.018718	0.00349065	725.488
+T	0.0188055	0.00349065	712.335
+T	0.018893	0.00349065	699.547
+T	0.0189804	0.00349065	687.124
+T	0.0190679	0.00349065	675.061
+T	0.0191554	0.00349065	663.355
+T	0.0192428	0.00349065	652
+T	0.0193303	0.00349065	640.99
+T	0.0194178	0.00349065	630.32
+T	0.0195052	0.00349065	619.981
+T	0.0195927	0.00349065	609.967
+T	0.0196802	0.00349065	600.268
+T	0.0197676	0.00349065	590.877
+T	0.0198551	0.00349065	581.783
+T	0.0199426	0.00349065	572.979
+T	0.02003	0.00349065	564.453
+T	0.0201175	0.00349065	556.197
+T	0.020205	0.00349065	548.2
+T	0.0202924	0.00349065	540.453
+T	0.0203799	0.00349065	532.945
+T	0.0204674	0.00349065	525.667
+T	0.0205548	0.00349065	518.609
+T	0.0206423	0.00349065	511.761
+T	0.0207298	0.00349065	505.114
+T	0.0208172	0.00349065	498.658
+T	0.0209047	0.00349065	492.384
+T	0.0209922	0.00349065	486.283
+T	0.0210797	0.00349065	480.346
+T	0.0211671	0.00349065	474.566
+T	0.0212546	0.00349065	468.934
+T	0.0213421	0.00349065	463.441
+T	0.0214295	0.00349065	458.082
+T	0.021517	0.00349065	452.848
+T	0.0216045	0.00349065	447.732
+T	0.0216919	0.00349065	442.729
+T	0.0217794	0.00349065	437.831
+T	0.0218669	0.00349065	433.033
+T	0.0219543	0.00349065	428.329
+T	0.0220418	0.00349065	423.714
+T	0.0221293	0.00349065	419.183
+T	0.0222167	0.00349065	414.731
+T	0.0223042	0.00349065	410.354
+T	0.0223917	0.00349065	406.047
+T	0.0224791	0.00349065	401.807
+T	0.0225666	0.00349065	397.631
+T	0.0226541	0.00349065	393.514
+T	0.0227415	0.00349065	389.454
+T	0.022829	0.00349065	385.447
+T	0.0229165	0.00349065	381.492
+T	0.0230039	0.00349065	377.586
+T	0.0230914	0.00349065	373.727
+T	0.0231789	0.00349065	369.912
+T	0.0232663	0.00349065	366.139
+T	0.0233538	0.00349065	362.409
+T	0.0234413	0.00349065	358.717
+T	0.0235288	0.00349065	355.065
+T	0.0236162	0.00349065	351.449
+T	0.0237037	0.00349065	347.87
+T	0.0237912	0.00349065	344.327
+T	0.0238786	0.00349065	340.817
+T	0.0239661	0.00349065	337.342
+T	0.0240536	0.00349065	333.9
+T	0.024141	0.00349065	330.492
+T	0.0242285	0.00349065	327.115
+T	0.024316	0.00349065	323.771
+T	0.0244034	0.00349065	320.459
+T	0.0244909	0.00349065	317.179
+T	0.0245784	0.00349065	313.931
+T	0.0246658	0.00349065	310.714
+T	0.0247533	0.00349065	307.528
+T	0.0248408	0.00349065	304.374
+T	0.0249282	0.00349065	301.251
+T	0.0250157	0.00349065	298.16
+T	0.0251032	0.00349065	295.101
+T	0.0251906	0.00349065	292.073
+T	0.0252781	0.00349065	289.077
+T	0.0253656	0.00349065	286.112
+T	0.025453	0.00349065	283.179
+T	0.0255405	0.00349065	280.278
+T	0.025628	0.00349065	277.409
+T	0.0257155	0.00349065	274.572
+T	0.0258029	0.00349065	271.767
+T	0.0258904	0.00349065	268.994
+T	0.0259779	0.00349065	266.253
+T	0.0260653	0.00349065	263.544
+T	0.0261528	0.00349065	260.866
+T	0.0262403	0.00349065	258.221
+T	0.0263277	0.00349065	255.608
+T	0.0264152	0.00349065	253.026
+T	0.0265027	0.00349065	250.476
+T	0.0265901	0.00349065	247.958
+T	0.0266776	0.00349065	245.471
+T	0.0267651	0.00349065	243.015
+T	0.0268525	0.00349065	240.591
+T	0.02694	0.00349065	238.197
+T	0.0270275	0.00349065	235.834
+T	0.0271149	0.00349065	233.502
+T	0.0272024	0.00349065	231.2
+T	0.0272899	0.00349065	228.927
+T	0.0273773	0.00349065	226.685
+T	0.0274648	0.00349065	224.472
+T	0.0275523	0.00349065	222.288
+T	0.0276397	0.00349065	220.133
+T	0.0277272	0.00349065	218.006
+T	0.0278147	0.00349065	215.907
+T	0.0279022	0.00349065	213.837
+T	0.0279896	0.00349065	211.793
+T	0.0280771	0.00349065	209.777
+T	0.0281646	0.00349065	207.787
+T	0.028252	0.00349065	205.824
+T	0.0283395	0.00349065	203.887
+T	0.028427	0.00349065	201.975
+T	0.0285144	0.00349065	200.089
+T	0.0286019	0.00349065	198.227
+T	0.0286894	0.00349065	196.389
+T	0.0287768	0.00349065	194.576
+T	0.0288643	0.00349065	192.786
+T	0.0289518	0.00349065	191.02
+T	0.0290392	0.00349065	189.276
+T	0.0291267	0.00349065	187.555
+T	0.0292142	0.00349065	185.856
+T	0.0293016	0.00349065	184.179
+T	0.0293891	0.00349065	182.522
+T	0.0294766	0.00349065	180.887
+T	0.029564	0.00349065	179.273
+T	0.0296515	0.00349065	177.678
+T	0.029739	0.00349065	176.104
+T	0.0298264	0.00349065	174.549
+T	0.0299139	0.00349065	173.013
+T	0.0300014	0.00349065	171.496
+T	0.0300888	0.00349065	169.998
+T	0.0301763	0.00349065	168.517
+T	0.0302638	0.00349065	167.055
+T	0.0303513	0.00349065	165.61
+T	0.0304387	0.00349065	164.182
+T	0.0305262	0.00349065	162.771
+T	0.0306137	0.00349065	161.377
+T	0.0307011	0.00349065	159.999
+T	0.0307886	0.00349065	158.637
+T	0.0308761	0.00349065	157.291
+T	0.0309635	0.00349065	155.961
+T	0.031051	0.00349065	154.646
+T	0.0311385	0.00349065	153.345
+T	0.0312259	0.00349065	152.06
+T	0.0313134	0.00349065	150.789
+T	0.0314009	0.00349065	149.532
+T	0.0314883	0.00349065	148.29
+T	0.0315758	0.00349065	147.061
+T	0.0316633	0.00349065	145.846
+T	0.0317507	0.00349065	144.644
+T	0.0318382	0.00349065	143.456
+T	0.0319257	0.00349065	142.28
+T	0.0320131	0.00349065	141.117
+T	0.0321006	0.00349065	139.967
+T	0.0321881	0.00349065	138.83
+T	0.0322755	0.00349065	137.704
+T	0.032363	0.00349065	136.591
+T	0.0324505	0.00349065	135.49
+T	0.0325379	0.00349065	134.4
+T	0.0326254	0.00349065	133.322
+T	0.0327129	0.00349065	132.255
+T	0.0328003	0.00349065	131.2
+T	0.0328878	0.00349065	130.156
+T	0.0329753	0.00349065	129.122
+T	0.0330627	0.00349065	128.1
+T	0.0331502	0.00349065	127.088
+T	0.0332377	0.00349065	126.087
+T	0.0333251	0.00349065	125.096
+T	0.0334126	0.00349065	124.115
+T	0.0335001	0.00349065	123.144
+T	0.0335875	0.00349065	122.184
+T	0.033675	0.00349065	121.233
+T	0.0337625	0.00349065	120.292
+T	0.0338499	0.00349065	119.361
+T	0.0339374	0.00349065	118.439
+T	0.0340248	0.00349065	117.527
+T	0.0341123	0.00349065	116.623
+T	0.0341998	0.00349065	115.729
+T	0.0342872	0.00349065	114.844
+T	0.0343747	0.00349065	113.968
+T	0.0344622	0.00349065	113.101
+T	0.0345496	0.00349065	112.243
+T	0.0346371	0.00349065	111.393
+T	0.0347246	0.00349065	110.551
+T	0.034812	0.00349065	109.718
+T	0.0348995	0.00349065	108.893
+################################################################################################
+# Perpendicular cut at 2thetaf=0.368deg
+# fit-example
+# Weight,   Scale factor,   Shift factor
+  1.        1.   F			0.   F	      
+            0  1e5          0   1e5
+             F  F           F  F
+# DeltaOmega(deg), DeltaOmega(deg)
+	 0.                0 
+# Fitted, Sin(2Thetaf), Sin(Alphaf), Intensity, Error bars
+T	0.00642277	8.74674e-05	201.859
+T	0.00642277	0.000174935	805.406
+T	0.00642277	0.000262402	1810.9
+T	0.00642277	0.00034987	3211.92
+T	0.00642277	0.000437337	4998.82
+T	0.00642277	0.000524805	7158.23
+T	0.00642277	0.000612272	9706.18
+T	0.00642277	0.000699739	12608.5
+T	0.00642277	0.000787207	15844.6
+T	0.00642277	0.000874674	19390.6
+T	0.00642277	0.000962142	23297.4
+T	0.00642277	0.00104961	27483.9
+T	0.00642277	0.00113708	31919.8
+T	0.00642277	0.00122454	36571.8
+T	0.00642277	0.00131201	41539.5
+T	0.00642277	0.00139948	46681.1
+T	0.00642277	0.00148695	51957.6
+T	0.00642277	0.00157441	57328.8
+T	0.00642277	0.00166188	62948
+T	0.00642277	0.00174935	68396.7
+T	0.00642277	0.00183682	74257.3
+T	0.00642277	0.00192428	79856.3
+T	0.00642277	0.00201175	85357.4
+T	0.00642277	0.00209922	90969.8
+T	0.00642277	0.00218669	96409.1
+T	0.00642277	0.00227415	101893
+T	0.00642277	0.00236162	106840
+T	0.00642277	0.00244909	111733
+T	0.00642277	0.00253656	116247
+T	0.00642277	0.00262402	120328
+T	0.00642277	0.00271149	124153
+T	0.00642277	0.00279896	127384
+T	0.00642277	0.00288643	129939
+T	0.00642277	0.00297389	131725
+T	0.00642277	0.00306136	132699
+T	0.00642277	0.00314883	132502
+T	0.00642277	0.00323629	130889
+T	0.00642277	0.00332376	126781
+T	0.00642277	0.00341123	118794
+T	0.00642277	0.0034987	81074.7
+T	0.00642277	0.00358616	64918.4
+T	0.00642277	0.00367363	57378.1
+T	0.00642277	0.0037611	52126.4
+T	0.00642277	0.00384857	48403.2
+T	0.00642277	0.00393603	45566.2
+T	0.00642277	0.0040235	43302.6
+T	0.00642277	0.00411097	41436.3
+T	0.00642277	0.00419844	39748.2
+T	0.00642277	0.0042859	38313.3
+T	0.00642277	0.00437337	37070.6
+T	0.00642277	0.00446084	35912.7
+T	0.00642277	0.00454831	34892.8
+T	0.00642277	0.00463577	33982.6
+T	0.00642277	0.00472324	33161
+T	0.00642277	0.00481071	32411.8
+T	0.00642277	0.00489818	31693.2
+T	0.00642277	0.00498564	31032.8
+T	0.00642277	0.00507311	30420.7
+T	0.00642277	0.00516058	29831.4
+T	0.00642277	0.00524805	29296.7
+T	0.00642277	0.00533551	28778.1
+T	0.00642277	0.00542298	28278.1
+T	0.00642277	0.00551045	27814.3
+T	0.00642277	0.00559792	27364.6
+T	0.00642277	0.00568538	26935.4
+T	0.00642277	0.00577285	26523.7
+T	0.00642277	0.00586032	26126.9
+T	0.00642277	0.00594779	25742
+T	0.00642277	0.00603525	25369.9
+T	0.00642277	0.00612272	25008.8
+T	0.00642277	0.00621019	24658.9
+T	0.00642277	0.00629766	24316
+T	0.00642277	0.00638512	23983
+T	0.00642277	0.00647259	23657
+T	0.00642277	0.00656006	23341.1
+T	0.00642277	0.00664753	23031.2
+T	0.00642277	0.00673499	22721.4
+T	0.00642277	0.00682246	22425.7
+T	0.00642277	0.00690993	22128.8
+T	0.00642277	0.0069974	21840.9
+T	0.00642277	0.00708486	21556
+T	0.00642277	0.00717233	21273.8
+T	0.00642277	0.0072598	20993.7
+T	0.00642277	0.00734727	20722.1
+T	0.00642277	0.00743473	20452.2
+T	0.00642277	0.0075222	20183.8
+T	0.00642277	0.00760967	19916.7
+T	0.00642277	0.00769714	19657.4
+T	0.00642277	0.0077846	19399.1
+T	0.00642277	0.00787207	19141.5
+T	0.00642277	0.00795954	18884.5
+T	0.00642277	0.00804701	18634.9
+T	0.00642277	0.00813447	18385.7
+T	0.00642277	0.00822194	18136.8
+T	0.00642277	0.00830941	17894.9
+T	0.00642277	0.00839687	17646.3
+T	0.00642277	0.00848434	17404.6
+T	0.00642277	0.00857181	17163
+T	0.00642277	0.00865927	16927.9
+T	0.00642277	0.00874674	16686.2
+T	0.00642277	0.00883421	16450.9
+T	0.00642277	0.00892168	16215.5
+T	0.00642277	0.00900914	15980.1
+T	0.00642277	0.00909661	15750.7
+T	0.00642277	0.00918408	15521.1
+T	0.00642277	0.00927154	15291.5
+T	0.00642277	0.00935901	15061.7
+T	0.00642277	0.00944648	14837.7
+T	0.00642277	0.00953394	14613.5
+T	0.00642277	0.00962141	14389.2
+T	0.00642277	0.00970888	14164.9
+T	0.00642277	0.00979635	13945.9
+T	0.00642277	0.00988381	13726.9
+T	0.00642277	0.00997128	13507.9
+T	0.00642277	0.0100587	13289
+T	0.00642277	0.0101462	13075
+T	0.00642277	0.0102337	12856.5
+T	0.00642277	0.0103211	12647.4
+T	0.00642277	0.0104086	12434
+T	0.00642277	0.0104961	12220.9
+T	0.00642277	0.0105835	12012.4
+T	0.00642277	0.010671	11804.2
+T	0.00642277	0.0107585	11600.4
+T	0.00642277	0.0108459	11393.1
+T	0.00642277	0.0109334	11190.1
+T	0.00642277	0.0110209	10987.6
+T	0.00642277	0.0111084	10785.7
+T	0.00642277	0.0111958	10587.9
+T	0.00642277	0.0112833	10390.6
+T	0.00642277	0.0113708	10194.1
+T	0.00642277	0.0114582	9998.35
+T	0.00642277	0.0115457	9806.39
+T	0.00642277	0.0116332	9612.44
+T	0.00642277	0.0117206	9422.27
+T	0.00642277	0.0118081	9235.67
+T	0.00642277	0.0118956	9047.46
+T	0.00642277	0.011983	8862.82
+T	0.00642277	0.0120705	8679.25
+T	0.00642277	0.012158	8496.83
+T	0.00642277	0.0122454	8317.81
+T	0.00642277	0.0123329	8139.95
+T	0.00642277	0.0124204	7963.33
+T	0.00642277	0.0125078	7788.04
+T	0.00642277	0.0125953	7614.16
+T	0.00642277	0.0126828	7443.5
+T	0.00642277	0.0127702	7274.25
+T	0.00642277	0.0128577	7106.47
+T	0.00642277	0.0129452	6941.79
+T	0.00642277	0.0130326	6778.6
+T	0.00642277	0.0131201	6616.96
+T	0.00642277	0.0132076	6456.94
+T	0.00642277	0.013295	6298.62
+T	0.00642277	0.0133825	6143.25
+T	0.00642277	0.01347	5989.58
+T	0.00642277	0.0135574	5837.66
+T	0.00642277	0.0136449	5688.59
+T	0.00642277	0.0137324	5540.27
+T	0.00642277	0.0138198	5394.82
+T	0.00642277	0.0139073	5252.13
+T	0.00642277	0.0139948	5110.4
+T	0.00642277	0.0140822	4971.42
+T	0.00642277	0.0141697	4834.36
+T	0.00642277	0.0142572	4699.25
+T	0.00642277	0.0143446	4566.12
+T	0.00642277	0.0144321	4435.67
+T	0.00642277	0.0145196	4307.22
+T	0.00642277	0.014607	4180.78
+T	0.00642277	0.0146945	4056.96
+T	0.00642277	0.014782	3934.62
+T	0.00642277	0.0148694	3814.9
+T	0.00642277	0.0149569	3697.24
+T	0.00642277	0.0150444	3582.14
+T	0.00642277	0.0151318	3469.1
+T	0.00642277	0.0152193	3357.75
+T	0.00642277	0.0153068	3249.32
+T	0.00642277	0.0153942	3142.61
+T	0.00642277	0.0154817	3038.37
+T	0.00642277	0.0155692	2936.26
+T	0.00642277	0.0156566	2836.26
+T	0.00642277	0.0157441	2738.41
+T	0.00642277	0.0158316	2642.97
+T	0.00642277	0.015919	2549.65
+T	0.00642277	0.0160065	2458.45
+T	0.00642277	0.016094	2369.39
+T	0.00642277	0.0161814	2282.67
+T	0.00642277	0.0162689	2198.06
+T	0.00642277	0.0163564	2115.57
+T	0.00642277	0.0164438	2035.18
+T	0.00642277	0.0165313	1957.07
+T	0.00642277	0.0166188	1881.04
+T	0.00642277	0.0167063	1807.09
+T	0.00642277	0.0167937	1735.35
+T	0.00642277	0.0168812	1665.54
+T	0.00642277	0.0169687	1597.9
+T	0.00642277	0.0170561	1532.3
+T	0.00642277	0.0171436	1468.83
+T	0.00642277	0.0172311	1407.26
+T	0.00642277	0.0173185	1347.78
+T	0.00642277	0.017406	1290.28
+T	0.00642277	0.0174935	1234.75
+T	0.00642277	0.0175809	1181.23
+T	0.00642277	0.0176684	1129.64
+T	0.00642277	0.0177559	1079.95
+T	0.00642277	0.0178433	1032.15
+T	0.00642277	0.0179308	986.284
+T	0.00642277	0.0180183	942.257
+T	0.00642277	0.0181057	900.053
+T	0.00642277	0.0181932	859.65
+T	0.00642277	0.0182807	821.08
+T	0.00642277	0.0183681	784.265
+T	0.00642277	0.0184556	749.178
+T	0.00642277	0.0185431	715.799
+T	0.00642277	0.0186305	684.149
+T	0.00642277	0.018718	654.154
+T	0.00642277	0.0188055	625.789
+T	0.00642277	0.018893	599.029
+T	0.00642277	0.0189804	573.848
+T	0.00642277	0.0190679	550.259
+T	0.00642277	0.0191554	528.193
+T	0.00642277	0.0192428	507.659
+T	0.00642277	0.0193303	488.557
+T	0.00642277	0.0194178	470.931
+T	0.00642277	0.0195052	454.716
+T	0.00642277	0.0195927	439.884
+T	0.00642277	0.0196802	426.438
+T	0.00642277	0.0197676	414.315
+T	0.00642277	0.0198551	403.488
+T	0.00642277	0.0199426	393.926
+T	0.00642277	0.02003	385.629
+T	0.00642277	0.0201175	378.508
+T	0.00642277	0.020205	372.592
+T	0.00642277	0.0202924	367.85
+T	0.00642277	0.0203799	364.194
+T	0.00642277	0.0204674	361.651
+T	0.00642277	0.0205548	360.161
+T	0.00642277	0.0206423	359.696
+T	0.00642277	0.0207298	360.251
+T	0.00642277	0.0208172	361.769
+T	0.00642277	0.0209047	364.219
+T	0.00642277	0.0209922	367.572
+T	0.00642277	0.0210797	371.797
+T	0.00642277	0.0211671	376.888
+T	0.00642277	0.0212546	382.792
+T	0.00642277	0.0213421	389.478
+T	0.00642277	0.0214295	396.938
+T	0.00642277	0.021517	405.121
+T	0.00642277	0.0216045	413.996
+T	0.00642277	0.0216919	423.535
+T	0.00642277	0.0217794	433.709
+T	0.00642277	0.0218669	444.509
+T	0.00642277	0.0219543	455.886
+T	0.00642277	0.0220418	467.81
+T	0.00642277	0.0221293	480.274
+T	0.00642277	0.0222167	493.209
+T	0.00642277	0.0223042	506.628
+T	0.00642277	0.0223917	520.502
+T	0.00642277	0.0224791	534.765
+T	0.00642277	0.0225666	549.429
+T	0.00642277	0.0226541	564.448
+T	0.00642277	0.0227415	579.795
+T	0.00642277	0.022829	595.445
+T	0.00642277	0.0229165	611.391
+T	0.00642277	0.0230039	627.587
+T	0.00642277	0.0230914	644.01
+T	0.00642277	0.0231789	660.653
+T	0.00642277	0.0232663	677.455
+T	0.00642277	0.0233538	694.429
+T	0.00642277	0.0234413	711.551
+T	0.00642277	0.0235288	728.761
+T	0.00642277	0.0236162	746.074
+T	0.00642277	0.0237037	763.449
+T	0.00642277	0.0237912	780.864
+T	0.00642277	0.0238786	798.297
+T	0.00642277	0.0239661	815.746
+T	0.00642277	0.0240536	833.171
+T	0.00642277	0.024141	850.553
+T	0.00642277	0.0242285	867.872
+T	0.00642277	0.024316	885.128
+T	0.00642277	0.0244034	902.282
+T	0.00642277	0.0244909	919.317
+T	0.00642277	0.0245784	936.213
+T	0.00642277	0.0246658	952.975
+T	0.00642277	0.0247533	969.565
+T	0.00642277	0.0248408	985.965
+T	0.00642277	0.0249282	1002.18
+T	0.00642277	0.0250157	1018.16
+T	0.00642277	0.0251032	1033.92
+T	0.00642277	0.0251906	1049.43
+T	0.00642277	0.0252781	1064.7
+T	0.00642277	0.0253656	1079.67
+T	0.00642277	0.025453	1094.37
+T	0.00642277	0.0255405	1108.76
+T	0.00642277	0.025628	1122.87
+T	0.00642277	0.0257155	1136.62
+T	0.00642277	0.0258029	1150.05
+T	0.00642277	0.0258904	1163.14
+T	0.00642277	0.0259779	1175.89
+T	0.00642277	0.0260653	1188.24
+T	0.00642277	0.0261528	1200.24
+T	0.00642277	0.0262403	1211.85
+T	0.00642277	0.0263277	1223.06
+T	0.00642277	0.0264152	1233.89
+T	0.00642277	0.0265027	1244.32
+T	0.00642277	0.0265901	1254.31
+T	0.00642277	0.0266776	1263.88
+T	0.00642277	0.0267651	1273.05
+T	0.00642277	0.0268525	1281.78
+T	0.00642277	0.02694	1290.07
+T	0.00642277	0.0270275	1297.9
+T	0.00642277	0.0271149	1305.31
+T	0.00642277	0.0272024	1312.26
+T	0.00642277	0.0272899	1318.75
+T	0.00642277	0.0273773	1324.78
+T	0.00642277	0.0274648	1330.37
+T	0.00642277	0.0275523	1335.45
+T	0.00642277	0.0276397	1340.1
+T	0.00642277	0.0277272	1344.31
+T	0.00642277	0.0278147	1348
+T	0.00642277	0.0279022	1351.26
+T	0.00642277	0.0279896	1354.04
+T	0.00642277	0.0280771	1356.34
+T	0.00642277	0.0281646	1358.21
+T	0.00642277	0.028252	1359.6
+T	0.00642277	0.0283395	1360.52
+T	0.00642277	0.028427	1360.96
+T	0.00642277	0.0285144	1360.97
+T	0.00642277	0.0286019	1360.47
+T	0.00642277	0.0286894	1359.55
+T	0.00642277	0.0287768	1358.2
+T	0.00642277	0.0288643	1356.35
+T	0.00642277	0.0289518	1354.08
+T	0.00642277	0.0290392	1351.36
+T	0.00642277	0.0291267	1348.19
+T	0.00642277	0.0292142	1344.62
+T	0.00642277	0.0293016	1340.61
+T	0.00642277	0.0293891	1336.16
+T	0.00642277	0.0294766	1331.28
+T	0.00642277	0.029564	1325.98
+T	0.00642277	0.0296515	1320.3
+T	0.00642277	0.029739	1314.2
+T	0.00642277	0.0298264	1307.7
+T	0.00642277	0.0299139	1300.85
+T	0.00642277	0.0300014	1293.6
+T	0.00642277	0.0300888	1285.96
+T	0.00642277	0.0301763	1277.94
+T	0.00642277	0.0302638	1269.55
+T	0.00642277	0.0303513	1260.84
+T	0.00642277	0.0304387	1251.77
+T	0.00642277	0.0305262	1242.35
+T	0.00642277	0.0306137	1232.64
+T	0.00642277	0.0307011	1222.59
+T	0.00642277	0.0307886	1212.18
+T	0.00642277	0.0308761	1201.53
+T	0.00642277	0.0309635	1190.54
+T	0.00642277	0.031051	1179.29
+T	0.00642277	0.0311385	1167.75
+T	0.00642277	0.0312259	1155.94
+T	0.00642277	0.0313134	1143.89
+T	0.00642277	0.0314009	1131.54
+T	0.00642277	0.0314883	1118.98
+T	0.00642277	0.0315758	1106.19
+T	0.00642277	0.0316633	1093.19
+T	0.00642277	0.0317507	1079.94
+T	0.00642277	0.0318382	1066.51
+T	0.00642277	0.0319257	1052.92
+T	0.00642277	0.0320131	1039.1
+T	0.00642277	0.0321006	1025.13
+T	0.00642277	0.0321881	1010.99
+T	0.00642277	0.0322755	996.689
+T	0.00642277	0.032363	982.237
+T	0.00642277	0.0324505	967.674
+T	0.00642277	0.0325379	952.981
+T	0.00642277	0.0326254	938.166
+T	0.00642277	0.0327129	923.243
+T	0.00642277	0.0328003	908.246
+T	0.00642277	0.0328878	893.158
+T	0.00642277	0.0329753	877.99
+T	0.00642277	0.0330627	862.777
+T	0.00642277	0.0331502	847.48
+T	0.00642277	0.0332377	832.157
+T	0.00642277	0.0333251	816.793
+T	0.00642277	0.0334126	801.422
+T	0.00642277	0.0335001	786.008
+T	0.00642277	0.0335875	770.605
+T	0.00642277	0.033675	755.202
+T	0.00642277	0.0337625	739.826
+T	0.00642277	0.0338499	724.448
+T	0.00642277	0.0339374	709.117
+T	0.00642277	0.0340248	693.822
+T	0.00642277	0.0341123	678.59
+T	0.00642277	0.0341998	663.396
+T	0.00642277	0.0342872	648.282
+T	0.00642277	0.0343747	633.24
+T	0.00642277	0.0344622	618.293
+T	0.00642277	0.0345496	603.423
+T	0.00642277	0.0346371	588.664
+T	0.00642277	0.0347246	574.012
+T	0.00642277	0.034812	559.485
+T	0.00642277	0.0348995	545.07
+################################################################################################
diff --git a/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.fit b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.fit
new file mode 100644
index 0000000..6ea7f61
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.fit
@@ -0,0 +1,108 @@
+###########################################                                                                                  
+#	GISAXS FIT : FIT PARAMETERS                                                                                                
+###########################################                                                                                  
+                                                                                                                             
+# Cuts :   Number of cuts,  Number of points per cut, Fit type,  Error Bar, Epsilon for standard errors                      
+                2                    100                 1          1                0.                                      
+# Scale and shift factor :      A       LA     S     LS                                                                      
+                            1.141E+05    T   1.272E+01    T
+                             1e4   2e5         2  20                                                                         
+                              F    F           F  F                                                                          
+# Reciprocal space origin : St(deg)   LSt   Sa(deg)    LSa                                                                   
+                             0.0        F      0.0      F                                                                    
+                             0  0             0  0                                                                           
+                             F  F             F  F                                                                           
+############################  Framework and beam  parameters ##############################################                  
+# Beam Wavelenght  : Lambda (nm),  Sig_Wl                                                                                    
+                        F           F                                                                                        
+                      0  0         0  0                                                                                      
+                      F  F         F  F                                                                                      
+# Alpha_i,2Theta_i  : Alpha_i,  Sig_Ai, 2Theta_i,  Sig_Ti                                                                    
+                        F         F       F         F                                                                        
+                      0  0     0  0    0  0       0  0                                                                       
+                      F  F       F  F    F  F       F  F                                                                     
+# Substrate :    n_delta_S,   n_beta_S,  Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm)                      
+	             F            F            F                    F              F            F                                   
+                 0  0          0  0         0  0                 0  0           0  0         0  0                            
+                 F  F          F  F         F  F                 F  F           F  F         F  F                            
+# Particle : n-delta_I, n-beta_I, Depth,  n-delta_SH, n-beta_SH                                                              
+              F         F        F        F        F                                                                         
+             0  0      0  0     0  0     0  0     0  0                                                                       
+             F  F      F  F     F  F     F  F     F  F                                                                       
+##################################   Particle parameters #################################################                   
+# Probability of particle type                                                                                               
+	F                                                                                                                           
+	0  1                                                                                                                        
+	F  F                                                                                                                        
+# Fixed geometrical parameters : Base angle,   Height ratio,  Flattening,  FS-radii/R                                                     
+	                               F             F               F          F      F                                                          
+                                   0  0          0  0          0  0        0  0    0  0                                                   
+                                   F  F          F  F          F  F        F  F     F  F                                                  
+# Shell thicknesses :   dR,      dH,      dW                                                                                 
+	     	            F         F        F                                                                                      
+                       0  0      0  0     0  0                                                                               
+                       F  F      F  F     F  F                                                                               
+# Size of particle		: Radius(nm), SigmaR/R                                                                                   
+                          T            T                                                                                     
+                         0  10       0  1                                                                                    
+                         F  F        F  F                                                                                    
+# Heigth apect ratio	: Height/R, SigmaH/H, rho_H                                                                                    
+                          T             F      F                                                                               
+                         0  10        0  0   0  0                                                                                
+                         F  F        F  F    F  F                                                                                
+# Width apect ratio	: Width/R, SigmaW/W, rho_W                                                                                      
+                          F             F     F                                                                               
+                         0  0        0  0    0  0                                                                                
+                         F  F        F  F    F  F                                                                                
+# Orientation of particle : Zeta(deg), SigmaZ(deg)                                                                           
+                          F           F                                                                                      
+                         0  0        0  0                                                                                    
+                         F  F        F  F                                                                                    
+#################################### Lattice parameters #################################################                    
+#  Interference function :   Peak position D,    w,     Eta_voigt, Size-Distance coupling,  Cut-off
+                                   T             T         F              F                   F
+                                  0  0           0  0    0  0            0  0                0   0 
+                                  F  F          F  F     F  F            F  F                F   F                                                            
+# Pair correlation function :   Density,    D1,    sigma                                                                     
+                                  F         F        F                                                                       
+                                 0  0      0  0     0  0                                                                     
+                                 F  F      F  F     F  F                                                                     
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg)                                                                        
+                         F        F           F                                                                              
+                         0  0     0  0      0  0                                                                             
+                         F  F     F  F      F  F                                                                             
+                       Xi(deg),   sigmaXi(deg)                                                                               
+                         F            F                                                                                      
+                         0  0       0  0                                                                                     
+                         F  F       F  F                                                                                     
+                       Domain sizes DL(nm), SigmaDL/DL                                                                       
+			      F        F           F      F                                                                                       
+                       0  0     0  0        0  0   0  0                                                                      
+                       F  F     F  F        F  F   F  F                                                                      
+# Imperfect lattice :  Correlation lenghts (nm), Rod orientation(deg)                                                        
+                         F        F                F      F                                                                  
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+# Paracrystal :   Disorder factors w/L and Rod orientation (deg)                                                             
+			      F    F                     F     F                                                                                  
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+                        F    F                     F     F                                                                   
+                       0  0     0  0             0  0    0  0                                                                
+                       F  F     F  F             F  F    F  F                                                                
+# Pattern :   Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1                                                      
+			      F         F        F       F       F                                                                                
+                       0  0     0  0     0  0    0  0    0  0                                                                
+                       F  F     F  F     F  F    F  F    F  F                                                                
+			      F         F        F       F       F                                                                                
+                       0  0     0  0     0  0    0  0    0  0                                                                
+                       F  F     F  F     F  F    F  F    F  F                                                                
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
+                                                                                                                             
diff --git a/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.ima.gz
new file mode 100644
index 0000000..eda206e
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.inp b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.inp
new file mode 100644
index 0000000..e861282
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_fitexample
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         DA               0             25                ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2       0   2        100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           4          gaussian           0.2       0.1         11       20   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           0.8          none            0.1       0.1         11       25   2    0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          1DDL 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               12                     6     gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  sigma(nm)
+                                   0.007         25      100   
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.out b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.out
new file mode 100644
index 0000000..98fc534
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-5/isgi_fitexample.out
@@ -0,0 +1,298 @@
+#================================================================================================
+#                                     GISAXS OUTPUT FILE
+#================================================================================================
+# Date and time :                                   Thu Jan 17 17:09:39 2013
+# Input filename :                                  C:\Program Files\IsGISAXS\examples\ex-5\fit-solution.inp
+# Fit filename :                                    C:\Program Files\IsGISAXS\examples\ex-5\fit-example.fit
+# Fit with constraints :                             F
+# Matrix of constraints filename :                  C:\Program Files\IsGISAXS\examples\ex-5\fit-example.mat
+# Data filename :                                   C:\Program Files\IsGISAXS\examples\ex-5\fit-example.dat
+# Base filename :                                   fit-example
+# Type of calculation :                             fit
+# Ewald construction :                               T
+# Framework :                                       DWBA                
+# Treatment of the diffuse scattering :             DA        
+# Multilayer wavefields (Parratt-like) :                0
+# Required number of slices  :                         25
+# Actual number of slices in z  :                       1
+# Type of chi2 :                                        1
+# Error bar type :                                      1
+# Number of cuts :                                      2
+# Number of points per cut :                          100
+# Number of fitted parameters :                         7
+# Number of independent parameters :                    7
+# Systematic error :                                    0.00000E+00
+# Global scale and shift factors :                      1.31331E+05    1.20574E+01
+# Offset factors on alphaf and 2theta (deg) :                    0.00000E+00    0.00000E+00
+#=====================================Beam and substrate parameters==============================
+# Incident and scattered beam polarizations :       ss
+# Distribution of wavelength :                      none           
+# Wl0 - sigWl/Wl - FWHM-Wl (nm) :                       1.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Wl (nm), width and # of points :            1.00000E-01    1.00000E-01    0.00000E+00    1
+# Distribution of incident angle :                  none           
+# Alphai - sigAlphai - FWHM-Ai (deg) :                  2.00000E-01    0.00000E+00    0.00000E+00
+# Ranges of Alphai (deg), width and # of points :       2.00000E-01    2.00000E-01    0.00000E+00    1
+# Distribution of 2Theta incident angle :           none           
+# 2Thetai - sig2Thetai - FWHM (deg) :                   0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of 2Thetai (deg), width and # of points:       0.00000E+00    0.00000E+00    0.00000E+00    1
+# Substrate index of refraction (delta,beta):           6.00000E-06    2.00000E-08
+# Particle index of refraction (delta,beta):            6.00000E-04    2.00000E-08
+# Substrate roughness (nm) :                            0.00000E+00
+# Layer thickness (nm) :                                0.00000E+00
+# Layer index of refraction (delta,beta) :              1.00000E-05    5.00000E-07
+# Depth for the buried particle layer (nm):             0.00000E+00
+# Shell index of refraction (delta,beta) :              8.00000E-04    2.00000E-08
+#========================================Particle parameters=====================================
+# Number of different particle type :                  1
+#-------------------------------------------------------------------------------------------------
+# Angle between base and facets (deg) :                 5.47300E+01
+# Ratio between height for a cubooctahedron :           1.00000E+00
+# Flattening parameter of spheroid :                    1.00000E+00
+# Truncation parameters for a facetted sphere :         8.00000E-01    8.00000E-01
+# Particle shell thickness dR-dH-dW(nnm) :              0.00000E+00    0.00000E+00    0.00000E+00
+# H uncoupled :                                         T
+# W uncoupled :                                         F
+# Particle type - Probability :                      cylinder           1.00000E+00
+# Distribution of radius R :                        gaussian       
+# R0 - sigR/R0 - FWHM (nm) :                            5.00589E+00    1.99935E-01    2.35683E+00
+# Ranges of R (nm), width and # of points :             2.92227E-01    9.71956E+00    4.00000E+00   20
+# Distribution of height H :                        none           
+# H0/R0 - sigH/H0 - FWHM - rho_H :                      9.94833E-01    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of H/H0, width and  # of points :              9.94833E-01    9.94833E-01    0.00000E+00    1
+# Distribution of height W :                        none           
+# W0/R0 - sigW/W0 - FWHM - rho_W :                      1.00000E+00    0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of W/W0, width and  # of points :              1.00000E+00    1.00000E+00    0.00000E+00    1
+# Distribution of orientations Z :                  none           
+# Z0 - sigZ - FWHM (deg) :                              0.00000E+00    0.00000E+00    0.00000E+00
+# Ranges of Z (deg), width and # of points :            0.00000E+00    0.00000E+00    0.00000E+00    1
+#======================================Particle position parameters===============================
+# Distribution of particles :                       1DDL                     
+# Density of particles (nm-2) - L(nm) :                 4.45130E-03    1.49884E+01
+# Size-distance coupling parameter :                    0.00000E+00
+# Cut-off value for finite size effects :               1.00000E+07
+# Correlation function parameters (D,w,D1) :            1.49884E+01    3.02024E+00    2.50000E+01
+# Hard core parameters (sig(nm), eta) :                 1.00000E+02    3.49604E+01
+# Statistical distribution  :                       gau
+# Pseudo Voigt parameter :                              5.00000E-01
+#=========================================Derived parameters======================================
+# Mean wavelength (nm) :                                1.00000E-01
+# Mean incident angle Alphai (deg) :                    2.00000E-01
+# Mean incident angle 2Thetai (deg) :                   0.00000E+00
+# Mean radius (nm) :                                    5.00589E+00
+# Mean gyration radius (nm) :                           5.00589E+00
+# Mean height (nm) :                                    4.98003E+00
+# Mean width (nm) :                                     5.00589E+00
+# Mean height aspect ratio :                            1.04079E+00
+# Mean width aspect ratio :                             1.00000E+00
+# Mean volumes <V>, Sqrt(<V^2>) (nm^3) :                4.07725E+02    4.37387E+02
+# Mean particle orientationn (deg) :                    0.00000E+00
+# Coverage :                                            3.64437E-01
+# Mean thickness (nm) :                                 1.81491E+00
+# Magic size coupling parameter :                       2.87907E+00
+ 
+#==========================================Data file============================================
+#       Sin(twotheta)         Sin(alphaf)            Qx(nm-1)            Qy(nm-1)            Qz(nm-1)              GISAXS            Data2fit           Error bar        Iobs - Icalc              Fitted
+# Cut # =   1       Weight =  5.00000E-01        Scale =  1.00000E+00        Shift =  0.00000E+00   DeltaOmega =  0.00000E+00  DeltaAlphai =  0.00000E+00
+# Excluded area :    F
+          8.74674E-05         3.49065E-03        -2.40037E-07         5.49571E-03         4.38648E-01         1.52316E+02         1.52314E+02         1.23416E+01        -1.74222E-03                   1
+          4.37337E-04         3.49065E-03        -6.00838E-06         2.74785E-02         4.38648E-01         1.51650E+02         1.51814E+02         1.23213E+01         1.63822E-01                   1
+          7.87207E-04         3.49065E-03        -1.94679E-05         4.94614E-02         4.38648E-01         1.50505E+02         1.50668E+02         1.22747E+01         1.62761E-01                   1
+          1.13708E-03         3.49065E-03        -4.06187E-05         7.14444E-02         4.38648E-01         1.48774E+02         1.48929E+02         1.22036E+01         1.54631E-01                   1
+          1.48695E-03         3.49065E-03        -6.94606E-05         9.34273E-02         4.38648E-01         1.46537E+02         1.46679E+02         1.21111E+01         1.41436E-01                   1
+          1.83682E-03         3.49065E-03        -1.05994E-04         1.15410E-01         4.38648E-01         1.43919E+02         1.44043E+02         1.20018E+01         1.24062E-01                   1
+          2.18669E-03         3.49065E-03        -1.50218E-04         1.37393E-01         4.38648E-01         1.41086E+02         1.41189E+02         1.18823E+01         1.02268E-01                   1
+          2.53656E-03         3.49065E-03        -2.02133E-04         1.59376E-01         4.38648E-01         1.38267E+02         1.38343E+02         1.17619E+01         7.53556E-02                   1
+          2.88643E-03         3.49065E-03        -2.61740E-04         1.81359E-01         4.38648E-01         1.35765E+02         1.35808E+02         1.16537E+01         4.33598E-02                   1
+          3.23629E-03         3.49065E-03        -3.29036E-04         2.03341E-01         4.38648E-01         1.33982E+02         1.33988E+02         1.15753E+01         6.80530E-03                   1
+          3.58616E-03         3.49065E-03        -4.04024E-04         2.25324E-01         4.38648E-01         1.33458E+02         1.33426E+02         1.15510E+01        -3.21472E-02                   1
+          3.93603E-03         3.49065E-03        -4.86705E-04         2.47307E-01         4.38648E-01         1.34917E+02         1.34848E+02         1.16124E+01        -6.90000E-02                   1
+          4.28590E-03         3.49065E-03        -5.77076E-04         2.69289E-01         4.38648E-01         1.39333E+02         1.39239E+02         1.17999E+01        -9.43151E-02                   1
+          4.63577E-03         3.49065E-03        -6.75139E-04         2.91272E-01         4.38648E-01         1.48028E+02         1.47939E+02         1.21630E+01        -8.90122E-02                   1
+          4.98564E-03         3.49065E-03        -7.80893E-04         3.13255E-01         4.38648E-01         1.62802E+02         1.62788E+02         1.27588E+01        -1.35393E-02                   1
+          5.33551E-03         3.49065E-03        -8.94339E-04         3.35238E-01         4.38648E-01         1.85997E+02         1.86215E+02         1.36460E+01         2.17236E-01                   1
+          5.68538E-03         3.49065E-03        -1.01548E-03         3.57221E-01         4.38648E-01         2.19747E+02         2.20533E+02         1.48504E+01         7.86148E-01                   1
+          6.03525E-03         3.49065E-03        -1.14430E-03         3.79204E-01         4.38648E-01         2.60935E+02         2.62865E+02         1.62131E+01         1.93022E+00                   1
+          6.38512E-03         3.49065E-03        -1.28082E-03         4.01186E-01         4.38648E-01         2.87091E+02         2.90215E+02         1.70357E+01         3.12390E+00                   1
+          6.73499E-03         3.49065E-03        -1.42504E-03         4.23169E-01         4.38648E-01         2.66462E+02         2.69157E+02         1.64060E+01         2.69557E+00                   1
+          7.08486E-03         3.49065E-03        -1.57694E-03         4.45152E-01         4.38648E-01         2.15832E+02         2.17260E+02         1.47397E+01         1.42787E+00                   1
+          7.43473E-03         3.49065E-03        -1.73654E-03         4.67135E-01         4.38648E-01         1.68573E+02         1.69216E+02         1.30083E+01         6.42179E-01                   1
+          7.78460E-03         3.49065E-03        -1.90382E-03         4.89118E-01         4.38648E-01         1.33543E+02         1.33833E+02         1.15686E+01         2.90583E-01                   1
+          8.13447E-03         3.49065E-03        -2.07880E-03         5.11101E-01         4.38648E-01         1.08739E+02         1.08883E+02         1.04347E+01         1.43058E-01                   1
+          8.48434E-03         3.49065E-03        -2.26147E-03         5.33084E-01         4.38648E-01         9.11383E+01         9.12222E+01         9.55103E+00         8.38658E-02                   1
+          8.92168E-03         3.49065E-03        -2.50063E-03         5.60562E-01         4.38648E-01         7.59326E+01         7.59977E+01         8.71767E+00         6.50526E-02                   1
+          9.27154E-03         3.49065E-03        -2.70060E-03         5.82544E-01         4.38648E-01         6.74280E+01         6.74981E+01         8.21573E+00         7.01271E-02                   1
+          9.62141E-03         3.49065E-03        -2.90827E-03         6.04527E-01         4.38648E-01         6.10994E+01         6.11824E+01         7.82191E+00         8.29824E-02                   1
+          9.97128E-03         3.49065E-03        -3.12363E-03         6.26510E-01         4.38648E-01         5.62543E+01         5.63510E+01         7.50673E+00         9.66652E-02                   1
+          1.03211E-02         3.49065E-03        -3.34665E-03         6.48490E-01         4.38648E-01         5.24106E+01         5.25159E+01         7.24679E+00         1.05262E-01                   1
+          1.06710E-02         3.49065E-03        -3.57742E-03         6.70475E-01         4.38648E-01         4.92629E+01         4.93680E+01         7.02624E+00         1.05154E-01                   1
+          1.10209E-02         3.49065E-03        -3.81588E-03         6.92459E-01         4.38648E-01         4.66641E+01         4.67565E+01         6.83787E+00         9.23919E-02                   1
+          1.13708E-02         3.49065E-03        -4.06203E-03         7.14444E-01         4.38648E-01         4.45901E+01         4.46580E+01         6.68267E+00         6.79267E-02                   1
+          1.17206E-02         3.49065E-03        -4.31580E-03         7.36423E-01         4.38648E-01         4.30795E+01         4.31164E+01         6.56630E+00         3.68871E-02                   1
+          1.20705E-02         3.49065E-03        -4.57734E-03         7.58407E-01         4.38648E-01         4.21463E+01         4.21555E+01         6.49273E+00         9.21868E-03                   1
+          1.24204E-02         3.49065E-03        -4.84658E-03         7.80392E-01         4.38648E-01         4.17120E+01         4.17041E+01         6.45787E+00        -7.94836E-03                   1
+          1.27702E-02         3.49065E-03        -5.12342E-03         8.02370E-01         4.38648E-01         4.15981E+01         4.15850E+01         6.44864E+00        -1.31661E-02                   1
+          1.31201E-02         3.49065E-03        -5.40804E-03         8.24355E-01         4.38648E-01         4.15891E+01         4.15787E+01         6.44816E+00        -1.04150E-02                   1
+          1.34700E-02         3.49065E-03        -5.70036E-03         8.46340E-01         4.38648E-01         4.15065E+01         4.15011E+01         6.44213E+00        -5.45553E-03                   1
+          1.38198E-02         3.49065E-03        -6.00028E-03         8.68318E-01         4.38648E-01         4.12460E+01         4.12440E+01         6.42215E+00        -2.00326E-03                   1
+          1.41697E-02         3.49065E-03        -6.30798E-03         8.90303E-01         4.38648E-01         4.07732E+01         4.07718E+01         6.38528E+00        -1.40926E-03                   1
+          1.45196E-02         3.49065E-03        -6.62338E-03         9.12288E-01         4.38648E-01         4.01004E+01         4.00970E+01         6.33222E+00        -3.37917E-03                   1
+          1.48694E-02         3.49065E-03        -6.94637E-03         9.34266E-01         4.38648E-01         3.92622E+01         3.92549E+01         6.26538E+00        -7.27586E-03                   1
+          1.52193E-02         3.49065E-03        -7.27716E-03         9.56251E-01         4.38648E-01         3.82976E+01         3.82863E+01         6.18759E+00        -1.13429E-02                   1
+          1.55692E-02         3.49065E-03        -7.61564E-03         9.78236E-01         4.38648E-01         3.72422E+01         3.72270E+01         6.10139E+00        -1.52024E-02                   1
+          1.59190E-02         3.49065E-03        -7.96171E-03         1.00021E+00         4.38648E-01         3.61244E+01         3.61053E+01         6.00877E+00        -1.91141E-02                   1
+          1.62689E-02         3.49065E-03        -8.31558E-03         1.02220E+00         4.38648E-01         3.49649E+01         3.49424E+01         5.91121E+00        -2.25228E-02                   1
+          1.66188E-02         3.49065E-03        -8.67714E-03         1.04418E+00         4.38648E-01         3.37811E+01         3.37546E+01         5.80987E+00        -2.65210E-02                   1
+          1.69687E-02         3.49065E-03        -9.04640E-03         1.06617E+00         4.38648E-01         3.25880E+01         3.25566E+01         5.70584E+00        -3.14088E-02                   1
+          1.73185E-02         3.49065E-03        -9.42324E-03         1.08815E+00         4.38648E-01         3.14010E+01         3.13625E+01         5.60023E+00        -3.84527E-02                   1
+          1.76684E-02         3.49065E-03        -9.80789E-03         1.11013E+00         4.38648E-01         3.02351E+01         3.01880E+01         5.49436E+00        -4.70697E-02                   1
+          1.80183E-02         3.49065E-03        -1.02002E-02         1.13212E+00         4.38648E-01         2.91066E+01         2.90489E+01         5.38970E+00        -5.76533E-02                   1
+          1.83681E-02         3.49065E-03        -1.06002E-02         1.15409E+00         4.38648E-01         2.80305E+01         2.79603E+01         5.28775E+00        -7.02515E-02                   1
+          1.87180E-02         3.49065E-03        -1.10079E-02         1.17608E+00         4.38648E-01         2.70186E+01         2.69349E+01         5.18988E+00        -8.37585E-02                   1
+          1.90679E-02         3.49065E-03        -1.14233E-02         1.19806E+00         4.38648E-01         2.60799E+01         2.59819E+01         5.09725E+00        -9.79239E-02                   1
+          1.94178E-02         3.49065E-03        -1.18464E-02         1.22005E+00         4.38648E-01         2.52184E+01         2.51062E+01         5.01061E+00        -1.12207E-01                   1
+          1.97676E-02         3.49065E-03        -1.22771E-02         1.24203E+00         4.38648E-01         2.44343E+01         2.43080E+01         4.93031E+00        -1.26370E-01                   1
+          2.01175E-02         3.49065E-03        -1.27157E-02         1.26401E+00         4.38648E-01         2.37235E+01         2.35838E+01         4.85632E+00        -1.39649E-01                   1
+          2.04674E-02         3.49065E-03        -1.31619E-02         1.28600E+00         4.38648E-01         2.30795E+01         2.29274E+01         4.78826E+00        -1.52102E-01                   1
+          2.08172E-02         3.49065E-03        -1.36157E-02         1.30798E+00         4.38648E-01         2.24944E+01         2.23307E+01         4.72553E+00        -1.63792E-01                   1
+          2.11671E-02         3.49065E-03        -1.40773E-02         1.32996E+00         4.38648E-01         2.19590E+01         2.17845E+01         4.66739E+00        -1.74446E-01                   1
+          2.15170E-02         3.49065E-03        -1.45466E-02         1.35194E+00         4.38648E-01         2.14645E+01         2.12802E+01         4.61305E+00        -1.84285E-01                   1
+          2.18669E-02         3.49065E-03        -1.50236E-02         1.37393E+00         4.38648E-01         2.10029E+01         2.08094E+01         4.56174E+00        -1.93443E-01                   1
+          2.22167E-02         3.49065E-03        -1.55081E-02         1.39591E+00         4.38648E-01         2.05671E+01         2.03649E+01         4.51275E+00        -2.02167E-01                   1
+          2.25666E-02         3.49065E-03        -1.60005E-02         1.41789E+00         4.38648E-01         2.01510E+01         1.99407E+01         4.46550E+00        -2.10325E-01                   1
+          2.29165E-02         3.49065E-03        -1.65006E-02         1.43988E+00         4.38648E-01         1.97500E+01         1.95318E+01         4.41948E+00        -2.18214E-01                   1
+          2.32663E-02         3.49065E-03        -1.70083E-02         1.46186E+00         4.38648E-01         1.93608E+01         1.91348E+01         4.37433E+00        -2.26041E-01                   1
+          2.36162E-02         3.49065E-03        -1.75238E-02         1.48384E+00         4.38648E-01         1.89807E+01         1.87470E+01         4.32978E+00        -2.33698E-01                   1
+          2.39661E-02         3.49065E-03        -1.80470E-02         1.50583E+00         4.38648E-01         1.86083E+01         1.83669E+01         4.28566E+00        -2.41393E-01                   1
+          2.43160E-02         3.49065E-03        -1.85779E-02         1.52781E+00         4.38648E-01         1.82428E+01         1.79936E+01         4.24189E+00        -2.49192E-01                   1
+          2.46658E-02         3.49065E-03        -1.91163E-02         1.54979E+00         4.38648E-01         1.78843E+01         1.76271E+01         4.19846E+00        -2.57197E-01                   1
+          2.50157E-02         3.49065E-03        -1.96626E-02         1.57177E+00         4.38648E-01         1.75326E+01         1.72673E+01         4.15540E+00        -2.65303E-01                   1
+          2.53656E-02         3.49065E-03        -2.02166E-02         1.59376E+00         4.38648E-01         1.71884E+01         1.69148E+01         4.11277E+00        -2.73540E-01                   1
+          2.57155E-02         3.49065E-03        -2.07783E-02         1.61574E+00         4.38648E-01         1.68522E+01         1.65702E+01         4.07065E+00        -2.81946E-01                   1
+          2.60653E-02         3.49065E-03        -2.13475E-02         1.63772E+00         4.38648E-01         1.65246E+01         1.62340E+01         4.02915E+00        -2.90564E-01                   1
+          2.65027E-02         3.49065E-03        -2.20701E-02         1.66520E+00         4.38648E-01         1.61278E+01         1.58264E+01         3.97825E+00        -3.01405E-01                   1
+          2.68525E-02         3.49065E-03        -2.26566E-02         1.68718E+00         4.38648E-01         1.58213E+01         1.55110E+01         3.93840E+00        -3.10260E-01                   1
+          2.72024E-02         3.49065E-03        -2.32510E-02         1.70917E+00         4.38648E-01         1.55244E+01         1.52053E+01         3.89939E+00        -3.19102E-01                   1
+          2.75523E-02         3.49065E-03        -2.38531E-02         1.73115E+00         4.38648E-01         1.52373E+01         1.49093E+01         3.86126E+00        -3.27995E-01                   1
+          2.79022E-02         3.49065E-03        -2.44629E-02         1.75314E+00         4.38648E-01         1.49601E+01         1.46232E+01         3.82402E+00        -3.36891E-01                   1
+          2.82520E-02         3.49065E-03        -2.50803E-02         1.77511E+00         4.38648E-01         1.46925E+01         1.43466E+01         3.78769E+00        -3.45890E-01                   1
+          2.86019E-02         3.49065E-03        -2.57055E-02         1.79710E+00         4.38648E-01         1.44341E+01         1.40793E+01         3.75224E+00        -3.54766E-01                   1
+          2.89518E-02         3.49065E-03        -2.63384E-02         1.81908E+00         4.38648E-01         1.41846E+01         1.38210E+01         3.71766E+00        -3.63634E-01                   1
+          2.93016E-02         3.49065E-03        -2.69788E-02         1.84106E+00         4.38648E-01         1.39438E+01         1.35713E+01         3.68392E+00        -3.72524E-01                   1
+          2.96515E-02         3.49065E-03        -2.76271E-02         1.86305E+00         4.38648E-01         1.37109E+01         1.33296E+01         3.65097E+00        -3.81357E-01                   1
+          3.00014E-02         3.49065E-03        -2.82832E-02         1.88503E+00         4.38648E-01         1.34858E+01         1.30956E+01         3.61879E+00        -3.90118E-01                   1
+          3.03513E-02         3.49065E-03        -2.89469E-02         1.90702E+00         4.38648E-01         1.32678E+01         1.28690E+01         3.58733E+00        -3.98850E-01                   1
+          3.07011E-02         3.49065E-03        -2.96181E-02         1.92900E+00         4.38648E-01         1.30567E+01         1.26491E+01         3.55655E+00        -4.07646E-01                   1
+          3.10510E-02         3.49065E-03        -3.02972E-02         1.95098E+00         4.38648E-01         1.28520E+01         1.24357E+01         3.52643E+00        -4.16328E-01                   1
+          3.14009E-02         3.49065E-03        -3.09841E-02         1.97296E+00         4.38648E-01         1.26534E+01         1.22283E+01         3.49690E+00        -4.25050E-01                   1
+          3.17507E-02         3.49065E-03        -3.16784E-02         1.99494E+00         4.38648E-01         1.24606E+01         1.20268E+01         3.46797E+00        -4.33783E-01                   1
+          3.21006E-02         3.49065E-03        -3.23806E-02         2.01693E+00         4.38648E-01         1.22732E+01         1.18308E+01         3.43959E+00        -4.42474E-01                   1
+          3.24505E-02         3.49065E-03        -3.30906E-02         2.03891E+00         4.38648E-01         1.20911E+01         1.16400E+01         3.41175E+00        -4.51126E-01                   1
+          3.28003E-02         3.49065E-03        -3.38080E-02         2.06089E+00         4.38648E-01         1.19141E+01         1.14543E+01         3.38441E+00        -4.59871E-01                   1
+          3.31502E-02         3.49065E-03        -3.45334E-02         2.08288E+00         4.38648E-01         1.17419E+01         1.12733E+01         3.35758E+00        -4.68562E-01                   1
+          3.35001E-02         3.49065E-03        -3.52664E-02         2.10486E+00         4.38648E-01         1.15743E+01         1.10970E+01         3.33122E+00        -4.77283E-01                   1
+          3.38499E-02         3.49065E-03        -3.60070E-02         2.12684E+00         4.38648E-01         1.14113E+01         1.09252E+01         3.30534E+00        -4.86013E-01                   1
+          3.41998E-02         3.49065E-03        -3.67554E-02         2.14882E+00         4.38648E-01         1.12525E+01         1.07577E+01         3.27990E+00        -4.94755E-01                   1
+          3.45496E-02         3.49065E-03        -3.75114E-02         2.17080E+00         4.38648E-01         1.10980E+01         1.05945E+01         3.25492E+00        -5.03488E-01                   1
+          3.48995E-02         3.49065E-03        -3.82752E-02         2.19279E+00         4.38648E-01         1.09474E+01         1.04352E+01         3.23035E+00        -5.12269E-01                   1
+# Cut # =   2       Weight =  5.00000E-01        Scale =  1.00000E+00        Shift =  0.00000E+00   DeltaOmega =  0.00000E+00  DeltaAlphai =  0.00000E+00
+# Excluded area :    F
+          6.42277E-03         8.74674E-05        -9.13430E-04         4.03555E-01         2.24820E-01         1.46592E+01         1.42077E+01         3.76931E+00        -4.51505E-01                   1
+          6.42277E-03         4.37337E-04        -9.19198E-04         4.03555E-01         2.46803E-01         7.09550E+01         7.07023E+01         8.40847E+00        -2.52696E-01                   1
+          6.42277E-03         7.87207E-04        -9.32657E-04         4.03554E-01         2.68786E-01         1.26209E+02         1.25875E+02         1.12194E+01        -3.33769E-01                   1
+          6.42277E-03         1.13708E-03        -9.53808E-04         4.03554E-01         2.90769E-01         1.79074E+02         1.78661E+02         1.33664E+01        -4.12553E-01                   1
+          6.42277E-03         1.48695E-03        -9.82649E-04         4.03554E-01         3.12752E-01         2.28408E+02         2.27942E+02         1.50978E+01        -4.65940E-01                   1
+          6.42277E-03         1.83682E-03        -1.01918E-03         4.03554E-01         3.34735E-01         2.72991E+02         2.72502E+02         1.65076E+01        -4.88771E-01                   1
+          6.42277E-03         2.18669E-03        -1.06341E-03         4.03554E-01         3.56718E-01         3.11410E+02         3.10498E+02         1.76210E+01        -9.11717E-01                   1
+          6.42277E-03         2.53656E-03        -1.11532E-03         4.03553E-01         3.78701E-01         3.41830E+02         3.40950E+02         1.84648E+01        -8.79541E-01                   1
+          6.42277E-03         2.88643E-03        -1.17493E-03         4.03553E-01         4.00684E-01         3.61298E+02         3.60471E+02         1.89861E+01        -8.27000E-01                   1
+          6.42277E-03         3.23629E-03        -1.24222E-03         4.03552E-01         4.22666E-01         3.62412E+02         3.61786E+02         1.90207E+01        -6.26426E-01                   1
+          6.42277E-03         3.58616E-03        -1.31721E-03         4.03552E-01         4.44649E-01         2.54329E+02         2.54791E+02         1.59622E+01         4.61846E-01                   1
+          6.42277E-03         3.93603E-03        -1.39989E-03         4.03551E-01         4.66632E-01         2.13796E+02         2.13462E+02         1.46104E+01        -3.33541E-01                   1
+          6.42277E-03         4.28590E-03        -1.49026E-03         4.03551E-01         4.88615E-01         1.95885E+02         1.95738E+02         1.39906E+01        -1.46794E-01                   1
+          6.42277E-03         4.63577E-03        -1.58832E-03         4.03550E-01         5.10598E-01         1.84554E+02         1.84344E+02         1.35773E+01        -2.10358E-01                   1
+          6.42277E-03         4.98564E-03        -1.69407E-03         4.03550E-01         5.32581E-01         1.76292E+02         1.76161E+02         1.32726E+01        -1.30442E-01                   1
+          6.42277E-03         5.33551E-03        -1.80752E-03         4.03549E-01         5.54564E-01         1.69729E+02         1.69641E+02         1.30246E+01        -8.79771E-02                   1
+          6.42277E-03         5.68538E-03        -1.92865E-03         4.03548E-01         5.76547E-01         1.64197E+02         1.64120E+02         1.28109E+01        -7.74045E-02                   1
+          6.42277E-03         6.03525E-03        -2.05748E-03         4.03547E-01         5.98530E-01         1.59325E+02         1.59279E+02         1.26206E+01        -4.61125E-02                   1
+          6.42277E-03         6.38512E-03        -2.19400E-03         4.03546E-01         6.20513E-01         1.54888E+02         1.54864E+02         1.24445E+01        -2.37728E-02                   1
+          6.42277E-03         6.73499E-03        -2.33821E-03         4.03545E-01         6.42496E-01         1.50742E+02         1.50736E+02         1.22775E+01        -5.49703E-03                   1
+          6.42277E-03         7.08486E-03        -2.49011E-03         4.03544E-01         6.64479E-01         1.46789E+02         1.46820E+02         1.21169E+01         3.04912E-02                   1
+          6.42277E-03         7.43473E-03        -2.64970E-03         4.03543E-01         6.86462E-01         1.42964E+02         1.43011E+02         1.19587E+01         4.76080E-02                   1
+          6.42277E-03         7.78460E-03        -2.81698E-03         4.03542E-01         7.08445E-01         1.39218E+02         1.39281E+02         1.18017E+01         6.30673E-02                   1
+          6.42277E-03         8.13447E-03        -2.99196E-03         4.03541E-01         7.30428E-01         1.35517E+02         1.35594E+02         1.16445E+01         7.69255E-02                   1
+          6.42277E-03         8.48434E-03        -3.17463E-03         4.03540E-01         7.52411E-01         1.31837E+02         1.31926E+02         1.14859E+01         8.96266E-02                   1
+          6.42277E-03         8.92168E-03        -3.41378E-03         4.03538E-01         7.79890E-01         1.27239E+02         1.27340E+02         1.12845E+01         1.01408E-01                   1
+          6.42277E-03         9.27154E-03        -3.61375E-03         4.03537E-01         8.01872E-01         1.23547E+02         1.23659E+02         1.11202E+01         1.12112E-01                   1
+          6.42277E-03         9.62141E-03        -3.82142E-03         4.03536E-01         8.23855E-01         1.19833E+02         1.19955E+02         1.09524E+01         1.21608E-01                   1
+          6.42277E-03         9.97128E-03        -4.03678E-03         4.03534E-01         8.45838E-01         1.16094E+02         1.16223E+02         1.07807E+01         1.29975E-01                   1
+          6.42277E-03         1.03211E-02        -4.25979E-03         4.03533E-01         8.67818E-01         1.12325E+02         1.12461E+02         1.06047E+01         1.36069E-01                   1
+          6.42277E-03         1.06710E-02        -4.49056E-03         4.03532E-01         8.89803E-01         1.08524E+02         1.08647E+02         1.04234E+01         1.23091E-01                   1
+          6.42277E-03         1.10209E-02        -4.72901E-03         4.03530E-01         9.11788E-01         1.04693E+02         1.04822E+02         1.02382E+01         1.28601E-01                   1
+          6.42277E-03         1.13708E-02        -4.97516E-03         4.03528E-01         9.33773E-01         1.00834E+02         1.00966E+02         1.00482E+01         1.32175E-01                   1
+          6.42277E-03         1.17206E-02        -5.22893E-03         4.03527E-01         9.55751E-01         9.69496E+01         9.70684E+01         9.85233E+00         1.18807E-01                   1
+          6.42277E-03         1.20705E-02        -5.49047E-03         4.03525E-01         9.77736E-01         9.30425E+01         9.31625E+01         9.65207E+00         1.19947E-01                   1
+          6.42277E-03         1.24204E-02        -5.75970E-03         4.03523E-01         9.99721E-01         8.91185E+01         8.92375E+01         9.44656E+00         1.19038E-01                   1
+          6.42277E-03         1.27702E-02        -6.03654E-03         4.03522E-01         1.02170E+00         8.51840E+01         8.52892E+01         9.23522E+00         1.05238E-01                   1
+          6.42277E-03         1.31201E-02        -6.32115E-03         4.03520E-01         1.04368E+00         8.12431E+01         8.13447E+01         9.01913E+00         1.01566E-01                   1
+          6.42277E-03         1.34700E-02        -6.61346E-03         4.03518E-01         1.06567E+00         7.73040E+01         7.73924E+01         8.79729E+00         8.83822E-02                   1
+          6.42277E-03         1.38198E-02        -6.91338E-03         4.03516E-01         1.08765E+00         7.33753E+01         7.34494E+01         8.57026E+00         7.41649E-02                   1
+          6.42277E-03         1.41697E-02        -7.22108E-03         4.03514E-01         1.10963E+00         6.94629E+01         6.95296E+01         8.33844E+00         6.66137E-02                   1
+          6.42277E-03         1.45196E-02        -7.53647E-03         4.03512E-01         1.13162E+00         6.55770E+01         6.56294E+01         8.10120E+00         5.23900E-02                   1
+          6.42277E-03         1.48694E-02        -7.85946E-03         4.03510E-01         1.15360E+00         6.17282E+01         6.17649E+01         7.85906E+00         3.67032E-02                   1
+          6.42277E-03         1.52193E-02        -8.19024E-03         4.03508E-01         1.17558E+00         5.79246E+01         5.79461E+01         7.61223E+00         2.15448E-02                   1
+          6.42277E-03         1.55692E-02        -8.52871E-03         4.03506E-01         1.19757E+00         5.41785E+01         5.41873E+01         7.36120E+00         8.74378E-03                   1
+          6.42277E-03         1.59190E-02        -8.87478E-03         4.03503E-01         1.21954E+00         5.05035E+01         5.04941E+01         7.10592E+00        -9.42688E-03                   1
+          6.42277E-03         1.62689E-02        -9.22864E-03         4.03501E-01         1.24153E+00         4.69110E+01         4.68835E+01         6.84715E+00        -2.75654E-02                   1
+          6.42277E-03         1.66188E-02        -9.59020E-03         4.03499E-01         1.26351E+00         4.34177E+01         4.33710E+01         6.58566E+00        -4.67044E-02                   1
+          6.42277E-03         1.69687E-02        -9.95945E-03         4.03496E-01         1.28550E+00         4.00410E+01         3.99737E+01         6.32248E+00        -6.72427E-02                   1
+          6.42277E-03         1.73185E-02        -1.03363E-02         4.03494E-01         1.30748E+00         3.68024E+01         3.67121E+01         6.05905E+00        -9.02537E-02                   1
+          6.42277E-03         1.76684E-02        -1.07209E-02         4.03492E-01         1.32946E+00         3.37241E+01         3.36101E+01         5.79742E+00        -1.13991E-01                   1
+          6.42277E-03         1.80183E-02        -1.11133E-02         4.03489E-01         1.35145E+00         3.08359E+01         3.06962E+01         5.54042E+00        -1.39652E-01                   1
+          6.42277E-03         1.83681E-02        -1.15132E-02         4.03486E-01         1.37343E+00         2.81727E+01         2.80047E+01         5.29195E+00        -1.67922E-01                   1
+          6.42277E-03         1.87180E-02        -1.19209E-02         4.03484E-01         1.39541E+00         2.57735E+01         2.55764E+01         5.05731E+00        -1.97062E-01                   1
+          6.42277E-03         1.90679E-02        -1.23363E-02         4.03481E-01         1.41740E+00         2.36856E+01         2.34576E+01         4.84330E+00        -2.27967E-01                   1
+          6.42277E-03         1.94178E-02        -1.27595E-02         4.03478E-01         1.43938E+00         2.19586E+01         2.17009E+01         4.65843E+00        -2.57635E-01                   1
+          6.42277E-03         1.97676E-02        -1.31902E-02         4.03476E-01         1.46136E+00         2.06399E+01         2.03547E+01         4.51162E+00        -2.85171E-01                   1
+          6.42277E-03         2.01175E-02        -1.36287E-02         4.03473E-01         1.48334E+00         1.97634E+01         1.94553E+01         4.41081E+00        -3.08077E-01                   1
+          6.42277E-03         2.04674E-02        -1.40749E-02         4.03470E-01         1.50533E+00         1.93403E+01         1.90171E+01         4.36086E+00        -3.23155E-01                   1
+          6.42277E-03         2.08172E-02        -1.45287E-02         4.03467E-01         1.52731E+00         1.93504E+01         1.90202E+01         4.36122E+00        -3.30212E-01                   1
+          6.42277E-03         2.11671E-02        -1.49903E-02         4.03464E-01         1.54929E+00         1.97442E+01         1.94136E+01         4.40609E+00        -3.30551E-01                   1
+          6.42277E-03         2.15170E-02        -1.54596E-02         4.03461E-01         1.57128E+00         2.04523E+01         2.01276E+01         4.48638E+00        -3.24690E-01                   1
+          6.42277E-03         2.18669E-02        -1.59366E-02         4.03458E-01         1.59326E+00         2.13994E+01         2.10834E+01         4.59166E+00        -3.16010E-01                   1
+          6.42277E-03         2.22167E-02        -1.64211E-02         4.03455E-01         1.61524E+00         2.25137E+01         2.22083E+01         4.71257E+00        -3.05435E-01                   1
+          6.42277E-03         2.25666E-02        -1.69135E-02         4.03452E-01         1.63723E+00         2.37345E+01         2.34399E+01         4.84148E+00        -2.94603E-01                   1
+          6.42277E-03         2.29165E-02        -1.74136E-02         4.03449E-01         1.65921E+00         2.50112E+01         2.47263E+01         4.97256E+00        -2.84911E-01                   1
+          6.42277E-03         2.32663E-02        -1.79212E-02         4.03445E-01         1.68119E+00         2.63040E+01         2.60280E+01         5.10176E+00        -2.76054E-01                   1
+          6.42277E-03         2.36162E-02        -1.84367E-02         4.03442E-01         1.70317E+00         2.75830E+01         2.73144E+01         5.22631E+00        -2.68639E-01                   1
+          6.42277E-03         2.39661E-02        -1.89599E-02         4.03439E-01         1.72516E+00         2.88243E+01         2.85613E+01         5.34427E+00        -2.63032E-01                   1
+          6.42277E-03         2.43160E-02        -1.94908E-02         4.03435E-01         1.74714E+00         3.00100E+01         2.97511E+01         5.45446E+00        -2.58899E-01                   1
+          6.42277E-03         2.46658E-02        -2.00292E-02         4.03432E-01         1.76912E+00         3.11261E+01         3.08703E+01         5.55610E+00        -2.55846E-01                   1
+          6.42277E-03         2.50157E-02        -2.05755E-02         4.03428E-01         1.79111E+00         3.21630E+01         3.19086E+01         5.64877E+00        -2.54393E-01                   1
+          6.42277E-03         2.53656E-02        -2.11295E-02         4.03425E-01         1.81309E+00         3.31125E+01         3.28583E+01         5.73222E+00        -2.54177E-01                   1
+          6.42277E-03         2.57155E-02        -2.16911E-02         4.03421E-01         1.83508E+00         3.39689E+01         3.37138E+01         5.80636E+00        -2.55065E-01                   1
+          6.42277E-03         2.60653E-02        -2.22604E-02         4.03417E-01         1.85706E+00         3.47277E+01         3.44709E+01         5.87119E+00        -2.56831E-01                   1
+          6.42277E-03         2.65027E-02        -2.29829E-02         4.03413E-01         1.88454E+00         3.55354E+01         3.52749E+01         5.93927E+00        -2.60468E-01                   1
+          6.42277E-03         2.68525E-02        -2.35695E-02         4.03409E-01         1.90652E+00         3.60663E+01         3.58020E+01         5.98347E+00        -2.64362E-01                   1
+          6.42277E-03         2.72024E-02        -2.41639E-02         4.03405E-01         1.92850E+00         3.64942E+01         3.62251E+01         6.01873E+00        -2.69097E-01                   1
+          6.42277E-03         2.75523E-02        -2.47660E-02         4.03401E-01         1.95049E+00         3.68188E+01         3.65438E+01         6.04515E+00        -2.75034E-01                   1
+          6.42277E-03         2.79022E-02        -2.53758E-02         4.03397E-01         1.97247E+00         3.70407E+01         3.67595E+01         6.06296E+00        -2.81162E-01                   1
+          6.42277E-03         2.82520E-02        -2.59931E-02         4.03393E-01         1.99445E+00         3.71606E+01         3.68728E+01         6.07229E+00        -2.87869E-01                   1
+          6.42277E-03         2.86019E-02        -2.66183E-02         4.03389E-01         2.01643E+00         3.71803E+01         3.68845E+01         6.07327E+00        -2.95717E-01                   1
+          6.42277E-03         2.89518E-02        -2.72512E-02         4.03385E-01         2.03842E+00         3.71014E+01         3.67978E+01         6.06612E+00        -3.03536E-01                   1
+          6.42277E-03         2.93016E-02        -2.78916E-02         4.03381E-01         2.06040E+00         3.69262E+01         3.66143E+01         6.05098E+00        -3.11816E-01                   1
+          6.42277E-03         2.96515E-02        -2.85399E-02         4.03377E-01         2.08238E+00         3.66571E+01         3.63359E+01         6.02793E+00        -3.21120E-01                   1
+          6.42277E-03         3.00014E-02        -2.91959E-02         4.03373E-01         2.10437E+00         3.62969E+01         3.59667E+01         5.99722E+00        -3.30228E-01                   1
+          6.42277E-03         3.03513E-02        -2.98597E-02         4.03369E-01         2.12635E+00         3.58487E+01         3.55083E+01         5.95888E+00        -3.40392E-01                   1
+          6.42277E-03         3.07011E-02        -3.05309E-02         4.03364E-01         2.14833E+00         3.53160E+01         3.49656E+01         5.91317E+00        -3.50445E-01                   1
+          6.42277E-03         3.10510E-02        -3.12100E-02         4.03360E-01         2.17032E+00         3.47020E+01         3.43408E+01         5.86010E+00        -3.61235E-01                   1
+          6.42277E-03         3.14009E-02        -3.18968E-02         4.03356E-01         2.19230E+00         3.40107E+01         3.36384E+01         5.79986E+00        -3.72342E-01                   1
+          6.42277E-03         3.17507E-02        -3.25911E-02         4.03351E-01         2.21428E+00         3.32463E+01         3.28624E+01         5.73258E+00        -3.83857E-01                   1
+          6.42277E-03         3.21006E-02        -3.32934E-02         4.03347E-01         2.23626E+00         3.24126E+01         3.20177E+01         5.65841E+00        -3.94929E-01                   1
+          6.42277E-03         3.24505E-02        -3.40033E-02         4.03342E-01         2.25825E+00         3.15142E+01         3.11075E+01         5.57741E+00        -4.06768E-01                   1
+          6.42277E-03         3.28003E-02        -3.47207E-02         4.03337E-01         2.28023E+00         3.05562E+01         3.01371E+01         5.48973E+00        -4.19089E-01                   1
+          6.42277E-03         3.31502E-02        -3.54461E-02         4.03333E-01         2.30221E+00         2.95429E+01         2.91115E+01         5.39551E+00        -4.31397E-01                   1
+          6.42277E-03         3.35001E-02        -3.61791E-02         4.03328E-01         2.32420E+00         2.84798E+01         2.80358E+01         5.29489E+00        -4.43938E-01                   1
+          6.42277E-03         3.38499E-02        -3.69196E-02         4.03323E-01         2.34618E+00         2.73726E+01         2.69156E+01         5.18802E+00        -4.57025E-01                   1
+          6.42277E-03         3.41998E-02        -3.76681E-02         4.03318E-01         2.36816E+00         2.62265E+01         2.57565E+01         5.07508E+00        -4.70058E-01                   1
+          6.42277E-03         3.45496E-02        -3.84240E-02         4.03314E-01         2.39014E+00         2.50484E+01         2.45647E+01         4.95628E+00        -4.83716E-01                   1
+          6.42277E-03         3.48995E-02        -3.91879E-02         4.03309E-01         2.41212E+00         2.38441E+01         2.33467E+01         4.83185E+00        -4.97329E-01                   1
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/isgi_centered.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_centered.ima.gz
new file mode 100644
index 0000000..9c64a61
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_centered.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/isgi_lattice.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_lattice.ima.gz
new file mode 100644
index 0000000..340c1f7
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_lattice.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/isgi_rotated.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_rotated.ima.gz
new file mode 100644
index 0000000..3cbefb3
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_rotated.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/isgi_variants.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_variants.ima.gz
new file mode 100644
index 0000000..97b66ea
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-6/isgi_variants.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/lattice.inp b/Tests/ReferenceData/IsGISAXS/ex-6/lattice.inp
new file mode 100755
index 0000000..99cb773
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-6/lattice.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+lattice
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA             0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+ T 
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.   2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2    0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          lattice 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           none          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         300        100            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          1	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/lattice_centred.inp b/Tests/ReferenceData/IsGISAXS/ex-6/lattice_centred.inp
new file mode 100755
index 0000000..96eac97
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-6/lattice_centred.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+lattice_centred
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA           0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.    2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2    0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          lattice 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           none           20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         300        100            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/lattice_rotated.inp b/Tests/ReferenceData/IsGISAXS/ex-6/lattice_rotated.inp
new file mode 100755
index 0000000..0231d9c
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-6/lattice_rotated.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+lattice_rotated
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA          0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.    2        100     100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0 
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          lattice 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        30           none           20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         300        100            30   120                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          1	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-6/lattice_variants.inp b/Tests/ReferenceData/IsGISAXS/ex-6/lattice_variants.inp
new file mode 100755
index 0000000..06b6186
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-6/lattice_variants.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+lattice_variants
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA        LMA           0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.    2        100     100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          lattice 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate           20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         300        100            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          1	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-7/isgi_morphology.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-7/isgi_morphology.ima.gz
new file mode 100644
index 0000000..1646a36
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-7/isgi_morphology.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-7/morphology.inp b/Tests/ReferenceData/IsGISAXS/ex-7/morphology.inp
new file mode 100755
index 0000000..1f93083
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-7/morphology.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+morphology
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   BA         DA               0             25                 ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     1       0  1             100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -2  2      -2   2      -2   0        200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+file                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5           none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2    0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          morif 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     3      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  sigma(nm)
+                                   0.007         25      100   
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-7/morphology.mor b/Tests/ReferenceData/IsGISAXS/ex-7/morphology.mor
new file mode 100755
index 0000000..9dad5f3
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-7/morphology.mor
@@ -0,0 +1,17 @@
+##############################################
+#   GISAXS SIMULATIONS : MORPHOLOGY PARAMETERS   
+##############################################
+
+# Total number of particles,  Cut-off radius(nm)
+          9                     20
+# Probability-Particle type-Positions(nm)-Orientation(deg)-Radius(nm)-Height/R-Width/R-Base angle(deg)-Height ratio-Flattening-FS Radii/R-Shell Thickness(nm)
+    0.5         box       0 0          0                 1           1         1        54.7356         0              1            0   0          0  0  0       
+    0.5         box       5 5          10                1           1         2        54.7356         0              1            0   0          0  0  0    
+    0.5         box     -5 -5          20                1           1         3        54.7356         0              1            0   0          0  0  0    
+    0.5         box      5 -5          30                1           1         4        54.7356         0              1            0   0          0  0  0    
+    0.5         box      -5 5          40                1           1         5        54.7356         0              1            0   0          0  0  0    
+    0.5         box       0 0          50                1           1         1        54.7356         0              1            0   0          0  0  0    
+    0.5         box       5 5          60                1           1         2        54.7356         0              1            0   0          0  0  0    
+    0.5         box     -5 -5          70                1           1         3        54.7356         0              1            0   0          0  0  0    
+    0.5         box      5 -5          80                1           1         4        54.7356         0              1            0   0          0  0  0    
+    0.5         box      -5 5          90                1           1         5        54.7356         0              1            0   0          0  0  0    
\ No newline at end of file
diff --git a/Tests/ReferenceData/IsGISAXS/ex-8/isgi_2DDL_lattice.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-8/isgi_2DDL_lattice.ima.gz
new file mode 100644
index 0000000..f23d0a2
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-8/isgi_2DDL_lattice.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-8/isgi_2DDL_lattice2.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-8/isgi_2DDL_lattice2.ima.gz
new file mode 100644
index 0000000..3aaea24
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-8/isgi_2DDL_lattice2.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-8/paracrystal.inp b/Tests/ReferenceData/IsGISAXS/ex-8/paracrystal.inp
new file mode 100755
index 0000000..b94ccc4
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-8/paracrystal.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_2DDL_lattice
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA          0             25              ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.    2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          2DDL_lattice 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           none          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         300        100            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                        0.5   2     2    0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          1	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-8/paracrystal_cut.inp b/Tests/ReferenceData/IsGISAXS/ex-8/paracrystal_cut.inp
new file mode 100755
index 0000000..0fb4559
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-8/paracrystal_cut.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_2DDL_lattice2
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA          0             25               ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0.     2         0.    2           100      100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+cylinder                1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5          none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+          2DDL_lattice 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           none          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         300        100            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                        0.5  0.5   0.5    0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          1	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z0.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z0.ima.gz
new file mode 100644
index 0000000..1dee6e3
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z0.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z0.inp b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z0.inp
new file mode 100755
index 0000000..cfaff87
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z0.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_pyramid_Z0
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA        0             25             ss
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0      2         0   2          100     100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+pyramid			 1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5            none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2     0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             0          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+         none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     5      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z45.ima.gz b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z45.ima.gz
new file mode 100644
index 0000000..5d93fb5
Binary files /dev/null and b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z45.ima.gz differ
diff --git a/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z45.inp b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z45.inp
new file mode 100755
index 0000000..4367867
--- /dev/null
+++ b/Tests/ReferenceData/IsGISAXS/ex-9/isgi_pyramid_Z45.inp
@@ -0,0 +1,74 @@
+##########################################
+#   GISAXS SIMULATIONS : INPUT PARAMETERS   
+###########################################
+
+# Base filename
+isgi_pyramid_Z45
+############################  Framework and beam  parameters ############################################
+# Framework   Diffuse,  Multilayer, Number of index slices, Polarization 
+   DWBA         LMA          0             25                ss 
+# Beam Wavelenght  :  Lambda(nm),  Wl_distribution,  Sigma_Wl/Wl,  Wl_min(nm), Wl_max(nm), nWl,  xWl
+                      0.1            none               0.3           0.08         0.12     20    3
+# Beam Alpha_i     :  Alpha_i(deg), Ai_distribution, Sigma_Ai(deg), Ai_min(deg), Ai_max(deg), nAi, xAi
+                       0.2            none           0.1         0.15              0.25    30   2
+# Beam 2Theta_i     :  2Theta_i(deg), Ti_distribution, Sigma_Ti(deg), Ti_min(deg), Ti_max(deg), nTi, XTi
+                         0              none             0.5            -0.5            0.5      10   2
+# Substrate :  n-delta_S,   n-beta_S,   Layer thickness(nm), n-delta_L,   n-beta_L,  RMS roughness(nm) 
+	         6.E-06        2.e-8          0.               1.E-05      5.E-07         0.
+# Particle : n-delta_I,     n-beta_I,     Depth(nm),  n-delta_SH,   n-beta_SH        
+            6.E-04          2.e-8         0         8.E-04          2.e-8
+################################# Grid parameters ######################################################
+# Ewald mode
+  T
+# Output angle (deg) :   Two theta min-max, Alphaf min-max,  n(1),   n(2)				
+                             0      2         0   2          100     100
+# Output q(nm-1) :  Qx min-max, Qy min-max, Qz min-max,  n(1), n(2), n(3)
+                     -1  1      -1   1      -2   0         200   200    1
+##################################   Particle parameters #################################################
+# Number of different particle types
+1
+# Particle type,     Probability
+pyramid			 1
+# Geometrical parameters : Base angle (deg),  Height ratio, Flattening,  FS-radii/R
+	                       54.73           1.		          1.          0.8    0.8
+# Shell thicknesses (nm) : dR,   dH,  dW
+                           0    0     0
+# H_uncoupled, W_uncoupled
+       T         T
+# Size of particle	: Radius(nm), R_distribution, SigmaR/R,	Rmin(nm),	Rmax(nm), nR, xR
+                           5            none            0.01       0.1         11      100   4
+# Height aspect ratio	: Height/R,   H_distribution, SigmaH/H,    Hmin/R,	Hmax/R,   nH, xH,   rho_H
+                           1          none            0.1       0.1         11       25   2      0
+# Width aspect ratio	: Width/R,   W_distribution, SigmaW/W,    Wmin/R,	Wmax/R,   nW, xW,   rho_W
+                            2          none                0.4        1         300       15   2   0
+# Orientation of particle : Zeta(deg), Z_distribution, SigmaZ(deg), Zmin(deg), Zmax(deg),	nZ, xZ
+                             45          none       20.            0             120     30   2
+##################################### Lattice parameters #################################################
+# Lattice type
+         none 
+#  Interference function :    Peak position D(nm),   w(nm), Statistics,  Eta_Voigt, Size-Distance coupling, Cut-off
+                               20                     7      gau	      0.5            0            10000000
+# Pair correlation function :   Density(nm-2), D1(nm),  Hard core coverage, CxR
+                                   0.007         25          0.3             1.  
+# Lattice parameters : L(1)(nm), L(2)(nm), Angle(deg,  Xi_fixed 
+                        10       10          90.           F
+                       Xi(deg), Xi_distribution, SigmaXi(deg), Ximin(deg),  Ximax(deg), nXi, xXi
+                        0           gate          20           0.            240.       3      -2
+                       Domain sizes DL(nm), DL_distribution, SigmaDL/DL, DLmin(nm), DLmax(nm), nDL, XDL
+                         20000   20000        none         0.2  0.2   200  200   10000  10000   10 10 -2 -2
+# Imperfect lattice :  Rod description,  Rod shape,  
+                        rec_ellip         cau cau
+                       Correlation lenghts(nm),  Rod orientation(deg)
+                         3000        1000            0   90                
+# Paracrystal :    Probability description
+                        ellip
+                   Disorder factors w(nm), DL-statistical distribution and rod orientation (deg)
+                       0.5  0.5   0.5  0.5
+                       cau   cau   cau   cau
+                        0   90     0    90
+# Pattern  :     Regular pattern content,   Number of particles per pattern
+	                      F                          2	
+                 Positions xp/L, Debye-Waller factors B11/L1 B22/L1 B12/L1 
+                   0.    0.     0.     0.   0.
+                   0.5  0.5     0.     0.   0.
+          
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.AnisoPyramid.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.AnisoPyramid.int.gz
new file mode 100644
index 0000000..60beb46
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.AnisoPyramid.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Box.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Box.int.gz
new file mode 100644
index 0000000..0fe30b6
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Box.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cone.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cone.int.gz
new file mode 100644
index 0000000..955c1ac
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cone.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cone6.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cone6.int.gz
new file mode 100644
index 0000000..13f156e
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cone6.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cuboctahedron.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cuboctahedron.int.gz
new file mode 100644
index 0000000..ea27f6b
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cuboctahedron.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cylinder.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cylinder.int.gz
new file mode 100644
index 0000000..5169551
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Cylinder.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Dodecahedron.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Dodecahedron.int.gz
new file mode 100644
index 0000000..8710da8
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Dodecahedron.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.EllipsoidalCylinder.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.EllipsoidalCylinder.int.gz
new file mode 100644
index 0000000..dc30031
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.EllipsoidalCylinder.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.FullSphere.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.FullSphere.int.gz
new file mode 100644
index 0000000..4e5002e
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.FullSphere.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.FullSpheroid.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.FullSpheroid.int.gz
new file mode 100644
index 0000000..9430589
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.FullSpheroid.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.HemiEllipsoid.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.HemiEllipsoid.int.gz
new file mode 100644
index 0000000..fcf141f
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.HemiEllipsoid.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Icosahedron.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Icosahedron.int.gz
new file mode 100644
index 0000000..c8a6bae
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Icosahedron.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Prism3.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Prism3.int.gz
new file mode 100644
index 0000000..a505d52
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Prism3.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Prism6.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Prism6.int.gz
new file mode 100644
index 0000000..d57a1f5
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Prism6.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Pyramid.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Pyramid.int.gz
new file mode 100644
index 0000000..e83eee2
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Pyramid.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Ripple1.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Ripple1.int.gz
new file mode 100644
index 0000000..6672eaf
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Ripple1.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Ripple2.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Ripple2.int.gz
new file mode 100644
index 0000000..8336fc4
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Ripple2.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Tetrahedron.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Tetrahedron.int.gz
new file mode 100644
index 0000000..b662c49
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.Tetrahedron.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedCube.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedCube.int.gz
new file mode 100644
index 0000000..67098d7
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedCube.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedSphere.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedSphere.int.gz
new file mode 100644
index 0000000..95a574b
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedSphere.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedSpheroid.int.gz b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedSpheroid.int.gz
new file mode 100644
index 0000000..76f821e
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AllFormFactorsAvailable.TruncatedSpheroid.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/ApproximationDA.ref.int.gz b/Tests/ReferenceData/PyPersist/ApproximationDA.ref.int.gz
new file mode 100644
index 0000000..2916daa
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/ApproximationDA.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/ApproximationLMA.ref.int.gz b/Tests/ReferenceData/PyPersist/ApproximationLMA.ref.int.gz
new file mode 100644
index 0000000..af067b2
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/ApproximationLMA.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/ApproximationSSCA.ref.int.gz b/Tests/ReferenceData/PyPersist/ApproximationSSCA.ref.int.gz
new file mode 100644
index 0000000..b7e9e17
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/ApproximationSSCA.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.bin.int.gz b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.bin.int.gz
new file mode 100644
index 0000000..4377ffe
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.bin.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.deg.int.gz b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.deg.int.gz
new file mode 100644
index 0000000..898e379
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.deg.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.mm.int.gz b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.mm.int.gz
new file mode 100644
index 0000000..d7d8cfe
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.mm.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.nm-1.int.gz b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.nm-1.int.gz
new file mode 100644
index 0000000..6f533c0
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/AxesInDifferentUnits.nm-1.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/BeamDivergence.ref.int.gz b/Tests/ReferenceData/PyPersist/BeamDivergence.ref.int.gz
new file mode 100644
index 0000000..6d2e7f6
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/BeamDivergence.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/BuriedParticles.ref.int.gz b/Tests/ReferenceData/PyPersist/BuriedParticles.ref.int.gz
new file mode 100644
index 0000000..dc44c01
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/BuriedParticles.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CoreShellNanoparticles.ref.int.gz b/Tests/ReferenceData/PyPersist/CoreShellNanoparticles.ref.int.gz
new file mode 100644
index 0000000..4380b01
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CoreShellNanoparticles.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CorrelatedRoughness.ref.int.gz b/Tests/ReferenceData/PyPersist/CorrelatedRoughness.ref.int.gz
new file mode 100644
index 0000000..54872b2
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CorrelatedRoughness.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CosineRipplesAtRectLattice.ref.int.gz b/Tests/ReferenceData/PyPersist/CosineRipplesAtRectLattice.ref.int.gz
new file mode 100644
index 0000000..9a91b68
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CosineRipplesAtRectLattice.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CustomFormFactor.ref.int.gz b/Tests/ReferenceData/PyPersist/CustomFormFactor.ref.int.gz
new file mode 100644
index 0000000..e531bec
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CustomFormFactor.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CylindersAndPrisms.ref.int.gz b/Tests/ReferenceData/PyPersist/CylindersAndPrisms.ref.int.gz
new file mode 100644
index 0000000..fceb6a8
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CylindersAndPrisms.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CylindersInBA.ref.int.gz b/Tests/ReferenceData/PyPersist/CylindersInBA.ref.int.gz
new file mode 100644
index 0000000..2ce8add
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CylindersInBA.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CylindersInDWBA.ref.int.gz b/Tests/ReferenceData/PyPersist/CylindersInDWBA.ref.int.gz
new file mode 100644
index 0000000..c16cb28
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CylindersInDWBA.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/CylindersWithSizeDistribution.ref.int.gz b/Tests/ReferenceData/PyPersist/CylindersWithSizeDistribution.ref.int.gz
new file mode 100644
index 0000000..3206c12
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/CylindersWithSizeDistribution.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/DetectorResolutionFunction.ref.int.gz b/Tests/ReferenceData/PyPersist/DetectorResolutionFunction.ref.int.gz
new file mode 100644
index 0000000..c852395
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/DetectorResolutionFunction.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/HexagonalLatticesWithBasis.ref.int.gz b/Tests/ReferenceData/PyPersist/HexagonalLatticesWithBasis.ref.int.gz
new file mode 100644
index 0000000..b91ed34
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/HexagonalLatticesWithBasis.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/Interference1DLattice.ref.int.gz b/Tests/ReferenceData/PyPersist/Interference1DLattice.ref.int.gz
new file mode 100644
index 0000000..dc56252
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/Interference1DLattice.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/Interference1DRadialParaCrystal.ref.int.gz b/Tests/ReferenceData/PyPersist/Interference1DRadialParaCrystal.ref.int.gz
new file mode 100644
index 0000000..5b43b4c
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/Interference1DRadialParaCrystal.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/Interference2DCenteredSquareLattice.ref.int.gz b/Tests/ReferenceData/PyPersist/Interference2DCenteredSquareLattice.ref.int.gz
new file mode 100644
index 0000000..68bbb13
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/Interference2DCenteredSquareLattice.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/Interference2DLatticeSumOfRotated.ref.int.gz b/Tests/ReferenceData/PyPersist/Interference2DLatticeSumOfRotated.ref.int.gz
new file mode 100644
index 0000000..ba76264
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/Interference2DLatticeSumOfRotated.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/Interference2DParaCrystal.ref.int.gz b/Tests/ReferenceData/PyPersist/Interference2DParaCrystal.ref.int.gz
new file mode 100644
index 0000000..5a04577
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/Interference2DParaCrystal.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/Interference2DRotatedSquareLattice.ref.int.gz b/Tests/ReferenceData/PyPersist/Interference2DRotatedSquareLattice.ref.int.gz
new file mode 100644
index 0000000..933e0b1
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/Interference2DRotatedSquareLattice.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/Interference2DSquareLattice.ref.int.gz b/Tests/ReferenceData/PyPersist/Interference2DSquareLattice.ref.int.gz
new file mode 100644
index 0000000..2ab2ab4
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/Interference2DSquareLattice.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.LargeAn.int.gz b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.LargeAn.int.gz
new file mode 100644
index 0000000..e71954b
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.LargeAn.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.LargeMC.int.gz b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.LargeMC.int.gz
new file mode 100644
index 0000000..da71d35
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.LargeMC.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.SmallAn.int.gz b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.SmallAn.int.gz
new file mode 100644
index 0000000..235492d
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.SmallAn.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.SmallMC.int.gz b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.SmallMC.int.gz
new file mode 100644
index 0000000..4ef4470
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/LargeParticlesFormFactor.SmallMC.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/OffSpecularSimulation.ref.int.gz b/Tests/ReferenceData/PyPersist/OffSpecularSimulation.ref.int.gz
new file mode 100644
index 0000000..172359c
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/OffSpecularSimulation.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/RectangularDetector.difference.int.gz b/Tests/ReferenceData/PyPersist/RectangularDetector.difference.int.gz
new file mode 100644
index 0000000..d926f00
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/RectangularDetector.difference.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/RectangularDetector.rectangular.int.gz b/Tests/ReferenceData/PyPersist/RectangularDetector.rectangular.int.gz
new file mode 100644
index 0000000..59348fc
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/RectangularDetector.rectangular.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/RectangularDetector.spherical.int.gz b/Tests/ReferenceData/PyPersist/RectangularDetector.spherical.int.gz
new file mode 100644
index 0000000..6fe87ec
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/RectangularDetector.spherical.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/RectangularGrating.ref.int.gz b/Tests/ReferenceData/PyPersist/RectangularGrating.ref.int.gz
new file mode 100644
index 0000000..5e56e52
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/RectangularGrating.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/RotatedPyramids.ref.int.gz b/Tests/ReferenceData/PyPersist/RotatedPyramids.ref.int.gz
new file mode 100644
index 0000000..eee5e53
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/RotatedPyramids.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/SampleParametersIntro.0.int.gz b/Tests/ReferenceData/PyPersist/SampleParametersIntro.0.int.gz
new file mode 100644
index 0000000..1e03042
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/SampleParametersIntro.0.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/SampleParametersIntro.1.int.gz b/Tests/ReferenceData/PyPersist/SampleParametersIntro.1.int.gz
new file mode 100644
index 0000000..e133401
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/SampleParametersIntro.1.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/SampleParametersIntro.2.int.gz b/Tests/ReferenceData/PyPersist/SampleParametersIntro.2.int.gz
new file mode 100644
index 0000000..6fc96c1
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/SampleParametersIntro.2.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/SampleParametersIntro.3.int.gz b/Tests/ReferenceData/PyPersist/SampleParametersIntro.3.int.gz
new file mode 100644
index 0000000..5e4e8ad
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/SampleParametersIntro.3.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/SpecularSimulation.ref.yaml b/Tests/ReferenceData/PyPersist/SpecularSimulation.ref.yaml
new file mode 100644
index 0000000..9fcb5c7
--- /dev/null
+++ b/Tests/ReferenceData/PyPersist/SpecularSimulation.ref.yaml
@@ -0,0 +1,12164 @@
+coeff_R: [[1.0, 1.0, 0.9999999999999999, 1.0, 1.0, 0.9999999999999999, 1.0,
+        0.9999999999999999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        0.9999999999999999, 0.9999999999999999, 1.0, 0.9999999999999999,
+        1.0, 1.0, 0.9999999999999999, 1.0, 0.9999999999999999, 0.9999999999999999,
+        1.0, 1.0, 0.9999999999999999, 1.0, 0.9999999999999999, 1.0, 0.9999999999999999,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9999999999999999, 1.0, 0.9999999999999999,
+        0.9999999999999999, 1.0, 0.9999999999999999, 0.9999999999999999,
+        1.0, 1.0, 0.9999999999999999, 1.0, 0.9999999999999999, 0.9999999999999999,
+        1.0, 1.0, 1.0, 0.9999999999999999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        0.9999999999999999, 0.9999999999999999, 1.0, 0.9999999999999999,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9999999999999999, 1.0, 1.0,
+        1.0, 1.0, 1.0, 0.9999999999999999, 1.0, 0.9999999999999999, 1.0,
+        0.9999999999999999, 1.0, 1.0, 0.9999999999999999, 0.9999999999999999,
+        1.0, 1.0, 1.0, 0.9999999999999999, 0.9999999999999999, 0.9999999999999999,
+        1.0, 1.0, 1.0, 0.9999999999999999, 1.0, 1.0, 1.0, 0.9999999999999999,
+        0.9999999999999999, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9999999999999999,
+        1.0, 1.0, 1.0, 0.9999999999999999, 1.0, 1.0, 0.9999999999999999,
+        1.0, 1.0, 0.9999999999999999, 1.0, 1.0, 0.9999999999999999, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9999999999999999,
+        0.9999999999999999, 1.0, 1.0, 0.9999999999999999, 1.0, 0.9999999999999999,
+        0.9999999999999999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9999999999999999,
+        0.9999999999999999, 1.0, 0.9999999999999999, 0.9999999999999999,
+        1.0, 1.0, 1.0, 1.0, 0.8512380424211637, 0.7380144834849892, 0.6096006719018573,
+        0.44535820574272966, 0.278678082522423, 0.24319785606410124, 0.3495332651997906,
+        0.4555075404876353, 0.5252190557523305, 0.5604339846160725, 0.5661851897442107,
+        0.5444907415464123, 0.49380175810734894, 0.4099350612954126, 0.28870102685194754,
+        0.13127101231194904, 0.04977318726616108, 0.23117955239001256, 0.39071750593944715,
+        0.5176659335143483, 0.6127536356281731, 0.6820419983789654, 0.7321928152572491,
+        0.7686058423887675, 0.7951662695544666, 0.814521755553523, 0.8284230362878786,
+        0.8379949548882419, 0.8439237662538082, 0.846576434909264, 0.8460694702662732,
+        0.842300345355182, 0.8349499960052401, 0.8234618842008273, 0.8070025082641089,
+        0.7844117735231672, 0.7541627151095999, 0.714373795262797, 0.6629566456589497,
+        0.5980258352596574, 0.5186918180667348, 0.4262042430022863, 0.3251060071060279,
+        0.2241158953917732, 0.13870740671222498, 0.10150342026149665, 0.1288526840168076,
+        0.17405533476382523, 0.21194590814923553, 0.23719787072452808, 0.249385199162751,
+        0.24937770611929821, 0.23847584057529847, 0.21825612369831654, 0.19067135293704573,
+        0.15830167724174887, 0.12485122611555217, 0.09621876182183191, 0.08143751743583329,
+        0.08641926473576086, 0.10426760682471944, 0.12481505965914319, 0.14238599935416224,
+        0.15443615491494778, 0.1599322809760354, 0.1586540981298069, 0.1509235776128152,
+        0.1375234169574915, 0.11973343208260233, 0.09950641917041311, 0.0799069736275803,
+        0.0658121829936284, 0.06284774105734547, 0.07136391786196256, 0.08551878525318625,
+        0.09993812788798868, 0.11162224776897346, 0.11906181273994405, 0.12158129199115025,
+        0.1190475283763105, 0.11175346883757366, 0.10039397326078715, 0.08612466271058776,
+        0.0707618587575364, 0.0572376135109461, 0.04991445598656294, 0.05207203282692674,
+        0.06152523229474857, 0.07347475503442157, 0.08455974871371683, 0.09296288293349356,
+        0.09775553669218293, 0.09854675795335026, 0.09533393676062403, 0.08844676430829206,
+        0.07854884792965282, 0.06671013706230092, 0.054616563302764064,
+        0.044969791171141346, 0.041339198457340326, 0.0452473981966463,
+        0.053966646618038114, 0.06389796601966939, 0.07274760561690373,
+        0.0792671255717047, 0.08281152778823253, 0.08312178820002608, 0.08023224475650716,
+        0.0744367228296489, 0.06629487145153666, 0.05669301619037358, 0.04700755607699403,
+        0.039381329216328954, 0.03652506712091183, 0.039605375269215565,
+        0.04668707137104594, 0.05502420308090559, 0.06275131084049244, 0.06880366277364239,
+        0.07259862851170407, 0.07386082324194011, 0.0725424880549816, 0.06878993832127094,
+        0.0629382295556319, 0.055537372271979635, 0.04743389063189791, 0.039943407080098046,
+        0.03501197082944881, 0.034611978974972576, 0.03890894969331585,
+        0.046072110723112444, 0.054131401852422455, 0.061766394461159925,
+        0.06816454494387826, 0.07281552758927805, 0.07539778605954192, 0.07572427773614009,
+        0.0737190074156648, 0.06941381598189002, 0.06296847659675062, 0.054736435286498485,
+        0.04544827844793469, 0.03671339686639326, 0.03197649083845292, 0.03544927636283824,
+        0.04677311101812649, 0.06250577365610317, 0.08029122448289706, 0.09885668678880567,
+        0.1174022167211642, 0.13533575482943155, 0.1521792049173181, 0.16753602055244543,
+        0.18108020147724252, 0.19255217845542288, 0.2017562047657836, 0.20855741226260363,
+        0.212878141061441, 0.21469371179649205, 0.21402794861635463, 0.21094870517117412,
+        0.20556352267572328, 0.19801543557643647, 0.18847887808191663, 0.17715564806983417,
+        0.16427094664705824, 0.150069613441753, 0.1348128032036034, 0.11877551234343736,
+        0.1022456635807115, 0.08552623163686461, 0.06894425328773757, 0.05287861668430692,
+        0.03785028585262572, 0.024865075360551245, 0.016717967535676198,
+        0.017901280355780782, 0.025124426578179027, 0.03312163401525281,
+        0.040097274927417645, 0.0454665195621427, 0.04899543877324104, 0.050598738408651645,
+        0.05028406812354004, 0.04813400480070082, 0.0442995179305718, 0.0389981257948587,
+        0.0325175915668394, 0.02523719327465842, 0.017723551504549743, 0.011210620510263307,
+        0.009236582549925031, 0.01351846400883872, 0.019658823652123382,
+        0.025492572447603744, 0.030325039462184077, 0.03383325780659255,
+        0.035843946153093664, 0.03628248945429607, 0.03515748013948715,
+        0.03255378825484689, 0.028628017265256607, 0.02360695808487788,
+        0.017799108455891683, 0.011676005241715276, 0.006471664005543431,
+        0.006573730155190034, 0.011520698742477598, 0.01695780557905323,
+        0.02177988388067562, 0.025605556848133103, 0.028226237176309694,
+        0.029525643845011895, 0.02946267836023251, 0.028065654852898348,
+        0.025428257416951556, 0.021705639986842214, 0.01711317526222134,
+        0.01194270396065161, 0.006707200337275171, 0.0037334096059025647,
+        0.007126400791023603, 0.012016307534989322, 0.01654451989293229,
+        0.020300185868369944, 0.023072094204245972, 0.024732022120852886,
+        0.02521681052526023, 0.024524055260005798, 0.02270936760550567,
+        0.01988298931876939, 0.016206371087911516, 0.0118938425144683, 0.007252229517203274,
+        0.003181326053649061, 0.00436334389652836, 0.008641743653057981,
+        0.01280392064888501, 0.01637165673858551, 0.019135558783377003,
+        0.02096416066760661, 0.02178254151994198, 0.02156866082971733, 0.020351641505209732,
+        0.018209295235313727, 0.015264829661275478, 0.011684910981124199,
+        0.0076913036221880875, 0.0037070806817968887, 0.0026055235749358682,
+        0.006118616472328664, 0.009894901120328429, 0.013236329946098824,
+        0.015927602919365163, 0.017835932827123615, 0.018879115125068055,
+        0.019021203282842333, 0.018271354576537863, 0.016682181136692047,
+        0.014347147257518253, 0.011398094994760776, 0.00800862810387121,
+        0.004446384149246607, 0.0019296996881781638, 0.0041746680754064305,
+        0.007534036770454582, 0.010630943705877607, 0.013216522868620682,
+        0.015154125796691485, 0.01635599772328101, 0.01677564875578629,
+        0.01640657196339064, 0.015281194334412728, 0.013469098378544484,
+        0.011075146364834925, 0.008241149108922385, 0.005172643330227893,
+        0.0024301180240996526, 0.002847367346794632, 0.0056351184896834775,
+        0.00844633718672175, 0.010891300429196827, 0.012815396962599658,
+        0.014123776586045309, 0.014761577590699631, 0.014710824680283502,
+        0.013989814206486017, 0.012652938586881057, 0.010791991816231071,
+        0.008544504284089757, 0.006133047068972155, 0.004053526130287933,
+        0.00357396443151331, 0.005157036727278475, 0.007389337785342093,
+        0.009537350534091956, 0.011333684192368045, 0.01264301503135725,
+        0.013387692624263169, 0.013529976973060692, 0.01306653473050041,
+        0.012025653561771522, 0.010464856210913398, 0.008468895497856847,
+        0.006151057159386147, 0.003678129529281687, 0.0015983105946367254,
+        0.0024742713131756136, 0.004770618021313968, 0.006976415430195392,
+        0.008860616495600012, 0.010315500978592027, 0.011272227762166982,
+        0.01169105525534243, 0.011559688301936166, 0.010892394795368913,
+        0.009728506532429881, 0.008130006871231985, 0.006178212041378903,
+        0.003969712964339108, 0.0016124095386583356, 0.000793307942681379,
+        0.0031119191622758858, 0.005253517233279311, 0.007118153928483956,
+        0.00862348590474117, 0.009705405323370503, 0.010320541905563425,
+        0.010447887687079207, 0.010089389398683441, 0.009269496536481112,
+        0.008033725807200378, 0.0064464057077946646, 0.004588098042313065,
+        0.0025557033696150403, 0.0005611479246564308, 0.0017726243898592159,
+        0.003754484721022888, 0.005551431556783395, 0.007069766817997569,
+        0.008241461418599312, 0.009017229463715118, 0.00936728030923601,
+        0.009282087126516991, 0.008772428322940215, 0.007868606414774661,
+        0.0066189440595696095, 0.005087952496404205, 0.00335601937873685,
+        0.0015393621031649996, 0.0007337994057096207, 0.002406887211999343,
+        0.0041092299519153615, 0.005617809655484389, 0.006854559509686607,
+        0.007764159800587457, 0.008309026516603335, 0.008469447886611721,
+        0.008243856880001838, 0.007648555310990446, 0.006716824547609136,
+        0.005497651025680592, 0.004055050404499144, 0.00247391013695987,
+        0.000959653353027473, 0.001247219533076415, 0.0027712487480048803,
+        0.004241123375537217, 0.005519796656225713, 0.006541162353700764,
+        0.007259642129181372, 0.0076460583438594035, 0.007687396669097025,
+        0.0073867839155690364, 0.006763087792928948, 0.005850144819074636,
+        0.004696094582821575, 0.0033650047410850375, 0.0019557317116305206,
+        0.000859863158536264, 0.0015650514798312481, 0.0029145716677390827,
+        0.0042042103847823795, 0.0053178729433470745, 0.006196337346913398,
+        0.006800026753803868, 0.007104507646590361, 0.007099853722348986,
+        0.006790449042188413, 0.006194628306213976, 0.00534423180563639,
+        0.004284868569228388, 0.0030804936225012785, 0.0018457027630530809,
+        0.0010345037221814787, 0.0016706573970579272, 0.0028629423753228716,
+        0.00403833042867456, 0.005071417888678988, 0.005902250575040581,
+        0.006491997194246712, 0.006816072039110747, 0.006862759138994187,
+        0.006632835982136612, 0.006139330607258089, 0.00540743418560877,
+        0.004475366687775655, 0.003399486182281335, 0.00228032277121464,
+        0.0014154177539316955, 0.0015891795078764473, 0.0026003175299509893,
+        0.0037620497900103336, 0.004865742869394189, 0.005830372219072139,
+        0.0066070392369155405, 0.007161640631942347, 0.0074708112954126205,
+        0.007520751900852698, 0.007306792473083042, 0.006833239985373897,
+        0.0061136912096533625, 0.005172840709143199, 0.004053763047989396,
+        0.0028497421208324466, 0.0018716846050801565, 0.002017580466222357,
+        0.003316272524239777, 0.005004704088866154, 0.006819936273982337,
+        0.008671324472394585, 0.010507576959164162, 0.012290104060239983,
+        0.013986271980522668, 0.015567319827496352, 0.017007661733560085,
+        0.018284687306147455, 0.019378775408319657, 0.02027341413977035,
+        0.02095537692675877, 0.021414922708770504, 0.021645993340145463,
+        0.02164638290085459, 0.021417855296845714, 0.02096618968285327,
+        0.02030113816756461, 0.01943628676046804, 0.018388818188322453,
+        0.01717918366840915, 0.015830699883758126, 0.014369097889641925,
+        0.012822064741268107, 0.011218842535213915, 0.009590000229795332,
+        0.007967619548817978, 0.0063864899184324, 0.004888022445569928,
+        0.0035324998775386335, 0.002438459402138869, 0.0018676585942912001,
+        0.0020410190328086645, 0.0026433013618563654, 0.003314019145051176,
+        0.003908115893882533, 0.004373148834409943, 0.004688923124874814,
+        0.004849256610765542, 0.004856016018116426, 0.00471689968591878,
+        0.004444569718847526, 0.004056445762504782, 0.0035751247337282538,
+        0.00302995992857134, 0.0024614694844126493, 0.0019327751825043828,
+        0.0015519149135802494, 0.0014607590624898198, 0.0016813680976488024,
+        0.0020687477727328535, 0.002488692835770858, 0.0028678540205876626,
+        0.0031673993282034557, 0.0033657221390915194, 0.003451508429801917,
+        0.003421064529211275, 0.0032772666779494848, 0.0030292348192851896,
+        0.0026926030743167555, 0.0022909021587639465, 0.0018598187749341668,
+        0.0014588861703870221, 0.001193261334175928, 0.0011876517252339485,
+        0.001429640117562081, 0.001783334970250467, 0.002145312693123904,
+        0.0024607877660044928, 0.002699844428098373, 0.0028454983352202,
+        0.002889219258176057, 0.002829249815736804, 0.0026699768186815727,
+        0.0024218587334484706, 0.002102067918940354, 0.0017368690231782122,
+        0.0013688327403292995, 0.0010749849352673828, 0.0009769275518474382,
+        0.001129291220180349, 0.001427732448918055, 0.001759055831224831,
+        0.002061631930419559, 0.002302986081411676, 0.0024647450364412124,
+        0.00253701191106847, 0.00251633257717284, 0.002404936480683203,
+        0.0022105416993801904, 0.0019467097123680112, 0.0016343987338323228,
+        0.001306802263581108, 0.0010223564159683321, 0.0008811458463752984,
+        0.0009628677917400877, 0.0012057969635417005, 0.0015012115174914606,
+        0.0017837248519200466, 0.0020191914271510294, 0.0021884585732653812,
+        0.0022808034555446715, 0.00229154540853943, 0.002221148275529697,
+        0.002074926683687909, 0.0018631983021541293, 0.0016022282387644516,
+        0.001317167561338401, 0.0010498979854635774, 0.0008726531307590274,
+        0.0008697237066951445, 0.0010377238918539563, 0.00128927018708927,
+        0.0015531690299672141, 0.001790094161848027, 0.0019780687495885006,
+        0.0021042595928115484, 0.0021617203485282525, 0.0021481136838770397,
+        0.0020652067885040333, 0.0019187674335182743, 0.0017188969187726048,
+        0.0014812473682224282, 0.0012303348446353547, 0.001007138771869222,
+        0.0008776527654294651, 0.0009055136258364392, 0.0010777333862054875,
+        0.0013243909396233634, 0.00158859436069589, 0.001836758427161404,
+        0.002048673221248927, 0.0022112256478879267, 0.0023156344866775785,
+        0.002356266886920613, 0.0023301325787620547, 0.0022367317254219986,
+        0.002078220505400587, 0.0018601209528511093, 0.0015933551147524255,
+        0.0013000585252152248, 0.0010304045747451538, 0.0008960423646684284,
+        0.0010264033438741559, 0.0013902658721523698, 0.0018786386191975962,
+        0.0024272562926222147, 0.0030037012009364325, 0.003587998179702698,
+        0.004165106564778171, 0.004722286147606579, 0.00524817281745161,
+        0.005732495160281057, 0.006166050211937646, 0.006540785012978279,
+        0.006849913572131272, 0.007088032439206837, 0.007251213702126433,
+        0.007337062901217274, 0.007344735220402901, 0.007274907921863718,
+        0.00712971088382018, 0.006912620394877392, 0.006628324004964835,
+        0.006282566140552627, 0.005881985309603858, 0.00543395412762075,
+        0.0049464334103694815, 0.004427852029054125, 0.003887027068328457,
+        0.0033331490145604033, 0.0027758882011426145, 0.0022257768816517426,
+        0.0016953579611688574, 0.001202937974885857, 0.0007869687094589379,
+        0.0005556831960190223, 0.0006411443224791862, 0.000898781536473974,
+        0.0011729290458253325, 0.0014128715395596643, 0.0016012429792281017,
+        0.0017307098263576834, 0.0017983219896557034, 0.001803898993702363,
+        0.0017494900345598591, 0.0016391671367450688, 0.0014789476446499593,
+        0.0012768366781380548, 0.0010431790539411686, 0.0007921004855179096,
+        0.0005474792129499463, 0.00036864652992458195, 0.0003770827773565333,
+        0.0005481845269158786, 0.0007562676072969364, 0.0009503929601842425,
+        0.0011113968340937853, 0.0012294834037598706, 0.0012991129948798298,
+        0.0013176770490477428, 0.0012850782733488657, 0.0012035499261159102,
+        0.00107754828875372, 0.0009137328446304294, 0.0007212771993546079,
+        0.0005136473048801488, 0.0003185361848632477, 0.0002293067256522533,
+        0.000343054564651589, 0.0005280807891657444, 0.0007094392414059846,
+        0.0008654922297899064, 0.000986069520247131, 0.0010651472465381116,
+        0.0010993895878405138, 0.0010877754731868866, 0.001031457457208564,
+        0.0009336612029798795, 0.0007996081361319954, 0.0006365869925895855,
+        0.00045479880708083637, 0.0002730002875889197, 0.00016316514523326365,
+        0.0002582159868621553, 0.00042815395721936184, 0.0005938149508108865,
+        0.0007365575185858496, 0.0008476456203051829, 0.000921703008514687,
+        0.000955630234792434, 0.0009483662088186573, 0.0009008003954419399,
+        0.000815692096094587, 0.0006975850162576519, 0.0005528092803644162,
+        0.0003900376639288853, 0.00022468153575277983, 0.00012378567300840455,
+        0.00022244648219210393, 0.0003792198111404539, 0.0005282837082971324,
+        0.0006554631644750458, 0.0007536055731712135, 0.0008181497359984413,
+        0.0008464619129824265, 0.0008377055264448905, 0.0007927872067800328,
+        0.0007142882742251432, 0.0006063811221845996, 0.00047481521074172476,
+        0.00032740643980945093, 0.0001784380154255685, 0.0001015920669099622,
+        0.00020959925470404636, 0.0003526662219251608, 0.0004852472839973529,
+        0.0005968060356398461, 0.0006814879892914861, 0.0007354851739293707,
+        0.0007566567565238779, 0.0007444610369697507, 0.0006999173928076552,
+        0.000625544018408209, 0.0005252811053029195, 0.000404491173707067,
+        0.0002705216806464315, 0.0001381719789086465, 9.524246146693212e-05,
+        0.00020725531112600104, 0.00033605068448416814, 0.00045289656932886253,
+        0.000549683629231744, 0.0006215571984077357, 0.0006653612737559513,
+        0.0006794148575928808, 0.0006634727143923211, 0.0006186931479364385,
+        0.0005475815901074356, 0.00045393113495169714, 0.0003428802370779365,
+        0.00022175813577860184, 0.00010841183115405822, 0.00010223818630557895,
+        0.00020970090358003239, 0.0003239880495184304, 0.00042601630107518804,
+        0.0005091382912287615, 0.0005692521952532898, 0.000603757733434551,
+        0.0006113970592620301, 0.0005922266320789254, 0.0005475964952939353,
+        0.00048012804714279734, 0.00039375459564886336, 0.00029410978083828793,
+        0.00019081176760006471, 0.00011283465432709564, 0.00013629075855303924,
+        0.00022753065169552395, 0.0003246345532406885, 0.00041118989467130455,
+        0.000480595082414415, 0.0005289688928298892, 0.0005539750062106665,
+        0.0005545627003761921, 0.000530880314751761, 0.00048420549764848853,
+        0.0004168514185966668, 0.000332038774977273, 0.00023373408759842052,
+        0.00012645955903157327, 1.5086076321585695e-05, 9.541352572869702e-05,
+        0.00020013597702951612, 0.0002945225749724177, 0.00037452651382981775,
+        0.0004367939923957067, 0.0004788044943335028, 0.0004989723998789397,
+        0.0004967060404500398, 0.00047242265069786973, 0.00042752043806899885,
+        0.0003643133670707414, 0.00028594567506857115, 0.00019635727197728778,
+        0.00010088664344476092, 3.0605194971107045e-05, 0.00010810098421267863,
+        0.00019942498515422948, 0.00028210364639991446, 0.00035159492916613644,
+        0.0004047721760591929, 0.0004394179670102062, 0.0004542123474866591,
+        0.00044875487081818703, 0.0004235641015319423, 0.0003800455092561595,
+        0.0003204331782484428, 0.0002477327750749712, 0.00016580110261314217,
+        8.083971359205166e-05, 4.0230899759763704e-05, 0.00011394180229501742,
+        0.0001950212507586619, 0.0002680753002711289, 0.0003288952244593009,
+        0.00037468210554616907, 0.00040351120099501887, 0.0004142907364558918,
+        0.00040676871864878285, 0.00038152556361979, 0.00033994239343805257,
+        0.0002841528636268523, 0.0002170187219394038, 0.0001423420661251041,
+        6.747988023299205e-05, 4.7528459519836654e-05, 0.00011526431373357823,
+        0.00018772989242765598, 0.0002528028651519225, 0.0003066177069383455,
+        0.0003466571658414918, 0.0003712285641860512, 0.000379406128730928,
+        0.00037102827727794087, 0.0003466871730204039, 0.0003077007010090291,
+        0.00025607809238247496, 0.00019453456967064278, 0.00012685568920182437,
+        6.160869876592327e-05, 5.2189147681192014e-05, 0.00011261566323615575,
+        0.0001777483934001646, 0.00023643749770337917, 0.0002849790737373726,
+        0.0003210396483612365, 0.00034307514426868996, 0.00035024859727313123,
+        0.00034241810744343846, 0.0003201254878449355, 0.00028457475217438273,
+        0.00023761464858476774, 0.00018179404943382258, 0.00012085081892301337,
+        6.373860426309206e-05, 5.44130375116663e-05, 0.00010590629768902283,
+        0.00016484997501973266, 0.00021892879429971567, 0.00026425465433453193,
+        0.0002985242475061405, 0.0003202270101318062, 0.00032851092467283587,
+        0.0003231559683098573, 0.00030456223933960936, 0.0002737365699610367,
+        0.00023229144099989782, 0.0001825255771301215, 0.0001279112523009828,
+        7.613494664076473e-05, 5.687588388308856e-05, 9.467831250162099e-05,
+        0.0001480756802432581, 0.00019979273144520504, 0.00024486804441814947,
+        0.00028071352082861215, 0.00030565256028950127, 0.0003186432456178748,
+        0.0003192145908543466, 0.0003074480048533686, 0.00028396904443123584,
+        0.00024995345594443604, 0.00020719232018611493], [0.0005129200273857926,
+        0.0015392625630668382, 0.002567113997513955, 0.0035974844661026857,
+        0.004631390330907904, 0.0056698569747731225, 0.006713921163892017,
+        0.007764633894429467, 0.00882306305807979, 0.00989029627523969,
+        0.01096744381981159, 0.012055641695414706, 0.013156054757742031,
+        0.014269880092100888, 0.015398350471858481, 0.016542738071850572,
+        0.017704358362734703, 0.018884574246773006, 0.02008480048489239,
+        0.021306508366374724, 0.022551230783348683, 0.02382056759394345,
+        0.025116191434782557, 0.026439853971797204, 0.027793392645243033,
+        0.029178737953831625, 0.030597921384435848, 0.03205308398377418,
+        0.03354648572187908, 0.035080515653595754, 0.036657703079592034,
+        0.03828072969170181, 0.03995244293692198, 0.04167587065747811, 0.04345423722735272,
+        0.04529098130807122, 0.04718977548625794, 0.0491545479680108, 0.05118950666626005,
+        0.053299165915619756, 0.05548837624835974, 0.05776235756461484,
+        0.06012673624957487, 0.0625875867186077, 0.06515147811641644, 0.06782552680102558,
+        0.07061745568289456, 0.07353566121165137, 0.07658928950415016, 0.07978832282714018,
+        0.08314367831773609, 0.08666732095515689, 0.09037239320910309, 0.09427336441825357,
+        0.09838620344900838, 0.10272857897504745, 0.10732009282894017, 0.11218255282977896,
+        0.11734029333081568, 0.12282055345650232, 0.12865392562650843, 0.1348748902302087,
+        0.1415224565011455, 0.14864093522465793, 0.15628087629859244, 0.16450021407648877,
+        0.17336567666911717, 0.18295453370330242, 0.19335678230932984, 0.20467790631588198,
+        0.2170423939547914, 0.23059827178686165, 0.24552301884314534, 0.26203138327518216,
+        0.28038586571726887, 0.3009110092813334, 0.3240132369034074, 0.3502089610593416,
+        0.38016535823570957, 0.4147611243188479, 0.45517986685144135, 0.5030590207389084,
+        0.5607378974506354, 0.6316933722704606, 0.721357301203807, 0.8387851206774961,
+        1.0004669115491984, 1.2405255284338998, 1.645573015718536, 2.542144856686667,
+        10.61122968183272, 3.704729008968028, 2.5901924071674727, 2.1266741246516916,
+        1.8595787972031323, 1.6820749907293902, 1.5541602851522576, 1.4570458007770535,
+        1.380598193134844, 1.3188133999063683, 1.2678824545656882, 1.2252604232600388,
+        1.1891767324729123, 1.158359391011678, 1.1318710270747467, 1.1090071126269592,
+        1.0892306672661864, 1.0721294643725916, 1.0573879286165508, 1.044769456882473,
+        1.034107317841022, 1.0253046905320158, 1.018348491401052, 1.0133524985722127,
+        1.010685457452452, 1.0114587163032651, 1.0210995218638894, 1.281752405784205,
+        1.029059914525033, 1.1693442562044634, 1.0628629347630054, 1.0157126713011764,
+        1.0650427506557765, 1.248628034813529, 1.2606038958482955, 1.0182940176324384,
+        1.018857697576411, 1.0657736590839588, 1.1803674513096178, 1.3816824464045172,
+        1.1476756178580496, 1.0198645258176506, 1.0145654072804962, 1.0480117242864613,
+        1.117447611473516, 1.2430547067356879, 1.3155883793162284, 1.1291162682369988,
+        1.0253872483920965, 1.0111354499660097, 1.0327308633359344, 1.078847291773838,
+        1.1547109314923611, 1.251446275571533, 1.244592582299329, 1.1034596377432757,
+        1.0246691752455541, 1.0105041512910131, 1.0270153029417168, 1.0629249852242018,
+        1.118385355223555, 1.1910066081001631, 1.2301219539034938, 1.146972310326015,
+        1.0466686661602604, 1.0113187536060058, 1.0185498395479007, 0.8859094250783301,
+        0.7956801025403285, 0.6963974650773427, 0.5599092718839944, 0.40030148400835985,
+        0.2982039022186691, 0.32873572686299307, 0.41550283125032395, 0.490349532546923,
+        0.5390626670702324, 0.5613029111101449, 0.5570370205074013, 0.52361478316988,
+        0.45576730566111806, 0.3478267202225476, 0.19964361483831675, 0.04367298169807864,
+        0.17945642099064063, 0.3501750216742802, 0.49313240979322864, 0.6055183557511244,
+        0.6918246038195043, 0.7580342720726285, 0.8093081389676046, 0.8494767004829669,
+        0.8811892709063547, 0.9061968334587455, 0.9255991706423411, 0.9400231852393394,
+        0.9497390802048894, 0.954727813748409, 0.9547111704781, 0.9491526038112595,
+        0.9372350998379629, 0.91782314391471, 0.8894217572250134, 0.8501605606207562,
+        0.7978602207994662, 0.7302838529946347, 0.6457180346099567, 0.5440002587410053,
+        0.4279122275935043, 0.304600612930271, 0.18761754735785574, 0.1085076227561041,
+        0.12229055032180783, 0.18074837607266625, 0.23133109564696147, 0.2639798135848285,
+        0.27826494779065203, 0.27605410898507754, 0.2599214193928498, 0.23278883942697062,
+        0.1980147394283903, 0.15979824890494781, 0.12407447546496439, 0.09979577285683838,
+        0.09597788430027221, 0.10998790510336225, 0.1301178246419511, 0.14803489746802884,
+        0.1599782443450321, 0.16468482252860978, 0.16222796619994334, 0.1534934532843854,
+        0.1399507359179339, 0.12359536218109445, 0.10700458234661246, 0.09334686809984463,
+        0.08579002918275054, 0.0857159935813847, 0.0913820801345959, 0.09936552352956887,
+        0.10670680126754928, 0.1116022390806957, 0.11324562322942411, 0.11155510180727682,
+        0.1069706081699577, 0.10031987076886388, 0.09272101778015104, 0.08547130506165058,
+        0.07984197697636103, 0.07672245758677608, 0.07624771653395844, 0.07774805885831072,
+        0.08012627128932748, 0.0823312266648723, 0.08363193348687885, 0.0836843589265618,
+        0.0824918835651679, 0.08032646459702752, 0.07763313102415108, 0.07491922697358891,
+        0.07262968949258586, 0.07102832978376274, 0.07012880119621454, 0.06971464533364498,
+        0.06944213683458914, 0.06897408727130282, 0.0680907999252888, 0.06675287241748634,
+        0.06511322325904026, 0.06348043700095259, 0.0622330900974642, 0.06169302678787748,
+        0.06199444383681138, 0.06301237666192962, 0.06439228419846177, 0.06565747505766349,
+        0.0663334297747024, 0.06604682366736073, 0.06459209107851875, 0.061976074019627396,
+        0.0584518000150211, 0.054542515057642016, 0.05103091370519279, 0.04883764496323106,
+        0.048700191084943716, 0.05076558377943472, 0.05448233757776302,
+        0.05890672338015797, 0.06307199612621493, 0.06617930184233237, 0.06764977930836981,
+        0.06712979555442743, 0.0644956123475108, 0.059875469009111275, 0.05370567982155863,
+        0.04685094917900525, 0.04080498947304951, 0.03772251195757704, 0.03938114796133801,
+        0.04543899206327606, 0.05391422440353622, 0.06286095415759542, 0.07088421688340212,
+        0.0770168530989866, 0.0805774975735482, 0.08110093407869434, 0.07831606106493061,
+        0.0721549920487368, 0.06280248271995938, 0.05085597422926005, 0.03791384149928911,
+        0.02878068007563221, 0.0327103397907861, 0.04906729150032319, 0.07058294716693404,
+        0.09383167987717589, 0.11725996994871109, 0.13988876733248698, 0.1609808998983486,
+        0.1799538550633134, 0.19635477098349002, 0.20985089291352033, 0.22022220409506166,
+        0.22735264955800658, 0.23121957373641308, 0.2318820190451039, 0.22946870748248752,
+        0.2241663623959727, 0.2162087653914723, 0.205866708986052, 0.19343885556997137,
+        0.17924345838279615, 0.16361092074874592, 0.14687723122619464, 0.12937838032427912,
+        0.11144592851242975, 0.09340400366915547, 0.07556836805703845, 0.058249588358580774,
+        0.04176830562718501, 0.026523472396473093, 0.013444554139760694,
+        0.00829874386320909, 0.015841491151679366, 0.02469754217328767,
+        0.032209087369112516, 0.037960023022339244, 0.041835692427464384,
+        0.04382364928028082, 0.04397606559962929, 0.04239886466517583, 0.03924654847092276,
+        0.034717745270130926, 0.029049925858601285, 0.022512823660977607,
+        0.01540105783804255, 0.00803170749379951, 0.0011007501965822272,
+        0.006477060962855483, 0.01287206596114127, 0.018443080979996345,
+        0.02297346548170452, 0.02630992059238216, 0.028355752315345, 0.029071808907155307,
+        0.028476249428920044, 0.02664241710275739, 0.02369495560791208,
+        0.019804736734699936, 0.015184438499804718, 0.010093736161872438,
+        0.004937641037822903, 0.0025130741416872857, 0.006718886966476412,
+        0.01133993713487086, 0.015407830640934614, 0.01868428120146978,
+        0.021028026014492184, 0.022355667227919502, 0.02263615658494476,
+        0.021888930829041357, 0.020181813281818027, 0.017628571289992314,
+        0.014388207095549168, 0.010674848191502695, 0.006827253964508817,
+        0.0038298560988043566, 0.004578004001539325, 0.007831376226094937,
+        0.011214078921489758, 0.014157654592792989, 0.016446898203042817,
+        0.01796391936716565, 0.01864781191723621, 0.0184853478495172, 0.01750757898926497,
+        0.015787840129929592, 0.013441510252697068, 0.010632756308427097,
+        0.007611727926875726, 0.004905798173414624, 0.003992522392969689,
+        0.0057617491335695955, 0.008420946621434494, 0.010986304574371263,
+        0.013129982940116866, 0.014696623905789854, 0.015601824769087613,
+        0.01580897825865064, 0.01532242360043051, 0.014184695636821102,
+        0.012475717642296612, 0.01031613480111629, 0.007885756558883952,
+        0.005505096326226721, 0.003951130410945962, 0.004428558857362373,
+        0.006353872940691178, 0.008544305124542793, 0.010520990765756822,
+        0.012082689092334868, 0.013123342863320762, 0.013587908912248137,
+        0.013460104959570755, 0.012758175021143724, 0.011533270049297866,
+        0.009870344652450513, 0.007896335150142977, 0.0058157548679082785,
+        0.004055149557961356, 0.003553997910067176, 0.004717315549328895,
+        0.0065389537260466535, 0.008350184563286442, 0.009886385633042971,
+        0.011018560684236785, 0.011676003998583137, 0.011825829805260988,
+        0.0114665457508049, 0.01062553417422481, 0.009358294254315214, 0.007750796671609397,
+        0.0059327964092779255, 0.004137231096882809, 0.002938654802179629,
+        0.0032767918744353117, 0.004739880481900965, 0.0064162089166589255,
+        0.007938523686673622, 0.00915212053589783, 0.009973223294519742,
+        0.010355328962245522, 0.010279908164555306, 0.009752901688902684,
+        0.008802505054820838, 0.0074770749323755156, 0.005843276326522655,
+        0.003986940363243826, 0.0020393552653426316, 0.0008532023586530062,
+        0.0024338946732497964, 0.004311922600458942, 0.006030043785279074,
+        0.007489769533259885, 0.008629969013228178, 0.009411152294941135,
+        0.009814408634539208, 0.009842103223644011, 0.009518902350951684,
+        0.008893347825387178, 0.008040988854651479, 0.007070781520946249,
+        0.006135466000945101, 0.00543519201632378, 0.005168591522318921,
+        0.005398080840660845, 0.005983521660314216, 0.006703579168585137,
+        0.007375008120962117, 0.007876305434474965, 0.008134839331387015,
+        0.008114063110824464, 0.007806196748969096, 0.007228948902911627,
+        0.006425586352487513, 0.005470039838814904, 0.00448283667698128,
+        0.0036656259961386694, 0.003311290091065867, 0.0035946863302401544,
+        0.004329691769455909, 0.0052146124608069685, 0.006047436558415198,
+        0.006713356177902545, 0.00714657688669763, 0.007311747701437448,
+        0.0071964546655681715, 0.006808304300244873, 0.006174307373936649,
+        0.005342796196014513, 0.004391169230892131, 0.0034495803282511652,
+        0.0027556163298476832, 0.0026427672833070365, 0.003165323616235958,
+        0.0039997591281947025, 0.004869562771706881, 0.005628044988016179,
+        0.0061958271824115955, 0.006527964393276568, 0.006602032094758179,
+        0.006413821159248711, 0.005975799905097936, 0.005317131529231876,
+        0.0044861619153596525, 0.003560018831178654, 0.0026770025254649623,
+        0.0021173803290820636, 0.002232988857528437, 0.0029096071763863034,
+        0.0037671036344819903, 0.004588016527735487, 0.005268172079793783,
+        0.0057505063703236405, 0.006002599285027712, 0.006009561093987261,
+        0.005771579613654364, 0.005303056672880755, 0.0046328012777315545,
+        0.003806538537309124, 0.00289748069304105, 0.0020486752220220954,
+        0.001600514842986247, 0.0019222806304836889, 0.002704650214312042,
+        0.0035649491404719214, 0.004343477871678066, 0.004965820389181446,
+        0.0053894016392628296, 0.005589632242267339, 0.005555955588765883,
+        0.00529050927615021, 0.0048075634710583685, 0.004133515241315356,
+        0.0033085525639295543, 0.00239550977988479, 0.0015270753193026548,
+        0.0011292773949434542, 0.0016445455054792646, 0.002515113751514194,
+        0.0033869204386062874, 0.00414952830371922, 0.004748949965899236,
+        0.005151657846568389, 0.005337299664497731, 0.005296912016099717,
+        0.0050323181867514295, 0.004555700592774552, 0.0038891813112014568,
+        0.0030648305080554833, 0.002127556704157122, 0.001160605325503685,
+        0.0006252769015291274, 0.0013497046879096012, 0.0023247344589007166,
+        0.0032476165367107705, 0.00404965800472161, 0.004689963996634481,
+        0.0051390991359567305, 0.005376968171078971, 0.00539264005054105,
+        0.005184367822390726, 0.004759421238662103, 0.004133634549747414,
+        0.003330657650409676, 0.00238093467916083, 0.0013204557616986396,
+        0.00018945728126065376, 0.0009698936784230431, 0.0021133147994707503,
+        0.003197938360412125, 0.0041826747164018085, 0.00502981442454003,
+        0.005706168929314292, 0.0061839975890059734, 0.00644169556227346,
+        0.006464239272244576, 0.00624340862939885, 0.005777842200981026,
+        0.005073071167000803, 0.004141993643565196, 0.0030078594629853283,
+        0.0017256517468608936, 0.0007391498950611178, 0.0018009498187544941,
+        0.0035106036784292617, 0.005357122180366962, 0.0072694730173178896,
+        0.009206200032871058, 0.011131073757079644, 0.013009610770415276,
+        0.014808456105903376, 0.016495426426460666, 0.018039777884014105,
+        0.01941258944609389, 0.02058722854172137, 0.021539882015099727,
+        0.022250134200897786, 0.022701567832820988, 0.022882357038218136,
+        0.022785816912314887, 0.022410872092923254, 0.02176240778924937,
+        0.020851470937243623, 0.019695296475490096, 0.018317144139804013,
+        0.016745945086695375, 0.015015776827187074, 0.013165214726624148,
+        0.011236664522474947, 0.009275912204757503, 0.0073325065474407055,
+        0.005462910045866534, 0.0037440119689866186, 0.002333502346706541,
+        0.0016833780463147033, 0.002147405258865009, 0.0030183536272908257,
+        0.0038398353874947496, 0.004489650841733873, 0.0049326995164183434,
+        0.005162200548492447, 0.00518554839375047, 0.005019765707910676,
+        0.004689605727802688, 0.004226765187425303, 0.0036701605324852876,
+        0.003068162757332194, 0.002484898403079645, 0.002012130599149096,
+        0.001768400970244191, 0.0018196437146412484, 0.002085484620340179,
+        0.0024282584071687523, 0.002752819861919524, 0.0030085530649237844,
+        0.0031710041796191267, 0.0032311600975760335, 0.0031904789356753125,
+        0.003058568807201323, 0.002852121506441064, 0.002594625521435151,
+        0.0023166800196345962, 0.002056294325953896, 0.0018565582215045399,
+        0.0017549976302645178, 0.0017639320732270678, 0.001860603716995103,
+        0.0020024217312823328, 0.0021486246072280704, 0.0022699057807953845,
+        0.0023487432536241446, 0.002377195862478968, 0.0023548795430706677,
+        0.0022875208484791046, 0.00218588912076596, 0.0020648051151038126,
+        0.0019418243845070989, 0.0018350478564242124, 0.001759643061079033,
+        0.0017236746380351747, 0.001725482718421298, 0.0017548392664947165,
+        0.001797299337322081, 0.0018388818713064648, 0.001869047727928651,
+        0.0018818407431277428, 0.0018758696289633279, 0.0018536837042317509,
+        0.0018207749712247133, 0.0017842457839565482, 0.0017511725816448007,
+        0.0017268663583098782, 0.0017134837130395502, 0.0017095288842787352,
+        0.0017104916719325022, 0.0017103442490727352, 0.0017033056144191408,
+        0.0016853681371668291, 0.0016553555344028315, 0.0016154705307331407,
+        0.0015712985821818783, 0.0015311156581241214, 0.0015042593272240315,
+        0.0014985445488595148, 0.0015174319855315234, 0.0015583686114152594,
+        0.0016133099859011021, 0.0016709693916824027, 0.001719442781829889,
+        0.0017482536786923636, 0.0017496539202801926, 0.00171942883968995,
+        0.0016575031714004818, 0.0015685693452629679, 0.001462847736606747,
+        0.001356788787762597, 0.0012726302337796793, 0.001234188494829374,
+        0.0012570835638323243, 0.0013393114485630013, 0.0014624564218441946,
+        0.0016014962399130645, 0.0017328687817436588, 0.001837543986477252,
+        0.0019014206063493733, 0.001915085393292695, 0.0018736951355731509,
+        0.001777195764610596, 0.0016310692585315939, 0.0014480818569487166,
+        0.0012520332573992912, 0.0010842125134270292, 0.001005159393542264,
+        0.001063871346217876, 0.0012479040357383897, 0.001501673884199932,
+        0.0017735450742218202, 0.002027263446605912, 0.0022374116321233926,
+        0.0023853401222528226, 0.0024572530238822824, 0.002443528272644923,
+        0.002338670904297306, 0.002141748782049228, 0.001857691838444208,
+        0.0015012852121891259, 0.0011119963226966486, 0.0008145315891178211,
+        0.0008906048013496141, 0.0013593935467374008, 0.001996491661457524,
+        0.002698065865868339, 0.0034208014674950243, 0.004138116683897563,
+        0.004829324628608301, 0.005476853010700203, 0.006065544119546549,
+        0.0065825618428387595, 0.007017468483705831, 0.007362318641725711,
+        0.007611710795668794, 0.007762773647581166, 0.007815081208344014,
+        0.007770499870512368, 0.007632976424154192, 0.007408279636368968,
+        0.00710371019595875, 0.006727794740512211, 0.0062899794420887235,
+        0.005800337337756968, 0.005269301436374191, 0.004707432926502944,
+        0.004125231129354755, 0.0035329903234701354, 0.002940710958210731,
+        0.0023580873341541315, 0.0017946520374708785, 0.0012604147365973344,
+        0.00076888431840864, 0.00036065872069963455, 0.0003005748914249548,
+        0.0005910272159008567, 0.0008862386808619615, 0.0011342245110531007,
+        0.0013254322087283478, 0.0014569636247498549, 0.0015285396335689852,
+        0.0015416720560694239, 0.0014994090464591494, 0.001406202149213106,
+        0.0012677827928437395, 0.00109101457007093, 0.0008837140692578863,
+        0.0006544528354892145, 0.00041242090623079975, 0.00016830739870160073,
+        8.627059416876409e-05, 0.0003079245506404104, 0.0005134813628456213,
+        0.0006911726228053858, 0.0008348938558529426, 0.0009402362047942818,
+        0.0010043925467221623, 0.0010261970247326172, 0.0010061345571240484,
+        0.0009462973909956929, 0.0008502880867404271, 0.0007230803721771156,
+        0.0005708747306596768, 0.0004010996426222425, 0.00022363198321820096,
+        7.632357910713945e-05, 0.00017229384262660547, 0.00033484271241497306,
+        0.0004846296002093073, 0.0006117315652013918, 0.0007106877441048663,
+        0.0007778653369960659, 0.0008111868467307145, 0.0008100969482110502,
+        0.000775539400942282, 0.0007099081369757032, 0.0006169868504320104,
+        0.0005019532686020648, 0.0003717555528819809, 0.00023755426172913352,
+        0.00013288804743852336, 0.00015915568502154545, 0.00027401386657204744,
+        0.0003947180416637307, 0.0005017412116267879, 0.0005876612164997403,
+        0.0006482392376221097, 0.0006810315479886792, 0.0006850880561671778,
+        0.0006608598448404559, 0.000610148872429342, 0.0005360852020135503,
+        0.0004432157144592263, 0.00033805614449351697, 0.00023173823649364088,
+        0.00015288645389181235, 0.000162957144191822, 0.00024647596756116147,
+        0.00034402522343735594, 0.0004337271418233017, 0.0005071459376148966,
+        0.0005597812604831953, 0.0005890842935956708, 0.0005939647988181095,
+        0.0005746385230925361, 0.0005325668307388332, 0.0004704510685615418,
+        0.00039236239132811173, 0.0003043559162249689, 0.00021700647212253473,
+        0.00015500680597287125, 0.00016154331329719238, 0.00022716719912057234,
+        0.00030813288431721686, 0.00038429893635799807, 0.00044731828852113037,
+        0.0004927864131124257, 0.0005182271082050489, 0.0005225419615541943,
+        0.0005058336965431294, 0.0004693417960190226, 0.00041544492096885,
+        0.00034780559814696205, 0.00027198741874048587, 0.00019781185977364818,
+        0.00014706561178996237, 0.00015348138843801286, 0.00020886036371017193,
+        0.00027836541820463876, 0.0003443817334740516, 0.0003992225808777302,
+        0.0004387999923648766, 0.00046081057082435846, 0.0004642105718495209,
+        0.00044904242335318863, 0.0004163715573071228, 0.0003682886810828174,
+        0.0003080452324756526, 0.00024062592328511162, 0.0001749271985039236,
+        0.00013077563125817512, 0.0001380304436155139, 0.0001881818241730449,
+        0.00025043189196022754, 0.00030939795465941987, 0.00035830000873537655,
+        0.00039348473640195226, 0.00041285827701878746, 0.00041542827784478615,
+        0.0004011456239984407, 0.00037083282832262076, 0.0003261489885802899,
+        0.0002696207740726302, 0.00020492653684895393, 0.00013837949022177802,
+        8.716865460733348e-05, 9.387401912970442e-05, 0.00014866211448720678,
+        0.0002116494031288415, 0.00026974686405796663, 0.0003180316277800213,
+        0.00035382370700259857, 0.000375585308049433, 0.0003826777470499097,
+        0.0003753108277910794, 0.00035455500947617456, 0.0003224111305072072,
+        0.00028200310156146395, 0.00023805704819879867, 0.00019789811355663838,
+        0.0001723234264400121, 0.00017159889374033347, 0.00019476187645576403,
+        0.00023053325909642796, 0.000268241232823549, 0.00030112850346311517,
+        0.0003252036834097577, 0.0003381726905412212, 0.00033892065967065473,
+        0.0003272874993749875, 0.00030398226331873076, 0.0002705951876182042,
+        0.00022976648534126355, 0.0001857506619360284, 0.00014597392578240902,
+        0.00012340675971150728, 0.00013047562090635144, 0.0001615001565188455,
+        0.0002013939816124351, 0.00024024735766232946, 0.000272801159430349,
+        0.0002960912955994682, 0.00030843058352735296, 0.0003090383459045285,
+        0.00029790390569192084, 0.0002757426124357573, 0.0002440190374883457,
+        0.00020509994826413202, 0.0001627830618390963, 0.00012394307901374534,
+        0.00010183198650137741, 0.00011023265610514071, 0.00014200554705931612,
+        0.00018115566505318948, 0.0002185177716751217, 0.00024952610727109193,
+        0.0002716273753974912, 0.0002833565438087013, 0.0002840311048215787,
+        0.0002736439778670947, 0.0002528284004963904, 0.00022287301293587712,
+        0.00018584117686664718, 0.000145022658731968, 0.0001065427092788515,
+        8.367998366007455e-05, 9.25047583660862e-05, 0.00012479416617785906,
+        0.00016336343833513463, 0.00019965231228038754, 0.00022965128004568265,
+        0.00025111552612667196, 0.0002627305587517022, 0.00026386139712795937,
+        0.00025446899897863895, 0.00023508049243253803, 0.000206792090246416,
+        0.0001713434222793713, 0.0001314460950667444, 9.217014273752204e-05,
+        6.632630403502364e-05, 7.46115931455047e-05, 0.00010806523961867325,
+        0.00014690606910749328, 0.00018303037335068163, 0.00021293311430836865,
+        0.000234625072282844, 0.00024689537326121584, 0.0002491170351921451,
+        0.00024118718683751556, 0.0002235028809149876, 0.0001969511107552417,
+        0.00016293112767841098, 0.00012351400119027224, 8.229345080757452e-05,
+        4.965945585123303e-05, 5.475699715209221e-05, 9.06516199763071e-05,
+        0.00013112301878270448, 0.00016845174394269002, 0.0001996535409499285,
+        0.00022295440640252956, 0.00023719417188470559, 0.00024170056854136532,
+        0.0002362580816572781, 0.00022109378147335603, 0.00019686111969636805,
+        0.00016462199643274976, 0.00012585132848997975, 8.260575413742433e-05,
+        3.93266424756985e-05, 2.9883712482384555e-05, 7.0726516475764e-05,
+        0.00011508908014040632, 0.00015597422260857634, 0.00019103939108139082,
+        0.0002186706905236737, 0.00023766581778656188, 0.00024720176606882763,
+        0.0002468409520658899, 0.00023653616970153012, 0.00021662508356037517,
+        0.0001878120356889861], [1.578840721876905e-05, 4.738344941336167e-05,
+        7.903322340384214e-05, 0.00011077435875269489, 0.00014264369508812402,
+        0.00017467837529683465, 0.00020691592523173547, 0.00023939434809134975,
+        0.0002721522129004224, 0.0003052287477663109, 0.0003386639354850884,
+        0.0003724986132560657, 0.00040677457312392716, 0.00044153466951383797,
+        0.0004768229282974298, 0.0005126846626382592, 0.0005491665931184656,
+        0.0005863169738060188, 0.0006241857255702486, 0.000662824574808252,
+        0.0007022872023422388, 0.0007426293984164367, 0.000783909228394818,
+        0.000826187208271151, 0.0008695264911269136, 0.0009139930652233751,
+        0.0009596559662731772, 0.001006587502773941, 0.0010548634980462812,
+        0.0011045635478183467, 0.0011557712982782193, 0.0012085747422591402,
+        0.0012630665389928508, 0.0013193443567838545, 0.0013775112428317526,
+        0.0014376760207596693, 0.0014999537203820763, 0.0015644660406962598,
+        0.0016313418515357528, 0.0017007177350156512, 0.0017727385732699147,
+        0.0018475581842897395, 0.0019253400132260676, 0.002006257882160601,
+        0.0020904968070082136, 0.0021782538841803294, 0.002269739260576303,
+        0.002365177187089287, 0.0024648071736493465, 0.0025688852483011855,
+        0.0026776853370134327, 0.0027915007756152024, 0.0029106459669574307,
+        0.003035458202233062, 0.0031662996633483134, 0.0033035596261579226,
+        0.0034476568915925584, 0.0035990424663822425, 0.0037582025281253546,
+        0.003925661706019305, 0.004101986716806221, 0.004287790401262734,
+        0.004483736211255625, 0.004690543205251731, 0.0049089916189608025,
+        0.005139929088759458, 0.005384277614280023, 0.005643041362587884,
+        0.005917315433376771, 0.0062082957195631035, 0.006517290022958449,
+        0.0068457306105564825, 0.007195188430255898, 0.007567389235743976,
+        0.007964231924386033, 0.008387809436312848, 0.00884043263895192,
+        0.009324657686555746, 0.009843317447780244, 0.010399557714399934,
+        0.010996879032776624, 0.011639185187784744, 0.0123308395812252,
+        0.013076731010371304, 0.013882350696259515, 0.014753882824643069,
+        0.015698311403293943, 0.01672354690823197, 0.017838577055536223,
+        0.0190536471710573, 0.020380477039927056, 0.02183252305167492, 0.02342529693029685,
+        0.025176755678120555, 0.027107781825065375, 0.029242779192065863,
+        0.031610417674036904, 0.03424457228334057, 0.03718551802615803,
+        0.04048146578753372, 0.04419055863366759, 0.048383498793366446,
+        0.05314705244709161, 0.05858879870953109, 0.06484367837285213, 0.0720832081243216,
+        0.08052875099136647, 0.09047115957296475, 0.10230081949303611, 0.1165554672579866,
+        0.13400017324869173, 0.15576993287642807, 0.18364640631670995, 0.22066276066388674,
+        0.2726827726896654, 0.3539376549208351, 0.522381457173901, 1.7281607524167497,
+        0.5407292922398463, 1.5215746949318132, 1.0328265564373431, 0.0834421126792304,
+        0.7504953775130799, 2.244445353054232, 3.5606481024004055, 1.7050025175836008,
+        0.9538582790591001, 0.16463085453658088, 2.4184426076846695, 5.062812130340401,
+        4.264866778996454, 2.5921601298102765, 1.7386487828864208, 1.2699821546863785,
+        1.1292790075634074, 1.5790581010043936, 2.4490023956909686, 2.3116039932024712,
+        1.8041123461553272, 1.4542969258680971, 1.2338406551175862, 1.124287219752225,
+        1.1837142664289895, 1.5214712978097436, 1.9005349019999354, 1.8024252873895261,
+        1.5397659978324367, 1.3369758161522858, 1.20207379783807, 1.1272145631153152,
+        1.130371226298617, 1.2649512720216125, 1.5254054060100477, 1.6258546630586057,
+        1.4871376905470008, 1.3243688902425879, 1.2020114567127391, 0.9326322815448951,
+        0.7681566303555731, 0.6286945213298659, 0.5088473732688211, 0.4535411152473711,
+        0.4869213378176831, 0.5525898276396899, 0.6015759816720033, 0.6231657776536412,
+        0.6202610377070438, 0.595969689588699, 0.5504967834892276, 0.4811782515369562,
+        0.38379768932270947, 0.2567661515595476, 0.1213503012029641, 0.15047573029691952,
+        0.3115189441830448, 0.46338754024454315, 0.5850651328271871, 0.6765895109823913,
+        0.7441168247383326, 0.7943024801653243, 0.8324189789450389, 0.8621706209414345,
+        0.8860122623479522, 0.9055060087818422, 0.9215944077684229, 0.934783525273287,
+        0.9452550427781923, 0.9529259722468736, 0.9574688785261142, 0.9583003338302911,
+        0.954542041802423, 0.9449585958810812, 0.9278803644915773, 0.9011340232055908,
+        0.8620337433062594, 0.8075381280155487, 0.7347377045537243, 0.6418356453824282,
+        0.5295788917279236, 0.4026303416765225, 0.2701498879978848, 0.14700403582867183,
+        0.0771776254404663, 0.12655261962961428, 0.1979949906182014, 0.2541790294208978,
+        0.29117834309226825, 0.3094843983365214, 0.31059552917239364, 0.2963566159515564,
+        0.26888754965215766, 0.23071751375097907, 0.18503918710033, 0.13625956225526364,
+        0.09194563284216915, 0.06893080722601573, 0.08294262665390616, 0.114683709588906,
+        0.1460271785570087, 0.17075813832829448, 0.18673910717451178, 0.1933410817700955,
+        0.1907222825889701, 0.17957945902999659, 0.16107130173943576, 0.1368519878981071,
+        0.10926723856525714, 0.08200045488576488, 0.06186110882325214, 0.058879769204088564,
+        0.07306844223863843, 0.09343207984128776, 0.11272808350245456, 0.12781193113810096,
+        0.13729770339183014, 0.14064740270870804, 0.1378527511817025, 0.12931494462022897,
+        0.11581219265540635, 0.09854147511018098, 0.07929945696185095, 0.061029348226481483,
+        0.04895002836059605, 0.04916290859805764, 0.06027976476379656, 0.07533817297023157,
+        0.08970380423099106, 0.10113627187577633, 0.10853497509801827, 0.11139669936766015,
+        0.10961465026138194, 0.10340236839497714, 0.0932747802195469, 0.08007966657635686,
+        0.06512863665935421, 0.050594994015890765, 0.04039556263465541,
+        0.03960853591233414, 0.04811826900185583, 0.060570562796192474,
+        0.0729797301936018, 0.08333815951219495, 0.090606739806542, 0.09424387844786634,
+        0.09403368138559769, 0.0900226211013696, 0.08250093253034013, 0.07201656792144313,
+        0.0594483019566399, 0.04625021349407469, 0.03518020931884799, 0.03116219007416972,
+        0.036913070884189804, 0.048132216117821675, 0.060336718738477124,
+        0.07128034715270859, 0.07981613174631876, 0.08529252165497662, 0.08735103555242864,
+        0.08585779301515242, 0.0808809617637642, 0.07269018421589285, 0.06178242762910856,
+        0.048981633037480626, 0.03581611744302373, 0.025915832392836027,
+        0.026182554735758604, 0.03659954514816618, 0.050407737062594014,
+        0.06406503861045922, 0.07603584693110745, 0.08544510992707581, 0.09171096388348561,
+        0.09444363860298244, 0.09341468870672147, 0.08854805301088851, 0.07992139773570395,
+        0.0677820691842501, 0.05261253254831664, 0.035446875950937595, 0.02014496304719724,
+        0.022708960720069404, 0.042416783452751836, 0.06598045887014056,
+        0.09025006986754289, 0.11407312914246771, 0.13669358498388814, 0.15752143818344555,
+        0.17608872462223865, 0.19204001728599804, 0.20512807236505382, 0.21520764905533005,
+        0.2222263126869462, 0.22621285751316786, 0.2272645070494782, 0.22553401827140124,
+        0.2212175404300671, 0.21454373200955307, 0.2057643247685333, 0.1951460974870604,
+        0.18296410119265197, 0.16949595116664784, 0.15501703903051886, 0.1397965829223809,
+        0.1240944877826341, 0.10815900512646535, 0.09222515284859974, 0.07651379107431756,
+        0.06123117630128006, 0.04656877362056885, 0.03270316691398747, 0.019796424446951105,
+        0.008003657093920516, 0.002717293967524679, 0.011898335210603574,
+        0.019735314987323442, 0.026107081923070843, 0.03097794776117001,
+        0.03434361373813832, 0.03623024374156574, 0.03669500180364845, 0.03582629895047087,
+        0.03374347382423484, 0.03059593994481333, 0.026562275615918594,
+        0.021851047413501825, 0.01671004703424959, 0.011474291686492458,
+        0.006839710440926372, 0.005184194757377274, 0.008063031118616955,
+        0.012117198714245301, 0.01591266234010508, 0.019065136959449173,
+        0.02141187485299932, 0.02287354920387801, 0.02342428373081741, 0.02308261040464215,
+        0.021907815026013747, 0.01999858401487453, 0.017494753884355667,
+        0.014587084302768977, 0.011550188186746977, 0.00883843119908733,
+        0.007252793202396913, 0.007582659689581323, 0.009415690613704526,
+        0.011754170832424624, 0.013994325971503314, 0.015843985158072966,
+        0.017154616229710543, 0.01785343505737058, 0.017918759577666442,
+        0.017370472810713872, 0.01626649236722157, 0.014703185803388592,
+        0.012821390652063495, 0.010823532051872429, 0.009008990591144185,
+        0.007802929038926092, 0.007613823452569273, 0.008436631664716615,
+        0.009836988797737466, 0.011369475282738786, 0.012745749474445857,
+        0.01379912887259217, 0.014438258072083153, 0.01462243231936129,
+        0.014350216991751945, 0.013654587201281508, 0.0126019413781739,
+        0.011294970554727052, 0.009880987729358193, 0.008565776726332578,
+        0.007616159044479161, 0.007288259583462133, 0.007649008773511902,
+        0.00850409044460806, 0.009563107127481716, 0.01058919677103244,
+        0.011425992465550087, 0.011979643270086935, 0.01220153333833068,
+        0.012078231477225547, 0.011626496051972832, 0.010891497474592119,
+        0.00994772907406754, 0.008902807549390294, 0.00790293046641815,
+        0.007130115614641575, 0.006762337454545751, 0.0068789704886702534,
+        0.0073963222342507, 0.008129606852732946, 0.008895697624515956,
+        0.009558116410307967, 0.0100280592792617, 0.010255009209768691,
+        0.010219093484191106, 0.009926566651032673, 0.009407681147267446,
+        0.008716414882974416, 0.007931763272306835, 0.0071592900661598255,
+        0.006527131870807627, 0.006162175105977201, 0.006136738626038332,
+        0.006421561265524862, 0.006903750063507162, 0.0074491249700526325,
+        0.007945590179404891, 0.008314737892138137, 0.00850928856663963,
+        0.008508258644537693, 0.008313298414771282, 0.007946461557543603,
+        0.0074490097368405395, 0.006880613710193538, 0.0063174050887856315,
+        0.005845054669791768, 0.005540861637530943, 0.005444541449966859,
+        0.005536074357264735, 0.005744231102179515, 0.005978649849584664,
+        0.006157900208258139, 0.006222258448927986, 0.006136664868426537,
+        0.005890930426268104, 0.0055011238888024, 0.005014403855730541,
+        0.004518528362832215, 0.004150298144694434, 0.004072257796655886,
+        0.004380625916995214, 0.005028279695952269, 0.005879991885501403,
+        0.006801256884540748, 0.007688262980163052, 0.00846502708723451,
+        0.009076434216694016, 0.009483900076911904, 0.009663303472610667,
+        0.009604154188105384, 0.009309374211065449, 0.008795479268357203,
+        0.008093302854756639, 0.0072498208445332495, 0.006332191597815925,
+        0.005435365117858885, 0.004691037411813451, 0.00425701632068089,
+        0.004241394122446701, 0.004601419079191237, 0.0051761898376348784,
+        0.005802716496215382, 0.006365570231138921, 0.006792406824196639,
+        0.007041184568162806, 0.007091765022898342, 0.006941548404574836,
+        0.00660355148699916, 0.006106178036196794, 0.005494783533099579,
+        0.004835722677522873, 0.00422272201856558, 0.0037779203247094092,
+        0.003620390087391168, 0.0037874359128158815, 0.00419733991058805,
+        0.004717272906923863, 0.005233191841043197, 0.0056663536664210154,
+        0.005966817480009707, 0.006105843890057866, 0.006071285553961041,
+        0.005865298761907587, 0.005503601862391222, 0.0050161456849129385,
+        0.0044497365986937475, 0.003873501009798115, 0.0033856193163087256,
+        0.003106217979756021, 0.003122602883852812, 0.003413089318919045,
+        0.003865721940816023, 0.004361582855048724, 0.004813296113239847,
+        0.005163751899866292, 0.005377750767375918, 0.0054363254065917695,
+        0.005333798810918751, 0.005076540880805815, 0.004682956650695862,
+        0.0041849585601820005, 0.003632005171878456, 0.0030992520173867776,
+        0.0026964848783848695, 0.0025491035779487393, 0.0027100648001897004,
+        0.003100493411538587, 0.0035896623693847944, 0.004073458410466817,
+        0.004484053583829813, 0.004778978585154354, 0.004932834514199629,
+        0.004933076154488378, 0.004778114550100671, 0.004476693929393491,
+        0.004048335213715578, 0.0035254974307060774, 0.002959502782700893,
+        0.002434109257872921, 0.002083298680718098, 0.002053988522881172,
+        0.002355046294885024, 0.002842959654312923, 0.003376635959161791,
+        0.0038677908517171923, 0.004263713927628455, 0.004531947140691583,
+        0.004653213867798028, 0.004618479318431906, 0.004427765009803846,
+        0.00408982128268215, 0.003622606364656755, 0.003055461873264091,
+        0.002436209527519371, 0.00185338568801668, 0.0014882442670010772,
+        0.001569010220952738, 0.0020353066407732003, 0.0026472019119316787,
+        0.0032602252279783223, 0.0038029699636595244, 0.004234256347281532,
+        0.0045276198442851445, 0.004666266260566988, 0.0046413423912511085,
+        0.004451282337585467, 0.0041015277436224195, 0.0036044956897353726,
+        0.0029801637546883583, 0.0022590964941489934, 0.0014978008338531938,
+        0.0008798379764738969, 0.000994855246786722, 0.0017209460190932356,
+        0.0025542573762223643, 0.0033603136305704936, 0.004087053862625078,
+        0.004700583466543839, 0.005174742806991246, 0.005488897562293065,
+        0.005627439133654356, 0.005579669797793984, 0.00533972150107022,
+        0.004906403107231527, 0.004282949425682113, 0.0034766759976577587,
+        0.00249855759792675, 0.0013627551126888006, 8.611801261502513e-05,
+        0.0013123108507601623, 0.002811764196032466, 0.0043901744035204455,
+        0.006024540440351871, 0.007691233283928182, 0.009366243296245715,
+        0.011025380400268925, 0.01264444385467162, 0.014199382269891004,
+        0.015666465777326243, 0.017022490803821885, 0.018245033886675862,
+        0.01931276486608722, 0.020205822329524933, 0.020906246169006094,
+        0.021398454379857546, 0.021669744500672473, 0.021710794933839143,
+        0.021516138155850118, 0.021084576696623055, 0.02041951374741906,
+        0.019529173233393097, 0.018426688995181587, 0.01713004922842997,
+        0.01566189059916525, 0.014049147112373274, 0.012322574103287225,
+        0.010516194668378335, 0.00866677758450889, 0.006813638645927445,
+        0.004999753020358229, 0.003278740473375297, 0.001760778409563802,
+        0.0010230730237102614, 0.0018137417630030173, 0.0028936027226349244,
+        0.003851032249536634, 0.004617817624380041, 0.0051729222315239015,
+        0.005510297957747482, 0.005632833039311805, 0.005550521191945374,
+        0.0052795831007980305, 0.00484186642928253, 0.004264462000902809,
+        0.0035798552722306988, 0.002827790376758971, 0.0020633329046654976,
+        0.001390624990776882, 0.0010681027855184728, 0.0013328082254097475,
+        0.0018851561297006845, 0.002460965763933361, 0.002967293491755842,
+        0.003365834708621798, 0.0036374956392098115, 0.003773409079063285,
+        0.003772157473433055, 0.003638681248388263, 0.003383752863524773,
+        0.0030238139876298227, 0.0025814740204660376, 0.002087861951027097,
+        0.0015907959792509998, 0.0011802707905785579, 0.0010236461531384076,
+        0.001214525293639225, 0.0015946774328204224, 0.0020083909734039227,
+        0.002383131178513824, 0.002684141151991885, 0.002892625723508448,
+        0.0029987125769531282, 0.0029990454941916916, 0.002895852155573297,
+        0.0026965741022976887, 0.002413898756514762, 0.002066522411949097,
+        0.0016818747544951559, 0.0013044979791556864, 0.0010172648086366563,
+        0.0009480586225809848, 0.0011323616582931176, 0.001447850787750134,
+        0.0017862802665128382, 0.0020926354867824275, 0.0023382091191323055,
+        0.0025066077353356722, 0.0025887842030970875, 0.0025812494562230375,
+        0.002485387713358983, 0.0023072364005026313, 0.0020576564748915655,
+        0.0017532798216641267, 0.0014195872776929061, 0.0011000710764743856,
+        0.000877212012909894, 0.0008640180318434598, 0.0010631597554378765,
+        0.0013596858692533603, 0.0016675324021089817, 0.001942936590760504,
+        0.0021619638833025516, 0.0023102968472179116, 0.002379659088143125,
+        0.002366543325591444, 0.002271750968750237, 0.0021002918386998264,
+        0.0018616352041752457, 0.0015707513001654138, 0.001251507144572387,
+        0.0009475050952949894, 0.0007492743614339624, 0.000778954207269373,
+        0.0010129557290394838, 0.0013249718359597748, 0.0016385705181224666,
+        0.0019167158013035411, 0.002138348831030089, 0.002290048812096467,
+        0.0023633846598047955, 0.0023540503088764065, 0.0022615955860820986,
+        0.002089410655399234, 0.0018449731318049543, 0.0015407685889491248,
+        0.0011975198471438303, 0.0008566354024751278, 0.000626492983670051,
+        0.0006935422122744158, 0.0010052913230563865, 0.0013891070661361507,
+        0.0017688228136872478, 0.0021105823866106013, 0.0023936350648610704,
+        0.002602989247142131, 0.002727475528470079, 0.0027592326459223754,
+        0.0026936109142769154, 0.002529211451131354, 0.002268023659457374,
+        0.0019158427455696781, 0.001483835312473361, 0.0009961229576128453,
+        0.0005469994324099848, 0.0005963318501620992, 0.0011597776796369243,
+        0.001838877139113868, 0.0025485870930990226, 0.00326011859027778,
+        0.0039543499663002675, 0.004615456944578863, 0.005229699145133062,
+        0.005785229576962005, 0.006272146123064038, 0.006682581130182527,
+        0.007010763558405038, 0.0072530306812302915, 0.007407782659917738,
+        0.007475381093474753, 0.007457997099117079, 0.007359417338596442,
+        0.007184818274453674, 0.006940520031714068, 0.00663373162164856,
+        0.006272298980447609, 0.005864466310699895, 0.005418659630761797,
+        0.004943299322738962, 0.004446645948692677, 0.003936680858651893,
+        0.0034210203607944966, 0.0029068597170422935, 0.0024009412318878862,
+        0.0019095395180764292, 0.0014384571578631958, 0.0009930274553476726,
+        0.0005781435403394743, 0.00019869684569083984, 0.00014630888712765383,
+        0.0004452144601739267, 0.0007009230498188498, 0.0009107244539750812,
+        0.00107347309670297, 0.0011889124177956738, 0.001257670190040435,
+        0.001281277588448863, 0.001262174176589011, 0.0012036916753163092,
+        0.001110016994854087, 0.0009861430567979642, 0.0008378339648597852,
+        0.000671687541603901, 0.0004956095825942757, 0.0003213117509667557,
+        0.0001806562364867308, 0.0001812567345461673, 0.0003068951111904612,
+        0.0004472743387715977, 0.0005741511442360223, 0.0006789079299404299,
+        0.0007573154072166086, 0.0008071155556539427, 0.0008274694189461929,
+        0.0008187848329972885, 0.0007826410027252663, 0.0007217526370902236,
+        0.0006399938012133739, 0.0005425867007352417, 0.0004367768145880899,
+        0.0003339699468656364, 0.0002554566191305462, 0.0002351727803980248,
+        0.0002822712950467073, 0.0003627772292455168, 0.0004481364303674617,
+        0.0005246321410925902, 0.0005854703663844515, 0.0006270042607003785,
+        0.0006474342827559273, 0.0006463402230201128, 0.0006244980408006948,
+        0.0005838187943098651, 0.0005273881105207117, 0.0004596781860578477,
+        0.00038713414741890073, 0.00031948234089737646, 0.0002714105966808211,
+        0.0002593275947863607, 0.0002864066563262142, 0.0003377826213999726,
+        0.0003964802422801384, 0.00045140048629762583, 0.0004961031023665685,
+        0.0005269038726021107, 0.0005418789722951335, 0.0005404184998659088,
+        0.0005230332134913696, 0.0004912909361138843, 0.00044785842494161036,
+        0.00039669217324196844, 0.0003434722766566882, 0.00029627061372553486,
+        0.00026553347724640665, 0.00026034005469234204, 0.00028093154812534687,
+        0.0003181521792387381, 0.0003610980087050868, 0.000401645099549027,
+        0.00043458228127823414, 0.00045676818772268134, 0.00046652822577699564,
+        0.00046333441235460227, 0.0004476547904542213, 0.0004209067541205096,
+        0.00038550111133442086, 0.0003450002397696667, 0.0003044060490139787,
+        0.0002703868246311895, 0.00025051141009378594, 0.0002499829638998838,
+        0.000267632535348351, 0.00029676779882118777, 0.00032970803478762217,
+        0.0003604384318380113, 0.0003848992552632904, 0.000400579834193747,
+        0.000406157174289402, 0.00040128126822470294, 0.0003864693215423935,
+        0.00036307747376548415, 0.0003333439733218139, 0.0003005095436980573,
+        0.0002689730290737181, 0.0002442048466108998, 0.0002316532355504757,
+        0.00023413088185774818, 0.00024974656842122206, 0.0002732235094102916,
+        0.000298855118980426, 0.0003221191076372372, 0.0003399059526608312,
+        0.0003502996080147123, 0.0003523536533243683, 0.0003459485445791223,
+        0.00033171944478159156, 0.00031103888409894415, 0.0002860467918556271,
+        0.00025970929776765234, 0.00023580958824252567, 0.0002185671356651618,
+        0.0002114228975114245, 0.00021524139494904875, 0.00022764868614487285,
+        0.00024442244258628695, 0.00026133435272075994, 0.0002750654677273008,
+        0.00028335767598648877, 0.0002849135551523091, 0.00027929264585557637,
+        0.0002668716491611806, 0.00024888665772725697, 0.00022757312170371217,
+        0.00020638584859267314, 0.00019006665245956212, 0.00018378435373335206,
+        0.00019063998982597546, 0.0002094695436432814, 0.00023592652962719493,
+        0.0002651480011028811, 0.0002931480986282681, 0.0003169949652048469,
+        0.0003346347781593452, 0.00034472593335533377, 0.0003465399134266816,
+        0.0003399125539804856, 0.00032522909376009464, 0.00030343953393504187,
+        0.0002761163256622607, 0.0002455825107612485, 0.00021513682945382395,
+        0.00018928182917415235, 0.00017335556548236808, 0.0001713648852401041,
+        0.00018285884762254468, 0.00020313874749196528, 0.00022659618510395693,
+        0.00024881255504701, 0.0002667987466495965, 0.00027867724580776847,
+        0.0002834030527667121, 0.0002806018489389875, 0.0002704927798708346,
+        0.0002538702294082785, 0.00023214240583699068, 0.0002074451205628145,
+        0.000182844095452244, 0.0001625008794272806, 0.00015117233614530463,
+        0.00015204352409691784, 0.00016418199408315404, 0.00018326978528666985,
+        0.000204516578347798, 0.00022421284747764665, 0.00023983740264695635,
+        0.0002497918942954388, 0.00025318446241612573, 0.0002497076960979931,
+        0.00023958392727722625, 0.0002235607136544658, 0.0002029613424688813,
+        0.00017981716791642082, 0.00015710663754464832, 0.00013896569315729535,
+        0.00013010440158709718, 0.00013329303865669383, 0.0001468738121587718,
+        0.00016623496420595105, 0.00018684963407829597, 0.00020542355085869328,
+        0.00021977663311576425, 0.00022854199747005934, 0.00023096791676233006,
+        0.000226816174511308, 0.00021632109649356095, 0.0002001941971576086,
+        0.000179685211699168, 0.00015674108875854672, 0.00013432466065290847,
+        0.00011679500751614925, 0.00010934626075384826, 0.00011473678810480568,
+        0.0001303745217934004, 0.00015096817487033376, 0.00017201789822801798,
+        0.00019051019830769263, 0.0002045198002805293, 0.00021285096128304424,
+        0.00021484693244422395, 0.0002103022737508212, 0.00019943042600390965,
+        0.0001828712392757746, 0.00016175350281920825, 0.0001378726191006871,
+        0.00011412057122188632, 9.526785264128003e-05, 8.788789150861065e-05,
+        9.557176284018009e-05, 0.00011425629587944093, 0.00013732566251610604,
+        0.00016011256536512864, 0.0001798143498587204, 0.00019470127578937276,
+        0.00020369035248726447, 0.00020616332355215223, 0.000201892216703809,
+        0.00019101185408785054, 0.00017402099744641067, 0.00015182349981209654,
+        0.00012587049820252956, 9.860932793486303e-05, 7.484507843591551e-05,
+        6.404623785986706e-05, 7.396121737439585e-05, 9.765316106436946e-05,
+        0.0001254359304845669, 0.00015226070351266266, 0.00017553258572325467,
+        0.00019367313470355124, 0.00020563831896627251, 0.00021076096004516345,
+        0.00020869643449883995, 0.0001994022304032647, 0.0001831295003523657,
+        0.00016042412851292163, 0.0001321549932976047, 9.965257278637645e-05],
+    [4.236088680652613e-05, 0.0001271474661700779, 0.0002121286891668419,
+        0.00029743501978222965, 0.0003831979702880339, 0.00046955055048063173,
+        0.0005566276859864667, 0.0006445666830168735, 0.0007335076859022077,
+        0.0008235941579334138, 0.0009149733808895809, 0.0010077969800957494,
+        0.0011022214679491957, 0.0011984088257127878, 0.0012965271109254912,
+        0.0013967511077002046, 0.0014992630161594959, 0.0016042531890241112,
+        0.0017119209228692376, 0.0018224753030720044, 0.0019361361206651168,
+        0.002053134854788436, 0.002173715739736032, 0.0022981369207235322,
+        0.00242667170907216, 0.0025596099471418884, 0.002697259499998163,
+        0.002839947881159114, 0.002988024035399959, 0.003141860288820513,
+        0.0033018544968010898, 0.0034684324004641354, 0.00364205022872818,
+        0.003823197567211438, 0.0040124005339394605, 0.004210225294229386,
+        0.004417281964568775, 0.004634228949319681, 0.004861777775153189,
+        0.005100698481439503, 0.0053518256517668065, 0.0056160651664918715,
+        0.005894401787815107, 0.006187907688750694, 0.0064977520751459145,
+        0.006825212049564592, 0.007171684931373494, 0.007538702229043348,
+        0.007927945564384841, 0.008341264835771644, 0.008780699016460733,
+        0.009248500032385087, 0.009747160253317752, 0.010279444258258368,
+        0.010848425656158095, 0.011457529914560352, 0.012110584380989846,
+        0.01281187691217792, 0.013566224905523457, 0.014379056924044124,
+        0.015256509672518589, 0.016205543796554443, 0.0172340828952671,
+        0.018351181356571915, 0.019567228235566336, 0.02089419655496508,
+        0.0223459502975059, 0.02393862534107584, 0.025691106076810803, 0.027625627097921945,
+        0.029768540246262954, 0.032151302973909585, 0.03481176693944106,
+        0.03779587992177758, 0.04115996622719014, 0.044973831578743434,
+        0.04932506744611303, 0.054325140748539634, 0.06011821157497519,
+        0.0668942459679872, 0.07490912913269455, 0.0845166612867195, 0.0962217196605616,
+        0.11077338688941689, 0.12933918541678222, 0.15385970318774297, 0.18785608930341868,
+        0.23858401063034004, 0.3243712230642978, 0.5139303048952604, 2.201666986012245,
+        0.7894831402796035, 0.5673542186158469, 0.4791957834302699, 0.43141071504746153,
+        0.4021457140652118, 0.3832822804689348, 0.37105041721584103, 0.3634531056340355,
+        0.359341634986298, 0.35802277770620544, 0.35907173553676813, 0.3622359710135397,
+        0.3673837201085132, 0.37447683867512527, 0.3835586390866685, 0.3947527307064376,
+        0.4082721126858556, 0.4244405995806774, 0.4437325064104483, 0.46684366306325226,
+        0.4948227841278032, 0.5293333564947057, 0.5732407438339806, 0.632188289114297,
+        0.7203038759391458, 0.8981030447267384, 2.0308640854959044, 0.9017335617927681,
+        1.8226501395665269, 0.9327400222706231, 0.6058337504042653, 1.0399148537681562,
+        1.9815772165018042, 2.1075801642600376, 0.7094154466796062, 0.5695883740429609,
+        0.8630032871469261, 1.4558760746812194, 2.3914829567721303, 1.709025132248349,
+        0.9091982017885964, 0.6184253642429873, 0.6617516599474684, 0.9692168213948155,
+        1.5541496355746378, 2.112310646015454, 1.6843377056080144, 1.1272115815522479,
+        0.8066641955002926, 0.6721530077861599, 0.7288150181282717, 1.0055347568589186,
+        1.493508438839173, 1.8352369677148783, 1.5951937877824485, 1.228605375682295,
+        0.9647417026230847, 0.8011594439623211, 0.7394100579889984, 0.8210621235431707,
+        1.096600164384563, 1.4848176468841519, 1.5993542478283733, 1.3907141442283275,
+        1.1495611517166622, 0.9575329996921388, 0.6640482841924216, 0.5041772282195045,
+        0.41181388711240713, 0.4114215067235712, 0.4917353034966177, 0.5798544090927241,
+        0.6286760210244802, 0.635147857618657, 0.6118812979236782, 0.5690485442230973,
+        0.5110824282797013, 0.43805772390496167, 0.34741771062664056, 0.23618872596684634,
+        0.10899582493182157, 0.0936681090190486, 0.2436330369156975, 0.39254231164733755,
+        0.5141022406517028, 0.6031500660810103, 0.6643905561954483, 0.7054369961762019,
+        0.7330021517353555, 0.7519168206178649, 0.765355892754512, 0.7753106662958056,
+        0.782986439610218, 0.7890751487050115, 0.7939264427482283, 0.7976477351031462,
+        0.8001556926169654, 0.8011930518611963, 0.8003183833542392, 0.7968724952271963,
+        0.7899237452317837, 0.7781970276638261, 0.7600011119361245, 0.7331922997058555,
+        0.6952547660356073, 0.6436320854244633, 0.5764598219521508, 0.4937106128989253,
+        0.398395442542113, 0.2971700163023278, 0.2004153237048271, 0.12512078334999688,
+        0.10270359256036955, 0.13395612299608758, 0.1761766405788112, 0.21109736981789662,
+        0.23472694360740803, 0.24666965251391185, 0.2475717395782102, 0.23851985959424643,
+        0.22095609961242552, 0.19675874994358478, 0.16838798128279825, 0.1391022079072386,
+        0.11328379029071903, 0.09643658107703, 0.09276465358205949, 0.10057862653694775,
+        0.11374286268196757, 0.12702943838073227, 0.13752431805655135, 0.14388012934572306,
+        0.1456470084093693, 0.1429324321540292, 0.13625296729383637, 0.12647926930756834,
+        0.1148208051462467, 0.10281073738629455, 0.09222483734660096, 0.08479568306162855,
+        0.081605771808499, 0.0824800734124946, 0.086093784187314, 0.09075303334796775,
+        0.09504589620597487, 0.0980467444992946, 0.09927614560984849, 0.0986098998667154,
+        0.09620318542661767, 0.09243317021487031, 0.08784543941640847, 0.08308607435706325,
+        0.07880363756431269, 0.07551942791484709, 0.07349784435035224, 0.07268270286390317,
+        0.0727482648674111, 0.07323828767963939, 0.07371382080951817, 0.07385229097382968,
+        0.07348969084535413, 0.07262223747573193, 0.07138244331472883, 0.06999571987739742,
+        0.06871935994367714, 0.0677700954241638, 0.06725729836045762, 0.06714629239316598,
+        0.06726804280262706, 0.06736947873425837, 0.06718131637095179, 0.06648067671990165,
+        0.06513792783195624, 0.06314795197327543, 0.06064929622858008, 0.057930663093603035,
+        0.055414286494452444, 0.05359371952373458, 0.05290637087032798,
+        0.05356759658994206, 0.055463616503884275, 0.058186996294508304,
+        0.06117857250621207, 0.063871327280751, 0.06577922949641253, 0.06653662803276313,
+        0.06591276918125714, 0.06382020163053591, 0.06032835295960594, 0.05569098450681458,
+        0.050396674931652015, 0.04524345336894082, 0.041379385307963236,
+        0.04008268740604333, 0.04206392830044909, 0.0468974067729911, 0.05340830686404446,
+        0.06038041876928741, 0.06684793923868206, 0.07209605856802628, 0.07560378537830693,
+        0.07700234106485253, 0.07605448470109112, 0.0726500406819268, 0.06681793586605027,
+        0.058767720397116974, 0.04900875245224834, 0.03871263814439888,
+        0.030761009076253072, 0.030604193113612198, 0.040354155828732245,
+        0.05591431275051839, 0.07393270741973773, 0.09277201172497603, 0.11150344718106257,
+        0.1294838205673915, 0.14622038216702873, 0.16132686018078274, 0.17450772928975286,
+        0.1855503997251346, 0.19431852033480634, 0.20074438701672312, 0.20482030067591964,
+        0.20658939253424533, 0.20613656654358095, 0.20358008744074002, 0.19906412845169758,
+        0.1927523799000443, 0.18482266134189196, 0.17546239583911608, 0.16486479271767354,
+        0.15322562545470014, 0.1407405567620523, 0.12760302436688264, 0.11400273770153221,
+        0.10012484303861506, 0.08614981565594468, 0.07225420408745498, 0.058612682917164205,
+        0.04540313751768277, 0.032821703134458195, 0.021142340682300562,
+        0.011085827029986528, 0.00695970814146974, 0.012719626190579989,
+        0.019987338122292985, 0.026462194955894573, 0.03175721764498758,
+        0.03574600576119806, 0.03838016848428004, 0.03965544765497485, 0.03960317106111074,
+        0.038287552946501144, 0.035804174680015545, 0.0322781193156621,
+        0.027861146124422653, 0.022727680463200433, 0.017069647693788687,
+        0.011090404690231792, 0.004998571937801156, 0.0010188681566114654,
+        0.006721067577725202, 0.011964642927625536, 0.016579737684147926,
+        0.02043140004642875, 0.02341421153293709, 0.025454833100393804,
+        0.02651382256564053, 0.02658650248370804, 0.02570280767078783, 0.023926103223190963,
+        0.021351120749603974, 0.01810158402668962, 0.014329461728676142,
+        0.010223918332793465, 0.006080989671388923, 0.0030078908382484074,
+        0.0045992231036665705, 0.008249436180646467, 0.011828482719905583,
+        0.014964983352962433, 0.017504532663044477, 0.01935346404790186,
+        0.02045603925867391, 0.020789536738545725, 0.020362631153821087,
+        0.019214184325667277, 0.017411961909008275, 0.015051926375461237,
+        0.012260760194511413, 0.009211587914497344, 0.006199971233875146,
+        0.004026069784801854, 0.0044199937853427115, 0.00678511207117196,
+        0.009492327896671315, 0.011994532479921865, 0.014087322801906405,
+        0.015662087243597616, 0.016655662632156305, 0.017037621476642128,
+        0.01680617069234147, 0.01598626710481609, 0.014628472570561312,
+        0.012808860032477496, 0.010632322074702598, 0.008247688819721839,
+        0.005907807845684885, 0.0041933799840260565, 0.004183626549424174,
+        0.005789484784854301, 0.007886683514393771, 0.009920877862988977,
+        0.011670193152011557, 0.013021214455696872, 0.013908741862097772,
+        0.014298948829820503, 0.014183785634430545, 0.01357863610515341,
+        0.012521153083206957, 0.011071223923841772, 0.009313801710448802,
+        0.0073708292130048704, 0.005444823964992576, 0.00396561413497735,
+        0.003729536216900322, 0.004870338728073551, 0.006557942554834484,
+        0.008265603953645928, 0.009770859369877039, 0.01096184988686748,
+        0.011774308792140094, 0.01217299335621779, 0.012145453481920813,
+        0.011699500341626092, 0.010861972811146441, 0.009678427198809535,
+        0.008214787256099573, 0.006565058709744109, 0.004880337793035887,
+        0.0034747953560495476, 0.0030213051338530868, 0.0038622857766499653,
+        0.005302036000646073, 0.006808193424749102, 0.008162398223714106,
+        0.009258821398189815, 0.010036259976144084, 0.010458976007188913,
+        0.010510496999315104, 0.010191084473548028, 0.009516237856229947,
+        0.008515445318322228, 0.007231091448921665, 0.00571813737623333,
+        0.0040477640962868905, 0.0023374125034640227, 0.0011106702567781025,
+        0.0020063657655102264, 0.003631853314931177, 0.005218014791522377,
+        0.006635452984643405, 0.007822980313059714, 0.008740734521579517,
+        0.009363765459641037, 0.00968107215729114, 0.0096957156941086, 0.0094252485879177,
+        0.008902509054079128, 0.008177246240181868, 0.007319468637257718,
+        0.006425581622695944, 0.005626093440633973, 0.005081533980301432,
+        0.0049307140928423485, 0.005192168325103894, 0.005742304133712396,
+        0.006410361066379223, 0.007055611243829304, 0.007581640028273173,
+        0.007927205922467026, 0.008056834297564715, 0.00795503833234915,
+        0.007623254181647712, 0.007078569847408504, 0.006354142910967742,
+        0.005502359842369659, 0.004603787402433977, 0.0037871866123066165,
+        0.0032527900838930307, 0.003209491183235686, 0.0036579795917247213,
+        0.004383306911019031, 0.005177538739738464, 0.005910920464660228,
+        0.006506884698051838, 0.006919270064336478, 0.00712147333015642,
+        0.007101755630435007, 0.006861208488055128, 0.006412984332043871,
+        0.005782525134859727, 0.005009488006436882, 0.004153831217085075,
+        0.0033126603827599026, 0.00265769788392611, 0.0024443282976133202,
+        0.0027828567430683536, 0.003463801616450331, 0.004244331453073341,
+        0.004983634579718878, 0.00560487688504915, 0.006062820875636316,
+        0.006330508448227194, 0.006394148374756047, 0.00625106037841917,
+        0.005908823451175928, 0.005385103585400178, 0.00470841058891835,
+        0.003921184754926153, 0.0030898280553974104, 0.0023356683614659587,
+        0.0019000885660259068, 0.0020475130945724535, 0.002652054935927125,
+        0.0034129954125011537, 0.004160618039174682, 0.004812378613320629,
+        0.0053219241246424895, 0.005660926206839106, 0.005813021773988015,
+        0.005771625867869575, 0.005539038002204197, 0.005126048784032016,
+        0.004551951394516129, 0.0038454811581753053, 0.0030487557641549028,
+        0.0022323889712534363, 0.001555053934573985, 0.0013820244483824635,
+        0.0018647927245654325, 0.0026169751541348036, 0.003391667562237052,
+        0.004092750609174704, 0.004671855888343551, 0.005099143880474207,
+        0.0053555938548580165, 0.005430690919060571, 0.0053216091034761544,
+        0.005032811913134024, 0.004575766362235034, 0.003968792576287113,
+        0.003237479031333521, 0.002417526355828413, 0.0015702015819180062,
+        0.0008904577577575504, 0.001019515770582433, 0.0017764673342482138,
+        0.002615367215249726, 0.0034030157238597192, 0.004089746218596072,
+        0.004644900923657058, 0.005046756183329725, 0.005280424719444133,
+        0.005337373229930642, 0.0052152723637186715, 0.004917838435462897,
+        0.004454564479974493, 0.003840318853266278, 0.0030948381983601997,
+        0.002242247281248946, 0.0013114560516539577, 0.0003571846713378623,
+        0.0007170968213386986, 0.001703278603247245, 0.002657839781066764,
+        0.003543942261497262, 0.0043332035945943415, 0.0050008935956908,
+        0.005525942800042434, 0.005891272284284542, 0.006084070268212456,
+        0.006095951356194948, 0.005922992216644992, 0.0055656631550920314,
+        0.005028707598037331, 0.004321104605871627, 0.003456559060979605,
+        0.002456591360085812, 0.001372722191556064, 0.0006413677713367585,
+        0.0015593392572019003, 0.002933902576986537, 0.004405473923167134,
+        0.005922596193037228, 0.007457813849367832, 0.008988532247137592,
+        0.010493952515558501, 0.011954315721124936, 0.013350673629037633,
+        0.014664824544692322, 0.015879326538540052, 0.016977568517581303,
+        0.017943897361999573, 0.018763801624799414, 0.019424149134237914,
+        0.01991347088898928, 0.020222278581711557, 0.020343398834714088,
+        0.020272304293963046, 0.020007420349237998, 0.019550386491236697,
+        0.018906253122753344, 0.018083597893379016, 0.017094550226623602,
+        0.015954718678089484, 0.014683023452890248, 0.013301446911110624,
+        0.011834731142760875, 0.010310081400511685, 0.008756998539459349,
+        0.007207525986147207, 0.00569766778637332, 0.00427230409280773,
+        0.003001831982154118, 0.002038676357309148, 0.0017022353964486095,
+        0.0020780316586231154, 0.002731433643868508, 0.003377845716144721,
+        0.003919614566600406, 0.0043227721776774395, 0.004576473562647728,
+        0.004681123625285748, 0.004644255955600472, 0.004478797840256475,
+        0.0042022400545720425, 0.003836323433733138, 0.0034072829133076437,
+        0.002946990333276577, 0.0024955693522248517, 0.002105383310015479,
+        0.0018408984064368357, 0.0017561656543653111, 0.00184856641623937,
+        0.0020546908911115453, 0.0023010321678995243, 0.00253505257814571,
+        0.002725449263618512, 0.0028553545078543042, 0.0029174006407798685,
+        0.002910952006219544, 0.0028406007228070056, 0.0027153332325496374,
+        0.0025480740733209288, 0.002355443033704044, 0.0021575085075907687,
+        0.0019770058047753284, 0.0018369214768144595, 0.0017552906365924917,
+        0.0017383960865582325, 0.0017775492325323604, 0.0018532819741638419,
+        0.0019433617152246553, 0.00202872580432431, 0.0020957487768912967,
+        0.0021363021408369663, 0.0021470603353105234, 0.0021287093207105843,
+        0.002085218774922929, 0.0020231423003220232, 0.0019508420476646794,
+        0.0018775151687272433, 0.0018119381304522193, 0.0017609960230550942,
+        0.0017283327444193293, 0.0017136670446241562, 0.001713173771830175,
+        0.001720811677241066, 0.0017300231886905467, 0.0017352144049048366,
+        0.0017327249716308374, 0.0017212783286428017, 0.0017020085476570639,
+        0.0016781369511280676, 0.0016543162396180588, 0.0016356485976472411,
+        0.0016264673405769622, 0.0016291401642538142, 0.001643284804618793,
+        0.0016657092135188695, 0.001691081449961658, 0.0017130293360505646,
+        0.001725294263712695, 0.0017227000647223145, 0.0017018773205570758,
+        0.0016617919734117177, 0.0016041531835717258, 0.0015337408032314167,
+        0.0014585918728617546, 0.0013897756131747122, 0.001340179080675768,
+        0.0013216726911377623, 0.0013410306744744997, 0.0013968969096301476,
+        0.0014801991432456655, 0.001577463766654298, 0.0016743866950337644,
+        0.0017580606269461025, 0.0018179355114893978, 0.0018461263141572764,
+        0.0018375171103106823, 0.0017898845259953064, 0.0017041613895696452,
+        0.0015849695244155228, 0.001441635014845225, 0.001289974421205289,
+        0.0011547175077199566, 0.0010697769623244163, 0.0010680766871520699,
+        0.001159510351034018, 0.0013233167818094652, 0.001526062360088045,
+        0.0017377917826394773, 0.0019356543828186307, 0.00210252090228562,
+        0.0022253698627578066, 0.0022943426141048807, 0.002302322014953355,
+        0.002244837399272037, 0.0021202182372376172, 0.0019300864927852231,
+        0.0016806227526215726, 0.0013860942018223527, 0.0010798852567416957,
+        0.000848015259633559, 0.0008571298902619882, 0.001160520833194306,
+        0.0016295581664854872, 0.0021715099209752616, 0.0027439628747816676,
+        0.0033233419701526115, 0.0038930361126363064, 0.004439662795609926,
+        0.004951851893111713, 0.005419859493104124, 0.005835472353607961,
+        0.006192008899023738, 0.006484338948468298, 0.006708888639326746,
+        0.006863616109747556, 0.006947952889512407, 0.006962711195414183,
+        0.006909960599438134, 0.006792879709972893, 0.006615589942367955,
+        0.00638297929560064, 0.006100524348566911, 0.005774118461234213,
+        0.00540991343048577, 0.005014180654489092, 0.0045931962875606315,
+        0.004153153077579581, 0.0037000998239986507, 0.003239908121171678,
+        0.0027782661370683824, 0.00232070277708733, 0.0018726592687831173,
+        0.0014396737896527926, 0.0010279468940622791, 0.0006466962460489867,
+        0.0003242589095582372, 0.00023871279349740613, 0.000456430868096298,
+        0.0007017345346162422, 0.0009191530325328788, 0.0010985987469391836,
+        0.0012365137964513784, 0.0013314550610923023, 0.0013832282044116495,
+        0.0013926562806050387, 0.001361497606535073, 0.001292394974757557,
+        0.0011888197096973354, 0.001054997764882868, 0.0008958137954950919,
+        0.0007166931978673059, 0.0005234644492533562, 0.00032220589762169344,
+        0.00011908747566911634, 7.989402009213566e-05, 0.00026877942098183226,
+        0.00044227014263683575, 0.0005955330588746847, 0.0007244633230625482,
+        0.0008257855732733759, 0.0008971426086617934, 0.0009371563479961868,
+        0.0009454587327978956, 0.0009226921655068479, 0.0008704810385266824,
+        0.0007913790146371822, 0.0006888034332150343, 0.0005669879164783292,
+        0.0004310614917686239, 0.000287787823150808, 0.00015139966885466594,
+        0.0001024142277396559, 0.00020871143413856246, 0.000338205365604867,
+        0.00045899955186100955, 0.0005634380456111334, 0.00064738211193243,
+        0.0007081118941991338, 0.0007439626587868596, 0.0007542414889899917,
+        0.0007391965480972489, 0.0006999896099563615, 0.0006386658170719737,
+        0.0005581395104918386, 0.00046226316947189835, 0.000356217048753114,
+        0.000248265465278335, 0.00015847818327403599, 0.00014275543355348486,
+        0.00021469030135229218, 0.0003112700401961987, 0.0004052880607988523,
+        0.00048765929492069137, 0.0005538572548960047, 0.0006011455211992777,
+        0.0006279213106964787, 0.000633523911692787, 0.0006181639561044091,
+        0.0005828873768285741, 0.0005295589993797661, 0.0004608916062712462,
+        0.00038062100095008776, 0.0002941760491553974, 0.0002111932691305567,
+        0.00015410525851650603, 0.0001600728430770672, 0.00022072276440506097,
+        0.00029780817353087776, 0.000372895396158503, 0.00043833391576796906,
+        0.0004900915741853944, 0.0005257617476033316, 0.0005439890745415895,
+        0.0005442790243882854, 0.0005269233352243419, 0.0004929671759064915,
+        0.00044420845332926256, 0.00038326686902935726, 0.00031385832673282914,
+        0.00024172914538075343, 0.00017775406894911347, 0.00014472555262243553,
+        0.00016465320263676082, 0.000219988199457526, 0.0002847475974876962,
+        0.00034642374928795563, 0.00039916235824751043, 0.0004396965480308942,
+        0.00046607191866818035, 0.00047723651388134917, 0.0004728931423806082,
+        0.00045343862511007727, 0.0004199399817358474, 0.00037414825554525584,
+        0.0003186009378660477, 0.00025698672100620457, 0.00019535170847971407,
+        0.00014580262718683464, 0.00013081680218513507, 0.00016031687404037174,
+        0.00021271511478557686, 0.000269293189038694, 0.0003214204662583781,
+        0.0003647673394327096, 0.0003968045411405588, 0.00041600971444534637,
+        0.0004215991140382659, 0.00041342349442241767, 0.00039191837323456245,
+        0.00035807648129584246, 0.0003134448204991845, 0.00026019021931188765,
+        0.0002014025577368453, 0.0001423578709283028, 9.601773812465252e-05,
+        9.232695707490661e-05, 0.00013363644432684682, 0.0001885894506397593,
+        0.0002427354838459446, 0.00029074294652016674, 0.00032988542947604146,
+        0.0003585146129444642, 0.0003756744433516975, 0.0003809915311566289,
+        0.00037464573633782866, 0.0003573726980020762, 0.00033049595069584316,
+        0.0002960159430954756, 0.0002568251296133064, 0.00021717947927435167,
+        0.00018349687525035224, 0.00016449520502646807, 0.00016699649310601336,
+        0.00018879471075804562, 0.00022100500506791, 0.00025549040132028287,
+        0.00028693377904104815, 0.0003120618222228413, 0.0003288680262388441,
+        0.000336203319356272, 0.0003335836472358389, 0.000321101623254337,
+        0.00029939334388228616, 0.0002696535439480632, 0.00023373436099362638,
+        0.0001944425743559079, 0.00015632244757922553, 0.00012724571865126895,
+        0.00011832787619388876, 0.0001339333434250008, 0.00016499344068830098,
+        0.00020087984638792201, 0.000235210877930783, 0.00026442566522287764,
+        0.00028640118110923827, 0.0002998514239748358, 0.0003040893648088131,
+        0.0002989299899845473, 0.0002846505695764236, 0.0002619825551984788,
+        0.00023214227488243307, 0.00019695023097616738, 0.00015919417662664152,
+        0.00012366991932522713, 9.943085818464881e-05, 9.848463424724751e-05,
+        0.00012075590167405927, 0.0001539121993107862, 0.00018870285744661836,
+        0.00022038506277482575, 0.0002463531670634725, 0.0002650274224853618,
+        0.0002754541610686618, 0.00027715890607164003, 0.0002700883957356019,
+        0.00025458709929413234, 0.00023139491516383946, 0.00020167894731642293,
+        0.00016715746392528566, 0.00013051275837648571, 9.67548267999345e-05,
+        7.662046324250986e-05, 8.317968641942224e-05, 0.00011061970043106747,
+        0.00014482776778540447, 0.0001784105234629397, 0.00020791762980860304,
+        0.00023141028480950233, 0.00024767514344123756, 0.00025597633496034206,
+        0.0002559699305683321, 0.0002476704739813919, 0.0002314358070844118,
+        0.00020796351135199712, 0.00017831169755653124, 0.0001439985483695453,
+        0.00010739376499869555, 7.336819181048615e-05, 5.523835423506359e-05,
+        6.914037433414583e-05, 0.00010129363833271749, 0.00013666863776486696,
+        0.00016980455784821891, 0.00019825312576517593, 0.00022054702855216655,
+        0.0002357153683181075, 0.0002431510838184027, 0.00024256960487115884,
+        0.0002339923944554399, 0.0002177359990065608, 0.0001944023258140841,
+        0.0001648757577849448, 0.00013035446028194082, 9.254187835409896e-05,
+        5.4839381568488145e-05, 3.2363290821119446e-05, 5.41580759327863e-05,
+        9.169422650356472e-05, 0.00012940538721393995, 0.00016385698072068878,
+        0.00019337233627312076, 0.00021678917630294983, 0.0002332549259319234,
+        0.00024218594375383155, 0.00024326058766945279, 0.0002364172574593762,
+        0.0002218492132569446, 0.00019999362550918734, 0.00017151434395070995,
+        0.0001372790029982819, 9.833290242771808e-05, 5.5883573246580663e-05,
+        1.1717673614169894e-05], [1.303928283826924e-06, 3.914007704639663e-06,
+        6.530763377677412e-06, 9.158670147828548e-06, 1.1802238750504755e-05,
+        1.4466031090841244e-05, 1.715467457004267e-05, 1.9872877843336646e-05,
+        2.26254463539105e-05, 2.541729858214717e-05, 2.8253482865024185e-05,
+        3.1139194993834306e-05, 3.4079796365184284e-05, 3.7080833292808674e-05,
+        4.014805707782315e-05, 4.328744536307512e-05, 4.650522464038324e-05,
+        4.9807894142384576e-05, 5.320225133248313e-05, 5.6695418934227646e-05,
+        6.0294874040296244e-05, 6.400847906189377e-05, 6.784451506952355e-05,
+        7.181171759808983e-05, 7.59193151854245e-05, 8.017707088860734e-05,
+        8.459532721974044e-05, 8.918505461599882e-05, 9.39579040368051e-05,
+        9.892626384508248e-05, 0.00010410332175498771, 0.00010950313194638162,
+        0.00011514068825530068, 0.00012103200378526667, 0.00012719419782535326,
+        0.00013364559063838897, 0.00014040580715754934, 0.0001474958903241348,
+        0.00015493842535312788, 0.000162757675834648, 0.00017097973326589945,
+        0.00017963268120158767, 0.0001887467759601194, 0.00019835464547392974,
+        0.00020849150868920718, 0.00021919541739694464, 0.00023050752389490036,
+        0.0002424723765123003, 0.0002551382474743862, 0.0002685574960036443,
+        0.0002827869716715388, 0.0002978884627925494, 0.0003139291953347247,
+        0.000330982389147515, 0.0003491278786944469, 0.00036845280659856107,
+        0.00038905240017714134, 0.00041103084140861504, 0.0004345022437715847,
+        0.0004595917502959535, 0.0004864367699371783, 0.0005151883721240321,
+        0.0005460128622390362, 0.0005790935645709726, 0.0006146328436958786,
+        0.0006528544005978362, 0.0006940058855266281, 0.0007383618772861561,
+        0.0007862272875725981, 0.0008379412587774913, 0.0008938816367156932,
+        0.0009544701147682266, 0.0010201781645550678, 0.001091533889187399,
+        0.0011691299637898328, 0.0012536328591108438, 0.0013457935865103315,
+        0.001446460249679783, 0.0015565927513001717, 0.001677280079823237,
+        0.0018097606935486984, 0.0019554466406820816, 0.0021159522029047424,
+        0.00229312803813698, 0.002489102041005734, 0.002706328446105975,
+        0.002947647098404871, 0.0032163553283293404, 0.0035162955407687397,
+        0.003851962516653663, 0.004228635587252984, 0.004652542417226189,
+        0.005131063236209225, 0.005672987234245254, 0.0062888367821635465,
+        0.006991280639763491, 0.0077956650191492016, 0.008720702410417459,
+        0.009789373959317303, 0.01103012456757379, 0.01247846474628363,
+        0.014179146308464206, 0.016189161350911866, 0.018581945011257154,
+        0.021453376234467324, 0.02493053050194517, 0.02918476465387159,
+        0.03445184895171824, 0.041064018427904435, 0.04950315399151081,
+        0.06049365581444694, 0.0751755588599354, 0.09545624814646479, 0.12481572639954466,
+        0.17050813381820737, 0.251624967977341, 0.4525644663056859, 2.9268183470752502,
+        0.26742841214894314, 1.4405068668756176, 1.7319109302554219, 0.6022189923032285,
+        0.11918908612018428, 0.9075457111596222, 2.7568803779814557, 2.143635341000016,
+        2.307928166384319, 3.8296188274486513, 6.511405047916822, 3.7557713811330458,
+        1.7301317564091783, 1.4174047667823366, 1.518019997988656, 1.7011193040077466,
+        2.0066551951261142, 2.496087200881536, 2.690280099676185, 1.7934007461360537,
+        1.1486968295003923, 0.9786854251602503, 1.0634018829389313, 1.2996158217999134,
+        1.6848867625810486, 2.190755304960999, 2.343817962170848, 1.8034227489485344,
+        1.2720000745536761, 0.9784650564676621, 0.8863338463972367, 0.9666416197038336,
+        1.2109428796002661, 1.6172289854590276, 2.0319933092111655, 1.9917007597871146,
+        1.5826567499747455, 1.2133691408473815, 0.9682055743696157, 0.6662809479363695,
+        0.5671800744041452, 0.5835094312510376, 0.6676093339391966, 0.7563615928454934,
+        0.797147155793382, 0.7787435401510093, 0.7205910833971251, 0.6433344782887578,
+        0.5576357875888097, 0.46635550050846836, 0.36853721889744806, 0.2631458615775169,
+        0.15925870242095075, 0.13065755894575753, 0.23995771534172497, 0.38357791078561515,
+        0.5133263938683388, 0.611907488758752, 0.6779689877242601, 0.7186049992547229,
+        0.7423605649708297, 0.755991302066854, 0.764005277781508, 0.7691755528583387,
+        0.7731304270964855, 0.7767858863219678, 0.7806195863913737, 0.7848323450818908,
+        0.789436550342085, 0.7942967595446756, 0.7991365983018694, 0.8035185462639083,
+        0.8067983574061749, 0.8080533868438585, 0.8059851924195838, 0.7988051367442173,
+        0.7841344832512249, 0.7589966591224875, 0.7200476312924776, 0.6642349114444555,
+        0.589967192047481, 0.498477197047994, 0.3945594008367929, 0.2860117156428788,
+        0.182591140637376, 0.09955874844638445, 0.07995722829689189, 0.12617660766064612,
+        0.1789116135752899, 0.22239149804057026, 0.2539654439876384, 0.27325834033379626,
+        0.2804918736645541, 0.27620300216655513, 0.26127535921789813, 0.23703685754305645,
+        0.2053355371030997, 0.16859025622541032, 0.12995175656308833, 0.09406247548310022,
+        0.06948175069420752, 0.06807218509792895, 0.08675381570222766, 0.11151476615417799,
+        0.1347958781144704, 0.1535858863718187, 0.16655142456899916, 0.1730963939629722,
+        0.17308284646182528, 0.1667514423728098, 0.15469991843572317, 0.13787500264442906,
+        0.1175828185157224, 0.09558162304949043, 0.07443301939100941, 0.058371690561665884,
+        0.05335376119382439, 0.06104779663877278, 0.07564320055841926, 0.09151948838587436,
+        0.10571490404888002, 0.11673239417322578, 0.12377998997040181, 0.12648532631819376,
+        0.12479223393731527, 0.11891717850519382, 0.10932461658821883, 0.0967169883275456,
+        0.08206272101868756, 0.06672794939524894, 0.052850124892974436,
+        0.04392867102302375, 0.04371419699109654, 0.05159409034936942, 0.06326154471764708,
+        0.07533067502664595, 0.08595209496930413, 0.09411457458408193, 0.09925445640654583,
+        0.10109882317177402, 0.09959974215683963, 0.0949009470038938, 0.08731936581004383,
+        0.07734355609715989, 0.0656685356260266, 0.0533211957647377, 0.04200566012767092,
+        0.03471005881188232, 0.03486498209787287, 0.04202788499361823, 0.052448512561397716,
+        0.06327518387047368, 0.07297833128226111, 0.08070822368764619, 0.08596486366848514,
+        0.08846933852690339, 0.08811089392189993, 0.08492182459858279, 0.0790653296174319,
+        0.07083538029369991, 0.06067901143514954, 0.049276916866748455,
+        0.03780149746136979, 0.028678612411055904, 0.026353693387319292,
+        0.032660430166665914, 0.04351092586203189, 0.05537737438247732,
+        0.06657671612756375, 0.07621957139015496, 0.08374831944671855, 0.08878734690113764,
+        0.09109106821349805, 0.09052311369807996, 0.08704667323773731, 0.08072061124775223,
+        0.07170255044729973, 0.060268752431288916, 0.04689045270874706,
+        0.03256282763589225, 0.02062260837415154, 0.0216448680905585, 0.03623702651342847,
+        0.05492539282287931, 0.07459510725817327, 0.09417281129401107, 0.11303621385840446,
+        0.1307244602134592, 0.14687350265711518, 0.16120005880889413, 0.1734968704408812,
+        0.18362919232160646, 0.1915296166608907, 0.19719078673688645, 0.20065652001306877,
+        0.20201219547572022, 0.2013752572484048, 0.19888650171891664, 0.19470255661527286,
+        0.18898970543192042, 0.1819190082422687, 0.1736625429972446, 0.16439054158932426,
+        0.15426920907203912, 0.14345906980916998, 0.13211375491069619, 0.12037920552326699,
+        0.10839329795851026, 0.09628589083280224, 0.08417925582836931, 0.07218879718837043,
+        0.06042391224500668, 0.048988815681131545, 0.03798315832586126,
+        0.027502327465718783, 0.017637478054925465, 0.008476409164889377,
+        0.00039275291245185746, 0.007461181616409788, 0.014075295571100429,
+        0.019725750326075903, 0.02437061973602896, 0.02798412318207086,
+        0.030556760820269237, 0.03209667387269532, 0.032630934553850376,
+        0.03220651085022658, 0.030890776733450653, 0.028771550831853822,
+        0.025956885559075927, 0.022575384215469455, 0.018779298438884623,
+        0.014757390198015894, 0.010782852420146543, 0.007397339048185482,
+        0.005889553851843274, 0.0072747909369596814, 0.010106437795743313,
+        0.013121144400589617, 0.01585332096837559, 0.018108947701059547,
+        0.019789573967542096, 0.02084504941876239, 0.02125876728514987,
+        0.021042147529772244, 0.02023215176935826, 0.018890173846188858,
+        0.01710241216676003, 0.014983290548174964, 0.012685942490304166,
+        0.010428281115771107, 0.008543735986614643, 0.007504937373034185,
+        0.007669980557144144, 0.008843553094854541, 0.010498423777532743,
+        0.0122197166839264, 0.013765303275613256, 0.014998493300748508,
+        0.015842610094525176, 0.016259727444303734, 0.016241024878011642,
+        0.01580223262788995, 0.014981590191142006, 0.013839672110201894,
+        0.012461596189233091, 0.01096308279731642, 0.00950189871076409,
+        0.008290158096312181, 0.007576208736918487, 0.007534471216968543,
+        0.008118059782664167, 0.00909263211012225, 0.010203422934030799,
+        0.011261038189041147, 0.012142221762317551, 0.012771439186634016,
+        0.013106933882292112, 0.013132690092542717, 0.012854124335779734,
+        0.01229598850386745, 0.011501876400515604, 0.010535360920897333,
+        0.009483068535808669, 0.008459196684262546, 0.007606550167801105,
+        0.007078020856081788, 0.006978670214278632, 0.007297296869559587,
+        0.0079107250322881, 0.008658625709191296, 0.009402793983716632,
+        0.010043333819247793, 0.01051444485737631, 0.010777115050494022,
+        0.010813671806184083, 0.010624441190641305, 0.010225950112084123,
+        0.009650281809562152, 0.008945445838016984, 0.008176622353778052,
+        0.007427356445133984, 0.006797104716768339, 0.006386826210248607,
+        0.006265547473855778, 0.0064336333891584375, 0.006820687051059294,
+        0.007322668745188926, 0.007840131090930954, 0.008295358241833948,
+        0.008634366277882891, 0.00882389187556746, 0.008848105226535782,
+        0.008706222982367519, 0.008411016542002193, 0.007987998053043496,
+        0.007475048703248116, 0.006922067586901144, 0.0063895439534673165,
+        0.005943583983192382, 0.005643909830769482, 0.005524767327661947,
+        0.005578925951147255, 0.00575944658308335, 0.005998793813334205,
+        0.006229646615699604, 0.006396870796296128, 0.0064614229853855966,
+        0.006400560577644937, 0.006207369154946551, 0.005891036883839026,
+        0.005478656414325997, 0.005019103878910924, 0.0045882873760709824,
+        0.004289353536277008, 0.004230119980965287, 0.0044685453871009945,
+        0.004974567267486215, 0.0056587115046330275, 0.006423567998594428,
+        0.007188345036496613, 0.007891396058666525, 0.008486651053117245,
+        0.008940345066837704, 0.009229029318347286, 0.009338526340147342,
+        0.009263431137683131, 0.009006921538125788, 0.008580799646744991,
+        0.008005833487560496, 0.007312636580932132, 0.006543536974062704,
+        0.005756040497058659, 0.005027828498866591, 0.004458900657070389,
+        0.004154689305851637, 0.00417279737343901, 0.0044737900980606595,
+        0.0049483153925840755, 0.005482449997008497, 0.005989541350738078,
+        0.0064110923816404885, 0.006709829704115098, 0.006864025746780565,
+        0.00686407536953778, 0.006710648562662341, 0.006413851776787372,
+        0.005993175892794173, 0.005478321069967213, 0.004911227813131889,
+        0.0043494995273194205, 0.0038694488647638306, 0.0035601277693502035,
+        0.003492271560937562, 0.0036709873036436004, 0.004029435958945272,
+        0.004474576360552899, 0.0049258833704349395, 0.00532511208374459,
+        0.0056330134915670545, 0.0058246564082645716, 0.005886219051377723,
+        0.005813159429442866, 0.005609311515540137, 0.005286660153053644,
+        0.004865818198345313, 0.004377511563091002, 0.00386559403912564,
+        0.0033915548573898256, 0.0030362844210832214, 0.0028835991039865704,
+        0.0029725310189658996, 0.0032628964588861985, 0.003667831600434089,
+        0.004104032513473097, 0.004510007692781693, 0.004844014280145878,
+        0.0050787039882492415, 0.00519735609674593, 0.005191762369588804,
+        0.005061156526801586, 0.004811802269659826, 0.0044571474444683665,
+        0.0040187591355817795, 0.003528668466444835, 0.0030342359408216764,
+        0.0026058324989769615, 0.0023386381826164156, 0.002317270303327166,
+        0.0025426145417102295, 0.0029290919982982735, 0.0033785145405949685,
+        0.0038189165937795523, 0.004203194375835861, 0.0045006886284961155,
+        0.004691653131717028, 0.004764408162159213, 0.004713963701708097,
+        0.004541393198391905, 0.004253664228370291, 0.003863942458781186,
+        0.0033927570049548817, 0.002871160941582949, 0.0023486904832976233,
+        0.001910595987828269, 0.001691592541727934, 0.0017984683535820735,
+        0.0021710647880338633, 0.0026663293054250436, 0.003181564269009294,
+        0.003657745372866286, 0.00405916432256138, 0.004362525487730219,
+        0.004552387811468303, 0.004619285610940685, 0.004558919995926553,
+        0.004371788860672774, 0.004063031248911777, 0.003642483308483173,
+        0.003125206597946005, 0.0025334504399351235, 0.0019037424480143784,
+        0.001315633124715977, 0.0009947913684019098, 0.001236025091040321,
+        0.0018258000529450587, 0.002501172889814588, 0.0031652939946085665,
+        0.0037750616347840926, 0.004303660900394214, 0.004731385764560913,
+        0.005043050099634622, 0.005227161933826951, 0.005275623097037714,
+        0.005183575364236418, 0.0049492616986890735, 0.004573855719342547,
+        0.004061246952859572, 0.003417788700217292, 0.0026520412270463877,
+        0.0017746592446296198, 0.0008000174210764633, 0.00029883001083930497,
+        0.0014216825835169824, 0.0026212176866436737, 0.003868071924435691,
+        0.005147003229400656, 0.006443613948997239, 0.007743875393476912,
+        0.00903407816651949, 0.010300815066463943, 0.011530954195570473,
+        0.012711604907064652, 0.013830088799087235, 0.014873929787108752,
+        0.01583087612167935, 0.016688964342900667, 0.017436631211316916,
+        0.01806287515247335, 0.01855746416975897, 0.01891118294277139, 0.019116108264604127,
+        0.01916589930801206, 0.01905608756097236, 0.01878435065679205, 0.018350754695416995,
+        0.017757950914962607, 0.017011314617920114, 0.0161190169860382,
+        0.015092023788406695, 0.013944019065473262, 0.012691257011776667,
+        0.01135235250586136, 0.009948032857508492, 0.00850089838362107,
+        0.007035302428479609, 0.005577651782494924, 0.004158128424492699,
+        0.00281813612567935, 0.0016494325059745625, 0.001033633493098724,
+        0.0015060879969919863, 0.002346824370326825, 0.0031535644039926754,
+        0.0038440014737320806, 0.004392427785784198, 0.004788587644475687,
+        0.005029560995102944, 0.005117474629733489, 0.005058622838926407,
+        0.004863002247428995, 0.0045439982323536325, 0.004118186478438867,
+        0.0036053572683977585, 0.0030291211048301477, 0.002419182003576564,
+        0.001818890573946574, 0.0013100561834593248, 0.0010641259905476306,
+        0.0012243822643128886, 0.0016308791861217294, 0.002093531166017538,
+        0.0025284494069824364, 0.002899062944470115, 0.003186494431174713,
+        0.0033803844272333504, 0.003475835921380031, 0.003472233039477465,
+        0.003372701354058191, 0.003183831178346052, 0.002915582657059496,
+        0.002581472902281628, 0.002199419031151783, 0.0017942969847273272,
+        0.0014051114433535116, 0.0011020038898911912, 0.0009949838443940745,
+        0.0011341780731278324, 0.0014243094715075527, 0.0017588284885119835,
+        0.0020797947607504572, 0.0023574058301839085, 0.0025747620775832375,
+        0.0027218589058283175, 0.0027932973475130554, 0.0027873470719668985,
+        0.002705529285146757, 0.0025524387088147783, 0.0023357544620511714,
+        0.002066561358636292, 0.0017603906266795528, 0.001440090470822843,
+        0.001143189091967839, 0.0009356106646400126, 0.0009023932518794546,
+        0.0010552302530257112, 0.0013115243673629585, 0.0015956380494602945,
+        0.0018653935607094174, 0.002097499554326321, 0.0022779241400390495,
+        0.0023979412443870607, 0.002452564219608404, 0.0024398975615440147,
+        0.0023608605430560283, 0.0022190974767610505, 0.002021061808111708,
+        0.0017764230929001206, 0.0014992687474058271, 0.0012114324941795377,
+        0.0009512718500546916, 0.0007891931109422979, 0.0008063267776515057,
+        0.0009892849003400495, 0.0012507608255667834, 0.0015274576814468383,
+        0.001785911962058575, 0.0020070649658363144, 0.0021787904411454603,
+        0.002293072292101524, 0.002344934838415584, 0.002332024262311431,
+        0.0022544495251387744, 0.0021147552906043417, 0.0019180321072621213,
+        0.001672317351090073, 0.001389797096839887, 0.001090490485534009,
+        0.0008140952176465471, 0.0006497895804311562, 0.0007113366235492977,
+        0.0009571315830235206, 0.0012717500733912684, 0.0015939314445383521,
+        0.0018946999989102405, 0.002156929012691297, 0.0023686435157213147,
+        0.0025208995428075906, 0.002607076144674396, 0.0026226398355057657,
+        0.002565078110726436, 0.0024339023997733533, 0.002230709820464565,
+        0.001959381141912414, 0.0016267154086170956, 0.0012447085510126324,
+        0.0008408255051831858, 0.000520241562302689, 0.0006095025642993673,
+        0.001053147005161889, 0.001594588229182483, 0.002164605745335808,
+        0.0027391642257526246, 0.0033037648448791365, 0.0038471076072479323,
+        0.004359608673740935, 0.004833013743309111, 0.005260315958042489,
+        0.00563576075599468, 0.005954865277015058, 0.0062144250109811856,
+        0.006412497004313178, 0.006548356147099843, 0.006622424727854051,
+        0.006636177599629126, 0.006592026711989141, 0.0064931897309722965,
+        0.006343548110086758, 0.006147500332773038, 0.005909816127442804,
+        0.005635497256115609, 0.005329649991919019, 0.004997373630007801,
+        0.004643668341739171, 0.004273364420454869, 0.0038910735493244324,
+        0.003501161239219606, 0.003107738155718791, 0.002714666805597603,
+        0.0023255791095268957, 0.001943899847755464, 0.0015728709016423032,
+        0.001215571665727932, 0.0008749321132719808, 0.0005537379161723546,
+        0.0002546477505221869, 2.1938978401072233e-05, 0.0002683084787686192,
+        0.00048758595858497096, 0.0006766193618761849, 0.0008341096342357361,
+        0.0009592014247646064, 0.001051511665402141, 0.0011111668036305746,
+        0.001138831757097178, 0.00113572711365011, 0.0011036336712800636,
+        0.0010448855080217212, 0.0009623560457978835, 0.000859448297559415,
+        0.0007401172400026451, 0.0006090016870842769, 0.0004719161007501211,
+        0.0003376793267856627, 0.0002255893364725071, 0.00018518489694625357,
+        0.00024581864759725736, 0.00034840061060516936, 0.00045414463330101836,
+        0.0005499455355613751, 0.0006302030985044642, 0.000691914047700495,
+        0.0007334105693438054, 0.0007539697535230836, 0.0007536683016845892,
+        0.0007333177986633725, 0.0006944346333137407, 0.0006392410989089123,
+        0.0005707245344185808, 0.0004928302092466889, 0.0004109721073127532,
+        0.0003332580737150976, 0.00027274726339805597, 0.0002473822141270379,
+        0.0002663958555384372, 0.0003171355382102056, 0.000380522352984877,
+        0.000443876026834627, 0.0005001127067803097, 0.0005451874113675017,
+        0.0005767543597214391, 0.0005935821251734913, 0.0005952962460449546,
+        0.0005822617031582671, 0.0005555339250466486, 0.0005168599084762962,
+        0.00046874374467464165, 0.0004146238487569296, 0.00035924294810243517,
+        0.0003092417072894346, 0.00027345369060519234, 0.0002607374839229037,
+        0.0002738509106914639, 0.00030646304632915333, 0.0003486335112515317,
+        0.0003921460787525146, 0.000431485223477867, 0.0004631518874762034,
+        0.00048500542343580844, 0.000495876749960967, 0.0004953652231621199,
+        0.0004837369527952166, 0.00046188278445923113, 0.00043132362444106055,
+        0.0003942715722423494, 0.0003537689416570887, 0.00031391160016133935,
+        0.0002800219082357152, 0.00025818338533254906, 0.0002531293252134962,
+        0.0002651608164394017, 0.0002897669575808527, 0.00032062614408483495,
+        0.0003522122327336665, 0.0003805085469570284, 0.0004028153720077187,
+        0.00041743545842519837, 0.0004234490427135255, 0.0004205807358277552,
+        0.00040912894971371276, 0.00038993861152661894, 0.0003644116660726538,
+        0.000334559550533219, 0.0003030992450806182, 0.00027355003287192107,
+        0.00025013402944605643, 0.00023702272543240112, 0.00023664627924268512,
+        0.0002481763946595781, 0.00026799476812833765, 0.0002916173709350081,
+        0.00031512499510388554, 0.0003355887565698721, 0.0003510005589352506,
+        0.00036010650460787313, 0.0003622735500386127, 0.0003574049313655698,
+        0.00034589423842744637, 0.0003286093849937172, 0.0003069030705183107,
+        0.00028264665503385377, 0.0002582674397145225, 0.00023670972868250747,
+        0.00022112192685660518, 0.00021403124237356916, 0.0002162050378083314,
+        0.00022615875463255982, 0.00024090369586495867, 0.0002571643049465514,
+        0.0002721450082702545, 0.0002837576582651687, 0.0002905948151375861,
+        0.00029184854328048244, 0.00028724789545054024, 0.0002770321577397501,
+        0.0002619641919371416, 0.00024338980423811138, 0.00022334484848637835,
+        0.00020466624568367823, 0.00019090593762459852, 0.00018560351350205723,
+        0.00019073875605811263, 0.00020553812406031433, 0.00022706807551317273,
+        0.00025181012355006746, 0.00027667772125427817, 0.0002992761977838038,
+        0.0003178409629296779, 0.0003311258926279309, 0.00033831970266527304,
+        0.0003389953945677054, 0.0003330836503810762, 0.00032086336024528554,
+        0.00030296801677671704, 0.00028041296947316414, 0.00025465510276079825,
+        0.00022769912378654014, 0.00020224060036935074, 0.0001817120350464627,
+        0.00016979211780962028, 0.00016887657625454304, 0.00017840003095462737,
+        0.00019514535556687475, 0.00021516987559974746, 0.0002351523133522385,
+        0.0002526856089321139, 0.0002661369589721526, 0.00027446750700481614,
+        0.00027710769482028796, 0.00027388526711503525, 0.000264989839139693,
+        0.0002509649103993278, 0.00023272756832684417, 0.0002116246311149575,
+        0.00018953622195727864, 0.00016900688124237638, 0.00015324025250919348,
+        0.00014548937052229557, 0.00014750075858743292, 0.0001582242862741854,
+        0.0001745450860251498, 0.00019303964806269476, 0.00021094144111658312,
+        0.00022626644032485913, 0.00023766667575824289, 0.0002442838515647397,
+        0.0002456545820244116, 0.00024165801260429462, 0.0002324925996959792,
+        0.0002186765430179447, 0.00020107570505043125, 0.00018097285291427675,
+        0.00016019774333224314, 0.00014130477205293854, 0.00012759434900657177,
+        0.00012234291800493574, 0.0001268874243649054, 0.00013946807967760182,
+        0.00015661360913463593, 0.0001750280620632558, 0.0001922554593905404,
+        0.00020660177170034232, 0.00021693444360294364, 0.00022253944894314373,
+        0.00022304025676769598, 0.0002183567005247993, 0.00020868911229714716,
+        0.00019452368163827858, 0.0001766660970198939, 0.00015632547296471017,
+        0.0001352902577000425, 0.00011622826999324404, 0.00010289926785470974,
+        9.922454173162039e-05, 0.00010639889070891383, 0.00012160093187306842,
+        0.00014063702775027245, 0.00016016060710331148, 0.000177926054082166,
+        0.00019245478863099072, 0.0002027693412665211, 0.00020824955737348152,
+        0.00020856196833026603, 0.0002036267434017951, 0.00019360531326069092,
+        0.0001789045775913197, 0.0001602055862529788, 0.00013854467613115643,
+        0.00011552077434287504, 9.379397213515086e-05, 7.797406894419768e-05,
+        7.421433363267355e-05, 8.452663914142843e-05, 0.00010390584622476855,
+        0.0001266180248690312, 0.0001491129946428851, 0.00016932698342759413,
+        0.00018595598479596737, 0.0001981226369261954, 0.00020523934029613986,
+        0.0002069514157986549, 0.000203112501651567, 0.00019377349162683413,
+        0.00017917885920004775, 0.00015977214250912917, 0.00013622416139426617,
+        0.00010953233985101211, 8.138119493575417e-05, 5.563858096289142e-05,
+        4.3489489171694935e-05, 5.6971832041496025e-05, 8.441801057375248e-05],
+    [3.498488331955166e-06, 1.0502742378961582e-05, 1.7528859571962977e-05,
+        2.4591514383575978e-05, 3.1705529860637614e-05, 3.8885940234054423e-05,
+        4.614805167402944e-05, 5.350750782383187e-05, 6.0980355885012475e-05,
+        6.858311602658334e-05, 7.633285398957181e-05, 8.424725773630213e-05,
+        9.234471783367607e-05, 0.00010064441356737842, 0.00010916640405327243,
+        0.00011793172619842537, 0.0001269624996043327, 0.00013628203955584598,
+        0.0001459149792581652, 0.00015588740178325744, 0.00016622698396187162,
+        0.00017696315233978375, 0.00018812725366604025, 0.00019975274114699068,
+        0.00021187537839570218, 0.00022453346309473862, 0.00023776807316169523,
+        0.0002516233374542974, 0.0002661467347175748, 0.00028138942346064117,
+        0.00029740660767463756, 0.00031425794161904844, 0.0003320079798254489,
+        0.0003507266772675975, 0.00037048994694178545, 0.0003913802818180498,
+        0.000413487450479326, 0.00043690927579456045, 0.00046175250894834284,
+        0.0004881338113198261, 0.0005161808606312545, 0.0005460335984209354,
+        0.0005778456407808697, 0.0006117858759541538, 0.0006480402786045856,
+        0.0006868139728303201, 0.0007283335863281198, 0.0007728499392234798,
+        0.0008206411272224101, 0.0008720160619395039, 0.0009273185499808172,
+        0.0009869320051243324, 0.0010512849071511315, 0.0011208571467741255,
+        0.0011961874235566473, 0.0012778819005656843, 0.0013666243681213547,
+        0.0014631882219854936, 0.0015684506401256182, 0.0016834094311269031,
+        0.0018092031491007629, 0.0019471352250504024, 0.0020987030651106312,
+        0.002265633330904459, 0.002449924967730662, 0.0026539020154376616,
+        0.00288027886656969, 0.003132241500774932, 0.0034135494166118692,
+        0.003728664643342818, 0.004082916577938204, 0.004482714787540195,
+        0.004935826885625925, 0.005451745974875533, 0.00604218338713235,
+        0.006721739864899374, 0.0075088360642787825, 0.00842702856152563,
+        0.009506913990657829, 0.010788957501685263, 0.012327824748129466,
+        0.014199260405999236, 0.016511492047420962, 0.019425157491937167,
+        0.023190483906360526, 0.028222732713651846, 0.03527344071162321,
+        0.04588565799248751, 0.06393924143608866, 0.10389823286295218, 0.45681204371908657,
+        0.16824000548556978, 0.12427293373827315, 0.10797545152769425, 0.10008460267590576,
+        0.09614385579618968, 0.094523909749073, 0.09449147861590926, 0.09568182883767275,
+        0.09791105448475117, 0.10109794399240787, 0.1052286590194282, 0.11034095701273643,
+        0.11651893085398646, 0.12389477175359266, 0.13265670469999152, 0.143064018738161,
+        0.15547200040209203, 0.17037248212490405, 0.18846118081099977, 0.21075456342839938,
+        0.23880607679207988, 0.2751430155922147, 0.3242647547310634, 0.39537939760774315,
+        0.5125125020590762, 0.782577731957257, 3.755752653720154, 0.6130238071265707,
+        2.0038324235182907, 1.7966683773617411, 0.48927642346172495, 0.5681455484193784,
+        1.6454693423378737, 2.6391577981983634, 1.290482360614598, 0.8266623692872099,
+        0.6486650029294035, 0.8067018461439635, 1.6226534240803259, 1.6444468508405699,
+        1.2430590781299267, 1.0534849646569406, 0.9805165736689616, 0.9964704994790581,
+        1.130939019440316, 1.2953379332275632, 1.1366672611523716, 0.9949313965565334,
+        0.9665725311465813, 1.0088697216944789, 1.1129665716883446, 1.2901188997862794,
+        1.5095481495872904, 1.4827100472993031, 1.1041193077846867, 0.8362982225595078,
+        0.7639941078454111, 0.8164733741323419, 0.9545515691326314, 1.1768801938217415,
+        1.4842418183349981, 1.736100714345457, 1.5799212067107058, 1.172230881216961,
+        0.8597183389944385, 0.7059881248858813, 0.5563643154614943, 0.5653608817165098,
+        0.6467168384221978, 0.7416485038529753, 0.8007326267767204, 0.7933332646568411,
+        0.7274415189006577, 0.631637218546573, 0.5273856711537349, 0.4232652044633994,
+        0.3202474060055104, 0.21713024441508416, 0.11950625669378401, 0.09669283721016048,
+        0.200937707138145, 0.33382804651302267, 0.4605579950742418, 0.5620484997267284,
+        0.6300227956543251, 0.6678393877222281, 0.6844589245326627, 0.6885272785856933,
+        0.6861709013688205, 0.6811325506313011, 0.675516716135285, 0.6704348030704964,
+        0.6664276611580146, 0.6637139715753089, 0.662327767939965, 0.6621892355552359,
+        0.6631346146512631, 0.6649187956509249, 0.6671965979424261, 0.669483968384555,
+        0.6710976302832897, 0.6710716974817819, 0.6680552056645954, 0.6602112568563625,
+        0.6451747827931628, 0.6201837652411639, 0.5825465310006706, 0.5305436987753314,
+        0.4645609925631559, 0.3878185060011925, 0.3060670059691407, 0.22650349300503808,
+        0.15740339715754134, 0.11055212205047689, 0.10067191073538513, 0.12157021565563646,
+        0.1513437084338067, 0.178751481566001, 0.20006905974723435, 0.21408646268689688,
+        0.22049795828756102, 0.21947504821910382, 0.2115853577692373, 0.1977942391487312,
+        0.17945702709355482, 0.15828509867826968, 0.1363152576882854, 0.11591794393434025,
+        0.09977321681306375, 0.09042178209026541, 0.088941419294394, 0.09387409256763231,
+        0.10224279630578675, 0.11130165729899812, 0.11918533788350667, 0.12479963417201408,
+        0.1276011324952819, 0.1274478865571452, 0.12450994494576485, 0.11920697667727556,
+        0.11215480039131828, 0.10411490757326744, 0.09594296218722093, 0.08852290267542674,
+        0.08266021287238909, 0.07891766903068019, 0.07744234497831325, 0.07790934177865692,
+        0.07965645683684461, 0.08192092527427065, 0.08403340852523905, 0.08551307260744807,
+        0.08608771815388579, 0.08567623981936347, 0.0843558212222299, 0.08232327303597797,
+        0.07985343720623576, 0.07725478455424002, 0.07482189130101718, 0.0727870587594345,
+        0.07127890571435573, 0.07030054995859866, 0.0697376279059852, 0.06939527142928843,
+        0.069051036208076, 0.06850700727769339, 0.06762951513676231, 0.06637261347193317,
+        0.0647863499586177, 0.06301178762034125, 0.06126297390026182, 0.05979378630978834,
+        0.05884816521298209, 0.058599377943484514, 0.05909629021431842,
+        0.06024051996868177, 0.06180591672941805, 0.06348882969500735, 0.06496566330029432,
+        0.06594020442438503, 0.06617548602258806, 0.06551286439136908, 0.06388338436750834,
+        0.06131638892872107, 0.05794978591436748, 0.0540454930826795, 0.05001001987036529,
+        0.04640738190812511, 0.04392076353879791, 0.043190550205142765,
+        0.04453385452805024, 0.04776164975567529, 0.052292314072375085,
+        0.05741755634556283, 0.062485580827895425, 0.06696188786228896,
+        0.0704298565449703, 0.072576707234572, 0.0731811137555526, 0.07210582219086083,
+        0.06929586540619201, 0.06478432551940239, 0.05871197193411753, 0.05137794541144721,
+        0.04336690319824409, 0.035857579782274225, 0.031152251526147208,
+        0.03224292069547668, 0.0397120156683988, 0.05134853929128415, 0.06508282310536594,
+        0.07969679350721692, 0.09445448288872285, 0.10884958399530566, 0.12249965780468904,
+        0.1351050750269973, 0.14643298903330762, 0.1563102300607293, 0.16461858082003644,
+        0.17128987811534072, 0.17630019263007662, 0.17966319144979911, 0.18142314551863367,
+        0.18164811522110436, 0.1804237556122176, 0.17784801692890004, 0.17402683962328339,
+        0.16907079734786554, 0.16309254715962768, 0.15620490859297595, 0.14851940526835064,
+        0.14014514923403373, 0.13118801007453332, 0.12175006750900258, 0.11192938141700548,
+        0.10182011794045179, 0.0915130466078792, 0.08109638480457972, 0.07065693834598076,
+        0.06028151083500266, 0.05005871151869984, 0.04008181588679641, 0.03045514987165136,
+        0.021314324506453604, 0.01291906043766218, 0.006367289068095806,
+        0.006830349642827573, 0.012413356702724955, 0.01818073367291126,
+        0.023324928459293622, 0.027652567304236226, 0.03107982029365587,
+        0.03356284391709996, 0.035083104933253534, 0.03564381219327205,
+        0.035269066745541415, 0.03400343964234027, 0.03191118836037414,
+        0.02907484077998666, 0.025593133965802022, 0.021578476673886085,
+        0.017154322213972978, 0.012453502122583875, 0.007622864490003552,
+        0.0029073082759739784, 0.002476599127724973, 0.0068078016376719895,
+        0.01096523941134143, 0.014698407735970554, 0.017902152630521993,
+        0.020500230809710217, 0.02243767463768893, 0.02368023439556658,
+        0.024214528312007506, 0.024047879557392474, 0.0232076526024482,
+        0.021740157404809043, 0.01970935728818416, 0.017195869263948952,
+        0.01429744084292555, 0.011134657022640734, 0.007877685541882803,
+        0.0048847092323837625, 0.00341872114688989, 0.0049815448888178675,
+        0.007728394912698923, 0.010519056439684007, 0.01305063833019174,
+        0.015194751415432382, 0.016876438716199683, 0.018049077654518353,
+        0.01868746495026856, 0.01878531986453632, 0.018354003954803896,
+        0.01742161260498167, 0.016032320434389322, 0.014246306585150366,
+        0.012141360131551815, 0.009819578488628333, 0.007431078496401192,
+        0.005260834940446219, 0.003990682937757309, 0.004494446060225251,
+        0.006236200529301106, 0.008295578717166529, 0.010279548848857201,
+        0.0120230322631375, 0.01343788596379184, 0.014470887291106087, 0.015090957090216895,
+        0.015284636328454195, 0.015054188325502798, 0.014416626218316768,
+        0.013403183911142447, 0.012059336346975905, 0.01044616745174196,
+        0.008645549737943846, 0.006776848211957886, 0.005050068410371246,
+        0.0039034976197366462, 0.0039560869919490135, 0.005101211381093512,
+        0.006672581653451571, 0.008274740502531594, 0.009729962094300609,
+        0.010945556730401087, 0.011866255610511465, 0.012458606946743202,
+        0.012705362394413968, 0.012603170301330631, 0.012161441116845771,
+        0.011401705467576906, 0.01035740569366267, 0.009074598346537777,
+        0.0076151192786178155, 0.006066962691293137, 0.004577258189785261,
+        0.0034471561975004702, 0.0031998046608974983, 0.003973080548809974,
+        0.005241893364344691, 0.006603449906549398, 0.007874901514218944,
+        0.008964510910284757, 0.009818272281923755, 0.010402493316242566,
+        0.010697662101004833, 0.010695957200013052, 0.010399987866569317,
+        0.009821941867876383, 0.008982873463395505, 0.007912131687594345,
+        0.006647227667023952, 0.005235279039574038, 0.003740956176103168,
+        0.002290772643750264, 0.001384074893057096, 0.002032422493193975,
+        0.003378697597175329, 0.004770690046210792, 0.006062242870829273,
+        0.007193700020845074, 0.008128785061443837, 0.008843397513520987,
+        0.009322988010265671, 0.00956190577869571, 0.009563302507325839,
+        0.009339256822896998, 0.008911116918598602, 0.008310248658767927,
+        0.0075795768623848105, 0.00677652243159938, 0.005977806368651971,
+        0.005284394071235061, 0.0048162897941557495, 0.004674882660349632,
+        0.004877241035880484, 0.005338535078568958, 0.005931792074512171,
+        0.00654500504015878, 0.007096960362488623, 0.0075327891101483295,
+        0.007817003307071323, 0.007928615068475588, 0.007858257210575904,
+        0.007606589912298491, 0.007183535673872913, 0.006608233686089792,
+        0.005910005601192681, 0.00513126206150241, 0.0043344108506794855,
+        0.00361568800608403, 0.003120167240159181, 0.003006310675205631,
+        0.0033072673923959664, 0.0038857407080502026, 0.004575519478165767,
+        0.005261744842937647, 0.005874059458979005, 0.006368556375776104,
+        0.006717354521409261, 0.006903641997376536, 0.006919358992729686,
+        0.0067640826556207055, 0.0064445032113589155, 0.005974312101690754,
+        0.005374639395838824, 0.004675628446983156, 0.003920732777544668,
+        0.0031776359944859067, 0.0025621080170626885, 0.0022567972168525937,
+        0.0024010272643892427, 0.0029015263010643386, 0.003560226977166756,
+        0.004240652327217376, 0.004866847225415755, 0.005394304882024618,
+        0.005795022467579513, 0.0060512938853752056, 0.006153115402815945,
+        0.006097031477132752, 0.0058855796874129045, 0.005527034722400648,
+        0.005035424013280493, 0.004431050406570194, 0.0037422932838752166,
+        0.0030110080463310453, 0.0023086430946045624, 0.001778889918500387,
+        0.0016606885704813122, 0.002024805839857093, 0.00264324876200559,
+        0.0033238657148024382, 0.003973699585972722, 0.004544635095650402,
+        0.005007535415090946, 0.005343333350653351, 0.00553985733727741,
+        0.005590596465467805, 0.005494156067153045, 0.005253967486225202,
+        0.004878109991697416, 0.004379256202976857, 0.003774935526989704,
+        0.0030887837375710584, 0.002355212182612464, 0.0016381906487468738,
+        0.0011124566438685778, 0.0011573367902204068, 0.0017180921532885998,
+        0.002423956319002632, 0.0031261984771725386, 0.0037691722058389803,
+        0.0043227242355941215, 0.00476666369487665, 0.005086695551186569,
+        0.005273184831666719, 0.005320732454834207, 0.005227985691135224,
+        0.004997491048350699, 0.004635522253521494, 0.004151868765256751,
+        0.00355961147599036, 0.002874998286667245, 0.0021178833836335608,
+        0.001315523064260487, 0.0005467252306472222, 0.0005971176679615806,
+        0.0013865348301652335, 0.002206212337626171, 0.0029878068136187114,
+        0.0037051737716239973, 0.004338858574983267, 0.004872714418260347,
+        0.005293399248964721, 0.005590356990807635, 0.005755873704414918,
+        0.005785108243153396, 0.005676069435724315, 0.00542953618745672,
+        0.005048930891221759, 0.004540174255275344, 0.00391159202344479,
+        0.003174089465060806, 0.0023424849760258727, 0.0014436890645830585,
+        0.0006125971604544632, 0.0008970720216645551, 0.0019313022686738078,
+        0.0030668574183374893, 0.00423972175717353, 0.0054284667609391275,
+        0.006618350723272978, 0.007796858536122425, 0.00895267563806582,
+        0.010075332737520395, 0.011155022830063241, 0.01218247207890345,
+        0.013148836214488088, 0.014045620195778315, 0.014864626621424015,
+        0.015597939559697863, 0.0162379488329788, 0.01677741687240709, 0.0172095868723598,
+        0.017528327647794675, 0.01772830770232004, 0.017805188787676122,
+        0.017755827804827866, 0.017578475293836687, 0.01727295894648298,
+        0.016840841472279967, 0.01628554365820955, 0.015612425499253232,
+        0.01482882079179457, 0.013944023607676258, 0.012969228775800699,
+        0.01191743337402487, 0.01080331340040835, 0.009643101854415125,
+        0.00845451764854781, 0.007256844797535041, 0.006071380543047068,
+        0.004922781950866639, 0.003842715726150001, 0.002879715079255839,
+        0.0021240832558249247, 0.0017370648799439575, 0.0018256363405412266,
+        0.002224302295436796, 0.0027115719631884147, 0.0031742029083514393,
+        0.003564758651201535, 0.003863201496402177, 0.004061923333910031,
+        0.004160121844798571, 0.004161464204929422, 0.004072989388809308,
+        0.0039045395254932967, 0.003668474450146794, 0.0033796103612376252,
+        0.003055419657570658, 0.002716578970735114, 0.002387885191539816,
+        0.002099052740947049, 0.00188327800907042, 0.0017692177827582335,
+        0.0017658692703179677, 0.0018542337696557402, 0.0019982449388931474,
+        0.0021620902562912345, 0.0023186530212287826, 0.0024500010352087286,
+        0.002545405466910303, 0.0025994521886191033, 0.0026107316555910734,
+        0.0025809941690591474, 0.0025145990216771724, 0.0024181325143026364,
+        0.0023001050440414118, 0.002170637989143659, 0.002041012631770982,
+        0.001922890168687864, 0.0018269977136744278, 0.0017612751220948525,
+        0.001728999779041109, 0.001727902118565442, 0.001750993125475315,
+        0.0017887201597319117, 0.0018313053540225377, 0.0018703996015693113,
+        0.0018998893631428466, 0.0019160988087435847, 0.0019176672326398556,
+        0.0019052754487803463, 0.0018812921760557272, 0.001849349141128041,
+        0.0018138277062423411, 0.001779245787968321, 0.0017495728916875558,
+        0.0017275666820775247, 0.0017142841652058947, 0.0017089204522762731,
+        0.0017090389992694282, 0.001711121340598467, 0.0017112697591971828,
+        0.0017058937452595674, 0.0016922754189363756, 0.0016689817668334964,
+        0.0016361340174599413, 0.001595549381593908, 0.0015507448238489066,
+        0.0015067460569833033, 0.0014695966529249043, 0.0014454627301636468,
+        0.0014393613617611632, 0.001453827693170427, 0.0014880769669321514,
+        0.0015380806190468123, 0.0015974669435569573, 0.0016587507217937908,
+        0.0017144207363465238, 0.001757692036430592, 0.001782955808714386,
+        0.001786039042202932, 0.0017643777543220902, 0.0017171795162136216,
+        0.0016456343962440664, 0.0015532330143224408, 0.0014462539616673959,
+        0.001334442839022609, 0.0012316751908989607, 0.0011556887060794124,
+        0.0011249020951604749, 0.001151259375225333, 0.0012336627489133588,
+        0.0013590557105324832, 0.0015094197952541196, 0.0016674694355648667,
+        0.0018187231888049332, 0.0019515602544567512, 0.002056758313051026,
+        0.0021270847010083993, 0.0021570499488231917, 0.0021428038666500547,
+        0.002082148129725699, 0.0019746731842758777, 0.0018220948057557226,
+        0.0016290156745601973, 0.0014047276502518768, 0.001167732812028404,
+        0.0009568367897475003, 0.0008480108192176658, 0.0009255793428517358,
+        0.001181651674365735, 0.0015446593650491436, 0.0019619888017225655,
+        0.0024048407124754516, 0.0028559495802943477, 0.0033032202999984726,
+        0.00373716522457266, 0.004149883767767425, 0.004534652491194649,
+        0.004885765032434378, 0.00519847498733855, 0.005468977515203551,
+        0.005694399733774255, 0.005872785407513172, 0.006003067014418456,
+        0.006085022368154533, 0.006119215406844887, 0.006106922343937037,
+        0.006050045479886597, 0.005951017762557131, 0.005812701734314027,
+        0.005638286838624675, 0.005431189180674551, 0.0051949577364282466,
+        0.004933190672077655, 0.004649464871940238, 0.004347280990438007,
+        0.004030025384680783, 0.0037009492162504913, 0.003363163941491998,
+        0.0030196514894405427, 0.0026732868814746914, 0.0023268712624640413,
+        0.001983175146261996, 0.0016449974874064909, 0.0013152639185466815,
+        0.0009972494507988683, 0.0006952849669742199, 0.00041803836418409236,
+        0.00020455774054319874, 0.00023290688748366182, 0.0004230203811373782,
+        0.0006178487677104227, 0.0007929277514128337, 0.0009423132060909221,
+        0.0010634107017378832, 0.0011548366023115023, 0.0012159460042329335,
+        0.0012467032929581107, 0.0012476416479261449, 0.0012198445524085754,
+        0.0011649274594540998, 0.001085011564639044, 0.0009826868662856543,
+        0.0008609643052585089, 0.0007232189677763812, 0.0005731305165075319,
+        0.0004146430504050583, 0.00025207234976437414, 9.224465651195319e-05,
+        8.271746182736558e-05, 0.000231535332767949, 0.00037368271305538467,
+        0.0005025884997290614, 0.0006150608028724627, 0.0007086481235514956,
+        0.0007814766376163488, 0.0008322464978624113, 0.0008602447301974424,
+        0.000865352093801056, 0.0008480389883827807, 0.0008093501659654584,
+        0.0007508807332742193, 0.0006747498758577223, 0.0005835881346334908,
+        0.00048058275422993606, 0.0003697336684542541, 0.0002569962475215773,
+        0.00015638633954086215, 0.00011906165155656997, 0.00018475012281895687,
+        0.0002831806093474772, 0.0003817159982438041, 0.0004715090335807961,
+        0.0005485411694466947, 0.0006103353668953881, 0.0006552538911710521,
+        0.0006823057909888208, 0.0006910828832688267, 0.000681731314815115,
+        0.000654932200303282, 0.0006118856828955813, 0.0005543043052063807,
+        0.00048443767026191856, 0.0004051914725166616, 0.0003205390422799981,
+        0.00023693885208626877, 0.0001683388813047708, 0.00014549148447375488,
+        0.00018493124251935618, 0.0002547064970587628, 0.0003299404584954575,
+        0.00040071407251707236, 0.00046240337563064195, 0.0005123270876957454,
+        0.0005487860391011944, 0.0005707542610779317, 0.0005777653752186949,
+        0.0005698637157444483, 0.0005475789463585666, 0.0005119130484964423,
+        0.00046434447768464797, 0.0004068738375490454, 0.0003421811371869298,
+        0.0002741013459992835, 0.00020905502237875763, 0.0001598892203138485,
+        0.00014815920215718997, 0.0001802732368018499, 0.00023522530481274542,
+        0.00029549158102618023, 0.0003527595709461772, 0.0004028317575399873,
+        0.00044323975919888405, 0.0004724278345650686, 0.0004894611917336906,
+        0.0004939112217542194, 0.00048580469269437907, 0.00046559853188763963,
+        0.0004341694768867844, 0.00039282365376479446, 0.00034335134074594425,
+        0.00028819932458366897, 0.00023096958832889724, 0.00017783683865248273,
+        0.00014077680065570087, 0.00013681157228383886, 0.0001671449605777157,
+        0.00021444874395898174, 0.00026546169557376545, 0.00031362116167611947,
+        0.0003554568566969613, 0.0003888771413345287, 0.0004125496196152468,
+        0.00042566951492504064, 0.0004278645816473948, 0.00041915044421006914,
+        0.0003999056873063587, 0.0003708572397011386, 0.00033307867481594287,
+        0.00028801961236519434, 0.00023762369806139998, 0.0001847256619307971,
+        0.0001344298545639426, 9.860148734699529e-05, 9.815035842453684e-05,
+        0.00013218129453799617, 0.00017909827487444215, 0.0002271705669099831,
+        0.00027159125388939514, 0.0003099044671235412, 0.00034061024984316025,
+        0.0003627511713161265, 0.0003757761924584309, 0.0003794924181841756,
+        0.00037404861214374887, 0.0003599338160451071, 0.00033799004474159127,
+        0.0003094491846634609, 0.00027601943388714324, 0.00024007220398636835,
+        0.00020500791730204755, 0.00017578674744123175, 0.00015886782382425088,
+        0.00015934273919130293, 0.00017619706585623906, 0.00020320659349268565,
+        0.000233956916006387, 0.00026393249860073067, 0.00029023025573918964,
+        0.0003109808430157522, 0.00032498816475066245, 0.00033154317627271627,
+        0.0003303305945900347, 0.0003213820067720892, 0.00030505452678683905,
+        0.00028202995281004125, 0.0002533432578315156, 0.00022047101876158354,
+        0.00018555712107045839, 0.00015194552412565825, 0.00012518572856236136,
+        0.00011327015001912979, 0.00012124129263255203, 0.00014457070897226168,
+        0.00017490648074541454, 0.0002063275086664262, 0.0002353945241276297,
+        0.000260040332870866, 0.00027894802020631064, 0.0002912767019470879,
+        0.00029654236446192115, 0.0002945639967232323, 0.0002854382568770261,
+        0.00026952908408786613, 0.00024747085750820665, 0.00022019523028009373,
+        0.00018901327840676447, 0.00015583951246290892, 0.00012378581598440213,
+        9.851605026673065e-05, 8.902083283606658e-05, 0.00010024438172071339,
+        0.00012539358941971072, 0.00015561956092929253, 0.00018576531253652886,
+        0.0002130735660507106, 0.0002359069500646627, 0.0002532098679633684,
+        0.0002643001081885902, 0.0002687847248145435, 0.00026652352408841433,
+        0.00025761174319752195, 0.00024237198693841526, 0.00022135468474145776,
+        0.00019535533501843663, 0.00016547551020190836, 0.00013331027715808008,
+        0.00010153337215937029, 7.56789440855896e-05, 6.664030747535449e-05,
+        8.066260493566197e-05, 0.00010780471668914581, 0.00013843441942637297,
+        0.00016810764802811947, 0.00019463760186773078, 0.0002167177329184395,
+        0.00023347862327370147, 0.0002443389061264237, 0.0002489504156212019,
+        0.00024717564879584764, 0.00023907650937878894, 0.00022490703789710507,
+        0.00020510884217261023, 0.00018031303718622234, 0.0001513629155632328,
+        0.00011940633605587048, 8.625996710881915e-05, 5.6094735423811545e-05,
+        4.234988863181212e-05, 5.9074268109663835e-05, 8.958638693708419e-05,
+        0.00012205974403211698, 0.00015286354186267205, 0.0001803637804025232,
+        0.0002035289256850713, 0.00022161783866040573, 0.0002340951153056061,
+        0.00024060545825431372, 0.00024096499893620015, 0.00023515670597813233,
+        0.00022332539129539595, 0.00020577074896830443, 0.00018293822297533901,
+        0.0001554087385902854, 0.00012389126052815195, 8.923508047893327e-05,
+        5.257509867224112e-05, 1.7740963774594948e-05, 3.023795587723546e-05,
+        6.761777304727203e-05, 0.00010491334186251066, 0.00014026110038918877,
+        0.00017266645956234286], [1.0768844163980119e-07, 3.2330816987035756e-07,
+        5.39657481478087e-07, 7.572261290538512e-07, 9.765089122085764e-07,
+        1.1980077967039427e-06, 1.4222339787258343e-06, 1.64971009936074e-06,
+        1.8809724795476272e-06, 2.1165734615162776e-06, 2.357083853232912e-06,
+        2.6030955025259923e-06, 2.8552239914430123e-06, 3.1141115129261054e-06,
+        3.380429906924908e-06, 3.6548839132785425e-06, 3.938214643704599e-06,
+        4.231203307649348e-06, 4.534675227086948e-06, 4.84950415282574e-06,
+        5.176616950174102e-06, 5.516998654447828e-06, 5.871697969985558e-06,
+        6.241833246461147e-06, 6.62859898696583e-06, 7.033272943603452e-06,
+        7.457223879101889e-06, 7.901920046632021e-06, 8.368938490468198e-06,
+        8.859975234268984e-06, 9.37685649104398e-06, 9.921550969741795e-06,
+        1.0496183441353366e-05, 1.1103049681423386e-05, 1.1744632970963715e-05,
+        1.2423622317666455e-05, 1.3142932622308635e-05, 1.3905726999882361e-05,
+        1.471544154176349e-05, 1.557581278638946e-05, 1.6490908263903764e-05,
+        1.7465160464256587e-05, 1.850340469247599e-05, 1.961092127334917e-05,
+        2.0793482702186306e-05, 2.2057406327499634e-05, 2.3409613383814785e-05,
+        2.485769509889226e-05, 2.6409986963775363e-05, 2.8075652155907068e-05,
+        2.986477546176122e-05, 3.1788469141781915e-05, 3.3858992403160944e-05,
+        3.608988647750102e-05, 3.849612754365102e-05, 4.109430010447039e-05,
+        4.3902793938889405e-05, 4.694202809973505e-05, 5.023470620054336e-05,
+        5.380610779991284e-05, 5.7684421594397954e-05, 6.190112713848727e-05,
+        6.649143296654698e-05, 7.14947804237114e-05, 7.695542422406944e-05,
+        8.292310283265402e-05, 8.945381416959379e-05, 9.661071517985726e-05,
+        0.00010446516747045242, 0.00011309795552235981, 0.0001226007094423703,
+        0.0001330775707970761, 0.00014464714823258392, 0.00015744481935902753,
+        0.0001716254480285745, 0.00018736660118090715, 0.000204872368972221,
+        0.00022437791543854108, 0.00024615491740764096, 0.00027051808772970835,
+        0.00029783302681552057, 0.0003285257088681821, 0.0003630939884785868,
+        0.00040212161547841327, 0.00044629537934464585, 0.0004964261777511675,
+        0.0005534750326056868, 0.0006185853786448319, 0.0006931233522115926,
+        0.0007787283501192914, 0.0008773768586048505, 0.0009914635555202608,
+        0.0011239050667649977, 0.0012782736794612836, 0.0014589710161642345,
+        0.0016714555247583998, 0.001922543176883972, 0.002220808873700503,
+        0.0025771280476654425, 0.0030054160219118078, 0.0035236503650087118,
+        0.004155304716895035, 0.004931391542285115, 0.005893424035544292,
+        0.007097796672585169, 0.00862241160762393, 0.010576965569207933,
+        0.013119408881726182, 0.016483236936879357, 0.021024730908333084,
+        0.02730917319908862, 0.0362790924363136, 0.04961273888878418, 0.07058602245821438,
+        0.10654837977679482, 0.17843370769676323, 0.3864989054206368, 3.83812047032701,
+        0.06033330674174497, 0.9156453683688066, 1.718386224575511, 0.9784904089596019,
+        0.9155807531786659, 1.0782220705063885, 0.29057001123649345, 0.6282621266254749,
+        1.3355694602536206, 3.2695517152308615, 7.241691824742018, 7.099692602008909,
+        4.370030801892724, 2.2015654021024464, 1.3291006238898584, 1.0021072382360496,
+        1.1109998701012866, 1.7383448333746234, 2.57596292851463, 2.3237986622793785,
+        1.7943486802359807, 1.4798246431532767, 1.3193810953324017, 1.2702769321341998,
+        1.337047346944417, 1.5322055349670798, 1.6493729003298794, 1.4621157582597344,
+        1.278508190383073, 1.2037347492439952, 1.2127256000307243, 1.2925812374304304,
+        1.4486933768085446, 1.6762488500213568, 1.829673127123755, 1.6007437747663116,
+        1.2042391507508667, 0.966911267560818, 0.9151199994754029, 0.8205466336296457,
+        0.8310779953320871, 0.8876222146390284, 0.935649802001309, 0.9316232925817937,
+        0.8569347154789668, 0.7331541968381181, 0.5949992584895796, 0.46324213251621826,
+        0.34443617722873554, 0.24088630775021735, 0.16480573809327523, 0.15900904053564807,
+        0.23631430093007755, 0.3506095177302816, 0.472401893332748, 0.5807318656070651,
+        0.6594899117183386, 0.7038353073720803, 0.7200920603817088, 0.7186903115219853,
+        0.708480454669858, 0.6951792655162542, 0.6819622699650096, 0.6704133100818033,
+        0.6612301051206235, 0.6546482201808549, 0.6506731128362743, 0.6491994327057732,
+        0.6500665796740496, 0.6530770294913795, 0.6579902467106759, 0.6644968429091136,
+        0.6721724156174795, 0.680407044227532, 0.6883051417998511, 0.6945540375423519,
+        0.69727485459642, 0.6939067029821948, 0.6812424678196192, 0.6558070260271389,
+        0.6147410665873124, 0.557060862997897, 0.4846490104357933, 0.4021553248886261,
+        0.3157093975234605, 0.23142133380396063, 0.1550881554627305, 0.0953806734869988,
+        0.07400587267046783, 0.0992296536652617, 0.13846743115205865, 0.17560513971139252,
+        0.20643905434513402, 0.22953661546656465, 0.24427617571561402, 0.2504721545421456,
+        0.24833693603170096, 0.2384875838178437, 0.22191159554123185, 0.19988432532212666,
+        0.1738752203530921, 0.14550534200263618, 0.11664765194763042, 0.08984899114092096,
+        0.06936054906675991, 0.06160715679196092, 0.06909260279870466, 0.08550044037490681,
+        0.1041174189192547, 0.12139751001333247, 0.1356083555883264, 0.14587146663281716,
+        0.15178807458607582, 0.15328455911678054, 0.15052708497193573, 0.14386063432465612,
+        0.13376532892980997, 0.1208353180814558, 0.1057908101720915, 0.08954370009671951,
+        0.0733637091286765, 0.05922546882436921, 0.05019361301092289, 0.04933407134968932,
+        0.05622483630416839, 0.06724626992289962, 0.07921806400734886, 0.09030154206431056,
+        0.09949955232330639, 0.10626613729367392, 0.11031667061101977, 0.11153744217254837,
+        0.10994118213332857, 0.10564683341898776, 0.09887470805591583, 0.0899538619754514,
+        0.07934398566499341, 0.06768483613524522, 0.05590918013088069, 0.045483208776137804,
+        0.03869114390120307, 0.03792224296626551, 0.04313260457215513, 0.05177891053889005,
+        0.061467571114915937, 0.0707583884462059, 0.07882803675729069, 0.08517865459391069,
+        0.0894993833474336, 0.09160728390014894, 0.0914231186791221, 0.0889619143086159,
+        0.0843295464544095, 0.07772254122183724, 0.06943329097810298, 0.05987036417551094,
+        0.04962022781194937, 0.039618076281780226, 0.031550060752921195,
+        0.028169056442633962, 0.03128418669267546, 0.03906722260158146,
+        0.04873116349388687, 0.05858626713746748, 0.06772091026829036, 0.0755856928059677,
+        0.08181352998399831, 0.08615060005387785, 0.0884290383298846, 0.08855491567097215,
+        0.08650165242240153, 0.0823055620142938, 0.07606337908717312, 0.06793423299129778,
+        0.058153463262641605, 0.0470814875428488, 0.03537598132957688, 0.02468150053340272,
+        0.01986429902429378, 0.026196558608877672, 0.03911848337038026,
+        0.054185881449441475, 0.06982399521112735, 0.08534168923895938,
+        0.10031295143184901, 0.11442137479508932, 0.12741640343299274, 0.13910063576966467,
+        0.1493263389281923, 0.15799398421655897, 0.1650501331235481, 0.17048377689981045,
+        0.17432109750102753, 0.17661907374685273, 0.17745855543093383, 0.17693744020454397,
+        0.17516447345196987, 0.17225401046360245, 0.16832188666582165, 0.16348237483536346,
+        0.15784609041561998, 0.15151864433968057, 0.14459983291190526, 0.1371831848495588,
+        0.1293557407956797, 0.12119800357986868, 0.11278405167448277, 0.10418184133039768,
+        0.09545372821710674, 0.08665721860141014, 0.07784592183324716, 0.06907063444854747,
+        0.060380455966408134, 0.051823829949785426, 0.04344942931435454,
+        0.035306874640555645, 0.02744744007108662, 0.019925441784750683,
+        0.012803801828480347, 0.006194789225469461, 0.0017103522628719905,
+        0.00624636087233695, 0.011293469270634408, 0.015797219413692856,
+        0.01967235909489643, 0.022880310774796592, 0.02539819827624269,
+        0.02721525981231322, 0.02833280077096217, 0.028764683969657798,
+        0.02853767354887929, 0.02769144810144344, 0.026278309565922836,
+        0.02436278771899305, 0.022021567542377055, 0.01934459459211506,
+        0.01643924560074878, 0.013442284417176232, 0.010552291994382073,
+        0.008111973189796631, 0.006728552688560339, 0.006975953208470337,
+        0.008533568646851366, 0.010628202772623831, 0.012775055942353022,
+        0.014738219693656693, 0.016395844140448305, 0.017680135010384693,
+        0.01855424146202287, 0.0190027544528497, 0.01902732850756026, 0.01864442900666342,
+        0.017884160118294475, 0.01678991469681202, 0.01541903090698288,
+        0.013845086740786527, 0.012163095506795596, 0.01049948506650021,
+        0.009027020616550143, 0.007970781400970762, 0.007553394337345045,
+        0.007845944147914072, 0.008690051641278, 0.009827180966228206, 0.011037942660035572,
+        0.01217353008549617, 0.013139255428476994, 0.013876280520629173,
+        0.014350206151552188, 0.014544782791040442, 0.014458525671321021,
+        0.014102920917315544, 0.01350159280358922, 0.012690227549085041,
+        0.011717339892641026, 0.010646162351974015, 0.009557836480293553,
+        0.008554855310822148, 0.007759373622704029, 0.007293208229644223,
+        0.0072297398711804566, 0.007547462872365874, 0.008140498983988421,
+        0.008875357834456057, 0.00963495620659274, 0.01033173780621768,
+        0.01090502062288115, 0.011315229844936832, 0.011539238442316904,
+        0.011567284648567665, 0.011401065999789033, 0.011052627846106527,
+        0.010543840638662027, 0.009906411105002774, 0.009182441910570308,
+        0.008425436281002148, 0.007701043744386318, 0.007085245230611058,
+        0.006655227064785135, 0.006468796598555526, 0.006539332321996509,
+        0.0068273945544307536, 0.007259021174036886, 0.007753338146893796,
+        0.00824029822045525, 0.008666288139573947, 0.008993505547625744,
+        0.009197652139924501, 0.009265772954506242, 0.009194663419278996,
+        0.008989809484410057, 0.008664747114684943, 0.008240744777686795,
+        0.00774671103332787, 0.007219128576395252, 0.006701505308688461,
+        0.00624221219795614, 0.00588890520796771, 0.0056783483925667575,
+        0.005624304039871306, 0.005711171548947165, 0.005899200934916282,
+        0.006137562955079454, 0.006376571533807086, 0.006574562276371643,
+        0.006700207830829726, 0.006732571665187142, 0.006660528139283951,
+        0.006482330634347276, 0.006205667601250869, 0.005848412275124431,
+        0.005440228168678756, 0.005024899187220355, 0.004661959383114665,
+        0.004422910006876865, 0.004374325165743119, 0.004549012360336256,
+        0.004928747847452217, 0.005457790136564483, 0.006069980221804997,
+        0.006705907921917119, 0.0073177005523186785, 0.007868226409776542,
+        0.008329192263085773, 0.008679597284592146, 0.008904729980799378,
+        0.00899557271902291, 0.00894846438099764, 0.008764924872015597,
+        0.008451602755175099, 0.008020361545751963, 0.007488577985043984,
+        0.00687979463244516, 0.00622494056093156, 0.0055643190948805165,
+        0.004950088095511303, 0.004446989526931893, 0.004124606649443166,
+        0.004032981484476913, 0.004171887218933232, 0.004487831222996542,
+        0.00490433129265546, 0.005351035961669274, 0.005774188378887207,
+        0.006135809176000067, 0.006410209163715277, 0.006581043131646749,
+        0.00663936918611964, 0.006582483277886407, 0.006413274775807571,
+        0.006139957297289621, 0.0057761406965244335, 0.005341311746580859,
+        0.004861874368295997, 0.004372873534030671, 0.00392000990980369,
+        0.0035595732741652004, 0.0033499931096220687, 0.003329313901933048,
+        0.0034914376238872973, 0.003788896910858121, 0.004159343179080202,
+        0.0045470131259123065, 0.004909357876660353, 0.005215936997765979,
+        0.005445762645135214, 0.005585166869694762, 0.0056264256892890035,
+        0.0055669478594110875, 0.005408844322929071, 0.005158785303942406,
+        0.004828149585881454, 0.004433575992262649, 0.0039981477896219265,
+        0.0035535097318879893, 0.0031428205890123924, 0.002822158182674845,
+        0.0026521324606044983, 0.002670629523848783, 0.0028648160318117746,
+        0.003180047374306399, 0.0035532666233042062, 0.003933009528436619,
+        0.004282155691633228, 0.004574830660506803, 0.004793281598001094,
+        0.004925831249250095, 0.0049656900748958725, 0.004910298685699522,
+        0.004760991992565772, 0.004522894963041697, 0.00420506293278461,
+        0.0038210009278478205, 0.0033898928715414725, 0.0029392076275530756,
+        0.0025096767647383076, 0.0021621982036499326, 0.0019759712572689552,
+        0.0020101334958451205, 0.002247625175582803, 0.0026123012350714493,
+        0.0030286934017593613, 0.003443995298291315, 0.0038237427711875272,
+        0.0041449055303182025, 0.004391665919902395, 0.004553244304166047,
+        0.004622811563833736, 0.004596937510872971, 0.0044753061381246715,
+        0.0042605809720105935, 0.003958396425393443, 0.003577541017346201,
+        0.0031305593059770243, 0.0026354122450442954, 0.002120071015393762,
+        0.0016356183445399763, 0.001288383460394798, 0.0012459536178725686,
+        0.0015420594309596366, 0.00202020345578713, 0.0025555509868573365,
+        0.0030871368553243824, 0.003582592478652093, 0.004021358865038037,
+        0.004388701532092437, 0.0046735043589195705, 0.004867391835439534,
+        0.004964346750924478, 0.004960516292366397, 0.004854083403302618,
+        0.004645151396992751, 0.004335620939862468, 0.0039290554167822735,
+        0.003430546119598895, 0.002846620467100943, 0.002185356040324183,
+        0.0014575665620991643, 0.0006882071950832209, 0.0003428060694460888,
+        0.001143491103005672, 0.0020597346437105273, 0.0030103235657752267,
+        0.003980453312692021, 0.004960272920591679, 0.005941325241314908,
+        0.006915926296888614, 0.007876977253977393, 0.008817860707601146,
+        0.009732348891885914, 0.010614508806715967, 0.011458605385754108,
+        0.01225900924652313, 0.013010117211772603, 0.013706293631838045,
+        0.014341839288457961, 0.014910992703651336, 0.015407966311562743,
+        0.01582701745276686, 0.016162551754384004, 0.016409254361742974,
+        0.016562242818894915, 0.016617234228120233, 0.016570718665529956,
+        0.0164201306610567, 0.01616401081262814, 0.01580215022649649, 0.015335711392880215,
+        0.014767320259891312, 0.01410112562169467, 0.013342823472927812,
+        0.012499645737894928, 0.011580314884484636, 0.010594968695605127,
+        0.009555063660966426, 0.008473272934474614, 0.007363410404668279,
+        0.006240449722535116, 0.005120808655088387, 0.004023387593936436,
+        0.002973036477634505, 0.002013543572414986, 0.0012653830166084966,
+        0.0010747206449962048, 0.0015242192906009915, 0.002161446957487386,
+        0.0027845291924961696, 0.003337008846578254, 0.003797989206700508,
+        0.004157962094824734, 0.004412730560336069, 0.004561474594439068,
+        0.004605994588323143, 0.00455034763884917, 0.004400632031046595,
+        0.004164841308385928, 0.0038527773984699818, 0.003476062078530322,
+        0.003048362790332647, 0.0025861273476573054, 0.002110607780962198,
+        0.001653322201152341, 0.0012699814938569114, 0.0010604195493223963,
+        0.0011155296872454854, 0.001377879593555283, 0.0017240220183002701,
+        0.0020790674057693257, 0.002406670671353196, 0.0026876926332853567,
+        0.002911002664788497, 0.0030699737858603665, 0.003161064074445525,
+        0.003183183377365415, 0.0031373777469195503, 0.003026657742203283,
+        0.002855913515608363, 0.002631922932287808, 0.00236352280416637,
+        0.002062128235730364, 0.001743047664522075, 0.001428638075981357,
+        0.0011551403684754798, 0.0009811075037721075, 0.0009684722315100446,
+        0.001113924572579819, 0.0013500953734826551, 0.0016161282822002448,
+        0.0018762495957387322, 0.002110158626141206, 0.002305508815089225,
+        0.0024544148190527083, 0.0025519282213389036, 0.002595349416107216,
+        0.002583898526503303, 0.0025185509205678976, 0.002401963563459936,
+        0.002238480999193126, 0.002034263274333717, 0.001797662900831272,
+        0.001540163631263476, 0.001278623912699258, 0.001040306218456202,
+        0.0008708143355577594, 0.0008279248765975505, 0.0009287751825596117,
+        0.0011251447122977213, 0.0013606485949367948, 0.0015996671161608753,
+        0.0018216981384487421, 0.0020141011502357517, 0.0021684983009794337,
+        0.0022792040469063204, 0.002342534679140934, 0.0023564938489244245,
+        0.002320625669662647, 0.002235951754598985, 0.0021049684143480797,
+        0.0019317236967153237, 0.0017220554944277072, 0.0014842102547756664,
+        0.0012304351665005766, 0.0009811663063597595, 0.0007752785292391632,
+        0.0006816085741588176, 0.0007543993842770181, 0.0009535852578239712,
+        0.001207928712781915, 0.0014743210399302163, 0.0017300741582253938,
+        0.001961623183113199, 0.0021596795763129746, 0.0023173734655473803,
+        0.0024295199396930202, 0.002492318020003287, 0.0025032251672407226,
+        0.002460906828893079, 0.0023652229721401294, 0.002217245666753823,
+        0.002019331992353042, 0.0017753352061519309, 0.001491208187510118,
+        0.0011768813508976942, 0.0008531418478316874, 0.0005815206912625053,
+        0.0005387880671367926, 0.0008010843663657965, 0.0011955422937137098,
+        0.0016329954644688028, 0.002084038159579181, 0.002534696058562427,
+        0.0029757543753627593, 0.0034000102436591677, 0.0038014329839729517,
+        0.004174881788263865, 0.004516010547902576, 0.004821238630488252,
+        0.005087742047903925, 0.005313446058879583, 0.005497010856839312,
+        0.005637806740309165, 0.005735877547120679, 0.00579189247743803,
+        0.0058070872757962815, 0.005783196324176273, 0.005722377621321065,
+        0.005627132935820388, 0.005500225639762103, 0.0053445988601243735,
+        0.005163296620667759, 0.004959390577827488, 0.0047359147686454935,
+        0.00449581047556577, 0.004241882869765609, 0.00397677052494093,
+        0.003702928219348198, 0.0034226226997277056, 0.0031379403201053477,
+        0.0028508047552441985, 0.0025630023947763665, 0.0022762126164408703,
+        0.0019920399809928383, 0.001712045546172866, 0.0014377750740885208,
+        0.00117078323879857, 0.0009126563509187151, 0.0006650479631920315,
+        0.0004298034637872772, 0.00020984815500895066, 4.688179600252464e-05,
+        0.00019987496238549611, 0.00037064792983529843, 0.0005240415189368834,
+        0.0006577101345242089, 0.0007705223268301688, 0.0008617632427551041,
+        0.0009310407852961217, 0.0009782790753069138, 0.0010037266780544276,
+        0.0010079646299098123, 0.0009919104470866287, 0.0009568177772465102,
+        0.0009042734914083901, 0.0008361967384880784, 0.0007548496918896197,
+        0.0006628816323644601, 0.0005634585396565251, 0.00046061626178484164,
+        0.00036023203648739735, 0.0002726914174438752, 0.00021816004940259758,
+        0.0002206646468730698, 0.0002732581950801676, 0.000347418675005911,
+        0.0004250020165926069, 0.000497551679947525, 0.0005607882048410339,
+        0.0006122726664398763, 0.0006505569265851722, 0.0006748544225459809,
+        0.0006848994526937162, 0.0006808805779189726, 0.0006634067684660981,
+        0.0006334924695731541, 0.0005925612018967063, 0.0005424781628315336,
+        0.00048563711734538365, 0.00042515152258554246, 0.00036523222348423394,
+        0.00031180492788520096, 0.0002729613603179007, 0.0002572823121318408,
+        0.00026810417530344436, 0.0002998747112870779, 0.0003430190550714074,
+        0.0003894755618556335, 0.0004338482763733729, 0.0004727045916414965,
+        0.0005038647638837359, 0.0005259784280005144, 0.0005382988936365831,
+        0.0005405642805036682, 0.0005329345276231198, 0.000515960101459825,
+        0.000490573560158356, 0.0004581050345859687, 0.0004203308411844737,
+        0.000379571048545027, 0.00033884758727976863, 0.0003020601265191702,
+        0.00027393540113210675, 0.0002591431981525316, 0.000260204961855652,
+        0.00027573320315346243, 0.0003012716449950617, 0.00033169756354032947,
+        0.0003627402314277158, 0.0003912807611133589, 0.0004151625131685548,
+        0.00043295391502047527, 0.00044377734417227365, 0.0004472024807073372,
+        0.0004431835753608277, 0.00043202510670713005, 0.0004143678683805237,
+        0.00039119365732892026, 0.0003638511100738644, 0.00033410636563884096,
+        0.00030421313133484497, 0.00027695782080475157, 0.0002555368607995551,
+        0.00024300309082681495, 0.00024117998787757125, 0.00024968763143340996,
+        0.00026609623221837697, 0.000287077616140879, 0.0003094676710831988,
+        0.00033072390972251276, 0.0003489690649903174, 0.00036289518986283765,
+        0.00037165934484586105, 0.00037480566141463565, 0.00037221428254080406,
+        0.00036407087982408054, 0.00035085181998062345, 0.0003333227884506042,
+        0.00031255048655735434, 0.00028992577282331344, 0.00026718738247620143,
+        0.00024640837208224695, 0.000229855890642534, 0.00021959808506942974,
+        0.00021685412308497095, 0.0002214395050579087, 0.00023180793721639385,
+        0.00024567699010915293, 0.0002607137553457817, 0.0002749245096596905,
+        0.0002867691135535614, 0.0002951438532789371, 0.00029933036154200006,
+        0.00029895024061063745, 0.00029393596992617025, 0.00028451950050799573,
+        0.000271239167601305, 0.00025496704420998066, 0.0002369581432659679,
+        0.00021891151361480297, 0.00020299283244485763, 0.00019168114583121497,
+        0.00018724004390426125, 0.00019085048831436911, 0.00020202210944851568,
+        0.00021889037073891777, 0.00023906284241386787, 0.0002602828479134979,
+        0.0002806901846833371, 0.00029884140702745844, 0.0003136543762598018,
+        0.0003243497580946065, 0.0003304080215095812, 0.0003315417627180467,
+        0.0003276794890289484, 0.0003189579028083365, 0.00030572169150986294,
+        0.0002885320316228614, 0.0002681873669233699, 0.0002457620527245715,
+        0.0002226673295949075, 0.0002007244013639755, 0.00018218485808226594,
+        0.00016951484397846443, 0.000164700496391905, 0.00016825287666544065,
+        0.00017883204445621909, 0.00019397318185062577, 0.0002111062393482227,
+        0.00022809935019299778, 0.00024335493008901713, 0.0002557334368683157,
+        0.0002644579650023715, 0.00026904272108705713, 0.00026924719764661155,
+        0.00026504946304071206, 0.0002566332628455314, 0.00024438678193761316,
+        0.00022891419121495602, 0.00021106418069546313, 0.00019198116785854982,
+        0.0001731780783948059, 0.0001565934647738359, 0.0001444942491657233,
+        0.00013896558302845612, 0.00014096231684976722, 0.00014968595693994462,
+        0.00016305397839071428, 0.00017870060957441222, 0.0001946011187780754,
+        0.0002092172230623441, 0.0002214367845372099, 0.0002304826948815,
+        0.00023584318361378326, 0.0002372273132860915, 0.0002345390673982772,
+        0.00022786436622945303, 0.00021746845636162485, 0.00020380451506496608,
+        0.00018753815545405716, 0.00016959699152104533, 0.00015125674796317108,
+        0.00013425957998267012, 0.00012087296711038626, 0.00011357551621441248,
+        0.00011400717093073609, 0.00012181818638819122, 0.000134901538603363,
+        0.00015069218816726832, 0.00016703293494802103, 0.00018233743563744623,
+        0.0001954819908385197, 0.00020567996792048297, 0.00021239627575428773,
+        0.00021529694938943612, 0.00021422112387284927, 0.00020916657247745332,
+        0.00020028450432980514, 0.000187883181268956, 0.0001724441257130802,
+        0.00015466113474109787, 0.00013552370132590035, 0.00011648280450986162,
+        9.972676469429014e-05, 8.837384742793616e-05, 8.565386572066802e-05,
+        9.245513366440112e-05, 0.00010636239069347107, 0.00012393286676755516,
+        0.00014247422115981734, 0.00016019636355455518, 0.00017591084356383967,
+        0.00018879983390281024, 0.00019829048555451147, 0.00020399168461105935,
+        0.00020566240730935867, 0.0002031956401137847, 0.0001966102834008738,
+        0.00018604806969477395, 0.0001717757507254272, 0.00015419676286713155,
+        0.00013388483677058302, 0.00011167453972373742, 8.89129507530958e-05,
+        6.817940147227566e-05, 5.489705775389507e-05, 5.6401992439084266e-05,
+        7.197959424127976e-05, 9.428814094921823e-05, 0.00011849780758075818,
+        0.0001422868212601313, 0.0001643770550358099, 0.0001839270730019996,
+        0.0002003179768091592], [2.8893211477671124e-07, 8.67556395746682e-07,
+        1.4484646989542026e-06, 2.0331922586667678e-06, 2.623293184429422e-06,
+        3.2203483657694705e-06, 3.8259733156009014e-06, 4.4418265308362035e-06,
+        5.06961804945362e-06, 5.711118466063834e-06, 6.368168429696078e-06,
+        7.042688732221256e-06, 7.736691000627787e-06, 8.452289206312264e-06,
+        9.191711976940875e-06, 9.957315922262068e-06, 1.0751600040846616e-05,
+        1.1577221371646052e-05, 1.243701206491837e-05, 1.3333997993702733e-05,
+        1.4271419195241461e-05, 1.5252752254922209e-05, 1.628173496881645e-05,
+        1.7362393526654914e-05, 1.8499072537292853e-05, 1.9696468247285658e-05,
+        2.095966539929295e-05, 2.2294178133226252e-05, 2.3705995521333335e-05,
+        2.5201632267753664e-05, 2.678818535893382e-05, 2.8473397335760925e-05,
+        3.0265727199009437e-05, 3.217442990708208e-05, 3.420964572800546e-05,
+        3.638250076686579e-05, 3.870522033125105e-05, 4.119125691952578e-05,
+        4.385543506528857e-05, 4.671411545314084e-05, 4.9785381329466205e-05,
+        5.308925052783312e-05, 5.6647917225410914e-05, 6.048602804748206e-05,
+        6.463099820325083e-05, 6.911337403869824e-05, 7.396725010227308e-05,
+        7.923074959197122e-05, 8.494657969326829e-05, 9.116267463652456e-05,
+        9.793294264232789e-05, 0.0001053181358412809, 0.00011338686625447539,
+        0.00012221679615271734, 0.00013189603704967618, 0.0001425247993215722,
+        0.00015421734449702783, 0.00016710430389184775, 0.00018133544354770906,
+        0.00019708297475818057, 0.00021454553531423046, 0.000233952999802432,
+        0.0002555723203998544, 0.0002797146565319004, 0.0003067441272343495,
+        0.00033708862118826287, 0.0003712532355422762, 0.00040983710131231945,
+        0.0004535546108769953, 0.0005032624227228568, 0.0005599941295250356,
+        0.0006250052099844555, 0.0006998319587547554, 0.0007863696846374929,
+        0.0008869778921196732, 0.0010046239162997245, 0.0011430824519849132,
+        0.0013072181571719946, 0.0015033949157666016, 0.0017400839532678493,
+        0.002028794951736136, 0.00238555325083242, 0.0028333454297201155,
+        0.0034063844592691376, 0.004158048020048591, 0.005176941235244225,
+        0.006623238162507438, 0.008824956894849632, 0.012603542809109436,
+        0.02100448775033147, 0.09478147451316653, 0.03585218987874316, 0.02722067018678057,
+        0.024329717706053626, 0.02321900534284155, 0.022985800146819717,
+        0.0233111990232833, 0.02406314378647531, 0.025188978280579248, 0.026678162716958644,
+        0.028547888402929322, 0.03083804602531118, 0.03361103753069684,
+        0.036954988718420005, 0.04099029027268119, 0.045880339902374945,
+        0.051848435887060194, 0.05920447828062404, 0.06838828822931609,
+        0.0800427384377256, 0.09514387810929724, 0.11524882669493912, 0.14301262282114685,
+        0.18340842337281377, 0.24718435649704046, 0.36403655645543376, 0.6735796582771852,
+        5.269066256399402, 0.2917032720367451, 1.6305462590075612, 2.173022765531736,
+        0.9366745872567773, 0.6614907894277463, 0.8746907714928809, 1.617398204074107,
+        1.118755678685662, 1.0160411048498337, 1.095139890038023, 1.3840297886827873,
+        1.8545128199504124, 1.2045050452431936, 0.7227333887696132, 0.6653589297037489,
+        0.7999285637719911, 1.0949535134851909, 1.626009698330484, 2.1183781603689154,
+        1.6791158246817148, 1.153698156431429, 0.8628697976399349, 0.726414593106758,
+        0.7196552474255182, 0.8769568937996945, 1.2358605559095355, 1.5527146740391942,
+        1.4468483535775432, 1.2317466290611154, 1.0907655057809544, 1.0223152906487774,
+        1.0127126493467258, 1.0602755023759223, 1.163063640406, 1.246599639003135,
+        1.1423886342947438, 0.9654200783976045, 0.883403312920063, 0.9003681230101627,
+        0.8348317646674184, 0.8277716017912375, 0.8453486851630955, 0.8446963228186273,
+        0.7938107539456918, 0.6858587421848816, 0.5466551631365825, 0.4071502224841709,
+        0.28341926066137413, 0.1824415351906105, 0.12290881601540835, 0.14460842546669536,
+        0.22427051263753345, 0.32461278672944655, 0.4318865386596221, 0.5341977536057032,
+        0.6167498913989383, 0.6680132809083422, 0.6870597888627581, 0.6823383815300129,
+        0.664550840058777, 0.6418283672632248, 0.6189384774432922, 0.5982255636024006,
+        0.5806435950916676, 0.5664423405438284, 0.5555491709388509, 0.5477632329447761,
+        0.5428470565782112, 0.540564016963012, 0.540686386978573, 0.5429853724725128,
+        0.5472069951808962, 0.5530330197354983, 0.5600229349053665, 0.5675313610621174,
+        0.5745971802254416, 0.579811388226969, 0.5811993473353503, 0.5762079700205701,
+        0.5619541678013668, 0.5358867051982581, 0.49679855034125897, 0.445704976530716,
+        0.3859025300599879, 0.32203517174879653, 0.25883401948819235, 0.20042351713485634,
+        0.15064070709924693, 0.11429877700138018, 0.0975600218107416, 0.1018140059069697,
+        0.1187757642079524, 0.1393929903985303, 0.15872490180602467, 0.17445883734413473,
+        0.18551278222353126, 0.1914679960795863, 0.19236199061592751, 0.18858574810175172,
+        0.18079410500714177, 0.16981436427552665, 0.15656790440490195, 0.1420227547663317,
+        0.12718470504928334, 0.11311732996168966, 0.10095364874053418, 0.09181763625350357,
+        0.08655513465029598, 0.08532861770910367, 0.08743645871165834, 0.09162082449281973,
+        0.09657738312849498, 0.10127309008223169, 0.10502143926439002, 0.10743843692298993,
+        0.10837019150217737, 0.10782742770880903, 0.1059358478161452, 0.10290229619188232,
+        0.09899338104032447, 0.09452131675580284, 0.08983039378463367, 0.08527698235516402,
+        0.08119751067267152, 0.07786423613993589, 0.07543833408452696, 0.0739391139825158,
+        0.07324704179109758, 0.0731423762253487, 0.07336236456026657, 0.07365453651022659,
+        0.07381291330021836, 0.07369609480794674, 0.07323245406927043, 0.07241786323976092,
+        0.07130888706259414, 0.07001185547956652, 0.06866686645654035, 0.06742600869031425,
+        0.06642699125651103, 0.06576635068765573, 0.06547883357237493, 0.065529208078292,
+        0.06581882371132089, 0.06620385513187807, 0.06651888988409667, 0.06659994486593947,
+        0.06630372060251224, 0.06552258751526456, 0.0641962157644353, 0.06232099144105373,
+        0.05995796577036228, 0.05723937495446414, 0.05437248633475957, 0.05163685403754021,
+        0.04936649099053179, 0.047904790190581, 0.04752730277287973, 0.0483551559891798,
+        0.05030967659462158, 0.05314029458949702, 0.0565009708704157, 0.06002487378664037,
+        0.06337071245579076, 0.06624301433486743, 0.06839806402181625, 0.06964440054604704,
+        0.06984217090055263, 0.06890290941741013, 0.06679043515427302, 0.06352389691967217,
+        0.059185302118689574, 0.05393654694371908, 0.048056262525198304,
+        0.042015834592794496, 0.036616575926903754, 0.03312794239448337,
+        0.033026697883546646, 0.03695558353738873, 0.044198347809887434,
+        0.053559155357414234, 0.06408494264854904, 0.07513314530279946,
+        0.08626073638897336, 0.09714030138092908, 0.10751621163928085, 0.11718426271416578,
+        0.12598282829858823, 0.1337890421367852, 0.14051663009641538, 0.14611368641031486,
+        0.15055965270292263, 0.15386135385360653, 0.1560483043958736, 0.1571676781351564,
+        0.15727937039533985, 0.15645151816584157, 0.15475672283865954, 0.1522690836929848,
+        0.1490620283084178, 0.1452068369399312, 0.1407717087760969, 0.13582120773868822,
+        0.13041594724012845, 0.12461241648708157, 0.11846290310364922, 0.11201551484576233,
+        0.10531433593290243, 0.09839976378451078, 0.09130905874016143, 0.08407710796987271,
+        0.07673736631207773, 0.06932290394155109, 0.061867475934987176,
+        0.054406540844628266, 0.046978202847245173, 0.03962415464014461,
+        0.032390932443928294, 0.025332474872596197, 0.01851760214987322,
+        0.012060080694839851, 0.006310961393960677, 0.0037913089320622934,
+        0.0074540851013438015, 0.01218428018534951, 0.01665071485964694,
+        0.020637874230841336, 0.024062746042958674, 0.02687709180864374,
+        0.02905020694217182, 0.03056493417117472, 0.03141666996934306, 0.03161300170829089,
+        0.031173304995627982, 0.0301281284894975, 0.02851837696298595, 0.02639437460709651,
+        0.023814915022728103, 0.020846428416206975, 0.017562503682378838,
+        0.01404445734745259, 0.010385664151466573, 0.006714217031421235,
+        0.0033668393744188396, 0.0025721600668742743, 0.005346827050044731,
+        0.008538574207826565, 0.01156196646003094, 0.014284140999776746,
+        0.01663613777779736, 0.018571391966202777, 0.02005759284779058,
+        0.02107443547826614, 0.021612811102874104, 0.02167440148135127,
+        0.021271374939423108, 0.02042608135928504, 0.01917072517981771,
+        0.01754707998107422, 0.015606475018383113, 0.013410693243454768,
+        0.01103559555966241, 0.008583276425080449, 0.006224349227758392,
+        0.004351531929845736, 0.0038478207232209064, 0.005053818685095378,
+        0.007007461272938442, 0.009081079668828608, 0.011041213770119771,
+        0.012781894999253241, 0.014242265512286321, 0.015383341549284238,
+        0.016180467192055382, 0.016620482311659596, 0.016700458403520125,
+        0.016426971500897895, 0.015815563660874034, 0.014890320832247495,
+        0.013683663798695312, 0.012236653022511465, 0.010600539299041593,
+        0.008841455555540615, 0.007053630022304882, 0.005396777459404297,
+        0.004187264487359421, 0.003922865683895803, 0.004718702747617495,
+        0.006080573583459562, 0.007595365060586813, 0.009063689623816212,
+        0.010385831808312746, 0.011504127401128035, 0.012382106740744449,
+        0.012996666987498608, 0.013334832481322861, 0.013392252979626325,
+        0.013172412846375563, 0.01268616402491997, 0.011951458460588137,
+        0.010993314250073691, 0.009844240656533304, 0.008545739334498679,
+        0.007152510971833784, 0.005743856660129358, 0.004454302775448017,
+        0.0035398816994767685, 0.003368870891439605, 0.004005242236614263,
+        0.005084815485847609, 0.006294528602555255, 0.0074747714393545665,
+        0.008542861633189291, 0.009450009274981226, 0.010164787097898758,
+        0.010666734110433665, 0.010943675256595486, 0.010990463807554956,
+        0.010808281952607824, 0.01040415583311893, 0.009790554894784658,
+        0.00898505549058324, 0.008010143386700055, 0.006893396790633467,
+        0.005668760843025063, 0.004381319964770164, 0.003105577378956457,
+        0.0020269749065445204, 0.0016909853768919568, 0.0024086963714449656,
+        0.0035348704481242325, 0.0047121338768943664, 0.005828469884145415,
+        0.0068342053943430195, 0.007699740919049784, 0.00840522418578779,
+        0.008937482138609827, 0.009288980294127185, 0.00945744553062772,
+        0.00944573838289288, 0.00926185045568934, 0.00891901776540724, 0.008436012838087014,
+        0.007837754122014004, 0.007156469432580522, 0.006433742788530036,
+        0.00572364669132462, 0.005095979871624895, 0.004634471028318298,
+        0.0044182157235437, 0.004482349673014914, 0.004791601785920972,
+        0.005262689871425441, 0.005806926898762275, 0.006352783622952908,
+        0.006848490580477287, 0.007257976087473922, 0.007556728088286234,
+        0.0077289542823247796, 0.007765835750548636, 0.007664484824480769,
+        0.007427337094666675, 0.007061844184797538, 0.006580454038648, 0.006000998825192494,
+        0.005347817034740697, 0.0046543112339366, 0.0039682337076057655,
+        0.00336095973142137, 0.0029355942808429658, 0.0028034965083509012,
+        0.0030001062669615056, 0.0034433894642466826, 0.004012670370187034,
+        0.004614774650726725, 0.005189581033028574, 0.005698610819604671,
+        0.006116430599253975, 0.006426029672393219, 0.006616489901628541,
+        0.006681796759530185, 0.0066202079980593066, 0.006433907454923337,
+        0.006128832248323835, 0.00571466049882122, 0.0052050430237604445,
+        0.004618321450638862, 0.003979323375283329, 0.0033236449609047444,
+        0.002707475930077638, 0.002225853709997594, 0.0020167398182939058,
+        0.0021652191426509856, 0.0025900682764882017, 0.0031469499424589395,
+        0.00373543679712624, 0.004298191723903072, 0.004801051917904457,
+        0.005221934014423973, 0.005545895646815722, 0.0057629561977581055,
+        0.005867091552368356, 0.005855737343260606, 0.005729518973638687,
+        0.005492091034579961, 0.005150050848324179, 0.004712952213818407,
+        0.004193531879506571, 0.0036084558439427998, 0.0029804404274041125,
+        0.0023443413841826256, 0.0017652784469436094, 0.0013830563349788328,
+        0.0013981863933216821, 0.001790991282959718, 0.002353083046594389,
+        0.0029533794006974656, 0.0035322143353680416, 0.004058270654746078,
+        0.0045119032831207155, 0.004879473520928647, 0.005151281163074204,
+        0.005320739110148285, 0.005384009185325466, 0.005339813564566797,
+        0.005189308656073796, 0.004935975900621348, 0.004585515848436839,
+        0.0041457548242609665, 0.0036266074646987157, 0.003040226293997288,
+        0.00240177688022818, 0.0017326774713422477, 0.0010771654243715064,
+        0.0006215456289296601, 0.0008605573429414002, 0.0014820558204644678,
+        0.0021549560967359235, 0.0028103201931478335, 0.0034226186176585173,
+        0.003975927236697503, 0.004458104799404213, 0.004859384617563905,
+        0.005171972311474412, 0.00538992471344151, 0.00550910819128324,
+        0.005527168976765166, 0.005443490349231581, 0.005259127439283314,
+        0.0049767179121210404, 0.004600371972000836, 0.004135551565673719,
+        0.0035889624350766963, 0.002968524522883174, 0.0022836538161773927,
+        0.0015470311722649256, 0.0007886028390981337, 0.0003674444235947478,
+        0.0010568979792783208, 0.0019227600456500184, 0.0028189631586417073,
+        0.0037256932891351338, 0.004632691835970455, 0.005532109456545005,
+        0.006417292943963185, 0.007282446172566192, 0.00812247976897604,
+        0.008932903494641339, 0.009709723598392497, 0.01044933679110045,
+        0.01114842240998002, 0.011803838112811648, 0.012412525724540241,
+        0.012971433814576761, 0.013477462678611357, 0.01392743591018049,
+        0.014318100898943429, 0.014646158599473576, 0.014908320979545262,
+        0.015101392844555299, 0.015222373368708363, 0.015268571710106128,
+        0.01523773056422941, 0.01512815139333514, 0.014938815306574236,
+        0.014669494093481296, 0.014320846667681159, 0.013894497103646578,
+        0.013393091508464879, 0.012820332148525133, 0.01218098855857082,
+        0.01148088686108906, 0.010726880357496926, 0.009926806908885543,
+        0.00908944229664996, 0.008224464858380305, 0.007342457807923372,
+        0.006454997420709235, 0.00557492053315429, 0.004716963398548225,
+        0.0038991836871045877, 0.003146044101154098, 0.002494718934368359,
+        0.00200470558260291, 0.0017542069317087407, 0.0017784946255798224,
+        0.002006218152551866, 0.00232595515128713, 0.0026603593964497274,
+        0.0029680980411632084, 0.0032282198706754376, 0.0034303515685249948,
+        0.0035699913009585673, 0.003646284637954149, 0.0036609164927668488,
+        0.003617517786908465, 0.0035213260843089704, 0.003378986988698624,
+        0.003198450055069171, 0.002988944789282247, 0.0027610340005967313,
+        0.002526729517319331, 0.002299594110889672, 0.0020945947607660014,
+        0.0019271925150580347, 0.001810972540380839, 0.0017537772557323164,
+        0.001754259478342997, 0.001801881970337422, 0.001880795177964702,
+        0.001974602913258943, 0.002069366287999798, 0.0021545867372193264,
+        0.0022230684905310935, 0.0022704192266817156, 0.002294540328399679,
+        0.002295208303263269, 0.0022737489461262393, 0.002232777332157694,
+        0.00217597228702773, 0.0021078539878744192, 0.002033532105523973,
+        0.001958390856886306, 0.0018876836206774075, 0.0018260348620638,
+        0.0017768991908661425, 0.0017420944147551617, 0.0017215634261705946,
+        0.0017134772034713903, 0.0017146691179542085, 0.0017212653671081425,
+        0.0017293315424926532, 0.001735401547992932, 0.0017368367370636548,
+        0.0017320250996746265, 0.0017204549983205304, 0.001702695065338442,
+        0.0016802968030552492, 0.0016556201106679, 0.0016315714994985157,
+        0.0016112468018399696, 0.0015974911241616954, 0.0015924286179043808,
+        0.0015970572654506144, 0.001611017474627441, 0.0016326033423978259,
+        0.0016590052210525524, 0.0016866999573611438, 0.0017118816306481853,
+        0.0017308508292435654, 0.0017403251078706074, 0.0017376700980358513,
+        0.0017210703219034914, 0.0016896646430068032, 0.0016436702477303944,
+        0.0015845152776006524, 0.0015149932054312994, 0.00143943474993648,
+        0.001363849051311655, 0.001295890695848854, 0.0012443632609973384,
+        0.0012179014151361257, 0.0012228166364814026, 0.0012609802746670561,
+        0.001329150894040121, 0.0014202007886951783, 0.0015252052057856077,
+        0.0016351486321604086, 0.0017418294452633996, 0.0018381671191476097,
+        0.0019182214205229321, 0.0019771213312803006, 0.0020109923378010385,
+        0.0020169122723587944, 0.0019929040612684627, 0.001937971538859671,
+        0.0018521943232595035, 0.001736921209359674, 0.001595150890424949,
+        0.001432294510078982, 0.00125773312912615, 0.0010879184461281247,
+        0.0009514115927484964, 0.0008907497947681613, 0.0009434653666869227,
+        0.0011088395570451517, 0.0013550239680231255, 0.0016500745368387203,
+        0.001972256889323836, 0.0023074985878207585, 0.002646064989309458,
+        0.002980634101807582, 0.003305332688016438, 0.0036152665973155063,
+        0.003906292368372841, 0.004174906432720847, 0.004418191353327842,
+        0.004633788495847122, 0.004819881093054851, 0.004975179047390823,
+        0.005098900758560475, 0.005190749498583486, 0.005250883211572071,
+        0.005279877498077217, 0.005278682161966966, 0.005248572158176653,
+        0.005191094138691392, 0.00510801007785551, 0.0050012396776856006,
+        0.0048728034078271585, 0.0047247681156539195, 0.004559197137803708,
+        0.004378106740477344, 0.004183430502119156, 0.003976992921367117,
+        0.003760493092185335, 0.0035354987541221165, 0.0033034504339811777,
+        0.0030656747940403955, 0.0028234057529394037, 0.0025778115140028773,
+        0.0023300253971187683, 0.002081178405174488, 0.0018324318984763216,
+        0.0015850098933887515, 0.0013402331679562532, 0.0010995642140609735,
+        0.0008646930543031177, 0.0006377741020925729, 0.0004223363190117257,
+        0.000228718038058723, 0.00012724871345691047, 0.00023610096291907246,
+        0.0003940347225118196, 0.000546036292470807, 0.0006837876819693154,
+        0.0008044048902184739, 0.0009062912637558168, 0.0009884103219611696,
+        0.0010501062235689458, 0.001091053676446671, 0.0011112444243714045,
+        0.0011109833694339449, 0.0010908849804828343, 0.0010518664065178888,
+        0.000995136009224136, 0.0009221772179652895, 0.0008347285838609302,
+        0.0007347623608783449, 0.0006244673402151013, 0.0005062521390404085,
+        0.0003828260797088896, 0.00025763202699269165, 0.0001377994698132916,
+        7.162313839445493e-05, 0.00015189424666117658, 0.00026241930989381396,
+        0.00036975248762475903, 0.00046852015798766575, 0.0005562222810716258,
+        0.0006311467051088187, 0.0006920221658217357, 0.0007379368777065777,
+        0.0007683168072918383, 0.0007829187118687086, 0.0007818253036592014,
+        0.0007654386385169824, 0.0007344710038376966, 0.000689934459225043,
+        0.0006331324257612824, 0.0005656611385285784, 0.000489439794433839,
+        0.00040682009520517427, 0.0003209321953620081, 0.0002368339239865266,
+        0.00016565836526767665, 0.00013478819893943442, 0.0001667429388336684,
+        0.00023325649605031277, 0.00030786029093651785, 0.0003804517294370829,
+        0.00044670460849814946, 0.0005042145866149765, 0.000551424082932573,
+        0.0005872823066285288, 0.0006111218755944632, 0.0006226080127142285,
+        0.0006217141019167812, 0.0006087071881805379, 0.0005841378155773151,
+        0.0005488337925370467, 0.0005039018286605499, 0.00045074792807777125,
+        0.0003911432190316932, 0.00032740396635983946, 0.00026287610922630687,
+        0.0002032526702987379, 0.00015961837575489705, 0.00014911690305620208,
+        0.00017656153643561941, 0.0002256254753857957, 0.0002814620211890381,
+        0.00033657530708868763, 0.0003871594041505672, 0.0004309922678443445,
+        0.0004666383142223907, 0.0004931447488802441, 0.0005099168463229652,
+        0.0005166619561811088, 0.0005133615335116073, 0.0005002554060507277,
+        0.0004778326511300202, 0.0004468288928858488, 0.00040823486253632003,
+        0.000363329455511259, 0.00031376958303342556, 0.00026181798267056576,
+        0.0002109161690144547, 0.00016703914398698118, 0.00014062267767121084,
+        0.00014268053225257953, 0.0001708330147305801, 0.00021242688886162183,
+        0.00025788557800371045, 0.00030207982749290923, 0.0003421737966808309,
+        0.00037642198188976393, 0.00040367100306911775, 0.00042315358682298436,
+        0.0004343980665758425, 0.00043718517245215784, 0.0004315249547495759,
+        0.0004176427292315545, 0.000395969986266631, 0.00036714032388197816,
+        0.0003319947191769586, 0.0002916083165566753, 0.00024737063671449185,
+        0.00020120838377050122, 0.00015621769696941325, 0.00011842692218764719,
+        9.965979133581804e-05, 0.00011038943946683589, 0.0001425952599277111,
+        0.00018292350291390956, 0.00022423664493543497, 0.00026316027030937603,
+        0.0002978393224422886, 0.000327103410156341, 0.00035016918515516095,
+        0.00036652630842617213, 0.0003758904477692868, 0.0003781828552368661,
+        0.0003735216052805128, 0.00036221932519316265, 0.0003447869970482811,
+        0.0003219470655167611, 0.00029466378448820527, 0.00026420651362375953,
+        0.00023227414824899563, 0.00020121950064428467, 0.00017436587935357078,
+        0.00015608983434799227, 0.0001506013561701685, 0.0001590211686080024,
+        0.00017821252037626426, 0.00020336632977882514, 0.00023043496622827302,
+        0.000256613677786046, 0.0002800306678764011, 0.00029942329170880603,
+        0.00031393747398374854, 0.0003230174624801517, 0.00032634635847145346,
+        0.0003238135320487963, 0.0003154966129724759, 0.0003016526035450164,
+        0.0002827171694023105, 0.00025931548191589535, 0.00023229456538513476,
+        0.00020280019736111394, 0.00017244879841751275, 0.00014368953379926495,
+        0.00012041425786649438, 0.00010811535417423175, 0.00011101107478220614,
+        0.00012738125999660758, 0.00015150539716452877, 0.00017844068651075854,
+        0.0002050793033832771, 0.0002295232852803799, 0.0002505487013882914,
+        0.00026732931001381964, 0.0002793058430048086, 0.0002861235839487717,
+        0.0002876013343935786, 0.00028371514535855704, 0.0002745895349752414,
+        0.00026049359571106786, 0.00024184254624477937, 0.0002192089466891785,
+        0.00019335469477620707, 0.00016531124642826166, 0.00013657709769725922,
+        0.00010959731385779768, 8.873850565283479e-05, 8.063240700838305e-05,
+        8.900749202725313e-05, 0.00010926188543812382, 0.00013469402060032544,
+        0.0001611132580508171, 0.00018623674267374336, 0.00020871287909629072,
+        0.00022765677435880184, 0.00024245713196659313, 0.0002526942613501686,
+        0.0002581033166327315, 0.0002585565809081617, 0.00025405400451081867,
+        0.0002447175149953781, 0.000230787618814137, 0.00021262287296075323,
+        0.00019070544977612062, 0.00016566169515392452, 0.00013832229826486435,
+        0.0001098972715673488, 8.251975166926982e-05, 6.0930154036231864e-05,
+        5.469344180372411e-05, 6.825823806677495e-05, 9.240373086449352e-05,
+        0.0001194898775116491, 0.00014622693385243378, 0.00017103885706081298,
+        0.00019298219198228135, 0.00021140559634693636, 0.00022583416783384118,
+        0.00023592615507460644, 0.00024145533539215267, 0.00024230296616204467,
+        0.00023845314146219603, 0.0002299890232374369, 0.0002170889514875467,
+        0.00020002227038098532, 0.00017914548239530512, 0.00015490078424886978,
+        0.00012782320901547564, 9.857847520264402e-05, 6.813485347931022e-05,
+        3.8812211309183584e-05, 2.3609384203268257e-05, 4.335524870635986e-05,
+        7.341150373956386e-05, 0.00010412229340645288, 0.00013360423669056876,
+        0.00016098637746664464, 0.00018565273806092194, 0.00020710663058305952,
+        0.0002249377166893763, 0.0002388134214224764, 0.00024847705423850083,
+        0.00025374750553677224], [8.893741018310515e-09, 2.6706174487340215e-08,
+        4.459359196976309e-08, 6.26064047800346e-08, 8.079565883903322e-08,
+        9.92132998989498e-08, 1.179124373349683e-07, 1.3694762446521178e-07,
+        1.5637514564230232e-07, 1.762533183263118e-07, 1.9664281100182194e-07,
+        2.176069804184508e-07, 2.392122286751204e-07, 2.615283868719717e-07,
+        2.846291249780527e-07, 3.0859239457299644e-07, 3.335009066146446e-07,
+        3.594426493816247e-07, 3.8651145205570444e-07, 4.1480759769233647e-07,
+        4.444384945710783e-07, 4.7551940929166953e-07, 5.081742719421233e-07,
+        5.425365606023464e-07, 5.787502748500087e-07, 6.169710086806727e-07,
+        6.57367136113502e-07, 7.001211211024764e-07, 7.454309690621986e-07,
+        7.935118349839934e-07, 8.445978108222654e-07, 8.989439105114371e-07,
+        9.56828281156324e-07, 1.0185546663078882e-06, 1.0844551558236127e-06,
+        1.154893257268225e-06, 1.2302673330354251e-06, 1.3110144490815375e-06,
+        1.39761469290341e-06, 1.4905960208160651e-06, 1.590539710020782e-06,
+        1.6980864951825186e-06, 1.8139434884196497e-06, 1.938891989496905e-06,
+        2.0737963171914905e-06, 2.219613802483941e-06, 2.3774061233175698e-06,
+        2.548352164959574e-06, 2.7337626495805313e-06, 2.9350967882364046e-06,
+        3.1539812746901784e-06, 3.3922319813971587e-06, 3.6518787790027545e-06,
+        3.935193982094072e-06, 4.244725002742049e-06, 4.583331897116452e-06,
+        4.954230624842676e-06, 5.361042968322357e-06, 5.807854258990412e-06,
+        6.299280251827775e-06, 6.840544753771455e-06, 7.437569922545112e-06,
+        8.097081522463253e-06, 8.826731879692465e-06, 9.635243833934106e-06,
+        1.0532579663839842e-05, 1.153013978134431e-05, 1.2640997015534293e-05,
+        1.3880173566290937e-05, 1.5264969242829305e-05, 1.6815351537883795e-05,
+        1.8554420482742025e-05, 2.0508964234296416e-05, 2.2710125068165535e-05,
+        2.5194200232915345e-05, 2.8003608054462713e-05, 3.1188057350018845e-05,
+        3.480596783170353e-05, 3.892620165977989e-05, 4.363018235989161e-05,
+        4.9014497950161765e-05, 5.5194112205425805e-05, 6.23063432848626e-05,
+        7.051581539404735e-05, 8.00206508157243e-05, 9.106025166125267e-05,
+        0.0001039251309769507, 0.00011896940171491346, 0.00013662673492569066,
+        0.00015743087743596743, 0.000182042204514585, 0.0002112823227549863,
+        0.0002461794987524905, 0.00028802877387052784, 0.0003384721884697776,
+        0.00039960682042890504, 0.00047413171099444705, 0.000565549802441998,
+        0.0006784486892099646, 0.0008188958611992065, 0.0009950028134464235,
+        0.0012177424249490672, 0.0015021533052460227, 0.0018691477651409552,
+        0.00234828354242104, 0.002982115493410429, 0.0038332171132481343,
+        0.004995874906358055, 0.006616306621030697, 0.00892921670668867,
+        0.012327614804185082, 0.017505685513734624, 0.025778613784674005,
+        0.03989182880528764, 0.06646862471736263, 0.12589319672239685, 0.3236371391111799,
+        4.3725953408151, 0.3758083636943211, 0.10869037332708001, 0.9978172914328253,
+        0.8520628962775884, 1.1489554857600726, 2.293093201406455, 3.101540463809851,
+        1.4597961733424352, 0.9830646742619275, 0.8976723290344779, 1.5091634753043164,
+        2.7629958439565336, 2.8721022198733106, 2.16203079552537, 1.8592209872420584,
+        1.8076573294449196, 1.9670339834562982, 2.3655371209612066, 2.567830260687796,
+        1.7777518509916226, 1.1671331704362307, 0.9527386401237379, 0.970413132256576,
+        1.1544973396283171, 1.5195805379712202, 2.0707690906872047, 2.3781211988475044,
+        1.996265583337108, 1.536653834741414, 1.244431436524108, 1.0856322128541829,
+        1.029575752797154, 1.0794120430972458, 1.2598893076212883, 1.5124372227252012,
+        1.5507591681964823, 1.3797416818022066, 1.2370641885611409, 1.1792575285985107,
+        1.0115338060398253, 0.9401296653928954, 0.899137442318691, 0.842838356372075,
+        0.7441647984960497, 0.6048009863964509, 0.45517577243551494, 0.3265039824233933,
+        0.2384522380011577, 0.20652472806913108, 0.2317017795932892, 0.2929485336201389,
+        0.37289118236117974, 0.4631254399038593, 0.5562413417698588, 0.640849548544282,
+        0.7026251940459295, 0.731902495980618, 0.7303416738075665, 0.7082387603340035,
+        0.6768404479222674, 0.6439444035513571, 0.6136765681391118, 0.587753767401012,
+        0.5666260700214119, 0.5501730983940247, 0.5380643238392799, 0.5299278870682161,
+        0.5254214353690091, 0.5242546368882296, 0.5261872086920094, 0.5310125281535727,
+        0.5385293549043716, 0.5484994052462773, 0.5605848659793474, 0.5742572814127125,
+        0.5886694990024839, 0.6024910459355219, 0.6137352821679559, 0.6196665914850573,
+        0.6169597279514493, 0.6023121187821292, 0.5735182449140575, 0.5305515939839669,
+        0.4758775225644805, 0.41364281578453416, 0.3482929681703934, 0.28351763939358454,
+        0.22196419010636814, 0.1656570027172437, 0.11714229637491154, 0.08216984567186386,
+        0.07212485271039992, 0.08835534012744872, 0.11547620705727521, 0.1434164721715541,
+        0.16830203917700856, 0.1885071662871312, 0.20330742110553124, 0.21248887346187376,
+        0.21619200004828568, 0.21480115948500025, 0.20884496342705752, 0.19891495098501974,
+        0.18561445104983942, 0.16954278430568082, 0.15131390731335198, 0.13160830759504416,
+        0.11126572339244213, 0.09144933572160832, 0.07394246032352772, 0.06151512632986251,
+        0.05735570560076884, 0.062094382452133924, 0.0726021417298097, 0.08528406866470865,
+        0.0978861103821662, 0.10919851885595969, 0.1185700116352367, 0.1256390443670756,
+        0.13020607920783092, 0.13217621801058824, 0.13153738921653552, 0.12835638775403355,
+        0.12278216119671602, 0.11504972976886566, 0.10548212770664289, 0.09449285767629761,
+        0.08259798042464576, 0.07045593827999776, 0.05896370190727414, 0.049423192745236925,
+        0.04360204842457349, 0.04300949292451095, 0.047413896925014416,
+        0.05497384388431691, 0.06380975470840122, 0.07265397963395491, 0.08072882263707203,
+        0.08755189979788713, 0.09282201670227279, 0.09636108403357252, 0.09808263155496512,
+        0.09797187136450383, 0.09607141556457217, 0.09247116887984116, 0.08730272524595244,
+        0.08073928044459243, 0.07300278466275983, 0.06438210096599355, 0.055271400606132726,
+        0.0462499788543317, 0.038237643302215796, 0.03268418695823404, 0.03126987302872225,
+        0.03444149508329333, 0.04080900567436315, 0.048651061076785615,
+        0.056806939609382975, 0.06458996297296532, 0.07157751586563582,
+        0.0774896760461325, 0.08213071091909294, 0.08536163717527585, 0.08708767742054381,
+        0.08725304242110199, 0.08583925535731639, 0.08286498630460684, 0.07838642956262551,
+        0.0724982640305246, 0.06533666605216112, 0.05708865265327855, 0.04801925486483908,
+        0.038550412865810305, 0.029500181899988213, 0.02275694187235274,
+        0.0217944249771202, 0.02778224156754064, 0.03770401906532639, 0.04919069280510975,
+        0.06119081257887225, 0.07319134995753104, 0.08488012673115963, 0.09603232211695875,
+        0.10647070100984425, 0.11605138021316463, 0.12465929221382299, 0.132207375083526,
+        0.13863683658319773, 0.14391714430298921, 0.1480450474422579, 0.15104236635062,
+        0.15295261189358358, 0.15383673142765886, 0.15376841065253913, 0.15282938837973495,
+        0.1511051809519976, 0.1486814958453359, 0.1456414754933485, 0.14206378307380227,
+        0.13802144187600104, 0.13358127781951804, 0.12880379079673746, 0.12374328917879199,
+        0.11844815445863527, 0.11296114943219535, 0.10731973322603316, 0.10155638968084392,
+        0.09569900419883717, 0.08977133333922847, 0.08379360123104307, 0.07778323187137866,
+        0.07175569533679212, 0.06572541838672691, 0.059706694586120046,
+        0.05371453061021064, 0.04776538470174121, 0.041877788435591326,
+        0.036072895333349016, 0.03037508684999493, 0.024812961752009893,
+        0.01942163121293393, 0.01424957343044152, 0.009385436266218147,
+        0.005116475782768611, 0.0032078517534077085, 0.005711140846225617,
+        0.009207961551083815, 0.012574808896369971, 0.015619893090653243,
+        0.018277562465237967, 0.020514242238137404, 0.0223108192033702,
+        0.023658022546705366, 0.024554877095460982, 0.02500798795284565,
+        0.02503105467753568, 0.024644469623375905, 0.02387500430163264,
+        0.022755641867950493, 0.0213256470322915, 0.019631023743992712,
+        0.017725652185446472, 0.015673715968782316, 0.013554703173942384,
+        0.011473505703414657, 0.0095793257768491, 0.008091163916956079,
+        0.007286798495196143, 0.0073498863758182246, 0.008169177739236207,
+        0.0094360001486323, 0.010873200602089584, 0.012301266470025494,
+        0.01361212605869571, 0.014739785890015603, 0.015643309238084248,
+        0.016298101288908132, 0.016691478080180913, 0.01682033810061903,
+        0.01668987158808944, 0.01631280457523194, 0.01570896492577046, 0.014905128066462927,
+        0.013935222543901974, 0.012841081743414844, 0.011674013882160337,
+        0.010497429385650911, 0.009390224062687155, 0.008448525882936746,
+        0.007778527308038949, 0.0074694252976303666, 0.007550324901204694,
+        0.007968711367406383, 0.008618169436447701, 0.00938469627487296,
+        0.01017354422945039, 0.010914515140012569, 0.011558249993194046,
+        0.012071275508849596, 0.012432142365368297, 0.0126288179419821,
+        0.012657009277014958, 0.012519110213748793, 0.012223571563022142,
+        0.011784583353233685, 0.01122202334251584, 0.010561669890459183,
+        0.00983569138165109, 0.009083364186404467, 0.008351720261962632,
+        0.007695178432598297, 0.007172083775362614, 0.006835396490535851,
+        0.006717497249264724, 0.006816669673846946, 0.007096616461891812,
+        0.007500247252632256, 0.00796669987217339, 0.008442201856941021,
+        0.008883893104936546, 0.009259720073744078, 0.009547019522339967,
+        0.009731021172562491, 0.009803643321275715, 0.00976261225616689,
+        0.00961084465608298, 0.009356031531053015, 0.009010383503498776,
+        0.008590513136825354, 0.008117424918512802, 0.0076165365562039814,
+        0.007117531427596368, 0.0066536029641734076, 0.0062593339797120595,
+        0.005966368348719741, 0.005796889342009531, 0.005757076888419249,
+        0.005834448559790527, 0.006001295566558486, 0.006222119658990415,
+        0.006460897554305694, 0.006685699273717457, 0.0068706521074869175,
+        0.006996288664547294, 0.007049215500033484, 0.007021640583489787,
+        0.006911002752359907, 0.00671980114190777, 0.0064556735964467725,
+        0.006131766749709113, 0.005767428226570504, 0.00538915474259166,
+        0.005031386949678393, 0.004735920704440783, 0.004547547903916229,
+        0.004503834996782561, 0.004621829187647732, 0.004891126167613295,
+        0.005279553327372119, 0.005745762717734383, 0.006249376589005931,
+        0.006755598042032832, 0.0072360838409741375, 0.0076683337093730874,
+        0.00803480313923894, 0.008322157467847903, 0.00852073787351774,
+        0.008624202479971399, 0.00862929071986535, 0.008535671768376276,
+        0.00834585578826079, 0.008065164106869197, 0.007701771233469512,
+        0.00726684954745776, 0.006774867815106872, 0.006244113947987086,
+        0.005697509517908019, 0.005163684807843066, 0.004677893179730485,
+        0.004281332471904983, 0.004015932670937388, 0.003912200893741447,
+        0.003974777207883011, 0.0041784408384525655, 0.004479484030160998,
+        0.00483140893481141, 0.00519425839527865, 0.005537030623903957,
+        0.005836817015594862, 0.00607721166570173, 0.00624694271796681,
+        0.006338899162498473, 0.006349489982322022, 0.006278241494981908,
+        0.0061275637323165945, 0.005902650291761317, 0.005611508217995655,
+        0.005265145505829888, 0.004877973321750103, 0.0044684945948044305,
+        0.004060293195453887, 0.0036830385327922847, 0.0033723412175727476,
+        0.00316577119797026, 0.0030923196599553114, 0.003158831991673328,
+        0.0033454251087573733, 0.003615357042317124, 0.003929157076502026,
+        0.004252889170581553, 0.004560162238325092, 0.0048313119290998695,
+        0.00505202250722703, 0.005212178683662981, 0.005305066431727234,
+        0.0053268543418201085, 0.0052762708147136295, 0.005154418196988964,
+        0.004964695258119085, 0.004712828541756829, 0.004407045171187529,
+        0.0040584616304545065, 0.0036818192914761317, 0.0032967478735426003,
+        0.002929649592481645, 0.0026155692811587355, 0.00239699146338551,
+        0.002313176992267217, 0.002379385979538301, 0.002575361291927564,
+        0.0028588160444722424, 0.003186339734990494, 0.0035232682378622737,
+        0.003844261360945485, 0.004131107671561836, 0.00437066900792272,
+        0.004553501568028373, 0.004673018861908233, 0.004724997792424261,
+        0.004707287615229786, 0.00461963935406715, 0.004463614077687904,
+        0.004242558379881116, 0.003961664092776579, 0.0036281696281632043,
+        0.0032518357404025303, 0.0028459888636303923, 0.002429770846938546,
+        0.002032848421000404, 0.0017037723830845136, 0.0015152155668279592,
+        0.0015333837905658842, 0.001750706175350401, 0.0020951710229717797,
+        0.0024976780132227746, 0.002913707021428256, 0.003316067339883404,
+        0.0036870613732267058, 0.004014255906579226, 0.0042884486902825284,
+        0.004502688562964038, 0.004651785307288457, 0.004732049795973344,
+        0.0047411433649908186, 0.00467797803655852, 0.004542638812020342,
+        0.004336314383360794, 0.004061231810488433, 0.0037205989636857058,
+        0.0033185714938629147, 0.00286029252865021, 0.0023521527878015143,
+        0.0018028178002762118, 0.0012277451770235002, 0.0006788532944635071,
+        0.0004943883931070399, 0.0009822386546921786, 0.001642825813221277,
+        0.0023436713963429024, 0.0030598063923334535, 0.0037808999787109538,
+        0.004500349245441693, 0.005213092845839099, 0.005914980353417473,
+        0.006602530203380441, 0.007272801827494176, 0.007923301141985611,
+        0.008551892713251527, 0.00915671035824934, 0.009736065316526862,
+        0.010288354479435454, 0.010811972718867587, 0.011305233927543405,
+        0.011766305283824798, 0.012193158653745697, 0.01258354207703621,
+        0.01293497308275212, 0.01324475427827501, 0.01351001038410639, 0.013727744751356087,
+        0.01389491247906756, 0.014008506585349207, 0.014065653289689823,
+        0.014063712315148084, 0.014000378181984383, 0.01387377869708291,
+        0.013682567201789987, 0.013426005588338969, 0.01310403560227459,
+        0.012717336496579279, 0.012267367679542658, 0.011756395602134054,
+        0.011187504771400854, 0.010564593481843628, 0.009892355692738943,
+        0.009176251581485027, 0.008422470956470725, 0.007637896533145291,
+        0.00683007945124899, 0.006007250649712396, 0.005178417359987098,
+        0.004353657956024675, 0.0035449049276841146, 0.002768051829130624,
+        0.002049116130654241, 0.0014439133324608844, 0.0010887051392034965,
+        0.0011531922501180686, 0.0015238807438927545, 0.001987423702123627,
+        0.0024483921891936197, 0.0028710722527459285, 0.003239754034312919,
+        0.0035464299068528157, 0.0037868196185902917, 0.003958895836288649,
+        0.004062259394500073, 0.004097838720618675, 0.004067724867576619,
+        0.003975068550249087, 0.0038240105551039377, 0.0036196382903019818,
+        0.0033679760572363376, 0.003076034223254657, 0.0027519737282882192,
+        0.002405508899379073, 0.002048823413642134, 0.0016986161982211036,
+        0.001380487813423554, 0.0011363128473724996, 0.001024169852431633,
+        0.0010780053145037897, 0.0012618297432602143, 0.001510845627306931,
+        0.0017785448586901211, 0.0020384652300672176, 0.0022754174519756315,
+        0.0024800762580171644, 0.002646429569426662, 0.0027705992475030917,
+        0.0028502722833577483, 0.002884409045158697, 0.0028730830325158015,
+        0.0028173875443218686, 0.0027193819791638115, 0.0025820708106572532,
+        0.0024094240720053373, 0.0022064680800982905, 0.001979510341645692,
+        0.0017366341282171475, 0.0014887443037725112, 0.0012516881720159288,
+        0.001049934686973571, 0.0009193279332799447, 0.0008958178431358464,
+        0.0009834297252858857, 0.0011481434948010186, 0.0013502035323734907,
+        0.001561883868576214, 0.0017661036620918538, 0.0019520886512053466,
+        0.0021126567748356354, 0.0022428379895660417, 0.0023391920823508383,
+        0.002399464064674535, 0.0024224035159314938, 0.0024076662653186843,
+        0.002355760628147975, 0.0022680228880697026, 0.002146621077512877,
+        0.001994600188842008, 0.001816003752736942, 0.0016161506263175896,
+        0.0014022441655101216, 0.0011847129520376977, 0.0009800944654406014,
+        0.000816190541190867, 0.0007342534999964871, 0.000766316874688021,
+        0.0008982136061958188, 0.0010875952726419327, 0.0013001525450242171,
+        0.0015151878316181611, 0.0017202078028733677, 0.0019069940470294252,
+        0.0020696823500197777, 0.002203876079313414, 0.0023062296739526735,
+        0.0023742465319185283, 0.0024061777324829933, 0.0024009699338959265,
+        0.0023582388199613565, 0.0022782586482513294, 0.0021619677867947525,
+        0.002011000173606775, 0.0018277703811680045, 0.0016156816381041148,
+        0.001379640902739438, 0.0011274241394256318, 0.0008736875389888523,
+        0.0006526256743676439, 0.0005460731269175786, 0.0006411504435498891,
+        0.0008862932630529122, 0.0011964587435845137, 0.0015321992485143984,
+        0.001876467538473768, 0.0022200421105362696, 0.002556768060582492,
+        0.002881951089359531, 0.003191755750058049, 0.003482960182880188,
+        0.0037528505716037893, 0.003999173937346037, 0.004220115477780509,
+        0.004414285207379505, 0.004580706572101582, 0.004718803379199984,
+        0.004828383217959059, 0.004909616540473659, 0.0049630111526059685,
+        0.004989382235787743, 0.004989818276461393, 0.004965643470828917,
+        0.004918377324170983, 0.004849692289388226, 0.004761370394894589,
+        0.004655259899147969, 0.0045332330757570346, 0.00439714627389391,
+        0.004248803405533841, 0.004089923974437073, 0.003922116670212144,
+        0.003746859396927128, 0.003565486382754957, 0.0033791827286032174,
+        0.0031889864088468956, 0.002995797357787153, 0.0028003928903737054,
+        0.0026034483522026433, 0.0024055616082524155, 0.00220727979967841,
+        0.0020091267484766396, 0.0018116294946045129, 0.0016153427318424173,
+        0.001420870418708474, 0.001228884736946411, 0.0010401443347097178,
+        0.000855518006467528, 0.000676032424524731, 0.0005030087848875468,
+        0.00033858157030793826, 0.00018862980205493646, 9.277549063319994e-05,
+        0.00016023497350972697, 0.00027954941090620753, 0.00039628556441057266,
+        0.0005033063419599679, 0.0005984831476531242, 0.0006807402669685352,
+        0.0007494134289948477, 0.0008040939466348918, 0.0008445832680702199,
+        0.000870879140334019, 0.0008831715369235168, 0.000881841204208625,
+        0.0008674584466970033, 0.0008407817640136457, 0.000802757206342675,
+        0.0007545206628636986, 0.0006974074319790294, 0.0006329774676849083,
+        0.0005630730076773463, 0.0004899430095359821, 0.0004165060530140538,
+        0.0003468890338127139, 0.00028739396505602835, 0.0002473660645688256,
+        0.00023658850976056924, 0.0002565286445823424, 0.0002977816873280726,
+        0.0003490858847865038, 0.00040269597771723574, 0.0004540044680157341,
+        0.0005002423783726645, 0.0005396730432566896, 0.0005711859917524566,
+        0.0005940967232699688, 0.0006080447761071341, 0.0006129392320586128,
+        0.000608928167616676, 0.000596381358996288, 0.000575881928493735,
+        0.0005482263717487003, 0.0005144353632248188, 0.00047578091719397423,
+        0.00043383931045188245, 0.00039058240171627417, 0.0003485149748296675,
+        0.00031082507940535635, 0.0002813748375143553, 0.0002641060289185773,
+        0.0002615160382317484, 0.000273088610418314, 0.00029549002788364616,
+        0.00032435630536069965, 0.00035577788520758946, 0.00038677440482570214,
+        0.00041521256889273184, 0.00043960147095968273, 0.00045892217571353417,
+        0.00047251315444755065, 0.0004799983606680745, 0.00048124294989729954,
+        0.0004763263402321561, 0.00046552669535731433, 0.00044931407777611696,
+        0.00042835179397903914, 0.0004035071723067247, 0.00037587409855518067,
+        0.0003468089662975361, 0.00031797566981024434, 0.0002913754946850879,
+        0.0002692928136188185, 0.00025402901279077806, 0.0002473285855464691,
+        0.00024968678510394317, 0.00026007278051635313, 0.00027636064185377246,
+        0.0002960824830717557, 0.0003169792662062505, 0.0003372170682443112,
+        0.0003553980385362168, 0.00037049946703278326, 0.0003818064588973642,
+        0.00038885838038218046, 0.0003914109150428129, 0.0003894106408719555,
+        0.00038297887562734805, 0.0003724026085410706, 0.00035813148709735066,
+        0.00034078069597019933, 0.0003211398426291283, 0.0003001868993996139,
+        0.00027910208643384536, 0.00025926618847605987, 0.00024220870245692647,
+        0.0002294516713146996, 0.00022221274923836547, 0.00022103795678472745,
+        0.00022557882507046067, 0.0002346976373838474, 0.0002468288194530752,
+        0.00026035358564992423, 0.0002738314976120527, 0.0002860878281801283,
+        0.0002962186374523421, 0.0003035651827369831, 0.00030768403928821235,
+        0.0003083226365395129, 0.00030540245336022065, 0.0002990097604104833,
+        0.0002893936316396198, 0.000276971518485766, 0.000262343189341046,
+        0.0002463133009527087, 0.00022991913483142416, 0.00021444869933477648,
+        0.00020141012563473348, 0.0001923824939140057, 0.0001886898420500139,
+        0.00019097505698170277, 0.0001989440565449569, 0.00021149868535420466,
+        0.00022713868547325928, 0.00024433839938122, 0.0002617512042323858,
+        0.00027827013493277345, 0.0002930186621307521, 0.0003053209978610769,
+        0.0003146730447326018, 0.0003207199215775994, 0.0003232402014239982,
+        0.00032213550900829713, 0.00031742420293947026, 0.00030923840839024006,
+        0.00029782431867934233, 0.00028354637865339355, 0.0002668966870998555,
+        0.00024851156642907154, 0.0002291970970263044, 0.00020996244168747846,
+        0.00019204886758678196, 0.00017691504158035917, 0.00016609653891007725,
+        0.00016085557847700616, 0.00016169882728996624, 0.00016810773412463412,
+        0.0001787531560674852, 0.00019199646616111917, 0.00020629415496007126,
+        0.0002203712125947746, 0.0002332400745008602, 0.0002441620620719783,
+        0.00025260167775483725, 0.00025818993847594407, 0.00026069864520192267,
+        0.00026002351555084655, 0.0002561738798078993, 0.00024926744087550154,
+        0.00023952957850501108, 0.00022729767358505652, 0.0002130319431440918,
+        0.0001973351616926205, 0.00018098352455057413, 0.00016496674942299367,
+        0.00015051948807458292, 0.00013908637267777394, 0.00013211106877966848,
+        0.00013058434736628563, 0.0001345680614388699, 0.0001431385040157456,
+        0.0001548211641442057, 0.00016809586241278755, 0.000181666133708444,
+        0.00019451693127724054, 0.00020588185576547263, 0.0002151937810184018,
+        0.00022204413192637528, 0.00022615452377721139, 0.00022735837849117976,
+        0.00022558958136740696, 0.00022087611461603517, 0.0002133376673822466,
+        0.00020318727727925692, 0.00019073824009666458, 0.00017641908111472193,
+        0.00016080151130437926, 0.00014464847740358296, 0.00012898769194741216,
+        0.00011519459302866609, 0.00010498902864674481, 0.0001001086040240721,
+        0.00010151805658010461, 0.00010874842208072688, 0.00012020698719219032,
+        0.00013404990664453252, 0.00014872367005410068, 0.0001630657989226192,
+        0.00017623140971295803, 0.00018760439326940143, 0.0001967336404194769,
+        0.00020329332444256212, 0.00020705929160243382, 0.00020789519262597467,
+        0.0002057443896566113, 0.00020062546368943845, 0.00019263039962859132,
+        0.00018192556873150673, 0.00016875686664541051, 0.000153462435553987,
+        0.00013650059433182224, 0.00011850974944612033, 0.00010043632777235315,
+        8.379493724029804e-05, 7.106937704740386e-05, 6.5646476296651e-05,
+        6.966624383480316e-05, 8.158963981850832e-05, 9.805137028528685e-05,
+        0.00011638632923770846, 0.0001349468691746035, 0.00015270991181388823,
+        0.00016898868643402907, 0.00018328674026842184, 0.00019522827530013792,
+        0.00020452439130471268, 0.0002109560783730498, 0.00021436513399099197,
+        0.00021464883469416346, 0.00021175632324399262, 0.00020568569689141458],
+    [2.3862239638435658e-08, 7.166262606888521e-08, 1.196911855847912e-07,
+        1.681015124251765e-07, 2.1704942834029127e-07, 2.666939139056085e-07,
+        3.171980458697401e-07, 3.687299919669122e-07, 4.2146404025294803e-07,
+        4.755816886592167e-07, 5.312728010214457e-07, 5.887368433312538e-07,
+        6.481842063456095e-07, 7.098376382247856e-07, 7.739337921753112e-07,
+        8.407249140827189e-07, 9.104806836558643e-07, 9.8349023191179e-07,
+        1.0600643600090176e-06, 1.1405379810191713e-06, 1.2252728226915431e-06,
+        1.3146604153135927e-06, 1.4091254107477468e-06, 1.5091292727385778e-06,
+        1.6151743885087626e-06, 1.7278086574250246e-06, 1.8476306251260981e-06,
+        1.9752952316151565e-06, 2.111520264392762e-06, 2.2570936076731957e-06,
+        2.412881409852837e-06, 2.579837288007295e-06, 2.759012730259689e-06,
+        2.9515688624322826e-06, 3.1587897876794975e-06, 3.382097728338753e-06,
+        3.6230702507585294e-06, 3.883459886559608e-06, 4.16521653374563e-06,
+        4.470513068280426e-06, 4.801774694040263e-06, 5.161712630442587e-06,
+        5.553362869798434e-06, 5.9801308476887465e-06, 6.445843054322861e-06,
+        6.954806774458981e-06, 7.511879433297447e-06, 8.122549232837686e-06,
+        8.79302920882096e-06, 9.530367168299552e-06, 1.0342574571437583e-05,
+        1.1238778030887361e-05, 1.2229397903147906e-05, 1.3326359478523875e-05,
+        1.454334349869713e-05, 1.589608430397278e-05, 1.7402725941987408e-05,
+        1.9084249011889873e-05, 2.096498432658518e-05, 2.3073233535561665e-05,
+        2.5442022222471796e-05, 2.8110017945294563e-05, 3.112265476832337e-05,
+        3.4533517853226605e-05, 3.840605766957403e-05, 4.281572487577901e-05,
+        4.785264597408176e-05, 5.362499972683663e-05, 6.0263309522631e-05,
+        6.792594410458695e-05, 7.680622886869423e-05, 8.714172796452615e-05,
+        9.922648867531412e-05, 0.00011342738342539632, 0.0001302062070734875,
+        0.00015014999594610006, 0.00017401331994211782, 0.0002027783931916897,
+        0.00023774237107928692, 0.00028064733461260366, 0.00033387958078997474,
+        0.00040078596733188985, 0.00048619751074442175, 0.0005973416227550013,
+        0.0007455369811438177, 0.0009496146554595498, 0.0012436349550740172,
+        0.0016972594011459546, 0.002484378736514361, 0.004246352369516762,
+        0.019665698548888867, 0.007640153844371613, 0.005962399592829648,
+        0.005482127274870969, 0.005386664877002816, 0.005495379918547228,
+        0.005748937059459517, 0.006127906006401491, 0.0066311926583155845,
+        0.007269091202463504, 0.008061310885796164, 0.009037320434994766,
+        0.010238282290569155, 0.011720594805966768, 0.013561538737048882,
+        0.01586806355735571, 0.018790598219036583, 0.02254531207249972,
+        0.027451272082155156, 0.03399526748409558, 0.0429513267449354, 0.055617073287874186,
+        0.07432601248455228, 0.10370600521875536, 0.15438924479022112, 0.25769345742073296,
+        0.5702284482610187, 6.313847138107146, 0.4071254696256903, 0.8917112725721819,
+        1.7737183155179557, 1.0669113406400528, 1.0894218941230518, 1.631411793730598,
+        1.6346168013263542, 0.6533254754488088, 0.5646757017480043, 0.7696042314141937,
+        1.2922284446021706, 2.306395352441572, 1.9220859568134687, 1.2504775596891307,
+        0.9594248432254071, 0.8482254350937367, 0.8648961854379278, 1.0467572606856712,
+        1.2960262646673149, 1.1445634479916298, 0.964796577033112, 0.9146630195983295,
+        0.9583314967930036, 1.0905472188595915, 1.3358427317355968, 1.6838328216401937,
+        1.792068829649226, 1.40251000122698, 1.018705292225905, 0.7976144462956901,
+        0.7033417298909306, 0.7169421352635927, 0.8488809640569369, 1.1218007219447874,
+        1.4598163578930123, 1.5348057655461422, 1.3435098605835685, 1.157010174748327,
+        1.042157022988131, 0.8366903179308738, 0.7384087104269685, 0.6658135457708906,
+        0.5839488984994189, 0.4783485176069125, 0.35965765771498936, 0.2591637887657863,
+        0.20762952980789393, 0.21302349629132908, 0.2537086450421141, 0.30961209813449486,
+        0.3734277947787624, 0.4432455558374277, 0.5171411085962351, 0.5899454580670053,
+        0.6516784653534023, 0.6901148054424697, 0.6982920805623739, 0.6798699497203008,
+        0.6455573316945653, 0.6058295576849679, 0.567364923447234, 0.5333142882101783,
+        0.5046889082897807, 0.48146779803219986, 0.46322667218845515, 0.4494417333510582,
+        0.43961956621701687, 0.43334332132541786, 0.4302806062684947, 0.43017387800347595,
+        0.43282166283497286, 0.43805241062052536, 0.44568878043466936, 0.4554970581382083,
+        0.4671139316506125, 0.4799423434890259, 0.4930139028822303, 0.5048362792042536,
+        0.5132915576486957, 0.5157225942925646, 0.5093795625124357, 0.4922626241377801,
+        0.46402742934386654, 0.4263272307367781, 0.38225454862699365, 0.3352661471068681,
+        0.2883002194605424, 0.24345282741365834, 0.20212712504583663, 0.16542244749742485,
+        0.13460360011808184, 0.11150152985448045, 0.09832823867296304, 0.09603170438312415,
+        0.10248814883224446, 0.11370365199755156, 0.12621803077421753, 0.13784896148361533,
+        0.1474166695622077, 0.1543850862761013, 0.15861525816327562, 0.16020325284422016,
+        0.15937125479013295, 0.1563978424341304, 0.1515801839701349, 0.14522145704012793,
+        0.13763600868236997, 0.12916424721006062, 0.12018907461300284, 0.11114565338875919,
+        0.10251634263656756, 0.09480283246329077, 0.08846946691466762, 0.0838606261876009,
+        0.08111570860646784, 0.08012616887876889, 0.08056837464531, 0.08199729632172362,
+        0.08394876504617493, 0.0860095969140437, 0.08784922278318094, 0.08922642136407723,
+        0.08998549004493658, 0.09004957241269018, 0.08941318439005154, 0.08813331612133682,
+        0.08631816080347195, 0.08411330071308075, 0.08168602903556224, 0.07920885633425738,
+        0.07684316693893138, 0.07472387077305578, 0.07294615017062277, 0.07155601015717869,
+        0.070546723624764, 0.06986267798038372, 0.0694104228702872, 0.06907467299876095,
+        0.0687357876311025, 0.06828540425234243, 0.06763812620746687, 0.06673869075353461,
+        0.06556524497189299, 0.06412995069703294, 0.06247811496427698, 0.06068651720627927,
+        0.05886073842502521, 0.05713029733458714, 0.05563962582167375, 0.05453303411236194,
+        0.053933663962425354, 0.05392014321481672, 0.05450833315936695,
+        0.05564561745818162, 0.057220034597621136, 0.05907966486488689,
+        0.061054377814896095, 0.06297375584929986, 0.06467889673605638,
+        0.06602881370756124, 0.06690336510491227, 0.06720459503373487, 0.06685781829013723,
+        0.06581321241866613, 0.06404829384678179, 0.06157153493341928, 0.058427575744064805,
+        0.05470505369456176, 0.05054903831661324, 0.046181143976011314,
+        0.04192992422536517, 0.03826573207570462, 0.03580326612095817, 0.035184543250106635,
+        0.036802270990134806, 0.04058254469946012, 0.04608941646827893,
+        0.052795423100027945, 0.060245102980589556, 0.06808669986171724,
+        0.07605198230398748, 0.08393086746994519, 0.09155331800253036, 0.098778682755807,
+        0.10549025124210325, 0.11159298186621867, 0.1170128986003514, 0.1216970839626383,
+        0.12561352403656645, 0.12875033835830255, 0.13111418072983394, 0.13272782211788656,
+        0.13362710263465252, 0.13385754651665666, 0.1334709651025365, 0.13252233763988908,
+        0.1310671798915877, 0.12915951169950476, 0.1268504395459153, 0.12418729412919546,
+        0.12121321355054641, 0.11796704104797745, 0.11448340931177006, 0.1107929059190352,
+        0.10692224950968353, 0.10289444652596477, 0.09872893562802276, 0.09444175425460213,
+        0.09004577404540887, 0.08555104736710628, 0.08096528825598459, 0.07629448392965275,
+        0.07154360544158969, 0.0667173659947612, 0.061820967952013466, 0.0568607860596333,
+        0.05184495187982856, 0.04678382738659311, 0.04169037792875082, 0.0365804720840326,
+        0.0314731499311465, 0.026390925453093832, 0.021360272243098007,
+        0.01641277565245852, 0.011589005661168267, 0.006957697724122302,
+        0.002814697258399236, 0.0028205504356493, 0.006526899832734892,
+        0.01025220434806786, 0.013716320195537129, 0.016854273990067534,
+        0.01962973326532548, 0.022016867354096074, 0.023996829059299646,
+        0.02555679964943085, 0.02668962650651032, 0.027393623493058062,
+        0.027672439863805465, 0.027534980261705585, 0.02699536311046105,
+        0.026072890648495953, 0.024791992884456365, 0.02318211175726541,
+        0.021277518701355896, 0.019117118463218022, 0.01674441099159031,
+        0.014208053875113865, 0.01156423334423846, 0.008884751103207826,
+        0.006286604797930064, 0.004061678749994472, 0.0031411892821630286,
+        0.004320691830089747, 0.0064094104240050515, 0.00863558937503297,
+        0.010774519316356427, 0.012737941758700291, 0.014477307315744198,
+        0.015960734358046683, 0.01716616777130603, 0.01807894911136321,
+        0.01869078546746617, 0.01899919236298752, 0.019007098007123507,
+        0.018722508099793183, 0.01815821231413828, 0.01733154780717666,
+        0.01626425530247577, 0.014982493164168498, 0.013517146334822119,
+        0.01190474641576111, 0.010189779142777716, 0.008430396328124472,
+        0.006713034856172449, 0.005190153886543397, 0.004155921471839772,
+        0.004011463486809436, 0.0047845011721206615, 0.006057165001694139,
+        0.007490877810671678, 0.008916520827735459, 0.01024852310870665,
+        0.011437501639540317, 0.01245172482964633, 0.013269776017049291,
+        0.013877437325769936, 0.014266257566231363, 0.014432826963471902,
+        0.01437835314630487, 0.01410836402044927, 0.013632470079192978,
+        0.01296417858129788, 0.01212079760793525, 0.011123522278587282,
+        0.009997892169147683, 0.008775022725938914, 0.007494530164338044,
+        0.006211349556349113, 0.005011501744661805, 0.004044014159218873,
+        0.0035443858818609572, 0.0036990703379085102, 0.0043989030983924236,
+        0.005378387952034133, 0.006446295313438399, 0.007497776751855075,
+        0.0084739835559876, 0.009338659413851183, 0.010067741354271558,
+        0.010644766429354198, 0.011058733174839373, 0.011303036933213518,
+        0.01137489631548343, 0.011275010262655408, 0.01100732248196305,
+        0.010578834700767537, 0.00999944706791937, 0.009281833720569566,
+        0.008441398822804543, 0.0074964267047968654, 0.0064686999062625854,
+        0.0053853011270442895, 0.004283707367282802, 0.0032271387188366535,
+        0.002352643388197527, 0.001963281760030029, 0.0023057476995682036,
+        0.0031105689708057394, 0.004064470832319193, 0.005030109678937642,
+        0.005947951865216119, 0.006786134721470993, 0.007524497786218358,
+        0.008149186249991117, 0.008650605612944775, 0.009022563635031637,
+        0.009261877950287403, 0.009368183698003976, 0.009343838090246068,
+        0.009193884554073859, 0.008926070948881924, 0.008550937952003339,
+        0.008082016130557548, 0.0075362002574141515, 0.006934409959098763,
+        0.0063026856312688164, 0.005673842632401552, 0.005089481203421548,
+        0.004600931644525049, 0.004265004934653536, 0.004128788035579158,
+        0.004206612452967168, 0.004469791498142856, 0.00486206982803965,
+        0.0053235332768626865, 0.005804007791591716, 0.00626555658755777,
+        0.006680527874188886, 0.007029026541212952, 0.007296962151886705,
+        0.007474742444471307, 0.007556436158427923, 0.007539238124246282,
+        0.007423124292561362, 0.007210632772419416, 0.006906743681451032,
+        0.006518861670432028, 0.00605693976899476, 0.0055338354761213, 0.004966082325285277,
+        0.004375425715226934, 0.0037917173098726362, 0.0032577947744903395,
+        0.002835011146785203, 0.0025991638461103734, 0.0026060767728923167,
+        0.0028436081296793797, 0.0032408691671043893, 0.003720331842672947,
+        0.004224310523599342, 0.004714426986576526, 0.005165127213628056,
+        0.005558836137286227, 0.005883163813120385, 0.006129388525845778,
+        0.006291632081565532, 0.006366399122948465, 0.006352308384935292,
+        0.006249927464363782, 0.006061667994167408, 0.005791725587952464,
+        0.005446070618671261, 0.005032521518148721, 0.004560975450859813,
+        0.004043960064184379, 0.0034978708019957555, 0.002945721768812942,
+        0.002423181249562077, 0.0019901916454486746, 0.0017405506542988564,
+        0.0017611819161150052, 0.0020347751091035, 0.002459696341382104,
+        0.0029470785352386517, 0.003443686348734978, 0.003918618137880264,
+        0.004352492148080788, 0.00473212188047335, 0.0050480725922580315,
+        0.005293513765355605, 0.0054636539517902965, 0.0055554454210247125,
+        0.005567417266169566, 0.005499570397205764, 0.005353302418632217,
+        0.005131348060971062, 0.004837732036467914, 0.004477741930012447,
+        0.004057945401736489, 0.0035863116392431805, 0.0030725888193282825,
+        0.002529362012241891, 0.001975150921321169, 0.001444578407972916,
+        0.001024176017285144, 0.000914620545705684, 0.0012045256128462444,
+        0.0016871149134133066, 0.0022212008977955636, 0.0027542558653980277,
+        0.0032627769353155197, 0.003732962301684031, 0.004155127522443925,
+        0.004521858416063889, 0.004827317728559443, 0.005066958343908672,
+        0.005237392965918255, 0.005336325579031194, 0.005362505243162396,
+        0.005315684675574002, 0.005196575567024777, 0.0050067970083412855,
+        0.004748815612835724, 0.004425877138860484, 0.004041930275150958,
+        0.0036015442281297884, 0.003109823629238026, 0.002572329509817029,
+        0.0019950344538650763, 0.0013844399399006433, 0.000748872092470156,
+        0.0001451953254639409, 0.0006141466465435857, 0.001295593142971487,
+        0.001986102937015026, 0.0026769481072093223, 0.0033626871265843837,
+        0.0040387833330340055, 0.004701319914792496, 0.005346942543181295,
+        0.005972838075621026, 0.006576712478332505, 0.007156758522548583,
+        0.007711610912507458, 0.008240289097706051, 0.008742129374616046,
+        0.009216708813385835, 0.009663764255248624, 0.010083110134359433,
+        0.010474559161393605, 0.01083784991732017, 0.011172585128740269,
+        0.011478183837340948, 0.011753849875244539, 0.011998558088586549,
+        0.012211058702968958, 0.012389899193510422, 0.01253346209938831,
+        0.012640016474348356, 0.012707780132740293, 0.012734989545711041,
+        0.012719974151548841, 0.012661231936098354, 0.012557503373259043,
+        0.012407841150611706, 0.012211673504474588, 0.011968859423490017,
+        0.011679734430761047, 0.011345146112156776, 0.01096647901842708,
+        0.010545669037947162, 0.010085207829163476, 0.009588138443408748,
+        0.009058043909616379, 0.008499031378339794, 0.007915715585783014,
+        0.007313207171931681, 0.0066971142630527815, 0.006073570600957174,
+        0.005449312019567984, 0.004831838179210501, 0.004229723075524727,
+        0.0036531819506667473, 0.0031150602279576053, 0.0026324119483119197,
+        0.002228427879724601, 0.0019325864608239623, 0.0017729475880984447,
+        0.0017569643302831296, 0.0018587648094222343, 0.0020335753979949527,
+        0.0022403172629623107, 0.0024502478685227273, 0.0026453827685152293,
+        0.002814954289328788, 0.0029527581047875495, 0.003055534507681752,
+        0.003122027283906325, 0.0031524320335440848, 0.003148062272354171,
+        0.0031111388366074424, 0.0030446515712503706, 0.002952265663140533,
+        0.0028382571627450816, 0.0027074677245116953, 0.0025652690437212512,
+        0.0024175226377462287, 0.0022705091805821894, 0.0021307829779125495,
+        0.0020048864485369675, 0.0018988561372126592, 0.001817504141093933,
+        0.001763597771083446, 0.0017372353554902227, 0.0017357581235961236,
+        0.0017543155518202878, 0.0017868536429575526, 0.001827127564656906,
+        0.001869450791531323, 0.0019091090250941138, 0.0019425096759171498,
+        0.001967172803599787, 0.0019816465324445027, 0.0019853955483663636,
+        0.0019786848915750803, 0.001962465352876374, 0.0019382583132086034,
+        0.0019080337372570906, 0.0018740735604976103, 0.0018388136265978098,
+        0.0018046613262389679, 0.0017737939536235634, 0.0017479540763119202,
+        0.0017282697744768834, 0.0017151335801219528, 0.0017081685386667038,
+        0.001706292108436441, 0.0017078651700156754, 0.0017108949121235225,
+        0.0017132543430152366, 0.0017128875731249333, 0.0017079829087989359,
+        0.0016971085202115374, 0.0016793141363885392, 0.0016542061580592468,
+        0.001622003698631719, 0.0015835804132045186, 0.0015404918942601153,
+        0.0014949804355233911, 0.001449937498475786, 0.0014087904529734494,
+        0.001375270703115167, 0.0013530305297051353, 0.001345125057656639,
+        0.0013534628466035181, 0.0013784031329456166, 0.0014186591344007376,
+        0.00147153600340403, 0.0015333826748542849, 0.0016000812085864749,
+        0.0016674471220729013, 0.0017314987313088448, 0.001788611995040473,
+        0.0018355976793742932, 0.0018697347847623324, 0.001888784030705571,
+        0.0018909960566083851, 0.0018751233007551313, 0.0018404422345897808,
+        0.0017867933366003566, 0.001714649989624951, 0.0016252354246033395,
+        0.001520721182926823, 0.001404564374759541, 0.0012820733042751113,
+        0.001161302970690357, 0.001054231735165784, 0.0009774415418155164,
+        0.0009498985308321974, 0.000985499258966855, 0.001085152022702926,
+        0.0012379075600520853, 0.001428940156047854, 0.0016451830346408897,
+        0.00187666512420078, 0.002115976402227156, 0.002357481807498773,
+        0.002596734878887537, 0.0028301074755121077, 0.003054569057046807,
+        0.003267557776678794, 0.0034669055860293624, 0.0036507944459736753,
+        0.003817730006628257, 0.003966524597425024, 0.004096284584556995,
+        0.004206399065325951, 0.004296528033949043, 0.004366588887758329,
+        0.004416740623375636, 0.004447365403430969, 0.0044590474147363345,
+        0.004452549123941058, 0.004428785188318198, 0.004388794410080334,
+        0.004333710240114104, 0.0042647304444064305, 0.004183086643950954,
+        0.0040900145230876464, 0.0039867255660060216, 0.0038743812181224286,
+        0.0037540703670429537, 0.0036267909874361935, 0.003493436685210115,
+        0.003354788705737781, 0.0032115137395450264, 0.003064167578070278,
+        0.0029132043602886283, 0.002758990835296951, 0.0026018247753751837,
+        0.0024419564406164083, 0.002279611842323567, 0.0021150164958106195,
+        0.0019484183983965056, 0.0017801091105619133, 0.0016104420505455358,
+        0.0014398474323612024, 0.0012688437130823856, 0.0010980460861922145,
+        0.0009281738486613482, 0.0007600616967416783, 0.0005946902509821783,
+        0.0004332928807164881, 0.00027783449875455477, 0.0001346082490635081,
+        7.453107739260777e-05, 0.0001831415269008535, 0.00030868231317243705,
+        0.0004282086857947778, 0.0005384820847751585, 0.0006380906651334011,
+        0.0007260860978578091, 0.0008017464398161321, 0.0008645196305742768,
+        0.0009140101658392221, 0.0009499779492466497, 0.0009723402111179475,
+        0.0009811733010070868, 0.000976713115047514, 0.0009593536899915289,
+        0.0009296438728652541, 0.0008882822305197527, 0.0008361106297182643,
+        0.0007741073235530515, 0.0007033811601151011, 0.0006251702651224356,
+        0.0005408528903739541, 0.0004519903652631586, 0.0003604619877917419,
+        0.0002689076193909643, 0.00018245458976744294, 0.00011682629514674912,
+        0.00011440788080811837, 0.00017405085615192293, 0.0002510696328189288,
+        0.00032915093791842284, 0.0004033304279065223, 0.00047135076579796176,
+        0.0005318355741364523, 0.0005838191199702674, 0.0006265964727008919,
+        0.0006596680532184253, 0.0006827165609625877, 0.0006955959497751796,
+        0.0006983248814292725, 0.0006910816417162708, 0.0006741994050542039,
+        0.0006481617338288834, 0.0006135989883159395, 0.0005712873410592677,
+        0.0005221539192697029, 0.0004672954816166115, 0.00040802713436847055,
+        0.00034600068723513816, 0.0002834947941617448, 0.00022414887304062847,
+        0.00017473977680730106, 0.00014762004192871348, 0.00015461935684411696,
+        0.00019011722664667504, 0.00023917840579727793, 0.00029211105520027345,
+        0.00034409660374467096, 0.0003925644576252007, 0.00043595248794232714,
+        0.0004732159612932666, 0.0005036259520162869, 0.0005266804239946383,
+        0.0005420619266474483, 0.000549615737472245, 0.0005493373784358143,
+        0.0005413646310389221, 0.000525972009720943, 0.0005035672129895695,
+        0.0004746902893870468, 0.00044001776575965, 0.0004003766198056549,
+        0.00035677842020753444, 0.0003104961546100286, 0.0002632345357969515,
+        0.00021750649143869013, 0.00017741182666617707, 0.00014970161508693058,
+        0.0001425328729186258, 0.00015802044562893562, 0.00018910946572424332,
+        0.00022745180577325884, 0.0002676796087897703, 0.0003067371754096656,
+        0.0003427934634360182, 0.00037465793429267684, 0.0004015103585146871,
+        0.0004227752099677984, 0.00043806060931888126, 0.00044712685205934626,
+        0.0004498689601757305, 0.0004463060840685485, 0.000436574409060321,
+        0.0004209221503296211, 0.00039970641110032495, 0.00037339275493366637,
+        0.00034255986767056505, 0.00030791460090540785, 0.0002703291779798713,
+        0.00023092805492419432, 0.00019129162794419126, 0.00015393828818015943,
+        0.0001233575945444845, 0.0001070172173841939, 0.00011143683880708753,
+        0.00013360416252484227, 0.00016501783791969494, 0.00019956772150104806,
+        0.0002339656683234538, 0.00026638659022162404, 0.0002957042713650688,
+        0.00032116110218063996, 0.0003422258538267491, 0.00035852935830131793,
+        0.000369833770050732, 0.0003760170885658932, 0.0003770650111183581,
+        0.0003730666223528645, 0.0003642125403320792, 0.0003507953650565882,
+        0.0003332132762379871, 0.00031197882755115166, 0.0002877368190227585,
+        0.0002612981503392527, 0.00023370119608268032, 0.00020631689512296548,
+        0.00018100611724361173, 0.0001602685627265992, 0.00014709008313291768,
+        0.00014394228427491308, 0.00015116737863257452, 0.00016662145268253397,
+        0.00018714012802192723, 0.00020991630816452974, 0.00023288654998838987,
+        0.00025461085922402787, 0.0002740809494852788, 0.0002905806011337314,
+        0.00030360017087837634, 0.0003127866716078618, 0.0003179146490071118,
+        0.0003188688511460368, 0.00031563364640440933, 0.000308286531800894,
+        0.00029699455256640433, 0.0002820135404460018, 0.00026369118545159894,
+        0.00024247655841964913, 0.00021894158886843855, 0.000193825686680447,
+        0.00016812577259943566, 0.00014327163789904242, 0.00012142710335464521,
+        0.00010578174789893322, 9.997261034556272e-05, 0.00010558242240087156,
+        0.00012040942818842222, 0.00014060005326169643, 0.00016300428344869367,
+        0.0001855641711220581, 0.00020696681603560156, 0.00022633706903170322,
+        0.00024306292467843592, 0.0002567050272586674, 0.00026694993571564597,
+        0.0002735853492580297, 0.0002764864288425403, 0.0002756078320158484,
+        0.0002709787939457077, 0.00026270000850873694, 0.00025094192463032334,
+        0.00023594478540303233, 0.00021802164533518177, 0.00019756722403655377,
+        0.00017507892531318432, 0.00015120450124436348, 0.00012685089407709884,
+        0.0001034360653722139, 8.343383152381904e-05, 7.107252115439423e-05,
+        7.094550805146767e-05, 8.282198012777927e-05, 0.0001018597769227678,
+        0.00012381592163608916, 0.0001462659584050435, 0.0001678552135967093,
+        0.00018774829226187803, 0.00020537643847569212, 0.00022032730303738287,
+        0.00023229515336698945, 0.0002410572034776676, 0.0002464617003617292,
+        0.0002484214635310603, 0.0002469099650073882, 0.0002419585584522463,
+        0.00023365421193026012, 0.00022213752660957728, 0.00020760116205414316,
+        0.00019028922150461327, 0.00017049897861153398, 0.00014858832236148257,
+        0.00012499789676208455, 0.00010031511194735552, 7.54770740439736e-05,
+        5.2523656507718826e-05, 3.743038663158883e-05, 4.1075303887575235e-05,
+        5.9914076160573436e-05, 8.362281961014647e-05, 0.00010816523062846991,
+        0.00013207813507227887, 0.00015462120883330858, 0.00017530873062845368,
+        0.000193774694454395, 0.00020972708155094795, 0.00022293047088728417,
+        0.0002331988917532811, 0.00024039263787726704, 0.0002444165801947094,
+        0.00024521891799487777, 0.00024278988222685915, 0.00023716016369155102,
+        0.00022839896780955327, 0.0002166116705343707, 0.00020193710094862588,
+        0.00018454452756186087], [7.345136404075258e-10, 2.2060059788008042e-09,
+        3.6849085076438406e-09, 5.17621060471466e-09, 6.684975841430256e-09,
+        8.216372968231164e-09, 9.775707152168043e-09, 1.1368453071484697e-08,
+        1.300028918011284e-08, 1.4677133954934822e-08, 1.6405184340183188e-08,
+        1.8190956835604997e-08, 2.0041331439301217e-08, 2.1963599201182258e-08,
+        2.3965513562990548e-08, 2.6055346283133156e-08, 2.8241948388153684e-08,
+        3.0534816882076907e-08, 3.294416801282466e-08, 3.548101778539788e-08,
+        3.8157270926179185e-08, 4.098581905970981e-08, 4.3980649545152674e-08,
+        4.715696622367078e-08, 5.053132362993199e-08, 5.412177638863349e-08,
+        5.794804589828798e-08, 6.203170638209503e-08, 6.63963930716473e-08,
+        7.106803524535966e-08, 7.607511778408859e-08, 8.144897472743252e-08,
+        8.722411957363166e-08, 9.343861713189603e-08, 1.0013450295167723e-07,
+        1.0735825683236522e-07, 1.1516133834734017e-07, 1.2360079307930527e-07,
+        1.3273994015517644e-07, 1.4264915272724408e-07, 1.5340674560511723e-07,
+        1.6509998580509753e-07, 1.7782624513620677e-07, 1.9169431634228835e-07,
+        2.068259187768906e-07, 2.2335742281273436e-07, 2.4144182910439447e-07,
+        2.612510423568703e-07, 2.829784896380033e-07, 3.068421387362793e-07,
+        3.3308798490024093e-07, 3.619940853518879e-07, 3.938752356454267e-07,
+        4.290884007039421e-07, 4.680390337973124e-07, 5.111884425506648e-07,
+        5.590623937021056e-07, 6.12261183690168e-07, 6.714714511078182e-07,
+        7.374800609077347e-07, 8.111904599204442e-07, 8.936419876249965e-07,
+        9.86032728946668e-07, 1.0897466235001486e-06, 1.2063857034516087e-06,
+        1.3378085283327966e-06, 1.486176126987037e-06, 1.6540070616841371e-06,
+        1.8442436108379312e-06, 2.0603315427469487e-06, 2.30631655795059e-06,
+        2.586961241915645e-06, 2.9078873434702914e-06, 3.275749429556033e-06,
+        3.698447565210298e-06, 4.1853887073569045e-06, 4.7478091615265955e-06,
+        5.399173880286322e-06, 6.155672886469769e-06, 7.036841015313622e-06,
+        8.066334943189194e-06, 9.272911830336268e-06, 1.069166771130927e-05,
+        1.2365612308564858e-05, 1.4347682044165459e-05, 1.6703327157235526e-05,
+        1.9513855675508633e-05, 2.2880781657266448e-05, 2.6931515183922568e-05,
+        3.182685815174488e-05, 3.7770949024424116e-05, 4.5024556236046224e-05,
+        5.392299034450833e-05, 6.490044625783963e-05, 7.852338646832594e-05,
+        9.553677289322509e-05, 0.00011692876860145463, 0.00014402232208725815,
+        0.00017860640689886287, 0.0002231266216502959, 0.00028096608103229286,
+        0.00035686608652748365, 0.000457567447692103, 0.0005928077589348299,
+        0.0007769070579761011, 0.0010313532406269741, 0.0013891405816052465,
+        0.0019022964033350404, 0.002655458425094267, 0.003791534418658206,
+        0.005563025720788434, 0.008442222460832576, 0.01338049133716538,
+        0.02249877487624705, 0.04128605245798222, 0.08792274024294651, 0.2634580890945831,
+        4.477768134293034, 0.6147513926910632, 0.7317501265953654, 0.13331182071990746,
+        0.28788852193431436, 0.675804449645004, 1.868471024561326, 3.388327194665842,
+        2.217194130994581, 2.310753856187241, 4.07453278635917, 7.761162713971286,
+        5.942430368496039, 3.1127852830043463, 1.4605980680983255, 0.9701672809918545,
+        0.9548154232754253, 1.256570628015828, 1.9343668154443803, 2.6979679425075567,
+        2.335651035882205, 1.7803371561423924, 1.4880187540952898, 1.3753280840118767,
+        1.3947515325501056, 1.5454612585152887, 1.7993667123704902, 1.8250193642201744,
+        1.4254474614605153, 1.0949019961671675, 0.9534021181211368, 0.9482422038909971,
+        1.0531167346389931, 1.2777480432977584, 1.641891913345645, 2.0187957402567918,
+        1.9849726459982042, 1.6239456250510007, 1.3115081660879937, 1.112309906570387,
+        0.8233723283164813, 0.6895455858486914, 0.5995710522167755, 0.5218221048549431,
+        0.44996404106522525, 0.39476495265332123, 0.36872609362793196, 0.37009463333064824,
+        0.3892526780763166, 0.4192964470996836, 0.4574722402975289, 0.5030776454050735,
+        0.555496530980094, 0.6123961031527145, 0.6678194486713916, 0.7113431552836983,
+        0.7312407146510537, 0.7220209331598765, 0.6889026694189537, 0.6433075559700947,
+        0.5955091967839203, 0.5515494798865419, 0.5139094380355292, 0.4830607863409606,
+        0.45859501227263144, 0.4398253942984636, 0.4260577906612822, 0.4166942166172203,
+        0.4112608600379457, 0.4094043855026514, 0.41087547711066613, 0.415506484872527,
+        0.42318387643417466, 0.43381230555640976, 0.44726378003191675, 0.46330221353044926,
+        0.48147176034490113, 0.5009410868135231, 0.5203149296162802, 0.5374734652364964,
+        0.5495822150574408, 0.5534757462003018, 0.5465089015830497, 0.527585738371153,
+        0.4977003928204118, 0.459530514247898, 0.4163729348662099, 0.3711488094502392,
+        0.3259261005477205, 0.2819244384425042, 0.2397644521031215, 0.19977830294971002,
+        0.16231989614049336, 0.12811845058296065, 0.09882274321452252, 0.07785067536200979,
+        0.07011604345716609, 0.07669023509354857, 0.09186952244590946, 0.10975428099535377,
+        0.12717741216473935, 0.14270841228104003, 0.155740923969518, 0.16605529495229782,
+        0.17361029743469278, 0.17843807186116145, 0.18059394751193097, 0.18014039738239263,
+        0.1771530232089468, 0.1717387630876474, 0.16405707073456777, 0.1543359256527228,
+        0.14287755898025414, 0.13005387205373747, 0.11629749425827947, 0.10209966158889491,
+        0.08802992770004142, 0.07479472495692115, 0.06334227543410739, 0.05494795992304371,
+        0.05098326921919014, 0.052040142516117514, 0.05724624654232217,
+        0.064933486424941, 0.07362125146771666, 0.08230170424170027, 0.09034099336860227,
+        0.09734796589932221, 0.10308751346760725, 0.10742805327701102, 0.11030768561967953,
+        0.11171093917899133, 0.11165301640265808, 0.11017049106349563, 0.10731775493363716,
+        0.10316816924218201, 0.09781846937067795, 0.09139488325947771, 0.08405993151845198,
+        0.07602019916875549, 0.0675376843432339, 0.05895073204618535, 0.050714216560691916,
+        0.04346536615524596, 0.03807836276761331, 0.035527278557242525,
+        0.036333029589520165, 0.04006515680454698, 0.04569467875279033,
+        0.052244350968303474, 0.059019151029617786, 0.06555983259824763,
+        0.07155913961009126, 0.07680569962565913, 0.08115278963643022, 0.08450108841325428,
+        0.08678815750549394, 0.08798095796648162, 0.08806990419406396, 0.08706411036224494,
+        0.08498797036716964, 0.08187930602533308, 0.07778923795836476, 0.0727838653198965,
+        0.06694797366933623, 0.060391598333650424, 0.05326191440525328,
+        0.04576698660474603, 0.038227803176253954, 0.031196259945310424,
+        0.025686711453057065, 0.02330497734138619, 0.025233236113296125,
+        0.03075095104056873, 0.03829660118778019, 0.046785695603566886,
+        0.05563042180829718, 0.06450179476495267, 0.07319397880949711, 0.08156269932466123,
+        0.08949736076668108, 0.09690805462627039, 0.10371958407531635, 0.10986908925861213,
+        0.11530563611658012, 0.11999084807741135, 0.12389995382163703, 0.12702276156188774,
+        0.12936417096357944, 0.13094394972612988, 0.13179564569979715, 0.131964663150942,
+        0.1315056755096378, 0.13047964790524635, 0.1289507834199039, 0.1269836861873946,
+        0.1246409663276923, 0.12198141865588881, 0.11905881190438154, 0.11592124509925941,
+        0.11261097208592816, 0.10916456629889694, 0.10561329318020948, 0.10198357217116331,
+        0.09829743807890527, 0.09457294671299935, 0.09082450609417396, 0.08706314629319335,
+        0.08329676321101939, 0.07953038096517343, 0.07576647334778572, 0.07200536924170681,
+        0.06824574499636706, 0.06448518467162152, 0.06072077290346432, 0.05694967883990751,
+        0.053169694313832484, 0.04937970309441347, 0.04558007671461089,
+        0.04177301146339394, 0.03796283736619872, 0.03415634362882513, 0.0303631819009016,
+        0.026596445661345537, 0.02287362217275454, 0.01921838244976197,
+        0.015664443352837416, 0.01226512796199896, 0.009120526165075386,
+        0.006463472050118534, 0.004883873153942442, 0.0051560632974818835,
+        0.006837925023313982, 0.00899255918800828, 0.011191508964918098,
+        0.013274883623638857, 0.015172571768896656, 0.01684805800518084,
+        0.018280169498062982, 0.01945628527417986, 0.020369499618342675,
+        0.021017352707417048, 0.021401258762058836, 0.02152626424392426,
+        0.021400954716551512, 0.0210374110414011, 0.02045116462567978, 0.019661141928157835,
+        0.018689627928058457, 0.017562318907309922, 0.016308579043991682,
+        0.014962068113536913, 0.013561974091786926, 0.012155149603645119,
+        0.010799404548538437, 0.00956762000709617, 0.008550071582247253,
+        0.007847073672990207, 0.0075405191321994, 0.007650099931568992,
+        0.008114955944132893, 0.008825577398696233, 0.009670151676184015,
+        0.010558604534176293, 0.011425489401633664, 0.012225024850292553,
+        0.012925600614801991, 0.013505692462872925, 0.013951163940264797,
+        0.014253553960494186, 0.014409003899156088, 0.014417588902461266,
+        0.014282903471436426, 0.01401180818473961, 0.013614283373013117,
+        0.013103365291752198, 0.012495165154727537, 0.011808991393929515,
+        0.011067605921064693, 0.010297632566918336, 0.009530069453550475,
+        0.008800676712322923, 0.008149636357485768, 0.007619329483053118,
+        0.0072488197442033666, 0.007064903951193259, 0.00707309306603357,
+        0.0072545665022907165, 0.007571933507567087, 0.007979798898306953,
+        0.008433910700173634, 0.008896092098478104, 0.00933566756698321,
+        0.009729068287691923, 0.010058830384074676, 0.010312568296037909,
+        0.010482122753697554, 0.010562913962083734, 0.010553473451348007,
+        0.010455116684983501, 0.010271722526861744, 0.01000959349700218,
+        0.009677378549654723, 0.009286046129512, 0.008848897060073671, 0.00838159956884485,
+        0.007902203925807576, 0.007431039706638149, 0.006990305543597177,
+        0.006603047170991934, 0.00629117805614516, 0.006072428863375013,
+        0.0059567854872350934, 0.005943811851383046, 0.006022362788453524,
+        0.006173020760606141, 0.00637204258117237, 0.006595113739022907,
+        0.006819908409783868, 0.007027370996555769, 0.007202101666396527,
+        0.007332266871160656, 0.007409325070295178, 0.0074277253367438095,
+        0.007384651165587029, 0.007279838324361864, 0.007115477797043683,
+        0.006896210185177853, 0.006629218361873971, 0.006324424285748302,
+        0.005994784226480605, 0.0056566357871545994, 0.005329947284283269,
+        0.005038117818029758, 0.004806699810223628, 0.004660321888913638,
+        0.004617761797510564, 0.0046868198001689294, 0.004861960435951255,
+        0.005126368334844603, 0.005456900060698879, 0.005828981671346529,
+        0.006219734660339237, 0.006609312821688646, 0.0069811390946437546,
+        0.007321662930668169, 0.0076199907686579985, 0.007867539432593565,
+        0.00805775635911844, 0.00818590704752394, 0.008248917165390293,
+        0.008245256276717133, 0.008174853769812647, 0.008039041869010706,
+        0.00784052456810201, 0.007583374915622293, 0.007273066728329956,
+        0.006916550975976138, 0.00652239181892536, 0.006100981234651454,
+        0.005664849226861162, 0.005229064671017838, 0.004811647552078153,
+        0.004433729372527203, 0.004118858781795163, 0.003890503617389715,
+        0.0037671304185128815, 0.0037561519387962323, 0.003850481271187251,
+        0.004030645951316729, 0.004270916148934338, 0.0045452818090802784,
+        0.004830878924585512, 0.0051090608579037345, 0.005365215055515442,
+        0.005588164366948398, 0.005769553064755834, 0.005903347347819809,
+        0.005985464204685741, 0.006013506614987897, 0.005986579066229132,
+        0.00590516335587633, 0.005771042514606217, 0.005587268167722417,
+        0.005358173697158442, 0.005089442810996933, 0.004788251044332812,
+        0.004463505360742612, 0.004126208852619598, 0.0037899553415393374,
+        0.003471465326481967, 0.0031908188660525754, 0.002970550146647127,
+        0.0028323429666781844, 0.002790931325099475, 0.002847964302063012,
+        0.002990827506034121, 0.0031976920777172795, 0.003444444284095424,
+        0.0037092699708344244, 0.003974279638983788, 0.004225440299887396,
+        0.004451943141968755, 0.004645544817625664, 0.004800045705370957,
+        0.004910916240244479, 0.00497503994389144, 0.004990539238340772,
+        0.0049566583016391365, 0.004873686445621877, 0.004742913513886475,
+        0.004566615867064183, 0.0043480788051664995, 0.004091670577186248,
+        0.0038029971630553386, 0.003489189813524121, 0.0031594135286049456,
+        0.0028257321958504588, 0.002504481071716145, 0.0022180680734999693,
+        0.0019960093060159357, 0.0018713159383056959, 0.001867611200141697,
+        0.0019836849863320125, 0.0021940203768391195, 0.0024647202135414724,
+        0.0027661418218135696, 0.003076159057653935, 0.0033789234090305614,
+        0.003662964666480001, 0.0039197644450062324, 0.004142851500101491,
+        0.004327256428952047, 0.004469185065346386, 0.004565819620071531,
+        0.004615193372091902, 0.004616107376650123, 0.004568071028567734,
+        0.004471256291453541, 0.004326460425400992, 0.004135075652975558,
+        0.0038990675757183757, 0.0036209687031503943, 0.0033039018337403885,
+        0.0029516666698416088, 0.0025689701199917456, 0.002162014285108524,
+        0.0017400877182586153, 0.0013204156134758531, 0.000945058592667934,
+        0.0007319531402882535, 0.0008460097421802134, 0.0012091800494640915,
+        0.0016698899486163254, 0.002166499288671254, 0.002676309813561964,
+        0.003188736027201431, 0.0036976263901092776, 0.0041988454710492965,
+        0.004689386019279753, 0.005166994492968612, 0.005629990198260598,
+        0.006077162835463533, 0.006507702130576761, 0.006921139342765578,
+        0.00731729145344868, 0.007696204005977061, 0.008058091269978605,
+        0.008403273989481883, 0.008732115983845812, 0.00904496152245316,
+        0.00934207577769129, 0.009623590796821251, 0.00988945933982763,
+        0.010139418626483538, 0.010372965556273572, 0.010589344363247715,
+        0.010787547006404951, 0.010966325940765529, 0.011124218325749651,
+        0.01125958024936177, 0.011370629206370083, 0.011455492871552108,
+        0.011512262145487505, 0.011539046498068951, 0.011534029765465347,
+        0.011495524743075044, 0.011422025134748218, 0.011312253649606615,
+        0.011165205269563811, 0.010980184936803966, 0.010756839127428355,
+        0.010495180985103944, 0.010195608888065026, 0.009858918515783728,
+        0.009486308672970086, 0.009079381326185479, 0.008640136527223445,
+        0.008170963165819415, 0.007674626864349893, 0.007154256890393894,
+        0.006613334904105511, 0.0060556900242963235, 0.00548550781874493,
+        0.004907366969269539, 0.004326330097053627, 0.003748143181396535,
+        0.0031796631517175314, 0.002629794589165643, 0.0021116329918500197,
+        0.0016475341744826347, 0.0012801519250043218, 0.0010832005352348893,
+        0.001116120242433583, 0.0013316447241079942, 0.0016327687588067528,
+        0.001956936198940139, 0.002273644974642943, 0.002567727236151319,
+        0.00283092343600436, 0.003058376293329132, 0.00324713312891983,
+        0.0033954595727076833, 0.003502500435158053, 0.0035680991892226045,
+        0.00359269438225962, 0.0035772554753963075, 0.0035232402551315404,
+        0.0034325654884503755, 0.0033075877589324367, 0.003151095102215421,
+        0.002966313711987115, 0.002756939034878721, 0.002527209082725222,
+        0.00228205352111394, 0.002027382174367346, 0.0017706329437659522,
+        0.001521790241408245, 0.0012951421566919459, 0.0011115592799723077,
+        0.0009983079372946505, 0.0009784836449312382, 0.0010516758052687154,
+        0.0011926751558282674, 0.0013711832273586918, 0.0015643320319378973,
+        0.0017572553608380822, 0.0019404165150555047, 0.0021074829519974313,
+        0.0022540844931258517, 0.0023771362316092636, 0.00247446902902971,
+        0.0025446225752740657, 0.0025867252178464065, 0.0026004212807659213,
+        0.0025858253908315624, 0.0025434932768319722, 0.0024744041829490157,
+        0.002379953836930953, 0.0022619602892918725, 0.0021226891394700415,
+        0.0019649113474676967, 0.0017920188905466343, 0.0016082464124028033,
+        0.0014190901036074156, 0.0012320871791744392, 0.0010581819816485529,
+        0.0009136284647402553, 0.0008205090675959219, 0.0007998488725953804,
+        0.0008560428251618962, 0.0009721893784548749, 0.0011243734322099327,
+        0.0012933467498820665, 0.0014661697168449417, 0.0016343242782859125,
+        0.0017919777093202665, 0.0019349294250422216, 0.002060031063363695,
+        0.002164871066912556, 0.0022476003645484745, 0.002306833487498003,
+        0.0023415907393985404, 0.002351263271393355, 0.0023355914583459494,
+        0.0022946517218838678, 0.002228849923316148, 0.002138921825963313,
+        0.0020259438366431034, 0.0018913615095111865, 0.0017370515020848083,
+        0.0015654503033839778, 0.0013798240246424198, 0.0011848550520470636,
+        0.0009879823093715367, 0.0008025560730073951, 0.0006545307232358604,
+        0.0005881781057018802, 0.0006398260121554611, 0.000791623440245015,
+        0.0010004528107965215, 0.0012370177238383371, 0.00148589103392851,
+        0.0017385684463807182, 0.0019897459072906335, 0.002235704948878503,
+        0.002473605793134771, 0.0027011611484832176, 0.002916477271165205,
+        0.003117972758375803, 0.0033043351957373714, 0.0034744967729933005,
+        0.0036276194043798845, 0.0037630843737721156, 0.003880483775680179,
+        0.0039796122125617785, 0.004060457866768705, 0.004123192448138705,
+        0.004168159750943729, 0.004195862703029342, 0.004206948891571615,
+        0.004202194622866035, 0.0041824876303284434, 0.004148808592223085,
+        0.004102211663024321, 0.0040438042629527965, 0.003974726411179041,
+        0.0038961299300892707, 0.0038091578913618395, 0.0037149247175372164,
+        0.0036144973926602346, 0.003508878267559227, 0.0033989899636964324,
+        0.003285662876106359, 0.0031696257444759294, 0.0030514996941852094,
+        0.0029317960438499007, 0.00281091803233365, 0.002689166443394066,
+        0.002566748911684033, 0.0024437924975101366, 0.0023203589382962916,
+        0.002196461843610035, 0.002072085012246992, 0.0019472010265034693,
+        0.0018217893231765407, 0.0016958530501193416, 0.0015694341866470426,
+        0.0014426266318008055, 0.001315587255759341, 0.0011885453069223194,
+        0.0010618111766699588, 0.0009357866215035563, 0.0008109808255677214,
+        0.0006880420798952115, 0.000567829154607075, 0.00045158933643203253,
+        0.0003414580509128056, 0.0002420802970232397, 0.0001663360645729246,
+        0.00014506140399294726, 0.00018864095657667132, 0.00026044227474994084,
+        0.00033775970420569536, 0.0004129397520499172, 0.0004830225584477576,
+        0.0005465604122024927, 0.0006027117333416912, 0.0006509403887729793,
+        0.000690900843729596, 0.0007223893369486897, 0.0007453213094356945,
+        0.0007597201285335042, 0.0007657109238545668, 0.000763516832364796,
+        0.0007534564961523231, 0.000735942450010028, 0.0007114805483818005,
+        0.000680671039747997, 0.0006442124571200213, 0.0006029103217249725,
+        0.0005576939828590693, 0.0005096470616174601, 0.00046006023541631007,
+        0.0004105190581280902, 0.000363039913332914, 0.00032024591916526813,
+        0.0002854790087532086, 0.00026250793508431465, 0.00025433556222036034,
+        0.00026143155548252777, 0.00028120630168969785, 0.00030949286333913453,
+        0.00034229414435823065, 0.0003765143069967038, 0.0004099468134048776,
+        0.0004410514925647865, 0.00046875191745501945, 0.0004922961512860936,
+        0.0005111689040736525, 0.0005250372731948858, 0.0005337170155096878,
+        0.0005371512072254147, 0.0005353965070613196, 0.0005286143275307475,
+        0.0005170655153200658, 0.0005011079940375084, 0.00048119744999905516,
+        0.0004578916679063086, 0.0004318595833867506, 0.0004038964014268365,
+        0.0003749457877018121, 0.00034612796817374024, 0.00031876592061371513,
+        0.0002943864856719729, 0.00027464767172152713, 0.0002611254645346274,
+        0.00025494055865515577, 0.0002563633393523832, 0.00026467110683195253,
+        0.0002783908497701974, 0.0002957436915515996, 0.0003150146082058009,
+        0.00033473736100857226, 0.00035373717135980587, 0.00037110605706171826,
+        0.0003861596342691948, 0.0003983965039592707, 0.00040746619792370286,
+        0.00041314564421426984, 0.00041532244065770247, 0.00041398318192864206,
+        0.0004092055070577207, 0.0004011530062009511, 0.0003900725311155229,
+        0.0003762937707686064, 0.00036023116631147265, 0.00034238828567977053,
+        0.00032336448464517737, 0.00030386267253304267, 0.00028469460497826464,
+        0.00026677549431576147, 0.00025109281796386614, 0.0002386286523791776,
+        0.00023022175604794627, 0.00022638907610208556, 0.00022717783997752816,
+        0.00023213598819617535, 0.00024042620898390946, 0.00025101774317865086,
+        0.0002628630280998642, 0.0002750096913100283, 0.0002866493840928625,
+        0.0002971264704969778, 0.00030592803441700724, 0.00031266826915102693,
+        0.00031707338683444926, 0.00031896924853147096, 0.0003182721340034975,
+        0.00031498245325964824, 0.00030918112192901556, 0.00030102845753337545,
+        0.00029076564876024584, 0.00027871900528691004, 0.0002653071761017938,
+        0.0002510510501626277, 0.00023658455751179107, 0.00022266111779375937,
+        0.00021014408290479859, 0.00019996126116669002, 0.0001930012290815239,
+        0.00018994932673664766, 0.00019111231783993822, 0.0001963250291424948,
+        0.00020500172259794807, 0.0002162979984871521, 0.00022928884078852953,
+        0.00024309440689482893, 0.0002569416851442326, 0.00027018150490447644,
+        0.0002822833341261941, 0.00029282244536561985, 0.0003014665207949835,
+        0.00030796429990613577, 0.0003121367891117453, 0.00031387077611613593,
+        0.0003131142138298878, 0.0003098730979816312, 0.00030420960256618255,
+        0.00029624140055389006, 0.0002861422691010666, 0.0002741442580473857,
+        0.00026054187962269536, 0.0002456989109064173, 0.00023005834234567318,
+        0.00021415537234556963, 0.00019863128451104206, 0.0001842410308025887,
+        0.00017183790882201365, 0.00016230743883380232, 0.00015642470385634756,
+        0.00015465236345212264, 0.0001569748965728555, 0.00016288772014293364,
+        0.00017155502818275343, 0.00018202603254780254, 0.0001933977502067418,
+        0.0002048929145405034, 0.00021587725187663124, 0.00022584829229976632,
+        0.00023441607768378758, 0.0002412847968137453, 0.00024623810086954934,
+        0.0002491282380708252, 0.0002498683494372467, 0.00024842720265319524,
+        0.0002448258178242879, 0.00023913567394119332, 0.0002314784275410425,
+        0.0002220273262873936, 0.00021101077555802609, 0.0001987188182137587,
+        0.00018551355376642445, 0.0001718444885208272, 0.0001582686783751885,
+        0.0001454713640188369, 0.00013427215237888848, 0.00012558281986327957,
+        0.0001202693718470677, 0.00011891020592603878, 0.00012156302044091734,
+        0.0001277265500313873, 0.00013653670956615828, 0.000147032745138784,
+        0.0001583362068811727, 0.0001697178550650274, 0.00018059836001803767,
+        0.00019052550810362307, 0.00019914917592698107, 0.00020620102934595718,
+        0.0002114797857418055, 0.00021484102077072727, 0.00021619027519980633,
+        0.00021547846846435326, 0.00021269894959437095, 0.00020788580826212172,
+        0.0002011133288349408, 0.00019249673527381406, 0.0001821947038967068,
+        0.00017041460406865225, 0.0001574222024313319, 0.0001435588249805237,
+        0.00012927082824509823, 0.0001151579788274491, 0.00010204441202201662,
+        9.10511197501686e-05, 8.356646443813687e-05, 8.089828355944285e-05,
+        8.358273736651385e-05, 9.099345801003983e-05, 0.00010177771354000974,
+        0.00011454317854892105, 0.00012818264321100888, 0.00014189013971386506,
+        0.00015508415216869488, 0.00016733560551584627, 0.00017831902583452644,
+        0.0001877824627700699, 0.00019552944402639554, 0.00020140811030337362,
+        0.0002053045376314338, 0.00020713848361523973, 0.00020686052983175904,
+        0.0002044500240663283, 0.0001999134847530225, 0.00019328329671713932,
+        0.00018461665407865202, 0.00017399483586754184, 0.0001615230885289822,
+        0.0001473317479559879, 0.00013158003790662652, 0.00011446602018866133,
+        9.625199243211972e-05], [1.9707275566951233e-09, 5.919536759397741e-09,
+        9.890458440659044e-09, 1.3898399603534291e-08, 1.7958516656105468e-08,
+        2.2086319752161617e-08, 2.6297778894873193e-08, 3.0609436465532265e-08,
+        3.5038524699025104e-08, 3.960309069932662e-08, 4.432213001968179e-08,
+        4.9215730511938205e-08, 5.4305227565300556e-08, 5.961337341697604e-08,
+        6.516452171549246e-08, 7.098483032393159e-08, 7.710248448959343e-08,
+        8.354794344068433e-08, 9.035421382616206e-08, 9.75571532929598e-08,
+        1.0519580916556354e-07, 1.1331279620193691e-07, 1.219547196439491e-07,
+        1.3117264958929798e-07, 1.4102265399271292e-07, 1.5156639858334006e-07,
+        1.628718236824443e-07, 1.750139085310224e-07, 1.88075536569507e-07,
+        2.021484759578252e-07, 2.1733449358132445e-07, 2.3374662163538677e-07,
+        2.515106013160478e-07, 2.707665303310129e-07, 2.9167074701880215e-07,
+        3.1439798819074596e-07, 3.3914386567332634e-07, 3.661277130626382e-07,
+        3.9559586517797645e-07, 4.2782544216545293e-07, 4.6312872580930475e-07,
+        5.018582297301565e-07, 5.444125871618182e-07, 5.912434015395511e-07,
+        6.428632367166172e-07, 6.998549551837274e-07, 7.628826618284653e-07,
+        8.327045548895352e-07, 9.101880615793074e-07, 9.963277051492473e-07,
+        1.092266258402013e-06, 1.1993198579432604e-06, 1.3190079074296481e-06,
+        1.4530887954112593e-06, 1.6036026938225657e-06, 1.7729230117177587e-06,
+        1.963818476724291e-06, 2.1795283084994287e-06, 2.423853604273655e-06,
+        2.7012688806032946e-06, 3.017058802638585e-06, 3.37748655104776e-06,
+        3.7900021426704266e-06, 4.263501501854617e-06, 4.808650398780097e-06,
+        5.438291852826243e-06, 6.1679616915825386e-06, 7.016545349000742e-06,
+        8.007120650572039e-06, 9.168047717750706e-06, 1.0534390480912527e-05,
+        1.2149788004976028e-05, 1.4068943275619613e-05, 1.6360970768934093e-05,
+        1.9113956145886345e-05, 2.2441255061533086e-05, 2.6490333986942044e-05,
+        3.1455405638533555e-05, 3.7595867490712566e-05, 4.52638666965462e-05,
+        5.4946694904186574e-05, 6.733423209596724e-05, 8.343071232721042e-05,
+        0.00010474948811475369, 0.00013367460244695375, 0.00017418935269225395,
+        0.0002335153834038003, 0.0003264253546692037, 0.0004897145438825511,
+        0.0008584598830882011, 0.00408033042104024, 0.0016281280599403048,
+        0.0013060006518568622, 0.0012352680783726635, 0.001249672969228262,
+        0.0013138201107128252, 0.0014177857234605334, 0.001560529365244749,
+        0.0017457131323468376, 0.001980635109579534, 0.0022763419995156984,
+        0.002648455366537384, 0.0031186911854362677, 0.003717287758917499,
+        0.004486798739828817, 0.005488077759582035, 0.006809940690847638,
+        0.008585256228918712, 0.011018783407491399, 0.014437618150288652,
+        0.019387974428662642, 0.026834650921826443, 0.03861218712542913,
+        0.058582350628526896, 0.09619680204237482, 0.18117874727718503,
+        0.4717091712309205, 6.765692770159037, 0.7452647885683332, 0.7378022226123298,
+        0.9094563926437228, 0.7448845713964546, 1.0054529705656348, 1.9856261048260957,
+        2.64347147141612, 1.2300275614390774, 0.8335246838357708, 0.7346133601016925,
+        0.8591431729118385, 1.3041303068077954, 1.1486292043676796, 0.8915231551133082,
+        0.8511667610443825, 0.944300791172329, 1.1881906038525016, 1.6661194951135063,
+        2.111470165423827, 1.673610695288305, 1.1783391064174453, 0.9187222125282914,
+        0.8036507554041247, 0.7909986390997508, 0.887310314965107, 1.1072868992634959,
+        1.2682609359324688, 1.1412907139537851, 0.9878945977238816, 0.9234232240323745,
+        0.9384286781141297, 1.0283336520820203, 1.207029268585827, 1.486328617266613,
+        1.7444605352650833, 1.6354170501364287, 1.2763192458039143, 0.9856208965552121,
+        0.8047912633606292, 0.5582283748932053, 0.4562941206300746, 0.4094810154292067,
+        0.39837871896408966, 0.4110781392248153, 0.43077285926148645, 0.4463338417344302,
+        0.45765120153433897, 0.4690488951969538, 0.4841893377277139, 0.5052114793741473,
+        0.5330302067463305, 0.567261121814008, 0.6054378031661084, 0.641763036155744,
+        0.6667778098421592, 0.6705692541714317, 0.6494276932448745, 0.609126649552781,
+        0.5602606394871708, 0.5117265788129578, 0.4683680266599284, 0.4318647882324478,
+        0.4022207950848226, 0.3787746774533994, 0.36071020154235167, 0.3472703927876407,
+        0.3378290735957925, 0.33190158501246714, 0.3291322545114102, 0.3292741474272721,
+        0.33216637514227965, 0.33770920554898776, 0.34583413012109976, 0.35646337100487896,
+        0.36945061794652073, 0.3844928860416345, 0.4010055794460525, 0.41796691716065937,
+        0.433775984143277, 0.44623524171699525, 0.4528231352978341, 0.4513476163087754,
+        0.4407732172713633, 0.4216992480942443, 0.3960978375426305, 0.36650382612331006,
+        0.33522056664381883, 0.3039120570681847, 0.2735729551215745, 0.24469496677915079,
+        0.2174779065311355, 0.19201582544367932, 0.16844263872164852, 0.14703978184882416,
+        0.12830240768102397, 0.11293636853253919, 0.10172231556408166, 0.0951916840129224,
+        0.09323453705175039, 0.09499572834009463, 0.09921777614619016, 0.1046968306258083,
+        0.11051705477676411, 0.11606312979562729, 0.12094379050883916, 0.12491218373625944,
+        0.1278107874740455, 0.12954213117314975, 0.13005857649853558, 0.12936288638046342,
+        0.1275117819924035, 0.12461637864515197, 0.12083623248292684, 0.11636707891707054,
+        0.11142499385455872, 0.10623066368827384, 0.10099660633829773, 0.09591830481334844,
+        0.09116834629717352, 0.08689160883554382, 0.08319969201477018, 0.08016412894929814,
+        0.07780992827582191, 0.0761125683906835, 0.07500141961182129, 0.07437033290934297,
+        0.07409307148534403, 0.07403941657559633, 0.07408818117926588, 0.07413533084988934,
+        0.07409749540830805, 0.07391238462434369, 0.0735378486058505, 0.07295088725240445,
+        0.0721472161727081, 0.07114132054080394, 0.06996642994777408, 0.06867360702736537,
+        0.06732919039388278, 0.06601014240919038, 0.06479733959965202, 0.0637673855874112,
+        0.06298399628104903, 0.06249028885651722, 0.062303295948610504,
+        0.06241166506944436, 0.06277685027631265, 0.06333737164214069, 0.06401517850089158,
+        0.06472296109194065, 0.06537137276413711, 0.06587539506500088, 0.06615936538805478,
+        0.06616044314114744, 0.06583052622741238, 0.06513685517542894, 0.06406173809205952,
+        0.06260195908772077, 0.060768471095389395, 0.058586925457903956,
+        0.056099483138358094, 0.05336821139597738, 0.050480176139120106,
+        0.047553962690105145, 0.044746455869670645, 0.042256701128126524,
+        0.04032023086800468, 0.03918433199135882, 0.03905935146835388, 0.04006023110051368,
+        0.04217292197281401, 0.04526983515292856, 0.04915970948322677, 0.05363743985436474,
+        0.0585140924202527, 0.0636277338013338, 0.06884328425000345, 0.07404817859317211,
+        0.0791474318778561, 0.08405954581757044, 0.08871364328373868, 0.09304779731874552,
+        0.09700837204112199, 0.10055013844313367, 0.10363689944851348, 0.10624233972995623,
+        0.10835081287004295, 0.1099578042086921, 0.11106986962276234, 0.11170394540170708,
+        0.11188603677122425, 0.11164939941630328, 0.11103240667084179, 0.11007633031246745,
+        0.10882325287087567, 0.10731428326928773, 0.10558818133391898, 0.10368042683861096,
+        0.10162270824014692, 0.09944276247314571, 0.0971644724038029, 0.09480812157826098,
+        0.09239071372713617, 0.08992628340383216, 0.08742615008786855, 0.08489909689621301,
+        0.08235148210280333, 0.0797873127015052, 0.07720832072359002, 0.0746140832929368,
+        0.07200221713166963, 0.06936866071889312, 0.06670803732238838, 0.06401407509483735,
+        0.06128005052156139, 0.05849922084118139, 0.05566521891233021, 0.052772397451413315,
+        0.04981612432358042, 0.04679304219187239, 0.04370131115665223, 0.04054085053729603,
+        0.03731358640929595, 0.03402369727411614, 0.030677835148358583,
+        0.027285287552513318, 0.02385804139748086, 0.02041071510451245,
+        0.016960341484997317, 0.013526010222027379, 0.0101284192885915,
+        0.006789487186711215, 0.0035329234515080674, 0.00043677227280685874,
+        0.002680520262146998, 0.005568023367200847, 0.00829729551514966,
+        0.010847609083930164, 0.013202047237271686, 0.015345544939036239,
+        0.01726475495293964, 0.018948163751467757, 0.020386293331603706,
+        0.021571934450108566, 0.022500367076092317, 0.02316952732708808,
+        0.02358009030831159, 0.023735455319629537, 0.023641639926490158,
+        0.023307107264323754, 0.022742562341498258, 0.021960755960721962,
+        0.020976330001999183, 0.019805728776024382, 0.018467193897968963,
+        0.016980862968446777, 0.015369018051859078, 0.013656602923657573,
+        0.011872306812993097, 0.010050957626531087, 0.008239156836210125,
+        0.00650944498495021, 0.004996862765941499, 0.003973814062711653,
+        0.0038229243030432204, 0.004571094605001332, 0.005814434507264892,
+        0.0072316692500046355, 0.008667711196547492, 0.010047417824095366,
+        0.011329099713083301, 0.01248647880323538, 0.013501562473655413,
+        0.014361612367031627, 0.015057749331977883, 0.015584251204562864,
+        0.01593815259298707, 0.01611897667344054, 0.01612852636307302, 0.01597070837674294,
+        0.0156513856646488, 0.015178263155516918, 0.014560814984666789,
+        0.01381026339472359, 0.012939625294271007, 0.011963858481159575,
+        0.01090017621062204, 0.009768676535099398, 0.008593596221835042,
+        0.007405845604303416, 0.006248190667380419, 0.005185567225339602,
+        0.004322225270571052, 0.0038103138973371595, 0.0037852118348207448,
+        0.00422737541613685, 0.0049758679183702125, 0.005871898077949004,
+        0.00681295589774571, 0.007738649703669654, 0.00861207571017773,
+        0.009409128985846149, 0.010113166679687842, 0.010712354754819435,
+        0.011198298158296822, 0.011565291579639723, 0.011809877855943651,
+        0.011930563914161895, 0.011927621743593601, 0.011802939742488978,
+        0.011559908237231555, 0.011203331787718795, 0.010739365403553011,
+        0.010175475552750415, 0.00952043291169218, 0.00878435596778396,
+        0.007978849480561151, 0.007117334221566813, 0.006215781295351352,
+        0.005294343542818253, 0.0043810801315579346, 0.003520709768025274,
+        0.0027942453952104662, 0.002346410550889138, 0.002337852941699593,
+        0.0027515497396474273, 0.0034089167629326495, 0.004164132822533376,
+        0.0049391460784530454, 0.00569293784493457, 0.006401643598124402,
+        0.007049834326809944, 0.007626778904989758, 0.008124756162994263,
+        0.008538240461150978, 0.008863480711214917, 0.0090982667350714,
+        0.009241790343865568, 0.009294558452594125, 0.009258338696991556,
+        0.009136129321686648, 0.008932151224837818, 0.008651864385738995,
+        0.00830201552515638, 0.007890730233242556, 0.007427672110450087,
+        0.006924304328457322, 0.006394304066926077, 0.005854189163183738,
+        0.005324189306681476, 0.004829247175357845, 0.004399588211184131,
+        0.0040693734138307555, 0.003871090938780786, 0.003825053936879097,
+        0.003929571630485191, 0.00416081131152629, 0.004482862148926549,
+        0.0048590193560409, 0.005257926622897145, 0.0056549564294575165,
+        0.006031406016789421, 0.006373214601264799, 0.006669849048301218,
+        0.006913484464399666, 0.007098437440228776, 0.0072207812863542215,
+        0.00727808456235364, 0.007269231868301822, 0.007194300232157426,
+        0.007054474648617488, 0.006851993650986248, 0.0065901217710509835,
+        0.006273151882186135, 0.005906448413269564, 0.005496554629348636,
+        0.005051407474978847, 0.004580738460446601, 0.004096798234001916,
+        0.0036156298117031075, 0.0031591766218155804, 0.0027582129073959,
+        0.002454252836415061, 0.0022937203173753057, 0.0023064681654528167,
+        0.0024826649429763024, 0.002779382103943845, 0.0031476518635210264,
+        0.003548526920620617, 0.003954744549085523, 0.004347612821840195,
+        0.0047140272087963795, 0.005044507961472607, 0.005332032514325806,
+        0.005571354920698274, 0.005758604871507559, 0.005891045441300977,
+        0.0059669217719078215, 0.00598536272997964, 0.0059463140458713955,
+        0.00585049069674305, 0.005699341823713983, 0.005495025276573643,
+        0.005240392248942859, 0.004938986512121803, 0.004595068949864406,
+        0.004213689214626076, 0.0038008484859314373, 0.00336384506380572,
+        0.0029120039558689593, 0.0024582521880806532, 0.0020226047939021254,
+        0.0016396304967957452, 0.0013700825408638777, 0.001294061472220314,
+        0.0014400466985224152, 0.0017446302360858462, 0.0021287848194506045,
+        0.002542695716164587, 0.002959016445719557, 0.0033618460942565214,
+        0.003740937872656895, 0.004089063541116417, 0.004400799027361636,
+        0.004671937153518906, 0.004899187830635496, 0.005080016430369509,
+        0.00521255135694564, 0.0052955271960404724, 0.0053282461624789175,
+        0.005310548492368179, 0.005242786462141501, 0.005125798901113763,
+        0.004960884351114276, 0.00474977187514281, 0.004494589148151545,
+        0.004197827992486435, 0.003862308035977956, 0.0034911398274895056,
+        0.003087689942346417, 0.002655553563103305, 0.0021985489573033016,
+        0.0017207810675356461, 0.0012269776569692665, 0.0007244519227110386,
+        0.0002507233937010996, 0.00038496008511933606, 0.000891183650845331,
+        0.0014140112628805764, 0.001936081497327353, 0.002452160928773611,
+        0.002958798996653978, 0.003453215831854716, 0.003933072160079246,
+        0.004396407659208997, 0.004841621816934763, 0.00526746535402304,
+        0.005673032032789369, 0.006057747054796198, 0.006421350483136078,
+        0.00676387504236517, 0.00708561811027927, 0.007387108017547318,
+        0.007669065037297344, 0.007932357719872265, 0.00817795551882122,
+        0.008406878951594799, 0.008620148818673106, 0.00881873623415249,
+        0.009003515361888245, 0.00917522077802557, 0.009334411269105244,
+        0.009481441623545988, 0.009616443596856889, 0.009739316758206022,
+        0.00984972940368419, 0.009947129199431212, 0.010030762744664523,
+        0.010099702860464847, 0.010152882139095033, 0.01018913113997605,
+        0.010207219584934285, 0.010205898969341013, 0.01018394514257241,
+        0.010140199594670033, 0.010073608392958459, 0.00998325792433935,
+        0.009868406803565639, 0.009728513498289607, 0.009563259396123982,
+        0.009372567197160831, 0.009156614660048456, 0.00891584386357522,
+        0.008650966271290299, 0.008362964008305381, 0.00805308788197329,
+        0.007722852809163421, 0.00737403146444566, 0.007008647154460891,
+        0.0066289671788690345, 0.00623749830185083, 0.005836986485265438,
+        0.00543042381111705, 0.00502106665991038, 0.0046124708384191904,
+        0.004208551553478496, 0.0038136787016146995, 0.00343281975062618,
+        0.003071739626228636, 0.0027372487053413967, 0.0024374312775040314,
+        0.002181645703276759, 0.001979848907880117, 0.0018406570087589613,
+        0.0017681306029114674, 0.0017589114577424342, 0.0018022444978683624,
+        0.001883246719036327, 0.0019869001585755886, 0.0021005025338717365,
+        0.002214352532276991, 0.0023214703593297005, 0.002417035620699375,
+        0.0024978576371897233, 0.002561964890544181, 0.002608309740842145,
+        0.0026365614393653466, 0.0026469610959996425, 0.002640218525584175,
+        0.0026174369220779976, 0.002580055764896834, 0.0025298052926178583,
+        0.002468667607088122, 0.002398840283777845, 0.0023226984744581305,
+        0.0022427510833477014, 0.0021615859425757134, 0.0020817984816352705,
+        0.0020058989879002493, 0.0019361963137520587, 0.0018746618382115767,
+        0.0018227866234803098, 0.0017814547099848554, 0.0017508614259990234,
+        0.001730501974793866, 0.0017192407059160259, 0.00171545050309566,
+        0.0017171943375925063, 0.0017224149057737663, 0.0017291040366300091,
+        0.00173543582655541, 0.0017398596596870013, 0.0017411574743875526,
+        0.001738473189391919, 0.0017313223423396102, 0.0017195883194238016,
+        0.0017035092443090257, 0.0016836572675531197, 0.0016609098933542234,
+        0.001636411194226904, 0.0016115194555008819, 0.0015877373296654714,
+        0.001566621581399652, 0.001549672649036189, 0.0015382097816262162,
+        0.001533244504231938, 0.0015353710814259766, 0.0015446940306059038,
+        0.0015608072705288643, 0.0015828282031567914, 0.001609477411978587,
+        0.0016391860266203654, 0.0016702109390026882, 0.0017007420324645476,
+        0.0017289922485530357, 0.001753267620401414, 0.0017720187368726894,
+        0.0017838772836550581, 0.001787681915782807, 0.0017824974850315057,
+        0.0017676311529788286, 0.001742648526622787, 0.001707392855767918,
+        0.0016620106392215422, 0.0016069877707618357, 0.0015432016405735182,
+        0.001471996250202473, 0.0013952887017585228, 0.0013157141433411351,
+        0.0012368064781395477, 0.001163181075050889, 0.001100614043471254,
+        0.001055798018716738, 0.0010354891896667362, 0.0010449959869241081,
+        0.0010866167657606035, 0.001159070102108422, 0.0012583098748665425,
+        0.0013790062226143103, 0.0015157668742873903, 0.0016637641733407767,
+        0.0018189083840391548, 0.0019777999482478875, 0.0021376133129468945,
+        0.002295981199826547, 0.0024509011950905038, 0.0026006667615062753,
+        0.0027438184444449148, 0.0028791100685344605, 0.003005485459991998,
+        0.00312206228886284, 0.0032281205587654537, 0.003323093988181928,
+        0.003406563046116813, 0.0034782487729287997, 0.003538006775526108,
+        0.0035858209695055427, 0.0036217967718797373, 0.0036461535437100198,
+        0.0036592161541209485, 0.0036614055930374078, 0.003653228605766027,
+        0.003635266362172881, 0.0036081622097394427, 0.003572608595866403,
+        0.0035293332824094265, 0.0034790850158027443, 0.0034226188601899654,
+        0.0033606814482741686, 0.0032939964535909404, 0.0032232506354643643,
+        0.003149080849618947, 0.003072062446541819, 0.002992699490074668,
+        0.0029114172123561074, 0.002828557073423166, 0.00274437471087466,
+        0.002659040948843453, 0.002572645891849487, 0.002485205969506603,
+        0.002396673636312887, 0.0023069492846202002, 0.0022158948119096944,
+        0.002123348208853231, 0.002029138507563866, 0.001933100449735604,
+        0.0018350882965764482, 0.0017349882957866253, 0.0016327294328676333,
+        0.0015282922132281314, 0.0014217153354380329, 0.0013131002190095106,
+        0.0012026134347398656, 0.0010904871524491596, 0.0009770177685195446,
+        0.0008625629067337827, 0.000747537003478727, 0.0006324056950844777,
+        0.0005176792250934831, 0.00040390508821961464, 0.0002916601427958753,
+        0.00018154257740269435, 7.416638063418198e-05, 2.9907272808441304e-05,
+        0.0001299599143557052, 0.00022547826860962192, 0.0003158708933359386,
+        0.00040059197566305377, 0.0004791330080453438, 0.0005510287451418769,
+        0.000615863136656547, 0.0006732746839794042, 0.0007229611093386564,
+        0.000764683290029302, 0.0007982684318855312, 0.0008236124700049006,
+        0.0008406816979638606, 0.0008495136407683968, 0.0008502172029305845,
+        0.0008429721427954135, 0.000828027949983681, 0.0008057022390400711,
+        0.000776378827372027, 0.0007405057551092007, 0.0006985936596347194,
+        0.000651215201603822, 0.0005990067880940201, 0.0005426749593417447,
+        0.00048301223661097864, 0.0004209328657449797, 0.00035755295997019873,
+        0.00029437738648290635, 0.0002337630129778953, 0.0001801089246032531,
+        0.0001424037636687881, 0.00013421068080890424, 0.00015848892919501797,
+        0.0002018401135557906, 0.0002524383413403253, 0.00030445010237528495,
+        0.00035506817896185976, 0.0004027504118827003, 0.00044652712219278286,
+        0.0004857273914645531, 0.000519862356906738, 0.0005485713395887498,
+        0.0005715951203884478, 0.0005887617382518123, 0.0005999783505612883,
+        0.0006052261188332678, 0.000604556631202303, 0.0005980891308695126,
+        0.0005860082300363638, 0.0005685620510243583, 0.0005460609551884908,
+        0.0005188772728028779, 0.00048744682320524187, 0.00045227366312103784,
+        0.00041394071434067733, 0.00037313131052597127, 0.00033067157535572166,
+        0.00028761361557938064, 0.000245399420567387, 0.00020617556861689644,
+        0.00017331228253653555, 0.00015177425369230124, 0.00014664489638497433,
+        0.00015883090897918806, 0.0001837982546255844, 0.00021579443612125098,
+        0.00025066428076214227, 0.000285853108689244, 0.00031978646968503996,
+        0.0003514381154649938, 0.0003800983707686022, 0.00040525536193491307,
+        0.00042653311212250783, 0.0004436581089478115, 0.00045644045591341977,
+        0.00046476270685679897, 0.0004685728521392173, 0.000467879600347563,
+        0.0004627489713402584, 0.0004533017021386858, 0.00043971127052857894,
+        0.0004222025739293539, 0.0004010515415190255, 0.00037658628929054236,
+        0.00034919098182508405, 0.00031931459341668397, 0.0002874887952657147,
+        0.00025436338103265385, 0.00022077639121693228, 0.00018789357003967967,
+        0.00015747819163625644, 0.00013233300112553138, 0.00011656877256786234,
+        0.00011417254219130126, 0.00012540020015940444, 0.00014629966988897555,
+        0.00017234906121798513, 0.00020041637598616652, 0.00022860069596331308,
+        0.0002557285437241846, 0.00028102932076415083, 0.00030396561563181816,
+        0.00032414707479325866, 0.0003412857657394466, 0.00035517221362152407,
+        0.0003656620251837833, 0.0003726681128215543, 0.0003761559811763016,
+        0.0003761407604745586, 0.0003726853162368266, 0.0003658991373978149,
+        0.0003559379556003831, 0.00034300426233048047, 0.0003273491298973624,
+        0.0003092760702932658, 0.0002891481656818724, 0.00026740048871026637,
+        0.0002445610185801504, 0.0002212847941193487, 0.000198406945046596,
+        0.0001770160973144923, 0.00015852661304592095, 0.00014465969613536628,
+        0.00013714139193559056, 0.00013701111464584645, 0.000143981330658446,
+        0.00015657184908209718, 0.0001728716200596779, 0.00019115705940269924,
+        0.0002100936291938272, 0.00022870212398232927, 0.00024626840928261486,
+        0.0002622655077634973, 0.0002762996560947109, 0.00028807561185561673,
+        0.00029737479889222585, 0.00030404149253978116, 0.0003079739406407553,
+        0.00030911851429453024, 0.0003074657467180108, 0.00030304759799374087,
+        0.0002959355959079039, 0.00028623973003446575, 0.00027410817795232205,
+        0.00025972817565620565, 0.00024332868294633199, 0.00022518606148006076,
+        0.00020563500423165105, 0.0001850888498202871, 0.00016407688196812012,
+        0.00014331189780921252, 0.00012380674101392905, 0.00010704263155775939,
+        9.507132838285063e-05, 9.010572731109006e-05, 9.320859744687205e-05,
+        0.0001033128424135689, 0.00011810634242042807, 0.00013541820923768184,
+        0.00015369680282245908, 0.00017191099789019623, 0.00018936589552338327,
+        0.00020557309100161758, 0.00022017484497432197, 0.0002329016474029829,
+        0.0002435483888139384, 0.00025196069261746904, 0.00025802683505875924,
+        0.00026167278078541984, 0.00026285897816716753, 0.00026157815999160503,
+        0.0002578537310197397, 0.00025173852382295316, 0.00024331383860524728,
+        0.00023268879511181007, 0.0002200001523836511, 0.00020541294404778456,
+        0.00018912262303612934, 0.0001713601061253256, 0.00015240262248328006,
+        0.00013259678837085632, 0.00011240900859208924, 9.254044706822019e-05,
+        7.419606837490118e-05, 5.964894357206003e-05, 5.26935112431047e-05,
+        5.629717142909271e-05, 6.855375679821167e-05, 8.536766845248913e-05,
+        0.00010399248572507849, 0.00012299141898487235, 0.00014157724410536563,
+        0.00015926325910801606, 0.0001757129784018748, 0.00019067461130125085,
+        0.0002039508654450999, 0.00021538419213341548, 0.0002248491778061628,
+        0.00023224840329011796, 0.0002375100358799848, 0.00024058628881702248,
+        0.00024145229521971447, 0.00024010515023423806, 0.00023656298410375734,
+        0.00023086398909338084, 0.0002230653581591444, 0.00021324211457520988,
+        0.00020148582564685034, 0.00018790320367975024, 0.00017261460613753285,
+        0.0001557524575186661, 0.00013745963403729878, 0.00011788789659549832,
+        9.719658995595794e-05, 7.555231721831521e-05, 5.3132723952820894e-05,
+        3.0156934632032552e-05, 7.546975693288699e-06], [6.066179403231812e-11,
+        1.8222236815328162e-10, 3.04495557690103e-10, 4.2796190282022285e-10,
+        5.531101851866682e-10, 6.804408738680588e-10, 8.104696340657412e-10,
+        9.437310447369566e-10, 1.0807824822426475e-09, 1.2222082527296635e-09,
+        1.3686240077692904e-09, 1.5206814989589273e-09, 1.6790737092344498e-09,
+        1.8445404473316325e-09, 2.0178744454137227e-09, 2.199928056239549e-09,
+        2.3916206196919153e-09, 2.5939465977546615e-09, 2.807984588352865e-09,
+        3.03490732468493e-09, 3.275992819157597e-09, 3.5326367797699868e-09,
+        3.806366497133616e-09, 4.098856393902339e-09, 4.4119454680239074e-09,
+        4.7476568910598174e-09, 5.108220075041947e-09, 5.4960955388617516e-09,
+        5.914002992158563e-09, 6.3649530773725035e-09, 6.852283331319092e-09,
+        7.3796989471947135e-09, 7.951319082055869e-09, 8.571729512109041e-09,
+        9.246042616377487e-09, 9.979965786688167e-09, 1.077987958691173e-08,
+        1.1652927158610877e-08, 1.2607116677477062e-08, 1.3651438910056412e-08,
+        1.4796002346814253e-08, 1.605218874388167e-08, 1.7432832488854518e-08,
+        1.8952427736481093e-08, 2.0627368067619902e-08, 2.247622416841647e-08,
+        2.4520066259023468e-08, 2.678283896227253e-08, 2.9291798151178755e-08,
+        3.207802076589053e-08, 3.5177001060580546e-08, 3.8629349245784924e-08,
+        4.2481611691990556e-08, 4.678723589352131e-08, 5.1607708056812486e-08,
+        5.701389701900586e-08, 6.308764554508865e-08, 6.992365855506851e-08,
+        7.7631749063876e-08, 8.63395157723203e-08, 9.619554304610267e-08,
+        1.0737323479047541e-07, 1.200754195224075e-07, 1.3453989633546484e-07,
+        1.5104613211474251e-07, 1.6992337165356197e-07, 1.9156048684216372e-07,
+        2.1641797334743701e-07, 2.450426078612745e-07, 2.7808541222033074e-07,
+        3.1632374228456033e-07, 3.6068854014183374e-07, 4.1229807398691705e-07,
+        4.724998600049414e-07, 5.429229457308462e-07, 6.255433674134661e-07,
+        7.227664314964102e-07, 8.375305745785618e-07, 9.734390299873548e-07,
+        1.1349275010948286e-06, 1.3274786903519485e-06, 1.5578981265501914e-06,
+        1.834670623860776e-06, 2.1684234114538802e-06, 2.572531235213612e-06,
+        3.0639116059395006e-06, 3.6640764118690065e-06, 4.400531585823e-06,
+        5.308652793753808e-06, 6.434217251655152e-06, 7.836847345663996e-06,
+        9.594732491529088e-06, 1.1811159579550333e-05, 1.462362779660492e-05,
+        1.8216695531646312e-05, 2.2840278105678594e-05, 2.883600378389899e-05,
+        3.667564028843455e-05, 4.7017859882012396e-05, 6.079329958980894e-05,
+        7.933402081088909e-05, 0.00010457393963707642, 0.00013936504188262607,
+        0.0001879868315596151, 0.00025698656113567065, 0.00035660216608165133,
+        0.0005032457498755569, 0.0007239912775137014, 0.0010650196468181617,
+        0.0016082948377852924, 0.0025064703773269264, 0.0040614384247388115,
+        0.006918271252623656, 0.012607491540525444, 0.02535665601161708,
+        0.060127886179144274, 0.20546291485330967, 4.14331296986724, 0.7285025012397838,
+        1.346751871589265, 1.2095886814145331, 0.4241884280704502, 0.21291817665927873,
+        0.10794774321455015, 0.9175292838171111, 0.9535343853822373, 1.3091661040325646,
+        2.7561350354396468, 5.642132520995871, 6.056596244320961, 4.267088135892595,
+        2.5841672596049197, 1.9481450549468282, 1.7513991730456564, 1.8335359042728778,
+        2.1941810770966446, 2.4406970829134185, 1.7623425915913502, 1.1914187730505177,
+        0.953769754791881, 0.9146253217781629, 1.0268333004992256, 1.3111738863087283,
+        1.7868975272975554, 2.1055928843135847, 1.8515311655901825, 1.5182592526362049,
+        1.3265821361251833, 1.256722670297466, 1.287146105445405, 1.4196675032261208,
+        1.6543658586017322, 1.8541477737079513, 1.6802205728874686, 1.2900927752793954,
+        1.0069134378439446, 0.8685048378109562, 0.6651253669224161, 0.6046190696569512,
+        0.6109249746427016, 0.6443822457592233, 0.6742176443765708, 0.6790671741770683,
+        0.6603553816285599, 0.6331987264450536, 0.609950818786874, 0.5962174646737178,
+        0.5934734267247302, 0.6012981748860481, 0.6180041864449093, 0.6400818459381009,
+        0.6611105356205782, 0.6716438319899497, 0.6625015851192291, 0.6310028211099752,
+        0.5834675197520287, 0.5302318319667838, 0.4794742427082273, 0.43530386087319745,
+        0.3988482139311229, 0.369751840048982, 0.347136611984061, 0.3300621633625531,
+        0.31770498223338756, 0.30940847115984754, 0.3046814525068199, 0.3031791987593728,
+        0.3046802927736658, 0.3090632989507869, 0.3162827670859519, 0.3263412502561876,
+        0.33925129494179984, 0.35497823995771227, 0.3733517932688181, 0.3939348830476496,
+        0.4158502445622666, 0.4376024665721278, 0.45700465938784834, 0.47138999606275206,
+        0.4782377169543561, 0.4760499172802532, 0.4649544578718948, 0.44657191435617083,
+        0.4232595359978245, 0.39728344983092906, 0.3703352419395816, 0.34343115613412534,
+        0.31703079663304656, 0.29122126129409615, 0.2658890255167284, 0.24085810336811075,
+        0.2159959059765737, 0.19129121999520915, 0.16690602036326077, 0.1432040711877101,
+        0.12076885849278983, 0.10043764831370701, 0.08337490915722229, 0.0711096392635381,
+        0.06516130995460387, 0.06591787724445425, 0.07196314103780155, 0.0811102193277752,
+        0.09158397116884168, 0.1022486958041453, 0.1124103982875529, 0.12162874279410552,
+        0.1296131201576697, 0.13617610878473826, 0.14121437382286472, 0.14469779064313465,
+        0.1466570326684095, 0.14716694681851697, 0.14632757763027116, 0.14424655783961943,
+        0.1410262560289705, 0.13675756981114462, 0.1315205354773508, 0.12539053558571445,
+        0.11844798974605157, 0.1107890432782696, 0.10253500492132106, 0.09383923950554805,
+        0.08489186791205657, 0.07592463710420966, 0.06721997445520818, 0.059128017577232864,
+        0.05208933853051803, 0.0466401722934119, 0.04333756853294962, 0.04254452183343881,
+        0.04418792283617262, 0.047765440753457636, 0.05260783907292574,
+        0.05811255308126036, 0.06382209353099866, 0.06941182183378782, 0.0746568841991357,
+        0.07940392667996332, 0.08355074669872908, 0.08703158318800241, 0.08980595675777436,
+        0.0918500761494399, 0.09315056503377038, 0.09370051222290487, 0.09349776570474007,
+        0.09254515453180244, 0.09085207051342455, 0.0884366732056177, 0.08532796592527142,
+        0.08156716108037017, 0.0772080950806758, 0.0723169021547689, 0.0669716282392024,
+        0.061262914789349754, 0.05529736723165398, 0.04920595889099711,
+        0.04316114647281968, 0.037408242872533394, 0.032315670272675436,
+        0.028427480450934694, 0.026419481483626116, 0.026787661779053187,
+        0.029444002780465738, 0.03380117987091581, 0.03920738558964958,
+        0.04517553779110113, 0.051385820883892964, 0.05763152914715878,
+        0.06377554265816307, 0.06972362279003441, 0.0754087541271596, 0.08078170164591611,
+        0.08580502683113356, 0.09044914468494944, 0.0946897130220143, 0.09850599447532514,
+        0.10187999402713535, 0.10479624242334246, 0.10724211376063228, 0.109208555684036,
+        0.11069108566881003, 0.11169087784551615, 0.11221574431333442, 0.11228081557381697,
+        0.1119087562253073, 0.11112941591684071, 0.10997890305422617, 0.10849816207208268,
+        0.1067312129113615, 0.10472325624469463, 0.10251885218551793, 0.10016034740258381,
+        0.09768666812324127, 0.0951325302629775, 0.09252805691619613, 0.08989874685956059,
+        0.08726570918179147, 0.08464606806540317, 0.08205344509974044, 0.07949844051605781,
+        0.07698905573820912, 0.07453102419408143, 0.0721280422911575, 0.06978191450095432,
+        0.06749264273673286, 0.0652584983095508, 0.06307611382542169, 0.06094062323202552,
+        0.0588458635739401, 0.05678463559869472, 0.05474900636628936, 0.05273062864560624,
+        0.050721050791675944, 0.048711996521867494, 0.04669560444207148,
+        0.04466462914493748, 0.04261261587596089, 0.04053406666537817, 0.03842461612976932,
+        0.03628123015474064, 0.0341024319182404, 0.03188855000035987, 0.029641976076509095,
+        0.02736741896195874, 0.0250721517016393, 0.022766273921214688, 0.02046305934640011,
+        0.01817954091144782, 0.01593762993262603, 0.013766327423859206,
+        0.011706058844380996, 0.009816871925469078, 0.008192265743598607,
+        0.0069740086846133325, 0.0063351523506812255, 0.006374636634277234,
+        0.007002699504391839, 0.00800800959919054, 0.0091988746386887, 0.010448875463888146,
+        0.011681863983849737, 0.012851677673876063, 0.013929339241863934,
+        0.014896104164113645, 0.015739743370064486, 0.016452484126753826,
+        0.017029798596398686, 0.01746964151460482, 0.017771944852563133,
+        0.017938277846998318, 0.01797162715334546, 0.01787627053291109,
+        0.01765772279275969, 0.01732273308899815, 0.016879313271817284,
+        0.016336780474430396, 0.015705804549636493, 0.014998461602818135,
+        0.014228306937811939, 0.013410491514530243, 0.012561951883973433,
+        0.011701698908157303, 0.010851204977449217, 0.010034822968850337,
+        0.009280030653561986, 0.00861705380400894, 0.00807713429960278,
+        0.007688680046993935, 0.0074713675293971125, 0.0074301801886671,
+        0.007552836844858068, 0.007812641583547785, 0.00817509753543012,
+        0.008604620052286457, 0.00906892989924224, 0.009540900352956988,
+        0.00999873833421131, 0.010425403456715537, 0.010807823485923665,
+        0.011136163536905289, 0.011403234077565813, 0.011604044150984599,
+        0.011735476949683328, 0.011796057723410613, 0.011785785894583683,
+        0.011706008682131237, 0.01155932024383517, 0.011349477195912838,
+        0.011081327504002803, 0.010760754411655749, 0.010394639668225913,
+        0.009990850408770525, 0.009558251272860821, 0.009106737199597073,
+        0.008647271767818623, 0.00819189925585771, 0.007753674104017942,
+        0.0073464203397823205, 0.006984206157217786, 0.0066804236071028615,
+        0.006446446901657965, 0.00629003813962309, 0.00621392206314147,
+        0.006215077588255259, 0.00628510307806473, 0.006411555258810243,
+        0.006579761260260139, 0.006774532815331422, 0.006981431817062294,
+        0.007187515935249465, 0.0073816664469395854, 0.007554648519641371,
+        0.007699030679527404, 0.007809046778343855, 0.007880446507386984,
+        0.007910356173460188, 0.007897158299606976, 0.007840392852547078,
+        0.007740681224257002, 0.007599674248627821, 0.007420026163428753,
+        0.007205396791036876, 0.006960483848904473, 0.006691085670651698,
+        0.006404190646799354, 0.006108081253297008, 0.005812424058428668,
+        0.005528288145624854, 0.005267991315259192, 0.005044627398735584,
+        0.00487111933640162, 0.004758745447958084, 0.004715355011827389,
+        0.004743829119393301, 0.004841455978663011, 0.005000538472489289,
+        0.005209937325880774, 0.005456880305324758, 0.005728464468439099,
+        0.006012620321645988, 0.0062985862219549354, 0.006577051508545416,
+        0.006840119364422743, 0.007081192238973378, 0.007294837053546585,
+        0.007476656903319876, 0.007623179133320258, 0.007731761762725021,
+        0.007800517202429126, 0.00782825145100625, 0.007814417028088768,
+        0.0077590781478407925, 0.00766288683449055, 0.007527068862900761,
+        0.007353418698379672, 0.007144303149902579, 0.006902674329868357,
+        0.006632093731192409, 0.006336770658470039, 0.006021619554603945,
+        0.0056923412520592746, 0.005355531435021677, 0.005018812837302739,
+        0.00469097083926575, 0.004382037447685036, 0.004103209173058407,
+        0.003866408283610893, 0.0036832598022785014, 0.003563385979374125,
+        0.0035123308932242503, 0.0035299537762400216, 0.003610206800633075,
+        0.0037424937739477956, 0.003913872408149755, 0.004111099222525765,
+        0.004321961194457416, 0.004535879401240926, 0.004744024153727168,
+        0.004939186223224799, 0.0051155644846837016, 0.005268551407105402,
+        0.005394548597645838, 0.005490819800048519, 0.005555378327984904,
+        0.005586902641740907, 0.005584673653677163, 0.0055485284491982485,
+        0.005478826611049633, 0.005376426910761891, 0.005242673683169532,
+        0.0050793937290324, 0.004888906160191598, 0.004674049324891136,
+        0.004438230963371761, 0.004185510105496268, 0.003920721631652337,
+        0.003649655462720563, 0.0033792977412242247, 0.0031181203976050897,
+        0.0028763460227926867, 0.002665985126248917, 0.0025002414350790265,
+        0.002391768274888905, 0.0023496797237910583, 0.0023764460094756637,
+        0.002466754581374643, 0.002609305617382675, 0.0027901754666226825,
+        0.002995684040880523, 0.0032138875942972207, 0.003434963099601197,
+        0.0036510382966042387, 0.003855851820961271, 0.004044420985435853,
+        0.004212773353136714, 0.004357746295454964, 0.00447684223789107,
+        0.004568125092275321, 0.0046301457194794105, 0.00466188741891277,
+        0.004662725197130375, 0.004632394683642644, 0.00457096810155076,
+        0.00447883581333488, 0.004356692814475148, 0.00420553031910981,
+        0.004026633482941444, 0.003821587634862452, 0.003592297618800778,
+        0.0033410288654050907, 0.003070486406728673, 0.002783963005859981,
+        0.002485618238974168, 0.002181015097772138, 0.001878176888167799,
+        0.001589683762391799, 0.0013365609937221524, 0.0011532785193464521,
+        0.0010843930878552867, 0.0011553529017695207, 0.0013456367129018624,
+        0.0016126677080109998, 0.001922339851107008, 0.002253799607409751,
+        0.0025947968178864273, 0.0029378048661265533, 0.003277889664482827,
+        0.0036116242978976375, 0.003936530734881218, 0.004250782211676032,
+        0.004553037294620743, 0.004842342388420917, 0.005118070635800479,
+        0.005379880309267511, 0.005627683427746247, 0.005861619324012601,
+        0.0060820300564681865, 0.006289435790436655, 0.006484509018405152,
+        0.006668046979845999, 0.00684094201022851, 0.007004149860784017,
+        0.00715865631627978, 0.007305442704564594, 0.007445451131584499,
+        0.007579550471326449, 0.00770850426942469, 0.007832941765831204,
+        0.00795333319099083, 0.008069970341106888, 0.00818295320155215,
+        0.008292183084839718, 0.008397362412697172, 0.008498000934824659,
+        0.00859342787318171, 0.008682809236974795, 0.008765169385393937,
+        0.00883941582795223, 0.008904366239669486, 0.008958776717357815,
+        0.009001370396422894, 0.009030865666149393, 0.009046003350527933,
+        0.009045572348401839, 0.009028433344053158, 0.008993540303533998,
+        0.008939959562583985, 0.0088668863902467, 0.008773658980040308,
+        0.008659769879958954, 0.008524874924634829, 0.008368799778640943,
+        0.00819154423954668, 0.007993284483211606, 0.0077743734630496344,
+        0.007535339701948323, 0.007276884741784647, 0.006999879548400503,
+        0.006705360214570879, 0.0063945233720569105, 0.006068721834017751,
+        0.005729461165528523, 0.005378398174631858, 0.00501734280202725,
+        0.004648265716917503, 0.004273315356888612, 0.0038948506953823923,
+        0.0035155006566147755, 0.003138269791825776, 0.0027667265031484827,
+        0.0024053424025145304, 0.002060112235574113, 0.0017396824777516902,
+        0.001457278474947547, 0.0012331874246189012, 0.001094505569411186,
+        0.0010634750709092756, 0.0011365970152441903, 0.0012843471972253137,
+        0.001473377100842174, 0.0016796204686206704, 0.0018881876668293274,
+        0.0020900605830497894, 0.0022796113758637646, 0.002453179760584155,
+        0.002608302427703923, 0.0027432927679681336, 0.002857004977347444,
+        0.002948696795381685, 0.0030179464911855042, 0.0030646006016017244,
+        0.0030887396373195214, 0.003090654629823373, 0.003070830491405405,
+        0.0030299339384706058, 0.0029688048166100147, 0.002888450407190428,
+        0.002790042896090112, 0.0026749207985199705, 0.002544595910507225,
+        0.002400768493460639, 0.002245355195290067, 0.0020805371585228783,
+        0.0019088406479260754, 0.001733270448316601, 0.001557528095019376,
+        0.0013863601330533516, 0.0012260774169275113, 0.0010851916256143558,
+        0.0009747366876465594, 0.0009070171182979532, 0.0008912878471657756,
+        0.0009281512516348804, 0.0010086922723886204, 0.001119627656239498,
+        0.0012485620517295947, 0.0013859708593954969, 0.0015250360794499828,
+        0.001660919969507604, 0.0017901258029977467, 0.001910058771110143,
+        0.0020187471750368574, 0.0021146690285024448, 0.0021966438226383896,
+        0.0022637639476939487, 0.0023153503305223845, 0.002350923036217821,
+        0.002370181275107707, 0.0023729894628986194, 0.002359367328190396,
+        0.002329482921358209, 0.0022836479772863345, 0.0022223155687205033,
+        0.0021460804735469255, 0.002055683289521545, 0.0019520202377137559,
+        0.0018361620961686287, 0.0017093883520736721, 0.001573247542328202,
+        0.0014296640453271784, 0.001281129578240556, 0.0011310519892217014,
+        0.0009843929901341504, 0.0008487868018945639, 0.0007361611470920914,
+        0.0006635411518625813, 0.0006484475154203963, 0.0006968700593387089,
+        0.000798058005946252, 0.0009346393048326699, 0.0010922383000761201,
+        0.001261278333050508, 0.0014356383902737985, 0.001611278206555442,
+        0.001785376972427608, 0.00195585019284292, 0.002121082760380331,
+        0.0022797790696537003, 0.0024308766047167465, 0.0025734946536061327,
+        0.0027069029467593902, 0.0028305018531140018, 0.0029438093931889197,
+        0.003046452303193066, 0.0031381594908590858, 0.0032187568623206924,
+        0.0032881628781387864, 0.003346384427508295, 0.003393512753519075,
+        0.0034297192546031223, 0.0034552510473126446, 0.0034704262159090185,
+        0.0034756287015018173, 0.00347130280286759, 0.0034579472749784773,
+        0.003436109021889685, 0.0034063763892244877, 0.003369372069067009,
+        0.0033257456374326654, 0.0032761657525676086, 0.003221312051819704,
+        0.0031618667965781157, 0.0030985063298784228, 0.0030318924297696643,
+        0.0029626636645538537, 0.002891426882589044, 0.0028187489989367097,
+        0.0027451492713824683, 0.0026710922865624217, 0.002596981898263277,
+        0.0025231563704937792, 0.0024498849717094736, 0.0023773662403963405,
+        0.0023057280929818344, 0.0022350298736777082, 0.002165266355721339,
+        0.0020963736021729447, 0.002028236490959521, 0.0019606976154627896,
+        0.0018935671976607386, 0.0018266336050293413, 0.0017596740486495374,
+        0.001692465058372082, 0.00162479237784726, 0.0015564599906046717,
+        0.0014872980700153858, 0.00141716973379123, 0.0013459765704469033,
+        0.0012736629894543842, 0.0012002195274047646, 0.0011256853263965005,
+        0.00105015009867145, 0.0009737560256427417, 0.0008967002496771246,
+        0.000819238977140123, 0.0007416948659877173, 0.0006644706129820862,
+        0.0005880740966192195, 0.0005131653846553437, 0.00044064615086810116,
+        0.000371832804121446, 0.00030879086654875124, 0.0002549284061589356,
+        0.00021568237049735366, 0.00019776034173661126, 0.00020435040157569341,
+        0.00023091961802601898, 0.00026933292945816175, 0.00031313899330560343,
+        0.00035841647090775785, 0.000402898292637011, 0.00044522844942724806,
+        0.00048454970336428665, 0.0005202925650210587, 0.000552066474363534,
+        0.0005796017588397572, 0.0006027173931208048, 0.0006213023312925503,
+        0.0006353042385115635, 0.0006447223951368665, 0.0006496030326420841,
+        0.000650036142380144, 0.0006461532294885456, 0.0006381257366042902,
+        0.0006261640227760735, 0.0006105168989559143, 0.0005914718201368275,
+        0.0005693559336249967, 0.0005445382959900132, 0.0005174337063407004,
+        0.0004885087588599317, 0.00045829086438805937, 0.0004273810318081756,
+        0.0003964708742615746, 0.00036636300915304505, 0.00033799055253157717,
+        0.0003124239587170398, 0.0002908411177068806, 0.00027442502014548474,
+        0.00026416353101800825, 0.00026058671807167345, 0.00026356900481570503,
+        0.0002723356788106594, 0.0002856792993941051, 0.00030224668533442185,
+        0.0003207572202433715, 0.0003401099654701663, 0.0003594078479361686,
+        0.00037794060180252324, 0.0003951547230318837, 0.00041062392044535854,
+        0.0004240246599512196, 0.000435117373260702, 0.00044373249688530093,
+        0.0004497602358998095, 0.000453143077037767, 0.000453870301727667,
+        0.0004519739635314743, 0.000447525968253826, 0.0004406360291944721,
+        0.0004314503727769839, 0.0004201511490022985, 0.0004069565614050988,
+        0.00039212177122554685, 0.000375940639837125, 0.0003587483259257354,
+        0.00034092459664910034, 0.00032289735258239015, 0.0003051451641079998,
+        0.00028819641597328794, 0.0002726209310098396, 0.00025900817517420736,
+        0.00024792591104691827, 0.0002398572952011305, 0.00023512506664858933,
+        0.0002338253589221979, 0.00023579947039670474, 0.00024065917717918062,
+        0.0002478556206425661, 0.00025676355541018656, 0.0002667540729919512,
+        0.00027724299755953343, 0.00028771551925663174, 0.00029773391326565196,
+        0.00030693564654382064, 0.00031502718453112004, 0.00032177662343133473,
+        0.0003270066949711006, 0.00033058875967140704, 0.00033243793128012473,
+        0.00033250927122665863, 0.00033079492975091653, 0.00032732211572009145,
+        0.0003221518111797322, 0.0003153781901598123, 0.0003071287439281877,
+        0.0002975651486328044, 0.00028688492370513837, 0.00027532389703108885,
+        0.0002631593708772779, 0.00025071359263693183, 0.0002383565575246101,
+        0.00022650617182974741, 0.00021562235579290393, 0.00020619015371181712,
+        0.00019868664094961245, 0.00019352970565701452, 0.0001910154261441014,
+        0.00019126211231946692, 0.00019418399401038462, 0.00019950759267819198,
+        0.00020682353681875963, 0.00021565188417148565, 0.0002254996548939109,
+        0.00023590006439863108, 0.0002464334044904417, 0.00025673459426535177,
+        0.00026649295895156676, 0.0002754483645925802, 0.0002833861859998972,
+        0.0002901323658089539, 0.00029554908794691287, 0.00029953120481594926,
+        0.00030200338377324925, 0.00030291787710432384, 0.00030225281308340267,
+        0.00030001092334043473, 0.0002962186489583912, 0.00029092559825796545,
+        0.00028420436111682945, 0.0002761507177995585, 0.000266884314643566,
+        0.00025654991325167503, 0.00024531934834517137, 0.00023339433690038573,
+        0.00022101023237297267, 0.0002084406394626225, 0.00019600236033195196,
+        0.00018405921526856475, 0.00017302162902955485, 0.00016333653262191484,
+        0.000155460168945152, 0.00014980788973359717, 0.00014668428929732108,
+        0.00014621375690530234, 0.00014830340985859085, 0.00015266012290589615,
+        0.0001588534651284439, 0.00016639348392077195, 0.00017479450072495494,
+        0.00018361350466931128, 0.00019246625209381072, 0.00020102932753308288,
+        0.00020903543111017799, 0.00021626643973213713, 0.0002225465200029521,
+        0.00022773619175445097, 0.00023172754734720815, 0.00023444053945192834,
+        0.00023582015929159478, 0.00023583432596627072, 0.00023447234037438954,
+        0.00023174380011698855, 0.00022767791604687236, 0.00022232321542040644,
+        0.00021574766315266713, 0.00020803928554952208, 0.0001993074451779356,
+        0.00018968499622531028, 0.00017933164811276145, 0.00016843896929831907,
+        0.00015723752159663826, 0.00014600647604577082, 0.0001350853455198353,
+        0.00012488538469088785, 0.00011589354406806681, 0.00010865420475015498,
+        0.00010370803430056548, 0.0001014787193082684, 0.00010214167824553956,
+        0.00010555445816959901, 0.00011130380096085221, 0.0001188337774822564,
+        0.00012757148947817602, 0.00013700176947861024, 0.00014669287225289271,
+        0.00015629441499519025, 0.00016552503421444638, 0.00017415878522280257,
+        0.00018201360878629679, 0.00018894250360541314, 0.0001948270743019578,
+        0.00019957290518175252, 0.00020310625581479363, 0.00020537168591567526,
+        0.00020633032472114552, 0.0002059585862530886, 0.00020424719663549243,
+        0.00020120044811943488, 0.00019683563244869736, 0.00019118263937224018,
+        0.00018428374042502192, 0.00017619362133997494, 0.00016697979068556676,
+        0.00015672359958695384, 0.00014552230060876567, 0.00013349294212970138,
+        0.00012077962999287643, 0.00010756721729962118, 9.410775204922721e-05,
+        8.077294465437754e-05, 6.815881643781233e-05, 5.727786050930257e-05,
+        4.978302703547136e-05, 4.769200788663416e-05, 5.1887786522127016e-05,
+        6.116938971296158e-05, 7.361795163938461e-05, 8.781135539337047e-05],
+    [1.6275786364139332e-10, 4.889705799562936e-10, 8.172796414689116e-10,
+        1.1491003910920353e-09, 1.4858750217874465e-09, 1.829083830577762e-09,
+        2.1802567562578433e-09, 2.5409856311573333e-09, 2.9129370714829207e-09,
+        3.297866273055835e-09, 3.697631854584416e-09, 4.114211954077917e-09,
+        4.549721742161079e-09, 5.006432657849814e-09, 5.486793555727104e-09,
+        5.993454120216552e-09, 6.529290844300517e-09, 7.097435967674187e-09,
+        7.70130982135685e-09, 8.344657038522631e-09, 9.031587266881606e-09,
+        9.766620962847417e-09, 1.0554741085556088e-08, 1.1401451537669988e-08,
+        1.2312843367708482e-08, 1.329566989963675e-08, 1.435743218461152e-08,
+        1.5506476313146406e-08, 1.6752104490883175e-08, 1.8104701980414345e-08,
+        1.957588252803881e-08, 2.1178655143581557e-08, 2.292761582282129e-08,
+        2.4839168253818203e-08, 2.693177842538345e-08, 2.922626882330316e-08,
+        3.174615908885604e-08, 3.4518061159945974e-08, 3.757213861499391e-08,
+        4.094264161862985e-08, 4.4668531336241204e-08, 4.8794210198963024e-08,
+        5.337037797956442e-08, 5.845503747307131e-08, 6.411467884717508e-08,
+        7.042567745846809e-08, 7.747594814893814e-08, 8.536690742422362e-08,
+        9.421580770365952e-08, 1.0415852105088602e-07, 1.1535286881328324e-07,
+        1.2798261574004056e-07, 1.4226227557913138e-07, 1.5844291162075162e-07,
+        1.7681916102379312e-07, 1.977377701346221e-07, 2.2160800354360983e-07,
+        2.489143849016357e-07, 2.8023235386894005e-07, 3.1624758525932053e-07,
+        3.5777993026029537e-07, 4.0581322110571605e-07, 4.6153255378860994e-07,
+        5.263711629078362e-07, 6.020696757498664e-07, 6.907514473358161e-07,
+        7.950189301853966e-07, 9.180777667700112e-07, 1.0638977167967722e-06,
+        1.2374229558008573e-06, 1.444849185334334e-06, 1.693992105586063e-06,
+        1.9947822692230643e-06, 2.3599369889022214e-06, 2.8058838333483387e-06,
+        3.354047328127036e-06, 4.032669484084842e-06, 4.879431061707085e-06,
+        5.945302383135623e-06, 7.300334091920681e-06, 9.042607641534885e-06,
+        1.1312530478093384e-05, 1.4316592788168261e-05, 1.836883451150253e-05,
+        2.3967858836778346e-05, 3.1951886216554324e-05, 4.3846895324384706e-05,
+        6.277986833501997e-05, 9.653151614439818e-05, 0.00017355013411949927,
+        0.0008466076450236779, 0.00034695722360906194, 0.0002860663361182442,
+        0.00027833928859468597, 0.0002899173083658355, 0.0003141055492913641,
+        0.00034965145647559493, 0.00039740530826741396, 0.00045957471013654573,
+        0.0005396732762300129, 0.0006427933552329807, 0.0007761530342167542,
+        0.0009499891351958538, 0.0011789685700452717, 0.0014844342685344449,
+        0.0018980532555680444, 0.002467908914231844, 0.003269023127194559,
+        0.004422272066755606, 0.006130063135479443, 0.008747676557002416,
+        0.012936718552423308, 0.020027700062287032, 0.03299210563587636,
+        0.059566012767388286, 0.12564590902226955, 0.37728778596201756,
+        6.574866807025479, 0.9761342643947251, 1.480388426362263, 1.0904885267705688,
+        0.41473697166223994, 0.5253718149881265, 1.264727569510353, 2.0910248664464324,
+        1.2051040928177996, 1.0130829935487762, 1.0998362887329687, 1.4989454310561727,
+        2.287666517911476, 1.7078779865707032, 1.037491162184348, 0.7751049391185283,
+        0.699335011160667, 0.7631057932996348, 1.0096054200866649, 1.3175941674242784,
+        1.1527885399503501, 0.9355158563828274, 0.858633767608559, 0.8872083796681232,
+        1.0161273220698595, 1.2768566299585296, 1.6800199240393947, 1.895302639784797,
+        1.5913428314970066, 1.2461381635541118, 1.041415577214365, 0.9460769010802722,
+        0.9328277358523778, 0.9965220115027684, 1.135872141562941, 1.2649112989937608,
+        1.1658586513590148, 0.9384268368131852, 0.7921967082385472, 0.7570129603147003,
+        0.6611848181612965, 0.6456525575243296, 0.6782705053264245, 0.7225032405182167,
+        0.748156149603584, 0.7372593664752276, 0.697785958545636, 0.6502083020654829,
+        0.6089238675269748, 0.5794662229412273, 0.5625346380514605, 0.5569003671605335,
+        0.5602998064008095, 0.5690759076290021, 0.5773440208023906, 0.5770381406549331,
+        0.5607916593805408, 0.5270015468250092, 0.48145835222349537, 0.4328592370554144,
+        0.387742831415073, 0.3491435641728209, 0.3176554082085259, 0.29272452706000923,
+        0.2734405191212498, 0.2588991896585774, 0.24833363603157516, 0.2411430759414183,
+        0.23688298378211345, 0.23524358218972868, 0.23602684910872254, 0.23912487305871893,
+        0.24449898226344877, 0.25215691560581965, 0.26212319730926514, 0.2743953981438364,
+        0.28887656027077, 0.3052740677372129, 0.3229638254910004, 0.3408467084712876,
+        0.3572796945802416, 0.37022205225996996, 0.37770427832795717, 0.3785057646960773,
+        0.3726418657984181, 0.3612924658010195, 0.34623957302931163, 0.3292302200795348,
+        0.311591605112089, 0.2941380021385797, 0.27724927781383724, 0.26100317336593154,
+        0.24530066237608866, 0.22996725606102913, 0.21483139433248352, 0.1997832142220768,
+        0.18481313415152664, 0.17002684254224498, 0.15563511854701093, 0.14192296704496218,
+        0.12920848429589302, 0.11780286475939315, 0.10797796604802534, 0.09994064065256691,
+        0.09380938101636538, 0.08959228407790759, 0.08717358317042904, 0.08632026265778545,
+        0.08671326078206612, 0.08799439438789809, 0.08981323359879058, 0.09186216523731003,
+        0.09389594707538015, 0.09573739598422039, 0.0972726778516075, 0.09843992407374134,
+        0.09921477624171736, 0.09959605435472356, 0.09959395470029962, 0.09922215273860986,
+        0.09849417709112279, 0.0974236034207366, 0.09602702169961891, 0.09432833866908051,
+        0.0923628185529751, 0.09017942107737731, 0.08784050971631853, 0.08541877391929815,
+        0.08299198329742782, 0.08063668717793505, 0.0784220474690283, 0.07640471773822918,
+        0.07462526684694294, 0.0731062933647682, 0.07185217602105386, 0.07085032262128493,
+        0.07007372371504828, 0.06948451755110838, 0.06903812829988061, 0.0686874155039148,
+        0.06838625459459315, 0.06809210255690731, 0.06776736316257517, 0.06737966599692433,
+        0.06690141311699672, 0.06630906203488857, 0.06558259396310129, 0.06470549414097491,
+        0.063665394708487, 0.0624553443852875, 0.06107550829045886, 0.059534993922895206,
+        0.057853466635499236, 0.05606226544284133, 0.054204836411429445,
+        0.052336414929110286, 0.050522943402153984, 0.04883915904638372,
+        0.04736563944472158, 0.04618445916787535, 0.04537318982041002, 0.04499746817156817,
+        0.045103242983173183, 0.04571064360040636, 0.0468114676265078, 0.04837120749120026,
+        0.050334875223767, 0.052634701747361075, 0.05519767600056441, 0.057951584746526265,
+        0.060829075925313274, 0.0637698713008426, 0.0667215251669653, 0.06963917469649239,
+        0.07248467591035354, 0.07522543989941448, 0.07783320649190004, 0.08028292563287581,
+        0.08255186156510948, 0.08461899058645297, 0.0864647277370663, 0.08807098785628062,
+        0.08942155826734209, 0.09050273085815344, 0.09130411000217764, 0.09181948273210405,
+        0.09204761563871236, 0.09199283755732743, 0.09166528523034397, 0.09108073236630058,
+        0.09025998494485994, 0.08922789442689129, 0.08801209986314358, 0.08664164631327406,
+        0.08514563386442481, 0.08355203070365183, 0.08188674360905532, 0.08017299122160383,
+        0.07843097992070584, 0.07667784606801022, 0.0749278048524571, 0.07319243493188217,
+        0.07148102771977279, 0.06980093813469057, 0.06815788761227398, 0.06655618798274385,
+        0.06499887430988832, 0.06348775347932556, 0.06202339072355073, 0.06060506601916514,
+        0.05923073492343003, 0.057897023747817335, 0.056599278484014415,
+        0.05533167326970027, 0.05408737087338345, 0.052858717821022146,
+        0.051637452542688096, 0.05041490680310936, 0.04918218766627434,
+        0.047930337056105735, 0.046650475754414125, 0.0453339458226243,
+        0.04397246802362968, 0.04255832811428582, 0.04108459823024689, 0.03954538852407206,
+        0.03793611204829724, 0.03625373553231097, 0.03449698299316957, 0.03266646036446973,
+        0.030764678228054176, 0.02879596527983007, 0.02676628427739954,
+        0.02468298080251576, 0.02255450930067884, 0.020390188558834742,
+        0.018200041676505987, 0.015994781123586925, 0.013786026664530614,
+        0.011586942408335821, 0.009413805026828478, 0.007290163040493268,
+        0.005260018751249839, 0.0034411847351043805, 0.002271411566342872,
+        0.002637058697026016, 0.0040518592712980705, 0.005711391858108343,
+        0.007384833292595893, 0.00900398185469206, 0.010540215675791062,
+        0.011977775241201782, 0.013306310016813474, 0.014518273637177278,
+        0.015607850672938843, 0.016570470800276356, 0.017402591581386222,
+        0.01810162163757909, 0.01866591922585291, 0.019094823979195097,
+        0.019388690386720264, 0.01954890049664995, 0.01957784322985584,
+        0.019478858307486194, 0.01925615245826977, 0.018914702437912826,
+        0.01846016225311878, 0.017898790682999394, 0.01723741066423274,
+        0.016483406116470544, 0.015644756530017442, 0.014730107393520226,
+        0.0137488775038648, 0.012711414717905184, 0.011629233078798267,
+        0.010515402681921714, 0.00938523219705411, 0.008257508935671858,
+        0.00715678695664031, 0.006117563440812571, 0.005191348880194269,
+        0.004455529282377608, 0.0040118718866483764, 0.003944746089405758,
+        0.004248786294858988, 0.004827156258750399, 0.005566075703757837,
+        0.006380767576480878, 0.007217013182517679, 0.008040776562838178,
+        0.00882995564682186, 0.00956951957128149, 0.010248822923985115,
+        0.010860112125690623, 0.011397665701830071, 0.011857277475774863,
+        0.012235933420355918, 0.01253160471751973, 0.012743115184675724,
+        0.01287005836907471, 0.012912747560807054, 0.012872185748996678,
+        0.012750044904253938, 0.01254864633910494, 0.012270936827062196,
+        0.011920458608439464, 0.011501315004462895, 0.01101813665693482,
+        0.010476056144542329, 0.0098807010485992, 0.009238218221446423,
+        0.008555346699876084, 0.007839566482289251, 0.0070993708551412805,
+        0.0063447518287316484, 0.005588071948406017, 0.004845656475361368,
+        0.004140707868033773, 0.003508346640522682, 0.003002323749882304,
+        0.002695240686666409, 0.002649845541683809, 0.0028653517697152567,
+        0.003274125415156393, 0.003796116608190459, 0.0043722642299512966,
+        0.004965194092864318, 0.005551585567308165, 0.006116290171434459,
+        0.006648932057392015, 0.007142063485928976, 0.007590162041198732,
+        0.007989071923745525, 0.008335681527881538, 0.00862772875888504,
+        0.008863676554179668, 0.009042627908065651, 0.009164264274558923,
+        0.009228799270003203, 0.00923694393764854, 0.009189881962678711,
+        0.009089254051847616, 0.00893715086034663, 0.008736113864250578,
+        0.008489143828604962, 0.008199717287042699, 0.007871812894451415,
+        0.007509951708322449, 0.007119258384103538, 0.006705553835089797,
+        0.006275493768010986, 0.005836770571183435, 0.00539839511735346,
+        0.004971061758147063, 0.004567554948333515, 0.004203044209990827,
+        0.003894898170721453, 0.003661378662754144, 0.0035185971509176304,
+        0.00347607558805996, 0.0035330665844346943, 0.0036783480289858225,
+        0.003893788207781704, 0.004159130181117661, 0.004455475116070994,
+        0.004766825745272662, 0.0050802944319499185, 0.005385717593064843,
+        0.005675128141804097, 0.005942277221683735, 0.006182257534532363,
+        0.006391224769016612, 0.0065661975045830994, 0.006704915017882118,
+        0.006805735970376165, 0.006867565103337109, 0.006889798673142207,
+        0.006872282259950698, 0.006815276860741992, 0.006719430949820023,
+        0.006585757542068204, 0.006415616305991385, 0.006210701541702096,
+        0.005973037510146583, 0.005704983388596146, 0.0054092513510607095,
+        0.005088943395935224, 0.0047476162789077785, 0.004389390401312882,
+        0.004019129557585303, 0.0036427367079592335, 0.003267638765662351,
+        0.002903566049700941, 0.002563729119953923, 0.002266290197867783,
+        0.0020351627492550058, 0.0018972407380976138, 0.0018726088118089018,
+        0.0019620564296166706, 0.0021457323348882144, 0.002394987273478684,
+        0.0026836725143472855, 0.0029920136830921657, 0.0033060042038294594,
+        0.0036157650893527404, 0.00391417005802113, 0.004195920774413119,
+        0.004456966158141536, 0.0046941431870506966, 0.0049049528852057045,
+        0.0050874179139455, 0.005239989797545255, 0.005361486850450788,
+        0.005451051492230634, 0.005508120042096424, 0.005532400622990812,
+        0.005523856279030636, 0.005482691294384145, 0.005409339278047785,
+        0.0053044520114187655, 0.005168888430207093, 0.005003703467198328,
+        0.004810136832937273, 0.0045896021644765, 0.00434367736016615, 0.004074097421718136,
+        0.0037827519350777886, 0.0034716908641104455, 0.0031431455598624376,
+        0.002799579126912472, 0.002443797637068681, 0.002079198935891863,
+        0.0017103669938788285, 0.001344652030812914, 0.0009970053544244783,
+        0.0007065882804212646, 0.0005772268539254167, 0.0007059941285828457,
+        0.0009955339328996482, 0.0013420508006123481, 0.001706660869337904,
+        0.0020748434019462465, 0.0024398032310869074, 0.002797624811423928,
+        0.003145684232918642, 0.003482047457010413, 0.003805213843592127,
+        0.0041139966596486, 0.004407463495514983, 0.004684904773764708,
+        0.004945815942016112, 0.005189886277442093, 0.005416990591458317,
+        0.005627181778870663, 0.005820683037118811, 0.005997879075334417,
+        0.006159305924052005, 0.006305639127743337, 0.006437680200890436,
+        0.006556341286299095, 0.006662627991062879, 0.006757620412303061,
+        0.006842452415446053, 0.00691828930119678, 0.006986304098930156,
+        0.007047652850340792, 0.007103449388480628, 0.007154740258706721,
+        0.007202480550821426, 0.007247511495727233, 0.007290540706751076,
+        0.00733212590399119, 0.007372662844538129, 0.0074123779983096705,
+        0.0074513262740778866, 0.007489393835930971, 0.007526305784927146,
+        0.007561638240711583, 0.007594834166280051, 0.007625222150396958,
+        0.007652037301371811, 0.007674443409351666, 0.007691555590552128,
+        0.007702462720944307, 0.007706249082529057, 0.007702014767458246,
+        0.007688894502680288, 0.007666074662962933, 0.007632808329504591,
+        0.007588428324547258, 0.007532358211158134, 0.0074641212942203935,
+        0.007383347696434788, 0.007289779614182983, 0.007183274883669993,
+        0.0070638090088881705, 0.0069314758199226926, 0.006786486943002874,
+        0.006629170272955641, 0.0064599676453470254, 0.006279431909497379,
+        0.006088223608007346, 0.005887107473495867, 0.005676948961599556,
+        0.005458711053170201, 0.005233451577641308, 0.005002321338634588,
+        0.004766563356797819, 0.0045275135868801854, 0.004286603502914271,
+        0.00404536496621717, 0.003805437754902375, 0.0035685799788599776,
+        0.003336681205118189, 0.0031117772709771774, 0.00289606413749522,
+        0.0026919052949001916, 0.0025018227429362025, 0.002328455470418434,
+        0.0021744632005872774, 0.0020423516242206955, 0.0019342070341342892,
+        0.0018513619767445487, 0.0017940659976400275, 0.0017612778465169686,
+        0.0017506825984428172, 0.001758953584417426, 0.0017821737698655163,
+        0.0018162791569730993, 0.001857413231088963, 0.0019021478790388934,
+        0.00194758227858986, 0.001991356358956726, 0.0020316160879275294,
+        0.002066957950818866, 0.0020963690837547473, 0.0021191713582030844,
+        0.0021349726721965273, 0.002143625995176634, 0.0021451954458412284,
+        0.002139928198625379, 0.002128230908067367, 0.0021106493860488756,
+        0.0020878503512223572, 0.002060604143345656, 0.0020297673453970335,
+        0.0019962642940524427, 0.001961066514100515, 0.0019251692302697922,
+        0.0018895643495235532, 0.001855209728513629, 0.0018229951845874213,
+        0.001793706560722969, 0.0017679901107625366, 0.0017463203209794908,
+        0.0017289747409640374, 0.0017160191922408596, 0.0017073057376117318,
+        0.0017024841617715289, 0.0017010258189083653, 0.001702257048000845,
+        0.0017053983577413124, 0.0017096054125311858, 0.0017140084055245828,
+        0.0017177473988549427, 0.0017200023210948306, 0.0017200172888343567,
+        0.001717119635407935, 0.0017107344655733537, 0.0017003957578514695,
+        0.0016857550790245358, 0.0016665889276416834, 0.0016428056373363042,
+        0.00161445267633764, 0.0015817250841802587, 0.001544975673285961,
+        0.0015047274447395809, 0.0014616883360328687, 0.0014167677859826676,
+        0.0013710934513375636, 0.001326024470160479, 0.0012831547306697126,
+        0.001244295839552389, 0.0012114260406384005, 0.0011865910520962829,
+        0.0011717500817716173, 0.001168578476035776, 0.0011782640887440204,
+        0.001201353281803963, 0.0012376965105960198, 0.001286508991451478,
+        0.0013465187677282233, 0.0014161498058070329, 0.0014936916644393337,
+        0.001577428556500932, 0.00166572233432783, 0.0017570569544132048,
+        0.0018500561418657577, 0.0019434849205782103, 0.0020362427856470675,
+        0.002127353446991252, 0.0022159539293235674, 0.002301284414970148,
+        0.0023826793887731664, 0.0024595601963137083, 0.0025314289074539515,
+        0.002597863287018325, 0.0026585126523995203, 0.002713094408379046,
+        0.002761391073644374, 0.0028032476412763376, 0.0028385691422847447,
+        0.0028673183046973565, 0.0028895132206954756, 0.0029052249504792262,
+        0.0029145750047691724, 0.002917732658202102, 0.0029149120542753776,
+        0.0029063690691057526, 0.0028923979066708162, 0.0028733274027494173,
+        0.002849517018856262, 0.002821352511469824, 0.002789241266409199,
+        0.002753607293809573, 0.0027148858865447467, 0.0026735179551136967,
+        0.00262994406536378, 0.002584598223107768, 0.0025379014716605496,
+        0.002490255394615664, 0.0024420356457303697, 0.002393585658998789,
+        0.002345210721520096, 0.0022971726164851183, 0.0022496850583764304,
+        0.0022029101435522397, 0.0021569560225257046, 0.0021118759638327727,
+        0.002067668923455154, 0.002024281661979209, 0.0019816123694366425,
+        0.0019395156741735323, 0.0018978088348824817, 0.0018562788535447642,
+        0.0018146902068178926, 0.0017727928778078813, 0.0017303303788578995,
+        0.0016870474855791237, 0.0016426974471867018, 0.001597048492384157,
+        0.001549889506335654, 0.0015010348085935234, 0.00145032800912545,
+        0.0013976449588214005, 0.001342895840566119, 0.0012860264680609663,
+        0.001227018873380185, 0.0011658912723478752, 0.0011026975015815629,
+        0.0010375260249020607, 0.0009704986122570869, 0.0009017688066418498,
+        0.0008315203194184401, 0.0007599655472353845, 0.0006873445124086107,
+        0.0006139247594201786, 0.0005400032552117089, 0.0004659125704487688,
+        0.00039203683909330353, 0.0003188524807101763, 0.00024704128088083924,
+        0.00017786098739001015, 0.00011471347574088878, 7.147430089115468e-05,
+        8.262033485272803e-05, 0.00013231421475833004, 0.00019030379473209045,
+        0.00024880658074117034, 0.00030567825984859325, 0.00036002688296588953,
+        0.0004113475769582989, 0.00045929358030035345, 0.0005035999836567557,
+        0.0005440540151333936, 0.000580482158490862, 0.0006127441494169268,
+        0.0006407300311078367, 0.0006643586426485531, 0.0006835767879300686,
+        0.0006983587143970248, 0.0007087057103775701, 0.0007146457206046404,
+        0.0007162329287736175, 0.0007135472852457612, 0.0007066939774957982,
+        0.0006958028561776564, 0.000681027844290205, 0.0006625463737211048,
+        0.0006405589158387497, 0.0006152887055937575, 0.0005869818094715197,
+        0.0005559077699516115, 0.0005223611963501836, 0.0004866649076266613,
+        0.00044917564863561257, 0.0004102941552609058, 0.0003704827433784432,
+        0.0003302962323639601, 0.0002904369356950194, 0.0002518529898156334,
+        0.00021591003228635034, 0.0001846576193291167, 0.00016108000535812524,
+        0.0001487506725118771, 0.00014999727670059738, 0.00016379190175489695,
+        0.00018651629784165042, 0.00021442813492608396, 0.0002448161602813203,
+        0.0002759305049076127, 0.0003066488156306861, 0.0003362240705409679,
+        0.00036413484120035753, 0.00039000123823336577, 0.00041353764279925513,
+        0.00043452552157812954, 0.00045279732018320163, 0.00046822660501767656,
+        0.0004807218175495786, 0.0004902221659096148, 0.000496694806553013,
+        0.000500132818012306, 0.0005005536692893756, 0.0004979980050204615,
+        0.0004925286442938895, 0.0004842297401985697, 0.0004732060849160136,
+        0.00045958257842719003, 0.0004435039145610983, 0.00042513458341764186,
+        0.0004046593545041442, 0.00038228450652518376, 0.0003582402358781999,
+        0.00033278495649564086, 0.0003062126887888951, 0.00027886558512124995,
+        0.000251155121538059, 0.00022359796202148973, 0.00019687604043498367,
+        0.00017193265601162644, 0.00015010427173228034, 0.00013321718813710202,
+        0.00012338785661095708, 0.00012216722510111942, 0.00012943638154842035,
+        0.00014341327527452274, 0.00016179149290153057, 0.00018262810421814637,
+        0.00020454035847701748, 0.0002265896016469798, 0.00024813246529923846,
+        0.00026871388500806175, 0.00028800056670135165, 0.00030574119357002996,
+        0.0003217426315876907, 0.00033585547931585787, 0.00034796509633409147,
+        0.0003579858905958157, 0.0003658575794704546, 0.00037154266867302736,
+        0.0003750246976416118, 0.0003763069791564571, 0.0003754116697766401,
+        0.0003723790770641439, 0.0003672671566874107, 0.00036015118841718926,
+        0.0003511236516742424, 0.0003402943545901637, 0.00032779091109624966,
+        0.00031375971537455385, 0.0002983676414277582, 0.00028180481046027336,
+        0.00026428893717510434, 0.0002460720051559595, 0.00022745033109199263,
+        0.00020877938323934206, 0.00019049470297290624, 0.00017313895957561028,
+        0.00015739010493659493, 0.00014407239845300589, 0.0001341087136020166,
+        0.00012835838286610099, 0.000127340866900984, 0.00013099523536788977,
+        0.00013868527242394464, 0.00014945196012654404, 0.00016230083020393879,
+        0.00017636799903345077, 0.00019096479150847216, 0.00020556088297968744,
+        0.00021975057057036903, 0.00023322138905759745, 0.00024573004860269044,
+        0.0002570853338558242, 0.00026713631012980965, 0.00027576425476717726,
+        0.00028287711514742307, 0.0002884056583323525, 0.000292300750441321,
+        0.00029453139289808034, 0.00029508326975014076, 0.0002939576452674096,
+        0.00029117050876641755, 0.0002867519042997745, 0.00028074541360082156,
+        0.0002732077867513678, 0.00026420874104762305, 0.00025383097935445677,
+        0.000242170521487127, 0.00022933750608162033, 0.00021545772337272772,
+        0.000200675312019125, 0.00018515735049319241, 0.00016910159365566034,
+        0.00015274951196642825, 0.0001364083086595016, 0.00012048777735646132,
+        0.00010555935888591087, 9.243786046707068e-05, 8.224475300962007e-05,
+        7.629737748409314e-05, 7.559999031916625e-05, 8.015796718113755e-05,
+        8.894091773521042e-05, 0.00010055916327426786, 0.00011382064253994813,
+        0.00012786757262060896, 0.00014211249318413246, 0.00015614887670486788,
+        0.0001696856237845396, 0.00018250600117543378, 0.00019444299511867628,
+        0.00020536455531346845, 0.00021516463648983014, 0.00022375764459033447,
+        0.00023107490768014844, 0.00023706236940087712, 0.00024167903059791322,
+        0.0002448958529052835, 0.00024669494808802393, 0.0002470689427218388,
+        0.00024602044807024595, 0.00024356159036264307, 0.0002397135731581275,
+        0.0002345062546807145, 0.00022797773120588098, 0.00022017392430581973,
+        0.00021114817634170394, 0.0002009608665277798, 0.00018967907140543126,
+        0.00017737631270086976, 0.00016413247054927835, 0.00015003400886103867,
+        0.00013517480451458297, 0.00011965820027124925, 0.00010360171101533664,
+        8.714802565905721e-05, 7.049281348566993e-05, 5.3964793460535164e-05,
+        3.830230005688099e-05, 2.5779419036652536e-05, 2.2859743487358094e-05,
+        3.2342158656039556e-05, 4.719531283998282e-05, 6.361846562644961e-05,
+        8.046944625196266e-05, 9.731970178402454e-05, 0.00011395481077541682,
+        0.00013024148687849058, 0.00014608443725202045, 0.0001614099296809204,
+        0.0001761587518242938], [5.0099153202833574e-12, 1.5052077223486743e-11,
+        2.516140929757935e-11, 3.5383275196507497e-11, 4.57639199369345e-11,
+        5.63508392469406e-11, 6.719315863701961e-11, 7.834203575886735e-11,
+        8.985108404308649e-11, 1.0177682617963448e-10, 1.1417918218665813e-10,
+        1.2712199880334264e-10, 1.4067362567360001e-10, 1.5490754822335597e-10,
+        1.6990308355165257e-10, 1.8574615087969352e-10, 2.0253012633256115e-10,
+        2.2035679491402416e-10, 2.393374142107336e-10, 2.5959390479852223e-10,
+        2.8126018787246565e-10, 3.044836889212879e-10, 3.294270337652503e-10,
+        3.5626996419638545e-10, 3.8521150572928326e-10, 4.164724246862391e-10,
+        4.502980189978506e-10, 4.869612914722858e-10, 5.267665656224163e-10,
+        5.700536101001466e-10, 6.172023537181654e-10, 6.686382802470593e-10,
+        7.248386142217907e-10, 7.863394220795399e-10, 8.537437792153641e-10,
+        9.277311757086268e-10, 1.0090683684152029e-09, 1.0986219196591809e-09,
+        1.1973727118112237e-09, 1.3064327736627387e-09, 1.4270648242943842e-09,
+        1.560705008395908e-09, 1.7089893956741011e-09, 1.873784918640902e-09,
+        2.057225564338375e-09, 2.2617547825407714e-09, 2.4901752884180474e-09,
+        2.745707642455107e-09, 3.032059316473098e-09, 3.353506266077836e-09,
+        3.7149894911735296e-09, 4.122229577492e-09, 4.581862858341541e-09,
+        5.101603649268835e-09, 5.690437984010252e-09, 6.3588555050702444e-09,
+        7.1191277074396816e-09, 7.985642595526001e-09, 8.975308233048236e-09,
+        1.0108040609392336e-08, 1.1407355008975278e-08, 1.2901084804297165e-08,
+        1.4622257571288193e-08, 1.661016603346903e-08, 1.8911681038067995e-08,
+        2.1582866181560714e-08, 2.469096959586282e-08, 2.8316888944875115e-08,
+        3.255823224714924e-08, 3.7533131571381455e-08, 4.338501165625298e-08,
+        5.028857441154991e-08, 5.845733781513201e-08, 6.815317003693955e-08,
+        7.969839587585512e-08, 9.349123398548902e-08, 1.1002556729401736e-07,
+        1.2991637724403731e-07, 1.539326182771518e-07, 1.8303991708235984e-07,
+        2.1845631469226434e-07, 2.6172542189092653e-07, 3.1481295947559554e-07,
+        3.802348954904714e-07, 4.6122855112651845e-07, 5.619825334012154e-07,
+        6.879477774003113e-07, 8.46261254239858e-07, 1.046327406945505e-06,
+        1.3006222346721338e-06, 1.6258144142162843e-06, 2.044342066839251e-06,
+        2.586650833121841e-06, 3.2944018352749348e-06, 4.2251180424624194e-06,
+        5.458989505518589e-06, 7.108960522009178e-06, 9.33587537842929e-06,
+        1.2371538106260162e-05, 1.6554355465790433e-05, 2.2385342932218707e-05,
+        3.061772578119956e-05, 4.2403156319532616e-05, 5.953561730616815e-05,
+        8.486836016304975e-05, 0.00012304653474597078, 0.0001818354119391809,
+        0.0002746163103770003, 0.00042527645351301196, 0.0006782721421583939,
+        0.0011206023888681474, 0.0019334275864396656, 0.0035251598907212996,
+        0.006919926398992373, 0.01511028281734006, 0.03929184006606896,
+        0.14917087861025627, 3.4020667065570143, 0.6938966832882522, 1.546844135745234,
+        1.788170272810942, 0.9183387978285272, 0.9707112932496729, 1.7297549578251992,
+        2.2999983600254033, 1.1793086166551399, 1.0120820701256765, 1.6029889264868336,
+        3.518040762225469, 2.6372224092729284, 1.7294043235006935, 1.1830563492223711,
+        1.0746554881721861, 1.1746441623709247, 1.4876190112568974, 2.135096239577242,
+        2.811203154591255, 2.347152452986082, 1.7622024291744605, 1.4785090011810065,
+        1.3950061808908851, 1.4650413922511625, 1.6991823407284543, 2.0794408350532883,
+        2.2006366785617253, 1.7500338203595176, 1.312703205758498, 1.0654223689658902,
+        0.9561008966699943, 0.9504726775406669, 1.0473568822213393, 1.2588159418354845,
+        1.5017699134179756, 1.4883341371816927, 1.2726596483476331, 1.111953593176493,
+        1.0625068155282207, 0.9304124591835677, 0.8923784255172349, 0.9061685453841711,
+        0.9276465960298705, 0.9221724449883483, 0.8735371223244226, 0.7966342333014694,
+        0.7172582288599736, 0.6508905060049308, 0.601842074209236, 0.5691431322534114,
+        0.5501582655902894, 0.541630467252825, 0.5393656423116714, 0.5374920791627242,
+        0.5285797196983516, 0.5062751450322538, 0.46964431989711897, 0.424208292850354,
+        0.3776874645585186, 0.3355958417400051, 0.3002655775679808, 0.2719201107647648,
+        0.24985072629686286, 0.23310507751958431, 0.22078807442672155, 0.21216167111796475,
+        0.20665981860369143, 0.20387351712704557, 0.20352834386635701, 0.2054623567080364,
+        0.2096062596987061, 0.21596497830259292, 0.2245979402998077, 0.2355933242361701,
+        0.24902890146670895, 0.26490917609175446, 0.28306739308072393, 0.30302755518073804,
+        0.32384719690114505, 0.34401658923664385, 0.361554932357024, 0.3744297119478295,
+        0.38122187447523226, 0.38166284294688274, 0.3766532387955669, 0.36777409806415134,
+        0.35667073148575634, 0.3446446691128471, 0.3325214476390742, 0.32069431401724147,
+        0.30923265660955934, 0.2979939828032567, 0.28672059250796333, 0.2751212404287298,
+        0.2629405706303648, 0.250014050422115, 0.23630101729022757, 0.22188867524209974,
+        0.20696684955506967, 0.191783135394533, 0.17659425109818339, 0.1616282485574266,
+        0.1470655467136095, 0.13303930955497845, 0.11965102805754621, 0.10699585717592701,
+        0.09519286753902437, 0.08441590503202716, 0.0749190427197737, 0.06704393535227238,
+        0.06118398077286543, 0.057676401760764204, 0.056639254611657426,
+        0.05786564263202126, 0.060886350756652184, 0.06514694707684963,
+        0.0701529096264373, 0.07552279858703316, 0.08097971250385111, 0.0863229038064212,
+        0.09140159730180211, 0.09609767522398631, 0.10031707209099916, 0.10398736988852364,
+        0.10705848857691085, 0.10950359768287825, 0.11131820041355926, 0.11251655183827479,
+        0.1131257980171055, 0.11317907418658318, 0.1127090760681473, 0.11174337774891951,
+        0.11030223237600247, 0.10839898452381354, 0.10604268764825674, 0.10324211896215506,
+        0.10001015255002484, 0.09636743216793826, 0.09234451305840972, 0.08798209572826982,
+        0.08332954286202704, 0.07844237875837633, 0.07337976163263825, 0.0682029329973353,
+        0.06297544438788491, 0.05776567004070221, 0.052651849528394835,
+        0.04772967313204722, 0.04312199322704548, 0.03898891735483244, 0.03553296050061201,
+        0.03298728467910906, 0.03157088948518803, 0.03141151573079156, 0.032481510517787235,
+        0.034605888650926224, 0.03753627367852538, 0.041027027358680856,
+        0.04487410324233115, 0.04892152710187348, 0.053053393511889986,
+        0.057183057120602836, 0.06124408185426303, 0.06518391537731454,
+        0.06895997750509761, 0.07253753166737939, 0.07588870244718729, 0.07899208875044342,
+        0.0818325428771172, 0.08440082496881138, 0.08669298589033078, 0.08870946012988715,
+        0.09045394563275175, 0.09193219968794739, 0.09315089086620303, 0.0941166272520576,
+        0.09483524543070715, 0.09531140576805511, 0.09554850549860153, 0.09554889460995132,
+        0.09531435888041354, 0.09484681635464488, 0.09414915530739772, 0.0932261231749448,
+        0.09208516024893001, 0.09073706503962747, 0.08919638672142094, 0.08748146795772006,
+        0.08561410746394202, 0.08361886823409259, 0.08152211221700442, 0.07935088234967616,
+        0.07713176927947443, 0.07488989060704024, 0.07264808000470982, 0.07042634150287186,
+        0.06824158088278542, 0.06610758955213675, 0.06403523092562674, 0.0620327660338261,
+        0.06010625236242406, 0.05825995527056723, 0.0564967222360604, 0.05481828454945126,
+        0.05322546718418051, 0.05171830389269432, 0.05029606936282449, 0.048957251833638006,
+        0.047699496305706766, 0.04651954946393039, 0.04541323266876796,
+        0.04437546012216569, 0.04340030767708946, 0.0424811264424655, 0.04161068677844737,
+        0.04078133420112202, 0.03998513960248511, 0.03921403134824817, 0.03845990457646813,
+        0.037714711236015275, 0.03697054104986571, 0.03621970708686058,
+        0.03545484920578361, 0.03466906429908359, 0.033856064845969605,
+        0.03301035823293423, 0.032127430603580434, 0.03120391276338675,
+        0.0302377038398762, 0.029228032033993673, 0.028175440782304783,
+        0.027081701329123166, 0.025949666335351812, 0.024783090545398206,
+        0.023586451100107774, 0.022364800581833696, 0.02112368072788877,
+        0.019869115880312167, 0.018607695306183485, 0.01734674541080132,
+        0.016094588726937278, 0.014860887430007259, 0.013657073708022447,
+        0.012496872133122373, 0.011396906505051863, 0.010377326592122676,
+        0.009462238643068263, 0.008679423463341268, 0.008058425628744339,
+        0.007626008030956735, 0.007399081892994756, 0.0073778523588583726,
+        0.0075436887732896075, 0.007863709607398793, 0.00829905922597002,
+        0.008812145713032966, 0.00937056790810383, 0.009948179440472871,
+        0.010524616726047362, 0.011084307052627279, 0.011615463442342626,
+        0.012109240450283547, 0.012559072339337621, 0.012960164502236918,
+        0.01330910267548531, 0.013603552485834154, 0.013842031378914071,
+        0.014023741564960642, 0.014148455555980299, 0.014216445983737351,
+        0.014228450023842723, 0.014185657261551098, 0.014089709291884987,
+        0.013942700370070582, 0.013747171097855856, 0.013506091024964011,
+        0.013222830371152775, 0.01290112491014028, 0.012545040601502968,
+        0.012158945337737377, 0.011747494144635124, 0.011315631659055829,
+        0.010868612262704046, 0.010412034440598064, 0.009951882156747721,
+        0.009494562371111065, 0.009046924034470412, 0.008616239606196318,
+        0.008210125334139175, 0.007836372409760043, 0.0075026611794169066,
+        0.007216141124524851, 0.006982887453207062, 0.0068072926710462025,
+        0.0066915059803006076, 0.006635065087512568, 0.006634841621309624,
+        0.006685337165202279, 0.00677925894606003, 0.006908229655925043,
+        0.007063477685620443, 0.007236400512532901, 0.007418958060213824,
+        0.007603903446363598, 0.007784884692059342, 0.007956457000893946,
+        0.008114040303045678, 0.008253848297628673, 0.008372807150985742,
+        0.008468475625375333, 0.00853897370287092, 0.00858292330627209,
+        0.008599402129229319, 0.008587909668693064, 0.008548343260136504,
+        0.008480981267309581, 0.008386470579223097, 0.00826581614749976,
+        0.00812037129444081, 0.007951828696614776, 0.007762213024510784,
+        0.007553876944003305, 0.007329502366341304, 0.007092108362768289,
+        0.006845065991191113, 0.0065921183947665555, 0.006337401878003754,
+        0.006085460153096564, 0.005841239529590885, 0.005610047757619905,
+        0.005397454625396701, 0.005209110898541889, 0.0050504682915060335,
+        0.004926402062079959, 0.0048407712485536705, 0.004795991590228152,
+        0.004792722607985212, 0.004829759922149431, 0.004904170206432651,
+        0.005011632049432803, 0.0051468902655041615, 0.005304218996540661,
+        0.005477815653560542, 0.005662089702721692, 0.005851845671475558,
+        0.00604237945591826, 0.006229512740092402, 0.006409587898198291,
+        0.006579440322367984, 0.006736359728125198, 0.006878047814814309,
+        0.00700257681109768, 0.007108351606700631, 0.007194076979780828,
+        0.0072587305842414206, 0.007301541696693941, 0.0073219751797942625,
+        0.007319719708575447, 0.0072946790691067, 0.007246965308284232,
+        0.00717689269536676, 0.007084971816289597, 0.006971903592693962,
+        0.006838573510095073, 0.006686046764807207, 0.006515565329730894,
+        0.006328548061752392, 0.006126594935203225, 0.0059114963257630845,
+        0.005685248036925065, 0.005450072493850284, 0.005208446208308059,
+        0.004963133129204311, 0.004717222572557309, 0.004474168607156355,
+        0.004237824380268235, 0.004012459106513114, 0.003802736888282477,
+        0.003613626248496139, 0.0034502018451550375, 0.0033173053733914605,
+        0.0032190648429099326, 0.003158336186051434, 0.003136207092702021,
+        0.0031517356810185203, 0.0032020367038345958, 0.0032826926385851997,
+        0.0033883438055286423, 0.0035132780313876957, 0.003651894560731448,
+        0.0037990000477142478, 0.003949955405629334, 0.00410071712289126,
+        0.00424781612534224, 0.0043883063173161645, 0.004519703064168621,
+        0.004639922784857116, 0.004747228937713122, 0.004840186264138554,
+        0.004917623330512778, 0.004978602518168013, 0.005022396241305404,
+        0.005048468092067222, 0.005056457699381361, 0.00504616827873531,
+        0.005017556102869655, 0.004970721403193954, 0.004905900487612707,
+        0.0048234591046018675, 0.004723887278352075, 0.004607795982289803,
+        0.004475916122276092, 0.0043291003995662505, 0.004168328764966593,
+        0.003994718425333247, 0.003809539799240242, 0.003614240532551245,
+        0.0034104807908872836, 0.003200184662547704, 0.002985614725225775,
+        0.0027694795407879227, 0.0025550862494509814, 0.0023465497232420178,
+        0.002149058074917788, 0.0019691535532468485, 0.001814886894059858,
+        0.0016955246784878578, 0.0016203446652114594, 0.0015963391208378718,
+        0.001625696459910611, 0.001704844934960745, 0.0018259003819209717,
+        0.001979309500554781, 0.0021559718277181163, 0.0023482255776487468,
+        0.002550003342634915, 0.0027566191710399245, 0.0029644710840618033,
+        0.0031707750247110503, 0.003373359002769275, 0.0035705132881019923,
+        0.003760884221087845, 0.003943399654175743, 0.004117216669712277,
+        0.004281684814802979, 0.004436320103297756, 0.004580786458013051,
+        0.0047148822396341555, 0.004838530170487983, 0.004951769421879149,
+        0.005054748961640224, 0.005147721504113341, 0.005231037589377032,
+        0.005305139460012441, 0.005370554505795165, 0.005427888116705962,
+        0.005477815826381814, 0.005521074648683097, 0.005558453519117531,
+        0.005590782759216411, 0.0056189224966841774, 0.005643750005305726,
+        0.00566614598163185, 0.0056869798522371446, 0.005707094302657162,
+        0.005727289329183806, 0.005748306225833026, 0.005770812016548493,
+        0.0057953849120241, 0.005822501397571383, 0.005852525534382166,
+        0.005885700978088982, 0.005922146090335404, 0.005961852353324722,
+        0.006004686111438567, 0.006050393479125649, 0.006098608090017453,
+        0.0061488612350039185, 0.0062005938566021546, 0.0062531698357122705,
+        0.0063058900208822835, 0.006358006499849194, 0.006408736686686775,
+        0.006457276883181558, 0.0065028150587621535, 0.006544542672318821,
+        0.0065816654260540276, 0.006613412894815826, 0.00663904701462913,
+        0.006657869443207152, 0.0066692278262405185, 0.006672521018285523,
+        0.006667203318551149, 0.0066527877909888416, 0.006628848745416972,
+        0.006595023462108784, 0.0065510132459560486, 0.006496583897814825,
+        0.006431565689958835, 0.006355852929338163, 0.006269403187540518,
+        0.006172236270036743, 0.006064432990176052, 0.005946133806493346,
+        0.005817537374685886, 0.005678899060731848, 0.0055305294570552836,
+        0.005372792943297598, 0.0052061063351455, 0.005030937673914274,
+        0.0048478052248119964, 0.0046572767790782, 0.00445996939576939,
+        0.004256549780599356, 0.004047735587251105, 0.0038342980554342135,
+        0.0036170665871022955, 0.0033969361378389912, 0.003174878714726388,
+        0.0029519608997480395, 0.0027293702809048103, 0.002508455144553434,
+        0.0022907839868721233, 0.0020782345172760384, 0.0018731255793500636,
+        0.001678407751296408, 0.0014979216538460152, 0.0013366951528687974,
+        0.0012011340076305734, 0.0010987172847754915, 0.0010365833313467714,
+        0.0010188526444541144, 0.0010441768234115123, 0.0011058567534941806,
+        0.001194545330394628, 0.0013011126167021341, 0.0014180808944638298,
+        0.001539826448568293, 0.0016622584461973256, 0.001782415106681815,
+        0.0018981317158791424, 0.0020078023693430986, 0.002110217642950583,
+        0.0022044558231372772, 0.002289810004135321, 0.00236573878422113,
+        0.0024318324608772275, 0.0024877894649556675, 0.002533399624956407,
+        0.002568532042112917, 0.0025931261219663765, 0.0026071848035201855,
+        0.002610769351537173, 0.0026039952926643706, 0.0025870292212044526,
+        0.0025600863010392066, 0.0025234283638015196, 0.0024773625625408597,
+        0.002422240594637451, 0.0023584585664532497, 0.00228645764379058,
+        0.0022067257272532495, 0.002119800524807592, 0.002026274585716358,
+        0.0019268031452609113, 0.0018221160593068911, 0.0017130357650626522,
+        0.0016005042113590425, 0.0014856232272606738, 0.0013697150135546388,
+        0.0012544123258481181, 0.001141790537461277, 0.0010345521641439118,
+        0.0009362563621424106, 0.0008515223048694609, 0.0007859855782165761,
+        0.000745591516901608, 0.000734927675148327, 0.0007552428523301253,
+        0.0008037904855906385, 0.0008751741775168805, 0.0009633907670489112,
+        0.0010631566307995207, 0.0011703134138924016, 0.001281735904475933,
+        0.0013950976854164132, 0.0015086500900885395, 0.0016210541223375926,
+        0.001731262532602596, 0.0018384395598415443, 0.0019419067174948823,
+        0.0020411060300042087, 0.0021355748564274857, 0.002224928418758262,
+        0.002308847486923582, 0.002387069544007624, 0.002459382320813351,
+        0.0025256189566644684, 0.0025856542841081777, 0.0026394018944170556,
+        0.0026868117468978273, 0.002727868156824337, 0.0027625880453125244,
+        0.0027910193679268934, 0.0028132396617775116, 0.002829354666935669,
+        0.002839496989400357, 0.0028438247808775124, 0.0028425204164236407,
+        0.002835789155160367, 0.002823857772173925, 0.002806973151670441,
+        0.0027854008327009073, 0.002759423499433346, 0.0027293394081071448,
+        0.002695460742749709, 0.0026581118912983115, 0.002617627633176165,
+        0.0025743512287864957, 0.002528632400520391, 0.0024808251943240146,
+        0.0024312857103540183, 0.0023803696913588263, 0.002328429958383227,
+        0.0022758136856384998, 0.0022228595108192465, 0.0021698944837668806,
+        0.0021172308665520843, 0.0020651628114329488, 0.002013962960299076,
+        0.00196387902936871, 0.001915130465314666, 0.0018679052812902296,
+        0.0018223572015467898, 0.0017786032575775128, 0.0017367219842340537,
+        0.0016967523574800492, 0.0016586935947353082, 0.0016225059035438296,
+        0.0015881122167214269, 0.0015554008957475388, 0.0015242293255620517,
+        0.001494428268817216, 0.0014658068033675167, 0.0014381576375907992,
+        0.0014112625869679278, 0.0013848980021187814, 0.0013588399607707712,
+        0.0013328690696270127, 0.0013067747622438415, 0.0012803590203477328,
+        0.001253439485292421, 0.0012258519599098552, 0.001197452328047298,
+        0.0011681179387254604, 0.001137748514907654, 0.0011062666543902636,
+        0.0010736179936193938, 0.0010397711059055255, 0.0010047172049665798,
+        0.0009684697240489955, 0.0009310638418626634, 0.000892556029679551,
+        0.0008530237014423654, 0.0008125650618720991, 0.0007712992690392573,
+        0.0007293670615236666, 0.000686932050627713, 0.0006441829529677159,
+        0.000601337146702023, 0.0005586460858425782, 0.0005164033067760241,
+        0.0004749559918060124, 0.00043472123051016505, 0.00039620796924985993,
+        0.00036004445549232925, 0.00032700719266822885, 0.00029803829643375003,
+        0.0002742214593954372, 0.0002566689578865595, 0.0002462839021252174,
+        0.00024344827405587145, 0.0002478141914968882, 0.0002583687891867052,
+        0.0002737336543404303, 0.00029249224794946005, 0.00031339424670158975,
+        0.00033542523086156194, 0.0003577967371241469, 0.00037990685506629013,
+        0.0004012979851239207, 0.000421621445051875, 0.0004406105768497868,
+        0.00045806117852578487, 0.0004738175119358637, 0.0004877623340359333,
+        0.0004998097641983623, 0.0005099001342803572, 0.0005179962251850784,
+        0.0005240804781125986, 0.0005281528972483774, 0.0005302294491660387,
+        0.0005303408253344379, 0.000528531476568861, 0.00052485885833387,
+        0.000519392847548357, 0.0005122153078259762, 0.0005034197927231574,
+        0.0004931113868013204, 0.000481406692814184, 0.00046843398044549604,
+        0.00045433351746925783, 0.00043925810718177126, 0.00042337385447526816,
+        0.00040686117351671955, 0.0003899160264143549, 0.0003727513348066823,
+        0.0003555984201361045, 0.0003387081841405462, 0.00032235151810631704,
+        0.0003068181190883827, 0.00029241252538150325, 0.0002794458841106699,
+        0.00026822199718692816, 0.0002590169598968213, 0.0002520535517557741,
+        0.0002474742914547989, 0.00024531958545761937, 0.0002455178128484422,
+        0.00024789128809541984, 0.0002521768188696246, 0.00025805493143617083,
+        0.0002651802600399927, 0.0002732072440319022, 0.00028180839800283445,
+        0.00029068515411605553, 0.0002995727850409916, 0.0003082413106651617,
+        0.0003164940495514031, 0.00032416501792740404, 0.0003311159412239782,
+        0.0003372333117875397, 0.0003424257069854671, 0.00034662145030087604,
+        0.00034976662609770027, 0.0003518234238482007, 0.0003527687741882606,
+        0.0003525932372698513, 0.0003513001078076081, 0.00034890470759922306,
+        0.0003454338435351287, 0.0003409254162378666, 0.00033542817112715116,
+        0.00032900158956239233, 0.0003217159224952803, 0.00031365237220053194,
+        0.00030490342816067134, 0.00029557335934206813, 0.0002857788539927916,
+        0.00027564977530527684, 0.00026532996010981627, 0.00025497791962867235,
+        0.0002447671967270497, 0.00023488598740528346, 0.00022553545362079567,
+        0.0002169259802533161, 0.00020927055588970773, 0.00020277464541393998,
+        0.00019762255600301536, 0.00019396144888812107, 0.00019188556771633245,
+        0.00019142426778264232, 0.00019253721771741186, 0.000195118394394367,
+        0.00019900788174210228, 0.00020400834311661736, 0.00020990235497382107,
+        0.00021646756153113986, 0.00022348807639063255, 0.0002307619080902711,
+        0.00023810501551938012, 0.00024535290250670045, 0.0002523606235549844,
+        0.00025900188620206553, 0.0002651677247371702, 0.00027076504274466904,
+        0.0002757151934752168, 0.00027995268260606383, 0.0002834240266934651,
+        0.00028608677189196805, 0.0002879086630415469, 0.0002888669472861642,
+        0.00028894779528006306, 0.000288145824562113, 0.00028646371246444176,
+        0.0002839118893620131, 0.000280508306732651, 0.0002762782783281273,
+        0.00027125439668618825, 0.00026547653131880216, 0.00025899191921672495,
+        0.0002518553628141457, 0.00024412955507669258, 0.00023588555544384312,
+        0.00022720344286866293, 0.00021817317092498779, 0.00020889564085247486,
+        0.00019948398415319175, 0.00019006499503243187, 0.00018078055649840241,
+        0.00017178873892537678, 0.0001632639951776415, 0.00015539553656778512,
+        0.0001483826284692412, 0.0001424254180558002, 0.0001377104004604681,
+        0.0001343911619557827, 0.00013256755576493157, 0.00013226886152392246,
+        0.00013344680293098422, 0.00013598137544273755, 0.0001396975698931993,
+        0.00014438736586795374, 0.00014983087931846444, 0.0001558127117715296,
+        0.00016213234588037596, 0.00016860936294488862, 0.00017508500594114865,
+        0.00018142156152902117, 0.00018750066062672672, 0.00019322119651475714,
+        0.0001984972496161215, 0.00020325620504039828, 0.00020743713023890314,
+        0.00021098941757081462, 0.00021387166765228787, 0.0002160507790750139,
+        0.00021750120926648065, 0.00021820437477967035, 0.00021814816448456113,
+        0.00021732654461249022, 0.00021573923987169665, 0.00021339147975081154,
+        0.00021029380377641577, 0.0002064619240524239, 0.00020191664832398717,
+        0.00019668387238044608, 0.00019079465762270457, 0.00018428541881100133,
+        0.00017719825974628895, 0.00016958151275912135, 0.00016149056407273682,
+        0.00015298908531407115, 0.000144150846731224, 0.0001350623657334932,
+        0.0001258267478628536, 0.00011656919430802016, 0.00010744472121184507,
+        9.864847245583972e-05, 9.042811815411823e-05, 8.309518405130434e-05,
+        7.702635309578704e-05, 7.26374330511461e-05, 7.031115811678901e-05,
+        7.028563004365141e-05, 7.256222774421781e-05, 7.690557642152448e-05,
+        8.293588440974885e-05, 9.024117243593212e-05, 9.845012051800701e-05,
+        0.00010725843501526985, 0.00011642760479687172, 0.00012577348865334414,
+        0.00013515378641768352, 0.00014445758893116416, 0.00015359752572273976,
+        0.00016250412842128175, 0.00017112186123272407, 0.00017940634072095794,
+        0.0001873223845249558, 0.00019484263251769285, 0.00020194656207444365],
+    [1.3441819809312725e-11, 4.039042614540808e-11, 6.753449212597703e-11,
+        9.500617897639287e-11, 1.2294045210504612e-10, 1.5147625952828523e-10,
+        1.8075774832006321e-10, 2.1093555943915277e-10, 2.421681997428723e-10,
+        2.7462351892208977e-10, 3.084803093979317e-10, 3.439300533147187e-10,
+        3.811788381360788e-10, 4.2044947548916155e-10, 4.6198384931997407e-10,
+        5.060455351888019e-10, 5.529227294087188e-10, 6.029315372697535e-10,
+        6.564196767029625e-10, 7.137706577950608e-10, 7.754085175606457e-10,
+        8.418031886502603e-10, 9.134766066822813e-10, 9.910096693490943e-10,
+        1.0750501823618191e-09, 1.1663219491006609e-09, 1.2656351914603455e-09,
+        1.373898513979798e-09, 1.4921326707826142e-09, 1.6214864296974793e-09,
+        1.7632548959616546e-09, 1.918900704768105e-09, 2.0900785886388334e-09,
+        2.2786639027288896e-09, 2.4867858165748265e-09, 2.7168660046789623e-09,
+        2.971663844571339e-09, 3.2543293165624174e-09, 3.5684650569154647e-09,
+        3.918199292141972e-09, 4.308271763552442e-09, 4.744135168994273e-09,
+        5.2320752154679616e-09, 5.779353018633508e-09, 6.394374439749455e-09,
+        7.0868919303174684e-09, 7.868245798027618e-09, 8.751653290424077e-09,
+        9.752556010557507e-09, 1.088903854171e-08, 1.2182334415445585e-08,
+        1.3657439490227012e-08, 1.5343857865819604e-08, 1.72765119753988e-08,
+        1.949685674080858e-08, 2.2054248346127444e-08, 2.500763207667026e-08,
+        2.842763148483883e-08, 3.239914478765455e-08, 3.702458512385963e-08,
+        4.242794215445242e-08, 4.8759896788955545e-08, 5.620429346661689e-08,
+        6.498637244651188e-08, 7.53832977362249e-08, 8.773769872404443e-08,
+        1.0247519536980699e-07, 1.2012722808527923e-07, 1.4136100804870624e-07,
+        1.6701910735980375e-07, 1.9817222243077726e-07, 2.361901233000053e-07,
+        2.8283799129959203e-07, 3.4040863884652367e-07, 4.1190614378271284e-07,
+        5.013042912701251e-07, 6.139157622935112e-07, 7.569285310592044e-07,
+        9.402004996009327e-07, 1.1774635730376733e-06, 1.4881972575686436e-06,
+        1.9006380635031795e-06, 2.456803254676168e-06, 3.2212876864599296e-06,
+        4.297630432448579e-06, 5.861275941870886e-06, 8.23349456560339e-06,
+        1.2074801712505138e-05, 1.9029137174066963e-05, 3.508760516684625e-05,
+        0.0001756668754742054, 7.394068330665075e-05, 6.266310199234124e-05,
+        6.272074964862269e-05, 6.72631161357249e-05, 7.510034305863155e-05,
+        8.623588045859682e-05, 0.00010121017900505334, 0.0001209952639008808,
+        0.0001470569106157113, 0.00018152258722923102, 0.00022746897396548987,
+        0.0002893847580014453, 0.00037391557223087857, 0.0004910841458207808,
+        0.0006563391627646923, 0.0008941007147913138, 0.0012441156897746318,
+        0.0017733313222106735, 0.0025991955711073263, 0.003938181882236926,
+        0.006214570231049418, 0.010328399160389785, 0.018404034887080038,
+        0.03629254417845405, 0.08469537560393524, 0.286367912733622, 5.762179266763,
+        1.0250643434382423, 1.965502365855392, 1.9229284040371977, 0.8218645852296415,
+        0.7154529963482354, 1.065547145956658, 1.2678945774393504, 0.644687080410972,
+        0.5599679830797905, 0.6790233748900277, 1.0646100973568449, 1.8888937715691523,
+        1.6457080059867586, 1.166531464776255, 1.010078793172014, 1.0354157796726142,
+        1.2323064819822234, 1.6715778809207267, 2.0917304354614528, 1.6678260252314847,
+        1.2008676267278584, 0.9701847060477871, 0.885380018008818, 0.9043393203617651,
+        1.0277567049322074, 1.2451907165429306, 1.3227837181868605, 1.074493572505189,
+        0.8396367324907568, 0.7235492584178573, 0.6993465051061978, 0.7533728265044609,
+        0.8962177425196003, 1.148416108825137, 1.4346762546152607, 1.4602115084177174,
+        1.2595795599481594, 1.0934187911962714, 1.0225704941415332, 0.8854460516940771,
+        0.8434307718142883, 0.8445913479302449, 0.8500927219824341, 0.829803081677749,
+        0.7714966937393363, 0.690593166054311, 0.6105040121699212, 0.5442210645944512,
+        0.49458977194188825, 0.4599817776544668, 0.4375619855740402, 0.4242094550114217,
+        0.4162952200688553, 0.4091485574525899, 0.39719984374488876, 0.3759572387733794,
+        0.345077886637417, 0.3088547250348043, 0.2729297933398417, 0.24113569623480563,
+        0.2149270520550764, 0.19425010919672425, 0.17842346449398408, 0.16663465061828067,
+        0.15814865726472507, 0.1523717432419555, 0.14885594655792034, 0.14728342244917525,
+        0.1474462073608827, 0.14922691132297644, 0.15258171452925956, 0.15752509541964574,
+        0.16411430750469688, 0.1724300549246524, 0.1825478111246113, 0.1944919922094484,
+        0.20816421393804158, 0.2232414452824817, 0.2390584315670936, 0.25452922296030506,
+        0.2682114893984519, 0.27860922699615764, 0.28466178951601734, 0.2861467469143682,
+        0.28370571087474145, 0.27849349770188936, 0.27172632739799757, 0.26437764634476685,
+        0.2570751522514377, 0.2501277707934336, 0.24360129227475022, 0.2373974853525533,
+        0.23132280892777382, 0.2251473667318102, 0.2186568507473921, 0.21169628275597094,
+        0.2041998080192359, 0.19619990050360875, 0.18781380062574696, 0.1792124872012529,
+        0.17058309613438835, 0.16209604456458862, 0.15388385844177072, 0.14603317720897235,
+        0.13858751597930213, 0.13155691575012998, 0.12493083997680902, 0.1186914659304542,
+        0.11282519486886701, 0.10733067442374758, 0.10222215450604, 0.09752784202794462,
+        0.0932840362004173, 0.08952683052048571, 0.08628360337017399, 0.08356621279336249,
+        0.08136699415414192, 0.07965777071727402, 0.07839147213877584, 0.07750571104224101,
+        0.07692768124860369, 0.07657982509891857, 0.07638573051042394, 0.0762756350456064,
+        0.07619082616159575, 0.07608627759522271, 0.07593113940440246, 0.07570715627887702,
+        0.07540555835001977, 0.07502326851366006, 0.07455931148802487, 0.07401212797879214,
+        0.07337819902389135, 0.07265207230424726, 0.07182760989008646, 0.07090006385739987,
+        0.06986844376908145, 0.06873759223714711, 0.06751946029707878, 0.0662332767086248,
+        0.06490458857641236, 0.06356342595744736, 0.06224201884355326, 0.060972523699616095,
+        0.059785115239601, 0.05870662996797374, 0.05775978170282088, 0.05696285350733937,
+        0.05632971984055222, 0.05587005634767949, 0.05558962964093618, 0.055490602342857964,
+        0.05557182295243961, 0.05582908871096199, 0.056255374758611316,
+        0.05684102255356261, 0.05757388357963695, 0.058439425657549775,
+        0.059420827539141303, 0.060499106856311304, 0.061653338918930885,
+        0.06286102245383497, 0.06409862955438643, 0.0653423419620219, 0.06656893046271467,
+        0.06775668954099746, 0.06888630841293021, 0.0699415533499926, 0.07090965941435322,
+        0.07178137777120175, 0.07255068491682568, 0.07321421620489484, 0.07377052444261929,
+        0.0742192785992076, 0.07456050953484789, 0.07479398645032011, 0.07491877864649414,
+        0.07493302963899366, 0.0748339486809174, 0.07461800871035235, 0.07428132755452244,
+        0.0738201979394911, 0.07323171929044703, 0.07251447032051334, 0.07166914846220154,
+        0.07069909485989202, 0.06961062715330632, 0.06841312010951467, 0.0671188060409656,
+        0.06574230776086823, 0.06429995784000696, 0.06280898941855384, 0.0612866987045412,
+        0.059749675235153656, 0.05821317596738276, 0.05669068976339505,
+        0.05519370725082819, 0.053731683397150135, 0.052312159919847966,
+        0.05094100276954329, 0.04962270556464772, 0.04836071144306353, 0.047157711743454775,
+        0.04601588898332813, 0.04493708275624258, 0.0439228695322253, 0.04297455972807129,
+        0.04209312648733586, 0.04127908887425597, 0.04053237643400408, 0.03985220166209129,
+        0.03923696214483109, 0.038684186074570456, 0.03819052535648019,
+        0.03775179165157555, 0.037363024292872755, 0.03701857621269405,
+        0.03671220509086751, 0.036437161204653665, 0.03618626956306047,
+        0.035952010166060026, 0.0357266050024422, 0.035502122442027016,
+        0.03527060830168037, 0.035024248092005744, 0.0347555575195883, 0.03445758968101288,
+        0.034124139503085654, 0.033749921031279106, 0.03333069292087421,
+        0.03286331278045259, 0.032345711252207206, 0.03177678986593694,
+        0.0311562597872823, 0.030484448527765027, 0.02976210623963952, 0.028990241521597685,
+        0.02817000938365096, 0.027302662920722524, 0.02638956775071465,
+        0.025432266765338628, 0.024432574327677144, 0.023392675162950176,
+        0.022315204473798273, 0.021203291972430902, 0.020060562318096196,
+        0.018891095849726078, 0.017699364247923958, 0.016490163931859023,
+        0.015268574754111978, 0.014039973633664642, 0.012810134793585918,
+        0.01158545513236611, 0.010373363124618357, 0.009183016450082248,
+        0.008026491763763731, 0.00692085877168215, 0.005891836779395463,
+        0.00497993971688675, 0.00424855973818278, 0.0037848908195258868,
+        0.003668025671399649, 0.003903681962571989, 0.004410895589752745,
+        0.005085700835122453, 0.005848648648232988, 0.0066494092249310376,
+        0.007457355440755448, 0.00825340667364066, 0.009025106381902615,
+        0.009763895928090382, 0.010463621695763228, 0.011119708404333207,
+        0.0117286923777206, 0.012287949307801875, 0.012795525043341612,
+        0.013250018409127937, 0.01365048876709213, 0.013996375750913932,
+        0.014287427755820696, 0.014523640862486243, 0.014705211778038978,
+        0.014832507834328683, 0.014906054926762936, 0.014926541408744557,
+        0.014894833259877985, 0.014811994044585431, 0.014679302734012582,
+        0.014498263492255256, 0.014270603786990613, 0.0139982601435597,
+        0.01368335383286986, 0.013328161109481994, 0.012935083821891988,
+        0.012506626138675354, 0.01204538192564636, 0.011554035390753477,
+        0.011035375566094026, 0.010492323621382825, 0.009927971432460566,
+        0.009345630651392982, 0.008748893984288216, 0.00814171465948, 0.007528516365260619,
+        0.006914354686622781, 0.006305162921473294, 0.005708130402571237,
+        0.005132277170112601, 0.0045892892973608415, 0.004094609100490455,
+        0.003668485970011394, 0.0033359360555733275, 0.003123424607289275,
+        0.0030504686229022005, 0.0031195258336271445, 0.0033132874467851994,
+        0.003602670040567334, 0.003957534292908345, 0.0043527385367545185,
+        0.004769352228763216, 0.005193673239483289, 0.005615836393640819,
+        0.006028654219743872, 0.006426787926535736, 0.00680618679510653,
+        0.007163716223497072, 0.007496912212681137, 0.007803819653755562,
+        0.008082886128550076, 0.008332892262160154, 0.008552905567597364,
+        0.008742248598578764, 0.008900475010405954, 0.009027349335248255,
+        0.009122828118639324, 0.009187041570393623, 0.009220275999209935,
+        0.009222957964750454, 0.009195641279518574, 0.009138997778342211,
+        0.009053812267448658, 0.00894098143236123, 0.008801515900495348,
+        0.008636544271527278, 0.008447317844793462, 0.008235215016086449,
+        0.008001744843417806, 0.007748549991108641, 0.007477410026362583,
+        0.007190246737820517, 0.006889133680253639, 0.0065763124942833096,
+        0.006254218721914717, 0.005925519891301877, 0.0055931685975223145,
+        0.005260473046932301, 0.004931186636626144, 0.004609615582595231,
+        0.004300737354268303, 0.004010309320383348, 0.0037449222872692283,
+        0.0035119159014756576, 0.0033190334282800194, 0.0031736927798573325,
+        0.0030818600888769658, 0.0030467678702268504, 0.0030679895831822665,
+        0.003141367090047019, 0.0032598625522151335, 0.0034149056355709676,
+        0.003597666499304077, 0.0037999185708136474, 0.004014456762776378,
+        0.004235197114118946, 0.004457103540619473, 0.004676045846235728,
+        0.00488864670217734, 0.005092143229329693, 0.005284271228160726,
+        0.00546317203401533, 0.005627319047073705, 0.005775460432227367,
+        0.005906574828649434, 0.0060198374591655685, 0.006114594507843006,
+        0.006190343974447666, 0.006246721442458754, 0.006283489369210586,
+        0.0063005286811252115, 0.006297831666257353, 0.006275495414643097,
+        0.006233715347182525, 0.006172778665760672, 0.006093057811366527,
+        0.005995004198809174, 0.0058791425856667, 0.005746066428313409,
+        0.005596434497895376, 0.005430968909874223, 0.005250454607160858,
+        0.005055740276003266, 0.004847740708290806, 0.004627440788949747,
+        0.0043959016135937225, 0.004154269770138045, 0.003903791611139641,
+        0.003645835540186159, 0.00338192719721389, 0.003113805453661744,
+        0.0028435122299923384, 0.0025735378827825067, 0.0023070586331049555,
+        0.002048325418177911, 0.0018032901807679758, 0.001580546862341332,
+        0.0013924575658585193, 0.001255510790472258, 0.0011873674568998154,
+        0.0011986661617917676, 0.0012853799816600362, 0.001431415203628029,
+        0.001618021155990053, 0.0018298911689248222, 0.002056226486041757,
+        0.0022897399122246633, 0.0025254888932153517, 0.0027600298590394214,
+        0.002990880179861308, 0.0032161882078338847, 0.0034345312765398646,
+        0.003644790529289383, 0.003846072021281236, 0.004037656055406837,
+        0.004218963992952847, 0.004389536005386961, 0.0045490157240981625,
+        0.0046971392565383135, 0.004833726986239744, 0.004958677185693848,
+        0.0050719608694083495, 0.005173617567157691, 0.00526375184562394,
+        0.005342530477415594, 0.00541018017344406, 0.005466985777265969,
+        0.005513288787125713, 0.005549486038827965, 0.005576028361625535,
+        0.0055934190161810796, 0.005602211740509334, 0.005603008262022663,
+        0.005596455175850541, 0.005583240132435597, 0.00556408731410916,
+        0.00553975220519295, 0.005511015671327282, 0.005478677362696756,
+        0.005443548447635395, 0.005406443674434757, 0.005368172758219531,
+        0.005329531103193433, 0.0052912899027995, 0.005254185713413962,
+        0.005218909667581983, 0.00518609657426077, 0.005156314235709746,
+        0.005130053381247361, 0.005107718663885368, 0.005089621175972526,
+        0.005075972907255449, 0.005066883491238684, 0.00506235946919284,
+        0.005062306156590996, 0.005066532040676976, 0.005074755488192035,
+        0.005086613416191202, 0.005101671488913167, 0.005119435357004484,
+        0.005139362452061879, 0.005160873883934489, 0.0051833660510456885,
+        0.005206221653377939, 0.005228819882594952, 0.005250545644696659,
+        0.005270797740658599, 0.005288995986475652, 0.005304587294791968,
+        0.005317050767238773, 0.005325901862308237, 0.005330695711046049,
+        0.005331029655311821, 0.005326545083018985, 0.005316928633554652,
+        0.005301912845293714, 0.0052812763160478525, 0.005254843446262675,
+        0.005222483833290403, 0.005184111382772803, 0.00513968319993085,
+        0.005089198318920707, 0.0050326963230087705, 0.004970255902036255,
+        0.004901993386881054, 0.004828061293916789, 0.004748646905308847,
+        0.004663970904812235, 0.004574286081946573, 0.004479876112012151,
+        0.0043810544135784455, 0.004278163081115637, 0.00417157188639109,
+        0.004061677340110707, 0.003948901803389068, 0.003833692637940643,
+        0.0037165213820438458, 0.003597882936484731, 0.003478294738147155,
+        0.0033582958865580417, 0.0032384461690659477, 0.0031193248998918266,
+        0.0030015294465604862, 0.002885673262261983, 0.0027723831759935273,
+        0.002662295617797942, 0.0025560513819429666, 0.002454288473042777,
+        0.0023576325617818334, 0.0022666846321654603, 0.002182005571767052,
+        0.002104097776881518, 0.002033384335083181, 0.0019701869798150837,
+        0.0019147046921589, 0.001866995381845631, 0.0018269633000312553,
+        0.0017943545343995196, 0.0017687620552248773, 0.001749640455170937,
+        0.0017363290729753911, 0.0017280809979465972, 0.0017240948190812724,
+        0.001723546010116221, 0.0017256154171789895, 0.0017295131935088622,
+        0.0017344974429528092, 0.001739887597823152, 0.0017450730770630731,
+        0.0017495180450699374, 0.0017527631696112231, 0.001754425225496731,
+        0.0017541952697715025, 0.001751835968820317, 0.0017471785155213097,
+        0.0017401194492808175, 0.0017306175879413818, 0.0017186911972161907,
+        0.0017044154568730155, 0.0016879202287506806, 0.0016693880850938148,
+        0.0016490525122291716, 0.0016271961603130517, 0.0016041489617282171,
+        0.001580285887192839, 0.0015560240502637461, 0.0015318188127067668,
+        0.0015081584946715102, 0.0014855572721164745, 0.0014645458731363517,
+        0.0014456597935826872, 0.0014294249665995243, 0.0014163411525164953,
+        0.0014068637461073833, 0.0014013851657331002, 0.0014002173868905843,
+        0.0014035773813292323, 0.0014115771131067328, 0.0014242192884954216,
+        0.0014413993277155035, 0.0014629131889373425, 0.0014884699335981383,
+        0.001517707444255271, 0.001550209565268316, 0.001585523101243997,
+        0.0016231734749943612, 0.0016626782904113591, 0.0017035584621918408,
+        0.001745346901692805, 0.0017875949655131002, 0.0018298769892877357,
+        0.0018717932674215394, 0.0019129718261460334, 0.0019530692956373872,
+        0.0019917711342294195, 0.002028791403973418, 0.0020638722490844284,
+        0.0020967831885320126, 0.0021273203022175065, 0.0021553053658576794,
+        0.002180584971605678, 0.002203029658263934, 0.002222533065391638,
+        0.002239011118956315, 0.0022524012513273775, 0.0022626616551596635,
+        0.0022697705684072513, 0.0022737255862318416, 0.0022745429946957997,
+        0.0022722571206162173, 0.0022669196917246698, 0.0022585992012025134,
+        0.0022473802706042666, 0.0022333630050924824, 0.002216662334737133,
+        0.0021974073353397796, 0.0021757405217730495, 0.002151817106322538,
+        0.0021258042137530966, 0.0020978800439417937, 0.002068232971941023,
+        0.0020370605740145076, 0.0020045685668701077, 0.001970969645731368,
+        0.0019364822054108058, 0.001901328927265889, 0.0018657352141368475,
+        0.00182992745575389, 0.0017941311087740321, 0.0017585685797122633,
+        0.001723456905724332, 0.0016890052382951368, 0.0016554121485053267,
+        0.0016228627898542574, 0.0015915259746339865, 0.0015615512418012802,
+        0.0015330660156400663, 0.0015061729730759656, 0.0014809477498219962,
+        0.0014574371188331523, 0.0014356577661402677, 0.0014155957680794403,
+        0.0013972068403471393, 0.0013804173863871815, 0.0013651263238276497,
+        0.00135120761938401, 0.0013385134197911343, 0.001326877634232584,
+        0.0013161198052896936, 0.001306049101802668, 0.0012964682768696408,
+        0.0012871774550185493, 0.0012779776401801502, 0.0012686738669887706,
+        0.0012590779481821003, 0.0012490107981817458, 0.001238304335390612,
+        0.0012268029828668347, 0.0012143647987742355, 0.0012008622750222266,
+        0.0011861828456807412, 0.0011702291470626748, 0.0011529190695776029,
+        0.0011341856386077114, 0.0011139767579582396, 0.0010922548456652186,
+        0.0010689963881421844, 0.0010441914350601473, 0.0010178430542754052,
+        0.0009899667632578598, 0.0009605899514204742, 0.000929751306239223,
+        0.0008975002554088929, 0.0008638964378323618, 0.0008290092179935622,
+        0.0007929172621246058, 0.0007557082007927142, 0.0007174784127538815,
+        0.0006783329807234929, 0.000638385894705592, 0.0005977606184660051,
+        0.0005565912000565671, 0.0005150242167479934, 0.00047322203335111763,
+        0.00043136818728003806, 0.0003896763232858031, 0.0003484052429629768,
+        0.0003078848190444373, 0.0002685617227180705, 0.00023108165116396978,
+        0.00019643648013955043, 0.0001662077892802851, 0.00014285337119967402,
+        0.00012958300367696144, 0.00012885217715689765, 0.0001401166082637045,
+        0.00016013986055215962, 0.0001854125727494346, 0.0002134221678509727,
+        0.00024260683179224828, 0.0002720131902719537, 0.00030104002760699924,
+        0.00032928909152853526, 0.0003564828608571537, 0.00038241896806462123,
+        0.00040694427243451837, 0.0004299396318771022, 0.00045131066288246286,
+        0.00047098195637309626, 0.0004888933484657374, 0.0005049974470895086,
+        0.0005192579450988738, 0.000531648436486011, 0.0005421515603489089,
+        0.0005507583615964108, 0.0005574677968022885, 0.0005622863382281235,
+        0.0005652276448046147, 0.0005663122791903232, 0.0005655674569710237,
+        0.0005630268189344818, 0.0005587302209524353, 0.0005527235388217244,
+        0.0005450584878780675, 0.0005357924594814902, 0.0005249883788593955,
+        0.0005127145914549649, 0.0004990447881417429, 0.00048405798378095154,
+        0.00046783856908001314, 0.00045047646341634767, 0.00043206740712187436,
+        0.00041271344759227297, 0.0003925236967180547, 0.00037161547161880434,
+        0.0003501159819455755, 0.0003281648037993285, 0.00030591749442320453,
+        0.00028355086826735356, 0.0002612706862723649, 0.00023932279552113043,
+        0.0002180089960112012, 0.00019770873780182717, 0.0001789061116948821,
+        0.0001622160469441759, 0.00014839029152634327, 0.00013826252978999532,
+        0.00013258481473759823, 0.00013176961647753474, 0.00013568654684045488,
+        0.0001436924473964607, 0.00015487354918594602, 0.00016830453489289946,
+        0.00018319341961895173, 0.00019891744215520303, 0.00021500437638531192,
+        0.00023109912309507506, 0.00024693285039698287, 0.00026229920294439313,
+        0.0002770372384463755, 0.00029101953857889844, 0.0003041439934073255,
+        0.00031632811029301474, 0.00032750503876610655, 0.000337620761537408,
+        0.0003466320822169636, 0.00035450516167210156, 0.0003612144356723143,
+        0.0003667418000809485, 0.00037107598563316705, 0.0003742120685019946,
+        0.00037615107931940046, 0.00037689968470943985, 0.0003764699234882501,
+        0.00037487898538611996, 0.0003721490245535039, 0.0003683070033981053,
+        0.0003633845651456234, 0.00035741793602436225, 0.0003504478605397863,
+        0.0003425195760815344, 0.0003336828364243335, 0.0003239919978490315,
+        0.00031350618698152945, 0.00030228957662428583, 0.0002904118055752764,
+        0.00027794859148161643, 0.0002649826036351065, 0.00025160468636733,
+        0.00023791555454623998, 0.0002240281204238252, 0.0002100706508415641,
+        0.00019619098039334656, 0.0001825619784579796, 0.00016938829240025204,
+        0.0001569138741410947, 0.00014542861280334563, 0.0001352701483643282,
+        0.00012681368108363977, 0.00012044019269166817, 0.00011647721565910441,
+        0.00011512205092440646, 0.00011637977104356147, 0.00012005326580098942,
+        0.00012579339868271818, 0.00013317916227667065, 0.00014178879280854123,
+        0.00015124249955066405, 0.00016121863707969979, 0.00017145351547559758,
+        0.0001817339804302904, 0.00019188820679972362, 0.00020177718610697522,
+        0.000211287715117602, 0.00022032693205630054, 0.000228818173779235,
+        0.00023669787273927117, 0.00024391324053862337, 0.0002504205347536491,
+        0.00025618375430243746, 0.00026117364860938404, 0.0002653669565606399,
+        0.00026874581406291916, 0.00027129728563270265, 0.0002730129875458004,
+        0.0002738887787973264, 0.00027392450253225196, 0.00027312376527120904,
+        0.0002714937447686053, 0.0002690450199878777, 0.0002657914187515719,
+        0.00026174988031356865, 0.00025694033156441225, 0.00025138557695861675,
+        0.00024511120366677594, 0.00023814550513196993, 0.00023051942826672435,
+        0.0002222665523755636, 0.00021342311191291174, 0.00020402808116213114,
+        0.00019412334805893582, 0.0001837540186439159, 0.00017296891654472506,
+        0.00016182137945909027, 0.0001503705177897529, 0.00013868320926327748,
+        0.00012683729433036307, 0.00011492677872836784, 0.0001030704638442352,
+        9.14265079692526e-05, 8.021715914789345e-05, 6.976981088783923e-05,
+        6.05783556108545e-05, 5.336479223650344e-05, 4.903841557609909e-05,
+        4.8362522014174815e-05, 5.142268510577597e-05, 5.7538754234165856e-05,
+        6.575831143261966e-05, 7.527945714021568e-05, 8.554704645996909e-05,
+        9.61986213682218e-05, 0.00010699615106853205, 0.00011777808355678105,
+        0.00012843011798108626, 0.00013886799177913742, 0.00014902730309053017,
+        0.00015885738017788908, 0.00016831750097227063, 0.00017737450472510232,
+        0.00018600124765671508, 0.00019417558237882384, 0.00020187966953503895,
+        0.00020909950429777788, 0.00021582458411747332, 0.00022204767053293217,
+        0.00022776461411121843, 0.00023297422185248774, 0.00023767815292562928,
+        0.00024188083285757526, 0.00024558937910658407, 0.00024881353274898134,
+        0.0002515655922248794, 0.0002538603458365052], [4.137222898224676e-13,
+        1.2432388187618115e-12, 2.07898944271864e-12, 2.9251907508015513e-12,
+        3.786150850960949e-12, 4.6663078323911355e-12, 5.570269507804012e-12,
+        6.502855712991689e-12, 7.469143162954926e-12, 8.474513758340451e-12,
+        9.52470694056703e-12, 1.0625876886308152e-11, 1.1784655254744082e-11,
+        1.3008220613706514e-11, 1.4304375410111301e-11, 1.568163184626208e-11,
+        1.7149307933492845e-11, 1.871763533024495e-11, 2.0397880802075205e-11,
+        2.2202483275680273e-11, 2.4145209063060507e-11, 2.6241327816997375e-11,
+        2.8507812604092787e-11, 3.096356775528117e-11, 3.362968884921302e-11,
+        3.652975987449858e-11, 3.9690193583869296e-11, 4.314062182406387e-11,
+        4.6914344113911866e-11, 5.104884382123113e-11, 5.558638340989375e-11,
+        6.057469165345839e-11, 6.606775870102759e-11, 7.212675720675034e-11,
+        7.882111155386634e-11, 8.622974090573294e-11, 9.44425071053445e-11,
+        1.0356190390810759e-10, 1.1370503164248409e-10, 1.2500590937223608e-10,
+        1.376181877116156e-10, 1.5171833729328015e-10, 1.6750940400835234e-10,
+        1.852254399782766e-10, 2.0513674295347012e-10, 2.275560633225768e-10,
+        2.5284597443048555e-10, 2.8142764058926937e-10, 3.137912732488328e-10,
+        3.5050862553564483e-10, 3.9224795826808716e-10, 4.3979200745391894e-10,
+        4.940596058374347e-10, 5.561317660996092e-10, 6.27283223985174e-10,
+        7.0902068084668e-10, 8.031292917421146e-10, 9.11729324787e-10, 1.0373454098038763e-09,
+        1.1829914092202995e-09, 1.3522747359542436e-09, 1.5495249548225785e-09,
+        1.779952801559241e-09, 2.0498474278875195e-09, 2.366821847194864e-09,
+        2.7401193698258563e-09, 3.180997479992788e-09, 3.7032104083459536e-09,
+        4.323617965195853e-09, 5.0629565181087684e-09, 5.94681903929802e-09,
+        7.0069058461780964e-09, 8.282627332402004e-09, 9.823166407470142e-09,
+        1.1690144121289015e-08, 1.3961080449129632e-08, 1.6733908540787315e-08,
+        2.0132891707546815e-08, 2.4316418193350224e-08, 2.948732358378396e-08,
+        3.5906635036310414e-08, 4.391197572013062e-08, 5.394235566642038e-08,
+        6.657177166954955e-08, 8.255504095418891e-08, 1.0289074602501792e-07,
+        1.2890829224024015e-07, 1.6238921183308547e-07, 2.0573750965357266e-07,
+        2.6222085169850365e-07, 3.363150303327476e-07, 4.342004594751842e-07,
+        5.644847800950306e-07, 7.392654497897969e-07, 9.757095227141657e-07,
+        1.2984300346358867e-06, 1.7431057968372588e-06, 2.3620699884790782e-06,
+        3.233064554257598e-06, 4.473170898540886e-06, 6.261359141041971e-06,
+        8.875674588940127e-06, 1.2755829970815945e-05, 1.8610967221739356e-05,
+        2.7609902753679745e-05, 4.172657552964845e-05, 6.438759229047833e-05,
+        0.0001017310150329374, 0.0001651586013504714, 0.00027677324787342514,
+        0.00048167171034258453, 0.0008778382380436006, 0.0016958928150932302,
+        0.0035396735735044845, 0.008250479546054049, 0.02300317431883278,
+        0.09411536036253261, 2.326805015471173, 0.5179812897811523, 1.2703821727725775,
+        1.630994412809117, 0.9406930966070653, 1.131586120884883, 2.330734408517299,
+        3.645676035087794, 2.237166469264984, 2.313135291443106, 4.193603587509305,
+        8.194759701810701, 7.074723869242503, 4.368327670664488, 2.4365575833859263,
+        1.7523480791775332, 1.5458216750164204, 1.6267112104464012, 1.9972726052983099,
+        2.3134786656564046, 1.747197682108454, 1.2208317559572963, 0.9816135924535945,
+        0.9139414401405913, 0.9738133174148625, 1.174535778409244, 1.5255874571714843,
+        1.7404315590129382, 1.5077812381457396, 1.2387345186052612, 1.1011624210285231,
+        1.076017085061618, 1.1508676009759575, 1.3402281322076186, 1.6648045280503243,
+        2.0039731097451923, 1.9587875455070118, 1.6199247188096824, 1.3463572740835723,
+        1.200108496979906, 0.9803182392808056, 0.9046750124986305, 0.8792946260709047,
+        0.8602887848268288, 0.8174355055560107, 0.7407782654613566, 0.6471163174218348,
+        0.5588962982197356, 0.48721205416124874, 0.43335333335411996, 0.39471363230571715,
+        0.3679197434099974, 0.34965226533115085, 0.3364534013041599, 0.3243185650764465,
+        0.3088687249037634, 0.2869051136392592, 0.2586007221471419, 0.22753529055013053,
+        0.1979984605888318, 0.17267938686464102, 0.15240917379975757, 0.13691546048967385,
+        0.12550827677219872, 0.11744533598219725, 0.11207689309898043, 0.10888601353093905,
+        0.10748797174589948, 0.10761606115766978, 0.10910421804095327, 0.11187029663856285,
+        0.1159012485279182, 0.12124003682854084, 0.1279728389804433, 0.13621357335146114,
+        0.14608082186591897, 0.15765991380319583, 0.1709414146198607, 0.18573017668331337,
+        0.20153408913050447, 0.21747708920755657, 0.2323280408932105, 0.24474030899845847,
+        0.25367676700446545, 0.25879393030099385, 0.26051579438275313, 0.2597656621194646,
+        0.2575790645254045, 0.2548221219631438, 0.2520785247096618, 0.24965347759704623,
+        0.24762640589060672, 0.2459121507996459, 0.2443175069829836, 0.2425935415582431,
+        0.24048646746978816, 0.23778581898662307, 0.2343631329725097, 0.23019193937002483,
+        0.22534338206031518, 0.21995980825378086, 0.21421616932504434, 0.20828156231840525,
+        0.20229024607874224, 0.19632602916483122, 0.19041939023192014, 0.18455446013255616,
+        0.17868259696683061, 0.17273957130243334, 0.16666352179299507, 0.16041071471145182,
+        0.15396619688877838, 0.14734724865129753, 0.1405992740762651, 0.13378586375756538,
+        0.1269762857809379, 0.12023393354632193, 0.11360833861664694, 0.10713187498243845,
+        0.10082093358559809, 0.09468049843971016, 0.08871070545952722, 0.08291393671519193,
+        0.07730114939588983, 0.07189641945481527, 0.06673910564859617, 0.06188356577084041,
+        0.05739681883578157, 0.053354717063384106, 0.04983694117556448,
+        0.046920612850514035, 0.04467203224188738, 0.04313665704726949,
+        0.04232913819712333, 0.04222697459001499, 0.04277118032326875, 0.04387451315954933,
+        0.045434290008929144, 0.04734540676949193, 0.049510376904675496,
+        0.05184530964678789, 0.0542822236855845, 0.056768641669129524, 0.05926543040338365,
+        0.06174371442684648, 0.06418154524700606, 0.06656086938394411, 0.06886519070771249,
+        0.0710781612425668, 0.0731831645629329, 0.0751637869081908, 0.07700491921471948,
+        0.07869412357406919, 0.08022285949738907, 0.08158721829112954, 0.0827879518625032,
+        0.08382976896923545, 0.08472005246562206, 0.08546727536680292, 0.08607943589090847,
+        0.08656279627665522, 0.08692112184705647, 0.0871555057298017, 0.08726475535950268,
+        0.08724622498626891, 0.08709691307426087, 0.08681461101219583, 0.08639889420201743,
+        0.08585178826060529, 0.08517801426876534, 0.08438480229776477, 0.08348134197731714,
+        0.08247799488891651, 0.08138541638896449, 0.08021372502395645, 0.07897182537415465,
+        0.07766694807089894, 0.07630443056505977, 0.07488773120736232, 0.07341864943857507,
+        0.07189771442460265, 0.07032469947063225, 0.06869921607698606, 0.06702133715609497,
+        0.06529219360743167, 0.06351448441761544, 0.06169284137753552, 0.05983399919055984,
+        0.057946741791391795, 0.056041624593260786, 0.05413050483666246,
+        0.05222594094997226, 0.05034053976902626, 0.04848633362029462, 0.046674257745103635,
+        0.044913776414501505, 0.043212679397566664, 0.04157704511283431,
+        0.0400113469388025, 0.03851866657119731, 0.0371009727564162, 0.03575942385864162,
+        0.03449465687410433, 0.033307032293471255, 0.03219681268272522,
+        0.031164262346594418, 0.03020966545624693, 0.029333269827954183,
+        0.028535172278502312, 0.02781516807644546, 0.02717259048537067,
+        0.02660616607610822, 0.026113907325689977, 0.02569305662217888,
+        0.025340086524798227, 0.025050751768468382, 0.024820180931144294,
+        0.024642991342281356, 0.024513410373250496, 0.024425389423225963,
+        0.0243727025847022, 0.02434902856903029, 0.02434802036081336, 0.024363370935544738,
+        0.024388884423401144, 0.024418560155776845, 0.024446692518757647,
+        0.02446798343920814, 0.024477658052601586, 0.024471569250613247,
+        0.024446274835228776, 0.02439907279445184, 0.024327985728074587,
+        0.024231693633251155, 0.024109423267285997, 0.023960810035277218,
+        0.023785753048082114, 0.023584284710482833, 0.023356472949568236,
+        0.023102367803539168, 0.022821995911852487, 0.022515397991559254,
+        0.022182697121257044, 0.021824180803253462, 0.021440378175642375,
+        0.021032115697417086, 0.02060053976539864, 0.02014710198056385,
+        0.019673510614793083, 0.019181658536857316, 0.018673542046976382,
+        0.01815118601379251, 0.017616588479123837, 0.017071693255160027,
+        0.016518393169119322, 0.01595856078823971, 0.015394098776278132,
+        0.014826999269324388, 0.014259401143288287, 0.013693635698977072,
+        0.013132254593383914, 0.012578037958303609, 0.0120339845668404,
+        0.011503288669512644, 0.010989309044820145, 0.010495534654137422,
+        0.010025548321101361, 0.009582985792058907, 0.009171483439990868,
+        0.00879460504369686, 0.00845573787744538, 0.008157951984954738,
+        0.007903824548849647, 0.007695242914104001, 0.0075332122789715655,
+        0.007417702639864889, 0.007347569297875646, 0.0073205696926331,
+        0.00733347909697495, 0.007382285962528415, 0.007462432641181816,
+        0.0075690635263201515, 0.0076972495300682234, 0.007842170386712729,
+        0.007999248992281511, 0.008164241183019921, 0.008333288949018662,
+        0.008502945884199455, 0.008670182279198326, 0.008832375171339795,
+        0.008987286896172477, 0.009133034692462412, 0.009268053705545991,
+        0.009391056034516284, 0.009500988898331796, 0.009596995201825088,
+        0.009678379542399768, 0.009744581949839962, 0.009795160486996085,
+        0.009829782466446725, 0.009848222720725927, 0.009850366361106878,
+        0.009836212970216732, 0.00980587928966074, 0.009759598151724024,
+        0.00969771250719134, 0.00962066467510357, 0.009528982109684631,
+        0.009423261802776682, 0.009304155763769575, 0.009172359807915179,
+        0.009028607217123856, 0.008873667887464468, 0.008708352554717023,
+        0.00853352081132975, 0.008350091057127817, 0.008159050361510716,
+        0.007961462457344994, 0.0077584726567640995, 0.007551309226856293,
+        0.007341281507369148, 0.007129775614499751, 0.006918248828658664,
+        0.006708223646433879, 0.006501282012982379, 0.006299059530683839,
+        0.006103238607617306, 0.005915538733915983, 0.00573770152618573,
+        0.005571468021073751, 0.005418546064443187, 0.005280566619534426,
+        0.005159029419145785, 0.0050552404902407646, 0.004970246377798115,
+        0.004904771885318994, 0.004859169209082931, 0.0048333859298474325,
+        0.004826957237532338, 0.00483902432901155, 0.004868376964311156,
+        0.00491351472694537, 0.00497271944192234, 0.005044130782736779,
+        0.005125818120523857, 0.005215843561582185, 0.005312313254844448,
+        0.005413415959935667, 0.005517449318339861, 0.005622835229058909,
+        0.005728126269931199, 0.0058320053303484495, 0.005933280615867116,
+        0.006030878010959735, 0.006123832481022949, 0.006211279793088044,
+        0.006292449375765313, 0.006366658671258959, 0.006433308910541046,
+        0.0064918819194109, 0.006541937377246364, 0.006583109919542068,
+        0.0066151055901768, 0.006637697373757126, 0.006650719817105801,
+        0.006654063018367474, 0.006647666463829324, 0.006631513285440867,
+        0.006605625479963129, 0.006570060484836931, 0.0065249092804504725,
+        0.006470295932994488, 0.006406378260135033, 0.006333349140107834,
+        0.00625143792452139, 0.006160911464822282, 0.006062074409810962,
+        0.005955268641609201, 0.005840871948628106, 0.005719296236796386,
+        0.005590985718878393, 0.005456415572084393, 0.005316091513719341,
+        0.005170550630384113, 0.005020363636777336, 0.004866138573781081,
+        0.004708525816396501, 0.004548224174856264, 0.0043859878498242934,
+        0.004222634030305363, 0.004059050981591346, 0.0038962065074780597,
+        0.00373515663753257, 0.0035770542160946874, 0.0034231566943400734,
+        0.003274831792667349, 0.003133558786796412, 0.0030009220268442825,
+        0.0028785921180414166, 0.002768289404143687, 0.002671724727915508,
+        0.0025905148406954568, 0.0025260750461529925, 0.0024794994505967886,
+        0.0024514474693203216, 0.0024420600917404067, 0.00245092686501918,
+        0.0024771136138144493, 0.0025192453462091783, 0.0025756254242922955,
+        0.0026443663804333628, 0.0027235106107806363, 0.0028111272853366823,
+        0.0029053807037605754, 0.0030045719505325448, 0.0031071591640447985,
+        0.003211762601811175, 0.003317160016806557, 0.0034222765758457814,
+        0.00352617222939773, 0.003628028351406944, 0.0037271346835403224,
+        0.0038228771112972853, 0.00391472650819026, 0.004002228736541448,
+        0.004084995831003263, 0.0041626983678826925, 0.004235059008981876,
+        0.004301847187953479, 0.0043628748731440225, 0.004417993299040297,
+        0.004467090514952689, 0.0045100895657160375, 0.0045469471032667155,
+        0.004577652234341935, 0.004602225439921613, 0.004620717450979945,
+        0.004633208024988451, 0.004639804628221266, 0.004640641079831498,
+        0.004635876246899399, 0.004625692890590412, 0.0046102967517261915,
+        0.004589915933254496, 0.004564800594001461, 0.0045352229211362465,
+        0.004501477306409549, 0.004463880620094182, 0.004422772460756922,
+        0.004378515259626794, 0.004331494132479804, 0.004282116395870622,
+        0.0042308106909993695, 0.004178025682795529, 0.004124228317747562,
+        0.004069901630212487, 0.004015542082383806, 0.003961656410945182,
+        0.003908757938554, 0.003857362296114345, 0.0038079824997499074,
+        0.0037611233394113557, 0.003717275067883457, 0.0036769064314637655,
+        0.003640457153387013, 0.0036083300627053677, 0.0035808831450749702,
+        0.0035584218656521567, 0.0035411921646546405, 0.0035293745415227278,
+        0.0035230796160682426, 0.003522345482285909, 0.003527137058711018,
+        0.003537347500532382, 0.003552801591118818, 0.003573260893372734,
+        0.003598430331874537, 0.003627965806790516, 0.00366148241488933,
+        0.0036985628691100533, 0.003738765757645297, 0.003781633355051487,
+        0.0038266987789275196, 0.0038734923655236765, 0.003921547208279152,
+        0.003970403859376611, 0.004019614234930743, 0.004068744789380515,
+        0.004117379036828333, 0.0041651194995359145, 0.004211589159643472,
+        0.0042564324830024316, 0.004299316075574081, 0.004339929025095254,
+        0.004377982974445159, 0.004413211968476175, 0.004445372112875902,
+        0.004474241081339871, 0.004499617505476011, 0.0045213202799778964,
+        0.004539187813469953, 0.004553077252666556, 0.004562863704463, 0.004568439477040471,
+        0.004569713357291499, 0.0045666099378451185, 0.0045590690027075345,
+        0.004547044976146564, 0.004530506434859172, 0.0045094356789222865,
+        0.0044838283527979875, 0.0044536931040112665, 0.004419051264649318,
+        0.004379936539765399, 0.004336394687740581, 0.004288483180312568,
+        0.00423627083466831, 0.0041798374158849875, 0.004119273214423475,
+        0.004054678609693595, 0.003986163635609714, 0.003913847567278932,
+        0.0038378585487011813, 0.0037583332797775783, 0.003675416777516735,
+        0.003589262221479013, 0.003500030889031948, 0.003407892182341442,
+        0.0033130237475169, 0.003215611688305666, 0.0031158508816867404,
+        0.0030139454121065313, 0.002910109152879596, 0.0028045665393986695,
+        0.002697553596505763, 0.0025893193036806003, 0.002480127405458826,
+        0.002370258803034888, 0.0022600146971793935, 0.0021497206954045503,
+        0.002039732149344429, 0.0019304410525210459, 0.0018222849008076062,
+        0.0017157579850366352, 0.0016114256149107812, 0.0015099416965637699,
+        0.0014120697624374209, 0.0013187067286721708, 0.0012309069143785275,
+        0.001149900635270702, 0.0010770965258443406, 0.00101405015281242,
+        0.0009623766627645281, 0.0009235898466727468, 0.0008988741381158788,
+        0.0008888403139486072, 0.0008933550712787872, 0.0009115263137456347,
+        0.0009418567885894051, 0.0009824975849335226, 0.0010315033804487782,
+        0.0010870218410780107, 0.0011473995196641478, 0.001211219929680047,
+        0.0012772993153864166, 0.0013446617117453675, 0.0014125071955687102,
+        0.0014801807072647142, 0.001547144619370546, 0.0016129559352284373,
+        0.0016772479225633274, 0.0017397155738337487, 0.0018001041986250325,
+        0.0018582005060474877, 0.0019138256344853957, 0.0019668296901743324,
+        0.0020170874489573104, 0.002064494951886724, 0.002108966787193911,
+        0.002150433899358816, 0.0021888418040049203, 0.0022241491170178814,
+        0.0022563263292013085, 0.0022853547752839866, 0.0023112257592996974,
+        0.0023339398078277705, 0.0023535060291664804, 0.002369941560909267,
+        0.0023832710911433313, 0.0023935264401641326, 0.00240074619087056,
+        0.0024049753570473155, 0.002406265079930215, 0.002404672344961526,
+        0.0024002597122673307, 0.002393095056313497, 0.0023832513119327443,
+        0.0023708062256425928, 0.002355842112406201, 0.0023384456189381097,
+        0.0023187074950594203, 0.0022967223746777794, 0.0022725885676949304,
+        0.0022464078636768585, 0.0022182853475906966, 0.002188329227377714,
+        0.002156650672740798, 0.0021233636641721215, 0.0020885848510624042,
+        0.002052433417585466, 0.002015030954985349, 0.0019765013386871485,
+        0.0019369706085587029, 0.0018965668503238236, 0.0018554200758427635,
+        0.0018136620993888428, 0.0017714264066416392, 0.0017288480122877787,
+        0.0016860633012352353, 0.001643209847468222, 0.0016004262030529855,
+        0.001557851648299139, 0.0015156258920581102, 0.001473888708988166,
+        0.0014327794983344003, 0.0013924367465057354, 0.0013529973741040035,
+        0.0013145959469873674, 0.001277363731659909, 0.001241427577809431,
+        0.0012069086162776012, 0.0011739207694905233, 0.001142569084104427,
+        0.0011129479120182656, 0.0010851389858726147, 0.0010592094568731571,
+        0.0010352099844462511, 0.001013172985450288, 0.0009931111621149708,
+        0.0009750164289196067, 0.0009588593468929401, 0.0009445891481789559,
+        0.0009321343961867179, 0.0009214042805147088, 0.0009122904976189375,
+        0.0009046696239379196, 0.0008984058542681438, 0.000893353958530299,
+        0.0008893623063213431, 0.0008862758194741585, 0.0008839387351436839,
+        0.0008821970909648826, 0.0008809008752840852, 0.0008799058151810937,
+        0.0008790748004429692, 0.0008782789612163012, 0.0008773984305653881,
+        0.0008763228309732728, 0.0008749515270032368, 0.0008731936860367931,
+        0.0008709681863523221, 0.0008682034077671121, 0.0008648369354318876,
+        0.0008608152026269036, 0.0008560930939266846, 0.0008506335260222894,
+        0.0008444070199070322, 0.00083739127507178, 0.0008295707536870713,
+        0.000820936280581921, 0.0008114846630037949, 0.0008012183326861432,
+        0.000790145011685103, 0.0007782774026426661, 0.000765632903734195,
+        0.0007522333483676125, 0.0007381047698313604, 0.0007232771913763636,
+        0.0007077844426645403, 0.0006916640040478994, 0.0006749568807241782,
+        0.0006577075093614114, 0.000639963700328339, 0.0006217766191813056,
+        0.0006032008114975677, 0.0005842942755826245, 0.0005651185879148326,
+        0.0005457390863739219, 0.0005262251161601344, 0.0005066503426045087,
+        0.00048709313318285897, 0.00046763700749920045, 0.0004483711474586747,
+        0.00042939094911723346, 0.00041079858062451345, 0.0003927034850620707,
+        0.0003752227305764549, 0.00035848106133230876, 0.0003426104429427143,
+        0.0003277488320184477, 0.00031403784850906474, 0.0003016190226224775,
+        0.0002906283706987878, 0.0002811892750523827, 0.0002734040258792191,
+        0.00026734488589823593, 0.0002630460167900093, 0.0002604978349131425,
+        0.0002596451373694113, 0.0002603896239351342, 0.0002625964531081302,
+        0.00026610359297862303, 0.00027073228725507133, 0.0002762970468266529,
+        0.0002826140475722257, 0.00028950740865474426, 0.00029681332968745875,
+        0.0003043823823954725, 0.0003120803859264976, 0.0003197882986200744,
+        0.00032740149369678837, 0.000334828697986275, 0.00034199078825411587,
+        0.0003488195705924937, 0.00035525661715917454, 0.000361252199236114,
+        0.00036676433275057834, 0.00037175793847585916, 0.00037620411126895904,
+        0.00038007948878369957, 0.00038336570855021794, 0.0003860489421898729,
+        0.00038811949618632513, 0.0003895714696297079, 0.00039040246053105587,
+        0.00039061331349069846, 0.0003902079026221736, 0.0003891929447216966,
+        0.0003875778385974083, 0.0003853745273547783, 0.00038259738115066857,
+        0.0003792630985862129, 0.0003753906254275248, 0.0003710010897808069,
+        0.00036611775320290565, 0.00036076597750807284, 0.00035497320723002553,
+        0.0003487689678665109, 0.00034218488008703086, 0.00033525469011302787,
+        0.0003280143162868324, 0.00032050191156997516, 0.0003127579410588731,
+        0.0003048252726216188, 0.00029674927717857974, 0.00028857793285662624,
+        0.00028036192397772167, 0.00027215472139861346, 0.00026401262490307925,
+        0.00025599474104906483, 0.0002481628613327667, 0.00024058119625525434,
+        0.00023331591228703904, 0.00022643441309490666, 0.00022000430726551112,
+        0.00021409201660092645, 0.00020876100673785253, 0.00020406966842362968,
+        0.00020006894246180957, 0.00019679985604363414, 0.000194291206684283,
+        0.00019255766999643097, 0.0001915985978278329, 0.00019139770355633046,
+        0.00019192371061280047, 0.00019313189655891622, 0.0001949663363990947,
+        0.00019736256756206638, 0.0002002503800110124, 0.0002035564720132284,
+        0.00020720678457557859, 0.00021112841079906159, 0.00021525105071319993,
+        0.0002195080368211713, 0.00022383698825008072, 0.00022818016522302043,
+        0.00023248459600113305, 0.00023670204095782387, 0.000240788847365232,
+        0.00024470573672675, 0.00024841755571547425, 0.00025189301272765324,
+        0.0002551044149065874, 0.00025802741508410514, 0.00026064077419361403,
+        0.0002629261419601102, 0.0002648678568624013, 0.00026645276518358677,
+        0.0002676700582906999, 0.00026851112690052257, 0.0002689694309554707,
+        0.00026904038371240296, 0.00026872124873084737, 0.00026801104856265083,
+        0.0002669104841043525, 0.00026542186373566633, 0.0002635490415388521,
+        0.000261297364081479, 0.00025867362543888694, 0.0002556860303332802,
+        0.00025234416549055084, 0.0002486589795577192, 0.00024464277218050627,
+        0.0002403091931227546, 0.0002356732526246966, 0.00023075134453355738,
+        0.00022556128411044455, 0.00022012236282488624, 0.00021445542288983527,
+        0.00020858295473742176, 0.00020252922108668044, 0.00019632041162161108,
+        0.00018998483250269092, 0.00018355313475311037, 0.00017705858474201965,
+        0.00017053737801211424, 0.00016402899388170763, 0.00015757658152472422,
+        0.00015122735723705597, 0.00014503297552444921, 0.00013904981181516314,
+        0.00013333906091021782, 0.0001279665141653337, 0.00012300183624725143,
+        0.00011851713432225135, 0.00011458462494446515, 0.00011127329162210513,
+        0.00010864461805556408, 0.00010674777330715678, 0.00010561494456706509,
+        0.00010525772025714155, 0.0001056653688708518, 0.00010680548139105331,
+        0.00010862686399677251, 0.00011106402774157457, 0.00011404234395479194,
+        0.00011748298317382433, 0.0001213070324964583, 0.00012543852676739426,
+        0.0001298064051625505, 0.0001343455663495341, 0.00013899725315873177,
+        0.0001437089880063593, 0.00014843423887502205, 0.00015313194694552203,
+        0.0001577660035324327, 0.0001623047303506902, 0.00016672039332811482,
+        0.00017098876446987703, 0.00017508873655755537, 0.0001790019898281617,
+        0.00018271270681612133, 0.00018620733024234264, 0.0001894743584874491,
+        0.00019250417337300803, 0.00019528889545274684, 0.0001978222625577274,
+        0.00020009952792824877, 0.00020211737480991735, 0.00020387384487785236,
+        0.00020536827829073607, 0.00020660126353629218, 0.0002075745955459018,
+        0.00020829124080939314, 0.00020875530843231637, 0.00020897202623426932,
+        0.000208947721116803, 0.00020868980300846833, 0.00020820675173341272,
+        0.00020750810617869108, 0.000206604455083897, 0.00020550742873300226,
+        0.00020422969072371452], [1.1103921431213198e-12, 3.337155288652005e-12,
+        5.581911892425125e-12, 7.856846559814039e-12, 1.0174429886687166e-11,
+        1.2547539013307954e-11, 1.498958282418928e-11, 1.7514635626595485e-11,
+        2.0137579740582482e-11, 2.287425989405802e-11, 2.574165158644202e-11,
+        2.8758046184738042e-11, 3.194325539942301e-11, 3.531883903078548e-11,
+        3.8908359302022415e-11, 4.273766662199053e-11, 4.6835221573345977e-11,
+        5.123245908431945e-11, 5.5964201668630357e-11, 6.106912932920094e-11,
+        6.659031582136009e-11, 7.257584141486796e-11, 7.907949520579783e-11,
+        8.616158151399102e-11, 9.388984772753525e-11, 1.0234055395532762e-10,
+        1.1159970887325608e-10, 1.2176449987625002e-10, 1.3294495179947635e-10,
+        1.4526585384061776e-10, 1.5886900326052575e-10, 1.7391582196045863e-10,
+        1.9059041497900874e-10, 2.091031519035375e-10, 2.2969486983003844e-10,
+        2.526418153112416e-10, 2.7826146826243636e-10, 3.0691941924176444e-10,
+        3.390375095890057e-10, 3.75103486908278e-10, 4.156824858721892e-10,
+        4.614307103514259e-10, 5.131117802344691e-10, 5.716163091326165e-10,
+        6.379854137952258e-10, 7.134390160705173e-10, 7.994100125385158e-10,
+        8.975856359556811e-10, 1.0099576758750297e-09, 1.1388836285479005e-09,
+        1.2871613895998567e-09, 1.458120776599211e-09, 1.6557360395616332e-09,
+        1.8847646471557993e-09, 2.150919086170974e-09, 2.4610803032539987e-09,
+        2.823563900130101e-09, 3.248453423025512e-09, 3.74801939349327e-09,
+        4.337248401272825e-09, 5.034514183120078e-09, 5.862432819130135e-09,
+        6.848957971117851e-09, 8.028790873058646e-09, 9.445205546373264e-09,
+        1.1152425329360774e-08, 1.3218736425436417e-08, 1.5730593989840392e-08,
+        1.879807542387871e-08, 2.2562177790758173e-08, 2.7204662837408657e-08,
+        3.2961456748620245e-08, 4.014106438343886e-08, 4.915014257521737e-08,
+        6.05294315843542e-08, 7.500489777052978e-08, 9.356159234363161e-08,
+        1.1755208584204608e-07, 1.488586943433798e-07, 1.9014154759352105e-07,
+        2.4522780103558756e-07, 3.1974134664235044e-07, 4.2216041517869657e-07,
+        5.656782017662478e-07, 7.716755076714297e-07, 1.0767247011059519e-06,
+        1.5482930527238283e-06, 2.325751927664138e-06, 3.756490093738075e-06,
+        7.103379199783676e-06, 3.6490625467899354e-05, 1.577373534734989e-05,
+        1.3740759412477129e-05, 1.4148468060535896e-05, 1.5622325379296654e-05,
+        1.797520908651408e-05, 2.129119941048292e-05, 2.5802380572840035e-05,
+        3.1886029078065354e-05, 4.0107004313862006e-05, 5.1299338065978394e-05,
+        6.670145761081087e-05, 8.817683864502246e-05, 0.00011857862734907131,
+        0.00016236549149206193, 0.00022667017234724422, 0.00032321240216927517,
+        0.0004718493185582651, 0.0007074479862134149, 0.001093865324845975,
+        0.0017541353187502052, 0.0029406319044267223, 0.00521416720746766,
+        0.009961899801114452, 0.02118569464680592, 0.05368502192584466,
+        0.19871144490761977, 4.42006145271334, 0.8794735023946815, 1.9125758699636368,
+        2.156085524600325, 1.0786564785862638, 1.1079496493150103, 1.907986526778067,
+        2.4213176061378534, 1.1495422579580867, 0.8403242357670178, 0.8284114968235069,
+        1.0649128543149557, 1.5895067201710782, 1.2033459475319883, 0.7680321479985491,
+        0.6214310019266012, 0.6173642325177098, 0.7362523086264113, 1.0294985510018233,
+        1.358239098785856, 1.161325973372013, 0.9076594665803251, 0.8025885626190751,
+        0.8055680483104791, 0.9064757160407924, 1.132779513577784, 1.4999275596381583,
+        1.7222482105991461, 1.4875568442987708, 1.2103669714980134, 1.0608254491383724,
+        1.019067434966981, 1.0695823884683933, 1.2209541997367668, 1.4856946983666948,
+        1.7510714662951974, 1.6750759952378216, 1.3546496444103582, 1.0990112511512968,
+        0.9506875698157763, 0.7372840583238076, 0.6653409490216531, 0.6337170510870789,
+        0.6078568712537994, 0.5661907781710599, 0.5027780907279822, 0.430105309756238,
+        0.3634622421470427, 0.30968339640559195, 0.26887629244244665, 0.2386955536434493,
+        0.21648105261549117, 0.19980097489898344, 0.18636485360500898, 0.17384947554846286,
+        0.16007035333351766, 0.14380254809550982, 0.12568911741126246, 0.10788407721254745,
+        0.09250822879233025, 0.08060457438526135, 0.07219384724339613, 0.06675855111526649,
+        0.06363313923860686, 0.06221000657744917, 0.06201729644647238, 0.062727488636481,
+        0.06413652055485705, 0.06613595939724076, 0.06868821356679218, 0.07180757685028355,
+        0.07554668334335726, 0.07998675376065331, 0.08522945673893914, 0.09138757538328712,
+        0.09857064501762287, 0.10686034959798968, 0.11626952268962881, 0.12668062415557554,
+        0.13776983315659216, 0.14894724228356626, 0.15937613012761648, 0.1681369260057531,
+        0.17451935986376188, 0.17828784004152398, 0.1797343757521157, 0.1794959754116561,
+        0.17828909433228202, 0.17671555755802715, 0.17518400078906823, 0.1739117200681984,
+        0.17296013758712775, 0.1722761615879366, 0.17173039796589198, 0.17115261778448382,
+        0.17036658241105299, 0.1692235632944025, 0.16762994304918277, 0.1655623860460099,
+        0.16306626070235755, 0.1602384601917948, 0.15720109812104607, 0.15407454014528996,
+        0.1509563925369932, 0.14790941629890297, 0.1449581992829254, 0.14209283866786718,
+        0.13927758264397255, 0.13646255406784238, 0.13359671677919213, 0.13064002031025676,
+        0.1275724906758888, 0.12439839826715693, 0.1211447445349335, 0.11785485949120296,
+        0.11457920706786029, 0.11136597354803555, 0.10825358226897085, 0.10526632356789986,
+        0.10241332179585448, 0.09969039031233871, 0.09708398257842511, 0.09457630859783042,
+        0.09215063272633281, 0.0897957802259116, 0.08750902000995914, 0.08529682348849109,
+        0.08317349391614544, 0.08115817077342691, 0.07927105273523387, 0.0775297407918,
+        0.07594640798726118, 0.07452618198422789, 0.07326681797256891, 0.07215951793605259,
+        0.07119062233907293, 0.07034382884470781, 0.06960255176760155, 0.06895202544754676,
+        0.06838079728629876, 0.06788137155385353, 0.06744994372546728, 0.06708536197449609,
+        0.066787607249787, 0.06655615289931448, 0.06638854299622143, 0.06627944180337138,
+        0.06622029259597155, 0.06619961060365553, 0.0662038343992314, 0.06621857531541198,
+        0.06623003934226261, 0.06622636167508422, 0.0661986057000314, 0.06614124380436048,
+        0.06605204781869335, 0.06593144442655309, 0.0657814994713812, 0.06560475617515356,
+        0.0654031560333813, 0.06517722703922703, 0.0649256522134618, 0.06464525275723551,
+        0.06433134894111334, 0.06397840572995751, 0.06358083285103484, 0.06313379314214469,
+        0.06263388065208171, 0.06207956080002531, 0.06147131400460623, 0.06081148146925784,
+        0.060103864288970354, 0.059353163243837125, 0.058564360479087994,
+        0.0577421367106854, 0.0568903951235988, 0.05601193459894164, 0.05510828808028842,
+        0.05417972147228833, 0.05322537569222378, 0.052243527879513786,
+        0.05123194456641567, 0.050188297038866715, 0.0491106054584057, 0.04799767349523912,
+        0.04684947089906362, 0.04566742037353367, 0.04445455031177497, 0.04321548793977789,
+        0.04195628750777524, 0.040684111844298904, 0.03940680763352529,
+        0.03813242984326295, 0.036868775471278856, 0.035622980728058966,
+        0.034401221444025146, 0.03320853801727805, 0.03204878787032161,
+        0.030924713293627976, 0.02983810222247503, 0.028790013943438095,
+        0.027781040119266655, 0.026811572732110687, 0.025882053608208968,
+        0.024993184457920994, 0.024146081434737954, 0.023342363844466182,
+        0.02258417247793606, 0.021874118773222706, 0.02121517124606885,
+        0.020610490102391004, 0.02006322451835703, 0.019576289741274035,
+        0.019152142809935328, 0.01879257608144109, 0.018498546422282085,
+        0.01827005448670108, 0.018106082941437788, 0.01800459548686866,
+        0.01796259141071781, 0.01797620480974222, 0.018040834808776492,
+        0.018151293483447392, 0.018301961103089664, 0.018486942334679787,
+        0.018700220558594337, 0.018935809190324615, 0.019187898382080137,
+        0.01945099309150973, 0.019720035343020064, 0.01999050103921273,
+        0.020258461213906436, 0.02052059990142573, 0.020774185698783774,
+        0.021017000650012947, 0.021247236770608725, 0.02146337577565545,
+        0.02166407018502294, 0.021848043399817076, 0.022014022728939785,
+        0.022160713370308283, 0.022286814077108367, 0.022391067881615184,
+        0.02247233507392864, 0.02252967177665279, 0.02256239672875537, 0.022570131549715534,
+        0.022552805347468462, 0.022510621913905706, 0.022443995328001943,
+        0.022353465926056512, 0.0222396120586554, 0.022102973271439733,
+        0.02194399769831278, 0.021763021318462077, 0.021560280432028782,
+        0.021335952477262263, 0.02109021527211608, 0.020823311781198044,
+        0.020535607088848728, 0.020227626429293735, 0.019900067408531973,
+        0.019553785031850693, 0.01918975364443346, 0.01880901424485421,
+        0.01841261799161865, 0.018001576739997385, 0.01757682930913752,
+        0.017139228505679335, 0.01668954958297283, 0.01622851669088328,
+        0.015756840731903966, 0.015275260403288532, 0.014784578289671209,
+        0.014285685560107982, 0.01377957169292122, 0.013267319075272966,
+        0.012750085553776967, 0.012229080405952794, 0.01170554032768614,
+        0.011180711777722818, 0.010655844601735708, 0.010132199719405412,
+        0.009611071361652969, 0.009093822425691601, 0.008581930390014356,
+        0.008077041103068503, 0.007581028625277514, 0.007096060887647877,
+        0.006624672714451361, 0.0061698488875015405, 0.0057351191320043704,
+        0.0053246622337150456, 0.004943405177091686, 0.004597081938206798,
+        0.004292184036001261, 0.0040356987233008635, 0.003834519446267461,
+        0.0036944817595834256, 0.003619170431323896, 0.0036088958377874154,
+        0.0036603275524112093, 0.0037670123492174515, 0.003920540689382498,
+        0.004111851022259853, 0.004332250739266347, 0.004574004112020127,
+        0.004830548761382915, 0.005096476417911353, 0.005367398593961118,
+        0.005639775612583286, 0.005910750623150089, 0.006178006553632829,
+        0.0064396510399517305, 0.006694128093677357, 0.00694015254319439,
+        0.00717666232668965, 0.007402783669536431, 0.007617804659835189,
+        0.00782115356947953, 0.008012379327046905, 0.008191132698342225,
+        0.008357147809306699, 0.008510224507453337, 0.008650212583182887,
+        0.008776999010771136, 0.008890499138707183, 0.008990652247138242,
+        0.00907742123204101, 0.009150795525860032, 0.009210795868242213,
+        0.00925747930791549, 0.0092909428964382, 0.00931132491000991, 0.009318803026203566,
+        0.009313589562499034, 0.009295924511681587, 0.009266067558828923,
+        0.00922429045214343, 0.009170870999487485, 0.009106089609227718,
+        0.009030228770991236, 0.008943575292804056, 0.008846424593228252,
+        0.008739085990830729, 0.00862188780234592, 0.008495181171566913,
+        0.008359341871152708, 0.008214769774778278, 0.008061886190390343,
+        0.007901129675536965, 0.007732951238768226, 0.0075578099218269355,
+        0.007376169648701285, 0.0071884979575902634, 0.006995266866333592,
+        0.006796955741674356, 0.006594055726355372, 0.006387075085938777,
+        0.006176544800725873, 0.005963023847734061, 0.005747103861767373,
+        0.005529413179447065, 0.005310620592197186, 0.005091439400946486,
+        0.0048726325290841185, 0.00465501948516693, 0.004439485866143607,
+        0.004226995863688333, 0.004018607888304508, 0.0038154929449776883,
+        0.003618954734161389, 0.0034304495141250736, 0.003251602408982491,
+        0.0030842149594164994, 0.0029302563233066857, 0.002791828100940096,
+        0.0026710915205507444, 0.0025701479288003644, 0.0024908719185397056,
+        0.0024347122397590007, 0.0024024954105319007, 0.0023942808265216375,
+        0.002409312158678535, 0.0024460839368862946, 0.0025025054642176477,
+        0.002576116364538636, 0.0026643022252595687, 0.0027644726661869615,
+        0.002874185529157205, 0.0029912185454033014, 0.003113599319156774,
+        0.0032396068319360287, 0.0033677560051014535, 0.003496773809818532,
+        0.00362557248699751, 0.003753223193602869, 0.0038789318677051243,
+        0.004002018145246684, 0.0041218975806120274, 0.0042380670741154315,
+        0.004350093197491175, 0.004457602981607812, 0.004560276665946121,
+        0.0046578418985666606, 0.004750068913349461, 0.0048367662940307235,
+        0.004917777047687851, 0.004992974838397229, 0.005062260355086517,
+        0.0051255578862812986, 0.0051828122350388375, 0.00523398612229897,
+        0.005279058197448384, 0.005318021711346079, 0.005350883823968839,
+        0.0053776654352773595, 0.005398401361526104, 0.005413140642954218,
+        0.005421946770615991, 0.0054248976585877795, 0.005422085255643618,
+        0.005413614773865239, 0.00539960359483182, 0.005380179981380389,
+        0.005355481762676434, 0.005325655166423981, 0.005290853945146449,
+        0.005251238890012646, 0.005206977757614519, 0.005158245565015611,
+        0.005105225150127465, 0.005048107857759281, 0.0049870942018269936,
+        0.004922394372461284, 0.004854228497033434, 0.0047828266186578285,
+        0.004708428413472686, 0.004631282717907955, 0.0045516469711464206,
+        0.004469786690431465, 0.0043859750872709555, 0.0043004929034875135,
+        0.004213628504308444, 0.0041256782182930146, 0.0040369468694207815,
+        0.003947748411509437, 0.0038584065531208434, 0.0037692552536123746,
+        0.0036806389770864395, 0.0035929126051624616, 0.003506440929187503,
+        0.0034215976598315095, 0.003338763906034487, 0.0032583260812815654,
+        0.00318067319636836, 0.0031061934955797336, 0.0030352703940373905,
+        0.002968277684470474, 0.0029055740074001705, 0.0028474966258700465,
+        0.002794354614696701, 0.0027464216612882834, 0.002703928771994638,
+        0.002667057268811395, 0.0026359325283833493, 0.0026106189398507626,
+        0.002591116526062206, 0.0025773595786447853, 0.002569217508646391,
+        0.002566497930019102, 0.002568951800455255, 0.00257628027348814,
+        0.0025881427921351104, 0.0026041658928187966, 0.0026239521908113907,
+        0.002647089075917584, 0.002673156742499025, 0.00270173529192308,
+        0.0027324107601958557, 0.002764780025445958, 0.002798454631217312,
+        0.0028330636189644893, 0.0028682554976924204, 0.002903699493635063,
+        0.002939086222202172, 0.0029741279133127167, 0.0030085583033781804,
+        0.0030421322865403604, 0.00307462539698782, 0.0031058331751134616,
+        0.0031355704545460526, 0.003163670594859868, 0.003189984676301337,
+        0.0032143806677395015, 0.003236742576517953, 0.0032569695882283863,
+        0.003274975204803525, 0.0032906863900847103, 0.0033040427326873865,
+        0.0033149956362687467, 0.003323507546957399, 0.003329551226953323,
+        0.003333109082019107, 0.0033341725489688893, 0.0033327415473474965,
+        0.0033288239973049607, 0.003322435403304845, 0.0033135985007059564,
+        0.0033023429596152265, 0.003288705137872283, 0.0032727278728054104,
+        0.003254460299874329, 0.0032339576856742517, 0.003211281263409656,
+        0.003186498060698903, 0.003159680712623444, 0.0031309072567896517,
+        0.0031002609113938697, 0.003067829841392252, 0.003033706921059424,
+        0.002997989503177113, 0.0029607792052872787, 0.0029221817218850112,
+        0.0028823066683205598, 0.0028412674577969156, 0.0027991812081448702,
+        0.0027561686704089465, 0.0027123541674402996, 0.0026678655284072127,
+        0.002622834004192916, 0.0025773941496315404, 0.0025316836602960065,
+        0.0024858431546263856, 0.002440015894840084, 0.002394347442593657,
+        0.002348985246578273, 0.002304078159382717, 0.002259775879687052,
+        0.002216228313768935, 0.0021735848477577166, 0.0021319935198946473,
+        0.002091600081089993, 0.002052546932942116, 0.002014971935576941,
+        0.001979007083787708, 0.001944777058470426, 0.0019123976713436076,
+        0.00188197423325707, 0.0018535998892397708, 0.0018273539754337597,
+        0.0018033004627113775, 0.0017814865578844332, 0.0017619415345844483,
+        0.0017446758615369676, 0.001729680685706588, 0.0017169277121280642,
+        0.0017063695022841738, 0.001697940190420387, 0.0016915565942606959,
+        0.0016871196755271298, 0.001684516288422825, 0.0016836211423619262,
+        0.0016842988995218844, 0.0016864063281800627, 0.0016897944387104082,
+        0.00169431053913961, 0.0016998001599015133, 0.0017061088111977513,
+        0.0017130835497995297, 0.0017205743441468726, 0.0017284352364723703,
+        0.001736525308204398, 0.00174470946006988, 0.001752859021492336,
+        0.0017608522054678242, 0.0017685744256823416, 0.001775918492461954,
+        0.0017827847038053523, 0.001789080847216714, 0.0017947221275163646,
+        0.001799631035229506, 0.0018037371694164129, 0.001806977027815453,
+        0.0018092937758863983, 0.0018106370047061397, 0.0018109624857648042,
+        0.0018102319286297283, 0.001808412745386567, 0.0018054778238562163,
+        0.0018014053100235414, 0.0017961783990013236, 0.0017897851332229866,
+        0.0017822182064207246, 0.0017734747722112426, 0.0017635562566512574,
+        0.0017524681747507834, 0.0017402199516391075, 0.0017268247495264004,
+        0.0017122993019597714, 0.0016966637569002495, 0.0016799415300406497,
+        0.00166215916945994, 0.0016433462323206347, 0.00162353517391508,
+        0.001602761248990924, 0.0015810624250445957, 0.0015584793070743173,
+        0.0015350550732313145, 0.001510835420803399, 0.0014858685220377546,
+        0.0014602049893259106, 0.0014338978493822023, 0.0014070025260549109,
+        0.0013795768314680474, 0.001351680965103836, 0.0013233775205221468,
+        0.0012947314992511436, 0.0012658103312486956, 0.0012366839011493077,
+        0.0012074245789748719, 0.0011781072534065033, 0.0011488093646716843,
+        0.00111961093275131, 0.0010905945748214893, 0.001061845503525718,
+        0.0010334514950457408, 0.0010055028126608055, 0.0009780920681347499,
+        0.000951313999599427, 0.0009252651411972658, 0.0009000433568405961,
+        0.0008757472088444267, 0.0008524751323985889, 0.000830324390207313,
+        0.0008093897887912224, 0.000789762150274064, 0.0007715265513244614,
+        0.0007547603644249965, 0.0007395311644537711, 0.0007258945932621198,
+        0.0007138923020875586, 0.0007035501115109821, 0.0006948765352195661,
+        0.0006878618034421373, 0.0006824774924136559, 0.0006786768200410019,
+        0.0006763956107240685, 0.0006755538728775657, 0.0006760578803912157,
+        0.0006778026121982699, 0.0006806743866294623, 0.0006845535299469457,
+        0.0006893169379378239, 0.0006948404201926248, 0.0007010007522518592,
+        0.0007076773957488058, 0.0007147538768072097, 0.0007221188362857497,
+        0.0007296667813653587, 0.0007372985771165047, 0.0007449217203275334,
+        0.0007524504374489968, 0.0007598056455536835, 0.0007669148106888298,
+        0.0007737117329216369, 0.000780136282258811, 0.0007861341048182262,
+        0.0007916563143216001, 0.0007966591802442584, 0.0008011038207875649,
+        0.000804955906234809, 0.0008081853761416466, 0.0008107661721827805,
+        0.0008126759872724616, 0.0008138960307559716, 0.0008144108089696451,
+        0.0008142079202475296, 0.0008132778634289492, 0.0008116138590129089,
+        0.0008092116822805712, 0.0008060695078474351, 0.0008021877652369038,
+        0.0007975690050834827, 0.0007922177755375132, 0.0007861405083344336,
+        0.000779345413850304, 0.0007718423843202303, 0.0007636429043080192,
+        0.0007547599674819034, 0.0007452079988211536, 0.0007350027815281601,
+        0.0007241613881393536, 0.000712702115620111, 0.0007006444244996013,
+        0.0006880088823483135, 0.0006748171121453054, 0.0006610917462012969,
+        0.0006468563864069625, 0.0006321355716037251, 0.0006169547529172346,
+        0.0006013402779322166, 0.0005853193847263471, 0.0005689202069901387,
+        0.0005521717918568831, 0.0005351041326095086, 0.0005177482191626564,
+        0.0005001361102205307, 0.00048230103220327594, 0.0004642775115853122,
+        0.0004461015491721612, 0.00042781084727950007, 0.0004094451037712761,
+        0.0003910463908506431, 0.00037265964142864654, 0.0003543332722377195,
+        0.0003361199806181457, 0.0003180777612186983, 0.0003002711989478251,
+        0.00028277310374521034, 0.00026566655658644757, 0.0002490474257426606,
+        0.00023302736977663866, 0.00021773723701245463, 0.0002033305479109753,
+        0.000189986334746581, 0.00017790994783580094, 0.00016732955727479168,
+        0.00015848532757656728, 0.0001516085160478358, 0.00014689037722805958,
+        0.00014444630715236518, 0.00014428676569294886, 0.00014630768020700463,
+        0.0001503056603662818, 0.00015601163576598316, 0.00016312948482811947,
+        0.0001713679608513, 0.0001804608721016354, 0.0001901762827509793,
+        0.00020031808011401135, 0.00021072332106568175, 0.00022125781346505696,
+        0.0002318113694250425, 0.00024229343096975148, 0.00025262933044342575,
+        0.00026275722216200984, 0.00027262562221839625, 0.00028219146038847604,
+        0.000291418546622521, 0.0003002763658148836, 0.0003087391293616422,
+        0.00031678502636004244, 0.00032439562965983247, 0.00033155542209325274,
+        0.0003382514161750161, 0.0003444728467601858, 0.0003502109209195621,
+        0.00035545861289108094, 0.00036021049474713835, 0.0003644625954875513,
+        0.00036821228284457597, 0.0003714581633113665, 0.0003741999967946778,
+        0.0003764386230559358, 0.00037817589763541176, 0.00037941463544839926,
+        0.00038015856061239165, 0.00038041226138275984, 0.00038018114934476805,
+        0.0003794714222234867, 0.0003782900298243158, 0.0003766446427936811,
+        0.00037454362391362754, 0.00037199600177585966, 0.0003690114466726663,
+        0.0003656002486098512, 0.0003617732973582496, 0.0003575420645157381,
+        0.00035291858759424927, 0.0003479154562193248, 0.0003425458006251324,
+        0.0003368232827164872, 0.00033076209008831513, 0.00032437693354077715,
+        0.0003176830487244827, 0.00031069620274450874, 0.0003034327067088109,
+        0.0002959094353842446, 0.00028814385543135247, 0.0002801540639303862,
+        0.00027195883936640563, 0.0002635777077201127, 0.0002550310269660095,
+        0.00024634009409655206, 0.00023752727981213344, 0.00022861619726416475,
+        0.00021963191275116984, 0.00021060120803337412, 0.0002015529059312796,
+        0.00019251827292605453, 0.0001835315142961119, 0.00017463037820276145,
+        0.00016585688377143243, 0.00015725818228583429, 0.00014888754613841596,
+        0.00014080545075874297, 0.00013308066113147868, 0.00012579114513609448,
+        0.00011902450105595716, 0.00011287740995425062, 0.00010745344530758845,
+        0.00010285850076423325, 9.919332266044392e-05, 9.654336160109371e-05,
+        9.4967393400872e-05, 9.448764073651012e-05, 9.508454539305313e-05,
+        9.6698194115775e-05, 9.923604430395083e-05, 0.00010258441480496156,
+        0.00010662045201532408, 0.00011122204382317858, 0.00011627457711798444,
+        0.0001216746345022094, 0.00012733134200952926, 0.0001331661992696381,
+        0.0001391120822283006, 0.00014511189511393568, 0.0001511171592058077,
+        0.00015708669023310482, 0.00016298543063846235, 0.0001687834541796511,
+        0.00017445513538501075, 0.0001799784654365308, 0.0001853344928232448,
+        0.00019050686766942804, 0.00019548147090734557, 0.00020024611225987965,
+        0.0002047902837089865, 0.0002091049576107157, 0.0002131824206987991,
+        0.00021701613696168816, 0.00022060063378263702, 0.00022393140688018134,
+        0.00022700484047857638, 0.00022981813987938104, 0.00023236927415252673,
+        0.00023465692713596877, 0.00023668045527850415, 0.00023843985114110056,
+        0.00023993571159829923, 0.00024116920995648507, 0.00024214207134921542,
+        0.00024285655089409313, 0.00024331541418500983, 0.0002435219197896552,
+        0.0002434798034850172, 0.00024319326402651116, 0.00024266695030167087,
+        0.00024190594976112578, 0.00024091577804420975, 0.00023970236976067735,
+        0.00023827207039410568, 0.0002366316293143523, 0.0002347881938933224,
+        0.00023274930473544681, 0.00023052289202334016, 0.00022811727300214586,
+        0.00022554115061565677, 0.00022280361332227915, 0.00021991413610595128,
+        0.00021688258269952766, 0.0002137192090261928, 0.00021043466783347744,
+        0.0002070400144699172, 0.00020354671369152816, 0.00019996664732492835,
+        0.00019631212250634, 0.0001925958801078356, 0.00018883110278662468,
+        0.00018503142191915738, 0.0001812109224387842], [3.374327462006686e-14,
+        1.0141694935976288e-13, 1.6965381408435747e-13, 2.388353558286598e-13,
+        3.093521842373039e-13, 3.816078775234035e-13, 4.560229795549833e-13,
+        5.330392677592272e-13, 6.131243083126326e-13, 6.967763902401513e-13,
+        7.845299081753303e-13, 8.769612822284214e-13, 9.746955002607617e-13,
+        1.0784134064107396e-12, 1.1888598426771681e-12, 1.3068527977658835e-12,
+        1.4332937166371816e-12, 1.5691791606017089e-12, 1.7156140370925539e-12,
+        1.8738266408714593e-12, 2.045185814034115e-12, 2.231220546547316e-12,
+        2.4336424297595107e-12, 2.6543714217886035e-12, 2.895565471496146e-12,
+        3.1596546406843316e-12, 3.4493804885384314e-12, 3.7678415966541e-12,
+        4.1185463019487635e-12, 4.505473867758742e-12, 4.933145596307431e-12,
+        5.406707611029668e-12, 5.932027428713679e-12, 6.5158067963224035e-12,
+        7.1657137936273104e-12, 7.890537755797179e-12, 8.700371321400984e-12,
+        9.606824736356152e-12, 1.0623278648493507e-11, 1.1765182854298824e-11,
+        1.3050410099809812e-11, 1.4499675888052157e-11, 1.613703769021208e-11,
+        1.7990489783487316e-11, 2.0092673624474065e-11, 2.248172795828058e-11,
+        2.520230860556275e-11, 2.83068143469484e-11, 3.1856864289304545e-11,
+        3.5925082271770194e-11, 4.059725756993567e-11, 4.5974967708629645e-11,
+        5.217877023950778e-11, 5.935209715054972e-11, 6.7666019148529e-11,
+        7.732508990841251e-11, 8.857453534152358e-11, 1.0170912228174612e-10,
+        1.170841312843611e-10, 1.3512897314547036e-10, 1.5636413804488113e-10,
+        1.8142235953960807e-10, 2.1107512687058606e-10, 2.462660073037644e-10,
+        2.881526704698312e-10, 3.381600730127381e-10, 3.980480092875475e-10,
+        4.699972264384627e-10, 5.567196246869845e-10, 6.615998319855188e-10,
+        7.888778213072527e-10, 9.43885451435033e-10, 1.133354173692524e-09,
+        1.3658170921365087e-09, 1.6521367248778128e-09, 2.0062010528771276e-09,
+        2.445846036622729e-09, 2.9940845049255936e-09, 3.6807518077562537e-09,
+        4.544721658510474e-09, 5.63690669865327e-09, 7.024345750933946e-09,
+        8.795805638699e-09, 1.1069508124332106e-08, 1.4003859639423207e-08,
+        1.781245512877124e-08, 2.278521246086684e-08, 2.931837117230826e-08,
+        3.7957417049295985e-08, 4.9459023357685315e-08, 6.488123244695497e-08,
+        8.571599242890761e-08, 1.1408588612736982e-07, 1.5303923407500773e-07,
+        2.069977439200334e-07, 2.8244370570291963e-07, 3.889884407511889e-07,
+        5.410563635144125e-07, 7.605786296024916e-07, 1.0813704942008561e-06,
+        1.5563682274353882e-06, 2.269819992341055e-06, 3.358247896524456e-06,
+        5.047316997343874e-06, 7.718331472441427e-06, 1.2031583112346027e-05,
+        1.9162533489032885e-05, 3.127071738465789e-05, 5.247047369392347e-05,
+        9.094184158275795e-05, 0.00016379921906362502, 0.00030916269895662346,
+        0.0006189638946784566, 0.0013396547505221414, 0.003239802874096477,
+        0.009376745389051434, 0.03983998994131115, 1.0230972533264857, 0.23658086086814883,
+        0.60253882850002, 0.8027324092451283, 0.47976681524870923, 0.5966161017760422,
+        1.2653082100400403, 2.0243261282756633, 1.2557610643247081, 1.2825110537623947,
+        2.1575943048038995, 3.5151328373777533, 3.913363851855454, 2.8767267190055925,
+        1.846208493721509, 1.500041231927762, 1.4775342175275623, 1.7203057077897757,
+        2.316269832097474, 2.9125175755167794, 2.358294608424995, 1.7401091214357478,
+        1.4517255152884199, 1.3762152268889782, 1.465693601932451, 1.7382361449264294,
+        2.1908771695604488, 2.402085418204379, 1.9873524762282866, 1.5536952003493214,
+        1.3123222350366366, 1.2184431182748283, 1.2394837326917099, 1.3751104211859109,
+        1.6306082368530836, 1.8779347238889164, 1.7602797078850734, 1.3991423196141968,
+        1.119680497068247, 0.9607458670670642, 0.7114528031279506, 0.6189970569470606,
+        0.5735108697756778, 0.5373195242822607, 0.4900949652542053, 0.42689676857856335,
+        0.3586290151999086, 0.2978080993950775, 0.24938365316146527, 0.21271192409686576,
+        0.18529931502969058, 0.164557448181518, 0.14820101910082384, 0.13415714677979249,
+        0.12045316169231038, 0.10541590277522164, 0.08833017783744262, 0.06999096532955341,
+        0.05217957162843289, 0.036407067366544886, 0.023265912072724274,
+        0.012642433904697492, 0.00426505099857664, 0.003599342384943757,
+        0.009185229257394279, 0.014133023672193469, 0.01850037965452101,
+        0.022461429508791545, 0.026172536125300773, 0.029772712138953217,
+        0.033390230809624846, 0.037148203109539014, 0.04116849479646549,
+        0.04557375740587194, 0.05048674796680825, 0.056025101051708034,
+        0.06228842845894224, 0.06933352155336309, 0.07713411200685741, 0.08552769626146633,
+        0.09416787201206898, 0.10252404688109053, 0.1099771373275853, 0.11601040885601598,
+        0.12039964544860836, 0.1232733334470385, 0.12501192880295653, 0.1260775271313735,
+        0.12687879569857477, 0.127708162971456, 0.12873345333093622, 0.13001460993686273,
+        0.13152685039976347, 0.13318374942578978, 0.13486042921915256, 0.13641848518011046,
+        0.13773227851640626, 0.13871293091829145, 0.13932427155753827, 0.13958607475442578,
+        0.13956403207769985, 0.1393505473562325, 0.13904282836585563, 0.13872401671506396,
+        0.13845054404583762, 0.1382464002838508, 0.13810356912363428, 0.13798746234786174,
+        0.13784616281754922, 0.13762211596196916, 0.1372644298696195, 0.1367394388306606,
+        0.13603717813152985, 0.135172265700957, 0.13417922409407373, 0.13310384592870997,
+        0.13199310186211607, 0.13088604027279227, 0.1298073897484571, 0.1287646405850158,
+        0.12774861549746422, 0.12673703682904933, 0.12570026407253998, 0.12460810222229521,
+        0.12343636905067491, 0.12217187915629751, 0.12081479454062939, 0.11937792054945764,
+        0.11788331405963569, 0.1163572255048206, 0.11482468620058292, 0.11330493530761761,
+        0.11180849160777853, 0.11033620844906411, 0.10888024449714631, 0.10742658348195809,
+        0.10595852887970929, 0.10446046912355204, 0.1029211723169877, 0.10133596545062187,
+        0.0997074001074892, 0.0980443630398309, 0.09635995413946734, 0.0946687102300913,
+        0.09298383045965777, 0.0913149635598846, 0.08966691371154412, 0.08803938968819676,
+        0.08642771848140256, 0.08482429353085168, 0.08322043132414154, 0.08160826715081686,
+        0.07998233505223329, 0.07834055336263165, 0.0766844694261433, 0.07501877933205926,
+        0.07335028969665523, 0.07168658818837544, 0.0700347155500078, 0.06840008860270846,
+        0.06678583572170159, 0.06519260453750829, 0.06361881074391891, 0.06206122994744303,
+        0.060515794664009526, 0.058978444387754646, 0.057445885410055436,
+        0.05591614613440955, 0.05438885858594148, 0.05286525022129083, 0.05134788170415208,
+        0.04984020538352191, 0.04834603857498024, 0.04686904388844983, 0.04541229024843746,
+        0.04397794077960632, 0.04256708570731138, 0.04117971578662783, 0.03981481715746474,
+        0.03847056157029865, 0.037144564340242284, 0.03583418342424333,
+        0.034536834324683525, 0.03325029590720182, 0.03197298178791558,
+        0.03070415196709477, 0.02944404162511326, 0.02819389013612324, 0.026955863799142346,
+        0.025732879508525645, 0.024528350868815572, 0.023345889786958902,
+        0.022189002399556016, 0.021060817055672358, 0.01996387459291298,
+        0.018899999633732973, 0.017870259020029092, 0.0168750024037174,
+        0.015913972029644702, 0.0149864643732577, 0.014091525135426625,
+        0.013228160349056639, 0.012395549154252082, 0.011593247446966036,
+        0.010821375570519303, 0.010080786977410197, 0.009373217675234451,
+        0.008701417105523756, 0.008069258086334392, 0.007481813907051385,
+        0.006945371560154026, 0.006467320040621079, 0.006055817655990823,
+        0.005719125730849507, 0.005464545437431608, 0.005297058834626118,
+        0.005218028855115823, 0.005224481314992621, 0.005309348553364141,
+        0.005462606893914385, 0.005672824029796785, 0.005928561492131805,
+        0.006219314232087057, 0.006535956231675749, 0.006870823441094638,
+        0.007217595516208601, 0.007571100814975453, 0.007927118843320629,
+        0.008282214291856726, 0.008633611084085483, 0.008979100700555461,
+        0.00931697284705998, 0.009645955626903475, 0.00996515487340378,
+        0.010273986726874521, 0.010572102585211886, 0.0108593100715169,
+        0.011135496785733875, 0.011400564853486088, 0.011654383602232275,
+        0.0118967653410487, 0.01212746573375979, 0.012346206291966038, 0.012552712821133677,
+        0.012746760950091737, 0.012928218750352424, 0.01309707722000325,
+        0.01325346199562846, 0.013397623560450003, 0.013529907615550538,
+        0.013650711231050586, 0.013760433083796635, 0.013859427030406992,
+        0.013947967377334966, 0.014026231774392944, 0.014094304212112552,
+        0.014152196812947626, 0.014199885652681257, 0.014237353344772004,
+        0.014264630018484386, 0.014281824835125363, 0.014289142220070574,
+        0.014286880128236, 0.014275411249323586, 0.01425515134276346, 0.014226521206962937,
+        0.014189909714710824, 0.014145644789857198, 0.014093977369047828,
+        0.014035080718139855, 0.013969064499760443, 0.013896000267701878,
+        0.01381595307175503, 0.013729012929728529, 0.01363532020566314,
+        0.013535080343125477, 0.013428565641879239, 0.013316104364023168,
+        0.013198059878368968, 0.013074804318748098, 0.012946692026678112,
+        0.012814037780517826, 0.012677103610690015, 0.01253609616322383,
+        0.012391174488913517, 0.012242466202342707, 0.012090088511772908,
+        0.011934169906396955, 0.011774868395405156, 0.011612383072067136,
+        0.01144695722368548, 0.011278872922059426, 0.011108438656466577,
+        0.010935972798392576, 0.010761786293958134, 0.01058616789535576,
+        0.010409374535127679, 0.010231628301845628, 0.010053120144528001,
+        0.009874019174410435, 0.009694485472104327, 0.009514683799521155,
+        0.009334795621878696, 0.009155027337131146, 0.008975613463528499,
+        0.00879681457097066, 0.008618910745054765, 0.008442192153221782,
+        0.008266948703236639, 0.008093460793331772, 0.007921992783952028,
+        0.007752790174672375, 0.007586080696672084, 0.00742207877915565,
+        0.007260992259221551, 0.007103029864808246, 0.0069484079565834776,
+        0.006797355247570782, 0.00665011466746773, 0.006506942102009997,
+        0.00636810230327319, 0.0062338627265994696, 0.006104486330198558,
+        0.005980224436470966, 0.005861310612918558, 0.005747956231859088,
+        0.005640347985270248, 0.005538647242813983, 0.0054429908169505254,
+        0.005353492490313544, 0.005270244592993807, 0.005193318988486877,
+        0.005122767013853268, 0.005058618179491587, 0.005000877715823858,
+        0.0049495233082543656, 0.004904501545672921, 0.004865724695382932,
+        0.00483306840056998, 0.004806370783630473, 0.004785433253588883,
+        0.004770023088886968, 0.004759877633800456, 0.004754709740679196,
+        0.004754213940208204, 0.004758072748434186, 0.004765962532267785,
+        0.004777558451788543, 0.0047925381623165906, 0.004810584164949469,
+        0.004831384906993872, 0.004854634918119858, 0.004880034393484906,
+        0.00490728868181235, 0.0049361080984766156, 0.004966208370238008,
+        0.004997311851630589, 0.0050291494644827475, 0.005061463136698322,
+        0.005094008386901985, 0.00512655664202813, 0.005158896896786027,
+        0.005190836423011812, 0.005222200394121473, 0.005252830474805853,
+        0.005282582603081112, 0.005311324326750721, 0.005338932124147453,
+        0.005365289127720927, 0.005390283581931309, 0.0054138082217802495,
+        0.005435760582754985, 0.005456044080200223, 0.005474569557854332,
+        0.005491256926416488, 0.005506036507205899, 0.005518849762480424,
+        0.005529649219266298, 0.005538397551918748, 0.005545065949774133,
+        0.005549632029126754, 0.0055520776292581515, 0.005552386846786418,
+        0.005550544610621335, 0.005546535993326708, 0.005540346315287449,
+        0.005531961952720044, 0.005521371636204486, 0.005508567945520813,
+        0.005493548682413945, 0.005476317838592166, 0.005456885962716766,
+        0.005435269850040158, 0.005411491607716248, 0.0053855772634233065,
+        0.005357555163804231, 0.005327454439285899, 0.005295303789644167,
+        0.005261130776553286, 0.0052249617100928675, 0.005186822105285791,
+        0.005146737583058418, 0.00510473501569683, 0.005060843682248386,
+        0.005015096208893904, 0.004967529119842848, 0.004918182903776335,
+        0.004867101594316995, 0.004814331952079253, 0.004759922404305212,
+        0.004703921934824937, 0.004646379116745394, 0.004587341444987108,
+        0.004526855064324655, 0.004464964912853341, 0.004401715226091408,
+        0.004337150286244707, 0.004271315264273999, 0.004204256995661113,
+        0.004136024552358767, 0.004066669519083786, 0.003996245940915271,
+        0.003924809971301136, 0.003852419301826409, 0.0037791324903040007,
+        0.0037050083156339323, 0.0036301052762371016, 0.0035544813177970764,
+        0.0034781938314486075, 0.0034012999159939547, 0.003323856853940824,
+        0.0032459227204987427, 0.003167557030569241, 0.00308882133247192,
+        0.003009779678003565, 0.002930498929865144, 0.0028510489045975077,
+        0.0027715023846521555, 0.002691935060764043, 0.0026124254820267282,
+        0.002533055093750004, 0.0024539084336639805, 0.0023750735378964423,
+        0.0022966425844329315, 0.002218712777595829, 0.002141387457422175,
+        0.0020647774056213315, 0.0019890023161192763, 0.001914192402538518,
+        0.0018404901254592974, 0.0017680520334962717, 0.0016970507211465588,
+        0.0016276769049144385, 0.001560141603891155, 0.0014946783733928103,
+        0.0014315454767366198, 0.001371027784326754, 0.0013134380593471185,
+        0.0012591171287728957, 0.0012084322609866836, 0.001161772912654733,
+        0.0011195429298540825, 0.0010821483867935263, 0.0010499806335975868,
+        0.0010233948881414815, 0.0010026858275237844, 0.0009880629020730673,
+        0.0009796290842923106, 0.0009773669591587333, 0.0009811351218153616,
+        0.0009906758900999062, 0.0010056329842945703, 0.0010255759181006807,
+        0.001050026998044528, 0.0010784871422410366, 0.0011104578370676244,
+        0.0011454579075000362, 0.0011830349439834475, 0.0012227719969129943,
+        0.001264290513312798, 0.0013072505519650475, 0.001351349199583472,
+        0.0013963179238832735, 0.0014419194048184742, 0.0014879442156332265,
+        0.0015342075913376124, 0.0015805464238474944, 0.0016268165538949615,
+        0.001672890383658728, 0.001718654804568547, 0.0017640094168837428,
+        0.001808865008325764, 0.0018531422552040535, 0.0018967706095727064,
+        0.0019396873386703887, 0.0019818366871115463, 0.002023169137324687,
+        0.0020636407489237054, 0.0021032125626094054, 0.0021418500584829935,
+        0.002179522662357763, 0.002216203296309517, 0.002251867971830469,
+        0.0022864954252915424, 0.0023200667961264265, 0.0023525653485445414,
+        0.0023839762371335683, 0.002414286316275581, 0.00244348399195285,
+        0.0024715591132895075, 0.002498502899222497, 0.002524307894088582,
+        0.0025489679441729925, 0.0025724781862045305, 0.0025948350382800894,
+        0.002616036184288012, 0.0026360805443987677, 0.002654968226641935,
+        0.0026727004578547577, 0.002689279495689814, 0.002704708526795509,
+        0.00271899155886191, 0.002732133315811096, 0.0027441391455472566,
+        0.002755014948306796, 0.0027647671310561056, 0.0027734025897290207,
+        0.0027809287171616766, 0.0027873534308857323, 0.0027926852120490338,
+        0.0027969331452898567, 0.0028001069494529764, 0.0028022169908017685,
+        0.0028032742734042915, 0.002803290405286336, 0.002802277543008616,
+        0.0028002483209320084, 0.0027972157739226157, 0.0027931932632827864,
+        0.0027881944150518726, 0.002782233077675569, 0.00277532330276632,
+        0.0027674793488403266, 0.0027587157041854137, 0.0027490471219784795,
+        0.002738488659022641, 0.0027270557091332967, 0.00271476402346806,
+        0.002701629712525437, 0.0026876692278542426, 0.0026728993250161944,
+        0.0026573370124659632, 0.002640999493272291, 0.0026239041075650092,
+        0.002606068283217034, 0.0025875095006454916, 0.0025682452750380317,
+        0.0025482931562823717, 0.0025276707439525516, 0.002506395712303725,
+        0.002484485838844042, 0.0024619590297594975, 0.0024388333363225515,
+        0.002415126958318206, 0.002390858232793008, 0.002366045609151639,
+        0.002340707613758702, 0.0023148628089139822, 0.0022885297517155757,
+        0.0022617269581661817, 0.002234472876639646, 0.002206785873172038,
+        0.0021786842289466574, 0.0021501861483282265, 0.0021213097742433656,
+        0.002092073206748632, 0.002062494520303375, 0.002032591776002026,
+        0.002002383025929009, 0.001971886308447875, 0.001941119634801713,
+        0.001910100968798048, 0.0018788482023985808, 0.0018473791305645216,
+        0.0018157114285738633, 0.001783862634472124, 0.0017518501384026282,
+        0.0017196911793460356, 0.0016874028486995216, 0.0016550020992684112,
+        0.001622505757525543, 0.0015899305368582454, 0.0015572930497104829,
+        0.001524609816875377, 0.0014918972730927535, 0.0014591717686854074,
+        0.001426449567734801, 0.0013937468439336259, 0.001361079675504571,
+        0.0013284640407610594, 0.0012959158157429247, 0.0012634507751860301,
+        0.0012310845976811625, 0.0011988328755655215, 0.001166711129743918,
+        0.0011347348294082087, 0.0011029194165274251, 0.0010712803349023615,
+        0.0010398330636727526, 0.0010085931552853663, 0.0009775762781378422,
+        0.0009467982642524214, 0.0009162751626403455, 0.0008860232992125086,
+        0.0008560593444379894, 0.0008264003901822021, 0.0007970640376760267,
+        0.000768068498928349, 0.0007394327144223647, 0.0007111764905969129,
+        0.0006833206611345162, 0.0006558872768347052, 0.0006288998294678091,
+        0.0006023835156542966, 0.0005763655473860883, 0.0005508755161336329,
+        0.0005259458176151421, 0.0005016121436163485, 0.0004779140457441194,
+        0.0004548955725520091, 0.00043260597533907786, 0.00041110046734766216,
+        0.0003904410041675968, 0.00037069702705362444, 0.00035194607309137237,
+        0.00033427410441304675, 0.00031777534410381273, 0.00030255133612707883,
+        0.00028870888944950503, 0.0002763565576498819, 0.00026559939640110377,
+        0.00025653198699028, 0.00024923013860751823, 0.00024374222670761533,
+        0.00024008161343478892, 0.00023822176901687288, 0.00023809536329159677,
+        0.00023959774162510855, 0.0002425941412889676, 0.00024692917857195785,
+        0.0002524368487137548, 0.00025894954146637365, 0.0002663051559054596,
+        0.0002743520132153368, 0.00028295172405197407, 0.0002919804108198332,
+        0.00030132875099781354, 0.0003109012645653115, 0.0003206151787997486,
+        0.00033039910756418715, 0.0003401916996452831, 0.00034994034809875395,
+        0.0003596000088629284, 0.0003691321486496153, 0.00037850382492162865,
+        0.0003876868912134297, 0.0003966573164027309, 0.0004053946047890314,
+        0.0004138813038489617, 0.00042210258734271287, 0.0004300459026708047,
+        0.00043770067268824274, 0.0004450580434267762, 0.00045211067034654854,
+        0.0004588525367461553, 0.00046527879891988767, 0.00047138565345365306,
+        0.0004771702228428536, 0.0004826304562968797, 0.00048776504322309007,
+        0.000492573337430407, 0.0004970552905453362, 0.0005012113935058216,
+        0.0005050426252369313, 0.0005085504077852698, 0.0005117365672609546,
+        0.0005146032999446287, 0.0005171531428999719, 0.0005193889484031175,
+        0.0005213138614712652, 0.0005229312998258289, 0.0005242449356622972,
+        0.000525258678731519, 0.0005259766603768684, 0.0005264032183225392,
+        0.0005265428821753265, 0.0005264003597037077, 0.0005259805240573435,
+        0.0005252884020958495, 0.0005243291639769815, 0.0005231081140746538,
+        0.0005216306832075037, 0.0005199024220375773, 0.0005179289954249986,
+        0.0005157161774512959, 0.0005132698468218011, 0.0005105959823767739,
+        0.0005077006585205235, 0.0005045900404661723, 0.0005012703793121977,
+        0.0004977480070511115, 0.0004940293316919409, 0.0004901208327116648,
+        0.0004860290570403412, 0.0004817606157407624, 0.0004773221814810895,
+        0.0004727204867919436, 0.000467962323039787, 0.00046305453995907546,
+        0.00045800404557142784, 0.00045281780629750765, 0.0004475028471082216,
+        0.0004420662516270294, 0.0004365151621498167, 0.0004308567796399872,
+        0.00042509836380961996, 0.0004192472334410126, 0.00041331076711873893,
+        0.00040729640450213537, 0.0004012116482652038, 0.0003950640667194305,
+        0.0003888612971200028, 0.000382611049550001, 0.0003763211112679119,
+        0.00036999935135592735, 0.00036365372551653587, 0.0003572922808675061,
+        0.0003509231606385455, 0.0003445546086748647, 0.0003381949737071878,
+        0.00033185271333725585, 0.0003255363976932462, 0.00031925471267012565,
+        0.00031301646260846195, 0.0003068305721988465, 0.0003007060873097658,
+        0.0002946521743342271, 0.00028867811758006396, 0.00028279331412156734,
+        0.0002770072655042183, 0.00027132956558871443, 0.00026576988384216705,
+        0.0002603379433316004, 0.0002550434926950821, 0.00024989627138459047,
+        0.00024490596752817706, 0.000240082167843883, 0.00023543429916539815,
+        0.0002309715613307267, 0.00022670285142085606, 0.00022263667968296116,
+        0.0002187810778585948, 0.00021514350111381174, 0.00021173072529776036,
+        0.00020854874181256048, 0.00020560265289814274, 0.00020289657062746977,
+        0.00020043352323905657, 0.00019821537261513852, 0.00019624274666536103,
+        0.00019451499006411805, 0.00019303013622611287, 0.00019178490261502335,
+        0.00019077471045593765, 0.00018999372885055278, 0.0001894349421164113,
+        0.00018909023813874168, 0.00018895051458930054, 0.00018900579919613997,
+        0.00018924537983221472, 0.00018965794005915867, 0.00019023169590847572,
+        0.000190954530045891, 0.0001918141199994935, 0.0001927980577901846,
+        0.00019389395898191883, 0.0001950895598577291, 0.00019637280205796366,
+        0.00019773190454623463, 0.00019915542322742035, 0.00020063229886208201,
+        0.0002021518941694916, 0.0002037040211547449, 0.00020527895975859935,
+        0.000206867468960374, 0.00020846079142031973, 0.0002100506526990712,
+        0.00021162925601031951, 0.00021318927338614466, 0.00021472383402945243,
+        0.00021622651055172587, 0.00021769130368882412, 0.00021911262601105589,
+        0.0002204852850474145, 0.0002218044661728565, 0.00022306571552576984,
+        0.00022426492316029493, 0.0002253983065759775, 0.00022646239472750985,
+        0.00022745401257126272, 0.0002283702661858891, 0.00022920852848652337,
+        0.00022996642554365033, 0.00023064182351256033, 0.00023123281618199246,
+        0.0002317377131493418, 0.00023215502862897696, 0.00023248347089248995,
+        0.00023272193233846505, 0.00023286948017878518, 0.00023292534770869998,
+        0.00023288892613316703, 0.00023275975689935382, 0.00023253752449066607,
+        0.00023222204962631708, 0.00023181328283000926, 0.0002313112983189123,
+        0.0002307162881900628, 0.00023002855688389405, 0.0002292485159166134,
+        0.00022837667887820818, 0.00022741365669996552, 0.00022636015319587455,
+        0.00022521696087220942, 0.00022398495700531073, 0.00022266509997166827,
+        0.0002212584258120114, 0.00021976604500282401, 0.00021818913941426662,
+        0.00021652895942523686, 0.00021478682117490814, 0.00021296410393810913,
+        0.00021106224761636817, 0.00020908275034315762, 0.0002070271662213662,
+        0.00020489710318841284, 0.00020269422104505168, 0.00020042022964316848,
+        0.00019807688725801922, 0.00019566599914624396, 0.000193189416292869,
+        0.00019064903435215107, 0.00018804679277328293, 0.00018538467411136363,
+        0.00018266470352588793, 0.00017988894846870877, 0.00017705951857646714,
+        0.0001741785657869937, 0.00017124828470677393, 0.00016827091326669752,
+        0.0001652487337111652, 0.0001621840739642208, 0.00015907930943078073,
+        0.00015593686528853114, 0.00015275921933643747, 0.0001495489054595272,
+        0.00014630851780189665, 0.00014304071572309148, 0.00013974822964750092,
+        0.0001364338679299136, 0.00013310052488219094, 0.00012975119013490554,
+        0.0001263889595411179, 0.0001230170478669947, 0.00011963880354970792,
+        0.00011625772585675828, 0.00011287748482065228, 0.00010950194438867431,
+        0.00010613518927242935, 0.0001027815560540292, 9.944566914966247e-05,
+        9.613248228885154e-05, 9.284732619620992e-05], [9.489071882990918e-14,
+        2.852368545907373e-13, 4.772829823503451e-13, 6.721820568992349e-13,
+        8.711167679015274e-13, 1.0753121175723575e-12, 1.2860485571966076e-12,
+        1.5046760641181082e-12, 1.732629254527475e-12, 1.9714438457501e-12,
+        2.2227747279361617e-12, 2.488415967793271e-12, 2.77032306951918e-12,
+        3.070637942726709e-12, 3.3917169953725847e-12, 3.736162926675599e-12,
+        4.106860817784475e-12, 4.5070192531455335e-12, 4.940217326957038e-12,
+        5.410458498151699e-12, 5.922232502497708e-12, 6.480586635477849e-12,
+        7.091208064347772e-12, 7.760519058723576e-12, 8.495787403333154e-12,
+        9.305254671995857e-12, 1.0198285584174185e-11, 1.118554221511579e-11,
+        1.2279187656116629e-11, 1.3493124526401509e-11, 1.4843274956364505e-11,
+        1.6347909823466027e-11, 1.8028036816887566e-11, 1.990785873146473e-11,
+        2.201531593653955e-11, 2.4382729822927514e-11, 2.7047567810154163e-11,
+        3.005335487550631e-11, 3.345076231326556e-11, 3.729891116718882e-11,
+        4.166693662753679e-11, 4.663587019134274e-11, 5.230091011938795e-11,
+        5.877416734170367e-11, 6.618799558035935e-11, 7.469904083865149e-11,
+        8.44931803363666e-11, 9.579156305725844e-11, 1.0885802100751116e-10,
+        1.240081895175754e-10, 1.4162076744297536e-10, 1.6215146518416183e-10,
+        1.8615034091317295e-10, 2.14283424777241e-10, 2.4735979007131683e-10,
+        2.8636557161078636e-10, 3.325068833449443e-10, 3.872641828654102e-10,
+        4.5246143019307545e-10, 5.303544552114862e-10, 6.237443907438723e-10,
+        7.361239850780383e-10, 8.71867278938924e-10, 1.0364768056209557e-09,
+        1.2369075607034502e-09, 1.4819940890553448e-09, 1.7830170247431323e-09,
+        2.154459601741655e-09, 2.6150249763792276e-09, 3.1890146161129388e-09,
+        3.908211077055887e-09, 4.814472304814778e-09, 5.96334042510563e-09,
+        7.429114006812285e-09, 9.312059031358516e-09, 1.1748790724471104e-08,
+        1.4927433467037835e-08, 1.9110114346286094e-08, 2.4666953135813743e-08,
+        3.2128522142353134e-08, 4.2268848573131044e-08, 5.6240696935604896e-08,
+        7.580417316666186e-08, 1.0373079853382843e-07, 1.4455998501153774e-07,
+        2.0612671430078944e-07, 3.029845965973817e-07, 4.6532320489958665e-07,
+        7.684447398262621e-07, 1.4851504480784554e-06, 7.775837631884214e-06,
+        3.4407148128431454e-06, 3.0788829762166794e-06, 3.258818290733597e-06,
+        3.7014917168285965e-06, 4.384403432797052e-06, 5.350336838297002e-06,
+        6.685580238402496e-06, 8.526052456023382e-06, 1.1077024914207207e-05,
+        1.4647909600949463e-05, 1.970996252775813e-05, 2.6992227757710012e-05,
+        3.764391464692145e-05, 5.3515778788747716e-05, 7.766138144884732e-05,
+        0.00011525871552788061, 0.00017536727476370214, 0.00027442166635680085,
+        0.00044353031746830585, 0.0007446564097185973, 0.0013092090476287278,
+        0.0024390391545493764, 0.004905497122939002, 0.011004932055370268,
+        0.029482000992857936, 0.11563853895319001, 2.732521321110213, 0.5791026043870786,
+        1.3450828889750528, 1.6242100185566206, 0.8729354000297638, 0.9660804995654968,
+        1.7975150996519422, 2.4706419575272673, 1.2726452388315594, 1.0099844052562945,
+        1.0795995800138873, 1.4988689589718374, 2.3978640145625287, 1.9221807082842568,
+        1.277459777164595, 1.0546005396709395, 1.046017793676741, 1.2204352720098466,
+        1.642001616311435, 2.059575405212211, 1.6617657403926298, 1.2210516614564035,
+        1.0140929381360055, 0.9568791053522144, 1.0143877332332754, 1.1976516878254435,
+        1.5032210554543757, 1.6418998533929692, 1.3539582069953617, 1.0556953020332662,
+        0.889986852684063, 0.8254942997815451, 0.8398327319036847, 0.9330692820476477,
+        1.1098606760056078, 1.2848443222187325, 1.2139383087371574, 0.9763217804712756,
+        0.7954107468917664, 0.7044117062572836, 0.5257096085812741, 0.45049174587457963,
+        0.4149010825504915, 0.3885865243002343, 0.35602060826269605, 0.3129737516675373,
+        0.2666786844220206, 0.22585318201863372, 0.194089732371335, 0.17110528200338365,
+        0.15533104582599216, 0.14513583391215867, 0.1390730095758196, 0.13572272782070113,
+        0.13343455911601104, 0.13028017862127633, 0.12460284309885439, 0.11599626873491073,
+        0.10556243676274117, 0.09495591728567516, 0.08536988322152625, 0.07729765935703524,
+        0.0707676147982843, 0.06560724672988831, 0.06159816084486689, 0.058542982566228995,
+        0.05628617531033701, 0.05471533736984248, 0.05375580173672149, 0.05336395387857723,
+        0.053521265661793466, 0.054229514929995476, 0.055506906807488224,
+        0.05738431308207587, 0.05990033750849637, 0.06309325626924144, 0.06698709432939569,
+        0.07156862334195241, 0.07675331885234189, 0.082344189270765, 0.08800092787387025,
+        0.09325430512512659, 0.09760068451793284, 0.10066447774469459, 0.10234051147516388,
+        0.10281529672749917, 0.10245933688023784, 0.10167815291162044, 0.10080673301508937,
+        0.10006915546520193, 0.09958203717008432, 0.09937531466086504, 0.09941520405337449,
+        0.09962478264212384, 0.09990289742901737, 0.10014301342103385, 0.10025197921125224,
+        0.10016627057548225, 0.09986189257206227, 0.09935505401815621, 0.09869369511962969,
+        0.09794310674736555, 0.09717031242860465, 0.0964311318447118, 0.09576192565565667,
+        0.09517626005979235, 0.094665787635435, 0.09420441733227647, 0.09375489182923745,
+        0.09327682182227455, 0.09273494083654009, 0.09210603929247546, 0.09138306317403402,
+        0.09057544947004241, 0.0897057960638887, 0.08880398614843735, 0.08790044664590757,
+        0.08702015196426266, 0.08617847293066713, 0.08537934561048785, 0.08461573430060708,
+        0.08387204296354746, 0.08312792245028913, 0.08236275184128215, 0.08155994007481844,
+        0.08071017776922708, 0.07981296051451457, 0.07887611428689632, 0.07791356555552136,
+        0.07694202340638805, 0.07597742853231086, 0.07503194733290042, 0.07411203670180849,
+        0.07321780267185185, 0.07234361362649075, 0.07147973474707306, 0.07061461465736758,
+        0.06973736735194168, 0.06883996374050101, 0.0679187042511058, 0.06697470095348451,
+        0.06601332939426598, 0.06504285111603879, 0.06407258098416886, 0.06311103094708612,
+        0.062164405284116764, 0.06123569280167018, 0.06032445046941161,
+        0.05942723828435298, 0.0585385626918849, 0.05765211759974334, 0.05676207760471471,
+        0.0558642011413787, 0.05495654664147234, 0.05403968997287195, 0.0531164403571933,
+        0.05219115715322823, 0.05126884302203328, 0.05035421327348537, 0.04945091760932715,
+        0.04856103438976653, 0.047684889532804905, 0.04682118916291646,
+        0.0459674066105124, 0.045120333159924815, 0.04427668769988146, 0.043433682037426674,
+        0.04258945508876084, 0.04174331819423423, 0.04089579077923707, 0.040048443358940915,
+        0.039203595515606815, 0.03836393396762369, 0.037532118132301784,
+        0.03671043003532313, 0.035900507276440737, 0.03510317801424507,
+        0.03431840018813599, 0.03354529578026752, 0.03278226492929623, 0.03202716267036699,
+        0.031277520982957725, 0.030530798821002854, 0.029784641802577918,
+        0.029037131196544736, 0.02828699973936103, 0.027533791248277564,
+        0.026777943710238877, 0.02602078243353553, 0.02526442064329606,
+        0.024511577690956743, 0.023765337014066037, 0.023028874209691103,
+        0.02230518824903562, 0.021596865700402756, 0.020905900202815728,
+        0.020233579583925913, 0.019580443246982004, 0.018946304440453015,
+        0.01833032655356229, 0.017731139628373745, 0.017146982360969783,
+        0.01657585536129158, 0.016015672844215272, 0.015464401923574182,
+        0.014920181102263898, 0.014381412299953596, 0.013846823636827259,
+        0.013315502954198984, 0.012786904369578897, 0.01226083177828824,
+        0.01173740399920731, 0.011217006339944904, 0.01070023297078197,
+        0.010187824011330891, 0.00968060090837666, 0.009179403642767134,
+        0.008685033448318738, 0.008198204846136039, 0.0077195106417965505,
+        0.007249402910244726, 0.006788191890130496, 0.006336063236861347,
+        0.00589311251503525, 0.005459394468509546, 0.005034983893153066,
+        0.004620045262778811, 0.004214910133631307, 0.003820165389229055,
+        0.003436762555112583, 0.003066170239108208, 0.0027106108440361847,
+        0.0023734524075375053, 0.0020598659559433754, 0.0017778765047241443,
+        0.0015397685767875738, 0.0013629393881898144, 0.0012671889747198101,
+        0.0012651529725602822, 0.0013519936588118392, 0.001507930264683938,
+        0.001710327629416419, 0.001941403995108344, 0.002189216683563157,
+        0.002446146143528105, 0.0027073445966763025, 0.002969680984930304,
+        0.0032310988887073546, 0.003490233537051907, 0.0037461777857680668,
+        0.003998331555761964, 0.004246298645903427, 0.0044898122548870335,
+        0.00472868033979676, 0.004962747031903871, 0.005191868495760961,
+        0.005415901985217179, 0.005634706208398191, 0.005848150090458456,
+        0.006056126112144976, 0.006258563982701229, 0.0064554406907912166,
+        0.00664678398555477, 0.006832667902458896, 0.007013200747105008,
+        0.00718850760815369, 0.007358710649412663, 0.007523910908480969,
+        0.007684175040008322, 0.007839529470512968, 0.00798996298591189,
+        0.008135437136643005, 0.008275902331018697, 0.008411316385509232,
+        0.008541661832313337, 0.008666958553636452, 0.008787269266943929,
+        0.00890269683555828, 0.00901337401613658, 0.00911944773805, 0.009221061040448966,
+        0.009318336178939825, 0.009411362107042721, 0.009500188625435873,
+        0.009584828170508986, 0.009665264740459298, 0.009741468109730186,
+        0.00981341050729086, 0.00988108251360996, 0.00994450514125539, 0.010003735861782857,
+        0.010058867561940283, 0.010110020805335424, 0.010157331056809231,
+        0.010200933445137377, 0.01024094802736232, 0.010277468324348716,
+        0.010310555186364494, 0.010340236976278176, 0.01036651584003011,
+        0.010389378697944242, 0.010408810742590292, 0.01042480881966114,
+        0.010437392165521787, 0.010446608551521729, 0.010452534819595205,
+        0.010455271895445211, 0.010454935413754217, 0.010451643881077171,
+        0.010445506693387074, 0.010436614260400535, 0.010425032002834251,
+        0.01041079919404836, 0.010393932675678256, 0.01037443456748265,
+        0.010352302379462249, 0.010327539543834858, 0.01030016437789437,
+        0.01027021585663091, 0.010237755235721862, 0.010202863385463194,
+        0.010165634510567192, 0.010126167583253028, 0.010084557188887804,
+        0.010040885517960488, 0.00999521694597598, 0.009947596096158437,
+        0.009898049593119372, 0.00984659102165664, 0.009793228030911273,
+        0.009737970170548428, 0.009680835968234715, 0.009621857961423456,
+        0.009561084832938683, 0.009498580377853184, 0.009434419633931466,
+        0.009368683022724852, 0.009301449679766118, 0.009232791247181623,
+        0.009162767254441201, 0.009091422865031125, 0.009018789292383741,
+        0.008944886682666593, 0.008869728817729588, 0.008793328687095531,
+        0.008715703862471204, 0.008636880694676155, 0.008556896616896209,
+        0.008475800222449129, 0.008393649213229631, 0.00831050670403294,
+        0.008226436646235917, 0.00814149925681268, 0.008055747290057057,
+        0.007969223789521607, 0.007881961651969544, 0.007793984985632042,
+        0.007705311918029099, 0.007615958262230797, 0.007525941324858833,
+        0.007435283151456312, 0.0073440126457249314, 0.007252166236137423,
+        0.007159787048259842, 0.007066922817979711, 0.006973622998639856,
+        0.006879935637022717, 0.0067859046018698636, 0.006691567649757736,
+        0.006596955631825227, 0.00650209291870035, 0.00640699889481607,
+        0.006311690187529474, 0.006216183182517594, 0.00612049635140261,
+        0.006024651979418384, 0.005928677015591495, 0.005832602943795798,
+        0.005736464758842139, 0.005640299289192227, 0.005544143212292984,
+        0.005448031142422768, 0.00535199413314583, 0.0052560588393207016,
+        0.0051602474477497945, 0.0050645783393563895, 0.004969067315853253,
+        0.0048737291322692175, 0.004778579039233065, 0.004683634055449411,
+        0.004588913759505077, 0.0044944404902821904, 0.004400238960837017,
+        0.004306335396123787, 0.004212756383970466, 0.004119527667144108,
+        0.004026673098900057, 0.003934213938925603, 0.0038421685921788355,
+        0.0037505528058195845, 0.0036593802557601577, 0.0035686633892453344,
+        0.0034784143537093144, 0.0033886458392572002, 0.003299371690479746,
+        0.003210607196385528, 0.0031223690317471985, 0.003034674888512628,
+        0.0029475428889916854, 0.0028609909044585544, 0.0027750359101748334,
+        0.0026896934906078833, 0.0026049775721095235, 0.0025209004132995825,
+        0.0024374728342195537, 0.0023547046243247737, 0.002272605042602259,
+        0.0021911833138306973, 0.002110449034819441, 0.0020304124282526444,
+        0.001951084415696252, 0.001872476516687193, 0.0017946006129921938,
+        0.0017174686383814107, 0.0016410922636095476, 0.0015654826420158962,
+        0.0014906502657639487, 0.0014166049607428133, 0.0013433560234220436,
+        0.0012709124823556664, 0.0011992834526869615, 0.0011284785486859942,
+        0.0010585083270485544, 0.0009893847522934648, 0.000921121705658742,
+        0.0008537355988969927, 0.0007872462087514146, 0.0007216779257720739,
+        0.0006570617348139134, 0.0005934384642232198, 0.0005308642639733747,
+        0.00046942014502049, 0.0004092293196987788, 0.0003504905340311024,
+        0.00029354674081445606, 0.000239038622654129, 0.00018827870996971247,
+        0.0001442127704680826, 0.00011352435850588552, 0.00010689641789946926,
+        0.00012698364146781406, 0.00016338901303675554, 0.00020702277937636521,
+        0.00025364280924311636, 0.0003014159787826786, 0.00034948637798516675,
+        0.0003974147058939869, 0.00044495623807321624, 0.000491965279253236,
+        0.0005383503274759845, 0.0005840513649433603, 0.0006290275916899806,
+        0.0006732504403051693, 0.0007166994262118483, 0.0007593596006999508,
+        0.0008012199493122598, 0.0008422723664929743, 0.0008825109892866391,
+        0.0009219317570636883, 0.000960532113281841, 0.0009983107948828116,
+        0.0010352676740716057, 0.0010714036294862893, 0.0011067204320294405,
+        0.0011412206362174254, 0.001174907471640717, 0.0012077847318579934,
+        0.0012398566601569782, 0.001271127833260588, 0.00130160304564719,
+        0.0013312871984103307, 0.0013601851975827207, 0.0013883018673059128,
+        0.0014156418831058363, 0.0014422097297629613, 0.0014680096866261892,
+        0.001493045841296251, 0.0015173221301271978, 0.001540842401659421,
+        0.0015636104970202784, 0.0015856303397862488, 0.0016069060271474448,
+        0.0016274419143406768, 0.0016472426852622976, 0.0016663134038167647,
+        0.0016846595425902592, 0.0017022869876413597, 0.0017192020203009703,
+        0.001735411278673071, 0.001750921702867079, 0.0017657404689285386,
+        0.0017798749167815056, 0.0017933324775547016, 0.0018061206053416616,
+        0.0018182467178724905, 0.0018297181498666973, 0.0018405421218315985,
+        0.0018507257260584153, 0.0018602759302139386, 0.0018691995976286649,
+        0.0018775035218498266, 0.0018851944717111736, 0.0018922792419742683,
+        0.0018987647038739993, 0.0019046578496884246, 0.0019099658259749733,
+        0.0019146959512967498, 0.0019188557160676415, 0.001922452764399178,
+        0.001925494860172264, 0.0019279898417420233, 0.0019299455712920768,
+        0.0019313698856692583, 0.0019322705553672232, 0.0019326552571539291,
+        0.0019325315638551038, 0.0019319069522232444, 0.0019307888271100295,
+        0.0019291845576801096, 0.0019271015195919663, 0.00192454713621263,
+        0.0019215289121708222, 0.0019180544538442922, 0.0019141314735424124,
+        0.0019097677767907044, 0.0019049712348437474, 0.0018997497468916727,
+        0.0018941111979923163, 0.0018880634193294667, 0.0018816141568649802,
+        0.001874771052942026, 0.0018675416431629373, 0.0018599333683117815,
+        0.0018519535986389823, 0.0018436096658534433, 0.0018349088970786344,
+        0.0018258586448484735, 0.0018164663081127964, 0.0018067393408377653,
+        0.0017966852469958748, 0.0017863115630346138, 0.0017756258309484926,
+        0.0017646355665496927, 0.0017533482281446462, 0.0017417711905615355,
+        0.0017299117284054635, 0.0017177770107198681, 0.0017053741072504615,
+        0.0016927100045813317, 0.001679791628838643, 0.001666625870730513,
+        0.0016532196084839757, 0.0016395797247856154, 0.0016257131150567128,
+        0.001611626685885323, 0.0015973273442233872, 0.0015828219793757546,
+        0.00156811744096067, 0.001553220516489751, 0.0015381379121431227,
+        0.001522876239536223, 0.0015074420102068665, 0.0014918416381660285,
+        0.001476081449511918, 0.0014601676970406258, 0.001444106577091446,
+        0.0014279042456263394, 0.0014115668309434102, 0.001395100441026978,
+        0.0013785111646021407, 0.0013618050660141347, 0.0013449881750200836,
+        0.001328066473328553, 0.00131104588013031, 0.001293932238834678,
+        0.0012767313068963125, 0.0012594487500231972, 0.0012420901412428485,
+        0.0012246609645443296, 0.0012071666221726161, 0.0011896124441313034,
+        0.0011720036982852992, 0.0011543455995195798, 0.0011366433166320692,
+        0.0011189019761903563, 0.0011011266630057645, 0.001083322417411356,
+        0.0010654942299807499, 0.0010476470345535827, 0.00102978570058442,
+        0.0010119150257624182, 0.0009940397297413207, 0.000976164449535707,
+        0.0009582937369005839, 0.0009404320577395112, 0.0009225837933766297,
+        0.0009047532433981659, 0.0008869446296576673, 0.0008691621010233726,
+        0.0008514097384604202, 0.0008336915600851889, 0.000816011525840935,
+        0.0007983735415257488, 0.0007807814619191032, 0.0007632390928298453,
+        0.0007457501918732743, 0.0007283184679425868, 0.000710947579350004,
+        0.0006936411307323615, 0.0006764026689602087, 0.0006592356783304757,
+        0.0006421435754568671, 0.0006251297042993256, 0.0006081973317764407,
+        0.0005913496443710393, 0.0005745897460200568, 0.000557920657508488,
+        0.0005413453173629461, 0.0005248665841735999, 0.0005084872400946559,
+        0.0004922099952110648, 0.00047603749239546144, 0.0004599723123117696,
+        0.0004440169782170358, 0.0004281739603471014, 0.0004124456797141852,
+        0.00039683451128018436, 0.0003813427865394455, 0.00036597279563548013,
+        0.0003507267891786617, 0.00033560698000873243, 0.00032061554513952587,
+        0.0003057546282159622, 0.0002910263428338941, 0.0002764327771630188,
+        0.0002619760004735035, 0.0002476580723086678, 0.00023348105537162315,
+        0.00021944703360821487, 0.00020555813759912407, 0.00019181658046446838,
+        0.0001782247090978039, 0.00016478507847734482, 0.0001515005616519067,
+        0.00013837451689352237, 0.00012541104994446623, 0.00011261544130427701,
+        9.999487423120942e-05, 8.755974257814682e-05, 7.53261552203315e-05,
+        6.332112379895218e-05, 5.159442529678254e-05, 4.024940173959684e-05,
+        2.9537108052650193e-05, 2.0202037159386934e-05, 1.4696835429229488e-05,
+        1.688462426362078e-05, 2.4587079580830902e-05, 3.411046054236332e-05,
+        4.417491070068933e-05, 5.438450496914129e-05, 6.458989299983539e-05,
+        7.472394479397553e-05, 8.475232343572477e-05, 9.465570023778436e-05,
+        0.00010442237451655631, 0.00011404485407200621, 0.00012351812756165713,
+        0.00013283872883088795, 0.00014200420037175287, 0.00015101277052317723,
+        0.0001598631511157015, 0.00016855440602506073, 0.00017708586310408845,
+        0.00018545705361980373, 0.000193667669702684, 0.00020171753395224239,
+        0.00020960657746090883, 0.00021733482377742295, 0.00022490237707633828,
+        0.00023230941331657084, 0.0002395561734527793, 0.0002466429580276379,
+        0.0002535701226371948, 0.0002603380739283195, 0.0002669472659387006,
+        0.0002733981966768811, 0.00027969140496393515, 0.0002858274675872454,
+        0.0002918069968603909, 0.0002976306386551343, 0.00030329907095248064,
+        0.00030881300287973585, 0.000314173174169006, 0.0003193803548970512,
+        0.0003244353453479858, 0.0003293389758337941, 0.0003340921063212942,
+        0.0003386956257667894, 0.00034315045112380836, 0.0003474575260568353,
+        0.0003516178194403193, 0.0003556323237944331, 0.000359502053794333,
+        0.0003632280450003993, 0.00036681135291215743, 0.000370253052389578,
+        0.00037355423743057364, 0.00037671602122413506, 0.00037973953635107155,
+        0.0003826259349921867, 0.00038537638899311007, 0.00038799208967318596,
+        0.0003904742473073536, 0.0003928240902835683, 0.0003950428639821951,
+        0.00039713182948356837, 0.0003990922622456039, 0.00040092545087755594,
+        0.0004026326961449684, 0.00040421531027101925, 0.00040567461656783674,
+        0.000407011949360976, 0.00040822865412023433, 0.00040932608768195686,
+        0.00041030561843304357, 0.00041116862632641196, 0.000411916502655718,
+        0.00041255064953343244, 0.00041307247909942285, 0.0004134834125114308,
+        0.0004137848788234105, 0.0004139783138739179, 0.00041406515929094196,
+        0.0004140468617132573, 0.00041392487227742035, 0.000413700646373905,
+        0.00041337564363463957, 0.0004129513280590658, 0.00041242916819498064,
+        0.0004118106372421228, 0.0004110972130068138, 0.0004102903776352654,
+        0.00040939161711303396, 0.00040840242055004686, 0.0004073242793177853,
+        0.0004061586861216182, 0.0004049071341120669, 0.00040357111611786947,
+        0.00040215212406452923, 0.0004006516486178639, 0.00039907117902911713,
+        0.00039741220315416405, 0.00039567620755543424, 0.0003938646776239785,
+        0.0003919790976189398, 0.0003900209505731823, 0.0003879917180202175,
+        0.0003858928795398789, 0.0003837259121524141, 0.0003814922896210004,
+        0.0003791934817198103, 0.00037683095356463294, 0.0003744061650460124,
+        0.00037192057042606844, 0.0003693756180998413, 0.0003667727505128373,
+        0.00036411340418983633, 0.0003613990098189012, 0.00035863099232410453,
+        0.00035581077086657383, 0.0003529397587328592, 0.00035001936308794396,
+        0.00034705098459666083, 0.00034403601694685064, 0.00034097584631164065,
+        0.0003378718508120777, 0.0003347254000381892, 0.00033153785465349546,
+        0.00032831056613377225, 0.0003250448766193345, 0.00032174211887927304,
+        0.00031840361634863406, 0.0003150306831897098, 0.0003116246243382941,
+        0.00030818673548609673, 0.00030471830298131657, 0.00030122060362898777,
+        0.0002976949044048979, 0.0002941424621063797, 0.0002905645229745576,
+        0.0002869623223270508, 0.00028333708423962834, 0.0002796900213004284,
+        0.0002760223344513072, 0.0002723352129182948, 0.00026862983421093416,
+        0.00026490736416144594, 0.00026116895698187736, 0.00025741575529463195,
+        0.0002536488901218849, 0.00024986948081147793, 0.00024607863489962533,
+        0.00024227744791835995, 0.0002384670031659487, 0.00023464837146924914,
+        0.00023082261095746576, 0.00022699076687842626, 0.00022315387146512705,
+        0.00021931294386659278, 0.00021546899013237677, 0.000211623003239239,
+        0.00020777596314711157, 0.00020392883685373944, 0.0002000825784316391,
+        0.00019623812903788595, 0.00019239641688032925, 0.00018855835714557615,
+        0.00018472485189556723, 0.0001808967899468938, 0.00017707504674783939,
+        0.00017326048427071265, 0.0001694539509365469, 0.0001656562815712773,
+        0.00016186829740652455, 0.00015809080611231527, 0.00015432460185679878,
+        0.00015057046538031433, 0.00014682916406811997, 0.000143101452013936,
+        0.00013938807006380358, 0.0001356897458392213, 0.0001320071937397405,
+        0.00012834111493080687, 0.0001246921973325796, 0.00012106111560700555,
+        0.00011744853117085447, 0.00011385509222510326, 0.00011028143381975052,
+        0.00010672817794585831, 0.0001031959336564765, 9.968529721526467e-05,
+        9.619685226165339e-05, 9.273116999269106e-05, 8.928880935934829e-05,
+        8.587031727817836e-05, 8.247622886268775e-05, 7.910706768913124e-05,
+        7.576334610688354e-05, 7.244556561770467e-05, 6.91542173494051e-05,
+        6.588978265325001e-05, 6.265273386965956e-05, 5.944353531425965e-05,
+        5.626264455834227e-05, 5.3110514103319375e-05, 4.998759360533561e-05,
+        4.6894332867380986e-05, 4.3831185940405415e-05, 4.079861685981928e-05,
+        3.779710785331137e-05, 3.482717138485236e-05, 3.188936833335006e-05,
+        2.898433631268958e-05, 2.6112835432167856e-05, 2.3275825456360376e-05,
+        2.0474602673595234e-05, 1.771105809934922e-05, 1.4988203256531128e-05,
+        1.2311350467482747e-05, 9.69112614540596e-06, 7.152651025575855e-06,
+        4.771495603167542e-06], [2.3604627120241137e-15, 7.0956675355536e-15,
+        1.1873860791694601e-14, 1.6724201464974138e-14, 2.1676606088557072e-14,
+        2.676206912295567e-14, 3.201299758921665e-14, 3.7463569559879544e-14,
+        4.3150118987323815e-14, 4.911155478989606e-14, 5.5389820781143566e-14,
+        6.203040459467409e-14, 6.908290381988281e-14, 7.660166067582715e-14,
+        8.464647575084581e-14, 9.328341524927293e-14, 1.0258572673819287e-13,
+        1.1263488174114362e-13, 1.2352176652456406e-13, 1.353480450897917e-13,
+        1.4822772444372012e-13, 1.6228895472766204e-13, 1.7767610526829656e-13,
+        1.9455216317948202e-13, 2.1310151023230284e-13, 2.335331437300831e-13,
+        2.560844202016326e-13, 2.8102541380100586e-13, 3.086640010916282e-13,
+        3.393518028403077e-13, 3.7349114240626217e-13, 4.1154320727619915e-13,
+        4.5403764252797343e-13, 5.015838470141248e-13, 5.548843020049294e-13,
+        6.147503271881643e-13, 6.82120745147301e-13, 7.580840338915366e-13,
+        8.43904676123186e-13, 9.410545628159912e-13, 1.0512505040732703e-12,
+        1.1764991283388432e-12, 1.3191507483444153e-12, 1.4819641258071867e-12,
+        1.668184524508337e-12, 1.8816379893591095e-12, 2.126845512194313e-12,
+        2.409161593994993e-12, 2.734942861495845e-12, 3.111753752831199e-12,
+        3.5486180900804893e-12, 4.056327585654278e-12, 4.647821184053498e-12,
+        5.3386528065501214e-12, 6.147569724201026e-12, 7.097229785703607e-12,
+        8.215093494443797e-12, 9.534536883073316e-12, 1.1096244180525592e-11,
+        1.294995612510612e-11, 1.515667189386744e-11, 1.779143160942366e-11,
+        2.0946844527817063e-11, 2.4737578445522878e-11, 2.930609278821053e-11,
+        3.4829987038196586e-11, 4.153145541329714e-11, 4.9689499076255693e-11,
+        5.965576362767691e-11, 7.187516301174945e-11, 8.691285089000579e-11,
+        1.0548964800307447e-10, 1.285287875416324e-10, 1.572178822874599e-10,
+        1.9309146705528834e-10, 2.38141496150582e-10, 2.9496602729129747e-10,
+        3.6697035627337363e-10, 4.5864061057985507e-10, 5.759180414265923e-10,
+        7.267141246500448e-10, 9.216238299931588e-10, 1.174919655155389e-09,
+        1.5059462262666823e-09, 1.941090557580508e-09, 2.516585898259056e-09,
+        3.282532287158811e-09, 4.308707845354858e-09, 5.693038745501491e-09,
+        7.574052852601819e-09, 1.0149360188059123e-08, 1.37033446125088e-08,
+        1.8649085888358538e-08, 2.5592518203373175e-08, 3.5431758465782695e-08,
+        4.9512781517998804e-08, 6.987662099025053e-08, 9.965744480289222e-08,
+        1.4373330734846073e-07, 2.098073630302302e-07, 3.1023611488059556e-07,
+        4.6518047406652635e-07, 7.081513954367566e-07, 1.0959967118942404e-06,
+        1.7273495858964818e-06, 2.777690291825928e-06, 4.5681500116196975e-06,
+        7.7055421358975e-06, 1.3379600006362918e-05, 2.4025784778214914e-05,
+        4.4892933790283104e-05, 8.802841290747501e-05, 0.00018337800554163192,
+        0.00041368274567928906, 0.0010447577414995249, 0.0031644804093431673,
+        0.014105135964659494, 0.381058353085119, 0.0929984134536913, 0.25093564634050236,
+        0.35582048471182687, 0.22763941333166532, 0.3052303151987785, 0.7047756540407525,
+        1.2445183445637835, 0.8703188357508196, 1.0409048879038163, 2.258796733866531,
+        5.644588871056084, 4.917127956107993, 3.1082663012014504, 1.7948533785655705,
+        1.3478528813652457, 1.2492357300658417, 1.386363904285158, 1.7967193521557017,
+        2.1915468592811687, 1.7323421120336575, 1.2545621081726568, 1.0320182133175249,
+        0.9686007088157045, 1.025051174560949, 1.2120136466773628, 1.5277918419112781,
+        1.680195626738042, 1.3982999594694665, 1.1026740630216718, 0.9420507181294637,
+        0.8871681499958766, 0.9180529282826418, 1.0392731490670641, 1.2617555530822964,
+        1.4935335087285062, 1.4455954416426526, 1.193759877155633, 1.0019018125155945,
+        0.9211985429093559, 0.7493083637963425, 0.6706632692235069, 0.6409799214180811,
+        0.621560532268594, 0.588907341220294, 0.5349011539712474, 0.47050898413694964,
+        0.41093059279091826, 0.36369305682211056, 0.32965194282159777, 0.30703937801729786,
+        0.2935845319086605, 0.2870053350292447, 0.28473765467565276, 0.28344666344794617,
+        0.27899695398396024, 0.2677707384523695, 0.24896299450387638, 0.22521916615118143,
+        0.20046673044119606, 0.17757964638179324, 0.15781040395128665, 0.14131755219632725,
+        0.12777093194809938, 0.11671087216752253, 0.10770536309268663, 0.10040030592822932,
+        0.09452399408579581, 0.08987570524467829, 0.0863111196996326, 0.08372924667785264,
+        0.08206198377652461, 0.08126586126189138, 0.08131475924109198, 0.08219187255006265,
+        0.08387867653786113, 0.08633813754691443, 0.0894894540222667, 0.09317375009080232,
+        0.09711717575141382, 0.1009119092453534, 0.10405054582194716, 0.10604181778091118,
+        0.10658013308757897, 0.10566886407270547, 0.10360388614373356, 0.10083305887693132,
+        0.09779587815577388, 0.09482570678184712, 0.09212468285845428, 0.08978108125466844,
+        0.08779957110559987, 0.08612949392916007, 0.08468764309786335, 0.08337694486872695,
+        0.08210297068394884, 0.08078861465675223, 0.07938530552464712, 0.07787824902239435,
+        0.07628420282810343, 0.07464266678693222, 0.07300356485578138, 0.07141514989731336,
+        0.06991488207757185, 0.06852436892267744, 0.06724812138146406, 0.06607527735671936,
+        0.06498339951440509, 0.06394359006808298, 0.06292620249971122, 0.06190631137840043,
+        0.06086797354931133, 0.059806405236770124, 0.058727636014398205,
+        0.0576458742109355, 0.05657943303814493, 0.055546345621903054, 0.05456067156928013,
+        0.05363011647922852, 0.05275516941804903, 0.05192965565181823, 0.051142424406822845,
+        0.050379791328205574, 0.049628280433091636, 0.04887715733327429,
+        0.048120259258623864, 0.0473567584191285, 0.04659074447745379, 0.04582980819498229,
+        0.04508304193031135, 0.04435896211683508, 0.04366379626773817, 0.04300041925483401,
+        0.04236804544137753, 0.041762634933984556, 0.041177867231500506,
+        0.040606465373691614, 0.040041610419278686, 0.03947817493936552,
+        0.03891353966865022, 0.03834784711417249, 0.037783675629949345,
+        0.03722525077587213, 0.03667740547485471, 0.036144530576520145,
+        0.035629724535671065, 0.035134278277670794, 0.03465754765435051,
+        0.034197191734863, 0.03374969884540757, 0.033311084326227605, 0.03287762398923506,
+        0.03244648736973246, 0.0320161582331079, 0.031586575761967293, 0.031158990125357798,
+        0.03073558568238071, 0.030318967882196648, 0.029911626013687794,
+        0.029515473154725236, 0.02913153500686687, 0.028759822010536288,
+        0.02839938368288363, 0.028048515902570428, 0.02770507264057507,
+        0.027366823423679545, 0.027031796336435928, 0.026698553494818908,
+        0.026366360890857695, 0.026035235078675143, 0.025705871423732346,
+        0.025379477836659378, 0.025057550141779888, 0.024741628719462005,
+        0.024433071679047017, 0.024132870341519, 0.023841521701191807, 0.02355896265909715,
+        0.02328456378541851, 0.023017176438335587, 0.022755225490661165,
+        0.022496839481869448, 0.022240009503151113, 0.021982766728839778,
+        0.02172336606740748, 0.02146046049495886, 0.021193248408828757,
+        0.02092157621280922, 0.020645981377487254, 0.02036766765330625,
+        0.020088413028872914, 0.019810420567706818, 0.0195361301869682,
+        0.019268013986650713, 0.01900837813106457, 0.018759190967758462,
+        0.01852195133999513, 0.018297604502057384, 0.018086507027016335,
+        0.017888437396009843, 0.017702645786236117, 0.01752793474288309,
+        0.017362761576990998, 0.017205353167123395, 0.01705382418993067,
+        0.016906290622911477, 0.016760971669609676, 0.016616275000921995,
+        0.016470862222747205, 0.016323693475120957, 0.01617405171382314,
+        0.01602154826987429, 0.01586611167118891, 0.01570796159666942, 0.015547569547010304,
+        0.015385607715242557, 0.015222887883889974, 0.015060293011661471,
+        0.014898705335950007, 0.014738935986500468, 0.014581661911457721,
+        0.014427376067405082, 0.014276356150443472, 0.014128655636583946,
+        0.013984118666352486, 0.013842417576048623, 0.013703108953704777,
+        0.013565701390034296, 0.01342972606814661, 0.01329480047567521,
+        0.013160676176129567, 0.01302726384310361, 0.012894632358500125,
+        0.012762983068875031, 0.012632604422038481, 0.01250381532780633,
+        0.012376907110766814, 0.01225209364515484, 0.01212947737415569,
+        0.012009035875369172, 0.011890630038062077, 0.011774031348995526,
+        0.011658962771276154, 0.011545145668480205, 0.011432344479198362,
+        0.011320401520215061, 0.011209256298250639, 0.01109894668695262,
+        0.01098959270903645, 0.010881366779184805, 0.010774456504415794,
+        0.010669027115423167, 0.010565190221041012, 0.010462984024754408,
+        0.010362367800654759, 0.010263230766017001, 0.010165412970360476,
+        0.01006873384663929, 0.009973022932155804, 0.009878147133268615,
+        0.009784029782771868, 0.009690658450001603, 0.009598080676246982,
+        0.009506389080639218, 0.009415699167520147, 0.009326124316402427,
+        0.009237752676264928, 0.009150630041692276, 0.009064751450777167,
+        0.008980062510749736, 0.008896469658773085, 0.008813857011872633,
+        0.008732106400295899, 0.008651116773098577, 0.008570819462518506,
+        0.00849118672085321, 0.0084122323133944, 0.00833400448628546, 0.008256573027982215,
+        0.00818001314174387, 0.008104389275602909, 0.008029741874092843,
+        0.007956079301896945, 0.007883376115082096, 0.0078115776382056586,
+        0.007740609668856816, 0.007670391265858017, 0.007600848122109757,
+        0.007531924039574013, 0.007463588494067459, 0.007395839098329579,
+        0.007328698777999213, 0.007262208466238586, 0.007196416910855631,
+        0.007131369631782913, 0.007067099105555332, 0.007003617906831602,
+        0.006940915896045072, 0.006878961744036248, 0.006817708280680554,
+        0.006757100487496227, 0.006697084533980688, 0.006637616146650901,
+        0.0065786668069884625, 0.006520226748246806, 0.006462304364516466,
+        0.006404922329472015, 0.006348111315887291, 0.006291902601882159,
+        0.006236320983348845, 0.006181379275768631, 0.006127075324899656,
+        0.006073391937384318, 0.006020299587779427, 0.005967761261640323,
+        0.005915738437853981, 0.005864197056004896, 0.005813112374259808,
+        0.005762471881012927, 0.0057122758235780315, 0.005662535379266556,
+        0.0056132689280727985, 0.005564497212635223, 0.00551623833372067,
+        0.005468503508330036, 0.005421294327254314, 0.005374601935209296,
+        0.00532840818381944, 0.005282688445776943, 0.005237415491623704,
+        0.005192563666563576, 0.005148112586689511, 0.005104049699620989,
+        0.005060371294547389, 0.005017081851749437, 0.004974191932614468,
+        0.004931715069333797, 0.004889664273605114, 0.004848048821633662,
+        0.004806871888027251, 0.00476612941730566, 0.004725810376847416,
+        0.004685898277548983, 0.0046463736242970295, 0.004607216806199191,
+        0.004568410880195838, 0.004529943746955102, 0.004491809352454319,
+        0.004454007743661513, 0.004416544024083636, 0.004379426453391746,
+        0.004342664078832169, 0.004306264351718965, 0.004270231161630272,
+        0.0042345636230485244, 0.004199255796036368, 0.004164297344689548,
+        0.0041296749677589475, 0.004095374304742091, 0.004061381949289877,
+        0.004027687200145043, 0.003994283245108474, 0.0039611675908568,
+        0.003928341697367309, 0.003895809922000816, 0.0038635779982559427,
+        0.003831651347264228, 0.0038000335352928565, 0.0037687251483014385,
+        0.003737723265846224, 0.0037070215995738086, 0.0036766112389261816,
+        0.0036464818404032305, 0.003616623024964538, 0.0035870257220422764,
+        0.003557683220575892, 0.0035285917518480454, 0.0034997505213297847,
+        0.003471161210289859, 0.0034428270622150294, 0.0034147517383025443,
+        0.0033869381586530793, 0.0033593875375644952, 0.003332098776302548,
+        0.00330506830462276, 0.003278290377729604, 0.0032517577537725926,
+        0.0032254626125759016, 0.00319939754017449, 0.0031735563999539455,
+        0.0031479349402652396, 0.003122531042248415, 0.0030973445806588306,
+        0.0030723769407508244, 0.0030476302936493353, 0.003023106770643215,
+        0.002998807687987108, 0.0029747329574178107, 0.0029508807780016908,
+        0.002927247650478878, 0.002903828696245956, 0.002880618210155674,
+        0.002857610338418839, 0.002834799755953791, 0.0028121822235046712,
+        0.0027897549318467115, 0.002767516582180298, 0.002745467200849353,
+        0.0027236077334131985, 0.002701939499735814, 0.002680463612236398,
+        0.0026591804609561163, 0.0026380893523028715, 0.0026171883573463217,
+        0.002596474386201071, 0.0025759434649376416, 0.0025555911574122367,
+        0.002535413051907437, 0.002515405225143463, 0.002495564604220309,
+        0.002475889168575132, 0.002456377964366861, 0.0024370309375549458,
+        0.0024178486227677794, 0.0023988317481362727, 0.0023799808277138183,
+        0.0023612958116817164, 0.002342775851265076, 0.0023244192128558097,
+        0.002306223348939306, 0.0022881851064097125, 0.0022703010307102314,
+        0.002252567710168047, 0.0022349821008209258, 0.002217541778352825,
+        0.0022002450785164208, 0.002183091107915227, 0.002166079629483786,
+        0.0021492108474114226, 0.0021324851315465752, 0.002115902729082359,
+        0.0020994635108733967, 0.002083166791550468, 0.0020670112486404863,
+        0.0020509949486678773, 0.002035115470803967, 0.0020193701038262947,
+        0.0020037560820563654, 0.001988270821863818, 0.0019729121225939192,
+        0.0019576783032784714, 0.0019425682580954515, 0.0019275814266338715,
+        0.0019127176879664477, 0.0018979771978796078, 0.0018833601954235148,
+        0.0018688668072341554, 0.0018544968760835453, 0.0018402498346275255,
+        0.0018261246373435039, 0.0018121197548735856, 0.0017982332266095673,
+        0.0017844627605290001, 0.001770805864884542, 0.0017572599944958465,
+        0.0017438226949909503, 0.00173049173092103, 0.0017172651875256805,
+        0.0017041415402112047, 0.001691119689857981, 0.0016781989655059342,
+        0.0016653790982548344, 0.0016526601715603957, 0.0016400425535265722,
+        0.0016275268165994404, 0.0016151136496151456, 0.0016028037666431416,
+        0.001590597816741143, 0.0015784962986096624, 0.0015664994841408854,
+        0.0015546073548684705, 0.0015428195551216934, 0.0015311353651706898,
+        0.0015195536966899187, 0.0015080731114335065, 0.0014966918623581249,
+        0.0014854079545348336, 0.001474219221481434, 0.0014631234111568447,
+        0.0014521182749830286, 0.0014412016531334683, 0.001430371549779061,
+        0.0014196261931376359, 0.0014089640767416193, 0.0013983839801567756,
+        0.001387884969227563, 0.0013774663775774692, 0.0013671277723981226,
+        0.0013568689084533922, 0.0013466896746654653, 0.0013365900376684293,
+        0.0013265699864449937, 0.0013166294816456784, 0.0013067684125333942,
+        0.0012969865638143754, 0.0012872835938145682, 0.0012776590247822674,
+        0.0012681122452555993, 0.001258642523708036, 0.0012492490318510927,
+        0.0012399308752885777, 0.0012306871285375802, 0.0012215168710372158,
+        0.0012124192205810475, 0.001203393360823855, 0.0011944385600670174,
+        0.0011855541794687106, 0.0011767396700359486, 0.0011679945590775146,
+        0.0011593184281375101, 0.0011507108854849693, 0.001142171536965984,
+        0.0011336999591976607, 0.0011252956787284325, 0.0011169581599179965,
+        0.001108686802992048, 0.001100480952253458, 0.0010923399129489579,
+        0.0010842629740145187, 0.00107624943313691, 0.0010682986202651312,
+        0.001060409916072321, 0.0010525827626792703, 0.0010448166652636457,
+        0.001037111184596575, 0.0010294659219824947, 0.0010218804992119127,
+        0.0010143545368580887, 0.001006887634387237, 0.0009994793551685978,
+        0.0009921292185791533, 0.0009848367001824934, 0.000977601239646104,
+        0.000970422254820789, 0.0009632991594629224, 0.000956231381600731,
+        0.0009492183795320201, 0.0009422596529617019, 0.0009353547476521992,
+        0.0009285032530875404, 0.0009217047938204172, 0.0009149590161526308,
+        0.0009082655725221474, 0.0009016241062227182, 0.0008950342389344789,
+        0.000888495562972744, 0.0008820076393139365, 0.0008755700014605271,
+        0.0008691821642512157, 0.0008628436359515834, 0.0008565539314998199,
+        0.0008503125846858432, 0.000844119157310532, 0.0008379732439780952,
+        0.0008318744719122223, 0.0008258224960751774, 0.0008198169905806607,
+        0.0008138576379703883, 0.000807944118188307, 0.0008020760990569552,
+        0.0007962532297012219, 0.0007904751378451315, 0.0007847414312134437,
+        0.0007790517026005755, 0.0007734055376105428, 0.0007678025236840675,
+        0.0007622422589017862, 0.0007567243591819635, 0.0007512484628009056,
+        0.0007458142316705869, 0.0007404213493465307, 0.0007350695162451768,
+        0.0007297584429689391, 0.0007244878428749277, 0.0007192574250627734,
+        0.0007140668888205044, 0.0007089159202831994, 0.0007038041916591991,
+        0.0006987313629761962, 0.0006936970859305277, 0.0006887010091316666,
+        0.0006837427838955537, 0.0006788220697238197, 0.0006739385387136883,
+        0.000669091878376689, 0.0006642817925876597, 0.0006595080006794293,
+        0.000654770234936965, 0.0006500682369303879, 0.0006454017532196839,
+        0.0006407705309775854, 0.0006361743140359343, 0.0006316128397305138,
+        0.0006270858367971663, 0.0006225930244213695, 0.0006181341124243502,
+        0.000613708802472977, 0.0006093167901365739, 0.0006049577675756201,
+        0.0006006314266515666, 0.0005963374622429926, 0.0005920755755605151,
+        0.0005878454772679385, 0.0005836468902201228, 0.0005794795516460832,
+        0.0005753432145912397, 0.0005712376485004036, 0.000567162638825417,
+        0.0005631179856267937, 0.0005591035012135014, 0.0005551190069423731,
+        0.0005511643293900046, 0.0005472392961863104, 0.0005433437318375651,
+        0.0005394774538816892, 0.0005356402696951532, 0.0005318319742148636,
+        0.0005280523487334153, 0.0005243011608384852, 0.0005205781654461679,
+        0.000516883106777619, 0.0005132157210612566, 0.000509575739694329,
+        0.0005059628925813984, 0.0005023769113986126, 0.0004988175325645182,
+        0.0004952844997644033, 0.0004917775659301991, 0.0004882964946372034,
+        0.0004848410609170965, 0.00048141105151319443, 0.00047800626462372425,
+        0.0004746265091713488, 0.0004712716036552349, 0.00046794137461822016,
+        0.0004646356548106408, 0.0004613542811148103, 0.0004580970923495317,
+        0.00045486392708979703, 0.0004516546216615455, 0.0004484690084852357,
+        0.0004453069149251133, 0.0004421681627740842, 0.0004390525684415859,
+        0.0004359599438325827, 0.0004328900978426527, 0.0004298428382853711,
+        0.00042681797403392536, 0.00042381531710429656, 0.00042083468442594726,
+        0.00041787589907014603, 0.00041493879077856167, 0.0004120231957512715,
+        0.00040912895572453774, 0.00040625591650019584, 0.00040340392614649775,
+        0.0004005728331425308, 0.00039776248474312435, 0.0003949727257951734,
+        0.00039220339816899456, 0.0003894543408724351, 0.000386725390796102,
+        0.00038401638395920286, 0.00038132715703822193, 0.00037865754892498117,
+        0.0003760074020703857, 0.00037337656340101185, 0.000370764884683176,
+        0.0003681722222893265, 0.0003655984364295816, 0.0003630433899889805,
+        0.00036050694717460765, 0.00035798897219739805, 0.00035548932819980345,
+        0.0003530078765962171, 0.0003505444769162067, 0.00034809898715164734,
+        0.00034567126453414213, 0.00034326116658844663, 0.0003408685522828185,
+        0.0003384932830696893, 0.00033613522365505595, 0.0003337942423673481,
+        0.00033147021108893983, 0.0003291630047707941, 0.00032687250062922376,
+        0.00032459857716974006, 0.0003223411132120052, 0.0003200999870753752,
+        0.00031787507605444845, 0.00031566625626266103, 0.0003134734028528073,
+        0.00031129639056010706, 0.0003091350944605162, 0.00030698939080603643,
+        0.00030485915778862477, 0.00030274427610798936, 0.0003006446292464691,
+        0.00029856010341957294, 0.0002964905872221995, 0.00029443597103878737,
+        0.0002923961463308527, 0.0002903710049226473, 0.00028836043841352487,
+        0.00028636433780131703, 0.00028438259338239114, 0.0002824150949234256,
+        0.00028046173207106503, 0.0002785223949085778, 0.0002765969745685377,
+        0.0002746853637806707, 0.00027278745726739845, 0.0002709031519270272,
+        0.00026903234677220724, 0.000267174942651341, 0.00026533084180178836,
+        0.00026349994732235857, 0.00026168216265940993, 0.0002598773911837932,
+        0.0002580855359448483, 0.00025630649961410804, 0.0002545401846394366,
+        0.00025278649355825515, 0.0002510453294174471, 0.0002493165962158775,
+        0.0002476001992966673, 0.0002458960456125673, 0.0002442040438358157,
+        0.0002425241042855098, 0.0002408561387020056, 0.00023920005990415852,
+        0.00023755578139872228, 0.00023592321700904875, 0.00023430228058381934,
+        0.00023269288583259128, 0.0002310949463155658, 0.00022950837557178118,
+        0.00022793308737035042, 0.0002263689960188762, 0.00022481601669055825,
+        0.00022327406569375532, 0.00022174306064992843, 0.00022022292054883142,
+        0.00021871356567268924, 0.00021721491741158688, 0.00021572689800051755,
+        0.00021424943023168355, 0.00021278243718596742, 0.00021132584203679421,
+        0.00020987956794726097, 0.0002084435380812595, 0.00020701767571962144,
+        0.00020560190445187613, 0.00020419614841080884, 0.00020280033250577332,
+        0.00020141438261120587, 0.00020003822567884745, 0.0001986717897592745,
+        0.00019731500392639465, 0.00019596779812695818, 0.0001946301029796955,
+        0.00019330184956005268, 0.00019198296921180038, 0.00019067339340915932,
+        0.00018937305370160578, 0.00018808188173462316, 0.00018679980934817114,
+        0.000185526768728251, 0.00018426269258206774, 0.00018300751430718137,
+        0.00018176116812153938, 0.00018052358913260162, 0.00017929471334099652,
+        0.00017807447757135626, 0.00017686281935121436, 0.00017565967675727066,
+        0.00017446498825496434, 0.00017327869256594585, 0.00017210072857250081,
+        0.0001709310352875751, 0.00016976955187932512, 0.00016861621775086472,
+        0.00016747097265940443, 0.00016633375684312296, 0.00016520451114365828,
+        0.00016408317709537372, 0.00016296969696863675, 0.00016186401376069257,
+        0.00016076607113897618, 0.00015967581334345679, 0.0001585931850721952,
+        0.00015751813136350218, 0.00015645059750063085, 0.00015539052894887815,
+        0.00015433787133802503, 0.00015329257048931987, 0.00015225457247835245,
+        0.00015122382372352385, 0.00015020027108175025, 0.00014918386193583848,
+        0.00014817454425277498, 0.0001471722666111263, 0.00014617697818905824,
+        0.00014518862871424354, 0.000144207168390144, 0.00014323254780825525,
+        0.00014226471786420245, 0.00014130362968711602, 0.00014034923459793784,
+        0.00013940148410209661, 0.00013846032991047887, 0.00013752572399076653,
+        0.00013659761863303867, 0.00013567596652079138, 0.0001347607207908138,
+        0.00013385183507653474, 0.00013294926352240338, 0.00013205296077112966,
+        0.00013116288192412966, 0.00013027898248487446, 0.00012940121829368114,
+        0.00012852954546385958, 0.0001276639203330937, 0.00012680429943351292,
+        0.00012595063948704147, 0.00012510289742440628, 0.00012426103042324332,
+        0.0001234249959560323, 0.00012259475184343217, 0.00012177025629735669,
+        0.00012095146795087655, 0.00012013834586687405, 0.00011933084952881597,
+        0.00011852893880756313, 0.00011773257392222254, 0.00011694171538591552,
+        0.00011615632396465431, 0.00011537636063644215, 0.00011460178657145079,
+        0.00011383256312772944, 0.00011306865186504666, 0.0001123100145720285,
+        0.00011155661330413542, 0.00011080841041873048, 0.00011006536860977231,
+        0.00010932745092914944, 0.00010859462079336442, 0.00010786684197742535,
+        0.00010714407859082393, 0.00010642629504659976, 0.00010571345602593167,
+        0.0001050055264417717, 0.00010430247140912294, 0.00010360425622990286,
+        0.00010291084638608345, 0.00010222220754775353, 0.00010153830559245576,
+        0.00010085910663105874, 0.00010018457703471867, 9.951468346071814e-05,
+        9.8849392869687e-05, 9.818867253307092e-05, 9.753249003241536e-05,
+        9.688081324224775e-05, 9.623361031127504e-05, 9.559084963409192e-05,
+        9.495249982426385e-05, 9.431852969219226e-05, 9.368890822559167e-05,
+        9.306360458307702e-05, 9.244258809579855e-05, 9.182582827493399e-05,
+        9.121329482965357e-05], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+        0.0, 0.0, 0.0, 0.0]]
+coeff_T: [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
+        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [0.010405701588193256,
+        0.031217458622475387, 0.052030282300007044, 0.07284488729284219,
+        0.09366199165923768, 0.11448232348001261, 0.13530661795199833, 0.15613562312768578,
+        0.1769701006550951, 0.1978108282598657, 0.21865860215350527, 0.239514240229231,
+        0.2603785837064265, 0.2812525009254954, 0.3021368895909426, 0.3230326804028972,
+        0.3439408402623957, 0.364862375760732, 0.3857983373704186, 0.40674982298375406,
+        0.4277179831038003, 0.448704025069048, 0.4697092184557, 0.4907349007351052,
+        0.5117824833621327, 0.5328534582101059, 0.5539494051126325, 0.5750719994713749,
+        0.5962230211269365, 0.6174043634081521, 0.6386180439591509, 0.65986621569872,
+        0.6811511795892895, 0.7024753982332104, 0.7238415112733477, 0.7452523520473575,
+        0.766710966406405, 0.7882206332163809, 0.809784887584458, 0.8314075462770933,
+        0.8530927365312952, 0.8748449278390161, 0.8966689679635017, 0.9185701230181873,
+        0.9405541230165837, 0.9626272125465405, 0.9847962090756154, 1.0070685678374995,
+        1.0294524567351395, 1.051956840780757, 1.0745915790479181, 1.0973675357834407,
+        1.1202967078627388, 1.1433923720909103, 1.166669255603407, 1.1901437335798832,
+        1.2138340602285362, 1.2377606387244824, 1.2619463389893995, 1.286416872853609,
+        1.3112012392852694, 1.3363322556352497, 1.3618471948372457, 1.3877885541648267,
+        1.4142049885597927, 1.44115245152897, 1.4686955995943163, 1.496909534836941,
+        1.5258819853838104, 1.555716058594904, 1.5865337522778187, 1.6184804816041274,
+        1.6517309857684475, 1.6864971363579606, 1.723038411835424, 1.76167617772883,
+        1.8028135134538859, 1.846963310358761, 1.8947890333564306, 1.9471654623432884,
+        2.0052720688685612, 2.070741914624462, 2.1459096815630576, 2.2342473377862917,
+        2.341181530593291, 2.4757621593130326, 2.6544734090493263, 2.911431845669583,
+        3.3332427926214367, 4.246434535359267, 12.33198797799215, 3.7047290089680276,
+        2.5901924071674722, 2.1266741246516916, 1.8595787972031326, 1.6820749907293904,
+        1.5541602851522576, 1.4570458007770533, 1.380598193134844, 1.3188133999063683,
+        1.2678824545656882, 1.2252604232600388, 1.1891767324729121, 1.158359391011678,
+        1.1318710270747467, 1.1090071126269592, 1.0892306672661864, 1.0721294643725914,
+        1.0573879286165508, 1.0447694568824728, 1.034107317841022, 1.025304690532016,
+        1.018348491401052, 1.0133524985722124, 1.0106854574524518, 1.0114587163032653,
+        1.0210995218638894, 1.281752405784205, 1.029059914525033, 1.1693442562044634,
+        1.0628629347630054, 1.0157126713011764, 1.0650427506557762, 1.2486280348135295,
+        1.2606038958482955, 1.0182940176324384, 1.0188576975764108, 1.0657736590839586,
+        1.1803674513096176, 1.3816824464045172, 1.1476756178580496, 1.0198645258176506,
+        1.0145654072804962, 1.0480117242864615, 1.1174476114735161, 1.2430547067356879,
+        1.3155883793162282, 1.1291162682369988, 1.0253872483920965, 1.0111354499660097,
+        1.0327308633359344, 1.078847291773838, 1.1547109314923614, 1.2514462755715328,
+        1.2445925822993291, 1.1034596377432755, 1.0246691752455541, 1.010504151291013,
+        1.0270153029417168, 1.0629249852242015, 1.1183853552235548, 1.191006608100163,
+        1.230121953903494, 1.1469723103260148, 1.0466686661602602, 1.0113187536060058,
+        1.0185498395479007, 1.059006842492749, 1.0899613736063312, 1.117346351241253,
+        1.1334223623968573, 1.1288827522697948, 1.1055494026872759, 1.0782227451629802,
+        1.0592969855865202, 1.051539850959424, 1.0526667078703404, 1.0596402544584982,
+        1.0698948214444752, 1.0811285705425582, 1.090767216085298, 1.0956942085814387,
+        1.0930260228284718, 1.0823754465668394, 1.067569294527044, 1.0544971702555512,
+        1.0469618815746162, 1.0454178071096434, 1.0484853893817572, 1.0544986187644243,
+        1.0621375677517755, 1.0704961381196123, 1.078975476497045, 1.0871689544277774,
+        1.0947787721611761, 1.1015628916094793, 1.107303159391586, 1.1117869245622154,
+        1.1147974538690013, 1.1161112748895632, 1.11550325724361, 1.1127632190761765,
+        1.107731488233205, 1.10036470664352, 1.090844108377679, 1.0797270846995537,
+        1.068100791088984, 1.0576106421377411, 1.050157183893458, 1.047162022520985,
+        1.0487358740048018, 1.053453001514237, 1.059041613801824, 1.0634348119687,
+        1.0654310815888854, 1.0647724196293349, 1.0618980129874867, 1.0576431601746994,
+        1.0529928237887773, 1.0488908075517966, 1.0460802033245953, 1.0449704591320863,
+        1.0455557830797932, 1.0474228581483835, 1.0498674919026483, 1.052095320475364,
+        1.0534399818615563, 1.0535242603209813, 1.0523203689085976, 1.0501106800767313,
+        1.0473816072904314, 1.044690891740227, 1.0425402963033517, 1.0412743070249761,
+        1.0410177731273513, 1.0416609951179947, 1.0428954728662563, 1.044294284447198,
+        1.0454190170918856, 1.0459256657042948, 1.0456410169038655, 1.0445907102986085,
+        1.0429762184832572, 1.0411128728198937, 1.039349086491563, 1.0379872154187428,
+        1.0372219054469785, 1.0371057485960116, 1.03754643545231, 1.0383343928693123,
+        1.039194622753038, 1.039851345096965, 1.0400905350796983, 1.0398054365428926,
+        1.0390145497142762, 1.0378493034591483, 1.0365168007304022, 1.0352487301788948,
+        1.0342493124078929, 1.0336534346837394, 1.0335024355866766, 1.0337407768799747,
+        1.0342328591886303, 1.0347957253560638, 1.0352405049784545, 1.035413628237045,
+        1.0352287481228717, 1.0346824070258047, 1.0338504906983814, 1.0328673096136052,
+        1.0318932156198737, 1.0310788169941705, 1.0305337560206578, 1.0303061329155807,
+        1.0303758523350888, 1.0306622069758296, 1.0310433774744285, 1.0313834682247933,
+        1.0315614041540004, 1.0314957088850405, 1.0311600613630825, 1.0305865595419696,
+        1.0298564167402346, 1.0290806677055413, 1.0283755836611521, 1.0278383516492084,
+        1.0275280675734446, 1.0274555392595364, 1.0275833210554317, 1.0278353166565697,
+        1.028113557925156, 1.028318600813872, 1.028369475253657, 1.028219327037513,
+        1.0278637828584793, 1.0273405425345867, 1.0267205037525202, 1.0260924777975466,
+        1.025544846477137, 1.0251480247763716, 1.0249412260910433, 1.0249259194814684,
+        1.025066850029444, 1.02529995611181, 1.0255452901970294, 1.0257223210282607,
+        1.0257648029010262, 1.0256326726435252, 1.0253190599343214, 1.0248513529866337,
+        1.0242862431570319, 1.023699671537429, 1.023173487432206, 1.0227812423457414,
+        1.0225757227911578, 1.0225804729583896, 1.0227867079291795, 1.0231558625920434,
+        1.0236268660368188, 1.0241263838599448, 1.0245799238158844, 1.02492186791376,
+        1.0251030339440999, 1.025095064587609, 1.02489159294604, 1.0245066150620976,
+        1.0239707746709208, 1.023326358346689, 1.0226217644558833, 1.021906101285261,
+        1.0212244281588494, 1.0206140012575355, 1.0201017346645487, 1.01970294409935,
+        1.0194213136148502, 1.019249923346768, 1.0191731069429275, 1.0191688732852615,
+        1.0192116243150124, 1.019274919370764, 1.019334065137976, 1.0193683409956829,
+        1.0193627001526906, 1.0193088210229058, 1.0192054267310708, 1.0190578476296723,
+        1.0188768716183283, 1.0186770037802042, 1.0184743303128918, 1.0182842404063064,
+        1.0181192928879848, 1.0179875135743663, 1.0178913688768616, 1.0178275801104455,
+        1.0177878261768085, 1.01776024320873, 1.0177314906847554, 1.017689042931833,
+        1.0176233107476458, 1.017529218398587, 1.017406957562585, 1.0172617934412895,
+        1.0171029760102193, 1.0169419730549216, 1.0167903589175813, 1.0166577444354123,
+        1.01655011485032, 1.0164688612724377, 1.016410663622559, 1.0163682300463488,
+        1.0163317440769504, 1.0162907424106593, 1.0162360674601332, 1.0161615273233446,
+        1.0160649562456838, 1.0159484898525504, 1.0158180256603866, 1.0156819968739115,
+        1.0155497135962204, 1.0154295969155545, 1.015327638021018, 1.015246360032874,
+        1.0151844582925176, 1.0151371653441932, 1.0150972525599804, 1.0150564643951137,
+        1.0150071042609794, 1.0149434677375253, 1.0148628545201308, 1.0147659783139051,
+        1.014656715542796, 1.0145412634182047, 1.014426888745126, 1.014320519504479,
+        1.0142274503865967, 1.0141504008694917, 1.0140890894700092, 1.0140403862164862,
+        1.0139989961703382, 1.013958529318288, 1.0139127435508026, 1.0138567201346054,
+        1.0137877501630936, 1.013705772018573, 1.0136132911614988, 1.0135148155341038,
+        1.0134159316099207, 1.0133222097772312, 1.013238152350964, 1.0131663806748057,
+        1.013107205139215, 1.0130586450967491, 1.0130168795286392, 1.0129770295941685,
+        1.012934115015503, 1.012883998063757, 1.0128241366056252, 1.0127540093472274,
+        1.0126751434108507, 1.0125907528879876, 1.0125050710878407, 1.0124225143808807,
+        1.012346841951275, 1.0122804698812466, 1.0122240626895564, 1.0121764688278378,
+        1.0121350000291731, 1.0120959902327247, 1.0120555195973866, 1.0120101616894819,
+        1.0119576119279183, 1.0118970823064477, 1.011829395589384, 1.0117567717144933,
+        1.0116823580356233, 1.0116096017926428, 1.011541589244373, 1.0114804772355979,
+        1.011427120592204, 1.0113809580179527, 1.0113401684618293, 1.0113020589145187,
+        1.0112636025825794, 1.0112220208143148, 1.0111752973437766, 1.011122529824837,
+        1.0110640576541152, 1.0110013497456665, 1.010936682251987, 1.0108726751634736,
+        1.010811781001463, 1.0107558244061186, 1.010705678091151, 1.0106611317601257,
+        1.0106209722029562, 1.0105832523757623, 1.010545692317457, 1.0105061315501431,
+        1.0104629451548468, 1.0104153450546665, 1.0103635120489503, 1.0103085379125731,
+        1.0102521936713247, 1.0101965728120186, 1.0101436805395205, 1.0100950483463809,
+        1.0100514461083596, 1.0100127435757589, 1.0099779437760297, 1.0099453782018328,
+        1.0099130238107803, 1.0098788801888623, 1.0098413355041884, 1.009799453634957,
+        1.009753131119184, 1.0097030980338897, 1.0096507665618628, 1.009597959136256,
+        1.009546569402766, 1.0094982200198905, 1.0094539798998494, 1.0094141906055767,
+        1.0093784300724977, 1.0093456158707848, 1.009314224724616, 1.009282584554074,
+        1.0092491834503914, 1.0092129386498239, 1.0091733777014147, 1.0091307016712698,
+        1.0090857228877932, 1.0090396930447783, 1.0089940570768945, 1.0089501805876138,
+        1.008909101722467, 1.0088713520347024, 1.0088368766350904, 1.0088050646719322,
+        1.0087748806396108, 1.008745068930576, 1.0087143916122217, 1.0086818546968452,
+        1.008646881798769, 1.008609405122993, 1.0085698599445934, 1.0085290869590005,
+        1.0084881636653849, 1.0084481982281592, 1.0084101249387631, 1.0083745386823282,
+        1.0083415973140373, 1.0083110073937698, 1.0082820929587366, 1.0082539318779784,
+        1.0082255325447815, 1.008196017241137, 1.0081647784389702, 1.0081315803968898,
+        1.008096589358193, 1.0080603292927317, 1.0080235738524617, 1.007987196496741,
+        1.007952007599135, 1.007918608682187, 1.0078872897127427, 1.0078579866176038,
+        1.007830304621483, 1.0078036008653775, 1.0077771092459857, 1.0077500833614499,
+        1.0077219310058754, 1.0076923161091453, 1.0076612107616285, 1.0076288896263605,
+        1.00759586976518, 1.0075628086958366, 1.0075303806016007, 1.0074991538405131,
+        1.0074694918138651, 1.007441494223361, 1.0074149878421532, 1.0073895666840098,
+        1.0073646725873548, 1.0073397003077658, 1.0073141073965304, 1.007287509001263,
+        1.007259741148251, 1.0072308823128022, 1.0072012309277896, 1.0071712444518055,
+        1.0071414522763298, 1.0071123589508804, 1.007084355292379, 1.0070576528569253,
+        1.0070322524987743, 1.0070079512837438, 1.0069843850814366, 1.0069610979781083,
+        1.0069376252857096, 1.0069135750617237, 1.006888693919658, 1.0068629062349377,
+        1.0068363209464968, 1.0068092060490894, 1.0067819364935298, 1.0067549255861505,
+        1.0067285523965412, 1.0067030978164142, 1.0066786998545127, 1.0066553349736487,
+        1.0066328275205416, 1.0066108844363937, 1.0065891483027334, 1.006567259034751,
+        1.0065449135683335, 1.0065219137579575, 1.0064981951563647, 1.0064738328761433,
+        1.0064490246813667, 1.006424055138228, 1.0063992474746775, 1.0063749113548357,
+        1.0063512949048172, 1.0063285481242963, 1.006306702589928, 1.006285669551234,
+        1.0062652556355078, 1.0062451928754748, 1.0062251779975258, 1.006204915047432,
+        1.0061841555029067, 1.0061627308957186, 1.006140574400942, 1.0061177295573822,
+        1.0060943459782636, 1.0060706633668766, 1.006046986225324, 1.0060236522869384,
+        1.0060009979464701, 1.0059793238938222, 1.0059588638828372, 1.005939759179242,
+        1.0059220407880731, 1.005905621072898, 1.005890295822479, 1.005875757154413,
+        1.0058616168389123, 1.0058474386849332, 1.0058327776133245, 1.0058172220617463,
+        1.0058004355805388, 1.0057821930593824, 1.0057624071222526, 1.0057411409336925,
+        1.0057186049733524, 1.0056951371510272, 1.0056711677401593, 1.0056471727137106,
+        1.0056236208456135, 1.0056009210860495, 1.0055793769974526, 1.005559154342196,
+        1.0055402662873574, 1.0055225783377373, 1.0055058323576913, 1.0054896863085911,
+        1.0054737640396496, 1.0054577079953644, 1.005441227291396, 1.0054241343436368,
+        1.0054063650104594, 1.005387979753308, 1.0053691462363903, 1.005350106610578,
+        1.0053311350106238, 1.0053124921777015, 1.0052943843865167, 1.0052769329771671,
+        1.0052601589228032, 1.0052439843232612, 1.0052282499275507, 1.0052127452157678,
+        1.0051972456327642, 1.005181550568926, 1.0051655157721977, 1.0051490750096375,
+        1.0051322477614246, 1.0051151321745313, 1.0050978850040333, 1.0050806924040143,
+        1.0050637368467736, 1.00504716592876, 1.0050310683090782, 1.005015460637307,
+        1.0050002873232313, 1.0049854327421859, 1.0049707433500774, 1.0049560555613386,
+        1.0049412243854576, 1.0049261478487086, 1.0049107831162323, 1.0048951517967495,
+        1.004879333866887, 1.0048634516439823, 1.004847646918783, 1.0048320554497974,
+        1.0048167833475017, 1.0048018894053692, 1.0047873762716293, 1.0047731917239697,
+        1.004759239507216, 1.0047453975405134, 1.0047315400798442, 1.0047175598340647,
+        1.0047033861621957, 1.0046889962827001, 1.0046744177417375, 1.0046597219713995,
+        1.0046450103354831, 1.0046303953356026, 1.0046159804195656, 1.0046018419772276,
+        1.0045880166198005, 1.004574495821226, 1.0045612286483363, 1.004548131866739,
+        1.004535105436288, 1.0045220505218047, 1.004508886785804, 1.0044955659479673,
+        1.0044820793363338, 1.004468458272866, 1.004454767424789, 1.0044410924821465,
+        1.0044275244780707, 1.0044141435917402, 1.0044010052859171, 1.0043881311437604,
+        1.0043755058829849, 1.004363080905348, 1.0043507835881802, 1.0043385305437196,
+        1.0043262424274968, 1.004313857671509, 1.0043013427750629, 1.0042886974478022,
+        1.004275953839573, 1.0042631701391602, 1.0042504197938527, 1.00423777832851,
+        1.004225310107359, 1.004213057331462, 1.0042010331201765, 1.004189219773916,
+        1.0041775723960105, 1.0041660271262636, 1.0041545124667177, 1.0041429616887037,
+        1.0041313241754, 1.0041195737883857, 1.004107712899317, 1.004095771495971,
+        1.0040838016187599, 1.0040718681643934, 1.004060037678154, 1.0040483670531961,
+        1.0040368940238404, 1.0040256309957885, 1.004014563166944, 1.0040036511638006,
+        1.0039928376750156, 1.0039820569282016, 1.0039712454280074, 1.003960352214797,
+        1.0039493470288163, 1.0039382251428886, 1.003927008186194, 1.0039157409255786,
+        1.0039044845933, 1.0038933078543892, 1.0038822768199542, 1.0038714455964286,
+        1.0038608487149134, 1.0038504964455726, 1.0038403735333976, 1.0038304413733574,
+        1.0038206431567318, 1.003810911136624, 1.0038011749284255, 1.0037913697018082,
+        1.003781443227811, 1.0037713609862555, 1.0037611088661988, 1.0037506933488893,
+        1.003740139394034, 1.00372948651213, 1.003718783669916, 1.0037080837333645,
+        1.0036974381109263, 1.0036868921407482, 1.003676481599047, 1.0036662305244275,
+        1.0036561503825878, 1.0036462404577338, 1.0036364892615925, 1.0036268766990954,
+        1.003617376715109, 1.0036079601582646, 1.0035985976242945, 1.0035892620730702,
+        1.0035799310452282, 1.0035705883351977, 1.0035612250102968, 1.0035518397048562,
+        1.0035424381679208, 1.0035330321039582, 1.0035236374150702, 1.003514272023044,
+        1.0035049535092861, 1.003495696848536, 1.0034865125175654, 1.0034774052267623,
+        1.0034683734504337, 1.0034594098279324, 1.003450502385985, 1.0034416364111682,
+        1.0034327967002126, 1.0034239698527112, 1.003415146258213, 1.0034063214722522,
+        1.0033974967684425, 1.0033886787828847, 1.0033798783121073, 1.0033711084626418,
+        1.0033623824561555, 1.00335371145019, 1.0033451027312252, 1.003336558573717,
+        1.0033280759464218, 1.0033196471045605, 1.0033112609574546, 1.0033029049717288,
+        1.0032945672820623, 1.0032862386499586, 1.0032779139410684, 1.0032695928778625,
+        1.0032612799515102, 1.0032529835224548, 1.0032447142779257, 1.0032364833225722,
+        1.0032283002371645, 1.0032201714402154, 1.0032120991293048, 1.003204080973658,
+        1.0031961105962397, 1.0031881787458672, 1.0031802749418426, 1.0031723892955413,
+        1.0031645141883905, 1.0031566455170744, 1.0031487832982195, 1.0031409315409736,
+        1.003133097425817, 1.0031252899485843, 1.003117518278922, 1.003109790127089,
+        1.003102110405131, 1.0030944804104727, 1.0030868976631397, 1.0030793564100107,
+        1.0030718486918737, 1.0030643657724372, 1.0030568996693134, 1.0030494445150646,
+        1.003041997512676, 1.0030345593268735, 1.0030271338559258, 1.0030197274392603,
+        1.0030123476544541, 1.0030050019260108, 1.002997696196226, 1.00299043389136,
+        1.0029832153584788, 1.0029760378607668, 1.002968896118175, 1.0029617832840816,
+        1.0029546921741943, 1.0029476165238225, 1.0029405520502193, 1.0029334971368482,
+        1.0029264530280102, 1.0029194235118863, 1.0029124141613015, 1.0029054312781684,
+        1.0028984807364103, 1.0028915669311587, 1.0028846920178596, 1.0028778555686961,
+        1.0028710546964152, 1.002864284611323, 1.0028575395012302, 1.0028508135696024,
+        1.002844102043404, 1.002837401972426, 1.0028307126836362, 1.002824035818992,
+        1.0028173749610991, 1.0028107349242736, 1.0028041208460021, 1.0027975372457245,
+        1.002790987219219, 1.002784471908246, 1.0027779903323777, 1.0027715396031218,
+        1.002765115471824, 1.0027587131046818, 1.0027523279405999, 1.0027459564767331,
+        1.0027395968436341, 1.0027332490731786, 1.002726915019855, 1.0027205979589588,
+        1.002714301942289, 1.002708031033127, 1.0027017885605911, 1.0026955765263073,
+        1.002689395265556, 1.0026832434168675, 1.002677118197416, 1.0026710159268648,
+        1.0026649326992978, 1.0026588650788706, 1.0026528106936643, 1.0026467686235827,
+        1.0026407395175285, 1.0026347254251924, 1.0026287293801883, 1.002622754814946,
+        1.0026168049159716, 1.0026108820362392, 1.00260498726862, 1.00259912025311,
+        1.0025932792472916, 1.002587461441899, 1.0025816634601126, 1.0025758819479529,
+        1.0025701141490446, 1.0025643583622477, 1.0025586142037632, 1.0025528826317796,
+        1.0025471657347227, 1.002541466325996, 1.0025357874211938, 1.002530131692727,
+        1.00252450099839, 1.0025188960649345, 1.0025133163783342, 1.0025077602946155,
+        1.0025022253459268, 1.002496708682748, 1.0024912075707555, 1.0024857198534045,
+        1.0024802442997747, 1.002474780779632, 1.0024693302397545, 1.0024638944912905,
+        1.0024584758510071, 1.0024530767038147, 1.0024476990659663, 1.002442344225949,
+        1.0024370125242061, 1.0024317033065777, 1.0024264150547104, 1.0024211456653578,
+        1.0024158928250042, 1.002410654410974, 1.0024054288474524, 1.00240021535488,
+        1.0023950140517541, 1.0023898258950923, 1.0023846524746887, 1.0023794957016596,
+        1.0023743574492563, 1.0023692392106798, 1.0023641418337685, 1.0023590653771346,
+        1.0023540091096321, 1.0023489716491236, 1.0023439512120766, 1.0023389459268224,
+        1.0023339541534393, 1.002328974753737, 1.002324007265237, 1.0023190519513046,
+        1.0023141097221846, 1.002309181944591, 1.0023042701765674, 1.0022993758764058,
+        1.0022945001375492, 1.0022896434952882, 1.0022848058371003, 1.002279986429342,
+        1.0022751840521889, 1.0022703972159808, 1.0022656244186283, 1.0022608643977673,
+        1.0022561163336448, 1.0022513799686805, 1.0022466556252572, 1.0022419441216668,
+        1.00223724660395, 1.0022325643255245, 1.0022278984146376, 1.002223249670587,
+        1.0022186184233568, 1.0022140044791958, 1.0022094071589878, 1.0022048254199016,
+        1.00220025803662, 1.0021957038088312, 1.002191161758181, 1.0021866312808674,
+        1.0021821122308445, 1.002177604921432, 1.002173110047609, 1.0021686285449458,
+        1.002164161411498, 1.0021597095245196, 1.0021552734836827, 1.0021508535068488,
+        1.002146449394552, 1.0021420605669982, 1.0021376861648554, 1.002133325194508,
+        1.0021289766915364, 1.0021246398740293, 1.0021203142600692, 1.0021159997307576,
+        1.0021116965300374, 1.0021074052035783, 1.002103126489156, 1.0020988611786288,
+        1.0020946099755925, 1.002090373372548, 1.0020861515672244, 1.0020819444303906,
+        1.0020777515284713, 1.0020735721951342, 1.002069405638235, 1.002065251063372],
+    [0.004516222979432857, 0.01354940391320797, 0.02258479187183469, 0.03162385942175675,
+        0.0406680800870291, 0.04971893101137473, 0.058777891459474325, 0.06784644505477049,
+        0.07692607981981735, 0.08601828894347388, 0.09512457148042773, 0.10424643335372223,
+        0.11338538763185795, 0.12254295569137671, 0.13172066763889315, 0.14092006327143816,
+        0.1501426927716658, 0.15939011743898987, 0.16866391063137337, 0.17796565830726727,
+        0.1872969601748406, 0.19665943027413027, 0.2060546979259844, 0.21548440862154095,
+        0.22495022490969827, 0.23445382722119126, 0.24399691494623194, 0.25358120726851746,
+        0.2632084442629107, 0.2728803877288395, 0.28259882244468904, 0.29236555704685474,
+        0.30218242524449945, 0.31205128685976674, 0.3219740290720429, 0.33195256753207203,
+        0.34198884767523824, 0.3520848459040866, 0.36224257100415996, 0.3724640654020906,
+        0.38275140666636404, 0.3931067088628626, 0.40353212413878187, 0.41402984419637284,
+        0.42460210202493875, 0.4352511733688806, 0.44597937871646226, 0.4567890848090633,
+        0.4676827067421226, 0.4786627097298631, 0.4897316111436353, 0.5008919826309075,
+        0.5121464521802126, 0.5234977063968954, 0.534948492828811, 0.5465016222706526,
+        0.5581599713578375, 0.5699264850272773, 0.5818041792404458, 0.5937961437200199,
+        0.6059055447594376, 0.6181356281690047, 0.6304897223001301, 0.6429712411358054,
+        0.6555836874517933, 0.6683306561036566, 0.681215837321093, 0.6942430200418102,
+        0.7074160953462774, 0.720739059845325, 0.7342160190358954, 0.7478511905957873,
+        0.7616489076477808, 0.7756136217401765, 0.7897499056694942, 0.8040624558670817,
+        0.818556094466186, 0.8332357706575794, 0.8481065612272254, 0.8631736702007363,
+        0.8784424270531688, 0.8939182832775204, 0.9096068068649863, 0.9255136740190777,
+        0.9416446574841966, 0.9580056104851917, 0.9746024452099964, 0.9914411042810979,
+        1.008527523251874, 1.025867581935946, 1.0434670410405553, 1.0613314602726671,
+        1.0794660923862236, 1.0978757460939816, 1.1165646082812386, 1.1355360130933188,
+        1.1547921403330135, 1.1743336202447807, 1.1941590119139875, 1.2142641102990652,
+        1.234641017728519, 1.255276887777639, 1.2761522063875257, 1.2972384093628353,
+        1.3184945288986378, 1.3398623895280375, 1.361259580450768, 1.3825689157958163,
+        1.4036221443429542, 1.424173820619501, 1.443857390716018, 1.462106776727851,
+        1.4780044415739515, 1.4899509116858898, 1.4948079222520136, 1.4849090973527366,
+        1.4286986966863968, 1.971730082839934, 1.4528645548114194, 0.8016719105625986,
+        2.195891505455267, 1.7770330506788583, 1.3822700382344235, 0.12079407408645067,
+        3.4834600571182386, 3.1458798788869453, 2.8136867485360164, 2.290093394677793,
+        2.4184426076846695, 5.062812130340401, 4.264866778996453, 2.5921601298102765,
+        1.7386487828864208, 1.2699821546863785, 1.1292790075634076, 1.5790581010043936,
+        2.449002395690969, 2.3116039932024712, 1.8041123461553272, 1.4542969258680971,
+        1.2338406551175858, 1.124287219752225, 1.1837142664289895, 1.5214712978097436,
+        1.9005349019999354, 1.802425287389526, 1.5397659978324367, 1.3369758161522862,
+        1.20207379783807, 1.1272145631153154, 1.130371226298617, 1.2649512720216125,
+        1.5254054060100475, 1.6258546630586057, 1.4871376905470008, 1.3243688902425879,
+        1.2020114567127391, 1.158999365138489, 1.1676697257311508, 1.2042505766797733,
+        1.2608850969523977, 1.3117265632905268, 1.3291289835345097, 1.3108406830813453,
+        1.2749107689753978, 1.237846809826947, 1.2077603427448849, 1.1874014617468287,
+        1.1773681837042564, 1.1774711284910075, 1.18666725612106, 1.2020046623512328,
+        1.217536158628653, 1.2255300364278487, 1.2211564781496345, 1.2060519337365168,
+        1.1859857992274836, 1.166246848263695, 1.1496919600621494, 1.1372074643992094,
+        1.1286706473817383, 1.123593669206943, 1.1214272042272373, 1.121670331130462,
+        1.123893749026739, 1.1277304677232163, 1.1328570502375443, 1.1389737484700537,
+        1.1457855499036453, 1.1529837166179266, 1.160226804882487, 1.1671207542716635,
+        1.1731997124728266, 1.1779139429241692, 1.1806401276208311, 1.180742931267227,
+        1.1777274045898138, 1.1715031387804462, 1.1626892715850374, 1.152730931056277,
+        1.1435528588602717, 1.1367913098044702, 1.1331170696684676, 1.132141214720984,
+        1.1328408539720496, 1.1340826705206357, 1.1349559228046415, 1.1348910491729522,
+        1.1336545026219336, 1.1312971461242696, 1.1280890837783606, 1.124444243787302,
+        1.1208301789742166, 1.1176671364842106, 1.1152358489618417, 1.113622332202177,
+        1.1127196020877768, 1.1122830707077642, 1.112014164417068, 1.111640200724198,
+        1.1109685722997826, 1.1099091690827945, 1.1084704249037285, 1.1067383221294416,
+        1.104846671448089, 1.1029447199078006, 1.1011667916580694, 1.099608366347618,
+        1.0983125893192345, 1.0972694582269222, 1.096426721648557, 1.0957081689738635,
+        1.0950332874348379, 1.0943330424590347, 1.0935590769939827, 1.092686378761951,
+        1.0917112289212718, 1.0906467140637235, 1.0895176276733947, 1.088355771464121,
+        1.0871959257204376, 1.0860723140536812, 1.0850152907123212, 1.0840481520296836,
+        1.0831842625251582, 1.0824249206740715, 1.081758460836038, 1.0811609885574902,
+        1.080598939633475, 1.0800334025305207, 1.0794258660454084, 1.0787447335167717,
+        1.0779715921501762, 1.077105934149827, 1.076166972549542, 1.0751915600700734,
+        1.074228052483873, 1.0733270689565397, 1.0725310936498416, 1.0718653232450597,
+        1.0713319025999009, 1.070908837415057, 1.0705537767285138, 1.0702118651822317,
+        1.069826160679886, 1.069348715453396, 1.0687502820125625, 1.0680267263046934,
+        1.0672006711460564, 1.0663177101726176, 1.0654376631141955, 1.0646225405614782,
+        1.063923777892787, 1.0633715534565318, 1.0629685151844381, 1.0626891741918125,
+        1.062484940680441, 1.0622936377033854, 1.0620515553983232, 1.061705758916348,
+        1.0612243933723924, 1.0606030795283892, 1.059866130607387, 1.0590622110449592,
+        1.0582551127217579, 1.057511357436312, 1.0568870870893425, 1.0564169338268448,
+        1.056107161208592, 1.055934423774452, 1.0558502700628776, 1.0557903448101793,
+        1.0556864018996557, 1.0554788535078325, 1.0551276424520462, 1.054619633300732,
+        1.0539713484272126, 1.0532266218228343, 1.052449526951436, 1.05171368479237,
+        1.0510896886877679, 1.0506327829577236, 1.0503729853487664, 1.050309471798359,
+        1.0504102631909942, 1.0506172114505803, 1.0508552252579049, 1.0510438799751576,
+        1.0511092231712698, 1.0509937676540262, 1.0506632501503508, 1.0501095160119542,
+        1.0493496457607547, 1.0484220067755337, 1.0473802258977158, 1.0462861527203149,
+        1.0452027839298137, 1.0441879226197, 1.0432891153297696, 1.0425401827516796,
+        1.0419594563259622, 1.0415496593458644, 1.0412992311416491, 1.0411847907300051,
+        1.0411743766585462, 1.04123108453238, 1.041316748471636, 1.041395366093457,
+        1.0414360328925494, 1.0414152165358526, 1.0413182562405707, 1.041140017280905,
+        1.0408846728974552, 1.0405646347301218, 1.040198714214442, 1.0398096699031767,
+        1.0394213705976998, 1.039055867774604, 1.0387307085603927, 1.0384568207610017,
+        1.0382372575399677, 1.0380670003479566, 1.0379338898511088, 1.0378205979028923,
+        1.0377073888441144, 1.0375752728654564, 1.0374090593077592, 1.0371998020529682,
+        1.0369462083057481, 1.0366547506614672, 1.0363384513011615, 1.036014549551722,
+        1.0357014680912526, 1.0354156167377475, 1.0351685942558673, 1.0349652691771667,
+        1.034803060111865, 1.0346725253713862, 1.034559146009425, 1.0344459807233954,
+        1.0343167180785175, 1.0341585785381628, 1.0339645429073965, 1.0337345059083627,
+        1.0334751543053797, 1.0331986099154722, 1.0329201096469398, 1.0326551696941701,
+        1.0324167654601246, 1.0322130403730558, 1.0320459450000725, 1.031911028705006,
+        1.031798394359327, 1.0316946191284029, 1.0315852752253607, 1.031457581666565,
+        1.031302699779599, 1.0311172563610598, 1.0309038274085685, 1.030670314405303,
+        1.0304283547720754, 1.0301910861269505, 1.0299706956891779, 1.0297762122921497,
+        1.0296119384279383, 1.029476789577349, 1.0293646350936085, 1.0292655513787496,
+        1.029167735820289, 1.0290597161041972, 1.028932443224215, 1.028780885856447,
+        1.0286048435631736, 1.0284088477689068, 1.0282011930894135, 1.0279923030962104,
+        1.0277927526131452, 1.0276113218144802, 1.0274534385274663, 1.0273202814734426,
+        1.027208687394454, 1.0271118545095415, 1.0270206907475388, 1.0269255425145798,
+        1.0268179773355701, 1.026692291892518, 1.0265464755222635, 1.02638246675294,
+        1.026205676046539, 1.0260238850850465, 1.0258457452274468, 1.0256791644616117,
+        1.025529882516936, 1.0254004885184453, 1.0252900457215068, 1.025194371814761,
+        1.0251069027680804, 1.0250199646124438, 1.0249262086026338, 1.0248199423786784,
+        1.0246981162911775, 1.0245607943226804, 1.0244110391744368, 1.024254251572107,
+        1.0240971034191249, 1.0239462745424266, 1.0238072313538797, 1.0236832692863411,
+        1.0235749844917394, 1.023480256114879, 1.0233947247998134, 1.0233126634208578,
+        1.0232280680656927, 1.023135762538679, 1.023032313557344, 1.022916594841294,
+        1.0227899080668037, 1.0226556534776075, 1.0225186264405701, 1.0223840827212576,
+        1.0222567528525226, 1.0221399888336682, 1.0220351954892408, 1.0219416412527538,
+        1.0218566704531216, 1.0217762650054287, 1.0216958410680956, 1.021611126546177,
+        1.0215189548655492, 1.0214178304463633, 1.0213081674239688, 1.0211921662657142,
+        1.0210733608329128, 1.020955928324516, 1.020843895508108, 1.0207403897691634,
+        1.0206470709813946, 1.0205638433695257, 1.0204888929631315, 1.0204190361149177,
+        1.0203503087962407, 1.0202786847747412, 1.0202007903701598, 1.020114487426996,
+        1.0200192231703429, 1.0199160902774045, 1.0198075942070484, 1.0196971775034989,
+        1.0195885928291033, 1.0194852405983459, 1.0193895895855973, 1.019302780164298,
+        1.0192244740857312, 1.0191529689150132, 1.0190855478500362, 1.0190189950401527,
+        1.0189501796166986, 1.0188766027758198, 1.018796812454401, 1.0187106170228477,
+        1.018619067641118, 1.0185242212229135, 1.0184287345462757, 1.018335368119652,
+        1.0182464913439973, 1.018163676635775, 1.0180874509122775, 1.018017242261455,
+        1.0179515235865575, 1.017888120081172, 1.0178246196485845, 1.0177588094532617,
+        1.0176890600818858, 1.0176145911101644, 1.0175355755286326, 1.0174530708296008,
+        1.017368795891819, 1.0172847994534502, 1.0172030833538854, 1.0171252491482574,
+        1.0170522297255638, 1.016984149981897, 1.016920335984292, 1.0168594650373937,
+        1.0167998244780918, 1.0167396290952502, 1.016677338700424, 1.0166119196825543,
+        1.0165430065514027, 1.0164709389711988, 1.0163966728395317, 1.0163215863174757,
+        1.0162472194079413, 1.0161749957700708, 1.0161059765052276, 1.0160406878878994,
+        1.015979050215247, 1.01592041602713, 1.015863706397207, 1.0158076172597428,
+        1.0157508566247646, 1.0156923697619726, 1.0156315133651266, 1.0155681503335001,
+        1.0155026519702461, 1.0154358112216586, 1.0153686860171198, 1.0153024031557032,
+        1.015237958707988, 1.015176049875331, 1.0151169661737889, 1.015060556213958,
+        1.0150062724656668, 1.0149532827434669, 1.0149006260802425, 1.0148473839731182,
+        1.0147928366476497, 1.0147365779839193, 1.014678571138903, 1.0146191380149885,
+        1.014558887492374, 1.0144985976798475, 1.0144390746170522, 1.0143810128014623,
+        1.014324881333232, 1.014270853886807, 1.0142187923073793, 1.0141682839841841,
+        1.014118723986453, 1.014069425797857, 1.0140197404626363, 1.0139691635811028,
+        1.0139174127307686, 1.013864463815883, 1.0138105423954669, 1.0137560738280285,
+        1.0137016027603685, 1.0136476970092128, 1.0135948526094347, 1.013543415620685,
+        1.013493532585439, 1.0134451361009416, 1.0133979658249828, 1.0133516194450476,
+        1.0133056236309916, 1.013259512412761, 1.0132129000605166, 1.013165537290605,
+        1.0131173430341867, 1.0130684083995594, 1.0130189740443138, 1.012969386192638,
+        1.0129200393933528, 1.0128713154671405, 1.012823527871176, 1.0127768791126124,
+        1.0127314362652993, 1.012687126595314, 1.0126437522996603, 1.0126010208540699,
+        1.0125585857571824, 1.0125160916859983, 1.0124732182115286, 1.0124297170978198,
+        1.012385439570255, 1.0123403515105105, 1.0122945360627253, 1.0122481844316638,
+        1.0122015766168568, 1.0121550544409206, 1.0121089895429463, 1.0120637491013686,
+        1.0120196620088657, 1.0119769881022078, 1.0119358928702267, 1.011896429800644,
+        1.0118585321321505, 1.011822015200596, 1.0117865897790987, 1.011751885828589,
+        1.0117174849713186, 1.0116829589027745, 1.011647910031414, 1.0116120100521733,
+        1.0115750320641146, 1.0115368723189226, 1.0114975587342754, 1.01145724482726,
+        1.0114161895313383, 1.011374725205627, 1.0113332177511978, 1.0112920238603824,
+        1.0112514508525745, 1.0112117242063572, 1.0111729668163494, 1.011135192336549,
+        1.0110983129689666, 1.011062160021924, 1.0110265138080792, 1.0109911382433516,
+        1.0109558150214273, 1.0109203725336289, 1.0108847057141832, 1.0108487845382534,
+        1.010812650724108, 1.010776403996566, 1.0107401807722962, 1.01070412910556,
+        1.010668384054107, 1.0106330472713911, 1.010598173694549, 1.010563766861542,
+        1.01052978289496, 1.0104961417889682, 1.010462743554195, 1.0104294861719825,
+        1.0103962822539083, 1.0103630717670682, 1.010329829056876, 1.0102965635007655,
+        1.0102633142546795, 1.010230140514826, 1.0101971093573396, 1.0101642834522633,
+        1.0101317107658787, 1.0100994178310136, 1.0100674073999913, 1.0100356604521368,
+        1.0100041417635712, 1.0099728076908903, 1.0099416145559768, 1.0099105260696788,
+        1.009879518562506, 1.0098485833161492, 1.009817725896995, 1.0097869629613616,
+        1.0097563174285449, 1.0097258131330789, 1.0096954700488427, 1.0096653009483192,
+        1.009635309982803, 1.0096054932303913, 1.0095758408506577, 1.0095463401875597,
+        1.009516979027525, 1.0094877482634326, 1.0094586434157005, 1.0094296647663747,
+        1.0094008161996735, 1.0093721031386733, 1.0093435301605989, 1.0093150989251478,
+        1.0092868069553484, 1.0092586475940752, 1.0092306111721863, 1.0092026871310993,
+        1.0091748666080391, 1.0091471448678835, 1.0091195229787344, 1.0090920082772457,
+        1.0090646134237773, 1.0090373541531705, 1.0090102461204407, 1.0089833014590113,
+        1.00895652576482, 1.0089299161693133, 1.008903460974503, 1.0088771410283714,
+        1.0088509326760293, 1.0088248117981753, 1.0087987582089029, 1.0087727595795322,
+        1.0087468141085831, 1.008720931364444, 1.008695131051735, 1.0086694398353466,
+        1.0086438867269634, 1.00861849782671, 1.0085932913611801, 1.0085682739373953,
+        1.0085434387401053, 1.0085187660687966, 1.0084942261986838, 1.0084697841303327,
+        1.008445405441321, 1.0084210622353154, 1.0083967381406953, 1.0083724314527918,
+        1.0083481558189336, 1.0083239382820557, 1.0082998149546376, 1.0082758250112938,
+        1.0082520039916423, 1.0082283775420524, 1.0082049566699547, 1.0081817353457365,
+        1.0081586909044697, 1.0081357872370897, 1.0081129802961626, 1.0080902250527548,
+        1.0080674827932348, 1.0080447275786564, 1.0080219508150379, 1.00799916317864,
+        1.0079763935567254, 1.0079536851328592, 1.0079310891906594, 1.0079086575604939,
+        1.0078864348360774, 1.007864451513707, 1.007842719055997, 1.0078212275830116,
+        1.0077999464970375, 1.0077788279173774, 1.0077578124047126, 1.00773683614945,
+        1.007715838626242, 1.0076947696958647, 1.007673595260328, 1.007652300819471,
+        1.0076308925939177, 1.007609396218458, 1.0075878533210167, 1.0075663165435176,
+        1.0075448437046493, 1.0075234918412281, 1.0075023118014899, 1.0074813439219656,
+        1.0074606151297336, 1.007440137607184, 1.0074199089672036, 1.0073999137358949,
+        1.0073801258401145, 1.0073605117506377, 1.007341033931748, 1.0073216542819257,
+        1.007302337303313, 1.0072830527964503, 1.007263777932037, 1.0072444985994184,
+        1.0072252099730128, 1.007205916277601, 1.0071866297767649, 1.0071673690595109,
+        1.0071481567586313, 1.0071290168958795, 1.0071099721047827, 1.0070910410203278,
+        1.007072236133832, 1.0070535623826387, 1.0070350166741187, 1.0070165884364566,
+        1.0069982611562693, 1.0069800147237784, 1.006961828281808, 1.006943683187112,
+        1.0069255656589813, 1.0069074687204986, 1.0068893931313672, 1.0068713471567898,
+        1.006853345192787, 1.006835405447523, 1.006817547030955, 1.0067997869052177,
+        1.0067821371774555, 1.0067646031680735, 1.0067471825671062, 1.0067298658177248,
+        1.006712637666936, 1.006695479632177, 1.0066783729807862, 1.0066613017334742,
+        1.0066442551978063, 1.0066272296151697, 1.0066102286520708, 1.0065932626594902,
+        1.0065763468299513, 1.0065594985660806, 1.006542734505462, 1.0065260677022847,
+        1.0065095054372477, 1.006493048018402, 1.0064766887659495, 1.0064604151724614,
+        1.0064442110311622, 1.0064280591626364, 1.006411944272225, 1.00639585545261,
+        1.0063797879113918, 1.0063637436397066, 1.0063477309214484, 1.0063317627814088,
+        1.0063158546504019, 1.0063000216557256, 1.0062842760040085, 1.0062686249016188,
+        1.006253069359796, 1.0062376040755199, 1.0062222183921858, 1.0062068981591883,
+        1.0061916281580938, 1.0061763946710471, 1.0061611877491838, 1.0061460027972946,
+        1.006130841214571, 1.006115709997589, 1.0061006203915743, 1.006085585838087,
+        1.0060706195839904, 1.006055732368409, 1.006040930583658, 1.0060262152174193,
+        1.006011581743441, 1.0059970209616436, 1.005982520625034, 1.0059680675583644,
+        1.005953649894417, 1.0059392590406835, 1.0059248910432586, 1.005910547125225,
+        1.005896233323555, 1.0058819593055213, 1.005867736585505, 1.0058535764619492,
+        1.0058394880358887, 1.005825476650838, 1.0058115430139705, 1.0057976831353597,
+        1.0057838890779784, 1.0057701503712584, 1.0057564558297492, 1.005742795454069,
+        1.0057291620843336, 1.0057155525263586, 1.005701967968308, 1.0056884136322086,
+        1.0056748977382235, 1.0056614299765594, 1.0056480197624753, 1.0056346745808995,
+        1.0056213987044633, 1.005608192497457, 1.005595052411799, 1.0055819716588432,
+        1.0055689414243005, 1.0055559524027704, 1.0055429963784992, 1.0055300675776806,
+        1.0055171635639522, 1.0055042855335345, 1.0054914379740778, 1.005478627762495,
+        1.0054658628725, 1.0054531509260205, 1.0054404978439209, 1.0054279068278758,
+        1.0054153778419326, 1.0054029076713487, 1.00539049053402, 1.0053781191244007,
+        1.0053657858975333, 1.0053534843637604, 1.0053412101683241, 1.00532896177292,
+        1.005316740629741, 1.0053045508294134, 1.0052923982960056, 1.005280289679282,
+        1.0052682311434398, 1.00525622726491, 1.0052442802280634, 1.0052323894516972,
+        1.0052205517015989, 1.0052087616592305, 1.0051970128384193, 1.005185298684488,
+        1.00517361366264, 1.0051619541488483, 1.005150318974939, 1.0051387095425657,
+        1.0051271294968664, 1.005115584026415, 1.0051040789183694, 1.0050926195364114,
+        1.0050812098978656, 1.0050698520047257, 1.0050585455357346, 1.005047287941974,
+        1.0050360749182656, 1.0050249011592507, 1.0050137612629613, 1.00500265062347,
+        1.0049915661607196, 1.0049805067679363, 1.0049694734089027, 1.0049584688592146,
+        1.0049474971467234, 1.0049365627960614, 1.00492567001243, 1.004914821946006,
+        1.0049040201601187, 1.0048932643876294, 1.0048825526079928, 1.004871881421587,
+        1.0048612466478122, 1.0048506440375196, 1.0048400699743114, 1.0048295220451917,
+        1.0048189993872805, 1.004808502758623, 1.0047980343300154, 1.0047875972425706,
+        1.0047771950143156, 1.0047668309021647, 1.0047565073297167, 1.0047462254763762,
+        1.0047359850925501, 1.004725784564866, 1.0047156212118669, 1.0047054917519407,
+        1.0046953928578224, 1.004685321700185, 1.0046752763880278, 1.0046652562343843,
+        1.0046552618081017, 1.0046452947703244, 1.0046353575309919, 1.0046254527901346,
+        1.0046155830460164, 1.004605750154959, 1.0045959550157912, 1.0045861974281185,
+        1.0045764761422156, 1.0045667890851904, 1.0045571337186494, 1.0045475074624228,
+        1.004537908110123, 1.0045283341664333, 1.004518785051925, 1.0045092611456643,
+        1.0044997636644837, 1.0044902944054608, 1.0044808554002649, 1.0044714485430797,
+        1.0044620752558486, 1.0044527362458289, 1.0044434313927009, 1.0044341597791657,
+        1.0044249198542619, 1.0044157096967063, 1.004406527330095, 1.0043973710350267,
+        1.0043882396060024, 1.0043791325123597, 1.0043700499402684, 1.0043609927136943,
+        1.0043519621125314, 1.0043429596225082, 1.0043339866613386, 1.0043250443276033,
+        1.0043161332130301, 1.0043072533065005, 1.0042984040016372, 1.0042895842021389,
+        1.0042807925031685, 1.0042720274155388, 1.0042632875939936, 1.0042545720320148,
+        1.0042458801929095, 1.0042372120588186, 1.0042285680935819, 1.0042199491296093,
+        1.0042113562007347, 1.0042027903506086, 1.0041942524485914, 1.0041857430421823,
+        1.004177262267602, 1.0041688098296644, 1.0041603850504486, 1.004151986975446],
+    [0.0008593829906906719, 0.0025786508808534206, 0.004299425577504465,
+        0.006022714120695904, 0.007749527146833857, 0.009480880778741808,
+        0.011217797738574562, 0.012961309196095705, 0.014712456224205047,
+        0.016472291425551556, 0.01824188058402285, 0.02002230441908, 0.021814660248851588,
+        0.023620063881930244, 0.02543965142768177, 0.027274581282519163,
+        0.029126036142468805, 0.030995225109143723, 0.032883385934023755,
+        0.03479178728724434, 0.036721731266071964, 0.03867455591559291,
+        0.0406516379645959, 0.04265439570392167, 0.04468429203392491, 0.046742837684124065,
+        0.04883159469186691, 0.05095218005354518, 0.053106269680706024,
+        0.05529560257013358, 0.057521985368438035, 0.05978729718407699,
+        0.062093494841814215, 0.06444261850278074, 0.066836797781657, 0.06927825833207481,
+        0.07176932903464156, 0.0743124497712732, 0.07691017994725052, 0.07956520774577679,
+        0.08228036030949973, 0.08505861485696366, 0.08790311095390216, 0.0908171639918977,
+        0.0938042801377076, 0.09686817279850568, 0.10001278104405133, 0.10324228995921689,
+        0.10656115353669886, 0.10997412019505742, 0.11348626151929866, 0.11710300466634659,
+        0.12083016898242871, 0.12467400762405145, 0.12864125498346418, 0.13273918091897524,
+        0.13697565314584878, 0.14135920916454, 0.14589913973682017, 0.15060558613558,
+        0.15548965406503137, 0.16056354788116828, 0.16584072963941296, 0.1713361087479801,
+        0.17706626964488795, 0.18304974712017594, 0.18930736176422489, 0.19586263209009952,
+        0.20274228542175415, 0.20997689725565089, 0.2176016998161855, 0.2256576162440178,
+        0.23419259992057434, 0.2432633925657119, 0.2529378670992304, 0.2632982020255234,
+        0.27444526339022995, 0.28650478128578283, 0.29963626492931716, 0.3140462250223512,
+        0.33000841050398294, 0.3478959442044444, 0.36823464355629454, 0.39179632970611133,
+        0.4197732684959484, 0.45413303312730774, 0.49842627280068613, 0.559940985086855,
+        0.657040454045498, 0.8584764120479909, 2.5586978717017055, 0.7894831402796035,
+        0.567354218615847, 0.47919578343026986, 0.4314107150474616, 0.40214571406521177,
+        0.38328228046893487, 0.37105041721584103, 0.36345310563403543, 0.359341634986298,
+        0.35802277770620544, 0.35907173553676813, 0.3622359710135397, 0.3673837201085132,
+        0.37447683867512527, 0.38355863908666854, 0.3947527307064376, 0.4082721126858555,
+        0.4244405995806775, 0.44373250641044837, 0.4668436630632522, 0.49482278412780323,
+        0.5293333564947057, 0.5732407438339806, 0.6321882891142969, 0.7203038759391458,
+        0.8981030447267385, 2.0308640854959044, 0.9017335617927682, 1.8226501395665267,
+        0.9327400222706231, 0.6058337504042653, 1.0399148537681562, 1.9815772165018044,
+        2.107580164260038, 0.7094154466796063, 0.5695883740429609, 0.863003287146926,
+        1.4558760746812194, 2.3914829567721303, 1.709025132248349, 0.9091982017885963,
+        0.6184253642429874, 0.6617516599474683, 0.9692168213948154, 1.5541496355746378,
+        2.112310646015454, 1.6843377056080144, 1.1272115815522479, 0.8066641955002924,
+        0.6721530077861599, 0.7288150181282717, 1.0055347568589188, 1.4935084388391728,
+        1.8352369677148785, 1.5951937877824485, 1.2286053756822952, 0.9647417026230847,
+        0.8011594439623211, 0.7394100579889983, 0.8210621235431708, 1.0966001643845629,
+        1.4848176468841519, 1.5993542478283733, 1.3907141442283275, 1.1495611517166622,
+        0.9575329996921388, 0.881827708082902, 0.8995018887308217, 0.9659627927019875,
+        1.067902390218461, 1.1644477656717118, 1.2122479326557019, 1.204047610969693,
+        1.1631338280409622, 1.113414620361861, 1.0683327592618952, 1.0339157409307707,
+        1.0130544191753663, 1.0076535171111198, 1.0187415752047808, 1.044721236153788,
+        1.0787131353060098, 1.108596560826855, 1.123204815701765, 1.119661935637487,
+        1.1030592051632186, 1.0805835106238146, 1.057516753943456, 1.036650150141338,
+        1.0190855970714765, 1.0050477399803612, 0.9943843205690635, 0.986818827908353,
+        0.9820622819275666, 0.9798553015003696, 0.979978507746643, 0.9822495099057202,
+        0.9865141917214383, 0.992634488292974, 1.000471717842361, 1.0098624567258152,
+        1.0205824815579259, 1.0322941436120943, 1.0444763689026584, 1.0563499709775803,
+        1.0668410289692705, 1.074667350940666, 1.0786433171572687, 1.0781862996027494,
+        1.0737581701375616, 1.066843767464985, 1.0593721591074963, 1.052982265652563,
+        1.048605529591839, 1.0464669953269727, 1.0463068901435526, 1.0476163043939584,
+        1.0498002953718404, 1.052270425623891, 1.054497832229916, 1.0560536814298656,
+        1.0566486765945697, 1.0561675812730338, 1.0546845123181956, 1.0524449825239153,
+        1.0498119647178488, 1.0471887686423595, 1.0449407544316889, 1.043335415123547,
+        1.0425098543842362, 1.0424642713977033, 1.0430750464625502, 1.0441213626663652,
+        1.0453218181427777, 1.0463789285256735, 1.0470281962690073, 1.0470850673502483,
+        1.0464799493776995, 1.0452714535163934, 1.0436326473720938, 1.0418129363118829,
+        1.0400854693971766, 1.038693223665078, 1.0378053409192176, 1.037490773591395,
+        1.0377115486048052, 1.0383346006317518, 1.039159168166275, 1.039955301348744,
+        1.0405073957633155, 1.0406550247176027, 1.0403227372136539, 1.0395320717868115,
+        1.0383930461110535, 1.0370776431327782, 1.0357822853466172, 1.0346883117458976,
+        1.0339287131934347, 1.0335667660299013, 1.033589073786041, 1.0339128129649462,
+        1.0344049244102875, 1.03490942340611, 1.0352777857082838, 1.0353966907688863,
+        1.0352077036708056, 1.034715072672412, 1.0339805268264248, 1.0331070142870542,
+        1.0322157224166706, 1.0314217500950724, 1.0308133641006723, 1.0304383133177424,
+        1.0302988375463615, 1.030355287262778, 1.0305368911662818, 1.0307572065033284,
+        1.030931170875469, 1.0309905177915237, 1.0308947311097005, 1.0306357181445975,
+        1.0302358038261075, 1.029740123921384, 1.0292056057500416, 1.0286891851563507,
+        1.0282376804091797, 1.0278810126842792, 1.0276295164854534, 1.0274751813766554,
+        1.027395970940314, 1.0273619421473559, 1.0273417463016623, 1.027308213844745,
+        1.027242073659728, 1.0271333666863083, 1.026980677725713, 1.0267887963580455,
+        1.0265657077322505, 1.0263198418054813, 1.0260582902589015, 1.0257863194792853,
+        1.0255080864408535, 1.0252281155844085, 1.024952895279183, 1.0246919317046297,
+        1.0244577445705259, 1.0242645625683209, 1.0241258180423487, 1.024050880221835,
+        1.0240417301944524, 1.0240904002347033, 1.0241779285970367, 1.024275312513942,
+        1.0243465246539314, 1.0243531901939344, 1.0242601276789822, 1.0240407472809552,
+        1.0236813305692682, 1.0231834672959508, 1.022564313398791, 1.0218547477094468,
+        1.0210958426825714, 1.0203342686344523, 1.0196173120932635, 1.018988134187999,
+        1.0184817679609501, 1.0181221954625521, 1.0179206859396712, 1.0178754315341312,
+        1.0179723936226126, 1.01818717437794, 1.0184876572513546, 1.0188371201864905,
+        1.0191975182389663, 1.019532655418079, 1.019811011024974, 1.0200080415174673,
+        1.0201078328310262, 1.0201040223928433, 1.01999994444078, 1.0198079832914233,
+        1.0195481567255191, 1.019246003344696, 1.0189299145800352, 1.0186281266472563,
+        1.0183656562630685, 1.018161510091406, 1.0180265075834731, 1.0179620213161709,
+        1.017959855867959, 1.0180033598938452, 1.0180697069235807, 1.0181331059108751,
+        1.0181685375265923, 1.0181554876640004, 1.0180810980808528, 1.0179422006733743,
+        1.0177458539000164, 1.0175082394206565, 1.0172520610852247, 1.0170028585856927,
+        1.0167848467776512, 1.016616978292146, 1.0165098876136351, 1.0164642220200473,
+        1.0164706306208906, 1.0165114084669167, 1.0165635210431088, 1.0166025054018457,
+        1.01660659295076, 1.0165603529678096, 1.0164572296080434, 1.016300533068009,
+        1.0161027185328035, 1.0158830943049963, 1.0156643822286642, 1.0154687529919397,
+        1.015314038995481, 1.0152107780675135, 1.0151605785490079, 1.015156055342927,
+        1.0151823119502714, 1.015219680921461, 1.0152472257105953, 1.0152463835697305,
+        1.0152041128019664, 1.0151150030719356, 1.014981999568797, 1.0148156461470876,
+        1.0146320207114858, 1.014449766163713, 1.0142867690418662, 1.014157080849139,
+        1.014068611770249, 1.014021971166061, 1.014010616204309, 1.0140222381632562,
+        1.0140411043894937, 1.014050916745357, 1.0140376698016271, 1.0139920065131787,
+        1.013910672594489, 1.0137968438586284, 1.013659310291575, 1.0135107062830924,
+        1.0133651395026748, 1.0132356627470986, 1.013132040644039, 1.0130591901268082,
+        1.0130165379922413, 1.0129983677225964, 1.0129950519867128, 1.0129949166439538,
+        1.0129863812929, 1.0129599864397396, 1.0129099528870094, 1.0128350170117417,
+        1.0127384265974353, 1.012627138163917, 1.0125103984045913, 1.0123979936253178,
+        1.0122984955251157, 1.0122178147023306, 1.0121583019300342, 1.012118527558027,
+        1.0120937427041476, 1.0120769049512404, 1.0120600566929838, 1.0120357915279243,
+        1.011998541071348, 1.0119454601248292, 1.0118767722457513, 1.0117955432275547,
+        1.0117069560796321, 1.0116172478105345, 1.0115325205622443, 1.0114576498950472,
+        1.0113954821570268, 1.0113464491758926, 1.0113086454540101, 1.0112783265345238,
+        1.0112507127907375, 1.0112209333029343, 1.0111849276230245, 1.0111401408568936,
+        1.0110858949455204, 1.0110233860917268, 1.010955331297402, 1.010885351689781,
+        1.0108172248115088, 1.0107541550425225, 1.0106981992646262, 1.0106499477901705,
+        1.0106085068139645, 1.0105717690633764, 1.0105369052030309, 1.0105009696700868,
+        1.010461497608656, 1.0104169768324662, 1.0103671080330707, 1.0103128113514614,
+        1.0102559886612814, 1.01019909824473, 1.0101446329158694, 1.0100946079501376,
+        1.0100501593123274, 1.0100113277049856, 1.0099770654440792, 1.0099454589150632,
+        1.0099141178916877, 1.0098806520185073, 1.0098431398237173, 1.0098004991960572,
+        1.0097526892532966, 1.009700707558402, 1.0096463868599805, 1.009592034029186,
+        1.009539983248366, 1.0094921503835748, 1.0094496734311305, 1.0094127058688542,
+        1.0093803995356925, 1.0093510772819347, 1.009322559975649, 1.0092925840901625,
+        1.0092592301300705, 1.0092212813293742, 1.0091784463005846, 1.009131405748614,
+        1.0090816768470687, 1.0090313229976757, 1.0089825650338347, 1.0089373673009057,
+        1.0088970754663922, 1.0088621720941957, 1.0088321933044986, 1.0088058196692362,
+        1.0087811225039378, 1.0087559187204775, 1.0087281683686227, 1.0086963421953457,
+        1.0086596930273148, 1.0086183831626958, 1.0085734467200893, 1.008526596024162,
+        1.008479909056018, 1.0084354557233992, 1.008394930618054, 1.0083593575037209,
+        1.0083289167704788, 1.0083029242956705, 1.008279962828599, 1.0082581400894686,
+        1.0082354259614625, 1.0082100081730252, 1.0081806038097696, 1.0081466730038093,
+        1.0081084994071865, 1.0080671261429588, 1.0080241614477194, 1.0079814906252558,
+        1.0079409463518976, 1.0079039952995916, 1.007871494723506, 1.0078435591696417,
+        1.0078195574208113, 1.0077982368756224, 1.0077779507711184, 1.007756946716698,
+        1.0077336656683464, 1.0077070001232469, 1.007676468759188, 1.0076422802705434,
+        1.0076052788722396, 1.0075667843206062, 1.0075283568021909, 1.0074915287628585,
+        1.0074575498978489, 1.007427187685112, 1.0074006149879389, 1.0073774004946219,
+        1.0073565999532925, 1.0073369293720658, 1.0073169883644122, 1.007295494658993,
+        1.0072714904370736, 1.0072444874025022, 1.0072145290137513, 1.007182162956069,
+        1.0071483321035535, 1.007114205343299, 1.0070809786027148, 1.0070496799411686,
+        1.0070210103263624, 1.0069952443804215, 1.0069722044259835, 1.006951308577427,
+        1.0069316815558749, 1.0069123073054618, 1.0068921967925473, 1.006870543302999,
+        1.0068468410391247, 1.00682095003552, 1.0067930999686951, 1.006763835629688,
+        1.0067339159610684, 1.0067041852131897, 1.0066754380362861, 1.0066482999007604,
+        1.0066231404546393, 1.0066000311290337, 1.0065787506734238, 1.0065588346475483,
+        1.0065396584227324, 1.0065205388778886, 1.0065008382320915, 1.006480054396055,
+        1.0064578854784332, 1.0064342609421588, 1.0064093374724168, 1.0063834629631974,
+        1.0063571163530798, 1.0063308337863057, 1.0063051324961183, 1.0062804429724421,
+        1.0062570577193144, 1.006235101742482, 1.0062145264187925, 1.0061951251400767,
+        1.0061765665329168, 1.0061584394008727, 1.0061403029005573, 1.006121735761367,
+        1.0061023793777988, 1.0060819710614768, 1.0060603653471363, 1.0060375427561132,
+        1.0060136066622798, 1.0059887697997656, 1.0059633325019357, 1.00593765502852,
+        1.005912126411432, 1.0058871322135086, 1.0058630235043786, 1.0058400892305646,
+        1.0058185339722843, 1.005798462794575, 1.0057798744707032, 1.0057626637574753,
+        1.0057466326481175, 1.0057315096766166, 1.005716975495353, 1.0057026922174865,
+        1.0056883335303533, 1.0056736124445327, 1.0056583037966258, 1.0056422592607543,
+        1.0056254135679812, 1.0056077817522806, 1.0055894483703771, 1.0055705506092274,
+        1.005551257853085, 1.0055317505377692, 1.0055122009475532, 1.005492758057735,
+        1.0054735377045014, 1.0054546184259225, 1.0054360424298503, 1.0054178204536273,
+        1.0053999388903443, 1.0053823675081466, 1.0053650663571143, 1.0053479909585574,
+        1.0053310954796246, 1.005314334175124, 1.005297661805112, 1.0052810339277027,
+        1.005264407892229, 1.0052477450486565, 1.0052310142263015, 1.0052141960335437,
+        1.0051972871135675, 1.0051803032651412, 1.0051632803670267, 1.0051462723399913,
+        1.0051293458938926, 1.0051125724413592, 1.005096018186977, 1.005079733888746,
+        1.0050637460264293, 1.0050480510335487, 1.0050326138497971, 1.0050173713852562,
+        1.00500224066711, 1.004987130608546, 1.004971955651069, 1.0049566491178479,
+        1.0049411740636884, 1.0049255297398179, 1.004909752463496, 1.0048939105849408,
+        1.0048780942252968, 1.004862401349693, 1.0048469223823788, 1.0048317258509534,
+        1.0048168474103087, 1.0048022840626392, 1.0047879945452536, 1.004773905844913,
+        1.0047599247871108, 1.0047459528124512, 1.0047319015314775, 1.0047177065311523,
+        1.0047033372090661, 1.0046888010817694, 1.0046741419356786, 1.0046594322055231,
+        1.0046447609046096, 1.004630219137122, 1.0046158855809424, 1.0046018142864657,
+        1.00458802670772, 1.004574509146594, 1.0045612158786268, 1.0045480772958664,
+        1.0045350116042076, 1.004521938078432, 1.0045087896887253, 1.0044955230885086,
+        1.0044821244540683, 1.0044686103970688, 1.0044550240024184, 1.0044414268338946,
+        1.0044278883691335, 1.0044144746780639, 1.0044012381976868, 1.0043882101886243,
+        1.0043753969440066, 1.0043627801561814, 1.0043503211497062, 1.0043379680775455,
+        1.004325664748725, 1.0043133595710891, 1.0043010131694947, 1.0042886035492384,
+        1.0042761281510546, 1.0042636026971101, 1.0042510572589374, 1.0042385304001546,
+        1.0042260624951878, 1.004213689370238, 1.0042014372617452, 1.0041893197811593,
+        1.004177337177694, 1.004165477778745, 1.0041537211337332, 1.0041420421481748,
+        1.004130415403288, 1.004118818915766, 1.0041072367783443, 1.0040956603895195,
+        1.0040840882733437, 1.0040725247511033, 1.0040609779093577, 1.004049457385241,
+        1.0040379724545936, 1.004026530777642, 1.004015137964691, 1.0040037979141772,
+        1.0039925136922987, 1.0039812886038926, 1.00397012707038, 1.0039590349862373,
+        1.0039480193560208, 1.003937087190355, 1.0039262438238552, 1.0039154909722134,
+        1.0039048249378193, 1.0038942353842526, 1.003883705026502, 1.0038732104390313,
+        1.0038627239942024, 1.0038522167438382, 1.003841661882849, 1.0038310383170228,
+        1.0038203338175709, 1.0038095472892568, 1.003798689798646, 1.0037877841832457,
+        1.003776863261701, 1.0037659668573469, 1.003755138002766, 1.0037444187896007,
+        1.0037338463547012, 1.003723449451873, 1.003713245959687, 1.0037032415399698,
+        1.0036934295120663, 1.0036837918676262, 1.0036743012377747, 1.0036649235502462,
+        1.0036556210813423, 1.0036463556121538, 1.0036370914306707, 1.0036277979691848,
+        1.0036184519185418, 1.0036090387090366, 1.0035995532885014, 1.0035900001623648,
+        1.0035803926925082, 1.0035707516873058, 1.0035611033588527, 1.0035514767762537,
+        1.0035419010025994, 1.0035324021597813, 1.0035230007080387, 1.0035137092435438,
+        1.0035045310965538, 1.003495459949182, 1.0034864805867822, 1.0034775707602746,
+        1.003468703985431, 1.0034598529619592, 1.0034509931842581, 1.0034421062586534,
+        1.0034331824534137, 1.0034242220922807, 1.0034152355520083, 1.0034062418203344,
+        1.0033972657843, 1.003388334616746, 1.0033794737784283, 1.003370703227896,
+        1.0033620344159841, 1.0033534685350076, 1.0033449963087437, 1.0033365993750951,
+        1.003328253065339, 1.0033199301619982, 1.0033116050579434, 1.0033032576697256,
+        1.0032948764910326, 1.0032864603040268, 1.0032780182768872, 1.003269568431871,
+        1.003261134728275, 1.0032527432265, 1.0032444179464883, 1.0032361770818494,
+        1.003228030171882, 1.0032199766769803, 1.0032120061743153, 1.0032041001276994,
+        1.003196234931528, 1.003188385725082, 1.0031805303536283, 1.0031726528356066,
+        1.0031647457829402, 1.0031568113986447, 1.0031488609125165, 1.003140912572051,
+        1.003132988539403, 1.0031251112179695, 1.0031172996162656, 1.0031095663397303,
+        1.0031019156872438, 1.003094343138943, 1.0030868362881307, 1.0030793770322166,
+        1.003071944635097, 1.0030645191391174, 1.003057084559558, 1.0030496313440804,
+        1.0030421577134703, 1.003034669694121, 1.003027179873374, 1.0030197051186975,
+        1.0030122636660959, 1.0030048720758236, 1.0029975425609734, 1.002990281117707,
+        1.0029830867401095, 1.0029759518140071, 1.0029688635854919, 1.00296180642477,
+        1.0029547644829477, 1.0029477242874911, 1.0029406768478244, 1.0029336189391225,
+        1.0029265533812173, 1.002919488303993, 1.0029124355604706, 1.0029054085854512,
+        1.0028984200793005, 1.0028914799112527, 1.0028845935844308, 1.0028777614968107,
+        1.002870979088987, 1.0028642378163277, 1.002857526746503, 1.0028508344858054,
+        1.0028441510944568, 1.0028374696673719, 1.0028307873275397, 1.0028241054900993,
+        1.0028174293857188, 1.00281076695886, 1.0028041273583177, 1.0027975192975382,
+        1.0027909495720222, 1.0027844219809958, 1.002777936819485, 1.002771491000693,
+        1.0027650787566154, 1.002758692766888, 1.0027523254983095, 1.0027459705109227,
+        1.0027396235038049, 1.002733282929997, 1.0027269500937508, 1.0027206287385941,
+        1.0027143242244019, 1.0027080424599704, 1.0027017887934764, 1.002695567061499,
+        1.0026893789598854, 1.0026832238347456, 1.0026770989119393, 1.0026709999034775,
+        1.0026649218636128, 1.0026588601272974, 1.002652811155386, 1.0026467731348263,
+        1.0026407462325744, 1.0026347324691558, 1.0026287352488064, 1.0026227586450411,
+        1.002616806582367, 1.0026108820696338, 1.0026049866264373, 1.0025991200043618,
+        1.0025932802476927, 1.0025874640744057, 1.002581667499529, 1.0025758865800158,
+        1.002570118140418, 1.0025643603450332, 1.0025586130130562, 1.0025528776223878,
+        1.0025471570058857, 1.0025414548002145, 1.0025357747518053, 1.0025301200090673,
+        1.0025244925306727, 1.0025188927168511, 1.0025133193287012, 1.0025077697074272,
+        1.0025022402508799, 1.0024967270587368, 1.0024912266281425, 1.0024857364737731,
+        1.002480255561187, 1.002474784476892, 1.0024693253065227, 1.0024638812449032,
+        1.0024584560094605, 1.0024530531627438, 1.0024476754650617, 1.0024423243718052,
+        1.002436999763421, 1.0024316999541796, 1.0024264219763601, 1.0024211620881212,
+        1.0024159164145892, 1.0024106816092193, 1.00240545542002, 1.002400237062917,
+        1.0023950273390083, 1.0023898284775263, 1.002384643733969, 1.0023794768148397,
+        1.0023743312294833, 1.0023692096809207, 1.0023641135995351, 1.0023590428977145,
+        1.0023539959848027, 1.0023489700367523, 1.0023439614716059, 1.002338966547617,
+        1.002333981981234, 1.0023290054803713, 1.0023240361043402, 1.0023190743925001,
+        1.0023141222436154, 1.0023091825701493, 1.0023042587890743, 1.0022993542370555,
+        1.0022944716088515, 1.0022896125119856, 1.0022847772094492, 1.0022799645894416,
+        1.0022751723625236, 1.0022703974488385, 1.0022656364873608, 1.0022608863805176,
+        1.0022561447837322, 1.002251410460744, 1.0022466834496315, 1.0022419650170387,
+        1.0022372574134806, 1.002232563474896, 1.0022278861395209, 1.0022232279611003,
+        1.0022185906976522, 1.0022139750403622, 1.0022093805224046, 1.0022048056169952,
+        1.002200248002985, 1.0021957049498433, 1.0021911737561882, 1.002186652169581,
+        1.002182138720877, 1.0021776329225163, 1.0021731353038723, 1.0021686472839049,
+        1.0021641709074354, 1.0021597084921134, 1.0021552622455778, 1.0021508339145937,
+        1.0021464245203606, 1.002142034218177, 1.0021376622983353, 1.002133307322034,
+        1.0021289673651068, 1.0021246403266664, 1.0021203242515837, 1.00211601761605,
+        1.002111719533716, 1.0021074298544388, 1.0021031491457733, 1.0020988785660125,
+        1.002094619653856, 1.002090374071189, 1.0020861433405912, 1.0020819286175406,
+        1.0020777305296358, 1.0020735491030173, 1.002069383781738, 1.0020652335315512],
+    [0.0003729844814207124, 0.0011192193047603698, 0.0018662522581848044,
+        0.0026146167805112595, 0.003364848270477302, 0.004117485067008013,
+        0.0048730690920542235, 0.005632146813105256, 0.006395270035216434,
+        0.007162996767511551, 0.00793589210057287, 0.00871452912868112,
+        0.009499489831936863, 0.010291366057852832, 0.01109076046652801,
+        0.011898287551713956, 0.012714574671792038, 0.013540263119467537,
+        0.014376009249381509, 0.015222485612509178, 0.0160803821915141,
+        0.016950407635178008, 0.01783329058035361, 0.0187297810275984, 0.019640651780278937,
+        0.020566699946049, 0.021508748536877193, 0.0224676481254831, 0.023444278613806293,
+        0.02443955106786768, 0.025454409695384386, 0.02648983389313172,
+        0.02754684044520045, 0.0286264858285183, 0.029729868675501953, 0.030858132368592677,
+        0.03201246781433417, 0.03319411637285994, 0.03440437299785852, 0.03564458955689713,
+        0.03691617839524412, 0.038220616114731217, 0.03955944763227161,
+        0.04093429049746849, 0.042346839539296334, 0.04379887179909808,
+        0.04529225188183761, 0.04682893762172542, 0.04841098624181379, 0.05004056091660027,
+        0.051719937863049036, 0.05345151397930381, 0.05523781505949799,
+        0.057081504679926856, 0.05898539379390667, 0.06095245108999981,
+        0.06298581424071545, 0.06508880205497881, 0.0672649276945054, 0.06951791301650435,
+        0.07185170416867814, 0.07427048857949606, 0.07677871348033323, 0.07938110612200941,
+        0.08208269587236096, 0.08488883841722861, 0.08780524227817164, 0.09083799792241994,
+        0.09399360978664549, 0.09727903153096111, 0.10070170492440104, 0.10426960281154224,
+        0.1079912766943181, 0.11187590946768547, 0.11593337403840771, 0.12017429855864065,
+        0.1246101392456622, 0.12925326176910856, 0.13411703244768003, 0.1392159207358812,
+        0.1445656145974464, 0.15018315078576425, 0.15608706236803607, 0.1622975462209878,
+        0.16883665382996346, 0.1757285093020924, 0.18299955937490767, 0.19067886112891258,
+        0.1987984143434055, 0.20739354713778824, 0.21650336522101635, 0.22617127787344282,
+        0.23644561680932052, 0.2473803683223042, 0.2590360444949693, 0.27148072669013995,
+        0.28479132380382527, 0.29905510142909036, 0.3143715554983706, 0.3308547295009379,
+        0.34863610977892384, 0.36786828504439684, 0.38872963198313953, 0.41143040431097866,
+        0.43622078042844803, 0.46340171170865635, 0.49333988841524035, 0.5264889639366823,
+        0.5634206770260783, 0.6048724085967322, 0.6518237236983494, 0.7056281202394288,
+        0.7682610737808423, 0.8428491893382639, 0.9350284726935845, 1.057659431787342,
+        1.2606640597978176, 0.9370989666660237, 1.3996016836122358, 2.214026136988973,
+        0.17879251572048932, 1.325279462435783, 1.9808815216581572, 3.002581752242233,
+        1.4781582946016236, 1.0992788783714627, 2.5156201080254004, 5.02872439033541,
+        6.511405047916822, 3.7557713811330453, 1.7301317564091783, 1.4174047667823368,
+        1.518019997988656, 1.7011193040077468, 2.0066551951261142, 2.4960872008815356,
+        2.690280099676185, 1.7934007461360537, 1.1486968295003923, 0.9786854251602504,
+        1.0634018829389313, 1.2996158217999136, 1.6848867625810486, 2.190755304960999,
+        2.343817962170848, 1.803422748948534, 1.2720000745536761, 0.9784650564676622,
+        0.8863338463972367, 0.9666416197038336, 1.2109428796002661, 1.6172289854590278,
+        2.0319933092111655, 1.9917007597871148, 1.5826567499747455, 1.2133691408473812,
+        0.9682055743696157, 0.9578135817552239, 1.0464612828150521, 1.1812899333534872,
+        1.3328945199065139, 1.4446487091171747, 1.4713718271187592, 1.4210521736154633,
+        1.335198605674919, 1.2481219448095409, 1.176825799432361, 1.1279316527629495,
+        1.1040692066531612, 1.1064137983336513, 1.134126026822963, 1.1815065592018796,
+        1.2350093550731456, 1.2753089580259014, 1.28751041866999, 1.2705369058845735,
+        1.23446468342963, 1.1911135502828816, 1.1485560337209055, 1.1107867643653444,
+        1.0792034739710628, 1.053923899046944, 1.0345587961311697, 1.0205878271796625,
+        1.0115175951653967, 1.0069347439609035, 1.0065128252492954, 1.0100003135368072,
+        1.0172006565901477, 1.0279464845783093, 1.042064930180835, 1.0593273257647717,
+        1.0793737651698476, 1.1016026396325567, 1.1250225882948288, 1.148090575737718,
+        1.1686192435343905, 1.183923403802198, 1.1914083378034412, 1.1896036833131203,
+        1.1791561812630758, 1.1629647445137914, 1.1451364252108496, 1.129442388493985,
+        1.1182663110704634, 1.1124104732060982, 1.1114627680203648, 1.114295777197372,
+        1.1194647807380735, 1.1254670628555237, 1.1309112068477403, 1.13465077651266,
+        1.1359073917670692, 1.1343719105763796, 1.1302476198640334, 1.1242001232381786,
+        1.1172076318160222, 1.1103463538157947, 1.1045719889017653, 1.100554140624075,
+        1.0985926902307241, 1.0986141874126922, 1.1002279866313875, 1.1028189135379396,
+        1.105658889618244, 1.1080256992433966, 1.1093180992691756, 1.109153068008928,
+        1.1074275650516825, 1.1043291869231193, 1.1002900880694702, 1.0958935553589881,
+        1.0917557209174011, 1.0884099284439772, 1.0862170222164578, 1.085315006768841,
+        1.085611311720336, 1.0868135611733396, 1.0884906237453185, 1.0901533446317468,
+        1.0913423216139597, 1.0917083070961715, 1.0910706564902686, 1.089442380156375,
+        1.0870171886103521, 1.08412270727115, 1.0811516476784524, 1.0784865121642333,
+        1.0764327025962492, 1.0751709883034857, 1.0747352044827279, 1.0750163256711307,
+        1.0757902174205922, 1.0767632752753789, 1.0776276611719622, 1.078116223129767,
+        1.0780471021153404, 1.0773500512296064, 1.0760704845277094, 1.07435220846798,
+        1.0724041570950105, 1.0704590206507407, 1.0687320357042642, 1.0673868453703732,
+        1.0665130830528515, 1.0661179067601254, 1.0661314780130267, 1.0664244207457805,
+        1.0668336413700912, 1.0671917005268403, 1.0673544882986457, 1.0672225115467595,
+        1.0667526368137557, 1.0659592742368411, 1.0649061340198016, 1.0636912659918845,
+        1.0624288026184563, 1.0612307051514198, 1.0601911362300016, 1.0593751802032167,
+        1.058812748470235, 1.0584977525878767, 1.0583920179215645, 1.0584329313598908,
+        1.05854347572616, 1.0586431383292831, 1.0586582299373275, 1.058530412616453,
+        1.0582226500176835, 1.057722256128454, 1.057041118160309, 1.056213434632197,
+        1.0552914296918934, 1.054339521411319, 1.0534274030709885, 1.0526225039257784,
+        1.0519823610900891, 1.051547548024856, 1.0513359216612492, 1.0513390005509737,
+        1.0515212010321575, 1.0518223930423107, 1.0521637965919852, 1.052456689837473,
+        1.0526128592931592, 1.0525553337957765, 1.052227824218151, 1.051601489684112,
+        1.0506781258546327, 1.0494895005101688, 1.0480931891785978, 1.046565750338148,
+        1.0449943464112808, 1.0434679556689248, 1.0420691798863304, 1.04086740776269,
+        1.0399138160892125, 1.039238429600976, 1.038849241409924, 1.0387332247154444,
+        1.0388589396380488, 1.039180352147457, 1.0396414339073414, 1.0401811035042472,
+        1.0407381005011256, 1.0412554480284137, 1.0416842441944967, 1.0419866099946675,
+        1.0421376953623913, 1.0421266965810274, 1.0419568694123276, 1.0416445446884495,
+        1.0412171828019345, 1.0407105534185117, 1.0401652004296842, 1.0396224416687796,
+        1.0391202409537483, 1.0386893554161203, 1.0383501848257684, 1.0381107191093786,
+        1.0379658910277407, 1.037898496552887, 1.0378816571023006, 1.0378825847754973,
+        1.0378672023514954, 1.037805000313621, 1.0376734229993525, 1.0374610980258188,
+        1.0371693715364083, 1.0368118721559678, 1.0364121543767837, 1.035999802260836,
+        1.0356056386523877, 1.035256831313709, 1.0349726917808628, 1.0347618321308063,
+        1.034621109672019, 1.0345364931412695, 1.0344856732789376, 1.0344419611123692,
+        1.034378810189242, 1.0342741985189914, 1.034114133505203, 1.0338947000564247,
+        1.0336223344264726, 1.0333123261169483, 1.032985864704336, 1.032666195874061,
+        1.0323745858411952, 1.0321267966074266, 1.0319306545587628, 1.0317850816044116,
+        1.0316806933780553, 1.0316017985223978, 1.0315293998542576, 1.031444638688349,
+        1.0313320635545713, 1.0311821545265842, 1.0309926858085496, 1.0307687336079938,
+        1.0305213896696883, 1.0302654731797212, 1.0300167009102137, 1.0297888491405138,
+        1.029591413526789, 1.0294281569881176, 1.02929675769746, 1.029189564009902,
+        1.0290952667184263, 1.029001144047687, 1.0288954464626345, 1.0287694807794963,
+        1.0286190262989539, 1.028444854714034, 1.0282523023318746, 1.0280500222329116,
+        1.0278481904143022, 1.0276565270942684, 1.0274825091734017, 1.0273300943704269,
+        1.0271991666588072, 1.0270857697436984, 1.0269830474824246, 1.0268826835616136,
+        1.0267765489863432, 1.0266582388274264, 1.0265242128829948, 1.0263743408942587,
+        1.0262117739722876, 1.0260421954047674, 1.0258726199424621, 1.0257099890935768,
+        1.0255598376308521, 1.0254252809660087, 1.025306502061699, 1.0252008156781012,
+        1.0251032767818382, 1.025007699308373, 1.0249078789637864, 1.0247987818080797,
+        1.024677473988108, 1.0245436237289995, 1.024399493068495, 1.0242494364498673,
+        1.0240990164787929, 1.0239539160649906, 1.0238188585228618, 1.0236967384611737,
+        1.0235881199942416, 1.0234911852390283, 1.0234021298154927, 1.023315919239945,
+        1.023227255542389, 1.02313156838861, 1.0230258452282985, 1.0229091498124843,
+        1.0227827406488508, 1.0226497782404536, 1.022514687194777, 1.0223823017793874,
+        1.0222569598783204, 1.0221417147177951, 1.0220378066523061, 1.0219444850051165,
+        1.021859202948968, 1.0217781393142376, 1.0216969425085631, 1.021611553702809,
+        1.021518955479478, 1.021417709688755, 1.0213081905108883, 1.0211924773150955,
+        1.0210739355118652, 1.0209565701891856, 1.020844276572397, 1.020740126588987,
+        1.0206458201620283, 1.0205613962539444, 1.0204852490741005, 1.02041443870315,
+        1.0203452328739482, 1.0202737769907262, 1.0201967693636622, 1.020112021179527,
+        1.0200188048978658, 1.019917935613832, 1.0198115795448914, 1.019702832827366,
+        1.019595153298879, 1.0194917510603179, 1.0193950468418496, 1.0193062908282902,
+        1.0192254024239693, 1.0191510498615852, 1.0190809453294145, 1.019012294102357,
+        1.0189423113610303, 1.0188687119307862, 1.0187900870114102, 1.018706105905652,
+        1.0186175149105114, 1.0185259432999014, 1.0184335606557735, 1.0183426545723413,
+        1.01825520888192, 1.0181725586542365, 1.018095180729594, 1.0180226512587358,
+        1.0179537699952481, 1.0178868208079792, 1.0178199144292872, 1.0177513467854176,
+        1.017679906254546, 1.0176050754018549, 1.0175270944649986, 1.017446880755593,
+        1.0173658250322286, 1.017285507813113, 1.0172073916804738, 1.0171325478391833,
+        1.0170614665801767, 1.0169939838917073, 1.016929333790623, 1.0168663123410586,
+        1.0168035191163853, 1.0167396286089663, 1.0166736399977756, 1.0166050592261773,
+        1.016533981221816, 1.0164610595149886, 1.016387371733162, 1.0163142084974333,
+        1.0162428266757555, 1.0161742134667167, 1.0161089046385916, 1.016046889280385,
+        1.0159876168652866, 1.0159301034355366, 1.0158731157735246, 1.0158153987180822,
+        1.0157559036687356, 1.0156939769151707, 1.0156294744531893, 1.015562783791829,
+        1.0154947502992315, 1.0154265227398742, 1.015359346756332, 1.015294343707183,
+        1.015232314100058, 1.0151735997271498, 1.0151180276232383, 1.0150649442117634,
+        1.015013332156233, 1.0149619882672725, 1.0149097307319268, 1.0148555995646926,
+        1.014799016132736, 1.0147398753806225, 1.0146785564767482, 1.0146158518227064,
+        1.0145528282006957, 1.0144906449258484, 1.0144303604169758, 1.0143727596472938,
+        1.0143182305085365, 1.0142667081639394, 1.014217694646541, 1.0141703483506908,
+        1.0141236267845337, 1.0140764578087762, 1.0140279108010146, 1.0139773402078696,
+        1.0139244794166127, 1.0138694717130303, 1.0138128356997105, 1.013755373114902,
+        1.0136980357986975, 1.013641774261275, 1.013587392161268, 1.013535428916476,
+        1.013486087202582, 1.013439214312997, 1.0133943376199779, 1.0133507461194096,
+        1.0133076035146877, 1.0132640743982555, 1.013219444248099, 1.0131732160866203,
+        1.0131251712089473, 1.01307538749287, 1.0130242153998101, 1.0129722178212124,
+        1.0129200845550794, 1.0128685348509194, 1.0128182219403206, 1.0127696519331737,
+        1.0127231263548129, 1.0126787135627433, 1.0126362500084554, 1.0125953684402205,
+        1.0125555471676062, 1.012516172711804, 1.0124766076119773, 1.0124362557136204,
+        1.0123946186533235, 1.012351339123851, 1.0123062285005662, 1.0122592782405553,
+        1.01221065593245, 1.0121606878959453, 1.012109830824977, 1.012058635230421,
+        1.0120077034933572, 1.011957645306378, 1.0119090332378573, 1.0118623611265107,
+        1.0118180079695123, 1.0117762098370011, 1.0117370420456426, 1.0117004132875334,
+        1.0116660726130513, 1.0116336291396515, 1.011602583194631, 1.0115723664365333,
+        1.0115423874999174, 1.0115120790274592, 1.0114809417124118, 1.0114485812330956,
+        1.0114147347054052, 1.0113792844214113, 1.0113422580334044, 1.0113038157980339,
+        1.011264226823618, 1.0112238372993338, 1.0111830343120345, 1.0111422090254452,
+        1.0111017227269967, 1.0110618786190129, 1.011022901364949, 1.010984925435714,
+        1.0109479923668927, 1.0109120562381118, 1.0108769960833999, 1.0108426335569096,
+        1.0108087539935655, 1.0107751289789013, 1.0107415386258158, 1.010707791906196,
+        1.010673743575853, 1.0106393064583326, 1.010604458129863, 1.0105692413964307,
+        1.0105337583914957, 1.0104981586495794, 1.0104626220995794, 1.0104273385159814,
+        1.010392485485703, 1.0103582073003756, 1.0103245972827202, 1.0102916858403426,
+        1.0102594359931754, 1.0102277472774805, 1.0101964678800075, 1.0101654137370124,
+        1.0101343923072985, 1.010103227961037, 1.0100717855550252, 1.010039988875103,
+        1.0100078312321896, 1.0099753765343373, 1.0099427504863299, 1.0099101229979346,
+        1.0098776841954638, 1.009845617421041, 1.0098140731070508, 1.0097831473388297,
+        1.0097528682655228, 1.009723192377595, 1.0096940112090946, 1.0096651674659776,
+        1.0096364781687257, 1.0096077613480372, 1.00957886231062, 1.0095496755792186,
+        1.0095201592927312, 1.0094903400203554, 1.0094603074136546, 1.0094301996616772,
+        1.009400182086592, 1.0093704222104334, 1.0093410650895072, 1.0093122125893186,
+        1.0092839095908293, 1.0092561389965498, 1.0092288260267552, 1.009201850881798,
+        1.0091750676153057, 1.0091483261995449, 1.009121494389473, 1.0090944761469562,
+        1.009067224028295, 1.00903974394861, 1.0090120919458165, 1.0089843637799476,
+        1.0089566792343725, 1.0089291636842448, 1.0089019297739426, 1.0088750618787703,
+        1.0088486054667047, 1.008822562630776, 1.0087968940777372, 1.0087715268923312,
+        1.0087463665943048, 1.008721311477847, 1.008696267031413, 1.0086711583838714,
+        1.0086459391628984, 1.0086205957937984, 1.0085951469979464, 1.0085696389525485,
+        1.008544137144684, 1.0085187163197042, 1.0084934500529419, 1.008468401370193,
+        1.0084436155476537, 1.0084191158019102, 1.0083949021127239, 1.0083709529804283,
+        1.0083472295669744, 1.0083236814434726, 1.008300253080199, 1.0082768902569355,
+        1.0082535457118158, 1.0082301835460001, 1.0082067821174032, 1.0081833353537932,
+        1.0081598525701307, 1.0081363569770854, 1.0081128831208854, 1.0080894735116757,
+        1.008066174696184, 1.0080430330267798, 1.0080200903838232, 1.0079973801240236,
+        1.0079749235480642, 1.007952727193572, 1.0079307812491385, 1.00790905933801,
+        1.0078875198287371, 1.0078661086963843, 1.0078447637933672, 1.0078234202145273,
+        1.0078020162825385, 1.0077804995645903, 1.007758832281696, 1.007736995501968,
+        1.007714991620265, 1.0076928448073252, 1.0076705993391548, 1.007648315960947,
+        1.007626066665498, 1.007603928442652, 1.007581976660309, 1.007560278756816,
+        1.0075388888599512, 1.007517843812669, 1.0074971609028869, 1.0074768373924248,
+        1.0074568517472124, 1.007437166311581, 1.0074177310602055, 1.0073984880088724,
+        1.0073793758663727, 1.0073603345534752, 1.0073413092851884, 1.0073222539923883,
+        1.0073031339342613, 1.0072839274146888, 1.0072646265612346, 1.0072452371583298,
+        1.0072257775542188, 1.007206276693294, 1.0071867713688794, 1.0071673028488457,
+        1.0071479130944496, 1.0071286408617668, 1.0071095180309206, 1.0070905665353194,
+        1.0070717962470062, 1.0070532041072497, 1.0070347746731354, 1.007016482091637,
+        1.006998293331122, 1.006980172322697, 1.0069620845186622, 1.0069440012890483,
+        1.0069259035688578, 1.0069077842460332, 1.0068896489374128, 1.006871515017869,
+        1.0068534090154844, 1.0068353627260378, 1.0068174085952437, 1.0067995750346048,
+        1.0067818823557495, 1.0067643399225235, 1.0067469449412374, 1.006729683063365,
+        1.006712530699467, 1.0066954586815413, 1.0066784367047108, 1.0066614378617045,
+        1.0066444425737764, 1.0066274413216543, 1.0066104357736163, 1.0065934381638015,
+        1.0065764690508816, 1.0065595538406542, 1.0065427186451381, 1.0065259861455562,
+        1.0065093721128748, 1.0064928831208844, 1.0064765157840854, 1.0064602576000652,
+        1.0064440892158872, 1.0064279877126898, 1.0064119303487515, 1.0063958981422119,
+        1.0063798787184297, 1.0063638679837914, 1.0063478703930644, 1.0063318978153415,
+        1.006315967233919, 1.006300097700174, 1.0062843070708336, 1.0062686090760915,
+        1.0062530111921246, 1.006237513640982, 1.0062221096409043, 1.0062067868162168,
+        1.0061915294843293, 1.0061763214000028, 1.0061611484752355, 1.0061460010151808,
+        1.0061308751099103, 1.0061157729791075, 1.0061007022532804, 1.0060856743577926,
+        1.0060707023138502, 1.0060557983590996, 1.0060409718065995, 1.006026227504019,
+        1.006011565137426, 1.0059969794681234, 1.0059824614251502, 1.0059679998293196,
+        1.005953583422092, 1.005939202830509, 1.0059248521234294, 1.005910529698091,
+        1.0058962383628829, 1.0058819846287816, 1.0058677773616345, 1.005853626056016,
+        1.0058395390505819, 1.0058255220056067, 1.0058115769073805, 1.0057977017626816,
+        1.005783891019093, 1.005770136616455, 1.005756429464739, 1.0057427610727612,
+        1.0057291250321534, 1.0057155180940482, 1.0057019406548322, 1.0056883965769636,
+        1.0056748923910843, 1.005661436034855, 1.0056480353630974, 1.0056346966995144,
+        1.0056214236872574, 1.0056082166372295, 1.0055950724806686, 1.0055819853232713,
+        1.005568947491626, 1.0055559508777476, 1.0055429883385798, 1.0055300549023256,
+        1.0055171485723342, 1.005504270594206, 1.0054914251488707, 1.005478618536037,
+        1.0054658580007338, 1.0054531504153184, 1.0054405010505456, 1.0054279126491446,
+        1.0054153849581733, 1.0054029147931576, 1.005390496612636, 1.0053781234930728,
+        1.0053657883264997, 1.0053534850280146, 1.005341209542882, 1.0053289604821782,
+        1.0053167392839109, 1.0053045498811413, 1.0052923979444428, 1.0052802898383146,
+        1.0052682314776669, 1.0052562272836447, 1.0052442794165348, 1.005232387411663,
+        1.0052205482719414, 1.0052087569909236, 1.0051970074068646, 1.0051852932339722,
+        1.0051736090904884, 1.0051619513484589, 1.005150318665201, 1.0051387121147253,
+        1.0051271349079953, 1.005115591761542, 1.0051040880321835, 1.0050926287720605,
+        1.005081217867013, 1.0050698574019172, 1.0050585473532108, 1.0050472856495476,
+        1.0050360685771733, 1.0050248914484168, 1.0050137494094036, 1.0050026382436539,
+        1.0049915550340607, 1.004980498575104, 1.0049694694741984, 1.0049584699369052,
+        1.0049475032856416, 1.004936573305701, 1.0049256835388711, 1.0049148366494527,
+        1.0049040339701867, 1.004893275300186, 1.0048825589802532, 1.0048718822214893,
+        1.004861241619635, 1.0048506337574479, 1.0048400557855228, 1.0048295058797356,
+        1.0048189834988448, 1.004808489403807, 1.0047980254438305, 1.0047875941553726,
+        1.004777198251877, 1.0047668400989718, 1.0047565212693925, 1.004746242254792,
+        1.004736002381343, 1.0047257999383516, 1.0047156324908817, 1.00470549731539,
+        1.0046953918770545, 1.0046853142621612, 1.0046752634890754, 1.0046652396447893,
+        1.0046552438262986, 1.0046452779012693, 1.0046353441342135, 1.0046254447473388,
+        1.0046155814953959, 1.0046057553298828, 1.0045959662107316, 1.0045862130966052,
+        1.0045764941129138, 1.0045668068655134, 1.0045571488430332, 1.0045475178362213,
+        1.0045379123008658, 1.0045283316017952, 1.004518776097049, 1.0045092470495582,
+        1.004499746383607, 1.0044902763297785, 1.0044808390204991, 1.004471436105838,
+        1.0044620684546377, 1.0044527359905777, 1.0044434376891345, 1.0044341717338274,
+        1.004424935803409, 1.0044157274401544, 1.0044065444367802, 1.0043973851775116,
+        1.004388248877656, 1.0043791356838778, 1.0043700466210879, 1.0043609833973426,
+        1.0043519481011534, 1.0043429428423798, 1.0043339693959108, 1.0043250289054242,
+        1.004316121693473, 1.0043072472058028, 1.0042984040956038, 1.0042895904308633,
+        1.004280803988921, 1.0042720425895686, 1.0042633044134461, 1.0042545882565097,
+        1.00424589368299, 1.004237221056377, 1.0042285714476376, 1.0042199464388544,
+        1.0042113478558878, 1.0042027774731503, 1.0041942367360597, 1.004185726542072,
+        1.0041772471105357, 1.0041687979568774, 1.0041603779703285, 1.0041519855791263],
+    [7.09744670677872e-05, 0.00021300389777849425, 0.0003552750336797058,
+        0.0004979496396749049, 0.0006411904117735231, 0.0007851613909321921,
+        0.0009300283164879005, 0.0010759590458060326, 0.0012231239477622905,
+        0.0013716963181198674, 0.0015218528059926838, 0.0016737738594023873,
+        0.0018276441748733586, 0.001983653179796104, 0.002141995522751791,
+        0.0023028715955578376, 0.0024664880760458777, 0.002633058499286045,
+        0.002802803863428113, 0.0029759532622813303, 0.0031527445663895575,
+        0.003333425134838397, 0.0035182525789845326, 0.003707495574782499,
+        0.0039014347295670297, 0.004100363507264426, 0.004304589224472457,
+        0.0045144341136333, 0.004730236471025892, 0.004952351886073164,
+        0.005181154575924329, 0.005417038817167124, 0.005660420501650166,
+        0.005911738816675629, 0.006171458072151321, 0.0064400696815522535,
+        0.006718094322068663, 0.007006084284388452, 0.007304626043544835,
+        0.007614343064332419, 0.007935898880335555, 0.008270000466547384,
+        0.008617401952610628, 0.008978908706970797, 0.009355381850788377,
+        0.009747743237486641, 0.010156980987522594, 0.010584155614062367,
+        0.01103040686219221, 0.011496961323718, 0.011985140964009306, 0.012496372687110912,
+        0.013032199089628218, 0.013594290600887597, 0.014184459223759736,
+        0.014804674136325899, 0.015457079488442896, 0.016144014755725432,
+        0.016868038139395875, 0.017631953571105537, 0.018438842030413228,
+        0.019292098053812906, 0.020195472525549953, 0.021153123127295285,
+        0.022169674198282318, 0.023250288257298097, 0.024400752087791452,
+        0.02562758119744392, 0.026938147701964586, 0.02834083837955096,
+        0.029845252075419975, 0.03146244909822004, 0.03320527030740534,
+        0.03508875104903793, 0.03713066648616254, 0.03935226238868119, 0.041779253392123024,
+        0.044443216191268585, 0.047383581855418605, 0.05065056532591917,
+        0.05430961349041195, 0.05844841751602815, 0.06318847148137087, 0.06870517931255382,
+        0.07526524305834521, 0.08330235236922322, 0.09358871276359827, 0.10769062214067467,
+        0.12951416536731641, 0.17355306997154912, 0.5308904622978109, 0.16824000548556975,
+        0.12427293373827317, 0.10797545152769426, 0.10008460267590577, 0.09614385579618968,
+        0.094523909749073, 0.09449147861590926, 0.09568182883767273, 0.09791105448475117,
+        0.10109794399240787, 0.10522865901942821, 0.11034095701273643, 0.11651893085398646,
+        0.12389477175359266, 0.13265670469999155, 0.143064018738161, 0.155472000402092,
+        0.17037248212490405, 0.18846118081099977, 0.21075456342839938, 0.23880607679207988,
+        0.27514301559221477, 0.3242647547310634, 0.3953793976077431, 0.5125125020590762,
+        0.7825777319572571, 3.755752653720154, 0.6130238071265707, 2.0038324235182907,
+        1.7966683773617411, 0.489276423461725, 0.5681455484193783, 1.645469342337874,
+        2.6391577981983634, 1.290482360614598, 0.8266623692872099, 0.6486650029294035,
+        0.8067018461439633, 1.6226534240803259, 1.6444468508405699, 1.2430590781299267,
+        1.0534849646569406, 0.9805165736689616, 0.9964704994790582, 1.1309390194403162,
+        1.2953379332275634, 1.1366672611523716, 0.9949313965565333, 0.9665725311465813,
+        1.0088697216944789, 1.1129665716883443, 1.2901188997862794, 1.5095481495872907,
+        1.4827100472993031, 1.1041193077846867, 0.8362982225595079, 0.7639941078454111,
+        0.8164733741323419, 0.9545515691326313, 1.1768801938217415, 1.484241818334998,
+        1.7361007143454568, 1.579921206710706, 1.172230881216961, 0.8597183389944386,
+        0.7059881248858814, 0.8038664282844395, 0.9351694482554926, 1.0870768640555255,
+        1.2333654616969643, 1.3248802700084557, 1.3276639572176514, 1.258438823896954,
+        1.161220511681095, 1.0693124146969666, 0.9983346493732207, 0.9541147268024985,
+        0.9388984129168063, 0.9533877963758052, 0.9956901061799435, 1.0582713893742315,
+        1.1252952849244586, 1.175475624939612, 1.193062491082201, 1.1773998723103694,
+        1.1397188493988264, 1.093037022082418, 1.0463126409700028, 1.004082608765184,
+        0.9680382743259438, 0.9384424067803919, 0.914973427422746, 0.8971451733456922,
+        0.884490232475867, 0.8766272226938088, 0.8732757582890902, 0.8742496693916285,
+        0.8794412708799955, 0.8887997597433626, 0.9023007638679906, 0.9198992812232972,
+        0.9414537752641925, 0.9666060555403354, 0.9946048665314177, 1.0240832836450913,
+        1.052860590188974, 1.0779445484966463, 1.095991721076949, 1.1043476281606295,
+        1.1022929660235683, 1.0916347073751764, 1.076065980044646, 1.0597166853884734,
+        1.0458733601599681, 1.036431279552166, 1.0319764174400483, 1.032137636780714,
+        1.035947312778748, 1.0421175130823999, 1.0492411392346954, 1.0559579204279967,
+        1.0611134326076888, 1.0639096818405083, 1.0640171790528699, 1.0616082369077542,
+        1.0572886642532933, 1.0519414839691061, 1.046528590093062, 1.0419050073942255,
+        1.0386849459529572, 1.0371737535967278, 1.0373603068306139, 1.0389561869078479,
+        1.0414682339089179, 1.0442936060957988, 1.0468266269575026, 1.0485634792360075,
+        1.0491869235343725, 1.0486132353270503, 1.0469904956987592, 1.0446498894486818,
+        1.0420243447827908, 1.0395559269252035, 1.0376127008073286, 1.0364294928714557,
+        1.0360791921885648, 1.0364749425710647, 1.037399503551397, 1.0385553076427505,
+        1.0396262730808503, 1.040340171766957, 1.0405193834803887, 1.040109614510392,
+        1.0391810969647164, 1.0379036609125947, 1.0365033953758254, 1.0352121347124978,
+        1.03422098166693, 1.0336463843505825, 1.0335135066803203, 1.0337580241779878,
+        1.0342445192471423, 1.0347972739561795, 1.0352373623844133, 1.0354187570377027,
+        1.0352562069129208, 1.0347393337214743, 1.0339305726658812, 1.032948393932425,
+        1.0319404713055658, 1.031053174802809, 1.0304037112281133, 1.0300598402325016,
+        1.0300300567975327, 1.0302650398681081, 1.03066931776118, 1.0311205782805517,
+        1.0314929102065211, 1.0316796504271144, 1.031611637092588, 1.031267649890205,
+        1.0306755165173038, 1.029904360549064, 1.0290502086924445, 1.0282182211534743,
+        1.027504997489467, 1.026983877762038, 1.0266952079909257, 1.026642475082734,
+        1.026794243739258, 1.0270910376046256, 1.0274557259603865, 1.0278056230705588,
+        1.0280644103575143, 1.0281721775596167, 1.0280923305258214, 1.0278147448724722,
+        1.0273552140102635, 1.0267517938205282, 1.0260589763467771, 1.025340703293165,
+        1.024663107396337, 1.0240876427288836, 1.0236650342786917, 1.0234303135241654,
+        1.0233991359570793, 1.0235655812362474, 1.023901669479929, 1.024358828629974,
+        1.024871465614523, 1.025362601143415, 1.0257512358999552, 1.0259607789466891,
+        1.0259275746109175, 1.0256084075754721, 1.0249859172994946, 1.0240711265375537,
+        1.0229027318185806, 1.0215433115228651, 1.0200730594145462, 1.0185819534984066,
+        1.0171613802080954, 1.0158961668943853, 1.014857785000441, 1.014099238308944,
+        1.0136519011929221, 1.013524355191587, 1.0137031012197815, 1.0141548978900166,
+        1.01483038745038, 1.0156686152142131, 1.0166020256379573, 1.0175615299034866,
+        1.0184812851964147, 1.0193028979085603, 1.0199788480315073, 1.0204750127867914,
+        1.0207722293554389, 1.0208668732208614, 1.0207704454534794, 1.0205081739933228,
+        1.020116658660989, 1.0196406405822118, 1.0191290564584203, 1.0186306365062179,
+        1.018189402096178, 1.017840491700921, 1.0176067711521386, 1.01749665306138,
+        1.0175034560695433, 1.0176064812612762, 1.0177737824422752, 1.0179663791760991,
+        1.0181434359343877, 1.0182677454488245, 1.018310751134078, 1.0182563578785182,
+        1.0181029290797934, 1.017863137449781, 1.0175616829297922, 1.0172312455556582,
+        1.01690733238476, 1.0166228492349487, 1.0164032526402322, 1.0162630195871414,
+        1.0162039417146351, 1.0162154501769611, 1.0162768549976275, 1.0163610849815958,
+        1.0164392837634708, 1.016485490439407, 1.0164806336120438, 1.0164152004329101,
+        1.0162901871599928, 1.0161162498945808, 1.0159112924029672, 1.015696989923518,
+        1.0154949057936598, 1.015322888852059, 1.0151923483021124, 1.0151068153449019,
+        1.0150619566127201, 1.015046946866944, 1.0150468794224172, 1.0150457281832634,
+        1.0150293010501956, 1.0149876526986994, 1.014916549373385, 1.0148177746018714,
+        1.0146982927926245, 1.0145685013452193, 1.0144399595620999, 1.0143230568418267,
+        1.0142250650096114, 1.0141489204487888, 1.0140929251230657, 1.0140513734182923,
+        1.014015937425829, 1.0139775070961716, 1.0139281067248398, 1.0138625079917452,
+        1.0137792314789145, 1.0136807583885359, 1.0135729353766736, 1.0134637149308174,
+        1.0133614995701736, 1.0132734266704548, 1.0132039312819452, 1.01315386040013,
+        1.013120299125716, 1.0130971300829272, 1.0130762084655065, 1.0130489210499347,
+        1.0130078285065889, 1.0129480784794578, 1.0128683241032896, 1.012770979677937,
+        1.012661773053478, 1.0125486876089058, 1.0124404994351808, 1.0123451862490804,
+        1.0122685016820714, 1.0122129709815997, 1.012177481170306, 1.0121575272125962,
+        1.0121460565514417, 1.0121347486172827, 1.0121154917448438, 1.0120817898561396,
+        1.0120298500238791, 1.0119591655617082, 1.0118725051855677, 1.0117753285095439,
+        1.0116747507350297, 1.0115782558957782, 1.0114923952941788, 1.0114217008106483,
+        1.0113679950857808, 1.0113302027600544, 1.0113046741917582, 1.0112859422348084,
+        1.0112677594908932, 1.0112442201429364, 1.0112107637491257, 1.0111648883466,
+        1.0111064603098012, 1.0110375865540926, 1.0109620956617296, 1.0108847430985777,
+        1.0108102996955086, 1.0107426951250431, 1.0106843686540639, 1.0106359333582802,
+        1.0105961970578705, 1.0105625156742855, 1.010531394872245, 1.0104992141858815,
+        1.0104629311866415, 1.0104206337783928, 1.0103718434913584, 1.0103175242918205,
+        1.0102598095092477, 1.0102015126795556, 1.0101455264704893, 1.0100942307585954,
+        1.0100490241621265, 1.0100100652688633, 1.0099762666172378, 1.0099455348287036,
+        1.0099152035659449, 1.0098825707405825, 1.0098454338195029, 1.0098025200098204,
+        1.009753730514214, 1.0097001552688074, 1.0096438591975812, 1.009587484370992,
+        1.0095337463427834, 1.009484921231241, 1.009442419861417, 1.0094065271346975,
+        1.0093763526552983, 1.0093499988190597, 1.009324912507555, 1.0092983534885511,
+        1.009267892425348, 1.0092318474508453, 1.0091895809864786, 1.009141605252674,
+        1.0090894805494235, 1.0090355281526058, 1.008982412595641, 1.0089326703007555,
+        1.0088882692752028, 1.0088502769586194, 1.0088186921741398, 1.008792466704025,
+        1.0087697079595048, 1.0087480226474241, 1.0087249377252012, 1.0086983232076843,
+        1.0086667432873202, 1.008629677043321, 1.008587574744619, 1.0085417456857761,
+        1.0084941031144805, 1.0084468158350588, 1.0084019304354348, 1.0083610306280149,
+        1.0083249909709455, 1.008293863378662, 1.0082669100642063, 1.0082427704633588,
+        1.00821972688564, 1.0081960179761382, 1.0081701430187948, 1.0081411043579107,
+        1.0081085486005683, 1.0080727870373496, 1.0080346980784851, 1.0079955353248649,
+        1.0079566805071027, 1.0079193883702098, 1.0078845696205214, 1.007852648882435,
+        1.007823519268081, 1.0077965966732416, 1.0077709587212622, 1.0077455386218839,
+        1.007719335571758, 1.007691602010147, 1.0076619740093982, 1.0076305229650644,
+        1.0075977221681072, 1.0075643378430323, 1.0075312678737753, 1.0074993603115314,
+        1.00746924642738, 1.0074412192846343, 1.0074151794842785, 1.007390656759475,
+        1.0073669019204707, 1.0073430308613747, 1.0073181931866875, 1.0072917340379086,
+        1.0072633194770801, 1.007233002855653, 1.007201220571707, 1.0071687184445313,
+        1.0071364222843213, 1.0071052759305308, 1.007076075434783, 1.007049328342982,
+        1.0070251622795543, 1.0070032982153505, 1.0069830925364567, 1.00696364030933,
+        1.006943921955449, 1.0069229685787262, 1.0069000185123107, 1.0068746395971657,
+        1.0068467978160516, 1.0068168620442828, 1.0067855452345431, 1.0067537925401397,
+        1.0067226350442837, 1.0066930326528574, 1.0066657306719646, 1.0066411516492388,
+        1.0066193378602069, 1.006599951504559, 1.0065823306515223, 1.0065655906789277,
+        1.0065487546282266, 1.0065308924075986, 1.0065112484841938, 1.0064893404609994,
+        1.0064650161185076, 1.006438463165443, 1.0064101729772408, 1.006380865924964,
+        1.0063513906318222, 1.006322612082414, 1.0062953037768732, 1.006270057264147,
+        1.006247218900846, 1.0062268592478554, 1.0062087758765244, 1.006192526186095,
+        1.0061774836489872, 1.006162908996056, 1.0061480272914542, 1.006132102478849,
+        1.0061145025072828, 1.00609475018624, 1.0060725570932159, 1.006047839842903,
+        1.0060207196099835, 1.005991506885043, 1.0059606740553264, 1.0059288186407802,
+        1.005896620023572, 1.0058647924241382, 1.005834036798882, 1.0058049943049827,
+        1.0057782039758483, 1.0057540672088838, 1.0057328214954782, 1.0057145254395745,
+        1.0056990564690187, 1.0056861217502364, 1.0056752817377637, 1.005665984642939,
+        1.005657609039246, 1.0056495109876777, 1.0056410715921884, 1.0056317408612994,
+        1.0056210741720175, 1.0056087584531799, 1.0055946263160822, 1.0055786576108798,
+        1.0055609691151257, 1.0055417941178586, 1.005521454437363, 1.0055003278435262,
+        1.0054788139423265, 1.0054573013647123, 1.0054361386637654, 1.0054156107552583,
+        1.0053959221257434, 1.0053771874468989, 1.0053594297137998, 1.0053425855787874,
+        1.0053265171694759, 1.0053110293388778, 1.0052958909803134, 1.005280858748956,
+        1.0052657012858615, 1.0052502218806614, 1.005234277489243, 1.005217792195186,
+        1.005200763602867, 1.00518326127853, 1.0051654171735616, 1.0051474088892995,
+        1.005129437557589, 1.0051117028801866, 1.005094378362204, 1.0050775898876978,
+        1.0050614004677456, 1.005045803256086, 1.0050307238559675, 1.0050160316758616,
+        1.0050015588129309, 1.0049871238460257, 1.004972557180011, 1.0049577243262477,
+        1.004942543784197, 1.0049269969756915, 1.0049111288645791, 1.0048950392916443,
+        1.004878866452007, 1.0048627651200728, 1.0048468829991875, 1.0048313388170482,
+        1.0048162054658112, 1.0048015006511961, 1.0047871863036073, 1.0047731766127095,
+        1.0047593531988992, 1.0047455848460014, 1.0047317485602978, 1.0047177485909178,
+        1.0047035304575629, 1.0046890879071722, 1.0046744619102512, 1.004659732110846,
+        1.0046450023470745, 1.0046303827685192, 1.0046159715517775, 1.00460183919,
+        1.0045880178238866, 1.0045744971868609, 1.004561227613111, 1.0045481293942542,
+        1.0045351067596826, 1.0045220640576806, 1.0045089214334375, 1.0044956274684695,
+        1.0044821668217645, 1.0044685617879525, 1.0044548677093748, 1.0044411631748833,
+        1.004427536747704, 1.0044140724629562, 1.0044008364538213, 1.004387866799712,
+        1.0043751680990307, 1.004362711461981, 1.004350439734686, 1.0043382769498104,
+        1.0043261403781925, 1.0043139532201704, 1.0043016559636349, 1.0042892147331461,
+        1.0042766254971935, 1.0042639136895757, 1.0042511295190957, 1.0042383398753805,
+        1.0042256181943687, 1.0042130338661905, 1.0042006427338686, 1.004188479967634,
+        1.0041765561651137, 1.0041648570025472, 1.0041533462342074, 1.0041419713861568,
+        1.0041306711767555, 1.0041193835526538, 1.004108053257791, 1.0040966380298506,
+        1.004085112798628, 1.0040734715888506, 1.0040617271509462, 1.004049908611215,
+        1.0040380576178367, 1.004026223549562, 1.0040144583562582, 1.0040028115343664,
+        1.0039913256334934, 1.0039800325709323, 1.0039689509221716, 1.0039580842716005,
+        1.0039474206521428, 1.0039369330696057, 1.0039265810850284, 1.0039163134021112,
+        1.0039060713656862, 1.003895793215993, 1.0038854188653228, 1.0038748948794665,
+        1.0038641792728362, 1.003853245682171, 1.0038420864853184, 1.0038307144889582,
+        1.0038191629227289, 1.0038074836374427, 1.0037957435930882, 1.003784019912827,
+        1.003772393945114, 1.003760944892848, 1.0037497436187928, 1.0037388472130577,
+        1.0037282948152981, 1.0037181050360817, 1.0037082751407889, 1.0036987819717773,
+        1.003689584415561, 1.0036806270919327, 1.003671844863657, 1.003663167741589,
+        1.0036545257846692, 1.0036458536544017, 1.003637094562477, 1.0036282034316983,
+        1.0036191491615534, 1.0036099159433647, 1.0036005036058995, 1.003590926996122,
+        1.003581214421018, 1.003571405205113, 1.0035615464621315, 1.0035516892403635,
+        1.0035418842753139, 1.0035321776590391, 1.0035226067973688, 1.0035131970566062,
+        1.0035039594849864, 1.003494889922445, 1.003485969684858, 1.0034771678367909,
+        1.0034684448701143, 1.003459757412499, 1.0034510634302365, 1.0034423272925062,
+        1.003433524049781, 1.0034246423565367, 1.0034156856323098, 1.003406671285797,
+        1.0033976280922319, 1.0033885920756664, 1.0033796014650127, 1.003370691430651,
+        1.003361889344133, 1.0033532112288277, 1.0033446598941755, 1.0033362249960527,
+        1.0033278849787313, 1.0033196105744475, 1.0033113693081053, 1.0033031303128723,
+        1.0032948687291021, 1.0032865690387005, 1.0032782268659557, 1.0032698490245329,
+        1.0032614518681362, 1.0032530582646277, 1.003244693718332, 1.0032363822812327,
+        1.0032281429040932, 1.003219986784033, 1.0032119160839592, 1.003203924163228,
+        1.0031959972084348, 1.003188116929689, 1.0031802638274794, 1.0031724204626788,
+        1.003164574186808, 1.003156718904, 1.0031488556180386, 1.003140991734417,
+        1.0031331393005967, 1.0031253125415165, 1.003117525153282, 1.0031097878401711,
+        1.0031021065174173, 1.0030944814684206, 1.0030869075655315, 1.0030793754711578,
+        1.0030718735645545, 1.0030643902188578, 1.0030569160022615, 1.0030494454038283,
+        1.0030419777813835, 1.003034517377276, 1.0030270724199817, 1.0030196534944034,
+        1.0030122714922325, 1.0030049355238355, 1.0029976511736203, 1.0029904194129986,
+        1.0029832363623183, 1.0029760939381869, 1.0029689812635876, 1.0029618865832162,
+        1.002954799339129, 1.002947712036625, 1.0029406215708268, 1.0029335297825788,
+        1.0029264431497555, 1.0029193716723916, 1.0029123271501659, 1.0029053211544692,
+        1.002898363047076, 1.0028914583854416, 1.0028846079840412, 1.002877807785006,
+        1.0028710495506603, 1.0028643222498894, 1.0028576138940979, 1.0028509135060601,
+        1.002844212888145, 1.0028375078967027, 1.0028307990189131, 1.0028240911705897,
+        1.0028173927667559, 1.0028107142381537, 1.0028040662557869, 1.0027974579677887,
+        1.0027908955423273, 1.0027843812501818, 1.0027779132226513, 1.0027714859023968,
+        1.0027650910874482, 1.0027587193719303, 1.002752361726962, 1.0027460109508037,
+        1.0027396627495904, 1.0027333162818726, 1.0027269740979545, 1.0027206415109733,
+        1.0027143255323578, 1.0027080335734084, 1.002701772146506, 1.002695545789535,
+        1.0026893563888524, 1.0026832029993347, 1.0026770821690718, 1.0026709886876328,
+        1.0026649166058694, 1.0026588603337925, 1.0026528156173633, 1.002646780224807,
+        1.0026407542316937, 1.0026347398703028, 1.0026287409883772, 1.0026227622311084,
+        1.0026168081062217, 1.002610882107764, 1.0026049860578925, 1.0025991197814093,
+        1.00259328116387, 1.0025874665727899, 1.002581671555737, 1.0025758916806677,
+        1.0025701233608693, 1.0025643645129168, 1.0025586149293073, 1.0025528763013385,
+        1.0025471518922437, 1.0025414459238704, 1.0025357627909224, 1.002530106246311,
+        1.002524478704468, 1.0025188807866134, 1.0025133111873692, 1.0025077668841365,
+        1.0025022436496878, 1.0024967367754407, 1.0024912418768348, 1.0024857556393887,
+        1.0024802763760503, 1.0024748043008809, 1.0024693414745973, 1.002463891434776,
+        1.0024584585777974, 1.0024530474011928, 1.0024476617373697, 1.0024423041089408,
+        1.0024369753128854, 1.0024316742998831, 1.0024263983637365, 1.0024211436029964,
+        1.002415905571702, 1.0024106800061097, 1.002405463504203, 1.0024002540458226,
+        1.0023950512709674, 1.0023898564767193, 1.0023846723415888, 1.00237950243155,
+        1.002374350576904, 1.0023692202279484, 1.0023641138973254, 1.0023590327786656,
+        1.0023539765983562, 1.0023489437159914, 1.0023439314466833, 1.002338936542077,
+        1.0023339557426683, 1.0023289863055347, 1.002324026419724, 1.002319075444302,
+        1.002314133936975, 1.0023092034783332, 1.0023042863314338, 1.0022993850029593,
+        1.0022945017861675, 1.0022896383654503, 1.0022847955481384, 1.0022799731642036,
+        1.0022751701434867, 1.0022703847486178, 1.0022656149153883, 1.0022608586354083,
+        1.0022561143110058, 1.002251381019952, 1.0022466586459537, 1.00224194785629,
+        1.0022372499358898, 1.002232566512482, 1.0022278992258629, 1.0022232494028538,
+        1.002218617796835, 1.0022140044377936, 1.0022094086180355, 1.002204829013997,
+        1.0022002639203922, 1.0021957115533684, 1.0021911703678572, 1.0021866393325212,
+        1.0021821181139132, 1.0021776071378312, 1.002173107517558, 1.002168620861741,
+        1.0021641489952589, 1.0021596936409156, 1.0021552561160716, 1.0021508370952412,
+        1.0021464364782413, 1.002142053385453, 1.002137686280611, 1.0021333332005395,
+        1.0021289920541223, 1.0021246609420542, 1.0021203384462696, 1.0021160238435574,
+        1.0021117172106484, 1.0021074194057251, 1.0021031319309006, 1.0020988566985745,
+        1.0020945957388385, 1.0020903508931736, 1.002086123540543, 1.002081914395731,
+        1.0020777234077523, 1.0020735497703581, 1.0020693920397503, 1.0020652483391714],
+    [3.0803931518489375e-05, 9.245069821316637e-05, 0.00015421428326392397,
+        0.0002161728844591258, 0.00027840517327360273, 0.00034099050265492024,
+        0.0004040090888987897, 0.00046754222271725777, 0.0005316724694555524,
+        0.000596483879435196, 0.000662062203821785, 0.0007284951196070836,
+        0.0007958724572170268, 0.0008642864433877719, 0.0009338319485527795,
+        0.0010046067492219522, 0.0010767118006230626, 0.0011502515230568781,
+        0.0012253341047569648, 0.001302071817827712, 0.0013805813569199529,
+        0.0014609841928159815, 0.0015434069503116354, 0.00162798180892015,
+        0.0017148469289551844, 0.001804146904677101, 0.00189603324994729,
+        0.0019906649145178808, 0.0020882088386676638, 0.0021888405442770003,
+        0.0022927447727327044, 0.0024001161654389172, 0.0025111599984656754,
+        0.002626092970603979, 0.0027451440540405317, 0.002868555409457971,
+        0.002996583375540237, 0.0031294995356747875, 0.0032675918738501427,
+        0.0034111660229774413, 0.0035605466200086776, 0.003716078772645075,
+        0.0038781296540154136, 0.004047090232791046, 0.004223377158084784,
+        0.0044074348060355786, 0.004599737517980672, 0.004800792032270425,
+        0.005011140149334929, 0.005231361637218757, 0.005462077414833462,
+        0.005703953039282318, 0.005957702527388886, 0.0062240925541977386,
+        0.006503947067172407, 0.006798152361273108, 0.0071076626758362176,
+        0.007433506363104793, 0.00777679270653218, 0.008138719460005356,
+        0.008520581197178136, 0.008923778572958894, 0.0093498286097183,
+        0.009800376138165057, 0.010277206542253892, 0.010782259981664962,
+        0.011317647284665814, 0.011885667739312123, 0.01248882904819909,
+        0.013129869744582134, 0.01381178442278762, 0.014537852191978557,
+        0.015311668834509493, 0.016137183216483664, 0.017018738615150963,
+        0.017961119722332265, 0.0189696062466548, 0.020050034175523836,
+        0.021208865978519918, 0.022453271288767774, 0.023791219868608948,
+        0.02523158906342205, 0.026784288392310958, 0.028460404474593606,
+        0.030272370208792684, 0.03223416297727848, 0.03436153776956783,
+        0.03667230249421674, 0.03918664452308226, 0.041927519839513996,
+        0.044921119027565085, 0.04819742827711259, 0.05179090858190951,
+        0.05574132304907215, 0.06009475121191451, 0.06490484151338756, 0.07023436970010427,
+        0.07615719429584829, 0.08276073279160903, 0.09014912907635733, 0.0984473504885147,
+        0.10780655357644363, 0.11841120976325194, 0.13048871816901353, 0.144322607505048,
+        0.16027104427007016, 0.17879340867011015, 0.2004895475033537, 0.2261597439334436,
+        0.2569001944694861, 0.2942630361838355, 0.340542844776551, 0.39933648523274695,
+        0.47677882527387794, 0.5848109050034741, 0.7528163454446831, 1.1030794102695611,
+        3.7539234967968125, 1.0613149398087423, 2.9442796331778873, 1.9118721336697297,
+        0.19266425231029458, 1.361391993222126, 3.737612950661533, 5.236779893936161,
+        1.9493570879194289, 0.31823193292579616, 2.219378285813057, 7.241691824742019,
+        7.0996926020089095, 4.370030801892724, 2.2015654021024464, 1.3291006238898584,
+        1.0021072382360496, 1.1109998701012866, 1.7383448333746236, 2.5759629285146306,
+        2.323798662279378, 1.7943486802359807, 1.4798246431532764, 1.3193810953324014,
+        1.2702769321341998, 1.3370473469444168, 1.5322055349670798, 1.6493729003298796,
+        1.4621157582597344, 1.2785081903830726, 1.2037347492439954, 1.212725600030724,
+        1.29258123743043, 1.4486933768085446, 1.6762488500213564, 1.8296731271237545,
+        1.6007437747663116, 1.2042391507508667, 0.9669112675608179, 0.9151199994754028,
+        1.0708750318187121, 1.209991162759065, 1.3575109009522057, 1.4853774370237238,
+        1.5436479497939577, 1.504602463191635, 1.396589723272963, 1.2718207124936889,
+        1.1655566959604566, 1.0920611570758152, 1.05487846395288, 1.0537125142445374,
+        1.0863653269732934, 1.1474854941324995, 1.2254849593734154, 1.3003199417030147,
+        1.3477872326557767, 1.3524444665863966, 1.317276506402226, 1.2580912851394899,
+        1.19116502156048, 1.126954439550285, 1.0703263980170776, 1.022765179016689,
+        0.984163888893624, 0.9538377730347086, 0.9310034865585954, 0.9149734457564301,
+        0.9052158152255007, 0.9013570648663182, 0.9031627193205892, 0.9105103172333194,
+        0.9233569056453842, 0.9416960685468131, 0.9654935799665163, 0.9945851209250084,
+        1.0285154545376805, 1.066302564567107, 1.106138578109582, 1.1451173062136244,
+        1.1792156138194234, 1.2038683975601636, 1.215316507112151, 1.2122775434440018,
+        1.196834658937199, 1.1737420207993117, 1.148600887286089, 1.1261344147494352,
+        1.1093394419440339, 1.0994621359615322, 1.0963775010668972, 1.0990342024081667,
+        1.1058223881364113, 1.1148549456054244, 1.1242025369455502, 1.1321182090925266,
+        1.1372552307515686, 1.1388451313539107, 1.13678475105442, 1.131596301597786,
+        1.1242664362363142, 1.1160126151794636, 1.1080421465865335, 1.1013565949293536,
+        1.0966268421496306, 1.0941401096647305, 1.093808197689327, 1.0952241738235078,
+        1.0977563089707734, 1.1006677112322574, 1.1032460469802932, 1.1049223380752373,
+        1.1053560157314408, 1.1044691839432954, 1.1024259585460667, 1.099567498196614,
+        1.0963233100617216, 1.0931212003904056, 1.0903132598198775, 1.088127622046833,
+        1.0866489655003015, 1.0858261513062422, 1.0855024270446554, 1.085461181164838,
+        1.0854779318829584, 1.0853678215335434, 1.085018647376945, 1.084403060769963,
+        1.083569211951396, 1.0826147772912482, 1.0816529155070937, 1.0807793462738648,
+        1.0800479280837678, 1.079459073918427, 1.0789621882679388, 1.0784705729647541,
+        1.0778850298923768, 1.0771207367582094, 1.0761311604396118, 1.0749232268797766,
+        1.0735599112850158, 1.0721495155296081, 1.0708242501033414, 1.0697132447933742,
+        1.0689160606892303, 1.0684821336213728, 1.068399867693477, 1.068596996167941,
+        1.0689518259165356, 1.0693132848015712, 1.069526342129776, 1.069458441697517,
+        1.0690222630876218, 1.0681906380696877, 1.06700087403682, 1.0655478460677443,
+        1.0639674858653596, 1.0624140961289026, 1.0610358076061968, 1.0599523765807997,
+        1.0592386200454058, 1.0589154844693398, 1.0589493877313056, 1.0592592739307214,
+        1.0597298618614392, 1.0602288753530973, 1.0606256471749955, 1.0608084384192518,
+        1.0606981505724518, 1.060256800734451, 1.0594900586888736, 1.0584441089977803,
+        1.0571978923920595, 1.055852253116637, 1.0545176363608444, 1.053301810284613,
+        1.0522987578624645, 1.0515795252168374, 1.0511855163195178, 1.0511245234819584,
+        1.0513696627240063, 1.0518612950101138, 1.0525119018392695, 1.0532137031186113,
+        1.053848543031998, 1.0542992521371581, 1.0544613869680723, 1.0542540423302518,
+        1.0536284131871931, 1.052573001636367, 1.051114804954471, 1.0493163996339352,
+        1.0472694255034958, 1.045085443482139, 1.0428854014790572, 1.0407889718398338,
+        1.0389048585568852, 1.037322888109972, 1.0361083746874302, 1.0352989504831187,
+        1.0349038079367903, 1.0349051208094486, 1.0352612872458868, 1.0359115589566568,
+        1.0367815785531052, 1.0377893399255935, 1.0388511153781639, 1.0398869568488638,
+        1.0408254690722758, 1.041607654570635, 1.042189724489785, 1.0425448389406569,
+        1.0426637785494504, 1.0425545612179772, 1.0422410213158302, 1.0417603835113474,
+        1.0411599064319619, 1.0404927470381764, 1.0398132958357587, 1.039172335693135,
+        1.0386124582937033, 1.038164209750386, 1.0378434154763523, 1.0376500480580673,
+        1.0375688534531673, 1.0375717514408753, 1.0376217955071876, 1.0376782443760943,
+        1.0377021002944007, 1.0376613504710726, 1.0375351449723929, 1.0373162758254275,
+        1.0370115778002005, 1.0366402089095867, 1.0362301220306318, 1.0358133362824837,
+        1.035420800098714, 1.035077677734802, 1.0347997894086258, 1.034591719962476,
+        1.0344468241356544, 1.0343490453680613, 1.034276175687787, 1.0342039589351282,
+        1.0341103138591128, 1.033978951041501, 1.0338017827220476, 1.033579757571891,
+        1.0333220494972915, 1.0330438313835215, 1.0327631110961177, 1.0324972521386606,
+        1.032259823679815, 1.0320583292218712, 1.0318931762809562, 1.0317580099867385,
+        1.0316412846719991, 1.0315287306615148, 1.0314062237020536, 1.0312625066469012,
+        1.0310912572976374, 1.0308921346194178, 1.0306706409587452, 1.0304368690066592,
+        1.0302034122770716, 1.029982865783703, 1.0297854035037122, 1.029616884893058,
+        1.0294778266101368, 1.0293634038092838, 1.0292644511662226, 1.029169251722154,
+        1.0290657626873092, 1.028943855028586, 1.0287971503746454, 1.0286241229609934,
+        1.0284282796633268, 1.0282174088343803, 1.0280020632502076, 1.0277935798923366,
+        1.027602014426448, 1.0274343699052446, 1.0272934312231472, 1.0271773955254864,
+        1.0270803385314315, 1.0269934051340583, 1.0269064860050996, 1.026810061619894,
+        1.0266968744184999, 1.0265631315789976, 1.026409036471196, 1.0262385773035958,
+        1.0260586410135826, 1.0258776420065017, 1.0257039364049783, 1.0255443196625138,
+        1.0254028765918357, 1.0252803765283602, 1.0251742988932793, 1.0250794565189285,
+        1.0249890770001584, 1.0248961245297736, 1.0247946091231952, 1.0246806421781,
+        1.0245530535931902, 1.0244134745446314, 1.024265893691381, 1.024115792731963,
+        1.0239690413055291, 1.0238307682229408, 1.0237044208183717, 1.0235911800063988,
+        1.023489825565804, 1.0233970589264356, 1.0233082056658733, 1.0232181522544161,
+        1.0231223330051222, 1.0230175799394081, 1.0229026800996126, 1.0227785449146396,
+        1.0226479724424318, 1.0225150606672335, 1.0223843937137165, 1.0222601612524698,
+        1.0221453783126042, 1.022041348267558, 1.0219474618200257, 1.021861359586878,
+        1.021779417794547, 1.0216974580403395, 1.0216115433654898, 1.021518710555248,
+        1.0214175042910918, 1.021308219007719, 1.021192810985852, 1.0210745052937413,
+        1.0209571778571653, 1.0208446319720739, 1.0207399043168377, 1.0206447259803488,
+        1.0205592319693457, 1.020481964796303, 1.0204101632791998, 1.0203402765692091,
+        1.0202686046766136, 1.0201919469623923, 1.0201081422559102, 1.020016407474591,
+        1.0199174210522952, 1.0198131454140411, 1.0197064300549725, 1.019600474782218,
+        1.0194982547332487, 1.0194020115232643, 1.0193128986467794, 1.0192308378371517,
+        1.0191546027776632, 1.0190821049412193, 1.0190108209012891, 1.0189382773240923,
+        1.018862502763006, 1.0187823650889378, 1.0186977375892026, 1.0186094705301296,
+        1.0185191817422672, 1.0184289126363029, 1.0183407190615692, 1.0182562757229872,
+        1.018176567331237, 1.0181017209047347, 1.0180310056233959, 1.0179629947974596,
+        1.0178958547618733, 1.0178277031552452, 1.0177569679178076, 1.0176826801461358,
+        1.0176046479881864, 1.017523482136245, 1.0174404716179424, 1.0173573361684969,
+        1.0172759034314482, 1.0171977717272682, 1.0171240201837677, 1.0170550178373021,
+        1.0169903641092222, 1.0169289685848426, 1.0168692528138275, 1.0168094354248212,
+        1.0167478479114969, 1.0166832242790498, 1.016614913828281, 1.0165429813346285,
+        1.016468179825664, 1.0163918041392415, 1.0163154542713901, 1.0162407525377402,
+        1.0161690652969941, 1.0161012775251788, 1.0160376576627144, 1.015977833112151,
+        1.0159208767620314, 1.015865485557671, 1.0158102167902183, 1.015753738973428,
+        1.015695053238979, 1.0156336480013288, 1.0155695627497618, 1.0155033536802243,
+        1.0154359713605596, 1.0153685756103394, 1.015302322719615, 1.0152381634827714,
+        1.0151766869746104, 1.0151180354667304, 1.0150619022987462, 1.0150076094287404,
+        1.0149542474889248, 1.01490085084716, 1.0148465750922355, 1.0147908452131689,
+        1.014733449161426, 1.0146745621331772, 1.014614699752346, 1.0145546110232273,
+        1.0144951322228497, 1.0144370290957159, 1.0143808558715468, 1.0143268557458405,
+        1.0142749194149259, 1.0142246075976753, 1.0141752321406763, 1.0141259802665654,
+        1.014076059459673, 1.0140248374939196, 1.0139719535676557, 1.0139173820180793,
+        1.0138614385709912, 1.0138047289981509, 1.0137480496791824, 1.0136922572940479,
+        1.013638129491267, 1.0135862392510817, 1.013536862809855, 1.0134899350643023,
+        1.0134450584350128, 1.013401562604543, 1.0133586047476324, 1.0133152940313532,
+        1.0132708210954073, 1.013224573256464, 1.0131762191346807, 1.0131257516476384,
+        1.013073484906708, 1.0130200073905022, 1.0129660998054335, 1.0129126304317624,
+        1.0128604429771015, 1.0128102518829643, 1.0127625578832937, 1.0127175929169048,
+        1.0126752989465204, 1.0126353405780655, 1.0125971472730473, 1.0125599779017962,
+        1.0125229986672728, 1.0124853650728707, 1.0124462994394445, 1.012405157173999,
+        1.0123614771591176, 1.0123150138777894, 1.012265750892879, 1.0122138968564773,
+        1.0121598662537057, 1.0121042476251922, 1.0120477621822679, 1.011991215687028,
+        1.0119354463647496, 1.0118812715536072, 1.0118294358153337, 1.0117805633011872,
+        1.0117351172095042, 1.0116933690776468, 1.0116553803238404, 1.0116209978314126,
+        1.011589864446171, 1.0115614440988643, 1.0115350599883657, 1.0115099430258292,
+        1.011485286713232, 1.011460303959819, 1.0114342811276524, 1.0114066248792994,
+        1.0113768981422306, 1.0113448426078568, 1.011310386504356, 1.0112736377565699,
+        1.011234863914586, 1.0111944612654256, 1.0111529162562913, 1.0111107627216518,
+        1.0110685384368099, 1.0110267442714354, 1.0109858087604, 1.0109460603218177,
+        1.0109077086972789, 1.0108708365106365, 1.010835401164485, 1.010801246626269,
+        1.0107681240059727, 1.0107357192061188, 1.0107036853616664, 1.010671677328384,
+        1.0106393851859916, 1.0106065636627493, 1.0105730546176062, 1.0105388002627345,
+        1.0105038456610385, 1.0104683301277284, 1.010432468392054, 1.010396523587425,
+        1.0103607751699182, 1.0103254855603596, 1.0102908695418755, 1.0102570701607783,
+        1.0102241440853597, 1.0101920581636772, 1.010160697445594, 1.010129883400448,
+        1.0100993996910916, 1.0100690218611867, 1.0100385468077626, 1.0100078180215415,
+        1.00997674326807, 1.0099453025495495, 1.0099135456505415, 1.0098815801057823,
+        1.0098495517991768, 1.0098176214021075, 1.0097859403397993, 1.0097546298745181,
+        1.0097237662452094, 1.0096933737231442, 1.009663426117141, 1.0096338559093896,
+        1.009604569041873, 1.0095754625845448, 1.0095464422137097, 1.0095174366434818,
+        1.0094884068287635, 1.009459348764134, 1.0094302898578942, 1.0094012799636143,
+        1.009372379018174, 1.0093436437271341, 1.0093151157855622, 1.009286813733818,
+        1.009258729806225, 1.009230832176731, 1.0092030720125884, 1.0091753938886394,
+        1.009147747536934, 1.0091200987020656, 1.0090924370676844, 1.009064779770826,
+        1.0090371698234772, 1.0090096696711932, 1.0089823509765439, 1.0089552823745183,
+        1.008928517298517, 1.008902083965382, 1.0088759792443833, 1.008850167486444,
+        1.0088245845696073, 1.0087991465644213, 1.008773761679394, 1.0087483436307734,
+        1.008722824370559, 1.008697164228105, 1.0086713579445532, 1.008645435729751,
+        1.008619459238233, 1.0085935131203712, 1.0085676934397674, 1.0085420946661445,
+        1.0085167971005757, 1.0084918564583298, 1.0084672969587365, 1.0084431087214079,
+        1.0084192496362723, 1.0083956512591847, 1.0083722277734304, 1.0083488867158594,
+        1.0083255400289746, 1.0083021140675656, 1.0082785574313695, 1.0082548458606462,
+        1.00823098385572, 1.0082070030989891, 1.008182958113408, 1.0081589198467424,
+        1.0081349680082612, 1.0081111830069558, 1.008087638266641, 1.0080643935533127,
+        1.0080414897762802, 1.0080189455465134, 1.007996755614868, 1.0079748911805084,
+        1.0079533019575124, 1.007931919809225, 1.0079106636959787, 1.0078894456233833,
+        1.00786817722104, 1.0078467765264272, 1.0078251745037377, 1.0078033208042898,
+        1.0077811882874854, 1.0077587758793551, 1.0077361094545045, 1.0077132405828322,
+        1.007690243171865, 1.0076672082384912, 1.0076442372347187, 1.0076214345050543,
+        1.007598899546053, 1.0075767197575007, 1.0075549643160828, 1.0075336796739554,
+        1.0075128870046244, 1.0074925817116531, 1.007472734910268, 1.0074532966137855,
+        1.007434200226282, 1.0074153678712303, 1.0073967160742456, 1.0073781613581174,
+        1.0073596253849568, 1.007341039374709, 1.0073223476232984, 1.0073035100235037,
+        1.0072845035495388, 1.0072653227024153, 1.0072459789339212, 1.00722649908309,
+        1.0072069228819516, 1.007187299626132, 1.007167684163842, 1.007148132430369,
+        1.0071286968335516, 1.007109421862716, 1.007090340331279, 1.0070714706550328,
+        1.0070528155043272, 1.007034362047147, 1.0070160838314213, 1.0069979441581187,
+        1.0069799005992417, 1.0069619101474658, 1.0069439343758038, 1.0069259439581675,
+        1.0069079219653476, 1.0068898655017402, 1.0068717854680322, 1.0068537044932813,
+        1.0068356533383833, 1.0068176662921398, 1.006799776225876, 1.0067820100193017,
+        1.0067643850097145, 1.0067469069573978, 1.0067295697859382, 1.0067123570837837,
+        1.00669524508556, 1.0066782066307083, 1.0066612154578818, 1.0066442501576585,
+        1.0066272971782861, 1.0066103524464178, 1.0065934213986591, 1.0065765174812897,
+        1.0065596594215236, 1.0065428677640775, 1.006526161271381, 1.0065095537889963,
+        1.0064930520812048, 1.0064766549636897, 1.0064603538321801, 1.006444134447484,
+        1.0064279796285993, 1.0064118723614888, 1.0063957987742542, 1.0063797504678014,
+        1.0063637258157445, 1.0063477300351429, 1.0063317740470978, 1.0063158723552303,
+        1.0063000403351021, 1.0062842914209962, 1.0062686346839131, 1.0062530732163866,
+        1.006237603591348, 1.0062222164705819, 1.0062068982374954, 1.0061916333536587,
+        1.006176407018804, 1.0061612076690782, 1.0061460288847317, 1.0061308703881178,
+        1.0061157379754362, 1.0061006424120653, 1.0060855974988128, 1.0060706176547367,
+        1.006055715438128, 1.0060408994292838, 1.0060261728278734, 1.00601153298796,
+        1.0059969719486224, 1.0059824778468989, 1.0059680369519535, 1.005953635959928,
+        1.0059392641536153, 1.0059249150645468, 1.0059105873698038, 1.0058962848938031,
+        1.0058820157418924, 1.0058677907401206, 1.0058536214689933, 1.0058395182397415,
+        1.005825488360592, 1.0058115349797823, 1.0057976566836035, 1.005783847892018,
+        1.005770099955314, 1.005756402737439, 1.0057427463944353, 1.0057291230324026,
+        1.0057155279609165, 1.005701960337834, 1.0056884231144294, 1.0056749223152102,
+        1.0056614658021903, 1.005648061759001, 1.0056347171719187, 1.0056214365766303,
+        1.005608221284274, 1.0055950692091253, 1.0055819753101423, 1.0055689325495978,
+        1.0055559331831225, 1.0055429701419283, 1.0055300382581642, 1.0055171351188583,
+        1.0055042614054077, 1.005491420670571, 1.0054786186059281, 1.0054658619419654,
+        1.0054531571846865, 1.0054405094169683, 1.0054279213762227, 1.005415392966328,
+        1.0054029212815956, 1.0053905011284219, 1.0053781259428474, 1.0053657889346275,
+        1.0053534842521648, 1.0053412079632542, 1.0053289586832423, 1.0053167377473629,
+        1.0053045489059789, 1.0052923976051473, 1.005280289985828, 1.0052682317811525,
+        1.0052562273048513, 1.0052442787037787, 1.0052323855976961, 1.0052205451595422,
+        1.0052087526120324, 1.0051970020450982, 1.0051852874058473, 1.005173603486835,
+        1.0051619467435016, 1.00515031580572, 1.0051387116049557, 1.0051271371069963,
+        1.005115596708498, 1.0051040954116774, 1.0050926379261977, 1.0050812278550476,
+        1.0050698671016047, 1.0050585555922709, 1.0050472913512303, 1.0050360709014805,
+        1.0050248899105003, 1.0050137439590028, 1.0050026292939038, 1.0049915434341075,
+        1.004980485527875, 1.0049694564076141, 1.0049584583428444, 1.0049474945453578,
+        1.0049365685225395, 1.0049256833987616, 1.0049148413267641, 1.0049040430914218,
+        1.0048932879712995, 1.0048825738758504, 1.0048718977267357, 1.0048612560092498,
+        1.0048506453914814, 1.0048400632993038, 1.0048295083456869, 1.0048189805408627,
+        1.0048084812501548, 1.0047980129115317, 1.00478757856694, 1.004777181293111,
+        1.00476682363346, 1.0047565071305113, 1.0047462320387794, 1.0047359972650922,
+        1.004725800542904, 1.0047156388065162, 1.0047055086972492, 1.0046954071122598,
+        1.0046853317012212, 1.0046752812270712, 1.004665255732108, 1.0046552564852984,
+        1.0046452857245356, 1.0046353462421016, 1.0046254408870847, 1.004615572070633,
+        1.0046057413572282, 1.0045959492082963, 1.0045861949168953, 1.0045764767387833,
+        1.004566792191913, 1.0045571384688052, 1.0045475128889878, 1.0045379133142824,
+        1.0045283384585233, 1.0045187880434634, 1.0045092627802084, 1.00449976418576,
+        1.0044902942718046, 1.0044808551631321, 1.004471448713014, 1.0044620761808214,
+        1.0044527380243005, 1.004443433837442, 1.0044341624389566, 1.004424922090507,
+        1.0044157108023966, 1.004406526670987, 1.0043973681885854, 1.004388234473333,
+        1.0043791253820455, 1.0043700414902723, 1.004360983947083, 1.004351954233379,
+        1.0043429538681532, 1.0043339841148304, 1.004325045738296, 1.0043161388533364,
+        1.0043072628885537, 1.0042984166697277, 1.0042895986062532, 1.0042808069473852,
+        1.0042720400639984, 1.0042632967083267, 1.0042545762087494, 1.0042458785683226,
+        1.004237204452145, 1.004228555067036, 1.0042199319542897, 1.0042113367297674,
+        1.0042027708131611, 1.0041942351890087, 1.0041857302360258, 1.0041772556498088,
+        1.004168810468957, 1.0041603931986618, 1.004152002011346], [5.86161819598961e-06,
+        1.7594727850020368e-05, 2.9357491432466834e-05, 4.116978469894854e-05,
+        5.30516425532194e-05, 6.502332686145079e-05, 7.710538999067635e-05,
+        8.931874479165691e-05, 0.00010168473358842194, 0.00011422520040077544,
+        0.00012696256575302363, 0.00013991990501098817, 0.0001531210292456591,
+        0.00016659057136274066, 0.00018035407570467726, 0.00019443809350158715,
+        0.00020887028360189481, 0.00022367951954693866, 0.00023889600397626381,
+        0.00025455139013596655, 0.0002706789129542617, 0.0002873135286627125,
+        0.00030449206549343913, 0.00032225338585134474, 0.00034063856125359735,
+        0.0003596910612343132, 0.0003794569583149522, 0.0003999851497015203,
+        0.0004213275985368744, 0.00044353959561947823, 0.0004666800453370819,
+        0.0004908117765609682, 0.0005160018829206777, 0.0005423220944239146,
+        0.0005698491848868082, 0.0005986654182968462, 0.0006288590394711166,
+        0.0006605248131508864, 0.0006937646183200871, 0.0007286881030537449,
+        0.0007654134085219835, 0.0008040679692668982, 0.0008447894005912993,
+        0.0008877264827968937, 0.0009330402562183076, 0.0009809052393463995,
+        0.0010315107899604963, 0.0010850626241140154, 0.0011417845200370781,
+        0.0012019202285467184, 0.0012657356230097254, 0.0013335211233913736,
+        0.0014055944350818959, 0.0014823036530489271, 0.0015640307885395376,
+        0.0016511957868459769, 0.0017442611210449546, 0.0018437370580484294,
+        0.0019501877199918074, 0.0020642380851249044, 0.0021865821071306766,
+        0.0023179921733754087, 0.0024593301743006733, 0.002611560524563372,
+        0.002775765565308981, 0.00295316389425312, 0.003145132322912102,
+        0.003353232370171985, 0.0035792424856183175, 0.0038251975838940397,
+        0.004093438020924795, 0.004386670920904231, 0.004708047891188524,
+        0.005061264817512631, 0.005450691940744948, 0.0058815462589373625,
+        0.0063601243921711705, 0.006894123918493623, 0.007493097772997388,
+        0.008169115128372354, 0.008937754383224542, 0.009819653166547287,
+        0.010843039887840635, 0.012048100777090799, 0.01349503943633683,
+        0.015280284419159905, 0.017573004544230306, 0.020711593553987488,
+        0.025529507244473386, 0.03508619185786479, 0.11015160723442291,
+        0.03585218987874316, 0.02722067018678057, 0.024329717706053626,
+        0.02321900534284155, 0.022985800146819713, 0.0233111990232833, 0.02406314378647531,
+        0.025188978280579245, 0.026678162716958647, 0.028547888402929322,
+        0.030838046025311185, 0.03361103753069684, 0.036954988718420005,
+        0.04099029027268118, 0.04588033990237494, 0.0518484358870602, 0.05920447828062404,
+        0.06838828822931609, 0.08004273843772561, 0.09514387810929723, 0.11524882669493912,
+        0.14301262282114682, 0.1834084233728138, 0.24718435649704046, 0.36403655645543376,
+        0.6735796582771854, 5.269066256399403, 0.2917032720367451, 1.6305462590075612,
+        2.173022765531736, 0.9366745872567774, 0.6614907894277462, 0.874690771492881,
+        1.617398204074107, 1.118755678685662, 1.0160411048498337, 1.095139890038023,
+        1.384029788682787, 1.8545128199504126, 1.2045050452431936, 0.7227333887696132,
+        0.6653589297037489, 0.7999285637719911, 1.0949535134851909, 1.626009698330484,
+        2.118378160368915, 1.6791158246817144, 1.153698156431429, 0.8628697976399348,
+        0.726414593106758, 0.7196552474255183, 0.8769568937996945, 1.2358605559095355,
+        1.5527146740391942, 1.4468483535775432, 1.2317466290611154, 1.0907655057809544,
+        1.0223152906487774, 1.0127126493467258, 1.0602755023759223, 1.163063640406,
+        1.2465996390031349, 1.142388634294744, 0.9654200783976045, 0.8834033129200631,
+        0.9003681230101627, 1.0166631980658887, 1.1136044158978735, 1.2157745838653504,
+        1.29794442740162, 1.3207083339453713, 1.266379140982344, 1.1633266856109403,
+        1.0560486752818554, 0.9724298799402565, 0.922390130363728, 0.9071290359714309,
+        0.9248222983113569, 0.9720924892869274, 1.0427956386968322, 1.125205916129808,
+        1.2000898106358115, 1.2449938580334319, 1.246491610502104, 1.2088808418303767,
+        1.148274912549596, 1.0806820676282258, 1.0161909182436033, 0.9593936721696773,
+        0.9116086737070127, 0.8726387004863764, 0.8417544017599924, 0.8181555572333267,
+        0.8011562236212463, 0.7902405597153008, 0.7850639609390722, 0.7854341069412734,
+        0.7912856998810597, 0.8026513615442366, 0.8196239414942632, 0.8422994395363874,
+        0.870683543882127, 0.904539345918523, 0.9431549092094076, 0.9850323613121272,
+        1.027571478983138, 1.066956641837919, 1.098588092583953, 1.118291360797319,
+        1.1239659761097236, 1.1166512816944565, 1.1001458143851832, 1.0794529510351119,
+        1.0591500838045307, 1.0424718635332024, 1.0311451009638994, 1.0256320690347454,
+        1.0254759063431444, 1.0296062182058179, 1.036583021532274, 1.0448068599310443,
+        1.0527242307447675, 1.0590327850732244, 1.0628593461987026, 1.0638657619882574,
+        1.0622474906922685, 1.0586243642680035, 1.0538605403327845, 1.0488683703542963,
+        1.044442808938975, 1.0411506943196547, 1.0392783993088528, 1.0388301151351433,
+        1.0395664969837368, 1.0410743404293914, 1.0428576179027989, 1.0444369082359541,
+        1.0454399132462768, 1.045664469055258, 1.04510048969934, 1.0439081353162696,
+        1.0423616641403644, 1.040776427297563, 1.0394376204202418, 1.0385450335706197,
+        1.0381815720587773, 1.0383076033968672, 1.03877916024223, 1.0393851430363192,
+        1.0398961070230952, 1.0401149431592505, 1.0399187184974108, 1.0392823760795054,
+        1.0382793105883046, 1.0370598988934228, 1.0358146429463857, 1.0347316700266933,
+        1.0339582815240287, 1.0335738380169248, 1.0335779249566746, 1.0338945606209315,
+        1.0343905960441075, 1.034904352496062, 1.0352788767706913, 1.0353932080968336,
+        1.0351852348992856, 1.034661433803406, 1.0338918309750176, 1.032992057584479,
+        1.0320972473805992, 1.0313339007589097, 1.0307955479462119, 1.0305265307706952,
+        1.0305161733166108, 1.0307035772825643, 1.0309915284826032, 1.0312666142803852,
+        1.0314216879067806, 1.0313764207876217, 1.031092045003984, 1.0305775749694752,
+        1.0298866197996475, 1.0291059010191559, 1.028338223242678, 1.0276835004676095,
+        1.0272214102393, 1.0269985134627864, 1.0270215654624892, 1.0272575616092932,
+        1.027640005460158, 1.0280800467501423, 1.0284805445751368, 1.0287507996917176,
+        1.0288197114142332, 1.0286454723238645, 1.0282205777877222, 1.0275717723411912,
+        1.0267553957982996, 1.0258492436464774, 1.0249424005495076, 1.024124526234588,
+        1.0234758449434174, 1.0230587363266197, 1.022911467184421, 1.0230443202130866,
+        1.023438195791247, 1.0240456680565926, 1.0247944213116167, 1.025592923863066,
+        1.0263380720145787, 1.0269243421998495, 1.0272537452875659, 1.0272456407132535,
+        1.0268453183605362, 1.0260302688290153, 1.0248132791685098, 1.0232418947953212,
+        1.0213943019699536, 1.0193721936505442, 1.017291570990465, 1.0152726290883918,
+        1.0134298644086361, 1.0118633625805333, 1.0106519497576893, 1.0098485910339852,
+        1.0094781491023888, 1.0095374019523364, 1.0099970635605133, 1.0108054471395749,
+        1.0118933453164638, 1.013179668905981, 1.0145773849342978, 1.0159993270489664,
+        1.0173635166070458, 1.0185977226625749, 1.0196430883044916, 1.0204567400094726,
+        1.021013359696864, 1.0213057295892471, 1.0213442645717619, 1.0211555430818755,
+        1.0207798572657847, 1.020267842929471, 1.0196763245852138, 1.0190636113663656,
+        1.018484585280536, 1.0179860089702164, 1.0176025230002221, 1.0173537871104332,
+        1.0172431394948072, 1.0172580054298603, 1.0173720920494158, 1.0175491786377848,
+        1.0177480797020895, 1.0179281584772524, 1.018054643361661, 1.0181029864291222,
+        1.0180616216414273, 1.017932722415727, 1.0177308838478512, 1.0174800004046767,
+        1.017208904804489, 1.0169465205683488, 1.0167173289196514, 1.016537860936081,
+        1.0164147240132024, 1.0163443985927307, 1.016314742740016, 1.0163078637375886,
+        1.016303798683807, 1.0162843245952204, 1.0162362152927853, 1.0161533814978656,
+        1.016037552645483, 1.0158974416037487, 1.0157466197712168, 1.015600562217189,
+        1.0154734568307158, 1.0153753875971163, 1.015310405278715, 1.0152758145333833,
+        1.015262772641902, 1.015258053576249, 1.015246622535925, 1.0152145247274251,
+        1.0151515423415285, 1.015053125035795, 1.0149212431141752, 1.0147640216063405,
+        1.0145942459164228, 1.01442703889487, 1.0142771544505098, 1.0141563888882483,
+        1.0140715724818832, 1.014023483345025, 1.0140068498260237, 1.0140114097394193,
+        1.0140238091719105, 1.014029981263964, 1.0140175698064706, 1.0139779663511401,
+        1.0139076116983936, 1.0138083572316106, 1.0136868601909252, 1.0135531643229336,
+        1.0134187591223396, 1.0132944915209208, 1.013188711575097, 1.01310597160323,
+        1.0130464820782024, 1.0130063813081647, 1.0129787267162391, 1.0129549893814656,
+        1.012926751622176, 1.0128872830960596, 1.0128327072781964, 1.0127625592002993,
+        1.012679658826878, 1.0125893575827858, 1.0124983321221581, 1.0124131775439993,
+        1.012339078813465, 1.0122788119064725, 1.0122322532392214, 1.0121964731172284,
+        1.0121663763127895, 1.0121357511202198, 1.0120985153141242, 1.012049915863312,
+        1.0119874540222737, 1.0119113649561966, 1.0118245696524075, 1.0117321188640338,
+        1.0116402442084238, 1.0115552021766288, 1.011482130176817, 1.0114241251456748,
+        1.011381708203342, 1.0113527636155917, 1.0113329516820535, 1.0113165094029655,
+        1.0112972850412525, 1.0112698145970835, 1.0112302459352918, 1.011176949524214,
+        1.0111107165744948, 1.011034523599119, 1.0109529219154962, 1.0108711764137017,
+        1.010794318259429, 1.010726284734047, 1.010669296092108, 1.0106235699428048,
+        1.0105874083779516, 1.01055762426499, 1.0105302132121954, 1.0105011370726824,
+        1.0104670701562688, 1.0104259724360558, 1.0103773917194503, 1.010322451233219,
+        1.0102635395776156, 1.0102037749222188, 1.0101463545228175, 1.0100939174459294,
+        1.0100480406617833, 1.0100089589519317, 1.0099755538061077, 1.0099456045716517,
+        1.0099162462667277, 1.0098845414649498, 1.0098480549095359, 1.0098053219781877,
+        1.0097561248133717, 1.0097015281326085, 1.0096436728911886, 1.0095853712037461,
+        1.009529581788816, 1.009478865298181, 1.0094349200564539, 1.0093982814408553,
+        1.0093682361991065, 1.00934296272306, 1.0093198671820376, 1.0092960508630322,
+        1.0092688220711603, 1.0092361601375432, 1.0091970501080743, 1.0091516321257457,
+        1.0091011443598963, 1.009047675946058, 1.0089937798195106, 1.0089420186034692,
+        1.008894525998779, 1.0088526602931849, 1.0088168073289656, 1.0087863615325485,
+        1.0087598809085265, 1.0087353811868471, 1.0087107109619697, 1.008683937570995,
+        1.0086536744027148, 1.0086192937054808, 1.0085809919289246, 1.0085397026852967,
+        1.008496880247501, 1.008454199038237, 1.0084132279043512, 1.0083751400632688,
+        1.0083405105474945, 1.0083092348651306, 1.0082805790757654, 1.0082533469979578,
+        1.008226129258462, 1.0081975850305025, 1.008166702861289, 1.0081329924766793,
+        1.0080965735787037, 1.008058147588394, 1.0080188602136526, 1.0079800825707703,
+        1.007943152801786, 1.0079091263067255, 1.0078785799978174, 1.0078515051652528,
+        1.007827306822476, 1.0078049079388685, 1.0077829383040051, 1.0077599731794553,
+        1.0077347788459405, 1.0077065218916257, 1.007674906450369, 1.0076402170767955,
+        1.0076032619804474, 1.0075652288136452, 1.0075274800166805, 1.0074913243509114,
+        1.007457804189427, 1.007427534119645, 1.0074006164040832, 1.0073766448059962,
+        1.0073547927916344, 1.0073339678913409, 1.0073130034353206, 1.0072908536569638,
+        1.0072667589768445, 1.0072403547755755, 1.0072117077925453, 1.0071812774029492,
+        1.0071498120577171, 1.0071182018618126, 1.0070873148629134, 1.0070578461654827,
+        1.0070302054373226, 1.0070044605796808, 1.0069803448203785, 1.006957323184598,
+        1.0069347041693768, 1.006911775176813, 1.0068879369706067, 1.0068628135116002,
+        1.0068363186361744, 1.0068086691330147, 1.0067803433464575, 1.006751993797174,
+        1.00672432988384, 1.0066979913107388, 1.0066734338395118, 1.0066508462930925,
+        1.0066301120541483, 1.0066108206718682, 1.0065923269520345, 1.0065738474146861,
+        1.0065545784242393, 1.006533817421063, 1.0065110688268777, 1.0064861191747805,
+        1.0064590712048889, 1.006430333131999, 1.0064005659573136, 1.0063705975308062,
+        1.0063413162531936, 1.0063135593400065, 1.006288010335843, 1.0062651183052413,
+        1.0062450473632965, 1.0062276606414085, 1.0062125381493425, 1.0061990239535252,
+        1.0061862951299834, 1.0061734433287435, 1.0061595595285246, 1.0061438134826406,
+        1.0061255211288394, 1.0061041954559802, 1.0060795785957286, 1.006051654917467,
+        1.0060206464444363, 1.0059869929045204, 1.0059513192232086, 1.0059143933857182,
+        1.0058770775052512, 1.0058402747906738, 1.0058048750200925, 1.0057717011398046,
+        1.00574145969379, 1.0057146978656168, 1.0056917698729786, 1.005672815191129,
+        1.0056577505266826, 1.00564627660622, 1.0056378997384339, 1.0056319668662665,
+        1.0056277115988645, 1.0056243076664113, 1.0056209255217214, 1.0056167875238333,
+        1.0056112173231297, 1.005603679698239, 1.0055938080843363, 1.005581418247439,
+        1.0055665078453762, 1.0055492428238175, 1.0055299326021043, 1.005508996729022,
+        1.00548692610181, 1.0054642419561106, 1.005441455697372, 1.005419032319092,
+        1.0053973597049015, 1.0053767255921577, 1.0053573034170011, 1.0053391476796634,
+        1.0053221988651913, 1.0053062973303002, 1.005291204931611, 1.0052766325540734,
+        1.0052622711516435, 1.0052478235044535, 1.0052330337032815, 1.0052177114598777,
+        1.0052017487505482, 1.0051851270289447, 1.0051679142400975, 1.0051502520291453,
+        1.0051323347227372, 1.0051143827055713, 1.0050966135613506, 1.005079214670285,
+        1.0050623207843328, 1.0050459994383578, 1.0050302459782805, 1.0050149886420632,
+        1.0050001027094526, 1.0049854314534281, 1.004970810676552, 1.0049560931472155,
+        1.0049411693393882, 1.004925981512656, 1.004910529248766, 1.0048948659154626,
+        1.0048790869433273, 1.0048633120517008, 1.004847664448566, 1.0048322504191862,
+        1.0048171425544403, 1.0048023691881172, 1.004787911532888, 1.0047737087107191,
+        1.0047596695805463, 1.0047456891859181, 1.0047316669507742, 1.004717523548159,
+        1.0047032136766538, 1.004688732739031, 1.0046741164896427, 1.0046594339152788,
+        1.0046447747354148, 1.0046302337667614, 1.0046158948572737, 1.0046018170899744,
+        1.0045880255008166, 1.0045745077362038, 1.0045612170420146, 1.0045480809063052,
+        1.004535013752331, 1.004521931448026, 1.0045087651594455, 1.0044954722571289,
+        1.0044820425431769, 1.0044684988976726, 1.0044548923991221, 1.0044412928908675,
+        1.004427776692632, 1.0044144135784017, 1.0044012551990114, 1.0043883268228178,
+        1.0043756236640133, 1.0043631122754222, 1.004350736638511, 1.0043384278282317,
+        1.0043261155844165, 1.0043137398656512, 1.0043012605261514, 1.00428866361734,
+        1.0042759634028908, 1.0042631998848404, 1.0042504323498265, 1.004237730045506,
+        1.0042251614979538, 1.004212784128678, 1.004200635715554, 1.0041887288982143,
+        1.0041770494221436, 1.0041655582349316, 1.0041541969862118, 1.0041428960231993,
+        1.0041315836775953, 1.0041201955377663, 1.004108682490603, 1.004097016569577,
+        1.004085194006467, 1.0040732352908392, 1.0040611824305468, 1.0040490939256876,
+        1.0040370381828305, 1.0040250861915376, 1.0040133042678518, 1.0040017475612166,
+        1.0039904548546517, 1.0039794449970358, 1.0039687151215135, 1.0039582406469019,
+        1.0039479769398882, 1.0039378624347541, 1.0039278229562283, 1.0039177769578866,
+        1.0039076413618713, 1.0038973376583704, 1.0038867978943538, 1.0038759701564128,
+        1.003864823142676, 1.0038533494365922, 1.0038415671513192, 1.0038295197130263,
+        1.0038172736920028, 1.0038049147608445, 1.0037925420405442, 1.0037802612645206,
+        1.0037681773234428, 1.0037563868296715, 1.0037449713462896, 1.003733991859289,
+        1.0037234849403869, 1.0037134608700673, 1.0037039037898376, 1.0036947737565471,
+        1.0036860104047043, 1.0036775378040068, 1.003669270038911, 1.003661117035153,
+        1.0036529902056472, 1.0036448075695743, 1.003636498094878, 1.0036280051077744,
+        1.0036192886899817, 1.0036103270379109, 1.0036011167891081, 1.003591672336726,
+        1.0035820241642366, 1.003572216251951, 1.0035623026436173, 1.0035523433189455,
+        1.0035423995926804, 1.0035325293418755, 1.003522782433749, 1.00351319676848,
+        1.0035037953475248, 1.0034945847179626, 1.0034855550250068, 1.0034766817374428,
+        1.0034679289135757, 1.0034592536756335, 1.0034506113892203, 1.003441960930663,
+        1.0034332693912413, 1.0034245156240895, 1.0034156921839463, 1.0034068054241694,
+        1.003397873769737, 1.0033889244415413, 1.0033799891269688, 1.0033710992393794,
+        1.0033622814609786, 1.0033535542100465, 1.0033449255224782, 1.0033363926122576,
+        1.0033279431114994, 1.003319557730172, 1.0033112138600746, 1.0033028895115066,
+        1.003294566935496, 1.0032862353541365, 1.0032778923838575, 1.0032695439633186,
+        1.0032612028507697, 1.0032528859927907, 1.0032446112480635, 1.0032363940467965,
+        1.0032282445637788, 1.0032201658827875, 1.0032121534508902, 1.0032041958944518,
+        1.0031962770338854, 1.003188378730991, 1.003180484065515, 1.0031725802883376,
+        1.0031646610446465, 1.0031567274921613, 1.0031487881331245, 1.003140857400457,
+        1.0031329532498252, 1.0031250941747083, 1.0031172961533226, 1.0031095700402695,
+        1.0031019198327187, 1.00309434208666, 1.0030868265607107, 1.003079357957664,
+        1.0030719184527723, 1.0030644905729496, 1.0030570599424822, 1.0030496174451666,
+        1.0030421604621387, 1.0030346930087337, 1.0030272247832763, 1.0030197693227758,
+        1.003012341604415, 1.003004955513852, 1.0029976216095673, 1.0029903455473357,
+        1.0029831274038266, 1.002975961976419, 1.0029688399665826, 1.002961749805987,
+        1.002954679782827, 1.002947620086754, 1.0029405644191545, 1.002933510904428,
+        1.0029264621697889, 1.0029194246120408, 1.0029124070124635, 1.0029054187709407,
+        1.0028984680892714, 1.0028915604324946, 1.0028846975378607, 1.0028778771357998,
+        1.0028710934157437, 1.0028643381356668, 1.002857602161625, 1.002850877151426,
+        1.0028441570768818, 1.0028374393138804, 1.0028307251114592, 1.0028240193646216,
+        1.0028173297401508, 1.0028106653179503, 1.0028040349928915, 1.0027974459199762,
+        1.0027909022731631, 1.0027844045287966, 1.0027779493895899, 1.002771530351939,
+        1.002765138808117, 1.0027587654849, 1.00275240196657, 1.0027460420414798,
+        1.0027396826477974, 1.0027333242683416, 1.0027269707226154, 1.0027206284086851,
+        1.0027143051401701, 1.002708008788494, 1.0027017459673948, 1.0026955209818194,
+        1.0026893352105666, 1.002683187011706, 1.0026770721465856, 1.002670984628818,
+        1.0026649178343827, 1.0026588656695634, 1.002652823590768, 1.0026467893037174,
+        1.0026407630318854, 1.0026347473238906, 1.0026287464519459, 1.0026227655240298,
+        1.00261680947919, 1.0026108821505932, 1.00260498556307, 1.0025991195849329,
+        1.002593281986979, 1.0025874688872032, 1.0025816754911343, 1.0025758969870082,
+        1.002570129430479, 1.0025643704591853, 1.0025586197112257, 1.0025528788770002,
+        1.002547151380511, 1.0025414417521539, 1.0025357548085698, 1.0025300947872355,
+        1.0025244645888527, 1.002518865259062, 1.0025132957967977, 1.0025077533180908,
+        1.0025022335416958, 1.0024967315078106, 1.002491242402469, 1.0024857623445618,
+        1.0024802890018896, 1.0024748219348938, 1.0024693626158043, 1.0024639141276392,
+        1.0024584806021895, 1.0024530664989943, 1.0024476758517191, 1.002442311610189,
+        1.0024369751861903, 1.00243166627306, 1.0024263829600564, 1.0024211221114683,
+        1.0024158799361405, 1.0024106526430168, 1.0024054370672772, 1.0024002311608255,
+        1.0023950342681849, 1.0023898471488384, 1.0023846717525102, 1.0023795107966094,
+        1.0023743672277516, 1.0023692436666707, 1.0023641419352052, 1.0023590627462127,
+        1.0023540056058233, 1.0023489689382992, 1.0023439504040614, 1.002338947348045,
+        1.0023339572942278, 1.0023289783962315, 1.0023240097640458, 1.0023190516107898,
+        1.002314105196657, 1.0023091725835687, 1.0023042562472213, 1.0022993586174744,
+        1.0022944816292532, 1.0022896263629035, 1.0022847928359198, 1.0022799799806121,
+        1.002275185809502, 1.0022704077378033, 1.002265643005894, 1.0022608891285685,
+        1.0022561442946125, 1.0022514076501006, 1.0022466794198155, 1.0022419608493591,
+        1.0022372539810331, 1.0022325613041108, 1.0022278853400404, 1.0022232282324919,
+        1.0022185914093822, 1.002213975370236, 1.0022093796298674, 1.0022048028225494,
+        1.0022002429441825, 1.0021956976879096, 1.0021911648147872, 1.0021866424973802,
+        1.0021821295810174, 1.0021776257231314, 1.0021731313928997, 1.002168647737276,
+        1.0021641763415319, 1.002159718928804, 1.0021552770516096, 1.0021508518273987,
+        1.0021464437608698, 1.0021420526794076, 1.0021376777880844, 1.002133317830195,
+        1.0021289713221535, 1.0021246368200978, 1.0021203131717007, 1.0021159997107014,
+        1.0021116963625747, 1.0021074036455802, 1.0021031225692754, 1.0020988544494989,
+        1.0020946006721017, 1.0020903624452622, 1.002086140581093, 1.0020819353415344,
+        1.002077746372444, 1.0020735727352594, 1.002069413030148, 1.002065265590588],
+    [2.5440259427991582e-06, 7.636690650124145e-06, 1.274321038771961e-05,
+        1.787287388488377e-05, 2.3035047727281348e-05, 2.8239209373829382e-05,
+        3.349497838620301e-05, 3.881215054883702e-05, 4.420073166893235e-05,
+        4.9670972914548056e-05, 5.523340743225542e-05, 6.0898888678298226e-05,
+        6.667863004886451e-05, 7.258424703044086e-05, 7.862780111153871e-05,
+        8.482184652168004e-05, 9.11794795757459e-05, 9.771439111788083e-05,
+        0.00010444092252828428, 0.0001113741252209142, 0.00011852982475010885,
+        0.00012592468910472594, 0.00013357630233954437, 0.00014150324375227131,
+        0.00014972517320936194, 0.00015826292318137607, 0.00016713859845179184,
+        0.00017637568381702944, 0.00018599916106276749, 0.00019603563563693754,
+        0.00020651347471029063, 0.0002174629569532637, 0.00022891643600429047,
+        0.00024090851848064868, 0.0002534762584956776, 0.00026665937001118183,
+        0.00028050045934113754, 0.0002950452795241826, 0.00031034300943999407,
+        0.00032644655979954145, 0.00034341290957918966, 0.0003613034756700554,
+        0.0003801845200963962, 0.00040012759848288056, 0.00042121005518913114,
+        0.00044351556950044226, 0.000467134760477724, 0.0004921658552941128,
+        0.0005187154310561635, 0.0005468992369005471, 0.0005768431076741221,
+        0.0006086839801569572, 0.0006425710243358482, 0.0006786669051638112,
+        0.000717149191211302, 0.0007582119291452921, 0.0008020674071213063,
+        0.0008489481309495412, 0.0008991090434980384, 0.0009528300199826652,
+        0.0010104186779936204, 0.0010722135472955997, 0.001138587651035559,
+        0.0012099525585078997, 0.0012867629795734754, 0.0013695219828642852,
+        0.0014587869327244009, 0.0015551762570765438, 0.0016593771783971764,
+        0.0017721545619500574, 0.001894361064539537, 0.0020269488005797472,
+        0.0021709827837416147, 0.0023276564490187367, 0.0024983096235496353,
+        0.002684449383512691, 0.0028877743282471093, 0.0031102029065811425,
+        0.003353906568651929, 0.003621348685563135, 0.003915330380683084,
+        0.004239044681996679, 0.0045961407293875645, 0.004990800179757581,
+        0.005427828479564589, 0.00591276433723581, 0.006452011589036777,
+        0.007052998755303553, 0.007724373023867622, 0.008476237299054295,
+        0.00932044142837129, 0.010270942067437236, 0.011344250097090119,
+        0.012559990575726373, 0.01394160850993905, 0.015517265264452716,
+        0.017320986532430863, 0.01939414579341658, 0.021787400169160438,
+        0.024563244008886077, 0.027799417514119164, 0.031593516974679645,
+        0.03606932238406765, 0.04138562682011527, 0.04774878934191352, 0.055430968241450614,
+        0.06479727000920234, 0.07634736639212442, 0.09078153732200082, 0.10910997058943225,
+        0.132843319671478, 0.16434773904773298, 0.20756700456383081, 0.26968091151534457,
+        0.3656632216737774, 0.535099295006721, 0.9546384860701584, 6.202187245858004,
+        0.506895207785075, 2.7674547285015105, 3.21588117768692, 1.0389321153935769,
+        0.0952566213835383, 1.80036226546925, 4.73345659307324, 3.221079114254368,
+        2.8313010834505685, 3.038513205287193, 1.5091634753043164, 2.7629958439565336,
+        2.8721022198733097, 2.1620307955253706, 1.8592209872420586, 1.8076573294449199,
+        1.9670339834562984, 2.3655371209612066, 2.567830260687796, 1.7777518509916228,
+        1.1671331704362304, 0.9527386401237378, 0.9704131322565759, 1.1544973396283171,
+        1.51958053797122, 2.0707690906872047, 2.3781211988475044, 1.9962655833371084,
+        1.536653834741414, 1.2444314365241083, 1.0856322128541829, 1.0295757527971543,
+        1.0794120430972458, 1.2598893076212885, 1.5124372227252012, 1.5507591681964823,
+        1.3797416818022068, 1.2370641885611406, 1.1792575285985107, 1.2233875904933802,
+        1.2873351418265528, 1.3650680534181336, 1.4287344306784449, 1.438300483537016,
+        1.37669012446354, 1.2728443591510208, 1.1705164064049425, 1.095805004536776,
+        1.0566994624366246, 1.0528191084496674, 1.081188223538004, 1.1375208053308046,
+        1.214645497051127, 1.2993424421688584, 1.3705314829786208, 1.4046220445680526,
+        1.3891941387597917, 1.3316276562597147, 1.2513445760295623, 1.1663924453875834,
+        1.08754133210559, 1.0192758789314553, 0.9625126310066241, 0.9166185995796133,
+        0.8804951354473589, 0.8530629615608226, 0.8334413429653778, 0.8209893138489076,
+        0.8152919260449694, 0.8161288315654366, 0.8234392376356576, 0.8372847705891698,
+        0.8578037810332887, 0.8851437731166595, 0.919351412569111, 0.9601929536360405,
+        1.0068785412265024, 1.0576894809519706, 1.1095895771102444, 1.1580612740277971,
+        1.1975693834291972, 1.2229474987196374, 1.2313477059308462, 1.2235782410533265,
+        1.2037849836061187, 1.1777249917581476, 1.150872988633208, 1.1272997056095788,
+        1.1094063104979341, 1.0981436237028173, 1.0933685710275574, 1.0941699974817238,
+        1.099131990577564, 1.1065618105787407, 1.114714794836221, 1.1220243919193373,
+        1.1273118251630725, 1.1299279402117501, 1.129786243012026, 1.1272800260019238,
+        1.1231166916678645, 1.1181242385395453, 1.1130798858190087, 1.1085893352150573,
+        1.1050232800807538, 1.1025047982257572, 1.1009373051150178, 1.1000630208232964,
+        1.0995417020880889, 1.099036838408478, 1.0982931566023972, 1.09718873203339,
+        1.0957500951521437, 1.0941288356479524, 1.092549153195507, 1.0912426900933387,
+        1.0903875971596504, 1.090064529329517, 1.0902363027407862, 1.0907527323177055,
+        1.091378371441817, 1.091837876117271, 1.0918708436925766, 1.0912854572095725,
+        1.0899993193222317, 1.088057849382409, 1.0856258087822086, 1.0829544288473112,
+        1.080332649851774, 1.0780339771233036, 1.0762698915693014, 1.075157692889031,
+        1.0747067717370993, 1.0748238125023537, 1.0753346885361785, 1.0760186453671412,
+        1.0766486029573403, 1.0770302596634964, 1.0770327025772914, 1.0766048892803683,
+        1.0757755516603433, 1.0746379300539035, 1.073324038717038, 1.0719749092732387,
+        1.070713185051589, 1.0696229679598812, 1.0687396840423058, 1.0680505650484828,
+        1.0675044807205023, 1.0670284109483215, 1.0665468730595438, 1.0660002317752253,
+        1.0653581665015954, 1.0646256979523783, 1.063840893624198, 1.0630652498394806,
+        1.0623692721408973, 1.0618165667581425, 1.061449715060785, 1.061280499788968,
+        1.0612859901108884, 1.0614108589847668, 1.0615752880573355, 1.0616870033028882,
+        1.0616554242581093, 1.061405645476186, 1.0608900486328974, 1.060095784859912,
+        1.0590471127249936, 1.0578024821779684, 1.0564471166424116, 1.055082474016841,
+        1.0538142517092106, 1.052740540739302, 1.051941422638535, 1.0514708775281043,
+        1.0513514591927644, 1.0515718740557058, 1.0520874002420588, 1.052822978262493,
+        1.0536787470134155, 1.054537732695592, 1.0552752821045084, 1.055769651913728,
+        1.0559129451244464, 1.055621383229747, 1.0548437969350501, 1.0535672824559588,
+        1.0518192395561232, 1.0496654563326515, 1.0472044482952785, 1.0445587742647449,
+        1.0418644245201205, 1.0392595380950544, 1.0368736504320615, 1.0348184493414778,
+        1.033180704738486, 1.0320177127164596, 1.031355311132854, 1.0311883063814236,
+        1.0314829996669934, 1.0321814035386827, 1.0332066820915582, 1.0344693232359563,
+        1.0358735577605225, 1.0373235796945983, 1.0387291952175437, 1.0400106251434067,
+        1.0411022928219387, 1.0419555249163128, 1.0425401598097257, 1.0428450903030415,
+        1.042877770534883, 1.042662709864125, 1.0422389814935165, 1.04165680881,
+        1.0409733636538694, 1.040248009247909, 1.0395373258473248, 1.0388903436745613,
+        1.0383444519333418, 1.037922438511868, 1.0376310356772536, 1.0374612049803844,
+        1.0373902004494735, 1.0373852220945572, 1.0374082402466736, 1.0374213726386878,
+        1.0373920723246766, 1.037297372646186, 1.0371265551587028, 1.0368818490296916,
+        1.036577095639919, 1.0362346560346987, 1.035881131040177, 1.0355426469418811,
+        1.0352405034734522, 1.03498788639297, 1.0347881403385921, 1.0346348201547517,
+        1.0345134369962405, 1.0344045351880407, 1.0342875191432563, 1.0341445317332343,
+        1.0339636891475823, 1.0337411060424577, 1.033481377911969, 1.033196480944262,
+        1.032903344225902, 1.0326205859022335, 1.0323650393841104, 1.0321487079591931,
+        1.0319766823382541, 1.0318463625925678, 1.0317480825985423, 1.0316669845142625,
+        1.031585774132947, 1.0314878402313667, 1.0313601671037413, 1.0311955194496856,
+        1.0309935242508914, 1.0307604876370537, 1.0305080236724973, 1.0302507886960954,
+        1.0300037674737816, 1.0297796196442623, 1.0295865605413548, 1.029427132257933,
+        1.029298045405138, 1.029191073229431, 1.0290947925434406, 1.0289968216486032,
+        1.0288861278847679, 1.0287549793746702, 1.028600195803639, 1.0284234957645773,
+        1.028230914839972, 1.028031443896635, 1.0278351768067189, 1.0276513354882608,
+        1.0274865460757108, 1.0273436764404869, 1.027221428064737, 1.0271147285103583,
+        1.0270158217927094, 1.0269158290732228, 1.0268064725350832, 1.0266816343634615,
+        1.0265384632824979, 1.026377834575027, 1.0262040971518709, 1.0260241775913548,
+        1.0258462294313844, 1.0256780942113273, 1.0255258657576853, 1.0253928190266854,
+        1.0252788879754788, 1.0251807697758486, 1.0250926157679858, 1.0250071639734541,
+        1.024917092073684, 1.0248163363029106, 1.0247011358631255, 1.0245706206978031,
+        1.0244268509327092, 1.024274321050903, 1.024119040496266, 1.023967376315358,
+        1.0238248797169789, 1.0236953120704382, 1.0235800402222766, 1.0234778964138802,
+        1.0233855093644781, 1.0232980267317753, 1.0232100804999975, 1.0231168076258375,
+        1.0230147347845275, 1.0229023680393055, 1.022780388864451, 1.022651435004975,
+        1.0225195230449449, 1.0223892343488714, 1.0222648255052507, 1.0221494322242561,
+        1.022044511818643, 1.0219496197816706, 1.0218625507643184, 1.0217798058881649,
+        1.0216972892580376, 1.0216110971356536, 1.0215182501143412, 1.0214172335429605,
+        1.0213082509485147, 1.021193151313117, 1.021075052784989, 1.0209577409604622,
+        1.020844959049994, 1.0207397233499784, 1.0206437884402486, 1.0205573551188472,
+        1.02047906690006, 1.0204062870675656, 1.020335597689235, 1.0202634236249413,
+        1.0201866649292084, 1.0201032232013056, 1.0200123303974005, 1.0199146276133129,
+        1.0198119887065438, 1.0197071303069636, 1.0196030871303003, 1.0195026530009481,
+        1.0194078902988855, 1.0193197940612444, 1.0192381654869211, 1.019161709420904,
+        1.0190883291012023, 1.0190155564929817, 1.018941033986332, 1.0188629567813643,
+        1.018780395621324, 1.0186934442803515, 1.0186031703866134, 1.0185113851564664,
+        1.0184202804915534, 1.018332004716343, 1.0182482571754419, 1.018169975862263,
+        1.0180971728945876, 1.0180289439985792, 1.0179636457136967, 1.0178992037439907,
+        1.0178334931225947, 1.0177647194902883, 1.0176917325417216, 1.017614216886701,
+        1.01753272928258, 1.0174485798257835, 1.017363582869237, 1.017279726038778,
+        1.0171988188392433, 1.0171221839444573, 1.0170504445035926, 1.0169834418531727,
+        1.0169202936263717, 1.0168595769362239, 1.0167995996011896, 1.0167387080136008,
+        1.016675575538877, 1.0166094208138494, 1.0165401196777835, 1.016468194851482,
+        1.0163946899983078, 1.0163209553146806, 1.0162483866737022, 1.0161781671156347,
+        1.0161110572399075, 1.016047270558361, 1.0159864533113687, 1.015927768801947,
+        1.015870067524957, 1.0158121095667743, 1.0157527974206337, 1.0156913767790428,
+        1.0156275698914685, 1.0155616192225507, 1.0154942358725438, 1.0154264644191822,
+        1.0153594904177665, 1.015294426243381, 1.0152321137760563, 1.0151729783556023,
+        1.0151169584342583, 1.015063521396607, 1.0150117606744087, 1.01496055527588,
+        1.0149087625623043, 1.0148554102035001, 1.0147998544027903, 1.014741878304432,
+        1.0146817156084826, 1.014619997743222, 1.0145576360889927, 1.0144956614384613,
+        1.0144350493617311, 1.0143765614725249, 1.0143206287491944, 1.0142672949246512,
+        1.014216227091088, 1.0141667890257984, 1.0141181623359363, 1.014069493049094,
+        1.0140200378823643, 1.0139692855120688, 1.013917033369177, 1.0138634087532379,
+        1.013808832864583, 1.013753935981496, 1.0136994398479104, 1.013646028159453,
+        1.0135942271843517, 1.0135443160218216, 1.013496280386836, 1.0134498161911552,
+        1.0134043809066142, 1.013359283118434, 1.0133137949802553, 1.0132672692749431,
+        1.0132192427943367, 1.0131695106027025, 1.0131181608278748, 1.013065565998696,
+        1.0130123335461125, 1.0129592238766485, 1.012907048590002, 1.0128565634479394,
+        1.0128083704882112, 1.0127628414523715, 1.0127200709820459, 1.0126798635282435,
+        1.0126417533463652, 1.0126050529708222, 1.0125689226603465, 1.0125324517338554,
+        1.0124947424971569, 1.0124549884066083, 1.0124125398951518, 1.0123669534976485,
+        1.0123180221647325, 1.0122657866309708, 1.0122105292033186, 1.0121527522915732,
+        1.0120931444622117, 1.012032536892122, 1.0119718529981663, 1.0119120538794137,
+        1.0118540821413866, 1.0117988067162411, 1.0117469714178522, 1.0116991500894295,
+        1.0116557111981193, 1.0116167944966779, 1.0115823018333685, 1.0115519033332958,
+        1.0115250590497957, 1.011501054905753, 1.011479050466972, 1.011458134981118,
+        1.011437387329486, 1.0114159351839282, 1.011393008786046, 1.0113679853494382,
+        1.0113404210451082, 1.0113100687352843, 1.0112768809188672, 1.0112409985929247,
+        1.0112027277940359, 1.011162506377839, 1.0111208640887541, 1.0110783791721516,
+        1.011035634729338, 1.0109931777686736, 1.0109514835228106, 1.0109109271296095,
+        1.0108717642412341, 1.010834121545235, 1.0107979975530605, 1.0107632733389542,
+        1.0107297322081794, 1.0106970865733436, 1.010665009677828, 1.0106331693025534,
+        1.010601260309072, 1.0105690328822714, 1.0105363136854597, 1.0105030178326366,
+        1.0104691505676089, 1.0104347987156153, 1.0104001131964755, 1.010365284992155,
+        1.0103305177833128, 1.0102960008763424, 1.0102618859580756, 1.0102282706348698,
+        1.0101951907081541, 1.010162621850888, 1.0101304899685304, 1.010098688263684,
+        1.0100670980714588, 1.01003561004191, 1.0100041422944792, 1.0099726527479784,
+        1.0099411438445909, 1.0099096591708312, 1.0098782728228384, 1.0098470735474774,
+        1.0098161465221194, 1.0097855559809996, 1.0097553317029055, 1.0097254616814118,
+        1.009695892225651, 1.009666535469702, 1.009637283015689, 1.009608023408524,
+        1.00957866050778, 1.009549129685167, 1.009519409151735, 1.0094895245382385,
+        1.0094595459729707, 1.0094295781337397, 1.0093997448884604, 1.0093701709957474,
+        1.0093409637766462, 1.0093121976269184, 1.0092839037332237, 1.0092560664793448,
+        1.0092286269327981, 1.009201492672321, 1.0091745522378377, 1.0091476918118119,
+        1.009120811474304, 1.0090938385436392, 1.0090667360780283, 1.0090395054641637,
+        1.0090121830078003, 1.0089848314011505, 1.0089575277174285, 1.00893035005481,
+        1.0089033650566486, 1.0088766182711622, 1.008850128742568, 1.0088238884546643,
+        1.0087978664137152, 1.0087720164005203, 1.0087462868627306, 1.008720631140149,
+        1.0086950162504875, 1.008669428789178, 1.0086438770465873, 1.008618389117798,
+        1.0085930074573632, 1.0085677809033728, 1.0085427555738125, 1.0085179661721904,
+        1.0084934291202972, 1.0084691385966449, 1.0084450660658846, 1.0084211633243905,
+        1.0083973685519523, 1.0083736144304045, 1.008349837126096, 1.0083259848626251,
+        1.0083020249289454, 1.0082779482431699, 1.0082537709694226, 1.0082295330999784,
+        1.0082052943039828, 1.008181127654954, 1.0081571120482133, 1.0081333241934016,
+        1.0081098310248047, 1.0080866832371191, 1.00806391046113, 1.008041518378642,
+        1.0080194878711, 1.007997776124558, 1.0079763194860378, 1.0079550377832573,
+        1.0079338397727495, 1.0079126293578724, 1.0078913122056712, 1.007869802381436,
+        1.0078480286097036, 1.007825939764868, 1.0078035092024902, 1.0077807375757681,
+        1.0077576538496864, 1.0077343143332405, 1.0077107996947496, 1.0076872100954675,
+        1.0076636587542562, 1.007640264417911, 1.0076171433347019, 1.0075944013931735,
+        1.0075721270822569, 1.0075503858505757, 1.0075292163010958, 1.0075086284707606,
+        1.0074886042378626, 1.0074690997003017, 1.007450049200187, 1.0074313705533442,
+        1.0074129709858162, 1.0073947532830583, 1.0073766217113633, 1.0073584873590113,
+        1.0073402726470784, 1.0073219148582393, 1.0073033686125838, 1.0072846072749684,
+        1.0072656233097486, 1.0072464276131148, 1.0072270478623564, 1.0072075259377244,
+        1.0071879145059919, 1.0071682729092934, 1.0071486625751354, 1.007129142242874,
+        1.0071097633721287, 1.0070905661411527, 1.0070715764408844, 1.0070528042127604,
+        1.0070342433628525, 1.0070158733206955, 1.0069976621170817, 1.0069795706581364,
+        1.0069615577037379, 1.006943584945824, 1.0069256215485234, 1.0069076475681324,
+        1.0068896558135185, 1.0068716519191507, 1.0068536526537475, 1.0068356827401481,
+        1.0068177706774235, 1.0067999441996038, 1.0067822260534482, 1.0067646307209166,
+        1.0067471625588522, 1.0067298156020819, 1.0067125750126034, 1.0066954198989204,
+        1.0066783270173199, 1.0066612747352295, 1.0066442466065415, 1.0066272339842532,
+        1.0066102372637493, 1.0065932655820873, 1.006576335055901, 1.0065594658802965,
+        1.0065426787938037, 1.0065259915105498, 1.0065094157155385, 1.006492955114484,
+        1.0064766048451188, 1.006460352324141, 1.0064441793630547, 1.0064280651772406,
+        1.006411989770606, 1.0063959371254727, 1.0063798976714726, 1.0063638696387525,
+        1.0063478590959647, 1.006331878698122, 1.0063159453848176, 1.0063000774394764,
+        1.0062842914171306, 1.0062685994572262, 1.0062530074193121, 1.0062375141288376,
+        1.0062221118247556, 1.0062067876947438, 1.0061915262028054, 1.0061763117882632,
+        1.0061611314645564, 1.0061459768777619, 1.0061308454907045, 1.006115740718788,
+        1.006100671029376, 1.0060856481948623, 1.0060706850302037, 1.0060557930250222,
+        1.0060409802867312, 1.0060262501449333, 1.0060116006423403, 1.0059970249765295,
+        1.0059825127891895, 1.0059680520541359, 1.0059536312172268, 1.00593924120603,
+        1.0059248769593803, 1.0059105382195435, 1.0058962294646265, 1.0058819590120402,
+        1.0058677374677147, 1.0058535758057634, 1.005839483420996, 1.0058254664933726,
+        1.0058115269412857, 1.0057976621316191, 1.0057838653792581, 1.005770127130932,
+        1.0057564366124299, 1.0057427836434938, 1.0057291603033558, 1.005715562164068,
+        1.0057019888911563, 1.0056884441260776, 1.00567493469168, 1.0056614692779045,
+        1.0056480568504715, 1.0056347050662306, 1.0056214189692718, 1.0056082001848885,
+        1.0055950467353554, 1.0055819534893828, 1.0055689131462775, 1.005555917565451,
+        1.0055429591972982, 1.0055300323611214, 1.0055171341502405, 1.0055042648164634,
+        1.0054914275819948, 1.0054786279291177, 1.0054658725085945, 1.0054531678709437,
+        1.0054405192503788, 1.0054279296156667, 1.0054153991493164, 1.0054029252367032,
+        1.0053905029545747, 1.0053781259605477, 1.0053657876168582, 1.005353482144387,
+        1.005341205602495, 1.0053289565257637, 1.0053167361128765, 1.0053045479440779,
+        1.0052923972868066, 1.0052802901198017, 1.0052682320522357, 1.0052562273285086,
+        1.0052442780899005, 1.0052323840153254, 1.0052205423944474, 1.0052087486099246,
+        1.005196996935012, 1.005185281500509, 1.005173597259487, 1.0051619407833408,
+        1.005150310756557, 1.0051387080936627, 1.0051271356695564, 1.0051155977218849,
+        1.0051040990393476, 1.00509264408367, 1.0050812362000752, 1.0050698770509443,
+        1.0050585663643308, 1.0050473020311823, 1.0050360805230194, 1.0050248975466023,
+        1.0050137488129236, 1.005002630781413, 1.0049915412485964, 1.0049804796814539,
+        1.0049694472434885, 1.004958446516931, 1.0049474809780163, 1.0049365543241566,
+        1.0049256697754967, 1.0049148294747576, 1.0049040340890094, 1.004893282679143,
+        1.0048825728543263, 1.0048719011784915, 1.0048612637526455, 1.0048506568678834,
+        1.004840077614163, 1.0048295243402463, 1.0048189968885362, 1.0048084965693154,
+        1.0047980258848732, 1.0047875880569017, 1.0047771864430837, 1.0047668239456857,
+        1.0047565025135763, 1.0047462228202444, 1.0047359841678642, 1.0047257846271294,
+        1.0047156213818296, 1.004705491212834, 1.0046953910341507, 1.0046853183874234,
+        1.0046752718113, 1.0046652510262155, 1.0046552569088556, 1.004645291267688,
+        1.0046353564649435, 1.0046254549556437, 1.004615588826394, 1.0046057594142543,
+        1.0045959670696367, 1.0045862111003376, 1.0045764899012453, 1.0045668012419093,
+        1.0045571426574953, 1.004547511872174, 1.004537907180239, 1.0045283277194612,
+        1.0045187735915406, 1.0045092458119815, 1.004499746101612, 1.0044902765589534,
+        1.0044808392721194, 1.004471435938055, 1.0044620675539586, 1.004452734232063,
+        1.0044434351667295, 1.0044341687563623, 1.004424932856451, 1.0044157251185293,
+        1.0044065433565807, 1.0043973858792756, 1.0043882517338198, 1.0043791408233238,
+        1.0043700538817315, 1.0043609923143766, 1.0043519579342914, 1.0043429526406114,
+        1.0043339780935974, 1.0043250354394866, 1.0043161251285513, 1.0043072468528387,
+        1.0042983996096204, 1.0042895818756472, 1.0042807918597598, 1.004272027789673,
+        1.004263288184779, 1.0042545720708154, 1.0042458791033386, 1.0042372095829768,
+        1.0042285643636675, 1.0042199446723648, 1.0042113518724187, 1.0042027872107542,
+        1.0041942515902051, 1.0041857454029097, 1.0041772684497752, 1.0041688199565582,
+        1.0041603986816368, 1.0041520030964974], [4.84097581778825e-07,
+        1.4533745689396469e-06, 2.4259016860283226e-06, 3.4038606258744636e-06,
+        4.389455497018074e-06, 5.384922240141361e-06, 6.392537797199066e-06,
+        7.414629954786751e-06, 8.453587278595165e-06, 9.51186952552366e-06,
+        1.059201851789891e-05, 1.1696669599843156e-05, 1.2828563633768997e-05,
+        1.3990559816417693e-05, 1.518564921251605e-05, 1.6416969264573422e-05,
+        1.7687819290769096e-05, 1.900167712882794e-05, 2.0362217085723386e-05,
+        2.1773329252651425e-05, 2.323914049339077e-05, 2.4764037113022472e-05,
+        2.635268954317712e-05, 2.8010079202521723e-05, 2.9741527785548554e-05,
+        3.155272924038449e-05, 3.344978480061199e-05, 3.543924132120916e-05,
+        3.7528133398022694e-05, 3.97240295940042e-05, 4.203508340165082e-05,
+        4.4470089312912785e-05, 4.7038544768903286e-05, 4.975071856536054e-05,
+        5.261772659227817e-05, 5.5651615710182884e-05, 5.8865456864078706e-05,
+        6.227344848822474e-05, 6.589103162346934e-05, 6.973501811592413e-05,
+        7.38237337419917e-05, 7.8177178080733e-05, 8.28172035233002e-05,
+        8.776771587477805e-05, 9.305489969397803e-05, 9.870747157937723e-05,
+        0.00010475696578659547, 0.00011123805631551952, 0.00011818892144993189,
+        0.0001256516565650914, 0.00013367274295454615, 0.00014230358129166642,
+        0.00015160109988696346, 0.00016162845008618236, 0.0001724558031371864,
+        0.00018416126565114983, 0.00019683193456207227, 0.00021056511596762137,
+        0.00022546973819829734, 0.0002416679952620327, 0.00025929726516127653,
+        0.0002785123577977898, 0.00029948815996155576, 0.0003224227615195205,
+        0.00034754116838406335, 0.0003750997359611881, 0.00040539149338740586,
+        0.0004387525783946233, 0.000475570069354056, 0.0005162915916573733,
+        0.000561437202436303, 0.000611614236016589, 0.0006675360489670436,
+        0.0007300459773399141, 0.0008001483798932636, 0.0008790494954238883,
+        0.0009682121866815462, 0.0010694308080733486, 0.001184936048291684,
+        0.0013175458468094193, 0.001470889742825263, 0.0016497553298688186,
+        0.0018606481731026862, 0.002112748031672203, 0.0024196572286116613,
+        0.0028028871378125092, 0.0032996552654219334, 0.003983356204200878,
+        0.005032312403598572, 0.007093166725926962, 0.022854764729182714,
+        0.007640153844371612, 0.005962399592829649, 0.005482127274870969,
+        0.005386664877002816, 0.005495379918547228, 0.005748937059459517,
+        0.006127906006401491, 0.006631192658315584, 0.0072690912024635035,
+        0.008061310885796164, 0.009037320434994764, 0.010238282290569157,
+        0.011720594805966766, 0.013561538737048883, 0.01586806355735571,
+        0.018790598219036586, 0.02254531207249972, 0.027451272082155156,
+        0.03399526748409557, 0.04295132674493541, 0.05561707328787418, 0.0743260124845523,
+        0.10370600521875534, 0.15438924479022115, 0.25769345742073296, 0.5702284482610188,
+        6.313847138107146, 0.4071254696256903, 0.8917112725721819, 1.773718315517956,
+        1.066911340640053, 1.0894218941230518, 1.6314117937305979, 1.6346168013263545,
+        0.6533254754488088, 0.5646757017480043, 0.7696042314141937, 1.2922284446021706,
+        2.306395352441572, 1.9220859568134683, 1.2504775596891307, 0.9594248432254071,
+        0.8482254350937367, 0.8648961854379278, 1.0467572606856714, 1.2960262646673149,
+        1.1445634479916298, 0.9647965770331122, 0.9146630195983296, 0.9583314967930036,
+        1.0905472188595913, 1.3358427317355963, 1.6838328216401932, 1.7920688296492258,
+        1.40251000122698, 1.018705292225905, 0.7976144462956901, 0.7033417298909306,
+        0.7169421352635927, 0.8488809640569368, 1.1218007219447876, 1.4598163578930123,
+        1.5348057655461422, 1.3435098605835685, 1.1570101747483272, 1.0421570229881312,
+        1.0181898993425103, 1.0488834034389296, 1.0985449999877095, 1.1454886184062651,
+        1.158858185702488, 1.1236848068906085, 1.0590859169482378, 0.996281848948328,
+        0.9542915718264329, 0.9390882362157527, 0.9505977920021657, 0.9868297749111917,
+        1.0445731988036946, 1.1178032961916957, 1.1948213317948502, 1.2567947866855127,
+        1.2829215574972872, 1.2629772053993416, 1.2048090657050465, 1.1268069383822552,
+        1.0455980897243236, 0.9708775853089234, 0.9065183447391048, 0.8531514772777338,
+        0.8100386148866918, 0.7760621737646685, 0.7501609868411809, 0.7314862256268272,
+        0.7194328665837202, 0.7136227059594874, 0.7138729106775531, 0.7201628537604364,
+        0.7326005917717819, 0.751382973960796, 0.7767369105404057, 0.8088222381588015,
+        0.8475695616676064, 0.8924251482803979, 0.9419956158549271, 0.9936577594211156,
+        1.0433473933051138, 1.085904588379828, 1.1162836821954158, 1.1313567273550433,
+        1.13125780875575, 1.119255422596642, 1.1002849691102217, 1.0792341406494865,
+        1.0598699178666837, 1.0445340509036243, 1.0342957842478229, 1.0292486929096474,
+        1.028792434636255, 1.0318635555524098, 1.0371354146650111, 1.0432143790807118,
+        1.0488393432595935, 1.0530626702963708, 1.0553717640145792, 1.055716259967486,
+        1.0544352948763522, 1.0521140243711276, 1.049417186757394, 1.0469429378558794,
+        1.045121573885965, 1.0441650315466082, 1.0440620865171408, 1.0446107859915437,
+        1.0454795042101506, 1.046286983515557, 1.0466884336996647, 1.0464510677691607,
+        1.0455020650174387, 1.0439375658396257, 1.0419919850454245, 1.0399781629071565,
+        1.0382156212228986, 1.0369643559793091, 1.0363768327716263, 1.036474548242093,
+        1.037150249743627, 1.0381933106969587, 1.0393331180071996, 1.0402928136350906,
+        1.040843400678239, 1.0408471642630395, 1.0402809218622429, 1.0392342176351292,
+        1.0378839781587044, 1.0364529775546294, 1.035162612995725, 1.034190315893932,
+        1.033639293625431, 1.0335247231646263, 1.0337771678375156, 1.0342612815350198,
+        1.0348057089211373, 1.0352383781443406, 1.0354203336201093, 1.0352713713837793,
+        1.03478240894723, 1.03401258280108, 1.0330726819687535, 1.0320995360368426,
+        1.0312274956944516, 1.0305629656070987, 1.0301665017275121, 1.03004495889204,
+        1.0301541397921368, 1.0304106415841086, 1.0307102053537431, 1.0309488990336462,
+        1.031043037676736, 1.0309440419388105, 1.0306455285412355, 1.0301816428702284,
+        1.0296175561247383, 1.0290346298881634, 1.0285136005664979, 1.0281191391206919,
+        1.027888460551701, 1.0278256006143864, 1.0279018415042458, 1.0280617506821121,
+        1.0282334920909186, 1.0283415179628232, 1.0283194866472547, 1.028121314667864,
+        1.0277286712921894, 1.0271539081046561, 1.0264382510133052, 1.0256458822939845,
+        1.0248551297400321, 1.0241482545085467, 1.023601286122212, 1.0232750763974194,
+        1.0232083596589174, 1.0234132320038074, 1.0238731733215187, 1.0245435558740272,
+        1.0253544923656452, 1.0262158285863543, 1.0270240289876291, 1.0276705982856487,
+        1.0280515153080605, 1.028076948560795, 1.027680331718436, 1.0268257762882391,
+        1.0255128569512129, 1.0237780554324851, 1.0216925670464887, 1.0193566790523974,
+        1.0168914076390139, 1.0144284236737038, 1.0120994421649914, 1.0100261925070624,
+        1.0083118734570027, 1.00703470231038, 1.0062438635897455, 1.0059578985620998,
+        1.0061653749162636, 1.0068275354031642, 1.0078825332095545, 1.0092508076943978,
+        1.010841130045606, 1.0125568542642824, 1.0143019472908903, 1.015986442865817,
+        1.0175310590871822, 1.0188708237248287, 1.0199576440854572, 1.020761822609601,
+        1.021272548432299, 1.0214973956121107, 1.0214608487424044, 1.0212018788620605,
+        1.0207706249518145, 1.0202243049075461, 1.0196225762562396, 1.0190226708875212,
+        1.0184747143683144, 1.0180176857189855, 1.0176764617797223, 1.0174603147327823,
+        1.0173630941955079, 1.01736513703271, 1.0174367273686913, 1.0175427039712774,
+        1.0176476185686887, 1.017720727521836, 1.0177400867345792, 1.0176951349485717,
+        1.0175873853210167, 1.017429160427785, 1.0172406395377833, 1.0170457706967615,
+        1.0168677779730213, 1.016725036613965, 1.0166279964407055, 1.0165776318319906,
+        1.0165656251089934, 1.0165761944674816, 1.0165892029240535, 1.0165839726357944,
+        1.016543114243619, 1.0164556862290066, 1.0163191282212394, 1.0161396441610648,
+        1.0159310023734571, 1.015712011539389, 1.0155031657744227, 1.0153230847016363,
+        1.015185385996772, 1.0150965246254204, 1.015054941542844, 1.0150516235024363,
+        1.0150719271871695, 1.0150983056026666, 1.0151134269991013, 1.0151031210323591,
+        1.0150586335890563, 1.0149778127363698, 1.0148650568318376, 1.0147300905531065,
+        1.0145858485254713, 1.0144458980077447, 1.0143218955085611, 1.0142215407429591,
+        1.0141473772638172, 1.0140966184179343, 1.0140619832049818, 1.0140333436198123,
+        1.0139998440643354, 1.0139520779001232, 1.0138839086943288, 1.013793602990593,
+        1.0136840817429933, 1.0135622708123688, 1.013437702423995, 1.0133206556357377,
+        1.01322019972933, 1.0131425086513675, 1.0130897505198468, 1.0130597394727472,
+        1.01304639149366, 1.013040878259086, 1.013033249347947, 1.0130142143836929,
+        1.0129767560053107, 1.0129172849011585, 1.012836141133765, 1.0127373730970226,
+        1.0126278614713449, 1.0125159739624743, 1.012410015375219, 1.012316763611071,
+        1.0122403534365245, 1.0121816946980033, 1.012138506190306, 1.0121059309399423,
+        1.0120775941033837, 1.0120468891278576, 1.0120082439368332, 1.0119581318212107,
+        1.0118956480105938, 1.0118225609858236, 1.0117428498641146, 1.011661835593225,
+        1.0115850859699465, 1.0115173099167931, 1.0114614500781258, 1.0114181378887355,
+        1.0113856019561758, 1.0113600334781698, 1.0113363277277692, 1.0113090535002076,
+        1.0112734644233772, 1.0112263633874736, 1.0111666637582815, 1.0110955516914497,
+        1.0110162306633774, 1.0109333072847444, 1.0108519417601813, 1.0107769253879402,
+        1.0107118550218879, 1.0106585504700056, 1.010616811205027, 1.010584543636245,
+        1.0105582218780285, 1.0105335857963667, 1.0105064404199116, 1.0104734071535435,
+        1.0104324914110125, 1.0103833699448277, 1.0103273564392201, 1.0102670650012349,
+        1.0102058463753603, 1.010147110882028, 1.0100936685721404, 1.010047208814787,
+        1.0100080111067549, 1.009974932820258, 1.0099456668842557, 1.0099172127955502,
+        1.0098864667302603, 1.009850817331032, 1.0098086359754916, 1.0097595730236169,
+        1.0097046099690197, 1.0096458640069874, 1.0095861873512457, 1.0095286401658963,
+        1.0094759367744583, 1.0094299666212738, 1.0093914747073012, 1.009359954679671,
+        1.0093337676813767, 1.0093104589658846, 1.0092872095432814, 1.0092613377729713,
+        1.0092307595086396, 1.0091943258242486, 1.0091519821416148, 1.009104726791317,
+        1.0090543840984392, 1.0090032400848998, 1.0089536119076954, 1.0089074313759017,
+        1.0088659171859042, 1.008829391531817, 1.0087972684515818, 1.008768209110286,
+        1.008740409109673, 1.0087119601742405, 1.0086812170438286, 1.0086471018295855,
+        1.0086092918153904, 1.0085682598372834, 1.0085251644240052, 1.0084816145297595,
+        1.0084393558802898, 1.008399938815913, 1.0083644290461122, 1.008333213072532,
+        1.0083059313466216, 1.008281548186416, 1.0082585425690205, 1.0082351826140217,
+        1.0082098325669142, 1.008181236665409, 1.0081487299438419, 1.0081123404934866,
+        1.0080727680902486, 1.0080312465681205, 1.0079893177402877, 1.0079485594429545,
+        1.0079103169515242, 1.0078754847035767, 1.0078443747132222, 1.0078166914620743,
+        1.0077916135640002, 1.0077679636647998, 1.0077444331481638, 1.0077198197641979,
+        1.0076932355540251, 1.0076642492902688, 1.0076329406199955, 1.007599859668102,
+        1.0075659029525403, 1.0075321310075807, 1.0074995626074033, 1.00746898343008,
+        1.0074408031288478, 1.007414985028676, 1.0073910589787916, 1.0073682128125023,
+        1.0073454440829492, 1.0073217436216322, 1.0072962776532635, 1.0072685363654523,
+        1.0072384235810676, 1.0072062731554583, 1.0071727908633494, 1.0071389334820722,
+        1.007105747271668, 1.0070741943648769, 1.0070449967780228, 1.007018523829521,
+        1.0069947405789816, 1.0069732240373803, 1.0069532422942074, 1.0069338813497757,
+        1.0069141970251827, 1.0068933659793629, 1.006870810994078, 1.006846280923464,
+        1.0068198739987724, 1.006792003010659, 1.006763310547164, 1.0067345503414313,
+        1.006706455652966, 1.0066796168118295, 1.0066543875838525, 1.0066308344629467,
+        1.0066087354309152, 1.0065876264780644, 1.0065668866133481, 1.006545846382929,
+        1.0065239018662404, 1.0065006160597758, 1.0064757923232954, 1.0064495095444548,
+        1.006422114955174, 1.0063941770447222, 1.0063664067390028, 1.0063395591374962,
+        1.0063143301230395, 1.0062912619626585, 1.0062706698335036, 1.0062525975522423,
+        1.0062368063446248, 1.0062227959901386, 1.0062098537627329, 1.00619712373907,
+        1.0061836875131356, 1.0061686471585032, 1.0061512022313293, 1.0061307143781988,
+        1.0061067553051373, 1.0060791360894938, 1.0060479177617643, 1.0060134045527802,
+        1.0059761221270198, 1.0059367835557613, 1.0058962458571736, 1.0058554598137557,
+        1.0058154156286088, 1.00577708691115, 1.0057413755304891, 1.0057090600092864,
+        1.0056807502649912, 1.0056568515230084, 1.0056375400168358, 1.005622752578747,
+        1.0056121913946319, 1.0056053440980384, 1.0056015181215547, 1.0055998869610467,
+        1.0055995449062638, 1.005599566001986, 1.0055990626356326, 1.005597239249345,
+        1.0055934372274806, 1.005587167933397, 1.0055781320354644, 1.0055662245215626,
+        1.005551526007353, 1.0055342819741986, 1.0055148723467209, 1.0054937743030377,
+        1.0054715214109835, 1.0054486621418877, 1.0054257205861423, 1.00540316183923,
+        1.0053813640884244, 1.0053605989356103, 1.0053410209510025, 1.0053226668640687,
+        1.0053054641625205, 1.0052892481986877, 1.0052737862278782, 1.0052588061807983,
+        1.0052440274766408, 1.0052291908972066, 1.0052140845390052, 1.0051985631861922,
+        1.0051825591070054, 1.0051660832224798, 1.0051492167296918, 1.0051320944417141,
+        1.0051148821693838, 1.0050977512559727, 1.0050808537550815, 1.0050643016397032,
+        1.0050481528426294, 1.005032405927239, 1.0050170039134383, 1.0050018464244803,
+        1.004986808084076, 1.0049717601729862, 1.004956592097048, 1.0049412292996154,
+        1.004925644859843, 1.004909863058538, 1.0048939544981057, 1.0048780237219195,
+        1.0048621914712779, 1.0048465745523727, 1.0048312666284607, 1.0048163230520257,
+        1.0048017521466224, 1.0047875142593374, 1.0047735286159312, 1.0047596867359376,
+        1.0047458701140368, 1.0047319692165904, 1.00471790068054, 1.004703619954416,
+        1.0046891274207252, 1.004674467144886, 1.004659718619441, 1.004644983008556,
+        1.0046303662607339, 1.0046159619109873, 1.0046018363720424, 1.004588019033224,
+        1.0045744986367275, 1.004561226334266, 1.004548124724721, 1.0045351012184116,
+        1.004522063419174, 1.004508933960441, 1.0044956624052783, 1.0044822323806555,
+        1.0044686629572692, 1.0044550042601195, 1.0044413282360585, 1.004427716259054,
+        1.0044142457045415, 1.0044009777085585, 1.004387948045898, 1.0043751624755284,
+        1.0043625971195576, 1.004350203600703, 1.0043379179028806, 1.0043256713608488,
+        1.0043134019099533, 1.0043010637678333, 1.0042886340547934, 1.0042761154198478,
+        1.0042635344234452, 1.0042509361184395, 1.0042383758565485, 1.004225909739896,
+        1.0042135852840706, 1.0042014337513485, 1.0041894652823722, 1.0041776674674443,
+        1.004166007441155, 1.004154437047709, 1.0041429001905648, 1.0041313412078545,
+        1.0041197130335755, 1.0041079840101945, 1.0040961424792578, 1.0040841986394817,
+        1.0040721835633557, 1.0040601456409906, 1.0040481450220693, 1.0040362468200812,
+        1.0040245139146655, 1.00401300014642, 1.004001744567381, 1.0039907672236623,
+        1.0039800667400365, 1.0039696197809287, 1.0039593823007222, 1.003949292378791,
+        1.0039392743610334, 1.0039292439910423, 1.0039191141972819, 1.0039088011950845,
+        1.0038982305551392, 1.0038873428810342, 1.003876098731809, 1.0038644824305782,
+        1.003852504429174, 1.0038402019611385, 1.0038276378166509, 1.003814897210557,
+        1.0038020828778884, 1.0037893087022824, 1.0037766923389604, 1.0037643474125646,
+        1.0037523759317648, 1.0037408615553323, 1.0037298642665051, 1.0037194168725458,
+        1.0037095235627567, 1.0037001605551916, 1.0036912786668788, 1.0036828074790882,
+        1.0036746606563285, 1.0036667419248932, 1.003658951223149, 1.003651190591589,
+        1.0036433694596556, 1.0036354090889825, 1.0036272460305111, 1.0036188345324568,
+        1.0036101478898698, 1.0036011787559365, 1.0035919384473617, 1.0035824552831638,
+        1.0035727720105643, 1.0035629424033417, 1.0035530271711846, 1.0035430893899733,
+        1.0035331897420496, 1.00352338192597, 1.0035137086386687, 1.0035041985321431,
+        1.0034948644910067, 1.0034857034640186, 1.0034766979208574, 1.0034678188135764,
+        1.003459029727196, 1.003450291735995, 1.0034415683702456, 1.0034328300643753,
+        1.0034240575125932, 1.0034152434988315, 1.003406392976975, 1.0033975214253836,
+        1.0033886517492936, 1.0033798102172928, 1.0033710220590126, 1.0033623073974143,
+        1.0033536781313013, 1.003345136230314, 1.0033366736789942, 1.0033282740442566,
+        1.0033199153838175, 1.0033115740030292, 1.0033032284381578, 1.003294863016132,
+        1.0032864704182303, 1.003278052844854, 1.0032696216119135, 1.0032611952675758,
+        1.0032527965585156, 1.00324444875784, 1.003236171963022, 1.0032279799667019,
+        1.0032198781983608, 1.003211863049657, 1.003203922662481, 1.003196039016641,
+        1.0031881909436, 1.0031803575488842, 1.0031725214711429, 1.0031646714478444,
+        1.0031568037872294, 1.0031489225395736, 1.0031410383842108, 1.0031331664635232,
+        1.0031253235652882, 1.0031175251524267, 1.0031097827496274, 1.0031021021197823,
+        1.003094482514997, 1.0030869170940995, 1.003079394395313, 1.0030719005740532,
+        1.0030644219919242, 1.0030569476936113, 1.0030494713403957, 1.0030419922747678,
+        1.0030345155500329, 1.0030270509431323, 1.0030196111455012, 1.0030122094654679,
+        1.0030048574531434, 1.0029975628632517, 1.0029903283036277, 1.002983150790808,
+        1.00297602227234, 1.0029689310071428, 1.0029618635496371, 1.0029548069851855,
+        1.0029477510293545, 1.0029406896362396, 1.0029336218542924, 1.0029265518038377,
+        1.0029194878046281, 1.0029124408267838, 1.002905422549739, 1.0028984433728567,
+        1.0028915107193654, 1.002884627914333, 1.0028777938094982, 1.0028710031932517,
+        1.0028642478866818, 1.0028575183106823, 1.0028508052338867, 1.0028441013889293,
+        1.0028374026773885, 1.0028307087645993, 1.0028240229787624, 1.002817351553843,
+        1.0028107023702864, 1.002804083431878, 1.0027975013572166, 1.0027909601543135,
+        1.0027844604899299, 1.0027779995726203, 1.0027715716572168, 1.002765169068728,
+        1.0027587835544707, 1.0027524077198626, 1.0027460362941503, 1.0027396670078164,
+        1.0027333009362966, 1.0027269422611356, 1.0027205975023552, 1.0027142743666222,
+        1.0027079804189551, 1.0027017218111969, 1.0026955022846002, 1.002689322610593,
+        1.0026831805533927, 1.002677071345347, 1.0026709885772709, 1.0026649253369182,
+        1.0026588753906502, 1.002652834202081, 1.002646799616293, 1.0026407721017783,
+        1.0026347545230185, 1.002628751499624, 1.002622768478702, 1.002616810693753,
+        1.0026108821980801, 1.002604985142042, 1.0025991194155308, 1.002593282709074,
+        1.0025874709714675, 1.0025816791722184, 1.0025759022255363, 1.0025701359075299,
+        1.0025643776035862, 1.0025586267566797, 1.0025528849431145, 1.0025471555694303,
+        1.0025414432509663, 1.002535752987069, 1.002530089281006, 1.002524455359009,
+        1.0025188526221103, 1.0025132804208658, 1.0025077361848973, 1.0025022158768162,
+        1.002496714684789, 1.0024912278288187, 1.0024857513394878, 1.0024802826765082,
+        1.0024748210856902, 1.0024693676411103, 1.0024639249750853, 1.0024584967525236,
+        1.0024530869886417, 1.0024476993331657, 1.002442336446056, 1.002436999569947,
+        1.002431688366979, 1.0024264010394337, 1.0024211347034504, 1.0024158859417764,
+        1.0024106514323734, 1.0024054285395219, 1.0024002157639105, 1.0023950129759722,
+        1.0023898213968798, 1.0023846433370065, 1.0023794817440506, 1.0023743396450886,
+        1.0023692195834966, 1.0023641231501055, 1.0023590506891835, 1.0023540012274659,
+        1.0023489726344437, 1.0023439619817767, 1.0023389660357875, 1.002333981795511,
+        1.0023290069828403, 1.0023240404018106, 1.0023190821084498, 1.0023141333666004,
+        1.002309196402371, 1.0023042740039445, 1.0022993690386766, 1.002294483971453,
+        1.002289620465744, 1.0022847791322715, 1.0022799594630978, 1.0022751599561945,
+        1.0022703784028621, 1.0022656122834712, 1.00226085920022, 1.0022561172715687,
+        1.0022513854220048, 1.0022466635209377, 1.0022419523518535, 1.0022372534227084,
+        1.0022325686555407, 1.002227900012882, 1.0022232491278507, 1.0022186170021352,
+        1.0022140038226857, 1.0022094089260662, 1.0022048309132863, 1.002200267892038,
+        1.002195717801975, 1.0021911787656008, 1.0021866494042533, 1.002182129066072,
+        1.0021776179288917, 1.0021731169629666, 1.0021686277622563, 1.0021641522748375,
+        1.0021596924789586, 1.0021552500592024, 1.0021508261356988, 1.002146421089317,
+        1.0021420345087242, 1.0021376652646914, 1.0021333116960132, 1.0021289718739093,
+        1.0021246439000564, 1.0021203261894955, 1.0021160176937711, 1.0021117180308412,
+        1.0021074275044581, 1.0021031470141015, 1.0020988778739182, 1.0020946215730089,
+        1.0020903795174272, 1.002086152795606, 1.0020819420035578, 1.0020777471553732,
+        1.0020735676901038, 1.0020694025706658, 1.002065250456288], [2.101052586014986e-07,
+        6.308123704076828e-07, 1.0530114821320923e-06, 1.4777043925014383e-06,
+        1.9059036064558405e-06, 2.338636823753357e-06, 2.776951330848025e-06,
+        3.221918699600618e-06, 3.674639542780128e-06, 4.136248497803331e-06,
+        4.607919435616484e-06, 5.090870950860993e-06, 5.586372118894519e-06,
+        6.095748645929209e-06, 6.620389372217081e-06, 7.161753246152804e-06,
+        7.72137677964783e-06, 8.30088205939796e-06, 8.90198539011723e-06,
+        9.526506601930722e-06, 1.017637916437968e-05, 1.0853661117002122e-05,
+        1.1560546972463927e-05, 1.2299380670411619e-05, 1.3072669702497245e-05,
+        1.3883100532989201e-05, 1.4733555486542832e-05, 1.562713122386947e-05,
+        1.6567159029039085e-05, 1.7557227062545427e-05, 1.860120487204718e-05,
+        1.9703270336586837e-05, 2.0867939400485188e-05, 2.2100098864051404e-05,
+        2.34050426338813e-05, 2.478851179946098e-05, 2.6256739035802628e-05,
+        2.7816497806486234e-05, 2.9475157004470658e-05, 3.1240741637057545e-05,
+        3.312200037008566e-05, 3.512848072333315e-05, 3.727061295417369e-05,
+        3.9559803675848736e-05, 4.2008540547409556e-05, 4.4630509365652404e-05,
+        4.7440725387813814e-05, 5.0455680539610034e-05, 5.369350894156026e-05,
+        5.71741730096387e-05, 6.0919673157213454e-05, 6.495428436174878e-05,
+        6.930482336398962e-05, 7.400095100671505e-05, 7.907551478250094e-05,
+        8.45649374928499e-05, 9.050965906879186e-05, 9.695463941746049e-05,
+        0.0001039499318813384, 0.00011155133819770684, 0.00011982115787774822,
+        0.0001288290472027631, 0.00013865300565415946, 0.00014938051082917587,
+        0.00016110982675980335, 0.0001739515152419903, 0.00018803018521032903,
+        0.000203486522054299, 0.0002204796470146283, 0.00023918986650412928,
+        0.00025982188347065864, 0.0002826085577073708, 0.00030781532034132976,
+        0.0003357453696786724, 0.0003667458039144615, 0.00040121487991316327,
+        0.00043961063093493125, 0.00048246112875037614, 0.0005303767434900719,
+        0.0005840648399563894, 0.0006443474556400236, 0.0007121826441171018,
+        0.000788690343108149, 0.0008751838524626835, 0.0009732083016571975,
+        0.0010845878679587185, 0.001211484008961446, 0.0013564676346063066,
+        0.0015226090241065291, 0.0017135904762442971, 0.0019338482700194063,
+        0.002188752689771927, 0.0024848378507929757, 0.002830097208318767,
+        0.003234366446565525, 0.0037098237054790425, 0.004271648948029146,
+        0.004938901556172177, 0.005735700728589714, 0.00669283154947435,
+        0.00784995805700844, 0.009258715687330023, 0.010987100279525538,
+        0.01312580686819585, 0.015797566557447597, 0.019171212039678937,
+        0.023483422593432873, 0.02907337365255981, 0.03643996415365704,
+        0.04634051173258075, 0.05997029271083, 0.07931200665563787, 0.10787915541483929,
+        0.15250275306407154, 0.22846927034460443, 0.3793111342261624, 0.8141108199949787,
+        8.041519305814752, 0.15075191873170707, 1.738027923751271, 3.196689307746941,
+        1.7367776590919988, 1.493329200206657, 1.4240937910282268, 0.377817251485686,
+        1.5566636749142009, 2.4903733491670663, 4.944142696520038, 7.761162713971286,
+        5.942430368496038, 3.1127852830043463, 1.4605980680983255, 0.9701672809918545,
+        0.9548154232754253, 1.2565706280158282, 1.93436681544438, 2.6979679425075567,
+        2.335651035882205, 1.7803371561423924, 1.4880187540952898, 1.3753280840118767,
+        1.3947515325501059, 1.545461258515289, 1.7993667123704902, 1.8250193642201744,
+        1.425447461460515, 1.0949019961671675, 0.9534021181211367, 0.9482422038909971,
+        1.053116734638993, 1.2777480432977584, 1.641891913345645, 2.0187957402567918,
+        1.9849726459982044, 1.6239456250510007, 1.3115081660879933, 1.112309906570387,
+        1.073041726518166, 1.1175245386984793, 1.1893057205528386, 1.2661768784610314,
+        1.3104940564054057, 1.2982029246202986, 1.2445508068907507, 1.1834161756309363,
+        1.138176957045638, 1.1179314832136362, 1.1242878684273414, 1.1559568541573637,
+        1.2097446609134677, 1.2790259956611776, 1.3508771845549699, 1.404876324284503,
+        1.4191525314573628, 1.3840134823992722, 1.3093586759739528, 1.2157737116286795,
+        1.121155452275839, 1.0355136807092424, 0.9625109337511375, 0.9023989123738781,
+        0.8540690482324694, 0.8161051542661526, 0.7872283282386839, 0.7664430682272413,
+        0.7530546219949926, 0.7466391037469909, 0.747001973767268, 0.7541375948678515,
+        0.7681904153533126, 0.7894104418182307, 0.8180886235919382, 0.854449843817362,
+        0.8984730297377246, 0.9496056596334315, 1.0063615987905452, 1.0658705694700037,
+        1.1236134653858507, 1.1737665616838597, 1.2105161654785237, 1.230072717506922,
+        1.232229676850317, 1.2203139764955424, 1.1996226846070757, 1.1755329952300582,
+        1.1522865735554282, 1.1326171057398435, 1.1178927019940141, 1.1084287613115111,
+        1.1037906222167857, 1.1030407082069724, 1.1049480624949797, 1.108188394178059,
+        1.1115437099911574, 1.114081860353896, 1.1152772084773481, 1.115038759752745,
+        1.1136405929665727, 1.1115832204215048, 1.1094326610748704, 1.1076795725620199,
+        1.106642726940087, 1.1064229929370752, 1.1069033857759794, 1.1077873288384246,
+        1.1086666686668731, 1.1091091814486629, 1.108751192647933, 1.1073767764493536,
+        1.1049649015223206, 1.101692592482127, 1.0978943233223055, 1.0939902287848733,
+        1.0904027633160471, 1.087481055651381, 1.0854464861522983, 1.0843658536878282,
+        1.084152753875643, 1.0845941054037256, 1.0853962390323428, 1.086242576355748,
+        1.086852602093146, 1.0870306556505787, 1.086694483017181, 1.0858780424186347,
+        1.084709594325924, 1.0833722267659114, 1.082057449120169, 1.0809225510875953,
+        1.0800598696477233, 1.0794824527694395, 1.0791270781629356, 1.0788726708942844,
+        1.0785698370211425, 1.0780754325089479, 1.0772850641837275, 1.0761566697950546,
+        1.0747201959785455, 1.0730716508429305, 1.0713535410214299, 1.0697267139621223,
+        1.068340044617747, 1.0673040780822483, 1.0666731536844298, 1.0664384171764962,
+        1.0665320466812924, 1.0668412410671293, 1.0672291048477798, 1.0675585527451756,
+        1.0677148904278067, 1.0676230057232314, 1.0672562237097198, 1.0666356755268336,
+        1.0658210613209642, 1.0648953909234382, 1.0639472266419123, 1.063053993736415,
+        1.0622692283794903, 1.061615525351388, 1.061083749492399, 1.060638003356318,
+        1.0602250047052242, 1.0597859649920922, 1.0592688034746103, 1.0586386099117715,
+        1.057884684487803, 1.0570231763392328, 1.0560951749327956, 1.0551608967210553,
+        1.054291181004789, 1.053557764796605, 1.0530237485671823, 1.0527353796526993,
+        1.0527158938480063, 1.0529617843626318, 1.0534415844199982, 1.0540970768437656,
+        1.0548467592961763, 1.05559135050009, 1.0562210686620572, 1.056624309252863,
+        1.056697183420471, 1.056353174110978, 1.0555319815873112, 1.0542065394697022,
+        1.052387255212135, 1.050122795793889, 1.0474971724884414, 1.044623392623947,
+        1.0416344244021716, 1.0386725555543346, 1.035878355769414, 1.0333803760307831,
+        1.0312864868086202, 1.0296774484926872, 1.02860299468197, 1.028080441602732,
+        1.0280956355487538, 1.0286059125599805, 1.0295446571100468, 1.0308269958119307,
+        1.0323561409486928, 1.0340299070318903, 1.035746964638545, 1.0374124696352691,
+        1.0389428048588447, 1.0402692792378616, 1.0413407255936566, 1.0421250053882047,
+        1.0426094591293527, 1.042800341722149, 1.0427212712056826, 1.0424107202374386,
+        1.0419186109087186, 1.041302141431721, 1.040621069534832, 1.039932781681289,
+        1.0392875637330767, 1.0387245337007645, 1.0382686843195357, 1.0379294054551875,
+        1.0377007160574852, 1.0375632433252986, 1.0374877621813001, 1.0374398795784252,
+        1.0373852527322176, 1.0372946096133278, 1.037147830459088, 1.0369364697364445,
+        1.0366643397996915, 1.0363461001495684, 1.0360041362133114, 1.0356642992393088,
+        1.0353512577242616, 1.0350842512604932, 1.034873940993135, 1.0347208431191721,
+        1.0346155538991337, 1.0345406726404553, 1.0344740487555926, 1.0343927624145197,
+        1.0342771308495589, 1.0341140371380115, 1.033899009078784, 1.03363671183797,
+        1.033339814869913, 1.0330264917845606, 1.0327170516238076, 1.032430336597092,
+        1.032180534592551, 1.0319749509532634, 1.0318130902243279, 1.0316871541365074,
+        1.0315838102339987, 1.031486867513628, 1.031380346202821, 1.0312513731110382,
+        1.0310923819083597, 1.0309022408893016, 1.030686141911386, 1.030454321229441,
+        1.030219898366191, 1.029996271285694, 1.0297945686328962, 1.0296216263038431,
+        1.0294788386830167, 1.0293620609317928, 1.0292625413962329, 1.0291686774263538,
+        1.0290682450102073, 1.0289506764473506, 1.0288089635376938, 1.0286408452249411,
+        1.028449082254775, 1.0282407985825333, 1.0280260446107958, 1.0278158766167076,
+        1.0276203245317812, 1.0274466250052001, 1.0272980318345675, 1.0271733974050266,
+        1.0270675709070145, 1.0269725092112176, 1.0268788705776186, 1.0267777811699093,
+        1.0266624429145716, 1.0265292914885125, 1.0263785066559439, 1.0262138050595504,
+        1.026041582444521, 1.025869591401925, 1.025705419818177, 1.025555061133954,
+        1.0254218381932918, 1.025305866349527, 1.0252041348986243, 1.0251111693834745,
+        1.0250201319602814, 1.0249241411787058, 1.0248175589963096, 1.024697006787293,
+        1.0245619299748991, 1.0244146209056055, 1.024259713771937, 1.024103263412486,
+        1.0239515931521717, 1.023810132614185, 1.0236824596958851, 1.0235697150192682,
+        1.0234704824700607, 1.0233811407506552, 1.0232966046581176, 1.0232113063638664,
+        1.0231202280509843, 1.0230197941277523, 1.022908463598351, 1.0227869241637593,
+        1.0226578670372104, 1.022525400148243, 1.0223942224189695, 1.0222687213783745,
+        1.0221521642173093, 1.0220461284822084, 1.0219502688290156, 1.0218624508271326,
+        1.0217792141796378, 1.021696468379031, 1.0216102841422274, 1.0215176305951577,
+        1.021416922871248, 1.0213082841297358, 1.0211934820135513, 1.0210755612725426,
+        1.0209582498914591, 1.0208452553607643, 1.0207395840118492, 1.0206430075450625,
+        1.0205557696942582, 1.0204765790064911, 1.02040288008284, 1.0203313452102067,
+        1.0202584900641931, 1.0201812976064426, 1.0200977364645445, 1.0200070829977357,
+        1.0199099951411055, 1.0198083333281105, 1.0197047702843836, 1.0196022686459016,
+        1.0195035266432668, 1.0194104942159774, 1.0193240452810948, 1.0192438602838592,
+        1.0191685329180735, 1.019095873592361, 1.0190233472933512, 1.0189485610316942,
+        1.0188697097324526, 1.018785899934062, 1.0186972955967335, 1.0186050646958105,
+        1.0185111424639244, 1.0184178601918346, 1.0183275114563588, 1.0182419366721915,
+        1.0181622008527182, 1.0180884200941795, 1.0180197635812303, 1.0179546253581853,
+        1.0178909296831573, 1.0178265108563234, 1.0177594968633148, 1.0176886277381059,
+        1.0176134535628125, 1.0175343805723145, 1.0174525623408945, 1.01736966112943,
+        1.0172875270514743, 1.0172078558590563, 1.0171318878251798, 1.017060200551199,
+        1.0169926297282672, 1.016928327649689, 1.0168659441319823, 1.0168038929705605,
+        1.0167406528540688, 1.0166750470939403, 1.0166064521203302, 1.016534899135253,
+        1.0164610537240706, 1.0163860807252445, 1.016311422105831, 1.0162385303597397,
+        1.016168606577906, 1.0161023899421338, 1.0160400347321812, 1.0159810942123502,
+        1.0159246111639815, 1.0158692959193856, 1.015813757846109, 1.0157567478295186,
+        1.0156973686859385, 1.015635217474874, 1.01557043687659, 1.0155036696163022,
+        1.015435927233502, 1.015368399214471, 1.0153022381063148, 1.0152383592011776,
+        1.0151772894483864, 1.0151190903779987, 1.0150633659590371, 1.0150093510418137,
+        1.0149560620599252, 1.0149024813801872, 1.0148477417521655, 1.0147912784005215,
+        1.0147329230301259, 1.014672925008721, 1.0146118981864034, 1.0145507048201203,
+        1.0144902986330087, 1.014431555406484, 1.0143751207367615, 1.0143213006775007,
+        1.0142700128125672, 1.0142208044268892, 1.0141729328254967, 1.0141254924909218,
+        1.0140775663701467, 1.0140283752785164, 1.0139774006007447, 1.0139244607812543,
+        1.013869730472037, 1.013813701113063, 1.0137570914322762, 1.0137007242560774,
+        1.0136453908847616, 1.0135917254521702, 1.0135401091461287, 1.0134906185209644,
+        1.0134430244634418, 1.0133968400235345, 1.013351407667004, 1.0133060107292973,
+        1.013259990761243, 1.013212852389775, 1.013164340101624, 1.013114476383785,
+        1.0130635569923112, 1.0130121057010921, 1.0129607966736571, 1.0129103567817497,
+        1.0128614622628003, 1.0128146439399124, 1.0127702130559126, 1.0127282161150164,
+        1.012688422671314, 1.0126503454822815, 1.0126132885099026, 1.0125764153818395,
+        1.0125388293746533, 1.0124996557695771, 1.0124581183728567, 1.0124136037563314,
+        1.0123657089603904, 1.0123142706217696, 1.0122593754293971, 1.01220135327513,
+        1.012140755387885, 1.0120783201705712, 1.012014929533332, 1.011951558404363,
+        1.0118892199590288, 1.011828909049327, 1.0117715463785075, 1.0117179261167495,
+        1.011668669804056, 1.011624189417948, 1.0115846622838407, 1.0115500199988814,
+        1.0115199527084051, 1.011493928967982, 1.0114712301539939, 1.0114509971058976,
+        1.0114322855614493, 1.0114141261360465, 1.0113955842090965, 1.0113758151644319,
+        1.011354110970108, 1.0113299349951452, 1.0113029431205218, 1.0112729904590947,
+        1.0112401242075966, 1.0112045641907952, 1.011166673442079, 1.0111269216610668,
+        1.011085844605032, 1.011044002447349, 1.0110019399283436, 1.0109601507883756,
+        1.0109190485541804, 1.010878945272567, 1.01084003926028, 1.0108024123616621,
+        1.010766036577255, 1.0107307892564612, 1.010696475369203, 1.0106628547402556,
+        1.01062967162163, 1.0105966836757765, 1.0105636874206378, 1.01053053749404,
+        1.0104971577356905, 1.010463543013259, 1.0104297518365366, 1.0103958909701445,
+        1.0103620943072098, 1.01032849904431, 1.0102952225716437, 1.0102623433871738,
+        1.0102298887556247, 1.0101978308348358, 1.0101660917236983, 1.0101345565361963,
+        1.0101030923825838, 1.0100715702348415, 1.0100398862154847, 1.0100079789512348,
+        1.0099758402636039, 1.0099435175303455, 1.0099111073754508, 1.009878741719176,
+        1.009846568421625, 1.0098147295904036, 1.0097833409612265, 1.0097524755488407,
+        1.0097221540435208, 1.009692343318254, 1.0096629630989988, 1.0096338995513263,
+        1.009605023463005, 1.009576210025296, 1.0095473570391882, 1.0095183987159229,
+        1.0094893130367664, 1.0094601217441261, 1.0094308832653318, 1.0094016800155736,
+        1.0093726024004988, 1.0093437323043493, 1.0093151288400803, 1.0092868186686672,
+        1.0092587923567398, 1.0092310071847956, 1.0092033957249287, 1.009175878560111,
+        1.009148378870097, 1.0091208363605713, 1.0090932181913579, 1.0090655251238347,
+        1.009037791950573, 1.009010082243575, 1.0089824783949028, 1.0089550686714406,
+        1.008927933446544, 1.0089011328435642, 1.0088746977308554, 1.0088486254072861,
+        1.0088228805210429, 1.008797400910526, 1.0087721072857394, 1.0087469151032955,
+        1.008721746710524, 1.008696541876422, 1.0086712651670344, 1.0086459091915039,
+        1.0086204934395782, 1.0085950591338184, 1.0085696611176167, 1.0085443582040532,
+        1.00851920356762, 1.0084942366612932, 1.0084694778171575, 1.008444926205408,
+        1.0084205612707615, 1.0083963472287407, 1.0083722397686672, 1.0083481938349734,
+        1.0083241712729045, 1.0083001472254367, 1.0082761144239154, 1.0082520848719398,
+        1.0082280888176554, 1.0082041712812488, 1.0081803867006733, 1.0081567924464303,
+        1.0081334420230041, 1.0081103787291539, 1.0080876304152933, 1.0080652057880664,
+        1.0080430925055464, 1.0080212571126705, 1.0079996467078436, 1.0079781921181359,
+        1.007956812291751, 1.0079354195831423, 1.0079139255948915, 1.0078922472381293,
+        1.0078703126708828, 1.0078480667685275, 1.0078254757769773, 1.0078025308062937,
+        1.0077792498523446, 1.0077556780965757, 1.0077318863343883, 1.0077079675187424,
+        1.0076840315666358, 1.0076601987445777, 1.0076365921024708, 1.0076133295407956,
+        1.007590516154413, 1.0075682374859174, 1.0075465542407382, 1.007525498873699,
+        1.0075050742711649, 1.0074852545485193, 1.0074659877866767, 1.0074472003682264,
+        1.0074288024618145, 1.0074106941520076, 1.0073927717202726, 1.0073749336408158,
+        1.0073570859463712, 1.0073391467239616, 1.0073210496003853, 1.0073027461582214,
+        1.007284207277934, 1.007265423431445, 1.0072464039647386, 1.007227175413533,
+        1.0072077789095972, 1.0071882667660133, 1.007168698381711, 1.0071491356759699,
+        1.007129638341673, 1.007110259275633, 1.007091040587004, 1.0070720105832873,
+        1.0070531820772455, 1.0070345522444055, 1.0070161040988648, 1.0069978094633425,
+        1.0069796331147416, 1.0069615376192327, 1.0069434882599637, 1.0069254574279514,
+        1.0069074279032255, 1.0068893945956472, 1.00687136452553, 1.006853355073575,
+        1.0068353907802314, 1.006817499187755, 1.0067997063590657, 1.0067820327530748,
+        1.0067644900770185, 1.0067470795811344, 1.0067297920331582, 1.0067126093455045,
+        1.0066955075690276, 1.0066784607551695, 1.0066614450575513, 1.0066444424152206,
+        1.0066274432371078, 1.0066104476774824, 1.0065934653266457, 1.0065765134008127,
+        1.006559613757247, 1.0065427892454706, 1.0065260600031516, 1.0065094403011852,
+        1.006492936438665, 1.0064765460039784, 1.0064602585849525, 1.0064440577690343,
+        1.006427924064065, 1.006411838226359, 1.0063957844280822, 1.006379752737859,
+        1.0063637405180055, 1.0063477525350355, 1.0063317998031067, 1.0063158973942459,
+        1.006300061618618, 1.006284307074641, 1.0062686440779598, 1.0062530769003248,
+        1.00623760309983, 1.0062222140298458, 1.0062068964096798, 1.0061916346606703,
+        1.0061764135873739, 1.0061612209345119, 1.0061460493832468, 1.0061308976574181,
+        1.0061157705713863, 1.0061006780372344, 1.006085633227374, 1.0060706502288614,
+        1.0060557416043583, 1.006040916280035, 1.0060261781133242, 1.0060115253671424,
+        1.0059969511549387, 1.0059824447519943, 1.0059679935219086, 1.0059535851081205,
+        1.005939209504377, 1.0059248606499471, 1.0059105372878887, 1.0058962429597673,
+        1.0058819851638994, 1.0058677738487234, 1.0058536195237728, 1.0058395313293766,
+        1.0058255154038707, 1.0058115738258733, 1.0057977043010802, 1.0057839006284908,
+        1.0057701538436936, 1.005756453821352, 1.0057427910443546, 1.0057291582256744,
+        1.0057155515028295, 1.0057019710067499, 1.005688420721186, 1.0056749076748506,
+        1.005661440623786, 1.0056480284662876, 1.0056346786730088, 1.0056213960047824,
+        1.0056081817333098, 1.0055950334865027, 1.005581945728113, 1.0055689107705381,
+        1.0055559201295512, 1.005542965975428, 1.005530042425064, 1.0055171464546175,
+        1.005504278284774, 1.0054914411871203, 1.0054786407627931, 1.0054658838355615,
+        1.005453177164906, 1.0054405262104624, 1.0054279341636463, 1.0054154014093166,
+        1.0054029255003376, 1.0053905016354225, 1.0053781235424653, 1.0053657846008464,
+        1.005353478998566, 1.0053412027192354, 1.00532895418922, 1.0053167344791452,
+        1.0053045470350452, 1.0052923969975711, 1.0052802902384008, 1.005268232289431,
+        1.0052562273545944, 1.0052442775749904, 1.0052323826693743, 1.005220540003351,
+        1.0052087450644516, 1.0051969922499593, 1.005185275822333, 1.0051735908616417,
+        1.0051619340495845, 1.0051503041534944, 1.0051387021346814, 1.0051271308730396,
+        1.0051155945670682, 1.005104097923413, 1.0050926452836177, 1.0050812398425728,
+        1.00506988309278, 1.005058574585307, 1.005047312040363, 1.0050360917782197,
+        1.0050249093860324, 1.005013760496937, 1.0050026415415383, 1.0049915503404458,
+        1.0049804864377399, 1.0049694511233311, 1.0049584471478312, 1.0049474781873302,
+        1.0049365481576207, 1.0049256605012162, 1.0049148175720808, 1.0049040202227484,
+        1.0048932676606404, 1.0048825575917815, 1.0048718866197428, 1.0048612508241557,
+        1.0048506464139713, 1.0048400703405653, 1.004829520765829, 1.0048189973084793,
+        1.0048085010323402, 1.0047980341861784, 1.0047875997474451, 1.004777200854756,
+        1.0047668402308834, 1.0047565196967216, 1.0047462398580007, 1.0047360000142154,
+        1.0047257982991558, 1.0047156320219572, 1.0047054981435448, 1.0046953938016239,
+        1.00468531679128, 1.004675265918517, 1.0046652411682924, 1.004655243662374,
+        1.0046452754194868, 1.0046353389640863, 1.0046254368552157, 1.0046155712187828,
+        1.0046057433639846, 1.0045959535479667, 1.0045862009256976, 1.0045764836892146,
+        1.0045667993678138, 1.0045571452338928, 1.0045475187425648, 1.0045379179293021,
+        1.0045283416990944, 1.0045187899610055, 1.0045092635895874, 1.0044997642246816,
+        1.004490293948334, 1.0044808548972506, 1.0044714488786177, 1.004462077054375,
+        1.004452739745603, 1.0044434363866506, 1.0044341656323346, 1.0044249255954447,
+        1.0044157141702845, 1.0044065293847404, 1.0043973697200896, 1.0043882343450736,
+        1.0043791232266817, 1.004370037102037, 1.0043609773195699, 1.0043519455795074,
+        1.0043429436197004, 1.0043339729008127, 1.0043250343434156, 1.004316128159595,
+        1.0043072538047144, 1.0042984100545307, 1.0042895951919353, 1.0042808072701879,
+        1.0042720444078685, 1.0042633050669838, 1.0042545882698362, 1.0042458937215584,
+        1.0042372218214304, 1.0042285735645087, 1.0042199503525073, 1.0042113537467274,
+        1.0042027852038036, 1.0041942458363267, 1.0041857362349051, 1.0041772563773215,
+        1.0041688056358504, 1.0041603828782493, 1.0041519866437296], [3.9980507233411785e-08,
+        1.2005287354526802e-07, 2.0045987252748267e-07, 2.8142646956038477e-07,
+        3.6318045272560437e-07, 4.459536128345956e-07, 5.299829168050148e-07,
+        6.155117550598931e-07, 7.027912190450364e-07, 7.920814457160457e-07,
+        8.836530328304635e-07, 9.777885406458399e-07, 1.0747840823467674e-06,
+        1.1749510333974134e-06, 1.2786178582589057e-06, 1.3861320844105949e-06,
+        1.497862433410992e-06, 1.614201132226515e-06, 1.7355664295151335e-06,
+        1.862405333915513e-06, 1.9951966149774165e-06, 2.1344540822361966e-06,
+        2.2807301892561866e-06, 2.434619995876125e-06, 2.5967655328403204e-06,
+        2.7678606165577636e-06, 2.9486561748068458e-06, 3.1399661371477546e-06,
+        3.342673969691857e-06, 3.557739923949767e-06, 3.7862091045924668e-06,
+        4.029220442424638e-06, 4.288016705397901e-06, 4.563955669931491e-06,
+        4.858522614709427e-06, 5.1733443030212025e-06, 5.5102046632589785e-06,
+        5.871062387691679e-06, 6.258070725676767e-06, 6.673599762732746e-06,
+        7.120261551406139e-06, 7.600938485666982e-06, 8.118815404941692e-06,
+        8.677415959976836e-06, 9.28064389440463e-06, 9.932829956283945e-06,
+        1.0638785350284261e-05, 1.1403862687700963e-05, 1.2234025692666023e-05,
+        1.3135929009863531e-05, 1.4117009811815001e-05, 1.5185593158951677e-05,
+        1.6351013431499927e-05, 1.7623754636205694e-05, 1.9015612898524677e-05,
+        2.0539885116672793e-05, 2.221158861878279e-05, 2.404771757998181e-05,
+        2.6067543305554493e-05, 2.829296695812929e-05, 3.074893529210593e-05,
+        3.346393242435453e-05, 3.64705637737287e-05, 3.980625230599276e-05,
+        4.351407238467098e-05, 4.764375326602526e-05, 5.225289306043275e-05,
+        5.740843574908899e-05, 6.318847963279585e-05, 6.968450696308435e-05,
+        7.700415414758098e-05, 8.527468336579852e-05, 9.46473755434505e-05,
+        0.00010530315019809191, 0.00011745984494519793, 0.0001313817798796313,
+        0.00014739253219822601, 0.00016589232628231402, 0.00018738223936804735,
+        0.00021249878772397173, 0.0002420649021874314, 0.0002771679009892037,
+        0.0003192842296571714, 0.00037049028317976616, 0.0004338439448543182,
+        0.0005141380989128867, 0.0006195710577637337, 0.0007660987987678909,
+        0.0009919568191798097, 0.0014339833864953494, 0.0047420125806389435,
+        0.0016281280599403044, 0.001306000651856862, 0.0012352680783726633,
+        0.001249672969228262, 0.001313820110712825, 0.0014177857234605334,
+        0.001560529365244749, 0.0017457131323468378, 0.001980635109579534,
+        0.0022763419995156984, 0.002648455366537384, 0.0031186911854362677,
+        0.0037172877589174993, 0.0044867987398288164, 0.005488077759582035,
+        0.006809940690847638, 0.008585256228918712, 0.0110187834074914,
+        0.01443761815028865, 0.019387974428662642, 0.026834650921826443,
+        0.038612187125429125, 0.058582350628526896, 0.09619680204237482,
+        0.18117874727718503, 0.4717091712309206, 6.765692770159037, 0.7452647885683333,
+        0.7378022226123298, 0.9094563926437228, 0.7448845713964546, 1.0054529705656345,
+        1.9856261048260957, 2.64347147141612, 1.2300275614390777, 0.8335246838357708,
+        0.7346133601016925, 0.8591431729118385, 1.3041303068077954, 1.1486292043676796,
+        0.8915231551133082, 0.8511667610443825, 0.944300791172329, 1.1881906038525016,
+        1.6661194951135063, 2.1114701654238264, 1.673610695288305, 1.1783391064174453,
+        0.9187222125282913, 0.8036507554041246, 0.7909986390997507, 0.887310314965107,
+        1.1072868992634959, 1.2682609359324688, 1.1412907139537851, 0.9878945977238817,
+        0.9234232240323746, 0.9384286781141296, 1.02833365208202, 1.2070292685858273,
+        1.486328617266613, 1.7444605352650833, 1.6354170501364287, 1.2763192458039145,
+        0.9856208965552121, 0.8047912633606293, 0.8051576873754318, 0.8735635608796805,
+        0.9649705390647556, 1.0629456536263169, 1.1327489690224695, 1.148424647401852,
+        1.119692372193393, 1.0765278088193895, 1.041777452324759, 1.0256500151605858,
+        1.031026260450995, 1.0575943872969353, 1.1029287035937723, 1.1612941988486298,
+        1.221237964523692, 1.2646900653252662, 1.2725142052803968, 1.2366308747300305,
+        1.166352010101487, 1.0802044214130757, 0.9940372245212981, 0.916552746815106,
+        0.8507987862323583, 0.7968300427500933, 0.7535393641645416, 0.7195869629296213,
+        0.6937869703358612, 0.6752297521936774, 0.6632916986645561, 0.657604750051215,
+        0.6580170449514582, 0.6645558252639929, 0.6773929584269681, 0.696806379211216,
+        0.7231243275477973, 0.756631843698893, 0.7974109907747108, 0.8450830796998515,
+        0.8984388767912337, 0.9550126303478064, 1.0108065491492164, 1.060551756502229,
+        1.0988546031028654, 1.122019437626544, 1.1295218360201909, 1.1240585651877348,
+        1.1102020889986752, 1.0927040505568935, 1.0753685424329844, 1.0606781654167259,
+        1.0498946661183832, 1.0433270736066589, 1.0406014412952354, 1.040887543059406,
+        1.043095622439183, 1.046065929034324, 1.0487564401847327, 1.0504082186287962,
+        1.0506515506115002, 1.0495226657839165, 1.0473887647952718, 1.0448106466052127,
+        1.042388016039624, 1.0406268964760852, 1.0398506956201845, 1.040159344232871,
+        1.0414314296022706, 1.0433616921847346, 1.0455262573054023, 1.0474665968605295,
+        1.048779327287742, 1.049194687021678, 1.048625878347134, 1.0471772485475728,
+        1.0451105153666855, 1.0427801064445483, 1.040555826046691, 1.0387512344495429,
+        1.0375710597833485, 1.0370842595312273, 1.0372237663435893, 1.0378102202154569,
+        1.038594369081273, 1.039310413024172, 1.0397303411513776, 1.0397082834888973,
+        1.039205399041528, 1.038290285739656, 1.0371161651273904, 1.0358818590615004,
+        1.0347867604983059, 1.0339899303230038, 1.0335809465465333, 1.0335666537506807,
+        1.0338746549284656, 1.0343716832308123, 1.0348928200202554, 1.0352758058119247,
+        1.035393655150659, 1.0351789332210537, 1.0346347550385149, 1.033830644009596,
+        1.0328849852966546, 1.031938774698757, 1.0311268270689191, 1.0305523819377007,
+        1.0302695685341832, 1.0302761589698077, 1.0305170078673485, 1.0308968257816584,
+        1.0312995381087708, 1.0316104927187117, 1.0317373364245064, 1.0316256689584018,
+        1.0312666847117542, 1.0306957568219768, 1.0299828712080006, 1.029217439973731,
+        1.028490903171299, 1.0278805434594769, 1.0274372540113232, 1.0271789313573139,
+        1.027090017555315, 1.0271266930287077, 1.0272264184181368, 1.0273199788450997,
+        1.0273439256133499, 1.0272513699598058, 1.0270194695184178, 1.0266526085278616,
+        1.0261810791474117, 1.0256558451394826, 1.0251405409396028, 1.0247021276373198,
+        1.0244015891345828, 1.024285787189239, 1.0243812243741597, 1.0246901028683832,
+        1.025188788028884, 1.0258286121096025, 1.0265388660734704, 1.027231781699479,
+        1.0278092518505535, 1.0281709355888147, 1.0282232346631544, 1.027888430707465,
+        1.0271130927752867, 1.0258747755260813, 1.0241860955088318, 1.022095526505352,
+        1.01968466858582, 1.0170622379995478, 1.0143554843130285, 1.0117000640158638,
+        1.0092295262061486, 1.0070654950847582, 1.0053094148442214, 1.0040364286469026,
+        1.0032916647012473, 1.0030889464531778, 1.003411750312674, 1.0042161010481105,
+        1.005435009283291, 1.0069840047424576, 1.008767296573754, 1.0106840987155952,
+        1.0126346971173759, 1.0145259069937158, 1.0162756646346125, 1.0178166037176004,
+        1.0190985602229023, 1.0200900155705748, 1.0207785171099768, 1.0211701151160606,
+        1.0212878440471727, 1.02116927583276, 1.0208632026928115, 1.0204255729278946,
+        1.019914897155269, 1.0193874447007467, 1.018892635004935, 1.0184690735937254,
+        1.0181416701405122, 1.0179202004855572, 1.0177995373366213, 1.0177615863092693,
+        1.0177787439114234, 1.0178184700740334, 1.0178483764121453, 1.0178411133322511,
+        1.0177783301903416, 1.0176531015702601, 1.0174704503566625, 1.0172459150121143,
+        1.017002442007476, 1.0167661663706877, 1.0165618184624514, 1.016408534511334,
+        1.0163167533607824, 1.0162866778937811, 1.0163085066871682, 1.0163643447563997,
+        1.0164314265037986, 1.0164860704724847, 1.0165076690150983, 1.0164820194099613,
+        1.0164034303201674, 1.0162752687118133, 1.016108903921154, 1.0159212991324504,
+        1.0157317372932377, 1.0155583041214413, 1.0154147652607348, 1.0153083736761224,
+        1.015238953579405, 1.0151993671606643, 1.0151772227876144, 1.0151574688129839,
+        1.015125370245974, 1.0150693107229598, 1.0149829093790907, 1.0148660831540899,
+        1.0147248927917993, 1.014570243921054, 1.0144157263745024, 1.0142750243204819,
+        1.0141593909758075, 1.0140756484016444, 1.0140250575315328, 1.0140032320971823,
+        1.0140010755838171, 1.0140065370736264, 1.014006840671293, 1.0139907676444735,
+        1.013950573073866, 1.013883198619354, 1.0137905842763466, 1.0136790566244933,
+        1.013557944206506, 1.0134377085194821, 1.0133279564966815, 1.0132357057759245,
+        1.0131642107462697, 1.0131125410573587, 1.0130759587758478, 1.013046992728108,
+        1.0130169846743313, 1.0129778028753158, 1.0129233974705807, 1.012850911760167,
+        1.0127611556021738, 1.0126583732032932, 1.0125493724727785, 1.0124422004411806,
+        1.0123446270857543, 1.012262725268863, 1.0121998053647228, 1.0121558878549402,
+        1.012127791792024, 1.01210980182417, 1.0120947722597886, 1.012075451530612,
+        1.012045777044253, 1.0120019039399095, 1.0119427882339518, 1.0118702336488559,
+        1.0117884143916724, 1.0117029831697668, 1.011619946479322, 1.0115445249034354,
+        1.0114802098730022, 1.011428183350867, 1.0113871933675893, 1.0113538909018556,
+        1.0113235485335177, 1.011291013743269, 1.011251711300607, 1.0112025060813792,
+        1.0111422696143262, 1.0110720538864344, 1.0109948523727739, 1.0109150059364291,
+        1.0108373753869226, 1.0107664414867548, 1.010705500813887, 1.0106561021288094,
+        1.0106178185571808, 1.0105883860774896, 1.0105641708149922, 1.010540868815866,
+        1.0105143025946144, 1.0104811653869985, 1.0104395784665754, 1.0103893657363356,
+        1.010332005216719, 1.0102702781631479, 1.0102076916970124, 1.010147789893312,
+        1.0100934845820557, 1.0100465286240885, 1.0100072237489166, 1.0099744087208715,
+        1.0099457206410665, 1.0099180723792516, 1.0098882513238654, 1.0098535253062435,
+        1.0098121436991052, 1.0097636443530251, 1.009708915493457, 1.0096500083782767,
+        1.0095897424747344, 1.0095311816265964, 1.0094770806771471, 1.0094294040321379,
+        1.0093890010896691, 1.0093554920965926, 1.0093273780634964, 1.0093023473777567,
+        1.0092777170835379, 1.009250924468099, 1.0092199782587739, 1.0091837890847397,
+        1.0091423235323544, 1.0090965601811928, 1.009048262890886, 1.008999619422625,
+        1.0089528163252726, 1.0089096300757687, 1.008871108624275, 1.0088373984101924,
+        1.0088077435547997, 1.0087806517526396, 1.008754191286239, 1.0087263609043624,
+        1.0086954628750757, 1.0086604110769286, 1.0086209198685288, 1.0085775427960597,
+        1.008531558422499, 1.0084847283758744, 1.008438975049145, 1.0083960393622464,
+        1.0083571806072102, 1.00832297078021, 1.0082932171161678, 1.0082670224658457,
+        1.0082429681802516, 1.0082193827691273, 1.0081946454723245, 1.0081674693153329,
+        1.0081371137392572, 1.0081034912019864, 1.008067152392327, 1.0080291570351863,
+        1.007990857585739, 1.0079536378136227, 1.0079186549193284, 1.0078866315130453,
+        1.0078577332737888, 1.0078315515745693, 1.0078071909635677, 1.007783442667079,
+        1.0077590105162026, 1.0077327473783082, 1.0077038595669718, 1.0076720436796862,
+        1.0076375333945657, 1.0076010504221729, 1.007563670967687, 1.007526633637443,
+        1.0074911242210776, 1.0074580756981775, 1.0074280178874049, 1.0074010013270125,
+        1.0073766061913307, 1.0073540318604948, 1.0073322488644858, 1.007310184687251,
+        1.0072869099951967, 1.0072617929220353, 1.0072345957102131, 1.0072054989234795,
+        1.0071750515524016, 1.0071440582676643, 1.0071134255874767, 1.0070839950796833,
+        1.0070563929793277, 1.0070309217556215, 1.007007511075974, 1.006985734844237,
+        1.0069648894775611, 1.0069441183154315, 1.0069225597171942, 1.0068994931273327,
+        1.006874458570029, 1.0068473303032304, 1.006818333670013, 1.0067880040103825,
+        1.00675709612705, 1.006726460632566, 1.006696908319507, 1.0066690848365056,
+        1.0066433754124227, 1.0066198537495514, 1.0065982815752628, 1.00657815703545,
+        1.0065588024990688, 1.0065394765950155, 1.0065194922272174, 1.006498322242741,
+        1.0064756771933923, 1.0064515446267386, 1.0064261856454935, 1.0064000910211721,
+        1.0063739049147113, 1.0063483284249863, 1.0063240172568293, 1.006301487647955,
+        1.0062810425496953, 1.0062627264334114, 1.0062463126768297, 1.0062313229974709,
+        1.0062170744916563, 1.0062027469842338, 1.006187461849693, 1.0061703632491381,
+        1.0061506936555793, 1.0061278572839982, 1.0061014672064332, 1.0060713741299714,
+        1.0060376767356534, 1.0060007149234917, 1.0059610482183827, 1.0059194220151595,
+        1.0058767244114974, 1.0058339362644158, 1.0057920769668407, 1.0057521483845517,
+        1.0057150794599707, 1.0056816741446744, 1.0056525654781647, 1.0056281786687638,
+        1.0056087058414118, 1.0055940946203952, 1.005584051895236, 1.0055780630241415,
+        1.005575425471611, 1.0055752946075565, 1.005576738281384, 1.0055787959786624,
+        1.0055805379797456, 1.0055811200195175, 1.0055798294772793, 1.0055761200263023,
+        1.0055696328184096, 1.005560203521443, 1.0055478557213382, 1.0055327822242517,
+        1.0055153165672521, 1.0054958975339734, 1.0054750296822552, 1.0054532428643763,
+        1.0054310535124742, 1.0054089301283302, 1.0053872650020685, 1.0053663537135014,
+        1.00534638345215, 1.0053274306240272, 1.0053094675949457, 1.0052923777613478,
+        1.0052759774727293, 1.0052600427096763, 1.0052443379231404, 1.005228644146252,
+        1.005212783473826, 1.0051966373140242, 1.005180156456927, 1.0051633619296048,
+        1.0051463367188826, 1.0051292096017632, 1.0051121333669903, 1.0050952604807564,
+        1.0050787196159372, 1.0050625963533346, 1.0050469207716681, 1.0050316636426302,
+        1.0050167416781524, 1.0050020309270882, 1.0049873861946526, 1.0049726634526508,
+        1.0049577417679088, 1.004942541374531, 1.0049270351409398, 1.004911251738571,
+        1.0048952701373663, 1.0048792064227388, 1.0048631951288778, 1.0048473681213326,
+        1.0048318344047094, 1.0048166640275256, 1.0048018785446342, 1.0047874493997206,
+        1.004773304290347, 1.0047593402908694, 1.0047454414447305, 1.0047314978676882,
+        1.0047174232303413, 1.004703167831014, 1.0046887252619698, 1.0046741317726984,
+        1.0046594586552966, 1.0046447991137046, 1.00463025194462, 1.004615904816711,
+        1.004601819920538, 1.0045880242894283, 1.0045745062522857, 1.0045612184223485,
+        1.0045480865329388, 1.0045350224845917, 1.0045219393204465, 1.004508765596823,
+        1.0044954567926168, 1.0044820019621996, 1.0044684246760345, 1.0044547782635915,
+        1.0044411363088002, 1.004427580096115, 1.0044141851482118, 1.0044010090725555,
+        1.0043880826445861, 1.0043754054617897, 1.0043629467144997, 1.00435065077285,
+        1.0043384465255423, 1.004326258845797, 1.0043140202852967, 1.0043016811398897,
+        1.0042892163695012, 1.0042766284202786, 1.0042639456873512, 1.0042512170541695,
+        1.004238503537372, 1.0042258684655707, 1.004213367773793, 1.0042010418930658,
+        1.0041889103884958, 1.0041769700148488, 1.0041651963022742, 1.0041535482479333,
+        1.004141975253382, 1.0041304251717855, 1.0041188522427593, 1.004107223792503,
+        1.0040955248315133, 1.004083760038484, 1.0040719530141864, 1.004060143060922,
+        1.0040483800402489, 1.0040367180510628, 1.0040252087390926, 1.0040138950061646,
+        1.0040028057566084, 1.0039919521330172, 1.00398132548969, 1.0039708971606274,
+        1.0039606199220799, 1.0039504309373768, 1.0039402559035782, 1.0039300140862317,
+        1.003919623916767, 1.003909008823889, 1.0038981029667593, 1.0038868565311807,
+        1.0038752402448707, 1.0038632487733252, 1.0038509026858948, 1.0038382487422999,
+        1.0038253583484116, 1.0038123241644124, 1.0037992550078603, 1.0037862693612563,
+        1.0037734879459401, 1.0037610259390675, 1.003748985468724, 1.0037374490123279,
+        1.0037264742436065, 1.0037160907323672, 1.0037062987172465, 1.0036970699690437,
+        1.00368835056794, 1.0036800652563669, 1.0036721229186203, 1.0036644226879246,
+        1.0036568601906346, 1.003649333495632, 1.0036417484282865, 1.0036340230130023,
+        1.0036260909076693, 1.003617903773905, 1.003609432581125, 1.0036006678717693,
+        1.0035916190265228, 1.003582312574235, 1.0035727896041258, 1.0035631023677984,
+        1.0035533102099516, 1.0035434750362489, 1.003533656604307, 1.0035239079928133,
+        1.0035142716462062, 1.003504776390945, 1.0034954357635246, 1.0034862478774962,
+        1.0034771968957026, 1.0034682559833112, 1.003459391423705, 1.0034505674131355,
+        1.003441750939975, 1.003432916122454, 1.0034240474354184, 1.0034151413988643,
+        1.0034062065111387, 1.0033972614584088, 1.0033883318817078, 1.0033794461952459,
+        1.0033706310898356, 1.0033619074004057, 1.0033532869573192, 1.0033447708860697,
+        1.0033363495923977, 1.0033280044056017, 1.0033197105942155, 1.003311441256343,
+        1.0033031714561549, 1.003294881948921, 1.003286561913751, 1.0032782102826805,
+        1.003269835488384, 1.003261453711707, 1.0032530859517312, 1.0032447544255592,
+        1.0032364789028752, 1.003228273576742, 1.003220144969161, 1.003212091186587,
+        1.0032041026085707, 1.0031961638520506, 1.0031882566444696, 1.003180363095881,
+        1.0031724688059227, 1.003164565283491, 1.0031566512860868, 1.0031487328783868,
+        1.003140822231792, 1.0031329354000103, 1.0031250894743042, 1.0031172996179634,
+        1.0031095764883307, 1.0031019244765755, 1.003094341045834, 1.0030868172543845,
+        1.0030793393464181, 1.0030718911138157, 1.0030644566083227, 1.0030570227344102,
+        1.0030495812857225, 1.0030421300946435, 1.003034673125054, 1.0030272195239875,
+        1.003019781825853, 1.0030123736429977, 1.0030050072551477, 1.0029976915159873,
+        1.0029904304284023, 1.0029832226144018, 1.002976061744396, 1.002968937822438,
+        1.002961839078301, 1.0029547541187172, 1.0029476739544707, 1.0029405935519051,
+        1.0029335126496697, 1.0029264357161736, 1.0029193710763136, 1.0029123293799647,
+        1.0029053216950359, 1.0028983575661052, 1.0028914433769944, 1.0028845812942921,
+        1.0028777689606956, 1.0028709999725784, 1.002864265039016, 1.0028575536040452,
+        1.0028508556392772, 1.0028441632924434, 1.0028374721110984, 1.002830781642354,
+        1.0028240953235532, 1.0028174197045943, 1.0028107631577683, 1.0028041343157736,
+        1.002797540519037, 1.0027909865436826, 1.0027844738245775, 1.0027780002950657,
+        1.002771560853456, 1.0027651483561304, 1.0027587549474473, 1.0027523734826607,
+        1.002745998790313, 1.0027396285554582, 1.002733263677426, 1.002726908051898,
+        1.0027205678293791, 1.0027142502927235, 1.0027079625594466, 1.0027017103400842,
+        1.0026954969681172, 1.0026893228639688, 1.0026831855155327, 1.0026770799652858,
+        1.0026709997058725, 1.0026649378173544, 1.0026588881416534, 1.0026528462887896,
+        1.0026468103046429, 1.0026407808937157, 1.0026347611712623, 1.0026287560021712,
+        1.0026227710546534, 1.002616811743259, 1.00261088225018, 1.0026049847948706,
+        1.0025991192737196, 1.0025932833231836, 1.0025874727839976, 1.002581682474112,
+        1.0025759071262443, 1.0025701423206526, 1.0025643852489496, 1.0025586351785174,
+        1.0025528935428754, 1.0025471636507184, 1.0025414500732797, 1.0025357578244056,
+        1.0025300914810924, 1.0025244543988587, 1.0025188481558864, 1.002513272316543,
+        1.0025077245469658, 1.0025022010532072, 1.0024966972572544, 1.0024912085870816,
+        1.002485731240572, 1.002480262791627, 1.0024748025379064, 1.002469351537612,
+        1.0024639123382997, 1.002458488454404, 1.0024530836923204, 1.0024477014457271,
+        1.0024423440855534, 1.0024370125489246, 1.0024317061937817, 1.0024264229375137,
+        1.0024211596477965, 1.0024159127105594, 1.0024106786709759, 1.0024054548333658,
+        1.0024002397159548, 1.002395033284453, 1.002389836928815, 1.0023846531932292,
+        1.0023794853119847, 1.0023743366361844, 1.0023692100530999, 1.0023641074985388,
+        1.0023590296438745, 1.0023539758070332, 1.002348944096663, 1.002343931758256,
+        1.0023389356569243, 1.0023339528098358, 1.00232898087516, 1.0023240185146192,
+        1.0023190655708758, 1.0023141230347328, 1.0023091928141674, 1.0023042773511013,
+        1.0022993791569157, 1.002294500349653, 1.002289642273336, 1.0022848052633149,
+        1.00227998859459, 1.0022751906173994, 1.0022704090518983, 1.0022656413870432,
+        1.0022608853122557, 1.0022561391066367, 1.0022514019197044, 1.0022466738979972,
+        1.002241956139359, 1.002237250486709, 1.0022325592001895, 1.0022278845661892,
+        1.00222322851106, 1.0022185922845537, 1.0022139762645428, 1.0022093799125553,
+        1.00220480188333, 1.0022002402655374, 1.0021956929092952, 1.0021911577828568,
+        1.0021866332975704, 1.0021821185474753, 1.0021776134258047, 1.0021731186025515,
+        1.0021686353710433, 1.00216416539329, 1.0021597103898598, 1.0021552718280926,
+        1.0021508506610082, 1.0021464471594297, 1.0021420608629328, 1.0021376906549084,
+        1.0021333349461599, 1.002128991934126, 1.00212465989324, 1.0021203374481387,
+        1.0021160237856412, 1.00211171877265, 1.0021074229632996, 1.002103137497062,
+        1.002098863906824, 1.002094603869772, 1.0020903589418542, 1.002086130317813,
+        1.0020819186532886, 1.0020777239745688, 1.0020735456869638, 1.0020693826772569,
+        1.0020652334914615], [1.7352110664150693e-08, 5.2106896153002676e-08,
+        8.701364473810568e-08, 1.2217454706379348e-07, 1.5769312050491136e-07,
+        1.936747633761096e-07, 2.3022730765696743e-07, 2.67461605709118e-07,
+        3.0549213235824414e-07, 3.4443761882777795e-07, 3.844217206974098e-07,
+        4.25573727218144e-07, 4.680293135570627e-07, 5.119313497690867e-07,
+        5.574307664726784e-07, 6.04687491041024e-07, 6.538714593519299e-07,
+        7.051637141221073e-07, 7.587576015923984e-07, 8.148600750522205e-07,
+        8.736931242011399e-07, 9.35495338363837e-07, 1.000523625533694e-06,
+        1.0690551033590322e-06, 1.1413891831740744e-06, 1.2178498699125795e-06,
+        1.2987883067409155e-06, 1.3845855902701701e-06, 1.475655893951828e-06,
+        1.5724499330079146e-06, 1.6754588201845268e-06, 1.7852183534789131e-06,
+        1.9023137980880335e-06, 2.027385220242497e-06, 2.1611334487168467e-06,
+        2.3043267416494994e-06, 2.4578082560326924e-06, 2.6225044218992086e-06,
+        2.7994343484620894e-06, 2.989720395964518e-06, 3.194600080265569e-06,
+        3.415439487895264e-06, 3.653748420931396e-06, 3.911197509961657e-06,
+        4.1896375861875215e-06, 4.4911216272584694e-06, 4.817929676192717e-06,
+        5.172597146443668e-06, 5.5579470549631175e-06, 5.9771267515254925e-06,
+        6.433649857512585e-06, 6.931444221267066e-06, 7.474906834366248e-06,
+        8.068966834912387e-06, 8.719157902593047e-06, 9.431701583666276e-06,
+        1.021360338499325e-05, 1.1072763766567555e-05, 1.2018106608567615e-05,
+        1.305972816964261e-05, 1.420907014758656e-05, 1.5479121154128093e-05,
+        1.688465175032281e-05, 1.8442489216646554e-05, 2.0171839481743936e-05,
+        2.2094665166943873e-05, 2.4236130548295545e-05, 2.6625126547770764e-05,
+        2.9294891702829266e-05, 3.2283748522541356e-05, 3.563597899572864e-05,
+        3.940286840640623e-05, 4.3643953373937286e-05, 4.84285184097728e-05,
+        5.383739602326484e-05, 5.996513874026494e-05, 6.692264860751864e-05,
+        7.484037133513363e-05, 8.387219018638815e-05, 9.420019065684928e-05,
+        0.000106040513119597, 0.0001196505710910489, 0.0001353379915107646,
+        0.00015347173689116587, 0.00017449600635779494, 0.00019894769476739533,
+        0.00022747843363370856, 0.00026088256713989623, 0.00030013286470929185,
+        0.000346426386653726, 0.00040124376718530863, 0.0004664263642514175,
+        0.0005442773914404085, 0.0006376955179290669, 0.000750352830042913,
+        0.0008869340087004201, 0.0010534608804944811, 0.0012577374227543553,
+        0.00150996685390804, 0.0018236179689147176, 0.0022166579389524496,
+        0.0027133329351507834, 0.0033467828951688717, 0.004162952818404681,
+        0.005226566511182101, 0.006630468780681944, 0.008510638005250886,
+        0.011071085598217869, 0.01462672334132331, 0.01968054624087819,
+        0.02707045299153589, 0.03826856078174097, 0.05604905060466489, 0.0861736152652099,
+        0.14248065836148485, 0.2674219611596907, 0.6803315399888152, 9.091333774678793,
+        0.7776989566571803, 0.17314668322995902, 1.862193177501464, 1.542354600328908,
+        1.9731107101682763, 3.630365223123942, 4.285308053000669, 1.5267105590562262,
+        0.36089064786044334, 1.3951104622003239, 5.642132520995871, 6.056596244320961,
+        4.267088135892596, 2.584167259604919, 1.9481450549468282, 1.7513991730456564,
+        1.833535904272878, 2.1941810770966446, 2.4406970829134185, 1.7623425915913504,
+        1.1914187730505177, 0.9537697547918811, 0.914625321778163, 1.0268333004992254,
+        1.3111738863087286, 1.7868975272975554, 2.1055928843135847, 1.851531165590182,
+        1.5182592526362049, 1.3265821361251833, 1.256722670297466, 1.287146105445405,
+        1.4196675032261203, 1.654365858601732, 1.854147773707951, 1.6802205728874686,
+        1.2900927752793956, 1.0069134378439446, 0.8685048378109561, 0.9570100885233461,
+        1.0672170346385366, 1.1950698619434599, 1.3214136585807557, 1.4033874965991533,
+        1.4108946426626432, 1.3597856481284487, 1.290133494757981, 1.2312469855796038,
+        1.1955904632405605, 1.1861505253037867, 1.2019603265034866, 1.239691462881453,
+        1.292510456406432, 1.347573186152028, 1.3851981226583847, 1.3849871028511238,
+        1.3387843933175536, 1.2570869504617757, 1.1599167650956725, 1.0640741957844102,
+        0.9785556731550843, 0.9063135687192041, 0.8471673370549754, 0.799767704553737,
+        0.7625760795052194, 0.7342612992213449, 0.7138168593531695, 0.7005616005823726,
+        0.6941005884853302, 0.6942790303083648, 0.7011404964629326, 0.7148892989284331,
+        0.7358494009090841, 0.7644053559740417, 0.8009027065635225, 0.8454763690923068,
+        0.8977714789587027, 0.9565393182933806, 1.019165474189051, 1.0813509454340713,
+        1.1373658461916338, 1.1812657284849295, 1.2088654609859466, 1.2193715362398743,
+        1.21549347279085, 1.2020302822091795, 1.1840441392227683, 1.1656263191950988,
+        1.1494716517718044, 1.136972131009794, 1.1285002311044643, 1.1237005663880806,
+        1.121738424295096, 1.121516169136053, 1.121879280575179, 1.121815840191393,
+        1.120626791316194, 1.1180287830714548, 1.1141602913193955, 1.109492069198782,
+        1.1046755839535236, 1.100377930701897, 1.0971439472694091, 1.0953064792020797,
+        1.0949477437255655, 1.0959053587511285, 1.097814646905175, 1.10017938820176,
+        1.1024620286887539, 1.104180259585007, 1.1049921627215429, 1.104751074274318,
+        1.1035171087531108, 1.1015240003030762, 1.0991125465647715, 1.0966497517674183,
+        1.094453226487016, 1.0927352082424864, 1.0915734786284788, 1.0909104231091171,
+        1.0905773624360098, 1.0903383829056241, 1.0899453147471156, 1.0891932414604792,
+        1.0879650172105801, 1.0862550499651318, 1.084167444199279, 1.0818901947774255,
+        1.079653054253752, 1.0776798396918372, 1.0761456839986963, 1.0751469996228389,
+        1.074688264137089, 1.0746863369490904, 1.074990281904053, 1.075412490681466,
+        1.0757651613242383, 1.0758951143346318, 1.0757100484205822, 1.0751910579966888,
+        1.0743893905871318, 1.0734091509632786, 1.0723807630601176, 1.0714315652863533,
+        1.0706597237488535, 1.0701161411351783, 1.0697969278470438, 1.0696468740306981,
+        1.0695725160366023, 1.0694619211372198, 1.0692072844199767, 1.0687259885248748,
+        1.067976108637844, 1.0669635240847475, 1.0657396326968527, 1.064390693994061,
+        1.0630214905512352, 1.06173687506699, 1.0606247501714048, 1.0597432910944402,
+        1.059114101287828, 1.0587218050271174, 1.0585195344241694, 1.058438953565876,
+        1.0584029125378083, 1.0583385638764924, 1.058188834326707, 1.0579205356844865,
+        1.057528069555802, 1.057032503738164, 1.0564765918619017, 1.0559168991833903,
+        1.0554144808312447, 1.0550255284034387, 1.054793136866283, 1.0547409691289755,
+        1.0548692267643773, 1.0551530481420894, 1.0555432745449234, 1.0559694319422381,
+        1.0563447262258696, 1.0565727919687835, 1.0565558304056466, 1.056203609241631,
+        1.0554425976934532, 1.0542243304289782, 1.0525320078039422, 1.0503844134047935,
+        1.0478364926638661, 1.044976360145465, 1.0419190041791364, 1.038797421645783,
+        1.0357522384927715, 1.0329209933292933, 1.0304281829412425, 1.028376940871384,
+        1.0268429187326287, 1.0258706357496157, 1.0254723029061417, 1.0256289332888673,
+        1.0262934169413036, 1.0273951533563952, 1.02884578453058, 1.0305455497575362,
+        1.0323897907059225, 1.0342751753452577, 1.0361052824417487, 1.0377952870533376,
+        1.0392755955141122, 1.0404943750120328, 1.041418990231904, 1.0420363900630607,
+        1.0423524876421477, 1.0423905654124546, 1.0421887367187037, 1.0417965254107635,
+        1.0412706916444647, 1.040670527323955, 1.0400529481835612, 1.0394677956248257,
+        1.038953806317785, 1.0385356946914206, 1.0382227157254282, 1.0380089351145556,
+        1.0378752416821846, 1.037792912211356, 1.03772831029919, 1.0376481057563347,
+        1.0375242811087262, 1.0373381834323958, 1.0370830019764592, 1.0367642954122098,
+        1.0363985164719265, 1.0360098224398484, 1.0356257476318504, 1.0352724922237342,
+        1.0349706212961234, 1.0347318702471144, 1.0345575441418418, 1.034438720106541,
+        1.0343581596576104, 1.0342935574423764, 1.0342215361718696, 1.0341216797271744,
+        1.0339799005597665, 1.0337905674416163, 1.0335570547756707, 1.033290670781776,
+        1.0330082196755532, 1.032728692834846, 1.0324697210177156, 1.0322444336853267,
+        1.0320592684265855, 1.0319130803523193, 1.0317976573465608, 1.0316994954864809,
+        1.0316024710951015, 1.0314908968678278, 1.0313523941460112, 1.0311800617816613,
+        1.0309735657642318, 1.0307389853949709, 1.0304874891493734, 1.0302331288677886,
+        1.029990192859709, 1.0297706206160777, 1.029581947829159, 1.0294261329934147,
+        1.0292994424857642, 1.0291933733883831, 1.029096407304299, 1.0289962453233603,
+        1.0288820978958135, 1.0287466063555923, 1.0285870539976794, 1.0284056679434233,
+        1.0282089899811946, 1.0280064698175841, 1.0278085735040514, 1.0276247777935725,
+        1.0274618262306472, 1.0273225582488295, 1.027205504411427, 1.0271052933212732,
+        1.0270137660462022, 1.0269215683841106, 1.0268199112536138, 1.0267021682374233,
+        1.0265650197297376, 1.0264089467459285, 1.0262380054708542, 1.0260589505655058,
+        1.0258798943487066, 1.025708767979254, 1.0255518765252678, 1.0254128102933378,
+        1.025291898476627, 1.0251862843992672, 1.0250905849451923, 1.0249979912674538,
+        1.0249015919105315, 1.0247956658315878, 1.0246767066376055, 1.0245439971286578,
+        1.024399643153804, 1.024248079938006, 1.0240951620676715, 1.0239470217096096,
+        1.0238089154975991, 1.0236842738979266, 1.0235741211105287, 1.023476958990467,
+        1.0233891199002003, 1.0233055072903738, 1.0232205744607534, 1.023129353109296,
+        1.0230283402054627, 1.0229160841376856, 1.0227933721099445, 1.0226629981836113,
+        1.0225291700342523, 1.0223966774611053, 1.0222699852062487, 1.0221524203999897,
+        1.022045600960328, 1.0219492014140568, 1.0218610870969538, 1.0217777789966416,
+        1.0216951520939286, 1.0216092303325552, 1.0215169279351848, 1.0214166014522246,
+        1.0213083162622683, 1.0211937872644377, 1.0210760152340121, 1.0209586959668349,
+        1.0208455186890224, 1.0207394865514885, 1.0206423832975688, 1.0205544790675838,
+        1.0204745213948918, 1.0204000038647962, 1.0203276545333992, 1.0202540479867768,
+        1.020176225386791, 1.0200922090250921, 1.0200013208189247, 1.019904253054582,
+        1.0198028868608469, 1.0196999003463842, 1.0195982454460955, 1.0195005937578094,
+        1.0194088537207586, 1.0193238447991888, 1.0192451826940052, 1.019171389328302,
+        1.019100200010402, 1.0190290052302042, 1.0189553420656043, 1.0188773438478418,
+        1.018794067245379, 1.0187056408827388, 1.0186132140169142, 1.0185187210230526,
+        1.0184245105339271, 1.0183329110853714, 1.0182458141961415, 1.0181643498431003,
+        1.0180887099602842, 1.018018146906158, 1.0179511413148328, 1.0178857033379025,
+        1.0178197483677607, 1.0177514767842581, 1.0176796888213993, 1.0176039796448886,
+        1.0175247832529692, 1.0174432622849905, 1.0173610688803503, 1.0172800242644748,
+        1.017201777835789, 1.0171275081619102, 1.0170577186077812, 1.0169921614890534,
+        1.016929900387848, 1.016869495112053, 1.016809272237596, 1.0167476299690845,
+        1.0166833214928788, 1.016615666606178, 1.0165446558690459, 1.0164709319680525,
+        1.0163956555164384, 1.0163202830042157, 1.0162462994227828, 1.0161749547604508,
+        1.0161070512035517, 1.0160428172459022, 1.0159818882102776, 1.015923393103552,
+        1.0158661288276343, 1.0158087878663522, 1.0157501971651248, 1.0156895252947422,
+        1.0156264220096625, 1.0155610674847402, 1.0154941252991523, 1.0154266105192826,
+        1.015359698915587, 1.015294512912828, 1.0152319228098357, 1.0151723978444989,
+        1.0151159317808052, 1.0150620538155113, 1.0150099203147778, 1.0149584689097437,
+        1.0149066061910952, 1.0148533953105525, 1.0147982108993694, 1.014740835457279,
+        1.0146814823821664, 1.0146207440315846, 1.0145594762453232, 1.0144986413501702,
+        1.0144391380655582, 1.0143816479898122, 1.014326524460339, 1.014273741422739,
+        1.0142229090823391, 1.0141733515034654, 1.014124230966529, 1.0140746964938923,
+        1.0140240306465715, 1.013971769876762, 1.0139177790189469, 1.0138622688601038,
+        1.0138057556151976, 1.013748970823067, 1.0136927380582084, 1.013637837694783,
+        1.0135848821033642, 1.0135342211005838, 1.0134858918125145, 1.0134396194325745,
+        1.0133948669987152, 1.013350924658103, 1.0133070231117154, 1.0132624528475374,
+        1.0132166707123962, 1.0131693781687308, 1.0131205606224643, 1.0130704835616073,
+        1.0130196478420008, 1.0129687122646822, 1.0129183957858208, 1.012869373782582,
+        1.0128221826413326, 1.0127771447711444, 1.0127343224930043, 1.0126935048029244,
+        1.0126542264851877, 1.0126158151124838, 1.0125774585931886, 1.0125382843671535,
+        1.0124974411298875, 1.0124541748954659, 1.0124078929606766, 1.0123582115080039,
+        1.0123049847947396, 1.0122483158068685, 1.012188549712392, 1.0121262523648817,
+        1.0120621765358873, 1.0119972186282782, 1.0119323685122932, 1.0118686549897364,
+        1.011807089339378, 1.0117486094673562, 1.0116940273466395, 1.01164398258976,
+        1.0115989050405063, 1.011558989080277, 1.011524181846535, 1.0114941867367022,
+        1.0114684824704796, 1.0114463567173162, 1.0114269520175176, 1.0114093206027284,
+        1.011392483908212, 1.0113754921755786, 1.0113574796212081, 1.0113377111747222,
+        1.0113156176936355, 1.0112908177089366, 1.0112631250023787, 1.0112325425139153,
+        1.0111992441047, 1.0111635464768325, 1.0111258740407651, 1.0110867197330615,
+        1.0110466047615676, 1.0110060400476408, 1.010965491802357, 1.010925353259981,
+        1.0108859241222603, 1.0108473987508406, 1.0108098635783047, 1.0107733035912094,
+        1.0107376170803364, 1.010702637187028, 1.0106681581546135, 1.010633963696021,
+        1.010599854595094, 1.0105656726445833, 1.0105313183353581, 1.0104967603548984,
+        1.0104620358816014, 1.0104272417767197, 1.0103925179376043, 1.0103580251210582,
+        1.0103239203148398, 1.010290333098907, 1.0102573463216822, 1.0102249838171182,
+        1.0101932068783417, 1.010161919924146, 1.0101309844345476, 1.0101002389990625,
+        1.0100695224099432, 1.0100386962889376, 1.0100076638350626, 1.009976381910053,
+        1.009944864741063, 1.0099131788470155, 1.0098814301740435, 1.0098497456344435,
+        1.0098182520890122, 1.0097870561604967, 1.009756228064486, 1.0097257919322975,
+        1.009695724000367, 1.0096659587374073, 1.0096364016900035, 1.0096069467607933,
+        1.0095774949622678, 1.009547971516597, 1.0095183385171012, 1.0094886011627355,
+        1.0094588066823384, 1.0094290362911018, 1.009399391661754, 1.0093699782604841,
+        1.0093408883555308, 1.0093121864887409, 1.0092838997226663, 1.00925601412926,
+        1.0092284779212664, 1.0092012105266965, 1.009174115953446, 1.0091470981389115,
+        1.0091200757271155, 1.00909299389265, 1.00906583139422, 1.0090386018841278,
+        1.0090113494755772, 1.0089841395105843, 1.0089570462239232, 1.008930139445143,
+        1.0089034725591748, 1.0088770736573058, 1.008850941216422, 1.008825044854731,
+        1.0087993308642738, 1.0087737314555496, 1.008748176088885, 1.0087226029930663,
+        1.008696969016449, 1.0086712562968525, 1.00864547480521, 1.0086196605114053,
+        1.008593869620944, 1.0085681699258322, 1.008542630713019, 1.0085173128262117,
+        1.0084922603724442, 1.0084674952354133, 1.0084430150692147, 1.0084187948855592,
+        1.0083947918066452, 1.0083709521165005, 1.0083472194653391, 1.0083235429937314,
+        1.0082998842427648, 1.0082762219715633, 1.008252554360958, 1.0082288984789225,
+        1.0082052872569578, 1.0081817645253892, 1.0081583788463897, 1.0081351769536657,
+        1.0081121975659233, 1.0080894662108237, 1.0080669915114897, 1.0080447631841225,
+        1.0080227518043083, 1.0080009102432697, 1.007979176563599, 1.0079574780965044,
+        1.007935736389906, 1.0079138727054668, 1.0078918137397674, 1.0078694972413682,
+        1.0078468771888016, 1.0078239281891246, 1.007800648761613, 1.007777063198869,
+        1.0077532217577247, 1.0077291990305288, 1.007705090481408, 1.0076810072912545,
+        1.0076570698220964, 1.007633400163546, 1.007610114338672, 1.0075873148045893,
+        1.0075650838726005, 1.0075434785922728, 1.0075225275019757, 1.0075022294636837,
+        1.0074825545965822, 1.0074634471292254, 1.007444829828216, 1.0074266095507287,
+        1.007408683418142, 1.0073909451176157, 1.0073732908975848, 1.0073556249153337,
+        1.0073378637003645, 1.0073199395973444, 1.0073018031336538, 1.0072834243111743,
+        1.0072647928515066, 1.0072459174354627, 1.0072268239835345, 1.007207553036857,
+        1.0071881563280742, 1.0071686926827679, 1.0071492234616766, 1.0071298078313107,
+        1.0071104982195123, 1.0070913363547132, 1.007072350285826, 1.007053552723347,
+        1.0070349409286181, 1.0070164982163927, 1.0069981969443893, 1.0069800026692526,
+        1.0069618789816361, 1.0069437924227826, 1.0069257168530743, 1.0069076367001462,
+        1.0068895486571117, 1.0068714616126706, 1.006853394844715, 1.0068353747599341,
+        1.00681743067534, 1.0067995902784772, 1.006781875448632, 1.006764299062001,
+        1.0067468632482814, 1.0067295593378798, 1.0067123694738267, 1.0066952696029805,
+        1.006678233348444, 1.006661236133804, 1.0066442589003977, 1.0066272908356906,
+        1.0066103307006362, 1.0065933865780328, 1.0065764741233751, 1.006559613641705,
+        1.0065428264987337, 1.0065261314724103, 1.0065095416472474, 1.0064930623502226,
+        1.0064766904430058, 1.006460415052394, 1.0064442195794012, 1.0064280846175104,
+        1.0064119912672267, 1.0063959242798386, 1.006379874505601, 1.0063638402513848,
+        1.006347827346329, 1.0063318479372225, 1.0063159182495889, 1.0063000557198445,
+        1.006284276000318, 1.0062685903479494, 1.006253003829224, 1.0062375146239988,
+        1.0062221145163865, 1.006206790456153, 1.0061915268943895, 1.0061763084727644,
+        1.0061611225963267, 1.0061459614524204, 1.0061308231450812, 1.0061157117751087,
+        1.0061006364819964, 1.0060856096421475, 1.0060706445581151, 1.0060557530522967,
+        1.006040943384073, 1.0060262188421845, 1.006011577238102, 1.0059970113641752,
+        1.0059825103117048, 1.0059680613978772, 1.0059536523517043, 1.005939273373436,
+        1.0059249187139907, 1.0059105875136705, 1.0058962837746168, 1.0058820154952097,
+        1.0058677931391724, 1.0058536277229677, 1.0058395288636302, 1.0058255031267225,
+        1.0058115529526979, 1.0057976763316634, 1.0057838672617925, 1.005770116889138,
+        1.005756415110906, 1.005742752349367, 1.0057291211820194, 1.005715517547286,
+        1.0057019413268753, 1.005688396220161, 1.0056748889519882, 1.005661427970607,
+        1.00564802187734, 1.0056346778699368, 1.0056214004716175, 1.0056081907605225,
+        1.0055950462210854, 1.0055819612268244, 1.0055689280534739, 1.0055559382313435,
+        1.0055429839916743, 1.0055300595519636, 1.0055171620202636, 1.0055042917710708,
+        1.005491452241833, 1.0054786492017858, 1.005465889635778, 1.005453180449114,
+        1.005440527225146, 1.005427933251722, 1.0054153989795347, 1.0054029219953007,
+        1.005390497500127, 1.0053781191951388, 1.0053657804076317, 1.0053534752533202,
+        1.0053411996293484, 1.0053289518679862, 1.0053167329448163, 1.0053045462163102,
+        1.0052923967448462, 1.0052802903400007, 1.00526823249144, 1.0052562273830832,
+        1.0052442771591241, 1.005232381563945, 1.0052205380093362, 1.0052087420463534,
+        1.0051969881488745, 1.0051852706639857, 1.0051735847589036, 1.0051619271993306,
+        1.0051502968279793, 1.0051386946679202, 1.005127123642969, 1.0051155879745004,
+        1.005104092368963, 1.0050926411439156, 1.0050812374470983, 1.005069882702637,
+        1.0050585763751507, 1.0050473160845286, 1.0050360980418824, 1.0050249177219615,
+        1.0050137706481237, 1.0050026531496559, 1.0049915629598125, 1.0049804995541491,
+        1.004969464176875, 1.0049584595586176, 1.0049474893828494, 1.004936557600412,
+        1.0049256677154672, 1.004914822167832, 1.00490402191648, 1.0048932662911891,
+        1.0048825531307564, 1.0048718791758653, 1.0048612406412443, 1.0048506338625909,
+        1.0048400559036665, 1.0048295050189864, 1.0048189808956076, 1.0048084846379675,
+        1.004798018505534, 1.0047875854557315, 1.004777188577001, 1.004766830513758,
+        1.004756512983623, 1.0047462364685429, 1.0047360001290815, 1.0047258019510104,
+        1.0047156390928569, 1.0047055083689727, 1.0046954067809906, 1.0046853320044287,
+        1.004675282747517, 1.0046652589235487, 1.0046552616119087, 1.0046452928201015,
+        1.0046353550930314, 1.0046254510409884, 1.0046155828696997, 1.0046057519933025,
+        1.00459595879446, 1.0045862025688277, 1.0045764816582532, 1.0045667937445562,
+        1.0045571362488797, 1.004547506765015, 1.004537903451227, 1.0045283253143085,
+        1.0045187723399767, 1.0045092454512254, 1.004499746306286, 1.0044902769749993,
+        1.0044808395520237, 1.0044714357746591, 1.0044620667102775, 1.0044527325648644,
+        1.0044434326421203, 1.004434165456213, 1.0044249289751899, 1.0044157209505125,
+        1.0044065392749555, 1.0043973823078405, 1.0043882491139053, 1.0043791395780717,
+        1.0043700543803393, 1.0043609948388958, 1.004351962651408, 1.0043429595805013,
+        1.0043339871375003, 1.0043250463170443, 1.0043161374253304, 1.0043072600277638,
+        1.0042984130214239, 1.0042895948168031, 1.0042808035959154, 1.0042720376022043,
+        1.0042632954138946, 1.0042545761565789, 1.0042458796221072, 1.0042372062770093,
+        1.004228557162095, 1.0042199337022037, 1.0042113374589168, 1.0042027698669833,
+        1.0041942319964485, 1.004185724376949, 1.0041772469097192, 1.0041687988782153,
+        1.0041603790527314, 1.0041519858701355], [3.30189825142678e-09,
+        9.916708848419717e-09, 1.656462861997893e-08, 2.3267949684811865e-08,
+        3.004929457527346e-08, 3.6931754248458736e-08, 4.393902719767739e-08,
+        5.109556686787474e-08, 5.84267342774399e-08, 6.595895949052615e-08,
+        7.37199128942228e-08, 8.173868827882062e-08, 9.004599866138154e-08,
+        9.867438824126956e-08, 1.0765846127281408e-07, 1.170351314360654e-07,
+        1.2684389368843447e-07, 1.371271218821452e-07, 1.4793039574083895e-07,
+        1.5930286030287625e-07, 1.7129762325350472e-07, 1.839721935902694e-07,
+        1.9738896815233365e-07, 2.116157716795826e-07, 2.2672645743926952e-07,
+        2.4280157623240946e-07, 2.599291233294422e-07, 2.782053728216927e-07,
+        2.977358119934853e-07, 3.18636188182864e-07, 3.410336848833377e-07,
+        3.650682431326798e-07, 3.908940499886861e-07, 4.1868121633600273e-07,
+        4.486176718942497e-07, 4.809113076770055e-07, 5.157924028468245e-07,
+        5.535163767002537e-07, 5.943669154489161e-07, 6.38659528796409e-07,
+        6.86745603506462e-07, 7.390170291060053e-07, 7.959114870782084e-07,
+        8.579185071876743e-07, 9.255864164902352e-07, 9.995303235310853e-07,
+        1.0804413144032508e-06, 1.1690970572974684e-06, 1.2663740639684385e-06,
+        1.3732618878745304e-06, 1.4908796050855533e-06, 1.620494985099831e-06,
+        1.7635468394687282e-06, 1.9216711398005573e-06, 2.0967316140068824e-06,
+        2.2908556792958303e-06, 2.5064767615439454e-06, 2.746384268763788e-06,
+        3.013782785464591e-06, 3.3123624028369685e-06, 3.646382556061626e-06,
+        4.020772313622534e-06, 4.4412507909293e-06, 4.914472298567016e-06,
+        5.448202048334774e-06, 6.051529823752517e-06, 6.735131093984671e-06,
+        7.511587815779918e-06, 8.395784876950764e-06, 9.405403154124043e-06,
+        1.0561537083065931e-05, 1.1889474290863505e-05, 1.3419688531374646e-05,
+        1.5189116886455191e-05, 1.7242821305865198e-05, 1.9636178295741113e-05,
+        2.2437808226122468e-05, 2.5733563099768493e-05, 2.9632068032761543e-05,
+        3.427261222479679e-05, 3.983671934541288e-05, 4.656572531164024e-05,
+        5.4788666896975636e-05, 6.496897463439754e-05, 7.778812937362036e-05,
+        9.430920567152456e-05, 0.00011633592229167848, 0.00014733998972716242,
+        0.0001955321781011425, 0.00028990018844439437, 0.0009838963576450214,
+        0.00034695722360906194, 0.00028606633611824415, 0.00027833928859468597,
+        0.00028991730836583547, 0.0003141055492913641, 0.00034965145647559493,
+        0.00039740530826741396, 0.0004595747101365457, 0.000539673276230013,
+        0.0006427933552329807, 0.0007761530342167543, 0.0009499891351958539,
+        0.0011789685700452715, 0.001484434268534445, 0.0018980532555680442,
+        0.002467908914231844, 0.003269023127194559, 0.004422272066755606,
+        0.006130063135479443, 0.008747676557002414, 0.01293671855242331,
+        0.020027700062287036, 0.03299210563587636, 0.05956601276738829,
+        0.12564590902226958, 0.3772877859620176, 6.57486680702548, 0.976134264394725,
+        1.4803884263622633, 1.090488526770569, 0.41473697166223994, 0.5253718149881265,
+        1.264727569510353, 2.091024866446433, 1.2051040928177996, 1.0130829935487762,
+        1.099836288732969, 1.498945431056173, 2.2876665179114766, 1.7078779865707032,
+        1.037491162184348, 0.7751049391185284, 0.6993350111606669, 0.7631057932996348,
+        1.009605420086665, 1.3175941674242786, 1.15278853995035, 0.9355158563828274,
+        0.858633767608559, 0.8872083796681233, 1.0161273220698595, 1.2768566299585296,
+        1.680019924039395, 1.895302639784797, 1.5913428314970066, 1.2461381635541118,
+        1.041415577214365, 0.9460769010802722, 0.9328277358523778, 0.9965220115027684,
+        1.1358721415629411, 1.2649112989937608, 1.1658586513590148, 0.9384268368131853,
+        0.7921967082385472, 0.7570129603147003, 0.8796734318886932, 0.9857870943631396,
+        1.106139375332853, 1.2219487679108858, 1.293782290210602, 1.2949383336434235,
+        1.2415322605611596, 1.1714257710032374, 1.1117920986096235, 1.0739179402354162,
+        1.0602932282419972, 1.069823679716186, 1.0993645518853774, 1.142758360906036,
+        1.1886498600405428, 1.2197628168644188, 1.2182432282722324, 1.176958037458496,
+        1.1050537910880835, 1.019959179078251, 0.9362640736374372, 0.8617433247204768,
+        0.7989094677768702, 0.7475588256270902, 0.7064849853768115, 0.6743310300790113,
+        0.6499332498692416, 0.6324213139635887, 0.6212171628255625, 0.615999601697609,
+        0.6166633123373596, 0.6232821584423011, 0.6360766187667756, 0.6553785124953881,
+        0.6815799504026835, 0.71504602811332, 0.7559624169663148, 0.8040846928532752,
+        0.8583715419705443, 0.91655005230488, 0.9748090936240144, 1.0280007803200284,
+        1.0707134490049077, 1.099051046701744, 1.1121381579412235, 1.1122708334351583,
+        1.1036781531703508, 1.0908812270893924, 1.077564054708282, 1.066167516443788,
+        1.0579557387835639, 1.053260366290575, 1.0517384167971857, 1.0525962633493309,
+        1.0547892244882278, 1.0572160388277319, 1.058910450437876, 1.0592068369606038,
+        1.057841913625224, 1.0549631631814302, 1.0510441801515968, 1.046739048235866,
+        1.0427226816329462, 1.039556852667022, 1.0376025342348094, 1.0369815997878682,
+        1.037581612462576, 1.0390953811220442, 1.0410874989940182, 1.0430791205184036,
+        1.0446385680717107, 1.045461091638386, 1.045420221628532, 1.0445785962697285,
+        1.043157066855586, 1.0414726303617678, 1.039862993397089, 1.0386159957470449,
+        1.037917308225718, 1.0378232651058448, 1.0382601276668624, 1.0390472669401447,
+        1.0399390197572291, 1.0406774645192693, 1.0410460842320015, 1.040913267182954,
+        1.040256156015064, 1.039159901630678, 1.0377937049593866, 1.036370803651517,
+        1.0351027050257329, 1.034157830350979, 1.0336321700272049, 1.0335360384124679,
+        1.0337977100726723, 1.0342820343038996, 1.0348199786419279, 1.035243348666971,
+        1.0354178963023788, 1.0352681608907865, 1.0347890689653625, 1.0340423780990429,
+        1.033139646367627, 1.0322163873573684, 1.0314035565077797, 1.0308023103094768,
+        1.030466517913998, 1.03039547348724, 1.0305372207449501, 1.030801141040541,
+        1.031077054988517, 1.0312571007327294, 1.0312562180656708, 1.0310273695842918,
+        1.0305687434859112, 1.0299219316409773, 1.0291620246053343, 1.0283821740554737,
+        1.0276760367083106, 1.0271215160884846, 1.0267685276878118, 1.0266324450151636,
+        1.0266937424089864, 1.026903334441668, 1.0271923134593488, 1.0274842418915997,
+        1.0277078925298804, 1.0278083809227678, 1.0277550108523654, 1.0275448077016243,
+        1.0272015194509052, 1.0267706432338175, 1.0263116157501941, 1.02588858459405,
+        1.0255611484007947, 1.0253761951762748, 1.0253616007898971, 1.0255221876089586,
+        1.0258380613893356, 1.0262652673737547, 1.0267386159383491, 1.0271764803239964,
+        1.0274873141244538, 1.0275775361676083, 1.0273602729634417, 1.0267642555446432,
+        1.0257419919959851, 1.0242762511026684, 1.0223839611631182, 1.0201168801527682,
+        1.0175588026315299, 1.0148195543465515, 1.0120264768711422, 1.0093144203242406,
+        1.0068153837905947, 1.004648870431662, 1.0029138063461516, 1.0016825817263877,
+        1.0009974785986655, 1.0008694978587942, 1.0012794083557608, 1.0021807099710196,
+        1.0035041182273086, 1.0051631274517738, 1.0070601867980193, 1.0090930293269111,
+        1.011160732432663, 1.0131691587285634, 1.015035522657824, 1.0166919336954838,
+        1.018087861622128, 1.0191915354602166, 1.0199903177129774, 1.0204900958997927,
+        1.0207137219986164, 1.0206985301069855, 1.020492991783039, 1.0201526337350852,
+        1.0197354358313309, 1.0192970290259888, 1.0188860975387988, 1.018540434108484,
+        1.0182840850461685, 1.0181259460978862, 1.0180600328262477, 1.0180674608054665,
+        1.018119950319427, 1.0181844455817266, 1.0182282464700116, 1.0182239323640419,
+        1.018153348901328, 1.0180100480224554, 1.0177998104670436, 1.0175391980665982,
+        1.0172524181189964, 1.0169670651878233, 1.0167094813113997, 1.0165005149717357,
+        1.0163523636368241, 1.0162669801029143, 1.0162362494717012, 1.0162438467246324,
+        1.016268409266104, 1.0162874456870814, 1.0162812859248627, 1.0162363816277025,
+        1.0161473927209559, 1.0160177267810224, 1.0158584884477653, 1.0156860886030643,
+        1.0155189988583178, 1.015374271895782, 1.015264462390667, 1.0151954824101137,
+        1.0151657357177122, 1.0151666357477926, 1.0151843646123444, 1.0152025159921618,
+        1.0152051177245693, 1.0151794748739356, 1.0151183211317514, 1.015020907440719,
+        1.0148928648497089, 1.0147449123466883, 1.0145906929029067, 1.0144441710505328,
+        1.0143170870043272, 1.0142169293304513, 1.0141457728492955, 1.0141001568697967,
+        1.014071984174245, 1.014050237804599, 1.0140231715340087, 1.013980554420611,
+        1.013915552592543, 1.0138259112496733, 1.0137142410290791, 1.0135873872463432,
+        1.01345503326722, 1.0133278266528691, 1.013215393682351, 1.0131246129313005,
+        1.0130584550660084, 1.0130155796118787, 1.0129907339455535, 1.0129758521358019,
+        1.0129616273717663, 1.0129392526067615, 1.0129020028518916, 1.012846372183418,
+        1.012772570651605, 1.0126843124275944, 1.0125879615909408, 1.0124912195363833,
+        1.0124016160994853, 1.0123250921365372, 1.0122649323888195, 1.0122212323275368,
+        1.0121909773927895, 1.0121686978873232, 1.0121475586029571, 1.012120667168106,
+        1.0120823517727668, 1.0120291724859785, 1.0119604873733585, 1.0118784834140824,
+        1.0117876851270349, 1.0116940507263172, 1.0116038382251524, 1.011522459441643,
+        1.0114535334132135, 1.0113983055923796, 1.0113555255534297, 1.011321788423245,
+        1.011292260126354, 1.011261638935821, 1.0112251673516213, 1.0111795051957275,
+        1.0111233067487562, 1.011057404978036, 1.0109845823616979, 1.0109089855401059,
+        1.0108353052414698, 1.01076788202124, 1.0107099060730929, 1.0106628557082318,
+        1.010626269850376, 1.0105978851469657, 1.0105741003698294, 1.0105506720004913,
+        1.0105235055543293, 1.0104893938685948, 1.0104465680271655, 1.010394965458134,
+        1.0103361751447213, 1.0102730809794591, 1.0102092794035162, 1.0101483864801521,
+        1.0100933658045306, 1.0100460000920999, 1.0100065985527291, 1.0099739857794905,
+        1.0099457648711638, 1.0099187976497532, 1.009889806990415, 1.0098559869176502,
+        1.0098155082426923, 1.0097678301675739, 1.0097137667390756, 1.009655303724856,
+        1.0095952074670624, 1.0095365040149922, 1.0094819278748233, 1.00943344177796,
+        1.0093919123581037, 1.0093569953037258, 1.0093272436663412, 1.0093004120504423,
+        1.0092738947749627, 1.009245213796976, 1.0092124658781014, 1.0091746488410394,
+        1.0091318114460306, 1.0090850054722968, 1.009036055458524, 1.0089871943465132,
+        1.0089406360872384, 1.0088981652928262, 1.008860818141582, 1.0088287096220396,
+        1.0088010338062303, 1.0087762316252105, 1.008752290490698, 1.008727117392904,
+        1.0086989156494248, 1.0086664970105175, 1.008629474688005, 1.008588306187673,
+        1.0085441830519672, 1.0084987924454252, 1.008453997870819, 1.0084114993082551,
+        1.0083725347099257, 1.0083376751977189, 1.0083067476542253, 1.0082788943526106,
+        1.008252754325319, 1.0082267298017906, 1.0081992869442566, 1.008169235567509,
+        1.0081359380682717, 1.0080994121114681, 1.0080603118740739, 1.0080197949839553,
+        1.0079793026034616, 1.0079402947960157, 1.0079039899349247, 1.0078711545778483,
+        1.007841979692144, 1.00781606255777, 1.007792494252257, 1.0077700338721534,
+        1.0077473358561917, 1.0077231884300561, 1.0076967205625063, 1.0076675417780765,
+        1.0076357922374415, 1.0076020971506576, 1.0075674367430347, 1.0075329575740894,
+        1.0074997605152287, 1.0074687036224663, 1.0074402542263434, 1.0074144147513835,
+        1.0073907330136571, 1.0073683925789778, 1.0073463648894954, 1.0073235946525987,
+        1.0072991850856872, 1.0072725506982456, 1.0072435119794985, 1.0072123172901144,
+        1.0071795903759013, 1.0071462148621941, 1.0071131776019377, 1.0070813991027194,
+        1.0070515805118114, 1.0070240927815477, 1.0069989255385479, 1.0069757023954413,
+        1.0069537579155659, 1.006932261154129, 1.0069103633456122, 1.0068873440136135,
+        1.006862730945396, 1.0068363747267355, 1.0068084668263826, 1.0067795000331825,
+        1.0067501796705163, 1.0067213018411942, 1.0066936197682972, 1.0066677204400585,
+        1.0066439312309017, 1.0066222705562753, 1.006602448996323, 1.0065839190275132,
+        1.0065659638983104, 1.006547810448374, 1.0065287476070917, 1.0065082322476757,
+        1.0064859668498443, 1.0064619384298148, 1.0064364145083897, 1.0064098984422871,
+        1.0063830522160473, 1.0063565989632406, 1.0063312195572447, 1.006307457458227,
+        1.0062856438550762, 1.0062658515128522, 1.0062478813122715, 1.00623128097336,
+        1.0062153915388097, 1.0061994143312796, 1.0061824895464762, 1.0061637774202596,
+        1.0061425338292536, 1.0061181739226026, 1.0060903195416235, 1.0060588283782823,
+        1.006023804741516, 1.0059855932470025, 1.0059447576563567, 1.0059020475173723,
+        1.005858355330707, 1.0058146668597956, 1.0057720070665686, 1.005731384104978,
+        1.0056937338762475, 1.0056598678108857, 1.005630426703541, 1.0056058434699509,
+        1.0055863175082416, 1.0055718028532856, 1.0055620114952113, 1.0055564321404562,
+        1.0055543634359256, 1.00555495940651, 1.0055572837401068, 1.005560368745431,
+        1.0055632744156773, 1.005565143106371, 1.0055652458606197, 1.0055630173102903,
+        1.0055580772223844, 1.0055502379974834, 1.0055394986167319, 1.0055260265538428,
+        1.005510129938933, 1.0054922227469958, 1.0054727859936239, 1.0054523278943293,
+        1.0054313457369328, 1.005410291885128, 1.0053895459195399, 1.0053693944552726,
+        1.0053500196612692, 1.0053314969432239, 1.005313801638012, 1.0052968239133777,
+        1.0052803904040837, 1.0052642904997344, 1.0052483047046754, 1.0052322321990468,
+        1.0052159147162154, 1.0051992541626171, 1.0051822220470141, 1.0051648597108,
+        1.0051472694615762, 1.005129597869168, 1.005112013524266, 1.0050946823262938,
+        1.005077743729982, 1.0050612912654224, 1.0050453600507239, 1.0050299230121127,
+        1.0050148962534724, 1.0050001526640153, 1.0049855416259939, 1.0049709117766361,
+        1.0049561333360613, 1.0049411166099644, 1.0049258239006944, 1.004910273116439,
+        1.0048945326873433, 1.0048787087683395, 1.0048629269106513, 1.0048473112243932,
+        1.0048319644003283, 1.0048169517579588, 1.004802291778515, 1.0047879544864111,
+        1.0047738677455231, 1.0047599302519725, 1.0047460289434684, 1.0047320578770442,
+        1.0047179354550928, 1.0047036172230688, 1.0046891022543711, 1.0046744322383985,
+        1.0046596836082955, 1.0046449541804066, 1.0046303466419386, 1.0046159516802324,
+        1.004601833530723, 1.004588020246279, 1.004574500149144, 1.0045612248675184,
+        1.0045481182638862, 1.004535089613739, 1.004522048744363, 1.0045089205922746,
+        1.004495656813829, 1.0044822426442506, 1.004468698039895, 1.004455073109401,
+        1.0044414387758394, 1.0044278743609332, 1.0044144542267948, 1.0044012356883902,
+        1.0043882501221995, 1.0043754986048044, 1.0043629526284632, 1.0043505595959563,
+        1.0043382520347022, 1.0043259589111644, 1.0043136171530034, 1.0043011815301208,
+        1.0042886313848538, 1.0042759732672204, 1.0042632392212403, 1.0042504811654063,
+        1.0042377624025247, 1.0042251476925468, 1.0042126934741185, 1.004200439716931,
+        1.0041884045594163, 1.0041765824004785, 1.0041649455562227, 1.0041534490544062,
+        1.0041420377022785, 1.0041306542867068, 1.0041192476784395, 1.00410777971173,
+        1.004096229964868, 1.0040845979235524, 1.0040729024044357, 1.0040611784885152,
+        1.0040494725118594, 1.004037835851453, 1.0040263183139422, 1.0040149618935175,
+        1.0040037955353511, 1.0039928313570272, 1.0039820625776732, 1.0039714632140488,
+        1.0039609894469586, 1.0039505824497856, 1.003940172403393, 1.0039296833887605,
+        1.003919038837132, 1.0039081672143138, 1.0038970076119245, 1.0038855149114634,
+        1.0038736641813664, 1.0038614539719448, 1.0038489082004358, 1.0038360763781438,
+        1.0038230320293642, 1.0038098692851878, 1.003796697793849, 1.003783636255599,
+        1.0037708050416227, 1.0037583184709191, 1.0037462773769519, 1.003734762585701,
+        1.0037238298468056, 1.0037135066184504, 1.0037037909227935, 1.0036946522865045,
+        1.0036860345870546, 1.0036778604644325, 1.0036700368478075, 1.0036624610969254,
+        1.003655027267594, 1.0036476320695942, 1.003640180177224, 1.0036325886578181,
+        1.0036247903833027, 1.0036167363707222, 1.0036083970520293, 1.0035997625028243,
+        1.0035908416712092, 1.0035816606536838, 1.003572260077655, 1.0035626916797695,
+        1.0035530142202707, 1.003543288942731, 1.0035335748655563, 1.0035239242602392,
+        1.0035143787133365, 1.0035049661672968, 1.003495699279044, 1.0034865753220203,
+        1.003477577696113, 1.0034686789191314, 1.00345984477992, 1.0034510391670775,
+        1.003442228977323, 1.0034333884757929, 1.0034245025374895, 1.0034155683416621,
+        1.0034065953013998, 1.0033976032598562, 1.0033886192346135, 1.0033796732045046,
+        1.0033707935737295, 1.0033620029935733, 1.003353315163033, 1.003344733074761,
+        1.0033362489452995, 1.0033278458044106, 1.0033195004596447, 1.0033111873403469,
+        1.0033028825942945, 1.0032945677808336, 1.0032862325808451, 1.0032778761130121,
+        1.0032695066791266, 1.003261140019703, 1.0032527964022802, 1.0032444970489216,
+        1.0032362605069325, 1.003228099562921, 1.003220019197156, 1.0032120158916555,
+        1.0032040783732998, 1.0031961896325714, 1.0031883298492186, 1.003180479713191,
+        1.0031726235751186, 1.0031647519027371, 1.0031568626490956, 1.0031489613312552,
+        1.003141059840728, 1.0031331742205456, 1.0031253218127527, 1.0031175182764078,
+        1.0031097749852025, 1.0031020972359785, 1.0030944835500304, 1.003086926155338,
+        1.0030794125338238, 1.0030719277386817, 1.0030644570627467, 1.0030569885897374,
+        1.003049515192666, 1.0030420356501923, 1.0030345547119999, 1.0030270821296974,
+        1.0030196308474002, 1.003012214686034, 1.0030048459338203, 1.0029975332609358,
+        1.00299028030929, 1.0029830851826897, 1.0029759409011072, 1.0029688367145777,
+        1.0029617600264162, 1.0029546985768465, 1.0029476425025148, 1.0029405859192522,
+        1.0029335277678373, 1.0029264717972375, 1.0029194257131073, 1.0029123996633909,
+        1.002905404343415, 1.0028984490612591, 1.0028915401017637, 1.002884679666359,
+        1.002877865557973, 1.0028710916459547, 1.0028643490089182, 1.0028576275380667,
+        1.0028509177089553, 1.0028442122081653, 1.0028375071349853, 1.002830802579836,
+        1.0028241024951143, 1.0028174138998647, 1.00281074557471, 1.0028041064881434,
+        1.0027975042356025, 1.0027909437628109, 1.002784426587803, 1.002777950643102,
+        1.002771510747826, 1.0027650996091992, 1.0027587091631616, 1.0027523320097254,
+        1.002745962688961, 1.0027395985783265, 1.002733240264464, 1.0027268913386471,
+        1.0027205576674438, 1.002714246280811, 1.0027079640829932, 1.0027017166172296,
+        1.0026955070996355, 1.002689335884726, 1.0026832004451005, 1.002677095855507,
+        1.0026710156834104, 1.0026649531195988, 1.0026589021447154, 1.0026528585267451,
+        1.002646820479615, 1.0026407888768254, 1.00263476699488, 1.0026287598443049,
+        1.0026227732166022, 1.0026168126219606, 1.002610882306842, 1.0026049845216072,
+        1.0025991191599317, 1.0025932838233793, 1.0025874742886296, 1.0025816852848035,
+        1.0025759114365391, 1.0025701482031308, 1.0025643926492211, 1.0025586439162748,
+        1.0025529033198455, 1.0025471740650322, 1.002541460639484, 1.0025357679980849,
+        1.0025301006868728, 1.0025244620604195, 1.0025188537265246, 1.0025132753088224,
+        1.002507724560049, 1.0025021977965578, 1.0024966905695902, 1.0024911984496738,
+        1.00248571778423, 1.00248024629701, 1.0024747834290764, 1.0024693303690662,
+        1.0024638897759763, 1.0024584652514448, 1.002453060660572, 1.0024476794241712,
+        1.0024423239069709, 1.0024369950061767, 1.0024316920071212, 1.002426412724276,
+        1.0024211538957464, 1.002415911756005, 1.0024106826825707, 1.0024054638022935,
+        1.0024002534529295, 1.0023950514236954, 1.0023898589388858, 1.0023846783943244,
+        1.002379512899057, 1.0023743657070041, 1.002369239640194, 1.0023641366037974,
+        1.0023590572744967, 1.0023540010114618, 1.0023489659991396, 1.0023439495907014,
+        1.0023389487869498, 1.0023339607638484, 1.002328983355704, 1.0023240154113422,
+        1.002319056964726, 1.002314109195263, 1.0023091741900823, 1.002304254554421,
+        1.0022993529413857, 1.0022944715842044, 1.0022896119116085, 1.0022847743103638,
+        1.0022799580720032, 1.0022751615280883, 1.0022703823458279, 1.0022656179291063,
+        1.0022608658534178, 1.0022561242593324, 1.0022513921382983, 1.0022466694649377,
+        1.0022419571574326, 1.0022372568775686, 1.002232570709126, 1.0022279007728703,
+        1.0022232488457652, 1.0022186160492452, 1.002214002657957, 1.002209408058362,
+        1.0022048308603368, 1.0022002691388543, 1.0021957207613619, 1.0021911837432778,
+        1.0021866565707602, 1.0021821384372205, 1.0021776293559796, 1.0021731301333792,
+        1.0021686422104619, 1.0021641674031716, 1.0021597075870103, 1.0021552643801481,
+        1.00215083887751, 1.0021464314785298, 1.0021420418342981, 1.002137668919533,
+        1.0021333112138406, 1.0021289669594444, 1.0021246344508916, 1.0021203123084519,
+        1.0021159996910818, 1.0021116964160504, 1.002107402968452, 1.002103120402215,
+        1.0020988501514918, 1.0020945937851362, 1.0020903527448985, 1.002086128109205,
+        1.0020819204188733, 1.002077729590247, 1.002073554926593, 1.0020693952231567,
+        1.0020652489470165], [1.4330709589268089e-09, 4.3041778400931925e-09,
+        7.190210645400453e-09, 1.0101221883023028e-08, 1.3047417594219004e-08,
+        1.603922147185998e-08, 1.908733962579327e-08, 2.220282917666544e-08,
+        2.5397169387545218e-08, 2.8682336975748818e-08, 3.207088608327126e-08,
+        3.557603384419081e-08, 3.921175203154743e-08, 4.299286634301484e-08,
+        4.693516375573956e-08, 5.1055509612710245e-08, 5.5371975415023754e-08,
+        5.990397887676282e-08, 6.467243794976875e-08, 6.969994032644085e-08,
+        7.501093096683753e-08, 8.063191934308172e-08, 8.659170947848259e-08,
+        9.292165550214131e-08, 9.965594607343224e-08, 1.0683192140402e-07,
+        1.1449042741134807e-07, 1.226762115445855e-07, 1.314383662542682e-07,
+        1.4083082605794968e-07, 1.5091292611864482e-07, 1.6175002998453665e-07,
+        1.7341423677355708e-07, 1.8598517834148543e-07, 1.9955091956154635e-07,
+        2.1420897597228469e-07, 2.300674661295368e-07, 2.4724641776006063e-07,
+        2.658792509020013e-07, 2.861144636592932e-07, 3.081175517408322e-07,
+        3.320731965345156e-07, 3.5818776377038154e-07, 3.8669216027365933e-07,
+        4.178451060668569e-07, 4.5193688643082186e-07, 4.892936636154714e-07,
+        5.302824361777258e-07, 5.753167565284303e-07, 6.248633299657799e-07,
+        6.794496466728149e-07, 7.396728230398986e-07, 8.062098614544255e-07,
+        8.798295794629957e-07, 9.614065050371972e-07, 1.051937092433354e-06,
+        1.1525586859701902e-06, 1.2645717386029406e-06, 1.3894659014453372e-06,
+        1.5289507214359037e-06, 1.6849918404543671e-06, 1.859853778483192e-06,
+        2.056150614303286e-06, 2.276906163785919e-06, 2.5256256101420846e-06,
+        2.8063809811101167e-06, 3.123913411681964e-06, 3.4837558159867103e-06,
+        3.892380449158475e-06, 4.3573769102614065e-06, 4.88766749758388e-06,
+        5.493768545348042e-06, 6.1881085593737265e-06, 6.9854167456490645e-06,
+        7.903199116499202e-06, 8.962323941576261e-06, 1.0187744284542578e-05,
+        1.1609393065811812e-05, 1.3263296196943715e-05, 1.5192962586387644e-05,
+        1.7451127237101243e-05, 2.0101946853692057e-05, 2.3223778267740463e-05,
+        2.6912711438663544e-05, 3.1287084838473764e-05, 3.649328716948111e-05,
+        4.2713253726005994e-05, 5.01742096050174e-05, 5.916141208830178e-05,
+        7.003492531584729e-05, 8.32518570839622e-05, 9.939605477277896e-05,
+        0.00011921807481200194, 0.00014368943202016203, 0.00017407689232786175,
+        0.00021204519609979613, 0.00025980056613345915, 0.0003202934441553893,
+        0.000397508386177544, 0.0004968840873653894, 0.0006259307905560595,
+        0.0007951523549730646, 0.0010194477255520004, 0.0013202831805578209,
+        0.0017291341412250338, 0.002293076175788518, 0.003084130136624212,
+        0.004215407223531101, 0.005870106737502305, 0.008356072899294808,
+        0.012214418583592491, 0.018451680235576313, 0.029083630023400364,
+        0.04857736165547919, 0.08842531447452792, 0.18648245534033595, 0.5521917132045137,
+        9.248559707889626, 1.246270386049037, 1.4450778657086452, 0.23851774063212103,
+        0.5555476825662461, 1.2395697037204134, 3.2410337009515993, 5.46084228584212,
+        3.218429415221865, 2.8483710858837354, 3.693087631235531, 3.518040762225469,
+        2.6372224092729284, 1.7294043235006937, 1.1830563492223714, 1.0746554881721861,
+        1.1746441623709247, 1.4876190112568974, 2.135096239577242, 2.811203154591254,
+        2.347152452986082, 1.7622024291744607, 1.4785090011810063, 1.3950061808908854,
+        1.4650413922511625, 1.6991823407284543, 2.0794408350532883, 2.2006366785617253,
+        1.7500338203595174, 1.3127032057584975, 1.0654223689658902, 0.9561008966699942,
+        0.9504726775406668, 1.047356882221339, 1.2588159418354847, 1.5017699134179754,
+        1.4883341371816927, 1.2726596483476331, 1.111953593176493, 1.0625068155282207,
+        1.1572138523262663, 1.2528875583860084, 1.369709488514641, 1.4803492106796565,
+        1.537962630208528, 1.5141197342773631, 1.4309346178208573, 1.3334028551012442,
+        1.2520333817304703, 1.1984052623792574, 1.1741662000931894, 1.1772099424335454,
+        1.2034406141286058, 1.2457101615250308, 1.2914271512129785, 1.3217658347992496,
+        1.3174199965295386, 1.270726122637577, 1.1915477036773285, 1.0985940684364721,
+        1.0074636041598692, 0.9264130672897058, 0.8580588171721183, 0.8021230947830138,
+        0.7572730888079892, 0.7220308990334429, 0.6951372342853372, 0.6756546361097949,
+        0.6629631812511325, 0.6567204786911158, 0.6568166191147243, 0.6633344986707882,
+        0.6765151829930202, 0.6967208651866276, 0.7243813371055073, 0.7599019596652035,
+        0.8035020850838414, 0.8549480015623455, 0.9131603039650177, 0.9757455364846471,
+        1.0386597239514828, 1.0964098270295017, 1.1431863437623153, 1.1747605273419082,
+        1.1901053823856695, 1.1915811218715306, 1.183632523945538, 1.1710424393747678,
+        1.15772037752031, 1.146259408843986, 1.1379990965383748, 1.1332818645363167,
+        1.1317271768397212, 1.1324721474500286, 1.1343879332794449, 1.1362915704254997,
+        1.137154424464545, 1.1362812900788655, 1.1334186458653663, 1.1287606966797188,
+        1.1228544193971794, 1.1164394719409538, 1.110274418687799, 1.10499228482359,
+        1.1010072877147064, 1.0984753353287156, 1.0973007996976922, 1.0971799693742992,
+        1.0976723707934024, 1.09829041541338, 1.0985942717890564, 1.09827465898813,
+        1.097205543212458, 1.0954545010436463, 1.0932498665034474, 1.090915866365814,
+        1.0887943069238701, 1.087171663652211, 1.0862253557847097, 1.085996197130374,
+        1.0863883024579366, 1.0871938415171103, 1.0881372276261045, 1.088930710367554,
+        1.0893309245152751, 1.0891848308617829, 1.0884550713018186, 1.0872194986687387,
+        1.0856462789635268, 1.0839520474974196, 1.082353934960006, 1.0810261621929405,
+        1.080069214644313, 1.0794959060612892, 1.079235141267311, 1.079151342704743,
+        1.079075240893603, 1.0788399529617085, 1.0783152226548105, 1.0774328825289865,
+        1.0761984064318502, 1.074686648166611, 1.0730236180453177, 1.071359227302613,
+        1.0698374312446846, 1.0685699388271999, 1.0676180966933748, 1.0669854254388387,
+        1.0666211720330503, 1.0664334333344134, 1.0663089785434796, 1.0661359027680297,
+        1.0658248156850296, 1.0653245927497434, 1.0646298676544175, 1.0637792434941926,
+        1.0628451994535566, 1.061918319122027, 1.0610893506336563, 1.0604326095644054,
+        1.059993525578721, 1.0597820367769213, 1.0597723623101156, 1.0599086378905231,
+        1.0601150750025583, 1.0603087403876426, 1.0604127781146437, 1.0603679476918222,
+        1.0601407410449486, 1.0597270185087486, 1.0591509385477014, 1.0584597629588384,
+        1.0577157210026986, 1.0569864043845838, 1.0563351337162883, 1.0558124675947764,
+        1.0554496429744729, 1.0552543587098506, 1.055209020678289, 1.055271382343169,
+        1.0553774202978898, 1.0554462351100318, 1.0553867122232843, 1.0551055765062893,
+        1.0545163146062455, 1.053548243589288, 1.0521548272800147, 1.050320256545609,
+        1.048063382358087, 1.0454383500106263, 1.042531701806043, 1.0394562111397212,
+        1.036342170298048, 1.0333271742175743, 1.0305455638263026, 1.0281186159856046,
+        1.0261463428597528, 1.0247014661834388, 1.0238258315617101, 1.02352927175553,
+        1.0237907348975506, 1.0245613609692583, 1.0257691044653292, 1.0273244501739838,
+        1.029126746199197, 1.031070684649396, 1.0330524995411632, 1.034975524012828,
+        1.03675484735478, 1.0383209204178703, 1.0396220547769706, 1.040625828699806,
+        1.0413194437908793, 1.0417090766428805, 1.0418182582709046, 1.0416853138064974,
+        1.0413599246100036, 1.040898941329861, 1.0403616713533277, 1.0398049673802743,
+        1.0392785298239149, 1.0388208806176835, 1.0384564532058769, 1.0381941659048886,
+        1.0380277055716236, 1.0379375563118345, 1.0378945831061426, 1.0378647513876558,
+        1.0378143681605612, 1.0377151099388655, 1.0375480942421844, 1.037306373615833,
+        1.0369954747927237, 1.0366319300298368, 1.0362400889538868, 1.0358477874954048,
+        1.0354816291186402, 1.0351626732240902, 1.034903227802315, 1.034705234582868,
+        1.0345604561511412, 1.0344523720398282, 1.0343594102860936, 1.034258924324808,
+        1.0341312075112747, 1.0339628419921267, 1.0337488088248248, 1.033493021513657,
+        1.033207241164595, 1.0329086290214295, 1.0326164316737476, 1.0323484309362854,
+        1.0321178041076158, 1.0319309371142094, 1.0317865399143675, 1.0316761696587367,
+        1.0315860156695136, 1.031499582564514, 1.0314007588609033, 1.031276702961756,
+        1.0311200266614533, 1.0309298998696002, 1.0307119117382022, 1.0304767606834921,
+        1.030238061345776, 1.030009708616317, 1.0298033011574559, 1.0296260930339534,
+        1.0294798247893573, 1.0293606110007627, 1.0292598637197872, 1.0291660451626992,
+        1.0290668998800594, 1.028951740219523, 1.028813361906499, 1.0286492477984444,
+        1.028461861292493, 1.0282580079118901, 1.0280474189069493, 1.0278408500505232,
+        1.0276480667615442, 1.0274760916647447, 1.0273280260745639, 1.0272026386684032,
+        1.0270947669433155, 1.02699642733858, 1.026898404374972, 1.026792009125291,
+        1.0266706760686335, 1.0265311077855614, 1.0263737705183873, 1.0262026715834205,
+        1.0260244865055927, 1.0258472227922586, 1.025678686241065, 1.0255250414323835,
+        1.0253897285593419, 1.0252729224663661, 1.0251716130211377, 1.0250802692871015,
+        1.0249919444938012, 1.0248996028518835, 1.0247974156212234, 1.024681787680848,
+        1.0245519336384727, 1.0244099124586368, 1.024260133773297, 1.024108447104613,
+        1.023960998651315, 1.0238230761763094, 1.0236981559263942, 1.0235873197652576,
+        1.0234891361253617, 1.0234000098015281, 1.0233149194865445, 1.023228393594525,
+        1.023135536067289, 1.0230329107808473, 1.0229191255749426, 1.0227950179421097,
+        1.0226634218179038, 1.022528573567454, 1.0223952802094585, 1.0222680124164294,
+        1.0221500925707148, 1.0220431241527266, 1.0219467588677738, 1.0218588324020492,
+        1.0217758310014697, 1.02169359165793, 1.0216080989611833, 1.0215162282630414,
+        1.021416299471507, 1.0213083451293448, 1.0211940524607324, 1.0210764008115212,
+        1.020959071575715, 1.0208457470660013, 1.0207394311430849, 1.0206419156999877,
+        1.020553485983839, 1.020472910837359, 1.020397710366538, 1.0203246431733528,
+        1.0202503170814554, 1.0201718077538005, 1.02008717178007, 1.0199957637254207,
+        1.0198983055031574, 1.0197967036062738, 1.0196936561775376, 1.019592128999898,
+        1.0194948007154792, 1.019403579641574, 1.019319277854737, 1.0192414965654246,
+        1.0191687365210393, 1.0190987058259415, 1.0190287626119874, 1.0189564075068451,
+        1.018879734512228, 1.0187977594085504, 1.0187105697545165, 1.0186192749538532,
+        1.018525772090799, 1.0184323763317125, 1.0183413877030025, 1.0182546751383554,
+        1.0181733527276824, 1.0180976037747496, 1.0180266795926682, 1.0179590674440637,
+        1.017892791629827, 1.0178257888212339, 1.0177562871884778, 1.0176831204413292,
+        1.017605921899507, 1.0175251672390493, 1.0174420630385537, 1.0173583063107443,
+        1.0172757627400553, 1.0171961244430978, 1.017120609700527, 1.0170497574195334,
+        1.0169833502526855, 1.0169204760383528, 1.0168597120677059, 1.016799395136987,
+        1.0167379261345406, 1.0166740533447773, 1.0166070842538206, 1.0165369900973826,
+        1.0164643878254571, 1.016390406687442, 1.0163164671237739, 1.0162440144568583,
+        1.0161742565431882, 1.0161079521856633, 1.016045286473361, 1.0159858525177798,
+        1.0159287394740142, 1.0158727078374798, 1.0158164181069818, 1.015758670504281,
+        1.0156986128184045, 1.0156358804666232, 1.0155706460431544, 1.0155035724179187,
+        1.015435680737405, 1.0153681593695567, 1.015302149404851, 1.0152385452674833,
+        1.0151778450338689, 1.0151200751595906, 1.0150648004385538, 1.015011214732165,
+        1.0149582940258324, 1.0149049830815924, 1.0148503820235062, 1.0147939002938768,
+        1.01473535216006, 1.0146749789658454, 1.0146133965385855, 1.0145514791968326,
+        1.014490202390189, 1.0144304723954245, 1.0143729727489692, 1.0143180532049516,
+        1.014265678845654, 1.0142154461063815, 1.0141666608657307, 1.0141184633945166,
+        1.0140699775553967, 1.0140204583345143, 1.0139694129680452, 1.013916676223476,
+        1.01386242875312, 1.0138071573237675, 1.0137515654168985, 1.0136964505766703,
+        1.013642569726739, 1.0135905148245459, 1.0135406186649465, 1.0134929049892318,
+        1.01344708937891, 1.0134026290606617, 1.0133588120951962, 1.0133148706495085,
+        1.0132700999706918, 1.0132239646229713, 1.0131761763477105, 1.013126732947548,
+        1.0130759139502856, 1.0130242354054428, 1.0129723719743062, 1.0129210586700295,
+        1.0128709866854193, 1.0128227075872847, 1.012776557990609, 1.0127326131708159,
+        1.0126906736177061, 1.0126502840101193, 1.0126107801484399, 1.0125713565032346,
+        1.0125311454772303, 1.0124892992544057, 1.0124450660386781, 1.0123978542353957,
+        1.0123472803027929, 1.0122931982094958, 1.0122357103650783, 1.0121751613467405,
+        1.012112116661656, 1.0120473292131975, 1.0119816962137975, 1.011916209178351,
+        1.0118518994974015, 1.0117897820388242, 1.0117307992994011, 1.0116757687899776,
+        1.0116253364999865, 1.0115799393305147, 1.0115397791968608, 1.0115048110048466,
+        1.0114747458824045, 1.0114490699487264, 1.011427077637782, 1.0114079173153214,
+        1.011390645805834, 1.0113742876324743, 1.0113578943786103, 1.0113405996553797,
+        1.0113216656875141, 1.0113005184299948, 1.0112767692750195, 1.0112502226528954,
+        1.0112208700262244, 1.0111888718017203, 1.0111545294578885, 1.0111182506747183,
+        1.0110805104616927, 1.0110418112533868, 1.0110026447333256, 1.0109634578131486,
+        1.0109246247798909, 1.0108864271540965, 1.0108490422852259, 1.0108125411442388,
+        1.0107768951566534, 1.0107419912619988, 1.0107076537202802, 1.0106736705674442,
+        1.0106398221253907, 1.0106059086800812, 1.0105717744284968, 1.0105373251085574,
+        1.01050253737148, 1.0104674588862976, 1.0104321992832621, 1.0103969132062427,
+        1.0103617777907339, 1.0103269676543836, 1.0102926308513733, 1.0102588691261862,
+        1.010225725203079, 1.010193178837552, 1.0101611520763287, 1.0101295228117848,
+        1.0100981444834742, 1.0100668688670078, 1.0100355684457447, 1.0100041549583458,
+        1.009972591342974, 1.0099408953602476, 1.0099091345023057, 1.0098774131726935,
+        1.0098458543292392, 1.0098145786260089, 1.0097836844369699, 1.009753231941409,
+        1.0097232337384157, 1.0096936533569347, 1.0096644117241154, 1.00963540036376,
+        1.0096064990300766, 1.0095775948109138, 1.0095485995623998, 1.0095194628826265,
+        1.0094901786285349, 1.0094607840864465, 1.0094313521334748, 1.0094019778682681,
+        1.0093727620583517, 1.0093437942105397, 1.0093151380545693, 1.0092868217536368,
+        1.0092588343102096, 1.0092311285715887, 1.0092036301399867, 1.009176250539379,
+        1.0091489023398736, 1.0091215136885217, 1.009094039872658, 1.009066470105504,
+        1.009038828567297, 1.0090111697105881, 1.0089835687788717, 1.0089561092398185,
+        1.0089288692803449, 1.0089019095884304, 1.0088752643570091, 1.0088489368504419,
+        1.0088229000834539, 1.0087971023135411, 1.0087714762819417, 1.008745950576657,
+        1.0087204612160643, 1.0086949615955674, 1.008669429280164, 1.008643868693894,
+        1.0086183094501326, 1.0085928007666187, 1.0085674030036282, 1.0085421777636652,
+        1.0085171781435818, 1.0084924406258327, 1.0084679797665275, 1.0084437863500113,
+        1.0084198291196365, 1.0083960596540746, 1.0083724195197787, 1.0083488485525736,
+        1.0083252930342843, 1.0083017126303564, 1.008278085210233, 1.0082544090303207,
+        1.0082307021567243, 1.0082069993790093, 1.0081833471654387, 1.0081597974013252,
+        1.0081364007224831, 1.0081132002141187, 1.008090226115122, 1.0080674919830523,
+        1.0080449925715036, 1.0080227034803255, 1.0080005824826432, 1.007978572320537,
+        1.0079566046934056, 1.0079346051299367, 1.007912498422929, 1.0078902143029358,
+        1.007867693022767, 1.0078448905178083, 1.0078217828013083, 1.0077983692583614,
+        1.0077746745297194, 1.0077507487363888, 1.007726665893972, 1.007702520499568,
+        1.0076784224330841, 1.0076544904817117, 1.0076308449483418, 1.0076075999194432,
+        1.0075848558259783, 1.0075626929206405, 1.007541166214436, 1.0075203022740211,
+        1.0075000980966933, 1.0074805220769658, 1.0074615168840884, 1.0074430039083715,
+        1.0074248888237636, 1.0074070677642843, 1.007389433621707, 1.007371882031161,
+        1.0073543167036965, 1.0073366538704616, 1.0073188257033134, 1.0073007826579536,
+        1.007282494740268, 1.0072639517260964, 1.0072451623762233, 1.0072261526941584,
+        1.007206963286966, 1.0071876459191598, 1.0071682594007973, 1.0071488650202924,
+        1.0071295218097172, 1.0071102819991273, 1.0070911870585235, 1.0070722647240913,
+        1.0070535273488932, 1.007034971804465, 1.0070165809978653, 1.0069983268772302,
+        1.0069801746045717, 1.0069620874078624, 1.006944031514101, 1.0069259805332047,
+        1.0069079187197503, 1.0068898426825974, 1.0068717613237552, 1.0068536940377997,
+        1.006835667454117, 1.006817711217812, 1.006799853446046, 1.0067821165422493,
+        1.0067645139913763, 1.0067470486039896, 1.0067297124487466, 1.0067124884478336,
+        1.0066953533504384, 1.0066782815867104, 1.006661249373369, 1.006644238412714,
+        1.006627238603644, 1.006610249353043, 1.0065932793100039, 1.0065763446047475,
+        1.0065594659160664, 1.0065426648757785, 1.0065259604165222, 1.0065093656652473,
+        1.0064928858811968, 1.0064765177530144, 1.0064602501366637, 1.0064440660743583,
+        1.0064279457246668, 1.0064118696905786, 1.0063958221780211, 1.0063797934596075,
+        1.0063637812482134, 1.0063477907784752, 1.0063318336175102, 1.0063159254404315,
+        1.0063000831756452, 1.0062843220214308, 1.0062686528443296, 1.0062530803917134,
+        1.006237602601046, 1.006222211093929, 1.006206892738392, 1.0061916319832334,
+        1.0061764135438498, 1.0061612249696874, 1.0061460586561093, 1.0061309129703044,
+        1.0061157923217199, 1.006100706193532, 1.0060856673298884, 1.0060706894140068,
+        1.0060557846508664, 1.0060409616738002, 1.006026224127045, 1.006011570150262,
+        1.0059969928290202, 1.0059824815065461, 1.0059680237058084, 1.0059536073121458,
+        1.0059392226309338, 1.005924863966809, 1.0059105304636644, 1.0058962260797466,
+        1.0058819587259336, 1.005867738739774, 1.0058535769786796, 1.0058394828742065,
+        1.0058254627868888, 1.0058115189396837, 1.0057976490997997, 1.0057838470439535,
+        1.0057701037046023, 1.0057564087790527, 1.0057427525084666, 1.0057291273122677,
+        1.0057155289971451, 1.0057019573417252, 1.0056884159722577, 1.0056749115707213,
+        1.0056614525721113, 1.0056480475925629, 1.0056347038703812, 1.0056214259920773,
+        1.0056082151182664, 1.0055950688310875, 1.0055819816127811, 1.0055689458545032,
+        1.0055559532044038, 1.005542996009877, 1.0055300685990824, 1.0055171681818502,
+        1.0055042952226776, 1.0054914532349197, 1.0054786480479225, 1.0054658866898054,
+        1.0054531760918965, 1.005440521846564, 1.005427927234487, 1.0054153926843699,
+        1.005402915747945, 1.005390491580551, 1.0053781138292428, 1.005365775761624,
+        1.0053534714308447, 1.0053411966713441, 1.0053289497551627, 1.0053167316025358,
+        1.0053045455215839, 1.005292396535103, 1.0052802904232094, 1.0052682326571558,
+        1.0052562274139487, 1.0052442768423637, 1.0052323807024073, 1.0052205364316538,
+        1.0052087396158476, 1.005196984770882, 1.0051852662913414, 1.005173579395401,
+        1.0051619209010452, 1.0051502897024285, 1.0051386868711079, 1.0051271153744394,
+        1.0051155794705966, 1.0051040838945466, 1.0050926329828598, 1.0050812298918999,
+        1.0050698760435304, 1.00505857088911, 1.0050473120245642, 1.0050360956269995,
+        1.00502491712815, 1.005013772000697, 1.0050026565172077, 1.004991568350018,
+        1.0049805069115572, 1.0049694733827903, 1.0049584704330823, 1.0049475016886786,
+        1.0049365710491653, 1.0049256819751728, 1.0049148368722272, 1.0049040366754791,
+        1.0048932807022581, 1.0048825667908305, 1.0048718916934452, 1.0048612516482902,
+        1.004850643025842, 1.0048400629350351, 1.0048295096847015, 1.0048189830238254,
+        1.0048084841246068, 1.0047980153181548, 1.0047875796353394, 1.0047771802377101,
+        1.0047668198403186, 1.0047565002268872, 1.0047462219389953, 1.004735984188624,
+        1.00472578500324, 1.0047156215721174, 1.0047054907285018, 1.0046953894805055,
+        1.0046853154975006, 1.0046752674691095, 1.0046652452780624, 1.0046552499620833,
+        1.004645283477077, 1.0046353483078478, 1.0046254469977667, 1.004615581680674,
+        1.0046057536958413, 1.004595963350145, 1.0045862098646063, 1.0045764915096167,
+        1.0045668059006412, 1.0045571503993387, 1.004547522548448, 1.0045379204649385,
+        1.004528343125098, 1.0045187904956703, 1.004509263492617, 1.0044997637791628,
+        1.0044902934419284, 1.004480854603575, 1.0044714490397781, 1.0044620778655322,
+        1.0044527413423392, 1.004443438835758, 1.004434168926465, 1.0044249296518717,
+        1.0044157188338187, 1.0044065344346376, 1.0043973748805997, 1.0043882392991024,
+        1.0043791276318983, 1.004370040608635, 1.0043609795888202, 1.0043519463022184,
+        1.0043429425336874, 1.0043339698065585, 1.0043250291171537, 1.0043161207632119,
+        1.0043072442919703, 1.004298398573314, 1.0042895819824, 1.004280792658843,
+        1.0042720287978537, 1.0042632889249237, 1.0042545721098266, 1.004245878086952,
+        1.0042372072651624, 1.0042285606287862, 1.0042199395486706, 1.0042113455360868,
+        1.004202779980203, 1.0041942439110971, 1.0041857378247419, 1.0041772615955191,
+        1.0041688144871357, 1.0041603952573384, 1.004152002337553], [2.72696195515166e-10,
+        8.191483708477731e-10, 1.3687872877675697e-09, 1.9237617951066966e-09,
+        2.4862574807358686e-09, 3.058512034314709e-09, 3.6428308875997026e-09,
+        4.2416037882803945e-09, 4.857322113077646e-09, 5.492597290552986e-09,
+        6.150180487414036e-09, 6.832983807260785e-09, 7.544103170051879e-09,
+        8.28684325923805e-09, 9.064744715063148e-09, 9.881614005650024e-09,
+        1.0741556288357569e-08, 1.1649011705462497e-08, 1.260879560926841e-08,
+        1.3626143195170926e-08, 1.470675925711213e-08, 1.5856873640391862e-08,
+        1.708330328319704e-08, 1.839352171073809e-08, 1.9795737025316233e-08,
+        2.1298979571637526e-08, 2.2913200693625085e-08, 2.4649384081416636e-08,
+        2.6519671601773568e-08, 2.853750561330516e-08, 3.0717790316587084e-08,
+        3.3077074787603974e-08, 3.5633761091339454e-08, 3.8408341146471606e-08,
+        4.1423666832291894e-08, 4.4705258383218946e-08, 4.828165715997423e-08,
+        5.2184829713580725e-08, 5.645063149361945e-08, 6.11193397270846e-08,
+        6.623626700261207e-08, 7.185246881809165e-08, 7.802556112403398e-08,
+        8.48206664830583e-08, 9.231151135593067e-08, 1.005817007110641e-07,
+        1.0972620213460336e-07, 1.1985307652654728e-07, 1.310855015318286e-07,
+        1.4356414138946248e-07, 1.5744992929701428e-07, 1.729273413911522e-07,
+        1.9020825813493475e-07, 2.0953653009251156e-07, 2.3119339012548876e-07,
+        2.5550388576565716e-07, 2.828445458592076e-07, 3.1365254369603246e-07,
+        3.4843668272740473e-07, 3.877906083553866e-07, 4.324087497433127e-07,
+        4.831056232813642e-07, 5.408392927489354e-07, 6.067399928667803e-07,
+        6.821451982109875e-07, 7.686427805177166e-07, 8.681243728662625e-07,
+        9.828516947331274e-07, 1.115539446725385e-06, 1.2694595438882872e-06,
+        1.448573056235284e-06, 1.6576984544742837e-06, 1.902727915954319e-06,
+        2.190907983444615e-06, 2.5312075360890967e-06, 2.9348060058268824e-06,
+        3.4157501037114394e-06, 3.991851495993878e-06, 4.6859372890733644e-06,
+        5.527631819576375e-06, 6.555965758894731e-06, 7.8233264002978e-06,
+        9.401691039945454e-06, 1.1392987089376118e-05, 1.3947490095273496e-05,
+        1.7299439768175e-05, 2.1844451213210617e-05, 2.8337552990157022e-05,
+        3.854351921113726e-05, 5.8608863826910805e-05, 0.00020415139839115995,
+        7.394068330665075e-05, 6.266310199234124e-05, 6.27207496486227e-05,
+        6.72631161357249e-05, 7.510034305863153e-05, 8.623588045859682e-05,
+        0.00010121017900505335, 0.00012099526390088082, 0.0001470569106157113,
+        0.00018152258722923102, 0.00022746897396548987, 0.0002893847580014453,
+        0.0003739155722308785, 0.0004910841458207808, 0.0006563391627646922,
+        0.0008941007147913138, 0.0012441156897746316, 0.0017733313222106732,
+        0.0025991955711073267, 0.003938181882236926, 0.006214570231049419,
+        0.010328399160389787, 0.018404034887080038, 0.03629254417845406,
+        0.08469537560393524, 0.28636791273362205, 5.762179266763, 1.0250643434382425,
+        1.9655023658553923, 1.9229284040371974, 0.8218645852296415, 0.7154529963482354,
+        1.0655471459566581, 1.2678945774393506, 0.644687080410972, 0.5599679830797905,
+        0.6790233748900277, 1.0646100973568446, 1.888893771569152, 1.6457080059867584,
+        1.166531464776255, 1.010078793172014, 1.0354157796726142, 1.2323064819822234,
+        1.6715778809207265, 2.0917304354614523, 1.6678260252314847, 1.2008676267278584,
+        0.9701847060477871, 0.885380018008818, 0.9043393203617649, 1.0277567049322074,
+        1.2451907165429308, 1.3227837181868607, 1.074493572505189, 0.8396367324907569,
+        0.7235492584178573, 0.6993465051061978, 0.753372826504461, 0.8962177425196003,
+        1.1484161088251368, 1.434676254615261, 1.4602115084177176, 1.2595795599481594,
+        1.0934187911962714, 1.0225704941415332, 1.0586192391339178, 1.1252930450413619,
+        1.2152481163386426, 1.301462828822672, 1.3426496730848365, 1.3147323160759683,
+        1.2375039519417979, 1.1498620133612654, 1.077715157745821, 1.030600641053185,
+        1.0096334714253048, 1.012840154198796, 1.036638898850723, 1.0748725473418024,
+        1.1166758318704968, 1.1456945620476182, 1.144977346232874, 1.1075099726089823,
+        1.0415051499866463, 0.9630370086213261, 0.885659266461451, 0.8166357615253486,
+        0.7583432496319434, 0.7106275267061388, 0.6723975192192873, 0.6424208476662228,
+        0.6196456912135543, 0.6032949760329503, 0.5928656018963038, 0.5880955282904862,
+        0.5889258343337365, 0.595467147478208, 0.6079702857055437, 0.6267945360966173,
+        0.6523609292903825, 0.6850705738422186, 0.7251597367651358, 0.7724585922964182,
+        0.8260343905558168, 0.8837626680323661, 0.9420133301570089, 0.9958205859512744,
+        1.0398989707563608, 1.0703639211775116, 1.0862178800649744, 1.0895426065321645,
+        1.0843349353941467, 1.0749253512703305, 1.0648711206102943, 1.0565432517047944,
+        1.0511741458478108, 1.0490835678292734, 1.0499232583654003, 1.0528932503758253,
+        1.0569385586929387, 1.0609445030012004, 1.0639317476343728, 1.0652265289009166,
+        1.0645664023698846, 1.0621107149447333, 1.0583553995635677, 1.0539846834005704,
+        1.049707805678999, 1.0461216756008096, 1.0436208640735254, 1.0423581728550044,
+        1.042249294074769, 1.0430128178029108, 1.0442373557055316, 1.0454666722640902,
+        1.046290205748721, 1.0464222883709497, 1.0457526815090143, 1.0443565991579877,
+        1.0424633066239652, 1.0403940029390581, 1.0384867765805619, 1.0370267114767473,
+        1.036194355966737, 1.0360392448671802, 1.0364796790222734, 1.0373262421121863,
+        1.0383238635075802, 1.039204758220341, 1.0397422910247256, 1.0397947604228572,
+        1.0393296092281372, 1.0384230699240338, 1.0372365584925762, 1.035976913629033,
+        1.03485075409009, 1.0340231274556457, 1.0335880840794942, 1.0335553070154455,
+        1.0338536133141103, 1.034349439894853, 1.0348762633745983, 1.0352691882861225,
+        1.0353979010074599, 1.0351913259993986, 1.034649015065634, 1.03383737158819,
+        1.0328724134693816, 1.0318937541476647, 1.0310359576397639, 1.030403208086825,
+        1.030051763899789, 1.0299826324716956, 1.0301448672575317, 1.0304481353593256,
+        1.030781809505362, 1.0310368563896692, 1.0311263601740277, 1.0310008180072299,
+        1.0306554506264622, 1.0301285124374924, 1.029491528340408, 1.0288339926971435,
+        1.0282459331773102, 1.0278017509659703, 1.0275480645819588, 1.027497221025835,
+        1.0276269976592247, 1.0278860003228973, 1.0282034608878259, 1.0285015878083748,
+        1.0287083559891852, 1.028768671545654, 1.0286522248949315, 1.0283570029217457,
+        1.0279082406903124, 1.027353376011858, 1.0267541537085034, 1.026177306134039,
+        1.0256852061832198, 1.0253276278381507, 1.0251353787430908, 1.0251162044002489,
+        1.025253079623779, 1.025504824622991, 1.0258088923090158, 1.0260861262350618,
+        1.026247234942706, 1.0262006301175923, 1.0258611204086505, 1.0251587613127302,
+        1.024046987502589, 1.0225090688222598, 1.0205619993564068, 1.0182571794436803,
+        1.0156776570154484, 1.0129321770575281, 1.0101467365277563, 1.0074546558712627,
+        1.004986299290659, 1.0028595040588286, 1.0011715629634512, 0.9999933156440154,
+        0.9993656124513467, 0.9992981645845072, 0.9997706053992694, 1.000735457458321,
+        1.0021226154451222, 1.0038449041565272, 1.0058042474700633, 1.0078979894235376,
+        1.0100249460385378, 1.0120908369018637, 1.0140128414166534, 1.0157231301848764,
+        1.0171713167220833, 1.0183258410608143, 1.0191743271401925, 1.0197229565009285,
+        1.0199948896025304, 1.0200277658406083, 1.019870342424717, 1.0195783973160084,
+        1.019210114504908, 1.0188212713167846, 1.0184606320200207, 1.018165996439201,
+        1.0179613402380385, 1.0178554079650612, 1.0178419828423322, 1.017901869018709,
+        1.0180064014629715, 1.0181220739042773, 1.0182156829329383, 1.0182592675619342,
+        1.0182341143092282, 1.0181332170129755, 1.0179618191509654, 1.0177359846418434,
+        1.0174794783203658, 1.0172195207964265, 1.0169821585648828, 1.0167880300328547,
+        1.0166492128397286, 1.0165676332717297, 1.0165352449872536, 1.0165358870799128,
+        1.016548455590422, 1.0165508092368383, 1.0165237140181709, 1.0164541351461274,
+        1.0163373122790291, 1.016177285043669, 1.0159858268122643, 1.015780037409208,
+        1.015579081249082, 1.015400692233266, 1.015258080618212, 1.015157775918169,
+        1.0150987501889508, 1.015072926259031, 1.0150669281035882, 1.0150647161915551,
+        1.0150506037899023, 1.0150120953476895, 1.014942035212988, 1.014839695927228,
+        1.0147106432819368, 1.014565448822987, 1.0144175327337395, 1.0142805699425932,
+        1.0141659539195462, 1.014080779659893, 1.0140266921594605, 1.0139997752504026,
+        1.0139914611205616, 1.0139902575426618, 1.0139839486669724, 1.013961849673841,
+        1.0139166982311376, 1.0138458454448873, 1.013751550106289, 1.0136403544250239,
+        1.0135216922684482, 1.0134060184450928, 1.0133028246696854, 1.0132189130340556,
+        1.0131572343511788, 1.0131164823470873, 1.0130914891302027, 1.0130743196879164,
+        1.0130558392244509, 1.0130274480211565, 1.0129826573198841, 1.012918219404542,
+        1.01283461724014, 1.0127358452326898, 1.0126285477704475, 1.012520699779244,
+        1.0124200916076675, 1.0123329061319126, 1.0122626469959308, 1.012209601708901,
+        1.012170917999843, 1.012141256661081, 1.0121138799330445, 1.0120819594060193,
+        1.0120398540921114, 1.0119841228770872, 1.0119140925360088, 1.0118318912564879,
+        1.011741960485656, 1.0116501547928147, 1.0115626120159187, 1.0114846114884364,
+        1.0114196317067674, 1.0113687736860844, 1.0113306426358246, 1.0113016930937715,
+        1.0112769575514517, 1.0112510110138277, 1.011218985468698, 1.0111774451092395,
+        1.0111249650918863, 1.0110623168458959, 1.0109922394219353, 1.010918854115428,
+        1.0108468438394866, 1.0107805578364526, 1.0107232100511148, 1.010676315836337,
+        1.0106394624144834, 1.0106104437684842, 1.0105857227044215, 1.010561124045106,
+        1.0105326235705734, 1.0104970839912193, 1.0104528036866607, 1.0103997828048163,
+        1.010339666715382, 1.0102753878931003, 1.0102105824066105, 1.0101488961822722,
+        1.010093312451864, 1.0100456232206962, 1.0100061368476718, 1.0099736674431992,
+        1.0099457987756932, 1.0099193655153964, 1.0098910567963009, 1.0098580277091451,
+        1.0098184064551226, 1.0097716075366785, 1.0097183998172155, 1.00966072497062,
+        1.0096013078272925, 1.0095431368747827, 1.009488914214539, 1.0094405763473728,
+        1.009398970656165, 1.009363741137403, 1.0093334370523996, 1.009305817219502,
+        1.009278288037611, 1.0092483910378063, 1.0092142494560377, 1.0091748936939275,
+        1.0091304102240897, 1.0090818925578142, 1.0090312097664025, 1.0089806408396396,
+        1.0089324459799383, 1.0088884549529353, 1.0088497467358903, 1.0088164755806426,
+        1.0087878702089927, 1.0087624006386007, 1.0087380770059717, 1.0087128220368278,
+        1.0086848473556163, 1.0086529653518055, 1.00861678217666, 1.0085767407498734,
+        1.0085340108751615, 1.008490251382731, 1.008447291566549, 1.008406792184679,
+        1.0083699479292727, 1.0083372836864901, 1.0083085782500376, 1.0082829251072039,
+        1.008258914970866, 1.0082349033609486, 1.0082093124373852, 1.0081809117435405,
+        1.0081490280597247, 1.0081136488903837, 1.008075404365606, 1.0080354346792333,
+        1.007995170503903, 1.007956068517575, 1.0079193508023667, 1.0078857945450572,
+        1.0078556079337142, 1.0078284115887457, 1.007803325446353, 1.0077791422639464,
+        1.0077545541297972, 1.0077283900159297, 1.0076998217853592, 1.0076685030222745,
+        1.0076346181209603, 1.0075988357237493, 1.0075621777519421, 1.0075258298523115,
+        1.007490928583982, 1.0074583635976666, 1.007428629141503, 1.0074017494145622,
+        1.007377288522464, 1.0073544406210184, 1.0073321819568566, 1.0073094562979887,
+        1.0072853603444964, 1.00725929679481, 1.0072310694269153, 1.0072009054811355,
+        1.0071694037478887, 1.007137419702449, 1.007105909541705, 1.0070757613296801,
+        1.0070476427127397, 1.0070218908096613, 1.0069984617843413, 1.0069769468255432,
+        1.0069566497314963, 1.0069367110115486, 1.0069162560647895, 1.0068945417034134,
+        1.0068710764563247, 1.0068456953437404, 1.0068185781095365, 1.0067902097142931,
+        1.0067612915162079, 1.0067326193979755, 1.0067049499123042, 1.006678876663046,
+        1.0066547366042098, 1.0066325603253587, 1.0066120727696501, 1.0065927425348264,
+        1.0065738703043055, 1.0065547012185658, 1.0065345429329917, 1.0065128710483007,
+        1.0064894063758043, 1.00646415350469, 1.0064373964494617, 1.0064096537087763,
+        1.0063816008375288, 1.006353972803781, 1.0063274604719061, 1.0063026153980104,
+        1.0062797749742158, 1.0062590163288114, 1.0062401429641186, 1.0062227036185538,
+        1.0062060389221372, 1.0061893485528786, 1.0061717700487827, 1.006152460206496,
+        1.0061306709188589, 1.006105813041987, 1.0060775040419254, 1.0060455973656044,
+        1.0060101933995271, 1.0059716333269868, 1.0059304781058593, 1.0058874752156304,
+        1.0058435158971157, 1.005799585500768, 1.005756709426286, 1.0057158970866533,
+        1.0056780864025576, 1.0056440914950868, 1.0056145564063452, 1.0055899177213776,
+        1.0055703787782768, 1.0055558976600973, 1.0055461903447995, 1.0055407492968091,
+        1.005538876525866, 1.0055397288683614, 1.005542372129911, 1.0055458399186274,
+        1.0055491926057725, 1.005551571925094, 1.00555224724628, 1.0055506504525,
+        1.0055463974919026, 1.005539295909716, 1.0055293388564008, 1.005516687086555,
+        1.0055016412329378, 1.0054846071253956, 1.0054660571338065, 1.0054464904875366,
+        1.005426395316787, 1.0054062148297025, 1.0053863196273332, 1.0053669876912497,
+        1.0053483930651803, 1.0053306036886718, 1.0053135882273614, 1.0052972310906405,
+        1.0052813541654029, 1.0052657431791014, 1.0052501761110881, 1.0052344507804465,
+        1.0052184087252962, 1.0052019527999219, 1.0051850565576868, 1.005167764412827,
+        1.0051501826853768, 1.0051324627908573, 1.005114778877755, 1.0050973029825325,
+        1.0050801811349972, 1.0050635137322361, 1.0050473429037028, 1.0050316485856747,
+        1.0050163537503134, 1.005001337881022, 1.0049864565587623, 1.004971564115905,
+        1.0049565358714119, 1.0049412865577794, 1.0049257821745228, 1.0049100435586689,
+        1.0048941412813093, 1.004878182849787, 1.0048622943967946, 1.0048465998777072,
+        1.0048312011427278, 1.0048161620492104, 1.0048014990706353, 1.0047871797635224,
+        1.004773129156187, 1.0047592428385155, 1.0047454044702664, 1.004731504757238,
+        1.004717458772796, 1.004703218845889, 1.0046887810289904, 1.004674184260174,
+        1.004659502554301, 1.004644831694143, 1.0046302727570662, 1.0046159152701655,
+        1.0046018227707554, 1.0045880230750903, 1.0045745047170296, 1.0045612199594889,
+        1.0045480936868536, 1.0045350365383103, 1.004521959993261, 1.0045087908690706,
+        1.0044954828674297, 1.0044820233664182, 1.0044684344949226, 1.0044547684968712,
+        1.00444109832914, 1.0044275051858091, 1.004414065085666, 1.0044008367374404,
+        1.004387852609281, 1.0043751145370219, 1.0043625944188697, 1.0043502396991046,
+        1.004337982580869, 1.004325751348866, 1.0043134819090167, 1.0043011276955667,
+        1.0042886664350672, 1.004276102822112, 1.0042634668516952, 1.0042508082499977,
+        1.0042381880374742, 1.004225668656488, 1.004213304247832, 1.00420113255688,
+        1.004189169622619, 1.0041774079170718, 1.0041658180450006, 1.004154353575686,
+        1.0041429581416856, 1.0041315736628669, 1.0041201484671625, 1.004108644179046,
+        1.004097040501251, 1.0040853373718135, 1.0040735543741137, 1.0040617276500912,
+        1.0040499048647562, 1.0040381389605704, 1.0040264815103417, 1.0040149764358353,
+        1.0040036547295152, 1.0039925306328863, 1.003981599522185, 1.0039708375616685,
+        1.0039602030288353, 1.0039496391042604, 1.0039390778510948, 1.0039284450762833,
+        1.0039176657538627, 1.0039066696874301, 1.0038953970848898, 1.003883803711519,
+        1.0038718652815743, 1.0038595807532178, 1.0038469742187806, 1.0038340951419897,
+        1.0038210167914094, 1.0038078328526439, 1.0037946523603594, 1.0037815932574232,
+        1.0037687750399775, 1.0037563110616328, 1.003744301127857, 1.003732825001497,
+        1.0037219373604305, 1.0037116646073982, 1.0037020037482551, 1.003692923352732,
+        1.0036843664179746, 1.0036762547942177, 1.0036684947219412, 1.0036609829801777,
+        1.0036536131553384, 1.0036462815989755, 1.0036388927348792, 1.0036313634811078,
+        1.0036236266523408, 1.0036156332888924, 1.0036073539131103, 1.003598778743327,
+        1.0035899169070186, 1.003580794700612, 1.0035714529560023, 1.003561943603469,
+        1.003552325571646, 1.00354266023429, 1.003533006690603, 1.0035234172343765,
+        1.0035139334091616, 1.0035045830447382, 1.0034953786138836, 1.003486317135148,
+        1.0034773816860056, 1.0034685443999207, 1.003459770627215, 1.0034510237734757,
+        1.0034422702192305, 1.003433483692853, 1.0034246485255445, 1.0034157613597894,
+        1.0034068310931659, 1.0033978770885454, 1.0033889259317939, 1.003380007230948,
+        1.0033711490913613, 1.0033623739468422, 1.0033536953678488, 1.003345116312944,
+        1.0033366290623562, 1.0033282168083546, 1.0033198566185735, 1.003311523276494,
+        1.003303193372387, 1.003294848988718, 1.0032864804005317, 1.0032780873805303,
+        1.0032696789318485, 1.0032612715300997, 1.0032528861973946, 1.003244544915176,
+        1.0032362669802333, 1.0032280659043584, 1.0032199473549193, 1.0032119084500923,
+        1.0032039384903206, 1.0031960209668573, 1.0031881364788902, 1.0031802660477596,
+        1.003172394262682, 1.003164511734432, 1.0031566164628656, 1.0031487139169601,
+        1.00314081584856, 1.003132938074603, 1.00312509763147, 1.0031173098013593,
+        1.003109585519569, 1.0031019295937322, 1.003094340016635, 1.0030868084604767,
+        1.0030793218364056, 1.0030718646240868, 1.0030644215520217, 1.0030569801601685,
+        1.0030495328089548, 1.0030420778052245, 1.0030346194760202, 1.003027167206563,
+        1.0030197336364528, 1.0030123323480629, 1.003004975459546, 1.0029976715404314,
+        1.0029904242007945, 1.0029832315793368, 1.0029760867941788, 1.0029689792520313,
+        1.0029618965655724, 1.0029548267303066, 1.002947760176555, 1.002940691344143,
+        1.0029336195197414, 1.002926548811543, 1.0029194872892546, 1.0029124454614429,
+        1.002905434372803, 1.002898463662298, 1.002891539920674, 1.002884665624654,
+        1.0028778388171653, 1.002871053568607, 1.0028643011171041, 1.0028575714703274,
+        1.0028508551768214, 1.0028441449532868, 1.0028374368878457, 1.0028307310209508,
+        1.0028240312195138, 1.002817344385552, 1.0028106791556488, 1.002804044332209,
+        1.0027974473277772, 1.0027908928937719, 1.0027843823479103, 1.002777913421659,
+        1.0027714807373593, 1.002765076814397, 1.0027586934140038, 1.002752322978255,
+        1.0027459599090838, 1.0027396014679721, 1.0027332481494173, 1.002726903477339,
+        1.0027205732760052, 1.0027142645577172, 1.0027079842326612, 1.0027017378719973,
+        1.0026955287396084, 1.0026893572550606, 1.002683220970387, 1.0026771150509952,
+        1.0026710331629214, 1.0026649686000697, 1.0026589154474066, 1.0026528695752293,
+        1.0026468292947657, 1.0026407955690724, 1.0026347717540853, 1.0026287629276511,
+        1.002622774934935, 1.0026168133250446, 1.0026108823680129, 1.0026049843222928,
+        1.0025991190745138, 1.0025932842048324, 1.0025874754553425, 1.0025816875089426,
+        1.0025759149342568, 1.0025701531268656, 1.0025643990822626, 1.0025586518697072,
+        1.002552912731906, 1.0025471848028538, 1.0025414725031256, 1.0025357807266913,
+        1.002530113966748, 1.0025244755347469, 1.0025188670064304, 1.002513287985439,
+        1.0025077362172274, 1.0025022080238442, 1.0024966989751047, 1.0024912046725205,
+        1.0024857215060845, 1.0024802472525784, 1.002474781415123, 1.0024693252517776,
+        1.0024638814964606, 1.0024584538292207, 1.002453046194962, 1.0024476620935596,
+        1.0024423039659582, 1.002436972780701, 1.0024316678876823, 1.0024263871574386,
+        1.0024211273741435, 1.002415884807104, 1.0024106558564816, 1.002405437658936,
+        1.0024002285488762, 1.0023950282990284, 1.002389838104378, 1.0023846603192734,
+        1.0023794980000595, 1.0023743543379462, 1.0023692320836841, 1.0023641330642583,
+        1.0023590578730597, 1.0023540057827869, 1.0023489748902195, 1.0023439624616732,
+        1.002338965413878, 1.002333980843407, 1.0023290065116313, 1.0023240412025132,
+        1.0023190848946368, 1.002314138722707, 1.0023092047407576, 1.002304285533198,
+        1.0022993837449572, 1.0022945016138236, 1.0022896405856303, 1.0022848010763103,
+        1.0022799824178927, 1.0022751829927836, 1.0022704005281875, 1.0022656324957582,
+        1.002260876544994, 1.002256130895063, 1.0022513946188778, 1.0022466677736401,
+        1.0022419513594718, 1.0022372471177494, 1.0022325572078743, 1.002227883820746,
+        1.0022232287966149, 1.0022185933121668, 1.002213977688266, 1.0022093813477828,
+        1.0022048029266402, 1.002200240515171, 1.0021956919854151, 1.0021911553467582,
+        1.002186629069065, 1.0021821123197665, 1.00217760507728, 1.0021731081050482,
+        1.0021686227942903, 1.0021641509053894, 1.002159694253818, 1.0021552543945798,
+        1.0021508323576376, 1.0021464284770185, 1.0021420423392617, 1.0021376728566427,
+        1.0021333184495809, 1.0021289773054196, 1.0021246476690469, 1.002120328117065,
+        1.002116017771369, 1.0021117164192213, 1.0021074245230452, 1.0021031431215508,
+        1.0020988736410756, 1.0020946176498542, 1.0020903765958695, 1.0020861515701527,
+        1.002081943131906, 1.0020777512209533, 1.0020735751683758, 1.0020694138007533,
+        1.0020652656191689], [1.1835403379745314e-10, 3.555373187140863e-10,
+        5.941496557999488e-10, 8.351549640571563e-10, 1.0795340881946528e-09,
+        1.3282918774450536e-09, 1.5824644040581848e-09, 1.8431266124274074e-09,
+        2.1114003208268495e-09, 2.3884627436182535e-09, 2.675555608280313e-09,
+        2.9739949837870196e-09, 3.2851819024854505e-09, 3.6106139541388902e-09,
+        3.9518979409167125e-09, 4.3107637941219666e-09, 4.689079902911046e-09,
+        5.088870064627245e-09, 5.512332290898418e-09, 5.961859698554379e-09,
+        6.44006382098526e-09, 6.949800616973548e-09, 7.49419959700268e-09,
+        8.076696478808458e-09, 8.701069867553336e-09, 9.371482521090996e-09,
+        1.009252787152983e-08, 1.0869282516950241e-08, 1.1707365579724517e-08,
+        1.2613005883687069e-08, 1.359311815618895e-08, 1.4655389514343985e-08,
+        1.58083778406285e-08, 1.70616237874708e-08, 1.8425778531603454e-08,
+        1.9912749661831513e-08, 2.153586806883265e-08, 2.331007909390415e-08,
+        2.5252161858060937e-08, 2.738098123977489e-08, 2.9717777894699538e-08,
+        3.228650250474628e-08, 3.511420171352082e-08, 3.823146438444515e-08,
+        4.167293858319187e-08, 4.547793134413181e-08, 4.969110596979556e-08,
+        5.436329377868231e-08, 5.955244124939384e-08, 6.532471677583582e-08,
+        7.175580667404212e-08, 7.893243565599573e-08, 8.695415408635549e-08,
+        9.593544327540622e-08, 1.0600820044371926e-07, 1.1732467798360091e-07,
+        1.3006096795850082e-07, 1.444211417613296e-07, 1.606421798331929e-07,
+        1.7899985572295546e-07, 1.9981577623815885e-07, 2.234658258158518e-07,
+        2.5039032088635e-07, 2.811062524207453e-07, 3.162220858067405e-07,
+        3.564557019838802e-07, 4.026562082509758e-07, 4.5583053137458073e-07,
+        5.171759401361209e-07, 5.88119943126571e-07, 6.703693923030219e-07,
+        7.659711177603822e-07, 8.773870602106759e-07, 1.0075876977970794e-06,
+        1.160168652264552e-06, 1.3394967800346295e-06, 1.5508939328151033e-06,
+        1.8008690498160917e-06, 2.0974125491956944e-06, 2.4503714083486315e-06,
+        2.8719292607637398e-06, 3.3772238893109066e-06, 3.985145450235829e-06,
+        4.719373771140952e-06, 5.609733785647903e-06, 6.693976940438192e-06,
+        8.020136705018219e-06, 9.649663144393877e-06, 1.1661622360481309e-05,
+        1.4158362667271698e-05, 1.7273217349174793e-05, 2.118105971151687e-05,
+        2.611288939013673e-05, 3.2376171906734795e-05, 4.038347473817091e-05,
+        5.06932016164986e-05, 6.40681810801985e-05, 8.156094721130574e-05,
+        0.00010463948727792045, 0.00013537528160356013, 0.00017672884111544432,
+        0.00023299066077073037, 0.0003104749667545564, 0.0004186339898508787,
+        0.0005718896064753661, 0.0007927239927382913, 0.0011170526544350273,
+        0.0016038924897671196, 0.0023534728657599786, 0.003542825861318381,
+        0.005499902567771971, 0.008869461979449008, 0.015020395455293857,
+        0.027178266565380825, 0.05418816420118147, 0.12712520819255782,
+        0.4286291537569104, 8.49776063936103, 1.4610433126933227, 2.618100503530531,
+        2.2410885612430644, 0.7166715628649272, 0.2562183598399911, 0.5344596612803187,
+        2.1920788009435213, 1.9764261082635415, 2.464647802972177, 4.7068596840575365,
+        8.194759701810701, 7.074723869242503, 4.368327670664487, 2.436557583385926,
+        1.7523480791775332, 1.5458216750164206, 1.6267112104464012, 1.99727260529831,
+        2.313478665656405, 1.747197682108454, 1.2208317559572963, 0.9816135924535945,
+        0.9139414401405913, 0.9738133174148624, 1.1745357784092438, 1.5255874571714843,
+        1.7404315590129382, 1.5077812381457396, 1.2387345186052612, 1.1011624210285234,
+        1.0760170850616182, 1.1508676009759577, 1.3402281322076186, 1.6648045280503245,
+        2.0039731097451923, 1.958787545507012, 1.6199247188096828, 1.346357274083572,
+        1.2001084969799058, 1.197706310444427, 1.261675417002817, 1.352080504156667,
+        1.4390977630907837, 1.4775411464205512, 1.4416115649609835, 1.353405817589055,
+        1.2553361618660266, 1.175289208612121, 1.1232793072690999, 1.1002459779422185,
+        1.103863247398859, 1.130116124709725, 1.1722113297821242, 1.2182236590136666,
+        1.2502272958105844, 1.249638135225881, 1.2087404291397414, 1.136488259007296,
+        1.0504591837452348, 0.9654928872661669, 0.8895562435457426, 0.8252697924979392,
+        0.7724819747356806, 0.7300123018219299, 0.6965216976639728, 0.6708646389108317,
+        0.6521921271691313, 0.6399507678938758, 0.6338467723114429, 0.633804586912462,
+        0.6399304434329366, 0.6524807027775047, 0.6718279368381469, 0.6984112289241113,
+        0.7326494394008112, 0.7747873111873346, 0.8246392566341783, 0.8812103835461106,
+        0.942241123126477, 1.0038739426935772, 1.0608340389902875, 1.1075085671108718,
+        1.1397736973364783, 1.1565719146934528, 1.160114816226524, 1.1546455576284647,
+        1.1447590832135837, 1.1342269783511871, 1.125559284019806, 1.1200553377201807,
+        1.1180437314646525, 1.1191419815740833, 1.1224863076226552, 1.126940953484582,
+        1.1313065589718483, 1.1345286489912711, 1.135879869311709, 1.135073377163573,
+        1.1322742924718, 1.1280086849776731, 1.123004956439269, 1.1180191426190274,
+        1.1136880255026913, 1.110433023392973, 1.1084183497157574, 1.10755644565828,
+        1.1075512058702737, 1.1079700122632292, 1.1083346530372906, 1.1082175247371098,
+        1.1073253076023655, 1.105551739368711, 1.1029871778785976, 1.099884309986258,
+        1.096591654596612, 1.0934738757064193, 1.0908380494475323, 1.0888797312285938,
+        1.0876556840257399, 1.0870843098769554, 1.0869709224751776, 1.0870522452320222,
+        1.0870519972506378, 1.0867371278922027, 1.0859632516921613, 1.0846994883605634,
+        1.0830276503186136, 1.0811172898546626, 1.079184097270979, 1.077442379712226,
+        1.07606218128047, 1.0751389199228436, 1.0746797591266268, 1.0746074947084188,
+        1.074779950838324, 1.0750206571442147, 1.0751548205732784, 1.0750435456150698,
+        1.0746094102900692, 1.0738482653383048, 1.072825306768182, 1.0716572011491128,
+        1.0704851216855313, 1.0694450782971558, 1.0686416978199975, 1.0681300843460406,
+        1.0679082803927258, 1.0679207404753832, 1.0680714100700366, 1.0682435569233808,
+        1.0683224838373142, 1.0682168047098948, 1.0678742781996668, 1.0672893450090475,
+        1.0665013245829316, 1.0655842438012995, 1.0646309369612832, 1.0637349520500345,
+        1.062973801920381, 1.0623963837259898, 1.062016282518805, 1.0618114898953213,
+        1.061730013063927, 1.0617000203438436, 1.0616426040396034, 1.0614849707714284,
+        1.0611719268112876, 1.0606739226952449, 1.0599906050519867, 1.0591496618655427,
+        1.0582015547421166, 1.0572113307095314, 1.0562489899517646, 1.055379849658957,
+        1.0546560706990353, 1.0541101290435866, 1.0537506364999705, 1.0535606226206142,
+        1.0534982067259682, 1.053499496607819, 1.0534835032191017, 1.0533588068908208,
+        1.053031610999291, 1.0524146608037055, 1.0514363102741118, 1.050048842803927,
+        1.0482350658917166, 1.0460122710026274, 1.0434329072648345, 1.0405817342716168,
+        1.037569712840893, 1.034525350753974, 1.0315845402545707, 1.0288800463333878,
+        1.026531729816276, 1.0246383669605992, 1.023271631639137, 1.02247250714163,
+        1.0222501391612182, 1.0225829487037872, 1.0234216908062999, 1.0246940590441314,
+        1.0263103841928414, 1.0281699519867957, 1.0301674706735826, 1.0321992577684242,
+        1.0341687876894552, 1.0359913402454168, 1.037597598014142, 1.038936137580193,
+        1.0399748274496838, 1.0407011764727214, 1.0411216772367613, 1.0412601774522472,
+        1.0411553120981196, 1.0408570587482144, 1.040422544784037, 1.039911329996282,
+        1.0393804912432878, 1.0388799217140663, 1.0384483021768751, 1.0381101888137705,
+        1.037874584730778, 1.0377352221054914, 1.0376725898643604, 1.0376575170380218,
+        1.037655893150207, 1.0376339115181712, 1.037563100906885, 1.0374244022396657,
+        1.0372106690706486, 1.0369272139756445, 1.036590347317012, 1.0362241961411918,
+        1.0358563793312157, 1.0355132939683551, 1.0352158077590665, 1.0349760547850513,
+        1.0347958231200542, 1.0346667441030037, 1.034572190511255, 1.0344905102144542,
+        1.034399005099568, 1.0342779473390749, 1.034113929426183, 1.0339019745982545,
+        1.033646069636752, 1.033358078220327, 1.0330552907311112, 1.0327571060693388,
+        1.0324814777987346, 1.0322417706332856, 1.0320445699889613, 1.0318887940725794,
+        1.0317662139846016, 1.031663235794495, 1.0315635807817074, 1.031451351070729,
+        1.0313139125276536, 1.0311440751079284, 1.0309411944883393, 1.0307110303471536,
+        1.030464433962149, 1.030215153302872, 1.029977195804606, 1.029762251227776,
+        1.029577643133513, 1.0294251601886049, 1.029300944215597, 1.0291964143112422,
+        1.0291000203606737, 1.0289994761900092, 1.0288840462152975, 1.0287464624634113,
+        1.0285841300523575, 1.0283994226043847, 1.0281990460667279, 1.0279926246880173,
+        1.0277908022233517, 1.0276032293973865, 1.0274368136516454, 1.027294542616062,
+        1.0271750745570043, 1.027073141409896, 1.0269806603056555, 1.0268883239661224,
+        1.0267873602931505, 1.0266711301945857, 1.0265362730778769, 1.0263832030003905,
+        1.0262158864307596, 1.026040969472382, 1.0258664414663583, 1.0257001008899889,
+        1.0255481152386325, 1.0254139370892381, 1.0252977622606816, 1.0251966092317681,
+        1.0251049823082492, 1.0250159755491433, 1.0249225985050683, 1.0248190711814238,
+        1.02470184948343, 1.0245702001965484, 1.0244262345048158, 1.0242744132399655,
+        1.0241206351211898, 1.0239710926634022, 1.0238311163106981, 1.0237042207357203,
+        1.0235915214872615, 1.0234916155865348, 1.0234009310866419, 1.0233144644871943,
+        1.023226756543339, 1.023132918160316, 1.023029514987919, 1.0229151517346817,
+        1.022790658232798, 1.0226588566862624, 1.0225239681842022, 1.0223907815040916,
+        1.0222637467255646, 1.022146163916445, 1.0220396131512774, 1.0219437222552517,
+        1.0218563031532506, 1.0217738190090175, 1.021692084931438, 1.0216070652989302,
+        1.0215156173412818, 1.0214160452892158, 1.0213083687394768, 1.0211942649138566,
+        1.0210767062347361, 1.0209593703095214, 1.020845938784248, 1.0207394178856695,
+        1.020641604753982, 1.020552792555208, 1.0204717604620128, 1.0203960410158195,
+        1.0203224070154733, 1.0202474818672251, 1.020168357802747, 1.0200831085518913,
+        1.019991105971606, 1.0198930890040232, 1.0197909805088883, 1.0196874939592486,
+        1.0195856090897786, 1.019488016811755, 1.0193966357669977, 1.0193122861944555,
+        1.0192345751336633, 1.0191620067044738, 1.019092289853187, 1.0190227810002304,
+        1.0189509765378266, 1.0188749637900503, 1.0187937495505819, 1.0187074102635671,
+        1.0186170423148406, 1.0185245281286024, 1.018432166859418, 1.018342241482069,
+        1.0182566031649403, 1.0181763478529695, 1.0181016406616048, 1.018031715006144,
+        1.0179650408687224, 1.017899626202147, 1.0178333925601177, 1.0177645545011873,
+        1.0176919338761377, 1.0176151541106382, 1.0175346831245444, 1.0174517220081882,
+        1.0173679646392677, 1.017285275960926, 1.0172053497391829, 1.0171294082505389,
+        1.017057996661689, 1.0169909060297904, 1.0169272345909937, 1.016865571844543,
+        1.0168042683934448, 1.016741740293985, 1.016676752099765, 1.0166086283895308,
+        1.0165373580247963, 1.016463575818033, 1.016388428821485, 1.0163133549289156,
+        1.0162398162886195, 1.0161690366941827, 1.0161017897555855, 1.0160382740205849,
+        1.0159780945175114, 1.0159203506097612, 1.0158638111544087, 1.0158071430575941,
+        1.0157491509187062, 1.0156889848331823, 1.0156262804469012, 1.0155612085333716,
+        1.015494428155144, 1.015426954759503, 1.0153599692474162, 1.0152946036243105,
+        1.015231741782667, 1.0151718700097487, 1.0151150019178996, 1.0150606886178157,
+        1.0150081096694938, 1.0149562263651357, 1.014903968609739, 1.0148504217326773,
+        1.014794980664753, 1.014737445656674, 1.014678044729145, 1.0146173812621344,
+        1.0145563181649955, 1.0144958206567125, 1.014436786078673, 1.0143798904191887,
+        1.0143254773386878, 1.01427350732267, 1.0142235737249141, 1.0141749808525926,
+        1.0141268688872571, 1.014078363034578, 1.01402872098516, 1.0139774539506383,
+        1.013924401836595, 1.0138697514719972, 1.0138139967016864, 1.0137578488393528,
+        1.0137021138614213, 1.01364755756616, 1.0135947810697647, 1.0135441264541658,
+        1.013495626725125, 1.013449006562216, 1.01340373198896, 1.013359099437543,
+        1.0133143489090874, 1.0132687828490143, 1.013221872300416, 1.0131733346962795,
+        1.0131231726926075, 1.0130716697986502, 1.0130193451573997, 1.012966875636997,
+        1.0129149975890341, 1.0128644027104041, 1.0128156422862595, 1.0127690519257835,
+        1.0127247052472594, 1.0126824005141697, 1.0126416796994513, 1.012601875513096,
+        1.0125621790494752, 1.012521719149707, 1.012479644351006, 1.012435199223685,
+        1.012387788647286, 1.0123370257513447, 1.0122827614553087, 1.0122250954732108,
+        1.0121643701049086, 1.0121011490523883, 1.0120361839285148, 1.0119703712003718,
+        1.011904702200755, 1.0118402087069382, 1.011777906535536, 1.0117187396752085,
+        1.0116635276414354, 1.0116129188998662, 1.0115673532483163, 1.0115270358594108,
+        1.0114919251892902, 1.0114617361352007, 1.0114359587256436, 1.0114138913613517,
+        1.0113946863477663, 1.0113774043370545, 1.0113610734842813, 1.0113447487279812,
+        1.0113275666810368, 1.011308792145577, 1.0112878531657679, 1.0112643626791433,
+        1.0112381260710654, 1.0112091351324666, 1.0111775499457756, 1.0111436709976274,
+        1.0111079043046554, 1.0110707225486373, 1.011032625190043, 1.0109941003202698,
+        1.0109555906790764, 1.0109174658493576, 1.0108800021711744, 1.010843371400628,
+        1.0108076385724507, 1.0107727689085562, 1.0107386429573375, 1.010705078483121,
+        1.010671857006535, 1.0106387524000473, 1.0106055586509377, 1.0105721138911434,
+        1.0105383181068206, 1.0105041425858707, 1.0104696300919982, 1.0104348858709802,
+        1.0104000607583505, 1.0103653287043393, 1.0103308618023854, 1.0102968062721056,
+        1.010263262731991, 1.0102302734980113, 1.010197818634438, 1.0101658212035391,
+        1.0101341608003414, 1.0101026932254844, 1.0100712732369075, 1.0100397768764178,
+        1.0100081199649171, 1.0099762699878707, 1.009944249654056, 1.0099121317359463,
+        1.0098800261775065, 1.0098480616626728, 1.0098163646817149, 1.0097850394792158,
+        1.0097541520647724, 1.009723720754738, 1.0096937146124658, 1.0096640598506557,
+        1.0096346529684153, 1.0096053783289805, 1.0095761272129316, 1.0095468152093898,
+        1.0095173951533205, 1.0094878636134668, 1.0094582600416098, 1.0094286589205252,
+        1.0093991563890867, 1.0093698536916722, 1.0093408402580992, 1.0093121792039104,
+        1.0092838975642429, 1.0092559827291674, 1.0092283854843738, 1.0092010289613615,
+        1.009173821848707, 1.009146673564446, 1.009119508837749, 1.0090922793252084,
+        1.0090649704506818, 1.0090376025011698, 1.0090102259865796, 1.0089829122117935,
+        1.0089557407615788, 1.0089287860449108, 1.008902105123018, 1.0088757287559262,
+        1.0088496570075551, 1.0088238599588557, 1.008798283229674, 1.0087728572442027,
+        1.0087475086133286, 1.0087221717323345, 1.008696798736359, 1.008671366296572,
+        1.0086458783081282, 1.0086203642140792, 1.008594873409391, 1.0085694667638003,
+        1.0085442067022665, 1.0085191474343544, 1.008494326819713, 1.0084697610277953,
+        1.0084454426620484, 1.008421342458748, 1.0083974141303258, 1.0083736014843059,
+        1.0083498466713174, 1.008326098328554, 1.0083023184851003, 1.0082784873513029,
+        1.0082546054724035, 1.008230693123974, 1.0082067872007139, 1.008182936149314,
+        1.0081591936872456, 1.008135612119605, 1.0081122360244688, 1.0080890969467702,
+        1.008066209555991, 1.008043569519321, 1.0080211531506653, 1.0079989187393215,
+        1.0079768093500194, 1.0079547568181593, 1.0079326866309364, 1.007910523373364,
+        1.0078881964148811, 1.0078656455083181, 1.0078428259658705, 1.0078197130709519,
+        1.007796305389347, 1.0077726266705107, 1.0077487260896811, 1.007724676679504,
+        1.0077005719337149, 1.0076765207245046, 1.0076526408421067, 1.0076290516171853,
+        1.0076058662014031, 1.0075831841395917, 1.0075610848567218, 1.0075396226026228,
+        1.007518823255808, 1.007498683203312, 1.0074791703104682, 1.0074602268000417,
+        1.0074417736986363, 1.007423716397914, 1.0074059508283382, 1.0073883697529529,
+        1.007370868748014, 1.007353351529657, 1.0073357343914064, 1.0073179496175186,
+        1.0072999478184024, 1.0072816991889666, 1.0072631937202827, 1.0072444404064986,
+        1.0072254654947295, 1.0072063098383166, 1.0071870254435944, 1.00716767135141,
+        1.0071483090640039, 1.0071289978051188, 1.0071097899699084, 1.0070907271633247,
+        1.0070718372236394, 1.0070531325712941, 1.0070346101095213, 1.007016252741264,
+        1.0069980323754142, 1.006979914101059, 1.0069618610417144, 1.0069438392911736,
+        1.0069258223007378, 1.0069077941447564, 1.0068897512344321, 1.0068717022611413,
+        1.0068536664004908, 1.0068356700592842, 1.006817742661148, 1.0067999121074813,
+        1.006782200596101, 1.0067646214206605, 1.0067471772185626, 1.0067298599068821,
+        1.0067126522807772, 1.0066955309894483, 1.006678470392058, 1.0066614466647401,
+        1.0066444415004578, 1.006627444820296, 1.0066104560845708, 1.0065934840262274,
+        1.0065765448884358, 1.006559659490223, 1.0065428496286886, 1.0065261344241778,
+        1.0065095272108207, 1.0064930334712938, 1.006476650130504, 1.0064603662899299,
+        1.0064441652429028, 1.0064280274010458, 1.0064119336187098, 1.0063958683479763,
+        1.0063798220990423, 1.006363792810654, 1.0063477859287138, 1.0063318132144146,
+        1.0063158905174978, 1.0063000349196625, 1.006284261749632, 1.0062685819804325,
+        1.0062530004412507, 1.0062375151263856, 1.0062221176893833, 1.0062067950057938,
+        1.0061915315083405, 1.00617631187392, 1.0061611235925234, 1.0061459589808526,
+        1.0061308163102147, 1.00611569987913, 1.0061006190471409, 1.0060855864244953,
+        1.0060706155527568, 1.0060557184900327, 1.0060409037200813, 1.0060261747373167,
+        1.0060115295336933, 1.0059969610514123, 1.0059824584967398, 1.005968009263963,
+        1.0059536011196744, 1.0059392242618659, 1.0059248729003285, 1.0059105460975672,
+        1.005896247744551, 1.0058819856993886, 1.0058677702614955, 1.005853612264671,
+        1.0058395211310258, 1.0058255032252335, 1.005811560787196, 1.0057976916129108,
+        1.0057838895186046, 1.0057701454857182, 1.0057564492686568, 1.00574279117237,
+        1.0057291636852754, 1.0057155626867647, 1.0057019880303868, 1.005688443418072,
+        1.0056749356068395, 1.0056614731047646, 1.0056480645978816, 1.0056347173901088,
+        1.0056214361283187, 1.0056082220274083, 1.0055950727170442, 1.0055819827197305,
+        1.0055689444592655, 1.0055559496086321, 1.00554299053221, 1.0055300615674163,
+        1.0055171599258674, 1.0055042860667693, 1.005491443491619, 1.0054786380119498,
+        1.0054658766328202, 1.005453166258021, 1.0054405124487389, 1.0054279184516874,
+        1.0054153846597036, 1.0054029085876348, 1.0053904853537785, 1.0053781085688214,
+        1.0053657714654576, 1.0053534680641028, 1.0053411941692836, 1.0053289480265128,
+        1.0053167305333526, 1.0053045449794717, 1.0052923963737117, 1.0052802904868878,
+        1.0052682327856715, 1.0052562274471601, 1.0052442766247554, 1.0052323800873868,
+        1.0052205352855335, 1.0052087378214285, 1.0051969822305762, 1.0051852629297768,
+        1.0051735751614643, 1.0051619157693314, 1.00515028367408, 1.0051386799740338,
+        1.005127107662924, 1.0051155710243143, 1.005104074817012, 1.0050926233993545,
+        1.0050812199469268, 1.00506986589785, 1.0050585607164284, 1.0050473020079418,
+        1.0050360859550542, 1.0050249079911375, 1.0050137635865433, 1.005002649007574,
+        1.0049915619164802, 1.0049805017119642, 1.004969469557881, 1.0049584681034203,
+        1.0049475009519624, 1.0049365719779633, 1.0049256846151262, 1.0049148412407494,
+        1.0049040427609772, 1.0048932884638844, 1.0048825761587719, 1.0048719025697392,
+        1.0048612639081538, 1.0048506565194817, 1.0048400774899104, 1.0048295251081976,
+        1.004818999106283, 1.0048085006426573, 1.0047980320382988, 1.0047875963177095,
+        1.004777196639945, 1.0047668357214847, 1.0047565153513827, 1.0047462360803627,
+        1.0047359971332173, 1.0047257965536727, 1.0047156315504477, 1.0047054989790911,
+        1.0046953958725138, 1.004685319926972, 1.0046752698606267, 1.0046652455859326,
+        1.0046552481710518, 1.004645279602553, 1.0046353423956433, 1.0046254391233655,
+        1.004615571948033, 1.0046057422357586, 1.0045959503182225, 1.00458619543884,
+        1.0045764758876614, 1.004566789296795, 1.004557133041299, 1.004547504673888,
+        1.0045379023179717, 1.004528324952672, 1.0045187725439615, 1.004509246003476,
+        1.0044997469866608, 1.0044902775690694, 1.0044808398592078, 1.004471435615762,
+        1.0044620659341958, 1.0044527310542606, 1.0044434303179004, 1.0044341622806876,
+        1.004424924953834, 1.0044157161322833, 1.0044065337511807, 1.0043973762097185,
+        1.0043882426087134, 1.0043791328642127, 1.0043700476813824, 1.0043609883968032,
+        1.0043519567191568, 1.0043429544143239, 1.0043339829889881, 1.0043250434253255,
+        1.004316136009575, 1.0043072602802037, 1.0042984151011123, 1.0042895988442548,
+        1.0042808096487892, 1.0042720457121312, 1.004263305564522, 1.0042545882828688,
+        1.0042458936108944, 1.004237221968773, 1.0042285743538837, 1.0042199521516033,
+        1.0042113568889326, 1.004202789971686, 1.004194252447216, 1.0041857448291036,
+        1.0041772670093936, 1.0041688182692312, 1.0041603973833193, 1.0041520027993123],
+    [2.252139948862946e-11, 6.766412724153118e-11, 1.1310742833044891e-10,
+        1.5905428847550227e-10, 2.0571162559391553e-10, 2.5329193769943615e-10,
+        3.0201499398716164e-10, 3.521096299210442e-10, 4.03815637133482e-10,
+        4.573857864585597e-10, 5.13088005250314e-10, 5.712077390695795e-10,
+        6.320505221163008e-10, 6.95944800697459e-10, 7.632450379242024e-10,
+        8.343351512831544e-10, 9.096323267788699e-10, 9.895912671995519e-10,
+        1.0747089395858893e-09, 1.165529888964201e-09, 1.2626522103276774e-09,
+        1.3667342632752908e-09, 1.4785022474219404e-09, 1.5987587609255233e-09,
+        1.7283924882552151e-09, 1.8683891846737992e-09, 2.0198441572652824e-09,
+        2.1839764623193165e-09, 2.3621450901786226e-09, 2.5558674360391705e-09,
+        2.766840427429501e-09, 2.996964712562516e-09, 3.248372413996298e-09,
+        3.5234590126613677e-09, 3.824920047508788e-09, 4.155793418693543e-09,
+        4.5195082430596045e-09, 4.919941362154273e-09, 5.361482830095631e-09,
+        5.8491119271602025e-09, 6.388485570137508e-09, 6.986041312814746e-09,
+        7.64911759352904e-09, 8.386094370488887e-09, 9.206557955523311e-09,
+        1.012149456444471e-08, 1.1143518131808836e-08, 1.2287138941009384e-08,
+        1.3569081194277287e-08, 1.5008659193232024e-08, 1.6628224067553462e-08,
+        1.8453695547999992e-08, 2.05151965342802e-08, 2.284781233574936e-08,
+        2.5492501485947373e-08, 2.849719140297058e-08, 3.191810029164674e-08,
+        3.5821336663554356e-08, 4.028484094251961e-08, 4.540074991303908e-08,
+        5.127828592498587e-08, 5.8047299961519644e-08, 6.586263283911525e-08,
+        7.490950470105435e-08, 8.541020315388952e-08, 9.76324199303334e-08,
+        1.1189969157607926e-07, 1.286045415866749e-07, 1.482251134815356e-07,
+        1.7134634645545744e-07, 1.9868710796015195e-07, 2.3113520471145303e-07,
+        2.6979291307054875e-07, 3.160367049825527e-07, 3.715963649010188e-07,
+        4.3866096278719116e-07, 5.200226244715665e-07, 6.192744991619529e-07,
+        7.410881724301216e-07, 8.916106325804197e-07, 1.0790469120936694e-06,
+        1.3145423781281602e-06, 1.613571934370811e-06, 1.9982384439748117e-06,
+        2.501326794041925e-06, 3.1740848036498736e-06, 4.102971536094566e-06,
+        5.452081569558435e-06, 7.601188363529591e-06, 1.1855862207566827e-05,
+        4.239699647194868e-05, 1.577373534734989e-05, 1.374075941247713e-05,
+        1.4148468060535896e-05, 1.5622325379296654e-05, 1.797520908651408e-05,
+        2.1291199410482918e-05, 2.580238057284003e-05, 3.1886029078065354e-05,
+        4.0107004313862006e-05, 5.1299338065978394e-05, 6.670145761081087e-05,
+        8.817683864502248e-05, 0.00011857862734907132, 0.00016236549149206193,
+        0.00022667017234724422, 0.0003232124021692752, 0.0004718493185582651,
+        0.0007074479862134149, 0.0010938653248459753, 0.001754135318750205,
+        0.0029406319044267223, 0.005214167207467661, 0.009961899801114452,
+        0.021185694646805916, 0.05368502192584466, 0.19871144490761977,
+        4.42006145271334, 0.8794735023946814, 1.9125758699636366, 2.1560855246003245,
+        1.0786564785862636, 1.1079496493150105, 1.9079865267780665, 2.421317606137854,
+        1.1495422579580867, 0.8403242357670178, 0.8284114968235068, 1.0649128543149557,
+        1.589506720171078, 1.2033459475319883, 0.7680321479985491, 0.6214310019266012,
+        0.6173642325177098, 0.7362523086264113, 1.0294985510018233, 1.358239098785856,
+        1.161325973372013, 0.9076594665803251, 0.8025885626190749, 0.8055680483104792,
+        0.9064757160407924, 1.132779513577784, 1.4999275596381585, 1.722248210599146,
+        1.4875568442987708, 1.2103669714980139, 1.0608254491383724, 1.019067434966981,
+        1.0695823884683933, 1.2209541997367668, 1.4856946983666948, 1.7510714662951972,
+        1.6750759952378216, 1.354649644410358, 1.0990112511512968, 0.9506875698157763,
+        0.9382152022123006, 0.9987930460411946, 1.0793936909693764, 1.157859160161574,
+        1.1977925477973554, 1.17732736441477, 1.1133228137207822, 1.039986683742733,
+        0.9804066503732443, 0.9432990509203871, 0.9299204687376772, 0.9387484928773284,
+        0.9667403862774823, 1.0083556621728738, 1.0534638159740497, 1.0864947453397262,
+        1.0910125805136865, 1.0598572289784247, 1.0004902350290006, 0.9281742187090081,
+        0.8560040944307569, 0.7911461817368539, 0.7360761397344748, 0.6908007856392521,
+        0.6543862788781114, 0.6257313263534777, 0.6038860590637702, 0.5881498351184223,
+        0.5780754107457935, 0.5734405261342755, 0.5742136321751701, 0.5805232514562416,
+        0.592631076970386, 0.6109025657572916, 0.6357628073092423, 0.6676182740588444,
+        0.7067168054517209, 0.7529133673634671, 0.8053223280311771, 0.8618979328391283,
+        0.91912418629726, 0.972173846188766, 1.0158921172542905, 1.0464719758862604,
+        1.0629091570354652, 1.0672012963321225, 1.0632226620247416, 1.0551854410293318,
+        1.0465578588430118, 1.0396564061988482, 1.0356874381558667, 1.0349637442372692,
+        1.0371404718052306, 1.041424641701097, 1.0467669266269928, 1.052053797327931,
+        1.0563011227229144, 1.0588247230235395, 1.0593479729391944, 1.0580150057888473,
+        1.0553082015890607, 1.051901756537496, 1.0484990765665543, 1.0456950562763034,
+        1.0438850580948589, 1.0432243001731023, 1.0436315172120665, 1.0448283439642163,
+        1.0464062402474859, 1.0479117906350384, 1.0489376224924478, 1.0492020668607591,
+        1.0485999963780757, 1.0472128933141682, 1.045277216904692, 1.0431218604905732,
+        1.0410926247343997, 1.0394819145385175, 1.0384769529359703, 1.0381332200070152,
+        1.0383742888296967, 1.0390154782800838, 1.0398060656031585, 1.040482334686202,
+        1.0408214743125328, 1.0406853176607924, 1.0400444524525105, 1.0389777496700412,
+        1.0376486657077035, 1.0362654424152196, 1.0350354839954032, 1.034124070926576,
+        1.0336250211098401, 1.0335474053876905, 1.0338191167613915, 1.0343054012124746,
+        1.0348383041314815, 1.035251277706266, 1.0354121588224723, 1.0352478627570765,
+        1.0347558253214897, 1.034000290223689, 1.033095135589103, 1.0321779088032212,
+        1.0313812189431226, 1.030807426182296, 1.030511102471311, 1.0304917068867963,
+        1.0306968852681249, 1.0310350479093116, 1.0313944809468676, 1.0316652608387822,
+        1.031759804740466, 1.0316281862289094, 1.0312654531650556, 1.0307099291112376,
+        1.0300334268575497, 1.0293259144369227, 1.0286780432464255, 1.0281649562995252,
+        1.0278341082199212, 1.0276987619586315, 1.0277376838854444, 1.0279005388682487,
+        1.028117683793236, 1.0283125088840595, 1.0284142105887746, 1.0283689314018523,
+        1.0281475821911006, 1.0277493216273061, 1.0272004776881711, 1.0265494785072604,
+        1.0258589419068378, 1.0251963507866668, 1.024624709451828, 1.0241943135379301,
+        1.0239363950749707, 1.0238590393922542, 1.0239454871066034, 1.0241547568934257,
+        1.024424434754292, 1.024675429086142, 1.0248184379505403, 1.0247617772497175,
+        1.0244200635584915, 1.02372305433573, 1.02262377435824, 1.0211049718097103,
+        1.0191830149316166, 1.0169085895131724, 1.0143639627309455, 1.0116570600891108,
+        1.0089130499560643, 1.00626444377377, 1.0038408413823277, 1.0017593798221962,
+        1.0001167287762345, 0.9989831884554304, 0.998399154367559, 0.9983739640088397,
+        0.9988869518419584, 0.9998904085432901, 1.0013140558324658, 1.0030705969786604,
+        1.0050618794180004, 1.0071852108356343, 1.0093394072867927, 1.0114302221129279,
+        1.0133749001887213, 1.0151057075523098, 1.0165723812523189, 1.0177435107004968,
+        1.0186068922913019, 1.0191688998085424, 1.0194529020528857, 1.0194967589613106,
+        1.0193494565967782, 1.0190670063975906, 1.0187078270854308, 1.0183279289409097,
+        1.0179763046402854, 1.0176909751936722, 1.0174961274468546, 1.0174007040522688,
+        1.017398669776664, 1.0174709898794712, 1.0175891359044587, 1.017719709610088,
+        1.0178295835777273, 1.0178908382533363, 1.0178847658670953, 1.0178043306594053,
+        1.017654713168001, 1.017451884293388, 1.0172194898818414, 1.0169846099905626,
+        1.0167731331871217, 1.0166055261760065, 1.0164936839643253, 1.0164393414315653,
+        1.016434253767703, 1.01646205615863, 1.0165014371833785, 1.0165300469501461,
+        1.0165284447180765, 1.0164833943608422, 1.016389943382073, 1.016251952109003,
+        1.0160810306700792, 1.0158941341590848, 1.0157103023670746, 1.0155471654594292,
+        1.015417851002524, 1.0153288266721685, 1.015279023258908, 1.0152603427324725,
+        1.0152594086378777, 1.015260201599141, 1.0152470757540486, 1.0152075970268506,
+        1.0151346912865291, 1.0150277314999907, 1.014892401038843, 1.0147394039148465,
+        1.0145823050568972, 1.0144349337002319, 1.0143088445654302, 1.0142112984783487,
+        1.0141441088008438, 1.0141035285173943, 1.014081158208845, 1.0140656718169636,
+        1.0140450159414334, 1.0140086628989926, 1.0139495004875554, 1.0138650212053415,
+        1.0137576148356244, 1.0136339427094356, 1.0135035447706604, 1.0133769680434515,
+        1.013263782145371, 1.01317085262565, 1.0131011794168667, 1.0130534912863187,
+        1.013022641642763, 1.0130007034064326, 1.0129785367528266, 1.0129475244412705,
+        1.0129011482776678, 1.0128361199354765, 1.0127528715253438, 1.0126553374784444,
+        1.0125500943733465, 1.0124450428826424, 1.012347894085697, 1.0122647479705644,
+        1.0121990229898756, 1.012150920365765, 1.0121175015413144, 1.0120933420268643,
+        1.012071620719367, 1.0120454286941107, 1.0120090481348833, 1.011958965609282,
+        1.011894440854945, 1.0118175409921577, 1.0117326529481534, 1.01164558375993,
+        1.011562431010264, 1.0114884411941272, 1.0114270673890071, 1.0113793924986363,
+        1.011344010725233, 1.0113173724299251, 1.011294512427827, 1.011270014166536,
+        1.011239023762824, 1.0111981247373263, 1.0111459162268441, 1.0110831976925434,
+        1.0110127396196242, 1.0109386974585612, 1.0108657903012437, 1.0107984049006193,
+        1.0107397933744924, 1.0106915092774138, 1.0106531774719958, 1.010622628476642,
+        1.0105963600315673, 1.0105702298414974, 1.010540244110792, 1.0105032931585356,
+        1.0104576998507055, 1.0104034854493469, 1.0103423128783477, 1.0102771284851553,
+        1.0102115784755263, 1.0101493151889807, 1.0100933246194155, 1.0100453980112143,
+        1.010005839615562, 1.0099734563065255, 1.0099458217422939, 1.00991975789612,
+        1.009891938934137, 1.009859503049365, 1.0098205599770382, 1.0097745045618784,
+        1.0097220852021245, 1.0096652226834606, 1.0096066209017152, 1.0095492477254258,
+        1.0094957852942428, 1.0094481511218794, 1.0094071748697993, 1.0093724843418632,
+        1.009342614369713, 1.0093153113088118, 1.0092879712334157, 1.0092581276245862,
+        1.0092238980413, 1.0091843096392301, 1.0091394480922098, 1.0090904085344565,
+        1.0090390640168314, 1.0089876997641376, 1.0089385843365357, 1.0088935578206424,
+        1.0088537112960962, 1.0088192126979196, 1.008789305795174, 1.008762476785928,
+        1.0087367528767999, 1.008710074499421, 1.008680671358455, 1.0086473740327382,
+        1.0086098067081193, 1.0085684299267796, 1.0085244304575114, 1.0084794832095028,
+        1.0084354324610605, 1.0083939526736234, 1.0083562507984745, 1.008322862396326,
+        1.008293575233029, 1.0082674899699693, 1.008243202622874, 1.0082190720933768,
+        1.008193521976775, 1.0081653213063972, 1.0081337944352706, 1.0080989245788854,
+        1.008061335798708, 1.0080221605465844, 1.0079828202071583, 1.0079447607691214,
+        1.0079091923822618, 1.0078768792262063, 1.0078480155824996, 1.0078222074462633,
+        1.0077985595939651, 1.0077758492756927, 1.0077527529129915, 1.00772808383964,
+        1.007700998494296, 1.0076711354308558, 1.00763866457923, 1.0076042408436756,
+        1.00756887327984, 1.0075337356709646, 1.0074999538267273, 1.0074684078562053,
+        1.0074395837493777, 1.007413498788831, 1.0073897115467867, 1.0073674120539131,
+        1.0073455738491246, 1.0073231394032727, 1.0072992055067276, 1.007273176296178,
+        1.007244858280148, 1.007214482650569, 1.007182653285062, 1.0071502317838177,
+        1.0071181813983376, 1.0070873980612605, 1.0070585579806608, 1.0070320074061758,
+        1.0070077120765561, 1.006985273074474, 1.0069640042874914, 1.0069430563882873,
+        1.006921564894944, 1.0068987965800154, 1.0068742696650375, 1.006847828492558,
+        1.0068196616638525, 1.0067902624466922, 1.0067603398815523, 1.0067306968453016,
+        1.0067020961455935, 1.006675136863083, 1.0066501606235465, 1.0066272018679294,
+        1.0066059885659648, 1.0065859915229902, 1.0065665128264794, 1.0065467982419054,
+        1.006526155303579, 1.0065040587860945, 1.0064802280180778, 1.00645466550477,
+        1.006427652636781, 1.00639970481527, 1.0063714940942634, 1.0063437516104725,
+        1.006317164140679, 1.0062922789714706, 1.0062694291167094, 1.0062486872886518,
+        1.0062298526036295, 1.0062124695079884, 1.0061958744928758, 1.0061792633047848,
+        1.0061617698061567, 1.0061425474167174, 1.006120844987512, 1.00609607069804,
+        1.0060678397263672, 1.006036003636852, 1.0060006613488994, 1.0059621529976188,
+        1.005921038908589, 1.0058780663356592, 1.005834126685583, 1.0057902058458068,
+        1.0057473300986288, 1.0057065100553946, 1.0056686851172825, 1.0056346711311852,
+        1.005605114070963, 1.0055804526180843, 1.005560892329178, 1.0055463935847218,
+        1.0055366746957175, 1.0055312304525343, 1.0055293651421624, 1.005530237789672,
+        1.0055329162631306, 1.0055364360719818, 1.005539859296025, 1.0055423291567178,
+        1.005543116266605, 1.0055416534871071, 1.005537557464763, 1.0055306361526675,
+        1.0055208828126072, 1.0055084580125244, 1.005493661903555, 1.0054768995462278,
+        1.0054586422646845, 1.0054393879811152, 1.005419623275451, 1.005399789583814,
+        1.0053802555374376, 1.005361296976449, 1.0053430856594898, 1.005325687126754,
+        1.0053090675606273, 1.0052931088343127, 1.005277630276712, 1.0052624150664133,
+        1.0052472386733533, 1.0052318964759952, 1.005216227668618, 1.0052001328847326,
+        1.0051835836042393, 1.0051666223371352, 1.0051493536877507, 1.0051319275609345,
+        1.0051145168130493, 1.0050972924174073, 1.0050803995769118, 1.0050639381021143,
+        1.0050479497773064, 1.0050324144329568, 1.0050172551698318, 1.0050023518266453,
+        1.004987560556072, 1.004972736465886, 1.0049577558392329, 1.0049425345447136,
+        1.0049270398713017, 1.0049112940788443, 1.0048953692734939, 1.004879374587948,
+        1.0048634378480907, 1.0048476847476664, 1.0048322188978822, 1.0048171059175863,
+        1.0048023640207817, 1.0047879624630043, 1.0047738279107221, 1.0047598575131125,
+        1.0047459363939393, 1.004731956613007, 1.0047178344748442, 1.0047035234058348,
+        1.0046890204133532, 1.00467436524113, 1.0046596325558896, 1.0046449186360658,
+        1.004630324898185, 1.0046159410537534, 1.0046018306734708, 1.0045880214615124,
+        1.0045745017014924, 1.0045612232767722, 1.0045481105731489, 1.0045350736236924,
+        1.0045220232067162, 1.0045088853569313, 1.0044956129258753, 1.0044821923884921,
+        1.0044686449323044, 1.004455021836455, 1.0044413950842566, 1.0044278449017447,
+        1.0044144463589588, 1.0044012572482572, 1.0043883091660426, 1.0043756031322955,
+        1.0043631102954491, 1.004350777425082, 1.0043385361324282, 1.0043263141994674,
+        1.004314047123591, 1.0043016880283022, 1.0042892144293911, 1.0042766309114481,
+        1.0042639674596303, 1.004251273888537, 1.0042386114021253, 1.0042260427169996,
+        1.0042136223335085, 1.0042013884355003, 1.0041893575720946, 1.0041775227891119,
+        1.0041658553201667, 1.0041543094093561, 1.0041428294005736, 1.004131357951886,
+        1.0041198441465369, 1.004108250371725, 1.0040965570907898, 1.004084764991023,
+        1.0040728943848796, 1.0040609821148805, 1.0040490765104175, 1.0040372311351244,
+        1.004025498133521, 1.004013921944197, 1.00400253401699, 1.003991348987664,
+        1.0039803625608528, 1.003969551161521, 1.0039588732592837, 1.0039482721582274,
+        1.0039376799772795, 1.0039270225131227, 1.0039162246659816, 1.003905216105304,
+        1.0038939368483897, 1.0038823424179297, 1.0038704082386052, 1.0038581329374385,
+        1.003845540239834, 1.0038326792128447, 1.0038196227048242, 1.003806463963929,
+        1.0037933115764353, 1.0037802830320848, 1.0037674973751987, 1.0037550675146634,
+        1.0037430928237998, 1.0037316526509814, 1.0037208012819476, 1.0037105647538167,
+        1.0037009397369845, 1.003691894498991, 1.0036833717705687, 1.0036752931732504,
+        1.0036675647578468, 1.003660083153485, 1.0036527418365766, 1.0036454370881545,
+        1.0036380732999934, 1.0036305673951595, 1.0036228522283905, 1.0036148789127162,
+        1.003606618073066, 1.0035980600570935, 1.0035892141449287, 1.003580106805347,
+        1.0035707790584834, 1.0035612830348353, 1.003551677871264, 1.0035420251538028,
+        1.0035323841940829, 1.00352280749469, 1.0035133368007159, 1.0035040001328173,
+        1.0034948101408279, 1.0034857640036676, 1.0034768449399505, 1.0034680252028578,
+        1.0034592702391865, 1.0034505435263246, 1.0034418114908974, 1.003433047881045,
+        1.003424237021185, 1.0034153755206434, 1.0034064722180271, 1.003397546392357,
+        1.0033886245220434, 1.003379736085668, 1.0033709090390175, 1.003362165648372,
+        1.0033535193010716, 1.0033449727595338, 1.0033365180975184, 1.003328138293318,
+        1.0033198101959622, 1.0033115083686128, 1.0033032091824012, 1.0032948945046805,
+        1.003286554402171, 1.0032781884486675, 1.0032698054602995, 1.0032614217398632,
+        1.0032530581529195, 1.003244736542468, 1.0032364760865464, 1.0032282901991973,
+        1.0032201844720698, 1.0032121559703921, 1.0032041939648695, 1.00319628194038,
+        1.0031884005129563, 1.0031805307435804, 1.003172657283209, 1.0031647708255036,
+        1.0031568694731579, 1.0031489588165228, 1.0031410507457366, 1.0031331612311658,
+        1.0031253074758208, 1.0031175049396714, 1.0031097647447915, 1.0031020918923828,
+        1.0030944845733516, 1.0030869346603264, 1.0030794292649687, 1.0030719530653707,
+        1.0030644909842727, 1.003057030749689, 1.0030495649020372, 1.003042091918354,
+        1.0030346162844948, 1.003027147531715, 1.0030196984316504, 1.0030122826836978,
+        1.0030049125072036, 1.0029975965564593, 1.002990338509476, 1.0029831365558801,
+        1.0029759838477268, 1.0029688698088919, 1.0029617820528631, 1.0029547085601864,
+        1.0029476397312216, 1.0029405699617386, 1.0029334984813145, 1.002926429329179,
+        1.0029193704954824, 1.0029123323999993, 1.0029053259908183, 1.0028983608039483,
+        1.0028914433223237, 1.0028845759114917, 1.002877756501323, 1.0028709790487278,
+        1.0028642346793089, 1.0028575132905178, 1.002850805324238, 1.002844103395229,
+        1.0028374034954517, 1.0028307055759202, 1.002824013421653, 1.0028173338610118,
+        1.002810675465725, 1.002804046982564, 1.0027974557779498, 1.002790906566844,
+        1.0027844006401916, 1.002777935712263, 1.0027715063975544, 1.0027651052166113,
+        1.0027587239403806, 1.002752355028666, 1.0027459929085079, 1.0027396348731716,
+        1.0027332814548466, 1.0027269362202398, 1.0027206050406448, 1.0027142949787542,
+        1.0027080129976205, 1.0027017647228615, 1.002695553473534, 1.0026893797242469,
+        1.0026832410811328, 1.0026771327619866, 1.0026710484828094, 1.0026649815843967,
+        1.002658926194948, 1.0026528782238355, 1.002646836016772, 1.0026408005663676,
+        1.002634775252917, 1.0026287651732648, 1.0026227761861164, 1.0026168138486615,
+        1.0026108824336333, 1.0026049841969553, 1.0025991190177257, 1.00259328446386,
+        1.002587476260858, 1.0025816890710784, 1.0025759174391171, 1.002570156733531,
+        1.0025644039203205, 1.002558658037332, 1.0025529202944967, 1.0025471937922419,
+        1.0025414829173473, 1.00253579253031, 1.0025301270917155, 1.002524489881773,
+        1.0025188824468296, 1.0025133043634176, 1.002507753352567, 1.002502225714932,
+        1.0024967170022625, 1.002491222801573, 1.0024857394921147, 1.0024802648438114,
+        1.0024747983568723, 1.0024693412904069, 1.0024638963832952, 1.0024584673243593,
+        1.002453058070929, 1.002447672138755, 1.0024423119878576, 1.0024369786087617,
+        1.0024316713759236, 1.0024263881866609, 1.002421125853765, 1.0024158806765897,
+        1.0024106490863547, 1.0024054282513613, 1.0024002165378185, 1.0023950137499784,
+        1.00238982111367, 1.0023846410129915, 1.0023794765325733, 1.0023743308900808,
+        1.0023692068605659, 1.002364106292862, 1.0023590297994984, 1.002353976669378,
+        1.002348945012371, 1.0023439321046326, 1.0023389348693825, 1.0023339504062896,
+        1.0023289764764098, 1.0023240118600245, 1.0023190565287419, 1.0023141116071153,
+        1.002309179136004, 1.0023042616838123, 1.0022993618768543, 1.0022944819319417,
+        1.0022896232718457, 1.0022847862876454, 1.0022799702850387, 1.0022751736189441,
+        1.002270393988259, 1.0022656288358411, 1.002260875782242, 1.0022561330178665,
+        1.0022513995873636, 1.0022466755204846, 1.0022419617910072, 1.002237260115344,
+        1.0022325726295658, 1.0022279015031008, 1.00222324855679, 1.0022186149501404,
+        1.0022140009892118, 1.0022094060845528, 1.002204828862325, 1.0022002674057093,
+        1.002195719582214, 1.0021911833992985, 1.0021866573274594, 1.0021821405372415,
+        1.002177633012556, 1.0021731355245915, 1.0021686494744138, 1.0021641766341838,
+        1.002159718832891, 1.0021552776405966, 1.0021508541036401, 1.0021464485735248,
+        1.0021420606551326, 1.002137689279715, 1.002133332887067, 1.002128989684077,
+        1.0021246579351226, 1.0021203362360236, 1.0021160237274125, 1.0021117202146197,
+        1.0021074261772849, 1.0021031426703244, 1.0020988711351257, 1.0020946131536963,
+        1.0020903701864061, 1.0020861433352102, 1.0020819331687048, 1.0020777396345422,
+        1.0020735620700418, 1.0020693993064378, 1.0020652498479026], [9.774530641004083e-12,
+        2.9368222061725554e-11, 4.9096163758086745e-11, 6.904904711181973e-11,
+        8.931936301279692e-11, 1.1000215627591023e-10, 1.3119580088849651e-10,
+        1.5300282316562298e-10, 1.7553076952682206e-10, 1.988931363159373e-10,
+        2.2321037170516432e-10, 2.4861096370725494e-10, 2.7523262593626195e-10,
+        3.0322360158301987e-10, 3.3274409919204177e-10, 3.6396788425428993e-10,
+        3.9708404736045895e-10, 4.32298975960264e-10, 4.698385603556244e-10,
+        5.099506657279046e-10, 5.52907913333004e-10, 5.990108110636921e-10,
+        6.485912889155913e-10, 7.020166973109067e-10, 7.596943373622055e-10,
+        8.220766023195781e-10, 8.896668246176248e-10, 9.63025932727325e-10,
+        1.0427800458982002e-09, 1.1296291482672275e-09, 1.2243570174267762e-09,
+        1.327842599030579e-09, 1.4410730656432692e-09, 1.5651588271872124e-09,
+        1.7013508165231033e-09, 1.8510604223308527e-09, 2.015882516649276e-09,
+        2.1976220957542043e-09, 2.3983251589326002e-09, 2.6203145520721617e-09,
+        2.8662316540103487e-09, 3.139084933551507e-09, 3.4423066193428386e-09,
+        3.779818948139592e-09, 4.156111764732682e-09, 4.57633357059206e-09,
+        5.046398587550498e-09, 5.573112856756676e-09, 6.1643231038530745e-09,
+        6.829092791904331e-09, 7.577910794411624e-09, 8.422939249621131e-09,
+        9.37830858271069e-09, 1.046046947626496e-08, 1.1688613726995114e-08,
+        1.3085178635578322e-08, 1.4676452993952528e-08, 1.649330686339008e-08,
+        1.857207269600224e-08, 2.095561188945479e-08, 2.369460921992209e-08,
+        2.684914812009298e-08, 3.0490633067086866e-08, 3.470414227956547e-08,
+        3.959131552225205e-08, 4.527390948599798e-08, 5.189818866382708e-08,
+        5.964036547692421e-08, 6.87133627235644e-08, 7.937524835159423e-08,
+        9.19397931448598e-08, 1.0678973363458234e-07, 1.2439349603771504e-07,
+        1.45326365991892e-07, 1.7029739382345902e-07, 2.001837312043508e-07,
+        2.360746412313877e-07, 2.793281590061237e-07, 3.316443781248052e-07,
+        3.9516070021722504e-07, 4.7257625114169857e-07, 5.673152471876581e-07,
+        6.837426778913546e-07, 8.274506846821495e-07, 1.0056410798377558e-06,
+        1.2276394769022027e-06, 1.5055908525090641e-06, 1.8554070545330779e-06,
+        2.2980668852677646e-06, 2.8614136200454616e-06, 3.5826603838528093e-06,
+        4.511912060994407e-06, 5.717161191637943e-06, 7.291443295122834e-06,
+        9.363190739214808e-06, 1.211138036582088e-05, 1.578795680521327e-05,
+        2.0751449663799937e-05, 2.7518067533339763e-05, 3.684051700771914e-05,
+        4.983157545034751e-05, 6.816129449905648e-05, 9.43779122252421e-05,
+        0.00013244150277702025, 0.00018863308586960936, 0.00027314603538080944,
+        0.00040295923089941123, 0.0006072115853470528, 0.0009376793583353302,
+        0.0014902226347742362, 0.0024513455662060063, 0.004206901277269746,
+        0.007620563495440471, 0.014841225832420321, 0.032095856568055275,
+        0.0824806004825358, 0.3086196179750599, 6.912650136074149, 1.3782799989183279,
+        2.9845345309207905, 3.3215449539109, 1.6207011724645837, 1.594450385865707,
+        2.554237109988354, 2.860704493023282, 1.0671655915195735, 0.4034799796754325,
+        0.5277542367527591, 3.5151328373777537, 3.913363851855454, 2.8767267190055925,
+        1.846208493721509, 1.5000412319277618, 1.4775342175275623, 1.7203057077897754,
+        2.3162698320974746, 2.912517575516779, 2.358294608424995, 1.7401091214357478,
+        1.4517255152884203, 1.3762152268889785, 1.465693601932451, 1.7382361449264294,
+        2.1908771695604488, 2.402085418204379, 1.9873524762282864, 1.5536952003493214,
+        1.3123222350366366, 1.2184431182748283, 1.2394837326917099, 1.3751104211859106,
+        1.6306082368530836, 1.8779347238889166, 1.7602797078850738, 1.3991423196141968,
+        1.1196804970682468, 0.9607458670670642, 0.9897684814593772, 1.0754279781272926,
+        1.1763831722845364, 1.2726420744298026, 1.3248094612394892, 1.3083318832284647,
+        1.2415967740589366, 1.1628385404647164, 1.0982355597157838, 1.0579261095477377,
+        1.0435890937531533, 1.0536737090385664, 1.0848360662976888, 1.1308742858746648,
+        1.180421668679915, 1.216051361795251, 1.219460185940999, 1.1828262031125563,
+        1.1146999426352497, 1.0322725322672255, 0.9502103174446104, 0.8764939162982949,
+        0.8138443203392849, 0.7622263633716782, 0.7205615326284716, 0.6875907123486338,
+        0.6622276525830542, 0.6436656138764346, 0.6313800522316968, 0.6250955245107865,
+        0.6247465075010795, 0.6304425921653867, 0.6424381417153306, 0.6610996116800978,
+        0.6868573497039819, 0.7201211054296038, 0.7611298033031902, 0.8097012248730526,
+        0.8648616726238683, 0.9244010665597354, 0.9845477116972225, 1.0401460089256922,
+        1.0857128433016188, 1.1172245047371492, 1.1336579599337686, 1.137186977785346,
+        1.1319700291429184, 1.1225069830365353, 1.1124903385539062, 1.1043774237609725,
+        1.0994404952909809, 1.098001251078586, 1.0996841825664039, 1.103640511078256,
+        1.1087522814425872, 1.1138360707193244, 1.1178476372995294, 1.1200617289305257,
+        1.1201850272341727, 1.1183692171279942, 1.115123040380659, 1.1111571176189932,
+        1.1072120402979575, 1.1039130524199114, 1.1016742453468797, 1.100656059358122,
+        1.1007695160064483, 1.101718086867548, 1.1030685169944585, 1.1043408986489167,
+        1.105104523765802, 1.1050617273274843, 1.1041012410870958, 1.1023085321762462,
+        1.0999322261808118, 1.0973180548871082, 1.0948292547313394, 1.0927725980539373,
+        1.0913440286529772, 1.0906009164719312, 1.0904621078961814, 1.0907329982849239,
+        1.0911500443799087, 1.0914365561809427, 1.0913592567131072, 1.0907740571995739,
+        1.0896511455126587, 1.0880742550289948, 1.0862156067390392, 1.084294055606698,
+        1.082527249657365, 1.081088449611097, 1.080075953230722, 1.0794993782447808,
+        1.0792835855057914, 1.0792882097458447, 1.0793385243861835, 1.0792616008655438,
+        1.0789206667487443, 1.078240736179327, 1.0772203704321182, 1.0759276351864369,
+        1.0744820700502884, 1.0730275715030893, 1.0717026089124424, 1.070613950095578,
+        1.0698185281469403, 1.0693159565707457, 1.0690520817311786, 1.0689321410672232,
+        1.0688406533416066, 1.0686641573274656, 1.0683124780231363, 1.0677345218525462,
+        1.0669257610689347, 1.0659263800169467, 1.0648110703175167, 1.0636731225199643,
+        1.0626063497064349, 1.061688375375105, 1.060968098628735, 1.0604590414524717,
+        1.0601390998237799, 1.0599561686104577, 1.0598382852244865, 1.0597063760057897,
+        1.0594874214633063, 1.0591259154281774, 1.0585918895761746, 1.0578844565285315,
+        1.0570306600693113, 1.0560802252068593, 1.0550973972035074, 1.0541513411499959,
+        1.053306537286061, 1.0526143346613788, 1.0521064423884372, 1.0517907618877917,
+        1.051649672142122, 1.0516406979558086, 1.051699399388187, 1.0517442735289027,
+        1.0516834061113791, 1.0514225108430424, 1.0508738360492753, 1.0499652231288523,
+        1.0486484240124778, 1.046905698402145, 1.0447537819012633, 1.042244572719807,
+        1.0394623004910748, 1.0365174338459378, 1.0335380415039803, 1.0306596417631513,
+        1.0280146981904972, 1.0257228451165252, 1.0238827049737727, 1.0225658644523743,
+        1.0218132776992057, 1.021634109383158, 1.0220068374922464, 1.022882302635227,
+        1.0241883044276139, 1.0258352936452448, 1.0277226851592027, 1.0297453222289887,
+        1.0317996613007268, 1.0337893186582663, 1.035629718544517, 1.037251690463282,
+        1.0386039603633683, 1.0396545483400903, 1.0403911165919162, 1.0408203120869721,
+        1.0409661370187016, 1.0408673799184336, 1.040574169960826, 1.0401437832711429,
+        1.039635924806646, 1.0391078125020226, 1.0386094761948859, 1.0381797286323524,
+        1.037843253045945, 1.037609174261005, 1.037471340196766, 1.037410348589585,
+        1.0373971290966426, 1.037397662224534, 1.037378221123972, 1.0373104019059458,
+        1.0371751994038418, 1.0369655072680994, 1.0366866646454287, 1.0363549958803298,
+        1.0359946308651615, 1.0356331819407398, 1.0352970320407366, 1.035007028689959,
+        1.0347752809324178, 1.0346035476479525, 1.0344834270692256, 1.0343982548601203,
+        1.0343263375173197, 1.0342449310885757, 1.034134257459027, 1.0339808547466476,
+        1.0337796884594177, 1.03353468534547, 1.0332576479854214, 1.0329658058635833,
+        1.032678498314576, 1.0324136215502033, 1.0321844857234141, 1.0319976247681295,
+        1.0318519085592959, 1.031739062975184, 1.0316454519298122, 1.0315547576548687,
+        1.0314510465043554, 1.0313216521454422, 1.031159356278214, 1.0309634906433638,
+        1.0307397956024278, 1.0304991078972632, 1.0302551657338983, 1.0300219713848324,
+        1.029811213753409, 1.0296302194915363, 1.0294807839483573, 1.0293590589177373,
+        1.0292564765358847, 1.0291615026560168, 1.0290618699165255, 1.028946864317531,
+        1.0288092421342518, 1.028646435216205, 1.0284608461257254, 1.0282592115937201,
+        1.028051188064994, 1.0278474524446037, 1.0276576891170748, 1.0274888393010508,
+        1.0273439242018085, 1.0272216352189172, 1.0271167368056888, 1.0270211778665819,
+        1.0269256820400716, 1.0268215071668598, 1.0267020429705995, 1.0265639563778102,
+        1.026407687473777, 1.026237227065247, 1.0260592437212, 1.0258817472274535,
+        1.0257125543835002, 1.025557848833169, 1.0254210971227857, 1.0253025068910595,
+        1.0251991063378805, 1.0251054074506265, 1.0250145099893826, 1.0249194272803783,
+        1.0248143812324564, 1.0246958278394922, 1.0245630322297206, 1.0244181022709622,
+        1.0242654939280715, 1.024111099631937, 1.0239611043336265, 1.0238208297935467,
+        1.02369378103872, 1.0235810631639382, 1.0234812620729772, 1.0233907941730727,
+        1.0233046439159086, 1.0232173397273914, 1.0231239800207856, 1.0230211179102406,
+        1.0229073456454945, 1.0227834807977492, 1.022652333626452, 1.0225181137052528,
+        1.0223855988280774, 1.0222592287131527, 1.0221422937651063, 1.022036365155509,
+        1.0219410626160457, 1.021854190826067, 1.021772206581537, 1.0216909195238464,
+        1.0216062894801057, 1.0215151700539906, 1.0214158627765637, 1.0213083854638434,
+        1.0211944144587868, 1.0210769221801603, 1.020959587071312, 1.0208460924103875,
+        1.020739446802938, 1.0206414504606582, 1.0205524002565431, 1.0204710796459333,
+        1.0203950259665118, 1.0203210172623192, 1.020245682566311, 1.0201661200481877,
+        1.020080409614669, 1.0199879294646503, 1.01988942497372, 1.019786825454847,
+        1.0196828507856983, 1.0195804869930525, 1.0194824311088344, 1.019390607669943,
+        1.0193058425349437, 1.019227748041039, 1.0191548332400167, 1.019084811602995,
+        1.0190150436293808, 1.0189430293092843, 1.0188668590530032, 1.0187855422042031,
+        1.0186991572032957, 1.0186088018688846, 1.0185163594923274, 1.0184241295345844,
+        1.01833439472671, 1.018249005458279, 1.0181690563784842, 1.0180947108104288,
+        1.0180251999025831, 1.0179589909198268, 1.017894088673799, 1.0178284111828244,
+        1.0177601691093576, 1.017688180084889, 1.0176120630339285, 1.0175322811376852,
+        1.017450030556661, 1.0173670000944546, 1.0172850495221328, 1.0172058673804034,
+        1.017130670709917, 1.0170599994715852, 1.0169936395857029, 1.0169306842580568,
+        1.0168697181008057, 1.016809087009321, 1.016747202547139, 1.0166828250241562,
+        1.0166152750565185, 1.0165445378532583, 1.0164712449095732, 1.0163965403162103,
+        1.0163218593770256, 1.0162486620332594, 1.016178170261552, 1.0161111562490186,
+        1.0160478175160825, 1.015987758458772, 1.0159300782010492, 1.0158735457495527,
+        1.0158168285430564, 1.0157587320881485, 1.0156984077504256, 1.0156354927937843,
+        1.0155701599389082, 1.015503070502604, 1.0154352424685624, 1.0153678595292859,
+        1.015302056708574, 1.0152387211153429, 1.0151783424226546, 1.0151209377697406,
+        1.0150660619074707, 1.0150128981218416, 1.0149604114895079, 1.0149075357308706,
+        1.0148533599939042, 1.0147972830033014, 1.014739108751156, 1.0146790689198393,
+        1.0146177704451735, 1.0145560796621125, 1.0144949650626445, 1.0144353270885764,
+        1.0143778446385057, 1.0143228640777975, 1.0142703483784448, 1.0142198931510344,
+        1.0141708047202662, 1.0141222250378457, 1.0140732808256714, 1.0140232310317467,
+        1.0139715878632647, 1.0139181919586389, 1.0138632306184026, 1.0138071979016088,
+        1.0137508050851431, 1.0136948578662028, 1.0136401215319826, 1.0135871964679444,
+        1.0135364238190503, 1.0134878354621923, 1.0134411547711437, 1.0133958463021497,
+        1.0133512048745306, 1.0133064687472744, 1.0132609385112195, 1.0132140832597936,
+        1.0131656183991602, 1.0131155444997662, 1.013064142945366, 1.013011930732479,
+        1.0129595825806683, 1.0129078327093566, 1.0128573707175523, 1.012808745843827,
+        1.0127622917180379, 1.0127180800611753, 1.012675907334979, 1.012635313818417,
+        1.0125956306462323, 1.0125560474659399, 1.0125156918086207, 1.0124737110454607,
+        1.0124293487307163, 1.0123820088825715, 1.0123313039273778, 1.012277084241789,
+        1.0122194491583776, 1.012158740756542, 1.0120955226772315, 1.0120305466288793,
+        1.0119647093267576, 1.011899002499357, 1.011834458461, 1.0117720936995713,
+        1.0117128530012232, 1.0116575567963293, 1.0116068545733183, 1.0115611872504953,
+        1.0115207612079578, 1.0114855361850712, 1.0114552284264078, 1.0114293293598862,
+        1.0114071388254642, 1.0113878105951424, 1.0113704068024045, 1.0113539570858316,
+        1.011337517857237, 1.011320227180354, 1.0113013512739153, 1.0112803195531048,
+        1.011256746270155, 1.0112304380587525, 1.0112013878824966, 1.0111697569123734,
+        1.011135846631869, 1.0111000639560614, 1.0110628823609609, 1.011024801992143,
+        1.010986311512955, 1.0109478541187742, 1.0109097997294603, 1.0108724249018708,
+        1.0108359014880286, 1.0108002944977885, 1.0107655690082307, 1.010731605304568,
+        1.0106982207719635, 1.0106651964390174, 1.0106323055771693, 1.0105993414682697,
+        1.0105661414397387, 1.010532604580125, 1.0104987011932558, 1.0104644729794907,
+        1.010430024049673, 1.0103955040408958, 1.0103610856498348, 1.0103269396698613,
+        1.0102932109827483, 1.0102599988401482, 1.0102273441709761, 1.0101952256409505,
+        1.0101635649109117, 1.0101322401800732, 1.0101011058672167, 1.0100700153705144,
+        1.010038843402008, 1.0100075044904604, 1.0099759648741122, 1.0099442460663224,
+        1.0099124197023888, 1.0098805946532752, 1.0098488985994731, 1.0098174571021667,
+        1.0097863735554249, 1.0097557132005122, 1.0097254936706557, 1.009695683433725,
+        1.009666208196449, 1.0096369640427816, 1.0096078350123727, 1.0095787121539708,
+        1.0095495109162547, 1.0095201840842074, 1.009490728265571, 1.009461183038081,
+        1.0094316230948808, 1.0094021448665964, 1.0093728499672612, 1.0093438282703706,
+        1.0093151434049359, 1.0092868229848149, 1.0092588550392443, 1.0092311910485057,
+        1.0092037548888977, 1.0091764560386298, 1.0091492047446928, 1.0091219265989222,
+        1.009094574148592, 1.0090671337305273, 1.009039626561245, 1.0090121040910234,
+        1.0089846385703543, 1.0089573105293625, 1.0089301953168062, 1.0089033509229914,
+        1.0088768090214206, 1.0088505705692365, 1.0088246065159832, 1.0087988633213705,
+        1.0087732722169196, 1.00874776058481, 1.0087222635523947, 1.008696733944797,
+        1.0086711490785618, 1.008645513447432, 1.0086198570444345, 1.0085942297644388,
+        1.0085686929259106, 1.008543309350623, 1.0085181335926485, 1.0084932038037833,
+        1.008468536393544, 1.0084441241539388, 1.0084199379591736, 1.0083959316101272,
+        1.008372048954695, 1.0083482321374464, 1.008324429744957, 1.008300603713216,
+        1.0082767341192687, 1.0082528213372945, 1.0082288854366368, 1.0082049630733283,
+        1.0081811024257876, 1.0081573569165239, 1.0081337785319586, 1.0081104115107868,
+        1.008087287040881, 1.0080644194199875, 1.0080418039318766, 1.008019416498275,
+        1.0079972150104164, 1.0079751421318635, 1.007953129296434, 1.007931101591908,
+        1.0079089832085033, 1.0078867031278134, 1.0078642007239538, 1.0078414309415649,
+        1.0078183687095403, 1.007795012253887, 1.0077713850005596, 1.0077475358189394,
+        1.007723537454641, 1.0076994831342, 1.007675481483269, 1.0076516500668438,
+        1.007628108012127, 1.0076049682893853, 1.007582330284246, 1.0075602732846285,
+        1.007538851425266, 1.0075180904911867, 1.007497986797065, 1.0074785081563877,
+        1.0074595967598468, 1.0074411736209095, 1.0074231441360928, 1.0074054042576799,
+        1.0073878467863964, 1.0073703673508732, 1.007352869733089, 1.0073352703046223,
+        1.0073175014386897, 1.007299513844252, 1.0072812778230342, 1.007262783479855,
+        1.007244039928224, 1.0072250735389283, 1.0072059252920171, 1.0071866473223319,
+        1.0071672987998295, 1.0071479413553226, 1.0071286343395014, 1.007109430271817,
+        1.007090370877921, 1.0070714841123019, 1.0070527825063296, 1.0070342630681541,
+        1.0070159087989774, 1.006997691698736, 1.0069795769398635, 1.0069615277211368,
+        1.0069435102032127, 1.0069254978956355, 1.0069074749222342, 1.006889437734862,
+        1.006871395056732, 1.0068533660865622, 1.0068353772456984, 1.0068174579639644,
+        1.0067996361408973, 1.0067819339647324, 1.0067643647122124, 1.0067469309969421,
+        1.006729624705785, 1.0067124285977895, 1.0066953192806896, 1.0066782710673934,
+        1.0066612600835767, 1.0066442679681429, 1.0066272845851247, 1.0066103093354022,
+        1.0065933508907154, 1.0065764254318617, 1.0065595537149183, 1.0065427574740353,
+        1.0065260557671625, 1.0065094618671198, 1.006492981196861, 1.0064766106236323,
+        1.0064603391937497, 1.0064441501482861, 1.0064280238498762, 1.0064119411074788,
+        1.0063958863316667, 1.0063798499952599, 1.0063638300039595, 1.0063478317751198,
+        1.0063318670459986, 1.0063159516470979, 1.0063001026456049, 1.0062843353604596,
+        1.0062686607595903, 1.006253083671695, 1.0062376020950776, 1.0062222076916423,
+        1.006206887349471, 1.0061916255177914, 1.0061764068937507, 1.0061612189910805,
+        1.0061460541534462, 1.0061309106820524, 1.006115792907945, 1.006100710225511,
+        1.006085675281833, 1.0060707016569765, 1.0060558014488836, 1.0060409831821486,
+        1.0060262503926964, 1.0060116011143443, 1.0059970283311888, 1.0059825212911238,
+        1.0059680674294986, 1.005953654553126, 1.0059392728991112, 1.0059249167150017,
+        1.0059105850994794, 1.0058962819778992, 1.0058820152407764, 1.005867795217791,
+        1.0058536327707197, 1.0058395373472433, 1.0058255153351012, 1.0058115689946825,
+        1.0057976961398398, 1.0057838906019998, 1.0057701433751323, 1.005756444223523,
+        1.0057427834593835, 1.0057291535758301, 1.0057155504544624, 1.005701973948639,
+        1.005688427757803, 1.0056749186343144, 1.0056614550795473, 1.0056480457709414,
+        1.0056346980020798, 1.0056214164079242, 1.0056082021900556, 1.0055950529635962,
+        1.0055819632354543, 1.0055689254129643, 1.0055559311519593, 1.005542972799163,
+        1.0055300446740085, 1.0055171439699766, 1.0055042711281532, 1.0054914296320956,
+        1.0054786252757333, 1.0054658650470016, 1.005453155833189, 1.0054405031797256,
+        1.0054279103184318, 1.0054153776282193, 1.0054029026110682, 1.0053904803735485,
+        1.0053781045158243, 1.0053657682613286, 1.0053534656225152, 1.0053411923972777,
+        1.0053289468258413, 1.0053167298018257, 1.0053045446122957, 1.005292396264804,
+        1.0052802905301634, 1.0052682328762825, 1.0052562274826866, 1.0052442765063307,
+        1.0052323797207585, 1.0052205345820397, 1.0052087366988982, 1.0051969806141337,
+        1.005185260752555, 1.0051735723652195, 1.0051619123049556, 1.0051502795020133,
+        1.0051386750645706, 1.0051271019964159, 1.0051155645912702, 1.0051040676180953,
+        1.005092615445286, 1.0050812112582863, 1.0050698565047904, 1.0050585506583005,
+        1.0050472913328408, 1.0050360747192877, 1.005024896258625, 1.0050137514281552,
+        1.005002636500411, 1.0049915491431118, 1.0049804887596212, 1.0049694565176175,
+        1.0049584550692527, 1.0049474880199931, 1.0049365592454926, 1.0049256721797664,
+        1.0049148291995467, 1.004904031209545, 1.0048932774955626, 1.0048825658638114,
+        1.0048718930345228, 1.004861255214458, 1.004850648743785, 1.004840070702752,
+        1.0048295193735932, 1.0048189944812018, 1.0048084971765596, 1.0047980297727404,
+        1.0047875952860152, 1.0047771968669532, 1.0047668372233578, 1.0047565181354945,
+        1.0047462401452543, 1.0047360024686216, 1.00472580314061, 1.0047156393613883,
+        1.0047055079781795, 1.0046954060158606, 1.0046853311629969, 1.0046752821304619,
+        1.0046652588238771, 1.0046552623050675, 1.0046452945548068, 1.0046353580830856,
+        1.0046254554583376, 1.0046155888389043, 1.0046057595875855, 1.0045959680334178,
+        1.0045862134178594, 1.0045764940296895, 1.0045668075004355, 1.0045571512052545,
+        1.0045475226976317, 1.0045379201024043, 1.0045283424007567, 1.004518789561333,
+        1.0045092624990242, 1.0044997628730763, 1.0044902927633577, 1.0044808542831594,
+        1.0044714491963849, 1.004462078604098, 1.0044527427519885, 1.0044434409882277,
+        1.0044341718748553, 1.004424933429738, 1.0044157234546114, 1.0044065398915,
+        1.0043973811465101, 1.0043882463273561, 1.0043791353569205, 1.0043700489470928,
+        1.0043609884410187, 1.0043519555537461, 1.0043429520572764, 1.004333979464135,
+        1.0043250387620233, 1.004316130242354, 1.0043072534483912, 1.0042984072484276,
+        1.0042895900183817, 1.0042807999009307, 1.0042720350965488, 1.0042632941380643,
+        1.0042545761044925, 1.0042458807411827, 1.0042372084694509, 1.0042285602873418,
+        1.004219937580425, 1.004211341875435, 1.004202774577473, 1.0041942367327474,
+        1.0041857288532878, 1.0041772508292, 1.0041688019393276, 1.0041603809557398,
+        1.004151986323151], [1.860561262000302e-12, 5.590965144381883e-12,
+        9.34929463369726e-12, 1.3154437226175725e-11, 1.702568931308895e-11,
+        2.0982928027455134e-11, 2.5046788793157408e-11, 2.923885430425005e-11,
+        3.3581854914317976e-11, 3.8099884436610834e-11, 4.2818634026429384e-11,
+        4.776564768034582e-11, 5.297060253854495e-11, 5.846561902961817e-11,
+        6.428560472448649e-11, 7.04686379940848e-11, 7.705639715973789e-11,
+        8.409464233222935e-11, 9.163375817022624e-11, 9.972936639463722e-11,
+        1.0844301960925005e-10, 1.1784298791613632e-10, 1.2800515352408085e-10,
+        1.3901402978733642e-10, 1.509639242483601e-10, 1.63960268378703e-10,
+        1.7812114108065555e-10, 1.935790165123481e-10, 2.1048277353189044e-10,
+        2.2900000896947084e-10, 2.4931970654748365e-10, 2.7165531979872763e-10,
+        2.962483409156056e-10, 3.2337243813545756e-10, 3.5333826170938615e-10,
+        3.8649903552240276e-10, 4.232570757011358e-10, 4.6407140277893975e-10,
+        5.094666490756048e-10, 5.600435000132424e-10, 6.164909594518053e-10,
+        6.796007845091172e-10, 7.502845105848845e-10, 8.295935712716726e-10,
+        9.187431295298995e-10, 1.0191403623211478e-09, 1.1324181140042024e-09,
+        1.2604750198716513e-09, 1.4055234695482989e-09, 1.5701470706166886e-09,
+        1.7573696752330557e-09, 1.970738508541497e-09, 2.214424543675805e-09,
+        2.4933440401904073e-09, 2.8133061228300535e-09, 3.181192503383437e-09,
+        3.605177022134952e-09, 4.094994662291286e-09, 4.662272280618745e-09,
+        5.3209365882551336e-09, 6.087719214750639e-09, 6.9827842815298505e-09,
+        8.030511227582495e-09, 9.260475276627495e-09, 1.0708680719807698e-08,
+        1.2419119251414948e-08, 1.4445748493756375e-08, 1.6855016888245378e-08,
+        1.972910351438395e-08, 2.3170099760937402e-08, 2.7305441100640806e-08,
+        3.2295011723255995e-08, 3.8340508150708054e-08, 4.5697884220410605e-08,
+        5.4694047634142974e-08, 6.574949919124998e-08, 7.940940404298696e-08,
+        9.638683700821566e-08, 1.1762396974391741e-07, 1.443803566014069e-07,
+        1.783633788389051e-07, 2.219266971474567e-07, 2.78383451682192e-07,
+        3.525243036666565e-07, 4.51528410520993e-07, 5.867019250527802e-07,
+        7.771907035807035e-07, 1.0592984663135622e-06, 1.5165223475406203e-06,
+        2.4327248207525564e-06, 8.983344043039741e-06, 3.4407148128431454e-06,
+        3.0788829762166794e-06, 3.2588182907335967e-06, 3.701491716828597e-06,
+        4.384403432797052e-06, 5.350336838297003e-06, 6.685580238402497e-06,
+        8.52605245602338e-06, 1.1077024914207207e-05, 1.4647909600949463e-05,
+        1.9709962527758127e-05, 2.6992227757710016e-05, 3.764391464692145e-05,
+        5.3515778788747716e-05, 7.766138144884731e-05, 0.00011525871552788063,
+        0.0001753672747637021, 0.00027442166635680085, 0.0004435303174683058,
+        0.0007446564097185972, 0.0013092090476287275, 0.0024390391545493764,
+        0.004905497122939002, 0.011004932055370268, 0.02948200099285794,
+        0.11563853895319001, 2.732521321110213, 0.5791026043870786, 1.3450828889750528,
+        1.6242100185566206, 0.8729354000297639, 0.9660804995654967, 1.7975150996519422,
+        2.470641957527267, 1.2726452388315592, 1.0099844052562945, 1.0795995800138871,
+        1.4988689589718376, 2.3978640145625287, 1.922180708284257, 1.277459777164595,
+        1.0546005396709393, 1.046017793676741, 1.2204352720098466, 1.642001616311435,
+        2.0595754052122115, 1.6617657403926298, 1.2210516614564035, 1.0140929381360055,
+        0.9568791053522144, 1.0143877332332754, 1.1976516878254437, 1.5032210554543755,
+        1.6418998533929694, 1.3539582069953617, 1.055695302033266, 0.889986852684063,
+        0.8254942997815451, 0.8398327319036846, 0.9330692820476476, 1.1098606760056078,
+        1.2848443222187322, 1.2139383087371576, 0.9763217804712756, 0.7954107468917665,
+        0.7044117062572833, 0.782962691038673, 0.870546830145479, 0.9672829718172239,
+        1.0593145640966821, 1.113950476359102, 1.1096244786938543, 1.060949871952351,
+        1.00023855190829, 0.9502442940101028, 0.9202150055064109, 0.9120878491930178,
+        0.924904912422527, 0.9560375760825652, 1.000234943212829, 1.0475529356479392,
+        1.0825069231077051, 1.0886483116730994, 1.0587514939505986, 1.000242552747917,
+        0.9284213666807476, 0.8564659533406149, 0.7916282318355482, 0.7364505649693227,
+        0.6909854266581344, 0.6543283965143536, 0.6253965370301493, 0.6032509991968498,
+        0.5871971589035828, 0.5767901712094978, 0.5718073783222042, 0.5722145516855826,
+        0.5781356107408433, 0.5898260161414104, 0.6076436817253424, 0.6320053074594587,
+        0.6633089376638734, 0.7017953972479273, 0.7473165358100832, 0.7989913287664381,
+        0.8547912524184059, 0.9112344112023989, 0.9635442915524818, 1.006624389547119,
+        1.0367159333335476, 1.052835648376407, 1.0569697944156797, 1.052958470011013,
+        1.0449726123597496, 1.0364443839609532, 1.0296649186474982, 1.025826381657114,
+        1.025236653585608, 1.0275527554349104, 1.0319879127553895, 1.0375010212141247,
+        1.0429865978078257, 1.0474664227684858, 1.050258671966199, 1.0510849735797796,
+        1.0500840794212034, 1.047730634119699, 1.044690371505133, 1.0416589745484877,
+        1.0392253275694212, 1.037780885104897, 1.0374789546835539, 1.0382379208381407,
+        1.0397800226820921, 1.0416976388127566, 1.043538022166426, 1.0448938176797684,
+        1.0454825484922194, 1.0451975196812018, 1.0441181479323578, 1.0424786914473518,
+        1.0406060585528356, 1.038844532031916, 1.0374855755269465, 1.0367160228810668,
+        1.0365913981206616, 1.0370355887206488, 1.0378643379667611, 1.0388273328171669,
+        1.039661181622674, 1.0401432992952186, 1.0401356808643676, 1.0396090725104836,
+        1.038642563938241, 1.0373999366007616, 1.036089881384877, 1.0349203650855159,
+        1.0340573148061731, 1.0335952430459716, 1.0335439319138284, 1.0338319827636788,
+        1.0343253408612716, 1.0348567462428777, 1.0352603504360989, 1.0354047022454007,
+        1.0352174430006165, 1.0346967420459643, 1.0339075707875536, 1.0329645133633205,
+        1.0320057880521853, 1.031164632600948, 1.030543994459109, 1.0301989992150888,
+        1.030129637538598, 1.0302840761204861, 1.0305712423943463, 1.0308799359162006,
+        1.031100735022664, 1.0311465330720602, 1.0309678371530693, 1.030560070472412,
+        1.029961863946267, 1.0292452681284134, 1.028500426214555, 1.0278181159226978,
+        1.0272735749524962, 1.0269143377890495, 1.026753745406227, 1.0267706471889426,
+        1.0269147957934726, 1.0271166339774096, 1.0272996245959942, 1.0273930102155384,
+        1.0273429406735644, 1.0271202867776232, 1.0267241164808563, 1.0261806190431562,
+        1.0255380437713721, 1.0248588010709763, 1.0242101509160462, 1.0236548717906366,
+        1.0232430411436073, 1.0230056878865879, 1.0229507132416311, 1.0230611932900935,
+        1.023295999378356, 1.0235925827520769, 1.0238717234828063, 1.024043990891198,
+        1.0240175650011165, 1.0237069135980053, 1.0230416283852815, 1.0219745497122825,
+        1.020488223685328, 1.0185988025938766, 1.016356748545842, 1.013844105063282,
+        1.0111685823756928, 1.0084551498273295, 1.0058361425308835, 1.0034410110610932,
+        1.0013867722754282, 0.9997700045128431, 0.9986609433488269, 0.9980999428922507,
+        0.9980963182669526, 0.9986293962075101, 0.9996514702189195, 1.0010922719491204,
+        1.002864519065662, 1.0048700761375822, 1.007006269832265, 1.0091719368729724,
+        1.0112728533297644, 1.0132262895717419, 1.0149645407291983, 1.0164373773226982,
+        1.0176134272146464, 1.018480530562337, 1.0190451102617448, 1.0193305893312337,
+        1.0193748865588297, 1.0192270508696464, 1.0189431598939478, 1.018581701224391,
+        1.0181987561451067, 1.01784339007152, 1.017553698248494, 1.0173539431346228,
+        1.0172531443062476, 1.0172453446511327, 1.0173115884821993, 1.0174234268284372,
+        1.0175475405856749, 1.0176508800847983, 1.0177056009195438, 1.0176930666229616,
+        1.0176063077975848, 1.0174505656242285, 1.0172418655897302, 1.017003902216711,
+        1.0167637989103175, 1.0165474831385133, 1.016375457044547, 1.0162596484909794,
+        1.0162018232122878, 1.0161937654152922, 1.0162191371693028, 1.0162566511095843,
+        1.0162839776255843, 1.0162816914820136, 1.0162365664450175, 1.0161436538084534,
+        1.0160068115600147, 1.0158376418103254, 1.0156530868069846, 1.015472169756974,
+        1.0153125016369853, 1.015187189202676, 1.0151026783800026, 1.0150578775768193,
+        1.015044665682958, 1.0150496421131012, 1.015056761804461, 1.0150503511516509,
+        1.0150179459329824, 1.0149524393810572, 1.0148531695499923, 1.0147257831131848,
+        1.0145809462843214, 1.014432185856907, 1.0142932933090512, 1.0141757865483445,
+        1.0140868908865424, 1.0140283856025594, 1.0139964909744346, 1.0139827760808966,
+        1.0139758843607394, 1.0139637327511606, 1.0139357646923874, 1.0138848399665013,
+        1.0138084241109055, 1.013708881278515, 1.013592848801723, 1.0134698445273413,
+        1.0133503954771135, 1.0132440534532616, 1.013157668369121, 1.0130942266153735,
+        1.0130524453840477, 1.0130271683452672, 1.0130104604174683, 1.012993175460649,
+        1.012966691605635, 1.0129244877550043, 1.0128632744550876, 1.0127834845013652,
+        1.0126890548182852, 1.0125865662294036, 1.0124839252931812, 1.012388850462386,
+        1.0123074504105016, 1.0122431534135616, 1.012196171503396, 1.012163577803255,
+        1.0121399602975658, 1.0121185111073148, 1.0120923352559936, 1.012055729574098,
+        1.0120051959317837, 1.0119400099534268, 1.0118622551252239, 1.0117763350851312,
+        1.0116880737728102, 1.0116035857090138, 1.0115281342166118, 1.01146518896865,
+        1.0114158491393346, 1.011378724813154, 1.011350281806219, 1.01132556993695,
+        1.0112991871842965, 1.0112662936989776, 1.0112234865015937, 1.0111693776455706,
+        1.0111047788658147, 1.011032472214399, 1.0109566239405792, 1.0108819631152663,
+        1.0108128856134382, 1.0107526517971457, 1.0107028225821966, 1.0106630293165961,
+        1.0106311081433006, 1.0106035615846487, 1.0105762513033871, 1.0105451866542212,
+        1.0105072603134295, 1.0104607967250898, 1.0104058179661237, 1.0103439870320021,
+        1.0102782496240832, 1.01021225061621, 1.010149640367657, 1.0100934022854384,
+        1.0100453244644532, 1.0100057074884656, 1.0099733540902913, 1.0099458333561582,
+        1.0099199622990798, 1.009892409779178, 1.0098603083811402, 1.0098217619745253,
+        1.009776159327591, 1.0097242425988815, 1.0096679262186206, 1.0096099076574616,
+        1.0095531483324722, 1.0095003239455516, 1.0094533456228154, 1.009413036721614,
+        1.0093790188563545, 1.0093498208140175, 1.009323183080244, 1.0092964960647404,
+        1.0092672878199487, 1.009233670742217, 1.0091946671187633, 1.0091503580739878,
+        1.009101834531946, 1.0090509656875142, 1.0090000332731857, 1.0089513027252484,
+        1.0089066113761493, 1.0088670479203323, 1.0088327782753184, 1.0088030445595506,
+        1.0087763316874307, 1.0087506659495125, 1.0087239872292915, 1.0086945250499852,
+        1.0086611101715435, 1.0086233673154708, 1.0085817579017369, 1.0085374699024332,
+        1.0084921797355013, 1.0084477334711968, 1.0084058076230349, 1.0083676114319031,
+        1.0083336829644065, 1.0083038126890627, 1.0082771041487055, 1.0082521564022047,
+        1.0082273315389432, 1.0082010564686221, 1.0081721036461682, 1.0081398009321736,
+        1.0081041351128892, 1.008065733860031, 1.008025733251408, 1.0079855582904207,
+        1.0079466585560286, 1.0079102477406248, 1.007877093501802, 1.0078473935193948,
+        1.0078207570935138, 1.0077962921994712, 1.007772779167458, 1.0077488973676865,
+        1.0077234629383531, 1.007695634965638, 1.0076650544820924, 1.0076318937167486,
+        1.0075968096846815, 1.0075608133575618, 1.0075250802357936, 1.0074907376455202,
+        1.0074586670115682, 1.007429355440143, 1.0074028211323391, 1.0073786233830915,
+        1.0073559527517415, 1.0073337831134068, 1.0073110570843151, 1.0072868714115126,
+        1.007260630002799, 1.0072321389568477, 1.0072016288811485, 1.0071697029025335,
+        1.0071372217139727, 1.0071051475145387, 1.0070743750512134, 1.0070455792253652,
+        1.0070191048707355, 1.0069949162121852, 1.0069726127308734, 1.0069515066348482,
+        1.006930746848356, 1.0069094670810375, 1.0068869322460658, 1.0068626586641998,
+        1.0068364887459886, 1.0068086091403088, 1.006779511153452, 1.0067499018668582,
+        1.006720582212208, 1.0066923130767118, 1.0066656916554333, 1.0066410577325147,
+        1.006618443959229, 1.0065975765745674, 1.0065779247180806, 1.006558788881708,
+        1.0065394133103907, 1.0065191040972932, 1.0064973346593853, 1.006473823055115,
+        1.0064485706106885, 1.006421857632209, 1.0063941985338136, 1.0063662644824003,
+        1.0063387858291992, 1.0063124486681831, 1.0062877997060706, 1.0062651714793134,
+        1.0062446363240387, 1.0062259930799264, 1.006208786013799, 1.0061923515316031,
+        1.0061758853857625, 1.0061585215322615, 1.006139413568177, 1.006117810601659,
+        1.006093121144773, 1.006064960779097, 1.0060331815387313, 1.0059978828741352,
+        1.0059594055077017, 1.0059183104032974, 1.005875345498719, 1.00583140292491,
+        1.005787469328296, 1.0057445717794866, 1.005703721702057, 1.00566585932799,
+        1.0056318013483128, 1.0056021945892368, 1.0055774785878213, 1.005557859754703,
+        1.0055432993181257, 1.0055335164261192, 1.0055280066910153, 1.0055260752025474,
+        1.0055268817653442, 1.0055294950000695, 1.0055329511382498, 1.0055363129479373,
+        1.0055387243019642, 1.0055394564246138, 1.0055379427469728, 1.0055338004410812,
+        1.005526837939623, 1.0055170489366825, 1.0055045943841925, 1.0054897747683014,
+        1.0054729954352455, 1.005454727945559, 1.00543547040879, 1.005415709543745,
+        1.0053958868777344, 1.0053763710865022, 1.0053574380092156, 1.005339259359467,
+        1.0053219005898475, 1.0053053277542752, 1.0052894225584343, 1.0052740041266124,
+        1.005258855397765, 1.0052437515693833, 1.0052284877170037, 1.005212902703949,
+        1.0051968968073117, 1.005180441127781, 1.0051635777761017, 1.0051464109401256,
+        1.0051290900938445, 1.0051117876512428, 1.0050946741345563, 1.0050778942896998,
+        1.0050615474670261, 1.0050456749900374, 1.0050302562303373, 1.0050152138341684,
+        1.0050004271923687, 1.004985752018591, 1.0049710429925436, 1.0049561759822632,
+        1.0049410664560934, 1.0049256813193843, 1.0049100424666508, 1.0048942216585317,
+        1.004878327703407, 1.004862488125264, 1.0048468283394298, 1.0048314517030656,
+        1.0048164236060684, 1.0048017620591447, 1.0047874361405875, 1.0047733723659282,
+        1.0047594677598164, 1.0047456073478664, 1.0047316831179478, 1.004717611328578,
+        1.0047033453856387, 1.004688882300971, 1.0046742618470899, 1.0046595587430516,
+        1.0046448693422965, 1.0046302951580548, 1.0046159260191712, 1.0046018256331744,
+        1.0045880218593441, 1.0045745031533955, 1.0045612215864657, 1.0045481017464282,
+        1.0045350538813278, 1.0045219889959143, 1.004508833361346, 1.004495540074147,
+        1.0044820958613154, 1.0044685221680225, 1.0044548705351937, 1.0044412132106206,
+        1.0044276306860982, 1.0044141982973314, 1.0044009741009157, 1.0043879899547732,
+        1.0043752471364524, 1.0043627170468228, 1.0043503467016437, 1.0043380679510179,
+        1.0043258088074827, 1.0043135049897527, 1.004301109832566, 1.00428860105208,
+        1.0042759834216899, 1.004263287103178, 1.004250562075062, 1.0042378696920615,
+        1.0042252728080316, 1.0042128260467789, 1.004200567701619, 1.0041885144170315,
+        1.0041766593200423, 1.0041649737113434, 1.004153411888075, 1.004141918233307,
+        1.00413043543064, 1.0041189125755006, 1.0041073120542743, 1.0040956143169044,
+        1.004083820025169, 1.0040719494544137, 1.0040600393990253, 1.0040481381298487,
+        1.0040362991422056, 1.0040245745032241, 1.0040130085657293, 1.0040016326861554,
+        1.0039904613999657, 1.0039794903053627, 1.003968695715509, 1.003958035983621,
+        1.0039474542935576, 1.003936882640957, 1.0039262466969066, 1.0039154712344813,
+        1.0039044857951558, 1.0038932302681538, 1.0038816600486797, 1.0038697504351959,
+        1.0038574999304217, 1.0038449321379934, 1.0038320960063207, 1.0038190642687954,
+        1.0038059300628117, 1.003792801868569, 1.0037797970748579, 1.003767034630576,
+        1.0037546273550721, 1.0037426745383313, 1.003731255451863, 1.0037204243112434,
+        1.0037102070903094, 1.0037006004031996, 1.0036915724683164, 1.0036830659744316,
+        1.0036750025083123, 1.0036672880931712, 1.0036598193376507, 1.003652489704691,
+        1.0036451954687382, 1.0036378410216993, 1.0036303432933023, 1.0036226351512452,
+        1.0036146677275715, 1.0036064116719965, 1.003597857362435, 1.0035890141144277,
+        1.0035799084369739, 1.003570581394887, 1.0035610851674264, 1.0035514789439177,
+        1.0035418243661682, 1.0035321808044952, 1.0035226008226794, 1.003513126229112,
+        1.0035037851094495, 1.0034945901798191, 1.003485538686335, 1.003476613915309,
+        1.0034677881877425, 1.003459027017995, 1.0034502939504013, 1.0034415554775618,
+        1.0034327854122873, 1.0034239681420412, 1.0034151003372682, 1.003406190895482,
+        1.0033972591521385, 1.0033883316393672, 1.0033794378865335, 1.0033706058970713,
+        1.0033618579815982, 1.0033532075683267, 1.0033446574569493, 1.0033361997547958,
+        1.003327817469933, 1.0033194874773075, 1.0033111843620959, 1.0033028845135183,
+        1.003294569813094, 1.0032862303378052, 1.0032778656678472, 1.0032694846219494,
+        1.0032611035017893, 1.0032527431681888, 1.0032444254559016, 1.0032361695313463,
+        1.0032279887937188, 1.0032198888167478, 1.0032118666448429, 1.0032039115251659,
+        1.0031960069165213, 1.0031881334065331, 1.0031802720256426, 1.0031724073923465,
+        1.0031645301661418, 1.0031566384140707, 1.003148737689569, 1.0031408398448165,
+        1.0031329608114037, 1.0031251177529645, 1.0031173260897137, 1.0031095969038015,
+        1.0031019351565507, 1.0030943389992328, 1.0030868002652842, 1.003079306027806,
+        1.0030718409271384, 1.0030643898492568, 1.0030569404865526, 1.003049485345119,
+        1.0030420228691093, 1.0030345575130621, 1.003027098778609, 1.0030196594095548,
+        1.0030122530793588, 1.003004891983404, 1.0029975847540613, 1.0029903350495244,
+        1.0029831410417487, 1.0029759958672972, 1.0029688889367565, 1.0029618078525337,
+        1.0029547405863015, 1.0029476775317423, 1.0029406130801155, 1.0029335464586253,
+        1.0029264817062165, 1.002919426814791, 1.0029123922078456, 1.0029053888390917,
+        1.002898426251981, 1.0028915109386216, 1.0028846452753772, 1.0028778272044712,
+        1.002871050696605, 1.002864306892499, 1.0028575857059352, 1.0028508775962295,
+        1.0028441751965516, 1.0028374745181345, 1.0028307755320063, 1.002824082043817,
+        1.002817400903057, 1.002810740702962, 1.0028041102120675, 1.002797516818701,
+        1.0027909652597586, 1.002784456848033, 1.0027779893194553, 1.0027715573098828,
+        1.0027651533608324, 1.0027587692637343, 1.0027523974982981, 1.002746032510812,
+        1.0027396716130517, 1.002733315354908, 1.0027269673199184, 1.0027206333952723,
+        1.0027143206585751, 1.0027080360867626, 1.0027017853182665, 1.0026955716838573,
+        1.0026893956687313, 1.002683254888464, 1.0026771445691376, 1.0026710584338758,
+        1.0026649898294355, 1.0026589328888234, 1.0026528835250736, 1.0026468400864383,
+        1.0026408035669645, 1.0026347773473119, 1.00262876652365, 1.0026227769530083,
+        1.0026168141899436, 1.0026108825036408, 1.0026049841456137, 1.002599118989741,
+        1.002593284597962, 1.0025874766891043, 1.0025816899182176, 1.0025759188220134,
+        1.0025701587606506, 1.0025644066912849, 1.002558661642531, 1.0025529248147718,
+        1.0025471992986288, 1.0025414894708846, 1.0025358001819111, 1.0025301358821033,
+        1.0025244998414728, 1.0025188935962235, 1.0025133167128528, 1.002507766902523,
+        1.0025022404562365, 1.002496732916357, 1.002491239860828, 1.002485757660186,
+        1.0024802840760378, 1.002474818600712, 1.0024693624859056, 1.0024639184635853,
+        1.0024584902161873, 1.0024530816952053, 1.0024476964111229, 1.0024423368192785,
+        1.0024370039061135, 1.0024316970426068, 1.0024264141232118, 1.002421151958468,
+        1.0024159068460914, 1.00241067521627, 1.0024054542368748, 1.00240024227427,
+        1.0023950391334417, 1.0023898460415082, 1.0023846653843973, 1.0023795002490852,
+        1.002374353856078, 1.0023692289837332, 1.002364127484631, 1.002359049975457,
+        1.002353995749651, 1.0023489629219642, 1.0023439487737487, 1.0023389502336997,
+        1.0023339644072087, 1.0023289890612608, 1.0023240229822425, 1.0023190661480064,
+        1.0023141196894525, 1.002309185653857, 1.0023042666160735, 1.0022993652088645,
+        1.0022944836554593, 1.00228962338498, 1.0022847847947611, 1.0022799671966287,
+        1.0022751689514775, 1.0022703877639985, 1.0022656210826368, 1.0022608665333017,
+        1.0022561223115045, 1.0022513874667272, 1.002246662033267, 1.0022419469891402,
+        1.0022372440546767, 1.0022325553695348, 1.0022278831063847, 1.0022232290889612,
+        1.002218594479308, 1.0022139795856595, 1.0022093838203765, 1.002204805811068,
+        1.0022002436420023, 1.0021956951814137, 1.0021911584371384, 1.0021866318796984,
+        1.0021821146793273, 1.0021776068192967, 1.0021731090698374, 1.0021686228307545,
+        1.0021641498726557, 1.0021596920227018, 1.0021552508488656, 1.0021508273951552,
+        1.0021464220105183, 1.0021420342970717, 1.0021376631831163, 1.0021333071053278,
+        1.0021289642673263, 1.002124632930091, 1.0021203116859358, 1.0021159996719,
+        1.0021116966896502, 1.002107403215114, 1.002103120299469, 1.002098849380351,
+        1.0020945920360278, 1.0020903497231541, 1.0020861235400165, 1.0020819140516033,
+        1.002077721202038, 1.002073544325203, 1.0020693822490032, 1.002065233474402],
+    [8.06564244779419e-13, 2.4238188913528835e-12, 4.053489027171017e-12,
+        5.703974484447685e-12, 7.383860870648792e-12, 9.101997682599901e-12,
+        1.0867579107706212e-11, 1.2690230065959475e-11, 1.458009755807974e-11,
+        1.654794913758527e-11, 1.860527975700619e-11, 2.0764428624776746e-11,
+        2.3038707570177476e-11, 2.5442543237155977e-11, 2.799163493433789e-11,
+        3.070313096229277e-11, 3.359582608681211e-11, 3.669038351454225e-11,
+        4.000958521451811e-11, 4.357861473260523e-11, 4.742537788335678e-11,
+        5.15808667275077e-11, 5.607957393656814e-11, 6.095996526219728e-11,
+        6.62650192921049e-11, 7.204284514609263e-11, 7.834739080761802e-11,
+        8.523925646052575e-11, 9.278663033266711e-11, 1.0106636689600027e-10,
+        1.1016523174251128e-10, 1.2018134058285404e-10, 1.3122582612963802e-10,
+        1.434247716851843e-10, 1.5692145839042063e-10, 1.718789810944923e-10,
+        1.8848329912336988e-10, 2.0694680004433386e-10, 2.275124708520878e-10,
+        2.5045878829579134e-10, 2.7610546389360354e-10, 3.0482020489527337e-10,
+        3.3702668722721765e-10, 3.732139752102099e-10, 4.1394767418356073e-10,
+        4.598831598500282e-10, 5.117813072013626e-10, 5.705272264670116e-10,
+        6.371526350919086e-10, 7.128626255161208e-10, 7.990677689277961e-10,
+        8.974227069901457e-10, 1.0098726514632126e-09, 1.138709550643181e-09,
+        1.2866400992792108e-09, 1.4568682973461221e-09, 1.6531959354886787e-09,
+        1.880145218915559e-09, 2.1431088228650643e-09, 2.448534025712595e-09,
+        2.804149308423645e-09, 3.21924403786332e-09, 3.705014712091144e-09,
+        4.274994939536148e-09, 4.945591105829142e-09, 5.736751899184321e-09,
+        6.6728079622420675e-09, 7.783528558512883e-09, 9.105456106478524e-09,
+        1.0683597852122542e-08, 1.2573578406609377e-08, 1.4844389443385352e-08,
+        1.7581916456637323e-08, 2.089348106423366e-08, 2.4913716636779156e-08,
+        2.981220261055259e-08, 3.5803429973801924e-08, 4.3159872222717046e-08,
+        5.222921507774258e-08, 6.345718596983899e-08, 7.74179661232832e-08,
+        9.485493112514578e-08, 1.1673554689129263e-07, 1.4432579055046485e-07,
+        1.7929168405979103e-07, 2.238387419984248e-07, 2.809048301311559e-07,
+        3.5442884827489113e-07, 4.4972793444809405e-07, 5.740313237919751e-07,
+        7.37242392870762e-07, 9.530362768813506e-07, 1.240456004798027e-06,
+        1.6262572309858223e-06, 2.1483900434142826e-06, 2.8612292046892064e-06,
+        3.843528333275691e-06, 5.210678047650061e-06, 7.133868659957014e-06,
+        9.870513137808483e-06, 1.3813365327003911e-05, 1.957129047687464e-05,
+        2.810478856422634e-05, 4.0958505853238085e-05, 6.0670149691576056e-05,
+        9.150990116188751e-05, 0.00014086016107635964, 0.00022188450660039083,
+        0.0003589104342139791, 0.0005988319700055329, 0.0010367324872368985,
+        0.0018777981957881816, 0.003601393704104081, 0.007452697724296055,
+        0.01719698560451111, 0.047381757556403434, 0.19116831416779587,
+        4.648854588836236, 1.0148348973000396, 2.4314883638592506, 3.0353241977899357,
+        1.6920964131268008, 1.9522090180271434, 3.8167304606320553, 5.585308033029022,
+        3.1379948212739825, 2.8648934740380265, 4.233599946564369, 5.644588871056083,
+        4.917127956107992, 3.108266301201451, 1.7948533785655705, 1.347852881365246,
+        1.2492357300658417, 1.3863639042851583, 1.7967193521557017, 2.1915468592811687,
+        1.7323421120336573, 1.2545621081726568, 1.0320182133175246, 0.9686007088157046,
+        1.025051174560949, 1.2120136466773626, 1.5277918419112784, 1.6801956267380422,
+        1.3982999594694665, 1.1026740630216718, 0.9420507181294638, 0.8871681499958766,
+        0.9180529282826418, 1.0392731490670641, 1.2617555530822964, 1.4935335087285062,
+        1.4455954416426529, 1.193759877155633, 1.0019018125155945, 0.9211985429093559,
+        1.0173198021600358, 1.105973417544652, 1.210709672028973, 1.3104362150475293,
+        1.3644555288338645, 1.3474459952699753, 1.2784077921242056, 1.196815674703627,
+        1.1296910098521158, 1.08748870983375, 1.0719214244072672, 1.0813607209174485,
+        1.1123299020582742, 1.1584274005783142, 1.2079852493913885, 1.2431845005060584,
+        1.2453843154423414, 1.2067152374003738, 1.136026816240504, 1.050927217428943,
+        0.9663813302846318, 0.8904975450657662, 0.8260115239191601, 0.7728528222139679,
+        0.7298945002871887, 0.6958316539141566, 0.6695397084779836, 0.6501812763601246,
+        0.6372075102367346, 0.6303234167941966, 0.6294472796593191, 0.6346747530848248,
+        0.6462476778863331, 0.6645207440478618, 0.6899127561042774, 0.7228217117070043,
+        0.7634742976364943, 0.8116756117631811, 0.8664394896613682, 0.9255452937889714,
+        0.985215622042453, 1.0402975803975587, 1.0853212770850826, 1.1162846876093901,
+        1.1321882371458638, 1.1352231819908842, 1.129555430378369, 1.1196831774669482,
+        1.1092918638683604, 1.100830176010428, 1.0955627518451085, 1.0938060674815406,
+        1.0951823038814819, 1.098843238808627, 1.1036738654016462, 1.1084952355025064,
+        1.112267935314588, 1.1142706251822927, 1.1142119476407437, 1.1122430998460966,
+        1.1088700572398391, 1.1047991154361592, 1.1007659686307734, 1.0973913455214623,
+        1.095085923044525, 1.094008228323555, 1.0940689529651006, 1.0949726231181927,
+        1.0962879965098709, 1.097537553156101, 1.098292709676563, 1.0982570998069072,
+        1.0973195718857023, 1.0955644636102706, 1.0932382562031628, 1.090683965236095,
+        1.0882620615404845, 1.0862769731524977, 1.084923047887166, 1.08425695028658,
+        1.084197670691088, 1.0845514024782872, 1.0850557526397637, 1.0854351861108156,
+        1.085457261488426, 1.0849781726625451, 1.0839677425574632, 1.082508750086184,
+        1.0807720573316861, 1.0789750116506551, 1.07733386431958, 1.0760207965564477,
+        1.0751334624165212, 1.0746812922957558, 1.0745893485313858, 1.0747177236872572,
+        1.074892238976511, 1.0749404374467977, 1.0747258086242255, 1.0741733430095308,
+        1.0732812856916896, 1.0721171508646348, 1.0707997933288553, 1.0694724103882038,
+        1.0682728660381586, 1.0673074931058066, 1.0666329946434365, 1.0662489514412443,
+        1.0661013323574904, 1.066095588399889, 1.0661164713036404, 1.066050707071779,
+        1.0658082150753765, 1.0653378812576457, 1.0646350471169554, 1.0637396829249117,
+        1.0627262237751511, 1.0616877057113936, 1.0607177279677407, 1.05989376705466,
+        1.0592646528543674, 1.0588439121390785, 1.058609504438852, 1.0585094247842621,
+        1.0584718231836794, 1.0584177291926034, 1.05827420099972, 1.05798577594019,
+        1.0575224941932917, 1.0568834477601157, 1.0560956411219176, 1.055208753704953,
+        1.0542869907946457, 1.0533994925786745, 1.0526107354457377, 1.0519720878855687,
+        1.051515300643157, 1.0512483353241546, 1.0511536444126646, 1.051188833607283,
+        1.0512895454158089, 1.051374355777156, 1.0513514216414799, 1.0511265176764526,
+        1.0506119418518944, 1.049735574417033, 1.04844919732658, 1.0467350945951432,
+        1.0446100242439156, 1.042125908977283, 1.0393670085604376, 1.0364438300552965,
+        1.0334844903485862, 1.0306245657402524, 1.0279965864953595, 1.025720260233534,
+        1.0238942865688865, 1.0225903303706814, 1.02184942223063, 1.0216807992387733,
+        1.0220630061146394, 1.0229469435481366, 1.0242604643239213, 1.025914065835665,
+        1.027807203876829, 1.0298347581282281, 1.0318932183234932, 1.033886232284377,
+        1.0357292553118753, 1.037353148545984, 1.038706670935162, 1.0397578774237266,
+        1.0404944670950702, 1.0409231257452296, 1.0410678959998814, 1.0409676078873613,
+        1.0406724324589625, 1.0402396873308541, 1.0397291177932824, 1.0391979802533662,
+        1.0386963405988503, 1.0382630448407422, 1.0379228065556738, 1.0376847780982619,
+        1.037542832412132, 1.037477590215846, 1.0374600026436698, 1.0374560706988878,
+        1.0374320874789953, 1.037359668765666, 1.0372198288725594, 1.0370054806431797,
+        1.0367219818916584, 1.0363856747906561, 1.0360207059092312, 1.0356547028722367,
+        1.0353140623824046, 1.0350196442327277, 1.0347835683712592, 1.034607603437766,
+        1.0344833565302114, 1.0343941715065614, 1.0343183625388708, 1.0342331928882138,
+        1.0341188911512569, 1.033962001542189, 1.0337574949021184, 1.0335093024133113,
+        1.0332292301087924, 1.0329345099406353, 1.0326444828095966, 1.0323770457460506,
+        1.032145509167629, 1.0319564069125222, 1.031808608553984, 1.031693839549042,
+        1.0315984632761395, 1.0315061612463199, 1.0314009987832433, 1.0312703080692414,
+        1.031106868737799, 1.0309100098046187, 1.030685468243054, 1.0304440768154624,
+        1.0301995692934403, 1.0299659432353139, 1.0297548827313543, 1.029573709674945,
+        1.0294242148112258, 1.029302545517081, 1.0292001296640294, 1.0291054289047243,
+        1.029006171623378, 1.0288916393937102, 1.0287545838002383, 1.0285924316924755,
+        1.0284075803352186, 1.0282067609302532, 1.0279996242681506, 1.0277968416004633,
+        1.0276080917803943, 1.0274403107132521, 1.027296514564453, 1.0271753899766995,
+        1.0270716968967404, 1.0269773799095048, 1.0268831584437519, 1.0267802861670272,
+        1.0266621486126835, 1.0265254084759223, 1.0263705015790126, 1.0262014144727893,
+        1.0260248115363215, 1.0258486984978636, 1.0256808882925101, 1.0255275609374794,
+        1.0253921796123031, 1.0252749488468251, 1.0251728939676585, 1.0250805242887309,
+        1.0249909370561303, 1.0248971432052043, 1.024793362351489, 1.0246760482821273,
+        1.024544464009035, 1.02440071539, 1.0242492565090449, 1.0240959780695664,
+        1.0239470634684342, 1.023807833097081, 1.0236817908009461, 1.0235700406735058,
+        1.0234711677833344, 1.0233815878507464, 1.0232962847708145, 1.023209786528063,
+        1.0231171911993042, 1.023015051662209, 1.022901960029699, 1.02277873383852,
+        1.022648183419696, 1.022514518527201, 1.0223825172443632, 1.0222566196852207,
+        1.0221401167510804, 1.0220345802034414, 1.02193963044858, 1.0218530729166935,
+        1.0217713652234948, 1.0216903178931818, 1.0216058916943809, 1.0215149412277449,
+        1.021415769074009, 1.0213083941486603, 1.0211944939404065, 1.0210770420557465,
+        1.0209597181627381, 1.0208462067958401, 1.0207395178432055, 1.0206414528205654,
+        1.0205523099222251, 1.0204708739386863, 1.0203946835537594, 1.0203205181659107,
+        1.0202450081679932, 1.020165253091804, 1.020079334204513, 1.019986631059487,
+        1.019887890376275, 1.0197850427969528, 1.0196808095097165, 1.0195781778304709,
+        1.0194798460570782, 1.0193877399682922, 1.0193026866401307, 1.01922429960263,
+        1.0191510890751765, 1.0190807696698605, 1.01901070299806, 1.0189383901295863,
+        1.0188619225183115, 1.0187803105114284, 1.018693633509417, 1.01860299024512,
+        1.0185102648773137, 1.018417757688006, 1.0183277521846086, 1.0182420994907928,
+        1.018161894950146, 1.0180873025425123, 1.0180175540364576, 1.0179511172800002,
+        1.0178859976293375, 1.017820113606139, 1.0177516763319072, 1.017679503849995,
+        1.0176032154475625, 1.017523274618563, 1.0174408777872326, 1.0173577139742846,
+        1.0172756431248235, 1.0171963539146254, 1.0171210634844492, 1.0170503118636367,
+        1.0169838850113346, 1.0169208761433048, 1.0168598698522109, 1.016799211982902,
+        1.016737314015396, 1.0166729361413123, 1.0166053988227484, 1.0165346870790952,
+        1.0164614321818248, 1.01638677796664, 1.0163121594547224, 1.0162390362811318,
+        1.0161686300968271, 1.016101712747135, 1.0160384813969952, 1.0159785400745507,
+        1.0159209875237027, 1.0158645923582987, 1.0158080216106484, 1.0157500803663289,
+        1.0156899195549907, 1.0156271759900362, 1.0155620219283985, 1.0154951182120169,
+        1.0154274823413678, 1.0153602975204659, 1.0152946982823599, 1.0152315712455673,
+        1.0151714055950871, 1.015114217985662, 1.0150595626877794, 1.0150066225111556,
+        1.0149543620599448, 1.014901714585489, 1.0148477687700155, 1.0147919228760536,
+        1.0147339804378719, 1.0146741726855546, 1.0146131061097203, 1.0145516466089044,
+        1.014490762249136, 1.0144313530581694, 1.0143740975335747, 1.0143193416534244,
+        1.0142670480164875, 1.0142168118742223, 1.0141679392061498, 1.0141195716325435,
+        1.014070835557501, 1.0140209896248848, 1.013969545751636, 1.0139163443002108,
+        1.0138615723100035, 1.0138057235943214, 1.013749509200212, 1.013693734611356,
+        1.013639164917982, 1.0135864003251915, 1.0135357818140813, 1.0134873411139285,
+        1.0134408014668443, 1.0133956273130384, 1.0133511133711472, 1.0133064978146022,
+        1.013261081163658, 1.0132143324560337, 1.0131659670569768, 1.0131159855107137,
+        1.013064669189326, 1.0130125350919772, 1.0129602579548742, 1.012908572027673,
+        1.0128581669527235, 1.0128095920245197, 1.0127631809408764, 1.0127190055022441,
+        1.0126768622608238, 1.0126362915965876, 1.0125966247554123, 1.0125570515057047,
+        1.0125166995088433, 1.0124747162753696, 1.0124303455075985, 1.0123829913800868,
+        1.0123322664834509, 1.0122780213660356, 1.0122203555390188, 1.0121596112667761,
+        1.0120963523810256, 1.0120313307861715, 1.0119654433980498, 1.0118996821497117,
+        1.0118350795634443, 1.01177265233794, 1.011713345472463, 1.0116579796123044,
+        1.0116072044621591, 1.0115614611575277, 1.011520956296254, 1.0114856498356606,
+        1.0114552582381666, 1.0114292731491346, 1.011406994625262, 1.0113875766542957,
+        1.011370081584156, 1.0113535392662238, 1.0113370063231244, 1.0113196210270397,
+        1.0113006498024004, 1.0112795222669415, 1.0112558528719051, 1.0112294484460633,
+        1.011200302143819, 1.0111685753223516, 1.011134569646443, 1.0110986922073226,
+        1.0110614166518015, 1.0110232432907418, 1.0109846609471378, 1.0109461129702753,
+        1.010907969428111, 1.010870507019727, 1.0108338977334506, 1.0107982067094627,
+        1.0107633991491363, 1.010729355455872, 1.0106958931268348, 1.0106627932963503,
+        1.0106298293352076, 1.0105967946181347, 1.0105635265588737, 1.0105299243256716,
+        1.0104959582953967, 1.0104616702347924, 1.0104271643144673, 1.0103925902247441,
+        1.0103581207091077, 1.0103239266014594, 1.010290152817978, 1.0102568986387623,
+        1.010224205015357, 1.010192050630428, 1.0101603571561912, 1.010129002797746,
+        1.0100978419743416, 1.0100667280792595, 1.010035535814354, 1.0100041796929895,
+        1.0099726259329023, 1.0099408960219824, 1.0099090615652713, 1.0098772313989006,
+        1.009845533164189, 1.0098140923790508, 1.0097830123904432, 1.0097523583889068,
+        1.0097221479535534, 1.009692349494928, 1.0096628886593944, 1.0096336614676342,
+        1.009604551893246, 1.00957545091627, 1.0095462739141485, 1.0095169735982465,
+        1.0094875465004771, 1.0094580321207294, 1.0094285050724943, 1.0093990617051756,
+        1.009369803550244, 1.0093408203975256, 1.0093121757914734, 1.009283897260692,
+        1.0092559727486425, 1.0092283536494613, 1.0092009637530548, 1.009173712451113,
+        1.009146509904087, 1.0091192816173655, 1.009091980051986, 1.0090645914588792,
+        1.0090371369691529, 1.0090096679483127, 1.008982256562876, 1.0089549832599445,
+        1.0089279233063593, 1.00890113461175, 1.0088746487703089, 1.0088484666613353,
+        1.0088225591580877, 1.0087968726456145, 1.0087713382824668, 1.0087458833795961,
+        1.0087204429949272, 1.0086949698860053, 1.0086694413037094, 1.0086438616780893,
+        1.008618260940517, 1.0085926889263097, 1.0085672068965443, 1.0085418776178254,
+        1.0085167555913244, 1.00849187891824, 1.008467263959823, 1.0084429034621605,
+        1.0084187682558905, 1.0083948121006747, 1.0083709788055368, 1.0083472104785114,
+        1.0083234556719642, 1.008299676289989, 1.008275852380035, 1.0082519842889792,
+        1.0082280920611348, 1.0082042123297674, 1.0081803932527682, 1.0081566882343376,
+        1.008133149244779, 1.0081098205088295, 1.008086733202524, 1.008063901613851,
+        1.0080413210188588, 1.008018967333537, 1.0079967984453178, 1.0079747570158415,
+        1.0079527744788317, 1.0079307759237408, 1.0079086855441757, 1.0078864323267709,
+        1.0078639556522822, 1.0078412104735286, 1.0078181717290617, 1.0077948376559696,
+        1.0077712316926482, 1.007747402722222, 1.00772342350529, 1.0076993872845506,
+        1.0076754027029355, 1.0076515873437755, 1.007628060353596, 1.0076049347229126,
+        1.00758230985846, 1.007560265070065, 1.007538854515095, 1.007518104001882,
+        1.0074980098690078, 1.0074785399544077, 1.0074596364737045, 1.007441220465719,
+        1.0074231973526855, 1.0074054631129128, 1.0073879105734067, 1.00737043538928,
+        1.0073529413691387, 1.0073353449112916, 1.007317578415729, 1.0072995926181911,
+        1.0072813578471334, 1.0072628642340162, 1.007244120918852, 1.007225154298755,
+        1.0072060053798815, 1.0071867263229197, 1.0071673763233773, 1.0071480170372837,
+        1.0071287078401763, 1.0071095012759543, 1.0070904390942836, 1.0070715492732072,
+        1.007052844367161, 1.007034321406848, 1.0070159634154887, 1.0069977424144798,
+        1.0069796235971387, 1.0069615701825327, 1.0069435483509976, 1.0069255316311305,
+        1.006907504165176, 1.0068894624227527, 1.0068714151441769, 1.0068533815446021,
+        1.006835388061133, 1.0068174641386693, 1.0067996376911406, 1.0067819309204826,
+        1.006764357116453, 1.0067469189049811, 1.0067296081845694, 1.0067124077252194,
+        1.0066952941449414, 1.006678241766245, 1.0066612267237394, 1.0066442306645997,
+        1.0066272434604808, 1.0066102645192392, 1.0065933025189604, 1.0065763736461648,
+        1.0065594986620447, 1.0065426993052664, 1.0065259946377163, 1.006509397935582,
+        1.006492914624633, 1.0064765415743933, 1.0064602678329362, 1.00644407664259,
+        1.0064279483667549, 1.0064118638146862, 1.006395807396801, 1.0063797695853278,
+        1.0063637482849603, 1.0063477489116466, 1.0063317832008594, 1.006315866980954,
+        1.0063000173166314, 1.0062842495240218, 1.006268574567941, 1.0062529972736909,
+        1.0062375156359151, 1.006222121312609, 1.0062068011877208, 1.0061915397061327,
+        1.0061763215604551, 1.006161134259711, 1.006145970142697, 1.0061308275056136,
+        1.006115710674378, 1.0061006290381458, 1.0060855952386776, 1.0060706228506464,
+        1.0060557239665433, 1.0060409071054728, 1.0060261757978424, 1.0060115280719406,
+        1.0059969569063367, 1.0059824515434121, 1.005967999413032, 1.0059535883165638,
+        1.0059392084857197, 1.005924854162716, 1.0059105244409783, 1.0058962232406865,
+        1.0058819584472778, 1.0058677403854528, 1.0058535799121227, 1.0058394864702225,
+        1.0058254664428712, 1.0058115220859731, 1.0057976512090367, 1.0057838476392889,
+        1.0057701023666545, 1.0057564051515273, 1.00574274630239, 1.0057291183087933,
+        1.0057155170489387, 1.0057019423729574, 1.0056883979772386, 1.005674890611262,
+        1.0056614287736991, 1.0056480211394623, 1.0056346749997869, 1.0056213949874637,
+        1.0056081823020808, 1.005595034556944, 1.0055819462573206, 1.005568909809079,
+        1.0055559168667585, 1.0055429597759584, 1.0055300328551553, 1.0055171332970376,
+        1.0055042615420626, 1.0054914210733161, 1.0054786176844106, 1.0054658583631157,
+        1.0054531499967017, 1.005440498130723, 1.0054279059972617, 1.0054153739756246,
+        1.0054028995683164, 1.005390477882555, 1.0053781025192705, 1.0053657667027747,
+        1.0053534644465094, 1.0053411915494574, 1.0053289462530304, 1.0053167294521266,
+        1.0053045444351736, 1.0052923962111686, 1.0052802905524436, 1.0052682329284932,
+        1.0052562275204937, 1.0052442764871083, 1.0052323796036395, 1.0052205343279643,
+        1.005208736270654, 1.0051969799763907, 1.005185259871896, 1.0051735712101637,
+        1.0051619108459806, 1.0051502777115686, 1.0051386729170861, 1.005127099468309,
+        1.0051155616609433, 1.0051040642659324, 1.0050926116536432, 1.0050812070114792,
+        1.0050698517890762, 1.0050585454618552, 1.005047285645736, 1.0050360685334603,
+        1.0050248895678449, 1.0050137442279892, 1.005002628788183, 1.0049915409178625,
+        1.0049804800220612, 1.0049694472700816, 1.0049584453156473, 1.004947477765746,
+        1.0049365484974981, 1.0049256609463275, 1.0049148174903189, 1.0049040190354745,
+        1.004893264868828, 1.0048825527977567, 1.0048718795435985, 1.0048612413141549,
+        1.004850634450569, 1.0048400560339985, 1.0048295043475204, 1.0048189791168056,
+        1.0048084814935476, 1.0047980137914627, 1.0047875790274006, 1.004777180352444,
+        1.0047668204748412, 1.004756501175242, 1.004746222995854, 1.004735985152918,
+        1.00472578568164, 1.004715621782321, 1.0047054903022554, 1.0046953882663356,
+        1.0046853133630813, 1.0046752643032668, 1.0046652409923602, 1.0046552444919814,
+        1.0046452767826457, 1.0046353403740385, 1.0046254378342407, 1.004615571321195,
+        1.0046057421972598, 1.004595950790989, 1.0045861963433178, 1.0045764771424677,
+        1.0045667908193712, 1.0045571347485573, 1.0045475064828546, 1.0045379041464138,
+        1.004528326719705, 1.0045187741706365, 1.0045092474133388, 1.0044997481062796,
+        1.0044902783285299, 1.004480840192568, 1.0044714354614719, 1.0044620652354679,
+        1.0044527297593993, 1.0044434283805839, 1.004434159660202, 1.0044249216152585,
+        1.0044157120466266, 1.0044065288954678, 1.0043973705670277, 1.0043882361681657,
+        1.0043791256209147, 1.0043700396363229, 1.0043609795567021, 1.0043519470962805,
+        1.0043429440262497, 1.004333971858342, 1.0043250315794774, 1.0043161234803084,
+        1.0043072471033527, 1.0042984013161789, 1.0042895844940014, 1.004280794778814,
+        1.0042720303704298, 1.0042632898010404, 1.004254572149048, 1.0042458771592135,
+        1.004237205252291, 1.0042285574257905, 1.0042199350647727, 1.0042113396954917,
+        1.0042027727225944, 1.0041942351918653, 1.0041857276149375, 1.0041772498815515,
+        1.0041688012702126, 1.004160380552681, 1.0041519861733927], [1.167970921382559e-13,
+        3.5102383601331975e-13, 5.871542429223121e-13, 8.264773008472775e-13,
+        1.0703120789518248e-12, 1.3200203975184062e-12, 1.5770199756862047e-12,
+        1.8427984561664425e-12, 2.1189283476729903e-12, 2.407083183717392e-12,
+        2.70905511837165e-12, 3.026774241184049e-12, 3.3623298791488603e-12,
+        3.717994282036797e-12, 4.096249023751104e-12, 4.499814609244754e-12,
+        4.931683766676078e-12, 5.395159020864565e-12, 5.893895234132205e-12,
+        6.431947866102846e-12, 7.013827913591316e-12, 7.644564523788678e-12,
+        8.329776562530056e-12, 9.075754553037403e-12, 9.8895546697588e-12,
+        1.0779106752274603e-11, 1.1753338683457753e-11, 1.2822319812527402e-11,
+        1.399742668087117e-11, 1.52915347851281e-11, 1.6719240941664334e-11,
+        1.8297121467062605e-11, 2.0044032572274115e-11, 2.1981460398927636e-11,
+        2.4133929693085324e-11, 2.6529481722742057e-11, 2.920023426052937e-11,
+        3.2183038844885226e-11, 3.5520253764200336e-11, 3.926065474073991e-11,
+        4.346051005632508e-11, 4.818485215533133e-11, 5.350898480199303e-11,
+        5.95202729033738e-11, 6.632027263391793e-11, 7.402727159443106e-11,
+        8.277932504011773e-11, 9.273789225980155e-11, 1.0409220246323143e-10,
+        1.1706450766922195e-10, 1.319164182492654e-10, 1.4895656238951802e-10,
+        1.68549868552845e-10, 1.9112884342605023e-10, 2.1720730913618935e-10,
+        2.4739717956849833e-10, 2.8242900383543443e-10, 3.2317719059186774e-10,
+        3.7069106795227355e-10, 4.262332382813046e-10, 4.913270809947099e-10,
+        5.678157635497804e-10, 6.579357758176476e-10, 7.644088539198416e-10,
+        8.905572681288269e-10, 1.0404488997051712e-09, 1.2190804330783195e-09,
+        1.4326094992171442e-09, 1.688649927417857e-09, 1.996648673060338e-09,
+        2.36836888245495e-09, 2.8185114573683053e-09, 3.365518132077784e-09,
+        4.032613482881055e-09, 4.849162918897301e-09, 5.852450521582491e-09,
+        7.090017522768565e-09, 8.62275321793634e-09, 1.0529001106133432e-08,
+        1.2910042399576497e-08, 1.5897458875740975e-08, 1.966307533577762e-08,
+        2.443246484948679e-08, 3.0503406553897425e-08, 3.82712745798905e-08,
+        4.826419577906423e-08, 6.11920779723549e-08, 7.801548594412745e-08,
+        1.0004315054571659e-07, 1.290711414143622e-07, 1.6758321398186932e-07,
+        2.1904184225012798e-07, 2.883150533790008e-07, 3.823088240921848e-07,
+        5.109142142807453e-07, 6.884423210679879e-07, 9.358252639779532e-07,
+        1.2840370975540945e-06, 1.7794871077289083e-06, 2.4926547298993587e-06,
+        3.5321477565151617e-06, 5.068011921821935e-06, 7.371162557809278e-06,
+        1.0881582342528037e-05, 1.632921037885996e-05, 2.49542306752802e-05,
+        3.892122711364742e-05, 6.212615237155852e-05, 0.00010183520355758966,
+        0.00017217968336903145, 0.00030205860966374626, 0.0005543456285328763,
+        0.0010770605595605142, 0.0022574306991721754, 0.005273883053374681,
+        0.014704497134078098, 0.05999527478632855, 1.4740080690114064, 0.3246691154115971,
+        0.783493288143344, 0.9826595465353132, 0.5484184709815931, 0.6301236790473702,
+        1.2170228181246951, 1.7361908570639608, 0.9281537607932921, 0.7644171446179899,
+        0.8479573295895876, 1.22173310674817, 2.028417788946721, 1.6876351250632744,
+        1.164196983953763, 0.9977398537693069, 1.02750801582723, 1.244960941492091,
+        1.7397967357120594, 2.267183539345813, 1.9009635602121306, 1.451960425295003,
+        1.2538561994400503, 1.2306073100591786, 1.3574155662225307, 1.6682094954551325,
+        2.1803685560875468, 2.481005495654012, 2.132352234057897, 1.733707404287133,
+        1.5248552266098687, 1.4764079889435486, 1.5688816979841043, 1.8217886903186251,
+        2.2664947477546806, 2.746675833771576, 2.7194800453871384, 2.2954337164041902,
+        1.9677446179457152, 1.8467246338048073, 1.7854302693843311, 1.7955235707581079,
+        1.8713515883430303, 1.9524876365138624, 1.974056166797651, 1.9022647100490826,
+        1.767400632713955, 1.6247179661631528, 1.509129732469678, 1.4320645257947606,
+        1.3934651086591188, 1.3893898113003582, 1.4140181373645502, 1.4582893346578616,
+        1.5070428196596422, 1.5380945456373774, 1.528954155817484, 1.4708582618470214,
+        1.3754234792790945, 1.2644109253610496, 1.1558453947264398, 1.0591848120194158,
+        0.9773529261422903, 0.9099444155906804, 0.8553557110612467, 0.811831469538337,
+        0.7778773406402539, 0.7523724349520153, 0.734559141722879, 0.7239933311849812,
+        0.7204901328956377, 0.7240770969469056, 0.7349543365726705, 0.753453481354641,
+        0.7799803194389109, 0.8149178592802674, 0.8584573357387459, 0.9103198870336856,
+        0.9693485088245299, 1.033023140172021, 1.09711601619496, 1.1559096275160403,
+        1.2033828861945286, 1.2351852432085924, 1.2503111248349863, 1.2512733475640079,
+        1.2427325623242236, 1.2296763293412352, 1.2161638492737954, 1.204872449423348,
+        1.1971684463287824, 1.1933760331782508, 1.1930623047658122, 1.1952864328475954,
+        1.1988242069622455, 1.2023895830735787, 1.2048549988981943, 1.2054429883916977,
+        1.2038444624298936, 1.2002291245013712, 1.1951479005335515, 1.189364497920152,
+        1.183670579237874, 1.178730772138535, 1.1749815535070895, 1.172587501021994,
+        1.17144740956491, 1.1712402208240902, 1.1715012847365867, 1.1717184958715459,
+        1.1714339561611025, 1.1703323591515826, 1.1682966868246845, 1.16541821943867,
+        1.161960193427164, 1.158287435991341, 1.154782092680923, 1.151765695120348,
+        1.1494422079475342, 1.1478693001249025, 1.1469589229857802, 1.1465041389877224,
+        1.1462262270432442, 1.1458334263258299, 1.145080262979467, 1.143815366394609,
+        1.1420074624944294, 1.1397442638547404, 1.137205924110991, 1.134621023866494,
+        1.132216442225206, 1.1301722513413288, 1.1285899043427432, 1.1274781061597394,
+        1.1267571221313744, 1.126279346232357, 1.1258616263125392, 1.1253230214319103,
+        1.1245205881700517, 1.1233759926677513, 1.1218876237392048, 1.1201262358854276,
+        1.118216054464998, 1.1163064761973656, 1.114541060324783, 1.1130302333407949,
+        1.1118325077295255, 1.1109467964161188, 1.1103162000943443, 1.1098417554367368,
+        1.1094031408295377, 1.1088822970454835, 1.1081854770300135, 1.1072595839246246,
+        1.106099866864247, 1.104747928302196, 1.103281085023932, 1.1017958415996094,
+        1.100389147658983, 1.099141098716698, 1.0981019879431186, 1.097285463707557,
+        1.0966683207570966, 1.0961963646401192, 1.0957949376883767, 1.0953821182777426,
+        1.0948823325340726, 1.0942381831138965, 1.0934187133785238, 1.0924230325633713,
+        1.0912790917392494, 1.0900382305105087, 1.08876672837843, 1.0875358835673514,
+        1.086412101639337, 1.0854481923376331, 1.0846766757343744, 1.0841055099918706,
+        1.0837163521482613, 1.0834652757359888, 1.0832857747043538, 1.0830938351241541,
+        1.0827948013661715, 1.0822916614563605, 1.0814942141275727, 1.080328380317449,
+        1.078744740741333, 1.0767252938447913, 1.0742875024026375, 1.0714849622804465,
+        1.0684044552935823, 1.0651596550940308, 1.0618822251116682, 1.058711375092703,
+        1.055783067208823, 1.0532199845690777, 1.0511231457399792, 1.0495657446654152,
+        1.04858948796537, 1.048203439213339, 1.048385181937354, 1.0490839769717872,
+        1.0502255019841735, 1.051717708491642, 1.053457308174678, 1.0553364067607174,
+        1.0572488440047607, 1.0590958729082007, 1.0607909124922699, 1.0622632194945845,
+        1.0634604238530891, 1.064349942420024, 1.064919317120719, 1.065175524393641,
+        1.0651432910007708, 1.0648624509885867, 1.0643844088394563, 1.0637678415025675,
+        1.0630738686798777, 1.06236102583747, 1.0616804616890554, 1.0610718271249657,
+        1.0605603088832576, 1.0601551815175723, 1.0598501076685456, 1.059625220294084,
+        1.0594507910946278, 1.0592920561432073, 1.0591145708076564, 1.0588893439533782,
+        1.0585969933974242, 1.0582302899138996, 1.057794706090603, 1.057306917442157,
+        1.0567915511973607, 1.056276771789172, 1.0557894736903937, 1.0553508920577936,
+        1.0549733413295255, 1.0546585785242109, 1.0543980035080418, 1.0541746001074193,
+        1.0539662361900688, 1.0537497204363937, 1.0535048942303402, 1.053218042210725,
+        1.052884038242188, 1.0525068836988585, 1.052098596751374, 1.051676714406018,
+        1.0512609127108055, 1.0508693892791905, 1.0505156656581327, 1.0502063614254962,
+        1.0499402948428056, 1.049709016399647, 1.049498625672046, 1.0492925005632852,
+        1.0490744168029966, 1.0488314797019966, 1.0485563397496627, 1.048248310094671,
+        1.047913219288961, 1.047562074026069, 1.047208825590763, 1.0468676880035581,
+        1.0465505187272244, 1.046264737994683, 1.0460121432573404, 1.045788797906708,
+        1.0455859725619219, 1.0453919283041295, 1.0451941860681948, 1.0449818490917069,
+        1.0447475487062794, 1.0444886665340123, 1.044207631987728, 1.0439112738138159,
+        1.0436093823554944, 1.043312780519607, 1.0430312803354513, 1.0427719067948813,
+        1.0425377048510571, 1.0423273253083254, 1.0421354354013528, 1.0419538479626056,
+        1.041773135808844, 1.0415844169426398, 1.0413809747952765, 1.0411594189241584,
+        1.0409201866488893, 1.0406673159967823, 1.0404075591722817, 1.0401490264299893,
+        1.0398996301901648, 1.0396656251853804, 1.0394505103488467, 1.039254480674649,
+        1.0390745089765159, 1.0389050191964047, 1.038739006057256, 1.0385693789822625,
+        1.0383902742535718, 1.038198093559535, 1.0379920857667877, 1.0377743799697638,
+        1.0375494834511512, 1.0373233574994305, 1.0371022583178338, 1.0368915664885028,
+        1.036694821634697, 1.0365131324754004, 1.036345056865633, 1.0361869566813058,
+        1.0360337452210286, 1.0358798756477072, 1.0357203797482726, 1.0355517632722744,
+        1.0353725970048577, 1.0351837045552774, 1.034987926219929, 1.034789517875748,
+        1.034593309544797, 1.034403788173008, 1.0342242769194465, 1.0340563588887406,
+        1.0338996427218792, 1.0337519011434668, 1.0336095440625275, 1.0334683277523276,
+        1.033324161500773, 1.0331738596219748, 1.033015701625537, 1.032849703182236,
+        1.0326775572262035, 1.0325022669842008, 1.0323275489998396, 1.0321571239883713,
+        1.031994029844811, 1.0318400822567872, 1.0316955768680582, 1.0315592794900554,
+        1.031428696686507, 1.0313005681522476, 1.031171483714417, 1.0310385080902014,
+        1.0308996987872827, 1.030754425736499, 1.030603440561818, 1.030448691076979,
+        1.0302929235244518, 1.0301391525372634, 1.029990100214249, 1.0298477077375594,
+        1.029712806051954, 1.0295850001219866, 1.0294627805719543, 1.0293438347452089,
+        1.0292254939273024, 1.0291052307921578, 1.0289811147646641, 1.0288521436339373,
+        1.0287183949757885, 1.028580975700278, 1.0284417856362977, 1.02830314447277,
+        1.028167354591569, 1.0280362814709985, 1.0279110272932388, 1.0277917538551924,
+        1.027677681915217, 1.0275672612719202, 1.0274584751861926, 1.0273492196475027,
+        1.0272376863565724, 1.0271226798968718, 1.0270038137213726, 1.0268815533431657,
+        1.026757103867313, 1.0266321673192715, 1.026508617957528, 1.0263881569578794,
+        1.0262720094846356, 1.0261607173692573, 1.026054061599836, 1.025951124339322,
+        1.0258504748058606, 1.0257504416181191, 1.0256494198876056, 1.0255461567486668,
+        1.0254399646862855, 1.0253308266176384, 1.0252193773044147, 1.0251067683990323,
+        1.0249944450824253, 1.0248838771744637, 1.0247762943102015, 1.0246724723772664,
+        1.0245726076745993, 1.024476298404481, 1.0243826333608754, 1.0242903686231144,
+        1.024198158046883, 1.0241047948844582, 1.0240094212506252, 1.0239116692430603,
+        1.0238117108206004, 1.0237102104748197, 1.0236081921594402, 1.023506846745336,
+        1.0234073159077017, 1.023310491307115, 1.0232168639278796, 1.0231264484542366,
+        1.0230387935726029, 1.0229530736803045, 1.0228682433934606, 1.0227832258832161,
+        1.0226971011067496, 1.0226092611176507, 1.022519506441755, 1.0224280686089335,
+        1.0223355572528758, 1.0222428433234962, 1.022150900621039, 1.0220606342963212,
+        1.0219727262206864, 1.0218875232027955, 1.0218049858007212, 1.0217247045291034,
+        1.0216459785633039, 1.021567941610392, 1.0214897121655375, 1.021410542042975,
+        1.0213299382674466, 1.0212477387530225, 1.0211641306187662, 1.0210796099506574,
+        1.0209948915790967, 1.0209107853782564, 1.020828060467815, 1.0207473198483916,
+        1.0206689054220766, 1.020592847649534, 1.020518866361721, 1.0204464208317126,
+        1.0203747995060646, 1.0203032339839655, 1.020231018733209, 1.0201576179790026,
+        1.0200827440222346, 1.0200063963226187, 1.0199288570810903, 1.0198506456981575,
+        1.0197724403305701, 1.0196949789904615, 1.0196189547230077, 1.019544919235612,
+        1.0194732071686918, 1.0194038895164286, 1.0193367602203265, 1.0192713554035873,
+        1.019207000746765, 1.019142879608753, 1.019078112927406, 1.019011841711049,
+        1.0189433038685618, 1.0188718988893453, 1.018797236073528, 1.018719164236553,
+        1.0186377827560376, 1.0185534352940806, 1.0184666884504177, 1.0183782980329272,
+        1.018289165706688, 1.0182002886730566, 1.0181127048944183, 1.0180274363292192,
+        1.0179454327148327, 1.0178675185988042, 1.017794346481881, 1.017726358979491,
+        1.0176637627187275, 1.0176065161878234, 1.0175543329271706, 1.0175067003450906,
+        1.0174629131684794, 1.017422119253545, 1.0173833743529175, 1.0173457016178,
+        1.017308151217906, 1.0172698555387327, 1.0172300759474202, 1.0171882380244868,
+        1.0171439533126452, 1.0170970268853023, 1.0170474512399241, 1.0169953880519182,
+        1.0169411401025206, 1.016885116184308, 1.0168277919985458, 1.0167696700307898,
+        1.0167112411806924, 1.016652950585858, 1.0165951696625886, 1.0165381759130723,
+        1.016482141529311, 1.016427131253918, 1.016373109337966, 1.0163199547748993,
+        1.0162674833207515, 1.016215474189008, 1.0161636988096243, 1.0161119487484673,
+        1.0160600598710217, 1.01600793014966, 1.015955529163048, 1.0159028982718268,
+        1.0158501415779042, 1.0157974089444204, 1.015744873405422, 1.0156927060685108,
+        1.0156410519798158, 1.0155900103038853, 1.0155396215684716, 1.0154898637085905,
+        1.0154406573577626, 1.0153918794667083, 1.0153433830903897, 1.015295020267561,
+        1.0152466644704388, 1.0151982292008475, 1.015149679940561, 1.0151010377309013,
+        1.015052373988849, 1.0150037975514288, 1.0149554361535318, 1.0149074153922812,
+        1.0148598385789074, 1.0148127706750143, 1.0147662287934307, 1.014720180637112,
+        1.0146745509391826, 1.0146292346697552, 1.0145841147034473, 1.0145390809674089,
+        1.0144940479168338, 1.0144489675326678, 1.0144038358368463, 1.0143586920321408,
+        1.0143136106064548, 1.0142686878879141, 1.014224025409786, 1.0141797129052719,
+        1.014135813735378, 1.0140923550738652, 1.0140493243236903, 1.0140066721700887,
+        1.013964321570539, 1.0139221810248522, 1.013880159814254, 1.013838182645575,
+        1.0137962013148738, 1.0137542015714358, 1.0137122042106161, 1.0136702604040875,
+        1.0136284422208512, 1.013586830047873, 1.013545499067053, 1.013504507023111,
+        1.0134638852258198, 1.0134236341324276, 1.0133837240618153, 1.0133441007392219,
+        1.013304694601194, 1.013265432226446, 1.0132262479823924, 1.0131870940215357,
+        1.0131479471040847, 1.0131088112939886, 1.0130697162718378, 1.0130307117111519,
+        1.0129918587616757, 1.012953220085015, 1.0129148500409755, 1.012876786518194,
+        1.0128390455720824, 1.0128016195428997, 1.012764478764277, 1.0127275764298769,
+        1.0126908557452714, 1.0126542582134013, 1.0126177318146428, 1.0125812379430625,
+        1.0125447562174563, 1.0125082866453528, 1.0124718490171951, 1.0124354797835784,
+        1.0123992269687054, 1.0123631438651712, 1.012327282325645, 1.0122916864251124,
+        1.0122563871362737, 1.0122213984751505, 1.0121867153694544, 1.012152313310151,
+        1.012118149689528, 1.012084166616409, 1.0120502949311314, 1.0120164591095868,
+        1.011982582733986, 1.0119485942046518, 1.0119144323632894, 1.0118800516910225,
+        1.0118454267387733, 1.0118105554520787, 1.011775461080082, 1.0117401924184781,
+        1.0117048222346323, 1.0116694438575036, 1.0116341660746928, 1.0115991066464718,
+        1.0115643848993057, 1.0115301139765247, 1.011496393382079, 1.011463302442943,
+        1.0114308952351618, 1.0113991973763305, 1.0113682049021013, 1.0113378852405723,
+        1.0113081801031123, 1.0112790099481297, 1.0112502795634912, 1.0112218842633283,
+        1.0111937162048728, 1.0111656703904925, 1.0111376500128781, 1.0111095709073878,
+        1.0110813649760746, 1.0110529825295718, 1.0110243935477596, 1.0109955878897936,
+        1.0109665744956888, 1.010937379627441, 1.0109080442103515, 1.0108786203651259,
+        1.0108491672725464, 1.010819746582154, 1.0107904176538947, 1.0107612329905828,
+        1.0107322342613334, 1.0107034493139602, 1.0106748905177254, 1.0106465546636003,
+        1.010618424486673, 1.0105904716831968, 1.0105626610996852, 1.010534955604269,
+        1.0105073210397508, 1.010479730625914, 1.010452168236037, 1.0104246301161104,
+        1.0103971248273746, 1.010369671443604, 1.0103422962863917, 1.0103150286960265,
+        1.010287896476848, 1.0102609217018585, 1.0102341175017595, 1.0102074863076829,
+        1.0101810197878527, 1.0101547004524458, 1.0101285046406498, 1.0101024063905282,
+        1.0100763815606408, 1.010050411542928, 1.0100244859835148, 1.0099986040984723,
+        1.0099727744065192, 1.009947012960913, 1.0099213404055543, 1.009895778365608,
+        1.009870345781055, 1.0098450557875887, 1.0098199136453112, 1.0097949160309079,
+        1.0097700517752133, 1.0097453038858506, 1.0097206524838491, 1.0096960781393902,
+        1.0096715650373447, 1.00964710344575, 1.0096226910906327, 1.0095983332347351,
+        1.0095740414816308, 1.0095498315416547, 1.009525720366043, 1.0095017231524155,
+        1.0094778507338005, 1.009454107784916, 1.009430492129075, 1.0094069952340259,
+        1.0093836037797292, 1.0093603020008728, 1.009337074382188, 1.009313908235162,
+        1.0092907957175703, 1.0092677349644157, 1.0092447301602314, 1.0092217905693572,
+        1.0091989287195022, 1.0091761580747625, 1.0091534906130484, 1.009130934728513,
+        1.0091084938120334, 1.009086165736407, 1.009063943310331, 1.0090418155961123,
+        1.0090197698393013, 1.0089977936593826, 1.0089758771148065, 1.008954014287803,
+        1.008932204127458, 1.0089104504249975, 1.008888760949529, 1.0088671459173486,
+        1.0088456160791217, 1.0088241807678973, 1.0088028462484444, 1.0087816146468083,
+        1.0087604836303279, 1.0087394468732744, 1.008718495205316, 1.0086976182240859,
+        1.0086768060780233, 1.0086560511040747, 1.008635349038701, 1.0086146996027143,
+        1.008594106375102, 1.008573575997431, 1.0085531168660895, 1.008532737554761,
+        1.0085124452500307, 1.008492244473024, 1.0084721363025282, 1.0084521182215886,
+        1.008432184597227, 1.0084123276920294, 1.0083925390160817, 1.0083728107734398,
+        1.0083531371475103, 1.0083335152048414, 1.008313945269616, 1.0082944307178339,
+        1.0082749772430615, 1.008255591736891, 1.0082362809906509, 1.0082170504507666,
+        1.0081979032443662, 1.0081788396385636, 1.0081598570164558, 1.008140950360042,
+        1.0081221131417195, 1.0081033384570721, 1.0080846201937919, 1.0080659540307557,
+        1.0080473380966324, 1.008028773181424, 1.0080102624757195, 1.007991810895854,
+        1.007973424124046, 1.0079551075393542, 1.007936865229571, 1.0079186992551115,
+        1.007900609287269, 1.0078825926743888, 1.0078646449133006, 1.0078467604328434,
+        1.0078289335443176, 1.0078111593881895, 1.0077934347116144, 1.0077757583452667,
+        1.0077581313040398, 1.0077405565039186, 1.0077230381546678, 1.0077055809429816,
+        1.0076881891543965, 1.007670865888896, 1.0076536125047084, 1.007636428381305,
+        1.0076193110344591, 1.007602256553732, 1.0075852602774775, 1.00756831758107,
+        1.0075514246377237, 1.0075345790199453, 1.007517780040797, 1.0075010287825896,
+        1.007484327816276, 1.007467680668918, 1.0074510911388155, 1.007434562581889,
+        1.0074180972945146, 1.0074016960977754, 1.0073853581902465, 1.0073690812876994,
+        1.0073528620177206, 1.0073366964936563, 1.0073205809630879, 1.0073045124159858,
+        1.0072884890477216, 1.0072725105002907, 1.0072565778456635, 1.0072406933210978,
+        1.007224859869104, 1.0072090805671463, 1.0071933580491768, 1.0071776940197088,
+        1.0071620889422512, 1.007146541951602, 1.0071310509991593, 1.0071156131999048,
+        1.0071002253154722, 1.0070848842860158, 1.0070695877173883, 1.0070543342405927,
+        1.0070391236846041, 1.0070239570376993, 1.0070088362096148, 1.0069937636408732,
+        1.0069787418308964, 1.0069637728683707, 1.0069488580449082, 1.006933997616292,
+        1.006919190748561, 1.0069044356532473, 1.0068897298835109, 1.0068750707359604,
+        1.0068604556863592, 1.0068458827835476, 1.0068313509350717, 1.0068168600385827,
+        1.0068024109404978, 1.0067880052336278, 1.0067736449326918, 1.0067593320862267,
+        1.0067450683929102, 1.0067308548874114, 1.0067166917474333, 1.006702578251501,
+        1.00668851289061, 1.0066744936107548, 1.00666051814171, 1.0066465843542514,
+        1.0066326905846639, 1.0066188358727866, 1.0066050200758043, 1.0065912438420115,
+        1.0065775084526927, 1.0065638155621832, 1.0065501668822179, 1.0065365638648094,
+        1.0065230074363172, 1.0065094978256302, 1.0064960345122005, 1.0064826162994,
+        1.0064692414975278, 1.0064559081835118, 1.0064426144925822, 1.0064293588934181,
+        1.0064161404024312, 1.006402958704156, 1.006389814160889, 1.0063767077132224,
+        1.0063636406904202, 1.0063506145635253, 1.0063376306819956, 1.0063246900359457,
+        1.0063117930804955, 1.0062989396478488, 1.0062861289579892, 1.006273359723399,
+        1.0062606303288661]]
diff --git a/Tests/ReferenceData/PyPersist/SpheresAtHexLattice.ref.int.gz b/Tests/ReferenceData/PyPersist/SpheresAtHexLattice.ref.int.gz
new file mode 100644
index 0000000..5dabc49
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/SpheresAtHexLattice.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/TriangularRipple.ref.int.gz b/Tests/ReferenceData/PyPersist/TriangularRipple.ref.int.gz
new file mode 100644
index 0000000..be46b1f
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/TriangularRipple.ref.int.gz differ
diff --git a/Tests/ReferenceData/PyPersist/TwoTypesOfCylindersWithSizeDistribution.ref.int.gz b/Tests/ReferenceData/PyPersist/TwoTypesOfCylindersWithSizeDistribution.ref.int.gz
new file mode 100644
index 0000000..d701878
Binary files /dev/null and b/Tests/ReferenceData/PyPersist/TwoTypesOfCylindersWithSizeDistribution.ref.int.gz differ
diff --git a/Tests/ReferenceData/Special/polmagcylinders2_reference_00.int.gz b/Tests/ReferenceData/Special/polmagcylinders2_reference_00.int.gz
new file mode 100644
index 0000000..6308dbf
Binary files /dev/null and b/Tests/ReferenceData/Special/polmagcylinders2_reference_00.int.gz differ
diff --git a/Tests/ReferenceData/Special/polmagcylinders2_reference_01.int.gz b/Tests/ReferenceData/Special/polmagcylinders2_reference_01.int.gz
new file mode 100644
index 0000000..b8adb9c
Binary files /dev/null and b/Tests/ReferenceData/Special/polmagcylinders2_reference_01.int.gz differ
diff --git a/Tests/ReferenceData/Special/polmagcylinders2_reference_10.int.gz b/Tests/ReferenceData/Special/polmagcylinders2_reference_10.int.gz
new file mode 100644
index 0000000..b8adb9c
Binary files /dev/null and b/Tests/ReferenceData/Special/polmagcylinders2_reference_10.int.gz differ
diff --git a/Tests/ReferenceData/Special/polmagcylinders2_reference_11.int.gz b/Tests/ReferenceData/Special/polmagcylinders2_reference_11.int.gz
new file mode 100644
index 0000000..6308dbf
Binary files /dev/null and b/Tests/ReferenceData/Special/polmagcylinders2_reference_11.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/ApproximationDA.int.gz b/Tests/ReferenceData/StandardSuite/ApproximationDA.int.gz
new file mode 100644
index 0000000..077dd23
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/ApproximationDA.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/ApproximationLMA.int.gz b/Tests/ReferenceData/StandardSuite/ApproximationLMA.int.gz
new file mode 100644
index 0000000..30ccbd7
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/ApproximationLMA.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/ApproximationSSCA.int.gz b/Tests/ReferenceData/StandardSuite/ApproximationSSCA.int.gz
new file mode 100644
index 0000000..eaf62b1
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/ApproximationSSCA.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DCauchy.int.gz b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DCauchy.int.gz
new file mode 100644
index 0000000..92fcd0c
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DCauchy.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DCone.int.gz b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DCone.int.gz
new file mode 100644
index 0000000..81685ad
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DCone.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DGate.int.gz b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DGate.int.gz
new file mode 100644
index 0000000..7484118
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DGate.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DGauss.int.gz b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DGauss.int.gz
new file mode 100644
index 0000000..34cc721
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DGauss.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DVoigt.int.gz b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DVoigt.int.gz
new file mode 100644
index 0000000..8be6f95
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/Basic2DParaCrystal_FTDistribution2DVoigt.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/BeamDivergence.int.gz b/Tests/ReferenceData/StandardSuite/BeamDivergence.int.gz
new file mode 100644
index 0000000..92966ae
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/BeamDivergence.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/BoxCompositionRotateX.int.gz b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateX.int.gz
new file mode 100644
index 0000000..8d23e07
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateX.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/BoxCompositionRotateY.int.gz b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateY.int.gz
new file mode 100644
index 0000000..b2125f7
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateY.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/BoxCompositionRotateZ.int.gz b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateZ.int.gz
new file mode 100644
index 0000000..dcddafb
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateZ.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/BoxCompositionRotateZandY.int.gz b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateZandY.int.gz
new file mode 100644
index 0000000..3988431
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/BoxCompositionRotateZandY.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/BoxStackComposition.int.gz b/Tests/ReferenceData/StandardSuite/BoxStackComposition.int.gz
new file mode 100644
index 0000000..f716584
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/BoxStackComposition.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CenteredSquareLattice.int.gz b/Tests/ReferenceData/StandardSuite/CenteredSquareLattice.int.gz
new file mode 100644
index 0000000..bf71194
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CenteredSquareLattice.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CoreShellBoxRotateZandY.int.gz b/Tests/ReferenceData/StandardSuite/CoreShellBoxRotateZandY.int.gz
new file mode 100644
index 0000000..40b0f82
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CoreShellBoxRotateZandY.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CoreShellParticle.int.gz b/Tests/ReferenceData/StandardSuite/CoreShellParticle.int.gz
new file mode 100644
index 0000000..aee81c8
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CoreShellParticle.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CosineRipple.int.gz b/Tests/ReferenceData/StandardSuite/CosineRipple.int.gz
new file mode 100644
index 0000000..8d9a7fe
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CosineRipple.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CustomMorphology.int.gz b/Tests/ReferenceData/StandardSuite/CustomMorphology.int.gz
new file mode 100644
index 0000000..a018711
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CustomMorphology.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CylindersAndPrisms.int.gz b/Tests/ReferenceData/StandardSuite/CylindersAndPrisms.int.gz
new file mode 100644
index 0000000..c7b84c0
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CylindersAndPrisms.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CylindersInSSCA.int.gz b/Tests/ReferenceData/StandardSuite/CylindersInSSCA.int.gz
new file mode 100644
index 0000000..0f81dbb
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CylindersInSSCA.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/CylindersWithSizeDistribution.int.gz b/Tests/ReferenceData/StandardSuite/CylindersWithSizeDistribution.int.gz
new file mode 100644
index 0000000..22a5e7d
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/CylindersWithSizeDistribution.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/DetectorResolution.int.gz b/Tests/ReferenceData/StandardSuite/DetectorResolution.int.gz
new file mode 100644
index 0000000..0db292f
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/DetectorResolution.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_AnisoPyramid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_AnisoPyramid.int.gz
new file mode 100644
index 0000000..ba3ba7b
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_AnisoPyramid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Box.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Box.int.gz
new file mode 100644
index 0000000..6783421
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Box.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cone.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cone.int.gz
new file mode 100644
index 0000000..13f9343
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cone.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cone6.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cone6.int.gz
new file mode 100644
index 0000000..c2377b8
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cone6.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cuboctahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cuboctahedron.int.gz
new file mode 100644
index 0000000..bbe6845
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cuboctahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cylinder.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cylinder.int.gz
new file mode 100644
index 0000000..b854eab
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Cylinder.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Dodecahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Dodecahedron.int.gz
new file mode 100644
index 0000000..d2bc17c
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Dodecahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_EllipsoidalCylinder.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_EllipsoidalCylinder.int.gz
new file mode 100644
index 0000000..5e6ba0e
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_EllipsoidalCylinder.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_FullSphere.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_FullSphere.int.gz
new file mode 100644
index 0000000..4081139
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_FullSphere.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_FullSpheroid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_FullSpheroid.int.gz
new file mode 100644
index 0000000..35597ec
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_FullSpheroid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_HemiEllipsoid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_HemiEllipsoid.int.gz
new file mode 100644
index 0000000..bcc5ff9
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_HemiEllipsoid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Icosahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Icosahedron.int.gz
new file mode 100644
index 0000000..7db011a
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Icosahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Prism3.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Prism3.int.gz
new file mode 100644
index 0000000..9b3ae3d
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Prism3.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Prism6.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Prism6.int.gz
new file mode 100644
index 0000000..f198504
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Prism6.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Pyramid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Pyramid.int.gz
new file mode 100644
index 0000000..5aefa58
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Pyramid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Ripple1.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Ripple1.int.gz
new file mode 100644
index 0000000..cda59ab
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Ripple1.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Ripple2.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Ripple2.int.gz
new file mode 100644
index 0000000..baf31de
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Ripple2.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Tetrahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Tetrahedron.int.gz
new file mode 100644
index 0000000..dcba670
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_Tetrahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedCube.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedCube.int.gz
new file mode 100644
index 0000000..eeacdd3
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedCube.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedSphere.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedSphere.int.gz
new file mode 100644
index 0000000..2784d8a
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedSphere.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedSpheroid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedSpheroid.int.gz
new file mode 100644
index 0000000..ff3bb08
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactorsAbs_TruncatedSpheroid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_AnisoPyramid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_AnisoPyramid.int.gz
new file mode 100644
index 0000000..aaf321f
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_AnisoPyramid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Box.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Box.int.gz
new file mode 100644
index 0000000..91f05d0
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Box.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Cone.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Cone.int.gz
new file mode 100644
index 0000000..3875b7c
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Cone.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Cone6.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Cone6.int.gz
new file mode 100644
index 0000000..61b5248
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Cone6.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Cuboctahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Cuboctahedron.int.gz
new file mode 100644
index 0000000..7429249
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Cuboctahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Cylinder.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Cylinder.int.gz
new file mode 100644
index 0000000..c5e2de6
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Cylinder.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Dodecahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Dodecahedron.int.gz
new file mode 100644
index 0000000..57d6f3d
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Dodecahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_EllipsoidalCylinder.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_EllipsoidalCylinder.int.gz
new file mode 100644
index 0000000..4e55a08
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_EllipsoidalCylinder.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_FullSphere.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_FullSphere.int.gz
new file mode 100644
index 0000000..beb228b
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_FullSphere.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_FullSpheroid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_FullSpheroid.int.gz
new file mode 100644
index 0000000..384e9a0
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_FullSpheroid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_HemiEllipsoid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_HemiEllipsoid.int.gz
new file mode 100644
index 0000000..02f6d72
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_HemiEllipsoid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Icosahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Icosahedron.int.gz
new file mode 100644
index 0000000..7a2ab96
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Icosahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Prism3.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Prism3.int.gz
new file mode 100644
index 0000000..24cafb7
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Prism3.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Prism6.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Prism6.int.gz
new file mode 100644
index 0000000..52a455f
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Prism6.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Pyramid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Pyramid.int.gz
new file mode 100644
index 0000000..9b13e1e
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Pyramid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Ripple1.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Ripple1.int.gz
new file mode 100644
index 0000000..d0402d3
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Ripple1.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Ripple2.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Ripple2.int.gz
new file mode 100644
index 0000000..46857c8
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Ripple2.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_Tetrahedron.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_Tetrahedron.int.gz
new file mode 100644
index 0000000..37a0fd7
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_Tetrahedron.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedCube.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedCube.int.gz
new file mode 100644
index 0000000..954c5e2
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedCube.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedSphere.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedSphere.int.gz
new file mode 100644
index 0000000..572f683
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedSphere.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedSpheroid.int.gz b/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedSpheroid.int.gz
new file mode 100644
index 0000000..53c1736
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/FormFactors_TruncatedSpheroid.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/HexParaCrystal.int.gz b/Tests/ReferenceData/StandardSuite/HexParaCrystal.int.gz
new file mode 100644
index 0000000..5562862
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/HexParaCrystal.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/LargeCylindersMonteCarlo.int.gz b/Tests/ReferenceData/StandardSuite/LargeCylindersMonteCarlo.int.gz
new file mode 100644
index 0000000..0065289
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/LargeCylindersMonteCarlo.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/Lattice1D.int.gz b/Tests/ReferenceData/StandardSuite/Lattice1D.int.gz
new file mode 100644
index 0000000..c80296c
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/Lattice1D.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/MagneticParticleZeroField.int.gz b/Tests/ReferenceData/StandardSuite/MagneticParticleZeroField.int.gz
new file mode 100644
index 0000000..c557c39
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/MagneticParticleZeroField.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/MesoCrystal.int.gz b/Tests/ReferenceData/StandardSuite/MesoCrystal.int.gz
new file mode 100644
index 0000000..b1c1616
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/MesoCrystal.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/MultiLayerWithRoughness.int.gz b/Tests/ReferenceData/StandardSuite/MultiLayerWithRoughness.int.gz
new file mode 100644
index 0000000..d205383
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/MultiLayerWithRoughness.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/MultipleLayout.int.gz b/Tests/ReferenceData/StandardSuite/MultipleLayout.int.gz
new file mode 100644
index 0000000..21bbb27
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/MultipleLayout.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/ParticleComposition.int.gz b/Tests/ReferenceData/StandardSuite/ParticleComposition.int.gz
new file mode 100644
index 0000000..d03c82a
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/ParticleComposition.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RadialParaCrystal.int.gz b/Tests/ReferenceData/StandardSuite/RadialParaCrystal.int.gz
new file mode 100644
index 0000000..949c1c3
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RadialParaCrystal.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RectDetWithRoi.int.gz b/Tests/ReferenceData/StandardSuite/RectDetWithRoi.int.gz
new file mode 100644
index 0000000..33fd2d8
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RectDetWithRoi.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RectDetectorGeneric.int.gz b/Tests/ReferenceData/StandardSuite/RectDetectorGeneric.int.gz
new file mode 100644
index 0000000..bfca363
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RectDetectorGeneric.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RectDetectorPerpToDirectBeam.int.gz b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToDirectBeam.int.gz
new file mode 100644
index 0000000..6d7692d
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToDirectBeam.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RectDetectorPerpToReflectedBeam.int.gz b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToReflectedBeam.int.gz
new file mode 100644
index 0000000..0ac689c
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToReflectedBeam.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RectDetectorPerpToReflectedBeamDpos.int.gz b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToReflectedBeamDpos.int.gz
new file mode 100644
index 0000000..d901e75
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToReflectedBeamDpos.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RectDetectorPerpToSample.int.gz b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToSample.int.gz
new file mode 100644
index 0000000..7a392cd
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RectDetectorPerpToSample.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RectParaCrystal.int.gz b/Tests/ReferenceData/StandardSuite/RectParaCrystal.int.gz
new file mode 100644
index 0000000..890be97
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RectParaCrystal.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RotatedPyramids.int.gz b/Tests/ReferenceData/StandardSuite/RotatedPyramids.int.gz
new file mode 100644
index 0000000..eb67ed1
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RotatedPyramids.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/RotatedSquareLattice.int.gz b/Tests/ReferenceData/StandardSuite/RotatedSquareLattice.int.gz
new file mode 100644
index 0000000..e0d1f6d
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/RotatedSquareLattice.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/SimulationWithMasks.int.gz b/Tests/ReferenceData/StandardSuite/SimulationWithMasks.int.gz
new file mode 100644
index 0000000..eddaa22
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/SimulationWithMasks.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/SphericalDetWithRoi.int.gz b/Tests/ReferenceData/StandardSuite/SphericalDetWithRoi.int.gz
new file mode 100644
index 0000000..3215790
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/SphericalDetWithRoi.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/SquareLattice.int.gz b/Tests/ReferenceData/StandardSuite/SquareLattice.int.gz
new file mode 100644
index 0000000..f6b1c3b
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/SquareLattice.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/TransformBox.int.gz b/Tests/ReferenceData/StandardSuite/TransformBox.int.gz
new file mode 100644
index 0000000..c78119e
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/TransformBox.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/TriangularRipple.int.gz b/Tests/ReferenceData/StandardSuite/TriangularRipple.int.gz
new file mode 100644
index 0000000..d0b9df3
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/TriangularRipple.int.gz differ
diff --git a/Tests/ReferenceData/StandardSuite/TwoTypesCylindersDistribution.int.gz b/Tests/ReferenceData/StandardSuite/TwoTypesCylindersDistribution.int.gz
new file mode 100644
index 0000000..111b373
Binary files /dev/null and b/Tests/ReferenceData/StandardSuite/TwoTypesCylindersDistribution.int.gz differ
diff --git a/Tests/ReferenceData/legacy/customformfactor_reference.int.gz b/Tests/ReferenceData/legacy/customformfactor_reference.int.gz
new file mode 100644
index 0000000..d0b60c8
Binary files /dev/null and b/Tests/ReferenceData/legacy/customformfactor_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_anisopyramid_reference.int.gz b/Tests/ReferenceData/legacy/ffba_anisopyramid_reference.int.gz
new file mode 100644
index 0000000..9df89ab
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_anisopyramid_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_box_reference.int.gz b/Tests/ReferenceData/legacy/ffba_box_reference.int.gz
new file mode 100644
index 0000000..1283729
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_box_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_cone6_reference.int.gz b/Tests/ReferenceData/legacy/ffba_cone6_reference.int.gz
new file mode 100644
index 0000000..0109bd6
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_cone6_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_cone_reference.int.gz b/Tests/ReferenceData/legacy/ffba_cone_reference.int.gz
new file mode 100644
index 0000000..f0bb542
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_cone_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_cuboctahedron_reference.int.gz b/Tests/ReferenceData/legacy/ffba_cuboctahedron_reference.int.gz
new file mode 100644
index 0000000..bdec4b6
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_cuboctahedron_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_cylinder_reference.int.gz b/Tests/ReferenceData/legacy/ffba_cylinder_reference.int.gz
new file mode 100644
index 0000000..7f82004
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_cylinder_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_ellipscylinder_reference.int.gz b/Tests/ReferenceData/legacy/ffba_ellipscylinder_reference.int.gz
new file mode 100644
index 0000000..6c04968
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_ellipscylinder_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_fullsphere_reference.int.gz b/Tests/ReferenceData/legacy/ffba_fullsphere_reference.int.gz
new file mode 100644
index 0000000..b90acd3
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_fullsphere_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_fullspheroid_reference.int.gz b/Tests/ReferenceData/legacy/ffba_fullspheroid_reference.int.gz
new file mode 100644
index 0000000..4822f91
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_fullspheroid_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_hemiellipsoid_reference.int.gz b/Tests/ReferenceData/legacy/ffba_hemiellipsoid_reference.int.gz
new file mode 100644
index 0000000..769b669
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_hemiellipsoid_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_prism3_reference.int.gz b/Tests/ReferenceData/legacy/ffba_prism3_reference.int.gz
new file mode 100644
index 0000000..2063820
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_prism3_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_prism6_reference.int.gz b/Tests/ReferenceData/legacy/ffba_prism6_reference.int.gz
new file mode 100644
index 0000000..6fa0417
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_prism6_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_pyramid_reference.int.gz b/Tests/ReferenceData/legacy/ffba_pyramid_reference.int.gz
new file mode 100644
index 0000000..e99c774
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_pyramid_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_sphere_reference.int.gz b/Tests/ReferenceData/legacy/ffba_sphere_reference.int.gz
new file mode 100644
index 0000000..0c4fd4a
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_sphere_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_spheroid_reference.int.gz b/Tests/ReferenceData/legacy/ffba_spheroid_reference.int.gz
new file mode 100644
index 0000000..0c4fd4a
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_spheroid_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_tetrahedron_reference.int.gz b/Tests/ReferenceData/legacy/ffba_tetrahedron_reference.int.gz
new file mode 100644
index 0000000..6427e7a
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_tetrahedron_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ffba_truncatedcube_reference.int.gz b/Tests/ReferenceData/legacy/ffba_truncatedcube_reference.int.gz
new file mode 100644
index 0000000..4b6acf4
Binary files /dev/null and b/Tests/ReferenceData/legacy/ffba_truncatedcube_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/isgisaxs03_reference_BA.int.gz b/Tests/ReferenceData/legacy/isgisaxs03_reference_BA.int.gz
new file mode 100644
index 0000000..2b61186
Binary files /dev/null and b/Tests/ReferenceData/legacy/isgisaxs03_reference_BA.int.gz differ
diff --git a/Tests/ReferenceData/legacy/isgisaxs03_reference_BA_size.int.gz b/Tests/ReferenceData/legacy/isgisaxs03_reference_BA_size.int.gz
new file mode 100644
index 0000000..c395789
Binary files /dev/null and b/Tests/ReferenceData/legacy/isgisaxs03_reference_BA_size.int.gz differ
diff --git a/Tests/ReferenceData/legacy/isgisaxs03_reference_DWBA.int.gz b/Tests/ReferenceData/legacy/isgisaxs03_reference_DWBA.int.gz
new file mode 100644
index 0000000..c7e020a
Binary files /dev/null and b/Tests/ReferenceData/legacy/isgisaxs03_reference_DWBA.int.gz differ
diff --git a/Tests/ReferenceData/legacy/mesocrystal01_reference.int.gz b/Tests/ReferenceData/legacy/mesocrystal01_reference.int.gz
new file mode 100644
index 0000000..378a507
Binary files /dev/null and b/Tests/ReferenceData/legacy/mesocrystal01_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/montecarlo_integration.int.gz b/Tests/ReferenceData/legacy/montecarlo_integration.int.gz
new file mode 100644
index 0000000..64864c5
Binary files /dev/null and b/Tests/ReferenceData/legacy/montecarlo_integration.int.gz differ
diff --git a/Tests/ReferenceData/legacy/polmagcylinders1_reference.int.gz b/Tests/ReferenceData/legacy/polmagcylinders1_reference.int.gz
new file mode 100644
index 0000000..04a33f4
Binary files /dev/null and b/Tests/ReferenceData/legacy/polmagcylinders1_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/resolutionfunction_reference.int.gz b/Tests/ReferenceData/legacy/resolutionfunction_reference.int.gz
new file mode 100644
index 0000000..f225b03
Binary files /dev/null and b/Tests/ReferenceData/legacy/resolutionfunction_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ripple1_reference.int.gz b/Tests/ReferenceData/legacy/ripple1_reference.int.gz
new file mode 100644
index 0000000..f41fa07
Binary files /dev/null and b/Tests/ReferenceData/legacy/ripple1_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ripple2_asym_reference.int.gz b/Tests/ReferenceData/legacy/ripple2_asym_reference.int.gz
new file mode 100644
index 0000000..05d7716
Binary files /dev/null and b/Tests/ReferenceData/legacy/ripple2_asym_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/ripple2_sym_reference.int.gz b/Tests/ReferenceData/legacy/ripple2_sym_reference.int.gz
new file mode 100644
index 0000000..031c22f
Binary files /dev/null and b/Tests/ReferenceData/legacy/ripple2_sym_reference.int.gz differ
diff --git a/Tests/ReferenceData/legacy/roughness01_reference.int.gz b/Tests/ReferenceData/legacy/roughness01_reference.int.gz
new file mode 100644
index 0000000..07add92
Binary files /dev/null and b/Tests/ReferenceData/legacy/roughness01_reference.int.gz differ
diff --git a/Tests/UnitTests/Core/0/CVectorTest.h b/Tests/UnitTests/Core/0/CVectorTest.h
new file mode 100644
index 0000000..0f0bfeb
--- /dev/null
+++ b/Tests/UnitTests/Core/0/CVectorTest.h
@@ -0,0 +1,49 @@
+#ifndef CVECTORTEST_H
+#define CVECTORTEST_H
+
+#include "Vectors3D.h"
+#include "EigenCore.h"
+#include "Complex.h"
+
+class CVectorTest : public ::testing::Test
+{
+ protected:
+    CVectorTest() {}
+    virtual ~CVectorTest() {}
+};
+
+TEST_F(CVectorTest, TrivialOperations)
+{
+    kvector_t vec_k(1.,2.,3.);
+    EXPECT_EQ( vec_k.complex().z(), complex_t(3.,0.) );
+
+    cvector_t vec_c(complex_t(1.,3.), complex_t(2.,-5.), complex_t(-3.,-4.));
+    EXPECT_EQ( -vec_c.z(), complex_t(3.,4.) );
+    EXPECT_DOUBLE_EQ( vec_c.mag(), 8. );
+}
+
+TEST_F(CVectorTest, BasicArithmetics)
+{
+    // Dot product with "Eigen" library
+    Eigen::Vector3cd va(complex_t(1.,0.), complex_t(2.,0.), complex_t(3.,0.));
+    Eigen::Vector3cd vc(complex_t(1.,1.), complex_t(2.,-5.), complex_t(3.,4.));
+    EXPECT_TRUE(va.dot(vc) == complex_t(14.,3.));
+
+    // Dot product defined in BasicVector3D
+    cvector_t vec_a(complex_t(1.,0.), complex_t(2.,0.), complex_t(3.,0.));
+    cvector_t vec_b(complex_t(2.,0.), complex_t(3.,0.), complex_t(4.,0.));
+    cvector_t vec_c(complex_t(1.,1.), complex_t(2.,-5.), complex_t(3.,4.));
+    EXPECT_TRUE(vec_a.dot(vec_b) == complex_t(20.,0));
+    EXPECT_TRUE(vec_a.dot(vec_c) == complex_t(14.,3.));
+    EXPECT_TRUE(vec_c.dot(vec_b) == complex_t(20.,-3.));
+    EXPECT_TRUE(vec_a.dot(vec_a) == complex_t(14.,0));
+    EXPECT_TRUE(vec_c.dot(vec_c) == complex_t(56.,0));
+
+    // f = f_re + j*f_im
+    cvector_t vec_e(1.,2.,3.);
+    cvector_t vec_f(5.,6.,7.);
+    EXPECT_EQ( vec_e+complex_t(0,1)*vec_f,
+               cvector_t(complex_t(1.,5.), complex_t(2.,6), complex_t(3,7)) );
+}
+
+#endif // CVECTORTEST_H
diff --git a/Tests/UnitTests/Core/0/ConstKBinAxisTest.h b/Tests/UnitTests/Core/0/ConstKBinAxisTest.h
new file mode 100644
index 0000000..aa7f83f
--- /dev/null
+++ b/Tests/UnitTests/Core/0/ConstKBinAxisTest.h
@@ -0,0 +1,99 @@
+#ifndef CONSTKBINAXISTEST_H
+#define CONSTKBINAXISTEST_H
+
+#include "ConstKBinAxis.h"
+#include "OutputDataIOHelper.h"
+#include "Units.h"
+#include <vector>
+
+class ConstKBinAxisTest: public ::testing::Test
+{
+protected:
+    ConstKBinAxisTest()
+        : m_nbins(10)
+        , m_start(-5.0*Units::degree)
+        , m_end(5.0*Units::degree)
+        , m_axis("name", m_nbins, m_start, m_end)
+    {
+        double start_sin = std::sin(m_start);
+        double end_sin = std::sin(m_end);
+        double step = (end_sin-start_sin)/m_nbins;
+
+        for(size_t i=0; i<m_nbins; ++i) {
+            m_centers.push_back( (std::asin(start_sin + step*i) +  std::asin(start_sin + step*(i+1)))/2.0 );
+        }
+
+        for(size_t i=0; i<m_nbins+1; ++i) {
+            m_boundaries.push_back( std::asin(start_sin + step*i) );
+        }
+
+    }
+
+    size_t m_nbins;
+    double m_start;
+    double m_end;
+    ConstKBinAxis m_axis;
+    std::vector<double> m_centers;
+    std::vector<double> m_boundaries;
+};
+
+
+//[-5.0, -3.99816897832528, -2.9975609824866662, -1.99786732193833, -0.9987818274427882, 0.0, 0.9987818274427874, 1.9978673219383292, 2.997560982486666, 3.998168978325279, 5.0]
+TEST_F(ConstKBinAxisTest, TypicalAxis)
+{
+    EXPECT_EQ(m_nbins, m_axis.size());
+    EXPECT_EQ(m_start, m_axis.getMin());
+    EXPECT_EQ(m_end, m_axis.getMax());
+
+    EXPECT_DOUBLE_EQ(m_start, m_axis.getBinBoundaries().front());
+    EXPECT_DOUBLE_EQ(m_end, m_axis.getBinBoundaries().back());
+
+    for(size_t i=0; i<m_axis.size(); ++i) {
+        EXPECT_DOUBLE_EQ( m_centers[i], m_axis[i]);
+    }
+
+    for(size_t i=0; i<m_axis.size(); ++i) {
+        EXPECT_DOUBLE_EQ( m_boundaries[i], m_axis.getBin(i).m_lower);
+        EXPECT_DOUBLE_EQ( m_boundaries[i+1], m_axis.getBin(i).m_upper);
+    }
+
+}
+
+
+TEST_F(ConstKBinAxisTest, CheckClone)
+{
+    ConstKBinAxis *clone=m_axis.clone();
+    EXPECT_TRUE(m_axis == *clone);
+    delete clone;
+}
+
+
+TEST_F(ConstKBinAxisTest, IOStream)
+{
+    std::ostringstream oss;
+    oss << m_axis;
+
+    ConstKBinAxis *result = dynamic_cast<ConstKBinAxis *>(OutputDataIOHelper::createFixedBinAxis(oss.str()));
+    EXPECT_TRUE(m_axis == *result);
+    delete result;
+}
+
+//[-5.0, -3.99816897832528, -2.9975609824866662, -1.99786732193833, -0.9987818274427882, 0.0, 0.9987818274427874, 1.9978673219383292, 2.997560982486666, 3.998168978325279, 5.0]
+
+TEST_F(ConstKBinAxisTest, ClippedAxis)
+{
+    ConstKBinAxis *clip1 = m_axis.createClippedAxis(Units::deg2rad(-10.0), Units::deg2rad(10.0));
+    EXPECT_TRUE(*clip1 == m_axis);
+    delete clip1;
+
+    ConstKBinAxis *clip2 = m_axis.createClippedAxis(Units::deg2rad(-3.0), Units::deg2rad(3.0));
+    EXPECT_EQ(clip2->size(), size_t(8));
+    std::vector<double> boundaries = clip2->getBinBoundaries();
+    for(size_t i=0; i<boundaries.size(); ++i) {
+        EXPECT_EQ(boundaries[i], m_axis.getBin(1+i).m_lower);
+//        EXPECT_NEAR(boundaries[i], m_axis.getBin(1+i).m_lower, 1e-10);
+    }
+    delete clip2;
+}
+
+#endif // CONSTKBINAXISTEST_H
diff --git a/Tests/UnitTests/Core/0/CustomBinAxisTest.h b/Tests/UnitTests/Core/0/CustomBinAxisTest.h
new file mode 100644
index 0000000..a0016df
--- /dev/null
+++ b/Tests/UnitTests/Core/0/CustomBinAxisTest.h
@@ -0,0 +1,37 @@
+#ifndef CUSTOMBINAXISTEST_H
+#define CUSTOMBINAXISTEST_H
+
+#include "CustomBinAxis.h"
+#include "OutputDataIOHelper.h"
+#include "MathConstants.h"
+#include <vector>
+
+class CusomBinAxisTest: public ::testing::Test
+{
+protected:
+    CusomBinAxisTest()
+        : m_axis("name", 100, -1.0, 1.0){}
+    CustomBinAxis m_axis;
+};
+
+
+TEST_F(CusomBinAxisTest, CheckClone)
+{
+    CustomBinAxis *clone=m_axis.clone();
+    EXPECT_TRUE(m_axis == *clone);
+    delete clone;
+}
+
+TEST_F(CusomBinAxisTest, IOStream)
+{
+
+    std::ostringstream oss;
+    oss << m_axis;
+
+    CustomBinAxis *result = dynamic_cast<CustomBinAxis *>(OutputDataIOHelper::createFixedBinAxis(oss.str()));
+    EXPECT_TRUE(m_axis == *result);
+    delete result;
+}
+
+
+#endif // CUSTOMBINAXISTEST_H
diff --git a/Tests/UnitTests/Core/0/FixedBinAxisTest.h b/Tests/UnitTests/Core/0/FixedBinAxisTest.h
new file mode 100644
index 0000000..b1de3dc
--- /dev/null
+++ b/Tests/UnitTests/Core/0/FixedBinAxisTest.h
@@ -0,0 +1,180 @@
+#ifndef FIXEDBINAXISTEST_H
+#define FIXEDBINAXISTEST_H
+
+#include "FixedBinAxis.h"
+#include "Exceptions.h"
+#include "OutputDataIOHelper.h"
+#include <iostream>
+
+class FixedBinAxisTest: public ::testing::Test
+{
+protected:
+    FixedBinAxisTest() {}
+};
+
+TEST_F(FixedBinAxisTest, IndexedAccessor)
+{
+    FixedBinAxis a1("length", 100, 0.0, 10.0);
+    ASSERT_EQ(100u, a1.size());
+    EXPECT_EQ(0.0, a1.getMin());
+    EXPECT_EQ(10.0, a1.getMax());
+    EXPECT_DOUBLE_EQ(0.05, a1[0]);
+    EXPECT_DOUBLE_EQ(0.15, a1[1]);
+    EXPECT_DOUBLE_EQ(6.55, a1[65]);
+    EXPECT_DOUBLE_EQ(9.95, a1[99]);
+
+    FixedBinAxis a2("name", 3, -1.5, 1.5);
+    EXPECT_DOUBLE_EQ(-1.0, a2[0]);
+    EXPECT_DOUBLE_EQ(0.0, a2[1]);
+    EXPECT_DOUBLE_EQ(1.0, a2[2]);
+    ASSERT_THROW( a2[3], Exceptions::OutOfBoundsException);
+}
+
+TEST_F(FixedBinAxisTest, VectorOfUnitLength)
+{
+    FixedBinAxis vec("name", 1, 1.0, 2.0);
+    EXPECT_EQ(1u, vec.size());
+    EXPECT_EQ(double(1.0), vec.getMin());
+    EXPECT_EQ(double(2.0), vec.getMax());
+    EXPECT_EQ(1.5, vec[0]);
+}
+
+TEST_F(FixedBinAxisTest, FindClosestIndex)
+{
+    FixedBinAxis v1("name", 2, 0.0, 1.0);
+    EXPECT_EQ( size_t(2), v1.size());
+    EXPECT_EQ( size_t(0), v1.findClosestIndex(0.0));
+    EXPECT_EQ( size_t(0), v1.findClosestIndex(0.25));
+    EXPECT_EQ( size_t(1), v1.findClosestIndex(0.5));
+    EXPECT_EQ( size_t(1), v1.findClosestIndex(0.6));
+//    ASSERT_THROW( v1.findClosestIndex(1.0), Exceptions::OutOfBoundsException);
+    EXPECT_EQ( size_t(1), v1.findClosestIndex(1.0));
+
+    FixedBinAxis v2("name", 3, -1.5, 1.5);
+    EXPECT_EQ(size_t(0), v2.findClosestIndex(-1.5));
+    EXPECT_EQ(size_t(0), v2.findClosestIndex(-1.0));
+    EXPECT_EQ(size_t(1), v2.findClosestIndex(-0.5));
+    EXPECT_EQ(size_t(1), v2.findClosestIndex(0.0));
+    EXPECT_EQ(size_t(2), v2.findClosestIndex(0.5));
+    EXPECT_EQ(size_t(2), v2.findClosestIndex(1.499));
+//    ASSERT_THROW( v2.findClosestIndex(1.5), Exceptions::OutOfBoundsException);
+    EXPECT_EQ(size_t(2), v2.findClosestIndex(1.5));
+}
+
+TEST_F(FixedBinAxisTest, CheckBin)
+{
+    FixedBinAxis axis("name",20, 0, 10);
+
+    Bin1D bin0 = axis.getBin(0);
+    EXPECT_DOUBLE_EQ( 0.25, bin0.getMidPoint());
+    EXPECT_DOUBLE_EQ( 0.0, bin0.m_lower);
+    EXPECT_DOUBLE_EQ( 0.5, bin0.m_upper);
+    EXPECT_DOUBLE_EQ( 0.5, bin0.getBinSize());
+
+    Bin1D bin3 = axis.getBin(3);
+    EXPECT_DOUBLE_EQ( 1.75, bin3.getMidPoint());
+    EXPECT_DOUBLE_EQ( 1.5, bin3.m_lower);
+    EXPECT_DOUBLE_EQ( 2.0, bin3.m_upper);
+    EXPECT_DOUBLE_EQ( 0.5, bin3.getBinSize());
+
+    Bin1D bin10 = axis.getBin(10);
+    EXPECT_DOUBLE_EQ( 5.25, bin10.getMidPoint());
+    EXPECT_DOUBLE_EQ( 5.0, bin10.m_lower);
+    EXPECT_DOUBLE_EQ( 5.5, bin10.m_upper);
+
+    Bin1D bin19 = axis.getBin(19);
+    EXPECT_DOUBLE_EQ( 9.75, bin19.getMidPoint());
+    EXPECT_DOUBLE_EQ( 9.5, bin19.m_lower);
+    EXPECT_DOUBLE_EQ( 10.0, bin19.m_upper);
+
+    ASSERT_THROW( axis.getBin(20), Exceptions::OutOfBoundsException);
+
+    FixedBinAxis axis2("name", 3, -1, 2.0);
+    EXPECT_DOUBLE_EQ(-0.5, axis2.getBin(0).getMidPoint());
+    EXPECT_DOUBLE_EQ(0.5, axis2.getBin(1).getMidPoint());
+    EXPECT_DOUBLE_EQ(1.5, axis2.getBin(2).getMidPoint());
+}
+
+TEST_F(FixedBinAxisTest, CheckEquality)
+{
+    FixedBinAxis b1("axis", 99, -1.01, 3.3);
+    FixedBinAxis b2("axis", 99, -1.01, 3.3);
+    EXPECT_TRUE( b1 == b2);
+    FixedBinAxis b3("axissss", 99, -1.01, 3.3);
+    FixedBinAxis b4("axis", 99, -1.0, 3.3);
+    FixedBinAxis b5("axis", 99, -1.01, 3.29);
+    FixedBinAxis b6("axiss", 98, -1.01, 3.3);
+    EXPECT_FALSE( b1 == b3);
+    EXPECT_FALSE( b1 == b4);
+    EXPECT_FALSE( b1 == b5);
+    EXPECT_FALSE( b1 == b6);
+}
+
+TEST_F(FixedBinAxisTest, CheckClone)
+{
+    FixedBinAxis a1("axis", 99, -1.2, 5.4);
+    FixedBinAxis *clone=a1.clone();
+    EXPECT_TRUE(a1 == *clone);
+    delete clone;
+}
+
+TEST_F(FixedBinAxisTest, IOStream)
+{
+    FixedBinAxis axis("name", 99, -1.2, 5.4);
+
+    std::ostringstream oss;
+    oss << axis;
+
+    FixedBinAxis *result = dynamic_cast<FixedBinAxis *>(OutputDataIOHelper::createFixedBinAxis(oss.str()));
+    EXPECT_TRUE(axis == *result);
+    delete result;
+}
+
+TEST_F(FixedBinAxisTest, BinCenters)
+{
+    FixedBinAxis axis("name", 3, -1.5, 1.5);
+    std::vector<double> centers = axis.getBinCenters();
+    EXPECT_EQ(size_t(3), centers.size());
+    EXPECT_DOUBLE_EQ(-1.0, centers[0]);
+    EXPECT_DOUBLE_EQ(0.0, centers[1]);
+    EXPECT_DOUBLE_EQ(1.0, centers[2]);
+
+    EXPECT_DOUBLE_EQ(axis.getBinCenter(0), centers[0]);
+    EXPECT_DOUBLE_EQ(axis.getBinCenter(1), centers[1]);
+    EXPECT_DOUBLE_EQ(axis.getBinCenter(2), centers[2]);
+
+}
+
+TEST_F(FixedBinAxisTest, BinBoundaries)
+{
+    FixedBinAxis axis("name", 3, -1.5, 1.5);
+    std::vector<double> boundaries = axis.getBinBoundaries();
+    EXPECT_EQ(size_t(4), boundaries.size());
+    EXPECT_DOUBLE_EQ(-1.5, boundaries[0]);
+    EXPECT_DOUBLE_EQ(-0.5, boundaries[1]);
+    EXPECT_DOUBLE_EQ(0.5, boundaries[2]);
+    EXPECT_DOUBLE_EQ(1.5, boundaries[3]);
+}
+
+
+TEST_F(FixedBinAxisTest, ClippedAxis)
+{
+    FixedBinAxis axis("name", 4, -1.0, 3.0);
+
+    FixedBinAxis *clip1 = axis.createClippedAxis(-0.5, 2.5);
+    EXPECT_EQ(clip1->size(), axis.size());
+    EXPECT_EQ(clip1->getMin(), axis.getMin());
+    EXPECT_EQ(clip1->getMax(), axis.getMax());
+    EXPECT_TRUE(*clip1 == axis);
+    delete clip1;
+
+    FixedBinAxis *clip2 = axis.createClippedAxis(0.0, 1.99);
+    EXPECT_EQ(clip2->size(), size_t(2));
+    EXPECT_EQ(clip2->getMin(), 0.0);
+    EXPECT_EQ(clip2->getMax(), 2.0);
+    EXPECT_TRUE(*clip2 != axis);
+    delete clip2;
+}
+
+
+#endif // FIXEDBINAXISTEST_H
diff --git a/Tests/UnitTests/Core/0/Histogram1DTest.h b/Tests/UnitTests/Core/0/Histogram1DTest.h
new file mode 100644
index 0000000..afe317e
--- /dev/null
+++ b/Tests/UnitTests/Core/0/Histogram1DTest.h
@@ -0,0 +1,252 @@
+#ifndef HISTOGRAM1DTEST_H
+#define HISTOGRAM1DTEST_H
+
+#include "Histogram1D.h"
+#include "Exceptions.h"
+#include <memory>
+
+class Histogram1DTest : public ::testing::Test
+{
+ protected:
+    Histogram1DTest(){}
+    virtual ~Histogram1DTest(){}
+};
+
+TEST_F(Histogram1DTest, FixedBinConstructor)
+{
+    Histogram1D hist(5, 0.0, 5.0);
+
+    EXPECT_EQ(size_t(1), hist.getRank());
+    EXPECT_EQ(size_t(5), hist.getTotalNumberOfBins());
+    EXPECT_EQ(0.0, hist.getXmin());
+    EXPECT_EQ(5.0, hist.getXmax());
+    EXPECT_EQ(std::string("x-axis"), hist.getXaxis().getName());
+    EXPECT_THROW(hist.getYaxis(), Exceptions::LogicErrorException);
+    for(size_t index=0; index<hist.getTotalNumberOfBins(); ++index) {
+        EXPECT_EQ(index, hist.getGlobalBin(index));
+        EXPECT_EQ(int(index), hist.getXaxisIndex(index));
+    }
+}
+
+TEST_F(Histogram1DTest, FixedBinDefaultContent)
+{
+    Histogram1D hist(5, 0.0, 5.0);
+
+    // bin centers
+    std::vector<double> bin_centers = {0.5, 1.5, 2.5, 3.5, 4.5};
+    std::vector<double> centers = hist.getBinCenters();
+    for(size_t index=0; index < bin_centers.size(); ++index) {
+        EXPECT_EQ(centers[index], bin_centers[index]);
+        EXPECT_EQ(hist.getXaxisValue(index), bin_centers[index]);
+        EXPECT_EQ(hist.getXaxis().getBinCenter(index), bin_centers[index]);
+    }
+
+    // default bin values
+    std::vector<double> values = hist.getBinValues();
+    for(size_t index=0; index < bin_centers.size(); ++index) {
+        EXPECT_EQ(hist.getBinContent(index), 0.0);
+        EXPECT_EQ(values[index], 0.0);
+    }
+
+    // default bin errors
+    std::vector<double> errors = hist.getBinErrors();
+    for(size_t index=0; index < bin_centers.size(); ++index) {
+        EXPECT_EQ(hist.getBinError(index), 0.0);
+        EXPECT_EQ(errors[index], 0.0);
+    }
+
+    // default bin entries
+    for(size_t index=0; index < bin_centers.size(); ++index) {
+        EXPECT_EQ(hist.getBinNumberOfEntries(index), 0);
+    }
+
+}
+
+TEST_F(Histogram1DTest, FixedBinFill)
+{
+    Histogram1D hist(5, 0.0, 5.0);
+
+    // filling two different bins
+
+    hist.fill(0.5, 88.0);
+    hist.fill(4.5, 99.0);
+    EXPECT_EQ(hist.getBinContent(0), 88.0);
+    EXPECT_EQ(hist.getBinNumberOfEntries(0), 1);
+    EXPECT_EQ(hist.getBinError(0), 0.0);
+
+    EXPECT_EQ(hist.getBinContent(4), 99.0);
+    EXPECT_EQ(hist.getBinNumberOfEntries(4), 1);
+    EXPECT_EQ(hist.getBinError(4), 0.0);
+
+    std::vector<double> values = {88.0, 0.0, 0.0, 0.0, 99.0};
+    for(size_t index=0; index<hist.getTotalNumberOfBins(); ++index) {
+        EXPECT_EQ(hist.getBinValues()[index], values[index]);
+        EXPECT_EQ(hist.getBinErrors()[index], 0.0);
+    }
+
+    // resetting histograms
+    hist.reset();
+    EXPECT_EQ(hist.getBinContent(0), 0.0);
+    EXPECT_EQ(hist.getBinNumberOfEntries(0), 0);
+    EXPECT_EQ(hist.getBinError(0), 0.0);
+    EXPECT_EQ(hist.getBinContent(4), 0.0);
+    EXPECT_EQ(hist.getBinNumberOfEntries(4), 0);
+    EXPECT_EQ(hist.getBinError(4), 0.0);
+
+    // another fill
+    const double xvalue(1.5);
+    const int xbin = 1;
+
+    hist.fill(xvalue, 1.0);
+    hist.fill(xvalue, 3.0);
+    EXPECT_EQ(2, hist.getBinNumberOfEntries(xbin));
+    EXPECT_EQ(4.0, hist.getBinContent(xbin));
+    EXPECT_EQ(2.0, hist.getBinAverage(xbin));
+    EXPECT_EQ(1.0, hist.getBinError(xbin));
+
+    // another fill
+    hist.reset();
+    hist.fill(xvalue, 1.0);
+    hist.fill(xvalue, 2.0);
+    hist.fill(xvalue, 3.0);
+    EXPECT_EQ(3, hist.getBinNumberOfEntries(xbin));
+    EXPECT_EQ(6.0, hist.getBinContent(xbin));
+    EXPECT_EQ(2.0, hist.getBinAverage(xbin));
+    EXPECT_EQ(2.0/3.0, hist.getBinError(xbin)*hist.getBinError(xbin));
+}
+
+
+//     -1.0  -0.5        0.5   1.0        2.0  X
+
+TEST_F(Histogram1DTest, crop)
+{
+    std::vector<double> xedges = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> xvalues = {-0.75, 0.0, 0.75, 1.5};
+    Histogram1D hist(4, xedges);
+
+    for(size_t i=0; i<xvalues.size(); ++i) {
+        hist.fill(xvalues[i], i*10);
+    }
+
+    std::unique_ptr<Histogram1D > crop(hist.crop(-0.49, 0.99));
+
+    EXPECT_EQ(-0.5, crop->getXmin());
+    EXPECT_EQ(1.0, crop->getXmax());
+
+    EXPECT_EQ(10.0, crop->getBinContent(0));
+    EXPECT_EQ(20.0, crop->getBinContent(1));
+}
+
+
+TEST_F(Histogram1DTest, CreateHistogram)
+{
+    OutputData<double> data;
+    data.addAxis("x-axis", 10, 0.0, 10.0);
+    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+        data[i] = double(i);
+    }
+
+    std::unique_ptr<IHistogram> hist(IHistogram::createHistogram(data));
+    EXPECT_EQ(size_t(1), hist->getRank());
+    EXPECT_EQ(data.getAllocatedSize(), hist->getNbinsX());
+    EXPECT_EQ(data.getAxis(0).getMin(), hist->getXmin());
+    EXPECT_EQ(data.getAxis(0).getMax(), hist->getXmax());
+    for(size_t i=0; i<hist->getTotalNumberOfBins(); ++i) {
+        EXPECT_EQ(data[i], hist->getBinContent(i));
+        EXPECT_EQ(data[i], hist->getBinAverage(i));
+        EXPECT_EQ(1, hist->getBinNumberOfEntries(i));
+        EXPECT_EQ(0.0, hist->getBinError(i));
+    }
+}
+
+TEST_F(Histogram1DTest, CreateOutputData)
+{
+    Histogram1D hist(10, -5.0, 5.0);
+
+    for(size_t i=0; i<hist.getNbinsX(); ++i) {
+        hist.fill(hist.getXaxisValue(i), 1.0);
+        hist.fill(hist.getXaxisValue(i), 3.0);
+    }
+
+    std::unique_ptr<OutputData<double> > data(hist.createOutputData(IHistogram::DataType::INTEGRAL));
+    EXPECT_EQ(size_t(1), data->getRank());
+    EXPECT_EQ(data->getAllocatedSize(), hist.getNbinsX());
+    EXPECT_EQ(data->getAxis(0).getMin(), hist.getXmin());
+    EXPECT_EQ(data->getAxis(0).getMax(), hist.getXmax());
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(4.0, (*data)[i]);
+    }
+
+    data.reset(hist.createOutputData(IHistogram::DataType::AVERAGE));
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(2.0, (*data)[i]);
+    }
+
+    data.reset(hist.createOutputData(IHistogram::DataType::STANDARD_ERROR));
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(1.0, (*data)[i]);
+    }
+
+    data.reset(hist.createOutputData(IHistogram::DataType::NENTRIES));
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(2.0, (*data)[i]);
+    }
+}
+
+TEST_F(Histogram1DTest, GetMaximumGetMinimum)
+{
+    Histogram1D hist(10, -5.0, 5.0);
+    hist.fill(-4.5, 10.);
+    EXPECT_EQ(10.0, hist.getMaximum());
+    EXPECT_EQ(size_t(0), hist.getMaximumBinIndex());
+    EXPECT_EQ(0.0, hist.getMinimum());
+    EXPECT_EQ(size_t(1), hist.getMinimumBinIndex());
+
+    hist.fill(-3.5, 20.0);
+    EXPECT_EQ(20.0, hist.getMaximum());
+    EXPECT_EQ(size_t(1), hist.getMaximumBinIndex());
+}
+
+TEST_F(Histogram1DTest, Scale)
+{
+    Histogram1D hist(10, -5.0, 5.0);
+
+    for(size_t i=0; i<hist.getTotalNumberOfBins(); ++i) {
+        hist.fill(-4.5+i, 1.0);
+    }
+    hist.scale(10.0);
+    for(size_t i=0; i<hist.getTotalNumberOfBins(); ++i) {
+        EXPECT_EQ(10.0, hist.getBinContent(i));
+    }
+
+}
+
+TEST_F(Histogram1DTest, Integral)
+{
+    Histogram1D hist(10, -5.0, 5.0);
+
+    for(size_t i=0; i<hist.getTotalNumberOfBins(); ++i) {
+        hist.fill(-4.5+i, 1.0);
+    }
+    EXPECT_EQ(10.0, hist.integral());
+}
+
+TEST_F(Histogram1DTest, Addition)
+{
+    Histogram1D hist1(10, -5.0, 5.0);
+    for(size_t i=0; i<hist1.getTotalNumberOfBins(); ++i) {
+        hist1.fill(-4.5+i, 1.0);
+    }
+
+    Histogram1D hist2(10, -5.0, 5.0);
+    for(size_t i=0; i<hist2.getTotalNumberOfBins(); ++i) {
+        hist2.fill(-4.5+i, 2.0);
+    }
+
+    hist1 += hist2;
+    for(size_t i=0; i<hist1.getTotalNumberOfBins(); ++i) {
+        EXPECT_EQ(3.0, hist1.getBinContent(i));
+    }
+}
+
+#endif // HISTOGRAM1DTEST_H
diff --git a/Tests/UnitTests/Core/0/Histogram2DTest.h b/Tests/UnitTests/Core/0/Histogram2DTest.h
new file mode 100644
index 0000000..3600e0c
--- /dev/null
+++ b/Tests/UnitTests/Core/0/Histogram2DTest.h
@@ -0,0 +1,440 @@
+#ifndef HISTOGRAM2DTEST_H
+#define HISTOGRAM2DTEST_H
+
+#include "Histogram2D.h"
+#include <memory>
+
+class Histogram2DTest : public ::testing::Test
+{
+ protected:
+    Histogram2DTest();
+    virtual ~Histogram2DTest();
+
+    Histogram2D *hist;
+};
+
+
+// y
+// 4.0   -----------------------------------
+//       |     |          |     |          |
+//       |  2  |    5     |  8  |    11    |
+// 2.0   -----------------------------------
+//       |  1  |    4     |  7  |    10    |
+// 1.0   -----------------------------------
+//       |  0  |    3     |  6  |    9     |
+// 0.0   -----------------------------------
+//     -1.0  -0.5        0.5   1.0        2.0  X
+
+Histogram2DTest::Histogram2DTest()
+{
+    std::vector<double> xbin_edges = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> ybin_edges = {0.0, 1.0, 2.0, 4.0};
+    hist = new Histogram2D(4, xbin_edges, 3, ybin_edges);
+}
+
+Histogram2DTest::~Histogram2DTest()
+{
+    delete hist;
+}
+
+TEST_F(Histogram2DTest, VariableHist)
+{
+    hist->reset();
+
+    // basic axes check
+    EXPECT_EQ(size_t(12), hist->getTotalNumberOfBins());
+    EXPECT_EQ(hist->getRank(), size_t(2));
+    EXPECT_EQ(hist->getXaxis().getName(), std::string("x-axis"));
+    EXPECT_EQ(hist->getXaxis().size(), size_t(4));
+    EXPECT_EQ(hist->getXmin(), -1.0);
+    EXPECT_EQ(hist->getXmax(), 2.0);
+    EXPECT_EQ(hist->getYaxis().getName(), std::string("y-axis"));
+    EXPECT_EQ(hist->getYaxis().size(), size_t(3));
+    EXPECT_EQ(hist->getYmin(), 0.0);
+    EXPECT_EQ(hist->getYmax(), 4.0);
+
+    // globalbin -> axes indices
+    EXPECT_EQ(hist->getXaxisIndex(0), 0);
+    EXPECT_EQ(hist->getXaxisIndex(1), 0);
+    EXPECT_EQ(hist->getXaxisIndex(2), 0);
+    EXPECT_EQ(hist->getXaxisIndex(3), 1);
+    EXPECT_EQ(hist->getXaxisIndex(4), 1);
+    EXPECT_EQ(hist->getXaxisIndex(5), 1);
+    EXPECT_EQ(hist->getXaxisIndex(9), 3);
+    EXPECT_EQ(hist->getXaxisIndex(10), 3);
+    EXPECT_EQ(hist->getXaxisIndex(11), 3);
+
+    EXPECT_EQ(hist->getYaxisIndex(0), 0);
+    EXPECT_EQ(hist->getYaxisIndex(1), 1);
+    EXPECT_EQ(hist->getYaxisIndex(2), 2);
+    EXPECT_EQ(hist->getYaxisIndex(3), 0);
+    EXPECT_EQ(hist->getYaxisIndex(4), 1);
+    EXPECT_EQ(hist->getYaxisIndex(5), 2);
+    EXPECT_EQ(hist->getYaxisIndex(9), 0);
+    EXPECT_EQ(hist->getYaxisIndex(10), 1);
+    EXPECT_EQ(hist->getYaxisIndex(11), 2);
+
+    // axes indices -> global bin
+    EXPECT_EQ(hist->getGlobalBin(0,0), size_t(0));
+    EXPECT_EQ(hist->getGlobalBin(0,2), size_t(2));
+    EXPECT_EQ(hist->getGlobalBin(1,1), size_t(4));
+    EXPECT_EQ(hist->getGlobalBin(3,2), size_t(11));
+
+    // bin centers
+    EXPECT_EQ(hist->getXaxisValue(0), -0.75);
+    EXPECT_EQ(hist->getXaxisValue(2), -0.75);
+    EXPECT_EQ(hist->getXaxisValue(4), 0.0);
+    EXPECT_EQ(hist->getXaxisValue(10), 1.5);
+    EXPECT_EQ(hist->getXaxisValue(11), 1.5);
+
+    EXPECT_EQ(hist->getYaxisValue(0), 0.5);
+    EXPECT_EQ(hist->getYaxisValue(2), 3.0);
+    EXPECT_EQ(hist->getYaxisValue(4), 1.5);
+    EXPECT_EQ(hist->getYaxisValue(10), 1.5);
+    EXPECT_EQ(hist->getYaxisValue(11), 3.0);
+
+    // coordinates to global bin
+    EXPECT_EQ(hist->findGlobalBin(-0.75, 0.5), size_t(0));
+    EXPECT_EQ(hist->findGlobalBin(0.0, 1.5), size_t(4));
+    EXPECT_EQ(hist->findGlobalBin(1.5, 3.0), size_t(11));
+}
+
+// y
+// 4.0   -----------------------------------
+//       |     |          |     |          |
+//       |  2  |    5     |  8  |    11    |
+// 2.0   -----------------------------------
+//       |  1  |    4     |  7  |    10    |
+// 1.0   -----------------------------------
+//       |  0  |    3     |  6  |    9     |
+// 0.0   -----------------------------------
+//     -1.0  -0.5        0.5   1.0        2.0  X
+
+TEST_F(Histogram2DTest, VariableHistFill)
+{
+    hist->reset();
+
+    // values to fill all histogram
+    std::vector<double> xvalues = {-0.75, -0.75, -0.75, 0.0, 0.0, 0.0,
+                                   0.75, 0.75, 0.75, 1.5, 1.5, 1.5};
+    std::vector<double> yvalues = {0.5, 1.5, 3.0, 0.5, 1.5, 3.0,
+                                   0.5, 1.5, 3.0, 0.5, 1.5, 3.0};
+
+    // put in every histogram bin one double value proportional to globalbin (globalbin*10.0)
+    for(size_t i=0; i<xvalues.size(); ++i) {
+        hist->fill(xvalues[i], yvalues[i], i*10.0);
+    }
+
+    // check bin content using globalbin
+    for(size_t globalbin=0; globalbin<hist->getTotalNumberOfBins(); ++globalbin) {
+        EXPECT_EQ(globalbin*10.0, hist->getBinContent(globalbin));
+        EXPECT_EQ(1.0, hist->getBinNumberOfEntries(globalbin));
+
+    }
+
+    // check bin content using axes bins
+    for(size_t binx=0; binx<hist->getXaxis().size(); ++binx){
+        for(size_t biny=0; biny<hist->getYaxis().size(); ++biny){
+            int globalbin = hist->getGlobalBin(binx, biny);
+            EXPECT_EQ(globalbin*10.0, hist->getBinContent(binx, biny));
+            EXPECT_EQ(1.0, hist->getBinNumberOfEntries(binx, biny));
+        }
+    }
+}
+
+// y
+// 4.0   -----------------------------------
+//       |     |          |     |          |
+//       |  2  |    5     |  8  |    11    |
+// 2.0   -----------------------------------
+//       |  1  |    4     |  7  |    10    |
+// 1.0   -----------------------------------
+//       |  0  |    3     |  6  |    9     |
+// 0.0   -----------------------------------
+//     -1.0  -0.5        0.5   1.0        2.0  X
+
+TEST_F(Histogram2DTest, projectionX)
+{
+    hist->reset();
+
+    // values to fill all histogram
+    std::vector<double> xvalues = {-0.75, -0.75, -0.75, 0.0, 0.0, 0.0,
+                                   0.75, 0.75, 0.75, 1.5, 1.5, 1.5};
+    std::vector<double> yvalues = {0.5, 1.5, 3.0, 0.5, 1.5, 3.0,
+                                   0.5, 1.5, 3.0, 0.5, 1.5, 3.0};
+    std::vector<double> content = {1.0, 2.0, 3.0, 1.0, 2.0, 3.0,
+                                   1.0, 2.0, 3.0, 1.0, 2.0, 3.0};
+
+    // put in every histogram bin the value from 'content' vector
+    for(size_t i=0; i<xvalues.size(); ++i) {
+        hist->fill(xvalues[i], yvalues[i], content[i]);
+    }
+
+    // a) create projection along X axis
+    std::unique_ptr<Histogram1D > h1(hist->projectionX());
+    EXPECT_EQ(hist->getXmin(), h1->getXmin());
+    EXPECT_EQ(hist->getXmax(), h1->getXmax());
+    EXPECT_EQ(hist->getNbinsX(), h1->getNbinsX());
+    EXPECT_EQ(hist->getXaxisValue(0), h1->getXaxisValue(0));
+    EXPECT_EQ(hist->getXaxisValue(3), h1->getXaxisValue(1));
+    EXPECT_EQ(hist->getXaxisValue(6), h1->getXaxisValue(2));
+    EXPECT_EQ(hist->getXaxisValue(9), h1->getXaxisValue(3));
+
+    // check content of projections
+    for(size_t binx=0; binx<h1->getNbinsX(); ++binx) {
+        EXPECT_EQ(3, h1->getBinNumberOfEntries(binx));
+        EXPECT_EQ(6.0, h1->getBinContent(binx));
+        EXPECT_DOUBLE_EQ(std::sqrt(2.0/3.0), h1->getBinError(binx));
+    }
+
+    // b) create projection along X axis at given y (slice)
+    h1.reset(hist->projectionX(1.01));
+    EXPECT_EQ(hist->getXmin(), h1->getXmin());
+    EXPECT_EQ(hist->getXmax(), h1->getXmax());
+    EXPECT_EQ(hist->getNbinsX(), h1->getNbinsX());
+    EXPECT_EQ(hist->getXaxisValue(0), h1->getXaxisValue(0));
+    EXPECT_EQ(hist->getXaxisValue(3), h1->getXaxisValue(1));
+    EXPECT_EQ(hist->getXaxisValue(6), h1->getXaxisValue(2));
+    EXPECT_EQ(hist->getXaxisValue(9), h1->getXaxisValue(3));
+
+    // check content of projections
+    for(size_t binx=0; binx<h1->getNbinsX(); ++binx) {
+        EXPECT_EQ(1, h1->getBinNumberOfEntries(binx));
+        EXPECT_EQ(2.0, h1->getBinContent(binx));
+        EXPECT_DOUBLE_EQ(0.0, h1->getBinError(binx));
+    }
+
+    // c) create projection along X for y between [ylow, yup]
+    h1.reset(hist->projectionX(0.99, 1.01));
+    EXPECT_EQ(hist->getXmin(), h1->getXmin());
+    EXPECT_EQ(hist->getXmax(), h1->getXmax());
+    EXPECT_EQ(hist->getNbinsX(), h1->getNbinsX());
+    EXPECT_EQ(hist->getXaxisValue(0), h1->getXaxisValue(0));
+    EXPECT_EQ(hist->getXaxisValue(3), h1->getXaxisValue(1));
+    EXPECT_EQ(hist->getXaxisValue(6), h1->getXaxisValue(2));
+    EXPECT_EQ(hist->getXaxisValue(9), h1->getXaxisValue(3));
+
+    // check content of projections
+    for(size_t binx=0; binx<h1->getNbinsX(); ++binx) {
+        EXPECT_EQ(2, h1->getBinNumberOfEntries(binx));
+        EXPECT_EQ(3.0, h1->getBinContent(binx));
+        EXPECT_DOUBLE_EQ(std::sqrt(0.25), h1->getBinError(binx));
+    }
+}
+
+// y
+// 4.0   -----------------------------------
+//       |     |          |     |          |
+//       |  2  |    5     |  8  |    11    |
+// 2.0   -----------------------------------
+//       |  1  |    4     |  7  |    10    |
+// 1.0   -----------------------------------
+//       |  0  |    3     |  6  |    9     |
+// 0.0   -----------------------------------
+//     -1.0  -0.5        0.5   1.0        2.0  X
+
+
+TEST_F(Histogram2DTest, projectionY)
+{
+    hist->reset();
+
+    // values to fill all histogram
+    std::vector<double> xvalues = {-0.75, -0.75, -0.75, 0.0, 0.0, 0.0,
+                                   0.75, 0.75, 0.75, 1.5, 1.5, 1.5};
+    std::vector<double> yvalues = {0.5, 1.5, 3.0, 0.5, 1.5, 3.0,
+                                   0.5, 1.5, 3.0, 0.5, 1.5, 3.0};
+    std::vector<double> content = {1.0, 2.0, 3.0, 1.0, 2.0, 3.0,
+                                   1.0, 2.0, 3.0, 1.0, 2.0, 3.0};
+
+    // put in every histogram bin the value from 'content' vector
+    for(size_t i=0; i<xvalues.size(); ++i) {
+        hist->fill(xvalues[i], yvalues[i], content[i]);
+    }
+
+    // a) create projection along Y axis
+    std::unique_ptr<Histogram1D > h1(hist->projectionY());
+    EXPECT_EQ(hist->getYmin(), h1->getXmin());
+    EXPECT_EQ(hist->getYmax(), h1->getXmax());
+    EXPECT_EQ(size_t(3), h1->getNbinsX());
+    EXPECT_EQ(hist->getNbinsY(), h1->getNbinsX());
+    EXPECT_EQ(hist->getYaxisValue(3), h1->getXaxisValue(0));
+    EXPECT_EQ(hist->getYaxisValue(4), h1->getXaxisValue(1));
+    EXPECT_EQ(hist->getYaxisValue(5), h1->getXaxisValue(2));
+
+    // check content of projections
+
+    for(size_t binx=0; binx<h1->getNbinsX(); ++binx) {
+        EXPECT_EQ(4, h1->getBinNumberOfEntries(binx));
+        EXPECT_DOUBLE_EQ(0.0, h1->getBinError(binx));
+    }
+    EXPECT_EQ( 4.0, h1->getBinContent(0));
+    EXPECT_EQ( 8.0, h1->getBinContent(1));
+    EXPECT_EQ(12.0, h1->getBinContent(2));
+
+    // b) create projection along Y axis at given x(slice)
+    h1.reset(hist->projectionY(0.0));
+    EXPECT_EQ(hist->getYmin(), h1->getXmin());
+    EXPECT_EQ(hist->getYmax(), h1->getXmax());
+    EXPECT_EQ(size_t(3), h1->getNbinsX());
+    EXPECT_EQ(hist->getNbinsY(), h1->getNbinsX());
+    EXPECT_EQ(hist->getYaxisValue(3), h1->getXaxisValue(0));
+    EXPECT_EQ(hist->getYaxisValue(4), h1->getXaxisValue(1));
+    EXPECT_EQ(hist->getYaxisValue(5), h1->getXaxisValue(2));
+
+    // check content of projections
+
+    for(size_t binx=0; binx<h1->getNbinsX(); ++binx) {
+        EXPECT_EQ(1, h1->getBinNumberOfEntries(binx));
+        EXPECT_DOUBLE_EQ(0.0, h1->getBinError(binx));
+    }
+    EXPECT_EQ(1.0, h1->getBinContent(0));
+    EXPECT_EQ(2.0, h1->getBinContent(1));
+    EXPECT_EQ(3.0, h1->getBinContent(2));
+
+    // c) create projection along Y axis for x's between [xlow,xup]
+    h1.reset(hist->projectionY(0.0, 0.51));
+    EXPECT_EQ(hist->getYmin(), h1->getXmin());
+    EXPECT_EQ(hist->getYmax(), h1->getXmax());
+    EXPECT_EQ(size_t(3), h1->getNbinsX());
+    EXPECT_EQ(hist->getNbinsY(), h1->getNbinsX());
+    EXPECT_EQ(hist->getYaxisValue(3), h1->getXaxisValue(0));
+    EXPECT_EQ(hist->getYaxisValue(4), h1->getXaxisValue(1));
+    EXPECT_EQ(hist->getYaxisValue(5), h1->getXaxisValue(2));
+
+    // check content of projections
+
+    for(size_t binx=0; binx<h1->getNbinsX(); ++binx) {
+        EXPECT_EQ(2, h1->getBinNumberOfEntries(binx));
+        EXPECT_DOUBLE_EQ(0.0, h1->getBinError(binx));
+    }
+    EXPECT_EQ(2.0, h1->getBinContent(0));
+    EXPECT_EQ(4.0, h1->getBinContent(1));
+    EXPECT_EQ(6.0, h1->getBinContent(2));
+}
+
+// y
+// 4.0   -----------------------------------
+//       |     |          |     |          |
+//       |  2  |    5     |  8  |    11    |
+// 2.0   -----------------------------------
+//       |  1  |    4     |  7  |    10    |
+// 1.0   -----------------------------------
+//       |  0  |    3     |  6  |    9     |
+// 0.0   -----------------------------------
+//     -1.0  -0.5        0.5   1.0        2.0  X
+
+
+TEST_F(Histogram2DTest, crop)
+{
+    hist->reset();
+
+    // values to fill all histogram
+    std::vector<double> xvalues = {-0.75, -0.75, -0.75, 0.0, 0.0, 0.0,
+                                   0.75, 0.75, 0.75, 1.5, 1.5, 1.5};
+    std::vector<double> yvalues = {0.5, 1.5, 3.0, 0.5, 1.5, 3.0,
+                                   0.5, 1.5, 3.0, 0.5, 1.5, 3.0};
+    std::vector<double> content = {1.0, 2.0, 3.0, 1.0, 2.0, 3.0,
+                                   1.0, 2.0, 3.0, 1.0, 2.0, 3.0};
+
+    // put in every histogram bin the value from 'content' vector
+    for(size_t i=0; i<xvalues.size(); ++i) {
+        hist->fill(xvalues[i], yvalues[i], content[i]);
+    }
+
+    std::unique_ptr<Histogram2D > crop(hist->crop(-0.49, 0.0, 1.99,1.9));
+    EXPECT_EQ(-0.5, crop->getXmin());
+    EXPECT_EQ(2.0, crop->getXmax());
+    EXPECT_EQ(size_t(3), crop->getNbinsX());
+    EXPECT_EQ(0.0, crop->getYmin());
+    EXPECT_EQ(2.0, crop->getYmax());
+    EXPECT_EQ(size_t(2), crop->getNbinsY());
+
+    EXPECT_EQ(1.0, crop->getBinContent(0,0));
+    EXPECT_EQ(2.0, crop->getBinContent(0,1));
+    EXPECT_EQ(1.0, crop->getBinContent(1,0));
+    EXPECT_EQ(2.0, crop->getBinContent(1,1));
+    EXPECT_EQ(1.0, crop->getBinContent(2,0));
+    EXPECT_EQ(2.0, crop->getBinContent(2,1));
+}
+
+TEST_F(Histogram2DTest, CreateHistogram)
+{
+    OutputData<double> data;
+    data.addAxis("x-axis", 10, 0.0, 10.0);
+    data.addAxis("y-axis", 5, -5.0, 0.0);
+    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+        data[i] = double(i);
+    }
+
+    std::unique_ptr<IHistogram> hist(IHistogram::createHistogram(data));
+    EXPECT_EQ(size_t(2), hist->getRank());
+    EXPECT_EQ(data.getAllocatedSize(), hist->getTotalNumberOfBins());
+    EXPECT_EQ(data.getAxis(0).getMin(), hist->getXmin());
+    EXPECT_EQ(data.getAxis(0).getMax(), hist->getXmax());
+    EXPECT_EQ(data.getAxis(1).getMin(), hist->getYmin());
+    EXPECT_EQ(data.getAxis(1).getMax(), hist->getYmax());
+    for(size_t i=0; i<hist->getTotalNumberOfBins(); ++i) {
+        EXPECT_EQ(data[i], hist->getBinContent(i));
+        EXPECT_EQ(data[i], hist->getBinAverage(i));
+        EXPECT_EQ(1, hist->getBinNumberOfEntries(i));
+        EXPECT_EQ(0.0, hist->getBinError(i));
+    }
+}
+
+TEST_F(Histogram2DTest, CreateOutputData)
+{
+    Histogram2D hist(10, -5.0, 5.0, 5, -5.0, 0.0);
+
+    for(size_t nx=0; nx<hist.getNbinsX(); ++nx) {
+        for(size_t ny=0; ny<hist.getNbinsY(); ++ny) {
+            double value(ny + nx*hist.getNbinsY());
+            size_t globalbin = hist.getGlobalBin(nx, ny);
+            hist.fill(hist.getXaxisValue(globalbin), hist.getYaxisValue(globalbin), value);
+        }
+    }
+
+    std::unique_ptr<OutputData<double> > data(hist.createOutputData(IHistogram::DataType::INTEGRAL));
+    EXPECT_EQ(size_t(2), data->getRank());
+    EXPECT_EQ(data->getAllocatedSize(), hist.getTotalNumberOfBins());
+    EXPECT_EQ(data->getAxis(0).getMin(), hist.getXmin());
+    EXPECT_EQ(data->getAxis(0).getMax(), hist.getXmax());
+    EXPECT_EQ(data->getAxis(1).getMin(), hist.getYmin());
+    EXPECT_EQ(data->getAxis(1).getMax(), hist.getYmax());
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(double(i), (*data)[i]);
+    }
+
+    data.reset(hist.createOutputData(IHistogram::DataType::AVERAGE));
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(double(i), (*data)[i]);
+    }
+
+    data.reset(hist.createOutputData(IHistogram::DataType::STANDARD_ERROR));
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(0.0, (*data)[i]);
+    }
+
+    data.reset(hist.createOutputData(IHistogram::DataType::NENTRIES));
+    for(size_t i=0; i<data->getAllocatedSize(); ++i) {
+        EXPECT_EQ(1.0, (*data)[i]);
+    }
+}
+
+
+TEST_F(Histogram2DTest, GetMaximumGetMinimum)
+{
+    Histogram2D hist(10, -5.0, 5.0, 5, -5.0, 0.0);
+
+    for(size_t ix=0; ix<hist.getNbinsX(); ++ix) {
+        for(size_t iy=0; iy<hist.getNbinsY(); ++iy) {
+            hist.fill(-5.0 + ix+0.5, -5.0 + iy+0.5, 10.0 + ix + hist.getNbinsX()*iy);
+        }
+    }
+
+    EXPECT_EQ(10.0, hist.getMinimum());
+    EXPECT_EQ(size_t(0), hist.getMinimumBinIndex());
+    EXPECT_EQ(59.0, hist.getMaximum());
+    EXPECT_EQ(size_t(49), hist.getMaximumBinIndex());
+}
+
+#endif // HISTOGRAM2DTEST_H
diff --git a/Tests/UnitTests/Core/0/KVectorTest.h b/Tests/UnitTests/Core/0/KVectorTest.h
new file mode 100644
index 0000000..afe2100
--- /dev/null
+++ b/Tests/UnitTests/Core/0/KVectorTest.h
@@ -0,0 +1,131 @@
+#ifndef KVECTORTEST_H
+#define KVECTORTEST_H
+
+#include "Vectors3D.h"
+#include "Transform3D.h"
+
+class KVectorTest : public ::testing::Test
+{
+ protected:
+    KVectorTest() {}
+    virtual ~KVectorTest() {}
+};
+
+TEST_F(KVectorTest, BasicMethods)
+{
+    kvector_t v;
+    EXPECT_EQ( double(0), v.x()); EXPECT_EQ( double(0), v.y()); EXPECT_EQ( double(0), v.z());
+    kvector_t v2(1.,2.,3.);
+    EXPECT_EQ( double(1.), v2.x()); EXPECT_EQ( double(2.), v2.y()); EXPECT_EQ( double(3.), v2.z());
+    v2.setX(10.); v2.setY(20.); v2.setZ(30.);
+    EXPECT_EQ( double(10.), v2.x()); EXPECT_EQ( double(20.), v2.y()); EXPECT_EQ( double(30.), v2.z());
+    v2.setXYZ(1., 2., 3.);
+    EXPECT_EQ( double(1.), v2.x()); EXPECT_EQ( double(2.), v2.y()); EXPECT_EQ( double(3.), v2.z());
+
+    kvector_t v3(1.,2.,3.);
+    EXPECT_DOUBLE_EQ( v3.mag2(), 1*1+2*2+3*3);
+    EXPECT_DOUBLE_EQ( v3.mag2(), v3.mag()*v3.mag());
+    EXPECT_DOUBLE_EQ( v3.magxy2(), 1*1+2*2);
+    EXPECT_DOUBLE_EQ( v3.magxy2(), v3.magxy()*v3.magxy());
+    EXPECT_DOUBLE_EQ( v3.magxy(), std::sqrt(1*1+2*2) );
+    EXPECT_DOUBLE_EQ( v3.mag(), std::sqrt(1*1+2*2+3*3) );
+}
+
+
+TEST_F(KVectorTest, BasicArithmetics)
+{
+    // assignment, self assignment, copy constructor
+    kvector_t v1;
+    kvector_t v2(v1);
+    EXPECT_EQ( double(0), v2.x()); EXPECT_EQ( double(0), v2.y()); EXPECT_EQ( double(0), v2.z());
+    v2.setXYZ(1., 2., 3.);
+    v2=v2;
+    EXPECT_EQ( double(1), v2.x()); EXPECT_EQ( double(2), v2.y()); EXPECT_EQ( double(3), v2.z());
+    kvector_t v3(v2);
+    EXPECT_EQ( double(1), v3.x()); EXPECT_EQ( double(2), v3.y()); EXPECT_EQ( double(3), v3.z());
+    kvector_t v4 = v3;
+    EXPECT_EQ( double(1), v4.x()); EXPECT_EQ( double(2), v4.y()); EXPECT_EQ( double(3), v4.z());
+    // +=
+    kvector_t a(1., 2., 3.);
+    kvector_t b(10., 20., 30.);
+    a+=b;
+    EXPECT_EQ( double(11), a.x()); EXPECT_EQ( double(22), a.y()); EXPECT_EQ( double(33), a.z());
+    EXPECT_EQ( double(10), b.x()); EXPECT_EQ( double(20), b.y()); EXPECT_EQ( double(30), b.z());
+    a = kvector_t(1., 2., 3.);
+    a+=a;
+    EXPECT_EQ( double(2.), a.x()); EXPECT_EQ( double(4.), a.y()); EXPECT_EQ( double(6.), a.z());
+    // -=
+    a = kvector_t(1., 2., 3.);
+    a-=a;
+    EXPECT_EQ( double(0.), a.x()); EXPECT_EQ( double(0.), a.y()); EXPECT_EQ( double(0.), a.z());
+    b = kvector_t(1., 2., 3.);
+    a-=b;
+    EXPECT_EQ( double(-1.), a.x()); EXPECT_EQ( double(-2.), a.y()); EXPECT_EQ( double(-3.), a.z());
+    // *= and /= with scalar
+    a *= 10.0;
+    EXPECT_EQ( double(-10.), a.x()); EXPECT_EQ( double(-20.), a.y()); EXPECT_EQ( double(-30.), a.z());
+    a /= 10.;
+    EXPECT_EQ( double(-1.), a.x()); EXPECT_EQ( double(-2.), a.y()); EXPECT_EQ( double(-3.), a.z());
+    // unary minus
+    a = kvector_t(1., 2., 3.);
+    b = -a;
+    EXPECT_EQ( double(1.), a.x()); EXPECT_EQ( double(2.), a.y()); EXPECT_EQ( double(3.), a.z() );
+    EXPECT_EQ( double(-1.), b.x()); EXPECT_EQ( double(-2.), b.y()); EXPECT_EQ( double(-3.), b.z() );
+    // addition of two vector
+    a = kvector_t(1., 2., 3.);
+    b = kvector_t(10., 20., 30.);
+    kvector_t c =  a + b;
+    EXPECT_EQ( double(1.), a.x()); EXPECT_EQ( double(2.), a.y()); EXPECT_EQ( double(3.), a.z() );
+    EXPECT_EQ( double(10.), b.x()); EXPECT_EQ( double(20.), b.y()); EXPECT_EQ( double(30.), b.z() );
+    EXPECT_EQ( double(11.), c.x()); EXPECT_EQ( double(22.), c.y()); EXPECT_EQ( double(33.), c.z() );
+    // substraction of two vectors
+    c = b - a;
+    EXPECT_EQ( double(9.), c.x()); EXPECT_EQ( double(18.), c.y()); EXPECT_EQ( double(27.), c.z() );
+    // multiplication by a scalar
+    a.setXYZ(1., 2., 3.);
+    c = 2*a*2;
+    EXPECT_EQ( double(1.), a.x()); EXPECT_EQ( double(2.), a.y()); EXPECT_EQ( double(3.), a.z() );
+    EXPECT_EQ( double(4.), c.x()); EXPECT_EQ( double(8.), c.y()); EXPECT_EQ( double(12.), c.z() );
+    // scalar product of two vectors
+    a.setXYZ(1., 2., 3.);
+    b.setXYZ(10., 10., 10.);
+    EXPECT_EQ( double(60), a.dot(b) );
+    // crossproduct
+    c = a.cross(b);
+    EXPECT_EQ(c.x(), a.y()*b.z() - a.z()*b.y());
+    EXPECT_EQ(c.y(), a.z()*b.x() - a.x()*b.z());
+    EXPECT_EQ(c.z(), a.x()*b.y() - a.y()*b.x());
+    // equality
+    a.setXYZ(1.,2.,3.);
+    EXPECT_TRUE( a == kvector_t(1., 2., 3.) );
+    EXPECT_TRUE( a != kvector_t(1., 1., 3.) );
+}
+
+
+TEST_F(KVectorTest, BasicTransformation)
+{
+    const double epsilon=1e-12;
+    kvector_t a, v;
+
+    // rotation via transformation
+    a = kvector_t(std::sqrt(3.)/2., 2., 0.5);
+    Transform3D m2 = Transform3D::createRotateY(M_PI/6.);
+    v = m2.transformed(a);
+    ASSERT_NEAR(      v.x(), 1.0, epsilon );
+    EXPECT_DOUBLE_EQ( v.y(), 2.0 );
+    ASSERT_NEAR(      v.z(), 0.0, epsilon );
+
+    a = kvector_t(0.5, std::sqrt(3.)/2., 2.);
+    Transform3D m3 = Transform3D::createRotateZ(M_PI/6.);
+    v = m3.transformed(a);
+    ASSERT_NEAR(      v.x(), 0.0, epsilon );
+    ASSERT_NEAR(      v.y(), 1.0, epsilon );
+    EXPECT_DOUBLE_EQ( v.z(), 2.0 );
+    Transform3D m4 = m3.getInverse();
+    v = m4.transformed(v);
+    ASSERT_NEAR( v.x(), a.x(), epsilon );
+    ASSERT_NEAR( v.y(), a.y(), epsilon );
+    ASSERT_NEAR( v.z(), a.z(), epsilon );
+}
+
+#endif // KVECTORTEST_H
diff --git a/Tests/UnitTests/Core/0/LabelMapTest.h b/Tests/UnitTests/Core/0/LabelMapTest.h
new file mode 100644
index 0000000..4c1bd26
--- /dev/null
+++ b/Tests/UnitTests/Core/0/LabelMapTest.h
@@ -0,0 +1,156 @@
+#ifndef LABELMAPTEST_H
+#define LABELMAPTEST_H
+
+#include "SampleLabelHandler.h"
+#include "INamed.h"
+#include <map>
+#include <iostream>
+#include <memory>
+
+class LabelMapTest : public ::testing::Test
+{
+protected:
+    LabelMapTest(){}
+    virtual ~LabelMapTest(){}
+};
+
+TEST_F(LabelMapTest, LabelMapInsert)
+{
+    LabelMap<int> omap;
+    EXPECT_EQ( size_t(0), omap.size());
+
+    std::vector<int> keys = {3, 2, 1};
+    std::vector<std::string> values = {"aaa", "bbb", "ccc"};
+
+    omap.insert(keys[0], values[0]);
+    omap.insert(keys[1], values[1]);
+    omap.insert(keys[2], values[2]);
+    EXPECT_EQ( size_t(3), omap.size());
+
+    // check that <key,value> are stored in the order of insertion and that there is no sorting
+    // along key as in normal map
+    int npos(0);
+    for(LabelMap<int>::const_iterator it = omap.begin(); it!= omap.end(); ++it) {
+        EXPECT_EQ(keys[npos], it->first);
+        EXPECT_EQ(values[npos], it->second);
+        npos++;
+    }
+
+    omap.clear();
+    EXPECT_EQ( size_t(0), omap.size());
+}
+
+TEST_F(LabelMapTest, LabelMapErase)
+{
+    LabelMap<std::string> omap;
+
+    std::vector<std::string> keys = {"ccc", "bbb", "aaa"};
+    std::vector<std::string> values = {"2.0", "1.0", "3.0"};
+
+    omap.insert(keys[0], values[0]);
+    omap.insert(keys[1], values[1]);
+    omap.insert(keys[2], values[2]);
+
+    int npos(0);
+    for(LabelMap<std::string>::const_iterator it = omap.begin(); it!= omap.end(); ++it) {
+        EXPECT_EQ(keys[npos], it->first);
+        EXPECT_EQ(values[npos], it->second);
+        npos++;
+    }
+
+    EXPECT_EQ(size_t(3), omap.size());
+
+    omap.erase("ddd");
+    EXPECT_EQ(size_t(3), omap.size());
+
+    omap.erase("bbb");
+    EXPECT_EQ(size_t(2), omap.size());
+
+    keys = {"ccc", "aaa"};
+    values = {"2.0", "3.0"};
+    npos = 0;
+    for(LabelMap<std::string>::const_iterator it = omap.begin(); it!= omap.end(); ++it) {
+        EXPECT_EQ(keys[npos], it->first);
+        EXPECT_EQ(values[npos], it->second);
+        npos++;
+    }
+
+    omap.erase("ccc");
+    omap.erase("aaa");
+    EXPECT_EQ(size_t(0), omap.size());
+
+    omap.insert("ddd", "99.0");
+    EXPECT_EQ(size_t(1), omap.size());
+}
+
+TEST_F(LabelMapTest, LabelMapGetValue)
+{
+    LabelMap<const INamed*> omap;
+
+    INamed *key1 = new INamed("key1");
+    INamed *key2 = new INamed("key2");
+    INamed *key3 = new INamed("key3");
+    std::string val1 = "val1";
+    std::string val2 = "val2";
+    std::string val3 = "val3";
+
+    omap.insert(key1, val1);
+    omap.insert(key2, val2);
+    omap.insert(key3, val3);
+
+    EXPECT_EQ(omap.value(key1), val1);
+    EXPECT_EQ(omap.value(key2), val2);
+    EXPECT_EQ(omap.value(key3), val3);
+
+    delete key1; delete key2; delete key3;
+}
+
+TEST_F(LabelMapTest, LabelMapFind)
+{
+    LabelMap<const INamed*> omap;
+
+    INamed *n1 = new INamed("named1");
+    INamed *n2 = new INamed("named2");
+    INamed *n3 = new INamed("named3");
+    INamed *n4 = new INamed("named4");
+
+    omap.insert(n1, "aaa");
+    omap.insert(n2, "bbb");
+    omap.insert(n3, "ccc");
+    EXPECT_EQ( size_t(3), omap.size());
+
+    EXPECT_EQ(omap.find(n1)->first, n1);
+    EXPECT_EQ(omap.find(n1)->first->getName(), "named1");
+    EXPECT_EQ(omap.find(n1)->second, std::string("aaa"));
+
+    EXPECT_EQ(omap.find(n2)->first, n2);
+    EXPECT_EQ(omap.find(n2)->first->getName(), "named2");
+    EXPECT_EQ(omap.find(n2)->second, std::string("bbb"));
+
+    EXPECT_EQ(omap.find(n3)->first, n3);
+    EXPECT_EQ(omap.find(n3)->first->getName(), "named3");
+    EXPECT_EQ(omap.find(n3)->second, std::string("ccc"));
+
+    EXPECT_EQ(omap.find(n4), omap.end());
+
+    delete n1; delete n2; delete n3; delete n4;
+}
+
+TEST_F(LabelMapTest, LabelMapReInsert)
+{
+    std::unique_ptr<INamed> P_n1(new INamed("named1"));
+    std::unique_ptr<INamed> P_n2(new INamed("named2"));
+    std::unique_ptr<INamed> P_n3(new INamed("named3"));
+
+    LabelMap<INamed *> omap;
+    omap.insert(P_n1.get(), "1.0");
+    omap.insert(P_n2.get(), "2.0");
+    omap.insert(P_n3.get(), "3.0");
+    EXPECT_EQ(omap.size(), size_t(3));
+
+    omap.insert(P_n2.get(), "99.0");
+    EXPECT_EQ(omap.size(), size_t(3));
+    EXPECT_EQ(omap.value(P_n2.get()), "99.0");
+}
+
+#endif // LABELMAPTEST_H
diff --git a/Tests/UnitTests/Core/0/VariableBinAxisTest.h b/Tests/UnitTests/Core/0/VariableBinAxisTest.h
new file mode 100644
index 0000000..5ec3972
--- /dev/null
+++ b/Tests/UnitTests/Core/0/VariableBinAxisTest.h
@@ -0,0 +1,258 @@
+#ifndef VARIABLEBINAXISTEST_H
+#define VARIABLEBINAXISTEST_H
+
+#include "VariableBinAxis.h"
+#include "OutputDataIOHelper.h"
+
+class VariableBinAxisTest: public ::testing::Test
+{
+protected:
+    VariableBinAxisTest() {}
+
+};
+
+TEST_F(VariableBinAxisTest, VectorOfUnitLength)
+{
+    static const double arr[] = {0., 1.};
+    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+    VariableBinAxis axis("name", 1, values);
+    EXPECT_EQ("name", axis.getName());
+    EXPECT_EQ(size_t(1), axis.size());
+    EXPECT_EQ(0.0, axis.getMin());
+    EXPECT_EQ(1.0, axis.getMax());
+    EXPECT_EQ(0.5, axis[0]);
+}
+
+
+TEST_F(VariableBinAxisTest, ValidityOfCOnstructor)
+{
+    std::vector<double> values;
+    ASSERT_THROW( VariableBinAxis("name",1,values), Exceptions::LogicErrorException);
+    values.resize(5);
+    ASSERT_THROW( VariableBinAxis("name",5,values), Exceptions::LogicErrorException);
+
+    static const double arr1[] = {-1.5, -1.5, 0.5, 1.5};
+    std::vector<double> v1 (arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]) );
+    ASSERT_THROW( VariableBinAxis("name", 3, v1), Exceptions::LogicErrorException);
+
+    static const double arr2[] = {1.5, -0.5, 0.5, -1.5};
+    std::vector<double> v2 (arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]) );
+    ASSERT_THROW( VariableBinAxis("name", 3, v2), Exceptions::LogicErrorException);
+
+}
+
+
+TEST_F(VariableBinAxisTest, IndexedAccessor)
+{
+    std::vector<double> values;
+
+    double start(0.0);
+    double end(10.0);
+    size_t nbins(100);
+    double step = (end - start)/(nbins);
+    for (size_t i=0; i<nbins+1; ++i)
+    {
+        values.push_back(start + step*(int)i);
+    }
+
+    VariableBinAxis a1("name", nbins, values);
+
+    ASSERT_EQ(100u, a1.size());
+    EXPECT_EQ(0.0, a1.getMin());
+    EXPECT_EQ(10.0, a1.getMax());
+    EXPECT_DOUBLE_EQ(0.05, a1[0]);
+    EXPECT_DOUBLE_EQ(0.15, a1[1]);
+    EXPECT_DOUBLE_EQ(6.55, a1[65]);
+    EXPECT_DOUBLE_EQ(9.95, a1[99]);
+
+    static const double arr[] = {-1.5, -0.5, 0.5, 1.5};
+    std::vector<double> v2 (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+    VariableBinAxis a2("name", 3, v2);
+    EXPECT_DOUBLE_EQ(-1.0, a2[0]);
+    EXPECT_DOUBLE_EQ(0.0, a2[1]);
+    EXPECT_DOUBLE_EQ(1.0, a2[2]);
+    ASSERT_THROW( a2[3], Exceptions::OutOfBoundsException);
+}
+
+
+TEST_F(VariableBinAxisTest, FindClosestIndex)
+{
+    static const double arr1[] = {0.0, 0.5, 1.0};
+    std::vector<double> values1 (arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]) );
+
+    VariableBinAxis v1("name", 2, values1);
+    EXPECT_EQ( size_t(2), v1.size());
+    EXPECT_EQ( size_t(0), v1.findClosestIndex(0.0));
+    EXPECT_EQ( size_t(0), v1.findClosestIndex(0.25));
+    EXPECT_EQ( size_t(1), v1.findClosestIndex(0.5));
+    EXPECT_EQ( size_t(1), v1.findClosestIndex(0.6));
+//    ASSERT_THROW( v1.findClosestIndex(1.0), Exceptions::OutOfBoundsException);
+    EXPECT_EQ( size_t(1), v1.findClosestIndex(1.0));
+
+    static const double arr2[] = {-1.5, -0.5, 0.5, 1.5};
+    std::vector<double> values2 (arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]) );
+    VariableBinAxis v2("name", 3, values2);
+    EXPECT_EQ(size_t(0), v2.findClosestIndex(-1.5));
+    EXPECT_EQ(size_t(0), v2.findClosestIndex(-1.0));
+    EXPECT_EQ(size_t(1), v2.findClosestIndex(-0.5));
+    EXPECT_EQ(size_t(1), v2.findClosestIndex(0.0));
+    EXPECT_EQ(size_t(2), v2.findClosestIndex(0.5));
+    EXPECT_EQ(size_t(2), v2.findClosestIndex(1.499));
+//    ASSERT_THROW( v2.findClosestIndex(1.5), Exceptions::OutOfBoundsException);
+    EXPECT_EQ(size_t(2), v2.findClosestIndex(1.5));
+
+    static const double arr3[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values3 (arr3, arr3 + sizeof(arr3) / sizeof(arr2[0]) );
+    VariableBinAxis v3("name", 4, values3);
+    EXPECT_EQ(size_t(0), v3.findClosestIndex(-1.0));
+    EXPECT_EQ(size_t(0), v3.findClosestIndex(-0.75));
+    EXPECT_EQ(size_t(0), v3.findClosestIndex(-0.51));
+    EXPECT_EQ(size_t(1), v3.findClosestIndex(-0.5));
+    EXPECT_EQ(size_t(1), v3.findClosestIndex(0.1));
+    EXPECT_EQ(size_t(1), v3.findClosestIndex(0.4999));
+    EXPECT_EQ(size_t(2), v3.findClosestIndex(0.5));
+    EXPECT_EQ(size_t(2), v3.findClosestIndex(0.99999));
+    EXPECT_EQ(size_t(3), v3.findClosestIndex(1.0));
+    EXPECT_EQ(size_t(3), v3.findClosestIndex(1.9999));
+}
+
+
+TEST_F(VariableBinAxisTest, CheckBin)
+{
+    static const double arr3[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values3 (arr3, arr3 + sizeof(arr3) / sizeof(arr3[0]) );
+    VariableBinAxis axis("name", 4, values3);
+    EXPECT_DOUBLE_EQ( -1.0,  axis.getBin(0).m_lower);
+    EXPECT_DOUBLE_EQ( -0.75, axis.getBin(0).getMidPoint());
+    EXPECT_DOUBLE_EQ( -0.5,  axis.getBin(0).m_upper);
+    EXPECT_DOUBLE_EQ( 0.5,   axis.getBin(0).getBinSize());
+
+    EXPECT_DOUBLE_EQ( -0.5,  axis.getBin(1).m_lower);
+    EXPECT_DOUBLE_EQ( 0.0,   axis.getBin(1).getMidPoint());
+    EXPECT_DOUBLE_EQ( 0.5,   axis.getBin(1).m_upper);
+    EXPECT_DOUBLE_EQ( 1.0,   axis.getBin(1).getBinSize());
+
+    EXPECT_DOUBLE_EQ( 0.5,   axis.getBin(2).m_lower);
+    EXPECT_DOUBLE_EQ( 0.75,  axis.getBin(2).getMidPoint());
+    EXPECT_DOUBLE_EQ( 1.0,   axis.getBin(2).m_upper);
+    EXPECT_DOUBLE_EQ( 0.5,   axis.getBin(2).getBinSize());
+
+    EXPECT_DOUBLE_EQ( 1.0,   axis.getBin(3).m_lower);
+    EXPECT_DOUBLE_EQ( 1.5,   axis.getBin(3).getMidPoint());
+    EXPECT_DOUBLE_EQ( 2.0,   axis.getBin(3).m_upper);
+    EXPECT_DOUBLE_EQ( 1.0,   axis.getBin(3).getBinSize());
+}
+
+
+TEST_F(VariableBinAxisTest, CheckEquality)
+{
+    static const double arr3[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values3 (arr3, arr3 + sizeof(arr3) / sizeof(arr3[0]) );
+
+    VariableBinAxis a1("name", 4, values3);
+    VariableBinAxis a2("name", 4, values3);
+    VariableBinAxis a3("nameX", 4, values3);
+    EXPECT_TRUE( a1 == a2);
+    EXPECT_FALSE( a1 == a3);
+
+    static const double arr4[] = {-1.0, -0.5, 0.5, 1.1, 2.0};
+    std::vector<double> values4 (arr4, arr4 + sizeof(arr4) / sizeof(arr4[0]) );
+    VariableBinAxis a4("nameX", 4, values4);
+    EXPECT_FALSE( a1 == a4);
+}
+
+
+TEST_F(VariableBinAxisTest, CheckClone)
+{
+    static const double arr3[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values3 (arr3, arr3 + sizeof(arr3) / sizeof(arr3[0]) );
+    VariableBinAxis a1("name", 4, values3);
+
+    VariableBinAxis *clone=a1.clone();
+    EXPECT_TRUE(a1 == *clone);
+    delete clone;
+}
+
+
+TEST_F(VariableBinAxisTest, IOStream)
+{
+    static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+    VariableBinAxis axis("name", 4, values);
+
+    std::ostringstream oss;
+    oss << axis;
+
+    VariableBinAxis *result = dynamic_cast<VariableBinAxis *>(OutputDataIOHelper::createVariableBinAxis(oss.str()));
+    EXPECT_TRUE(axis == *result);
+    delete result;
+}
+
+
+TEST_F(VariableBinAxisTest, BinCenters)
+{
+    static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+    VariableBinAxis axis("name", 4, values);
+
+    std::vector<double> centers = axis.getBinCenters();
+    EXPECT_EQ(size_t(4), centers.size());
+    EXPECT_DOUBLE_EQ(-0.75, centers[0]);
+    EXPECT_DOUBLE_EQ(0.0, centers[1]);
+    EXPECT_DOUBLE_EQ(0.75, centers[2]);
+    EXPECT_DOUBLE_EQ(1.5, centers[3]);
+}
+
+
+TEST_F(VariableBinAxisTest, BinBoundaries)
+{
+    static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+    VariableBinAxis axis("name", 4, values);
+
+    std::vector<double> boundaries = axis.getBinBoundaries();
+    EXPECT_EQ(size_t(5), boundaries.size());
+    EXPECT_DOUBLE_EQ(-1.0, boundaries[0]);
+    EXPECT_DOUBLE_EQ(-0.5, boundaries[1]);
+    EXPECT_DOUBLE_EQ(0.5, boundaries[2]);
+    EXPECT_DOUBLE_EQ(1.0, boundaries[3]);
+    EXPECT_DOUBLE_EQ(2.0, boundaries[4]);
+}
+
+TEST_F(VariableBinAxisTest, ClippedAxis)
+{
+    static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+    VariableBinAxis axis("name", 4, values);
+
+    VariableBinAxis *clip1 = axis.createClippedAxis(-1.0, 2.0);
+    EXPECT_TRUE(axis == *clip1);
+    delete clip1;
+
+    VariableBinAxis *clip2 = axis.createClippedAxis(-0.5, 1.5);
+    EXPECT_EQ(clip2->size(), size_t(3));
+    EXPECT_EQ(clip2->getMin(), -0.5);
+    EXPECT_EQ(clip2->getMax(), 2.0);
+    std::vector<double> centers = clip2->getBinCenters();
+    EXPECT_EQ(centers[0], 0.0);
+    EXPECT_EQ(centers[1], 0.75);
+    EXPECT_EQ(centers[2], 1.5);
+    EXPECT_TRUE(axis != *clip2);
+    delete clip2;
+
+    VariableBinAxis *clip3 = axis.createClippedAxis(-0.5, 0.99);
+    EXPECT_EQ(clip3->size(), size_t(2));
+    EXPECT_EQ(clip3->getMin(), -0.5);
+    EXPECT_EQ(clip3->getMax(), 1.0);
+    std::vector<double> boundaries = clip3->getBinBoundaries();
+    EXPECT_EQ(boundaries[0], -0.5);
+    EXPECT_EQ(boundaries[1], 0.5);
+    EXPECT_EQ(boundaries[2], 1.0);
+    delete clip3;
+
+
+}
+
+
+
+#endif // VARIABLEBINAXISTEST_H
diff --git a/Tests/UnitTests/Core/0/main.cpp b/Tests/UnitTests/Core/0/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/0/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/0/testlist.h b/Tests/UnitTests/Core/0/testlist.h
new file mode 100644
index 0000000..f7c9049
--- /dev/null
+++ b/Tests/UnitTests/Core/0/testlist.h
@@ -0,0 +1,11 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "CustomBinAxisTest.h"
+#include "LabelMapTest.h"
+#include "Histogram1DTest.h"
+#include "VariableBinAxisTest.h"
+#include "Histogram2DTest.h"
+#include "KVectorTest.h"
+#include "ConstKBinAxisTest.h"
+#include "FixedBinAxisTest.h"
+#include "CVectorTest.h"
diff --git a/Tests/UnitTests/Core/1/FormFactorBasicTest.h b/Tests/UnitTests/Core/1/FormFactorBasicTest.h
new file mode 100644
index 0000000..f978cf9
--- /dev/null
+++ b/Tests/UnitTests/Core/1/FormFactorBasicTest.h
@@ -0,0 +1,457 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/UnitTests/Core/1/FormFactorBasicTest.h
+//! @brief     Trvial and basic unit tests for particle-shape form factors.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MathConstants.h"
+#include "BornAgainNamespace.h"
+#include "IFormFactorBorn.h"
+#include "HardParticles.h"
+
+class FormFactorBasicTest : public ::testing::Test
+{
+protected:
+    FormFactorBasicTest() {}
+    void test_eps_q( const IFormFactorBorn* p, const cvector_t qdir, double eps )
+    {
+        cvector_t q = eps*qdir;
+        complex_t ff = p->evaluate_for_q( q );
+        //std::cout<<"q="<<q<<" -> "<<std::setprecision(16)<<" ff0="<<V<<", ff ="<<ff<<"\n";
+        EXPECT_LE( real(ff), V*(1+4e-16) );
+        if ( R*R*R<V/20 || R*R*R>20*V )
+            // very excentric shape, the following tests cannot be expected to pass
+            return;
+        EXPECT_GT( real(ff), V*(1-std::max(3e-16,2*eps*R*eps*R)) );
+        EXPECT_LT( std::abs(imag(ff)), 2*eps*V*R );
+    }
+    void test_small_q( const IFormFactorBorn* p, complex_t x, complex_t y, complex_t z )
+    {
+        cvector_t q(x, y, z);
+        test_eps_q( p, q, 1e-14 );
+        test_eps_q( p, q, 1e-11 );
+        test_eps_q( p, q, 1e-8 );
+        test_eps_q( p, q, 1e-5 );
+    }
+    void test_ff( const IFormFactorBorn* p )
+    {
+        complex_t ff0 = p->evaluate_for_q( cvector_t(0.,0.,0.) );
+        EXPECT_EQ( imag(ff0), 0. );
+        V = real(ff0);
+        EXPECT_NEAR( p->getVolume(), V, 3e-16*V );
+
+        R = p->getRadialExtension();
+        if ( R*R*R<V/20 || R*R*R>20*V ) {
+            std::cerr<<"WARNING: very elongated particle, or wrong radius; some tests disabled\n";
+            std::cerr<<std::setprecision(16)<<"  V  ="<<V<<"\n  R^3="<<R*R*R<<"\n";
+        }
+
+        test_small_q( p,  1, 0, 0 );
+        test_small_q( p, -1, 0, 0 );
+        test_small_q( p,  0, 1, 0 );
+        test_small_q( p,  0,-1, 0 );
+        test_small_q( p,  0, 0, 1 );
+        test_small_q( p,  0, 0,-1 );
+        test_small_q( p,  1, 1, 0 );
+        test_small_q( p,  0, 1, 1 );
+        test_small_q( p,  1, 0, 1 );
+        test_small_q( p,  1,-1, 0 );
+        test_small_q( p,  0, 1,-1 );
+        test_small_q( p, -1, 0, 1 );
+        test_small_q( p,  1, 1, 1 );
+        test_small_q( p, .7,.8,.9 );
+
+        IFormFactorBorn* clone = p->clone();
+        EXPECT_EQ(clone->getName(), p->getName());
+        EXPECT_EQ(clone->getVolume(), V);
+        cvector_t q(.1, .2, complex_t(.3, .004));
+        EXPECT_EQ(clone->evaluate_for_q(q), p->evaluate_for_q(q));
+    }
+    double V, R;
+};
+
+TEST_F(FormFactorBasicTest, AnisoPyramid)
+{
+    double length = 12.;
+    double height = 5.;
+    double width = 14.;
+    double alpha = 0.8;
+    double tga = std::tan(alpha);
+    double volume = height*
+        (length*width - (length + width)*height/tga + 4.0/3.0*height*height/(tga*tga));
+
+    FormFactorAnisoPyramid anisopyramid(length, width, height, alpha);
+
+    EXPECT_EQ(BornAgain::FFAnisoPyramidType, anisopyramid.getName());
+    EXPECT_DOUBLE_EQ(volume, anisopyramid.getVolume());
+    EXPECT_EQ(12., anisopyramid.getLength());
+    EXPECT_EQ(14., anisopyramid.getWidth());
+    EXPECT_EQ(5., anisopyramid.getHeight());
+    EXPECT_EQ(0.8, anisopyramid.getAlpha());
+
+    test_ff( &anisopyramid );
+}
+
+TEST_F(FormFactorBasicTest, HemiEllipsoid)
+{
+    double radius_a = 6.;
+    double radius_b = 7.;
+    double height = 5.;
+
+    double volume = M_TWOPI*radius_a*radius_b*height/3.;
+
+    FormFactorHemiEllipsoid hemiellipsoid(radius_a, radius_b, height);
+
+    EXPECT_EQ(BornAgain::FFHemiEllipsoidType, hemiellipsoid.getName());
+    EXPECT_EQ(6., hemiellipsoid.getRadiusX());
+    EXPECT_EQ(7., hemiellipsoid.getRadiusY());
+    EXPECT_EQ(5., hemiellipsoid.getHeight());
+    EXPECT_DOUBLE_EQ(volume, hemiellipsoid.getVolume());
+
+    test_ff( &hemiellipsoid );
+}
+
+TEST_F(FormFactorBasicTest, Box)
+{
+    double length = 6.;
+    double height = 5.;
+    double width = 7.;
+    double volume = length*height*width;
+
+    FormFactorBox box(length, width, height);
+
+    EXPECT_EQ(BornAgain::FFBoxType, box.getName());
+    EXPECT_EQ(7., box.getWidth());
+    EXPECT_EQ(5., box.getHeight());
+    EXPECT_EQ(3., box.getRadialExtension());
+    EXPECT_DOUBLE_EQ(volume, box.getVolume());
+
+    test_ff( &box );
+}
+
+TEST_F(FormFactorBasicTest, Cone)
+{
+    double radius = 6.;
+    double height = 5.;
+    double alpha = 0.8;
+    double tga = std::tan(alpha);
+    double HdivRtga = height/tga/radius;
+    double volume = M_PI/3.*tga*radius*radius*radius*
+            (1. - (1.- HdivRtga)*(1.- HdivRtga)*(1.- HdivRtga));
+
+    FormFactorCone cone(radius, height, alpha);
+
+    EXPECT_EQ(BornAgain::FFConeType, cone.getName());
+    EXPECT_EQ(6., cone.getRadius());
+    EXPECT_EQ(5., cone.getHeight());
+    EXPECT_EQ(0.8, cone.getAlpha());
+    EXPECT_DOUBLE_EQ(volume, cone.getVolume());
+
+    test_ff( &cone );
+}
+
+TEST_F(FormFactorBasicTest, Cone6)
+{
+    double base_edge = 6.;
+    double height = 5.;
+    double alpha = 0.8;
+    double tga = std::tan(alpha);
+    double HdivRtga = 2.*height/tga/base_edge/std::sqrt(3.);
+    double volume = 3./4.*tga*base_edge*base_edge*base_edge*
+            (1. - (1.- HdivRtga)*(1.- HdivRtga)*(1.- HdivRtga));
+
+    FormFactorCone6 cone6(base_edge, height, alpha);
+
+    EXPECT_EQ(BornAgain::FFCone6Type, cone6.getName());
+    EXPECT_EQ(6., cone6.getBaseEdge());
+    EXPECT_EQ(5., cone6.getHeight());
+    EXPECT_EQ(0.8, cone6.getAlpha());
+    EXPECT_DOUBLE_EQ(volume, cone6.getVolume());
+
+    test_ff( &cone6 );
+}
+
+TEST_F(FormFactorBasicTest, Cuboctahedron)
+{
+    double length = 10.;
+    double height = 4;
+    double height_ratio = 1.;
+    double alpha = 0.8;
+
+    double tga = std::tan(alpha);
+    double H2divLtga = height*2./length/tga;
+    double ratioH2divLtga = height_ratio*height*2./length/tga;
+    double volume = 1./6.*tga*length*length*length*
+        ( 2. - (1. - H2divLtga)*(1. - H2divLtga)*(1. - H2divLtga)
+          - (1. - ratioH2divLtga)*(1. - ratioH2divLtga)*(1. - ratioH2divLtga));
+
+    FormFactorCuboctahedron cuboctahedron(length, height, height_ratio, alpha);
+
+    EXPECT_EQ(BornAgain::FFCuboctahedronType, cuboctahedron.getName());
+    EXPECT_EQ(4., cuboctahedron.getHeight());
+    EXPECT_EQ(10., cuboctahedron.getLength());
+    EXPECT_EQ(1., cuboctahedron.getHeightRatio());
+    EXPECT_EQ(0.8, cuboctahedron.getAlpha());
+    EXPECT_DOUBLE_EQ(volume, cuboctahedron.getVolume());
+
+    test_ff( &cuboctahedron );
+}
+
+TEST_F(FormFactorBasicTest, Cylinder)
+{
+    double radius = 3.;
+    double height = 5.;
+    double volume = M_PI*radius*radius*height;
+
+    FormFactorCylinder cylinder(radius,height);
+
+    EXPECT_EQ(BornAgain::FFCylinderType, cylinder.getName());
+    EXPECT_EQ(5., cylinder.getHeight());
+    EXPECT_EQ(3., cylinder.getRadius());
+    EXPECT_DOUBLE_EQ(volume, cylinder.getVolume());
+
+    test_ff( &cylinder );
+}
+
+TEST_F(FormFactorBasicTest, Dodecahedron)
+{
+    double edge = 3.;
+    double volume = (15+7*sqrt(5))/4*pow(edge,3);
+
+    FormFactorDodecahedron dodecahedron(edge);
+    EXPECT_EQ(BornAgain::FFDodecahedronType, dodecahedron.getName());
+    EXPECT_EQ(edge, dodecahedron.getEdge());
+    EXPECT_DOUBLE_EQ(volume, dodecahedron.getVolume());
+
+    test_ff( &dodecahedron );
+}
+
+TEST_F(FormFactorBasicTest, EllipsoidalCylinder)
+{
+    double radius_a = 3.;
+    double radius_b = 5.;
+    double height = 4;
+    double volume = M_PI*radius_a*radius_b*height;
+
+    FormFactorEllipsoidalCylinder ellipscyl(radius_a, radius_b, height);
+
+    EXPECT_EQ(BornAgain::FFEllipsoidalCylinderType, ellipscyl.getName());
+    EXPECT_EQ(4., ellipscyl.getHeight());
+    EXPECT_EQ(3., ellipscyl.getRadiusX());
+    EXPECT_EQ(5., ellipscyl.getRadiusY());
+    EXPECT_DOUBLE_EQ(volume, ellipscyl.getVolume());
+
+    test_ff( &ellipscyl );
+}
+
+TEST_F(FormFactorBasicTest, FullSphere)
+{
+    double radius = 5.;
+    double volume = 4./3.*M_PI*radius*radius*radius;
+
+    FormFactorFullSphere fullsphere(radius);
+    EXPECT_EQ(BornAgain::FFFullSphereType, fullsphere.getName());
+    EXPECT_EQ(5., fullsphere.getRadius());
+    EXPECT_DOUBLE_EQ(volume, fullsphere.getVolume());
+
+    test_ff( &fullsphere );
+}
+
+TEST_F(FormFactorBasicTest, FullSpheroid)
+{
+    double radius = 3.;
+    double height = 5.;
+    double volume = 2./3.*M_PI*radius*radius*height;
+
+    FormFactorFullSpheroid fullspheroid(radius,height);
+
+    EXPECT_EQ(BornAgain::FFFullSpheroidType, fullspheroid.getName());
+    EXPECT_EQ(3., fullspheroid.getRadius());
+    EXPECT_EQ(5., fullspheroid.getHeight());
+    EXPECT_DOUBLE_EQ(volume, fullspheroid.getVolume());
+
+    test_ff( &fullspheroid );
+}
+
+TEST_F(FormFactorBasicTest, Icosahedron)
+{
+    double edge = 7.;
+    double volume = 5*(3+sqrt(5))/12*pow(edge,3);
+
+    FormFactorIcosahedron icosahedron(edge);
+
+    EXPECT_EQ(BornAgain::FFIcosahedronType, icosahedron.getName());
+    EXPECT_EQ(edge, icosahedron.getEdge());
+    EXPECT_DOUBLE_EQ(volume, icosahedron.getVolume());
+
+    test_ff( &icosahedron );
+}
+
+TEST_F(FormFactorBasicTest, Prism3)
+{
+    double height = 4.;
+    double base_edge = 6.;
+    double volume = sqrt(3.)/4.*height*base_edge*base_edge;
+
+    FormFactorPrism3 prism3(base_edge, height);
+
+    EXPECT_EQ(BornAgain::FFPrism3Type, prism3.getName());
+    EXPECT_EQ(4., prism3.getHeight());
+    EXPECT_EQ(6., prism3.getBaseEdge());
+    EXPECT_DOUBLE_EQ(volume, prism3.getVolume());
+
+    test_ff( &prism3 );
+}
+
+TEST_F(FormFactorBasicTest, Prism6)
+{
+    double height = 4.;
+    double base_edge = 3.;
+    double volume = 3.*sqrt(3.)/2.*height*base_edge*base_edge;
+
+    FormFactorPrism6 prism6(base_edge, height);
+
+    EXPECT_EQ(BornAgain::FFPrism6Type, prism6.getName());
+    EXPECT_EQ(4., prism6.getHeight());
+    EXPECT_EQ(3., prism6.getBaseEdge());
+    EXPECT_DOUBLE_EQ(volume, prism6.getVolume());
+
+    test_ff( &prism6 );
+}
+
+TEST_F(FormFactorBasicTest, Pyramid)
+{
+    double height = 4.;
+    double length = 10.;
+    double alpha = 0.8;
+    double tga = std::tan(alpha);
+    double H2divLtga = height*2./length/tga;
+    double volume = 1./6.*tga*length* length*length*
+        ( 1. - (1. - H2divLtga)*(1. - H2divLtga)*(1. - H2divLtga));
+
+    FormFactorPyramid pyramid(length, height, alpha);
+
+    EXPECT_EQ(BornAgain::FFPyramidType, pyramid.getName());
+    EXPECT_EQ(4., pyramid.getHeight());
+    EXPECT_EQ(10., pyramid.getBaseEdge());
+    EXPECT_EQ(0.8, pyramid.getAlpha());
+    EXPECT_DOUBLE_EQ(volume, pyramid.getVolume());
+
+    test_ff( &pyramid );
+}
+
+TEST_F(FormFactorBasicTest, TruncatedSphere)
+{
+    double radius = 5.;
+    double height = 3.;
+    double HdivR = height/radius;
+    double volume = M_PI/3.*radius*radius*radius*
+            (3.*HdivR -1. - (HdivR - 1.)*(HdivR - 1.)*(HdivR - 1.));
+
+    FormFactorTruncatedSphere trsphere(radius, height);
+
+    EXPECT_EQ(BornAgain::FFTruncatedSphereType, trsphere.getName());
+    EXPECT_EQ(3., trsphere.getHeight());
+    EXPECT_DOUBLE_EQ(volume, trsphere.getVolume());
+
+    test_ff( &trsphere );
+}
+
+TEST_F(FormFactorBasicTest, TruncatedSpheroid)
+{
+    double radius = 3.;
+    double height = 5.;
+    double flattening = 1.5;
+    double volume = M_PI*radius*height*height/flattening*
+            (1.-height/(3.*flattening*radius));
+
+    FormFactorTruncatedSpheroid trspheroid(radius, height, flattening);
+
+    EXPECT_EQ(BornAgain::FFTruncatedSpheroidType, trspheroid.getName());
+    EXPECT_EQ(5., trspheroid.getHeight());
+    EXPECT_EQ(3., trspheroid.getRadius());
+    EXPECT_DOUBLE_EQ(volume, trspheroid.getVolume());
+
+    test_ff( &trspheroid );
+}
+
+TEST_F(FormFactorBasicTest, Tetrahedron)
+{
+    double base_edge = 16.;
+    double height = 4.;
+    double alpha = 0.8;
+    double tga = std::tan(alpha);
+    double sqrt3H2divLtga = std::sqrt(3.)*2.*height/base_edge/tga;
+    double volume = tga/24.*base_edge*base_edge*base_edge*(
+     1.- (1. - sqrt3H2divLtga)*(1. - sqrt3H2divLtga)*(1. - sqrt3H2divLtga));
+
+    FormFactorTetrahedron tetrahedron(base_edge, height, alpha);
+
+    EXPECT_EQ(BornAgain::FFTetrahedronType, tetrahedron.getName());
+    EXPECT_EQ(4., tetrahedron.getHeight());
+    EXPECT_EQ(16., tetrahedron.getBaseEdge());
+    EXPECT_EQ(0.8, tetrahedron.getAlpha());
+    EXPECT_DOUBLE_EQ(volume, tetrahedron.getVolume());
+
+    test_ff( &tetrahedron );
+}
+
+TEST_F(FormFactorBasicTest, Ripple1)
+{
+    double width = 20.;
+    double height = 4.;
+    double length = 100.0;
+    double volume = 0.5*height*width*length;
+
+    FormFactorRipple1 ripple1(length, width, height);
+
+    EXPECT_EQ(BornAgain::FFRipple1Type, ripple1.getName());
+    EXPECT_EQ(4., ripple1.getHeight());
+    EXPECT_EQ(20., ripple1.getWidth());
+    EXPECT_EQ(100., ripple1.getLength());
+    EXPECT_DOUBLE_EQ(volume, ripple1.getVolume());
+
+    test_ff( &ripple1 );
+}
+
+TEST_F(FormFactorBasicTest, TruncatedCube)
+{
+    double length = 15.;
+    double t = 6.; // side length of removed trirectangular tetrahedron at each vertex
+    double volume = length*length*length - 4./3.*t*t*t;
+
+    FormFactorTruncatedCube trcube(length, t);
+
+    EXPECT_EQ(BornAgain::FFTruncatedCubeType,trcube.getName());
+    EXPECT_EQ(length, trcube.getLength());
+    EXPECT_DOUBLE_EQ(t, trcube.getRemovedLength());
+    EXPECT_DOUBLE_EQ(trcube.getVolume(), volume);
+
+    test_ff( &trcube );
+}
+
+TEST_F(FormFactorBasicTest, Ripple2)
+{
+    double width = 20.;
+    double height = 4.;
+    double length = 100.0;
+    double d = 0.3; // asymmetry
+    double volume = 0.5*height*width*length;
+
+    FormFactorRipple2 ripple2(length, width, height, d);
+
+    EXPECT_EQ(BornAgain::FFRipple2Type, ripple2.getName());
+    EXPECT_EQ(4., ripple2.getHeight());
+    EXPECT_DOUBLE_EQ(volume, ripple2.getVolume());
+
+    // test_ff( &ripple2 ); WAITING: restore once getRadius returns the umkreis radius
+}
diff --git a/Tests/UnitTests/Core/1/LayerRoughnessTest.h b/Tests/UnitTests/Core/1/LayerRoughnessTest.h
new file mode 100644
index 0000000..39eb743
--- /dev/null
+++ b/Tests/UnitTests/Core/1/LayerRoughnessTest.h
@@ -0,0 +1,76 @@
+#ifndef LAYERROUGHNESSTEST_H
+#define LAYERROUGHNESSTEST_H
+
+#include "LayerRoughness.h"
+#include "BornAgainNamespace.h"
+#include "ParameterPattern.h"
+
+class LayerRoughnessTest : public ::testing::Test
+{
+ protected:
+    LayerRoughnessTest(){}
+};
+
+TEST_F(LayerRoughnessTest , LayerRoughnessInitial)
+{
+    //test with default parameter
+    LayerRoughness roughness;
+    EXPECT_EQ(0.0, roughness.getSigma());
+    EXPECT_EQ(0.0, roughness.getHurstParameter());
+    EXPECT_EQ(0.0, roughness.getLatteralCorrLength());
+    EXPECT_EQ(BornAgain::LayerBasicRoughnessType, roughness.getName());
+
+    //set new parameter
+    roughness.setSigma(1.1);
+    EXPECT_EQ(1.1, roughness.getSigma());
+
+    roughness.setHurstParameter(1.2);
+    EXPECT_EQ(1.2, roughness.getHurstParameter());
+
+    roughness.setLatteralCorrLength(1.3);
+    EXPECT_EQ(1.3, roughness.getLatteralCorrLength());
+
+    //test with given parameter
+    LayerRoughness roughness2(2.1, 2.2, 2.3);
+    EXPECT_EQ(2.1, roughness2.getSigma());
+    EXPECT_EQ(2.2, roughness2.getHurstParameter());
+    EXPECT_EQ(2.3, roughness2.getLatteralCorrLength());
+    EXPECT_EQ(BornAgain::LayerBasicRoughnessType, roughness.getName());
+}
+
+//test clone LayerRoughness
+TEST_F(LayerRoughnessTest , LayerRoughnessClone)
+{
+    LayerRoughness original(3.1, 3.2, 3.3);
+
+    LayerRoughness *clone = original.clone();
+    EXPECT_EQ(clone->getSigma(), original.getSigma());
+    EXPECT_EQ(clone->getHurstParameter(), original.getHurstParameter());
+    EXPECT_EQ(clone->getLatteralCorrLength(), original.getLatteralCorrLength());
+    EXPECT_EQ(clone->getName(), original.getName());
+    delete clone;
+}
+
+//test parameter pool
+TEST_F(LayerRoughnessTest , LayerRoughnessPool)
+{
+    LayerRoughness roughnessPool;
+    EXPECT_EQ(0.0, roughnessPool.getSigma());
+    EXPECT_EQ(0.0, roughnessPool.getHurstParameter());
+    EXPECT_EQ(0.0, roughnessPool.getLatteralCorrLength());
+
+    ParameterPattern pattern_sigma, pattern_hurst, pattern_corrlength;
+    pattern_sigma.add(BornAgain::LayerBasicRoughnessType).add(BornAgain::Sigma);
+    pattern_hurst.add(BornAgain::LayerBasicRoughnessType).add(BornAgain::Hurst);
+    pattern_corrlength.add(BornAgain::LayerBasicRoughnessType).add(BornAgain::CorrelationLength);
+    roughnessPool.setParameterValue(pattern_sigma.toStdString(), 4.1);
+    roughnessPool.setParameterValue(pattern_hurst.toStdString(), 4.2);
+    roughnessPool.setParameterValue(pattern_corrlength.toStdString(), 4.3);
+
+    EXPECT_EQ(4.1, roughnessPool.getSigma());
+    EXPECT_EQ(4.2, roughnessPool.getHurstParameter());
+    EXPECT_EQ(4.3, roughnessPool.getLatteralCorrLength());
+    EXPECT_EQ(BornAgain::LayerBasicRoughnessType, roughnessPool.getName());
+}
+
+#endif // LAYERROUGHNESSTEST_H
diff --git a/Tests/UnitTests/Core/1/LayerTest.h b/Tests/UnitTests/Core/1/LayerTest.h
new file mode 100644
index 0000000..5bb966c
--- /dev/null
+++ b/Tests/UnitTests/Core/1/LayerTest.h
@@ -0,0 +1,88 @@
+#ifndef LAYERTEST_H
+#define LAYERTEST_H
+
+#include "Layer.h"
+#include "HomogeneousMaterial.h"
+#include "Materials.h"
+#include "ParticleLayout.h"
+#include "Units.h"
+
+class LayerTest : public ::testing::Test
+{
+ protected:
+    LayerTest(){}
+    virtual ~LayerTest(){}
+};
+
+TEST_F(LayerTest, LayerInitialState)
+{
+    Layer layer;
+    EXPECT_EQ(nullptr, layer.getMaterial());
+    EXPECT_EQ(nullptr, layer.getLayout(0));
+    EXPECT_EQ(0, layer.getThickness());
+    EXPECT_FALSE(layer.hasComputation());
+    EXPECT_EQ(complex_t(1.0, 0.0), layer.getRefractiveIndex());
+    EXPECT_EQ(0.0, layer.getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", layer.getName());
+
+    Layer* new_layer = layer.clone();
+    EXPECT_EQ(nullptr, new_layer->getMaterial());
+    EXPECT_EQ(nullptr, new_layer->getLayout(0));
+    EXPECT_EQ(0, new_layer->getThickness());
+    EXPECT_FALSE(new_layer->hasComputation());
+    EXPECT_EQ(complex_t(1.0, 0.0), new_layer->getRefractiveIndex());
+    EXPECT_EQ(0.0, new_layer->getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", new_layer->getName());
+
+    delete new_layer;
+}
+
+TEST_F(LayerTest, LayerGetAndSet)
+{
+    HomogeneousMaterial air("air",0,0);
+    HomogeneousMaterial something("something",0,0.5);
+
+    Layer layer(air, 10*Units::nanometer);
+    EXPECT_EQ(air.getName(), layer.getMaterial()->getName());
+    EXPECT_EQ(nullptr, layer.getLayout(0));
+    EXPECT_EQ(10, layer.getThickness());
+    EXPECT_FALSE(layer.hasComputation());
+    EXPECT_EQ(complex_t(1,0), layer.getRefractiveIndex());
+    EXPECT_EQ(0.0, layer.getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", layer.getName());
+
+    layer.setThickness(20.0);
+    EXPECT_EQ(20, layer.getThickness());
+    layer.setMaterial(something);
+    EXPECT_EQ(something.getName(), layer.getMaterial()->getName());
+    EXPECT_EQ("Layer", layer.getName());
+    EXPECT_EQ(complex_t(1,0.5), layer.getRefractiveIndex());
+
+    Layer* new_layer = layer.clone();
+    EXPECT_EQ(something.getName(), new_layer->getMaterial()->getName());
+    EXPECT_EQ(nullptr, new_layer->getLayout(0));
+    EXPECT_EQ(20, new_layer->getThickness());
+    EXPECT_FALSE(new_layer->hasComputation());
+    EXPECT_EQ(complex_t(1,0.5), new_layer->getRefractiveIndex());
+    EXPECT_EQ(0.0, new_layer->getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", new_layer->getName());
+    delete new_layer;
+}
+
+
+TEST_F(LayerTest, LayerAndDecoration)
+{
+    HomogeneousMaterial air("air",0,0);
+    ParticleLayout* p_layout1 = new ParticleLayout();
+
+    Layer layer(air, 10*Units::nanometer);
+    layer.addLayout(*p_layout1);
+    //EXPECT_EQ(decoration1, layer.getLayout());
+    EXPECT_TRUE(layer.hasComputation());
+
+    ParticleLayout layout2;
+    layer.addLayout(layout2);
+    EXPECT_EQ("ParticleLayout", layer.getLayout(1)->getName());
+}
+
+#endif // LAYERTEST_H
diff --git a/Tests/UnitTests/Core/1/MultiLayerTest.h b/Tests/UnitTests/Core/1/MultiLayerTest.h
new file mode 100644
index 0000000..1b0c5b2
--- /dev/null
+++ b/Tests/UnitTests/Core/1/MultiLayerTest.h
@@ -0,0 +1,579 @@
+#ifndef MULTILAYERTEST_H
+#define MULTILAYERTEST_H
+
+#include "MultiLayer.h"
+#include "BornAgainNamespace.h"
+#include "Layer.h"
+#include "HomogeneousMaterial.h"
+#include "Materials.h"
+#include "MathConstants.h"
+#include "ParticleLayout.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+
+class MultiLayerTest : public ::testing::Test
+{
+protected:
+    MultiLayerTest()
+        : air("air", 0, 1.0)
+        , iron("iron", 0, 1.51)
+        , chromium("chromium", 0, 3.68)
+        , stone("stone", 0, 1.6)
+        , topLayer(air, 0*Units::nanometer)
+        , layer1(iron, 20*Units::nanometer)
+        , layer2(chromium, 40*Units::nanometer)
+        , substrate(stone, 0*Units::nanometer) {}
+    void set_four() {
+        mLayer.addLayer(topLayer);
+        mLayer.addLayer(layer1);
+        mLayer.addLayer(layer2);
+        mLayer.addLayer(substrate);
+    }
+
+    MultiLayer mLayer;
+    const HomogeneousMaterial air, iron, chromium, stone;
+    Layer topLayer, layer1, layer2, substrate;
+};
+
+TEST_F(MultiLayerTest, BasicProperty)
+{
+    //check default properties
+    EXPECT_EQ(BornAgain::MultiLayerType, mLayer.getName());
+    EXPECT_EQ(0.0, mLayer.getCrossCorrLength());
+    EXPECT_EQ(size_t(0), mLayer.getNumberOfLayers());
+    EXPECT_EQ(size_t(0), mLayer.getNumberOfInterfaces());
+
+    //set parameter
+    mLayer.setParameterValue(BornAgain::CrossCorrelationLength, 2.54);
+    EXPECT_EQ(2.54,mLayer.getCrossCorrLength());
+
+    // adding layers
+    mLayer.addLayer(topLayer);
+    EXPECT_EQ(size_t(1), mLayer.getNumberOfLayers());
+    EXPECT_EQ(size_t(0), mLayer.getNumberOfInterfaces());
+
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    mLayer.addLayer(substrate);
+    EXPECT_EQ(size_t(4), mLayer.getNumberOfLayers());
+    EXPECT_EQ(size_t(3), mLayer.getNumberOfInterfaces());
+}
+
+TEST_F(MultiLayerTest, LayerThicknesses)
+{
+    set_four();
+
+    //check layer thickness
+    EXPECT_EQ( 0.0, mLayer.getLayerThickness(0));
+    EXPECT_EQ(20.0, mLayer.getLayerThickness(1));
+    EXPECT_EQ(40.0, mLayer.getLayerThickness(2));
+    EXPECT_EQ( 0.0, mLayer.getLayerThickness(3));
+
+    //check bottomZ value
+    EXPECT_EQ(  0.0, mLayer.getLayerBottomZ(0));
+    EXPECT_EQ(-20.0, mLayer.getLayerBottomZ(1));
+    EXPECT_EQ(-60.0, mLayer.getLayerBottomZ(2));
+    EXPECT_EQ(-60.0, mLayer.getLayerBottomZ(3));
+
+    //set layer thickness
+    mLayer.setLayerThickness(1, 45.0);
+    EXPECT_EQ(45.0, mLayer.getLayerThickness(1));
+
+    EXPECT_EQ(  0.0, mLayer.getLayerBottomZ(0));
+    EXPECT_EQ(-45.0, mLayer.getLayerBottomZ(1));
+    EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(2));
+    EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(3));
+}
+
+TEST_F(MultiLayerTest, CheckAllLayers)
+{
+    set_four();
+
+    //check individual layer
+    const Layer* got0 = mLayer.getLayer(0);
+    EXPECT_EQ(BornAgain::LayerType, got0->getName());
+    EXPECT_EQ(0, got0->getThickness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), got0->getMaterial()->getName());
+
+    const Layer* got1 = mLayer.getLayer(1);
+    EXPECT_EQ(BornAgain::LayerType, got1->getName());
+    EXPECT_EQ(20, got1->getThickness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), got1->getMaterial()->getName());
+
+    const Layer* got2 = mLayer.getLayer(2);
+    EXPECT_EQ(BornAgain::LayerType, got2->getName());
+    EXPECT_EQ(40, got2->getThickness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), got2->getMaterial()->getName());
+
+    const Layer* got3 = mLayer.getLayer(3);
+    EXPECT_EQ(BornAgain::LayerType, got3->getName());
+    EXPECT_EQ(0, got3->getThickness());
+    EXPECT_EQ(substrate.getMaterial()->getName(), got3->getMaterial()->getName());
+}
+
+TEST_F(MultiLayerTest, LayerInterfaces)
+{
+    set_four();
+
+    //check interfaces
+    const LayerInterface* interface0 = mLayer.getLayerInterface(0);
+    EXPECT_TRUE(nullptr!=interface0);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
+    EXPECT_EQ(nullptr, interface0->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(),
+              interface0->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(),
+              interface0->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface1 = mLayer.getLayerInterface(1);
+    EXPECT_TRUE(nullptr!=interface1);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
+    EXPECT_EQ(nullptr, interface1->getRoughness());
+    EXPECT_EQ(layer1.getMaterial()->getName(),
+              interface1->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer2.getMaterial()->getName(),
+              interface1->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface2 = mLayer.getLayerInterface(2);
+    EXPECT_TRUE(nullptr!=interface2);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
+    EXPECT_EQ(nullptr, interface2->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(),
+              interface2->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(),
+              interface2->getLayerBottom()->getMaterial()->getName());
+
+    //bottom interface
+    const LayerInterface* interfaceBottom = mLayer.getLayerBottomInterface(0);
+    EXPECT_TRUE(nullptr!=interfaceBottom);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
+    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(),
+              interfaceBottom->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(),
+              interfaceBottom->getLayerBottom()->getMaterial()->getName());
+
+    //top interface
+    const LayerInterface* interfaceTop = mLayer.getLayerTopInterface(3);
+    EXPECT_TRUE(nullptr!=interfaceTop);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
+    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(),
+              interfaceTop->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(),
+              interfaceTop->getLayerBottom()->getMaterial()->getName());
+
+    //null interface
+    const LayerInterface* interfaceTopNull = mLayer.getLayerTopInterface(0);
+    EXPECT_TRUE(nullptr==interfaceTopNull);
+
+    const LayerInterface* interfaceBottomNull = mLayer.getLayerBottomInterface(3);
+    EXPECT_TRUE(nullptr==interfaceBottomNull);
+}
+
+TEST_F(MultiLayerTest, Clone)
+{
+    set_four();
+
+    MultiLayer* mLayerClone = mLayer.clone();
+
+    //check properties
+    EXPECT_EQ(BornAgain::MultiLayerType, mLayerClone->getName());
+    EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength());
+    EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers());
+    EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces());
+
+    //check layer thickness
+    EXPECT_EQ(topLayer.getThickness(), mLayerClone->getLayerThickness(0));
+    EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1));
+    EXPECT_EQ(layer2.getThickness(), mLayerClone->getLayerThickness(2));
+    EXPECT_EQ(substrate.getThickness(), mLayerClone->getLayerThickness(3));
+
+    //check bottomZ value
+    EXPECT_EQ(mLayer.getLayerBottomZ(0), mLayerClone->getLayerBottomZ(0));
+    EXPECT_EQ(mLayer.getLayerBottomZ(1), mLayerClone->getLayerBottomZ(1));
+    EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2));
+    EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3));
+
+    //check individual layer
+    const Layer* layerCopy0 = mLayerClone->getLayer(0);
+    EXPECT_EQ(topLayer.getName(), layerCopy0->getName());
+    EXPECT_EQ(topLayer.getThickness(), layerCopy0->getThickness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), layerCopy0->getMaterial()->getName());
+
+    const Layer* layerCopy1 = mLayerClone->getLayer(1);
+    EXPECT_EQ(layer1.getName(), layerCopy1->getName());
+    EXPECT_EQ(layer1.getThickness(), layerCopy1->getThickness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), layerCopy1->getMaterial()->getName());
+
+    const Layer* layerCopy2 = mLayerClone->getLayer(2);
+    EXPECT_EQ(layer2.getName(), layerCopy2->getName());
+    EXPECT_EQ(layer2.getThickness(), layerCopy2->getThickness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), layerCopy2->getMaterial()->getName());
+
+    const Layer* layerCopy3 = mLayerClone->getLayer(3);
+    EXPECT_EQ(substrate.getName(), layerCopy3->getName());
+    EXPECT_EQ(substrate.getThickness(), layerCopy3->getThickness());
+    EXPECT_EQ(substrate.getMaterial()->getName(), layerCopy3->getMaterial()->getName());
+
+    //check interfaces
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    EXPECT_TRUE(nullptr!=interface0);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
+    EXPECT_EQ(nullptr, interface0->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interface0->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface0->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    EXPECT_TRUE(nullptr!=interface1);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
+    EXPECT_EQ(nullptr, interface1->getRoughness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface1->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface1->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface2 = mLayerClone->getLayerInterface(2);
+    EXPECT_TRUE(nullptr!=interface2);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
+    EXPECT_EQ(nullptr, interface2->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface2->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interface2->getLayerBottom()->getMaterial()->getName());
+
+    //top interface
+    const LayerInterface* interfaceBottom = mLayerClone->getLayerTopInterface(1);
+    EXPECT_TRUE(nullptr!=interfaceBottom);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
+    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interfaceBottom->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interfaceBottom->getLayerBottom()->getMaterial()->getName());
+
+    //Bottom interface
+    const LayerInterface* interfaceTop = mLayerClone->getLayerBottomInterface(2);
+    EXPECT_TRUE(nullptr!=interfaceTop);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
+    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName());
+
+    //null interface
+    const LayerInterface* interfaceTopNull = mLayerClone->getLayerTopInterface(0);
+    EXPECT_TRUE(nullptr==interfaceTopNull);
+
+    const LayerInterface* interfaceBottomNull = mLayerClone->getLayerBottomInterface(3);
+    EXPECT_TRUE(nullptr==interfaceBottomNull);
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, CloneInvertB)
+{
+    set_four();
+
+    MultiLayer* mLayerClone = mLayer.cloneInvertB();
+
+    //check properties
+    EXPECT_EQ(BornAgain::MultiLayerType, mLayerClone->getName());
+    EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength());
+    EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers());
+    EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces());
+
+    //check layer thickness
+    EXPECT_EQ(topLayer.getThickness(), mLayerClone->getLayerThickness(0));
+    EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1));
+    EXPECT_EQ(layer2.getThickness(), mLayerClone->getLayerThickness(2));
+    EXPECT_EQ(substrate.getThickness(), mLayerClone->getLayerThickness(3));
+
+    //check bottomZ value
+    EXPECT_EQ(mLayer.getLayerBottomZ(0), mLayerClone->getLayerBottomZ(0));
+    EXPECT_EQ(mLayer.getLayerBottomZ(1), mLayerClone->getLayerBottomZ(1));
+    EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2));
+    EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3));
+
+    //check individual layer
+    const Layer* layerCopy0 = mLayerClone->getLayer(0);
+    EXPECT_EQ(topLayer.getName(), layerCopy0->getName());
+    EXPECT_EQ(topLayer.getThickness(), layerCopy0->getThickness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), layerCopy0->getMaterial()->getName());
+
+    const Layer* layerCopy1 = mLayerClone->getLayer(1);
+    EXPECT_EQ(layer1.getName(), layerCopy1->getName());
+    EXPECT_EQ(layer1.getThickness(), layerCopy1->getThickness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), layerCopy1->getMaterial()->getName());
+
+    const Layer* layerCopy2 = mLayerClone->getLayer(2);
+    EXPECT_EQ(layer2.getName(), layerCopy2->getName());
+    EXPECT_EQ(layer2.getThickness(), layerCopy2->getThickness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), layerCopy2->getMaterial()->getName());
+
+    const Layer* layerCopy3 = mLayerClone->getLayer(3);
+    EXPECT_EQ(substrate.getName(), layerCopy3->getName());
+    EXPECT_EQ(substrate.getThickness(), layerCopy3->getThickness());
+    EXPECT_EQ(substrate.getMaterial()->getName(), layerCopy3->getMaterial()->getName());
+
+    //check interfaces
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    EXPECT_TRUE(nullptr!=interface0);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
+    EXPECT_EQ(nullptr, interface0->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interface0->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface0->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    EXPECT_TRUE(nullptr!=interface1);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
+    EXPECT_EQ(nullptr, interface1->getRoughness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface1->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface1->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface2 = mLayerClone->getLayerInterface(2);
+    EXPECT_TRUE(nullptr!=interface2);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
+    EXPECT_EQ(nullptr, interface2->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface2->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interface2->getLayerBottom()->getMaterial()->getName());
+
+    //top interface
+    const LayerInterface* interfaceBottom = mLayerClone->getLayerTopInterface(1);
+    EXPECT_TRUE(nullptr!=interfaceBottom);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
+    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interfaceBottom->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interfaceBottom->getLayerBottom()->getMaterial()->getName());
+
+    //Bottom interface
+    const LayerInterface* interfaceTop = mLayerClone->getLayerBottomInterface(2);
+    EXPECT_TRUE(nullptr!=interfaceTop);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
+    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName());
+
+    //null interface
+    const LayerInterface* interfaceTopNull = mLayerClone->getLayerTopInterface(0);
+    EXPECT_TRUE(nullptr==interfaceTopNull);
+
+    const LayerInterface* interfaceBottomNull = mLayerClone->getLayerBottomInterface(3);
+    EXPECT_TRUE(nullptr==interfaceBottomNull);
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, WithRoughness)
+{
+    //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
+    LayerRoughness lr(1.1, -7.3, 0.1);
+    mLayer.addLayer(topLayer);
+    mLayer.addLayerWithTopRoughness(layer1,lr);
+    mLayer.addLayer(substrate);
+
+    const LayerInterface* interface0 = mLayer.getLayerInterface(0);
+    const LayerInterface* interface1 = mLayer.getLayerInterface(1);
+
+    const LayerRoughness* roughness0 = interface0->getRoughness();
+    const LayerRoughness* roughness1 = interface1->getRoughness();
+
+    EXPECT_TRUE(roughness0);
+    EXPECT_EQ(nullptr, roughness1);
+
+    EXPECT_EQ(1.1, roughness0->getSigma());
+    EXPECT_EQ(-7.3, roughness0->getHurstParameter());
+    EXPECT_EQ(0.1, roughness0->getLatteralCorrLength());
+}
+
+TEST_F(MultiLayerTest, CloneWithRoughness)
+{
+    LayerRoughness lr0(-2.1, 7.3, 12.1);
+    LayerRoughness lr1(1.1, -7.3, 0.1);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayerWithTopRoughness(layer1,lr0);
+    mLayer.addLayerWithTopRoughness(substrate,lr1);
+
+    MultiLayer* mLayerClone = mLayer.clone();
+
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    const LayerRoughness* roughness0 = interface0->getRoughness();
+    const LayerRoughness* roughness1 = interface1->getRoughness();
+
+    EXPECT_TRUE(roughness0);
+    EXPECT_TRUE(roughness1);
+
+    EXPECT_EQ( -2.1, roughness0->getSigma());
+    EXPECT_EQ(  7.3, roughness0->getHurstParameter());
+    EXPECT_EQ( 12.1, roughness0->getLatteralCorrLength());
+
+    EXPECT_EQ(  1.1, roughness1->getSigma());
+    EXPECT_EQ( -7.3, roughness1->getHurstParameter());
+    EXPECT_EQ(  0.1, roughness1->getLatteralCorrLength());
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, CloneInvertBWithRoughness)
+{
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(stone, 5*Units::nanometer);
+
+    //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
+    LayerRoughness lr0(-2.1, 7.3,  12.1);
+    LayerRoughness lr1(1.1, -7.3, 0.1);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayerWithTopRoughness(layer1,lr0);
+    mLayer.addLayerWithTopRoughness(layer2,lr1);
+
+    MultiLayer* mLayerClone = mLayer.cloneInvertB();
+
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    const LayerRoughness* roughness0 = interface0->getRoughness();
+    const LayerRoughness* roughness1 = interface1->getRoughness();
+
+    EXPECT_EQ( -2.1, roughness0->getSigma());
+    EXPECT_EQ(  7.3, roughness0->getHurstParameter());
+    EXPECT_EQ( 12.1, roughness0->getLatteralCorrLength());
+
+    EXPECT_EQ(  1.1, roughness1->getSigma());
+    EXPECT_EQ( -7.3, roughness1->getHurstParameter());
+    EXPECT_EQ(  0.1, roughness1->getLatteralCorrLength());
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, WithMagneticMaterial)
+{
+    kvector_t magnetic_field(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+    HomogeneousMagneticMaterial magMaterial1("MagMat1", -5.6, 10, magnetic_field);
+
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(stone, 30*Units::nanometer);
+    Layer layer3(magMaterial0, 20*Units::nanometer);
+    Layer layer4(magMaterial1, 0*Units::nanometer);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    EXPECT_FALSE(mLayer.containsMagneticMaterial());
+
+    mLayer.addLayer(layer3);
+    mLayer.addLayer(layer4);
+    EXPECT_TRUE(mLayer.containsMagneticMaterial());
+}
+
+TEST_F(MultiLayerTest, CloneWithMagneticMaterial)
+{
+    kvector_t magnetic_field(1.1, 2.1, -5.1);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(magMaterial0, 20*Units::nanometer);
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+
+    MultiLayer* mLayerClone = mLayer.clone();
+    EXPECT_TRUE(mLayerClone->containsMagneticMaterial());
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, CloneInvertBMagneticMaterial)
+{
+    kvector_t magnetic_field(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(magMaterial0, 20*Units::nanometer);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+
+    MultiLayer* mLayerClone = mLayer.cloneInvertB();
+    EXPECT_TRUE(mLayerClone->containsMagneticMaterial());
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, MultiLayerCompositeTest)
+{
+    MultiLayer mLayer;
+    kvector_t magnetic_field(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+    HomogeneousMagneticMaterial magMaterial1("MagMat1", -5.6, 10, magnetic_field);
+
+    Layer layer1(iron, 10*Units::nanometer);
+    Layer layer2(magMaterial0, 20*Units::nanometer);
+    Layer layer3(magMaterial1, 30*Units::nanometer);
+    Layer layer4(stone, 40*Units::nanometer);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    mLayer.addLayer(layer3);
+    mLayer.addLayer(layer4);
+
+    std::vector<Layer *> layer_buffer;
+    std::vector<LayerInterface *> interface_buffer;
+    int counter(0);
+    for(size_t index=0; index<mLayer.size();++index)
+    {
+        ISample *sample = mLayer[index];
+        if(counter%2 == 1)
+        {
+            LayerInterface *interface = dynamic_cast<LayerInterface *>(sample);
+            EXPECT_TRUE(nullptr != interface);
+            interface_buffer.push_back(interface);
+        } else {
+            Layer *layer = dynamic_cast<Layer *>(sample);
+            EXPECT_TRUE(nullptr != layer);
+            layer_buffer.push_back(layer);
+        }
+        counter++;
+    }
+    EXPECT_EQ( size_t(5), layer_buffer.size());
+    EXPECT_EQ( size_t(4), interface_buffer.size());
+    for(size_t i=0; i<layer_buffer.size(); ++i) {
+        EXPECT_EQ( double(i*10), layer_buffer[i]->getThickness());
+    }
+    for(size_t i=0; i<interface_buffer.size(); ++i) {
+        EXPECT_EQ( double((i+1)*10), interface_buffer[i]->getLayerBottom()->getThickness());
+    }
+}
+
+TEST_F(MultiLayerTest, MultiLayerZtoIndex)
+{
+    MultiLayer mLayer;
+
+    // index_0
+    // -----------------  0.0
+    // index_1
+    // -----------------  -10.0
+    // index_2
+    // -----------------  -30.0
+    // index_3
+    // -----------------  -60.0
+    // index_4
+    Layer layer1(air, 10*Units::nanometer);
+    Layer layer2(air, 20*Units::nanometer);
+    Layer layer3(air, 30*Units::nanometer);
+    Layer layer4(air, 0*Units::nanometer);
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    mLayer.addLayer(layer3);
+    mLayer.addLayer(layer4);
+
+    EXPECT_EQ(size_t(0), mLayer.zToLayerIndex(1.0));
+    EXPECT_EQ(size_t(0), mLayer.zToLayerIndex(0.0));
+    EXPECT_EQ(size_t(1), mLayer.zToLayerIndex(-1.0));
+    EXPECT_EQ(size_t(1), mLayer.zToLayerIndex(-9.0));
+    EXPECT_EQ(size_t(1), mLayer.zToLayerIndex(-10.0));
+    EXPECT_EQ(size_t(2), mLayer.zToLayerIndex(-11.0));
+    EXPECT_EQ(size_t(2), mLayer.zToLayerIndex(-30.0));
+    EXPECT_EQ(size_t(3), mLayer.zToLayerIndex(-31.0));
+    EXPECT_EQ(size_t(3), mLayer.zToLayerIndex(-60.0));
+    EXPECT_EQ(size_t(4), mLayer.zToLayerIndex(-61.0));
+}
+
+#endif // MULTILAYERTEST_H
diff --git a/Tests/UnitTests/Core/1/ParticleCompositionTest.h b/Tests/UnitTests/Core/1/ParticleCompositionTest.h
new file mode 100644
index 0000000..df82a7a
--- /dev/null
+++ b/Tests/UnitTests/Core/1/ParticleCompositionTest.h
@@ -0,0 +1,110 @@
+#ifndef PARTICLECOMPOSITIONTEST_H
+#define PARTICLECOMPOSITIONTEST_H
+
+#include "ParticleComposition.h"
+#include "Particle.h"
+#include "Materials.h"
+#include "MathConstants.h"
+#include "HomogeneousMaterial.h"
+#include "FormFactorFullSphere.h"
+#include <iostream>
+
+class ParticleCompositionTest : public ::testing::Test
+{
+protected:
+    ParticleCompositionTest()
+    {
+    }
+    virtual ~ParticleCompositionTest()
+    {
+    }
+};
+
+TEST_F(ParticleCompositionTest, ParticleCompositionDefaultConstructor)
+{
+    ParticleComposition *lb = new ParticleComposition();
+    std::vector<kvector_t> positions;
+    positions.push_back(kvector_t(0.0, 0.0, 0.0));
+    EXPECT_EQ("ParticleComposition", lb->getName());
+    EXPECT_EQ(nullptr, lb->getAmbientMaterial());
+    EXPECT_EQ(size_t(0), lb->getNbrParticles());
+
+    delete lb;
+}
+
+TEST_F(ParticleCompositionTest, ParticleCompositionConstructorWithOneParameter)
+{
+    Particle particle;
+    ParticleComposition *lb = new ParticleComposition(particle);
+    kvector_t position;
+    EXPECT_EQ("ParticleComposition", lb->getName());
+    lb->addParticle(particle, position);
+    EXPECT_EQ(particle.getMaterial(), lb->getParticle(0)->getAmbientMaterial());
+    EXPECT_EQ(particle.getName(), lb->getParticle(0)->getName());
+    EXPECT_EQ(particle.getRotation(), lb->getParticle(0)->getRotation());
+    EXPECT_EQ(particle.getMaterial(), lb->getParticle(1)->getAmbientMaterial());
+    EXPECT_EQ(particle.getName(), lb->getParticle(1)->getName());
+    EXPECT_EQ(particle.getRotation(), lb->getParticle(1)->getRotation());
+    EXPECT_EQ(position, lb->getParticlePosition(0));
+    EXPECT_EQ(position, lb->getParticlePosition(1));
+
+    HomogeneousMaterial material("Air", 0.0, 0.0);
+    lb->setAmbientMaterial(material);
+    EXPECT_EQ("Air", lb->getAmbientMaterial()->getName());
+    EXPECT_EQ(1.0, lb->getAmbientMaterial()->getRefractiveIndex());
+
+    delete lb;
+}
+
+TEST_F(ParticleCompositionTest, ParticleCompositionConstructorWithTwoParameter)
+{
+    Particle particle;
+    kvector_t position = kvector_t(1.0, 1.0, 1.0);
+    ParticleComposition *lb = new ParticleComposition(particle, position);
+
+    EXPECT_EQ("ParticleComposition", lb->getName());
+    lb->addParticle(particle, position);
+    EXPECT_EQ(particle.getMaterial(), lb->getParticle(0)->getAmbientMaterial());
+    EXPECT_EQ(particle.getName(), lb->getParticle(0)->getName());
+    EXPECT_EQ(particle.getRotation(), lb->getParticle(0)->getRotation());
+    EXPECT_EQ(particle.getMaterial(), lb->getParticle(1)->getAmbientMaterial());
+    EXPECT_EQ(particle.getName(), lb->getParticle(1)->getName());
+    EXPECT_EQ(particle.getRotation(), lb->getParticle(1)->getRotation());
+    EXPECT_EQ(position, lb->getParticlePosition(0));
+    EXPECT_EQ(position, lb->getParticlePosition(1));
+
+    HomogeneousMaterial material("Air", 0.0, 0.0);
+    lb->setAmbientMaterial(material);
+    EXPECT_EQ("Air", lb->getAmbientMaterial()->getName());
+    EXPECT_EQ(1.0, lb->getAmbientMaterial()->getRefractiveIndex());
+
+    delete lb;
+}
+
+TEST_F(ParticleCompositionTest, ParticleCompositionClone)
+{
+    ParticleComposition *lb = new ParticleComposition();
+    Particle particle;
+    kvector_t position = kvector_t(1.0, 1.0, 1.0);
+    HomogeneousMaterial material("Air", 0.0, 0.0);
+    lb->addParticle(particle, position);
+    lb->setAmbientMaterial(material);
+    ParticleComposition *lbClone = lb->clone();
+
+    EXPECT_EQ(lbClone->getName(), lb->getName());
+
+    EXPECT_EQ(lbClone->getParticle(0)->getAmbientMaterial()->getRefractiveIndex(),
+              lb->getParticle(0)->getAmbientMaterial()->getRefractiveIndex());
+    EXPECT_EQ(lbClone->getParticle(0)->getName(), lb->getParticle(0)->getName());
+    EXPECT_EQ(lbClone->getParticle(0)->getRotation(),
+              lb->getParticle(0)->getRotation());
+    EXPECT_EQ(position, lb->getParticlePosition(0));
+
+    EXPECT_EQ("Air", lb->getAmbientMaterial()->getName());
+    EXPECT_EQ(1.0, lb->getAmbientMaterial()->getRefractiveIndex());
+
+    delete lb;
+    delete lbClone;
+}
+
+#endif // PARTICLECOMPOSITIONTEST_H
diff --git a/Tests/UnitTests/Core/1/ParticleCoreShellTest.h b/Tests/UnitTests/Core/1/ParticleCoreShellTest.h
new file mode 100644
index 0000000..962f027
--- /dev/null
+++ b/Tests/UnitTests/Core/1/ParticleCoreShellTest.h
@@ -0,0 +1,114 @@
+#ifndef PARTICLECORESHELLTEST_H
+#define PARTICLECORESHELLTEST_H
+
+#include "HardParticles.h"
+#include "ParticleCoreShell.h"
+#include "BornAgainNamespace.h"
+#include "MathConstants.h"
+#include "HomogeneousMaterial.h"
+#include "Particle.h"
+#include "Rotations.h"
+
+#include <iostream>
+
+class ParticleCoreShellTest : public ::testing::Test
+{
+protected:
+    ParticleCoreShellTest();
+    virtual ~ParticleCoreShellTest();
+
+    ParticleCoreShell *mp_coreshell;
+};
+
+ParticleCoreShellTest::ParticleCoreShellTest()
+    : mp_coreshell(nullptr)
+{
+    Particle core;
+    Particle shell;
+    kvector_t position;
+    mp_coreshell = new ParticleCoreShell(shell, core, position);
+}
+
+ParticleCoreShellTest::~ParticleCoreShellTest()
+{
+    delete mp_coreshell;
+}
+
+TEST_F(ParticleCoreShellTest, InitialState)
+{
+    EXPECT_EQ(nullptr, mp_coreshell->getAmbientMaterial());
+    EXPECT_EQ(nullptr, mp_coreshell->createFormFactor());
+    EXPECT_EQ(nullptr, mp_coreshell->getRotation());
+    EXPECT_EQ(BornAgain::ParticleCoreShellType, mp_coreshell->getName());
+    EXPECT_EQ(BornAgain::ParticleType, mp_coreshell->getCoreParticle()->getName());
+    EXPECT_EQ(BornAgain::ParticleType, mp_coreshell->getShellParticle()->getName());
+}
+
+TEST_F(ParticleCoreShellTest, Clone)
+{
+    ParticleCoreShell *p_clone = mp_coreshell->clone();
+    EXPECT_EQ(nullptr, p_clone->getAmbientMaterial());
+    EXPECT_EQ(nullptr, p_clone->createFormFactor());
+    EXPECT_EQ(nullptr, p_clone->getRotation());
+    EXPECT_EQ(BornAgain::ParticleCoreShellType, p_clone->getName());
+    EXPECT_EQ(BornAgain::ParticleType, p_clone->getCoreParticle()->getName());
+    EXPECT_EQ(BornAgain::ParticleType, p_clone->getShellParticle()->getName());
+    delete p_clone;
+}
+
+TEST_F(ParticleCoreShellTest, CloneInvertB)
+{
+    ParticleCoreShell *p_clone = mp_coreshell->cloneInvertB();
+    EXPECT_EQ(nullptr, p_clone->getAmbientMaterial());
+    EXPECT_EQ(nullptr, p_clone->createFormFactor());
+    EXPECT_EQ(nullptr, p_clone->getRotation());
+    EXPECT_EQ(BornAgain::ParticleCoreShellType, p_clone->getName());
+    EXPECT_EQ(BornAgain::ParticleType, p_clone->getCoreParticle()->getName());
+    EXPECT_EQ(BornAgain::ParticleType, p_clone->getShellParticle()->getName());
+    delete p_clone;
+}
+
+TEST_F(ParticleCoreShellTest, AmbientMaterial)
+{
+    HomogeneousMaterial mat("Air", 0.0, 0.0);
+    EXPECT_EQ(nullptr, mp_coreshell->getAmbientMaterial());
+    mp_coreshell->setAmbientMaterial(mat);
+    const IMaterial *p_material = mp_coreshell->getAmbientMaterial();
+    EXPECT_EQ("Air", p_material->getName());
+    EXPECT_EQ(complex_t(1.0, 0.0), p_material->getRefractiveIndex());
+    p_material = mp_coreshell->getCoreParticle()->getAmbientMaterial();
+    EXPECT_EQ(nullptr, p_material);
+    p_material = mp_coreshell->getShellParticle()->getAmbientMaterial();
+    EXPECT_EQ("Air", p_material->getName());
+    EXPECT_EQ(complex_t(1.0, 0.0), p_material->getRefractiveIndex());
+    EXPECT_EQ(nullptr, mp_coreshell->createFormFactor());
+    EXPECT_EQ(BornAgain::ParticleCoreShellType, mp_coreshell->getName());
+    EXPECT_EQ(BornAgain::ParticleType, mp_coreshell->getCoreParticle()->getName());
+    EXPECT_EQ(BornAgain::ParticleType, mp_coreshell->getShellParticle()->getName());
+}
+
+TEST_F(ParticleCoreShellTest, ComplexCoreShellClone)
+{
+    HomogeneousMaterial mCore("Ag", 1.245e-5, 5.419e-7);
+    HomogeneousMaterial mShell("AgO2", 8.600e-6, 3.442e-7);
+
+    double shell_length(50);
+    double shell_width(20);
+    double shell_height(10);
+    double core_length = shell_length/2;
+    double core_width = shell_width/2;
+    double core_height = shell_height/2;
+
+    Particle core(mCore, FormFactorBox(core_length, core_width, core_height));
+    Particle shell(mShell, FormFactorBox(shell_length, shell_width, shell_height));
+    kvector_t relative_pos(0, 0, (shell_height-core_height)/2);
+    ParticleCoreShell coreshell(shell, core, relative_pos);
+    coreshell.setRotation(RotationY(90*Units::degree));
+    coreshell.setPosition(kvector_t(0,0,-10));
+
+    ParticleCoreShell *clone = coreshell.clone();
+    EXPECT_EQ(coreshell.getCoreParticle()->getPosition(), relative_pos);
+    EXPECT_EQ(clone->getCoreParticle()->getPosition(), relative_pos);
+}
+
+#endif // PARTICLECORESHELLTEST_H
diff --git a/Tests/UnitTests/Core/1/ParticleLayoutTest.h b/Tests/UnitTests/Core/1/ParticleLayoutTest.h
new file mode 100644
index 0000000..f83dc4b
--- /dev/null
+++ b/Tests/UnitTests/Core/1/ParticleLayoutTest.h
@@ -0,0 +1,239 @@
+#ifndef PARTICLELAYOUTTEST_H
+#define PARTICLELAYOUTTEST_H
+
+#include "ParticleLayout.h"
+#include "InterferenceFunctionNone.h"
+
+class ParticleLayoutTest : public :: testing :: Test {
+
+protected:
+    ParticleLayoutTest(){}
+};
+
+TEST_F(ParticleLayoutTest, ParticleLayoutInitial)
+{
+    ParticleLayout particleDecoration;
+
+    EXPECT_EQ(BornAgain::ParticleLayoutType, particleDecoration.getName());
+    EXPECT_EQ(size_t(0), particleDecoration.getNumberOfParticles());
+    EXPECT_EQ(nullptr, particleDecoration.getInterferenceFunction());
+}
+
+TEST_F(ParticleLayoutTest, ParticleLayoutInitByValue)
+{
+    Particle particle;
+
+    ParticleLayout particleDecoration(particle, 2.0);
+
+    EXPECT_EQ(BornAgain::ParticleLayoutType, particleDecoration.getName());
+    EXPECT_EQ(size_t(1), particleDecoration.getNumberOfParticles());
+    EXPECT_EQ(nullptr, particleDecoration.getInterferenceFunction());
+
+
+    const IAbstractParticle * p_particle = particleDecoration.getParticle(size_t(0));
+    EXPECT_TRUE(nullptr!=p_particle);
+    EXPECT_EQ(2.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+
+    EXPECT_EQ(nullptr, particleDecoration.getInterferenceFunction());
+}
+
+TEST_F(ParticleLayoutTest, ParticleLayoutInitByRef)
+{
+    Particle particle;
+
+    ParticleLayout particleDecoration(particle, -2.0);
+
+    EXPECT_EQ(BornAgain::ParticleLayoutType, particleDecoration.getName());
+    EXPECT_EQ(size_t(1), particleDecoration.getNumberOfParticles());
+    EXPECT_EQ(nullptr, particleDecoration.getInterferenceFunction());
+
+
+    const IAbstractParticle * p_particle = particleDecoration.getParticle(size_t(0));
+    EXPECT_TRUE(nullptr!=p_particle);
+    EXPECT_EQ(-2.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+}
+
+TEST_F(ParticleLayoutTest, ParticleLayoutAddParticle)
+{
+    ParticleLayout particleDecoration;
+
+    Particle particle1;
+    Particle particle2;
+    Particle particle3;
+    Particle particle4;
+
+    RotationZ transform3(45.*Units::degree);
+    RotationZ transform4(45.*Units::degree);
+
+    particleDecoration.addParticle(particle1);
+    particleDecoration.addParticle(particle2, 2.2);
+    particleDecoration.addParticle(particle3, 1.0, kvector_t(0,0,0), transform3);
+    particleDecoration.addParticle(particle4, -4.2, kvector_t(0,0,0), transform4);
+
+    EXPECT_EQ(size_t(4), particleDecoration.getNumberOfParticles());
+
+    const IAbstractParticle * p_particle1 = particleDecoration.getParticle(size_t(0));
+    EXPECT_TRUE(nullptr!=p_particle1);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+
+    const IAbstractParticle * p_particle2 = particleDecoration.getParticle(size_t(1));
+    EXPECT_TRUE(nullptr!=p_particle2);
+    EXPECT_EQ(2.2, particleDecoration.getAbundanceOfParticle(size_t(1)));
+
+    const IAbstractParticle * p_particle3 = particleDecoration.getParticle(size_t(2));
+    EXPECT_TRUE(nullptr!=p_particle3);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(2)));
+
+    const IAbstractParticle * p_particle4 = particleDecoration.getParticle(size_t(3));
+    EXPECT_TRUE(nullptr!=p_particle4);
+    EXPECT_EQ(-4.2, particleDecoration.getAbundanceOfParticle(size_t(3)));
+}
+
+TEST_F(ParticleLayoutTest, ParticleLayoutAbundanceFraction)
+{
+    ParticleLayout particleDecoration;
+
+    Particle particle1;
+    Particle particle2;
+    Particle particle3;
+    Particle particle4;
+
+    RotationY transform3(45.*Units::degree);
+    RotationZ transform4(45.*Units::degree);
+
+    particleDecoration.addParticle(particle1);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+
+    particleDecoration.addParticle(particle2, 2.0);
+    EXPECT_EQ(2.0, particleDecoration.getAbundanceOfParticle(size_t(1)));
+
+    particleDecoration.addParticle(particle3, 1.0, kvector_t(0,0,0), transform3);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(2)));
+
+    particleDecoration.addParticle(particle4, 4.0, kvector_t(0,0,0), transform4);
+    EXPECT_EQ(4.0, particleDecoration.getAbundanceOfParticle(size_t(3)));
+}
+
+TEST_F(ParticleLayoutTest, ParticleLayoutClone)
+{
+    ParticleLayout particleDecoration;
+
+    Particle particle1;
+    Particle particle2;
+    Particle particle3;
+    Particle particle4;
+
+    RotationY transform3(45.*Units::degree);
+    RotationZ transform4(45.*Units::degree);
+
+    particleDecoration.addParticle(particle1);
+    particleDecoration.addParticle(particle2, 2.0);
+    particleDecoration.addParticle(particle3, 1.0, kvector_t(0,0,0), transform3);
+    particleDecoration.addParticle(particle4, 4.0, kvector_t(0,0,0), transform4);
+
+    HomogeneousMaterial mat5("core", 0, 0);
+    Particle particle5(mat5);
+    particleDecoration.addParticle(particle5, 0.0);
+
+    InterferenceFunctionNone iff_none;
+    particleDecoration.addInterferenceFunction(iff_none);
+    particleDecoration.addInterferenceFunction(iff_none);
+    particleDecoration.addInterferenceFunction(iff_none);
+
+    ParticleLayout * clone = particleDecoration.clone();
+
+    EXPECT_EQ(BornAgain::ParticleLayoutType, clone->getName());
+
+    const IAbstractParticle * p_particle1 = clone->getParticle(size_t(0));
+    EXPECT_TRUE(nullptr!=p_particle1);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+
+    const IAbstractParticle * p_particle2 = clone->getParticle(size_t(1));
+    EXPECT_TRUE(nullptr!=p_particle2);
+    EXPECT_EQ(2.0, particleDecoration.getAbundanceOfParticle(size_t(1)));
+
+    const IAbstractParticle * p_particle3 = clone->getParticle(size_t(2));
+    EXPECT_TRUE(nullptr!=p_particle3);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(2)));
+
+    const IAbstractParticle * p_particle4 = clone->getParticle(size_t(3));
+    EXPECT_TRUE(nullptr!=p_particle4);
+    EXPECT_EQ(4.0, particleDecoration.getAbundanceOfParticle(size_t(3)));
+
+    const IAbstractParticle * p_particle5 = clone->getParticle(size_t(4));
+    EXPECT_TRUE(nullptr!=p_particle5);
+    EXPECT_EQ(0.0, particleDecoration.getAbundanceOfParticle(size_t(4)));
+
+    EXPECT_TRUE(nullptr!=clone->getInterferenceFunction());
+}
+
+TEST_F(ParticleLayoutTest, ParticleLayoutCloneInvertB)
+{
+    ParticleLayout particleDecoration;
+
+    HomogeneousMaterial mat1("Air",0,0);
+    Particle particle1(mat1);
+
+    HomogeneousMaterial mat2("Stone",0,0);
+    Particle particle2(mat2);
+
+    HomogeneousMaterial mat3("wood",0,0);
+    Particle particle3(mat3);
+
+    HomogeneousMaterial mat4("silica",0,0);
+    Particle particle4(mat4);
+
+    RotationY transform3(45.*Units::degree);
+    RotationZ transform4(45.*Units::degree);
+
+
+    particleDecoration.addParticle(particle1);
+    particleDecoration.addParticle(particle2, 2.0);
+    particleDecoration.addParticle(particle3, 1.0, kvector_t(0,0,0), transform3);
+    particleDecoration.addParticle(particle4, 4.0, kvector_t(0,0,0), transform4);
+
+    HomogeneousMaterial mat5("core",0,0);
+    Particle particle5(mat5);
+    particleDecoration.addParticle(particle5, 0.0);
+
+    InterferenceFunctionNone iff_none;
+    particleDecoration.addInterferenceFunction(iff_none);
+
+    ParticleLayout * clone = particleDecoration.cloneInvertB();
+
+    EXPECT_EQ(BornAgain::ParticleLayoutType, clone->getName());
+
+    const IAbstractParticle * p_particle1 = clone->getParticle(size_t(0));
+    EXPECT_TRUE(nullptr!=p_particle1);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+
+    const IAbstractParticle * p_particle2 = clone->getParticle(size_t(1));
+    EXPECT_TRUE(nullptr!=p_particle2);
+    EXPECT_EQ(2.0, particleDecoration.getAbundanceOfParticle(size_t(1)));
+
+    const IAbstractParticle * p_particle3 = clone->getParticle(size_t(2));
+    EXPECT_TRUE(nullptr!=p_particle3);
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(2)));
+
+    const IAbstractParticle * p_particle4 = clone->getParticle(size_t(3));
+    EXPECT_TRUE(nullptr!=p_particle4);
+    EXPECT_EQ(4.0, particleDecoration.getAbundanceOfParticle(size_t(3)));
+
+    const IAbstractParticle * p_particle5 = clone->getParticle(size_t(4));
+    EXPECT_TRUE(nullptr!=p_particle5);
+    EXPECT_EQ(0.0, particleDecoration.getAbundanceOfParticle(size_t(4)));
+
+    EXPECT_TRUE(nullptr!=clone->getInterferenceFunction());
+}
+
+TEST_F(ParticleLayoutTest, ParticleLayoutInterferenceFunction)
+{
+    ParticleLayout particleDecoration;
+
+    InterferenceFunctionNone iff_none;
+    particleDecoration.addInterferenceFunction(iff_none);
+
+    EXPECT_TRUE(nullptr!=particleDecoration.getInterferenceFunction());
+}
+
+#endif // PARTICLELAYOUTTEST_H
diff --git a/Tests/UnitTests/Core/1/ParticleTest.h b/Tests/UnitTests/Core/1/ParticleTest.h
new file mode 100644
index 0000000..f18ad47
--- /dev/null
+++ b/Tests/UnitTests/Core/1/ParticleTest.h
@@ -0,0 +1,135 @@
+#ifndef PARTICLETEST_H
+#define PARTICLETEST_H
+
+#include "Particle.h"
+#include "BornAgainNamespace.h"
+#include "MathConstants.h"
+#include "HomogeneousMaterial.h"
+#include "FormFactorFullSphere.h"
+
+#include <iostream>
+
+class ParticleTest : public ::testing::Test
+{
+protected:
+    ParticleTest(){}
+};
+
+
+TEST_F(ParticleTest, InitialState)
+{
+    Particle particle;
+    EXPECT_EQ(nullptr, particle.getMaterial());
+    EXPECT_EQ(complex_t(0,0), particle.getRefractiveIndex());
+    EXPECT_EQ(nullptr, particle.getFormFactor());
+    EXPECT_EQ(nullptr, particle.createFormFactor());
+    EXPECT_EQ(BornAgain::ParticleType, particle.getName());
+}
+
+TEST_F(ParticleTest, Clone)
+{
+    Particle particle;
+    Particle *particle2 = particle.clone();
+    EXPECT_EQ(nullptr, particle2->getMaterial());
+    EXPECT_EQ(complex_t(0,0), particle2->getRefractiveIndex());
+    EXPECT_EQ(nullptr, particle2->getFormFactor());
+    EXPECT_EQ(nullptr, particle2->createFormFactor());
+    EXPECT_EQ(BornAgain::ParticleType, particle2->getName());
+    delete particle2;
+}
+
+TEST_F(ParticleTest, CloneInvertB)
+{
+    Particle particle;
+    Particle *particle2 = particle.cloneInvertB();
+    EXPECT_EQ(nullptr, particle2->getMaterial());
+    EXPECT_EQ(complex_t(0,0), particle2->getRefractiveIndex());
+    EXPECT_EQ(nullptr, particle2->getFormFactor());
+    EXPECT_EQ(nullptr, particle2->createFormFactor());
+    EXPECT_EQ(BornAgain::ParticleType, particle2->getName());
+    delete particle2;
+}
+
+TEST_F(ParticleTest, Constructors)
+{
+    HomogeneousMaterial mat("Air",0,0);
+
+    Particle *p1 = new Particle(mat);
+    EXPECT_EQ("Air", p1->getMaterial()->getName());
+    EXPECT_EQ(complex_t(1,0), p1->getRefractiveIndex());
+    EXPECT_EQ(nullptr, p1->getFormFactor());
+    EXPECT_EQ(nullptr, p1->createFormFactor());
+    EXPECT_EQ( nullptr, p1->getRotation());
+
+    delete p1;
+
+    FormFactorFullSphere sphere(1.0);
+    Particle *p2 = new Particle(mat, sphere);
+    EXPECT_EQ(BornAgain::FFFullSphereType, p2->getFormFactor()->getName());
+    EXPECT_EQ(1, p2->getFormFactor()->getRadialExtension());
+    EXPECT_TRUE(dynamic_cast<FormFactorDecoratorMaterial *>(
+            p2->createFormFactor()));
+    EXPECT_EQ(complex_t(1,0),
+              dynamic_cast<FormFactorDecoratorMaterial *>(
+                      p2->createFormFactor())->getAmbientRefractiveIndex());
+    delete p2;
+
+    FormFactorFullSphere sphere3(1.0);
+    Particle *p3 = new Particle(mat, sphere3);
+    EXPECT_EQ(sphere3.getName(), p3->getFormFactor()->getName());
+    EXPECT_EQ(sphere3.getRadialExtension(), p3->getFormFactor()->getRadialExtension());
+
+    Particle *p4 = p3->clone();
+    EXPECT_EQ(BornAgain::FFFullSphereType, p4->getFormFactor()->getName());
+
+    delete p3;
+    delete p4;
+}
+
+TEST_F(ParticleTest, Transform)
+{
+    HomogeneousMaterial mat("Air",0,0);
+    FormFactorFullSphere sphere(1.0);
+    RotationZ transform(45.*Units::degree);
+    Particle *particle = new Particle(mat, sphere, transform);
+
+    EXPECT_EQ("Air", particle->getMaterial()->getName());
+
+    EXPECT_TRUE(nullptr != particle->getRotation());
+
+    delete particle;
+}
+
+TEST_F(ParticleTest, SetParam)
+{
+    HomogeneousMaterial mat("Air",0,0);
+    FormFactorFullSphere sphere(2.1);
+    RotationY transform(45.*Units::degree);
+
+    Particle particle;
+    EXPECT_EQ(nullptr, particle.getMaterial());
+    EXPECT_EQ(nullptr, particle.getFormFactor());
+    EXPECT_EQ(nullptr, particle.getRotation());
+
+    particle.setMaterial(mat);
+    EXPECT_EQ("Air", particle.getMaterial()->getName());
+    EXPECT_EQ(complex_t(1.0), particle.getRefractiveIndex());
+
+    particle.setFormFactor(sphere);
+    EXPECT_EQ(BornAgain::FFFullSphereType, particle.getFormFactor()->getName());
+    EXPECT_EQ(2.1, particle.getFormFactor()->getRadialExtension());
+
+    particle.setRotation(transform);
+    EXPECT_TRUE(nullptr != particle.getRotation());
+    Particle *particle2 = particle.clone();
+    EXPECT_EQ(BornAgain::ParticleType, particle2->getName());
+    EXPECT_EQ("Air", particle2->getMaterial()->getName());
+    EXPECT_EQ(complex_t(1.0), particle2->getRefractiveIndex());
+    EXPECT_TRUE(nullptr != particle2->getFormFactor());
+    EXPECT_EQ(2.1, particle2->getFormFactor()->getRadialExtension());
+    EXPECT_TRUE(nullptr != particle2->getRotation());
+
+    delete particle2;
+}
+
+#endif // PARTICLETEST_H
diff --git a/Tests/UnitTests/Core/1/main.cpp b/Tests/UnitTests/Core/1/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/1/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/1/testlist.h b/Tests/UnitTests/Core/1/testlist.h
new file mode 100644
index 0000000..9db6e89
--- /dev/null
+++ b/Tests/UnitTests/Core/1/testlist.h
@@ -0,0 +1,10 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "FormFactorBasicTest.h"
+#include "LayerTest.h"
+#include "MultiLayerTest.h"
+#include "ParticleCoreShellTest.h"
+#include "LayerRoughnessTest.h"
+#include "ParticleTest.h"
+#include "ParticleCompositionTest.h"
+#include "ParticleLayoutTest.h"
diff --git a/Tests/UnitTests/Core/2/MatrixRTCoefficientsTest.h b/Tests/UnitTests/Core/2/MatrixRTCoefficientsTest.h
new file mode 100644
index 0000000..0d4456f
--- /dev/null
+++ b/Tests/UnitTests/Core/2/MatrixRTCoefficientsTest.h
@@ -0,0 +1,83 @@
+#ifndef MATRIXRTCOEFFICIENTSTEST_H
+#define MATRIXRTCOEFFICIENTSTEST_H
+
+#include "MatrixRTCoefficients.h"
+
+class MatrixRTCoefficientsTest : public ::testing :: Test
+{
+protected:
+    MatrixRTCoefficientsTest();
+    virtual ~MatrixRTCoefficientsTest(){}
+
+    MatrixRTCoefficients mrtcDefault;
+};
+
+MatrixRTCoefficientsTest::MatrixRTCoefficientsTest()
+{
+}
+
+TEST_F(MatrixRTCoefficientsTest, T1plus)
+{
+    Eigen::Vector2cd vector = mrtcDefault.T1plus();
+    EXPECT_EQ(complex_t(0.5,0.0), vector(0));
+    EXPECT_EQ(0.0, vector(1));
+}
+
+TEST_F(MatrixRTCoefficientsTest, T1min)
+{
+    Eigen::Vector2cd vector = mrtcDefault.T1min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(0.5,0.0), vector(1));
+}
+
+TEST_F(MatrixRTCoefficientsTest, T2plus)
+{
+    Eigen::Vector2cd vector = mrtcDefault.T2plus();
+    EXPECT_EQ(complex_t(0.5,0.0), vector(0));
+    EXPECT_EQ(0.0, vector(1));
+}
+
+TEST_F(MatrixRTCoefficientsTest, T2min)
+{
+    Eigen::Vector2cd vector = mrtcDefault.T2min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(0.5,0.0), vector(1));
+}
+
+
+TEST_F(MatrixRTCoefficientsTest, R1plus)
+{
+    Eigen::Vector2cd vector = mrtcDefault.R1plus();
+    EXPECT_EQ(complex_t(-0.5,0.0), vector(0));
+    EXPECT_EQ(0.0, vector(1));
+}
+
+TEST_F(MatrixRTCoefficientsTest, R1min)
+{
+    Eigen::Vector2cd vector = mrtcDefault.R1min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(-0.5,0.0), vector(1));
+}
+
+TEST_F(MatrixRTCoefficientsTest, R2plus)
+{
+    Eigen::Vector2cd vector = mrtcDefault.R2plus();
+    EXPECT_EQ(complex_t(-0.5,0.0), vector(0));
+    EXPECT_EQ(0.0, vector(1));
+}
+
+TEST_F(MatrixRTCoefficientsTest, R2min)
+{
+    Eigen::Vector2cd vector = mrtcDefault.R2min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(-0.5,0.0), vector(1));
+}
+
+TEST_F(MatrixRTCoefficientsTest, getKz)
+{
+    Eigen::Vector2cd vector = mrtcDefault.getKz();
+    EXPECT_EQ(complex_t(0.0,0.0), vector(0));
+    EXPECT_EQ(complex_t(0.0,0.0), vector(1));
+}
+
+#endif // MATRIXRTCOEFFICIENTSTEST_H
diff --git a/Tests/UnitTests/Core/2/ScalarRTCoefficientsTest.h b/Tests/UnitTests/Core/2/ScalarRTCoefficientsTest.h
new file mode 100644
index 0000000..50359ea
--- /dev/null
+++ b/Tests/UnitTests/Core/2/ScalarRTCoefficientsTest.h
@@ -0,0 +1,136 @@
+#ifndef SCALARRTCOEFFICIENTSTEST_H
+#define SCALARRTCOEFFICIENTSTEST_H
+
+#include "ScalarRTCoefficients.h"
+
+class ScalarRTCoefficientsTest : public ::testing :: Test
+{
+protected:
+    ScalarRTCoefficientsTest();
+    virtual ~ScalarRTCoefficientsTest(){}
+
+    ScalarRTCoefficients scrtDefault;
+    ScalarRTCoefficients scrtCustom;
+
+};
+
+ScalarRTCoefficientsTest::ScalarRTCoefficientsTest()
+{
+    scrtCustom.lambda = complex_t(1.0, 1.0);
+    scrtCustom.kz = complex_t(1.0, 1.0);
+    scrtCustom.t_r(0) = complex_t(0.0, 0.5);
+    scrtCustom.t_r(1) = complex_t(1.0, 0.5);
+}
+
+TEST_F(ScalarRTCoefficientsTest, T1plus)
+{
+    Eigen::Vector2cd vector = scrtDefault.T1plus();
+    EXPECT_EQ(complex_t(0.0,0.0), vector(0));
+    EXPECT_EQ(0.0, vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.T1plus();
+    EXPECT_EQ(complex_t(0.0,0.0), vector2(0));
+    EXPECT_EQ(0.0, vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, T1min)
+{
+    Eigen::Vector2cd vector = scrtDefault.T1min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(1.0,0.0), vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.T1min();
+    EXPECT_EQ(0.0, vector2(0));
+    EXPECT_EQ(complex_t(0.0,0.5), vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, T2plus)
+{
+    Eigen::Vector2cd vector = scrtDefault.T2plus();
+    EXPECT_EQ(complex_t(1.0,0.0), vector(0));
+    EXPECT_EQ(0.0, vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.T2plus();
+    EXPECT_EQ(complex_t(0.0, 0.5), vector2(0));
+    EXPECT_EQ(0.0, vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, T2min)
+{
+    Eigen::Vector2cd vector = scrtDefault.T2min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(0.0,0.0), vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.T2min();
+    EXPECT_EQ(0.0, vector2(0));
+    EXPECT_EQ(complex_t(0.0,0.0), vector2(1));
+}
+
+
+TEST_F(ScalarRTCoefficientsTest, R1plus)
+{
+    Eigen::Vector2cd vector = scrtDefault.R1plus();
+    EXPECT_EQ(complex_t(0.0,0.0), vector(0));
+    EXPECT_EQ(0.0, vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.R1plus();
+    EXPECT_EQ(complex_t(0.0,0.0), vector2(0));
+    EXPECT_EQ(0.0, vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, R1min)
+{
+    Eigen::Vector2cd vector = scrtDefault.R1min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(0.0,0.0), vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.R1min();
+    EXPECT_EQ(0.0, vector2(0));
+    EXPECT_EQ(complex_t(1.0,0.5), vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, R2plus)
+{
+    Eigen::Vector2cd vector = scrtDefault.R2plus();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(0.0, vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.R2plus();
+    EXPECT_EQ(complex_t(1.0,0.5), vector2(0));
+    EXPECT_EQ(0.0, vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, R2min)
+{
+    Eigen::Vector2cd vector = scrtDefault.R2min();
+    EXPECT_EQ(0.0, vector(0));
+    EXPECT_EQ(complex_t(0.0,0.0), vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.R2min();
+    EXPECT_EQ(0.0, vector2(0));
+    EXPECT_EQ(complex_t(0.0,0.0), vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, getKz)
+{
+    Eigen::Vector2cd vector = scrtDefault.getKz();
+    EXPECT_EQ(complex_t(0.0,0.0), vector(0));
+    EXPECT_EQ(complex_t(0.0,0.0), vector(1));
+
+    Eigen::Vector2cd vector2 = scrtCustom.getKz();
+    EXPECT_EQ(complex_t(1.0,1.0), vector2(0));
+    EXPECT_EQ(complex_t(1.0,1.0), vector2(1));
+}
+
+TEST_F(ScalarRTCoefficientsTest, getScalar)
+{
+    EXPECT_EQ(complex_t(1.0,0.0), scrtDefault.getScalarT());
+    EXPECT_EQ(complex_t(0.0,0.0), scrtDefault.getScalarR());
+    EXPECT_EQ(complex_t(0.0,0.0), scrtDefault.getScalarKz());
+
+    EXPECT_EQ(complex_t(0.0,0.5), scrtCustom.getScalarT());
+    EXPECT_EQ(complex_t(1.0,0.5), scrtCustom.getScalarR());
+    EXPECT_EQ(complex_t(1.0,1.0), scrtCustom.getScalarKz());
+}
+
+#endif // SCALARRTCOEFFICIENTSTEST_H
diff --git a/Tests/UnitTests/Core/2/SpecularMatrixTest.h b/Tests/UnitTests/Core/2/SpecularMatrixTest.h
new file mode 100644
index 0000000..7fee618
--- /dev/null
+++ b/Tests/UnitTests/Core/2/SpecularMatrixTest.h
@@ -0,0 +1,33 @@
+#ifndef SPECULARMATRIXTEST_H
+#define SPECULARMATRIXTEST_H
+
+#include "SpecularMatrix.h"
+#include "Units.h"
+
+class SpecularMatrixTest : public ::testing :: Test
+{
+protected:
+    SpecularMatrixTest();
+    virtual ~SpecularMatrixTest(){}
+};
+
+SpecularMatrixTest::SpecularMatrixTest() {}
+
+TEST_F(SpecularMatrixTest, initial)
+{
+    MultiLayer mLayer;
+    kvector_t v;
+    SpecularMatrix::MultiLayerCoeff_t coeff;
+
+    // @Error: Throws exception (Layer index is out of bounds)
+    //matrix.execute(mLayer, v, coeff);
+
+
+    HomogeneousMaterial air("air",0,1.0);
+    Layer layer0(air, 0*Units::nanometer);
+    mLayer.addLayer(layer0);
+
+    SpecularMatrix::execute(mLayer, v, coeff);
+}
+
+#endif // SPECULARMATRIXTEST_H
diff --git a/Tests/UnitTests/Core/2/SpecularSimulationTest.h b/Tests/UnitTests/Core/2/SpecularSimulationTest.h
new file mode 100644
index 0000000..eb12651
--- /dev/null
+++ b/Tests/UnitTests/Core/2/SpecularSimulationTest.h
@@ -0,0 +1,124 @@
+#ifndef SPECULARSIMULATIONTEST_H
+#define SPECULARSIMULATIONTEST_H
+
+#include "SpecularSimulation.h"
+#include "HomogeneousMaterial.h"
+#include "IMultiLayerBuilder.h"
+#include "Exceptions.h"
+#include "FixedBinAxis.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "Units.h"
+#include <iostream>
+
+class SpecularSimulationTest : public ::testing::Test
+{
+ protected:
+    SpecularSimulationTest();
+    MultiLayer multilayer;
+};
+
+SpecularSimulationTest::SpecularSimulationTest()
+{
+    HomogeneousMaterial mat0("ambience", 0.0, 0.0);
+    HomogeneousMaterial mat1("PartA", 5e-6, 0.0);
+    HomogeneousMaterial mat2("substrate", 15e-6, 0.0);
+
+    Layer layer0(mat0);
+    Layer layer1(mat1, 10*Units::nanometer);
+    Layer layer2(mat2);
+
+    multilayer.addLayer(layer0);
+    multilayer.addLayer(layer1);
+    multilayer.addLayer(layer2);
+}
+
+TEST_F(SpecularSimulationTest, InitialState)
+{
+    SpecularSimulation sim;
+    ASSERT_THROW( sim.runSimulation(), Exceptions::ClassInitializationException);
+    EXPECT_EQ(nullptr, sim.getAlphaAxis());
+    EXPECT_EQ(nullptr, sim.getSample());
+    EXPECT_EQ(nullptr, sim.getSampleBuilder().get());
+    ASSERT_THROW( sim.getScalarR(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( sim.getScalarT(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( sim.getScalarKz(0), Exceptions::ClassInitializationException);
+}
+
+TEST_F(SpecularSimulationTest, CloneOfEmpty)
+{
+    SpecularSimulation sim;
+
+    SpecularSimulation *clone = sim.clone();
+    ASSERT_THROW( clone->runSimulation(), Exceptions::ClassInitializationException);
+    EXPECT_EQ(nullptr, clone->getAlphaAxis());
+    EXPECT_EQ(nullptr, clone->getSample());
+    EXPECT_EQ(nullptr, clone->getSampleBuilder().get());
+    ASSERT_THROW( clone->getScalarR(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( clone->getScalarT(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( clone->getScalarKz(0), Exceptions::ClassInitializationException);
+    delete clone;
+}
+
+TEST_F(SpecularSimulationTest, SetBeamParameters)
+{
+    SpecularSimulation sim;
+
+    sim.setBeamParameters(1.0, 10, -2.0, 3.0);
+    EXPECT_EQ(size_t(10), sim.getAlphaAxis()->size());
+    EXPECT_EQ(-2.0, sim.getAlphaAxis()->getMin());
+    EXPECT_EQ(3.0, sim.getAlphaAxis()->getMax());
+
+    FixedBinAxis axis("axis",2, -1.0, 2.0);
+    sim.setBeamParameters(1.0, axis);
+    EXPECT_EQ(size_t(2), sim.getAlphaAxis()->size());
+    EXPECT_EQ(-1.0, sim.getAlphaAxis()->getMin());
+    EXPECT_EQ(2.0, sim.getAlphaAxis()->getMax());
+}
+
+TEST_F(SpecularSimulationTest, ConstructSimulation)
+{
+    SpecularSimulation sim;
+    sim.setBeamParameters(1.0, 10, 0.0*Units::degree, 2.0*Units::degree);
+    sim.setSample(multilayer);
+    EXPECT_EQ( size_t(3), dynamic_cast<MultiLayer *>(sim.getSample())->getNumberOfLayers());
+
+    ASSERT_THROW( sim.getScalarR(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( sim.getScalarT(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( sim.getScalarKz(0), Exceptions::ClassInitializationException);
+
+    sim.runSimulation();
+    EXPECT_EQ(size_t(10), sim.getScalarR(0).size());
+    EXPECT_EQ(size_t(10), sim.getScalarT(0).size());
+    EXPECT_EQ(size_t(10), sim.getScalarKz(0).size());
+
+    ASSERT_THROW( sim.getScalarR(3), Exceptions::OutOfBoundsException);
+    ASSERT_THROW( sim.getScalarT(3), Exceptions::OutOfBoundsException);
+    ASSERT_THROW( sim.getScalarKz(3), Exceptions::OutOfBoundsException);
+
+}
+
+TEST_F(SpecularSimulationTest, SimulationClone)
+{
+    SpecularSimulation sim;
+    sim.setBeamParameters(1.0, 10, 0.0*Units::degree, 2.0*Units::degree);
+    sim.setSample(multilayer);
+
+    SpecularSimulation *clone = sim.clone();
+
+    EXPECT_EQ( size_t(3), dynamic_cast<MultiLayer *>(clone->getSample())->getNumberOfLayers());
+
+    ASSERT_THROW( clone->getScalarR(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( clone->getScalarT(0), Exceptions::ClassInitializationException);
+    ASSERT_THROW( clone->getScalarKz(0), Exceptions::ClassInitializationException);
+    delete clone;
+
+    sim.runSimulation();
+
+    clone = sim.clone();
+    EXPECT_EQ(size_t(10), clone->getScalarR(0).size());
+    EXPECT_EQ(size_t(10), clone->getScalarT(0).size());
+    EXPECT_EQ(size_t(10), clone->getScalarKz(0).size());
+}
+
+#endif // SPECULARSIMULATIONTEST_H
diff --git a/Tests/UnitTests/Core/2/main.cpp b/Tests/UnitTests/Core/2/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/2/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/2/testlist.h b/Tests/UnitTests/Core/2/testlist.h
new file mode 100644
index 0000000..b1f5789
--- /dev/null
+++ b/Tests/UnitTests/Core/2/testlist.h
@@ -0,0 +1,8 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+//#include "ScalarSpecularInfoMapTest.h"
+//#include "MatrixSpecularInfoMapTest.h"
+#include "ScalarRTCoefficientsTest.h"
+#include "MatrixRTCoefficientsTest.h"
+#include "SpecularSimulationTest.h"
+#include "SpecularMatrixTest.h"
diff --git a/Tests/UnitTests/Core/3/DetectorMaskTest.h b/Tests/UnitTests/Core/3/DetectorMaskTest.h
new file mode 100644
index 0000000..0d7915f
--- /dev/null
+++ b/Tests/UnitTests/Core/3/DetectorMaskTest.h
@@ -0,0 +1,169 @@
+#ifndef DETECTORMASKTEST_H
+#define DETECTORMASKTEST_H
+
+#include "DetectorMask.h"
+#include "SphericalDetector.h"
+#include "Polygon.h"
+#include <memory>
+
+class DetectorMaskTest : public ::testing::Test
+{
+public:
+};
+
+
+TEST_F(DetectorMaskTest, InitialState)
+{
+    DetectorMask test;
+    EXPECT_FALSE(test.isMasked(0));
+    EXPECT_FALSE(test.getMaskData()->isInitialized());
+}
+
+
+//  4.0  -------------------------------------------------------------------------
+//       |  5  |  11 |  17 | 23  | 29  | 35  | 41  | 47  | 53  | 59  | 65  | 71  |
+//  3.0  -------------------------------------------------------------------------
+//       |  4  |  10 |  16 | 22  | 28  | 34  | 40  | 46  | 52  | 58  | 64  | 70  |
+//  2.0  -------------------------------------------------------------------------
+//       |  3  |  9  |  15 | 21  | 27  | 33  | 39  | 45  | 51  | 57  | 63  | 69  |
+//  1.0  -------------------------------------------------------------------------
+//       |  2  |  8  |  14 | 20  | 26  | 32  | 38  | 44  | 50  | 56  | 62  | 68  |
+//  0.0  -------------------------------------------------------------------------
+//       |  1  |  7  |  13 | 19  | 25  | 31  | 37  | 43  | 49  | 55  | 61  | 67  |
+// -1.0  -------------------------------------------------------------------------
+//       |  0  |  6  |  12 | 18  | 24  | 30  | 36  | 42  | 48  | 54  | 60  | 66  |
+// -2.0  -------------------------------------------------------------------------
+//     -4.0  -3.0  -2.0  -1.0   0.0   1.0   2.0   3.0   4.0   5.0   6.0   7.0   8.0
+
+TEST_F(DetectorMaskTest, AddMask)
+{
+    DetectorMask detectorMask;
+
+    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+    Geometry::Polygon polygon(x, y);
+
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("x-axis", 12, -4.0, 8.0));
+    detector.addAxis(FixedBinAxis("y-axis", 6, -2.0, 4.0));
+
+    // initializing mask with detector and one shape
+    detectorMask.addMask(polygon, true);
+    detectorMask.initMaskData(detector);
+
+    EXPECT_TRUE(detectorMask.getMaskData()->isInitialized());
+
+    for(size_t index=0; index<detectorMask.getMaskData()->getAllocatedSize(); ++index) {
+        double x = detectorMask.getMaskData()->getAxisValue(index, 0);
+        double y = detectorMask.getMaskData()->getAxisValue(index, 1);
+        if( x>= -4.0 && x <=4.0 && y>=-2.0 && y<=2.0) {
+            EXPECT_TRUE(detectorMask.isMasked(index));
+        } else {
+            EXPECT_FALSE(detectorMask.isMasked(index));
+        }
+    }
+
+    EXPECT_EQ(detectorMask.numberOfMaskedChannels(), 32);
+
+    // adding second mask of same size which discard previous one
+    detectorMask.addMask(polygon, false);
+    detectorMask.initMaskData(detector);
+
+    for(size_t index=0; index<detectorMask.getMaskData()->getAllocatedSize(); ++index) {
+        EXPECT_FALSE(detectorMask.isMasked(index));
+    }
+    EXPECT_EQ(detectorMask.numberOfMaskedChannels(), 0);
+
+    // adding third mask
+    x = {5.0, 5.0, 8.0, 8.0, 5.0};
+    y = {2.0, 4.0, 4.0, 2.0, 2.0};
+    Geometry::Polygon polygon2(x, y);
+    detectorMask.addMask(polygon2, true);
+    detectorMask.initMaskData(detector);
+    for(size_t index=0; index<detectorMask.getMaskData()->getAllocatedSize(); ++index) {
+        double x = detectorMask.getMaskData()->getAxisValue(index, 0);
+        double y = detectorMask.getMaskData()->getAxisValue(index, 1);
+        if( x>= 5.0 && x <=8.0 && y>=2.0 && y<=4.0) {
+            EXPECT_TRUE(detectorMask.isMasked(index));
+        } else {
+            EXPECT_FALSE(detectorMask.isMasked(index));
+        }
+    }
+
+    // clearing all masks
+    detectorMask.removeMasks();
+    detectorMask.initMaskData(detector);
+    for(size_t index=0; index<detectorMask.getMaskData()->getAllocatedSize(); ++index) {
+        EXPECT_FALSE(detectorMask.isMasked(index));
+    }
+
+}
+
+
+TEST_F(DetectorMaskTest, AssignmentOperator)
+{
+    DetectorMask detectorMask;
+
+    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+    Geometry::Polygon polygon(x, y);
+
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("x-axis", 12, -4.0, 8.0));
+    detector.addAxis(FixedBinAxis("y-axis", 6, -2.0, 4.0));
+
+    // initializing mask with detector and one shape
+    detectorMask.addMask(polygon, true);
+    detectorMask.initMaskData(detector);
+
+    DetectorMask mask = detectorMask;
+
+    EXPECT_TRUE(mask.getMaskData()->isInitialized());
+
+    for(size_t index=0; index<mask.getMaskData()->getAllocatedSize(); ++index) {
+        double x = mask.getMaskData()->getAxisValue(index, 0);
+        double y = mask.getMaskData()->getAxisValue(index, 1);
+        if( x>= -4.0 && x <=4.0 && y>=-2.0 && y<=2.0) {
+            EXPECT_TRUE(mask.isMasked(index));
+        } else {
+            EXPECT_FALSE(mask.isMasked(index));
+        }
+    }
+    EXPECT_EQ(mask.numberOfMaskedChannels(), 32);
+
+}
+
+
+TEST_F(DetectorMaskTest, CopyConstructor)
+{
+    DetectorMask detectorMask;
+
+    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+    Geometry::Polygon polygon(x, y);
+
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("x-axis", 12, -4.0, 8.0));
+    detector.addAxis(FixedBinAxis("y-axis", 6, -2.0, 4.0));
+
+    // initializing mask with detector and one shape
+    detectorMask.addMask(polygon, true);
+    detectorMask.initMaskData(detector);
+
+    DetectorMask mask(detectorMask);
+
+    EXPECT_TRUE(mask.getMaskData()->isInitialized());
+
+    for(size_t index=0; index<mask.getMaskData()->getAllocatedSize(); ++index) {
+        double x = mask.getMaskData()->getAxisValue(index, 0);
+        double y = mask.getMaskData()->getAxisValue(index, 1);
+        if( x>= -4.0 && x <=4.0 && y>=-2.0 && y<=2.0) {
+            EXPECT_TRUE(mask.isMasked(index));
+        } else {
+            EXPECT_FALSE(mask.isMasked(index));
+        }
+    }
+}
+
+
+#endif // DETECTORMASKTEST_H
diff --git a/Tests/UnitTests/Core/3/PolygonTest.h b/Tests/UnitTests/Core/3/PolygonTest.h
new file mode 100644
index 0000000..a5edbcc
--- /dev/null
+++ b/Tests/UnitTests/Core/3/PolygonTest.h
@@ -0,0 +1,140 @@
+#ifndef POLYGONTEST_H
+#define POLYGONTEST_H
+
+#include "Polygon.h"
+#include <memory>
+
+class PolygonTest : public ::testing::Test
+{
+public:
+};
+
+
+TEST_F(PolygonTest, SimpleRectangle)
+{
+    // simple closed rectangle
+    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+    Geometry::Polygon polygon(x, y);
+    EXPECT_DOUBLE_EQ(32.0, polygon.getArea());
+    EXPECT_TRUE(polygon.contains(0.0, 0.0));
+    EXPECT_TRUE(polygon.contains(4.0, 2.0));
+    EXPECT_TRUE(polygon.contains(-4.0, -2.0));
+    EXPECT_TRUE(polygon.contains(-4.0, -2.0));
+    EXPECT_FALSE(polygon.contains(0.0, 2.01));
+    EXPECT_FALSE(polygon.contains(4.0, -2.01));
+
+    // unclosed rectangle (should be closed automatically)
+    x = {4.0, -4.0, -4.0, 4.0};
+    y = {2.0, 2.0, -2.0, -2.0};
+    Geometry::Polygon polygon2(x, y);
+    EXPECT_DOUBLE_EQ(32.0, polygon2.getArea());
+    EXPECT_TRUE(polygon2.contains(0.0, 0.0));
+    EXPECT_TRUE(polygon2.contains(4.0, 2.0));
+    EXPECT_TRUE(polygon2.contains(-4.0, -2.0));
+    EXPECT_TRUE(polygon2.contains(-4.0, -2.0));
+    EXPECT_FALSE(polygon2.contains(0.0, 2.01));
+    EXPECT_FALSE(polygon2.contains(4.0, -2.01));
+}
+
+//     *******
+//      *   *
+//       * *
+//        *
+//       * *
+//      *   *
+//     *******
+
+TEST_F(PolygonTest, SandWatchShape)
+{
+    std::vector<double> x = {2.0, -2.0, 2.0, -2.0, 2.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+    Geometry::Polygon polygon(x, y);
+//    std::cout << polygon << std::endl;
+
+    // for some reason area calculation doesn't work for boost's polygon of such shape
+    // EXPECT_DOUBLE_EQ(8.0, polygon.getArea());
+
+    EXPECT_TRUE(polygon.contains(2.0, 2.0));
+    EXPECT_TRUE(polygon.contains(-2.0, 2.0));
+    EXPECT_TRUE(polygon.contains(0.0, 0.0));
+    EXPECT_TRUE(polygon.contains(0.0, 1.0));
+
+    EXPECT_FALSE(polygon.contains(1.0, 0.0));
+    EXPECT_FALSE(polygon.contains(-1.5, 0.5));
+
+}
+
+TEST_F(PolygonTest, ContainsBin)
+{
+    // simple closed rectangle
+    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+    Geometry::Polygon polygon(x, y);
+
+    Bin1D binx1(3.5, 4.5);
+    Bin1D biny1(1.5, 2.5);
+    EXPECT_TRUE(polygon.contains(binx1, biny1));
+
+    Bin1D binx2(3.5, 4.6);
+    Bin1D biny2(1.5, 2.6);
+    EXPECT_FALSE(polygon.contains(binx2, biny2));
+}
+
+
+TEST_F(PolygonTest, Clone)
+{
+    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+    Geometry::Polygon polygon(x, y);
+
+    std::unique_ptr<Geometry::Polygon > clone(polygon.clone());
+    EXPECT_DOUBLE_EQ(32.0, clone->getArea());
+    EXPECT_TRUE(clone->contains(0.0, 0.0));
+    EXPECT_TRUE(clone->contains(4.0, 2.0));
+    EXPECT_TRUE(clone->contains(-4.0, -2.0));
+    EXPECT_TRUE(clone->contains(-4.0, -2.0));
+    EXPECT_FALSE(clone->contains(0.0, 2.01));
+    EXPECT_FALSE(clone->contains(4.0, -2.01));
+}
+
+TEST_F(PolygonTest, ConstructFrom2DArray)
+{
+    // simple closed rectangle
+    const size_t npoints(5);
+    double array[npoints][2] = {{4.0, 2.0}, {-4.0, 2.0}, {-4.0, -2.0}, {4.0, -2.0}, {4.0, 2.0}};
+
+    std::vector<std::vector<double > > points;
+    for(size_t i=0; i<npoints; ++i) {
+        std::vector<double> p = {array[i][0], array[i][1]};
+        points.push_back(p);
+    }
+
+    Geometry::Polygon polygon(points);
+    EXPECT_DOUBLE_EQ(32.0, polygon.getArea());
+    EXPECT_TRUE(polygon.contains(0.0, 0.0));
+    EXPECT_TRUE(polygon.contains(4.0, 2.0));
+    EXPECT_TRUE(polygon.contains(-4.0, -2.0));
+    EXPECT_TRUE(polygon.contains(-4.0, -2.0));
+    EXPECT_FALSE(polygon.contains(0.0, 2.01));
+    EXPECT_FALSE(polygon.contains(4.0, -2.01));
+}
+
+//TEST_F(PolygonTest, GetPoints)
+//{
+//    std::vector<double> xpos;
+//    std::vector<double> ypos;
+
+//    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+//    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+//    Geometry::Polygon polygon(x, y);
+
+//    polygon.getPoints(xpos, ypos);
+//    for(size_t i=0; i<xpos.size(); ++i) {
+//        std::cout << xpos[i] << " " << ypos[i] << std::endl;
+//    }
+
+//}
+
+
+#endif // POLYGONTEST_H
diff --git a/Tests/UnitTests/Core/3/PrecomputedTest.h b/Tests/UnitTests/Core/3/PrecomputedTest.h
new file mode 100644
index 0000000..f681137
--- /dev/null
+++ b/Tests/UnitTests/Core/3/PrecomputedTest.h
@@ -0,0 +1,29 @@
+#ifndef PRECOMPUTEDTEST_H
+#define PRECOMPUTEDTEST_H
+
+#include "Precomputed.h"
+#include <memory>
+
+class PrecomputedTest : public ::testing::Test
+{
+public:
+};
+
+TEST_F(PrecomputedTest, Factorial)
+{
+    const double eps = 2.3e-16; // about the machine precision
+    auto& precomputed = Precomputed::instance();
+    EXPECT_TRUE(precomputed.factorial.size()>150);
+    EXPECT_DOUBLE_EQ(precomputed.factorial[0], 1.);
+    EXPECT_DOUBLE_EQ(precomputed.factorial[1], 1.);
+    EXPECT_DOUBLE_EQ(precomputed.factorial[2], 2.);
+    EXPECT_DOUBLE_EQ(precomputed.factorial[3], 6.);
+    /* the following disabled because tgamma is too unprecise under
+       old versions of glibc (at leat up to 2.12, but less than 2.22)
+    for( size_t k=4; k<precomputed.factorial.size(); ++k )
+        EXPECT_NEAR(precomputed.factorial[k], tgamma(k+1.), 12*eps*tgamma(k+1.) );
+    */
+    EXPECT_NEAR(precomputed.factorial[150], 5.71338395644585459e262, 4*eps*precomputed.factorial[150]);
+}
+
+#endif // PRECOMPUTEDTEST_H
diff --git a/Tests/UnitTests/Core/3/RectangularDetectorTest.h b/Tests/UnitTests/Core/3/RectangularDetectorTest.h
new file mode 100644
index 0000000..590ed8f
--- /dev/null
+++ b/Tests/UnitTests/Core/3/RectangularDetectorTest.h
@@ -0,0 +1,266 @@
+#ifndef RECTANGULARDETECTORTEST_H
+#define RECTANGULARDETECTORTEST_H
+
+#include "RectangularDetector.h"
+#include "GISASSimulation.h"
+#include "SimulationElement.h"
+#include "Numeric.h"
+#include "Units.h"
+#include <memory>
+#include <iostream>
+
+class RectangularDetectorTest : public ::testing::Test
+{
+ protected:
+    RectangularDetectorTest(){}
+    virtual ~RectangularDetectorTest(){}
+
+    double phi(SimulationElement &element) {return element.getPhiMean()/Units::degree; }
+    double alpha(SimulationElement &element) {return element.getAlphaMean()/Units::degree; }
+    double phi(kvector_t k) {return k.phi()/Units::degree; }
+    double alpha(kvector_t k) {return 90.0 - k.theta()/Units::degree; }
+
+    bool isEqual(const kvector_t lhs, const kvector_t rhs) {
+        bool is_equal = Numeric::areAlmostEqual(lhs.x(), rhs.x()) &&
+                Numeric::areAlmostEqual(lhs.y(), rhs.y()) &&
+                Numeric::areAlmostEqual(lhs.z(), rhs.z());
+        if(!is_equal) {
+            std::cout << "lhs:" << lhs << " rhs:" << rhs << " diff:" << (lhs-rhs) << std::endl;
+        }
+        return is_equal;
+    }
+};
+
+TEST_F(RectangularDetectorTest, InitialState)
+{
+    RectangularDetector det(50, 10.0, 60, 20.0);
+    EXPECT_EQ(size_t(50), det.getNbinsX());
+    EXPECT_EQ(10.0, det.getWidth());
+    EXPECT_EQ(size_t(60), det.getNbinsY());
+    EXPECT_EQ(20.0, det.getHeight());
+
+    EXPECT_EQ(0.0, det.getU0());
+    EXPECT_EQ(0.0, det.getV0());
+    EXPECT_EQ(0.0, det.getDistance());
+
+    EXPECT_TRUE(kvector_t() == det.getNormalVector());
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+
+    EXPECT_EQ(RectangularDetector::GENERIC, det.getDetectorArrangment());
+}
+
+TEST_F(RectangularDetectorTest, Clone)
+{
+    RectangularDetector det(50, 10.0, 60, 20.0);
+    kvector_t normal(10.0, 20.0, 30.0);
+    kvector_t direction(1.0, 2.0, 3.0);
+    double u0(88.0), v0(99.0);
+    det.setPosition(normal, u0, v0, direction);
+
+    std::unique_ptr<RectangularDetector> clone(det.clone());
+    EXPECT_EQ(u0, clone->getU0());
+    EXPECT_EQ(v0, clone->getV0());
+    EXPECT_TRUE(normal == clone->getNormalVector());
+    EXPECT_TRUE(direction == clone->getDirectionVector());
+    EXPECT_EQ(RectangularDetector::GENERIC, clone->getDetectorArrangment());
+}
+
+TEST_F(RectangularDetectorTest, PerpToSample)
+{
+    int nbinsx(5), nbinsy(4);
+    double width(50.0), height(40.0);
+    double distance(100.0), u0(20.0), v0(10.0);
+    double dx = width/nbinsx;
+    double dy = height/nbinsy;
+
+    RectangularDetector det(nbinsx, width, nbinsy, height);
+
+    // detector perpendicular to sample
+    det.setPerpendicularToSampleX(distance, u0, v0);
+    EXPECT_EQ(distance, det.getDistance());
+    EXPECT_EQ(u0, det.getU0());
+    EXPECT_EQ(v0, det.getV0());
+    EXPECT_TRUE(kvector_t() == det.getNormalVector());
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+    EXPECT_EQ(RectangularDetector::PERPENDICULAR_TO_SAMPLE, det.getDetectorArrangment());
+
+    // initializing with the simulation
+    GISASSimulation simulation;
+    simulation.setBeamParameters(1.0, 10.0*Units::degree, 0.0);
+    det.init(simulation.getInstrument().getBeam());
+    EXPECT_TRUE(kvector_t(distance, 0, 0) == det.getNormalVector());
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+
+    std::vector<SimulationElement> elements = det.createSimulationElements(simulation.getInstrument().getBeam());
+    EXPECT_EQ(elements.size(), size_t(nbinsx*nbinsy));
+
+    // lower left bin
+    kvector_t k(distance, u0-dx/2., (-v0+dy/2.));
+    SimulationElement element = elements[0];
+    EXPECT_DOUBLE_EQ(phi(k), phi(element));
+    EXPECT_NEAR(alpha(k), alpha(element), 1e-10*std::abs(alpha(k)));
+
+    // upper left bin
+    k = kvector_t(distance, u0-dx/2., (height -  v0 - dy/2.));
+    element = elements[3];
+    EXPECT_DOUBLE_EQ(phi(k), phi(element));
+    EXPECT_NEAR(alpha(k), alpha(element), 1e-10*std::abs(alpha(k)));
+
+    // lower right bin
+    k = kvector_t(distance, -(width-u0-dx/2.), (-v0+dy/2.));
+    element = elements[16];
+    EXPECT_DOUBLE_EQ(phi(k), phi(element));
+    EXPECT_NEAR(alpha(k), alpha(element), 1e-10*std::abs(alpha(k)));
+
+    // upper right bin
+    k = kvector_t(distance, -(width-u0-dx/2.), (height -  v0 - dy/2.));
+    element = elements[19];
+    EXPECT_DOUBLE_EQ(phi(k), phi(element));
+    EXPECT_NEAR(alpha(k), alpha(element), 1e-10*std::abs(alpha(k)));
+}
+
+
+TEST_F(RectangularDetectorTest, PerpToDirectBeam)
+{
+    int nbinsx(5), nbinsy(4);
+    double width(50.0), height(40.0);
+    double distance(100.0), u0(20.0), v0(10.0);
+    double dx = width/nbinsx;
+    double dy = height/nbinsy;
+    double alpha_i(10.0*Units::degree);
+
+    RectangularDetector det(nbinsx, width, nbinsy, height);
+
+    // detector perpendicular to direct beam
+    det.setPerpendicularToDirectBeam(distance, u0, v0);
+    EXPECT_EQ(distance, det.getDistance());
+    EXPECT_EQ(u0, det.getU0());
+    EXPECT_EQ(v0, det.getV0());
+    EXPECT_TRUE(kvector_t() == det.getNormalVector());
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+    EXPECT_EQ(RectangularDetector::PERPENDICULAR_TO_DIRECT_BEAM, det.getDetectorArrangment());
+
+    // initializing with the simulation
+    GISASSimulation simulation;
+    simulation.setBeamParameters(1.0, alpha_i, 0.0);
+    det.init(simulation.getInstrument().getBeam());
+    kvector_t normal(distance*cos(alpha_i), 0.0, -1.0*distance*sin(alpha_i));
+    EXPECT_TRUE(isEqual(normal, det.getNormalVector()));
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+
+    std::vector<SimulationElement> elements = det.createSimulationElements(simulation.getInstrument().getBeam());
+    EXPECT_EQ(elements.size(), size_t(nbinsx*nbinsy));
+
+    // lower left bin
+    double ds = v0 - dy/2.;
+    double alpha_x = alpha_i+std::atan(ds/distance);
+    double c = distance*std::sin(alpha_i) + ds*std::cos(alpha_i);
+    double x = c/std::tan(alpha_x);
+    kvector_t k(x, u0-dx/2., -c);
+    SimulationElement element = elements[0];
+    EXPECT_DOUBLE_EQ(phi(k), phi(element));
+    EXPECT_NEAR(alpha(k), alpha(element), 1e-10*std::abs(alpha(k)));
+}
+
+
+TEST_F(RectangularDetectorTest, PerpToReflectedBeam)
+{
+    int nbinsx(5), nbinsy(4);
+    double width(50.0), height(40.0);
+    double distance(100.0), u0(20.0), v0(10.0);
+    double dx = width/nbinsx;
+    double dy = height/nbinsy;
+    double alpha_i(10.0*Units::degree);
+
+    RectangularDetector det(nbinsx, width, nbinsy, height);
+
+    // detector perpendicular to reflected beam
+    det.setPerpendicularToReflectedBeam(distance, u0, v0);
+    EXPECT_EQ(distance, det.getDistance());
+    EXPECT_EQ(u0, det.getU0());
+    EXPECT_EQ(v0, det.getV0());
+    EXPECT_TRUE(kvector_t() == det.getNormalVector());
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+    EXPECT_EQ(RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM, det.getDetectorArrangment());
+
+    // initializing with the simulation
+    GISASSimulation simulation;
+    simulation.setBeamParameters(1.0, alpha_i, 0.0);
+    det.init(simulation.getInstrument().getBeam());
+    kvector_t normal(distance*cos(alpha_i), 0.0, 1.0*distance*sin(alpha_i));
+    EXPECT_TRUE(isEqual(normal, det.getNormalVector()));
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+
+    // checking detector elements
+    std::vector<SimulationElement> elements = det.createSimulationElements(simulation.getInstrument().getBeam());
+    EXPECT_EQ(elements.size(), size_t(nbinsx*nbinsy));
+
+    double ds = v0 - dy/2.;
+    double alpha_x = alpha_i - std::atan(ds/distance);
+    double c = distance*std::sin(alpha_i) - std::cos(alpha_i)*ds;
+    double x = c/std::tan(alpha_x);
+
+    kvector_t k(x, u0-dx/2., c);
+    SimulationElement element = elements[0];
+    EXPECT_DOUBLE_EQ(phi(k), phi(element));
+    EXPECT_NEAR(alpha(k), alpha(element), 1e-10*std::abs(alpha(k)));
+}
+
+// detector perpendicular to reflected beam, when direct beam position is known
+TEST_F(RectangularDetectorTest, PerpToReflectedBeamDpos)
+{
+    int nbinsx(5), nbinsy(4);
+    double width(50.0), height(40.0);
+    double distance(100.0), u0(20.0), v0(10.0);
+    double dx = width/nbinsx;
+    double dy = height/nbinsy;
+    double alpha_i(10.0*Units::degree);
+
+    RectangularDetector det(nbinsx, width, nbinsy, height);
+
+    // detector perpendicular to reflected beam
+    det.setPerpendicularToReflectedBeam(distance);
+    EXPECT_EQ(distance, det.getDistance());
+    EXPECT_EQ(0.0, det.getU0());
+    EXPECT_EQ(0.0, det.getV0());
+    EXPECT_EQ(0.0, det.getDirectBeamU0());
+    EXPECT_EQ(0.0, det.getDirectBeamV0());
+
+    double dbeam_u0 = u0;
+    double dbeam_v0 = -distance*std::tan(alpha_i*2.0) + v0;
+    det.setDirectBeamPosition(dbeam_u0, dbeam_v0);
+
+    EXPECT_EQ(dbeam_u0, det.getDirectBeamU0());
+    EXPECT_EQ(dbeam_v0, det.getDirectBeamV0());
+    EXPECT_TRUE(kvector_t() == det.getNormalVector());
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+    EXPECT_EQ(RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM_DPOS, det.getDetectorArrangment());
+
+    // initializing with the simulation
+    GISASSimulation simulation;
+    simulation.setBeamParameters(1.0, alpha_i, 0.0);
+    det.init(simulation.getInstrument().getBeam());
+
+    kvector_t normal(distance*cos(alpha_i), 0.0, 1.0*distance*sin(alpha_i));
+    EXPECT_TRUE(isEqual(normal, det.getNormalVector()));
+    EXPECT_TRUE(kvector_t(0.0, -1.0, 0.0) == det.getDirectionVector());
+    EXPECT_EQ(u0, det.getU0());
+    EXPECT_EQ(v0, det.getV0());
+
+    // checking detector elements
+    std::vector<SimulationElement> elements = det.createSimulationElements(simulation.getInstrument().getBeam());
+    EXPECT_EQ(elements.size(), size_t(nbinsx*nbinsy));
+
+    double ds = v0 - dy/2.;
+    double alpha_x = alpha_i - std::atan(ds/distance);
+    double c = distance*std::sin(alpha_i) - std::cos(alpha_i)*ds;
+    double x = c/std::tan(alpha_x);
+
+    kvector_t k(x, u0-dx/2., c);
+    SimulationElement element = elements[0];
+    EXPECT_DOUBLE_EQ(phi(k), phi(element));
+    EXPECT_NEAR(alpha(k), alpha(element), 1e-10*std::abs(alpha(k)));
+}
+
+
+#endif // RECTANGULARDETECTORTEST_H
diff --git a/Tests/UnitTests/Core/3/RegionOfInterestTest.h b/Tests/UnitTests/Core/3/RegionOfInterestTest.h
new file mode 100644
index 0000000..2231879
--- /dev/null
+++ b/Tests/UnitTests/Core/3/RegionOfInterestTest.h
@@ -0,0 +1,117 @@
+#ifndef REGIONOFINTERESTTEST_H
+#define REGIONOFINTERESTTEST_H
+
+#include "RegionOfInterest.h"
+#include "SphericalDetector.h"
+#include "Exceptions.h"
+#include <memory>
+
+class RegionOfInterestTest : public ::testing::Test
+{
+ protected:
+    RegionOfInterestTest(){}
+    virtual ~RegionOfInterestTest(){}
+};
+
+//! Testing region of interest with reasonable area within the detector.
+
+TEST_F(RegionOfInterestTest, constructor)
+{
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("axis0", 8, -3.0, 5.0));
+    detector.addAxis(FixedBinAxis("axis1", 4, 0.0, 4.0));
+
+    // creating region of interest
+    double xlow(-1.9), ylow(1.1), xup(2.9), yup(2.85);
+    RegionOfInterest roi(detector, xlow, ylow, xup, yup);
+    EXPECT_EQ(roi.getXlow(), xlow);
+    EXPECT_EQ(roi.getYlow(), ylow);
+    EXPECT_EQ(roi.getXup(), xup);
+    EXPECT_EQ(roi.getYup(), yup);
+
+    // checking total size of the detector and roi in it
+    EXPECT_EQ(roi.detectorSize(), 32u);
+    EXPECT_EQ(roi.roiSize(), 10u);
+
+    // converting global detector index to local roi index
+    EXPECT_EQ(roi.roiIndex(5), 0u);
+    EXPECT_EQ(roi.roiIndex(6), 1u);
+    EXPECT_EQ(roi.roiIndex(9), 2u);
+    EXPECT_EQ(roi.roiIndex(21), 8u);
+    EXPECT_EQ(roi.roiIndex(22), 9u);
+    EXPECT_THROW(roi.roiIndex(23), Exceptions::RuntimeErrorException);
+
+    // converting local ro index to global detector index
+    EXPECT_EQ(roi.detectorIndex(0), 5u);
+    EXPECT_EQ(roi.detectorIndex(1), 6u);
+    EXPECT_EQ(roi.detectorIndex(2), 9u);
+    EXPECT_EQ(roi.detectorIndex(9), 22u);
+}
+
+
+//! Testing region of interest which is larger than the detector.
+
+TEST_F(RegionOfInterestTest, largeArea)
+{
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("axis0", 8, -3.0, 5.0));
+    detector.addAxis(FixedBinAxis("axis1", 4, 0.0, 4.0));
+
+    // creating region of interest
+    double xlow(-3.9), ylow(-1.1), xup(6.9), yup(5.85);
+    RegionOfInterest roi(detector, xlow, ylow, xup, yup);
+
+    // checking total size of the detector and roi in it
+    EXPECT_EQ(roi.detectorSize(), 32u);
+    EXPECT_EQ(roi.roiSize(), 32u);
+
+    // converting global detector index to local roi index
+    EXPECT_EQ(roi.roiIndex(5), 5u);
+    EXPECT_EQ(roi.roiIndex(6), 6u);
+    EXPECT_EQ(roi.roiIndex(9), 9u);
+    EXPECT_EQ(roi.roiIndex(27), 27u);
+
+    // converting local ro index to global detector index
+    EXPECT_EQ(roi.detectorIndex(0), 0u);
+    EXPECT_EQ(roi.detectorIndex(27), 27u);
+}
+
+//! Testing clone
+
+TEST_F(RegionOfInterestTest, clone)
+{
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("axis0", 8, -3.0, 5.0));
+    detector.addAxis(FixedBinAxis("axis1", 4, 0.0, 4.0));
+
+    // creating region of interest
+    double xlow(-1.9), ylow(1.1), xup(2.9), yup(2.85);
+    RegionOfInterest roi(detector, xlow, ylow, xup, yup);
+
+    std::unique_ptr<RegionOfInterest> clone(roi.clone());
+
+    EXPECT_EQ(clone->getXlow(), xlow);
+    EXPECT_EQ(clone->getYlow(), ylow);
+    EXPECT_EQ(clone->getXup(), xup);
+    EXPECT_EQ(clone->getYup(), yup);
+
+    // checking total size of the detector and roi in it
+    EXPECT_EQ(clone->detectorSize(), 32u);
+    EXPECT_EQ(clone->roiSize(), 10u);
+
+    // converting global detector index to local roi index
+    EXPECT_EQ(clone->roiIndex(5), 0u);
+    EXPECT_EQ(clone->roiIndex(6), 1u);
+    EXPECT_EQ(clone->roiIndex(9), 2u);
+    EXPECT_EQ(clone->roiIndex(21), 8u);
+    EXPECT_EQ(clone->roiIndex(22), 9u);
+    EXPECT_THROW(clone->roiIndex(23), Exceptions::RuntimeErrorException);
+
+    // converting local ro index to global detector index
+    EXPECT_EQ(clone->detectorIndex(0), 5u);
+    EXPECT_EQ(clone->detectorIndex(1), 6u);
+    EXPECT_EQ(clone->detectorIndex(2), 9u);
+    EXPECT_EQ(clone->detectorIndex(9), 22u);
+}
+
+#endif
diff --git a/Tests/UnitTests/Core/3/SimulationAreaTest.h b/Tests/UnitTests/Core/3/SimulationAreaTest.h
new file mode 100644
index 0000000..8871681
--- /dev/null
+++ b/Tests/UnitTests/Core/3/SimulationAreaTest.h
@@ -0,0 +1,203 @@
+#ifndef SIMULATIONAREATEST_H
+#define SIMULATIONAREATEST_H
+
+#include "SimulationArea.h"
+#include "SphericalDetector.h"
+#include "Rectangle.h"
+#include <memory>
+#include <iostream>
+
+class SimulationAreaTest : public ::testing::Test
+{
+ protected:
+    SimulationAreaTest(){}
+    virtual ~SimulationAreaTest(){}
+};
+
+// Iterators test
+
+TEST_F(SimulationAreaTest, iteratorOperations)
+{
+    SphericalDetector detector(4, -1.0, 3.0, 2, 0.0, 2.0);
+    SimulationArea area(&detector);
+
+    // begin iterator
+    SimulationArea::iterator it_begin = area.begin();
+    EXPECT_EQ(it_begin.index(), 0u);
+    EXPECT_EQ(it_begin.elementIndex(), 0u);
+    EXPECT_TRUE(it_begin == area.begin());
+    EXPECT_FALSE(it_begin != area.begin());
+
+    // end iterator
+    SimulationArea::iterator it_end = area.end();
+    EXPECT_EQ(it_end.index(), detector.getTotalSize());
+    EXPECT_EQ(it_end.elementIndex(), 0u); // has initial value
+
+    // begin/end comparison
+    EXPECT_TRUE(it_begin != it_end);
+    EXPECT_FALSE(it_begin == it_end);
+
+    // assignment
+    SimulationArea::iterator it = area.begin();
+    EXPECT_TRUE(it == it_begin);
+    EXPECT_FALSE(it != it_begin);
+
+    // increment
+    it++;
+    EXPECT_EQ(it.index(), 1u);
+    EXPECT_EQ(it.elementIndex(), 1u);
+    EXPECT_TRUE(it != it_begin);
+    EXPECT_FALSE(it == it_begin);
+    ++it;
+    EXPECT_EQ(it.index(), 2u);
+    EXPECT_EQ(it.elementIndex(), 2u);
+
+    // incrementing well behind the end
+    for(size_t i=0; i<100; ++i) ++it;
+    EXPECT_EQ(it.index(), detector.getTotalSize());
+    EXPECT_EQ(it.elementIndex(), detector.getTotalSize());
+}
+
+//! Iteration over non-masked detector
+
+TEST_F(SimulationAreaTest, detectorIteration)
+{
+    SphericalDetector detector(4, -1.0, 3.0, 2, 0.0, 2.0);
+    SimulationArea area(&detector);
+
+    std::vector<int> expectedIndexes = {0, 1, 2, 3, 4, 5, 6, 7};
+    std::vector<int> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7};
+
+    std::vector<int> indexes;
+    std::vector<int> elementIndexes;
+    std::vector<int> detectorIndexes;
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        indexes.push_back(it.index());
+        elementIndexes.push_back(it.elementIndex());
+        detectorIndexes.push_back(it.detectorIndex());
+    }
+    EXPECT_EQ(indexes, expectedIndexes);
+    EXPECT_EQ(elementIndexes, expectedElementIndexes);
+    EXPECT_EQ(detectorIndexes, expectedIndexes);
+}
+
+//! Iteration over masked detector
+
+TEST_F(SimulationAreaTest, maskedIteration)
+{
+    SphericalDetector detector(5, -1.0, 4.0, 4, 0.0, 4.0);
+    detector.addMask(Geometry::Rectangle(0.1, 1.1, 2.9, 2.9), true);
+    detector.addMask(Geometry::Rectangle(3.1, 3.1, 3.9, 3.9), true);
+    SimulationArea area(&detector);
+
+    std::vector<int> expectedIndexes = {0, 1, 2, 3, 4, 7, 8, 11, 12, 15, 16, 17, 18};
+    std::vector<int> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+    std::vector<int> indexes;
+    std::vector<int> elementIndexes;
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        indexes.push_back(it.index());
+        elementIndexes.push_back(it.elementIndex());
+    }
+    EXPECT_EQ(indexes, expectedIndexes);
+    EXPECT_EQ(elementIndexes, expectedElementIndexes);
+}
+
+//! Iteration over the detector with first and alst bin masked
+
+TEST_F(SimulationAreaTest, maskedCornerIteration)
+{
+    SphericalDetector detector(5, -1.0, 4.0, 4, 0.0, 4.0);
+    detector.addMask(Geometry::Rectangle(-0.9, 0.1, -0.1, 0.9), true);
+    detector.addMask(Geometry::Rectangle(3.1, 3.1, 3.9, 3.9), true);
+    SimulationArea area(&detector);
+
+    std::vector<int> expectedIndexes
+            = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
+    std::vector<int> expectedElementIndexes
+            = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
+    std::vector<int> indexes;
+    std::vector<int> elementIndexes;
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        indexes.push_back(it.index());
+        elementIndexes.push_back(it.elementIndex());
+    }
+    EXPECT_EQ(indexes, expectedIndexes);
+    EXPECT_EQ(elementIndexes, expectedElementIndexes);
+}
+
+//! Iteration when whole detector is masked
+
+TEST_F(SimulationAreaTest, allMaskedIteration)
+{
+    SphericalDetector detector(5, -1.0, 4.0, 4, 0.0, 4.0);
+    detector.addMask(Geometry::Rectangle(-0.9, 0.1, 3.9, 3.9), true);
+    SimulationArea area(&detector);
+
+    std::vector<int> indexes;
+    std::vector<int> elementIndexes;
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        indexes.push_back(it.index());
+        elementIndexes.push_back(it.elementIndex());
+    }
+    EXPECT_EQ(indexes.size(), size_t(0));
+    EXPECT_EQ(elementIndexes.size(), size_t(0));
+}
+
+//! Iteration when RegionOfInterest is present
+
+TEST_F(SimulationAreaTest, maskAndRoiIteration)
+{
+    SphericalDetector detector(5, -1.0, 4.0, 4, 0.0, 4.0);
+    detector.setRegionOfInterest(0.1, 1.1, 2.9, 3.9);
+    detector.addMask(Geometry::Rectangle(-0.9, 0.1, 0.9, 1.9), true);
+    SimulationArea area(&detector);
+
+    std::vector<int> expectedRoiIndexes = {1, 2, 3, 4, 5, 6, 7, 8};
+    std::vector<int> expectedDetectorIndexes = {6, 7, 9, 10, 11, 13, 14, 15};
+    std::vector<int> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7};
+    std::vector<int> indexes;
+    std::vector<int> elementIndexes;
+    std::vector<int> detectorIndexes;
+    std::vector<int> roiIndexes;
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        indexes.push_back(it.index());
+        elementIndexes.push_back(it.elementIndex());
+        detectorIndexes.push_back(it.detectorIndex());
+        roiIndexes.push_back(it.roiIndex());
+    }
+    EXPECT_EQ(indexes, expectedRoiIndexes);
+    EXPECT_EQ(elementIndexes, expectedElementIndexes);
+    EXPECT_EQ(detectorIndexes, expectedDetectorIndexes);
+    EXPECT_EQ(roiIndexes, expectedRoiIndexes);
+}
+
+//! Checking index of ROI
+
+TEST_F(SimulationAreaTest, indexInRoi)
+{
+    SphericalDetector detector(5, -1.0, 4.0, 4, 0.0, 4.0);
+    detector.setRegionOfInterest(0.1, 1.1, 2.9, 3.9);
+    detector.addMask(Geometry::Rectangle(-0.9, 0.1, 0.9, 1.9), true);
+    SimulationArea area(&detector);
+
+    std::vector<int> expectedIndexes = {1, 2, 3, 4, 5, 6, 7, 8};
+    std::vector<int> expectedDetectorIndexes = {6, 7, 9, 10, 11, 13, 14, 15};
+    std::vector<int> expectedElementIndexes = {0, 1, 2, 3, 4, 5, 6, 7};
+    std::vector<int> expectedRoi = {1, 2, 3, 4, 5, 6, 7, 8};
+    std::vector<int> indexes;
+    std::vector<int> elementIndexes;
+    std::vector<int> roiIndexes;
+    std::vector<int> detectorIndexes;
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        indexes.push_back(it.index());
+        elementIndexes.push_back(it.elementIndex());
+        roiIndexes.push_back(it.roiIndex());
+        detectorIndexes.push_back(it.detectorIndex());
+    }
+    EXPECT_EQ(indexes, expectedIndexes);
+    EXPECT_EQ(elementIndexes, expectedElementIndexes);
+    EXPECT_EQ(roiIndexes, expectedRoi);
+    EXPECT_EQ(detectorIndexes, expectedDetectorIndexes);
+}
+
+#endif
diff --git a/Tests/UnitTests/Core/3/SpecialFunctionsTest.h b/Tests/UnitTests/Core/3/SpecialFunctionsTest.h
new file mode 100644
index 0000000..8250f43
--- /dev/null
+++ b/Tests/UnitTests/Core/3/SpecialFunctionsTest.h
@@ -0,0 +1,97 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/UnitTests/Core/3/SpecialFunctionsTest.h
+//! @brief     Defines unit test for Form factors.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef SPECIALFUNCTIONSTEST_H
+#define SPECIALFUNCTIONSTEST_H
+
+#include "MathFunctions.h"
+#include "MathConstants.h"
+
+#define EXPECT_CNEAR(a,b,epsi) \
+  EXPECT_NEAR((a).real(),(b).real(),epsi); EXPECT_NEAR((a).imag(),(b).imag(),epsi);
+
+class SpecialFunctionsTest : public ::testing::Test
+{
+protected:
+    SpecialFunctionsTest(){}
+};
+
+// Test complex Bessel function J1
+TEST_F(SpecialFunctionsTest, BesselJ1)
+{
+    const double eps = 4.7e-16; // more than twice the machine precision
+    complex_t res;
+
+    // Test four arbitrary function values.
+    // Reference values are computed using dev-tools/math/cbesselJ01.c,
+    //   from which BesselJ1 has been derived. So this is _not_ an independent
+    //   for numeric accuracy, but only for invariance.
+    // However, the four specific results below have also been checked against the
+    //   online calculator http://keisan.casio.com/exec/system/1180573474.
+    //   Agreement is excellent, except for the dominantly imaginary argument .01+100i.
+    //   In conclusion, Bessel_J1 is clearly good enough for our purpose.
+    res = MathFunctions::Bessel_J1(complex_t(0.8,1.5));
+    EXPECT_NEAR( res.real(), 0.72837687825769404, eps*std::abs(res) ); // Keisan ..69398...
+    EXPECT_NEAR( res.imag(), 0.75030568686427268, eps*std::abs(res) ); // Keisan ..27264...
+
+    res = MathFunctions::Bessel_J1(complex_t(1e-2,1e2));
+    EXPECT_NEAR( res.real(), 1.0630504683139779e+40, eps*std::abs(res) ); // Keisan 1.063015...
+    EXPECT_NEAR( res.imag(), 1.0683164984973165e+42, eps*std::abs(res) ); // Keisan ..73162...
+
+    res = MathFunctions::Bessel_J1(complex_t(-1e2,1e-2));
+    EXPECT_NEAR( res.real(), 0.077149198549289394, eps*std::abs(res) );  // Keisan ..89252...
+    EXPECT_NEAR( res.imag(), 2.075766253119904e-4, eps*std::abs(res) ); // Keisan ..19951...
+
+    res = MathFunctions::Bessel_J1(complex_t(7,9));
+    EXPECT_NEAR( res.real(), 370.00180888861155, eps*std::abs(res) ); // Keisan ..61107...
+    EXPECT_NEAR( res.imag(), 856.00300811057934, eps*std::abs(res) ); // Keisan ..57940...
+}
+
+// Test accuracy of complex function sinc(z) near the removable singularity at z=0
+
+TEST_F(SpecialFunctionsTest, csinc)
+{
+    const double eps = 4.7e-16; // more than twice the machine precision
+
+    for( int i=0; i<24; ++i ) {
+        double ph = M_TWOPI*i/24;
+        //std::cout << "---------------------------------------------------------------------\n";
+        //std::cout << "phase = " << ph << "\n";
+        EXPECT_EQ( MathFunctions::sinc(complex_t(0,0)),       complex_t(1.,0.) );
+        complex_t z;
+        z=std::polar(1e-17,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(2e-17,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(5e-17,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(1e-16,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(2e-16,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(5e-16,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(1e-15,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(1e-13,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(1e-11,ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(1e-9, ph); EXPECT_CNEAR( MathFunctions::sinc(z), complex_t(1.,0.), eps );
+        z=std::polar(5e-8,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(2e-8,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(1e-8,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(5e-7,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(2e-7,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(1e-7,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(1e-6,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(1e-5,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6., eps );
+        z=std::polar(1e-4,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6.*(1.-z*z/20.), eps );
+        z=std::polar(1e-3,ph); EXPECT_CNEAR( MathFunctions::sinc(z), 1.-z*z/6.*(1.-z*z/20.), eps );
+    }
+}
+
+#endif // SPECIALFUNCTIONSTEST_H
diff --git a/Tests/UnitTests/Core/3/SphericalDetectorTest.h b/Tests/UnitTests/Core/3/SphericalDetectorTest.h
new file mode 100644
index 0000000..20f91e6
--- /dev/null
+++ b/Tests/UnitTests/Core/3/SphericalDetectorTest.h
@@ -0,0 +1,370 @@
+#ifndef SPHERICALDETECTORTEST_H
+#define SPHERICALDETECTORTEST_H
+
+#include "SphericalDetector.h"
+#include "Exceptions.h"
+#include "OutputData.h"
+#include "FixedBinAxis.h"
+#include "ConvolutionDetectorResolution.h"
+#include "ResolutionFunction2DGaussian.h"
+#include "Polygon.h"
+#include "BornAgainNamespace.h"
+#include "RegionOfInterest.h"
+#include "Rectangle.h"
+#include "Units.h"
+#include "Beam.h"
+#include "SimulationArea.h"
+#include <memory>
+
+class SphericalDetectorTest : public ::testing::Test
+{
+ protected:
+    SphericalDetectorTest(){}
+    virtual ~SphericalDetectorTest(){}
+};
+
+//! Default detector construction
+
+TEST_F(SphericalDetectorTest, initialState)
+{
+    SphericalDetector detector;
+
+    // checking size
+    EXPECT_EQ(0u, detector.getDimension());
+    EXPECT_EQ(IDetector2D::RADIANS, detector.getDefaultAxesUnits());
+
+    // detector units
+    std::vector<IDetector2D::EAxesUnits> validUnits =
+        {IDetector2D::NBINS, IDetector2D::RADIANS, IDetector2D::DEGREES, IDetector2D::QYQZ};
+    EXPECT_EQ(validUnits, detector.getValidAxesUnits());
+
+    // masks
+    EXPECT_FALSE(detector.hasMasks());
+    EXPECT_EQ(0u, detector.numberOfMaskedChannels());
+
+    // resolution function
+    EXPECT_EQ(nullptr, detector.getDetectorResolutionFunction());
+
+    // region of interest
+    EXPECT_EQ(nullptr, detector.regionOfInterest());
+
+    // behavior
+    ASSERT_THROW(detector.getAxis(0), Exceptions::OutOfBoundsException);
+    OutputData<double>* p_intensity_map(nullptr);
+    ASSERT_THROW(detector.applyDetectorResolution(p_intensity_map),
+                 Exceptions::NullPointerException);
+}
+
+//! Construction of the detector with axes.
+
+TEST_F(SphericalDetectorTest, constructionWithAxes)
+{
+    SphericalDetector detector;
+    FixedBinAxis axis0("axis0", 10, 0.0, 10.0);
+    FixedBinAxis axis1("axis1", 20, 0.0, 20.0);
+    detector.addAxis(axis0);
+    detector.addAxis(axis1);
+
+    // checking dimension and axes
+    EXPECT_EQ(2u, detector.getDimension());
+    EXPECT_EQ(axis0.getMin(), detector.getAxis(0).getMin() );
+    EXPECT_EQ(axis0.getMax(), detector.getAxis(0).getMax() );
+    EXPECT_EQ(axis0.getName(), detector.getAxis(0).getName() );
+    EXPECT_EQ(axis1.getName(), detector.getAxis(1).getName() );
+    EXPECT_EQ(axis1.getMin(), detector.getAxis(1).getMin() );
+    EXPECT_EQ(axis1.getMax(), detector.getAxis(1).getMax() );
+
+    // clearing detector
+    detector.clear();
+    EXPECT_EQ(0u, detector.getDimension());
+}
+
+//! Construction of the detector via classical constructor.
+
+TEST_F(SphericalDetectorTest, constructionWithParameters)
+{
+    SphericalDetector detector(10, -1.0, 1.0, 20, 0.0, 2.0);
+    EXPECT_EQ(10u, detector.getAxis(0).size() );
+    EXPECT_EQ(-1.0, detector.getAxis(0).getMin() );
+    EXPECT_EQ(1.0, detector.getAxis(0).getMax() );
+    EXPECT_EQ(BornAgain::PHI_AXIS_NAME, detector.getAxis(0).getName());
+    EXPECT_EQ(20u, detector.getAxis(1).size() );
+    EXPECT_EQ(0.0, detector.getAxis(1).getMin() );
+    EXPECT_EQ(2.0, detector.getAxis(1).getMax() );
+    EXPECT_EQ(BornAgain::ALPHA_AXIS_NAME, detector.getAxis(1).getName());
+}
+
+//! Init external data with detector axes.
+
+TEST_F(SphericalDetectorTest, initOutputData)
+{
+    SphericalDetector detector(10, -1.0, 1.0, 20, 0.0, 2.0);
+    OutputData<double> data;
+    detector.initOutputData(data);
+
+    EXPECT_EQ(data.getAllocatedSize(), 200u);
+
+    EXPECT_EQ(10u, data.getAxis(0).size() );
+    EXPECT_EQ(-1.0, data.getAxis(0).getMin() );
+    EXPECT_EQ(1.0, data.getAxis(0).getMax() );
+    EXPECT_EQ(BornAgain::PHI_AXIS_NAME, data.getAxis(0).getName());
+    EXPECT_EQ(20u, data.getAxis(1).size() );
+    EXPECT_EQ(0.0, data.getAxis(1).getMin() );
+    EXPECT_EQ(2.0, data.getAxis(1).getMax() );
+    EXPECT_EQ(BornAgain::ALPHA_AXIS_NAME, data.getAxis(1).getName());
+}
+
+//! Creation of the detector map with axes in given units
+
+TEST_F(SphericalDetectorTest, createDetectorMap)
+{
+    SphericalDetector detector(10, -1.0*Units::deg, 1.0*Units::deg,
+                               20, 0.0*Units::deg, 2.0*Units::deg);
+
+    Beam beam;
+    beam.setCentralK(1.0*Units::angstrom, 0.4*Units::deg, 0.0);
+
+    // creating map in default units, which are radians and checking axes
+    std::unique_ptr<OutputData<double>> data(
+                detector.createDetectorMap(beam, IDetector2D::DEFAULT));
+    EXPECT_EQ(data->getAxis(0).size(), 10u);
+    EXPECT_EQ(data->getAxis(0).getMin(), -1.0*Units::deg);
+    EXPECT_EQ(data->getAxis(0).getMax(), 1.0*Units::deg);
+    EXPECT_EQ(data->getAxis(1).size(), 20u);
+    EXPECT_EQ(data->getAxis(1).getMin(), 0.0*Units::deg);
+    EXPECT_EQ(data->getAxis(1).getMax(), 2.0*Units::deg);
+
+    // creating map in degrees and checking axes
+    data.reset(detector.createDetectorMap(beam, IDetector2D::DEGREES));
+    EXPECT_EQ(data->getAxis(0).size(), 10u);
+    EXPECT_FLOAT_EQ(data->getAxis(0).getMin(), -1.0);
+    EXPECT_FLOAT_EQ(data->getAxis(0).getMax(), 1.0);
+    EXPECT_EQ(data->getAxis(1).size(), 20u);
+    EXPECT_FLOAT_EQ(data->getAxis(1).getMin(), 0.0);
+    EXPECT_FLOAT_EQ(data->getAxis(1).getMax(), 2.0);
+
+    // creating map in nbins and checking axes
+    data.reset(detector.createDetectorMap(beam, IDetector2D::NBINS));
+    EXPECT_EQ(data->getAxis(0).size(), 10u);
+    EXPECT_FLOAT_EQ(data->getAxis(0).getMin(), 0.0);
+    EXPECT_FLOAT_EQ(data->getAxis(0).getMax(), 10.0);
+    EXPECT_EQ(data->getAxis(1).size(), 20u);
+    EXPECT_FLOAT_EQ(data->getAxis(1).getMin(), 0.0);
+    EXPECT_FLOAT_EQ(data->getAxis(1).getMax(), 20.0);
+}
+
+//! Testing region of interest.
+
+TEST_F(SphericalDetectorTest, regionOfInterest)
+{
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("axis0", 8, -3.0, 5.0));
+    detector.addAxis(FixedBinAxis("axis1", 4, 0.0, 4.0));
+
+    // creating region of interest
+    double xlow(-2.0), ylow(1.0), xup(4.0), yup(3.0);
+    detector.setRegionOfInterest(xlow, ylow, xup, yup);
+    EXPECT_FALSE(nullptr == detector.regionOfInterest());
+    EXPECT_EQ(detector.regionOfInterest()->getXlow(), xlow);
+    EXPECT_EQ(detector.regionOfInterest()->getYlow(), ylow);
+    EXPECT_EQ(detector.regionOfInterest()->getXup(), xup);
+    EXPECT_EQ(detector.regionOfInterest()->getYup(), yup);
+
+    // replacing region of interest with a new one
+    double xlow2(-2.1), ylow2(1.1), xup2(4.1), yup2(3.1);
+    detector.setRegionOfInterest(xlow2, ylow2, xup2, yup2);
+    EXPECT_EQ(detector.regionOfInterest()->getXlow(), xlow2);
+    EXPECT_EQ(detector.regionOfInterest()->getYlow(), ylow2);
+    EXPECT_EQ(detector.regionOfInterest()->getXup(), xup2);
+    EXPECT_EQ(detector.regionOfInterest()->getYup(), yup2);
+
+    // removing region of interest
+    detector.resetRegionOfInterest();
+    EXPECT_TRUE(nullptr == detector.regionOfInterest());
+}
+
+//! Init external data with detector axes when region of interest is present.
+
+TEST_F(SphericalDetectorTest, regionOfInterestAndData)
+{
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("axis0", 8, -3.0, 5.0));
+    detector.addAxis(FixedBinAxis("axis1", 4, 0.0, 4.0));
+
+    // creating region of interest
+    detector.setRegionOfInterest(-1.8, 0.5, 3.0, 2.5);
+
+    // initializing data via the detector and making sure that data axes are exactly as in detector
+    // (i.e. to confirm that regionOfInterest doesn't change data structure)
+    OutputData<double> data;
+    detector.initOutputData(data);
+    EXPECT_EQ(data.getAllocatedSize(), 32u);
+    EXPECT_EQ(data.getAxis(0).size(), 8u);
+    EXPECT_EQ(data.getAxis(0).getMin(), -3.0);
+    EXPECT_EQ(data.getAxis(0).getMax(), 5.0);
+    EXPECT_EQ(data.getAxis(1).size(), 4u);
+    EXPECT_EQ(data.getAxis(1).getMin(), 0.0);
+    EXPECT_EQ(data.getAxis(1).getMax(), 4.0);
+}
+
+//! Create detector map in the presence of region of interest.
+
+TEST_F(SphericalDetectorTest, regionOfInterestAndDetectorMap)
+{
+    SphericalDetector detector(6, -1.0*Units::deg, 5.0*Units::deg,
+                               4, 0.0*Units::deg, 4.0*Units::deg);
+
+    detector.setRegionOfInterest(0.1*Units::deg, 1.1*Units::deg, 3.0*Units::deg, 2.9*Units::deg);
+    Beam beam;
+    beam.setCentralK(1.0*Units::angstrom, 0.4*Units::deg, 0.0);
+
+    // Creating map in default units, which are radians and checking that axes are clipped
+    // to region of interest.
+    std::unique_ptr<OutputData<double>> data(
+                detector.createDetectorMap(beam, IDetector2D::DEFAULT));
+    EXPECT_EQ(data->getAxis(0).size(), 4u);
+    EXPECT_EQ(data->getAxis(0).getMin(), 0.0*Units::deg);
+    EXPECT_EQ(data->getAxis(0).getMax(), 4.0*Units::deg);
+    EXPECT_EQ(data->getAxis(1).size(), 2u);
+    EXPECT_EQ(data->getAxis(1).getMin(), 1.0*Units::deg);
+    EXPECT_EQ(data->getAxis(1).getMax(), 3.0*Units::deg);
+
+    // Creating map with axes in degrees, and checking that it is clipped to the region of interest
+    data.reset(detector.createDetectorMap(beam, IDetector2D::DEGREES));
+    EXPECT_EQ(data->getAxis(0).size(), 4u);
+    EXPECT_EQ(data->getAxis(0).getMin(), 0.0);
+    EXPECT_EQ(data->getAxis(0).getMax(), 4.0);
+    EXPECT_EQ(data->getAxis(1).size(), 2u);
+    EXPECT_EQ(data->getAxis(1).getMin(), 1.0);
+    EXPECT_EQ(data->getAxis(1).getMax(), 3.0);
+}
+
+//! Checking IDetector2D::getIntensityData in the presence of region of interest.
+
+TEST_F(SphericalDetectorTest, getIntensityData)
+{
+    SphericalDetector detector(6, -1.0*Units::deg, 5.0*Units::deg,
+                               4, 0.0*Units::deg, 4.0*Units::deg);
+    detector.setRegionOfInterest(0.1*Units::deg, 1.1*Units::deg, 3.0*Units::deg, 2.9*Units::deg);
+    Beam beam;
+    beam.setCentralK(1.0*Units::angstrom, 0.4*Units::deg, 0.0);
+
+    // Initializing data (no region of interest involved yet) and filling with amplitudes
+    OutputData<double> intensityData;
+    detector.initOutputData(intensityData);
+    EXPECT_EQ(intensityData.getAllocatedSize(), 24u);
+    for(size_t i=0; i<intensityData.getAllocatedSize(); ++i) {
+        intensityData[i] = static_cast<double>(i);
+    }
+    EXPECT_EQ(intensityData[intensityData.getAllocatedSize()-1], 23.0);
+
+    // Getting detectorIntensity and checking that amplitudes are correct and it is clipped to
+    // region of interest.
+
+//    std::unique_ptr<OutputData<double>> detectorIntensity(
+//                detector.getDetectorIntensity(intensityData, beam, IDetector2D::DEGREES));
+
+//    EXPECT_EQ(detectorIntensity->getAllocatedSize(), 8);
+//    EXPECT_EQ((*detectorIntensity)[0], 5.0);
+//    EXPECT_EQ((*detectorIntensity)[7], 18.0);
+//    EXPECT_EQ(detectorIntensity->getAxis(0).size(), 4);
+//    EXPECT_EQ(detectorIntensity->getAxis(0).getMin(), 0.0);
+//    EXPECT_EQ(detectorIntensity->getAxis(0).getMax(), 4.0);
+//    EXPECT_EQ(detectorIntensity->getAxis(1).size(), 2);
+//    EXPECT_EQ(detectorIntensity->getAxis(1).getMin(), 1.0);
+//    EXPECT_EQ(detectorIntensity->getAxis(1).getMax(), 3.0);
+}
+
+TEST_F(SphericalDetectorTest, MaskOfDetector)
+{
+    SphericalDetector detector;
+    detector.addAxis(FixedBinAxis("x-axis", 12, -4.0, 8.0));
+    detector.addAxis(FixedBinAxis("y-axis", 6, -2.0, 4.0));
+
+    std::vector<double> x = {4.0, -4.0, -4.0, 4.0, 4.0};
+    std::vector<double> y = {2.0, 2.0, -2.0, -2.0, 2.0};
+
+    Geometry::Polygon polygon(x, y);
+    detector.addMask(polygon, true);
+
+    const OutputData<bool> *mask = detector.getDetectorMask()->getMaskData();
+    for(size_t index=0; index<mask->getAllocatedSize(); ++index) {
+        double x = mask->getAxisValue(index, 0);
+        double y = mask->getAxisValue(index, 1);
+        if( x>= -4.0 && x <=4.0 && y>=-2.0 && y<=2.0) {
+            EXPECT_TRUE(detector.isMasked(index));
+        } else {
+            EXPECT_FALSE(detector.isMasked(index));
+        }
+    }
+
+    SphericalDetector detector2(detector);
+    mask = detector2.getDetectorMask()->getMaskData();
+    for(size_t index=0; index<mask->getAllocatedSize(); ++index) {
+        double x = mask->getAxisValue(index, 0);
+        double y = mask->getAxisValue(index, 1);
+        if( x>= -4.0 && x <=4.0 && y>=-2.0 && y<=2.0) {
+            EXPECT_TRUE(detector2.isMasked(index));
+        } else {
+            EXPECT_FALSE(detector2.isMasked(index));
+        }
+    }
+
+    mask = detector.getDetectorMask()->getMaskData();
+    for(size_t index=0; index<mask->getAllocatedSize(); ++index) {
+        double x = mask->getAxisValue(index, 0);
+        double y = mask->getAxisValue(index, 1);
+        if( x>= -4.0 && x <=4.0 && y>=-2.0 && y<=2.0) {
+            EXPECT_TRUE(detector.isMasked(index));
+        } else {
+            EXPECT_FALSE(detector.isMasked(index));
+        }
+    }
+}
+
+//! Checking clone in the presence of ROI and masks.
+
+TEST_F(SphericalDetectorTest, Clone)
+{
+    Beam beam;
+    beam.setCentralK(1.0*Units::angstrom, 0.4*Units::deg, 0.0);
+
+    SphericalDetector detector(6, -1.0*Units::deg, 5.0*Units::deg,
+                               4, 0.0*Units::deg, 4.0*Units::deg);
+    detector.setRegionOfInterest(0.1*Units::deg, 1.1*Units::deg, 3.0*Units::deg, 2.9*Units::deg);
+    detector.addMask(Geometry::Rectangle(-0.9*Units::deg, 0.1*Units::deg, 0.9*Units::deg, 1.9*Units::deg), true);
+    detector.addMask(Geometry::Rectangle(3.1*Units::deg, 2.1*Units::deg, 4.9*Units::deg, 3.9*Units::deg), true);
+    detector.setDetectorResolution(new ConvolutionDetectorResolution(
+            new ResolutionFunction2DGaussian(1,1)));
+
+    std::unique_ptr<SphericalDetector> clone(detector.clone());
+
+    std::unique_ptr<OutputData<double>> data(
+                clone->createDetectorMap(beam, IDetector2D::DEGREES));
+    EXPECT_EQ(data->getAxis(0).size(), 4u);
+    EXPECT_EQ(data->getAxis(0).getMin(), 0.0);
+    EXPECT_EQ(data->getAxis(0).getMax(), 4.0);
+    EXPECT_EQ(data->getAxis(1).size(), 2u);
+    EXPECT_EQ(data->getAxis(1).getMin(), 1.0);
+    EXPECT_EQ(data->getAxis(1).getMax(), 3.0);
+
+    EXPECT_EQ(std::string("ConvolutionDetectorResolution"),
+              clone->getDetectorResolutionFunction()->getName());
+
+    EXPECT_EQ(clone->numberOfMaskedChannels(), 8u);
+
+    // checking iteration over the map of cloned detector
+    SimulationArea area(clone.get());
+    std::vector<int> expectedDetectorIndexes = {6, 9, 10, 13, 14, 17};
+    std::vector<int> expectedElementIndexes = {0, 1, 2, 3, 4, 5};
+    std::vector<int> detectorIndexes;
+    std::vector<int> elementIndexes;
+    for(SimulationArea::iterator it = area.begin(); it!=area.end(); ++it) {
+        detectorIndexes.push_back(it.detectorIndex());
+        elementIndexes.push_back(it.elementIndex());
+    }
+    EXPECT_EQ(detectorIndexes, expectedDetectorIndexes);
+    EXPECT_EQ(elementIndexes, expectedElementIndexes);
+}
+
+#endif // SPHERICALDETECTORTEST_H
diff --git a/Tests/UnitTests/Core/3/main.cpp b/Tests/UnitTests/Core/3/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/3/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/3/testlist.h b/Tests/UnitTests/Core/3/testlist.h
new file mode 100644
index 0000000..19a7649
--- /dev/null
+++ b/Tests/UnitTests/Core/3/testlist.h
@@ -0,0 +1,10 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "DetectorMaskTest.h"
+#include "PolygonTest.h"
+#include "SpecialFunctionsTest.h"
+#include "RectangularDetectorTest.h"
+#include "PrecomputedTest.h"
+#include "SphericalDetectorTest.h"
+#include "SimulationAreaTest.h"
+#include "RegionOfInterestTest.h"
diff --git a/Tests/UnitTests/Core/4/BeamTest.h b/Tests/UnitTests/Core/4/BeamTest.h
new file mode 100644
index 0000000..dc5111c
--- /dev/null
+++ b/Tests/UnitTests/Core/4/BeamTest.h
@@ -0,0 +1,62 @@
+#ifndef BEAMTEST_H
+#define BEAMTEST_H
+
+#include "Beam.h"
+#include "BornAgainNamespace.h"
+#include "MathConstants.h"
+#include "ParameterPool.h"
+
+#include <memory>
+
+
+class BeamTest : public ::testing::Test
+{
+protected:
+    BeamTest() {}
+
+    Beam m_empty_beam;
+};
+
+TEST_F(BeamTest, BeamInitialState)
+{
+    EXPECT_DOUBLE_EQ(M_TWOPI, m_empty_beam.getCentralK()[0]);
+    EXPECT_EQ(0.0, m_empty_beam.getCentralK()[1]);
+    EXPECT_EQ(0.0, m_empty_beam.getCentralK()[2]);
+    EXPECT_EQ(0.0, m_empty_beam.getIntensity());
+    /* TEMPORARILY DISABLED getParameterPool() 
+    EXPECT_EQ(size_t(4), m_empty_beam.getParameterPool()->size());
+    EXPECT_EQ(0.0, m_empty_beam.getParameterPool()->getParameter(BornAgain::Intensity).getValue());
+    EXPECT_EQ(1.0, m_empty_beam.getParameterPool()->getParameter(BornAgain::Wavelength).getValue());
+    EXPECT_EQ(0.0, m_empty_beam.getParameterPool()->getParameter(BornAgain::Alpha).getValue());
+    EXPECT_EQ(0.0, m_empty_beam.getParameterPool()->getParameter(BornAgain::Phi).getValue());
+    EXPECT_EQ(complex_t(0.5, 0.0), m_empty_beam.getPolarization()(0, 0));
+    EXPECT_EQ(complex_t(0.5, 0.0), m_empty_beam.getPolarization()(1, 1));
+    */
+}
+
+TEST_F(BeamTest, BeamAssignment)
+{
+    kvector_t polarization(0.0, 0.0, 0.2);
+
+    std::unique_ptr<Beam> P_beam { new Beam() };
+
+    P_beam->setCentralK(1.0, 1.0, 1.0);
+    P_beam->setIntensity(2.0);
+    P_beam->setPolarization(polarization);
+
+    Beam beam_copy = *P_beam;
+    EXPECT_NEAR(1.83423, beam_copy.getCentralK()[0], 0.00001);
+    EXPECT_NEAR(-2.85664, beam_copy.getCentralK()[1], 0.00001);
+    EXPECT_NEAR(-5.28712, beam_copy.getCentralK()[2], 0.00001);
+    EXPECT_EQ(double(2.0), beam_copy.getIntensity());
+    /* TEMPORARILY DISABLED getParameterPool() 
+    EXPECT_EQ(size_t(4), beam_copy.getParameterPool()->size());
+    EXPECT_EQ(double(2.0),
+              beam_copy.getParameterPool()->getParameter(BornAgain::Intensity).getValue());
+    EXPECT_EQ(complex_t(0.6, 0.0), beam_copy.getPolarization()(0, 0));
+    EXPECT_EQ(complex_t(0.4, 0.0), beam_copy.getPolarization()(1, 1));
+    */
+}
+
+
+#endif // BEAMTEST_H
diff --git a/Tests/UnitTests/Core/4/ChiSquaredModuleTest.h b/Tests/UnitTests/Core/4/ChiSquaredModuleTest.h
new file mode 100644
index 0000000..51a5c09
--- /dev/null
+++ b/Tests/UnitTests/Core/4/ChiSquaredModuleTest.h
@@ -0,0 +1,116 @@
+#ifndef CHISQUAREDMODULETEST_H
+#define CHISQUAREDMODULETEST_H
+
+#include "ChiSquaredModule.h"
+#include "ISquaredFunction.h"
+#include "BornAgainNamespace.h"
+
+
+
+class ChiSquaredModuleTest : public ::testing::Test
+{
+ protected:
+    ChiSquaredModuleTest();
+    virtual ~ChiSquaredModuleTest();
+
+    ChiSquaredModule m_chi_empty;
+    ChiSquaredModule m_chi_default;
+    OutputData<double > m_real_data;
+    OutputData<double > m_simul_data;
+};
+
+
+ChiSquaredModuleTest::ChiSquaredModuleTest()
+{
+//    m_real_data.addAxis(BornAgain::PHI_AXIS_NAME, 10, 0.0, 10.0);
+//    m_real_data.addAxis(BornAgain::ALPHA_AXIS_NAME, 10, 0.0, 10.0);
+//    m_real_data.setAllTo(1.0);
+//    m_simul_data.copyFrom(m_real_data);
+//    m_simul_data.setAllTo(1.1);
+
+    // default module with set of real and simulated data
+//    m_chi_default.setRealAndSimulatedData(m_real_data, m_simul_data);
+
+}
+
+
+ChiSquaredModuleTest::~ChiSquaredModuleTest()
+{
+}
+
+
+TEST_F(ChiSquaredModuleTest, InitialState)
+{
+//    EXPECT_EQ( nullptr, m_chi_empty.getRealData());
+//    EXPECT_EQ( nullptr, m_chi_empty.getSimulationData());
+    EXPECT_TRUE( dynamic_cast<const SquaredFunctionDefault*>(m_chi_empty.getSquaredFunction()));
+//    EXPECT_TRUE( dynamic_cast<const DefaultAllDataSelector*>(m_chi_empty.getFittingDataSelector()));
+    EXPECT_EQ( nullptr, m_chi_empty.getIntensityNormalizer());
+    EXPECT_EQ( nullptr, m_chi_empty.getIntensityFunction());
+//    ASSERT_THROW(m_chi_empty.calculateChiSquared(), Exceptions::NullPointerException);
+//    ASSERT_THROW(m_chi_empty.createChi2DifferenceMap(), Exceptions::NullPointerException);
+}
+
+TEST_F(ChiSquaredModuleTest, CloneOfEmpty)
+{
+    ChiSquaredModule *clone_of_empty = m_chi_empty.clone();
+//    EXPECT_EQ( nullptr, clone_of_empty->getRealData());
+//    EXPECT_EQ( nullptr, clone_of_empty->getSimulationData());
+    EXPECT_TRUE( dynamic_cast<const SquaredFunctionDefault*>(clone_of_empty->getSquaredFunction()));
+//    EXPECT_TRUE( dynamic_cast<const DefaultAllDataSelector*>(clone_of_empty->getFittingDataSelector()));
+    EXPECT_EQ( nullptr, clone_of_empty->getIntensityNormalizer());
+    EXPECT_EQ( nullptr, clone_of_empty->getIntensityFunction());
+//    ASSERT_THROW(clone_of_empty->calculateChiSquared(), Exceptions::NullPointerException);
+//    ASSERT_THROW(clone_of_empty->createChi2DifferenceMap(), Exceptions::NullPointerException);
+    delete clone_of_empty;
+}
+
+//TEST_F(ChiSquaredModuleTest, DefaultModule)
+//{
+//    EXPECT_FLOAT_EQ( 0.01, (float)m_chi_default.calculateChiSquared());
+//}
+
+//TEST_F(ChiSquaredModuleTest, CloneOfDefault)
+//{
+//    ChiSquaredModule *clone_of_default = m_chi_default.clone();
+//    EXPECT_FLOAT_EQ( 0.01, (float)clone_of_default->calculateChiSquared());
+//    clone_of_default->setNdegreeOfFreedom(1);
+//    EXPECT_FLOAT_EQ( 1.0, (float)clone_of_default->calculateChiSquared());
+//    delete clone_of_default;
+//}
+
+//TEST_F(ChiSquaredModuleTest, IsGISAXSLikeModule)
+//{
+//    ChiSquaredModule chi_isgisaxs;
+//    OutputData<double> real_data;
+//    OutputData<double> simul_data;
+//    const size_t nbins(5);
+//    real_data.addAxis(BornAgain::PHI_AXIS_NAME, nbins, 0.0, 1.0);
+//    simul_data.addAxis(BornAgain::PHI_AXIS_NAME, nbins, 0.0, 1.0);
+//    const double a_real_data[nbins] = {1., 10., 100., 10., 1. };
+//    const double a_simul_data[nbins] = {10., 100., 1000., 100., 10. };
+//    OutputData<double >::iterator it_real = real_data.begin();
+//    OutputData<double >::iterator it_simul = simul_data.begin();
+//    int index(0);
+//    while(it_real != real_data.end()) {
+//        *it_real = a_real_data[index];
+//        *it_simul = a_simul_data[index];
+//        ++index; ++it_real; ++it_simul;
+//    }
+//    chi_isgisaxs.setRealAndSimulatedData(real_data, simul_data);
+//    IntensityNormalizer normalizer(100., 0.0);
+//    chi_isgisaxs.setIntensityNormalizer( normalizer );
+//    EXPECT_FLOAT_EQ( 0.0, (float)chi_isgisaxs.calculateChiSquared());
+
+////    m_chi_isgisaxs.setChiSquaredFunction( SquaredFunctionWithSystematicError(1.0) );
+////    EXPECT_FLOAT_EQ( double(0.005), m_chi_isgisaxs.calculateChiSquared());
+
+////    m_chi_isgisaxs.setOutputDataNormalizer( OutputDataNormalizerScaleAndShift() );
+////    EXPECT_FLOAT_EQ( double(0.005), m_chi_isgisaxs.calculateChiSquared());
+//}
+
+#endif // CHISQUAREDMODULETEST_H
+
+
+
+
diff --git a/Tests/UnitTests/Core/4/CumulativeValueTest.h b/Tests/UnitTests/Core/4/CumulativeValueTest.h
new file mode 100644
index 0000000..1279b85
--- /dev/null
+++ b/Tests/UnitTests/Core/4/CumulativeValueTest.h
@@ -0,0 +1,90 @@
+#ifndef CUMULATIVEVALUETEST_H
+#define CUMULATIVEVALUETEST_H
+
+#include "CumulativeValue.h"
+
+
+class CumulativeValueTest : public ::testing::Test
+{
+ protected:
+    CumulativeValueTest(){}
+    virtual ~CumulativeValueTest(){}
+};
+
+TEST_F(CumulativeValueTest, InitialState)
+{
+    CumulativeValue cv;
+    EXPECT_EQ(0, cv.getNumberOfEntries());
+    EXPECT_EQ(0.0, cv.getContent());
+    EXPECT_EQ(0.0, cv.getAverage());
+    EXPECT_EQ(0.0, cv.getRMS());
+}
+
+TEST_F(CumulativeValueTest, AddValue)
+{
+    CumulativeValue cv1;
+    cv1.add(1.0);
+    EXPECT_EQ(1, cv1.getNumberOfEntries());
+    EXPECT_EQ(1.0, cv1.getContent());
+    EXPECT_EQ(1.0, cv1.getAverage());
+    EXPECT_EQ(0.0, cv1.getRMS());
+
+    // adding value with weight, all number should stay the same
+    CumulativeValue cv2;
+    cv2.add(1.0, 10.0);
+    EXPECT_EQ(1, cv2.getNumberOfEntries());
+    EXPECT_EQ(1.0, cv2.getContent());
+    EXPECT_EQ(1.0, cv2.getAverage());
+    EXPECT_EQ(0.0, cv2.getRMS());
+
+}
+
+TEST_F(CumulativeValueTest, AddValues)
+{
+    CumulativeValue cv1;
+    cv1.add(1.0);
+    cv1.add(3.0);
+    EXPECT_EQ(2, cv1.getNumberOfEntries());
+    EXPECT_DOUBLE_EQ(4.0, cv1.getContent());
+    EXPECT_DOUBLE_EQ(2.0, cv1.getAverage());
+    EXPECT_DOUBLE_EQ(1.0, cv1.getRMS());
+
+    cv1.clear();
+    EXPECT_EQ(0, cv1.getNumberOfEntries());
+    EXPECT_EQ(0.0, cv1.getContent());
+    EXPECT_EQ(0.0, cv1.getAverage());
+    EXPECT_EQ(0.0, cv1.getRMS());
+}
+
+TEST_F(CumulativeValueTest, AddValuesWithWeights)
+{
+    CumulativeValue cv1;
+    cv1.add(1.0, 3.0);
+    cv1.add(3.0);
+    EXPECT_EQ(2, cv1.getNumberOfEntries());
+    EXPECT_DOUBLE_EQ(4.0, cv1.getContent());
+    EXPECT_DOUBLE_EQ(1.5, cv1.getAverage());
+    EXPECT_DOUBLE_EQ(0.75, cv1.getRMS()*cv1.getRMS());
+
+    cv1.add(3.0);
+    cv1.add(3.0);
+    EXPECT_EQ(4, cv1.getNumberOfEntries());
+    EXPECT_DOUBLE_EQ(10.0, cv1.getContent());
+    EXPECT_DOUBLE_EQ(2.0, cv1.getAverage());
+	EXPECT_DOUBLE_EQ(1.0, cv1.getRMS());
+}
+
+TEST_F(CumulativeValueTest, Comparison)
+{
+    CumulativeValue cv1, cv2;
+    cv1.add(1.0);
+    cv2.add(2.0);
+
+    EXPECT_TRUE(cv2 > cv1);
+    EXPECT_TRUE(cv1 < cv2);
+
+}
+
+
+
+#endif // CUMULATIVEVALUETEST_H
diff --git a/Tests/UnitTests/Core/4/GISASSimulationTest.h b/Tests/UnitTests/Core/4/GISASSimulationTest.h
new file mode 100644
index 0000000..a0c2e48
--- /dev/null
+++ b/Tests/UnitTests/Core/4/GISASSimulationTest.h
@@ -0,0 +1,91 @@
+#ifndef GISASSIMULATIONTEST_H
+#define GISASSIMULATIONTEST_H
+
+#include "Beam.h"
+#include "BornAgainNamespace.h"
+#include "GISASSimulation.h"
+#include "IMultiLayerBuilder.h"
+#include "Layer.h"
+#include "MultiLayer.h"
+#include "OutputData.h"
+#include <memory>
+#include <cmath>
+
+class GISASSimulationTest : public ::testing::Test
+{
+ protected:
+    GISASSimulationTest();
+    virtual ~GISASSimulationTest();
+    GISASSimulation emptySimulation;
+    GISASSimulation constructedSimulation;
+    OutputData<double> test_data;
+};
+
+
+GISASSimulationTest::GISASSimulationTest()
+{
+    test_data.addAxis(BornAgain::PHI_AXIS_NAME, 10, 0., 10.);
+    test_data.addAxis("theta_f", 20, 0., 20.);
+    test_data.setAllTo(2.0);
+}
+
+GISASSimulationTest::~GISASSimulationTest()
+{
+}
+
+
+TEST_F(GISASSimulationTest, SimulationInitialState)
+{
+    // TODO FIXME revise
+//    EXPECT_EQ( nullptr, emptySimulation.getSample());
+//    EXPECT_EQ( size_t(1), emptySimulation.getOutputData()->getAllocatedSize());
+//    EXPECT_EQ( size_t(0), emptySimulation.getOutputData()->getRank());
+//    EXPECT_TRUE(emptySimulation.getOutputData()->getRank() == emptySimulation.getInstrument().getDetectorDimension() );
+}
+
+TEST_F(GISASSimulationTest, SimulationConstruction)
+{
+    // TODO FIXME revise
+//    EXPECT_FALSE( constructedSimulation.getOutputData()->hasSameShape(test_data));
+//    constructedSimulation.setDetectorParameters(test_data);
+//    EXPECT_TRUE( constructedSimulation.getOutputData()->hasSameShape(test_data));
+//    EXPECT_EQ( constructedSimulation.getOutputData()->totalSum(), 0.);
+//    MultiLayer ml;
+//    Layer layer;
+//    ml.addLayer(layer);
+//    constructedSimulation.setSample(ml);
+//    EXPECT_EQ( size_t(1), dynamic_cast<MultiLayer*>(constructedSimulation.getSample())->getNumberOfLayers());
+}
+
+TEST_F(GISASSimulationTest, SimulationInitialStateOfClone)
+{
+    // TODO FIXME revise
+//    GISASSimulation *emptyClonedSimulation = emptySimulation.clone();
+//    EXPECT_EQ( nullptr, emptyClonedSimulation->getSample());
+//    EXPECT_EQ( size_t(1), emptyClonedSimulation->getOutputData()->getAllocatedSize());
+//    EXPECT_EQ( size_t(0), emptyClonedSimulation->getOutputData()->getRank());
+//    EXPECT_TRUE(emptyClonedSimulation->getOutputData()->getRank() == emptyClonedSimulation->getInstrument().getDetector()->getDimension() );
+//    EXPECT_EQ( emptyClonedSimulation->getInstrument().getBeamIntensity(), 0.);
+//    delete emptyClonedSimulation;
+}
+
+TEST_F(GISASSimulationTest, SimulationClone)
+{
+    // TODO FIXME revise
+//    EXPECT_EQ(1,1);
+//    GISASSimulation *originalSimulation = new GISASSimulation();
+//    originalSimulation->setBeamIntensity(10);
+//    originalSimulation->setDetectorParameters(test_data);
+//    GISASSimulation *clonedSimulation = originalSimulation->clone();
+//    delete originalSimulation;
+
+//    EXPECT_TRUE( clonedSimulation->getOutputData()->hasSameShape(test_data));
+//    EXPECT_EQ( clonedSimulation->getInstrument().getBeamIntensity(), 10.);
+//    EXPECT_TRUE( nullptr == clonedSimulation->getSample());
+//    clonedSimulation->prepareSimulation();
+//    EXPECT_TRUE( nullptr == clonedSimulation->getSample());
+
+//    delete clonedSimulation;
+}
+
+#endif // GISASSIMULATIONTEST_H
diff --git a/Tests/UnitTests/Core/4/HomogeneousMagneticMaterialTest.h b/Tests/UnitTests/Core/4/HomogeneousMagneticMaterialTest.h
new file mode 100644
index 0000000..d6a95fb
--- /dev/null
+++ b/Tests/UnitTests/Core/4/HomogeneousMagneticMaterialTest.h
@@ -0,0 +1,125 @@
+#ifndef HOMOGENEOUSMAGNETICMATERIALTEST_H
+#define HOMOGENEOUSMAGNETICMATERIALTEST_H
+
+#include "HomogeneousMagneticMaterial.h"
+#include "Rotations.h"
+#include "Units.h"
+
+class HomogeneousMagneticMaterialTest : public ::testing::Test
+{
+public:
+    HomogeneousMagneticMaterialTest() {}
+    virtual ~HomogeneousMagneticMaterialTest() {}
+};
+
+TEST_F(HomogeneousMagneticMaterialTest, HomogeneousMagneticMaterialWithRefIndex)
+{
+    complex_t refIndex = complex_t(1.0, 2.0);
+    kvector_t magnetism = kvector_t(3.0, 4.0, 5.0);
+    HomogeneousMagneticMaterial material("MagMaterial", refIndex, magnetism);
+    EXPECT_EQ("MagMaterial", material.getName());
+    EXPECT_EQ(refIndex, material.getRefractiveIndex());
+    EXPECT_EQ(magnetism, material.getMagneticField());
+
+    Eigen::Matrix2cd matrix = material.getScatteringMatrix(-2.91042993836710484e-3);
+    EXPECT_EQ(complex_t(2,4.0), matrix(0,0));
+    EXPECT_EQ(complex_t(3.0,-4.0), matrix(0,1));
+    EXPECT_EQ(complex_t(3.0, 4.0), matrix(1,0));
+    EXPECT_EQ(complex_t(-8,4.0), matrix(1,1));
+
+    complex_t refIndex2 = complex_t(2.0, 3.0);
+    material.setRefractiveIndex(refIndex2);
+    EXPECT_EQ(refIndex2, material.getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix2 = material.getScatteringMatrix(-2.91042993836710484e-3);
+    EXPECT_EQ(complex_t(0.0,12.0), matrix2(0,0));
+    EXPECT_EQ(complex_t(3.0, -4.0), matrix2(0,1));
+    EXPECT_EQ(complex_t(3.0,4.0), matrix2(1,0));
+    EXPECT_EQ(complex_t(-10.0,12.0), matrix2(1,1));
+
+    kvector_t magnetism2 = kvector_t(5.0, 6.0, 7.0);
+    material.setMagneticField(magnetism2);
+    EXPECT_EQ(magnetism2, material.getMagneticField());
+}
+
+TEST_F(HomogeneousMagneticMaterialTest, HomogeneousMagneticMaterialWithRefIndexAndMagField)
+{
+    kvector_t magnetism = kvector_t(3.0, 4.0, 5.0);
+    HomogeneousMagneticMaterial material("MagMaterial", 2.0, 2.0, magnetism);
+    EXPECT_EQ("MagMaterial", material.getName());
+    EXPECT_EQ(complex_t(-1.0, 2.0), material.getRefractiveIndex());
+    EXPECT_EQ(magnetism, material.getMagneticField());
+
+    Eigen::Matrix2cd matrix = material.getScatteringMatrix(-2.91042993836710484e-3);
+    EXPECT_EQ(complex_t(2,-4.0), matrix(0,0));
+    EXPECT_EQ(complex_t(3.0,-4.0), matrix(0,1));
+    EXPECT_EQ(complex_t(3.0, 4.0), matrix(1,0));
+    EXPECT_EQ(complex_t(-8,-4.0), matrix(1,1));
+
+    complex_t refIndex2 = complex_t(2.0, 3.0);
+    material.setRefractiveIndex(refIndex2);
+    EXPECT_EQ(refIndex2, material.getRefractiveIndex());
+
+    kvector_t magnetism2 = kvector_t(5.0, 6.0, 7.0);
+    material.setMagneticField(magnetism2);
+    EXPECT_EQ(magnetism2, material.getMagneticField());
+}
+
+TEST_F(HomogeneousMagneticMaterialTest, HomogeneousMagneticMaterialTransform)
+{
+    complex_t refIndex = complex_t(0.0, 0.0);
+    kvector_t magnetism = kvector_t(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial material("MagMaterial", refIndex, magnetism);
+
+    RotationZ transform(45.*Units::degree);
+    const IMaterial * tMaterial = material.createTransformedMaterial(transform.getTransform3D());
+
+    EXPECT_EQ("MagMaterial", tMaterial->getName());
+    EXPECT_EQ(refIndex, tMaterial->getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix = tMaterial->getScatteringMatrix(-2.91042993836710484e-3);
+    EXPECT_EQ(complex_t(0.0, 0.0), matrix(0,0));
+    EXPECT_EQ(complex_t(0.0, 0.0), matrix(0,1));
+    EXPECT_EQ(complex_t(0.0, 0.0), matrix(1,0));
+    EXPECT_EQ(complex_t(0.0, 0.0), matrix(1,1));
+
+    delete tMaterial;
+}
+
+TEST_F(HomogeneousMagneticMaterialTest, HomogeneousMagneticMaterialClone)
+{
+    complex_t refIndex = complex_t(1.0, 2.0);
+    kvector_t magnetism = kvector_t(3.0, 4.0, 5.0);
+    HomogeneousMagneticMaterial material("MagMaterial", refIndex, magnetism);
+
+    HomogeneousMagneticMaterial * clone = material.clone();
+
+    EXPECT_EQ("MagMaterial", clone->getName());
+    EXPECT_EQ(refIndex, clone->getRefractiveIndex());
+    EXPECT_EQ(magnetism, clone->getMagneticField());
+
+    Eigen::Matrix2cd matrix = clone->getScatteringMatrix(-2.91042993836710484e-3);
+    EXPECT_EQ(complex_t(2,4.0), matrix(0,0));
+    EXPECT_EQ(complex_t(3.0,-4.0), matrix(0,1));
+    EXPECT_EQ(complex_t(3.0, 4.0), matrix(1,0));
+    EXPECT_EQ(complex_t(-8,4.0), matrix(1,1));
+
+    complex_t refIndex2 = complex_t(2.0, 3.0);
+    clone->setRefractiveIndex(refIndex2);
+    EXPECT_EQ(refIndex2, clone->getRefractiveIndex());
+
+    kvector_t magnetism2 = kvector_t(5.0, 6.0, 7.0);
+    clone->setMagneticField(magnetism2);
+    EXPECT_EQ(magnetism2, clone->getMagneticField());
+
+    RotationZ transform(45.*Units::degree);
+    const IMaterial * tMaterial = clone->createTransformedMaterial(transform.getTransform3D());
+
+    EXPECT_EQ("MagMaterial", tMaterial->getName());
+    EXPECT_EQ(refIndex2, tMaterial->getRefractiveIndex());
+
+    delete tMaterial;
+    delete clone;
+}
+
+#endif // HOMOGENEOUSMAGNETICMATERIALTEST_H
diff --git a/Tests/UnitTests/Core/4/HomogeneousMaterialTest.h b/Tests/UnitTests/Core/4/HomogeneousMaterialTest.h
new file mode 100644
index 0000000..6137d43
--- /dev/null
+++ b/Tests/UnitTests/Core/4/HomogeneousMaterialTest.h
@@ -0,0 +1,108 @@
+#ifndef HOMOGENEOUSMATERIALTEST_H
+#define HOMOGENEOUSMATERIALTEST_H
+
+#include "HomogeneousMaterial.h"
+#include "Rotations.h"
+#include "Units.h"
+
+class HomogeneousMaterialTest : public ::testing :: Test
+{
+public:
+    HomogeneousMaterialTest() {}
+    virtual ~HomogeneousMaterialTest(){}
+};
+
+TEST_F(HomogeneousMaterialTest, HomogeneousMaterialWithRefIndex)
+{
+    complex_t refIndex = complex_t(1.0, 2.0);
+    HomogeneousMaterial material("Material1", refIndex);
+    EXPECT_EQ("Material1", material.getName());
+    EXPECT_EQ(refIndex, material.getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix = material.getScatteringMatrix(3.0);
+    EXPECT_EQ(complex_t(-3.0,4.0), matrix(0,0));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(0,1));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(1,0));
+    EXPECT_EQ(complex_t(-3.0,4.0), matrix(1,1));
+
+    complex_t refIndex2 = complex_t(2.0, 3.0);
+    material.setRefractiveIndex(refIndex2);
+    EXPECT_EQ(refIndex2, material.getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix2 = material.getScatteringMatrix(4.0);
+    EXPECT_EQ(complex_t(-5.0,12.0), matrix2(0,0));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix2(0,1));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix2(1,0));
+    EXPECT_EQ(complex_t(-5.0,12.0), matrix2(1,1));
+}
+
+TEST_F(HomogeneousMaterialTest, HomogeneousMaterialWithRefIndexParam)
+{
+    HomogeneousMaterial material("Material1", 2.0, 2.0);
+    EXPECT_EQ("Material1", material.getName());
+    EXPECT_EQ(complex_t(-1.0,2.0), material.getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix = material.getScatteringMatrix(3.0);
+    EXPECT_EQ(complex_t(-3.0,-4.0), matrix(0,0));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(0,1));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(1,0));
+    EXPECT_EQ(complex_t(-3.0,-4.0), matrix(1,1));
+}
+
+TEST_F(HomogeneousMaterialTest, HomogeneousMaterialTransform)
+{
+    complex_t refIndex = complex_t(1.0, 2.0);
+    HomogeneousMaterial material("Material1", refIndex);
+
+    RotationZ transform(45.*Units::degree);
+    const IMaterial * tMaterial = material.createTransformedMaterial(transform.getTransform3D());
+
+    EXPECT_EQ("Material1", tMaterial->getName());
+    EXPECT_EQ(refIndex, tMaterial->getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix = tMaterial->getScatteringMatrix(3.0);
+    EXPECT_EQ(complex_t(-3.0,4.0), matrix(0,0));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(0,1));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(1,0));
+    EXPECT_EQ(complex_t(-3.0,4.0), matrix(1,1));
+
+    delete tMaterial;
+}
+
+TEST_F(HomogeneousMaterialTest, HomogeneousMaterialClone)
+{
+    complex_t refIndex = complex_t(1.0, 2.0);
+    HomogeneousMaterial material("Material1", refIndex);
+
+    HomogeneousMaterial * clone = material.clone();
+
+    EXPECT_EQ("Material1", clone->getName());
+    EXPECT_EQ(refIndex, clone->getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix = clone->getScatteringMatrix(3.0);
+    EXPECT_EQ(complex_t(-3.0,4.0), matrix(0,0));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(0,1));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix(1,0));
+    EXPECT_EQ(complex_t(-3.0,4.0), matrix(1,1));
+
+    complex_t refIndex2 = complex_t(2.0, 3.0);
+    clone->setRefractiveIndex(refIndex2);
+    EXPECT_EQ(refIndex2, clone->getRefractiveIndex());
+
+    Eigen::Matrix2cd matrix2 = clone->getScatteringMatrix(4.0);
+    EXPECT_EQ(complex_t(-5.0,12.0), matrix2(0,0));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix2(0,1));
+    EXPECT_EQ(complex_t(0.0,0.0), matrix2(1,0));
+    EXPECT_EQ(complex_t(-5.0,12.0), matrix2(1,1));
+
+    RotationZ transform(45.*Units::degree);
+    const IMaterial * tMaterial = clone->createTransformedMaterial(transform.getTransform3D());
+
+    EXPECT_EQ("Material1", tMaterial->getName());
+    EXPECT_EQ(refIndex2, tMaterial->getRefractiveIndex());
+
+    delete tMaterial;
+    delete clone;
+}
+
+#endif // HOMOGENEOUSMATERIALTEST_H
diff --git a/Tests/UnitTests/Core/4/InstrumentTest.h b/Tests/UnitTests/Core/4/InstrumentTest.h
new file mode 100644
index 0000000..7aab18b
--- /dev/null
+++ b/Tests/UnitTests/Core/4/InstrumentTest.h
@@ -0,0 +1,58 @@
+#ifndef INSTRUMENTTEST_H
+#define INSTRUMENTTEST_H
+
+#include "MathConstants.h"
+#include "Instrument.h"
+#include "BornAgainNamespace.h"
+
+class InstrumentTest : public ::testing::Test
+{
+ protected:
+    InstrumentTest();
+    virtual ~InstrumentTest();
+
+    Instrument m_instrument;
+    OutputData<double> m_data;
+};
+
+
+InstrumentTest::InstrumentTest()
+{
+    m_data.addAxis(BornAgain::PHI_AXIS_NAME, 10, 0., 10.);
+    m_data.addAxis("theta_f", 20, 0., 20.);
+}
+
+InstrumentTest::~InstrumentTest()
+{
+}
+
+TEST_F(InstrumentTest, InstrumentInitialState)
+{
+    EXPECT_EQ( 0.0, m_instrument.getBeam().getIntensity());
+}
+
+
+TEST_F(InstrumentTest, BeamManipulation)
+{
+    double lambda(1), alpha(-1), phi(1);
+    double k = M_TWOPI/lambda;
+    double x = k*std::cos(alpha) * std::cos(phi);
+    double y = -k*std::cos(alpha) * std::sin(phi);
+    double z = k*std::sin(alpha);
+    m_instrument.setBeamParameters(lambda, -1.0*alpha, phi);
+    EXPECT_DOUBLE_EQ(x, m_instrument.getBeam().getCentralK().x() );
+    EXPECT_DOUBLE_EQ(y, m_instrument.getBeam().getCentralK().y() );
+    EXPECT_DOUBLE_EQ(z, m_instrument.getBeam().getCentralK().z() );
+
+    m_instrument.setBeamIntensity(10);
+    EXPECT_EQ( double(10), m_instrument.getBeamIntensity());
+}
+
+TEST_F(InstrumentTest, InstrumentClone)
+{
+    Instrument clone(m_instrument);
+    EXPECT_EQ( size_t(0), clone.getDetectorDimension() );
+    EXPECT_EQ( 0.0, clone.getBeamIntensity() );
+}
+
+#endif // INSTRUMENTTEST_H
diff --git a/Tests/UnitTests/Core/4/RelDiffTest.h b/Tests/UnitTests/Core/4/RelDiffTest.h
new file mode 100644
index 0000000..8f07cf8
--- /dev/null
+++ b/Tests/UnitTests/Core/4/RelDiffTest.h
@@ -0,0 +1,29 @@
+#ifndef RELDIFFTEST_H
+#define RELDIFFTEST_H
+
+#include "Numeric.h"
+#include <algorithm>
+
+class RelDiffTest : public ::testing::Test
+{
+ protected:
+    RelDiffTest() {}
+    virtual ~RelDiffTest() {}
+};
+
+
+TEST_F(RelDiffTest, RelDiffAlmostEq)
+{
+    EXPECT_TRUE( Numeric::areAlmostEqual(+1e+120, +1e+120, 1.) );
+    EXPECT_TRUE( Numeric::areAlmostEqual(+1e-120, +1e-120, 1.) );
+    EXPECT_TRUE( Numeric::areAlmostEqual(0, 0, 1.) );
+    EXPECT_TRUE( Numeric::areAlmostEqual(-1e-120, -1e-120, 1.) );
+    EXPECT_TRUE( Numeric::areAlmostEqual(-1e+120, -1e+120, 1.) );
+
+    EXPECT_FALSE( Numeric::areAlmostEqual(+1e+120, 0, 1.) );
+//    EXPECT_FALSE( Numeric::areAlmostEqual(+1e-120, 0, 1.) );
+//    EXPECT_FALSE( Numeric::areAlmostEqual(-1e-120, 0, 1.) );
+    EXPECT_FALSE( Numeric::areAlmostEqual(-1e+120, 0, 1.) );
+}
+
+#endif // RELDIFFTEST_H
diff --git a/Tests/UnitTests/Core/4/Shape2DTest.h b/Tests/UnitTests/Core/4/Shape2DTest.h
new file mode 100644
index 0000000..7e0b2ce
--- /dev/null
+++ b/Tests/UnitTests/Core/4/Shape2DTest.h
@@ -0,0 +1,108 @@
+#ifndef SHAPE2DTEST_H
+#define SHAPE2DTEST_H
+
+#include "Rectangle.h"
+#include "Ellipse.h"
+#include "Line.h"
+#include "MathConstants.h"
+#include <memory>
+
+class Shape2DTest : public ::testing::Test
+{
+public:
+};
+
+
+TEST_F(Shape2DTest, Rectangle)
+{
+    Geometry::Rectangle rect(-4.0, -2.0, 4.0, 2.0);
+    EXPECT_DOUBLE_EQ(32.0, rect.getArea());
+    EXPECT_TRUE(rect.contains(0.0, 0.0));
+    EXPECT_TRUE(rect.contains(4.0, 2.0));
+    EXPECT_TRUE(rect.contains(-4.0, -2.0));
+    EXPECT_TRUE(rect.contains(-4.0, -2.0));
+    EXPECT_FALSE(rect.contains(0.0, 2.01));
+    EXPECT_FALSE(rect.contains(4.0, -2.01));
+
+    Bin1D binx1(3.5, 4.5);
+    Bin1D biny1(1.5, 2.5);
+    EXPECT_TRUE(rect.contains(binx1, biny1));
+
+    Bin1D binx2(3.5, 4.6);
+    Bin1D biny2(1.5, 2.6);
+    EXPECT_FALSE(rect.contains(binx2, biny2));
+
+    std::unique_ptr<Geometry::Rectangle> clone(rect.clone());
+    EXPECT_DOUBLE_EQ(32.0, clone->getArea());
+    EXPECT_TRUE(clone->contains(0.0, 0.0));
+    EXPECT_TRUE(clone->contains(4.0, 2.0));
+    EXPECT_TRUE(clone->contains(-4.0, -2.0));
+    EXPECT_TRUE(clone->contains(-4.0, -2.0));
+    EXPECT_FALSE(clone->contains(0.0, 2.01));
+    EXPECT_FALSE(clone->contains(4.0, -2.01));
+    EXPECT_TRUE(clone->contains(binx1, biny1));
+    EXPECT_FALSE(clone->contains(binx2, biny2));
+}
+
+TEST_F(Shape2DTest, Ellipse)
+{
+    Geometry::Ellipse ellipse(10.0, 1.0, 8.0, 4.0);
+    EXPECT_TRUE(ellipse.contains(10.0, 1.0));
+    EXPECT_TRUE(ellipse.contains(18.0, 1.0));
+    EXPECT_FALSE(ellipse.contains(18.01, 1.0));
+
+    EXPECT_TRUE(ellipse.contains(10.0, -3.0));
+    EXPECT_FALSE(ellipse.contains(10.0, -3.01));
+
+    EXPECT_FALSE(ellipse.contains(4.0, -2.0));
+    EXPECT_TRUE(ellipse.contains(6.0, -2.0));
+
+    Geometry::Ellipse ellipse2(10.0, 1.0, 8.0, 4.0, 45.0*Units::degree);
+    EXPECT_TRUE(ellipse2.contains(10.0, 1.0));
+    EXPECT_FALSE(ellipse2.contains(15.0, 0.0));
+    EXPECT_TRUE(ellipse2.contains(7.0, 3.0));
+
+    std::unique_ptr<Geometry::Ellipse> clone(ellipse2.clone());
+    EXPECT_TRUE(clone->contains(10.0, 1.0));
+    EXPECT_FALSE(clone->contains(15.0, 0.0));
+    EXPECT_TRUE(clone->contains(7.0, 3.0));
+}
+
+TEST_F(Shape2DTest, Line)
+{
+    Geometry::Line line(0.0, 0.0, 1.0, 0.0);
+    EXPECT_TRUE(line.contains(0.0, 0.0));
+    EXPECT_TRUE(line.contains(0.5, 0.0));
+    EXPECT_TRUE(line.contains(1.0, 0.0));
+    EXPECT_FALSE(line.contains(1.01, 0.0));
+
+    Geometry::Line line2(0.0, 0.0, 1.0, 1.0);
+    EXPECT_TRUE(line2.contains(Bin1D(0.5, 1.0),Bin1D(0.0, 0.5)));
+    EXPECT_FALSE(line2.contains(Bin1D(0.51, 1.0),Bin1D(0.0, 0.49)));
+
+    std::unique_ptr<Geometry::Line> clone(line2.clone());
+    EXPECT_TRUE(clone->contains(Bin1D(0.5, 1.0),Bin1D(0.0, 0.5)));
+    EXPECT_FALSE(clone->contains(Bin1D(0.51, 1.0),Bin1D(0.0, 0.49)));
+}
+
+TEST_F(Shape2DTest, VerticalLine)
+{
+    Geometry::VerticalLine line(1.0);
+    EXPECT_TRUE(line.contains(1.0, 0.0));
+    EXPECT_FALSE(line.contains(1.01, 0.0));
+
+    EXPECT_TRUE(line.contains(Bin1D(0.5, 1.5), Bin1D(0.0, 1.0)));
+    EXPECT_FALSE(line.contains(Bin1D(1.01, 2.0), Bin1D(0.0, 1.0)));
+}
+
+TEST_F(Shape2DTest, HorizontalLine)
+{
+    Geometry::HorizontalLine line(1.0);
+    EXPECT_TRUE(line.contains(0.0, 1.0));
+    EXPECT_FALSE(line.contains(0.0, 1.01));
+
+    EXPECT_TRUE(line.contains(Bin1D(0.0, 1.0), Bin1D(0.5, 1.5)));
+    EXPECT_FALSE(line.contains(Bin1D(0.0, 1.0), Bin1D(1.01, 2.0)));
+}
+
+#endif // SHAPE2DTEST_H
diff --git a/Tests/UnitTests/Core/4/TRangeTest.h b/Tests/UnitTests/Core/4/TRangeTest.h
new file mode 100644
index 0000000..16e2331
--- /dev/null
+++ b/Tests/UnitTests/Core/4/TRangeTest.h
@@ -0,0 +1,95 @@
+#ifndef TRANGETEST_H
+#define TRANGETEST_H
+
+#include "TRange.h"
+#include <algorithm>
+
+class TRangeTest : public ::testing::Test
+{
+ protected:
+    TRangeTest();
+    virtual ~TRangeTest();
+
+    const TRange<int> *intRange;
+    const TRange<float> *floatRange;
+    const TRange<double> *doubleRange;
+    const TSampledRange<int> *intSampledRange;
+    const TSampledRange<float> *floatSampledRange;
+    const TSampledRange<double> *doubleSampledRange;
+};
+
+TRangeTest::TRangeTest()
+{
+    intRange = new TRange<int>(1,100);
+    floatRange = new TRange<float>(101.0f, 200.0f);
+    doubleRange = new TRange<double>(201.0,300.0);
+
+    intSampledRange = new TSampledRange<int>(4000u, 1, 100);
+    floatSampledRange = new TSampledRange<float>(5000u, 101.0f, 200.0f);
+    doubleSampledRange = new TSampledRange<double>(6000u, 201.0,300.0);
+}
+
+TRangeTest::~TRangeTest()
+{
+    delete intRange;
+    delete floatRange;
+    delete doubleRange;
+    delete intSampledRange;
+    delete floatSampledRange;
+    delete doubleSampledRange;
+}
+
+TEST_F(TRangeTest, TRangeTestLowerBound)
+{
+    EXPECT_EQ(1, intRange->getLowerBound());
+    EXPECT_EQ(101.0f, floatRange->getLowerBound());
+    EXPECT_EQ(201.0, doubleRange->getLowerBound());
+}
+
+TEST_F(TRangeTest, TRangeTestUpperBound)
+{
+    EXPECT_EQ(100, intRange->getUpperBound());
+    EXPECT_EQ(200.0f, floatRange->getUpperBound());
+    EXPECT_EQ(300.0, doubleRange->getUpperBound());
+
+}
+
+TEST_F(TRangeTest, TRangeTestDifference)
+{
+    EXPECT_EQ(99, intRange->getDifference());
+    EXPECT_EQ(99.0f, floatRange->getDifference());
+    EXPECT_EQ(99.0, doubleRange->getDifference());
+}
+
+TEST_F(TRangeTest, TRangeTestInRange)
+{
+    EXPECT_TRUE(intRange->inRange(1));
+    EXPECT_TRUE(floatRange->inRange(101.0f));
+    EXPECT_TRUE(doubleRange->inRange(201.0));
+
+    EXPECT_TRUE(intRange->inRange(50));
+    EXPECT_TRUE(floatRange->inRange(150.0f));
+    EXPECT_TRUE(doubleRange->inRange(250.0));
+
+    EXPECT_FALSE(intRange->inRange(100));
+    EXPECT_FALSE(floatRange->inRange(200.0f));
+    EXPECT_FALSE(doubleRange->inRange(300.0));
+
+    EXPECT_FALSE(intRange->inRange(0));
+    EXPECT_FALSE(floatRange->inRange(100.0f));
+    EXPECT_FALSE(doubleRange->inRange(200.0));
+
+    EXPECT_FALSE(intRange->inRange(101));
+    EXPECT_FALSE(floatRange->inRange(201.0f));
+    EXPECT_FALSE(doubleRange->inRange(301.0));
+
+}
+
+TEST_F(TRangeTest, TSampledRangeNSamples)
+{
+    EXPECT_EQ(4000u, intSampledRange->getNSamples());
+    EXPECT_EQ(5000u, floatSampledRange->getNSamples());
+    EXPECT_EQ(6000u, doubleSampledRange->getNSamples());
+}
+
+#endif // TRANGETEST_H
diff --git a/Tests/UnitTests/Core/4/ThreadInfoTest.h b/Tests/UnitTests/Core/4/ThreadInfoTest.h
new file mode 100644
index 0000000..f1021ea
--- /dev/null
+++ b/Tests/UnitTests/Core/4/ThreadInfoTest.h
@@ -0,0 +1,39 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/UnitTests/Core/4/ThreadInfoTest.h
+//! @brief     Defines unit test for ThreadInfo class.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef THREADINFOTEST_H
+#define THREADINFOTEST_H
+
+#include "ThreadInfo.h"
+
+
+class ThreadInfoTest : public ::testing::Test
+{
+ protected:
+    ThreadInfoTest()
+        : thread_info() {}
+
+    ThreadInfo thread_info;
+};
+
+TEST_F(ThreadInfoTest, DefaultValues)
+{
+    EXPECT_EQ(1, thread_info.n_batches);
+    EXPECT_EQ(0, thread_info.current_batch);
+    EXPECT_EQ(0, thread_info.n_threads);
+    EXPECT_EQ(0, thread_info.current_thread);
+}
+
+#endif // THREADINFOTEST_H
diff --git a/Tests/UnitTests/Core/4/main.cpp b/Tests/UnitTests/Core/4/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/4/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/4/testlist.h b/Tests/UnitTests/Core/4/testlist.h
new file mode 100644
index 0000000..0e14a4f
--- /dev/null
+++ b/Tests/UnitTests/Core/4/testlist.h
@@ -0,0 +1,13 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "RelDiffTest.h"
+#include "HomogeneousMaterialTest.h"
+#include "ThreadInfoTest.h"
+#include "InstrumentTest.h"
+#include "TRangeTest.h"
+#include "ChiSquaredModuleTest.h"
+#include "CumulativeValueTest.h"
+#include "BeamTest.h"
+#include "HomogeneousMagneticMaterialTest.h"
+#include "Shape2DTest.h"
+#include "GISASSimulationTest.h"
diff --git a/Tests/UnitTests/Core/5/DistributionHandlerTest.h b/Tests/UnitTests/Core/5/DistributionHandlerTest.h
new file mode 100644
index 0000000..a098c58
--- /dev/null
+++ b/Tests/UnitTests/Core/5/DistributionHandlerTest.h
@@ -0,0 +1,47 @@
+#ifndef DISTRIBUTIONHANDLERTEST_H
+#define DISTRIBUTIONHANDLERTEST_H
+
+#include "IParameterized.h"
+#include "DistributionHandler.h"
+#include "Distributions.h"
+#include "ParameterPool.h"
+#include <cmath>
+
+class DistributionHandlerTest : public ::testing::Test
+{
+protected:
+    DistributionHandlerTest() : m_value(99.0) {}
+    virtual ~DistributionHandlerTest(){}
+    double m_value;
+};
+
+TEST_F(DistributionHandlerTest, DistributionHandlerConstructor)
+{
+    DistributionHandler handler;
+    DistributionGate distribution(1.0, 2.0);
+    std::string paraName = "value";
+    EXPECT_EQ(size_t(1), handler.getTotalNumberOfSamples());
+    handler.addParameterDistribution(paraName, distribution, 2, 1.0);
+    EXPECT_EQ(size_t(2), handler.getTotalNumberOfSamples());
+    EXPECT_EQ("DistributionHandler",handler.getName());
+
+    const DistributionHandler::Distributions_t &distr = handler.getDistributions();
+    ParameterDistribution distribution1 = distr[0];
+    EXPECT_EQ(distribution1.getName(), "ParameterDistribution");
+    EXPECT_EQ(distribution1.getNbrSamples(), size_t(2));
+    EXPECT_EQ(distribution1.getSigmaFactor(), 1.0);
+
+    /* TEMPORARILY DISABLED getParameterPool() 
+    ParameterPool* parameterPool = distribution1.getParameterPool();
+    parameterPool->registerParameter("value",&m_value);
+    handler.setParameterValues(parameterPool, 0);
+    EXPECT_EQ(m_value, 1.0);
+    handler.setParameterValues(parameterPool, 1);
+    EXPECT_EQ(m_value, 2.0);
+
+    delete parameterPool;
+    */
+}
+
+
+#endif // DISTRIBUTIONHANDLERTEST_H
diff --git a/Tests/UnitTests/Core/5/DistributionsTest.h b/Tests/UnitTests/Core/5/DistributionsTest.h
new file mode 100644
index 0000000..3b3e9d3
--- /dev/null
+++ b/Tests/UnitTests/Core/5/DistributionsTest.h
@@ -0,0 +1,404 @@
+#ifndef DISTRIBUTIONSTEST_H
+#define DISTRIBUTIONSTEST_H
+
+#include "MathConstants.h"
+#include "BornAgainNamespace.h"
+#include "Distributions.h"
+#include "Exceptions.h"
+#include "RealParameter.h"
+#include "ParameterSample.h"
+#include <cmath>
+#include <memory>
+
+class DistributionsTest : public ::testing::Test
+{
+protected:
+   DistributionsTest() {}
+};
+
+// -------------------------------------------------------------------------- //
+
+TEST_F(DistributionsTest, DistributionGateDefaultConstructor)
+{
+    std::unique_ptr<DistributionGate> P_distr_gate { new DistributionGate() };
+    EXPECT_EQ(0.5, P_distr_gate->getMean());
+    EXPECT_EQ(0.0, P_distr_gate->getMin());
+    EXPECT_EQ(1.0, P_distr_gate->getMax());
+    EXPECT_EQ(1.0, P_distr_gate->probabilityDensity(1.0));
+    EXPECT_EQ(0, P_distr_gate->probabilityDensity(3.0));
+    EXPECT_EQ(BornAgain::DistributionGateType, P_distr_gate->getName());
+
+    std::vector<double> list1 = P_distr_gate->generateValueList(1, 0.0);
+    EXPECT_EQ(list1.size(), size_t(1));
+    EXPECT_EQ(P_distr_gate->getMean(), list1[0]);
+
+    std::vector<double> list2 = P_distr_gate->generateValueList(2, 0.0);
+    EXPECT_EQ(list2.size(), size_t(2));
+    EXPECT_EQ(0, list2[0]);
+    EXPECT_EQ(1, list2[1]);
+}
+
+TEST_F(DistributionsTest, DistributionGateConstructor)
+{
+    // Throw error when m_min > m_max:
+    EXPECT_THROW(DistributionGate(1.1, 1.0), Exceptions::ClassInitializationException);
+
+    // When m_min == m_max, only one sample is generated (the mean):
+    DistributionGate distr1(1.0, 1.0);
+    std::vector<double> list1 = distr1.generateValueList(5, 0.0);
+    EXPECT_EQ(size_t(1), list1.size());
+    EXPECT_EQ(1.0, list1[0]);
+
+    // Test distribution with m_min < m_max:
+    DistributionGate distr2(1.0, 2.0);
+    EXPECT_EQ(1.5, distr2.getMean());
+    EXPECT_EQ(1.0, distr2.getMin());
+    EXPECT_EQ(2.0, distr2.getMax());
+    EXPECT_EQ(1.0, distr2.probabilityDensity(1));
+    EXPECT_EQ(0, distr2.probabilityDensity(3));
+    EXPECT_EQ(BornAgain::DistributionGateType, distr2.getName());
+
+    std::vector<double> list2 = distr2.generateValueList(1, 0.0);
+    EXPECT_EQ(list2.size(), size_t(1));
+    EXPECT_EQ(distr2.getMean(), list2[0]);
+
+    list2 = distr2.generateValueList(2, 0.0);
+    EXPECT_EQ(list2.size(), size_t(2));
+    EXPECT_EQ(1.0, list2[0]);
+    EXPECT_EQ(2.0, list2[1]);
+
+    std::vector<ParameterSample> samples = distr2.generateSamples(3);
+    EXPECT_EQ(samples.size(), size_t(3));
+    EXPECT_EQ(samples[0].value, 1.0);
+    EXPECT_EQ(samples[0].weight, 1./3.);
+    EXPECT_EQ(samples[1].value, 1.5);
+    EXPECT_EQ(samples[1].weight, 1./3.);
+    EXPECT_EQ(samples[2].value, 2.0);
+    EXPECT_EQ(samples[2].weight, 1./3.);
+}
+
+TEST_F(DistributionsTest, DistributionGateParameters)
+{
+    DistributionGate gate(2.0, 3.0);
+    EXPECT_EQ(gate.getMin(), gate.getParameter(BornAgain::Minimum)->getValue());
+    EXPECT_EQ(gate.getMax(), gate.getParameter(BornAgain::Maximum)->getValue());
+}
+
+TEST_F(DistributionsTest, DistributionGateClone)
+{
+    DistributionGate gate(2.0, 3.0);
+    DistributionGate *clone = gate.clone();
+    EXPECT_EQ(gate.getName(), clone->getName());
+    EXPECT_EQ(gate.getMean(), clone->getMean());
+    EXPECT_EQ(gate.getMin(), clone->getMin());
+    EXPECT_EQ(gate.getMax(), clone->getMax());
+    delete clone;
+}
+
+// -------------------------------------------------------------------------- //
+
+TEST_F(DistributionsTest, DistributionLorentzDefaultConstructor)
+{
+    std::unique_ptr<DistributionLorentz> P_distr_lorentz { new DistributionLorentz() };
+    EXPECT_EQ(0.0, P_distr_lorentz->getMean());
+    EXPECT_EQ(1.0, P_distr_lorentz->getHWHM());
+    EXPECT_EQ(BornAgain::DistributionLorentzType, P_distr_lorentz->getName());
+    EXPECT_EQ(1/(M_TWOPI), P_distr_lorentz->probabilityDensity(1.0));
+
+    std::vector<double> list1 = P_distr_lorentz->generateValueList(1, 0.0);
+    EXPECT_EQ(P_distr_lorentz->getMean(), list1[0]);
+
+    std::vector<double> list2 = P_distr_lorentz->generateValueList(2, 0.0);
+    EXPECT_EQ(-2, list2[0]);
+    EXPECT_EQ(2, list2[1]);
+}
+
+TEST_F(DistributionsTest, DistributionLorentzConstructor)
+{
+    // When HWHM == 0.0, only one sample is generated (the mean):
+    DistributionLorentz distr1(1.0, 0.0);
+    std::vector<double> list1 = distr1.generateValueList(5, 0.0);
+    EXPECT_EQ(size_t(1), list1.size());
+    EXPECT_EQ(1.0, list1[0]);
+
+    // Test distribution with HWHM > 0.0:
+    DistributionLorentz distr2(1.0, 1.0);
+    EXPECT_EQ(1.0, distr2.getMean());
+    EXPECT_EQ(1.0, distr2.getHWHM());
+    EXPECT_EQ(BornAgain::DistributionLorentzType, distr2.getName());
+    EXPECT_EQ(1.0/M_PI, distr2.probabilityDensity(1.0));
+
+    std::vector<double> list2 = distr2.generateValueList(1, 0.0);
+    EXPECT_EQ(distr2.getMean(), list2[0]);
+
+    std::vector<double> list3 = distr2.generateValueList(2, 0.0);
+    EXPECT_EQ(-1, list3[0]);
+    EXPECT_EQ(3, list3[1]);
+}
+
+TEST_F(DistributionsTest, DistributionLorentzParameters)
+{
+    DistributionLorentz lorentz(2.0, 3.0);
+    /* TEMPORARILY DISABLED getParameterPool()
+    EXPECT_EQ(lorentz.getMean(),
+              lorentz.getParameterPool()->getParameter(BornAgain::Mean).getValue());
+    EXPECT_EQ(lorentz.getHWHM(),
+              lorentz.getParameterPool()->getParameter(BornAgain::HWHM).getValue());
+    */
+}
+
+TEST_F(DistributionsTest, DistributionLorentzClone)
+{
+    std::unique_ptr<DistributionLorentz> P_distr_lorentz { new DistributionLorentz(1.0, 2.0) };
+    std::unique_ptr<DistributionLorentz> P_clone { P_distr_lorentz->clone() };
+    EXPECT_EQ(1.0, P_clone->getMean());
+    EXPECT_EQ(2.0, P_clone->getHWHM());
+    EXPECT_EQ(BornAgain::DistributionLorentzType, P_clone->getName());
+}
+
+TEST_F(DistributionsTest, DistributionLorentzSamples)
+{
+    DistributionLorentz distr(1.0, 0.1);
+
+    const int nbr_samples(3);
+
+    // with sigma factor
+    const double sigma_factor(2.0);
+    std::vector<ParameterSample> samples = distr.generateSamples(nbr_samples, sigma_factor);
+
+    EXPECT_EQ(samples.size(), size_t(nbr_samples));
+    EXPECT_EQ(samples[0].value, 1.0 - sigma_factor*0.1);
+    EXPECT_EQ(samples[1].value, 1.0);
+    EXPECT_EQ(samples[2].value, 1.0 + sigma_factor*0.1);
+    double d1 = distr.probabilityDensity(samples[0].value);
+    double d2 = distr.probabilityDensity(samples[1].value);
+    double d3 = distr.probabilityDensity(samples[2].value);
+    EXPECT_EQ(samples[0].weight, d1/(d1+d2+d3));
+    EXPECT_EQ(samples[1].weight, d2/(d1+d2+d3));
+    EXPECT_EQ(samples[2].weight, d3/(d1+d2+d3));
+
+    // with Limits
+    samples = distr.generateSamples(nbr_samples, sigma_factor, RealLimits::lowerLimited(0.99));
+    EXPECT_EQ(samples[0].value, 0.99);
+    EXPECT_EQ(samples[1].value, samples[0].value + (samples[2].value - samples[0].value)/2.0);
+    EXPECT_EQ(samples[2].value, 1.0 + sigma_factor*0.1);
+
+    // with xmin, xmax
+    samples = distr.generateSamples(nbr_samples, 0.8, 1.2);
+    EXPECT_EQ(samples[0].value, 0.8);
+    EXPECT_EQ(samples[1].value, 1.0);
+    EXPECT_EQ(samples[2].value, 1.2);
+}
+
+// -------------------------------------------------------------------------- //
+
+TEST_F(DistributionsTest, DistributionGaussianDefaultConstructor)
+{
+    std::unique_ptr<DistributionGaussian> P_distr_gauss { new DistributionGaussian() };
+    EXPECT_EQ(0.0, P_distr_gauss->getMean());
+    EXPECT_EQ(1.0, P_distr_gauss->getStdDev());
+    EXPECT_EQ(std::exp(-1.0/2.0)/std::sqrt(M_TWOPI), P_distr_gauss->probabilityDensity(1.0));
+    EXPECT_EQ(BornAgain::DistributionGaussianType, P_distr_gauss->getName());
+
+    std::vector<double> list1 = P_distr_gauss->generateValueList(1, 0.0);
+    EXPECT_EQ(P_distr_gauss->getMean(), list1[0]);
+
+    std::vector<double> list2 = P_distr_gauss->generateValueList(2, 0.0);
+    EXPECT_EQ(-2, list2[0]);
+    EXPECT_EQ(2, list2[1]);
+}
+
+TEST_F(DistributionsTest, DistributionGaussianConstructor)
+{
+    // When std_dev == 0.0, only one sample is generated (the mean):
+    DistributionGaussian distr1(1.0, 0.0);
+    std::vector<double> list1 = distr1.generateValueList(5, 0.0);
+    EXPECT_EQ(size_t(1), list1.size());
+    EXPECT_EQ(1.0, list1[0]);
+
+    // Test distribution with std_dev > 0.0:
+    DistributionGaussian distr2(1.0, 1.0);
+    EXPECT_EQ(1.0, distr2.getMean());
+    EXPECT_EQ(1.0, distr2.getStdDev());
+    EXPECT_EQ(1/std::sqrt(M_TWOPI), distr2.probabilityDensity(1.0));
+    EXPECT_EQ(BornAgain::DistributionGaussianType, distr2.getName());
+
+    std::vector<double> list2 = distr2.generateValueList(1, 0.0);
+    EXPECT_EQ(distr2.getMean(), list2[0]);
+
+    std::vector<double> list3 = distr2.generateValueList(2, 0.0);
+    EXPECT_EQ(-1, list3[0]);
+    EXPECT_EQ(3, list3[1]);
+}
+
+TEST_F(DistributionsTest, DistributionGaussianParameters)
+{
+    DistributionGaussian gaussian(2.0, 3.0);
+    /* TEMPORARILY DISABLED getParameterPool()
+    EXPECT_EQ(gaussian.getMean(),
+              gaussian.getParameterPool()->getParameter(BornAgain::Mean).getValue());
+    EXPECT_EQ(gaussian.getStdDev(),
+              gaussian.getParameterPool()->getParameter(BornAgain::StdDeviation).getValue());
+    */
+}
+
+TEST_F(DistributionsTest, DistributionGaussianClone)
+{
+    std::unique_ptr<DistributionGaussian> P_distr_gauss { new DistributionGaussian(1.0, 1.0) };
+    std::unique_ptr<DistributionGaussian> P_clone { P_distr_gauss->clone() };
+    EXPECT_EQ(1.0, P_clone->getMean());
+    EXPECT_EQ(1.0, P_clone->getStdDev());
+    EXPECT_EQ(1/std::sqrt(M_TWOPI), P_clone->probabilityDensity(1.0));
+    EXPECT_EQ(BornAgain::DistributionGaussianType, P_clone->getName());
+
+    std::vector<double> list1 = P_clone->generateValueList(1, 0.0);
+    EXPECT_EQ(P_distr_gauss->getMean(), list1[0]);
+
+    std::vector<double> list2 = P_clone->generateValueList(2, 0.0);
+    EXPECT_EQ(-1, list2[0]);
+    EXPECT_EQ(3, list2[1]);
+}
+
+// -------------------------------------------------------------------------- //
+
+TEST_F(DistributionsTest, DistributionLogNormalConstructorWithOneParameter)
+{
+    // When scale_par == 0.0, only one sample is generated (the mean):
+    DistributionLogNormal distr1(1.0, 0.0);
+    std::vector<double> list1 = distr1.generateValueList(5, 0.0);
+    EXPECT_EQ(size_t(1), list1.size());
+    EXPECT_EQ(1.0, list1[0]);
+
+    // Test distribution with scale_par > 0.0:
+    DistributionLogNormal distr2(1.0);
+    EXPECT_EQ(1.0, distr2.getMedian());
+    EXPECT_EQ(1.0, distr2.getScalePar());
+    EXPECT_EQ(std::exp(0.5), distr2.getMean());
+    EXPECT_EQ(1.0/std::sqrt(M_TWOPI), distr2.probabilityDensity(1.0));
+    EXPECT_EQ(BornAgain::DistributionLogNormalType, distr2.getName());
+
+    std::vector<double> list2 = distr2.generateValueList(1, 0.0);
+    EXPECT_EQ(distr2.getMedian(), list2[0]);
+
+    std::vector<double> list3 = distr2.generateValueList(2, 0.0);
+    EXPECT_EQ(std::exp(-2), list3[0]);
+    EXPECT_EQ(std::exp(-2) + std::exp(2) - std::exp(-2), list3[1]);
+}
+
+TEST_F(DistributionsTest, DistributionLogNormalConstructorWithTwoParameter)
+{
+    std::unique_ptr<DistributionLogNormal> P_distr_lognormal { new DistributionLogNormal(1.0,1.0) };
+    EXPECT_EQ(1.0, P_distr_lognormal->getMedian());
+    EXPECT_EQ(1.0, P_distr_lognormal->getScalePar());
+    EXPECT_EQ(std::exp(0.5), P_distr_lognormal->getMean());
+    EXPECT_EQ(1.0/std::sqrt(M_TWOPI), P_distr_lognormal->probabilityDensity(1.0));
+    EXPECT_EQ(BornAgain::DistributionLogNormalType, P_distr_lognormal->getName());
+
+    std::vector<double> list1 = P_distr_lognormal->generateValueList(1, 0.0);
+    EXPECT_EQ(P_distr_lognormal->getMedian(), list1[0]);
+
+    std::vector<double> list2 = P_distr_lognormal->generateValueList(2, 0.0);
+    EXPECT_EQ(std::exp(-2), list2[0]);
+    EXPECT_EQ(std::exp(-2) + std::exp(2) - std::exp(-2), list2[1]);
+}
+
+TEST_F(DistributionsTest, DistributionLogNormalParameters)
+{
+    DistributionLogNormal logNormal(2.0, 3.0);
+    /* TEMPORARILY DISABLED getParameterPool()
+    EXPECT_EQ(logNormal.getMedian(),
+              logNormal.getParameterPool()->getParameter(BornAgain::Median).getValue());
+    EXPECT_EQ(logNormal.getScalePar(),
+              logNormal.getParameterPool()->getParameter(BornAgain::ScaleParameter).getValue());
+    */
+}
+
+TEST_F(DistributionsTest, DistributionLogNormalClone)
+{
+    std::unique_ptr<DistributionLogNormal> P_distr_lognormal { new DistributionLogNormal(1.0, 1.0) };
+    std::unique_ptr<DistributionLogNormal> P_clone { P_distr_lognormal->clone() };
+    EXPECT_EQ(1.0, P_distr_lognormal->getMedian());
+    EXPECT_EQ(1.0, P_distr_lognormal->getScalePar());
+    EXPECT_EQ(std::exp(0.5), P_distr_lognormal->getMean());
+    EXPECT_EQ(1/std::sqrt(M_TWOPI), P_distr_lognormal->probabilityDensity(1.0));
+    EXPECT_EQ(BornAgain::DistributionLogNormalType, P_distr_lognormal->getName());
+
+    std::vector<double> list1 = P_distr_lognormal->generateValueList(1, 0.0);
+    EXPECT_EQ(P_distr_lognormal->getMedian(), list1[0]);
+
+    std::vector<double> list2 = P_distr_lognormal->generateValueList(2,0.0);
+    EXPECT_EQ(std::exp(-2), list2[0]);
+    EXPECT_EQ(std::exp(-2) + std::exp(2) - std::exp(-2), list2[1]);
+}
+
+// -------------------------------------------------------------------------- //
+
+TEST_F(DistributionsTest, DistributionCosineDefaultConstructor)
+{
+    std::unique_ptr<DistributionCosine> P_distr_cosine { new DistributionCosine() };
+    EXPECT_EQ(0.0, P_distr_cosine->getMean());
+    EXPECT_EQ(1.0, P_distr_cosine->getSigma());
+    EXPECT_DOUBLE_EQ((1.0+std::cos(1.0))/(M_TWOPI), P_distr_cosine->probabilityDensity(1.0));
+    EXPECT_EQ(0, P_distr_cosine->probabilityDensity(100.0));
+    EXPECT_EQ(BornAgain::DistributionCosineType, P_distr_cosine->getName());
+
+    std::vector<double> list1 = P_distr_cosine->generateValueList(1, 0.0);
+    EXPECT_EQ(P_distr_cosine->getMean(), list1[0]);
+
+    std::vector<double> list2 = P_distr_cosine->generateValueList(2, 0.0);
+    EXPECT_EQ(-M_PI, list2[0]);
+    EXPECT_EQ(M_PI, list2[1]);
+}
+
+TEST_F(DistributionsTest, DistributionCosineConstructor)
+{
+    // When sigma == 0.0, only one sample is generated (the mean):
+    DistributionCosine distr1(1.0, 0.0);
+    std::vector<double> list1 = distr1.generateValueList(5, 0.0);
+    EXPECT_EQ(size_t(1), list1.size());
+    EXPECT_EQ(1.0, list1[0]);
+
+    // Test distribution with sigma > 0.0:
+    DistributionCosine distr2(1.0,1.0);
+    EXPECT_EQ(1.0, distr2.getMean());
+    EXPECT_EQ(1.0, distr2.getSigma());
+    EXPECT_EQ(2.0/(M_TWOPI), distr2.probabilityDensity(1.0));
+    EXPECT_EQ(0, distr2.probabilityDensity(100.0));
+    EXPECT_EQ(BornAgain::DistributionCosineType, distr2.getName());
+
+    std::vector<double> list2 = distr2.generateValueList(1, 0.0);
+    EXPECT_EQ(distr2.getMean(), list2[0]);
+
+    std::vector<double> list3 = distr2.generateValueList(2, 0.0);
+    EXPECT_EQ(1-M_PI, list3[0]);
+    EXPECT_EQ(1+M_PI, list3[1]);
+}
+
+TEST_F(DistributionsTest, DistributionCosineParameters)
+{
+    DistributionCosine cosine(2.0, 3.0);
+    /* TEMPORARILY DISABLED getParameterPool()
+    EXPECT_EQ(cosine.getMean(), cosine.getParameterPool()->getParameter(BornAgain::Mean).getValue());
+    EXPECT_EQ(cosine.getSigma(), cosine.getParameterPool()->getParameter(BornAgain::Sigma).getValue());
+    */
+}
+
+TEST_F(DistributionsTest, DistributionCosineClone)
+{
+    std::unique_ptr<DistributionCosine> P_distr_cosine { new DistributionCosine(1.0,1.0) };
+    std::unique_ptr<DistributionCosine> P_clone { P_distr_cosine->clone() };
+    EXPECT_EQ(1.0, P_clone->getMean());
+    EXPECT_EQ(1.0, P_clone->getSigma());
+    EXPECT_EQ(2.0/(M_TWOPI), P_clone->probabilityDensity(1.0));
+    EXPECT_EQ(0, P_distr_cosine->probabilityDensity(100.0));
+    EXPECT_EQ(BornAgain::DistributionCosineType, P_clone->getName());
+
+    std::vector<double> list1 = P_clone->generateValueList(1, 0.0);
+    EXPECT_EQ(P_clone->getMean(), list1[0]);
+
+    std::vector<double> list2 = P_clone->generateValueList(2, 0.0);
+    EXPECT_EQ(1-M_PI, list2[0]);
+    EXPECT_EQ(1+M_PI, list2[1]);
+}
+
+#endif // DISTRIBUTIONSTEST_H
diff --git a/Tests/UnitTests/Core/5/FTDistributionsTest.h b/Tests/UnitTests/Core/5/FTDistributionsTest.h
new file mode 100644
index 0000000..d1e64d8
--- /dev/null
+++ b/Tests/UnitTests/Core/5/FTDistributionsTest.h
@@ -0,0 +1,294 @@
+#ifndef FTDISTRIBUTIONSTEST_H
+#define FTDISTRIBUTIONSTEST_H
+
+#include "FTDistributions1D.h"
+#include "FTDistributions2D.h"
+#include "BornAgainNamespace.h"
+#include "MathConstants.h"
+#include <memory>
+
+using namespace BornAgain;
+
+class FTDistributionsTest : public ::testing::Test
+{
+protected:
+    FTDistributionsTest() {}
+};
+
+// test 1D
+
+TEST_F(FTDistributionsTest, FTDistribution1DCauchyConstructor)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_cauchy { new FTDistribution1DCauchy(1.0) };
+    EXPECT_EQ(1.0, P_1d_cauchy->getOmega());
+    EXPECT_EQ(FTDistribution1DCauchyType, P_1d_cauchy->getName());
+    EXPECT_NEAR(0.961538, P_1d_cauchy->evaluate(0.2),0.000001);
+
+    P_1d_cauchy->setOmega(3.0);
+    EXPECT_EQ(3.0, P_1d_cauchy->getOmega());
+
+    P_1d_cauchy->setParameterValue(Omega, -7.0);
+    EXPECT_EQ(-7.0, P_1d_cauchy->getOmega());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DCauchyClone)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_cauchy { new FTDistribution1DCauchy(5.0) };
+    std::unique_ptr<IFTDistribution1D> P_clone { P_1d_cauchy->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getOmega());
+    EXPECT_EQ(FTDistribution1DCauchyType, P_clone->getName());
+    EXPECT_NEAR(0.5, P_clone->evaluate(0.2),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DGaussConstructor)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_gauss { new FTDistribution1DGauss(1.0) };
+    EXPECT_EQ(1.0, P_1d_gauss->getOmega());
+    EXPECT_EQ(FTDistribution1DGaussType, P_1d_gauss->getName());
+    EXPECT_NEAR(0.9801987, P_1d_gauss->evaluate(0.2),0.000001);
+
+    P_1d_gauss->setOmega(3.0);
+    EXPECT_EQ(3.0, P_1d_gauss->getOmega());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DGaussClone)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_gauss { new FTDistribution1DGauss(5.0) };
+    std::unique_ptr<IFTDistribution1D> P_clone { P_1d_gauss->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getOmega());
+    EXPECT_EQ(FTDistribution1DGaussType, P_clone->getName());
+    EXPECT_NEAR(0.6065307, P_clone->evaluate(0.2),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DGateConstructor)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_gate { new FTDistribution1DGate(1.0) };
+    EXPECT_EQ(1.0, P_1d_gate->getOmega());
+    EXPECT_EQ(FTDistribution1DGateType, P_1d_gate->getName());
+    EXPECT_NEAR(0.993347, P_1d_gate->evaluate(0.2),0.000001);
+
+    P_1d_gate->setOmega(3.0);
+    EXPECT_EQ(3.0, P_1d_gate->getOmega());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DGateClone)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_gate { new FTDistribution1DGate(5.0) };
+    std::unique_ptr<IFTDistribution1D> P_clone { P_1d_gate->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getOmega());
+    EXPECT_EQ(FTDistribution1DGateType, P_clone->getName());
+    EXPECT_NEAR(0.841471, P_clone->evaluate(0.2),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DTriangleConstructor)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_triangle { new FTDistribution1DTriangle(1.0) };
+    EXPECT_EQ(1.0, P_1d_triangle->getOmega());
+    EXPECT_EQ(FTDistribution1DTriangleType, P_1d_triangle->getName());
+    EXPECT_NEAR(0.996671, P_1d_triangle->evaluate(0.2),0.000001);
+
+    P_1d_triangle->setOmega(3.0);
+    EXPECT_EQ(3.0, P_1d_triangle->getOmega());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DTriangleClone)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_triangle { new FTDistribution1DTriangle(5.0) };
+    std::unique_ptr<IFTDistribution1D> P_clone { P_1d_triangle->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getOmega());
+    EXPECT_EQ(FTDistribution1DTriangleType, P_clone->getName());
+    EXPECT_NEAR(0.919395, P_clone->evaluate(0.2),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DCosineConstructor)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_cosine { new FTDistribution1DCosine(1.0) };
+    EXPECT_EQ(1.0, P_1d_cosine->getOmega());
+    EXPECT_EQ(FTDistribution1DCosineType, P_1d_cosine->getName());
+    EXPECT_NEAR(0.997389, P_1d_cosine->evaluate(0.2),0.000001);
+
+    P_1d_cosine->setOmega(3.0);
+    EXPECT_EQ(3.0, P_1d_cosine->getOmega());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DCosineClone)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_cosine { new FTDistribution1DCosine(5.0) };
+    std::unique_ptr<IFTDistribution1D> P_clone { P_1d_cosine->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getOmega());
+    EXPECT_EQ(FTDistribution1DCosineType, P_clone->getName());
+    EXPECT_NEAR(0.936342, P_clone->evaluate(0.2),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DVoigtConstructor)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_voigt { new FTDistribution1DVoigt(1.0,1.7) };
+    EXPECT_EQ(1.0, P_1d_voigt->getOmega());
+    EXPECT_EQ(FTDistribution1DVoigtType, P_1d_voigt->getName());
+    EXPECT_NEAR(0.993261, P_1d_voigt->evaluate(0.2),0.000001);
+
+    P_1d_voigt->setOmega(3.0);
+    EXPECT_EQ(3.0, P_1d_voigt->getOmega());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution1DVoigtClone)
+{
+    std::unique_ptr<IFTDistribution1D> P_1d_voigt { new FTDistribution1DVoigt(5.0,-5.6) };
+    std::unique_ptr<IFTDistribution1D> P_clone { P_1d_voigt->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getOmega());
+    EXPECT_EQ(FTDistribution1DVoigtType, P_clone->getName());
+    EXPECT_NEAR(-0.096572, P_clone->evaluate(0.2),0.000001);
+}
+
+// test 2D
+
+TEST_F(FTDistributionsTest, FTDistribution2DCauchyConstructor)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_cauchy { new FTDistribution2DCauchy(1.0,2.0) };
+    EXPECT_EQ(1.0, P_2d_cauchy->getCoherenceLengthX());
+    EXPECT_EQ(2.0, P_2d_cauchy->getCoherenceLengthY());
+    EXPECT_EQ(2.0, P_2d_cauchy->getParameter("CoherenceLengthY")->getValue());
+    EXPECT_EQ(0, P_2d_cauchy->getParameter("Gamma")->getValue());
+    EXPECT_EQ(M_PI/2.0, P_2d_cauchy->getDelta());
+    EXPECT_EQ(0.0, P_2d_cauchy->getGamma());
+    EXPECT_EQ(FTDistribution2DCauchyType, P_2d_cauchy->getName());
+    EXPECT_NEAR(0.343206, P_2d_cauchy->evaluate(0.2, 0.5),0.000001);
+
+    P_2d_cauchy->setGamma(3.0);
+    EXPECT_EQ(3.0, P_2d_cauchy->getGamma());
+    EXPECT_EQ(3.0, P_2d_cauchy->getParameter("Gamma")->getValue());
+
+    P_2d_cauchy->setParameterValue(CoherenceLengthX, 7.0);
+    P_2d_cauchy->setParameterValue(CoherenceLengthY, 5.3);
+    EXPECT_EQ(7.0, P_2d_cauchy->getCoherenceLengthX());
+    EXPECT_EQ(5.3, P_2d_cauchy->getCoherenceLengthY());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DCauchyClone)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_cauchy { new FTDistribution2DCauchy(5.0,2.3) };
+    std::unique_ptr<IFTDistribution2D> P_clone { P_2d_cauchy->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getCoherenceLengthX());
+    EXPECT_EQ(2.3, P_clone->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_clone->getDelta());
+    EXPECT_EQ(0.0, P_clone->getGamma());
+    EXPECT_EQ(FTDistribution2DCauchyType, P_clone->getName());
+    EXPECT_NEAR(0.165121078, P_clone->evaluate(0.2, 0.5),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DGaussConstructor)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_gauss { new FTDistribution2DGauss(1.0,2.0) };
+    EXPECT_EQ(1.0, P_2d_gauss->getCoherenceLengthX());
+    EXPECT_EQ(2.0, P_2d_gauss->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_2d_gauss->getDelta());
+    EXPECT_EQ(0.0, P_2d_gauss->getGamma());
+    EXPECT_EQ(FTDistribution2DGaussType, P_2d_gauss->getName());
+    EXPECT_NEAR(0.5945205, P_2d_gauss->evaluate(0.2, 0.5),0.000001);
+
+    P_2d_gauss->setGamma(3.0);
+    EXPECT_EQ(3.0, P_2d_gauss->getGamma());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DGaussClone)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_gauss { new FTDistribution2DGauss(5.0,2.3) };
+    std::unique_ptr<IFTDistribution2D> P_clone { P_2d_gauss->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getCoherenceLengthX());
+    EXPECT_EQ(2.3, P_clone->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_clone->getDelta());
+    EXPECT_EQ(0.0, P_clone->getGamma());
+    EXPECT_EQ(FTDistribution2DGaussType, P_clone->getName());
+    EXPECT_NEAR(0.3130945, P_clone->evaluate(0.2, 0.5),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DGateConstructor)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_gate { new FTDistribution2DGate(1.0,2.0) };
+    EXPECT_EQ(1.0, P_2d_gate->getCoherenceLengthX());
+    EXPECT_EQ(2.0, P_2d_gate->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_2d_gate->getDelta());
+    EXPECT_EQ(0.0, P_2d_gate->getGamma());
+    EXPECT_EQ(FTDistribution2DGateType, P_2d_gate->getName());
+    EXPECT_NEAR(0.875513, P_2d_gate->evaluate(0.2, 0.5),0.000001);
+
+    P_2d_gate->setGamma(3.0);
+    EXPECT_EQ(3.0, P_2d_gate->getGamma());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DGateClone)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_gate { new FTDistribution2DGate(5.0,2.3) };
+    std::unique_ptr<IFTDistribution2D> P_clone { P_2d_gate->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getCoherenceLengthX());
+    EXPECT_EQ(2.3, P_clone->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_clone->getDelta());
+    EXPECT_EQ(0.0, P_clone->getGamma());
+    EXPECT_EQ(FTDistribution2DGateType, P_clone->getName());
+    EXPECT_NEAR(0.736461, P_clone->evaluate(0.2, 0.5),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DConeConstructor)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_cone { new FTDistribution2DCone(1.0,2.0) };
+    EXPECT_EQ(1.0, P_2d_cone->getCoherenceLengthX());
+    EXPECT_EQ(2.0, P_2d_cone->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_2d_cone->getDelta());
+    EXPECT_EQ(0.0, P_2d_cone->getGamma());
+    EXPECT_EQ(FTDistribution2DConeType, P_2d_cone->getName());
+    EXPECT_NEAR(0.924374, P_2d_cone->evaluate(0.2, 0.5),0.000001);
+
+    P_2d_cone->setGamma(3.0);
+    EXPECT_EQ(3.0, P_2d_cone->getGamma());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DConeClone)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_cone { new FTDistribution2DCone(5.0,2.3) };
+    std::unique_ptr<IFTDistribution2D> P_clone { P_2d_cone->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getCoherenceLengthX());
+    EXPECT_EQ(2.3, P_clone->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_clone->getDelta());
+    EXPECT_EQ(0.0, P_clone->getGamma());
+    EXPECT_EQ(FTDistribution2DConeType, P_clone->getName());
+    EXPECT_NEAR(0.837410, P_clone->evaluate(0.2, 0.5),0.000001);
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DVoigtConstructor)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_voigt { new FTDistribution2DVoigt(1.0,2.0,3.5) };
+    EXPECT_EQ(1.0, P_2d_voigt->getCoherenceLengthX());
+    EXPECT_EQ(2.0, P_2d_voigt->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_2d_voigt->getDelta());
+    EXPECT_EQ(0.0, P_2d_voigt->getGamma());
+    EXPECT_EQ(FTDistribution2DVoigtType, P_2d_voigt->getName());
+    EXPECT_NEAR(1.2228072, P_2d_voigt->evaluate(0.2, 0.5),0.000001);
+
+    P_2d_voigt->setGamma(3.0);
+    EXPECT_EQ(3.0, P_2d_voigt->getGamma());
+}
+
+TEST_F(FTDistributionsTest, FTDistribution2DVoigtClone)
+{
+    std::unique_ptr<IFTDistribution2D> P_2d_voigt { new FTDistribution2DVoigt(5.0,2.3, -5.6) };
+    std::unique_ptr<IFTDistribution2D> P_clone { P_2d_voigt->clone() };
+
+    EXPECT_EQ(5.0, P_clone->getCoherenceLengthX());
+    EXPECT_EQ(2.3, P_clone->getCoherenceLengthY());
+    EXPECT_EQ(M_PI/2.0, P_clone->getDelta());
+    EXPECT_EQ(0.0, P_clone->getGamma());
+    EXPECT_EQ(FTDistribution2DVoigtType, P_clone->getName());
+    EXPECT_NEAR(-0.6635305, P_clone->evaluate(0.2, 0.5),0.000001);
+}
+
+#endif // FTDISTRIBUTIONSTEST_H
diff --git a/Tests/UnitTests/Core/5/IParameterizedTest.h b/Tests/UnitTests/Core/5/IParameterizedTest.h
new file mode 100644
index 0000000..d4ac0ae
--- /dev/null
+++ b/Tests/UnitTests/Core/5/IParameterizedTest.h
@@ -0,0 +1,82 @@
+#ifndef IPARAMETERIZEDTEST_H
+#define IPARAMETERIZEDTEST_H
+
+#include "IParameterized.h"
+#include <stdexcept>
+
+class IParameterizedTest : public ::testing::Test
+{
+protected:
+    IParameterizedTest() {}
+    virtual ~IParameterizedTest(){}
+
+    IParameterized m_initial_object;
+
+    class ParameterizedObject : public IParameterized
+    {
+    public:
+        ParameterizedObject() : m_real_par1(0), m_real_par2(0) {
+            setName("Parameterized"); init_parameters(); }
+        double m_real_par1;
+        double m_real_par2;
+    protected:
+        virtual void init_parameters()
+        {
+            registerParameter("par1",&m_real_par1);
+            registerParameter("par2",&m_real_par2);
+        }
+    };
+    ParameterizedObject m_parameterized;
+};
+
+
+TEST_F(IParameterizedTest, InitialState)
+{
+    /* TEMPORARILY DISABLED getParameterPool()
+    EXPECT_EQ( size_t(0), m_initial_object.getParameterPool()->size() );
+    IParameterized obj2(m_initial_object);
+    EXPECT_EQ( size_t(0), obj2.getParameterPool()->size() );
+    */
+}
+
+
+TEST_F(IParameterizedTest, DealingWithPool)
+{
+    /* TEMPORARILY DISABLED getParameterPool()
+    EXPECT_EQ( size_t(2), m_parameterized.getParameterPool()->size());
+    IParameterizedTest::ParameterizedObject obj2 = m_parameterized;
+    EXPECT_EQ( size_t(0), obj2.getParameterPool()->size());
+    ParameterPool *pool = m_parameterized.createParameterTree();
+    //POOL_2('/Parameterized/par1':0 '/Parameterized/par2':0 )
+    //std::cout << *pool << std::endl;
+    pool->getParameter("/Parameterized/par1").setValue(1.0);
+    pool->getParameter("/Parameterized/par2").setValue(2.0);
+    EXPECT_EQ( double(1.0), m_parameterized.m_real_par1);
+    EXPECT_EQ( double(2.0), m_parameterized.m_real_par2);
+    */
+}
+
+TEST_F(IParameterizedTest, SetParameterValue)
+{
+    m_parameterized.m_real_par1 = 1.0;
+    m_parameterized.m_real_par2 = 2.0;
+    m_parameterized.setParameterValue("par1", 3.0);
+    m_parameterized.setParameterValue("par2", 4.0);
+    EXPECT_EQ( double(3.0), m_parameterized.m_real_par1);
+    EXPECT_EQ( double(4.0), m_parameterized.m_real_par2);
+    ASSERT_THROW( m_parameterized.setParameterValue("NotExistingParameterName", 4.0),
+                  std::runtime_error );
+    m_parameterized.setParameterValue("*par*", 5.0);
+    EXPECT_EQ( double(5.0), m_parameterized.m_real_par1);
+    EXPECT_EQ( double(5.0), m_parameterized.m_real_par2);
+    m_parameterized.setParameterValue("/Parameterized/par1", 7.0);
+    EXPECT_EQ( double(7.0), m_parameterized.m_real_par1);
+    EXPECT_EQ( double(5.0), m_parameterized.m_real_par2);
+    /* TEMPORARILY DISABLED getParameterPool()
+    m_parameterized.clearParameterPool();
+    EXPECT_EQ( 0.0, m_parameterized.getParameterPool()->size());
+    */
+}
+
+
+#endif // IPARAMETERIZEDTEST_H
diff --git a/Tests/UnitTests/Core/5/ParameterDistributionTest.h b/Tests/UnitTests/Core/5/ParameterDistributionTest.h
new file mode 100644
index 0000000..c09cc5f
--- /dev/null
+++ b/Tests/UnitTests/Core/5/ParameterDistributionTest.h
@@ -0,0 +1,145 @@
+#ifndef PARAMETERDISTRIBUTIONTEST_H
+#define PARAMETERDISTRIBUTIONTEST_H
+
+#include "ParameterDistribution.h"
+#include "Distributions.h"
+#include "Exceptions.h"
+#include "ParameterSample.h"
+#include "IParameterized.h"
+#include <cmath>
+
+class ParameterDistributionTest : public ::testing::Test
+{
+
+protected:
+   ParameterDistributionTest() {}
+};
+
+TEST_F(ParameterDistributionTest, ParameterDistributionConstructor)
+{
+    std::string name = "MainParameterName";
+    DistributionGate distribution(1.0, 2.0);
+    EXPECT_THROW(ParameterDistribution(name, distribution, 1, -1.0),
+                 Exceptions::RuntimeErrorException);
+    EXPECT_THROW(ParameterDistribution(name, distribution, 0),
+                 Exceptions::RuntimeErrorException);
+
+    // Sigma constructor
+    ParameterDistribution pardistr(name, distribution, 1);
+    EXPECT_EQ("ParameterDistribution", pardistr.getName());
+    EXPECT_EQ(1.5, pardistr.getDistribution()->getMean());
+    EXPECT_EQ("DistributionGate", pardistr.getDistribution()->getName());
+    EXPECT_EQ(1.0, pardistr.getDistribution()->probabilityDensity(1));
+    EXPECT_EQ(name, pardistr.getMainParameterName());
+    EXPECT_EQ(size_t(1), pardistr.getNbrSamples());
+    EXPECT_EQ(0.0, pardistr.getSigmaFactor());
+    EXPECT_EQ(RealLimits(), pardistr.getLimits());
+    EXPECT_EQ(pardistr.getLinkedParameterNames().size(), size_t(0));
+    EXPECT_EQ(1.0, pardistr.getMinValue());
+    EXPECT_EQ(-1.0, pardistr.getMaxValue());
+
+    ParameterDistribution pardistr2(name, distribution, 5, 2.0, RealLimits::limited(1.0, 2.0));
+    EXPECT_EQ(size_t(5), pardistr2.getNbrSamples());
+    EXPECT_EQ(2.0, pardistr2.getSigmaFactor());
+    EXPECT_EQ(RealLimits::limited(1.0, 2.0), pardistr2.getLimits());
+
+    // xmin, xmax constructor
+    ParameterDistribution pardistr3(name, distribution, 5, 1.0, 2.0);
+    EXPECT_EQ("ParameterDistribution", pardistr3.getName());
+    EXPECT_EQ(1.5, pardistr3.getDistribution()->getMean());
+    EXPECT_EQ("DistributionGate", pardistr3.getDistribution()->getName());
+    EXPECT_EQ(1.0, pardistr3.getDistribution()->probabilityDensity(1));
+    EXPECT_EQ(name, pardistr3.getMainParameterName());
+    EXPECT_EQ(size_t(5), pardistr3.getNbrSamples());
+    EXPECT_EQ(0.0, pardistr3.getSigmaFactor());
+    EXPECT_EQ(RealLimits(), pardistr3.getLimits());
+    EXPECT_EQ(pardistr3.getLinkedParameterNames().size(), size_t(0));
+}
+
+TEST_F(ParameterDistributionTest, ParameterDistributionCopyConstructor)
+{
+    DistributionGate distribution(1.0, 2.0);
+    std::string name = "MainParameterName";
+    ParameterDistribution pardistr(name, distribution, 5, 2.0, RealLimits::limited(1.0, 2.0));
+    pardistr.linkParameter("link1").linkParameter("link2");
+
+    ParameterDistribution pcopy(pardistr);
+    EXPECT_EQ(pardistr.getName(), pcopy.getName());
+    EXPECT_EQ(1.5, pcopy.getDistribution()->getMean());
+    EXPECT_EQ(pardistr.getDistribution()->getName(), pcopy.getDistribution()->getName());
+
+    EXPECT_EQ(pardistr.getDistribution()->probabilityDensity(1), pcopy.getDistribution()->probabilityDensity(1));
+    EXPECT_EQ(pardistr.getMainParameterName(), pcopy.getMainParameterName());
+    EXPECT_EQ(pardistr.getNbrSamples(), pcopy.getNbrSamples());
+    EXPECT_EQ(pardistr.getSigmaFactor(), pcopy.getSigmaFactor());
+    EXPECT_EQ(pardistr.getLimits(), pcopy.getLimits());
+    EXPECT_EQ(pardistr.getLinkedParameterNames().size(), pcopy.getLinkedParameterNames().size());
+    EXPECT_EQ("link1", pcopy.getLinkedParameterNames()[0]);
+    EXPECT_EQ("link2", pcopy.getLinkedParameterNames()[1]);
+    EXPECT_EQ(pardistr.getMinValue(), pcopy.getMinValue());
+    EXPECT_EQ(pardistr.getMaxValue(), pcopy.getMaxValue());
+}
+
+TEST_F(ParameterDistributionTest, ParameterDistributionAssignment)
+{
+    DistributionGate distribution(1.0, 2.0);
+    std::string name = "MainParameterName";
+    ParameterDistribution pardistr(name, distribution, 5, 2.0, RealLimits::limited(1.0, 2.0));
+    pardistr.linkParameter("link1").linkParameter("link2");
+
+    ParameterDistribution pcopy = pardistr;
+    EXPECT_EQ(pardistr.getName(), pcopy.getName());
+    EXPECT_EQ(1.5, pcopy.getDistribution()->getMean());
+    EXPECT_EQ(pardistr.getDistribution()->getName(), pcopy.getDistribution()->getName());
+
+    EXPECT_EQ(pardistr.getDistribution()->probabilityDensity(1), pcopy.getDistribution()->probabilityDensity(1));
+    EXPECT_EQ(pardistr.getMainParameterName(), pcopy.getMainParameterName());
+    EXPECT_EQ(pardistr.getNbrSamples(), pcopy.getNbrSamples());
+    EXPECT_EQ(pardistr.getSigmaFactor(), pcopy.getSigmaFactor());
+    EXPECT_EQ(pardistr.getLimits(), pcopy.getLimits());
+    EXPECT_EQ(pardistr.getLinkedParameterNames().size(), pcopy.getLinkedParameterNames().size());
+    EXPECT_EQ("link1", pcopy.getLinkedParameterNames()[0]);
+    EXPECT_EQ("link2", pcopy.getLinkedParameterNames()[1]);
+    EXPECT_EQ(pardistr.getMinValue(), pcopy.getMinValue());
+    EXPECT_EQ(pardistr.getMaxValue(), pcopy.getMaxValue());
+}
+
+TEST_F(ParameterDistributionTest, GenerateSamples)
+{
+    const double mean(1.0);
+    const double sigma(0.8);
+    DistributionGaussian distribution(mean, sigma);
+
+    std::string name = "MainParameterName";
+    const int nbr_samples(3);
+    const double sigma_factor(2.0);
+
+    // without Limits
+    ParameterDistribution pardistr(name, distribution, nbr_samples, sigma_factor);
+    std::vector<ParameterSample> sample_values = pardistr.generateSamples();
+    EXPECT_EQ(sample_values.size(), size_t(3));
+    EXPECT_EQ(sample_values[0].value, mean-sigma_factor*sigma);
+    EXPECT_EQ(sample_values[1].value, mean);
+    EXPECT_EQ(sample_values[2].value, mean+sigma_factor*sigma);
+
+    // with Limits
+    ParameterDistribution pardistr2(name, distribution, nbr_samples, sigma_factor, RealLimits::lowerLimited(mean));
+    sample_values = pardistr2.generateSamples();
+    EXPECT_EQ(sample_values.size(), size_t(3));
+    EXPECT_EQ(sample_values[0].value, mean);
+    EXPECT_EQ(sample_values[1].value, mean+sigma_factor*sigma/2.0);
+    EXPECT_EQ(sample_values[2].value, mean+sigma_factor*sigma);
+
+    // with xmin, xmax defined
+    double xmin(-1.0);
+    double xmax(2.0);
+    ParameterDistribution pardistr3(name, distribution, nbr_samples, xmin, xmax);
+    sample_values = pardistr3.generateSamples();
+    EXPECT_EQ(sample_values.size(), size_t(3));
+    EXPECT_EQ(sample_values[0].value, xmin);
+    EXPECT_EQ(sample_values[1].value, xmin + (xmax-xmin)/2.0);
+    EXPECT_EQ(sample_values[2].value, xmax);
+}
+
+
+#endif // PARAMETERDISTRIBUTIONTEST_H
diff --git a/Tests/UnitTests/Core/5/ParameterPoolTest.h b/Tests/UnitTests/Core/5/ParameterPoolTest.h
new file mode 100644
index 0000000..f70ac46
--- /dev/null
+++ b/Tests/UnitTests/Core/5/ParameterPoolTest.h
@@ -0,0 +1,125 @@
+#ifndef PARAMETERPOOLTEST_H
+#define PARAMETERPOOLTEST_H
+
+#include "ParameterPool.h"
+
+/* TEMPORARILY DISABLED
+class ParameterPoolTest : public ::testing::Test
+{
+ protected:
+    ParameterPoolTest();
+    virtual ~ParameterPoolTest(){}
+
+    ParameterPool m_empty_pool;
+    ParameterPool m_pool;
+    double m_real_par1;
+    double m_real_par2;
+    double m_real_par3;
+    double m_real_par4;
+};
+
+
+ParameterPoolTest::ParameterPoolTest()
+    : m_real_par1(1.0), m_real_par2(2.0), m_real_par3(3.0), m_real_par4(4.0)
+{
+    m_pool.registerParameter("a_par1",&m_real_par1);
+    m_pool.registerParameter("a_par2",&m_real_par2);
+    ParameterPool::parameter_t poolpar(&m_real_par3);
+    m_pool.addParameter("b_par3",poolpar);
+}
+
+
+TEST_F(ParameterPoolTest, InitialState)
+{
+    EXPECT_EQ( size_t(0), m_empty_pool.size() );
+    ASSERT_THROW( m_empty_pool.getParameter("NotExistingName"), Exceptions::LogicErrorException );
+}
+
+
+TEST_F(ParameterPoolTest, registerParameters)
+{
+    EXPECT_EQ( size_t(3), m_pool.size() );
+    EXPECT_EQ( double(1.0), m_pool.getParameter("a_par1").getValue());
+    EXPECT_EQ( double(2.0), m_pool.getParameter("a_par2").getValue());
+    EXPECT_EQ( double(3.0), m_pool.getParameter("b_par3").getValue());
+    m_real_par3 = 3.1;
+    EXPECT_EQ( double(3.1), m_pool.getParameter("b_par3").getValue());
+    std::vector<ParameterPool::parameter_t > pars = m_pool.getMatchedParameters("*par*");
+    EXPECT_EQ( size_t(3), pars.size() );
+    pars = m_pool.getMatchedParameters("a_par*");
+    EXPECT_EQ( size_t(2), pars.size() );
+
+    ASSERT_THROW( m_pool.setParameterValue("NonExistingName", 3.2), Exceptions::LogicErrorException );
+    m_pool.setParameterValue("b_par3", 3.2);
+    EXPECT_EQ( double(3.2), m_pool.getParameter("b_par3").getValue());
+
+    EXPECT_EQ( int(3), m_pool.setMatchedParametersValue("*par*",5.0));
+    EXPECT_EQ( double(5.0), m_real_par1);
+    EXPECT_EQ( double(5.0), m_real_par2);
+    EXPECT_EQ( double(5.0), m_real_par3);
+}
+
+
+TEST_F(ParameterPoolTest, PoolClone)
+{
+    ParameterPool *clone = m_pool.clone();
+    EXPECT_EQ( size_t(3), clone->size() );
+    EXPECT_EQ( double(1.0), clone->getParameter("a_par1").getValue());
+    EXPECT_EQ( double(2.0), clone->getParameter("a_par2").getValue());
+    EXPECT_EQ( double(3.0), clone->getParameter("b_par3").getValue());
+    delete clone;
+}
+
+
+TEST_F(ParameterPoolTest, CopyToExternalPool)
+{
+    m_real_par1 = 1.0;
+    m_real_par2 = 2.0;
+    m_real_par3 = 3.0;
+    m_real_par4 = 4.0;
+    ParameterPool external_pool;
+    external_pool.registerParameter("par4",&m_real_par4);
+    m_pool.copyToExternalPool("Another/",&external_pool);
+//    std::cout << external_pool << std::endl;
+    EXPECT_EQ( double(1.0), external_pool.getParameter("Another/a_par1").getValue());
+    EXPECT_EQ( double(2.0), external_pool.getParameter("Another/a_par2").getValue());
+    EXPECT_EQ( double(3.0), external_pool.getParameter("Another/b_par3").getValue());
+    EXPECT_EQ( double(4.0), external_pool.getParameter("par4").getValue());
+}
+
+
+TEST_F(ParameterPoolTest, SetMatchedParametersValue)
+{
+    double x(1.0), y(2.0), z(3.0);
+    ParameterPool pool;
+    pool.registerParameter("xx_x", &x);
+    pool.registerParameter("xx_y", &y);
+    pool.registerParameter("xx_z", &z);
+    EXPECT_THROW( pool.setMatchedParametersValue("zz*", 4.0), Exceptions::LogicErrorException );
+    pool.setMatchedParametersValue("xx*", 4.0);
+    EXPECT_EQ( double(4.0), pool.getParameter("xx_x").getValue());
+    EXPECT_EQ( double(4.0), pool.getParameter("xx_y").getValue());
+    EXPECT_EQ( double(4.0), pool.getParameter("xx_z").getValue());
+}
+
+TEST_F(ParameterPoolTest, LimitsOnParameterValue)
+{
+    double x(0.0);
+    ParameterPool pool;
+
+    EXPECT_THROW(pool.registerParameter("xx_x", &x, Limits::limited(1.0, 2.0)), Exceptions::OutOfBoundsException);
+
+    pool.registerParameter("xx_x", &x, Limits::limited(-1.0, 1.0));
+
+    EXPECT_TRUE(pool.setParameterValue("xx_x", 0.5));
+    EXPECT_EQ(0.5, x);
+
+    EXPECT_THROW(pool.setParameterValue("xx_x", 2.0), Exceptions::LogicErrorException);
+    EXPECT_EQ(0.5, x);
+
+    EXPECT_THROW(pool.setMatchedParametersValue("xx*", 2.0), Exceptions::LogicErrorException);
+    EXPECT_EQ(0.5, x);
+}
+
+*/
+#endif // PARAMETERPOOLTEST_H
diff --git a/Tests/UnitTests/Core/5/RealParameterWrapperTest.h b/Tests/UnitTests/Core/5/RealParameterWrapperTest.h
new file mode 100644
index 0000000..0982eeb
--- /dev/null
+++ b/Tests/UnitTests/Core/5/RealParameterWrapperTest.h
@@ -0,0 +1,102 @@
+#ifndef REALPARAMETERWRAPPERTEST_H
+#define REALPARAMETERWRAPPERTEST_H
+
+#include "IParameterized.h"
+#include "RealParameter.h"
+#include <stdexcept>
+
+class RealParameterTest : public ::testing::Test
+{
+ protected:
+    RealParameterTest() {}
+    virtual ~RealParameterTest() {}
+};
+
+TEST_F(RealParameterTest, ParameterAccess)
+{
+    class ParametrizedObject : public IParameterized
+    {
+    public:
+        ParametrizedObject()
+            : m_par1(17), m_changed(false)
+        {
+            registerParameter("par1", &m_par1);
+        }
+        virtual void onChange() final { m_changed = true; }
+        double m_par1;
+        bool m_changed;
+    };
+    ParametrizedObject obj1;
+
+    EXPECT_EQ( obj1.m_par1, 17. );
+    RealParameter* par11 = obj1.getParameter("par1");
+    EXPECT_EQ( obj1.m_par1, par11->getValue() );
+
+    RealParameter* par12 = par11;
+    EXPECT_EQ( obj1.m_par1, par12->getValue() );
+
+    RealParameter* par13 = obj1.getParameterPool()->getParameter("par1");
+    EXPECT_EQ( obj1.m_par1, par13->getValue() );
+
+    obj1.m_par1 = 2;
+    EXPECT_EQ( par11->getValue(), 2. );
+    EXPECT_EQ( par12->getValue(), 2. );
+    EXPECT_EQ( par11->getValue(), 2. );
+
+    EXPECT_FALSE( obj1.m_changed );
+    par11->setValue( 3.14 );
+    EXPECT_EQ( par11->getValue(), 3.14 );
+    EXPECT_EQ( par12->getValue(), par11->getValue() );
+    EXPECT_TRUE( obj1.m_changed );
+
+    std::vector<RealParameter*> parameters;
+    parameters.push_back(par11);
+    parameters.push_back(par12);
+    parameters[0]->setValue(3.0);
+    EXPECT_EQ( obj1.m_par1, 3. );
+    EXPECT_EQ( parameters[1]->getValue(), 3. );
+}
+
+/* incompatible with new handling of limits
+
+TEST_F(RealParameterTest, LimitedParameter)
+{
+    class ParametrizedObject : public IParameterized
+    {
+    public:
+        ParametrizedObject(double p, const Limits& lim)
+            : m_par(p), m_changed(false)
+        {
+            registerParameter("par", &m_par, lim);
+        }
+        virtual void onChange() final { m_changed = true; }
+        double m_par;
+        bool m_changed;
+    };
+
+    EXPECT_THROW(ParametrizedObject(7., Limits::limited(10., 20.)), std::runtime_error);
+    EXPECT_THROW(ParametrizedObject(1., Limits::lowerLimited(2.0)), std::runtime_error);
+    EXPECT_THROW(ParametrizedObject(1., Limits::upperLimited(0.0)), std::runtime_error);
+
+    ParametrizedObject obj1(15., Limits::limited(10, 20));
+    EXPECT_EQ(obj1.m_par, 15.);
+
+    RealParameter* par1 = obj1.getParameterPool()->getParameter("par");
+    par1->setValue(16.0);
+    EXPECT_EQ(obj1.m_par, 16.);
+    EXPECT_THROW(par1->setValue(21.0), std::runtime_error);
+    EXPECT_EQ(obj1.m_par, 16.);
+
+    RealParameter* par2(par1);
+    EXPECT_TRUE(par1->getLimits() == par2->getLimits());
+    EXPECT_TRUE(*par1 == *par2);
+
+    EXPECT_THROW(par2->setValue(21.0), std::runtime_error);
+    EXPECT_EQ(par2->getValue(), 16.);
+
+    par1->setValue(11.0);
+    EXPECT_EQ(par1->getValue(), 11.);
+}
+*/
+
+#endif // REALPARAMETERWRAPPERTEST_H
diff --git a/Tests/UnitTests/Core/5/main.cpp b/Tests/UnitTests/Core/5/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/5/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/5/testlist.h b/Tests/UnitTests/Core/5/testlist.h
new file mode 100644
index 0000000..bcbec71
--- /dev/null
+++ b/Tests/UnitTests/Core/5/testlist.h
@@ -0,0 +1,9 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "IParameterizedTest.h"
+#include "ParameterDistributionTest.h"
+#include "DistributionHandlerTest.h"
+#include "DistributionsTest.h"
+#include "FTDistributionsTest.h"
+#include "ParameterPoolTest.h"
+#include "RealParameterWrapperTest.h"
diff --git a/Tests/UnitTests/Core/6/IntensityDataFunctionsTest.h b/Tests/UnitTests/Core/6/IntensityDataFunctionsTest.h
new file mode 100644
index 0000000..7e77e64
--- /dev/null
+++ b/Tests/UnitTests/Core/6/IntensityDataFunctionsTest.h
@@ -0,0 +1,195 @@
+#ifndef INTENSITYDATAFUNCTIONSTEST_H
+#define INTENSITYDATAFUNCTIONSTEST_H
+
+
+
+#include "IntensityDataFunctions.h"
+#include "VariableBinAxis.h"
+
+class IntensityDataFunctionsTest : public ::testing::Test
+{
+ protected:
+    IntensityDataFunctionsTest(){}
+    virtual ~IntensityDataFunctionsTest(){}
+
+};
+
+
+
+TEST_F(IntensityDataFunctionsTest, ClipDataSetFixed)
+{
+    OutputData<double> data;
+    FixedBinAxis axis0("axis0",10, -5.0, 5.0);
+    data.addAxis(axis0);
+    FixedBinAxis axis1("axis1",3, 0.0, 3.0);
+    data.addAxis(axis1);
+
+    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+        data[i] = i;
+    }
+
+    OutputData<double> *clip = IntensityDataFunctions::createClippedDataSet(data, -5.0, 0.0, -1.5, 1.5);
+    std::vector<double> vref = {0.0, 1.0, 3.0, 4.0, 6.0, 7.0, 9.0, 10.0};
+    EXPECT_EQ(clip->getAllocatedSize(), size_t(8));
+    int index(0);
+    for(size_t i=0; i<clip->getAllocatedSize(); ++i) {
+        EXPECT_EQ(vref[index++], (*clip)[i]);
+    }
+    delete clip;
+}
+
+
+TEST_F(IntensityDataFunctionsTest, ClipDataSetVariable)
+{
+    static const double arr[] = {-1.0, -0.5, 0.5, 1.0, 2.0};
+    std::vector<double> values (arr, arr + sizeof(arr) / sizeof(arr[0]) );
+
+    OutputData<double> data;
+    VariableBinAxis axis0("axis0",4, values);
+    data.addAxis(axis0);
+    VariableBinAxis axis1("axis1",4, values);
+    data.addAxis(axis1);
+
+    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+        data[i] = i;
+    }
+
+    OutputData<double> *clip = IntensityDataFunctions::createClippedDataSet(data, -0.5, 0.5, 0.99, 2.0);
+    std::vector<double> vref = {6.0, 7.0, 10.0, 11.0};
+    EXPECT_EQ(clip->getAllocatedSize(), size_t(4));
+    int index(0);
+    for(size_t i=0; i<clip->getAllocatedSize(); ++i) {
+        EXPECT_EQ(vref[index++], (*clip)[i]);
+    }
+    delete clip;
+
+
+}
+
+
+//-------------------------------------------------  2.5
+// 2 ||  2  |  5  |  8  | 11  | 14 | 17 | 20 | 23 |
+//------------------------------------------------
+// 1 ||  1  |  4  |  7  | 10  | 13 | 16 | 19 | 22 |
+//------------------------------------------------
+// 0 ||  0  |  3  |  6  |  9  | 12 | 15 | 18 | 21 |
+//================================================== -0.5
+//   ||  0  |  1  |  2  |  3  |  4 |  5 |  6 |  7 |
+// -4.5                                         3.5
+
+//TEST_F(IntensityDataFunctionsTest, AddRectangularMask)
+//{
+//    OutputData<double > data;
+//    data.addAxis("x", 8, -4.5, 3.5);
+//    data.addAxis("y", 3, -0.5, 2.5);
+//    data.setAllTo(0.0);
+//    IntensityDataFunctions::addRectangularMask(data, -3.0, -0.5, 1.0, 1.49);
+//    IntensityDataFunctions::addRectangularMask(data, 1.5, 0.5, 3.5, 2.5);
+
+//    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+//        data[i] = i;
+//    }
+
+//    int index(0);
+
+//    std::vector<double> xref = {-4.0, -4.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0);
+//    std::vector<double> yref = {0.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0);
+//    std::vector<double> vref = {0, 1, 2, 5, 8, 11, 14, 17, 18, 21);
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        double x = data.getAxisValue(it.getIndex(), "x");
+//        double y = data.getAxisValue(it.getIndex(), "y");
+//        EXPECT_EQ(x, xref[index]);
+//        EXPECT_EQ(y, yref[index]);
+//        EXPECT_EQ(*it, vref[index]);
+//        ++index;
+//    }
+//    data.removeAllMasks();
+//    index=0;
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        EXPECT_EQ( int(index++), int(it.getIndex()) );
+//    }
+//}
+
+
+//TEST_F(IntensityDataFunctionsTest, AddRectangularMask2)
+//{
+//    OutputData<double > data;
+//    data.addAxis("x", 8, -4.5, 3.5);
+//    data.addAxis("y", 3, -0.5, 2.5);
+//    data.setAllTo(0.0);
+//    IntensityDataFunctions::addRectangularMask(data, -3.0, -0.5, 1.0, 1.49, false);
+//    IntensityDataFunctions::addRectangularMask(data, 1.5, 0.5, 3.5, 2.5, false);
+
+//    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+//        data[i] = i;
+//    }
+
+//    int index(0);
+
+//    std::vector<double> xref = {-4.0, -4.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0);
+//    std::vector<double> yref = {0.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0);
+//    std::vector<double> vref = {0, 1, 2, 5, 8, 11, 14, 17, 18, 21);
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        double x = data.getValueOfAxis("x", it.getIndex());
+//        double y = data.getValueOfAxis("y", it.getIndex());
+//        EXPECT_EQ(x, xref[index]);
+//        EXPECT_EQ(y, yref[index]);
+//        EXPECT_EQ(*it, vref[index]);
+//        ++index;
+//    }
+//    data.removeAllMasks();
+//    index=0;
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        EXPECT_EQ( int(index++), int(it.getIndex()) );
+//    }
+//}
+
+
+TEST_F(IntensityDataFunctionsTest, coordinateToFromBinf)
+{
+    FixedBinAxis axis("axis", 8, -5.0, 3.0);
+    EXPECT_EQ(0.5, IntensityDataFunctions::coordinateToBinf(-4.5, axis));
+    EXPECT_EQ(-4.5, IntensityDataFunctions::coordinateFromBinf(0.5, axis));
+
+    EXPECT_EQ(1.0, IntensityDataFunctions::coordinateToBinf(-4.0, axis));
+    EXPECT_EQ(-4.0, IntensityDataFunctions::coordinateFromBinf(1.0, axis));
+
+    EXPECT_EQ(-0.5, IntensityDataFunctions::coordinateToBinf(-5.5, axis));
+    EXPECT_EQ(-5.5, IntensityDataFunctions::coordinateFromBinf(-0.5, axis));
+
+    EXPECT_EQ(8.0, IntensityDataFunctions::coordinateToBinf(3.0, axis));
+    EXPECT_EQ(3.0, IntensityDataFunctions::coordinateFromBinf(8.0, axis));
+
+    EXPECT_EQ(8.5, IntensityDataFunctions::coordinateToBinf(3.5, axis));
+    EXPECT_EQ(3.5, IntensityDataFunctions::coordinateFromBinf(8.5, axis));
+}
+
+
+//! Transformation of coordinates from one OutputData to another using convertion from axes
+//! coordinates to bin-fraction-coordinates and then to another axes coordinates.
+
+TEST_F(IntensityDataFunctionsTest, outputDataCoordinatesToFromBinf)
+{
+    OutputData<double> data1;
+    data1.addAxis("axis0", 8, -5.0, 3.0);
+    data1.addAxis("axis1", 3, 2.0, 5.0);
+
+    OutputData<double> data2;
+    data2.addAxis("axis0", 8, -10.0, 70.0);
+    data2.addAxis("axis1", 3, -10.0, 20.0);
+
+    double x(-4.5), y(2.5);
+    IntensityDataFunctions::coordinateToBinf(x, y, data1);
+    IntensityDataFunctions::coordinateFromBinf(x, y, data2);
+    EXPECT_FLOAT_EQ(x, -5.0);
+    EXPECT_FLOAT_EQ(y, -5.0);
+
+    x = 3.1; y = 5.1;
+    IntensityDataFunctions::coordinateToBinf(x, y, data1);
+    IntensityDataFunctions::coordinateFromBinf(x, y, data2);
+    EXPECT_FLOAT_EQ(x, 71.0);
+    EXPECT_FLOAT_EQ(y, 21.0);
+
+}
+
+#endif // INTENSITYDATAFUNCTIONSTEST_H
diff --git a/Tests/UnitTests/Core/6/LLDataTest.h b/Tests/UnitTests/Core/6/LLDataTest.h
new file mode 100644
index 0000000..ae80906
--- /dev/null
+++ b/Tests/UnitTests/Core/6/LLDataTest.h
@@ -0,0 +1,394 @@
+#ifndef LLDATATEST_H
+#define LLDATATEST_H
+
+#include "LLData.h"
+#include <algorithm>
+#include "IMaterial.h"
+#include "Complex.h"
+
+
+class LLDataTest : public ::testing::Test
+{
+ protected:
+    LLDataTest();
+    virtual ~LLDataTest();
+
+
+    LLData<int> *int_data_0d;
+    LLData<float> *fl_data_1d;
+    LLData<double> *db_data_3d;
+
+    LLData<Eigen::Matrix2d> *matrix_data_2d;
+};
+
+LLDataTest::LLDataTest()
+{
+    int *dim0 = new int[0];
+
+    int *dim1 = new int[1];
+    dim1[0] = 10;
+
+    int *dim3 = new int[3];
+    dim3[0] = 10;
+    dim3[1] = 15;
+    dim3[2] = 20;
+
+    int *dim2 = new int[2];
+    dim2[0] = 20;
+    dim2[1] = 30;
+
+    int_data_0d = new LLData<int>(0u, dim0);
+    fl_data_1d  = new LLData<float>(1u, dim1);
+    db_data_3d  = new LLData<double>(3u, dim3);
+
+    matrix_data_2d = new LLData<Eigen::Matrix2d>(2u, dim2);
+
+}
+
+LLDataTest::~LLDataTest()
+{
+}
+
+TEST_F(LLDataTest, TotalSize)
+{
+    EXPECT_EQ(1u, int_data_0d->getTotalSize());
+    EXPECT_EQ(10u, fl_data_1d->getTotalSize());
+    EXPECT_EQ(3000u, db_data_3d->getTotalSize());
+
+    EXPECT_EQ(600u, matrix_data_2d->getTotalSize());
+}
+
+TEST_F(LLDataTest, GetRank)
+{
+    EXPECT_EQ(0u, int_data_0d->getRank());
+    EXPECT_EQ(1u, fl_data_1d->getRank());
+    EXPECT_EQ(3u, db_data_3d->getRank());
+    EXPECT_EQ(2u, matrix_data_2d->getRank());
+}
+
+
+
+TEST_F(LLDataTest, SetAll)
+{
+    db_data_3d->setAll(1.0);
+    EXPECT_DOUBLE_EQ( (*db_data_3d)[0], 1.0);
+
+    matrix_data_2d->setAll(Eigen::Matrix2d::Identity());
+    EXPECT_EQ((*matrix_data_2d)[0], Eigen::Matrix2d::Identity());
+}
+
+TEST_F(LLDataTest, ScaleAll)
+{
+    db_data_3d->setAll(2.0);
+    db_data_3d->scaleAll(2.5);
+    EXPECT_DOUBLE_EQ( (*db_data_3d)[0], 5.0);
+
+    matrix_data_2d->setAll(Eigen::Matrix2d::Identity());
+    matrix_data_2d->scaleAll(3 * Eigen::Matrix2d::Identity());
+    EXPECT_EQ((*matrix_data_2d)[0], 3 * Eigen::Matrix2d::Identity()*Eigen::Matrix2d::Identity());
+}
+
+TEST_F(LLDataTest, TotalSum)
+{
+    fl_data_1d->setAll(2.0);
+    EXPECT_FLOAT_EQ( fl_data_1d->getTotalSum(), 20.0);
+
+    db_data_3d->setAll(0.5);
+    EXPECT_DOUBLE_EQ( db_data_3d->getTotalSum(), 1500.0);
+
+    matrix_data_2d->setAll(Eigen::Matrix2d::Identity());
+    EXPECT_EQ(600 * Eigen::Matrix2d::Identity(), matrix_data_2d->getTotalSum());
+}
+
+TEST_F(LLDataTest, GetDimensions) {
+    EXPECT_EQ( int_data_0d->getDimensions(), (int*)0);
+    EXPECT_EQ( fl_data_1d->getDimensions()[0], 10);
+    EXPECT_EQ( db_data_3d->getDimensions()[1], 15);
+    EXPECT_EQ( matrix_data_2d->getDimensions()[1], 30);
+}
+
+TEST_F(LLDataTest, DataCopyingConstructor) {
+    LLData<int> *other_int_data_0d = new LLData<int>(*int_data_0d);
+    EXPECT_TRUE(HaveSameDimensions(*int_data_0d, *other_int_data_0d));
+
+    fl_data_1d->setAll(1.2);
+    LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+    EXPECT_TRUE(HaveSameDimensions(*fl_data_1d, *other_fl_data_1d));
+    EXPECT_FLOAT_EQ( (*other_fl_data_1d)[0], 1.2f);
+    EXPECT_FLOAT_EQ(fl_data_1d->getTotalSum(), other_fl_data_1d->getTotalSum());
+
+    db_data_3d->setAll(1.17);
+    LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+    EXPECT_TRUE(HaveSameDimensions(*db_data_3d, *other_db_data_3d));
+    EXPECT_DOUBLE_EQ( (*other_db_data_3d)[10], 1.17);
+    EXPECT_DOUBLE_EQ(db_data_3d->getTotalSum(), other_db_data_3d->getTotalSum());
+
+
+    matrix_data_2d->setAll(Eigen::Matrix2d::Identity());
+    LLData<Eigen::Matrix2d> *other_matrix_data_2d  = new LLData<Eigen::Matrix2d>(*matrix_data_2d);
+    EXPECT_TRUE(HaveSameDimensions(*matrix_data_2d, *other_matrix_data_2d));
+    EXPECT_EQ( (*other_matrix_data_2d)[7], Eigen::Matrix2d::Identity());
+    //EXPECT_EQ(matrix_data_2d->getTotalSum(), other_matrix_data_2d->getTotalSum());
+
+    delete other_int_data_0d;
+    delete other_fl_data_1d;
+    delete other_db_data_3d;
+    delete other_matrix_data_2d;
+}
+
+TEST_F(LLDataTest, DataAssignment) {
+
+    LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+    fl_data_1d->setAll(1.1f);
+    (*other_fl_data_1d) =  (*fl_data_1d);
+    EXPECT_FLOAT_EQ( (*other_fl_data_1d)[0], 1.1f);
+    EXPECT_FLOAT_EQ(fl_data_1d->getTotalSum(), other_fl_data_1d->getTotalSum());
+
+    LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+    db_data_3d->setAll(1.27);
+    (*other_db_data_3d) =  (*db_data_3d);
+    EXPECT_DOUBLE_EQ( (*other_db_data_3d)[11], 1.27);
+    EXPECT_DOUBLE_EQ(db_data_3d->getTotalSum(), other_db_data_3d->getTotalSum());
+
+
+    matrix_data_2d->setAll(Eigen::Matrix2d::Identity());
+    LLData<Eigen::Matrix2d> *other_matrix_data_2d  = new LLData<Eigen::Matrix2d>(*matrix_data_2d);
+    other_matrix_data_2d->setAll(10 * Eigen::Matrix2d::Identity());
+    (* other_matrix_data_2d) = (* matrix_data_2d);
+    EXPECT_TRUE( (*other_matrix_data_2d)[7].isIdentity());
+
+    delete other_fl_data_1d;
+    delete other_db_data_3d;
+    delete other_matrix_data_2d;
+}
+
+TEST_F(LLDataTest, Addition) {
+
+    LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+    fl_data_1d->setAll(1.1f);
+    other_fl_data_1d->setAll(2.9f);
+    (*other_fl_data_1d) +=  (*fl_data_1d);
+    EXPECT_FLOAT_EQ( (*other_fl_data_1d)[0], 4.0f);
+    EXPECT_FLOAT_EQ(other_fl_data_1d->getTotalSum(), 40.0f);
+
+    LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+    db_data_3d->setAll(1.27);
+    other_db_data_3d->setAll(0.73);
+    (*other_db_data_3d) +=  (*db_data_3d);
+    EXPECT_DOUBLE_EQ( (*other_db_data_3d)[11], 2.0);
+    EXPECT_DOUBLE_EQ(other_db_data_3d->getTotalSum(), 6000.0);
+
+    int *odim1 = new int[1];
+    odim1[0] = 12;
+    LLData<float>  *fl_data_1d2  = new LLData<float>(1u, odim1);
+    fl_data_1d2->setAll(10.0);
+
+    EXPECT_THROW((*fl_data_1d) += (*fl_data_1d2), Exceptions::RuntimeErrorException);
+
+
+    LLData<Eigen::Matrix2d> *other_matrix_data_2d  = new LLData<Eigen::Matrix2d>(*matrix_data_2d);
+    matrix_data_2d->setAll( Eigen::Matrix2d::Identity());
+    other_matrix_data_2d->setAll( 5 * Eigen::Matrix2d::Identity());
+    (*other_matrix_data_2d) += (*matrix_data_2d);
+    EXPECT_EQ( (*other_matrix_data_2d)[5], 6 * Eigen::Matrix2d::Identity());
+
+
+    delete fl_data_1d2;
+    delete [] odim1;
+
+    delete other_fl_data_1d;
+    delete other_db_data_3d;
+
+    delete other_matrix_data_2d;
+}
+
+TEST_F(LLDataTest, Substraction) {
+
+    LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+    fl_data_1d->setAll(1.15f);
+    other_fl_data_1d->setAll(5.15f);
+    (*other_fl_data_1d) -=  (*fl_data_1d);
+    EXPECT_FLOAT_EQ( (*other_fl_data_1d)[0], 4.0f);
+    EXPECT_FLOAT_EQ(other_fl_data_1d->getTotalSum(), 40.0f);
+
+    LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+    db_data_3d->setAll(1.27);
+    other_db_data_3d->setAll(1.77);
+    (*other_db_data_3d) -=  (*db_data_3d);
+    EXPECT_DOUBLE_EQ( (*other_db_data_3d)[11], 0.5);
+    EXPECT_DOUBLE_EQ(other_db_data_3d->getTotalSum(), 1500.0);
+
+    int *odim1 = new int[1];
+    odim1[0] = 12;
+    LLData<float>  *fl_data_1d2  = new LLData<float>(1u, odim1);
+    fl_data_1d2->setAll(10.0);
+
+    EXPECT_THROW((*fl_data_1d) -= (*fl_data_1d2), Exceptions::RuntimeErrorException);
+
+    LLData<Eigen::Matrix2d> *other_matrix_data_2d  = new LLData<Eigen::Matrix2d>(*matrix_data_2d);
+    matrix_data_2d->setAll( Eigen::Matrix2d::Identity());
+    other_matrix_data_2d->setAll( 5 * Eigen::Matrix2d::Identity());
+    (*other_matrix_data_2d) -= (*matrix_data_2d);
+    EXPECT_EQ( (*other_matrix_data_2d)[5], 4 * Eigen::Matrix2d::Identity());
+
+    delete fl_data_1d2;
+    delete [] odim1;
+
+    delete other_fl_data_1d;
+    delete other_db_data_3d;
+    delete other_matrix_data_2d;
+}
+
+TEST_F(LLDataTest, Multiplication) {
+
+    LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+    fl_data_1d->setAll(1.15f);
+    other_fl_data_1d->setAll(2.0f);
+    (*other_fl_data_1d) *=  (*fl_data_1d);
+    EXPECT_FLOAT_EQ( (*other_fl_data_1d)[0], 2.30f);
+    EXPECT_FLOAT_EQ(other_fl_data_1d->getTotalSum(), 23.0f);
+
+    LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+    db_data_3d->setAll(1.25);
+    other_db_data_3d->setAll(2.0);
+    (*other_db_data_3d) *=  (*db_data_3d);
+    EXPECT_DOUBLE_EQ( (*other_db_data_3d)[11], 2.5);
+    EXPECT_DOUBLE_EQ(other_db_data_3d->getTotalSum(), 7500.0);
+
+    int *odim1 = new int[1];
+    odim1[0] = 12;
+    LLData<float>  *fl_data_1d2  = new LLData<float>(1u, odim1);
+    fl_data_1d2->setAll(10.0);
+
+    EXPECT_THROW((*fl_data_1d) *= (*fl_data_1d2), Exceptions::RuntimeErrorException);
+
+    LLData<Eigen::Matrix2d> *other_matrix_data_2d  = new LLData<Eigen::Matrix2d>(*matrix_data_2d);
+    matrix_data_2d->setAll( 2*Eigen::Matrix2d::Identity());
+    other_matrix_data_2d->setAll( 5 * Eigen::Matrix2d::Identity());
+    (*other_matrix_data_2d) *= (*matrix_data_2d);
+    EXPECT_EQ( (*other_matrix_data_2d)[5], 10 * Eigen::Matrix2d::Identity());
+
+    delete fl_data_1d2;
+    delete [] odim1;
+
+    delete other_fl_data_1d;
+    delete other_db_data_3d;
+    delete other_matrix_data_2d;
+}
+
+TEST_F(LLDataTest, Division) {
+
+    LLData<float> *other_fl_data_1d  = new LLData<float>(*fl_data_1d);
+    fl_data_1d->setAll(1.15f);
+    other_fl_data_1d->setAll(2.3f);
+    (*other_fl_data_1d) /=  (*fl_data_1d);
+    EXPECT_FLOAT_EQ( (*other_fl_data_1d)[0], 2.0f);
+    EXPECT_FLOAT_EQ(other_fl_data_1d->getTotalSum(), 20.0f);
+
+    LLData<double> *other_db_data_3d  = new LLData<double>(*db_data_3d);
+    db_data_3d->setAll(1.25);
+    other_db_data_3d->setAll(2.5);
+    (*other_db_data_3d) /=  (*db_data_3d);
+    EXPECT_DOUBLE_EQ( (*other_db_data_3d)[11], 2.0);
+    EXPECT_DOUBLE_EQ(other_db_data_3d->getTotalSum(), 6000.0);
+
+    int *odim1 = new int[1];
+    odim1[0] = 12;
+    LLData<float>  *fl_data_1d2  = new LLData<float>(1u, odim1);
+    fl_data_1d2->setAll(10.0);
+
+    EXPECT_THROW((*fl_data_1d) /= (*fl_data_1d2), Exceptions::RuntimeErrorException);
+
+
+    delete fl_data_1d2;
+    delete [] odim1;
+    delete other_fl_data_1d;
+    delete other_db_data_3d;
+}
+
+TEST_F (LLDataTest, HaveSameDimensions) {
+    int *odim0 = new int[0];
+
+    int *odim1 = new int[1];
+    odim1[0] = 10;
+
+    int *odim3 = new int[3];
+    odim3[0] = 10;
+    odim3[1] = 15;
+    odim3[2] = 20;
+
+    int *odim2 = new int[2];
+    odim2[0] = 20;
+    odim2[1] = 30;
+
+
+    LLData<int>    *other_int_data_0d = new LLData<int>(0u, odim0);
+    LLData<float>  *other_fl_data_1d  = new LLData<float>(1u, odim1);
+    LLData<double> *other_db_data_3d  = new LLData<double>(3u, odim3);
+    LLData<Eigen::Matrix2d> *other_matrix_data_2d = new LLData<Eigen::Matrix2d>(2u, odim2);
+
+    EXPECT_TRUE(HaveSameDimensions(*int_data_0d, *other_int_data_0d));
+    EXPECT_TRUE(HaveSameDimensions(*fl_data_1d, *other_fl_data_1d));
+    EXPECT_TRUE(HaveSameDimensions(*db_data_3d, *other_db_data_3d));
+    EXPECT_TRUE(HaveSameDimensions(*other_matrix_data_2d, *matrix_data_2d));
+
+    odim3[1] = 25;
+    LLData<double> *some_other_db_data_3d  = new LLData<double>(3u, odim3);
+    EXPECT_FALSE(HaveSameDimensions(*db_data_3d, *some_other_db_data_3d));
+
+    delete other_int_data_0d;
+    delete other_fl_data_1d;
+    delete other_db_data_3d;
+    delete some_other_db_data_3d;
+    delete other_matrix_data_2d;
+    delete [] odim0;
+    delete [] odim1;
+    delete [] odim3;
+    delete [] odim2;
+}
+
+TEST_F(LLDataTest, Accessors) {
+    for (size_t i=0; i < fl_data_1d->getTotalSize(); ++i) {
+        (*fl_data_1d)[i] = 0.5f*i;
+    }
+    EXPECT_FLOAT_EQ((*fl_data_1d)[2], 1.0f);
+
+    int *coordinate = new int[1];
+    coordinate[0] = 2;
+    EXPECT_FLOAT_EQ(fl_data_1d->atCoordinate(coordinate), 1.0f);
+    EXPECT_FLOAT_EQ(fl_data_1d->getTotalSum(), 22.5f);
+
+    for (size_t i=0; i < db_data_3d->getTotalSize(); ++i) {
+        (*db_data_3d)[i] = 0.2*i;
+    }
+
+    EXPECT_DOUBLE_EQ((*db_data_3d)[2], 0.4);
+    int *coordinate3d = new int[3];
+    coordinate3d[0] = 0;
+    coordinate3d[1] = 0;
+    coordinate3d[2] = 2;
+
+    EXPECT_DOUBLE_EQ(db_data_3d->atCoordinate(coordinate3d), 0.4);
+    EXPECT_DOUBLE_EQ(db_data_3d->getTotalSum(), 899700.0);
+
+
+
+    for (size_t i=0; i < matrix_data_2d->getTotalSize(); ++i) {
+        (*matrix_data_2d)[i] = i *  Eigen::Matrix2d::Identity();
+    }
+
+    EXPECT_EQ((*matrix_data_2d)[2], 2 * Eigen::Matrix2d::Identity());
+    int *coordinate2d = new int[2];
+    coordinate2d[0] = 0;
+    coordinate2d[1] = 2;
+
+    EXPECT_EQ(matrix_data_2d->atCoordinate(coordinate2d), 2 * Eigen::Matrix2d::Identity());
+
+    delete [] coordinate;
+    delete [] coordinate3d;
+    delete [] coordinate2d;
+
+}
+
+
+#endif // LLDATATEST_H
diff --git a/Tests/UnitTests/Core/6/OutputDataIteratorTest.h b/Tests/UnitTests/Core/6/OutputDataIteratorTest.h
new file mode 100644
index 0000000..bdec777
--- /dev/null
+++ b/Tests/UnitTests/Core/6/OutputDataIteratorTest.h
@@ -0,0 +1,64 @@
+#ifndef OUTPUTDATAITERATORTEST_H
+#define OUTPUTDATAITERATORTEST_H
+
+#include "OutputDataIterator.h"
+
+class OutputDataIteratorTest : public ::testing::Test
+{
+ protected:
+    OutputDataIteratorTest();
+    virtual ~OutputDataIteratorTest();
+
+    OutputData<double> *p_data;
+};
+
+OutputDataIteratorTest::OutputDataIteratorTest()
+{
+    p_data = new OutputData<double>();
+    int *dims = new int[2];
+    dims[0] = 3;
+    dims[1] = 5;
+    p_data->setAxisSizes(2, dims);
+    double value = 0.0;
+    OutputData<double>::iterator it = p_data->begin();
+    while (it != p_data->end()) {
+        *it = value;
+        value += 1.0;
+        ++it;
+    }
+}
+
+OutputDataIteratorTest::~OutputDataIteratorTest()
+{
+    delete p_data;
+}
+
+TEST_F(OutputDataIteratorTest, Iterate)
+{
+    OutputData<double>::iterator it = p_data->begin();
+    EXPECT_EQ(0.0, *it);
+    for (size_t i=0; i<14; ++i) {
+        ++it;
+    }
+    EXPECT_DOUBLE_EQ(14.0, *it);
+    ++it;
+    EXPECT_EQ(it, p_data->end());
+    ++it;
+    EXPECT_EQ(it, p_data->end());
+}
+
+TEST_F(OutputDataIteratorTest, ConstIterate)
+{
+    OutputData<double>::const_iterator it = p_data->begin();
+    EXPECT_EQ(0.0, *it);
+    for (size_t i=0; i<14; ++i) {
+        ++it;
+    }
+    EXPECT_DOUBLE_EQ(14.0, *it);
+    ++it;
+    EXPECT_EQ(it, p_data->end());
+    ++it;
+    EXPECT_EQ(it, p_data->end());
+}
+
+#endif // OUTPUTDATAITERATORTEST_H
diff --git a/Tests/UnitTests/Core/6/OutputDataTest.h b/Tests/UnitTests/Core/6/OutputDataTest.h
new file mode 100644
index 0000000..fe6bb7a
--- /dev/null
+++ b/Tests/UnitTests/Core/6/OutputDataTest.h
@@ -0,0 +1,471 @@
+#ifndef OUTPUTDATATEST_H
+#define OUTPUTDATATEST_H
+
+#include "OutputData.h"
+#include <algorithm>
+#include "IntensityDataFunctions.h"
+#include "VariableBinAxis.h"
+#include "FixedBinAxis.h"
+#include "ThreadInfo.h"
+
+class OutputDataTest : public ::testing::Test
+{
+ protected:
+    OutputDataTest();
+
+    OutputData<int> int_data_0d;
+    OutputData<float> fl_data_1d;
+    OutputData<double> db_data_3d;
+    std::vector<size_t> zero_3d_coordinate;
+
+    OutputData<Eigen::Matrix2d> matrix_data_2d;
+};
+
+OutputDataTest::OutputDataTest()
+{
+    zero_3d_coordinate.push_back(0);
+    zero_3d_coordinate.push_back(0);
+    zero_3d_coordinate.push_back(0);
+    FixedBinAxis angle_axis("angle", 20, 0.0, 0.1);
+    FixedBinAxis length_axis("length", 10, 0.0, 0.5);
+    FixedBinAxis index_axis("index", 10, 1, 10);
+    fl_data_1d.addAxis(angle_axis);
+
+    db_data_3d.addAxis(angle_axis);
+    db_data_3d.addAxis(length_axis);
+    db_data_3d.addAxis(index_axis);
+    OutputData<double>::iterator it = db_data_3d.begin();
+    for (size_t i=0; i<2000; ++i)
+    {
+        *it = (double)i;
+        ++it;
+    }
+
+    matrix_data_2d.addAxis(angle_axis);
+    matrix_data_2d.addAxis(length_axis);
+    matrix_data_2d.setAllTo(Eigen::Matrix2d::Identity());
+}
+
+
+TEST_F(OutputDataTest, SingleElementAfterConstruction)
+{
+    EXPECT_EQ(1u, int_data_0d.getAllocatedSize());
+}
+
+
+TEST_F(OutputDataTest, SizeAfterAddingAxes)
+{
+    EXPECT_EQ(1u, int_data_0d.getAllocatedSize());
+    EXPECT_EQ(20u, fl_data_1d.getAllocatedSize());
+    EXPECT_EQ(2000u, db_data_3d.getAllocatedSize());
+
+    EXPECT_EQ(200u, matrix_data_2d.getAllocatedSize());
+}
+
+
+TEST_F(OutputDataTest, DataInitialization)
+{
+    std::vector<int> coordinates;
+    coordinates.push_back(11);
+    coordinates.push_back(4);
+    coordinates.push_back(3);
+    EXPECT_DOUBLE_EQ((double)1143, db_data_3d[db_data_3d.toGlobalIndex(coordinates)]);
+
+    std::vector<int> coordinates2;
+    coordinates2.push_back(10);
+    coordinates2.push_back(5);
+    EXPECT_EQ(Eigen::Matrix2d::Identity(),
+              matrix_data_2d[matrix_data_2d.toGlobalIndex(coordinates2)]);
+}
+
+TEST_F(OutputDataTest, isInitialized)
+{
+    OutputData<double> data1;
+    EXPECT_FALSE(data1.isInitialized());
+    data1.addAxis("axis", 10, 0.0, 10.0);
+    EXPECT_TRUE(data1.isInitialized());
+    data1.clear();
+    EXPECT_FALSE(data1.isInitialized());
+}
+
+TEST_F(OutputDataTest, DataCopying)
+{
+    OutputData<double> data1;
+    OutputData<double> data2;
+    data1.addAxis("axis1", 10, 0., 10.);
+    data2.addAxis("axis1", 10, 0., 10.);
+    EXPECT_TRUE( data1.hasSameDimensions(data2));
+    EXPECT_TRUE( data1.hasSameShape(data2));
+
+    data1.addAxis("axis2", 10, 0., 10.);
+    data2.addAxis("axis2", 10, 1., 10.);
+    EXPECT_TRUE( data1.hasSameDimensions(data2));
+    EXPECT_FALSE( data1.hasSameShape(data2));
+
+    data2.copyFrom(data1);
+    EXPECT_TRUE( data1.hasSameDimensions(data2));
+    EXPECT_TRUE( data1.hasSameShape(data2));
+
+    data1.addAxis("axis3", 10, 0., 10.);
+    data2.addAxis("axis3another", 10, 0., 10.);
+    EXPECT_TRUE( data1.hasSameDimensions(data2));
+    EXPECT_FALSE( data1.hasSameShape(data2));
+
+    data1.setAllTo(10);
+    data2.copyFrom(data1);
+    EXPECT_TRUE( data1.totalSum() == data2.totalSum() );
+    EXPECT_TRUE( data1.hasSameDimensions(data2));
+    EXPECT_TRUE( data1.hasSameShape(data2));
+    EXPECT_TRUE( data2.hasSameDimensions(data1));
+    EXPECT_TRUE( data2.hasSameShape(data1));
+    EXPECT_TRUE( data1.hasSameDimensions(data1));
+    EXPECT_TRUE( data1.hasSameShape(data1));
+    EXPECT_TRUE( data2.hasSameDimensions(data2));
+    EXPECT_TRUE( data2.hasSameShape(data2));
+
+    OutputData<Eigen::Matrix2d> mdata1;
+    OutputData<Eigen::Matrix2d> mdata2;
+    mdata1.addAxis("axis1", 10, 0., 10.);
+    mdata2.addAxis("axis1", 10, 0., 10.);
+    EXPECT_TRUE( mdata1.hasSameDimensions(mdata2));
+    EXPECT_TRUE( mdata1.hasSameShape(mdata2));
+
+    mdata1.addAxis("axis2", 10, 0., 10.);
+    mdata2.addAxis("axis2", 10, 1., 10.);
+    EXPECT_TRUE( mdata1.hasSameDimensions(mdata2));
+    EXPECT_FALSE( mdata1.hasSameShape(mdata2));
+
+    mdata2.copyFrom(mdata1);
+    EXPECT_TRUE( mdata1.hasSameDimensions(mdata2));
+    EXPECT_TRUE( mdata1.hasSameShape(mdata2));
+
+    mdata1.setAllTo(Eigen::Matrix2d::Identity());
+    mdata2.copyFrom(mdata1);
+    EXPECT_TRUE( mdata1.hasSameDimensions(mdata2));
+    EXPECT_TRUE( mdata1.hasSameShape(mdata2));
+    EXPECT_TRUE( mdata2.hasSameDimensions(mdata1));
+    EXPECT_TRUE( mdata2.hasSameShape(mdata1));
+    EXPECT_TRUE( mdata1.hasSameDimensions(mdata1));
+    EXPECT_TRUE( mdata1.hasSameShape(mdata1));
+    EXPECT_TRUE( mdata2.hasSameDimensions(mdata2));
+    EXPECT_TRUE( mdata2.hasSameShape(mdata2));
+}
+
+
+TEST_F(OutputDataTest, MaxElement)
+{
+    OutputData<double > data;
+    data.addAxis("axis1", 10, 0., 10.);
+    data.addAxis("axis2", 2, 0., 10.);
+    data.setAllTo(1.0);
+
+    OutputData<double >::iterator it = data.begin();
+    for (size_t i=0; i<data.getAllocatedSize(); ++i) if(i==10) (*it)=10.0;
+    OutputData<double >::const_iterator cit = std::max_element(data.begin(), data.end());
+    EXPECT_EQ( double(10.0), (*cit));
+}
+
+
+// y |
+// --------------------------------------------
+// 1 | 1   3   5   7   9   11  13  15  17  19 |
+// 0 | 0   2   4   6   8   10  12  14  16  18 |
+// --------------------------------------------
+//   | 0   1   2   3   4   5   6   7   8   9  | x
+TEST_F(OutputDataTest, ValueOfAxis)
+{
+    OutputData<double > data;
+    data.addAxis("axis1", 10, 0., 10.);
+    data.addAxis("axis2", 2, 0., 10.);
+    EXPECT_EQ( 0.5, data.getAxisValue(0, "axis1"));
+    EXPECT_EQ( 0.5, data.getAxisValue(1, "axis1"));
+    EXPECT_EQ( 1.5, data.getAxisValue(2, "axis1"));
+    EXPECT_EQ( 1.5, data.getAxisValue(3, "axis1"));
+    EXPECT_EQ( 9.5, data.getAxisValue(18, "axis1"));
+    EXPECT_EQ( 9.5, data.getAxisValue(19, "axis1"));
+
+    EXPECT_EQ( 2.5, data.getAxisValue(0, "axis2"));
+    EXPECT_EQ( 7.5, data.getAxisValue(1, "axis2"));
+    EXPECT_EQ( 2.5, data.getAxisValue(2, "axis2"));
+    EXPECT_EQ( 7.5, data.getAxisValue(3, "axis2"));
+    EXPECT_EQ( 2.5, data.getAxisValue(18, "axis2"));
+    EXPECT_EQ( 7.5, data.getAxisValue(19, "axis2"));
+
+    std::vector<double > coordinates = data.getAxesValues(18);
+    EXPECT_EQ(9.5, coordinates[0]);
+    EXPECT_EQ(2.5, coordinates[1]);
+
+    OutputData<Eigen::Matrix2d > mdata;
+    mdata.addAxis("axis1", 10, 0., 10.);
+    mdata.addAxis("axis2", 2, 0., 10.);
+    EXPECT_EQ( 0.5, mdata.getAxisValue(0, "axis1"));
+    EXPECT_EQ( 0.5, mdata.getAxisValue(1, "axis1"));
+    EXPECT_EQ( 1.5, mdata.getAxisValue(2, "axis1"));
+    EXPECT_EQ( 1.5, mdata.getAxisValue(3, "axis1"));
+    EXPECT_EQ( 9.5, mdata.getAxisValue(18, "axis1"));
+    EXPECT_EQ( 9.5, mdata.getAxisValue(19, "axis1"));
+
+    EXPECT_EQ( 2.5, mdata.getAxisValue(0, "axis2"));
+    EXPECT_EQ( 7.5, mdata.getAxisValue(1, "axis2"));
+    EXPECT_EQ( 2.5, mdata.getAxisValue(2, "axis2"));
+    EXPECT_EQ( 7.5, mdata.getAxisValue(3, "axis2"));
+    EXPECT_EQ( 2.5, mdata.getAxisValue(18, "axis2"));
+    EXPECT_EQ( 7.5, mdata.getAxisValue(19, "axis2"));
+}
+
+// y |
+// --------------------------------------------
+// 1 | 1   3   5   7   9   11  13  15  17  19 |
+// 0 | 0   2   4   6   8   10  12  14  16  18 |
+// --------------------------------------------
+//   | 0   1   2   3   4   5   6   7   8   9  | x
+TEST_F(OutputDataTest, GetAxisBin)
+{
+    OutputData<double > data;
+    data.addAxis("axis1", 10, 0., 10.);
+    data.addAxis("axis2", 2, 0., 10.);
+
+    EXPECT_EQ(0.5, data.getAxisBin(0, "axis1").getMidPoint());
+    EXPECT_EQ(0.5, data.getAxisBin(1, "axis1").getMidPoint());
+    EXPECT_EQ(9.5, data.getAxisBin(18, "axis1").getMidPoint());
+    EXPECT_EQ(9.5, data.getAxisBin(19, "axis1").getMidPoint());
+    EXPECT_EQ(2.5, data.getAxisBin(0, "axis2").getMidPoint());
+    EXPECT_EQ(7.5, data.getAxisBin(1, "axis2").getMidPoint());
+    EXPECT_EQ(2.5, data.getAxisBin(18, "axis2").getMidPoint());
+    EXPECT_EQ(7.5, data.getAxisBin(19, "axis2").getMidPoint());
+}
+
+
+
+// y |
+// --------------------------------------------
+// 5 | 5   11  17  23  29  35  41  47  53  59 |
+// 4 | 4   10  16  22  28  34  40  46  52  58 |
+// 3 | 3   9   15  21  27  33  39  45  51  57 |
+// 2 | 2   8   14  20  26  32  38  44  50  56 |
+// 1 | 1   7   13  19  25  31  37  43  49  55 |
+// 0 | 0   6   12  18  24  30  36  42  48  54 |
+// --------------------------------------------
+//   | 0   1   2   3   4   5   6   7   8   9  | x
+
+//TEST_F(OutputDataTest, SetInverseRectangularMask)
+//{
+//    OutputData<double > data;
+//    data.addAxis("x", 10, 0., 10.);
+//    data.addAxis("y", 6, 0., 6.);
+//    data.setAllTo(0.0);
+//    IntensityDataFunctions::setRectangularMask(data, 1.0, 1.0, 4.99, 2.99, true);
+
+//    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+//        data[i] = i;
+//    }
+
+//    int index(0);
+
+//    std::vector<double> xref = {1.5, 1.5, 2.5, 2.5, 3.5, 3.5, 4.5, 4.5);
+//    std::vector<double> yref = {1.5, 2.5, 1.5, 2.5, 1.5, 2.5, 1.5, 2.5);
+//    std::vector<double> vref = {7, 8, 13, 14, 19, 20, 25, 26);
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        double x = data.getAxisValue(it.getIndex(), "x");
+//        double y = data.getAxisValue(it.getIndex(), "y");
+//        EXPECT_EQ(x, xref[index]);
+//        EXPECT_EQ(y, yref[index]);
+//        EXPECT_EQ(*it, vref[index]);
+//        ++index;
+//    }
+//    data.removeAllMasks();
+//    index=0;
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        EXPECT_EQ( int(index++), int(it.getIndex()) );
+//    }
+//}
+
+
+//-------------------------------------------------  2.5
+// 2 ||  2  |  5  |  8  | 11  | 14 | 17 | 20 | 23 |
+//------------------------------------------------
+// 1 ||  1  |  4  |  7  | 10  | 13 | 16 | 19 | 22 |
+//------------------------------------------------
+// 0 ||  0  |  3  |  6  |  9  | 12 | 15 | 18 | 21 |
+//================================================== -0.5
+//   ||  0  |  1  |  2  |  3  |  4 |  5 |  6 |  7 |
+// -4.5                                         3.5
+
+//TEST_F(OutputDataTest, SetRectangularMask)
+//{
+//    OutputData<double > data;
+//    data.addAxis("x", 8, -4.5, 3.5);
+//    data.addAxis("y", 3, -0.5, 2.5);
+//    data.setAllTo(0.0);
+//    IntensityDataFunctions::setRectangularMask(data, -3.0, -0.5, 1.0, 1.49);
+
+//    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+//        data[i] = i;
+//    }
+
+//    int index(0);
+
+//    std::vector<double> xref = {-4.0, -4.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0);
+//    std::vector<double> yref = {0.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0);
+//    std::vector<double> vref = {0, 1, 2, 5, 8, 11, 14, 17, 18, 19, 20, 21, 22, 23);
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        double x = data.getAxisValue(it.getIndex(), "x");
+//        double y = data.getAxisValue(it.getIndex(), "y");
+//        EXPECT_EQ(x, xref[index]);
+//        EXPECT_EQ(y, yref[index]);
+//        EXPECT_EQ(*it, vref[index]);
+//        ++index;
+//    }
+//    data.removeAllMasks();
+//    index=0;
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        EXPECT_EQ( int(index++), int(it.getIndex()) );
+//    }
+//}
+
+
+//-------------------------------------------------  2.5
+// 2 ||  2  |  5  |  8  | 11  | 14 | 17 | 20 | 23 |
+//------------------------------------------------
+// 1 ||  1  |  4  |  7  | 10  | 13 | 16 | 19 | 22 |
+//------------------------------------------------
+// 0 ||  0  |  3  |  6  |  9  | 12 | 15 | 18 | 21 |
+//================================================== -0.5
+//   ||  0  |  1  |  2  |  3  |  4 |  5 |  6 |  7 |
+// -4.5                                         3.5
+
+//TEST_F(OutputDataTest, SetEllipticMask)
+//{
+//    OutputData<double > data;
+//    data.addAxis("x", 8, -4.5, 3.5);
+//    data.addAxis("y", 3, -0.5, 2.5);
+//    data.setAllTo(0.0);
+//    IntensityDataFunctions::setEllipticMask(data, 0.0, 1.0, 2.0, 1.0);
+
+//    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+//        data[i] = i;
+//    }
+
+//    int index(0);
+
+//    std::vector<double> vref = {0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 15, 17, 18, 20, 21, 22, 23);
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        EXPECT_EQ(*it, vref[index]);
+//        ++index;
+//    }
+//    data.removeAllMasks();
+//    index=0;
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        EXPECT_EQ( int(index++), int(it.getIndex()) );
+//    }
+//}
+
+
+//TEST_F(OutputDataTest, RectangularMaskVariableAxis)
+//{
+//    static const double x_arr[] = {-5., -3., -2., 0.0, 0.5, 1.0, 3.0, 5.0, 6.0};
+//    std::vector<double> x_values (x_arr, x_arr + sizeof(x_arr) / sizeof(x_arr[0]) );
+//    VariableBinAxis xaxis("x", 8, x_values);
+
+//    static const double y_arr[] = {0.0, 1.0, 3.0, 5.0, 6.0};
+//    std::vector<double> y_values (y_arr, y_arr + sizeof(y_arr) / sizeof(y_arr[0]) );
+//    VariableBinAxis yaxis("y", 4, y_values);
+
+//    OutputData<double > data;
+//    data.addAxis(xaxis);
+//    data.addAxis(yaxis);
+//    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+//        data[i] = i;
+//    }
+
+//    IntensityDataFunctions::setRectangularMask(data, -2.5, 1.5, 0.99, 4.99, true);
+//    int index(0);
+
+//    std::vector<double> xref = {-2.5, -2.5, -1.0, -1.0, 0.25, 0.25, 0.75, 0.75);
+//    std::vector<double> yref = {2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0);
+//    std::vector<double> vref = {5, 6, 9, 10, 13, 14, 17, 18);
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        double x = data.getAxisValue(it.getIndex(), "x");
+//        double y = data.getAxisValue(it.getIndex(), "y");
+//        double val = *it;
+//        EXPECT_EQ(x, xref[index]);
+//        EXPECT_EQ(y, yref[index]);
+//        EXPECT_EQ(val, vref[index]);
+//        ++index;
+//    }
+//}
+
+
+//! FIXME EllipticMask is not working
+//TEST_F(OutputDataTest, EllipticMaskVariableAxis)
+//{
+//    static const double x_arr[] = {-5., -3., -2., 0.0, 0.5, 1.0, 3.0, 5.0, 6.0};
+//    std::vector<double> x_values (x_arr, x_arr + sizeof(x_arr) / sizeof(x_arr[0]) );
+//    VariableBinAxis xaxis("x", 8, x_values);
+
+//    static const double y_arr[] = {0.0, 1.0, 3.0, 5.0, 6.0};
+//    std::vector<double> y_values (y_arr, y_arr + sizeof(y_arr) / sizeof(y_arr[0]) );
+//    VariableBinAxis yaxis("y", 4, y_values);
+
+//    OutputData<double > data;
+//    data.addAxis(xaxis);
+//    data.addAxis(yaxis);
+//    for(size_t i=0; i<data.getAllocatedSize(); ++i) {
+//        data[i] = i;
+//    }
+
+//    IntensityDataHelper::setEllipticMask(data, 1.0, 1.0, 0.49, 0.49);
+//    int index(0);
+
+////    std::vector<double> xref = {-2.5, -2.5, -1.0, -1.0, 0.25, 0.25, 0.75, 0.75};
+////    std::vector<double> yref = {2.0, 4.0, 2.0, 4.0, 2.0, 4.0, 2.0, 4.0};
+//    std::vector<double> vref = {8, 9, 12, 13);
+//    for(OutputData<double>::iterator it = data.begin(); it!=data.end(); ++it) {
+//        double x = data.getValueOfAxis("x", it.getIndex());
+//        double y = data.getValueOfAxis("y", it.getIndex());
+//        double val = *it;
+////        EXPECT_EQ(x, xref[index]);
+////        EXPECT_EQ(y, yref[index]);
+////        EXPECT_EQ(val, vref[index]);
+//        std::cout << x << " " << y <<  " " << val << std::endl;
+//        ++index;
+//    }
+//}
+
+
+TEST_F(OutputDataTest, SetCleared)
+{
+    db_data_3d.clear();
+    db_data_3d.setAllTo(1.0);
+    EXPECT_EQ( db_data_3d[0], 1.0);
+
+    matrix_data_2d.clear();
+    matrix_data_2d.setAllTo(10*Eigen::Matrix2d::Identity());
+    EXPECT_EQ(10*Eigen::Matrix2d::Identity(), matrix_data_2d[0]);
+}
+
+TEST_F(OutputDataTest, MixedTypeOperations)
+{
+    OutputData<bool> data_bool;
+    data_bool.addAxis("axis1", 10, 0.0, 10.0);
+
+    OutputData<bool> data_double;
+    data_double.addAxis("axis1", 10, 0.0, 10.0);
+
+    EXPECT_TRUE(data_bool.hasSameShape(data_double));
+
+    data_double.addAxis("axis2",10, -1.0, 1.0);
+    EXPECT_FALSE(data_bool.hasSameShape(data_double));
+}
+
+// y |
+// --------------------------------------------
+// 4 | 4   9   14  19  24  29  34  39  44  49 |
+// 3 | 3   8   13  18  23  28  33  38  43  48 |
+// 2 | 2   7   12  17  22  27  32  37  42  47 |
+// 1 | 1   6   11  16  21  26  31  36  41  46 |
+// 0 | 0   5   10  15  20  25  30  35  40  45 |
+// --------------------------------------------
+//   | 0   1   2   3   4   5   6   7   8   9  | x
+
+#endif // OUTPUTDATATEST_H
diff --git a/Tests/UnitTests/Core/6/main.cpp b/Tests/UnitTests/Core/6/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/6/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/6/testlist.h b/Tests/UnitTests/Core/6/testlist.h
new file mode 100644
index 0000000..8a4c2af
--- /dev/null
+++ b/Tests/UnitTests/Core/6/testlist.h
@@ -0,0 +1,6 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "IntensityDataFunctionsTest.h"
+#include "OutputDataTest.h"
+#include "OutputDataIteratorTest.h"
+#include "LLDataTest.h"
diff --git a/Tests/UnitTests/Core/CMakeLists.txt b/Tests/UnitTests/Core/CMakeLists.txt
new file mode 100644
index 0000000..5539281
--- /dev/null
+++ b/Tests/UnitTests/Core/CMakeLists.txt
@@ -0,0 +1,31 @@
+############################################################################
+# CMakeLists.txt file for building and running unit tests
+############################################################################
+
+include(AddGTest)
+
+# qtcreator prefers relative paths for project includes
+include_directories(
+    ../utilities
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${Boost_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR}
+    ${gtest_SOURCE_DIR}
+    ${gtest_SOURCE_DIR}/include
+    )
+if(BORNAGAIN_OPENMPI)
+    include_directories(${MPI_INCLUDE_PATH})
+endif()
+
+set(libs BornAgainCore)
+
+ADD_GTEST(Core "0"        ${libs} 0)
+ADD_GTEST(Core "1"        ${libs} 0)
+ADD_GTEST(Core "2"        ${libs} 0)
+ADD_GTEST(Core "3"        ${libs} 0)
+ADD_GTEST(Core "4"        ${libs} 0)
+ADD_GTEST(Core "5"        ${libs} 0)
+ADD_GTEST(Core "6"        ${libs} 0)
+ADD_GTEST(Core "Numeric0" ${libs} 1)
+ADD_GTEST(Core "Numeric1" ${libs} 1)
diff --git a/Tests/UnitTests/Core/LayerTest.h b/Tests/UnitTests/Core/LayerTest.h
new file mode 100644
index 0000000..df7ecfb
--- /dev/null
+++ b/Tests/UnitTests/Core/LayerTest.h
@@ -0,0 +1,82 @@
+#include "Layer.h"
+#include "HomogeneousMaterial.h"
+#include "Materials.h"
+#include "ParticleLayout.h"
+#include "Units.h"
+
+class LayerTest : public ::testing::Test
+{
+ protected:
+    LayerTest(){}
+    virtual ~LayerTest(){}
+};
+
+TEST_F(LayerTest, LayerInitialState)
+{
+    Layer layer;
+    EXPECT_EQ(nullptr, layer.getMaterial());
+    EXPECT_EQ(nullptr, layer.getLayout(0));
+    EXPECT_EQ(0, layer.getThickness());
+    EXPECT_FALSE(layer.hasComputation());
+    EXPECT_EQ(complex_t(1.0, 0.0), layer.getRefractiveIndex());
+    EXPECT_EQ(0.0, layer.getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", layer.getName());
+
+    Layer* new_layer = layer.clone();
+    EXPECT_EQ(nullptr, new_layer->getMaterial());
+    EXPECT_EQ(nullptr, new_layer->getLayout(0));
+    EXPECT_EQ(0, new_layer->getThickness());
+    EXPECT_FALSE(new_layer->hasComputation());
+    EXPECT_EQ(complex_t(1.0, 0.0), new_layer->getRefractiveIndex());
+    EXPECT_EQ(0.0, new_layer->getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", new_layer->getName());
+
+    delete new_layer;
+}
+
+TEST_F(LayerTest, LayerGetAndSet)
+{
+    HomogeneousMaterial air("air",0,0);
+    HomogeneousMaterial something("something",0,0.5);
+
+    Layer layer(air, 10*Units::nanometer);
+    EXPECT_EQ(air.getName(), layer.getMaterial()->getName());
+    EXPECT_EQ(nullptr, layer.getLayout(0));
+    EXPECT_EQ(10, layer.getThickness());
+    EXPECT_FALSE(layer.hasComputation());
+    EXPECT_EQ(complex_t(1,0), layer.getRefractiveIndex());
+    EXPECT_EQ(0.0, layer.getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", layer.getName());
+
+    layer.setThickness(20.0);
+    EXPECT_EQ(20, layer.getThickness());
+    layer.setMaterial(something);
+    EXPECT_EQ(something.getName(), layer.getMaterial()->getName());
+    EXPECT_EQ("Layer", layer.getName());
+    EXPECT_EQ(complex_t(1,0.5), layer.getRefractiveIndex());
+
+    Layer* new_layer = layer.clone();
+    EXPECT_EQ(something.getName(), new_layer->getMaterial()->getName());
+    EXPECT_EQ(nullptr, new_layer->getLayout(0));
+    EXPECT_EQ(20, new_layer->getThickness());
+    EXPECT_FALSE(new_layer->hasComputation());
+    EXPECT_EQ(complex_t(1,0.5), new_layer->getRefractiveIndex());
+    EXPECT_EQ(0.0, new_layer->getTotalParticleSurfaceDensity(0));
+    EXPECT_EQ("Layer", new_layer->getName());
+    delete new_layer;
+}
+
+TEST_F(LayerTest, LayerAndDecoration)
+{
+    HomogeneousMaterial air("air",0,0);
+    ParticleLayout* p_layout1 = new ParticleLayout();
+
+    Layer layer(air, 10*Units::nanometer);
+    layer.addLayout(*p_layout1);
+    //EXPECT_EQ(decoration1, layer.getLayout());
+    EXPECT_TRUE(layer.hasComputation());
+
+    ParticleLayout layout2;
+    layer.addLayout(layout2);
+    EXPECT_EQ("ParticleLayout", layer.getLayout(1)->getName());
+}
diff --git a/Tests/UnitTests/Core/Numeric0/FormFactorSpecializationTest.h b/Tests/UnitTests/Core/Numeric0/FormFactorSpecializationTest.h
new file mode 100644
index 0000000..27f0986
--- /dev/null
+++ b/Tests/UnitTests/Core/Numeric0/FormFactorSpecializationTest.h
@@ -0,0 +1,123 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/UnitTests/Core/Numeric0/FormFactorSpecializationTest.h
+//! @brief     Unit tests for special cases of particle-shape form factors.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MathConstants.h"
+#include "BornAgainNamespace.h"
+#include "HardParticles.h"
+#include "qLoopedTest.h"
+
+class FFSpecializationTest : public QLoopedTest
+{
+public:
+    void test_ff_eq(IFormFactorBorn* p0, IFormFactorBorn* p1, double eps=1e-12) {
+        complex_t f0 = p0->evaluate_for_q(q);
+        complex_t f1 = p1->evaluate_for_q(q);
+        double avge = (std::abs(f0) + std::abs(f1))/2;
+        //std::cout<<"q="<<q<<" -> "<<std::setprecision(16)<<" f0="<<f0<<", f1="<<f1<<"\n";
+        EXPECT_NEAR( real(f0), real(f1), eps*avge );
+        EXPECT_NEAR( imag(f0), imag(f1), eps*avge );
+    }
+};
+
+INSTANTIATE_TEST_CASE_P(
+    FFSpecializationTests,
+    FFSpecializationTest,
+    qlist);
+
+//*********** polyhedra ***************
+
+double eps_polyh = 7.5e-13;
+
+TEST_P(FFSpecializationTest, TruncatedCubeAsBox)
+{
+    if( skip_q( 1e-99, 5e2 ) )
+        return;
+    double L=.5;
+    FormFactorTruncatedCube p0(L, 0);
+    FormFactorBox p1(L, L, L);
+    test_ff_eq( &p0, &p1, eps_polyh );
+}
+
+TEST_P(FFSpecializationTest, AnisoPyramidAsPyramid)
+{
+    if( skip_q( 1e-99, 5e3 ) )
+        return;
+    double L=1.5, H=.24, alpha=.6;
+    FormFactorAnisoPyramid p0(L, L, H, alpha);
+    FormFactorPyramid p1(L, H, alpha);
+    test_ff_eq( &p0, &p1, eps_polyh );
+}
+
+TEST_P(FFSpecializationTest, Pyramid3AsPrism)
+{
+    if( skip_q( 1e-99, 5e3 ) )
+        return;
+    double L=1.8, H=.3;
+    FormFactorTetrahedron p0(L, H, M_PI/2);
+    FormFactorPrism3 p1(L, H);
+    test_ff_eq( &p0, &p1, eps_polyh );
+}
+
+TEST_P(FFSpecializationTest, PyramidAsBox)
+{
+    if( skip_q( 1e-99, 5e2 ) )
+        return;
+    double L=1.8, H=.3;
+    FormFactorPyramid p0(L, H, M_PI/2);
+    FormFactorBox p1(L, L, H);
+    test_ff_eq( &p0, &p1, eps_polyh );
+}
+
+TEST_P(FFSpecializationTest, Cone6AsPrism)
+{
+    if( skip_q( 1e-99, 5e2 ) )
+        return;
+    double L=.8, H=1.13;
+    FormFactorCone6 p0(L, H, M_PI/2);
+    FormFactorPrism6 p1(L, H);
+    test_ff_eq( &p0, &p1, eps_polyh );
+}
+
+//*********** spheroids ***************
+
+TEST_P(FFSpecializationTest, HemiEllipsoidAsTruncatedSphere)
+{
+    if( skip_q( 1e-99, 5e2 ) )
+        return;
+    double R=1.07;
+    FormFactorHemiEllipsoid p0(R, R, R);
+    FormFactorTruncatedSphere p1(R, R);
+    test_ff_eq( &p0, &p1, 1e-10 );
+}
+
+TEST_P(FFSpecializationTest, EllipsoidalCylinderAsCylinder)
+{
+    if( skip_q( 1e-99, 5e3 ) )
+        return;
+    double R=.8, H=1.2;
+    FormFactorEllipsoidalCylinder p0(R, R, H);
+    FormFactorCylinder p1(R, H);
+    test_ff_eq( &p0, &p1, 1e-11 );
+}
+
+TEST_P(FFSpecializationTest, TruncatedSphereAsSphere)
+{
+    if( skip_q( .02, 5e1 ) ) // WAITING #1416 improve/replace numeric integration
+        return;
+    double R=1.;
+    FormFactorTruncatedSphere p0(R, 2*R);
+    FormFactorFullSphere p1(R);
+    test_ff_eq( &p0, &p1 );
+}
diff --git a/Tests/UnitTests/Core/Numeric0/main.cpp b/Tests/UnitTests/Core/Numeric0/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/Numeric0/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/Numeric0/testlist.h b/Tests/UnitTests/Core/Numeric0/testlist.h
new file mode 100644
index 0000000..6afe179
--- /dev/null
+++ b/Tests/UnitTests/Core/Numeric0/testlist.h
@@ -0,0 +1,3 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "FormFactorSpecializationTest.h"
diff --git a/Tests/UnitTests/Core/Numeric1/FormFactorSymmetryTest.h b/Tests/UnitTests/Core/Numeric1/FormFactorSymmetryTest.h
new file mode 100644
index 0000000..597344b
--- /dev/null
+++ b/Tests/UnitTests/Core/Numeric1/FormFactorSymmetryTest.h
@@ -0,0 +1,102 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/UnitTests/Core/Numeric1/FormFactorSymmetryTest.h
+//! @brief     Unit tests for symmetry of particle-shape form factors.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MathConstants.h"
+#include "BornAgainNamespace.h"
+#include "HardParticles.h"
+#include "qLoopedTest.h"
+
+class FFSymmetryTest : public QLoopedTest
+{
+public:
+    void test_qq_eq( IFormFactorBorn* p, cvector_t q0, cvector_t q1, double eps=1e-12 ) {
+        complex_t f0 = p->evaluate_for_q(q0);
+        complex_t f1 = p->evaluate_for_q(q1);
+        double avge = (std::abs(f0) + std::abs(f1))/2;
+        EXPECT_NEAR( real(f0), real(f1), eps*avge );
+        EXPECT_NEAR( imag(f0), imag(f1), eps*avge );
+    }
+    cvector_t qt;
+};
+
+INSTANTIATE_TEST_CASE_P(
+    FFSymmetryTests,
+    FFSymmetryTest,
+    qlist);
+
+//*********** polyhedra ***************
+
+TEST_P(FFSymmetryTest, Prism3)
+{
+    if( skip_q( 1e-99, 2e2 ) )
+        return;
+    FormFactorPrism3 p(.83, .45);
+    test_qq_eq( &p, q, q.rotatedZ(M_TWOPI/3) );
+}
+
+TEST_P(FFSymmetryTest, Prism6)
+{
+    if( skip_q( 1e-99, 2e3 ) )
+        return;
+    FormFactorPrism6 p(1.33, .42);
+    test_qq_eq( &p, q, q.rotatedZ( M_PI/3),  1e-12 );
+    test_qq_eq( &p, q, q.rotatedZ(-M_TWOPI/3), 3.8e-12 );
+}
+
+TEST_P(FFSymmetryTest, Tetrahedron)
+{
+    if( skip_q( 1e-99, 2e2 ) )
+        return;
+    FormFactorTetrahedron p(8.43, .25, .53);
+    test_qq_eq( &p, q, q.rotatedZ(M_TWOPI/3), 6e-12 );
+    // Linux: 3e-12, relaxed for Mac
+}
+
+TEST_P(FFSymmetryTest, Cone6_flat)
+{
+    if( skip_q( 1e-99, 2e2) ) // TODO for larger q, imag(ff) is nan
+        return;
+    FormFactorCone6 p(4.3, .09, .1);
+    test_qq_eq( &p, q, q.rotatedZ(-M_PI/3), 3.8e-12 );
+}
+
+TEST_P(FFSymmetryTest, Cone6_steep)
+{
+    if( skip_q( 1e-99, 2e2) ) // TODO for larger q, imag(ff) is nan
+        return;
+    FormFactorCone6 p(.23, 3.5, .999*M_PI/2);
+    test_qq_eq( &p, q, q.rotatedZ(-M_PI/3), 2.5e-12 );
+}
+
+//*********** spheroids ***************
+
+TEST_P(FFSymmetryTest, HemiEllipsoid)
+{
+    if( skip_q( 1e-99, 2e2 ) )
+        return;
+    FormFactorHemiEllipsoid p(.53, .78, 1.3);
+    test_qq_eq( &p, q, cvector_t(-q.x(), q.y(), q.z()) );
+    test_qq_eq( &p, q, cvector_t(q.x(), -q.y(), q.z()) );
+}
+
+TEST_P(FFSymmetryTest, TruncatedSphere)
+{
+    if( skip_q( 1e-99, 2e2 ) )
+        return;
+    FormFactorTruncatedSphere p(.79, .34);
+    test_qq_eq( &p, q, q.rotatedZ(M_PI/3.13698), 1e-10 );
+}
+
+// ****** TODO: tests that do not pass for the full q range *********
diff --git a/Tests/UnitTests/Core/Numeric1/main.cpp b/Tests/UnitTests/Core/Numeric1/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/Numeric1/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Core/Numeric1/testlist.h b/Tests/UnitTests/Core/Numeric1/testlist.h
new file mode 100644
index 0000000..5246714
--- /dev/null
+++ b/Tests/UnitTests/Core/Numeric1/testlist.h
@@ -0,0 +1,3 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "FormFactorSymmetryTest.h"
diff --git a/Tests/UnitTests/Core/main.cpp b/Tests/UnitTests/Core/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Core/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Fit/0/AttLimitsTest.h b/Tests/UnitTests/Fit/0/AttLimitsTest.h
new file mode 100644
index 0000000..2243fc1
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/AttLimitsTest.h
@@ -0,0 +1,82 @@
+#ifndef ATTLIMITSTEST_H
+#define ATTLIMITSTEST_H
+
+#include "AttLimits.h"
+#include "gtest/gtest.h"
+
+class AttLimitsTest : public ::testing::Test
+{
+ protected:
+    AttLimitsTest(){}
+    virtual ~AttLimitsTest(){}
+};
+
+TEST_F(AttLimitsTest, InitialState)
+{
+    AttLimits limits;
+    EXPECT_FALSE(limits.isFixed());
+    EXPECT_FALSE(limits.isLimited());
+    EXPECT_FALSE(limits.isUpperLimited());
+    EXPECT_FALSE(limits.isLowerLimited());
+    EXPECT_TRUE(limits.isLimitless());
+}
+
+TEST_F(AttLimitsTest, LowerLimited)
+{
+    AttLimits limits = AttLimits::lowerLimited(1.0);
+    EXPECT_FALSE(limits.isFixed());
+    EXPECT_FALSE(limits.isLimited());
+    EXPECT_FALSE(limits.isUpperLimited());
+    EXPECT_TRUE(limits.isLowerLimited());
+    EXPECT_FALSE(limits.isLimitless());
+    EXPECT_EQ(1.0, limits.lowerLimit());
+    EXPECT_EQ(0.0, limits.upperLimit());
+}
+
+TEST_F(AttLimitsTest, UpperLimited)
+{
+    AttLimits limits = AttLimits::upperLimited(1.0);
+    EXPECT_FALSE(limits.isFixed());
+    EXPECT_FALSE(limits.isLimited());
+    EXPECT_TRUE(limits.isUpperLimited());
+    EXPECT_FALSE(limits.isLowerLimited());
+    EXPECT_FALSE(limits.isLimitless());
+    EXPECT_EQ(0.0, limits.lowerLimit());
+    EXPECT_EQ(1.0, limits.upperLimit());
+}
+
+TEST_F(AttLimitsTest, Fixed)
+{
+    AttLimits limits = AttLimits::fixed();
+    EXPECT_TRUE(limits.isFixed());
+    EXPECT_FALSE(limits.isLimited());
+    EXPECT_FALSE(limits.isUpperLimited());
+    EXPECT_FALSE(limits.isLowerLimited());
+    EXPECT_FALSE(limits.isLimitless());
+    EXPECT_EQ(0.0, limits.lowerLimit());
+    EXPECT_EQ(0.0, limits.upperLimit());
+}
+
+TEST_F(AttLimitsTest, Limited)
+{
+    AttLimits limits = AttLimits::limited(1.0, 2.0);
+    EXPECT_FALSE(limits.isFixed());
+    EXPECT_TRUE(limits.isLimited());
+    EXPECT_FALSE(limits.isUpperLimited());
+    EXPECT_FALSE(limits.isLowerLimited());
+    EXPECT_FALSE(limits.isLimitless());
+    EXPECT_EQ(1.0, limits.lowerLimit());
+    EXPECT_EQ(2.0, limits.upperLimit());
+
+    // making it fixed, this should remove limits
+    limits.setFixed(true);
+    EXPECT_TRUE(limits.isFixed());
+    EXPECT_FALSE(limits.isLimited());
+    EXPECT_FALSE(limits.isUpperLimited());
+    EXPECT_FALSE(limits.isLowerLimited());
+    EXPECT_FALSE(limits.isLimitless());
+    EXPECT_EQ(0.0, limits.lowerLimit());
+    EXPECT_EQ(0.0, limits.upperLimit());
+}
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/FitObjectTest.h b/Tests/UnitTests/Fit/0/FitObjectTest.h
new file mode 100644
index 0000000..9dd6f09
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/FitObjectTest.h
@@ -0,0 +1,103 @@
+#ifndef FITOBJECTTEST_H
+#define FITOBJECTTEST_H
+
+#include "FitObject.h"
+#include "GISASSimulation.h"
+#include "BornAgainNamespace.h"
+#include "Units.h"
+#include <iostream>
+#include "gtest/gtest.h"
+
+
+class FitObjectTest : public ::testing::Test
+{
+ protected:
+    FitObjectTest(){}
+    virtual ~FitObjectTest(){}
+
+};
+
+//! Test of standard simulation/real_data pair.
+
+TEST_F(FitObjectTest, StandardPair)
+{
+    size_t nx(5), ny(4);
+    double xmin(-1.0), xmax(4.0), ymin(0.0), ymax(4.0);
+
+    GISASSimulation simulation;
+    simulation.setDetectorParameters(nx, xmin, xmax, ny, ymin, ymax);
+
+    OutputData<double> data;
+    data.addAxis(FixedBinAxis(BornAgain::PHI_AXIS_NAME, nx, xmin, xmax));
+    data.addAxis(FixedBinAxis(BornAgain::ALPHA_AXIS_NAME, ny, ymin, ymax));
+    double intensity(10.0);
+    data.setAllTo(intensity);
+
+    double weight(0.5);
+    FitObject obj(simulation, data, weight);
+
+    EXPECT_EQ(obj.weight(), weight);
+    EXPECT_EQ(obj.numberOfFitElements(), size_t(nx*ny));
+
+    EXPECT_EQ(obj.realData().getAxis(0).size(), nx);
+    EXPECT_EQ(obj.realData().getAxis(1).size(), ny);
+    EXPECT_EQ(obj.realData().getAxis(0).getMin(), xmin);
+    EXPECT_EQ(obj.realData().getAxis(0).getMax(), xmax);
+    EXPECT_EQ(obj.realData().getAxis(1).getMin(), ymin);
+    EXPECT_EQ(obj.realData().getAxis(1).getMax(), ymax);
+    EXPECT_EQ(obj.realData().totalSum(), intensity*nx*ny);
+
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(0).size(), nx);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(1).size(), ny);
+    EXPECT_EQ(obj.chiSquaredMap().totalSum(), 0.0);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(0).getMin(), xmin);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(0).getMax(), xmax);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(1).getMin(), ymin);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(1).getMax(), ymax);
+}
+
+//! Test of the case when simulation has ROI.
+
+TEST_F(FitObjectTest, RoiPair)
+{
+    int nx(5), ny(4);
+    double xmin(-1.0), xmax(4.0), ymin(0.0), ymax(4.0);
+
+    GISASSimulation simulation;
+    simulation.setDetectorParameters(nx, xmin, xmax, ny, ymin, ymax);
+    simulation.setRegionOfInterest(0.1, 1.1, 2.9, 3.9);
+
+    // so new axes should be
+    size_t roi_nx(3), roi_ny(3);
+    double roi_xmin(0.0), roi_xmax(3.0), roi_ymin(1.0), roi_ymax(4.0);
+
+    OutputData<double> data;
+    data.addAxis(FixedBinAxis(BornAgain::PHI_AXIS_NAME, nx, xmin, xmax));
+    data.addAxis(FixedBinAxis(BornAgain::ALPHA_AXIS_NAME, ny, ymin, ymax));
+    double intensity(10.0);
+    data.setAllTo(intensity);
+
+    double weight(0.5);
+    FitObject obj(simulation, data, weight);
+
+    EXPECT_EQ(obj.weight(), weight);
+    EXPECT_EQ(obj.numberOfFitElements(), size_t(roi_nx*roi_ny));
+
+    EXPECT_EQ(obj.realData().getAxis(0).size(), roi_nx);
+    EXPECT_EQ(obj.realData().getAxis(1).size(), roi_ny);
+    EXPECT_EQ(obj.realData().getAxis(0).getMin(), roi_xmin);
+    EXPECT_EQ(obj.realData().getAxis(0).getMax(), roi_xmax);
+    EXPECT_EQ(obj.realData().getAxis(1).getMin(), roi_ymin);
+    EXPECT_EQ(obj.realData().getAxis(1).getMax(), roi_ymax);
+    EXPECT_EQ(obj.realData().totalSum(), intensity*roi_nx*roi_ny);
+
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(0).size(), roi_nx);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(1).size(), roi_ny);
+    EXPECT_EQ(obj.chiSquaredMap().totalSum(), 0.0);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(0).getMin(), roi_xmin);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(0).getMax(), roi_xmax);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(1).getMin(), roi_ymin);
+    EXPECT_EQ(obj.chiSquaredMap().getAxis(1).getMax(), roi_ymax);
+}
+
+#endif // FITOBJECTTEST_H
diff --git a/Tests/UnitTests/Fit/0/FitParameterLinkedTest.h b/Tests/UnitTests/Fit/0/FitParameterLinkedTest.h
new file mode 100644
index 0000000..174bf01
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/FitParameterLinkedTest.h
@@ -0,0 +1,107 @@
+#ifndef FITPARAMETERLINKEDTEST_H
+#define FITPARAMETERLINKEDTEST_H
+
+#include "IParameterized.h"
+#include "RealParameter.h"
+#include "ParameterPool.h"
+#include "FitParameterLinked.h"
+
+#include "gtest/gtest.h"
+
+class FitParameterLinkedTest : public ::testing::Test
+{
+ protected:
+    FitParameterLinkedTest(){}
+    virtual ~FitParameterLinkedTest(){}
+};
+
+TEST_F(FitParameterLinkedTest, FitParameterLinkedInitial)
+{
+    FitParameterLinked fitParameterLinked;
+
+    EXPECT_EQ("", fitParameterLinked.name());
+    EXPECT_EQ(0.0, fitParameterLinked.value());
+    EXPECT_EQ(0.0, fitParameterLinked.step());
+    EXPECT_EQ(0.0, fitParameterLinked.error());
+
+    EXPECT_FALSE(fitParameterLinked.limits().isLowerLimited());
+    EXPECT_FALSE(fitParameterLinked.limits().isUpperLimited());
+    EXPECT_FALSE(fitParameterLinked.limits().isLimited());
+    EXPECT_FALSE(fitParameterLinked.limits().isFixed());
+}
+
+TEST_F(FitParameterLinkedTest, FitParameterLinkedWithValue)
+{
+    AttLimits limits = AttLimits::limited(-10.0, 2.0);
+
+    FitParameterLinked fitParameter("FitPL", 2.0, limits, 0.2);
+
+    EXPECT_EQ("FitPL", fitParameter.name());
+    EXPECT_EQ(2.0, fitParameter.value());
+    EXPECT_EQ(0.2, fitParameter.step());
+
+    EXPECT_EQ(-10.0, fitParameter.limits().lowerLimit());
+    EXPECT_EQ(2.0, fitParameter.limits().upperLimit());
+}
+
+TEST_F(FitParameterLinkedTest, FitParameterLinkedParamPool)
+{
+    class ParametrizedObject : public IParameterized
+    {
+    public:
+        ParametrizedObject(double p1, double p2) : m1(p1), m2(p2)
+        {
+            registerParameter("1", &m1);
+            registerParameter("2", &m2);
+        }
+        virtual void onChange() final {}
+        double m1, m2;
+    };
+    ParametrizedObject obj1(1., 2.);
+    ParametrizedObject obj2(3., 4.);
+    ParametrizedObject obj3(5., 6.);
+
+    RealParameter* par11(obj1.getParameter("1"));
+    RealParameter* par21(obj2.getParameter("1"));
+    RealParameter* par32(obj3.getParameter("2"));
+
+    FitParameterLinked linked;
+    linked.addParameter(par11);
+    linked.addParameter(par21);
+    linked.addParameter(par32);
+
+    linked.setValue(11.2);
+    EXPECT_EQ(linked.value(), 11.2);
+    EXPECT_EQ(obj1.getParameter("1")->getValue(), 11.2);
+    EXPECT_EQ(obj1.getParameter("2")->getValue(), 2);
+    EXPECT_EQ(obj2.getParameter("1")->getValue(), 11.2);
+    EXPECT_EQ(obj2.getParameter("2")->getValue(), 4);
+    EXPECT_EQ(obj3.getParameter("1")->getValue(), 5);
+    EXPECT_EQ(obj3.getParameter("2")->getValue(), 11.2);
+
+    /* I need to understand a use case before I can restore this test - JWu apr16
+    ParameterPool* pool( obj3.getParameterPool() );
+    double par7 = 7.7;
+    double par8 = 8.8;
+    double par9 = 9.9;
+
+    pool->addParameter("par7",par7);
+    pool->addParameter("par8",par8);
+    pool->addParameter("par9",par9);
+
+    linked.addMatchedParametersFromPool(pool,"par7");
+    linked.setValue(2.3);
+
+    EXPECT_EQ(linked.getValue(), 2.3);
+    EXPECT_EQ(par7, 2.3);
+    EXPECT_EQ(pool.getParameter("par7"), 2.3);
+    EXPECT_EQ(obj1.getParameter("1"), 2.3);
+    EXPECT_EQ(obj1.getParameter("2"), 2);
+    EXPECT_EQ(obj2.getParameter("1"), 2.3);
+    EXPECT_EQ(obj2.getParameter("2"), 4);
+    EXPECT_EQ(obj2.getParameter("1"), 5);
+    EXPECT_EQ(obj3.getParameter("2"), 2.3);
+    */
+}
+
+#endif // FITPARAMETERLINKEDTEST_H
diff --git a/Tests/UnitTests/Fit/0/FitParameterSetTest.h b/Tests/UnitTests/Fit/0/FitParameterSetTest.h
new file mode 100644
index 0000000..57a3bca
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/FitParameterSetTest.h
@@ -0,0 +1,129 @@
+#ifndef FITPARAMETERSETTEST_H
+#define FITPARAMETERSETTEST_H
+
+#include "FitParameter.h"
+#include "FitParameterSet.h"
+#include "gtest/gtest.h"
+
+class FitParameterSetTest : public ::testing::Test
+{
+ protected:
+    FitParameterSetTest(){}
+    virtual ~FitParameterSetTest(){}
+};
+
+TEST_F(FitParameterSetTest, addFitParameter)
+{
+    FitParameterSet parameters;
+
+    FitParameter *par = new FitParameter("par1", 1.0);
+    parameters.addFitParameter(par);
+    EXPECT_EQ(parameters.size(), 1u);
+
+    // attempt to add same fit parameter twice
+    EXPECT_THROW(parameters.addFitParameter(par), std::runtime_error);
+
+    // attempt to add fit parameter with the same name
+    std::unique_ptr<FitParameter> par2(new FitParameter("par1", 2.0));
+    EXPECT_THROW(parameters.addFitParameter(par2.get()), std::runtime_error);
+
+    parameters.clear();
+    EXPECT_EQ(parameters.size(), 0u);
+}
+
+TEST_F(FitParameterSetTest, getFitParameter)
+{
+    FitParameterSet parameters;
+
+    FitParameter *par1 = new FitParameter("par1", 1.0);
+    parameters.addFitParameter(par1);
+    FitParameter *par2 = new FitParameter("par2", 1.0);
+    parameters.addFitParameter(par2);
+
+    EXPECT_EQ(parameters.fitParameter("par1"), par1);
+    EXPECT_EQ(parameters.fitParameter("par2"), par2);
+    EXPECT_EQ(parameters["par1"], par1);
+    EXPECT_EQ(parameters["par2"], par2);
+    EXPECT_EQ(parameters[0], par1);
+    EXPECT_EQ(parameters[1], par2);
+
+    EXPECT_THROW(parameters.fitParameter("par3"), std::runtime_error);
+    EXPECT_THROW(parameters["par3"], std::runtime_error);
+    EXPECT_THROW(parameters[2], std::runtime_error);
+}
+
+TEST_F(FitParameterSetTest, parameterValues)
+{
+    FitParameterSet parameters;
+    parameters.addFitParameter(new FitParameter("par1", 1.0));
+    parameters.addFitParameter(new FitParameter("par2", 2.0));
+    parameters.addFitParameter(new FitParameter("par3", 3.0));
+    std::vector<double> values{1.0, 2.0, 3.0};
+    EXPECT_EQ(parameters.values(), values);
+
+    std::vector<double> new_values{4.0, 5.0, 6.0};
+    parameters.setValues(new_values);
+    EXPECT_EQ(parameters.values(), new_values);
+
+    // are values different?
+    EXPECT_FALSE(parameters.valuesDifferFrom(new_values));
+    new_values = {4.0, 5.1, 6.0};
+    EXPECT_TRUE(parameters.valuesDifferFrom(new_values));
+
+    // attempt to set vector of wrong size
+    new_values = {4.0, 5.0, 6.0, 7.0};
+    EXPECT_THROW(parameters.setValues(new_values), std::runtime_error);
+}
+
+TEST_F(FitParameterSetTest, parameterErrors)
+{
+    FitParameterSet parameters;
+    FitParameter *par1 = new FitParameter("par1", 1.0, AttLimits::limitless(), 0.01);
+    FitParameter *par2 = new FitParameter("par2", 1.0, AttLimits::limitless(), 0.01);
+
+    parameters.addFitParameter(par1);
+    parameters.addFitParameter(par2);
+    par1->setError(1.0);
+    par2->setError(2.0);
+
+    std::vector<double> errors{1.0, 2.0};
+    EXPECT_EQ(parameters.errors(), errors);
+
+    parameters.setErrors(std::vector<double>() = {4.0, 5.0});
+    EXPECT_EQ(par1->error(), 4.0);
+    EXPECT_EQ(par2->error(), 5.0);
+}
+
+TEST_F(FitParameterSetTest, fixRelease)
+{
+    FitParameterSet parameters;
+    FitParameter *par1 = new FitParameter("par1", 1.0, AttLimits::limitless(), 0.01);
+    FitParameter *par2 = new FitParameter("par2", 1.0, AttLimits::limitless(), 0.01);
+    FitParameter *par3 = new FitParameter("par3", 1.0, AttLimits::limitless(), 0.01);
+
+    parameters.addFitParameter(par1);
+    parameters.addFitParameter(par2);
+    parameters.addFitParameter(par3);
+
+    EXPECT_EQ(parameters.freeFitParameterCount(), 3u);
+
+    par1->limits().setFixed(true);
+    EXPECT_EQ(parameters.freeFitParameterCount(), 2u);
+    par2->limits().setFixed(true);
+    EXPECT_EQ(parameters.freeFitParameterCount(), 1u);
+
+    parameters.fixAll();
+    EXPECT_EQ(parameters.freeFitParameterCount(), 0u);
+
+    parameters.releaseAll();
+    EXPECT_EQ(parameters.freeFitParameterCount(), 3u);
+
+    std::vector<std::string> names_to_fix={"par1", "par3"};
+    parameters.setFixed(names_to_fix, true);
+    EXPECT_EQ(parameters.freeFitParameterCount(), 1u);
+    EXPECT_TRUE(par1->limits().isFixed());
+    EXPECT_FALSE(par2->limits().isFixed());
+    EXPECT_TRUE(par3->limits().isFixed());
+}
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/FitParameterTest.h b/Tests/UnitTests/Fit/0/FitParameterTest.h
new file mode 100644
index 0000000..7379d16
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/FitParameterTest.h
@@ -0,0 +1,124 @@
+#ifndef FITPARAMETERTEST_H
+#define FITPARAMETERTEST_H
+
+#include "FitParameter.h"
+#include "gtest/gtest.h"
+#include <memory>
+
+class FitParameterTest : public ::testing::Test
+{
+ protected:
+    FitParameterTest(){}
+    virtual ~FitParameterTest(){}
+};
+
+TEST_F(FitParameterTest, Initial)
+{
+    FitParameter par;
+    EXPECT_EQ(std::string(), par.name());
+    EXPECT_EQ(0.0, par.value());
+    EXPECT_EQ(0.0, par.startValue());
+    EXPECT_EQ(0.0, par.step());
+    EXPECT_EQ(0.0, par.error());
+    EXPECT_TRUE(par.limits().isLimitless());
+}
+
+TEST_F(FitParameterTest, Constructors)
+{
+    const std::string name("name");
+    const double value(1.0);
+
+    FitParameter par(name, value);
+    EXPECT_EQ(name, par.name());
+    EXPECT_EQ(value, par.value());
+    EXPECT_EQ(value, par.startValue());
+    EXPECT_EQ(0.0, par.step());
+    EXPECT_EQ(0.0, par.error());
+    EXPECT_TRUE(par.limits().isLimitless());
+
+    const AttLimits limits = AttLimits::limited(1.0, 2.0);
+    const double step(0.01);
+
+    FitParameter par2(name, value, limits, step);
+    EXPECT_EQ(name, par2.name());
+    EXPECT_EQ(value, par2.value());
+    EXPECT_EQ(value, par2.startValue());
+    EXPECT_EQ(step, par2.step());
+    EXPECT_EQ(0.0, par2.error());
+    EXPECT_EQ(limits, par2.limits());
+}
+
+TEST_F(FitParameterTest, Setters)
+{
+    const std::string name("name");
+    const double start_value(1.0);
+    const double value(2.0);
+    const AttLimits limits = AttLimits::limited(1.0, 2.0);
+    const double error(0.02);
+    const double step(0.01);
+
+    FitParameter par(name, start_value);
+    par.setValue(value);
+
+    EXPECT_EQ(value, par.value());
+    EXPECT_EQ(start_value, par.startValue());
+
+    par.setError(error);
+    EXPECT_EQ(error, par.error());
+
+    par.setLimits(limits);
+    EXPECT_EQ(limits, par.limits());
+
+    par.setStep(step);
+    EXPECT_EQ(step, par.step());
+}
+
+TEST_F(FitParameterTest, CompoundSetters)
+{
+    const std::string name("name");
+    const double start_value(1.0);
+    const double step(0.1);
+    const double lim1(1.0), lim2(2.0);
+
+    FitParameter par(name, start_value);
+
+    par.setStep(step).setLowerLimited(lim1);
+    EXPECT_EQ(step, par.step());
+    EXPECT_TRUE(par.limits().isLowerLimited());
+    EXPECT_EQ(par.limits().lowerLimit(), lim1);
+    EXPECT_EQ(par.limits().upperLimit(), 0.0);
+
+    par.setStep(step).setUpperLimited(lim2);
+    EXPECT_TRUE(par.limits().isUpperLimited());
+    EXPECT_EQ(par.limits().lowerLimit(), 0.0);
+    EXPECT_EQ(par.limits().upperLimit(), lim2);
+
+    par.setStep(step).setLimited(lim1, lim2);
+    EXPECT_TRUE(par.limits().isLimited());
+    EXPECT_EQ(par.limits().lowerLimit(), lim1);
+    EXPECT_EQ(par.limits().upperLimit(), lim2);
+
+    par.setStep(step).setFixed();
+    EXPECT_TRUE(par.limits().isFixed());
+    EXPECT_EQ(par.limits().lowerLimit(), 0.0);
+    EXPECT_EQ(par.limits().upperLimit(), 0.0);
+}
+
+TEST_F(FitParameterTest, Clone)
+{
+    const double start_value(1.0), value(2.0), error(0.1), step(0.01), lim1(10.0), lim2(10.0);
+    FitParameter par("par1", start_value, AttLimits::limited(lim1, lim2), step);
+    par.setValue(value);
+    par.setError(error);
+    std::unique_ptr<FitParameter> clone(par.clone());
+
+    EXPECT_EQ("par1", clone->name());
+    EXPECT_EQ(start_value, clone->startValue());
+    EXPECT_EQ(value, clone->value());
+    EXPECT_EQ(error, clone->error());
+    EXPECT_EQ(step, clone->step());
+    EXPECT_EQ(lim1, clone->limits().lowerLimit());
+    EXPECT_EQ(lim2, clone->limits().upperLimit());
+}
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/FitSuiteTest.h b/Tests/UnitTests/Fit/0/FitSuiteTest.h
new file mode 100644
index 0000000..0513270
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/FitSuiteTest.h
@@ -0,0 +1,51 @@
+#ifndef FITSUITETEST_H
+#define FITSUITETEST_H
+
+#include "FitSuite.h"
+#include "FitParameter.h"
+#include "gtest/gtest.h"
+#include <memory>
+
+class FitSuiteTest : public ::testing::Test
+{
+ protected:
+    FitSuiteTest(){}
+    virtual ~FitSuiteTest(){}
+};
+
+TEST_F(FitSuiteTest, addFitParameter)
+{
+    std::unique_ptr<FitSuite> fitSuite(new FitSuite);
+
+    fitSuite->addFitParameter("par1", 1.0);
+    FitParameter *par = fitSuite->fitParameters()->fitParameter("par1");
+    EXPECT_EQ("par1", par->name());
+    EXPECT_EQ(1.0, par->value());
+    EXPECT_EQ(0.0, par->error());
+    EXPECT_EQ(0.01, par->step()); // default step invented by FitSuite
+    EXPECT_TRUE(par->limits().isLimitless());
+
+    par = fitSuite->addFitParameter("par2", 2.0, AttLimits::limited(10.0, 20.0), 0.02);
+    EXPECT_EQ("par2", par->name());
+    EXPECT_EQ(2.0, par->value());
+    EXPECT_EQ(0.0, par->error());
+    EXPECT_EQ(0.02, par->step());
+    EXPECT_TRUE(par->limits().isLimited());
+    EXPECT_EQ(10.0, par->limits().lowerLimit());
+    EXPECT_EQ(20.0, par->limits().upperLimit());
+
+    FitParameter &par2 = fitSuite->addFitParameter("par3", 3.0)->setStep(0.03).setLowerLimited(30.0);
+    EXPECT_EQ("par3", par2.name());
+    EXPECT_EQ(3.0, par2.value());
+    EXPECT_EQ(0.0, par2.error());
+    EXPECT_EQ(0.03, par2.step());
+    EXPECT_TRUE(par2.limits().isLowerLimited());
+    EXPECT_EQ(30.0, par2.limits().lowerLimit());
+
+    FitParameter &par3 = fitSuite->addFitParameter("par4", 4.0)->setFixed();
+    EXPECT_EQ("par4", par3.name());
+    EXPECT_EQ(4.0, par3.value());
+    EXPECT_TRUE(par3.limits().isFixed());
+}
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/MinimizerOptionsTest.h b/Tests/UnitTests/Fit/0/MinimizerOptionsTest.h
new file mode 100644
index 0000000..ab6b6a4
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/MinimizerOptionsTest.h
@@ -0,0 +1,49 @@
+#ifndef MINIMIZEROPTIONSTEST_H
+#define MINIMIZEROPTIONSTEST_H
+
+#include "MinimizerOptions.h"
+#include "gtest/gtest.h"
+#include <exception>
+
+class MinimizerOptionsTest : public ::testing::Test {
+protected:
+    MinimizerOptionsTest(){}
+};
+
+TEST_F(MinimizerOptionsTest, toOptionString)
+{
+    MinimizerOptions options;
+
+    options.addOption("option_1", 99);
+    options.addOption("option_2", 1.1);
+    options.addOption("option_3", "xxx");
+
+    EXPECT_EQ(options.toOptionString(), "option_1=99;option_2=1.1;option_3=xxx;");
+}
+
+
+TEST_F(MinimizerOptionsTest, setOptionsFromString)
+{
+    MinimizerOptions options;
+
+    options.addOption("Strategy", 1);
+    options.addOption("Tolerance", 0.01);
+    options.addOption("Algorithm", "Default");
+    EXPECT_EQ(1, options.optionValue<int>("Strategy"));
+    EXPECT_EQ(0.01, options.optionValue<double>("Tolerance"));
+
+    options.setOptionString("Strategy=2;");
+    EXPECT_EQ(2, options.optionValue<int>("Strategy"));
+    options.setOptionString("Strategy=3");
+    EXPECT_EQ(3, options.optionValue<int>("Strategy"));
+    EXPECT_EQ(0.01, options.optionValue<double>("Tolerance"));
+
+    options.setOptionString("Strategy=5;Tolerance=0.0001;Algorithm=Unknown");
+    EXPECT_EQ(5, options.optionValue<int>("Strategy"));
+    EXPECT_EQ(0.0001, options.optionValue<double>("Tolerance"));
+    EXPECT_EQ("Unknown", options.optionValue<std::string>("Algorithm"));
+
+    EXPECT_THROW(options.setOptionString("Strategy=5;XXX=y;Tolerance=0.0001;"), std::runtime_error);
+}
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/MultiOptionTest.h b/Tests/UnitTests/Fit/0/MultiOptionTest.h
new file mode 100644
index 0000000..efa4942
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/MultiOptionTest.h
@@ -0,0 +1,105 @@
+#ifndef MULTIOPTIONTEST_H
+#define MULTIOPTIONTEST_H
+
+#include "MultiOption.h"
+#include "gtest/gtest.h"
+#include <iostream>
+#include <string>
+
+class MultiOptionTest : public ::testing::Test {
+protected:
+    MultiOptionTest(){}
+
+};
+
+TEST_F(MultiOptionTest, Variant)
+{
+    MultiOption::variant_t v1(1);
+
+    EXPECT_EQ(0, v1.which());
+//    EXPECT_EQ(1, v1.get<int>());
+    EXPECT_EQ(1, boost::get<int>(v1));
+
+    v1 = 2.0;
+    EXPECT_EQ(1, v1.which());
+    //EXPECT_EQ(2.0, v1.get<double>());
+    EXPECT_EQ(2.0, boost::get<double>(v1));
+
+    const std::string text("xxx");
+    v1 = text;
+    EXPECT_EQ(2, v1.which());
+//    EXPECT_EQ(text, v1.get<std::string>());
+    EXPECT_EQ(text, boost::get<std::string>(v1));
+}
+
+TEST_F(MultiOptionTest, Construction)
+{
+    const std::string name("name");
+    const std::string description("description");
+    const double double_value(2.0);
+    MultiOption opt(name, double_value, description);
+
+    EXPECT_EQ(name, opt.name());
+    EXPECT_EQ(description, opt.description());
+    EXPECT_EQ(double_value, opt.get<double>());
+    EXPECT_EQ(double_value, opt.getDefault<double>());
+
+    // setting new value
+    const double new_value = 3.0;
+    opt.value() = new_value;
+    EXPECT_EQ(new_value, opt.get<double>());
+    EXPECT_EQ(double_value, opt.getDefault<double>());
+}
+
+TEST_F(MultiOptionTest, Copying)
+{
+    const std::string name("name");
+    const std::string description("description");
+    const double double_value(2.0);
+    MultiOption opt(name, double_value, description);
+
+    MultiOption copy(opt);
+    EXPECT_EQ(name, copy.name());
+    EXPECT_EQ(description, copy.description());
+    EXPECT_EQ(double_value, copy.get<double>());
+    EXPECT_EQ(double_value, copy.getDefault<double>());
+}
+
+TEST_F(MultiOptionTest, Assignment)
+{
+    const std::string name("name");
+    const std::string description("description");
+    const double double_value(2.0);
+    MultiOption opt(name, double_value, description);
+
+    MultiOption copy;
+    copy = opt;
+
+    const double new_value = 3.0;
+    opt.value() = new_value;
+
+    EXPECT_EQ(name, copy.name());
+    EXPECT_EQ(description, copy.description());
+    EXPECT_EQ(double_value, copy.get<double>());
+    EXPECT_EQ(double_value, copy.getDefault<double>());
+}
+
+TEST_F(MultiOptionTest, SetFromString)
+{
+    MultiOption opt("name", 2.0);
+    opt.setFromString("2.1");
+    EXPECT_EQ(2.1, opt.get<double>());
+    opt.setFromString("2");
+    EXPECT_EQ(2.0, opt.get<double>());
+
+    MultiOption opt2("name", 99);
+    opt2.setFromString("100");
+    EXPECT_EQ(100, opt2.get<int>());
+
+    MultiOption opt3("name", "xxx");
+    opt3.setFromString("yyy");
+    EXPECT_EQ("yyy", opt3.get<std::string>());
+}
+
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/OptionContainerTest.h b/Tests/UnitTests/Fit/0/OptionContainerTest.h
new file mode 100644
index 0000000..516cc27
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/OptionContainerTest.h
@@ -0,0 +1,133 @@
+#ifndef OPTIONCONTAINERTEST_H
+#define OPTIONCONTAINERTEST_H
+
+#include "OptionContainer.h"
+#include "gtest/gtest.h"
+#include <exception>
+
+class OptionContainerTest : public ::testing::Test {
+protected:
+    OptionContainerTest(){}
+};
+
+TEST_F(OptionContainerTest, addOption)
+{
+    OptionContainer test;
+
+    const double option_value(1.0);
+    const std::string option_name("option");
+    const std::string option_description("description");
+
+    // adding option
+    OptionContainer::option_t option = test.addOption(option_name, option_value);
+    option->setDescription(option_description);
+    EXPECT_EQ(option_value, option->get<double>());
+    EXPECT_EQ(option_name, option->name());
+    EXPECT_EQ(option_description, option->description());
+    EXPECT_EQ(option_value, test.optionValue<double>(option_name));
+
+    // accessing option directly
+    EXPECT_EQ(option.get(), test.option(option_name).get());
+
+    // getting non-existing option
+    EXPECT_THROW(test.option("non-existing-option"), std::runtime_error);
+
+    // adding same option twice
+    EXPECT_THROW(test.addOption(option_name, 1.0), std::runtime_error);
+}
+
+TEST_F(OptionContainerTest, getOptionValue)
+{
+    OptionContainer test;
+
+    test.addOption("option #1", 99, "description #1");
+    test.addOption("option #2", 1.1, "description #2");
+    test.addOption("option #3", "xxx", "description #3");
+
+    EXPECT_EQ(99, test.optionValue<int>("option #1"));
+    EXPECT_EQ(1.1, test.optionValue<double>("option #2"));
+    EXPECT_EQ("xxx", test.optionValue<std::string>("option #3"));
+}
+
+TEST_F(OptionContainerTest, setOptionValue)
+{
+    OptionContainer test;
+
+    test.addOption("option #1", 99, "description #1");
+    test.addOption("option #2", 1.1, "description #2");
+    test.addOption("option #3", "xxx", "description #3");
+
+    test.setOptionValue("option #1", 88);
+    EXPECT_EQ(88, test.optionValue<int>("option #1"));
+
+    test.setOptionValue("option #2", 2.2);
+    EXPECT_EQ(2.2, test.optionValue<double>("option #2"));
+
+    test.setOptionValue("option #3", "yyy");
+    EXPECT_EQ("yyy", test.optionValue<std::string>("option #3"));
+
+    // setting wrong type to the option
+    EXPECT_THROW(test.setOptionValue("option #1", 99.0), std::runtime_error);
+}
+
+TEST_F(OptionContainerTest, Copying)
+{
+    OptionContainer test;
+
+    test.addOption("option #1", 99, "description #1");
+    test.addOption("option #2", 1.1, "description #2");
+    test.addOption("option #3", "xxx", "description #3");
+
+    // copying and checking values
+    OptionContainer copy(test);
+
+    EXPECT_EQ(99, copy.optionValue<int>("option #1"));
+    EXPECT_EQ(1.1, copy.optionValue<double>("option #2"));
+    EXPECT_EQ("xxx", copy.optionValue<std::string>("option #3"));
+
+    // changing values of copy
+    copy.setOptionValue("option #1", 88);
+    EXPECT_EQ(88, copy.optionValue<int>("option #1"));
+    copy.setOptionValue("option #2", 2.2);
+    EXPECT_EQ(2.2, copy.optionValue<double>("option #2"));
+    copy.setOptionValue("option #3", "yyy");
+    EXPECT_EQ("yyy", copy.optionValue<std::string>("option #3"));
+
+    // checking the value of original
+    EXPECT_EQ(99, test.optionValue<int>("option #1"));
+    EXPECT_EQ(1.1, test.optionValue<double>("option #2"));
+    EXPECT_EQ("xxx", test.optionValue<std::string>("option #3"));
+}
+
+
+TEST_F(OptionContainerTest, Assignment)
+{
+    OptionContainer test;
+
+    test.addOption("option #1", 99, "description #1");
+    test.addOption("option #2", 1.1, "description #2");
+    test.addOption("option #3", "xxx", "description #3");
+
+    // copying and checking values
+    OptionContainer copy;
+    copy = test;
+
+    EXPECT_EQ(99, copy.optionValue<int>("option #1"));
+    EXPECT_EQ(1.1, copy.optionValue<double>("option #2"));
+    EXPECT_EQ("xxx", copy.optionValue<std::string>("option #3"));
+
+    // changing values of copy
+    copy.setOptionValue("option #1", 88);
+    EXPECT_EQ(88, copy.optionValue<int>("option #1"));
+    copy.setOptionValue("option #2", 2.2);
+    EXPECT_EQ(2.2, copy.optionValue<double>("option #2"));
+    copy.setOptionValue("option #3", "yyy");
+    EXPECT_EQ("yyy", copy.optionValue<std::string>("option #3"));
+
+    // checking the value of original
+    EXPECT_EQ(99, test.optionValue<int>("option #1"));
+    EXPECT_EQ(1.1, test.optionValue<double>("option #2"));
+    EXPECT_EQ("xxx", test.optionValue<std::string>("option #3"));
+}
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/RealLimitsTest.h b/Tests/UnitTests/Fit/0/RealLimitsTest.h
new file mode 100644
index 0000000..35d9e26
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/RealLimitsTest.h
@@ -0,0 +1,174 @@
+#ifndef LIMITSTEST_H
+#define LIMITSTEST_H
+
+#include "RealLimits.h"
+#include <limits>
+
+
+class RealLimitsTest : public ::testing::Test
+{
+protected:
+    RealLimitsTest(){}
+    virtual ~RealLimitsTest(){}
+};
+
+
+TEST_F(RealLimitsTest, LimitsInitial)
+{
+    RealLimits limits;
+
+    EXPECT_FALSE(limits.hasLowerLimit());
+    EXPECT_FALSE(limits.hasUpperLimit());
+    EXPECT_FALSE(limits.hasLowerAndUpperLimits());
+}
+
+TEST_F(RealLimitsTest, LimitsSetLimit)
+{
+    RealLimits limits;
+
+    //set limit [-1.0, 10.0[
+    limits.setLimits(-1.0,10.0);
+    EXPECT_TRUE(limits.hasLowerLimit());
+    EXPECT_TRUE(limits.hasUpperLimit());
+    EXPECT_TRUE(limits.hasLowerAndUpperLimits());
+
+    EXPECT_EQ(-1.0,limits.getLowerLimit());
+    EXPECT_EQ(10.0,limits.getUpperLimit());
+
+    EXPECT_FALSE(limits.isInRange(-2.0));
+    EXPECT_TRUE(limits.isInRange(-1.0));
+    EXPECT_TRUE(limits.isInRange(0.0));
+    EXPECT_TRUE(limits.isInRange(9.0));
+    EXPECT_FALSE(limits.isInRange(10.0));
+    EXPECT_FALSE(limits.isInRange(20.0));
+
+    // [inf, -10.0[
+    limits.removeLowerLimit();
+    EXPECT_FALSE(limits.hasLowerAndUpperLimits());
+    EXPECT_FALSE(limits.hasLowerLimit());
+    EXPECT_EQ(0.0,limits.getLowerLimit());
+
+    EXPECT_TRUE(limits.isInRange(-std::numeric_limits<double>::infinity()));
+    EXPECT_TRUE(limits.isInRange(-2.0));
+    EXPECT_TRUE(limits.isInRange(9.0));
+    EXPECT_FALSE(limits.isInRange(10.0));
+    EXPECT_FALSE(limits.isInRange(std::numeric_limits<double>::infinity()));
+
+    // [2.1, -10.0[
+    limits.setLowerLimit(2.1);
+    EXPECT_TRUE(limits.hasLowerLimit());
+    EXPECT_EQ(2.1,limits.getLowerLimit());
+
+    EXPECT_FALSE(limits.isInRange(-std::numeric_limits<double>::infinity()));
+    EXPECT_FALSE(limits.isInRange(2.0));
+    EXPECT_TRUE(limits.isInRange(2.1));
+
+    //[2.1, inf]
+    limits.removeUpperLimit();
+    EXPECT_FALSE(limits.hasLowerAndUpperLimits());
+    EXPECT_FALSE(limits.hasUpperLimit());
+    EXPECT_EQ(0.0,limits.getUpperLimit());
+
+    EXPECT_FALSE(limits.isInRange(-std::numeric_limits<double>::infinity()));
+    EXPECT_FALSE(limits.isInRange(2.0));
+    EXPECT_TRUE(limits.isInRange(2.1));
+    EXPECT_TRUE(limits.isInRange(20.0));
+    EXPECT_TRUE(limits.isInRange(std::numeric_limits<double>::infinity()));
+
+    // [2.1, 2.2[
+    limits.setUpperLimit(2.2);
+    EXPECT_TRUE(limits.hasUpperLimit());
+    EXPECT_EQ(2.2,limits.getUpperLimit());
+    EXPECT_TRUE(limits.hasLowerAndUpperLimits());
+    EXPECT_TRUE(limits.isInRange(2.15));
+    EXPECT_FALSE(limits.isInRange(2.2));
+
+    //remove limit
+    limits.removeLimits();
+    EXPECT_FALSE(limits.hasLowerLimit());
+    EXPECT_FALSE(limits.hasUpperLimit());
+    EXPECT_FALSE(limits.hasLowerAndUpperLimits());
+
+    EXPECT_TRUE(limits.isInRange(-std::numeric_limits<double>::infinity()));
+    EXPECT_TRUE(limits.isInRange(std::numeric_limits<double>::infinity()));
+
+}
+
+TEST_F(RealLimitsTest, LimitsLowerLimited)
+{
+    RealLimits limits = RealLimits::lowerLimited(5.0);
+    EXPECT_TRUE(limits.hasLowerLimit());
+    EXPECT_FALSE(limits.hasUpperLimit());
+    EXPECT_FALSE(limits.hasLowerAndUpperLimits());
+
+    EXPECT_EQ(5.0,limits.getLowerLimit());
+    EXPECT_EQ(0.0,limits.getUpperLimit());
+}
+
+TEST_F(RealLimitsTest, LimitsUpperLimited)
+{
+    RealLimits limits = RealLimits::upperLimited(5.0);
+    EXPECT_FALSE(limits.hasLowerLimit());
+    EXPECT_TRUE(limits.hasUpperLimit());
+    EXPECT_FALSE(limits.hasLowerAndUpperLimits());
+
+    EXPECT_EQ(0.0,limits.getLowerLimit());
+    EXPECT_EQ(5.0,limits.getUpperLimit());
+}
+
+TEST_F(RealLimitsTest, LimitsLimited)
+{
+    RealLimits limits = RealLimits::limited(-10.0, 2.0);
+    EXPECT_TRUE(limits.hasLowerLimit());
+    EXPECT_TRUE(limits.hasUpperLimit());
+    EXPECT_TRUE(limits.hasLowerAndUpperLimits());
+
+    EXPECT_EQ(-10.0,limits.getLowerLimit());
+    EXPECT_EQ(2.0,limits.getUpperLimit());
+}
+
+TEST_F(RealLimitsTest, LimitsLimitless)
+{
+    RealLimits limits = RealLimits::limitless();
+
+    EXPECT_FALSE(limits.hasLowerLimit());
+    EXPECT_FALSE(limits.hasUpperLimit());
+    EXPECT_FALSE(limits.hasLowerAndUpperLimits());
+}
+
+TEST_F(RealLimitsTest, ComparisonOperators)
+{
+    RealLimits lim1 = RealLimits::limited(1.0, 2.0);
+    RealLimits lim2 = RealLimits::limited(1.0, 2.0);
+    EXPECT_TRUE(lim1 == lim2);
+    EXPECT_FALSE(lim1 != lim2);
+
+    RealLimits lim3 = RealLimits::limitless();
+    RealLimits lim4 = RealLimits::limitless();
+    EXPECT_TRUE(lim3 == lim4);
+    EXPECT_FALSE(lim3 != lim4);
+
+    RealLimits lim5 = RealLimits::lowerLimited(1.0);
+    RealLimits lim6 = RealLimits::lowerLimited(1.0);
+    EXPECT_TRUE(lim5 == lim6);
+    EXPECT_FALSE(lim5 != lim6);
+
+    RealLimits lim7 = RealLimits::upperLimited(1.0);
+    RealLimits lim8 = RealLimits::upperLimited(1.0);
+    EXPECT_TRUE(lim7 == lim8);
+    EXPECT_FALSE(lim7 != lim8);
+}
+
+TEST_F(RealLimitsTest, CopyConstructor)
+{
+    RealLimits lim1 = RealLimits::limited(1.0, 2.0);
+    RealLimits lim2 = lim1;
+    EXPECT_TRUE(lim1 == lim2);
+    EXPECT_FALSE(lim1 != lim2);
+
+    RealLimits lim3(lim1);
+    EXPECT_TRUE(lim1 == lim3);
+    EXPECT_FALSE(lim1 != lim3);
+}
+
+#endif
diff --git a/Tests/UnitTests/Fit/0/StringUtilsTest.h b/Tests/UnitTests/Fit/0/StringUtilsTest.h
new file mode 100644
index 0000000..d5e8736
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/StringUtilsTest.h
@@ -0,0 +1,23 @@
+#ifndef STRINGUTILSTEST_H
+#define STRINGUTILSTEST_H
+
+#include "StringUtils.h"
+
+
+class StringUtilsTest : public ::testing::Test
+{
+protected:
+    StringUtilsTest(){}
+    virtual ~StringUtilsTest(){}
+};
+
+
+TEST_F(StringUtilsTest, removeSubstring)
+{
+    std::string target("one two threeone five one");
+    std::string result = Utils::String::removeSubstring(target, "one");
+    EXPECT_EQ(result, " two three five ");
+}
+
+#endif
+
diff --git a/Tests/UnitTests/Fit/0/main.cpp b/Tests/UnitTests/Fit/0/main.cpp
new file mode 100644
index 0000000..78ad33c
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/main.cpp
@@ -0,0 +1,32 @@
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+#include "testlist.h"
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf* new_buffer )
+        : old( std::cerr.rdbuf(new_buffer) )
+    {}
+
+    ~ErrorStreamRedirect() {
+        std::cerr.rdbuf(old);
+    }
+
+private:
+    std::streambuf* old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/Tests/UnitTests/Fit/0/testlist.h b/Tests/UnitTests/Fit/0/testlist.h
new file mode 100644
index 0000000..4a1d90a
--- /dev/null
+++ b/Tests/UnitTests/Fit/0/testlist.h
@@ -0,0 +1,14 @@
+// To renew this file, run /G/ba/dev-tools/code-tools/update-gtestlist.py <directory>
+
+#include "AttLimitsTest.h"
+#include "FitObjectTest.h"
+#include "FitParameterLinkedTest.h"
+#include "FitParameterSetTest.h"
+#include "FitParameterTest.h"
+#include "FitSuiteTest.h"
+#include "MinimizerOptionsTest.h"
+#include "MultiOptionTest.h"
+#include "OptionContainerTest.h"
+#include "RealLimitsTest.h"
+#include "StringUtilsTest.h"
+
diff --git a/Tests/UnitTests/Fit/CMakeLists.txt b/Tests/UnitTests/Fit/CMakeLists.txt
new file mode 100644
index 0000000..048d75e
--- /dev/null
+++ b/Tests/UnitTests/Fit/CMakeLists.txt
@@ -0,0 +1,22 @@
+############################################################################
+# CMakeLists.txt file for building and running unit tests
+############################################################################
+
+include(AddGTest)
+
+include_directories(
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${BornAgainFit_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${Boost_INCLUDE_DIRS}
+    ${RootMinimizers_INCLUDE_DIRS}
+    ${gtest_SOURCE_DIR}
+    ${gtest_SOURCE_DIR}/include
+    )
+if(BORNAGAIN_OPENMPI)
+    include_directories(${MPI_INCLUDE_PATH})
+endif()
+
+set(libs BornAgainCore BornAgainFit)
+ADD_GTEST(Fit "0" "${libs}" 0)
+
diff --git a/Tests/UnitTests/GUI/CMakeLists.txt b/Tests/UnitTests/GUI/CMakeLists.txt
new file mode 100644
index 0000000..e049767
--- /dev/null
+++ b/Tests/UnitTests/GUI/CMakeLists.txt
@@ -0,0 +1,33 @@
+# Here we use QtTest, not gtest ...
+
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+
+file(GLOB source_files "*.cpp")
+file(GLOB include_files "*.h")
+
+find_package(Qt5Widgets REQUIRED)
+
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${BornAgainCore_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${GSL_INCLUDE_DIR}
+    ${BornAgainGUI_INCLUDE_DIRS}
+    ${BornAgainFit_INCLUDE_DIRS}
+)
+
+set(CMAKE_AUTOMOC ON)
+
+add_executable(TestGUI ${source_files} ${include_files})
+
+target_link_libraries(TestGUI ${BornAgainGUI_LIBRARY})
+
+qt5_use_modules(TestGUI Widgets Core Gui Designer PrintSupport Network Test)
+
+# add execution of TestCore just after compilation
+add_custom_target(TestGUI0 ALL DEPENDS TestGUI COMMAND TestGUI)
diff --git a/Tests/UnitTests/GUI/GUICoreObjectCorrespondence.h b/Tests/UnitTests/GUI/GUICoreObjectCorrespondence.h
new file mode 100644
index 0000000..4f4cd61
--- /dev/null
+++ b/Tests/UnitTests/GUI/GUICoreObjectCorrespondence.h
@@ -0,0 +1,31 @@
+#ifndef GUICOREOBJECTCORRESPONDENCE_H
+#define GUICOREOBJECTCORRESPONDENCE_H
+
+#include "SessionItem.h"
+#include "IParameterized.h"
+
+#include <vector>
+#include <string>
+#include <QString>
+
+#include <QtTest>
+
+inline void GUICoreObjectCorrespondence(const SessionItem& gui_object,
+                                 const IParameterized& core_object)
+{
+    // First check if names correspond:
+    QCOMPARE( gui_object.displayName(), QString::fromStdString(core_object.getName()) );
+
+    /* TEMPORARILY DISABLED getParameterPool() 
+    // Now check every parameter name:
+    std::vector<std::string> core_parameter_names
+        = core_object.getParameterPool()->getParameterNames();
+    for (auto name : core_parameter_names) {
+        QString gui_name = QString::fromStdString(name);
+        std::string message = "Parameter not found: " + name;
+        QVERIFY2( gui_object.isTag(gui_name), message.c_str() );
+    }
+    */
+}
+
+#endif // GUICOREOBJECTCORRESPONDENCE_H
diff --git a/Tests/UnitTests/GUI/TestComboProperty.h b/Tests/UnitTests/GUI/TestComboProperty.h
new file mode 100644
index 0000000..a800506
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestComboProperty.h
@@ -0,0 +1,58 @@
+#ifndef TESTCOMBOPROPERTY_H
+#define TESTCOMBOPROPERTY_H
+
+#include <QtTest>
+#include "ComboProperty.h"
+#include <QDebug>
+
+class TestComboProperty : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_ComboEquality();
+    void test_VariantEquality();
+};
+
+inline void TestComboProperty::test_ComboEquality()
+{
+        ComboProperty c1;
+        ComboProperty c2;
+        QVERIFY(c1 == c2);
+
+        c1 << "a1" << "a2";
+        c2 << "a1" << "a2";
+        QVERIFY(c1 == c2);
+
+        c2 << "a3";
+        QVERIFY(c1 != c2);
+        c2.setValue("a2");
+        QVERIFY(c1 != c2);
+
+        c1 << "a3";
+        c1.setValue("a2");
+        QVERIFY(c1 == c2);
+}
+
+inline void TestComboProperty::test_VariantEquality()
+{
+    QVariant v1(1.0);
+    QVariant v2(2.0);
+    QVariant v3(2.0);
+    QVERIFY(v1 != v2);
+    QVERIFY(v2 == v3);
+
+    ComboProperty c1 = ComboProperty() << "a1" << "a2";
+    ComboProperty c2 = ComboProperty() << "a1" << "a2";
+    QVERIFY(c1.getVariant() == c2.getVariant());
+
+    c2 << "a3";
+    QVERIFY(c1.getVariant() != c2.getVariant());
+    c2.setValue("a2");
+    QVERIFY(c1.getVariant() != c2.getVariant());
+
+    c1 << "a3";
+    c1.setValue("a2");
+    QVERIFY(c1.getVariant() == c2.getVariant());
+}
+
+#endif // TESTCOMBOPROPERTY_H
diff --git a/Tests/UnitTests/GUI/TestFTDistributionItems.h b/Tests/UnitTests/GUI/TestFTDistributionItems.h
new file mode 100644
index 0000000..8bdd429
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestFTDistributionItems.h
@@ -0,0 +1,34 @@
+#ifndef TESTFTDISTRIBUTIONITEMS_H
+#define TESTFTDISTRIBUTIONITEMS_H
+
+#include <QtTest>
+#include "TransformToDomain.h"
+#include "TransformFromDomain.h"
+#include "FTDistributions1D.h"
+#include "FTDistributionItems.h"
+
+class TestFTDistributionItems : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_FTDistribution1DCauchy();
+};
+
+
+inline void TestFTDistributionItems::test_FTDistribution1DCauchy()
+{
+    // to domain
+    FTDistribution1DCauchyItem item;
+    item.setItemValue(FTDistribution1DItem::P_CORR_LENGTH, 2.0);
+    FTDistribution1DCauchy *pdf = dynamic_cast<FTDistribution1DCauchy *>(item.createFTDistribution());
+    QVERIFY(pdf->getOmega() == 2.0);
+    delete pdf;
+
+    // from domain
+    FTDistribution1DCauchy pdf2(3.0);
+    FTDistribution1DCauchyItem item2;
+    item2.setItemValue(FTDistribution1DGaussItem::P_CORR_LENGTH, pdf2.getOmega());
+    QVERIFY(item2.getItemValue(FTDistribution1DGaussItem::P_CORR_LENGTH) == 3.0);
+}
+
+#endif // TESTFTDISTRIBUTIONITEMS_H
diff --git a/Tests/UnitTests/GUI/TestFitParameterModel.h b/Tests/UnitTests/GUI/TestFitParameterModel.h
new file mode 100644
index 0000000..98171be
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestFitParameterModel.h
@@ -0,0 +1,244 @@
+#ifndef TESTFITPARAMETERMODEL_H
+#define TESTFITPARAMETERMODEL_H
+
+#include <QtTest>
+#include "JobModel.h"
+#include "FitParameterProxyModel.h"
+#include "FitParameterItems.h"
+#include "FitSuiteItem.h"
+
+class TestFitParameterModel : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_InitialState();
+    void test_addFitParameter();
+    void test_addFitParameterAndLink();
+    void test_addTwoFitParameterAndLinks();
+};
+
+inline void TestFitParameterModel::test_InitialState()
+{
+    JobModel source;
+    SessionItem *fitSuiteItem = source.insertNewItem(Constants::FitSuiteType);
+    SessionItem *container = source.insertNewItem(Constants::FitParameterContainerType, fitSuiteItem->index(), -1, FitSuiteItem::T_FIT_PARAMETERS);
+    FitParameterProxyModel proxy(dynamic_cast<FitParameterContainerItem *>(container));
+
+    QCOMPARE(0, proxy.rowCount(QModelIndex()));
+    QCOMPARE((int)FitParameterProxyModel::MAX_COLUMNS, proxy.columnCount(QModelIndex()));
+    QCOMPARE(container, proxy.itemForIndex(QModelIndex()));
+}
+
+inline void TestFitParameterModel::test_addFitParameter()
+{
+    JobModel source;
+    SessionItem *fitSuiteItem = source.insertNewItem(Constants::FitSuiteType);
+    SessionItem *container = source.insertNewItem(Constants::FitParameterContainerType, fitSuiteItem->index(), -1, FitSuiteItem::T_FIT_PARAMETERS);
+    FitParameterProxyModel proxy(dynamic_cast<FitParameterContainerItem *>(container));
+
+    // adding fit parameter
+    SessionItem *fitPar0 = source.insertNewItem(Constants::FitParameterType, container->index());
+    fitPar0->setDisplayName(QStringLiteral("par"));
+    fitPar0->setItemValue(FitParameterItem::P_MIN, 1.0);
+    fitPar0->setItemValue(FitParameterItem::P_MAX, 2.0);
+    fitPar0->setItemValue(FitParameterItem::P_START_VALUE, 3.0);
+
+    // checking index of root
+    QCOMPARE(1, proxy.rowCount(QModelIndex()));
+    QCOMPARE((int)FitParameterProxyModel::MAX_COLUMNS, proxy.columnCount(QModelIndex()));
+
+    // accessing item at col=0 (original FitParameterItem)
+    QModelIndex index = proxy.index(0, 0, QModelIndex());
+    QCOMPARE(index.row(), 0);
+    QCOMPARE(index.column(), 0);
+    QCOMPARE(proxy.rowCount(index), 0);
+    QCOMPARE(proxy.columnCount(index), 0); // non existing linkItem
+
+    QCOMPARE(fitPar0, proxy.itemForIndex(index));
+    QCOMPARE(fitPar0->displayName(), proxy.data(index).toString());
+    QCOMPARE(index, proxy.indexOfItem(fitPar0));
+
+    // accessing item at col=2
+    index = proxy.index(0, (int)FitParameterProxyModel::PAR_MIN, QModelIndex());
+    QCOMPARE(index.row(), 0);
+    QCOMPARE(index.column(), (int)FitParameterProxyModel::PAR_MIN);
+    QCOMPARE(proxy.rowCount(index), 0);
+    QCOMPARE(proxy.columnCount(index), 0);
+
+    QCOMPARE(fitPar0->getItem(FitParameterItem::P_MIN), proxy.itemForIndex(index));
+    QCOMPARE(fitPar0->getItemValue(FitParameterItem::P_MIN).toDouble(), proxy.data(index).toDouble());
+    QCOMPARE(index, proxy.indexOfItem(fitPar0->getItem(FitParameterItem::P_MIN)));
+
+    // accessing item at col=3
+    index = proxy.index(0, (int)FitParameterProxyModel::PAR_VALUE, QModelIndex());
+    QCOMPARE(index.row(), 0);
+    QCOMPARE(index.column(), (int)FitParameterProxyModel::PAR_VALUE);
+    QCOMPARE(proxy.rowCount(index), 0);
+    QCOMPARE(proxy.columnCount(index), 0);
+
+    QCOMPARE(fitPar0->getItem(FitParameterItem::P_START_VALUE), proxy.itemForIndex(index));
+    QCOMPARE(fitPar0->getItemValue(FitParameterItem::P_START_VALUE).toDouble(), proxy.data(index).toDouble());
+    QCOMPARE(index, proxy.indexOfItem(fitPar0->getItem(FitParameterItem::P_START_VALUE)));
+
+    // accessing item at col=4
+    index = proxy.index(0, (int)FitParameterProxyModel::PAR_MAX, QModelIndex());
+    QCOMPARE(index.row(), 0);
+    QCOMPARE(index.column(), (int)FitParameterProxyModel::PAR_MAX);
+    QCOMPARE(proxy.rowCount(index), 0);
+    QCOMPARE(proxy.columnCount(index), 0);
+
+    QCOMPARE(fitPar0->getItem(FitParameterItem::P_MAX), proxy.itemForIndex(index));
+    QCOMPARE(fitPar0->getItemValue(FitParameterItem::P_MAX).toDouble(), proxy.data(index).toDouble());
+    QCOMPARE(index, proxy.indexOfItem(fitPar0->getItem(FitParameterItem::P_MAX)));
+
+    // ----------------------------------------------------
+    // adding second fit parameter
+    // ----------------------------------------------------
+    SessionItem *fitPar1 = source.insertNewItem(Constants::FitParameterType, container->index());
+    fitPar0->setDisplayName(QStringLiteral("par"));
+    fitPar0->setItemValue(FitParameterItem::P_MIN, 10.0);
+    fitPar0->setItemValue(FitParameterItem::P_MAX, 20.0);
+    fitPar0->setItemValue(FitParameterItem::P_START_VALUE, 30.0);
+
+    // checking index of root
+    QCOMPARE(2, proxy.rowCount(QModelIndex()));
+    QCOMPARE((int)FitParameterProxyModel::MAX_COLUMNS, proxy.columnCount(QModelIndex()));
+
+    // accessing item at col=3 for fitPar0
+    index = proxy.index(0, (int)FitParameterProxyModel::PAR_VALUE, QModelIndex());
+    QCOMPARE(index.row(), 0);
+    QCOMPARE(index.column(), (int)FitParameterProxyModel::PAR_VALUE);
+    QCOMPARE(proxy.rowCount(index), 0);
+    QCOMPARE(proxy.columnCount(index), 0);
+
+    QCOMPARE(fitPar0->getItem(FitParameterItem::P_START_VALUE), proxy.itemForIndex(index));
+    QCOMPARE(fitPar0->getItemValue(FitParameterItem::P_START_VALUE).toDouble(), proxy.data(index).toDouble());
+    QCOMPARE(index, proxy.indexOfItem(fitPar0->getItem(FitParameterItem::P_START_VALUE)));
+
+    // accessing item at col=3 for fitPar1
+    index = proxy.index(1, (int)FitParameterProxyModel::PAR_VALUE, QModelIndex());
+    QCOMPARE(index.row(), 1);
+    QCOMPARE(index.column(), (int)FitParameterProxyModel::PAR_VALUE);
+    QCOMPARE(proxy.rowCount(index), 0);
+    QCOMPARE(proxy.columnCount(index), 0);
+
+    QCOMPARE(fitPar1->getItem(FitParameterItem::P_START_VALUE), proxy.itemForIndex(index));
+    QCOMPARE(fitPar1->getItemValue(FitParameterItem::P_START_VALUE).toDouble(), proxy.data(index).toDouble());
+    QCOMPARE(index, proxy.indexOfItem(fitPar1->getItem(FitParameterItem::P_START_VALUE)));
+}
+
+inline void TestFitParameterModel::test_addFitParameterAndLink()
+{
+    JobModel source;
+    SessionItem *fitSuiteItem = source.insertNewItem(Constants::FitSuiteType);
+    SessionItem *container = source.insertNewItem(Constants::FitParameterContainerType, fitSuiteItem->index(), -1, FitSuiteItem::T_FIT_PARAMETERS);
+    FitParameterProxyModel proxy(dynamic_cast<FitParameterContainerItem *>(container));
+
+    // adding fit parameter
+    SessionItem *fitPar0 = source.insertNewItem(Constants::FitParameterType, container->index());
+    fitPar0->setDisplayName(QStringLiteral("par"));
+    fitPar0->setItemValue(FitParameterItem::P_MIN, 1.0);
+    fitPar0->setItemValue(FitParameterItem::P_MAX, 2.0);
+    fitPar0->setItemValue(FitParameterItem::P_START_VALUE, 3.0);
+
+    // adding link
+    SessionItem *link0 = source.insertNewItem(Constants::FitParameterLinkType, fitPar0->index());
+    link0->setItemValue(FitParameterLinkItem::P_LINK, "link0");
+
+    // checking index of root
+    QCOMPARE(1, proxy.rowCount(QModelIndex()));
+    QCOMPARE((int)FitParameterProxyModel::MAX_COLUMNS, proxy.columnCount(QModelIndex()));
+
+    // accessing item at col=0 (original FitParameterItem)
+    QModelIndex index = proxy.index(0, 0, QModelIndex());
+    QCOMPARE(index.row(), 0);
+    QCOMPARE(index.column(), 0);
+    QCOMPARE(proxy.rowCount(index), 1);
+    QCOMPARE(proxy.columnCount(index), 1); // linkItem
+
+    // testing link0 index
+    QModelIndex linkIndex = proxy.index(0, 0, index);
+    QCOMPARE(linkIndex.row(), 0);
+    QCOMPARE(linkIndex.column(), 0);
+    QCOMPARE(linkIndex.parent(), index);
+    QCOMPARE(proxy.rowCount(linkIndex), 0);
+    QCOMPARE(proxy.columnCount(linkIndex),  0);
+
+    QCOMPARE(proxy.parent(linkIndex), index);
+    QCOMPARE(proxy.itemForIndex(linkIndex), link0->getItem(FitParameterLinkItem::P_LINK));
+
+    QCOMPARE(link0->getItemValue(FitParameterLinkItem::P_LINK).toString(), proxy.data(linkIndex).toString());
+    QCOMPARE(linkIndex, proxy.indexOfItem(link0->getItem(FitParameterLinkItem::P_LINK)));
+
+
+    // adding second link
+    SessionItem *link1 = source.insertNewItem(Constants::FitParameterLinkType, fitPar0->index());
+    link1->setItemValue(FitParameterLinkItem::P_LINK, "link1");
+    QCOMPARE(proxy.rowCount(index), 2);
+    QCOMPARE(proxy.columnCount(index), 1); // linkItem
+
+    linkIndex = proxy.index(1, 0, index);
+    QCOMPARE(linkIndex.row(), 1);
+    QCOMPARE(linkIndex.column(), 0);
+    QCOMPARE(linkIndex.parent(), index);
+    QCOMPARE(proxy.rowCount(linkIndex), 0);
+    QCOMPARE(proxy.columnCount(linkIndex),  0);
+    QCOMPARE(proxy.parent(linkIndex), index);
+
+    QCOMPARE(proxy.parent(linkIndex), index);
+    QCOMPARE(proxy.itemForIndex(linkIndex), link1->getItem(FitParameterLinkItem::P_LINK));
+
+}
+
+inline void TestFitParameterModel::test_addTwoFitParameterAndLinks()
+{
+    JobModel source;
+    SessionItem *fitSuiteItem = source.insertNewItem(Constants::FitSuiteType);
+    SessionItem *container = source.insertNewItem(Constants::FitParameterContainerType, fitSuiteItem->index(), -1, FitSuiteItem::T_FIT_PARAMETERS);
+    FitParameterProxyModel proxy(dynamic_cast<FitParameterContainerItem *>(container));
+
+    // adding fit parameters
+    SessionItem *fitPar0 = source.insertNewItem(Constants::FitParameterType, container->index());
+    SessionItem *link0 = source.insertNewItem(Constants::FitParameterLinkType, fitPar0->index());
+    Q_UNUSED(link0);
+
+    SessionItem *fitPar1 = source.insertNewItem(Constants::FitParameterType, container->index());
+    SessionItem *link1 = source.insertNewItem(Constants::FitParameterLinkType, fitPar1->index());
+    Q_UNUSED(link1);
+
+    // checking index of root
+    QCOMPARE(2, proxy.rowCount(QModelIndex()));
+    QCOMPARE((int)FitParameterProxyModel::MAX_COLUMNS, proxy.columnCount(QModelIndex()));
+
+    // accessing fitPar1
+    QModelIndex index1 = proxy.index(1, 0, QModelIndex());
+    QCOMPARE(index1.row(), 1);
+    QCOMPARE(index1.column(), 0);
+    QCOMPARE(index1.parent(), QModelIndex());
+    QCOMPARE(proxy.rowCount(index1), 1);
+    QCOMPARE(proxy.columnCount(index1), 1);
+
+    QCOMPARE(fitPar1, proxy.itemForIndex(index1));
+    QCOMPARE(fitPar1->displayName(), proxy.data(index1).toString());
+    QCOMPARE(index1, proxy.indexOfItem(fitPar1));
+
+    // accessing link1
+    QModelIndex linkIndex1 = proxy.index(0, 0, index1);
+    QCOMPARE(linkIndex1.row(), 0);
+    QCOMPARE(linkIndex1.column(), 0);
+    qDebug() << "AAA" << index1 << linkIndex1;
+    QCOMPARE(linkIndex1.parent(), index1);
+    QCOMPARE(proxy.rowCount(linkIndex1), 0);
+    QCOMPARE(proxy.columnCount(linkIndex1),  0);
+
+//    QCOMPARE(proxy.parent(linkIndex), index);
+//    QCOMPARE(proxy.itemForIndex(linkIndex), link0->getItem(FitParameterLinkItem::P_LINK));
+
+
+//    QModelIndex linkIndex1 = proxy.index(0, 0, index1);
+
+}
+
+#endif // TESTFITPARAMETERMODEL_H
+
+
diff --git a/Tests/UnitTests/GUI/TestFormFactorItems.h b/Tests/UnitTests/GUI/TestFormFactorItems.h
new file mode 100644
index 0000000..0352121
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestFormFactorItems.h
@@ -0,0 +1,36 @@
+#ifndef TESTFORMFACTORITEMS_H
+#define TESTFORMFACTORITEMS_H
+
+#include <QtTest>
+#include "FormFactors.h"
+#include "FormFactorItems.h"
+#include "TransformToDomain.h"
+#include "TransformFromDomain.h"
+#include "Units.h"
+#include "Numeric.h"
+
+class TestFormFactorItems : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_AnisoPyramidItem();
+};
+
+inline void TestFormFactorItems::test_AnisoPyramidItem()
+{
+    // to domain
+    AnisoPyramidItem item;
+    item.setItemValue(AnisoPyramidItem::P_LENGTH, 20.0);
+    item.setItemValue(AnisoPyramidItem::P_WIDTH, 16.0);
+    item.setItemValue(AnisoPyramidItem::P_HEIGHT, 13.0);
+    item.setItemValue(AnisoPyramidItem::P_ALPHA, 60.0);
+    auto P_ff = item.createFormFactor();
+    FormFactorAnisoPyramid *p_ff = dynamic_cast<FormFactorAnisoPyramid *>(P_ff.get());
+    QVERIFY(p_ff);
+    QVERIFY(p_ff->getLength() == 20.0);
+    QVERIFY(p_ff->getWidth() == 16.0);
+    QVERIFY(p_ff->getHeight() == 13.0);
+    QVERIFY( Numeric::areAlmostEqual(p_ff->getAlpha(), Units::deg2rad(60.0)));
+}
+
+#endif // TESTFORMFACTORITEMS_H
diff --git a/Tests/UnitTests/GUI/TestGUI.cpp b/Tests/UnitTests/GUI/TestGUI.cpp
new file mode 100644
index 0000000..1a89d4b
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestGUI.cpp
@@ -0,0 +1,66 @@
+#include <QtTest>
+#include <QString>
+#include <QDebug>
+#include <QCoreApplication>
+#include "TestMapperCases.h"
+#include "TestFormFactorItems.h"
+#include "TestFTDistributionItems.h"
+#include "TestParameterizedItem.h"
+#include "TestParticleItem.h"
+#include "TestLayerRoughnessItems.h"
+#include "TestParaCrystalItems.h"
+#include "TestSessionModel.h"
+#include "TestSessionItem.h"
+#include "TestGUICoreObjectCorrespondence.h"
+#include "TestMapperForItem.h"
+#include "TestParticleDistributionItem.h"
+#include "TestGUIHelpers.h"
+#include "TestFitParameterModel.h"
+#include "TestMaterialModel.h"
+#include "TestComboProperty.h"
+
+int main(int argc, char** argv) {
+    QCoreApplication app(argc, argv);
+    Q_UNUSED(app);
+
+    QMetaType::registerComparators<ComboProperty>();
+
+    TestFormFactorItems testFormFactorItems;
+    TestFTDistributionItems testFTDistributionItems;
+    TestParameterizedItem testParameterizedItem;
+    TestParticleItem testParticleItem;
+    TestLayerRoughnessItems testLayerRoughnessItems;
+    TestParaCrystalItems testParaCrystalItems;
+    TestSessionModel testSessionModel;
+    TestGUICoreObjectCorrespondence testGUICoreObjectCorrespondence;
+    TestSessionItem testSessionItem;
+    TestMapperCases testMapperCases;
+    TestMapperForItem testMapperForItem;
+    TestParticleDistributionItem testParticleDistributionItem;
+    TestGUIHelpers testGUIHelpers;
+    TestFitParameterModel testFitParameterModel;
+    TestMaterialModel testMaterialModel;
+    TestComboProperty testComboProperty;
+
+    bool status(false);
+
+    status |= QTest::qExec(&testFormFactorItems, argc, argv);
+    status |= QTest::qExec(&testFTDistributionItems, argc, argv);
+    status |= QTest::qExec(&testParameterizedItem, argc, argv);
+    status |= QTest::qExec(&testParticleItem, argc, argv);
+    status |= QTest::qExec(&testLayerRoughnessItems, argc, argv);
+    status |= QTest::qExec(&testParaCrystalItems, argc, argv);
+    status |= QTest::qExec(&testSessionModel, argc, argv);
+    status |= QTest::qExec(&testGUICoreObjectCorrespondence, argc, argv);
+    status |= QTest::qExec(&testSessionItem);
+    status |= QTest::qExec(&testMapperCases, argc, argv);
+    status |= QTest::qExec(&testSessionModel, argc, argv);
+    status |= QTest::qExec(&testMapperForItem, argc, argv);
+    status |= QTest::qExec(&testParticleDistributionItem, argc, argv);
+    status |= QTest::qExec(&testGUIHelpers, argc, argv);
+    status |= QTest::qExec(&testFitParameterModel, argc, argv);
+    status |= QTest::qExec(&testMaterialModel, argc, argv);
+    status |= QTest::qExec(&testComboProperty, argc, argv);
+
+    return status;
+}
diff --git a/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.cpp b/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.cpp
new file mode 100644
index 0000000..1dd4bdd
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.cpp
@@ -0,0 +1,182 @@
+#include "TestGUICoreObjectCorrespondence.h"
+#include "GUICoreObjectCorrespondence.h"
+#include "FormFactors.h"
+#include "InterferenceFunctions.h"
+#include "FormFactorItems.h"
+#include "InterferenceFunctionItems.h"
+#include "Units.h"
+
+void TestGUICoreObjectCorrespondence::test_AnisoPyramid()
+{
+    AnisoPyramidItem gui_anisopyramid;
+    FormFactorAnisoPyramid core_anisopyramid(1.0, 2.0, 0.1, 45.0*Units::degree);
+    GUICoreObjectCorrespondence(gui_anisopyramid, core_anisopyramid);
+}
+
+void TestGUICoreObjectCorrespondence::test_Box()
+{
+    BoxItem gui_box;
+    FormFactorBox core_box(1.0, 1.5, 3.0);
+    GUICoreObjectCorrespondence(gui_box, core_box);
+}
+
+void TestGUICoreObjectCorrespondence::test_Cone()
+{
+    ConeItem gui_cone;
+    FormFactorCone core_cone(1.0, 0.2, 45.0*Units::degree);
+    GUICoreObjectCorrespondence(gui_cone, core_cone);
+}
+
+void TestGUICoreObjectCorrespondence::test_Cone6()
+{
+    Cone6Item gui_cone6;
+    FormFactorCone6 core_cone6(1.0, 0.2, 45.0*Units::degree);
+    GUICoreObjectCorrespondence(gui_cone6, core_cone6);
+}
+
+void TestGUICoreObjectCorrespondence::test_Cuboctahedron()
+{
+    CuboctahedronItem gui_cuboctahedron;
+    FormFactorCuboctahedron core_cuboctahedron(1.0, 0.4, 1.0, 45.0*Units::degree);
+    GUICoreObjectCorrespondence(gui_cuboctahedron, core_cuboctahedron);
+}
+
+void TestGUICoreObjectCorrespondence::test_Dodecahedron()
+{
+    DodecahedronItem gui_dodecahedron;
+    FormFactorDodecahedron core_dodecahedron(3.0);
+    GUICoreObjectCorrespondence(gui_dodecahedron, core_dodecahedron);
+}
+
+void TestGUICoreObjectCorrespondence::test_Cylinder()
+{
+    CylinderItem gui_cylinder;
+    FormFactorCylinder core_cylinder(1.0, 3.0);
+    GUICoreObjectCorrespondence(gui_cylinder, core_cylinder);
+}
+
+void TestGUICoreObjectCorrespondence::test_EllipsoidalCylinder()
+{
+    EllipsoidalCylinderItem gui_ellcylinder;
+    FormFactorEllipsoidalCylinder core_ellcylinder(2.0, 1.0, 1.0);
+    GUICoreObjectCorrespondence(gui_ellcylinder, core_ellcylinder);
+}
+
+void TestGUICoreObjectCorrespondence::test_FullSphere()
+{
+    FullSphereItem gui_sphere;
+    FormFactorFullSphere core_sphere(1.0);
+    GUICoreObjectCorrespondence(gui_sphere, core_sphere);
+}
+
+void TestGUICoreObjectCorrespondence::test_FullSpheroid()
+{
+    FullSpheroidItem gui_spheroid;
+    FormFactorFullSpheroid core_spheroid(1.0, 2.0);
+    GUICoreObjectCorrespondence(gui_spheroid, core_spheroid);
+}
+
+void TestGUICoreObjectCorrespondence::test_HemiEllipsoid()
+{
+    HemiEllipsoidItem gui_hemiellipsoid;
+    FormFactorHemiEllipsoid core_hemiellipsoid(2.0, 1.0, 0.5);
+    GUICoreObjectCorrespondence(gui_hemiellipsoid, core_hemiellipsoid);
+}
+
+void TestGUICoreObjectCorrespondence::test_Icosahedron()
+{
+    IcosahedronItem gui_icosahedron;
+    FormFactorIcosahedron core_icosahedron(8.0);
+    GUICoreObjectCorrespondence(gui_icosahedron, core_icosahedron);
+}
+
+void TestGUICoreObjectCorrespondence::test_Prism3()
+{
+    Prism3Item gui_prism3;
+    FormFactorPrism3 core_prism3(1.0, 2.0);
+    GUICoreObjectCorrespondence(gui_prism3, core_prism3);
+}
+
+void TestGUICoreObjectCorrespondence::test_Prism6()
+{
+    Prism6Item gui_prism6;
+    FormFactorPrism6 core_prism6(1.0, 2.0);
+    GUICoreObjectCorrespondence(gui_prism6, core_prism6);
+}
+
+void TestGUICoreObjectCorrespondence::test_Pyramid()
+{
+    PyramidItem gui_pyramid;
+    FormFactorPyramid core_pyramid(1.0, 0.2, 45.0*Units::degree);
+    GUICoreObjectCorrespondence(gui_pyramid, core_pyramid);
+}
+
+void TestGUICoreObjectCorrespondence::test_Ripple1()
+{
+    Ripple1Item gui_ripple1;
+    FormFactorRipple1 core_ripple1(10.0, 2.0, 1.0);
+    GUICoreObjectCorrespondence(gui_ripple1, core_ripple1);
+}
+
+void TestGUICoreObjectCorrespondence::test_Ripple2()
+{
+    Ripple2Item gui_ripple2;
+    FormFactorRipple2 core_ripple2(10.0, 2.0, 1.0, 0.1);
+    GUICoreObjectCorrespondence(gui_ripple2, core_ripple2);
+}
+
+void TestGUICoreObjectCorrespondence::test_Tetrahedron()
+{
+    TetrahedronItem gui_tetrahedron;
+    FormFactorTetrahedron core_tetrahedron(1.0, 0.1, 45.0*Units::degree);
+    GUICoreObjectCorrespondence(gui_tetrahedron, core_tetrahedron);
+}
+
+void TestGUICoreObjectCorrespondence::test_TruncatedCube()
+{
+    TruncatedCubeItem gui_trunccube;
+    FormFactorTruncatedCube core_trunccube(2.0, 0.2);
+    GUICoreObjectCorrespondence(gui_trunccube, core_trunccube);
+}
+
+void TestGUICoreObjectCorrespondence::test_TruncatedSphere()
+{
+    TruncatedSphereItem gui_truncsphere;
+    FormFactorTruncatedSphere core_truncsphere(1.0, 0.5);
+    GUICoreObjectCorrespondence(gui_truncsphere, core_truncsphere);
+}
+
+void TestGUICoreObjectCorrespondence::test_TruncatedSpheroid()
+{
+    TruncatedSpheroidItem gui_truncspheroid;
+    FormFactorTruncatedSpheroid core_truncspheroid(1.0, 1.5, 1.5);
+    GUICoreObjectCorrespondence(gui_truncspheroid, core_truncspheroid);
+}
+
+void TestGUICoreObjectCorrespondence::test_RadialParacrystal()
+{
+    InterferenceFunctionRadialParaCrystalItem gui_radialparacrystal;
+    InterferenceFunctionRadialParaCrystal core_radialparacrystal(10.0, 1e-6);
+    GUICoreObjectCorrespondence(gui_radialparacrystal, core_radialparacrystal);
+}
+
+void TestGUICoreObjectCorrespondence::test_1DLattice()
+{
+    InterferenceFunction1DLatticeItem gui_1d_lattice;
+    InterferenceFunction1DLattice core_1d_lattice(20.0, 0.0);
+    GUICoreObjectCorrespondence(gui_1d_lattice, core_1d_lattice);
+}
+
+//void TestGUICoreObjectCorrespondence::test_2DParacrystal()
+//{
+//    InterferenceFunction2DParaCrystalItem gui_2d_paracrystal;
+//    InterferenceFunction2DParaCrystal core_2d_paracrystal(10.0, 10.0, 90.0*Units::degree);
+//    GUICoreObjectCorrespondence(gui_2d_paracrystal, core_2d_paracrystal);
+//}
+
+//void TestGUICoreObjectCorrespondence::test_2DLattice()
+//{
+//    InterferenceFunction2DLatticeItem gui_2d_lattice;
+//    InterferenceFunction2DLattice core_2d_lattice(10.0, 10.0, 90.0*Units::degree);
+//    GUICoreObjectCorrespondence(gui_2d_lattice, core_2d_lattice);
+//}
diff --git a/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.h b/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.h
new file mode 100644
index 0000000..3b51d47
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestGUICoreObjectCorrespondence.h
@@ -0,0 +1,41 @@
+#ifndef TESTGUICOREOBJECTCORRESPONDENCE_H
+#define TESTGUICOREOBJECTCORRESPONDENCE_H
+
+#include <QtTest>
+
+class TestGUICoreObjectCorrespondence : public QObject {
+    Q_OBJECT
+
+private slots:
+    // Form factors:
+    void test_AnisoPyramid();
+    void test_Box();
+    void test_Cone();
+    void test_Cone6();
+    void test_Cuboctahedron();
+    void test_Cylinder();
+    void test_Dodecahedron();
+    void test_EllipsoidalCylinder();
+    void test_FullSphere();
+    void test_FullSpheroid();
+    void test_HemiEllipsoid();
+    void test_Icosahedron();
+    void test_Prism3();
+    void test_Prism6();
+    void test_Pyramid();
+    void test_Ripple1();
+    void test_Ripple2();
+    void test_Tetrahedron();
+    void test_TruncatedCube();
+    void test_TruncatedSphere();
+    void test_TruncatedSpheroid();
+
+    // Interference functions:
+    void test_RadialParacrystal();
+    void test_1DLattice();
+    // uncomment the next tests when the lattice parameters are in better correspondence:
+//    void test_2DParacrystal();
+//    void test_2DLattice();
+};
+
+#endif // TESTGUICOREOBJECTCORRESPONDENCE_H
diff --git a/Tests/UnitTests/GUI/TestGUIHelpers.h b/Tests/UnitTests/GUI/TestGUIHelpers.h
new file mode 100644
index 0000000..5ed5c03
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestGUIHelpers.h
@@ -0,0 +1,35 @@
+#ifndef TESTGUIHELPERS_H
+#define TESTGUIHELPERS_H
+
+#include <QtTest>
+#include "GUIHelpers.h"
+
+class TestGUIHelpers : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_VersionString();
+};
+
+inline void TestGUIHelpers::test_VersionString()
+{
+    int vmajor(0), vminor(0), vpatch(0);
+
+    QCOMPARE(true, GUIHelpers::parseVersion(QString("1.5.0"), vmajor, vminor, vpatch));
+    QCOMPARE(1, vmajor);
+    QCOMPARE(5, vminor);
+    QCOMPARE(0, vpatch);
+
+    QCOMPARE(false, GUIHelpers::parseVersion(QString("15.0"), vmajor, vminor, vpatch));
+
+    QString min_version("1.5.0");
+    QCOMPARE(GUIHelpers::isVersionMatchMinimal("1.5.0", min_version), true);
+    QCOMPARE(GUIHelpers::isVersionMatchMinimal("1.5.1", min_version), true);
+    QCOMPARE(GUIHelpers::isVersionMatchMinimal("1.6.0", min_version), true);
+    QCOMPARE(GUIHelpers::isVersionMatchMinimal("2.4.9", min_version), true);
+
+    QCOMPARE(GUIHelpers::isVersionMatchMinimal("1.4.9", min_version), false);
+    QCOMPARE(GUIHelpers::isVersionMatchMinimal("0.6.9", min_version), false);
+}
+
+#endif // TESTGUIHELPERS_H
diff --git a/Tests/UnitTests/GUI/TestLayerRoughnessItems.h b/Tests/UnitTests/GUI/TestLayerRoughnessItems.h
new file mode 100644
index 0000000..bb36f72
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestLayerRoughnessItems.h
@@ -0,0 +1,46 @@
+#ifndef TESTLAYERROUGHNESSITEMS_H
+#define TESTLAYERROUGHNESSITEMS_H
+
+#include <QtTest>
+#include "LayerRoughness.h"
+#include "LayerRoughnessItems.h"
+#include "TransformToDomain.h"
+#include "TransformFromDomain.h"
+
+class TestLayerRoughnessItems : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_LayerRoughnessToDomain();
+    void test_LayerRoughnessFromDomain();
+};
+
+inline void TestLayerRoughnessItems::test_LayerRoughnessToDomain()
+{
+    LayerBasicRoughnessItem roughnessItem;
+    roughnessItem.setItemValue(LayerBasicRoughnessItem::P_SIGMA, 10.0);
+    roughnessItem.setItemValue(LayerBasicRoughnessItem::P_HURST, 20.0);
+    roughnessItem.setItemValue(LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH, 30.0);
+
+    auto P_roughness = TransformToDomain::createLayerRoughness(roughnessItem);
+    QCOMPARE(P_roughness->getSigma(), roughnessItem.getItemValue(LayerBasicRoughnessItem::P_SIGMA).toDouble());
+    QCOMPARE(P_roughness->getHurstParameter(), roughnessItem.getItemValue(LayerBasicRoughnessItem::P_HURST).toDouble());
+    QCOMPARE(P_roughness->getLatteralCorrLength(), roughnessItem.getItemValue(LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH).toDouble());
+
+    LayerZeroRoughnessItem zeroRoughnessItem;
+    QVERIFY(TransformToDomain::createLayerRoughness(zeroRoughnessItem) == nullptr);
+}
+
+inline void TestLayerRoughnessItems::test_LayerRoughnessFromDomain()
+{
+    LayerRoughness roughness(10.0, 20.0, 30.0);
+    LayerBasicRoughnessItem roughnessItem;
+    TransformFromDomain::setItemFromSample(&roughnessItem, &roughness);
+    QCOMPARE(roughness.getSigma(), roughnessItem.getItemValue(LayerBasicRoughnessItem::P_SIGMA).toDouble());
+    QCOMPARE(roughness.getHurstParameter(), roughnessItem.getItemValue(LayerBasicRoughnessItem::P_HURST).toDouble());
+    QCOMPARE(roughness.getLatteralCorrLength(), roughnessItem.getItemValue(LayerBasicRoughnessItem::P_LATERAL_CORR_LENGTH).toDouble());
+}
+
+
+#endif // TESTLAYERROUGHNESSITEMS_H
+
diff --git a/Tests/UnitTests/GUI/TestMapperCases.h b/Tests/UnitTests/GUI/TestMapperCases.h
new file mode 100644
index 0000000..3dbcea1
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestMapperCases.h
@@ -0,0 +1,124 @@
+#ifndef TESTMAPPERCASES_H
+#define TESTMAPPERCASES_H
+
+#include "SessionItem.h"
+#include "SampleModel.h"
+#include "InstrumentModel.h"
+#include "item_constants.h"
+#include "ParticleItem.h"
+#include "ParticleCompositionItem.h"
+#include "InterferenceFunctionItems.h"
+#include "ParticleLayoutItem.h"
+#include "DetectorItems.h"
+#include "ComboProperty.h"
+#include "DocumentModel.h"
+#include "SimulationOptionsItem.h"
+#include <memory>
+#include <QtTest>
+
+class TestMapperCases : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_ParticeleCompositionUpdate();
+    void test_Inference2DRotationAngleToggle();
+    void test_instrumentAlignmentPropertyVisibility();
+    void test_removeMaskOnDetectorChange();
+    void test_SimulationOptionsComputationToggle();
+};
+
+inline void TestMapperCases::test_ParticeleCompositionUpdate()
+{
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, multilayer->index());
+    SessionItem *layout = model.insertNewItem(Constants::ParticleLayoutType, layer->index());
+
+    // composition added to layout should have abundance enabled
+    SessionItem *compositionFree = model.insertNewItem(Constants::ParticleCompositionType, layout->index());
+    QVERIFY(compositionFree->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
+
+    // composition added to distribution should have abundance disabled
+    SessionItem *distribution = model.insertNewItem(Constants::ParticleDistributionType, layout->index());
+    SessionItem *composition = model.insertNewItem(Constants::ParticleCompositionType, distribution->index());
+    QVERIFY(composition->getItem(ParticleItem::P_ABUNDANCE)->isEnabled() == false);
+
+    composition = distribution->takeRow(composition->parentRow());
+    QVERIFY(composition->getItem(ParticleItem::P_ABUNDANCE)->isEnabled());
+    delete composition;
+
+}
+
+inline void TestMapperCases::test_Inference2DRotationAngleToggle()
+{
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, multilayer->index());
+    SessionItem *layout = model.insertNewItem(Constants::ParticleLayoutType, layer->index());
+
+    SessionItem *inference = model.insertNewItem(Constants::InterferenceFunction2DParaCrystalType,
+                                                       layout->index(), -1, ParticleLayoutItem::T_INTERFERENCE);
+
+    // rotation (xi) should be disabled if integration is on
+    inference->setItemValue(InterferenceFunction2DParaCrystalItem::P_XI_INTEGRATION, true);
+    QVERIFY(inference->getItem(InterferenceFunction2DParaCrystalItem::P_ROTATION_ANGLE)->isEnabled() == false);
+
+    // rotation (xi) should be enabled if integration is off
+    inference->setItemValue(InterferenceFunction2DParaCrystalItem::P_XI_INTEGRATION, false);
+    QVERIFY(!inference->getItem(InterferenceFunction2DParaCrystalItem::P_ROTATION_ANGLE)->isEnabled() == false);
+
+}
+
+inline void TestMapperCases::test_instrumentAlignmentPropertyVisibility()
+{
+    InstrumentModel model;
+    SessionItem *instrument = model.insertNewItem(Constants::InstrumentType);
+    SessionItem *detector = model.insertNewItem(Constants::DetectorType, instrument->index());
+    detector->setGroupProperty(DetectorItem::P_DETECTOR, Constants::RectangularDetectorType);
+    SessionItem *rectangular = detector->getGroupItem(DetectorItem::P_DETECTOR);
+
+
+    ComboProperty alignment = rectangular->getItemValue(RectangularDetectorItem::P_ALIGNMENT)
+            .value<ComboProperty>();
+    // generic has some more items visible
+    alignment.setValue(Constants::ALIGNMENT_GENERIC);
+    rectangular->setItemValue(RectangularDetectorItem::P_ALIGNMENT, QVariant::fromValue<ComboProperty>(alignment));
+    QVERIFY(rectangular->getItem(RectangularDetectorItem::P_NORMAL)->isVisible());
+
+    // should be disabled if we switch
+    alignment.setValue(Constants::ALIGNMENT_TO_REFLECTED_BEAM);
+    rectangular->setItemValue(RectangularDetectorItem::P_ALIGNMENT, QVariant::fromValue<ComboProperty>(alignment));
+    QVERIFY(rectangular->getItem(RectangularDetectorItem::P_NORMAL)->isVisible() == false);
+
+}
+
+inline void TestMapperCases::test_removeMaskOnDetectorChange()
+{
+    InstrumentModel model;
+    SessionItem *instrument = model.insertNewItem(Constants::InstrumentType);
+    SessionItem *detector = model.insertNewItem(Constants::DetectorType, instrument->index());
+    detector->setGroupProperty(DetectorItem::P_DETECTOR, Constants::RectangularDetectorType);
+    model.insertNewItem(Constants::MaskContainerType, detector->index());
+    QVERIFY(detector->getItems(DetectorItem::T_MASKS).size() == 1);
+    // after change the mask container should be removed
+    detector->setGroupProperty(DetectorItem::P_DETECTOR, Constants::SphericalDetectorType);
+    QVERIFY(detector->getItems(DetectorItem::T_MASKS).size() == 0);
+}
+
+inline void TestMapperCases::test_SimulationOptionsComputationToggle()
+{
+    DocumentModel model;
+    model.insertNewItem(Constants::SimulationOptionsType);
+
+    SimulationOptionsItem *item = model.getSimulationOptionsItem();
+
+    ComboProperty combo = item->getItemValue(SimulationOptionsItem::P_COMPUTATION_METHOD).value<ComboProperty>();
+    QCOMPARE(combo.getValue(), Constants::SIMULATION_ANALYTICAL);
+    QVERIFY(item->getItem(SimulationOptionsItem::P_MC_POINTS)->isEnabled() == false);
+
+    combo.setValue(Constants::SIMULATION_MONTECARLO);
+    item->setItemValue(SimulationOptionsItem::P_COMPUTATION_METHOD, combo.getVariant());
+    QVERIFY(item->getItem(SimulationOptionsItem::P_MC_POINTS)->isEnabled() == true);
+}
+
+#endif // TESTMAPPERCASES_H
diff --git a/Tests/UnitTests/GUI/TestMapperForItem.h b/Tests/UnitTests/GUI/TestMapperForItem.h
new file mode 100644
index 0000000..ae9e75a
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestMapperForItem.h
@@ -0,0 +1,347 @@
+#ifndef TESTMAPPERFORITEM_H
+#define TESTMAPPERFORITEM_H
+
+#include "SessionItem.h"
+#include "SampleModel.h"
+#include "LayerItem.h"
+#include "MultiLayerItem.h"
+#include "item_constants.h"
+#include <memory>
+#include <QtTest>
+
+
+//! Test Widget which logs calling activity of ModelMapper
+class Widget {
+public:
+    Widget()
+        : m_onPropertyChangeCount(0)
+        , m_onChildPropertyChangeCount(0)
+        , m_onParentChangeCount(0)
+        , m_onChildrenChangeCount(0)
+        , m_onSiblingsChangeCount(0)
+    { }
+
+    void clear()
+    {
+        m_onPropertyChangeCount = 0;
+        m_onChildPropertyChangeCount = 0;
+        m_onParentChangeCount = 0;
+        m_onChildrenChangeCount = 0;
+        m_onSiblingsChangeCount = 0;
+        m_reported_items.clear();
+        m_reported_names.clear();
+    }
+
+    void subscribe(ModelMapper *mapper, bool with_subscription = false)
+    {
+        clear();
+
+        void *caller = (with_subscription ? this : 0);
+
+        mapper->setOnPropertyChange(
+                    [this] (QString name)
+        {
+            onPropertyChange(name);
+        }, caller);
+
+        mapper->setOnChildPropertyChange(
+                    [this](SessionItem* item, QString name)
+        {
+            onChildPropertyChange(item, name);
+        }, caller);
+
+        mapper->setOnParentChange(
+                    [this](SessionItem *parent) {
+            onParentChange(parent);
+        }, caller);
+
+
+        mapper->setOnChildrenChange(
+                    [this](SessionItem*)
+        {
+            onChildrenChange();
+        }, caller);
+
+        mapper->setOnSiblingsChange(
+                    [this]()
+        {
+            onSiblingsChange();
+        }, caller);
+
+    }
+
+    void onPropertyChange(const QString &name)
+    {
+        m_reported_names.append(name);
+        m_onPropertyChangeCount++;
+    }
+
+    void onChildPropertyChange(SessionItem *item, const QString &name)
+    {
+        m_reported_items.append(item);
+        m_reported_names.append(name);
+        m_onChildPropertyChangeCount++;
+    }
+
+    void onParentChange(SessionItem *item)
+    {
+        m_reported_items.append(item);
+        m_onParentChangeCount++;
+    }
+
+    void onChildrenChange()
+    {
+        m_onChildrenChangeCount++;
+    }
+
+    void onSiblingsChange()
+    {
+        m_onSiblingsChangeCount++;
+    }
+
+    void unsubscribe(ModelMapper *mapper) {
+        mapper->unsubscribe(this);
+    }
+
+    int m_onPropertyChangeCount;
+    int m_onChildPropertyChangeCount;
+    int m_onParentChangeCount;
+    int m_onChildrenChangeCount;
+    int m_onSiblingsChangeCount;
+    QList<SessionItem *> m_reported_items;
+    QStringList m_reported_names;
+};
+
+
+//! Test if ModelMapper reports correctly (number of callbacks,
+//! names of properties and reporting items)
+class TestMapperForItem : public QObject {
+    Q_OBJECT
+
+public:
+    TestMapperForItem(QObject *parent = 0)
+        : QObject(parent)
+        , m_mapped_item(0)
+    { }
+
+    void setItem(SessionItem *item, Widget *widget = 0, bool with_subscription = false)
+    {
+        m_mapped_item = item;
+        m_mapper.reset(new ModelMapper);
+        m_mapper->setItem(item);
+        if(widget) widget->subscribe(m_mapper.get(), with_subscription);
+    }
+
+private:
+    SessionItem *m_mapped_item;
+    std::unique_ptr<ModelMapper> m_mapper;
+
+private slots:
+    void test_initialCondition();
+    void test_onPropertyChange();
+    void test_onParentChange();
+    void test_onChildrenChange();
+    void test_onSiblingsChange();
+    void test_Subscription();
+    void test_TwoWidgetsSubscription();
+};
+
+inline void TestMapperForItem::test_initialCondition()
+{
+    Widget w;
+    QCOMPARE(w.m_onPropertyChangeCount, 0);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 0);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    QCOMPARE(w.m_onSiblingsChangeCount, 0);
+    QVERIFY(w.m_reported_items.isEmpty());
+    QVERIFY(w.m_reported_names.isEmpty());
+    QVERIFY(m_mapped_item == nullptr);
+    QVERIFY(!m_mapper);
+}
+
+inline void TestMapperForItem::test_onPropertyChange()
+{
+    Widget w;
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+
+    // Mapper is looking on child; set property of child
+    setItem(layer, &w);
+    QVERIFY(m_mapped_item == layer);
+
+    layer->setItemValue(LayerItem::P_THICKNESS, 1.0);
+    QCOMPARE(w.m_onPropertyChangeCount, 1);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 0);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    QCOMPARE(w.m_onSiblingsChangeCount, 0);
+    QVERIFY(w.m_reported_items.isEmpty());
+    QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == LayerItem::P_THICKNESS));
+
+    // Mapper is looking on child; set property of parent;
+    setItem(layer, &w);
+    QVERIFY(m_mapped_item == layer);
+    multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 1.0);
+    QCOMPARE(w.m_onPropertyChangeCount, 0);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 0);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    QCOMPARE(w.m_onSiblingsChangeCount, 0);
+    QVERIFY(w.m_reported_items.isEmpty());
+    QVERIFY(w.m_reported_names.isEmpty());
+
+    // Mapper is looking on parent; set property of child;
+    setItem(multilayer, &w);
+    QVERIFY(m_mapped_item == multilayer);
+    layer->setItemValue(LayerItem::P_THICKNESS, 2.0);
+    QCOMPARE(w.m_onPropertyChangeCount, 0);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 1);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    QCOMPARE(w.m_onSiblingsChangeCount, 0);
+    QVERIFY( (w.m_reported_items.size() == 1) && (w.m_reported_items[0] == layer));
+    QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == LayerItem::P_THICKNESS));
+
+    // Mapper is looking on parent; set property of parent;
+    setItem(multilayer, &w);
+    QVERIFY(m_mapped_item == multilayer);
+    multilayer->setItemValue(MultiLayerItem::P_CROSS_CORR_LENGTH, 2.0);
+    QCOMPARE(w.m_onPropertyChangeCount, 1);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 0);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    QCOMPARE(w.m_onSiblingsChangeCount, 0);
+    QVERIFY(w.m_reported_items.isEmpty());
+    QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == MultiLayerItem::P_CROSS_CORR_LENGTH));
+}
+
+inline void TestMapperForItem::test_onParentChange()
+{
+    Widget w;
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+//    SessionItem *layer = model.insertNewItem(Constants::LayerType);
+
+    // Mapper is looking on child; changing child's parent
+    setItem(layer, &w);
+    QVERIFY(m_mapped_item == layer);
+    multilayer->takeRow(layer->parentRow());
+//    model.moveParameterizedItem(layer, multilayer);
+    // FIXME check onParentChange while moving an item
+
+    QCOMPARE(w.m_onPropertyChangeCount, 0);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 0);
+    QCOMPARE(w.m_onParentChangeCount, 1);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    //QVERIFY((w.m_reported_items.size() == 1) && (w.m_reported_items[0] == nullptr));
+    QVERIFY(w.m_reported_names.isEmpty());
+}
+
+inline void TestMapperForItem::test_onChildrenChange()
+{
+    Widget w;
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+
+    // Mapper is looking on parent; adding new child to parent
+    setItem(multilayer, &w);
+    QVERIFY(m_mapped_item == multilayer);
+    model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+
+    QCOMPARE(w.m_onPropertyChangeCount, 0);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 2);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 1);
+    QCOMPARE(w.m_onSiblingsChangeCount, 0);
+    QCOMPARE(w.m_reported_items.size(), 2);
+    QCOMPARE(w.m_reported_names.size(), 2);
+}
+
+inline void TestMapperForItem::test_onSiblingsChange()
+{
+    Widget w;
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+
+    // Mapper is looking on child; adding another child to parent
+    setItem(layer, &w);
+    QVERIFY(m_mapped_item == layer);
+    SessionItem *layer2 = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+    Q_UNUSED(layer2);
+
+    QCOMPARE(w.m_onPropertyChangeCount, 0);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 0);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    QCOMPARE(w.m_onSiblingsChangeCount, 1);
+    QVERIFY(w.m_reported_items.isEmpty());
+    QVERIFY(w.m_reported_names.isEmpty());
+
+    multilayer->takeItem(1, MultiLayerItem::T_LAYERS);
+    QCOMPARE(w.m_onSiblingsChangeCount, 2);
+
+    // FIXME
+//    multilayer->takeRow(layer2->parentRow());
+    //    QCOMPARE(m_onSiblingsChangeCount, 2);
+}
+
+inline void TestMapperForItem::test_Subscription()
+{
+    Widget w;
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+
+    // Mapper is looking on child; set property of child
+    setItem(layer, &w, true);
+    QVERIFY(m_mapped_item == layer);
+    layer->setItemValue(LayerItem::P_THICKNESS, 1.0);
+    QCOMPARE(w.m_onPropertyChangeCount, 1);
+    QCOMPARE(w.m_onChildPropertyChangeCount, 0);
+    QCOMPARE(w.m_onParentChangeCount, 0);
+    QCOMPARE(w.m_onChildrenChangeCount, 0);
+    QCOMPARE(w.m_onSiblingsChangeCount, 0);
+    QVERIFY(w.m_reported_items.isEmpty());
+    QVERIFY((w.m_reported_names.size() == 1) && (w.m_reported_names[0] == LayerItem::P_THICKNESS));
+
+    layer->setItemValue(LayerItem::P_THICKNESS, 2.0);
+    QCOMPARE(w.m_onPropertyChangeCount, 2);
+
+    // unsubscribe widget and check that it doesn't react on item value change
+    w.unsubscribe(m_mapper.get());
+    layer->setItemValue(LayerItem::P_THICKNESS, 3.0);
+    QCOMPARE(w.m_onPropertyChangeCount, 2);
+}
+
+inline void TestMapperForItem::test_TwoWidgetsSubscription()
+{
+    Widget w1, w2;
+    SampleModel model;
+    SessionItem *multilayer = model.insertNewItem(Constants::MultiLayerType);
+    SessionItem *layer = model.insertNewItem(Constants::LayerType, model.indexOfItem(multilayer));
+
+    // Mapper is looking on child; set property of child
+    setItem(layer);
+    w1.subscribe(m_mapper.get(), true);
+    w2.subscribe(m_mapper.get(), true);
+    QCOMPARE(w1.m_onPropertyChangeCount, 0);
+    QCOMPARE(w2.m_onPropertyChangeCount, 0);
+
+    layer->setItemValue(LayerItem::P_THICKNESS, 1.0);
+    QCOMPARE(w1.m_onPropertyChangeCount, 1);
+    QCOMPARE(w2.m_onPropertyChangeCount, 1);
+
+    w1.unsubscribe(m_mapper.get());
+    layer->setItemValue(LayerItem::P_THICKNESS, 2.0);
+    QCOMPARE(w1.m_onPropertyChangeCount, 1);
+    QCOMPARE(w2.m_onPropertyChangeCount, 2);
+
+}
+
+
+
+#endif // TESTMAPPERFORITEM_H
diff --git a/Tests/UnitTests/GUI/TestMaterialModel.h b/Tests/UnitTests/GUI/TestMaterialModel.h
new file mode 100644
index 0000000..7ae4b8d
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestMaterialModel.h
@@ -0,0 +1,71 @@
+#ifndef TESTMATERIALMODEL_H
+#define TESTMATERIALMODEL_H
+
+#include "MaterialModel.h"
+#include "MaterialItem.h"
+#include "RefractiveIndexItem.h"
+#include <QtTest>
+#include <memory>
+
+class TestMaterialModel : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_addMaterial();
+    void test_cloneMaterial();
+};
+
+inline void TestMaterialModel::test_addMaterial()
+{
+    std::unique_ptr<MaterialModel> model(new MaterialModel);
+
+    QCOMPARE(model->rowCount(QModelIndex()), 0);
+
+    const double delta(0.2), beta(0.1);
+    const QString name("MaterialName");
+    MaterialItem *item = model->addMaterial(name, delta, beta);
+
+    QCOMPARE(model->rowCount(QModelIndex()), 1);
+    QCOMPARE(model->itemForIndex(item->index()), item);
+    QCOMPARE(model->rowCount(QModelIndex()), 1);
+
+    QCOMPARE(item->itemName(), name);
+    const RefractiveIndexItem *refIndex = dynamic_cast<const RefractiveIndexItem *>(
+        item->getItem(MaterialItem::P_REFRACTIVE_INDEX));
+    QCOMPARE(refIndex->getDelta(), delta);
+    QCOMPARE(refIndex->getBeta(), beta);
+
+}
+
+inline void TestMaterialModel::test_cloneMaterial()
+{
+    std::unique_ptr<MaterialModel> model(new MaterialModel);
+
+    QCOMPARE(model->rowCount(QModelIndex()), 0);
+
+    const double delta(0.2), beta(0.1);
+    const QString name("MaterialName");
+    MaterialItem *item = model->addMaterial(name, delta, beta);
+    const QString origIdentifier = item->getIdentifier();
+
+    MaterialItem *clonedMaterial = model->cloneMaterial(item->index());
+    QCOMPARE(model->rowCount(QModelIndex()), 2);
+
+    // clone should not change identifier of original material (as it once happened)
+    QCOMPARE(item->getIdentifier(), origIdentifier);
+
+    // cloned material should have different identifier
+    QVERIFY(clonedMaterial->getIdentifier() != item->getIdentifier());
+
+    // checking name of cloned material
+    QCOMPARE(item->itemName()+" (clone)", clonedMaterial->itemName());
+
+    const RefractiveIndexItem *refIndex = dynamic_cast<const RefractiveIndexItem *>(
+        clonedMaterial->getItem(MaterialItem::P_REFRACTIVE_INDEX));
+    QCOMPARE(refIndex->getDelta(), delta);
+    QCOMPARE(refIndex->getBeta(), beta);
+
+
+}
+
+#endif // TESTMATERIALMODEL_H
diff --git a/Tests/UnitTests/GUI/TestParaCrystalItems.h b/Tests/UnitTests/GUI/TestParaCrystalItems.h
new file mode 100644
index 0000000..45def0f
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestParaCrystalItems.h
@@ -0,0 +1,68 @@
+#ifndef TESTPARACRYSTALITEMS_H
+#define TESTPARACRYSTALITEMS_H
+
+#include <QtTest>
+#include "InterferenceFunctionItems.h"
+#include "GroupProperty.h"
+
+class TestParaCrystalItems : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_Para1D_InitialState();
+    void test_Para1D_PDFGroupProperty();
+
+};
+
+inline void TestParaCrystalItems::test_Para1D_InitialState()
+{
+    InterferenceFunctionRadialParaCrystalItem item;
+    QCOMPARE(item.modelType(), Constants::InterferenceFunctionRadialParaCrystalType);
+    QCOMPARE(item.itemName(), Constants::InterferenceFunctionRadialParaCrystalType);
+    QCOMPARE(item.getChildrenOfType(Constants::GroupItemType).size(), 1);
+
+    QCOMPARE(item.getItemValue(InterferenceFunctionRadialParaCrystalItem::P_PEAK_DISTANCE).toDouble(), 20.0*Units::nanometer);
+    QCOMPARE(item.getItemValue(InterferenceFunctionRadialParaCrystalItem::P_DAMPING_LENGTH).toDouble(), 1000.0*Units::micrometer);
+    QCOMPARE(item.getItemValue(InterferenceFunctionRadialParaCrystalItem::P_DOMAIN_SIZE).toDouble(), 20.0*Units::micrometer);
+    QCOMPARE(item.getItemValue(InterferenceFunctionRadialParaCrystalItem::P_KAPPA).toDouble(), 0.0);
+
+    QCOMPARE(item.getGroupItem(InterferenceFunctionRadialParaCrystalItem::P_PDF)->modelType(), Constants::FTDistribution1DCauchyType);
+}
+
+inline void TestParaCrystalItems::test_Para1D_PDFGroupProperty()
+{
+    InterferenceFunctionRadialParaCrystalItem item;
+
+    // check that request for new subItem generates item of correct modelType and
+    // correct signals (one propertyItemChanged, and no propertyChanged)
+    QStringList pdfs;
+    pdfs << Constants::FTDistribution1DCauchyType
+         << Constants::FTDistribution1DGaussType
+         << Constants::FTDistribution1DGateType
+         << Constants::FTDistribution1DTriangleType
+         << Constants::FTDistribution1DCosineType
+         << Constants::FTDistribution1DVoigtType;
+
+    foreach(QString pdf_name, pdfs) {
+//        QSignalSpy spyItem(&item, SIGNAL(propertyChanged(QString)));
+//        QSignalSpy spyPropertyItem(&item, SIGNAL(subItemChanged(QString)));
+        SessionItem *pdfItem = item.setGroupProperty(InterferenceFunctionRadialParaCrystalItem::P_PDF, pdf_name);
+        QVERIFY(pdfItem);
+        QCOMPARE(item.getChildrenOfType(Constants::GroupItemType).size(), 1);
+        QCOMPARE(pdfItem, item.getGroupItem(InterferenceFunctionRadialParaCrystalItem::P_PDF));
+
+//        QCOMPARE(spyItem.count(), 0);
+        if(pdf_name == Constants::FTDistribution1DCauchyType) { // default ff
+//            QCOMPARE(spyPropertyItem.count(), 0);
+        } else {
+//            QCOMPARE(spyPropertyItem.count(), 1);
+//            QList<QVariant> arguments = spyPropertyItem.takeFirst(); // take the first signal
+//            QCOMPARE(arguments.at(0).toString(), InterferenceFunctionRadialParaCrystalItem::P_PDF);
+        }
+
+        QCOMPARE(pdfItem->modelType(), pdf_name);
+    }
+}
+
+#endif // TESTPARACRYSTALITEMS_H
+
diff --git a/Tests/UnitTests/GUI/TestParameterizedItem.h b/Tests/UnitTests/GUI/TestParameterizedItem.h
new file mode 100644
index 0000000..a4ab279
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestParameterizedItem.h
@@ -0,0 +1,74 @@
+#ifndef TESTPARAMETERIZEDITEM_H
+#define TESTPARAMETERIZEDITEM_H
+
+
+#include <QtTest>
+#include "SessionItem.h"
+#include "GUIHelpers.h"
+#include "verify_throw_macro.h"
+
+
+
+class TestParameterizedItem : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_registerProperty();
+    void test_SelectableGroupProperty();
+};
+
+inline void TestParameterizedItem::test_registerProperty()
+{
+    SessionItem item("Modeltype");
+    QString property_name("MyProperty");
+    double value(1.0);
+//    QSignalSpy spy(&item, SIGNAL(propertyChanged(QString)));
+
+    // access non-existing property
+    QCOMPARE(false, item.isTag(property_name));
+//    QVERIFY_THROW(item.getRegisteredProperty(property_name), GUIHelpers::Error);
+//    QVERIFY_THROW(item.setRegisteredProperty(property_name, value), GUIHelpers::Error);
+
+    // registering new property
+    item.addProperty(property_name, value);
+    QCOMPARE(true, item.isTag(property_name));
+//    QCOMPARE(spy.count(), 1);
+//    QList<QVariant> arguments = spy.takeFirst();
+//    QCOMPARE(arguments.size(), 1);
+//    QCOMPARE(arguments.at(0).toString(), property_name);
+    QCOMPARE(item.getItemValue(property_name).toDouble(), value);
+//    QCOMPARE(spy.count(), 0);
+
+    // setting property value
+    double new_value(2.0);
+    item.setItemValue(property_name, new_value);
+//    QCOMPARE(spy.count(), 1);
+//    arguments = spy.takeFirst();
+//    QCOMPARE(arguments.size(), 1);
+//    QCOMPARE(arguments.at(0).toString(), property_name);
+    QCOMPARE(item.getItemValue(property_name).toDouble(), new_value);
+
+    // setting property value to wrong QVariant
+    QVERIFY_THROW(item.setItemValue(property_name, QString("aaa")), GUIHelpers::Error);
+
+    // attempt to register already existing property
+//    QVERIFY_THROW(item.registerProperty(property_name, 1.0), GUIHelpers::Error);
+
+    // remove registered property
+//    item.removeRegisteredProperty(property_name);
+//    QCOMPARE(spy.count(), 1);
+//    arguments = spy.takeFirst();
+//    QCOMPARE(arguments.size(), 1);
+//    QCOMPARE(arguments.at(0).toString(), property_name);
+//    QVERIFY_THROW(item.getRegisteredProperty(property_name), GUIHelpers::Error);
+}
+
+inline void TestParameterizedItem::test_SelectableGroupProperty()
+{
+//    SessionItem item;
+//    QCOMPARE(item.getSubItems().size(), 0);
+}
+
+
+#endif // TESTPARAMETERIZEDITEM_H
+
diff --git a/Tests/UnitTests/GUI/TestParticleDistributionItem.h b/Tests/UnitTests/GUI/TestParticleDistributionItem.h
new file mode 100644
index 0000000..007f6e3
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestParticleDistributionItem.h
@@ -0,0 +1,56 @@
+#ifndef TESTPARTICLEDISTRIBUTIONITEM_H
+#define TESTPARTICLEDISTRIBUTIONITEM_H
+
+
+#include <QtTest>
+#include "SampleModel.h"
+#include "ParticleDistributionItem.h"
+#include "ComboProperty.h"
+#include <QDebug>
+
+class TestParticleDistributionItem : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_InitialState();
+    void test_AddParticle();
+
+};
+
+inline void TestParticleDistributionItem::test_InitialState()
+{
+    SampleModel model;
+    SessionItem *item = model.insertNewItem(Constants::ParticleDistributionType);
+
+    QCOMPARE(item->displayName(), Constants::ParticleDistributionType);
+    QCOMPARE(item->displayName(), item->itemName());
+    QCOMPARE(item->childItems().size(), 5); // xpos, ypos, P_ABUNDANCE, P_DISTRIBUTION, P_DISTRIBUTED_PARAMETER
+    QCOMPARE(item->defaultTag(), ParticleDistributionItem::T_PARTICLES);
+    QCOMPARE(item->acceptableDefaultItemTypes(),
+             QVector<QString>() << Constants::ParticleType
+             << Constants::ParticleCoreShellType << Constants::ParticleCompositionType);
+
+    ComboProperty prop = item->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
+                    .value<ComboProperty>();
+
+    QCOMPARE(prop.getValues(), QStringList() << QStringLiteral("None"));
+    QCOMPARE(prop.getValue(), QStringLiteral("None"));
+    QVERIFY(prop.getCachedValue().isEmpty());
+}
+
+inline void TestParticleDistributionItem::test_AddParticle()
+{
+    SampleModel model;
+    SessionItem *item = model.insertNewItem(Constants::ParticleDistributionType);
+    model.insertNewItem(Constants::ParticleType, item->index());
+
+    QCOMPARE(item->childItems().size(), 6); // xpos, ypos, P_ABUNDANCE, P_DISTRIBUTION, T_PARTICLES, P_DISTRIBUTED_PARAMETER
+
+    ComboProperty prop = item->getItemValue(ParticleDistributionItem::P_DISTRIBUTED_PARAMETER)
+                    .value<ComboProperty>();
+    qDebug() << prop.getValues();
+
+}
+
+
+#endif // TESTPARTICLEDISTRIBUTIONITEM_H
diff --git a/Tests/UnitTests/GUI/TestParticleItem.h b/Tests/UnitTests/GUI/TestParticleItem.h
new file mode 100644
index 0000000..72cbb79
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestParticleItem.h
@@ -0,0 +1,128 @@
+#ifndef TESTPARTICLEITEM_H
+#define TESTPARTICLEITEM_H
+
+
+#include <QtTest>
+#include "SampleModel.h"
+#include "SessionItem.h"
+#include "ParticleItem.h"
+#include "GroupItem.h"
+
+
+class TestParticleItem : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_InitialState();
+};
+
+inline void TestParticleItem::test_InitialState()
+{
+    SampleModel model;
+    SessionItem *item = model.insertNewItem(Constants::ParticleType);
+
+    QCOMPARE(item->displayName(), Constants::ParticleType);
+    QCOMPARE(item->displayName(), item->itemName());
+    QCOMPARE(item->childItems().size(), 6); // xpos, ypos, P_FORM_FACTOR, P_MATERIAL, P_ABUNDANCE, P_POSITION
+    QCOMPARE(item->defaultTag(), ParticleItem::T_TRANSFORMATION);
+
+    GroupItem *group = dynamic_cast<GroupItem *>(item->getItem(ParticleItem::P_FORM_FACTOR));
+    QCOMPARE(group->displayName(), ParticleItem::P_FORM_FACTOR);
+    QCOMPARE(group->childItems().size(), 1);
+
+
+
+
+//    QCOMPARE(item->acceptableDefaultItemTypes(),
+//             QVector<QString>() << Constants::ParticleType
+//             << Constants::ParticleCoreShellType << Constants::ParticleCompositionType);
+
+}
+
+
+//inline void TestParticleItems::test_ParticleToDomain()
+//{
+//    MaterialModel materialModel;
+//    MaterialEditor editor(&materialModel);
+//    Q_UNUSED(editor);
+//    ParticleItem item;
+//    item.setRegisteredProperty(ParticleItem::P_DEPTH, 10.0);
+//    item.setRegisteredProperty(ParticleItem::P_ABUNDANCE, 5.0);
+//    double depth, abundance;
+//    Particle *particle = TransformToDomain::createParticle(item, depth, abundance);
+//    QCOMPARE(depth, 10.0);
+//    QCOMPARE(abundance, 5.0);
+//    Q_UNUSED(particle);
+//}
+
+
+//inline void TestParticleItems::test_FormFactorGroupProperty()
+//{
+//    // FIXME remove MaterialEditor and model from SessionItem
+//    MaterialModel materialModel;
+//    MaterialEditor editor(&materialModel);
+//    Q_UNUSED(editor);
+
+//    ParticleItem item;
+
+//    FancyGroupProperty *group_property = item.getRegisteredProperty(ParticleItem::P_FORM_FACTOR).value<FancyGroupProperty *>();
+//    QCOMPARE(group_property->type(), FancyGroupProperty::SelectableGroupType);
+//    QCOMPARE(item.getSubItems().size(), 1);
+
+//    // check that request for new subItem generates item of correct modelType and
+//    // correct signals (one propertyItemChanged, and no propertyChanged)
+//    QStringList formfactors;
+//    formfactors << Constants::AnisoPyramidType
+//                << Constants::BoxType
+//                << Constants::ConeType
+//                << Constants::Cone6Type
+//                << Constants::CuboctahedronType
+//                << Constants::CylinderType
+//                << Constants::DedecahedronType
+//                << Constants::EllipsoidalCylinderType
+//                << Constants::FullSphereType
+//                << Constants::FullSpheroidType
+//                << Constants::HemiEllipsoidType
+//                << Constants::IcosahedronType
+//                << Constants::Prism3Type
+//                << Constants::Prism6Type
+//                << Constants::PyramidType
+//                << Constants::Ripple1Type
+//                << Constants::Ripple2Type
+//                << Constants::TetrahedronType
+//                << Constants::TruncatedSphereType
+//                << Constants::TruncatedSpheroidType;
+//    foreach(QString ff_name, formfactors) {
+//        QSignalSpy spyItem(&item, SIGNAL(propertyChanged(QString)));
+//        QSignalSpy spyPropertyItem(&item, SIGNAL(propertyItemChanged(QString)));
+//        SessionItem *ffItem = item.setFancyGroupProperty(ParticleItem::P_FORM_FACTOR, ff_name);
+//        QVERIFY(ffItem);
+//        QCOMPARE(item.getSubItems().size(), 1);
+//        QCOMPARE(ffItem, item.getGroupItem(ParticleItem::P_FORM_FACTOR));
+
+//        QCOMPARE(spyItem.count(), 0);
+//        if(ff_name == Constants::AnisoPyramidType) { // default ff
+//            QCOMPARE(spyPropertyItem.count(), 0);
+//        } else {
+//            QCOMPARE(spyPropertyItem.count(), 1);
+//            QList<QVariant> arguments = spyPropertyItem.takeFirst(); // take the first signal
+//            QCOMPARE(arguments.at(0).toString(), ParticleItem::P_FORM_FACTOR);
+//        }
+
+//        QCOMPARE(ffItem->modelType(), ff_name);
+//    }
+
+//    // checks that change in subItem properties has no affect on signals of ParticleItem
+//    SessionItem *cylinderItem = item.setFancyGroupProperty(ParticleItem::P_FORM_FACTOR, Constants::CylinderType);
+//    QSignalSpy spyItem(&item, SIGNAL(propertyChanged(QString)));
+//    QSignalSpy spyPropertyItem(&item, SIGNAL(propertyItemChanged(QString)));
+//    cylinderItem->setRegisteredProperty(CylinderItem::P_RADIUS, 99.9);
+//    QCOMPARE(spyItem.count(), 0);
+//    QCOMPARE(spyPropertyItem.count(), 0);
+
+
+//}
+
+
+
+#endif // TESTPARTICLEITEM_H
diff --git a/Tests/UnitTests/GUI/TestSessionItem.h b/Tests/UnitTests/GUI/TestSessionItem.h
new file mode 100644
index 0000000..ed293d0
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestSessionItem.h
@@ -0,0 +1,232 @@
+#ifndef TESTSESSIONITEM_H
+#define TESTSESSIONITEM_H
+
+
+#include <QtTest>
+#include "SessionItem.h"
+#include "GUIHelpers.h"
+#include "SessionModel.h"
+#include "verify_throw_macro.h"
+
+
+
+class TestSessionItem : public QObject {
+    Q_OBJECT
+private:
+    void verify_get_item(SessionItem *item, const QString &tag, QVector<SessionItem*> list);
+private slots:
+    void test_constructor();
+    void test_tags();
+    void test_data_roles();
+    void test_model_types();
+};
+
+
+inline void TestSessionItem::verify_get_item(SessionItem *item, const QString &tag, QVector<SessionItem *> list)
+{
+    if (list.size() > 0)
+        QVERIFY(item->getItem(tag) == list[0]);
+    else
+        QVERIFY(item->getItem(tag) == nullptr);
+    auto items = item->getItems(tag);
+    QVERIFY(items.size() == list.size());
+    QVERIFY(items == list);
+    QVERIFY(item->getItem(tag, -1) == nullptr);
+    QVERIFY(item->getItem(tag, list.size()) == nullptr);
+    for (int i = 0; i < list.size(); i++) {
+        QVERIFY(item->getItem(tag, i) == list[i]);
+    }
+}
+
+inline void TestSessionItem::test_constructor()
+{
+    const QString modeltype = "This is the model type";
+    SessionItem *item = new SessionItem(modeltype);
+    QVERIFY(item->modelType() == modeltype);
+    QVERIFY(item->model() == nullptr);
+    QVERIFY(item->parent() == nullptr);
+    // TODO add some more tests for children, roles, tags ...
+}
+
+inline void TestSessionItem::test_tags()
+{
+    const QString modeltype = "This is the model type";
+    const QString tag1 = "TAG1";
+    const QString tag2 = "TAG2";
+    const QString tag3 = "TAG3";
+    const QString tag4 = "TAG4";
+    SessionItem *item = new SessionItem(modeltype);
+    QVector<SessionItem*> items;
+    for (int i = 0; i < 10; i++)
+        items.append(new SessionItem(modeltype));
+
+    // before using a tag, it must be registered
+    QVERIFY(item->registerTag(tag1));
+
+    // register twice returns false
+    QVERIFY(item->registerTag(tag1) == false);
+
+    // register empty string returns false
+    QVERIFY(item->registerTag("") == false);
+
+    // now we insert one element at the beginning
+    QVERIFY(item->insertItem(0, items[0], tag1));
+
+    // insertion out of range is forbidden
+    QVERIFY(item->insertItem(-1, items[0], tag1) == false);
+    QVERIFY(item->insertItem(2, items[0], tag1) == false);
+
+    // double insertion is forbidden
+    QVERIFY(item->insertItem(0, items[0], tag1) == false);
+
+    // we try to access tagged items
+    verify_get_item(item, tag1, items.mid(0, 1));
+
+    // nullptr is not allowed
+    QVERIFY(item->insertItem(1, nullptr, tag1) == false);
+    verify_get_item(item, tag1, items.mid(0, 1));
+
+    // LIMITS
+    // register tag with limit 0 - 1
+    QVERIFY(item->registerTag(tag2, 0, 1));
+
+    QVERIFY(item->insertItem(0, items[1], tag2));
+    verify_get_item(item, tag2, items.mid(1,1));
+    QVERIFY(item->insertItem(1, items[1], tag2) == false);
+
+    // register tag with limit 0 - 3 (using item 2 - 5)
+    QVERIFY(item->registerTag(tag3, 0, 4));
+
+    // add four items
+    for (int i = 0; i < 4; i++) {
+        QVERIFY(item->insertItem(i, items[2 + i], tag3));
+        verify_get_item(item, tag3, items.mid(2, i+1));
+    }
+
+    // the fifth should fail
+    QVERIFY(item->insertItem(0, items[6], tag3) == false);
+
+    // items should be unchanged
+    verify_get_item(item, tag3, items.mid(2, 4));
+
+    // register tag with limit 4 - 4 add items to fill up limit
+    QVERIFY(item->registerTag(tag4, 4, 4));
+
+    // add four items
+    for (int i = 0; i < 4; i++) {
+        QVERIFY(item->insertItem(i, items[6 + i], tag4));
+        verify_get_item(item, tag4, items.mid(6, i+1));
+    }
+    QVERIFY(item->insertItem(0, items[6], tag4) == false);
+
+    // REMOVAL
+
+    // tag4 can not be removed
+    SessionItem *last = item->takeItem(3, tag4);
+    QVERIFY(last == nullptr);
+    verify_get_item(item, tag4, items.mid(6, 4));
+
+    // remove all from tag3, checking access of tag4
+    for (int i = 0; i < 4; i++) {
+        last = item->takeItem(3-i, tag3);
+        QVERIFY(last == items[5-i]);
+        verify_get_item(item, tag3, items.mid(2,3-i));
+        verify_get_item(item, tag4, items.mid(6,4));
+    }
+
+    delete item;
+}
+
+inline void TestSessionItem::test_data_roles()
+{
+    SessionItem *item = new SessionItem("Some model type");
+    item->setData(Qt::DisplayRole, 1234);
+    QVERIFY(item->data(Qt::DisplayRole) == 1234);
+    QVERIFY(item->data(Qt::EditRole) == 1234);
+    item->setData(Qt::EditRole, 5432);
+    QVERIFY(item->data(Qt::DisplayRole) == 5432);
+    QVERIFY(item->data(Qt::EditRole) == 5432);
+    for (int i = 0; i < 10; i++) {
+        QVERIFY(item->data(SessionModel::EndSessionRoles + i).isValid() == false);
+        item->setData(SessionModel::EndSessionRoles + i, i);
+        QVERIFY(item->data(SessionModel::EndSessionRoles + i) == i);
+    }
+}
+
+inline void TestSessionItem::test_model_types()
+{
+    const QString model1 = "modeltype 1";
+    const QString model2 = "modeltype 2";
+    const QString model3 = "modeltype 3";
+    const QString model4 = "modeltype 4";
+    const QString model5 = "modeltype 5";
+
+    SessionItem *item = new SessionItem("modeltype does not matter");
+    QVERIFY(item->registerTag("Tag1", 0, -1, QStringList() << model1 << model2));
+    QVERIFY(item->insertItem(0, new SessionItem(model1), "Tag1"));
+    QVERIFY(item->insertItem(0, new SessionItem(model2), "Tag1"));
+    QVERIFY(item->insertItem(0, new SessionItem(model3), "Tag1") == false);
+    QVERIFY(item->insertItem(0, new SessionItem(model4), "Tag1") == false);
+    QVERIFY(item->insertItem(0, new SessionItem(model5), "Tag1") == false);
+    QVERIFY(item->registerTag("Tag2", 0, -1, QStringList() << model3 << model4 << model5));
+    QVERIFY(item->insertItem(0, new SessionItem(model1), "Tag2") == false);
+    QVERIFY(item->insertItem(0, new SessionItem(model2), "Tag2") == false);
+    QVERIFY(item->insertItem(0, new SessionItem(model3), "Tag2"));
+    QVERIFY(item->insertItem(0, new SessionItem(model4), "Tag2"));
+    QVERIFY(item->insertItem(0, new SessionItem(model5), "Tag2"));
+}
+
+//inline void TestParameterizedItem::test_registerProperty()
+//{
+//    SessionItem item;
+//    QString property_name("MyProperty");
+//    double value(1.0);
+////    QSignalSpy spy(&item, SIGNAL(propertyChanged(QString)));
+
+//    // access non-existing property
+//    QCOMPARE(false, item.isRegisteredTag(property_name));
+//    QVERIFY_THROW(item.getRegisteredProperty(property_name), GUIHelpers::Error);
+//    QVERIFY_THROW(item.setRegisteredProperty(property_name, value), GUIHelpers::Error);
+
+//    // registering new property
+//    item.registerProperty(property_name, value);
+//    QCOMPARE(true, item.isRegisteredTag(property_name));
+////    QCOMPARE(spy.count(), 1);
+////    QList<QVariant> arguments = spy.takeFirst();
+////    QCOMPARE(arguments.size(), 1);
+////    QCOMPARE(arguments.at(0).toString(), property_name);
+//    QCOMPARE(item.getRegisteredProperty(property_name).toDouble(), value);
+////    QCOMPARE(spy.count(), 0);
+
+//    // setting property value
+//    double new_value(2.0);
+//    item.setRegisteredProperty(property_name, new_value);
+////    QCOMPARE(spy.count(), 1);
+////    arguments = spy.takeFirst();
+////    QCOMPARE(arguments.size(), 1);
+////    QCOMPARE(arguments.at(0).toString(), property_name);
+//    QCOMPARE(item.getRegisteredProperty(property_name).toDouble(), new_value);
+
+//    // setting property value to wrong QVariant
+//    QVERIFY_THROW(item.setRegisteredProperty(property_name, QString("aaa")), GUIHelpers::Error);
+
+//    // attempt to register already existing property
+//    QVERIFY_THROW(item.registerProperty(property_name, 1.0), GUIHelpers::Error);
+
+//    // remove registered property
+//    item.removeRegisteredProperty(property_name);
+////    QCOMPARE(spy.count(), 1);
+////    arguments = spy.takeFirst();
+////    QCOMPARE(arguments.size(), 1);
+////    QCOMPARE(arguments.at(0).toString(), property_name);
+//    QVERIFY_THROW(item.getRegisteredProperty(property_name), GUIHelpers::Error);
+//}
+
+//inline void TestParameterizedItem::test_SelectableGroupProperty()
+//{
+////    SessionItem item;
+////    QCOMPARE(item.getSubItems().size(), 0);
+//}
+
+
+#endif // TESTSESSIONITEM_H
diff --git a/Tests/UnitTests/GUI/TestSessionModel.h b/Tests/UnitTests/GUI/TestSessionModel.h
new file mode 100644
index 0000000..1ef48c6
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestSessionModel.h
@@ -0,0 +1,177 @@
+#ifndef TESTSESSIONMODEL_H
+#define TESTSESSIONMODEL_H
+
+#include <QtTest>
+#include "SessionModel.h"
+#include "SampleModel.h"
+#include "MaterialModel.h"
+#include "InstrumentModel.h"
+#include "MaterialSvc.h"
+#include "JobModel.h"
+#include "JobItem.h"
+#include <QXmlStreamWriter>
+#include <memory>
+
+class TestSessionModel : public QObject {
+    Q_OBJECT
+
+private slots:
+    void test_SampleModel_CreateCopy();
+    void test_SampleModel_CreatePartialCopy();
+    void test_InstrumentModel_CreateCopy();
+    void test_InstrumentModel_CreatePartialCopy();
+    void test_copyParameterizedItem();
+};
+
+inline void TestSessionModel::test_SampleModel_CreateCopy()
+{
+    std::unique_ptr<MaterialModel> P_materialModel(new MaterialModel());
+    std::unique_ptr<MaterialSvc> P_materialEditor(new MaterialSvc(P_materialModel.get()));
+
+    SampleModel *model1 = new SampleModel();
+    SessionItem *multilayer = model1->insertNewItem(Constants::MultiLayerType);
+    multilayer->setItemName("multilayer");
+    model1->insertNewItem(Constants::LayerType, model1->indexOfItem(multilayer));
+    SessionItem *multilayer2 = model1->insertNewItem(Constants::MultiLayerType);
+    multilayer2->setItemName("multilayer2");
+
+    QString buffer1;
+    QXmlStreamWriter writer1(&buffer1);
+    model1->writeTo(&writer1);
+    qDebug() << buffer1;
+
+    SampleModel *model2 = model1->createCopy();
+    QString buffer2;
+    QXmlStreamWriter writer2(&buffer2);
+    model2->writeTo(&writer2);
+    qDebug() << buffer2;
+
+    QCOMPARE(buffer1, buffer2);
+
+    delete model1;
+    delete model2;
+}
+
+inline void TestSessionModel::test_SampleModel_CreatePartialCopy()
+{
+    std::unique_ptr<MaterialModel> P_materialModel(new MaterialModel());
+    std::unique_ptr<MaterialSvc> P_materialEditor(new MaterialSvc(P_materialModel.get()));
+
+    SampleModel *model1 = new SampleModel();
+    SessionItem *multilayer1 = model1->insertNewItem(Constants::MultiLayerType);
+    multilayer1->setItemName("multilayer1");
+    model1->insertNewItem(Constants::LayerType, model1->indexOfItem(multilayer1));
+
+    SessionItem *multilayer2 = model1->insertNewItem(Constants::MultiLayerType);
+    multilayer2->setItemName("multilayer2");
+
+    SampleModel *model2 = model1->createCopy(multilayer1);
+    SessionItem *result = model2->itemForIndex(model2->index(0,0,QModelIndex()));
+
+    QCOMPARE(result->itemName(), multilayer1->itemName());
+    QCOMPARE(result->modelType(), multilayer1->modelType());
+
+    delete model1;
+    delete model2;
+}
+
+inline void TestSessionModel::test_InstrumentModel_CreateCopy()
+{
+    InstrumentModel *model1 = new InstrumentModel();
+    SessionItem *instrument1 = model1->insertNewItem(Constants::InstrumentType);
+    instrument1->setItemName("instrument1");
+    model1->insertNewItem(Constants::DetectorType, model1->indexOfItem(instrument1));
+    model1->insertNewItem(Constants::BeamType, model1->indexOfItem(instrument1));
+
+    SessionItem *instrument2 = model1->insertNewItem(Constants::InstrumentType);
+    instrument2->setItemName("instrument2");
+    model1->insertNewItem(Constants::DetectorType, model1->indexOfItem(instrument2));
+    model1->insertNewItem(Constants::BeamType, model1->indexOfItem(instrument2));
+
+    QString buffer1;
+    QXmlStreamWriter writer1(&buffer1);
+    model1->writeTo(&writer1);
+    qDebug() << buffer1;
+
+    InstrumentModel *model2 = model1->createCopy();
+    QString buffer2;
+    QXmlStreamWriter writer2(&buffer2);
+    model2->writeTo(&writer2);
+    qDebug() << buffer2;
+
+    QCOMPARE(buffer1, buffer2);
+
+    delete model1;
+    delete model2;
+}
+
+inline void TestSessionModel::test_InstrumentModel_CreatePartialCopy()
+{
+    InstrumentModel *model1 = new InstrumentModel();
+    SessionItem *instrument1 = model1->insertNewItem(Constants::InstrumentType);
+    instrument1->setItemName("instrument1");
+    model1->insertNewItem(Constants::DetectorType, model1->indexOfItem(instrument1));
+    model1->insertNewItem(Constants::BeamType, model1->indexOfItem(instrument1));
+
+    SessionItem *instrument2 = model1->insertNewItem(Constants::InstrumentType);
+    instrument2->setItemName("instrument2");
+    model1->insertNewItem(Constants::DetectorType, model1->indexOfItem(instrument2));
+    model1->insertNewItem(Constants::BeamType, model1->indexOfItem(instrument2));
+
+//    QString buffer1;
+//    QXmlStreamWriter writer1(&buffer1);
+//    model1->writeTo(&writer1);
+//    qDebug() << buffer1;
+
+    // this method seems not implemented even before
+    InstrumentModel *model2 = model1->createCopy(instrument2);
+
+//    QString buffer2;
+//    QXmlStreamWriter writer2(&buffer2);
+//    model2->writeTo(&writer2);
+//    qDebug() << buffer2;
+
+    SessionItem *result = model2->itemForIndex(model2->index(0,0,QModelIndex()));
+
+//    QCOMPARE(result->itemName(), instrument2->itemName());
+    QCOMPARE(result->modelType(), instrument2->modelType());
+
+    delete model1;
+    delete model2;
+}
+
+//! Test if SessionItem can be copied from one model to another. Particularly, we test
+//! here if a MultiLayerItem can be copied from SampleModel to the JobItem of JobModel
+inline void TestSessionModel::test_copyParameterizedItem()
+{
+    std::unique_ptr<MaterialModel> P_materialModel(new MaterialModel());
+    std::unique_ptr<MaterialSvc> P_materialEditor(new MaterialSvc(P_materialModel.get()));
+
+    SampleModel *sampleModel = new SampleModel();
+    SessionItem *multilayer1 = sampleModel->insertNewItem(Constants::MultiLayerType);
+    multilayer1->setItemName("multilayer1");
+    sampleModel->insertNewItem(Constants::LayerType, sampleModel->indexOfItem(multilayer1));
+
+    InstrumentModel *instrumentModel = new InstrumentModel();
+    SessionItem *instrument1 = instrumentModel->insertNewItem(Constants::InstrumentType);
+    instrument1->setItemName("instrument1");
+    instrumentModel->insertNewItem(Constants::DetectorType, instrumentModel->indexOfItem(instrument1));
+    instrumentModel->insertNewItem(Constants::BeamType, instrumentModel->indexOfItem(instrument1));
+
+    JobModel *jobModel = new JobModel();
+    SessionItem *jobItem = jobModel->insertNewItem(Constants::JobItemType);
+
+    jobModel->copyParameterizedItem(multilayer1, jobItem, JobItem::T_SAMPLE);
+    QCOMPARE(jobItem->getTagInfo(JobItem::T_SAMPLE).childCount, 1);
+
+    jobModel->copyParameterizedItem(instrument1, jobItem, JobItem::T_INSTRUMENT);
+    QCOMPARE(jobItem->getTagInfo(JobItem::T_INSTRUMENT).childCount, 1);
+
+    delete sampleModel;
+    delete instrumentModel;
+    delete jobModel;
+}
+
+
+#endif // TESTSESSIONMODEL_H
+
diff --git a/Tests/UnitTests/GUI/verify_throw_macro.h b/Tests/UnitTests/GUI/verify_throw_macro.h
new file mode 100644
index 0000000..6b5dfaf
--- /dev/null
+++ b/Tests/UnitTests/GUI/verify_throw_macro.h
@@ -0,0 +1,33 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/UnitTests/GUI/verify_throw_macro.h
+//! @brief     Defines macro to test exception throw
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef VERIFY_THROW_MACRO_H
+#define VERIFY_THROW_MACRO_H
+
+#include <QTest>
+
+#define QVERIFY_THROW(expression, ExpectedExceptionType) \
+do \
+{ \
+bool caught_ = false; \
+try { expression; } \
+catch (ExpectedExceptionType const&) { caught_ = true; } \
+catch (...) {} \
+if (!QTest::qVerify(caught_, #expression ", " #ExpectedExceptionType, "", __FILE__, __LINE__))\
+return; \
+} while(0)
+
+
+#endif // VERIFY_THROW_MACRO_H
diff --git a/Tests/UnitTests/utilities/qLoopedTest.h b/Tests/UnitTests/utilities/qLoopedTest.h
new file mode 100644
index 0000000..2bc00dd
--- /dev/null
+++ b/Tests/UnitTests/utilities/qLoopedTest.h
@@ -0,0 +1,73 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Tests/UnitTests/utilities/qLoopedTest.h
+//! @brief     Auxiliary utility to loop over q vectors for tests.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2016
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef QLOOPEDTEST_H
+#define QLOOPEDTEST_H
+
+#include <tuple>
+
+const complex_t I(0,1);
+
+class QLoopedTest:
+public ::testing::TestWithParam<std::tuple<cvector_t, cvector_t, double, complex_t>>
+{
+protected:
+    QLoopedTest() {}
+    virtual void SetUp()
+    {
+        cvector_t qdir = std::get<0>(GetParam());
+        cvector_t qdev = std::get<1>(GetParam());
+        double    qmag = std::get<2>(GetParam());
+        complex_t qeps = std::get<3>(GetParam());
+        q = qmag * (qdir + qeps*qdev).unit();
+    }
+    cvector_t q;
+
+    bool skip_q( double qmag_begin=1e-99, double qmag_end=1e99 ) {
+        return q.mag()<=qmag_begin || q.mag()>=qmag_end;
+    }
+};
+
+auto qlist = testing::Combine(
+    testing::Values(
+        cvector_t({ 1, 0, 0 }),
+        cvector_t({ 0, 1, 0 }),
+        cvector_t({ 0, 0, 1 }),
+        cvector_t({ 1, 1, 0 }),
+        cvector_t({ 1, 0, 1 }),
+        cvector_t({ 1, 0, 1 }),
+        cvector_t({ 1, 1, 1 })
+        ),
+    testing::Values(
+        cvector_t({ 1, 0, 0 }),
+        cvector_t({ 0, 1, 0 }),
+        cvector_t({ 0, 0, 1 }),
+        cvector_t({ 1, 1, 0 }),
+        cvector_t({ 1, 0, 1 }),
+        cvector_t({ 1, 0, 1 }),
+        cvector_t({ 1, 1, 1 })
+        ),
+    testing::Values(
+        1e-19, 1e-17, 1e-15, 1e-13, 1e-11, 1e-9, 1e-7, 1e-5, 1e-4, 1e-3, 1e-2, .1,
+        1., 1e1, 1e2, 1e3, 1e4 ),
+    testing::Values(
+        -1e-15, +1e-14, -1e-13*I, +1e-12*I,
+        -1e-11, +1e-10, -1e-9*I, +1e-8*I,
+        -1e-7, +1e-6, -1e-5*I, +1e-4*I,
+        -1e-3, +1e-2, -1e-1*I, +1e-1*I,
+        .9, -.99, .999, -.9999 )
+    );
+
+#endif // QLOOPEDTEST_H
diff --git a/ThirdParty/Core/CMakeLists.txt b/ThirdParty/Core/CMakeLists.txt
new file mode 100644
index 0000000..7852c10
--- /dev/null
+++ b/ThirdParty/Core/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(Faddeeva)
diff --git a/ThirdParty/Core/Faddeeva/CMakeLists.txt b/ThirdParty/Core/Faddeeva/CMakeLists.txt
new file mode 100644
index 0000000..98277d1
--- /dev/null
+++ b/ThirdParty/Core/Faddeeva/CMakeLists.txt
@@ -0,0 +1,23 @@
+############################################################################
+# CMakeLists.txt file for building libFaddeeva package
+############################################################################
+set(library_name Faddeeva)
+
+# --- source and include files ---------
+set(include_dirs
+    ${CMAKE_CURRENT_SOURCE_DIR}
+)
+include_directories(${include_dirs})
+
+file(GLOB source_files "*.cc")
+
+file(GLOB include_files "*.hh")
+
+# --- making library ------------
+add_library(
+    ${library_name}
+    STATIC
+    ${source_files} ${include_files}
+)
+set(${library_name}_INCLUDE_DIR ${include_dirs} CACHE INTERNAL "")
+set(${library_name}_LIBRARY ${library_name} CACHE INTERNAL "")
diff --git a/ThirdParty/Core/Faddeeva/Faddeeva.cc b/ThirdParty/Core/Faddeeva/Faddeeva.cc
new file mode 100644
index 0000000..e48ef3a
--- /dev/null
+++ b/ThirdParty/Core/Faddeeva/Faddeeva.cc
@@ -0,0 +1,2517 @@
+//  -*- mode:c++; tab-width:2; indent-tabs-mode:nil;  -*-
+
+/* Copyright (c) 2012 Massachusetts Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/* (Note that this file can be compiled with either C++, in which
+    case it uses C++ std::complex<double>, or C, in which case it
+    uses C99 double complex.) */
+
+/* Available at: http://ab-initio.mit.edu/Faddeeva
+
+   Computes various error functions (erf, erfc, erfi, erfcx),
+   including the Dawson integral, in the complex plane, based
+   on algorithms for the computation of the Faddeeva function
+              w(z) = exp(-z^2) * erfc(-i*z).
+   Given w(z), the error functions are mostly straightforward
+   to compute, except for certain regions where we have to
+   switch to Taylor expansions to avoid cancellation errors
+   [e.g. near the origin for erf(z)].
+
+   To compute the Faddeeva function, we use a combination of two
+   algorithms:
+
+   For sufficiently large |z|, we use a continued-fraction expansion
+   for w(z) similar to those described in:
+
+      Walter Gautschi, "Efficient computation of the complex error
+      function," SIAM J. Numer. Anal. 7(1), pp. 187-198 (1970)
+
+      G. P. M. Poppe and C. M. J. Wijers, "More efficient computation
+      of the complex error function," ACM Trans. Math. Soft. 16(1),
+      pp. 38-46 (1990).
+
+   Unlike those papers, however, we switch to a completely different
+   algorithm for smaller |z|:
+
+      Mofreh R. Zaghloul and Ahmed N. Ali, "Algorithm 916: Computing the
+      Faddeyeva and Voigt Functions," ACM Trans. Math. Soft. 38(2), 15
+      (2011).
+
+   (I initially used this algorithm for all z, but it turned out to be
+    significantly slower than the continued-fraction expansion for
+    larger |z|.  On the other hand, it is competitive for smaller |z|,
+    and is significantly more accurate than the Poppe & Wijers code
+    in some regions, e.g. in the vicinity of z=1+1i.)
+
+   Note that this is an INDEPENDENT RE-IMPLEMENTATION of these algorithms,
+   based on the description in the papers ONLY.  In particular, I did
+   not refer to the authors' Fortran or Matlab implementations, respectively,
+   (which are under restrictive ACM copyright terms and therefore unusable
+    in free/open-source software).
+
+   Steven G. Johnson, Massachusetts Institute of Technology
+   http://math.mit.edu/~stevenj
+   October 2012.
+
+    -- Note that Algorithm 916 assumes that the erfc(x) function,
+       or rather the scaled function erfcx(x) = exp(x*x)*erfc(x),
+       is supplied for REAL arguments x.   I originally used an
+       erfcx routine derived from DERFC in SLATEC, but I have
+       since replaced it with a much faster routine written by
+       me which uses a combination of continued-fraction expansions
+       and a lookup table of Chebyshev polynomials.  For speed,
+       I implemented a similar algorithm for Im[w(x)] of real x,
+       since this comes up frequently in the other error functions.
+
+   A small test program is included the end, which checks
+   the w(z) etc. results against several known values.  To compile
+   the test function, compile with -DTEST_FADDEEVA (that is,
+   #define TEST_FADDEEVA).
+
+   If HAVE_CONFIG_H is #defined (e.g. by compiling with -DHAVE_CONFIG_H),
+   then we #include "config.h", which is assumed to be a GNU autoconf-style
+   header defining HAVE_* macros to indicate the presence of features. In
+   particular, if HAVE_ISNAN and HAVE_ISINF are #defined, we use those
+   functions in math.h instead of defining our own, and if HAVE_ERF and/or
+   HAVE_ERFC are defined we use those functions from <cmath> for erf and
+   erfc of real arguments, respectively, instead of defining our own.
+
+   REVISION HISTORY:
+       4 October 2012: Initial public release (SGJ)
+       5 October 2012: Revised (SGJ) to fix spelling error,
+                       start summation for large x at round(x/a) (> 1)
+                       rather than ceil(x/a) as in the original
+                       paper, which should slightly improve performance
+                       (and, apparently, slightly improves accuracy)
+      19 October 2012: Revised (SGJ) to fix bugs for large x, large -y,
+                       and 15<x<26. Performance improvements. Prototype
+                       now supplies default value for relerr.
+      24 October 2012: Switch to continued-fraction expansion for
+                       sufficiently large z, for performance reasons.
+                       Also, avoid spurious overflow for |z| > 1e154.
+                       Set relerr argument to min(relerr,0.1).
+      27 October 2012: Enhance accuracy in Re[w(z)] taken by itself,
+                       by switching to Alg. 916 in a region near
+                       the real-z axis where continued fractions
+                       have poor relative accuracy in Re[w(z)].  Thanks
+                       to M. Zaghloul for the tip.
+      29 October 2012: Replace SLATEC-derived erfcx routine with
+                       completely rewritten code by me, using a very
+                       different algorithm which is much faster.
+      30 October 2012: Implemented special-case code for real z
+                       (where real part is exp(-x^2) and imag part is
+                        Dawson integral), using algorithm similar to erfx.
+                       Export ImFaddeeva_w function to make Dawson's
+                       integral directly accessible.
+      3 November 2012: Provide implementations of erf, erfc, erfcx,
+                       and Dawson functions in Faddeeva:: namespace,
+                       in addition to Faddeeva::w.  Provide header
+                       file Faddeeva.hh.
+      4 November 2012: Slightly faster erf for real arguments.
+                       Updated MATLAB and Octave plugins.
+     27 November 2012: Support compilation with either C++ or
+                       plain C (using C99 complex numbers).
+                       For real x, use standard-library erf(x)
+                       and erfc(x) if available (for C99 or C++11).
+                       #include "config.h" if HAVE_CONFIG_H is #defined.
+     15 December 2012: Portability fixes (copysign, Inf/NaN creation),
+                       use CMPLX/__builtin_complex if available in C,
+                       slight accuracy improvements to erf and dawson
+                       functions near the origin.  Use gnulib functions
+                       if GNULIB_NAMESPACE is defined.
+     18 December 2012: Slight tweaks (remove recomputation of x*x in Dawson)
+          12 May 2015: Bugfix for systems lacking copysign function.
+*/
+
+/////////////////////////////////////////////////////////////////////////
+/* If this file is compiled as a part of a larger project,
+   support using an autoconf-style config.h header file
+   (with various "HAVE_*" #defines to indicate features)
+   if HAVE_CONFIG_H is #defined (in GNU autotools style). */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+/////////////////////////////////////////////////////////////////////////
+// macros to allow us to use either C++ or C (with C99 features)
+
+#ifdef __cplusplus
+
+#  include "Faddeeva.hh"
+
+#  include <cfloat>
+#  include <cmath>
+#  include <limits>
+using namespace std;
+
+// use std::numeric_limits, since 1./0. and 0./0. fail with some compilers (MS)
+#  define Inf numeric_limits<double>::infinity()
+#  define NaN numeric_limits<double>::quiet_NaN()
+
+typedef complex<double> cmplx;
+
+// Use C-like complex syntax, since the C syntax is more restrictive
+#  define cexp(z) exp(z)
+#  define creal(z) real(z)
+#  define cimag(z) imag(z)
+#  define cpolar(r,t) polar(r,t)
+
+#  define C(a,b) cmplx(a,b)
+
+#  define FADDEEVA(name) Faddeeva::name
+#  define FADDEEVA_RE(name) Faddeeva::name
+
+// isnan/isinf were introduced in C++11
+#  if (__cplusplus < 201103L) && (!defined(HAVE_ISNAN) || !defined(HAVE_ISINF))
+static inline bool my_isnan(double x) { return x != x; }
+#    define isnan my_isnan
+static inline bool my_isinf(double x) { return 1/x == 0.; }
+#    define isinf my_isinf
+#  elif (__cplusplus >= 201103L)
+// g++ gets confused between the C and C++ isnan/isinf functions
+#    define isnan std::isnan
+#    define isinf std::isinf
+#  endif
+
+// copysign was introduced in C++11 (and is also in POSIX and C99)
+#  if defined(_WIN32) || defined(__WIN32__)
+#    define copysign _copysign // of course MS had to be different
+#  elif defined(GNULIB_NAMESPACE) // we are using using gnulib <cmath>
+#    define copysign GNULIB_NAMESPACE::copysign
+#  elif (__cplusplus < 201103L) && !defined(HAVE_COPYSIGN) && !defined(__linux__) && !(defined(__APPLE__) && defined(__MACH__)) && !defined(_AIX)
+static inline double my_copysign(double x, double y) { return x<0 != y<0 ? -x : x; }
+#    define copysign my_copysign
+#  endif
+
+// If we are using the gnulib <cmath> (e.g. in the GNU Octave sources),
+// gnulib generates a link warning if we use ::floor instead of gnulib::floor.
+// This warning is completely innocuous because the only difference between
+// gnulib::floor and the system ::floor (and only on ancient OSF systems)
+// has to do with floor(-0), which doesn't occur in the usage below, but
+// the Octave developers prefer that we silence the warning.
+#  ifdef GNULIB_NAMESPACE
+#    define floor GNULIB_NAMESPACE::floor
+#  endif
+
+#else // !__cplusplus, i.e. pure C (requires C99 features)
+
+#  include "Faddeeva.h"
+
+#  define _GNU_SOURCE // enable GNU libc NAN extension if possible
+
+#  include <float.h>
+#  include <math.h>
+
+typedef double complex cmplx;
+
+#  define FADDEEVA(name) Faddeeva_ ## name
+#  define FADDEEVA_RE(name) Faddeeva_ ## name ## _re
+
+/* Constructing complex numbers like 0+i*NaN is problematic in C99
+   without the C11 CMPLX macro, because 0.+I*NAN may give NaN+i*NAN if
+   I is a complex (rather than imaginary) constant.  For some reason,
+   however, it works fine in (pre-4.7) gcc if I define Inf and NaN as
+   1/0 and 0/0 (and only if I compile with optimization -O1 or more),
+   but not if I use the INFINITY or NAN macros. */
+
+/* __builtin_complex was introduced in gcc 4.7, but the C11 CMPLX macro
+   may not be defined unless we are using a recent (2012) version of
+   glibc and compile with -std=c11... note that icc lies about being
+   gcc and probably doesn't have this builtin(?), so exclude icc explicitly */
+#  if !defined(CMPLX) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !(defined(__ICC) || defined(__INTEL_COMPILER))
+#    define CMPLX(a,b) __builtin_complex((double) (a), (double) (b))
+#  endif
+
+#  ifdef CMPLX // C11
+#    define C(a,b) CMPLX(a,b)
+#    define Inf INFINITY // C99 infinity
+#    ifdef NAN // GNU libc extension
+#      define NaN NAN
+#    else
+#      define NaN (0./0.) // NaN
+#    endif
+#  else
+#    define C(a,b) ((a) + I*(b))
+#    define Inf (1./0.)
+#    define NaN (0./0.)
+#  endif
+
+static inline cmplx cpolar(double r, double t)
+{
+  if (r == 0.0 && !isnan(t))
+    return 0.0;
+  else
+    return C(r * cos(t), r * sin(t));
+}
+
+#endif // !__cplusplus, i.e. pure C (requires C99 features)
+
+/////////////////////////////////////////////////////////////////////////
+// Auxiliary routines to compute other special functions based on w(z)
+
+// compute erfcx(z) = exp(z^2) erfz(z)
+cmplx FADDEEVA(erfcx)(cmplx z, double relerr)
+{
+  return FADDEEVA(w)(C(-cimag(z), creal(z)), relerr);
+}
+
+// compute the error function erf(x)
+double FADDEEVA_RE(erf)(double x)
+{
+#if !defined(__cplusplus)
+  return erf(x); // C99 supplies erf in math.h
+#elif (__cplusplus >= 201103L) || defined(HAVE_ERF)
+  return ::erf(x); // C++11 supplies std::erf in cmath
+#else
+  double mx2 = -x*x;
+  if (mx2 < -750) // underflow
+    return (x >= 0 ? 1.0 : -1.0);
+
+  if (x >= 0) {
+    if (x < 8e-2) goto taylor;
+    return 1.0 - exp(mx2) * FADDEEVA_RE(erfcx)(x);
+  }
+  else { // x < 0
+    if (x > -8e-2) goto taylor;
+    return exp(mx2) * FADDEEVA_RE(erfcx)(-x) - 1.0;
+  }
+
+  // Use Taylor series for small |x|, to avoid cancellation inaccuracy
+  //   erf(x) = 2/sqrt(pi) * x * (1 - x^2/3 + x^4/10 - x^6/42 + x^8/216 + ...)
+ taylor:
+  return x * (1.1283791670955125739
+              + mx2 * (0.37612638903183752464
+                       + mx2 * (0.11283791670955125739
+                                + mx2 * (0.026866170645131251760
+                                         + mx2 * 0.0052239776254421878422))));
+#endif
+}
+
+// compute the error function erf(z)
+cmplx FADDEEVA(erf)(cmplx z, double relerr)
+{
+  double x = creal(z), y = cimag(z);
+
+  if (y == 0)
+    return C(FADDEEVA_RE(erf)(x),
+             y); // preserve sign of 0
+  if (x == 0) // handle separately for speed & handling of y = Inf or NaN
+    return C(x, // preserve sign of 0
+             /* handle y -> Inf limit manually, since
+                exp(y^2) -> Inf but Im[w(y)] -> 0, so
+                IEEE will give us a NaN when it should be Inf */
+             y*y > 720 ? (y > 0 ? Inf : -Inf)
+             : exp(y*y) * FADDEEVA(w_im)(y));
+
+  double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
+  double mIm_z2 = -2*x*y; // Im(-z^2)
+  if (mRe_z2 < -750) // underflow
+    return (x >= 0 ? 1.0 : -1.0);
+
+  /* Handle positive and negative x via different formulas,
+     using the mirror symmetries of w, to avoid overflow/underflow
+     problems from multiplying exponentially large and small quantities. */
+  if (x >= 0) {
+    if (x < 8e-2) {
+      if (fabs(y) < 1e-2)
+        goto taylor;
+      else if (fabs(mIm_z2) < 5e-3 && x < 5e-3)
+        goto taylor_erfi;
+    }
+    /* don't use complex exp function, since that will produce spurious NaN
+       values when multiplying w in an overflow situation. */
+    return 1.0 - exp(mRe_z2) *
+      (C(cos(mIm_z2), sin(mIm_z2))
+       * FADDEEVA(w)(C(-y,x), relerr));
+  }
+  else { // x < 0
+    if (x > -8e-2) { // duplicate from above to avoid fabs(x) call
+      if (fabs(y) < 1e-2)
+        goto taylor;
+      else if (fabs(mIm_z2) < 5e-3 && x > -5e-3)
+        goto taylor_erfi;
+    }
+    else if (isnan(x))
+      return C(NaN, y == 0 ? 0 : NaN);
+    /* don't use complex exp function, since that will produce spurious NaN
+       values when multiplying w in an overflow situation. */
+    return exp(mRe_z2) *
+      (C(cos(mIm_z2), sin(mIm_z2))
+       * FADDEEVA(w)(C(y,-x), relerr)) - 1.0;
+  }
+
+  // Use Taylor series for small |z|, to avoid cancellation inaccuracy
+  //   erf(z) = 2/sqrt(pi) * z * (1 - z^2/3 + z^4/10 - z^6/42 + z^8/216 + ...)
+ taylor:
+  {
+    cmplx mz2 = C(mRe_z2, mIm_z2); // -z^2
+    return z * (1.1283791670955125739
+                + mz2 * (0.37612638903183752464
+                         + mz2 * (0.11283791670955125739
+                                  + mz2 * (0.026866170645131251760
+                                          + mz2 * 0.0052239776254421878422))));
+  }
+
+  /* for small |x| and small |xy|,
+     use Taylor series to avoid cancellation inaccuracy:
+       erf(x+iy) = erf(iy)
+          + 2*exp(y^2)/sqrt(pi) *
+            [ x * (1 - x^2 * (1+2y^2)/3 + x^4 * (3+12y^2+4y^4)/30 + ...
+              - i * x^2 * y * (1 - x^2 * (3+2y^2)/6 + ...) ]
+     where:
+        erf(iy) = exp(y^2) * Im[w(y)]
+  */
+ taylor_erfi:
+  {
+    double x2 = x*x, y2 = y*y;
+    double expy2 = exp(y2);
+    return C
+      (expy2 * x * (1.1283791670955125739
+                    - x2 * (0.37612638903183752464
+                            + 0.75225277806367504925*y2)
+                    + x2*x2 * (0.11283791670955125739
+                               + y2 * (0.45135166683820502956
+                                       + 0.15045055561273500986*y2))),
+       expy2 * (FADDEEVA(w_im)(y)
+                - x2*y * (1.1283791670955125739
+                          - x2 * (0.56418958354775628695
+                                  + 0.37612638903183752464*y2))));
+  }
+}
+
+// erfi(z) = -i erf(iz)
+cmplx FADDEEVA(erfi)(cmplx z, double relerr)
+{
+  cmplx e = FADDEEVA(erf)(C(-cimag(z),creal(z)), relerr);
+  return C(cimag(e), -creal(e));
+}
+
+// erfi(x) = -i erf(ix)
+double FADDEEVA_RE(erfi)(double x)
+{
+  return x*x > 720 ? (x > 0 ? Inf : -Inf)
+    : exp(x*x) * FADDEEVA(w_im)(x);
+}
+
+// erfc(x) = 1 - erf(x)
+double FADDEEVA_RE(erfc)(double x)
+{
+#if !defined(__cplusplus)
+  return erfc(x); // C99 supplies erfc in math.h
+#elif (__cplusplus >= 201103L) || defined(HAVE_ERFC)
+  return ::erfc(x); // C++11 supplies std::erfc in cmath
+#else
+  if (x*x > 750) // underflow
+    return (x >= 0 ? 0.0 : 2.0);
+  return x >= 0 ? exp(-x*x) * FADDEEVA_RE(erfcx)(x)
+    : 2. - exp(-x*x) * FADDEEVA_RE(erfcx)(-x);
+#endif
+}
+
+// erfc(z) = 1 - erf(z)
+cmplx FADDEEVA(erfc)(cmplx z, double relerr)
+{
+  double x = creal(z), y = cimag(z);
+
+  if (x == 0.)
+    return C(1,
+             /* handle y -> Inf limit manually, since
+                exp(y^2) -> Inf but Im[w(y)] -> 0, so
+                IEEE will give us a NaN when it should be Inf */
+             y*y > 720 ? (y > 0 ? -Inf : Inf)
+             : -exp(y*y) * FADDEEVA(w_im)(y));
+  if (y == 0.) {
+    if (x*x > 750) // underflow
+      return C(x >= 0 ? 0.0 : 2.0,
+               -y); // preserve sign of 0
+    return C(x >= 0 ? exp(-x*x) * FADDEEVA_RE(erfcx)(x)
+             : 2. - exp(-x*x) * FADDEEVA_RE(erfcx)(-x),
+             -y); // preserve sign of zero
+  }
+
+  double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
+  double mIm_z2 = -2*x*y; // Im(-z^2)
+  if (mRe_z2 < -750) // underflow
+    return (x >= 0 ? 0.0 : 2.0);
+
+  if (x >= 0)
+    return cexp(C(mRe_z2, mIm_z2))
+      * FADDEEVA(w)(C(-y,x), relerr);
+  else
+    return 2.0 - cexp(C(mRe_z2, mIm_z2))
+      * FADDEEVA(w)(C(y,-x), relerr);
+}
+
+// compute Dawson(x) = sqrt(pi)/2  *  exp(-x^2) * erfi(x)
+double FADDEEVA_RE(Dawson)(double x)
+{
+  const double spi2 = 0.8862269254527580136490837416705725913990; // sqrt(pi)/2
+  return spi2 * FADDEEVA(w_im)(x);
+}
+
+// compute Dawson(z) = sqrt(pi)/2  *  exp(-z^2) * erfi(z)
+cmplx FADDEEVA(Dawson)(cmplx z, double relerr)
+{
+  const double spi2 = 0.8862269254527580136490837416705725913990; // sqrt(pi)/2
+  double x = creal(z), y = cimag(z);
+
+  // handle axes separately for speed & proper handling of x or y = Inf or NaN
+  if (y == 0)
+    return C(spi2 * FADDEEVA(w_im)(x),
+             -y); // preserve sign of 0
+  if (x == 0) {
+    double y2 = y*y;
+    if (y2 < 2.5e-5) { // Taylor expansion
+      return C(x, // preserve sign of 0
+               y * (1.
+                    + y2 * (0.6666666666666666666666666666666666666667
+                            + y2 * 0.26666666666666666666666666666666666667)));
+    }
+    return C(x, // preserve sign of 0
+             spi2 * (y >= 0
+                     ? exp(y2) - FADDEEVA_RE(erfcx)(y)
+                     : FADDEEVA_RE(erfcx)(-y) - exp(y2)));
+  }
+
+  double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
+  double mIm_z2 = -2*x*y; // Im(-z^2)
+  cmplx mz2 = C(mRe_z2, mIm_z2); // -z^2
+
+  /* Handle positive and negative x via different formulas,
+     using the mirror symmetries of w, to avoid overflow/underflow
+     problems from multiplying exponentially large and small quantities. */
+  if (y >= 0) {
+    if (y < 5e-3) {
+      if (fabs(x) < 5e-3)
+        goto taylor;
+      else if (fabs(mIm_z2) < 5e-3)
+        goto taylor_realaxis;
+    }
+    cmplx res = cexp(mz2) - FADDEEVA(w)(z, relerr);
+    return spi2 * C(-cimag(res), creal(res));
+  }
+  else { // y < 0
+    if (y > -5e-3) { // duplicate from above to avoid fabs(x) call
+      if (fabs(x) < 5e-3)
+        goto taylor;
+      else if (fabs(mIm_z2) < 5e-3)
+        goto taylor_realaxis;
+    }
+    else if (isnan(y))
+      return C(x == 0 ? 0 : NaN, NaN);
+    cmplx res = FADDEEVA(w)(-z, relerr) - cexp(mz2);
+    return spi2 * C(-cimag(res), creal(res));
+  }
+
+  // Use Taylor series for small |z|, to avoid cancellation inaccuracy
+  //     dawson(z) = z - 2/3 z^3 + 4/15 z^5 + ...
+ taylor:
+  return z * (1.
+              + mz2 * (0.6666666666666666666666666666666666666667
+                       + mz2 * 0.2666666666666666666666666666666666666667));
+
+  /* for small |y| and small |xy|,
+     use Taylor series to avoid cancellation inaccuracy:
+       dawson(x + iy)
+        = D + y^2 (D + x - 2Dx^2)
+            + y^4 (D/2 + 5x/6 - 2Dx^2 - x^3/3 + 2Dx^4/3)
+        + iy [ (1-2Dx) + 2/3 y^2 (1 - 3Dx - x^2 + 2Dx^3)
+              + y^4/15 (4 - 15Dx - 9x^2 + 20Dx^3 + 2x^4 - 4Dx^5) ] + ...
+     where D = dawson(x)
+
+     However, for large |x|, 2Dx -> 1 which gives cancellation problems in
+     this series (many of the leading terms cancel).  So, for large |x|,
+     we need to substitute a continued-fraction expansion for D.
+
+        dawson(x) = 0.5 / (x-0.5/(x-1/(x-1.5/(x-2/(x-2.5/(x...))))))
+
+     The 6 terms shown here seems to be the minimum needed to be
+     accurate as soon as the simpler Taylor expansion above starts
+     breaking down.  Using this 6-term expansion, factoring out the
+     denominator, and simplifying with Maple, we obtain:
+
+      Re dawson(x + iy) * (-15 + 90x^2 - 60x^4 + 8x^6) / x
+        = 33 - 28x^2 + 4x^4 + y^2 (18 - 4x^2) + 4 y^4
+      Im dawson(x + iy) * (-15 + 90x^2 - 60x^4 + 8x^6) / y
+        = -15 + 24x^2 - 4x^4 + 2/3 y^2 (6x^2 - 15) - 4 y^4
+
+     Finally, for |x| > 5e7, we can use a simpler 1-term continued-fraction
+     expansion for the real part, and a 2-term expansion for the imaginary
+     part.  (This avoids overflow problems for huge |x|.)  This yields:
+
+     Re dawson(x + iy) = [1 + y^2 (1 + y^2/2 - (xy)^2/3)] / (2x)
+     Im dawson(x + iy) = y [ -1 - 2/3 y^2 + y^4/15 (2x^2 - 4) ] / (2x^2 - 1)
+
+ */
+ taylor_realaxis:
+  {
+    double x2 = x*x;
+    if (x2 > 1600) { // |x| > 40
+      double y2 = y*y;
+      if (x2 > 25e14) {// |x| > 5e7
+        double xy2 = (x*y)*(x*y);
+        return C((0.5 + y2 * (0.5 + 0.25*y2
+                              - 0.16666666666666666667*xy2)) / x,
+                 y * (-1 + y2 * (-0.66666666666666666667
+                                 + 0.13333333333333333333*xy2
+                                 - 0.26666666666666666667*y2))
+                 / (2*x2 - 1));
+      }
+      return (1. / (-15 + x2*(90 + x2*(-60 + 8*x2)))) *
+        C(x * (33 + x2 * (-28 + 4*x2)
+               + y2 * (18 - 4*x2 + 4*y2)),
+          y * (-15 + x2 * (24 - 4*x2)
+               + y2 * (4*x2 - 10 - 4*y2)));
+    }
+    else {
+      double D = spi2 * FADDEEVA(w_im)(x);
+      double y2 = y*y;
+      return C
+        (D + y2 * (D + x - 2*D*x2)
+         + y2*y2 * (D * (0.5 - x2 * (2 - 0.66666666666666666667*x2))
+                    + x * (0.83333333333333333333
+                           - 0.33333333333333333333 * x2)),
+         y * (1 - 2*D*x
+              + y2 * 0.66666666666666666667 * (1 - x2 - D*x * (3 - 2*x2))
+              + y2*y2 * (0.26666666666666666667 -
+                         x2 * (0.6 - 0.13333333333333333333 * x2)
+                         - D*x * (1 - x2 * (1.3333333333333333333
+                                            - 0.26666666666666666667 * x2)))));
+    }
+  }
+}
+
+/////////////////////////////////////////////////////////////////////////
+
+// return sinc(x) = sin(x)/x, given both x and sin(x)
+// [since we only use this in cases where sin(x) has already been computed]
+static inline double sinc(double x, double sinx) {
+  return fabs(x) < 1e-4 ? 1 - (0.1666666666666666666667)*x*x : sinx / x;
+}
+
+// sinh(x) via Taylor series, accurate to machine precision for |x| < 1e-2
+static inline double sinh_taylor(double x) {
+  return x * (1 + (x*x) * (0.1666666666666666666667
+                           + 0.00833333333333333333333 * (x*x)));
+}
+
+static inline double sqr(double x) { return x*x; }
+
+// precomputed table of expa2n2[n-1] = exp(-a2*n*n)
+// for double-precision a2 = 0.26865... in FADDEEVA(w), below.
+static const double expa2n2[] = {
+  7.64405281671221563e-01,
+  3.41424527166548425e-01,
+  8.91072646929412548e-02,
+  1.35887299055460086e-02,
+  1.21085455253437481e-03,
+  6.30452613933449404e-05,
+  1.91805156577114683e-06,
+  3.40969447714832381e-08,
+  3.54175089099469393e-10,
+  2.14965079583260682e-12,
+  7.62368911833724354e-15,
+  1.57982797110681093e-17,
+  1.91294189103582677e-20,
+  1.35344656764205340e-23,
+  5.59535712428588720e-27,
+  1.35164257972401769e-30,
+  1.90784582843501167e-34,
+  1.57351920291442930e-38,
+  7.58312432328032845e-43,
+  2.13536275438697082e-47,
+  3.51352063787195769e-52,
+  3.37800830266396920e-57,
+  1.89769439468301000e-62,
+  6.22929926072668851e-68,
+  1.19481172006938722e-73,
+  1.33908181133005953e-79,
+  8.76924303483223939e-86,
+  3.35555576166254986e-92,
+  7.50264110688173024e-99,
+  9.80192200745410268e-106,
+  7.48265412822268959e-113,
+  3.33770122566809425e-120,
+  8.69934598159861140e-128,
+  1.32486951484088852e-135,
+  1.17898144201315253e-143,
+  6.13039120236180012e-152,
+  1.86258785950822098e-160,
+  3.30668408201432783e-169,
+  3.43017280887946235e-178,
+  2.07915397775808219e-187,
+  7.36384545323984966e-197,
+  1.52394760394085741e-206,
+  1.84281935046532100e-216,
+  1.30209553802992923e-226,
+  5.37588903521080531e-237,
+  1.29689584599763145e-247,
+  1.82813078022866562e-258,
+  1.50576355348684241e-269,
+  7.24692320799294194e-281,
+  2.03797051314726829e-292,
+  3.34880215927873807e-304,
+  0.0 // underflow (also prevents reads past array end, below)
+};
+
+/////////////////////////////////////////////////////////////////////////
+
+cmplx FADDEEVA(w)(cmplx z, double relerr)
+{
+  if (creal(z) == 0.0)
+    return C(FADDEEVA_RE(erfcx)(cimag(z)),
+             creal(z)); // give correct sign of 0 in cimag(w)
+  else if (cimag(z) == 0)
+    return C(exp(-sqr(creal(z))),
+             FADDEEVA(w_im)(creal(z)));
+
+  double a, a2, c;
+  if (relerr <= DBL_EPSILON) {
+    relerr = DBL_EPSILON;
+    a = 0.518321480430085929872; // pi / sqrt(-log(eps*0.5))
+    c = 0.329973702884629072537; // (2/pi) * a;
+    a2 = 0.268657157075235951582; // a^2
+  }
+  else {
+    const double pi = 3.14159265358979323846264338327950288419716939937510582;
+    if (relerr > 0.1) relerr = 0.1; // not sensible to compute < 1 digit
+    a = pi / sqrt(-log(relerr*0.5));
+    c = (2/pi)*a;
+    a2 = a*a;
+  }
+  const double x = fabs(creal(z));
+  const double y = cimag(z), ya = fabs(y);
+
+  cmplx ret = 0.; // return value
+
+  double sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0;
+
+#define USE_CONTINUED_FRACTION 1 // 1 to use continued fraction for large |z|
+
+#if USE_CONTINUED_FRACTION
+  if (ya > 7 || (x > 6  // continued fraction is faster
+                 /* As pointed out by M. Zaghloul, the continued
+                    fraction seems to give a large relative error in
+                    Re w(z) for |x| ~ 6 and small |y|, so use
+                    algorithm 816 in this region: */
+                 && (ya > 0.1 || (x > 8 && ya > 1e-10) || x > 28))) {
+
+    /* Poppe & Wijers suggest using a number of terms
+           nu = 3 + 1442 / (26*rho + 77)
+       where rho = sqrt((x/x0)^2 + (y/y0)^2) where x0=6.3, y0=4.4.
+       (They only use this expansion for rho >= 1, but rho a little less
+        than 1 seems okay too.)
+       Instead, I did my own fit to a slightly different function
+       that avoids the hypotenuse calculation, using NLopt to minimize
+       the sum of the squares of the errors in nu with the constraint
+       that the estimated nu be >= minimum nu to attain machine precision.
+       I also separate the regions where nu == 2 and nu == 1. */
+    const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
+    double xs = y < 0 ? -creal(z) : creal(z); // compute for -z if y < 0
+    if (x + ya > 4000) { // nu <= 2
+      if (x + ya > 1e7) { // nu == 1, w(z) = i/sqrt(pi) / z
+        // scale to avoid overflow
+        if (x > ya) {
+          double yax = ya / xs;
+          double denom = ispi / (xs + yax*ya);
+          ret = C(denom*yax, denom);
+        }
+        else if (isinf(ya))
+          return ((isnan(x) || y < 0)
+                  ? C(NaN,NaN) : C(0,0));
+        else {
+          double xya = xs / ya;
+          double denom = ispi / (xya*xs + ya);
+          ret = C(denom, denom*xya);
+        }
+      }
+      else { // nu == 2, w(z) = i/sqrt(pi) * z / (z*z - 0.5)
+        double dr = xs*xs - ya*ya - 0.5, di = 2*xs*ya;
+        double denom = ispi / (dr*dr + di*di);
+        ret = C(denom * (xs*di-ya*dr), denom * (xs*dr+ya*di));
+      }
+    }
+    else { // compute nu(z) estimate and do general continued fraction
+      const double c0=3.9, c1=11.398, c2=0.08254, c3=0.1421, c4=0.2023; // fit
+      double nu = floor(c0 + c1 / (c2*x + c3*ya + c4));
+      double wr = xs, wi = ya;
+      for (nu = 0.5 * (nu - 1); nu > 0.4; nu -= 0.5) {
+        // w <- z - nu/w:
+        double denom = nu / (wr*wr + wi*wi);
+        wr = xs - wr * denom;
+        wi = ya + wi * denom;
+      }
+      { // w(z) = i/sqrt(pi) / w:
+        double denom = ispi / (wr*wr + wi*wi);
+        ret = C(denom*wi, denom*wr);
+      }
+    }
+    if (y < 0) {
+      // use w(z) = 2.0*exp(-z*z) - w(-z),
+      // but be careful of overflow in exp(-z*z)
+      //                                = exp(-(xs*xs-ya*ya) -2*i*xs*ya)
+      return 2.0*cexp(C((ya-xs)*(xs+ya), 2*xs*y)) - ret;
+    }
+    else
+      return ret;
+  }
+#else // !USE_CONTINUED_FRACTION
+  if (x + ya > 1e7) { // w(z) = i/sqrt(pi) / z, to machine precision
+    const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
+    double xs = y < 0 ? -creal(z) : creal(z); // compute for -z if y < 0
+    // scale to avoid overflow
+    if (x > ya) {
+      double yax = ya / xs;
+      double denom = ispi / (xs + yax*ya);
+      ret = C(denom*yax, denom);
+    }
+    else {
+      double xya = xs / ya;
+      double denom = ispi / (xya*xs + ya);
+      ret = C(denom, denom*xya);
+    }
+    if (y < 0) {
+      // use w(z) = 2.0*exp(-z*z) - w(-z),
+      // but be careful of overflow in exp(-z*z)
+      //                                = exp(-(xs*xs-ya*ya) -2*i*xs*ya)
+      return 2.0*cexp(C((ya-xs)*(xs+ya), 2*xs*y)) - ret;
+    }
+    else
+      return ret;
+  }
+#endif // !USE_CONTINUED_FRACTION
+
+  /* Note: The test that seems to be suggested in the paper is x <
+     sqrt(-log(DBL_MIN)), about 26.6, since otherwise exp(-x^2)
+     underflows to zero and sum1,sum2,sum4 are zero.  However, long
+     before this occurs, the sum1,sum2,sum4 contributions are
+     negligible in double precision; I find that this happens for x >
+     about 6, for all y.  On the other hand, I find that the case
+     where we compute all of the sums is faster (at least with the
+     precomputed expa2n2 table) until about x=10.  Furthermore, if we
+     try to compute all of the sums for x > 20, I find that we
+     sometimes run into numerical problems because underflow/overflow
+     problems start to appear in the various coefficients of the sums,
+     below.  Therefore, we use x < 10 here. */
+  else if (x < 10) {
+    double prod2ax = 1, prodm2ax = 1;
+    double expx2;
+
+    if (isnan(y))
+      return C(y,y);
+
+    /* Somewhat ugly copy-and-paste duplication here, but I see significant
+       speedups from using the special-case code with the precomputed
+       exponential, and the x < 5e-4 special case is needed for accuracy. */
+
+    if (relerr == DBL_EPSILON) { // use precomputed exp(-a2*(n*n)) table
+      if (x < 5e-4) { // compute sum4 and sum5 together as sum5-sum4
+        const double x2 = x*x;
+        expx2 = 1 - x2 * (1 - 0.5*x2); // exp(-x*x) via Taylor
+        // compute exp(2*a*x) and exp(-2*a*x) via Taylor, to double precision
+        const double ax2 = 1.036642960860171859744*x; // 2*a*x
+        const double exp2ax =
+          1 + ax2 * (1 + ax2 * (0.5 + 0.166666666666666666667*ax2));
+        const double expm2ax =
+          1 - ax2 * (1 - ax2 * (0.5 - 0.166666666666666666667*ax2));
+        for (int n = 1; 1; ++n) {
+          const double coef = expa2n2[n-1] * expx2 / (a2*(n*n) + y*y);
+          prod2ax *= exp2ax;
+          prodm2ax *= expm2ax;
+          sum1 += coef;
+          sum2 += coef * prodm2ax;
+          sum3 += coef * prod2ax;
+
+          // really = sum5 - sum4
+          sum5 += coef * (2*a) * n * sinh_taylor((2*a)*n*x);
+
+          // test convergence via sum3
+          if (coef * prod2ax < relerr * sum3) break;
+        }
+      }
+      else { // x > 5e-4, compute sum4 and sum5 separately
+        expx2 = exp(-x*x);
+        const double exp2ax = exp((2*a)*x), expm2ax = 1 / exp2ax;
+        for (int n = 1; 1; ++n) {
+          const double coef = expa2n2[n-1] * expx2 / (a2*(n*n) + y*y);
+          prod2ax *= exp2ax;
+          prodm2ax *= expm2ax;
+          sum1 += coef;
+          sum2 += coef * prodm2ax;
+          sum4 += (coef * prodm2ax) * (a*n);
+          sum3 += coef * prod2ax;
+          sum5 += (coef * prod2ax) * (a*n);
+          // test convergence via sum5, since this sum has the slowest decay
+          if ((coef * prod2ax) * (a*n) < relerr * sum5) break;
+        }
+      }
+    }
+    else { // relerr != DBL_EPSILON, compute exp(-a2*(n*n)) on the fly
+      const double exp2ax = exp((2*a)*x), expm2ax = 1 / exp2ax;
+      if (x < 5e-4) { // compute sum4 and sum5 together as sum5-sum4
+        const double x2 = x*x;
+        expx2 = 1 - x2 * (1 - 0.5*x2); // exp(-x*x) via Taylor
+        for (int n = 1; 1; ++n) {
+          const double coef = exp(-a2*(n*n)) * expx2 / (a2*(n*n) + y*y);
+          prod2ax *= exp2ax;
+          prodm2ax *= expm2ax;
+          sum1 += coef;
+          sum2 += coef * prodm2ax;
+          sum3 += coef * prod2ax;
+
+          // really = sum5 - sum4
+          sum5 += coef * (2*a) * n * sinh_taylor((2*a)*n*x);
+
+          // test convergence via sum3
+          if (coef * prod2ax < relerr * sum3) break;
+        }
+      }
+      else { // x > 5e-4, compute sum4 and sum5 separately
+        expx2 = exp(-x*x);
+        for (int n = 1; 1; ++n) {
+          const double coef = exp(-a2*(n*n)) * expx2 / (a2*(n*n) + y*y);
+          prod2ax *= exp2ax;
+          prodm2ax *= expm2ax;
+          sum1 += coef;
+          sum2 += coef * prodm2ax;
+          sum4 += (coef * prodm2ax) * (a*n);
+          sum3 += coef * prod2ax;
+          sum5 += (coef * prod2ax) * (a*n);
+          // test convergence via sum5, since this sum has the slowest decay
+          if ((coef * prod2ax) * (a*n) < relerr * sum5) break;
+        }
+      }
+    }
+    const double expx2erfcxy = // avoid spurious overflow for large negative y
+      y > -6 // for y < -6, erfcx(y) = 2*exp(y*y) to double precision
+      ? expx2*FADDEEVA_RE(erfcx)(y) : 2*exp(y*y-x*x);
+    if (y > 5) { // imaginary terms cancel
+      const double sinxy = sin(x*y);
+      ret = (expx2erfcxy - c*y*sum1) * cos(2*x*y)
+        + (c*x*expx2) * sinxy * sinc(x*y, sinxy);
+    }
+    else {
+      double xs = creal(z);
+      const double sinxy = sin(xs*y);
+      const double sin2xy = sin(2*xs*y), cos2xy = cos(2*xs*y);
+      const double coef1 = expx2erfcxy - c*y*sum1;
+      const double coef2 = c*xs*expx2;
+      ret = C(coef1 * cos2xy + coef2 * sinxy * sinc(xs*y, sinxy),
+              coef2 * sinc(2*xs*y, sin2xy) - coef1 * sin2xy);
+    }
+  }
+  else { // x large: only sum3 & sum5 contribute (see above note)
+    if (isnan(x))
+      return C(x,x);
+    if (isnan(y))
+      return C(y,y);
+
+#if USE_CONTINUED_FRACTION
+    ret = exp(-x*x); // |y| < 1e-10, so we only need exp(-x*x) term
+#else
+    if (y < 0) {
+      /* erfcx(y) ~ 2*exp(y*y) + (< 1) if y < 0, so
+         erfcx(y)*exp(-x*x) ~ 2*exp(y*y-x*x) term may not be negligible
+         if y*y - x*x > -36 or so.  So, compute this term just in case.
+         We also need the -exp(-x*x) term to compute Re[w] accurately
+         in the case where y is very small. */
+      ret = cpolar(2*exp(y*y-x*x) - exp(-x*x), -2*creal(z)*y);
+    }
+    else
+      ret = exp(-x*x); // not negligible in real part if y very small
+#endif
+    // (round instead of ceil as in original paper; note that x/a > 1 here)
+    double n0 = floor(x/a + 0.5); // sum in both directions, starting at n0
+    double dx = a*n0 - x;
+    sum3 = exp(-dx*dx) / (a2*(n0*n0) + y*y);
+    sum5 = a*n0 * sum3;
+    double exp1 = exp(4*a*dx), exp1dn = 1;
+    int dn;
+    for (dn = 1; n0 - dn > 0; ++dn) { // loop over n0-dn and n0+dn terms
+      double np = n0 + dn, nm = n0 - dn;
+      double tp = exp(-sqr(a*dn+dx));
+      double tm = tp * (exp1dn *= exp1); // trick to get tm from tp
+      tp /= (a2*(np*np) + y*y);
+      tm /= (a2*(nm*nm) + y*y);
+      sum3 += tp + tm;
+      sum5 += a * (np * tp + nm * tm);
+      if (a * (np * tp + nm * tm) < relerr * sum5) goto finish;
+    }
+    while (1) { // loop over n0+dn terms only (since n0-dn <= 0)
+      double np = n0 + dn++;
+      double tp = exp(-sqr(a*dn+dx)) / (a2*(np*np) + y*y);
+      sum3 += tp;
+      sum5 += a * np * tp;
+      if (a * np * tp < relerr * sum5) goto finish;
+    }
+  }
+ finish:
+  return ret + C((0.5*c)*y*(sum2+sum3),
+                 (0.5*c)*copysign(sum5-sum4, creal(z)));
+}
+
+/////////////////////////////////////////////////////////////////////////
+
+/* erfcx(x) = exp(x^2) erfc(x) function, for real x, written by
+   Steven G. Johnson, October 2012.
+
+   This function combines a few different ideas.
+
+   First, for x > 50, it uses a continued-fraction expansion (same as
+   for the Faddeeva function, but with algebraic simplifications for z=i*x).
+
+   Second, for 0 <= x <= 50, it uses Chebyshev polynomial approximations,
+   but with two twists:
+
+      a) It maps x to y = 4 / (4+x) in [0,1].  This simple transformation,
+         inspired by a similar transformation in the octave-forge/specfun
+         erfcx by Soren Hauberg, results in much faster Chebyshev convergence
+         than other simple transformations I have examined.
+
+      b) Instead of using a single Chebyshev polynomial for the entire
+         [0,1] y interval, we break the interval up into 100 equal
+         subintervals, with a switch/lookup table, and use much lower
+         degree Chebyshev polynomials in each subinterval. This greatly
+         improves performance in my tests.
+
+   For x < 0, we use the relationship erfcx(-x) = 2 exp(x^2) - erfc(x),
+   with the usual checks for overflow etcetera.
+
+   Performance-wise, it seems to be substantially faster than either
+   the SLATEC DERFC function [or an erfcx function derived therefrom]
+   or Cody's CALERF function (from netlib.org/specfun), while
+   retaining near machine precision in accuracy.  */
+
+/* Given y100=100*y, where y = 4/(4+x) for x >= 0, compute erfc(x).
+
+   Uses a look-up table of 100 different Chebyshev polynomials
+   for y intervals [0,0.01], [0.01,0.02], ...., [0.99,1], generated
+   with the help of Maple and a little shell script.   This allows
+   the Chebyshev polynomials to be of significantly lower degree (about 1/4)
+   compared to fitting the whole [0,1] interval with a single polynomial. */
+static double erfcx_y100(double y100)
+{
+  switch ((int) y100) {
+case 0: {
+double t = 2*y100 - 1;
+return 0.70878032454106438663e-3 + (0.71234091047026302958e-3 + (0.35779077297597742384e-5 + (0.17403143962587937815e-7 + (0.81710660047307788845e-10 + (0.36885022360434957634e-12 + 0.15917038551111111111e-14 * t) * t) * t) * t) * t) * t;
+}
+case 1: {
+double t = 2*y100 - 3;
+return 0.21479143208285144230e-2 + (0.72686402367379996033e-3 + (0.36843175430938995552e-5 + (0.18071841272149201685e-7 + (0.85496449296040325555e-10 + (0.38852037518534291510e-12 + 0.16868473576888888889e-14 * t) * t) * t) * t) * t) * t;
+}
+case 2: {
+double t = 2*y100 - 5;
+return 0.36165255935630175090e-2 + (0.74182092323555510862e-3 + (0.37948319957528242260e-5 + (0.18771627021793087350e-7 + (0.89484715122415089123e-10 + (0.40935858517772440862e-12 + 0.17872061464888888889e-14 * t) * t) * t) * t) * t) * t;
+}
+case 3: {
+double t = 2*y100 - 7;
+return 0.51154983860031979264e-2 + (0.75722840734791660540e-3 + (0.39096425726735703941e-5 + (0.19504168704300468210e-7 + (0.93687503063178993915e-10 + (0.43143925959079664747e-12 + 0.18939926435555555556e-14 * t) * t) * t) * t) * t) * t;
+}
+case 4: {
+double t = 2*y100 - 9;
+return 0.66457513172673049824e-2 + (0.77310406054447454920e-3 + (0.40289510589399439385e-5 + (0.20271233238288381092e-7 + (0.98117631321709100264e-10 + (0.45484207406017752971e-12 + 0.20076352213333333333e-14 * t) * t) * t) * t) * t) * t;
+}
+case 5: {
+double t = 2*y100 - 11;
+return 0.82082389970241207883e-2 + (0.78946629611881710721e-3 + (0.41529701552622656574e-5 + (0.21074693344544655714e-7 + (0.10278874108587317989e-9 + (0.47965201390613339638e-12 + 0.21285907413333333333e-14 * t) * t) * t) * t) * t) * t;
+}
+case 6: {
+double t = 2*y100 - 13;
+return 0.98039537275352193165e-2 + (0.80633440108342840956e-3 + (0.42819241329736982942e-5 + (0.21916534346907168612e-7 + (0.10771535136565470914e-9 + (0.50595972623692822410e-12 + 0.22573462684444444444e-14 * t) * t) * t) * t) * t) * t;
+}
+case 7: {
+double t = 2*y100 - 15;
+return 0.11433927298290302370e-1 + (0.82372858383196561209e-3 + (0.44160495311765438816e-5 + (0.22798861426211986056e-7 + (0.11291291745879239736e-9 + (0.53386189365816880454e-12 + 0.23944209546666666667e-14 * t) * t) * t) * t) * t) * t;
+}
+case 8: {
+double t = 2*y100 - 17;
+return 0.13099232878814653979e-1 + (0.84167002467906968214e-3 + (0.45555958988457506002e-5 + (0.23723907357214175198e-7 + (0.11839789326602695603e-9 + (0.56346163067550237877e-12 + 0.25403679644444444444e-14 * t) * t) * t) * t) * t) * t;
+}
+case 9: {
+double t = 2*y100 - 19;
+return 0.14800987015587535621e-1 + (0.86018092946345943214e-3 + (0.47008265848816866105e-5 + (0.24694040760197315333e-7 + (0.12418779768752299093e-9 + (0.59486890370320261949e-12 + 0.26957764568888888889e-14 * t) * t) * t) * t) * t) * t;
+}
+case 10: {
+double t = 2*y100 - 21;
+return 0.16540351739394069380e-1 + (0.87928458641241463952e-3 + (0.48520195793001753903e-5 + (0.25711774900881709176e-7 + (0.13030128534230822419e-9 + (0.62820097586874779402e-12 + 0.28612737351111111111e-14 * t) * t) * t) * t) * t) * t;
+}
+case 11: {
+double t = 2*y100 - 23;
+return 0.18318536789842392647e-1 + (0.89900542647891721692e-3 + (0.50094684089553365810e-5 + (0.26779777074218070482e-7 + (0.13675822186304615566e-9 + (0.66358287745352705725e-12 + 0.30375273884444444444e-14 * t) * t) * t) * t) * t) * t;
+}
+case 12: {
+double t = 2*y100 - 25;
+return 0.20136801964214276775e-1 + (0.91936908737673676012e-3 + (0.51734830914104276820e-5 + (0.27900878609710432673e-7 + (0.14357976402809042257e-9 + (0.70114790311043728387e-12 + 0.32252476000000000000e-14 * t) * t) * t) * t) * t) * t;
+}
+case 13: {
+double t = 2*y100 - 27;
+return 0.21996459598282740954e-1 + (0.94040248155366777784e-3 + (0.53443911508041164739e-5 + (0.29078085538049374673e-7 + (0.15078844500329731137e-9 + (0.74103813647499204269e-12 + 0.34251892320000000000e-14 * t) * t) * t) * t) * t) * t;
+}
+case 14: {
+double t = 2*y100 - 29;
+return 0.23898877187226319502e-1 + (0.96213386835900177540e-3 + (0.55225386998049012752e-5 + (0.30314589961047687059e-7 + (0.15840826497296335264e-9 + (0.78340500472414454395e-12 + 0.36381553564444444445e-14 * t) * t) * t) * t) * t) * t;
+}
+case 15: {
+double t = 2*y100 - 31;
+return 0.25845480155298518485e-1 + (0.98459293067820123389e-3 + (0.57082915920051843672e-5 + (0.31613782169164830118e-7 + (0.16646478745529630813e-9 + (0.82840985928785407942e-12 + 0.38649975768888888890e-14 * t) * t) * t) * t) * t) * t;
+}
+case 16: {
+double t = 2*y100 - 33;
+return 0.27837754783474696598e-1 + (0.10078108563256892757e-2 + (0.59020366493792212221e-5 + (0.32979263553246520417e-7 + (0.17498524159268458073e-9 + (0.87622459124842525110e-12 + 0.41066206488888888890e-14 * t) * t) * t) * t) * t) * t;
+}
+case 17: {
+double t = 2*y100 - 35;
+return 0.29877251304899307550e-1 + (0.10318204245057349310e-2 + (0.61041829697162055093e-5 + (0.34414860359542720579e-7 + (0.18399863072934089607e-9 + (0.92703227366365046533e-12 + 0.43639844053333333334e-14 * t) * t) * t) * t) * t) * t;
+}
+case 18: {
+double t = 2*y100 - 37;
+return 0.31965587178596443475e-1 + (0.10566560976716574401e-2 + (0.63151633192414586770e-5 + (0.35924638339521924242e-7 + (0.19353584758781174038e-9 + (0.98102783859889264382e-12 + 0.46381060817777777779e-14 * t) * t) * t) * t) * t) * t;
+}
+case 19: {
+double t = 2*y100 - 39;
+return 0.34104450552588334840e-1 + (0.10823541191350532574e-2 + (0.65354356159553934436e-5 + (0.37512918348533521149e-7 + (0.20362979635817883229e-9 + (0.10384187833037282363e-11 + 0.49300625262222222221e-14 * t) * t) * t) * t) * t) * t;
+}
+case 20: {
+double t = 2*y100 - 41;
+return 0.36295603928292425716e-1 + (0.11089526167995268200e-2 + (0.67654845095518363577e-5 + (0.39184292949913591646e-7 + (0.21431552202133775150e-9 + (0.10994259106646731797e-11 + 0.52409949102222222221e-14 * t) * t) * t) * t) * t) * t;
+}
+case 21: {
+double t = 2*y100 - 43;
+return 0.38540888038840509795e-1 + (0.11364917134175420009e-2 + (0.70058230641246312003e-5 + (0.40943644083718586939e-7 + (0.22563034723692881631e-9 + (0.11642841011361992885e-11 + 0.55721092871111111110e-14 * t) * t) * t) * t) * t) * t;
+}
+case 22: {
+double t = 2*y100 - 45;
+return 0.40842225954785960651e-1 + (0.11650136437945673891e-2 + (0.72569945502343006619e-5 + (0.42796161861855042273e-7 + (0.23761401711005024162e-9 + (0.12332431172381557035e-11 + 0.59246802364444444445e-14 * t) * t) * t) * t) * t) * t;
+}
+case 23: {
+double t = 2*y100 - 47;
+return 0.43201627431540222422e-1 + (0.11945628793917272199e-2 + (0.75195743532849206263e-5 + (0.44747364553960993492e-7 + (0.25030885216472953674e-9 + (0.13065684400300476484e-11 + 0.63000532853333333334e-14 * t) * t) * t) * t) * t) * t;
+}
+case 24: {
+double t = 2*y100 - 49;
+return 0.45621193513810471438e-1 + (0.12251862608067529503e-2 + (0.77941720055551920319e-5 + (0.46803119830954460212e-7 + (0.26375990983978426273e-9 + (0.13845421370977119765e-11 + 0.66996477404444444445e-14 * t) * t) * t) * t) * t) * t;
+}
+case 25: {
+double t = 2*y100 - 51;
+return 0.48103121413299865517e-1 + (0.12569331386432195113e-2 + (0.80814333496367673980e-5 + (0.48969667335682018324e-7 + (0.27801515481905748484e-9 + (0.14674637611609884208e-11 + 0.71249589351111111110e-14 * t) * t) * t) * t) * t) * t;
+}
+case 26: {
+double t = 2*y100 - 53;
+return 0.50649709676983338501e-1 + (0.12898555233099055810e-2 + (0.83820428414568799654e-5 + (0.51253642652551838659e-7 + (0.29312563849675507232e-9 + (0.15556512782814827846e-11 + 0.75775607822222222221e-14 * t) * t) * t) * t) * t) * t;
+}
+case 27: {
+double t = 2*y100 - 55;
+return 0.53263363664388864181e-1 + (0.13240082443256975769e-2 + (0.86967260015007658418e-5 + (0.53662102750396795566e-7 + (0.30914568786634796807e-9 + (0.16494420240828493176e-11 + 0.80591079644444444445e-14 * t) * t) * t) * t) * t) * t;
+}
+case 28: {
+double t = 2*y100 - 57;
+return 0.55946601353500013794e-1 + (0.13594491197408190706e-2 + (0.90262520233016380987e-5 + (0.56202552975056695376e-7 + (0.32613310410503135996e-9 + (0.17491936862246367398e-11 + 0.85713381688888888890e-14 * t) * t) * t) * t) * t) * t;
+}
+case 29: {
+double t = 2*y100 - 59;
+return 0.58702059496154081813e-1 + (0.13962391363223647892e-2 + (0.93714365487312784270e-5 + (0.58882975670265286526e-7 + (0.34414937110591753387e-9 + (0.18552853109751857859e-11 + 0.91160736711111111110e-14 * t) * t) * t) * t) * t) * t;
+}
+case 30: {
+double t = 2*y100 - 61;
+return 0.61532500145144778048e-1 + (0.14344426411912015247e-2 + (0.97331446201016809696e-5 + (0.61711860507347175097e-7 + (0.36325987418295300221e-9 + (0.19681183310134518232e-11 + 0.96952238400000000000e-14 * t) * t) * t) * t) * t) * t;
+}
+case 31: {
+double t = 2*y100 - 63;
+return 0.64440817576653297993e-1 + (0.14741275456383131151e-2 + (0.10112293819576437838e-4 + (0.64698236605933246196e-7 + (0.38353412915303665586e-9 + (0.20881176114385120186e-11 + 0.10310784480000000000e-13 * t) * t) * t) * t) * t) * t;
+}
+case 32: {
+double t = 2*y100 - 65;
+return 0.67430045633130393282e-1 + (0.15153655418916540370e-2 + (0.10509857606888328667e-4 + (0.67851706529363332855e-7 + (0.40504602194811140006e-9 + (0.22157325110542534469e-11 + 0.10964842115555555556e-13 * t) * t) * t) * t) * t) * t;
+}
+case 33: {
+double t = 2*y100 - 67;
+return 0.70503365513338850709e-1 + (0.15582323336495709827e-2 + (0.10926868866865231089e-4 + (0.71182482239613507542e-7 + (0.42787405890153386710e-9 + (0.23514379522274416437e-11 + 0.11659571751111111111e-13 * t) * t) * t) * t) * t) * t;
+}
+case 34: {
+double t = 2*y100 - 69;
+return 0.73664114037944596353e-1 + (0.16028078812438820413e-2 + (0.11364423678778207991e-4 + (0.74701423097423182009e-7 + (0.45210162777476488324e-9 + (0.24957355004088569134e-11 + 0.12397238257777777778e-13 * t) * t) * t) * t) * t) * t;
+}
+case 35: {
+double t = 2*y100 - 71;
+return 0.76915792420819562379e-1 + (0.16491766623447889354e-2 + (0.11823685320041302169e-4 + (0.78420075993781544386e-7 + (0.47781726956916478925e-9 + (0.26491544403815724749e-11 + 0.13180196462222222222e-13 * t) * t) * t) * t) * t) * t;
+}
+case 36: {
+double t = 2*y100 - 73;
+return 0.80262075578094612819e-1 + (0.16974279491709504117e-2 + (0.12305888517309891674e-4 + (0.82350717698979042290e-7 + (0.50511496109857113929e-9 + (0.28122528497626897696e-11 + 0.14010889635555555556e-13 * t) * t) * t) * t) * t) * t;
+}
+case 37: {
+double t = 2*y100 - 75;
+return 0.83706822008980357446e-1 + (0.17476561032212656962e-2 + (0.12812343958540763368e-4 + (0.86506399515036435592e-7 + (0.53409440823869467453e-9 + (0.29856186620887555043e-11 + 0.14891851591111111111e-13 * t) * t) * t) * t) * t) * t;
+}
+case 38: {
+double t = 2*y100 - 77;
+return 0.87254084284461718231e-1 + (0.17999608886001962327e-2 + (0.13344443080089492218e-4 + (0.90900994316429008631e-7 + (0.56486134972616465316e-9 + (0.31698707080033956934e-11 + 0.15825697795555555556e-13 * t) * t) * t) * t) * t) * t;
+}
+case 39: {
+double t = 2*y100 - 79;
+return 0.90908120182172748487e-1 + (0.18544478050657699758e-2 + (0.13903663143426120077e-4 + (0.95549246062549906177e-7 + (0.59752787125242054315e-9 + (0.33656597366099099413e-11 + 0.16815130613333333333e-13 * t) * t) * t) * t) * t) * t;
+}
+case 40: {
+double t = 2*y100 - 81;
+return 0.94673404508075481121e-1 + (0.19112284419887303347e-2 + (0.14491572616545004930e-4 + (0.10046682186333613697e-6 + (0.63221272959791000515e-9 + (0.35736693975589130818e-11 + 0.17862931591111111111e-13 * t) * t) * t) * t) * t) * t;
+}
+case 41: {
+double t = 2*y100 - 83;
+return 0.98554641648004456555e-1 + (0.19704208544725622126e-2 + (0.15109836875625443935e-4 + (0.10567036667675984067e-6 + (0.66904168640019354565e-9 + (0.37946171850824333014e-11 + 0.18971959040000000000e-13 * t) * t) * t) * t) * t) * t;
+}
+case 42: {
+double t = 2*y100 - 85;
+return 0.10255677889470089531e0 + (0.20321499629472857418e-2 + (0.15760224242962179564e-4 + (0.11117756071353507391e-6 + (0.70814785110097658502e-9 + (0.40292553276632563925e-11 + 0.20145143075555555556e-13 * t) * t) * t) * t) * t) * t;
+}
+case 43: {
+double t = 2*y100 - 87;
+return 0.10668502059865093318e0 + (0.20965479776148731610e-2 + (0.16444612377624983565e-4 + (0.11700717962026152749e-6 + (0.74967203250938418991e-9 + (0.42783716186085922176e-11 + 0.21385479360000000000e-13 * t) * t) * t) * t) * t) * t;
+}
+case 44: {
+double t = 2*y100 - 89;
+return 0.11094484319386444474e0 + (0.21637548491908170841e-2 + (0.17164995035719657111e-4 + (0.12317915750735938089e-6 + (0.79376309831499633734e-9 + (0.45427901763106353914e-11 + 0.22696025653333333333e-13 * t) * t) * t) * t) * t) * t;
+}
+case 45: {
+double t = 2*y100 - 91;
+return 0.11534201115268804714e0 + (0.22339187474546420375e-2 + (0.17923489217504226813e-4 + (0.12971465288245997681e-6 + (0.84057834180389073587e-9 + (0.48233721206418027227e-11 + 0.24079890062222222222e-13 * t) * t) * t) * t) * t) * t;
+}
+case 46: {
+double t = 2*y100 - 93;
+return 0.11988259392684094740e0 + (0.23071965691918689601e-2 + (0.18722342718958935446e-4 + (0.13663611754337957520e-6 + (0.89028385488493287005e-9 + (0.51210161569225846701e-11 + 0.25540227111111111111e-13 * t) * t) * t) * t) * t) * t;
+}
+case 47: {
+double t = 2*y100 - 95;
+return 0.12457298393509812907e0 + (0.23837544771809575380e-2 + (0.19563942105711612475e-4 + (0.14396736847739470782e-6 + (0.94305490646459247016e-9 + (0.54366590583134218096e-11 + 0.27080225920000000000e-13 * t) * t) * t) * t) * t) * t;
+}
+case 48: {
+double t = 2*y100 - 97;
+return 0.12941991566142438816e0 + (0.24637684719508859484e-2 + (0.20450821127475879816e-4 + (0.15173366280523906622e-6 + (0.99907632506389027739e-9 + (0.57712760311351625221e-11 + 0.28703099555555555556e-13 * t) * t) * t) * t) * t) * t;
+}
+case 49: {
+double t = 2*y100 - 99;
+return 0.13443048593088696613e0 + (0.25474249981080823877e-2 + (0.21385669591362915223e-4 + (0.15996177579900443030e-6 + (0.10585428844575134013e-8 + (0.61258809536787882989e-11 + 0.30412080142222222222e-13 * t) * t) * t) * t) * t) * t;
+}
+case 50: {
+double t = 2*y100 - 101;
+return 0.13961217543434561353e0 + (0.26349215871051761416e-2 + (0.22371342712572567744e-4 + (0.16868008199296822247e-6 + (0.11216596910444996246e-8 + (0.65015264753090890662e-11 + 0.32210394506666666666e-13 * t) * t) * t) * t) * t) * t;
+}
+case 51: {
+double t = 2*y100 - 103;
+return 0.14497287157673800690e0 + (0.27264675383982439814e-2 + (0.23410870961050950197e-4 + (0.17791863939526376477e-6 + (0.11886425714330958106e-8 + (0.68993039665054288034e-11 + 0.34101266222222222221e-13 * t) * t) * t) * t) * t) * t;
+}
+case 52: {
+double t = 2*y100 - 105;
+return 0.15052089272774618151e0 + (0.28222846410136238008e-2 + (0.24507470422713397006e-4 + (0.18770927679626136909e-6 + (0.12597184587583370712e-8 + (0.73203433049229821618e-11 + 0.36087889048888888890e-13 * t) * t) * t) * t) * t) * t;
+}
+case 53: {
+double t = 2*y100 - 107;
+return 0.15626501395774612325e0 + (0.29226079376196624949e-2 + (0.25664553693768450545e-4 + (0.19808568415654461964e-6 + (0.13351257759815557897e-8 + (0.77658124891046760667e-11 + 0.38173420035555555555e-13 * t) * t) * t) * t) * t) * t;
+}
+case 54: {
+double t = 2*y100 - 109;
+return 0.16221449434620737567e0 + (0.30276865332726475672e-2 + (0.26885741326534564336e-4 + (0.20908350604346384143e-6 + (0.14151148144240728728e-8 + (0.82369170665974313027e-11 + 0.40360957457777777779e-13 * t) * t) * t) * t) * t) * t;
+}
+case 55: {
+double t = 2*y100 - 111;
+return 0.16837910595412130659e0 + (0.31377844510793082301e-2 + (0.28174873844911175026e-4 + (0.22074043807045782387e-6 + (0.14999481055996090039e-8 + (0.87348993661930809254e-11 + 0.42653528977777777779e-13 * t) * t) * t) * t) * t) * t;
+}
+case 56: {
+double t = 2*y100 - 113;
+return 0.17476916455659369953e0 + (0.32531815370903068316e-2 + (0.29536024347344364074e-4 + (0.23309632627767074202e-6 + (0.15899007843582444846e-8 + (0.92610375235427359475e-11 + 0.45054073102222222221e-13 * t) * t) * t) * t) * t) * t;
+}
+case 57: {
+double t = 2*y100 - 115;
+return 0.18139556223643701364e0 + (0.33741744168096996041e-2 + (0.30973511714709500836e-4 + (0.24619326937592290996e-6 + (0.16852609412267750744e-8 + (0.98166442942854895573e-11 + 0.47565418097777777779e-13 * t) * t) * t) * t) * t) * t;
+}
+case 58: {
+double t = 2*y100 - 117;
+return 0.18826980194443664549e0 + (0.35010775057740317997e-2 + (0.32491914440014267480e-4 + (0.26007572375886319028e-6 + (0.17863299617388376116e-8 + (0.10403065638343878679e-10 + 0.50190265831111111110e-13 * t) * t) * t) * t) * t) * t;
+}
+case 59: {
+double t = 2*y100 - 119;
+return 0.19540403413693967350e0 + (0.36342240767211326315e-2 + (0.34096085096200907289e-4 + (0.27479061117017637474e-6 + (0.18934228504790032826e-8 + (0.11021679075323598664e-10 + 0.52931171733333333334e-13 * t) * t) * t) * t) * t) * t;
+}
+case 60: {
+double t = 2*y100 - 121;
+return 0.20281109560651886959e0 + (0.37739673859323597060e-2 + (0.35791165457592409054e-4 + (0.29038742889416172404e-6 + (0.20068685374849001770e-8 + (0.11673891799578381999e-10 + 0.55790523093333333334e-13 * t) * t) * t) * t) * t) * t;
+}
+case 61: {
+double t = 2*y100 - 123;
+return 0.21050455062669334978e0 + (0.39206818613925652425e-2 + (0.37582602289680101704e-4 + (0.30691836231886877385e-6 + (0.21270101645763677824e-8 + (0.12361138551062899455e-10 + 0.58770520160000000000e-13 * t) * t) * t) * t) * t) * t;
+}
+case 62: {
+double t = 2*y100 - 125;
+return 0.21849873453703332479e0 + (0.40747643554689586041e-2 + (0.39476163820986711501e-4 + (0.32443839970139918836e-6 + (0.22542053491518680200e-8 + (0.13084879235290858490e-10 + 0.61873153262222222221e-13 * t) * t) * t) * t) * t) * t;
+}
+case 63: {
+double t = 2*y100 - 127;
+return 0.22680879990043229327e0 + (0.42366354648628516935e-2 + (0.41477956909656896779e-4 + (0.34300544894502810002e-6 + (0.23888264229264067658e-8 + (0.13846596292818514601e-10 + 0.65100183751111111110e-13 * t) * t) * t) * t) * t) * t;
+}
+case 64: {
+double t = 2*y100 - 129;
+return 0.23545076536988703937e0 + (0.44067409206365170888e-2 + (0.43594444916224700881e-4 + (0.36268045617760415178e-6 + (0.25312606430853202748e-8 + (0.14647791812837903061e-10 + 0.68453122631111111110e-13 * t) * t) * t) * t) * t) * t;
+}
+case 65: {
+double t = 2*y100 - 131;
+return 0.24444156740777432838e0 + (0.45855530511605787178e-2 + (0.45832466292683085475e-4 + (0.38352752590033030472e-6 + (0.26819103733055603460e-8 + (0.15489984390884756993e-10 + 0.71933206364444444445e-13 * t) * t) * t) * t) * t) * t;
+}
+case 66: {
+double t = 2*y100 - 133;
+return 0.25379911500634264643e0 + (0.47735723208650032167e-2 + (0.48199253896534185372e-4 + (0.40561404245564732314e-6 + (0.28411932320871165585e-8 + (0.16374705736458320149e-10 + 0.75541379822222222221e-13 * t) * t) * t) * t) * t) * t;
+}
+case 67: {
+double t = 2*y100 - 135;
+return 0.26354234756393613032e0 + (0.49713289477083781266e-2 + (0.50702455036930367504e-4 + (0.42901079254268185722e-6 + (0.30095422058900481753e-8 + (0.17303497025347342498e-10 + 0.79278273368888888890e-13 * t) * t) * t) * t) * t) * t;
+}
+case 68: {
+double t = 2*y100 - 137;
+return 0.27369129607732343398e0 + (0.51793846023052643767e-2 + (0.53350152258326602629e-4 + (0.45379208848865015485e-6 + (0.31874057245814381257e-8 + (0.18277905010245111046e-10 + 0.83144182364444444445e-13 * t) * t) * t) * t) * t) * t;
+}
+case 69: {
+double t = 2*y100 - 139;
+return 0.28426714781640316172e0 + (0.53983341916695141966e-2 + (0.56150884865255810638e-4 + (0.48003589196494734238e-6 + (0.33752476967570796349e-8 + (0.19299477888083469086e-10 + 0.87139049137777777779e-13 * t) * t) * t) * t) * t) * t;
+}
+case 70: {
+double t = 2*y100 - 141;
+return 0.29529231465348519920e0 + (0.56288077305420795663e-2 + (0.59113671189913307427e-4 + (0.50782393781744840482e-6 + (0.35735475025851713168e-8 + (0.20369760937017070382e-10 + 0.91262442613333333334e-13 * t) * t) * t) * t) * t) * t;
+}
+case 71: {
+double t = 2*y100 - 143;
+return 0.30679050522528838613e0 + (0.58714723032745403331e-2 + (0.62248031602197686791e-4 + (0.53724185766200945789e-6 + (0.37827999418960232678e-8 + (0.21490291930444538307e-10 + 0.95513539182222222221e-13 * t) * t) * t) * t) * t) * t;
+}
+case 72: {
+double t = 2*y100 - 145;
+return 0.31878680111173319425e0 + (0.61270341192339103514e-2 + (0.65564012259707640976e-4 + (0.56837930287837738996e-6 + (0.40035151353392378882e-8 + (0.22662596341239294792e-10 + 0.99891109760000000000e-13 * t) * t) * t) * t) * t) * t;
+}
+case 73: {
+double t = 2*y100 - 147;
+return 0.33130773722152622027e0 + (0.63962406646798080903e-2 + (0.69072209592942396666e-4 + (0.60133006661885941812e-6 + (0.42362183765883466691e-8 + (0.23888182347073698382e-10 + 0.10439349811555555556e-12 * t) * t) * t) * t) * t) * t;
+}
+case 74: {
+double t = 2*y100 - 149;
+return 0.34438138658041336523e0 + (0.66798829540414007258e-2 + (0.72783795518603561144e-4 + (0.63619220443228800680e-6 + (0.44814499336514453364e-8 + (0.25168535651285475274e-10 + 0.10901861383111111111e-12 * t) * t) * t) * t) * t) * t;
+}
+case 75: {
+double t = 2*y100 - 151;
+return 0.35803744972380175583e0 + (0.69787978834882685031e-2 + (0.76710543371454822497e-4 + (0.67306815308917386747e-6 + (0.47397647975845228205e-8 + (0.26505114141143050509e-10 + 0.11376390933333333333e-12 * t) * t) * t) * t) * t) * t;
+}
+case 76: {
+double t = 2*y100 - 153;
+return 0.37230734890119724188e0 + (0.72938706896461381003e-2 + (0.80864854542670714092e-4 + (0.71206484718062688779e-6 + (0.50117323769745883805e-8 + (0.27899342394100074165e-10 + 0.11862637614222222222e-12 * t) * t) * t) * t) * t) * t;
+}
+case 77: {
+double t = 2*y100 - 155;
+return 0.38722432730555448223e0 + (0.76260375162549802745e-2 + (0.85259785810004603848e-4 + (0.75329383305171327677e-6 + (0.52979361368388119355e-8 + (0.29352606054164086709e-10 + 0.12360253370666666667e-12 * t) * t) * t) * t) * t) * t;
+}
+case 78: {
+double t = 2*y100 - 157;
+return 0.40282355354616940667e0 + (0.79762880915029728079e-2 + (0.89909077342438246452e-4 + (0.79687137961956194579e-6 + (0.55989731807360403195e-8 + (0.30866246101464869050e-10 + 0.12868841946666666667e-12 * t) * t) * t) * t) * t) * t;
+}
+case 79: {
+double t = 2*y100 - 159;
+return 0.41914223158913787649e0 + (0.83456685186950463538e-2 + (0.94827181359250161335e-4 + (0.84291858561783141014e-6 + (0.59154537751083485684e-8 + (0.32441553034347469291e-10 + 0.13387957943111111111e-12 * t) * t) * t) * t) * t) * t;
+}
+case 80: {
+double t = 2*y100 - 161;
+return 0.43621971639463786896e0 + (0.87352841828289495773e-2 + (0.10002929142066799966e-3 + (0.89156148280219880024e-6 + (0.62480008150788597147e-8 + (0.34079760983458878910e-10 + 0.13917107176888888889e-12 * t) * t) * t) * t) * t) * t;
+}
+case 81: {
+double t = 2*y100 - 163;
+return 0.45409763548534330981e0 + (0.91463027755548240654e-2 + (0.10553137232446167258e-3 + (0.94293113464638623798e-6 + (0.65972492312219959885e-8 + (0.35782041795476563662e-10 + 0.14455745872000000000e-12 * t) * t) * t) * t) * t) * t;
+}
+case 82: {
+double t = 2*y100 - 165;
+return 0.47282001668512331468e0 + (0.95799574408860463394e-2 + (0.11135019058000067469e-3 + (0.99716373005509038080e-6 + (0.69638453369956970347e-8 + (0.37549499088161345850e-10 + 0.15003280712888888889e-12 * t) * t) * t) * t) * t) * t;
+}
+case 83: {
+double t = 2*y100 - 167;
+return 0.49243342227179841649e0 + (0.10037550043909497071e-1 + (0.11750334542845234952e-3 + (0.10544006716188967172e-5 + (0.73484461168242224872e-8 + (0.39383162326435752965e-10 + 0.15559069118222222222e-12 * t) * t) * t) * t) * t) * t;
+}
+case 84: {
+double t = 2*y100 - 169;
+return 0.51298708979209258326e0 + (0.10520454564612427224e-1 + (0.12400930037494996655e-3 + (0.11147886579371265246e-5 + (0.77517184550568711454e-8 + (0.41283980931872622611e-10 + 0.16122419680000000000e-12 * t) * t) * t) * t) * t) * t;
+}
+case 85: {
+double t = 2*y100 - 171;
+return 0.53453307979101369843e0 + (0.11030120618800726938e-1 + (0.13088741519572269581e-3 + (0.11784797595374515432e-5 + (0.81743383063044825400e-8 + (0.43252818449517081051e-10 + 0.16692592640000000000e-12 * t) * t) * t) * t) * t) * t;
+}
+case 86: {
+double t = 2*y100 - 173;
+return 0.55712643071169299478e0 + (0.11568077107929735233e-1 + (0.13815797838036651289e-3 + (0.12456314879260904558e-5 + (0.86169898078969313597e-8 + (0.45290446811539652525e-10 + 0.17268801084444444444e-12 * t) * t) * t) * t) * t) * t;
+}
+case 87: {
+double t = 2*y100 - 175;
+return 0.58082532122519320968e0 + (0.12135935999503877077e-1 + (0.14584223996665838559e-3 + (0.13164068573095710742e-5 + (0.90803643355106020163e-8 + (0.47397540713124619155e-10 + 0.17850211608888888889e-12 * t) * t) * t) * t) * t) * t;
+}
+case 88: {
+double t = 2*y100 - 177;
+return 0.60569124025293375554e0 + (0.12735396239525550361e-1 + (0.15396244472258863344e-3 + (0.13909744385382818253e-5 + (0.95651595032306228245e-8 + (0.49574672127669041550e-10 + 0.18435945564444444444e-12 * t) * t) * t) * t) * t) * t;
+}
+case 89: {
+double t = 2*y100 - 179;
+return 0.63178916494715716894e0 + (0.13368247798287030927e-1 + (0.16254186562762076141e-3 + (0.14695084048334056083e-5 + (0.10072078109604152350e-7 + (0.51822304995680707483e-10 + 0.19025081422222222222e-12 * t) * t) * t) * t) * t) * t;
+}
+case 90: {
+double t = 2*y100 - 181;
+return 0.65918774689725319200e0 + (0.14036375850601992063e-1 + (0.17160483760259706354e-3 + (0.15521885688723188371e-5 + (0.10601827031535280590e-7 + (0.54140790105837520499e-10 + 0.19616655146666666667e-12 * t) * t) * t) * t) * t) * t;
+}
+case 91: {
+double t = 2*y100 - 183;
+return 0.68795950683174433822e0 + (0.14741765091365869084e-1 + (0.18117679143520433835e-3 + (0.16392004108230585213e-5 + (0.11155116068018043001e-7 + (0.56530360194925690374e-10 + 0.20209663662222222222e-12 * t) * t) * t) * t) * t) * t;
+}
+case 92: {
+double t = 2*y100 - 185;
+return 0.71818103808729967036e0 + (0.15486504187117112279e-1 + (0.19128428784550923217e-3 + (0.17307350969359975848e-5 + (0.11732656736113607751e-7 + (0.58991125287563833603e-10 + 0.20803065333333333333e-12 * t) * t) * t) * t) * t) * t;
+}
+case 93: {
+double t = 2*y100 - 187;
+return 0.74993321911726254661e0 + (0.16272790364044783382e-1 + (0.20195505163377912645e-3 + (0.18269894883203346953e-5 + (0.12335161021630225535e-7 + (0.61523068312169087227e-10 + 0.21395783431111111111e-12 * t) * t) * t) * t) * t) * t;
+}
+case 94: {
+double t = 2*y100 - 189;
+return 0.78330143531283492729e0 + (0.17102934132652429240e-1 + (0.21321800585063327041e-3 + (0.19281661395543913713e-5 + (0.12963340087354341574e-7 + (0.64126040998066348872e-10 + 0.21986708942222222222e-12 * t) * t) * t) * t) * t) * t;
+}
+case 95: {
+double t = 2*y100 - 191;
+return 0.81837581041023811832e0 + (0.17979364149044223802e-1 + (0.22510330592753129006e-3 + (0.20344732868018175389e-5 + (0.13617902941839949718e-7 + (0.66799760083972474642e-10 + 0.22574701262222222222e-12 * t) * t) * t) * t) * t) * t;
+}
+case 96: {
+double t = 2*y100 - 193;
+return 0.85525144775685126237e0 + (0.18904632212547561026e-1 + (0.23764237370371255638e-3 + (0.21461248251306387979e-5 + (0.14299555071870523786e-7 + (0.69543803864694171934e-10 + 0.23158593688888888889e-12 * t) * t) * t) * t) * t) * t;
+}
+case 97: {
+double t = 2*y100 - 195;
+return 0.89402868170849933734e0 + (0.19881418399127202569e-1 + (0.25086793128395995798e-3 + (0.22633402747585233180e-5 + (0.15008997042116532283e-7 + (0.72357609075043941261e-10 + 0.23737194737777777778e-12 * t) * t) * t) * t) * t) * t;
+}
+case 98: {
+double t = 2*y100 - 197;
+return 0.93481333942870796363e0 + (0.20912536329780368893e-1 + (0.26481403465998477969e-3 + (0.23863447359754921676e-5 + (0.15746923065472184451e-7 + (0.75240468141720143653e-10 + 0.24309291271111111111e-12 * t) * t) * t) * t) * t) * t;
+}
+case 99: {
+double t = 2*y100 - 199;
+return 0.97771701335885035464e0 + (0.22000938572830479551e-1 + (0.27951610702682383001e-3 + (0.25153688325245314530e-5 + (0.16514019547822821453e-7 + (0.78191526829368231251e-10 + 0.24873652355555555556e-12 * t) * t) * t) * t) * t) * t;
+}
+  }
+  // we only get here if y = 1, i.e. |x| < 4*eps, in which case
+  // erfcx is within 1e-15 of 1..
+  return 1.0;
+}
+
+double FADDEEVA_RE(erfcx)(double x)
+{
+  if (x >= 0) {
+    if (x > 50) { // continued-fraction expansion is faster
+      const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
+      if (x > 5e7) // 1-term expansion, important to avoid overflow
+        return ispi / x;
+      /* 5-term expansion (rely on compiler for CSE), simplified from:
+                ispi / (x+0.5/(x+1/(x+1.5/(x+2/x))))  */
+      return ispi*((x*x) * (x*x+4.5) + 2) / (x * ((x*x) * (x*x+5) + 3.75));
+    }
+    return erfcx_y100(400/(4+x));
+  }
+  else
+    return x < -26.7 ? HUGE_VAL : (x < -6.1 ? 2*exp(x*x)
+                                   : 2*exp(x*x) - erfcx_y100(400/(4-x)));
+}
+
+/////////////////////////////////////////////////////////////////////////
+/* Compute a scaled Dawson integral
+            FADDEEVA(w_im)(x) = 2*Dawson(x)/sqrt(pi)
+   equivalent to the imaginary part w(x) for real x.
+
+   Uses methods similar to the erfcx calculation above: continued fractions
+   for large |x|, a lookup table of Chebyshev polynomials for smaller |x|,
+   and finally a Taylor expansion for |x|<0.01.
+
+   Steven G. Johnson, October 2012. */
+
+/* Given y100=100*y, where y = 1/(1+x) for x >= 0, compute w_im(x).
+
+   Uses a look-up table of 100 different Chebyshev polynomials
+   for y intervals [0,0.01], [0.01,0.02], ...., [0.99,1], generated
+   with the help of Maple and a little shell script.   This allows
+   the Chebyshev polynomials to be of significantly lower degree (about 1/30)
+   compared to fitting the whole [0,1] interval with a single polynomial. */
+static double w_im_y100(double y100, double x) {
+  switch ((int) y100) {
+    case 0: {
+      double t = 2*y100 - 1;
+      return 0.28351593328822191546e-2 + (0.28494783221378400759e-2 + (0.14427470563276734183e-4 + (0.10939723080231588129e-6 + (0.92474307943275042045e-9 + (0.89128907666450075245e-11 + 0.92974121935111111110e-13 * t) * t) * t) * t) * t) * t;
+    }
+    case 1: {
+      double t = 2*y100 - 3;
+      return 0.85927161243940350562e-2 + (0.29085312941641339862e-2 + (0.15106783707725582090e-4 + (0.11716709978531327367e-6 + (0.10197387816021040024e-8 + (0.10122678863073360769e-10 + 0.10917479678400000000e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 2: {
+      double t = 2*y100 - 5;
+      return 0.14471159831187703054e-1 + (0.29703978970263836210e-2 + (0.15835096760173030976e-4 + (0.12574803383199211596e-6 + (0.11278672159518415848e-8 + (0.11547462300333495797e-10 + 0.12894535335111111111e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 3: {
+      double t = 2*y100 - 7;
+      return 0.20476320420324610618e-1 + (0.30352843012898665856e-2 + (0.16617609387003727409e-4 + (0.13525429711163116103e-6 + (0.12515095552507169013e-8 + (0.13235687543603382345e-10 + 0.15326595042666666667e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 4: {
+      double t = 2*y100 - 9;
+      return 0.26614461952489004566e-1 + (0.31034189276234947088e-2 + (0.17460268109986214274e-4 + (0.14582130824485709573e-6 + (0.13935959083809746345e-8 + (0.15249438072998932900e-10 + 0.18344741882133333333e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 5: {
+      double t = 2*y100 - 11;
+      return 0.32892330248093586215e-1 + (0.31750557067975068584e-2 + (0.18369907582308672632e-4 + (0.15761063702089457882e-6 + (0.15577638230480894382e-8 + (0.17663868462699097951e-10 + (0.22126732680711111111e-12 + 0.30273474177737853668e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 6: {
+      double t = 2*y100 - 13;
+      return 0.39317207681134336024e-1 + (0.32504779701937539333e-2 + (0.19354426046513400534e-4 + (0.17081646971321290539e-6 + (0.17485733959327106250e-8 + (0.20593687304921961410e-10 + (0.26917401949155555556e-12 + 0.38562123837725712270e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 7: {
+      double t = 2*y100 - 15;
+      return 0.45896976511367738235e-1 + (0.33300031273110976165e-2 + (0.20423005398039037313e-4 + (0.18567412470376467303e-6 + (0.19718038363586588213e-8 + (0.24175006536781219807e-10 + (0.33059982791466666666e-12 + 0.49756574284439426165e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 8: {
+      double t = 2*y100 - 17;
+      return 0.52640192524848962855e-1 + (0.34139883358846720806e-2 + (0.21586390240603337337e-4 + (0.20247136501568904646e-6 + (0.22348696948197102935e-8 + (0.28597516301950162548e-10 + (0.41045502119111111110e-12 + 0.65151614515238361946e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 9: {
+      double t = 2*y100 - 19;
+      return 0.59556171228656770456e-1 + (0.35028374386648914444e-2 + (0.22857246150998562824e-4 + (0.22156372146525190679e-6 + (0.25474171590893813583e-8 + (0.34122390890697400584e-10 + (0.51593189879111111110e-12 + 0.86775076853908006938e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 10: {
+      double t = 2*y100 - 21;
+      return 0.66655089485108212551e-1 + (0.35970095381271285568e-2 + (0.24250626164318672928e-4 + (0.24339561521785040536e-6 + (0.29221990406518411415e-8 + (0.41117013527967776467e-10 + (0.65786450716444444445e-12 + 0.11791885745450623331e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 11: {
+      double t = 2*y100 - 23;
+      return 0.73948106345519174661e-1 + (0.36970297216569341748e-2 + (0.25784588137312868792e-4 + (0.26853012002366752770e-6 + (0.33763958861206729592e-8 + (0.50111549981376976397e-10 + (0.85313857496888888890e-12 + 0.16417079927706899860e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 12: {
+      double t = 2*y100 - 25;
+      return 0.81447508065002963203e-1 + (0.38035026606492705117e-2 + (0.27481027572231851896e-4 + (0.29769200731832331364e-6 + (0.39336816287457655076e-8 + (0.61895471132038157624e-10 + (0.11292303213511111111e-11 + 0.23558532213703884304e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 13: {
+      double t = 2*y100 - 27;
+      return 0.89166884027582716628e-1 + (0.39171301322438946014e-2 + (0.29366827260422311668e-4 + (0.33183204390350724895e-6 + (0.46276006281647330524e-8 + (0.77692631378169813324e-10 + (0.15335153258844444444e-11 + 0.35183103415916026911e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 14: {
+      double t = 2*y100 - 29;
+      return 0.97121342888032322019e-1 + (0.40387340353207909514e-2 + (0.31475490395950776930e-4 + (0.37222714227125135042e-6 + (0.55074373178613809996e-8 + (0.99509175283990337944e-10 + (0.21552645758222222222e-11 + 0.55728651431872687605e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 15: {
+      double t = 2*y100 - 31;
+      return 0.10532778218603311137e0 + (0.41692873614065380607e-2 + (0.33849549774889456984e-4 + (0.42064596193692630143e-6 + (0.66494579697622432987e-8 + (0.13094103581931802337e-9 + (0.31896187409777777778e-11 + 0.97271974184476560742e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 16: {
+      double t = 2*y100 - 33;
+      return 0.11380523107427108222e0 + (0.43099572287871821013e-2 + (0.36544324341565929930e-4 + (0.47965044028581857764e-6 + (0.81819034238463698796e-8 + (0.17934133239549647357e-9 + (0.50956666166186293627e-11 + (0.18850487318190638010e-12 + 0.79697813173519853340e-14 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 17: {
+      double t = 2*y100 - 35;
+      return 0.12257529703447467345e0 + (0.44621675710026986366e-2 + (0.39634304721292440285e-4 + (0.55321553769873381819e-6 + (0.10343619428848520870e-7 + (0.26033830170470368088e-9 + (0.87743837749108025357e-11 + (0.34427092430230063401e-12 + 0.10205506615709843189e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 18: {
+      double t = 2*y100 - 37;
+      return 0.13166276955656699478e0 + (0.46276970481783001803e-2 + (0.43225026380496399310e-4 + (0.64799164020016902656e-6 + (0.13580082794704641782e-7 + (0.39839800853954313927e-9 + (0.14431142411840000000e-10 + 0.42193457308830027541e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 19: {
+      double t = 2*y100 - 39;
+      return 0.14109647869803356475e0 + (0.48088424418545347758e-2 + (0.47474504753352150205e-4 + (0.77509866468724360352e-6 + (0.18536851570794291724e-7 + (0.60146623257887570439e-9 + (0.18533978397305276318e-10 + (0.41033845938901048380e-13 - 0.46160680279304825485e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 20: {
+      double t = 2*y100 - 41;
+      return 0.15091057940548936603e0 + (0.50086864672004685703e-2 + (0.52622482832192230762e-4 + (0.95034664722040355212e-6 + (0.25614261331144718769e-7 + (0.80183196716888606252e-9 + (0.12282524750534352272e-10 + (-0.10531774117332273617e-11 - 0.86157181395039646412e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 21: {
+      double t = 2*y100 - 43;
+      return 0.16114648116017010770e0 + (0.52314661581655369795e-2 + (0.59005534545908331315e-4 + (0.11885518333915387760e-5 + (0.33975801443239949256e-7 + (0.82111547144080388610e-9 + (-0.12357674017312854138e-10 + (-0.24355112256914479176e-11 - 0.75155506863572930844e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 22: {
+      double t = 2*y100 - 45;
+      return 0.17185551279680451144e0 + (0.54829002967599420860e-2 + (0.67013226658738082118e-4 + (0.14897400671425088807e-5 + (0.40690283917126153701e-7 + (0.44060872913473778318e-9 + (-0.52641873433280000000e-10 - 0.30940587864543343124e-11 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 23: {
+      double t = 2*y100 - 47;
+      return 0.18310194559815257381e0 + (0.57701559375966953174e-2 + (0.76948789401735193483e-4 + (0.18227569842290822512e-5 + (0.41092208344387212276e-7 + (-0.44009499965694442143e-9 + (-0.92195414685628803451e-10 + (-0.22657389705721753299e-11 + 0.10004784908106839254e-12 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 24: {
+      double t = 2*y100 - 49;
+      return 0.19496527191546630345e0 + (0.61010853144364724856e-2 + (0.88812881056342004864e-4 + (0.21180686746360261031e-5 + (0.30652145555130049203e-7 + (-0.16841328574105890409e-8 + (-0.11008129460612823934e-9 + (-0.12180794204544515779e-12 + 0.15703325634590334097e-12 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 25: {
+      double t = 2*y100 - 51;
+      return 0.20754006813966575720e0 + (0.64825787724922073908e-2 + (0.10209599627522311893e-3 + (0.22785233392557600468e-5 + (0.73495224449907568402e-8 + (-0.29442705974150112783e-8 + (-0.94082603434315016546e-10 + (0.23609990400179321267e-11 + 0.14141908654269023788e-12 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 26: {
+      double t = 2*y100 - 53;
+      return 0.22093185554845172146e0 + (0.69182878150187964499e-2 + (0.11568723331156335712e-3 + (0.22060577946323627739e-5 + (-0.26929730679360840096e-7 + (-0.38176506152362058013e-8 + (-0.47399503861054459243e-10 + (0.40953700187172127264e-11 + 0.69157730376118511127e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 27: {
+      double t = 2*y100 - 55;
+      return 0.23524827304057813918e0 + (0.74063350762008734520e-2 + (0.12796333874615790348e-3 + (0.18327267316171054273e-5 + (-0.66742910737957100098e-7 + (-0.40204740975496797870e-8 + (0.14515984139495745330e-10 + (0.44921608954536047975e-11 - 0.18583341338983776219e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 28: {
+      double t = 2*y100 - 57;
+      return 0.25058626331812744775e0 + (0.79377285151602061328e-2 + (0.13704268650417478346e-3 + (0.11427511739544695861e-5 + (-0.10485442447768377485e-6 + (-0.34850364756499369763e-8 + (0.72656453829502179208e-10 + (0.36195460197779299406e-11 - 0.84882136022200714710e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 29: {
+      double t = 2*y100 - 59;
+      return 0.26701724900280689785e0 + (0.84959936119625864274e-2 + (0.14112359443938883232e-3 + (0.17800427288596909634e-6 + (-0.13443492107643109071e-6 + (-0.23512456315677680293e-8 + (0.11245846264695936769e-9 + (0.19850501334649565404e-11 - 0.11284666134635050832e-12 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 30: {
+      double t = 2*y100 - 61;
+      return 0.28457293586253654144e0 + (0.90581563892650431899e-2 + (0.13880520331140646738e-3 + (-0.97262302362522896157e-6 + (-0.15077100040254187366e-6 + (-0.88574317464577116689e-9 + (0.12760311125637474581e-9 + (0.20155151018282695055e-12 - 0.10514169375181734921e-12 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 31: {
+      double t = 2*y100 - 63;
+      return 0.30323425595617385705e0 + (0.95968346790597422934e-2 + (0.12931067776725883939e-3 + (-0.21938741702795543986e-5 + (-0.15202888584907373963e-6 + (0.61788350541116331411e-9 + (0.11957835742791248256e-9 + (-0.12598179834007710908e-11 - 0.75151817129574614194e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 32: {
+      double t = 2*y100 - 65;
+      return 0.32292521181517384379e0 + (0.10082957727001199408e-1 + (0.11257589426154962226e-3 + (-0.33670890319327881129e-5 + (-0.13910529040004008158e-6 + (0.19170714373047512945e-8 + (0.94840222377720494290e-10 + (-0.21650018351795353201e-11 - 0.37875211678024922689e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 33: {
+      double t = 2*y100 - 67;
+      return 0.34351233557911753862e0 + (0.10488575435572745309e-1 + (0.89209444197248726614e-4 + (-0.43893459576483345364e-5 + (-0.11488595830450424419e-6 + (0.28599494117122464806e-8 + (0.61537542799857777779e-10 - 0.24935749227658002212e-11 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 34: {
+      double t = 2*y100 - 69;
+      return 0.36480946642143669093e0 + (0.10789304203431861366e-1 + (0.60357993745283076834e-4 + (-0.51855862174130669389e-5 + (-0.83291664087289801313e-7 + (0.33898011178582671546e-8 + (0.27082948188277716482e-10 + (-0.23603379397408694974e-11 + 0.19328087692252869842e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 35: {
+      double t = 2*y100 - 71;
+      return 0.38658679935694939199e0 + (0.10966119158288804999e-1 + (0.27521612041849561426e-4 + (-0.57132774537670953638e-5 + (-0.48404772799207914899e-7 + (0.35268354132474570493e-8 + (-0.32383477652514618094e-11 + (-0.19334202915190442501e-11 + 0.32333189861286460270e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 36: {
+      double t = 2*y100 - 73;
+      return 0.40858275583808707870e0 + (0.11006378016848466550e-1 + (-0.76396376685213286033e-5 + (-0.59609835484245791439e-5 + (-0.13834610033859313213e-7 + (0.33406952974861448790e-8 + (-0.26474915974296612559e-10 + (-0.13750229270354351983e-11 + 0.36169366979417390637e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 37: {
+      double t = 2*y100 - 75;
+      return 0.43051714914006682977e0 + (0.10904106549500816155e-1 + (-0.43477527256787216909e-4 + (-0.59429739547798343948e-5 + (0.17639200194091885949e-7 + (0.29235991689639918688e-8 + (-0.41718791216277812879e-10 + (-0.81023337739508049606e-12 + 0.33618915934461994428e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 38: {
+      double t = 2*y100 - 77;
+      return 0.45210428135559607406e0 + (0.10659670756384400554e-1 + (-0.78488639913256978087e-4 + (-0.56919860886214735936e-5 + (0.44181850467477733407e-7 + (0.23694306174312688151e-8 + (-0.49492621596685443247e-10 + (-0.31827275712126287222e-12 + 0.27494438742721623654e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 39: {
+      double t = 2*y100 - 79;
+      return 0.47306491195005224077e0 + (0.10279006119745977570e-1 + (-0.11140268171830478306e-3 + (-0.52518035247451432069e-5 + (0.64846898158889479518e-7 + (0.17603624837787337662e-8 + (-0.51129481592926104316e-10 + (0.62674584974141049511e-13 + 0.20055478560829935356e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 40: {
+      double t = 2*y100 - 81;
+      return 0.49313638965719857647e0 + (0.97725799114772017662e-2 + (-0.14122854267291533334e-3 + (-0.46707252568834951907e-5 + (0.79421347979319449524e-7 + (0.11603027184324708643e-8 + (-0.48269605844397175946e-10 + (0.32477251431748571219e-12 + 0.12831052634143527985e-13 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 41: {
+      double t = 2*y100 - 83;
+      return 0.51208057433416004042e0 + (0.91542422354009224951e-2 + (-0.16726530230228647275e-3 + (-0.39964621752527649409e-5 + (0.88232252903213171454e-7 + (0.61343113364949928501e-9 + (-0.42516755603130443051e-10 + (0.47910437172240209262e-12 + 0.66784341874437478953e-14 * t) * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 42: {
+      double t = 2*y100 - 85;
+      return 0.52968945458607484524e0 + (0.84400880445116786088e-2 + (-0.18908729783854258774e-3 + (-0.32725905467782951931e-5 + (0.91956190588652090659e-7 + (0.14593989152420122909e-9 + (-0.35239490687644444445e-10 + 0.54613829888448694898e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 43: {
+      double t = 2*y100 - 87;
+      return 0.54578857454330070965e0 + (0.76474155195880295311e-2 + (-0.20651230590808213884e-3 + (-0.25364339140543131706e-5 + (0.91455367999510681979e-7 + (-0.23061359005297528898e-9 + (-0.27512928625244444444e-10 + 0.54895806008493285579e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 44: {
+      double t = 2*y100 - 89;
+      return 0.56023851910298493910e0 + (0.67938321739997196804e-2 + (-0.21956066613331411760e-3 + (-0.18181127670443266395e-5 + (0.87650335075416845987e-7 + (-0.51548062050366615977e-9 + (-0.20068462174044444444e-10 + 0.50912654909758187264e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 45: {
+      double t = 2*y100 - 91;
+      return 0.57293478057455721150e0 + (0.58965321010394044087e-2 + (-0.22841145229276575597e-3 + (-0.11404605562013443659e-5 + (0.81430290992322326296e-7 + (-0.71512447242755357629e-9 + (-0.13372664928000000000e-10 + 0.44461498336689298148e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 46: {
+      double t = 2*y100 - 93;
+      return 0.58380635448407827360e0 + (0.49717469530842831182e-2 + (-0.23336001540009645365e-3 + (-0.51952064448608850822e-6 + (0.73596577815411080511e-7 + (-0.84020916763091566035e-9 + (-0.76700972702222222221e-11 + 0.36914462807972467044e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 47: {
+      double t = 2*y100 - 95;
+      return 0.59281340237769489597e0 + (0.40343592069379730568e-2 + (-0.23477963738658326185e-3 + (0.34615944987790224234e-7 + (0.64832803248395814574e-7 + (-0.90329163587627007971e-9 + (-0.30421940400000000000e-11 + 0.29237386653743536669e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 48: {
+      double t = 2*y100 - 97;
+      return 0.59994428743114271918e0 + (0.30976579788271744329e-2 + (-0.23308875765700082835e-3 + (0.51681681023846925160e-6 + (0.55694594264948268169e-7 + (-0.91719117313243464652e-9 + (0.53982743680000000000e-12 + 0.22050829296187771142e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 49: {
+      double t = 2*y100 - 99;
+      return 0.60521224471819875444e0 + (0.21732138012345456060e-2 + (-0.22872428969625997456e-3 + (0.92588959922653404233e-6 + (0.46612665806531930684e-7 + (-0.89393722514414153351e-9 + (0.31718550353777777778e-11 + 0.15705458816080549117e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 50: {
+      double t = 2*y100 - 101;
+      return 0.60865189969791123620e0 + (0.12708480848877451719e-2 + (-0.22212090111534847166e-3 + (0.12636236031532793467e-5 + (0.37904037100232937574e-7 + (-0.84417089968101223519e-9 + (0.49843180828444444445e-11 + 0.10355439441049048273e-12 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 51: {
+      double t = 2*y100 - 103;
+      return 0.61031580103499200191e0 + (0.39867436055861038223e-3 + (-0.21369573439579869291e-3 + (0.15339402129026183670e-5 + (0.29787479206646594442e-7 + (-0.77687792914228632974e-9 + (0.61192452741333333334e-11 + 0.60216691829459295780e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 52: {
+      double t = 2*y100 - 105;
+      return 0.61027109047879835868e0 + (-0.43680904508059878254e-3 + (-0.20383783788303894442e-3 + (0.17421743090883439959e-5 + (0.22400425572175715576e-7 + (-0.69934719320045128997e-9 + (0.67152759655111111110e-11 + 0.26419960042578359995e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 53: {
+      double t = 2*y100 - 107;
+      return 0.60859639489217430521e0 + (-0.12305921390962936873e-2 + (-0.19290150253894682629e-3 + (0.18944904654478310128e-5 + (0.15815530398618149110e-7 + (-0.61726850580964876070e-9 + 0.68987888999111111110e-11 * t) * t) * t) * t) * t) * t;
+    }
+    case 54: {
+      double t = 2*y100 - 109;
+      return 0.60537899426486075181e0 + (-0.19790062241395705751e-2 + (-0.18120271393047062253e-3 + (0.19974264162313241405e-5 + (0.10055795094298172492e-7 + (-0.53491997919318263593e-9 + (0.67794550295111111110e-11 - 0.17059208095741511603e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 55: {
+      double t = 2*y100 - 111;
+      return 0.60071229457904110537e0 + (-0.26795676776166354354e-2 + (-0.16901799553627508781e-3 + (0.20575498324332621581e-5 + (0.51077165074461745053e-8 + (-0.45536079828057221858e-9 + (0.64488005516444444445e-11 - 0.29311677573152766338e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 56: {
+      double t = 2*y100 - 113;
+      return 0.59469361520112714738e0 + (-0.33308208190600993470e-2 + (-0.15658501295912405679e-3 + (0.20812116912895417272e-5 + (0.93227468760614182021e-9 + (-0.38066673740116080415e-9 + (0.59806790359111111110e-11 - 0.36887077278950440597e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 57: {
+      double t = 2*y100 - 115;
+      return 0.58742228631775388268e0 + (-0.39321858196059227251e-2 + (-0.14410441141450122535e-3 + (0.20743790018404020716e-5 + (-0.25261903811221913762e-8 + (-0.31212416519526924318e-9 + (0.54328422462222222221e-11 - 0.40864152484979815972e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 58: {
+      double t = 2*y100 - 117;
+      return 0.57899804200033018447e0 + (-0.44838157005618913447e-2 + (-0.13174245966501437965e-3 + (0.20425306888294362674e-5 + (-0.53330296023875447782e-8 + (-0.25041289435539821014e-9 + (0.48490437205333333334e-11 - 0.42162206939169045177e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 59: {
+      double t = 2*y100 - 119;
+      return 0.56951968796931245974e0 + (-0.49864649488074868952e-2 + (-0.11963416583477567125e-3 + (0.19906021780991036425e-5 + (-0.75580140299436494248e-8 + (-0.19576060961919820491e-9 + (0.42613011928888888890e-11 - 0.41539443304115604377e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 60: {
+      double t = 2*y100 - 121;
+      return 0.55908401930063918964e0 + (-0.54413711036826877753e-2 + (-0.10788661102511914628e-3 + (0.19229663322982839331e-5 + (-0.92714731195118129616e-8 + (-0.14807038677197394186e-9 + (0.36920870298666666666e-11 - 0.39603726688419162617e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 61: {
+      double t = 2*y100 - 123;
+      return 0.54778496152925675315e0 + (-0.58501497933213396670e-2 + (-0.96582314317855227421e-4 + (0.18434405235069270228e-5 + (-0.10541580254317078711e-7 + (-0.10702303407788943498e-9 + (0.31563175582222222222e-11 - 0.36829748079110481422e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 62: {
+      double t = 2*y100 - 125;
+      return 0.53571290831682823999e0 + (-0.62147030670760791791e-2 + (-0.85782497917111760790e-4 + (0.17553116363443470478e-5 + (-0.11432547349815541084e-7 + (-0.72157091369041330520e-10 + (0.26630811607111111111e-11 - 0.33578660425893164084e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 63: {
+      double t = 2*y100 - 127;
+      return 0.52295422962048434978e0 + (-0.65371404367776320720e-2 + (-0.75530164941473343780e-4 + (0.16613725797181276790e-5 + (-0.12003521296598910761e-7 + (-0.42929753689181106171e-10 + (0.22170894940444444444e-11 - 0.30117697501065110505e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 64: {
+      double t = 2*y100 - 129;
+      return 0.50959092577577886140e0 + (-0.68197117603118591766e-2 + (-0.65852936198953623307e-4 + (0.15639654113906716939e-5 + (-0.12308007991056524902e-7 + (-0.18761997536910939570e-10 + (0.18198628922666666667e-11 - 0.26638355362285200932e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 65: {
+      double t = 2*y100 - 131;
+      return 0.49570040481823167970e0 + (-0.70647509397614398066e-2 + (-0.56765617728962588218e-4 + (0.14650274449141448497e-5 + (-0.12393681471984051132e-7 + (0.92904351801168955424e-12 + (0.14706755960177777778e-11 - 0.23272455351266325318e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 66: {
+      double t = 2*y100 - 133;
+      return 0.48135536250935238066e0 + (-0.72746293327402359783e-2 + (-0.48272489495730030780e-4 + (0.13661377309113939689e-5 + (-0.12302464447599382189e-7 + (0.16707760028737074907e-10 + (0.11672928324444444444e-11 - 0.20105801424709924499e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 67: {
+      double t = 2*y100 - 135;
+      return 0.46662374675511439448e0 + (-0.74517177649528487002e-2 + (-0.40369318744279128718e-4 + (0.12685621118898535407e-5 + (-0.12070791463315156250e-7 + (0.29105507892605823871e-10 + (0.90653314645333333334e-12 - 0.17189503312102982646e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 68: {
+      double t = 2*y100 - 137;
+      return 0.45156879030168268778e0 + (-0.75983560650033817497e-2 + (-0.33045110380705139759e-4 + (0.11732956732035040896e-5 + (-0.11729986947158201869e-7 + (0.38611905704166441308e-10 + (0.68468768305777777779e-12 - 0.14549134330396754575e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 69: {
+      double t = 2*y100 - 139;
+      return 0.43624909769330896904e0 + (-0.77168291040309554679e-2 + (-0.26283612321339907756e-4 + (0.10811018836893550820e-5 + (-0.11306707563739851552e-7 + (0.45670446788529607380e-10 + (0.49782492549333333334e-12 - 0.12191983967561779442e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 70: {
+      double t = 2*y100 - 141;
+      return 0.42071877443548481181e0 + (-0.78093484015052730097e-2 + (-0.20064596897224934705e-4 + (0.99254806680671890766e-6 + (-0.10823412088884741451e-7 + (0.50677203326904716247e-10 + (0.34200547594666666666e-12 - 0.10112698698356194618e-13 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 71: {
+      double t = 2*y100 - 143;
+      return 0.40502758809710844280e0 + (-0.78780384460872937555e-2 + (-0.14364940764532853112e-4 + (0.90803709228265217384e-6 + (-0.10298832847014466907e-7 + (0.53981671221969478551e-10 + (0.21342751381333333333e-12 - 0.82975901848387729274e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 72: {
+      double t = 2*y100 - 145;
+      return 0.38922115269731446690e0 + (-0.79249269708242064120e-2 + (-0.91595258799106970453e-5 + (0.82783535102217576495e-6 + (-0.97484311059617744437e-8 + (0.55889029041660225629e-10 + (0.10851981336888888889e-12 - 0.67278553237853459757e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 73: {
+      double t = 2*y100 - 147;
+      return 0.37334112915460307335e0 + (-0.79519385109223148791e-2 + (-0.44219833548840469752e-5 + (0.75209719038240314732e-6 + (-0.91848251458553190451e-8 + (0.56663266668051433844e-10 + (0.23995894257777777778e-13 - 0.53819475285389344313e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 74: {
+      double t = 2*y100 - 149;
+      return 0.35742543583374223085e0 + (-0.79608906571527956177e-2 + (-0.12530071050975781198e-6 + (0.68088605744900552505e-6 + (-0.86181844090844164075e-8 + (0.56530784203816176153e-10 + (-0.43120012248888888890e-13 - 0.42372603392496813810e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 75: {
+      double t = 2*y100 - 151;
+      return 0.34150846431979618536e0 + (-0.79534924968773806029e-2 + (0.37576885610891515813e-5 + (0.61419263633090524326e-6 + (-0.80565865409945960125e-8 + (0.55684175248749269411e-10 + (-0.95486860764444444445e-13 - 0.32712946432984510595e-14 * t) * t) * t) * t) * t) * t) * t;
+    }
+    case 76: {
+      double t = 2*y100 - 153;
+      return 0.32562129649136346824e0 + (-0.79313448067948884309e-2 + (0.72539159933545300034e-5 + (0.55195028297415503083e-6 + (-0.75063365335570475258e-8 + (0.54281686749699595941e-10 - 0.13545424295111111111e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 77: {
+      double t = 2*y100 - 155;
+      return 0.30979191977078391864e0 + (-0.78959416264207333695e-2 + (0.10389774377677210794e-4 + (0.49404804463196316464e-6 + (-0.69722488229411164685e-8 + (0.52469254655951393842e-10 - 0.16507860650666666667e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 78: {
+      double t = 2*y100 - 157;
+      return 0.29404543811214459904e0 + (-0.78486728990364155356e-2 + (0.13190885683106990459e-4 + (0.44034158861387909694e-6 + (-0.64578942561562616481e-8 + (0.50354306498006928984e-10 - 0.18614473550222222222e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 79: {
+      double t = 2*y100 - 159;
+      return 0.27840427686253660515e0 + (-0.77908279176252742013e-2 + (0.15681928798708548349e-4 + (0.39066226205099807573e-6 + (-0.59658144820660420814e-8 + (0.48030086420373141763e-10 - 0.20018995173333333333e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 80: {
+      double t = 2*y100 - 161;
+      return 0.26288838011163800908e0 + (-0.77235993576119469018e-2 + (0.17886516796198660969e-4 + (0.34482457073472497720e-6 + (-0.54977066551955420066e-8 + (0.45572749379147269213e-10 - 0.20852924954666666667e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 81: {
+      double t = 2*y100 - 163;
+      return 0.24751539954181029717e0 + (-0.76480877165290370975e-2 + (0.19827114835033977049e-4 + (0.30263228619976332110e-6 + (-0.50545814570120129947e-8 + (0.43043879374212005966e-10 - 0.21228012028444444444e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 82: {
+      double t = 2*y100 - 165;
+      return 0.23230087411688914593e0 + (-0.75653060136384041587e-2 + (0.21524991113020016415e-4 + (0.26388338542539382413e-6 + (-0.46368974069671446622e-8 + (0.40492715758206515307e-10 - 0.21238627815111111111e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 83: {
+      double t = 2*y100 - 167;
+      return 0.21725840021297341931e0 + (-0.74761846305979730439e-2 + (0.23000194404129495243e-4 + (0.22837400135642906796e-6 + (-0.42446743058417541277e-8 + (0.37958104071765923728e-10 - 0.20963978568888888889e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 84: {
+      double t = 2*y100 - 169;
+      return 0.20239979200788191491e0 + (-0.73815761980493466516e-2 + (0.24271552727631854013e-4 + (0.19590154043390012843e-6 + (-0.38775884642456551753e-8 + (0.35470192372162901168e-10 - 0.20470131678222222222e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 85: {
+      double t = 2*y100 - 171;
+      return 0.18773523211558098962e0 + (-0.72822604530339834448e-2 + (0.25356688567841293697e-4 + (0.16626710297744290016e-6 + (-0.35350521468015310830e-8 + (0.33051896213898864306e-10 - 0.19811844544000000000e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 86: {
+      double t = 2*y100 - 173;
+      return 0.17327341258479649442e0 + (-0.71789490089142761950e-2 + (0.26272046822383820476e-4 + (0.13927732375657362345e-6 + (-0.32162794266956859603e-8 + (0.30720156036105652035e-10 - 0.19034196304000000000e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 87: {
+      double t = 2*y100 - 175;
+      return 0.15902166648328672043e0 + (-0.70722899934245504034e-2 + (0.27032932310132226025e-4 + (0.11474573347816568279e-6 + (-0.29203404091754665063e-8 + (0.28487010262547971859e-10 - 0.18174029063111111111e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 88: {
+      double t = 2*y100 - 177;
+      return 0.14498609036610283865e0 + (-0.69628725220045029273e-2 + (0.27653554229160596221e-4 + (0.92493727167393036470e-7 + (-0.26462055548683583849e-8 + (0.26360506250989943739e-10 - 0.17261211260444444444e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 89: {
+      double t = 2*y100 - 179;
+      return 0.13117165798208050667e0 + (-0.68512309830281084723e-2 + (0.28147075431133863774e-4 + (0.72351212437979583441e-7 + (-0.23927816200314358570e-8 + (0.24345469651209833155e-10 - 0.16319736960000000000e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 90: {
+      double t = 2*y100 - 181;
+      return 0.11758232561160626306e0 + (-0.67378491192463392927e-2 + (0.28525664781722907847e-4 + (0.54156999310046790024e-7 + (-0.21589405340123827823e-8 + (0.22444150951727334619e-10 - 0.15368675584000000000e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 91: {
+      double t = 2*y100 - 183;
+      return 0.10422112945361673560e0 + (-0.66231638959845581564e-2 + (0.28800551216363918088e-4 + (0.37758983397952149613e-7 + (-0.19435423557038933431e-8 + (0.20656766125421362458e-10 - 0.14422990012444444444e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 92: {
+      double t = 2*y100 - 185;
+      return 0.91090275493541084785e-1 + (-0.65075691516115160062e-2 + (0.28982078385527224867e-4 + (0.23014165807643012781e-7 + (-0.17454532910249875958e-8 + (0.18981946442680092373e-10 - 0.13494234691555555556e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 93: {
+      double t = 2*y100 - 187;
+      return 0.78191222288771379358e-1 + (-0.63914190297303976434e-2 + (0.29079759021299682675e-4 + (0.97885458059415717014e-8 + (-0.15635596116134296819e-8 + (0.17417110744051331974e-10 - 0.12591151763555555556e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 94: {
+      double t = 2*y100 - 189;
+      return 0.65524757106147402224e-1 + (-0.62750311956082444159e-2 + (0.29102328354323449795e-4 + (-0.20430838882727954582e-8 + (-0.13967781903855367270e-8 + (0.15958771833747057569e-10 - 0.11720175765333333333e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 95: {
+      double t = 2*y100 - 191;
+      return 0.53091065838453612773e-1 + (-0.61586898417077043662e-2 + (0.29057796072960100710e-4 + (-0.12597414620517987536e-7 + (-0.12440642607426861943e-8 + (0.14602787128447932137e-10 - 0.10885859114666666667e-12 * t) * t) * t) * t) * t) * t;
+    }
+    case 96: {
+      double t = 2*y100 - 193;
+      return 0.40889797115352738582e-1 + (-0.60426484889413678200e-2 + (0.28953496450191694606e-4 + (-0.21982952021823718400e-7 + (-0.11044169117553026211e-8 + (0.13344562332430552171e-10 - 0.10091231402844444444e-12 * t) * t) * t) * t) * t) * t;
+    }
+  case 97: case 98:
+  case 99: case 100: { // use Taylor expansion for small x (|x| <= 0.0309...)
+      //  (2/sqrt(pi)) * (x - 2/3 x^3  + 4/15 x^5  - 8/105 x^7 + 16/945 x^9)
+      double x2 = x*x;
+      return x * (1.1283791670955125739
+                  - x2 * (0.75225277806367504925
+                          - x2 * (0.30090111122547001970
+                                  - x2 * (0.085971746064420005629
+                                          - x2 * 0.016931216931216931217))));
+    }
+  }
+  /* Since 0 <= y100 < 101, this is only reached if x is NaN,
+     in which case we should return NaN. */
+  return NaN;
+}
+
+double FADDEEVA(w_im)(double x)
+{
+  if (x >= 0) {
+    if (x > 45) { // continued-fraction expansion is faster
+      const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
+      if (x > 5e7) // 1-term expansion, important to avoid overflow
+        return ispi / x;
+      /* 5-term expansion (rely on compiler for CSE), simplified from:
+                ispi / (x-0.5/(x-1/(x-1.5/(x-2/x))))  */
+      return ispi*((x*x) * (x*x-4.5) + 2) / (x * ((x*x) * (x*x-5) + 3.75));
+    }
+    return w_im_y100(100/(1+x), x);
+  }
+  else { // = -FADDEEVA(w_im)(-x)
+    if (x < -45) { // continued-fraction expansion is faster
+      const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
+      if (x < -5e7) // 1-term expansion, important to avoid overflow
+        return ispi / x;
+      /* 5-term expansion (rely on compiler for CSE), simplified from:
+                ispi / (x-0.5/(x-1/(x-1.5/(x-2/x))))  */
+      return ispi*((x*x) * (x*x-4.5) + 2) / (x * ((x*x) * (x*x-5) + 3.75));
+    }
+    return -w_im_y100(100/(1-x), -x);
+  }
+}
+
+/////////////////////////////////////////////////////////////////////////
+
+// Compile with -DTEST_FADDEEVA to compile a little test program
+#ifdef TEST_FADDEEVA
+
+#ifdef __cplusplus
+#  include <cstdio>
+#else
+#  include <stdio.h>
+#endif
+
+// compute relative error |b-a|/|a|, handling case of NaN and Inf,
+static double relerr(double a, double b) {
+  if (isnan(a) || isnan(b) || isinf(a) || isinf(b)) {
+    if ((isnan(a) && !isnan(b)) || (!isnan(a) && isnan(b)) ||
+        (isinf(a) && !isinf(b)) || (!isinf(a) && isinf(b)) ||
+        (isinf(a) && isinf(b) && a*b < 0))
+      return Inf; // "infinite" error
+    return 0; // matching infinity/nan results counted as zero error
+  }
+  if (a == 0)
+    return b == 0 ? 0 : Inf;
+  else
+    return fabs((b-a) / a);
+}
+
+int main(void) {
+  double errmax_all = 0;
+  {
+    printf("############# w(z) tests #############\n");
+#define NTST 57 // define instead of const for C compatibility
+    cmplx z[NTST] = {
+      C(624.2,-0.26123),
+      C(-0.4,3.),
+      C(0.6,2.),
+      C(-1.,1.),
+      C(-1.,-9.),
+      C(-1.,9.),
+      C(-0.0000000234545,1.1234),
+      C(-3.,5.1),
+      C(-53,30.1),
+      C(0.0,0.12345),
+      C(11,1),
+      C(-22,-2),
+      C(9,-28),
+      C(21,-33),
+      C(1e5,1e5),
+      C(1e14,1e14),
+      C(-3001,-1000),
+      C(1e160,-1e159),
+      C(-6.01,0.01),
+      C(-0.7,-0.7),
+      C(2.611780000000000e+01, 4.540909610972489e+03),
+      C(0.8e7,0.3e7),
+      C(-20,-19.8081),
+      C(1e-16,-1.1e-16),
+      C(2.3e-8,1.3e-8),
+      C(6.3,-1e-13),
+      C(6.3,1e-20),
+      C(1e-20,6.3),
+      C(1e-20,16.3),
+      C(9,1e-300),
+      C(6.01,0.11),
+      C(8.01,1.01e-10),
+      C(28.01,1e-300),
+      C(10.01,1e-200),
+      C(10.01,-1e-200),
+      C(10.01,0.99e-10),
+      C(10.01,-0.99e-10),
+      C(1e-20,7.01),
+      C(-1,7.01),
+      C(5.99,7.01),
+      C(1,0),
+      C(55,0),
+      C(-0.1,0),
+      C(1e-20,0),
+      C(0,5e-14),
+      C(0,51),
+      C(Inf,0),
+      C(-Inf,0),
+      C(0,Inf),
+      C(0,-Inf),
+      C(Inf,Inf),
+      C(Inf,-Inf),
+      C(NaN,NaN),
+      C(NaN,0),
+      C(0,NaN),
+      C(NaN,Inf),
+      C(Inf,NaN)
+    };
+    cmplx w[NTST] = { /* w(z), computed with WolframAlpha
+                                   ... note that WolframAlpha is problematic
+                                   some of the above inputs, so I had to
+                                   use the continued-fraction expansion
+                                   in WolframAlpha in some cases, or switch
+                                   to Maple */
+      C(-3.78270245518980507452677445620103199303131110e-7,
+        0.000903861276433172057331093754199933411710053155),
+      C(0.1764906227004816847297495349730234591778719532788,
+        -0.02146550539468457616788719893991501311573031095617),
+      C(0.2410250715772692146133539023007113781272362309451,
+        0.06087579663428089745895459735240964093522265589350),
+      C(0.30474420525691259245713884106959496013413834051768,
+        -0.20821893820283162728743734725471561394145872072738),
+      C(7.317131068972378096865595229600561710140617977e34,
+        8.321873499714402777186848353320412813066170427e34),
+      C(0.0615698507236323685519612934241429530190806818395,
+        -0.00676005783716575013073036218018565206070072304635),
+      C(0.3960793007699874918961319170187598400134746631,
+        -5.593152259116644920546186222529802777409274656e-9),
+      C(0.08217199226739447943295069917990417630675021771804,
+        -0.04701291087643609891018366143118110965272615832184),
+      C(0.00457246000350281640952328010227885008541748668738,
+        -0.00804900791411691821818731763401840373998654987934),
+      C(0.8746342859608052666092782112565360755791467973338452,
+        0.),
+      C(0.00468190164965444174367477874864366058339647648741,
+        0.0510735563901306197993676329845149741675029197050),
+      C(-0.0023193175200187620902125853834909543869428763219,
+        -0.025460054739731556004902057663500272721780776336),
+      C(9.11463368405637174660562096516414499772662584e304,
+        3.97101807145263333769664875189354358563218932e305),
+      C(-4.4927207857715598976165541011143706155432296e281,
+        -2.8019591213423077494444700357168707775769028e281),
+      C(2.820947917809305132678577516325951485807107151e-6,
+        2.820947917668257736791638444590253942253354058e-6),
+      C(2.82094791773878143474039725787438662716372268e-15,
+        2.82094791773878143474039725773333923127678361e-15),
+      C(-0.0000563851289696244350147899376081488003110150498,
+        -0.000169211755126812174631861529808288295454992688),
+      C(-5.586035480670854326218608431294778077663867e-162,
+        5.586035480670854326218608431294778077663867e-161),
+      C(0.00016318325137140451888255634399123461580248456,
+        -0.095232456573009287370728788146686162555021209999),
+      C(0.69504753678406939989115375989939096800793577783885,
+        -1.8916411171103639136680830887017670616339912024317),
+      C(0.0001242418269653279656612334210746733213167234822,
+        7.145975826320186888508563111992099992116786763e-7),
+      C(2.318587329648353318615800865959225429377529825e-8,
+        6.182899545728857485721417893323317843200933380e-8),
+      C(-0.0133426877243506022053521927604277115767311800303,
+        -0.0148087097143220769493341484176979826888871576145),
+      C(1.00000000000000012412170838050638522857747934,
+        1.12837916709551279389615890312156495593616433e-16),
+      C(0.9999999853310704677583504063775310832036830015,
+        2.595272024519678881897196435157270184030360773e-8),
+      C(-1.4731421795638279504242963027196663601154624e-15,
+        0.090727659684127365236479098488823462473074709),
+      C(5.79246077884410284575834156425396800754409308e-18,
+        0.0907276596841273652364790985059772809093822374),
+      C(0.0884658993528521953466533278764830881245144368,
+        1.37088352495749125283269718778582613192166760e-22),
+      C(0.0345480845419190424370085249304184266813447878,
+        2.11161102895179044968099038990446187626075258e-23),
+      C(6.63967719958073440070225527042829242391918213e-36,
+        0.0630820900592582863713653132559743161572639353),
+      C(0.00179435233208702644891092397579091030658500743634,
+        0.0951983814805270647939647438459699953990788064762),
+      C(9.09760377102097999924241322094863528771095448e-13,
+        0.0709979210725138550986782242355007611074966717),
+      C(7.2049510279742166460047102593255688682910274423e-304,
+        0.0201552956479526953866611812593266285000876784321),
+      C(3.04543604652250734193622967873276113872279682e-44,
+        0.0566481651760675042930042117726713294607499165),
+      C(3.04543604652250734193622967873276113872279682e-44,
+        0.0566481651760675042930042117726713294607499165),
+      C(0.5659928732065273429286988428080855057102069081e-12,
+        0.056648165176067504292998527162143030538756683302),
+      C(-0.56599287320652734292869884280802459698927645e-12,
+        0.0566481651760675042929985271621430305387566833029),
+      C(0.0796884251721652215687859778119964009569455462,
+        1.11474461817561675017794941973556302717225126e-22),
+      C(0.07817195821247357458545539935996687005781943386550,
+        -0.01093913670103576690766705513142246633056714279654),
+      C(0.04670032980990449912809326141164730850466208439937,
+        0.03944038961933534137558064191650437353429669886545),
+      C(0.36787944117144232159552377016146086744581113103176,
+        0.60715770584139372911503823580074492116122092866515),
+      C(0,
+        0.010259688805536830986089913987516716056946786526145),
+      C(0.99004983374916805357390597718003655777207908125383,
+        -0.11208866436449538036721343053869621153527769495574),
+      C(0.99999999999999999999999999999999999999990000,
+        1.12837916709551257389615890312154517168802603e-20),
+      C(0.999999999999943581041645226871305192054749891144158,
+        0),
+      C(0.0110604154853277201542582159216317923453996211744250,
+        0),
+      C(0,0),
+      C(0,0),
+      C(0,0),
+      C(Inf,0),
+      C(0,0),
+      C(NaN,NaN),
+      C(NaN,NaN),
+      C(NaN,NaN),
+      C(NaN,0),
+      C(NaN,NaN),
+      C(NaN,NaN)
+    };
+    double errmax = 0;
+    for (int i = 0; i < NTST; ++i) {
+      cmplx fw = FADDEEVA(w)(z[i],0.);
+      double re_err = relerr(creal(w[i]), creal(fw));
+      double im_err = relerr(cimag(w[i]), cimag(fw));
+      printf("w(%g%+gi) = %g%+gi (vs. %g%+gi), re/im rel. err. = %0.2g/%0.2g)\n",
+             creal(z[i]),cimag(z[i]), creal(fw),cimag(fw), creal(w[i]),cimag(w[i]),
+             re_err, im_err);
+      if (re_err > errmax) errmax = re_err;
+      if (im_err > errmax) errmax = im_err;
+    }
+    if (errmax > 1e-13) {
+      printf("FAILURE -- relative error %g too large!\n", errmax);
+      return 1;
+    }
+    printf("SUCCESS (max relative error = %g)\n", errmax);
+    if (errmax > errmax_all) errmax_all = errmax;
+  }
+  {
+#undef NTST
+#define NTST 41 // define instead of const for C compatibility
+    cmplx z[NTST] = {
+      C(1,2),
+      C(-1,2),
+      C(1,-2),
+      C(-1,-2),
+      C(9,-28),
+      C(21,-33),
+      C(1e3,1e3),
+      C(-3001,-1000),
+      C(1e160,-1e159),
+      C(5.1e-3, 1e-8),
+      C(-4.9e-3, 4.95e-3),
+      C(4.9e-3, 0.5),
+      C(4.9e-4, -0.5e1),
+      C(-4.9e-5, -0.5e2),
+      C(5.1e-3, 0.5),
+      C(5.1e-4, -0.5e1),
+      C(-5.1e-5, -0.5e2),
+      C(1e-6,2e-6),
+      C(0,2e-6),
+      C(0,2),
+      C(0,20),
+      C(0,200),
+      C(Inf,0),
+      C(-Inf,0),
+      C(0,Inf),
+      C(0,-Inf),
+      C(Inf,Inf),
+      C(Inf,-Inf),
+      C(NaN,NaN),
+      C(NaN,0),
+      C(0,NaN),
+      C(NaN,Inf),
+      C(Inf,NaN),
+      C(1e-3,NaN),
+      C(7e-2,7e-2),
+      C(7e-2,-7e-4),
+      C(-9e-2,7e-4),
+      C(-9e-2,9e-2),
+      C(-7e-4,9e-2),
+      C(7e-2,0.9e-2),
+      C(7e-2,1.1e-2)
+    };
+    cmplx w[NTST] = { // erf(z[i]), evaluated with Maple
+      C(-0.5366435657785650339917955593141927494421,
+        -5.049143703447034669543036958614140565553),
+      C(0.5366435657785650339917955593141927494421,
+        -5.049143703447034669543036958614140565553),
+      C(-0.5366435657785650339917955593141927494421,
+        5.049143703447034669543036958614140565553),
+      C(0.5366435657785650339917955593141927494421,
+        5.049143703447034669543036958614140565553),
+      C(0.3359473673830576996788000505817956637777e304,
+        -0.1999896139679880888755589794455069208455e304),
+      C(0.3584459971462946066523939204836760283645e278,
+        0.3818954885257184373734213077678011282505e280),
+      C(0.9996020422657148639102150147542224526887,
+        0.00002801044116908227889681753993542916894856),
+      C(-1, 0),
+      C(1, 0),
+      C(0.005754683859034800134412990541076554934877,
+        0.1128349818335058741511924929801267822634e-7),
+      C(-0.005529149142341821193633460286828381876955,
+        0.005585388387864706679609092447916333443570),
+      C(0.007099365669981359632319829148438283865814,
+        0.6149347012854211635026981277569074001219),
+      C(0.3981176338702323417718189922039863062440e8,
+        -0.8298176341665249121085423917575122140650e10),
+      C(-Inf,
+        -Inf),
+      C(0.007389128308257135427153919483147229573895,
+        0.6149332524601658796226417164791221815139),
+      C(0.4143671923267934479245651547534414976991e8,
+        -0.8298168216818314211557046346850921446950e10),
+      C(-Inf,
+        -Inf),
+      C(0.1128379167099649964175513742247082845155e-5,
+        0.2256758334191777400570377193451519478895e-5),
+      C(0,
+        0.2256758334194034158904576117253481476197e-5),
+      C(0,
+        18.56480241457555259870429191324101719886),
+      C(0,
+        0.1474797539628786202447733153131835124599e173),
+      C(0,
+        Inf),
+      C(1,0),
+      C(-1,0),
+      C(0,Inf),
+      C(0,-Inf),
+      C(NaN,NaN),
+      C(NaN,NaN),
+      C(NaN,NaN),
+      C(NaN,0),
+      C(0,NaN),
+      C(NaN,NaN),
+      C(NaN,NaN),
+      C(NaN,NaN),
+      C(0.07924380404615782687930591956705225541145,
+        0.07872776218046681145537914954027729115247),
+      C(0.07885775828512276968931773651224684454495,
+        -0.0007860046704118224342390725280161272277506),
+      C(-0.1012806432747198859687963080684978759881,
+        0.0007834934747022035607566216654982820299469),
+      C(-0.1020998418798097910247132140051062512527,
+        0.1010030778892310851309082083238896270340),
+      C(-0.0007962891763147907785684591823889484764272,
+        0.1018289385936278171741809237435404896152),
+      C(0.07886408666470478681566329888615410479530,
+        0.01010604288780868961492224347707949372245),
+      C(0.07886723099940260286824654364807981336591,
+        0.01235199327873258197931147306290916629654)
+    };
+#define TST(f,isc)                                                      \
+    printf("############# " #f "(z) tests #############\n");            \
+    double errmax = 0;                                                  \
+    for (int i = 0; i < NTST; ++i) {                                    \
+      cmplx fw = FADDEEVA(f)(z[i],0.);                  \
+      double re_err = relerr(creal(w[i]), creal(fw));                   \
+      double im_err = relerr(cimag(w[i]), cimag(fw));                   \
+      printf(#f "(%g%+gi) = %g%+gi (vs. %g%+gi), re/im rel. err. = %0.2g/%0.2g)\n", \
+             creal(z[i]),cimag(z[i]), creal(fw),cimag(fw), creal(w[i]),cimag(w[i]), \
+             re_err, im_err);                                           \
+      if (re_err > errmax) errmax = re_err;                             \
+      if (im_err > errmax) errmax = im_err;                             \
+    }                                                                   \
+    if (errmax > 1e-13) {                                               \
+      printf("FAILURE -- relative error %g too large!\n", errmax);      \
+      return 1;                                                         \
+    }                                                                   \
+    printf("Checking " #f "(x) special case...\n");                     \
+    for (int i = 0; i < 10000; ++i) {                                   \
+      double x = pow(10., -300. + i * 600. / (10000 - 1));              \
+      double re_err = relerr(FADDEEVA_RE(f)(x),                         \
+                             creal(FADDEEVA(f)(C(x,x*isc),0.)));        \
+      if (re_err > errmax) errmax = re_err;                             \
+      re_err = relerr(FADDEEVA_RE(f)(-x),                               \
+                      creal(FADDEEVA(f)(C(-x,x*isc),0.)));              \
+      if (re_err > errmax) errmax = re_err;                             \
+    }                                                                   \
+    {                                                                   \
+      double re_err = relerr(FADDEEVA_RE(f)(Inf),                       \
+                             creal(FADDEEVA(f)(C(Inf,0.),0.))); \
+      if (re_err > errmax) errmax = re_err;                             \
+      re_err = relerr(FADDEEVA_RE(f)(-Inf),                             \
+                      creal(FADDEEVA(f)(C(-Inf,0.),0.)));               \
+      if (re_err > errmax) errmax = re_err;                             \
+      re_err = relerr(FADDEEVA_RE(f)(NaN),                              \
+                      creal(FADDEEVA(f)(C(NaN,0.),0.)));                \
+      if (re_err > errmax) errmax = re_err;                             \
+    }                                                                   \
+    if (errmax > 1e-13) {                                               \
+      printf("FAILURE -- relative error %g too large!\n", errmax);      \
+      return 1;                                                         \
+    }                                                                   \
+    printf("SUCCESS (max relative error = %g)\n", errmax);              \
+    if (errmax > errmax_all) errmax_all = errmax
+
+    TST(erf, 1e-20);
+  }
+  {
+    // since erfi just calls through to erf, just one test should
+    // be sufficient to make sure I didn't screw up the signs or something
+#undef NTST
+#define NTST 1 // define instead of const for C compatibility
+    cmplx z[NTST] = { C(1.234,0.5678) };
+    cmplx w[NTST] = { // erfi(z[i]), computed with Maple
+      C(1.081032284405373149432716643834106923212,
+        1.926775520840916645838949402886591180834)
+    };
+    TST(erfi, 0);
+  }
+  {
+    // since erfcx just calls through to w, just one test should
+    // be sufficient to make sure I didn't screw up the signs or something
+#undef NTST
+#define NTST 1 // define instead of const for C compatibility
+    cmplx z[NTST] = { C(1.234,0.5678) };
+    cmplx w[NTST] = { // erfcx(z[i]), computed with Maple
+      C(0.3382187479799972294747793561190487832579,
+        -0.1116077470811648467464927471872945833154)
+    };
+    TST(erfcx, 0);
+  }
+  {
+#undef NTST
+#define NTST 30 // define instead of const for C compatibility
+    cmplx z[NTST] = {
+      C(1,2),
+      C(-1,2),
+      C(1,-2),
+      C(-1,-2),
+      C(9,-28),
+      C(21,-33),
+      C(1e3,1e3),
+      C(-3001,-1000),
+      C(1e160,-1e159),
+      C(5.1e-3, 1e-8),
+      C(0,2e-6),
+      C(0,2),
+      C(0,20),
+      C(0,200),
+      C(2e-6,0),
+      C(2,0),
+      C(20,0),
+      C(200,0),
+      C(Inf,0),
+      C(-Inf,0),
+      C(0,Inf),
+      C(0,-Inf),
+      C(Inf,Inf),
+      C(Inf,-Inf),
+      C(NaN,NaN),
+      C(NaN,0),
+      C(0,NaN),
+      C(NaN,Inf),
+      C(Inf,NaN),
+      C(88,0)
+    };
+    cmplx w[NTST] = { // erfc(z[i]), evaluated with Maple
+      C(1.536643565778565033991795559314192749442,
+        5.049143703447034669543036958614140565553),
+      C(0.4633564342214349660082044406858072505579,
+        5.049143703447034669543036958614140565553),
+      C(1.536643565778565033991795559314192749442,
+        -5.049143703447034669543036958614140565553),
+      C(0.4633564342214349660082044406858072505579,
+        -5.049143703447034669543036958614140565553),
+      C(-0.3359473673830576996788000505817956637777e304,
+        0.1999896139679880888755589794455069208455e304),
+      C(-0.3584459971462946066523939204836760283645e278,
+        -0.3818954885257184373734213077678011282505e280),
+      C(0.0003979577342851360897849852457775473112748,
+        -0.00002801044116908227889681753993542916894856),
+      C(2, 0),
+      C(0, 0),
+      C(0.9942453161409651998655870094589234450651,
+        -0.1128349818335058741511924929801267822634e-7),
+      C(1,
+        -0.2256758334194034158904576117253481476197e-5),
+      C(1,
+        -18.56480241457555259870429191324101719886),
+      C(1,
+        -0.1474797539628786202447733153131835124599e173),
+      C(1, -Inf),
+      C(0.9999977432416658119838633199332831406314,
+        0),
+      C(0.004677734981047265837930743632747071389108,
+        0),
+      C(0.5395865611607900928934999167905345604088e-175,
+        0),
+      C(0, 0),
+      C(0, 0),
+      C(2, 0),
+      C(1, -Inf),
+      C(1, Inf),
+      C(NaN, NaN),
+      C(NaN, NaN),
+      C(NaN, NaN),
+      C(NaN, 0),
+      C(1, NaN),
+      C(NaN, NaN),
+      C(NaN, NaN),
+      C(0,0)
+    };
+    TST(erfc, 1e-20);
+  }
+  {
+#undef NTST
+#define NTST 48 // define instead of const for C compatibility
+    cmplx z[NTST] = {
+      C(2,1),
+      C(-2,1),
+      C(2,-1),
+      C(-2,-1),
+      C(-28,9),
+      C(33,-21),
+      C(1e3,1e3),
+      C(-1000,-3001),
+      C(1e-8, 5.1e-3),
+      C(4.95e-3, -4.9e-3),
+      C(5.1e-3, 5.1e-3),
+      C(0.5, 4.9e-3),
+      C(-0.5e1, 4.9e-4),
+      C(-0.5e2, -4.9e-5),
+      C(0.5e3, 4.9e-6),
+      C(0.5, 5.1e-3),
+      C(-0.5e1, 5.1e-4),
+      C(-0.5e2, -5.1e-5),
+      C(1e-6,2e-6),
+      C(2e-6,0),
+      C(2,0),
+      C(20,0),
+      C(200,0),
+      C(0,4.9e-3),
+      C(0,-5.1e-3),
+      C(0,2e-6),
+      C(0,-2),
+      C(0,20),
+      C(0,-200),
+      C(Inf,0),
+      C(-Inf,0),
+      C(0,Inf),
+      C(0,-Inf),
+      C(Inf,Inf),
+      C(Inf,-Inf),
+      C(NaN,NaN),
+      C(NaN,0),
+      C(0,NaN),
+      C(NaN,Inf),
+      C(Inf,NaN),
+      C(39, 6.4e-5),
+      C(41, 6.09e-5),
+      C(4.9e7, 5e-11),
+      C(5.1e7, 4.8e-11),
+      C(1e9, 2.4e-12),
+      C(1e11, 2.4e-14),
+      C(1e13, 2.4e-16),
+      C(1e300, 2.4e-303)
+    };
+    cmplx w[NTST] = { // dawson(z[i]), evaluated with Maple
+      C(0.1635394094345355614904345232875688576839,
+        -0.1531245755371229803585918112683241066853),
+      C(-0.1635394094345355614904345232875688576839,
+        -0.1531245755371229803585918112683241066853),
+      C(0.1635394094345355614904345232875688576839,
+        0.1531245755371229803585918112683241066853),
+      C(-0.1635394094345355614904345232875688576839,
+        0.1531245755371229803585918112683241066853),
+      C(-0.01619082256681596362895875232699626384420,
+        -0.005210224203359059109181555401330902819419),
+      C(0.01078377080978103125464543240346760257008,
+        0.006866888783433775382193630944275682670599),
+      C(-0.5808616819196736225612296471081337245459,
+        0.6688593905505562263387760667171706325749),
+      C(Inf,
+        -Inf),
+      C(0.1000052020902036118082966385855563526705e-7,
+        0.005100088434920073153418834680320146441685),
+      C(0.004950156837581592745389973960217444687524,
+        -0.004899838305155226382584756154100963570500),
+      C(0.005100176864319675957314822982399286703798,
+        0.005099823128319785355949825238269336481254),
+      C(0.4244534840871830045021143490355372016428,
+        0.002820278933186814021399602648373095266538),
+      C(-0.1021340733271046543881236523269967674156,
+        -0.00001045696456072005761498961861088944159916),
+      C(-0.01000200120119206748855061636187197886859,
+        0.9805885888237419500266621041508714123763e-8),
+      C(0.001000002000012000023960527532953151819595,
+        -0.9800058800588007290937355024646722133204e-11),
+      C(0.4244549085628511778373438768121222815752,
+        0.002935393851311701428647152230552122898291),
+      C(-0.1021340732357117208743299813648493928105,
+        -0.00001088377943049851799938998805451564893540),
+      C(-0.01000200120119126652710792390331206563616,
+        0.1020612612857282306892368985525393707486e-7),
+      C(0.1000000000007333333333344266666666664457e-5,
+        0.2000000000001333333333323199999999978819e-5),
+      C(0.1999999999994666666666675199999999990248e-5,
+        0),
+      C(0.3013403889237919660346644392864226952119,
+        0),
+      C(0.02503136792640367194699495234782353186858,
+        0),
+      C(0.002500031251171948248596912483183760683918,
+        0),
+      C(0,0.004900078433419939164774792850907128053308),
+      C(0,-0.005100088434920074173454208832365950009419),
+      C(0,0.2000000000005333333333341866666666676419e-5),
+      C(0,-48.16001211429122974789822893525016528191),
+      C(0,0.4627407029504443513654142715903005954668e174),
+      C(0,-Inf),
+      C(0,0),
+      C(-0,0),
+      C(0, Inf),
+      C(0, -Inf),
+      C(NaN, NaN),
+      C(NaN, NaN),
+      C(NaN, NaN),
+      C(NaN, 0),
+      C(0, NaN),
+      C(NaN, NaN),
+      C(NaN, NaN),
+      C(0.01282473148489433743567240624939698290584,
+        -0.2105957276516618621447832572909153498104e-7),
+      C(0.01219875253423634378984109995893708152885,
+        -0.1813040560401824664088425926165834355953e-7),
+      C(0.1020408163265306334945473399689037886997e-7,
+        -0.1041232819658476285651490827866174985330e-25),
+      C(0.9803921568627452865036825956835185367356e-8,
+        -0.9227220299884665067601095648451913375754e-26),
+      C(0.5000000000000000002500000000000000003750e-9,
+        -0.1200000000000000001800000188712838420241e-29),
+      C(5.00000000000000000000025000000000000000000003e-12,
+        -1.20000000000000000000018000000000000000000004e-36),
+      C(5.00000000000000000000000002500000000000000000e-14,
+        -1.20000000000000000000000001800000000000000000e-42),
+      C(5e-301, 0)
+    };
+    TST(Dawson, 1e-20);
+  }
+  printf("#####################################\n");
+  printf("SUCCESS (max relative error = %g)\n", errmax_all);
+}
+
+#endif
diff --git a/ThirdParty/Core/Faddeeva/Faddeeva.hh b/ThirdParty/Core/Faddeeva/Faddeeva.hh
new file mode 100644
index 0000000..c4a2e97
--- /dev/null
+++ b/ThirdParty/Core/Faddeeva/Faddeeva.hh
@@ -0,0 +1,62 @@
+/* Copyright (c) 2012 Massachusetts Institute of Technology
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ */
+
+/* Available at: http://ab-initio.mit.edu/Faddeeva
+
+   Header file for Faddeeva.cc; see that file for more information. */
+
+#ifndef FADDEEVA_HH
+#define FADDEEVA_HH 1
+
+#include <complex>
+
+namespace Faddeeva {
+
+// compute w(z) = exp(-z^2) erfc(-iz) [ Faddeeva / scaled complex error func ]
+extern std::complex<double> w(std::complex<double> z,double relerr=0);
+extern double w_im(double x); // special-case code for Im[w(x)] of real x
+
+// Various functions that we can compute with the help of w(z)
+
+// compute erfcx(z) = exp(z^2) erfc(z)
+extern std::complex<double> erfcx(std::complex<double> z, double relerr=0);
+extern double erfcx(double x); // special case for real x
+
+// compute erf(z), the error function of complex arguments
+extern std::complex<double> erf(std::complex<double> z, double relerr=0);
+extern double erf(double x); // special case for real x
+
+// compute erfi(z) = -i erf(iz), the imaginary error function
+extern std::complex<double> erfi(std::complex<double> z, double relerr=0);
+extern double erfi(double x); // special case for real x
+
+// compute erfc(z) = 1 - erf(z), the complementary error function
+extern std::complex<double> erfc(std::complex<double> z, double relerr=0);
+extern double erfc(double x); // special case for real x
+
+// compute Dawson(z) = sqrt(pi)/2  *  exp(-z^2) * erfi(z)
+extern std::complex<double> Dawson(std::complex<double> z, double relerr=0);
+extern double Dawson(double x); // special case for real x
+
+} // namespace Faddeeva
+
+#endif // FADDEEVA_HH
diff --git a/ThirdParty/Fit/CMakeLists.txt b/ThirdParty/Fit/CMakeLists.txt
new file mode 100644
index 0000000..1b41626
--- /dev/null
+++ b/ThirdParty/Fit/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(RootMinimizers)
diff --git a/ThirdParty/Fit/RootMinimizers/CMakeLists.txt b/ThirdParty/Fit/RootMinimizers/CMakeLists.txt
new file mode 100644
index 0000000..1457098
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/CMakeLists.txt
@@ -0,0 +1,41 @@
+############################################################################
+# CMakeLists.txt file for building libRootMinimizers package
+############################################################################
+set(library_name RootMinimizers)
+
+# --- source and include files ---------
+set(include_dirs ${CMAKE_CURRENT_SOURCE_DIR}/inc)
+include_directories(${include_dirs})
+
+file(GLOB source_files
+    "src/Minuit2/*.cxx"
+    "src/Math/*.cxx"
+    "src/Fit/*.cxx"
+    "src/TMVA/*.cxx"
+)
+
+file(GLOB include_files
+    "inc/Fit/*.h"
+    "inc/Math/*.h"
+    "inc/Minuit2/*.h"
+    "src/Math/*.h"
+    "inc/TMVA/*.h"
+)
+
+# --- definitions ---------
+add_definitions(-DWARNINGMSG)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMATH_NO_PLUGIN_MANAGER -DHAS_MINUIT2 -DR__HAS_MATHMORE")
+if(NOT WIN32)
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
+endif()
+
+# --- making library ------------
+add_library(${library_name} STATIC ${source_files} ${include_files})
+set(${library_name}_INCLUDE_DIRS ${include_dirs} CACHE INTERNAL "")
+set(${library_name}_LIBRARY ${library_name} CACHE INTERNAL "")
+
+# --- external dependencies ---
+include_directories(${GSL_INCLUDE_DIR})
+target_link_libraries(${library_name} ${GSL_LIBRARIES})
+
+include_directories(${Boost_INCLUDE_DIRS})
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/BinData.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/BinData.h
new file mode 100644
index 0000000..fd730a3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/BinData.h
@@ -0,0 +1,548 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:15:23 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class BinData
+
+#ifndef ROOT_Fit_BinData
+#define ROOT_Fit_BinData
+
+#ifndef ROOT_Fit_DataVector
+#include "Fit/DataVector.h"
+#endif
+
+
+#ifdef USE_BINPOINT_CLASS
+
+#ifndef ROOT_Fit_BinPoint
+#include "Fit/BinPoint.h"
+#endif
+
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+
+//___________________________________________________________________________________
+/**
+   Class describing the binned data sets :
+              vectors of  x coordinates, y values and optionally error on y values and error on coordinates
+              The dimension of the coordinate is free
+              There are 4 different options:
+              - only coordinates and values  (for binned likelihood fits)  : kNoError
+              - coordinate, values and error on  values (for normal least square fits)  : kValueError
+              - coordinate, values, error on values and coordinates (for effective least square fits) : kCoordError
+              - corrdinate, values, error on coordinates and asymmettric error on valyes : kAsymError
+
+              In addition there is the option to construct Bindata copying the data in (using the DataVector class)
+              or using pointer to external data (DataWrapper) class.
+              In general is found to be more efficient to copy the data.
+              In case of really large data sets for limiting memory consumption then the other option can be used
+              Specialized constructor exists for data up to 3 dimensions.
+
+              When the data are copying in the number of points can be set later (or re-set) using Initialize and
+              the data are inserted one by one using the Add method.
+              It is mandatory to set the size before using the Add method.
+
+             @ingroup  FitData
+*/
+
+
+class BinData  : public FitData  {
+
+public :
+
+   enum ErrorType { kNoError, kValueError, kCoordError, kAsymError };
+
+   static unsigned int GetPointSize(ErrorType err, unsigned int dim) {
+      if (dim == 0 || dim > MaxSize() ) return 0;
+      if (err == kNoError) return dim + 1;   // no errors
+      if (err == kValueError) return dim + 2;  // error only on the value
+      if (err == kCoordError) return 2 * dim + 2 ;  // error on value and coordinate
+      return 2 * dim + 3;   // error on value (low and high)  and error on coordinate
+    }
+
+   ErrorType GetErrorType() const {
+      if (fPointSize == fDim + 1) return kNoError;
+      if (fPointSize == fDim + 2) return kValueError;
+      if (fPointSize == 2 * fDim + 2) return kCoordError;
+      assert( fPointSize == 2 * fDim + 3 ) ;
+      return kAsymError;
+   }
+
+
+
+   /**
+      constructor from dimension of point  and max number of points (to pre-allocate vector)
+      Give a zero value and then use Initialize later one if the size is not known
+    */
+
+   explicit BinData(unsigned int maxpoints = 0, unsigned int dim = 1, ErrorType err = kValueError);
+
+   /**
+      constructor from option and default range
+    */
+   explicit BinData (const DataOptions & opt, unsigned int maxpoints = 0, unsigned int dim = 1, ErrorType err = kValueError);
+
+   /**
+      constructor from options and range
+      efault is 1D and value errors
+    */
+   BinData (const DataOptions & opt, const DataRange & range, unsigned int maxpoints = 0, unsigned int dim = 1, ErrorType err = kValueError );
+
+   /** constructurs using external data */
+
+   /**
+      constructor from external data for 1D with errors on  coordinate and value
+    */
+   BinData(unsigned int n, const double * dataX, const double * val, const double * ex , const double * eval );
+
+   /**
+      constructor from external data for 2D with errors on  coordinate and value
+    */
+   BinData(unsigned int n, const double * dataX, const double * dataY, const double * val, const double * ex , const double * ey, const double * eval  );
+
+   /**
+      constructor from external data for 3D with errors on  coordinate and value
+    */
+   BinData(unsigned int n, const double * dataX, const double * dataY, const double * dataZ, const double * val, const double * ex , const double * ey , const double * ez , const double * eval   );
+
+   /**
+      copy constructors
+   */
+   BinData(const BinData &);
+
+   /**
+       assignment operator
+   */
+   BinData & operator= (const BinData &);
+
+
+   /**
+      destructor
+   */
+   virtual ~BinData();
+
+   /**
+      preallocate a data set with given size ,  dimension and error type (to get the full point size)
+      If the data set already exists and it is having the compatible point size space for the new points
+      is created in the data sets, while if not compatible the old data are erased and new space of
+      new size is allocated.
+      (i.e if exists initialize is equivalent to a resize( NPoints() + maxpoints)
+    */
+   void Initialize(unsigned int maxpoints, unsigned int dim = 1, ErrorType err = kValueError );
+
+
+   /**
+      return the size of a fit point (is the coordinate dimension + 1 for the value and eventually
+      the number of all errors
+    */
+   unsigned int PointSize() const {
+      return fPointSize;
+   }
+
+   /**
+      return the size of internal data  (number of fit points)
+      if data are not copied in but used externally the size is 0
+    */
+   unsigned int DataSize() const {
+      if (fDataVector) return fDataVector->Size();
+      return 0;
+   }
+
+   /**
+      flag to control if data provides error on the coordinates
+    */
+   bool HaveCoordErrors() const {
+      if (fPointSize > fDim +2) return true;
+      return false;
+   }
+
+   /**
+      flag to control if data provides asymmetric errors on the value
+    */
+   bool HaveAsymErrors() const {
+      if (fPointSize > 2 * fDim +2) return true;
+      return false;
+   }
+
+
+   /**
+      add one dim data with only coordinate and values
+   */
+   void Add(double x, double y );
+
+   /**
+      add one dim data with no error in the coordinate (x)
+      in this case store the inverse of the error in the value (y)
+   */
+   void Add(double x, double y, double ey);
+
+   /**
+      add one dim data with  error in the coordinate (x)
+      in this case store the value (y)  error and not the inverse
+   */
+   void Add(double x, double y, double ex, double ey);
+
+   /**
+      add one dim data with  error in the coordinate (x) and asymmetric errors in the value (y)
+      in this case store the y errors and not the inverse
+   */
+   void Add(double x, double y, double ex, double eyl , double eyh);
+
+   /**
+      add multi-dim coordinate data with only value (no errors)
+   */
+   void Add(const double *x, double val);
+
+   /**
+      add multi-dim coordinate data with only error in value
+   */
+   void Add(const double *x, double val, double  eval);
+
+   /**
+      add multi-dim coordinate data with both error in coordinates and value
+   */
+   void Add(const double *x, double val, const double * ex, double  eval);
+
+   /**
+      add multi-dim coordinate data with both error in coordinates and value
+   */
+   void Add(const double *x, double val, const double * ex, double  elval, double  ehval);
+
+   /**
+      return a pointer to the coordinates data for the given fit point
+    */
+   const double * Coords(unsigned int ipoint) const {
+      if (fDataVector)
+         return &((fDataVector->Data())[ ipoint*fPointSize ] );
+
+      return fDataWrapper->Coords(ipoint);
+   }
+
+   /**
+      return the value for the given fit point
+    */
+   double Value(unsigned int ipoint) const {
+      if (fDataVector)
+         return (fDataVector->Data())[ ipoint*fPointSize + fDim ];
+
+      return fDataWrapper->Value(ipoint);
+   }
+
+
+   /**
+      return error on the value for the given fit point
+      Safe (but slower) method returning correctly the error on the value
+      in case of asymm errors return the average 0.5(eu + el)
+    */
+   double Error(unsigned int ipoint) const {
+      if (fDataVector) {
+         ErrorType type = GetErrorType();
+         if (type == kNoError ) return 1;
+         // error on the value is the last element in the point structure
+         double eval =  (fDataVector->Data())[ (ipoint+1)*fPointSize - 1];
+         if (type == kValueError ) // need to invert (inverror is stored)
+            return eval != 0 ? 1.0/eval : 0;
+         else if (type == kAsymError) {  // return 1/2(el + eh)
+            double el = (fDataVector->Data())[ (ipoint+1)*fPointSize - 2];
+            return 0.5 * (el+eval);
+         }
+         return eval; // case of coord errors
+      }
+
+      return fDataWrapper->Error(ipoint);
+   }
+
+   /**
+      Return the inverse of error on the value for the given fit point
+      useful when error in the coordinates are not stored and then this is used directly this as the weight in
+      the least square function
+    */
+   double InvError(unsigned int ipoint) const {
+      if (fDataVector) {
+         // error on the value is the last element in the point structure
+         double eval =  (fDataVector->Data())[ (ipoint+1)*fPointSize - 1];
+         return eval;
+//          if (!fWithCoordError) return eval;
+//          // when error in the coordinate is stored, need to invert it
+//          return eval != 0 ? 1.0/eval : 0;
+      }
+      //case data wrapper
+
+      double eval = fDataWrapper->Error(ipoint);
+      return eval != 0 ? 1.0/eval : 0;
+   }
+
+
+   /**
+      Return a pointer to the errors in the coordinates for the given fit point
+    */
+   const double * CoordErrors(unsigned int ipoint) const {
+      if (fDataVector) {
+         // error on the value is the last element in the point structure
+         return  &(fDataVector->Data())[ (ipoint)*fPointSize + fDim + 1];
+      }
+
+      return fDataWrapper->CoordErrors(ipoint);
+   }
+
+   /**
+      retrieve at the same time a  pointer to the coordinate data and the fit value
+      More efficient than calling Coords(i) and Value(i)
+    */
+   const double * GetPoint(unsigned int ipoint, double & value) const {
+      if (fDataVector) {
+         unsigned int j = ipoint*fPointSize;
+         const std::vector<double> & v = (fDataVector->Data());
+         const double * x = &v[j];
+         value = v[j+fDim];
+         return x;
+      }
+      value = fDataWrapper->Value(ipoint);
+      return fDataWrapper->Coords(ipoint);
+   }
+
+   /**
+      retrieve in a single call a pointer to the coordinate data, value and inverse error for
+      the given fit point.
+      To be used only when type is kValueError or kNoError. In the last case the value 1 is returned
+      for the error.
+   */
+   const double * GetPoint(unsigned int ipoint, double & value, double & invError) const {
+      if (fDataVector) {
+         const std::vector<double> & v = (fDataVector->Data());
+         unsigned int j = ipoint*fPointSize;
+         const double * x = &v[j];
+         j += fDim;
+         value = v[j];
+         if (fPointSize == fDim +1) // value error (type=kNoError)
+            invError = 1;
+         else if (fPointSize == fDim +2) // value error (type=kNoError)
+            invError = v[j+1];
+         else
+            assert(0); // cannot be here
+
+         return x;
+      }
+      value = fDataWrapper->Value(ipoint);
+      double e = fDataWrapper->Error(ipoint);
+      invError = ( e > 0 ) ? 1.0/e : 1.0;
+      return fDataWrapper->Coords(ipoint);
+   }
+
+   /**
+      Retrieve the errors on the point (coordinate and value) for the given fit point
+      It must be called only when the coordinate errors are stored otherwise it will produce an
+      assert.
+   */
+   const double * GetPointError(unsigned int ipoint, double & errvalue) const {
+      if (fDataVector) {
+         assert(fPointSize > fDim + 2);
+         unsigned int j = ipoint*fPointSize;
+         const std::vector<double> & v = (fDataVector->Data());
+         const double * ex = &v[j+fDim+1];
+         errvalue = v[j + 2*fDim +1];
+         return ex;
+      }
+      errvalue = fDataWrapper->Error(ipoint);
+      return fDataWrapper->CoordErrors(ipoint);
+   }
+
+   /**
+      Get errors on the point (coordinate errors and asymmetric value errors) for the
+      given fit point.
+      It must be called only when the coordinate errors and asymmetric errors are stored
+      otherwise it will produce an assert.
+   */
+   const double * GetPointError(unsigned int ipoint, double & errlow, double & errhigh) const {
+      // external data is not supported for asymmetric errors
+      assert(fDataVector);
+
+      assert(fPointSize > 2 * fDim + 2);
+      unsigned int j = ipoint*fPointSize;
+      const std::vector<double> & v = (fDataVector->Data());
+      const double * ex = &v[j+fDim+1];
+      errlow  = v[j + 2*fDim +1];
+      errhigh = v[j + 2*fDim +2];
+      return ex;
+   }
+
+
+#ifdef USE_BINPOINT_CLASS
+   const BinPoint & GetPoint(unsigned int ipoint) const {
+      if (fDataVector) {
+         unsigned int j = ipoint*fPointSize;
+         const std::vector<double> & v = (fDataVector->Data());
+         const double * x = &v[j];
+         double value = v[j+fDim];
+         if (fPointSize > fDim + 2) {
+            const double * ex = &v[j+fDim+1];
+            double err = v[j + 2*fDim +1];
+            fPoint.Set(x,value,ex,err);
+         }
+         else {
+            double invError = v[j+fDim+1];
+            fPoint.Set(x,value,invError);
+         }
+
+      }
+      else {
+         double value = fDataWrapper->Value(ipoint);
+         double e = fDataWrapper->Error(ipoint);
+         if (fPointSize > fDim + 2) {
+            fPoint.Set(fDataWrapper->Coords(ipoint), value, fDataWrapper->CoordErrors(ipoint), e);
+         } else {
+            double invError = ( e != 0 ) ? 1.0/e : 0;
+            fPoint.Set(fDataWrapper->Coords(ipoint), value, invError);
+         }
+      }
+      return fPoint;
+   }
+
+
+   const BinPoint & GetPointError(unsigned int ipoint) const {
+      if (fDataVector) {
+         unsigned int j = ipoint*fPointSize;
+         const std::vector<double> & v = (fDataVector->Data());
+         const double * x = &v[j];
+         double value = v[j+fDim];
+         double invError = v[j+fDim+1];
+         fPoint.Set(x,value,invError);
+      }
+      else {
+         double value = fDataWrapper->Value(ipoint);
+         double e = fDataWrapper->Error(ipoint);
+         double invError = ( e != 0 ) ? 1.0/e : 0;
+         fPoint.Set(fDataWrapper->Coords(ipoint), value, invError);
+      }
+      return fPoint;
+   }
+#endif
+
+   /**
+      resize the vector to the new given npoints
+      if vector does not exists is created using existing point size
+    */
+   void Resize (unsigned int npoints);
+
+   /**
+      return number of fit points
+    */
+   unsigned int NPoints() const { return fNPoints; }
+
+   /**
+      return number of fit points
+    */
+   unsigned int Size() const { return fNPoints; }
+
+   /**
+      return coordinate data dimension
+    */
+   unsigned int NDim() const { return fDim; }
+
+   /**
+      apply a Log transformation of the data values
+      can be used for example when fitting an exponential or gaussian
+      Transform the data in place need to copy if want to preserve original data
+      The data sets must not contain negative values. IN case it does,
+      an empty data set is returned
+    */
+   BinData & LogTransform();
+
+
+   /**
+       return an array containing the upper edge of the bin for coordinate i
+       In case of empty bin they could be merged in a single larger bin
+       Return a NULL pointer  if the bin width  is not stored
+   */
+   const double * BinUpEdge(unsigned int icoord) const {
+      if (fBinEdge.size() == 0 || icoord*fDim > fBinEdge.size() ) return 0;
+      return &fBinEdge[ icoord * fDim];
+   }
+
+   /**
+      query if the data store the bin edges instead of the center
+   */
+   bool HasBinEdges() const {
+      return fBinEdge.size() > 0 && fBinEdge.size() == fDim*fNPoints;
+   }
+
+   /**
+       add the bin width data, a pointer to an array with the bin upper edge information.
+       This is needed when fitting with integral options
+       The information is added for the previously inserted point.
+       BinData::Add  must be called before
+   */
+   void AddBinUpEdge(const double * xup);
+
+   /**
+       retrieve the reference volume used to normalize the data when the option bin volume is set
+    */
+   double RefVolume() const { return fRefVolume; }
+
+   /**
+      set the reference volume used to normalize the data when the option bin volume is set
+    */
+   void SetRefVolume(double value) { fRefVolume = value; }
+
+
+   /**
+      compute the total sum of the data content
+      (sum of weights in cse of weighted data set)
+   */
+   double SumOfContent() const { return fSumContent; }
+
+   /**
+      compute the total sum of the error square
+      (sum of weight square in case of a weighted data set)
+   */
+   double SumOfError2() const { return fSumError2;}
+
+
+protected:
+
+   void SetNPoints(unsigned int n) { fNPoints = n; }
+
+private:
+
+
+   unsigned int fDim;       // coordinate dimension
+   unsigned int fPointSize; // total point size including value and errors (= fDim + 2 for error in only Y )
+   unsigned int fNPoints;   // number of contained points in the data set (can be different than size of vector)
+   double fSumContent;  // total sum of the bin data content
+   double fSumError2;  // total sum square of the errors
+   double fRefVolume;  // reference bin volume - used to normalize the bins in case of variable bins data
+
+   DataVector * fDataVector;  // pointer to the copied in data vector
+   DataWrapper * fDataWrapper;  // pointer to the external data wrapper structure
+
+   std::vector<double> fBinEdge;  // vector containing the bin upper edge (coordinate will contain low edge)
+
+
+#ifdef USE_BINPOINT_CLASS
+   mutable BinPoint fPoint;
+#endif
+
+};
+
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Fit_BinData */
+
+
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/BinPoint.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/BinPoint.h
new file mode 100644
index 0000000..0637714
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/BinPoint.h
@@ -0,0 +1,180 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:10:03 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class BinPoint
+
+#ifndef ROOT_Fit_BinPoint
+#define ROOT_Fit_BinPoint
+
+
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+      class DataRange;
+
+/**
+    Obsolete class, no more in use.
+    class describing the point with bins ( x coordinates, y and error on y )
+     but not error in X . For the Error in x one should use onother class
+
+
+*/
+class BinPoint {
+
+public:
+
+
+   //typedef  std::vector<double> CoordData;
+
+
+   /**
+      Constructor
+   */
+   explicit BinPoint (unsigned int n = 1) :
+      fDim(n),
+      fCoords(0 ),
+      fCoordErr( 0),
+      fValue(0),
+      fError(1),
+      fInvError(1)
+   {}
+
+//    /**
+//       constructor from a vector of coordinates, y value and y error
+//     */
+//    BinPoint (const std::vector<double> & x, double y, double ey = 1) :
+//       fCoords(x),
+//       fValue(y),
+//       fInvError( ey!= 0 ? 1.0/ey : 0 )
+//    { }
+
+//    template <class Iterator>
+//    BinPoint (const Iterator begin, const Iterator end, double y, double ey = 1) :
+//       fCoords(begin,end),
+//       fValue(y),
+//       fInvError( ey!= 0. ? 1.0/ey : 1. )
+//    { }
+
+   void Set(const double * x, double value, double invErr) {
+      fCoords = x;
+      fValue = value;
+      fInvError = invErr;
+   }
+
+   void Set(const double * x, double value, const double * ex, double err) {
+      fCoords = x;
+      fValue = value;
+      fCoordErr = ex;
+      fError = err;
+   }
+
+
+   /**
+      Destructor (no operations)
+   */
+   ~BinPoint ()  {}
+
+   // use default copy constructor and assignment
+
+
+   // accessors
+
+   /**
+      return pointer to coordinates
+    */
+   //const double *  Coords() const { return &fCoords.front(); }
+
+    /**
+      return vector of coordinates
+    */
+   const double * Coords() const { return fCoords; }
+
+   /**
+      return the value (bin height in case of an histogram)
+    */
+   double Value() const { return fValue; }
+
+   /**
+      return the error on the value
+    */
+   double Error() const {
+      //return fInvError != 0 ? 1.0/fInvError : 0;
+      return fError;
+   }
+
+   /**
+      return the inverse of error on the value
+    */
+   double InvError() const { return fInvError; }
+
+   /**
+     get the dimension (dimension of the cooordinates)
+    */
+   unsigned int NDim() const { return  fDim; }
+
+   /**
+      check if a Point is inside the given range
+    */
+   bool IsInRange( const DataRange & range) const;
+
+private:
+
+   unsigned int fDim;
+   //double fCoords[N];
+   const double * fCoords;
+   const double * fCoordErr;
+
+   double fValue;
+   // better to store the inverse of the error (is more efficient)
+   double fError;
+   double fInvError;
+
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+// #ifndef ROOT_Fit_DataRange
+// #include "Fit/DataRange.h"
+// #endif
+// #include <cassert>
+
+// namespace ROOT {
+
+//    namespace Fit {
+
+// template<unsigned int N>
+// bool BinPoint<N>::IsInRange(const DataRange & range) const
+// {
+//    // check if given point is inside the given range
+
+//    // need to check that datarange size is same as point size
+//    if (range.NDim() == 0) return true; // (range is empty is equivalent to (-inf, + inf)
+//    // in case not zero dimension must be equal to the coordinates
+//    assert( kSize == range.NDim() );
+//    for (unsigned int i = 0; i < kSize; ++i) {
+//       if ( ! range.IsInside( fCoords[i] ) ) return false;
+//    }
+//    return true;
+// }
+
+//    } // end namespace Fit
+
+// } // end namespace ROOT
+
+
+
+#endif /* ROOT_Fit_BinPoint */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/Chi2FCN.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/Chi2FCN.h
new file mode 100644
index 0000000..ed0e074
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/Chi2FCN.h
@@ -0,0 +1,196 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Sep  5 09:13:32 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class Chi2FCN
+
+#ifndef ROOT_Fit_Chi2FCN
+#define ROOT_Fit_Chi2FCN
+
+#ifndef ROOT_Fit_BasicFCN
+#include "Fit/BasicFCN.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunction
+#include "Math/IParamFunction.h"
+#endif
+
+
+#ifndef ROOT_Fit_BinData
+#include "Fit/BinData.h"
+#endif
+
+
+#ifndef ROOT_Fit_FitUtil
+#include "Fit/FitUtil.h"
+#endif
+
+//#define ROOT_FIT_PARALLEL
+
+#ifdef ROOT_FIT_PARALLEL
+#ifndef ROOT_Fit_FitUtilParallel
+#include "Fit/FitUtilParallel.h"
+#endif
+#endif
+
+#include <memory>
+
+/**
+ at defgroup FitMethodFunc Fit Method Classes
+
+Classes describing Fit Method functions
+ at ingroup Fit
+*/
+
+
+namespace BA_ROOT {
+
+
+   namespace Fit {
+
+
+
+//___________________________________________________________________________________
+/**
+   Chi2FCN class for binnned fits using the least square methods
+
+   @ingroup  FitMethodFunc
+*/
+template<class FunType>
+class Chi2FCN : public BasicFCN<FunType,BinData> {
+
+public:
+
+   typedef  BasicFCN<FunType,BinData> BaseFCN; 
+
+   typedef  ::BA_ROOT::Math::BasicFitMethodFunction<FunType> BaseObjFunction;
+   typedef typename  BaseObjFunction::BaseFunction BaseFunction;
+
+   //typedef  typename ::ROOT::Math::ParamFunctionTrait<FunType>::PFType IModelFunction;
+   typedef  ::BA_ROOT::Math::IParamMultiFunction IModelFunction;
+   typedef typename BaseObjFunction::Type_t Type_t;
+
+   /**
+      Constructor from data set (binned ) and model function
+   */
+   Chi2FCN (const std::shared_ptr<BinData> & data, const std::shared_ptr<IModelFunction> & func) :
+      BaseFCN( data, func),
+      fNEffPoints(0),
+      fGrad ( std::vector<double> ( func->NPar() ) )
+   { }
+
+   /**
+      Same Constructor from data set (binned ) and model function but now managed by the user
+      we clone the function but not the data
+   */
+   Chi2FCN ( const BinData & data, const IModelFunction & func) :
+      BaseFCN(std::shared_ptr<BinData>(const_cast<BinData*>(&data), DummyDeleter<BinData>()), std::shared_ptr<IModelFunction>(dynamic_cast<IModelFunction*>(func.Clone() ) ) ),
+      fNEffPoints(0),
+      fGrad ( std::vector<double> ( func.NPar() ) )
+   { }
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~Chi2FCN ()  {}
+   /**
+      Copy constructor
+   */
+   Chi2FCN(const Chi2FCN & f) :
+      BaseFCN(f.DataPtr(), f.ModelFunctionPtr() ),
+      fNEffPoints( f.fNEffPoints ),
+      fGrad( f.fGrad)
+   {  }
+
+   /**
+      Assignment operator
+   */
+   Chi2FCN & operator = (const Chi2FCN & rhs) {
+      SetData(rhs.DataPtr() );
+      SetModelFunction(rhs.ModelFunctionPtr() );
+      fNEffPoints = rhs.fNEffPoints;
+      fGrad = rhs.fGrad; 
+   }
+
+   /* 
+      clone the function
+    */
+   virtual BaseFunction * Clone() const {
+      return new Chi2FCN(*this); 
+   }
+
+
+
+   using BaseObjFunction::operator();
+
+
+   /// i-th chi-square residual
+   virtual double DataElement(const double * x, unsigned int i, double * g) const {
+      if (i==0) this->UpdateNCalls();
+      return FitUtil::EvaluateChi2Residual(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
+   }
+
+   // need to be virtual to be instantiated
+   virtual void Gradient(const double *x, double *g) const {
+      // evaluate the chi2 gradient
+      FitUtil::EvaluateChi2Gradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g, fNEffPoints);
+   }
+
+   /// get type of fit method function
+   virtual  typename BaseObjFunction::Type_t Type() const { return BaseObjFunction::kLeastSquare; }
+
+
+
+protected:
+
+   /// set number of fit points (need to be called in const methods, make it const)                                                                                                      
+   virtual void SetNFitPoints(unsigned int n) const { fNEffPoints = n; }
+   
+private:
+
+   /**
+      Evaluation of the  function (required by interface)
+    */
+   virtual double DoEval (const double * x) const {
+      this->UpdateNCalls();
+#ifdef ROOT_FIT_PARALLEL
+      return FitUtilParallel::EvaluateChi2(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints);
+#else
+      if (!BaseFCN::Data().HaveCoordErrors() )
+         return FitUtil::EvaluateChi2(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints);
+      else
+         return FitUtil::EvaluateChi2Effective(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints);
+#endif
+   }
+
+   // for derivatives
+   virtual double  DoDerivative(const double * x, unsigned int icoord ) const {
+      Gradient(x, fGrad.data());
+      return fGrad[icoord];
+   }
+
+
+   mutable unsigned int fNEffPoints;  // number of effective points used in the fit
+
+   mutable std::vector<double> fGrad; // for derivatives
+
+
+};
+
+      // define useful typedef's
+      typedef Chi2FCN<BA_ROOT::Math::IMultiGenFunction> Chi2Function;
+      typedef Chi2FCN<BA_ROOT::Math::IMultiGradFunction> Chi2GradFunction;
+
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_Chi2FCN */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/DataOptions.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataOptions.h
new file mode 100644
index 0000000..48dfd02
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataOptions.h
@@ -0,0 +1,65 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:04:59 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class DataOptions
+
+#ifndef ROOT_Fit_DataOptions
+#define ROOT_Fit_DataOptions
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+//___________________________________________________________________________________
+/**
+   DataOptions : simple structure holding the options on how the data are filled
+
+   @ingroup FitData
+*/
+struct DataOptions {
+
+
+   /**
+      Default constructor: use the default options
+   */
+   DataOptions () :
+      fIntegral(false),
+      fBinVolume(false),
+      fNormBinVolume(false),
+      fUseEmpty(false),
+      fUseRange(false),
+      fErrors1(false),
+      fExpErrors(false),
+      fCoordErrors(true),
+      fAsymErrors(true)
+   {}
+
+
+   bool fIntegral;    // use integral of bin content instead of bin center (default is false)
+   bool fBinVolume;   // normalize data by the bin volume (it is used in the Poisson likelihood fits)
+   bool fNormBinVolume;  // normalize data by a normalized the bin volume ( bin volume divided by a reference value)
+   bool fUseEmpty;    // use empty bins (default is false) with a fixed error of 1
+   bool fUseRange;    // use the function range when creating the fit data (default is false)
+   bool fErrors1;     // use all errors equal to 1, i.e. fit without errors (default is false)
+   bool fExpErrors;   // use expected errors from the function and not from the data
+   bool fCoordErrors; // use errors on the x coordinates when available (default is true)
+   bool fAsymErrors;  // use asymmetric errors in the value when available, selecting them according to the on sign of residual (default is true)
+
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_DataOptions */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/DataRange.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataRange.h
new file mode 100644
index 0000000..254a444
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataRange.h
@@ -0,0 +1,218 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:05:02 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class DataRange
+
+#ifndef ROOT_Fit_DataRange
+#define ROOT_Fit_DataRange
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+//___________________________________________________________________________________
+/**
+   class describing the range in the coordinates
+   it supports  multiple range in a coordinate.
+   The rnage dimension is the dimension of the coordinate, its size is
+   the number of interval for each coordinate.
+   Default range is -inf, inf
+   Range can be modified with the add range method
+
+   @ingroup FitData
+*/
+class DataRange {
+
+public:
+
+   typedef std::vector<std::pair<double,double> > RangeSet;
+   typedef std::vector< RangeSet >   RangeIntervals;
+
+   /**
+      Default constructor (infinite range)
+   */
+   explicit DataRange (unsigned int dim = 1) :
+      fRanges ( std::vector<RangeSet> (dim) )
+   {}
+
+   /**
+      construct a range for [xmin, xmax]
+    */
+   DataRange(double xmin, double xmax);
+
+   /**
+      construct a range for [xmin, xmax] , [ymin, ymax]
+    */
+   DataRange(double xmin, double xmax, double ymin, double ymax);
+   /**
+      construct a range for [xmin, xmax] , [ymin, ymax] , [zmin, zmax]
+    */
+   DataRange(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax);
+   /**
+      get range dimension
+    */
+   unsigned int NDim() const { return fRanges.size(); }
+
+   /**
+      return range size for coordinate icoord (starts from zero)
+      Size == 0 indicates no range is present [-inf, + inf]
+   */
+   unsigned int Size(unsigned int icoord = 0) const {
+      return icoord <  fRanges.size() ? fRanges[icoord].size() : 0;
+   }
+
+   /**
+      return true if a range has been set in any of  the coordinates
+      i.e. when  it is not [-inf,+inf] for all coordinates
+      Avoid in case of multi-dim to loop on all the coordinated and ask the size
+    */
+   bool IsSet() const {
+      for (unsigned int icoord = 0; icoord < fRanges.size(); ++icoord)
+         if (fRanges[icoord].size() > 0) return true;
+      return false;
+   }
+
+   /**
+       return the vector of ranges for the coordinate icoord
+   */
+   const RangeSet & Ranges(unsigned int icoord = 0) const {
+      // return icoord <  fRanges.size() ? fRanges[icoord] : RangeSet();
+      return fRanges.at(icoord);
+   }
+
+   /**
+       return the i-th range for the coordinate icoord.
+       Useful method when only one range is present for the given coordinate
+   */
+   std::pair<double, double> operator() (unsigned int icoord = 0,unsigned int irange = 0) const;
+
+   /**
+      get the first range for given coordinate. If range does not exist
+      return -inf, +inf
+    */
+   void GetRange(unsigned int icoord, double & xmin, double & xmax) const {
+      if (Size(icoord) == 0) GetInfRange(xmin,xmax);
+      else {
+         xmin = fRanges[icoord].front().first;
+         xmax = fRanges[icoord].front().second;
+      }
+   }
+   /**
+      get first range for the x - coordinate
+    */
+   void GetRange(double & xmin, double & xmax) const {  GetRange(0,xmin,xmax); }
+   /**
+      get first range for the x and y coordinates
+    */
+   void GetRange(double & xmin, double & xmax, double & ymin, double & ymax) const {
+      GetRange(0,xmin,xmax); GetRange(1,ymin,ymax);
+   }
+   /**
+      get first range for the x and y and z coordinates
+    */
+   void GetRange(double & xmin, double & xmax, double & ymin, double & ymax, double & zmin, double & zmax) const {
+      GetRange(0,xmin,xmax); GetRange(1,ymin,ymax); GetRange(2,zmin,zmax);
+   }
+   /**
+      get first range for coordinates and fill the vector
+    */
+   void GetRange(double * xmin, double * xmax)   const {
+      for (unsigned int i = 0; i < fRanges.size(); ++i)
+         GetRange(i,xmin[i],xmax[i]);
+   }
+
+   /**
+      Destructor (no operations)
+   */
+   ~DataRange ()  {}
+
+
+
+   /**
+      add a range [xmin,xmax] for the new coordinate icoord
+      Adding a range does not delete existing one, but takes the OR with
+      existing ranges.
+      if want to replace range use method SetRange, which replace range with existing one
+    */
+   void AddRange(unsigned  int  icoord , double xmin, double xmax );
+
+   /**
+      add a range [xmin,xmax] for the first coordinate icoord
+    */
+   void AddRange(double xmin, double xmax ) { AddRange(0,xmin,xmax); }
+   /**
+      add a range [xmin,xmax] for the first and [ymin,ymax] for the second coordinate
+    */
+   void AddRange(double xmin, double xmax, double ymin, double ymax ) { AddRange(0,xmin,xmax); AddRange(1,ymin,ymax); }
+   /**
+      add a range [xmin,xmax] for the first and [ymin,ymax] for the second coordinate and
+      [zmin,zmax] for the third coordinate
+    */
+   void AddRange(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax ) {
+      AddRange(0,xmin,xmax); AddRange(1,ymin,ymax); AddRange(2,zmin,zmax); }
+
+   /**
+      set a range [xmin,xmax] for the new coordinate icoord
+      If more range exists for other coordinates, delete the existing one and use it the new one
+      Use Add range if want to keep the union of the existing ranges
+    */
+   void SetRange(unsigned  int  icoord , double xmin, double xmax );
+
+   /**
+      set a range [xmin,xmax] for the first coordinate icoord
+    */
+   void SetRange(double xmin, double xmax ) { SetRange(0,xmin,xmax); }
+   /**
+      set a range [xmin,xmax] for the first and [ymin,ymax] for the second coordinate
+    */
+   void SetRange(double xmin, double xmax, double ymin, double ymax ) { SetRange(0,xmin,xmax); SetRange(1,ymin,ymax); }
+   /**
+      set a range [xmin,xmax] for the first and [ymin,ymax] for the second coordinate and
+      [zmin,zmax] for the third coordinate
+    */
+   void SetRange(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax ) {
+      SetRange(0,xmin,xmax); SetRange(1,ymin,ymax); SetRange(2,zmin,zmax); }
+
+   /**
+      clear all ranges in one coordinate (is now -inf, +inf)
+    */
+   void Clear (unsigned  int  icoord = 0 );
+
+   /**
+      check if a point is inside the range for the given coordinate
+    */
+   bool IsInside(double x, unsigned int icoord = 0) const;
+
+protected:
+   /**
+       internal function to remove all the existing ranges between xmin and xmax
+       called when a new range is inserted
+   */
+   void CleanRangeSet(unsigned int icoord, double xmin, double xmax);
+
+   // get the full range (-inf, +inf)
+   static void GetInfRange(double &x1, double &x2);
+
+private:
+
+   RangeIntervals fRanges;  // list of all ranges
+
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_DataRange */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/DataVector.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataVector.h
new file mode 100644
index 0000000..2ebd634
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataVector.h
@@ -0,0 +1,395 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:15:23 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class DataVector
+
+#ifndef ROOT_Fit_DataVector
+#define ROOT_Fit_DataVector
+
+/**
+ at defgroup FitData Fit Data Classes
+
+Classes for describing the input data for fitting
+
+ at ingroup Fit
+*/
+
+
+// #ifndef ROOT_Fit_DataVectorfwd
+// #include "Fit/DataVectorfwd.h"
+// #endif
+
+#ifndef ROOT_Fit_DataOptions
+#include "Fit/DataOptions.h"
+#endif
+
+
+#ifndef ROOT_Fit_DataRange
+#include "Fit/DataRange.h"
+#endif
+
+
+#include <vector>
+#include <cassert>
+#include <iostream>
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+      //class used for making shared_ptr of data classes managed by the user (i.e. when we don;t want to delete the contained object) 
+      template <class T> 
+      struct DummyDeleter
+      {
+         // a deleter not deleting the contained object
+         // used to avoid shared_ptr deleting the contained objects if managed externally
+         void operator()(T* /* p */) {
+            //printf("ROOT::Fit::DummyDeleter called - do not delete object %x \n", p);
+         }
+      };
+
+
+/**
+   Base class for all the fit data types
+
+   @ingroup FitData
+ */
+
+class FitData {
+
+public:
+
+   /// construct with default option and data range
+   FitData() {}
+
+   /// dummy virtual destructor
+   virtual ~FitData() {}
+
+   /// construct passing options and default data range
+   FitData(const DataOptions & opt) :
+      fOptions(opt)
+   {}
+
+
+   /// construct passing range and default options
+   FitData(const DataRange & range) :
+      fRange(range)
+   {}
+
+   /// construct passing options and data range
+   FitData (const DataOptions & opt, const DataRange & range) :
+      fOptions(opt),
+      fRange(range)
+   {}
+
+   /**
+      access to options
+    */
+   const DataOptions & Opt() const { return fOptions; }
+   DataOptions & Opt() { return fOptions; }
+
+   /**
+      access to range
+    */
+   const DataRange & Range() const { return fRange; }
+
+   // range cannot be modified afterwards
+   // since fit method functions use all data
+
+   /**
+       define a max size to avoid allocating too large arrays
+   */
+   static unsigned int MaxSize()  {
+      return (unsigned int) (-1) / sizeof (double);
+   }
+
+
+private:
+
+      DataOptions fOptions;
+      DataRange   fRange;
+
+};
+
+
+
+/**
+   class holding the fit data points. It is template on the type of point,
+   which can be for example a binned or unbinned point.
+   It is basicaly a wrapper on an std::vector
+
+   @ingroup FitData
+
+*/
+
+class DataVector {
+
+public:
+
+
+   typedef std::vector<double>      FData;
+
+   /**
+      default constructor for a vector of N -data
+   */
+   explicit DataVector (size_t n ) :
+      fData(std::vector<double>(n))
+
+   {
+      //if (n!=0) fData.reserve(n);
+   }
+
+
+   /**
+      Destructor (no operations)
+   */
+   ~DataVector ()  {}
+
+   // use default copy constructor and assignment operator
+
+
+   /**
+      const access to underlying vector
+    */
+   const FData & Data() const { return fData; }
+
+   /**
+      non-const access to underlying vector (in case of insertion/deletion) and iterator
+    */
+   FData & Data()  { return fData; }
+
+#ifndef __CINT__
+   /**
+      const iterator access
+   */
+   typedef FData::const_iterator const_iterator;
+   typedef FData::iterator iterator;
+
+   const_iterator begin() const { return fData.begin(); }
+   const_iterator end() const { return fData.begin()+fData.size(); }
+
+   /**
+      non-const iterator access
+   */
+   iterator begin() { return fData.begin(); }
+   iterator end()   { return fData.end(); }
+
+#endif
+   /**
+      access to the point
+    */
+   const double & operator[] (unsigned int i)  const { return fData[i]; }
+   double & operator[] (unsigned int i)   { return fData[i]; }
+
+
+   /**
+      full size of data vector (npoints * point size)
+    */
+   size_t Size() const { return fData.size(); }
+
+
+private:
+
+      FData fData;
+};
+
+
+//       // usefule typedef's of DataVector
+//       class BinPoint;
+
+//       // declaration for various type of data vectors
+//       typedef DataVector<ROOT::Fit::BinPoint>                    BinData;
+//       typedef DataVector<ROOT::Fit::BinPoint>::const_iterator    BinDataIterator;
+
+/**
+   class maintaining a pointer to external data
+   Using this class avoids copying the data when performing a fit
+   NOTE: this class is not thread-safe and should not be used in parallel fits
+
+
+   @ingroup FitData
+ */
+
+class DataWrapper {
+
+public:
+
+   /**
+      specialized constructor for 1D data without errors and values
+    */
+   explicit DataWrapper(const double * dataX ) :
+      fDim(1),
+      fValues(0),
+      fErrors(0),
+      fCoords(std::vector<const double * >(1) ),
+      fX(std::vector<double>(1) )
+   {
+      fCoords[0] = dataX;
+   }
+
+
+   /**
+      constructor for 1D data (if errors are not present a null pointer should be passed)
+    */
+   DataWrapper(const double * dataX, const double * val, const double * eval , const double * ex ) :
+      fDim(1),
+      fValues(val),
+      fErrors(eval),
+      fCoords(std::vector<const double * >(1) ),
+      fErrCoords(std::vector<const double * >(1) ),
+      fX(std::vector<double>(1) ),
+      fErr(std::vector<double>(1) )
+   {
+      fCoords[0] = dataX;
+      fErrCoords[0] = ex;
+   }
+
+   /**
+      constructor for 2D data (if errors are not present a null pointer should be passed)
+    */
+   DataWrapper(const double * dataX, const double * dataY, const double * val, const double * eval, const double * ex , const double * ey  ) :
+      fDim(2),
+      fValues(val),
+      fErrors(eval),
+      fCoords(std::vector<const double * >(2) ),
+      fErrCoords(std::vector<const double * >(2) ),
+      fX(std::vector<double>(2) ),
+      fErr(std::vector<double>(2) )
+   {
+      fCoords[0] = dataX;
+      fCoords[1] = dataY;
+      fErrCoords[0] = ex;
+      fErrCoords[1] = ey;
+   }
+
+   /**
+      constructor for 3D data (if errors are not present a null pointer should be passed)
+    */
+   DataWrapper(const double * dataX, const double * dataY, const double * dataZ, const double * val, const double * eval, const double * ex , const double * ey, const double * ez  ) :
+      fDim(3),
+      fValues(val),
+      fErrors(eval),
+      fCoords(std::vector<const double * >(3) ),
+      fErrCoords(std::vector<const double * >(3) ),
+      fX(std::vector<double>(3) ),
+      fErr(std::vector<double>(3) )
+   {
+      fCoords[0] = dataX;
+      fCoords[1] = dataY;
+      fCoords[2] = dataZ;
+      fErrCoords[0] = ex;
+      fErrCoords[1] = ey;
+      fErrCoords[2] = ez;
+   }
+
+   /**
+      constructor for multi-dim data without  errors
+    */
+   template<class Iterator>
+   DataWrapper(unsigned int dim,  Iterator  coordItr ) :
+      fDim(dim),
+      fValues(0),
+      fErrors(0),
+      fCoords(std::vector<const double * >(coordItr, coordItr+dim) ),
+      fX(std::vector<double>(dim) )
+   { }
+
+
+   /**
+      constructor for multi-dim data with errors and values (if errors are not present a null pointer should be passed)
+    */
+   template<class Iterator>
+   DataWrapper(size_t dim, Iterator coordItr, const double * val, const double * eval, Iterator errItr ) :
+      // use size_t for dim to avoid allocating huge vector on 64 bits when dim=-1
+      fDim(dim),
+      fValues(val),
+      fErrors(eval),
+      fCoords(std::vector<const double * >(coordItr, coordItr+dim) ),
+      fErrCoords(std::vector<const double * >(errItr, errItr+dim) ),
+      fX(std::vector<double>(dim) ),
+      fErr(std::vector<double>(dim) )
+   { }
+
+   // destructor
+   ~DataWrapper() {
+      //printf("Delete Data wrapper\n");
+      // no operations
+   }
+
+   // use default copy constructor and assignment operator
+   // copy the pointer of the data not the data
+
+
+   const double * Coords(unsigned int ipoint) const {
+      for (unsigned int i = 0; i < fDim; ++i) {
+         const double * x = fCoords[i];
+         assert (x != 0);
+         fX[i] = x[ipoint];
+      }
+      return &fX.front();
+   }
+
+   double Coord(unsigned int ipoint, unsigned int icoord) const {
+         const double * x = fCoords[icoord];
+         assert (x != 0);
+         return  x[ipoint];
+   }
+
+
+   const double * CoordErrors(unsigned int ipoint) const {
+      for (unsigned int i = 0; i < fDim; ++i) {
+         const double * err = fErrCoords[i];
+         if (err == 0) return 0;
+         fErr[i] = err[ipoint];
+      }
+      return &fErr.front();
+   }
+
+   double CoordError(unsigned int ipoint, unsigned int icoord) const {
+         const double * err = fErrCoords[icoord];
+         return  (err != 0) ? err[ipoint] : 0;
+   }
+
+
+   double Value(unsigned int ipoint) const {
+      return fValues[ipoint];
+   }
+
+   double Error(unsigned int ipoint) const {
+      return (fErrors) ?  fErrors[ipoint]  : 0. ;
+   }
+
+
+
+private:
+
+
+   unsigned int fDim;
+   const double * fValues;
+   const double * fErrors;
+   std::vector<const double *> fCoords;
+   std::vector<const double *> fErrCoords;
+   // cached vector to return x[] and errors on x
+   mutable std::vector<double> fX;
+   mutable std::vector<double> fErr;
+
+};
+
+
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Fit_DataVector */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/DataVectorfwd.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataVectorfwd.h
new file mode 100644
index 0000000..d047520
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/DataVectorfwd.h
@@ -0,0 +1,38 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Fri Sep  1 16:09:42 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// forward decalaration for the DataVector classes
+
+#ifndef ROOT_Fit_DataVectorfwd
+#define ROOT_Fit_DataVectorfwd
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+      //template <class Point> class DataVector;
+      //class DataVector;
+
+      //class BinPoint;
+      //class UnBinPoint;
+
+      class BinData;
+      class UnBinData;
+
+
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_DataVectorfwd */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/FcnAdapter.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/FcnAdapter.h
new file mode 100644
index 0000000..a521459
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/FcnAdapter.h
@@ -0,0 +1,70 @@
+// @(#)root/minuit2:$Id$
+// Author: L. Moneta    10/2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 ROOT Foundation,  CERN/PH-SFT                   *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Fit_FcnAdapter_H_
+#define ROOT_Fit_FcnAdapter_H_
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+
+
+//___________________________________________________________
+//
+// Adapt the interface used in TMinuit (and the TVirtualFitter) for
+// passing the objective function in a IFunction  interface
+// (ROOT::Math::IMultiGenFunction)
+//
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+class FcnAdapter : public BA_ROOT::Math::IMultiGenFunction {
+
+public:
+
+   FcnAdapter(void (*fcn)(int&, double*, double&, double*, int ), int dim = 0) :
+      fDim(dim),
+      fFCN(fcn)
+   {}
+
+   virtual ~FcnAdapter() {}
+
+   virtual  unsigned int NDim() const { return fDim; }
+
+   BA_ROOT::Math::IMultiGenFunction * Clone() const {
+      return new FcnAdapter(fFCN,fDim);
+   }
+
+   void SetDimension(int dim) { fDim = dim; }
+
+private:
+
+   virtual double DoEval(const double * x) const {
+      double fval = 0;
+      int dim = fDim;
+      // call with flag 4
+      fFCN(dim, 0, fval, const_cast<double *>(x), 4);
+      return fval;
+   }
+
+private:
+
+   unsigned int fDim;
+   void (*fFCN)(int&, double*, double&, double*, int);
+
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+#endif //ROOT_Fit_FcnAdapter
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/FitConfig.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitConfig.h
new file mode 100644
index 0000000..ed10bd8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitConfig.h
@@ -0,0 +1,246 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Thu Sep 21 16:21:29 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class FitConfig
+
+#ifndef ROOT_Fit_FitConfig
+#define ROOT_Fit_FitConfig
+
+
+#ifndef ROOT_Fit_ParameterSettings
+#include "Fit/ParameterSettings.h"
+#endif
+
+#ifndef ROOT_Math_MinimizerOptions
+#include "Math/MinimizerOptions.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+      class Minimizer;
+      class MinimizerOptions;
+   }
+
+   namespace Fit {
+
+      class FitResult;
+
+//___________________________________________________________________________________
+/**
+   Class describing the configuration of the fit, options and parameter settings
+   using the ROOT::Fit::ParameterSettings class
+
+   @ingroup FitMain
+*/
+class FitConfig {
+
+public:
+
+   /**
+      Default constructor
+   */
+   FitConfig (unsigned int npar = 0);
+
+
+   /*
+     Copy constructor
+    */
+   FitConfig(const FitConfig & rhs);
+
+   /**
+      Destructor
+   */
+   ~FitConfig ();
+
+   /*
+     Assignment operator
+   */
+   FitConfig & operator= (const FitConfig & rhs);
+
+
+   /**
+      get the parameter settings for the i-th parameter (const method)
+   */
+   const ParameterSettings & ParSettings(unsigned int i) const { return fSettings.at(i); }
+
+   /**
+      get the parameter settings for the i-th parameter (non-const method)
+   */
+   ParameterSettings & ParSettings(unsigned int i) { return fSettings.at(i); }
+
+   /**
+      get the vector of parameter settings  (const method)
+   */
+   const std::vector<BA_ROOT::Fit::ParameterSettings> & ParamsSettings() const { return fSettings; }
+
+   /**
+      get the vector of parameter settings  (non-const method)
+   */
+   std::vector<BA_ROOT::Fit::ParameterSettings> & ParamsSettings() { return fSettings; }
+
+   /**
+      number of parameters settings
+    */
+   unsigned int NPar() const { return fSettings.size(); }
+
+   /**
+      set the parameter settings from a model function.
+      Create always new parameter setting list from a given model function
+   */
+   void CreateParamsSettings(const BA_ROOT::Math::IParamMultiFunction & func);
+
+   /**
+      set the parameter settings from number of parameters and a vector of values and optionally step values. If there are not existing or number of parameters does not match existing one, create a new parameter setting list.
+   */
+   void SetParamsSettings(unsigned int npar, const double * params, const double * vstep = 0);
+
+   /*
+     Set the parameter settings from a vector of parameter settings
+   */
+   void SetParamsSettings (const std::vector<BA_ROOT::Fit::ParameterSettings>& pars ) {
+      fSettings = pars;
+   }
+
+
+   /*
+     Set the parameter settings from a fit Result
+   */
+   void SetFromFitResult (const FitResult & rhs);
+
+
+
+   /**
+      create a new minimizer according to chosen configuration
+   */
+   BA_ROOT::Math::Minimizer * CreateMinimizer();
+
+
+
+   /**
+      access to the minimizer  control parameter (non const method)
+   */
+   BA_ROOT::Math::MinimizerOptions & MinimizerOptions()  { return fMinimizerOpts; }
+
+
+#ifndef __CINT__   // this method fails on Windows
+   /**
+      set all the minimizer options using class MinimizerOptions
+    */
+   void SetMinimizerOptions(const BA_ROOT::Math::MinimizerOptions & minopt);
+#endif
+
+
+   /**
+      set minimizer type
+   */
+   void SetMinimizer(const char * type, const char * algo = 0) {
+      if (type) fMinimizerOpts.SetMinimizerType(type);
+      if (algo) fMinimizerOpts.SetMinimizerAlgorithm(algo);
+   }
+
+   /**
+      return type of minimizer package
+   */
+   const std::string & MinimizerType() const { return fMinimizerOpts.MinimizerType(); }
+
+   /**
+      return type of minimizer algorithms
+   */
+   const std::string & MinimizerAlgoType() const { return fMinimizerOpts.MinimizerAlgorithm(); }
+
+
+   /**
+      flag to check if resulting errors are be normalized according to chi2/ndf
+   */
+   bool NormalizeErrors() const { return fNormErrors; }
+
+   ///do analysis for parabolic errors
+   bool ParabErrors() const { return fParabErrors; }
+
+   ///do minos errros analysis on the  parameters
+   bool MinosErrors() const { return fMinosErrors; }
+
+   ///Update configuration after a fit using the FitResult
+   bool UpdateAfterFit() const { return fUpdateAfterFit; }
+
+   ///Apply Weight correction for error matrix computation
+   bool UseWeightCorrection() const { return fWeightCorr; }
+
+
+   /// return vector of parameter indeces for which the Minos Error will be computed
+   const std::vector<unsigned int> & MinosParams() const { return fMinosParams; }
+
+   /**
+      set the option to normalize the error on the result  according to chi2/ndf
+   */
+   void SetNormErrors(bool on = true) { fNormErrors= on; }
+
+   ///set parabolic erros
+   void SetParabErrors(bool on = true) { fParabErrors = on; }
+
+   ///set Minos erros computation to be performed after fitting
+   void SetMinosErrors(bool on = true) { fMinosErrors = on; }
+
+   ///apply the weight correction for error matric computation
+   void SetWeightCorrection(bool on = true) { fWeightCorr = on; }
+
+   /// set parameter indeces for running Minos
+   /// this can be used for running Minos on a subset of parameters - otherwise is run on all of them
+   /// if MinosErrors() is set
+   void SetMinosErrors(const std::vector<unsigned int> & paramInd ) {
+      fMinosErrors = true;
+      fMinosParams = paramInd;
+   }
+
+   ///Update configuration after a fit using the FitResult
+   void SetUpdateAfterFit(bool on = true) { fUpdateAfterFit = on; }
+
+
+   /**
+      static function to control default minimizer type and algorithm
+   */
+   static void SetDefaultMinimizer(const char * type, const char * algo = 0);
+
+
+
+
+protected:
+
+
+private:
+
+   bool fNormErrors;       // flag for error normalization
+   bool fParabErrors;      // get correct parabolic errors estimate (call Hesse after minimizing)
+   bool fMinosErrors;      // do full error analysis using Minos
+   bool fUpdateAfterFit;   // update the configuration after a fit using the result
+   bool fWeightCorr;       // apply correction to errors for weights fits
+
+   std::vector<BA_ROOT::Fit::ParameterSettings> fSettings;  // vector with the parameter settings
+   std::vector<unsigned int> fMinosParams;               // vector with the parameter indeces for running Minos
+
+   BA_ROOT::Math::MinimizerOptions fMinimizerOpts;   //minimizer control parameters including name and algo type
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_FitConfig */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/FitResult.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitResult.h
new file mode 100644
index 0000000..12d1ec1
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitResult.h
@@ -0,0 +1,376 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:05:34 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class FitResult
+
+#ifndef ROOT_Fit_FitResult
+#define ROOT_Fit_FitResult
+
+#ifndef ROOT_Fit_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+#ifndef ROOT_Fit_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#include <vector>
+#include <map>
+#include <string>
+#include <cmath>
+#include <cassert>
+#include <memory>
+
+namespace BA_ROOT {
+
+   namespace Math {
+      class Minimizer;
+   }
+
+
+   namespace Fit {
+
+      class FitConfig;
+      class FitData; 
+      class BinData;
+
+//___________________________________________________________________________________
+/**
+   class containg the result of the fit and all the related information
+   (fitted parameter values, error, covariance matrix and minimizer result information)
+   Contains a pointer also to the fitted (model) function, modified with the fit parameter values.
+   When the fit is valid, it is constructed from a  Minimizer and a model function pointer
+
+   @ingroup FitMain
+*/
+class FitResult {
+
+public:
+
+   typedef  BA_ROOT::Math::IParamMultiFunction IModelFunction;
+
+   /**
+      Default constructor for an empty (non valid) fit result
+   */
+   FitResult ();
+
+   /**
+      Constructor from a fit-config for a dummy fit
+      (e.g. when only one fcn evaluation is done)
+   */
+   FitResult (const FitConfig & fconfig);
+
+
+   /**
+      Copy constructor.
+   */
+   FitResult(const FitResult & rhs);
+
+   /**
+      Assignment operator
+   */
+   FitResult & operator = (const FitResult & rhs);
+
+   /**
+      Destructor
+   */
+   virtual ~FitResult ();
+
+
+public:
+
+   /**
+      Fill the fit result from a Minimizer instance after fitting
+      Run also Minos if requested from the configuration
+    */
+   void FillResult(const std::shared_ptr<BA_ROOT::Math::Minimizer> & min, const FitConfig & fconfig,  const std::shared_ptr<IModelFunction> & f,
+              bool isValid, unsigned int sizeOfData = 0, bool binFit = true, const BA_ROOT::Math::IMultiGenFunction * chi2func = 0, unsigned int ncalls = 0);
+
+
+   /**
+      Update the fit result with a new minimization status
+      To be run only if same fit is performed with same configuration
+      Note that in this case MINOS is not re-run. If one wants to run also MINOS
+      a new result must be created
+    */
+   bool Update(const std::shared_ptr<BA_ROOT::Math::Minimizer> & min, bool isValid, unsigned int ncalls = 0 );
+
+   /** minimization quantities **/
+
+   /// minimizer type
+   const std::string & MinimizerType() const { return fMinimType; }
+
+   /**
+       True if fit successful, otherwise false.
+       A fit is considered successful if the minimizer succeded in finding the
+       minimum. It could happen that subsequent operations like error analysis (e.g. Minos)
+       failed. In that case the status can be still true if the original minimization algorithm
+       succeeded in finding the minimum.
+       One can query in that case the minimizer return status using Status().
+       It is responability to the Minimizer class to tag a found minimum as valid or not
+       and to produce also a status code.
+   */
+   bool IsValid() const { return fValid; }
+
+   /// True if a fit result does not exist (even invalid) with parameter values
+   bool IsEmpty() const { return (fParams.size() == 0);  }
+
+   /// Return value of the objective function (chi2 or likelihood) used in the fit
+   double MinFcnValue() const { return fVal; }
+
+   ///Number of function calls to find minimum
+   unsigned int NCalls() const { return fNCalls; }
+
+   ///Expected distance from minimum
+   double Edm() const { return fEdm; }
+
+   ///   get total number of parameters
+   unsigned int NTotalParameters() const { return fParams.size(); }
+   /// total number of parameters (abbreviation)
+   unsigned int NPar() const { return NTotalParameters(); }
+
+   /// get total number of free parameters
+   unsigned int NFreeParameters() const { return fNFree; }
+
+   /// minimizer status code
+   int Status() const { return fStatus; }
+
+   ///covariance matrix status code
+   /// using Minuit convention : =0 not calculated, =1 approximated, =2 made pos def , =3 accurate
+
+   int CovMatrixStatus() const { return fCovStatus; }
+
+   /** fitting quantities **/
+
+   /// Return pointer to model (fit) function with fitted parameter values.
+   /// Pointer is managed internally. I must not be deleted 
+   const IModelFunction * FittedFunction() const {
+      return fFitFunc.get(); 
+   }
+
+   /// return BinData used in the fit (return a nullptr in case a different fit is done
+   /// or the data are not available
+   /// Pointer is managed internally, it must not be deleted 
+   const BinData * FittedBinData() const;
+
+
+   /// Chi2 fit value
+   /// in case of likelihood must be computed ?
+   double Chi2() const { return fChi2; }
+
+   /// Number of degree of freedom
+   unsigned int Ndf() const { return fNdf; }
+
+   /// p value of the fit (chi2 probability)
+   double Prob() const;
+
+   /// parameter errors (return st::vector)
+   const std::vector<double> & Errors() const { return fErrors; }
+   /// parameter errors (return const pointer)
+   const double * GetErrors() const { return (fErrors.empty()) ? 0 : &fErrors.front(); }
+
+   /// parameter values (return std::vector)
+   const std::vector<double> & Parameters() const { return fParams; }
+   /// parameter values (return const pointer)
+   const double * GetParams() const { return &fParams.front(); }
+
+   /// parameter value by index
+   double Value(unsigned int i) const { return fParams[i]; }
+   /// parameter value by index
+   double Parameter(unsigned int i) const { return fParams[i]; }
+
+   /// parameter error by index
+   // (NOTE: this due to conflict with TObject::Error cannot used in derived class which
+   // inherits from TObject. Use instead ParError (or Errors()[i] )
+   double Error(unsigned int i) const {
+      return (i < fErrors.size() ) ? fErrors[i] : 0;
+   }
+   /// parameter error by index
+   double ParError(unsigned int i) const {
+      return (i < fErrors.size() ) ? fErrors[i] : 0;
+   }
+
+   /// name of the parameter
+   std::string ParName(unsigned int i) const;
+
+   /// set the Minos errors for parameter i (called by the Fitter class when running Minos)
+   void SetMinosError(unsigned int i, double elow, double eup);
+
+   /// query if parameter i has the Minos error
+   bool HasMinosError(unsigned int i) const;
+
+   /// lower Minos error. If Minos has not run for parameter i return the parabolic error
+   double LowerError(unsigned int i) const;
+
+   /// upper Minos error. If Minos has not run for parameter i return the parabolic error
+   double UpperError(unsigned int i) const;
+
+   /// parameter global correlation coefficient
+   double GlobalCC(unsigned int i) const {
+      return (i < fGlobalCC.size() ) ? fGlobalCC[i] : -1;
+   }
+
+
+   /// retrieve covariance matrix element
+   double CovMatrix (unsigned int i, unsigned int j) const {
+      if ( i >= fErrors.size() || j >= fErrors.size() ) return 0;
+      if (fCovMatrix.size() == 0) return 0; // no matrix is available in case of non-valid fits
+      if ( j < i )
+         return fCovMatrix[j + i* (i+1) / 2];
+      else
+         return fCovMatrix[i + j* (j+1) / 2];
+   }
+
+   /// retrieve correlation elements
+   double Correlation(unsigned int i, unsigned int j ) const {
+      if ( i >= fErrors.size() || j >= fErrors.size() ) return 0;
+      if (fCovMatrix.size() == 0) return 0; // no matrix is available in case of non-valid fits
+      double tmp = CovMatrix(i,i)*CovMatrix(j,j);
+      return ( tmp > 0) ? CovMatrix(i,j)/ std::sqrt(tmp) : 0;
+   }
+
+   /// fill covariance matrix elements using a generic matrix class implementing operator(i,j)
+   /// the matrix must be previously allocates with right size (npar * npar)
+   template<class Matrix>
+   void GetCovarianceMatrix(Matrix & mat) const {
+      unsigned int npar = fErrors.size();
+      if (fCovMatrix.size() != npar*(npar+1)/2 ) return; // do nothing
+      for (unsigned int i = 0; i< npar; ++i) {
+         for (unsigned int j = 0; j<=i; ++j) {
+            mat(i,j) = fCovMatrix[j + i*(i+1)/2 ];
+            if (i != j) mat(j,i) = mat(i,j);
+         }
+      }
+   }
+
+   /// fill a correlation matrix elements using a generic symmetric matrix class implementing operator(i,j)
+   /// the matrix must be previously allocates with right size (npar * npar)
+   template<class Matrix>
+   void GetCorrelationMatrix(Matrix & mat) const {
+      unsigned int npar = fErrors.size();
+      if (fCovMatrix.size() != npar*(npar+1)/2) return; // do nothing
+      for (unsigned int i = 0; i< npar; ++i) {
+         for (unsigned int j = 0; j<=i; ++j) {
+            double tmp = fCovMatrix[i * (i +3)/2 ] * fCovMatrix[ j * (j+3)/2 ];
+            mat(i,j) = (tmp > 0) ? fCovMatrix[j + i*(i+1)/2 ] / std::sqrt(tmp) : 0;
+            if (i != j) mat(j,i) = mat(i,j);
+         }
+      }
+   }
+
+   /**
+      get confidence intervals for an array of n points x.
+      stride1 indicates the stride in the coordinate space while stride2 the stride in dimension space.
+      For 1-dim points : stride1=1, stride2=1
+      for multi-dim points arranged as (x0,x1,...,xN,y0,....yN)          stride1=1      stride2=n
+      for multi-dim points arraged  as (x0,y0,..,x1,y1,...,xN,yN,..)     stride1=ndim,  stride2=1
+
+      the confidence interval are returned in the array ci
+      cl is the desired confidedence interval value
+      norm is a flag to control if the intervals need to be normalized to the chi2/ndf value
+      By default the intervals are corrected using the chi2/ndf value of the fit if a chi2 fit is performed
+    */
+   void GetConfidenceIntervals(unsigned int n, unsigned int stride1, unsigned int stride2, const double * x,  double * ci, double cl=0.95, bool norm = true ) const;
+
+   /**
+      evaluate confidence interval for the point specified in the passed data sets
+      the confidence interval are returned in the array ci
+      cl is the desired confidence interval value. 
+      This method is mantained for backward compatibility and will be deprecated
+   */
+   void GetConfidenceIntervals(const BinData & data, double * ci, double cl=0.95, bool norm = true ) const;
+
+   /**
+      evaluate confidence interval for the data set used in the last fit
+      the confidence interval are returned as a vector of data points
+    */
+   std::vector<double> GetConfidenceIntervals(double cl=0.95, bool norm = true ) const;
+
+
+   /// get index for parameter name (return -1 if not found)
+   int Index(const std::string & name) const;
+
+
+   ///normalize errors using chi2/ndf for chi2 fits
+   void NormalizeErrors();
+
+   /// flag to chek if errors are normalized
+   bool NormalizedErrors() const { return fNormalized; }
+
+   /// print the result and optionaly covariance matrix and correlations
+   void Print(std::ostream & os, bool covmat = false) const;
+
+   ///print error matrix and correlations
+   void PrintCovMatrix(std::ostream & os) const;
+
+   /// query if a parameter is bound
+   bool IsParameterBound(unsigned int ipar) const;
+
+   /// query if a parameter is fixed
+   bool IsParameterFixed(unsigned int ipar) const;
+
+   /// retrieve parameter bounds - return false if parameter is not bound
+   bool ParameterBounds(unsigned int ipar, double &lower, double &upper) const;
+
+
+   /// get name of parameter (deprecated)
+   std::string GetParameterName(unsigned int ipar) const {
+      return ParName(ipar);
+   }
+
+
+protected:
+
+
+   /// Return pointer non const pointer to model (fit) function with fitted parameter values.
+   /// used by Fitter class
+   std::shared_ptr<IModelFunction> ModelFunction()  { return fFitFunc; }
+   void SetModelFunction(const std::shared_ptr<IModelFunction> & func) { fFitFunc = func; }
+
+
+   friend class Fitter;
+
+
+   bool fValid;             // flag for indicating valid fit
+   bool fNormalized;        // flag for indicating is errors are normalized
+   unsigned int fNFree;     // number of fit free parameters (total parameters are in size of parameter vector)
+   unsigned int fNdf;       // number of degree of freedom
+   unsigned int fNCalls;    // number of function calls
+   int fStatus;             // minimizer status code
+   int fCovStatus;          // covariance matrix status code
+   double fVal;             // minimum function value
+   double fEdm;             // expected distance from mimimum
+   double fChi2;            // fit chi2 value (different than fval in case of chi2 fits)
+   std::shared_ptr<BA_ROOT::Math::Minimizer> fMinimizer; //! minimizer object used for fitting
+   std::shared_ptr<BA_ROOT::Math::IMultiGenFunction> fObjFunc; //! objective function used for fitting
+   std::shared_ptr<IModelFunction> fFitFunc; //! model function resulting  from the fit. 
+   std::shared_ptr<FitData>    fFitData; //! data set used in the fit
+   std::map<unsigned int, bool>           fFixedParams; // list of fixed parameters
+   std::map<unsigned int, unsigned int>   fBoundParams; // list of limited parameters
+   std::vector<std::pair<double,double> >  fParamBounds; // parameter bounds
+   std::vector<double>         fParams;  // parameter values. Size is total number of parameters
+   std::vector<double>         fErrors;  // errors
+   std::vector<double>         fCovMatrix;  // covariance matrix (size is npar*(npar+1)/2) where npar is total parameters
+   std::vector<double>         fGlobalCC;   // global Correlation coefficient
+   std::map<unsigned int, std::pair<double,double> > fMinosErrors;   // map contains the two Minos errors
+   std::string fMinimType;              // string indicating type of minimizer
+   std::vector<std::string> fParNames;  // parameter names (only with FCN only fits, when fFitFunc=0)
+
+};
+
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+
+
+#endif /* ROOT_Fit_FitResult */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/FitUtil.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitUtil.h
new file mode 100644
index 0000000..4a3b63c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitUtil.h
@@ -0,0 +1,134 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Nov 28 10:52:47 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class FitUtil
+
+#ifndef ROOT_Fit_FitUtil
+#define ROOT_Fit_FitUtil
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Fit_DataVectorfwd
+#include "Fit/DataVectorfwd.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+
+
+/**
+   namespace defining utility free functions using in Fit for evaluating the various fit method
+   functions (chi2, likelihood, etc..)  given the data and the model function
+
+   @ingroup FitMain
+*/
+namespace FitUtil {
+
+   typedef  BA_ROOT::Math::IParamMultiFunction IModelFunction;
+   typedef  BA_ROOT::Math::IParamMultiGradFunction IGradModelFunction;
+
+   /** Chi2 Functions */
+
+   /**
+       evaluate the Chi2 given a model function and the data at the point x.
+       return also nPoints as the effective number of used points in the Chi2 evaluation
+   */
+   double EvaluateChi2(const IModelFunction & func, const BinData & data, const double * x, unsigned int & nPoints);
+
+   /**
+       evaluate the effective Chi2 given a model function and the data at the point x.
+       The effective chi2 uses the errors on the coordinates : W = 1/(sigma_y**2 + ( sigma_x_i * df/dx_i )**2 )
+       return also nPoints as the effective number of used points in the Chi2 evaluation
+   */
+   double EvaluateChi2Effective(const IModelFunction & func, const BinData & data, const double * x, unsigned int & nPoints);
+
+   /**
+       evaluate the Chi2 gradient given a model function and the data at the point x.
+       return also nPoints as the effective number of used points in the Chi2 evaluation
+   */
+   void EvaluateChi2Gradient(const IModelFunction & func, const BinData & data, const double * x, double * grad, unsigned int & nPoints);
+
+   /**
+       evaluate the LogL given a model function and the data at the point x.
+       return also nPoints as the effective number of used points in the LogL evaluation
+   */
+   double EvaluateLogL(const IModelFunction & func, const UnBinData & data, const double * x, int iWeight, bool extended, unsigned int & nPoints);
+
+   /**
+       evaluate the LogL gradient given a model function and the data at the point x.
+       return also nPoints as the effective number of used points in the LogL evaluation
+   */
+   void EvaluateLogLGradient(const IModelFunction & func, const UnBinData & data, const double * x, double * grad, unsigned int & nPoints);
+
+   /**
+       evaluate the Poisson LogL given a model function and the data at the point x.
+       return also nPoints as the effective number of used points in the LogL evaluation
+       By default is extended, pass extedend to false if want to be not extended (MultiNomial)
+   */
+   double EvaluatePoissonLogL(const IModelFunction & func, const BinData & data, const double * x, int iWeight, bool extended, unsigned int & nPoints);
+
+   /**
+       evaluate the Poisson LogL given a model function and the data at the point x.
+       return also nPoints as the effective number of used points in the LogL evaluation
+   */
+   void EvaluatePoissonLogLGradient(const IModelFunction & func, const BinData & data, const double * x, double * grad);
+
+//    /**
+//        Parallel evaluate the Chi2 given a model function and the data at the point x.
+//        return also nPoints as the effective number of used points in the Chi2 evaluation
+//    */
+//    double ParallelEvalChi2(const IModelFunction & func, const BinData & data, const double * x, unsigned int & nPoints);
+
+   // methods required by dedicate minimizer like Fumili
+
+   /**
+       evaluate the residual contribution to the Chi2 given a model function and the BinPoint data
+       and if the pointer g is not null evaluate also the gradient of the residual.
+       If the function provides parameter derivatives they are used otherwise a simple derivative calculation
+       is used
+   */
+   double EvaluateChi2Residual(const IModelFunction & func, const BinData & data, const double * x, unsigned int ipoint, double *g = 0);
+
+   /**
+       evaluate the pdf contribution to the LogL given a model function and the BinPoint data.
+       If the pointer g is not null evaluate also the gradient of the pdf.
+       If the function provides parameter derivatives they are used otherwise a simple derivative calculation
+       is used
+   */
+   double EvaluatePdf(const IModelFunction & func, const UnBinData & data, const double * x, unsigned int ipoint, double * g = 0);
+
+   /**
+       evaluate the pdf contribution to the Poisson LogL given a model function and the BinPoint data.
+       If the pointer g is not null evaluate also the gradient of the Poisson pdf.
+       If the function provides parameter derivatives they are used otherwise a simple derivative calculation
+       is used
+   */
+   double EvaluatePoissonBinPdf(const IModelFunction & func, const BinData & data, const double * x, unsigned int ipoint, double * g = 0);
+
+
+
+
+
+
+
+} // end namespace FitUtil
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_FitUtil */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/FitUtilParallel.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitUtilParallel.h
new file mode 100644
index 0000000..2fd8e7c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/FitUtilParallel.h
@@ -0,0 +1,72 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Nov 28 10:52:47 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class FitUtil
+
+
+#ifndef ROOT_Fit_FitUtilParallel
+#define ROOT_Fit_FitUtilParallel
+
+#ifdef _WIN32  // no support for parallel fits on Win32
+#ifdef ROOT_FIT_PARALLEL
+#undef ROOT_FIT_PARALLEL
+#endif
+#endif
+
+#ifdef ROOT_FIT_PARALLEL
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Fit_DataVectorfwd
+#include "Fit/DataVectorfwd.h"
+#endif
+
+
+namespace ROOT {
+
+   namespace Fit {
+
+
+   typedef  ROOT::Math::IParamMultiFunction IModelFunction;
+
+
+/**
+   namespace defining free functions for Fitting parallel mode
+
+   Status: functions are not not completed and are still preliminary
+
+   @ingroup FitMain
+*/
+namespace FitUtilParallel {
+
+
+
+   /**
+       evaluate the Chi2 given a model function and the data at the point x.
+       return also nPoints as the effective number of used points in the Chi2 evaluation
+       Use a parallel evaluation spawning multiple threads
+   */
+   double EvaluateChi2(IModelFunction & func, const BinData & data, const double * x, unsigned int & nPoints);
+
+
+   double EvaluateLogL(IModelFunction & func, const UnBinData & data, const double * p, unsigned int &nPoints);
+
+
+} // end namespace FitUtil
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_FIT_PARALLEL */
+#endif /* ROOT_Fit_FitUtil */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/Fitter.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/Fitter.h
new file mode 100644
index 0000000..4e30456
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/Fitter.h
@@ -0,0 +1,550 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:05:19 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class Fitter
+
+#ifndef ROOT_Fit_Fitter
+#define ROOT_Fit_Fitter
+
+/**
+ at defgroup Fit Fitting and Parameter Estimation
+
+Classes used for fitting (regression analysis) and estimation of parameter values given a data sample.
+*/
+
+// #ifndef ROOT_Fit_DataVectorfwd
+// #include "Fit/DataVectorfwd.h"
+// #endif
+#ifndef ROOT_Fit_BinData
+#include "Fit/BinData.h"
+#endif
+#ifndef ROOT_Fit_UnBinData
+#include "Fit/UnBinData.h"
+#endif
+
+#ifndef ROOT_Fit_FitConfig
+#include "Fit/FitConfig.h"
+#endif
+
+#ifndef ROOT_Fit_FitResult
+#include "Fit/FitResult.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#include <memory>
+
+
+namespace BA_ROOT {
+
+
+   namespace Math {
+      class Minimizer;
+
+      // should maybe put this in a FitMethodFunctionfwd file
+      template<class FunctionType> class BasicFitMethodFunction;
+
+      // define the normal and gradient function
+      typedef BasicFitMethodFunction<BA_ROOT::Math::IMultiGenFunction>  FitMethodFunction;
+      typedef BasicFitMethodFunction<BA_ROOT::Math::IMultiGradFunction> FitMethodGradFunction;
+
+   }
+
+   /**
+      Namespace for the fitting classes
+      @ingroup Fit
+    */
+
+   namespace Fit {
+
+/**
+   @defgroup FitMain User Fitting classes
+
+   Main Classes used for fitting a given data set
+   @ingroup Fit
+*/
+
+
+//___________________________________________________________________________________
+/**
+   Fitter class, entry point for performing all type of fits.
+   Fits are performed using the generic ROOT::Fit::Fitter::Fit method.
+   The inputs are the data points and a model function (using a ROOT::Math::IParamFunction)
+   The result of the fit is returned and kept internally in the  ROOT::Fit::FitResult class.
+   The configuration of the fit (parameters, options, etc...) are specified in the
+   ROOT::Math::FitConfig class.
+   After fitting the config of the fit will be modified to have the new values the resulting
+   parameter of the fit with step sizes equal to the errors. FitConfig can be preserved with
+   initial parameters by calling FitConfig.SetUpdateAfterFit(false);
+
+   @ingroup FitMain
+*/
+class Fitter {
+
+public:
+
+   typedef BA_ROOT::Math::IParamMultiFunction       IModelFunction;
+   typedef BA_ROOT::Math::IParamMultiGradFunction   IGradModelFunction;
+   typedef BA_ROOT::Math::IParamFunction            IModel1DFunction;
+   typedef BA_ROOT::Math::IParamGradFunction        IGradModel1DFunction;
+
+   typedef BA_ROOT::Math::IMultiGenFunction BaseFunc;
+   typedef BA_ROOT::Math::IMultiGradFunction BaseGradFunc;
+
+
+   /**
+      Default constructor
+   */
+   Fitter ();
+
+   /**
+      Constructor from a result
+   */
+   Fitter (const std::shared_ptr<FitResult> & result);
+
+
+   /**
+      Destructor
+   */
+   ~Fitter ();
+
+private:
+
+   /**
+      Copy constructor (disabled, class is not copyable)
+   */
+   Fitter(const Fitter &);
+
+   /**
+      Assignment operator (disabled, class is not copyable)
+   */
+   Fitter & operator = (const Fitter & rhs);
+
+
+public:
+
+   /**
+       fit a data set using any  generic model  function
+       If data set is binned a least square fit is performed
+       If data set is unbinned a maximum likelihood fit (not extended) is done
+       Pre-requisite on the function:
+       it must implement the 1D or multidimensional parametric function interface
+   */
+   template < class Data , class Function>
+   bool Fit( const Data & data, const Function & func ) {
+      SetFunction(func);
+      return Fit(data);
+   }
+
+   /**
+       Fit a binned data set using a least square fit (default method)
+   */
+   bool Fit(const BinData & data) {
+      SetData(data);
+      return DoLeastSquareFit();
+   }
+   bool Fit(const std::shared_ptr<BinData> & data) {
+      SetData(data);
+      return DoLeastSquareFit();
+   }
+
+   /**
+       Fit a binned data set using a least square fit
+   */
+   bool LeastSquareFit(const BinData & data) {
+      return Fit(data);
+   }
+
+   /**
+       fit an unbinned data set using loglikelihood method
+   */
+   bool Fit(const UnBinData & data, bool extended = false) {
+      SetData(data);
+      return DoUnbinnedLikelihoodFit(extended);
+   }
+
+   /**
+      Binned Likelihood fit. Default is extended
+    */
+   bool LikelihoodFit(const BinData & data, bool extended = true) {
+      SetData(data);
+      return DoBinnedLikelihoodFit(extended);
+   }
+   bool LikelihoodFit(const std::shared_ptr<BinData> & data, bool extended = true) {
+      SetData(data);
+      return DoBinnedLikelihoodFit(extended);
+   }
+   /**
+      Unbinned Likelihood fit. Default is not extended
+    */
+   bool LikelihoodFit(const UnBinData & data, bool extended = false) {
+      SetData(data);
+      return DoUnbinnedLikelihoodFit(extended);
+   }
+   bool LikelihoodFit(const std::shared_ptr<UnBinData> & data, bool extended = false) {
+      SetData(data);
+      return DoUnbinnedLikelihoodFit(extended);
+   }
+
+
+   /**
+       fit a data set using any  generic model  function
+       Pre-requisite on the function:
+   */
+   template < class Data , class Function>
+   bool LikelihoodFit( const Data & data, const Function & func, bool extended) {
+      SetFunction(func);
+      return LikelihoodFit(data, extended);
+   }
+
+   /**
+      do a linear fit on a set of bin-data
+    */
+   bool LinearFit(const BinData & data) {
+      SetData(data);
+      return DoLinearFit();
+   }
+   bool LinearFit(const std::shared_ptr<BinData> & data) {
+      SetData(data);
+      return DoLinearFit();
+   }
+
+
+   /**
+      Fit using the a generic FCN function as a C++ callable object implementing
+      double () (const double *)
+      Note that the function dimension (i.e. the number of parameter) is needed in this case
+      For the options see documentation for following methods FitFCN(IMultiGenFunction & fcn,..)
+    */
+   template <class Function>
+   bool FitFCN(unsigned int npar, Function  & fcn, const double * params = 0, unsigned int dataSize = 0, bool chi2fit = false);
+
+   /**
+      Set a generic FCN function as a C++ callable object implementing
+      double () (const double *)
+      Note that the function dimension (i.e. the number of parameter) is needed in this case
+      For the options see documentation for following methods FitFCN(IMultiGenFunction & fcn,..)
+    */
+   template <class Function>
+   bool SetFCN(unsigned int npar, Function  & fcn, const double * params = 0, unsigned int dataSize = 0, bool chi2fit = false);
+
+   /**
+      Fit using the given FCN function represented by a multi-dimensional function interface
+      (ROOT::Math::IMultiGenFunction).
+      Give optionally the initial arameter values, data size to have the fit Ndf correctly
+      set in the FitResult and flag specifying if it is a chi2 fit.
+      Note that if the parameters values are not given (params=0) the
+      current parameter settings are used. The parameter settings can be created before
+      by using the FitConfig::SetParamsSetting. If they have not been created they are created
+      automatically when the params pointer is not zero.
+      Note that passing a params != 0 will set the parameter settings to the new value AND also the
+      step sizes to some pre-defined value (stepsize = 0.3 * abs(parameter_value) )
+    */
+   bool FitFCN(const BA_ROOT::Math::IMultiGenFunction & fcn, const double * params = 0, unsigned int dataSize = 0, bool
+      chi2fit = false);
+
+   /**
+       Fit using a FitMethodFunction interface. Same as method above, but now extra information
+       can be taken from the function class
+   */
+   bool FitFCN(const BA_ROOT::Math::FitMethodFunction & fcn, const double * params = 0);
+
+   /**
+      Set the FCN function represented by a multi-dimensional function interface
+      (ROOT::Math::IMultiGenFunction) and optionally the initial parameters
+      See also note above for the initial parameters for FitFCN
+    */
+   bool SetFCN(const BA_ROOT::Math::IMultiGenFunction & fcn, const double * params = 0, unsigned int dataSize = 0, bool chi2fit = false);
+
+   /**
+       Set the objective function (FCN)  using a FitMethodFunction interface.
+       Same as method above, but now extra information can be taken from the function class
+   */
+   bool SetFCN(const BA_ROOT::Math::FitMethodFunction & fcn, const double * params = 0);
+
+   /**
+      Fit using the given FCN function representing a multi-dimensional gradient function
+      interface (ROOT::Math::IMultiGradFunction). In this case the minimizer will use the
+      gradient information provided by the function.
+      For the options same consideration as in the previous method
+    */
+   bool FitFCN(const BA_ROOT::Math::IMultiGradFunction & fcn, const double * params = 0, unsigned int dataSize = 0, bool chi2fit = false);
+
+   /**
+       Fit using a FitMethodGradFunction interface. Same as method above, but now extra information
+       can be taken from the function class
+   */
+   bool FitFCN(const BA_ROOT::Math::FitMethodGradFunction & fcn, const double * params = 0);
+
+   /**
+      Set the FCN function represented by a multi-dimensional gradient function interface
+      (ROOT::Math::IMultiGenFunction) and optionally the initial parameters
+      See also note above for the initial parameters for FitFCN
+    */
+   bool SetFCN(const BA_ROOT::Math::IMultiGradFunction & fcn, const double * params = 0, unsigned int dataSize = 0, bool chi2fit = false);
+
+   /**
+       Set the objective function (FCN)  using a FitMethodGradFunction interface.
+       Same as method above, but now extra information can be taken from the function class
+   */
+   bool SetFCN(const BA_ROOT::Math::FitMethodGradFunction & fcn, const double * params = 0);
+
+
+   /**
+      fit using user provided FCN with Minuit-like interface
+      If npar = 0 it is assumed that the parameters are specified in the parameter settings created before
+      For the options same consideration as in the previous method
+    */
+   typedef  void (* MinuitFCN_t )(int &npar, double *gin, double &f, double *u, int flag);
+   bool FitFCN( MinuitFCN_t fcn, int npar = 0, const double * params = 0, unsigned int dataSize = 0, bool chi2fit = false);
+
+   /**
+      set objective function using user provided FCN with Minuit-like interface
+      If npar = 0 it is assumed that the parameters are specified in the parameter settings created before
+      For the options same consideration as in the previous method
+    */
+   bool SetFCN( MinuitFCN_t fcn, int npar = 0, const double * params = 0, unsigned int dataSize = 0, bool chi2fit = false);
+
+   /**
+      Perform a fit with the previously set FCN function. Require SetFCN before
+    */
+   bool FitFCN();
+
+   /**
+      Perform a simple FCN evaluation. FitResult will be modified and contain  the value of the FCN
+    */
+   bool EvalFCN();
+
+
+
+   /**
+       Set the fitted function (model function) from a parametric function interface
+   */
+   void  SetFunction(const IModelFunction & func, bool useGradient = false);
+   /**
+      Set the fitted function from a parametric 1D function interface
+    */
+   void  SetFunction(const IModel1DFunction & func, bool useGradient = false);
+
+   /**
+       Set the fitted function (model function) from a parametric gradient function interface
+   */
+   void  SetFunction(const IGradModelFunction & func, bool useGradient = true);
+   /**
+      Set the fitted function from 1D gradient parametric function interface
+    */
+   void  SetFunction(const IGradModel1DFunction & func, bool useGradient = true);
+
+
+   /**
+      get fit result
+   */
+   const FitResult & Result() const {
+      assert( fResult.get() );
+      return *fResult;
+   }
+
+
+   /**
+      perform an error analysis on the result using the Hessian
+      Errors are obtaied from the inverse of the Hessian matrix
+      To be called only after fitting and when a minimizer supporting the Hessian calculations is used
+      otherwise an error (false) is returned.
+      A new  FitResult with the Hessian result will be produced
+    */
+   bool CalculateHessErrors();
+
+   /**
+      perform an error analysis on the result using MINOS
+      To be called only after fitting and when a minimizer supporting MINOS is used
+      otherwise an error (false) is returned.
+      The result will be appended in the fit result class
+      Optionally a vector of parameter indeces can be passed for selecting
+      the parameters to analyse using FitConfig::SetMinosErrors
+    */
+   bool CalculateMinosErrors();
+
+   /**
+      access to the fit configuration (const method)
+   */
+   const FitConfig & Config() const { return fConfig; }
+
+   /**
+      access to the configuration (non const method)
+   */
+   FitConfig & Config() { return fConfig; }
+
+   /**
+      query if fit is binned. In cse of false teh fit can be unbinned
+      or is not defined (like in case of fitting through a ::FitFCN)
+    */
+   bool IsBinFit() const { return fBinFit; }
+
+   /**
+      return pointer to last used minimizer
+      (is NULL in case fit is not yet done)
+      This pointer is guranteed to be valid as far as the fitter class is valid and a new fit is not redone.
+      To be used only after fitting.
+      The pointer should not be stored and will be invalided after performing a new fitting.
+      In this case a new instance of ROOT::Math::Minimizer will be re-created and can be
+      obtained calling again GetMinimizer()
+    */
+   BA_ROOT::Math::Minimizer * GetMinimizer() const { return fMinimizer.get(); }
+
+   /**
+      return pointer to last used objective function
+      (is NULL in case fit is not yet done)
+      This pointer will be valid as far as the fitter class
+      has not been deleted. To be used after the fitting.
+      The pointer should not be stored and will be invalided after performing a new fitting.
+      In this case a new instance of the function pointer will be re-created and can be
+      obtained calling again GetFCN()
+    */
+   BA_ROOT::Math::IMultiGenFunction * GetFCN() const { return fObjFunction.get(); }
+
+
+   /**
+      apply correction in the error matrix for the weights for likelihood fits
+      This method can be called only after a fit. The
+      passed function (loglw2) is a log-likelihood function impelemented using the
+      sum of weight squared
+      When using FitConfig.SetWeightCorrection() this correction is applied
+      automatically when doing a likelihood fit (binned or unbinned)
+   */
+   bool ApplyWeightCorrection(const BA_ROOT::Math::IMultiGenFunction & loglw2, bool minimizeW2L=false);
+
+
+protected:
+
+
+   /// least square fit
+   bool DoLeastSquareFit();
+   /// binned likelihood fit
+   bool DoBinnedLikelihoodFit( bool extended = true);
+   /// un-binned likelihood fit
+   bool DoUnbinnedLikelihoodFit( bool extended = false);
+   /// linear least square fit
+   bool DoLinearFit();
+
+   // initialize the minimizer
+   bool DoInitMinimizer();
+   /// do minimization
+   bool DoMinimization(const BaseFunc & f, const BA_ROOT::Math::IMultiGenFunction * chifunc = 0);
+   // do minimization after having set obj function
+   bool DoMinimization(const BA_ROOT::Math::IMultiGenFunction * chifunc = 0);
+   // update config after fit
+   void DoUpdateFitConfig();
+   // get function calls from the FCN
+   int GetNCallsFromFCN();
+
+
+   //set data for the fit
+   void SetData(const FitData & data) {
+      fData = std::shared_ptr<FitData>(const_cast<FitData*>(&data),DummyDeleter<FitData>());
+   }
+   // set data and function without cloning them 
+   void SetFunctionAndData(const IModelFunction & func, const FitData & data) {
+      SetData(data);
+      fFunc = std::shared_ptr<IModelFunction>(const_cast<IModelFunction*>(&func),DummyDeleter<IModelFunction>());
+   }
+
+   //set data for the fit using a shared ptr
+   template <class Data> 
+   void SetData(const std::shared_ptr<Data> & data) { 
+      fData = std::static_pointer_cast<Data>(data);
+   }
+
+   /// look at the user provided FCN and get data and model function is
+   /// they derive from ROOT::Fit FCN classes 
+   void ExamineFCN(); 
+
+   
+   /// internal functions to get data set and model function from FCN
+   /// useful for fits done with customized FCN classes 
+   template <class ObjFuncType>
+   bool GetDataFromFCN();  
+
+
+private:
+   
+   bool fUseGradient;       // flag to indicate if using gradient or not
+
+   bool fBinFit;            // flag to indicate if fit is binned
+                            // in case of false the fit is unbinned or undefined)
+                            // flag it is used to compute chi2 for binned likelihood fit
+
+   int fFitType;   // type of fit   (0 undefined, 1 least square, 2 likelihood)
+
+   int fDataSize;  // size of data sets (need for Fumili or LM fitters)
+
+   FitConfig fConfig;       // fitter configuration (options and parameter settings)
+
+   std::shared_ptr<IModelFunction> fFunc;  //! copy of the fitted  function containing on output the fit result 
+
+   std::shared_ptr<BA_ROOT::Fit::FitResult>  fResult;  //! pointer to the object containing the result of the fit
+
+   std::shared_ptr<BA_ROOT::Math::Minimizer>  fMinimizer;  //! pointer to used minimizer
+
+   std::shared_ptr<BA_ROOT::Fit::FitData>  fData;  //! pointer to the fit data (binned or unbinned data)
+
+   std::shared_ptr<BA_ROOT::Math::IMultiGenFunction>  fObjFunction;  //! pointer to used objective function
+
+};
+
+
+// internal functions to get data set and model function from FCN
+// useful for fits done with customized FCN classes 
+template <class ObjFuncType>
+bool Fitter::GetDataFromFCN()  {
+   ObjFuncType * objfunc = dynamic_cast<ObjFuncType*>(fObjFunction.get() );
+   if (objfunc) {
+      fFunc = objfunc->ModelFunctionPtr();
+      fData = objfunc->DataPtr();
+      return true; 
+   }
+   else {
+      return false; 
+   }
+}
+
+      
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+// implementation of inline methods
+
+
+#ifndef __CINT__
+
+
+#ifndef ROOT_Math_WrappedFunction
+#include "Math/WrappedFunction.h"
+#endif
+
+template<class Function>
+bool BA_ROOT::Fit::Fitter::FitFCN(unsigned int npar, Function & f, const double * par, unsigned int datasize,bool chi2fit) {
+   BA_ROOT::Math::WrappedMultiFunction<Function &> wf(f,npar);
+   return FitFCN(wf,par,datasize,chi2fit);
+}
+template<class Function>
+bool BA_ROOT::Fit::Fitter::SetFCN(unsigned int npar, Function & f, const double * par, unsigned int datasize,bool chi2fit) {
+   BA_ROOT::Math::WrappedMultiFunction<Function &> wf(f,npar);
+   return SetFCN(wf,par,datasize,chi2fit);
+}
+
+
+
+
+#endif  // endif __CINT__
+
+#endif /* ROOT_Fit_Fitter */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/LogLikelihoodFCN.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/LogLikelihoodFCN.h
new file mode 100644
index 0000000..d31b92d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/LogLikelihoodFCN.h
@@ -0,0 +1,201 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Fri Aug 17 14:29:24 2007
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2007  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class LogLikelihoodFCN
+
+#ifndef ROOT_Fit_LogLikelihoodFCN
+#define ROOT_Fit_LogLikelihoodFCN
+
+#ifndef ROOT_Fit_BasicFCN
+#include "Fit/BasicFCN.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunction
+#include "Math/IParamFunction.h"
+#endif
+
+#ifndef ROOT_Fit_UnBinData
+#include "Fit/UnBinData.h"
+#endif
+
+#ifndef ROOT_Fit_FitUtil
+#include "Fit/FitUtil.h"
+#endif
+
+#ifdef ROOT_FIT_PARALLEL
+#ifndef ROOT_Fit_FitUtilParallel
+#include "Fit/FitUtilParallel.h"
+#endif
+#endif
+
+#include <memory>
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+//___________________________________________________________________________________
+/**
+   LogLikelihoodFCN class
+   for likelihood fits
+
+   it is template to distinguish gradient and non-gradient case
+
+   @ingroup  FitMethodFunc
+*/
+template<class FunType>
+class LogLikelihoodFCN : public BasicFCN<FunType,UnBinData>  {
+
+public:
+
+   typedef  BasicFCN<FunType,UnBinData> BaseFCN; 
+
+   typedef  ::BA_ROOT::Math::BasicFitMethodFunction<FunType> BaseObjFunction;
+   typedef typename  BaseObjFunction::BaseFunction BaseFunction;
+
+   typedef  ::BA_ROOT::Math::IParamMultiFunction IModelFunction;
+
+
+   /**
+      Constructor from unbin data set and model function (pdf)
+   */
+   LogLikelihoodFCN (const std::shared_ptr<UnBinData> & data, const std::shared_ptr<IModelFunction> & func, int weight = 0, bool extended = false) :
+      BaseFCN( data, func),
+      fIsExtended(extended),
+      fWeight(weight),
+      fNEffPoints(0),
+      fGrad ( std::vector<double> ( func->NPar() ) )
+   {}
+
+      /**
+      Constructor from unbin data set and model function (pdf) for object managed by users
+   */
+   LogLikelihoodFCN (const UnBinData & data, const IModelFunction & func, int weight = 0, bool extended = false) :
+      BaseFCN(std::shared_ptr<UnBinData>(const_cast<UnBinData*>(&data), DummyDeleter<UnBinData>()), std::shared_ptr<IModelFunction>(dynamic_cast<IModelFunction*>(func.Clone() ) ) ),
+      fIsExtended(extended),
+      fWeight(weight),
+      fNEffPoints(0),
+      fGrad ( std::vector<double> ( func.NPar() ) )
+   {}
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~LogLikelihoodFCN () {}
+
+   /**
+      Copy constructor 
+   */
+   LogLikelihoodFCN(const LogLikelihoodFCN & f) :
+      BaseFCN(f.DataPtr(), f.ModelFunctionPtr() ),
+      fIsExtended(f.fIsExtended ),
+      fWeight( f.fWeight ),
+      fNEffPoints( f.fNEffPoints ),
+      fGrad( f.fGrad)
+   {  }
+
+
+   /**
+      Assignment operator 
+   */
+   LogLikelihoodFCN & operator = (const LogLikelihoodFCN & rhs) {
+      SetData(rhs.DataPtr() );
+      SetModelFunction(rhs.ModelFunctionPtr() );
+      fNEffPoints = rhs.fNEffPoints;
+      fGrad = rhs.fGrad; 
+      fIsExtended = rhs.fIsExtended;
+      fWeight = rhs.fWeight; 
+   }
+
+
+   /// clone the function (need to return Base for Windows)
+   virtual BaseFunction * Clone() const { return  new LogLikelihoodFCN(*this); }
+
+
+   //using BaseObjFunction::operator();
+
+   // effective points used in the fit
+   virtual unsigned int NFitPoints() const { return fNEffPoints; }
+
+   /// i-th likelihood contribution and its gradient
+   virtual double DataElement(const double * x, unsigned int i, double * g) const {
+      if (i==0) this->UpdateNCalls();
+      return FitUtil::EvaluatePdf(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
+   }
+
+
+   // need to be virtual to be instantited
+   virtual void Gradient(const double *x, double *g) const {
+      // evaluate the chi2 gradient
+      FitUtil::EvaluateLogLGradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g, fNEffPoints);
+   }
+
+   /// get type of fit method function
+   virtual  typename BaseObjFunction::Type_t Type() const { return BaseObjFunction::kLogLikelihood; }
+
+
+   // Use sum of the weight squared in evaluating the likelihood
+   // (this is needed for calculating the errors)
+   void UseSumOfWeightSquare(bool on = true) {
+      if (fWeight == 0) return; // do nothing if it was not weighted
+      if (on) fWeight = 2;
+      else fWeight = 1;
+   }
+
+
+
+protected:
+
+
+private:
+
+   /**
+      Evaluation of the  function (required by interface)
+    */
+   virtual double DoEval (const double * x) const {
+      this->UpdateNCalls();
+
+#ifdef ROOT_FIT_PARALLEL
+      return FitUtilParallel::EvaluateLogL(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints);
+#else
+      return FitUtil::EvaluateLogL(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fWeight, fIsExtended, fNEffPoints);
+#endif
+   }
+
+   // for derivatives
+   virtual double  DoDerivative(const double * x, unsigned int icoord ) const {
+      Gradient(x, &fGrad[0]);
+      return fGrad[icoord];
+   }
+
+
+      //data member
+   bool fIsExtended;  // flag for indicating if likelihood is extended
+   int  fWeight;  // flag to indicate if needs to evaluate using weight or weight squared (default weight = 0)
+
+
+   mutable unsigned int fNEffPoints;  // number of effective points used in the fit
+
+   mutable std::vector<double> fGrad; // for derivatives
+
+
+};
+
+      // define useful typedef's
+      typedef LogLikelihoodFCN<BA_ROOT::Math::IMultiGenFunction>  LogLikelihoodFunction;
+      typedef LogLikelihoodFCN<BA_ROOT::Math::IMultiGradFunction> LogLikelihoodGradFunction;
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_LogLikelihoodFCN */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/ParameterSettings.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/ParameterSettings.h
new file mode 100644
index 0000000..747fe5f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/ParameterSettings.h
@@ -0,0 +1,213 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Thu Sep 21 16:21:48 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class ParameterSettings
+
+#ifndef ROOT_Fit_ParameterSettings
+#define ROOT_Fit_ParameterSettings
+
+#include <string>
+
+#ifndef ROOT_Math_Error
+#include "Math/Error.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+//___________________________________________________________________________________
+/**
+   Class, describing value, limits and step size of the parameters
+   Provides functionality also to set/retrieve values, step sizes, limits and fix the
+   parameters.
+
+   To be done: add constraints (equality and inequality) as functions of the parameters
+
+   @ingroup FitMain
+*/
+class ParameterSettings {
+
+public:
+
+   /**
+      Default constructor
+   */
+   ParameterSettings () :
+    fValue(0.), fStepSize(0.1), fFix(false),
+    fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
+    fName("")
+   {}
+
+
+  ///constructor for unlimited named Parameter
+   ParameterSettings(const std::string & name, double val, double err) :
+    fValue(val), fStepSize(err), fFix(false),
+    fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
+    fName(name)
+   {}
+
+   ///constructor for double limited Parameter
+   ParameterSettings(const std::string &  name, double val, double err,
+                     double min, double max) :
+      fValue(val), fStepSize(err), fFix(false),
+      fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
+      fName(name)
+   {
+      SetLimits(min,max);
+   }
+
+   ///constructor for fixed Parameter
+   ParameterSettings(const std::string &  name, double val) :
+    fValue(val), fStepSize(0), fFix(true),
+    fLowerLimit(0.), fUpperLimit(0.), fHasLowerLimit(false), fHasUpperLimit(false),
+    fName(name)
+   {}
+
+
+
+
+   /// set value and name (unlimited parameter)
+   void Set(const std::string & name, double value, double step) {
+      SetName(name);
+      SetValue(value);
+      SetStepSize(step);
+   }
+
+   /// set a limited parameter
+   void Set(const std::string & name, double value, double step, double lower, double upper ) {
+      SetName(name);
+      SetValue(value);
+      SetStepSize(step);
+      SetLimits(lower,upper);
+   }
+
+   /// set a fixed parameter
+   void Set(const std::string & name, double value) {
+      SetName(name);
+      SetValue(value);
+      Fix();
+   }
+
+
+   /**
+      Destructor (no operations)
+   */
+   ~ParameterSettings ()  {}
+
+   /// copy constructor and assignment operators (leave them to the compiler)
+
+public:
+
+   /// return parameter value
+   double Value() const { return fValue; }
+   /// return step size
+   double StepSize() const { return fStepSize; }
+   /// return lower limit value
+   double LowerLimit() const {return fLowerLimit;}
+   /// return upper limit value
+   double UpperLimit() const {return fUpperLimit;}
+   /// check if is fixed
+   bool IsFixed() const { return fFix; }
+   /// check if parameter has lower limit
+   bool HasLowerLimit() const {return fHasLowerLimit; }
+   /// check if parameter has upper limit
+   bool HasUpperLimit() const {return fHasUpperLimit; }
+   /// check if is bound
+   bool IsBound() const {   return fHasLowerLimit || fHasUpperLimit;  }
+   /// check if is double bound (upper AND lower limit)
+   bool IsDoubleBound() const { return fHasLowerLimit && fHasUpperLimit;  }
+   /// return name
+   const std::string & Name() const { return fName; }
+
+   /** interaction **/
+
+   /// set name
+   void SetName(const std::string & name ) { fName = name; }
+
+   /// fix  the parameter
+   void Fix() {fFix = true;}
+   /// release the parameter
+   void Release() {fFix = false;}
+   /// set the value
+   void SetValue(double val) {fValue = val;}
+   /// set the step size
+   void SetStepSize(double err) {fStepSize = err;}
+   /// set a double side limit,
+   /// if low == up the parameter is fixed  if low > up the limits are removed
+   void SetLimits(double low, double up) {
+
+      if ( low > up ) {
+         RemoveLimits();
+         return;
+      }
+      if (low == up && low == fValue) {
+         Fix();
+         return;
+      }
+      if (low > fValue || up < fValue) {
+         MATH_INFO_MSG("ParameterSettings","lower/upper bounds outside current parameter value. The value will be set to (low+up)/2 ");
+         fValue = 0.5 * (up+low);
+      }
+      fLowerLimit = low;
+      fUpperLimit = up;
+      fHasLowerLimit = true;
+      fHasUpperLimit = true;
+   }
+   /// set a single upper limit
+   void SetUpperLimit(double up) {
+    fLowerLimit = 0.;
+    fUpperLimit = up;
+    fHasLowerLimit = false;
+    fHasUpperLimit = true;
+   }
+   /// set a single lower limit
+   void SetLowerLimit(double low) {
+      fLowerLimit = low;
+      fUpperLimit = 0.;
+      fHasLowerLimit = true;
+      fHasUpperLimit = false;
+   }
+
+   /// remove all limit
+   void RemoveLimits() {
+      fLowerLimit = 0.;
+      fUpperLimit = 0.;
+      fHasLowerLimit = false;
+      fHasUpperLimit = false;
+   }
+
+
+
+protected:
+
+
+private:
+
+   double fValue;        // parameter value
+   double fStepSize;     // parameter step size (used by minimizer)
+   bool fFix;            // flag to control if parameter is fixed
+   double fLowerLimit;   // lower parameter limit
+   double fUpperLimit;   // upper parameter limit
+   bool fHasLowerLimit;  // flag to control lower parameter limit
+   bool fHasUpperLimit;  // flag to control upper parameter limit
+
+   std::string fName;    // parameter name
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_ParameterSettings */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/PoissonLikelihoodFCN.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/PoissonLikelihoodFCN.h
new file mode 100644
index 0000000..1f9d04a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/PoissonLikelihoodFCN.h
@@ -0,0 +1,199 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Fri Aug 17 14:29:24 2007
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2007  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class PoissonLikelihoodFCN
+
+#ifndef ROOT_Fit_PoissonLikelihoodFCN
+#define ROOT_Fit_PoissonLikelihoodFCN
+
+#ifndef ROOT_Fit_BasicFCN
+#include "Fit/BasicFCN.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunction
+#include "Math/IParamFunction.h"
+#endif
+
+#ifndef ROOT_Fit_BinData
+#include "Fit/BinData.h"
+#endif
+
+#ifndef ROOT_Fit_FitUtil
+#include "Fit/FitUtil.h"
+#endif
+
+
+#include <memory>
+
+//#define PARALLEL
+// #ifdef PARALLEL
+// #ifndef ROOT_Fit_FitUtilParallel
+// #include "Fit/FitUtilParallel.h"
+// #endif
+// #endif
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+//___________________________________________________________________________________
+/**
+   class evaluating the log likelihood
+   for binned Poisson likelihood fits
+   it is template to distinguish gradient and non-gradient case
+
+   @ingroup  FitMethodFunc
+*/
+template<class FunType>
+class PoissonLikelihoodFCN : public BasicFCN<FunType,BinData>  {
+
+public:
+
+   typedef  BasicFCN<FunType,BinData> BaseFCN; 
+
+   typedef  ::BA_ROOT::Math::BasicFitMethodFunction<FunType> BaseObjFunction;
+   typedef typename  BaseObjFunction::BaseFunction BaseFunction;
+
+   typedef  ::BA_ROOT::Math::IParamMultiFunction IModelFunction;
+
+
+   /**
+      Constructor from unbin data set and model function (pdf)
+   */
+   PoissonLikelihoodFCN (const std::shared_ptr<BinData> & data, const std::shared_ptr<IModelFunction> & func, int weight = 0, bool extended = true ) :
+      BaseFCN( data, func),
+      fIsExtended(extended),
+      fWeight(weight),
+      fNEffPoints(0),
+      fGrad ( std::vector<double> ( func->NPar() ) )
+   { }
+
+   /**
+      Constructor from unbin data set and model function (pdf) managed by the users
+   */
+   PoissonLikelihoodFCN (const BinData & data, const IModelFunction & func, int weight = 0, bool extended = true ) :
+      BaseFCN(std::shared_ptr<BinData>(const_cast<BinData*>(&data), DummyDeleter<BinData>()), std::shared_ptr<IModelFunction>(dynamic_cast<IModelFunction*>(func.Clone() ) ) ),
+      fIsExtended(extended),
+      fWeight(weight),
+      fNEffPoints(0),
+      fGrad ( std::vector<double> ( func.NPar() ) )
+   { }
+
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~PoissonLikelihoodFCN () {}
+
+   /**
+      Copy constructor
+   */
+   PoissonLikelihoodFCN(const PoissonLikelihoodFCN & f) :
+      BaseFCN(f.DataPtr(), f.ModelFunctionPtr() ),
+      fIsExtended(f.fIsExtended ),
+      fWeight( f.fWeight ),
+      fNEffPoints( f.fNEffPoints ),
+      fGrad( f.fGrad)
+   {  }
+
+   /**
+      Assignment operator
+   */
+   PoissonLikelihoodFCN & operator = (const PoissonLikelihoodFCN & rhs) {
+      SetData(rhs.DataPtr() );
+      SetModelFunction(rhs.ModelFunctionPtr() );
+      fNEffPoints = rhs.fNEffPoints;
+      fGrad = rhs.fGrad; 
+      fIsExtended = rhs.fIsExtended;
+      fWeight = rhs.fWeight; 
+   }
+
+
+   /// clone the function (need to return Base for Windows)
+   virtual BaseFunction * Clone() const { return new  PoissonLikelihoodFCN(*this); }
+
+   // effective points used in the fit
+   virtual unsigned int NFitPoints() const { return fNEffPoints; }
+
+   /// i-th likelihood element and its gradient
+   virtual double DataElement(const double * x, unsigned int i, double * g) const {
+      if (i==0) this->UpdateNCalls();
+      return FitUtil::EvaluatePoissonBinPdf(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
+   }
+
+   /// evaluate gradient
+   virtual void Gradient(const double *x, double *g) const {
+      // evaluate the chi2 gradient
+      FitUtil::EvaluatePoissonLogLGradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g );
+   }
+
+   /// get type of fit method function
+   virtual  typename BaseObjFunction::Type_t Type() const { return BaseObjFunction::kLogLikelihood; }
+
+   bool IsWeighted() const { return (fWeight != 0); }
+
+   // Use the weights in evaluating the likelihood
+   void UseSumOfWeights() {
+      if (fWeight == 0) return; // do nothing if it was not weighted
+      fWeight = 1;
+   }
+
+   // Use sum of the weight squared in evaluating the likelihood
+   // (this is needed for calculating the errors)
+   void UseSumOfWeightSquare(bool on = true) {
+      if (fWeight == 0) return; // do nothing if it was not weighted
+      if (on) fWeight = 2;
+      else fWeight = 1;
+   }
+
+
+protected:
+
+
+private:
+
+   /**
+      Evaluation of the  function (required by interface)
+    */
+   virtual double DoEval (const double * x) const {
+      this->UpdateNCalls();
+      return FitUtil::EvaluatePoissonLogL(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fWeight, fIsExtended, fNEffPoints);
+   }
+
+   // for derivatives
+   virtual double  DoDerivative(const double * x, unsigned int icoord ) const {
+      Gradient(x, &fGrad[0]);
+      return fGrad[icoord];
+   }
+
+
+      //data member
+
+   bool fIsExtended; // flag to indicate if is extended (when false is a Multinomial lieklihood), default is true
+   int fWeight;  // flag to indicate if needs to evaluate using weight or weight squared (default weight = 0)
+
+   mutable unsigned int fNEffPoints;  // number of effective points used in the fit
+   
+   mutable std::vector<double> fGrad; // for derivatives
+
+};
+
+      // define useful typedef's
+      typedef PoissonLikelihoodFCN<BA_ROOT::Math::IMultiGenFunction> PoissonLLFunction;
+      typedef PoissonLikelihoodFCN<BA_ROOT::Math::IMultiGradFunction> PoissonLLGradFunction;
+
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Fit_PoissonLikelihoodFCN */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/SparseData.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/SparseData.h
new file mode 100644
index 0000000..5f00738
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/SparseData.h
@@ -0,0 +1,76 @@
+// @(#)root/mathcore:$Id$
+// Author: David Gonzalez Maline Wed Aug 28 15:23:43 2009
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class SparseData
+
+#ifndef ROOT_Fit_SparseData
+#define ROOT_Fit_SparseData
+
+#include <vector>
+
+#ifndef ROOT_Fit_DataVector
+#include "Fit/DataVector.h"
+#endif
+#ifndef ROOT_Fit_BinData
+#include "Fit/BinData.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+      // This is a proxy to a std::list<Box>
+      class ProxyListBox;
+
+      class SparseData : public FitData  {
+      public:
+         //Constructor with a vector
+         SparseData(std::vector<double>& min, std::vector<double>& max);
+
+         //Constructor with a dimension and two arrays
+         SparseData(const unsigned int dim, double min[], double max[]);
+
+         //Destructor
+         ~SparseData();
+
+         //Returns the number of points stored
+         unsigned int NPoints() const;
+         //Returns the dimension of the object (bins)
+         unsigned int NDim() const;
+
+         // Adds a new bin specified by the vectors
+         void Add(std::vector<double>& min, std::vector<double>& max,
+                  const double content, const double error = 1.0);
+
+         void GetPoint(const unsigned int i,
+                       std::vector<double>& min, std::vector<double>&max,
+                       double& content, double& error);
+
+         // Debug method to print the list of bins stored
+         void PrintList() const;
+
+         // Transforms the data into a ROOT::Fit::BinData structure
+         void GetBinData(BinData&) const;
+         // Same as before, but with integral format
+         void GetBinDataIntegral(BinData&) const;
+         // Same as before, but including zero content bins
+         void GetBinDataNoZeros(BinData&) const;
+
+      private :
+         ProxyListBox *fList;
+      };
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Fit_SparseData */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Fit/UnBinData.h b/ThirdParty/Fit/RootMinimizers/inc/Fit/UnBinData.h
new file mode 100644
index 0000000..267a580
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Fit/UnBinData.h
@@ -0,0 +1,361 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Wed Aug 30 11:15:23 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class UnBinData
+
+#ifndef ROOT_Fit_UnBinData
+#define ROOT_Fit_UnBinData
+
+#ifndef ROOT_Fit_DataVector
+#include "Fit/DataVector.h"
+#endif
+
+#ifndef ROOT_Math_Error
+#include "Math/Error.h"
+#endif
+
+
+
+namespace BA_ROOT {
+
+   namespace Fit {
+
+
+//___________________________________________________________________________________
+/**
+   Class describing the unbinned data sets (just x coordinates values) of any dimensions
+
+              There is the option to construct UnBindata copying the data in (using the DataVector class)
+              or using pointer to external data (DataWrapper) class.
+              In general is found to be more efficient to copy the data.
+              In case of really large data sets for limiting memory consumption then the other option can be used
+              Specialized constructor exists for using external data up to 3 dimensions.
+
+              When the data are copying in the number of points can be set later (or re-set) using Initialize and
+              the data are inserted one by one using the Add method.
+              It is mandatory to set the size before using the Add method.
+
+             @ingroup  FitData
+*/
+class UnBinData : public FitData {
+
+public :
+
+   /**
+      constructor from dimension of point  and max number of points (to pre-allocate vector)
+    */
+
+   explicit UnBinData(unsigned int maxpoints = 0, unsigned int dim = 1, bool isWeighted = false );
+
+
+   /**
+      constructor from range and default option
+    */
+   explicit UnBinData (const DataRange & range,  unsigned int maxpoints = 0, unsigned int dim = 1, bool isWeighted = false);
+
+   /**
+      constructor from options and range
+    */
+   UnBinData (const DataOptions & opt, const DataRange & range,  unsigned int maxpoints = 0, unsigned int dim = 1,  bool isWeighted = false );
+
+   /**
+      constructor for 1D external data (data are not copied inside)
+    */
+   UnBinData(unsigned int n, const double * dataX );
+
+   /**
+      constructor for 2D external data (data are not copied inside)
+      or 1D data with a weight (if isWeighted = true)
+    */
+   UnBinData(unsigned int n, const double * dataX, const double * dataY, bool isWeighted = false );
+
+   /**
+      constructor for 3D external data (data are not copied inside)
+      or 2D data with a weight (if isWeighted = true)
+    */
+   UnBinData(unsigned int n, const double * dataX, const double * dataY, const double * dataZ, bool isWeighted = false );
+
+   /**
+      constructor for multi-dim external data (data are not copied inside)
+      Uses as argument an iterator of a list (or vector) containing the const double * of the data
+      An example could be the std::vector<const double *>::begin
+      In case of weighted data, the external data must have a dim+1 lists of data
+      The apssed dim refers just to the coordinate size
+    */
+   template<class Iterator>
+   UnBinData(unsigned int n, unsigned int dim, Iterator dataItr, bool isWeighted = false ) :
+      FitData( ),
+      fDim(dim),
+      fPointSize( (isWeighted) ? dim +1 : dim),
+      fNPoints(n),
+      fDataVector(0)
+   {
+      fDataWrapper = new DataWrapper(fPointSize, dataItr);
+   }
+
+   /**
+      constructor for 1D data and a range (data are copied inside according to the given range)
+    */
+   UnBinData(unsigned int maxpoints, const double * dataX, const DataRange & range);
+
+   /**
+      constructor for 2D data and a range (data are copied inside according to the given range)
+      or 1 1D data set + weight. If is weighted  dataY is the pointer to the list of the weights
+    */
+   UnBinData(unsigned int maxpoints, const double * dataX, const double * dataY, const DataRange & range, bool isWeighted = false);
+
+   /**
+      constructor for 3D data and a range (data are copied inside according to the given range)
+      or a 2D data set + weights. If is weighted  dataZ is the pointer to the list of the weights
+    */
+   UnBinData(unsigned int maxpoints, const double * dataX, const double * dataY, const double * dataZ, const DataRange & range, bool isWeighted = false);
+
+   /**
+      constructor for multi-dim external data and a range (data are copied inside according to the range)
+      Uses as argument an iterator of a list (or vector) containing the const double * of the data
+      An example could be the std::vector<const double *>::begin
+    */
+   template<class Iterator>
+   UnBinData(unsigned int maxpoints, unsigned int dim, Iterator dataItr, const DataRange & range, bool isWeighted = false ) :
+      FitData( ),
+      fDim(dim),
+      fPointSize( (isWeighted) ? dim +1 : dim),
+      fNPoints(0),
+      fDataVector(0),
+      fDataWrapper(0)
+   {
+      unsigned int n = fPointSize*maxpoints;
+      if ( n > MaxSize() ) {
+         MATH_ERROR_MSGVAL("UnBinData","Invalid data size n - no allocation done", n );
+      }
+      else if (n > 0) {
+         fDataVector = new DataVector(n);
+
+         // use data wrapper to get the data
+         BA_ROOT::Fit::DataWrapper wdata(fPointSize, dataItr);
+         for (unsigned int i = 0; i < maxpoints; ++i) {
+            bool isInside = true;
+            for (unsigned int icoord = 0; icoord < dim; ++icoord)
+               isInside &= range.IsInside( wdata.Coords(i)[icoord], icoord );
+            // treat here the weight as an extra coordinate
+            if ( isInside ) Add(wdata.Coords(i));
+         }
+         if (fNPoints < maxpoints) (fDataVector->Data()).resize(fPointSize*fNPoints);
+      }
+   }
+
+
+private:
+   /// copy constructor (private)
+   UnBinData(const UnBinData &) : FitData() {}
+   /// assignment operator  (private)
+   UnBinData & operator= (const UnBinData &) { return *this; }
+
+public:
+
+#ifdef LATER
+   /**
+      Create from a compatible UnBinData set
+    */
+
+   UnBinData (const UnBinData & data , const DataOptions & opt, const DataRange & range) :
+      DataVector(opt,range, data.DataSize() ),
+      fDim(data.fDim),
+      fPointSize(data.fPointSize),
+      fNPoints(data.fNPoints)
+   {
+//       for (Iterator itr = begin; itr != end; ++itr)
+//          if (itr->IsInRange(range) )
+//             Add(*itr);
+   }
+#endif
+
+   /**
+      destructor, delete pointer to internal data or external data wrapper
+    */
+   virtual ~UnBinData() {
+      if (fDataVector) delete fDataVector;
+      if (fDataWrapper) delete fDataWrapper;
+   }
+
+   /**
+      preallocate a data set given size and dimension of the coordinates
+      if a vector already exists with correct dimension (point size) extend the existing one
+      to a total size of maxpoints (equivalent to a Resize)
+    */
+   void Initialize(unsigned int maxpoints, unsigned int dim = 1, bool isWeighted = false);
+
+
+   /**
+      add one dim coordinate data (unweighted)
+   */
+   void Add(double x) {
+      int index = fNPoints*PointSize();
+      assert(fDataVector != 0);
+      assert(PointSize() == 1);
+      assert (index + PointSize() <= DataSize() );
+
+      (fDataVector->Data())[ index ] = x;
+
+      fNPoints++;
+   }
+
+
+   /**
+      add 2-dim coordinate data
+      can also be used to add 1-dim data with a weight
+   */
+   void Add(double x, double y) {
+      int index = fNPoints*PointSize();
+      assert(fDataVector != 0);
+      assert(PointSize() == 2);
+      assert (index + PointSize() <= DataSize() );
+
+      (fDataVector->Data())[ index ] = x;
+      (fDataVector->Data())[ index+1 ] = y;
+
+      fNPoints++;
+   }
+
+   /**
+      add 3-dim coordinate data
+      can also be used to add 2-dim data with a weight
+   */
+   void Add(double x, double y, double z) {
+      int index = fNPoints*PointSize();
+      assert(fDataVector != 0);
+      assert(PointSize() == 3);
+      assert (index + PointSize() <= DataSize() );
+
+      (fDataVector->Data())[ index ] = x;
+      (fDataVector->Data())[ index+1 ] = y;
+      (fDataVector->Data())[ index+2 ] = z;
+
+      fNPoints++;
+   }
+
+   /**
+      add multi-dim coordinate data
+   */
+   void Add(const double *x) {
+      int index = fNPoints*fPointSize;
+
+      assert(fDataVector != 0);
+      assert (index + PointSize() <= DataSize() );
+
+      double * itr = &( (fDataVector->Data()) [ index ]);
+
+      for (unsigned int i = 0; i < fDim; ++i)
+         *itr++ = x[i];
+
+      fNPoints++;
+   }
+
+   /**
+      add multi-dim coordinate data + weight
+   */
+   void Add(const double *x, double w) {
+      int index = fNPoints*fPointSize;
+
+      assert(fDataVector != 0);
+      assert (index + PointSize() <= DataSize() );
+
+      double * itr = &( (fDataVector->Data()) [ index ]);
+
+      for (unsigned int i = 0; i < fDim; ++i)
+         *itr++ = x[i];
+      *itr = w;
+
+      fNPoints++;
+   }
+
+   /**
+      return pointer to coordinate data
+    */
+   const double * Coords(unsigned int ipoint) const {
+      if (fDataVector)
+         return &( (fDataVector->Data()) [ ipoint*fPointSize ] );
+      else
+         return fDataWrapper->Coords(ipoint);
+   }
+
+   bool IsWeighted() const {
+      return (fPointSize == fDim+1);
+   }
+
+   double Weight(unsigned int ipoint) const {
+      if (fPointSize == fDim) return 1;
+      if (fDataVector )
+         return  (fDataVector->Data()) [ ipoint*fPointSize + 1 ] ;
+      else
+         return 0; // weights are not supported for wrapper data sets
+   }
+
+
+   /**
+      resize the vector to the given npoints
+    */
+   void Resize (unsigned int npoints);
+
+
+   /**
+      return number of contained points
+    */
+   unsigned int NPoints() const { return fNPoints; }
+
+   /**
+      return number of contained points
+    */
+   unsigned int Size() const { return fNPoints; }
+
+   /**
+      return coordinate data dimension
+    */
+   unsigned int NDim() const { return fDim; }
+
+   /**
+      return  point size. For unweighted data is equivalent to coordinate dimension,
+      for weighted data is NDim()+1
+    */
+   unsigned int PointSize() const {
+      return fPointSize;
+   }
+
+   /**
+      return size of internal data vector (is 0 for external data)
+    */
+   unsigned int DataSize() const {
+      return (fDataVector) ? fDataVector->Size() : 0;
+   }
+
+
+protected:
+
+   void SetNPoints(unsigned int n) { fNPoints = n; }
+
+private:
+
+   unsigned int fDim;         // coordinate data dimension
+   unsigned int fPointSize;    // poit size dimension (coordinate + weight)
+   unsigned int fNPoints;     // numer of fit points
+
+   DataVector * fDataVector;     // pointer to internal data vector (null for external data)
+   DataWrapper * fDataWrapper;   // pointer to structure wrapping external data (null when data are copied in)
+
+};
+
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Fit_UnBinData */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/BasicMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Math/BasicMinimizer.h
new file mode 100644
index 0000000..a6a4173
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/BasicMinimizer.h
@@ -0,0 +1,207 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Oct 2012
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+
+// Header file for class BasicMinimizer
+
+#ifndef ROOT_Math_BasicMinimizer
+#define ROOT_Math_BasicMinimizer
+
+#ifndef ROOT_Math_Minimizer
+#include "Math/Minimizer.h"
+#endif
+
+
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_MinimTransformVariable
+#include "Math/MinimTransformVariable.h"
+#endif
+
+
+#include <vector>
+#include <map>
+#include <string>
+
+
+
+namespace BA_ROOT {
+
+namespace Math {
+
+   class MinimTransformFunction;
+
+
+
+//_______________________________________________________________________________
+/**
+   Base Minimizer class, which defines the basic funcionality of various minimizer
+   implementations (apart from Minuit and Minuit2)
+   It provides support for storing parameter values, step size,
+   parameter transofrmation etc.. in case real minimizer impelmentations do not provide
+   such functionality.
+   This is an internal class and should not be used directly by the user
+
+   @ingroup MultiMin
+*/
+
+
+class BasicMinimizer : public BA_ROOT::Math::Minimizer {
+
+public:
+
+   /**
+      Default constructor
+   */
+   BasicMinimizer ( );
+
+
+   /**
+      Destructor
+   */
+   virtual ~BasicMinimizer ();
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /**
+      Copy constructor
+   */
+   BasicMinimizer(const BasicMinimizer &) : Minimizer() {}
+
+   /**
+      Assignment operator
+   */
+   BasicMinimizer & operator = (const BasicMinimizer & rhs) {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+public:
+
+   /// set the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGenFunction & func);
+
+   /// set gradient the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGradFunction & func);
+
+   /// set free variable
+   virtual bool SetVariable(unsigned int ivar, const std::string & name, double val, double step);
+
+
+   /// set lower limit variable  (override if minimizer supports them )
+   virtual bool SetLowerLimitedVariable(unsigned int  ivar , const std::string & name , double val , double step , double lower );
+   /// set upper limit variable (override if minimizer supports them )
+   virtual bool SetUpperLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double upper );
+   /// set upper/lower limited variable (override if minimizer supports them )
+   virtual bool SetLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double /* lower */, double /* upper */);
+   /// set fixed variable (override if minimizer supports them )
+   virtual bool SetFixedVariable(unsigned int /* ivar */, const std::string & /* name */, double /* val */);
+   /// set the value of an existing variable
+   virtual bool SetVariableValue(unsigned int ivar, double val );
+   /// set the values of all existing variables (array must be dimensioned to the size of existing parameters)
+   virtual bool SetVariableValues(const double * x);
+   /// set the step size of an already existing variable
+   virtual bool SetVariableStepSize(unsigned int ivar, double step );
+   /// set the lower-limit of an already existing variable
+   virtual bool SetVariableLowerLimit(unsigned int ivar, double lower);
+   /// set the upper-limit of an already existing variable
+   virtual bool SetVariableUpperLimit(unsigned int ivar, double upper);
+   /// set the limits of an already existing variable
+   virtual bool SetVariableLimits(unsigned int ivar, double lower, double upper);
+   /// fix an existing variable
+   virtual bool FixVariable(unsigned int ivar);
+   /// release an existing variable
+   virtual bool ReleaseVariable(unsigned int ivar);
+   /// query if an existing variable is fixed (i.e. considered constant in the minimization)
+   /// note that by default all variables are not fixed
+   virtual bool IsFixedVariable(unsigned int ivar)  const;
+   /// get variable settings in a variable object (like ROOT::Fit::ParamsSettings)
+   virtual bool GetVariableSettings(unsigned int ivar, BA_ROOT::Fit::ParameterSettings & varObj) const;
+   /// get name of variables (override if minimizer support storing of variable names)
+   virtual std::string VariableName(unsigned int ivar) const;
+   /// get index of variable given a variable given a name
+   /// return -1 if variable is not found
+   virtual int VariableIndex(const std::string & name) const;
+
+   /// method to perform the minimization
+   virtual  bool Minimize();
+
+   /// return minimum function value
+   virtual double MinValue() const { return fMinVal; }
+
+   /// return  pointer to X values at the minimum
+   virtual const double *  X() const { return &fValues.front(); }
+
+   /// number of dimensions
+   virtual unsigned int NDim() const { return fDim; }
+
+   /// number of free variables (real dimension of the problem)
+   virtual unsigned int NFree() const;
+
+   /// total number of parameter defined
+   virtual unsigned int NPar() const { return fValues.size(); }
+
+   /// return pointer to used objective function
+   const BA_ROOT::Math::IMultiGenFunction * ObjFunction() const { return fObjFunc; }
+
+   /// return pointer to used gradient object function  (NULL if gradient is not supported)
+   const BA_ROOT::Math::IMultiGradFunction * GradObjFunction() const;
+
+   /// return transformation function (NULL if not having a transformation)
+   const BA_ROOT::Math::MinimTransformFunction * TransformFunction() const;
+
+   /// print result of minimization
+   void PrintResult() const;
+
+   /// accessor methods
+   virtual const double * StepSizes() const { return &fSteps.front(); }
+
+protected:
+
+   bool CheckDimension() const;
+
+   bool CheckObjFunction() const;
+
+   MinimTransformFunction * CreateTransformation(std::vector<double> & startValues, const BA_ROOT::Math::IMultiGradFunction * func = 0);
+
+   void SetFinalValues(const double * x);
+
+   void SetMinValue(double val) { fMinVal = val; }
+
+private:
+
+   // dimension of the function to be minimized
+   unsigned int fDim;
+
+   const BA_ROOT::Math::IMultiGenFunction * fObjFunc;
+
+   double fMinVal;
+   std::vector<double> fValues;
+   std::vector<double> fSteps;
+   std::vector<std::string> fNames;
+   std::vector<BA_ROOT::Math::EMinimVariableType> fVarTypes;  // vector specifyng the type of variables
+   std::map< unsigned int, std::pair<double, double> > fBounds; // map specifying the bound using as key the parameter index
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Math_BasicMinimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/Derivator.h b/ThirdParty/Fit/RootMinimizers/inc/Math/Derivator.h
new file mode 100644
index 0000000..b56445d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/Derivator.h
@@ -0,0 +1,247 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class Derivator
+//
+// class for calculating Derivative of functions
+//
+// Created by: moneta  at Sat Nov 13 14:46:00 2004
+//
+// Last update: Sat Nov 13 14:46:00 2004
+//
+#ifndef ROOT_Math_Derivator
+#define ROOT_Math_Derivator
+
+
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+class GSLDerivator;
+
+//_______________________________________________________________________
+/**
+    Class for computing numerical derivative of a function.
+    Presently this class is implemented only using the numerical derivatives
+    algorithms provided by GSL
+    using the implementation class ROOT::Math::GSLDerivator
+
+    This class does not support copying
+
+    @ingroup Deriv
+*/
+
+class Derivator {
+
+public:
+
+   /**
+      signature for function pointers used by GSL
+   */
+   typedef double ( * GSLFuncPointer ) ( double, void * );
+
+   /**
+      Empty Construct for a Derivator class
+      Need to set the function afterwards with Derivator::SetFunction
+   */
+   Derivator();
+   /**
+      Construct using a ROOT::Math::IGenFunction interface
+    */
+   explicit Derivator(const IGenFunction &f);
+   /**
+      Construct using a GSL function pointer type
+       @param f :  free function pointer of the GSL required type
+       @param p :  pointer to the object carrying the function state
+                    (for example the function object itself)
+    */
+   explicit Derivator(const GSLFuncPointer &f, void * p = 0);
+
+   /// destructor
+   virtual ~Derivator();
+
+   // disable copying
+private:
+
+   Derivator(const Derivator &);
+   Derivator & operator = (const Derivator &);
+
+public:
+
+
+#ifdef LATER
+   /**
+       Template methods for generic functions
+       Set the function f for evaluating the derivative.
+       The function type must implement the assigment operator,
+       <em>  double  operator() (  double  x ) </em>
+   */
+   template <class UserFunc>
+   inline void SetFunction(const UserFunc &f) {
+      const void * p = &f;
+      SetFunction(  &GSLFunctionAdapter<UserFunc>::F, const_cast<void *>(p) );
+   }
+#endif
+
+   /**
+      Set the function for calculating the derivatives.
+      The function must implement the ROOT::Math::IGenFunction signature
+   */
+   void SetFunction(const IGenFunction &f);
+
+
+   /**
+       Set the function f for evaluating the derivative using a GSL function pointer type
+       @param f :  free function pointer of the GSL required type
+       @param p :  pointer to the object carrying the function state
+                    (for example the function object itself)
+   */
+   void SetFunction( const GSLFuncPointer &f, void * p = 0);
+
+
+
+   /**
+       Computes the numerical derivative of a function f at a point x.
+       It uses Derivator::EvalCentral to compute the derivative using an
+       adaptive central difference algorithm with a step size h
+   */
+
+   double Eval(double x, double h = 1E-8) const;
+
+
+
+   /**
+       Computes the numerical derivative at a point x using an adaptive central
+       difference algorithm with a step size h.
+   */
+   double EvalCentral( double x, double h = 1E-8) const;
+
+   /**
+       Computes the numerical derivative at a point x using an adaptive forward
+       difference algorithm with a step size h.
+       The function is evaluated only at points greater than x and at x itself.
+   */
+   double EvalForward( double x, double h = 1E-8) const;
+
+   /**
+       Computes the numerical derivative at a point x using an adaptive backward
+       difference algorithm with a step size h.
+       The function is evaluated only at points less than x and at x itself.
+   */
+   double EvalBackward( double x, double h = 1E-8) const;
+
+   /** @name --- Static methods ---
+       This methods don't require to use a Derivator object, and are designed to be used in
+       fast calculation. Error and status code cannot be retrieved in this case
+    */
+
+   /**
+       Computes the numerical derivative of a function f at a point x.
+       It uses Derivator::EvalCentral to compute the derivative using an
+       adaptive central difference algorithm with a step size h
+   */
+   static double Eval(const IGenFunction & f, double x, double h = 1E-8);
+
+   /**
+       Computes the numerical derivative of a function f at a point x using an adaptive central
+       difference algorithm with a step size h
+   */
+   static double EvalCentral(const IGenFunction & f, double x, double h = 1E-8);
+
+
+   /**
+       Computes the numerical derivative of a function f at a point x using an adaptive forward
+       difference algorithm with a step size h.
+       The function is evaluated only at points greater than x and at x itself
+   */
+   static double EvalForward(const IGenFunction & f, double x, double h = 1E-8);
+
+   /**
+       Computes the numerical derivative of a function f at a point x using an adaptive backward
+       difference algorithm with a step size h.
+       The function is evaluated only at points less than x and at x itself
+   */
+   static double EvalBackward(const IGenFunction & f, double x, double h = 1E-8);
+
+   // Derivatives for multi-dimension functions
+   /**
+      Evaluate the partial derivative of a multi-dim function
+      with respect coordinate x_icoord at the point x[]
+    */
+   static double Eval(const IMultiGenFunction & f, const double * x, unsigned int icoord = 0, double h = 1E-8);
+
+   /**
+      Evaluate the derivative with respect a parameter for one-dim parameteric function
+      at the point ( x,p[]) with respect the parameter p_ipar
+    */
+   static double Eval(IParamFunction & f, double x, const double * p, unsigned int ipar = 0, double h = 1E-8);
+
+   /**
+      Evaluate the derivative with respect a parameter for a multi-dim parameteric function
+      at the point ( x[],p[]) with respect the parameter p_ipar
+    */
+   static double Eval(IParamMultiFunction & f, const double * x, const double * p, unsigned int ipar = 0, double h = 1E-8);
+
+
+   /**
+      return the error status of the last derivative calculation
+   */
+   int Status() const;
+
+   /**
+      return  the result of the last derivative calculation
+   */
+   double Result() const;
+
+   /**
+      return the estimate of the absolute error of the last derivative calculation
+   */
+   double Error() const;
+
+
+private:
+
+
+   mutable GSLDerivator * fDerivator;
+
+};
+
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+
+#endif /* ROOT_Math_Derivator */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/Error.h b/ThirdParty/Fit/RootMinimizers/inc/Math/Error.h
new file mode 100644
index 0000000..ade5f84
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/Error.h
@@ -0,0 +1,121 @@
+// @(#)root/mathcore:$Id$
+// Authors: L. Moneta
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2007 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Math_Error
+#define ROOT_Math_Error
+
+
+
+
+#ifdef DEBUG
+#ifndef WARNINGMSG
+#define WARNINGMSG
+#endif
+#endif
+
+
+
+/** 
+   Pre-processor macro to report messages 
+   which can be configured to use ROOT error or 
+   simply an iostream in case of stan-alone builds
+*/
+
+#ifndef USE_ROOT_ERROR
+
+// use iostream instead of ROOT 
+
+#include <iostream>
+
+#ifndef ROOT_MATH_LOG
+#define ROOT_MATH_OS std::cerr
+#else 
+#define ROOT_MATH_LOG
+#endif
+
+// giving a location + string
+
+#define MATH_INFO_MSG(loc,str)                   \
+   ROOT_MATH_OS << "Info in ROOT::Math::" << loc << ">: "  << str \
+       << std::endl;
+#define MATH_WARN_MSG(loc,str)                      \
+   ROOT_MATH_OS << "Warning in ROOT::Math::" << loc << ">: " << str \
+       << std::endl;
+#define MATH_ERROR_MSG(loc,str)                   \
+   ROOT_MATH_OS << "Error in ROOT::Math::" << loc << ">: " << str \
+       << std::endl;
+
+// giving location +  a value
+
+# define MATH_INFO_VAL(loc,x)                                           \
+   ROOT_MATH_OS << "Info in <ROOT::Math::" << loc << ">: " << #x << " = " << (x) << std::endl; 
+# define MATH_WARN_VAL(loc,x)                                           \
+   ROOT_MATH_OS << "Warning in ROOT::Math::" << loc << ">: " << #x << " = " << (x) << std::endl; 
+# define MATH_ERROR_VAL(loc,x)                                          \
+   ROOT_MATH_OS << "Error in ROOT::Math::" << loc << ">: " << #x << " = " << (x) << std::endl; 
+
+// giving a location + string + value
+
+# define MATH_INFO_MSGVAL(loc,str,x)                                    \
+   ROOT_MATH_OS << "Info in <ROOT::Math::" << loc << ">: "  << str << "; " << #x << " = " << (x) << std::endl; 
+# define MATH_WARN_MSGVAL(loc,str,x)                                    \
+   ROOT_MATH_OS << "Warning in ROOT::Math::" << loc << ">: " << str << "; " << #x << " = " << (x) << std::endl; 
+# define MATH_ERROR_MSGVAL(loc,str,x)                                   \
+   ROOT_MATH_OS << "Error in ROOT::Math::" << loc << ">: " << str << "; " << #x << " = " << (x) << std::endl; 
+
+
+#else
+// use ROOT error reporting system 
+
+#include "TError.h"
+#include "Math/Util.h"
+
+#define  MATH_INFO_MSG(loc,str)                 \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+      ::Info(sl.c_str(),"%s",str);}
+#define  MATH_WARN_MSG(loc,str)                 \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+      ::Warning(sl.c_str(),"%s",str);}
+#define  MATH_ERROR_MSG(loc,str)                \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+      ::Error(sl.c_str(),"%s",str);}
+
+# define MATH_INFO_VAL(loc,x)                                           \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+    std::string str = std::string(#x) + std::string(" = ") + ::ROOT::Math::Util::ToString(x); \
+   ::Info(sl.c_str(),"%s",str.c_str() );} 
+# define MATH_WARN_VAL(loc,x)                                           \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+    std::string str = std::string(#x) + std::string(" = ") + ::ROOT::Math::Util::ToString(x); \
+   ::Warning(sl.c_str(),"%s",str.c_str() );} 
+# define MATH_ERROR_VAL(loc,x)                                          \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+    std::string str = std::string(#x) + std::string(" = ") + ::ROOT::Math::Util::ToString(x); \
+   ::Error(sl.c_str(),"%s",str.c_str() );} 
+
+
+# define MATH_INFO_MSGVAL(loc,txt,x)                    \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+    std::string str = std::string(txt) + std::string("; ") + std::string(#x) + std::string(" = ") + ::ROOT::Math::Util::ToString(x); \
+   ::Info(sl.c_str(),"%s",str.c_str() );} 
+# define MATH_WARN_MSGVAL(loc,txt,x)                      \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+    std::string str = std::string(txt) + std::string("; ") + std::string(#x) + std::string(" = ") + ::ROOT::Math::Util::ToString(x); \
+   ::Warning(sl.c_str(),"%s",str.c_str() );} 
+# define MATH_ERROR_MSGVAL(loc,txt,x)                     \
+   {std::string sl = "ROOT::Math::" + std::string(loc); \
+    std::string str = std::string(txt) + std::string("; ") + std::string(#x) + std::string(" = ") + ::ROOT::Math::Util::ToString(x); \
+   ::Error(sl.c_str(),"%s",str.c_str() );} 
+
+
+
+#endif
+
+
+#endif  // ROOT_MATH_Error
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/FitMethodFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Math/FitMethodFunction.h
new file mode 100644
index 0000000..9305ad6
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/FitMethodFunction.h
@@ -0,0 +1,147 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Thu Aug 16 15:40:28 2007
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2007  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class FitMethodFunction
+
+#ifndef ROOT_Math_FitMethodFunction
+#define ROOT_Math_FitMethodFunction
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+
+// #ifndef ROOT_Math_IParamFunctionfwd
+// #include "Math/IParamFunctionfwd.h"
+// #endif
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+//______________________________________________________________________________________
+/**
+   FitMethodFunction class
+   Interface for objective functions (like chi2 and likelihood used in the fit)
+   In addition to normal function interface provide interface for calculating each
+   data contrinution to the function which is required by some algorithm (like Fumili)
+
+   @ingroup  FitMethodFunc
+*/
+template<class FunctionType>
+class BasicFitMethodFunction : public FunctionType {
+
+public:
+
+
+   typedef  typename FunctionType::BaseFunc BaseFunction;
+
+   /// enumeration specyfing the possible fit method types
+   enum Type_t { kUndefined , kLeastSquare, kLogLikelihood };
+
+
+   BasicFitMethodFunction(int dim, int npoint) :
+      fNDim(dim),
+      fNPoints(npoint),
+      fNCalls(0)
+   {}
+
+   /**
+      Virtual Destructor (no operations)
+   */
+   virtual ~BasicFitMethodFunction ()  {}
+
+   /**
+      Number of dimension (parameters) . From IGenMultiFunction interface
+    */
+   virtual unsigned int NDim() const { return fNDim; }
+
+   /**
+      method returning the data i-th contribution to the fit objective function
+      For example the residual for the least square functions or the pdf element for the
+      likelihood functions.
+      Estimating eventually also the gradient of the data element if the passed pointer  is not null
+    */
+   virtual double DataElement(const double *x, unsigned int i, double *g = 0) const = 0;
+
+
+   /**
+      return the number of data points used in evaluating the function
+    */
+   virtual unsigned int NPoints() const { return fNPoints; }
+
+   /**
+      return the type of method, override if needed
+    */
+   virtual Type_t Type() const { return kUndefined; }
+
+   /**
+      return the total number of function calls (overrided if needed)
+    */
+   virtual unsigned int NCalls() const { return fNCalls; }
+
+   /**
+      update number of calls
+    */
+   virtual void UpdateNCalls() const { fNCalls++; }
+
+   /**
+      reset number of function calls
+    */
+   virtual void ResetNCalls() { fNCalls = 0; }
+
+
+
+public:
+
+
+protected:
+
+
+private:
+
+   unsigned int fNDim;      // function dimension
+   unsigned int fNPoints;   // size of the data
+   mutable unsigned int fNCalls; // number of function calls
+
+
+};
+
+      // define the normal and gradient function
+      typedef BasicFitMethodFunction<BA_ROOT::Math::IMultiGenFunction>  FitMethodFunction;
+      typedef BasicFitMethodFunction<BA_ROOT::Math::IMultiGradFunction> FitMethodGradFunction;
+
+
+      // useful template definition to use these interface in
+      // generic programming
+      // (comment them out since they are not used anymore)
+/*
+      template<class FunType>
+      struct ParamFunctionTrait {
+         typedef  IParamMultiFunction PFType;
+      };
+
+      // specialization for the gradient param functions
+      template<>
+      struct ParamFunctionTrait<ROOT::Math::IMultiGradFunction>  {
+         typedef  IParamMultiGradFunction PFType;
+      };
+*/
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+
+
+
+
+#endif /* ROOT_Math_FitMethodFunction */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/Functor.h b/ThirdParty/Fit/RootMinimizers/inc/Math/Functor.h
new file mode 100644
index 0000000..876b627
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/Functor.h
@@ -0,0 +1,805 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Mon Nov 13 15:58:13 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Heaer file for Functor classes.
+// designed is inspired by the Loki Functor
+
+#ifndef ROOT_Math_Functor
+#define ROOT_Math_Functor
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+
+// #ifndef Root_Math_StaticCheck
+// #include "Math/StaticCheck.h"
+// #endif
+
+#include <memory>
+
+
+namespace BA_ROOT {
+
+namespace Math {
+
+/**
+   FunctorImpl is a base class for the functor
+   handler implementation class.
+   It defines the Copy operator used to clone the functor objects
+*/
+
+template<class IBaseFunc>
+class FunctorImpl : public IBaseFunc {
+
+public:
+
+   typedef IBaseFunc BaseFunc;
+
+
+   FunctorImpl() : IBaseFunc() { }
+
+   virtual ~FunctorImpl() {}
+
+   virtual FunctorImpl* Copy() const = 0;
+
+};
+
+/**
+   Functor Handler class is responsible for wrapping any other functor and pointer to
+   free C functions.
+   It can be created from any function implementing the correct signature
+   corresponding to the requested type
+   In the case of one dimension the function evaluation object must implement
+   double operator() (double x). If it implements a method:  double Derivative(double x)
+   can be used to create a Gradient function type.
+
+   In the case of multi-dimension the function evaluation object must implement
+   double operator()(const double *x). If it implements a method:
+   double Derivative(const double *x, int icoord)
+   can be used to create a Gradient function type.
+
+   @ingroup  Functor_int
+
+*/
+template<class ParentFunctor, class Func >
+class FunctorHandler : public ParentFunctor::Impl {
+
+   typedef typename ParentFunctor::Impl ImplFunc;
+   typedef typename ImplFunc::BaseFunc BaseFunc;
+   //typedef typename ParentFunctor::Dim Dim;
+
+
+public:
+
+   // constructor for 1d functions
+   FunctorHandler(const Func & fun) : fDim(1), fFunc(fun) {}
+
+
+   // constructor for multi-dimensional functions w/0 NDim()
+   FunctorHandler(unsigned int dim, const Func & fun ) :
+      fDim(dim),
+      fFunc(fun)
+   {}
+
+   virtual ~FunctorHandler() {}
+
+   // copy of the function handler (use copy-ctor)
+   ImplFunc * Copy() const {
+     return new FunctorHandler(*this);
+   }
+
+   // clone of the function handler (use copy-ctor)
+   BaseFunc * Clone() const {
+      return Copy();
+   }
+
+
+   // constructor for multi-dimensional functions
+   unsigned int NDim() const {
+      return fDim;
+   }
+
+private :
+
+   inline double DoEval (double x) const {
+      return fFunc(x);
+   }
+
+   inline double DoEval (const double * x) const {
+      return fFunc(x);
+   }
+
+   inline double DoDerivative (double x) const {
+      return fFunc.Derivative(x);
+   }
+
+   inline double DoDerivative (const double * x, unsigned int icoord ) const {
+      return fFunc.Derivative(x,icoord);
+   }
+
+
+   unsigned int fDim;
+   mutable Func fFunc;  // should here be a reference and pass a non-const ref in ctor
+
+};
+
+
+/**
+   Functor Handler class for gradient functions where both callable objects are provided for the function
+   evaluation (type Func) and for the gradient (type GradFunc) .
+   It can be created from any function implementing the correct signature
+   corresponding to the requested type
+   In the case of one dimension the function evaluation object and the derivative function object must implement
+   double operator() (double x).
+   In the case of multi-dimension the function evaluation object must implement
+   double operator() (const double * x) and the gradient function object must implement
+   double operator() (const double * x, int icoord)
+
+   @ingroup  Functor_int
+*/
+template<class ParentFunctor, class Func, class GradFunc  >
+class FunctorGradHandler : public ParentFunctor::Impl {
+
+   typedef typename ParentFunctor::Impl ImplFunc;
+   typedef typename ImplFunc::BaseFunc BaseFunc;
+   //typedef typename ParentFunctor::Dim Dim;
+
+public:
+
+   // constructor for 1d functions
+   FunctorGradHandler(const Func & fun, const GradFunc & gfun) :
+      fDim(1),
+      fFunc(fun),
+      fGradFunc(gfun)
+   {}
+
+
+   // constructor for multi-dimensional functions
+   FunctorGradHandler(unsigned int dim, const Func & fun, const GradFunc & gfun) :
+      fDim(dim),
+      fFunc(fun),
+      fGradFunc( gfun )
+   {}
+
+   virtual ~FunctorGradHandler() {}
+
+   // clone of the function handler (use copy-ctor)
+   ImplFunc * Copy() const { return new FunctorGradHandler(*this); }
+
+   // clone of the function handler (use copy-ctor)
+   BaseFunc * Clone() const { return Copy(); }
+
+   // constructor for multi-dimensional functions
+   unsigned int NDim() const {
+      return fDim;
+   }
+
+private :
+
+   inline double DoEval (double x) const {
+      return fFunc(x);
+   }
+
+   inline double DoEval (const double * x) const {
+      return fFunc(x);
+   }
+
+   inline double DoDerivative (double x) const {
+      return fGradFunc(x);
+   }
+
+   inline double DoDerivative (const double * x, unsigned int icoord ) const {
+      return fGradFunc(x, icoord);
+   }
+
+
+   unsigned int fDim;
+   mutable Func fFunc;
+   mutable GradFunc fGradFunc;
+
+};
+
+
+/**
+   Functor Handler to Wrap pointers to member functions
+   The member function type must be (XXX means any name is allowed) :
+   double XXX ( double x) for 1D functions
+   and
+   double XXXX (const double *x) for multi-dimensional functions
+
+   @ingroup  Functor_int
+*/
+template <class ParentFunctor, typename PointerToObj,
+          typename PointerToMemFn>
+class MemFunHandler : public ParentFunctor::Impl
+{
+   //typedef typename ParentFunctor::Dim Dim;
+   typedef typename ParentFunctor::Impl ImplFunc;
+   typedef typename ImplFunc::BaseFunc BaseFunc;
+
+public:
+
+   /// constructor from a pointer to the class and a pointer to the function
+   MemFunHandler(const PointerToObj& pObj, PointerToMemFn pMemFn)
+      : fDim(1), fObj(pObj), fMemFn(pMemFn)        // should pass pointer by value ??
+   {}
+
+   /// constructor from a pointer to the class and a pointer to the function
+   MemFunHandler(unsigned int dim, const PointerToObj& pObj, PointerToMemFn pMemFn)
+      : fDim(dim), fObj(pObj), fMemFn(pMemFn)
+   {}
+
+   virtual ~MemFunHandler() {}
+
+   // clone of the function handler (use copy-ctor)
+   ImplFunc * Copy() const { return new MemFunHandler(*this); }
+
+   // clone of the function handler (use copy-ctor)
+   BaseFunc * Clone() const { return new MemFunHandler(*this); }
+
+   // constructor for multi-dimensional functions
+   unsigned int NDim() const {
+      return fDim;
+   }
+
+private :
+
+   inline double DoEval (double x) const {
+      return ((*fObj).*fMemFn)(x);
+   }
+
+   inline double DoEval (const double * x) const {
+      return ((*fObj).*fMemFn)(x);
+   }
+
+   unsigned int fDim;
+   mutable PointerToObj fObj;
+   PointerToMemFn fMemFn;
+
+};
+
+/**
+   Functor Handler to Wrap pointers to member functions for the evaluation of the function
+   and the gradient.
+   The member function type must be (XXX means any name is allowed) :
+   double XXX ( double x) for 1D function and derivative evaluation
+   double XXX (const double *x) for multi-dimensional function evaluation and
+   double XXX (cost double *x, int icoord) for partial derivatives evaluation
+
+   @ingroup  Functor_int
+
+*/
+template <class ParentFunctor, typename PointerToObj,
+          typename PointerToMemFn, typename PointerToGradMemFn>
+class MemGradFunHandler : public ParentFunctor::Impl
+{
+   typedef typename ParentFunctor::Impl ImplFunc;
+   typedef typename ImplFunc::BaseFunc BaseFunc;
+   //typedef typename ParentFunctor::Dim Dim;
+
+public:
+
+   /// constructor from a pointer to the class and a pointer to the function
+   MemGradFunHandler(const PointerToObj& pObj, PointerToMemFn pMemFn, PointerToGradMemFn pGradMemFn)
+      : fDim(1),
+        fObj(pObj),
+        fMemFn(pMemFn),
+        fGradMemFn(pGradMemFn)
+   {}
+
+   /// constructor from a pointer to the class and a pointer to the function
+   MemGradFunHandler(unsigned int dim,
+                 const PointerToObj& pObj,
+                 PointerToMemFn pMemFn,
+                 PointerToGradMemFn pGradMemFn )
+      : fDim(dim),
+        fObj(pObj),
+        fMemFn(pMemFn),
+        fGradMemFn(pGradMemFn)
+   {}
+
+   virtual ~MemGradFunHandler() {}
+
+   // clone of the function handler (use copy-ctor)
+   ImplFunc * Copy() const { return new MemGradFunHandler(*this); }
+
+   // clone of the function handler (use copy-ctor)
+   BaseFunc * Clone() const { return new MemGradFunHandler(*this); }
+
+   // constructor for multi-dimensional functions
+   unsigned int NDim() const {
+      return fDim;
+   }
+
+private :
+
+   inline double DoEval (double x) const {
+      return ((*fObj).*fMemFn)(x);
+   }
+
+   inline double DoEval (const double * x) const {
+      return ((*fObj).*fMemFn)(x);
+   }
+
+   inline double DoDerivative (double x) const {
+      return ((*fObj).*fGradMemFn)(x);
+   }
+
+   inline double DoDerivative (const double * x, unsigned int icoord ) const {
+      return ((*fObj).*fGradMemFn)(x,icoord);
+   }
+
+   unsigned int fDim;
+   mutable PointerToObj fObj;
+   PointerToMemFn fMemFn;
+   PointerToGradMemFn fGradMemFn;
+};
+
+
+//****************************
+// LM 7/2/2014:  no needed this : make template ctor of Functor1D and GradFunctor1D not
+// available to CINT s
+//***************************************
+//#if defined(__MAKECINT__) || defined(G__DICTIONARY)
+// needed since CINT initialize it with TRootIOCtor
+//class TRootIOCtor;
+
+// template<class ParentFunctor>
+// class FunctorHandler<ParentFunctor,TRootIOCtor *> : public ParentFunctor::Impl
+// {
+// public:
+//    typedef typename ParentFunctor::Impl ImplFunc;
+//    typedef typename ImplFunc::BaseFunc BaseFunc;
+
+//    FunctorHandler(TRootIOCtor  *) {}
+//    // function required by interface
+//    virtual ~FunctorHandler() {}
+//    double DoEval (double ) const  { return 0; }
+//    double DoDerivative (double ) const  { return 0; }
+//    ImplFunc  * Copy() const {  return 0;  }
+//    BaseFunc  * Clone() const {  return 0;  }
+
+// };
+// #endif
+
+
+//_______________________________________________________________________________________________
+/**
+   Documentation for class Functor class.
+   It is used to wrap in a very simple and convenient way multi-dimensional function objects.
+   It can wrap all the following types:
+   <ul>
+   <li> any C++ callable object implemention double operator()( const double *  )
+   <li> a free C function of type double ()(const double * )
+   <li> a member function with the correct signature like Foo::Eval(const double * ).
+       In this case one pass the object pointer and a pointer to the member function (&Foo::Eval)
+   </ul>
+   The function dimension is required when constructing the functor.
+
+   @ingroup  GenFunc
+
+ */
+class Functor : public IBaseFunctionMultiDim  {
+
+
+public:
+
+   typedef FunctorImpl<IBaseFunctionMultiDim> Impl;
+   typedef IBaseFunctionMultiDim::BaseFunc ImplBase;
+
+   /**
+      Default constructor
+   */
+   Functor ()  : fImpl(0) {}
+
+
+   /**
+       construct from a pointer to member function (multi-dim type)
+    */
+   template <class PtrObj, typename MemFn>
+   Functor(const PtrObj& p, MemFn memFn, unsigned int dim )
+      : fImpl(new MemFunHandler<Functor, PtrObj, MemFn>(dim, p, memFn))
+   {}
+
+
+
+   /**
+      construct from a callable object of multi-dimension
+      with the right signature (implementing operator()(double *x)
+    */
+   template <typename Func>
+   Functor( const Func & f, unsigned int dim ) :
+      fImpl(new FunctorHandler<Functor,Func>(dim,f) )
+   {}
+
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~Functor ()  {}
+
+   /**
+      Copy constructor for functor based on ROOT::Math::IMultiGenFunction
+   */
+   Functor(const Functor & rhs) :
+      ImplBase()
+   {
+      if (rhs.fImpl.get() != 0)
+         fImpl = std::auto_ptr<Impl>( (rhs.fImpl)->Copy() );
+   }
+   // need a specialization in order to call base classes and use  clone
+
+
+   /**
+      Assignment operator
+   */
+   Functor & operator = (const Functor & rhs)  {
+      Functor copy(rhs);
+      // swap auto_ptr by hand
+      Impl * p = fImpl.release();
+      fImpl.reset(copy.fImpl.release());
+      copy.fImpl.reset(p);
+      return *this;
+   }
+
+
+   // clone of the function handler (use copy-ctor)
+   ImplBase * Clone() const { return new Functor(*this); }
+
+   // for multi-dimensional functions
+   unsigned int NDim() const { return fImpl->NDim(); }
+
+private :
+
+
+   inline double DoEval (const double * x) const {
+      return (*fImpl)(x);
+   }
+
+
+   std::auto_ptr<Impl> fImpl;   // pointer to base functor handler
+
+
+};
+
+//______________________________________________________________________________________
+/**
+   Functor1D class for one-dimensional functions.
+   It is used to wrap in a very simple and convenient way:
+   <ul>
+   <li> any C++ callable object implemention double operator()( double  )
+   <li> a free C function of type double ()(double )
+   <li> a member function with the correct signature like Foo::Eval(double ).
+       In this case one pass the object pointer and a pointer to the member function (&Foo::Eval)
+   </ul>
+
+
+   @ingroup  GenFunc
+
+ */
+
+class Functor1D : public IBaseFunctionOneDim  {
+
+
+public:
+
+   typedef FunctorImpl<IBaseFunctionOneDim>          Impl;
+   typedef IBaseFunctionOneDim::BaseFunc ImplBase;
+
+   /**
+      Default constructor
+   */
+   Functor1D ()  : fImpl(0) {}
+
+   /**
+      construct from a callable object with the right signature
+      implementing operator() (double x)
+    */
+   template <typename Func>
+   Functor1D(const Func & f) :
+      fImpl(new FunctorHandler<Functor1D,Func>(f) )
+   {}
+
+
+   /**
+       construct from a pointer to member function (1D type)
+    */
+   template <class PtrObj, typename MemFn>
+   Functor1D(const PtrObj& p, MemFn memFn)
+      : fImpl(new MemFunHandler<Functor1D, PtrObj, MemFn>(p, memFn))
+   {}
+
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~Functor1D ()  {}
+
+
+   /**
+      Copy constructor for Functor based on ROOT::Math::IGenFunction
+   */
+   Functor1D(const Functor1D & rhs) :
+      // strange that this is required eventhough ImplBase is an abstract class
+      ImplBase()
+   {
+      if (rhs.fImpl.get() != 0)
+         fImpl = std::auto_ptr<Impl>( (rhs.fImpl)->Copy() );
+   }
+
+
+   /**
+      Assignment operator
+   */
+   Functor1D & operator = (const Functor1D & rhs)  {
+      Functor1D copy(rhs);
+      // swap auto_ptr by hand
+      Impl * p = fImpl.release();
+      fImpl.reset(copy.fImpl.release());
+      copy.fImpl.reset(p);
+      return *this;
+   }
+
+
+   // clone of the function handler (use copy-ctor)
+   ImplBase * Clone() const { return new Functor1D(*this); }
+
+
+private :
+
+   inline double DoEval (double x) const {
+      return (*fImpl)(x);
+   }
+
+
+   std::auto_ptr<Impl> fImpl;   // pointer to base functor handler
+
+
+};
+
+//_______________________________________________________________________________________________
+/**
+   GradFunctor class for Multidimensional gradient functions.
+   It is used to wrap in a very C++ callable object to make gradient functions.
+   It can be constructed in three different way:
+   <ol>
+   <li> from an object implementing both
+        double operator()( const double * ) for the function evaluation  and
+        double Derivative(const double *, int icoord) for the partial derivatives
+    <li>from an object implementing any member function like Foo::XXX(const double *) for the function evaluation
+        and any member function like Foo::XXX(const double *, int icoord) for the partial derivatives
+    <li>from an function object implementing
+        double operator()( const double * ) for the function evaluation and another function object implementing
+        double operator() (const double *, int icoord) for the partial derivatives
+   </ol>
+   The function dimension is required when constructing the functor.
+
+   @ingroup  GenFunc
+
+ */
+class GradFunctor : public IGradientFunctionMultiDim  {
+
+
+public:
+
+   typedef FunctorImpl<IGradientFunctionMultiDim> Impl;
+   typedef IGradientFunctionMultiDim::BaseFunc ImplBase;
+
+
+   /**
+      Default constructor
+   */
+   GradFunctor ()  : fImpl(0) {}
+
+   /**
+      construct from a callable object of multi-dimension
+      implementing operator()(const double *x) and
+      Derivative(const double * x,icoord)
+    */
+   template <typename Func>
+   GradFunctor( const Func & f, unsigned int dim ) :
+      fImpl(new FunctorHandler<GradFunctor,Func>(dim,f) )
+   {}
+
+   /**
+       construct from a pointer to member function and member function types for function and derivative evaluations
+    */
+   template <class PtrObj, typename MemFn, typename GradMemFn>
+   GradFunctor(const PtrObj& p, MemFn memFn, GradMemFn gradFn, unsigned int dim )
+      : fImpl(new MemGradFunHandler<GradFunctor, PtrObj, MemFn, GradMemFn>(dim, p, memFn, gradFn))
+   {}
+
+   /**
+      construct for Gradient Functions of multi-dimension
+      Func gives the function evaluatiion, GradFunc the partial derivatives
+      The function dimension is  required
+    */
+   template <typename Func, typename GradFunc>
+   GradFunctor(const Func & f, const GradFunc & g, int dim  ) :
+      fImpl(new FunctorGradHandler<GradFunctor,Func,GradFunc>(dim, f, g) )
+   { }
+
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~GradFunctor ()  {}
+
+
+   /**
+      Copy constructor for functor based on ROOT::Math::IMultiGradFunction
+   */
+   GradFunctor(const GradFunctor & rhs) :
+      ImplBase()
+   {
+      if (rhs.fImpl.get() != 0)
+         fImpl = std::auto_ptr<Impl>( rhs.fImpl->Copy() );
+   }
+
+   /**
+      Assignment operator
+   */
+   GradFunctor & operator = (const GradFunctor & rhs)  {
+      GradFunctor copy(rhs);
+      // swap auto_ptr by hand
+      Impl * p = fImpl.release();
+      fImpl.reset(copy.fImpl.release());
+      copy.fImpl.reset(p);
+      return *this;
+   }
+
+
+   // clone of the function handler (use copy-ctor)
+   ImplBase * Clone() const { return new GradFunctor(*this); }
+
+   // for multi-dimensional functions
+   unsigned int NDim() const { return fImpl->NDim(); }
+
+private :
+
+
+   inline double DoEval (const double * x) const {
+      return (*fImpl)(x);
+   }
+
+
+   inline double DoDerivative (const double * x, unsigned int icoord  ) const {
+      return fImpl->Derivative(x,icoord);
+   }
+
+   std::auto_ptr<Impl> fImpl;    // pointer to base grad functor handler
+
+
+};
+
+
+//_______________________________________________________________________________________________
+/**
+   GradFunctor1D class for one-dimensional gradient functions.
+   It is used to wrap in a very C++ callable object to make a 1D gradient functions.
+   It can be constructed in three different way:
+   <ol>
+   <li> from an object implementing both
+        double operator()( double  ) for the function evaluation  and
+        double Derivative(double ) for the partial derivatives
+    <li>from an object implementing any member function like Foo::XXX(double ) for the function evaluation
+        and any other member function like Foo::YYY(double ) for the derivative.
+    <li>from an 2 function objects implementing
+        double operator()( double ) . One object provides the function evaluation, the other the derivative.
+   </ol>
+
+   @ingroup  GenFunc
+
+ */
+
+class GradFunctor1D : public IGradientFunctionOneDim  {
+
+
+public:
+
+   typedef FunctorImpl<IGradientFunctionOneDim>  Impl;
+   typedef IGradientFunctionOneDim::BaseFunc ImplBase;
+
+
+   /**
+      Default constructor
+   */
+   GradFunctor1D ()  : fImpl(0) {}
+
+
+   /**
+      construct from an object with the right signature
+      implementing both operator() (double x) and Derivative(double x)
+    */
+   template <typename Func>
+   GradFunctor1D(const Func & f) :
+      fImpl(new FunctorHandler<GradFunctor1D,Func>(f) )
+   {}
+
+
+   /**
+       construct from a pointer to class and two pointers to member functions, one for
+       the function evaluation and the other for the derivative.
+       The member functions must take a double as argument and return a double
+    */
+   template <class PtrObj, typename MemFn, typename GradMemFn>
+   GradFunctor1D(const PtrObj& p, MemFn memFn, GradMemFn gradFn)
+      : fImpl(new MemGradFunHandler<GradFunctor1D, PtrObj, MemFn, GradMemFn>(p, memFn, gradFn))
+   {}
+
+
+
+   /**
+      construct from two 1D function objects
+    */
+   template <typename Func, typename GradFunc>
+   GradFunctor1D(const Func & f, const GradFunc & g ) :
+      fImpl(new FunctorGradHandler<GradFunctor1D,Func, GradFunc>(f, g) )
+   {}
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~GradFunctor1D ()  {}
+
+
+   /**
+      Copy constructor for Functor based on ROOT::Math::IGradFunction
+   */
+   GradFunctor1D(const GradFunctor1D & rhs) :
+      // strange that this is required eventhough Impl is an abstract class
+      ImplBase()
+   {
+      if (rhs.fImpl.get() != 0)
+         fImpl = std::auto_ptr<Impl>( rhs.fImpl->Copy()  );
+   }
+
+
+   /**
+      Assignment operator
+   */
+   GradFunctor1D & operator = (const GradFunctor1D & rhs)  {
+      GradFunctor1D copy(rhs);
+      // swap auto_ptr by hand
+      Impl * p = fImpl.release();
+      fImpl.reset(copy.fImpl.release());
+      copy.fImpl.reset(p);
+      return *this;
+   }
+
+
+   // clone of the function handler (use copy-ctor)
+   ImplBase * Clone() const { return new GradFunctor1D(*this); }
+
+
+private :
+
+
+   inline double DoEval (double x) const {
+      return (*fImpl)(x);
+   }
+
+
+   inline double DoDerivative (double x) const {
+      return fImpl->Derivative(x);
+   }
+
+   std::auto_ptr<Impl> fImpl;    // pointer to base gradient functor handler
+
+};
+
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_Functor */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GSLFunctionAdapter.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLFunctionAdapter.h
new file mode 100644
index 0000000..856acb4
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLFunctionAdapter.h
@@ -0,0 +1,97 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLFunctionAdapter
+//
+// Generic adapter for gsl_function signature
+// usable for any c++ class which defines operator( )
+//
+// Created by: Lorenzo Moneta  at Fri Nov 12 16:58:51 2004
+//
+// Last update: Fri Nov 12 16:58:51 2004
+//
+#ifndef ROOT_Math_GSLFunctionAdapter
+#define ROOT_Math_GSLFunctionAdapter
+
+
+namespace BA_ROOT {
+namespace Math {
+
+  /**
+     Function pointer corresponding to gsl_function signature
+   */
+
+  typedef double ( * GSLFuncPointer ) ( double, void *);
+
+
+  /**
+     Class for adapting any C++ functor class to C function pointers used by GSL.
+     The templated C++ function class must implement:
+
+    <em> double operator( double x)</em>
+    and if the derivatives are required:
+    <em> double Gradient( double x)</em>
+
+    This class defines static methods with will be used to fill the
+    \a gsl_function and \a gsl_function_fdf structs used by GSL.
+    See for examples the <A HREF="http://www.gnu.org/software/gsl/manual/gsl-ref_32.html#SEC432">GSL online manual</A>
+  */
+
+
+  template<class UserFunc>
+  class GSLFunctionAdapter {
+
+  public:
+
+    GSLFunctionAdapter() {}
+    virtual ~GSLFunctionAdapter() {}
+
+    static double F( double x, void * p) {
+
+      UserFunc * function = reinterpret_cast< UserFunc *> (p);
+      return (*function)( x );
+    }
+
+
+    static double Df( double x, void * p) {
+
+      UserFunc * function = reinterpret_cast< UserFunc *> (p);
+      return (*function).Derivative( x );
+    }
+
+    static void Fdf( double x, void * p, double *f, double *df ) {
+
+      UserFunc * function = reinterpret_cast< UserFunc *> (p);
+      *f  = (*function) ( x );
+      *df = (*function).Derivative( x );
+    }
+
+  };
+
+
+} // namespace Math
+} // namespace ROOT
+
+
+#endif /* ROOT_Math_GSLFunctionAdapter */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GSLFunctionWrapper.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLFunctionWrapper.h
new file mode 100644
index 0000000..2b27bec
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLFunctionWrapper.h
@@ -0,0 +1,150 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLFunctionWrapper
+//
+// Created by: moneta  at Sat Nov 13 14:54:41 2004
+//
+// Last update: Sat Nov 13 14:54:41 2004
+//
+#ifndef ROOT_Math_GSLFunctionWrapper
+#define ROOT_Math_GSLFunctionWrapper
+
+#include "gsl/gsl_math.h"
+
+#include "Math/GSLFunctionAdapter.h"
+
+#include <cassert>
+
+namespace ROOT {
+namespace Math {
+
+
+
+typedef double ( * GSLFuncPointer ) ( double, void *);
+typedef void ( * GSLFdfPointer ) ( double, void *, double *, double *);
+
+
+/**
+   Wrapper class to the gsl_function C structure.
+   This class to fill the GSL C structure  gsl_function with
+   the C++ function objcet.
+   Use the class ROOT::Math::GSLFunctionAdapter to adapt the
+   C++ function object to the right signature (function pointer type)
+   requested by GSL
+*/
+class GSLFunctionWrapper {
+
+public:
+
+   GSLFunctionWrapper()
+   {
+      fFunc.function = 0;
+      fFunc.params = 0;
+   }
+
+   /// set in the GSL C struct the pointer to the function evaluation
+   void SetFuncPointer( GSLFuncPointer f) { fFunc.function = f; }
+
+   /// set in the GSL C struct the extra-object pointer
+   void SetParams ( void * p) { fFunc.params = p; }
+
+   /// fill the GSL C struct from a generic C++ callable object
+   /// implementing operator()
+   template<class FuncType>
+   void SetFunction(const FuncType &f) {
+      const void * p = &f;
+      assert (p != 0);
+      SetFuncPointer(&GSLFunctionAdapter<FuncType >::F);
+      SetParams(const_cast<void *>(p));
+   }
+
+   gsl_function * GetFunc() { return &fFunc; }
+
+   GSLFuncPointer FunctionPtr() { return fFunc.function; }
+
+   // evaluate the function
+   double operator() (double x) {  return GSL_FN_EVAL(&fFunc, x); }
+
+   /// check if function is valid (has been set)
+   bool IsValid() {
+      return (fFunc.function != 0) ? true : false;
+   }
+
+private:
+   gsl_function fFunc;
+
+
+};
+
+
+   /**
+     class to wrap a gsl_function_fdf (with derivatives)
+   */
+  class GSLFunctionDerivWrapper {
+
+  public:
+
+     GSLFunctionDerivWrapper()
+     {
+        fFunc.f = 0;
+        fFunc.df = 0;
+        fFunc.fdf = 0;
+        fFunc.params = 0;
+     }
+
+
+    void SetFuncPointer( GSLFuncPointer f) { fFunc.f = f; }
+    void SetDerivPointer( GSLFuncPointer f) { fFunc.df = f; }
+    void SetFdfPointer( GSLFdfPointer f) { fFunc.fdf = f; }
+    void SetParams ( void * p) { fFunc.params = p; }
+
+
+    gsl_function_fdf * GetFunc() { return &fFunc; }
+
+    // evaluate the function and derivatives
+    double operator() (double x) {  return GSL_FN_FDF_EVAL_F(&fFunc, x); }
+
+    double Derivative (double x) { return GSL_FN_FDF_EVAL_DF(&fFunc, x); }
+
+    void Fdf(double x, double & f, double & df) {
+      return GSL_FN_FDF_EVAL_F_DF(&fFunc, x, &f, &df);
+    }
+
+   /// check if function is valid (has been set)
+   bool IsValid() {
+      return (fFunc.f != 0 ) ? true : false;
+   }
+
+  private:
+    gsl_function_fdf fFunc;
+
+  };
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+#endif /* ROOT_Math_GSLFunctionWrapper */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GSLMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLMinimizer.h
new file mode 100644
index 0000000..4b30919
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLMinimizer.h
@@ -0,0 +1,186 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Oct 18 11:48:00 2006
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+
+// Header file for class GSLMinimizer
+
+#ifndef ROOT_Math_GSLMinimizer
+#define ROOT_Math_GSLMinimizer
+
+#ifndef ROOT_Math_Minimizer
+#include "Math/Minimizer.h"
+#endif
+
+
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_BasicMinimizer
+#include "Math/BasicMinimizer.h"
+#endif
+
+
+#include <vector>
+#include <map>
+#include <string>
+
+
+
+namespace BA_ROOT {
+
+namespace Math {
+
+
+   /**
+      enumeration specifying the types of GSL minimizers
+      @ingroup MultiMin
+   */
+   enum EGSLMinimizerType {
+      kConjugateFR,
+      kConjugatePR,
+      kVectorBFGS,
+      kVectorBFGS2,
+      kSteepestDescent
+   };
+
+
+   class GSLMultiMinimizer;
+
+   class MinimTransformFunction;
+
+
+//_____________________________________________________________________________________
+/**
+   GSLMinimizer class.
+   Implementation of the ROOT::Math::Minimizer interface using the GSL multi-dimensional
+   minimization algorithms.
+
+   See <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Minimization.html">GSL doc</A>
+   from more info on the GSL minimization algorithms.
+
+   The class implements the ROOT::Math::Minimizer interface and can be instantiated using the
+   ROOT plugin manager (plugin name is "GSLMultiMin"). The varius minimization algorithms
+   (conjugatefr, conjugatepr, bfgs, etc..) can be passed as enumerations and also as a string.
+   The default algorithm is conjugatefr (Fletcher-Reeves conjugate gradient algorithm).
+
+   @ingroup MultiMin
+*/
+class GSLMinimizer : public BA_ROOT::Math::BasicMinimizer {
+
+public:
+
+   /**
+      Default constructor
+   */
+   GSLMinimizer (BA_ROOT::Math::EGSLMinimizerType type = BA_ROOT::Math::kConjugateFR  );
+
+   /**
+      Constructor with a string giving name of algorithm
+    */
+   GSLMinimizer (const char *  type  );
+
+   /**
+      Destructor
+   */
+   virtual ~GSLMinimizer ();
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /**
+      Copy constructor
+   */
+   GSLMinimizer(const GSLMinimizer &) : BasicMinimizer() {}
+
+   /**
+      Assignment operator
+   */
+   GSLMinimizer & operator = (const GSLMinimizer & rhs) {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+public:
+
+   /// set the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGenFunction & func);
+
+   /// set the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGradFunction & func) { BasicMinimizer::SetFunction(func);}
+
+   /// method to perform the minimization
+   virtual  bool Minimize();
+
+
+   /// return expected distance reached from the minimum
+   virtual double Edm() const { return 0; } // not impl. }
+
+
+   /// return pointer to gradient values at the minimum
+   virtual const double *  MinGradient() const;
+
+   /// number of function calls to reach the minimum
+   virtual unsigned int NCalls() const;
+
+
+   /// minimizer provides error and error matrix
+   virtual bool ProvidesError() const { return false; }
+
+   /// return errors at the minimum
+   virtual const double * Errors() const {
+      return 0;
+   }
+
+   /** return covariance matrices elements
+       if the variable is fixed the matrix is zero
+       The ordering of the variables is the same as in errors
+   */
+   virtual double CovMatrix(unsigned int , unsigned int ) const { return 0; }
+
+
+
+
+protected:
+
+private:
+
+
+   BA_ROOT::Math::GSLMultiMinimizer * fGSLMultiMin;
+
+   double fLSTolerance;  // Line Search Tolerance
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Math_GSLMinimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GSLMinimizer1D.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLMinimizer1D.h
new file mode 100644
index 0000000..525053d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLMinimizer1D.h
@@ -0,0 +1,224 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta, A. Zsenei   08/2005
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 moneta,  CERN/PH-SFT                            *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLMinimizer1D
+//
+// Created by: moneta  at Wed Dec  1 15:04:51 2004
+//
+// Last update: Wed Dec  1 15:04:51 2004
+//
+
+#ifndef ROOT_Math_GSLMinimizer1D
+#define ROOT_Math_GSLMinimizer1D
+
+#include "Math/IMinimizer1D.h"
+#include "Math/GSLFunctionAdapter.h"
+
+
+namespace BA_ROOT {
+namespace Math {
+
+   namespace Minim1D {
+
+      /**
+          Enumeration with One Dimensional Minimizer Algorithms.
+          The algorithms are implemented using GSL, see the
+          <A HREF="http://www.gnu.org/software/gsl/manual/gsl-ref_33.html#SEC447">GSL manual</A>.
+
+          The algorithms available are:
+          <ul>
+          <li><em>Golden Section Algorithm</em>, simplest method of bracketing the minimum of a function
+          <li><em>Brent Algorithm</em>, which combines a parabolic interpolation with the golden section algorithm
+          </ul>
+          @ingroup Min1D
+      */
+
+      enum Type {kGOLDENSECTION,
+                 kBRENT
+      };
+   }
+
+   class GSL1DMinimizerWrapper;
+   class GSLFunctionWrapper;
+
+//______________________________________________________________________________________
+/**
+
+Minimizer for arbitrary one dimensional functions.
+
+Implemented using GSL, for detailed description see:
+<A HREF="http://www.gnu.org/software/gsl/manual/html_node/One-dimensional-Minimization.html">GSL online doc</A>
+
+The algorithms uspported are only bracketing algorithm which do not use derivatives information.
+The algorithms which can be chosen at construction time are  GOLDENSECTION, whic is the simplest method
+but the slowest and BRENT (the default one) which combines the golden section with a parabolic interpolation.
+
+
+This class does not support copying
+ at ingroup Min1D
+*/
+
+   class GSLMinimizer1D: public IMinimizer1D {
+
+   public:
+
+      /**
+         Construct the minimizer passing the minimizer type using the Minim1D::Algorithm enumeration
+      */
+
+      explicit GSLMinimizer1D(Minim1D::Type type=Minim1D::kBRENT);
+
+      /**
+         Destructor: free allocated resources
+      */
+      virtual ~GSLMinimizer1D();
+
+   private:
+      // usually copying is non trivial, so we make this unaccessible
+      GSLMinimizer1D(const GSLMinimizer1D &);
+      GSLMinimizer1D & operator = (const GSLMinimizer1D &);
+
+   public:
+
+
+      /**
+          Set, or reset, minimizer to use the function f and the initial search interval [xlow, xup], with a guess for the location of the minimum xmin.
+          The condition : \f$ f(xlow) > f(xmin) < f(xup)\f$  must be satisfied
+      */
+      template <class UserFunc>
+      void SetFunction( const UserFunc & f, double xmin, double xlow, double xup) {
+         const void * p = &f;
+         SetFunction(  &GSLFunctionAdapter<UserFunc>::F, const_cast<void *>(p), xmin, xlow, xup );
+      }
+
+      /**
+          Set, or reset, minimizer to use the function f and the initial search interval [xlow, xup], with a guess for the location of the minimum xmin.
+          The condition : \f$ f(xlow) > f(xmin) < f(xup) \f$ must be satisfied
+
+          Method specialized on the GSL function type
+      */
+      void SetFunction( GSLFuncPointer  f, void * params, double xmin, double xlow, double xup);
+
+      /**
+          Perform a minimizer iteration and
+          if an unexepcted problem occurr then an error code will be returned
+      */
+      int Iterate();
+
+
+      /**
+          Return current estimate of the position of the minimum
+      */
+      double XMinimum() const;
+
+      /**
+         Return current lower bound of the minimization interval
+      */
+      double XLower() const;
+
+      /**
+         Return current upper bound of the minimization interval
+      */
+      double XUpper() const;
+
+      /**
+          Return function value at current estimate of the minimum
+      */
+      double FValMinimum() const;
+
+      /**
+         Return function value at current lower bound of the minimization interval
+      */
+      double FValLower() const;
+
+      /**
+         Return function value at current upper bound of the minimization interval
+      */
+      double FValUpper() const;
+
+
+      /**
+         Find minimum position iterating until convergence specified by the absolute and relative tolerance or
+         the maximum number of iteration is reached
+         Return true is result is successfull
+         \@param maxIter maximum number of iteration
+         \@param absTol desired absolute error in the minimum position
+         \@param absTol desired relative error in the minimum position
+      */
+      bool Minimize( int maxIter, double absTol, double relTol);
+
+
+      /**
+         Return number of iteration used to find minimum
+      */
+      int Iterations() const {
+         return fIter;
+      }
+
+      /**
+         Return status of last minimization
+       */
+      int Status() const { return fStatus; }
+
+      /**
+         Return name of minimization algorithm
+      */
+      const char * Name() const;
+
+      /**
+         Test convergence of the interval.
+         The test returns success if
+         \f[
+         |x_{min}-x_{truemin}| < epsAbs + epsRel *x_{truemin}
+         \f]
+      */
+      static int TestInterval( double xlow, double xup, double epsAbs, double epsRel);
+
+
+   protected:
+
+
+   private:
+
+      double fXmin;
+      double fXlow;
+      double fXup;
+      double fMin;
+      double fLow;
+      double fUp;
+      int fIter;
+      int fStatus;    // status of last minimization (==0 ok =1 failed)
+      bool fIsSet;
+
+
+      GSL1DMinimizerWrapper * fMinimizer;
+      GSLFunctionWrapper * fFunction;
+
+   };
+
+} // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_GSLMinimizer1D */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GSLRandomFunctions.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLRandomFunctions.h
new file mode 100644
index 0000000..2d7d380
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLRandomFunctions.h
@@ -0,0 +1,212 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta    8/2015
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2015 , ROOT MathLib Team                             *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for random class
+//
+//
+// Created by: Lorenzo Moneta  : Tue 4 Aug 2015
+//
+//
+#ifndef ROOT_Math_GSLRandomFunctions
+#define ROOT_Math_GSLRandomFunctions
+
+
+//#include <type_traits>
+
+#include "Math/RandomFunctions.h"
+
+#include "Math/GSLRndmEngines.h"
+
+namespace BA_ROOT {
+namespace Math {
+
+
+//___________________________________________________________________________________
+   /**
+       Specialized implementation of the Random functions based on the GSL library. 
+       These will work onlmy with a GSLRandomEngine type 
+
+       @ingroup  Random
+   */
+
+
+   template <class EngineType >
+   class RandomFunctions<EngineType, BA_ROOT::Math::GSLRandomEngine> : public RandomFunctions<EngineType, DefaultEngineType> {
+      //class RandomFunctions<Engine, ROOT::Math::GSLRandomEngine>  {
+
+      //typdef TRandomEngine DefaulEngineType;
+      
+   public:
+
+      RandomFunctions() {} 
+
+      RandomFunctions(EngineType & rng) : RandomFunctions<EngineType, DefaultEngineType>(rng) {}
+
+
+      inline EngineType & Engine() { return  RandomFunctions<EngineType,DefaultEngineType>::Rng(); }
+      
+      double GausZig(double mean, double sigma) {
+         return Engine().GaussianZig(sigma) + mean;
+      }
+      // double GausRatio(double mean, double sigma) {
+      //    auto & r =  RandomFunctions<Engine,DefaultEngineType>::Rng();
+      //    return r.GaussianRatio(sigma) + mean; 
+      // }
+      
+          /**
+       Gaussian distribution. Default method (use Ziggurat)
+     */
+    double Gaus(double mean = 0, double sigma = 1) {
+      return mean + Engine().GaussianZig(sigma);
+    }
+
+    /**
+       Gaussian distribution (Box-Muller method)
+     */
+    double GausBM(double mean = 0, double sigma = 1) {
+      return mean + Engine().Gaussian(sigma);
+    }
+
+    /**
+       Gaussian distribution (Ratio Method)
+     */
+    double GausR(double mean = 0, double sigma = 1) {
+      return mean + Engine().GaussianRatio(sigma);
+    }
+
+    /**
+       Gaussian Tail distribution
+     */
+    double GaussianTail(double a, double sigma = 1) {
+      return Engine().GaussianTail(a,sigma);
+    }
+
+    /**
+       Bivariate Gaussian distribution with correlation
+     */
+    void Gaussian2D(double sigmaX, double sigmaY, double rho, double &x, double &y) {
+      Engine().Gaussian2D(sigmaX, sigmaY, rho, x, y);
+    }
+
+    /**
+       Exponential distribution
+     */
+    double Exp(double tau) {
+      return Engine().Exponential(tau);
+    }
+    /**
+       Breit Wigner distribution
+    */
+    double BreitWigner(double mean = 0., double gamma = 1) {
+      return mean + Engine().Cauchy( gamma/2.0 );
+    }
+
+    /**
+       Landau distribution
+     */
+    double Landau(double mean = 0, double sigma = 1) {
+      return mean + sigma*Engine().Landau();
+    }
+
+    /**
+       Gamma distribution
+     */
+    double Gamma(double a, double b) {
+      return Engine().Gamma(a,b);
+    }
+
+    /**
+       Log Normal distribution
+     */
+    double LogNormal(double zeta, double sigma) {
+      return Engine().LogNormal(zeta,sigma);
+    }
+
+    /**
+       Chi square distribution
+     */
+    double ChiSquare(double nu) {
+      return Engine().ChiSquare(nu);
+    }
+
+    /**
+       F distrbution
+     */
+    double FDist(double nu1, double nu2) {
+      return Engine().FDist(nu1,nu2);
+    }
+
+    /**
+       t student distribution
+     */
+    double tDist(double nu) {
+      return Engine().tDist(nu);
+    }
+
+    /**
+       generate random numbers in a 2D circle of radious 1
+     */
+    void Circle(double &x, double &y, double r = 1) {
+      Engine().Dir2D(x,y);
+      x *= r;
+      y *= r;
+    }
+
+    /**
+       generate random numbers in a 3D sphere of radious 1
+     */
+    void Sphere(double &x, double &y, double &z,double r = 1) {
+      Engine().Dir3D(x,y,z);
+      x *= r;
+      y *= r;
+      z *= r;
+    }
+
+    /**
+       Poisson distribution
+     */
+    unsigned int Poisson(double mu) {
+      return Engine().Poisson(mu);
+    }
+
+    /**
+       Binomial distribution
+     */
+    unsigned int Binomial(unsigned int ntot, double prob) {
+      return Engine().Binomial(prob,ntot);
+    }
+
+    /**
+       Negative Binomial distribution
+       First parameter is n, second is probability
+       To be consistent with Random::Binomial
+     */
+     unsigned int NegativeBinomial(double n, double prob) {
+      return Engine().NegativeBinomial(prob,n);
+    }
+
+    /**
+       Multinomial distribution
+     */
+    std::vector<unsigned int> Multinomial( unsigned int ntot, const std::vector<double> & p ) {
+      return Engine().Multinomial(ntot,p);
+    }
+
+
+
+  };
+
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+#endif /* ROOT_Math_GSLRandomFunctions */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GSLRndmEngines.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLRndmEngines.h
new file mode 100644
index 0000000..0772437
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLRndmEngines.h
@@ -0,0 +1,471 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLRandom
+//
+// Created by: moneta  at Sun Nov 21 16:26:03 2004
+//
+// Last update: Sun Nov 21 16:26:03 2004
+//
+#ifndef ROOT_Math_GSLRndmEngines
+#define ROOT_Math_GSLRndmEngines
+
+#include <string>
+#include <vector>
+
+
+namespace BA_ROOT {
+namespace Math {
+
+
+   class GSLRngWrapper;
+
+   //_________________________________________________________________
+   /**
+      GSLRandomEngine
+      Base class for all GSL random engines,
+      normally user instantiate the derived classes
+      which creates internally the generator.
+
+      The main GSL generators (see
+      <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">
+      here</A>) are available as derived classes
+      In addition to generate uniform numbers it provides method for
+      generating numbers according to pre-defined distributions
+      using the GSL functions from
+      <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html">
+      GSL random number distributions</A>.
+
+
+
+      @ingroup Random
+   */
+   class GSLRandomEngine {
+
+   public:
+
+     /**
+         default constructor. No creation of rng is done.
+         If then Initialize() is called an engine is created
+         based on default GSL type (MT)
+     */
+      GSLRandomEngine();
+
+      /**
+          create from an existing rng.
+          User manage the rng pointer which is then deleted olny by calling Terminate()
+      */
+      GSLRandomEngine( GSLRngWrapper * rng);
+
+      /**
+         Copy constructor : clone the contained GSL generator
+       */
+      GSLRandomEngine(const GSLRandomEngine & eng);
+
+      /**
+         Assignment operator : make a deep copy of the contained GSL generator
+       */
+      GSLRandomEngine & operator=(const GSLRandomEngine & eng);
+
+      /**
+         initialize the generator
+         If no rng is present the default one based on Mersenne and Twister is created
+       */
+      void Initialize();
+
+      /**
+         delete pointer to contained rng
+       */
+      void Terminate();
+
+      /**
+         call Terminate()
+      */
+      virtual ~GSLRandomEngine();
+
+      /**
+         Generate a  random number between ]0,1]
+         0 is excluded and 1 is included
+      */
+      double operator() () const;
+      
+      /**
+         Generate a  random number between ]0,1]
+         0 is excluded and 1 is included
+      */
+      double Rndm() const { return (*this)(); }
+
+      /**
+          Generate an integer number between [0,max-1] (including 0 and max-1)
+          if max is larger than available range of algorithm
+          an error message is printed and zero is returned
+      */
+      unsigned int RndmInt(unsigned int max) const;
+
+      /**
+         Generate an array of random numbers.
+         The iterators points to the random numbers
+      */
+      template<class Iterator>
+      void RandomArray(Iterator begin, Iterator end) const {
+         for ( Iterator itr = begin; itr != end; ++itr ) {
+            *itr = this->operator()();
+         }
+      }
+
+      /**
+         Generate an array of random numbers
+         The iterators points to the random numbers
+      */
+      void RandomArray(double * begin, double * end) const;
+
+      /**
+         return name of generator
+      */
+      std::string Name() const;
+
+      /**
+         return the state size of generator
+      */
+      unsigned int Size() const;
+
+      /**
+          set the random generator seed
+      */
+      void SetSeed(unsigned int seed) const;
+
+
+      /** @name Random Distributions
+          Implemented using the
+          <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html">
+          GSL Random number Distributions</A>
+      **/
+      //@{
+      /**
+         Gaussian distribution - default method is Box-Muller (polar method)
+      */
+      double Gaussian(double sigma) const;
+
+      /**
+         Gaussian distribution - Ziggurat method
+      */
+      double GaussianZig(double sigma) const;
+
+      /**
+         Gaussian distribution - Ratio method
+      */
+      double GaussianRatio(double sigma) const;
+      /**
+         Gaussian Tail distribution
+      */
+      double GaussianTail(double a, double sigma) const;
+
+      /**
+         Bivariate Gaussian distribution with correlation
+      */
+      void Gaussian2D(double sigmaX, double sigmaY, double rho, double &x, double &y) const;
+
+      /**
+         Exponential distribution
+      */
+      double Exponential(double mu) const;
+
+      /**
+         Cauchy distribution
+      */
+      double Cauchy(double a) const;
+
+      /**
+         Landau distribution
+      */
+      double Landau() const;
+
+      /**
+         Gamma distribution
+      */
+      double Gamma(double a, double b) const;
+
+      /**
+         Log Normal distribution
+      */
+      double LogNormal(double zeta, double sigma) const;
+
+      /**
+         Chi square distribution
+      */
+      double ChiSquare(double nu) const;
+
+      /**
+         F distrbution
+      */
+      double FDist(double nu1, double nu2) const;
+
+      /**
+         t student distribution
+      */
+      double tDist(double nu) const;
+
+      /**
+         generate random numbers in a 2D circle of radious 1
+      */
+      void Dir2D(double &x, double &y) const;
+
+      /**
+         generate random numbers in a 3D sphere of radious 1
+      */
+      void Dir3D(double &x, double &y, double &z) const;
+
+      /**
+         Poisson distribution
+      */
+      unsigned int Poisson(double mu) const;
+
+      /**
+         Binomial distribution
+      */
+      unsigned int Binomial(double p, unsigned int n) const;
+
+      /**
+         Negative Binomial distribution
+      */
+      unsigned int NegativeBinomial(double p, double n) const;
+
+      /**
+         Multinomial distribution
+      */
+      std::vector<unsigned int> Multinomial( unsigned int ntot, const std::vector<double> & p ) const;
+
+      //@}
+
+
+
+   protected:
+
+      /// internal method used by the derived class to set the type of generators
+      void SetType(GSLRngWrapper * r) {
+         fRng = r;
+      }
+
+   private:
+
+      GSLRngWrapper * fRng;                // pointer to GSL generator wrapper (managed by the class)
+      mutable unsigned int  fCurTime;      // current time used to seed the generator
+
+
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      Mersenne-Twister generator
+      gsl_rng_mt19937 from
+      <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+
+      @ingroup Random
+   */
+   class GSLRngMT : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngMT();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      Old Ranlux generator (James, Luscher) (default luxury level, p = 223)
+      (This is eequivalent to TRandom1 with default luxury level)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngRanLux : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngRanLux();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      Second generation of Ranlux generator for single precision with  luxury level of 1
+      (It throws away 202 values for every 12 used)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngRanLuxS1 : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngRanLuxS1();
+   };
+   typedef GSLRngRanLuxS1 GSLRngRanLux1; // for backward compatibility
+
+   //_____________________________________________________________________________________
+   /**
+      Second generation of Ranlux generator for Single precision with  luxury level of 2
+      (It throws away 397 value for every 12 used)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngRanLuxS2 : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngRanLuxS2();
+   };
+   typedef GSLRngRanLuxS2 GSLRngRanLux2; // for backward compatibility
+
+   //_____________________________________________________________________________________
+   /**
+      Double precision (48 bits) version of Second generation of Ranlux generator with  luxury level of 1
+      (It throws away 202 value for every 12 used)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngRanLuxD1 : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngRanLuxD1();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      Double precision (48 bits) version of Second generation of Ranlux generator with  luxury level of 2
+      (It throws away 397 value for every 12 used)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngRanLuxD2 : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngRanLuxD2();
+   };
+   typedef GSLRngRanLuxD2 GSLRngRanLux48; // for backward compatibility
+
+
+   //_____________________________________________________________________________________
+   /**
+      Tausworthe generator by L'Ecuyer
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngTaus : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngTaus();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      Lagged Fibonacci generator by Ziff
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngGFSR4 : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngGFSR4();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      Combined multiple recursive  generator (L'Ecuyer)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngCMRG : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngCMRG();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      5-th order multiple recursive  generator (L'Ecuyer, Blouin and Coutre)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngMRG : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngMRG();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      BSD rand() generator
+      gsl_rmg_rand from
+      <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Unix-random-number-generators.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngRand : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngRand();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      RANMAR generator
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Unix-random-number-generators.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngRanMar : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngRanMar();
+   };
+
+   //_____________________________________________________________________________________
+   /**
+      MINSTD generator (Park and Miller)
+      see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Unix-random-number-generators.html">here</A>
+
+      @ingroup Random
+   */
+   class GSLRngMinStd : public GSLRandomEngine {
+   public:
+      typedef GSLRandomEngine BaseType; 
+      GSLRngMinStd();
+   };
+
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+// random functions specialization for GSL
+// needs to be defined after defining GSLRandomEngine class 
+
+#include "Math/GSLRandomFunctions.h"
+
+#endif /* ROOT_Math_GSLRndmEngines */
+
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GSLSimAnnealing.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLSimAnnealing.h
new file mode 100644
index 0000000..2d0c4d9
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GSLSimAnnealing.h
@@ -0,0 +1,257 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Thu Jan 25 11:13:48 2007
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class GSLSimAnnealing
+
+#ifndef ROOT_Math_GSLSimAnnealing
+#define ROOT_Math_GSLSimAnnealing
+
+#include "Math/IFunctionfwd.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+      class GSLRandomEngine;
+
+//_____________________________________________________________________________
+/**
+   GSLSimAnFunc class description.
+   Interface class for the  objetive function to be used in simulated annealing
+   If user wants to re-implement some of the methods (like the one defining the metric) which are used by the
+   the simulated annealing algorithm must build a user derived class.
+   NOTE: Derived classes must re-implement the assignment and copy constructor to call them of the parent class
+
+   @ingroup MultiMin
+ */
+class GSLSimAnFunc {
+public:
+
+   /**
+      construct from an interface of a multi-dimensional function
+    */
+   GSLSimAnFunc(const BA_ROOT::Math::IMultiGenFunction & func, const double * x);
+
+   /**
+      construct from an interface of a multi-dimensional function
+      Use optionally a scale factor (for each coordinate) which can  be used to scale the step sizes
+      (this is used for example by the minimization algorithm)
+    */
+   GSLSimAnFunc(const BA_ROOT::Math::IMultiGenFunction & func, const double * x, const double * scale);
+
+protected:
+
+   /**
+      derived classes might need to re-define completely the class
+    */
+   GSLSimAnFunc() :
+      fFunc(0)
+   {}
+
+public:
+
+
+   /// virtual distructor (no operations)
+   virtual ~GSLSimAnFunc() { } //
+
+
+   /**
+      fast copy method called by GSL simuated annealing internally
+      copy only the things which have been changed
+      must be re-implemented by derived classes if needed
+   */
+   virtual GSLSimAnFunc & FastCopy(const GSLSimAnFunc & f);
+
+
+   /**
+      clone method. Needs to be re-implemented by the derived classes for deep  copying
+    */
+   virtual GSLSimAnFunc * Clone() const {
+      return new GSLSimAnFunc(*this);
+   }
+
+   /**
+      evaluate the energy ( objective function value)
+      re-implement by derived classes if needed to be modified
+    */
+   virtual double Energy() const;
+
+   /**
+      change the x[i] value using a random value urndm generated between [0,1]
+      up to a maximum value maxstep
+      re-implement by derived classes if needed to be modified
+    */
+   virtual void Step(const GSLRandomEngine & r, double maxstep);
+
+   /**
+      calculate the distance (metric) between  this one and another configuration
+      Presently a cartesian metric is used.
+      re-implement by derived classes if needed to be modified
+    */
+   virtual double Distance(const GSLSimAnFunc & func) const;
+
+   /**
+      print the position in the standard output std::ostream
+      GSL prints in addition n iteration, n function calls, temperature and energy
+      re-implement by derived classes if necessary
+    */
+   virtual void Print();
+
+   /**
+       change the x values (used by sim annealing to take a step)
+    */
+   void SetX(const double * x) {
+      std::copy(x, x+ fX.size(), fX.begin() );
+   }
+
+   template <class IT>
+   void SetX(IT begin, IT end) {
+      std::copy(begin, end, fX.begin() );
+   }
+
+   unsigned int NDim() const { return fX.size(); }
+
+   double X(unsigned int i) const { return fX[i]; }
+
+   const std::vector<double> &  X() const { return fX; }
+
+   double Scale(unsigned int i) const { return fScale[i]; }
+
+   void SetX(unsigned int i, double x) { fX[i] = x; }
+
+   // use compiler generated  copy ctror and assignment operators
+
+private:
+
+   std::vector<double>  fX;
+   std::vector<double>  fScale;
+   const BA_ROOT::Math::IMultiGenFunction * fFunc;
+
+};
+
+//_____________________________________________________
+/**
+    structure holding the simulated annealing parameters
+
+   @ingroup MultiMin
+*/
+struct GSLSimAnParams {
+
+   // constructor with some default values
+   GSLSimAnParams() {
+      n_tries =    200;
+      iters_fixed_T =  10;
+      step_size =   10;
+      // the following parameters are for the Boltzmann distribution */
+      k = 1.0;
+      t_initial =  0.002;
+      mu =  1.005;
+      t_min = 2.0E-6;
+   }
+
+
+   int n_tries;            // number of points to try for each step
+   int iters_fixed_T;      // number of iterations at each temperature
+   double step_size;       // max step size used in random walk
+   /// parameters for the Boltzman distribution
+   double k;
+   double t_initial;
+   double mu;
+   double t_min;
+};
+
+//___________________________________________________________________________
+/**
+   GSLSimAnnealing class for performing  a simulated annealing search of
+   a multidimensional function
+
+   @ingroup MultiMin
+*/
+class GSLSimAnnealing {
+
+public:
+
+   /**
+      Default constructor
+   */
+   GSLSimAnnealing ();
+
+   /**
+      Destructor (no operations)
+   */
+   ~GSLSimAnnealing ()  {}
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /**
+      Copy constructor
+   */
+   GSLSimAnnealing(const GSLSimAnnealing &) {}
+
+   /**
+      Assignment operator
+   */
+   GSLSimAnnealing & operator = (const GSLSimAnnealing & rhs)  {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+public:
+
+
+   /**
+      solve the simulated annealing given a multi-dim function, the initial vector parameters
+      and a vector containing the scaling factors for the parameters
+   */
+   int Solve(const BA_ROOT::Math::IMultiGenFunction & func, const double * x0, const double * scale, double * xmin, bool debug = false);
+
+   /**
+      solve the simulated annealing given a GSLSimAnFunc object
+      The object will contain the initial state at the beginning and the final minimum state at the end
+   */
+   int Solve(GSLSimAnFunc & func, bool debug = false);
+
+
+   GSLSimAnParams & Params() { return fParams; }
+   const GSLSimAnParams & Params() const { return fParams; }
+
+
+protected:
+
+
+private:
+
+   GSLSimAnParams fParams; // parameters for GSLSimAnnealig
+
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_GSLSimAnnealing */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GenAlgoOptions.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GenAlgoOptions.h
new file mode 100644
index 0000000..7820af4
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GenAlgoOptions.h
@@ -0,0 +1,159 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Nov 2010
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2010  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Math_GenAlgoOptions
+#define ROOT_Math_GenAlgoOptions
+
+
+#ifndef ROOT_Math_IOptions
+#include "Math/IOptions.h"
+#endif
+
+#include <map>
+#include <iomanip>
+
+namespace BA_ROOT {
+      namespace Math {
+
+//_______________________________________________________________________________
+/**
+    class implementing generic options for a numerical algorithm
+    Just store the options in a map of string-value pairs
+
+    @ingroup NumAlgo
+*/
+class GenAlgoOptions : public IOptions {
+
+public:
+
+   GenAlgoOptions() /* : fExtraOptions(0) */  {}
+
+   virtual ~GenAlgoOptions() {}// { if (fExtraOptions) delete fExtraOptions; }
+
+   // use default copy constructor and assignment operator
+
+   /** generic  methods for  retrivieng options */
+
+
+   // methods implementing the  IOptions interface
+
+   virtual IOptions * Clone() const {
+      return new GenAlgoOptions(*this);
+   }
+
+   // t.b.d need probably to implement in a .cxx file for CINT
+
+
+   virtual bool GetRealValue(const char * name, double & val) const {
+      const double * pval = FindValue(name, fRealOpts);
+      if (!pval) return false;
+      val = *pval;
+      return true;
+   }
+
+   virtual bool GetIntValue(const char * name, int & val) const {
+      const int * pval = FindValue(name, fIntOpts);
+      if (!pval) return false;
+      val = *pval;
+      return true;
+   }
+
+   virtual bool GetNamedValue(const char * name, std::string & val) const {
+      const std::string * pval = FindValue(name, fNamOpts);
+      if (!pval) return false;
+      val = *pval;
+      return true;
+   }
+
+   /// method wich need to be re-implemented by the derived classes
+   virtual void SetRealValue(const char * name, double val)  {
+      InsertValue(name, fRealOpts, val);
+   }
+
+   virtual void SetIntValue(const char * name , int val) {
+      InsertValue(name, fIntOpts, val);
+   }
+
+   virtual void SetNamedValue(const char * name, const char * val) {
+      InsertValue(name, fNamOpts, std::string(val));
+   }
+
+
+   /// print options
+   virtual void Print(std::ostream & os = std::cout ) const {
+      Print(fNamOpts,os);
+      Print(fIntOpts,os);
+      Print(fRealOpts,os);
+   }
+
+
+   // static methods to retrieve the default options
+
+   // find the option given a name
+   // return 0 if the option is not found
+   static IOptions * FindDefault(const char * algoname);
+
+   // retrieve options given the name
+   // if option is not found create a new GenAlgoOption for the given name
+   static IOptions & Default(const char * algoname);
+
+   /// print all the default options
+   static void PrintAllDefault(std::ostream & os = std::cout);
+
+
+protected:
+
+
+
+private:
+
+   template<class M>
+   static const typename M::mapped_type * FindValue(const std::string &  name, const M & opts) {
+      typename M::const_iterator pos;
+      pos = opts.find(name);
+      if (pos == opts.end()) {
+         return 0;
+      }
+      return  &((*pos).second);
+   }
+
+   template<class M>
+   static void InsertValue(const std::string &name, M & opts, const typename M::mapped_type & value) {
+      typename M::iterator pos;
+      pos = opts.find(name);
+      if (pos != opts.end()) {
+         pos->second = value;
+      }
+      else {
+         opts.insert(typename M::value_type(name, value) );
+      }
+   }
+
+   template<class M>
+   static void Print( const M & opts, std::ostream & os) {
+      //const std::ios_base::fmtflags prevFmt = os.flags();
+      for (typename M::const_iterator pos = opts.begin(); pos != opts.end(); ++pos)
+         os << std::setw(25) << pos->first << " : " << std::setw(15) << pos->second << std::endl;
+   }
+
+
+   std::map<std::string, double>      fRealOpts;   // map of the real options
+   std::map<std::string, int>         fIntOpts;    // map of the integer options
+   std::map<std::string, std::string> fNamOpts;    // map of the named options
+
+};
+
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/GeneticMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Math/GeneticMinimizer.h
new file mode 100644
index 0000000..5e310c2
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/GeneticMinimizer.h
@@ -0,0 +1,112 @@
+// @(#)root/mathcore:$Id
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class GeneticMinimizer
+
+#ifndef ROOT_Math_GeneticMinimizer
+#define ROOT_Math_GeneticMinimizer
+
+#include <vector>
+
+#include "Math/Minimizer.h"
+
+#include "TMVA/IFitterTarget.h"
+#include "TMVA/Interval.h"
+
+namespace BA_ROOT {
+   namespace Math {
+
+
+//_______________________________________________________________________________
+/*
+  structure containing the parameters of the genetic minimizer
+ */
+struct GeneticMinimizerParameters {
+
+   Int_t fPopSize;
+   Int_t fNsteps;
+   Int_t fCycles;
+   Int_t fSC_steps;
+   Int_t fSC_rate;
+   Double_t fSC_factor;
+   Double_t fConvCrit;
+   Int_t fSeed;
+
+
+   // constructor with default value
+   GeneticMinimizerParameters();
+};
+
+
+
+//_______________________________________________________________________________
+/**
+   GeneticMinimizer
+
+   @ingroup MultiMin
+*/
+class GeneticMinimizer: public BA_ROOT::Math::Minimizer {
+
+public:
+
+   //GeneticMinimizer (int = 0);
+   GeneticMinimizer (int i = 0);
+   virtual ~GeneticMinimizer ();
+
+   virtual void Clear();
+   using BA_ROOT::Math::Minimizer::SetFunction;
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGenFunction & func);
+
+   virtual bool SetLimitedVariable(unsigned int , const std::string& , double , double , double, double);
+   virtual bool SetVariable(unsigned int ivar, const std::string & name, double val, double step);
+   virtual bool SetFixedVariable(unsigned int ivar  , const std::string & name , double val);
+
+   virtual  bool Minimize();
+   virtual double MinValue() const;
+   virtual double Edm() const;
+   virtual const double *  X() const;
+   virtual const double *  MinGradient() const;
+   virtual unsigned int NCalls() const;
+
+   virtual unsigned int NDim() const;
+   virtual unsigned int NFree() const;
+
+   virtual bool ProvidesError() const;
+   virtual const double * Errors() const;
+
+   virtual double CovMatrix(unsigned int i, unsigned int j) const;
+
+   void SetParameters(const GeneticMinimizerParameters & params );
+
+   void SetRandomSeed(int seed) { fParameters.fSeed = seed; }
+
+   const GeneticMinimizerParameters & MinimizerParameters() const { return fParameters; }
+
+   virtual BA_ROOT::Math::MinimizerOptions Options() const;
+
+   virtual void SetOptions(const BA_ROOT::Math::MinimizerOptions & opt);
+
+protected:
+
+   void GetGeneticOptions(BA_ROOT::Math::MinimizerOptions & opt) const;
+
+   std::vector<BA_TMVA::Interval*> fRanges;
+   BA_TMVA::IFitterTarget* fFitness;
+   double fMinValue;
+   std::vector<double> fResult;
+
+   GeneticMinimizerParameters fParameters;
+
+};
+
+
+   } // end namespace Math
+} // end namespace ROOT
+
+#endif /* ROOT_Math_GeneticMinimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/IFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Math/IFunction.h
new file mode 100644
index 0000000..7f6f303
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/IFunction.h
@@ -0,0 +1,417 @@
+// @(#)root/mathcore:$Id$
+// Authors: L. Moneta    11/2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006 , LCG ROOT MathLib Team                         *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for function interfaces
+//
+// Generic Interfaces for one or  multi-dimensional functions
+//
+// Created by: Lorenzo Moneta  : Wed Nov 13 2006
+//
+//
+#ifndef ROOT_Math_IFunction
+#define ROOT_Math_IFunction
+
+/**
+ at defgroup CppFunctions Function Classes and Interfaces
+
+ Interfaces (abstract classes) and Base classes used in MathCore and MathMore numerical methods
+ for describing function classes. They define function and gradient evaluation and as well the
+ functionality for dealing with parameters in the case of parametric functions which are used for
+ fitting and data modeling.
+ Included are also adapter classes, such as  functors, to wrap generic callable C++ objects
+ in the desired interface.
+*/
+
+//typedefs and tags definitions
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+
+namespace BA_ROOT {
+namespace Math {
+
+/**
+   @defgroup GenFunc Interfaces for generic function evaluation
+   @ingroup CppFunctions
+*/
+
+//___________________________________________________________________________________
+   /**
+       Documentation for the abstract class IBaseFunctionMultiDim.
+       Interface (abstract class) for generic functions objects of multi-dimension
+       Provides a method to evaluate the function given a vector of coordinate values,
+       by implementing operator() (const double *).
+       In addition it defines the interface for copying functions via the pure virtual method Clone()
+       and the interface for getting the function dimension via the NDim() method.
+       Derived classes must implement the pure private virtual method DoEval(const double *) for the
+       function evaluation in addition to NDim() and Clone().
+
+       @ingroup  GenFunc
+   */
+
+   class IBaseFunctionMultiDim {
+
+   public:
+
+      typedef  IBaseFunctionMultiDim BaseFunc;
+
+
+      IBaseFunctionMultiDim() {}
+
+      /**
+         virtual destructor
+       */
+      virtual ~IBaseFunctionMultiDim() {}
+
+      /**
+          Clone a function.
+          Each derived class must implement their version of the Clone method
+      */
+      virtual IBaseFunctionMultiDim * Clone() const = 0;
+
+      /**
+         Retrieve the dimension of the function
+       */
+      virtual unsigned int NDim() const = 0;
+
+      /**
+          Evaluate the function at a point x[].
+          Use the pure virtual private method DoEval which must be implemented by the sub-classes
+      */
+      double operator() (const double* x) const {
+         return DoEval(x);
+      }
+
+#ifdef LATER
+      /**
+         Template method to eveluate the function using the begin of an iterator
+         User is responsible to provide correct size for the iterator
+      */
+      template <class Iterator>
+      double operator() (const Iterator it ) const {
+         return DoEval( &(*it) );
+      }
+#endif
+
+
+   private:
+
+
+      /**
+         Implementation of the evaluation function. Must be implemented by derived classes
+      */
+      virtual double DoEval(const double * x) const = 0;
+
+
+  };
+
+
+//___________________________________________________________________________________
+   /**
+       Interface (abstract class) for generic functions objects of one-dimension
+       Provides a method to evaluate the function given a value (simple double)
+       by implementing operator() (const double ).
+       In addition it defines the interface for copying functions via the pure virtual method Clone().
+       Derived classes must implement the pure virtual private method DoEval(double ) for the
+       function evaluation in addition to  Clone().
+       An interface for evaluating the function passing a vector (like for multidim functions) is also
+       provided
+
+       @ingroup  GenFunc
+   */
+   class IBaseFunctionOneDim {
+
+   public:
+
+      typedef  IBaseFunctionOneDim BaseFunc;
+
+      IBaseFunctionOneDim() {}
+
+      /**
+         virtual destructor
+       */
+      virtual ~IBaseFunctionOneDim() {}
+
+      /**
+          Clone a function.
+          Each derived class will implement their version of the provate DoClone method
+      */
+      virtual IBaseFunctionOneDim * Clone() const = 0;
+
+      /**
+          Evaluate the function at a point x
+          Use the  a pure virtual private method DoEval which must be implemented by sub-classes
+      */
+      double operator() (double x) const {
+         return DoEval(x);
+      }
+
+      /**
+          Evaluate the function at a point x[].
+          Compatible method with multi-dimensional functions
+      */
+      double operator() (const double * x) const {
+         return DoEval(*x);
+      }
+
+
+
+   private:
+
+      // use private virtual inheritance
+
+      /// implementation of the evaluation function. Must be implemented by derived classes
+      virtual double DoEval(double x) const = 0;
+
+   };
+
+
+//-------- GRAD  functions---------------------------
+
+//___________________________________________________________________________________
+   /**
+      Gradient interface (abstract class) defining the signature for calculating the gradient of a
+      multi-dimensional function.
+      Three methods are provided:
+      - Gradient(const double *x, double * grad) evaluate the full gradient vector at the vector value x
+      - Derivative(const double * x, int icoord) evaluate the partial derivative for the icoord coordinate
+      - FdF(const double *x, double &f, double * g) evaluate at the same time gradient and function/
+
+      Concrete classes should derive from ROOT::Math::IGradientFunctionMultiDim and not from this class.
+
+      @ingroup  GenFunc
+    */
+
+   class IGradientMultiDim {
+
+      public:
+
+      /// virual destructor
+      virtual ~IGradientMultiDim() {}
+
+      /**
+          Evaluate all the vector of function derivatives (gradient)  at a point x.
+          Derived classes must re-implement if it is more efficient than evaluting one at a time
+      */
+      virtual void  Gradient(const double *x, double * grad) const = 0;
+
+      /**
+         Return the partial derivative with respect to the passed coordinate
+      */
+      double Derivative(const double * x, unsigned int icoord = 0) const  {
+         return DoDerivative(x, icoord);
+      }
+
+
+      /**
+          Optimized method to evaluate at the same time the function value and derivative at a point x.
+          Often both value and derivatives are needed and it is often more efficient to compute them at the same time.
+          Derived class should implement this method if performances play an important role and if it is faster to
+          evaluate value and derivative at the same time
+
+      */
+      virtual void FdF (const double * x, double & f, double * df) const  = 0;
+
+
+   private:
+
+
+      /**
+         function to evaluate the derivative with respect each coordinate. To be implemented by the derived class
+      */
+      virtual  double  DoDerivative(const double * x, unsigned int icoord ) const = 0;
+
+   };
+
+//___________________________________________________________________________________
+   /**
+      Specialized Gradient interface(abstract class)  for one dimensional functions
+      It provides a method to evaluate the derivative of the function, Derivative and a
+      method to evaluate at the same time the function and the derivative FdF
+
+      Concrete classes should derive from ROOT::Math::IGradientFunctionOneDim and not from this class.
+
+      @ingroup  GenFunc
+    */
+   class IGradientOneDim {
+
+   public:
+
+      /// virtual destructor
+      virtual ~IGradientOneDim() {}
+
+      /**
+         Return the derivative of the function at a point x
+         Use the private method DoDerivative
+      */
+      double Derivative(double x ) const  {
+         return DoDerivative(x );
+      }
+
+
+      /**
+          Optimized method to evaluate at the same time the function value and derivative at a point x.
+          Often both value and derivatives are needed and it is often more efficient to compute them at the same time.
+          Derived class should implement this method if performances play an important role and if it is faster to
+          evaluate value and derivative at the same time
+
+      */
+      virtual void FdF (double x, double & f, double & df) const = 0;
+
+
+      /**
+         Compatibility method with multi-dimensional interface for partial derivative
+       */
+      double Derivative(const double * x) const  {
+         return DoDerivative( *x);
+      }
+
+      /**
+         Compatibility method with multi-dimensional interface for Gradient
+       */
+      void Gradient(const double * x, double *g) const  {
+         g[0] = DoDerivative( *x);
+      }
+
+      /**
+         Compatibility method with multi-dimensional interface for Gradient and function evaluation
+       */
+      void FdF(const double * x, double & f, double * df) const  {
+         FdF(*x, f, *df);
+      }
+
+
+
+   private:
+
+
+      /**
+         function to evaluate the derivative with respect each coordinate. To be implemented by the derived class
+      */
+      virtual  double  DoDerivative(double x ) const = 0;
+
+   };
+
+//___________________________________________________________________________________
+/**
+   Interface (abstract class) for multi-dimensional functions providing a gradient calculation.
+   It implements both the ROOT::Math::IBaseFunctionMultiDim and
+   ROOT::Math::IGradientMultiDim interfaces.
+   The method ROOT::Math::IFunction::Gradient calculates the full gradient vector,
+   ROOT::Math::IFunction::Derivative calculates the partial derivative for each coordinate and
+   ROOT::Math::Fdf calculates the gradient and the function value at the same time.
+   The pure private virtual method DoDerivative() must be implemented by the derived classes, while
+   Gradient and FdF are by default implemented using DoDerivative, butthey  can be overloaded by the
+   derived classes to improve the efficiency in the derivative calculation.
+
+   @ingroup  GenFunc
+*/
+
+
+   class IGradientFunctionMultiDim :
+      virtual public IBaseFunctionMultiDim ,
+      public IGradientMultiDim {
+
+
+   public:
+
+      typedef IBaseFunctionMultiDim BaseFunc;
+      typedef IGradientMultiDim BaseGrad;
+
+
+      /**
+          Virtual Destructor (no operations)
+      */
+      virtual ~IGradientFunctionMultiDim () {}
+
+      /**
+          Evaluate all the vector of function derivatives (gradient)  at a point x.
+          Derived classes must re-implement it if more efficient than evaluting one at a time
+      */
+      virtual void  Gradient(const double *x, double * grad) const {
+         unsigned int ndim = NDim();
+         for (unsigned int icoord  = 0; icoord < ndim; ++icoord)
+            grad[icoord] = BaseGrad::Derivative(x,icoord);
+      }
+
+      using  BaseFunc::NDim;
+
+
+      /**
+          Optimized method to evaluate at the same time the function value and derivative at a point x.
+          Often both value and derivatives are needed and it is often more efficient to compute them at the same time.
+          Derived class should implement this method if performances play an important role and if it is faster to
+          evaluate value and derivative at the same time
+
+      */
+      virtual void FdF (const double * x, double & f, double * df) const {
+         f = BaseFunc::operator()(x);
+         Gradient(x,df);
+      }
+
+
+   };
+
+
+//___________________________________________________________________________________
+/**
+   Interface (abstract class) for one-dimensional functions providing a gradient calculation.
+   It implements both the ROOT::Math::IBaseFunctionOneDim and
+   ROOT::Math::IGradientOneDim interfaces.
+   The method  ROOT::Math::IFunction::Derivative calculates the derivative  and
+   ROOT::Math::Fdf calculates the derivative and the function values at the same time.
+   The pure private virtual method DoDerivative() must be implemented by the derived classes, while
+   FdF is by default implemented using DoDerivative, but it can be overloaded by the
+   derived classes to improve the efficiency in the derivative calculation.
+
+
+   @ingroup  GenFunc
+*/
+   //template <>
+   class IGradientFunctionOneDim :
+      virtual public IBaseFunctionOneDim ,
+      public IGradientOneDim {
+
+
+   public:
+
+      typedef IBaseFunctionOneDim BaseFunc;
+      typedef IGradientOneDim BaseGrad;
+
+
+      /**
+          Virtual Destructor (no operations)
+      */
+      virtual ~IGradientFunctionOneDim () {}
+
+
+      /**
+          Optimized method to evaluate at the same time the function value and derivative at a point x.
+           Often both value and derivatives are needed and it is often more efficient to compute them at the same time.
+          Derived class should implement this method if performances play an important role and if it is faster to
+          evaluate value and derivative at the same time
+
+      */
+      virtual void FdF (double x, double & f, double & df) const {
+         f = operator()(x);
+         df = Derivative(x);
+      }
+
+
+
+   };
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+#endif /* ROOT_Math_IGenFunction */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/IFunctionfwd.h b/ThirdParty/Fit/RootMinimizers/inc/Math/IFunctionfwd.h
new file mode 100644
index 0000000..2a53cbc
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/IFunctionfwd.h
@@ -0,0 +1,39 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Nov 14 14:38:48 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Defines Forward declaration for template IFunction class and useful typedefs
+
+#ifndef ROOT_Math_IFunctionfwd
+#define ROOT_Math_IFunctionfwd
+
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+      class IBaseFunctionOneDim;
+      class IGradientFunctionOneDim;
+      class IBaseFunctionMultiDim;
+      class IGradientFunctionMultiDim;
+
+
+      typedef IBaseFunctionOneDim        IGenFunction;
+      typedef IBaseFunctionMultiDim      IMultiGenFunction;
+
+      typedef IGradientFunctionOneDim        IGradFunction;
+      typedef IGradientFunctionMultiDim      IMultiGradFunction;
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_IFunctionfwd */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/IMinimizer1D.h b/ThirdParty/Fit/RootMinimizers/inc/Math/IMinimizer1D.h
new file mode 100644
index 0000000..582d3ce
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/IMinimizer1D.h
@@ -0,0 +1,118 @@
+// @(#)root/mathcore:$Id$
+// Author: David Gonzalez Maline 2/2008
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 Maline,  CERN/PH-SFT                            *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class Minimizer1D
+//
+// Created by: Maline  at Fri Feb  1 11:30:26 2008
+//
+
+#ifndef ROOT_Math_IMinimizer1D
+#define ROOT_Math_IMinimizer1D
+
+/**
+
+   @defgroup Min1D One-dimensional Minimization
+   @ingroup NumAlgo
+ */
+
+namespace BA_ROOT {
+namespace Math {
+
+//___________________________________________________________________________________________
+/**
+   Interface class for numerical methods for one-dimensional minimization
+
+   @ingroup Min1D
+
+ */
+
+   class IMinimizer1D {
+
+   public:
+
+      IMinimizer1D() {}
+      virtual ~IMinimizer1D() {}
+
+   public:
+
+      /**
+       * Return current estimate of the position of the minimum
+       */
+      virtual double XMinimum() const = 0;
+
+      /**
+       * Return current lower bound of the minimization interval
+       */
+      virtual double XLower() const = 0;
+
+      /**
+       * Return current upper bound of the minimization interval
+       */
+      virtual double XUpper() const = 0;
+
+      /**
+       * Return function value at current estimate of the minimum
+       */
+      virtual double FValMinimum() const = 0;
+
+      /**
+       * Return function value at current lower bound of the minimization interval
+       */
+      virtual double FValLower() const = 0;
+
+      /**
+       * Return function value at current upper bound of the minimization interval
+       */
+      virtual double FValUpper() const = 0;
+
+      /**
+       * Find minimum position iterating until convergence specified by the absolute and relative tolerance or
+       * the maximum number of iteration is reached
+       * Return true if iterations converged successfully
+       * \@param maxIter maximum number of iteration
+       * \@param absTol desired absolute error in the minimum position
+       * \@param absTol desired relative error in the minimum position
+       */
+      virtual bool Minimize( int maxIter, double absTol, double relTol) = 0;
+
+      /**
+       * Return number of iteration used to find minimum
+       */
+      virtual int Iterations() const = 0;
+
+      /**
+       * Return name of minimization algorithm
+       */
+      virtual const char * Name() const = 0;
+
+      /** Returns the status of the previous estimate */
+      virtual int Status() const = 0;
+
+
+   };  // end class IMinimizer1D
+
+} // end namespace Math
+
+} // end namespace ROOT
+
+#endif /* ROOT_Math_IMinimizer1D */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/IOptions.h b/ThirdParty/Fit/RootMinimizers/inc/Math/IOptions.h
new file mode 100644
index 0000000..1a3efca
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/IOptions.h
@@ -0,0 +1,119 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Fri Aug 15 2008
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2008  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Math_IOptions
+#define ROOT_Math_IOptions
+
+
+#ifndef ROOT_Math_Error
+#include "Math/Error.h"
+#endif
+
+#include <iostream>
+
+namespace BA_ROOT {
+
+
+   namespace Math {
+
+//_______________________________________________________________________________
+/**
+    Generic interface for defining configuration options of a numerical algorithm
+
+    @ingroup NumAlgo
+*/
+class IOptions {
+
+public:
+
+   IOptions() /* : fExtraOptions(0) */  {}
+
+   virtual ~IOptions() {}// { if (fExtraOptions) delete fExtraOptions; }
+
+   // copy the options
+   virtual IOptions * Clone() const = 0;
+
+   /** generic  methods for  retrivieng options */
+
+   /// set option value
+   void SetValue(const char * name, double val) { SetRealValue(name,val);}
+   void SetValue(const char * name, int val) { SetIntValue(name,val);}
+   void SetValue(const char * name, const char * val) { SetNamedValue(name,val);}
+
+
+   double  RValue(const char * name) const {
+      double val = 0;
+      bool ret = GetRealValue(name,val);
+      if (!ret )  MATH_ERROR_MSGVAL("IOptions::RValue"," return 0 - real option not found",name);
+      return val;
+   }
+
+   int   IValue(const char * name) const {
+      int val = 0;
+      bool ret = GetIntValue(name,val);
+      if (!ret )   MATH_ERROR_MSGVAL("IOptions::IValue"," return 0 - integer option not found",name);
+      return val;
+   }
+
+   std::string  NamedValue(const char * name) const {
+      std::string val;
+      bool ret = GetNamedValue(name,val);
+      if (!ret )  MATH_ERROR_MSGVAL("IOptions::NamedValue"," return empty string - named option not found",name);
+      return val;
+   }
+
+
+   // generic method to retrieve  a type
+   template <typename T>
+   bool GetValue(const char * name, T & t) const {
+      bool ret = DoGetValue(name, t);
+      //if (!ret )  MATH_ERROR_MSG("IOptions::GetValue","option is not existing - returns 0");
+      return ret;
+   }
+
+
+   // methods to be re-implemented in the derived classes
+
+
+   virtual bool GetRealValue(const char *, double &) const { return false; }
+
+   virtual bool GetIntValue(const char *, int &) const { return false; }
+
+   virtual bool GetNamedValue(const char *, std::string &) const { return false; }
+
+   /// method wich need to be re-implemented by the derived classes
+   virtual void SetRealValue(const char * , double )  {MATH_ERROR_MSG("IOptions::SetRealValue","Invalid setter method called"); }
+
+   virtual void SetIntValue(const char * , int ) {MATH_ERROR_MSG("IOptions::SetIntValue","Invalid setter method called"); }
+
+   virtual void SetNamedValue(const char * , const char * ) {MATH_ERROR_MSG("IOptions::SetNamedValue","Invalid setter method called"); }
+
+
+   /// print options
+   virtual void Print(std::ostream & = std::cout ) const {MATH_INFO_MSG("IOptions::Print","it is not implemented");}
+
+
+private:
+
+   bool DoGetValue(const char *name, double &val) const { return GetRealValue(name,val); }
+
+   bool DoGetValue(const char *name, int &val) const { return GetIntValue(name,val); }
+
+   bool DoGetValue(const char *name, std::string &val) const { return GetNamedValue(name,val); }
+
+
+};
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/IParamFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Math/IParamFunction.h
new file mode 100644
index 0000000..7ad0518
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/IParamFunction.h
@@ -0,0 +1,403 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Nov 14 14:20:07 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class IParamFunction
+
+#ifndef ROOT_Math_IParamFunction
+#define ROOT_Math_IParamFunction
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_Util
+#include "Math/Util.h"
+#endif
+
+
+#include <cassert>
+
+/**
+   @defgroup ParamFunc Interfaces for parametric functions
+   @ingroup CppFunctions
+*/
+
+
+namespace BA_ROOT {
+
+namespace Math {
+
+
+//___________________________________________________________________
+/**
+    Documentation for the abstract class IBaseParam.
+    It defines the interface for dealing with the function parameters
+    This is used only for internal convinience, to avoid redefining the Parameter API
+    for the one and the multi-dim functions.
+    Concrete class should derive from ROOT::Math::IParamFunction and not from this class.
+
+    @ingroup  ParamFunc
+*/
+
+class IBaseParam  {
+
+public:
+
+
+   /**
+      Virtual Destructor (no operations)
+   */
+   virtual ~IBaseParam ()  {}
+
+
+   /**
+      Access the parameter values
+   */
+   virtual const double * Parameters() const = 0;
+
+   /**
+      Set the parameter values
+      @param p vector of doubles containing the parameter values.
+
+      to be defined:  can user change number of params ? At the moment no.
+
+   */
+   virtual void SetParameters(const double * p ) = 0;
+
+
+   /**
+      Return the number of Parameters
+   */
+   virtual unsigned int NPar() const = 0;
+
+   /**
+      Return the name of the i-th parameter (starting from zero)
+      Overwrite if want to avoid the default name ("Par_0, Par_1, ...")
+    */
+   virtual std::string ParameterName(unsigned int i) const {
+      assert(i < NPar() );
+      return "Par_" + Util::ToString(i);
+   }
+
+
+};
+
+//___________________________________________________________________
+/**
+   IParamFunction interface (abstract class) describing multi-dimensional parameteric functions
+   It is a derived class from ROOT::Math::IBaseFunctionMultiDim and
+   ROOT::Math::IBaseParam
+
+   Provides the interface for evaluating a function passing a coordinate vector and a parameter vector.
+
+   @ingroup  ParamFunc
+*/
+
+class IParametricFunctionMultiDim :
+         virtual public IBaseFunctionMultiDim ,
+         public IBaseParam {
+
+public:
+
+   typedef IBaseFunctionMultiDim  BaseFunc;
+
+
+
+   /**
+      Evaluate function at a point x and for given parameters p.
+      This method does not change the internal status of the function (internal parameter values).
+      If for some reason one prefers caching the parameter values, SetParameters(p) and then operator()(x) should be
+      called.
+      Use the pure virtual function DoEvalPar to implement it
+   */
+   double operator() (const double * x, const double *  p ) const {
+      return DoEvalPar(x, p);
+   }
+
+   using BaseFunc::operator();
+
+
+private:
+
+   /**
+      Implementation of the evaluation function using the x values and the parameters.
+      Must be implemented by derived classes
+   */
+   virtual double DoEvalPar(const double * x, const double * p) const = 0;
+
+   /**
+      Implement the ROOT::Math::IBaseFunctionMultiDim interface DoEval(x) using the cached parameter values
+   */
+   virtual double DoEval(const double *x) const {
+      return DoEvalPar( x, Parameters() );
+   }
+
+};
+
+//___________________________________________________________________
+/**
+   Specialized IParamFunction interface (abstract class) for one-dimensional parametric functions
+   It is a derived class from ROOT::Math::IBaseFunctionOneDim and
+   ROOT::Math::IBaseParam
+
+   @ingroup  ParamFunc
+*/
+
+class IParametricFunctionOneDim :
+         virtual public IBaseFunctionOneDim,
+         public IBaseParam {
+
+
+public:
+
+   typedef IBaseFunctionOneDim   BaseFunc;
+
+
+   using BaseFunc::operator();
+
+   /**
+      Evaluate function at a point x and for given parameters p.
+      This method does not change the internal status of the function (internal parameter values).
+      If for some reason one prefers caching the parameter values, SetParameters(p) and then operator()(x) should be
+      called.
+      Use the pure virtual function DoEvalPar to implement it
+   */
+   double operator() ( double x, const double *  p ) const {
+      return DoEvalPar(x, p);
+   }
+
+
+   /**
+      multidim-like interface
+   */
+   double operator() (const double * x, const double *  p ) const
+   {
+      return DoEvalPar(*x, p);
+   }
+
+private:
+
+   /**
+      Implementation of the evaluation function using the x value and the parameters.
+      Must be implemented by derived classes
+   */
+   virtual double DoEvalPar(double x, const double * p) const = 0;
+
+   /**
+      Implement the ROOT::Math::IBaseFunctionOneDim interface DoEval(x) using the cached parameter values
+   */
+   virtual double DoEval(double x) const {
+      return DoEvalPar( x, Parameters() );
+   }
+
+};
+
+
+
+//_______________________________________________________________________________
+/**
+   Interface (abstract class) for parametric gradient multi-dimensional functions providing
+   in addition to function evaluation with respect to the coordinates
+   also the gradient with respect to the parameters, via the method ParameterGradient.
+
+   It is a derived class from ROOT::Math::IParametricFunctionMultiDim.
+
+   The pure private virtual method DoParameterGradient must be implemented by the derived classes
+   in addition to those inherited by the base abstract classes.
+
+   @ingroup  ParamFunc
+*/
+
+class IParametricGradFunctionMultiDim :
+         public IParametricFunctionMultiDim
+//         ,public IGradientFunctionMultiDim
+{
+
+public:
+
+   typedef IParametricFunctionMultiDim                BaseParamFunc;
+   typedef IGradientFunctionMultiDim                  BaseGradFunc;
+   typedef IParametricFunctionMultiDim::BaseFunc  BaseFunc;
+
+
+   /**
+      Virtual Destructor (no operations)
+   */
+   virtual ~IParametricGradFunctionMultiDim ()  {}
+
+
+
+   using BaseParamFunc::operator();
+
+   /**
+      Evaluate the all the derivatives (gradient vector) of the function with respect to the parameters at a point x.
+      It is optional to be implemented by the derived classes for better efficiency
+   */
+   virtual void ParameterGradient(const double * x , const double * p, double * grad ) const {
+      unsigned int npar = NPar();
+      for (unsigned int ipar  = 0; ipar < npar; ++ipar)
+         grad[ipar] = DoParameterDerivative(x,p,ipar);
+   }
+
+   /**
+      Evaluate the partial derivative w.r.t a parameter ipar from values and parameters
+    */
+   double ParameterDerivative(const double * x, const double * p, unsigned int ipar = 0) const {
+      return DoParameterDerivative(x, p, ipar);
+   }
+
+   /**
+      Evaluate all derivatives using cached parameter values
+   */
+   void ParameterGradient(const double * x , double * grad ) const {
+      return ParameterGradient(x, Parameters(), grad);
+   }
+   /**
+      Evaluate partial derivative using cached parameter values
+   */
+   double ParameterDerivative(const double * x, unsigned int ipar = 0) const {
+      return DoParameterDerivative(x, Parameters() , ipar);
+   }
+
+private:
+
+
+
+   /**
+      Evaluate the partial derivative w.r.t a parameter ipar , to be implemented by the derived classes
+    */
+   virtual double DoParameterDerivative(const double * x, const double * p, unsigned int ipar) const = 0;
+
+
+};
+
+//_______________________________________________________________________________
+/**
+   Interface (abstract class) for parametric one-dimensional gradient functions providing
+   in addition to function evaluation with respect the coordinates
+   also the gradient with respect to the parameters, via the method ParameterGradient.
+
+   It is a derived class from ROOT::Math::IParametricFunctionOneDim.
+
+   The pure private virtual method DoParameterGradient must be implemented by the derived classes
+   in addition to those inherited by the base abstract classes.
+
+   @ingroup  ParamFunc
+*/
+
+class IParametricGradFunctionOneDim :
+         public IParametricFunctionOneDim
+//         ,public IGradientFunctionOneDim
+{
+
+public:
+
+   typedef IParametricFunctionOneDim            BaseParamFunc;
+   typedef IGradientFunctionOneDim              BaseGradFunc;
+   typedef IParametricFunctionOneDim::BaseFunc  BaseFunc;
+
+
+   /**
+      Virtual Destructor (no operations)
+   */
+   virtual ~IParametricGradFunctionOneDim ()  {}
+
+
+   using BaseParamFunc::operator();
+
+   /**
+      Evaluate the derivatives of the function with respect to the parameters at a point x.
+      It is optional to be implemented by the derived classes for better efficiency if needed
+   */
+   virtual void ParameterGradient(double x , const double * p, double * grad ) const {
+      unsigned int npar = NPar();
+      for (unsigned int ipar  = 0; ipar < npar; ++ipar)
+         grad[ipar] = DoParameterDerivative(x, p, ipar);
+   }
+
+   /**
+      Evaluate all derivatives using cached parameter values
+   */
+   void ParameterGradient(double  x , double * grad ) const {
+      return ParameterGradient( x, Parameters(), grad);
+   }
+
+   /**
+      Compatibility interface with multi-dimensional functions
+   */
+   void ParameterGradient(const double * x , const double * p, double * grad ) const {
+      ParameterGradient(*x, p, grad);
+   }
+
+   /**
+      Evaluate all derivatives using cached parameter values (multi-dim like interface)
+   */
+   void ParameterGradient(const double * x , double * grad ) const {
+      return ParameterGradient( *x, Parameters(), grad);
+   }
+
+
+   /**
+      Partial derivative with respect a parameter
+    */
+   double ParameterDerivative(double x, const double * p, unsigned int ipar = 0) const {
+      return DoParameterDerivative(x, p, ipar);
+   }
+
+   /**
+      Evaluate partial derivative using cached parameter values
+   */
+   double ParameterDerivative(double x, unsigned int ipar = 0) const {
+      return DoParameterDerivative(x, Parameters() , ipar);
+   }
+
+   /**
+      Partial derivative with respect a parameter
+      Compatibility interface with multi-dimensional functions
+   */
+   double ParameterDerivative(const double * x, const double * p, unsigned int ipar = 0) const {
+      return DoParameterDerivative(*x, p, ipar);
+   }
+
+
+   /**
+      Evaluate partial derivative using cached parameter values (multi-dim like interface)
+   */
+   double ParameterDerivative(const double * x, unsigned int ipar = 0) const {
+      return DoParameterDerivative( *x, Parameters() , ipar);
+   }
+
+
+
+private:
+
+
+   /**
+      Evaluate the gradient, to be implemented by the derived classes
+    */
+   virtual double DoParameterDerivative(double x, const double * p, unsigned int ipar ) const = 0;
+
+
+};
+
+
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Math_IParamFunction */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/IParamFunctionfwd.h b/ThirdParty/Fit/RootMinimizers/inc/Math/IParamFunctionfwd.h
new file mode 100644
index 0000000..69bbfdb
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/IParamFunctionfwd.h
@@ -0,0 +1,41 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Nov 14 14:38:52 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Forward declarations for template class  IParamFunction class
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#define ROOT_Math_IParamFunctionfwd
+
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+      class IParametricFunctionOneDim;
+      class IParametricGradFunctionOneDim;
+      class IParametricFunctionMultiDim;
+      class IParametricGradFunctionMultiDim;
+
+      typedef IParametricFunctionOneDim        IParamFunction;
+      typedef IParametricFunctionMultiDim      IParamMultiFunction;
+
+      typedef IParametricGradFunctionOneDim        IParamGradFunction;
+      typedef IParametricGradFunctionMultiDim      IParamMultiGradFunction;
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_IParamFunctionfwd */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/MinimTransformFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimTransformFunction.h
new file mode 100644
index 0000000..01bdce2
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimTransformFunction.h
@@ -0,0 +1,157 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta June 2009
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+
+// Header file for class MinimTransformFunction
+
+#ifndef ROOT_Math_MinimTransformFunction
+#define ROOT_Math_MinimTransformFunction
+
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+
+#ifndef ROOT_Math_MinimTransformVariable
+#include "Math/MinimTransformVariable.h"
+#endif
+
+
+#include <vector>
+#include <map>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+
+/**
+   MinimTransformFunction class to perform a transformations on the
+   variables to deal with fixed or limited variables (support both double and single bounds)
+   The class manages the passed function pointer
+
+   @ingroup MultiMin
+*/
+class MinimTransformFunction : public IMultiGradFunction {
+
+public:
+
+   typedef  BA_ROOT::Math::IMultiGradFunction BaseGradFunc;
+   typedef  BA_ROOT::Math::IMultiGradFunction::BaseFunc BaseFunc;
+
+
+   /**
+     Constructor from a IMultiGradFunction interface (which is managed by the class)
+     vector specifying the variable types (free, bounded or fixed, defined in enum EMinimVariableTypes )
+     variable values (used for the fixed ones) and a map with the bounds (for the bounded variables)
+
+   */
+   MinimTransformFunction ( const IMultiGradFunction * f, const std::vector<BA_ROOT::Math::EMinimVariableType> & types, const std::vector<double> & values,
+                            const std::map<unsigned int, std::pair<double, double> > & bounds);
+
+
+   /**
+      Destructor (delete function pointer)
+   */
+   ~MinimTransformFunction ()  {
+      if (fFunc) delete fFunc;
+   }
+
+
+   // method inherited from IFunction interface
+
+   unsigned int NDim() const { return fIndex.size(); }
+
+   unsigned int NTot() const { return fFunc->NDim(); }
+
+   /// clone:  not supported (since auto_ptr used in the fVariables)
+   IMultiGenFunction * Clone() const {
+      return 0;
+   }
+
+
+   /// transform from internal to external
+   /// result is cached also inside the class
+   const double * Transformation( const double * x) const {
+      Transformation(x, &fX[0]);
+      return &fX.front();
+  }
+
+
+   /// transform from internal to external
+   void Transformation( const double * xint, double * xext) const;
+
+   /// inverse transformation (external -> internal)
+   void  InvTransformation(const double * xext,  double * xint) const;
+
+   /// inverse transformation for steps (external -> internal) at external point x
+   void  InvStepTransformation(const double * x, const double * sext,  double * sint) const;
+
+   ///transform gradient vector (external -> internal) at internal point x
+   void GradientTransformation(const double * x, const double *gExt, double * gInt) const;
+
+   ///transform covariance matrix (internal -> external) at internal point x
+   /// use row storages for matrices  m(i,j) = rep[ i * dim + j]
+   void MatrixTransformation(const double * x, const double *covInt, double * covExt) const;
+
+   // return original function
+   const IMultiGradFunction *OriginalFunction() const { return fFunc; }
+
+
+private:
+
+   /// function evaluation
+   virtual double DoEval(const double * x) const {
+#ifndef DO_THREADSAFE
+      return (*fFunc)(Transformation(x));
+#else
+      std::vector<double> xext(fVariables.size() );
+      Transformation(x, &xext[0]);
+      return (*fFunc)(&xext[0]);
+#endif
+   }
+
+   /// calculate derivatives
+   virtual double DoDerivative (const double * x, unsigned int icoord  ) const {
+      const MinimTransformVariable & var = fVariables[ fIndex[icoord] ];
+      double dExtdInt = (var.IsLimited() ) ? var.DerivativeIntToExt( x[icoord] ) : 1.0;
+      double deriv =  fFunc->Derivative( Transformation(x) , fIndex[icoord] );
+      //std::cout << "Derivative icoord (ext)" << fIndex[icoord] << "   dtrafo " << dExtdInt << "  " << deriv << std::endl;
+      return deriv * dExtdInt;
+   }
+
+   // copy constructor for this class (disable by having it private)
+   MinimTransformFunction( const MinimTransformFunction & ) :
+      BaseFunc(), BaseGradFunc()
+   {}
+
+   // assignment operator for this class (disable by having it private)
+   MinimTransformFunction & operator= ( const MinimTransformFunction & ) {
+      return *this;
+   }
+
+
+
+private:
+
+   mutable std::vector<double>  fX;              // internal cached of external values
+   std::vector<MinimTransformVariable> fVariables;    // vector of variable settings and tranformation function
+   std::vector<unsigned int>      fIndex;        // vector with external indices for internal variables
+   const IMultiGradFunction * fFunc;             // user function
+
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_MinimTransformFunction */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/MinimTransformVariable.h b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimTransformVariable.h
new file mode 100644
index 0000000..9f629f0
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimTransformVariable.h
@@ -0,0 +1,159 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta 2009
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+// Header file for class MinimizerVariable
+
+#ifndef ROOT_Math_MinimizerVariable
+#define ROOT_Math_MinimizerVariable
+
+#ifndef ROOT_Math_MinimizerVariableTransformation
+#include "MinimizerVariableTransformation.h"
+#endif
+
+#include <memory>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+      /**
+         Enumeration describing the status of the variable
+         The enumeration are used in the minimizer classes to categorize the variables
+      */
+      enum EMinimVariableType {
+         kDefault,    // free variable (unlimited)
+         kFix,        // fixed variable
+         kBounds,     //  variable has two bounds
+         kLowBound,   // variable has a lower bound
+         kUpBound     // variable has an upper bounds
+      };
+
+
+
+/**
+   MinimTransformVariable class
+   Contains meta information of the variables such as bounds, fix flags and
+   deals with transformation of the variable
+   The class does not contain the values and the step size (error) of the variable
+   This is an internal class used by the MinimTransformFunction class
+
+   @ingroup MultiMin
+*/
+
+
+class MinimTransformVariable {
+
+public:
+
+   /**
+     Default Constructor for  an unlimited variable
+   */
+   MinimTransformVariable () :
+      fFix(false), fLowBound(false), fUpBound(false), fBounds(false),
+      fTransform(0), fLower(1), fUpper(0)
+   {}
+
+   // constructor for fixed variable
+   MinimTransformVariable (double value) :
+      fFix(true), fLowBound(false), fUpBound(false), fBounds(false),
+      fTransform(0), fLower(value), fUpper(value)
+   {}
+
+   // constructor for double bound variable
+   MinimTransformVariable (double lower, double upper, SinVariableTransformation * trafo) :
+      fFix(false), fLowBound(false), fUpBound(false), fBounds(true),
+      fTransform(trafo),
+      fLower(lower), fUpper(upper)
+   {   }
+
+   // constructor for lower bound variable
+   MinimTransformVariable (double lower, SqrtLowVariableTransformation * trafo) :
+      fFix(false), fLowBound(true), fUpBound(false), fBounds(false),
+      fTransform(trafo), fLower(lower), fUpper(lower)
+   {}
+
+   // constructor for upper bound variable
+   MinimTransformVariable (double upper, SqrtUpVariableTransformation * trafo) :
+      fFix(false), fLowBound(true), fUpBound(false), fBounds(false),
+      fTransform(trafo), fLower(upper), fUpper(upper)
+   {}
+
+   // copy constructor
+   MinimTransformVariable (const MinimTransformVariable & rhs) :
+      fFix(rhs.fFix), fLowBound(rhs.fLowBound), fUpBound(rhs.fUpBound), fBounds(rhs.fBounds),
+      fLower(rhs.fLower), fUpper(rhs.fUpper)
+   {
+      // swap auto_ptr
+      fTransform.reset( const_cast<MinimTransformVariable &>( rhs).fTransform.release() ) ;
+   }
+
+   // assignment
+   MinimTransformVariable & operator= (const MinimTransformVariable & rhs) {
+      if (&rhs == this) return *this;
+      fFix = rhs.fFix;
+      fLowBound = rhs.fLowBound;
+      fUpBound  = rhs.fUpBound;
+      fBounds   = rhs.fBounds;
+      fLower = rhs.fLower;  fUpper = rhs.fUpper;
+
+      // swap auto_ptr
+      fTransform.reset( const_cast<MinimTransformVariable &>( rhs).fTransform.release() ) ;
+      return *this;
+   }
+
+
+   bool IsFixed() const { return fFix; }
+
+   bool IsLimited() const { return fBounds || fLowBound || fUpBound; }
+
+   bool HasLowerBound() const { return fLowBound || fBounds; }
+
+   bool HasUpperBound() const { return fUpBound || fBounds; }
+
+   double LowerBound() const { return fLower; }
+
+   double UpperBound() const { return fUpper; }
+
+   double FixValue() const { return fLower; }
+
+   // internal to external transformation
+   double InternalToExternal( double x) const {
+      return (fTransform.get() ) ? fTransform->Int2ext(x, fLower, fUpper) : x;
+   }
+
+   // derivative of the internal to external transformation ( d Int2Ext / d int )
+   double DerivativeIntToExt ( double x) const {
+      return (fTransform.get() ) ? fTransform->DInt2Ext( x, fLower, fUpper) : 1.0;
+   }
+
+   // etxernal to internal transformation
+   double ExternalToInternal(double x) const {
+      return (fTransform.get() ) ? fTransform->Ext2int(x, fLower, fUpper) : x;
+   }
+
+private:
+
+   bool fFix;         // fix variable
+   bool fLowBound;    // has lower bound
+   bool fUpBound;     // has uppper bound param
+   bool fBounds;      // has double bound
+   std::auto_ptr< MinimizerVariableTransformation> fTransform; // pointer to the minimizer transformation
+   double fLower;   // lower parameter limit
+   double fUpper;   // upper parameter limit
+
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_MinimTransformVariable */
+
+
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/Minimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Math/Minimizer.h
new file mode 100644
index 0000000..9dbc19e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/Minimizer.h
@@ -0,0 +1,505 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Fri Sep 22 15:06:47 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class Minimizer
+
+#ifndef ROOT_Math_Minimizer
+#define ROOT_Math_Minimizer
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+
+#ifndef ROOT_Math_MinimizerOptions
+#include "Math/MinimizerOptions.h"
+#endif
+
+#ifndef ROOT_Math_Util
+#include "Math/Util.h"
+#endif
+
+#ifndef ROOT_Math_Error
+#include "Math/Error.h"
+#endif
+
+#ifndef ROOT_Fit_ParameterSettings
+#include "Fit/ParameterSettings.h"
+#endif
+
+
+#include <vector>
+#include <string>
+
+#include <limits>
+#include <cmath>
+
+
+namespace BA_ROOT {
+
+
+   namespace Math {
+
+/**
+   @defgroup MultiMin Multi-dimensional Minimization
+   @ingroup NumAlgo
+
+   Classes implementing algorithms for multi-dimensional minimization
+ */
+
+
+
+//_______________________________________________________________________________
+/**
+   Abstract Minimizer class, defining  the interface for the various minimizer
+   (like Minuit2, Minuit, GSL, etc..)
+   Plug-in's exist in ROOT to be able to instantiate the derived classes like
+   ROOT::Math::GSLMinimizer or ROOT::Math::Minuit2Minimizer via the
+   plug-in manager.
+
+   Provides interface for setting the function to be minimized.
+   The function must  implemente the multi-dimensional generic interface
+   ROOT::Math::IBaseFunctionMultiDim.
+   If the function provides gradient calculation
+   (implements the ROOT::Math::IGradientFunctionMultiDim interface) this will be
+   used by the Minimizer.
+
+   It Defines also interface for setting the initial values for the function variables (which are the parameters in
+   of the model function in case of solving for fitting) and especifying their limits.
+
+   It defines the interface to set and retrieve basic minimization parameters
+   (for specific Minimizer parameters one must use the derived classes).
+
+   Then it defines the interface to retrieve the result of minimization ( minimum X values, function value,
+   gradient, error on the mimnimum, etc...)
+
+   @ingroup MultiMin
+*/
+
+class Minimizer {
+
+public:
+
+   /**
+      Default constructor
+   */
+   Minimizer () :
+      fValidError(false),
+      fStatus(-1)
+   {}
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~Minimizer ()  {}
+
+
+
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /**
+      Copy constructor
+   */
+   Minimizer(const Minimizer &) {}
+
+   /**
+      Assignment operator
+   */
+   Minimizer & operator = (const Minimizer & rhs)  {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+public:
+
+   /// reset for consecutive minimizations - implement if needed
+   virtual void Clear() {}
+
+   /// set the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGenFunction & func) = 0;
+
+   /// set a function to minimize using gradient
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGradFunction & func)
+   {
+      SetFunction(static_cast<const ::BA_ROOT::Math::IMultiGenFunction &> (func));
+   }
+
+
+   /// add variables  . Return number of variables successfully added
+   template<class VariableIterator>
+   int SetVariables(const VariableIterator & begin, const VariableIterator & end) {
+      unsigned int ivar = 0;
+      for ( VariableIterator vitr = begin; vitr != end; ++vitr) {
+         bool iret = false;
+         if (vitr->IsFixed() )
+            iret = SetFixedVariable(ivar,  vitr->Name(), vitr->Value() );
+         else if (vitr->IsDoubleBound() )
+            iret = SetLimitedVariable(ivar,  vitr->Name(), vitr->Value(), vitr->StepSize(), vitr->LowerLimit(), vitr->UpperLimit() );
+         else if (vitr->HasLowerLimit() )
+            iret = SetLowerLimitedVariable(ivar,  vitr->Name(), vitr->Value(), vitr->StepSize(), vitr->LowerLimit() );
+         else if (vitr->HasUpperLimit() )
+            iret = SetUpperLimitedVariable(ivar,  vitr->Name(), vitr->Value(), vitr->StepSize(), vitr->UpperLimit() );
+         else
+            iret = SetVariable( ivar, vitr->Name(), vitr->Value(), vitr->StepSize() );
+
+         if (iret) ivar++;
+
+         // an error message should be eventually be reported in the virtual single SetVariable methods
+      }
+      return ivar;
+   }
+   /// set a new free variable
+   virtual bool SetVariable(unsigned int ivar, const std::string & name, double val, double step) = 0;
+   /// set a new lower limit variable  (override if minimizer supports them )
+   virtual bool SetLowerLimitedVariable(unsigned int  ivar , const std::string & name , double val , double step , double lower ) {
+      return SetLimitedVariable(ivar, name, val, step, lower, std::numeric_limits<double>::infinity() );
+   }
+   /// set a new upper limit variable (override if minimizer supports them )
+   virtual bool SetUpperLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double upper ) {
+      return SetLimitedVariable(ivar, name, val, step, - std::numeric_limits<double>::infinity(), upper );
+   }
+   /// set a new upper/lower limited variable (override if minimizer supports them ) otherwise as default set an unlimited variable
+   virtual bool SetLimitedVariable(unsigned int ivar  , const std::string & name  , double val  , double  step ,
+                                   double lower , double  upper ) {
+      MATH_WARN_MSG("Minimizer::SetLimitedVariable","Setting of limited variable not implemented - set as unlimited");
+      MATH_UNUSED(lower); MATH_UNUSED(upper);
+      return SetVariable(ivar, name, val, step);
+   }
+   /// set a new fixed variable (override if minimizer supports them )
+   virtual bool SetFixedVariable(unsigned int  ivar  , const std::string &  name , double val  ) {
+      MATH_ERROR_MSG("Minimizer::SetFixedVariable","Setting of fixed variable not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(name); MATH_UNUSED(val);
+      return false;
+   }
+   /// set the value of an already existing variable
+   virtual bool SetVariableValue(unsigned int ivar , double value) {
+      MATH_ERROR_MSG("Minimizer::SetVariableValue","Set of a variable value not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(value);
+      return false;
+   }
+   /// set the values of all existing variables (array must be dimensioned to the size of the existing parameters)
+   virtual bool SetVariableValues(const double * x) {
+      bool ret = true;
+      unsigned int i = 0;
+      while ( i <= NDim() && ret) {
+         ret &= SetVariableValue(i,x[i] ); i++;
+      }
+      return ret;
+   }
+   /// set the step size of an already existing variable
+   virtual bool SetVariableStepSize(unsigned int ivar, double value ) {
+      MATH_ERROR_MSG("Minimizer::SetVariableStepSize","Setting an existing variable step size not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(value);
+      return false;
+   }
+   /// set the lower-limit of an already existing variable
+   virtual bool SetVariableLowerLimit(unsigned int ivar, double lower) {
+      MATH_ERROR_MSG("Minimizer::SetVariableLowerLimit","Setting an existing variable limit not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(lower);
+      return false;
+   }
+   /// set the upper-limit of an already existing variable
+   virtual bool SetVariableUpperLimit(unsigned int ivar, double upper) {
+      MATH_ERROR_MSG("Minimizer::SetVariableUpperLimit","Setting an existing variable limit not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(upper);
+      return false;
+   }
+   /// set the limits of an already existing variable
+   virtual bool SetVariableLimits(unsigned int ivar, double lower, double upper) {
+      return SetVariableLowerLimit(ivar,lower) && SetVariableUpperLimit(ivar,upper);
+   }
+   /// fix an existing variable
+   virtual bool FixVariable(unsigned int ivar) {
+      MATH_ERROR_MSG("Minimizer::FixVariable","Fixing an existing variable not implemented");
+      MATH_UNUSED(ivar);
+      return false;
+   }
+   /// release an existing variable
+   virtual bool ReleaseVariable(unsigned int ivar) {
+      MATH_ERROR_MSG("Minimizer::ReleaseVariable","Releasing an existing variable not implemented");
+      MATH_UNUSED(ivar);
+      return false;
+   }
+   /// query if an existing variable is fixed (i.e. considered constant in the minimization)
+   /// note that by default all variables are not fixed
+   virtual bool IsFixedVariable(unsigned int ivar) const {
+      MATH_ERROR_MSG("Minimizer::IsFixedVariable","Quering an existing variable not implemented");
+      MATH_UNUSED(ivar);
+      return false;
+   }
+   /// get variable settings in a variable object (like ROOT::Fit::ParamsSettings)
+   virtual bool GetVariableSettings(unsigned int ivar, BA_ROOT::Fit::ParameterSettings & pars) const {
+      MATH_ERROR_MSG("Minimizer::GetVariableSettings","Quering an existing variable not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(pars);
+      return false;
+   }
+
+
+   /// set the initial range of an existing variable
+   virtual bool SetVariableInitialRange(unsigned int /* ivar */, double /* mininitial */, double /* maxinitial */) {
+     return false;
+   }
+
+   /// method to perform the minimization
+   virtual  bool Minimize() = 0;
+
+   /// return minimum function value
+   virtual double MinValue() const = 0;
+
+   /// return  pointer to X values at the minimum
+   virtual const double *  X() const = 0;
+
+   /// return expected distance reached from the minimum (re-implement if minimizer provides it
+   virtual double Edm() const { return -1; }
+
+   /// return pointer to gradient values at the minimum
+   virtual const double *  MinGradient() const { return NULL; }
+
+   /// number of function calls to reach the minimum
+   virtual unsigned int NCalls() const { return 0; }
+
+   /// number of iterations to reach the minimum
+   virtual unsigned int NIterations() const { return NCalls(); }
+
+   /// this is <= Function().NDim() which is the total
+   /// number of variables (free+ constrained ones)
+   virtual unsigned int NDim() const = 0;
+
+   /// number of free variables (real dimension of the problem)
+   /// this is <= Function().NDim() which is the total
+   /// (re-implement if minimizer supports bounded parameters)
+   virtual unsigned int NFree() const { return NDim(); }
+
+   /// minimizer provides error and error matrix
+   virtual bool ProvidesError() const { return false; }
+
+   /// return errors at the minimum
+   virtual const double * Errors() const { return NULL; }
+
+   /** return covariance matrices element for variables ivar,jvar
+       if the variable is fixed the return value is zero
+       The ordering of the variables is the same as in the parameter and errors vectors
+   */
+   virtual double CovMatrix(unsigned int  ivar , unsigned int jvar ) const {
+      MATH_UNUSED(ivar); MATH_UNUSED(jvar);
+      return 0;
+   }
+
+   /**
+       Fill the passed array with the  covariance matrix elements
+       if the variable is fixed or const the value is zero.
+       The array will be filled as cov[i *ndim + j]
+       The ordering of the variables is the same as in errors and parameter value.
+       This is different from the direct interface of Minuit2 or TMinuit where the
+       values were obtained only to variable parameters
+   */
+   virtual bool GetCovMatrix(double * covMat) const {
+      MATH_UNUSED(covMat);
+      return false;
+   }
+
+   /**
+       Fill the passed array with the Hessian matrix elements
+       The Hessian matrix is the matrix of the second derivatives
+       and is the inverse of the covariance matrix
+       If the variable is fixed or const the values for that variables are zero.
+       The array will be filled as h[i *ndim + j]
+   */
+   virtual bool GetHessianMatrix(double * hMat) const {
+      MATH_UNUSED(hMat);
+      return false;
+   }
+
+
+   ///return status of covariance matrix
+   /// using Minuit convention {0 not calculated 1 approximated 2 made pos def , 3 accurate}
+   /// Minimizer who implements covariance matrix calculation will re-implement the method
+   virtual int CovMatrixStatus() const {
+      return 0;
+   }
+
+   /**
+      return correlation coefficient between variable i and j.
+      If the variable is fixed or const the return value is zero
+    */
+   virtual double Correlation(unsigned int i, unsigned int j ) const {
+      double tmp = CovMatrix(i,i) * CovMatrix(j,j);
+      return ( tmp < 0) ? 0 : CovMatrix(i,j) / std::sqrt( tmp );
+   }
+
+   /**
+      return global correlation coefficient for variable i
+      This is a number between zero and one which gives
+      the correlation between the i-th parameter  and that linear combination of all
+      other parameters which is most strongly correlated with i.
+      Minimizer must overload method if implemented
+    */
+   virtual double GlobalCC(unsigned int ivar) const {
+      MATH_UNUSED(ivar);
+      return -1;
+   }
+
+   /**
+      minos error for variable i, return false if Minos failed or not supported
+      and the lower and upper errors are returned in errLow and errUp
+      An extra flag  specifies if only the lower (option=-1) or the upper (option=+1) error calculation is run
+      (This feature is not yet implemented)
+   */
+   virtual bool GetMinosError(unsigned int ivar , double & errLow, double & errUp, int option = 0) {
+      MATH_ERROR_MSG("Minimizer::GetMinosError","Minos Error not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(errLow); MATH_UNUSED(errUp); MATH_UNUSED(option);
+      return false;
+   }
+
+   /**
+      perform a full calculation of the Hessian matrix for error calculation
+    */
+   virtual bool Hesse() {
+      MATH_ERROR_MSG("Minimizer::Hesse","Hesse not implemented");
+      return false;
+   }
+
+   /**
+      scan function minimum for variable i. Variable and function must be set before using Scan
+      Return false if an error or if minimizer does not support this functionality
+    */
+   virtual bool Scan(unsigned int ivar , unsigned int & nstep , double * x , double * y ,
+                     double xmin = 0, double xmax = 0) {
+      MATH_ERROR_MSG("Minimizer::Scan","Scan not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(nstep); MATH_UNUSED(x); MATH_UNUSED(y);
+      MATH_UNUSED(xmin); MATH_UNUSED(xmax);
+      return false;
+   }
+
+   /**
+      find the contour points (xi, xj) of the function for parameter ivar and jvar around the minimum
+      The contour will be find for value of the function = Min + ErrorUp();
+    */
+   virtual bool Contour(unsigned int ivar , unsigned int jvar, unsigned int & npoints,
+                        double *  xi , double * xj ) {
+      MATH_ERROR_MSG("Minimizer::Contour","Contour not implemented");
+      MATH_UNUSED(ivar); MATH_UNUSED(jvar); MATH_UNUSED(npoints);
+      MATH_UNUSED(xi); MATH_UNUSED(xj);
+      return false;
+   }
+
+   /// return reference to the objective function
+   ///virtual const ROOT::Math::IGenFunction & Function() const = 0;
+
+   /// print the result according to set level (implemented for TMinuit for mantaining Minuit-style printing)
+   virtual void PrintResults() {}
+
+   /// get name of variables (override if minimizer support storing of variable names)
+   /// return an empty string if variable is not found
+   virtual std::string VariableName(unsigned int ivar) const {
+      MATH_UNUSED(ivar);
+      return std::string(); // return empty string
+   }
+
+   /// get index of variable given a variable given a name
+   /// return -1 if variable is not found
+   virtual int VariableIndex(const std::string & name) const {
+      MATH_ERROR_MSG("Minimizer::VariableIndex","Getting variable index from name not implemented");
+      MATH_UNUSED(name);
+      return -1;
+   }
+
+   /** minimizer configuration parameters **/
+
+   /// set print level
+   int PrintLevel() const { return fOptions.PrintLevel(); }
+
+   ///  max number of function calls
+   unsigned int MaxFunctionCalls() const { return fOptions.MaxFunctionCalls(); }
+
+   /// max iterations
+   unsigned int MaxIterations() const { return fOptions.MaxIterations(); }
+
+   /// absolute tolerance
+   double Tolerance() const { return  fOptions.Tolerance(); }
+
+   /// precision of minimizer in the evaluation of the objective function
+   /// ( a value <=0 corresponds to the let the minimizer choose its default one)
+   double Precision() const { return fOptions.Precision(); }
+
+   /// strategy
+   int Strategy() const { return fOptions.Strategy(); }
+
+   /// status code of minimizer
+   int Status() const { return fStatus; }
+
+   /// return the statistical scale used for calculate the error
+   /// is typically 1 for Chi2 and 0.5 for likelihood minimization
+   double ErrorDef() const { return fOptions.ErrorDef(); }
+
+   ///return true if Minimizer has performed a detailed error validation (e.g. run Hesse for Minuit)
+   bool IsValidError() const { return fValidError; }
+
+   /// retrieve the minimizer options (implement derived class if needed)
+   virtual MinimizerOptions  Options() const {
+      return fOptions;
+   }
+
+   /// set print level
+   void SetPrintLevel(int level) { fOptions.SetPrintLevel(level); }
+
+   ///set maximum of function calls
+   void SetMaxFunctionCalls(unsigned int maxfcn) { if (maxfcn > 0) fOptions.SetMaxFunctionCalls(maxfcn); }
+
+   /// set maximum iterations (one iteration can have many function calls)
+   void SetMaxIterations(unsigned int maxiter) { if (maxiter > 0) fOptions.SetMaxIterations(maxiter); }
+
+   /// set the tolerance
+   void SetTolerance(double tol) { fOptions.SetTolerance(tol); }
+
+   /// set in the minimizer the objective function evaluation precision
+   /// ( a value <=0 means the minimizer will choose its optimal value automatically, i.e. default case)
+   void SetPrecision(double prec) { fOptions.SetPrecision(prec); }
+
+   ///set the strategy
+   void SetStrategy(int strategyLevel) { fOptions.SetStrategy(strategyLevel); }
+
+   /// set scale for calculating the errors
+   void SetErrorDef(double up) { fOptions.SetErrorDef(up); }
+
+   /// flag to check if minimizer needs to perform accurate error analysis (e.g. run Hesse for Minuit)
+   void SetValidError(bool on) { fValidError = on; }
+
+   /// set all options in one go
+   void SetOptions(const MinimizerOptions & opt) {
+      fOptions = opt;
+   }
+
+   /// reset the defaut options (defined in MinimizerOptions)
+   void SetDefaultOptions() {
+      fOptions.ResetToDefaultOptions();
+   }
+
+protected:
+
+
+//private:
+
+
+   // keep protected to be accessible by the derived classes
+
+
+   bool fValidError;            // flag to control if errors have been validated (Hesse has been run in case of Minuit)
+   MinimizerOptions fOptions;   // minimizer options
+   int fStatus;                 // status of minimizer
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_Minimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/MinimizerOptions.h b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimizerOptions.h
new file mode 100644
index 0000000..f11557e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimizerOptions.h
@@ -0,0 +1,172 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Fri Aug 15 2008
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2008  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Math_MinimizerOptions
+#define ROOT_Math_MinimizerOptions
+
+#include <string>
+
+#include <iostream>
+
+namespace BA_ROOT {
+
+
+namespace Math {
+
+
+class IOptions;
+
+//_______________________________________________________________________________
+/**
+    Minimizer options
+
+    @ingroup MultiMin
+*/
+class MinimizerOptions {
+
+public:
+
+   // static methods for setting and retrieving the default options
+
+   static void SetDefaultMinimizer(const char * type, const char * algo = 0);
+   static void SetDefaultErrorDef( double up);
+   static void SetDefaultTolerance(double tol);
+   static void SetDefaultPrecision(double prec);
+   static void SetDefaultMaxFunctionCalls(int maxcall);
+   static void SetDefaultMaxIterations(int maxiter);
+   static void SetDefaultStrategy(int strat);
+   static void SetDefaultPrintLevel(int level);
+   static void SetDefaultExtraOptions(const IOptions * extraoptions);
+
+   static const std::string & DefaultMinimizerType();
+   static const std::string & DefaultMinimizerAlgo();
+   static double DefaultErrorDef();
+   static double DefaultTolerance();
+   static double DefaultPrecision();
+   static int DefaultMaxFunctionCalls();
+   static int DefaultMaxIterations();
+   static int DefaultStrategy();
+   static int DefaultPrintLevel();
+   static IOptions * DefaultExtraOptions();
+
+   /// retrieve extra options - if not existing create a IOptions
+   static BA_ROOT::Math::IOptions & Default(const char * name);
+
+   // find extra options - return 0 if not existing
+   static BA_ROOT::Math::IOptions * FindDefault(const char * name);
+
+   /// print all the default options for the name given
+   static void PrintDefault(const char * name, std::ostream & os = std::cout);
+
+public:
+
+   // constructor using the default options
+   MinimizerOptions();
+
+   // destructor
+   ~MinimizerOptions();
+
+   // copy constructor
+   MinimizerOptions(const MinimizerOptions & opt);
+
+   /// assignment operators
+   MinimizerOptions & operator=(const MinimizerOptions & opt);
+
+   /** non-static methods for retrieving options */
+
+   /// set print level
+   int PrintLevel() const { return fLevel; }
+
+   ///  max number of function calls
+   unsigned int MaxFunctionCalls() const { return fMaxCalls; }
+
+   /// max iterations
+   unsigned int MaxIterations() const { return fMaxIter; }
+
+   /// strategy
+   int Strategy() const { return fStrategy; }
+
+   /// absolute tolerance
+   double Tolerance() const { return  fTolerance; }
+
+   /// precision in the objective funciton calculation (value <=0 means left to default)
+   double Precision() const { return  fPrecision; }
+
+   /// error definition
+   double ErrorDef() const { return  fErrorDef; }
+
+   /// return extra options (NULL pointer if they are not present)
+   const IOptions * ExtraOptions() const { return fExtraOptions; }
+
+   /// type of minimizer
+   const std::string & MinimizerType() const { return fMinimType; }
+
+   /// type of algorithm
+   const std::string & MinimizerAlgorithm() const { return fAlgoType; }
+
+   /// print all the options
+   void Print(std::ostream & os = std::cout) const;
+
+   /** non-static methods for setting options */
+   void ResetToDefaultOptions();
+
+   /// set print level
+   void SetPrintLevel(int level) { fLevel = level; }
+
+   ///set maximum of function calls
+   void SetMaxFunctionCalls(unsigned int maxfcn) { fMaxCalls = maxfcn; }
+
+   /// set maximum iterations (one iteration can have many function calls)
+   void SetMaxIterations(unsigned int maxiter) { fMaxIter = maxiter; }
+
+   /// set the tolerance
+   void SetTolerance(double tol) { fTolerance = tol; }
+
+   /// set the precision
+   void SetPrecision(double prec) { fPrecision = prec; }
+
+   /// set the strategy
+   void SetStrategy(int stra) { fStrategy = stra; }
+
+   /// set error def
+   void SetErrorDef(double err) { fErrorDef = err; }
+
+   /// set minimizer type
+   void SetMinimizerType(const char * type) { fMinimType = type; }
+
+   /// set minimizer algorithm
+   void SetMinimizerAlgorithm(const char *type) { fAlgoType = type; }
+
+   /// set extra options (in this case pointer is cloned)
+   void SetExtraOptions(const IOptions & opt);
+
+
+private:
+
+   int fLevel;               // debug print level
+   int fMaxCalls;            // maximum number of function calls
+   int fMaxIter;             // maximum number of iterations
+   int fStrategy;            // minimizer strategy (used by Minuit)
+   double fErrorDef;         // error definition (=1. for getting 1 sigma error for chi2 fits)
+   double fTolerance;        // minimize tolerance to reach solution
+   double fPrecision;        // precision of the objective function evaluation (value <=0 means left to default)
+   std::string fMinimType;   // Minimizer type (Minuit, Minuit2, etc..
+   std::string fAlgoType;    // Minimizer algorithmic specification (Migrad, Minimize, ...)
+
+   // extra options
+   BA_ROOT::Math::IOptions *   fExtraOptions;  // extra options
+
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/MinimizerVariableTransformation.h b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimizerVariableTransformation.h
new file mode 100644
index 0000000..5c6568e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/MinimizerVariableTransformation.h
@@ -0,0 +1,93 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta 2009
+
+// Header file for class MinimizerVariable
+
+#ifndef ROOT_Math_MinimizerVariableTransformation
+#define ROOT_Math_MinimizerVariableTransformation
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+/**
+   Base class for MinimizerVariable transformations defining the functions to deal
+   with bounded parameters
+
+   @ingroup MultiMin
+*/
+
+class MinimizerVariableTransformation {
+
+public:
+
+   virtual ~MinimizerVariableTransformation() {}
+
+   virtual double Int2ext(double value, double lower, double upper) const = 0;
+   virtual double Ext2int(double value, double lower, double upper) const = 0;
+   virtual double DInt2Ext(double value, double lower, double upper) const = 0;
+
+};
+
+
+/**
+   Sin Transformation class for dealing with double bounded variables
+
+   @ingroup MultiMin
+*/
+class SinVariableTransformation : public MinimizerVariableTransformation {
+
+public:
+
+   virtual ~SinVariableTransformation() {}
+
+   double Int2ext(double value, double lower, double upper) const;
+   double Ext2int(double value, double lower, double upper) const;
+   double DInt2Ext(double value, double lower, double upper) const;
+
+private:
+
+
+};
+
+/**
+   Sqrt Transformation class for dealing with lower bounded variables
+
+   @ingroup MultiMin
+*/
+class SqrtLowVariableTransformation : public  MinimizerVariableTransformation {
+public:
+
+   virtual ~SqrtLowVariableTransformation() {}
+
+   double Int2ext(double value, double lower, double upper) const;
+   double Ext2int(double value, double lower, double upper) const;
+   double DInt2Ext(double value, double lower, double upper) const;
+
+};
+
+/**
+   Sqrt Transformation class for dealing with upper bounded variables
+
+   @ingroup MultiMin
+*/
+class SqrtUpVariableTransformation : public  MinimizerVariableTransformation {
+public:
+
+   virtual ~SqrtUpVariableTransformation() {}
+
+   double Int2ext(double value, double lower, double upper) const;
+   double Ext2int(double value, double lower, double upper) const;
+   double DInt2Ext(double value, double lower, double upper) const;
+
+};
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_MinimizerVariableTransformation */
+
+
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/MultiNumGradFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Math/MultiNumGradFunction.h
new file mode 100644
index 0000000..ef51f42
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/MultiNumGradFunction.h
@@ -0,0 +1,145 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Dec 20 14:36:31 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class MultiNumGradFunction
+
+#ifndef ROOT_Math_MultiNumGradFunction
+#define ROOT_Math_MultiNumGradFunction
+
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+
+#ifndef ROOT_Math_WrappedFunction
+#include "Math/WrappedFunction.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+/**
+   MultiNumGradFunction class to wrap a normal function in  a
+   gradient function using numerical gradient calculation
+   provided by the class Derivator (based on GSL numerical derivation)
+
+
+   @ingroup MultiMin
+*/
+class MultiNumGradFunction : public IMultiGradFunction {
+
+public:
+
+
+   /**
+     Constructor from a IMultiGenFunction interface
+   */
+   MultiNumGradFunction (const IMultiGenFunction & f) :
+      fFunc(&f),
+      fDim(f.NDim() ),
+      fNCalls(0),
+      fOwner(false)
+   {}
+
+   /**
+     Constructor from a generic function (pointer or reference) and number of dimension
+     implementiong operator () (double * x)
+   */
+
+   template<class FuncType>
+   MultiNumGradFunction (FuncType f, int n) :
+      fDim( n ),
+      fNCalls(0),
+      fOwner(true)
+   {
+      // create a wrapped function
+      fFunc = new BA_ROOT::Math::WrappedMultiFunction<FuncType> (f, n);
+   }
+
+   /**
+      Destructor (no operations)
+   */
+   ~MultiNumGradFunction ()  {
+      if (fOwner) delete fFunc;
+   }
+
+
+   // method inheritaed from IFunction interface
+
+   unsigned int NDim() const { return fDim; }
+
+   unsigned int NCalls() const { return fNCalls; }
+
+   IMultiGenFunction * Clone() const {
+      if (!fOwner)
+         return new MultiNumGradFunction(*fFunc);
+      else {
+         // we need to copy the pointer to the wrapped function
+         MultiNumGradFunction * f =  new MultiNumGradFunction(*(fFunc->Clone()) );
+         f->fOwner = true;
+         return f;
+      }
+   }
+
+   // set ownership
+   void SetOwnership(bool on = true) { fOwner = on;  }
+
+   /// precision value used for calculating the derivative step-size
+   /// h = eps * |x|. The default is 0.001, give a smaller in case function chanes rapidly
+   static void SetDerivPrecision(double eps);
+
+   /// get precision value used for calculating the derivative step-size
+   static double GetDerivPrecision();
+
+
+private:
+
+
+   double DoEval(const double * x) const {
+      fNCalls++;
+      return (*fFunc)(x);
+   }
+
+   // calculate derivative using mathcore derivator
+   double DoDerivative (const double * x, unsigned int icoord  ) const;
+
+   // adapat internal function type to IMultiGenFunction needed by derivative calculation
+   const IMultiGenFunction * fFunc;
+   unsigned int fDim;
+   mutable unsigned int fNCalls;
+   bool fOwner;
+
+   static double fgEps;          // epsilon used in derivative calculation h ~ eps |x|
+
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_NumGradFunction */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/OneDimFunctionAdapter.h b/ThirdParty/Fit/RootMinimizers/inc/Math/OneDimFunctionAdapter.h
new file mode 100644
index 0000000..dee8125
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/OneDimFunctionAdapter.h
@@ -0,0 +1,283 @@
+// @(#)root/mathmore:$Id: OneDimFunctionAdapter.h 20063 2007-09-24 13:16:14Z moneta $
+// Author: L. Moneta Wed Dec  6 11:45:55 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class OneDimMultiFunctionAdapter
+
+#ifndef ROOT_Math_OneDimFunctionAdapter
+#define ROOT_Math_OneDimFunctionAdapter
+
+#ifndef ROOT_Math_IFunction
+#include "Math/IFunction.h"
+#endif
+#ifndef ROOT_Math_IParamFunction
+#include "Math/IParamFunction.h"
+#endif
+
+#include <cassert>
+
+namespace BA_ROOT {
+
+namespace Math {
+
+
+
+// struct using for evaluating the function
+template<class MultiFuncType>
+struct EvaluatorOneDim {
+   // evaluate function (in general case no param)
+   static double F (MultiFuncType f, const double * x, const double *  = 0 ) {
+      return f( x );
+   }
+};
+// specialized for param functions
+template<>
+struct EvaluatorOneDim< const BA_ROOT::Math::IParamMultiFunction &> {
+   static double F ( const BA_ROOT::Math::IParamMultiFunction &  f, const double * x, const double * p = 0 ) {
+      return f( x, p );
+   }
+};
+
+
+/**
+   OneDimMultiFunctionAdapter class to wrap a multidimensional function in
+   one dimensional one.
+   Given a f(x1,x2,x3,....xn) transforms in a f( x_i) given the coordinate intex i and the vector x[]
+   of the coordinates.
+   It provides the possibility to copy and own the data array of the coordinates or to maintain internally a pointer to an external array
+   for being more efficient. In this last case the user must garantee the life of the given passed pointer
+
+   @ingroup  GenFunc
+
+*/
+template <class MultiFuncType = const BA_ROOT::Math::IMultiGenFunction &>
+class OneDimMultiFunctionAdapter : public BA_ROOT::Math::IGenFunction  {
+
+public:
+
+
+   /**
+      Constructor from the function object , pointer to an external array of x values
+      and coordinate we want to adapt
+   */
+   OneDimMultiFunctionAdapter (MultiFuncType f, const double * x, unsigned int icoord =0, const double * p = 0 ) :
+      fFunc(f),
+      fX( const_cast<double *>(x) ), // wee need to modify x but then we restore it as before
+      fParams(p),
+      fCoord(icoord),
+      fDim(0),
+      fOwn(false)
+   {
+      assert(fX != 0);
+   }
+   /**
+      Constructor from the function object , dimension of the function and
+      and coordinate we want to adapt.
+      The coordinate cached vector is created inside and eventually the values must be passed
+      later with the SetX which will copy them
+   */
+   OneDimMultiFunctionAdapter (MultiFuncType f, unsigned int dim = 1, unsigned int icoord =0, const double * p = 0 ) :
+      fFunc(f),
+      fX(0 ),
+      fParams(p),
+      fCoord(icoord),
+      fDim(dim),
+      fOwn(true)
+   {
+      fX = new double[dim];
+   }
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~OneDimMultiFunctionAdapter ()  { if (fOwn && fX) delete [] fX; }
+
+   /**
+      clone
+   */
+   virtual OneDimMultiFunctionAdapter * Clone( ) const {
+      if (fOwn) {
+         OneDimMultiFunctionAdapter * f =  new OneDimMultiFunctionAdapter( fFunc, fDim, fCoord, fParams);
+         std::copy(fX, fX+fDim, f->fX);
+         return f;
+      }
+      else
+         return new OneDimMultiFunctionAdapter( fFunc, fX, fCoord, fParams);
+   }
+
+public:
+
+   /**
+       Set X values in case vector is own, iterator size must match previous
+       set dimension
+   */
+   template<class Iterator>
+   void SetX(Iterator begin, Iterator end) {
+      if (fOwn) std::copy(begin, end, fX);
+   }
+
+
+   /**
+      set pointer without copying the values
+    */
+   void SetX(double * x) {
+      if (!fOwn) fX = x;
+   }
+
+   /**
+       set values
+   */
+   void SetX(const double * x) {
+      if (fOwn) std::copy(x, x+fDim, fX);
+      else
+         SetX( const_cast<double *>(x) ); // wee need to modify x but then we restore it as before
+   }
+
+
+   void SetCoord(int icoord) { fCoord=icoord;}
+
+   // copy constructor
+   OneDimMultiFunctionAdapter( const OneDimMultiFunctionAdapter & rhs) :
+      fFunc(rhs.fFunc),
+      fParams(rhs.fParams),
+      fCoord(rhs.fCoord),
+      fDim(rhs.fDim),
+      fOwn(rhs.fOwn)
+   {
+      if (fOwn) {
+         fX = new double[fDim];
+         std::copy( rhs.fX, rhs.fX+fDim, fX);
+      }
+      else fX = rhs.fX;
+   }
+
+
+private:
+
+   // dummy assignment (should never be called and clone must be used)
+   OneDimMultiFunctionAdapter & operator= ( const OneDimMultiFunctionAdapter & rhs) {
+      if (this == &rhs)  return *this;
+      assert(false);
+   }
+
+   /**
+      evaluate function at the  values x[] given in the constructor and
+      as function of  the coordinate fCoord.
+   */
+   double DoEval(double x) const {
+      if (fOwn) {
+         fX[fCoord] = x;
+         return EvaluatorOneDim<MultiFuncType>::F( fFunc, fX, fParams );
+      }
+      else {
+
+         // case vector fX represents useful values needed later
+         // need to modify fX and restore afterwards the original values
+         double xprev = fX[fCoord]; // keep original value to restore in fX
+         fX[fCoord] = x;
+         double y = EvaluatorOneDim<MultiFuncType>::F( fFunc, fX, fParams );
+         // restore original values
+         fX[fCoord] = xprev;
+         return y;
+      }
+   }
+
+
+private:
+
+   MultiFuncType fFunc;
+   mutable double * fX;
+   const double   * fParams;
+   unsigned int fCoord;
+   unsigned int fDim;
+   bool fOwn;
+
+};
+
+
+/**
+   OneDimParamFunctionAdapter class to wrap a multi-dim parameteric function in
+   one dimensional one.
+   Given a f(x[],p1,...pn) transforms in a f( p_i) given the param index i and the vectors x[] and p[]
+   of the coordinates and parameters
+   It has to be used carefully, since for efficiency reason it does not copy the parameter object
+   but re-uses the given pointer for  the p[] vector.
+   The ParamFuncType reference by default is not const because the operator()(x,p) is not a const method
+
+   @ingroup  GenFunc
+
+*/
+template <class ParamFuncType = BA_ROOT::Math::IParamMultiFunction &>
+class OneDimParamFunctionAdapter :  public BA_ROOT::Math::IGenFunction {
+
+public:
+
+
+   /**
+      Constructor from the function object , x value and coordinate we want to adapt
+   */
+   OneDimParamFunctionAdapter (ParamFuncType f, const double * x, const double * p, unsigned int ipar =0 ) :
+      fFunc(f),
+      fX(x ),
+      fParams(p),
+      fIpar(ipar)
+   {
+      assert(fX != 0);
+      assert(fParams != 0);
+   }
+
+   /**
+      Destructor (no operations)
+   */
+   ~OneDimParamFunctionAdapter ()  {}
+
+   /**
+      clone
+   */
+   virtual OneDimParamFunctionAdapter * Clone( ) const {
+      return new OneDimParamFunctionAdapter(fFunc, fX, fParams, fIpar);
+   }
+
+   // can use default copy constructor
+
+private:
+
+   /**
+      evaluate function at the  values x[] given in the constructor and
+      as function of  the coordinate fCoord.
+   */
+   double DoEval(double x) const {
+      // HACK: use const_cast to modify the function values x[] and restore afterwards the original ones
+      double * p = const_cast<double *>(fParams);
+      double pprev = fParams[fIpar]; // keep original value to restore in fX
+      p[fIpar] = x;
+      double y =  fFunc( fX, p );
+      p[fIpar] = pprev;
+      return y;
+   }
+
+
+private:
+
+   ParamFuncType fFunc;
+   const double * fX;
+   const double * fParams;
+   unsigned int fIpar;
+
+};
+
+
+
+
+} // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_OneDimFunctionAdapter */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/PatchedGSLNLSMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Math/PatchedGSLNLSMinimizer.h
new file mode 100644
index 0000000..c09b4fa
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/PatchedGSLNLSMinimizer.h
@@ -0,0 +1,269 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Dec 20 17:16:32 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class GSLNLSMinimizer
+
+#ifndef ROOT_Math_GSLNLSMinimizer
+#define ROOT_Math_GSLNLSMinimizer
+
+
+
+#ifndef ROOT_Math_BasicMinimizer
+#include "Math/BasicMinimizer.h"
+#endif
+
+
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_FitMethodFunction
+#include "Math/FitMethodFunction.h"
+#endif
+
+#ifndef ROOT_Math_MinimTransformVariable
+#include "Math/MinimTransformVariable.h"
+#endif
+
+
+#include <vector>
+#include <map>
+#include <string>
+
+namespace BA_ROOT { 
+
+   namespace Math { 
+
+      class GSLMultiFit; 
+
+
+//________________________________________________________________________________
+/** 
+    LSResidualFunc class description. 
+    Internal class used for accessing the residuals of the Least Square function
+    and their derivates which are estimated numerically using GSL numerical derivation. 
+    The class contains a pointer to the fit method function and an index specifying 
+    the i-th residual and wraps it in a multi-dim gradient function interface
+    ROOT::Math::IGradientFunctionMultiDim. 
+    The class is used by ROOT::Math::GSLNLSMinimizer (GSL non linear least square fitter)
+
+    @ingroup MultiMin
+*/
+class LSResidualFunc : public IMultiGradFunction { 
+public: 
+
+   //default ctor (required by CINT) 
+   LSResidualFunc() : fIndex(0), fChi2(0)
+   {}
+
+
+   LSResidualFunc(const BA_ROOT::Math::FitMethodFunction & func, unsigned int i) : 
+      fIndex(i), 
+      fChi2(&func), 
+      fX2(std::vector<double>(func.NDim() ) )
+   {}
+
+
+   // copy ctor
+   LSResidualFunc(const LSResidualFunc & rhs) :
+      IMultiGenFunction(), 
+      IMultiGradFunction() 
+   { 
+      operator=(rhs);
+   } 
+
+   // assignment
+   LSResidualFunc & operator= (const LSResidualFunc & rhs) 
+   { 
+      fIndex = rhs.fIndex;
+      fChi2 = rhs.fChi2; 
+      fX2 = rhs.fX2;
+      return *this;
+   } 
+
+   IMultiGenFunction * Clone() const { 
+      return new LSResidualFunc(*fChi2,fIndex); 
+   }
+
+   unsigned int NDim() const { return fChi2->NDim(); }
+
+   void Gradient( const double * x, double * g) const { 
+      double f0 = 0; 
+      FdF(x,f0,g);
+   }
+
+   void FdF (const double * x, double & f, double * g) const { 
+//      unsigned int n = NDim();
+//      std::copy(x,x+n,fX2.begin());
+//      const double kEps = 1.0E-4;
+//      f = DoEval(x);
+//      for (unsigned int i = 0; i < n; ++i) {
+//         fX2[i] += kEps;
+//         g[i] =  ( DoEval(&fX2.front()) - f )/kEps;
+//         fX2[i] = x[i];
+//      }
+       // G.P. Modifications to adjust to BornAgain
+       f = DoEval(x);
+       fChi2->DataElement(x, fIndex, g);
+   } 
+   
+
+private: 
+
+   double DoEval (const double * x) const { 
+      return fChi2->DataElement(x, fIndex);
+   }
+   
+   double DoDerivative(const double * x, unsigned int icoord) const { 
+      //return  ROOT::Math::Derivator::Eval(*this, x, icoord, 1E-8);
+      std::copy(x,x+NDim(),fX2.begin());
+      const double kEps = 1.0E-4;
+      fX2[icoord] += kEps;
+      return ( DoEval(&fX2.front()) - DoEval(x) )/kEps;
+   }
+
+   unsigned int fIndex; 
+   const BA_ROOT::Math::FitMethodFunction * fChi2; 
+   mutable std::vector<double> fX2;  // cached vector
+};
+
+
+//_____________________________________________________________________________________________________
+/** 
+   GSLNLSMinimizer class for Non Linear Least Square fitting
+   It Uses the Levemberg-Marquardt algorithm from 
+   <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Nonlinear-Least_002dSquares-Fitting.html">
+   GSL Non Linear Least Square fitting</A>.
+
+   @ingroup MultiMin
+*/ 
+class GSLNLSMinimizer : public  BA_ROOT::Math::BasicMinimizer {
+
+public: 
+
+   /** 
+      Default constructor
+   */ 
+   GSLNLSMinimizer (int type = 0); 
+
+   /** 
+      Destructor (no operations)
+   */ 
+   ~GSLNLSMinimizer ();  
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /** 
+      Copy constructor
+   */ 
+   GSLNLSMinimizer(const GSLNLSMinimizer &) : BA_ROOT::Math::BasicMinimizer() {} 
+
+   /** 
+      Assignment operator
+   */ 
+   GSLNLSMinimizer & operator = (const GSLNLSMinimizer & rhs)  {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+public: 
+
+   /// set the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGenFunction & func); 
+
+   /// set gradient the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGradFunction & func); 
+
+ 
+   /// method to perform the minimization
+   virtual  bool Minimize(); 
+
+
+   /// return expected distance reached from the minimum
+   virtual double Edm() const { return fEdm; } // not impl. }
+
+
+   /// return pointer to gradient values at the minimum 
+   virtual const double *  MinGradient() const; 
+
+   /// number of function calls to reach the minimum 
+   virtual unsigned int NCalls() const { return (fChi2Func) ? fChi2Func->NCalls() : 0; } 
+
+   /// number of free variables (real dimension of the problem) 
+   /// this is <= Function().NDim() which is the total 
+//   virtual unsigned int NFree() const { return fNFree; }  
+
+   /// minimizer provides error and error matrix
+   virtual bool ProvidesError() const { return true; } 
+
+   /// return errors at the minimum 
+   virtual const double * Errors() const { return (fErrors.size() > 0) ? &fErrors.front() : 0; }
+//  { 
+//       static std::vector<double> err; 
+//       err.resize(fDim);
+//       return &err.front(); 
+//    }
+
+   /** return covariance matrices elements 
+       if the variable is fixed the matrix is zero
+       The ordering of the variables is the same as in errors
+   */ 
+   virtual double CovMatrix(unsigned int , unsigned int ) const;
+
+   /// return covariance matrix status
+   virtual int CovMatrixStatus() const;
+
+protected: 
+
+
+private: 
+   
+
+   unsigned int fNFree;      // dimension of the internal function to be minimized 
+   unsigned int fSize;        // number of fit points (residuals)
+ 
+
+   BA_ROOT::Math::GSLMultiFit * fGSLMultiFit;        // pointer to GSL multi fit solver 
+   const BA_ROOT::Math::FitMethodFunction * fChi2Func;      // pointer to Least square function
+   
+   double fEdm;                                   // edm value
+   double fLSTolerance;                           // Line Search Tolerance
+   std::vector<double> fErrors;
+   std::vector<double> fCovMatrix;              //  cov matrix (stored as cov[ i * dim + j] 
+   std::vector<LSResidualFunc> fResiduals;   //! transient Vector of the residual functions
+
+
+}; 
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_GSLNLSMinimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/PatchedGSLSimAnMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Math/PatchedGSLSimAnMinimizer.h
new file mode 100644
index 0000000..96a4302
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/PatchedGSLSimAnMinimizer.h
@@ -0,0 +1,128 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Dec 20 17:16:32 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class GSLSimAnMinimizer
+
+#ifndef ROOT_Math_GSLSimAnMinimizer
+#define ROOT_Math_GSLSimAnMinimizer
+
+
+
+#ifndef ROOT_Math_BasicMinimizer
+#include "Math/BasicMinimizer.h"
+#endif
+
+
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+#ifndef ROOT_Math_IParamFunctionfwd
+#include "Math/IParamFunctionfwd.h"
+#endif
+
+
+
+#ifndef ROOT_Math_GSLSimAnnealing
+#include "Math/GSLSimAnnealing.h"
+#endif
+
+
+
+
+namespace BA_ROOT { 
+
+   namespace Math { 
+
+
+
+//_____________________________________________________________________________________
+/** 
+   GSLSimAnMinimizer class for minimization using simulated annealing
+   using the algorithm from 
+   <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Simulated-Annealing.html">
+   GSL</A>.
+   It implements the ROOT::Minimizer interface and 
+   a plug-in (name "GSLSimAn") exists to instantiate this class via the plug-in manager
+
+   @ingroup MultiMin
+*/ 
+class GSLSimAnMinimizer : public  BA_ROOT::Math::BasicMinimizer {
+
+public: 
+
+   /** 
+      Default constructor
+   */ 
+   GSLSimAnMinimizer (int type = 0); 
+
+   /** 
+      Destructor (no operations)
+   */ 
+   virtual ~GSLSimAnMinimizer ();  
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /** 
+      Copy constructor
+   */ 
+   GSLSimAnMinimizer(const GSLSimAnMinimizer &) : BA_ROOT::Math::BasicMinimizer() {} 
+
+   /** 
+      Assignment operator
+   */ 
+   GSLSimAnMinimizer & operator = (const GSLSimAnMinimizer & rhs)  {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+public: 
+
+
+   /// method to perform the minimization
+   virtual  bool Minimize(); 
+
+   //number of calls 
+   unsigned int NCalls() const; 
+
+   BA_ROOT::Math::GSLSimAnnealing& getSolver() { return fSolver; }
+
+
+protected: 
+
+private: 
+   
+
+   BA_ROOT::Math::GSLSimAnnealing  fSolver; 
+   
+
+}; 
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_GSLSimAnMinimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/RandomFunctions.h b/ThirdParty/Fit/RootMinimizers/inc/Math/RandomFunctions.h
new file mode 100644
index 0000000..3348b7a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/RandomFunctions.h
@@ -0,0 +1,303 @@
+// @(#)root/mathcore:$Id$
+// Authors: L. Moneta    8/2015
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2015 , ROOT MathLib Team                             *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for random class
+//
+//
+// Created by: Lorenzo Moneta  : Tue 4 Aug 2015
+//
+//
+#ifndef ROOT_Math_RandomFunctions
+#define ROOT_Math_RandomFunctions
+
+
+#include <type_traits>
+#include <cmath>
+//#include "Rtypes.h"
+//#include "TMath.h"
+#include "TMVA/Types.h"
+#include <cassert>
+#include <vector>
+
+#include "TRandomEngine.h"
+
+
+namespace BA_ROOT {
+namespace Math {
+
+
+//___________________________________________________________________________________
+
+
+   // class DefaultEngineType {};
+
+   
+   /**
+       Documentation for the RandomFunction class 
+
+       @ingroup  Random
+   */
+
+
+   typedef TRandomEngine DefaultEngineType;
+   //class DefaultEngineType {};  // for generic types
+
+
+
+      /**
+      Definition of the generic impelmentation class for the RandomFunctions.
+      Needs to have specialized implementations on the different type of engines      
+    */
+   template <class EngineBaseType> 
+   class  RandomFunctionsImpl {
+   public:
+      void SetEngine(void *) {}
+   };
+
+   /**
+      Implementation class for the RandomFunction for all the engined that derives from 
+      TRandomEngine class, which defines an interface which has TRandomEngine::Rndm()
+      In this way we can have a common implementation for the RandomFunctions
+    */
+
+   template<>
+   class RandomFunctionsImpl<TRandomEngine> { 
+
+   public: 
+
+      /// class constructor 
+      RandomFunctionsImpl() {}
+
+      void SetEngine(void *r) {
+         fBaseEngine = static_cast<TRandomEngine*>(r);
+         assert(fBaseEngine);  // to be sure the static cast works 
+      }
+      
+
+      ///Generate binomial numbers
+      int Binomial(int ntot, double prob);
+
+      /// Return a number distributed following a BreitWigner function with mean and gamma.
+      double BreitWigner(double mean, double gamma);
+
+      /// Generates random vectors, uniformly distributed over a circle of given radius.
+      ///   Input : r = circle radius
+      ///   Output: x,y a random 2-d vector of length r
+      void Circle(double &x, double &y, double r);
+
+      /// Returns an exponential deviate.
+      ///    exp( -t/tau )
+      double  Exp(double tau);
+      
+      /// generate Gaussian number using Box-Muller method
+      double GausBM( double mean, double sigma);
+
+      /// generate random numbers according to the Accemptance-Complemet-Ratio method
+      double GausACR( double mean, double sigma);
+
+      /// Generate a random number following a Landau distribution
+      /// with location parameter mu and scale parameter sigma:
+      ///      Landau( (x-mu)/sigma )
+//      double Landau(double mu, double sigma);
+
+      /// Generates a random integer N according to a Poisson law.
+      /// Prob(N) = exp(-mean)*mean^N/Factorial(N)
+//      int Poisson(double mean);
+//      double PoissonD(double mean);
+
+      /// Generate numbers distributed following a gaussian with mean=0 and sigma=1.
+      /// Using the Box-Muller method 
+      void Rannor(double &a, double  &b);
+
+      /// Generates random vectors, uniformly distributed over the surface
+      /// of a sphere of given radius.
+      void Sphere(double &x, double &y, double &z, double r);
+
+      /// generate random numbers following a Uniform distribution in the [a,b] interval
+      double Uniform(double a, double b);
+      double Uniform(double a);
+
+   protected:
+      TRandomEngine * fBaseEngine;
+
+   private:
+      // Internal method used by the functions 
+      double Rndm() { return fBaseEngine->Rndm(); }
+      // for internal usage
+      double Gaus(double mean, double sigma) { return GausACR(mean,sigma); }
+
+
+   };
+
+
+   template < class Engine, class EngineBaseType>
+   class RandomFunctions { //: public RandomFunctionsImpl<EngineBaseType> {
+
+
+   public:
+
+      //RandomFunctions() {} 
+
+      RandomFunctions(Engine & rng) : fEngine(&rng) {
+         fImpl.SetEngine(&rng);
+      }
+
+      /// destructor (no op) we do not mantain the engine)
+      ~RandomFunctions() {}
+
+
+      /// non-virtual method
+      inline double operator() () { return (*fEngine)(); }
+
+
+      ///Generate binomial numbers
+      int Binomial(int ntot, double prob) {
+         return fImpl.Binomial(ntot,prob); 
+      }
+
+      /// Return a number distributed following a BreitWigner function with mean and gamma.
+      double BreitWigner(double mean, double gamma) {
+         return fImpl.BreitWigner(mean,gamma);
+      }
+
+      /// Generates random vectors, uniformly distributed over a circle of given radius.
+      ///   Input : r = circle radius
+      ///   Output: x,y a random 2-d vector of length r
+      void Circle(double &x, double &y, double r) {
+         return fImpl.Circle(x,y,r);
+      }
+
+      /// Returns an exponential deviate.
+      ///    exp( -t/tau )
+      double  Exp(double tau) {
+         return fImpl.Exp(tau); 
+      }
+      
+      /// generate Gaussian number using Box-Muller method
+      double GausBM( double mean, double sigma) {
+         return fImpl.GausBM(mean,sigma);
+      }
+
+      /// generate random numbers according to the Accemptance-Complemet-Ratio method
+      double GausACR( double mean, double sigma) {
+         return fImpl.GausACR(mean, sigma); 
+      }
+
+      /// Generate a random number following a Landau distribution
+      /// with location parameter mu and scale parameter sigma:
+      ///      Landau( (x-mu)/sigma )
+      double Landau(double mu, double sigma) {
+         return fImpl.Landau(mu,sigma); 
+      }
+
+      /// Generates a random integer N according to a Poisson law.
+      /// Prob(N) = exp(-mean)*mean^N/Factorial(N)
+      int Poisson(double mean) { return fImpl.Poisson(mean); }
+      double PoissonD(double mean) { return fImpl.PoissonD(mean); }
+
+      /// Generate numbers distributed following a gaussian with mean=0 and sigma=1.
+      /// Using the Box-Muller method 
+      void Rannor(double &a, double  &b) {
+         return fImpl.Rannor(a,b);
+      }
+
+      /// Generates random vectors, uniformly distributed over the surface
+      /// of a sphere of given radius.
+      void Sphere(double &x, double &y, double &z, double r) {
+         return fImpl.Sphere(x,y,z,r);
+      }
+
+      /// generate random numbers following a Uniform distribution in the [a,b] interval
+      double Uniform(double a, double b) {
+         return (b-a) * Rndm_impl() + a; 
+      }
+     
+      /// generate random numbers following a Uniform distribution in the [0,a] interval
+      double Uniform(double a) {
+         return a * Rndm_impl() ; 
+      }
+
+
+      /// generate Gaussian number using defqault method
+      inline double Gaus( double mean, double sigma) {
+         return fImpl.GausACR(mean,sigma);
+      }
+
+
+      // /// re-implement Gaussian 
+      // double GausBM2(double mean, double sigma) {
+      //    double y =  Rndm_impl();
+      //    double z =  Rndm_impl();
+      //    double x = z * 6.28318530717958623;
+      //    double radius = std::sqrt(-2*std::log(y));
+      //    double g = radius * std::sin(x);
+      //    return mean + g * sigma; 
+      // }
+
+
+      /// methods which are only for GSL random generators 
+      
+
+      /// Gamma functions (not implemented here, requires a GSL random engine)
+      double Gamma( double , double ) {
+         //r.Error("Error: Gamma() requires a GSL Engine type"); 
+         static_assert(std::is_fundamental<Engine>::value,"Error: Gamma() requires a GSL Engine type");
+         return 0;
+      }
+      double LogNormal(double, double) {
+         static_assert(std::is_fundamental<Engine>::value,"Error: LogNormal() requires a GSL Engine type");
+         return 0;
+      }
+      double ChiSquare(double) {
+         static_assert(std::is_fundamental<Engine>::value,"Error: ChiSquare() requires a GSL Engine type");
+         return 0;
+      }
+      double FDist(double, double) {
+         static_assert(std::is_fundamental<Engine>::value,"Error: FDist() requires a GSL Engine type");
+         return 0;
+      }
+      double tDist(double) {
+         static_assert(std::is_fundamental<Engine>::value,"Error: tDist() requires a GSL Engine type");
+         return 0;
+      }
+      unsigned int NegativeBinomial(double , double ) {
+         static_assert(std::is_fundamental<Engine>::value,"Error: NegativeBinomial() requires a GSL Engine type");
+         return 0;
+      }
+      std::vector<unsigned int> MultiNomial(unsigned int, const std::vector<double> &){
+         static_assert(std::is_fundamental<Engine>::value,"Error: MultiNomial() requires a GSL Engine type");
+         return std::vector<unsigned int>();
+      }
+
+
+   protected:
+
+      Engine & Rng() { assert(fEngine); return *fEngine; }
+
+      /// Internal impelmentation to return random number
+      /// Since this one is not a virtual function is faster than Rndm
+      inline double Rndm_impl() { return (*fEngine)(); }
+
+
+   private:    
+
+      Engine * fEngine;   //! random number generator engine
+      RandomFunctionsImpl<EngineBaseType> fImpl;   //! instance of the class implementing the functions
+      
+
+  };
+
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+#endif /* ROOT_Math_RandomFunctions */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/TRandomEngine.h b/ThirdParty/Fit/RootMinimizers/inc/Math/TRandomEngine.h
new file mode 100644
index 0000000..8c037d3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/TRandomEngine.h
@@ -0,0 +1,74 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Aug 4 2015
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2015  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// random engines based on ROOT 
+
+#ifndef ROOT_Math_TRandomEngine
+#define ROOT_Math_TRandomEngine
+
+
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+      class RandomBaseEngine {
+      public: 
+         virtual double Rndm() = 0;
+         virtual ~RandomBaseEngine() {}
+      };
+
+
+      class TRandomEngine : public RandomBaseEngine {
+      public: 
+         virtual ~TRandomEngine() {}
+      };
+      
+      class LCGEngine : public TRandomEngine {
+
+
+      public:
+
+         typedef  TRandomEngine BaseType; 
+         
+         LCGEngine() : fSeed(65539) { }
+
+         virtual ~LCGEngine() {}
+
+         void SetSeed(unsigned int seed) { fSeed = seed; }
+         
+         virtual double Rndm() {
+            //double Rndm() {
+            return Rndm_impl();
+         }
+         double Rndm_impl() { 
+            const double kCONS = 4.6566128730774E-10; // (1/pow(2,31)
+            unsigned int rndm = IntRndm(); // generate integer number 
+            if (rndm != 0) return  kCONS*rndm;
+            return Rndm_impl();
+         }
+         inline double operator() () { return Rndm_impl(); }
+
+         unsigned int IntRndm() {
+            fSeed = (1103515245 * fSeed + 12345) & 0x7fffffffUL;
+            return fSeed; 
+         }
+
+      private:
+         unsigned int fSeed; 
+      };
+      
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_TRandomEngine */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/Util.h b/ThirdParty/Fit/RootMinimizers/inc/Math/Util.h
new file mode 100644
index 0000000..ae7b76e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/Util.h
@@ -0,0 +1,77 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Tue Nov 14 15:44:38 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Utility functions for all ROOT Math classes 
+
+#ifndef ROOT_Math_Util
+#define ROOT_Math_Util
+
+#include <string> 
+#include <sstream> 
+
+#include <cmath>
+#include <limits>
+
+
+// for defining unused variables in the interfaces
+//  and have still them in the documentation
+#define MATH_UNUSED(var)   (void)var
+
+
+namespace BA_ROOT { 
+
+   namespace Math { 
+
+
+/** 
+   namespace defining Utility functions needed by mathcore 
+*/ 
+namespace Util { 
+
+/**
+   Utility function for conversion to strings
+*/
+template<class T>
+std::string ToString(const T& val)
+{
+   std::ostringstream buf;
+   buf << val;
+   
+   std::string ret = buf.str();
+   return ret;
+}
+
+
+/// safe evaluation of log(x) with a protections against negative or zero argument to the log 
+/// smooth linear extrapolation below function values smaller than  epsilon
+/// (better than a simple cut-off)
+inline double EvalLog(double x) { 
+   // evaluate the log 
+#ifdef __CINT__
+   static const double epsilon = 2.*2.2250738585072014e-308;
+#else
+   static const double epsilon = 2.*std::numeric_limits<double>::min();
+#endif
+   if(x<= epsilon) 
+      return x/epsilon + std::log(epsilon) - 1; 
+   else      
+      return std::log(x);
+}
+ 
+}  // end namespace Util
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Math_Util */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/WrappedFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Math/WrappedFunction.h
new file mode 100644
index 0000000..a5fb63e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/WrappedFunction.h
@@ -0,0 +1,239 @@
+// @(#)root/mathcore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+#ifndef ROOT_Math_WrappedFunction
+#define ROOT_Math_WrappedFunction
+
+#ifndef ROOT_Math_IFunction
+#include "IFunction.h"
+#endif
+
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+
+struct NullTypeFunc1D {};
+
+typedef double(*FreeFunctionPtr)(double);
+
+typedef double(*FreeMultiFunctionPtr)(const double*);
+
+/**
+   Template class to wrap any C++ callable object which takes one argument
+   i.e. implementing operator() (double x) in a One-dimensional function interface.
+   It provides a ROOT::Math::IGenFunction-like signature
+
+   Note: If you want to wrap just the reference (to avoid copying) you need to use
+   Func& or const Func & as template parameter.  The former should be used when the
+   operator() is not a const method of Func
+
+   @ingroup  GenFunc
+
+ */
+template< typename Func =  FreeFunctionPtr   >
+class WrappedFunction : public IGenFunction {
+
+
+ public:
+
+   /**
+      construct from the pointer to the object and the member function
+    */
+   WrappedFunction( Func f ) :
+      fFunc( f )
+   { /* no op */ }
+
+   // use default  copy contructor and assignment operator
+
+   /// clone (required by the interface)
+   WrappedFunction * Clone() const {
+      return new WrappedFunction(fFunc);
+   }
+
+   //  virtual ~WrappedFunction() { /**/ }
+
+private:
+
+   virtual double DoEval (double x) const {
+      return fFunc( x );
+   }
+
+
+   Func fFunc;
+
+
+}; // WrappedFunction
+
+
+/**
+   Template class to wrap any member function of a class
+   taking a double and returning a double in a 1D function interface
+   For example, if you have a class like:
+   struct X {
+       double Eval(double x);
+   };
+   you can wrapped in the following way:
+   WrappedMemFunction<X, double ( X::* ) (double) > f;
+
+
+   @ingroup  GenFunc
+
+ */
+
+template<typename FuncObj, typename MemFuncPtr >
+class WrappedMemFunction : public IGenFunction {
+
+
+ public:
+
+   /**
+      construct from the pointer to the object and the member function
+    */
+   WrappedMemFunction( FuncObj & obj, MemFuncPtr memFn ) :
+      fObj(&obj),
+      fMemFunc( memFn )
+   { /* no op */ }
+
+   // use default  copy contructor and assignment operator
+
+   /// clone (required by the interface)
+   WrappedMemFunction * Clone() const {
+      return new WrappedMemFunction(*fObj,fMemFunc);
+   }
+
+
+private:
+
+   virtual double DoEval (double x) const {
+      return ((*fObj).*fMemFunc)( x );
+   }
+
+
+   FuncObj * fObj;
+   MemFuncPtr fMemFunc;
+
+
+}; // WrappedMemFunction
+
+
+/**
+   Template class to wrap any C++ callable object
+   implementing operator() (const double * x) in a multi-dimensional function interface.
+   It provides a ROOT::Math::IGenMultiFunction-like signature
+
+   Note: If you want to wrap just the reference (to avoid copying) you need to use
+   Func& or const Func & as template parameter. The former should be used when the
+   operator() is not a const method of Func
+
+   @ingroup  GenFunc
+
+ */
+template< typename Func =  FreeMultiFunctionPtr   >
+class WrappedMultiFunction : public IMultiGenFunction {
+
+
+ public:
+
+   /**
+      construct from the pointer to the object and the member function
+    */
+   WrappedMultiFunction( Func f , unsigned int dim = 1) :
+      fFunc( f ),
+      fDim( dim)
+   { /* no op */ }
+
+   // use default  copy contructor and assignment operator
+
+   /// clone (required by the interface)
+   WrappedMultiFunction * Clone() const {
+      return new WrappedMultiFunction(fFunc,fDim);
+   }
+
+   unsigned int NDim() const { return fDim; }
+
+   //  virtual ~WrappedFunction() { /**/ }
+
+private:
+
+   virtual double DoEval (const double * x) const {
+      return fFunc( x );
+   }
+
+
+   Func fFunc;
+   unsigned int fDim;
+
+
+}; // WrappedMultiFunction
+
+
+template<typename FuncObj, typename MemFuncPtr >
+class WrappedMemMultiFunction : public IMultiGenFunction {
+
+
+ public:
+
+   /**
+      construct from the pointer to the object and the member function
+    */
+   WrappedMemMultiFunction( FuncObj & obj, MemFuncPtr memFn, unsigned int dim = 1 ) :
+      fObj(&obj),
+      fMemFunc( memFn ),
+      fDim(dim)
+   { /* no op */ }
+
+   // use default  copy contructor and assignment operator
+
+   /// clone (required by the interface)
+   WrappedMemMultiFunction * Clone() const {
+      return new WrappedMemMultiFunction(*fObj,fMemFunc,fDim);
+   }
+
+
+   unsigned int NDim() const { return fDim; }
+
+private:
+
+   virtual double DoEval (const double * x) const {
+      return ((*fObj).*fMemFunc)( x );
+   }
+
+
+   FuncObj * fObj;
+   MemFuncPtr fMemFunc;
+   unsigned int fDim;
+
+
+}; // WrappedMemMultiFunction
+
+
+} // namespace Math
+} // namespace ROOT
+
+
+
+#endif // ROOT_Math_WrappedFunction
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Math/WrappedParamFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Math/WrappedParamFunction.h
new file mode 100644
index 0000000..f4356c8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Math/WrappedParamFunction.h
@@ -0,0 +1,306 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Thu Nov 23 10:38:32 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class WrappedParamFunction
+
+#ifndef ROOT_Math_WrappedParamFunction
+#define ROOT_Math_WrappedParamFunction
+
+#ifndef ROOT_Math_IParamFunction
+#include "Math/IParamFunction.h"
+#endif
+
+//#include <iostream>
+//#include <iterator>
+
+#include <vector>
+
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+typedef double( * FreeParamMultiFunctionPtr ) (const double *, const double * );
+
+/**
+   WrappedParamFunction class to wrap any multi-dimensional function pbject
+   implementing the operator()(const double * x, const double * p)
+   in an interface-like IParamFunction with a vector storing and caching internally the
+   parameter values
+
+   @ingroup  ParamFunc
+
+*/
+template< typename FuncPtr =  FreeParamMultiFunctionPtr   >
+class WrappedParamFunction : public IParamMultiFunction {
+
+public:
+
+   /**
+      Constructor a wrapped function from a pointer to a callable object, the function dimension and number of parameters
+      which are set to zero by default
+   */
+   WrappedParamFunction (FuncPtr  func, unsigned int dim = 1, unsigned int npar = 0, double * par = 0) :
+      fFunc(func),
+      fDim(dim),
+      fParams(std::vector<double>(npar) )
+   {
+      if (par != 0) std::copy(par,par+npar,fParams.begin() );
+   }
+
+//    /**
+//       Constructor a wrapped function from a non-const pointer to a callable object, the function dimension and number of parameters
+//       which are set to zero by default
+//       This constructor is needed in the case FuncPtr is a std::auto_ptr which has a copy ctor taking non const objects
+//    */
+//    WrappedParamFunction (FuncPtr & func, unsigned int dim = 1, unsigned int npar = 0, double * par = 0) :
+//       fFunc(func),
+//       fDim(dim),
+//       fParams(std::vector<double>(npar) )
+//    {
+//       if (par != 0) std::copy(par,par+npar,fParams.begin() );
+//    }
+
+   /**
+      Constructor a wrapped function from a pointer to a callable object, the function dimension and an iterator specifying begin and end
+      of parameters
+   */
+   template<class Iterator>
+   WrappedParamFunction (FuncPtr func, unsigned int dim, Iterator begin, Iterator end) :
+      fFunc(func),
+      fDim(dim),
+      fParams(std::vector<double>(begin,end) )
+   {}
+
+//    /**
+//       Constructor a wrapped function from a non - const pointer to a callable object, the function dimension and an iterator specifying begin and end of parameters.
+//       This constructor is needed in the case FuncPtr is a std::auto_ptr which has a copy ctor taking non const objects
+//    */
+//    template<class Iterator>
+//    WrappedParamFunction (FuncPtr func, unsigned int dim, Iterator begin, Iterator end) :
+//       fFunc(func),
+//       fDim(dim),
+//       fParams(std::vector<double>(begin,end) )
+//    {}
+
+   /// clone the function
+   IMultiGenFunction * Clone() const {
+      return new WrappedParamFunction(fFunc, fDim, fParams.begin(), fParams.end());
+   }
+
+   const double * Parameters() const {
+      return  &(fParams.front());
+   }
+
+   void SetParameters(const double * p)  {
+      std::copy(p, p+NPar(), fParams.begin() );
+   }
+
+   unsigned int NPar() const { return fParams.size(); }
+
+   unsigned int NDim() const { return fDim; }
+
+
+private:
+
+   /// evaluate the function given values and parameters (requested interface)
+   double DoEvalPar(const double * x, const double * p) const {
+      return (*fFunc)( x, p );
+   }
+
+
+   FuncPtr fFunc;
+   unsigned int fDim;
+   std::vector<double> fParams;
+
+
+
+};
+
+
+typedef double( * FreeMultiFunctionPtr ) (const double *);
+
+/**
+   WrappedParamGenFunction class to wrap any multi-dimensional function
+   implementing the operator()(const double * )
+   in an interface-like IParamFunction, by fixing some of the variables and define them as
+   parameters.
+   i.e. transform any multi-dim function in a parametric function
+
+   @ingroup  ParamFunc
+
+*/
+template< typename FuncPtr =  FreeMultiFunctionPtr   >
+class WrappedParamFunctionGen : public IParamMultiFunction {
+
+public:
+
+   /**
+      Constructor a wrapped function from a pointer to a generic callable object implemention operator()(const double *), the new function dimension, the number of parameters (number of fixed variables) and an array specifying the index of the fixed variables which becames
+      parameters in the new API
+   */
+
+   WrappedParamFunctionGen (const FuncPtr & func, unsigned int dim, unsigned int npar, const double * par, const unsigned int * idx) :
+      fFunc(func),
+      fDim(dim),
+      fParams(std::vector<double>(par,par+npar) ),
+      fParIndices(std::vector<unsigned int>(idx, idx + npar) ),
+      fX(std::vector<double>(npar+dim) )  // cached vector
+   {
+      DoInit();
+   }
+
+   /**
+      Constructor as before but taking now a non - const pointer to a callable object.
+      This constructor is needed in the case FuncPtr is a std::auto_ptr which has a copy ctor taking non const objects
+   */
+   WrappedParamFunctionGen (FuncPtr & func, unsigned int dim, unsigned int npar, const double * par, const unsigned int * idx) :
+      fFunc(func),
+      fDim(dim),
+      fParams(std::vector<double>(par,par+npar) ),
+      fParIndices(std::vector<unsigned int>(idx, idx + npar) ),
+      fX(std::vector<double>(npar+dim) ) // cached vector
+   {
+      DoInit();
+   }
+
+   /// clone the function
+   IMultiGenFunction * Clone() const {
+      return new WrappedParamFunctionGen(fFunc, fDim, fParams.size() , &fParams.front(), &fParIndices.front());
+   }
+
+private:
+   // copy ctor
+   WrappedParamFunctionGen(const  WrappedParamFunctionGen &);   // not implemented
+   WrappedParamFunctionGen & operator=(const  WrappedParamFunctionGen &); // not implemented
+
+public:
+
+   const double * Parameters() const {
+      return  &(fParams.front());
+   }
+
+   void SetParameters(const double * p)  {
+      unsigned int npar = NPar();
+      std::copy(p, p+ npar, fParams.begin() );
+      SetParValues(npar, p);
+   }
+
+   unsigned int NPar() const { return fParams.size(); }
+
+   unsigned int NDim() const { return fDim; }
+
+//    // re-implement this since is more efficient
+//    double operator() (const double * x, const double * p) {
+//       unsigned int n = fX.size();
+//       unsigned int npar = fParams.size();
+//       unsigned j = 0;
+//       return (*fFunc)( fX);
+//    }
+
+private:
+
+   /// evaluate the function (re-implement for being more efficient)
+   double DoEval(const double * x) const {
+
+//       std::cout << this << fDim << " x : ";
+//       std::ostream_iterator<double> oix(std::cout," ,  ");
+//       std::copy(x, x+fDim, oix);
+//       std::cout << std::endl;
+//       std::cout << "npar " << npar << std::endl;
+//       std::cout <<  fVarIndices.size() << std::endl;
+//       assert ( fVarIndices.size() == fDim);  // otherwise something is wrong
+
+      for (unsigned int i = 0; i < fDim; ++i) {
+         unsigned int j = fVarIndices[i];
+         assert ( j  < NPar() + fDim);
+         fX[ j ] = x[i];
+      }
+//       std::cout << "X : (";
+//       std::ostream_iterator<double> oi(std::cout," ,  ");
+//       std::copy(fX.begin(), fX.end(), oi);
+//       std::cout << std::endl;
+
+      return (*fFunc)( &fX.front() );
+   }
+
+
+   /**
+       implement the required IParamFunction interface
+   */
+   double DoEvalPar(const double * x, const double * p ) const {
+      SetParValues(NPar(), p);
+      return DoEval(x);
+   }
+
+
+   void DoInit() {
+      // calculate variable indices and set in X the parameter values
+      fVarIndices.reserve(fDim);
+      unsigned int npar = NPar();
+      for (unsigned int i = 0; i < npar + fDim; ++i) {
+         bool isVar = true;
+         for (unsigned int j = 0; j < npar; ++j) {
+            if (fParIndices[j] == i) {
+               isVar = false;
+               break;
+            }
+         }
+         if (isVar) fVarIndices.push_back(i);
+      }
+      assert ( fVarIndices.size() == fDim);  // otherwise something is wrong
+
+//       std::cout << "n variables " << fVarIndices.size() << std::endl;
+//       std::ostream_iterator<int> oi(std::cout,"  ");
+//       std::copy(fVarIndices.begin(), fVarIndices.end(), oi);
+//       std::cout << std::endl;
+//       assert( fVarIndices.size() == fDim);
+//       std::cout << this << std::endl;
+
+      // set parameter values in fX
+      SetParValues(npar, &fParams.front() );
+      for (unsigned int i = 0; i < npar; ++i) {
+         unsigned int j = fParIndices[i];
+         assert ( j  < npar + fDim);
+         fX[j] = fParams[i];
+      }
+
+   }
+
+   // set the parameter values in the cached fX vector
+   // makme const because it might be called from const methods
+   void SetParValues(unsigned int npar, const double * p) const {
+      for (unsigned int i = 0; i < npar; ++i) {
+         unsigned int j = fParIndices[i];
+         assert ( j  < npar + fDim);
+         fX[j] = p[i];
+      }
+   }
+
+
+   mutable FuncPtr fFunc;
+   unsigned int fDim;
+   std::vector<double> fParams;
+   std::vector<unsigned int> fVarIndices;
+   std::vector<unsigned int> fParIndices;
+   mutable std::vector<double> fX;
+
+
+
+};
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_WrappedParamFunction */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABObj.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABObj.h
new file mode 100644
index 0000000..c062ac6
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABObj.h
@@ -0,0 +1,176 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ABObj
+#define ROOT_Minuit2_ABObj
+
+#include "Minuit2/ABTypes.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+template<class mtype, class M, class T>
+class ABObj {
+
+public:
+
+  typedef mtype Type;
+
+private:
+
+  ABObj() : fObject(M()), fFactor(T(0.)) {}
+
+  ABObj& operator=(const ABObj&) {return *this;}
+
+  template<class a, class b, class c>
+  ABObj(const ABObj<a,b,c>&) : fObject(M()), fFactor(T(0.)) {}
+
+  template<class a, class b, class c>
+  ABObj& operator=(const ABObj<a,b,c>&) {return *this;}
+
+public:
+
+  ABObj(const M& obj) : fObject(obj), fFactor(T(1.)) {}
+
+  ABObj(const M& obj, T factor) : fObject(obj), fFactor(factor) {}
+
+  ~ABObj() {}
+
+  ABObj(const ABObj& obj) :
+    fObject(obj.fObject), fFactor(obj.fFactor) {}
+
+  template<class b, class c>
+  ABObj(const ABObj<mtype,b,c>& obj) :
+     fObject(M(obj.Obj() )), fFactor(T(obj.f() )) {}
+
+  const M& Obj() const {return fObject;}
+
+  T f() const {return fFactor;}
+
+private:
+
+  M fObject;
+  T fFactor;
+};
+
+class LAVector;
+template <> class ABObj<vec, LAVector, double> {
+
+public:
+
+  typedef vec Type;
+
+private:
+
+  ABObj& operator=(const ABObj&) {return *this;}
+
+public:
+
+  ABObj(const LAVector& obj) : fObject(obj), fFactor(double(1.)) {}
+
+  ABObj(const LAVector& obj, double factor) : fObject(obj), fFactor(factor) {}
+
+  ~ABObj() {}
+
+  // remove copy constructure to Fix a problem in AIX
+  // should be able to use the compiler generated one
+//   ABObj(const ABObj& obj) :
+//     fObject(obj.fObject), fFactor(obj.fFactor) {}
+
+  template<class c>
+  ABObj(const ABObj<vec,LAVector,c>& obj) :
+    fObject(obj.fObject), fFactor(double(obj.fFactor)) {}
+
+  const LAVector& Obj() const {return fObject;}
+
+  double f() const {return fFactor;}
+
+private:
+
+  const LAVector& fObject;
+  double fFactor;
+};
+
+class LASymMatrix;
+template <> class ABObj<sym, LASymMatrix, double> {
+
+public:
+
+  typedef sym Type;
+
+private:
+
+  ABObj& operator=(const ABObj&) {return *this;}
+
+public:
+
+  ABObj(const LASymMatrix& obj) : fObject(obj), fFactor(double(1.)) {}
+
+  ABObj(const LASymMatrix& obj, double factor) : fObject(obj), fFactor(factor) {}
+
+  ~ABObj() {}
+
+  ABObj(const ABObj& obj) :
+    fObject(obj.fObject), fFactor(obj.fFactor) {}
+
+  template<class c>
+  ABObj(const ABObj<vec,LASymMatrix,c>& obj) :
+    fObject(obj.fObject), fFactor(double(obj.fFactor)) {}
+
+  const LASymMatrix& Obj() const {return fObject;}
+
+  double f() const {return fFactor;}
+
+private:
+
+  const LASymMatrix& fObject;
+  double fFactor;
+};
+
+// templated scaling operator *
+template<class mt, class M, class T>
+inline ABObj<mt, M, T> operator*(T f, const M& obj) {
+  return ABObj<mt, M, T>(obj, f);
+}
+
+// templated operator /
+template<class mt, class M, class T>
+inline ABObj<mt, M, T> operator/(const M& obj, T f) {
+  return ABObj<mt, M, T>(obj, T(1.)/f);
+}
+
+// templated unary operator -
+template<class mt, class M, class T>
+inline ABObj<mt,M,T> operator-(const M& obj) {
+  return ABObj<mt,M,T>(obj, T(-1.));
+}
+
+/*
+// specialization for LAVector
+
+inline ABObj<vec, LAVector, double> operator*(double f, const LAVector& obj) {
+  return ABObj<vec, LAVector, double>(obj, f);
+}
+
+inline ABObj<vec, LAVector, double> operator/(const LAVector& obj, double f) {
+  return ABObj<vec, LAVector, double>(obj, double(1.)/f);
+}
+
+inline ABObj<vec,LAVector,double> operator-(const LAVector& obj) {
+  return ABObj<vec,LAVector,double>(obj, double(-1.));
+}
+*/
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ABObj
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABProd.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABProd.h
new file mode 100644
index 0000000..a4f52ee
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABProd.h
@@ -0,0 +1,63 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ABProd
+#define ROOT_Minuit2_ABProd
+
+#include "Minuit2/ABObj.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+template<class M1, class M2>
+class ABProd {
+
+private:
+
+  ABProd() : fA(M1()), fB(M2()) {}
+
+  ABProd& operator=(const ABProd&) {return *this;}
+
+  template<class MI1, class MI2>
+  ABProd& operator=(const ABProd<MI1,MI2>&) {return *this;}
+
+public:
+
+  ABProd(const M1& a, const M2& b): fA(a), fB(b) {}
+
+  ~ABProd() {}
+
+  ABProd(const ABProd& prod) : fA(prod.fA), fB(prod.fB) {}
+
+  template<class MI1, class MI2>
+  ABProd(const ABProd<MI1,MI2>& prod) : fA(M1(prod.A() )), fB(M2(prod.B() )) {}
+
+  const M1& A() const {return fA;}
+  const M2& B() const {return fB;}
+
+private:
+
+  M1 fA;
+  M2 fB;
+};
+
+// ABObj * ABObj
+template<class atype, class A, class btype, class B, class T>
+inline ABObj<typename AlgebraicProdType<atype, btype>::Type, ABProd<ABObj<atype,A,T>, ABObj<btype,B,T> >,T> operator*(const ABObj<atype,A,T>& a, const ABObj<btype,B,T>& b) {
+
+  return ABObj<typename AlgebraicProdType<atype,btype>::Type, ABProd<ABObj<atype,A,T>, ABObj<btype,B,T> >,T>(ABProd<ABObj<atype,A,T>, ABObj<btype,B,T> >(a, b));
+}
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ABProd
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABSum.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABSum.h
new file mode 100644
index 0000000..db814a1
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABSum.h
@@ -0,0 +1,70 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ABSum
+#define ROOT_Minuit2_ABSum
+
+#include "Minuit2/ABObj.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+template<class M1, class M2>
+class ABSum {
+
+private:
+
+  ABSum() : fA(M1()), fB(M2()) {}
+
+  ABSum& operator=(const ABSum&) {return *this;}
+
+  template<class MI1, class MI2>
+  ABSum& operator=(const ABSum<MI1,MI2>&) {return *this;}
+
+public:
+
+  ABSum(const M1& a, const M2& b): fA(a), fB(b) {}
+
+  ~ABSum() {}
+
+  ABSum(const ABSum& sum) : fA(sum.fA), fB(sum.fB) {}
+
+  template<class MI1, class MI2>
+  ABSum(const ABSum<MI1,MI2>& sum) : fA(M1(sum.A() )), fB(M2(sum.B() )) {}
+
+  const M1& A() const {return fA;}
+  const M2& B() const {return fB;}
+
+private:
+
+  M1 fA;
+  M2 fB;
+};
+
+// ABObj + ABObj
+template<class atype, class A, class btype, class B, class T>
+inline ABObj<typename AlgebraicSumType<atype, btype>::Type, ABSum<ABObj<atype,A,T>, ABObj<btype,B,T> >,T> operator+(const ABObj<atype,A,T>& a, const ABObj<btype,B,T>& b) {
+
+  return ABObj<typename AlgebraicSumType<atype,btype>::Type, ABSum<ABObj<atype,A,T>, ABObj<btype,B,T> >,T>(ABSum<ABObj<atype,A,T>, ABObj<btype,B,T> >(a, b));
+}
+
+// ABObj - ABObj
+template<class atype, class A, class btype, class B, class T>
+inline ABObj<typename AlgebraicSumType<atype, btype>::Type, ABSum<ABObj<atype,A,T>, ABObj<btype,B,T> >,T> operator-(const ABObj<atype,A,T>& a, const ABObj<btype,B,T>& b) {
+
+  return ABObj<typename AlgebraicSumType<atype,btype>::Type, ABSum<ABObj<atype,A,T>, ABObj<btype,B,T> >,T>(ABSum<ABObj<atype,A,T>, ABObj<btype,B,T> >(a, ABObj<btype,B,T>(b.Obj(), T(-1.)*b.f())));
+}
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ABSum
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABTypes.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABTypes.h
new file mode 100644
index 0000000..67d06ae
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ABTypes.h
@@ -0,0 +1,126 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ABTypes
+#define ROOT_Minuit2_ABTypes
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class gen {};
+class sym {};
+class vec {};
+
+template<class A, class B>
+class AlgebraicSumType {
+public:
+  typedef gen Type;
+};
+
+template<class T>
+class AlgebraicSumType<T, T> {
+public:
+  typedef T Type;
+};
+
+template < >
+class AlgebraicSumType<vec, gen> {
+private:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicSumType<gen, vec> {
+private:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicSumType<vec, sym> {
+private:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicSumType<sym, vec> {
+private:
+  typedef gen Type;
+};
+
+//
+
+template<class A, class B>
+class AlgebraicProdType {
+private:
+  typedef gen Type;
+};
+
+template<class T>
+class AlgebraicProdType<T, T> {
+private:
+  typedef T Type;
+};
+
+template < >
+class AlgebraicProdType<gen, gen> {
+public:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicProdType<sym, sym> {
+public:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicProdType<sym, gen> {
+public:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicProdType<gen, sym> {
+public:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicProdType<vec, gen> {
+private:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicProdType<gen, vec> {
+public:
+   typedef vec Type;
+};
+
+template < >
+class AlgebraicProdType<vec, sym> {
+private:
+  typedef gen Type;
+};
+
+template < >
+class AlgebraicProdType<sym, vec> {
+public:
+  typedef vec Type;
+};
+
+
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ABTypes
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/AnalyticalGradientCalculator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/AnalyticalGradientCalculator.h
new file mode 100644
index 0000000..52545bf
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/AnalyticalGradientCalculator.h
@@ -0,0 +1,49 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_AnalyticalGradientCalculator
+#define ROOT_Minuit2_AnalyticalGradientCalculator
+
+#include "Minuit2/GradientCalculator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNGradientBase;
+class MnUserTransformation;
+
+class AnalyticalGradientCalculator : public GradientCalculator {
+
+public:
+
+  AnalyticalGradientCalculator(const FCNGradientBase& fcn, const MnUserTransformation& state) : fGradCalc(fcn), fTransformation(state) {}
+
+  ~AnalyticalGradientCalculator() {}
+
+
+  virtual FunctionGradient operator()(const MinimumParameters&) const;
+
+  virtual FunctionGradient operator()(const MinimumParameters&,
+                                      const FunctionGradient&) const;
+
+  virtual bool CheckGradient() const;
+
+private:
+
+  const FCNGradientBase& fGradCalc;
+  const MnUserTransformation& fTransformation;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_AnalyticalGradientCalculator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicFunctionGradient.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicFunctionGradient.h
new file mode 100644
index 0000000..bca62b2
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicFunctionGradient.h
@@ -0,0 +1,85 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_BasicFunctionGradient
+#define ROOT_Minuit2_BasicFunctionGradient
+
+#include "Minuit2/MnMatrix.h"
+
+#include "Minuit2/StackAllocator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//extern StackAllocator gStackAllocator;
+
+class BasicFunctionGradient {
+
+private:
+
+public:
+
+  explicit BasicFunctionGradient(unsigned int n) :
+    fGradient(MnAlgebraicVector(n)), fG2ndDerivative(MnAlgebraicVector(n)),
+    fGStepSize(MnAlgebraicVector(n)), fValid(false),
+    fAnalytical(false) {}
+
+  explicit BasicFunctionGradient(const MnAlgebraicVector& grd) :
+    fGradient(grd), fG2ndDerivative(MnAlgebraicVector(grd.size())),
+    fGStepSize(MnAlgebraicVector(grd.size())), fValid(true),
+    fAnalytical(true) {}
+
+  BasicFunctionGradient(const MnAlgebraicVector& grd, const MnAlgebraicVector& g2, const MnAlgebraicVector& gstep) :
+    fGradient(grd), fG2ndDerivative(g2),
+    fGStepSize(gstep), fValid(true), fAnalytical(false) {}
+
+  ~BasicFunctionGradient() {}
+
+  BasicFunctionGradient(const BasicFunctionGradient& grad) : fGradient(grad.fGradient), fG2ndDerivative(grad.fG2ndDerivative), fGStepSize(grad.fGStepSize), fValid(grad.fValid) {}
+
+  BasicFunctionGradient& operator=(const BasicFunctionGradient& grad) {
+    fGradient = grad.fGradient;
+    fG2ndDerivative = grad.fG2ndDerivative;
+    fGStepSize = grad.fGStepSize;
+    fValid = grad.fValid;
+    return *this;
+  }
+
+  void* operator new(size_t nbytes) {
+    return StackAllocatorHolder::Get().Allocate(nbytes);
+  }
+
+  void operator delete(void* p, size_t /*nbytes */) {
+    StackAllocatorHolder::Get().Deallocate(p);
+  }
+
+  const MnAlgebraicVector& Grad() const {return fGradient;}
+  const MnAlgebraicVector& Vec() const {return fGradient;}
+  bool IsValid() const {return fValid;}
+
+  bool IsAnalytical() const {return fAnalytical;}
+  const MnAlgebraicVector& G2() const {return fG2ndDerivative;}
+  const MnAlgebraicVector& Gstep() const {return fGStepSize;}
+
+private:
+
+  MnAlgebraicVector fGradient;
+  MnAlgebraicVector fG2ndDerivative;
+  MnAlgebraicVector fGStepSize;
+  bool fValid;
+  bool fAnalytical;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_BasicFunctionGradient
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicFunctionMinimum.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicFunctionMinimum.h
new file mode 100644
index 0000000..5e46e68
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicFunctionMinimum.h
@@ -0,0 +1,156 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_BasicFunctionMinimum
+#define ROOT_Minuit2_BasicFunctionMinimum
+
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnUserTransformation.h"
+
+#include "Minuit2/StackAllocator.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//extern StackAllocator gStackAllocator;
+
+/** result of the minimization;
+    both internal and external (MnUserParameterState) representation available
+    For the parameters at the Minimum
+ */
+
+class BasicFunctionMinimum {
+
+public:
+
+   class MnReachedCallLimit {};
+   class MnAboveMaxEdm {};
+
+public:
+
+   /// constructor from only MinimumSeed. Minimum is only from seed result not the full minimization
+   BasicFunctionMinimum(const MinimumSeed& seed, double up) : fSeed(seed), fStates(std::vector<MinimumState>(1, MinimumState(seed.Parameters(), seed.Error(), seed.Gradient(), seed.Parameters().Fval(), seed.NFcn()))), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
+
+   /// constructor at the end of a successfull minimization from seed and vector of states
+   BasicFunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
+
+   /// constructor at the end of a failed minimization due to exceeding function call limit
+   BasicFunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnReachedCallLimit) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(true), fUserState(MnUserParameterState()) {}
+
+   /// constructor at the end of a failed minimization due to edm above maximum value
+   BasicFunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnAboveMaxEdm) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(true), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
+
+   /// copy constructor
+   BasicFunctionMinimum(const BasicFunctionMinimum& min) : fSeed(min.fSeed), fStates(min.fStates), fErrorDef(min.fErrorDef), fAboveMaxEdm(min.fAboveMaxEdm), fReachedCallLimit(min.fReachedCallLimit), fUserState(min.fUserState) {}
+
+   BasicFunctionMinimum& operator=(const BasicFunctionMinimum& min) {
+      fSeed = min.fSeed;
+      fStates = min.fStates;
+      fErrorDef = min.fErrorDef;
+      fAboveMaxEdm = min.fAboveMaxEdm;
+      fReachedCallLimit = min.fReachedCallLimit;
+      fUserState = min.fUserState;
+      return *this;
+   }
+
+   ~BasicFunctionMinimum() {}
+
+   /// add latest minimization state (for example add Hesse result after Migrad)
+   void Add(const MinimumState& state ) {
+      fStates.push_back(state);
+      // LM : update also the user state
+      fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
+      // reset maxedm flag. If new state has edm over max other method must be used
+      fAboveMaxEdm = false;
+   }
+
+   ///Add a new state and flag that edm is above maximum
+   void Add(const MinimumState& state, MnAboveMaxEdm) {
+      Add(state);
+      fAboveMaxEdm = true;
+   }
+
+   const MinimumSeed& Seed() const {return fSeed;}
+   const std::vector<MinimumState>& States() const {return fStates;}
+
+// user representation of state at Minimum
+   const MnUserParameterState& UserState() const {
+      if(!fUserState.IsValid())
+         fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
+      return fUserState;
+   }
+   const MnUserParameters& UserParameters() const {
+      if(!fUserState.IsValid())
+         fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
+      return fUserState.Parameters();
+   }
+   const MnUserCovariance& UserCovariance() const {
+      if(!fUserState.IsValid())
+         fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
+      return fUserState.Covariance();
+   }
+
+   void* operator new(size_t nbytes) {
+      return StackAllocatorHolder::Get().Allocate(nbytes);
+   }
+
+   void operator delete(void* p, size_t /*nbytes */) {
+      StackAllocatorHolder::Get().Deallocate(p);
+   }
+
+   // forward interface of last state
+   const MinimumState& State() const {return fStates.back();}
+   const MinimumParameters& Parameters() const {return fStates.back().Parameters();}
+   const MinimumError& Error() const {return fStates.back().Error();}
+   const FunctionGradient& Grad() const {return fStates.back().Gradient();}
+   double Fval() const {return fStates.back().Fval();}
+   double Edm() const {return fStates.back().Edm();}
+   int NFcn() const {return fStates.back().NFcn();}
+
+   double Up() const {return fErrorDef;}
+   bool IsValid() const {
+      return State().IsValid() && !IsAboveMaxEdm() && !HasReachedCallLimit();
+   }
+   bool HasValidParameters() const {return State().Parameters().IsValid();}
+   bool HasValidCovariance() const {return State().Error().IsValid();}
+   bool HasAccurateCovar() const {return State().Error().IsAccurate();}
+   bool HasPosDefCovar() const {return State().Error().IsPosDef();}
+   bool HasMadePosDefCovar() const {return State().Error().IsMadePosDef();}
+   bool HesseFailed() const {return State().Error().HesseFailed();}
+   bool HasCovariance() const {return State().Error().IsAvailable();}
+   bool IsAboveMaxEdm() const {return fAboveMaxEdm;}
+   bool HasReachedCallLimit() const {return fReachedCallLimit;}
+
+   void SetErrorDef( double up) {
+      fErrorDef = up;
+      // update user state for new valeu of up (scaling of errors)
+      fUserState = MnUserParameterState(State(), up, Seed().Trafo());
+   }
+
+private:
+
+   MinimumSeed fSeed;
+   std::vector<MinimumState> fStates;
+   double fErrorDef;
+   bool fAboveMaxEdm;
+   bool fReachedCallLimit;
+   mutable MnUserParameterState fUserState;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_BasicFunctionMinimum
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumError.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumError.h
new file mode 100644
index 0000000..2ffac4b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumError.h
@@ -0,0 +1,122 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_BasicMinimumError
+#define ROOT_Minuit2_BasicMinimumError
+
+#ifndef  ROOT_Minuit2_MnConfig
+#include "Minuit2/MnConfig.h"
+#endif
+#ifndef ROOT_Minuit2_MnMatrix
+#include "Minuit2/MnMatrix.h"
+#endif
+#ifndef ROOT_Minuit2_LaSum
+#include "Minuit2/LaSum.h"
+#endif
+#ifndef ROOT_Minuit2_StackAllocator
+#include "Minuit2/StackAllocator.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//extern StackAllocator gStackAllocator;
+
+/**
+   Internal Class containing the error information on the
+   estimated minimum :
+   Error matrix + dcovar + additional flags for quality and validity checks
+ */
+
+class BasicMinimumError {
+
+public:
+
+  class MnNotPosDef {};
+  class MnMadePosDef {};
+  class MnHesseFailed {};
+  class MnInvertFailed {};
+
+public:
+
+  BasicMinimumError(unsigned int n) :
+    fMatrix(MnAlgebraicSymMatrix(n)), fDCovar(1.), fValid(false), fPosDef(false), fMadePosDef(false), fHesseFailed(false), fInvertFailed(false), fAvailable(false) {}
+
+  BasicMinimumError(const MnAlgebraicSymMatrix& mat, double dcov) :
+    fMatrix(mat), fDCovar(dcov), fValid(true), fPosDef(true), fMadePosDef(false), fHesseFailed(false), fInvertFailed(false), fAvailable(true) {}
+
+  BasicMinimumError(const MnAlgebraicSymMatrix& mat, MnHesseFailed) :
+    fMatrix(mat), fDCovar(1.), fValid(false), fPosDef(false), fMadePosDef(false), fHesseFailed(true), fInvertFailed(false), fAvailable(true) {}
+
+  BasicMinimumError(const MnAlgebraicSymMatrix& mat, MnMadePosDef) :
+    fMatrix(mat), fDCovar(1.), fValid(true), fPosDef(false), fMadePosDef(true), fHesseFailed(false), fInvertFailed(false), fAvailable(true) {}
+
+  BasicMinimumError(const MnAlgebraicSymMatrix& mat, MnInvertFailed) :
+    fMatrix(mat), fDCovar(1.), fValid(false), fPosDef(true), fMadePosDef(false), fHesseFailed(false), fInvertFailed(true), fAvailable(true) {}
+
+  BasicMinimumError(const MnAlgebraicSymMatrix& mat, MnNotPosDef) :
+    fMatrix(mat), fDCovar(1.), fValid(false), fPosDef(false), fMadePosDef(false), fHesseFailed(false), fInvertFailed(false), fAvailable(true) {}
+
+  ~BasicMinimumError() {}
+
+  BasicMinimumError(const BasicMinimumError& e) : fMatrix(e.fMatrix), fDCovar(e.fDCovar), fValid(e.fValid), fPosDef(e.fPosDef), fMadePosDef(e.fMadePosDef), fHesseFailed(e.fHesseFailed), fInvertFailed(e.fInvertFailed), fAvailable(e.fAvailable) {}
+
+  BasicMinimumError& operator=(const BasicMinimumError& err) {
+    fMatrix = err.fMatrix;
+    fDCovar = err.fDCovar;
+    fValid = err.fValid;
+    fPosDef = err.fPosDef;
+    fMadePosDef = err.fMadePosDef;
+    fHesseFailed = err.fHesseFailed;
+    fInvertFailed = err.fInvertFailed;
+    fAvailable = err.fAvailable;
+    return *this;
+  }
+
+  void* operator new(size_t nbytes) {
+    return StackAllocatorHolder::Get().Allocate(nbytes);
+  }
+
+  void operator delete(void* p, size_t /*nbytes */) {
+    StackAllocatorHolder::Get().Deallocate(p);
+  }
+
+  MnAlgebraicSymMatrix Matrix() const {return 2.*fMatrix;}
+
+  const MnAlgebraicSymMatrix& InvHessian() const {return fMatrix;}
+
+  MnAlgebraicSymMatrix Hessian() const;
+
+  double Dcovar() const {return fDCovar;}
+  bool IsAccurate() const {return fDCovar < 0.1;}
+  bool IsValid() const {return fValid;}
+  bool IsPosDef() const {return fPosDef;}
+  bool IsMadePosDef() const {return fMadePosDef;}
+  bool HesseFailed() const {return fHesseFailed;}
+  bool InvertFailed() const {return fInvertFailed;}
+  bool IsAvailable() const {return fAvailable;}
+
+private:
+
+  MnAlgebraicSymMatrix fMatrix;
+  double fDCovar;
+  bool fValid;
+  bool fPosDef;
+  bool fMadePosDef;
+  bool fHesseFailed;
+  bool fInvertFailed;
+  bool fAvailable;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_BasicMinimumError
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumParameters.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumParameters.h
new file mode 100644
index 0000000..b9629f2
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumParameters.h
@@ -0,0 +1,75 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_BasicMinimumParameters
+#define ROOT_Minuit2_BasicMinimumParameters
+
+#include "Minuit2/MnMatrix.h"
+
+#include "Minuit2/StackAllocator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//extern StackAllocator gStackAllocator;
+
+class BasicMinimumParameters {
+
+public:
+
+  BasicMinimumParameters(unsigned int n, double fval) : fParameters(MnAlgebraicVector(n)), fStepSize(MnAlgebraicVector(n)), fFVal(fval), fValid(false), fHasStep(false) {}
+
+  BasicMinimumParameters(const MnAlgebraicVector& avec, double fval) :
+    fParameters(avec), fStepSize(avec.size()), fFVal(fval), fValid(true), fHasStep(false) {}
+
+  BasicMinimumParameters(const MnAlgebraicVector& avec, const MnAlgebraicVector& dirin, double fval) : fParameters(avec), fStepSize(dirin), fFVal(fval), fValid(true), fHasStep(true) {}
+
+  ~BasicMinimumParameters() {}
+
+  BasicMinimumParameters(const BasicMinimumParameters& par) : fParameters(par.fParameters), fStepSize(par.fStepSize), fFVal(par.fFVal), fValid(par.fValid), fHasStep(par.fHasStep) {}
+
+  BasicMinimumParameters& operator=(const BasicMinimumParameters& par) {
+    fParameters = par.fParameters;
+    fStepSize = par.fStepSize;
+    fFVal = par.fFVal;
+    fValid = par.fValid;
+    fHasStep = par.fHasStep;
+    return *this;
+  }
+
+  void* operator new(size_t nbytes) {
+    return StackAllocatorHolder::Get().Allocate(nbytes);
+  }
+
+  void operator delete(void* p, size_t /*nbytes*/) {
+    StackAllocatorHolder::Get().Deallocate(p);
+  }
+
+  const MnAlgebraicVector& Vec() const {return fParameters;}
+  const MnAlgebraicVector& Dirin() const {return fStepSize;}
+  double Fval() const {return fFVal;}
+  bool IsValid() const {return fValid;}
+  bool HasStepSize() const {return fHasStep;}
+
+private:
+
+  MnAlgebraicVector fParameters;
+  MnAlgebraicVector fStepSize;
+  double fFVal;
+  bool fValid;
+  bool fHasStep;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_BasicMinimumParameters
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumSeed.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumSeed.h
new file mode 100644
index 0000000..18c09f6
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumSeed.h
@@ -0,0 +1,75 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_BasicMinimumSeed
+#define ROOT_Minuit2_BasicMinimumSeed
+
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/MinimumError.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MnUserTransformation.h"
+
+#include "Minuit2/StackAllocator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//extern StackAllocator gStackAllocator;
+
+class BasicMinimumSeed {
+
+public:
+
+  BasicMinimumSeed(const MinimumState& state, const MnUserTransformation& trafo) : fState(state), fTrafo(trafo), fValid(true) {}
+
+  ~BasicMinimumSeed() {}
+
+  BasicMinimumSeed(const BasicMinimumSeed& seed) : fState(seed.fState), fTrafo(seed.fTrafo), fValid(seed.fValid) {}
+
+  BasicMinimumSeed& operator=(const BasicMinimumSeed& seed) {
+    fState = seed.fState;
+    fTrafo = seed.fTrafo;
+    fValid = seed.fValid;
+    return *this;
+  }
+
+  void* operator new(size_t nbytes) {
+    return StackAllocatorHolder::Get().Allocate(nbytes);
+  }
+
+  void operator delete(void* p, size_t /*nbytes*/) {
+    StackAllocatorHolder::Get().Deallocate(p);
+  }
+
+  const MinimumState& State() const {return fState;}
+  const MinimumParameters& Parameters() const {return State().Parameters();}
+  const MinimumError& Error() const {return State().Error();};
+  const FunctionGradient& Gradient() const {return State().Gradient();}
+  const MnUserTransformation& Trafo() const {return fTrafo;}
+  const MnMachinePrecision& Precision() const {return fTrafo.Precision();}
+  double Fval() const {return State().Fval();}
+  double Edm() const {return State().Edm();}
+  unsigned int NFcn() const {return State().NFcn();}
+  bool IsValid() const {return fValid;}
+
+private:
+
+  MinimumState fState;
+  MnUserTransformation fTrafo;
+  bool fValid;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_BasicMinimumSeed
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumState.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumState.h
new file mode 100644
index 0000000..00a285b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/BasicMinimumState.h
@@ -0,0 +1,98 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_BasicMinimumState
+#define ROOT_Minuit2_BasicMinimumState
+
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/MinimumError.h"
+#include "Minuit2/FunctionGradient.h"
+
+#include "Minuit2/StackAllocator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//extern StackAllocator gStackAllocator;
+
+class BasicMinimumState {
+
+public:
+
+   // constructor without parameter values but with function value, edm and nfcn
+   BasicMinimumState(unsigned int n, double fval, double edm, int nfcn) :
+      fParameters(MinimumParameters(n,fval)), fError(MinimumError(n)),
+    fGradient(FunctionGradient(n)), fEDM(edm), fNFcn(nfcn) {}
+   
+  BasicMinimumState(const MinimumParameters& states, const MinimumError& err,
+                    const FunctionGradient& grad, double edm, int nfcn) :     
+     fParameters(states), fError(err), fGradient(grad), fEDM(edm), fNFcn(nfcn) {}
+
+   BasicMinimumState(const MinimumParameters& states, double edm, int nfcn) : fParameters(states), fError(MinimumError(states.Vec().size())),
+                                                                              fGradient(FunctionGradient(states.Vec().size())), fEDM(edm), fNFcn(nfcn)
+   {}
+
+  ~BasicMinimumState() {}
+
+  BasicMinimumState(const BasicMinimumState& state) :
+     fParameters(state.fParameters), fError(state.fError), fGradient(state.fGradient), fEDM(state.fEDM), fNFcn(state.fNFcn) {}
+
+  BasicMinimumState& operator=(const BasicMinimumState& state) {
+    fParameters = state.fParameters;
+    fError = state.fError;
+    fGradient = state.fGradient;
+    fEDM = state.fEDM;
+    fNFcn = state.fNFcn;
+    return *this;
+  }
+
+  void* operator new(size_t nbytes) {
+    return StackAllocatorHolder::Get().Allocate(nbytes);
+  }
+
+  void operator delete(void* p, size_t /*nbytes */) {
+    StackAllocatorHolder::Get().Deallocate(p);
+  }
+
+  const MinimumParameters& Parameters() const {return fParameters;}
+  const MnAlgebraicVector& Vec() const {return fParameters.Vec();}
+  int size() const {return fParameters.Vec().size();}
+
+  const MinimumError& Error() const {return fError;}
+  const FunctionGradient& Gradient() const {return fGradient;}
+  double Fval() const {return fParameters.Fval();}
+  double Edm() const {return fEDM;}
+  int NFcn() const {return fNFcn;}
+
+
+  bool IsValid() const {
+    if(HasParameters() && HasCovariance())
+      return Parameters().IsValid() && Error().IsValid();
+    else if(HasParameters()) return Parameters().IsValid();
+    else return false;
+  }
+  bool HasParameters() const {return fParameters.IsValid();}
+  bool HasCovariance() const {return fError.IsAvailable();}
+
+private:
+
+  MinimumParameters fParameters;
+  MinimumError fError;
+  FunctionGradient fGradient;
+  double fEDM;
+  int fNFcn;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_BasicMinimumState
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/CombinedMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/CombinedMinimizer.h
new file mode 100644
index 0000000..698b80d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/CombinedMinimizer.h
@@ -0,0 +1,53 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_CombinedMinimizer
+#define ROOT_Minuit2_CombinedMinimizer
+
+#include "Minuit2/ModularFunctionMinimizer.h"
+#include "Minuit2/MnSeedGenerator.h"
+#include "Minuit2/CombinedMinimumBuilder.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//__________________________________________________________________________
+/**
+   Combined minimizer: combination of Migrad and Simplex. I
+   If the Migrad method fails at first attempt, a simplex
+   minimization is performed and then migrad is tried again.
+
+
+*/
+
+class CombinedMinimizer : public ModularFunctionMinimizer {
+
+public:
+
+   CombinedMinimizer() : fMinSeedGen(MnSeedGenerator()),
+                         fMinBuilder(CombinedMinimumBuilder()) {}
+
+   ~CombinedMinimizer() {}
+
+   const MinimumSeedGenerator& SeedGenerator() const {return fMinSeedGen;}
+   const MinimumBuilder& Builder() const {return fMinBuilder;}
+   MinimumBuilder& Builder()  {return fMinBuilder;}
+
+private:
+
+   MnSeedGenerator fMinSeedGen;
+   CombinedMinimumBuilder fMinBuilder;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_CombinedMinimizer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/CombinedMinimumBuilder.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/CombinedMinimumBuilder.h
new file mode 100644
index 0000000..bec1557
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/CombinedMinimumBuilder.h
@@ -0,0 +1,63 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_CombinedMinimumBuilder
+#define ROOT_Minuit2_CombinedMinimumBuilder
+
+#include "Minuit2/MinimumBuilder.h"
+#include "Minuit2/VariableMetricMinimizer.h"
+#include "Minuit2/SimplexMinimizer.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class CombinedMinimumBuilder : public MinimumBuilder {
+
+public:
+
+   CombinedMinimumBuilder() : fVMMinimizer(VariableMetricMinimizer()),
+      fSimplexMinimizer(SimplexMinimizer()) {}
+
+   ~CombinedMinimumBuilder() {}
+
+   virtual FunctionMinimum Minimum(const MnFcn&, const GradientCalculator&, const MinimumSeed&, const MnStrategy&, unsigned int, double) const;
+
+   //re-implement setter of base class. Need also to store in the base class for consistency
+   virtual void SetPrintLevel(int level) {
+      MinimumBuilder::SetPrintLevel(level);
+      fVMMinimizer.Builder().SetPrintLevel(level);
+      fSimplexMinimizer.Builder().SetPrintLevel(level);
+   }
+   virtual void SetStorageLevel(int level) {
+      MinimumBuilder::SetStorageLevel(level);
+      fVMMinimizer.Builder().SetStorageLevel(level);
+      fSimplexMinimizer.Builder().SetStorageLevel(level);
+   }
+
+   // set trace object (user manages it)
+   virtual void SetTraceObject(MnTraceObject & obj) {
+      MinimumBuilder::SetTraceObject(obj);
+      fVMMinimizer.Builder().SetTraceObject(obj);
+      fSimplexMinimizer.Builder().SetTraceObject(obj);
+   }
+
+
+private:
+
+  VariableMetricMinimizer fVMMinimizer;
+  SimplexMinimizer fSimplexMinimizer;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_CombinedMinimumBuilder
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ContoursError.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ContoursError.h
new file mode 100644
index 0000000..21c8184
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ContoursError.h
@@ -0,0 +1,85 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ContoursError
+#define ROOT_Minuit2_ContoursError
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/MinosError.h"
+
+#include <vector>
+#include <utility>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class ContoursError {
+
+public:
+
+  ContoursError(unsigned int parx, unsigned int pary, const std::vector<std::pair<double,double> >& points, const MinosError& xmnos, const MinosError& ymnos, unsigned int nfcn) : fParX(parx), fParY(pary), fPoints(points), fXMinos(xmnos), fYMinos(ymnos), fNFcn(nfcn) {}
+
+  ~ContoursError() {}
+
+  ContoursError(const ContoursError& cont) : fParX(cont.fParX), fParY(cont.fParY), fPoints(cont.fPoints), fXMinos(cont.fXMinos), fYMinos(cont.fYMinos), fNFcn(cont.fNFcn) {}
+
+  ContoursError& operator()(const ContoursError& cont) {
+    fParX = cont.fParX;
+    fParY = cont.fParY;
+    fPoints = cont.fPoints;
+    fXMinos = cont.fXMinos;
+    fYMinos = cont.fYMinos;
+    fNFcn = cont.fNFcn;
+    return *this;
+  }
+
+  const std::vector<std::pair<double,double> >& operator()() const {
+    return fPoints;
+  }
+
+  std::pair<double,double> XMinos() const {
+    return fXMinos();
+  }
+
+  std::pair<double,double> YMinos() const {
+    return fYMinos();
+  }
+
+  unsigned int Xpar() const {return fParX;}
+  unsigned int Ypar() const {return fParY;}
+
+  const MinosError& XMinosError() const {
+    return fXMinos;
+  }
+
+  const MinosError& YMinosError() const {
+    return fYMinos;
+  }
+
+  unsigned int NFcn() const {return fNFcn;}
+  double XMin() const {return fXMinos.Min();}
+  double YMin() const {return fYMinos.Min();}
+
+private:
+
+  unsigned int fParX;
+  unsigned int fParY;
+  std::vector<std::pair<double,double> > fPoints;
+  MinosError fXMinos;
+  MinosError fYMinos;
+  unsigned int fNFcn;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ContoursError
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/DavidonErrorUpdator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/DavidonErrorUpdator.h
new file mode 100644
index 0000000..8e099a0
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/DavidonErrorUpdator.h
@@ -0,0 +1,44 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_DavidonErrorUpdator
+#define ROOT_Minuit2_DavidonErrorUpdator
+
+#ifndef ROOT_Minuit2_MinimumErrorUpdator
+#include "Minuit2/MinimumErrorUpdator.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+   Update of the covariance matrix for the Variable Metric minimizer (MIGRAD)
+ */
+class DavidonErrorUpdator : public MinimumErrorUpdator {
+
+public:
+
+  DavidonErrorUpdator() {}
+
+  virtual ~DavidonErrorUpdator() {}
+
+  virtual MinimumError Update(const MinimumState&, const MinimumParameters&,
+                              const FunctionGradient&) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_DavidonErrorUpdator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNAdapter.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNAdapter.h
new file mode 100644
index 0000000..a42e1fe
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNAdapter.h
@@ -0,0 +1,71 @@
+// @(#)root/minuit2:$Id$
+// Author: L. Moneta    10/2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006 ROOT Foundation,  CERN/PH-SFT                   *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FCNAdapter
+#define ROOT_Minuit2_FCNAdapter
+
+#ifndef ROOT_Minuit2_FCNBase
+#include "Minuit2/FCNBase.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+/**
+
+
+template wrapped class for adapting to FCNBase signature
+
+ at author Lorenzo Moneta
+
+ at ingroup Minuit
+
+*/
+
+template< class Function>
+class FCNAdapter : public FCNBase {
+
+public:
+
+   FCNAdapter(const Function & f, double up = 1.) :
+      fFunc(f) ,
+      fUp (up)
+   {}
+
+   ~FCNAdapter() {}
+
+
+   double operator()(const std::vector<double>& v) const {
+      return fFunc.operator()(&v[0]);
+   }
+   double operator()(const double *  v) const {
+      return fFunc.operator()(v);
+   }
+   double Up() const {return fUp;}
+
+   void SetErrorDef(double up) { fUp = up; }
+
+   //virtual std::vector<double> Gradient(const std::vector<double>&) const;
+
+   // forward interface
+   //virtual double operator()(int npar, double* params,int iflag = 4) const;
+
+private:
+   const Function & fFunc;
+   double fUp;
+};
+
+   } // end namespace Minuit2
+
+} // end namespace ROOT
+
+
+
+#endif //ROOT_Minuit2_FCNAdapter
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNBase.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNBase.h
new file mode 100644
index 0000000..c31c944
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNBase.h
@@ -0,0 +1,122 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FCNBase
+#define ROOT_Minuit2_FCNBase
+
+#include "Minuit2/MnConfig.h"
+
+#include <vector>
+
+#include "Minuit2/GenericFunction.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+
+  \defgroup Minuit Minuit2 Minimization Library
+
+  New Object-oriented implementation of the MINUIT minimization package.
+  More information is available at the home page of the \ref Minuit2Page "Minuit2" minimization package".
+
+  \ingroup Math
+*/
+
+
+//______________________________________________________________________________
+/**
+
+
+Interface (abstract class) defining the function to be minimized, which has to be implemented by the user.
+
+ at author Fred James and Matthias Winkler; modified by Andras Zsenei and Lorenzo Moneta
+
+\ingroup Minuit
+
+ */
+
+class FCNBase : public GenericFunction {
+
+public:
+
+
+   virtual ~FCNBase() {}
+
+
+
+   /**
+
+      The meaning of the vector of parameters is of course defined by the user,
+      who uses the values of those parameters to calculate their function Value.
+      The order and the position of these parameters is strictly the one specified
+      by the user when supplying the starting values for minimization. The starting
+      values must be specified by the user, either via an std::vector<double> or the
+      MnUserParameters supplied as input to the MINUIT minimizers such as
+      VariableMetricMinimizer or MnMigrad. Later values are determined by MINUIT
+      as it searches for the Minimum or performs whatever analysis is requested by
+      the user.
+
+      @param par function parameters as defined by the user.
+
+      @return the Value of the function.
+
+      @see MnUserParameters
+      @see VariableMetricMinimizer
+      @see MnMigrad
+
+   */
+
+   virtual double operator()(const std::vector<double>& x) const = 0;
+
+
+   /**
+
+      Error definition of the function. MINUIT defines Parameter errors as the
+      change in Parameter Value required to change the function Value by up. Normally,
+      for chisquared fits it is 1, and for negative log likelihood, its Value is 0.5.
+      If the user wants instead the 2-sigma errors for chisquared fits, it becomes 4,
+      as Chi2(x+n*sigma) = Chi2(x) + n*n.
+
+      Comment a little bit better with links!!!!!!!!!!!!!!!!!
+
+   */
+
+   virtual double ErrorDef() const {return Up();}
+
+
+   /**
+
+      Error definition of the function. MINUIT defines Parameter errors as the
+      change in Parameter Value required to change the function Value by up. Normally,
+      for chisquared fits it is 1, and for negative log likelihood, its Value is 0.5.
+      If the user wants instead the 2-sigma errors for chisquared fits, it becomes 4,
+      as Chi2(x+n*sigma) = Chi2(x) + n*n.
+
+      \todo Comment a little bit better with links!!!!!!!!!!!!!!!!! Idem for ErrorDef()
+
+   */
+
+   virtual double Up() const = 0;
+
+   /**
+       add interface to set dynamically a new error definition
+       Re-implement this function if needed.
+   */
+   virtual void SetErrorDef(double ) {};
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FCNBase
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNGradAdapter.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNGradAdapter.h
new file mode 100644
index 0000000..2a1ceb1
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNGradAdapter.h
@@ -0,0 +1,88 @@
+// @(#)root/minuit2:$Id$
+// Author: L. Moneta    10/2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006 ROOT Foundation,  CERN/PH-SFT                   *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FCNGradAdapter
+#define ROOT_Minuit2_FCNGradAdapter
+
+#ifndef ROOT_Minuit2_FCNGradientBase
+#include "Minuit2/FCNGradientBase.h"
+#endif
+
+//#define DEBUG
+#ifdef DEBUG
+#include <iostream>
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+/**
+
+
+template wrapped class for adapting to FCNBase signature a IGradFunction
+
+ at author Lorenzo Moneta
+
+ at ingroup Minuit
+
+*/
+
+template< class Function>
+class FCNGradAdapter : public FCNGradientBase {
+
+public:
+
+   FCNGradAdapter(const Function & f, double up = 1.) :
+      fFunc(f) ,
+      fUp (up) ,
+      fGrad(std::vector<double>(fFunc.NDim() ) )
+
+   {}
+
+   ~FCNGradAdapter() {}
+
+
+   double operator()(const std::vector<double>& v) const {
+      return fFunc.operator()(&v[0]);
+   }
+   double operator()(const double *  v) const {
+      return fFunc.operator()(v);
+   }
+
+   double Up() const {return fUp;}
+
+   std::vector<double> Gradient(const std::vector<double>& v) const {
+      fFunc.Gradient(&v[0], &fGrad[0]);
+
+#ifdef DEBUG
+      std::cout << " gradient in FCNAdapter = { " ;
+      for (unsigned int i = 0; i < fGrad.size(); ++i)
+         std::cout << fGrad[i] << "\t";
+      std::cout << "}" << std::endl;
+#endif
+      return fGrad;
+   }
+   // forward interface
+   //virtual double operator()(int npar, double* params,int iflag = 4) const;
+   bool CheckGradient() const { return false; }
+
+private:
+   const Function & fFunc;
+   double fUp;
+   mutable std::vector<double> fGrad;
+};
+
+   } // end namespace Minuit2
+
+} // end namespace ROOT
+
+
+
+#endif //ROOT_Minuit2_FCNGradAdapter
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNGradientBase.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNGradientBase.h
new file mode 100644
index 0000000..463504c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FCNGradientBase.h
@@ -0,0 +1,48 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FCNGradientBase
+#define ROOT_Minuit2_FCNGradientBase
+
+#include "Minuit2/FCNBase.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//________________________________________________________________________
+/** Extension of the FCNBase for providing the analytical Gradient of the
+    function. The user-Gradient is checked at the beginning of the
+    minimization against the Minuit internal numerical Gradient in order to
+    spot problems in the analytical Gradient calculation. This can be turned
+    off by overriding CheckGradient() to make it return "false".
+    The size of the output Gradient vector must be equal to the size of the
+    input Parameter vector.
+    Minuit does a check of the user Gradient at the beginning, if this is not
+    wanted the method "CheckGradient()" has to be overridden to return
+    "false".
+ */
+
+class FCNGradientBase : public FCNBase {
+
+public:
+
+   virtual ~FCNGradientBase() {}
+
+   virtual std::vector<double> Gradient(const std::vector<double>&) const = 0;
+
+   virtual bool CheckGradient() const {return true;}
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FCNGradientBase
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliBuilder.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliBuilder.h
new file mode 100644
index 0000000..429d661
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliBuilder.h
@@ -0,0 +1,143 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliBuilder
+#define ROOT_Minuit2_FumiliBuilder
+
+#include "Minuit2/MinimumBuilder.h"
+#include "Minuit2/VariableMetricEDMEstimator.h"
+#include "Minuit2/FumiliErrorUpdator.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/FunctionMinimum.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+
+Builds the FunctionMinimum using the Fumili method.
+
+ at author Andras Zsenei, Creation date: 29 Sep 2004
+
+ at see <A HREF="http://www.cern.ch/winkler/minuit/tutorial/mntutorial.pdf">MINUIT Tutorial</A> on function minimization, section 5
+
+ at ingroup Minuit
+
+\todo the role of the strategy in Fumili
+
+*/
+
+
+
+class FumiliBuilder : public MinimumBuilder {
+
+public:
+
+  FumiliBuilder() : fEstimator(VariableMetricEDMEstimator()),
+   fErrorUpdator(FumiliErrorUpdator()) {}
+
+  ~FumiliBuilder() {}
+
+
+  /**
+
+  Class the member function calculating the Minimum and verifies the result
+  depending on the strategy.
+
+  @param fMnFcn the function to be minimized.
+
+  @param fGradienCalculator not used in Fumili.
+
+  @param fMinimumSeed the seed generator.
+
+  @param fMnStrategy the strategy describing the number of function calls
+  allowed for Gradient calculations.
+
+  @param maxfcn maximum number of function calls after which the calculation
+  will be stopped even if it has not yet converged.
+
+  @param edmval expected vertical distance to the Minimum.
+
+  @return Returns the function Minimum found.
+
+
+  \todo Complete the documentation by understanding what is the reason to
+  have two Minimum methods.
+
+  */
+
+  virtual FunctionMinimum Minimum(const MnFcn& fMnFcn, const GradientCalculator& fGradienCalculator, const MinimumSeed& fMinimumSeed, const MnStrategy& fMnStrategy, unsigned int maxfcn, double edmval) const;
+
+
+  /**
+
+  Calculates the Minimum based on the Fumili method
+
+  @param fMnFcn the function to be minimized.
+
+  @param fGradienCalculator not used in Fumili
+
+  @param fMinimumSeed the seed generator.
+
+  @param states vector containing the state result of each iteration
+
+  @param maxfcn maximum number of function calls after which the calculation
+  will be stopped even if it has not yet converged.
+
+  @param edmval expected vertical distance to the Minimum
+
+  @return Returns the function Minimum found.
+
+  @see <A HREF="http://www.cern.ch/winkler/minuit/tutorial/mntutorial.pdf">MINUIT Tutorial</A> on function minimization, section 5
+
+
+  \todo some nice Latex based formula here...
+
+  */
+
+  FunctionMinimum Minimum(const MnFcn& fMnFcn, const GradientCalculator& fGradienCalculator, const MinimumSeed& fMinimumSeed, std::vector<MinimumState> & states, unsigned int maxfcn, double edmval) const;
+
+
+  /**
+
+  Accessor to the EDM (expected vertical distance to the Minimum) estimator.
+
+  @return The EDM estimator used in the builder.
+
+  \todo Maybe a little explanation concerning EDM in all relevant classes.
+
+  */
+
+  const VariableMetricEDMEstimator& Estimator() const {return fEstimator;}
+
+
+  /**
+
+  Accessor to the Error updator of the builder.
+
+  @return The FumiliErrorUpdator used by the FumiliBuilder.
+
+  */
+
+  const FumiliErrorUpdator& ErrorUpdator() const {return fErrorUpdator;}
+
+
+private:
+
+  VariableMetricEDMEstimator fEstimator;
+  FumiliErrorUpdator fErrorUpdator;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliBuilder
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliChi2FCN.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliChi2FCN.h
new file mode 100644
index 0000000..45bdc14
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliChi2FCN.h
@@ -0,0 +1,182 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliChi2FCN
+#define ROOT_Minuit2_FumiliChi2FCN
+
+#include "FumiliFCNBase.h"
+#include <vector>
+#include "Minuit2/ParametricFunction.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+/**
+
+Extension of the FCNBase for the Fumili method. Fumili applies only to
+minimization problems used for fitting. The method is based on a
+linearization of the model function negleting second derivatives.
+User needs to provide the model function. The figure-of-merit describing
+the difference between the model function and the actual measurements in
+the case of chi-square is the sum of the squares of the figures-of-merit
+calculated for each measurement point, which is implemented by the
+operator() member function. The user still has to implement the calculation
+of the individual figures-of-merit (which in the majority of the cases
+will be the (measured Value - the Value predicted by the model)/standard deviation
+implemeted by the FumiliStandardChi2FCN;
+however this form can become more complicated (see for an example Numerical Recipes'
+section on "Straight-Line Data with Errors in Both Coordinates")).
+
+
+ at author Andras Zsenei and Lorenzo Moneta, Creation date: 24 Aug 2004
+
+ at see <A HREF="http://www.cern.ch/winkler/minuit/tutorial/mntutorial.pdf">MINUIT Tutorial</A> on function minimization, section 5
+
+ at see FumiliStandardChi2FCN
+
+ at ingroup Minuit
+
+*/
+
+
+
+class FumiliChi2FCN : public FumiliFCNBase {
+
+public:
+
+  FumiliChi2FCN() {}
+
+  virtual ~FumiliChi2FCN() {}
+
+
+
+  /**
+
+  Sets the model function for the data (for example gaussian+linear for a peak)
+
+  @param modelFunction a reference to the model function.
+
+  */
+
+  void SetModelFunction(const ParametricFunction& modelFCN) { fModelFunction = &modelFCN; }
+
+
+
+  /**
+
+  Returns the model function used for the data.
+
+  @return Returns a pointer to the model function.
+
+  */
+
+  const ParametricFunction *  ModelFunction() const { return fModelFunction; }
+
+
+
+  /**
+
+  Evaluates the model function for the different measurement points and
+  the Parameter values supplied, calculates a figure-of-merit for each
+  measurement and returns a vector containing the result of this
+  evaluation.
+
+  @param par vector of Parameter values to feed to the model function.
+
+  @return A vector containing the figures-of-merit for the model function evaluated
+  for each set of measurements.
+
+  */
+
+  virtual std::vector<double> Elements(const std::vector<double>& par) const = 0;
+
+
+
+  /**
+
+  Accessor to the parameters of a given measurement. For example in the
+  case of a chi-square fit with a one-dimensional Gaussian, the Parameter
+  characterizing the measurement will be the position. It is the Parameter
+  that is feeded to the model function.
+
+  @param Index Index of the measueremnt the parameters of which to return
+  @return A reference to a vector containing the values characterizing a measurement
+
+  */
+
+  virtual const std::vector<double> &  GetMeasurement(int Index) const = 0;
+
+
+  /**
+
+  Accessor to the number of measurements used for calculating the
+  present figure of merit.
+
+  @return the number of measurements
+
+  */
+
+  virtual int GetNumberOfMeasurements() const = 0;
+
+
+
+  /**
+
+  Calculates the sum of Elements squared, ie the chi-square. The user must
+  implement in a class which inherits from FumiliChi2FCN the member function
+  Elements() which will supply the Elements for the sum.
+
+
+  @param par vector containing the Parameter values for the model function
+
+  @return The sum of Elements squared
+
+  @see FumiliFCNBase#elements
+
+  */
+
+  double operator()(const std::vector<double>& par) const {
+
+    double chiSquare = 0.0;
+    std::vector<double> vecElements =  Elements(par);
+    unsigned int vecElementsSize = vecElements.size();
+
+    for (unsigned int i = 0; i < vecElementsSize; ++i)
+      chiSquare += vecElements[i]*vecElements[i];
+
+    return chiSquare;
+  }
+
+
+
+  /**
+
+  !!!!!!!!!!!! to be commented
+
+  */
+
+  virtual double Up() const { return 1.0; }
+
+ private:
+
+  // A pointer to the model function which describes the data
+  const ParametricFunction *fModelFunction;
+
+
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliChi2FCN
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliErrorUpdator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliErrorUpdator.h
new file mode 100644
index 0000000..2f490dd
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliErrorUpdator.h
@@ -0,0 +1,111 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliErrorUpdator
+#define ROOT_Minuit2_FumiliErrorUpdator
+
+#include "Minuit2/MinimumErrorUpdator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumState;
+class MinimumParameters;
+class GradientCalculator;
+class FumiliFCNBase;
+class FunctionGradient;
+
+/**
+
+In the case of the Fumili algorithm the Error matrix (or the Hessian
+matrix containing the (approximate) second derivatives) is calculated
+using a linearization of the model function negleting second
+derivatives. (In some sense the Name Updator is a little bit misleading
+as the Error matrix is not calculated by iteratively updating, like
+in Davidon's or other similar variable metric methods, but by
+recalculating each time).
+
+
+ at author  Andras Zsenei and Lorenzo Moneta, Creation date: 28 Sep 2004
+
+ at see <A HREF="http://www.cern.ch/winkler/minuit/tutorial/mntutorial.pdf">MINUIT Tutorial</A> on function minimization, section 5
+
+ at see DavidonErrorUpdator
+
+ at ingroup Minuit
+
+*/
+
+class FumiliErrorUpdator : public MinimumErrorUpdator {
+
+public:
+
+  FumiliErrorUpdator() {}
+
+  ~FumiliErrorUpdator() {  }
+
+
+
+  /**
+
+  Member function that calculates the Error matrix (or the Hessian
+  matrix containing the (approximate) second derivatives) using a
+  linearization of the model function negleting second derivatives.
+
+  @param fMinimumState used to calculate the change in the covariance
+  matrix between the two iterations
+
+  @param fMinimumParameters the parameters at the present iteration
+
+  @param fGradientCalculator the Gradient calculator used to retrieved the Parameter transformation
+
+  @param fFumiliFCNBase the function calculating the figure of merit.
+
+
+  \todo Some nice latex mathematical formuli...
+
+  */
+
+  virtual MinimumError Update(const MinimumState& fMinimumState,
+                              const MinimumParameters& fMinimumParameters,
+                              const GradientCalculator& fGradientCalculator,
+                              double lambda) const;
+
+
+
+  /**
+
+  Member function which is only present due to the design already in place
+  of the software. As all classes calculating the Error matrix are supposed
+  inherit from the MinimumErrorUpdator they must inherit this method. In some
+  methods calculating the aforementioned matrix some of these parameters are
+  not needed and other parameters are necessary... Hopefully, a more elegant
+  solution will be found in the future.
+
+  \todo How to get rid of this dummy method which is only due to the inheritance
+
+  */
+
+  virtual MinimumError Update(const MinimumState&, const MinimumParameters&,
+                              const FunctionGradient&) const;
+
+
+
+private:
+
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliErrorUpdator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliFCNAdapter.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliFCNAdapter.h
new file mode 100644
index 0000000..85082da
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliFCNAdapter.h
@@ -0,0 +1,173 @@
+// @(#)root/minuit2:$Id$
+// Author: L. Moneta    10/2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006 ROOT Foundation,  CERN/PH-SFT                   *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliFCNAdapter
+#define ROOT_Minuit2_FumiliFCNAdapter
+
+#ifndef ROOT_Minuit2_FumiliFCNBase
+#include "Minuit2/FumiliFCNBase.h"
+#endif
+
+#ifndef ROOT_Math_FitMethodFunction
+#include "Math/FitMethodFunction.h"
+#endif
+
+#ifndef ROOT_Minuit2_MnPrint
+#include "Minuit2/MnPrint.h"
+#endif
+
+// #ifndef ROOT_Math_Util
+// #include "Math/Util.h"
+// #endif
+
+#include <cmath>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+/**
+
+
+template wrapped class for adapting to FumiliFCNBase signature
+
+ at author Lorenzo Moneta
+
+ at ingroup Minuit
+
+*/
+
+template< class Function>
+class FumiliFCNAdapter : public FumiliFCNBase {
+
+public:
+
+//   typedef ROOT::Math::FitMethodFunction Function;
+   typedef typename Function::Type_t Type_t;
+
+   FumiliFCNAdapter(const Function & f, unsigned int ndim, double up = 1.) :
+      FumiliFCNBase( ndim ),
+      fFunc(f) ,
+      fUp (up)
+   {}
+
+   ~FumiliFCNAdapter() {}
+
+
+   double operator()(const std::vector<double>& v) const {
+      return fFunc.operator()(&v[0]);
+   }
+   double operator()(const double *  v) const {
+      return fFunc.operator()(v);
+   }
+   double Up() const {return fUp;}
+
+   void SetErrorDef(double up) { fUp = up; }
+
+   //virtual std::vector<double> Gradient(const std::vector<double>&) const;
+
+   // forward interface
+   //virtual double operator()(int npar, double* params,int iflag = 4) const;
+
+
+ /**
+     evaluate gradient hessian and function value needed by fumili
+   */
+   void EvaluateAll( const std::vector<double> & v);
+
+private:
+
+
+//data member
+
+   const Function & fFunc;
+   double fUp;
+};
+
+
+template<class Function>
+void FumiliFCNAdapter<Function>::EvaluateAll( const std::vector<double> & v) {
+
+   //typedef FumiliFCNAdapter::Function Function;
+
+   //evaluate all elements
+   unsigned int npar = Dimension();
+   if (npar != v.size() ) std::cout << "npar = " << npar << "  " << v.size() << std::endl;
+   assert(npar == v.size());
+   //must distinguish case of likelihood or LS
+
+   std::vector<double> & grad = Gradient();
+   std::vector<double> & hess = Hessian();
+   // reset
+   assert(grad.size() == npar);
+   grad.assign( npar, 0.0);
+   hess.assign( hess.size(), 0.0);
+
+   double sum = 0;
+   unsigned int ndata = fFunc.NPoints();
+
+   std::vector<double> gf(npar);
+
+   //loop on the data points
+
+
+   // assume for now least-square
+   if (fFunc.Type() == Function::kLeastSquare) {
+
+      for (unsigned int i = 0; i < ndata; ++i) {
+         // calculate data element and gradient
+         double fval = fFunc.DataElement(&v.front(), i, &gf[0]);
+
+         // t.b.d should protect for bad  values of fval
+         sum += fval*fval;
+
+         for (unsigned int j = 0; j < npar; ++j) {
+            grad[j] += 2. * fval * gf[j];
+            for (unsigned int k = j; k < npar; ++ k) {
+               int idx =  j + k*(k+1)/2;
+               hess[idx] += 2.0 * gf[j] * gf[k];
+            }
+         }
+      }
+   }
+   else if (fFunc.Type() == Function::kLogLikelihood) {
+
+
+      for (unsigned int i = 0; i < ndata; ++i) {
+
+         // calculate data element and gradient
+         // return value is log of pdf and derivative of the log(Pdf)
+         double fval = fFunc.DataElement(&v.front(), i, &gf[0]);
+
+         sum -= fval;
+
+         for (unsigned int j = 0; j < npar; ++j) {
+            double gfj = gf[j] ;
+            grad[j] -= gfj;
+            for (unsigned int k = j; k < npar; ++ k) {
+               int idx =  j + k*(k+1)/2;
+               hess[idx] +=  gfj * gf[k] ;
+            }
+         }
+      }
+   }
+   else {
+      MN_ERROR_MSG("FumiliFCNAdapter: type of fit method is not supported, it must be chi2 or log-likelihood");
+   }
+}
+
+
+   } // end namespace Minuit2
+
+} // end namespace ROOT
+
+
+
+
+#endif //ROOT_Minuit2_FCNAdapter
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliFCNBase.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliFCNBase.h
new file mode 100644
index 0000000..ffd06f4
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliFCNBase.h
@@ -0,0 +1,170 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliFCNBase
+#define ROOT_Minuit2_FumiliFCNBase
+
+#include "Minuit2/FCNBase.h"
+#include <cassert>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//____________________________________________________________________________________________
+/**
+
+Extension of the FCNBase for the Fumili method. Fumili applies only to
+minimization problems used for fitting. The method is based on a
+linearization of the model function negleting second derivatives.
+User needs to provide the model function. The figure-of-merit describing
+the difference between the model function and the actual measurements
+has to be implemented by the user in a subclass of FumiliFCNBase.
+For an example see the FumiliChi2FCN and FumiliStandardChi2FCN classes.
+
+
+ at author  Andras Zsenei and Lorenzo Moneta, Creation date: 23 Aug 2004
+
+ at see <A HREF="http://www.cern.ch/winkler/minuit/tutorial/mntutorial.pdf">MINUIT Tutorial</A> on function minimization, section 5
+
+ at see FumiliChi2FCN
+
+ at see FumiliStandardChi2FCN
+
+ at ingroup Minuit
+
+ */
+
+
+
+class FumiliFCNBase : public FCNBase {
+
+public:
+
+   /**
+      Default Constructor. Need in this case to create when implementing EvaluateAll the Gradient and Hessian vectors with the right size
+   */
+
+   FumiliFCNBase()  :
+      fNumberOfParameters(0),
+      fValue(0)
+   {}
+
+   /**
+
+      Constructor which initializes the class with the function provided by the
+      user for modeling the data.
+
+      @param npar the number of parameters
+
+   */
+
+
+   FumiliFCNBase(unsigned int npar) :
+      fNumberOfParameters(npar),
+      fValue(0),
+      fGradient(std::vector<double>(npar)),
+      fHessian(std::vector<double>(static_cast<int>( 0.5*npar*(npar+1) )) )
+   {}
+
+
+
+//   FumiliFCNBase(const ParametricFunction& modelFCN) { fModelFunction = &modelFCN; }
+
+
+
+   virtual ~FumiliFCNBase() {}
+
+
+
+
+   /**
+
+      Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p
+      The resul is cached inside and is return from the FumiliFCNBase::Value ,  FumiliFCNBase::Gradient and
+      FumiliFCNBase::Hessian methods
+
+      @param par vector of parameters
+
+   **/
+
+   virtual  void EvaluateAll( const std::vector<double> & par ) = 0;
+
+
+   /**
+      Return cached Value of objective function estimated previously using the  FumiliFCNBase::EvaluateAll method
+
+   **/
+
+   virtual double Value() const { return fValue; }
+
+   /**
+      Return cached Value of function Gradient estimated previously using the  FumiliFCNBase::EvaluateAll method
+   **/
+
+   virtual const std::vector<double> & Gradient() const { return fGradient; }
+
+   /**
+      Return Value of the i-th j-th element of the Hessian matrix estimated previously using the  FumiliFCNBase::EvaluateAll method
+      @param row row Index of the matrix
+      @param col col Index of the matrix
+   **/
+
+   virtual double Hessian(unsigned int row, unsigned int col) const {
+      assert( row < fGradient.size() && col < fGradient.size() );
+      if(row > col)
+         return fHessian[col+row*(row+1)/2];
+      else
+         return fHessian[row+col*(col+1)/2];
+   }
+
+   /**
+      return number of function variable (parameters) , i.e. function dimension
+   */
+
+   virtual unsigned int Dimension() { return fNumberOfParameters; }
+
+protected :
+
+   /**
+      initialize and reset values of gradien and Hessian
+   */
+
+   virtual void InitAndReset(unsigned int npar) {
+      fNumberOfParameters = npar;
+      fGradient = std::vector<double>(npar);
+      fHessian = std::vector<double>(static_cast<int>( 0.5*npar*(npar+1) ));
+   }
+
+   // methods to be used by the derived classes to set the values
+   void SetFCNValue(double value) { fValue = value; }
+
+   std::vector<double> & Gradient() { return fGradient; }
+
+   std::vector<double> & Hessian() { return fHessian; }
+
+
+
+
+private:
+
+   unsigned int fNumberOfParameters;
+   double fValue;
+   std::vector<double> fGradient;
+   std::vector<double> fHessian;
+
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliFCNBase
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliGradientCalculator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliGradientCalculator.h
new file mode 100644
index 0000000..1a87908
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliGradientCalculator.h
@@ -0,0 +1,58 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliGradientCalculator
+#define ROOT_Minuit2_FumiliGradientCalculator
+
+#include "Minuit2/GradientCalculator.h"
+#include "Minuit2/MnMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+class FumiliFCNBase;
+class MnUserTransformation;
+
+class FumiliGradientCalculator : public GradientCalculator {
+
+public:
+
+  FumiliGradientCalculator(const FumiliFCNBase& fcn, const MnUserTransformation& state, int n) :
+    fFcn(fcn),
+    fTransformation(state),
+    fHessian(MnAlgebraicSymMatrix(n) )
+  {}
+
+  ~FumiliGradientCalculator() {}
+
+  FunctionGradient operator()(const MinimumParameters&) const;
+
+  FunctionGradient operator()(const MinimumParameters&,
+                              const FunctionGradient&) const;
+
+  const MnUserTransformation& Trafo() const {return fTransformation;}
+
+  const MnAlgebraicSymMatrix & Hessian() const { return fHessian; }
+
+private:
+
+  const FumiliFCNBase& fFcn;
+  const MnUserTransformation& fTransformation;
+  mutable MnAlgebraicSymMatrix fHessian;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliGradientCalculator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliMaximumLikelihoodFCN.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliMaximumLikelihoodFCN.h
new file mode 100644
index 0000000..fa6cdc5
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliMaximumLikelihoodFCN.h
@@ -0,0 +1,183 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliMaximumLikelihoodFCN
+#define ROOT_Minuit2_FumiliMaximumLikelihoodFCN
+
+#include "FumiliFCNBase.h"
+#include <vector>
+#include <cmath>
+#include <float.h>
+#include "Minuit2/ParametricFunction.h"
+#include "Math/Util.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//#include <iostream>
+
+/**
+
+Extension of the FCNBase for the Fumili method. Fumili applies only to
+minimization problems used for fitting. The method is based on a
+linearization of the model function negleting second derivatives.
+User needs to provide the model function. In this cased the function
+to be minimized is the sum of the logarithms of the model function
+for the different measurements times -1.
+
+
+ at author Andras Zsenei and Lorenzo Moneta, Creation date: 3 Sep 2004
+
+ at see <A HREF="http://www.cern.ch/winkler/minuit/tutorial/mntutorial.pdf">MINUIT Tutorial</A> on function minimization, section 5
+
+ at see FumiliStandardMaximumLikelihoodFCN
+
+ at ingroup Minuit
+
+\todo Insert a nice latex formula...
+
+*/
+
+
+
+class FumiliMaximumLikelihoodFCN : public FumiliFCNBase {
+
+public:
+
+  FumiliMaximumLikelihoodFCN() {}
+
+  virtual ~FumiliMaximumLikelihoodFCN() {}
+
+
+  /**
+
+  Sets the model function for the data (for example gaussian+linear for a peak)
+
+  @param modelFunction a reference to the model function.
+
+  */
+
+  void SetModelFunction(const ParametricFunction& modelFCN) { fModelFunction = &modelFCN; }
+
+
+
+  /**
+
+  Returns the model function used for the data.
+
+  @return Returns a pointer to the model function.
+
+  */
+
+  const ParametricFunction*  ModelFunction() const { return fModelFunction; }
+
+
+
+  /**
+
+  Evaluates the model function for the different measurement points and
+  the Parameter values supplied, calculates a figure-of-merit for each
+  measurement and returns a vector containing the result of this
+  evaluation.
+
+  @param par vector of Parameter values to feed to the model function.
+
+  @return A vector containing the figures-of-merit for the model function evaluated
+  for each set of measurements.
+
+  */
+
+  virtual std::vector<double> Elements(const std::vector<double>& par) const = 0;
+
+
+
+  /**
+
+  Accessor to the parameters of a given measurement. For example in the
+  case of a chi-square fit with a one-dimensional Gaussian, the Parameter
+  characterizing the measurement will be the position. It is the Parameter
+  that is feeded to the model function.
+
+  @param Index Index of the measueremnt the parameters of which to return
+  @return A vector containing the values characterizing a measurement
+
+  */
+
+  virtual const std::vector<double> & GetMeasurement(int Index) const = 0;
+
+
+  /**
+
+  Accessor to the number of measurements used for calculating the
+  present figure of merit.
+
+  @return the number of measurements
+
+  */
+
+  virtual int GetNumberOfMeasurements() const = 0;
+
+
+  /**
+
+  Calculates the function for the maximum likelihood method. The user must
+  implement in a class which inherits from FumiliChi2FCN the member function
+  Elements() which will supply the Elements for the sum.
+
+
+  @param par vector containing the Parameter values for the model function
+
+  @return The sum of the natural logarithm of the Elements multiplied by -1
+
+  @see FumiliFCNBase#elements
+
+  */
+
+  double operator()(const std::vector<double>& par) const {
+
+     double sumoflogs = 0.0;
+     std::vector<double> vecElements =  Elements(par);
+     unsigned int vecElementsSize = vecElements.size();
+
+     for (unsigned int i = 0; i < vecElementsSize; ++i) {
+        double tmp = vecElements[i];
+        //for max likelihood probability have to be positive
+        assert(tmp >= 0);
+        sumoflogs -= BA_ROOT::Math::Util::EvalLog(tmp);
+        //std::cout << " i " << tmp << " lik " << sumoflogs << std::endl;
+     }
+
+
+     return sumoflogs;
+  }
+
+
+
+  /**
+
+  !!!!!!!!!!!! to be commented
+
+  */
+
+  virtual double Up() const { return 0.5; }
+
+ private:
+
+  // A pointer to the model function which describes the data
+  const ParametricFunction *fModelFunction;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliMaximumLikelihoodFCN
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliMinimizer.h
new file mode 100644
index 0000000..5d71fdb
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliMinimizer.h
@@ -0,0 +1,154 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliMinimizer
+#define ROOT_Minuit2_FumiliMinimizer
+
+#include "Minuit2/ModularFunctionMinimizer.h"
+#include "Minuit2/MnSeedGenerator.h"
+#include "Minuit2/FumiliBuilder.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+class MinimumSeedGenerator;
+class MinimumBuilder;
+class MinimumSeed;
+class MnFcn;
+class FumiliFcnBase;
+class GradientCalculator;
+class MnUserParameterState;
+class MnUserParameters;
+class MnUserCovariance;
+class MnStrategy;
+
+
+
+//______________________________________________________________
+/**
+
+Instantiates the seed generator and Minimum builder for the
+Fumili minimization method. Produces the Minimum via the
+Minimize methods inherited from ModularFunctionMinimizer.
+
+ at author Andras Zsenei and Lorenzo Moneta, Creation date: 28 Sep 2004
+
+ at ingroup Minuit
+
+*/
+
+
+class FumiliMinimizer : public ModularFunctionMinimizer {
+
+public:
+
+
+   /**
+
+      Constructor initializing the FumiliMinimizer by instantiatiating
+      the SeedGenerator and MinimumBuilder for the Fumili minimization method.
+
+      @see MnSeedGenerator
+
+      @see FumiliBuilder
+
+   */
+
+   FumiliMinimizer() : fMinSeedGen(MnSeedGenerator()),
+                       fMinBuilder(FumiliBuilder()) {}
+
+   ~FumiliMinimizer() {}
+
+
+   /**
+
+      Accessor to the seed generator of the minimizer.
+
+      @return A reference to the seed generator used by the minimizer
+
+   */
+
+   const MinimumSeedGenerator& SeedGenerator() const {return fMinSeedGen;}
+
+
+   /**
+
+      Accessor to the Minimum builder of the minimizer.
+
+      @return a reference to the Minimum builder.
+
+   */
+
+   const FumiliBuilder& Builder() const {return fMinBuilder;}
+   FumiliBuilder& Builder()  {return fMinBuilder;}
+
+
+   // for Fumili
+
+   FunctionMinimum Minimize(const FCNBase&, const MnUserParameterState&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const MnUserParameterState&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   // need to re-implement all function in ModularFuncitionMinimizer otherwise they will be hided
+
+   virtual FunctionMinimum Minimize(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn, par, err, stra, maxfcn,toler);
+   }
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase&fcn, const std::vector<double>&par, const std::vector<double>&err, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn,par,err,stra,maxfcn,toler);
+   }
+
+   virtual FunctionMinimum Minimize(const FCNBase& fcn, const std::vector<double>&par, unsigned int nrow, const std::vector<double>&cov, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn,par,nrow,cov,stra,maxfcn,toler);
+   }
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase& fcn, const std::vector<double>&par, unsigned int nrow, const std::vector<double>&cov, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn,par,nrow,cov,stra,maxfcn,toler);
+   }
+
+
+   virtual FunctionMinimum Minimize(const FCNBase& fcn, const MnUserParameters& par, const MnStrategy& stra, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn,par,stra,maxfcn,toler);
+   }
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase& fcn, const MnUserParameters& par, const MnStrategy& stra, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn,par,stra,maxfcn,toler);
+   }
+
+   virtual FunctionMinimum Minimize(const FCNBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, const MnStrategy& stra, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn,par,cov,stra,maxfcn,toler);
+   }
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, const MnStrategy& stra, unsigned int maxfcn = 0, double toler = 0.1) const {
+      return ModularFunctionMinimizer::Minimize(fcn,par,cov,stra,maxfcn,toler);
+   }
+
+
+
+   virtual FunctionMinimum Minimize(const MnFcn& mfcn, const GradientCalculator& gc, const MinimumSeed& seed, const MnStrategy& stra, unsigned int maxfcn, double toler) const {
+      return ModularFunctionMinimizer::Minimize(mfcn, gc, seed, stra, maxfcn, toler);
+   }
+
+
+private:
+
+   MnSeedGenerator fMinSeedGen;
+   FumiliBuilder fMinBuilder;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliMinimizer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliStandardChi2FCN.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliStandardChi2FCN.h
new file mode 100644
index 0000000..f36df60
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliStandardChi2FCN.h
@@ -0,0 +1,215 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliStandardChi2FCN
+#define ROOT_Minuit2_FumiliStandardChi2FCN
+
+
+#include "Minuit2/FumiliChi2FCN.h"
+#include "Minuit2/ParametricFunction.h"
+#include <assert.h>
+#include <vector>
+#include <cmath>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+/**
+
+Class implementing the standard chi square function, which
+is the sum of the squares of the figures-of-merit calculated for each measurement
+point, the individual figures-of-merit being: (the Value predicted by the
+model-measured Value)/standard deviation.
+
+ at author Andras Zsenei and Lorenzo Moneta, Creation date: 31 Aug 2004
+
+ at see FumiliChi2FCN
+
+ at ingroup Minuit
+
+\todo nice formula for the documentation...
+
+*/
+
+class FumiliStandardChi2FCN : public FumiliChi2FCN {
+
+public:
+
+
+  /**
+
+  Constructor which initializes chi square function for one-dimensional model function
+
+  @param modelFCN the model function used for describing the data.
+
+  @param meas vector containing the measured values.
+
+  @param pos vector containing the x values corresponding to the
+  measurements
+
+  @param mvar vector containing the variances corresponding to each
+  measurement (where the variance equals the standard deviation squared).
+  If the variances are zero, a Value of 1 is used (as it is done in ROOT/PAW)
+
+  */
+
+   FumiliStandardChi2FCN(const ParametricFunction& modelFCN, const std::vector<double>& meas,
+                         const std::vector<double>& pos,
+                         const std::vector<double>& mvar)
+   { //this->fModelFCN = &modelFunction;
+      this->SetModelFunction(modelFCN);
+
+      assert(meas.size() == pos.size());
+      assert(meas.size() == mvar.size());
+      fMeasurements = meas;
+      std::vector<double> x(1);
+      unsigned int n = mvar.size();
+      fPositions.reserve( n);
+      // correct for variance == 0
+      fInvErrors.resize(n);
+      for (unsigned int i = 0; i < n; ++i)
+      {
+         x[0] = pos[i];
+         fPositions.push_back(x);
+         // PAW/ROOT hack : use 1 for 0 entries bins
+         if (mvar[i] == 0)
+            fInvErrors[i] = 1;
+         else
+            fInvErrors[i] = 1.0/std::sqrt(mvar[i]);
+      }
+
+  }
+
+
+  /**
+
+  Constructor which initializes the multi-dimensional model function.
+
+  @param modelFCN the model function used for describing the data.
+
+  @param meas vector containing the measured values.
+
+  @param pos vector containing the x values corresponding to the
+  measurements
+
+  @param mvar vector containing the variances corresponding to each
+  measurement (where the variance equals the standard deviation squared).
+  If the variances are zero, a Value of 1 is used (as it is done in ROOT/PAW)
+
+  */
+
+  FumiliStandardChi2FCN(const ParametricFunction& modelFCN, const std::vector<double>& meas,
+                        const std::vector<std::vector<double> >& pos,
+                        const std::vector<double>& mvar)
+   { //this->fModelFCN = &modelFunction;
+      this->SetModelFunction(modelFCN);
+
+      assert(meas.size() == pos.size());
+      assert(meas.size() == mvar.size());
+      fMeasurements = meas;
+      fPositions = pos;
+      // correct for variance == 0
+      unsigned int n = mvar.size();
+      fInvErrors.resize(n);
+      for (unsigned int i = 0; i < n; ++i)
+      {
+         // PAW/ROOT hack : use 1 for 0 entries bins
+         if (mvar[i] == 0)
+            fInvErrors[i] = 1;
+         else
+            fInvErrors[i] = 1.0/std::sqrt(mvar[i]);
+      }
+
+  }
+
+
+
+
+  ~FumiliStandardChi2FCN() {}
+
+
+
+
+
+  /**
+
+  Evaluates the model function for the different measurement points and
+  the Parameter values supplied, calculates a figure-of-merit for each
+  measurement and returns a vector containing the result of this
+  evaluation. The figure-of-merit is (Value predicted by the model
+  function-measured Value)/standard deviation.
+
+  @param par vector of Parameter values to feed to the model function.
+
+  @return A vector containing the figures-of-merit for the model function evaluated
+  for each set of measurements.
+
+  \todo What to do when the variances are 0???!! (right now just pushes back 0...)
+
+  */
+
+  std::vector<double> Elements(const std::vector<double>& par) const;
+
+
+
+  /**
+
+  Accessor to the position of the measurement (x coordinate).
+
+  @param Index Index of the measuerement the position of which to return.
+
+  @return the position of the measurement.
+
+  */
+
+  virtual const std::vector<double> & GetMeasurement(int Index) const;
+
+
+  /**
+
+  Accessor to the number of measurements used for calculating
+  the chi-square.
+
+  @return the number of measurements.
+
+  */
+
+  virtual int GetNumberOfMeasurements() const;
+
+
+  /**
+
+  Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p
+  The resul is cached inside and is return from the FumiliFCNBase::Value ,  FumiliFCNBase::Gradient and
+  FumiliFCNBase::Hessian methods
+
+  @param par vector of parameters
+
+  **/
+
+  virtual  void EvaluateAll( const std::vector<double> & par );
+
+
+ private:
+
+
+  std::vector<double> fMeasurements;
+  // support multi dim coordinates
+  std::vector<std::vector<double> > fPositions;
+  std::vector<double> fInvErrors;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliStandardChi2FCN
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliStandardMaximumLikelihoodFCN.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliStandardMaximumLikelihoodFCN.h
new file mode 100644
index 0000000..6951e1b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FumiliStandardMaximumLikelihoodFCN.h
@@ -0,0 +1,158 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FumiliStandardMaximumLikelihoodFCN
+#define ROOT_Minuit2_FumiliStandardMaximumLikelihoodFCN
+
+
+#include "Minuit2/FumiliMaximumLikelihoodFCN.h"
+#include "Minuit2/ParametricFunction.h"
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+
+/**
+
+Class implementing the Elements member function for the standard
+maximum likelihood method.
+
+ at author Andras Zsenei and Lorenzo Moneta, Creation date: 4 Sep 2004
+
+ at see FumiliMaximumLikelihoodFCN
+
+ at ingroup Minuit
+
+*/
+
+class FumiliStandardMaximumLikelihoodFCN : public FumiliMaximumLikelihoodFCN {
+
+public:
+
+
+  /**
+
+  Constructor which initializes the measurement points for the one dimensional model function.
+
+  @param modelFCN the model function used for describing the data.
+
+  @param pos vector containing the x values corresponding to the
+  measurements
+
+  */
+
+   FumiliStandardMaximumLikelihoodFCN(const ParametricFunction& modelFCN,
+                                      const std::vector<double>& pos)
+  {
+    this->SetModelFunction(modelFCN);
+    unsigned int n = pos.size();
+    fPositions.reserve( n );
+    std::vector<double> x(1);
+    for (unsigned int i = 0; i < n; ++i) {
+      x[0] = pos[i];
+      fPositions.push_back(x);
+    }
+  }
+
+
+
+  /**
+
+  Constructor which initializes the measurement points for the multi dimensional model function.
+
+  @param modelFCN the model function used for describing the data.
+
+  @param pos vector containing the x values corresponding to the
+  measurements
+
+  */
+
+   FumiliStandardMaximumLikelihoodFCN(const ParametricFunction& modelFCN,
+                                      const std::vector<std::vector<double> >& pos) {
+      this->SetModelFunction(modelFCN);
+    fPositions = pos;
+
+  }
+
+
+
+
+  ~FumiliStandardMaximumLikelihoodFCN() {}
+
+
+
+
+  /**
+
+  Evaluates the model function for the different measurement points and
+  the Parameter values supplied.
+
+  @param par vector of Parameter values to feed to the model function.
+
+  @return A vector containing the model function evaluated
+  for each measurement point.
+
+  */
+
+  std::vector<double> Elements(const std::vector<double>& par) const;
+
+
+
+
+  /**
+
+  Accessor to the position of the measurement (x coordinate).
+
+  @param Index Index of the measuerement the position of which to return.
+
+  @return the position of the measurement.
+
+  */
+
+  virtual const std::vector<double> & GetMeasurement(int Index) const;
+
+
+  /**
+
+  Accessor to the number of measurements used for calculating
+  the maximum likelihood.
+
+  @return the number of measurements.
+
+  */
+
+  virtual int GetNumberOfMeasurements() const;
+
+  /**
+
+  Evaluate function Value, Gradient and Hessian using Fumili approximation, for values of parameters p
+  The resul is cached inside and is return from the FumiliFCNBase::Value ,  FumiliFCNBase::Gradient and
+  FumiliFCNBase::Hessian methods
+
+  @param par vector of parameters
+
+  **/
+
+  virtual  void EvaluateAll( const std::vector<double> & par );
+
+
+ private:
+
+  std::vector<std::vector<double> > fPositions;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FumiliStandardMaximumLikelihoodFCN
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionGradient.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionGradient.h
new file mode 100644
index 0000000..5eff31a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionGradient.h
@@ -0,0 +1,63 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FunctionGradient
+#define ROOT_Minuit2_FunctionGradient
+
+#include "Minuit2/MnRefCountedPointer.h"
+#include "Minuit2/BasicFunctionGradient.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FunctionGradient {
+
+private:
+
+public:
+
+  explicit FunctionGradient(unsigned int n) :
+   fData(MnRefCountedPointer<BasicFunctionGradient>(new BasicFunctionGradient(n)))  {}
+
+  explicit FunctionGradient(const MnAlgebraicVector& grd) :
+   fData(MnRefCountedPointer<BasicFunctionGradient>(new BasicFunctionGradient(grd))) {}
+
+  FunctionGradient(const MnAlgebraicVector& grd, const MnAlgebraicVector& g2,
+                   const MnAlgebraicVector& gstep) :
+   fData(MnRefCountedPointer<BasicFunctionGradient>(new BasicFunctionGradient(grd, g2, gstep))) {}
+
+  ~FunctionGradient() {}
+
+  FunctionGradient(const FunctionGradient& grad) : fData(grad.fData) {}
+
+  FunctionGradient& operator=(const FunctionGradient& grad) {
+    fData = grad.fData;
+    return *this;
+  }
+
+  const MnAlgebraicVector& Grad() const {return fData->Grad();}
+  const MnAlgebraicVector& Vec() const {return fData->Vec();}
+  bool IsValid() const {return fData->IsValid();}
+
+  bool IsAnalytical() const {return fData->IsAnalytical();}
+  const MnAlgebraicVector& G2() const {return fData->G2();}
+  const MnAlgebraicVector& Gstep() const {return fData->Gstep();}
+
+private:
+
+  MnRefCountedPointer<BasicFunctionGradient> fData;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FunctionGradient
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionMinimizer.h
new file mode 100644
index 0000000..0fad7e9
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionMinimizer.h
@@ -0,0 +1,60 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FunctionMinimizer
+#define ROOT_Minuit2_FunctionMinimizer
+
+
+#include "Minuit2/MnConfig.h"
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+class FCNGradientBase;
+class FunctionMinimum;
+
+//_____________________________________________________________________________________
+/** base class for function minimizers; user may give FCN or FCN with Gradient,
+    Parameter starting values and initial Error guess (sigma) (or "step size"),
+    or Parameter starting values and initial covariance matrix;
+    covariance matrix is stored in Upper triangular packed storage format,
+    e.g. the Elements in the array are arranged like
+    {a(0,0), a(0,1), a(1,1), a(0,2), a(1,2), a(2,2), ...},
+    the size is nrow*(nrow+1)/2 (see also MnUserCovariance.h);
+ */
+
+class FunctionMinimizer {
+
+public:
+
+   virtual ~FunctionMinimizer() {}
+
+   //starting values for parameters and errors
+   virtual FunctionMinimum Minimize(const FCNBase&, const std::vector<double>& par, const std::vector<double>& err, unsigned int strategy, unsigned int maxfcn, double toler) const = 0;
+
+   //starting values for parameters and errors and FCN with Gradient
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const std::vector<double>& par, const std::vector<double>& err, unsigned int strategy, unsigned int maxfcn, double toler) const = 0;
+
+   //starting values for parameters and covariance matrix
+   virtual FunctionMinimum Minimize(const FCNBase&, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov, unsigned int strategy, unsigned int maxfcn, double toler) const = 0;
+
+   //starting values for parameters and covariance matrix and FCN with Gradient
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov, unsigned int strategy, unsigned int maxfcn, double toler) const = 0;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FunctionMinimizer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionMinimum.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionMinimum.h
new file mode 100644
index 0000000..e7e110d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/FunctionMinimum.h
@@ -0,0 +1,114 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_FunctionMinimum
+#define ROOT_Minuit2_FunctionMinimum
+
+#include "Minuit2/BasicFunctionMinimum.h"
+
+#ifdef G__DICTIONARY
+typedef ROOT::Minuit2::MinimumState MinimumState;
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//______________________________________________________________________________________________
+/**
+    class holding the full result of the minimization;
+    both internal and external (MnUserParameterState) representation available
+    for the parameters at the Minimum
+ */
+
+class FunctionMinimum {
+
+public:
+
+   class MnReachedCallLimit {};
+   class MnAboveMaxEdm {};
+
+public:
+
+
+   /// constructor from only MinimumSeed. Minimum is only from seed result not full minimization
+   FunctionMinimum(const MinimumSeed& seed, double up) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, up))) {}
+
+   /// constructor at the end of a successfull minimization from seed and vector of states
+   FunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, states, up))) {}
+
+   /// constructor at the end of a failed minimization due to exceeding function call limit
+   FunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnReachedCallLimit) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, states, up, BasicFunctionMinimum::MnReachedCallLimit()))) {}
+
+   /// constructor at the end of a failed minimization due to edm above maximum value
+   FunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnAboveMaxEdm) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, states, up, BasicFunctionMinimum::MnAboveMaxEdm()))) {}
+
+   /// copy constructo
+   FunctionMinimum(const FunctionMinimum& min) : fData(min.fData) {}
+
+   FunctionMinimum& operator=(const FunctionMinimum& min) {
+      fData = min.fData;
+      return *this;
+   }
+
+   ~FunctionMinimum() {}
+
+   // add new state
+   void Add(const MinimumState& state) {fData->Add(state);}
+
+   // add new state
+   void Add(const MinimumState& state, MnAboveMaxEdm) {fData->Add(state,BasicFunctionMinimum::MnAboveMaxEdm());}
+
+   const MinimumSeed& Seed() const {return fData->Seed();}
+   const std::vector<BA_ROOT::Minuit2::MinimumState>& States() const {return fData->States();}
+
+// user representation of state at Minimum
+   const MnUserParameterState& UserState() const {
+      return fData->UserState();
+   }
+   const MnUserParameters& UserParameters() const {
+      return fData->UserParameters();
+   }
+   const MnUserCovariance& UserCovariance() const {
+      return fData->UserCovariance();
+   }
+
+// forward interface of last state
+   const MinimumState& State() const {return fData->State();}
+   const MinimumParameters& Parameters() const {return fData->Parameters();}
+   const MinimumError& Error() const {return fData->Error();}
+   const FunctionGradient& Grad() const {return fData->Grad();}
+   double Fval() const {return fData->Fval();}
+   double Edm() const {return fData->Edm();}
+   int NFcn() const {return fData->NFcn();}
+
+   double Up() const {return fData->Up();}
+   bool IsValid() const {return fData->IsValid();}
+   bool HasValidParameters() const {return fData->HasValidParameters();}
+   bool HasValidCovariance() const {return fData->HasValidCovariance();}
+   bool HasAccurateCovar() const {return fData->HasAccurateCovar();}
+   bool HasPosDefCovar() const {return fData->HasPosDefCovar();}
+   bool HasMadePosDefCovar() const {return fData->HasMadePosDefCovar();}
+   bool HesseFailed() const {return fData->HesseFailed();}
+   bool HasCovariance() const {return fData->HasCovariance();}
+   bool IsAboveMaxEdm() const {return fData->IsAboveMaxEdm();}
+   bool HasReachedCallLimit() const {return fData->HasReachedCallLimit();}
+
+   void SetErrorDef( double up) { return fData->SetErrorDef(up);}
+
+private:
+
+   MnRefCountedPointer<BasicFunctionMinimum> fData;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_FunctionMinimum
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/GenericFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/GenericFunction.h
new file mode 100644
index 0000000..a90e9aa
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/GenericFunction.h
@@ -0,0 +1,63 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_GenericFunction
+#define ROOT_Minuit2_GenericFunction
+
+#include "Minuit2/MnConfig.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//_____________________________________________________________________
+/**
+
+Class from which all the other classes, representing functions,
+inherit. That is why it defines only one method, the operator(),
+which allows to call the function.
+
+ at author Andras Zsenei and Lorenzo Moneta, Creation date: 23 Sep 2004
+
+ at ingroup Minuit
+
+ */
+
+class GenericFunction {
+
+public:
+
+   virtual ~GenericFunction() {}
+
+
+   /**
+
+      Evaluates the function using the vector containing the input values.
+
+      @param x vector of the coordinates (for example the x coordinate for a
+      one-dimensional Gaussian)
+
+      @return the result of the evaluation of the function.
+
+   */
+
+   virtual double operator()(const std::vector<double>& x) const=0;
+
+
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_GenericFunction
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/GradientCalculator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/GradientCalculator.h
new file mode 100644
index 0000000..e3cbf11
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/GradientCalculator.h
@@ -0,0 +1,41 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_GradientCalculator
+#define ROOT_Minuit2_GradientCalculator
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumParameters;
+class FunctionGradient;
+
+
+/**
+   interface class for gradient calculators
+ */
+class GradientCalculator {
+
+public:
+
+  virtual ~GradientCalculator() {}
+
+  virtual FunctionGradient operator()(const MinimumParameters&) const = 0;
+
+  virtual FunctionGradient operator()(const MinimumParameters&,
+                                      const FunctionGradient&) const = 0;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_GradientCalculator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/HessianGradientCalculator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/HessianGradientCalculator.h
new file mode 100644
index 0000000..a48e106
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/HessianGradientCalculator.h
@@ -0,0 +1,69 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_HessianGradientCalculator
+#define ROOT_Minuit2_HessianGradientCalculator
+
+#include "Minuit2/GradientCalculator.h"
+#include "Minuit2/MnMatrix.h"
+#include <utility>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+class MnFcn;
+class MnUserTransformation;
+class MnMachinePrecision;
+class MnStrategy;
+
+/**
+   HessianGradientCalculator: class to calculate Gradient for Hessian
+ */
+
+class HessianGradientCalculator : public GradientCalculator {
+
+public:
+
+  HessianGradientCalculator(const MnFcn& fcn, const MnUserTransformation& par,
+                            const MnStrategy& stra) :
+    fFcn(fcn), fTransformation(par), fStrategy(stra) {}
+
+  virtual ~HessianGradientCalculator() {}
+
+  virtual FunctionGradient operator()(const MinimumParameters&) const;
+
+  virtual FunctionGradient operator()(const MinimumParameters&,
+                                      const FunctionGradient&) const;
+
+  std::pair<FunctionGradient, MnAlgebraicVector> DeltaGradient(const MinimumParameters&, const FunctionGradient&) const;
+
+  const MnFcn& Fcn() const {return fFcn;}
+  const MnUserTransformation& Trafo() const {return fTransformation;}
+  const MnMachinePrecision& Precision() const;
+  const MnStrategy& Strategy() const {return fStrategy;}
+
+  unsigned int Ncycle() const;
+  double StepTolerance() const;
+  double GradTolerance() const;
+
+private:
+
+  const MnFcn& fFcn;
+  const MnUserTransformation& fTransformation;
+  const MnStrategy& fStrategy;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_HessianGradientCalculator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/InitialGradientCalculator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/InitialGradientCalculator.h
new file mode 100644
index 0000000..9b5e363
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/InitialGradientCalculator.h
@@ -0,0 +1,63 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_InitialGradientCalculator
+#define ROOT_Minuit2_InitialGradientCalculator
+
+#include "Minuit2/GradientCalculator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnFcn;
+class MnUserTransformation;
+class MnMachinePrecision;
+class MnStrategy;
+
+/**
+   Class to calculate an initial estimate of the gradient
+ */
+class InitialGradientCalculator : public GradientCalculator {
+
+public:
+
+  InitialGradientCalculator(const MnFcn& fcn, const MnUserTransformation& par,
+                            const MnStrategy& stra) :
+    fFcn(fcn), fTransformation(par), fStrategy(stra) {};
+
+  virtual ~InitialGradientCalculator() {}
+
+  virtual FunctionGradient operator()(const MinimumParameters&) const;
+
+  virtual FunctionGradient operator()(const MinimumParameters&,
+                                      const FunctionGradient&) const;
+
+  const MnFcn& Fcn() const {return fFcn;}
+  const MnUserTransformation& Trafo() const {return fTransformation;}
+  const MnMachinePrecision& Precision() const;
+  const MnStrategy& Strategy() const {return fStrategy;}
+
+  unsigned int Ncycle() const;
+  double StepTolerance() const;
+  double GradTolerance() const;
+
+private:
+
+  const MnFcn& fFcn;
+  const MnUserTransformation& fTransformation;
+  const MnStrategy& fStrategy;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_InitialGradientCalculator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LASymMatrix.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LASymMatrix.h
new file mode 100644
index 0000000..cfe4421
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LASymMatrix.h
@@ -0,0 +1,349 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_LASymMatrix
+#define ROOT_Minuit2_LASymMatrix
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/ABSum.h"
+#include "Minuit2/VectorOuterProduct.h"
+#include "Minuit2/MatrixInverse.h"
+
+#include <cassert>
+#include <memory>
+
+
+// #include <iostream>
+
+#include "Minuit2/StackAllocator.h"
+//extern StackAllocator StackAllocatorHolder::Get();
+
+// for memcopy
+#include <string.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+int Mndaxpy(unsigned int, double, const double*, int, double*, int);
+int Mndscal(unsigned int, double, double*, int);
+
+class LAVector;
+
+int Invert ( LASymMatrix & );
+
+/**
+   Class describing a symmetric matrix of size n.
+   The size is specified as a run-time argument passed in the
+   constructor.
+   The class uses expression templates for the operations and functions.
+   Only the independent data are kept in the fdata array of size n*(n+1)/2
+   containing the lower triangular data
+ */
+
+class LASymMatrix {
+
+private:
+
+  LASymMatrix() : fSize(0), fNRow(0), fData(0) {}
+
+public:
+
+  typedef sym Type;
+
+  LASymMatrix(unsigned int n) : fSize(n*(n+1)/2), fNRow(n), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*n*(n+1)/2)) {
+//     assert(fSize>0);
+    memset(fData, 0, fSize*sizeof(double));
+//     std::cout<<"LASymMatrix(unsigned int n), n= "<<n<<std::endl;
+  }
+
+  ~LASymMatrix() {
+//     std::cout<<"~LASymMatrix()"<<std::endl;
+//     if(fData) std::cout<<"deleting "<<fSize<<std::endl;
+//     else std::cout<<"no delete"<<std::endl;
+//     if(fData) delete [] fData;
+    if(fData) StackAllocatorHolder::Get().Deallocate(fData);
+  }
+
+  LASymMatrix(const LASymMatrix& v) :
+    fSize(v.size()), fNRow(v.Nrow()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.size())) {
+//     std::cout<<"LASymMatrix(const LASymMatrix& v)"<<std::endl;
+    memcpy(fData, v.Data(), fSize*sizeof(double));
+  }
+
+  LASymMatrix& operator=(const LASymMatrix& v) {
+//     std::cout<<"LASymMatrix& operator=(const LASymMatrix& v)"<<std::endl;
+//     std::cout<<"fSize= "<<fSize<<std::endl;
+//     std::cout<<"v.size()= "<<v.size()<<std::endl;
+    assert(fSize == v.size());
+    memcpy(fData, v.Data(), fSize*sizeof(double));
+    return *this;
+  }
+
+  template<class T>
+  LASymMatrix(const ABObj<sym, LASymMatrix, T>& v) :
+    fSize(v.Obj().size()), fNRow(v.Obj().Nrow()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.Obj().size())) {
+//     std::cout<<"LASymMatrix(const ABObj<sym, LASymMatrix, T>& v)"<<std::endl;
+    //std::cout<<"allocate "<<fSize<<std::endl;
+    memcpy(fData, v.Obj().Data(), fSize*sizeof(double));
+    Mndscal(fSize, double(v.f()), fData, 1);
+    //std::cout<<"fData= "<<fData[0]<<" "<<fData[1]<<std::endl;
+  }
+
+  template<class A, class B, class T>
+  LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, A, T>, ABObj<sym, B, T> >,T>& sum) : fSize(0), fNRow(0), fData(0) {
+//     std::cout<<"template<class A, class B, class T> LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, A, T>, ABObj<sym, B, T> > >& sum)"<<std::endl;
+//     recursive construction
+    (*this) = sum.Obj().A();
+    (*this) += sum.Obj().B();
+    //std::cout<<"leaving template<class A, class B, class T> LASymMatrix(const ABObj..."<<std::endl;
+  }
+
+  template<class A, class T>
+  LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix, T>, ABObj<sym, A, T> >,T>& sum) : fSize(0), fNRow(0), fData(0) {
+//     std::cout<<"template<class A, class T> LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix, T>, ABObj<sym, A, T> >,T>& sum)"<<std::endl;
+
+    // recursive construction
+    //std::cout<<"(*this)=sum.Obj().B();"<<std::endl;
+    (*this)=sum.Obj().B();
+    //std::cout<<"(*this)+=sum.Obj().A();"<<std::endl;
+    (*this)+=sum.Obj().A();
+    //std::cout<<"leaving template<class A, class T> LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix,.."<<std::endl;
+  }
+
+  template<class A, class T>
+  LASymMatrix(const ABObj<sym, ABObj<sym, A, T>, T>& something) : fSize(0), fNRow(0), fData(0) {
+//     std::cout<<"template<class A, class T> LASymMatrix(const ABObj<sym, ABObj<sym, A, T>, T>& something)"<<std::endl;
+    (*this) = something.Obj();
+    (*this) *= something.f();
+    //std::cout<<"leaving template<class A, class T> LASymMatrix(const ABObj<sym, ABObj<sym, A, T>, T>& something)"<<std::endl;
+  }
+
+  template<class T>
+  LASymMatrix(const ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>& inv) : fSize(inv.Obj().Obj().Obj().size()), fNRow(inv.Obj().Obj().Obj().Nrow()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*inv.Obj().Obj().Obj().size())) {
+    memcpy(fData, inv.Obj().Obj().Obj().Data(), fSize*sizeof(double));
+    Mndscal(fSize, double(inv.Obj().Obj().f()), fData, 1);
+    Invert(*this);
+    Mndscal(fSize, double(inv.f()), fData, 1);
+  }
+
+  template<class A, class T>
+  LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>, ABObj<sym, A, T> >, T>& sum) : fSize(0), fNRow(0), fData(0) {
+//     std::cout<<"template<class A, class T> LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>, ABObj<sym, A, T> >, T>& sum)"<<std::endl;
+
+    // recursive construction
+    (*this)=sum.Obj().B();
+    (*this)+=sum.Obj().A();
+    //std::cout<<"leaving template<class A, class T> LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix,.."<<std::endl;
+  }
+
+  LASymMatrix(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double>&);
+
+  template<class A, class T>
+  LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>, ABObj<sym, A, T> >, T>& sum) : fSize(0), fNRow(0), fData(0) {
+//     std::cout<<"template<class A, class T> LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T> ABObj<sym, A, T> >,T>& sum)"<<std::endl;
+
+    // recursive construction
+    (*this)=sum.Obj().B();
+    (*this)+=sum.Obj().A();
+    //std::cout<<"leaving template<class A, class T> LASymMatrix(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix,.."<<std::endl;
+  }
+
+  LASymMatrix& operator+=(const LASymMatrix& m) {
+//     std::cout<<"LASymMatrix& operator+=(const LASymMatrix& m)"<<std::endl;
+    assert(fSize==m.size());
+    Mndaxpy(fSize, 1., m.Data(), 1, fData, 1);
+    return *this;
+  }
+
+  LASymMatrix& operator-=(const LASymMatrix& m) {
+//     std::cout<<"LASymMatrix& operator-=(const LASymMatrix& m)"<<std::endl;
+    assert(fSize==m.size());
+    Mndaxpy(fSize, -1., m.Data(), 1, fData, 1);
+    return *this;
+  }
+
+  template<class T>
+  LASymMatrix& operator+=(const ABObj<sym, LASymMatrix, T>& m) {
+//     std::cout<<"template<class T> LASymMatrix& operator+=(const ABObj<sym, LASymMatrix, T>& m)"<<std::endl;
+    assert(fSize==m.Obj().size());
+    if(m.Obj().Data()==fData) {
+      Mndscal(fSize, 1.+double(m.f()), fData, 1);
+    } else {
+      Mndaxpy(fSize, double(m.f()), m.Obj().Data(), 1, fData, 1);
+    }
+    //std::cout<<"fData= "<<fData[0]<<" "<<fData[1]<<std::endl;
+    return *this;
+  }
+
+  template<class A, class T>
+  LASymMatrix& operator+=(const ABObj<sym, A, T>& m) {
+//     std::cout<<"template<class A, class T> LASymMatrix& operator+=(const ABObj<sym, A,T>& m)"<<std::endl;
+    (*this) += LASymMatrix(m);
+    return *this;
+  }
+
+  template<class T>
+  LASymMatrix& operator+=(const ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>& m) {
+//     std::cout<<"template<class T> LASymMatrix& operator+=(const ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>& m)"<<std::endl;
+    assert(fNRow > 0);
+    LASymMatrix tmp(m.Obj().Obj());
+    Invert(tmp);
+    tmp *= double(m.f());
+    (*this) += tmp;
+    return *this;
+  }
+
+  template<class T>
+  LASymMatrix& operator+=(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& m) {
+//     std::cout<<"template<class T> LASymMatrix& operator+=(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>&"<<std::endl;
+    assert(fNRow > 0);
+    Outer_prod(*this, m.Obj().Obj().Obj(), m.f()*m.Obj().Obj().f()*m.Obj().Obj().f());
+    return *this;
+  }
+
+  LASymMatrix& operator*=(double scal) {
+    Mndscal(fSize, scal, fData, 1);
+    return *this;
+  }
+
+  double operator()(unsigned int row, unsigned int col) const {
+    assert(row<fNRow && col < fNRow);
+    if(row > col)
+      return fData[col+row*(row+1)/2];
+    else
+      return fData[row+col*(col+1)/2];
+  }
+
+  double& operator()(unsigned int row, unsigned int col) {
+    assert(row<fNRow && col < fNRow);
+    if(row > col)
+      return fData[col+row*(row+1)/2];
+    else
+      return fData[row+col*(col+1)/2];
+  }
+
+  const double* Data() const {return fData;}
+
+  double* Data() {return fData;}
+
+  unsigned int size() const {return fSize;}
+
+  unsigned int Nrow() const {return fNRow;}
+
+  unsigned int Ncol() const {return Nrow();}
+
+private:
+
+  unsigned int fSize;
+  unsigned int fNRow;
+  double* fData;
+
+public:
+
+  template<class T>
+  LASymMatrix& operator=(const ABObj<sym, LASymMatrix, T>& v)  {
+    //std::cout<<"template<class T> LASymMatrix& operator=(ABObj<sym, LASymMatrix, T>& v)"<<std::endl;
+    if(fSize == 0 && fData == 0) {
+      fSize = v.Obj().size();
+      fNRow = v.Obj().Nrow();
+      fData = (double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*fSize);
+    } else {
+      assert(fSize == v.Obj().size());
+    }
+    //std::cout<<"fData= "<<fData[0]<<" "<<fData[1]<<std::endl;
+    memcpy(fData, v.Obj().Data(), fSize*sizeof(double));
+    (*this) *= v.f();
+    return *this;
+  }
+
+  template<class A, class T>
+  LASymMatrix& operator=(const ABObj<sym, ABObj<sym, A, T>, T>& something) {
+    //std::cout<<"template<class A, class T> LASymMatrix& operator=(const ABObj<sym, ABObj<sym, A, T>, T>& something)"<<std::endl;
+    if(fSize == 0 && fData == 0) {
+      (*this) = something.Obj();
+      (*this) *= something.f();
+    } else {
+      LASymMatrix tmp(something.Obj());
+      tmp *= something.f();
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+    //std::cout<<"template<class A, class T> LASymMatrix& operator=(const ABObj<sym, ABObj<sym, A, T>, T>& something)"<<std::endl;
+    return *this;
+  }
+
+  template<class A, class B, class T>
+  LASymMatrix& operator=(const ABObj<sym, ABSum<ABObj<sym, A, T>, ABObj<sym, B, T> >,T>& sum) {
+    //std::cout<<"template<class A, class B, class T> LASymMatrix& operator=(const ABObj<sym, ABSum<ABObj<sym, A, T>, ABObj<sym, B, T> >,T>& sum)"<<std::endl;
+    // recursive construction
+    if(fSize == 0 && fData == 0) {
+      (*this) = sum.Obj().A();
+      (*this) += sum.Obj().B();
+      (*this) *= sum.f();
+    } else {
+      LASymMatrix tmp(sum.Obj().A());
+      tmp += sum.Obj().B();
+      tmp *= sum.f();
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+    return *this;
+  }
+
+  template<class A, class T>
+  LASymMatrix& operator=(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix, T>, ABObj<sym, A, T> >,T>& sum)  {
+    //std::cout<<"template<class A, class T> LASymMatrix& operator=(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix, T>, ABObj<sym, A, T> >,T>& sum)"<<std::endl;
+
+    if(fSize == 0 && fData == 0) {
+      //std::cout<<"fSize == 0 && fData == 0"<<std::endl;
+      (*this) = sum.Obj().B();
+      (*this) += sum.Obj().A();
+      (*this) *= sum.f();
+    } else {
+      //std::cout<<"creating tmp variable"<<std::endl;
+      LASymMatrix tmp(sum.Obj().B());
+      tmp += sum.Obj().A();
+      tmp *= sum.f();
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+    //std::cout<<"leaving LASymMatrix& operator=(const ABObj<sym, ABSum<ABObj<sym, LASymMatrix..."<<std::endl;
+    return *this;
+  }
+
+  template<class T>
+  LASymMatrix& operator=(const ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, T>, T>, T>& inv) {
+    if(fSize == 0 && fData == 0) {
+      fSize = inv.Obj().Obj().Obj().size();
+      fNRow = inv.Obj().Obj().Obj().Nrow();
+      fData = (double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*fSize);
+      memcpy(fData, inv.Obj().Obj().Obj().Data(), fSize*sizeof(double));
+      (*this) *= inv.Obj().Obj().f();
+      Invert(*this);
+      (*this) *= inv.f();
+    } else {
+      LASymMatrix tmp(inv.Obj().Obj());
+      Invert(tmp);
+      tmp *= double(inv.f());
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+    return *this;
+  }
+
+  LASymMatrix& operator=(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double>&);
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_LASymMatrix
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LAVector.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LAVector.h
new file mode 100644
index 0000000..9692756
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LAVector.h
@@ -0,0 +1,303 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_LAVector
+#define ROOT_Minuit2_LAVector
+
+#include "Minuit2/ABSum.h"
+#include "Minuit2/ABProd.h"
+#include "Minuit2/LASymMatrix.h"
+
+#include <cassert>
+#include <memory>
+// #include <iostream>
+
+#include "Minuit2/StackAllocator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//extern StackAllocator StackAllocatorHolder::Get();
+
+int Mndaxpy(unsigned int, double, const double*, int, double*, int);
+int Mndscal(unsigned int, double, double*, int);
+int Mndspmv(const char*, unsigned int, double, const double*, const double*, int, double, double*, int);
+
+class LAVector {
+
+private:
+
+  LAVector() : fSize(0), fData(0) {}
+
+public:
+
+  typedef vec Type;
+
+//   LAVector() : fSize(0), fData(0) {}
+
+  LAVector(unsigned int n) : fSize(n), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*n)) {
+//     assert(fSize>0);
+    memset(fData, 0, size()*sizeof(double));
+//     std::cout<<"LAVector(unsigned int n), n= "<<n<<std::endl;
+  }
+
+  ~LAVector() {
+//     std::cout<<"~LAVector()"<<std::endl;
+//    if(fData) std::cout<<"deleting "<<fSize<<std::endl;
+//     else std::cout<<"no delete"<<std::endl;
+//     if(fData) delete [] fData;
+    if(fData) StackAllocatorHolder::Get().Deallocate(fData);
+  }
+
+  LAVector(const LAVector& v) :
+    fSize(v.size()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.size())) {
+//     std::cout<<"LAVector(const LAVector& v)"<<std::endl;
+    memcpy(fData, v.Data(), fSize*sizeof(double));
+  }
+
+  LAVector& operator=(const LAVector& v) {
+//     std::cout<<"LAVector& operator=(const LAVector& v)"<<std::endl;
+//     std::cout<<"fSize= "<<fSize<<std::endl;
+//     std::cout<<"v.size()= "<<v.size()<<std::endl;
+    assert(fSize == v.size());
+    memcpy(fData, v.Data(), fSize*sizeof(double));
+    return *this;
+  }
+
+  template<class T>
+  LAVector(const ABObj<vec, LAVector, T>& v) :
+    fSize(v.Obj().size()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*v.Obj().size())) {
+//     std::cout<<"LAVector(const ABObj<LAVector, T>& v)"<<std::endl;
+//     std::cout<<"allocate "<<fSize<<std::endl;
+    memcpy(fData, v.Obj().Data(), fSize*sizeof(T));
+    (*this) *= T(v.f());
+//     std::cout<<"fData= "<<fData[0]<<" "<<fData[1]<<std::endl;
+  }
+
+  template<class A, class B, class T>
+  LAVector(const ABObj<vec, ABSum<ABObj<vec, A, T>, ABObj<vec, B, T> >,T>& sum) : fSize(0), fData(0) {
+//     std::cout<<"template<class A, class B, class T> LAVector(const ABObj<ABSum<ABObj<A, T>, ABObj<B, T> > >& sum)"<<std::endl;
+    (*this) = sum.Obj().A();
+    (*this) += sum.Obj().B();
+    (*this) *= double(sum.f());
+  }
+
+  template<class A, class T>
+  LAVector(const ABObj<vec, ABSum<ABObj<vec, LAVector, T>, ABObj<vec, A, T> >,T>& sum) : fSize(0), fData(0) {
+//     std::cout<<"template<class A, class T> LAVector(const ABObj<ABSum<ABObj<LAVector, T>, ABObj<A, T> >,T>& sum)"<<std::endl;
+
+    // recursive construction
+//     std::cout<<"(*this)=sum.Obj().B();"<<std::endl;
+    (*this) = sum.Obj().B();
+//     std::cout<<"(*this)+=sum.Obj().A();"<<std::endl;
+    (*this) += sum.Obj().A();
+    (*this) *= double(sum.f());
+//     std::cout<<"leaving template<class A, class T> LAVector(const ABObj<ABSum<ABObj<LAVector,.."<<std::endl;
+  }
+
+  template<class A, class T>
+  LAVector(const ABObj<vec, ABObj<vec, A, T>, T>& something) : fSize(0), fData(0) {
+//     std::cout<<"template<class A, class T> LAVector(const ABObj<ABObj<A, T>, T>& something)"<<std::endl;
+    (*this) = something.Obj();
+    (*this) *= something.f();
+  }
+
+  //
+  template<class T>
+  LAVector(const ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>& prod) : fSize(prod.Obj().B().Obj().size()), fData((double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*prod.Obj().B().Obj().size())) {
+//     std::cout<<"template<class T> LAVector(const ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>& prod)"<<std::endl;
+
+    Mndspmv("U", fSize, prod.f()*prod.Obj().A().f()*prod.Obj().B().f(), prod.Obj().A().Obj().Data(), prod.Obj().B().Obj().Data(), 1, 0., fData, 1);
+  }
+
+  //
+  template<class T>
+  LAVector(const ABObj<vec, ABSum<ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>, ABObj<vec, LAVector, T> >, T>& prod) : fSize(0), fData(0) {
+    (*this) = prod.Obj().B();
+    (*this) += prod.Obj().A();
+    (*this) *= double(prod.f());
+  }
+
+  //
+  LAVector& operator+=(const LAVector& m) {
+//     std::cout<<"LAVector& operator+=(const LAVector& m)"<<std::endl;
+    assert(fSize==m.size());
+    Mndaxpy(fSize, 1., m.Data(), 1, fData, 1);
+    return *this;
+  }
+
+  LAVector& operator-=(const LAVector& m) {
+//     std::cout<<"LAVector& operator-=(const LAVector& m)"<<std::endl;
+    assert(fSize==m.size());
+    Mndaxpy(fSize, -1., m.Data(), 1, fData, 1);
+    return *this;
+  }
+
+  template<class T>
+  LAVector& operator+=(const ABObj<vec, LAVector, T>& m) {
+//     std::cout<<"template<class T> LAVector& operator+=(const ABObj<LAVector, T>& m)"<<std::endl;
+    assert(fSize==m.Obj().size());
+    if(m.Obj().Data()==fData) {
+      Mndscal(fSize, 1.+double(m.f()), fData, 1);
+    } else {
+      Mndaxpy(fSize, double(m.f()), m.Obj().Data(), 1, fData, 1);
+    }
+//     std::cout<<"fData= "<<fData[0]<<" "<<fData[1]<<std::endl;
+    return *this;
+  }
+
+  template<class A, class T>
+  LAVector& operator+=(const ABObj<vec, A, T>& m) {
+//     std::cout<<"template<class A, class T> LAVector& operator+=(const ABObj<A,T>& m)"<<std::endl;
+    (*this) += LAVector(m);
+    return *this;
+  }
+
+  template<class T>
+  LAVector& operator+=(const ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>& prod) {
+    Mndspmv("U", fSize, prod.f()*prod.Obj().A().f()*prod.Obj().B().f(), prod.Obj().A().Obj().Data(), prod.Obj().B().Data(), 1, 1., fData, 1);
+    return *this;
+  }
+
+  LAVector& operator*=(double scal) {
+    Mndscal(fSize, scal, fData, 1);
+    return *this;
+  }
+
+  double operator()(unsigned int i) const {
+    assert(i<fSize);
+    return fData[i];
+  }
+
+  double& operator()(unsigned int i) {
+    assert(i<fSize);
+    return fData[i];
+  }
+
+  double operator[](unsigned int i) const {
+    assert(i<fSize);
+    return fData[i];
+  }
+
+  double& operator[](unsigned int i) {
+    assert(i<fSize);
+    return fData[i];
+  }
+
+  const double* Data() const {return fData;}
+
+  double* Data() {return fData;}
+
+  unsigned int size() const {return fSize;}
+
+private:
+
+  unsigned int fSize;
+  double* fData;
+
+public:
+
+  template<class T>
+  LAVector& operator=(const ABObj<vec, LAVector, T>& v)  {
+//     std::cout<<"template<class T> LAVector& operator=(ABObj<LAVector, T>& v)"<<std::endl;
+    if(fSize == 0 && fData == 0) {
+      fSize = v.Obj().size();
+      fData = (double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*fSize);
+    } else {
+      assert(fSize == v.Obj().size());
+    }
+    memcpy(fData, v.Obj().Data(), fSize*sizeof(double));
+    (*this) *= T(v.f());
+    return *this;
+  }
+
+  template<class A, class T>
+  LAVector& operator=(const ABObj<vec, ABObj<vec, A, T>, T>& something) {
+//     std::cout<<"template<class A, class T> LAVector& operator=(const ABObj<ABObj<A, T>, T>& something)"<<std::endl;
+    if(fSize == 0 && fData == 0) {
+      (*this) = something.Obj();
+    } else {
+      LAVector tmp(something.Obj());
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+    (*this) *= something.f();
+    return *this;
+  }
+
+  template<class A, class B, class T>
+  LAVector& operator=(const ABObj<vec, ABSum<ABObj<vec, A, T>, ABObj<vec, B, T> >,T>& sum) {
+    if(fSize == 0 && fData == 0) {
+      (*this) = sum.Obj().A();
+      (*this) += sum.Obj().B();
+    } else {
+      LAVector tmp(sum.Obj().A());
+      tmp += sum.Obj().B();
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+    (*this) *= sum.f();
+    return *this;
+  }
+
+  template<class A, class T>
+  LAVector& operator=(const ABObj<vec, ABSum<ABObj<vec, LAVector, T>, ABObj<vec, A, T> >,T>& sum)  {
+    if(fSize == 0 && fData == 0) {
+      (*this) = sum.Obj().B();
+      (*this) += sum.Obj().A();
+    } else {
+      LAVector tmp(sum.Obj().A());
+      tmp += sum.Obj().B();
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+  (*this) *= sum.f();
+    return *this;
+  }
+
+  //
+  template<class T>
+  LAVector& operator=(const ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>& prod) {
+    if(fSize == 0 && fData == 0) {
+      fSize = prod.Obj().B().Obj().size();
+      fData = (double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*fSize);
+      Mndspmv("U", fSize, double(prod.f()*prod.Obj().A().f()*prod.Obj().B().f()), prod.Obj().A().Obj().Data(), prod.Obj().B().Obj().Data(), 1, 0., fData, 1);
+    } else {
+      LAVector tmp(prod.Obj().B());
+      assert(fSize == tmp.size());
+      Mndspmv("U", fSize, double(prod.f()*prod.Obj().A().f()), prod.Obj().A().Obj().Data(), tmp.Data(), 1, 0., fData, 1);
+    }
+    return *this;
+  }
+
+  //
+  template<class T>
+  LAVector& operator=(const ABObj<vec, ABSum<ABObj<vec, ABProd<ABObj<sym, LASymMatrix, T>, ABObj<vec, LAVector, T> >, T>, ABObj<vec, LAVector, T> >, T>& prod) {
+    if(fSize == 0 && fData == 0) {
+      (*this) = prod.Obj().B();
+      (*this) += prod.Obj().A();
+    } else {
+      //       std::cout<<"creating tmp variable"<<std::endl;
+      LAVector tmp(prod.Obj().B());
+      tmp += prod.Obj().A();
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+    }
+    (*this) *= prod.f();
+    return *this;
+  }
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_LAVector
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaInverse.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaInverse.h
new file mode 100644
index 0000000..0e9c54d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaInverse.h
@@ -0,0 +1,63 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_LaInverse
+#define ROOT_Minuit2_LaInverse
+
+/** LAPACK Algebra
+    specialize the Invert function for LASymMatrix
+ */
+
+#include "Minuit2/MatrixInverse.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+inline ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double> Inverse(const ABObj<sym, LASymMatrix, double>& obj) {
+  return ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>(MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>(obj));
+}
+
+template<class T>
+inline ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double> operator*(T f, const  ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>& inv) {
+  return ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>(inv.Obj(), f*inv.f());
+}
+
+template<class T>
+inline ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double> operator/(const  ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>& inv, T f) {
+  return ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>(inv.Obj(), inv.f()/f);
+}
+
+template<class T>
+inline ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double> operator-(const  ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>& inv) {
+  return ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>(inv.Obj(), T(-1.)*inv.f());
+}
+
+int Invert(LASymMatrix&);
+
+int Invert_undef_sym(LASymMatrix&);
+
+/*
+template<class M>
+inline ABObj<sym, MatrixInverse<sym, ABObj<sym, M, double>, double>, double> Inverse(const ABObj<sym, M, double>& obj) {
+  return ABObj<sym, MatrixInverse<sym, ABObj<sym, M, double>, double>, double>(MatrixInverse<sym, ABObj<sym, M, double>, double>(obj));
+}
+
+inline ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double> Inverse(const ABObj<sym, LASymMatrix, double>& obj) {
+  return ABObj<sym, MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>, double>(MatrixInverse<sym, ABObj<sym, LASymMatrix, double>, double>(obj));
+}
+*/
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_LaInverse
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaOuterProduct.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaOuterProduct.h
new file mode 100644
index 0000000..82d00bc
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaOuterProduct.h
@@ -0,0 +1,59 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef MA_LaOuterProd_H_
+#define MA_LaOuterProd_H_
+
+/** LAPACK Algebra
+    specialize the Outer_product function for LAVector;
+ */
+
+#include "Minuit2/VectorOuterProduct.h"
+#include "Minuit2/ABSum.h"
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+inline ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double> Outer_product(const ABObj<vec, LAVector, double>& obj) {
+//   std::cout<<"ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double> Outer_product(const ABObj<vec, LAVector, double>& obj)"<<std::endl;
+  return ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double>(VectorOuterProduct<ABObj<vec, LAVector, double>, double>(obj));
+}
+
+// f*outer
+template<class T>
+inline ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T> operator*(T f, const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& obj) {
+//   std::cout<<"ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T> operator*(T f, const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& obj)"<<std::endl;
+  return ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>(obj.Obj(), obj.f()*f);
+}
+
+// outer/f
+template<class T>
+inline ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T> operator/(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& obj, T f) {
+//   std::cout<<"ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T> operator/(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& obj, T f)"<<std::endl;
+  return ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>(obj.Obj(), obj.f()/f);
+}
+
+// -outer
+template<class T>
+inline ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T> operator-(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& obj) {
+//   std::cout<<"ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T> operator/(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>& obj, T f)"<<std::endl;
+  return ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, T>, T>, T>(obj.Obj(), T(-1.)*obj.f());
+}
+
+void Outer_prod(LASymMatrix&, const LAVector&, double f = 1.);
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif //MA_LaOuterProd_H_
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaProd.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaProd.h
new file mode 100644
index 0000000..b5688af
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaProd.h
@@ -0,0 +1,50 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_LaProd
+#define ROOT_Minuit2_LaProd
+
+#include "Minuit2/ABProd.h"
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/*
+  LM" remove this for fixing alpha poblem
+#define OP_MULT1(MT1,MT2,MAT1,MAT2,T) \
+template<class B>                     \
+inline ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,B,T> >,T>  operator*(const ABObj<MT1,MAT1,T>& a, const ABObj<MT2,B,T>& b) { return ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,B,T> >,T>(ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,B,T> >(a, b)); }   \
+template<class A>             \
+inline ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,A,T>, ABObj<MT2,MAT2,T> >,T>  operator*(const ABObj<MT1,A,T>& a, const ABObj<MT2,MAT2,T>& b) { \
+  return ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,A,T>, ABObj<MT2,MAT2,T> >,T>(ABProd<ABObj<MT1,A,T>, ABObj<MT2,MAT2,T> >(a, b));    \
+} \
+  \
+*/
+
+#define OP_MULT1(MT1,MT2,MAT1,MAT2,T) \
+inline ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,MAT2,T> >,T>  operator*(const ABObj<MT1,MAT1,T>& a, const ABObj<MT2,MAT2,T>& b) {   \
+  return ABObj<AlgebraicProdType<MT1,MT2>::Type,ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,MAT2,T> >,T>(ABProd<ABObj<MT1,MAT1,T>, ABObj<MT2,MAT2,T> >(a, b)); \
+}
+
+OP_MULT1(sym,vec,LASymMatrix,LAVector,double)
+// OP_MULT1(sym,gen,LASymMatrix,LAGenMatrix,double)
+// OP_MULT1(sym,sym,LASymMatrix,LASymMatrix,double)
+// OP_MULT1(gen,vec,LAGenMatrix,LAVector,double)
+// OP_MULT1(gen,sym,LAGenMatrix,LASymMatrix,double)
+// OP_MULT1(gen,gen,LAGenMatrix,LAGenMatrix,double)
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_LaProd
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaSum.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaSum.h
new file mode 100644
index 0000000..933e5e1
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/LaSum.h
@@ -0,0 +1,65 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_LaSum
+#define ROOT_Minuit2_LaSum
+
+#include "Minuit2/ABSum.h"
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+#define OP_ADD1(MT,MAT1,T) \
+inline ABObj<MT,MAT1,T>  operator-(const ABObj<MT,MAT1,T>& m) {\
+  return ABObj<MT,MAT1,T> (m.Obj(), T(-1.)*m.f());\
+}\
+         \
+inline ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T>  operator+(const ABObj<MT,MAT1,T>& a, const ABObj<MT,MAT1,T>& b) {    \
+  return ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T>(ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >(a, b));     \
+}                    \
+inline ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T>  operator-(const ABObj<MT,MAT1,T>& a, const ABObj<MT,MAT1,T>& b) {        \
+  return ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T>(ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >(a,ABObj<MT,MAT1,T> (b.Obj(),T(-1.)*b.f())));        \
+}
+
+OP_ADD1(vec,LAVector,double)
+OP_ADD1(sym,LASymMatrix,double)
+
+#define OP_SCALE(MT,MAT1,T) \
+inline ABObj<MT,MAT1,T> operator*(T f, const MAT1& obj) { \
+  return ABObj<MT,MAT1,T>(obj, f); \
+}
+
+OP_SCALE(sym,LASymMatrix,double)
+OP_SCALE(vec,LAVector,double)
+
+#define OP_SCALE1(MT,MAT1,T) \
+inline ABObj<MT,MAT1,T> operator/(const MAT1& obj, T f) { \
+  return ABObj<MT,MAT1,T>(obj, 1./f); \
+}
+
+OP_SCALE1(sym,LASymMatrix,double)
+OP_SCALE1(vec,LAVector,double)
+
+#define OP_MIN(MT,MAT1,T) \
+inline ABObj<MT,MAT1,T> operator-(const MAT1& obj) { \
+  return ABObj<MT,MAT1,T>(obj, T(-1.)); \
+}
+
+OP_MIN(sym,LASymMatrix,double)
+OP_MIN(vec,LAVector,double)
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_LaSum
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MPIProcess.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MPIProcess.h
new file mode 100644
index 0000000..7cd514e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MPIProcess.h
@@ -0,0 +1,145 @@
+// @(#)root/minuit2:$Id$
+// Author: A. Lazzaro 2009
+/***************************************************************************
+ * Package: Minuit2                                                        *
+ *    File: $Id$         *
+ *  Author: Alfio Lazzaro, alfio.lazzaro at mi.infn.it                        *
+ *                                                                         *
+ * Copyright: (C) 2008 by Universita' and INFN, Milan                      *
+ ***************************************************************************/
+
+#ifndef ROOT_Minuit2_MPIProcess
+#define ROOT_Minuit2_MPIProcess
+
+// disable MPI calls
+//#define MPIPROC
+
+#include "Minuit2/MnMatrix.h"
+
+#ifdef MPIPROC
+#include "mpi.h"
+#endif
+
+
+namespace BA_ROOT {
+
+namespace Minuit2 {
+
+   class MPITerminate {
+   public:
+      ~MPITerminate() {
+#ifdef MPIPROC
+         if (MPI::Is_initialized() && !(MPI::Is_finalized())) {
+            std::cout << "Info --> MPITerminate:: End MPI on #"
+                      << MPI::COMM_WORLD.Get_rank() << " processor"
+                      << std::endl;
+
+            MPI::Finalize();
+         }
+#endif
+      }
+
+   };
+
+
+   class MPIProcess {
+   public:
+      MPIProcess(unsigned int nelements, unsigned int indexComm);
+      ~MPIProcess();
+
+      inline unsigned int NumElements4JobIn() const { return fNumElements4JobIn; }
+      inline unsigned int NumElements4JobOut() const { return fNumElements4JobOut; }
+
+      inline unsigned int NumElements4Job(unsigned int rank) const
+      { return NumElements4JobIn()+((rank<NumElements4JobOut()) ? 1 : 0); }
+
+      inline unsigned int StartElementIndex() const
+      { return ((fRank<NumElements4JobOut()) ? (fRank*NumElements4Job(fRank)) :
+                (fNelements-(fSize-fRank)*NumElements4Job(fRank))); }
+
+      inline unsigned int EndElementIndex() const
+      { return StartElementIndex()+NumElements4Job(fRank); }
+
+      inline unsigned int GetMPISize() const { return fSize; }
+      inline unsigned int GetMPIRank() const { return fRank; }
+
+      bool SyncVector(BA_ROOT::Minuit2::MnAlgebraicVector &mnvector);
+      bool SyncSymMatrixOffDiagonal(BA_ROOT::Minuit2::MnAlgebraicSymMatrix &mnmatrix);
+
+      static unsigned int GetMPIGlobalRank() { StartMPI(); return fgGlobalRank; }
+      static unsigned int GetMPIGlobalSize() { StartMPI(); return fgGlobalSize; }
+      static inline void StartMPI() {
+#ifdef MPIPROC
+         if (!(MPI::Is_initialized())) {
+            MPI::Init();
+            std::cout << "Info --> MPIProcess::StartMPI: Start MPI on #"
+                      << MPI::COMM_WORLD.Get_rank() << " processor"
+                      << std::endl;
+         }
+         fgGlobalSize = MPI::COMM_WORLD.Get_size();
+         fgGlobalRank = MPI::COMM_WORLD.Get_rank();
+#endif
+      }
+
+      static void TerminateMPI() {
+#ifdef MPIPROC
+         if (fgCommunicators[0]!=0 && fgCommunicators[1]!=0) {
+            delete fgCommunicators[0]; fgCommunicators[0] = 0; fgIndecesComm[0] = 0;
+            delete fgCommunicators[1]; fgCommunicators[1] = 0; fgIndecesComm[1] = 0;
+         }
+
+         MPITerminate();
+
+#endif
+      }
+
+      static bool SetCartDimension(unsigned int dimX, unsigned int dimY);
+      static bool SetDoFirstMPICall(bool doFirstMPICall = true);
+
+      inline void SumReduce(const double& sub, double& total) {
+         total = sub;
+
+#ifdef MPIPROC
+         if (fSize>1) {
+            fgCommunicator->Allreduce(&sub,&total,1,MPI::DOUBLE,MPI::SUM);
+         }
+#endif
+      }
+
+   private:
+
+#ifdef MPIPROC
+      void MPISyncVector(double *ivector, int svector, double *ovector);
+#endif
+
+   private:
+      unsigned int fNelements;
+      unsigned int fSize;
+      unsigned int fRank;
+
+      static unsigned int fgGlobalSize;
+      static unsigned int fgGlobalRank;
+
+      static unsigned int fgCartSizeX;
+      static unsigned int fgCartSizeY;
+      static unsigned int fgCartDimension;
+      static bool fgNewCart;
+
+      unsigned int fNumElements4JobIn;
+      unsigned int fNumElements4JobOut;
+
+#ifdef MPIPROC
+      static MPI::Intracomm *fgCommunicator;
+      static int fgIndexComm; // maximum 2 communicators, so index can be 0 and 1
+      static MPI::Intracomm *fgCommunicators[2]; // maximum 2 communicators
+      static unsigned int fgIndecesComm[2];
+#endif
+
+   };
+
+} // namespace Minuit2
+} // namespace ROOT
+
+#endif
+
+
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MatrixInverse.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MatrixInverse.h
new file mode 100644
index 0000000..93d1096
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MatrixInverse.h
@@ -0,0 +1,68 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MatrixInverse
+#define ROOT_Minuit2_MatrixInverse
+
+#include "Minuit2/ABTypes.h"
+#include "Minuit2/ABObj.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+template<class mtype, class M, class T>
+class MatrixInverse {
+
+public:
+
+  MatrixInverse(const M& obj) : fObject(obj) {}
+
+  ~MatrixInverse() {}
+
+  typedef mtype Type;
+
+  const M& Obj() const {return fObject;}
+
+private:
+
+  M fObject;
+};
+
+template<class M, class T>
+class MatrixInverse<vec, M, T> {
+
+private:
+
+  MatrixInverse(const M& obj) : fObject(obj) {}
+
+public:
+
+  ~MatrixInverse() {}
+
+  typedef vec Type;
+
+  const M& Obj() const {return fObject;}
+
+private:
+
+  M fObject;
+};
+
+template<class mt, class M, class T>
+inline ABObj<mt, MatrixInverse<mt, ABObj<mt, M, T>, T>, T> Inverse(const ABObj<mt, M, T>& obj) {
+  return ABObj<mt, MatrixInverse<mt, ABObj<mt, M, T>, T>, T>(MatrixInverse<mt, ABObj<mt, M, T>, T>(obj));
+}
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MatrixInverse
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumBuilder.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumBuilder.h
new file mode 100644
index 0000000..aac5b87
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumBuilder.h
@@ -0,0 +1,70 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinimumBuilder
+#define ROOT_Minuit2_MinimumBuilder
+
+#ifndef ROOT_Minuit2_MnTraceObject
+#include "Minuit2/MnTraceObject.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FunctionMinimum;
+class MnFcn;
+class GradientCalculator;
+class MinimumSeed;
+class MinimumState;
+class MnStrategy;
+
+class MinimumBuilder {
+
+public:
+
+   MinimumBuilder();
+
+   virtual ~MinimumBuilder() {}
+
+   virtual FunctionMinimum Minimum(const MnFcn&, const GradientCalculator&, const MinimumSeed&, const MnStrategy&, unsigned int, double) const = 0;
+
+   int StorageLevel() const {  return fStorageLevel; }
+   int PrintLevel() const { return fPrintLevel; }
+
+   bool TraceIter() const { return (fTracer); }
+   MnTraceObject * TraceObject() const { return (fTracer); }
+
+   virtual void SetPrintLevel(int level) { fPrintLevel = level;}
+   virtual void SetStorageLevel(int level) { fStorageLevel = level;}
+
+   // set trace object (user manages it)
+   virtual void SetTraceObject(MnTraceObject & obj) {
+      fTracer = &obj;
+   }
+
+   void TraceIteration(int iter, const MinimumState & state) const {
+      if (fTracer) (*fTracer)(iter, state);
+   }
+
+private:
+
+   int fPrintLevel;
+   int fStorageLevel;
+
+   MnTraceObject * fTracer; //! tracer object (it is managed by user)
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinimumBuilder
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumError.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumError.h
new file mode 100644
index 0000000..d722c73
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumError.h
@@ -0,0 +1,82 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinimumError
+#define ROOT_Minuit2_MinimumError
+
+#include "Minuit2/MnRefCountedPointer.h"
+#include "Minuit2/BasicMinimumError.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/** MinimumError keeps the inv. 2nd derivative (inv. Hessian) used for
+    calculating the Parameter step size (-V*g) and for the covariance Update
+    (ErrorUpdator). The covariance matrix is equal to twice the inv. Hessian.
+ */
+
+class MinimumError {
+
+public:
+
+  class MnNotPosDef {};
+  class MnMadePosDef {};
+  class MnHesseFailed {};
+  class MnInvertFailed {};
+
+public:
+
+  MinimumError(unsigned int n) : fData(MnRefCountedPointer<BasicMinimumError>(new BasicMinimumError(n))) {}
+
+  MinimumError(const MnAlgebraicSymMatrix& mat, double dcov) : fData(MnRefCountedPointer<BasicMinimumError>(new BasicMinimumError(mat, dcov))) {}
+
+  MinimumError(const MnAlgebraicSymMatrix& mat, MnHesseFailed) : fData(MnRefCountedPointer<BasicMinimumError>(new BasicMinimumError(mat, BasicMinimumError::MnHesseFailed()))) {}
+
+  MinimumError(const MnAlgebraicSymMatrix& mat, MnMadePosDef) : fData(MnRefCountedPointer<BasicMinimumError>(new BasicMinimumError(mat, BasicMinimumError::MnMadePosDef()))) {}
+
+  MinimumError(const MnAlgebraicSymMatrix& mat, MnInvertFailed) : fData(MnRefCountedPointer<BasicMinimumError>(new BasicMinimumError(mat, BasicMinimumError::MnInvertFailed()))) {}
+
+  MinimumError(const MnAlgebraicSymMatrix& mat, MnNotPosDef) : fData(MnRefCountedPointer<BasicMinimumError>(new BasicMinimumError(mat, BasicMinimumError::MnNotPosDef()))) {}
+
+  ~MinimumError() {}
+
+  MinimumError(const MinimumError& e) : fData(e.fData) {}
+
+  MinimumError& operator=(const MinimumError& err) {
+    fData = err.fData;
+    return *this;
+  }
+
+  MnAlgebraicSymMatrix Matrix() const {return fData->Matrix();}
+
+  const MnAlgebraicSymMatrix& InvHessian() const {return fData->InvHessian();}
+
+  MnAlgebraicSymMatrix Hessian() const {return fData->Hessian();}
+
+  double Dcovar() const {return fData->Dcovar();}
+  bool IsAccurate() const {return fData->IsAccurate();}
+  bool IsValid() const {return fData->IsValid();}
+  bool IsPosDef() const {return fData->IsPosDef();}
+  bool IsMadePosDef() const {return fData->IsMadePosDef();}
+  bool HesseFailed() const {return fData->HesseFailed();}
+  bool InvertFailed() const {return fData->InvertFailed();}
+  bool IsAvailable() const {return fData->IsAvailable();}
+
+private:
+
+  MnRefCountedPointer<BasicMinimumError> fData;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinimumError
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumErrorUpdator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumErrorUpdator.h
new file mode 100644
index 0000000..df0336c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumErrorUpdator.h
@@ -0,0 +1,38 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinimumErrorUpdator
+#define ROOT_Minuit2_MinimumErrorUpdator
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumState;
+class MinimumError;
+class MinimumParameters;
+class FunctionGradient;
+
+class MinimumErrorUpdator {
+
+public:
+
+  virtual ~MinimumErrorUpdator() {}
+
+  virtual MinimumError Update(const MinimumState&, const MinimumParameters&,
+                              const FunctionGradient&) const = 0;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinimumErrorUpdator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumParameters.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumParameters.h
new file mode 100644
index 0000000..b6688fd
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumParameters.h
@@ -0,0 +1,60 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinimumParameters
+#define ROOT_Minuit2_MinimumParameters
+
+#include "Minuit2/MnRefCountedPointer.h"
+#include "Minuit2/BasicMinimumParameters.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumParameters {
+
+public:
+
+   MinimumParameters(unsigned int n, double fval = 0) :
+      fData(MnRefCountedPointer<BasicMinimumParameters>(new BasicMinimumParameters(n,fval))) {}
+
+  /** takes the Parameter vector */
+  MinimumParameters(const MnAlgebraicVector& avec, double fval) :
+     fData(MnRefCountedPointer<BasicMinimumParameters>(new BasicMinimumParameters(avec, fval)))  {}
+
+  /** takes the Parameter vector plus step size x1 - x0 = dirin */
+  MinimumParameters(const MnAlgebraicVector& avec, const MnAlgebraicVector& dirin, double fval) :
+     fData(MnRefCountedPointer<BasicMinimumParameters>(new BasicMinimumParameters(avec, dirin, fval)))  {}
+
+  ~MinimumParameters() {}
+
+  MinimumParameters(const MinimumParameters& par) : fData(par.fData) {}
+
+  MinimumParameters& operator=(const MinimumParameters& par) {
+    fData = par.fData;
+    return *this;
+  }
+
+  const MnAlgebraicVector& Vec() const {return fData->Vec();}
+  const MnAlgebraicVector& Dirin() const {return fData->Dirin();}
+  double Fval() const {return fData->Fval();}
+  bool IsValid() const {return fData->IsValid();}
+  bool HasStepSize() const {return fData->HasStepSize();}
+
+private:
+
+  MnRefCountedPointer<BasicMinimumParameters> fData;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinimumParameters
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumSeed.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumSeed.h
new file mode 100644
index 0000000..b40fcb6
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumSeed.h
@@ -0,0 +1,66 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinimumSeed
+#define ROOT_Minuit2_MinimumSeed
+
+#include "Minuit2/MnRefCountedPointer.h"
+#include "Minuit2/BasicMinimumSeed.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumState;
+class MinimumParameters;
+class MinimumError;
+class FunctionGradient;
+class MnUserTransformation;
+
+/** MinimumSeed contains the starting values for the minimization produced
+    by the SeedGenerator.
+ */
+
+class MinimumSeed {
+
+public:
+
+  MinimumSeed(const MinimumState& st, const MnUserTransformation& trafo) : fData(MnRefCountedPointer<BasicMinimumSeed>(new BasicMinimumSeed(st, trafo))) {}
+
+  ~MinimumSeed() {}
+
+  MinimumSeed(const MinimumSeed& seed) : fData(seed.fData) {}
+
+  MinimumSeed& operator=(const MinimumSeed& seed) {
+    fData = seed.fData;
+    return *this;
+  }
+
+  const MinimumState& State() const {return fData->State();}
+  const MinimumParameters& Parameters() const {return fData->Parameters();}
+  const MinimumError& Error() const {return fData->Error();}
+  const FunctionGradient& Gradient() const {return fData->Gradient();}
+  const MnUserTransformation& Trafo() const {return fData->Trafo();}
+  const MnMachinePrecision& Precision() const {return fData->Precision();}
+  double Fval() const {return fData->Fval();}
+  double Edm() const {return fData->Edm();}
+  unsigned int NFcn() const {return fData->NFcn();}
+  bool IsValid() const {return fData->IsValid();}
+
+private:
+
+  MnRefCountedPointer<BasicMinimumSeed> fData;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinimumSeed
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumSeedGenerator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumSeedGenerator.h
new file mode 100644
index 0000000..4ff88aa
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumSeedGenerator.h
@@ -0,0 +1,45 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinimumSeedGenerator
+#define ROOT_Minuit2_MinimumSeedGenerator
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumSeed;
+class MnFcn;
+class GradientCalculator;
+class MnUserParameterState;
+class MnStrategy;
+class AnalyticalGradientCalculator;
+
+/** base class for seed generators (starting values); the seed generator
+    prepares initial starting values from the input (MnUserParameterState)
+    for the minimization;
+ */
+
+class MinimumSeedGenerator {
+
+public:
+
+  virtual ~MinimumSeedGenerator() {}
+
+  virtual MinimumSeed operator()(const MnFcn&, const GradientCalculator&, const MnUserParameterState&, const MnStrategy&) const = 0;
+
+  virtual MinimumSeed operator()(const MnFcn&, const AnalyticalGradientCalculator&, const MnUserParameterState&, const MnStrategy&) const = 0;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinimumSeedGenerator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumState.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumState.h
new file mode 100644
index 0000000..8168dc3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinimumState.h
@@ -0,0 +1,82 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinimumState
+#define ROOT_Minuit2_MinimumState
+
+#include "Minuit2/MnRefCountedPointer.h"
+#include "Minuit2/BasicMinimumState.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumParameters;
+class MinimumError;
+class FunctionGradient;
+
+/** MinimumState keeps the information (position, Gradient, 2nd deriv, etc)
+    after one minimization step (usually in MinimumBuilder).
+ */
+
+class MinimumState {
+
+public:
+
+  /** invalid state */
+   MinimumState(unsigned int n) :
+      fData(MnRefCountedPointer<BasicMinimumState>(new BasicMinimumState(n,0.,0.,0.))) {}
+   /** state without parameters and errors (only function value an, edm and nfcn) */
+   MinimumState(double fval, double edm, int nfcn) :
+      fData(MnRefCountedPointer<BasicMinimumState>(new BasicMinimumState(0, fval, edm, nfcn))) {}
+  /** state with parameters only (from stepping methods like Simplex, Scan) */
+   MinimumState(const MinimumParameters& states, double edm, int nfcn) :
+      fData(MnRefCountedPointer<BasicMinimumState>(new BasicMinimumState(states, edm, nfcn))) {}
+
+  /** state with parameters, Gradient and covariance (from Gradient methods
+      such as Migrad) */
+  MinimumState(const MinimumParameters& states, const MinimumError& err,
+               const FunctionGradient& grad, double edm, int nfcn) :
+     fData(MnRefCountedPointer<BasicMinimumState>(new BasicMinimumState(states, err, grad, edm, nfcn))) {}
+
+  ~MinimumState() {}
+
+  MinimumState(const MinimumState& state) : fData(state.fData) {}
+
+  MinimumState& operator=(const MinimumState& state) {
+    fData = state.fData;
+    return *this;
+  }
+
+  const MinimumParameters& Parameters() const {return fData->Parameters();}
+  const MnAlgebraicVector& Vec() const {return fData->Vec();}
+  int size() const {return fData->size();}
+
+  const MinimumError& Error() const {return fData->Error();}
+  const FunctionGradient& Gradient() const {return fData->Gradient();}
+  double Fval() const {return fData->Fval();}
+  double Edm() const {return fData->Edm();}
+  int NFcn() const {return fData->NFcn();}
+
+  bool IsValid() const {return fData->IsValid();}
+
+  bool HasParameters() const {return fData->HasParameters();}
+  bool HasCovariance() const {return fData->HasCovariance();}
+
+private:
+
+  MnRefCountedPointer<BasicMinimumState> fData;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinimumState
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinosError.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinosError.h
new file mode 100644
index 0000000..1cb0f69
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinosError.h
@@ -0,0 +1,83 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinosError
+#define ROOT_Minuit2_MinosError
+
+#include "Minuit2/MnCross.h"
+#include <iostream>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//____________________________________________________________________________________
+/**
+   Class holding the result of Minos (lower and upper values) for a specific parameter
+ */
+
+class MinosError {
+
+public:
+
+   MinosError() : fParameter(0), fMinValue(0.), fUpper(MnCross()), fLower(MnCross()) {}
+
+   MinosError(unsigned int par, double min, const MnCross& low, const MnCross& up) : fParameter(par), fMinValue(min), fUpper(up), fLower(low) {}
+
+   ~MinosError() {}
+
+   MinosError(const MinosError& err) : fParameter(err.fParameter), fMinValue(err.fMinValue), fUpper(err.fUpper),  fLower(err.fLower) {}
+
+   MinosError& operator()(const MinosError& err) {
+      fParameter = err.fParameter;
+      fMinValue = err.fMinValue;
+      fUpper = err.fUpper;
+      fLower = err.fLower;
+      return *this;
+   }
+
+   std::pair<double,double> operator()() const {
+      return std::pair<double,double>(Lower(), Upper());
+   }
+   double Lower() const {
+      if ( AtLowerLimit() ) return LowerState().Parameter( Parameter() ).LowerLimit() -  fMinValue;
+      return -1.*LowerState().Error(Parameter())*(1. + fLower.Value());
+   }
+   double Upper() const {
+      if ( AtUpperLimit() ) return UpperState().Parameter( Parameter() ).UpperLimit() -  fMinValue;
+      return UpperState().Error(Parameter())*(1. + fUpper.Value());
+   }
+   unsigned int Parameter() const {return fParameter;}
+   const MnUserParameterState& LowerState() const {return fLower.State();}
+   const MnUserParameterState& UpperState() const {return fUpper.State();}
+   bool IsValid() const {return fLower.IsValid() && fUpper.IsValid();}
+   bool LowerValid() const {return fLower.IsValid();}
+   bool UpperValid() const {return fUpper.IsValid();}
+   bool AtLowerLimit() const {return fLower.AtLimit();}
+   bool AtUpperLimit() const {return fUpper.AtLimit();}
+   bool AtLowerMaxFcn() const {return fLower.AtMaxFcn();}
+   bool AtUpperMaxFcn() const {return fUpper.AtMaxFcn();}
+   bool LowerNewMin() const {return fLower.NewMinimum();}
+   bool UpperNewMin() const {return fUpper.NewMinimum();}
+   unsigned int NFcn() const {return fUpper.NFcn() + fLower.NFcn();}
+   double Min() const {return fMinValue;}
+
+private:
+
+   unsigned int fParameter;
+   double fMinValue;
+   MnCross fUpper;
+   MnCross fLower;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinosError
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/Minuit2Minimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/Minuit2Minimizer.h
new file mode 100644
index 0000000..09d3a28
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/Minuit2Minimizer.h
@@ -0,0 +1,330 @@
+// @(#)root/minuit2:$Id$
+// Author: L. Moneta Wed Oct 18 11:48:00 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class Minuit2Minimizer
+
+#ifndef ROOT_Minuit2_Minuit2Minimizer
+#define ROOT_Minuit2_Minuit2Minimizer
+
+#ifndef ROOT_Math_Minimizer
+#include "Math/Minimizer.h"
+#endif
+
+#ifndef ROOT_Minuit2_MnUserParameterState
+#include "Minuit2/MnUserParameterState.h"
+#endif
+
+#ifndef ROOT_Math_IFunctionfwd
+#include "Math/IFunctionfwd.h"
+#endif
+
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+      class ModularFunctionMinimizer;
+      class FCNBase;
+      class FunctionMinimum;
+      class MnTraceObject;
+
+      // enumeration specifying the type of Minuit2 minimizers
+      enum EMinimizerType {
+         kMigrad,
+         kSimplex,
+         kCombined,
+         kScan,
+         kFumili
+      };
+
+   }
+
+   namespace Minuit2 {
+//_____________________________________________________________________________________________________
+/**
+   Minuit2Minimizer class implementing the ROOT::Math::Minimizer interface for
+   Minuit2 minimization algorithm.
+   In ROOT it can be instantiated using the plug-in manager (plug-in "Minuit2")
+   Using a string  (used by the plugin manager) or via an enumeration
+   an one can set all the possible minimization algorithms (Migrad, Simplex, Combined, Scan and Fumili).
+*/
+class Minuit2Minimizer : public BA_ROOT::Math::Minimizer {
+
+public:
+
+   /**
+      Default constructor
+   */
+   Minuit2Minimizer (BA_ROOT::Minuit2::EMinimizerType type = BA_ROOT::Minuit2::kMigrad);
+
+   /**
+      Constructor with a char (used by PM)
+   */
+   Minuit2Minimizer (const char *  type);
+
+   /**
+      Destructor (no operations)
+   */
+   virtual ~Minuit2Minimizer ();
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /**
+      Copy constructor
+   */
+   Minuit2Minimizer(const Minuit2Minimizer &);
+
+   /**
+      Assignment operator
+   */
+   Minuit2Minimizer & operator = (const Minuit2Minimizer & rhs);
+
+public:
+
+   // clear resources (parameters) for consecutives minimizations
+   virtual void Clear();
+
+   /// set the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGenFunction & func);
+
+   /// set gradient the function to minimize
+   virtual void SetFunction(const BA_ROOT::Math::IMultiGradFunction & func);
+
+   /// set free variable
+   virtual bool SetVariable(unsigned int ivar, const std::string & name, double val, double step);
+
+   /// set lower limit variable  (override if minimizer supports them )
+   virtual bool SetLowerLimitedVariable(unsigned int  ivar , const std::string & name , double val , double step , double lower );
+   /// set upper limit variable (override if minimizer supports them )
+   virtual bool SetUpperLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double upper );
+   /// set upper/lower limited variable (override if minimizer supports them )
+   virtual bool SetLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double /* lower */, double /* upper */);
+   /// set fixed variable (override if minimizer supports them )
+   virtual bool SetFixedVariable(unsigned int /* ivar */, const std::string & /* name */, double /* val */);
+   /// set variable
+   virtual bool SetVariableValue(unsigned int ivar, double val);
+   // set variable values
+   virtual bool SetVariableValues(const double * val);
+   /// set the step size of an already existing variable
+   virtual bool SetVariableStepSize(unsigned int ivar, double step );
+   /// set the lower-limit of an already existing variable
+   virtual bool SetVariableLowerLimit(unsigned int ivar, double lower);
+   /// set the upper-limit of an already existing variable
+   virtual bool SetVariableUpperLimit(unsigned int ivar, double upper);
+   /// set the limits of an already existing variable
+   virtual bool SetVariableLimits(unsigned int ivar, double lower, double upper);
+   /// fix an existing variable
+   virtual bool FixVariable(unsigned int ivar);
+   /// release an existing variable
+   virtual bool ReleaseVariable(unsigned int ivar);
+   /// query if an existing variable is fixed (i.e. considered constant in the minimization)
+   /// note that by default all variables are not fixed
+   virtual bool IsFixedVariable(unsigned int ivar)  const;
+   /// get variable settings in a variable object (like ROOT::Fit::ParamsSettings)
+   virtual bool GetVariableSettings(unsigned int ivar, BA_ROOT::Fit::ParameterSettings & varObj) const;
+   /// get name of variables (override if minimizer support storing of variable names)
+   virtual std::string VariableName(unsigned int ivar) const;
+   /// get index of variable given a variable given a name
+   /// return -1 if variable is not found
+   virtual int VariableIndex(const std::string & name) const;
+
+   /**
+       method to perform the minimization.
+       Return false in case the minimization did not converge. In this case a
+       status code different than zero is set
+       (retrieved by the derived method Minimizer::Status() )"
+
+       status = 1    : Covariance was made pos defined
+       status = 2    : Hesse is invalid
+       status = 3    : Edm is above max
+       status = 4    : Reached call limit
+       status = 5    : Any other failure
+   */
+   virtual  bool Minimize();
+
+   /// return minimum function value
+   virtual double MinValue() const { return fState.Fval(); }
+
+   /// return expected distance reached from the minimum
+   virtual double Edm() const { return fState.Edm(); }
+
+   /// return  pointer to X values at the minimum
+   virtual const double *  X() const;
+
+   /// return pointer to gradient values at the minimum
+   virtual const double *  MinGradient() const { return 0; } // not available in Minuit2
+
+   /// number of function calls to reach the minimum
+   virtual unsigned int NCalls() const { return fState.NFcn(); }
+
+   /// this is <= Function().NDim() which is the total
+   /// number of variables (free+ constrained ones)
+   virtual unsigned int NDim() const { return fDim; }
+
+   /// number of free variables (real dimension of the problem)
+   /// this is <= Function().NDim() which is the total
+   virtual unsigned int NFree() const { return fState.VariableParameters(); }
+
+   /// minimizer provides error and error matrix
+   virtual bool ProvidesError() const { return true; }
+
+   /// return errors at the minimum
+   virtual const double * Errors() const;
+
+   /**
+       return covariance matrix elements
+       if the variable is fixed or const the value is zero
+       The ordering of the variables is the same as in errors and parameter value.
+       This is different from the direct interface of Minuit2 or TMinuit where the
+       values were obtained only to variable parameters
+   */
+   virtual double CovMatrix(unsigned int i, unsigned int j) const;
+
+
+   /**
+       Fill the passed array with the  covariance matrix elements
+       if the variable is fixed or const the value is zero.
+       The array will be filled as cov[i *ndim + j]
+       The ordering of the variables is the same as in errors and parameter value.
+       This is different from the direct interface of Minuit2 or TMinuit where the
+       values were obtained only to variable parameters
+   */
+   virtual bool GetCovMatrix(double * cov) const;
+
+   /**
+       Fill the passed array with the Hessian matrix elements
+       The Hessian matrix is the matrix of the second derivatives
+       and is the inverse of the covariance matrix
+       If the variable is fixed or const the values for that variables are zero.
+       The array will be filled as h[i *ndim + j]
+   */
+   virtual bool GetHessianMatrix(double * h) const;
+
+
+   /**
+      return the status of the covariance matrix
+       status = -1 :  not available (inversion failed or Hesse failed)
+       status =  0 : available but not positive defined
+       status =  1 : covariance only approximate
+       status =  2 : full matrix but forced pos def
+       status =  3 : full accurate matrix
+
+    */
+   virtual int CovMatrixStatus() const;
+   /**
+      return correlation coefficient between variable i and j.
+      If the variable is fixed or const the return value is zero
+    */
+   virtual double Correlation(unsigned int i, unsigned int j ) const;
+
+   /**
+      get global correlation coefficient for the variable i. This is a number between zero and one which gives
+      the correlation between the i-th variable  and that linear combination of all other variables which
+      is most strongly correlated with i.
+      If the variable is fixed or const the return value is zero
+    */
+   virtual double GlobalCC(unsigned int i) const;
+
+   /**
+      get the minos error for parameter i, return false if Minos failed
+      A minimizaiton must be performed befre, return false if no minimization has been done
+      In case of Minos failed the status error is updated as following
+      status += 10 * minosStatus where the minos status is:
+       status = 1    : maximum number of function calls exceeded when running for lower error
+       status = 2    : maximum number of function calls exceeded when running for upper error
+       status = 3    : new minimum found when running for lower error
+       status = 4    : new minimum found when running for upper error
+       status = 5    : any other failure
+
+   */
+   virtual bool GetMinosError(unsigned int i, double & errLow, double & errUp, int = 0);
+
+   /**
+      scan a parameter i around the minimum. A minimization must have been done before,
+      return false if it is not the case
+    */
+   virtual bool Scan(unsigned int i, unsigned int & nstep, double * x, double * y, double xmin = 0, double xmax = 0);
+
+   /**
+      find the contour points (xi,xj) of the function for parameter i and j around the minimum
+      The contour will be find for value of the function = Min + ErrorUp();
+    */
+   virtual bool Contour(unsigned int i, unsigned int j, unsigned int & npoints, double *xi, double *xj);
+
+
+   /**
+      perform a full calculation of the Hessian matrix for error calculation
+      If a valid minimum exists the calculation is done on the minimum point otherwise is performed
+      in the current set values of parameters
+      Status code of minimizer is updated according to the following convention (in case Hesse failed)
+      status += 100*hesseStatus where hesse status is:
+      status = 1 : hesse failed
+      status = 2 : matrix inversion failed
+      status = 3 : matrix is not pos defined
+    */
+   virtual bool Hesse();
+
+
+   /// return reference to the objective function
+   ///virtual const ROOT::Math::IGenFunction & Function() const;
+
+   /// print result of minimization
+   virtual void PrintResults();
+
+   /// set an object to trace operation for each iteration
+   /// The object muust implement operator() (unsigned int, MinimumState & state)
+   void SetTraceObject(MnTraceObject & obj);
+
+   /// set storage level   = 1 : store all iteration states (default)
+   ///                     = 0 : store only first and last state to save memory
+   void SetStorageLevel(int level);
+
+   /// return the minimizer state (containing values, step size , etc..)
+   const BA_ROOT::Minuit2::MnUserParameterState & State() { return fState; }
+
+protected:
+
+   // protected function for accessing the internal Minuit2 object. Needed for derived classes
+
+   virtual const BA_ROOT::Minuit2::ModularFunctionMinimizer * GetMinimizer() const { return fMinimizer; }
+
+   virtual void SetMinimizer( BA_ROOT::Minuit2::ModularFunctionMinimizer * m)  { fMinimizer = m; }
+
+   void SetMinimizerType( BA_ROOT::Minuit2::EMinimizerType type);
+
+   virtual const  BA_ROOT::Minuit2::FCNBase * GetFCN() const { return fMinuitFCN; }
+
+   /// examine the minimum result
+   bool ExamineMinimum(const BA_ROOT::Minuit2::FunctionMinimum & min);
+
+private:
+
+   unsigned int fDim;       // dimension of the function to be minimized
+   bool fUseFumili;
+
+   BA_ROOT::Minuit2::MnUserParameterState fState;
+   // std::vector<ROOT::Minuit2::MinosError> fMinosErrors;
+   BA_ROOT::Minuit2::ModularFunctionMinimizer * fMinimizer;
+   BA_ROOT::Minuit2::FCNBase * fMinuitFCN;
+   BA_ROOT::Minuit2::FunctionMinimum * fMinimum;
+   mutable std::vector<double> fValues;
+   mutable std::vector<double> fErrors;
+
+};
+
+   } // end namespace Fit
+
+} // end namespace ROOT
+
+
+
+#endif /* ROOT_Minuit2_Minuit2Minimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinuitParameter.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinuitParameter.h
new file mode 100644
index 0000000..96dd91e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MinuitParameter.h
@@ -0,0 +1,187 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MinuitParameter
+#define ROOT_Minuit2_MinuitParameter
+
+#include <algorithm>
+#include <memory>
+#include <cassert>
+#include <string>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//____________________________________________________________________________
+/**
+    class for the individual Minuit Parameter with Name and number;
+    contains the input numbers for the minimization or the output result
+    from minimization;
+    possible interactions: Fix/release, set/remove limits, set Value/error;
+
+    From version 5.20: use string to store the name to avoid limitation of
+    name length of 20 characters
+ */
+
+class MinuitParameter {
+
+public:
+
+   //default constructor standard with value/error = 0
+   MinuitParameter() :
+      fNum(0), fValue(0), fError(0.), fConst(false), fFix(false),
+      fLoLimit(0.), fUpLimit(0.), fLoLimValid(false), fUpLimValid(false),
+      fName("")
+   {}
+
+   //constructor for constant Parameter
+   MinuitParameter(unsigned int num, const std::string & name, double val) :
+      fNum(num), fValue(val), fError(0.), fConst(true), fFix(false),
+      fLoLimit(0.), fUpLimit(0.), fLoLimValid(false), fUpLimValid(false),
+      fName(name)
+  {}
+
+   //constructor for standard Parameter
+   MinuitParameter(unsigned int num, const std::string & name, double val, double err) :
+      fNum(num), fValue(val), fError(err), fConst(false), fFix(false),
+      fLoLimit(0.), fUpLimit(0.), fLoLimValid(false), fUpLimValid(false),
+      fName(name)
+   {}
+
+   //constructor for limited Parameter
+   MinuitParameter(unsigned int num, const std::string & name, double val, double err,
+                   double min, double max) :
+      fNum(num),fValue(val), fError(err), fConst(false), fFix(false),
+      fLoLimit(min), fUpLimit(max), fLoLimValid(true), fUpLimValid(true),
+      fName(name)
+   {
+      assert(min != max);
+      if(min > max) {
+         fLoLimit = max;
+         fUpLimit = min;
+      }
+   }
+
+   ~MinuitParameter() {}
+
+   MinuitParameter(const MinuitParameter& par) :
+      fNum(par.fNum), fValue(par.fValue), fError(par.fError),
+      fConst(par.fConst), fFix(par.fFix), fLoLimit(par.fLoLimit),
+      fUpLimit(par.fUpLimit), fLoLimValid(par.fLoLimValid),
+      fUpLimValid(par.fUpLimValid),
+      fName(par.fName )
+   {}
+
+   MinuitParameter& operator=(const MinuitParameter& par) {
+      if(this != &par) {
+         fNum = par.fNum;
+         fName = par.fName;
+         fValue = par.fValue;
+         fError = par.fError;
+         fConst = par.fConst;
+         fFix = par.fFix;
+         fLoLimit = par.fLoLimit;
+         fUpLimit = par.fUpLimit;
+         fLoLimValid = par.fLoLimValid;
+         fUpLimValid = par.fUpLimValid;
+      }
+      return *this;
+   }
+
+   //access methods
+   unsigned int Number() const {return fNum;}
+   // new API returning a string
+   const std::string & GetName() const { return fName; }
+   // return const char * for mantaining backward compatibility
+   const char * Name() const {return fName.c_str();}
+
+   double Value() const {return fValue;}
+   double Error() const {return fError;}
+
+   //interaction
+   void SetName(const std::string &name) { fName = name;  }
+
+   void SetValue(double val) {fValue = val;}
+   void SetError(double err) {fError = err;}
+   void SetLimits(double low, double up) {
+      assert(low != up);
+      fLoLimit = low;
+      fUpLimit = up;
+      fLoLimValid = true;
+      fUpLimValid = true;
+      if(low > up) {
+         fLoLimit = up;
+         fUpLimit = low;
+      }
+   }
+
+   void SetUpperLimit(double up) {
+      fLoLimit = 0.;
+      fUpLimit = up;
+      fLoLimValid = false;
+      fUpLimValid = true;
+   }
+
+   void SetLowerLimit(double low) {
+      fLoLimit = low;
+      fUpLimit = 0.;
+      fLoLimValid = true;
+      fUpLimValid = false;
+   }
+
+   void RemoveLimits() {
+      fLoLimit = 0.;
+      fUpLimit = 0.;
+      fLoLimValid = false;
+      fUpLimValid = false;
+   }
+
+   void Fix() {fFix = true;}
+   void Release() {fFix = false;}
+
+   //state of Parameter (fixed/const/limited)
+   bool IsConst() const {return fConst;}
+   bool IsFixed() const {return fFix;}
+
+   bool HasLimits() const {return fLoLimValid || fUpLimValid; }
+   bool HasLowerLimit() const {return fLoLimValid; }
+   bool HasUpperLimit() const {return fUpLimValid; }
+   double LowerLimit() const {return fLoLimit;}
+   double UpperLimit() const {return fUpLimit;}
+
+private:
+
+   unsigned int fNum;
+   double fValue;
+   double fError;
+   bool fConst;
+   bool fFix;
+   double fLoLimit;
+   double fUpLimit;
+   bool fLoLimValid;
+   bool fUpLimValid;
+   std::string fName;
+
+private:
+
+//    void SetName(const std::string & name) {
+//       int l = std::min(int(strlen(name)), 11);
+//       memset(fName, 0, 11*sizeof(char));
+//       memcpy(fName, name, l*sizeof(char));
+//       fName[10] = '\0';
+//    }
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MinuitParameter
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnApplication.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnApplication.h
new file mode 100644
index 0000000..f036e38
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnApplication.h
@@ -0,0 +1,141 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnApplication
+#define ROOT_Minuit2_MnApplication
+
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnStrategy.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+class FunctionMinimum;
+class MinuitParameter;
+class MnMachinePrecision;
+class ModularFunctionMinimizer;
+class FCNBase;
+class FCNGradientBase;
+
+//___________________________________________________________________________
+/**
+    application interface class for minimizers (migrad, simplex, Minimize,
+    Scan)
+    User normally instantiates the derived class like ROOT::Minuit2::MnMigrad
+    for using Migrad for minimization
+ */
+
+class MnApplication {
+
+public:
+
+
+   /// constructor from non-gradient functions
+   MnApplication(const FCNBase& fcn, const MnUserParameterState& state, const MnStrategy& stra, unsigned int nfcn = 0);
+
+   /// constructor from gradient function
+   MnApplication(const FCNGradientBase& fcn, const MnUserParameterState& state, const MnStrategy& stra, unsigned int nfcn = 0);
+
+   virtual ~MnApplication() { }
+
+   /**
+      Minimize the function
+      @param maxfcn : max number of function calls (if = 0) default is used which is set to
+                     200 + 100 * npar + 5 * npar**2
+      @param tolerance : value used for terminating iteration procedure.
+             For example, MIGRAD will stop iterating when edm (expected distance from minimum) will be:
+             edm < tolerance * 10**-3
+             Default value of tolerance used is 0.1
+   */
+   virtual FunctionMinimum operator()(unsigned int maxfcn = 0, double tolerance = 0.1);
+
+   virtual const ModularFunctionMinimizer& Minimizer() const = 0;
+
+   const MnMachinePrecision& Precision() const {return fState.Precision();}
+   const MnUserParameterState& State() const {return fState;}
+   const MnUserParameters& Parameters() const {return fState.Parameters();}
+   const MnUserCovariance& Covariance() const {return fState.Covariance();}
+   virtual const FCNBase& Fcnbase() const {return fFCN;}
+   const MnStrategy& Strategy() const {return fStrategy;}
+   unsigned int NumOfCalls() const {return fNumCall;}
+
+protected:
+
+   const FCNBase& fFCN;
+   MnUserParameterState fState;
+   MnStrategy fStrategy;
+   unsigned int fNumCall;
+   bool fUseGrad;
+
+public:
+
+// facade: forward interface of MnUserParameters and MnUserTransformation
+// via MnUserParameterState
+
+   //access to parameters (row-wise)
+   const std::vector<BA_ROOT::Minuit2::MinuitParameter>& MinuitParameters() const;
+   //access to parameters and errors in column-wise representation
+   std::vector<double> Params() const;
+   std::vector<double> Errors() const;
+
+   //access to single Parameter
+   const MinuitParameter& Parameter(unsigned int i) const;
+
+   //add free Parameter
+   void Add(const char* Name, double val, double err);
+   //add limited Parameter
+   void Add(const char* Name, double val, double err, double , double);
+   //add const Parameter
+   void Add(const char*, double);
+
+   //interaction via external number of Parameter
+   void Fix(unsigned int);
+   void Release(unsigned int);
+   void SetValue(unsigned int, double);
+   void SetError(unsigned int, double);
+   void SetLimits(unsigned int, double, double);
+   void RemoveLimits(unsigned int);
+
+   double Value(unsigned int) const;
+   double Error(unsigned int) const;
+
+   //interaction via Name of Parameter
+   void Fix(const char*);
+   void Release(const char*);
+   void SetValue(const char*, double);
+   void SetError(const char*, double);
+   void SetLimits(const char*, double, double);
+   void RemoveLimits(const char*);
+   void SetPrecision(double);
+
+   double Value(const char*) const;
+   double Error(const char*) const;
+
+   //convert Name into external number of Parameter
+   unsigned int Index(const char*) const;
+   //convert external number into Name of Parameter
+   const char* Name(unsigned int) const;
+
+   // transformation internal <-> external
+   double Int2ext(unsigned int, double) const;
+   double Ext2int(unsigned int, double) const;
+   unsigned int IntOfExt(unsigned int) const;
+   unsigned int ExtOfInt(unsigned int) const;
+   unsigned int VariableParameters() const;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnApplication
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnConfig.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnConfig.h
new file mode 100644
index 0000000..518d116
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnConfig.h
@@ -0,0 +1,21 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnConfig
+#define ROOT_Minuit2_MnConfig
+
+#ifdef _MSC_VER
+# pragma warning(disable:4244)  // conversion from __w64 to int
+#endif
+
+#if defined(__sun) && !defined(linux)
+#include <stdlib.h>
+#endif
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnContours.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnContours.h
new file mode 100644
index 0000000..22336a9
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnContours.h
@@ -0,0 +1,73 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnContours
+#define ROOT_Minuit2_MnContours
+
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/MnStrategy.h"
+
+#include <vector>
+#include <utility>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+class FunctionMinimum;
+class ContoursError;
+
+//_____________________________________________________________
+/**
+   API class for Contours Error analysis (2-dim errors);
+   minimization has to be done before and Minimum must be valid;
+   possibility to ask only for the points or the points and associated Minos
+   errors;
+ */
+
+class MnContours {
+
+public:
+
+   /// construct from FCN + Minimum
+   MnContours(const FCNBase& fcn, const FunctionMinimum& min) : fFCN(fcn), fMinimum(min), fStrategy(MnStrategy(1)) {}
+
+   /// construct from FCN + Minimum + strategy
+   MnContours(const FCNBase& fcn, const FunctionMinimum& min, unsigned int stra) : fFCN(fcn), fMinimum(min), fStrategy(MnStrategy(stra)) {}
+
+   /// construct from FCN + Minimum + strategy
+   MnContours(const FCNBase& fcn, const FunctionMinimum& min, const MnStrategy& stra) : fFCN(fcn), fMinimum(min), fStrategy(stra) {}
+
+   ~MnContours() {}
+
+   /// ask for one Contour (points only) from number of points (>=4) and parameter indeces
+   std::vector<std::pair<double,double> > operator()(unsigned int, unsigned int, unsigned int npoints = 20) const;
+
+   /// ask for one Contour ContoursError (MinosErrors + points)
+   /// from number of points (>=4) and parameter indeces
+   /// can be printed via std::cout
+   ContoursError Contour(unsigned int, unsigned int, unsigned int npoints = 20) const;
+
+   const MnStrategy& Strategy() const {return fStrategy;}
+
+private:
+
+   const FCNBase& fFCN;
+   const FunctionMinimum& fMinimum;
+   MnStrategy fStrategy;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnContours
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnCovarianceSqueeze.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnCovarianceSqueeze.h
new file mode 100644
index 0000000..e0c380d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnCovarianceSqueeze.h
@@ -0,0 +1,49 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnCovarianceSqueeze
+#define ROOT_Minuit2_MnCovarianceSqueeze
+
+#include "Minuit2/MnMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnUserCovariance;
+class MinimumError;
+
+/**
+   class to reduce the covariance matrix when a parameter is fixed by
+   removing the corresponding row and index
+ */
+class MnCovarianceSqueeze {
+
+public:
+
+  MnCovarianceSqueeze() {}
+
+  ~MnCovarianceSqueeze() {}
+
+  MnUserCovariance operator()(const MnUserCovariance&, unsigned int) const;
+
+  MinimumError operator()(const MinimumError&, unsigned int) const;
+
+  MnAlgebraicSymMatrix operator()(const MnAlgebraicSymMatrix&, unsigned int) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnCovarianceSqueeze
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnCross.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnCross.h
new file mode 100644
index 0000000..5a3d9db
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnCross.h
@@ -0,0 +1,82 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnCross
+#define ROOT_Minuit2_MnCross
+
+#include "Minuit2/MnUserParameterState.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnCross {
+
+public:
+
+  class CrossParLimit {};
+  class CrossFcnLimit {};
+  class CrossNewMin {};
+
+public:
+
+  MnCross() : fValue(0.), fState(MnUserParameterState()), fNFcn(0), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(false) {}
+
+  MnCross(unsigned int nfcn) : fValue(0.), fState(MnUserParameterState() ), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(false) {}
+
+  MnCross(const  MnUserParameterState& state, unsigned int nfcn) : fValue(0.), fState(state), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(false) {}
+
+  MnCross(double value, const MnUserParameterState& state, unsigned int nfcn) : fValue(value), fState(state), fNFcn(nfcn), fValid(true), fLimset(false), fMaxFcn(false), fNewMin(false) {}
+
+  MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossParLimit) : fValue(0.), fState(state), fNFcn(nfcn), fValid(true), fLimset(true), fMaxFcn(false), fNewMin(false) {}
+
+  MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossFcnLimit) : fValue(0.), fState(state), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(true), fNewMin(false) {}
+
+  MnCross(const MnUserParameterState& state, unsigned int nfcn, CrossNewMin) : fValue(0.), fState(state), fNFcn(nfcn), fValid(false), fLimset(false), fMaxFcn(false), fNewMin(true) {}
+
+  ~MnCross() {}
+
+  MnCross(const MnCross& cross) : fValue(cross.fValue), fState(cross.fState), fNFcn(cross.fNFcn), fValid(cross.fValid), fLimset(cross.fLimset), fMaxFcn(cross.fMaxFcn), fNewMin(cross.fNewMin) {}
+
+  MnCross& operator()(const MnCross& cross) {
+    fValue = cross.fValue;
+    fState = cross.fState;
+    fNFcn = cross.fNFcn;
+    fValid = cross.fValid;
+    fLimset = cross.fLimset;
+    fMaxFcn = cross.fMaxFcn;
+    fNewMin = cross.fNewMin;
+    return *this;
+  }
+
+  double Value() const {return fValue;}
+  const MnUserParameterState& State() const {return fState;}
+  bool IsValid() const {return fValid;}
+  bool AtLimit() const {return fLimset;}
+  bool AtMaxFcn() const {return fMaxFcn;}
+  bool NewMinimum() const {return fNewMin;}
+  unsigned int NFcn() const {return fNFcn;}
+
+private:
+
+  double fValue;
+  MnUserParameterState fState;
+  unsigned int fNFcn;
+  bool fValid;
+  bool fLimset;
+  bool fMaxFcn;
+  bool fNewMin;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnCross
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnEigen.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnEigen.h
new file mode 100644
index 0000000..a7b4442
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnEigen.h
@@ -0,0 +1,46 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnEigen
+#define ROOT_Minuit2_MnEigen
+
+#include "Minuit2/MnConfig.h"
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnUserCovariance;
+
+/**
+   API class for calculating the eigenvalues of symmetric matrix
+ */
+
+class MnEigen {
+
+public:
+
+  MnEigen() {}
+
+  ~MnEigen() {}
+
+  /// calculate the eigenvalues
+  std::vector<double> operator()(const MnUserCovariance&) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnEigen
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFcn.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFcn.h
new file mode 100644
index 0000000..0cc6f8e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFcn.h
@@ -0,0 +1,66 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnFcn
+#define ROOT_Minuit2_MnFcn
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/MnMatrix.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+/**
+   Wrapper class to FCNBase interface used internally by Minuit.
+   Apply conversion from calling the function from a Minuit Vector (MnAlgebraicVector) to a std::vector  for
+   the function coordinates.
+   The class counts also the number of function calls. By default counter strart from zero, but a different value
+   might be given if the class is  instantiated later on, for example for a set of different minimizaitons
+   Normally the derived class MnUserFCN should be instantiated with performs in addition the transformatiopn
+   internal-> external parameters
+ */
+class MnFcn {
+
+public:
+
+   /// constructor of
+   explicit MnFcn(const FCNBase& fcn, int ncall = 0) : fFCN(fcn), fNumCall(ncall) {}
+
+  virtual ~MnFcn();
+
+  virtual double operator()(const MnAlgebraicVector&) const;
+  unsigned int NumOfCalls() const {return fNumCall;}
+
+  //
+  //forward interface
+  //
+  double ErrorDef() const;
+  double Up() const;
+
+  const FCNBase& Fcn() const {return fFCN;}
+
+private:
+
+  const FCNBase& fFCN;
+
+protected:
+
+  mutable int fNumCall;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnFcn
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFumiliMinimize.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFumiliMinimize.h
new file mode 100644
index 0000000..1d59b7f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFumiliMinimize.h
@@ -0,0 +1,88 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnFumiliMinimize
+#define ROOT_Minuit2_MnFumiliMinimize
+
+#include "Minuit2/MnApplication.h"
+#include "Minuit2/FumiliMinimizer.h"
+#include "Minuit2/FumiliFCNBase.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+// class FumiliFCNBase;
+// class FCNBase;
+
+
+//___________________________________________________________________________
+/**
+
+
+API class for minimization using Fumili technology;
+allows for user interaction: set/change parameters, do minimization,
+change parameters, re-do minimization etc.;
+also used by MnMinos and MnContours;
+
+
+ */
+
+class MnFumiliMinimize : public MnApplication {
+
+public:
+
+   /// construct from FumiliFCNBase + std::vector for parameters and errors
+   MnFumiliMinimize(const FumiliFCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par,err), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) {}
+
+   /// construct from FumiliFCNBase + std::vector for parameters and covariance
+   MnFumiliMinimize(const FumiliFCNBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov,  unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) {}
+
+   /// construct from FumiliFCNBase + std::vector for parameters and MnUserCovariance
+   MnFumiliMinimize(const FumiliFCNBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) {}
+
+   /// construct from FumiliFCNBase + MnUserParameters
+   MnFumiliMinimize(const FumiliFCNBase& fcn, const MnUserParameters& par, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) {}
+
+   /// construct from FumiliFCNBase + MnUserParameters + MnUserCovariance
+   MnFumiliMinimize(const FumiliFCNBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) {}
+
+   /// construct from FumiliFCNBase + MnUserParameterState + MnStrategy
+   MnFumiliMinimize(const FumiliFCNBase& fcn, const MnUserParameterState& par, const MnStrategy& str) : MnApplication(fcn, MnUserParameterState(par), str), fMinimizer(FumiliMinimizer()), fFCN(fcn) {}
+
+   MnFumiliMinimize(const MnFumiliMinimize& migr) : MnApplication(migr.Fcnbase(), migr.State(), migr.Strategy(), migr.NumOfCalls()), fMinimizer(migr.fMinimizer), fFCN(migr.Fcnbase()) {}
+
+   virtual ~MnFumiliMinimize() { }
+
+   const FumiliMinimizer& Minimizer() const {return fMinimizer;}
+
+   const FumiliFCNBase & Fcnbase() const { return fFCN; }
+
+
+   /// overwrite Minimize to use FumiliFCNBase
+   virtual FunctionMinimum operator()(unsigned int = 0, double = 0.1);
+
+
+private:
+
+   FumiliMinimizer fMinimizer;
+   const FumiliFCNBase & fFCN;
+
+private:
+
+   //forbidden assignment of migrad (const FumiliFCNBase& = )
+   MnFumiliMinimize& operator=(const MnFumiliMinimize&) {return *this;}
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnFumiliMinimize
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFunctionCross.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFunctionCross.h
new file mode 100644
index 0000000..9b1a73c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnFunctionCross.h
@@ -0,0 +1,53 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnFunctionCross
+#define ROOT_Minuit2_MnFunctionCross
+
+#include "Minuit2/MnConfig.h"
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+class FCNBase;
+class MnUserParameterState;
+class MnStrategy;
+class MnCross;
+
+/**
+   MnFunctionCross
+*/
+
+class MnFunctionCross {
+
+public:
+
+  MnFunctionCross(const FCNBase& fcn, const MnUserParameterState& state, double fval, const MnStrategy& stra) : fFCN(fcn), fState(state), fFval(fval), fStrategy(stra) {}
+
+  ~MnFunctionCross() {}
+
+  MnCross operator()(const std::vector<unsigned int>&, const std::vector<double>&, const std::vector<double>&, double, unsigned int) const;
+
+private:
+
+  const FCNBase& fFCN;
+  const MnUserParameterState& fState;
+  double fFval;
+  const MnStrategy& fStrategy;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnFunctionCross
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnGlobalCorrelationCoeff.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnGlobalCorrelationCoeff.h
new file mode 100644
index 0000000..0b5d949
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnGlobalCorrelationCoeff.h
@@ -0,0 +1,51 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnGlobalCorrelationCoeff
+#define ROOT_Minuit2_MnGlobalCorrelationCoeff
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/MnMatrix.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+   class for global correlation coefficient
+ */
+class MnGlobalCorrelationCoeff {
+
+public:
+
+  MnGlobalCorrelationCoeff() :
+    fGlobalCC(std::vector<double>()), fValid(false) {}
+
+  MnGlobalCorrelationCoeff(const MnAlgebraicSymMatrix&);
+
+  ~MnGlobalCorrelationCoeff() {}
+
+  const std::vector<double>& GlobalCC() const {return fGlobalCC;}
+
+  bool IsValid() const {return fValid;}
+
+private:
+
+  std::vector<double> fGlobalCC;
+  bool fValid;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnGlobalCorrelationCoeff
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnHesse.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnHesse.h
new file mode 100644
index 0000000..05a684d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnHesse.h
@@ -0,0 +1,99 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnHesse
+#define ROOT_Minuit2_MnHesse
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/MnStrategy.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+class MnUserParameterState;
+class MnUserParameters;
+class MnUserCovariance;
+class MnUserTransformation;
+class MinimumState;
+class MnMachinePrecision;
+class MnFcn;
+class FunctionMinimum;
+
+//_______________________________________________________________________
+/**
+    API class for calculating the numerical covariance matrix
+    (== 2x Inverse Hessian == 2x Inverse 2nd derivative); can be used by the
+    user or Minuit itself
+ */
+
+class MnHesse {
+
+public:
+
+   /// default constructor with default strategy
+   MnHesse() : fStrategy(MnStrategy(1)) {}
+
+   /// constructor with user-defined strategy level
+   MnHesse(unsigned int stra) : fStrategy(MnStrategy(stra)) {}
+
+   /// conctructor with specific strategy
+   MnHesse(const MnStrategy& stra) : fStrategy(stra) {}
+
+   ~MnHesse() {}
+
+   ///
+   /// low-level API
+   ///
+   /// FCN + parameters + errors
+   MnUserParameterState operator()(const FCNBase&, const std::vector<double>&, const std::vector<double>&, unsigned int maxcalls=0) const;
+   /// FCN + parameters + covariance
+   MnUserParameterState operator()(const FCNBase&, const std::vector<double>&,  unsigned int nrow, const std::vector<double>&, unsigned int maxcalls = 0) const;
+   /// FCN + parameters + MnUserCovariance
+   MnUserParameterState operator()(const FCNBase&, const std::vector<double>&, const MnUserCovariance&, unsigned int maxcalls=0) const;
+   ///
+   /// high-level API
+   ///
+   /// FCN + MnUserParameters
+   MnUserParameterState operator()(const FCNBase&, const MnUserParameters&, unsigned int maxcalls=0) const;
+   /// FCN + MnUserParameters + MnUserCovariance
+   MnUserParameterState operator()(const FCNBase&, const MnUserParameters&, const MnUserCovariance&, unsigned int maxcalls=0) const;
+   /// FCN + MnUserParameterState
+   MnUserParameterState operator()(const FCNBase&, const MnUserParameterState&, unsigned int maxcalls=0) const;
+   ///
+   /// API to use MnHesse after minimization when function mimimum is avalilable, otherwise information on the last state will be
+   /// lost. (It would be needed to re-call the gradient and spend extra useless function calls)
+   /// The Function Minimum is updated (modified) by adding the Hesse results as last state of minimization
+   ///
+   void operator()(const FCNBase&, FunctionMinimum&, unsigned int maxcalls=0) const;
+
+
+   /// internal interface
+   ///
+   MinimumState operator()(const MnFcn&, const MinimumState&, const MnUserTransformation&, unsigned int maxcalls=0) const;
+
+   /// forward interface of MnStrategy
+   unsigned int Ncycles() const {return fStrategy.HessianNCycles();}
+   double Tolerstp() const {return fStrategy.HessianStepTolerance();}
+   double TolerG2() const {return fStrategy.HessianG2Tolerance();}
+
+private:
+
+   MnStrategy fStrategy;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnHesse
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnLineSearch.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnLineSearch.h
new file mode 100644
index 0000000..91e7739
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnLineSearch.h
@@ -0,0 +1,71 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnLineSearch
+#define ROOT_Minuit2_MnLineSearch
+
+#include "Minuit2/MnMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnFcn;
+class MinimumParameters;
+class MnMachinePrecision;
+class MnParabolaPoint;
+
+
+
+
+/**
+
+Implements a 1-dimensional minimization along a given direction
+(i.e. quadratic interpolation) It is independent of the algorithm
+that generates the direction vector. It brackets the 1-dimensional
+Minimum and iterates to approach the real Minimum of the n-dimensional
+function.
+
+
+ at author Fred James and Matthias Winkler; comments added by Andras Zsenei
+and Lorenzo Moneta
+
+ at ingroup Minuit
+
+*/
+
+
+
+
+class MnLineSearch  {
+
+public:
+
+  MnLineSearch() {}
+
+  ~MnLineSearch() {}
+
+  MnParabolaPoint operator()(const MnFcn&, const MinimumParameters&, const MnAlgebraicVector&, double, const MnMachinePrecision&, bool debug = false) const;
+
+#ifdef USE_OTHER_LS
+  MnParabolaPoint CubicSearch(const MnFcn&, const MinimumParameters&, const MnAlgebraicVector&, double, double, const MnMachinePrecision&, bool debug = false) const;
+
+  MnParabolaPoint BrentSearch(const MnFcn&, const MinimumParameters&, const MnAlgebraicVector&, double, double, const MnMachinePrecision&, bool debug = false) const;
+#endif
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnLineSearch
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMachinePrecision.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMachinePrecision.h
new file mode 100644
index 0000000..7094e73
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMachinePrecision.h
@@ -0,0 +1,65 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnMachinePrecision
+#define ROOT_Minuit2_MnMachinePrecision
+
+#include <math.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+    determines the relative floating point arithmetic precision. The
+    SetPrecision() method can be used to override Minuit's own determination,
+    when the user knows that the {FCN} function Value is not calculated to
+    the nominal machine accuracy.
+ */
+
+class MnMachinePrecision {
+
+public:
+
+  MnMachinePrecision();
+
+  ~MnMachinePrecision() {}
+
+  MnMachinePrecision(const MnMachinePrecision& prec) : fEpsMac(prec.fEpsMac), fEpsMa2(prec.fEpsMa2) {}
+
+  MnMachinePrecision& operator=(const MnMachinePrecision& prec) {
+    fEpsMac = prec.fEpsMac;
+    fEpsMa2 = prec.fEpsMa2;
+    return *this;
+  }
+
+  /// eps returns the smallest possible number so that 1.+eps > 1.
+  double Eps() const {return fEpsMac;}
+
+  /// eps2 returns 2*sqrt(eps)
+  double Eps2() const {return fEpsMa2;}
+
+  /// override Minuit's own determination
+  void SetPrecision(double prec) {
+    fEpsMac = prec;
+    fEpsMa2 = 2.*sqrt(fEpsMac);
+  }
+
+private:
+
+  double fEpsMac;
+  double fEpsMa2;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnMachinePrecision
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMatrix.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMatrix.h
new file mode 100644
index 0000000..c8e8f4d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMatrix.h
@@ -0,0 +1,48 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnMatrix
+#define ROOT_Minuit2_MnMatrix
+
+//add MnConfig file to define before everything compiler
+// dependent macros
+
+#include "Minuit2/MnConfig.h"
+
+// Removing this the following include will cause the library to fail
+// to compile with gcc 4.0.0 under Red Hat Enterprise Linux 3.  That
+// is, FumiliBuiilder.cpp will fail with message about ambigous enum.
+// Putting an include <vector> before other includes in that file will
+// Fix it, but then another file class will fail with the same
+// message.  I don't understand it, but putting the include <vector>
+// in this one spot, fixes the problem and does not require any other
+// changes to the source code.
+//
+// Paul_Kunz at slac.stanford.edu  3 June 2005
+//
+#include <vector>
+
+#include "Minuit2/LASymMatrix.h"
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LaInverse.h"
+#include "Minuit2/LaOuterProduct.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+typedef LASymMatrix MnAlgebraicSymMatrix;
+typedef LAVector MnAlgebraicVector;
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnMatrix
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMigrad.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMigrad.h
new file mode 100644
index 0000000..f06664b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMigrad.h
@@ -0,0 +1,93 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnMigrad
+#define ROOT_Minuit2_MnMigrad
+
+#include "Minuit2/MnApplication.h"
+#include "Minuit2/VariableMetricMinimizer.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+
+//_____________________________________________________________________________
+/**
+   API class for minimization using Variable Metric technology ("MIGRAD");
+    allows for user interaction: set/change parameters, do minimization,
+    change parameters, re-do minimization etc.;
+    also used by MnMinos and MnContours;
+ */
+
+class MnMigrad : public MnApplication {
+
+public:
+
+   /// construct from FCNBase + std::vector for parameters and errors
+   MnMigrad(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par,err), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and covariance
+   MnMigrad(const FCNBase& fcn, const std::vector<double>& par,  unsigned int nrow, const std::vector<double>& cov, unsigned int stra = 1 ) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and MnUserCovariance
+   MnMigrad(const FCNBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters
+   MnMigrad(const FCNBase& fcn, const MnUserParameters& par, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters + MnUserCovariance
+   MnMigrad(const FCNBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameterState + MnStrategy
+   MnMigrad(const FCNBase& fcn, const MnUserParameterState& par, const MnStrategy& str) : MnApplication(fcn, MnUserParameterState(par), str), fMinimizer(VariableMetricMinimizer()) {}
+
+   // constructs from gradient FCN
+
+   /// construct from FCNGradientBase + std::vector for parameters and errors
+   MnMigrad(const FCNGradientBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par,err), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNGradientBase + std::vector for parameters and covariance
+   MnMigrad(const FCNGradientBase& fcn, const std::vector<double>& par,  unsigned int nrow, const std::vector<double>& cov, unsigned int stra = 1 ) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNGradientBase + std::vector for parameters and MnUserCovariance
+   MnMigrad(const FCNGradientBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNGradientBase + MnUserParameters
+   MnMigrad(const FCNGradientBase& fcn, const MnUserParameters& par, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNGradientBase + MnUserParameters + MnUserCovariance
+   MnMigrad(const FCNGradientBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) {}
+
+   /// construct from FCNGradientBase + MnUserParameterState + MnStrategy
+   MnMigrad(const FCNGradientBase& fcn, const MnUserParameterState& par, const MnStrategy& str) : MnApplication(fcn, MnUserParameterState(par), str), fMinimizer(VariableMetricMinimizer()) {}
+
+   MnMigrad(const MnMigrad& migr) : MnApplication(migr.Fcnbase(), migr.State(), migr.Strategy(), migr.NumOfCalls()), fMinimizer(migr.fMinimizer) {}
+
+   ~MnMigrad() {}
+
+   const ModularFunctionMinimizer& Minimizer() const {return fMinimizer;}
+
+private:
+
+   VariableMetricMinimizer fMinimizer;
+
+private:
+
+   //forbidden assignment of migrad (const FCNBase& = )
+   MnMigrad& operator=(const MnMigrad&) {return *this;}
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnMigrad
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMinimize.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMinimize.h
new file mode 100644
index 0000000..0451826
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMinimize.h
@@ -0,0 +1,92 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnMinimize
+#define ROOT_Minuit2_MnMinimize
+
+#include "Minuit2/MnApplication.h"
+#include "Minuit2/CombinedMinimizer.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+
+/** API class for minimization using Variable Metric technology ("MIGRAD");
+    allows for user interaction: set/change parameters, do minimization,
+    change parameters, re-do minimization etc.;
+    also used by MnMinos and MnContours;
+ */
+
+class MnMinimize : public MnApplication {
+
+public:
+
+   /// construct from FCNBase + std::vector for parameters and errors
+   MnMinimize(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par,err), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and covariance
+   MnMinimize(const FCNBase& fcn, const std::vector<double>& par,  unsigned int nrow, const std::vector<double>& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and MnUserCovariance
+   MnMinimize(const FCNBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters
+   MnMinimize(const FCNBase& fcn, const MnUserParameters& par, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters + MnUserCovariance
+   MnMinimize(const FCNBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameterState + MnStrategy
+   MnMinimize(const FCNBase& fcn, const MnUserParameterState& par, const MnStrategy& str) : MnApplication(fcn, MnUserParameterState(par), str), fMinimizer(CombinedMinimizer()) {}
+
+   // interfaces using FCNGradientBase
+
+   /// construct from FCNGradientBase + std::vector for parameters and errors
+   MnMinimize(const FCNGradientBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par,err), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNGradientBase + std::vector for parameters and covariance
+   MnMinimize(const FCNGradientBase& fcn, const std::vector<double>& par,  unsigned int nrow, const std::vector<double>& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNGradientBase + std::vector for parameters and MnUserCovariance
+   MnMinimize(const FCNGradientBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNGradientBase + MnUserParameters
+   MnMinimize(const FCNGradientBase& fcn, const MnUserParameters& par, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNGradientBase + MnUserParameters + MnUserCovariance
+   MnMinimize(const FCNGradientBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) {}
+
+   /// construct from FCNGradientBase + MnUserParameterState + MnStrategy
+   MnMinimize(const FCNGradientBase& fcn, const MnUserParameterState& par, const MnStrategy& str) : MnApplication(fcn, MnUserParameterState(par), str), fMinimizer(CombinedMinimizer()) {}
+
+
+   MnMinimize(const MnMinimize& migr) : MnApplication(migr.Fcnbase(), migr.State(), migr.Strategy(), migr.NumOfCalls()), fMinimizer(migr.fMinimizer) {}
+
+   ~MnMinimize() {}
+
+   const ModularFunctionMinimizer& Minimizer() const {return fMinimizer;}
+
+private:
+
+   CombinedMinimizer fMinimizer;
+
+private:
+
+   //forbidden assignment operator
+   MnMinimize& operator=(const MnMinimize&) {return *this;}
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnMinimize
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMinos.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMinos.h
new file mode 100644
index 0000000..a8fddea
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnMinos.h
@@ -0,0 +1,79 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnMinos
+#define ROOT_Minuit2_MnMinos
+
+#include "Minuit2/MnStrategy.h"
+
+#include <utility>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+class FunctionMinimum;
+class MinosError;
+class MnCross;
+
+//__________________________________________________________________
+/**
+    API class for Minos Error analysis (asymmetric errors);
+    minimization has to be done before and Minimum must be valid;
+    possibility to ask only for one side of the Minos Error;
+ */
+
+class MnMinos {
+
+public:
+
+
+   /// construct from FCN + Minimum + strategy
+   MnMinos(const FCNBase& fcn, const FunctionMinimum& min, unsigned int stra = 1);
+
+   /// construct from FCN + Minimum + strategy
+   MnMinos(const FCNBase& fcn, const FunctionMinimum& min, const MnStrategy& stra);
+
+   ~MnMinos() {}
+
+   /// returns the negative (pair.first) and the positive (pair.second)
+   /// Minos Error of the Parameter
+   std::pair<double,double> operator()(unsigned int, unsigned int maxcalls = 0, double toler = 0.1) const;
+
+   /// calculate one side (negative or positive Error) of the Parameter
+   /// give as input (optionally) maxcalls and tolerance
+   double Lower(unsigned int, unsigned int maxcalls = 0, double toler = 0.1) const;
+   double Upper(unsigned int, unsigned int maxcalls = 0, double toler = 0.1) const;
+
+   MnCross Loval(unsigned int, unsigned int maxcalls = 0, double toler = 0.1) const;
+   MnCross Upval(unsigned int, unsigned int maxcalls = 0, double toler = 0.1) const;
+
+   /// ask for MinosError (Lower + Upper)
+   /// can be printed via std::cout
+   MinosError Minos(unsigned int, unsigned int maxcalls = 0, double toler = 0.1) const;
+
+protected:
+
+   /// internal method to get crossing value via MnFunctionCross
+   MnCross FindCrossValue(int dir , unsigned int, unsigned int maxcalls, double toler) const;
+
+private:
+
+   const FCNBase& fFCN;
+   const FunctionMinimum& fMinimum;
+   MnStrategy fStrategy;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnMinos
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabola.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabola.h
new file mode 100644
index 0000000..9c6889f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabola.h
@@ -0,0 +1,173 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnParabola
+#define ROOT_Minuit2_MnParabola
+
+#include <math.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+
+This class defines a parabola of the form a*x*x + b*x + c
+
+ at author Fred James and Matthias Winkler; comments added by Andras Zsenei
+and Lorenzo Moneta
+
+ at ingroup Minuit
+
+ */
+
+class MnParabola {
+
+public:
+
+
+  /**
+
+  Constructor that initializes the parabola with its three parameters.
+
+  @param a the coefficient of the quadratic term
+  @param b the coefficient of the linear term
+  @param c the constant
+
+  */
+
+  MnParabola(double a, double b, double c) : fA(a), fB(b), fC(c) {}
+
+
+  ~MnParabola() {}
+
+
+  /**
+
+  Evaluates the parabola a the point x.
+
+  @param x the coordinate where the parabola needs to be evaluated.
+
+  @return the y coordinate of the parabola corresponding to x.
+
+  */
+
+  double Y(double x) const {return (fA*x*x + fB*x +fC);}
+
+
+  /**
+
+  Calculates the bigger of the two x values corresponding to the
+  given y Value.
+
+  <p>
+
+  ???????!!!!!!!!! And when there is none?? it looks like it will
+  crash?? what is sqrt (-1.0) ?
+
+  @param y the y Value for which the x Value is to be calculated.
+
+  @return the bigger one of the two corresponding values.
+
+  */
+
+  // ok, at first glance it does not look like the formula for the quadratic
+  // equation, but it is!  ;-)
+  double X_pos(double y) const {return (sqrt(y/fA + Min()*Min() - fC/fA) + Min());}
+  // maybe it is worth to check the performance improvement with the below formula??
+  //   double X_pos(double y) const {return (sqrt(y/fA + fB*fB/(4.*fA*fA) - fC/fA)  - fB/(2.*fA));}
+
+
+
+  /**
+
+  Calculates the smaller of the two x values corresponding to the
+  given y Value.
+
+  <p>
+
+  ???????!!!!!!!!! And when there is none?? it looks like it will
+  crash?? what is sqrt (-1.0) ?
+
+  @param y the y Value for which the x Value is to be calculated.
+
+  @return the smaller one of the two corresponding values.
+
+  */
+
+  double X_neg(double y) const {return (-sqrt(y/fA + Min()*Min() - fC/fA) + Min());}
+
+
+  /**
+
+  Calculates the x coordinate of the Minimum of the parabola.
+
+  @return x coordinate of the Minimum.
+
+  */
+
+  double Min() const {return -fB/(2.*fA);}
+
+
+  /**
+
+  Calculates the y coordinate of the Minimum of the parabola.
+
+  @return y coordinate of the Minimum.
+
+  */
+
+  double YMin() const {return (-fB*fB/(4.*fA) + fC);}
+
+
+  /**
+
+  Accessor to the coefficient of the quadratic term.
+
+  @return the coefficient of the quadratic term.
+
+   */
+
+  double A() const {return fA;}
+
+
+  /**
+
+  Accessor to the coefficient of the linear term.
+
+  @return the coefficient of the linear term.
+
+  */
+
+  double B() const {return fB;}
+
+
+  /**
+
+  Accessor to the coefficient of the constant term.
+
+  @return the coefficient of the constant term.
+
+  */
+
+  double C() const {return fC;}
+
+private:
+
+  double fA;
+  double fB;
+  double fC;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnParabola
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabolaFactory.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabolaFactory.h
new file mode 100644
index 0000000..2407351
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabolaFactory.h
@@ -0,0 +1,43 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnParabolaFactory
+#define ROOT_Minuit2_MnParabolaFactory
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnParabola;
+class MnParabolaPoint;
+
+class MnParabolaFactory {
+
+public:
+
+  MnParabolaFactory() {}
+
+  ~MnParabolaFactory() {}
+
+  MnParabola operator()(const MnParabolaPoint&, const MnParabolaPoint&,
+                        const MnParabolaPoint&) const;
+
+  MnParabola operator()(const MnParabolaPoint&, double,
+                        const MnParabolaPoint&) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnParabolaFactory
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabolaPoint.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabolaPoint.h
new file mode 100644
index 0000000..44c8e44
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParabolaPoint.h
@@ -0,0 +1,89 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnParabolaPoint
+#define ROOT_Minuit2_MnParabolaPoint
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+/**
+
+A point of a parabola.
+
+<p>
+
+????!!!! in reality it is just a general point in two dimensional space,
+there is nothing that would indicate, that it belongs to a parabola.
+This class defines simpy an (x,y) pair!!!!
+
+ at author Fred James and Matthias Winkler; comments added by Andras Zsenei
+and Lorenzo Moneta
+
+ at ingroup Minuit
+
+\todo Should it be called MnParabolaPoint or just Point?
+
+ */
+
+
+class MnParabolaPoint {
+
+public:
+
+
+  /**
+
+  Initializes the point with its coordinates.
+
+  @param x the x (first) coordinate of the point.
+  @param y the y (second) coordinate of the point.
+
+  */
+
+  MnParabolaPoint(double x, double y) : fX(x), fY(y) {}
+
+  ~MnParabolaPoint() {}
+
+
+  /**
+
+  Accessor to the x (first) coordinate.
+
+  @return the x (first) coordinate of the point.
+
+  */
+
+  double X() const {return fX;}
+
+
+  /**
+
+  Accessor to the y (second) coordinate.
+
+  @return the y (second) coordinate of the point.
+
+  */
+
+  double Y() const {return fY;}
+
+private:
+
+  double fX;
+  double fY;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnParabolaPoint
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParameterScan.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParameterScan.h
new file mode 100644
index 0000000..3da5b56
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnParameterScan.h
@@ -0,0 +1,57 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnParameterScan
+#define ROOT_Minuit2_MnParameterScan
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/MnUserParameters.h"
+
+#include <vector>
+#include <utility>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+
+/** Scans the values of FCN as a function of one Parameter and retains the
+    best function and Parameter values found.
+ */
+
+class MnParameterScan {
+
+public:
+
+  MnParameterScan(const FCNBase&, const MnUserParameters&);
+
+  MnParameterScan(const FCNBase&, const MnUserParameters&, double);
+
+  ~MnParameterScan() {}
+
+// returns pairs of (x,y) points, x=parameter Value, y=function Value of FCN
+  std::vector<std::pair<double, double> > operator()(unsigned int par, unsigned int maxsteps = 41, double low = 0., double high = 0.);
+
+  const MnUserParameters& Parameters() const {return fParameters;}
+  double Fval() const {return fAmin;}
+
+private:
+
+  const FCNBase& fFCN;
+  MnUserParameters fParameters;
+  double fAmin;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnParameterScan
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPlot.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPlot.h
new file mode 100644
index 0000000..fd85b1b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPlot.h
@@ -0,0 +1,55 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnPlot
+#define ROOT_Minuit2_MnPlot
+
+#include "Minuit2/MnConfig.h"
+#include <vector>
+#include <utility>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/** MnPlot produces a text-screen graphical output of (x,y) points, e.g.
+    from Scan or Contours.
+*/
+
+class MnPlot {
+
+public:
+
+  MnPlot() : fPageWidth(80), fPageLength(30) {}
+
+  MnPlot(unsigned int width, unsigned int length) : fPageWidth(width), fPageLength(length) {
+    if(fPageWidth > 120) fPageWidth = 120;
+    if(fPageLength > 56) fPageLength = 56;
+  }
+
+  ~MnPlot() {}
+
+  void operator()(const std::vector<std::pair<double,double> >&) const;
+  void operator()(double, double, const std::vector<std::pair<double,double> >&) const;
+
+  unsigned int Width() const {return fPageWidth;}
+  unsigned int Length() const {return fPageLength;}
+
+private:
+
+  unsigned int fPageWidth;
+  unsigned int fPageLength;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnPlot
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPosDef.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPosDef.h
new file mode 100644
index 0000000..581b984
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPosDef.h
@@ -0,0 +1,44 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnPosDef
+#define ROOT_Minuit2_MnPosDef
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumState;
+class MinimumError;
+class MnMachinePrecision;
+
+/**
+   Force the covariance matrix to be positive defined
+   by adding extra terms in the diagonal
+ */
+class MnPosDef {
+
+public:
+
+  MnPosDef() {}
+
+  ~MnPosDef() {}
+
+  MinimumState operator()(const MinimumState&, const MnMachinePrecision&) const;
+  MinimumError operator()(const MinimumError&, const MnMachinePrecision&) const;
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnPosDef
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPrint.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPrint.h
new file mode 100644
index 0000000..73cfc63
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnPrint.h
@@ -0,0 +1,174 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnPrint
+#define ROOT_Minuit2_MnPrint
+
+#include "Minuit2/MnConfig.h"
+
+//#define DEBUG
+//#define WARNINGMSG
+
+#include <iostream>
+
+#ifdef DEBUG
+#ifndef WARNINGMSG
+#define WARNINGMSG
+#endif
+#endif
+
+
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+    define std::ostream operators for output
+*/
+
+class FunctionMinimum;
+std::ostream& operator<<(std::ostream&, const FunctionMinimum&);
+
+class MinimumState;
+std::ostream& operator<<(std::ostream&, const MinimumState&);
+
+class LAVector;
+std::ostream& operator<<(std::ostream&, const LAVector&);
+
+class LASymMatrix;
+std::ostream& operator<<(std::ostream&, const LASymMatrix&);
+
+class MnUserParameters;
+std::ostream& operator<<(std::ostream&, const MnUserParameters&);
+
+class MnUserCovariance;
+std::ostream& operator<<(std::ostream&, const MnUserCovariance&);
+
+class MnGlobalCorrelationCoeff;
+std::ostream& operator<<(std::ostream&, const MnGlobalCorrelationCoeff&);
+
+class MnUserParameterState;
+std::ostream& operator<<(std::ostream&, const MnUserParameterState&);
+
+class MnMachinePrecision;
+std::ostream& operator<<(std::ostream&, const MnMachinePrecision&);
+
+class MinosError;
+std::ostream& operator<<(std::ostream&, const MinosError&);
+
+class ContoursError;
+std::ostream& operator<<(std::ostream&, const ContoursError&);
+
+
+// class define static print level values
+
+class MnPrint {
+
+public:
+   // set print level and return the previous one
+   static int SetLevel(int level);
+
+   // return current level
+   static int Level();
+
+   // print current minimization state
+   static void PrintState(std::ostream & os, const MinimumState & state, const char * msg, int iter = -1);
+
+   // print current minimization state
+   static void PrintState(std::ostream & os, double fcn, double edm, int ncalls, const char * msg, int iter = -1);
+
+   // print FCN value with right precision adding optionally end line
+   static void PrintFcn(std::ostream & os, double value, bool endline = true);
+};
+
+
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+
+// macro to report messages
+
+#ifndef USE_ROOT_ERROR
+
+#ifndef MNLOG
+#define MN_OS std::cerr
+#else
+#define MN_OS MNLOG
+#endif
+
+#define MN_INFO_MSG(str) \
+   if (MnPrint::Level() > 0) MN_OS << "Info: " << str    \
+       << std::endl;
+#define MN_ERROR_MSG(str) \
+   if (MnPrint::Level() >= 0) MN_OS << "Error: " << str \
+       << std::endl;
+# define MN_INFO_VAL(x) \
+   if (MnPrint::Level() > 0) MN_OS << "Info: " << #x << " = " << (x) << std::endl;
+# define MN_ERROR_VAL(x) \
+   if (MnPrint::Level() >= 0) MN_OS << "Error: " << #x << " = " << (x) << std::endl;
+
+
+// same giving a location
+
+#define MN_INFO_MSG2(loc,str) \
+  if (MnPrint::Level() > 0) MN_OS << "Info in " << loc << " : " << str \
+       << std::endl;
+#define MN_ERROR_MSG2(loc,str) \
+   if (MnPrint::Level() >= 0) MN_OS << "Error in " << loc << " : " << str \
+       << std::endl;
+# define MN_INFO_VAL2(loc,x) \
+   if (MnPrint::Level() > 0) MN_OS << "Info in " << loc << " : " << #x << " = " << (x) << std::endl;
+# define MN_ERROR_VAL2(loc,x) \
+   if (MnPrint::Level() >= 0) MN_OS << "Error in " << loc << " : " << #x << " = " << (x) << std::endl;
+
+
+
+#else
+// use ROOT error reporting system
+#include "TError.h"
+#include "Math/Util.h"
+
+// this first two should be used only with string literals to
+// avoid warning produced by the format in TError
+#define  MN_INFO_MSG(str) \
+   ::Info("Minuit2",str);
+#define  MN_ERROR_MSG(str) \
+   ::Error("Minuit2",str);
+# define MN_INFO_VAL(x) \
+   {std::string str = std::string(#x) + std::string(" = ") + ROOT::Math::Util::ToString(x); \
+      ::Info("Minuit2","%s",str.c_str() );}
+# define MN_ERROR_VAL(x) \
+   {std::string str = std::string(#x) + std::string(" = ") + ROOT::Math::Util::ToString(x); \
+   ::Error("Minuit2","%s",str.c_str() );}
+
+# define MN_INFO_MSG2(loc,txt) \
+   {std::string str = std::string(loc) + std::string(" : ") + std::string(txt); \
+   ::Info("Minuit2","%s",str.c_str() );}
+# define MN_ERROR_MSG2(loc,txt) \
+   {std::string str = std::string(loc) + std::string(" : ") + std::string(txt); \
+   ::Error("Minuit2","%s",str.c_str() );}
+
+# define MN_INFO_VAL2(loc,x) \
+   {std::string str = std::string(loc) + std::string(" : ") + std::string(#x) + std::string(" = ") + ROOT::Math::Util::ToString(x); \
+   ::Info("Minuit2","%s",str.c_str() );}
+# define MN_ERROR_VAL2(loc,x) \
+   {std::string str = std::string(loc) + std::string(" : ") + std::string(#x) + std::string(" = ") + ROOT::Math::Util::ToString(x); \
+   ::Error("Minuit2","%s",str.c_str() );}
+
+
+
+#endif
+
+
+#endif  // ROOT_Minuit2_MnPrint
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnRefCountedPointer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnRefCountedPointer.h
new file mode 100644
index 0000000..6e7939d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnRefCountedPointer.h
@@ -0,0 +1,100 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnRefCountedPointer
+#define ROOT_Minuit2_MnRefCountedPointer
+
+#include "MnReferenceCounter.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+template<class T> class MnRefCountedPointer {
+
+public:
+
+  // Default constructor needed for use inside array, vector, etc.
+  MnRefCountedPointer() : fPtr(0), fCounter(0) {}
+
+  MnRefCountedPointer(T* pt) :
+    fPtr(pt), fCounter(new MnReferenceCounter()) {AddReference();}
+
+  MnRefCountedPointer(const MnRefCountedPointer<T>& other) :
+    fPtr(other.fPtr), fCounter(other.fCounter) {AddReference();}
+
+  ~MnRefCountedPointer() {
+    /*
+    if(References() == 0) {
+      if(fPtr) delete fPtr;
+      if(fCounter) delete fCounter;
+    }
+    else RemoveReference();
+    */
+    if(References() != 0) RemoveReference();
+  }
+
+  bool IsValid() const {return fPtr != 0;}
+
+  MnRefCountedPointer& operator=(const MnRefCountedPointer<T>& other) {
+    if(this != &other && fPtr != other.fPtr) {
+      RemoveReference();
+      fPtr = other.fPtr;
+      fCounter = other.fCounter;
+      AddReference();
+    }
+    return *this;
+  }
+
+  MnRefCountedPointer& operator=(T* ptr) {
+    if(fPtr != ptr) {
+      fPtr = ptr;
+      fCounter = new MnReferenceCounter();
+    }
+    return *this;
+  }
+
+  T* Get() const {return fPtr;}
+
+  T* operator->() const {DoCheck(); return fPtr;}
+
+  T& operator*() const {DoCheck(); return *fPtr;}
+
+  bool operator==(const  T* otherP) const {return fPtr == otherP;}
+
+  bool operator<(const  T* otherP) const {return fPtr < otherP;}
+
+  unsigned int References() const {return fCounter->References();}
+
+  void AddReference() const {fCounter->AddReference();}
+
+  void RemoveReference() {
+    fCounter->RemoveReference();
+    if(References() == 0) {
+      delete fPtr; fPtr=0;
+      delete fCounter; fCounter=0;
+    }
+  }
+
+private:
+
+  T*  fPtr;
+  MnReferenceCounter* fCounter;
+
+private:
+
+  void DoCheck() const {assert(IsValid());}
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnRefCountedPointer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnReferenceCounter.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnReferenceCounter.h
new file mode 100644
index 0000000..d540cf2
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnReferenceCounter.h
@@ -0,0 +1,63 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnReferenceCounter
+#define ROOT_Minuit2_MnReferenceCounter
+
+#include <cassert>
+
+#include "StackAllocator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//extern StackAllocator gStackAllocator;
+
+class MnReferenceCounter {
+
+public:
+
+  MnReferenceCounter() : fReferences(0) {}
+
+  MnReferenceCounter(const MnReferenceCounter& other) :
+    fReferences(other.fReferences) {}
+
+  MnReferenceCounter& operator=(const MnReferenceCounter& other) {
+    fReferences = other.fReferences;
+    return *this;
+  }
+
+  ~MnReferenceCounter() {assert(fReferences == 0);}
+
+  void* operator new(size_t nbytes) {
+    return StackAllocatorHolder::Get().Allocate(nbytes);
+  }
+
+  void operator delete(void* p, size_t /*nbytes */) {
+    StackAllocatorHolder::Get().Deallocate(p);
+  }
+
+  unsigned int References() const {return fReferences;}
+
+  void AddReference() const {fReferences++;}
+
+  void RemoveReference() const {fReferences--;}
+
+private:
+
+  mutable unsigned int fReferences;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnReferenceCounter
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnScan.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnScan.h
new file mode 100644
index 0000000..a2d9c23
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnScan.h
@@ -0,0 +1,75 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnScan
+#define ROOT_Minuit2_MnScan
+
+#include "Minuit2/MnApplication.h"
+#include "Minuit2/ScanMinimizer.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+
+//_______________________________________________________________________
+/**
+    API class for minimization using a scan method to find the minimum;
+    allows for user interaction: set/change parameters, do minimization,
+    change parameters, re-do minimization etc.;
+
+ */
+
+class MnScan : public MnApplication {
+
+public:
+
+   /// construct from FCNBase + std::vector for parameters and errors
+   MnScan(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par,err), MnStrategy(stra)), fMinimizer(ScanMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and covariance
+   MnScan(const FCNBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov,  unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(ScanMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and MnUserCovariance
+   MnScan(const FCNBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(ScanMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters
+   MnScan(const FCNBase& fcn, const MnUserParameters& par, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par), MnStrategy(stra)), fMinimizer(ScanMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters + MnUserCovariance
+   MnScan(const FCNBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(ScanMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameterState + MnStrategy
+   MnScan(const FCNBase& fcn, const MnUserParameterState& par, const MnStrategy& str) : MnApplication(fcn, MnUserParameterState(par), str), fMinimizer(ScanMinimizer()) {}
+
+   MnScan(const MnScan& migr) : MnApplication(migr.Fcnbase(), migr.State(), migr.Strategy(), migr.NumOfCalls()), fMinimizer(migr.fMinimizer) {}
+
+   ~MnScan() {}
+
+   const ModularFunctionMinimizer& Minimizer() const {return fMinimizer;}
+
+   std::vector<std::pair<double, double> > Scan(unsigned int par, unsigned int maxsteps = 41, double low = 0., double high = 0.);
+
+private:
+
+   ScanMinimizer fMinimizer;
+
+private:
+
+   /// forbidden assignment (const FCNBase& = )
+   MnScan& operator=(const MnScan&) {return *this;}
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnScan
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnSeedGenerator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnSeedGenerator.h
new file mode 100644
index 0000000..dde4a2a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnSeedGenerator.h
@@ -0,0 +1,44 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnSeedGenerator
+#define ROOT_Minuit2_MnSeedGenerator
+
+#include "Minuit2/MinimumSeedGenerator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/** concrete implementation of the MinimumSeedGenerator interface; used within
+    ModularFunctionMinimizer;
+ */
+
+class MnSeedGenerator : public MinimumSeedGenerator {
+
+public:
+
+  MnSeedGenerator() {}
+
+  virtual ~MnSeedGenerator() {}
+
+  virtual MinimumSeed operator()(const MnFcn&, const GradientCalculator&, const MnUserParameterState&, const MnStrategy&) const;
+
+  virtual MinimumSeed operator()(const MnFcn&, const AnalyticalGradientCalculator&, const MnUserParameterState&, const MnStrategy&) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnSeedGenerator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnSimplex.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnSimplex.h
new file mode 100644
index 0000000..6f558e3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnSimplex.h
@@ -0,0 +1,76 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnSimplex
+#define ROOT_Minuit2_MnSimplex
+
+#include "Minuit2/MnApplication.h"
+#include "Minuit2/SimplexMinimizer.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FCNBase;
+
+//_________________________________________________________________________
+/**
+    API class for minimization using the Simplex method, which does not need and use
+    the derivatives of the function, but only function values.
+    More information on the minimization method is available
+    <A HREF="http://seal.web.cern.ch/mathlibs/documents/minuit/mntutorial.pdf">here</A>.
+
+    It allows for user interaction: set/change parameters, do minimization,
+    change parameters, re-do minimization etc.;
+ */
+
+class MnSimplex : public MnApplication {
+
+public:
+
+   /// construct from FCNBase + std::vector for parameters and errors
+   MnSimplex(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par,err), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and covariance
+   MnSimplex(const FCNBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov,  unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) {}
+
+   /// construct from FCNBase + std::vector for parameters and MnUserCovariance
+   MnSimplex(const FCNBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters
+   MnSimplex(const FCNBase& fcn, const MnUserParameters& par, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameters + MnUserCovariance
+   MnSimplex(const FCNBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) {}
+
+   /// construct from FCNBase + MnUserParameterState + MnStrategy
+   MnSimplex(const FCNBase& fcn, const MnUserParameterState& par, const MnStrategy& str) : MnApplication(fcn, MnUserParameterState(par), str), fMinimizer(SimplexMinimizer()) {}
+
+   MnSimplex(const MnSimplex& migr) : MnApplication(migr.Fcnbase(), migr.State(), migr.Strategy(), migr.NumOfCalls()), fMinimizer(migr.fMinimizer) {}
+
+   ~MnSimplex() {}
+
+   const ModularFunctionMinimizer& Minimizer() const {return fMinimizer;}
+
+private:
+
+   SimplexMinimizer fMinimizer;
+
+private:
+
+   //forbidden assignment of migrad (const FCNBase& = )
+   MnSimplex& operator=(const MnSimplex&) {return *this;}
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnSimplex
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnStrategy.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnStrategy.h
new file mode 100644
index 0000000..0cb8500
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnStrategy.h
@@ -0,0 +1,90 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnStrategy
+#define ROOT_Minuit2_MnStrategy
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//_________________________________________________________________________
+/**
+    API class for defining three levels of strategies: low (0), medium (1),
+    high (>=2);
+    acts on: Migrad (behavioural),
+             Minos (lowers strategy by 1 for Minos-own minimization),
+             Hesse (iterations),
+             Numerical2PDerivative (iterations)
+ */
+
+class MnStrategy {
+
+public:
+
+   //default strategy
+   MnStrategy();
+
+   //user defined strategy (0, 1, >=2)
+   explicit MnStrategy(unsigned int);
+
+   ~MnStrategy() {}
+
+   unsigned int Strategy() const {return fStrategy;}
+
+   unsigned int GradientNCycles() const {return fGradNCyc;}
+   double GradientStepTolerance() const {return fGradTlrStp;}
+   double GradientTolerance() const {return fGradTlr;}
+
+   unsigned int HessianNCycles() const {return fHessNCyc;}
+   double HessianStepTolerance() const {return fHessTlrStp;}
+   double HessianG2Tolerance() const {return fHessTlrG2;}
+   unsigned int HessianGradientNCycles() const {return fHessGradNCyc;}
+
+   int StorageLevel() const { return fStoreLevel; }
+
+   bool IsLow() const {return fStrategy == 0;}
+   bool IsMedium() const {return fStrategy == 1;}
+   bool IsHigh() const {return fStrategy >= 2;}
+
+   void SetLowStrategy();
+   void SetMediumStrategy();
+   void SetHighStrategy();
+
+   void SetGradientNCycles(unsigned int n) {fGradNCyc = n;}
+   void SetGradientStepTolerance(double stp) {fGradTlrStp = stp;}
+   void SetGradientTolerance(double toler) {fGradTlr = toler;}
+
+   void SetHessianNCycles(unsigned int n) {fHessNCyc = n;}
+   void SetHessianStepTolerance(double stp) {fHessTlrStp = stp;}
+   void SetHessianG2Tolerance(double toler) {fHessTlrG2 = toler;}
+   void SetHessianGradientNCycles(unsigned int n) {fHessGradNCyc = n;}
+
+   // set storage level of iteration quantities
+   // 0 = store only last iterations 1 = full storage (default)
+   void SetStorageLevel(unsigned int level) { fStoreLevel = level; }
+private:
+
+   unsigned int fStrategy;
+
+   unsigned int fGradNCyc;
+   double fGradTlrStp;
+   double fGradTlr;
+   unsigned int fHessNCyc;
+   double fHessTlrStp;
+   double fHessTlrG2;
+   unsigned int fHessGradNCyc;
+   int fStoreLevel;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnStrategy
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnTiny.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnTiny.h
new file mode 100644
index 0000000..572fa89
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnTiny.h
@@ -0,0 +1,39 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnTiny
+#define ROOT_Minuit2_MnTiny
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnTiny {
+
+public:
+
+  MnTiny() : fOne(1.) {}
+
+  ~MnTiny() {}
+
+  double One() const;
+
+  double operator()(volatile double epsp1) const;
+
+private:
+
+  double fOne;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnTiny
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnTraceObject.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnTraceObject.h
new file mode 100644
index 0000000..a109f98
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnTraceObject.h
@@ -0,0 +1,49 @@
+// @(#)root/minuit2:$Id$
+// Author:  L. Moneta 2012
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2012 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnTraceObject
+#define ROOT_Minuit2_MnTraceObject
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+      class MinimumState;
+      class MnUserParameterState;
+
+      class MnTraceObject {
+
+      public:
+
+         MnTraceObject(int parNumber = -1) :
+            fUserState(0),
+            fParNumber(parNumber) {}
+
+         virtual ~MnTraceObject() {}
+
+         virtual void Init(const MnUserParameterState & state) { fUserState = &state; }
+
+         virtual void operator() (int i, const MinimumState & state);
+
+         const MnUserParameterState & UserState() const { return *fUserState; }
+
+         void SetParNumber(int number) { fParNumber = number; }
+
+         int  ParNumber() const { return fParNumber; }
+
+      private:
+
+         const MnUserParameterState * fUserState;
+         int fParNumber;
+      };
+
+   }  // namespace Minuit2
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnTraceIter
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserCovariance.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserCovariance.h
new file mode 100644
index 0000000..abcfb1f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserCovariance.h
@@ -0,0 +1,101 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnUserCovariance
+#define ROOT_Minuit2_MnUserCovariance
+
+#ifndef ROOT_Minuit2_MnConfig
+#include "Minuit2/MnConfig.h"
+#endif
+#include <vector>
+#include <cassert>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**
+   Class containing the covariance matrix data represented as a vector of
+   size n*(n+1)/2
+   Used to hide internal matrix representation to user
+ */
+class MnUserCovariance {
+
+public:
+
+  MnUserCovariance() : fData(std::vector<double>()), fNRow(0) {}
+
+   // safe constructor using std::vector
+  MnUserCovariance(const std::vector<double>& data, unsigned int nrow) :
+    fData(data), fNRow(nrow) {
+    assert(data.size() == nrow*(nrow+1)/2);
+  }
+
+   // unsafe constructor using just a pointer
+  MnUserCovariance(const double * data, unsigned int nrow) :
+     fData(std::vector<double>(data,data+nrow*(nrow+1)/2)),
+     fNRow(nrow) {
+  }
+
+  MnUserCovariance(unsigned int n) :
+    fData(std::vector<double>(n*(n+1)/2, 0.)), fNRow(n) {}
+
+  ~MnUserCovariance() {}
+
+  MnUserCovariance(const MnUserCovariance& cov) : fData(cov.fData), fNRow(cov.fNRow) {}
+
+  MnUserCovariance& operator=(const MnUserCovariance& cov) {
+    if(this != &cov) {
+      fData = cov.fData;
+      fNRow = cov.fNRow;
+    }
+    return *this;
+  }
+
+  double operator()(unsigned int row, unsigned int col) const {
+    assert(row < fNRow && col < fNRow);
+    if(row > col)
+      return fData[col+row*(row+1)/2];
+    else
+      return fData[row+col*(col+1)/2];
+  }
+
+  double& operator()(unsigned int row, unsigned int col) {
+    assert(row < fNRow && col < fNRow);
+    if(row > col)
+      return fData[col+row*(row+1)/2];
+    else
+      return fData[row+col*(col+1)/2];
+  }
+
+  void Scale(double f) {
+    for(unsigned int i = 0; i < fData.size(); i++) fData[i] *= f;
+  }
+
+  const std::vector<double>& Data() const {return fData;}
+
+  unsigned int Nrow() const {return fNRow;}
+
+// VC 7.1 warning: conversion from size_t to unsigned int
+  unsigned int size() const
+  { return static_cast < unsigned int > ( fData.size() );
+  }
+
+private:
+
+  std::vector<double> fData;
+  unsigned int fNRow;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnUserCovariance
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserFcn.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserFcn.h
new file mode 100644
index 0000000..9f5be88
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserFcn.h
@@ -0,0 +1,46 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnUserFcn
+#define ROOT_Minuit2_MnUserFcn
+
+#include "Minuit2/MnFcn.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnUserTransformation;
+
+ /**
+    Wrapper used by Minuit of FCN interface
+    containing a reference to the transformation object
+  */
+class MnUserFcn : public MnFcn {
+
+public:
+
+   MnUserFcn(const FCNBase& fcn, const MnUserTransformation& trafo, int ncall = 0) :
+      MnFcn(fcn,ncall), fTransform(trafo) {}
+
+  ~MnUserFcn() {}
+
+  virtual double operator()(const MnAlgebraicVector&) const;
+
+private:
+
+  const MnUserTransformation& fTransform;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnUserFcn
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserParameterState.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserParameterState.h
new file mode 100644
index 0000000..e5342e3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserParameterState.h
@@ -0,0 +1,196 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnUserParameterState
+#define ROOT_Minuit2_MnUserParameterState
+
+#include "Minuit2/MnUserParameters.h"
+#include "Minuit2/MnUserCovariance.h"
+#include "Minuit2/MnGlobalCorrelationCoeff.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumState;
+
+//_____________________________________________________________________________
+/**
+    class which holds the external user and/or internal Minuit representation
+    of the parameters and errors;
+    transformation internal <-> external on demand;
+ */
+
+class MnUserParameterState {
+
+public:
+
+   /// default constructor (invalid state)
+   MnUserParameterState() : fValid(false), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0), fEDM(0), fNFcn(0),
+                            fParameters(MnUserParameters()), fCovariance(MnUserCovariance()),
+                            fIntParameters(std::vector<double>()), fIntCovariance(MnUserCovariance()) {}
+
+   /// construct from user parameters (before minimization)
+   MnUserParameterState(const std::vector<double>&, const std::vector<double>&);
+
+   MnUserParameterState(const MnUserParameters&);
+
+   /// construct from user parameters + covariance (before minimization)
+   MnUserParameterState(const std::vector<double>&, const std::vector<double>&, unsigned int);
+
+   MnUserParameterState(const std::vector<double>&, const MnUserCovariance&);
+
+   MnUserParameterState(const MnUserParameters&, const MnUserCovariance&);
+
+   /// construct from internal parameters (after minimization)
+   MnUserParameterState(const MinimumState&, double, const MnUserTransformation&);
+
+   ~MnUserParameterState() {}
+
+   MnUserParameterState(const MnUserParameterState& state) : fValid(state.fValid),
+                                                             fCovarianceValid(state.fCovarianceValid), fGCCValid(state.fGCCValid), fCovStatus(state.fCovStatus),
+                                                             fFVal(state.fFVal), fEDM(state.fEDM), fNFcn(state.fNFcn),
+                                                             fParameters(state.fParameters),
+                                                             fCovariance(state.fCovariance),
+                                                             fGlobalCC(state.fGlobalCC), fIntParameters(state.fIntParameters), fIntCovariance(state.fIntCovariance) {}
+
+   MnUserParameterState& operator=(const MnUserParameterState& state) {
+      if(this != &state) {
+         fValid = state.fValid;
+         fCovarianceValid = state.fCovarianceValid;
+         fGCCValid = state.fGCCValid;
+         fCovStatus = state.fCovStatus;
+         fFVal = state.fFVal;
+         fEDM = state.fEDM;
+         fNFcn = state.fNFcn;
+         fParameters = state.fParameters;
+         fCovariance = state.fCovariance;
+         fGlobalCC = state.fGlobalCC;
+         fIntParameters = state.fIntParameters;
+         fIntCovariance = state.fIntCovariance;
+      }
+      return *this;
+   }
+
+   //user external representation
+   const MnUserParameters& Parameters() const {return fParameters;}
+   const MnUserCovariance& Covariance() const {return fCovariance;}
+   const MnGlobalCorrelationCoeff& GlobalCC() const {return fGlobalCC;}
+
+   // hessian (inverse of covariance matrix)
+   MnUserCovariance Hessian() const;
+
+   //Minuit internal representation
+   const std::vector<double>& IntParameters() const {return fIntParameters;}
+   const MnUserCovariance& IntCovariance() const {return fIntCovariance;}
+
+   // covariance matrix status (0 = not valid, 1 approximate, 2, full but made pos def, 3 accurate and not pos def
+   int CovarianceStatus() const { return fCovStatus; }
+
+   //transformation internal <-> external
+   const MnUserTransformation& Trafo() const {return fParameters.Trafo();}
+
+   bool IsValid() const {return fValid;}
+   bool HasCovariance() const {return fCovarianceValid;}
+   bool HasGlobalCC() const {return fGCCValid;}
+
+   double Fval() const {return fFVal;}
+   double Edm() const {return fEDM;}
+   unsigned int NFcn() const {return fNFcn;}
+
+
+public:
+
+   /** facade: forward interface of MnUserParameters and MnUserTransformation */
+
+   //access to parameters (row-wise)
+   const std::vector<BA_ROOT::Minuit2::MinuitParameter>& MinuitParameters() const;
+   //access to parameters and errors in column-wise representation
+   std::vector<double> Params() const;
+   std::vector<double> Errors() const;
+
+   //access to single Parameter
+   const MinuitParameter& Parameter(unsigned int i) const;
+
+   //add free Parameter
+   void Add(const std::string & name, double val, double err);
+   //add limited Parameter
+   void Add(const std::string & name, double val, double err, double , double);
+   //add const Parameter
+   void Add(const std::string &, double);
+
+   //interaction via external number of Parameter
+   void Fix(unsigned int);
+   void Release(unsigned int);
+   void RemoveLimits(unsigned int);
+   void SetValue(unsigned int, double);
+   void SetError(unsigned int, double);
+   void SetLimits(unsigned int, double, double);
+   void SetUpperLimit(unsigned int, double);
+   void SetLowerLimit(unsigned int, double);
+   void SetName(unsigned int iext, const std::string &name) { fParameters.SetName(iext,name); }
+
+   double Value(unsigned int) const;
+   double Error(unsigned int) const;
+
+   //interaction via Name of Parameter
+   void Fix(const std::string &);
+   void Release(const std::string &);
+   void SetValue(const std::string &, double);
+   void SetError(const std::string &, double);
+   void SetLimits(const std::string &, double, double);
+   void SetUpperLimit(const std::string &, double);
+   void SetLowerLimit(const std::string &, double);
+   void RemoveLimits(const std::string &);
+
+   double Value(const std::string &) const;
+   double Error(const std::string &) const;
+
+   //convert Name into external number of Parameter
+   unsigned int Index(const std::string &) const;
+   //convert external number into Name of Parameter
+   const std::string & GetName(unsigned int) const;
+   // mantain interface with const char * for backward compatibility
+   const char* Name(unsigned int) const;
+
+   // transformation internal <-> external
+   double Int2ext(unsigned int, double) const;
+   double Ext2int(unsigned int, double) const;
+   unsigned int IntOfExt(unsigned int) const;
+   unsigned int ExtOfInt(unsigned int) const;
+   unsigned int VariableParameters() const;
+   const MnMachinePrecision& Precision() const;
+   void SetPrecision(double eps);
+
+
+private:
+
+   bool fValid;
+   bool fCovarianceValid;
+   bool fGCCValid;
+   int  fCovStatus; // covariance matrix status
+   double fFVal;
+   double fEDM;
+   unsigned int fNFcn;
+
+   MnUserParameters fParameters;
+   MnUserCovariance fCovariance;
+   MnGlobalCorrelationCoeff fGlobalCC;
+
+   std::vector<double> fIntParameters;
+   MnUserCovariance fIntCovariance;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnUserParameterState
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserParameters.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserParameters.h
new file mode 100644
index 0000000..b042e86
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserParameters.h
@@ -0,0 +1,124 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnUserParameters
+#define ROOT_Minuit2_MnUserParameters
+
+#include "Minuit2/MnUserTransformation.h"
+
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnMachinePrecision;
+
+/** API class for the user interaction with the parameters;
+    serves as input to the minimizer as well as output from it;
+    users can interact: Fix/release parameters, set values and errors, etc.;
+    parameters can be accessed via their Parameter number (determined
+    internally by Minuit and followed the order how the parameters are created)
+    or via their user-specified Name (10 character string).
+    Minuit has also an internal parameter number which is used during the minimization
+    (the fix parameter are skipped). The parameter number used in this class is the external
+    one. The class ROOT::Minuit2::MnUserTransformation is used to keep the
+    internal <-> external transformation
+ */
+
+class MnUserParameters {
+
+public:
+
+   MnUserParameters() : fTransformation(MnUserTransformation()) {}
+
+   MnUserParameters(const std::vector<double>&, const std::vector<double>&);
+
+   ~MnUserParameters() {}
+
+   MnUserParameters(const MnUserParameters& par) :
+      fTransformation(par.fTransformation) {}
+
+   MnUserParameters& operator=(const MnUserParameters& par) {
+      fTransformation = par.fTransformation;
+      return *this;
+   }
+
+   const MnUserTransformation& Trafo() const {return fTransformation;}
+
+   unsigned int VariableParameters() const {
+      return fTransformation.VariableParameters();
+   }
+
+   /// access to parameters (row-wise)
+   const std::vector<BA_ROOT::Minuit2::MinuitParameter>& Parameters() const;
+
+   /// access to parameters and errors in column-wise representation
+   std::vector<double> Params() const;
+   std::vector<double> Errors() const;
+
+   /// access to single Parameter
+   const MinuitParameter& Parameter(unsigned int) const;
+
+   /// Add free Parameter Name, Value, Error
+   bool Add(const std::string &, double, double);
+   /// Add limited Parameter Name, Value, Lower bound, Upper bound
+   bool Add(const std::string &, double, double, double, double);
+   /// Add const Parameter Name, vale
+   bool Add(const std::string &, double);
+
+   /// interaction via external number of Parameter
+   void Fix(unsigned int);
+   void Release(unsigned int);
+   void RemoveLimits(unsigned int);
+   void SetValue(unsigned int, double);
+   void SetError(unsigned int, double);
+   void SetLimits(unsigned int, double, double);
+   void SetUpperLimit(unsigned int, double);
+   void SetLowerLimit(unsigned int, double);
+   void SetName(unsigned int, const std::string &);
+
+   double Value(unsigned int) const;
+   double Error(unsigned int) const;
+
+   /// interaction via Name of Parameter
+   void Fix(const std::string &);
+   void Release(const std::string &);
+   void SetValue(const std::string &, double);
+   void SetError(const std::string &, double);
+   void SetLimits(const std::string &, double, double);
+   void SetUpperLimit(const std::string &, double);
+   void SetLowerLimit(const std::string &, double);
+   void RemoveLimits(const std::string &);
+
+   double Value(const std::string &) const;
+   double Error(const std::string &) const;
+
+   //convert Name into external number of Parameter
+   unsigned int Index(const std::string &) const;
+   //convert external number into Name of Parameter
+   const std::string & GetName(unsigned int) const;
+   // mantain interface with const char * for backward compatibility
+   const char* Name(unsigned int) const;
+
+   const MnMachinePrecision& Precision() const;
+   void SetPrecision(double eps) {fTransformation.SetPrecision(eps);}
+
+private:
+
+   MnUserTransformation fTransformation;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnUserParameters
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserTransformation.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserTransformation.h
new file mode 100644
index 0000000..8453575
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnUserTransformation.h
@@ -0,0 +1,211 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnUserTransformation
+#define ROOT_Minuit2_MnUserTransformation
+
+#ifndef ROOT_Minuit2_MnConfig
+#include "Minuit2/MnConfig.h"
+#endif
+#ifndef ROOT_Minuit2_MnMatrix
+#include "Minuit2/MnMatrix.h"
+#endif
+#ifndef ROOT_Minuit2_MinuitParameter
+#include "Minuit2/MinuitParameter.h"
+#endif
+#ifndef ROOT_Minuit2_MnMachinePrecision
+#include "Minuit2/MnMachinePrecision.h"
+#endif
+#ifndef ROOT_Minuit2_SinParameterTransformation
+#include "Minuit2/SinParameterTransformation.h"
+#endif
+#ifndef ROOT_Minuit2_SqrtLowParameterTransformation
+#include "Minuit2/SqrtLowParameterTransformation.h"
+#endif
+#ifndef ROOT_Minuit2_SqrtUpParameterTransformation
+#include "Minuit2/SqrtUpParameterTransformation.h"
+#endif
+
+#include <vector>
+#include <cassert>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnUserCovariance;
+
+// class MnMachinePrecision;
+
+/**
+    class dealing with the transformation  between user specified parameters (external) and
+    internal parameters used for minimization
+ */
+
+class MnUserTransformation {
+
+public:
+
+   MnUserTransformation() : fPrecision(MnMachinePrecision()),
+                            fParameters(std::vector<MinuitParameter>()),
+                            fExtOfInt(std::vector<unsigned int>()),
+                            fDoubleLimTrafo(SinParameterTransformation()),
+                            fUpperLimTrafo(SqrtUpParameterTransformation()),
+                            fLowerLimTrafo(SqrtLowParameterTransformation()),
+                            fCache(std::vector<double>()) {}
+
+   MnUserTransformation(const std::vector<double>&, const std::vector<double>&);
+
+   ~MnUserTransformation() {}
+
+   MnUserTransformation(const MnUserTransformation& trafo) :
+      fPrecision(trafo.fPrecision),
+      fParameters(trafo.fParameters),fExtOfInt(trafo.fExtOfInt),
+      fDoubleLimTrafo(trafo.fDoubleLimTrafo),
+      fUpperLimTrafo(trafo.fUpperLimTrafo),
+      fLowerLimTrafo(trafo.fLowerLimTrafo), fCache(trafo.fCache) {}
+
+   MnUserTransformation& operator=(const MnUserTransformation& trafo) {
+      if(this != &trafo) {
+         fPrecision = trafo.fPrecision;
+         fParameters = trafo.fParameters;
+         fExtOfInt = trafo.fExtOfInt;
+         fDoubleLimTrafo = trafo.fDoubleLimTrafo;
+         fUpperLimTrafo = trafo.fUpperLimTrafo;
+         fLowerLimTrafo = trafo.fLowerLimTrafo;
+         fCache = trafo.fCache;
+      }
+      return *this;
+   }
+
+
+//#ifdef MINUIT2_THREAD_SAFE
+   // thread-safe version (do not use cache)
+  std::vector<double> operator()(const MnAlgebraicVector&) const;
+//#else // not thread safe
+//   const std::vector<double>& operator()(const MnAlgebraicVector&) const;
+//#endif
+
+   // Index = internal Parameter
+   double Int2ext(unsigned int, double) const;
+
+   // Index = internal Parameter
+   double Int2extError(unsigned int, double, double) const;
+
+   MnUserCovariance Int2extCovariance(const MnAlgebraicVector&, const MnAlgebraicSymMatrix&) const;
+
+   // Index = external Parameter
+   double Ext2int(unsigned int, double) const;
+
+   // Index = internal Parameter
+   double DInt2Ext(unsigned int, double) const;
+
+//   // Index = external Parameter
+//   double dExt2Int(unsigned int, double) const;
+
+   // Index = external Parameter
+   unsigned int IntOfExt(unsigned int) const;
+
+   // Index = internal Parameter
+   unsigned int ExtOfInt(unsigned int internal) const {
+      assert(internal < fExtOfInt.size());
+      return fExtOfInt[internal];
+   }
+
+   const std::vector<MinuitParameter>& Parameters() const {
+      return fParameters;
+   }
+
+   unsigned int VariableParameters() const {return static_cast<unsigned int> ( fExtOfInt.size() );}
+
+   // return initial parameter values (useful especially to get fixed parameter values)
+   const std::vector<double> & InitialParValues() const {
+      return fCache;
+   }
+
+
+   /** forwarded interface */
+
+   const MnMachinePrecision& Precision() const {return fPrecision;}
+   void SetPrecision(double eps) {fPrecision.SetPrecision(eps);}
+
+   /// access to parameters and errors in column-wise representation
+
+   std::vector<double> Params() const;
+   std::vector<double> Errors() const;
+
+   //access to single Parameter
+   const MinuitParameter& Parameter(unsigned int) const;
+
+   //add free Parameter
+   bool Add(const std::string &, double, double);
+   //add limited Parameter
+   bool Add(const std::string &, double, double, double, double);
+   //add const Parameter
+   bool Add(const std::string &, double);
+
+   //interaction via external number of Parameter
+   void Fix(unsigned int);
+   void Release(unsigned int);
+   void RemoveLimits(unsigned int);
+   void SetValue(unsigned int, double);
+   void SetError(unsigned int, double);
+   void SetLimits(unsigned int, double, double);
+   void SetUpperLimit(unsigned int, double);
+   void SetLowerLimit(unsigned int, double);
+   void SetName(unsigned int, const std::string &);
+
+   double Value(unsigned int) const;
+   double Error(unsigned int) const;
+
+   //interaction via Name of Parameter
+   void Fix(const std::string &);
+   void Release(const std::string &);
+   void SetValue(const std::string &, double);
+   void SetError(const std::string &, double);
+   void SetLimits(const std::string &, double, double);
+   void SetUpperLimit(const std::string &, double);
+   void SetLowerLimit(const std::string &, double);
+   void RemoveLimits(const std::string &);
+
+   double Value(const std::string &) const;
+   double Error(const std::string &) const;
+
+   //convert Name into external number of Parameter (will assert if parameter  is not found)
+   unsigned int Index(const std::string &) const;
+   // find parameter index given a name. If it is not found return a -1
+   int FindIndex(const std::string & ) const;
+
+   //convert external number into Name of Parameter (will assert if index is out of range)
+   const std::string & GetName(unsigned int) const;
+   // mantain interface with const char * for backward compatibility
+   const char* Name(unsigned int) const;
+
+private:
+
+   MnMachinePrecision fPrecision;
+
+   std::vector<MinuitParameter> fParameters;
+   std::vector<unsigned int> fExtOfInt;
+
+   SinParameterTransformation fDoubleLimTrafo;
+   SqrtUpParameterTransformation fUpperLimTrafo;
+   SqrtLowParameterTransformation fLowerLimTrafo;
+
+   mutable std::vector<double> fCache;
+
+
+};
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnUserTransformation
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnVectorTransform.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnVectorTransform.h
new file mode 100644
index 0000000..65d1c70
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/MnVectorTransform.h
@@ -0,0 +1,43 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_MnVectorTransform
+#define ROOT_Minuit2_MnVectorTransform
+
+#include "Minuit2/MnMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnVectorTransform {
+
+public:
+
+  MnVectorTransform() {}
+
+  ~MnVectorTransform() {}
+
+  std::vector<double> operator()(const MnAlgebraicVector& avec) const {
+
+    std::vector<double> result; result.reserve(avec.size());
+
+    for(unsigned int i = 0; i < avec.size(); i++) result.push_back(avec(i));
+
+    return result;
+  }
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_MnVectorTransform
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ModularFunctionMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ModularFunctionMinimizer.h
new file mode 100644
index 0000000..a069172
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ModularFunctionMinimizer.h
@@ -0,0 +1,100 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ModularFunctionMinimizer
+#define ROOT_Minuit2_ModularFunctionMinimizer
+
+
+#ifndef ROOT_Minuit2_MnConfig
+#include "Minuit2/MnConfig.h"
+#endif
+
+#ifndef ROOT_Minuit2_FunctionMinimizer
+#include "Minuit2/FunctionMinimizer.h"
+#endif
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+class MinimumSeedGenerator;
+class MinimumBuilder;
+class MinimumSeed;
+class MnFcn;
+class GradientCalculator;
+class MnUserParameterState;
+class MnUserParameters;
+class MnUserCovariance;
+class MnStrategy;
+class FumiliFCNBase;
+
+//_____________________________________________________________
+/**
+   Base common class providing the API for all the minimizer
+   Various Minimize methods are provided varying on the type of
+   FCN function passesd and on the objects used for the parameters
+ */
+class ModularFunctionMinimizer : public FunctionMinimizer {
+
+public:
+
+   virtual ~ModularFunctionMinimizer() {}
+
+// inherited interface
+   virtual FunctionMinimum Minimize(const FCNBase&, const std::vector<double>&, const std::vector<double>&, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const std::vector<double>&, const std::vector<double>&, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNBase&, const std::vector<double>&, unsigned int, const std::vector<double>&, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const std::vector<double>&, unsigned int, const std::vector<double>&, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+// extension
+   virtual FunctionMinimum Minimize(const FCNBase&, const MnUserParameters&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const MnUserParameters&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNBase&, const MnUserParameters&, const MnUserCovariance&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const MnUserParameters&, const MnUserCovariance&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNBase&, const MnUserParameterState&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   virtual FunctionMinimum Minimize(const FCNGradientBase&, const MnUserParameterState&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+   // for Fumili
+
+//   virtual FunctionMinimum Minimize(const FumiliFCNBase&, const std::vector<double>&, const std::vector<double>&, unsigned int stra=1, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+//   virtual FunctionMinimum Minimize(const FumiliFCNBase&, const MnUserParameters&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+//   virtual FunctionMinimum Minimize(const FumiliFCNBase&, const MnUserParameters&, const MnUserCovariance&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+//   virtual FunctionMinimum Minimize(const FumiliFCNBase&, const MnUserParameterState&, const MnStrategy&, unsigned int maxfcn = 0, double toler = 0.1) const;
+
+
+   virtual const MinimumSeedGenerator& SeedGenerator() const = 0;
+   virtual const MinimumBuilder& Builder() const = 0;
+   virtual MinimumBuilder& Builder()  = 0;
+
+public:
+
+   virtual FunctionMinimum Minimize(const MnFcn&, const GradientCalculator&, const MinimumSeed&, const MnStrategy&, unsigned int, double) const;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ModularFunctionMinimizer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/NegativeG2LineSearch.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/NegativeG2LineSearch.h
new file mode 100644
index 0000000..cdc7aa0
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/NegativeG2LineSearch.h
@@ -0,0 +1,50 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_NegativeG2LineSearch
+#define ROOT_Minuit2_NegativeG2LineSearch
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnFcn;
+class MinimumState;
+class GradientCalculator;
+class MnMachinePrecision;
+class FunctionGradient;
+
+/** In case that one of the components of the second derivative g2 calculated
+    by the numerical Gradient calculator is negative, a 1dim line search in
+    the direction of that component is done in order to find a better position
+    where g2 is again positive.
+ */
+
+class NegativeG2LineSearch {
+
+public:
+
+  NegativeG2LineSearch() {}
+
+  ~NegativeG2LineSearch() {}
+
+  MinimumState operator()(const MnFcn&, const MinimumState&, const  GradientCalculator&, const MnMachinePrecision&) const;
+
+  bool HasNegativeG2(const FunctionGradient&, const MnMachinePrecision&) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_NegativeG2LineSearch
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/Numerical2PGradientCalculator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/Numerical2PGradientCalculator.h
new file mode 100644
index 0000000..050353e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/Numerical2PGradientCalculator.h
@@ -0,0 +1,81 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_Numerical2PGradientCalculator
+#define ROOT_Minuit2_Numerical2PGradientCalculator
+
+#ifndef ROOT_Minuit2_MnConfig
+#include "Minuit2/MnConfig.h"
+#endif
+
+#ifndef ROOT_Minuit2_GradientCalculator
+#include "Minuit2/GradientCalculator.h"
+#endif
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnFcn;
+class MnUserTransformation;
+class MnMachinePrecision;
+class MnStrategy;
+
+/**
+   class performing the numerical gradient calculation
+ */
+
+class Numerical2PGradientCalculator : public GradientCalculator {
+
+public:
+
+  Numerical2PGradientCalculator(const MnFcn& fcn,
+                                const MnUserTransformation& par,
+                                const MnStrategy& stra) :
+    fFcn(fcn), fTransformation(par), fStrategy(stra) {}
+
+  virtual ~Numerical2PGradientCalculator() {}
+
+  virtual FunctionGradient operator()(const MinimumParameters&) const;
+
+
+
+
+  virtual FunctionGradient operator()(const std::vector<double>& params) const;
+
+
+
+
+  virtual FunctionGradient operator()(const MinimumParameters&,
+                                      const FunctionGradient&) const;
+
+  const MnFcn& Fcn() const {return fFcn;}
+  const MnUserTransformation& Trafo() const {return fTransformation;}
+  const MnMachinePrecision& Precision() const;
+  const MnStrategy& Strategy() const {return fStrategy;}
+
+  unsigned int Ncycle() const;
+  double StepTolerance() const;
+  double GradTolerance() const;
+
+private:
+
+  const MnFcn& fFcn;
+  const MnUserTransformation& fTransformation;
+  const MnStrategy& fStrategy;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_Numerical2PGradientCalculator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ParametricFunction.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ParametricFunction.h
new file mode 100644
index 0000000..71dfb0d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ParametricFunction.h
@@ -0,0 +1,199 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ParametricFunction
+#define ROOT_Minuit2_ParametricFunction
+
+#include "Minuit2/MnConfig.h"
+#include <vector>
+#include <cassert>
+
+#include "Minuit2/FCNBase.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+/**
+
+Function which has parameters. For example, one could define
+a one-dimensional Gaussian, by considering x as an input coordinate
+for the evaluation of the function, and the mean and the square root
+of the variance as parameters.
+<p>
+AS OF NOW PARAMETRICFUNCTION INHERITS FROM FCNBASE INSTEAD OF
+GENERICFUNCTION. THIS IS ONLY BECAUSE NUMERICAL2PGRADIENTCALCULATOR
+NEEDS AN FCNBASE OBJECT AND WILL BE CHANGED!!!!!!!!!!!!!!!!
+
+ at ingroup Minuit
+
+\todo ParametricFunction and all the classes that inherit from it
+are inheriting also FCNBase so that the Gradient calculation has
+the Up() member function. That is not really good...
+
+
+ */
+
+class ParametricFunction : public FCNBase {
+
+public:
+
+
+  /**
+
+  Constructor which initializes the ParametricFunction with the
+  parameters given as input.
+
+  @param params vector containing the initial Parameter values
+
+  */
+
+  ParametricFunction(const std::vector<double>& params) : par(params) {}
+
+
+
+  /**
+
+  Constructor which initializes the ParametricFunction by setting
+  the number of parameters.
+
+  @param nparams number of parameters of the parametric function
+
+  */
+
+  ParametricFunction(int nparams) : par(nparams) {}
+
+
+
+  virtual ~ParametricFunction() {}
+
+
+
+  /**
+
+  Sets the parameters of the ParametricFunction.
+
+  @param params vector containing the Parameter values
+
+  */
+
+  virtual void SetParameters(const std::vector<double>& params) const {
+
+    assert(params.size() == par.size());
+    par = params;
+
+  }
+
+
+
+  /**
+
+  Accessor for the state of the parameters.
+
+  @return vector containing the present Parameter settings
+
+  */
+
+  virtual const std::vector<double> & GetParameters() const { return par; }
+
+
+
+
+  /**
+
+  Accessor for the number of  parameters.
+
+  @return the number of function parameters
+
+  */
+  virtual unsigned int  NumberOfParameters() const { return par.size(); }
+
+  // Why do I need to declare it here, it should be inherited without
+  // any problems, no?
+
+  /**
+
+  Evaluates the function with the given coordinates.
+
+  @param x vector containing the input coordinates
+
+  @return the result of the function evaluation with the given
+  coordinates.
+
+  */
+
+  virtual double operator()(const std::vector<double>& x) const=0;
+
+
+
+  /**
+
+  Evaluates the function with the given coordinates and Parameter
+  values. This member function is useful to implement when speed
+  is an issue as it is faster to call only one function instead
+  of two (SetParameters and operator()). The default implementation,
+  provided for convenience, does the latter.
+
+  @param x vector containing the input coordinates
+
+  @param params vector containing the Parameter values
+
+  @return the result of the function evaluation with the given
+  coordinates and parameters
+
+  */
+
+  virtual double operator()(const std::vector<double>& x, const std::vector<double>& params) const {
+    SetParameters(params);
+    return operator()(x);
+
+  }
+
+
+  /**
+
+  Member function returning the Gradient of the function with respect
+  to its variables (but without including gradients with respect to
+  its internal parameters).
+
+  @param x vector containing the coordinates of the point where the
+  Gradient is to be calculated.
+
+  @return the Gradient vector of the function at the given point.
+
+  */
+
+  virtual std::vector<double>  GetGradient(const std::vector<double>& x) const;
+
+
+
+
+ protected:
+
+  /**
+
+  The vector containing the parameters of the function
+  It is mutable for "historical reasons" as in the hierarchy
+  methods and classes are const and all the implications of changing
+  them back to non-const are not clear.
+
+  */
+
+
+  mutable std::vector<double> par;
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ParametricFunction
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ScanBuilder.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ScanBuilder.h
new file mode 100644
index 0000000..de7e0a5
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ScanBuilder.h
@@ -0,0 +1,46 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ScanBuilder
+#define ROOT_Minuit2_ScanBuilder
+
+#include "Minuit2/MinimumBuilder.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FunctionMinimum;
+class MnFcn;
+class MinimumSeed;
+
+/** Performs a minimization using the simplex method of Nelder and Mead
+    (ref. Comp. J. 7, 308 (1965)).
+ */
+
+class ScanBuilder : public MinimumBuilder {
+
+public:
+
+  ScanBuilder() {}
+
+  ~ScanBuilder() {}
+
+  virtual FunctionMinimum Minimum(const MnFcn&, const GradientCalculator&, const MinimumSeed&, const MnStrategy&, unsigned int, double) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ScanBuilder
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ScanMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ScanMinimizer.h
new file mode 100644
index 0000000..dc2ba01
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/ScanMinimizer.h
@@ -0,0 +1,53 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_ScanMinimizer
+#define ROOT_Minuit2_ScanMinimizer
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/ModularFunctionMinimizer.h"
+#include "Minuit2/ScanBuilder.h"
+#include "Minuit2/SimplexSeedGenerator.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//_____________________________________________________________
+/**
+   Class implementing the required methods for a minimization using SCAN
+   API is provided in the upper ROOT::Minuit2::ModularFunctionMinimizer class
+ */
+
+class ScanMinimizer : public ModularFunctionMinimizer {
+
+public:
+
+   ScanMinimizer() : fSeedGenerator(SimplexSeedGenerator()),
+                     fBuilder(ScanBuilder()) {}
+
+   ~ScanMinimizer() {}
+
+   const MinimumSeedGenerator& SeedGenerator() const {return fSeedGenerator;}
+   const MinimumBuilder& Builder() const {return fBuilder;}
+   MinimumBuilder& Builder()  {return fBuilder;}
+
+private:
+
+   SimplexSeedGenerator fSeedGenerator;
+   ScanBuilder fBuilder;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_ScanMinimizer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexBuilder.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexBuilder.h
new file mode 100644
index 0000000..89c94b9
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexBuilder.h
@@ -0,0 +1,48 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_SimplexBuilder
+#define ROOT_Minuit2_SimplexBuilder
+
+#ifndef ROOT_Minuit2_MinimumBuilder
+#include "Minuit2/MinimumBuilder.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FunctionMinimum;
+class MnFcn;
+class MinimumSeed;
+
+/** Performs a minimization using the simplex method of Nelder and Mead
+    (ref. Comp. J. 7, 308 (1965)).
+ */
+
+class SimplexBuilder : public MinimumBuilder {
+
+public:
+
+  SimplexBuilder() {}
+
+  ~SimplexBuilder() {}
+
+  virtual FunctionMinimum Minimum(const MnFcn&, const GradientCalculator&, const MinimumSeed&, const MnStrategy&, unsigned int, double) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_SimplexBuilder
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexMinimizer.h
new file mode 100644
index 0000000..0d59e31
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexMinimizer.h
@@ -0,0 +1,53 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_SimplexMinimizer
+#define ROOT_Minuit2_SimplexMinimizer
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/ModularFunctionMinimizer.h"
+#include "Minuit2/SimplexBuilder.h"
+#include "Minuit2/SimplexSeedGenerator.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//_____________________________________________________________
+/**
+   Class implementing the required methods for a minimization using Simplex.
+   API is provided in the upper ROOT::Minuit2::ModularFunctionMinimizer class
+ */
+
+class SimplexMinimizer : public ModularFunctionMinimizer {
+
+public:
+
+   SimplexMinimizer() : fSeedGenerator(SimplexSeedGenerator()),
+                        fBuilder(SimplexBuilder()) {}
+
+   ~SimplexMinimizer() {}
+
+   const MinimumSeedGenerator& SeedGenerator() const {return fSeedGenerator;}
+   const MinimumBuilder& Builder() const {return fBuilder;}
+   MinimumBuilder& Builder()  {return fBuilder;}
+
+private:
+
+   SimplexSeedGenerator fSeedGenerator;
+   SimplexBuilder fBuilder;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_SimplexMinimizer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexParameters.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexParameters.h
new file mode 100644
index 0000000..542a808
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexParameters.h
@@ -0,0 +1,64 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_SimplexParameters
+#define ROOT_Minuit2_SimplexParameters
+
+#include <cassert>
+
+#include "Minuit2/MnMatrix.h"
+
+#include <vector>
+#include <utility>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+/**
+   class describing the simplex set of points (f(x), x )  which evolve during the minimization
+   iteration process.
+ */
+
+class SimplexParameters {
+
+public:
+
+  SimplexParameters(const std::vector<std::pair<double, MnAlgebraicVector> >& simpl, unsigned int jh, unsigned int jl) : fSimplexParameters(simpl), fJHigh(jh), fJLow(jl) {}
+
+  ~SimplexParameters() {}
+
+  void Update(double, const MnAlgebraicVector&);
+
+  const std::vector<std::pair<double, MnAlgebraicVector> >& Simplex() const {
+    return fSimplexParameters;
+  }
+
+  const std::pair<double, MnAlgebraicVector>& operator()(unsigned int i) const {
+    assert(i < fSimplexParameters.size());
+    return fSimplexParameters[i];
+  }
+
+  unsigned int Jh() const {return fJHigh;}
+  unsigned int Jl() const {return fJLow;}
+  double Edm() const {return fSimplexParameters[Jh()].first - fSimplexParameters[Jl()].first;}
+  MnAlgebraicVector Dirin() const;
+
+private:
+
+  std::vector<std::pair<double, MnAlgebraicVector> > fSimplexParameters;
+  unsigned int fJHigh;
+  unsigned int fJLow;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_SimplexParameters
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexSeedGenerator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexSeedGenerator.h
new file mode 100644
index 0000000..5193c12
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SimplexSeedGenerator.h
@@ -0,0 +1,48 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_SimplexSeedGenerator
+#define ROOT_Minuit2_SimplexSeedGenerator
+
+#include "Minuit2/MinimumSeedGenerator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MinimumSeed;
+class MnFcn;
+class MnUserParameterState;
+class MnStrategy;
+
+/**
+   generate Simplex starting point (state)
+ */
+class SimplexSeedGenerator : public MinimumSeedGenerator {
+
+public:
+
+  SimplexSeedGenerator() {}
+
+  ~SimplexSeedGenerator() {}
+
+  virtual MinimumSeed operator()(const MnFcn&, const GradientCalculator&, const MnUserParameterState&, const MnStrategy&) const;
+
+  virtual MinimumSeed operator()(const MnFcn&, const AnalyticalGradientCalculator&, const MnUserParameterState&, const MnStrategy&) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_SimplexSeedGenerator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SinParameterTransformation.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SinParameterTransformation.h
new file mode 100644
index 0000000..c49d748
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SinParameterTransformation.h
@@ -0,0 +1,46 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_SinParameterTransformation
+#define ROOT_Minuit2_SinParameterTransformation
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnMachinePrecision;
+
+/**
+   class for the transformation for double-limited parameter
+   Using a sin function one goes from a double-limited parameter range to
+   an unlimited one
+ */
+class SinParameterTransformation {
+
+public:
+
+  SinParameterTransformation() {}
+
+  ~SinParameterTransformation() {}
+
+  double Int2ext(double Value, double Upper, double Lower) const;
+  double Ext2int(double Value, double Upper, double Lower,
+                 const MnMachinePrecision&) const;
+  double DInt2Ext(double Value, double Upper, double Lower) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_SinParameterTransformation
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SqrtLowParameterTransformation.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SqrtLowParameterTransformation.h
new file mode 100644
index 0000000..065ea6e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SqrtLowParameterTransformation.h
@@ -0,0 +1,56 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+// Project   : LCG
+// Package   : Minuit
+// Author    : Lorenzo.MONETA at cern.ch
+// Created by: moneta  at Thu Apr  8 10:26:22 2004
+
+
+#ifndef ROOT_Minuit2_SqrtLowParameterTransformation
+#define ROOT_Minuit2_SqrtLowParameterTransformation
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+class MnMachinePrecision;
+
+
+/**
+ * Transformation from external to internal Parameter based on  sqrt(1 + x**2)
+ *
+ * This transformation applies for the case of single side Lower Parameter limits
+ */
+
+class SqrtLowParameterTransformation /* : public ParameterTransformation */ {
+
+public:
+
+  SqrtLowParameterTransformation() {}
+
+  ~SqrtLowParameterTransformation() {}
+
+  // transformation from internal to external
+  double Int2ext(double Value, double Lower) const;
+
+  // transformation from external to internal
+  double Ext2int(double Value, double Lower, const MnMachinePrecision&) const;
+
+  // derivative of transformation from internal to external
+  double DInt2Ext(double Value, double Lower) const;
+
+private:
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SqrtUpParameterTransformation.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SqrtUpParameterTransformation.h
new file mode 100644
index 0000000..ad8cc9f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/SqrtUpParameterTransformation.h
@@ -0,0 +1,60 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+// Project   : LCG
+// Package   : Minuit
+// Author    : Lorenzo.MONETA at cern.ch
+// Created by: moneta  at Thu Apr  8 10:26:22 2004
+
+
+#ifndef ROOT_Minuit2_SqrtUpParameterTransformation
+#define ROOT_Minuit2_SqrtUpParameterTransformation
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnMachinePrecision;
+
+
+/**
+ * Transformation from external to internal Parameter based on  sqrt(1 + x**2)
+ *
+ * This transformation applies for the case of single side Upper Parameter limits
+ */
+
+class SqrtUpParameterTransformation /* : public ParameterTransformation */ {
+
+public:
+
+  // create with user defined precision
+  SqrtUpParameterTransformation() {}
+
+  ~SqrtUpParameterTransformation() {}
+
+  // transformation from internal to external
+  double Int2ext(double Value, double Upper) const;
+
+  // transformation from external to internal
+  double Ext2int(double Value, double Upper, const MnMachinePrecision&) const;
+
+  // derivative of transformation from internal to external
+  double DInt2Ext(double Value, double Upper) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/StackAllocator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/StackAllocator.h
new file mode 100644
index 0000000..9c5e404
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/StackAllocator.h
@@ -0,0 +1,236 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_StackAllocator
+#define ROOT_Minuit2_StackAllocator
+
+#include "Minuit2/MnConfig.h"
+
+// comment out this line and recompile if you want to gain additional
+// performance (the gain is mainly for "simple" functions which are easy
+// to calculate and vanishes quickly if going to cost-intensive functions)
+// the library is no longer thread save however
+
+#ifdef MN_USE_STACK_ALLOC
+#define _MN_NO_THREAD_SAVE_
+#endif
+
+//#include <iostream>
+
+
+
+#include <cstdlib>
+#include <new>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+/// define stack allocator symbol
+
+
+
+class StackOverflow {};
+class StackError {};
+//  using namespace std;
+
+/** StackAllocator controls the memory allocation/deallocation of Minuit. If
+    _MN_NO_THREAD_SAVE_ is defined, memory is taken from a pre-allocated piece
+    of heap memory which is then used like a stack, otherwise via standard
+    malloc/free. Note that defining _MN_NO_THREAD_SAVE_ makes the code thread-
+    unsave. The gain in performance is mainly for cost-cheap FCN functions.
+ */
+
+class StackAllocator {
+
+public:
+
+//   enum {default_size = 1048576};
+  enum {default_size = 524288};
+
+   StackAllocator() :   fStack(0)  {
+#ifdef _MN_NO_THREAD_SAVE_
+    //std::cout<<"StackAllocator Allocate "<<default_size<<std::endl;
+    fStack = new unsigned char[default_size];
+#endif
+    fStackOffset = 0;
+    fBlockCount = 0;
+  }
+
+  ~StackAllocator() {
+#ifdef _MN_NO_THREAD_SAVE_
+    //std::cout<<"StackAllocator destruct "<<fStackOffset<<std::endl;
+    if(fStack) delete [] fStack;
+#endif
+  }
+
+  void* Allocate( size_t nBytes) {
+#ifdef _MN_NO_THREAD_SAVE_
+    if(fStack == 0) fStack = new unsigned char[default_size];
+      int nAlloc = AlignedSize(nBytes);
+      CheckOverflow(nAlloc);
+
+//       std::cout << "Allocating " << nAlloc << " bytes, requested = " << nBytes << std::endl;
+
+      // write the start position of the next block at the start of the block
+      WriteInt( fStackOffset, fStackOffset+nAlloc);
+      // write the start position of the new block at the end of the block
+      WriteInt( fStackOffset + nAlloc - sizeof(int), fStackOffset);
+
+      void* result = fStack + fStackOffset + sizeof(int);
+      fStackOffset += nAlloc;
+      fBlockCount++;
+
+#ifdef DEBUG_ALLOCATOR
+      CheckConsistency();
+#endif
+
+#else
+      void* result = malloc(nBytes);
+      if (!result) throw std::bad_alloc();
+#endif
+
+      return result;
+  }
+
+  void Deallocate( void* p) {
+#ifdef _MN_NO_THREAD_SAVE_
+      // int previousOffset = ReadInt( fStackOffset - sizeof(int));
+      int delBlock = ToInt(p);
+      int nextBlock = ReadInt( delBlock);
+      int previousBlock = ReadInt( nextBlock - sizeof(int));
+      if ( nextBlock == fStackOffset) {
+          // deallocating last allocated
+         fStackOffset = previousBlock;
+      }
+      else {
+          // overwrite previous adr of next block
+         int nextNextBlock = ReadInt(nextBlock);
+         WriteInt( nextNextBlock - sizeof(int), previousBlock);
+         // overwrite head of deleted block
+         WriteInt( previousBlock, nextNextBlock);
+      }
+      fBlockCount--;
+
+#ifdef DEBUG_ALLOCATOR
+      CheckConsistency();
+#endif
+#else
+      free(p);
+#endif
+      // std::cout << "Block at " << delBlock
+      //   << " deallocated, fStackOffset = " << fStackOffset << std::endl;
+  }
+
+  int ReadInt( int offset) {
+      int* ip = (int*)(fStack+offset);
+
+      // std::cout << "read " << *ip << " from offset " << offset << std::endl;
+
+      return *ip;
+  }
+
+  void WriteInt( int offset, int Value) {
+
+      // std::cout << "writing " << Value << " to offset " << offset << std::endl;
+
+      int* ip = reinterpret_cast<int*>(fStack+offset);
+      *ip = Value;
+  }
+
+  int ToInt( void* p) {
+      unsigned char* pc = static_cast<unsigned char*>(p);
+
+     // std::cout << "toInt: p = " << p << " fStack = " << (void*) fStack << std::endl;
+     // VC 7.1 warning:conversin from __w64 int to int
+      int userBlock = pc - fStack;
+      return userBlock - sizeof(int); // correct for starting int
+  }
+
+  int AlignedSize( int nBytes) {
+      const int fAlignment = 4;
+      int needed = nBytes % fAlignment == 0 ? nBytes : (nBytes/fAlignment+1)*fAlignment;
+      return needed + 2*sizeof(int);
+  }
+
+  void CheckOverflow( int n) {
+      if (fStackOffset + n >= default_size) {
+         //std::cout << " no more space on stack allocator" << std::endl;
+         throw StackOverflow();
+      }
+  }
+
+  bool CheckConsistency() {
+
+    //std::cout << "checking consistency for " << fBlockCount << " blocks"<< std::endl;
+
+      // loop over all blocks
+      int beg = 0;
+      int end = fStackOffset;
+      int nblocks = 0;
+      while (beg < fStackOffset) {
+         end = ReadInt( beg);
+
+         // std::cout << "beg = " << beg << " end = " << end
+         //     << " fStackOffset = " << fStackOffset << std::endl;
+
+         int beg2 = ReadInt( end - sizeof(int));
+         if ( beg != beg2) {
+            //std::cout << "  beg != beg2 " << std::endl;
+            return false;
+         }
+         nblocks++;
+         beg = end;
+      }
+     if (end != fStackOffset) {
+        //std::cout << " end != fStackOffset" << std::endl;
+        return false;
+     }
+     if (nblocks != fBlockCount) {
+        //std::cout << "nblocks != fBlockCount" << std::endl;
+        return false;
+     }
+     //std::cout << "Allocator is in consistent state, nblocks = " << nblocks << std::endl;
+     return true;
+  }
+
+private:
+
+  unsigned char* fStack;
+//   unsigned char fStack[default_size];
+  int            fStackOffset;
+  int            fBlockCount;
+
+};
+
+
+
+class StackAllocatorHolder {
+
+  // t.b.d need to use same trick as  Boost singleton.hpp to be sure that
+  // StackAllocator is created before main()
+
+ public:
+
+
+  static StackAllocator & Get() {
+    static StackAllocator gStackAllocator;
+    return gStackAllocator;
+  }
+};
+
+
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricBuilder.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricBuilder.h
new file mode 100644
index 0000000..89fa28a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricBuilder.h
@@ -0,0 +1,57 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_VariableMetricBuilder
+#define ROOT_Minuit2_VariableMetricBuilder
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/MinimumBuilder.h"
+#include "Minuit2/VariableMetricEDMEstimator.h"
+#include "Minuit2/DavidonErrorUpdator.h"
+
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+/**
+   Build (find) function minimum using the Variable Metric method (MIGRAD)
+
+ */
+class VariableMetricBuilder : public MinimumBuilder {
+
+public:
+
+
+   VariableMetricBuilder() : fEstimator(VariableMetricEDMEstimator()),
+                             fErrorUpdator(DavidonErrorUpdator()) {}
+
+   ~VariableMetricBuilder() {}
+
+   virtual FunctionMinimum Minimum(const MnFcn&, const GradientCalculator&, const MinimumSeed&, const MnStrategy&, unsigned int, double) const;
+
+   FunctionMinimum Minimum(const MnFcn&, const GradientCalculator&, const MinimumSeed&, std::vector<MinimumState> &, unsigned int, double) const;
+
+   const VariableMetricEDMEstimator& Estimator() const {return fEstimator;}
+   const DavidonErrorUpdator& ErrorUpdator() const {return fErrorUpdator;}
+
+   void AddResult(std::vector<MinimumState>& result, const MinimumState & state) const;
+
+private:
+
+   VariableMetricEDMEstimator fEstimator;
+   DavidonErrorUpdator fErrorUpdator;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_VariableMetricBuilder
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricEDMEstimator.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricEDMEstimator.h
new file mode 100644
index 0000000..3e1c9f8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricEDMEstimator.h
@@ -0,0 +1,39 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_VariableMetricEDMEstimator
+#define ROOT_Minuit2_VariableMetricEDMEstimator
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class FunctionGradient;
+class MinimumError;
+
+class VariableMetricEDMEstimator {
+
+public:
+
+  VariableMetricEDMEstimator() {}
+
+  ~VariableMetricEDMEstimator() {}
+
+  double Estimate(const FunctionGradient&, const MinimumError&) const;
+
+private:
+
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_VariableMetricEDMEstimator
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricMinimizer.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricMinimizer.h
new file mode 100644
index 0000000..4dc4fe2
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VariableMetricMinimizer.h
@@ -0,0 +1,53 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_VariableMetricMinimizer
+#define ROOT_Minuit2_VariableMetricMinimizer
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/ModularFunctionMinimizer.h"
+#include "Minuit2/MnSeedGenerator.h"
+#include "Minuit2/VariableMetricBuilder.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//______________________________________________________________________________
+/**
+    Instantiates the SeedGenerator and MinimumBuilder for
+    Variable Metric Minimization method.
+    API is provided in the upper ROOT::Minuit2::ModularFunctionMinimizer class
+
+ */
+
+class VariableMetricMinimizer : public ModularFunctionMinimizer {
+
+public:
+
+   VariableMetricMinimizer() : fMinSeedGen(MnSeedGenerator()),
+                               fMinBuilder(VariableMetricBuilder()) {}
+
+   ~VariableMetricMinimizer() {}
+
+   const MinimumSeedGenerator& SeedGenerator() const {return fMinSeedGen;}
+   const MinimumBuilder& Builder() const {return fMinBuilder;}
+   MinimumBuilder& Builder()  {return fMinBuilder;}
+
+private:
+
+   MnSeedGenerator fMinSeedGen;
+   VariableMetricBuilder fMinBuilder;
+};
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_VariableMetricMinimizer
diff --git a/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VectorOuterProduct.h b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VectorOuterProduct.h
new file mode 100644
index 0000000..23fff98
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/Minuit2/VectorOuterProduct.h
@@ -0,0 +1,48 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#ifndef ROOT_Minuit2_VectorOuterProduct
+#define ROOT_Minuit2_VectorOuterProduct
+
+#include "Minuit2/ABTypes.h"
+#include "Minuit2/ABObj.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+template<class M, class T>
+class VectorOuterProduct {
+
+public:
+
+  VectorOuterProduct(const M& obj) : fObject(obj) {}
+
+  ~VectorOuterProduct() {}
+
+  typedef sym Type;
+
+  const M& Obj() const {return fObject;}
+
+private:
+
+  M fObject;
+};
+
+template<class M, class T>
+inline ABObj<sym, VectorOuterProduct<ABObj<vec, M, T>, T>, T> Outer_product(const ABObj<vec, M, T>& obj) {
+  return ABObj<sym, VectorOuterProduct<ABObj<vec, M, T>, T>, T>(VectorOuterProduct<ABObj<vec, M, T>, T>(obj));
+}
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
+
+#endif  // ROOT_Minuit2_VectorOuterProduct
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticAlgorithm.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticAlgorithm.h
new file mode 100644
index 0000000..05eefed
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticAlgorithm.h
@@ -0,0 +1,115 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : GeneticAlgorithm                                                      *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Base definition for genetic algorithm                                     *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         * 
+ *      MPI-K Heidelberg, Germany                                                 * 
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#ifndef ROOT_TMVA_GeneticAlgorithm
+#define ROOT_TMVA_GeneticAlgorithm
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// GeneticAlgorithm                                                     //
+//                                                                      //
+// Base definition for genetic algorithm                                //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#include <vector>
+#include <deque>
+#include <iosfwd>
+
+#ifndef ROOT_TMVA_IFitterTarget
+#include "TMVA/IFitterTarget.h"
+#endif
+#ifndef ROOT_TMVA_GeneticPopulation
+#include "TMVA/GeneticPopulation.h"
+#endif
+#ifndef ROOT_TMVA_Types
+#include "TMVA/Types.h"
+#endif
+
+namespace BA_TMVA {
+     
+   class IFitterTarget;
+   class Interval;
+//   class MsgLogger;
+
+   class GeneticAlgorithm {
+
+   public:
+    
+      GeneticAlgorithm( IFitterTarget& target, Int_t populationSize, 
+                        const std::vector<BA_TMVA::Interval*>& ranges, UInt_t seed = 0 );
+      virtual ~GeneticAlgorithm();
+
+      void Init();
+
+      virtual Bool_t   HasConverged(Int_t steps = 10, Double_t ratio = 0.1);
+      virtual Double_t SpreadControl(Int_t steps, Int_t ofSteps,
+                                     Double_t factor);
+      virtual Double_t NewFitness(Double_t oldValue, Double_t newValue);
+      virtual Double_t CalculateFitness();
+      virtual void Evolution();
+      
+      GeneticPopulation& GetGeneticPopulation() { return fPopulation; } 
+
+      Double_t GetSpread() const { return fSpread; }
+      void     SetSpread(Double_t s) { fSpread = s; }
+
+      void   SetMakeCopies(Bool_t s) { fMakeCopies = s; }
+      Bool_t GetMakeCopies() { return fMakeCopies; }
+
+      Int_t    fConvCounter;              // converging? ... keeps track of the number of improvements
+
+   protected:
+   
+      IFitterTarget&    fFitterTarget;    // the fitter target
+      
+      Double_t fConvValue;                // keeps track of the quantity of improvement
+
+      // spread-control (stepsize)
+      // successList keeps track of the improvements to be able
+      
+      std::deque<Int_t> fSuccessList;     // to adjust the stepSize      
+      Double_t          fLastResult;      // remembers the last obtained result (for internal use)
+
+      Double_t          fSpread;          // regulates the spread of the value change at mutation (sigma)
+      Bool_t            fMirror;          // new values for mutation are mirror-mapped if outside of constraints
+      Bool_t            fFirstTime;       // if true its the first time, so no evolution yet
+      Bool_t            fMakeCopies;      // if true, the population will make copies of the first individuals
+                                          // avoid for speed performance.
+      Int_t             fPopulationSize;  // the size of the population
+
+      const std::vector<BA_TMVA::Interval*>& fRanges; // parameter ranges
+
+      GeneticPopulation fPopulation;      // contains and controls the "individual"
+      Double_t fBestFitness;
+
+//      mutable MsgLogger* fLogger;         // message logger
+//      MsgLogger& Log() const { return *fLogger; }
+
+//      ClassDef(GeneticAlgorithm, 0)  // Genetic algorithm controller
+   };
+   
+} // namespace TMVA
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticGenes.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticGenes.h
new file mode 100644
index 0000000..98625b7
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticGenes.h
@@ -0,0 +1,71 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : GeneticGenes                                                          *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Genes definition for genetic algorithm                                    *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         * 
+ *      MPI-K Heidelberg, Germany                                                 * 
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#ifndef ROOT_TMVA_GeneticGenes
+#define ROOT_TMVA_GeneticGenes
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// GeneticGenes                                                         //
+//                                                                      //
+// Genes definition for genetic algorithm                               //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+//#ifndef ROOT_Rtypes
+//#include "Rtypes.h"
+//#endif
+#include "TMVA/Types.h"
+#include <vector>
+
+namespace BA_TMVA {
+   
+   class GeneticGenes {
+      
+   public:
+      
+      GeneticGenes():fFitness(0) {}  
+      GeneticGenes( std::vector<Double_t> & f );
+      virtual ~GeneticGenes() {}  
+      
+      std::vector<Double_t>& GetFactors() { return fFactors; }
+      
+      void SetFitness(Double_t fitness) { fFitness = fitness; }
+      Double_t GetFitness() const { return fFitness; }
+      
+      friend Bool_t operator <(const GeneticGenes&, const GeneticGenes&);
+      
+   private:
+      
+      std::vector<Double_t> fFactors; // stores the factors (coefficients) of one individual
+      Double_t fFitness;
+      
+//      ClassDef(GeneticGenes,0) // Genes definition for genetic algorithm
+   };
+
+   Bool_t operator <(const GeneticGenes&, const GeneticGenes&);
+
+} // namespace TMVA
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticPopulation.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticPopulation.h
new file mode 100644
index 0000000..188e8c8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticPopulation.h
@@ -0,0 +1,119 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : GeneticPopulation                                                     *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *    Population definition for genetic algorithm                                 *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         * 
+ *      MPI-K Heidelberg, Germany                                                 * 
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#ifndef ROOT_TMVA_GeneticPopulation
+#define ROOT_TMVA_GeneticPopulation
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// GeneticPopulation                                                    //
+//                                                                      //
+// Population definition for genetic algorithm                          //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#include <string>
+#include <vector>
+
+//#ifndef ROOT_Riosfwd
+//#include "Riosfwd.h"
+//#endif
+#ifndef ROOT_TMVA_GeneticGenes
+#include "TMVA/GeneticGenes.h"
+#endif
+#ifndef ROOT_TMVA_Interval
+#include "TMVA/Interval.h"
+#endif
+#ifndef ROOT_TMVA_GeneticRange
+#include "TMVA/GeneticRange.h"
+#endif
+
+//class TH1F;
+
+namespace BA_TMVA {
+
+//   class MsgLogger;
+
+   class GeneticPopulation {
+
+   public:
+
+      GeneticPopulation(const std::vector<BA_TMVA::Interval*>& ranges, Int_t size, UInt_t seed = 0);
+      virtual ~GeneticPopulation();
+
+      void SetRandomSeed( UInt_t seed = 0);
+
+      void MakeChildren();
+      void Mutate( Double_t probability = 20, Int_t startIndex = 0, Bool_t near = kFALSE, 
+                   Double_t spread = 0.1, Bool_t mirror = kFALSE  );
+
+      GeneticGenes* GetGenes( Int_t index );
+      Int_t         GetPopulationSize() const { return fGenePool.size(); }
+      Double_t      GetFitness() const { return fGenePool.size()>0? fGenePool[0].GetFitness() : 0; }
+
+      const std::vector<BA_TMVA::GeneticGenes>& GetGenePool() const { return fGenePool; }
+      const std::vector<BA_TMVA::GeneticRange*>& GetRanges() const { return fRanges; }
+
+      std::vector<BA_TMVA::GeneticGenes>&  GetGenePool() { return fGenePool; }
+      std::vector<BA_TMVA::GeneticRange*>& GetRanges()   { return fRanges; }
+
+      void Print( Int_t untilIndex = -1 );
+      void Print( std::ostream & out, Int_t utilIndex = -1 );
+
+//      TH1F* VariableDistribution( Int_t varNumber, Int_t bins, Int_t min, Int_t max  );
+      std::vector< Double_t > VariableDistribution( Int_t varNumber );
+
+      // To keep compatibility: These methods might be reimplemented
+      // or just eliminated later on. They are used by the
+      // GeneticFitter class.
+     
+      void MakeCopies( int number );
+      void NextGeneration() {}
+      void AddPopulation( GeneticPopulation *strangers );
+      void AddPopulation( GeneticPopulation &strangers );
+      void TrimPopulation();
+      void GiveHint( std::vector< Double_t >& hint, Double_t fitness = 0 );
+      void Sort();
+
+   private:
+      GeneticGenes MakeSex( GeneticGenes male, GeneticGenes female );
+  
+   private:
+
+      std::vector<BA_TMVA::GeneticGenes>  fGenePool;    // the "genePool" where the individuals of the current generation are stored
+      std::vector<BA_TMVA::GeneticRange*> fRanges;      // contains the ranges inbetween the values of the coefficients have to be
+
+      BA_ROOT::TRandom3*fRandomGenerator;    // random Generator for this population
+
+//      mutable MsgLogger* fLogger;   // message logger
+//      MsgLogger& Log() const { return *fLogger; }
+
+      Int_t fPopulationSizeLimit;
+
+//      ClassDef(GeneticPopulation,0) //Population definition for genetic algorithm
+   };
+
+} // namespace TMVA
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticRange.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticRange.h
new file mode 100644
index 0000000..a9f02c7
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/GeneticRange.h
@@ -0,0 +1,82 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : GeneticRange                                                          *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *    Range definition for genetic algorithm                                      *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         * 
+ *      MPI-K Heidelberg, Germany                                                 * 
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#ifndef ROOT_TMVA_GeneticRange
+#define ROOT_TMVA_GeneticRange
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// GeneticRange                                                         //
+//                                                                      //
+// Range definition for genetic algorithm                               //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef ROOT_TMVA_Interval
+#include "TMVA/Interval.h"
+#endif
+
+namespace BA_ROOT {
+class TRandom3;
+}
+
+namespace BA_TMVA {
+
+   class GeneticRange {
+
+   public:
+
+      GeneticRange( BA_ROOT::TRandom3* rnd, Interval *interval );
+      virtual ~GeneticRange();
+
+      Double_t Random( Bool_t near = kFALSE, Double_t value=0, Double_t spread=0.1, Bool_t mirror=kFALSE );
+      Double_t RandomDiscrete();
+
+      Double_t GetFrom()        { return fFrom; }
+      Double_t GetTo()          { return fTo; }
+      Double_t GetTotalLength() { return fTotalLength; }
+
+   private:
+
+      Double_t fFrom, fTo;    // the constraints of the coefficient
+      Int_t fNbins;
+      
+      Interval *fInterval;     // holds the complete information of the interval
+      Double_t fTotalLength;  // the distance between the lower and upper constraints
+
+      // maps the values thrown outside of the ]from,to] interval back to the interval
+      // the values which leave the range on the from-side, are mapped in to the to-side
+      Double_t ReMap( Double_t val );
+
+      // same as before, but the values leaving the allowed range, are mirrored into the range.
+      Double_t ReMapMirror( Double_t val );
+
+      BA_ROOT::TRandom3* fRandomGenerator;  // the randomGenerator for calculating the new values
+
+//      ClassDef(GeneticRange,0) // Range definition for genetic algorithm
+   };
+
+} // namespace TMVA
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/IFitterTarget.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/IFitterTarget.h
new file mode 100644
index 0000000..c5f20be
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/IFitterTarget.h
@@ -0,0 +1,68 @@
+// @(#)root/tmva $Id$
+// Author: Andreas Hoecker, Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : IFitterTarget                                                         *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Interface for generic fitter                                              *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Andreas Hoecker <Andreas.Hocker at cern.ch> - CERN, Switzerland              *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#ifndef ROOT_TMVA_IFitterTarget
+#define ROOT_TMVA_IFitterTarget
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// IFitterTarget                                                        //
+//                                                                      //
+// Interface for a fitter "target"                                      //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#include <vector>
+
+#ifndef ROOT_TMVA_Types
+#include "TMVA/Types.h"
+#endif
+
+
+namespace BA_TMVA {
+
+   class IFitterTarget {
+
+   public:
+
+      IFitterTarget();
+
+      virtual ~IFitterTarget() {}
+
+      virtual Double_t EstimatorFunction( std::vector<Double_t>& parameters ) = 0;
+
+      // function to notify the FitterTarget of the progress status of the fitter
+      // sender : "GA", "MC", ...
+      // progress : "init", "iteration", "last", "stop"
+      virtual void     ProgressNotifier ( std::string /*sender*/, std::string /* progress */ ) {}
+
+   private:
+
+//      ClassDef(IFitterTarget,0) // base class for a fitter "target"
+   };
+
+} // namespace TMVA
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/Interval.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/Interval.h
new file mode 100644
index 0000000..9cc294d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/Interval.h
@@ -0,0 +1,104 @@
+// @(#)root/tmva $Id$
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : Interval                                                              *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *    Generic range definition (used, eg, in genetic algorithm)                   *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#ifndef ROOT_TMVA_Interval
+#define ROOT_TMVA_Interval
+
+//////////////////////////////////////////////////////////////////////////////
+//                                                                          //
+// Interval                                                                 //
+//                                                                          //
+// Interval definition, continuous and discrete                             //
+//                                                                          //
+// Interval(min,max)  : a continous interval [min,max]                      //
+// Interval(min,max,n): a "discrete interval" [min,max], i.e the n numbers: //
+//          min, min+step, min+2*step,...., min+(n-1)*step, min+n*step=max  //
+//   e.g.: Interval(1,5,5)=1,2,3,4,5                                        //
+//         Interval(.5,1.,6)= .5, .6., .7, .8, .9, 1.0                      //
+//                                                                          //
+//  Note: **bin** counting starts from ZERO unlike in ROOT histograms       //
+//                                                                          //
+//    Example:   Interval(.5,1.,6)                                          //
+//                                                                          //
+//             [ min                           max ]                        //
+//         ------------------------------------------------------------     //
+//                |     |     |     |     |     |                           //
+//               .5    .6    .7    .8    .9    1.0                          //
+//                                                                          //
+//         bin    0     1     2     3     4     5                           //
+//                                                                          //
+//                                                                          //
+//////////////////////////////////////////////////////////////////////////////
+//#ifndef ROOT_Rtypes
+//#include "Rtypes.h"
+//#endif
+
+#include "TMVA/Types.h"
+
+namespace BA_ROOT {
+class TRandom3;
+}
+
+namespace BA_TMVA {
+
+//   class MsgLogger;
+
+   class Interval {
+
+   public:
+
+      Interval( Double_t min, Double_t max, Int_t nbins = 0 );
+      Interval( const Interval& other );
+      virtual ~Interval();
+
+      // accessors
+      // accessors
+      virtual Double_t GetMin()   const { return fMin; }
+      virtual Double_t GetMax()   const { return fMax; }
+      virtual Double_t GetWidth() const;
+      virtual Int_t    GetNbins() const { return fNbins; }
+      virtual Double_t GetMean()  const;
+      virtual Double_t GetRndm( BA_ROOT::TRandom3& )  const;
+      virtual Double_t GetElement( Int_t position ) const;
+      virtual Double_t GetStepSize(Int_t iBin=0) const;
+
+      void SetMax( Double_t m ) { fMax = m; }
+      void SetMin( Double_t m ) { fMin = m; }
+
+      virtual void Print( std::ostream& os ) const;
+
+   protected:
+
+      Double_t fMin, fMax;    // the constraints of the Interval
+      Int_t    fNbins;        // when >0 : number of bins (discrete interval); when ==0 continuous interval
+
+   private:
+//      MsgLogger& Log() const;
+
+//      ClassDef(Interval,0)    // Interval definition, continous and discrete
+   };
+
+} // namespace TMVA
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom.h
new file mode 100644
index 0000000..02cb573
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom.h
@@ -0,0 +1,68 @@
+// @(#)root/mathcore:$Id$
+// Author: Rene Brun   15/12/95
+
+/*************************************************************************
+ * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
+ * All rights reserved.                                                  *
+ *                                                                       *
+ * For the licensing terms see $ROOTSYS/LICENSE.                         *
+ * For the list of contributors see $ROOTSYS/README/CREDITS.             *
+ *************************************************************************/
+
+#ifndef ROOT_TRandom
+#define ROOT_TRandom
+
+
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// TRandom                                                              //
+//                                                                      //
+// Simple prototype random number generator class (periodicity = 10**9) //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+//#ifndef ROOT_TNamed
+//#include "TNamed.h"
+//#endif
+
+#include "TMVA/Types.h"
+
+namespace BA_ROOT {
+
+class TRandom : public TNamed {
+
+protected:
+   UInt_t   fSeed;  //Random number generator seed
+
+public:
+   TRandom(UInt_t seed=65539);
+   virtual ~TRandom();
+//   virtual  Int_t    Binomial(Int_t ntot, Double_t prob);
+//   virtual  Double_t BreitWigner(Double_t mean=0, Double_t gamma=1);
+//   virtual  void     Circle(Double_t &x, Double_t &y, Double_t r);
+//   virtual  Double_t Exp(Double_t tau);
+   virtual  Double_t Gaus(Double_t mean=0, Double_t sigma=1);
+//   virtual  UInt_t   GetSeed() const {return fSeed;}
+   virtual  UInt_t   Integer(UInt_t imax);
+//   virtual  Double_t Landau(Double_t mean=0, Double_t sigma=1);
+//   virtual  Int_t    Poisson(Double_t mean);
+//   virtual  Double_t PoissonD(Double_t mean);
+//   virtual  void     Rannor(Float_t &a, Float_t &b);
+//   virtual  void     Rannor(Double_t &a, Double_t &b);
+//   virtual  void     ReadRandom(const char *filename);
+   virtual  void     SetSeed(UInt_t seed=0);
+   virtual  Double_t Rndm(Int_t i=0);
+   virtual  void     RndmArray(Int_t n, Float_t *array);
+   virtual  void     RndmArray(Int_t n, Double_t *array);
+//   virtual  void     Sphere(Double_t &x, Double_t &y, Double_t &z, Double_t r);
+   virtual  Double_t Uniform(Double_t x1=1);
+   virtual  Double_t Uniform(Double_t x1, Double_t x2);
+//   virtual  void     WriteRandom(const char *filename);
+
+//   ClassDef(TRandom,1)  //Simple Random number generator (periodicity = 10**9)
+};
+
+//R__EXTERN TRandom *gRandom;
+}
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom2.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom2.h
new file mode 100644
index 0000000..180b63d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom2.h
@@ -0,0 +1,53 @@
+// @(#)root/mathcore:$Id$
+// Author: Rene Brun   04/03/99
+
+/*************************************************************************
+ * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
+ * All rights reserved.                                                  *
+ *                                                                       *
+ * For the licensing terms see $ROOTSYS/LICENSE.                         *
+ * For the list of contributors see $ROOTSYS/README/CREDITS.             *
+ *************************************************************************/
+
+#ifndef ROOT_TRandom2
+#define ROOT_TRandom2
+
+
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// TRandom2                                                             //
+//                                                                      //
+// random number generator class (periodicity > 10**26)                 //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+//#ifndef ROOT_TRandom
+//#include "TRandom.h"
+//#endif
+
+#include "TMVA/TRandom.h"
+
+namespace BA_ROOT {
+
+class TRandom2 : public TRandom {
+
+protected:
+   UInt_t   fSeed1;  //Random number generator seed 1
+   UInt_t   fSeed2;  //Random number generator seed 2
+
+public:
+   TRandom2(UInt_t seed=1);
+   virtual ~TRandom2();
+   virtual  Double_t Rndm(Int_t i=0);
+   virtual  void     RndmArray(Int_t n, Float_t *array);
+   virtual  void     RndmArray(Int_t n, Double_t *array);
+   virtual  void     SetSeed(UInt_t seed=0);
+
+//   ClassDef(TRandom2,1)  //Random number generator with periodicity of 10**26
+};
+
+//R__EXTERN TRandom *gRandom;
+}
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom3.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom3.h
new file mode 100644
index 0000000..502074b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TRandom3.h
@@ -0,0 +1,53 @@
+// @(#)root/mathcore:$Id$
+// Author: Peter Malzacher   31/08/99
+
+/*************************************************************************
+ * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
+ * All rights reserved.                                                  *
+ *                                                                       *
+ * For the licensing terms see $ROOTSYS/LICENSE.                         *
+ * For the list of contributors see $ROOTSYS/README/CREDITS.             *
+ *************************************************************************/
+
+#ifndef ROOT_TRandom3
+#define ROOT_TRandom3
+
+
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// TRandom3                                                             //
+//                                                                      //
+// random number generator class: Mersenne Twister                      //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef ROOT_TRandom
+#include "TMVA/TRandom.h"
+#endif
+
+namespace BA_ROOT {
+
+class TRandom3 : public TRandom {
+
+private:
+   UInt_t   fMt[624];
+   Int_t    fCount624;
+
+public:
+   TRandom3(UInt_t seed=4357);
+   virtual ~TRandom3();
+   // get the current seed (only first element of the seed table)
+   virtual  UInt_t    GetSeed() const { return fMt[0];}
+   virtual  Double_t  Rndm(Int_t i=0);
+   virtual  void      RndmArray(Int_t n, Float_t *array);
+   virtual  void      RndmArray(Int_t n, Double_t *array);
+   virtual  void      SetSeed(UInt_t seed=0);
+
+//   ClassDef(TRandom3,2)  //Random number generator: Mersenne Twister
+};
+
+//R__EXTERN TRandom *gRandom;
+
+}
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/TUUID.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TUUID.h
new file mode 100644
index 0000000..52a1566
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/TUUID.h
@@ -0,0 +1,22 @@
+#ifndef TUUID_H
+#define TUUID_H
+
+
+#include "TMVA/Types.h"
+
+namespace BA_ROOT {
+
+class TUUID {
+public:
+
+    TUUID();
+
+    void GetUUID(UChar_t uuid[16]) const;
+
+protected:
+    UInt_t    fTimeLow;               // 60 bit time, lower 32 bits
+};
+
+}
+#endif
+
diff --git a/ThirdParty/Fit/RootMinimizers/inc/TMVA/Types.h b/ThirdParty/Fit/RootMinimizers/inc/TMVA/Types.h
new file mode 100644
index 0000000..789541c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/inc/TMVA/Types.h
@@ -0,0 +1,240 @@
+// @(#)root/tmva $Id$
+// Author: Andreas Hoecker, Joerg Stelzer, Helge Voss
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : Types                                                                 *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      GLobal types (singleton class)                                            *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Andreas Hoecker <Andreas.Hocker at cern.ch> - CERN, Switzerland              *
+ *      Peter Speckmayer <Peter.Speckmayer at cern.ch>  - CERN, Switzerland          *
+ *      Joerg Stelzer   <Joerg.Stelzer at cern.ch>  - CERN, Switzerland              *
+ *      Helge Voss      <Helge.Voss at cern.ch>     - MPI-K Heidelberg, Germany      *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      U. of Victoria, Canada                                                    *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://mva.sourceforge.net/license.txt)                                       *
+ **********************************************************************************/
+
+#ifndef ROOT_TMVA_Types
+#define ROOT_TMVA_Types
+
+//////////////////////////////////////////////////////////////////////////
+//                                                                      //
+// Types                                                                //
+//                                                                      //
+// Singleton class for Global types used by TMVA                        //
+//                                                                      //
+//////////////////////////////////////////////////////////////////////////
+
+//#include <map>
+#if __cplusplus > 199711L
+#include <atomic>
+#endif
+
+//#ifndef ROOT_Rtypes
+//#include "Rtypes.h"
+//#endif
+
+//#ifndef ROOT_TString
+//#include "TString.h"
+//#endif
+
+#include <string>
+#include <map>
+typedef unsigned int   UInt_t;      //Unsigned integer 4 bytes (unsigned int)
+typedef int            Int_t;       //Signed integer 4 bytes (int)
+typedef bool           Bool_t;      //Boolean (0=false, 1=true) (bool)
+typedef double         Double_t;    //Double 8 bytes
+typedef float          Float_t;     //Float 4 bytes (float)
+typedef long           Long_t;      //Signed long integer 8 bytes (long)
+typedef long double    LongDouble_t;//Long Double
+typedef long long          Long64_t; //Portable signed long integer 8 bytes
+typedef unsigned long  ULong_t;     //Unsigned long integer 4 bytes (unsigned long)
+typedef unsigned char  UChar_t;     //Unsigned Character 1 byte (unsigned char)
+
+
+const Bool_t kTRUE  = true;
+const Bool_t kFALSE = false;
+
+//extern void Info(const char *location, const char *msgfmt, ...)
+//#if defined(__GNUC__) && !defined(__CINT__)
+//__attribute__((format(printf, 2, 3)))
+//#endif
+//;
+//extern void Warning(const char *location, const char *msgfmt, ...)
+//#if defined(__GNUC__) && !defined(__CINT__)
+//__attribute__((format(printf, 2, 3)))
+//#endif
+//;
+//extern void Error(const char *location, const char *msgfmt, ...)
+//#if defined(__GNUC__) && !defined(__CINT__)
+//__attribute__((format(printf, 2, 3)))
+//#endif
+//;
+
+namespace BA_ROOT {
+
+class TNamed {
+public:
+    TNamed() {}
+
+    TNamed(const std::string &name, const std::string &title) {
+        m_name = name;
+        m_title = title;
+    }
+
+    void SetName(const std::string &name) { m_name = name; }
+    void SetTitle(const std::string &title) { m_title = title; }
+
+    std::string GetName() const { return m_name; }
+
+private:
+    std::string m_name;
+    std::string m_title;
+};
+
+//class TObject : public TNamed {};
+}
+
+namespace BA_TMVA {
+
+   typedef UInt_t TMVAVersion_t;
+
+//   class MsgLogger;
+
+   // message types for MsgLogger
+   // define outside of Types class to facilite access
+   enum EMsgType {
+      kDEBUG   = 1,
+      kVERBOSE = 2,
+      kINFO    = 3,
+      kWARNING = 4,
+      kERROR   = 5,
+      kFATAL   = 6,
+      kSILENT  = 7
+   };
+
+   enum HistType { kMVAType = 0, kProbaType = 1, kRarityType = 2, kCompareType = 3 };
+
+
+   class Types {
+
+   public:
+
+      // available MVA methods
+      enum EMVA {
+         kVariable    = 0,
+         kCuts           ,
+         kLikelihood     ,
+         kPDERS          ,
+         kHMatrix        ,
+         kFisher         ,
+         kKNN            ,
+         kCFMlpANN       ,
+         kTMlpANN        ,
+         kBDT            ,
+         kDT             ,
+         kRuleFit        ,
+         kSVM            ,
+         kMLP            ,
+         kBayesClassifier,
+         kFDA            ,
+         kBoost          ,
+         kPDEFoam        ,
+         kLD             ,
+         kPlugins        ,
+         kCategory       ,
+         kMaxMethod
+      };
+
+      // available variable transformations
+      enum EVariableTransform {
+         kIdentity = 0,
+         kDecorrelated,
+         kNormalized,
+         kPCA,
+         kRearranged,
+         kGauss,
+         kUniform,
+         kMaxVariableTransform
+      };
+
+      // type of analysis
+      enum EAnalysisType {
+         kClassification = 0,
+         kRegression,
+         kMulticlass,
+         kNoAnalysisType,
+         kMaxAnalysisType
+      };
+
+      enum ESBType {
+         kSignal = 0,  // Never change this number - it is elsewhere assumed to be zero !
+         kBackground,
+         kSBBoth,
+         kMaxSBType,
+         kTrueType
+      };
+
+      enum ETreeType {
+         kTraining = 0,
+         kTesting,
+         kMaxTreeType,  // also used as temporary storage for trees not yet assigned for testing;training...
+         kValidation,   // these are placeholders... currently not used, but could be moved "forward" if
+         kTrainingOriginal     // ever needed
+      };
+
+      enum EBoostStage {
+         kBoostProcBegin=0,
+         kBeforeTraining,
+         kBeforeBoosting,
+         kAfterBoosting,
+         kBoostProcEnd
+      };
+
+   public:
+
+      static Types& Instance();
+      static void   DestroyInstance();
+      ~Types();
+
+//      Types::EMVA   GetMethodType( const TString& method ) const;
+//      TString       GetMethodName( Types::EMVA    method ) const;
+
+//      Bool_t        AddTypeMapping(Types::EMVA method, const TString& methodname);
+
+      Types::EMVA   GetMethodType( const std::string& method ) const;
+      std::string       GetMethodName( Types::EMVA    method ) const;
+
+      Bool_t        AddTypeMapping(Types::EMVA method, const std::string& methodname);
+
+   private:
+
+      Types();
+#if __cplusplus > 199711L
+      static std::atomic<Types*> fgTypesPtr;
+#else
+      static Types* fgTypesPtr;
+#endif
+
+   private:
+
+      std::map<std::string, BA_TMVA::Types::EMVA> fStr2type; // types-to-text map
+//      mutable MsgLogger* fLogger;   // message logger
+//      MsgLogger& Log() const { return *fLogger; }
+
+   };
+}
+
+#endif
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/BasicMinimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/BasicMinimizer.cxx
new file mode 100644
index 0000000..aafb1d4
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/BasicMinimizer.cxx
@@ -0,0 +1,365 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Oct 2012
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Implementation file for class BasicMinimizer
+
+#include "Math/BasicMinimizer.h"
+
+#include "Math/IFunction.h"
+
+#include "Math/FitMethodFunction.h"
+
+#include "Math/MinimTransformFunction.h"
+
+#include "Math/Error.h"
+
+#include "Fit/ParameterSettings.h"
+
+#include <cassert>
+
+#include <iostream>
+#include <iomanip>
+#include <cmath>
+#include <algorithm>
+#include <functional>
+#include <ctype.h>   // need to use c version of tolower defined here
+#include <limits>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+BasicMinimizer::BasicMinimizer( ) :
+   fDim(0),
+   fObjFunc(0),
+   fMinVal(0)
+{
+   fValues.reserve(10);
+   fNames.reserve(10);
+   fSteps.reserve(10);
+
+   int niter = BA_ROOT::Math::MinimizerOptions::DefaultMaxIterations();
+   if (niter <=0 ) niter = 1000;
+   SetMaxIterations(niter);
+   SetPrintLevel(BA_ROOT::Math::MinimizerOptions::DefaultPrintLevel());
+}
+
+
+BasicMinimizer::~BasicMinimizer () {
+   if (fObjFunc) delete fObjFunc;
+}
+
+bool BasicMinimizer::SetVariable(unsigned int ivar, const std::string & name, double val, double step) {
+   // set variable in minimizer - support only free variables
+   // no transformation implemented - so far
+   if (ivar > fValues.size() ) return false;
+   if (ivar == fValues.size() ) {
+      fValues.push_back(val);
+      fNames.push_back(name);
+      fSteps.push_back(step);
+      fVarTypes.push_back(kDefault);
+   }
+   else {
+      fValues[ivar] = val;
+      fNames[ivar] = name;
+      fSteps[ivar] = step;
+      fVarTypes[ivar] = kDefault;
+
+      // remove bounds if needed
+      std::map<unsigned  int, std::pair<double, double> >::iterator iter = fBounds.find(ivar);
+      if ( iter !=  fBounds.end() ) fBounds.erase (iter);
+
+   }
+
+   return true;
+}
+
+bool BasicMinimizer::SetLowerLimitedVariable(unsigned int ivar, const std::string & name, double val, double step, double lower) {
+   // set lower limited variable
+   bool ret = SetVariable(ivar, name, val, step);
+   if (!ret) return false;
+   const double upper = std::numeric_limits<double>::infinity();
+   fBounds[ivar] = std::make_pair( lower, upper);
+   fVarTypes[ivar] = kLowBound;
+   return true;
+}
+bool BasicMinimizer::SetUpperLimitedVariable(unsigned int ivar, const std::string & name, double val, double step, double upper ) {
+   // set upper limited variable
+   bool ret = SetVariable(ivar, name, val, step);
+   if (!ret) return false;
+   const double lower = -std::numeric_limits<double>::infinity();
+   fBounds[ivar] = std::make_pair( lower, upper);
+   fVarTypes[ivar] = kUpBound;
+   return true;
+}
+
+bool BasicMinimizer::SetLimitedVariable(unsigned int ivar, const std::string & name, double val, double step, double lower, double upper) {
+   // set double bounded variable
+   bool ret = SetVariable(ivar, name, val, step);
+   if (!ret) return false;
+   fBounds[ivar] = std::make_pair( lower, upper);
+   fVarTypes[ivar] = kBounds;
+   return true;
+}
+
+bool BasicMinimizer::SetFixedVariable(unsigned int ivar , const std::string & name , double val ) {
+   /// set fixed variable
+   bool ret = SetVariable(ivar, name, val, 0.);
+   if (!ret) return false;
+   fVarTypes[ivar] = kFix;
+   return true;
+}
+
+
+bool BasicMinimizer::SetVariableValue(unsigned int ivar, double val) {
+   // set variable value in minimizer
+   // no change to transformation or variable status
+   if (ivar > fValues.size() ) return false;
+   fValues[ivar] = val;
+   return true;
+}
+
+bool BasicMinimizer::SetVariableValues( const double * x) {
+   // set all variable values in minimizer
+   if (x == 0) return false;
+   std::copy(x,x+fValues.size(), fValues.begin() );
+   return true;
+}
+
+bool BasicMinimizer::SetVariableStepSize(unsigned int ivar, double step) {
+   // set step size
+   if (ivar > fValues.size() ) return false;
+   fSteps[ivar] = step;
+   return true;
+}
+
+bool BasicMinimizer::SetVariableLowerLimit(unsigned int ivar, double lower) {
+   // set variable lower limit
+   double upper =  (fBounds.count(ivar)) ? fBounds[ivar].second : std::numeric_limits<double>::infinity();
+   return SetVariableLimits(ivar, lower, upper);
+}
+
+bool BasicMinimizer::SetVariableUpperLimit(unsigned int ivar, double upper) {
+   // set variable upper limit
+   double lower =  (fBounds.count(ivar)) ? fBounds[ivar].first : - std::numeric_limits<double>::infinity();
+   return SetVariableLimits(ivar, lower, upper);
+}
+
+bool BasicMinimizer::SetVariableLimits(unsigned int ivar, double lower, double upper) {
+   // set variable limits (remove limits if lower >= upper)
+   if (ivar > fVarTypes.size() ) return false;
+   // if limits do not exists add them or update
+   fBounds[ivar] = std::make_pair( lower, upper);
+   if (lower > upper || (lower == - std::numeric_limits<double>::infinity() &&
+                         upper ==   std::numeric_limits<double>::infinity() ) ) {
+      fBounds.erase(ivar);
+      fVarTypes[ivar] = kDefault;
+   }
+   else if (lower == upper)
+      FixVariable(ivar);
+   else {
+      if (lower == - std::numeric_limits<double>::infinity() )
+         fVarTypes[ivar] = kLowBound;
+      else if (upper == std::numeric_limits<double>::infinity() )
+         fVarTypes[ivar] = kUpBound;
+      else
+         fVarTypes[ivar] = kBounds;
+   }
+   return true;
+}
+
+bool BasicMinimizer::FixVariable(unsigned int ivar) {
+   // fix variable
+   if (ivar > fVarTypes.size() ) return false;
+   fVarTypes[ivar] = kFix;
+   return true;
+}
+
+bool BasicMinimizer::ReleaseVariable(unsigned int ivar) {
+   // fix variable
+   if (ivar > fVarTypes.size() ) return false;
+   if (fBounds.count(ivar) == 0)  {
+      fVarTypes[ivar] = kDefault;
+      return true;
+   }
+   if (fBounds[ivar].first == - std::numeric_limits<double>::infinity() )
+      fVarTypes[ivar] = kLowBound;
+   else if (fBounds[ivar].second == std::numeric_limits<double>::infinity() )
+      fVarTypes[ivar] = kUpBound;
+   else
+      fVarTypes[ivar] = kBounds;
+
+   return true;
+}
+
+bool BasicMinimizer::IsFixedVariable(unsigned int ivar) const {
+   if (ivar > fVarTypes.size() ) return false;
+   return (fVarTypes[ivar] == kFix ) ;
+}
+
+bool BasicMinimizer::GetVariableSettings(unsigned int ivar, BA_ROOT::Fit::ParameterSettings & varObj) const {
+   if (ivar > fValues.size() ) return false;
+   assert(fValues.size() == fNames.size() && fValues.size() == fVarTypes.size() );
+   varObj.Set(fNames[ivar],fValues[ivar],fSteps[ivar]);
+   std::map< unsigned int , std::pair< double, double> >::const_iterator itr = fBounds.find(ivar);
+   if (itr != fBounds.end() )  {
+      double lower = (itr->second).first;
+      double upper = (itr->second).second;
+      if (fVarTypes[ivar] == kLowBound) varObj.SetLowerLimit( lower );
+      if (fVarTypes[ivar] == kUpBound) varObj.SetUpperLimit( upper );
+      else varObj.SetLimits( lower,upper);
+   }
+   if (fVarTypes[ivar] == kFix ) varObj.Fix();
+   return true;
+}
+
+std::string BasicMinimizer::VariableName(unsigned int ivar) const {
+   if (ivar > fNames.size() ) return "";
+   return fNames[ivar];
+}
+
+int BasicMinimizer::VariableIndex(const std::string & name) const {
+   std::vector<std::string>::const_iterator itr = std::find( fNames.begin(), fNames.end(), name);
+   if (itr == fNames.end() ) return -1;
+   return itr - fNames.begin();
+}
+
+
+
+void BasicMinimizer::SetFunction(const BA_ROOT::Math::IMultiGenFunction & func) {
+   // set the function to minimizer
+   fObjFunc = func.Clone();
+   fDim = fObjFunc->NDim();
+}
+
+void BasicMinimizer::SetFunction(const BA_ROOT::Math::IMultiGradFunction & func) {
+   // set the function to minimize
+   fObjFunc = dynamic_cast<const BA_ROOT::Math::IMultiGradFunction *>( func.Clone());
+   assert(fObjFunc != 0);
+   fDim = fObjFunc->NDim();
+}
+
+
+bool BasicMinimizer::CheckDimension() const {
+   unsigned int npar = fValues.size();
+   if (npar == 0 || npar < fDim  ) {
+      MATH_ERROR_MSGVAL("BasicMinimizer::CheckDimension","Wrong number of parameters",npar);
+      return false;
+   }
+   return true;
+}
+
+bool BasicMinimizer::CheckObjFunction() const {
+   if (fObjFunc == 0) {
+      MATH_ERROR_MSG("BasicMinimizer::CheckFunction","Function has not been set");
+      return false;
+   }
+   return true;
+}
+
+
+MinimTransformFunction * BasicMinimizer::CreateTransformation(std::vector<double> & startValues, const BA_ROOT::Math::IMultiGradFunction * func) {
+
+   bool doTransform = (fBounds.size() > 0);
+   unsigned int ivar = 0;
+   while (!doTransform && ivar < fVarTypes.size() ) {
+      doTransform = (fVarTypes[ivar++] != kDefault );
+   }
+
+   startValues = std::vector<double>(fValues.begin(), fValues.end() );
+
+   MinimTransformFunction * trFunc  = 0;
+
+   // in case of transformation wrap objective function in a new transformation function
+   // and transform from external variables  to internals one
+   // Transformations are supported only for gradient function
+   const IMultiGradFunction * gradObjFunc = (func) ? func : dynamic_cast<const IMultiGradFunction *>(fObjFunc);
+   doTransform &= (gradObjFunc != 0);
+
+   if (doTransform)   {
+      // minim transform function manages the passed function pointer (gradObjFunc)
+      trFunc =  new MinimTransformFunction ( gradObjFunc, fVarTypes, fValues, fBounds );
+      // transform from external to internal
+      trFunc->InvTransformation(&fValues.front(), &startValues[0]);
+      // size can be different since internal parameter can have smaller size
+      // if there are fixed parameters
+      startValues.resize( trFunc->NDim() );
+      // no need to save fObjFunc since trFunc will manage it
+      fObjFunc = trFunc;
+   }
+   else {
+      if (func) fObjFunc = func;  // to manege the passed function object
+   }
+
+//    std::cout << " f has transform " << doTransform << "  " << fBounds.size() << "   " << startValues.size() <<  " ndim " << fObjFunc->NDim() << std::endl;   std::cout << "InitialValues external : ";
+//    for (int i = 0; i < fValues.size(); ++i) std::cout << fValues[i] << "  ";
+//    std::cout << "\n";
+//    std::cout << "InitialValues internal : ";
+//    for (int i = 0; i < startValues.size(); ++i) std::cout << startValues[i] << "  ";
+//    std::cout << "\n";
+
+
+   return trFunc;
+}
+
+bool BasicMinimizer::Minimize() {
+
+   // do nothing
+   return false;
+}
+
+void BasicMinimizer::SetFinalValues(const double * x) {
+   // check to see if a transformation need to be applied
+   const MinimTransformFunction * trFunc = TransformFunction();
+   if (trFunc) {
+      assert(fValues.size() >= trFunc->NTot() );
+      trFunc->Transformation(x, &fValues[0]);
+   }
+   else {
+      // case of no transformation applied
+      assert( fValues.size() >= NDim() );
+      std::copy(x, x + NDim(),  fValues.begin() );
+   }
+}
+
+void BasicMinimizer::PrintResult() const {
+   //int pr = std::cout.precision(18);
+   std::cout << std::string("FVAL         = ") << fMinVal << std::endl;
+   std::cout << std::setprecision(18);
+//      std::cout << "Edm   = " << fState.Edm() << std::endl;
+   std::cout << std::string("Niterations  = ") << NIterations() << std::endl;
+   unsigned int ncalls = NCalls();
+   if (ncalls) std::cout << std::string("NCalls     = ") << ncalls << std::endl;
+   for (unsigned int i = 0; i < fDim; ++i)
+      std::cout << fNames[i] << "\t  = " << fValues[i] << std::endl;
+}
+
+const BA_ROOT::Math::IMultiGradFunction * BasicMinimizer::GradObjFunction() const {
+      return  dynamic_cast<const BA_ROOT::Math::IMultiGradFunction *>(fObjFunc);
+}
+
+const MinimTransformFunction * BasicMinimizer::TransformFunction() const {
+   return dynamic_cast<const MinimTransformFunction *>(fObjFunc);
+}
+
+unsigned int BasicMinimizer::NFree() const {
+   // number of free variables
+   unsigned int nfree = fValues.size();
+   for (unsigned int i = 0; i < fVarTypes.size(); ++i)
+      if (fVarTypes[i] == kFix) nfree--;
+   return nfree;
+}
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/Derivator.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/Derivator.cxx
new file mode 100644
index 0000000..365ee93
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/Derivator.cxx
@@ -0,0 +1,161 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Implementation file for class GSLDerivator
+//
+// Created by: moneta  at Sat Nov 13 14:46:00 2004
+//
+// Last update: Sat Nov 13 14:46:00 2004
+//
+
+#include "Math/IFunction.h"
+#include "Math/IParamFunction.h"
+#include "Math/Derivator.h"
+#include "GSLDerivator.h"
+
+#include "Math/OneDimFunctionAdapter.h"
+
+// for GSL greater then 1.5
+#include "gsl/gsl_deriv.h"
+// for OLD GSL versions
+//#include "gsl/gsl_diff.h"
+
+namespace BA_ROOT {
+namespace Math {
+
+Derivator::Derivator() {
+   fDerivator = new GSLDerivator();
+}
+
+Derivator::Derivator(const IGenFunction &f)
+{
+   // allocate a  GSLDerivator
+   fDerivator = new GSLDerivator();
+   fDerivator->SetFunction(f);
+}
+
+Derivator::Derivator(const GSLFuncPointer &f, void * p)
+{
+   // allocate a GSLDerivator
+   fDerivator = new GSLDerivator();
+   fDerivator->SetFunction(f,p);
+
+}
+
+Derivator::~Derivator()
+{
+   if (fDerivator) delete fDerivator;
+}
+
+
+Derivator::Derivator(const Derivator &)
+{
+}
+
+Derivator & Derivator::operator = (const Derivator &rhs)
+{
+   if (this == &rhs) return *this;  // time saving self-test
+
+   return *this;
+}
+
+
+void Derivator::SetFunction(const IGenFunction &f) {
+   fDerivator->SetFunction(f);
+}
+
+void Derivator::SetFunction( const GSLFuncPointer &f, void * p) {
+   fDerivator->SetFunction(f,p);
+}
+
+
+double Derivator::Eval( double x, double h) const {
+   return fDerivator->EvalCentral(x, h);
+}
+
+double Derivator::EvalCentral( double x, double h) const {
+   return fDerivator->EvalCentral(x, h);
+}
+
+double Derivator::EvalForward( double x, double h) const {
+   return fDerivator->EvalForward(x, h);
+}
+
+double Derivator::EvalBackward( double x, double h) const {
+   return fDerivator->EvalBackward(x, h);
+}
+
+// static methods
+double Derivator::Eval(const IGenFunction & f, double x, double h ) {
+   return GSLDerivator::EvalCentral(f, x, h );
+}
+
+double Derivator::EvalCentral(const IGenFunction & f, double x, double h)  {
+   return GSLDerivator::EvalCentral(f,x,h);
+}
+
+double Derivator::EvalForward(const IGenFunction & f, double x, double h)  {
+   return GSLDerivator::EvalForward(f, x, h);
+}
+
+double Derivator::EvalBackward(const IGenFunction & f, double x, double h)  {
+   return GSLDerivator::EvalBackward(f, x, h);
+}
+
+double Derivator::Eval(const IMultiGenFunction & f, const double * x, unsigned int icoord, double h ) {
+   // partial derivative for a  multi-dim function
+   GSLDerivator d;
+   OneDimMultiFunctionAdapter<> adapter(f,x,icoord);
+   d.SetFunction( &GSLFunctionAdapter<OneDimMultiFunctionAdapter<> >::F,static_cast<void *>(&adapter) );
+   return d.EvalCentral(x[icoord],h);
+}
+
+double Derivator::Eval(IParamFunction & f, double  x, const double * p, unsigned int ipar, double h ) {
+   // derivative w.r.t parameter  for a one-dim param function
+   GSLDerivator d;
+   const double xx = x;
+   OneDimParamFunctionAdapter<IParamFunction &> adapter(f,&xx,p,ipar);
+   d.SetFunction( &GSLFunctionAdapter<OneDimParamFunctionAdapter<IParamFunction &> >::F,static_cast<void *>(&adapter) );
+   return d.EvalCentral(p[ipar],h);
+}
+
+double Derivator::Eval(IParamMultiFunction & f, const double * x, const double * p, unsigned int ipar, double h ) {
+   // derivative w.r.t parameter  for a multi-dim param function
+   GSLDerivator d;
+   OneDimParamFunctionAdapter<IParamMultiFunction &> adapter(f,x,p,ipar);
+   d.SetFunction( &GSLFunctionAdapter<OneDimParamFunctionAdapter<IParamMultiFunction &> >::F,static_cast<void *>(&adapter) );
+   return d.EvalCentral(p[ipar],h);
+}
+
+
+double Derivator::Result() const { return fDerivator->Result(); }
+
+double Derivator::Error() const { return fDerivator->Error(); }
+
+int Derivator::Status() const { return fDerivator->Status(); }
+
+
+
+} // namespace Math
+} // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSL1DMinimizerWrapper.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSL1DMinimizerWrapper.h
new file mode 100644
index 0000000..8602f9e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSL1DMinimizerWrapper.h
@@ -0,0 +1,76 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 moneta,  CERN/PH-SFT                            *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSL1DMinimizerWrapper
+//
+// Created by: moneta  at Wed Dec  1 17:25:44 2004
+//
+// Last update: Wed Dec  1 17:25:44 2004
+//
+#ifndef ROOT_Math_GSL1DMinimizerWrapper
+#define ROOT_Math_GSL1DMinimizerWrapper
+
+#include "gsl/gsl_min.h"
+
+
+namespace BA_ROOT {
+
+namespace Math {
+
+/**
+   wrapper class for gsl_min_fminimizer structure
+   @ingroup Min1D
+*/
+class GSL1DMinimizerWrapper {
+
+public:
+   GSL1DMinimizerWrapper( const gsl_min_fminimizer_type * T)
+   {
+      fMinimizer = gsl_min_fminimizer_alloc(T);
+   }
+   virtual ~GSL1DMinimizerWrapper() {
+      gsl_min_fminimizer_free(fMinimizer);
+   }
+
+private:
+// usually copying is non trivial, so we make this unaccessible
+   GSL1DMinimizerWrapper(const GSL1DMinimizerWrapper &);
+   GSL1DMinimizerWrapper & operator = (const GSL1DMinimizerWrapper &);
+
+public:
+
+   gsl_min_fminimizer * Get() const {
+      return fMinimizer;
+   }
+
+
+private:
+
+   gsl_min_fminimizer * fMinimizer;
+
+};
+
+} // end namespace Math
+} // end namespace ROOT
+
+#endif /* ROOT_Math_GSL1DMinimizerWrapper */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLDerivator.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/GSLDerivator.cxx
new file mode 100644
index 0000000..e439845
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLDerivator.cxx
@@ -0,0 +1,128 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Implementation file for class GSLDerivator
+//
+// Created by: moneta  at Sat Nov 13 14:46:00 2004
+//
+// Last update: Sat Nov 13 14:46:00 2004
+//
+
+#include "GSLDerivator.h"
+
+#include "GSLFunctionWrapper.h"
+// for GSL greater then 1.5
+#include "gsl/gsl_deriv.h"
+// for OLD GSL versions
+//#include "gsl/gsl_diff.h"
+
+#include <iostream>
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+double GSLDerivator::EvalCentral( double x, double h) {
+   // Central evaluation using previously set function
+   if ( !fFunction.IsValid() ) {
+      std::cerr << "GSLDerivator: Error : The function has not been specified" << std::endl;
+      fStatus = -1;
+      return 0;
+   }
+   fStatus =  gsl_deriv_central(  fFunction.GetFunc(), x, h, &fResult, &fError);
+   return fResult;
+}
+
+double GSLDerivator::EvalForward( double x, double h) {
+   // Forward evaluation using previously set function
+   if ( !fFunction.IsValid() ) {
+      std::cerr << "GSLDerivator: Error : The function has not been specified" << std::endl;
+      fStatus = -1;
+      return 0;
+   }
+   fStatus =  gsl_deriv_forward(  fFunction.GetFunc(), x, h, &fResult, &fError);
+   return fResult;
+}
+
+double GSLDerivator::EvalBackward( double x, double h) {
+   // Backward evaluation using previously set function
+   if ( !fFunction.IsValid() ) {
+      std::cerr << "GSLDerivator: Error : The function has not been specified" << std::endl;
+      fStatus = -1;
+      return 0;
+   }
+   fStatus =  gsl_deriv_backward(  fFunction.GetFunc(), x, h, &fResult, &fError);
+   return fResult;
+}
+
+// static methods not requiring the function
+double GSLDerivator::EvalCentral(const IGenFunction & f, double x, double h) {
+   // Central evaluation using given function
+   GSLFunctionWrapper gslfw;
+   double result, error = 0;
+   gslfw.SetFunction(f);
+   gsl_deriv_central(  gslfw.GetFunc(), x, h, &result, &error);
+   return result;
+}
+
+double GSLDerivator::EvalForward(const IGenFunction & f, double x, double h) {
+   // Forward evaluation using given function
+   GSLFunctionWrapper gslfw;
+   double result, error = 0;
+   gslfw.SetFunction(f);
+   gsl_deriv_forward(  gslfw.GetFunc(), x, h, &result, &error);
+   return result;
+}
+
+double GSLDerivator::EvalBackward(const IGenFunction & f, double x, double h) {
+   // Backward evaluation using given function
+   GSLFunctionWrapper gslfw;
+   double result, error = 0;
+   gslfw.SetFunction(f);
+   gsl_deriv_backward(  gslfw.GetFunc(), x, h, &result, &error);
+   return result;
+}
+
+
+double GSLDerivator::Result() const { return fResult; }
+
+double GSLDerivator::Error() const { return fError; }
+
+int GSLDerivator::Status() const { return fStatus; }
+
+// fill GSLFunctionWrapper with the pointer to the function
+
+void  GSLDerivator::SetFunction( GSLFuncPointer  fp, void * p) {
+  fFunction.SetFuncPointer( fp );
+  fFunction.SetParams ( p );
+}
+
+
+void  GSLDerivator::SetFunction(const IGenFunction &f) {
+  fFunction.SetFunction(f);
+}
+
+} // namespace Math
+} // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLDerivator.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLDerivator.h
new file mode 100644
index 0000000..3fb8c3c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLDerivator.h
@@ -0,0 +1,176 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class Derivator
+//
+// class for calculating Derivative of functions
+//
+// Created by: moneta  at Sat Nov 13 14:46:00 2004
+//
+// Last update: Sat Nov 13 14:46:00 2004
+//
+#ifndef ROOT_Math_GSLDerivator
+#define ROOT_Math_GSLDerivator
+
+/**
+ at defgroup Deriv Numerical Differentiation
+*/
+
+#include "Math/GSLFunctionAdapter.h"
+#include "GSLFunctionWrapper.h"
+
+
+#include "Math/IFunctionfwd.h"
+#include "Math/IFunction.h"
+
+namespace BA_ROOT {
+namespace Math {
+
+
+class GSLFunctionWrapper;
+
+
+/**
+    Class for computing numerical derivative of a function based on the GSL numerical algorithm
+    This class is implemented using the numerical derivatives algorithms provided by GSL
+    (see <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Numerical-Differentiation.html">GSL Online Manual</A> ).
+
+    @ingroup Deriv
+*/
+
+class GSLDerivator {
+
+public:
+   /**
+      Default Constructor of  a GSLDerivator class based on GSL numerical differentiation algorithms
+   */
+   GSLDerivator() : fStatus(0), fResult(0), fError(0)   {}
+
+   /// destructor (no operations)
+   virtual ~GSLDerivator() {}
+
+//    // disable copying
+// private:
+
+//    GSLDerivator(const GSLDerivator &);
+//    GSLDerivator & operator = (const GSLDerivator &);
+
+// public:
+
+
+
+   /**
+      Set the function for calculating the derivatives.
+      The function must implement the ROOT::Math::IGenFunction signature
+    */
+   void SetFunction(const IGenFunction &f);
+
+   /**
+       Set the function f for evaluating the derivative using a GSL function pointer type
+       @param f :  free function pointer of the GSL required type
+       @param p :  pointer to the object carrying the function state
+                    (for example the function object itself)
+   */
+   void SetFunction( GSLFuncPointer f, void * p = 0);
+
+   /**
+       Computes the numerical derivative at a point x using an adaptive central
+       difference algorithm with a step size h.
+   */
+   double EvalCentral( double x, double h);
+
+   /**
+       Computes the numerical derivative at a point x using an adaptive forward
+       difference algorithm with a step size h.
+       The function is evaluated only at points greater than x and at x itself.
+   */
+   double EvalForward( double x, double h);
+
+   /**
+       Computes the numerical derivative at a point x using an adaptive backward
+       difference algorithm with a step size h.
+       The function is evaluated only at points less than x and at x itself.
+   */
+   double EvalBackward( double x, double h);
+
+   /** @name --- Static methods --- **/
+
+   /**
+       Computes the numerical derivative of a function f at a point x using an adaptive central
+       difference algorithm with a step size h
+   */
+   static double EvalCentral(const IGenFunction & f, double x, double h);
+
+
+   /**
+       Computes the numerical derivative of a function f at a point x using an adaptive forward
+       difference algorithm with a step size h.
+       The function is evaluated only at points greater than x and at x itself
+   */
+   static double EvalForward(const IGenFunction & f, double x, double h);
+
+   /**
+       Computes the numerical derivative of a function f at a point x using an adaptive backward
+       difference algorithm with a step size h.
+       The function is evaluated only at points less than x and at x itself
+   */
+
+   static double EvalBackward(const IGenFunction & f, double x, double h);
+
+
+
+   /**
+      return the error status of the last integral calculation
+   */
+   int Status() const;
+
+   /**
+      return  the result of the last derivative calculation
+   */
+   double Result() const;
+
+   /**
+      return the estimate of the absolute error of the last derivative calculation
+   */
+   double Error() const;
+
+
+private:
+
+   int fStatus;
+   double fResult;
+   double fError;
+
+   GSLFunctionWrapper fFunction;
+
+};
+
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+
+#endif /* ROOT_Math_GSLDerivator */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLFunctionWrapper.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLFunctionWrapper.h
new file mode 100644
index 0000000..5c67316
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLFunctionWrapper.h
@@ -0,0 +1,150 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLFunctionWrapper
+//
+// Created by: moneta  at Sat Nov 13 14:54:41 2004
+//
+// Last update: Sat Nov 13 14:54:41 2004
+//
+#ifndef ROOT_Math_GSLFunctionWrapper
+#define ROOT_Math_GSLFunctionWrapper
+
+#include "gsl/gsl_math.h"
+
+#include "Math/GSLFunctionAdapter.h"
+
+#include <cassert>
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+typedef double ( * GSLFuncPointer ) ( double, void *);
+typedef void ( * GSLFdfPointer ) ( double, void *, double *, double *);
+
+
+/**
+   Wrapper class to the gsl_function C structure.
+   This class to fill the GSL C structure  gsl_function with
+   the C++ function objcet.
+   Use the class ROOT::Math::GSLFunctionAdapter to adapt the
+   C++ function object to the right signature (function pointer type)
+   requested by GSL
+*/
+class GSLFunctionWrapper {
+
+public:
+
+   GSLFunctionWrapper()
+   {
+      fFunc.function = 0;
+      fFunc.params = 0;
+   }
+
+   /// set in the GSL C struct the pointer to the function evaluation
+   void SetFuncPointer( GSLFuncPointer f) { fFunc.function = f; }
+
+   /// set in the GSL C struct the extra-object pointer
+   void SetParams ( void * p) { fFunc.params = p; }
+
+   /// fill the GSL C struct from a generic C++ callable object
+   /// implementing operator()
+   template<class FuncType>
+   void SetFunction(const FuncType &f) {
+      const void * p = &f;
+      assert (p != 0);
+      SetFuncPointer(&GSLFunctionAdapter<FuncType >::F);
+      SetParams(const_cast<void *>(p));
+   }
+
+   gsl_function * GetFunc() { return &fFunc; }
+
+   GSLFuncPointer FunctionPtr() { return fFunc.function; }
+
+   // evaluate the function
+   double operator() (double x) {  return GSL_FN_EVAL(&fFunc, x); }
+
+   /// check if function is valid (has been set)
+   bool IsValid() {
+      return (fFunc.function != 0) ? true : false;
+   }
+
+private:
+   gsl_function fFunc;
+
+
+};
+
+
+   /**
+     class to wrap a gsl_function_fdf (with derivatives)
+   */
+  class GSLFunctionDerivWrapper {
+
+  public:
+
+     GSLFunctionDerivWrapper()
+     {
+        fFunc.f = 0;
+        fFunc.df = 0;
+        fFunc.fdf = 0;
+        fFunc.params = 0;
+     }
+
+
+    void SetFuncPointer( GSLFuncPointer f) { fFunc.f = f; }
+    void SetDerivPointer( GSLFuncPointer f) { fFunc.df = f; }
+    void SetFdfPointer( GSLFdfPointer f) { fFunc.fdf = f; }
+    void SetParams ( void * p) { fFunc.params = p; }
+
+
+    gsl_function_fdf * GetFunc() { return &fFunc; }
+
+    // evaluate the function and derivatives
+    double operator() (double x) {  return GSL_FN_FDF_EVAL_F(&fFunc, x); }
+
+    double Derivative (double x) { return GSL_FN_FDF_EVAL_DF(&fFunc, x); }
+
+    void Fdf(double x, double & f, double & df) {
+      return GSL_FN_FDF_EVAL_F_DF(&fFunc, x, &f, &df);
+    }
+
+   /// check if function is valid (has been set)
+   bool IsValid() {
+      return (fFunc.f != 0 ) ? true : false;
+   }
+
+  private:
+    gsl_function_fdf fFunc;
+
+  };
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+#endif /* ROOT_Math_GSLFunctionWrapper */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMinimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMinimizer.cxx
new file mode 100644
index 0000000..597bae4
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMinimizer.cxx
@@ -0,0 +1,298 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Tue Dec 19 15:41:39 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// Implementation file for class GSLMinimizer
+
+#include "Math/GSLMinimizer.h"
+
+#include "GSLMultiMinimizer.h"
+
+#include "Math/MultiNumGradFunction.h"
+#include "Math/FitMethodFunction.h"
+
+#include "Math/MinimTransformFunction.h"
+
+#include <cassert>
+
+#include <iostream>
+#include <iomanip>
+#include <cmath>
+#include <algorithm>
+#include <functional>
+#include <ctype.h>   // need to use c version of tolower defined here
+#include <limits>
+#include <iomanip>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+GSLMinimizer::GSLMinimizer( BA_ROOT::Math::EGSLMinimizerType type) :
+   BasicMinimizer()
+{
+   // Constructor implementation : create GSLMultiMin wrapper object
+   //std::cout << "create GSL Minimizer of type " << type << std::endl;
+
+   fGSLMultiMin = new GSLMultiMinimizer((BA_ROOT::Math::EGSLMinimizerType) type);
+
+   fLSTolerance = 0.1; // line search tolerance (use fixed)
+   int niter = BA_ROOT::Math::MinimizerOptions::DefaultMaxIterations();
+   if (niter <=0 ) niter = 1000;
+   SetMaxIterations(niter);
+   SetPrintLevel(BA_ROOT::Math::MinimizerOptions::DefaultPrintLevel());
+}
+
+GSLMinimizer::GSLMinimizer( const char *  type) :    BasicMinimizer()
+{
+   // Constructor implementation from a string
+   std::string algoname(type);
+   std::transform(algoname.begin(), algoname.end(), algoname.begin(), (int(*)(int)) tolower );
+
+   BA_ROOT::Math::EGSLMinimizerType algo =   kVectorBFGS2; // default value
+
+   if (algoname == "conjugatefr") algo = kConjugateFR;
+   if (algoname == "conjugatepr") algo = kConjugatePR;
+   if (algoname == "bfgs") algo = kVectorBFGS;
+   if (algoname == "bfgs2") algo = kVectorBFGS2;
+   if (algoname == "steepestdescent") algo = kSteepestDescent;
+
+
+   //std::cout << "create GSL Minimizer of type " << algo << std::endl;
+
+   fGSLMultiMin = new GSLMultiMinimizer(algo);
+
+   fLSTolerance = 0.1; // use 10**-4
+   int niter = BA_ROOT::Math::MinimizerOptions::DefaultMaxIterations();
+   if (niter <=0 ) niter = 1000;
+   SetMaxIterations(niter);
+   SetPrintLevel(BA_ROOT::Math::MinimizerOptions::DefaultPrintLevel());
+}
+
+
+GSLMinimizer::~GSLMinimizer () {
+   assert(fGSLMultiMin != 0);
+   delete fGSLMultiMin;
+}
+
+
+
+void GSLMinimizer::SetFunction(const BA_ROOT::Math::IMultiGenFunction & func) {
+   // set the function to minimizer
+   // need to calculate numerically the derivatives: do via class MultiNumGradFunction
+   // no need to clone the passed function
+   BA_ROOT::Math::MultiNumGradFunction gradFunc(func);
+   // function is cloned inside so can be delete afterwards
+   // called base class method setfunction
+   // (note: write explicitly otherwise it will call back itself)
+   BasicMinimizer::SetFunction(gradFunc);
+}
+
+
+unsigned int GSLMinimizer::NCalls() const {
+   // return numbr of function calls
+   // if method support
+   const BA_ROOT::Math::MultiNumGradFunction * fnumgrad = dynamic_cast<const BA_ROOT::Math::MultiNumGradFunction *>(ObjFunction());
+   if (fnumgrad) return fnumgrad->NCalls();
+   const BA_ROOT::Math::FitMethodGradFunction * ffitmethod = dynamic_cast<const BA_ROOT::Math::FitMethodGradFunction *>(ObjFunction());
+   if (ffitmethod) return ffitmethod->NCalls();
+   // not supported in the other case
+   return 0;
+}
+
+bool GSLMinimizer::Minimize() {
+   // set initial parameters of the minimizer
+
+   if (fGSLMultiMin == 0) return false;
+   const BA_ROOT::Math::IMultiGradFunction * function = GradObjFunction();
+   if (function == 0) {
+      MATH_ERROR_MSG("GSLMinimizer::Minimize","Function has not been set");
+      return false;
+   }
+
+   unsigned int npar = NPar();
+   unsigned int ndim = NDim();
+   if (npar == 0 || npar < NDim()  ) {
+      MATH_ERROR_MSGVAL("GSLMinimizer::Minimize","Wrong number of parameters",npar);
+      return false;
+   }
+   if (npar > ndim  ) {
+      MATH_WARN_MSGVAL("GSLMinimizer::Minimize","number of parameters larger than function dimension - ignore extra parameters",npar);
+   }
+
+   const double eps = std::numeric_limits<double>::epsilon();
+
+   std::vector<double> startValues;
+   std::vector<double> steps(StepSizes(), StepSizes()+npar);
+
+   MinimTransformFunction * trFunc  =  CreateTransformation(startValues);
+   if (trFunc) {
+      function = trFunc;
+      // need to transform also  the steps
+      trFunc->InvStepTransformation(X(), StepSizes(), &steps[0]);
+      steps.resize(trFunc->NDim());
+   }
+
+   // in case all parameters are free - just evaluate the function
+   if (NFree() == 0) {
+      MATH_INFO_MSG("GSLMinimizer::Minimize","There are no free parameter - just compute the function value");
+      double fval = (*function)((double*)0);   // no need to pass parameters
+      SetFinalValues(&startValues[0]);
+      SetMinValue(fval);
+      fStatus = 0;
+      return true;
+   }
+
+   // use a global step size = modules of  step vectors
+   double stepSize = 0;
+   for (unsigned int i = 0; i < steps.size(); ++i)
+      stepSize += steps[i]*steps[i];
+   stepSize = std::sqrt(stepSize);
+   if (stepSize < eps) {
+      MATH_ERROR_MSGVAL("GSLMinimizer::Minimize","Step size is too small",stepSize);
+      return false;
+   }
+
+
+   // set parameters in internal GSL minimization class
+   fGSLMultiMin->Set(*function, &startValues.front(), stepSize, fLSTolerance );
+
+
+   int debugLevel = PrintLevel();
+
+   if (debugLevel >=1 ) std::cout <<"Minimize using GSLMinimizer " << fGSLMultiMin->Name() << std::endl;
+
+
+   //std::cout <<"print Level " << debugLevel << std::endl;
+   //debugLevel = 3;
+
+   // start iteration
+   unsigned  int iter = 0;
+   int status;
+   bool minFound = false;
+   bool iterFailed = false;
+   do {
+      status = fGSLMultiMin->Iterate();
+      if (status) {
+         iterFailed = true;
+         break;
+      }
+
+      status = fGSLMultiMin->TestGradient( Tolerance() );
+      if (status == GSL_SUCCESS) {
+         minFound = true;
+      }
+
+      if (debugLevel >=2) {
+         std::cout << "----------> Iteration " << std::setw(4) << iter;
+//         int pr = std::cout.precision(18);
+         std::cout << "            FVAL = " << fGSLMultiMin->Minimum() << std::endl;
+         std::cout << std::setprecision(18);
+         if (debugLevel >=3) {
+            std::cout << "            Parameter Values : ";
+            const double * xtmp = fGSLMultiMin->X();
+            std::cout << std::endl;
+            if (trFunc != 0 ) {
+               xtmp  = trFunc->Transformation(xtmp);
+            }
+            for (unsigned int i = 0; i < NDim(); ++i) {
+               std::cout << " " << VariableName(i) << " = " << xtmp[i];
+               // avoid nan
+               // if (std::isnan(xtmp[i])) status = -11;
+            }
+            std::cout << std::endl;
+         }
+      }
+
+
+      iter++;
+
+
+   }
+   while (status == GSL_CONTINUE && iter < MaxIterations() );
+
+
+   // save state with values and function value
+   double * x = fGSLMultiMin->X();
+   if (x == 0) return false;
+   SetFinalValues(x);
+
+   double minVal =  fGSLMultiMin->Minimum();
+   SetMinValue(minVal);
+
+   fStatus = status;
+
+
+   if (minFound) {
+      if (debugLevel >=1 ) {
+         std::cout << "GSLMinimizer: Minimum Found" << std::endl;
+//         int pr = std::cout.precision(18);
+         std::cout << "FVAL         = " << MinValue() << std::endl;
+         std::cout << std::setprecision(18);
+//      std::cout << "Edm   = " << fState.Edm() << std::endl;
+         std::cout << "Niterations  = " << iter << std::endl;
+         unsigned int ncalls = NCalls();
+         if (ncalls) std::cout << "NCalls     = " << ncalls << std::endl;
+         for (unsigned int i = 0; i < NDim(); ++i)
+            std::cout << VariableName(i) << "\t  = " << X()[i] << std::endl;
+      }
+      return true;
+   }
+   else {
+      if (debugLevel >= -1 ) {
+         std::cout << "GSLMinimizer: Minimization did not converge" << std::endl;
+         if (iterFailed) {
+            if (status == GSL_ENOPROG) // case status 27
+               std::cout << "\t Iteration is not making progress towards solution" << std::endl;
+            else
+               std::cout << "\t Iteration failed with status " << status << std::endl;
+
+            if (debugLevel >= 1) {
+               double * g = fGSLMultiMin->Gradient();
+               double dg2 = 0;
+               for (unsigned int i = 0; i < NDim(); ++i) dg2 += g[i] * g[1];
+               std::cout << "Grad module is " << std::sqrt(dg2) << std::endl;
+               for (unsigned int i = 0; i < NDim(); ++i)
+                  std::cout << VariableName(i) << "\t  = " << X()[i] << std::endl;
+               std::cout << "FVAL         = " << MinValue() << std::endl;
+//      std::cout << "Edm   = " << fState.Edm() << std::endl;
+               std::cout << "Niterations  = " << iter << std::endl;
+            }
+         }
+      }
+      return false;
+   }
+   return false;
+}
+
+const double * GSLMinimizer::MinGradient() const {
+   // return gradient (internal values)
+   return fGSLMultiMin->Gradient();
+}
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMinimizer1D.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMinimizer1D.cxx
new file mode 100644
index 0000000..27e388a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMinimizer1D.cxx
@@ -0,0 +1,223 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 moneta,  CERN/PH-SFT                            *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Implementation file for class GSLMinimizer1D
+//
+// Created by: moneta  at Wed Dec  1 15:04:51 2004
+//
+// Last update: Wed Dec  1 15:04:51 2004
+//
+
+#include <assert.h>
+
+#include "Math/GSLMinimizer1D.h"
+#include "Math/Error.h"
+
+#include "GSLFunctionWrapper.h"
+#include "GSL1DMinimizerWrapper.h"
+
+
+#include "gsl/gsl_min.h"
+#include "gsl/gsl_errno.h"
+
+#include <iostream>
+#include <cmath>
+
+namespace BA_ROOT {
+
+namespace Math {
+
+
+GSLMinimizer1D::GSLMinimizer1D(Minim1D::Type type) :
+    fXmin(0), fXlow(0), fXup(0), fMin(0), fLow(0), fUp(0),
+    fIter(0), fStatus(-1), fIsSet(false),
+    fMinimizer(0), fFunction(0)
+{
+   // construct a minimizer passing the algorithm type as an enumeration
+
+   const gsl_min_fminimizer_type* T = 0 ;
+   switch ( type )
+   {
+   case Minim1D::kGOLDENSECTION          :
+      T = gsl_min_fminimizer_goldensection;
+      break ;
+   case Minim1D::kBRENT       :
+      T = gsl_min_fminimizer_brent;
+      break ;
+   default :
+      // default case is brent
+      T = gsl_min_fminimizer_brent;
+      break ;
+   }
+
+   fMinimizer = new GSL1DMinimizerWrapper(T);
+   fFunction  = new GSLFunctionWrapper();
+
+}
+
+GSLMinimizer1D::~GSLMinimizer1D()
+{
+   // destructor: clean up minimizer and function pointers
+
+   if (fMinimizer) delete fMinimizer;
+   if (fFunction)  delete  fFunction;
+}
+
+GSLMinimizer1D::GSLMinimizer1D(const GSLMinimizer1D &)
+    : IMinimizer1D()
+{
+   // dummy copy ctr
+}
+
+GSLMinimizer1D & GSLMinimizer1D::operator = (const GSLMinimizer1D &rhs)
+{
+   // dummy operator =
+   if (this == &rhs) return *this;  // time saving self-test
+   return *this;
+}
+
+void GSLMinimizer1D::SetFunction(  GSLFuncPointer f, void * p, double xmin, double xlow, double xup) {
+   // set the function to be minimized
+   assert(fFunction);
+   assert(fMinimizer);
+   fXlow = xlow;
+   fXup = xup;
+   fXmin = xmin;
+   fFunction->SetFuncPointer( f );
+   fFunction->SetParams( p );
+
+#ifdef DEBUG
+   std::cout << " [ "<< xlow << " , " << xup << " ]" << std::endl;
+#endif
+
+   int status = gsl_min_fminimizer_set( fMinimizer->Get(), fFunction->GetFunc(), xmin, xlow, xup);
+   if (status != GSL_SUCCESS)
+      std::cerr <<"GSLMinimizer1D: Error:  Interval [ "<< xlow << " , " << xup << " ] does not contain a minimum" << std::endl;
+
+
+   fIsSet = true;
+   fStatus = -1;
+   return;
+}
+
+int GSLMinimizer1D::Iterate() {
+   // perform an iteration and update values
+   if (!fIsSet) {
+      std::cerr << "GSLMinimizer1D- Error: Function has not been set in Minimizer" << std::endl;
+      return -1;
+   }
+
+   int status =  gsl_min_fminimizer_iterate(fMinimizer->Get());
+   // update values
+   fXmin = gsl_min_fminimizer_x_minimum(fMinimizer->Get() );
+   fMin = gsl_min_fminimizer_f_minimum(fMinimizer->Get() );
+   // update interval values
+   fXlow =  gsl_min_fminimizer_x_lower(fMinimizer->Get() );
+   fXup =  gsl_min_fminimizer_x_upper(fMinimizer->Get() );
+   fLow =  gsl_min_fminimizer_f_lower(fMinimizer->Get() );
+   fUp =  gsl_min_fminimizer_f_upper(fMinimizer->Get() );
+   return status;
+}
+
+double GSLMinimizer1D::XMinimum() const {
+   // return x value at function minimum
+   return fXmin;
+}
+
+double GSLMinimizer1D::XLower() const {
+   // return lower x value of bracketing interval
+   return fXlow;
+}
+
+double GSLMinimizer1D::XUpper() const {
+   // return upper x value of bracketing interval
+   return fXup;
+}
+
+double GSLMinimizer1D::FValMinimum() const {
+   // return function value at minimum
+   return fMin;
+}
+
+double GSLMinimizer1D::FValLower() const {
+   // return function value at x lower
+   return fLow;
+}
+
+double GSLMinimizer1D::FValUpper() const {
+   // return function value at x upper
+   return fUp;
+}
+
+const char * GSLMinimizer1D::Name() const {
+   // return name of minimization algorithm
+   return gsl_min_fminimizer_name(fMinimizer->Get() );
+}
+
+bool GSLMinimizer1D::Minimize (int maxIter, double absTol, double relTol)
+{
+   // find the minimum via multiple iterations
+   fStatus = -1;
+   int iter = 0;
+   int status = 0;
+   do {
+      iter++;
+      status = Iterate();
+      if (status != GSL_SUCCESS) {
+         MATH_ERROR_MSG("GSLMinimizer1D::Minimize","error returned when performing an iteration");
+         fStatus = status;
+         return false;
+      }
+
+#ifdef DEBUG
+      std::cout << "Min1D - iteration " << iter << " interval : [ " << fXlow << "  , " << fXup << " ]  min = " << fXmin
+                << " fmin " << fMin << " f(a) " << fLow << " f(b) " << fUp << std::endl;
+#endif
+
+
+      status =  TestInterval(fXlow, fXup, absTol, relTol);
+      if (status == GSL_SUCCESS) {
+         fIter = iter;
+         fStatus = status;
+         return true;
+      }
+   }
+   while (status == GSL_CONTINUE && iter < maxIter);
+   if (status == GSL_CONTINUE) {
+      double tol = std::abs(fXup-fXlow);
+      MATH_INFO_MSGVAL("GSLMinimizer1D::Minimize","exceeded max iterations, reached tolerance is not sufficient",tol);
+   }
+   fStatus = status;
+   return false;
+}
+
+
+int GSLMinimizer1D::TestInterval( double xlow, double xup, double epsAbs, double epsRel) {
+// static function to test interval
+   return gsl_min_test_interval(xlow, xup, epsAbs, epsRel);
+}
+
+} // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFit.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFit.h
new file mode 100644
index 0000000..c819440
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFit.h
@@ -0,0 +1,223 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Dec 20 17:26:06 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class GSLMultiFit
+
+#ifndef ROOT_Math_GSLMultiFit
+#define ROOT_Math_GSLMultiFit
+
+#include "gsl/gsl_vector.h"
+#include "gsl/gsl_matrix.h"
+#include "gsl/gsl_multifit_nlin.h"
+#include "gsl/gsl_blas.h"
+#include "gsl/gsl_version.h"
+#include "GSLMultiFitFunctionWrapper.h"
+
+#include "Math/IFunction.h"
+#include <string>
+#include <cassert>
+
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+/**
+   GSLMultiFit, internal class for implementing GSL non linear least square GSL fitting
+
+   @ingroup MultiMin
+*/
+class GSLMultiFit {
+
+public:
+
+   /**
+      Default constructor
+      No need to specify the type so far since only one solver exists so far
+   */
+   GSLMultiFit (const gsl_multifit_fdfsolver_type * type = 0) :
+      fSolver(0),
+      fVec(0),
+      fCov(0),
+      fType(type)
+   {
+      if (fType == 0) fType = gsl_multifit_fdfsolver_lmsder; // default value
+   }
+
+   /**
+      Destructor (no operations)
+   */
+   ~GSLMultiFit ()  {
+      if (fSolver) gsl_multifit_fdfsolver_free(fSolver);
+      if (fVec != 0) gsl_vector_free(fVec);
+      if (fCov != 0) gsl_matrix_free(fCov);
+   }
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /**
+      Copy constructor
+   */
+   GSLMultiFit(const GSLMultiFit &) {}
+
+   /**
+      Assignment operator
+   */
+   GSLMultiFit & operator = (const GSLMultiFit & rhs)  {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+
+public:
+
+   /// create the minimizer from the type and size of number of fitting points and number of parameters
+   void CreateSolver(unsigned int npoints, unsigned int npar) {
+      if (fSolver) gsl_multifit_fdfsolver_free(fSolver);
+      fSolver = gsl_multifit_fdfsolver_alloc(fType, npoints, npar);
+   }
+
+   /// set the solver parameters
+   template<class Func>
+   int Set(const std::vector<Func> & funcVec, const double * x) {
+      // create a vector of the fit contributions
+      // create function wrapper from an iterator of functions
+      unsigned int npts = funcVec.size();
+      if (npts == 0) return -1;
+
+      unsigned int npar = funcVec[0].NDim();
+      // Remove unused typedef to remove warning in GCC48
+      // http://gcc.gnu.org/gcc-4.8/porting_to.html
+      // typedef typename std::vector<Func>  FuncVec;
+      //FuncIt funcIter = funcVec.begin();
+      fFunc.SetFunction(funcVec, npts, npar);
+      // create solver object
+      CreateSolver( npts, npar );
+      // set initial values
+      if (fVec != 0) gsl_vector_free(fVec);
+      fVec = gsl_vector_alloc( npar );
+      std::copy(x,x+npar, fVec->data);
+      assert(fSolver != 0);
+      return gsl_multifit_fdfsolver_set(fSolver, fFunc.GetFunc(), fVec);
+   }
+
+   std::string Name() const {
+      if (fSolver == 0) return "undefined";
+      return std::string(gsl_multifit_fdfsolver_name(fSolver) );
+   }
+
+   int Iterate() {
+      if (fSolver == 0) return -1;
+      return gsl_multifit_fdfsolver_iterate(fSolver);
+   }
+
+   /// parameter values at the minimum
+   const double * X() const {
+      if (fSolver == 0) return 0;
+      gsl_vector * x =  gsl_multifit_fdfsolver_position(fSolver);
+      return x->data;
+   }
+
+   /// gradient value at the minimum
+   const double * Gradient() const {
+      if (fSolver == 0) return 0;
+#if GSL_MAJOR_VERSION  > 1
+      fType->gradient(fSolver->state, fVec);
+#else
+      gsl_multifit_gradient(fSolver->J, fSolver->f,fVec);
+#endif
+      return fVec->data;
+   }
+
+   /// return covariance matrix of the parameters
+   const double * CovarMatrix() const {
+      if (fSolver == 0) return 0;
+      if (fCov != 0) gsl_matrix_free(fCov);
+      unsigned int npar = fSolver->fdf->p;
+      fCov = gsl_matrix_alloc( npar, npar );
+      static double kEpsrel = 0.0001;
+#if GSL_MAJOR_VERSION > 1
+      gsl_matrix* J = gsl_matrix_alloc(npar,npar);
+      gsl_multifit_fdfsolver_jac (fSolver, J);
+      int ret = gsl_multifit_covar(J, kEpsrel, fCov);
+      gsl_matrix_free(J);
+#else
+      int ret = gsl_multifit_covar(fSolver->J, kEpsrel, fCov);
+#endif
+      if (ret != GSL_SUCCESS) return 0;
+      return fCov->data;
+   }
+
+   /// test gradient (ask from solver gradient vector)
+   int TestGradient(double absTol) const {
+      if (fSolver == 0) return -1;
+      Gradient();
+      return gsl_multifit_test_gradient( fVec, absTol);
+   }
+
+   /// test using abs and relative tolerance
+   ///  |dx| < absTol + relTol*|x| for every component
+   int TestDelta(double absTol, double relTol) const {
+      if (fSolver == 0) return -1;
+      return gsl_multifit_test_delta(fSolver->dx, fSolver->x, absTol, relTol);
+   }
+
+   // calculate edm  1/2 * ( grad^T * Cov * grad )
+   double Edm() const {
+      // product C * g
+      double edm = -1;
+      const double * g = Gradient();
+      if (g == 0) return edm;
+      const double * c = CovarMatrix();
+      if (c == 0) return edm;
+      gsl_vector * tmp = gsl_vector_alloc( fSolver->fdf->p );
+      int status =   gsl_blas_dgemv(CblasNoTrans, 1.0, fCov, fVec, 0.,tmp);
+      if (status == 0) status |= gsl_blas_ddot(fVec, tmp, &edm);
+      gsl_vector_free(tmp);
+      if (status != 0) return -1;
+      // need to divide by 2 ??
+      return 0.5*edm;
+
+   }
+
+
+private:
+
+   GSLMultiFitFunctionWrapper fFunc;
+   gsl_multifit_fdfsolver * fSolver;
+   // cached vector to avoid re-allocating every time a new one
+   mutable gsl_vector * fVec;
+   mutable gsl_matrix * fCov;
+   const gsl_multifit_fdfsolver_type * fType;
+
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_GSLMultiFit */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFitFunctionAdapter.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFitFunctionAdapter.h
new file mode 100644
index 0000000..d4143d1
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFitFunctionAdapter.h
@@ -0,0 +1,131 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, Dec 2006
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLMultiMinFunctionAdapter
+//
+// Generic adapter for gsl_multimin_function signature
+// usable for any c++ class which defines operator( )
+//
+// Created by: Lorenzo Moneta  at Fri Nov 12 16:58:51 2004
+//
+// Last update: Fri Nov 12 16:58:51 2004
+//
+#ifndef ROOT_Math_GSLMultiFitFunctionAdapter
+#define ROOT_Math_GSLMultiFitFunctionAdapter
+
+#include "gsl/gsl_vector.h"
+#include "gsl/gsl_matrix.h"
+
+#include <cassert>
+
+#include <iostream>
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+  /**
+     Class for adapting a C++ functor class to C function pointers used by GSL MultiFit
+     Algorithm
+     The templated C++ function class must implement:
+
+    <em> double operator( const double *  x)</em>
+    and if the derivatives are required:
+    <em> void Gradient( const double *   x, double * g)</em>
+    and
+    <em> void FdF( const double *   x, double &f, double * g)</em>
+
+    This class defines static methods with will be used to fill the
+    \a gsl_multimin_function and
+    \a gsl_multimin_function_fdf structs used by GSL.
+    See for examples the
+    <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Providing-a-function-to-minimize.html#Providing-a-function-to-minimize">GSL online manual</A>
+
+   @ingroup MultiMin
+  */
+
+
+template<class FuncVector>
+class GSLMultiFitFunctionAdapter {
+
+public:
+
+   static int F( const gsl_vector * x, void * p, gsl_vector * f ) {
+      // p is a pointer to an iterator of functions
+      unsigned int n = f->size;
+      // need to copy iterator otherwise next time the function is called it wont work
+      FuncVector  & funcVec = *( reinterpret_cast< FuncVector *> (p) );
+      if (n == 0) return -1;
+      for (unsigned int i = 0; i < n ; ++i) {
+         gsl_vector_set(f, i, (funcVec[i])(x->data) );
+      }
+      return 0;
+   }
+
+
+   static int Df(  const gsl_vector * x, void * p, gsl_matrix * h) {
+
+      // p is a pointer to an iterator of functions
+      unsigned int n = h->size1;
+      unsigned int npar = h->size2;
+      if (n == 0) return -1;
+      if (npar == 0) return -2;
+      FuncVector  & funcVec = *( reinterpret_cast< FuncVector *> (p) );
+      for (unsigned int i = 0; i < n ; ++i) {
+         double * g = (h->data)+i*npar;   //pointer to start  of i-th row
+         assert ( npar == (funcVec[i]).NDim() );
+         (funcVec[i]).Gradient(x->data, g);
+      }
+      return 0;
+   }
+
+   /// evaluate derivative and function at the same time
+   static int FDf(  const gsl_vector * x, void * p,  gsl_vector * f, gsl_matrix * h) {
+      // should be implemented in the function
+      // p is a pointer to an iterator of functions
+      unsigned int n = h->size1;
+      unsigned int npar = h->size2;
+      if (n == 0) return -1;
+      if (npar == 0) return -2;
+      FuncVector  & funcVec = *( reinterpret_cast< FuncVector *> (p) );
+      assert ( f->size == n);
+      for (unsigned int i = 0; i < n ; ++i) {
+         assert ( npar == (funcVec[i]).NDim() );
+         double fval = 0;
+         double * g = (h->data)+i*npar;   //pointer to start  of i-th row
+         (funcVec[i]).FdF(x->data, fval, g);
+         gsl_vector_set(f, i, fval  );
+      }
+      return 0;
+   }
+
+};
+
+
+} // namespace Math
+} // namespace ROOT
+
+
+#endif /* ROOT_Math_GSLMultiMinFunctionAdapter */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFitFunctionWrapper.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFitFunctionWrapper.h
new file mode 100644
index 0000000..eeb1066
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiFitFunctionWrapper.h
@@ -0,0 +1,100 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta Dec 2006
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLMultiMinFunctionWrapper
+//
+// Created by: moneta  at Sat Nov 13 14:54:41 2004
+//
+// Last update: Sat Nov 13 14:54:41 2004
+//
+#ifndef ROOT_Math_GSLMultiFitFunctionWrapper
+#define ROOT_Math_GSLMultiFitFunctionWrapper
+
+#include "gsl/gsl_multifit.h"
+
+#include "GSLMultiFitFunctionAdapter.h"
+
+
+#include <cassert>
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+   typedef double ( * GSLMultiFitFPointer ) ( const gsl_vector *, void *, gsl_vector *);
+   typedef void   ( * GSLMultiFitDfPointer )   ( const gsl_vector *, void *, gsl_matrix *);
+   typedef void   ( * GSLMultiFitFdfPointer ) ( const gsl_vector *, void *, gsl_vector *, gsl_matrix *);
+
+
+/**
+   wrapper to a multi-dim function withtout  derivatives for multi-dimensional
+   minimization algorithm
+
+   @ingroup MultiMin
+*/
+
+class GSLMultiFitFunctionWrapper {
+
+public:
+
+   GSLMultiFitFunctionWrapper()
+   {
+      fFunc.f = 0;
+      fFunc.df = 0;
+      fFunc.fdf = 0;
+      fFunc.n = 0;
+      fFunc.p = 0;
+      fFunc.params = 0;
+   }
+
+
+   /// Fill gsl function structure from a C++ function iterator and size and number of residuals
+   template<class FuncVector>
+   void SetFunction(const FuncVector & f, unsigned int nres, unsigned int npar  ) {
+      const void * p = &f;
+      assert (p != 0);
+      fFunc.f   = &GSLMultiFitFunctionAdapter<FuncVector >::F;
+      fFunc.df  = &GSLMultiFitFunctionAdapter<FuncVector >::Df;
+      fFunc.fdf = &GSLMultiFitFunctionAdapter<FuncVector >::FDf;
+      fFunc.n = nres;
+      fFunc.p = npar;
+      fFunc.params =  const_cast<void *>(p);
+   }
+
+   gsl_multifit_function_fdf * GetFunc() { return &fFunc; }
+
+
+  private:
+
+   gsl_multifit_function_fdf fFunc;
+
+};
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+#endif /* ROOT_Math_GSLMultiMinFunctionWrapper */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinFunctionAdapter.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinFunctionAdapter.h
new file mode 100644
index 0000000..a600220
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinFunctionAdapter.h
@@ -0,0 +1,99 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, 12/2006
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLMultiMinFunctionAdapter
+//
+// Generic adapter for gsl_multimin_function signature
+// usable for any c++ class which defines operator( )
+//
+// Created by: Lorenzo Moneta  at Fri Nov 12 16:58:51 2004
+//
+// Last update: Fri Nov 12 16:58:51 2004
+//
+#ifndef ROOT_Math_GSLMultiMinFunctionAdapter
+#define ROOT_Math_GSLMultiMinFunctionAdapter
+
+#include "gsl/gsl_vector.h"
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+
+  /**
+     Class for adapting any multi-dimension C++ functor class to C function pointers used by
+     GSL MultiMin algorithms.
+     The templated C++ function class must implement:
+
+    <em> double operator( const double *  x)</em>
+    and if the derivatives are required:
+    <em> void Gradient( const double *   x, double * g)</em>
+
+    This class defines static methods with will be used to fill the
+    \a gsl_multimin_function and
+    \a gsl_multimin_function_fdf structs used by GSL.
+    See for examples the
+    <A HREF="http://www.gnu.org/software/gsl/manual/html_node/Providing-a-function-to-minimize.html#Providing-a-function-to-minimize">GSL online manual</A>
+
+   @ingroup MultiMin
+
+  */
+
+
+  template<class UserFunc>
+  struct  GSLMultiMinFunctionAdapter {
+
+    static double F( const gsl_vector * x, void * p) {
+
+      UserFunc * function = reinterpret_cast< UserFunc *> (p);
+      // get pointer to data from gsl_vector
+      return (*function)( x->data );
+    }
+
+
+    static void Df(  const gsl_vector * x, void * p,  gsl_vector * g) {
+
+      UserFunc * function = reinterpret_cast< UserFunc *> (p);
+      (*function).Gradient( x->data, g->data );
+
+    }
+
+    static void Fdf( const gsl_vector * x, void * p, double *f, gsl_vector * g ) {
+
+      UserFunc * function = reinterpret_cast< UserFunc *> (p);
+//       *f  = (*function) ( x );
+//       *df = (*function).Gradient( x );
+
+      (*function).FdF( x->data, *f, g->data);
+    }
+
+  };
+
+
+} // namespace Math
+} // namespace ROOT
+
+
+#endif /* ROOT_Math_GSLMultiMinFunctionAdapter */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinFunctionWrapper.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinFunctionWrapper.h
new file mode 100644
index 0000000..11e100e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinFunctionWrapper.h
@@ -0,0 +1,163 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, 12/2006
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLMultiMinFunctionWrapper
+//
+// Created by: moneta  at Sat Nov 13 14:54:41 2004
+//
+// Last update: Sat Nov 13 14:54:41 2004
+//
+#ifndef ROOT_Math_GSLMultiMinFunctionWrapper
+#define ROOT_Math_GSLMultiMinFunctionWrapper
+
+#include "gsl/gsl_multimin.h"
+
+#include "GSLMultiMinFunctionAdapter.h"
+
+
+#include <cassert>
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+   typedef double ( * GSLMultiMinFuncPointer ) ( const gsl_vector *, void *);
+   typedef void   ( * GSLMultiMinDfPointer )   ( const gsl_vector *, void *, gsl_vector *);
+   typedef void   ( * GSLMultiMinFdfPointer ) ( const gsl_vector *, void *, double *, gsl_vector *);
+
+
+/**
+   wrapper to a multi-dim function withtout  derivatives for multi-dimensional
+   minimization algorithm
+
+   @ingroup MultiMin
+*/
+
+class GSLMultiMinFunctionWrapper {
+
+public:
+
+   GSLMultiMinFunctionWrapper()
+   {
+      fFunc.f = 0;
+      fFunc.n = 0;
+      fFunc.params = 0;
+   }
+
+   void SetFuncPointer( GSLMultiMinFuncPointer f) { fFunc.f = f; }
+   void SetDim  ( unsigned int n ) { fFunc.n = n; }
+   void SetParams ( void * p) { fFunc.params = p; }
+
+   /// Fill gsl function structure from a C++ Function class
+   template<class FuncType>
+   void SetFunction(const FuncType &f) {
+      const void * p = &f;
+      assert (p != 0);
+      SetFuncPointer(&GSLMultiMinFunctionAdapter<FuncType >::F);
+      SetDim( f.NDim() );
+      SetParams(const_cast<void *>(p));
+   }
+
+   gsl_multimin_function * GetFunc() { return &fFunc; }
+
+    bool IsValid() {
+       return (fFunc.f != 0) ? true : false;
+    }
+
+
+  private:
+
+    gsl_multimin_function fFunc;
+
+  };
+
+
+/**
+   Wrapper for a multi-dimensional function with derivatives used in GSL multidim
+   minimization algorithm
+
+   @ingroup MultiMin
+
+ */
+ class GSLMultiMinDerivFunctionWrapper {
+
+ public:
+
+    GSLMultiMinDerivFunctionWrapper()
+    {
+       fFunc.f = 0;
+       fFunc.df = 0;
+       fFunc.fdf = 0;
+       fFunc.n = 0;
+       fFunc.params = 0;
+    }
+
+
+    void SetFuncPointer( GSLMultiMinFuncPointer f) { fFunc.f = f; }
+    void SetDerivPointer( GSLMultiMinDfPointer f) { fFunc.df = f; }
+    void SetFdfPointer( GSLMultiMinFdfPointer f) { fFunc.fdf = f; }
+    void SetDim  ( unsigned int n ) { fFunc.n = n; }
+    void SetParams ( void * p) { fFunc.params = p; }
+
+    /// Fill gsl function structure from a C++ Function class
+    template<class FuncType>
+    void SetFunction(const FuncType &f) {
+       const void * p = &f;
+       assert (p != 0);
+       SetFuncPointer(&GSLMultiMinFunctionAdapter<FuncType >::F);
+       SetDerivPointer(&GSLMultiMinFunctionAdapter<FuncType >::Df);
+       SetFdfPointer(&GSLMultiMinFunctionAdapter<FuncType >::Fdf);
+       SetDim( f.NDim() );
+       SetParams(const_cast<void *>(p));
+     }
+
+    gsl_multimin_function_fdf * GetFunc() { return &fFunc; }
+
+#ifdef NEEDED_LATER
+    // evaluate the function
+    double operator() (const double * x) {
+       // vx must be a gsl_vector
+       return GSL_MULTIMIN_FN_EVAL(&fFunc, vx);
+    }
+#endif
+
+   /// check if function is valid (has been set)
+    bool IsValid() {
+       return (fFunc.f != 0) ? true : false;
+    }
+
+ private:
+
+    gsl_multimin_function_fdf fFunc;
+
+  };
+
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+#endif /* ROOT_Math_GSLMultiMinFunctionWrapper */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinimizer.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinimizer.h
new file mode 100644
index 0000000..d1755ed
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLMultiMinimizer.h
@@ -0,0 +1,214 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Tue Dec 19 14:09:15 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class GSLMultiMinimizer
+
+#ifndef ROOT_Math_GSLMultiMinimizer
+#define ROOT_Math_GSLMultiMinimizer
+
+#include "gsl/gsl_vector.h"
+#include "gsl/gsl_multimin.h"
+#include "gsl/gsl_version.h"
+#include "GSLMultiMinFunctionWrapper.h"
+
+#include "Math/Error.h"
+
+#include "Math/IFunction.h"
+
+#include <cassert>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+/**
+   GSLMultiMinimizer class , for minimizing multi-dimensional function
+   using derivatives
+
+   @ingroup MultiMin
+
+*/
+class GSLMultiMinimizer {
+
+public:
+
+   /**
+      Default constructor
+   */
+   GSLMultiMinimizer (BA_ROOT::Math::EGSLMinimizerType type)  :
+      fMinimizer(0),
+      fType(0),
+      fVec(0)
+   {
+      switch(type)
+      {
+      case BA_ROOT::Math::kConjugateFR :
+         fType = gsl_multimin_fdfminimizer_conjugate_fr;
+         break;
+      case BA_ROOT::Math::kConjugatePR :
+         fType = gsl_multimin_fdfminimizer_conjugate_pr;
+         break;
+      case BA_ROOT::Math::kVectorBFGS :
+         fType = gsl_multimin_fdfminimizer_vector_bfgs;
+         break;
+      case BA_ROOT::Math::kVectorBFGS2 :
+#if (GSL_MAJOR_VERSION > 1) || ((GSL_MAJOR_VERSION == 1) && (GSL_MINOR_VERSION >= 9))
+         // bfgs2 is available only for v>= 1.9
+         fType = gsl_multimin_fdfminimizer_vector_bfgs2;
+#else
+         MATH_INFO_MSG("GSLMultiMinimizer","minimizer BFSG2 does not exist with this GSL version , use BFGS");
+         fType = gsl_multimin_fdfminimizer_vector_bfgs;
+#endif
+         break;
+      case BA_ROOT::Math::kSteepestDescent:
+         fType = gsl_multimin_fdfminimizer_steepest_descent;
+         break;
+      default:
+         fType = gsl_multimin_fdfminimizer_conjugate_fr;
+         break;
+      }
+
+   }
+
+   /**
+      Destructor
+   */
+   ~GSLMultiMinimizer ()  {
+      if (fMinimizer != 0 ) gsl_multimin_fdfminimizer_free(fMinimizer);
+      // can free vector (is copied inside)
+      if (fVec != 0) gsl_vector_free(fVec);
+   }
+
+private:
+   // usually copying is non trivial, so we make this unaccessible
+
+   /**
+      Copy constructor
+   */
+   GSLMultiMinimizer(const GSLMultiMinimizer &) {}
+
+   /**
+      Assignment operator
+   */
+   GSLMultiMinimizer & operator = (const GSLMultiMinimizer & rhs)  {
+      if (this == &rhs) return *this;  // time saving self-test
+      return *this;
+   }
+
+public:
+
+   /**
+      set the function to be minimize the initial minimizer parameters,
+      step size and tolerance in the line search
+    */
+   int Set(const BA_ROOT::Math::IMultiGradFunction & func, const double * x, double stepSize, double tol) {
+      // create function wrapper
+      fFunc.SetFunction(func);
+      // create minimizer object (free previous one if already existing)
+      unsigned int ndim = func.NDim();
+      CreateMinimizer( ndim );
+      // set initial values
+      if (fVec != 0) gsl_vector_free(fVec);
+      fVec = gsl_vector_alloc( ndim );
+      std::copy(x,x+ndim, fVec->data);
+      assert(fMinimizer != 0);
+      return gsl_multimin_fdfminimizer_set(fMinimizer, fFunc.GetFunc(), fVec, stepSize, tol);
+   }
+
+   /// create the minimizer from the type and size
+   void CreateMinimizer(unsigned int n) {
+      if (fMinimizer) gsl_multimin_fdfminimizer_free(fMinimizer);
+      fMinimizer = gsl_multimin_fdfminimizer_alloc(fType, n);
+   }
+
+   std::string Name() const {
+      if (fMinimizer == 0) return "undefined";
+      return std::string(gsl_multimin_fdfminimizer_name(fMinimizer) );
+   }
+
+   int Iterate() {
+      if (fMinimizer == 0) return -1;
+      return gsl_multimin_fdfminimizer_iterate(fMinimizer);
+   }
+
+   /// x values at the minimum
+   double * X() const {
+      if (fMinimizer == 0) return 0;
+      gsl_vector * x =  gsl_multimin_fdfminimizer_x(fMinimizer);
+      return x->data;
+   }
+
+   /// function value at the minimum
+   double Minimum() const {
+      if (fMinimizer == 0) return 0;
+      return gsl_multimin_fdfminimizer_minimum(fMinimizer);
+   }
+
+   /// gradient value at the minimum
+   double * Gradient() const {
+      if (fMinimizer == 0) return 0;
+      gsl_vector * g =  gsl_multimin_fdfminimizer_gradient(fMinimizer);
+      return g->data;
+   }
+
+   /// restart minimization from current point
+   int Restart() {
+      if (fMinimizer == 0) return -1;
+      return gsl_multimin_fdfminimizer_restart(fMinimizer);
+   }
+
+   /// test gradient (ask from minimizer gradient vector)
+   int TestGradient(double absTol) const {
+      if (fMinimizer == 0) return -1;
+      gsl_vector * g =  gsl_multimin_fdfminimizer_gradient(fMinimizer);
+      return gsl_multimin_test_gradient( g, absTol);
+   }
+
+   /// test gradient (require a vector gradient)
+   int TestGradient(const double * g, double absTol) const {
+      if (fVec == 0 ) return -1;
+      unsigned int n = fVec->size;
+      if (n == 0 ) return -1;
+      std::copy(g,g+n, fVec->data);
+      return gsl_multimin_test_gradient( fVec, absTol);
+   }
+
+
+private:
+
+   gsl_multimin_fdfminimizer * fMinimizer;
+   GSLMultiMinDerivFunctionWrapper fFunc;
+   const gsl_multimin_fdfminimizer_type * fType;
+   // cached vector to avoid re-allocating every time a new one
+   mutable gsl_vector * fVec;
+
+};
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_GSLMultiMinimizer */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLRndmEngines.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/GSLRndmEngines.cxx
new file mode 100644
index 0000000..f5214b3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLRndmEngines.cxx
@@ -0,0 +1,414 @@
+// @(#)root/mathmore:$Id$
+// Authors: L. Moneta, A. Zsenei   08/2005
+
+ /**********************************************************************
+  *                                                                    *
+  * Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
+  *                                                                    *
+  * This library is free software; you can redistribute it and/or      *
+  * modify it under the terms of the GNU General Public License        *
+  * as published by the Free Software Foundation; either version 2     *
+  * of the License, or (at your option) any later version.             *
+  *                                                                    *
+  * This library is distributed in the hope that it will be useful,    *
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+  * General Public License for more details.                           *
+  *                                                                    *
+  * You should have received a copy of the GNU General Public License  *
+  * along with this library (see file COPYING); if not, write          *
+  * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+  * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+  *                                                                    *
+  **********************************************************************/
+
+// Header file for class GSLRandom
+//
+// Created by: moneta  at Sun Nov 21 16:26:03 2004
+//
+// Last update: Sun Nov 21 16:26:03 2004
+//
+
+
+
+// need to be included later
+#include <time.h>
+#include <stdlib.h>
+#include <cassert>
+
+#include "gsl/gsl_rng.h"
+#include "gsl/gsl_randist.h"
+
+
+#include "Math/GSLRndmEngines.h"
+#include "GSLRngWrapper.h"
+
+extern double gsl_ran_gaussian_acr(  const gsl_rng * r, const double sigma);
+
+//#include <iostream>
+
+namespace BA_ROOT {
+namespace Math {
+
+
+
+
+
+  // default constructor (need to call set type later)
+   GSLRandomEngine::GSLRandomEngine() :
+      fRng(0 ),
+      fCurTime(0)
+  { }
+
+   // constructor from external rng
+   // internal generator will be managed or not depending on
+   // how the GSLRngWrapper is created
+   GSLRandomEngine::GSLRandomEngine( GSLRngWrapper * rng) :
+      fRng(new GSLRngWrapper(*rng) ),
+      fCurTime(0)
+   {}
+
+   // copy constructor
+   GSLRandomEngine::GSLRandomEngine(const GSLRandomEngine & eng) :
+      fRng(new GSLRngWrapper(*eng.fRng) ),
+      fCurTime(0)
+   {}
+
+   GSLRandomEngine::~GSLRandomEngine() {
+      // destructor : call terminate if not yet called
+      if (fRng) Terminate();
+   }
+
+   // assignment operator
+   GSLRandomEngine & GSLRandomEngine::operator=(const GSLRandomEngine & eng) {
+      if (this == &eng) return *this;
+      if (fRng)
+         *fRng = *eng.fRng;
+      else
+         fRng = new GSLRngWrapper(*eng.fRng);
+      fCurTime = eng.fCurTime;
+      return *this;
+   }
+
+
+   void GSLRandomEngine::Initialize() {
+      // initialize the generator by allocating the GSL object
+      // if type was not passed create with default generator
+      if (!fRng) fRng = new GSLRngWrapper();
+      fRng->Allocate();
+   }
+
+   void GSLRandomEngine::Terminate() {
+      // terminate the generator by freeing the GSL object
+      if (!fRng) return;
+      fRng->Free();
+      delete fRng;
+      fRng = 0;
+   }
+
+
+   double GSLRandomEngine::operator() () const {
+      // generate random between 0 and 1.
+      // 0 is excluded
+      return gsl_rng_uniform_pos(fRng->Rng() );
+   }
+
+
+   unsigned int GSLRandomEngine::RndmInt(unsigned int max) const {
+      // generate a random integer number between 0  and MAX
+      return gsl_rng_uniform_int( fRng->Rng(), max );
+   }
+
+//    int GSLRandomEngine::GetMin() {
+//       // return minimum integer value used in RndmInt
+//       return gsl_rng_min( fRng->Rng() );
+//    }
+
+//    int GSLRandomEngine::GetMax() {
+//       // return maximum integr value used in RndmInt
+//       return gsl_rng_max( fRng->Rng() );
+//    }
+
+   void GSLRandomEngine::RandomArray(double * begin, double * end )  const {
+      // generate array of randoms betweeen 0 and 1. 0 is excluded
+      // specialization for double * (to be faster)
+      for ( double * itr = begin; itr != end; ++itr ) {
+         *itr = gsl_rng_uniform_pos(fRng->Rng() );
+      }
+   }
+
+   void GSLRandomEngine::SetSeed(unsigned int seed) const  {
+      // set the seed, if = 0then the seed is set randomly using an std::rand()
+      // seeded with the current time. Be carefuk in case the current time is
+      // the same in consecutive calls
+      if (seed == 0) {
+         // use like in root (use time)
+         time_t curtime;
+         time(&curtime);
+         unsigned int ct = static_cast<unsigned int>(curtime);
+         if (ct != fCurTime) {
+            fCurTime = ct;
+            // set the seed for rand
+            srand(ct);
+         }
+         seed = rand();
+      }
+
+      assert(fRng);
+      gsl_rng_set(fRng->Rng(), seed );
+   }
+
+   std::string GSLRandomEngine::Name() const {
+      //////////////////////////////////////////////////////////////////////////
+
+      assert ( fRng != 0);
+      assert ( fRng->Rng() != 0 );
+      return std::string( gsl_rng_name( fRng->Rng() ) );
+   }
+
+   unsigned int GSLRandomEngine::Size() const {
+      //////////////////////////////////////////////////////////////////////////
+
+      assert (fRng != 0);
+      return gsl_rng_size( fRng->Rng() );
+   }
+
+
+   // Random distributions
+
+   double GSLRandomEngine::GaussianZig(double sigma)  const
+   {
+      // Gaussian distribution. Use fast ziggurat algorithm implemented since GSL 1.8
+      return gsl_ran_gaussian_ziggurat(  fRng->Rng(), sigma);
+   }
+
+   double GSLRandomEngine::Gaussian(double sigma)  const
+   {
+      // Gaussian distribution. Use default Box-Muller method
+      return gsl_ran_gaussian(  fRng->Rng(), sigma);
+   }
+
+   double GSLRandomEngine::GaussianRatio(double sigma)  const
+   {
+      // Gaussian distribution. Use ratio method
+      return gsl_ran_gaussian_ratio_method(  fRng->Rng(), sigma);
+   }
+
+
+   double GSLRandomEngine::GaussianTail(double a , double sigma) const
+   {
+      // Gaussian Tail distribution: eeturn values larger than a distributed
+      // according to the gaussian
+      return gsl_ran_gaussian_tail(  fRng->Rng(), a, sigma);
+   }
+
+   void GSLRandomEngine::Gaussian2D(double sigmaX, double sigmaY, double rho, double &x, double &y) const
+   {
+      // Gaussian Bivariate distribution, with correlation coefficient rho
+      gsl_ran_bivariate_gaussian(  fRng->Rng(), sigmaX, sigmaY, rho, &x, &y);
+   }
+
+   double GSLRandomEngine::Exponential(double mu)  const
+   {
+      // Exponential distribution
+      return gsl_ran_exponential(  fRng->Rng(), mu);
+   }
+
+   double GSLRandomEngine::Cauchy(double a) const
+   {
+      // Cauchy distribution
+      return gsl_ran_cauchy(  fRng->Rng(), a);
+   }
+
+   double GSLRandomEngine::Landau() const
+   {
+      // Landau distribution
+      return gsl_ran_landau(  fRng->Rng());
+   }
+
+   double GSLRandomEngine::Gamma(double a, double b) const
+   {
+      // Gamma distribution
+      return gsl_ran_gamma(  fRng->Rng(), a, b);
+   }
+
+   double GSLRandomEngine::LogNormal(double zeta, double sigma) const
+   {
+      // Log normal distribution
+      return gsl_ran_lognormal(  fRng->Rng(), zeta, sigma);
+   }
+
+   double GSLRandomEngine::ChiSquare(double nu) const
+   {
+      // Chi square distribution
+      return gsl_ran_chisq(  fRng->Rng(), nu);
+   }
+
+
+   double GSLRandomEngine::FDist(double nu1, double nu2)  const
+   {
+      // F distribution
+      return gsl_ran_fdist(  fRng->Rng(), nu1, nu2);
+   }
+
+   double GSLRandomEngine::tDist(double nu)  const
+   {
+      // t distribution
+      return gsl_ran_tdist(  fRng->Rng(), nu);
+   }
+
+   void GSLRandomEngine::Dir2D(double &x, double &y) const
+   {
+      // generate random numbers in a 2D circle of radious 1
+      gsl_ran_dir_2d(  fRng->Rng(), &x, &y);
+   }
+
+   void GSLRandomEngine::Dir3D(double &x, double &y, double &z) const
+   {
+      // generate random numbers in a 3D sphere of radious 1
+      gsl_ran_dir_3d(  fRng->Rng(), &x, &y, &z);
+   }
+
+   unsigned int GSLRandomEngine::Poisson(double mu) const
+   {
+      // Poisson distribution
+      return gsl_ran_poisson(  fRng->Rng(), mu);
+   }
+
+   unsigned int GSLRandomEngine::Binomial(double p, unsigned int n) const
+   {
+      // Binomial distribution
+      return gsl_ran_binomial(  fRng->Rng(), p, n);
+   }
+
+   unsigned int GSLRandomEngine::NegativeBinomial(double p, double n) const
+   {
+      // Negative Binomial distribution
+      return gsl_ran_negative_binomial(  fRng->Rng(), p, n);
+   }
+
+
+   std::vector<unsigned int>  GSLRandomEngine::Multinomial( unsigned int ntot, const std::vector<double> & p ) const
+   {
+      // Multinomial distribution  return vector of integers which sum is ntot
+      std::vector<unsigned int> ival( p.size());
+      gsl_ran_multinomial(  fRng->Rng(), p.size(), ntot, &p.front(), &ival[0]);
+      return ival;
+   }
+
+
+
+   //----------------------------------------------------
+   // generators
+   //----------------------------------------------------
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngMT::GSLRngMT() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_mt19937));
+      Initialize(); 
+   }
+
+
+   // old ranlux - equivalent to TRandom1
+   GSLRngRanLux::GSLRngRanLux() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_ranlux) );
+      Initialize(); 
+   }
+
+   // second generation of Ranlux (single precision version - luxury 1)
+   GSLRngRanLuxS1::GSLRngRanLuxS1() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_ranlxs1) );
+      Initialize(); 
+   }
+
+   // second generation of Ranlux (single precision version - luxury 2)
+   GSLRngRanLuxS2::GSLRngRanLuxS2() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_ranlxs2) );
+      Initialize(); 
+   }
+
+   // double precision  version - luxury 1
+   GSLRngRanLuxD1::GSLRngRanLuxD1() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_ranlxd1) );
+      Initialize(); 
+   }
+
+   // double precision  version - luxury 2
+   GSLRngRanLuxD2::GSLRngRanLuxD2() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_ranlxd2) );
+      Initialize(); 
+   }
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngTaus::GSLRngTaus() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_taus2) );
+      Initialize(); 
+   }
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngGFSR4::GSLRngGFSR4() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_gfsr4) );
+      Initialize(); 
+   }
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngCMRG::GSLRngCMRG() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_cmrg) );
+      Initialize(); 
+   }
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngMRG::GSLRngMRG() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_mrg) );
+      Initialize(); 
+   }
+
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngRand::GSLRngRand() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_rand) );
+      Initialize(); 
+   }
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngRanMar::GSLRngRanMar() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_ranmar) );
+      Initialize(); 
+   }
+
+   /////////////////////////////////////////////////////////////////////////////
+
+   GSLRngMinStd::GSLRngMinStd() : GSLRandomEngine()
+   {
+      SetType(new GSLRngWrapper(gsl_rng_minstd) );
+      Initialize(); 
+   }
+
+
+
+
+
+} // namespace Math
+} // namespace ROOT
+
+
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLRngWrapper.h b/ThirdParty/Fit/RootMinimizers/src/Math/GSLRngWrapper.h
new file mode 100644
index 0000000..95308d8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLRngWrapper.h
@@ -0,0 +1,144 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Fri Aug 24 17:20:45 2007
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Header file for class GSLRngWrapper
+
+#ifndef ROOT_Math_GSLRngWrapper
+#define ROOT_Math_GSLRngWrapper
+
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+/**
+   GSLRngWrapper class to wrap gsl_rng structure
+*/
+class GSLRngWrapper {
+
+public:
+
+
+   /**
+      Default constructor
+   */
+   GSLRngWrapper () :
+      fOwn(0),
+      fRng(0),
+      fRngType(0)
+    {
+    }
+
+   /**
+      Constructor with type
+   */
+   GSLRngWrapper(const gsl_rng_type * type) :
+      fOwn(1),
+      fRng(0),
+      fRngType(type)
+    {
+    }
+
+   /**
+       construct from an existing gsl_rng
+       it is managed externally - so will not be deleted at the end
+   */
+   GSLRngWrapper(const gsl_rng * r ) :
+      fOwn(0),
+      fRngType(0)
+    {
+       fRng = const_cast<gsl_rng *>(r);
+    }
+
+   /**
+      Copy constructor - clone the GSL object and manage it
+   */
+   GSLRngWrapper(GSLRngWrapper & r) :
+      fOwn(1),
+      fRngType(r.fRngType)
+   {
+      fRng = gsl_rng_clone(r.fRng);
+   }
+
+   /**
+      Assignment operator
+   */
+   GSLRngWrapper & operator = (const GSLRngWrapper & rhs)  {
+      if (this == &rhs) return *this;  // time saving self-test
+      fRngType = rhs.fRngType;
+      int iret = 0;
+      if (fRngType == rhs.fRngType) {
+         iret = gsl_rng_memcpy(fRng, rhs.fRng);
+         if (!iret) return *this;
+      }
+      // otherwise create a new copy
+      if (fOwn) Free();
+      fRng = gsl_rng_clone(rhs.fRng);
+      fOwn = true;
+      return *this;
+   }
+
+   /**
+      Destructor  (free the rng if not done before)
+    */
+    ~GSLRngWrapper() {
+       if (fOwn) Free();
+    }
+
+    void Allocate() {
+      if (fRngType == 0) SetDefaultType();
+      if (fRng != 0 && fOwn) Free();
+      fRng = gsl_rng_alloc( fRngType );
+      //std::cout << " allocate   " << fRng <<  std::endl;
+    }
+
+    void Free() {
+       if (!fOwn) return; // no operation if pointer is not own
+      //std::cout << "free gslrng " << fRngType <<  "  " << fRng <<  std::endl;
+      if (fRng != 0) gsl_rng_free(fRng);
+      fRng = 0;
+    }
+
+
+    void SetType(const gsl_rng_type * type) {
+      fRngType = type;
+    }
+
+    void SetDefaultType() {
+      // construct default engine
+      gsl_rng_env_setup();
+      fRngType =  gsl_rng_default;
+    }
+
+   void PrintState() const {
+      gsl_rng_print_state(fRng);
+   }
+
+    inline gsl_rng * Rng()  { return fRng; }
+
+    inline const gsl_rng * Rng() const { return fRng; }
+
+
+
+private:
+
+   bool fOwn; // ownership of contained pointer
+   gsl_rng * fRng;
+   const gsl_rng_type * fRngType;
+};
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
+
+#endif /* ROOT_Math_GSLRngWrapper */
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GSLSimAnnealing.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/GSLSimAnnealing.cxx
new file mode 100644
index 0000000..023a0cb
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GSLSimAnnealing.cxx
@@ -0,0 +1,240 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Thu Jan 25 11:13:48 2007
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Implementation file for class GSLSimAnnealing
+
+#include "Math/GSLSimAnnealing.h"
+
+#include "gsl/gsl_siman.h"
+
+#include "Math/IFunction.h"
+#include "Math/GSLRndmEngines.h"
+#include "GSLRngWrapper.h"
+
+
+#include <cassert>
+#include <iostream>
+#include <cmath>
+#include <vector>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+// implementation of GSLSimAnFunc
+
+GSLSimAnFunc::GSLSimAnFunc(const BA_ROOT::Math::IMultiGenFunction & func, const double * x) :
+   fX( std::vector<double>(x, x + func.NDim() ) ),
+   fScale( std::vector<double>(func.NDim() )),
+   fFunc(&func)
+{
+   // set scale factors to 1
+   fScale.assign(fScale.size(), 1.);
+}
+
+GSLSimAnFunc::GSLSimAnFunc(const BA_ROOT::Math::IMultiGenFunction & func, const double * x, const double * scale) :
+   fX( std::vector<double>(x, x + func.NDim() ) ),
+   fScale( std::vector<double>(scale, scale + func.NDim() ) ),
+   fFunc(&func)
+{}
+
+
+double GSLSimAnFunc::Energy() const {
+   // evaluate the energy
+   return   (*fFunc)(&fX.front() );
+}
+
+void GSLSimAnFunc::Step(const GSLRandomEngine & random, double maxstep) {
+   // x  -> x + Random[-step,step]     for each coordinate
+   unsigned int ndim = NDim();
+   for (unsigned int i = 0; i < ndim; ++i) {
+      double urndm = random();
+      double sstep = maxstep * fScale[i];
+      fX[i] +=  2 * sstep * urndm - sstep;
+   }
+}
+
+
+double GSLSimAnFunc::Distance(const GSLSimAnFunc & f) const {
+   // calculate the distance with respect onother configuration
+   const std::vector<double> & x = fX;
+   const std::vector<double> & y = f.X();
+   unsigned int n = x.size();
+   assert (n == y.size());
+   if (n > 1) {
+      double d2 = 0;
+      for (unsigned int i = 0; i < n; ++i)
+         d2 += ( x[i] - y[i] ) * ( x[i] - y[i] );
+      return std::sqrt(d2);
+   }
+   else
+      // avoid doing a sqrt for 1 dim
+      return std::abs( x[0] - y[0] );
+}
+
+void GSLSimAnFunc::Print() {
+   // print the position  x in standard std::ostream
+   // GSL prints also niter-  ntrials - temperature and then the energy and energy min value (from 1.10)
+   std::cout << "\tx = ( ";
+   unsigned n = NDim();
+   for (unsigned int i = 0; i < n-1; ++i) {
+      std::cout << fX[i] << " , ";
+   }
+   std::cout << fX.back() << " )\t";
+   // energy us printed by GSL (and also end-line)
+   std::cout << "E  / E_best = ";   // GSL print then E and E best
+}
+
+GSLSimAnFunc &  GSLSimAnFunc::FastCopy(const GSLSimAnFunc & rhs) {
+   // copy only the information which is changed during the process
+   // in this case only the x values
+   std::copy(rhs.fX.begin(), rhs.fX.end(), fX.begin() );
+   return *this;
+}
+
+
+
+// definition and implementations of the static functions required by GSL
+
+namespace GSLSimAn {
+
+
+   double E( void * xp) {
+      // evaluate the energy given a state xp
+      GSLSimAnFunc * fx = reinterpret_cast<GSLSimAnFunc *> (xp);
+      assert (fx != 0);
+      return fx->Energy();
+   }
+
+   void Step( const gsl_rng * r, void * xp, double step_size) {
+      // change xp according to  the random step
+      GSLSimAnFunc * fx = reinterpret_cast<GSLSimAnFunc *> (xp);
+      assert (fx != 0);
+      // create GSLRandomEngine class
+      // cast away constness (we make sure we don't delete (no call to Terminate() )
+      GSLRngWrapper  rng(const_cast<gsl_rng *>(r));
+      GSLRandomEngine random(&rng);
+      // wrapper classes random and rng must exist during call to Step()
+      fx->Step(random, step_size);
+   }
+
+   double Dist( void * xp, void * yp) {
+      // calculate the distance between two configuration
+      GSLSimAnFunc * fx = reinterpret_cast<GSLSimAnFunc *> (xp);
+      GSLSimAnFunc * fy = reinterpret_cast<GSLSimAnFunc *> (yp);
+
+      assert (fx != 0);
+      assert (fy != 0);
+      return fx->Distance(*fy);
+   }
+
+   void Print(void * xp) {
+      // print the position  xp
+      // GSL prints also first niter-  ntrials - temperature and then the energy
+      GSLSimAnFunc * fx = reinterpret_cast<GSLSimAnFunc *> (xp);
+      assert (fx != 0);
+      fx->Print();
+   }
+
+// static function to pass to GSL copy - create and destroy the object
+
+   void Copy( void * source, void * dest) {
+      GSLSimAnFunc * fx = reinterpret_cast<GSLSimAnFunc *> (source);
+      assert (fx != 0);
+      GSLSimAnFunc * gx = reinterpret_cast<GSLSimAnFunc *> (dest);
+      assert (gx != 0);
+      gx->FastCopy(*fx);
+   }
+
+   void * CopyCtor( void * xp) {
+      GSLSimAnFunc * fx = reinterpret_cast<GSLSimAnFunc *> (xp);
+      assert (fx != 0);
+      return static_cast<void *> ( fx->Clone() );
+   }
+
+   void Destroy( void * xp) {
+      GSLSimAnFunc * fx = reinterpret_cast<GSLSimAnFunc *> (xp);
+      assert (fx != 0);
+      delete fx;
+   }
+
+}
+
+// implementation of GSLSimAnnealing class
+
+
+GSLSimAnnealing::GSLSimAnnealing()
+{
+   // Default constructor implementation.
+}
+
+
+
+// function for solving (from a Genfunction interface)
+
+int GSLSimAnnealing::Solve(const BA_ROOT::Math::IMultiGenFunction & func, const double * x0, const double * scale, double * xmin, bool debug) {
+   // solve the simulated annealing problem given starting point and objective function interface
+
+
+   // initial conditions
+   GSLSimAnFunc   fx(func, x0, scale);
+
+   int iret =  Solve(fx, debug);
+
+   if (iret == 0) {
+      // copy value of the minimum in xmin
+      std::copy(fx.X().begin(), fx.X().end(), xmin);
+   }
+   return iret;
+
+}
+
+int GSLSimAnnealing::Solve(GSLSimAnFunc & fx, bool debug) {
+   // solve the simulated annealing problem given starting point and GSLSimAnfunc object
+
+   gsl_rng * r = gsl_rng_alloc(gsl_rng_mt19937);
+
+
+
+   gsl_siman_params_t simanParams;
+
+   // parameters for the simulated annealing
+   // copy them in GSL structure
+
+   simanParams.n_tries =        fParams.n_tries;     /* how many points to try for each step */
+   simanParams.iters_fixed_T =  fParams.iters_fixed_T;  /* how many iterations at each temperature? */
+   simanParams.step_size =      fParams.step_size;     /* max step size in the random walk */
+   // the following parameters are for the Boltzmann distribution */
+   simanParams.k =              fParams.k;
+   simanParams.t_initial =      fParams.t_initial;
+   simanParams.mu_t =           fParams.mu;
+   simanParams.t_min =          fParams.t_min;
+
+
+   if (debug)
+      gsl_siman_solve(r, &fx, &GSLSimAn::E, &GSLSimAn::Step, &GSLSimAn::Dist,
+                   &GSLSimAn::Print, &GSLSimAn::Copy, &GSLSimAn::CopyCtor , &GSLSimAn::Destroy, 0, simanParams );
+
+   else
+      gsl_siman_solve(r, &fx, &GSLSimAn::E, &GSLSimAn::Step, &GSLSimAn::Dist,
+                   0, &GSLSimAn::Copy, &GSLSimAn::CopyCtor , &GSLSimAn::Destroy, 0, simanParams );
+
+   return 0;
+
+}
+
+
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GenAlgoOptions.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/GenAlgoOptions.cxx
new file mode 100644
index 0000000..15a91cb
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GenAlgoOptions.cxx
@@ -0,0 +1,81 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Nov 2010
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2010  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// implementation file for static methods of GenAlgoOptions
+// this file contains also the pointer to the static std::map<algorithm name, options>
+
+#include "Math/GenAlgoOptions.h"
+#include <cassert>
+
+// for toupper
+#include <algorithm>
+#include <functional>
+#include <ctype.h>   // need to use c version of tolower defined here
+#include <string>
+
+namespace BA_ROOT {
+namespace Math {
+
+typedef std::map<std::string, BA_ROOT::Math::GenAlgoOptions > OptionsMap;
+
+namespace GenAlgoOptUtil {
+
+   // map with the generic options for all ROOT::Math numerical algorithm
+   static OptionsMap gAlgoOptions;
+
+
+   IOptions * DoFindDefault(std::string & algoname, OptionsMap & gOpts) {
+      // internal function to retrieve the
+      // default extra options for the given algorithm type
+      // return zero if not found
+      // store always name in upper case
+      std::transform(algoname.begin(), algoname.end(), algoname.begin(), (int(*)(int)) toupper );
+
+      OptionsMap::iterator pos = gOpts.find(algoname);
+      if (pos !=  gOpts.end() ) {
+         return &(pos->second);
+      }
+      return 0;
+   }
+}
+
+   IOptions * GenAlgoOptions::FindDefault(const char * algo) {
+      // find default options - return 0 if not found
+      std::string algoname(algo);
+      OptionsMap & gOpts = GenAlgoOptUtil::gAlgoOptions;
+      return GenAlgoOptUtil::DoFindDefault(algoname, gOpts);
+   }
+
+   IOptions & GenAlgoOptions::Default(const char * algo) {
+      // create default extra options for the given algorithm type
+      std::string algoname(algo);
+      OptionsMap & gOpts = GenAlgoOptUtil::gAlgoOptions;
+      IOptions * opt = GenAlgoOptUtil::DoFindDefault(algoname, gOpts);
+      if (opt == 0) {
+         // create new extra options for the given type
+         std::pair<OptionsMap::iterator,bool> ret = gOpts.insert( OptionsMap::value_type(algoname, BA_ROOT::Math::GenAlgoOptions()) );
+         assert(ret.second);
+         opt = &((ret.first)->second);
+      }
+      return *opt;
+   }
+
+   void GenAlgoOptions::PrintAllDefault(std::ostream & os) {
+      const OptionsMap & gOpts = GenAlgoOptUtil::gAlgoOptions;
+      for (  OptionsMap::const_iterator pos = gOpts.begin();
+          pos != gOpts.end(); ++pos) {
+            os << std::string("Default specific options for algorithm ")  << pos->first << std::string(" : ") << std::endl;
+            (pos->second).Print(os);
+      }
+   }
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/GeneticMinimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/GeneticMinimizer.cxx
new file mode 100644
index 0000000..38a8951
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/GeneticMinimizer.cxx
@@ -0,0 +1,380 @@
+#include "Math/GeneticMinimizer.h"
+
+#include "TMVA/GeneticAlgorithm.h"
+#include "TMVA/IFitterTarget.h"
+
+#include "Math/IFunction.h"
+#include "Math/GenAlgoOptions.h"
+
+//#include "TError.h"
+#include "TMVA/Types.h"
+
+#include <cassert>
+
+namespace BA_ROOT {
+namespace Math {
+
+
+// wrapper class for TMVA interface to evaluate objective function
+class MultiGenFunctionFitness : public BA_TMVA::IFitterTarget {
+private:
+   unsigned int fNCalls;
+   unsigned int fNFree;
+   const BA_ROOT::Math::IMultiGenFunction& fFunc;
+   std::vector<int> fFixedParFlag;
+   mutable std::vector<double> fValues;
+
+public:
+   MultiGenFunctionFitness(const BA_ROOT::Math::IMultiGenFunction& function) : fNCalls(0),
+                                                                            fFunc(function)
+   { fNFree = fFunc.NDim(); }
+
+   unsigned int NCalls() const { return fNCalls; }
+   unsigned int NDims() const { return fNFree; }
+
+   unsigned int NTotal() const { return fFunc.NDim(); }
+
+   void FixParameter(unsigned int ipar, double value, bool fix = true) {
+
+      if (fValues.size() != fFunc.NDim() ) {
+         fValues.resize(fFunc.NDim() );
+         fFixedParFlag.resize(fFunc.NDim());
+      }
+
+      if (ipar >= fValues.size() ) return;
+
+      // first find if it has been already fixed
+      fFixedParFlag[ipar] = fix;
+      fValues[ipar] = value;
+      // count number of fixed params
+      for (unsigned int i = 0; i < fFixedParFlag.size(); ++i)
+         if (!fFixedParFlag[i] ) fNFree++;
+
+   }
+
+   // transfrom from internal parameters (not fixed to external vector which include the fixed ones)
+   const std::vector<double> & Transform( const std::vector<double> & factors) const {
+      unsigned int n = fValues.size();
+      if (n == 0 || fNFree == n )
+         return factors;
+
+      // in case of fixed parameters
+      for (unsigned int i = 0, j = 0; i < n ; ++i) {
+         if (!fFixedParFlag[i] ) {
+            assert (j < fNFree);
+            fValues[i] = factors[j];
+            j++;
+         }
+      }
+      return fValues;
+   }
+
+   Double_t Evaluate(const std::vector<double> & factors ) const {
+      const std::vector<double> & x = Transform( factors);
+      return fFunc(&x[0]);
+   }
+
+   Double_t EstimatorFunction(std::vector<double> & factors ){
+      fNCalls += 1;
+      return Evaluate( factors);
+   }
+};
+
+GeneticMinimizerParameters::GeneticMinimizerParameters()
+{
+   // constructor of parameters with default values (use 100 is max iterations is not defined)
+   int defmaxiter = BA_ROOT::Math::MinimizerOptions::DefaultMaxIterations();
+   fNsteps   =  (defmaxiter > 0) ?  defmaxiter : 100;
+   fPopSize  =300;
+   fCycles   = 3;
+   fSC_steps =10;
+   fSC_rate  =5;
+   fSC_factor=0.95;
+   fConvCrit =10.0 * BA_ROOT::Math::MinimizerOptions::DefaultTolerance(); // default is 0.001
+   if (fConvCrit <=0 ) fConvCrit = 0.001;
+   fSeed=0;  // random seed
+}
+
+// genetic minimizer class
+
+GeneticMinimizer::GeneticMinimizer(int ):
+   fFitness(0),
+   fMinValue(0),
+   fParameters(GeneticMinimizerParameters() )
+{
+
+   // check with default minimizer options
+   BA_ROOT::Math::IOptions * geneticOpt = BA_ROOT::Math::MinimizerOptions::FindDefault("Genetic");
+   if (geneticOpt) {
+      BA_ROOT::Math::MinimizerOptions opt; // create using default options
+      opt.SetExtraOptions(*geneticOpt);
+      this->SetOptions(opt);
+   }
+
+   // set the parameters
+   SetTolerance(0.1 * fParameters.fConvCrit);
+   SetMaxIterations( fParameters.fNsteps);
+ }
+
+GeneticMinimizer::~GeneticMinimizer()
+{
+   if ( fFitness )
+   {
+      delete fFitness;
+      fFitness = 0;
+   }
+}
+
+void GeneticMinimizer::Clear()
+{
+   fRanges.clear();
+   fResult.clear();
+   if ( fFitness )
+   {
+      delete fFitness;
+      fFitness = 0;
+   }
+}
+
+void GeneticMinimizer::SetFunction(const BA_ROOT::Math::IMultiGenFunction & func)
+{
+   Clear();
+
+   fFitness = new MultiGenFunctionFitness(func);
+   fResult = std::vector<double>(func.NDim() );
+   assert(fResult.size() == NDim() );
+}
+
+bool GeneticMinimizer::SetLimitedVariable(unsigned int , const std::string & , double , double , double lower , double upper )
+{
+   fRanges.push_back( new BA_TMVA::Interval(lower,upper) );
+
+   return true;
+}
+
+bool GeneticMinimizer::SetVariable(unsigned int, const std::string& name, double value, double step)
+{
+   //It does nothing! As there is no variable if it has no limits!
+   double lower = value - (50 * step);
+   double upper = value + (50 * step);
+//   Info("GeneticMinimizer::SetVariable", "Variables should be limited - set automatic range to 50 times step size for %s : [%f, %f]",
+//        name.c_str(),lower,upper);
+   std::cout << "GeneticMinimizer::SetVariable() -> Info. Variables should be limited - set automatic range to 50 times step size for "
+             << name << " , lower " << lower << " , upper" << upper << std::endl;
+   fRanges.push_back( new BA_TMVA::Interval(lower, upper ) );
+
+   return true;
+}
+
+bool GeneticMinimizer::SetFixedVariable(unsigned int par, const std::string& name, double value) {
+   // set a fixed variable
+   if (!fFitness) {
+//      Error("GeneticMinimizer::SetFixedVariable", "Function has not been set - cannot set fixed variables %s",name.c_str());
+       std::cout << "GeneticMinimizer::SetFixedVariable -> Error!. Function has not been set - cannot set fixed variables '" << name << "'" << std::endl;
+      return false;
+   }
+
+   static_cast<MultiGenFunctionFitness*>(fFitness)->FixParameter(par, value);
+   return true;
+}
+
+
+void GeneticMinimizer::SetParameters(const GeneticMinimizerParameters & params )
+{
+   fParameters  = params;
+   // set also the one defined in Minimizer
+   SetTolerance( 0.1 * fParameters.fConvCrit);
+   SetMaxIterations( fParameters.fNsteps );
+}
+
+BA_ROOT::Math::MinimizerOptions GeneticMinimizer::Options() const {
+   BA_ROOT::Math::MinimizerOptions opt;
+   GetGeneticOptions(opt);
+   return opt;
+}
+
+void  GeneticMinimizer::GetGeneticOptions(BA_ROOT::Math::MinimizerOptions & opt) const {
+   // get  the genetic options of the class and return them in the MinimizerOptions class
+   opt.SetTolerance(fParameters.fConvCrit/10); // use a factor of 10 to have default as Minuit
+   opt.SetPrintLevel(PrintLevel() );
+   opt.SetMaxIterations(fParameters.fNsteps);
+   // use fixed or dammy value for the other options
+   opt.SetMinimizerType("Genetic");
+   opt.SetMaxFunctionCalls(0);
+   opt.SetStrategy(-1);
+   opt.SetErrorDef(0);
+   opt.SetPrecision(0);
+   opt.SetMinimizerAlgorithm("");
+
+   BA_ROOT::Math::GenAlgoOptions geneticOpt;
+   geneticOpt.SetValue("PopSize",fParameters.fPopSize);
+   geneticOpt.SetValue("Steps",fParameters.fNsteps);
+   geneticOpt.SetValue("Cycles",fParameters.fCycles);
+   geneticOpt.SetValue("SC_steps",fParameters.fSC_steps);
+   geneticOpt.SetValue("SC_rate",fParameters.fSC_rate);
+   geneticOpt.SetValue("SC_factor",fParameters.fSC_factor);
+   geneticOpt.SetValue("ConvCrit",fParameters.fConvCrit);
+   geneticOpt.SetValue("RandomSeed",fParameters.fSeed);
+
+   opt.SetExtraOptions(geneticOpt);
+}
+
+void GeneticMinimizer::SetOptions(const BA_ROOT::Math::MinimizerOptions & opt)
+{
+   SetTolerance(opt.Tolerance() );
+   SetPrintLevel(opt.PrintLevel() );
+   //SetMaxFunctionCalls(opt.MaxFunctionCalls() );
+   SetMaxIterations(opt.MaxIterations() );
+
+   fParameters.fConvCrit = 10.*opt.Tolerance(); // use a factor of 10 to have default as Minuit
+
+   // set genetic parameter from minimizer options
+   const BA_ROOT::Math::IOptions * geneticOpt = opt.ExtraOptions();
+   if (!geneticOpt) {
+//      Warning("GeneticMinimizer::SetOptions", "No specific genetic minimizer options have been set");
+      std::cout << "GeneticMinimizer::SetOptions() -> Warning. No specific genetic minimizer options have been set" << std::endl;
+      return;
+   }
+
+   // if options are not existing values will not be set
+   geneticOpt->GetValue("PopSize",fParameters.fPopSize);
+   geneticOpt->GetValue("Steps",fParameters.fNsteps);
+   geneticOpt->GetValue("Cycles",fParameters.fCycles);
+   geneticOpt->GetValue("SC_steps",fParameters.fSC_steps);
+   geneticOpt->GetValue("SC_rate",fParameters.fSC_rate);
+   geneticOpt->GetValue("SC_factor",fParameters.fSC_factor);
+   geneticOpt->GetValue("ConvCrit",fParameters.fConvCrit);
+   geneticOpt->GetValue("RandomSeed",fParameters.fSeed);
+
+   // use same of options in base class
+   int maxiter = opt.MaxIterations();
+   if (maxiter > 0 && fParameters.fNsteps > 0 && maxiter !=  fParameters.fNsteps  )    {
+//      Warning("GeneticMinimizer::SetOptions", "max iterations value given different than  than Steps - set equal to Steps %d",fParameters.fNsteps);
+        std::cout << "GeneticMinimizer::SetOptions() -> Warning.max iterations value given different than  than Steps - set equal to Steps" << fParameters.fNsteps << std::endl;
+   }
+   if (fParameters.fNsteps > 0) SetMaxIterations(fParameters.fNsteps);
+
+}
+
+bool GeneticMinimizer::Minimize()
+{
+
+   if (!fFitness) {
+//      Error("GeneticMinimizer::Minimize","Fitness function has not been set");
+       std::cout << "GeneticMinimizer::Minimize() -> Error. Fitness function has not been set" << std::endl;
+      return false;
+   }
+
+   // sync parameters
+   if (MaxIterations() > 0) fParameters.fNsteps = MaxIterations();
+   if (Tolerance() > 0) fParameters.fConvCrit = 10* Tolerance();
+
+   BA_TMVA::GeneticAlgorithm mg( *fFitness, fParameters.fPopSize, fRanges, fParameters.fSeed );
+
+   if (PrintLevel() > 0) {
+      std::cout << "GeneticMinimizer::Minimize  - Start iterating - max iterations = " <<  MaxIterations()
+                << " conv criteria (tolerance) =  "   << fParameters.fConvCrit << std::endl;
+   }
+
+   fStatus = 0;
+   unsigned int niter = 0;
+   do {
+      mg.Init();
+
+      mg.CalculateFitness();
+
+      // Just for debugging options
+      //mg.GetGeneticPopulation().Print(0);
+
+      mg.GetGeneticPopulation().TrimPopulation();
+
+      mg.SpreadControl( fParameters.fSC_steps, fParameters.fSC_rate, fParameters.fSC_factor );
+
+      if (PrintLevel() > 2) {
+         std::cout << "New Iteration " << niter << " with  parameter values :" << std::endl;
+         BA_TMVA::GeneticGenes* genes = mg.GetGeneticPopulation().GetGenes( 0 );
+         if (genes) {
+            std::vector<Double_t> gvec;
+            gvec = genes->GetFactors();
+            for (unsigned int i = 0; i < gvec.size(); ++i) {
+               std::cout << gvec[i] << "    ";
+            }
+            std::cout << std::endl;
+            std::cout << "\tFitness function value = " <<  static_cast<MultiGenFunctionFitness*>(fFitness)->Evaluate(gvec) << std::endl;
+         }
+      }
+      niter++;
+      if ( niter > MaxIterations() && MaxIterations() > 0) {
+         if (PrintLevel() > 0) {
+//            Info("GeneticMinimizer::Minimize","Max number of iterations %d reached - stop iterating",MaxIterations());
+            std::cout << "GeneticMinimizer::Minimize() -> Info. Max number of iterations " << MaxIterations() << " reached - stop iterating." << std::endl;
+         }
+         fStatus = 1;
+         break;
+      }
+
+   } while (!mg.HasConverged( fParameters.fNsteps, fParameters.fConvCrit ));  // converged if: fitness-improvement < CONVCRIT within the last CONVSTEPS loops
+
+   BA_TMVA::GeneticGenes* genes = mg.GetGeneticPopulation().GetGenes( 0 );
+   std::vector<Double_t> gvec;
+   gvec = genes->GetFactors();
+
+
+   // transform correctly gvec on fresult in case there are fixed parameters
+   const std::vector<double> & transVec = static_cast<MultiGenFunctionFitness*>(fFitness)->Transform(gvec);
+   std::copy(transVec.begin(), transVec.end(), fResult.begin() );
+   fMinValue = static_cast<MultiGenFunctionFitness*>(fFitness)->Evaluate(gvec);
+
+
+   if (PrintLevel() > 0) {
+      if (PrintLevel() > 2) std::cout << std::endl;
+          std::cout << "Finished Iteration (niter = " << niter << "  with fitness function value = " << MinValue() << std::endl;
+      for (unsigned int i = 0; i < fResult.size(); ++i) {
+         std::cout << " Parameter-" << i << "\t=\t" << fResult[i] << std::endl;
+      }
+   }
+
+   return true;
+}
+
+double GeneticMinimizer::MinValue() const
+{
+   return (fFitness) ? fMinValue : 0;
+}
+
+const double *  GeneticMinimizer::X() const {
+   return (fFitness) ? &fResult[0] : 0;
+}
+
+unsigned int GeneticMinimizer::NCalls() const
+{
+   if ( fFitness )
+      return static_cast<MultiGenFunctionFitness*>(fFitness)->NCalls();
+   else
+      return 0;
+}
+
+unsigned int GeneticMinimizer::NDim() const
+{
+   if ( fFitness )
+      return static_cast<MultiGenFunctionFitness*>(fFitness)->NTotal();
+   else
+      return 0;
+}
+unsigned int GeneticMinimizer::NFree() const
+{
+   if ( fFitness )
+      return static_cast<MultiGenFunctionFitness*>(fFitness)->NDims();
+   else
+      return 0;
+}
+
+// Functions we don't need...
+const double *  GeneticMinimizer::MinGradient() const { return 0; }
+bool GeneticMinimizer::ProvidesError() const { return false; }
+const double * GeneticMinimizer::Errors() const { return 0; }
+double GeneticMinimizer::Edm() const { return 0; }
+double GeneticMinimizer::CovMatrix(unsigned int, unsigned int) const { return 0; }
+
+}
+}
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/MinimTransformFunction.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/MinimTransformFunction.cxx
new file mode 100644
index 0000000..44e4421
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/MinimTransformFunction.cxx
@@ -0,0 +1,161 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta June  2009
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Implementation file for class MinimTransformFunction
+
+#include "Math/MinimTransformFunction.h"
+
+//#include <iostream>
+#include <cmath>
+#include <cassert>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+MinimTransformFunction::MinimTransformFunction ( const IMultiGradFunction * f, const std::vector<EMinimVariableType> & types,
+                                                 const std::vector<double> & values,
+                                                 const std::map<unsigned int, std::pair<double, double> > & bounds) :
+   fX( values ),
+   fFunc(f)
+{
+   // constructor of the class from a pointer to the function (which is managed)
+   // vector specifying the variable types (free, bounded or fixed, defined in enum EMinimVariableTypes )
+   // variable values (used for the fixed ones) and a map with the bounds (for the bounded variables)
+
+   unsigned int ntot = NTot();   // NTot is fFunc->NDim()
+   assert ( types.size() == ntot );
+   fVariables.reserve(ntot);
+   fIndex.reserve(ntot);
+   for (unsigned int i = 0; i < ntot; ++i ) {
+      if (types[i] ==  kFix )
+         fVariables.push_back( MinimTransformVariable( values[i]) );
+      else {
+         fIndex.push_back(i);
+
+         if ( types[i] ==  kDefault)
+            fVariables.push_back( MinimTransformVariable() );
+         else {
+            std::map<unsigned int, std::pair<double,double> >::const_iterator itr = bounds.find(i);
+            assert ( itr != bounds.end() );
+            double low = itr->second.first;
+            double up = itr->second.second;
+            if (types[i] ==  kBounds )
+               fVariables.push_back( MinimTransformVariable( low, up, new SinVariableTransformation()));
+            else if (types[i] ==  kLowBound)
+               fVariables.push_back( MinimTransformVariable( low, new SqrtLowVariableTransformation()));
+            else if (types[i] ==  kUpBound)
+               fVariables.push_back( MinimTransformVariable( up, new SqrtUpVariableTransformation()));
+         }
+      }
+   }
+}
+
+
+void MinimTransformFunction::Transformation( const double * x, double * xext) const {
+   // transform from internal to external
+
+   unsigned int nfree = fIndex.size();
+
+//       std::cout << "Transform:  internal ";
+//       for (int i = 0; i < nfree; ++i) std::cout << x[i] << "  ";
+//       std::cout << "\t\t";
+
+   for (unsigned int i = 0; i < nfree; ++i ) {
+      unsigned int extIndex = fIndex[i];
+      const MinimTransformVariable & var = fVariables[ extIndex ];
+      if (var.IsLimited() )
+         xext[ extIndex ] = var.InternalToExternal( x[i] );
+      else
+         xext[ extIndex ] = x[i];
+   }
+
+//       std::cout << "Transform:  external ";
+//       for (int i = 0; i < fX.size(); ++i) std::cout << fX[i] << "  ";
+//       std::cout << "\n";
+
+}
+
+void  MinimTransformFunction::InvTransformation(const double * xExt,  double * xInt) const {
+   // inverse function transformation (external -> internal)
+   for (unsigned int i = 0; i < NDim(); ++i ) {
+      unsigned int extIndex = fIndex[i];
+      const MinimTransformVariable & var = fVariables[ extIndex ];
+      assert ( !var.IsFixed() );
+      if (var.IsLimited() )
+         xInt[ i ] = var.ExternalToInternal( xExt[extIndex] );
+      else
+         xInt[ i ] = xExt[extIndex];
+   }
+}
+
+void  MinimTransformFunction::InvStepTransformation(const double * x, const double * sExt,  double * sInt) const {
+   // inverse function transformation for steps (external -> internal)
+   for (unsigned int i = 0; i < NDim(); ++i ) {
+      unsigned int extIndex = fIndex[i];
+      const MinimTransformVariable & var = fVariables[ extIndex ];
+      assert ( !var.IsFixed() );
+      if (var.IsLimited() )  {
+         // bound variables
+         double x2 = x[extIndex] + sExt[extIndex];
+         if (var.HasUpperBound() && x2 >= var.UpperBound() )
+            x2 = x[extIndex] - sExt[extIndex];
+         // transform x and x2
+         double xint = var.ExternalToInternal ( x[extIndex] );
+         double x2int = var.ExternalToInternal( x2 );
+         sInt[i] =  std::abs( x2int - xint);
+      }
+      else
+         sInt[ i ] = sExt[extIndex];
+   }
+}
+
+void  MinimTransformFunction::GradientTransformation(const double * x, const double *gExt, double * gInt) const {
+   //transform gradient vector (external -> internal) at internal point x
+   unsigned int nfree = fIndex.size();
+   for (unsigned int i = 0; i < nfree; ++i ) {
+      unsigned int extIndex = fIndex[i];
+      const MinimTransformVariable & var = fVariables[ extIndex ];
+      assert (!var.IsFixed() );
+      if (var.IsLimited() )
+         gInt[i] = gExt[ extIndex ] * var.DerivativeIntToExt( x[i] );
+      else
+         gInt[i] = gExt[ extIndex ];
+   }
+}
+
+
+void  MinimTransformFunction::MatrixTransformation(const double * x, const double *covInt, double * covExt) const {
+   //transform covariance matrix (internal -> external) at internal point x
+   // use row storages for matrices  m(i,j) = rep[ i * dim + j]
+   // ignore fixed points
+   unsigned int nfree = fIndex.size();
+   unsigned int ntot = NTot();
+   for (unsigned int i = 0; i < nfree; ++i ) {
+      unsigned int iext = fIndex[i];
+      const MinimTransformVariable & ivar = fVariables[ iext ];
+      assert (!ivar.IsFixed());
+      double ddi = ( ivar.IsLimited() ) ? ivar.DerivativeIntToExt( x[i] ) : 1.0;
+      // loop on j  variables  for not fixed i variables (forget that matrix is symmetric) - could be optimized
+      for (unsigned int j = 0; j < nfree; ++j ) {
+         unsigned int jext = fIndex[j];
+         const MinimTransformVariable & jvar = fVariables[ jext ];
+         double ddj = ( jvar.IsLimited() ) ? jvar.DerivativeIntToExt( x[j] ) : 1.0;
+         assert (!jvar.IsFixed() );
+         covExt[ iext * ntot + jext] =  ddi * ddj * covInt[ i * nfree + j];
+      }
+   }
+}
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/MinimizerOptions.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/MinimizerOptions.cxx
new file mode 100644
index 0000000..b3f47de
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/MinimizerOptions.cxx
@@ -0,0 +1,230 @@
+// @(#)root/mathcore:$Id$
+// Author: L. Moneta Fri Aug 15 2008
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2008  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Math/MinimizerOptions.h"
+
+#include "Math/GenAlgoOptions.h"
+
+// case of using ROOT plug-in manager
+#ifndef MATH_NO_PLUGIN_MANAGER
+#include "TEnv.h"
+#endif
+
+#include <iomanip>
+
+namespace BA_ROOT {
+
+
+namespace Math {
+
+   namespace Minim {
+      static std::string gDefaultMinimizer = ""; // take from /etc/system.rootrc in ROOT Fitter
+      static std::string gDefaultMinimAlgo = "Migrad";
+      static double gDefaultErrorDef = 1.;
+      static double gDefaultTolerance = 1.E-2;
+      static double gDefaultPrecision = -1; // value <= 0 means left to minimizer
+      static int  gDefaultMaxCalls = 0; // 0 means leave default values Deaf
+      static int  gDefaultMaxIter  = 0;
+      static int  gDefaultStrategy  = 1;
+      static int  gDefaultPrintLevel  = 0;
+      static IOptions * gDefaultExtraOptions = 0; // pointer to default extra options
+   }
+
+
+void MinimizerOptions::SetDefaultMinimizer(const char * type, const char * algo) {
+   // set the default minimizer type and algorithm
+   if (type) Minim::gDefaultMinimizer = std::string(type);
+   if (algo) Minim::gDefaultMinimAlgo = std::string(algo);
+}
+void MinimizerOptions::SetDefaultErrorDef(double up) {
+   // set the default error definition
+   Minim::gDefaultErrorDef = up;
+}
+void MinimizerOptions::SetDefaultTolerance(double tol) {
+   // set the default tolerance
+   Minim::gDefaultTolerance = tol;
+}
+void MinimizerOptions::SetDefaultPrecision(double prec) {
+   // set the default precision
+   Minim::gDefaultPrecision = prec;
+}
+void MinimizerOptions::SetDefaultMaxFunctionCalls(int maxcall) {
+   // set the default maximum number of function calls
+   Minim::gDefaultMaxCalls = maxcall;
+}
+void MinimizerOptions::SetDefaultMaxIterations(int maxiter) {
+   // set the default maximum number of iterations
+   Minim::gDefaultMaxIter = maxiter;
+}
+void MinimizerOptions::SetDefaultStrategy(int stra) {
+   // set the default minimization strategy
+   Minim::gDefaultStrategy = stra;
+}
+void MinimizerOptions::SetDefaultPrintLevel(int level) {
+   // set the default printing level
+   Minim::gDefaultPrintLevel = level;
+}
+void MinimizerOptions::SetDefaultExtraOptions(const IOptions * extraoptions) {
+   // set the pointer to default extra options
+   delete Minim::gDefaultExtraOptions;
+   Minim::gDefaultExtraOptions = (extraoptions) ? extraoptions->Clone() : 0;
+}
+
+const std::string & MinimizerOptions::DefaultMinimizerAlgo() { return Minim::gDefaultMinimAlgo; }
+double MinimizerOptions::DefaultErrorDef()         { return Minim::gDefaultErrorDef; }
+double MinimizerOptions::DefaultTolerance()        { return Minim::gDefaultTolerance; }
+double MinimizerOptions::DefaultPrecision()        { return Minim::gDefaultPrecision; }
+int    MinimizerOptions::DefaultMaxFunctionCalls() { return Minim::gDefaultMaxCalls; }
+int    MinimizerOptions::DefaultMaxIterations()    { return Minim::gDefaultMaxIter; }
+int    MinimizerOptions::DefaultStrategy()         { return Minim::gDefaultStrategy; }
+int    MinimizerOptions::DefaultPrintLevel()       { return Minim::gDefaultPrintLevel; }
+IOptions * MinimizerOptions::DefaultExtraOptions() { return Minim::gDefaultExtraOptions; }
+
+const std::string & MinimizerOptions::DefaultMinimizerType()
+{
+   // return default minimizer
+   // if is "" (no default is set) read from etc/system.rootrc
+
+   if (Minim::gDefaultMinimizer.size() == 0) {
+#ifndef MATH_NO_PLUGIN_MANAGER
+   // use value defined in etc/system.rootrc  (if not found Minuit is used)
+      if (gEnv)
+         Minim::gDefaultMinimizer = gEnv->GetValue("Root.Fitter","Minuit");
+#else
+      Minim::gDefaultMinimizer = "Minuit2";  // in case no PM exists
+#endif
+   }
+
+   return Minim::gDefaultMinimizer;
+}
+
+
+MinimizerOptions::MinimizerOptions():
+   fExtraOptions(0)
+{
+   // constructor using  the default options
+
+   ResetToDefaultOptions();
+}
+
+
+MinimizerOptions::MinimizerOptions(const MinimizerOptions & opt) : fExtraOptions(0) {
+   // copy constructor
+   (*this) = opt;
+}
+
+MinimizerOptions & MinimizerOptions::operator=(const MinimizerOptions & opt) {
+   // assignment operator
+   if (this == &opt) return *this; // self assignment
+   fLevel = opt.fLevel;
+   fMaxCalls = opt.fMaxCalls;
+   fMaxIter = opt.fMaxIter;
+   fStrategy = opt.fStrategy;
+   fErrorDef = opt.fErrorDef;
+   fTolerance = opt.fTolerance;
+   fPrecision = opt.fPrecision;
+   fMinimType = opt.fMinimType;
+   fAlgoType = opt.fAlgoType;
+
+   delete fExtraOptions;
+   fExtraOptions = (opt.fExtraOptions) ? (opt.fExtraOptions)->Clone() : 0;
+
+   return *this;
+}
+
+MinimizerOptions::~MinimizerOptions() {
+   delete fExtraOptions;
+}
+
+void MinimizerOptions::ResetToDefaultOptions() {
+   fLevel = Minim::gDefaultPrintLevel;
+   fMaxCalls = Minim::gDefaultMaxCalls;
+   fMaxIter = Minim::gDefaultMaxIter;
+   fStrategy = Minim::gDefaultStrategy;
+   fErrorDef =  Minim::gDefaultErrorDef;
+   fTolerance = Minim::gDefaultTolerance;
+   fPrecision = Minim::gDefaultPrecision;
+
+   fMinimType = MinimizerOptions::DefaultMinimizerType();
+
+   fAlgoType =  Minim::gDefaultMinimAlgo;
+
+   // case of Fumili2 and TMinuit
+   if (fMinimType == "TMinuit") fMinimType = "Minuit";
+   else if (fMinimType == "Fumili2") {
+      fMinimType = "Minuit2";
+      fAlgoType = "Fumili";
+   }
+   else if (fMinimType == "GSLMultiMin" && fAlgoType == "Migrad")
+      fAlgoType = "BFGS2";
+
+   delete fExtraOptions;
+   fExtraOptions = 0;
+   // check if extra options exists (copy them if needed)
+   if (Minim::gDefaultExtraOptions)
+      fExtraOptions = Minim::gDefaultExtraOptions->Clone();
+   else {
+      IOptions * gopts = FindDefault( fMinimType.c_str() );
+      if (gopts) fExtraOptions = gopts->Clone();
+   }
+}
+
+void MinimizerOptions::SetExtraOptions(const IOptions & opt) {
+   // set extra options (clone the passed one)
+   delete fExtraOptions;
+   fExtraOptions = opt.Clone();
+}
+
+void MinimizerOptions::Print(std::ostream & os) const {
+   //print all the options
+   os << std::setw(25) << "Minimizer Type"        << " : " << std::setw(15) << fMinimType << std::endl;
+   os << std::setw(25) << "Minimizer Algorithm"   << " : " << std::setw(15) << fAlgoType << std::endl;
+   os << std::setw(25) << "Strategy"              << " : " << std::setw(15) << fStrategy << std::endl;
+   os << std::setw(25) << "Tolerance"              << " : " << std::setw(15) << fTolerance << std::endl;
+   os << std::setw(25) << "Max func calls"         << " : " << std::setw(15) << fMaxCalls << std::endl;
+   os << std::setw(25) << "Max iterations"         << " : " << std::setw(15) << fMaxIter << std::endl;
+   os << std::setw(25) << "Func Precision"         << " : " << std::setw(15) << fPrecision << std::endl;
+   os << std::setw(25) << "Error definition"       << " : " << std::setw(15) << fErrorDef << std::endl;
+   os << std::setw(25) << "Print Level"            << " : " << std::setw(15) << fLevel << std::endl;
+
+   if (ExtraOptions()) {
+      os << fMinimType << " specific options :"  << std::endl;
+      ExtraOptions()->Print(os);
+   }
+}
+
+IOptions & MinimizerOptions::Default(const char * name) {
+   // create default extra options for the given algorithm type
+   return GenAlgoOptions::Default(name);
+}
+
+IOptions * MinimizerOptions::FindDefault(const char * name) {
+   // find extra options for the given algorithm type
+   return GenAlgoOptions::FindDefault(name);
+}
+
+void MinimizerOptions::PrintDefault(const char * name, std::ostream & os) {
+   //print default options
+   MinimizerOptions tmp;
+   tmp.Print(os);
+   if (!tmp.ExtraOptions() ) {
+      IOptions * opt = FindDefault(name);
+      os << "Specific options for "  << name << std::endl;
+      if (opt) opt->Print(os);
+   }
+}
+
+
+
+
+} // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/MinimizerVariableTransformation.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/MinimizerVariableTransformation.cxx
new file mode 100644
index 0000000..12dcf7e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/MinimizerVariableTransformation.cxx
@@ -0,0 +1,110 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta 2009
+
+// Implementation file for all the MinimizerVariableTransormation's
+// (implementations taken from minuit2 classes)
+
+
+#include "Math/MinimizerVariableTransformation.h"
+#include <cmath>
+#include <limits>
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+// implementations for the class SinVariableTransformation
+
+double SinVariableTransformation::Int2ext(double value, double lower, double upper) const {
+   // transformation from  internal (unlimited) to external values (limited by lower/upper )
+   return lower + 0.5*(upper - lower)*(std::sin(value) + 1.);
+}
+
+double SinVariableTransformation::Ext2int(double value, double lower, double upper) const {
+   // transformation from external (limited by lower/upper )  to internal (unlimited) values given the lower/upper limits
+
+   double piby2 = 2.*std::atan(1.);
+   static const double eps = std::numeric_limits<double>::epsilon();
+   double distnn = 8.*std::sqrt(eps);
+   double vlimhi = piby2 - distnn;
+   double vlimlo = -piby2 + distnn;
+
+   double yy = 2.*(value - lower)/(upper - lower) - 1.;
+   double yy2 = yy*yy;
+   if(yy2 > (1. - 8 * eps) ) {
+      if(yy < 0.) {
+         // lower limit
+         //       std::cout<<"SinVariableTransformation warning: is at its lower allowed limit. "<<value<<std::endl;
+         return vlimlo;
+      } else {
+         // upper limit
+         //       std::cout<<"SinVariableTransformation warning: is at its upper allowed limit."<<std::endl;
+         return vlimhi;
+      }
+
+   } else {
+         return std::asin(yy);
+   }
+}
+
+double SinVariableTransformation::DInt2Ext(double value, double lower, double upper) const {
+   // return the derivative of the internal to external transformation (Int2Ext) : d Int2Ext / d Int
+   return 0.5*((upper - lower)*std::cos(value));
+}
+
+// sqrt up
+// implementations for the class SqrtUpVariableTransformation
+
+
+   double SqrtLowVariableTransformation::Int2ext(double value, double lower, double) const {
+   /// internal to external transformation
+   double val = lower - 1. + std::sqrt( value*value + 1.);
+   return val;
+}
+
+
+double SqrtLowVariableTransformation::Ext2int(double value, double lower, double ) const {
+   // external to internal transformation
+   double yy = value - lower + 1.;
+   double yy2 = yy*yy;
+   if (yy2 < 1. )
+      return 0;
+   else
+      return std::sqrt( yy2 -1);
+}
+
+double SqrtLowVariableTransformation::DInt2Ext(double value, double, double) const {
+   // derivative of internal to external transofrmation   :  d (Int2Ext) / d Int
+   double val = value/( std::sqrt( value*value + 1.) );
+   return val;
+}
+
+// sqrt up
+// implementations for the class SqrtUpVariableTransformation
+
+double SqrtUpVariableTransformation::Int2ext(double value, double upper, double) const {
+   // internal to external transformation
+   double val = upper + 1. - std::sqrt( value*value + 1.);
+   return val;
+}
+
+
+double SqrtUpVariableTransformation::Ext2int(double value, double upper, double ) const {
+   // external to internal transformation
+   double yy = upper - value + 1.;
+   double arg = yy*yy - 1;
+   return ( arg < 0 ) ? 0 : std::sqrt(arg);
+}
+
+
+double SqrtUpVariableTransformation::DInt2Ext(double value, double, double) const {
+   // derivative of internal to external transofrmation :  d Ext / d Int
+   double val = - value/( std::sqrt( value*value + 1.) );
+   return val;
+}
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/MultiNumGradFunction.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/MultiNumGradFunction.cxx
new file mode 100644
index 0000000..b85bc71
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/MultiNumGradFunction.cxx
@@ -0,0 +1,63 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Dec 20 14:36:31 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ * This library is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License        *
+ * as published by the Free Software Foundation; either version 2     *
+ * of the License, or (at your option) any later version.             *
+ *                                                                    *
+ * This library is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
+ * General Public License for more details.                           *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this library (see file COPYING); if not, write          *
+ * to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
+ * 330, Boston, MA 02111-1307 USA, or contact the author.             *
+ *                                                                    *
+ **********************************************************************/
+
+// implementation file for class MultiNumGradFunction
+
+#include "Math/MultiNumGradFunction.h"
+#include <limits>
+#include <cmath>
+#include <algorithm>    // needed for std::max on Solaris
+
+#ifndef ROOT_Math_Derivator
+#include "Math/Derivator.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Math {
+
+
+double MultiNumGradFunction::fgEps = 0.001;
+
+double MultiNumGradFunction::DoDerivative (const double * x, unsigned int icoord  ) const {
+      // calculate derivative using mathcore derivator class
+   // step size can be changes using SetDerivPrecision()
+
+   static double kPrecision = std::sqrt ( std::numeric_limits<double>::epsilon() );
+   double x0 = std::abs(x[icoord]);
+   //double step = (x0 > 0) ? kPrecision * x0 : kPrecision;
+   // this seems to work better than above
+   double step = (x0>0) ? std::max( fgEps* x0, 8.0*kPrecision*(x0 + kPrecision) ) : kPrecision;
+   return BA_ROOT::Math::Derivator::Eval(*fFunc, x, icoord, step);
+}
+
+void MultiNumGradFunction::SetDerivPrecision(double eps) { fgEps = eps; }
+
+double MultiNumGradFunction::GetDerivPrecision( ) { return fgEps; }
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/PatchedGSLNLSMinimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/PatchedGSLNLSMinimizer.cxx
new file mode 100644
index 0000000..4c96087
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/PatchedGSLNLSMinimizer.cxx
@@ -0,0 +1,404 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Dec 20 17:16:32 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Implementation file for class GSLNLSMinimizer
+
+#include "Math/PatchedGSLNLSMinimizer.h"
+
+#include "Math/MinimTransformFunction.h"
+#include "Math/MultiNumGradFunction.h"
+
+#include "Math/Error.h"
+#include "GSLMultiFit.h"
+#include "gsl/gsl_errno.h"
+
+
+#include "Math/FitMethodFunction.h"
+//#include "Math/Derivator.h"
+
+#include <iostream> 
+#include <iomanip>
+#include <cassert>
+#include <memory>
+
+namespace BA_ROOT { 
+
+   namespace Math { 
+
+
+// class to implement transformation of chi2 function
+// in general could make template on the fit method function type
+
+class FitTransformFunction : public FitMethodFunction { 
+
+public:
+   
+   FitTransformFunction(const FitMethodFunction & f, const std::vector<EMinimVariableType> & types, const std::vector<double> & values, 
+                              const std::map<unsigned int, std::pair<double, double> > & bounds) : 
+      FitMethodFunction( f.NDim(), f.NPoints() ),
+      fOwnTransformation(true),
+      fFunc(f),
+      fTransform(new MinimTransformFunction( new MultiNumGradFunction(f), types, values, bounds) ), 
+      fGrad( std::vector<double>(f.NDim() ) )
+   {
+      // constructor
+      // need to pass to MinimTransformFunction a new pointer which will be managed by the class itself
+      // pass a gradient pointer although it will not be used byb the class 
+   }
+
+   FitTransformFunction(const FitMethodFunction & f, MinimTransformFunction *transFunc ) : 
+      FitMethodFunction( f.NDim(), f.NPoints() ),
+      fOwnTransformation(false),
+      fFunc(f),
+      fTransform(transFunc), 
+      fGrad( std::vector<double>(f.NDim() ) )
+   {
+      // constructor from al already existing Transformation object. Ownership of the transformation onbect is passed to caller
+   }
+
+   ~FitTransformFunction() { 
+      if (fOwnTransformation) { 
+         assert(fTransform); 
+         delete fTransform; 
+      }
+   }
+
+   // re-implement data element
+   virtual double DataElement(const double *  x, unsigned i, double * g = 0) const { 
+      // transform from x internal to x external 
+      const double * xExt = fTransform->Transformation(x); 
+      if ( g == 0) return fFunc.DataElement( xExt, i );
+      // use gradient 
+      double val =  fFunc.DataElement( xExt, i, &fGrad[0]); 
+      // transform gradient 
+      fTransform->GradientTransformation( x, &fGrad.front(), g);  
+      return val; 
+   }
+
+
+   IMultiGenFunction * Clone() const {
+      // not supported
+      return 0; 
+   }
+
+   // dimension (this is number of free dimensions)
+   unsigned int NDim() const { 
+      return fTransform->NDim(); 
+   }
+
+   unsigned int NTot() const { 
+      return fTransform->NTot(); 
+   }
+
+   // forward of transformation functions
+   const double * Transformation( const double * x) const { return fTransform->Transformation(x); }
+
+
+   /// inverse transformation (external -> internal)
+   void  InvTransformation(const double * xext,  double * xint) const { fTransform->InvTransformation(xext,xint); }
+
+   /// inverse transformation for steps (external -> internal) at external point x
+   void  InvStepTransformation(const double * x, const double * sext,  double * sint) const { fTransform->InvStepTransformation(x,sext,sint); }
+
+   ///transform gradient vector (external -> internal) at internal point x
+   void GradientTransformation(const double * x, const double *gext, double * gint) const   { fTransform->GradientTransformation(x,gext,gint); }
+
+   void MatrixTransformation(const double * x, const double *cint, double * cext) const { fTransform->MatrixTransformation(x,cint,cext); }
+
+private: 
+
+   // objects of this class are not meant for copying or assignment
+   FitTransformFunction(const FitTransformFunction& rhs);
+   FitTransformFunction& operator=(const FitTransformFunction& rhs);
+
+   double DoEval(const double * x) const { 
+      return fFunc( fTransform->Transformation(x) );
+   }
+
+   bool fOwnTransformation; 
+   const FitMethodFunction & fFunc;                  // pointer to original fit method function 
+   MinimTransformFunction * fTransform;        // pointer to transformation function
+   mutable std::vector<double> fGrad;          // cached vector of gradient values
+   
+};
+
+
+
+
+// GSLNLSMinimizer implementation
+
+GSLNLSMinimizer::GSLNLSMinimizer( int type ) : 
+   //fNFree(0),
+   fSize(0),
+   fChi2Func(0) 
+{
+   // Constructor implementation : create GSLMultiFit wrapper object
+   const gsl_multifit_fdfsolver_type * gsl_type = 0; // use default type defined in GSLMultiFit
+   if (type == 1) gsl_type =   gsl_multifit_fdfsolver_lmsder; // scaled lmder version
+   if (type == 2) gsl_type =   gsl_multifit_fdfsolver_lmder; // unscaled version      
+
+   fGSLMultiFit = new GSLMultiFit( gsl_type ); 
+
+   fEdm = -1; 
+
+   // default tolerance and max iterations
+   int niter = BA_ROOT::Math::MinimizerOptions::DefaultMaxIterations();
+   if (niter <= 0) niter = 100; 
+   SetMaxIterations(niter); 
+
+   fLSTolerance = BA_ROOT::Math::MinimizerOptions::DefaultTolerance();
+   if (fLSTolerance <=0) fLSTolerance = 0.0001; // default internal value
+
+   SetPrintLevel(BA_ROOT::Math::MinimizerOptions::DefaultPrintLevel());
+}
+
+GSLNLSMinimizer::~GSLNLSMinimizer () { 
+   assert(fGSLMultiFit != 0); 
+   delete fGSLMultiFit; 
+}
+
+
+      
+void GSLNLSMinimizer::SetFunction(const BA_ROOT::Math::IMultiGenFunction & func) { 
+   // set the function to minimizer 
+   // need to create vector of functions to be passed to GSL multifit
+   // support now only CHi2 implementation
+
+   // call base class method. It will clone the function and set ndimension
+   BasicMinimizer::SetFunction(func);
+   //need to check if function can be used
+   const BA_ROOT::Math::FitMethodFunction * chi2Func = dynamic_cast<const BA_ROOT::Math::FitMethodFunction *>(ObjFunction()); 
+   if (chi2Func == 0) { 
+      if (PrintLevel() > 0) std::cout << "GSLNLSMinimizer: Invalid function set - only Chi2Func supported" << std::endl;
+      return;
+   } 
+   fSize = chi2Func->NPoints(); 
+
+   if (fSize == 0) { 
+      MATH_WARN_MSG("GSLNLSMinimizer::SetFunction","Objective function has zero elements");
+   }
+   
+   fNFree = NDim();
+
+   // use vector by value 
+   fResiduals.reserve(fSize);   
+   for (unsigned int i = 0; i < fSize; ++i) { 
+      fResiduals.push_back( LSResidualFunc(*chi2Func, i) ); 
+   }
+   // keep pointers to the chi2 function
+   fChi2Func = chi2Func; 
+ }
+
+void GSLNLSMinimizer::SetFunction(const BA_ROOT::Math::IMultiGradFunction & func ) { 
+   // set the function to minimizer using gradient interface
+   // not supported yet, implemented using the other SetFunction
+   return SetFunction(static_cast<const BA_ROOT::Math::IMultiGenFunction &>(func) );
+}
+
+
+bool GSLNLSMinimizer::Minimize() { 
+   // set initial parameters of the minimizer
+   int debugLevel = PrintLevel(); 
+
+
+   assert (fGSLMultiFit != 0);   
+   if (fResiduals.size() !=  fSize || fChi2Func == 0) {
+      MATH_ERROR_MSG("GSLNLSMinimizer::Minimize","Function has not been  set");
+      return false; 
+   }
+
+   if (fSize == 0) { 
+      MATH_ERROR_MSG("GSLNLSMinimizer::Minimize","Number of data points is zero");
+      return false; 
+   }
+
+   unsigned int npar = NPar();
+   unsigned int ndim = NDim(); 
+   if (npar == 0 || npar < ndim) { 
+       MATH_ERROR_MSGVAL("GSLNLSMinimizer::Minimize","Wrong number of parameters",npar);
+       return false; 
+   }
+   
+   // set residual functions and check if a transformation is needed
+   std::vector<double> startValues;
+   
+   // transformation need a grad function. Delegate fChi2Func to given object
+   MultiNumGradFunction * gradFunction = new MultiNumGradFunction(*fChi2Func);
+   MinimTransformFunction * trFuncRaw  =  CreateTransformation(startValues, gradFunction);
+   // need to transform in a FitTransformFunction which is set in the residual functions
+   std::auto_ptr<FitTransformFunction> trFunc; 
+   if (trFuncRaw) { 
+      trFunc.reset(new FitTransformFunction(*fChi2Func, trFuncRaw) );
+      //FitTransformationFunction *trFunc = new FitTransformFunction(*fChi2Func, trFuncRaw);
+      for (unsigned int ires = 0; ires < fResiduals.size(); ++ires) {
+         fResiduals[ires] = LSResidualFunc(*trFunc, ires);
+      }
+
+      assert(npar == trFunc->NTot() ); 
+   }
+
+   if (debugLevel >=1 ) std::cout <<"Minimize using GSLNLSMinimizer "  << std::endl; 
+
+//    // use a global step size = min (step vectors) 
+//    double stepSize = 1; 
+//    for (unsigned int i = 0; i < fSteps.size(); ++i) 
+//       //stepSize += fSteps[i]; 
+//       if (fSteps[i] < stepSize) stepSize = fSteps[i]; 
+
+   int iret = fGSLMultiFit->Set( fResiduals, &startValues.front() );  
+   if (iret) { 
+      MATH_ERROR_MSGVAL("GSLNLSMinimizer::Minimize","Error setting the residual functions ",iret);
+      return false; 
+   }
+
+   if (debugLevel >=1 ) std::cout <<"GSLNLSMinimizer: " << fGSLMultiFit->Name() << " - start iterating......... "  << std::endl; 
+
+   // start iteration 
+   unsigned  int iter = 0; 
+   int status; 
+   bool minFound = false; 
+   do { 
+      status = fGSLMultiFit->Iterate(); 
+
+      if (debugLevel >=1) { 
+         std::cout << "----------> Iteration " << iter << " / " << MaxIterations() << " status " << gsl_strerror(status)  << std::endl; 
+         const double * x = fGSLMultiFit->X();
+         if (trFunc.get()) x = trFunc->Transformation(x);
+         //int pr = std::cout.precision(18);
+         std::cout << "            FVAL = " << (*fChi2Func)(x) << std::endl; 
+         std::cout << std::setprecision(18);
+         std::cout << "            X Values : "; 
+         for (unsigned int i = 0; i < NDim(); ++i) 
+            std::cout << " " << VariableName(i) << " = " << X()[i]; 
+         std::cout << std::endl; 
+      }
+
+      if (status) break; 
+
+      // check also the delta in X()
+      status = fGSLMultiFit->TestDelta( Tolerance(), Tolerance() );
+      if (status == GSL_SUCCESS) {
+         minFound = true; 
+      }
+
+      // double-check with the gradient
+      int status2 = fGSLMultiFit->TestGradient( Tolerance() );
+      if ( minFound && status2 != GSL_SUCCESS) {
+         // check now edm 
+         fEdm = fGSLMultiFit->Edm(); 
+         if (fEdm > Tolerance() ) { 
+            // continue the iteration
+            status = status2; 
+            minFound = false; 
+         }
+      }
+
+      if (debugLevel >=1) { 
+         std::cout  << "          after Gradient and Delta tests:  " << gsl_strerror(status); 
+         if (fEdm > 0) std::cout << ", edm is:  " << fEdm;
+         std::cout << std::endl;
+      }
+
+      iter++;
+
+   }
+   while (status == GSL_CONTINUE && iter < MaxIterations() );
+
+   // check edm 
+   fEdm = fGSLMultiFit->Edm();
+   if ( fEdm < Tolerance() ) { 
+      minFound = true; 
+   }
+
+   // save state with values and function value
+   const double * x = fGSLMultiFit->X(); 
+   if (x == 0) return false; 
+
+   SetFinalValues(x);
+
+   SetMinValue( (*fChi2Func)( x ) );
+   fStatus = status; 
+
+   fErrors.resize(NDim());
+
+   // get errors from cov matrix 
+
+   const double * cov =  fGSLMultiFit->CovarMatrix();
+   if (cov) { 
+
+      fCovMatrix.resize(ndim*ndim);
+      
+      if (trFunc.get() ) { 
+         trFunc->MatrixTransformation(x, fGSLMultiFit->CovarMatrix(), &fCovMatrix[0] ); 
+      }
+      else {
+         std::copy(cov, cov + ndim*ndim, fCovMatrix.begin() );
+      }
+         
+      for (unsigned int i = 0; i < ndim; ++i)
+         fErrors[i] = std::sqrt(fCovMatrix[i*ndim + i]);
+   }
+
+   if (minFound) { 
+
+      if (debugLevel >=1 ) { 
+         std::cout << "GSLNLSMinimizer: Minimum Found" << std::endl;  
+         //int pr = std::cout.precision(18);
+         std::cout << "FVAL         = " << MinValue() << std::endl;
+         std::cout << "Edm          = " << fEdm    << std::endl;
+         std::cout << std::setprecision(18);
+         std::cout << "NIterations  = " << iter << std::endl;
+         std::cout << "NFuncCalls   = " << fChi2Func->NCalls() << std::endl;
+         for (unsigned int i = 0; i < NDim(); ++i) 
+            std::cout << std::setw(12) <<  VariableName(i) << " = " << std::setw(12) << X()[i] << "   +/-   " << std::setw(12) << fErrors[i] << std::endl; 
+      }
+
+      return true; 
+   }
+   else { 
+      if (debugLevel >=1 ) { 
+         std::cout << "GSLNLSMinimizer: Minimization did not converge" << std::endl;  
+         std::cout << "FVAL         = " << MinValue() << std::endl;
+         std::cout << "Edm   = " << fGSLMultiFit->Edm() << std::endl;
+         std::cout << "Niterations  = " << iter << std::endl;
+      }
+      return false; 
+   }
+   return false; 
+}
+
+const double * GSLNLSMinimizer::MinGradient() const {
+   // return gradient (internal values)
+   return fGSLMultiFit->Gradient(); 
+}
+
+
+double GSLNLSMinimizer::CovMatrix(unsigned int i , unsigned int j ) const { 
+   // return covariance matrix element
+   unsigned int ndim = NDim();
+   if ( fCovMatrix.size() == 0) return 0;  
+   if (i > ndim || j > ndim) return 0; 
+   return fCovMatrix[i*ndim + j];
+}
+
+int GSLNLSMinimizer::CovMatrixStatus( ) const { 
+   // return covariance  matrix status = 0 not computed,
+   // 1 computed but is approximate because minimum is not valid, 3 is fine
+   if ( fCovMatrix.size() == 0) return 0;  
+   // case minimization did not finished correctly
+   if (fStatus != GSL_SUCCESS) return 1;
+   return 3;
+}
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/PatchedGSLSimAnMinimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/PatchedGSLSimAnMinimizer.cxx
new file mode 100644
index 0000000..b4d2423
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/PatchedGSLSimAnMinimizer.cxx
@@ -0,0 +1,132 @@
+// @(#)root/mathmore:$Id$
+// Author: L. Moneta Wed Dec 20 17:16:32 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Implementation file for class GSLSimAnMinimizer
+
+#include "Math/PatchedGSLSimAnMinimizer.h"
+#include "Math/WrappedParamFunction.h"
+#include "Math/Error.h"
+
+#include "Math/MinimTransformFunction.h"
+#include "Math/MultiNumGradFunction.h"   // needed to use transformation function
+#include "Math/FitMethodFunction.h"
+
+#include <iostream> 
+#include <cassert>
+#include <iomanip>
+
+namespace BA_ROOT { 
+
+   namespace Math { 
+
+
+
+// GSLSimAnMinimizer implementation
+
+GSLSimAnMinimizer::GSLSimAnMinimizer( int /* ROOT::Math::EGSLSimAnMinimizerType type */ ) :
+   BasicMinimizer()
+{
+   // Constructor implementation : create GSLMultiFit wrapper object
+
+   SetMaxIterations(100);
+   SetPrintLevel(0);
+}
+
+GSLSimAnMinimizer::~GSLSimAnMinimizer () { 
+}
+
+
+bool GSLSimAnMinimizer::Minimize() { 
+   // set initial parameters of the minimizer
+   int debugLevel = PrintLevel(); 
+
+   if (debugLevel >=1 ) std::cout <<"Minimize using GSLSimAnMinimizer " << std::endl; 
+
+   const BA_ROOT::Math::IMultiGenFunction * function = ObjFunction();
+   if (function == 0) { 
+      MATH_ERROR_MSG("GSLSimAnMinimizer::Minimize","Function has not been set");
+      return false; 
+   }
+
+   // vector of internal values (copied by default) 
+   unsigned int npar = NPar();
+   std::vector<double> xvar;
+   std::vector<double> steps(StepSizes(),StepSizes()+npar);   
+
+   // needed for the transformation
+   MultiNumGradFunction * gradFunc = new MultiNumGradFunction( *function );
+   gradFunc->SetOwnership();
+
+   MinimTransformFunction * trFunc  = CreateTransformation(xvar, gradFunc );
+   // ObjFunction() will return now the new transformed function 
+
+   if (trFunc) { 
+      // transform also the step sizes
+      trFunc->InvStepTransformation(X(), StepSizes(), &steps[0]);
+      steps.resize( trFunc->NDim() ); 
+   }
+
+   assert (xvar.size() == steps.size() );         
+
+
+#ifdef DEBUG
+   for (unsigned int i = 0; i < npar ; ++i) {
+      std::cout << "x  = " << xvar[i] << " steps " << steps[i] << "  x " << X()[i] << std::endl;
+   }
+   std::cout << "f(x) = " <<  (*ObjFunction())(&xvar.front() ) << std::endl;
+   std::cout << "f(x) not transf = " <<  (*function)( X() ) << std::endl;
+   if (trFunc) std::cout << "ftrans(x) = " <<  (*trFunc) (&xvar.front() ) << std::endl;
+#endif
+
+   // output vector 
+   std::vector<double> xmin(xvar.size() ); 
+  
+
+   int iret = fSolver.Solve(*ObjFunction(), &xvar.front(), &steps.front(), &xmin[0], (debugLevel > 1) );
+
+   SetMinValue( (*ObjFunction())(&xmin.front() ) );
+
+   SetFinalValues(&xmin.front());
+
+
+   if (debugLevel >=1 ) { 
+      if (iret == 0)  
+         std::cout << "GSLSimAnMinimizer: Minimum Found" << std::endl;  
+      else 
+         std::cout << "GSLSimAnMinimizer: Error in solving" << std::endl;  
+
+      //int pr = std::cout.precision(18);
+      std::cout << "FVAL         = " << MinValue() << std::endl;
+	  std::cout << std::setprecision(18);
+      for (unsigned int i = 0; i < NDim(); ++i) 
+         std::cout << VariableName(i) << std::string("\t  = ") << X()[i] << std::endl; 
+   }
+                                                           
+
+   return ( iret == 0) ? true : false; 
+}
+
+
+unsigned int GSLSimAnMinimizer::NCalls() const { 
+   // return number of function calls 
+   const BA_ROOT::Math::MinimTransformFunction * tfunc = dynamic_cast<const BA_ROOT::Math::MinimTransformFunction *>(ObjFunction());   
+   const BA_ROOT::Math::MultiNumGradFunction * f = 0; 
+   if (tfunc) f = dynamic_cast<const BA_ROOT::Math::MultiNumGradFunction *>(tfunc->OriginalFunction());
+   else 
+      f = dynamic_cast<const BA_ROOT::Math::MultiNumGradFunction *>(ObjFunction());
+   if (f) return f->NCalls();
+   return 0; 
+}
+
+
+   } // end namespace Math
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Math/RandomFunctions.cxx b/ThirdParty/Fit/RootMinimizers/src/Math/RandomFunctions.cxx
new file mode 100644
index 0000000..bebca8c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Math/RandomFunctions.cxx
@@ -0,0 +1,365 @@
+// @(#)root/mathcore:$Id$
+// Authors: L. Moneta    8/2015
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2015 , ROOT MathLib Team                             *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// file for random class
+//
+//
+// Created by: Lorenzo Moneta  : Tue 4 Aug 2015
+//
+//
+#include "Math/RandomFunctions.h"
+
+//#include "Math/DistFunc.h"
+
+//#include "TMath.h"
+
+namespace BA_ROOT {
+namespace Math {
+   
+
+Int_t RandomFunctionsImpl<TRandomEngine>::Binomial(Int_t ntot, Double_t prob)
+{
+   if (prob < 0 || prob > 1) return 0;
+   Int_t n = 0;
+   for (Int_t i=0;i<ntot;i++) {
+      if (Rndm() > prob) continue;
+      n++;
+   }
+   return n;
+}
+
+   ////////////////////////////////////////////////////////////////////////////////
+/// Return a number distributed following a BreitWigner function with mean and gamma.
+
+Double_t RandomFunctionsImpl<TRandomEngine>::BreitWigner(Double_t mean, Double_t gamma)
+{
+   Double_t rval, displ;
+   rval = 2*Rndm() - 1;
+   displ = 0.5*gamma*std::tan(rval*M_PI/2.);
+
+   return (mean+displ);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Generates random vectors, uniformly distributed over a circle of given radius.
+///   Input : r = circle radius
+///   Output: x,y a random 2-d vector of length r
+
+void RandomFunctionsImpl<TRandomEngine>::Circle(Double_t &x, Double_t &y, Double_t r)
+{
+   Double_t phi = Uniform(0,M_PI*2.0);
+   x = r*std::cos(phi);
+   y = r*std::sin(phi);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Returns an exponential deviate.
+///
+///          exp( -t/tau )
+
+Double_t RandomFunctionsImpl<TRandomEngine>::Exp(Double_t tau)
+{
+   Double_t x = Rndm();              // uniform on ] 0, 1 ]
+   Double_t t = -tau * std::log( x ); // convert to exponential distribution
+   return t;
+}
+
+   
+
+   
+double RandomFunctionsImpl<TRandomEngine>::GausBM(double mean, double sigma) {
+   double y =  Rndm();
+   double z =  Rndm();
+   double x = z * 6.28318530717958623;
+   double radius = std::sqrt(-2*std::log(y));
+   double g = radius * std::sin(x);
+   return mean + g * sigma; 
+}
+
+
+   // double GausImpl(TRandomEngine * r, double mean, double sigma) {
+   //    double y =  r->Rndm();
+   //    double z =  r->Rndm();
+   //    double x = z * 6.28318530717958623;
+   //    double radius = std::sqrt(-2*std::log(y));
+   //    double g = radius * std::sin(x);
+   //    return mean + g * sigma; 
+   // }
+
+double RandomFunctionsImpl<TRandomEngine>::GausACR(Double_t mean, Double_t sigma)
+{
+   const Double_t kC1 = 1.448242853;
+   const Double_t kC2 = 3.307147487;
+   const Double_t kC3 = 1.46754004;
+   const Double_t kD1 = 1.036467755;
+   const Double_t kD2 = 5.295844968;
+   const Double_t kD3 = 3.631288474;
+   const Double_t kHm = 0.483941449;
+   const Double_t kZm = 0.107981933;
+   const Double_t kHp = 4.132731354;
+   const Double_t kZp = 18.52161694;
+   const Double_t kPhln = 0.4515827053;
+   const Double_t kHm1 = 0.516058551;
+   const Double_t kHp1 = 3.132731354;
+   const Double_t kHzm = 0.375959516;
+   const Double_t kHzmp = 0.591923442;
+   /*zhm 0.967882898*/
+
+   const Double_t kAs = 0.8853395638;
+   const Double_t kBs = 0.2452635696;
+   const Double_t kCs = 0.2770276848;
+   const Double_t kB  = 0.5029324303;
+   const Double_t kX0 = 0.4571828819;
+   const Double_t kYm = 0.187308492 ;
+   const Double_t kS  = 0.7270572718 ;
+   const Double_t kT  = 0.03895759111;
+
+   Double_t result;
+   Double_t rn,x,y,z;
+
+   do {
+      y = Rndm();
+
+      if (y>kHm1) {
+         result = kHp*y-kHp1; break; }
+
+      else if (y<kZm) {
+         rn = kZp*y-1;
+         result = (rn>0) ? (1+rn) : (-1+rn);
+         break;
+      }
+
+      else if (y<kHm) {
+         rn = Rndm();
+         rn = rn-1+rn;
+         z = (rn>0) ? 2-rn : -2-rn;
+         if ((kC1-y)*(kC3+std::abs(z))<kC2) {
+            result = z; break; }
+         else {
+            x = rn*rn;
+            if ((y+kD1)*(kD3+x)<kD2) {
+               result = rn; break; }
+            else if (kHzmp-y<exp(-(z*z+kPhln)/2)) {
+               result = z; break; }
+            else if (y+kHzm<exp(-(x+kPhln)/2)) {
+               result = rn; break; }
+         }
+      }
+
+      while (1) {
+         x = Rndm();
+         y = kYm * Rndm();
+         z = kX0 - kS*x - y;
+         if (z>0)
+            rn = 2+y/x;
+         else {
+            x = 1-x;
+            y = kYm-y;
+            rn = -(2+y/x);
+         }
+         if ((y-kAs+x)*(kCs+x)+kBs<0) {
+            result = rn; break; }
+         else if (y<x+kT)
+            if (rn*rn<4*(kB-log(x))) {
+               result = rn; break; }
+      }
+   } while(0);
+
+   return mean + sigma * result;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Generate a random number following a Landau distribution
+/// with location parameter mu and scale parameter sigma:
+///      Landau( (x-mu)/sigma )
+/// Note that mu is not the mpv(most probable value) of the Landa distribution
+/// and sigma is not the standard deviation of the distribution which is not defined.
+/// For mu  =0 and sigma=1, the mpv = -0.22278
+///
+/// The Landau random number generation is implemented using the
+/// function landau_quantile(x,sigma), which provides
+/// the inverse of the landau cumulative distribution.
+/// landau_quantile has been converted from CERNLIB ranlan(G110).
+
+//Double_t RandomFunctionsImpl<TRandomEngine>::Landau(Double_t mu, Double_t sigma)
+//{
+//   if (sigma <= 0) return 0;
+//   Double_t x = Rndm();
+//   Double_t res = mu + BA_ROOT::Math::landau_quantile(x, sigma);
+//   return res;
+//}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Generates a random integer N according to a Poisson law.
+/// Prob(N) = exp(-mean)*mean^N/Factorial(N)
+///
+/// Use a different procedure according to the mean value.
+/// The algorithm is the same used by CLHEP.
+/// For lower value (mean < 25) use the rejection method based on
+/// the exponential.
+/// For higher values use a rejection method comparing with a Lorentzian
+/// distribution, as suggested by several authors.
+/// This routine since is returning 32 bits integer will not work for values
+/// larger than 2*10**9.
+/// One should then use the Trandom::PoissonD for such large values.
+
+//Int_t RandomFunctionsImpl<TRandomEngine>::Poisson(Double_t mean)
+//{
+//   Int_t n;
+//   if (mean <= 0) return 0;
+//   if (mean < 25) {
+//      Double_t expmean = std::exp(-mean);
+//      Double_t pir = 1;
+//      n = -1;
+//      while(1) {
+//         n++;
+//         pir *= Rndm();
+//         if (pir <= expmean) break;
+//      }
+//      return n;
+//   }
+//   // for large value we use inversion method
+//   else if (mean < 1E9) {
+//      Double_t em, t, y;
+//      Double_t sq, alxm, g;
+//      Double_t pi = M_PI;
+
+//      sq = std::sqrt(2.0*mean);
+//      alxm = std::log(mean);
+//      g = mean*alxm - TMath::LnGamma(mean + 1.0);
+
+//      do {
+//         do {
+//            y = std::tan(pi*Rndm());
+//            em = sq*y + mean;
+//         } while( em < 0.0 );
+
+//         em = std::floor(em);
+//         t = 0.9*(1.0 + y*y)* std::exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
+//      } while( Rndm() > t );
+
+//      return static_cast<Int_t> (em);
+
+//   }
+//   else {
+//      // use Gaussian approximation vor very large values
+//      n = Int_t(Gaus(0,1)*std::sqrt(mean) + mean +0.5);
+//      return n;
+//   }
+//}
+
+//////////////////////////////////////////////////////////////////////////////////
+///// Generates a random number according to a Poisson law.
+///// Prob(N) = exp(-mean)*mean^N/Factorial(N)
+/////
+///// This function is a variant of RandomFunctionsImpl<TRandomEngine>::Poisson returning a double
+///// instead of an integer.
+
+//Double_t RandomFunctionsImpl<TRandomEngine>::PoissonD(Double_t mean)
+//{
+//   Int_t n;
+//   if (mean <= 0) return 0;
+//   if (mean < 25) {
+//      Double_t expmean = std::exp(-mean);
+//      Double_t pir = 1;
+//      n = -1;
+//      while(1) {
+//         n++;
+//         pir *= Rndm();
+//         if (pir <= expmean) break;
+//      }
+//      return static_cast<Double_t>(n);
+//   }
+//   // for large value we use inversion method
+//   else if (mean < 1E9) {
+//      Double_t em, t, y;
+//      Double_t sq, alxm, g;
+//      Double_t pi = M_PI;
+
+//      sq = std::sqrt(2.0*mean);
+//      alxm = std::log(mean);
+//      g = mean*alxm - TMath::LnGamma(mean + 1.0);
+
+//      do {
+//         do {
+//            y = std::tan(pi*Rndm());
+//            em = sq*y + mean;
+//         } while( em < 0.0 );
+
+//         em = std::floor(em);
+//         t = 0.9*(1.0 + y*y)* std::exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
+//      } while( Rndm() > t );
+
+//      return em;
+
+//   } else {
+//      // use Gaussian approximation vor very large values
+//      return Gaus(0,1)*std::sqrt(mean) + mean +0.5;
+//   }
+//}
+
+
+////////////////////////////////////////////////////////////////////////////////
+/// Return 2 numbers distributed following a gaussian with mean=0 and sigma=1.
+
+void RandomFunctionsImpl<TRandomEngine>::Rannor(Double_t &a, Double_t &b)
+{
+   Double_t r, x, y, z;
+
+   y = Rndm();
+   z = Rndm();
+   x = z * 6.28318530717958623;
+   r = std::sqrt(-2*std::log(y));
+   a = r * std::sin(x);
+   b = r * std::cos(x);
+}
+   
+////////////////////////////////////////////////////////////////////////////////
+/// Generates random vectors, uniformly distributed over the surface
+/// of a sphere of given radius.
+///   Input : r = sphere radius
+///   Output: x,y,z a random 3-d vector of length r
+/// Method: (based on algorithm suggested by Knuth and attributed to Robert E Knop)
+///         which uses less random numbers than the CERNLIB RN23DIM algorithm
+
+void RandomFunctionsImpl<TRandomEngine>::Sphere(Double_t &x, Double_t &y, Double_t &z, Double_t r)
+{
+   Double_t a=0,b=0,r2=1;
+   while (r2 > 0.25) {
+      a  = Rndm() - 0.5;
+      b  = Rndm() - 0.5;
+      r2 =  a*a + b*b;
+   }
+   z = r* ( -1. + 8.0 * r2 );
+
+   Double_t scale = 8.0 * r * std::sqrt(0.25 - r2);
+   x = a*scale;
+   y = b*scale;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Returns a uniform deviate on the interval  (0, x1).
+
+Double_t RandomFunctionsImpl<TRandomEngine>::Uniform(Double_t x1)
+{
+   Double_t ans = Rndm();
+   return x1*ans;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Returns a uniform deviate on the interval (x1, x2).
+
+double RandomFunctionsImpl<TRandomEngine>::Uniform(double a, double b) {
+   return (b-a) * Rndm() + a; 
+}
+   
+  
+   } // namespace Math
+} // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/AnalyticalGradientCalculator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/AnalyticalGradientCalculator.cxx
new file mode 100644
index 0000000..028d5dc
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/AnalyticalGradientCalculator.cxx
@@ -0,0 +1,56 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/AnalyticalGradientCalculator.h"
+#include "Minuit2/FCNGradientBase.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/MnMatrix.h"
+
+namespace BA_ROOT {
+   namespace Minuit2 {
+
+
+FunctionGradient AnalyticalGradientCalculator::operator()(const MinimumParameters& par) const {
+   // evaluate analytical gradient. take care of parameter transformations
+
+   std::vector<double> grad = fGradCalc.Gradient(fTransformation(par.Vec()));
+   assert(grad.size() == fTransformation.Parameters().size());
+
+   MnAlgebraicVector v(par.Vec().size());
+   for(unsigned int i = 0; i < par.Vec().size(); i++) {
+      unsigned int ext = fTransformation.ExtOfInt(i);
+      if(fTransformation.Parameter(ext).HasLimits()) {
+         //double dd = (fTransformation.Parameter(ext).Upper() - fTransformation.Parameter(ext).Lower())*0.5*cos(par.Vec()(i));
+         //       const ParameterTransformation * pt = fTransformation.transformation(ext);
+         //       double dd = pt->dInt2ext(par.Vec()(i), fTransformation.Parameter(ext).Lower(), fTransformation.Parameter(ext).Upper() );
+         double dd = fTransformation.DInt2Ext(i, par.Vec()(i));
+         v(i) = dd*grad[ext];
+      } else {
+         v(i) = grad[ext];
+      }
+   }
+
+   return FunctionGradient(v);
+}
+
+FunctionGradient AnalyticalGradientCalculator::operator()(const MinimumParameters& par, const FunctionGradient&) const {
+   // needed from base class
+   return (*this)(par);
+}
+
+bool AnalyticalGradientCalculator::CheckGradient() const {
+   // check to be sure FCN implements analytical gradient
+   return fGradCalc.CheckGradient();
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/BasicMinimumError.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/BasicMinimumError.cxx
new file mode 100644
index 0000000..f3861fe
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/BasicMinimumError.cxx
@@ -0,0 +1,42 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/BasicMinimumError.h"
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+MnAlgebraicSymMatrix BasicMinimumError::Hessian() const {
+   // calculate Heassian: inverse of error matrix
+   MnAlgebraicSymMatrix tmp(fMatrix);
+   int ifail = Invert(tmp);
+   if(ifail != 0) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("BasicMinimumError:  inversion fails; return diagonal matrix.");
+#endif
+      MnAlgebraicSymMatrix tmp2(fMatrix.Nrow());
+      for(unsigned int i = 0; i < fMatrix.Nrow(); i++) {
+         tmp2(i,i) = 1./fMatrix(i,i);
+      }
+      return tmp2;
+   }
+   return tmp;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/CombinedMinimumBuilder.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/CombinedMinimumBuilder.cxx
new file mode 100644
index 0000000..016e389
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/CombinedMinimumBuilder.cxx
@@ -0,0 +1,61 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/CombinedMinimumBuilder.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnStrategy.h"
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+FunctionMinimum CombinedMinimumBuilder::Minimum(const MnFcn& fcn, const GradientCalculator& gc, const MinimumSeed& seed, const MnStrategy& strategy, unsigned int maxfcn, double edmval) const {
+   // find minimum using combined method
+   // (Migrad then if fails try Simplex and then Migrad again)
+
+   FunctionMinimum min = fVMMinimizer.Builder().Minimum(fcn, gc, seed, strategy, maxfcn, edmval);
+
+   if(!min.IsValid()) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("CombinedMinimumBuilder: migrad method fails, will try with simplex method first.");
+#endif
+      MnStrategy str(2);
+      FunctionMinimum min1 = fSimplexMinimizer.Builder().Minimum(fcn, gc, seed, str, maxfcn, edmval);
+      if(!min1.IsValid()) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("CombinedMinimumBuilder: both migrad and simplex method fail.");
+#endif
+         return min1;
+      }
+      MinimumSeed seed1 = fVMMinimizer.SeedGenerator()(fcn, gc, min1.UserState(), str);
+
+      FunctionMinimum min2 = fVMMinimizer.Builder().Minimum(fcn, gc, seed1, str, maxfcn, edmval);
+      if(!min2.IsValid()) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("CombinedMinimumBuilder: both migrad and method fails also at 2nd attempt.");
+         MN_INFO_MSG("CombinedMinimumBuilder: return simplex Minimum.");
+#endif
+         return min1;
+      }
+
+      return min2;
+   }
+
+   return min;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/DavidonErrorUpdator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/DavidonErrorUpdator.cxx
new file mode 100644
index 0000000..77137ac
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/DavidonErrorUpdator.cxx
@@ -0,0 +1,181 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/DavidonErrorUpdator.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/LaSum.h"
+#include "Minuit2/LaProd.h"
+
+//#define DEBUG
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double inner_product(const LAVector&, const LAVector&);
+double similarity(const LAVector&, const LASymMatrix&);
+double sum_of_elements(const LASymMatrix&);
+
+MinimumError DavidonErrorUpdator::Update(const MinimumState& s0,
+                                         const MinimumParameters& p1,
+                                         const FunctionGradient& g1) const {
+
+   // update of the covarianze matrix (Davidon formula, see Tutorial, par. 4.8 pag 26)
+   // in case of delgam > gvg (PHI > 1) use rank one formula
+   // see  par 4.10 pag 30
+
+   const MnAlgebraicSymMatrix& v0 = s0.Error().InvHessian();
+   MnAlgebraicVector dx = p1.Vec() - s0.Vec();
+   MnAlgebraicVector dg = g1.Vec() - s0.Gradient().Vec();
+
+   double delgam = inner_product(dx, dg);
+   double gvg = similarity(dg, v0);
+
+
+#ifdef DEBUG
+   std::cout << "dx = " << dx << std::endl;
+   std::cout << "dg = " << dg << std::endl;
+   std::cout<<"delgam= "<<delgam<<" gvg= "<<gvg<<std::endl;
+#endif
+
+   if (delgam == 0 ) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("DavidonErrorUpdator: delgam = 0 : cannot update - return same matrix ");
+#endif
+      return s0.Error();
+   }
+#ifdef WARNINGMSG
+   if (delgam < 0)  MN_INFO_MSG("DavidonErrorUpdator: delgam < 0 : first derivatives increasing along search line");
+#endif
+
+   if (gvg <= 0 ) {
+      // since v0 is pos def this gvg can be only = 0 if  dg = 0 - should never be here
+#ifdef WARNINGMSG
+      MN_INFO_MSG("DavidonErrorUpdator: gvg <= 0 : cannot update - return same matrix ");
+#endif
+      return s0.Error();
+   }
+
+
+   MnAlgebraicVector vg = v0*dg;
+
+   MnAlgebraicSymMatrix vUpd = Outer_product(dx)/delgam - Outer_product(vg)/gvg;
+
+   if(delgam > gvg) {
+      // use rank 1 formula
+      vUpd += gvg*Outer_product(MnAlgebraicVector(dx/delgam - vg/gvg));
+   }
+
+   double sum_upd = sum_of_elements(vUpd);
+   vUpd += v0;
+
+   double dcov = 0.5*(s0.Error().Dcovar() + sum_upd/sum_of_elements(vUpd));
+
+   return MinimumError(vUpd, dcov);
+}
+
+/*
+MinimumError DavidonErrorUpdator::Update(const MinimumState& s0,
+                const MinimumParameters& p1,
+                const FunctionGradient& g1) const {
+
+  const MnAlgebraicSymMatrix& v0 = s0.Error().InvHessian();
+  MnAlgebraicVector dx = p1.Vec() - s0.Vec();
+  MnAlgebraicVector dg = g1.Vec() - s0.Gradient().Vec();
+
+  double delgam = inner_product(dx, dg);
+  double gvg = similarity(dg, v0);
+
+//   std::cout<<"delgam= "<<delgam<<" gvg= "<<gvg<<std::endl;
+  MnAlgebraicVector vg = v0*dg;
+//   MnAlgebraicSymMatrix vUpd(v0.Nrow());
+
+//   MnAlgebraicSymMatrix dd = ( 1./delgam )*outer_product(dx);
+//   dd *= ( 1./delgam );
+//   MnAlgebraicSymMatrix VggV = ( 1./gvg )*outer_product(vg);
+//   VggV *= ( 1./gvg );
+//   vUpd = dd - VggV;
+//   MnAlgebraicSymMatrix vUpd = ( 1./delgam )*outer_product(dx) - ( 1./gvg )*outer_product(vg);
+  MnAlgebraicSymMatrix vUpd = Outer_product(dx)/delgam - Outer_product(vg)/gvg;
+
+  if(delgam > gvg) {
+//     dx *= ( 1./delgam );
+//     vg *= ( 1./gvg );
+//     MnAlgebraicVector flnu = dx - vg;
+//     MnAlgebraicSymMatrix tmp = Outer_product(flnu);
+//     tmp *= gvg;
+//     vUpd = vUpd + tmp;
+    vUpd += gvg*outer_product(dx/delgam - vg/gvg);
+  }
+
+//
+//     MnAlgebraicSymMatrix dd = Outer_product(dx);
+//     dd *= ( 1./delgam );
+//     MnAlgebraicSymMatrix VggV = Outer_product(vg);
+//     VggV *= ( 1./gvg );
+//     vUpd = dd - VggV;
+//
+//
+//   double phi = delgam/(delgam - gvg);
+
+//   MnAlgebraicSymMatrix vUpd(v0.Nrow());
+//   if(phi < 0) {
+//     // rank-2 Update
+//     MnAlgebraicSymMatrix dd = Outer_product(dx);
+//     dd *= ( 1./delgam );
+//     MnAlgebraicSymMatrix VggV = Outer_product(vg);
+//     VggV *= ( 1./gvg );
+//     vUpd = dd - VggV;
+//   }
+//   if(phi > 1) {
+//     // rank-1 Update
+//     MnAlgebraicVector tmp = dx - vg;
+//     vUpd = Outer_product(tmp);
+//     vUpd *= ( 1./(delgam - gvg) );
+//   }
+//
+
+//
+//   if(delgam > gvg) {
+//     // rank-1 Update
+//     MnAlgebraicVector tmp = dx - vg;
+//     vUpd = Outer_product(tmp);
+//     vUpd *= ( 1./(delgam - gvg) );
+//   } else {
+//     // rank-2 Update
+//     MnAlgebraicSymMatrix dd = Outer_product(dx);
+//     dd *= ( 1./delgam );
+//     MnAlgebraicSymMatrix VggV = Outer_productn(vg);
+//     VggV *= ( 1./gvg );
+//     vUpd = dd - VggV;
+//   }
+//
+
+  double sum_upd = sum_of_elements(vUpd);
+  vUpd += v0;
+
+//   MnAlgebraicSymMatrix V1 = v0 + vUpd;
+
+  double dcov =
+    0.5*(s0.Error().Dcovar() + sum_upd/sum_of_elements(vUpd));
+
+  return MinimumError(vUpd, dcov);
+}
+*/
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliBuilder.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliBuilder.cxx
new file mode 100644
index 0000000..29b09cf
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliBuilder.cxx
@@ -0,0 +1,433 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/FumiliBuilder.h"
+#include "Minuit2/FumiliStandardMaximumLikelihoodFCN.h"
+#include "Minuit2/GradientCalculator.h"
+//#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/MinimumError.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnLineSearch.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MnPosDef.h"
+#include "Minuit2/MnParabolaPoint.h"
+#include "Minuit2/LaSum.h"
+#include "Minuit2/LaProd.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnHesse.h"
+
+
+
+// //#define DEBUG 1
+// #if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+//#endif
+
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+
+double inner_product(const LAVector&, const LAVector&);
+
+FunctionMinimum FumiliBuilder::Minimum(const MnFcn& fcn, const GradientCalculator& gc, const MinimumSeed& seed, const MnStrategy& strategy, unsigned int maxfcn, double edmval) const {
+   // top level function to find minimum from a given initial seed
+   // iterate on a minimum search in case of first attempt is not successful
+
+   edmval *= 0.0001;
+   //edmval *= 0.1; // use small factor for Fumili
+
+
+#ifdef DEBUG
+   std::cout<<"FumiliBuilder convergence when edm < "<<edmval<<std::endl;
+#endif
+
+   if(seed.Parameters().Vec().size() == 0) {
+      return FunctionMinimum(seed, fcn.Up());
+   }
+
+
+   //   double edm = Estimator().Estimate(seed.Gradient(), seed.Error());
+   double edm = seed.State().Edm();
+
+   FunctionMinimum min(seed, fcn.Up() );
+
+   if(edm < 0.) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("FumiliBuilder: initial matrix not pos.def.");
+#endif
+      return min;
+   }
+
+   std::vector<MinimumState> result;
+   //   result.reserve(1);
+   result.reserve(8);
+
+   result.push_back( seed.State() );
+
+   int printLevel = PrintLevel();
+   if (printLevel >1) {
+      std::cout << "Fumili: start iterating until Edm is < " << edmval << std::endl;
+      MnPrint::PrintState(std::cout, seed.State(), "Fumili: Initial state  ");
+   }
+   if (TraceIter() ) TraceIteration(result.size()-1, result.back() );
+
+
+   // do actual iterations
+
+
+   // try first with a maxfxn = 50% of maxfcn
+   // Fumili in principle needs much less iterations
+   int maxfcn_eff = int(0.5*maxfcn);
+   int ipass = 0;
+   double edmprev = 1;
+
+   do {
+
+
+      min = Minimum(fcn, gc, seed, result, maxfcn_eff, edmval);
+
+
+      // second time check for validity of function Minimum
+      if (ipass > 0) {
+         if(!min.IsValid()) {
+#ifdef WARNINGMSG
+            MN_INFO_MSG("FumiliBuilder: FunctionMinimum is invalid.");
+#endif
+            return min;
+         }
+      }
+
+      // resulting edm of minimization
+      edm = result.back().Edm();
+
+#ifdef DEBUG
+      std::cout << "approximate edm is  " << edm << std::endl;
+      std::cout << "npass is " << ipass << std::endl;
+#endif
+
+      // call always Hesse (error matrix from Fumili is never accurate since is approximate)
+
+#ifdef DEBUG
+      std::cout << "FumiliBuilder will verify convergence and Error matrix. " << std::endl;
+      std::cout << "dcov is =  "<<  min.Error().Dcovar() << std::endl;
+#endif
+
+//       // recalculate the gradient using the numerical gradient calculator
+//       Numerical2PGradientCalculator ngc(fcn, min.Seed().Trafo(), strategy);
+//       FunctionGradient ng = ngc( min.State().Parameters() );
+//       MinimumState tmp( min.State().Parameters(), min.State().Error(), ng, min.State().Edm(), min.State().NFcn() );
+
+      MinimumState st = MnHesse(strategy)(fcn, min.State(), min.Seed().Trafo(),maxfcn);
+      result.push_back( st );
+
+      if (printLevel > 1) {
+         MnPrint::PrintState(std::cout, st, "Fumili: After Hessian  ");
+         if (TraceIter() ) TraceIteration(result.size()-1, result.back() );
+      }
+
+
+      // check edm
+      edm = st.Edm();
+#ifdef DEBUG
+      std::cout << "edm after Hesse calculation " << edm << std::endl;
+      std::cout << "state after Hessian calculation  " << st << std::endl;
+#endif
+
+      // break the loop if edm is NOT getting smaller
+      if (ipass > 0 && edm >= edmprev) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("FumiliBuilder: Exit iterations, no improvements after Hesse ");
+         MN_INFO_VAL2("current edm is ", edm);
+         MN_INFO_VAL2("previous value ",edmprev);
+#endif
+         break;
+      }
+      if (edm > edmval) {
+#ifdef DEBUG
+         std::cout << "FumiliBuilder: Tolerance is not sufficient - edm is " << edm << " requested " << edmval
+                   << " continue the minimization" << std::endl;
+#endif
+      }
+      else {
+         // Case when edm < edmval after Heasse but min is flagged eith a  bad edm:
+         // make then a new Function minimum since now edm is ok
+         if (min.IsAboveMaxEdm() ) {
+            min = FunctionMinimum( min.Seed(), min.States(), min.Up() );
+            break;
+         }
+
+      }
+
+      // end loop on iterations
+      // ? need a maximum here (or max of function calls is enough ? )
+      // continnue iteration (re-calculate function Minimum if edm IS NOT sufficient)
+      // no need to check that hesse calculation is done (if isnot done edm is OK anyway)
+      // count the pass to exit second time when function Minimum is invalid
+      // increase by 20% maxfcn for doing some more tests
+      if (ipass == 0) maxfcn_eff = maxfcn;
+      ipass++;
+      edmprev = edm;
+
+   }  while (edm > edmval );
+
+
+
+   // Add latest state (Hessian calculation)
+   min.Add( result.back() );
+
+   return min;
+
+}
+
+FunctionMinimum FumiliBuilder::Minimum(const MnFcn& fcn, const GradientCalculator& gc, const MinimumSeed& seed, std::vector<MinimumState>& result, unsigned int maxfcn, double edmval) const {
+
+   // function performing the minimum searches using the FUMILI algorithm
+   // after the modification when I iterate on this functions, so it can be called many times,
+   //  the seed is used here only to get precision and construct the returned FunctionMinimum object
+
+
+   /*
+    Three options were possible:
+
+    1) create two parallel and completely separate hierarchies, in which case
+    the FumiliMinimizer would NOT inherit from ModularFunctionMinimizer,
+    FumiliBuilder would not inherit from MinimumBuilder etc
+
+    2) Use the inheritance (base classes of ModularFunctionMinimizer,
+                            MinimumBuilder etc), but recreate the member functions Minimize() and
+    Minimum() respectively (naming them for example minimize2() and
+                            minimum2()) so that they can take FumiliFCNBase as Parameter instead FCNBase
+    (otherwise one wouldn't be able to call the Fumili-specific methods).
+
+    3) Cast in the daughter classes derived from ModularFunctionMinimizer,
+    MinimumBuilder.
+
+    The first two would mean to duplicate all the functionality already existent,
+    which is a very bad practice and Error-prone. The third one is the most
+    elegant and effective solution, where the only constraint is that the user
+    must know that they have to pass a subclass of FumiliFCNBase to the FumiliMinimizer
+    and not just a subclass of FCNBase.
+    BTW, the first two solutions would have meant to recreate also a parallel
+    structure for MnFcn...
+    **/
+   //  const FumiliFCNBase* tmpfcn =  dynamic_cast<const FumiliFCNBase*>(&(fcn.Fcn()));
+
+   const MnMachinePrecision& prec = seed.Precision();
+
+   const MinimumState & initialState = result.back();
+
+   double edm = initialState.Edm();
+
+
+#ifdef DEBUG
+   std::cout << "\n\nDEBUG FUMILI Builder  \nInitial State: "
+      << " Parameter " << initialState.Vec()
+      << " Gradient " << initialState.Gradient().Vec()
+      << " Inv Hessian " << initialState.Error().InvHessian()
+      << " edm = " << initialState.Edm()
+      << " maxfcn = " << maxfcn
+      << " tolerance = " << edmval
+      << std::endl;
+#endif
+
+
+   // iterate until edm is small enough or max # of iterations reached
+   edm *= (1. + 3.*initialState.Error().Dcovar());
+   MnAlgebraicVector step(initialState.Gradient().Vec().size());
+
+   // initial lambda Value
+   double lambda = 0.001;
+
+   int printLevel = MnPrint::Level();
+   do {
+
+      //     const MinimumState& s0 = result.back();
+      MinimumState s0 = result.back();
+
+      step = -1.*s0.Error().InvHessian()*s0.Gradient().Vec();
+
+
+#ifdef DEBUG
+      std::cout << "\n\n---> Iteration - " << result.size()
+      << "\nFval = " << s0.Fval() << " numOfCall = " << fcn.NumOfCalls()
+      << "\nInternal Parameter values " << s0.Vec()
+      << " Newton step " << step << std::endl;
+#endif
+
+      double gdel = inner_product(step, s0.Gradient().Grad());
+      if(gdel > 0.) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("FumiliBuilder: matrix not pos.def, gdel > 0");
+         MN_INFO_VAL(gdel);
+#endif
+         MnPosDef psdf;
+         s0 = psdf(s0, prec);
+         step = -1.*s0.Error().InvHessian()*s0.Gradient().Vec();
+         gdel = inner_product(step, s0.Gradient().Grad());
+#ifdef WARNINGMSG
+         MN_INFO_VAL2("After correction ",gdel);
+#endif
+         if(gdel > 0.) {
+            result.push_back(s0);
+            return FunctionMinimum(seed, result, fcn.Up());
+         }
+      }
+
+
+      //     MnParabolaPoint pp = lsearch(fcn, s0.Parameters(), step, gdel, prec);
+
+      //     if(fabs(pp.Y() - s0.Fval()) < prec.Eps()) {
+      //       std::cout<<"FumiliBuilder: no improvement"<<std::endl;
+      //       break; //no improvement
+      //     }
+
+
+      //     MinimumParameters p(s0.Vec() + pp.X()*step, pp.Y());
+
+      // if taking a full step
+
+      // take a full step
+
+      MinimumParameters p(s0.Vec() + step,  fcn( s0.Vec() + step ) );
+
+      // check that taking the full step does not deteriorate minimum
+      // in that case do a line search
+      if ( p.Fval() >= s0.Fval()  ) {
+         MnLineSearch lsearch;
+         MnParabolaPoint pp = lsearch(fcn, s0.Parameters(), step, gdel, prec);
+
+         if(fabs(pp.Y() - s0.Fval()) < prec.Eps()) {
+            //std::cout<<"FumiliBuilder: no improvement"<<std::endl;
+            break; //no improvement
+         }
+         p =  MinimumParameters(s0.Vec() + pp.X()*step, pp.Y() );
+      }
+
+#ifdef DEBUG
+      std::cout << "Before Gradient " << fcn.NumOfCalls() << std::endl;
+#endif
+
+      FunctionGradient g = gc(p, s0.Gradient());
+
+#ifdef DEBUG
+      std::cout << "After Gradient " << fcn.NumOfCalls() << std::endl;
+#endif
+
+      //FunctionGradient g = gc(s0.Parameters(), s0.Gradient());
+
+
+      // move Error updator after Gradient since the Value is cached inside
+
+      MinimumError e = ErrorUpdator().Update(s0, p, gc, lambda);
+
+
+      edm = Estimator().Estimate(g, s0.Error());
+
+
+#ifdef DEBUG
+      std::cout << "Updated new point: \n "
+         << " FVAL      " << p.Fval()
+         << " Parameter " << p.Vec()
+         << " Gradient " << g.Vec()
+         << " InvHessian " << e.Matrix()
+         << " Hessian " << e.Hessian()
+         << " edm = " << edm << std::endl << std::endl;
+#endif
+
+      if(edm < 0.) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("FumiliBuilder: matrix not pos.def., edm < 0");
+#endif
+         MnPosDef psdf;
+         s0 = psdf(s0, prec);
+         edm = Estimator().Estimate(g, s0.Error());
+         if(edm < 0.) {
+            result.push_back(s0);
+            if (TraceIter() ) TraceIteration(result.size()-1, result.back() );
+            return FunctionMinimum(seed, result, fcn.Up());
+         }
+      }
+
+      // check lambda according to step
+      if ( p.Fval() < s0.Fval()  )
+         // fcn is decreasing along the step
+         lambda *= 0.1;
+      else {
+         lambda *= 10;
+         // if close to minimum stop to avoid oscillations around minimum value
+         if ( edm < 0.1 ) break;
+      }
+
+#ifdef DEBUG
+      std::cout <<  " finish iteration- " << result.size() << " lambda =  "  << lambda << " f1 = " << p.Fval() << " f0 = " << s0.Fval() << " num of calls = " << fcn.NumOfCalls() << " edm " << edm << std::endl;
+#endif
+
+      result.push_back(MinimumState(p, e, g, edm, fcn.NumOfCalls()));
+      if (TraceIter() ) TraceIteration(result.size()-1, result.back() );
+
+      if (printLevel > 1) {
+         MnPrint::PrintState(std::cout, result.back(), "Fumili: Iteration # ",result.size());
+      }
+
+
+      edm *= (1. + 3.*e.Dcovar());
+
+
+   } while(edm > edmval && fcn.NumOfCalls() < maxfcn);
+
+
+
+   if(fcn.NumOfCalls() >= maxfcn) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("FumiliBuilder: call limit exceeded.");
+#endif
+      return FunctionMinimum(seed, result, fcn.Up(), FunctionMinimum::MnReachedCallLimit());
+   }
+
+   if(edm > edmval) {
+      if(edm < fabs(prec.Eps2()*result.back().Fval())) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("FumiliBuilder: machine accuracy limits further improvement.");
+#endif
+         return FunctionMinimum(seed, result, fcn.Up());
+      } else if(edm < 10.*edmval) {
+         return FunctionMinimum(seed, result, fcn.Up());
+      } else {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("FumiliBuilder: finishes without convergence.");
+         MN_INFO_VAL2("FumiliBuilder: ",edm);
+         MN_INFO_VAL2("    requested: ",edmval);
+#endif
+         return FunctionMinimum(seed, result, fcn.Up(), FunctionMinimum::MnAboveMaxEdm());
+      }
+   }
+   //   std::cout<<"result.back().Error().Dcovar()= "<<result.back().Error().Dcovar()<<std::endl;
+
+#ifdef DEBUG
+   std::cout << "Exiting successfully FumiliBuilder \n"
+      << "NFCalls = " << fcn.NumOfCalls()
+      << "\nFval = " <<  result.back().Fval()
+      << "\nedm = " << edm << " requested = " << edmval << std::endl;
+#endif
+
+   return FunctionMinimum(seed, result, fcn.Up());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliErrorUpdator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliErrorUpdator.cxx
new file mode 100644
index 0000000..fd8ce12
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliErrorUpdator.cxx
@@ -0,0 +1,114 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/FumiliErrorUpdator.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/FumiliGradientCalculator.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MnMatrix.h"
+#include "Minuit2/MinimumError.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/LaSum.h"
+#include <limits>
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+namespace Minuit2 {
+
+
+
+double sum_of_elements(const LASymMatrix&);
+
+
+MinimumError FumiliErrorUpdator::Update(const MinimumState& s0,
+                                        const MinimumParameters& p1,
+                                        const FunctionGradient& g1) const {
+   // dummy methods to suppress unused variable warnings
+   // this member function should never be called within
+   // the Fumili method...
+   s0.Fval();
+   p1.Fval();
+   g1.IsValid();
+   return MinimumError(2);
+}
+
+
+MinimumError FumiliErrorUpdator::Update(const MinimumState& s0,
+                                        const MinimumParameters& p1,
+                                        const GradientCalculator&  gc ,
+                                        double lambda) const {
+   // calculate the error matrix using approximation of Fumili
+   // use only first derivatives (see tutorial par. 5.1,5.2)
+   // The Fumili Hessian is provided by the FumiliGRadientCalculator class
+   // we apply also the Marquard lambda factor to increase weight of diagonal term
+   // as suggester in Numerical Receipt for Marquard method
+
+   // need to downcast to FumiliGradientCalculator
+   FumiliGradientCalculator * fgc = dynamic_cast< FumiliGradientCalculator *>( const_cast<GradientCalculator *>(&gc) );
+   assert(fgc != 0);
+
+
+   // get Hessian from Gradient calculator
+
+   MnAlgebraicSymMatrix h = fgc->Hessian();
+
+   int nvar = p1.Vec().size();
+
+   // apply Marquard lambda factor
+   double eps = 8*std::numeric_limits<double>::min();
+   for (int j = 0; j < nvar; j++) {
+      h(j,j) *= (1. + lambda);
+      // if h(j,j) is zero what to do ?
+      if ( fabs( h(j,j) ) < eps ) { // should use DBL_MIN
+                                       // put a cut off to avoid zero on diagonals
+         if ( lambda > 1)
+            h(j,j) = lambda*eps;
+         else
+            h(j,j) = eps;
+      }
+   }
+
+
+
+   int ifail = Invert(h);
+   if(ifail != 0) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("FumiliErrorUpdator inversion fails; return diagonal matrix.");
+#endif
+      for(unsigned int i = 0; i < h.Nrow(); i++) {
+         h(i,i) = 1./h(i,i);
+      }
+   }
+
+
+   const MnAlgebraicSymMatrix& v0 = s0.Error().InvHessian();
+
+   // calculate by how much did the covariance matrix changed
+   // (if it changed a lot since the last step, probably we
+   // are not yet near the Minimum)
+   double dcov = 0.5*(s0.Error().Dcovar() + sum_of_elements(h-v0)/sum_of_elements(h));
+
+
+
+   return MinimumError(h, dcov);
+
+}
+
+
+}  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliGradientCalculator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliGradientCalculator.cxx
new file mode 100644
index 0000000..f6e0a68
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliGradientCalculator.cxx
@@ -0,0 +1,130 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/FumiliGradientCalculator.h"
+#include "Minuit2/FumiliFCNBase.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/FumiliChi2FCN.h"
+#include "Minuit2/FumiliMaximumLikelihoodFCN.h"
+
+//to compare with N2P calculator
+//#define DEBUG 1
+#ifdef DEBUG
+#include "Minuit2/MnPrint.h"
+#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnUserFcn.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+FunctionGradient FumiliGradientCalculator::operator()(const MinimumParameters& par) const {
+
+   // Calculate gradient for Fumili using the gradient and Hessian provided by the FCN Fumili function
+   // applying the external to int trasformation.
+
+   int nvar = par.Vec().size();
+   std::vector<double> extParam = fTransformation(  par.Vec() );
+   //   std::vector<double> deriv;
+   //   deriv.reserve( nvar );
+   //   for (int i = 0; i < nvar; ++i) {
+   //     unsigned int ext = fTransformation.ExtOfInt(i);
+   //     if ( fTransformation.Parameter(ext).HasLimits())
+   //       deriv.push_back( fTransformation.DInt2Ext( i, par.Vec()(i) ) );
+   //     else
+   //       deriv.push_back(1.0);
+   //   }
+
+   // eval Gradient
+   FumiliFCNBase & fcn = const_cast<FumiliFCNBase &>(fFcn);
+
+   fcn.EvaluateAll(extParam);
+
+
+   MnAlgebraicVector v(nvar);
+   MnAlgebraicSymMatrix h(nvar);
+
+
+   const std::vector<double> & fcn_gradient = fFcn.Gradient();
+   assert( fcn_gradient.size() == extParam.size() );
+
+
+   //   for (int i = 0; i < nvar; ++i) {
+   //     unsigned int iext = fTransformation.ExtOfInt(i);
+   //     double ideriv = 1.0;
+   //     if ( fTransformation.Parameter(iext).HasLimits())
+   //       ideriv =  fTransformation.DInt2Ext( i, par.Vec()(i) ) ;
+
+
+   //     //     v(i) = fcn_gradient[iext]*deriv;
+   //     v(i) = ideriv*fcn_gradient[iext];
+
+   //     for (int j = i; j < nvar; ++j) {
+   //       unsigned int jext = fTransformation.ExtOfInt(j);
+   //       double jderiv = 1.0;
+   //       if ( fTransformation.Parameter(jext).HasLimits())
+   // jderiv =  fTransformation.DInt2Ext( j, par.Vec()(j) ) ;
+
+   // //       h(i,j) = deriv[i]*deriv[j]*fFcn.Hessian(iext,jext);
+   //       h(i,j) = ideriv*jderiv*fFcn.Hessian(iext,jext);
+   //     }
+   //   }
+
+
+   // cache deriv and Index values .
+   // in large Parameter limit then need to re-optimize and see if better not caching
+
+   std::vector<double> deriv(nvar);
+   std::vector<unsigned int> extIndex(nvar);
+   for (int i = 0; i < nvar; ++i) {
+      extIndex[i] = fTransformation.ExtOfInt(i);
+      deriv[i] = 1;
+      if ( fTransformation.Parameter(extIndex[i]).HasLimits())
+         deriv[i] =  fTransformation.DInt2Ext( i, par.Vec()(i) ) ;
+
+      v(i) = fcn_gradient[extIndex[i]]*deriv[i];
+
+      for (int j = 0; j <= i; ++j) {
+         h(i,j) = deriv[i]*deriv[j]*fFcn.Hessian(extIndex[i],extIndex[j]);
+      }
+   }
+
+#ifdef DEBUG
+   // compare with other Gradient
+   //   // calculate Gradient using Minuit method
+
+   Numerical2PGradientCalculator gc(MnUserFcn(fFcn,fTransformation), fTransformation, MnStrategy(1));
+   FunctionGradient g2 = gc(par);
+
+   std::cout << "Fumili Gradient " << v << std::endl;
+   std::cout << "Minuit Gradient " << g2.Vec() << std::endl;
+#endif
+
+   // store calculated Hessian
+   fHessian = h;
+   return FunctionGradient(v);
+}
+
+FunctionGradient FumiliGradientCalculator::operator()(const MinimumParameters& par,
+                                                      const FunctionGradient&) const
+
+{
+   // Needed for interface of base class.
+   return this->operator()(par);
+
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliMinimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliMinimizer.cxx
new file mode 100644
index 0000000..c25c974
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliMinimizer.cxx
@@ -0,0 +1,104 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnConfig.h"
+#include "Minuit2/FumiliMinimizer.h"
+#include "Minuit2/MinimumSeedGenerator.h"
+#include "Minuit2/FumiliGradientCalculator.h"
+#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/AnalyticalGradientCalculator.h"
+#include "Minuit2/MinimumBuilder.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnUserParameters.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/MnUserFcn.h"
+#include "Minuit2/FumiliFCNBase.h"
+#include "Minuit2/FumiliFCNBase.h"
+#include "Minuit2/FumiliGradientCalculator.h"
+#include "Minuit2/FCNGradientBase.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnPrint.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+// for Fumili implement Minimize here because need downcast
+
+
+FunctionMinimum FumiliMinimizer::Minimize(const FCNBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // Minimize using Fumili. Create seed and Fumili gradient calculator.
+   // The FCNBase passed must be a FumiliFCNBase type otherwise method will fail !
+
+   MnUserFcn mfcn(fcn, st.Trafo());
+   Numerical2PGradientCalculator gc(mfcn, st.Trafo(), strategy);
+
+   unsigned int npar = st.VariableParameters();
+   if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
+   //FUMILI needs much less function calls
+   maxfcn = int(0.1*maxfcn);
+
+   MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
+
+   // downcast fcn
+
+   //std::cout << "FCN type " << typeid(&fcn).Name() << std::endl;
+
+   FumiliFCNBase * fumiliFcn = dynamic_cast< FumiliFCNBase *>( const_cast<FCNBase *>(&fcn) );
+   if ( !fumiliFcn ) {
+      MN_ERROR_MSG("FumiliMinimizer: Error : wrong FCN type. Try to use default minimizer");
+      return  FunctionMinimum(mnseeds, fcn.Up() );
+   }
+
+
+   FumiliGradientCalculator fgc(*fumiliFcn, st.Trafo(), npar);
+#ifdef DEBUG
+   std::cout << "Minuit::Minimize using FumiliMinimizer" << std::endl;
+#endif
+   return ModularFunctionMinimizer::Minimize(mfcn, fgc, mnseeds, strategy, maxfcn, toler);
+}
+
+
+
+FunctionMinimum FumiliMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // Minimize using Fumili. Case of interface is a FCNGradientBase.
+   // Normally other method is used  - probably this could be removed (t.b.i.)
+
+   // need MnUserFcn
+   MnUserFcn mfcn(fcn, st.Trafo() );
+   AnalyticalGradientCalculator gc(fcn, st.Trafo());
+
+   unsigned int npar = st.VariableParameters();
+   if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
+
+   MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
+
+   // downcast fcn
+
+   FumiliFCNBase * fumiliFcn = dynamic_cast< FumiliFCNBase *>( const_cast<FCNGradientBase *>(&fcn) );
+   if ( !fumiliFcn ) {
+      MN_ERROR_MSG("FumiliMinimizer: Error : wrong FCN type. Try to use default minimizer");
+      return  FunctionMinimum(mnseeds, fcn.Up() );
+   }
+
+
+   FumiliGradientCalculator fgc(*fumiliFcn, st.Trafo(), npar);
+#ifdef DEBUG
+   std::cout << "Minuit::Minimize using FumiliMinimizer" << std::endl;
+#endif
+   return ModularFunctionMinimizer::Minimize(mfcn, fgc, mnseeds, strategy, maxfcn, toler);
+
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliStandardChi2FCN.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliStandardChi2FCN.cxx
new file mode 100644
index 0000000..5c8cb3f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliStandardChi2FCN.cxx
@@ -0,0 +1,125 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+
+#include "Minuit2/FumiliStandardChi2FCN.h"
+
+#include <vector>
+#include <cmath>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//#include <iostream>
+
+std::vector<double> FumiliStandardChi2FCN::Elements(const std::vector<double>& par) const {
+   // Calculate the f(i) contribution to the Chi2. Chi2 = Sum[f(i)**2]
+
+   std::vector<double> result;
+   double tmp1 = 0.0;
+   unsigned int fPositionsSize = fPositions.size();
+
+
+   for(unsigned int i=0; i < fPositionsSize; i++) {
+
+      const std::vector<double> & currentPosition = fPositions[i];
+
+      // The commented line is the object-oriented way to do it
+      // but it is faster to do a single function call...
+      //(*(this->getModelFunction())).SetParameters(par);
+      tmp1 = (*(this->ModelFunction()))(par, currentPosition)- fMeasurements[i];
+
+      result.push_back(tmp1*fInvErrors[i] );
+
+      //std::cout << "element " << i << "  " << (*(this->getModelFunction()))(par, currentPosition) << "  " <<  fMeasurements[i] << "  " << result[i] << std::endl;
+   }
+
+
+
+   return result;
+
+}
+
+
+
+const std::vector<double> & FumiliStandardChi2FCN::GetMeasurement(int index) const {
+   // Return the coordinate (position) values.
+   return fPositions[index];
+
+}
+
+
+int FumiliStandardChi2FCN::GetNumberOfMeasurements() const {
+   // Return size
+   return fPositions.size();
+
+}
+
+
+
+void  FumiliStandardChi2FCN::EvaluateAll( const std::vector<double> & par) {
+   // Evaluate chi2 value, gradient and hessian all in a single
+   // loop on the measurements
+
+   int nmeas = GetNumberOfMeasurements();
+   std::vector<double> & grad = Gradient();
+   std::vector<double> & h = Hessian();
+   int npar = par.size();
+   double chi2 = 0;
+   grad.resize(npar);
+   h.resize( static_cast<unsigned int>(0.5 * npar* (npar + 1) ) );
+   // reset Elements
+   grad.assign(npar, 0.0);
+   h.assign(static_cast<unsigned int>(0.5 * npar* (npar + 1) ) , 0.0);
+
+
+   const ParametricFunction & modelFunc = *ModelFunction();
+
+   for (int i = 0; i < nmeas; ++i) {
+
+      // work for multi-dimensional points
+      const std::vector<double> & currentPosition = fPositions[i];
+      modelFunc.SetParameters( currentPosition );
+      double invError = fInvErrors[i];
+      double fval = modelFunc(par);
+
+      double element = ( fval - fMeasurements[i] )*invError;
+      chi2 += element*element;
+
+      // calc derivatives
+
+      // this method should return a reference
+      std::vector<double> mfg = modelFunc.GetGradient(par);
+
+      // grad is derivative of chi2 w.r.t to parameters
+      for (int j = 0; j < npar ; ++j) {
+         double dfj = invError * mfg[j];
+         grad[j] += 2.0 * element * dfj;
+
+         // in second derivative use Fumili approximation neglecting the term containing the
+         // second derivatives of the model function
+         for (int k = j; k < npar; ++ k) {
+            int idx =  j + k*(k+1)/2;
+            h[idx] += 2.0 * dfj * invError * mfg[k];
+         }
+
+      } // end param loop
+
+   } // end points loop
+
+   // set Value in base class
+   SetFCNValue( chi2);
+
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliStandardMaximumLikelihoodFCN.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliStandardMaximumLikelihoodFCN.cxx
new file mode 100644
index 0000000..6e7c75d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/FumiliStandardMaximumLikelihoodFCN.cxx
@@ -0,0 +1,175 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+
+#include "Minuit2/FumiliStandardMaximumLikelihoodFCN.h"
+
+#include <vector>
+#include <cmath>
+#include <float.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//#include <iostream>
+
+std::vector<double> FumiliStandardMaximumLikelihoodFCN::Elements(const std::vector<double>& par) const {
+
+   //   calculate likelihood element f(i) = pdf(x(i))
+   std::vector<double> result;
+   double tmp1 = 0.0;
+   unsigned int fPositionsSize = fPositions.size();
+
+
+   for(unsigned int i=0; i < fPositionsSize; i++) {
+
+      const std::vector<double> & currentPosition = fPositions[i];
+
+      // The commented line is the object-oriented way to do it
+      // but it is faster to do a single function call...
+      //(*(this->getModelFunction())).SetParameters(par);
+      tmp1 = (*(this->ModelFunction()))(par, currentPosition);
+
+      // std::cout << " i = " << i << "  " << currentPosition[0] << "  " << tmp1 << std::endl;
+
+      result.push_back(tmp1);
+
+   }
+
+
+   return result;
+
+}
+
+
+
+const std::vector<double> & FumiliStandardMaximumLikelihoodFCN::GetMeasurement(int index) const {
+   // Return x(i).
+   return fPositions[index];
+
+}
+
+
+int FumiliStandardMaximumLikelihoodFCN::GetNumberOfMeasurements() const {
+   // return size of positions (coordinates).
+   return fPositions.size();
+
+}
+
+
+void  FumiliStandardMaximumLikelihoodFCN::EvaluateAll( const std::vector<double> & par) {
+   // Evaluate in one loop likelihood value, gradient and hessian
+
+   static double minDouble = 8.0*DBL_MIN;
+   static double minDouble2 = std::sqrt(8.0*DBL_MIN);
+   static double maxDouble2 = 1.0/minDouble2;
+   // loop on the measurements
+
+   int nmeas = GetNumberOfMeasurements();
+   std::vector<double> & grad = Gradient();
+   std::vector<double> & h = Hessian();
+   int npar = par.size();
+   double logLikelihood = 0;
+   grad.resize(npar);
+   h.resize( static_cast<unsigned int>(0.5 * npar* (npar + 1) ) );
+   grad.assign(npar, 0.0);
+   h.assign(static_cast<unsigned int>(0.5 * npar* (npar + 1) ) , 0.0);
+
+   const ParametricFunction & modelFunc = *ModelFunction();
+
+   for (int i = 0; i < nmeas; ++i) {
+
+      // work for one-dimensional points
+      const std::vector<double> & currentPosition = fPositions[i];
+      modelFunc.SetParameters( currentPosition );
+      double fval = modelFunc(par);
+      if (fval < minDouble ) fval = minDouble;   // to avoid getting infinity and nan's
+      logLikelihood -= std::log( fval);
+      double invFval = 1.0/fval;
+      // this method should return a reference
+      std::vector<double> mfg = modelFunc.GetGradient(par);
+
+      // calc derivatives
+
+      for (int j = 0; j < npar; ++j) {
+         if ( std::fabs(mfg[j]) < minDouble ) {
+            //  std::cout << "SMALL values: grad =  " << mfg[j] << "  "  << minDouble << " f(x) = " << fval
+            //    << " params " << j << " p0 = " << par[0] << " p1 = " << par[1] <<  std::endl;
+            if (mfg[j] < 0)
+               mfg[j] =  -minDouble;
+            else
+               mfg[j] =  minDouble;
+         }
+
+         double dfj = invFval * mfg[j];
+         // to avoid summing infinite and nan later when calculating the Hessian
+         if ( std::fabs(dfj) > maxDouble2 ) {
+            if (dfj > 0)
+               dfj = maxDouble2;
+            else
+               dfj = -maxDouble2;
+         }
+
+         grad[j] -= dfj;
+         //       if ( ! ( dfj > 0) && ! ( dfj <= 0 ) )
+         // std::cout << " nan : dfj = " << dfj << " fval =  " << fval << " invF = " << invFval << " grad = " << mfg[j] << " par[j] = " << par[j] << std::endl;
+
+         //std::cout << " x = "  << currentPosition[0] <<  " par[j] = " << par[j] << " : dfj = " << dfj << " fval =  " << fval << " invF = " << invFval << " grad = " << mfg[j] << " deriv = " << grad[j] << std::endl;
+
+
+         // in second derivative use Fumili approximation neglecting the term containing the
+         // second derivatives of the model function
+         for (int k = j; k < npar; ++ k) {
+            int idx =  j + k*(k+1)/2;
+            if (std::fabs( mfg[k]) < minDouble ) {
+               if (mfg[k] < 0)
+                  mfg[k] =  -minDouble;
+               else
+                  mfg[k] =  minDouble;
+            }
+
+            double dfk =  invFval * mfg[k];
+            // avoid that dfk*dfj are one small and one huge so I get a nan
+            // to avoid summing infinite and nan later when calculating the Hessian
+            if ( std::fabs(dfk) > maxDouble2 ) {
+               if (dfk > 0)
+                  dfk = maxDouble2;
+               else
+                  dfk = -maxDouble2;
+            }
+
+
+            h[idx] += dfj * dfk;
+            // if ( ( ! ( h[idx] > 0) && ! ( h[idx] <= 0 ) ) )
+            //   std::cout << " nan : dfj = " << dfj << " fval =  " << fval << " invF = " << invFval << " gradj = " << mfg[j]
+            //     << " dfk = " << dfk << " gradk =  "<< mfg[k]  << " hess_jk = " << h[idx] << " par[k] = " << par[k] << std::endl;
+         }
+
+      } // end param loop
+
+   } // end points loop
+
+   //   std::cout <<"\nEVALUATED GRADIENT and HESSIAN " << std::endl;
+   //   for (int j = 0; j < npar; ++j) {
+   //     std::cout << " j = " << j << " grad = " << grad[j] << std::endl;
+   //     for (int k = j; k < npar; ++k) {
+   //       std::cout << " k = " << k << " hess = " << Hessian(j,k) << "  " << h[ j + k*(k+1)/2]  << std::endl;
+   //     }
+   //   }
+
+   // set Value in base class
+   SetFCNValue( logLikelihood);
+
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/HessianGradientCalculator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/HessianGradientCalculator.cxx
new file mode 100644
index 0000000..e6df78c
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/HessianGradientCalculator.cxx
@@ -0,0 +1,149 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/HessianGradientCalculator.h"
+#include "Minuit2/InitialGradientCalculator.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MnStrategy.h"
+
+#include <math.h>
+
+//#define DEBUG
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+#include "Minuit2/MPIProcess.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+FunctionGradient HessianGradientCalculator::operator()(const MinimumParameters& par) const {
+   // use initial gradient as starting point
+   InitialGradientCalculator gc(fFcn, fTransformation, fStrategy);
+   FunctionGradient gra = gc(par);
+
+   return (*this)(par, gra);
+}
+
+FunctionGradient HessianGradientCalculator::operator()(const MinimumParameters& par, const FunctionGradient& Gradient) const {
+   // interface of the base class. Use DeltaGradient for op.
+   std::pair<FunctionGradient, MnAlgebraicVector> mypair = DeltaGradient(par, Gradient);
+
+   return mypair.first;
+}
+
+const MnMachinePrecision& HessianGradientCalculator::Precision() const {
+   // return the precision
+   return fTransformation.Precision();
+}
+
+unsigned int HessianGradientCalculator::Ncycle() const {
+   // return number of calculation cycles (defined in strategy)
+   return Strategy().HessianGradientNCycles();
+}
+
+double HessianGradientCalculator::StepTolerance() const {
+   // return tolerance on step size (defined in strategy)
+   return Strategy().GradientStepTolerance();
+}
+
+double HessianGradientCalculator::GradTolerance() const {
+   // return gradient tolerance (defines in strategy)
+   return Strategy().GradientTolerance();
+}
+
+std::pair<FunctionGradient, MnAlgebraicVector> HessianGradientCalculator::DeltaGradient(const MinimumParameters& par, const FunctionGradient& Gradient) const {
+   // calculate gradient for Hessian
+   assert(par.IsValid());
+
+   MnAlgebraicVector x = par.Vec();
+   MnAlgebraicVector grd = Gradient.Grad();
+   const MnAlgebraicVector& g2 = Gradient.G2();
+   //const MnAlgebraicVector& gstep = Gradient.Gstep();
+   // update also gradient step sizes
+   MnAlgebraicVector gstep = Gradient.Gstep();
+
+   double fcnmin = par.Fval();
+   //   std::cout<<"fval: "<<fcnmin<<std::endl;
+
+   double dfmin = 4.*Precision().Eps2()*(fabs(fcnmin)+Fcn().Up());
+
+   unsigned int n = x.size();
+   MnAlgebraicVector dgrd(n);
+
+   MPIProcess mpiproc(n,0);
+   // initial starting values
+   unsigned int startElementIndex = mpiproc.StartElementIndex();
+   unsigned int endElementIndex = mpiproc.EndElementIndex();
+
+   for(unsigned int i = startElementIndex; i < endElementIndex; i++) {
+      double xtf = x(i);
+      double dmin = 4.*Precision().Eps2()*(xtf + Precision().Eps2());
+      double epspri = Precision().Eps2() + fabs(grd(i)*Precision().Eps2());
+      double optstp = sqrt(dfmin/(fabs(g2(i))+epspri));
+      double d = 0.2*fabs(gstep(i));
+      if(d > optstp) d = optstp;
+      if(d < dmin) d = dmin;
+      double chgold = 10000.;
+      double dgmin = 0.;
+      double grdold = 0.;
+      double grdnew = 0.;
+      for(unsigned int j = 0; j < Ncycle(); j++)  {
+         x(i) = xtf + d;
+         double fs1 = Fcn()(x);
+         x(i) = xtf - d;
+         double fs2 = Fcn()(x);
+         x(i) = xtf;
+         //       double sag = 0.5*(fs1+fs2-2.*fcnmin);
+         //LM: should I calculate also here second derivatives ???
+
+         grdold = grd(i);
+         grdnew = (fs1-fs2)/(2.*d);
+         dgmin = Precision().Eps()*(fabs(fs1) + fabs(fs2))/d;
+         //if(fabs(grdnew) < Precision().Eps()) break;
+         if (grdnew == 0) break;
+         double change = fabs((grdold-grdnew)/grdnew);
+         if(change > chgold && j > 1) break;
+         chgold = change;
+         grd(i) = grdnew;
+         //LM : update also the step sizes
+         gstep(i) = d;
+
+         if(change < 0.05) break;
+         if(fabs(grdold-grdnew) < dgmin) break;
+         if(d < dmin) break;
+         d *= 0.2;
+      }
+
+      dgrd(i) = std::max(dgmin, fabs(grdold-grdnew));
+
+#ifdef DEBUG
+      std::cout << "HGC Param : " << i << "\t new g1 = " << grd(i) << " gstep = " << d << " dgrd = " << dgrd(i) << std::endl;
+#endif
+
+   }
+
+   mpiproc.SyncVector(grd);
+   mpiproc.SyncVector(gstep);
+   mpiproc.SyncVector(dgrd);
+
+   return std::pair<FunctionGradient, MnAlgebraicVector>(FunctionGradient(grd, g2, gstep), dgrd);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/InitialGradientCalculator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/InitialGradientCalculator.cxx
new file mode 100644
index 0000000..0d9f262
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/InitialGradientCalculator.cxx
@@ -0,0 +1,120 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/InitialGradientCalculator.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MnStrategy.h"
+
+#include <math.h>
+
+//#define DEBUG
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+FunctionGradient InitialGradientCalculator::operator()(const MinimumParameters& par) const {
+   // initial rough  estimate of the gradient using the parameter step size
+
+   assert(par.IsValid());
+
+   unsigned int n = Trafo().VariableParameters();
+   assert(n == par.Vec().size());
+
+#ifdef DEBUG
+   std::cout << "Initial gradient calculator - params " << par.Vec() << std::endl;
+#endif
+
+   MnAlgebraicVector gr(n), gr2(n), gst(n);
+
+   for(unsigned int i = 0; i < n; i++) {
+      unsigned int exOfIn = Trafo().ExtOfInt(i);
+
+      double var = par.Vec()(i);
+      double werr = Trafo().Parameter(exOfIn).Error();
+      double sav = Trafo().Int2ext(i, var);
+      double sav2 = sav + werr;
+      if(Trafo().Parameter(exOfIn).HasLimits()) {
+         if(Trafo().Parameter(exOfIn).HasUpperLimit() &&
+            sav2 > Trafo().Parameter(exOfIn).UpperLimit())
+            sav2 = Trafo().Parameter(exOfIn).UpperLimit();
+      }
+      double var2 = Trafo().Ext2int(exOfIn, sav2);
+      double vplu = var2 - var;
+      sav2 = sav - werr;
+      if(Trafo().Parameter(exOfIn).HasLimits()) {
+         if(Trafo().Parameter(exOfIn).HasLowerLimit() &&
+            sav2 < Trafo().Parameter(exOfIn).LowerLimit())
+            sav2 = Trafo().Parameter(exOfIn).LowerLimit();
+      }
+      var2 = Trafo().Ext2int(exOfIn, sav2);
+      double vmin = var2 - var;
+      double gsmin = 8.*Precision().Eps2()*(fabs(var) + Precision().Eps2());
+      // protect against very small step sizes which can cause dirin to zero and then nan values in grd
+      double dirin = std::max(0.5*(fabs(vplu) + fabs(vmin)),  gsmin );
+      double g2 = 2.0*fFcn.ErrorDef()/(dirin*dirin);
+      double gstep = std::max(gsmin, 0.1*dirin);
+      double grd = g2*dirin;
+      if(Trafo().Parameter(exOfIn).HasLimits()) {
+         if(gstep > 0.5) gstep = 0.5;
+      }
+      gr(i) = grd;
+      gr2(i) = g2;
+      gst(i) = gstep;
+
+#ifdef DEBUG
+      std::cout << "computing initial gradient for parameter " << Trafo().Name(exOfIn) << " value = " << var
+                << " [ " << vmin << " , " << vplu << " ] " << "dirin " <<  dirin << " grd " << grd << " g2 " << g2 << std::endl;
+#endif
+
+   }
+
+   return FunctionGradient(gr, gr2, gst);
+}
+
+FunctionGradient InitialGradientCalculator::operator()(const MinimumParameters& par, const FunctionGradient&) const {
+   // Base class interface
+   return (*this)(par);
+}
+
+const MnMachinePrecision& InitialGradientCalculator::Precision() const {
+   // return precision (is set in trasformation class)
+   return fTransformation.Precision();
+}
+
+unsigned int InitialGradientCalculator::Ncycle() const {
+   // return ncyles (from Strategy)
+   return Strategy().GradientNCycles();
+}
+
+double InitialGradientCalculator::StepTolerance() const {
+   // return Gradient step tolerance (from Strategy)
+   return Strategy().GradientStepTolerance();
+}
+
+double InitialGradientCalculator::GradTolerance() const {
+   // return Gradient tolerance
+   return Strategy().GradientTolerance();
+}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaEigenValues.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaEigenValues.cxx
new file mode 100644
index 0000000..2fd71c8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaEigenValues.cxx
@@ -0,0 +1,45 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+int mneigen(double*, unsigned int, unsigned int, unsigned int, double*,double);
+
+LAVector eigenvalues(const LASymMatrix& mat) {
+   // calculate eigenvalues of symmetric matrices using mneigen function (transalte from fortran Minuit)
+   unsigned int nrow = mat.Nrow();
+
+   LAVector tmp(nrow*nrow);
+   LAVector work(2*nrow);
+
+   for(unsigned int i = 0; i < nrow; i++)
+      for(unsigned int j = 0; j <= i; j++) {
+         tmp(i + j*nrow) = mat(i,j);
+         tmp(i*nrow + j) = mat(i,j);
+      }
+
+   int info = mneigen(tmp.Data(), nrow, nrow, work.size(), work.Data(), 1.e-6);
+   (void)info;
+   assert(info == 0);
+
+   LAVector result(nrow);
+   for(unsigned int i = 0; i < nrow; i++) result(i) = work(i);
+
+   return result;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaInnerProduct.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaInnerProduct.cxx
new file mode 100644
index 0000000..fea6fa8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaInnerProduct.cxx
@@ -0,0 +1,26 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/LAVector.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double mnddot(unsigned int, const double*, int, const double*, int);
+
+double inner_product(const LAVector& v1, const LAVector& v2) {
+   // calculate inner (dot) product of two vectors  using mnddot function
+   return mnddot(v1.size(), v1.Data(), 1, v2.Data(), 1);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaInverse.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaInverse.cxx
new file mode 100644
index 0000000..1912d0b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaInverse.cxx
@@ -0,0 +1,42 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/LaInverse.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+int mnvert(LASymMatrix& t);
+
+// symmetric matrix (positive definite only)
+
+int Invert(LASymMatrix& t) {
+   // function for inversion of symmetric matrices using  mnvert function
+   // (from Fortran Minuit)
+
+   int ifail = 0;
+
+   if(t.size() == 1) {
+      double tmp = t.Data()[0];
+      if(!(tmp > 0.)) ifail = 1;
+      else t.Data()[0] = 1./tmp;
+   } else {
+      ifail = mnvert(t);
+   }
+
+   return ifail;
+}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaOuterProduct.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaOuterProduct.cxx
new file mode 100644
index 0000000..5e86426
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaOuterProduct.cxx
@@ -0,0 +1,57 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/LaOuterProduct.h"
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+int mndspr(const char*, unsigned int, double, const double*, int, double*);
+
+LASymMatrix::LASymMatrix(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double>& out) : fSize(0), fNRow(0), fData(0) {
+   // constructor from expression based on outer product of symmetric matrices
+   //   std::cout<<"LASymMatrix::LASymMatrix(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double>& out)"<<std::endl;
+   fNRow = out.Obj().Obj().Obj().size();
+   fSize = fNRow*(fNRow+1)/2;
+   fData = (double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*fSize);
+   memset(fData, 0, fSize*sizeof(double));
+   Outer_prod(*this, out.Obj().Obj().Obj(), out.f()*out.Obj().Obj().f()*out.Obj().Obj().f());
+}
+
+LASymMatrix& LASymMatrix::operator=(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double>& out) {
+   // assignment operator from expression based on outer product of symmetric matrices
+   //   std::cout<<"LASymMatrix& LASymMatrix::operator=(const ABObj<sym, VectorOuterProduct<ABObj<vec, LAVector, double>, double>, double>& out)"<<std::endl;
+   if(fSize == 0 && fData == 0) {
+      fNRow = out.Obj().Obj().Obj().size();
+      fSize = fNRow*(fNRow+1)/2;
+      fData = (double*)StackAllocatorHolder::Get().Allocate(sizeof(double)*fSize);
+      memset(fData, 0, fSize*sizeof(double));
+      Outer_prod(*this, out.Obj().Obj().Obj(), out.f()*out.Obj().Obj().f()*out.Obj().Obj().f());
+   } else {
+      LASymMatrix tmp(out.Obj().Obj().Obj().size());
+      Outer_prod(tmp, out.Obj().Obj().Obj());
+      tmp *= double(out.f()*out.Obj().Obj().f()*out.Obj().Obj().f());
+      assert(fSize == tmp.size());
+      memcpy(fData, tmp.Data(), fSize*sizeof(double));
+   }
+   return *this;
+}
+
+void Outer_prod(LASymMatrix& A, const LAVector& v, double f) {
+   // function performing outer product using mndspr (DSPR) routine from BLAS
+   mndspr("U", v.size(), f, v.Data(), 1, A.Data());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaSumOfElements.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaSumOfElements.cxx
new file mode 100644
index 0000000..bf4254b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaSumOfElements.cxx
@@ -0,0 +1,34 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LASymMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double mndasum(unsigned int, const double*, int);
+
+double sum_of_elements(const LAVector& v) {
+   // calculate the absolute sum of the vector elements using mndasum
+   // which is a translation from dasum from BLAS
+   return mndasum(v.size(), v.Data(), 1);
+}
+
+double sum_of_elements(const LASymMatrix& m) {
+   // calculate the absolute sum of all the matrix elements using mndasum
+   // which is a translation of dasum from BLAS
+   return mndasum(m.size(), m.Data(), 1);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaVtMVSimilarity.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaVtMVSimilarity.cxx
new file mode 100644
index 0000000..85425f6
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/LaVtMVSimilarity.cxx
@@ -0,0 +1,33 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/LASymMatrix.h"
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LaProd.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double mnddot(unsigned int, const double*, int, const double*, int);
+
+double similarity(const LAVector& avec, const LASymMatrix& mat) {
+   // calculate the similarity vector-matrix product: V^T M V
+   // use matrix product and then dot function (using mnddot)
+
+   LAVector tmp = mat*avec;
+
+   double value = mnddot(avec.size(), avec.Data(), 1, tmp.Data(), 1);
+   return value;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MPIProcess.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MPIProcess.cxx
new file mode 100644
index 0000000..4481d61
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MPIProcess.cxx
@@ -0,0 +1,334 @@
+// @(#)root/minuit2:$Id$
+// Author: A. Lazzaro 2009
+/***************************************************************************
+ * Package: Minuit2                                                        *
+ *    File: $Id$         *
+ *  Author: Alfio Lazzaro, alfio.lazzaro at mi.infn.it                        *
+ *                                                                         *
+ * Copyright: (C) 2008 by Universita' and INFN, Milan                      *
+ ***************************************************************************/
+
+#include "Minuit2/MPIProcess.h"
+
+#include <iostream>
+
+namespace BA_ROOT {
+
+namespace Minuit2 {
+
+   unsigned int MPIProcess::fgGlobalSize = 1;
+   unsigned int MPIProcess::fgGlobalRank = 0;
+
+   // By default all procs are for X
+   unsigned int MPIProcess::fgCartSizeX = 0;
+   unsigned int MPIProcess::fgCartSizeY = 0;
+   unsigned int MPIProcess::fgCartDimension = 0;
+   bool MPIProcess::fgNewCart = true;
+
+#ifdef MPIPROC
+   MPI::Intracomm* MPIProcess::fgCommunicator = 0;
+   int MPIProcess::fgIndexComm = -1; // -1 for no-initialization
+   MPI::Intracomm* MPIProcess::fgCommunicators[2] = {0};
+   unsigned int MPIProcess::fgIndecesComm[2] = {0};
+#endif
+
+   MPIProcess::MPIProcess(unsigned int nelements, unsigned int indexComm) :
+      fNelements(nelements), fSize(1), fRank(0)
+   {
+
+      // check local requested index for communicator, valid values are 0 and 1
+      indexComm = (indexComm==0) ? 0 : 1;
+
+#ifdef MPIPROC
+
+      StartMPI();
+
+      if (fgGlobalSize==fgCartDimension &&
+          fgCartSizeX!=fgCartDimension && fgCartSizeY!=fgCartDimension) {
+         //declare the cartesian topology
+
+         if (fgCommunicator==0 && fgIndexComm<0 && fgNewCart) {
+            // first call, declare the topology
+            std::cout << "Info --> MPIProcess::MPIProcess: Declare cartesian Topology ("
+                      << fgCartSizeX << "x" << fgCartSizeY << ")" << std::endl;
+
+            int color = fgGlobalRank / fgCartSizeY;
+            int key = fgGlobalRank % fgCartSizeY;
+
+            fgCommunicators[0] = new MPI::Intracomm(MPI::COMM_WORLD.Split(key,color)); // rows for Minuit
+            fgCommunicators[1] = new MPI::Intracomm(MPI::COMM_WORLD.Split(color,key)); // columns for NLL
+
+            fgNewCart = false;
+
+         }
+
+         fgIndexComm++;
+
+         if (fgIndexComm>1 || fgCommunicator==(&(MPI::COMM_WORLD))) { // Remember, no more than 2 dimensions in the topology!
+            std::cerr << "Error --> MPIProcess::MPIProcess: Requiring more than 2 dimensions in the topology!" << std::endl;
+            MPI::COMM_WORLD.Abort(-1);
+         }
+
+         // requiring columns as first call. In this case use all nodes
+         if (((unsigned int)fgIndexComm)<indexComm)
+            fgCommunicator = &(MPI::COMM_WORLD);
+         else {
+            fgIndecesComm[fgIndexComm] = indexComm;
+            fgCommunicator = fgCommunicators[fgIndecesComm[fgIndexComm]];
+         }
+
+      }
+      else {
+         // no cartesian topology
+         if (fgCartDimension!=0 && fgGlobalSize!=fgCartDimension) {
+            std::cout << "Warning --> MPIProcess::MPIProcess: Cartesian dimension doesn't correspond to # total procs!" << std::endl;
+            std::cout << "Warning --> MPIProcess::MPIProcess: Ignoring topology, use all procs for X." << std::endl;
+            std::cout << "Warning --> MPIProcess::MPIProcess: Resetting topology..." << std::endl;
+            fgCartSizeX = fgGlobalSize;
+            fgCartSizeY = 1;
+            fgCartDimension = fgGlobalSize;
+         }
+
+         if (fgIndexComm<0) {
+            if (fgCartSizeX==fgCartDimension) {
+               fgCommunicators[0] = &(MPI::COMM_WORLD);
+               fgCommunicators[1] = 0;
+            }
+            else {
+               fgCommunicators[0] = 0;
+               fgCommunicators[1] = &(MPI::COMM_WORLD);
+            }
+         }
+
+         fgIndexComm++;
+
+         if (fgIndexComm>1) { // Remember, no more than 2 nested MPI calls!
+            std::cerr << "Error --> MPIProcess::MPIProcess: More than 2 nested MPI calls!" << std::endl;
+            MPI::COMM_WORLD.Abort(-1);
+         }
+
+         fgIndecesComm[fgIndexComm] = indexComm;
+
+         // require 2 nested communicators
+         if (fgCommunicator!=0 && fgCommunicators[indexComm]!=0) {
+            std::cout << "Warning --> MPIProcess::MPIProcess: Requiring 2 nested MPI calls!" << std::endl;
+            std::cout << "Warning --> MPIProcess::MPIProcess: Ignoring second call." << std::endl;
+            fgIndecesComm[fgIndexComm] = (indexComm==0) ? 1 : 0;
+         }
+
+         fgCommunicator = fgCommunicators[fgIndecesComm[fgIndexComm]];
+
+      }
+
+      // set size and rank
+      if (fgCommunicator!=0) {
+         fSize = fgCommunicator->Get_size();
+         fRank = fgCommunicator->Get_rank();
+      }
+      else {
+         // no MPI calls
+         fSize = 1;
+         fRank = 0;
+      }
+
+
+      if (fSize>fNelements) {
+         std::cerr << "Error --> MPIProcess::MPIProcess: more processors than elements!" << std::endl;
+         MPI::COMM_WORLD.Abort(-1);
+      }
+
+#endif
+
+      fNumElements4JobIn = fNelements / fSize;
+      fNumElements4JobOut = fNelements % fSize;
+
+   }
+
+   MPIProcess::~MPIProcess()
+   {
+      // destructor
+#ifdef MPIPROC
+      fgCommunicator = 0;
+      fgIndexComm--;
+      if (fgIndexComm==0)
+         fgCommunicator = fgCommunicators[fgIndecesComm[fgIndexComm]];
+
+#endif
+
+   }
+
+   bool MPIProcess::SyncVector(BA_ROOT::Minuit2::MnAlgebraicVector &mnvector)
+   {
+
+      // In case of just one job, don't need sync, just go
+      if (fSize<2)
+         return false;
+
+      if (mnvector.size()!=fNelements) {
+         std::cerr << "Error --> MPIProcess::SyncVector: # defined elements different from # requested elements!" << std::endl;
+         std::cerr << "Error --> MPIProcess::SyncVector: no MPI syncronization is possible!" << std::endl;
+         exit(-1);
+      }
+
+#ifdef MPIPROC
+      unsigned int numElements4ThisJob = NumElements4Job(fRank);
+      unsigned int startElementIndex = StartElementIndex();
+      unsigned int endElementIndex = EndElementIndex();
+
+      double dvectorJob[numElements4ThisJob];
+      for(unsigned int i = startElementIndex; i<endElementIndex; i++)
+         dvectorJob[i-startElementIndex] = mnvector(i);
+
+      double dvector[fNelements];
+      MPISyncVector(dvectorJob,numElements4ThisJob,dvector);
+
+      for (unsigned int i = 0; i<fNelements; i++) {
+         mnvector(i) = dvector[i];
+      }
+
+      return true;
+
+#else
+
+      std::cerr << "Error --> MPIProcess::SyncVector: no MPI syncronization is possible!" << std::endl;
+      exit(-1);
+
+#endif
+
+   }
+
+
+   bool MPIProcess::SyncSymMatrixOffDiagonal(BA_ROOT::Minuit2::MnAlgebraicSymMatrix &mnmatrix)
+   {
+
+      // In case of just one job, don't need sync, just go
+      if (fSize<2)
+         return false;
+
+      if (mnmatrix.size()-mnmatrix.Nrow()!=fNelements) {
+         std::cerr << "Error --> MPIProcess::SyncSymMatrixOffDiagonal: # defined elements different from # requested elements!" << std::endl;
+         std::cerr << "Error --> MPIProcess::SyncSymMatrixOffDiagonal: no MPI syncronization is possible!" << std::endl;
+         exit(-1);
+      }
+
+#ifdef MPIPROC
+      unsigned int numElements4ThisJob = NumElements4Job(fRank);
+      unsigned int startElementIndex = StartElementIndex();
+      unsigned int endElementIndex = EndElementIndex();
+      unsigned int nrow = mnmatrix.Nrow();
+
+      unsigned int offsetVect = 0;
+      for (unsigned int i = 0; i<startElementIndex; i++)
+         if ((i+offsetVect)%(nrow-1)==0) offsetVect += (i+offsetVect)/(nrow-1);
+
+      double dvectorJob[numElements4ThisJob];
+      for(unsigned int i = startElementIndex; i<endElementIndex; i++) {
+
+         int x = (i+offsetVect)/(nrow-1);
+         if ((i+offsetVect)%(nrow-1)==0) offsetVect += x;
+         int y = (i+offsetVect)%(nrow-1)+1;
+
+         dvectorJob[i-startElementIndex] = mnmatrix(x,y);
+
+      }
+
+      double dvector[fNelements];
+      MPISyncVector(dvectorJob,numElements4ThisJob,dvector);
+
+      offsetVect = 0;
+      for (unsigned int i = 0; i<fNelements; i++) {
+
+         int x = (i+offsetVect)/(nrow-1);
+         if ((i+offsetVect)%(nrow-1)==0) offsetVect += x;
+         int y = (i+offsetVect)%(nrow-1)+1;
+
+         mnmatrix(x,y) = dvector[i];
+
+      }
+
+      return true;
+
+#else
+
+      std::cerr << "Error --> MPIProcess::SyncMatrix: no MPI syncronization is possible!" << std::endl;
+      exit(-1);
+
+#endif
+
+   }
+
+#ifdef MPIPROC
+   void MPIProcess::MPISyncVector(double *ivector, int svector, double *ovector)
+   {
+      int offsets[fSize];
+      int nconts[fSize];
+      nconts[0] = NumElements4Job(0);
+      offsets[0] = 0;
+      for (unsigned int i = 1; i<fSize; i++) {
+         nconts[i] = NumElements4Job(i);
+         offsets[i] = nconts[i-1] + offsets[i-1];
+      }
+
+      fgCommunicator->Allgatherv(ivector,svector,MPI::DOUBLE,
+                                ovector,nconts,offsets,MPI::DOUBLE);
+
+   }
+
+   bool MPIProcess::SetCartDimension(unsigned int dimX, unsigned int dimY)
+   {
+      if (fgCommunicator!=0 || fgIndexComm>=0) {
+         std::cout << "Warning --> MPIProcess::SetCartDimension: MPIProcess already declared! Ignoring command..." << std::endl;
+         return false;
+      }
+      if (dimX*dimY<=0) {
+         std::cout << "Warning --> MPIProcess::SetCartDimension: Invalid topology! Ignoring command..." << std::endl;
+         return false;
+      }
+
+      StartMPI();
+
+      if (fgGlobalSize!=dimX*dimY) {
+         std::cout << "Warning --> MPIProcess::SetCartDimension: Cartesian dimension doesn't correspond to # total procs!" << std::endl;
+         std::cout << "Warning --> MPIProcess::SetCartDimension: Ignoring command..." << std::endl;
+         return false;
+      }
+
+      if (fgCartSizeX!=dimX || fgCartSizeY!=dimY) {
+         fgCartSizeX = dimX; fgCartSizeY = dimY;
+         fgCartDimension = fgCartSizeX * fgCartSizeY;
+         fgNewCart = true;
+
+         if (fgCommunicators[0]!=0 && fgCommunicators[1]!=0) {
+            delete fgCommunicators[0]; fgCommunicators[0] = 0; fgIndecesComm[0] = 0;
+            delete fgCommunicators[1]; fgCommunicators[1] = 0; fgIndecesComm[1] = 0;
+         }
+      }
+
+      return true;
+
+   }
+
+   bool MPIProcess::SetDoFirstMPICall(bool doFirstMPICall)
+   {
+
+      StartMPI();
+
+      bool ret;
+      if (doFirstMPICall)
+         ret = SetCartDimension(fgGlobalSize,1);
+      else
+         ret = SetCartDimension(1,fgGlobalSize);
+
+      return ret;
+
+   }
+
+#endif
+
+#ifdef MPIPROC
+   MPITerminate dummyMPITerminate = MPITerminate();
+#endif
+
+} // namespace Minuit2
+
+} // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MinimumBuilder.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MinimumBuilder.cxx
new file mode 100644
index 0000000..c20817a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MinimumBuilder.cxx
@@ -0,0 +1,30 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MinimumBuilder.h"
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+      MinimumBuilder::MinimumBuilder() :
+         fPrintLevel(MnPrint::Level()),
+         fStorageLevel(1),
+         fTracer(0)
+      {}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/Minuit2Minimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/Minuit2Minimizer.cxx
new file mode 100644
index 0000000..545408e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/Minuit2Minimizer.cxx
@@ -0,0 +1,1136 @@
+// @(#)root/minuit2:$Id$
+// Author: L. Moneta Wed Oct 18 11:48:00 2006
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
+ *                                                                    *
+ *                                                                    *
+ **********************************************************************/
+
+// Implementation file for class Minuit2Minimizer
+
+#include "Minuit2/Minuit2Minimizer.h"
+
+#include "Math/IFunction.h"
+#include "Math/IOptions.h"
+
+#include "Fit/ParameterSettings.h"
+
+#include "Minuit2/FCNAdapter.h"
+#include "Minuit2/FumiliFCNAdapter.h"
+#include "Minuit2/FCNGradAdapter.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnMigrad.h"
+#include "Minuit2/MnMinos.h"
+#include "Minuit2/MinosError.h"
+#include "Minuit2/MnHesse.h"
+#include "Minuit2/MinuitParameter.h"
+#include "Minuit2/MnUserFcn.h"
+#include "Minuit2/MnPrint.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/VariableMetricMinimizer.h"
+#include "Minuit2/SimplexMinimizer.h"
+#include "Minuit2/CombinedMinimizer.h"
+#include "Minuit2/ScanMinimizer.h"
+#include "Minuit2/FumiliMinimizer.h"
+#include "Minuit2/MnParameterScan.h"
+#include "Minuit2/MnContours.h"
+#include "Minuit2/MnTraceObject.h"
+#include "Minuit2/MinimumBuilder.h"
+
+#include <cassert>
+#include <iostream>
+#include <algorithm>
+#include <functional>
+
+#ifdef USE_ROOT_ERROR
+#include "TROOT.h"
+#include "TMinuit2TraceObject.h"
+#endif
+
+namespace BA_ROOT {
+
+namespace Minuit2 {
+
+
+   // functions needed to control siwthc off of Minuit2 printing level
+#ifdef USE_ROOT_ERROR
+   int TurnOffPrintInfoLevel() {
+   // switch off Minuit2 printing of INFO message (cut off is 1001)
+   int prevErrorIgnoreLevel = gErrorIgnoreLevel;
+   if (prevErrorIgnoreLevel < 1001) {
+      gErrorIgnoreLevel = 1001;
+      return prevErrorIgnoreLevel;
+   }
+   return -2;  // no op in this case
+}
+
+void RestoreGlobalPrintLevel(int value) {
+      gErrorIgnoreLevel = value;
+}
+#else
+   // dummy functions
+   int TurnOffPrintInfoLevel() { return -1; }
+   int ControlPrintLevel( ) { return -1;}
+   void RestoreGlobalPrintLevel(int ) {}
+#endif
+
+
+
+
+Minuit2Minimizer::Minuit2Minimizer(BA_ROOT::Minuit2::EMinimizerType type ) :
+   Minimizer(),
+   fDim(0),
+   fMinimizer(0),
+   fMinuitFCN(0),
+   fMinimum(0)
+{
+   // Default constructor implementation depending on minimizer type
+   SetMinimizerType(type);
+}
+
+Minuit2Minimizer::Minuit2Minimizer(const char *  type ) :
+   Minimizer(),
+   fDim(0),
+   fMinimizer(0),
+   fMinuitFCN(0),
+   fMinimum(0)
+{
+   // constructor from a string
+
+   std::string algoname(type);
+   // tolower() is not an  std function (Windows)
+   std::transform(algoname.begin(), algoname.end(), algoname.begin(), (int(*)(int)) tolower );
+
+   EMinimizerType algoType = kMigrad;
+   if (algoname == "simplex")   algoType = kSimplex;
+   if (algoname == "minimize" ) algoType = kCombined;
+   if (algoname == "scan" )     algoType = kScan;
+   if (algoname == "fumili" )   algoType = kFumili;
+
+   SetMinimizerType(algoType);
+}
+
+void Minuit2Minimizer::SetMinimizerType(BA_ROOT::Minuit2::EMinimizerType type) {
+   // Set  minimizer algorithm type
+   fUseFumili = false;
+   switch (type) {
+   case BA_ROOT::Minuit2::kMigrad:
+      //std::cout << "Minuit2Minimizer: minimize using MIGRAD " << std::endl;
+      SetMinimizer( new BA_ROOT::Minuit2::VariableMetricMinimizer() );
+      return;
+   case BA_ROOT::Minuit2::kSimplex:
+      //std::cout << "Minuit2Minimizer: minimize using SIMPLEX " << std::endl;
+      SetMinimizer( new BA_ROOT::Minuit2::SimplexMinimizer() );
+      return;
+   case BA_ROOT::Minuit2::kCombined:
+      SetMinimizer( new BA_ROOT::Minuit2::CombinedMinimizer() );
+      return;
+   case BA_ROOT::Minuit2::kScan:
+      SetMinimizer( new BA_ROOT::Minuit2::ScanMinimizer() );
+      return;
+   case BA_ROOT::Minuit2::kFumili:
+      SetMinimizer( new BA_ROOT::Minuit2::FumiliMinimizer() );
+      fUseFumili = true;
+      return;
+   default:
+      //migrad minimizer
+      SetMinimizer( new BA_ROOT::Minuit2::VariableMetricMinimizer() );
+
+   }
+}
+
+
+Minuit2Minimizer::~Minuit2Minimizer()
+{
+   // Destructor implementation.
+   if (fMinimizer) delete fMinimizer;
+   if (fMinuitFCN) delete fMinuitFCN;
+   if (fMinimum)   delete fMinimum;
+}
+
+Minuit2Minimizer::Minuit2Minimizer(const Minuit2Minimizer &) :
+   BA_ROOT::Math::Minimizer()
+{
+   // Implementation of copy constructor.
+}
+
+Minuit2Minimizer & Minuit2Minimizer::operator = (const Minuit2Minimizer &rhs)
+{
+   // Implementation of assignment operator.
+   if (this == &rhs) return *this;  // time saving self-test
+   return *this;
+}
+
+
+void Minuit2Minimizer::Clear() {
+   // delete the state in case of consecutive minimizations
+   fState = MnUserParameterState();
+   // clear also the function minimum
+   if (fMinimum) delete fMinimum;
+   fMinimum = 0;
+}
+
+
+// set variables
+
+bool Minuit2Minimizer::SetVariable(unsigned int ivar, const std::string & name, double val, double step) {
+   // set a free variable.
+   // Add the variable if not existing otherwise  set value if exists already
+   // this is implemented in MnUserParameterState::Add
+   // if index is wrong (i.e. variable already exists but with a different index return false) but
+   // value is set for corresponding variable name
+
+//    std::cout << " add parameter " << name << "  " <<  val << " step " << step << std::endl;
+
+   if (step <= 0) {
+      std::string txtmsg = "Parameter " + name + "  has zero or invalid step size - consider it as constant ";
+      MN_INFO_MSG2("Minuit2Minimizer::SetVariable",txtmsg);
+      fState.Add(name.c_str(), val);
+   }
+   else
+      fState.Add(name.c_str(), val, step);
+
+   unsigned int minuit2Index = fState.Index(name.c_str() );
+   if ( minuit2Index != ivar) {
+      std::string txtmsg("Wrong index used for the variable " + name);
+      MN_INFO_MSG2("Minuit2Minimizer::SetVariable",txtmsg);
+      MN_INFO_VAL2("Minuit2Minimizer::SetVariable",minuit2Index);
+      ivar = minuit2Index;
+      return false;
+   }
+   fState.RemoveLimits(ivar);
+
+   return true;
+}
+
+bool Minuit2Minimizer::SetLowerLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double lower ) {
+   // add a lower bounded variable
+   if (!SetVariable(ivar, name, val, step) ) return false;
+   fState.SetLowerLimit(ivar, lower);
+   return true;
+}
+
+bool Minuit2Minimizer::SetUpperLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double upper ) {
+   // add a upper bounded variable
+   if (!SetVariable(ivar, name, val, step) ) return false;
+   fState.SetUpperLimit(ivar, upper);
+   return true;
+}
+
+
+
+bool Minuit2Minimizer::SetLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double lower , double upper) {
+   // add a double bound variable
+   if (!SetVariable(ivar, name, val, step) ) return false;
+   fState.SetLimits(ivar, lower, upper);
+   return true;
+}
+
+bool Minuit2Minimizer::SetFixedVariable(unsigned int ivar , const std::string & name , double val ) {
+   // add a fixed variable
+   // need a step size otherwise treated as a constant
+   // use 10%
+   double step = ( val != 0) ? 0.1 * std::abs(val) : 0.1;
+   if (!SetVariable(ivar, name, val, step ) ) {
+      ivar = fState.Index(name.c_str() );
+   }
+   fState.Fix(ivar);
+   return true;
+}
+
+std::string Minuit2Minimizer::VariableName(unsigned int ivar) const {
+   // return the variable name
+   if (ivar >= fState.MinuitParameters().size() ) return std::string();
+   return fState.GetName(ivar);
+}
+
+
+int Minuit2Minimizer::VariableIndex(const std::string & name) const {
+   // return the variable index
+   // check if variable exist
+   return fState.Trafo().FindIndex(name);
+}
+
+
+bool Minuit2Minimizer::SetVariableValue(unsigned int ivar, double val) {
+   // set value for variable ivar (only for existing parameters)
+   if (ivar >= fState.MinuitParameters().size() ) return false;
+   fState.SetValue(ivar, val);
+   return true;
+}
+
+bool Minuit2Minimizer::SetVariableValues(const double * x)  {
+   // set value for variable ivar (only for existing parameters)
+   unsigned int n =  fState.MinuitParameters().size();
+   if (n== 0) return false;
+   for (unsigned int ivar = 0; ivar < n; ++ivar)
+      fState.SetValue(ivar, x[ivar]);
+   return true;
+}
+
+bool Minuit2Minimizer::SetVariableStepSize(unsigned int ivar, double step) {
+   // set the step-size of an existing variable
+   // parameter must exist or return false
+   if (ivar >= fState.MinuitParameters().size() ) return false;
+   fState.SetError(ivar, step);
+   return true;
+}
+
+bool Minuit2Minimizer::SetVariableLowerLimit(unsigned int ivar, double lower) {
+   // set the limits of an existing variable
+   // parameter must exist or return false
+   if (ivar >= fState.MinuitParameters().size() ) return false;
+   fState.SetLowerLimit(ivar, lower);
+   return true;
+}
+bool Minuit2Minimizer::SetVariableUpperLimit(unsigned int ivar, double upper ) {
+   // set the limits of an existing variable
+   // parameter must exist or return false
+   if (ivar >= fState.MinuitParameters().size() ) return false;
+   fState.SetUpperLimit(ivar, upper);
+   return true;
+}
+
+bool Minuit2Minimizer::SetVariableLimits(unsigned int ivar, double lower, double upper) {
+   // set the limits of an existing variable
+   // parameter must exist or return false
+   if (ivar >= fState.MinuitParameters().size() ) return false;
+   fState.SetLimits(ivar, lower,upper);
+   return true;
+}
+
+bool Minuit2Minimizer::FixVariable(unsigned int ivar) {
+   // Fix an existing variable
+   if (ivar >= fState.MinuitParameters().size() ) return false;
+   fState.Fix(ivar);
+   return true;
+}
+
+bool Minuit2Minimizer::ReleaseVariable(unsigned int ivar) {
+   // Release an existing variable
+   if (ivar >= fState.MinuitParameters().size() ) return false;
+   fState.Release(ivar);
+   return true;
+}
+
+bool Minuit2Minimizer::IsFixedVariable(unsigned int ivar) const {
+   // query if variable is fixed
+   if (ivar >= fState.MinuitParameters().size() ) {
+      MN_ERROR_MSG2("Minuit2Minimizer","wrong variable index");
+      return false;
+   }
+   return (fState.Parameter(ivar).IsFixed() || fState.Parameter(ivar).IsConst() );
+}
+
+bool Minuit2Minimizer::GetVariableSettings(unsigned int ivar, BA_ROOT::Fit::ParameterSettings & varObj) const {
+   // retrieve variable settings (all set info on the variable)
+   if (ivar >= fState.MinuitParameters().size() ) {
+      MN_ERROR_MSG2("Minuit2Minimizer","wrong variable index");
+      return false;
+   }
+   const MinuitParameter & par = fState.Parameter(ivar);
+   varObj.Set( par.Name(), par.Value(), par.Error() );
+   if (par.HasLowerLimit() ) varObj.SetLowerLimit(par.LowerLimit() );
+   else if (par.HasUpperLimit() ) varObj.SetUpperLimit(par.UpperLimit() );
+   else if (par.HasLimits() ) varObj.SetLimits(par.LowerLimit(), par.UpperLimit() );
+   if (par.IsConst() || par.IsFixed() ) varObj.Fix();
+   return true;
+}
+
+
+
+void Minuit2Minimizer::SetFunction(const  BA_ROOT::Math::IMultiGenFunction & func) {
+   // set function to be minimized
+   if (fMinuitFCN) delete fMinuitFCN;
+   fDim = func.NDim();
+   if (!fUseFumili) {
+      fMinuitFCN = new BA_ROOT::Minuit2::FCNAdapter<BA_ROOT::Math::IMultiGenFunction> (func, ErrorDef() );
+   }
+   else {
+      // for Fumili the fit method function interface is required
+      const BA_ROOT::Math::FitMethodFunction * fcnfunc = dynamic_cast<const BA_ROOT::Math::FitMethodFunction *>(&func);
+      if (!fcnfunc) {
+         MN_ERROR_MSG("Minuit2Minimizer: Wrong Fit method function for Fumili");
+         return;
+      }
+      fMinuitFCN = new BA_ROOT::Minuit2::FumiliFCNAdapter<BA_ROOT::Math::FitMethodFunction> (*fcnfunc, fDim, ErrorDef() );
+   }
+}
+
+void Minuit2Minimizer::SetFunction(const  BA_ROOT::Math::IMultiGradFunction & func) {
+   // set function to be minimized
+   fDim = func.NDim();
+   if (fMinuitFCN) delete fMinuitFCN;
+   if (!fUseFumili) {
+      fMinuitFCN = new BA_ROOT::Minuit2::FCNGradAdapter<BA_ROOT::Math::IMultiGradFunction> (func, ErrorDef() );
+   }
+   else {
+      // for Fumili the fit method function interface is required
+      const BA_ROOT::Math::FitMethodGradFunction * fcnfunc = dynamic_cast<const BA_ROOT::Math::FitMethodGradFunction*>(&func);
+      if (!fcnfunc) {
+         MN_ERROR_MSG("Minuit2Minimizer: Wrong Fit method function for Fumili");
+         return;
+      }
+      fMinuitFCN = new BA_ROOT::Minuit2::FumiliFCNAdapter<BA_ROOT::Math::FitMethodGradFunction> (*fcnfunc, fDim, ErrorDef() );
+   }
+}
+
+bool Minuit2Minimizer::Minimize() {
+   // perform the minimization
+   // store a copy of FunctionMinimum
+   if (!fMinuitFCN) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Minimize","FCN function has not been set");
+      return false;
+  }
+
+   assert(GetMinimizer() != 0 );
+
+   // delete result of previous minimization
+   if (fMinimum) delete fMinimum;
+   fMinimum = 0;
+
+
+   int maxfcn = MaxFunctionCalls();
+   double tol = Tolerance();
+   int strategyLevel = Strategy();
+   fMinuitFCN->SetErrorDef(ErrorDef() );
+
+   int printLevel = PrintLevel();
+   if (printLevel >=1) {
+      // print the real number of maxfcn used (defined in ModularFuncitonMinimizer)
+      int maxfcn_used = maxfcn;
+      if (maxfcn_used == 0) {
+         int nvar = fState.VariableParameters();
+         maxfcn_used = 200 + 100*nvar + 5*nvar*nvar;
+      }
+      std::cout << "Minuit2Minimizer: Minimize with max-calls " << maxfcn_used
+                << " convergence for edm < " << tol << " strategy "
+                << strategyLevel << std::endl;
+   }
+
+   // internal minuit messages
+   MnPrint::SetLevel(printLevel );
+   fMinimizer->Builder().SetPrintLevel(printLevel);
+
+   // switch off Minuit2 printing
+   int prev_level = (printLevel <= 0 ) ?   TurnOffPrintInfoLevel() : -2;
+
+   // set the precision if needed
+   if (Precision() > 0) fState.SetPrecision(Precision());
+
+   // set strategy and add extra options if needed
+   BA_ROOT::Minuit2::MnStrategy strategy(strategyLevel);
+   BA_ROOT::Math::IOptions * minuit2Opt = BA_ROOT::Math::MinimizerOptions::FindDefault("Minuit2");
+   if (minuit2Opt) {
+      // set extra strategy options
+      int nGradCycles = strategy.GradientNCycles();
+      int nHessCycles = strategy.HessianNCycles();
+      int nHessGradCycles = strategy.HessianGradientNCycles();
+
+      double gradTol =  strategy.GradientTolerance();
+      double gradStepTol = strategy.GradientStepTolerance();
+      double hessStepTol = strategy.HessianStepTolerance();
+      double hessG2Tol = strategy.HessianG2Tolerance();
+
+      minuit2Opt->GetValue("GradientNCycles",nGradCycles);
+      minuit2Opt->GetValue("HessianNCycles",nHessCycles);
+      minuit2Opt->GetValue("HessianGradientNCycles",nHessGradCycles);
+
+      minuit2Opt->GetValue("GradientTolerance",gradTol);
+      minuit2Opt->GetValue("GradientStepTolerance",gradStepTol);
+      minuit2Opt->GetValue("HessianStepTolerance",hessStepTol);
+      minuit2Opt->GetValue("HessianG2Tolerance",hessG2Tol);
+
+      strategy.SetGradientNCycles(nGradCycles);
+      strategy.SetHessianNCycles(nHessCycles);
+      strategy.SetHessianGradientNCycles(nHessGradCycles);
+
+      strategy.SetGradientTolerance(gradTol);
+      strategy.SetGradientStepTolerance(gradStepTol);
+      strategy.SetHessianStepTolerance(hessStepTol);
+      strategy.SetHessianG2Tolerance(hessStepTol);
+
+      if (printLevel > 0) {
+         std::cout << "Minuit2Minimizer::Minuit  - Changing default strategy options" << std::endl;
+         minuit2Opt->Print();
+      }
+
+      int storageLevel = 1;
+      bool ret = minuit2Opt->GetValue("StorageLevel",storageLevel);
+      if (ret) SetStorageLevel(storageLevel);
+
+   }
+
+   // set a minimizer tracer object (default for printlevel=10, from gROOT for printLevel=11)
+   // use some special print levels
+   MnTraceObject * traceObj = 0;
+#ifdef USE_ROOT_ERROR
+   if (printLevel == 10 && gROOT) {
+      TObject * obj = gROOT->FindObject("Minuit2TraceObject");
+      traceObj = dynamic_cast<ROOT::Minuit2::MnTraceObject*>(obj);
+      if (traceObj) {
+         // need to remove from the list
+         gROOT->Remove(obj);
+      }
+   }
+   if (printLevel == 20 || printLevel == 30 || printLevel == 40 || (printLevel >= 20000 && printLevel < 30000) ) {
+      int parNumber = printLevel-20000;
+      if (printLevel == 20) parNumber = -1;
+      if (printLevel == 30) parNumber = -2;
+      if (printLevel == 40) parNumber = 0;
+      traceObj = new TMinuit2TraceObject(parNumber);
+   }
+#endif
+   if (printLevel == 100 || (printLevel >= 10000 && printLevel < 20000)) {
+      int parNumber = printLevel-10000;
+      traceObj = new MnTraceObject(parNumber);
+   }
+   if (traceObj) {
+      traceObj->Init(fState);
+      SetTraceObject(*traceObj);
+   }
+
+   const BA_ROOT::Minuit2::FCNGradientBase * gradFCN = dynamic_cast<const BA_ROOT::Minuit2::FCNGradientBase *>( fMinuitFCN );
+   if ( gradFCN != 0) {
+      // use gradient
+      //SetPrintLevel(3);
+      BA_ROOT::Minuit2::FunctionMinimum min =  GetMinimizer()->Minimize(*gradFCN, fState, strategy, maxfcn, tol);
+      fMinimum = new BA_ROOT::Minuit2::FunctionMinimum (min);
+   }
+   else {
+      BA_ROOT::Minuit2::FunctionMinimum min = GetMinimizer()->Minimize(*GetFCN(), fState, strategy, maxfcn, tol);
+      fMinimum = new BA_ROOT::Minuit2::FunctionMinimum (min);
+   }
+
+   // check if Hesse needs to be run
+   if (fMinimum->IsValid() && IsValidError() && fMinimum->State().Error().Dcovar() != 0 ) {
+      // run Hesse (Hesse will add results in the last state of fMinimum
+      BA_ROOT::Minuit2::MnHesse hesse(strategy );
+      hesse( *fMinuitFCN, *fMinimum, maxfcn);
+   }
+
+   // -2 is the highest low invalid value for gErrorIgnoreLevel
+   if (prev_level > -2) RestoreGlobalPrintLevel(prev_level);
+
+   fState = fMinimum->UserState();
+   bool ok =  ExamineMinimum(*fMinimum);
+   //fMinimum = 0;
+
+   // delete trace object if it was constructed
+   if (traceObj) {       delete traceObj;   }
+   return ok;
+}
+
+bool  Minuit2Minimizer::ExamineMinimum(const BA_ROOT::Minuit2::FunctionMinimum & min) {
+   /// study the function minimum
+
+   // debug ( print all the states)
+   int debugLevel = PrintLevel();
+   if (debugLevel >= 3) {
+
+      const std::vector<BA_ROOT::Minuit2::MinimumState>& iterationStates = min.States();
+      std::cout << "Number of iterations " << iterationStates.size() << std::endl;
+      for (unsigned int i = 0; i <  iterationStates.size(); ++i) {
+         //std::cout << iterationStates[i] << std::endl;
+         const BA_ROOT::Minuit2::MinimumState & st =  iterationStates[i];
+         std::cout << "----------> Iteration " << i << std::endl;
+         int pr = std::cout.precision(12);
+         std::cout << "            FVAL = " << st.Fval() << " Edm = " << st.Edm() << " Nfcn = " << st.NFcn() << std::endl;
+         std::cout.precision(pr);
+         std::cout << "            Error matrix change = " << st.Error().Dcovar() << std::endl;
+         std::cout << "            Parameters : ";
+         // need to transform from internal to external
+         for (int j = 0; j < st.size() ; ++j) std::cout << " p" << j << " = " << fState.Int2ext( j, st.Vec()(j) );
+         std::cout << std::endl;
+      }
+   }
+
+   fStatus = 0;
+   std::string txt;
+   if (min.HasMadePosDefCovar() ) {
+      txt = "Covar was made pos def";
+      fStatus = 1;
+   }
+   if (min.HesseFailed() ) {
+      txt = "Hesse is not valid";
+      fStatus = 2;
+   }
+   if (min.IsAboveMaxEdm() ) {
+      txt = "Edm is above max";
+      fStatus = 3;
+   }
+   if (min.HasReachedCallLimit() ) {
+      txt = "Reached call limit";
+      fStatus = 4;
+   }
+
+
+   bool validMinimum = min.IsValid();
+   if (validMinimum) {
+      // print a warning message in case something is not ok
+      if (fStatus != 0 && debugLevel > 0)  MN_INFO_MSG2("Minuit2Minimizer::Minimize",txt);
+   }
+   else {
+      // minimum is not valid when state is not valid and edm is over max or has passed call limits
+      if (fStatus == 0) {
+         // this should not happen
+         txt = "unknown failure";
+         fStatus = 5;
+      }
+      std::string msg = "Minimization did NOT converge, " + txt;
+      MN_INFO_MSG2("Minuit2Minimizer::Minimize",msg);
+   }
+
+   if (debugLevel >= 1) PrintResults();
+   return validMinimum;
+}
+
+
+void Minuit2Minimizer::PrintResults() {
+   // print results of minimization
+   if (!fMinimum) return;
+   if (fMinimum->IsValid() ) {
+      // valid minimum
+      std::cout << "Minuit2Minimizer : Valid minimum - status = " << fStatus  << std::endl;
+      int pr = std::cout.precision(18);
+      std::cout << "FVAL  = " << fState.Fval() << std::endl;
+      std::cout << "Edm   = " << fState.Edm() << std::endl;
+      std::cout.precision(pr);
+      std::cout << "Nfcn  = " << fState.NFcn() << std::endl;
+      for (unsigned int i = 0; i < fState.MinuitParameters().size(); ++i) {
+         const MinuitParameter & par = fState.Parameter(i);
+         std::cout << par.Name() << "\t  = " << par.Value() << "\t ";
+         if (par.IsFixed() )      std::cout << "(fixed)" << std::endl;
+         else if (par.IsConst() ) std::cout << "(const)" << std::endl;
+         else if (par.HasLimits() )
+            std::cout << "+/-  " << par.Error() << "\t(limited)"<< std::endl;
+         else
+            std::cout << "+/-  " << par.Error() << std::endl;
+      }
+   }
+   else {
+      std::cout << "Minuit2Minimizer : Invalid Minimum - status = " << fStatus << std::endl;
+      std::cout << "FVAL  = " << fState.Fval() << std::endl;
+      std::cout << "Edm   = " << fState.Edm() << std::endl;
+      std::cout << "Nfcn  = " << fState.NFcn() << std::endl;
+   }
+}
+
+const double * Minuit2Minimizer::X() const {
+   // return values at minimum
+   const std::vector<MinuitParameter> & paramsObj = fState.MinuitParameters();
+   if (paramsObj.size() == 0) return 0;
+   assert(fDim == paramsObj.size());
+   // be careful for multiple calls of this function. I will redo an allocation here
+   // only when size of vectors has changed (e.g. after a new minimization)
+   if (fValues.size() != fDim) fValues.resize(fDim);
+   for (unsigned int i = 0; i < fDim; ++i) {
+      fValues[i] = paramsObj[i].Value();
+   }
+
+   return  &fValues.front();
+}
+
+
+const double * Minuit2Minimizer::Errors() const {
+   // return error at minimum (set to zero for fixed and constant params)
+   const std::vector<MinuitParameter> & paramsObj = fState.MinuitParameters();
+   if (paramsObj.size() == 0) return 0;
+   assert(fDim == paramsObj.size());
+   // be careful for multiple calls of this function. I will redo an allocation here
+   // only when size of vectors has changed (e.g. after a new minimization)
+   if (fErrors.size() != fDim)   fErrors.resize( fDim );
+   for (unsigned int i = 0; i < fDim; ++i) {
+      const MinuitParameter & par = paramsObj[i];
+      if (par.IsFixed() || par.IsConst() )
+         fErrors[i] = 0;
+      else
+         fErrors[i] = par.Error();
+   }
+
+   return  &fErrors.front();
+}
+
+
+double Minuit2Minimizer::CovMatrix(unsigned int i, unsigned int j) const {
+   // get value of covariance matrices (transform from external to internal indices)
+   if ( i >= fDim || i >= fDim) return 0;
+   if (  !fState.HasCovariance()    ) return 0; // no info available when minimization has failed
+   if (fState.Parameter(i).IsFixed() || fState.Parameter(i).IsConst() ) return 0;
+   if (fState.Parameter(j).IsFixed() || fState.Parameter(j).IsConst() ) return 0;
+   unsigned int k = fState.IntOfExt(i);
+   unsigned int l = fState.IntOfExt(j);
+   return fState.Covariance()(k,l);
+}
+
+bool Minuit2Minimizer::GetCovMatrix(double * cov) const {
+   // get value of covariance matrices
+   if ( !fState.HasCovariance()    ) return false; // no info available when minimization has failed
+   for (unsigned int i = 0; i < fDim; ++i) {
+      if (fState.Parameter(i).IsFixed() || fState.Parameter(i).IsConst() ) {
+         for (unsigned int j = 0; j < fDim; ++j) { cov[i*fDim + j] = 0; }
+      }
+      else
+      {
+         unsigned int l = fState.IntOfExt(i);
+         for (unsigned int j = 0; j < fDim; ++j) {
+            // could probably speed up this loop (if needed)
+            int k = i*fDim + j;
+            if (fState.Parameter(j).IsFixed() || fState.Parameter(j).IsConst() )
+               cov[k] = 0;
+            else {
+            // need to transform from external to internal indices)
+            // for taking care of the removed fixed row/columns in the Minuit2 representation
+               unsigned int m = fState.IntOfExt(j);
+               cov[k] =  fState.Covariance()(l,m);
+            }
+         }
+      }
+   }
+   return true;
+}
+
+bool Minuit2Minimizer::GetHessianMatrix(double * hess) const {
+   // get value of Hessian matrix
+   // this is the second derivative matrices
+   if (  !fState.HasCovariance()    ) return false; // no info available when minimization has failed
+   for (unsigned int i = 0; i < fDim; ++i) {
+      if (fState.Parameter(i).IsFixed() || fState.Parameter(i).IsConst() ) {
+         for (unsigned int j = 0; j < fDim; ++j) { hess[i*fDim + j] = 0; }
+      }
+      else {
+         unsigned int l = fState.IntOfExt(i);
+         for (unsigned int j = 0; j < fDim; ++j) {
+            // could probably speed up this loop (if needed)
+            int k = i*fDim + j;
+            if (fState.Parameter(j).IsFixed() || fState.Parameter(j).IsConst() )
+               hess[k] = 0;
+            else {
+               // need to transform from external to internal indices)
+               // for taking care of the removed fixed row/columns in the Minuit2 representation
+               unsigned int m = fState.IntOfExt(j);
+               hess[k] =  fState.Hessian()(l,m);
+            }
+         }
+      }
+   }
+
+   return true;
+}
+
+
+double Minuit2Minimizer::Correlation(unsigned int i, unsigned int j) const {
+   // get correlation between parameter i and j
+   if ( i >= fDim || i >= fDim) return 0;
+   if (  !fState.HasCovariance()    ) return 0; // no info available when minimization has failed
+   if (fState.Parameter(i).IsFixed() || fState.Parameter(i).IsConst() ) return 0;
+   if (fState.Parameter(j).IsFixed() || fState.Parameter(j).IsConst() ) return 0;
+   unsigned int k = fState.IntOfExt(i);
+   unsigned int l = fState.IntOfExt(j);
+   double cij =  fState.IntCovariance()(k,l);
+   double tmp =  std::sqrt( std::abs ( fState.IntCovariance()(k,k) * fState.IntCovariance()(l,l) ) );
+   if (tmp > 0 ) return cij/tmp;
+   return 0;
+}
+
+double Minuit2Minimizer::GlobalCC(unsigned int i) const {
+   // get global correlation coefficient for the parameter i. This is a number between zero and one which gives
+   // the correlation between the i-th parameter  and that linear combination of all other parameters which
+   // is most strongly correlated with i.
+
+   if ( i >= fDim || i >= fDim) return 0;
+    // no info available when minimization has failed or has some problems
+   if ( !fState.HasGlobalCC()    ) return 0;
+   if (fState.Parameter(i).IsFixed() || fState.Parameter(i).IsConst() ) return 0;
+   unsigned int k = fState.IntOfExt(i);
+   return fState.GlobalCC().GlobalCC()[k];
+}
+
+
+bool Minuit2Minimizer::GetMinosError(unsigned int i, double & errLow, double & errUp, int runopt) {
+   // return the minos error for parameter i
+   // if a minimum does not exist an error is returned
+   // runopt is a flag which specifies if only lower or upper error needs to be run
+   // if runopt = 0 both, = 1 only lower, + 2 only upper errors
+   errLow = 0; errUp = 0;
+   bool runLower = runopt != 2;
+   bool runUpper = runopt != 1;
+
+   assert( fMinuitFCN );
+
+   // need to know if parameter is const or fixed
+   if ( fState.Parameter(i).IsConst() || fState.Parameter(i).IsFixed() ) {
+      return false;
+   }
+
+   int debugLevel = PrintLevel();
+   // internal minuit messages
+   MnPrint::SetLevel( debugLevel );
+
+   // to run minos I need function minimum class
+   // redo minimization from current state
+//    ROOT::Minuit2::FunctionMinimum min =
+//       GetMinimizer()->Minimize(*GetFCN(),fState, ROOT::Minuit2::MnStrategy(strategy), MaxFunctionCalls(), Tolerance());
+//    fState = min.UserState();
+   if (fMinimum == 0) {
+      MN_ERROR_MSG("Minuit2Minimizer::GetMinosErrors:  failed - no function minimum existing");
+      return false;
+   }
+
+   if (!fMinimum->IsValid() ) {
+      MN_ERROR_MSG("Minuit2Minimizer::MINOS failed due to invalid function minimum");
+      return false;
+   }
+
+   fMinuitFCN->SetErrorDef(ErrorDef() );
+   // if error def has been changed update it in FunctionMinimum
+   if (ErrorDef() != fMinimum->Up() )
+      fMinimum->SetErrorDef(ErrorDef() );
+
+   // switch off Minuit2 printing
+   int prev_level = (PrintLevel() <= 0 ) ?   TurnOffPrintInfoLevel() : -2;
+
+   // set the precision if needed
+   if (Precision() > 0) fState.SetPrecision(Precision());
+
+
+   BA_ROOT::Minuit2::MnMinos minos( *fMinuitFCN, *fMinimum);
+
+   // run MnCross
+   MnCross low;
+   MnCross up;
+   int maxfcn = MaxFunctionCalls();
+   double tol = Tolerance();
+
+   const char * par_name = fState.Name(i);
+
+   // now input tolerance for migrad calls inside Minos (MnFunctionCross)
+   // before it was fixed to 0.05
+   // cut off too small tolerance (they are not needed)
+   tol = std::max(tol, 0.01);
+
+   if (PrintLevel() >=1) {
+      // print the real number of maxfcn used (defined in MnMinos)
+      int maxfcn_used = maxfcn;
+      if (maxfcn_used == 0) {
+         int nvar = fState.VariableParameters();
+         maxfcn_used = 2*(nvar+1)*(200 + 100*nvar + 5*nvar*nvar);
+      }
+      std::cout << "Minuit2Minimizer::GetMinosError for parameter " << i << "  " << par_name
+                << " using max-calls " << maxfcn_used << ", tolerance " << tol << std::endl;
+   }
+
+
+   if (runLower) low = minos.Loval(i,maxfcn,tol);
+   if (runUpper) up  = minos.Upval(i,maxfcn,tol);
+
+   BA_ROOT::Minuit2::MinosError me(i, fMinimum->UserState().Value(i),low, up);
+
+   if (prev_level > -2) RestoreGlobalPrintLevel(prev_level);
+
+   // debug result of Minos
+   // print error message in Minos
+   // Note that the only invalid condition can happen when the (npar-1) minimization fails
+   // The error is also invalid when the maximum number of calls is reached or a new function minimum is found
+   // in case of the parameter at the limit the error is not ivalid. 
+   // When the error is invalid the returned error is the Hessian error. 
+
+   if (debugLevel >= 1) {
+      if (runLower) {
+         if (!me.LowerValid() )
+            std::cout << "Minos:  Invalid lower error for parameter " << par_name << std::endl;
+         if(me.AtLowerLimit())
+            std::cout << "Minos:  Parameter : " << par_name << "  is at Lower limit."<<std::endl;
+         if(me.AtLowerMaxFcn())
+            std::cout << "Minos:  Maximum number of function calls exceeded when running for lower error" <<std::endl;
+         if(me.LowerNewMin() )
+            std::cout << "Minos:  New Minimum found while running Minos for lower error" <<std::endl;
+
+         if (debugLevel > 1)  std::cout << "Minos: Lower error for parameter " << par_name << "  :  " << me.Lower() << std::endl;
+
+      }
+      if (runUpper) {
+         if (!me.UpperValid() )
+            std::cout << "Minos:  Invalid upper error for parameter " << par_name << std::endl;
+         if(me.AtUpperLimit())
+            std::cout << "Minos:  Parameter " << par_name << " is at Upper limit."<<std::endl;
+         if(me.AtUpperMaxFcn())
+            std::cout << "Minos:  Maximum number of function calls exceeded when running for upper error" <<std::endl;
+         if(me.UpperNewMin() )
+            std::cout << "Minos:  New Minimum found while running Minos for upper error" <<std::endl;
+
+         if (debugLevel > 1)  std::cout << "Minos: Upper error for parameter " << par_name << "  :  " << me.Upper() << std::endl;
+      }
+
+   }
+
+   bool lowerInvalid =  (runLower && !me.LowerValid() );
+   bool upperInvalid =  (runUpper && !me.UpperValid() );
+   int mstatus = 0;
+   if (lowerInvalid || upperInvalid ) {
+      // set status accroding to bit
+      // bit 1:  lower invalid Minos errors
+      // bit 2:  uper invalid Minos error
+      // bit 3:   invalid because max FCN
+      // bit 4 : invalid because a new minimum has been found
+      if (lowerInvalid) {
+         mstatus |= 1;
+         if (me.AtLowerMaxFcn() ) mstatus |= 4;
+         if (me.LowerNewMin() ) mstatus |= 8;
+      }
+      if(upperInvalid) {
+         mstatus |= 3;
+         if (me.AtUpperMaxFcn() ) mstatus |= 4;
+         if (me.UpperNewMin() ) mstatus |= 8;
+      }
+      //std::cout << "Error running Minos for parameter " << i << std::endl;
+      fStatus += 10*mstatus;
+   }
+
+   errLow = me.Lower();
+   errUp = me.Upper();
+
+   bool isValid = (runLower && me.LowerValid() ) || (runUpper && me.UpperValid() );
+   return isValid;
+}
+
+bool Minuit2Minimizer::Scan(unsigned int ipar, unsigned int & nstep, double * x, double * y, double xmin, double xmax) {
+   // scan a parameter (variable) around the minimum value
+   // the parameters must have been set before
+   // if xmin=0 && xmax == 0  by default scan around 2 sigma of the error
+   // if the errors  are also zero then scan from min and max of parameter range
+
+   if (!fMinuitFCN) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Scan"," Function must be set before using Scan");
+      return false;
+   }
+
+   if ( ipar > fState.MinuitParameters().size() ) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Scan"," Invalid number. Minimizer variables must be set before using Scan");
+      return false;
+   }
+
+   // switch off Minuit2 printing
+   int prev_level = (PrintLevel() <= 0 ) ?   TurnOffPrintInfoLevel() : -2;
+
+   MnPrint::SetLevel( PrintLevel() );
+
+
+   // set the precision if needed
+   if (Precision() > 0) fState.SetPrecision(Precision());
+
+   MnParameterScan scan( *fMinuitFCN, fState.Parameters() );
+   double amin = scan.Fval(); // fcn value of the function before scan
+
+   // first value is param value
+   std::vector<std::pair<double, double> > result = scan(ipar, nstep-1, xmin, xmax);
+
+   if (prev_level > -2) RestoreGlobalPrintLevel(prev_level);
+
+   if (result.size() != nstep) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Scan"," Invalid result from MnParameterScan");
+      return false;
+   }
+   // sort also the returned points in x
+   std::sort(result.begin(), result.end() );
+
+
+   for (unsigned int i = 0; i < nstep; ++i ) {
+      x[i] = result[i].first;
+      y[i] = result[i].second;
+   }
+
+   // what to do if a new minimum has been found ?
+   // use that as new minimum
+   if (scan.Fval() < amin ) {
+      MN_INFO_MSG2("Minuit2Minimizer::Scan","A new minimum has been found");
+      fState.SetValue(ipar, scan.Parameters().Value(ipar) );
+
+   }
+
+
+   return true;
+}
+
+bool Minuit2Minimizer::Contour(unsigned int ipar, unsigned int jpar, unsigned int & npoints, double * x, double * y) {
+   // contour plot for parameter i and j
+   // need a valid FunctionMinimum otherwise exits
+   if (fMinimum == 0) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Contour"," no function minimum existing. Must minimize function before");
+      return false;
+   }
+
+   if (!fMinimum->IsValid() ) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Contour","Invalid function minimum");
+      return false;
+   }
+   assert(fMinuitFCN);
+
+   fMinuitFCN->SetErrorDef(ErrorDef() );
+   // if error def has been changed update it in FunctionMinimum
+   if (ErrorDef() != fMinimum->Up() ) {
+      fMinimum->SetErrorDef(ErrorDef() );
+   }
+
+   if ( PrintLevel() >= 1 )
+      MN_INFO_VAL2("Minuit2Minimizer::Contour - computing contours - ",ErrorDef());
+
+   // switch off Minuit2 printing (for level of  0,1)
+   int prev_level = (PrintLevel() <= 1 ) ?   TurnOffPrintInfoLevel() : -2;
+
+   // decrease print-level to have too many messages 
+   MnPrint::SetLevel( PrintLevel() -1 );
+
+   // set the precision if needed
+   if (Precision() > 0) fState.SetPrecision(Precision());
+
+   // eventually one should specify tolerance in contours
+   MnContours contour(*fMinuitFCN, *fMinimum, Strategy() );
+
+   if (prev_level > -2) RestoreGlobalPrintLevel(prev_level);
+
+   // compute the contour
+   std::vector<std::pair<double,double> >  result = contour(ipar,jpar, npoints);
+   if (result.size() != npoints) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Contour"," Invalid result from MnContours");
+      return false;
+   }
+   for (unsigned int i = 0; i < npoints; ++i ) {
+      x[i] = result[i].first;
+      y[i] = result[i].second;
+   }
+
+   // restore print level
+   MnPrint::SetLevel( PrintLevel() );
+
+
+   return true;
+
+
+}
+
+bool Minuit2Minimizer::Hesse( ) {
+    // find Hessian (full second derivative calculations)
+   // the contained state will be updated with the Hessian result
+   // in case a function minimum exists and is valid the result will be
+   // appended in the function minimum
+
+   if (!fMinuitFCN) {
+      MN_ERROR_MSG2("Minuit2Minimizer::Hesse","FCN function has not been set");
+      return false;
+   }
+
+   int strategy = Strategy();
+   int maxfcn = MaxFunctionCalls();
+
+   // switch off Minuit2 printing
+   int prev_level = (PrintLevel() <= 0 ) ?   TurnOffPrintInfoLevel() : -2;
+
+   MnPrint::SetLevel( PrintLevel() );
+
+   // set the precision if needed
+   if (Precision() > 0) fState.SetPrecision(Precision());
+
+   BA_ROOT::Minuit2::MnHesse hesse( strategy );
+
+
+   // case when function minimum exists
+   if (fMinimum  ) {
+      
+      // if (PrintLevel() >= 3) {
+      //    std::cout << "Minuit2Minimizer::Hesse  - State before running Hesse " << std::endl;
+      //    std::cout << fState << std::endl;
+      // }
+
+      // run hesse and function minimum will be updated with Hesse result
+      hesse( *fMinuitFCN, *fMinimum, maxfcn );
+      // update user state 
+      fState = fMinimum->UserState();
+   }
+
+   else {
+      // run Hesse on point stored in current state (independent of function minimum validity)
+      // (x == 0)
+      fState = hesse( *fMinuitFCN, fState, maxfcn);
+   }
+
+   if (prev_level > -2) RestoreGlobalPrintLevel(prev_level);
+
+   if (PrintLevel() >= 3) {
+      std::cout << "Minuit2Minimizer::Hesse  - State returned from Hesse " << std::endl;
+      std::cout << fState << std::endl;
+   }
+
+   int covStatus = fState.CovarianceStatus();
+   std::string covStatusType = "not valid";
+   if (covStatus == 1) covStatusType = "approximate";
+   if (covStatus == 2) covStatusType = "full but made positive defined";
+   if (covStatus == 3) covStatusType = "accurate";
+
+   if (!fState.HasCovariance() ) {
+      // if false means error is not valid and this is due to a failure in Hesse
+      // update minimizer error status
+      int hstatus = 4;
+      // information on error state can be retrieved only if fMinimum is available
+      if (fMinimum) {
+         if (fMinimum->Error().HesseFailed() ) hstatus = 1;
+         if (fMinimum->Error().InvertFailed() ) hstatus = 2;
+         else if (!(fMinimum->Error().IsPosDef()) ) hstatus = 3;
+      }
+      if (PrintLevel() > 0) {
+         std::string msg = "Hesse failed - matrix is " + covStatusType; 
+         MN_INFO_MSG2("Minuit2Minimizer::Hesse",msg);
+         MN_INFO_VAL2("MInuit2Minimizer::Hesse",hstatus);
+      }
+      fStatus += 100*hstatus;
+      return false;
+   }
+   if (PrintLevel() > 0) {
+      std::string msg = "Hesse is valid - matrix is " + covStatusType; 
+      MN_INFO_MSG2("Minuit2Minimizer::Hesse",msg);
+   }
+
+   return true;
+}
+
+int Minuit2Minimizer::CovMatrixStatus() const {
+   // return status of covariance matrix
+   //-1 - not available (inversion failed or Hesse failed)
+   // 0 - available but not positive defined
+   // 1 - covariance only approximate
+   // 2 full matrix but forced pos def
+   // 3 full accurate matrix
+
+   if (fMinimum) {
+      // case a function minimum  is available
+      if (fMinimum->HasAccurateCovar() ) return 3;
+      else if (fMinimum->HasMadePosDefCovar() ) return 2;
+      else if (fMinimum->HasValidCovariance() ) return 1;
+      else if (fMinimum->HasCovariance() ) return 0;
+      return -1;
+   }
+   else {
+      // case fMinimum is not available - use state information
+      return fState.CovarianceStatus();
+   }
+   return 0;
+}
+
+void Minuit2Minimizer::SetTraceObject(MnTraceObject & obj) {
+   // set trace object
+   if (!fMinimizer) return;
+   fMinimizer->Builder().SetTraceObject(obj);
+}
+
+void Minuit2Minimizer::SetStorageLevel(int level) {
+   // set storage level
+   if (!fMinimizer) return;
+   fMinimizer->Builder().SetStorageLevel(level);
+ }
+
+} // end namespace Minuit2
+
+} // end namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnApplication.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnApplication.cxx
new file mode 100644
index 0000000..a324c7a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnApplication.cxx
@@ -0,0 +1,190 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnApplication.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/ModularFunctionMinimizer.h"
+#include "Minuit2/FCNGradientBase.h"
+
+
+#ifdef DEBUG
+#include "Minuit2/MnPrint.h"
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+// constructor from non-gradient functions
+MnApplication::MnApplication(const FCNBase& fcn, const MnUserParameterState& state, const MnStrategy& stra, unsigned int nfcn) :
+   fFCN(fcn), fState(state), fStrategy(stra), fNumCall(nfcn), fUseGrad(false)
+{}
+
+// constructor from functions
+MnApplication::MnApplication(const FCNGradientBase& fcn, const MnUserParameterState& state, const MnStrategy& stra, unsigned int nfcn) :
+   fFCN(fcn), fState(state), fStrategy(stra), fNumCall(nfcn), fUseGrad(true)
+{}
+
+
+FunctionMinimum MnApplication::operator()(unsigned int maxfcn, double toler) {
+   // constructor from macfcn calls and tolerance
+
+   assert(fState.IsValid());
+   unsigned int npar = VariableParameters();
+   //   assert(npar > 0);
+   if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
+
+   const FCNBase * fcn = &(Fcnbase());
+   if (fUseGrad) {
+      // case of Gradient FCN implemented via the FCNGradientBase interface
+      const FCNGradientBase * gfcn = dynamic_cast<const FCNGradientBase *>(fcn);
+      assert (gfcn != 0);
+      // case of gradient
+      FunctionMinimum min = Minimizer().Minimize( *gfcn, fState, fStrategy, maxfcn, toler);
+      fNumCall += min.NFcn();
+      fState = min.UserState();
+      return min;
+   }
+   else {
+      // no gradient
+      FunctionMinimum min = Minimizer().Minimize( *fcn, fState, fStrategy, maxfcn, toler);
+      fNumCall += min.NFcn();
+      fState = min.UserState();
+
+#ifdef DEBUG
+//       std::cout << "Initial MIGRAD state is " << MnUserParameterState( min.States()[0], min.Up(), min.Seed().Trafo() ) << std::endl;
+      std::cout << "State resulting from Migrad. Total Function calls  " << fNumCall  << fState << std::endl;
+      const std::vector<ROOT::Minuit2::MinimumState>& iterationStates =  min.States();
+      std::cout << "Number of iterations " << iterationStates.size() << std::endl;
+      for (unsigned int i = 0; i <  iterationStates.size(); ++i) {
+         //std::cout << iterationStates[i] << std::endl;
+         const ROOT::Minuit2::MinimumState & st =  iterationStates[i];
+         std::cout << "----------> Iteration " << i << std::endl;
+         int pr = std::cout.precision(18);
+         std::cout << "            FVAL = " << st.Fval()
+                   << " Edm = " << st.Edm() << " Nfcn = " << st.NFcn() << std::endl;
+         std::cout.precision(pr);
+         std::cout << "            Error matrix change = " << st.Error().Dcovar()
+                   << std::endl;
+         std::cout << "            Internal parameters : ";
+         for (int j = 0; j < st.size() ; ++j)
+            std::cout << " p" << j << " = " << st.Vec()(j);
+         std::cout << std::endl;
+      }
+#endif
+
+      return min;
+   }
+
+}
+
+// facade: forward interface of MnUserParameters and MnUserTransformation
+// via MnUserParameterState
+
+
+const std::vector<MinuitParameter>& MnApplication::MinuitParameters() const {
+   //access to parameters (row-wise)
+   return fState.MinuitParameters();
+}
+//access to parameters and errors in column-wise representation
+std::vector<double> MnApplication::Params() const {return fState.Params();}
+std::vector<double> MnApplication::Errors() const {return fState.Errors();}
+
+
+const MinuitParameter& MnApplication::Parameter(unsigned int i) const {
+   //access to single Parameter
+   return fState.Parameter(i);
+}
+
+
+void MnApplication::Add(const char* name, double val, double err) {
+   //add free Parameter
+   fState.Add(name, val, err);
+}
+
+void MnApplication::Add(const char* name, double val, double err, double low, double up) {
+   //add limited Parameter
+   fState.Add(name, val, err, low, up);
+}
+
+void MnApplication::Add(const char* name, double val) {
+   //add const Parameter
+   fState.Add(name, val);
+}
+
+//interaction via external number of Parameter
+void MnApplication::Fix(unsigned int i) {fState.Fix(i);}
+void MnApplication::Release(unsigned int i) {fState.Release(i);}
+void MnApplication::SetValue(unsigned int i, double val) {
+   // set value for parameter i
+   fState.SetValue(i, val);
+}
+void MnApplication::SetError(unsigned int i, double val) {
+   // set parameter error
+   fState.SetError(i, val);
+}
+void MnApplication::SetLimits(unsigned int i, double low, double up) {
+   // set parameter limits
+   fState.SetLimits(i, low, up);
+}
+void MnApplication::RemoveLimits(unsigned int i) {fState.RemoveLimits(i);}
+
+double MnApplication::Value(unsigned int i) const {return fState.Value(i);}
+double MnApplication::Error(unsigned int i) const {return fState.Error(i);}
+
+//interaction via Name of Parameter
+void MnApplication::Fix(const char* i) {fState.Fix(i);}
+void MnApplication::Release(const char* i) {fState.Release(i);}
+void MnApplication::SetValue(const char* i, double val) {fState.SetValue(i, val);}
+void MnApplication::SetError(const char* i, double val) {fState.SetError(i, val);}
+void MnApplication::SetLimits(const char* i, double low, double up) { fState.SetLimits(i, low, up);}
+void MnApplication::RemoveLimits(const char* i) {fState.RemoveLimits(i);}
+void MnApplication::SetPrecision(double eps) {fState.SetPrecision(eps);}
+
+double MnApplication::Value(const char* i) const {return fState.Value(i);}
+double MnApplication::Error(const char* i) const {return fState.Error(i);}
+
+
+unsigned int MnApplication::Index(const char* name) const {
+   //convert name into external number of Parameter
+   return fState.Index(name);
+}
+
+const char* MnApplication::Name(unsigned int i) const {
+   //convert external number into name of Parameter
+   return fState.Name(i);
+}
+
+
+double MnApplication::Int2ext(unsigned int i, double val) const {
+   // transformation internal -> external
+   return fState.Int2ext(i, val);
+}
+double MnApplication::Ext2int(unsigned int e, double val) const {
+   // transformation external -> internal
+   return fState.Ext2int(e, val);
+}
+unsigned int MnApplication::IntOfExt(unsigned int ext) const {
+   // get internal index for external parameter with index ext
+   return fState.IntOfExt(ext);
+}
+unsigned int MnApplication::ExtOfInt(unsigned int internal) const {
+   // get external index for internal parameter with index internal
+   return fState.ExtOfInt(internal);
+}
+unsigned int MnApplication::VariableParameters() const {
+   // get number of variable parameters
+   return fState.VariableParameters();
+}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnContours.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnContours.cxx
new file mode 100644
index 0000000..690aa2f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnContours.cxx
@@ -0,0 +1,219 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnContours.h"
+#include "Minuit2/MnMinos.h"
+#include "Minuit2/MnMigrad.h"
+#include "Minuit2/MnFunctionCross.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/FCNBase.h"
+#include "Minuit2/MnCross.h"
+#include "Minuit2/MinosError.h"
+#include "Minuit2/ContoursError.h"
+
+#include "Minuit2/MnPrint.h"
+
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+void PrintContourPoint(const std::pair<double,double> & point)  {
+   std::cout << "\t x  = " << point.first << "  y = " << point.second << std::endl;
+}
+
+std::vector<std::pair<double,double> > MnContours::operator()(unsigned int px, unsigned int py, unsigned int npoints) const {
+   // get contour as a pair of (x,y) points passing the parameter index (px, py)  and the number of requested points (>=4)
+   ContoursError cont = Contour(px, py, npoints);
+   return cont();
+}
+
+ContoursError MnContours::Contour(unsigned int px, unsigned int py, unsigned int npoints) const {
+   // calculate the contour passing the parameter index (px, py)  and the number of requested points (>=4)
+   // the fcn.UP() has to be set to the rquired value (see Minuit document on errors)
+   assert(npoints > 3);
+   unsigned int maxcalls = 100*(npoints+5)*(fMinimum.UserState().VariableParameters()+1);
+   unsigned int nfcn = 0;
+
+   std::vector<std::pair<double,double> > result; result.reserve(npoints);
+   std::vector<MnUserParameterState> states;
+   //   double edmmax = 0.5*0.05*fFCN.Up()*1.e-3;
+
+   //double toler = 0.05;
+   double toler = 0.1; // use same defaut value as in Minos
+
+   //get first four points
+   //   std::cout<<"MnContours: get first 4 params."<<std::endl;
+   MnMinos minos(fFCN, fMinimum, fStrategy);
+
+   double valx = fMinimum.UserState().Value(px);
+   double valy = fMinimum.UserState().Value(py);
+
+   MinosError mex = minos.Minos(px);
+   nfcn += mex.NFcn();
+   if(!mex.IsValid()) {
+      MN_ERROR_MSG("MnContours is unable to find first two points.");
+      return ContoursError(px, py, result, mex, mex, nfcn);
+   }
+   std::pair<double,double> ex = mex();
+
+   MinosError mey = minos.Minos(py);
+   nfcn += mey.NFcn();
+   if(!mey.IsValid()) {
+      MN_ERROR_MSG("MnContours is unable to find second two points.");
+      return ContoursError(px, py, result, mex, mey, nfcn);
+   }
+   std::pair<double,double> ey = mey();
+
+   MnMigrad migrad(fFCN, fMinimum.UserState(), MnStrategy(std::max(0, int(fStrategy.Strategy()-1))));
+
+   migrad.Fix(px);
+   migrad.SetValue(px, valx + ex.second);
+   FunctionMinimum exy_up = migrad();
+   nfcn += exy_up.NFcn();
+   if(!exy_up.IsValid()) {
+      MN_ERROR_VAL2("MnContours: unable to find Upper y Value for x Parameter",px);
+      return ContoursError(px, py, result, mex, mey, nfcn);
+   }
+
+   migrad.SetValue(px, valx + ex.first);
+   FunctionMinimum exy_lo = migrad();
+   nfcn += exy_lo.NFcn();
+   if(!exy_lo.IsValid()) {
+      MN_ERROR_VAL2("MnContours: unable to find Lower y Value for x Parameter",px);
+      return ContoursError(px, py, result, mex, mey, nfcn);
+   }
+
+
+   MnMigrad migrad1(fFCN, fMinimum.UserState(), MnStrategy(std::max(0, int(fStrategy.Strategy()-1))));
+   migrad1.Fix(py);
+   migrad1.SetValue(py, valy + ey.second);
+   FunctionMinimum eyx_up = migrad1();
+   nfcn += eyx_up.NFcn();
+   if(!eyx_up.IsValid()) {
+      MN_ERROR_VAL2("MnContours: unable to find Upper x Value for y Parameter",py);
+      return ContoursError(px, py, result, mex, mey, nfcn);
+   }
+
+   migrad1.SetValue(py, valy + ey.first);
+   FunctionMinimum eyx_lo = migrad1();
+   nfcn += eyx_lo.NFcn();
+   if(!eyx_lo.IsValid()) {
+      MN_ERROR_VAL2("MnContours: unable to find Lower x Value for y Parameter",py);
+      return ContoursError(px, py, result, mex, mey, nfcn);
+   }
+
+   double scalx = 1./(ex.second - ex.first);
+   double scaly = 1./(ey.second - ey.first);
+
+   result.push_back(std::pair<double,double>(valx + ex.first, exy_lo.UserState().Value(py)));
+   result.push_back(std::pair<double,double>(eyx_lo.UserState().Value(px), valy + ey.first));
+   result.push_back(std::pair<double,double>(valx + ex.second, exy_up.UserState().Value(py)));
+   result.push_back(std::pair<double,double>(eyx_up.UserState().Value(px), valy + ey.second));
+
+
+   MnUserParameterState upar = fMinimum.UserState();
+
+   //   std::cout<<"MnContours: first 4 params finished."<<std::endl;
+   int printLevel = MnPrint::Level();
+
+   if (printLevel > 0 ) {
+      std::cout << "MnContour : List of found points " << std::endl;
+      std::cout << "\t Parameter x is " << upar.Name(px) << std::endl;
+      std::cout << "\t Parameter y is " << upar.Name(py) << std::endl;
+   }
+
+   if (printLevel > 0) {
+      for (unsigned int i = 0; i < 4; ++i)
+         PrintContourPoint(result[i] );
+   }
+
+   upar.Fix(px);
+   upar.Fix(py);
+
+   std::vector<unsigned int> par(2); par[0] = px; par[1] = py;
+   MnFunctionCross cross(fFCN, upar, fMinimum.Fval(), fStrategy);
+
+   for(unsigned int i = 4; i < npoints; i++) {
+
+      std::vector<std::pair<double,double> >::iterator idist1 = result.end()-1;
+      std::vector<std::pair<double,double> >::iterator idist2 = result.begin();
+      double dx = idist1->first - (idist2)->first;
+      double dy = idist1->second - (idist2)->second;
+      double bigdis = scalx*scalx*dx*dx + scaly*scaly*dy*dy;
+
+      for(std::vector<std::pair<double,double> >::iterator ipair = result.begin(); ipair != result.end()-1; ipair++) {
+         double distx = ipair->first - (ipair+1)->first;
+         double disty = ipair->second - (ipair+1)->second;
+         double dist = scalx*scalx*distx*distx + scaly*scaly*disty*disty;
+         if(dist > bigdis) {
+            bigdis = dist;
+            idist1 = ipair;
+            idist2 = ipair+1;
+         }
+      }
+
+      double a1 = 0.5;
+      double a2 = 0.5;
+      double sca = 1.;
+
+L300:
+
+      if(nfcn > maxcalls) {
+         MN_ERROR_MSG("MnContours: maximum number of function calls exhausted.");
+         return ContoursError(px, py, result, mex, mey, nfcn);
+      }
+
+      double xmidcr = a1*idist1->first + a2*(idist2)->first;
+      double ymidcr = a1*idist1->second + a2*(idist2)->second;
+      double xdir = (idist2)->second - idist1->second;
+      double ydir = idist1->first - (idist2)->first;
+      double scalfac = sca*std::max(fabs(xdir*scalx), fabs(ydir*scaly));
+      double xdircr = xdir/scalfac;
+      double ydircr = ydir/scalfac;
+      std::vector<double> pmid(2); pmid[0] = xmidcr; pmid[1] = ymidcr;
+      std::vector<double> pdir(2); pdir[0] = xdircr; pdir[1] = ydircr;
+
+      MnCross opt = cross(par, pmid, pdir, toler, maxcalls);
+      nfcn += opt.NFcn();
+      if(!opt.IsValid()) {
+         //       if(a1 > 0.5) {
+         if(sca < 0.) {
+            MN_ERROR_VAL2("MnContours : unable to find point on Contour",i+1);
+            MN_ERROR_VAL2("MnContours : found  only i points",i);
+            return ContoursError(px, py, result, mex, mey, nfcn);
+         }
+         //       a1 = 0.75;
+         //       a2 = 0.25;
+         //       std::cout<<"*****switch direction"<<std::endl;
+         sca = -1.;
+         goto L300;
+         }
+      double aopt = opt.Value();
+      if(idist2 == result.begin()) {
+         result.push_back(std::pair<double,double>(xmidcr+(aopt)*xdircr, ymidcr + (aopt)*ydircr));
+         if (printLevel > 0) PrintContourPoint( result.back() );
+      }
+      else {
+         result.insert(idist2, std::pair<double,double>(xmidcr+(aopt)*xdircr, ymidcr + (aopt)*ydircr));
+         if (printLevel > 0) PrintContourPoint( *idist2 );
+      }
+   }
+   if (printLevel >0)
+      std::cout << "MnContour: Number of contour points = " << result.size() << std::endl;
+
+   return ContoursError(px, py, result, mex, mey, nfcn);
+}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnCovarianceSqueeze.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnCovarianceSqueeze.cxx
new file mode 100644
index 0000000..4ce7b62
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnCovarianceSqueeze.cxx
@@ -0,0 +1,112 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnCovarianceSqueeze.h"
+#include "Minuit2/MnUserCovariance.h"
+#include "Minuit2/MinimumError.h"
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnUserCovariance MnCovarianceSqueeze::operator()(const MnUserCovariance& cov, unsigned int n) const {
+   // squeeze MnUserCovariance class
+   // MnUserCovariance contasins the error matrix. Need to invert first to get the hessian, then
+   // after having squuezed the hessian, need to invert again to get the new error matrix
+   assert(cov.Nrow() > 0);
+   assert(n < cov.Nrow());
+
+   MnAlgebraicSymMatrix hess(cov.Nrow());
+   for(unsigned int i = 0; i < cov.Nrow(); i++) {
+      for(unsigned int j = i; j < cov.Nrow(); j++) {
+         hess(i,j) = cov(i,j);
+      }
+   }
+
+   int ifail = Invert(hess);
+
+   if(ifail != 0) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnUserCovariance inversion failed; return diagonal matrix;");
+#endif
+      MnUserCovariance result(cov.Nrow() - 1);
+      for(unsigned int i = 0, j =0; i < cov.Nrow(); i++) {
+         if(i == n) continue;
+         result(j,j) = cov(i,i);
+         j++;
+      }
+      return result;
+   }
+
+   MnAlgebraicSymMatrix squeezed = (*this)(hess, n);
+
+   ifail = Invert(squeezed);
+   if(ifail != 0) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnUserCovariance back-inversion failed; return diagonal matrix;");
+#endif
+      MnUserCovariance result(squeezed.Nrow());
+      for(unsigned int i = 0; i < squeezed.Nrow(); i++) {
+         result(i,i) = 1./squeezed(i,i);
+      }
+      return result;
+   }
+
+   return MnUserCovariance(std::vector<double>(squeezed.Data(), squeezed.Data() + squeezed.size()), squeezed.Nrow());
+}
+
+MinimumError MnCovarianceSqueeze::operator()(const MinimumError& err, unsigned int n) const {
+   // squueze the minimum error class
+   // Remove index-row on the Hessian matrix and the get the new correct error matrix
+   // (inverse of new Hessian)
+   MnAlgebraicSymMatrix hess = err.Hessian();
+   MnAlgebraicSymMatrix squeezed = (*this)(hess, n);
+   int ifail = Invert(squeezed);
+   if(ifail != 0) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnCovarianceSqueeze: MinimumError inversion fails; return diagonal matrix.");
+#endif
+      MnAlgebraicSymMatrix tmp(squeezed.Nrow());
+      for(unsigned int i = 0; i < squeezed.Nrow(); i++) {
+         tmp(i,i) = 1./squeezed(i,i);
+      }
+      return MinimumError(tmp, MinimumError::MnInvertFailed());
+   }
+
+   return MinimumError(squeezed, err.Dcovar());
+}
+
+MnAlgebraicSymMatrix MnCovarianceSqueeze::operator()(const MnAlgebraicSymMatrix& hess, unsigned int n) const {
+   // squueze a symmetrix matrix (remove entire row and column n)
+   assert(hess.Nrow() > 0);
+   assert(n < hess.Nrow());
+
+   MnAlgebraicSymMatrix hs(hess.Nrow() - 1);
+   for(unsigned int i = 0, j = 0; i < hess.Nrow(); i++) {
+      if(i == n) continue;
+      for(unsigned int k = i, l = j; k < hess.Nrow(); k++) {
+         if(k == n) continue;
+         hs(j,l) = hess(i,k);
+         l++;
+      }
+      j++;
+   }
+
+   return hs;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnEigen.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnEigen.cxx
new file mode 100644
index 0000000..42625dd
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnEigen.cxx
@@ -0,0 +1,37 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnEigen.h"
+#include "Minuit2/MnUserCovariance.h"
+#include "Minuit2/MnMatrix.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+LAVector eigenvalues(const LASymMatrix&);
+
+std::vector<double> MnEigen::operator()(const MnUserCovariance& covar) const {
+   // wrapper to calculate eigenvalues of the covariance matrix using mneigen function
+
+   LASymMatrix cov(covar.Nrow());
+   for(unsigned int i = 0; i < covar.Nrow(); i++)
+      for(unsigned int j = i; j < covar.Nrow(); j++)
+         cov(i,j) = covar(i,j);
+
+   LAVector eigen = eigenvalues(cov);
+
+   std::vector<double> result(eigen.Data(), eigen.Data()+covar.Nrow());
+   return result;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFcn.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFcn.cxx
new file mode 100644
index 0000000..769fd70
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFcn.cxx
@@ -0,0 +1,39 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/FCNBase.h"
+#include "Minuit2/MnVectorTransform.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnFcn::~MnFcn() {
+   //   std::cout<<"Total number of calls to FCN: "<<fNumCall<<std::endl;
+}
+
+double MnFcn::operator()(const MnAlgebraicVector& v) const {
+   // evaluate FCN converting from from MnAlgebraicVector to std::vector
+   fNumCall++;
+   return fFCN(MnVectorTransform()(v));
+}
+
+// double MnFcn::operator()(const std::vector<double>& par) const {
+//     return fFCN(par);
+// }
+
+double MnFcn::ErrorDef() const {return fFCN.Up();}
+
+double MnFcn::Up() const {return fFCN.Up();}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFumiliMinimize.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFumiliMinimize.cxx
new file mode 100644
index 0000000..b102c82
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFumiliMinimize.cxx
@@ -0,0 +1,38 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnFumiliMinimize.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/FumiliMinimizer.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+
+
+FunctionMinimum MnFumiliMinimize::operator()(unsigned int maxfcn, double toler) {
+   // minimize using Fumili
+   // need to reimplement otherwise base class method is done
+
+   assert(fState.IsValid());
+   unsigned int npar = VariableParameters();
+   //   assert(npar > 0);
+   if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
+   FunctionMinimum min = Minimizer().Minimize( Fcnbase(), fState, fStrategy, maxfcn, toler);
+   fNumCall += min.NFcn();
+   fState = min.UserState();
+   return min;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFunctionCross.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFunctionCross.cxx
new file mode 100644
index 0000000..a285fc7
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnFunctionCross.cxx
@@ -0,0 +1,503 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnFunctionCross.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnMigrad.h"
+#include "Minuit2/FCNBase.h"
+#include "Minuit2/MnParabola.h"
+#include "Minuit2/MnParabolaPoint.h"
+#include "Minuit2/MnParabolaFactory.h"
+#include "Minuit2/MnCross.h"
+#include "Minuit2/MnMachinePrecision.h"
+
+//#define DEBUG
+#include "Minuit2/MnPrint.h"
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+MnCross MnFunctionCross::operator()(const std::vector<unsigned int>& par, const std::vector<double>& pmid,
+                                    const std::vector<double>& pdir, double tlr, unsigned int maxcalls) const {
+   // evaluate crossing point where function is equal to MIN + UP,
+   // with direction pdir from values pmid
+   // tlr indicate tolerance and maxcalls maximum number of calls
+
+//   double edmmax = 0.5*0.001*toler*fFCN.Up();
+
+
+   unsigned int npar = par.size();
+   unsigned int nfcn = 0;
+   const MnMachinePrecision& prec = fState.Precision();
+   // tolerance used when calling Migrad
+   double mgr_tlr = 0.5 * tlr;   // to be consistent with F77 version (for default values of tlr which is 0.1)
+   // other olerance values are fixed at 0.01
+   tlr = 0.01;
+   // convergence when F is within tlf of aim and next prediction
+   // of aopt is within tla of previous value of aopt
+   double up = fFCN.Up();
+   // for finding the point :
+   double tlf = tlr*up;
+   double tla = tlr;
+   unsigned int maxitr = 15;
+   unsigned int ipt = 0;
+   double aminsv = fFval;
+   double aim = aminsv + up;
+   //std::cout<<"aim= "<<aim<<std::endl;
+   double aopt = 0.;
+   bool limset = false;
+   std::vector<double> alsb(3, 0.), flsb(3, 0.);
+
+   int printLevel = MnPrint::Level();
+
+
+#ifdef DEBUG
+   std::cout<<"MnFunctionCross for parameter  "<<par.front()<< "fmin = " << aminsv
+            << " contur value aim = (fmin + up) = " << aim << std::endl;
+#endif
+
+
+   // find the largest allowed aulim
+
+   double aulim = 100.;
+   for(unsigned int i = 0; i < par.size(); i++) {
+      unsigned int kex = par[i];
+      if(fState.Parameter(kex).HasLimits()) {
+         double zmid = pmid[i];
+         double zdir = pdir[i];
+         if(fabs(zdir) < fState.Precision().Eps()) continue;
+         //       double zlim = 0.;
+         if(zdir > 0. && fState.Parameter(kex).HasUpperLimit()) {
+            double zlim = fState.Parameter(kex).UpperLimit();
+            aulim = std::min(aulim, (zlim-zmid)/zdir);
+         }
+         else if(zdir < 0. && fState.Parameter(kex).HasLowerLimit()) {
+            double zlim = fState.Parameter(kex).LowerLimit();
+            aulim = std::min(aulim, (zlim-zmid)/zdir);
+         }
+      }
+   }
+
+#ifdef DEBUG
+   std::cout<<"Largest allowed aulim "<< aulim << std::endl;
+#endif
+
+   if(aulim  < aopt+tla) limset = true;
+
+
+   MnMigrad migrad(fFCN, fState, MnStrategy(std::max(0, int(fStrategy.Strategy()-1))));
+
+   for(unsigned int i = 0; i < npar; i++) {
+#ifdef DEBUG
+      std::cout << "MnFunctionCross: Set value for " << par[i] <<  " to " << pmid[i] << std::endl;
+#endif
+      migrad.SetValue(par[i], pmid[i]);
+
+      if (printLevel > 1) {
+         std::cout << "MnFunctionCross: parameter " << i << " set to " << pmid[i] << std::endl;
+      }
+   }
+   // find minimum with respect all the other parameters (n- npar) (npar are the fixed ones)
+
+   FunctionMinimum min0 = migrad(maxcalls, mgr_tlr);
+   nfcn += min0.NFcn();
+
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: after Migrad on n-1  minimum is " << min0 << std::endl;
+#endif
+
+   if(min0.HasReachedCallLimit())
+      return MnCross(min0.UserState(), nfcn, MnCross::CrossFcnLimit());
+   if(!min0.IsValid()) return MnCross(fState, nfcn);
+   if(limset == true && min0.Fval() < aim)
+      return MnCross(min0.UserState(), nfcn, MnCross::CrossParLimit());
+
+   ipt++;
+   alsb[0] = 0.;
+   flsb[0] = min0.Fval();
+   flsb[0] = std::max(flsb[0], aminsv + 0.1*up);
+   aopt = sqrt(up/(flsb[0]-aminsv)) - 1.;
+   if(fabs(flsb[0] - aim) < tlf) return MnCross(aopt, min0.UserState(), nfcn);
+
+   if(aopt > 1.) aopt = 1.;
+   if(aopt < -0.5) aopt = -0.5;
+   limset = false;
+   if(aopt > aulim) {
+      aopt = aulim;
+      limset = true;
+   }
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: flsb[0] = " << flsb[0] << " aopt =  " << aopt  << std::endl;
+#endif
+
+   for(unsigned int i = 0; i < npar; i++) {
+#ifdef DEBUG
+      std::cout << "MnFunctionCross: Set new value for " << par[i] <<  " from " << pmid[i] << " to " << pmid[i] + (aopt)*pdir[i] << " aopt = " << aopt << std::endl;
+#endif
+      migrad.SetValue(par[i], pmid[i] + (aopt)*pdir[i]);
+
+      if (printLevel > 1) {
+         std::cout << "MnFunctionCross: parameter " << i << " set to " << pmid[i] + (aopt)*pdir[i] << std::endl;
+      }
+
+   }
+
+   FunctionMinimum min1 = migrad(maxcalls, mgr_tlr);
+   nfcn += min1.NFcn();
+
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: after Migrad on n-1  minimum is " << min1 << std::endl;
+#endif
+
+   if(min1.HasReachedCallLimit())
+      return MnCross(min1.UserState(), nfcn, MnCross::CrossFcnLimit());
+   if(!min1.IsValid()) return MnCross(fState, nfcn);
+   if(limset == true && min1.Fval() < aim)
+      return MnCross(min1.UserState(), nfcn, MnCross::CrossParLimit());
+
+   ipt++;
+   alsb[1] = aopt;
+   flsb[1] = min1.Fval();
+   double dfda = (flsb[1] - flsb[0])/(alsb[1] - alsb[0]);
+
+#ifdef DEBUG
+   std::cout << "aopt = " << aopt << " min1Val = " << flsb[1] << " dfda = " << dfda << std::endl;
+#endif
+
+
+L300:
+      if(dfda < 0.) {
+         // looking for slope of the right sign
+#ifdef DEBUG
+         std::cout << "MnFunctionCross: dfda < 0 - iterate from " << ipt << " to max of " << maxitr << std::endl;
+#endif
+         // iterate (max times is maxitr) incrementing aopt
+
+         unsigned int maxlk = maxitr - ipt;
+         for(unsigned int it = 0; it < maxlk; it++) {
+            alsb[0] = alsb[1];
+            flsb[0] = flsb[1];
+            // LM: Add + 1, looking at Fortran code it starts from 1 ( see bug #8396)
+            aopt = alsb[0] + 0.2*(it+1);
+            limset = false;
+            if(aopt > aulim) {
+               aopt = aulim;
+               limset = true;
+            }
+            for(unsigned int i = 0; i < npar; i++) {
+#ifdef DEBUG
+      std::cout << "MnFunctionCross: Set new value for " << par[i] <<  " to " << pmid[i] + (aopt)*pdir[i] << " aopt = " << aopt << std::endl;
+#endif
+               migrad.SetValue(par[i], pmid[i] + (aopt)*pdir[i]);
+               if (printLevel > 1) {
+                  std::cout << "MnFunctionCross: parameter " << i << " set to " << pmid[i] + (aopt)*pdir[i] << std::endl;
+               }
+
+            }
+            min1 = migrad(maxcalls, mgr_tlr);
+            nfcn += min1.NFcn();
+
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: after Migrad on n-1  minimum is " << min1 << std::endl;
+   std::cout << "nfcn = " << nfcn << std::endl;
+#endif
+
+            if(min1.HasReachedCallLimit())
+               return MnCross(min1.UserState(), nfcn, MnCross::CrossFcnLimit());
+            if(!min1.IsValid()) return MnCross(fState, nfcn);
+            if(limset == true && min1.Fval() < aim)
+               return MnCross(min1.UserState(), nfcn, MnCross::CrossParLimit());
+            ipt++;
+            alsb[1] = aopt;
+            flsb[1] = min1.Fval();
+            dfda = (flsb[1] - flsb[0])/(alsb[1] - alsb[0]);
+            //       if(dfda > 0.) goto L460;
+
+#ifdef DEBUG
+   std::cout << "aopt = " << aopt << " min1Val = " << flsb[1] << " dfda = " << dfda << std::endl;
+#endif
+
+            if(dfda > 0.) break;
+         }
+         if(ipt > maxitr) return MnCross(fState, nfcn);
+      } //if(dfda < 0.)
+
+L460:
+
+      // dfda > 0: we have two points with the right slope
+
+      aopt = alsb[1] + (aim-flsb[1])/dfda;
+
+#ifdef DEBUG
+      std::cout << "MnFunctionCross: dfda > 0 : aopt = " << aopt << std::endl;
+#endif
+
+   double fdist = std::min(fabs(aim  - flsb[0]), fabs(aim  - flsb[1]));
+   double adist = std::min(fabs(aopt - alsb[0]), fabs(aopt - alsb[1]));
+   tla = tlr;
+   if(fabs(aopt) > 1.) tla = tlr*fabs(aopt);
+   if(adist < tla && fdist < tlf) return MnCross(aopt, min1.UserState(), nfcn);
+   if(ipt > maxitr) return MnCross(fState, nfcn);
+   double bmin = std::min(alsb[0], alsb[1]) - 1.;
+   if(aopt < bmin) aopt = bmin;
+   double bmax = std::max(alsb[0], alsb[1]) + 1.;
+   if(aopt > bmax) aopt = bmax;
+
+   limset = false;
+   if(aopt > aulim) {
+      aopt = aulim;
+      limset = true;
+   }
+
+   for(unsigned int i = 0; i < npar; i++) {
+#ifdef DEBUG
+      std::cout << "MnFunctionCross: Set new value for " << par[i] <<  " from " << pmid[i] << " to " << pmid[i] + (aopt)*pdir[i] << " aopt = " << aopt << std::endl;
+#endif
+      migrad.SetValue(par[i], pmid[i] + (aopt)*pdir[i]);
+      if (printLevel > 1) {
+         std::cout << "MnFunctionCross: parameter " << i << " set to " << pmid[i] + (aopt)*pdir[i] << std::endl;
+      }
+
+   }
+   FunctionMinimum min2 = migrad(maxcalls, mgr_tlr);
+   nfcn += min2.NFcn();
+
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: after Migrad on n-1  minimum is " << min2 << std::endl;
+   std::cout << "nfcn = " << nfcn << std::endl;
+#endif
+
+   if(min2.HasReachedCallLimit())
+      return MnCross(min2.UserState(), nfcn, MnCross::CrossFcnLimit());
+   if(!min2.IsValid()) return MnCross(fState, nfcn);
+   if(limset == true && min2.Fval() < aim)
+      return MnCross(min2.UserState(), nfcn, MnCross::CrossParLimit());
+
+   ipt++;
+   alsb[2] = aopt;
+   flsb[2] = min2.Fval();
+
+   // now we have three points, ask how many < AIM
+
+   double ecarmn = fabs(flsb[2] - aim);
+   double ecarmx = 0.;
+   unsigned int ibest = 2;
+   unsigned int iworst = 0;
+   unsigned int noless = 0;
+
+   for(unsigned int i = 0; i < 3; i++) {
+      double ecart = fabs(flsb[i] - aim);
+      if(ecart > ecarmx) {
+         ecarmx = ecart;
+         iworst = i;
+      }
+      if(ecart < ecarmn) {
+         ecarmn = ecart;
+         ibest = i;
+      }
+      if(flsb[i] < aim) noless++;
+   }
+
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: have three points : nless < aim  = " << noless << " ibest = " << ibest << " iworst = " << iworst << std::endl;
+#endif
+
+   //std::cout<<"480"<<std::endl;
+
+   // at least one on each side of AIM (contour), fit a parabola
+   if(noless == 1 || noless == 2) goto L500;
+   // if all three are above AIM, third point must be the closest to AIM, return it
+   if(noless == 0 && ibest != 2) return MnCross(fState, nfcn);
+   // if all three below and third is not best then the slope has again gone negative,
+   // re-iterate and look for positive slope
+   if(noless == 3 && ibest != 2) {
+      alsb[1] = alsb[2];
+      flsb[1] = flsb[2];
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: all three points below - look again fir positive slope " << std::endl;
+#endif
+      goto L300;
+   }
+
+   // in other case new straight line thru first two points
+
+   flsb[iworst] = flsb[2];
+   alsb[iworst] = alsb[2];
+   dfda = (flsb[1] - flsb[0])/(alsb[1] - alsb[0]);
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: new straight line using point 1-2 - dfda =  " << dfda << std::endl;
+#endif
+   goto L460;
+
+L500:
+
+      do {
+         // do parabola fit
+         MnParabola parbol = MnParabolaFactory()(MnParabolaPoint(alsb[0], flsb[0]), MnParabolaPoint(alsb[1], flsb[1]), MnParabolaPoint(alsb[2], flsb[2]));
+         //   aopt = parbol.X_pos(aim);
+         //std::cout<<"alsb1,2,3= "<<alsb[0]<<", "<<alsb[1]<<", "<<alsb[2]<<std::endl;
+         //std::cout<<"flsb1,2,3= "<<flsb[0]<<", "<<flsb[1]<<", "<<flsb[2]<<std::endl;
+
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: parabola fit: iteration " << ipt  << std::endl;
+#endif
+
+         double coeff1 = parbol.C();
+         double coeff2 = parbol.B();
+         double coeff3 = parbol.A();
+         double determ = coeff2*coeff2 - 4.*coeff3*(coeff1 - aim);
+
+#ifdef DEBUG
+         std::cout << "MnFunctionCross: parabola fit: a =  " << coeff3  << " b = "
+                   << coeff2 << " c = " << coeff1 << " determ = " << determ << std::endl;
+#endif
+         // curvature is negative
+         if(determ < prec.Eps()) return MnCross(fState, nfcn);
+         double rt = sqrt(determ);
+         double x1 = (-coeff2 + rt)/(2.*coeff3);
+         double x2 = (-coeff2 - rt)/(2.*coeff3);
+         double s1 = coeff2 + 2.*x1*coeff3;
+         double s2 = coeff2 + 2.*x2*coeff3;
+
+#ifdef DEBUG
+         std::cout << "MnFunctionCross: parabola fit: x1 =  " << x1  << " x2 = "
+                   << x2 << " s1 = " << s1 << " s2 = " << s2 << std::endl;
+#endif
+
+#ifdef WARNINGMSG
+         if(s1*s2 > 0.)   MN_INFO_MSG("MnFunctionCross problem 1");
+#endif
+         // find with root is the right one
+         aopt = x1;
+         double slope = s1;
+         if(s2 > 0.) {
+            aopt = x2;
+            slope = s2;
+         }
+#ifdef DEBUG
+         std::cout << "MnFunctionCross: parabola fit: aopt =  " << aopt  << " slope = "
+                   << slope << std::endl;
+#endif
+
+         // ask if converged
+         tla = tlr;
+         if(fabs(aopt) > 1.) tla = tlr*fabs(aopt);
+
+#ifdef DEBUG
+         std::cout << "MnFunctionCross: Delta(aopt) =  " << fabs(aopt - alsb[ibest])  << " tla = "
+                   << tla << "Delta(F) = " << fabs(flsb[ibest] - aim) << " tlf = " << tlf << std::endl;
+#endif
+
+
+         if(fabs(aopt - alsb[ibest]) < tla && fabs(flsb[ibest] - aim) < tlf)
+            return MnCross(aopt, min2.UserState(), nfcn);
+
+         //     if(ipt > maxitr) return MnCross();
+
+         // see if proposed point is in acceptable zone between L and R
+         // first find ileft, iright, iout and ibest
+
+         unsigned int ileft = 3;
+         unsigned int iright = 3;
+         unsigned int iout = 3;
+         ibest = 0;
+         ecarmx = 0.;
+         ecarmn = fabs(aim-flsb[0]);
+         for(unsigned int i = 0; i < 3; i++) {
+            double ecart = fabs(flsb[i] - aim);
+            if(ecart < ecarmn) {
+               ecarmn = ecart;
+               ibest = i;
+            }
+            if(ecart > ecarmx) ecarmx = ecart;
+            if(flsb[i] > aim) {
+               if(iright == 3) iright = i;
+               else if(flsb[i] > flsb[iright]) iout = i;
+               else {
+                  iout = iright;
+                  iright = i;
+               }
+            } else if(ileft == 3) ileft = i;
+            else if(flsb[i] < flsb[ileft]) iout = i;
+            else {
+               iout = ileft;
+               ileft = i;
+            }
+         }
+
+#ifdef DEBUG
+         std::cout << "MnFunctionCross: ileft =  " << ileft  << " iright = "
+                   << iright << " iout = " << iout << " ibest = " << ibest << std::endl;
+#endif
+
+         // avoid keeping a bad point nest time around
+
+         if(ecarmx > 10.*fabs(flsb[iout] - aim))
+            aopt = 0.5*(aopt + 0.5*(alsb[iright] + alsb[ileft]));
+
+         // knowing ileft and iright, get acceptable window
+         double smalla = 0.1*tla;
+         if(slope*smalla > tlf) smalla = tlf/slope;
+         double aleft = alsb[ileft] + smalla;
+         double aright = alsb[iright] - smalla;
+
+         // move proposed point AOPT into window if necessary
+         if(aopt < aleft) aopt = aleft;
+         if(aopt > aright) aopt = aright;
+         if(aleft > aright) aopt = 0.5*(aleft + aright);
+
+         // see if proposed point outside limits (should be impossible)
+         limset = false;
+         if(aopt > aulim) {
+            aopt = aulim;
+            limset = true;
+         }
+
+         // evaluate at new point aopt
+         for(unsigned int i = 0; i < npar; i++) {
+#ifdef DEBUG
+      std::cout << "MnFunctionCross: Set new value for " << par[i] <<  " from " << pmid[i] << " to " << pmid[i] + (aopt)*pdir[i] << " aopt = " << aopt << std::endl;
+#endif
+            migrad.SetValue(par[i], pmid[i] + (aopt)*pdir[i]);
+            if (printLevel > 1) {
+               std::cout << "MnFunctionCross: parameter " << i << " set to " << pmid[i] + (aopt)*pdir[i] << std::endl;
+            }
+         }
+         min2 = migrad(maxcalls, mgr_tlr);
+         nfcn += min2.NFcn();
+#ifdef DEBUG
+   std::cout << "MnFunctionCross: after Migrad on n-1  minimum is " << min2 << std::endl;
+   std::cout << "nfcn = " << nfcn << std::endl;
+#endif
+
+         if(min2.HasReachedCallLimit())
+            return MnCross(min2.UserState(), nfcn, MnCross::CrossFcnLimit());
+         if(!min2.IsValid()) return MnCross(fState, nfcn);
+         if(limset == true && min2.Fval() < aim)
+            return MnCross(min2.UserState(), nfcn, MnCross::CrossParLimit());
+
+         ipt++;
+         // replace odd point with new one (which is the best of three)
+         alsb[iout] = aopt;
+         flsb[iout] = min2.Fval();
+         ibest = iout;
+      } while(ipt < maxitr);
+
+   // goto L500;
+
+   return MnCross(fState, nfcn);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnGlobalCorrelationCoeff.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnGlobalCorrelationCoeff.cxx
new file mode 100644
index 0000000..c0f4ad0
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnGlobalCorrelationCoeff.cxx
@@ -0,0 +1,47 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnGlobalCorrelationCoeff.h"
+#include <cmath>
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnGlobalCorrelationCoeff::MnGlobalCorrelationCoeff(const MnAlgebraicSymMatrix& cov) : fGlobalCC(std::vector<double>()), fValid(true) {
+   // constructor: calculate global correlation given a symmetric matrix
+
+   MnAlgebraicSymMatrix inv(cov);
+   int ifail = Invert(inv);
+   if(ifail != 0) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnGlobalCorrelationCoeff: inversion of matrix fails.");
+#endif
+      fValid = false;
+   } else {
+
+      unsigned int n = cov.Nrow();
+      fGlobalCC.reserve(n);
+      for(unsigned int i = 0; i < n; i++) {
+         double denom = inv(i,i)*cov(i,i);
+         if(denom < 1. && denom > 0.) fGlobalCC.push_back(0.);
+         else fGlobalCC.push_back(std::sqrt(1. - 1./denom));
+      }
+   }
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnHesse.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnHesse.cxx
new file mode 100644
index 0000000..1d1704d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnHesse.cxx
@@ -0,0 +1,446 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnHesse.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnUserFcn.h"
+#include "Minuit2/FCNBase.h"
+#include "Minuit2/MnPosDef.h"
+#include "Minuit2/HessianGradientCalculator.h"
+#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/InitialGradientCalculator.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/VariableMetricEDMEstimator.h"
+#include "Minuit2/FunctionMinimum.h"
+
+//#define DEBUG
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+#if defined(DEBUG) && !defined(WARNINGMSG)
+#define WARNINGMSG
+#endif
+
+#include "Minuit2/MPIProcess.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnUserParameterState MnHesse::operator()(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int maxcalls) const {
+   // interface from vector of params and errors
+   return (*this)(fcn, MnUserParameterState(par, err), maxcalls);
+}
+
+MnUserParameterState MnHesse::operator()(const FCNBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov,  unsigned int maxcalls) const {
+   // interface from vector of params and covariance
+   return (*this)(fcn, MnUserParameterState(par, cov, nrow), maxcalls);
+}
+
+MnUserParameterState MnHesse::operator()(const FCNBase& fcn, const std::vector<double>& par, const MnUserCovariance& cov, unsigned int maxcalls) const {
+    // interface from vector of params and covariance
+   return (*this)(fcn, MnUserParameterState(par, cov), maxcalls);
+}
+
+MnUserParameterState MnHesse::operator()(const FCNBase& fcn, const MnUserParameters& par, unsigned int maxcalls) const {
+   // interface from MnUserParameters
+   return (*this)(fcn, MnUserParameterState(par), maxcalls);
+}
+
+MnUserParameterState MnHesse::operator()(const FCNBase& fcn, const MnUserParameters& par, const MnUserCovariance& cov, unsigned int maxcalls) const {
+   // interface from MnUserParameters and MnUserCovariance
+   return (*this)(fcn, MnUserParameterState(par, cov), maxcalls);
+}
+
+MnUserParameterState MnHesse::operator()(const FCNBase& fcn, const MnUserParameterState& state, unsigned int maxcalls) const {
+   // interface from MnUserParameterState
+   // create a new Minimum state and use that interface
+   unsigned int n = state.VariableParameters();
+   MnUserFcn mfcn(fcn, state.Trafo(),state.NFcn());
+   MnAlgebraicVector x(n);
+   for(unsigned int i = 0; i < n; i++) x(i) = state.IntParameters()[i];
+   double amin = mfcn(x);
+   Numerical2PGradientCalculator gc(mfcn, state.Trafo(), fStrategy);
+   MinimumParameters par(x, amin);
+   FunctionGradient gra = gc(par);
+   MinimumState tmp = (*this)(mfcn, MinimumState(par, MinimumError(MnAlgebraicSymMatrix(n), 1.), gra, state.Edm(), state.NFcn()), state.Trafo(), maxcalls);
+
+   return MnUserParameterState(tmp, fcn.Up(), state.Trafo());
+}
+
+void MnHesse::operator()(const FCNBase& fcn, FunctionMinimum& min, unsigned int maxcalls) const {
+   // interface from FunctionMinimum to be used after minimization
+   // use last state from the minimization without the need to re-create a new state
+   // do not reset function calls and keep updating them
+   MnUserFcn mfcn(fcn, min.UserState().Trafo(),min.NFcn());
+   MinimumState st = (*this)( mfcn, min.State(), min.UserState().Trafo(), maxcalls);
+   min.Add(st);
+}
+
+MinimumState MnHesse::operator()(const MnFcn& mfcn, const MinimumState& st, const MnUserTransformation& trafo, unsigned int maxcalls) const {
+   // internal interface from MinimumState and MnUserTransformation
+   // Function who does the real Hessian calculations
+
+   const MnMachinePrecision& prec = trafo.Precision();
+   // make sure starting at the right place
+   double amin = mfcn(st.Vec());
+   double aimsag = sqrt(prec.Eps2())*(fabs(amin)+mfcn.Up());
+
+   // diagonal Elements first
+
+   unsigned int n = st.Parameters().Vec().size();
+   if(maxcalls == 0) maxcalls = 200 + 100*n + 5*n*n;
+
+   MnAlgebraicSymMatrix vhmat(n);
+   MnAlgebraicVector g2 = st.Gradient().G2();
+   MnAlgebraicVector gst = st.Gradient().Gstep();
+   MnAlgebraicVector grd = st.Gradient().Grad();
+   MnAlgebraicVector dirin = st.Gradient().Gstep();
+   MnAlgebraicVector yy(n);
+
+
+   // case gradient is not numeric (could be analytical or from FumiliGradientCalculator)
+
+   if(st.Gradient().IsAnalytical()  ) {
+      Numerical2PGradientCalculator igc(mfcn, trafo, fStrategy);
+      FunctionGradient tmp = igc(st.Parameters());
+      gst = tmp.Gstep();
+      dirin = tmp.Gstep();
+      g2 = tmp.G2();
+   }
+
+   MnAlgebraicVector x = st.Parameters().Vec();
+
+#ifdef DEBUG
+   std::cout << "\nMnHesse " << std::endl;
+   std::cout << " x " << x << std::endl;
+   std::cout << " amin " << amin << "  " << st.Fval() << std::endl;
+   std::cout << " grd " << grd << std::endl;
+   std::cout << " gst " << gst << std::endl;
+   std::cout << " g2  " << g2 << std::endl;
+   std::cout << " Gradient is analytical  " << st.Gradient().IsAnalytical() << std::endl;
+#endif
+
+
+   for(unsigned int i = 0; i < n; i++) {
+
+      double xtf = x(i);
+      double dmin = 8.*prec.Eps2()*(fabs(xtf) + prec.Eps2());
+      double d = fabs(gst(i));
+      if(d < dmin) d = dmin;
+
+#ifdef DEBUG
+      std::cout << "\nDerivative parameter  " << i << " d = " << d << " dmin = " << dmin << std::endl;
+#endif
+
+
+      for(unsigned int icyc = 0; icyc < Ncycles(); icyc++) {
+         double sag = 0.;
+         double fs1 = 0.;
+         double fs2 = 0.;
+         for(unsigned int multpy = 0; multpy < 5; multpy++) {
+            x(i) = xtf + d;
+            fs1 = mfcn(x);
+            x(i) = xtf - d;
+            fs2 = mfcn(x);
+            x(i) = xtf;
+            sag = 0.5*(fs1+fs2-2.*amin);
+
+#ifdef DEBUG
+            std::cout << "cycle " << icyc << " mul " << multpy << "\t sag = " << sag << " d = " << d << std::endl;
+#endif
+            //  Now as F77 Minuit - check taht sag is not zero
+            if (sag != 0) goto L30; // break
+            if(trafo.Parameter(i).HasLimits()) {
+               if(d > 0.5) goto L26;
+               d *= 10.;
+               if(d > 0.5) d = 0.51;
+               continue;
+            }
+            d *= 10.;
+         }
+
+L26:
+#ifdef WARNINGMSG
+
+         // get parameter name for i
+         // (need separate scope for avoiding compl error when declaring name)
+         {
+            const char * name = trafo.Name( trafo.ExtOfInt(i));
+            MN_INFO_VAL2("MnHesse: 2nd derivative zero for Parameter ", name);
+            MN_INFO_MSG("MnHesse fails and will return diagonal matrix ");
+         }
+#endif
+
+         for(unsigned int j = 0; j < n; j++) {
+            double tmp = g2(j) < prec.Eps2() ? 1. : 1./g2(j);
+            vhmat(j,j) = tmp < prec.Eps2() ? 1. : tmp;
+         }
+
+         return MinimumState(st.Parameters(), MinimumError(vhmat, MinimumError::MnHesseFailed()), st.Gradient(), st.Edm(), mfcn.NumOfCalls());
+
+L30:
+            double g2bfor = g2(i);
+         g2(i) = 2.*sag/(d*d);
+         grd(i) = (fs1-fs2)/(2.*d);
+         gst(i) = d;
+         dirin(i) = d;
+         yy(i) = fs1;
+         double dlast = d;
+         d = sqrt(2.*aimsag/fabs(g2(i)));
+         if(trafo.Parameter(i).HasLimits()) d = std::min(0.5, d);
+         if(d < dmin) d = dmin;
+
+#ifdef DEBUG
+         std::cout << "\t g1 = " << grd(i) << " g2 = " << g2(i) << " step = " << gst(i) << " d = " << d
+                   << " diffd = " <<  fabs(d-dlast)/d << " diffg2 = " << fabs(g2(i)-g2bfor)/g2(i) << std::endl;
+#endif
+
+
+         // see if converged
+         if(fabs((d-dlast)/d) < Tolerstp()) break;
+         if(fabs((g2(i)-g2bfor)/g2(i)) < TolerG2()) break;
+         d = std::min(d, 10.*dlast);
+         d = std::max(d, 0.1*dlast);
+      }
+      vhmat(i,i) = g2(i);
+      if(mfcn.NumOfCalls()  > maxcalls) {
+
+#ifdef WARNINGMSG
+         //std::cout<<"maxcalls " << maxcalls << " " << mfcn.NumOfCalls() << "  " <<   st.NFcn() << std::endl;
+         MN_INFO_MSG("MnHesse: maximum number of allowed function calls exhausted.");
+         MN_INFO_MSG("MnHesse fails and will return diagonal matrix ");
+#endif
+
+         for(unsigned int j = 0; j < n; j++) {
+            double tmp = g2(j) < prec.Eps2() ? 1. : 1./g2(j);
+            vhmat(j,j) = tmp < prec.Eps2() ? 1. : tmp;
+         }
+
+         return MinimumState(st.Parameters(), MinimumError(vhmat, MinimumError::MnHesseFailed()), st.Gradient(), st.Edm(), mfcn.NumOfCalls());
+      }
+
+   }
+
+#ifdef DEBUG
+   std::cout << "\n Second derivatives " << g2 << std::endl;
+#endif
+
+   if(fStrategy.Strategy() > 0) {
+      // refine first derivative
+      HessianGradientCalculator hgc(mfcn, trafo, fStrategy);
+      FunctionGradient gr = hgc(st.Parameters(), FunctionGradient(grd, g2, gst));
+      // update gradient and step values
+      grd = gr.Grad();
+      gst = gr.Gstep();
+   }
+
+   //off-diagonal Elements
+   // initial starting values
+   MPIProcess mpiprocOffDiagonal(n*(n-1)/2,0);
+   unsigned int startParIndexOffDiagonal = mpiprocOffDiagonal.StartElementIndex();
+   unsigned int endParIndexOffDiagonal = mpiprocOffDiagonal.EndElementIndex();
+
+   unsigned int offsetVect = 0;
+   for (unsigned int in = 0; in<startParIndexOffDiagonal; in++)
+      if ((in+offsetVect)%(n-1)==0) offsetVect += (in+offsetVect)/(n-1);
+
+   for (unsigned int in = startParIndexOffDiagonal;
+        in<endParIndexOffDiagonal; in++) {
+
+      int i = (in+offsetVect)/(n-1);
+      if ((in+offsetVect)%(n-1)==0) offsetVect += i;
+      int j = (in+offsetVect)%(n-1)+1;
+
+      if ((i+1)==j || in==startParIndexOffDiagonal)
+         x(i) += dirin(i);
+
+      x(j) += dirin(j);
+
+      double fs1 = mfcn(x);
+      double elem = (fs1 + amin - yy(i) - yy(j))/(dirin(i)*dirin(j));
+      vhmat(i,j) = elem;
+
+      x(j) -= dirin(j);
+
+      if (j%(n-1)==0 || in==endParIndexOffDiagonal-1)
+         x(i) -= dirin(i);
+
+   }
+
+   mpiprocOffDiagonal.SyncSymMatrixOffDiagonal(vhmat);
+
+   //verify if matrix pos-def (still 2nd derivative)
+
+#ifdef DEBUG
+   std::cout << "Original error matrix " << vhmat << std::endl;
+#endif
+
+   MinimumError tmpErr = MnPosDef()(MinimumError(vhmat,1.), prec);
+
+#ifdef DEBUG
+   std::cout << "Original error matrix " << vhmat << std::endl;
+#endif
+
+   vhmat = tmpErr.InvHessian();
+
+#ifdef DEBUG
+   std::cout << "PosDef error matrix " << vhmat << std::endl;
+#endif
+
+
+   int ifail = Invert(vhmat);
+   if(ifail != 0) {
+
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnHesse: matrix inversion fails!");
+      MN_INFO_MSG("MnHesse fails and will return diagonal matrix.");
+#endif
+
+      MnAlgebraicSymMatrix tmpsym(vhmat.Nrow());
+      for(unsigned int j = 0; j < n; j++) {
+         double tmp = g2(j) < prec.Eps2() ? 1. : 1./g2(j);
+         tmpsym(j,j) = tmp < prec.Eps2() ? 1. : tmp;
+      }
+
+      return MinimumState(st.Parameters(), MinimumError(tmpsym, MinimumError::MnInvertFailed()), st.Gradient(), st.Edm(), mfcn.NumOfCalls());
+   }
+
+   FunctionGradient gr(grd, g2, gst);
+   VariableMetricEDMEstimator estim;
+
+   // if matrix is made pos def returns anyway edm
+   if(tmpErr.IsMadePosDef()) {
+      MinimumError err(vhmat, MinimumError::MnMadePosDef() );
+      double edm = estim.Estimate(gr, err);
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnHesse: matrix was forced pos. def. ");
+#endif
+      return MinimumState(st.Parameters(), err, gr, edm, mfcn.NumOfCalls());
+   }
+
+   //calculate edm for good errors
+   MinimumError err(vhmat, 0.);
+   double edm = estim.Estimate(gr, err);
+
+#ifdef DEBUG
+   std::cout << "\nHesse is ACCURATE. New state from MnHesse " << std::endl;
+   std::cout << "Gradient " << grd << std::endl;
+   std::cout << "Second Deriv " << g2 << std::endl;
+   std::cout << "Gradient step " << gst << std::endl;
+   std::cout << "Error  " << vhmat  << std::endl;
+   std::cout << "edm  " << edm  << std::endl;
+#endif
+
+
+   return MinimumState(st.Parameters(), err, gr, edm, mfcn.NumOfCalls());
+}
+
+/*
+ MinimumError MnHesse::Hessian(const MnFcn& mfcn, const MinimumState& st, const MnUserTransformation& trafo) const {
+
+    const MnMachinePrecision& prec = trafo.Precision();
+    // make sure starting at the right place
+    double amin = mfcn(st.Vec());
+    //   if(fabs(amin - st.Fval()) > prec.Eps2()) std::cout<<"function Value differs from amin  by "<<amin - st.Fval()<<std::endl;
+
+    double aimsag = sqrt(prec.Eps2())*(fabs(amin)+mfcn.Up());
+
+    // diagonal Elements first
+
+    unsigned int n = st.Parameters().Vec().size();
+    MnAlgebraicSymMatrix vhmat(n);
+    MnAlgebraicVector g2 = st.Gradient().G2();
+    MnAlgebraicVector gst = st.Gradient().Gstep();
+    MnAlgebraicVector grd = st.Gradient().Grad();
+    MnAlgebraicVector dirin = st.Gradient().Gstep();
+    MnAlgebraicVector yy(n);
+    MnAlgebraicVector x = st.Parameters().Vec();
+
+    for(unsigned int i = 0; i < n; i++) {
+
+       double xtf = x(i);
+       double dmin = 8.*prec.Eps2()*fabs(xtf);
+       double d = fabs(gst(i));
+       if(d < dmin) d = dmin;
+       for(int icyc = 0; icyc < Ncycles(); icyc++) {
+          double sag = 0.;
+          double fs1 = 0.;
+          double fs2 = 0.;
+          for(int multpy = 0; multpy < 5; multpy++) {
+             x(i) = xtf + d;
+             fs1 = mfcn(x);
+             x(i) = xtf - d;
+             fs2 = mfcn(x);
+             x(i) = xtf;
+             sag = 0.5*(fs1+fs2-2.*amin);
+             if(sag > prec.Eps2()) break;
+             if(trafo.Parameter(i).HasLimits()) {
+                if(d > 0.5) {
+                   std::cout<<"second derivative zero for Parameter "<<i<<std::endl;
+                   std::cout<<"return diagonal matrix "<<std::endl;
+                   for(unsigned int j = 0; j < n; j++) {
+                      vhmat(j,j) = (g2(j) < prec.Eps2() ? 1. : 1./g2(j));
+                      return MinimumError(vhmat, 1., false);
+                   }
+                }
+                d *= 10.;
+                if(d > 0.5) d = 0.51;
+                continue;
+             }
+             d *= 10.;
+          }
+          if(sag < prec.Eps2()) {
+             std::cout<<"MnHesse: internal loop exhausted, return diagonal matrix."<<std::endl;
+             for(unsigned int i = 0; i < n; i++)
+                vhmat(i,i) = (g2(i) < prec.Eps2() ? 1. : 1./g2(i));
+             return MinimumError(vhmat, 1., false);
+          }
+          double g2bfor = g2(i);
+          g2(i) = 2.*sag/(d*d);
+          grd(i) = (fs1-fs2)/(2.*d);
+          gst(i) = d;
+          dirin(i) = d;
+          yy(i) = fs1;
+          double dlast = d;
+          d = sqrt(2.*aimsag/fabs(g2(i)));
+          if(trafo.Parameter(i).HasLimits()) d = std::min(0.5, d);
+          if(d < dmin) d = dmin;
+
+          // see if converged
+          if(fabs((d-dlast)/d) < Tolerstp()) break;
+          if(fabs((g2(i)-g2bfor)/g2(i)) < TolerG2()) break;
+          d = std::min(d, 10.*dlast);
+          d = std::max(d, 0.1*dlast);
+       }
+       vhmat(i,i) = g2(i);
+    }
+
+    //off-diagonal Elements
+    for(unsigned int i = 0; i < n; i++) {
+       x(i) += dirin(i);
+       for(unsigned int j = i+1; j < n; j++) {
+          x(j) += dirin(j);
+          double fs1 = mfcn(x);
+          double elem = (fs1 + amin - yy(i) - yy(j))/(dirin(i)*dirin(j));
+          vhmat(i,j) = elem;
+          x(j) -= dirin(j);
+       }
+       x(i) -= dirin(i);
+    }
+
+    return MinimumError(vhmat, 0.);
+ }
+ */
+
+  }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnLineSearch.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnLineSearch.cxx
new file mode 100644
index 0000000..246e2ad
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnLineSearch.cxx
@@ -0,0 +1,864 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnLineSearch.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MnParabola.h"
+#include "Minuit2/MnParabolaPoint.h"
+#include "Minuit2/MnParabolaFactory.h"
+#include "Minuit2/LaSum.h"
+
+#include <iostream>
+#include "Minuit2/MnPrint.h"
+#include <algorithm>
+
+#ifdef USE_OTHER_LS
+
+#include "Math/SMatrix.h"
+#include "Math/SVector.h"
+
+#include "Math/IFunction.h"
+#include "Math/Minimizer1D.h"
+
+#endif
+
+//#define DEBUG
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/**  Perform a line search from position defined by the vector st
+       along the direction step, where the length of vector step
+       gives the expected position of Minimum.
+       fcn is Value of function at the starting position ,
+       gdel (if non-zero) is df/dx along step at st.
+       Return a parabola point containing Minimum x position and y (function Value)
+    - add a falg to control the debug
+*/
+
+MnParabolaPoint MnLineSearch::operator()(const MnFcn& fcn, const MinimumParameters& st, const MnAlgebraicVector& step, double gdel, const MnMachinePrecision& prec, bool debug) const {
+
+   //*-*-*-*-*-*-*-*-*-*Perform a line search from position st along step   *-*-*-*-*-*-*-*
+   //*-*                =========================================
+   //*-* SLAMBG and ALPHA control the maximum individual steps allowed.
+   //*-* The first step is always =1. The max length of second step is SLAMBG.
+   //*-* The max size of subsequent steps is the maximum previous successful
+   //*-*   step multiplied by ALPHA + the size of most recent successful step,
+   //*-*   but cannot be smaller than SLAMBG.
+   //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+#ifdef DEBUG
+   debug = true;
+#endif
+
+   if (debug) {
+      std::cout<<"gdel= "<<gdel<<std::endl;
+      std::cout<<"step= "<<step<<std::endl;
+   }
+
+   double overal = 1000.;
+   double undral = -100.;
+   double toler = 0.05;
+   double slamin = 0.;
+   double slambg = 5.;
+   double alpha = 2.;
+   int maxiter = 12;
+   // start as in Fortran from 1 and count all the time we evaluate the function
+   int niter = 1;
+
+   for(unsigned int i = 0; i < step.size(); i++) {
+      if(step(i) == 0 )  continue;
+      double ratio = fabs(st.Vec()(i)/step(i));
+      if( slamin == 0) slamin = ratio;
+      if(ratio < slamin) slamin = ratio;
+   }
+   if(fabs(slamin) < prec.Eps()) slamin = prec.Eps();
+   slamin *= prec.Eps2();
+
+   double f0 = st.Fval();
+   double f1 = fcn(st.Vec()+step);
+   niter++;
+   double fvmin = st.Fval();
+   double xvmin = 0.;
+
+   if(f1 < f0) {
+      fvmin = f1;
+      xvmin = 1.;
+   }
+   double toler8 = toler;
+   double slamax = slambg;
+   double flast = f1;
+   double slam = 1.;
+
+   bool iterate = false;
+   MnParabolaPoint p0(0., f0);
+   MnParabolaPoint p1(slam, flast);
+   double f2 = 0.;
+   // quadratic interpolation using the two points p0,p1 and the slope at p0
+   do {
+      // cut toler8 as function goes up
+      iterate = false;
+      //MnParabola pb = MnParabolaFactory()(p0, gdel, p1);
+
+      if (debug) {
+         //         std::cout<<"pb.Min() = "<<pb.Min()<<std::endl;
+         std::cout<<"flast, f0= "<<flast<<", "<<f0<<std::endl;
+         std::cout<<"flast-f0= "<<flast-f0<<std::endl;
+         std::cout<<"slam= "<<slam<<std::endl;
+      }
+      //     double df = flast-f0;
+      //     if(fabs(df) < prec.Eps2()) {
+      //       if(flast-f0 < 0.) df = -prec.Eps2();
+      //       else df = prec.Eps2();
+      //     }
+      //     std::cout<<"df= "<<df<<std::endl;
+      //     double denom = 2.*(df-gdel*slam)/(slam*slam);
+      double denom = 2.*(flast-f0-gdel*slam)/(slam*slam);
+      if (debug)     std::cout<<"denom= "<<denom<<std::endl;
+      if(denom != 0) {
+         slam =  - gdel/denom;
+      } else {
+         denom = -0.1*gdel;
+         slam = 1.;
+      }
+      if (debug)     std::cout<<"new slam= "<<slam<<std::endl;
+
+
+#ifdef TRY_OPPOSIT_DIR
+      // if is less than zero indicates maximum position. Use then slamax or x = x0 - 2slam + 1
+      bool slamIsNeg = false;
+      double slamNeg = 0;
+#endif
+
+      if(slam < 0.) {
+         if (debug)     std::cout<<"slam is negative- set to   " << slamax << std::endl;
+#ifdef TRY_OPPOSITE_DIR
+         slamNeg = 2*slam -1;
+         slamIsNeg = true;
+         if (debug)     std::cout<<"slam is negative- compare values between  "<< slamNeg << " and  " << slamax << std::endl;
+#endif
+         slam = slamax;
+      }
+      //     std::cout<<"slam= "<<slam<<std::endl;
+      if(slam > slamax) {
+         slam = slamax;
+         if (debug) std::cout << "slam larger than mac value - set to " << slamax << std::endl;
+      }
+
+      if(slam < toler8) {
+         if (debug) std::cout << "slam too small  - set to " << toler8 << std::endl;
+         slam = toler8;
+      }
+      //     std::cout<<"slam= "<<slam<<std::endl;
+      if(slam < slamin) {
+         if (debug) std::cout << "slam smaller than " << slamin << " return " << std::endl;
+         //       std::cout<<"f1, f2= "<<p0.Y()<<", "<<p1.Y()<<std::endl;
+         //       std::cout<<"x1, x2= "<<p0.X()<<", "<<p1.X()<<std::endl;
+         //       std::cout<<"x, f= "<<xvmin<<", "<<fvmin<<std::endl;
+         return MnParabolaPoint(xvmin, fvmin);
+      }
+      if(fabs(slam - 1.) < toler8 && p1.Y() < p0.Y()) {
+         //       std::cout<<"f1, f2= "<<p0.Y()<<", "<<p1.Y()<<std::endl;
+         //       std::cout<<"x1, x2= "<<p0.X()<<", "<<p1.X()<<std::endl;
+         //       std::cout<<"x, f= "<<xvmin<<", "<<fvmin<<std::endl;
+         return MnParabolaPoint(xvmin, fvmin);
+      }
+      if(fabs(slam - 1.) < toler8) slam = 1. + toler8;
+
+      //     if(fabs(gdel) < prec.Eps2() && fabs(denom) < prec.Eps2())
+      //       slam = 1000.;
+      //     MnAlgebraicVector tmp = step;
+      //     tmp *= slam;
+      //     f2 = fcn(st.Vec()+tmp);
+      f2 = fcn(st.Vec() + slam*step);
+
+      niter++; // do as in Minuit (count all func evalu)
+
+#ifdef TRY_OPPOSITE_DIR
+      if (slamIsNeg) {
+         // try alternative in the opposite direction
+         double f2alt = fcn(st.Vec() + slamNeg*step);
+         if (f2alt < f2) {
+            slam = slamNeg;
+            f2 = f2alt;
+            undral += slam;
+         }
+      }
+#endif
+      if(f2 < fvmin) {
+         fvmin = f2;
+         xvmin = slam;
+      }
+      // LM : correct a bug using precision
+      if (fabs( p0.Y() - fvmin) < fabs(fvmin)*prec.Eps() ) {
+         //   if(p0.Y()-prec.Eps() < fvmin && fvmin < p0.Y()+prec.Eps()) {
+         iterate = true;
+         flast = f2;
+         toler8 = toler*slam;
+         overal = slam - toler8;
+         slamax = overal;
+         p1 = MnParabolaPoint(slam, flast);
+         //niter++;
+         }
+      } while(iterate && niter < maxiter);
+   if(niter >= maxiter) {
+      // exhausted max number of iterations
+      return MnParabolaPoint(xvmin, fvmin);
+   }
+
+   if (debug){
+      std::cout<<"after initial 2-point iter: "<<std::endl;
+      std::cout<<"x0, x1, x2= "<<p0.X()<<", "<<p1.X()<<", "<<slam<<std::endl;
+      std::cout<<"f0, f1, f2= "<<p0.Y()<<", "<<p1.Y()<<", "<<f2<<std::endl;
+   }
+
+   MnParabolaPoint p2(slam, f2);
+
+   // do now the quadratic interpolation with 3 points
+   do {
+      slamax = std::max(slamax, alpha*fabs(xvmin));
+      MnParabola pb = MnParabolaFactory()(p0, p1, p2);
+      if (debug) {
+         std::cout << "\nLS Iteration " << niter << std::endl;
+         std::cout<<"x0, x1, x2= "<<p0.X()<<", "<<p1.X()<<", "<<p2.X() <<std::endl;
+         std::cout<<"f0, f1, f2= "<<p0.Y()<<", "<<p1.Y()<<", "<<p2.Y() <<std::endl;
+         std::cout << "slamax = " << slamax << std::endl;
+         std::cout<<"p2-p0,p1: "<<p2.Y() - p0.Y()<<", "<<p2.Y() - p1.Y()<<std::endl;
+         std::cout<<"a, b, c= "<<pb.A()<<" "<<pb.B()<<" "<<pb.C()<<std::endl;
+      }
+      if(pb.A() < prec.Eps2()) {
+         double slopem = 2.*pb.A()*xvmin + pb.B();
+         if(slopem < 0.) slam = xvmin + slamax;
+         else slam = xvmin - slamax;
+         if (debug) std::cout << "xvmin = " << xvmin << " slopem " << slopem << " slam " << slam << std::endl;
+      } else {
+         slam = pb.Min();
+         //      std::cout<<"pb.Min() slam= "<<slam<<std::endl;
+         if(slam > xvmin + slamax) slam = xvmin + slamax;
+         if(slam < xvmin - slamax) slam = xvmin - slamax;
+      }
+      if(slam > 0.) {
+         if(slam > overal) slam = overal;
+      } else {
+         if(slam < undral) slam = undral;
+      }
+
+      if (debug) {
+         std::cout<<" slam= "<<slam<< " undral " << undral << " overal " << overal << std::endl;
+      }
+
+      double f3 = 0.;
+      do {
+
+         if (debug) std::cout << " iterate on f3- slam  " << niter << " slam = " << slam << " xvmin " << xvmin << std::endl;
+
+         iterate = false;
+         double toler9 = std::max(toler8, fabs(toler8*slam));
+         // min. of parabola at one point
+         if(fabs(p0.X() - slam) < toler9 ||
+            fabs(p1.X() - slam) < toler9 ||
+            fabs(p2.X() - slam) < toler9) {
+            //   std::cout<<"f1, f2, f3= "<<p0.Y()<<", "<<p1.Y()<<", "<<p2.Y()<<std::endl;
+            //   std::cout<<"x1, x2, x3= "<<p0.X()<<", "<<p1.X()<<", "<<p2.X()<<std::endl;
+            //   std::cout<<"x, f= "<<xvmin<<", "<<fvmin<<std::endl;
+            return MnParabolaPoint(xvmin, fvmin);
+         }
+
+         // take the step
+         //       MnAlgebraicVector tmp = step;
+         //       tmp *= slam;
+         f3 = fcn(st.Vec() + slam*step);
+         if (debug) {
+               std::cout<<"f3= "<<f3<<std::endl;
+               std::cout<<"f3-p(2-0).Y()= "<<f3-p2.Y()<<" "<<f3-p1.Y()<<" "<<f3-p0.Y()<<std::endl;
+         }
+         // if latest point worse than all three previous, cut step
+         if(f3 > p0.Y() && f3 > p1.Y() && f3 > p2.Y()) {
+            if (debug) {
+               std::cout<<"f3 worse than all three previous"<<std::endl;
+            }
+            if(slam > xvmin) overal = std::min(overal, slam-toler8);
+            if(slam < xvmin) undral = std::max(undral, slam+toler8);
+            slam = 0.5*(slam + xvmin);
+            if (debug) {
+               std::cout<<"new slam= "<<slam<<std::endl;
+            }
+            iterate = true;
+            niter++;
+         }
+      } while(iterate && niter < maxiter);
+      if(niter >= maxiter) {
+         // exhausted max number of iterations
+         return MnParabolaPoint(xvmin, fvmin);
+      }
+
+      // find worst previous point out of three and replace
+      MnParabolaPoint p3(slam, f3);
+      if(p0.Y() > p1.Y() && p0.Y() > p2.Y()) p0 = p3;
+      else if(p1.Y() > p0.Y() && p1.Y() > p2.Y()) p1 = p3;
+      else p2 = p3;
+      if (debug) std::cout << " f3 " << f3 << " fvmin " << fvmin << " xvmin " << xvmin << std::endl;
+      if(f3 < fvmin) {
+         fvmin = f3;
+         xvmin = slam;
+      } else {
+         if(slam > xvmin) overal = std::min(overal, slam-toler8);
+         if(slam < xvmin) undral = std::max(undral, slam+toler8);
+      }
+
+      niter++;
+   } while(niter < maxiter);
+
+   if (debug) {
+      std::cout<<"f1, f2= "<<p0.Y()<<", "<<p1.Y()<<std::endl;
+      std::cout<<"x1, x2= "<<p0.X()<<", "<<p1.X()<<std::endl;
+      std::cout<<"x, f= "<<xvmin<<", "<<fvmin<<std::endl;
+   }
+   return MnParabolaPoint(xvmin, fvmin);
+
+}
+
+#ifdef USE_OTHER_LS
+
+/**  Perform a line search using a cubic interpolation using x0, x1 , df/dx(x0) and d2/dx(x0) (second derivative)
+     This is used at the beginning when the second derivative is known to be negative
+*/
+
+MnParabolaPoint MnLineSearch::CubicSearch(const MnFcn& fcn, const MinimumParameters& st, const MnAlgebraicVector& step, double gdel, double g2del,  const MnMachinePrecision& prec, bool debug) const {
+
+
+
+   if (debug) {
+      std::cout<<"gdel= "<<gdel<<std::endl;
+      std::cout<<"g2del= "<<g2del<<std::endl;
+      std::cout<<"step= "<<step<<std::endl;
+   }
+
+   // change ot large values
+   double overal = 100.;
+   double undral = -100.;
+   double toler = 0.05;
+   double slamin = 0.;
+   double slambg = 5.;
+   double alpha = 2.;
+
+   for(unsigned int i = 0; i < step.size(); i++) {
+      if(step(i) == 0 )  continue;
+      double ratio = fabs(st.Vec()(i)/step(i));
+      if( slamin == 0) slamin = ratio;
+      if(ratio < slamin) slamin = ratio;
+   }
+   if(fabs(slamin) < prec.Eps()) slamin = prec.Eps();
+   slamin *= prec.Eps2();
+
+   double f0 = st.Fval();
+   double f1 = fcn(st.Vec()+step);
+   double fvmin = st.Fval();
+   double xvmin = 0.;
+   if (debug) std::cout << "f0 " << f0 << "  f1 " << f1 << std::endl;
+
+   if(f1 < f0) {
+      fvmin = f1;
+      xvmin = 1.;
+   }
+   double toler8 = toler;
+   double slamax = slambg;
+   double flast = f1;
+   double slam = 1.;
+
+//    MnParabolaPoint p0(0., f0);
+//    MnParabolaPoint p1(slam, flast);
+
+   ROOT::Math::SMatrix<double, 3> cubicMatrix;
+   ROOT::Math::SVector<double, 3> cubicCoeff;   // cubic coefficients to be found
+   ROOT::Math::SVector<double, 3> bVec;   // cubic coefficients to be found
+   double x0 = 0;
+
+   // cubic interpolation using the two points p0,p1 and the slope at p0 and the second derivative at p0
+
+   // cut toler8 as function goes up
+   double x1 = slam;
+   cubicMatrix(0,0) = (x0*x0*x0 - x1*x1*x1)/3.;
+   cubicMatrix(0,1) = (x0*x0 - x1*x1)/2.;
+   cubicMatrix(0,2) = (x0 - x1);
+   cubicMatrix(1,0) = x0*x0;
+   cubicMatrix(1,1) = x0;
+   cubicMatrix(1,2) = 1;
+   cubicMatrix(2,0) = 2.*x0;
+   cubicMatrix(2,1) = 1;
+   cubicMatrix(2,2) = 0;
+
+   bVec(0) = f0-f1;
+   bVec(1) = gdel;
+   bVec(2) = g2del;
+
+   //if (debug) std::cout << "Matrix:\n " << cubicMatrix << std::endl;
+   if (debug) std::cout << "Vec:\n   " << bVec << std::endl;
+
+   // find the minimum need to invert the matrix
+   if (!cubicMatrix.Invert() ) {
+      std::cout << "Inversion failed - return " << std::endl;
+      return MnParabolaPoint(xvmin, fvmin);
+   }
+
+   cubicCoeff = cubicMatrix * bVec;
+   if (debug) std::cout << "Cubic:\n   " << cubicCoeff << std::endl;
+
+
+   double ddd = cubicCoeff(1)*cubicCoeff(1)-4*cubicCoeff(0)*cubicCoeff(2);  // b**2 - 4ac
+   double slam1, slam2 = 0;
+   // slam1 should be minimum and slam2 the maximum
+   if (cubicCoeff(0) > 0) {
+      slam1 = (- cubicCoeff(1) - std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+      slam2 = (- cubicCoeff(1) + std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+   }
+   else if (cubicCoeff(0) < 0) {
+      slam1 = (- cubicCoeff(1) + std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+      slam2 = (- cubicCoeff(1) - std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+   }
+   else { // case == 0 (-b/c)
+      slam1 = - gdel/g2del;
+      slam2 = slam1;
+   }
+
+   std::cout << "slam1 &  slam 2 " << slam1 << "  " << slam2 << std::endl;
+
+   // this should be the minimum otherwise inversion failed and I should do something else
+
+   if (slam2 < undral) slam2 = undral;
+   if (slam2 > overal) slam2 = overal;
+
+
+   // I am stack somewhere - take a large step
+   if (std::fabs(slam2) < toler) slam2 = ( slam2 >=0 ) ? slamax : -slamax;
+
+
+   std::cout << "try with slam 2 " << slam2 << std::endl;
+
+   double f2 = fcn(st.Vec()+slam2*step);
+
+   std::cout << "try with slam 2 " << slam2 << " f2 " << f2 << std::endl;
+
+   double fp;
+   // use this as new minimum
+   //bool noImpr = false;
+   if (f2 < fvmin) {
+      slam = slam2;
+      xvmin = slam;
+      fvmin = f2;
+      fp = fvmin;
+   } else {
+      // try with slam2 if it is better
+
+      if (slam1 < undral) slam1 = undral;
+      if (slam1 > overal) slam1 = overal;
+
+
+      if (std::fabs(slam1) < toler) slam1 = ( slam1 >=0 ) ? -slamax : slamax;
+
+      double f3 = fcn(st.Vec()+slam1*step);
+
+      std::cout << "try with slam 1 " << slam1 << " f3 " << f3 << std::endl;
+
+      if (f3 < fvmin) {
+         slam = slam1;
+         fp = fvmin;
+         xvmin = slam;
+         fvmin = f3;
+      }  else {
+         // case both f2 and f3 did not produce a better result
+         if (f2 < f3) {
+            slam = slam1;
+            fp = f2;
+         } else {
+            slam = slam2;
+            fp = f3;
+         }
+      }
+   }
+
+   bool iterate2 = false;
+   int niter = 0;
+
+   int maxiter = 10;
+
+   do {
+      iterate2 = false;
+
+      std::cout << "\n iter" << niter << " test approx deriv ad second deriv at " << slam << " fp " << fp << std::endl;
+
+      // estimate grad and second derivative at new point taking a step of 10-3
+      double h = 0.001*slam;
+      double fh = fcn(st.Vec()+(slam+h)*step);
+      double fl = fcn(st.Vec()+(slam-h)*step);
+      double df = (fh-fl)/(2.*h);
+      double df2 = (fh+fl-2.*fp )/(h*h);
+
+      std::cout << "deriv: " << df << " , " << df2 << std::endl;
+
+      // if I am in a point of still negative derivative
+      if ( std::fabs(df ) < prec.Eps() && std::fabs( df2 ) < prec.Eps() ) {
+         // try in opposite direction with an opposite value
+         slam = ( slam >=0 ) ? -slamax : slamax;
+         slamax *= 10;
+         fp = fcn(st.Vec()+slam*step);
+      }
+      else if (  std::fabs(df2 ) <= 0) { // gradient is significative different than zero then redo a cubic interpolation
+                                    // from new point
+
+         return MnParabolaPoint(slam, fp); // should redo a cubic interpol.  ??
+//          niter ++;
+//          if (niter > maxiter) break;
+
+//          MinimumParameters pa = MinimumParameters(st.Vec() + stepNew, fp);
+//          gdel = stepNew(i)
+//          MnParabolaPoint pp = CubicSearch(fcn, st, stepNew, df, df2
+
+
+      }
+
+      else
+         return MnParabolaPoint(slam, fp);
+
+      niter++;
+   } while (niter < maxiter);
+
+   return MnParabolaPoint(xvmin, fvmin);
+
+
+}
+
+
+// class describing Fcn function in one dimension
+      class ProjectedFcn : public ROOT::Math::IGenFunction {
+
+      public:
+
+         ProjectedFcn(const MnFcn & fcn, const MinimumParameters & pa, const MnAlgebraicVector & step) :
+            fFcn(fcn),
+            fPar(pa),
+            fStep(step)
+         {}
+
+
+         ROOT::Math::IGenFunction * Clone() const { return new ProjectedFcn(*this); }
+
+      private:
+
+         double DoEval(double x) const {
+            return fFcn(fPar.Vec() + x*fStep);
+         }
+
+         const MnFcn & fFcn;
+         const MinimumParameters & fPar;
+         const MnAlgebraicVector & fStep;
+      };
+
+
+MnParabolaPoint MnLineSearch::BrentSearch(const MnFcn& fcn, const MinimumParameters& st, const MnAlgebraicVector& step, double gdel, double g2del,  const MnMachinePrecision& prec, bool debug) const {
+
+   if (debug) {
+      std::cout<<"gdel= "<<gdel<<std::endl;
+      std::cout<<"g2del= "<<g2del<<std::endl;
+      for (unsigned int i = 0; i < step.size(); ++i) {
+         if (step(i) != 0) {
+            std::cout<<"step(i)= "<<step(i)<<std::endl;
+            std::cout<<"par(i) "  <<st.Vec()(i) <<std::endl;
+            break;
+         }
+      }
+   }
+
+   ProjectedFcn func(fcn, st, step);
+
+
+// do first a cubic interpolation
+
+   double f0 = st.Fval();
+   double f1 = fcn(st.Vec()+step);
+   f0 = func(0.0);
+   f1 = func(1.);
+   double fvmin = st.Fval();
+   double xvmin = 0.;
+   if (debug) std::cout << "f0 " << f0 << "  f1 " << f1 << std::endl;
+
+   if(f1 < f0) {
+      fvmin = f1;
+      xvmin = 1.;
+   }
+//    double toler8 = toler;
+//    double slamax = slambg;
+//    double flast = f1;
+   double slam = 1.;
+
+   double undral = -1000;
+   double overal = 1000;
+
+   double x0 = 0;
+
+//    MnParabolaPoint p0(0., f0);
+//    MnParabolaPoint p1(slam, flast);
+#ifdef USE_CUBIC
+
+   ROOT::Math::SMatrix<double, 3> cubicMatrix;
+   ROOT::Math::SVector<double, 3> cubicCoeff;   // cubic coefficients to be found
+   ROOT::Math::SVector<double, 3> bVec;   // cubic coefficients to be found
+
+   // cubic interpolation using the two points p0,p1 and the slope at p0 and the second derivative at p0
+
+   // cut toler8 as function goes up
+   double x1 = slam;
+   cubicMatrix(0,0) = (x0*x0*x0 - x1*x1*x1)/3.;
+   cubicMatrix(0,1) = (x0*x0 - x1*x1)/2.;
+   cubicMatrix(0,2) = (x0 - x1);
+   cubicMatrix(1,0) = x0*x0;
+   cubicMatrix(1,1) = x0;
+   cubicMatrix(1,2) = 1;
+   cubicMatrix(2,0) = 2.*x0;
+   cubicMatrix(2,1) = 1;
+   cubicMatrix(2,2) = 0;
+
+   bVec(0) = f0-f1;
+   bVec(1) = gdel;
+   bVec(2) = g2del;
+
+   //if (debug) std::cout << "Matrix:\n " << cubicMatrix << std::endl;
+   if (debug) std::cout << "Vec:\n   " << bVec << std::endl;
+
+   // find the minimum need to invert the matrix
+   if (!cubicMatrix.Invert() ) {
+      std::cout << "Inversion failed - return " << std::endl;
+      return MnParabolaPoint(xvmin, fvmin);
+   }
+
+   cubicCoeff = cubicMatrix * bVec;
+   if (debug) std::cout << "Cubic:\n   " << cubicCoeff << std::endl;
+
+
+   double ddd = cubicCoeff(1)*cubicCoeff(1)-4*cubicCoeff(0)*cubicCoeff(2);  // b**2 - 4ac
+   double slam1, slam2 = 0;
+   // slam1 should be minimum and slam2 the maximum
+   if (cubicCoeff(0) > 0) {
+      slam1 = (- cubicCoeff(1) - std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+      slam2 = (- cubicCoeff(1) + std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+   }
+   else if (cubicCoeff(0) < 0) {
+      slam1 = (- cubicCoeff(1) + std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+      slam2 = (- cubicCoeff(1) - std::sqrt(ddd) ) / ( 2. * cubicCoeff(0) );
+   }
+   else { // case == 0 (-b/c)
+      slam1 = - gdel/g2del;
+      slam2 = slam1;
+   }
+
+   if (slam1 < undral) slam1 = undral;
+   if (slam1 > overal) slam1 = overal;
+
+   if (slam2 < undral) slam2 = undral;
+   if (slam2 > overal) slam2 = overal;
+
+
+   double fs1 = func(slam1);
+   double fs2 = func(slam2);
+   std::cout << "slam1 &  slam 2 " << slam1 << "  " << slam2 << std::endl;
+   std::cout << "f(slam1) &  f(slam 2) " << fs1 << "  " << fs2 << std::endl;
+
+   if (fs1 < fs2) {
+      x0 = slam1;
+      f0 = fs1;
+   }
+   else {
+      x0 = slam2;
+      f0 = fs2;
+   }
+
+#else
+   x0 = xvmin;
+   f0 = fvmin;
+#endif
+
+
+   double astart = 100;
+
+
+  // do a Brent search in a large interval
+   double a = x0 -astart;
+   double b = x0 + astart;
+   //double x0 = 1;
+   int maxiter = 20;
+   double absTol = 0.5;
+   double relTol = 0.05;
+
+   ROOT::Math::Minim1D::Type minType = ROOT::Math::Minim1D::BRENT;
+
+   bool iterate = false;
+   int iter = 0;
+
+   std::cout << "f(0)" << func(0.) << std::endl;
+   std::cout << "f(1)" << func(1.0) << std::endl;
+   std::cout << "f(3)" << func(3.0) << std::endl;
+   std::cout << "f(5)" << func(5.0) << std::endl;
+
+   double fa = func(a);
+   double fb = func(b);
+   //double f0 = func(x0);
+   double toler = 0.01;
+   double delta0 = 5;
+   double delta = delta0;
+   bool enlarge = true;
+   bool scanmin = false;
+   double x2, f2 = 0;
+   double dir = 1;
+   int nreset = 0;
+
+   do {
+
+      std::cout << " iter " << iter << " a , b , x0 " << a << "  " << b << "  x0 " << x0 << std::endl;
+      std::cout << " fa , fb , f0 " << fa << "  " << fb << "  f0 " << f0 << std::endl;
+      if (fa <= f0 || fb  <= f0) {
+         scanmin = false;
+         if (fa < fb) {
+            if (fa < fvmin) {
+               fvmin = fa;
+               xvmin = a;
+            }
+//             double f2 = fa;
+//             double x2 = a;
+            if (enlarge) {
+               x2 = a - 1000;  // move lower
+               f2 = func(x2);
+            }
+            if ( std::fabs ( (fa -f2 )/(a-x2) ) >  toler ) {  //  significant change in f continue to enlarge interval
+               x0 = a;
+               f0 = fa;
+               a = x2;
+               fa = f2;
+               enlarge = true;
+            } else {
+               // move direction of [a
+               // values change a little, start from central point try with x0 = x0 - delta
+               if (nreset == 0) dir = -1;
+               enlarge = false;
+               x0 = x0 + dir * delta;
+               f0 = func(x0);
+               // if reached limit try opposite direction , direction b]
+               if ( std::fabs (( f0 -fa )/(x0 -a) ) <  toler ) {
+                  delta = 10 * delta0/(10.*(nreset+1));  // decrease the delta if still not change observed
+                  a = x0;
+                  fa = f0;
+                  x0 = delta;
+                  f0 = func(x0);
+                  dir *= -1;
+                  nreset++;
+                  std::cout << " A: Done a reset - scan in opposite direction ! " << std::endl;
+               }
+               delta *= 2; // double delta at next iteration
+               if (x0 <  b && x0 > a )
+                  scanmin = true;
+               else {
+                  x0 = 0;
+                  f0 = st.Fval();
+               }
+            }
+         }
+         else {  // fb < fa
+            if (fb < fvmin) {
+               fvmin = fb;
+               xvmin = b;
+            }
+            if (enlarge) {
+               x2 = b + 1000;  // move upper
+               f2 = func(x2);
+            }
+            if ( std::fabs ( (fb -f2 )/(x2-b) ) >  toler ) {  //  significant change in f continue to enlarge interval
+               f0 = fb;
+               x0 = b;
+               b = x2; //
+               fb = f2;
+               enlarge = true;
+            } else {
+               // here move direction b
+               // values change a little, try with x0 = fa + delta
+               if (nreset == 0) dir = 1;
+               enlarge = false;
+               x0 = x0 + dir * delta;
+               f0 = func(x0);
+               // if reached limit try other side
+               if ( std::fabs ( ( f0 -fb )/(x0-b) ) <  toler ) {
+                  delta = 10 * delta0/(10.*(nreset+1));  // decrease the delta if still not change observed
+                  b = x0;
+                  fb = f0;
+                  x0 = -delta;
+                  f0 = func(x0);
+                  dir *= -1;
+                  nreset++;
+                  std::cout << " B: Done a reset - scan in opposite direction ! " << std::endl;
+               }
+               delta *= 2; // double delta at next iteration
+               if (x0 >  a && x0 < b)
+                  scanmin = true;
+               else {
+                  x0 = 0;
+                  f0 = st.Fval();
+               }
+
+            }
+
+         }
+
+         if ( f0 < fvmin) {
+            x0 = xvmin;
+            fvmin = f0;
+         }
+
+         std::cout <<  " new x0 " << x0 << "  " << f0 << std::endl;
+
+         // use golden section
+         iterate = scanmin || enlarge;
+
+      } else {  // x0 is a min of [a,b]
+         iterate = false;
+      }
+
+      iter++;
+   } while (iterate && iter < maxiter );
+
+   if ( f0 > fa || f0 > fb)
+      // skip minim 1d try Minuit LS
+      // return (*this) (fcn, st, step, gdel, prec, debug);
+      return MnParabolaPoint(xvmin, fvmin);
+
+
+
+
+   std::cout << "1D minimization using " << minType << std::endl;
+
+   ROOT::Math::Minimizer1D min(minType);
+
+   min.SetFunction(func,x0, a, b);
+   int ret = min.Minimize(maxiter, absTol, relTol);
+
+   std::cout << "result of GSL 1D minimization: "  << ret << " niter " << min.Iterations() << std::endl;
+   std::cout << " xmin = " << min.XMinimum() << " fmin " << min.FValMinimum() << std::endl;
+
+   return MnParabolaPoint(min.XMinimum(), min.FValMinimum());
+
+}
+
+#endif
+
+
+
+}  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnMachinePrecision.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnMachinePrecision.cxx
new file mode 100644
index 0000000..7ee19f2
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnMachinePrecision.cxx
@@ -0,0 +1,53 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MnTiny.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnMachinePrecision::MnMachinePrecision() :
+   fEpsMac(4.0E-7),
+   fEpsMa2(2.*sqrt(4.0E-7)) {
+
+   //determine machine precision
+   /*
+       char e[] = {"e"};
+       fEpsMac = 8.*dlamch_(e);
+       fEpsMa2 = 2.*sqrt(fEpsMac);
+   */
+
+   //   std::cout<<"machine precision eps: "<<Eps()<<std::endl;
+
+   MnTiny mytiny;
+
+   //calculate machine precision
+   double epstry = 0.5;
+   double epsbak = 0.;
+   volatile double epsp1 = 0.; // allow to run this method with fast-math
+   double one = 1.0;
+   for(int i = 0; i < 100; i++) {
+      epstry *= 0.5;
+      epsp1 = one + epstry;
+      epsbak = mytiny(epsp1);
+      if(epsbak < epstry) {
+         fEpsMac = 8.*epstry;
+         fEpsMa2 = 2.*sqrt(fEpsMac);
+         break;
+      }
+   }
+
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnMinos.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnMinos.cxx
new file mode 100644
index 0000000..611fdd9
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnMinos.cxx
@@ -0,0 +1,294 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnMinos.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/FCNBase.h"
+#include "Minuit2/MnFunctionCross.h"
+#include "Minuit2/MnCross.h"
+#include "Minuit2/MinosError.h"
+
+//#define DEBUG
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnMinos::MnMinos(const FCNBase& fcn, const FunctionMinimum& min, unsigned int stra ) :
+   fFCN(fcn),
+   fMinimum(min),
+   fStrategy(MnStrategy(stra))
+{
+   // construct from FCN + Minimum
+   // check if Error definition  has been changed, in case re-update errors
+   if (fcn.Up() != min.Up() ) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnMinos UP value has changed, need to update FunctionMinimum class");
+#endif
+   }
+}
+
+MnMinos::MnMinos(const FCNBase& fcn, const FunctionMinimum& min,  const MnStrategy& stra) :
+   fFCN(fcn),
+   fMinimum(min),
+   fStrategy(stra)
+{
+   // construct from FCN + Minimum
+   // check if Error definition  has been changed, in case re-update errors
+   if (fcn.Up() != min.Up() ) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnMinos UP value has changed, need to update FunctionMinimum class");
+#endif
+   }
+}
+
+
+std::pair<double,double> MnMinos::operator()(unsigned int par, unsigned int maxcalls, double toler) const {
+   // do Minos analysis given the parameter index returning a pair for (lower,upper) errors
+   MinosError mnerr = Minos(par, maxcalls,toler);
+   return mnerr();
+}
+
+double MnMinos::Lower(unsigned int par, unsigned int maxcalls, double toler) const {
+   // get lower error for parameter par
+   MnUserParameterState upar = fMinimum.UserState();
+   double err = fMinimum.UserState().Error(par);
+
+   MnCross aopt = Loval(par, maxcalls,toler);
+
+   double lower = aopt.IsValid() ? -1.*err*(1.+ aopt.Value()) : (aopt.AtLimit() ? upar.Parameter(par).LowerLimit() : upar.Value(par));
+
+   return lower;
+}
+
+double MnMinos::Upper(unsigned int par, unsigned int maxcalls, double toler) const {
+   // upper error for parameter par
+   MnCross aopt = Upval(par, maxcalls,toler);
+
+   MnUserParameterState upar = fMinimum.UserState();
+   double err = fMinimum.UserState().Error(par);
+
+   double upper = aopt.IsValid() ? err*(1.+ aopt.Value()) : (aopt.AtLimit() ? upar.Parameter(par).UpperLimit() : upar.Value(par));
+
+   return upper;
+}
+
+MinosError MnMinos::Minos(unsigned int par, unsigned int maxcalls, double toler) const {
+   // do full minos error anlysis (lower + upper) for parameter par
+   assert(fMinimum.IsValid());
+   assert(!fMinimum.UserState().Parameter(par).IsFixed());
+   assert(!fMinimum.UserState().Parameter(par).IsConst());
+
+   MnCross up = Upval(par, maxcalls,toler);
+#ifdef DEBUG
+   std::cout << "Function calls to find upper error " << up.NFcn() << std::endl;
+#endif
+
+   MnCross lo = Loval(par, maxcalls,toler);
+
+#ifdef DEBUG
+   std::cout << "Function calls to find lower error " << lo.NFcn() << std::endl;
+#endif
+
+   return MinosError(par, fMinimum.UserState().Value(par), lo, up);
+}
+
+
+MnCross MnMinos::FindCrossValue(int direction, unsigned int par, unsigned int maxcalls, double toler) const {
+   // get crossing value in the parameter direction :
+   // direction = + 1 upper value
+   // direction = -1 lower value
+   // pass now tolerance used for Migrad minimizations
+
+   assert(direction == 1 || direction == -1);
+#ifdef DEBUG
+   if (direction == 1)
+      std::cout << "\n--------- MnMinos --------- \n Determination of positive Minos error for parameter "
+                << par << std::endl;
+   else
+      std::cout << "\n--------- MnMinos --------- \n Determination of positive Minos error for parameter "
+                << par << std::endl;
+#endif
+
+   assert(fMinimum.IsValid());
+   assert(!fMinimum.UserState().Parameter(par).IsFixed());
+   assert(!fMinimum.UserState().Parameter(par).IsConst());
+   if(maxcalls == 0) {
+      unsigned int nvar = fMinimum.UserState().VariableParameters();
+      maxcalls = 2*(nvar+1)*(200 + 100*nvar + 5*nvar*nvar);
+   }
+
+   std::vector<unsigned int> para(1, par);
+
+   MnUserParameterState upar = fMinimum.UserState();
+   double err = direction * upar.Error(par);
+   double val = upar.Value(par) +  err;
+   std::vector<double> xmid(1, val);
+   std::vector<double> xdir(1, err);
+
+   double up = fFCN.Up();
+   unsigned int ind = upar.IntOfExt(par);
+   // get error matrix (methods return a copy)
+   MnAlgebraicSymMatrix m = fMinimum.Error().Matrix();
+   // get internal parameters
+   const MnAlgebraicVector & xt = fMinimum.Parameters().Vec();
+   //LM:  change to use err**2 (m(i,i) instead of err as in F77 version
+   double xunit = sqrt(up/m(ind,ind));
+   // LM (29/04/08) bug: change should be done in internal variables
+   for(unsigned int i = 0; i < m.Nrow(); i++) {
+      if(i == ind) continue;
+      double xdev = xunit*m(ind,i);
+      double xnew = xt(i) + direction *  xdev;
+
+      // transform to external values
+      unsigned int ext = upar.ExtOfInt(i);
+
+      double unew = upar.Int2ext(i, xnew);
+
+#ifdef DEBUG
+      std::cout << "Parameter " << ext << " is set from " << upar.Value(ext) << " to " <<  unew << std::endl;
+#endif
+      upar.SetValue(ext, unew);
+   }
+
+   upar.Fix(par);
+   upar.SetValue(par, val);
+
+#ifdef DEBUG
+   std::cout << "Parameter " << par << " is fixed and set from " << fMinimum.UserState().Value(par) << " to " << val << std::endl;
+#endif
+
+
+   MnFunctionCross cross(fFCN, upar, fMinimum.Fval(), fStrategy);
+   MnCross aopt = cross(para, xmid, xdir, toler, maxcalls);
+
+
+#ifdef DEBUG
+   std::cout<<"----- MnMinos: aopt found from MnFunctionCross = "<<aopt.Value()<<std::endl << std::endl;
+#endif
+
+#ifdef WARNINGMSG
+   const char * par_name = upar.Name(par);
+   if(aopt.AtMaxFcn())
+      MN_INFO_VAL2("MnMinos maximum number of function calls exceeded for Parameter ",par_name);
+   if(aopt.NewMinimum())
+      MN_INFO_VAL2("MnMinos new Minimum found while looking for Parameter ",par_name);
+   if (direction ==1) {
+      if(aopt.AtLimit())
+         MN_INFO_VAL2("MnMinos Parameter is at Upper limit.",par_name);
+      if(!aopt.IsValid())
+         MN_INFO_VAL2("MnMinos could not find Upper Value for Parameter ",par_name);
+   }
+   else {
+      if(aopt.AtLimit())
+         MN_INFO_VAL2("MnMinos Parameter is at Lower limit.",par_name);
+      if(!aopt.IsValid())
+         MN_INFO_VAL2("MnMinos could not find Lower Value for Parameter ",par_name);
+   }
+#endif
+
+   return aopt;
+}
+
+MnCross MnMinos::Upval(unsigned int par, unsigned int maxcalls, double toler) const {
+   // return crossing in the lower parameter direction
+   return FindCrossValue(1,par,maxcalls,toler);
+}
+
+MnCross MnMinos::Loval(unsigned int par, unsigned int maxcalls, double toler) const {
+   // return crossing in the lower parameter direction
+   return FindCrossValue(-1,par,maxcalls,toler);
+}
+
+// #ifdef DEBUG
+//    std::cout << "\n--------- MnMinos --------- \n Determination of negative Minos error for parameter "
+//              << par << std::endl;
+// #endif
+
+//    assert(fMinimum.IsValid());
+//    assert(!fMinimum.UserState().Parameter(par).IsFixed());
+//    assert(!fMinimum.UserState().Parameter(par).IsConst());
+//    if(maxcalls == 0) {
+//       unsigned int nvar = fMinimum.UserState().VariableParameters();
+//       maxcalls = 2*(nvar+1)*(200 + 100*nvar + 5*nvar*nvar);
+//    }
+//    std::vector<unsigned int> para(1, par);
+
+//    MnUserParameterState upar = fMinimum.UserState();
+//    double err = upar.Error(par);
+//    double val = upar.Value(par) - err;
+//    std::vector<double> xmid(1, val);
+//    std::vector<double> xdir(1, -err);
+
+//    double up = fFCN.Up();
+//    unsigned int ind = upar.IntOfExt(par);
+//    MnAlgebraicSymMatrix m = fMinimum.Error().Matrix();
+//    double xunit = sqrt(up/m(ind,ind));
+//    // get internal parameters
+//    const MnAlgebraicVector & xt = fMinimum.Parameters().Vec();
+
+//    for(unsigned int i = 0; i < m.Nrow(); i++) {
+//       if(i == ind) continue;
+//       double xdev = xunit*m(ind,i);
+
+//       double xnew = xt(i) - xdev;
+
+//       // transform to external values
+//       double unew = upar.Int2ext(i, xnew);
+
+//       unsigned int ext = upar.ExtOfInt(i);
+
+// #ifdef DEBUG
+//       std::cout << "Parameter " << ext << " is set from " << upar.Value(ext) << " to " <<  unew << std::endl;
+// #endif
+//       upar.SetValue(ext, unew);
+//    }
+
+//    upar.Fix(par);
+//    upar.SetValue(par, val);
+
+// #ifdef DEBUG
+//    std::cout << "Parameter " << par << " is fixed and set from " << fMinimum.UserState().Value(par) << " to " << val << std::endl;
+// #endif
+
+//    //   double edmmax = 0.5*0.1*fFCN.Up()*1.e-3;
+//    double toler = 0.01;
+//    MnFunctionCross cross(fFCN, upar, fMinimum.Fval(), fStrategy);
+
+//    MnCross aopt = cross(para, xmid, xdir, toler, maxcalls);
+
+// #ifdef DEBUG
+//    std::cout<<"----- MnMinos: aopt found from MnFunctionCross = "<<aopt.Value()<<std::endl << std::endl;
+// #endif
+
+// #ifdef WARNINGMSG
+//    if(aopt.AtLimit())
+//       MN_INFO_VAL2("MnMinos Parameter is at Lower limit.",par);
+//    if(aopt.AtMaxFcn())
+//       MN_INFO_VAL2("MnMinos maximum number of function calls exceeded for Parameter ",par);
+//    if(aopt.NewMinimum())
+//       MN_INFO_VAL2("MnMinos new Minimum found while looking for Parameter ",par);
+//    if(!aopt.IsValid())
+//       MN_INFO_VAL2("MnMinos could not find Lower Value for Parameter ",par);
+// #endif
+
+//    return aopt;
+
+// }
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnParabolaFactory.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnParabolaFactory.cxx
new file mode 100644
index 0000000..0b54fdb
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnParabolaFactory.cxx
@@ -0,0 +1,77 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnParabolaFactory.h"
+#include "Minuit2/MnParabola.h"
+#include "Minuit2/MnParabolaPoint.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+// #include <iostream>
+
+MnParabola MnParabolaFactory::operator()(const MnParabolaPoint& p1,
+                                         const MnParabolaPoint& p2,
+                                         const MnParabolaPoint& p3) const {
+   // construct the parabola from 3 points p1,p2,p3
+   double x1 = p1.X();
+   double x2 = p2.X();
+   double x3 = p3.X();
+   double dx12 = x1-x2;
+   double dx13 = x1-x3;
+   double dx23 = x2-x3;
+
+   //   std::cout<<"MnParabolaFactory x1, x2, x3: "<<x1<<" "<<x2<<" "<<x3<<std::endl;
+
+   double xm = (x1+x2+x3)/3.;
+   x1 -= xm;
+   x2 -= xm;
+   x3 -= xm;
+
+   double y1 = p1.Y();
+   double y2 = p2.Y();
+   double y3 = p3.Y();
+   //   std::cout<<"MnParabolaFactory y1, y2, y3: "<<y1<<" "<<y2<<" "<<y3<<std::endl;
+
+   double a = y1/(dx12*dx13) - y2/(dx12*dx23) + y3/(dx13*dx23);
+   double b = -y1*(x2+x3)/(dx12*dx13) + y2*(x1+x3)/(dx12*dx23) - y3*(x1+x2)/(dx13*dx23);
+   double c = y1 - a*x1*x1 - b*x1;
+
+   c += xm*(xm*a - b);
+   b -= 2.*xm*a;
+
+   //   std::cout<<"a,b,c= "<<a<<" "<<b<<" "<<c<<std::endl;
+   return MnParabola(a, b, c);
+}
+
+MnParabola MnParabolaFactory::operator()(const MnParabolaPoint& p1,
+                                         double dxdy1,
+                                         const MnParabolaPoint& p2) const {
+   // construct the parabola from 2 points + derivative at first point dxdy1
+   double x1 = p1.X();
+   double xx1 = x1*x1;
+   double x2 = p2.X();
+   double xx2 = x2*x2;
+   double y1 = p1.Y();
+   double y12 = p1.Y() - p2.Y();
+
+   double det = xx1-xx2 - 2.*x1*(x1-x2);
+   double a = -(        y12 +   (x2-x1)*dxdy1)/det;
+   double b = -( -2.*x1*y12 + (xx1-xx2)*dxdy1)/det;
+   double c = y1 - a*xx1 - b*x1;
+
+   return MnParabola(a, b, c);
+}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnParameterScan.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnParameterScan.cxx
new file mode 100644
index 0000000..65cb8ef
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnParameterScan.cxx
@@ -0,0 +1,69 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnParameterScan.h"
+#include "Minuit2/FCNBase.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnParameterScan::MnParameterScan(const FCNBase& fcn, const MnUserParameters& par) : fFCN(fcn), fParameters(par), fAmin(fcn(par.Params())) {}
+
+MnParameterScan::MnParameterScan(const FCNBase& fcn, const MnUserParameters& par, double fval) : fFCN(fcn), fParameters(par), fAmin(fval) {}
+
+std::vector<std::pair<double, double> > MnParameterScan::operator()(unsigned int par, unsigned int maxsteps, double low, double high) {
+   // do the scan for parameter par between low and high values
+
+   //if(maxsteps > 101) maxsteps = 101;
+   std::vector<std::pair<double, double> > result; result.reserve(maxsteps+1);
+   std::vector<double> params = fParameters.Params();
+   result.push_back(std::pair<double, double>(params[par], fAmin));
+
+   if(low > high) return result;
+   if(maxsteps < 2) return result;
+
+   if(low == 0. && high == 0.) {
+      low = params[par] - 2.*fParameters.Error(par);
+      high = params[par] + 2.*fParameters.Error(par);
+   }
+
+   if(low == 0. && high == 0. && fParameters.Parameter(par).HasLimits()) {
+      if(fParameters.Parameter(par).HasLowerLimit())
+         low = fParameters.Parameter(par).LowerLimit();
+      if(fParameters.Parameter(par).HasUpperLimit())
+         high = fParameters.Parameter(par).UpperLimit();
+   }
+
+   if(fParameters.Parameter(par).HasLimits()) {
+      if(fParameters.Parameter(par).HasLowerLimit())
+         low = std::max(low, fParameters.Parameter(par).LowerLimit());
+      if(fParameters.Parameter(par).HasUpperLimit())
+         high = std::min(high, fParameters.Parameter(par).UpperLimit());
+   }
+
+   double x0 = low;
+   double stp = (high - low)/double(maxsteps - 1);
+   for(unsigned int i = 0; i < maxsteps; i++) {
+      params[par] = x0 + double(i)*stp;
+      double fval = fFCN(params);
+      if(fval < fAmin) {
+         fParameters.SetValue(par, params[par]);
+         fAmin = fval;
+      }
+      result.push_back(std::pair<double, double>(params[par], fval));
+   }
+
+   return result;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPlot.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPlot.cxx
new file mode 100644
index 0000000..af2bb1f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPlot.cxx
@@ -0,0 +1,58 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnPlot.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+void mnplot(double* xpt, double* ypt, char* chpt, int nxypt, int npagwd, int npagln);
+
+void MnPlot::operator()(const std::vector<std::pair<double,double> >& points) const {
+   // call routine from Fortran minuit (mnplot) to plot the vector of (x,y) points
+   std::vector<double> x; x.reserve(points.size());
+   std::vector<double> y; y.reserve(points.size());
+   std::vector<char> chpt; chpt.reserve(points.size());
+
+   for(std::vector<std::pair<double,double> >::const_iterator ipoint = points.begin(); ipoint != points.end(); ipoint++) {
+      x.push_back((*ipoint).first);
+      y.push_back((*ipoint).second);
+      chpt.push_back('*');
+   }
+
+   mnplot(&(x.front()), &(y.front()), &(chpt.front()), points.size(), Width(), Length());
+
+}
+
+void MnPlot::operator()(double xmin, double ymin, const std::vector<std::pair<double,double> >& points) const {
+   // call routine from Fortran minuit (mnplot) to plot the vector of (x,y) points + minimum values
+   std::vector<double> x; x.reserve(points.size()+2);
+   x.push_back(xmin);
+   x.push_back(xmin);
+   std::vector<double> y; y.reserve(points.size()+2);
+   y.push_back(ymin);
+   y.push_back(ymin);
+   std::vector<char> chpt; chpt.reserve(points.size()+2);
+   chpt.push_back(' ');
+   chpt.push_back('X');
+
+   for(std::vector<std::pair<double,double> >::const_iterator ipoint = points.begin(); ipoint != points.end(); ipoint++) {
+      x.push_back((*ipoint).first);
+      y.push_back((*ipoint).second);
+      chpt.push_back('*');
+   }
+
+   mnplot(&(x.front()), &(y.front()), &(chpt.front()), points.size()+2, Width(), Length());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPosDef.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPosDef.cxx
new file mode 100644
index 0000000..fe7b340
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPosDef.cxx
@@ -0,0 +1,107 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnPosDef.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/MnMachinePrecision.h"
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+#include <algorithm>
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+LAVector eigenvalues(const LASymMatrix&);
+
+
+MinimumState MnPosDef::operator()(const MinimumState& st, const MnMachinePrecision& prec) const {
+   // interface from minimum state
+   MinimumError err = (*this)(st.Error(), prec);
+   return MinimumState(st.Parameters(), err, st.Gradient(), st.Edm(), st.NFcn());
+}
+
+MinimumError MnPosDef::operator()(const MinimumError& e, const MnMachinePrecision& prec) const {
+   // make error matrix positive defined returning a new corrected minimum error state
+
+   MnAlgebraicSymMatrix err(e.InvHessian());
+   if(err.size() == 1 && err(0,0) < prec.Eps()) {
+      err(0,0) = 1.;
+      return MinimumError(err, MinimumError::MnMadePosDef());
+   }
+   if(err.size() == 1 && err(0,0) > prec.Eps()) {
+      return e;
+   }
+   //   std::cout<<"MnPosDef init matrix= "<<err<<std::endl;
+
+   double epspdf = std::max(1.e-6, prec.Eps2());
+   double dgmin = err(0,0);
+
+   for(unsigned int i = 0; i < err.Nrow(); i++) {
+#ifdef WARNINGMSG
+      if(err(i,i) <= 0 /* prec.Eps2() */ )
+         MN_INFO_VAL2("negative or zero diagonal element in covariance matrix",i);
+#endif
+      if(err(i,i) < dgmin) dgmin = err(i,i);
+   }
+   double dg = 0.;
+   if(dgmin <= 0) {
+      //dg = 1. + epspdf - dgmin;
+      dg = 0.5 + epspdf - dgmin;
+      //     dg = 0.5*(1. + epspdf - dgmin);
+#ifdef WARNINGMSG
+      MN_INFO_VAL2("added to diagonal of Error matrix a value",dg);
+#endif
+      //std::cout << "Error matrix " << err << std::endl;
+   }
+
+   MnAlgebraicVector s(err.Nrow());
+   MnAlgebraicSymMatrix p(err.Nrow());
+   for(unsigned int i = 0; i < err.Nrow(); i++) {
+      err(i,i) += dg;
+      if(err(i,i) < 0.) err(i,i) = 1.;
+      s(i) = 1./sqrt(err(i,i));
+      for(unsigned int j = 0; j <= i; j++) {
+         p(i,j) = err(i,j)*s(i)*s(j);
+      }
+   }
+
+   //std::cout<<"MnPosDef p: "<<p<<std::endl;
+   MnAlgebraicVector eval = eigenvalues(p);
+   double pmin = eval(0);
+   double pmax = eval(eval.size() - 1);
+   //std::cout<<"pmin= "<<pmin<<" pmax= "<<pmax<<std::endl;
+   pmax = std::max(fabs(pmax), 1.);
+   if(pmin > epspdf*pmax) return MinimumError(err, e.Dcovar());
+
+   double padd = 0.001*pmax - pmin;
+#ifdef DEBUG
+   std::cout<<"eigenvalues: "<<std::endl;
+#endif
+   for(unsigned int i = 0; i < err.Nrow(); i++) {
+      err(i,i) *= (1. + padd);
+#ifdef DEBUG
+      std::cout<<eval(i)<<std::endl;
+#endif
+   }
+   //   std::cout<<"MnPosDef final matrix: "<<err<<std::endl;
+#ifdef WARNINGMSG
+   MN_INFO_VAL2("matrix forced pos-def by adding to diagonal",padd);
+#endif
+   return MinimumError(err, MinimumError::MnMadePosDef());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPrint.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPrint.cxx
new file mode 100644
index 0000000..b359386
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnPrint.cxx
@@ -0,0 +1,377 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnPrint.h"
+#include "Minuit2/LAVector.h"
+#include "Minuit2/LASymMatrix.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnUserParameters.h"
+#include "Minuit2/MnUserCovariance.h"
+#include "Minuit2/MnGlobalCorrelationCoeff.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MinuitParameter.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MinosError.h"
+#include "Minuit2/ContoursError.h"
+#include "Minuit2/MnPlot.h"
+
+#include <iomanip>
+
+#define PRECISION 13
+#define WIDTH     20
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+#ifdef DEBUG
+int gPrintLevel = 3;
+#else
+int gPrintLevel = 0;
+#endif
+
+
+int MnPrint::SetLevel(int level) {
+   int prevLevel  = gPrintLevel;
+   gPrintLevel = level;
+   return prevLevel;
+}
+
+int MnPrint::Level( ) {
+   return gPrintLevel;
+}
+
+void MnPrint::PrintFcn(std::ostream & os, double value, bool endline) {
+   int pr = os.precision(PRECISION);
+   os << value;
+   if (endline) os << std::endl;
+   os.precision(pr);
+}
+
+void MnPrint::PrintState(std::ostream & os, const MinimumState & state, const char * msg, int iter) {
+   // helper function to print function value, edm and ncalls from state in one single line
+   MnPrint::PrintState(os, state.Fval(), state.Edm(), state.NFcn(), msg, iter);
+}
+
+void MnPrint::PrintState(std::ostream & os, double fval, double edm, int ncalls, const char * msg, int iter) {
+   // helper function to print function value, edm and ncalls  and message in one single line
+   os << msg;
+   if (iter>=0) os << std::setw(3) << iter;
+   int pr = os.precision(PRECISION);
+   const int width = PRECISION+3;
+   os << " - FCN = " <<  std::setw(width) << fval;
+   os.precision(pr);
+   os << " Edm = " <<  std::setw(12) << edm << " NCalls = " << std::setw(6) << ncalls;
+   os << std::endl;
+}
+
+
+std::ostream& operator<<(std::ostream& os, const LAVector& vec) {
+   // print a vector
+   os << "LAVector parameters:" << std::endl;
+   int pr = os.precision(PRECISION);
+   {
+      int nrow = vec.size();
+      for (int i = 0; i < nrow; i++) {
+         os.width(WIDTH);
+         os << vec(i) << std::endl;
+      }
+   }
+   os.precision(pr);
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const LASymMatrix& matrix) {
+   // print a matrix
+   os << "LASymMatrix parameters:" << std::endl;
+   int pr = os.precision(8);
+   {
+      //os << std::endl;
+      int n = matrix.Nrow();
+      for (int i = 0; i < n; i++) {
+         for (int j = 0; j < n; j++) {
+            os.width(15); os << matrix(i,j);
+         }
+         os << std::endl;
+      }
+   }
+   os.precision(pr);
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const MnUserParameters& par) {
+   // print the MnUserParameter object
+   os << std::endl;
+
+   os << "# ext. |" << "|   Name    |" << "|   type  |" << "|     Value     |" << "|  Error +/- " << std::endl;
+
+   os << std::endl;
+   int pr = os.precision();
+
+   bool atLoLim = false;
+   bool atHiLim = false;
+   for(std::vector<MinuitParameter>::const_iterator ipar = par.Parameters().begin(); ipar != par.Parameters().end(); ipar++) {
+      os << std::setw(4) << (*ipar).Number() << std::setw(5) << "||";
+      os << std::setw(10) << (*ipar).Name()   << std::setw(3) << "||";
+      if((*ipar).IsConst()) {
+         os << "  const  ||" << std::setprecision(PRECISION) << std::setw(WIDTH) << (*ipar).Value() << " ||" << std::endl;
+      } else if((*ipar).IsFixed()) {
+         os << "  fixed  ||" << std::setprecision(PRECISION) << std::setw(WIDTH) << (*ipar).Value() << " ||" << std::endl;
+      } else if((*ipar).HasLimits()) {
+         if((*ipar).Error() > 0.) {
+            os << " limited ||" << std::setprecision(PRECISION) << std::setw(WIDTH) << (*ipar).Value();
+            if(fabs((*ipar).Value() - (*ipar).LowerLimit()) < par.Precision().Eps2()) {
+               os <<"*";
+               atLoLim = true;
+            }
+            if(fabs((*ipar).Value() - (*ipar).UpperLimit()) < par.Precision().Eps2()) {
+               os <<"**";
+               atHiLim = true;
+            }
+            os << " ||" << std::setw(12) << (*ipar).Error() << std::endl;
+         } else
+            os << "  free   ||" << std::setprecision(PRECISION) << std::setw(WIDTH) << (*ipar).Value() << " ||" << std::setw(12) << "no" << std::endl;
+      } else {
+         if((*ipar).Error() > 0.)
+            os << "  free   ||" << std::setprecision(PRECISION) << std::setw(WIDTH) << (*ipar).Value() << " ||" << std::setw(12) << (*ipar).Error() << std::endl;
+         else
+            os << "  free   ||" << std::setprecision(PRECISION) << std::setw(WIDTH) << (*ipar).Value() << " ||" << std::setw(12) << "no" << std::endl;
+
+      }
+   }
+   os << std::endl;
+   if(atLoLim) os << "* Parameter is at Lower limit" << std::endl;
+   if(atHiLim) os << "** Parameter is at Upper limit" << std::endl;
+   os << std::endl;
+   os.precision(pr);
+
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const MnUserCovariance& matrix) {
+   // print the MnUserCovariance
+   os << std::endl;
+
+   os << "MnUserCovariance: " << std::endl;
+   int pr = os.precision(6);
+   {
+      os << std::endl;
+      unsigned int n = matrix.Nrow();
+      for (unsigned int i = 0; i < n; i++) {
+         for (unsigned int j = 0; j < n; j++) {
+            os.width(13); os << matrix(i,j);
+         }
+         os << std::endl;
+      }
+   }
+
+   os << std::endl;
+   os << "MnUserCovariance Parameter correlations: " << std::endl;
+
+   {
+      os << std::endl;
+      unsigned int n = matrix.Nrow();
+      for (unsigned int i = 0; i < n; i++) {
+         double di = matrix(i,i);
+         for (unsigned int j = 0; j < n; j++) {
+            double dj = matrix(j,j);
+            os.width(13); os << matrix(i,j)/sqrt(fabs(di*dj));
+         }
+         os << std::endl;
+      }
+   }
+
+   os.precision(pr);
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const MnGlobalCorrelationCoeff& coeff) {
+   // print the global correlation coefficient
+   os << std::endl;
+
+   os << "MnGlobalCorrelationCoeff: " << std::endl;
+   int pr =  os.precision(6);
+   {
+      os << std::endl;
+      for (unsigned int i = 0; i < coeff.GlobalCC().size(); i++) {
+         os.width(13); os << coeff.GlobalCC()[i];
+         os << std::endl;
+      }
+   }
+
+   os.precision(pr);
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const MnUserParameterState& state) {
+   // print the MnUserParameterState
+   os << std::endl;
+
+   if(!state.IsValid()) {
+      os << std::endl;
+      os <<"WARNING: MnUserParameterState is not valid."<<std::endl;
+      os << std::endl;
+   }
+   int pr = os.precision(PRECISION);
+
+   os <<"# of function calls: "<<state.NFcn()<<std::endl;
+   os <<"function Value: " << state.Fval()<<std::endl;
+   os <<"expected distance to the Minimum (edm): " << state.Edm()<<std::endl;
+   os <<"external parameters: "<<state.Parameters()<<std::endl;
+   os <<"covariance matrix status: " << state.CovarianceStatus() << std::endl;
+   if(state.HasCovariance())
+      os <<"covariance matrix: "<<state.Covariance()<<std::endl;
+   else
+      os <<"covariance matrix is not present or not valid "<<std::endl;
+   if(state.HasGlobalCC())
+      os <<"global correlation coefficients : "<<state.GlobalCC()<<std::endl;
+
+   if(!state.IsValid())
+      os <<"WARNING: MnUserParameterState is not valid."<<std::endl;
+
+   os << std::endl;
+   os.precision(pr);
+
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const FunctionMinimum& min) {
+   // print the FunctionMinimum
+   os << std::endl;
+   if(!min.IsValid()) {
+      os <<"WARNING: Minuit did not converge."<<std::endl;
+      os << std::endl;
+   } else {
+      os <<"Minuit did successfully converge."<<std::endl;
+   }
+   int pr = os.precision(PRECISION);
+
+   os <<"# of function calls: "<<min.NFcn()<<std::endl;
+   os <<"minimum function Value: "  << min.Fval()<<std::endl;
+   os <<"minimum edm: "  << min.Edm()<<std::endl;
+   os <<"minimum internal state vector: "<<min.Parameters().Vec()<<std::endl;
+   if(min.HasValidCovariance())
+      os <<"minimum internal covariance matrix: "<<min.Error().Matrix()<<std::endl;
+
+   os << min.UserParameters() << std::endl;
+   //os << min.UserCovariance() << std::endl;
+   //os << min.UserState().GlobalCC() << std::endl;
+
+   if(!min.IsValid()) {
+      os <<"WARNING: FunctionMinimum is invalid: " << std::endl;
+      if ( !min.State().IsValid() )
+         os << "\t State is invalid" << std::endl;
+      if ( min.IsAboveMaxEdm() )
+         os << "\t Edm is above max" << std::endl;
+      if ( min.HasReachedCallLimit() )
+         os << "\t Reached call limit" << std::endl;
+   }
+
+
+   os << std::endl;
+   os.precision(pr);
+
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const MinimumState& min) {
+
+   os << std::endl;
+   int pr = os.precision(PRECISION);
+
+   os <<"minimum function Value: "  << min.Fval()<<std::endl;
+   os <<"minimum edm: " << min.Edm()<<std::endl;
+   os <<"minimum internal state vector: "<<min.Vec()<<std::endl;
+   os <<"minimum internal Gradient vector: "<<min.Gradient().Vec()<<std::endl;
+   if(min.HasCovariance())
+      os <<"minimum internal covariance matrix: "<<min.Error().Matrix()<<std::endl;
+
+   os << std::endl;
+   os.precision(pr);
+
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const MnMachinePrecision& prec) {
+   // print the Precision
+   os << std::endl;
+
+   int pr = os.precision(PRECISION);
+   os <<"current machine precision is set to "<<prec.Eps()<<std::endl;
+
+   os << std::endl;
+   os.precision(pr);
+
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const MinosError& me) {
+   // print the Minos Error
+   os << std::endl;
+
+   os <<"Minos # of function calls: "<<me.NFcn()<<std::endl;
+
+   if(!me.IsValid())
+      os << "Minos Error is not valid." <<std::endl;
+   if(!me.LowerValid())
+      os << "lower Minos Error is not valid." <<std::endl;
+   if(!me.UpperValid())
+      os << "upper Minos Error is not valid." <<std::endl;
+   if(me.AtLowerLimit())
+      os << "Minos Error is Lower limit of Parameter "<<me.Parameter()<<"." <<std::endl;
+   if(me.AtUpperLimit())
+      os << "Minos Error is Upper limit of Parameter "<<me.Parameter()<<"." <<std::endl;
+   if(me.AtLowerMaxFcn())
+      os << "Minos number of function calls for Lower Error exhausted."<<std::endl;
+   if(me.AtUpperMaxFcn())
+      os << "Minos number of function calls for Upper Error exhausted."<<std::endl;
+   if(me.LowerNewMin()) {
+      os << "Minos found a new Minimum in negative direction."<<std::endl;
+      os << me.LowerState() <<std::endl;
+   }
+   if(me.UpperNewMin()) {
+      os << "Minos found a new Minimum in positive direction."<<std::endl;
+      os << me.UpperState() <<std::endl;
+   }
+
+   int pr = os.precision();
+
+   os << "# ext. |" << "|   Name    |" << "|   Value at min   |" << "|    negative   |" << "|   positive  " << std::endl;
+   os << std::setw(4) << me.Parameter() << std::setw(5) << "||";
+   os << std::setw(10) << me.LowerState().Name(me.Parameter()) << std::setw(3) << "||";
+   os << std::setprecision(PRECISION) << std::setw(WIDTH) << me.Min() << " ||" << std::setprecision(PRECISION) << std::setw(WIDTH) << me.Lower() << " ||" << std::setw(WIDTH) << me.Upper() << std::endl;
+
+   os << std::endl;
+   os.precision(pr);
+
+   return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const ContoursError& ce) {
+   // print the ContoursError
+   os << std::endl;
+   os <<"Contours # of function calls: "<<ce.NFcn()<<std::endl;
+   os << "MinosError in x: "<<std::endl;
+   os << ce.XMinosError() << std::endl;
+   os << "MinosError in y: "<<std::endl;
+   os << ce.YMinosError() << std::endl;
+   MnPlot plot;
+   plot(ce.XMin(), ce.YMin(), ce());
+   for(std::vector<std::pair<double,double> >::const_iterator ipar = ce().begin(); ipar != ce().end(); ipar++) {
+      os << ipar - ce().begin() <<"  "<< (*ipar).first <<"  "<< (*ipar).second <<std::endl;
+   }
+   os << std::endl;
+
+   return os;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnScan.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnScan.cxx
new file mode 100644
index 0000000..e307fb9
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnScan.cxx
@@ -0,0 +1,34 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnScan.h"
+#include "Minuit2/MnParameterScan.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+std::vector<std::pair<double, double> > MnScan::Scan(unsigned int par, unsigned int maxsteps, double low, double high) {
+   // perform a scan of the function in the parameter par
+   MnParameterScan scan(fFCN, fState.Parameters());
+   double amin = scan.Fval();
+
+   std::vector<std::pair<double, double> > result = scan(par, maxsteps, low, high);
+   if(scan.Fval() < amin) {
+      fState.SetValue(par, scan.Parameters().Value(par));
+      amin = scan.Fval();
+   }
+
+   return result;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnSeedGenerator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnSeedGenerator.cxx
new file mode 100644
index 0000000..9d27566
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnSeedGenerator.cxx
@@ -0,0 +1,201 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnSeedGenerator.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/GradientCalculator.h"
+#include "Minuit2/InitialGradientCalculator.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MinimumError.h"
+#include "Minuit2/MnMatrix.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MinuitParameter.h"
+#include "Minuit2/MnLineSearch.h"
+#include "Minuit2/MnParabolaPoint.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnHesse.h"
+#include "Minuit2/VariableMetricEDMEstimator.h"
+#include "Minuit2/NegativeG2LineSearch.h"
+#include "Minuit2/AnalyticalGradientCalculator.h"
+#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/HessianGradientCalculator.h"
+
+//#define DEBUG
+
+//#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+//#endif
+
+
+
+#include <math.h>
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MinimumSeed MnSeedGenerator::operator()(const MnFcn& fcn, const GradientCalculator& gc, const MnUserParameterState& st, const MnStrategy& stra) const {
+
+
+   // find seed (initial minimization point) using the calculated gradient
+   unsigned int n = st.VariableParameters();
+   const MnMachinePrecision& prec = st.Precision();
+
+#ifdef DEBUG
+   std::cout << "MnSeedGenerator: operator() - var par = " << n << " mnfcn pointer " << &fcn << std::endl;
+#endif
+
+   int printLevel = MnPrint::Level();
+
+   // initial starting values
+   MnAlgebraicVector x(n);
+   for(unsigned int i = 0; i < n; i++) x(i) = st.IntParameters()[i];
+   double fcnmin = fcn(x);
+
+   if (printLevel > 1) {
+      std::cout << "MnSeedGenerator: for initial parameters FCN = ";
+      MnPrint::PrintFcn(std::cout,fcnmin);
+   }
+
+   MinimumParameters pa(x, fcnmin);
+   FunctionGradient dgrad = gc(pa);
+   MnAlgebraicSymMatrix mat(n);
+   double dcovar = 1.;
+   if(st.HasCovariance()) {
+      for(unsigned int i = 0; i < n; i++)
+         for(unsigned int j = i; j < n; j++) mat(i,j) = st.IntCovariance()(i,j);
+      dcovar = 0.;
+   } else {
+      for(unsigned int i = 0; i < n; i++)
+         mat(i,i) = (fabs(dgrad.G2()(i)) > prec.Eps2() ? 1./dgrad.G2()(i) : 1.);
+   }
+   MinimumError err(mat, dcovar);
+
+   double edm = VariableMetricEDMEstimator().Estimate(dgrad, err);
+   MinimumState state(pa, err, dgrad, edm, fcn.NumOfCalls());
+
+   if (printLevel >1) {
+      MnPrint::PrintState(std::cout, state, "MnSeedGenerator: Initial state:  ");
+   }
+
+   NegativeG2LineSearch ng2ls;
+   if(ng2ls.HasNegativeG2(dgrad, prec)) {
+#ifdef DEBUG
+      std::cout << "MnSeedGenerator: Negative G2 Found: " << std::endl;
+      std::cout << x << std::endl;
+      std::cout << dgrad.Grad() << std::endl;
+      std::cout << dgrad.G2() << std::endl;
+#endif
+      state = ng2ls(fcn, state, gc, prec);
+
+      if (printLevel >1) {
+         MnPrint::PrintState(std::cout, state, "MnSeedGenerator: Negative G2 found - new state:  ");
+      }
+
+   }
+
+
+   if(stra.Strategy() == 2 && !st.HasCovariance()) {
+      //calculate full 2nd derivative
+#ifdef DEBUG
+      std::cout << "MnSeedGenerator: calling MnHesse  " << std::endl;
+#endif
+      MinimumState tmp = MnHesse(stra)(fcn, state, st.Trafo());
+
+      if (printLevel >1) {
+         MnPrint::PrintState(std::cout, tmp, "MnSeedGenerator: run Hesse - new state:  ");
+      }
+
+      return MinimumSeed(tmp, st.Trafo());
+   }
+
+   return MinimumSeed(state, st.Trafo());
+}
+
+
+MinimumSeed MnSeedGenerator::operator()(const MnFcn& fcn, const AnalyticalGradientCalculator& gc, const MnUserParameterState& st, const MnStrategy& stra) const {
+   // find seed (initial point for minimization) using analytical gradient
+   unsigned int n = st.VariableParameters();
+   const MnMachinePrecision& prec = st.Precision();
+
+   // initial starting values
+   MnAlgebraicVector x(n);
+   for(unsigned int i = 0; i < n; i++) x(i) = st.IntParameters()[i];
+   double fcnmin = fcn(x);
+   MinimumParameters pa(x, fcnmin);
+
+   InitialGradientCalculator igc(fcn, st.Trafo(), stra);
+   FunctionGradient tmp = igc(pa);
+   FunctionGradient grd = gc(pa);
+   FunctionGradient dgrad(grd.Grad(), tmp.G2(), tmp.Gstep());
+
+   if(gc.CheckGradient()) {
+      bool good = true;
+      HessianGradientCalculator hgc(fcn, st.Trafo(), MnStrategy(2));
+      std::pair<FunctionGradient, MnAlgebraicVector> hgrd = hgc.DeltaGradient(pa, dgrad);
+      for(unsigned int i = 0; i < n; i++) {
+         if(fabs(hgrd.first.Grad()(i) - grd.Grad()(i)) > hgrd.second(i)) {
+#ifdef WARNINGMSG
+            MN_INFO_MSG("MnSeedGenerator:gradient discrepancy of external Parameter too large");
+            int externalParameterIndex = st.Trafo().ExtOfInt(i);
+            const char * parameter_name = st.Trafo().Name(externalParameterIndex);
+            MN_INFO_VAL(parameter_name);
+            MN_INFO_VAL(externalParameterIndex);
+            MN_INFO_VAL2("internal",i);
+#endif
+            good = false;
+         }
+      }
+      if(!good) {
+#ifdef WARNINGMSG
+         MN_ERROR_MSG("Minuit does not accept user specified Gradient. To force acceptance, override 'virtual bool CheckGradient() const' of FCNGradientBase.h in the derived class.");
+#endif
+         assert(good);
+      }
+   }
+
+   MnAlgebraicSymMatrix mat(n);
+   double dcovar = 1.;
+   if(st.HasCovariance()) {
+      for(unsigned int i = 0; i < n; i++)
+         for(unsigned int j = i; j < n; j++) mat(i,j) = st.IntCovariance()(i,j);
+      dcovar = 0.;
+   } else {
+      for(unsigned int i = 0; i < n; i++)
+         mat(i,i) = (fabs(dgrad.G2()(i)) > prec.Eps2() ? 1./dgrad.G2()(i) : 1.);
+   }
+   MinimumError err(mat, dcovar);
+   double edm = VariableMetricEDMEstimator().Estimate(dgrad, err);
+   MinimumState state(pa, err, dgrad, edm, fcn.NumOfCalls());
+
+   NegativeG2LineSearch ng2ls;
+   if(ng2ls.HasNegativeG2(dgrad, prec)) {
+      Numerical2PGradientCalculator ngc(fcn, st.Trafo(), stra);
+      state = ng2ls(fcn, state, ngc, prec);
+   }
+
+   if(stra.Strategy() == 2 && !st.HasCovariance()) {
+      //calculate full 2nd derivative
+      MinimumState tmpState = MnHesse(stra)(fcn, state, st.Trafo());
+      return MinimumSeed(tmpState, st.Trafo());
+   }
+
+   return MinimumSeed(state, st.Trafo());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnStrategy.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnStrategy.cxx
new file mode 100644
index 0000000..337287b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnStrategy.cxx
@@ -0,0 +1,69 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnStrategy.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+      MnStrategy::MnStrategy() : fStoreLevel(1) {
+   //default strategy
+   SetMediumStrategy();
+}
+
+
+      MnStrategy::MnStrategy(unsigned int stra) : fStoreLevel(1) {
+   //user defined strategy (0, 1, >=2)
+   if(stra == 0) SetLowStrategy();
+   else if(stra == 1) SetMediumStrategy();
+   else SetHighStrategy();
+}
+
+void MnStrategy::SetLowStrategy() {
+   // set low strategy (0) values
+   fStrategy = 0;
+   SetGradientNCycles(2);
+   SetGradientStepTolerance(0.5);
+   SetGradientTolerance(0.1);
+   SetHessianNCycles(3);
+   SetHessianStepTolerance(0.5);
+   SetHessianG2Tolerance(0.1);
+   SetHessianGradientNCycles(1);
+}
+
+void MnStrategy::SetMediumStrategy() {
+   // set minimum strategy (1) the default
+   fStrategy = 1;
+   SetGradientNCycles(3);
+   SetGradientStepTolerance(0.3);
+   SetGradientTolerance(0.05);
+   SetHessianNCycles(5);
+   SetHessianStepTolerance(0.3);
+   SetHessianG2Tolerance(0.05);
+   SetHessianGradientNCycles(2);
+}
+
+void MnStrategy::SetHighStrategy() {
+   // set high strategy (2)
+   fStrategy = 2;
+   SetGradientNCycles(5);
+   SetGradientStepTolerance(0.1);
+   SetGradientTolerance(0.02);
+   SetHessianNCycles(7);
+   SetHessianStepTolerance(0.1);
+   SetHessianG2Tolerance(0.02);
+   SetHessianGradientNCycles(6);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnTiny.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnTiny.cxx
new file mode 100644
index 0000000..299f50e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnTiny.cxx
@@ -0,0 +1,27 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnTiny.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double MnTiny::One() const {return fOne;}
+
+double MnTiny::operator()(volatile double epsp1) const {
+   // evaluate minimal diference between two floating points
+   double result = epsp1 - One();
+   return result;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnTraceObject.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnTraceObject.cxx
new file mode 100644
index 0000000..526f834
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnTraceObject.cxx
@@ -0,0 +1,49 @@
+// @(#)root/minuit2:$Id$
+// Author:  L. Moneta 2012
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2012 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnTraceObject.h"
+#include "Minuit2/MnPrint.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MinimumState.h"
+#include <iomanip>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+      void MnTraceObject::operator() (int iter, const MinimumState & state) {
+
+         MnPrint::PrintState(std::cout, state, "iteration  #  ",iter);
+         if (!fUserState) return;
+
+         // print also parameters and derivatives
+         std::cout << "\t" << std::setw(12) << "  " << "  "
+                   << std::setw(12)  << " ext value " << "  "
+                   << std::setw(12)  << " int value " << "  "
+                   << std::setw(12)  << " gradient  " << std::endl;
+         int firstPar = 0;
+         int lastPar =  state.Vec().size();
+         if (fParNumber >= 0 && fParNumber < lastPar) {
+            firstPar = fParNumber;
+            lastPar = fParNumber+1;
+         }
+         for (int ipar = firstPar; ipar <lastPar; ++ipar) {
+               int epar = fUserState->Trafo().ExtOfInt(ipar);
+               double eval = fUserState->Trafo().Int2ext(ipar, state.Vec()(ipar) );
+               std::cout << "\t" << std::setw(12) << fUserState->Name(epar) << "  "
+                         << std::setw(12) << eval << "  "
+                         << std::setw(12) << state.Vec()(ipar)  << "  "
+                         << std::setw(12) << state.Gradient().Vec()(ipar) << std::endl;
+         }
+      }
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserFcn.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserFcn.cxx
new file mode 100644
index 0000000..bfa734b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserFcn.cxx
@@ -0,0 +1,47 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnUserFcn.h"
+#include "Minuit2/FCNBase.h"
+#include "Minuit2/MnUserTransformation.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double MnUserFcn::operator()(const MnAlgebraicVector& v) const {
+   // call Fcn function transforming from a MnAlgebraicVector of internal values to a std::vector of external ones
+   fNumCall++;
+
+   // calling fTransform() like here was not thread safe because it was using a cached vector
+   //return Fcn()( fTransform(v) );
+   // make a new thread-safe implementation creating a vector each time
+   // a bit slower few% in stressFit and 10% in Rosenbrock function but it is negligible in big fits
+
+   // get first initial values of parameter (in case some one is fixed)
+   std::vector<double> vpar(fTransform.InitialParValues().begin(), fTransform.InitialParValues().end()  );
+
+   const std::vector<MinuitParameter>& parameters = fTransform.Parameters();
+   unsigned int n = v.size();
+   for (unsigned int i = 0; i < n; i++) {
+      int ext = fTransform.ExtOfInt(i);
+      if (parameters[ext].HasLimits()) {
+         vpar[ext] = fTransform.Int2ext(i, v(i));
+      }
+      else {
+         vpar[ext] = v(i);
+      }
+   }
+   return Fcn()(vpar);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserParameterState.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserParameterState.cxx
new file mode 100644
index 0000000..9031443
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserParameterState.cxx
@@ -0,0 +1,441 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnCovarianceSqueeze.h"
+#include "Minuit2/MinimumState.h"
+
+#include "Minuit2/MnPrint.h"
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//
+// construct from user parameters (befor minimization)
+//
+MnUserParameterState::MnUserParameterState(const std::vector<double>& par, const std::vector<double>& err) :
+   fValid(true), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0), fParameters(MnUserParameters(par, err)), fCovariance(MnUserCovariance()), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(par), fIntCovariance(MnUserCovariance())
+      {}
+
+MnUserParameterState::MnUserParameterState(const MnUserParameters& par) :
+   fValid(true), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0), fParameters(par), fCovariance(MnUserCovariance()), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(std::vector<double>()), fIntCovariance(MnUserCovariance()) {
+   // construct from user parameters (befor minimization)
+
+   for(std::vector<MinuitParameter>::const_iterator ipar = MinuitParameters().begin(); ipar != MinuitParameters().end(); ipar++) {
+      if((*ipar).IsConst() || (*ipar).IsFixed()) continue;
+      if((*ipar).HasLimits())
+         fIntParameters.push_back(Ext2int((*ipar).Number(), (*ipar).Value()));
+      else
+         fIntParameters.push_back((*ipar).Value());
+   }
+}
+
+//
+// construct from user parameters + errors (befor minimization)
+//
+MnUserParameterState::MnUserParameterState(const std::vector<double>& par, const std::vector<double>& cov, unsigned int nrow) :
+   fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
+   fParameters(MnUserParameters()), fCovariance(MnUserCovariance(cov, nrow)), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(par), fIntCovariance(MnUserCovariance(cov, nrow)) {
+   // construct from user parameters + errors (before minimization) using std::vector for parameter error and    // an std::vector of size n*(n+1)/2 for the covariance matrix  and n (rank of cov matrix)
+
+   std::vector<double> err; err.reserve(par.size());
+   for(unsigned int i = 0; i < par.size(); i++) {
+      assert(fCovariance(i,i) > 0.);
+      err.push_back(sqrt(fCovariance(i,i)));
+   }
+   fParameters = MnUserParameters(par, err);
+   assert(fCovariance.Nrow() == VariableParameters());
+}
+
+MnUserParameterState::MnUserParameterState(const std::vector<double>& par, const MnUserCovariance& cov) :
+   fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
+   fParameters(MnUserParameters()), fCovariance(cov), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(par), fIntCovariance(cov) {
+   //construct from user parameters + errors (before minimization) using std::vector (params) and MnUserCovariance class
+
+   std::vector<double> err; err.reserve(par.size());
+   for(unsigned int i = 0; i < par.size(); i++) {
+      assert(fCovariance(i,i) > 0.);
+      err.push_back(sqrt(fCovariance(i,i)));
+   }
+   fParameters = MnUserParameters(par, err);
+   assert(fCovariance.Nrow() == VariableParameters());
+}
+
+
+MnUserParameterState::MnUserParameterState(const MnUserParameters& par, const MnUserCovariance& cov) :
+   fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
+   fParameters(par), fCovariance(cov), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(std::vector<double>()), fIntCovariance(cov) {
+   //construct from user parameters + errors (befor minimization) using
+   // MnUserParameters and MnUserCovariance objects
+
+   fIntCovariance.Scale(0.5);
+   for(std::vector<MinuitParameter>::const_iterator ipar = MinuitParameters().begin(); ipar != MinuitParameters().end(); ipar++) {
+      if((*ipar).IsConst() || (*ipar).IsFixed()) continue;
+      if((*ipar).HasLimits())
+         fIntParameters.push_back(Ext2int((*ipar).Number(), (*ipar).Value()));
+      else
+         fIntParameters.push_back((*ipar).Value());
+   }
+   assert(fCovariance.Nrow() == VariableParameters());
+   //
+   // need to Fix that in case of limited parameters
+   //   fIntCovariance = MnUserCovariance();
+   //
+}
+
+//
+//
+MnUserParameterState::MnUserParameterState(const MinimumState& st, double up, const MnUserTransformation& trafo) :
+   fValid(st.IsValid()), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1),
+   fFVal(st.Fval()), fEDM(st.Edm()), fNFcn(st.NFcn()), fParameters(MnUserParameters()), fCovariance(MnUserCovariance()), fGlobalCC(MnGlobalCorrelationCoeff()), fIntParameters(std::vector<double>()), fIntCovariance(MnUserCovariance()) {
+   //
+   // construct from internal parameters (after minimization)
+   //
+   //std::cout << "build a MnUSerParameterState after minimization.." << std::endl;
+   
+   for(std::vector<MinuitParameter>::const_iterator ipar = trafo.Parameters().begin(); ipar != trafo.Parameters().end(); ipar++) {
+      if((*ipar).IsConst()) {
+         Add((*ipar).GetName(), (*ipar).Value());
+      } else if((*ipar).IsFixed()) {
+         Add((*ipar).GetName(), (*ipar).Value(), (*ipar).Error());
+         if((*ipar).HasLimits()) {
+            if((*ipar).HasLowerLimit() && (*ipar).HasUpperLimit())
+               SetLimits((*ipar).GetName(), (*ipar).LowerLimit(),(*ipar).UpperLimit());
+            else if((*ipar).HasLowerLimit() && !(*ipar).HasUpperLimit())
+               SetLowerLimit((*ipar).GetName(), (*ipar).LowerLimit());
+            else
+               SetUpperLimit((*ipar).GetName(), (*ipar).UpperLimit());
+         }
+         Fix((*ipar).GetName());
+      } else if((*ipar).HasLimits()) {
+         unsigned int i = trafo.IntOfExt((*ipar).Number());
+         double err = st.HasCovariance() ? sqrt(2.*up*st.Error().InvHessian()(i,i)) : st.Parameters().Dirin()(i);
+         Add((*ipar).GetName(), trafo.Int2ext(i, st.Vec()(i)), trafo.Int2extError(i, st.Vec()(i), err));
+         if((*ipar).HasLowerLimit() && (*ipar).HasUpperLimit())
+            SetLimits((*ipar).GetName(), (*ipar).LowerLimit(), (*ipar).UpperLimit());
+         else if((*ipar).HasLowerLimit() && !(*ipar).HasUpperLimit())
+            SetLowerLimit((*ipar).GetName(), (*ipar).LowerLimit());
+         else
+            SetUpperLimit((*ipar).GetName(), (*ipar).UpperLimit());
+      } else {
+         unsigned int i = trafo.IntOfExt((*ipar).Number());
+         double err = st.HasCovariance() ? sqrt(2.*up*st.Error().InvHessian()(i,i)) : st.Parameters().Dirin()(i);
+         Add((*ipar).GetName(), st.Vec()(i), err);
+      }
+   }
+
+   // need to be set afterwards because becore the ::Add method set fCovarianceValid to false
+   fCovarianceValid = st.Error().IsValid();
+
+   fCovStatus = -1; // when not available
+   //if (st.Error().HesseFailed() || st.Error().InvertFailed() ) fCovStatus = -1;
+   // when available
+   if (st.Error().IsAvailable() ) fCovStatus = 0;
+
+   if(fCovarianceValid) {
+      fCovariance = trafo.Int2extCovariance(st.Vec(), st.Error().InvHessian());
+      fIntCovariance = MnUserCovariance(std::vector<double>(st.Error().InvHessian().Data(), st.Error().InvHessian().Data()+st.Error().InvHessian().size()), st.Error().InvHessian().Nrow());
+      fCovariance.Scale(2.*up);
+      fGlobalCC = MnGlobalCorrelationCoeff(st.Error().InvHessian());
+      fGCCValid = fGlobalCC.IsValid();
+
+      assert(fCovariance.Nrow() == VariableParameters());
+
+      fCovStatus = 1;   // when is valid
+   }
+   if (st.Error().IsMadePosDef() ) fCovStatus = 2;
+   if (st.Error().IsAccurate() ) fCovStatus = 3;
+
+}
+
+MnUserCovariance MnUserParameterState::Hessian() const {
+   // invert covariance matrix and return Hessian
+   // need to copy in a MnSymMatrix
+   MnAlgebraicSymMatrix mat(fCovariance.Nrow() );
+   std::copy(fCovariance.Data().begin(), fCovariance.Data().end(), mat.Data() );
+   int ifail = Invert(mat);
+   if(ifail != 0) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("MnUserParameterState:Hessian inversion fails- return diagonal matrix.");
+#endif
+      MnUserCovariance tmp(fCovariance.Nrow());
+      for(unsigned int i = 0; i < fCovariance.Nrow(); i++) {
+         tmp(i,i) = 1./fCovariance(i,i);
+      }
+      return tmp;
+   }
+
+   MnUserCovariance hessian( mat.Data(), fCovariance.Nrow() );
+   return hessian;
+}
+
+// facade: forward interface of MnUserParameters and MnUserTransformation
+// via MnUserParameterState
+
+
+const std::vector<MinuitParameter>& MnUserParameterState::MinuitParameters() const {
+   //access to parameters (row-wise)
+   return fParameters.Parameters();
+}
+
+std::vector<double> MnUserParameterState::Params() const {
+   //access to parameters in column-wise representation
+   return fParameters.Params();
+}
+std::vector<double> MnUserParameterState::Errors() const {
+   //access to errors in column-wise representation
+   return fParameters.Errors();
+}
+
+const MinuitParameter& MnUserParameterState::Parameter(unsigned int i) const {
+   //access to single Parameter i
+   return fParameters.Parameter(i);
+}
+
+void MnUserParameterState::Add(const std::string & name, double val, double err) {
+   //add free Parameter
+   if ( fParameters.Add(name, val, err) ) {
+      fIntParameters.push_back(val);
+      fCovarianceValid = false;
+      fGCCValid = false;
+      fValid = true;
+   }
+   else {
+      // redefine an existing parameter
+      int i = Index(name);
+      SetValue(i,val);
+      if (Parameter(i).IsConst() ) {
+         std::string msg = "Cannot modify status of constant parameter " + name;
+         MN_INFO_MSG2("MnUserParameterState::Add",msg.c_str());
+         return;
+      }
+      SetError(i,err);
+      // release if it was fixed
+      if (Parameter(i).IsFixed() ) Release(i);
+   }
+
+}
+
+void MnUserParameterState::Add(const std::string & name, double val, double err, double low, double up) {
+   //add limited Parameter
+   if ( fParameters.Add(name, val, err, low, up) ) {
+      fCovarianceValid = false;
+      fIntParameters.push_back(Ext2int(Index(name), val));
+      fGCCValid = false;
+      fValid = true;
+   }
+   else { // Parameter already exist - just set values
+      int i = Index(name);
+      SetValue(i,val);
+      if (Parameter(i).IsConst() ) {
+         std::string msg = "Cannot modify status of constant parameter " + name;
+         MN_INFO_MSG2("MnUserParameterState::Add",msg.c_str());
+         return;
+      }
+      SetError(i,err);
+      SetLimits(i,low,up);
+      // release if it was fixed
+      if (Parameter(i).IsFixed() ) Release(i);
+   }
+
+
+}
+
+void MnUserParameterState::Add(const std::string & name, double val) {
+   //add const Parameter
+   if ( fParameters.Add(name, val) )
+      fValid = true;
+   else
+      SetValue(name,val);
+}
+
+//interaction via external number of Parameter
+
+void MnUserParameterState::Fix(unsigned int e) {
+   // fix parameter e (external index)
+   if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
+      unsigned int i = IntOfExt(e);
+      if(fCovarianceValid) {
+         fCovariance = MnCovarianceSqueeze()(fCovariance, i);
+         fIntCovariance = MnCovarianceSqueeze()(fIntCovariance, i);
+      }
+      fIntParameters.erase(fIntParameters.begin()+i, fIntParameters.begin()+i+1);
+   }
+   fParameters.Fix(e);
+   fGCCValid = false;
+}
+
+void MnUserParameterState::Release(unsigned int e) {
+   // release parameter e (external index)
+   // no-op if parameter is const
+   if (Parameter(e).IsConst() ) return;
+   fParameters.Release(e);
+   fCovarianceValid = false;
+   fGCCValid = false;
+   unsigned int i = IntOfExt(e);
+   if(Parameter(e).HasLimits())
+      fIntParameters.insert(fIntParameters.begin()+i, Ext2int(e, Parameter(e).Value()));
+   else
+      fIntParameters.insert(fIntParameters.begin()+i, Parameter(e).Value());
+}
+
+void MnUserParameterState::SetValue(unsigned int e, double val) {
+   // set value for parameter e ( external index )
+   fParameters.SetValue(e, val);
+   if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
+      unsigned int i = IntOfExt(e);
+      if(Parameter(e).HasLimits())
+         fIntParameters[i] = Ext2int(e, val);
+      else
+         fIntParameters[i] = val;
+   }
+}
+
+void MnUserParameterState::SetError(unsigned int e, double val) {
+   // set error for  parameter e (external index)
+   fParameters.SetError(e, val);
+}
+
+void MnUserParameterState::SetLimits(unsigned int e, double low, double up) {
+   // set limits for parameter e (external index)
+   fParameters.SetLimits(e, low, up);
+   fCovarianceValid = false;
+   fGCCValid = false;
+   if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
+      unsigned int i = IntOfExt(e);
+      if(low < fIntParameters[i] && fIntParameters[i] < up)
+         fIntParameters[i] = Ext2int(e, fIntParameters[i]);
+      else if (low >=  fIntParameters[i] )
+         fIntParameters[i] = Ext2int(e, low + 0.1 * Parameter(e).Error() );
+      else
+         fIntParameters[i] = Ext2int(e, up - 0.1 * Parameter(e).Error() );
+   }
+}
+
+void MnUserParameterState::SetUpperLimit(unsigned int e, double up) {
+   // set upper limit for parameter e (external index)
+   fParameters.SetUpperLimit(e, up);
+   fCovarianceValid = false;
+   fGCCValid = false;
+   if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
+      unsigned int i = IntOfExt(e);
+      if(fIntParameters[i] < up)
+         fIntParameters[i] = Ext2int(e, fIntParameters[i]);
+      else
+         fIntParameters[i] = Ext2int(e, up -  0.1 * Parameter(e).Error() );
+   }
+}
+
+void MnUserParameterState::SetLowerLimit(unsigned int e, double low) {
+   // set lower limit for parameter e (external index)
+   fParameters.SetLowerLimit(e, low);
+   fCovarianceValid = false;
+   fGCCValid = false;
+   if(!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
+      unsigned int i = IntOfExt(e);
+      if(low < fIntParameters[i])
+         fIntParameters[i] = Ext2int(e, fIntParameters[i]);
+      else
+         fIntParameters[i] = Ext2int(e, low + 0.1 * Parameter(e).Error() );
+   }
+}
+
+void MnUserParameterState::RemoveLimits(unsigned int e) {
+   // remove limit for parameter e (external index)
+   fParameters.RemoveLimits(e);
+   fCovarianceValid = false;
+   fGCCValid = false;
+   if(!Parameter(e).IsFixed() && !Parameter(e).IsConst())
+      fIntParameters[IntOfExt(e)] = Value(e);
+}
+
+double MnUserParameterState::Value(unsigned int i) const {
+   // get value for parameter e (external index)
+   return fParameters.Value(i);
+}
+double MnUserParameterState::Error(unsigned int i) const {
+   // get error for parameter e (external index)
+   return fParameters.Error(i);
+}
+
+//interaction via name of Parameter
+
+void MnUserParameterState::Fix(const std::string & name) { Fix(Index(name));}
+
+void MnUserParameterState::Release(const std::string & name) {Release(Index(name));}
+
+void MnUserParameterState::SetValue(const std::string & name, double val) {SetValue(Index(name), val);}
+
+void MnUserParameterState::SetError(const std::string & name, double val) { SetError(Index(name), val);}
+
+void MnUserParameterState::SetLimits(const std::string & name, double low, double up) {SetLimits(Index(name), low, up);}
+
+void MnUserParameterState::SetUpperLimit(const std::string & name, double up) { SetUpperLimit(Index(name), up);}
+
+void MnUserParameterState::SetLowerLimit(const std::string & name, double low) {SetLowerLimit(Index(name), low);}
+
+void MnUserParameterState::RemoveLimits(const std::string & name) {RemoveLimits(Index(name));}
+
+double MnUserParameterState::Value(const std::string & name) const {return Value(Index(name));}
+
+double MnUserParameterState::Error(const std::string & name) const {return Error(Index(name));}
+
+
+unsigned int MnUserParameterState::Index(const std::string & name) const {
+   //convert name into external number of Parameter
+   return fParameters.Index(name);
+}
+
+const char* MnUserParameterState::Name(unsigned int i) const {
+   //convert external number into name of Parameter (API returing a const char *)
+   return fParameters.Name(i);
+}
+const std::string & MnUserParameterState::GetName(unsigned int i) const {
+   //convert external number into name of Parameter (new interface returning a string)
+   return fParameters.GetName(i);
+}
+
+// transformation internal <-> external (forward to transformation class)
+
+double MnUserParameterState::Int2ext(unsigned int i, double val) const {
+   // internal to external value
+   return fParameters.Trafo().Int2ext(i, val);
+}
+double MnUserParameterState::Ext2int(unsigned int e, double val) const {
+    // external  to internal value
+   return fParameters.Trafo().Ext2int(e, val);
+}
+unsigned int MnUserParameterState::IntOfExt(unsigned int ext) const {
+   // return internal index for external index ext
+   return fParameters.Trafo().IntOfExt(ext);
+}
+unsigned int MnUserParameterState::ExtOfInt(unsigned int internal) const {
+    // return external index for internal index internal
+   return fParameters.Trafo().ExtOfInt(internal);
+}
+unsigned int MnUserParameterState::VariableParameters() const {
+   // return number of variable parameters
+   return fParameters.Trafo().VariableParameters();
+}
+const MnMachinePrecision& MnUserParameterState::Precision() const {
+   // return global parameter precision
+   return fParameters.Precision();
+}
+
+void MnUserParameterState::SetPrecision(double eps) {
+   // set global parameter precision
+   fParameters.SetPrecision(eps);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserParameters.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserParameters.cxx
new file mode 100644
index 0000000..ef0cdd3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserParameters.cxx
@@ -0,0 +1,188 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnUserParameters.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MnUserParameters::MnUserParameters(const std::vector<double>& par, const std::vector<double>& err) : fTransformation(par, err) {}
+
+// all implemented forwarding to MnUserTransformation class
+
+const std::vector<MinuitParameter>& MnUserParameters::Parameters() const {
+   // return vector of MinuitParameter objects
+   return fTransformation.Parameters();
+}
+
+std::vector<double> MnUserParameters::Params() const {
+   // return std::vector of double with parameter values
+   return fTransformation.Params();
+}
+
+std::vector<double> MnUserParameters::Errors() const {
+   // return std::vector of double with parameter errors
+   return fTransformation.Errors();
+}
+
+const MinuitParameter& MnUserParameters::Parameter(unsigned int n) const {
+   // return the MinuitParameter object for index n (external)
+   return fTransformation.Parameter(n);
+}
+
+bool MnUserParameters::Add(const std::string & name, double val, double err) {
+   // add a new unlimited parameter giving name, value and err (step size)
+   // return false if parameter already exists
+   return fTransformation.Add(name, val, err);
+}
+
+bool  MnUserParameters::Add(const std::string & name, double val, double err, double low, double up) {
+   // add a new limited parameter giving name, value, err (step size) and lower/upper limits
+   // return false if parameter already exists
+   return fTransformation.Add(name, val, err, low, up);
+}
+
+bool  MnUserParameters::Add(const std::string & name, double val) {
+   // add a new unlimited parameter giving name and value
+   // return false if parameter already exists
+   return fTransformation.Add(name, val);
+}
+
+void MnUserParameters::Fix(unsigned int n) {
+   // fix parameter n
+   fTransformation.Fix(n);
+}
+
+void MnUserParameters::Release(unsigned int n) {
+   // release parameter n
+   fTransformation.Release(n);
+}
+
+void MnUserParameters::RemoveLimits(unsigned int n) {
+   // remove limits for parameter n
+   fTransformation.RemoveLimits(n);
+}
+
+void MnUserParameters::SetValue(unsigned int n, double val) {
+   // set value for parameter n
+   fTransformation.SetValue(n, val);
+}
+
+void MnUserParameters::SetError(unsigned int n, double err) {
+   // set error for parameter n
+   fTransformation.SetError(n, err);
+}
+
+void MnUserParameters::SetLimits(unsigned int n, double low, double up) {
+   // set limits (lower/upper) for parameter n
+   fTransformation.SetLimits(n, low, up);
+}
+
+void MnUserParameters::SetUpperLimit(unsigned int n, double up) {
+   // set upper limit for parameter n
+   fTransformation.SetUpperLimit(n, up);
+}
+
+void MnUserParameters::SetLowerLimit(unsigned int n, double low) {
+   // set lower limit for parameter n
+   fTransformation.SetLowerLimit(n, low);
+}
+
+void MnUserParameters::SetName(unsigned int n, const std::string & name) {
+   // set name for parameter n
+   fTransformation.SetName(n, name);
+}
+
+
+double MnUserParameters::Value(unsigned int n) const {
+   // get value for parameter n
+   return fTransformation.Value(n);
+}
+
+double MnUserParameters::Error(unsigned int n) const {
+   // get error for parameter n
+   return fTransformation.Error(n);
+}
+
+// interface using  parameter name
+
+void MnUserParameters::Fix(const std::string & name) {
+   // fix parameter
+   Fix(Index(name));
+}
+
+void MnUserParameters::Release(const std::string & name) {
+   // release parameter
+   Release(Index(name));
+}
+
+void MnUserParameters::SetValue(const std::string & name, double val) {
+   // set value for parameter
+   SetValue(Index(name), val);
+}
+
+void MnUserParameters::SetError(const std::string & name, double err) {
+   // set error
+   SetError(Index(name), err);
+}
+
+void MnUserParameters::SetLimits(const std::string & name, double low, double up) {
+   // set lower/upper limits
+   SetLimits(Index(name), low, up);
+}
+
+void MnUserParameters::SetUpperLimit(const std::string & name, double up) {
+   // set upper limit
+   fTransformation.SetUpperLimit(Index(name), up);
+}
+
+void MnUserParameters::SetLowerLimit(const std::string & name, double low) {
+   // set lower limit
+   fTransformation.SetLowerLimit(Index(name), low);
+}
+
+void MnUserParameters::RemoveLimits(const std::string & name) {
+   // remove limits
+   RemoveLimits(Index(name));
+}
+
+double MnUserParameters::Value(const std::string & name) const {
+   // get parameter value
+   return Value(Index(name));
+}
+
+double MnUserParameters::Error(const std::string & name) const {
+   // get parameter error
+   return Error(Index(name));
+}
+
+unsigned int MnUserParameters::Index(const std::string & name) const {
+   // get index (external) corresponding to name
+   return fTransformation.Index(name);
+}
+
+const std::string & MnUserParameters::GetName(unsigned int n) const {
+   // get name corresponding to index (external)
+   return fTransformation.GetName(n);
+}
+const char* MnUserParameters::Name(unsigned int n) const {
+   // get name corresponding to index (external)
+   return fTransformation.Name(n);
+}
+
+const MnMachinePrecision& MnUserParameters::Precision() const {
+   // get global paramter precision
+   return fTransformation.Precision();
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserTransformation.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserTransformation.cxx
new file mode 100644
index 0000000..87a28ca
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/MnUserTransformation.cxx
@@ -0,0 +1,457 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/MnUserCovariance.h"
+
+#include <algorithm>
+#include <stdio.h>
+#include <string>
+#include <sstream>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+class MnParStr {
+
+public:
+
+   MnParStr(const std::string & name) : fName(name) {}
+
+   ~MnParStr() {}
+
+   bool operator()(const MinuitParameter& par) const {
+//      return (strcmp(par.Name(), fName) == 0);
+      return par.GetName() == fName;
+   }
+
+private:
+   const std::string & fName;
+};
+
+
+MnUserTransformation::MnUserTransformation(const std::vector<double>& par, const std::vector<double>& err) : fPrecision(MnMachinePrecision()), fParameters(std::vector<MinuitParameter>()), fExtOfInt(std::vector<unsigned int>()), fDoubleLimTrafo(SinParameterTransformation()),fUpperLimTrafo(SqrtUpParameterTransformation()), fLowerLimTrafo(SqrtLowParameterTransformation()), fCache(std::vector<double>()) {
+   // constructor from a vector of parameter values and a vector of errors (step  sizes)
+   // class has as data member the transformation objects (all of the types),
+   // the std::vector of MinuitParameter objects and the vector with the index conversions from
+   // internal to external (fExtOfInt)
+
+   fParameters.reserve(par.size());
+   fExtOfInt.reserve(par.size());
+   fCache.reserve(par.size());
+
+   std::string parName;
+   for(unsigned int i = 0; i < par.size(); i++) {
+      std::ostringstream buf;
+      buf << "p" << i;
+      parName = buf.str();
+      Add(parName, par[i], err[i]);
+   }
+}
+
+//#ifdef MINUIT2_THREAD_SAFE
+//  this if a thread-safe implementation needed if want to share transformation object between the threads
+std::vector<double> MnUserTransformation::operator()(const MnAlgebraicVector& pstates ) const {
+   // transform an internal  Minuit vector of internal values in a std::vector of external values
+   // fixed parameters will have their fixed values
+   unsigned int n = pstates.size();
+   // need to initialize to the stored (initial values) parameter  values for the fixed ones
+   std::vector<double> pcache( fCache );
+   for(unsigned int i = 0; i < n; i++) {
+      if(fParameters[fExtOfInt[i]].HasLimits()) {
+         pcache[fExtOfInt[i]] = Int2ext(i, pstates(i));
+      } else {
+         pcache[fExtOfInt[i]] = pstates(i);
+      }
+   }
+   return pcache;
+}
+
+// #else
+// const std::vector<double> & MnUserTransformation::operator()(const MnAlgebraicVector& pstates) const {
+//    // transform an internal  Minuit vector of internal values in a std::vector of external values
+//    // std::vector<double> Cache(pstates.size() );
+//    for(unsigned int i = 0; i < pstates.size(); i++) {
+//       if(fParameters[fExtOfInt[i]].HasLimits()) {
+//          fCache[fExtOfInt[i]] = Int2ext(i, pstates(i));
+//       } else {
+//          fCache[fExtOfInt[i]] = pstates(i);
+//       }
+//    }
+
+//    return fCache;
+// }
+// #endif
+
+double MnUserTransformation::Int2ext(unsigned int i, double val) const {
+   // return external value from internal value for parameter i
+   if(fParameters[fExtOfInt[i]].HasLimits()) {
+      if(fParameters[fExtOfInt[i]].HasUpperLimit() && fParameters[fExtOfInt[i]].HasLowerLimit())
+         return fDoubleLimTrafo.Int2ext(val, fParameters[fExtOfInt[i]].UpperLimit(), fParameters[fExtOfInt[i]].LowerLimit());
+      else if(fParameters[fExtOfInt[i]].HasUpperLimit() && !fParameters[fExtOfInt[i]].HasLowerLimit())
+         return fUpperLimTrafo.Int2ext(val, fParameters[fExtOfInt[i]].UpperLimit());
+      else
+         return fLowerLimTrafo.Int2ext(val, fParameters[fExtOfInt[i]].LowerLimit());
+   }
+
+   return val;
+}
+
+double MnUserTransformation::Int2extError(unsigned int i, double val, double err) const {
+   // return external error from internal error for parameter i
+
+   //err = sigma Value == sqrt(cov(i,i))
+   double dx = err;
+
+   if(fParameters[fExtOfInt[i]].HasLimits()) {
+      double ui = Int2ext(i, val);
+      double du1 = Int2ext(i, val+dx) - ui;
+      double du2 = Int2ext(i, val-dx) - ui;
+      if(fParameters[fExtOfInt[i]].HasUpperLimit() && fParameters[fExtOfInt[i]].HasLowerLimit()) {
+         //       double al = fParameters[fExtOfInt[i]].Lower();
+         //       double ba = fParameters[fExtOfInt[i]].Upper() - al;
+         //       double du1 = al + 0.5*(sin(val + dx) + 1.)*ba - ui;
+         //       double du2 = al + 0.5*(sin(val - dx) + 1.)*ba - ui;
+         //       if(dx > 1.) du1 = ba;
+         if(dx > 1.) du1 = fParameters[fExtOfInt[i]].UpperLimit() - fParameters[fExtOfInt[i]].LowerLimit();
+         dx = 0.5*(fabs(du1) + fabs(du2));
+      } else {
+         dx = 0.5*(fabs(du1) + fabs(du2));
+      }
+   }
+
+   return dx;
+}
+
+MnUserCovariance MnUserTransformation::Int2extCovariance(const MnAlgebraicVector& vec, const MnAlgebraicSymMatrix& cov) const {
+   // return the external covariance matrix from the internal error matrix and the internal parameter value
+   // the vector of internal parameter is needed for the derivatives (Jacobian of the transformation)
+   // Vext(i,j) = Vint(i,j) * dPext(i)/dPint(i) * dPext(j)/dPint(j)
+
+   MnUserCovariance result(cov.Nrow());
+   for(unsigned int i = 0; i < vec.size(); i++) {
+      double dxdi = 1.;
+      if(fParameters[fExtOfInt[i]].HasLimits()) {
+         //       dxdi = 0.5*fabs((fParameters[fExtOfInt[i]].Upper() - fParameters[fExtOfInt[i]].Lower())*cos(vec(i)));
+         dxdi = DInt2Ext(i, vec(i));
+      }
+      for(unsigned int j = i; j < vec.size(); j++) {
+         double dxdj = 1.;
+         if(fParameters[fExtOfInt[j]].HasLimits()) {
+            //   dxdj = 0.5*fabs((fParameters[fExtOfInt[j]].Upper() - fParameters[fExtOfInt[j]].Lower())*cos(vec(j)));
+            dxdj = DInt2Ext(j, vec(j));
+         }
+         result(i,j) = dxdi*cov(i,j)*dxdj;
+      }
+      //     double diag = Int2extError(i, vec(i), sqrt(cov(i,i)));
+      //     result(i,i) = diag*diag;
+   }
+
+   return result;
+}
+
+double MnUserTransformation::Ext2int(unsigned int i, double val) const {
+   // return the internal value for parameter i with external value val
+
+   if(fParameters[i].HasLimits()) {
+      if(fParameters[i].HasUpperLimit() && fParameters[i].HasLowerLimit())
+         return fDoubleLimTrafo.Ext2int(val, fParameters[i].UpperLimit(), fParameters[i].LowerLimit(), Precision());
+      else if(fParameters[i].HasUpperLimit() && !fParameters[i].HasLowerLimit())
+         return fUpperLimTrafo.Ext2int(val, fParameters[i].UpperLimit(), Precision());
+      else
+         return fLowerLimTrafo.Ext2int(val, fParameters[i].LowerLimit(), Precision());
+   }
+
+   return val;
+}
+
+double MnUserTransformation::DInt2Ext(unsigned int i, double val) const {
+   // return the derivative of the int->ext transformation: dPext(i) / dPint(i)
+   // for the parameter i with value val
+
+   double dd = 1.;
+   if(fParameters[fExtOfInt[i]].HasLimits()) {
+      if(fParameters[fExtOfInt[i]].HasUpperLimit() && fParameters[fExtOfInt[i]].HasLowerLimit())
+         //       dd = 0.5*fabs((fParameters[fExtOfInt[i]].Upper() - fParameters[fExtOfInt[i]].Lower())*cos(vec(i)));
+         dd = fDoubleLimTrafo.DInt2Ext(val, fParameters[fExtOfInt[i]].UpperLimit(), fParameters[fExtOfInt[i]].LowerLimit());
+      else if(fParameters[fExtOfInt[i]].HasUpperLimit() && !fParameters[fExtOfInt[i]].HasLowerLimit())
+         dd = fUpperLimTrafo.DInt2Ext(val, fParameters[fExtOfInt[i]].UpperLimit());
+      else
+         dd = fLowerLimTrafo.DInt2Ext(val, fParameters[fExtOfInt[i]].LowerLimit());
+   }
+
+   return dd;
+}
+
+/*
+ double MnUserTransformation::dExt2Int(unsigned int, double) const {
+    double dd = 1.;
+
+    if(fParameters[fExtOfInt[i]].HasLimits()) {
+       if(fParameters[fExtOfInt[i]].HasUpperLimit() && fParameters[fExtOfInt[i]].HasLowerLimit())
+          //       dd = 0.5*fabs((fParameters[fExtOfInt[i]].Upper() - fParameters[fExtOfInt[i]].Lower())*cos(vec(i)));
+          dd = fDoubleLimTrafo.dExt2Int(val, fParameters[fExtOfInt[i]].UpperLimit(), fParameters[fExtOfInt[i]].LowerLimit());
+       else if(fParameters[fExtOfInt[i]].HasUpperLimit() && !fParameters[fExtOfInt[i]].HasLowerLimit())
+          dd = fUpperLimTrafo.dExt2Int(val, fParameters[fExtOfInt[i]].UpperLimit());
+       else
+          dd = fLowerLimTrafo.dExtInt(val, fParameters[fExtOfInt[i]].LowerLimit());
+    }
+
+    return dd;
+ }
+ */
+
+unsigned int MnUserTransformation::IntOfExt(unsigned int ext) const {
+   // return internal index given external one ext
+   assert(ext < fParameters.size());
+   assert(!fParameters[ext].IsFixed());
+   assert(!fParameters[ext].IsConst());
+   std::vector<unsigned int>::const_iterator iind = std::find(fExtOfInt.begin(), fExtOfInt.end(), ext);
+   assert(iind != fExtOfInt.end());
+
+   return (iind - fExtOfInt.begin());
+}
+
+std::vector<double> MnUserTransformation::Params() const {
+   // return std::vector of double with parameter values
+   unsigned int n = fParameters.size();
+   std::vector<double> result(n);
+   for(unsigned int i = 0; i < n; ++i)
+      result[i] = fParameters[i].Value();
+
+   return result;
+}
+
+std::vector<double> MnUserTransformation::Errors() const {
+   // return std::vector of double with parameter errors
+   std::vector<double> result; result.reserve(fParameters.size());
+   for(std::vector<MinuitParameter>::const_iterator ipar = Parameters().begin();
+       ipar != Parameters().end(); ipar++)
+      result.push_back((*ipar).Error());
+
+   return result;
+}
+
+const MinuitParameter& MnUserTransformation::Parameter(unsigned int n) const {
+   // return the MinuitParameter object for index n (external)
+   assert(n < fParameters.size());
+   return fParameters[n];
+}
+
+// bool MnUserTransformation::Remove(const std::string & name) {
+//    // remove parameter with name
+//    // useful if want to re-define a parameter
+//    // return false if parameter does not exist
+//    std::vector<MinuitParameter>::iterator itr = std::find_if(fParameters.begin(), fParameters.end(), MnParStr(name) );
+//    if (itr == fParameters.end() ) return false;
+//    int n = itr - fParameters.begin();
+//    if (n < 0 || n >= fParameters.size() ) return false;
+//    fParameters.erase(itr);
+//    fCache.erase( fExtOfInt.begin() + n);
+//    std::vector<unsigned int>::iterator iind = std::find(fExtOfInt.begin(), fExtOfInt.end(), n);
+//    if (iind != fExtOfInt.end()) fExtOfInt.erase(iind);
+// }
+
+bool MnUserTransformation::Add(const std::string & name, double val, double err) {
+   // add a new unlimited parameter giving name, value and err (step size)
+   // return false if parameter already exists
+   if (std::find_if(fParameters.begin(), fParameters.end(), MnParStr(name)) != fParameters.end() )
+      return false;
+   fExtOfInt.push_back(fParameters.size());
+   fCache.push_back(val);
+   fParameters.push_back(MinuitParameter(fParameters.size(), name, val, err));
+   return true;
+}
+
+bool MnUserTransformation::Add(const std::string & name, double val, double err, double low, double up) {
+   // add a new limited parameter giving name, value, err (step size) and lower/upper limits
+   // return false if parameter already exists
+   if (std::find_if(fParameters.begin(), fParameters.end(), MnParStr(name)) != fParameters.end() )
+      return false;
+   fExtOfInt.push_back(fParameters.size());
+   fCache.push_back(val);
+   fParameters.push_back(MinuitParameter(fParameters.size(), name, val, err, low, up));
+   return true;
+}
+
+bool MnUserTransformation::Add(const std::string & name, double val) {
+   // add a new constant parameter giving name and value
+   // return false if parameter already exists
+   if (std::find_if(fParameters.begin(), fParameters.end(), MnParStr(name)) != fParameters.end() )
+      return false;
+   fCache.push_back(val);
+   // costant parameter - do not add in list of internals (fExtOfInt)
+   fParameters.push_back(MinuitParameter(fParameters.size(), name, val));
+   return true;
+}
+
+void MnUserTransformation::Fix(unsigned int n) {
+  // fix parameter n (external index)
+   assert(n < fParameters.size());
+   std::vector<unsigned int>::iterator iind = std::find(fExtOfInt.begin(), fExtOfInt.end(), n);
+   if (iind != fExtOfInt.end())
+      fExtOfInt.erase(iind, iind+1);
+   fParameters[n].Fix();
+}
+
+void MnUserTransformation::Release(unsigned int n) {
+   // release parameter n (external index)
+   assert(n < fParameters.size());
+   std::vector<unsigned int>::const_iterator iind = std::find(fExtOfInt.begin(), fExtOfInt.end(), n);
+   if (iind == fExtOfInt.end() ) {
+      fExtOfInt.push_back(n);
+      std::sort(fExtOfInt.begin(), fExtOfInt.end());
+   }
+   fParameters[n].Release();
+}
+
+void MnUserTransformation::SetValue(unsigned int n, double val) {
+   // set value for parameter n (external index)
+   assert(n < fParameters.size());
+   fParameters[n].SetValue(val);
+   fCache[n] = val;
+}
+
+void MnUserTransformation::SetError(unsigned int n, double err) {
+   // set error for parameter n (external index)
+   assert(n < fParameters.size());
+   fParameters[n].SetError(err);
+}
+
+void MnUserTransformation::SetLimits(unsigned int n, double low, double up) {
+   // set limits (lower/upper) for parameter n (external index)
+   assert(n < fParameters.size());
+   assert(low != up);
+   fParameters[n].SetLimits(low, up);
+}
+
+void MnUserTransformation::SetUpperLimit(unsigned int n, double up) {
+   // set upper limit for parameter n (external index)
+   assert(n < fParameters.size());
+   fParameters[n].SetUpperLimit(up);
+}
+
+void MnUserTransformation::SetLowerLimit(unsigned int n, double lo) {
+   // set lower limit for parameter n (external index)
+   assert(n < fParameters.size());
+   fParameters[n].SetLowerLimit(lo);
+}
+
+void MnUserTransformation::RemoveLimits(unsigned int n) {
+   // remove limits for parameter n (external index)
+   assert(n < fParameters.size());
+   fParameters[n].RemoveLimits();
+}
+
+void MnUserTransformation::SetName(unsigned int n, const std::string & name) {
+   // set name for parameter n (external index)
+   assert(n < fParameters.size());
+   fParameters[n].SetName(name);
+}
+
+
+double MnUserTransformation::Value(unsigned int n) const {
+   // get value for parameter n (external index)
+   assert(n < fParameters.size());
+   return fParameters[n].Value();
+}
+
+double MnUserTransformation::Error(unsigned int n) const {
+   // get error for parameter n (external index)
+   assert(n < fParameters.size());
+   return fParameters[n].Error();
+}
+
+// interface by parameter name
+
+void MnUserTransformation::Fix(const std::string & name) {
+   // fix parameter
+   Fix(Index(name));
+}
+
+void MnUserTransformation::Release(const std::string & name) {
+   // release parameter
+   Release(Index(name));
+}
+
+void MnUserTransformation::SetValue(const std::string & name, double val) {
+   // set value for parameter
+   SetValue(Index(name), val);
+}
+
+void MnUserTransformation::SetError(const std::string & name, double err) {
+   // set error
+   SetError(Index(name), err);
+}
+
+void MnUserTransformation::SetLimits(const std::string & name, double low, double up) {
+   // set lower/upper limits
+   SetLimits(Index(name), low, up);
+}
+
+void MnUserTransformation::SetUpperLimit(const std::string & name, double up) {
+   // set upper limit
+   SetUpperLimit(Index(name), up);
+}
+
+void MnUserTransformation::SetLowerLimit(const std::string & name, double lo) {
+   // set lower limit
+   SetLowerLimit(Index(name), lo);
+}
+
+void MnUserTransformation::RemoveLimits(const std::string & name) {
+   // remove limits
+   RemoveLimits(Index(name));
+}
+
+double MnUserTransformation::Value(const std::string & name) const {
+   // get parameter value
+   return Value(Index(name));
+}
+
+double MnUserTransformation::Error(const std::string & name) const {
+   // get parameter error
+   return Error(Index(name));
+}
+
+unsigned int MnUserTransformation::Index(const std::string & name) const {
+   // get index (external) corresponding to name
+   std::vector<MinuitParameter>::const_iterator ipar =
+   std::find_if(fParameters.begin(), fParameters.end(), MnParStr(name));
+   assert(ipar != fParameters.end());
+   //   return (ipar - fParameters.begin());
+   return (*ipar).Number();
+}
+
+int MnUserTransformation::FindIndex(const std::string & name) const {
+   // find index (external) corresponding to name - return -1 if not found
+   std::vector<MinuitParameter>::const_iterator ipar =
+   std::find_if(fParameters.begin(), fParameters.end(), MnParStr(name));
+   if (ipar == fParameters.end() ) return -1;
+   return (*ipar).Number();
+}
+
+
+const std::string & MnUserTransformation::GetName(unsigned int n) const {
+   // get name corresponding to index (external)
+   assert(n < fParameters.size());
+   return fParameters[n].GetName();
+}
+
+const char* MnUserTransformation::Name(unsigned int n) const {
+   // get name corresponding to index (external)
+   return GetName(n).c_str();
+}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/ModularFunctionMinimizer.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/ModularFunctionMinimizer.cxx
new file mode 100644
index 0000000..6aaaa70
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/ModularFunctionMinimizer.cxx
@@ -0,0 +1,174 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/ModularFunctionMinimizer.h"
+#include "Minuit2/MinimumSeedGenerator.h"
+#include "Minuit2/AnalyticalGradientCalculator.h"
+#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/MinimumBuilder.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnUserParameters.h"
+#include "Minuit2/MnUserCovariance.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/MnUserFcn.h"
+#include "Minuit2/FCNBase.h"
+#include "Minuit2/FCNGradientBase.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnHesse.h"
+#include "Minuit2/MnLineSearch.h"
+#include "Minuit2/MnParabolaPoint.h"
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+// #include "Minuit2/MnUserParametersPrint.h"
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra, unsigned int maxfcn, double toler) const {
+   // minimize from FCNBase and std::vector of double's for parameter values and errors (step sizes)
+   MnUserParameterState st(par, err);
+   MnStrategy strategy(stra);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra, unsigned int maxfcn, double toler) const {
+   // minimize from FCNGradientBase (use analytical gradient provided in FCN)
+   // and std::vector of double's for parameter values and errors (step sizes)
+   MnUserParameterState st(par, err);
+   MnStrategy strategy(stra);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+// move nrow before cov to avoid ambiguities when using default parameters
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov, unsigned int stra, unsigned int maxfcn, double toler) const {
+   // minimize from FCNBase using std::vector for parameter error and
+   // an std::vector of size n*(n+1)/2 for the covariance matrix  and n (rank of cov matrix)
+
+   MnUserParameterState st(par, cov, nrow);
+   MnStrategy strategy(stra);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov, unsigned int stra, unsigned int maxfcn, double toler) const {
+   // minimize from FCNGradientBase (use analytical gradient provided in FCN)
+   // using std::vector for parameter error and
+   // an std::vector of size n*(n+1)/2 for the covariance matrix  and n (rank of cov matrix)
+
+   MnUserParameterState st(par, cov, nrow);
+   MnStrategy strategy(stra);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const MnUserParameters& upar, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // minimize from FCNBase and MnUserParameters object
+
+   MnUserParameterState st(upar);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameters& upar, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // minimize from FCNGradientBase (use analytical gradient provided in FCN)  and MnUserParameters object
+
+   MnUserParameterState st(upar);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const MnUserParameters& upar, const MnUserCovariance& cov, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // minimize from FCNBase and MnUserParameters and MnUserCovariance objects
+
+   MnUserParameterState st(upar, cov);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameters& upar, const MnUserCovariance& cov, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // minimize from FCNGradientBase (use analytical gradient provided in FCN)  and
+   // MnUserParameters MnUserCovariance objects
+
+   MnUserParameterState st(upar, cov);
+   return Minimize(fcn, st, strategy, maxfcn, toler);
+}
+
+
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // minimize from a FCNBase and a MnUserparameterState - interface used by all the previous ones
+   // based on FCNBase. Create in this case a NumericalGradient calculator
+   // Create the minuit FCN wrapper (MnUserFcn) containing the trasformation (int<->ext)
+
+   // neeed MnUsserFcn for difference int-ext parameters
+   MnUserFcn mfcn(fcn, st.Trafo() );
+   Numerical2PGradientCalculator gc(mfcn, st.Trafo(), strategy);
+
+   unsigned int npar = st.VariableParameters();
+   if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
+   MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
+
+   return Minimize(mfcn, gc, mnseeds, strategy, maxfcn, toler);
+}
+
+
+// use Gradient here
+FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // minimize from a FCNGradientBase and a MnUserparameterState - interface used by all the previous ones
+   // based on FCNGradientBase.
+   // Create in this acase an AnalyticalGradient calculator
+   // Create the minuit FCN wrapper (MnUserFcn) containing the trasformation (int<->ext)
+
+   MnUserFcn mfcn(fcn, st.Trafo());
+   AnalyticalGradientCalculator gc(fcn, st.Trafo());
+
+   unsigned int npar = st.VariableParameters();
+   if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
+
+   MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
+
+   return Minimize(mfcn, gc, mnseeds, strategy, maxfcn, toler);
+}
+
+
+FunctionMinimum ModularFunctionMinimizer::Minimize(const MnFcn& mfcn, const GradientCalculator& gc, const MinimumSeed& seed, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
+   // Interface used by all the others for the minimization using the base MinimumBuilder class
+   // According to the contained type of MinimumBuilder the right type will be used
+
+   const MinimumBuilder & mb = Builder();
+   //std::cout << typeid(&mb).Name() << std::endl;
+   double effective_toler = toler * mfcn.Up();   // scale tolerance with Up()
+   // avoid tolerance too smalls (than limits)
+   double eps = MnMachinePrecision().Eps2();
+   if (effective_toler < eps) effective_toler = eps;
+
+   // check if maxfcn is already exhausted
+   // case already reached call limit
+   if(mfcn.NumOfCalls() >= maxfcn) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("ModularFunctionMinimizer: Stop before iterating - call limit already exceeded");
+#endif
+      return FunctionMinimum(seed, std::vector<MinimumState>(1, seed.State()), mfcn.Up(), FunctionMinimum::MnReachedCallLimit());
+   }
+
+
+
+
+   return mb.Minimum(mfcn, gc, seed, strategy, maxfcn, effective_toler);
+}
+
+
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/NegativeG2LineSearch.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/NegativeG2LineSearch.cxx
new file mode 100644
index 0000000..d6a05c4
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/NegativeG2LineSearch.cxx
@@ -0,0 +1,136 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/NegativeG2LineSearch.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/GradientCalculator.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MnLineSearch.h"
+#include "Minuit2/MnParabolaPoint.h"
+#include "Minuit2/VariableMetricEDMEstimator.h"
+
+#include <cmath>
+//#define DEBUG
+#ifdef DEBUG
+#include <iostream>
+#endif
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+
+MinimumState NegativeG2LineSearch::operator()(const MnFcn& fcn, const MinimumState& st, const  GradientCalculator& gc, const MnMachinePrecision& prec) const {
+
+//   when the second derivatives are negative perform a  line search  along Parameter which gives
+//   negative second derivative and magnitude  equal to the Gradient step size.
+//   Recalculate the gradients for all the Parameter after the correction and
+//   continue iteration in case the second derivatives are still negative
+//
+
+   bool negG2 = HasNegativeG2(st.Gradient(), prec);
+   if(!negG2) return st;
+
+   unsigned int n = st.Parameters().Vec().size();
+   FunctionGradient dgrad = st.Gradient();
+   MinimumParameters pa = st.Parameters();
+   bool iterate = false;
+   unsigned int iter = 0;
+   do {
+      iterate = false;
+      for(unsigned int i = 0; i < n; i++) {
+
+#ifdef DEBUG
+         std::cout << "negative G2 - iter " << iter << " param " << i << "   " << pa.Vec()(i) << "  grad2 " << dgrad.G2()(i) << " grad " << dgrad.Vec()(i)
+                   << " grad step " << dgrad.Gstep()(i) << " step size " << pa.Dirin()(i) << std::endl;
+#endif
+         if(dgrad.G2()(i) <= 0) {
+
+            // check also the gradient (if it is zero ) I can skip the param)
+
+            if ( std::fabs(dgrad.Vec()(i) ) < prec.Eps() && std::fabs(dgrad.G2()(i) ) < prec.Eps() ) continue;
+            //       if(dgrad.G2()(i) < prec.Eps()) {
+            // do line search if second derivative negative
+            MnAlgebraicVector step(n);
+            MnLineSearch lsearch;
+
+            if ( dgrad.Vec()(i) < 0)
+               step(i) = dgrad.Gstep()(i); //*dgrad.Vec()(i);
+            else
+               step(i) = - dgrad.Gstep()(i); // *dgrad.Vec()(i);
+
+            double gdel = step(i)*dgrad.Vec()(i);
+
+            // if using sec derivative information
+            // double g2del = step(i)*step(i) * dgrad.G2()(i);
+            bool debugLS = false;
+
+#ifdef DEBUG
+            std::cout << "step(i) " << step(i) << " gdel " << gdel << std::endl;
+//            std::cout << " g2del " << g2del << std::endl;
+            debugLS = true;
+#endif
+            MnParabolaPoint pp = lsearch(fcn, pa, step, gdel, prec,debugLS);
+
+
+
+#ifdef DEBUG
+            std::cout << "\nLine search result " << pp.X() << " f(0)  " << pa.Fval() << " f(1) " << pp.Y() << std::endl;
+#endif
+
+            step *= pp.X();
+            pa = MinimumParameters(pa.Vec() + step, pp.Y());
+
+            dgrad = gc(pa, dgrad);
+
+#ifdef DEBUG
+            std::cout << "Line search - iter" << iter << " param " << i << "   " << pa.Vec()(i) << " step " << step(i) << " new grad2 " << dgrad.G2()(i) << " new grad " <<  dgrad.Vec()(i) << " grad step " << dgrad.Gstep()(i) << std::endl;
+#endif
+
+            iterate = true;
+            break;
+            }
+         }
+      } while(iter++ < 2*n && iterate);
+
+   MnAlgebraicSymMatrix mat(n);
+   for(unsigned int i = 0; i < n; i++)
+      mat(i,i) = (fabs(dgrad.G2()(i)) > prec.Eps2() ? 1./dgrad.G2()(i) : 1.);
+
+   MinimumError err(mat, 1.);
+   double edm = VariableMetricEDMEstimator().Estimate(dgrad, err);
+
+   return MinimumState(pa, err, dgrad, edm, fcn.NumOfCalls());
+}
+
+bool NegativeG2LineSearch::HasNegativeG2(const FunctionGradient& grad, const MnMachinePrecision& /*prec */ ) const {
+   // check if function gradient has any component which is neegative
+
+   for(unsigned int i = 0; i < grad.Vec().size(); i++)
+
+      if(grad.G2()(i) <= 0 ) {
+
+         return true;
+      }
+
+   return false;
+}
+
+
+
+
+
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/Numerical2PGradientCalculator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/Numerical2PGradientCalculator.cxx
new file mode 100644
index 0000000..4c1a59e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/Numerical2PGradientCalculator.cxx
@@ -0,0 +1,254 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/InitialGradientCalculator.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MnUserTransformation.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MinimumParameters.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MnStrategy.h"
+
+
+//#define DEBUG
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#ifdef _OPENMP
+#include <omp.h>
+#include <iomanip>
+#ifdef DEBUG
+#define DEBUG_MP
+#endif
+#endif
+#endif
+
+#include <math.h>
+
+#include "Minuit2/MPIProcess.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+FunctionGradient Numerical2PGradientCalculator::operator()(const MinimumParameters& par) const {
+   // calculate gradient using Initial gradient calculator and from MinimumParameters object
+
+   InitialGradientCalculator gc(fFcn, fTransformation, fStrategy);
+   FunctionGradient gra = gc(par);
+
+   return (*this)(par, gra);
+}
+
+
+// comment it, because it was added
+FunctionGradient Numerical2PGradientCalculator::operator()(const std::vector<double>& params) const {
+   // calculate gradient from an std;:vector of paramteters
+
+   int npar = params.size();
+
+   MnAlgebraicVector par(npar);
+   for (int i = 0; i < npar; ++i) {
+      par(i) = params[i];
+   }
+
+   double fval = Fcn()(par);
+
+   MinimumParameters minpars = MinimumParameters(par, fval);
+
+   return (*this)(minpars);
+
+}
+
+
+
+FunctionGradient Numerical2PGradientCalculator::operator()(const MinimumParameters& par, const FunctionGradient& Gradient) const {
+   // calculate numerical gradient from MinimumParameters object
+   // the algorithm takes correctly care when the gradient is approximatly zero
+
+   //    std::cout<<"########### Numerical2PDerivative"<<std::endl;
+   //    std::cout<<"initial grd: "<<Gradient.Grad()<<std::endl;
+   //    std::cout<<"position: "<<par.Vec()<<std::endl;
+
+   assert(par.IsValid());
+
+
+   double fcnmin = par.Fval();
+   //   std::cout<<"fval: "<<fcnmin<<std::endl;
+
+   double eps2 = Precision().Eps2();
+   double eps = Precision().Eps();
+
+   double dfmin = 8.*eps2*(fabs(fcnmin)+Fcn().Up());
+   double vrysml = 8.*eps*eps;
+   //   double vrysml = std::max(1.e-4, eps2);
+   //    std::cout<<"dfmin= "<<dfmin<<std::endl;
+   //    std::cout<<"vrysml= "<<vrysml<<std::endl;
+   //    std::cout << " ncycle " << Ncycle() << std::endl;
+
+   unsigned int n = (par.Vec()).size();
+   unsigned int ncycle = Ncycle();
+   //   MnAlgebraicVector vgrd(n), vgrd2(n), vgstp(n);
+   MnAlgebraicVector grd = Gradient.Grad();
+   MnAlgebraicVector g2 = Gradient.G2();
+   MnAlgebraicVector gstep = Gradient.Gstep();
+
+#ifndef _OPENMP
+   MPIProcess mpiproc(n,0);
+#endif
+
+#ifdef DEBUG
+   std::cout << "Calculating Gradient at x =   " << par.Vec() << std::endl;
+   int pr = std::cout.precision(13);
+   std::cout << "fcn(x) = " << fcnmin << std::endl;
+   std::cout.precision(pr);
+#endif
+
+#ifndef _OPENMP
+   // for serial execution this can be outside the loop
+   MnAlgebraicVector x = par.Vec();
+
+   unsigned int startElementIndex = mpiproc.StartElementIndex();
+   unsigned int endElementIndex = mpiproc.EndElementIndex();
+
+   for(unsigned int i = startElementIndex; i < endElementIndex; i++) {
+
+#else
+
+ // parallelize this loop using OpenMP
+//#define N_PARALLEL_PAR 5
+#pragma omp parallel
+#pragma omp for
+//#pragma omp for schedule (static, N_PARALLEL_PAR)
+
+   for(int i = 0; i < int(n); i++) {
+
+#endif
+
+#ifdef DEBUG_MP
+      int ith = omp_get_thread_num();
+      //std::cout << "Thread number " << ith << "  " << i << std::endl;
+#endif
+
+#ifdef _OPENMP
+       // create in loop since each thread will use its own copy
+      MnAlgebraicVector x = par.Vec();
+#endif
+
+      double xtf = x(i);
+      double epspri = eps2 + fabs(grd(i)*eps2);
+      double stepb4 = 0.;
+      for(unsigned int j = 0; j < ncycle; j++)  {
+         double optstp = sqrt(dfmin/(fabs(g2(i))+epspri));
+         double step = std::max(optstp, fabs(0.1*gstep(i)));
+         //       std::cout<<"step: "<<step;
+         if(Trafo().Parameter(Trafo().ExtOfInt(i)).HasLimits()) {
+            if(step > 0.5) step = 0.5;
+         }
+         double stpmax = 10.*fabs(gstep(i));
+         if(step > stpmax) step = stpmax;
+         //       std::cout<<" "<<step;
+         double stpmin = std::max(vrysml, 8.*fabs(eps2*x(i)));
+         if(step < stpmin) step = stpmin;
+         //       std::cout<<" "<<step<<std::endl;
+         //       std::cout<<"step: "<<step<<std::endl;
+         if(fabs((step-stepb4)/step) < StepTolerance()) {
+            //    std::cout<<"(step-stepb4)/step"<<std::endl;
+            //    std::cout<<"j= "<<j<<std::endl;
+            //    std::cout<<"step= "<<step<<std::endl;
+            break;
+         }
+         gstep(i) = step;
+         stepb4 = step;
+         //       MnAlgebraicVector pstep(n);
+         //       pstep(i) = step;
+         //       double fs1 = Fcn()(pstate + pstep);
+         //       double fs2 = Fcn()(pstate - pstep);
+
+         x(i) = xtf + step;
+         double fs1 = Fcn()(x);
+         x(i) = xtf - step;
+         double fs2 = Fcn()(x);
+         x(i) = xtf;
+
+         double grdb4 = grd(i);
+         grd(i) = 0.5*(fs1 - fs2)/step;
+         g2(i) = (fs1 + fs2 - 2.*fcnmin)/step/step;
+
+#ifdef DEBUG
+         pr = std::cout.precision(13);
+         std::cout << "cycle " << j << " x " << x(i) << " step " << step << " f1 " << fs1 << " f2 " << fs2
+                   << " grd " << grd(i) << " g2 " << g2(i) << std::endl;
+         std::cout.precision(pr);
+#endif
+
+         if(fabs(grdb4-grd(i))/(fabs(grd(i))+dfmin/step) < GradTolerance())  {
+            //    std::cout<<"j= "<<j<<std::endl;
+            //    std::cout<<"step= "<<step<<std::endl;
+            //    std::cout<<"fs1, fs2: "<<fs1<<" "<<fs2<<std::endl;
+            //    std::cout<<"fs1-fs2: "<<fs1-fs2<<std::endl;
+            break;
+         }
+      }
+
+
+#ifdef DEBUG_MP
+#pragma omp critical
+      {
+         std::cout << "Gradient for thread " << ith << "  " << i << "  " << std::setprecision(15)  << grd(i) << "  " << g2(i) << std::endl;
+      }
+#endif
+
+      //     vgrd(i) = grd;
+      //     vgrd2(i) = g2;
+      //     vgstp(i) = gstep;
+
+
+#ifdef DEBUG
+      pr = std::cout.precision(13);
+      int iext = Trafo().ExtOfInt(i);
+      std::cout << "Parameter " << Trafo().Name(iext) << " Gradient =   " << grd(i) << " g2 = " << g2(i) << " step " << gstep(i) << std::endl;
+      std::cout.precision(pr);
+#endif
+   }
+
+#ifndef _OPENMP
+   mpiproc.SyncVector(grd);
+   mpiproc.SyncVector(g2);
+   mpiproc.SyncVector(gstep);
+#endif
+
+   return FunctionGradient(grd, g2, gstep);
+}
+
+const MnMachinePrecision& Numerical2PGradientCalculator::Precision() const {
+   // return global precision (set in transformation)
+   return fTransformation.Precision();
+}
+
+unsigned int Numerical2PGradientCalculator::Ncycle() const {
+   // return number of cycles for gradient calculation (set in strategy object)
+   return Strategy().GradientNCycles();
+}
+
+double Numerical2PGradientCalculator::StepTolerance() const {
+   // return gradient step tolerance (set in strategy object)
+   return Strategy().GradientStepTolerance();
+}
+
+double Numerical2PGradientCalculator::GradTolerance() const {
+   // return gradient tolerance (set in strategy object)
+   return Strategy().GradientTolerance();
+}
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/ParametricFunction.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/ParametricFunction.cxx
new file mode 100644
index 0000000..5cb4d2e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/ParametricFunction.cxx
@@ -0,0 +1,51 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/ParametricFunction.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/Numerical2PGradientCalculator.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MnVectorTransform.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+//#include "Minuit2/MnPrint.h"
+
+
+
+std::vector<double>  ParametricFunction::GetGradient(const std::vector<double>& x) const {
+   // calculate the numerical gradient (using Numerical2PGradientCalculator)
+
+   //LM:  this I believe is not very efficient
+   MnFcn mfcn(*this);
+
+   MnStrategy strategy(1);
+
+   // ????????? how does it know the transformation????????
+   std::vector<double> err(x.size());
+   err.assign(x.size(), 0.1);
+   // need to use parameters
+   MnUserParameterState st(x, err);
+
+   Numerical2PGradientCalculator gc(mfcn, st.Trafo(), strategy);
+   FunctionGradient g = gc(x);
+   const MnAlgebraicVector & grad = g.Vec();
+   assert( grad.size() == x.size() );
+   MnVectorTransform vt;
+   //  std::cout << "Param Function Gradient " << grad << std::endl;
+   return vt( grad );
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/ScanBuilder.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/ScanBuilder.cxx
new file mode 100644
index 0000000..cde503e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/ScanBuilder.cxx
@@ -0,0 +1,49 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/ScanBuilder.h"
+#include "Minuit2/MnParameterScan.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/MnFcn.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+FunctionMinimum ScanBuilder::Minimum(const MnFcn& mfcn, const GradientCalculator&, const MinimumSeed& seed, const MnStrategy&, unsigned int, double) const {
+   // find the function minimum performing a parameter scan (using MnParameterScan class)
+   // function gradient is not used
+   MnAlgebraicVector x = seed.Parameters().Vec();
+   MnUserParameterState upst(seed.State(), mfcn.Up(), seed.Trafo());
+   MnParameterScan scan(mfcn.Fcn(), upst.Parameters(), seed.Fval());
+   double amin = scan.Fval();
+   unsigned int n = seed.Trafo().VariableParameters();
+   MnAlgebraicVector dirin(n);
+   for(unsigned int i = 0; i < n; i++) {
+      unsigned int ext = seed.Trafo().ExtOfInt(i);
+      scan(ext);
+      if(scan.Fval() < amin) {
+         amin = scan.Fval();
+         x(i) = seed.Trafo().Ext2int(ext, scan.Parameters().Value(ext));
+      }
+      dirin(i) = sqrt(2.*mfcn.Up()*seed.Error().InvHessian()(i,i));
+   }
+
+   MinimumParameters mp(x, dirin, amin);
+   MinimumState st(mp, 0., mfcn.NumOfCalls());
+
+   return FunctionMinimum(seed, std::vector<MinimumState>(1, st), mfcn.Up());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexBuilder.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexBuilder.cxx
new file mode 100644
index 0000000..bff56a3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexBuilder.cxx
@@ -0,0 +1,227 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/SimplexBuilder.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/SimplexParameters.h"
+#include "Minuit2/MinimumState.h"
+
+#if defined(DEBUG) || defined(WARNINGMSG)
+#include "Minuit2/MnPrint.h"
+#endif
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+//#define DEBUG 1
+
+FunctionMinimum SimplexBuilder::Minimum(const MnFcn& mfcn, const GradientCalculator&, const MinimumSeed& seed, const MnStrategy&, unsigned int maxfcn, double minedm) const {
+   // find the minimum using the Simplex method of Nelder and Mead (does not use function gradient)
+   // method to find initial simplex is slightly different than in the orginal Fortran
+   // Minuit since has not been proofed that one to be better
+
+#ifdef DEBUG
+   std::cout << "Running Simplex with maxfcn = " << maxfcn << " minedm = " << minedm << std::endl;
+#endif
+
+   const MnMachinePrecision& prec = seed.Precision();
+   MnAlgebraicVector x = seed.Parameters().Vec();
+   MnAlgebraicVector step = 10.*seed.Gradient().Gstep();
+
+   unsigned int n = x.size();
+   double wg = 1./double(n);
+   double alpha = 1., beta = 0.5, gamma = 2., rhomin = 4., rhomax = 8.;
+   double rho1 = 1. + alpha;
+   //double rho2 = rho1 + alpha*gamma;
+   //change proposed by david sachs (fnal)
+   double rho2 = 1. + alpha*gamma;
+
+
+   std::vector<std::pair<double, MnAlgebraicVector> > simpl; simpl.reserve(n+1);
+   simpl.push_back(std::pair<double, MnAlgebraicVector>(seed.Fval(), x));
+
+   unsigned int jl = 0, jh = 0;
+   double amin = seed.Fval(), aming = seed.Fval();
+
+   for(unsigned int i = 0; i < n; i++) {
+      double dmin = 8.*prec.Eps2()*(fabs(x(i)) + prec.Eps2());
+      if(step(i) < dmin) step(i) = dmin;
+      x(i) += step(i);
+      double tmp = mfcn(x);
+      if(tmp < amin) {
+         amin = tmp;
+         jl = i+1;
+      }
+      if(tmp > aming) {
+         aming = tmp;
+         jh = i+1;
+      }
+      simpl.push_back(std::pair<double, MnAlgebraicVector>(tmp, x));
+      x(i) -= step(i);
+   }
+   SimplexParameters simplex(simpl, jh, jl);
+
+#ifdef DEBUG
+   std::cout << "simplex initial parameters - min  " << jl << "  " << amin << " max " << jh << "  " << aming << std::endl;
+   for (unsigned int i = 0; i < simplex.Simplex().size(); ++i)
+      std::cout << " i = " << i << " x = " << simplex(i).second << " fval(x) = " << simplex(i).first << std::endl;
+#endif
+
+   double edmPrev = simplex.Edm();
+   int niterations = 0;
+   do {
+      jl = simplex.Jl();
+      jh = simplex.Jh();
+      amin = simplex(jl).first;
+      edmPrev = simplex.Edm();
+
+#ifdef DEBUG
+      std::cout << "\n\nsimplex iteration: edm =  " << simplex.Edm()
+                << "\n--> Min Param is  " << jl << " pmin " << simplex(jl).second << " f(pmin) " << amin
+                << "\n--> Max param is " << jh << "  " << simplex(jh).first << std::endl;
+
+      //     std::cout << "ALL SIMPLEX PARAMETERS: "<< std::endl;
+      //     for (unsigned int i = 0; i < simplex.Simplex().size(); ++i)
+      //       std::cout << " i = " << i << " x = " << simplex(i).second << " fval(x) = " << simplex(i).first << std::endl;
+#endif
+
+      // trace the iterations (need to create a MinimunState although errors and gradient are not existing)
+      if (TraceIter() ) TraceIteration(niterations, MinimumState(MinimumParameters(simplex(jl).second,simplex(jl).first), simplex.Edm(), mfcn.NumOfCalls()) );
+      if (PrintLevel() > 1) MnPrint::PrintState(std::cout,simplex(jl).first, simplex.Edm(),mfcn.NumOfCalls(),"Simplex: Iteration # ", niterations);
+      niterations++;
+
+
+      MnAlgebraicVector pbar(n);
+      for(unsigned int i = 0; i < n+1; i++) {
+         if(i == jh) continue;
+         pbar += (wg*simplex(i).second);
+      }
+
+      MnAlgebraicVector pstar = (1. + alpha)*pbar - alpha*simplex(jh).second;
+      double ystar = mfcn(pstar);
+
+#ifdef DEBUG
+      std::cout << " pbar = " << pbar << std::endl;
+      std::cout << " pstar = " << pstar << " f(pstar) =  " << ystar << std::endl;
+#endif
+
+      if(ystar > amin) {
+         if(ystar < simplex(jh).first) {
+            simplex.Update(ystar, pstar);
+            if(jh != simplex.Jh()) continue;
+         }
+         MnAlgebraicVector pstst = beta*simplex(jh).second + (1. - beta)*pbar;
+         double ystst = mfcn(pstst);
+#ifdef DEBUG
+         std::cout << "Reduced simplex pstst = " << pstst << " f(pstst) =  " << ystst << std::endl;
+#endif
+         if(ystst > simplex(jh).first) break;
+         simplex.Update(ystst, pstst);
+         continue;
+      }
+
+      MnAlgebraicVector pstst = gamma*pstar + (1. - gamma)*pbar;
+      double ystst = mfcn(pstst);
+#ifdef DEBUG
+      std::cout << " pstst = " << pstst << " f(pstst) =  " << ystst << std::endl;
+#endif
+
+      double y1 = (ystar - simplex(jh).first)*rho2;
+      double y2 = (ystst - simplex(jh).first)*rho1;
+      double rho = 0.5*(rho2*y1 - rho1*y2)/(y1 - y2);
+      if(rho < rhomin) {
+         if(ystst < simplex(jl).first) simplex.Update(ystst, pstst);
+         else simplex.Update(ystar, pstar);
+         continue;
+      }
+      if(rho > rhomax) rho = rhomax;
+      MnAlgebraicVector prho = rho*pbar + (1. - rho)*simplex(jh).second;
+      double yrho = mfcn(prho);
+#ifdef DEBUG
+      std::cout << " prho = " << prho << " f(prho) =  " << yrho << std::endl;
+#endif
+      if(yrho < simplex(jl).first && yrho < ystst) {
+         simplex.Update(yrho, prho);
+         continue;
+      }
+      if(ystst < simplex(jl).first) {
+         simplex.Update(ystst, pstst);
+         continue;
+      }
+      if(yrho > simplex(jl).first) {
+         if(ystst < simplex(jl).first) simplex.Update(ystst, pstst);
+         else simplex.Update(ystar, pstar);
+         continue;
+      }
+      if(ystar > simplex(jh).first) {
+         pstst = beta*simplex(jh).second + (1. - beta)*pbar;
+         ystst = mfcn(pstst);
+         if(ystst > simplex(jh).first) break;
+         simplex.Update(ystst, pstst);
+      }
+#ifdef DEBUG
+      std::cout << "End loop : edm = " << simplex.Edm() << "  pstst = " << pstst << " f(pstst) =  " << ystst << std::endl;
+#endif
+   } while( (simplex.Edm() > minedm || edmPrev > minedm )  && mfcn.NumOfCalls() < maxfcn);
+
+   jl = simplex.Jl();
+   jh = simplex.Jh();
+   amin = simplex(jl).first;
+
+   MnAlgebraicVector pbar(n);
+   for(unsigned int i = 0; i < n+1; i++) {
+      if(i == jh) continue;
+      pbar += (wg*simplex(i).second);
+   }
+   double ybar = mfcn(pbar);
+   if(ybar < amin) simplex.Update(ybar, pbar);
+   else {
+      pbar = simplex(jl).second;
+      ybar = simplex(jl).first;
+   }
+
+   MnAlgebraicVector dirin = simplex.Dirin();
+   //   Scale to sigmas on parameters werr^2 = dirin^2 * (up/edm)
+   dirin *= sqrt(mfcn.Up()/simplex.Edm());
+
+#ifdef DEBUG
+   std::cout << "End simplex " << simplex.Edm() << "  pbar = " << pbar << " f(p) =  " << ybar << std::endl;
+#endif
+
+
+   MinimumState st(MinimumParameters(pbar, dirin, ybar), simplex.Edm(), mfcn.NumOfCalls());
+
+   if (PrintLevel() > 1)
+      MnPrint::PrintState(std::cout,st,"Simplex: Final iteration");
+   if (TraceIter() ) TraceIteration(niterations, st);
+
+   if(mfcn.NumOfCalls() > maxfcn) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("Simplex did not converge, #fcn calls exhausted.");
+#endif
+      return FunctionMinimum(seed, std::vector<MinimumState>(1, st), mfcn.Up(), FunctionMinimum::MnReachedCallLimit());
+   }
+   if(simplex.Edm() > minedm) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("Simplex did not converge, edm > minedm.");
+#endif
+      return FunctionMinimum(seed, std::vector<MinimumState>(1, st), mfcn.Up(), FunctionMinimum::MnAboveMaxEdm());
+   }
+
+   return FunctionMinimum(seed, std::vector<MinimumState>(1, st), mfcn.Up());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexParameters.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexParameters.cxx
new file mode 100644
index 0000000..8ac3279
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexParameters.cxx
@@ -0,0 +1,48 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/SimplexParameters.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+void SimplexParameters::Update(double y, const MnAlgebraicVector& p) {
+   // update the SimplexParameter object with a new value y = FCN(p)
+   fSimplexParameters[Jh()] = std::pair<double, MnAlgebraicVector>(y, p);
+   if(y < fSimplexParameters[Jl()].first) fJLow = Jh();
+
+   unsigned int jh = 0;
+   for(unsigned int i = 1; i < fSimplexParameters.size(); i++) {
+      if(fSimplexParameters[i].first > fSimplexParameters[jh].first) jh = i;
+   }
+   fJHigh = jh;
+
+   return;
+}
+
+MnAlgebraicVector SimplexParameters::Dirin() const {
+   // find simplex direction (vector from big to smaller parameter points)
+   MnAlgebraicVector dirin(fSimplexParameters.size() - 1);
+   for(unsigned int i = 0; i < fSimplexParameters.size() - 1; i++) {
+      double pbig = fSimplexParameters[0].second(i), plit = pbig;
+      for(unsigned int j = 0; j < fSimplexParameters.size(); j++){
+         if(fSimplexParameters[j].second(i) < plit) plit = fSimplexParameters[j].second(i);
+         if(fSimplexParameters[j].second(i) > pbig) pbig = fSimplexParameters[j].second(i);
+      }
+      dirin(i) = pbig - plit;
+   }
+
+   return dirin;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexSeedGenerator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexSeedGenerator.cxx
new file mode 100644
index 0000000..a68c7ce
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SimplexSeedGenerator.cxx
@@ -0,0 +1,54 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/SimplexSeedGenerator.h"
+#include "Minuit2/MnUserParameterState.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/InitialGradientCalculator.h"
+#include "Minuit2/VariableMetricEDMEstimator.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+MinimumSeed SimplexSeedGenerator::operator()(const MnFcn& fcn, const GradientCalculator&, const MnUserParameterState& st, const MnStrategy& stra) const {
+   // create starting state for Simplex, which corresponds to the initial parameter values
+   // using the simple Initial gradient calculator (does not use any FCN function calls)
+   unsigned int n = st.VariableParameters();
+   const MnMachinePrecision& prec = st.Precision();
+
+   // initial starting values
+   MnAlgebraicVector x(n);
+   for(unsigned int i = 0; i < n; i++) x(i) = st.IntParameters()[i];
+   double fcnmin = fcn(x);
+   MinimumParameters pa(x, fcnmin);
+   InitialGradientCalculator igc(fcn, st.Trafo(), stra);
+   FunctionGradient dgrad = igc(pa);
+   MnAlgebraicSymMatrix mat(n);
+   double dcovar = 1.;
+   for(unsigned int i = 0; i < n; i++)
+      mat(i,i) = (fabs(dgrad.G2()(i)) > prec.Eps2() ? 1./dgrad.G2()(i) : 1.);
+   MinimumError err(mat, dcovar);
+   double edm = VariableMetricEDMEstimator().Estimate(dgrad, err);
+   MinimumState state(pa, err, dgrad, edm, fcn.NumOfCalls());
+
+   return MinimumSeed(state, st.Trafo());
+}
+
+MinimumSeed SimplexSeedGenerator::operator()(const MnFcn& fcn, const AnalyticalGradientCalculator& gc, const MnUserParameterState& st, const MnStrategy& stra) const {
+   // base class interface
+   return (*this)(fcn, (const GradientCalculator&)(gc), st, stra);
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/SinParameterTransformation.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SinParameterTransformation.cxx
new file mode 100644
index 0000000..1a9d803
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SinParameterTransformation.cxx
@@ -0,0 +1,59 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/SinParameterTransformation.h"
+#include "Minuit2/MnMachinePrecision.h"
+
+#include <math.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+double SinParameterTransformation::Int2ext(double Value, double Upper, double Lower) const {
+   // transformation from  to internal (unlimited) to external values (limited by Lower/Upper )
+   return Lower + 0.5*(Upper - Lower)*(sin(Value) + 1.);
+}
+
+double SinParameterTransformation::Ext2int(double Value, double Upper, double Lower, const MnMachinePrecision& prec) const {
+   // transformation from external (limited by Lower/Upper )  to internal (unlimited) values given the lower/upper limits
+
+   double piby2 = 2.*atan(1.);
+   double distnn = 8.*sqrt(prec.Eps2());
+   double vlimhi = piby2 - distnn;
+   double vlimlo = -piby2 + distnn;
+
+   double yy = 2.*(Value - Lower)/(Upper - Lower) - 1.;
+   double yy2 = yy*yy;
+   if(yy2 > (1. - prec.Eps2())) {
+      if(yy < 0.) {
+         // Lower limit
+         //       std::cout<<"SinParameterTransformation warning: is at its Lower allowed limit. "<<Value<<std::endl;
+         return vlimlo;
+      } else {
+         // Upper limit
+         //       std::cout<<"SinParameterTransformation warning: is at its Upper allowed limit."<<std::endl;
+         return vlimhi;
+      }
+
+   } else {
+      return asin(yy);
+   }
+}
+
+double SinParameterTransformation::DInt2Ext(double Value, double Upper, double Lower) const {
+   // return the derivative of the transformation d Ext/ d Int
+   return 0.5*((Upper - Lower)*cos(Value));
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/SqrtLowParameterTransformation.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SqrtLowParameterTransformation.cxx
new file mode 100644
index 0000000..a757a96
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SqrtLowParameterTransformation.cxx
@@ -0,0 +1,50 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+// Project   : LCG
+// Package   : Minuit
+// Author    : Lorenzo.MONETA at cern.ch
+// Created by: moneta  at Thu Apr  8 10:26:22 2004
+
+#include "Minuit2/SqrtLowParameterTransformation.h"
+#include "Minuit2/MnMachinePrecision.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+double SqrtLowParameterTransformation::Int2ext(double value, double lower) const {
+   /// internal to external transformation
+   double val = lower - 1. + sqrt( value*value + 1.);
+   return val;
+}
+
+
+double SqrtLowParameterTransformation::Ext2int(double value, double lower, const MnMachinePrecision& ) const {
+   // external to internal transformation
+   double yy = value - lower + 1.;
+   double yy2 = yy*yy;
+   if (yy2 < 1. )
+      return 0;
+   else
+      return sqrt( yy2 -1);
+}
+
+
+double SqrtLowParameterTransformation::DInt2Ext(double value, double) const {
+   // derivative of internal to external transofrmation   :  d (Int2Ext) / d Int
+   double val = value/( sqrt( value*value + 1.) );
+   return val;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/SqrtUpParameterTransformation.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SqrtUpParameterTransformation.cxx
new file mode 100644
index 0000000..0f0d3c9
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/SqrtUpParameterTransformation.cxx
@@ -0,0 +1,51 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+// Project   : LCG
+// Package   : Minuit
+// Author    : Lorenzo.MONETA at cern.ch
+// Created by: moneta  at Thu Apr  8 10:26:22 2004
+
+
+#include "Minuit2/SqrtUpParameterTransformation.h"
+#include "Minuit2/MnMachinePrecision.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+
+double SqrtUpParameterTransformation::Int2ext(double value, double upper) const {
+   // internal to external transformation
+   double val = upper + 1. - sqrt( value*value + 1.);
+   return val;
+}
+
+
+double SqrtUpParameterTransformation::Ext2int(double value, double upper, const MnMachinePrecision& ) const {
+   // external to internal transformation
+   double yy = upper - value + 1.;
+   double yy2 = yy*yy;
+   if (yy2 < 1.  )
+      return 0;
+   else
+      return sqrt( yy2 -1);
+}
+
+
+double SqrtUpParameterTransformation::DInt2Ext(double value, double) const {
+   // derivative of internal to external transofrmation :  d (Int2Ext ) / d Int
+   double val = - value/( sqrt( value*value + 1.) );
+   return val;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/VariableMetricBuilder.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/VariableMetricBuilder.cxx
new file mode 100644
index 0000000..540324e
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/VariableMetricBuilder.cxx
@@ -0,0 +1,445 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/VariableMetricBuilder.h"
+#include "Minuit2/GradientCalculator.h"
+#include "Minuit2/MinimumState.h"
+#include "Minuit2/MinimumError.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/FunctionMinimum.h"
+#include "Minuit2/MnLineSearch.h"
+#include "Minuit2/MinimumSeed.h"
+#include "Minuit2/MnFcn.h"
+#include "Minuit2/MnMachinePrecision.h"
+#include "Minuit2/MnPosDef.h"
+#include "Minuit2/MnParabolaPoint.h"
+#include "Minuit2/LaSum.h"
+#include "Minuit2/LaProd.h"
+#include "Minuit2/MnStrategy.h"
+#include "Minuit2/MnHesse.h"
+
+//#define DEBUG
+#include "Minuit2/MnPrint.h"
+
+// #if defined(DEBUG) || defined(WARNINGMSG)
+// #endif
+
+
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double inner_product(const LAVector&, const LAVector&);
+
+void VariableMetricBuilder::AddResult( std::vector<MinimumState>& result, const MinimumState & state) const {
+   // // if (!store) store = StorageLevel();
+   // // store |= (result.size() == 0);
+   // if (store)
+   result.push_back(state);
+   //  else {
+   //     result.back() = state;
+   //  }
+   if (TraceIter() ) TraceIteration(result.size()-1, result.back() );
+   else {
+      if (PrintLevel() > 1) {
+         MnPrint::PrintState(std::cout, result.back(), "VariableMetric: Iteration # ",result.size()-1);
+      }
+   }
+}
+
+
+FunctionMinimum VariableMetricBuilder::Minimum(const MnFcn& fcn, const GradientCalculator& gc, const MinimumSeed& seed, const MnStrategy& strategy, unsigned int maxfcn, double edmval) const {
+   // top level function to find minimum from a given initial seed
+   // iterate on a minimum search in case of first attempt is not successful
+
+   // to be consistent with F77 Minuit
+   // in Minuit2 edm is correct and is ~ a factor of 2 smaller than F77Minuit
+   // There are also a check for convergence if (edm < 0.1 edmval for exiting the loop)
+   // LM: change factor to 2E-3 to be consistent with F77Minuit
+   edmval *= 0.002;
+
+   int printLevel = PrintLevel();
+
+
+#ifdef DEBUG
+   std::cout<<"VariableMetricBuilder convergence when edm < "<<edmval<<std::endl;
+#endif
+
+   if(seed.Parameters().Vec().size() == 0) {
+      return FunctionMinimum(seed, fcn.Up());
+   }
+
+
+   //   double edm = Estimator().Estimate(seed.Gradient(), seed.Error());
+   double edm = seed.State().Edm();
+
+   FunctionMinimum min(seed, fcn.Up() );
+
+   if(edm < 0.) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("VariableMetricBuilder: initial matrix not pos.def.");
+#endif
+      //assert(!seed.Error().IsPosDef());
+      return min;
+   }
+
+   std::vector<MinimumState> result;
+   if (StorageLevel() > 0)
+      result.reserve(10);
+   else
+      result.reserve(2);
+
+
+   // do actual iterations
+   if (printLevel >1) {
+      std::cout << "VariableMetric: start iterating until Edm is < " << edmval << std::endl;
+      MnPrint::PrintState(std::cout, seed.State(), "VariableMetric: Initial state  ");
+   }
+
+   AddResult( result, seed.State());
+
+
+   // try first with a maxfxn = 80% of maxfcn
+   int maxfcn_eff = maxfcn;
+   int ipass = 0;
+   bool iterate = false;
+
+   do {
+
+      iterate = false;
+
+#ifdef DEBUG
+      std::cout << "start iterating... " << std::endl;
+      if (ipass > 0)  std::cout << "continue iterating... " << std::endl;
+#endif
+
+      min = Minimum(fcn, gc, seed, result, maxfcn_eff, edmval);
+
+      // if max function call reached exits
+      if ( min.HasReachedCallLimit() ) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("VariableMetricBuilder: FunctionMinimum is invalid, reached the function call limit");
+#endif
+         return min;
+      }
+
+      // second time check for validity of function Minimum
+      if (ipass > 0) {
+         if(!min.IsValid()) {
+#ifdef WARNINGMSG
+            MN_INFO_MSG("VariableMetricBuilder: FunctionMinimum is invalid after second try");
+#endif
+            return min;
+         }
+      }
+
+      // resulting edm of minimization
+      edm = result.back().Edm();
+      // need to re-coorect for Dcovar ?
+
+      if( (strategy.Strategy() == 2) ||
+          (strategy.Strategy() == 1 && min.Error().Dcovar() > 0.05) ) {
+
+#ifdef DEBUG
+         std::cout<<"MnMigrad will verify convergence and Error matrix. "<< std::endl;
+         std::cout<<"dcov is =  "<<  min.Error().Dcovar() << std::endl;
+#endif
+
+         MinimumState st = MnHesse(strategy)(fcn, min.State(), min.Seed().Trafo(),maxfcn);
+
+         if (printLevel > 1) {
+            MnPrint::PrintState(std::cout, st, "VariableMetric: After Hessian  ");
+         }
+         AddResult( result, st);
+
+         // check new edm
+         edm = st.Edm();
+#ifdef DEBUG
+         std::cout << "edm after Hesse calculation " << edm << " requested " << edmval << std::endl;
+#endif
+         if (edm > edmval) {
+            // be careful with machine precision and avoid too small edm
+            double machineLimit = fabs(seed.Precision().Eps2()*result.back().Fval());
+            if (edm >= machineLimit)   {
+               iterate = true;
+#ifdef WARNINGMSG
+               MN_INFO_MSG("VariableMetricBuilder: Tolerance is not sufficient, continue the minimization");
+               MN_INFO_VAL2("Current  Edm is",edm);
+               MN_INFO_VAL2("Required Edm is",edmval);
+#endif
+            }
+            else {
+#ifdef WARNINGMSG
+               MN_INFO_MSG("VariableMetricBuilder: Stop the minimization - reached machine accuracy limit");
+               MN_INFO_VAL2("Edm is smaller than machine accuracy",machineLimit);
+               MN_INFO_VAL2("Current  Edm is",edm);
+               MN_INFO_VAL2("Required Edm is",edmval);
+#endif
+            }
+
+         }
+      }
+
+
+      // end loop on iterations
+      // ? need a maximum here (or max of function calls is enough ? )
+      // continnue iteration (re-calculate function Minimum if edm IS NOT sufficient)
+      // no need to check that hesse calculation is done (if isnot done edm is OK anyway)
+      // count the pass to exit second time when function Minimum is invalid
+      // increase by 20% maxfcn for doing some more tests
+      if (ipass == 0) maxfcn_eff = int(maxfcn*1.3);
+      ipass++;
+   }  while ( iterate );
+
+
+   // Add latest state (Hessian calculation)
+   // and check edm (add a factor of 10 in tolerance )
+   if (edm > 10*edmval) {
+      min.Add( result.back(), FunctionMinimum::MnAboveMaxEdm() );
+#ifdef WARNINGMSG
+      MN_INFO_VAL2("VariableMetricBuilder: INVALID function minimum - edm is above tolerance,",edm);
+      MN_INFO_VAL2("VariableMetricBuilder: Required tolerance  is 10 x edmval ",edmval);
+#endif
+   }
+   else {
+      // check if minimum has edm above max before
+#ifdef WARNINGMSG
+      if ( min.IsAboveMaxEdm() ) {
+         MN_INFO_MSG("VariableMetricBuilder: Edm has been re-computed after Hesse");
+         MN_INFO_VAL2("new value is now smaller than the required tolerance,",edm);
+      }
+#endif
+      min.Add( result.back()  );
+   }
+
+#ifdef DEBUG
+   std::cout << "Obtained function minimum " << min << std::endl;
+#endif
+
+   return min;
+}
+
+FunctionMinimum VariableMetricBuilder::Minimum(const MnFcn& fcn, const GradientCalculator& gc, const MinimumSeed& seed, std::vector<MinimumState>& result, unsigned int maxfcn, double edmval) const {
+   // function performing the minimum searches using the Variable Metric  algorithm (MIGRAD)
+   // perform first a line search in the - Vg direction and then update using the Davidon formula (Davidon Error updator)
+   // stop when edm reached is less than required (edmval)
+
+   // after the modification when I iterate on this functions, so it can be called many times,
+   //  the seed is used here only to get precision and construct the returned FunctionMinimum object
+
+
+
+   const MnMachinePrecision& prec = seed.Precision();
+
+
+   //   result.push_back(MinimumState(seed.Parameters(), seed.Error(), seed.Gradient(), edm, fcn.NumOfCalls()));
+   const MinimumState & initialState = result.back();
+
+   double edm = initialState.Edm();
+
+
+#ifdef DEBUG
+   std::cout << "\n\nDEBUG Variable Metric Builder  \nInitial State: "
+             << " Parameter " << initialState.Vec()
+             << " Gradient " << initialState.Gradient().Vec()
+             << " Inv Hessian " << initialState.Error().InvHessian()
+             << " edm = " << initialState.Edm() << std::endl;
+#endif
+
+
+
+   // iterate until edm is small enough or max # of iterations reached
+   edm *= (1. + 3.*initialState.Error().Dcovar());
+   MnLineSearch lsearch;
+   MnAlgebraicVector step(initialState.Gradient().Vec().size());
+   // keep also prevStep
+   MnAlgebraicVector prevStep(initialState.Gradient().Vec().size());
+
+   MinimumState s0 = result.back();
+   assert(s0.IsValid() ); 
+
+   do {
+
+      //MinimumState s0 = result.back();
+
+      step = -1.*s0.Error().InvHessian()*s0.Gradient().Vec();
+
+#ifdef DEBUG
+      std::cout << "\n\n---> Iteration - " << result.size()
+                << "\nFval = " << s0.Fval() << " numOfCall = " << fcn.NumOfCalls()
+                << "\nInternal Parameter values " << s0.Vec()
+                << " Newton step " << step << std::endl;
+#endif
+
+      // check if derivatives are not zero
+      if ( inner_product(s0.Gradient().Vec(),s0.Gradient().Vec() )  <= 0 )  {
+#ifdef DEBUG
+         std::cout << "VariableMetricBuilder: all derivatives are zero - return current status" << std::endl;
+#endif
+         break;
+      }
+
+
+      double gdel = inner_product(step, s0.Gradient().Grad());
+
+#ifdef DEBUG
+      std::cout << " gdel = " << gdel << std::endl;
+#endif
+
+
+      if(gdel > 0.) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("VariableMetricBuilder: matrix not pos.def, gdel > 0");
+         MN_INFO_VAL(gdel);
+#endif
+         MnPosDef psdf;
+         MinimumState s0new = psdf(s0, prec);
+         step = -1.*s0new.Error().InvHessian()*s0new.Gradient().Vec();
+         // #ifdef DEBUG
+         //       std::cout << "After MnPosdef - Error  " << s0.Error().InvHessian() << " Gradient " << s0.Gradient().Vec() << " step " << step << std::endl;
+         // #endif
+         gdel = inner_product(step, s0new.Gradient().Grad());
+#ifdef WARNINGMSG
+         MN_INFO_VAL(gdel);
+#endif
+         if(gdel > 0.) {
+            AddResult(result, s0new);
+               
+            return FunctionMinimum(seed, result, fcn.Up());
+         }
+      }
+      
+      MnParabolaPoint pp = lsearch(fcn, s0.Parameters(), step, gdel, prec);
+
+      // <= needed for case 0 <= 0
+      if(fabs(pp.Y() - s0.Fval()) <=  fabs(s0.Fval())*prec.Eps() ) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("VariableMetricBuilder: no improvement in line search");
+#endif
+         // no improvement exit   (is it really needed LM ? in vers. 1.22 tried alternative )
+         // add new state when only fcn changes
+         if (result.size() <= 1 ) 
+            AddResult(result, MinimumState(s0.Parameters(), s0.Error(), s0.Gradient(), s0.Edm(), fcn.NumOfCalls()));
+         else
+            // no need to re-store the state
+            AddResult(result, MinimumState(pp.Y(), s0.Edm(), fcn.NumOfCalls()));
+
+         break;
+
+
+      }
+
+#ifdef DEBUG
+      std::cout << "Result after line search : \nx = " << pp.X()
+                << "\nOld Fval = " << s0.Fval()
+                << "\nNew Fval = " << pp.Y()
+                << "\nNFcalls = " << fcn.NumOfCalls() << std::endl;
+#endif
+
+      MinimumParameters p(s0.Vec() + pp.X()*step, pp.Y());
+
+
+      FunctionGradient g = gc(p, s0.Gradient());
+
+
+      edm = Estimator().Estimate(g, s0.Error());
+
+
+      if(edm < 0.) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("VariableMetricBuilder: matrix not pos.def. : edm is < 0. Make pos def...");
+#endif
+         MnPosDef psdf;
+         MinimumState s0new = psdf(s0, prec);
+         edm = Estimator().Estimate(g, s0new.Error());
+         if(edm < 0.) {
+#ifdef WARNINGMSG
+            MN_INFO_MSG("VariableMetricBuilder: matrix still not pos.def. : exit iterations ");
+#endif
+            AddResult(result, s0new);
+
+            return FunctionMinimum(seed, result, fcn.Up());
+         }
+      }
+      MinimumError e = ErrorUpdator().Update(s0, p, g);
+
+#ifdef DEBUG
+      std::cout << "Updated new point: \n "
+                << " Parameter " << p.Vec()
+                << " Gradient " << g.Vec()
+                << " InvHessian " << e.Matrix()
+                << " Hessian " << e.Hessian()
+                << " edm = " << edm << std::endl << std::endl;
+#endif
+
+      // update the state
+      s0 =  MinimumState(p, e, g, edm, fcn.NumOfCalls());
+      if (StorageLevel() || result.size() <= 1) 
+         AddResult(result, s0);
+      else
+         // use a reduced state for not-final iterations
+         AddResult(result, MinimumState(p.Fval(), edm, fcn.NumOfCalls()));
+
+      // correct edm
+      edm *= (1. + 3.*e.Dcovar());
+
+#ifdef DEBUG
+      std::cout << "Dcovar = " << e.Dcovar() << "\tCorrected edm = " << edm << std::endl;
+#endif
+
+
+
+   } while(edm > edmval && fcn.NumOfCalls() < maxfcn);  // end of iteration loop
+
+   // save last result in case of no complete final states
+   if ( ! result.back().IsValid() )
+      result.back() = s0; 
+
+
+   if(fcn.NumOfCalls() >= maxfcn) {
+#ifdef WARNINGMSG
+      MN_INFO_MSG("VariableMetricBuilder: call limit exceeded.");
+#endif
+      return FunctionMinimum(seed, result, fcn.Up(), FunctionMinimum::MnReachedCallLimit());
+   }
+
+   if(edm > edmval) {
+      if(edm < fabs(prec.Eps2()*result.back().Fval())) {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("VariableMetricBuilder: machine accuracy limits further improvement.");
+#endif
+         return FunctionMinimum(seed, result, fcn.Up());
+      } else if(edm < 10*edmval) {
+         return FunctionMinimum(seed, result, fcn.Up());
+      } else {
+#ifdef WARNINGMSG
+         MN_INFO_MSG("VariableMetricBuilder: iterations finish without convergence.");
+         MN_INFO_VAL2("VariableMetricBuilder",edm);
+         MN_INFO_VAL2("            requested",edmval);
+#endif
+         return FunctionMinimum(seed, result, fcn.Up(), FunctionMinimum::MnAboveMaxEdm());
+      }
+   }
+   //   std::cout<<"result.back().Error().Dcovar()= "<<result.back().Error().Dcovar()<<std::endl;
+
+#ifdef DEBUG
+   std::cout << "Exiting successfully Variable Metric Builder \n"
+             << "NFCalls = " << fcn.NumOfCalls()
+             << "\nFval = " <<  result.back().Fval()
+             << "\nedm = " << edm << " requested = " << edmval << std::endl;
+#endif
+
+   return FunctionMinimum(seed, result, fcn.Up());
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/VariableMetricEDMEstimator.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/VariableMetricEDMEstimator.cxx
new file mode 100644
index 0000000..dba7ea5
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/VariableMetricEDMEstimator.cxx
@@ -0,0 +1,34 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/VariableMetricEDMEstimator.h"
+#include "Minuit2/FunctionGradient.h"
+#include "Minuit2/MinimumError.h"
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double similarity(const LAVector&, const LASymMatrix&);
+
+double VariableMetricEDMEstimator::Estimate(const FunctionGradient& g, const MinimumError& e) const {
+   // estimate the edm (expected distance to the minimum) =  0.5 * g^T V g  (where V is the error matrix, inverse of Hessian)
+   // assuminigfirst derivatives if F are zero at the mminimum,
+
+   if(e.InvHessian().size()  == 1)
+      return 0.5*g.Grad()(0)*g.Grad()(0)*e.InvHessian()(0,0);
+
+   double rho = similarity(g.Grad(), e.InvHessian());
+   return 0.5*rho;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnbins.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnbins.cxx
new file mode 100644
index 0000000..e5c6e23
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnbins.cxx
@@ -0,0 +1,96 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include <math.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+void mnbins(double a1, double a2, int naa, double& bl, double& bh, int& nb, double& bwid) {
+
+//*-*-*-*-*-*-*-*-*-*-*Compute reasonable histogram intervals*-*-*-*-*-*-*-*-*
+//*-*                  ======================================
+//*-*        Function TO DETERMINE REASONABLE HISTOGRAM INTERVALS
+//*-*        GIVEN ABSOLUTE UPPER AND LOWER BOUNDS  A1 AND A2
+//*-*        AND DESIRED MAXIMUM NUMBER OF BINS NAA
+//*-*        PROGRAM MAKES REASONABLE BINNING FROM BL TO BH OF WIDTH BWID
+//*-*        F. JAMES,   AUGUST, 1974 , stolen for Minuit, 1988
+//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+   /* Local variables */
+   double awid,ah, al, sigfig, sigrnd, alb;
+   int kwid, lwid, na=0, log_;
+
+   al = a1 < a2 ? a1 : a2;
+   //     al = std::min(a1,a2);
+   //     ah = std::max(a1,a2);
+   ah = a1 > a2 ? a1 : a2;
+   if (al == ah) ah = al + 1;
+
+   //*-*-       IF NAA .EQ. -1 , PROGRAM USES BWID INPUT FROM CALLING ROUTINE
+   if (naa == -1) goto L150;
+L10:
+      na = naa - 1;
+   if (na < 1) na = 1;
+
+   //*-*-        GET NOMINAL BIN WIDTH IN EXPON FORM
+L20:
+      awid = (ah-al) / double(na);
+   log_ = int(log10(awid));
+   if (awid <= 1) --log_;
+   sigfig = awid*pow(10.0, -log_);
+   //*-*-       ROUND MANTISSA UP TO 2, 2.5, 5, OR 10
+   if (sigfig > 2) goto L40;
+   sigrnd = 2;
+   goto L100;
+L40:
+      if (sigfig > 2.5) goto L50;
+   sigrnd = 2.5;
+   goto L100;
+L50:
+      if (sigfig > 5) goto L60;
+   sigrnd = 5;
+   goto L100;
+L60:
+      sigrnd = 1;
+   ++log_;
+L100:
+      bwid = sigrnd*pow(10.0, log_);
+   goto L200;
+   //*-*-       GET NEW BOUNDS FROM NEW WIDTH BWID
+L150:
+      if (bwid <= 0) goto L10;
+L200:
+      alb  = al / bwid;
+   lwid = int(alb);
+   if (alb < 0) --lwid;
+   bl   = bwid*double(lwid);
+   alb  = ah / bwid + 1;
+   kwid = int(alb);
+   if (alb < 0) --kwid;
+   bh = bwid*double(kwid);
+   nb = kwid - lwid;
+   if (naa > 5) goto L240;
+   if (naa == -1) return;
+   //*-*-        REQUEST FOR ONE BIN IS DIFFICULT CASE
+   if (naa > 1 || nb == 1) return;
+   bwid *= 2;
+   nb = 1;
+   return;
+L240:
+      if (nb << 1 != naa) return;
+   ++na;
+   goto L20;
+} /* mnbins_ */
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndasum.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndasum.cxx
new file mode 100644
index 0000000..3fd249a
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndasum.cxx
@@ -0,0 +1,100 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* dasum.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+      -lf2c -lm   (in that order)
+*/
+
+#include <math.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double mndasum(unsigned int n, const double* dx, int incx) {
+   /* System generated locals */
+   int i__1, i__2;
+   double ret_val, d__1, d__2, d__3, d__4, d__5, d__6;
+
+   /* Local variables */
+   int i__, m;
+   double dtemp;
+   int nincx, mp1;
+
+
+   /*     takes the sum of the absolute values. */
+   /*     jack dongarra, linpack, 3/11/78. */
+   /*     modified 3/93 to return if incx .le. 0. */
+   /*     modified 12/3/93, array(1) declarations changed to array(*) */
+
+
+   /* Parameter adjustments */
+   --dx;
+
+   /* Function Body */
+   ret_val = 0.;
+   dtemp = 0.;
+   if (n <= 0 || incx <= 0) {
+      return ret_val;
+   }
+   if (incx == 1) {
+      goto L20;
+   }
+
+   /*        code for increment not equal to 1 */
+
+   nincx = n * incx;
+   i__1 = nincx;
+   i__2 = incx;
+   for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
+      dtemp += (d__1 = dx[i__], fabs(d__1));
+      /* L10: */
+   }
+   ret_val = dtemp;
+   return ret_val;
+
+   /*        code for increment equal to 1 */
+
+
+   /*        clean-up loop */
+
+L20:
+      m = n % 6;
+   if (m == 0) {
+      goto L40;
+   }
+   i__2 = m;
+   for (i__ = 1; i__ <= i__2; ++i__) {
+      dtemp += (d__1 = dx[i__], fabs(d__1));
+      /* L30: */
+   }
+   if (n < 6) {
+      goto L60;
+   }
+L40:
+      mp1 = m + 1;
+   i__2 = n;
+   for (i__ = mp1; i__ <= i__2; i__ += 6) {
+      dtemp = dtemp + (d__1 = dx[i__], fabs(d__1)) + (d__2 = dx[i__ + 1],
+                                                      fabs(d__2)) + (d__3 = dx[i__ + 2], fabs(d__3)) +
+      (d__4 = dx[i__ + 3], fabs(d__4)) +
+      (d__5 = dx[i__ + 4], fabs(d__5)) + (d__6 = dx[i__ + 5], fabs(d__6));
+      /* L50: */
+   }
+L60:
+      ret_val = dtemp;
+   return ret_val;
+} /* dasum_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndaxpy.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndaxpy.cxx
new file mode 100644
index 0000000..a6fbf29
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndaxpy.cxx
@@ -0,0 +1,104 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* daxpy.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+      -lf2c -lm   (in that order)
+*/
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+int Mndaxpy(unsigned int n, double da, const double* dx, int incx, double* dy,
+            int incy) {
+   /* System generated locals */
+   int i__1;
+
+   /* Local variables */
+   int i__, m, ix, iy, mp1;
+
+
+   /*     constant times a vector plus a vector. */
+   /*     uses unrolled loops for increments equal to one. */
+   /*     jack dongarra, linpack, 3/11/78. */
+   /*     modified 12/3/93, array(1) declarations changed to array(*) */
+
+
+   /* Parameter adjustments */
+   --dy;
+   --dx;
+
+   /* Function Body */
+   if (n <= 0) {
+      return 0;
+   }
+   if (da == 0.) {
+      return 0;
+   }
+   if (incx == 1 && incy == 1) {
+      goto L20;
+   }
+
+   /*        code for unequal increments or equal increments */
+   /*          not equal to 1 */
+
+   ix = 1;
+   iy = 1;
+   if (incx < 0) {
+      ix = (-static_cast<int>(n) + 1) * incx + 1;
+   }
+   if (incy < 0) {
+      iy = (-static_cast<int>(n) + 1) * incy + 1;
+   }
+   i__1 = n;
+   for (i__ = 1; i__ <= i__1; ++i__) {
+      dy[iy] += da * dx[ix];
+      ix += incx;
+      iy += incy;
+      /* L10: */
+   }
+   return 0;
+
+   /*        code for both increments equal to 1 */
+
+
+   /*        clean-up loop */
+
+L20:
+      m = n % 4;
+   if (m == 0) {
+      goto L40;
+   }
+   i__1 = m;
+   for (i__ = 1; i__ <= i__1; ++i__) {
+      dy[i__] += da * dx[i__];
+      /* L30: */
+   }
+   if (n < 4) {
+      return 0;
+   }
+L40:
+      mp1 = m + 1;
+   i__1 = n;
+   for (i__ = mp1; i__ <= i__1; i__ += 4) {
+      dy[i__] += da * dx[i__];
+      dy[i__ + 1] += da * dx[i__ + 1];
+      dy[i__ + 2] += da * dx[i__ + 2];
+      dy[i__ + 3] += da * dx[i__ + 3];
+      /* L50: */
+   }
+   return 0;
+} /* daxpy_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnddot.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnddot.cxx
new file mode 100644
index 0000000..0a338a8
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnddot.cxx
@@ -0,0 +1,108 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* ddot.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+   -lf2c -lm   (in that order)
+*/
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+double mnddot(unsigned int n, const double* dx, int incx, const double* dy,
+              int incy) {
+   /* System generated locals */
+   int i__1;
+   double ret_val;
+
+   /* Local variables */
+   int i__, m;
+   double dtemp;
+   int ix, iy, mp1;
+
+
+   /*     forms the dot product of two vectors. */
+   /*     uses unrolled loops for increments equal to one. */
+   /*     jack dongarra, linpack, 3/11/78. */
+   /*     modified 12/3/93, array(1) declarations changed to array(*) */
+
+
+   /* Parameter adjustments */
+   --dy;
+   --dx;
+
+   /* Function Body */
+   ret_val = 0.;
+   dtemp = 0.;
+   if (n <= 0) {
+      return ret_val;
+   }
+   if (incx == 1 && incy == 1) {
+      goto L20;
+   }
+
+   /*        code for unequal increments or equal increments */
+   /*          not equal to 1 */
+
+   ix = 1;
+   iy = 1;
+   if (incx < 0) {
+      ix = (-static_cast<int>(n) + 1) * incx + 1;
+   }
+   if (incy < 0) {
+      iy = (-static_cast<int>(n) + 1) * incy + 1;
+   }
+   i__1 = n;
+   for (i__ = 1; i__ <= i__1; ++i__) {
+      dtemp += dx[ix] * dy[iy];
+      ix += incx;
+      iy += incy;
+      /* L10: */
+   }
+   ret_val = dtemp;
+   return ret_val;
+
+   /*        code for both increments equal to 1 */
+
+
+   /*        clean-up loop */
+
+L20:
+      m = n % 5;
+   if (m == 0) {
+      goto L40;
+   }
+   i__1 = m;
+   for (i__ = 1; i__ <= i__1; ++i__) {
+      dtemp += dx[i__] * dy[i__];
+      /* L30: */
+   }
+   if (n < 5) {
+      goto L60;
+   }
+L40:
+      mp1 = m + 1;
+   i__1 = n;
+   for (i__ = mp1; i__ <= i__1; i__ += 5) {
+      dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + dx[
+         i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + dx[i__ +
+            4] * dy[i__ + 4];
+      /* L50: */
+   }
+L60:
+      ret_val = dtemp;
+   return ret_val;
+} /* ddot_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndscal.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndscal.cxx
new file mode 100644
index 0000000..6ef5508
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndscal.cxx
@@ -0,0 +1,91 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* dscal.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+   -lf2c -lm   (in that order)
+*/
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+int Mndscal(unsigned int n, double da, double* dx, int incx) {
+   /* System generated locals */
+   int i__1, i__2;
+
+   /* Local variables */
+   int i__, m, nincx, mp1;
+
+
+   /*     scales a vector by a constant. */
+   /*     uses unrolled loops for increment equal to one. */
+   /*     jack dongarra, linpack, 3/11/78. */
+   /*     modified 3/93 to return if incx .le. 0. */
+   /*     modified 12/3/93, array(1) declarations changed to array(*) */
+
+
+   /* Parameter adjustments */
+   --dx;
+
+   /* Function Body */
+   if (n <= 0 || incx <= 0) {
+      return 0;
+   }
+   if (incx == 1) {
+      goto L20;
+   }
+
+   /*        code for increment not equal to 1 */
+
+   nincx = n * incx;
+   i__1 = nincx;
+   i__2 = incx;
+   for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
+      dx[i__] = da * dx[i__];
+      /* L10: */
+   }
+   return 0;
+
+   /*        code for increment equal to 1 */
+
+
+   /*        clean-up loop */
+
+L20:
+      m = n % 5;
+   if (m == 0) {
+      goto L40;
+   }
+   i__2 = m;
+   for (i__ = 1; i__ <= i__2; ++i__) {
+      dx[i__] = da * dx[i__];
+      /* L30: */
+   }
+   if (n < 5) {
+      return 0;
+   }
+L40:
+      mp1 = m + 1;
+   i__2 = n;
+   for (i__ = mp1; i__ <= i__2; i__ += 5) {
+      dx[i__] = da * dx[i__];
+      dx[i__ + 1] = da * dx[i__ + 1];
+      dx[i__ + 2] = da * dx[i__ + 2];
+      dx[i__ + 3] = da * dx[i__ + 3];
+      dx[i__ + 4] = da * dx[i__ + 4];
+      /* L50: */
+   }
+   return 0;
+} /* dscal_ */
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndspmv.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndspmv.cxx
new file mode 100644
index 0000000..ca08321
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndspmv.cxx
@@ -0,0 +1,322 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* dspmv.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+   -lf2c -lm   (in that order)
+*/
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+bool mnlsame(const char*, const char*);
+int mnxerbla(const char*, int);
+
+int Mndspmv(const char* uplo, unsigned int n, double alpha,
+            const double* ap, const double* x, int incx, double beta,
+            double* y, int incy) {
+   /* System generated locals */
+   int i__1, i__2;
+
+   /* Local variables */
+   int info;
+   double temp1, temp2;
+   int i__, j, k;
+   int kk, ix, iy, jx, jy, kx, ky;
+
+   /*     .. Scalar Arguments .. */
+   /*     .. Array Arguments .. */
+   /*     .. */
+
+   /*  Purpose */
+   /*  ======= */
+
+   /*  DSPMV  performs the matrix-vector operation */
+
+   /*     y := alpha*A*x + beta*y, */
+
+   /*  where alpha and beta are scalars, x and y are n element vectors and */
+   /*  A is an n by n symmetric matrix, supplied in packed form. */
+
+   /*  Parameters */
+   /*  ========== */
+
+   /*  UPLO   - CHARACTER*1. */
+   /*           On entry, UPLO specifies whether the Upper or Lower */
+   /*           triangular part of the matrix A is supplied in the packed */
+   /*           array AP as follows: */
+
+   /*              UPLO = 'U' or 'u'   The Upper triangular part of A is */
+   /*                                  supplied in AP. */
+
+   /*              UPLO = 'L' or 'l'   The Lower triangular part of A is */
+   /*                                  supplied in AP. */
+
+   /*           Unchanged on exit. */
+
+   /*  N      - INTEGER. */
+   /*           On entry, N specifies the order of the matrix A. */
+   /*           N must be at least zero. */
+   /*           Unchanged on exit. */
+
+   /*  ALPHA  - DOUBLE PRECISION. */
+   /*           On entry, ALPHA specifies the scalar alpha. */
+   /*           Unchanged on exit. */
+
+   /*  AP     - DOUBLE PRECISION array of DIMENSION at least */
+   /*           ( ( n*( n + 1 ) )/2 ). */
+   /*           Before entry with UPLO = 'U' or 'u', the array AP must */
+   /*           contain the Upper triangular part of the symmetric matrix */
+   /*           packed sequentially, column by column, so that AP( 1 ) */
+   /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */
+   /*           and a( 2, 2 ) respectively, and so on. */
+   /*           Before entry with UPLO = 'L' or 'l', the array AP must */
+   /*           contain the Lower triangular part of the symmetric matrix */
+   /*           packed sequentially, column by column, so that AP( 1 ) */
+   /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */
+   /*           and a( 3, 1 ) respectively, and so on. */
+   /*           Unchanged on exit. */
+
+   /*  X      - DOUBLE PRECISION array of dimension at least */
+   /*           ( 1 + ( n - 1 )*abs( INCX ) ). */
+   /*           Before entry, the incremented array X must contain the n */
+   /*           element vector x. */
+   /*           Unchanged on exit. */
+
+   /*  INCX   - INTEGER. */
+   /*           On entry, INCX specifies the increment for the Elements of */
+   /*           X. INCX must not be zero. */
+   /*           Unchanged on exit. */
+
+   /*  BETA   - DOUBLE PRECISION. */
+   /*           On entry, BETA specifies the scalar beta. When BETA is */
+   /*           supplied as zero then Y need not be set on input. */
+   /*           Unchanged on exit. */
+
+   /*  Y      - DOUBLE PRECISION array of dimension at least */
+   /*           ( 1 + ( n - 1 )*abs( INCY ) ). */
+   /*           Before entry, the incremented array Y must contain the n */
+   /*           element vector y. On exit, Y is overwritten by the updated */
+   /*           vector y. */
+
+   /*  INCY   - INTEGER. */
+   /*           On entry, INCY specifies the increment for the Elements of */
+   /*           Y. INCY must not be zero. */
+   /*           Unchanged on exit. */
+
+
+   /*  Level 2 Blas routine. */
+
+   /*  -- Written on 22-October-1986. */
+   /*     Jack Dongarra, Argonne National Lab. */
+   /*     Jeremy Du Croz, Nag Central Office. */
+   /*     Sven Hammarling, Nag Central Office. */
+   /*     Richard Hanson, Sandia National Labs. */
+
+
+   /*     .. Parameters .. */
+   /*     .. Local Scalars .. */
+   /*     .. External Functions .. */
+   /*     .. External Subroutines .. */
+   /*     .. */
+   /*     .. Executable Statements .. */
+
+   /*     Test the input parameters. */
+
+   /* Parameter adjustments */
+   --y;
+   --x;
+   --ap;
+
+   /* Function Body */
+   info = 0;
+   if (! mnlsame(uplo, "U") && ! mnlsame(uplo, "L")) {
+      info = 1;
+   }
+   //     else if (n < 0) {
+   //       info = 2;
+   //     }
+   else if (incx == 0) {
+      info = 6;
+   } else if (incy == 0) {
+      info = 9;
+   }
+   if (info != 0) {
+      mnxerbla("DSPMV ", info);
+      return 0;
+   }
+
+   /*     Quick return if possible. */
+
+   if ( ( n == 0)  || ( alpha == 0. && beta == 1.) ) {
+      return 0;
+   }
+
+   /*     Set up the start points in  X  and  Y. */
+
+   if (incx > 0) {
+      kx = 1;
+   } else {
+      kx = 1 - (n - 1) * incx;
+   }
+   if (incy > 0) {
+      ky = 1;
+   } else {
+      ky = 1 - (n - 1) * incy;
+   }
+
+   /*     Start the operations. In this version the Elements of the array AP */
+   /*     are accessed sequentially with one pass through AP. */
+
+   /*     First form  y := beta*y. */
+
+   if (beta != 1.) {
+      if (incy == 1) {
+         if (beta == 0.) {
+            i__1 = n;
+            for (i__ = 1; i__ <= i__1; ++i__) {
+               y[i__] = 0.;
+               /* L10: */
+            }
+         } else {
+            i__1 = n;
+            for (i__ = 1; i__ <= i__1; ++i__) {
+               y[i__] = beta * y[i__];
+               /* L20: */
+            }
+         }
+      } else {
+         iy = ky;
+         if (beta == 0.) {
+            i__1 = n;
+            for (i__ = 1; i__ <= i__1; ++i__) {
+               y[iy] = 0.;
+               iy += incy;
+               /* L30: */
+            }
+         } else {
+            i__1 = n;
+            for (i__ = 1; i__ <= i__1; ++i__) {
+               y[iy] = beta * y[iy];
+               iy += incy;
+               /* L40: */
+            }
+         }
+      }
+   }
+   if (alpha == 0.) {
+      return 0;
+   }
+   kk = 1;
+   if (mnlsame(uplo, "U")) {
+
+      /*        Form  y  when AP contains the Upper triangle. */
+
+      if (incx == 1 && incy == 1) {
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            temp1 = alpha * x[j];
+            temp2 = 0.;
+            k = kk;
+            i__2 = j - 1;
+            for (i__ = 1; i__ <= i__2; ++i__) {
+               y[i__] += temp1 * ap[k];
+               temp2 += ap[k] * x[i__];
+               ++k;
+               /* L50: */
+            }
+            y[j] = y[j] + temp1 * ap[kk + j - 1] + alpha * temp2;
+            kk += j;
+            /* L60: */
+         }
+      } else {
+         jx = kx;
+         jy = ky;
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            temp1 = alpha * x[jx];
+            temp2 = 0.;
+            ix = kx;
+            iy = ky;
+            i__2 = kk + j - 2;
+            for (k = 0; k <= i__2 - kk; ++k) {
+               y[iy] += temp1 * ap[k + kk];
+               temp2 += ap[k + kk] * x[ix];
+               ix += incx;
+               iy += incy;
+               /* L70: */
+            }
+            y[jy] = y[jy] + temp1 * ap[kk + j - 1] + alpha * temp2;
+            jx += incx;
+            jy += incy;
+            kk += j;
+            /* L80: */
+         }
+      }
+   } else {
+
+      /*        Form  y  when AP contains the Lower triangle. */
+
+      if (incx == 1 && incy == 1) {
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            temp1 = alpha * x[j];
+            temp2 = 0.;
+            y[j] += temp1 * ap[kk];
+            k = kk + 1;
+            i__2 = n;
+            for (i__ = j + 1; i__ <= i__2; ++i__) {
+               y[i__] += temp1 * ap[k];
+               temp2 += ap[k] * x[i__];
+               ++k;
+               /* L90: */
+            }
+            y[j] += alpha * temp2;
+            kk += n - j + 1;
+            /* L100: */
+         }
+      } else {
+         jx = kx;
+         jy = ky;
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            temp1 = alpha * x[jx];
+            temp2 = 0.;
+            y[jy] += temp1 * ap[kk];
+            ix = jx;
+            iy = jy;
+            i__2 = kk + n - j;
+            for (k = kk + 1; k <= i__2; ++k) {
+               ix += incx;
+               iy += incy;
+               y[iy] += temp1 * ap[k];
+               temp2 += ap[k] * x[ix];
+               /* L110: */
+            }
+            y[jy] += alpha * temp2;
+            jx += incx;
+            jy += incy;
+            kk += n - j + 1;
+            /* L120: */
+         }
+      }
+   }
+
+   return 0;
+
+   /*     End of DSPMV . */
+
+} /* dspmv_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndspr.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndspr.cxx
new file mode 100644
index 0000000..1e92c4f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mndspr.cxx
@@ -0,0 +1,247 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* dspr.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+   -lf2c -lm   (in that order)
+*/
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+bool mnlsame(const char*, const char*);
+int mnxerbla(const char*, int);
+
+int mndspr(const char* uplo, unsigned int n, double alpha,
+           const double* x, int incx, double* ap) {
+   /* System generated locals */
+   int i__1, i__2;
+
+   /* Local variables */
+   int info;
+   double temp;
+   int i__, j, k;
+   int kk, ix, jx, kx = 0;
+
+   /*     .. Scalar Arguments .. */
+   /*     .. Array Arguments .. */
+   /*     .. */
+
+   /*  Purpose */
+   /*  ======= */
+
+   /*  DSPR    performs the symmetric rank 1 operation */
+
+   /*     A := alpha*x*x' + A, */
+
+   /*  where alpha is a real scalar, x is an n element vector and A is an */
+   /*  n by n symmetric matrix, supplied in packed form. */
+
+   /*  Parameters */
+   /*  ========== */
+
+   /*  UPLO   - CHARACTER*1. */
+   /*           On entry, UPLO specifies whether the Upper or Lower */
+   /*           triangular part of the matrix A is supplied in the packed */
+   /*           array AP as follows: */
+
+   /*              UPLO = 'U' or 'u'   The Upper triangular part of A is */
+   /*                                  supplied in AP. */
+
+   /*              UPLO = 'L' or 'l'   The Lower triangular part of A is */
+   /*                                  supplied in AP. */
+
+   /*           Unchanged on exit. */
+
+   /*  N      - INTEGER. */
+   /*           On entry, N specifies the order of the matrix A. */
+   /*           N must be at least zero. */
+   /*           Unchanged on exit. */
+
+   /*  ALPHA  - DOUBLE PRECISION. */
+   /*           On entry, ALPHA specifies the scalar alpha. */
+   /*           Unchanged on exit. */
+
+   /*  X      - DOUBLE PRECISION array of dimension at least */
+   /*           ( 1 + ( n - 1 )*abs( INCX ) ). */
+   /*           Before entry, the incremented array X must contain the n */
+   /*           element vector x. */
+   /*           Unchanged on exit. */
+
+   /*  INCX   - INTEGER. */
+   /*           On entry, INCX specifies the increment for the Elements of */
+   /*           X. INCX must not be zero. */
+   /*           Unchanged on exit. */
+
+   /*  AP     - DOUBLE PRECISION array of DIMENSION at least */
+   /*           ( ( n*( n + 1 ) )/2 ). */
+   /*           Before entry with  UPLO = 'U' or 'u', the array AP must */
+   /*           contain the Upper triangular part of the symmetric matrix */
+   /*           packed sequentially, column by column, so that AP( 1 ) */
+   /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */
+   /*           and a( 2, 2 ) respectively, and so on. On exit, the array */
+   /*           AP is overwritten by the Upper triangular part of the */
+   /*           updated matrix. */
+   /*           Before entry with UPLO = 'L' or 'l', the array AP must */
+   /*           contain the Lower triangular part of the symmetric matrix */
+   /*           packed sequentially, column by column, so that AP( 1 ) */
+   /*           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */
+   /*           and a( 3, 1 ) respectively, and so on. On exit, the array */
+   /*           AP is overwritten by the Lower triangular part of the */
+   /*           updated matrix. */
+
+
+   /*  Level 2 Blas routine. */
+
+   /*  -- Written on 22-October-1986. */
+   /*     Jack Dongarra, Argonne National Lab. */
+   /*     Jeremy Du Croz, Nag Central Office. */
+   /*     Sven Hammarling, Nag Central Office. */
+   /*     Richard Hanson, Sandia National Labs. */
+
+
+   /*     .. Parameters .. */
+   /*     .. Local Scalars .. */
+   /*     .. External Functions .. */
+   /*     .. External Subroutines .. */
+   /*     .. */
+   /*     .. Executable Statements .. */
+
+   /*     Test the input parameters. */
+
+   /* Parameter adjustments */
+   --ap;
+   --x;
+
+   /* Function Body */
+   info = 0;
+   if (! mnlsame(uplo, "U") && ! mnlsame(uplo, "L")) {
+      info = 1;
+   }
+   //     else if (n < 0) {
+   //    info = 2;
+   //     }
+   else if (incx == 0) {
+      info = 5;
+   }
+   if (info != 0) {
+      mnxerbla("DSPR  ", info);
+      return 0;
+   }
+
+   /*     Quick return if possible. */
+
+   if (n == 0 || alpha == 0.) {
+      return 0;
+   }
+
+   /*     Set the start point in X if the increment is not unity. */
+
+   if (incx <= 0) {
+      kx = 1 - (n - 1) * incx;
+   } else if (incx != 1) {
+      kx = 1;
+   }
+
+   /*     Start the operations. In this version the Elements of the array AP */
+   /*     are accessed sequentially with one pass through AP. */
+
+   kk = 1;
+   if (mnlsame(uplo, "U")) {
+
+      /*        Form  A  when Upper triangle is stored in AP. */
+
+      if (incx == 1) {
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            if (x[j] != 0.) {
+               temp = alpha * x[j];
+               k = kk;
+               i__2 = j;
+               for (i__ = 1; i__ <= i__2; ++i__) {
+                  ap[k] += x[i__] * temp;
+                  ++k;
+                  /* L10: */
+               }
+            }
+            kk += j;
+            /* L20: */
+         }
+      } else {
+         jx = kx;
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            if (x[jx] != 0.) {
+               temp = alpha * x[jx];
+               ix = kx;
+               i__2 = kk + j - 1;
+               for (k = kk; k <= i__2; ++k) {
+                  ap[k] += x[ix] * temp;
+                  ix += incx;
+                  /* L30: */
+               }
+            }
+            jx += incx;
+            kk += j;
+            /* L40: */
+         }
+      }
+   } else {
+
+      /*        Form  A  when Lower triangle is stored in AP. */
+
+      if (incx == 1) {
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            if (x[j] != 0.) {
+               temp = alpha * x[j];
+               k = kk;
+               i__2 = n;
+               for (i__ = j; i__ <= i__2; ++i__) {
+                  ap[k] += x[i__] * temp;
+                  ++k;
+                  /* L50: */
+               }
+            }
+            kk = kk + n - j + 1;
+            /* L60: */
+         }
+      } else {
+         jx = kx;
+         i__1 = n;
+         for (j = 1; j <= i__1; ++j) {
+            if (x[jx] != 0.) {
+               temp = alpha * x[jx];
+               ix = jx;
+               i__2 = kk + n - j;
+               for (k = kk; k <= i__2; ++k) {
+                  ap[k] += x[ix] * temp;
+                  ix += incx;
+                  /* L70: */
+               }
+            }
+            jx += incx;
+            kk = kk + n - j + 1;
+            /* L80: */
+         }
+      }
+   }
+
+   return 0;
+
+   /*     End of DSPR  . */
+
+} /* dspr_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnlsame.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnlsame.cxx
new file mode 100644
index 0000000..8cfb0e3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnlsame.cxx
@@ -0,0 +1,70 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* lsame.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+   -lf2c -lm   (in that order)
+*/
+
+#include <string.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+bool mnlsame(const char* ca, const char* cb) {
+   /* System generated locals */
+   bool ret_val = false;
+
+   /* Local variables */
+   //     integer inta, intb, zcode;
+
+
+   /*  -- LAPACK auxiliary routine (version 2.0) -- */
+   /*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */
+   /*     Courant Institute, Argonne National Lab, and Rice University */
+   /*     January 31, 1994 */
+
+   /*     .. Scalar Arguments .. */
+   /*     .. */
+
+   /*  Purpose */
+   /*  ======= */
+
+   /*  LSAME returns .TRUE. if CA is the same letter as CB regardless of */
+   /*  case. */
+
+   /*  Arguments */
+   /*  ========= */
+
+   /*  CA      (input) CHARACTER*1 */
+   /*  CB      (input) CHARACTER*1 */
+   /*          CA and CB specify the single characters to be compared. */
+
+   /* ===================================================================== */
+
+   /*     .. Intrinsic Functions .. */
+   /*     .. */
+   /*     .. Local Scalars .. */
+   /*     .. */
+   /*     .. Executable Statements .. */
+
+   /*     Test if the characters are equal */
+
+   int comp = strcmp(ca, cb);
+   if(comp == 0) ret_val = true;
+
+   return ret_val;
+} /* lsame_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnteigen.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnteigen.cxx
new file mode 100644
index 0000000..c2eefa7
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnteigen.cxx
@@ -0,0 +1,311 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* mneig.F -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+        -lf2c -lm   (in that order)
+*/
+
+#include <math.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+int mneigen(double* a, unsigned int ndima, unsigned int n, unsigned int mits,
+            double* work, double precis) {
+   // compute matrix eignevalues (transaltion from mneig.F of Minuit)
+
+   /* System generated locals */
+   unsigned int a_dim1, a_offset, i__1, i__2, i__3;
+   double r__1, r__2;
+
+   /* Local variables */
+   double b, c__, f, h__;
+   unsigned int i__, j, k, l, m = 0;
+   double r__, s;
+   unsigned int i0, i1, j1, m1, n1;
+   double hh, gl, pr, pt;
+
+
+   /*          PRECIS is the machine precision EPSMAC */
+   /* Parameter adjustments */
+   a_dim1 = ndima;
+   a_offset = 1 + a_dim1 * 1;
+   a -= a_offset;
+   --work;
+
+   /* Function Body */
+   int ifault = 1;
+
+   i__ = n;
+   i__1 = n;
+   for (i1 = 2; i1 <= i__1; ++i1) {
+      l = i__ - 2;
+      f = a[i__ + (i__ - 1) * a_dim1];
+      gl = (double)0.;
+
+      if (l < 1) {
+         goto L25;
+      }
+
+      i__2 = l;
+      for (k = 1; k <= i__2; ++k) {
+         /* Computing 2nd power */
+         r__1 = a[i__ + k * a_dim1];
+         gl += r__1 * r__1;
+      }
+L25:
+         /* Computing 2nd power */
+         r__1 = f;
+      h__ = gl + r__1 * r__1;
+
+      if (gl > (double)1e-35) {
+         goto L30;
+      }
+
+      work[i__] = (double)0.;
+      work[n + i__] = f;
+      goto L65;
+L30:
+         ++l;
+
+      gl = sqrt(h__);
+
+      if (f >= (double)0.) {
+         gl = -gl;
+      }
+
+      work[n + i__] = gl;
+      h__ -= f * gl;
+      a[i__ + (i__ - 1) * a_dim1] = f - gl;
+      f = (double)0.;
+      i__2 = l;
+      for (j = 1; j <= i__2; ++j) {
+         a[j + i__ * a_dim1] = a[i__ + j * a_dim1] / h__;
+         gl = (double)0.;
+         i__3 = j;
+         for (k = 1; k <= i__3; ++k) {
+            gl += a[j + k * a_dim1] * a[i__ + k * a_dim1];
+         }
+
+         if (j >= l) {
+            goto L47;
+         }
+
+         j1 = j + 1;
+         i__3 = l;
+         for (k = j1; k <= i__3; ++k) {
+            gl += a[k + j * a_dim1] * a[i__ + k * a_dim1];
+         }
+L47:
+            work[n + j] = gl / h__;
+         f += gl * a[j + i__ * a_dim1];
+      }
+      hh = f / (h__ + h__);
+      i__2 = l;
+      for (j = 1; j <= i__2; ++j) {
+         f = a[i__ + j * a_dim1];
+         gl = work[n + j] - hh * f;
+         work[n + j] = gl;
+         i__3 = j;
+         for (k = 1; k <= i__3; ++k) {
+            a[j + k * a_dim1] = a[j + k * a_dim1] - f * work[n + k] - gl
+            * a[i__ + k * a_dim1];
+         }
+      }
+      work[i__] = h__;
+L65:
+         --i__;
+   }
+   work[1] = (double)0.;
+   work[n + 1] = (double)0.;
+   i__1 = n;
+   for (i__ = 1; i__ <= i__1; ++i__) {
+      l = i__ - 1;
+
+      if (work[i__] == (double)0. || l == 0) {
+         goto L100;
+      }
+
+      i__3 = l;
+      for (j = 1; j <= i__3; ++j) {
+         gl = (double)0.;
+         i__2 = l;
+         for (k = 1; k <= i__2; ++k) {
+            gl += a[i__ + k * a_dim1] * a[k + j * a_dim1];
+         }
+         i__2 = l;
+         for (k = 1; k <= i__2; ++k) {
+            a[k + j * a_dim1] -= gl * a[k + i__ * a_dim1];
+         }
+      }
+L100:
+         work[i__] = a[i__ + i__ * a_dim1];
+      a[i__ + i__ * a_dim1] = (double)1.;
+
+      if (l == 0) {
+         goto L110;
+      }
+
+      i__2 = l;
+      for (j = 1; j <= i__2; ++j) {
+         a[i__ + j * a_dim1] = (double)0.;
+         a[j + i__ * a_dim1] = (double)0.;
+      }
+L110:
+         ;
+   }
+
+
+   n1 = n - 1;
+   i__1 = n;
+   for (i__ = 2; i__ <= i__1; ++i__) {
+      i0 = n + i__ - 1;
+      work[i0] = work[i0 + 1];
+   }
+   work[n + n] = (double)0.;
+   b = (double)0.;
+   f = (double)0.;
+   i__1 = n;
+   for (l = 1; l <= i__1; ++l) {
+      j = 0;
+      h__ = precis * ((r__1 = work[l], fabs(r__1)) + (r__2 = work[n + l],
+                                                      fabs(r__2)));
+
+      if (b < h__) {
+         b = h__;
+      }
+
+      i__2 = n;
+      for (m1 = l; m1 <= i__2; ++m1) {
+         m = m1;
+
+         if ((r__1 = work[n + m], fabs(r__1)) <= b) {
+            goto L150;
+         }
+
+      }
+
+L150:
+         if (m == l) {
+            goto L205;
+         }
+
+L160:
+         if (j == mits) {
+            return ifault;
+         }
+
+      ++j;
+      pt = (work[l + 1] - work[l]) / (work[n + l] * (double)2.);
+      r__ = sqrt(pt * pt + (double)1.);
+      pr = pt + r__;
+
+      if (pt < (double)0.) {
+         pr = pt - r__;
+      }
+
+      h__ = work[l] - work[n + l] / pr;
+      i__2 = n;
+      for (i__ = l; i__ <= i__2; ++i__) {
+         work[i__] -= h__;
+      }
+      f += h__;
+      pt = work[m];
+      c__ = (double)1.;
+      s = (double)0.;
+      m1 = m - 1;
+      i__ = m;
+      i__2 = m1;
+      for (i1 = l; i1 <= i__2; ++i1) {
+         j = i__;
+         --i__;
+         gl = c__ * work[n + i__];
+         h__ = c__ * pt;
+
+         if (fabs(pt) >= (r__1 = work[n + i__], fabs(r__1))) {
+            goto L180;
+         }
+
+         c__ = pt / work[n + i__];
+         r__ = sqrt(c__ * c__ + (double)1.);
+         work[n + j] = s * work[n + i__] * r__;
+         s = (double)1. / r__;
+         c__ /= r__;
+         goto L190;
+L180:
+            c__ = work[n + i__] / pt;
+         r__ = sqrt(c__ * c__ + (double)1.);
+         work[n + j] = s * pt * r__;
+         s = c__ / r__;
+         c__ = (double)1. / r__;
+L190:
+            pt = c__ * work[i__] - s * gl;
+         work[j] = h__ + s * (c__ * gl + s * work[i__]);
+         i__3 = n;
+         for (k = 1; k <= i__3; ++k) {
+            h__ = a[k + j * a_dim1];
+            a[k + j * a_dim1] = s * a[k + i__ * a_dim1] + c__ * h__;
+            a[k + i__ * a_dim1] = c__ * a[k + i__ * a_dim1] - s * h__;
+         }
+      }
+      work[n + l] = s * pt;
+      work[l] = c__ * pt;
+
+      if ((r__1 = work[n + l], fabs(r__1)) > b) {
+         goto L160;
+      }
+
+L205:
+         work[l] += f;
+   }
+   i__1 = n1;
+   for (i__ = 1; i__ <= i__1; ++i__) {
+      k = i__;
+      pt = work[i__];
+      i1 = i__ + 1;
+      i__3 = n;
+      for (j = i1; j <= i__3; ++j) {
+
+         if (work[j] >= pt) {
+            goto L220;
+         }
+
+         k = j;
+         pt = work[j];
+L220:
+            ;
+      }
+
+      if (k == i__) {
+         goto L240;
+      }
+
+      work[k] = work[i__];
+      work[i__] = pt;
+      i__3 = n;
+      for (j = 1; j <= i__3; ++j) {
+         pt = a[j + i__ * a_dim1];
+         a[j + i__ * a_dim1] = a[j + k * a_dim1];
+         a[j + k * a_dim1] = pt;
+      }
+L240:
+         ;
+   }
+   ifault = 0;
+
+   return ifault;
+} /* mneig_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mntplot.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mntplot.cxx
new file mode 100644
index 0000000..671cf68
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mntplot.cxx
@@ -0,0 +1,201 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* mnplot.F -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+   -lf2c -lm   (in that order)
+*/
+
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+void mnbins(double, double, int, double&, double&, int&, double&);
+
+void mnplot(double* xpt, double* ypt, char* chpt, int nxypt, int npagwd, int npagln) {
+ //*-*-*-*Plots points in array xypt onto one page with labelled axes*-*-*-*-*
+ //*-*    ===========================================================
+ //*-*        NXYPT is the number of points to be plotted
+ //*-*        XPT(I) = x-coord. of ith point
+ //*-*        YPT(I) = y-coord. of ith point
+ //*-*        CHPT(I) = character to be plotted at this position
+ //*-*        the input point arrays XPT, YPT, CHPT are destroyed.
+ //*-*
+ //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+
+//      char cdot[]   = ".";
+//      char cslash[] = "/";
+
+   /* Local variables */
+   double xmin, ymin, xmax, ymax, savx, savy, yprt;
+   double bwidx, bwidy, xbest, ybest, ax, ay, bx, by;
+   double xvalus[12], any, dxx, dyy;
+   int iten, i, j, k, maxnx, maxny, iquit, ni, linodd;
+   int nxbest, nybest, km1, ibk, isp1, nx, ny, ks, ix;
+   char ctemp[120];
+   bool overpr;
+   char cline[120];
+   char chsav, chbest;
+
+   /* Function Body */
+   //*-*  Computing MIN
+   maxnx = npagwd-20 < 100 ? npagwd-20 : 100;
+   if (maxnx < 10) maxnx = 10;
+   maxny = npagln;
+   if (maxny < 10) maxny = 10;
+   if (nxypt <= 1) return;
+   xbest  = xpt[0];
+   ybest  = ypt[0];
+   chbest = chpt[0];
+   //*-*-        order the points by decreasing y
+   km1 = nxypt - 1;
+   for (i = 1; i <= km1; ++i) {
+      iquit = 0;
+      ni    = nxypt - i;
+      for (j = 1; j <= ni; ++j) {
+         if (ypt[j-1] > ypt[j]) continue;
+         savx     = xpt[j-1];
+         xpt[j-1] = xpt[j];
+         xpt[j]   = savx;
+         savy     = ypt[j-1];
+         ypt[j-1] = ypt[j];
+         ypt[j]   = savy;
+         chsav    = chpt[j-1];
+         chpt[j-1]= chpt[j];
+         chpt[j]  = chsav;
+         iquit    = 1;
+      }
+      if (iquit == 0) break;
+   }
+   //*-*-        find extreme values
+   xmax = xpt[0];
+   xmin = xmax;
+   for (i = 1; i <= nxypt; ++i) {
+      if (xpt[i-1] > xmax) xmax = xpt[i-1];
+      if (xpt[i-1] < xmin) xmin = xpt[i-1];
+   }
+   dxx   = (xmax - xmin)*.001;
+   xmax += dxx;
+   xmin -= dxx;
+   mnbins(xmin, xmax, maxnx, xmin, xmax, nx, bwidx);
+   ymax = ypt[0];
+   ymin = ypt[nxypt-1];
+   if (ymax == ymin) ymax = ymin + 1;
+   dyy   = (ymax - ymin)*.001;
+   ymax += dyy;
+   ymin -= dyy;
+   mnbins(ymin, ymax, maxny, ymin, ymax, ny, bwidy);
+   any = (double) ny;
+   //*-*-        if first point is blank, it is an 'origin'
+   if (chbest == ' ') goto L50;
+   xbest = (xmax + xmin)*.5;
+   ybest = (ymax + ymin)*.5;
+L50:
+      //*-*-        find Scale constants
+      ax = 1 / bwidx;
+   ay = 1 / bwidy;
+   bx = -ax*xmin + 2;
+   by = -ay*ymin - 2;
+   //*-*-        convert points to grid positions
+   for (i = 1; i <= nxypt; ++i) {
+      xpt[i-1] = ax*xpt[i-1] + bx;
+      ypt[i-1] = any - ay*ypt[i-1] - by;
+   }
+   nxbest = int((ax*xbest + bx));
+   nybest = int((any - ay*ybest - by));
+   //*-*-        print the points
+   ny += 2;
+   nx += 2;
+   isp1 = 1;
+   linodd = 1;
+   overpr = false;
+   for (i = 1; i <= ny; ++i) {
+      for (ibk = 1; ibk <= nx; ++ibk) { cline[ibk-1] = ' '; }
+      cline[nx] = '\0';
+      cline[nx+1] = '\0';
+      cline[0]        = '.';
+      // not needed - but to avoid a wrongly reported compiler warning (see ROOT-6496)
+      if (nx>0) cline[nx-1]     = '.';
+      cline[nxbest-1] = '.';
+      if (i != 1 && i != nybest && i != ny) goto L320;
+      for (j = 1; j <= nx; ++j) { cline[j-1] = '.'; }
+L320:
+         yprt = ymax - double(i-1)*bwidy;
+      if (isp1 > nxypt) goto L350;
+      //*-*-        find the points to be plotted on this line
+      for (k = isp1; k <= nxypt; ++k) {
+         ks = int(ypt[k-1]);
+         if (ks > i) goto L345;
+         ix = int(xpt[k-1]);
+         if (cline[ix-1] == '.')   goto L340;
+         if (cline[ix-1] == ' ') goto L340;
+         if (cline[ix-1] == chpt[k-1])   continue;
+         overpr = true;
+         //*-*-        OVERPR is true if one or more positions contains more than
+         //*-*-           one point
+         cline[ix-1] = '&';
+         continue;
+L340:
+            cline[ix-1] = chpt[k-1];
+      }
+      isp1 = nxypt + 1;
+      goto L350;
+L345:
+         isp1 = k;
+L350:
+         if (linodd == 1 || i == ny) goto L380;
+      linodd = 1;
+      memcpy(ctemp, cline, 120);
+      printf("                  %s",(const char*)ctemp);
+      goto L400;
+L380:
+         //   ctemp = cline;
+         memcpy(ctemp, cline, 120);
+      printf(" %14.7g ..%s",yprt,(const char*)ctemp);
+      linodd = 0;
+L400:
+         printf("\n");
+   }
+   //*-*-        print labels on x-axis every ten columns
+   for (ibk = 1; ibk <= nx; ++ibk) {
+      cline[ibk-1] = ' ';
+      if (ibk % 10 == 1) cline[ibk-1] = '/';
+   }
+   printf("                  %s",cline);
+   printf("\n");
+
+   for (ibk = 1; ibk <= 12; ++ibk) {
+      xvalus[ibk-1] = xmin + double(ibk-1)*10*bwidx;
+   }
+   printf("           ");
+   iten = (nx + 9) / 10;
+   for (ibk = 1; ibk <= iten; ++ibk) {
+      printf(" %9.4g", xvalus[ibk-1]);
+   }
+   printf("\n");
+
+   if (overpr) {
+      char chmess[] = "   Overprint character is &";
+      printf("                         ONE COLUMN=%13.7g%s",bwidx,(const char*)chmess);
+   } else {
+      char chmess[] = " ";
+      printf("                         ONE COLUMN=%13.7g%s",bwidx,(const char*)chmess);
+   }
+   printf("\n");
+
+} /* mnplot_ */
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnvert.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnvert.cxx
new file mode 100644
index 0000000..6fb2a86
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnvert.cxx
@@ -0,0 +1,76 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+#include "Minuit2/MnMatrix.h"
+
+#include <cmath>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/** Inverts a symmetric matrix. Matrix is first scaled to have all ones on
+    the diagonal (equivalent to change of units) but no pivoting is done
+    since matrix is positive-definite.
+ */
+
+int mnvert(MnAlgebraicSymMatrix& a) {
+
+   unsigned int nrow = a.Nrow();
+   MnAlgebraicVector s(nrow);
+   MnAlgebraicVector q(nrow);
+   MnAlgebraicVector pp(nrow);
+
+   for(unsigned int i = 0; i < nrow; i++) {
+      double si = a(i,i);
+      if (si < 0.) return 1;
+      s(i) = 1./std::sqrt(si);
+   }
+
+   for(unsigned int i = 0; i < nrow; i++)
+      for(unsigned int j = i; j < nrow; j++)
+         a(i,j) *= (s(i)*s(j));
+
+   for(unsigned i = 0; i < nrow; i++) {
+      unsigned int k = i;
+      if(a(k,k) == 0.) return 1;
+      q(k) = 1./a(k,k);
+      pp(k) = 1.;
+      a(k,k) = 0.;
+      unsigned int kp1 = k + 1;
+      if(k != 0) {
+         for(unsigned int j = 0; j < k; j++) {
+            pp(j) = a(j,k);
+            q(j) = a(j,k)*q(k);
+            a(j,k) = 0.;
+         }
+      }
+      if (k != nrow-1) {
+         for(unsigned int j = kp1; j < nrow; j++) {
+            pp(j) = a(k,j);
+            q(j) = -a(k,j)*q(k);
+            a(k,j) = 0.;
+         }
+      }
+      for(unsigned int j = 0; j < nrow; j++)
+         for(k = j; k < nrow; k++)
+            a(j,k) += (pp(j)*q(k));
+   }
+
+   for(unsigned int j = 0; j < nrow; j++)
+      for(unsigned int k = j; k < nrow; k++)
+         a(j,k) *= (s(j)*s(k));
+
+   return 0;
+}
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnxerbla.cxx b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnxerbla.cxx
new file mode 100644
index 0000000..802af3d
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/Minuit2/mnxerbla.cxx
@@ -0,0 +1,73 @@
+// @(#)root/minuit2:$Id$
+// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005
+
+/**********************************************************************
+ *                                                                    *
+ * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
+ *                                                                    *
+ **********************************************************************/
+
+/* xerbla.f -- translated by f2c (version 20010320).
+   You must link the resulting object file with the libraries:
+   -lf2c -lm   (in that order)
+*/
+
+#include "Minuit2/MnConfig.h"
+#include <iostream>
+
+namespace BA_ROOT {
+
+   namespace Minuit2 {
+
+
+/* Table of constant values */
+
+// static integer c__1 = 1;
+
+int mnxerbla(const char* srname, int info) {
+    /* Format strings */
+//     static char fmt_9999[] = "(\002 ** On entry to \002,a6,\002 Parameter nu\// mber \002,i2,\002 had \002,\002an illegal Value\002)";
+
+/*  -- LAPACK auxiliary routine (version 3.0) -- */
+/*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */
+/*     Courant Institute, Argonne National Lab, and Rice University */
+/*     September 30, 1994 */
+
+/*     .. Scalar Arguments .. */
+/*     .. */
+
+/*  Purpose */
+/*  ======= */
+
+/*  XERBLA  is an Error handler for the LAPACK routines. */
+/*  It is called by an LAPACK routine if an input Parameter has an */
+/*  invalid Value.  A message is printed and execution stops. */
+
+/*  Installers may consider modifying the STOP statement in order to */
+/*  call system-specific exception-handling facilities. */
+
+/*  Arguments */
+/*  ========= */
+
+/*  SRNAME  (input) CHARACTER*6 */
+/*          The Name of the routine which called XERBLA. */
+
+/*  INFO    (input) INTEGER */
+/*          The position of the invalid Parameter in the Parameter list */
+/*          of the calling routine. */
+
+/* ===================================================================== */
+
+/*     .. Executable Statements .. */
+
+   std::cout<<" ** On entry to "<<srname<<" Parameter number "<<info<<" had an illegal Value"<<std::endl;
+
+   /*     End of XERBLA */
+
+   return 0;
+} /* xerbla_ */
+
+
+   }  // namespace Minuit2
+
+}  // namespace ROOT
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticAlgorithm.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticAlgorithm.cxx
new file mode 100644
index 0000000..d2e1b01
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticAlgorithm.cxx
@@ -0,0 +1,264 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : TMVA::GeneticAlgorithm                                                *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Implementation (see header for description)                               *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch> - CERN, Switzerland              *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+//_______________________________________________________________________
+//                                                                      
+// Base definition for genetic algorithm                                
+//_______________________________________________________________________
+
+#include <iostream>
+#include <algorithm>
+#include <float.h>
+
+#ifdef _GLIBCXX_PARALLEL
+#include <omp.h>
+#endif
+
+#include "TMVA/GeneticAlgorithm.h"
+#include "TMVA/Interval.h"
+#include "TMVA/IFitterTarget.h"
+
+//#include "MsgLogger.h"
+#include <cmath>
+namespace BA_TMVA {
+   const Bool_t GeneticAlgorithm__DEBUG__ = kFALSE;
+}
+
+//ClassImp(TMVA::GeneticAlgorithm)
+   
+//_______________________________________________________________________
+BA_TMVA::GeneticAlgorithm::GeneticAlgorithm( IFitterTarget& target, Int_t populationSize,
+                                          const std::vector<Interval*>& ranges, UInt_t seed )
+   : fConvCounter(-1),
+     fFitterTarget( target ),
+     fConvValue(0.),
+     fLastResult(DBL_MAX),
+     fSpread(0.1),
+     fMirror(kTRUE),
+     fFirstTime(kTRUE),
+     fMakeCopies(kFALSE),
+     fPopulationSize(populationSize),
+     fRanges( ranges ),
+     fPopulation(ranges, populationSize, seed),
+     fBestFitness(DBL_MAX)
+//     fLogger( new MsgLogger("GeneticAlgorithm") )
+{
+   // Constructor
+   // Parameters: 
+   //     int populationSize : defines the number of "Individuals" which are created and tested 
+   //                          within one Generation (Iteration of the Evolution)
+   //     std::vector<TMVA::Interval*> ranges : Interval holds the information of an interval, where the GetMin 
+   //                          gets the low and GetMax gets the high constraint of the variable
+   //                          the size of "ranges" is the number of coefficients which are optimised
+   // Purpose: 
+   //     Creates a random population with individuals of the size ranges.size()
+   fPopulation.SetRandomSeed( seed );
+}
+
+BA_TMVA::GeneticAlgorithm::~GeneticAlgorithm()
+{
+   // destructor; deletes fLogger
+//   delete fLogger;
+}
+
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticAlgorithm::Init()
+{
+   // calls evolution, but if it is not the first time. 
+   // If it's the first time, the random population created by the
+   // constructor is still not evaluated, .. therefore we wait for the 
+   // second time init is called. 
+   if ( fFirstTime ) fFirstTime = kFALSE;
+   else {
+      Evolution();
+   }
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::GeneticAlgorithm::NewFitness( Double_t /*oldValue*/, Double_t newValue )
+{
+   // if the "fitnessFunction" is called multiple times for one set of 
+   // factors (because i.e. each event of a TTree has to be assessed with 
+   // each set of Factors proposed by the Genetic Algorithm) the value 
+   // of the current calculation has to be added(? or else) to the value
+   // obtained up to now. 
+   // example: some chi-square is calculated for every event, 
+   // after every event the new chi-square (newValue) has to be simply
+   // added to the oldValue. 
+   //
+   // this function has to be overridden eventually 
+   // it might contain only the following return statement.
+   //        return oldValue + newValue;
+   return newValue;
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::GeneticAlgorithm::CalculateFitness()
+{
+   // starts the evaluation of the fitness of all different individuals of
+   // the population. 
+   //
+   // this function calls implicitly (many times) the "fitnessFunction" which
+   // has been overridden by the user. 
+   fBestFitness = DBL_MAX;
+#ifdef _GLIBCXX_PARALLEL
+
+   const int nt = omp_get_num_threads();
+   Double_t bests[nt];
+   for ( int i =0; i < nt; ++i )
+      bests[i] = fBestFitness;
+
+#pragma omp parallel
+   {
+      int thread_number = omp_get_thread_num();
+#pragma omp for
+      for ( int index = 0; index < fPopulation.GetPopulationSize(); ++index )
+      {
+         GeneticGenes* genes = fPopulation.GetGenes(index);
+         Double_t fitness = NewFitness( genes->GetFitness(), 
+                                        fFitterTarget.EstimatorFunction(genes->GetFactors()) );
+         genes->SetFitness( fitness );
+         
+         if ( bests[thread_number] > fitness )
+            bests[thread_number] = fitness;
+      }
+   }
+   
+   fBestFitness = *std::min_element(bests, bests+nt);
+
+#else 
+
+   for ( int index = 0; index < fPopulation.GetPopulationSize(); ++index ) {
+      GeneticGenes* genes = fPopulation.GetGenes(index);
+      Double_t fitness = NewFitness( genes->GetFitness(),
+                                     fFitterTarget.EstimatorFunction(genes->GetFactors()) );
+      genes->SetFitness( fitness );
+      
+      if ( fBestFitness  > fitness )
+         fBestFitness = fitness;
+      
+   }
+
+#endif
+
+   fPopulation.Sort();
+
+   return fBestFitness; 
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticAlgorithm::Evolution()
+{
+   // this function is called from "init" and controls the evolution of the 
+   // individuals. 
+   // the function can be overridden to change the parameters for mutation rate
+   // sexual reproduction and so on.
+   if ( fMakeCopies ) 
+      fPopulation.MakeCopies( 5 );
+   fPopulation.MakeChildren();
+
+   fPopulation.Mutate( 10, 3, kTRUE, fSpread, fMirror );
+   fPopulation.Mutate( 40, fPopulation.GetPopulationSize()*3/4 );
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::GeneticAlgorithm::SpreadControl( Int_t ofSteps, Int_t successSteps, Double_t factor )
+{
+   // this function provides the ability to change the stepSize of a mutation according to
+   // the success of the last generations. 
+   // 
+   // Parameters:
+   //      int ofSteps :  = if OF the number of STEPS given in this variable (ofSteps)
+   //      int successSteps : >sucessSteps Generations could improve the result
+   //      double factor : than multiply the stepSize ( spread ) by this factor
+   // (if ofSteps == successSteps nothing is changed, if ofSteps < successSteps, the spread
+   // is divided by the factor) 
+   //
+   // using this function one can increase the stepSize of the mutation when we have 
+   // good success (to pass fast through the easy phase-space) and reduce the stepSize
+   // if we are in a difficult "territory" of the phase-space. 
+   //
+
+   // < is valid for "less" comparison
+   if ( fBestFitness < fLastResult || fSuccessList.size() <=0 ) { 
+      fLastResult = fBestFitness;
+      fSuccessList.push_front( 1 ); // it got better
+   } 
+   else {
+      fSuccessList.push_front( 0 ); // it stayed the same
+   }
+   Int_t n = 0;
+   Int_t sum = 0;
+   std::deque<Int_t>::iterator vec = fSuccessList.begin();
+   for (; vec != fSuccessList.end() ; vec++) {
+      sum += *vec;
+      n++;
+   }
+
+   if ( n >= ofSteps ) {
+      fSuccessList.pop_back();
+      if ( sum > successSteps ) { // too much success
+         fSpread /= factor;
+//         if (GeneticAlgorithm__DEBUG__) Log() << kINFO << ">" << std::flush;
+         if (GeneticAlgorithm__DEBUG__) std::cout << kINFO << ">" << std::flush;
+      }
+      else if ( sum == successSteps ) { // on the optimal path
+//          if (GeneticAlgorithm__DEBUG__) Log() << "=" << std::flush;
+          if (GeneticAlgorithm__DEBUG__) std::cout << "=" << std::flush;
+      }
+      else {        // not very successful
+         fSpread *= factor;
+//         if (GeneticAlgorithm__DEBUG__) Log() << "<" << std::flush;
+         if (GeneticAlgorithm__DEBUG__) std::cout << "<" << std::flush;
+      }
+   }
+
+   return fSpread;
+}
+
+//_______________________________________________________________________
+Bool_t BA_TMVA::GeneticAlgorithm::HasConverged( Int_t steps, Double_t improvement )
+{
+   // gives back true if the last "steps" steps have lead to an improvement of the
+   // "fitness" of the "individuals" of at least "improvement"
+   // 
+   // this gives a simple measure of if the fitness of the individuals is
+   // converging and no major improvement is to be expected soon. 
+   //
+   if (fConvCounter < 0) {
+      fConvValue = fBestFitness;
+   }
+   if (std::abs(fBestFitness - fConvValue) <= improvement || steps<0) {
+      fConvCounter ++;
+   } 
+   else {
+      fConvCounter = 0;
+      fConvValue = fBestFitness;
+   }
+//   if (GeneticAlgorithm__DEBUG__) Log() << "." << std::flush;
+   if (GeneticAlgorithm__DEBUG__) std::cout << "." << std::flush;
+   if (fConvCounter < steps) return kFALSE;
+   return kTRUE;
+}
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticGenes.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticGenes.cxx
new file mode 100644
index 0000000..b1c52f6
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticGenes.cxx
@@ -0,0 +1,47 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : TMVA::GeneticGenes                                                    *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Implementation (see header for description)                               *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#include "TMVA/GeneticGenes.h"
+#include "TMVA/GeneticPopulation.h"
+
+//_______________________________________________________________________
+//                                                                      
+// Cut optimisation interface class for genetic algorithm               //
+//_______________________________________________________________________
+
+//ClassImp(TMVA::GeneticGenes)
+   
+//_______________________________________________________________________
+BA_TMVA::GeneticGenes::GeneticGenes( std::vector<Double_t> & f  ) 
+{
+   // Constructor:
+   // set the factors of this individual
+   fFactors = f;
+   fFitness = 0;
+}
+
+Bool_t BA_TMVA::operator <(const BA_TMVA::GeneticGenes& first, const BA_TMVA::GeneticGenes& second)
+{
+   return first.fFitness < second.fFitness;
+}
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticPopulation.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticPopulation.cxx
new file mode 100644
index 0000000..a9404cd
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticPopulation.cxx
@@ -0,0 +1,328 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : TMVA::GeneticPopulation                                               *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Implementation (see header for description)                               *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch> - CERN, Switzerland              *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+#include <iostream>
+#include <iomanip>
+
+//#include "Rstrstream.h"
+//#include "TSystem.h"
+#include "TMVA/TRandom3.h"
+//#include "TH1.h"
+#include <algorithm>
+
+#include "TMVA/GeneticPopulation.h"
+#include "TMVA/GeneticGenes.h"
+//#include "MsgLogger.h"
+
+//ClassImp(TMVA::GeneticPopulation)
+
+using namespace std;
+   
+//_______________________________________________________________________
+//                                                                      
+// Population definition for genetic algorithm                          
+//_______________________________________________________________________
+
+//_______________________________________________________________________
+BA_TMVA::GeneticPopulation::GeneticPopulation(const std::vector<Interval*>& ranges, Int_t size, UInt_t seed)
+   : fGenePool(size),
+     fRanges(ranges.size())
+//     fLogger( new MsgLogger("GeneticPopulation") )
+{
+   // Constructor
+   
+   // create a randomGenerator for this population and set a seed
+   // create the genePools
+   //
+   fRandomGenerator = new BA_ROOT::TRandom3( 100 ); //please check
+   fRandomGenerator->Uniform(0.,1.);
+   fRandomGenerator->SetSeed( seed );
+
+   for ( unsigned int i = 0; i < ranges.size(); ++i )
+      fRanges[i] = new BA_TMVA::GeneticRange( fRandomGenerator, ranges[i] );
+
+   vector<Double_t> newEntry( fRanges.size() );
+   for ( int i = 0; i < size; ++i )
+      {
+         for ( unsigned int rIt = 0; rIt < fRanges.size(); ++rIt )
+            newEntry[rIt] = fRanges[rIt]->Random();
+         fGenePool[i] = BA_TMVA::GeneticGenes( newEntry);
+      }
+
+   fPopulationSizeLimit = size;
+}
+
+//_______________________________________________________________________
+BA_TMVA::GeneticPopulation::~GeneticPopulation()
+{
+   // destructor
+   if (fRandomGenerator != NULL) delete fRandomGenerator;
+
+   std::vector<GeneticRange*>::iterator it = fRanges.begin();
+   for (;it!=fRanges.end(); it++) delete *it;
+
+//   delete fLogger;
+}
+
+
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::SetRandomSeed( UInt_t seed )
+{
+   // the random seed of the random generator
+   fRandomGenerator->SetSeed( seed );
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::MakeCopies( int number )
+{
+   // produces offspring which is are copies of their parents
+   // Parameters:
+   //         int number : the number of the last individual to be copied
+   //
+   
+   int i=0; 
+   for (std::vector<BA_TMVA::GeneticGenes>::iterator it = fGenePool.begin();
+        it != fGenePool.end() && i < number; 
+        ++it, ++i ) {
+      GiveHint( it->GetFactors(), it->GetFitness() );
+   }
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::MakeChildren()
+{
+   // does what the name says,... it creates children out of members of the
+   // current generation
+   // children have a combination of the coefficients of their parents
+   //
+
+#ifdef _GLIBCXX_PARALLEL
+#pragma omp parallel
+#pragma omp for
+#endif
+   for ( int it = 0; it < (int) (fGenePool.size() / 2); ++it )
+      {
+         Int_t pos = (Int_t)fRandomGenerator->Integer( fGenePool.size()/2 );
+         fGenePool[(fGenePool.size() / 2) + it] = MakeSex( fGenePool[it], fGenePool[pos] );
+      }
+}
+
+//_______________________________________________________________________
+BA_TMVA::GeneticGenes BA_TMVA::GeneticPopulation::MakeSex( BA_TMVA::GeneticGenes male,
+                                                     BA_TMVA::GeneticGenes female )
+{
+   // this function takes two individuals and produces offspring by mixing (recombining) their
+   // coefficients
+   //
+   vector< Double_t > child(fRanges.size());
+   for (unsigned int i = 0; i < fRanges.size(); ++i) {
+      if (fRandomGenerator->Integer( 2 ) == 0) {
+         child[i] = male.GetFactors()[i];
+      }else{
+         child[i] = female.GetFactors()[i];
+      }
+   }
+   return BA_TMVA::GeneticGenes( child );
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::Mutate( Double_t probability , Int_t startIndex,
+                                      Bool_t near, Double_t spread, Bool_t mirror ) 
+{
+   // mutates the individuals in the genePool
+   // Parameters:
+   //         double probability : gives the probability (in percent) of a mutation of a coefficient
+   //         int startIndex : leaves unchanged (without mutation) the individuals which are better ranked
+   //                     than indicated by "startIndex". This means: if "startIndex==3", the first (and best)
+   //                     three individuals are not mutaded. This allows to preserve the best result of the 
+   //                     current Generation for the next generation. 
+   //         Bool_t near : if true, the mutation will produce a new coefficient which is "near" the old one
+   //                     (gaussian around the current value)
+   //         double spread : if near==true, spread gives the sigma of the gaussian
+   //         Bool_t mirror : if the new value obtained would be outside of the given constraints
+   //                    the value is mapped between the constraints again. This can be done either
+   //                    by a kind of periodic boundary conditions or mirrored at the boundary.
+   //                    (mirror = true seems more "natural")
+   //
+
+   vector< Double_t>::iterator vec;
+   vector< BA_TMVA::GeneticRange* >::iterator vecRange;
+
+   //#ifdef _GLIBCXX_PARALLEL
+   // #pragma omp parallel
+   // #pragma omp for
+   //#endif
+   // The range methods are not thread safe!
+   for (int it = startIndex; it < (int) fGenePool.size(); ++it) {
+      vecRange = fRanges.begin();
+      for (vec = (fGenePool[it].GetFactors()).begin(); vec < (fGenePool[it].GetFactors()).end(); ++vec) {
+         if (fRandomGenerator->Uniform( 100 ) <= probability) {
+            (*vec) = (*vecRange)->Random( near, (*vec), spread, mirror );
+         }
+         ++vecRange;
+      }
+   }
+}
+
+
+//_______________________________________________________________________
+BA_TMVA::GeneticGenes* BA_TMVA::GeneticPopulation::GetGenes( Int_t index )
+{
+   // gives back the "Genes" of the population with the given index.
+   //
+   return &(fGenePool[index]);
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::Print( Int_t untilIndex )
+{
+   // make a little printout of the individuals up to index "untilIndex"
+   // this means, .. write out the best "untilIndex" individuals.
+   //
+
+   for ( unsigned int it = 0; it < fGenePool.size(); ++it )
+      {
+         Int_t n=0;
+         if (untilIndex >= -1 ) {
+            if (untilIndex == -1 ) return;
+            untilIndex--;
+         }
+//         Log() << "fitness: " << fGenePool[it].GetFitness() << "    ";
+//         for (vector< Double_t >::iterator vec = fGenePool[it].GetFactors().begin();
+//              vec < fGenePool[it].GetFactors().end(); vec++ ) {
+//            Log() << "f_" << n++ << ": " << (*vec) << "     ";
+//         }
+//         Log() << Endl;
+         std::cout << "fitness: " << fGenePool[it].GetFitness() << "    ";
+         for (vector< Double_t >::iterator vec = fGenePool[it].GetFactors().begin();
+              vec < fGenePool[it].GetFactors().end(); vec++ ) {
+            std::cout << "f_" << n++ << ": " << (*vec) << "     ";
+         }
+         std::cout << std::endl;
+
+      }
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::Print( ostream & out, Int_t untilIndex )
+{
+   // make a little printout to the stream "out" of the individuals up to index "untilIndex"
+   // this means, .. write out the best "untilIndex" individuals.
+   //
+
+   for ( unsigned int it = 0; it < fGenePool.size(); ++it ) {
+      Int_t n=0;
+      if (untilIndex >= -1 ) {
+         if (untilIndex == -1 ) return;
+         untilIndex--;
+      }
+      out << "fitness: " << fGenePool[it].GetFitness() << "    ";
+      for (vector< Double_t >::iterator vec = fGenePool[it].GetFactors().begin(); 
+           vec < fGenePool[it].GetFactors().end(); vec++ ) {
+         out << "f_" << n++ << ": " << (*vec) << "     ";
+      }
+      out << std::endl;
+   }
+}
+
+//_______________________________________________________________________
+//TH1F* TMVA::GeneticPopulation::VariableDistribution( Int_t varNumber, Int_t bins,
+//                                                     Int_t min, Int_t max )
+//{
+//   // give back a histogram with the distribution of the coefficients
+//   // parameters:
+//   //          int bins : number of bins of the histogram
+//   //          int min : histogram minimum
+//   //          int max : maximum value of the histogram
+//   //
+
+//   std::cout << "FAILED! TMVA::GeneticPopulation::VariableDistribution" << std::endl;
+
+//   std::stringstream histName;
+//   histName.clear();
+//   histName.str("v");
+//   histName << varNumber;
+//   TH1F *hist = new TH1F( histName.str().c_str(),histName.str().c_str(), bins,min,max );
+
+//   return hist;
+//}
+
+//_______________________________________________________________________
+vector<Double_t> BA_TMVA::GeneticPopulation::VariableDistribution( Int_t /*varNumber*/ )
+{
+   // gives back all the values of coefficient "varNumber" of the current generation
+   //
+
+   std::cout << "FAILED! TMVA::GeneticPopulation::VariableDistribution" << std::endl;
+
+   vector< Double_t > varDist;
+
+   return varDist;
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::AddPopulation( GeneticPopulation *strangers )
+{
+   // add another population (strangers) to the one of this GeneticPopulation
+   for (std::vector<BA_TMVA::GeneticGenes>::iterator it = strangers->fGenePool.begin();
+        it != strangers->fGenePool.end(); it++ ) {
+      GiveHint( it->GetFactors(), it->GetFitness() );
+   }
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::AddPopulation( GeneticPopulation &strangers )
+{
+   // add another population (strangers) to the one of this GeneticPopulation
+   AddPopulation(&strangers);
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::TrimPopulation()
+{
+   // trim the population to the predefined size
+   std::sort(fGenePool.begin(), fGenePool.end());
+   while ( fGenePool.size() > (unsigned int) fPopulationSizeLimit )
+      fGenePool.pop_back();
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::GiveHint( std::vector< Double_t >& hint, Double_t fitness )
+{
+   // add an individual (a set of variables) to the population
+   // if there is a set of variables which is known to perform good, they can be given as a hint to the population
+   BA_TMVA::GeneticGenes g(hint);
+   g.SetFitness(fitness);
+
+   fGenePool.push_back( g );
+}
+
+//_______________________________________________________________________
+void BA_TMVA::GeneticPopulation::Sort()
+{
+   // sort the genepool according to the fitness of the individuals
+   std::sort(fGenePool.begin(), fGenePool.end());
+}
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticRange.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticRange.cxx
new file mode 100644
index 0000000..0b7a458
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/GeneticRange.cxx
@@ -0,0 +1,117 @@
+// @(#)root/tmva $Id$    
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : TMVA::GeneticRange                                                    *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Implementation (see header for description)                               *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ *                                                                                *
+ * File and Version Information:                                                  *
+ **********************************************************************************/
+
+//_______________________________________________________________________
+//                                                                      
+// Range definition for genetic algorithm                               
+//_______________________________________________________________________
+
+#include "TMVA/TRandom3.h"
+
+#include "TMVA/GeneticRange.h"
+
+//ClassImp(TMVA::GeneticRange)
+
+//_______________________________________________________________________
+BA_TMVA::GeneticRange::GeneticRange( BA_ROOT::TRandom3*rnd, Interval *interval )
+{
+   // defines the "f" (from) and "t" (to) of the coefficient
+   // and takes a randomgenerator
+   //
+   fInterval = interval;
+   
+   fFrom = fInterval->GetMin();
+   fTo   = fInterval->GetMax();
+   fNbins= fInterval->GetNbins();
+   fTotalLength = fTo-fFrom;
+
+   fRandomGenerator = rnd;
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::GeneticRange::RandomDiscrete()
+{
+   // creates a new random value for the coefficient; returns a discrete value
+   //
+   Double_t value = fRandomGenerator->Uniform(0, 1);
+   return fInterval->GetElement( Int_t(value*fNbins) );
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::GeneticRange::Random( Bool_t near, Double_t value, Double_t spread, Bool_t mirror )
+{
+   // creates a new random value for the coefficient
+   // Parameters:
+   //        Bool_t near     : takes a random value near the current value
+   //        double value  : this is the current value
+   //        double spread : the sigma of the gaussian which is taken to calculate the new value
+   //        Bool_t mirror   : if the new value would be outside of the range, mirror = false
+   //                        maps the value between the constraints by periodic boundary conditions.
+   //                        With mirror = true, the value gets "reflected" on the boundaries.
+   //
+   if (fInterval->GetNbins() > 0) {   // discrete interval
+       return RandomDiscrete();
+   }
+   else if (fFrom == fTo) {
+      return fFrom;
+   }
+   else if (near) {
+      Double_t ret;
+      ret = fRandomGenerator->Gaus( value, fTotalLength*spread );
+      if (mirror ) return ReMapMirror( ret );
+      else return ReMap( ret );
+   }
+   return fRandomGenerator->Uniform(fFrom, fTo);
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::GeneticRange::ReMap( Double_t val )
+{
+   // remapping the value to the allowed space
+   //
+   if (fFrom >= fTo ) return val;
+   if (val < fFrom ) return ReMap( (val-fFrom) + fTo );
+   if (val >= fTo )    return ReMap( (val-fTo) + fFrom );
+   return val;
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::GeneticRange::ReMapMirror( Double_t val )
+{
+   // remapping the value to the allowed space by reflecting on the 
+   // boundaries
+   if (fFrom >= fTo ) return val;
+   if (val < fFrom  ) return ReMap( fFrom - (val-fFrom) );
+   if (val >= fTo   ) return ReMap( fTo - (val-fTo)  );
+   return val;
+}
+
+//_______________________________________________________________________
+BA_TMVA::GeneticRange::~GeneticRange()
+{
+   // destructor
+}
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/IFitterTarget.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/IFitterTarget.cxx
new file mode 100644
index 0000000..12fd07b
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/IFitterTarget.cxx
@@ -0,0 +1,44 @@
+// @(#)root/tmva $Id$ 
+// Author: Andreas Hoecker, Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : IFitterTarget                                                         *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Implementation                                                            *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Andreas Hoecker <Andreas.Hocker at cern.ch> - CERN, Switzerland              *
+ *      Peter Speckmayer <speckmay at mail.cern.ch> - CERN, Switzerland              *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         * 
+ *      MPI-K Heidelberg, Germany                                                 * 
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ **********************************************************************************/
+
+//_______________________________________________________________________
+//
+// IFitterTarget
+//
+// Interface for a fitter 'target'. Defines interface to the estimator
+// function
+//
+//_______________________________________________________________________
+
+#include "TMVA/IFitterTarget.h"
+
+//ClassImp(TMVA::IFitterTarget)
+
+//_______________________________________________________________________
+BA_TMVA::IFitterTarget::IFitterTarget() 
+{
+   // constructor
+}            
+
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/Interval.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/Interval.cxx
new file mode 100644
index 0000000..c0cede7
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/Interval.cxx
@@ -0,0 +1,182 @@
+// @(#)root/tmva $Id$
+// Author: Peter Speckmayer
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : TMVA::Interval                                                        *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Implementation (see header for description)                               *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Peter Speckmayer <speckmay at mail.cern.ch>  - CERN, Switzerland             *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://tmva.sourceforge.net/LICENSE)                                          *
+ *                                                                                *
+ * File and Version Information:                                                  *
+ **********************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//                                                                          //
+// Interval                                                                 //
+//                                                                          //
+// Interval definition, continuous and discrete                             //
+//                                                                          //
+// Interval(min,max)  : a continous interval [min,max]                      //
+// Interval(min,max,n): a "discrete interval" [min,max], i.e the n numbers: //
+//          min, min+step, min+2*step,...., min+(n-1)*step, min+n*step=max  //
+//   e.g.: Interval(1,5,5)=1,2,3,4,5                                        //
+//         Interval(.5,1.,6)= .5, .6., .7, .8, .9, 1.0                      //
+//                                                                          //
+//  Note: **bin** counting starts from ZERO unlike in ROOT histograms       //
+//////////////////////////////////////////////////////////////////////////////
+/* Begin_Html
+<center><h2>the TMVA::Interval Class</h2></center>
+
+<ul>
+   <li> Interval definition, continuous and discrete
+   <ul>
+         <li>  Interval(min,max)  : a continous interval [min,max]
+         <li>  Interval(min,max,n): a "discrete interval" [min,max], i.e the n numbers:<br>
+         min, min+step, min+2*step,...., min+(n-1)*step=max <br>
+         e.g.: Interval(1,5,5)=1,2,3,4,5                    <br>
+         Interval(.5,1.,6)= .5, .6., .7, .8, .9, 1.0        <br>
+
+   </ul>
+</ul>
+<pre>
+
+    Example:   Interval(.5,1.,6)
+
+             [ min                           max ]
+         ------------------------------------------------------------
+                |     |     |     |     |     |
+               .5    .6    .7    .8    .9    1.0
+
+         bin    0     1     2     3     4     5
+
+
+</pre>
+End_Html */
+
+//#include "TMath.h"
+#include "TMVA/TRandom3.h"
+//#include "ThreadLocalStorage.h"
+
+#include "TMVA/Interval.h"
+//#include "MsgLogger.h"
+#include <stdexcept>
+#include <iostream>
+
+//ClassImp(TMVA::Interval)
+
+//_______________________________________________________________________
+BA_TMVA::Interval::Interval( Double_t min, Double_t max, Int_t nbins ) :
+   fMin(min),
+   fMax(max),
+   fNbins(nbins)
+{
+   // defines minimum and maximum of an interval
+   // when nbins > 0, interval describes a discrete distribution (equally distributed in the interval)
+   // when nbins == 0, interval describes a continous interval
+   //
+   if (fMax - fMin < 0) {
+//       Log() << kFATAL << "maximum lower than minimum" << Endl;
+       throw std::logic_error("maximum lower than minimum");
+   }
+   if (nbins < 0) {
+//      Log() << kFATAL << "nbins < 0" << Endl;
+      throw std::logic_error("nbins < 0");
+      return;
+   }
+   else if (nbins == 1) {
+//      Log() << kFATAL << "interval has to have at least 2 bins if discrete" << Endl;
+      throw std::logic_error("interval has to have at least 2 bins if discrete");
+      return;
+   }
+}
+
+BA_TMVA::Interval::Interval( const Interval& other ) :
+   fMin  ( other.fMin ),
+   fMax  ( other.fMax ),
+   fNbins( other.fNbins )
+{
+}
+
+//_______________________________________________________________________
+BA_TMVA::Interval::~Interval()
+{
+   // destructor
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::Interval::GetElement( Int_t bin ) const
+{
+   // calculates the value of the "number" bin in a discrete interval.
+   // Parameters:
+   //        Double_t position
+   //
+   if (fNbins <= 0) {
+//      Log() << kFATAL << "GetElement only defined for discrete value Intervals" << Endl;
+       throw std::logic_error("GetElement only defined for discrete value Intervals");
+      return 0.0;
+   }
+   else if (bin < 0 || bin >= fNbins) {
+//      Log() << kFATAL << "bin " << bin << " out of range: interval *bins* count from 0 to " << fNbins-1  << Endl;
+      throw std::logic_error("out of range: interval *bins*");
+      return 0.0;
+   }
+      return fMin + ( (Double_t(bin)/(fNbins-1)) *(fMax - fMin) );
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::Interval::GetStepSize( Int_t iBin )  const
+{
+   // retuns the step size between the numbers of a "discrete Interval"
+   if (fNbins <= 0) {
+//      Log() << kFATAL << "GetElement only defined for discrete value Intervals" << Endl;
+      throw std::logic_error("GetElement only defined for discrete value Intervals");
+   }
+   if (iBin<0) {
+//      Log() << kFATAL << "You asked for iBin=" << iBin
+//            <<" in interval .. and.. sorry, I cannot let this happen.."<<Endl;
+       throw std::logic_error("iBin out of range");
+   }
+   return (fMax-fMin)/(Double_t)(fNbins-1);
+}
+
+//_______________________________________________________________________
+Double_t BA_TMVA::Interval::GetRndm( BA_ROOT::TRandom3& rnd )  const
+{
+   // get uniformely distributed number within interval
+   return rnd.Rndm()*(fMax - fMin) + fMin;
+}
+
+Double_t BA_TMVA::Interval::GetWidth() const
+{
+   return fMax - fMin;
+}
+Double_t BA_TMVA::Interval::GetMean()  const
+{
+   return (fMax + fMin)/2;
+}
+
+void BA_TMVA::Interval::Print(std::ostream &os) const
+{
+   for (Int_t i=0; i<GetNbins(); i++){
+      os << "| " << GetElement(i)<<" |" ;
+   }
+}
+
+//TMVA::MsgLogger& TMVA::Interval::Log() const {
+//  TTHREAD_TLS_DECL_ARG(MsgLogger,logger,"Interval");   // message logger
+//  return logger;
+//}
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom.cxx
new file mode 100644
index 0000000..65548d0
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom.cxx
@@ -0,0 +1,632 @@
+// @(#)root/mathcore:$Id$
+// Author: Rene Brun, Lorenzo Moneta   15/12/95
+
+/*************************************************************************
+ * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
+ * All rights reserved.                                                  *
+ *                                                                       *
+ * For the licensing terms see $ROOTSYS/LICENSE.                         *
+ * For the list of contributors see $ROOTSYS/README/CREDITS.             *
+ *************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////
+//
+// TRandom
+//
+// basic Random number generator class (periodicity = 10**9).
+// Note that this is a very simple generator (linear congruential)
+// which is known to have defects (the lower random bits are correlated)
+// and therefore should NOT be used in any statistical study.
+// One should use instead TRandom1, TRandom2 or TRandom3.
+// TRandom3, is based on the "Mersenne Twister generator", and is the recommended one,
+// since it has good random proprieties (period of about 10**6000 ) and it is fast.
+// TRandom1, based on the RANLUX algorithm, has mathematically proven random proprieties
+// and a period of about 10**171. It is however slower than the others.
+// TRandom2, is based on the Tausworthe generator of L'Ecuyer, and it has the advantage
+// of being fast and using only 3 words (of 32 bits) for the state. The period is 10**26.
+//
+// The following table shows some timings (in nanoseconds/call)
+// for the random numbers obtained using an Intel Pentium 3.0 GHz running Linux
+// and using the gcc 3.2.3 compiler
+//
+//    TRandom           34   ns/call     (BAD Generator)
+//    TRandom1          242  ns/call
+//    TRandom2          37   ns/call
+//    TRandom3          45   ns/call
+//
+//
+// The following basic Random distributions are provided:
+// ===================================================
+//   -Exp(tau)
+//   -Integer(imax)
+//   -Gaus(mean,sigma)
+//   -Rndm()
+//   -Uniform(x1)
+//   -Landau(mpv,sigma)
+//   -Poisson(mean)
+//   -Binomial(ntot,prob)
+//
+// Random numbers distributed according to 1-d, 2-d or 3-d distributions
+// =====================================================================
+// contained in TF1, TF2 or TF3 objects.
+// For example, to get a random number distributed following abs(sin(x)/x)*sqrt(x)
+// you can do :
+//   TF1 *f1 = new TF1("f1","abs(sin(x)/x)*sqrt(x)",0,10);
+//   double r = f1->GetRandom();
+// or you can use the UNURAN package. You need in this case to initialize UNURAN
+// to the function you would like to generate.
+//   TUnuran u;
+//   u.Init(TUnuranDistrCont(f1));
+//   double r = u.Sample();
+//
+// The techniques of using directly a TF1,2 or 3 function is powerful and
+// can be used to generate numbers in the defined range of the function.
+// Getting a number from a TF1,2,3 function is also quite fast.
+// UNURAN is a  powerful and flexible tool which containes various methods for
+// generate random numbers for continuous distributions of one and multi-dimension.
+// It requires some set-up (initialization) phase and can be very fast when the distribution
+// parameters are not changed for every call.
+//
+// The following table shows some timings (in nanosecond/call)
+// for basic functions,  TF1 functions and using UNURAN obtained running
+// the tutorial math/testrandom.C
+// Numbers have been obtained on an Intel Xeon Quad-core Harpertown (E5410) 2.33 GHz running
+// Linux SLC4 64 bit and compiled with gcc 3.4
+//
+// Distribution            nanoseconds/call
+//                     TRandom  TRandom1 TRandom2 TRandom3
+// Rndm..............    5.000  105.000    7.000   10.000
+// RndmArray.........    4.000  104.000    6.000    9.000
+// Gaus..............   36.000  180.000   40.000   48.000
+// Rannor............  118.000  220.000  120.000  124.000
+// Landau............   22.000  123.000   26.000   31.000
+// Exponential.......   93.000  198.000   98.000  104.000
+// Binomial(5,0.5)...   30.000  548.000   46.000   65.000
+// Binomial(15,0.5)..   75.000 1615.000  125.000  178.000
+// Poisson(3)........   96.000  494.000  109.000  125.000
+// Poisson(10).......  138.000 1236.000  165.000  203.000
+// Poisson(70).......  818.000 1195.000  835.000  844.000
+// Poisson(100)......  837.000 1218.000  849.000  864.000
+// GausTF1...........   83.000  180.000   87.000   88.000
+// LandauTF1.........   80.000  180.000   83.000   86.000
+// GausUNURAN........   40.000  139.000   41.000   44.000
+// PoissonUNURAN(10).   85.000  271.000   92.000  102.000
+// PoissonUNURAN(100)   62.000  256.000   69.000   78.000
+//
+//  Note that the time to generate a number from an arbitrary TF1 function
+//  using TF1::GetRandom or using TUnuran is  independent of the complexity of the function.
+//
+//  TH1::FillRandom(TH1 *) or TH1::FillRandom(const char *tf1name)
+//  ==============================================================
+//  can be used to fill an histogram (1-d, 2-d, 3-d from an existing histogram
+//  or from an existing function.
+//
+//  Note this interesting feature when working with objects
+//  =======================================================
+//  You can use several TRandom objects, each with their "independent"
+//  random sequence. For example, one can imagine
+//     TRandom *eventGenerator = new TRandom();
+//     TRandom *tracking       = new TRandom();
+//  eventGenerator can be used to generate the event kinematics.
+//  tracking can be used to track the generated particles with random numbers
+//  independent from eventGenerator.
+//  This very interesting feature gives the possibility to work with simple
+//  and very fast random number generators without worrying about
+//  random number periodicity as it was the case with Fortran.
+//  One can use TRandom::SetSeed to modify the seed of one generator.
+//
+//  a TRandom object may be written to a Root file
+//  ==============================================
+//    -as part of another object
+//    -or with its own key (example gRandom->Write("Random");
+//
+//////////////////////////////////////////////////////////////////////////
+
+//#include "TROOT.h"
+//#include "TMath.h"
+#include "TMVA/TRandom.h"
+#include "TMVA/TUUID.h"
+//#include "TRandom3.h"
+//#include "TSystem.h"
+//#include "TDirectory.h"
+//#include "Math/QuantFuncMathCore.h"
+//#include "TUUID.h"
+#include <cmath>
+
+//ClassImp(TRandom)
+
+namespace BA_ROOT {
+
+//______________________________________________________________________________
+TRandom::TRandom(UInt_t seed): TNamed("Random","Default Random number generator")
+{
+   // Default constructor. For seed see SetSeed().
+
+   SetSeed(seed);
+}
+
+//______________________________________________________________________________
+TRandom::~TRandom()
+{
+   // Default destructor. Can reset gRandom to 0 if gRandom points to this
+   // generator.
+
+//   if (gRandom == this) gRandom = 0;
+}
+
+////______________________________________________________________________________
+//Int_t TRandom::Binomial(Int_t ntot, Double_t prob)
+//{
+//   // Generates a random integer N according to the binomial law.
+//   // Coded from Los Alamos report LA-5061-MS.
+//   //
+//   // N is binomially distributed between 0 and ntot inclusive
+//   // with mean prob*ntot and prob is between 0 and 1.
+//   //
+//   // Note: This function should not be used when ntot is large (say >100).
+//   // The normal approximation is then recommended instead
+//   // (with mean =*ntot+0.5 and standard deviation sqrt(ntot*prob*(1-prob)).
+
+//   if (prob < 0 || prob > 1) return 0;
+//   Int_t n = 0;
+//   for (Int_t i=0;i<ntot;i++) {
+//      if (Rndm() > prob) continue;
+//      n++;
+//   }
+//   return n;
+//}
+
+////______________________________________________________________________________
+//Double_t TRandom::BreitWigner(Double_t mean, Double_t gamma)
+//{
+//   // Return a number distributed following a BreitWigner function with mean and gamma.
+
+//   Double_t rval, displ;
+//   rval = 2*Rndm() - 1;
+//   displ = 0.5*gamma*TMath::Tan(rval*TMath::PiOver2());
+
+//   return (mean+displ);
+//}
+
+////______________________________________________________________________________
+//void TRandom::Circle(Double_t &x, Double_t &y, Double_t r)
+//{
+//   // Generates random vectors, uniformly distributed over a circle of given radius.
+//   //   Input : r = circle radius
+//   //   Output: x,y a random 2-d vector of length r
+
+//   Double_t phi = Uniform(0,TMath::TwoPi());
+//   x = r*TMath::Cos(phi);
+//   y = r*TMath::Sin(phi);
+//}
+
+////______________________________________________________________________________
+//Double_t TRandom::Exp(Double_t tau)
+//{
+//   // Returns an exponential deviate.
+//   //
+//   //          exp( -t/tau )
+
+//   Double_t x = Rndm();              // uniform on ] 0, 1 ]
+//   Double_t t = -tau * TMath::Log( x ); // convert to exponential distribution
+//   return t;
+//}
+
+//______________________________________________________________________________
+Double_t TRandom::Gaus(Double_t mean, Double_t sigma)
+{
+   // Samples a random number from the standard Normal (Gaussian) Distribution
+   // with the given mean and sigma.
+   // Uses the Acceptance-complement ratio from W. Hoermann and G. Derflinger
+   // This is one of the fastest existing method for generating normal random variables.
+   // It is a factor 2/3 faster than the polar (Box-Muller) method used in the previous
+   // version of TRandom::Gaus. The speed is comparable to the Ziggurat method (from Marsaglia)
+   // implemented for example in GSL and available in the MathMore library.
+   //
+   // REFERENCE:  - W. Hoermann and G. Derflinger (1990):
+   //              The ACR Method for generating normal random variables,
+   //              OR Spektrum 12 (1990), 181-185.
+   //
+   // Implementation taken from
+   // UNURAN (c) 2000  W. Hoermann & J. Leydold, Institut f. Statistik, WU Wien
+
+   const Double_t kC1 = 1.448242853;
+   const Double_t kC2 = 3.307147487;
+   const Double_t kC3 = 1.46754004;
+   const Double_t kD1 = 1.036467755;
+   const Double_t kD2 = 5.295844968;
+   const Double_t kD3 = 3.631288474;
+   const Double_t kHm = 0.483941449;
+   const Double_t kZm = 0.107981933;
+   const Double_t kHp = 4.132731354;
+   const Double_t kZp = 18.52161694;
+   const Double_t kPhln = 0.4515827053;
+   const Double_t kHm1 = 0.516058551;
+   const Double_t kHp1 = 3.132731354;
+   const Double_t kHzm = 0.375959516;
+   const Double_t kHzmp = 0.591923442;
+   /*zhm 0.967882898*/
+
+   const Double_t kAs = 0.8853395638;
+   const Double_t kBs = 0.2452635696;
+   const Double_t kCs = 0.2770276848;
+   const Double_t kB  = 0.5029324303;
+   const Double_t kX0 = 0.4571828819;
+   const Double_t kYm = 0.187308492 ;
+   const Double_t kS  = 0.7270572718 ;
+   const Double_t kT  = 0.03895759111;
+
+   Double_t result;
+   Double_t rn,x,y,z;
+
+   do {
+      y = Rndm();
+
+      if (y>kHm1) {
+         result = kHp*y-kHp1; break; }
+
+      else if (y<kZm) {
+         rn = kZp*y-1;
+         result = (rn>0) ? (1+rn) : (-1+rn);
+         break;
+      }
+
+      else if (y<kHm) {
+         rn = Rndm();
+         rn = rn-1+rn;
+         z = (rn>0) ? 2-rn : -2-rn;
+         if ((kC1-y)*(kC3+std::abs(z))<kC2) {
+            result = z; break; }
+         else {
+            x = rn*rn;
+            if ((y+kD1)*(kD3+x)<kD2) {
+               result = rn; break; }
+            else if (kHzmp-y<exp(-(z*z+kPhln)/2)) {
+               result = z; break; }
+            else if (y+kHzm<exp(-(x+kPhln)/2)) {
+               result = rn; break; }
+         }
+      }
+
+      while (1) {
+         x = Rndm();
+         y = kYm * Rndm();
+         z = kX0 - kS*x - y;
+         if (z>0)
+            rn = 2+y/x;
+         else {
+            x = 1-x;
+            y = kYm-y;
+            rn = -(2+y/x);
+         }
+         if ((y-kAs+x)*(kCs+x)+kBs<0) {
+            result = rn; break; }
+         else if (y<x+kT)
+            if (rn*rn<4*(kB-log(x))) {
+               result = rn; break; }
+      }
+   } while(0);
+
+   return mean + sigma * result;
+}
+
+//______________________________________________________________________________
+UInt_t TRandom::Integer(UInt_t imax)
+{
+   // Returns a random integer on [ 0, imax-1 ].
+
+   UInt_t ui;
+   ui = (UInt_t)(imax*Rndm());
+   return ui;
+}
+
+////______________________________________________________________________________
+//Double_t TRandom::Landau(Double_t mu, Double_t sigma)
+//{
+//   // Generate a random number following a Landau distribution
+//   // with location parameter mu and scale parameter sigma:
+//   //      Landau( (x-mu)/sigma )
+//   // Note that mu is not the mpv(most probable value) of the Landa distribution
+//   // and sigma is not the standard deviation of the distribution which is not defined.
+//   // For mu  =0 and sigma=1, the mpv = -0.22278
+//   //
+//   // The Landau random number generation is implemented using the
+//   // function landau_quantile(x,sigma), which provides
+//   // the inverse of the landau cumulative distribution.
+//   // landau_quantile has been converted from CERNLIB ranlan(G110).
+
+//   if (sigma <= 0) return 0;
+//   Double_t x = Rndm();
+//   Double_t res = mu + ROOT::Math::landau_quantile(x, sigma);
+//   return res;
+//}
+
+////______________________________________________________________________________
+//Int_t TRandom::Poisson(Double_t mean)
+//{
+//   // Generates a random integer N according to a Poisson law.
+//   // Prob(N) = exp(-mean)*mean^N/Factorial(N)
+//   //
+//   // Use a different procedure according to the mean value.
+//   // The algorithm is the same used by CLHEP.
+//   // For lower value (mean < 25) use the rejection method based on
+//   // the exponential.
+//   // For higher values use a rejection method comparing with a Lorentzian
+//   // distribution, as suggested by several authors.
+//   // This routine since is returning 32 bits integer will not work for values
+//   // larger than 2*10**9.
+//   // One should then use the Trandom::PoissonD for such large values.
+
+//   Int_t n;
+//   if (mean <= 0) return 0;
+//   if (mean < 25) {
+//      Double_t expmean = TMath::Exp(-mean);
+//      Double_t pir = 1;
+//      n = -1;
+//      while(1) {
+//         n++;
+//         pir *= Rndm();
+//         if (pir <= expmean) break;
+//      }
+//      return n;
+//   }
+//   // for large value we use inversion method
+//   else if (mean < 1E9) {
+//      Double_t em, t, y;
+//      Double_t sq, alxm, g;
+//      Double_t pi = TMath::Pi();
+
+//      sq = TMath::Sqrt(2.0*mean);
+//      alxm = TMath::Log(mean);
+//      g = mean*alxm - TMath::LnGamma(mean + 1.0);
+
+//      do {
+//         do {
+//            y = TMath::Tan(pi*Rndm());
+//            em = sq*y + mean;
+//         } while( em < 0.0 );
+
+//         em = TMath::Floor(em);
+//         t = 0.9*(1.0 + y*y)* TMath::Exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
+//      } while( Rndm() > t );
+
+//      return static_cast<Int_t> (em);
+
+//   }
+//   else {
+//      // use Gaussian approximation vor very large values
+//      n = Int_t(Gaus(0,1)*TMath::Sqrt(mean) + mean +0.5);
+//      return n;
+//   }
+//}
+
+////______________________________________________________________________________
+//Double_t TRandom::PoissonD(Double_t mean)
+//{
+//   // Generates a random number according to a Poisson law.
+//   // Prob(N) = exp(-mean)*mean^N/Factorial(N)
+//   //
+//   // This function is a variant of TRandom::Poisson returning a double
+//   // instead of an integer.
+
+//   Int_t n;
+//   if (mean <= 0) return 0;
+//   if (mean < 25) {
+//      Double_t expmean = TMath::Exp(-mean);
+//      Double_t pir = 1;
+//      n = -1;
+//      while(1) {
+//         n++;
+//         pir *= Rndm();
+//         if (pir <= expmean) break;
+//      }
+//      return static_cast<Double_t>(n);
+//   }
+//   // for large value we use inversion method
+//   else if (mean < 1E9) {
+//      Double_t em, t, y;
+//      Double_t sq, alxm, g;
+//      Double_t pi = TMath::Pi();
+
+//      sq = TMath::Sqrt(2.0*mean);
+//      alxm = TMath::Log(mean);
+//      g = mean*alxm - TMath::LnGamma(mean + 1.0);
+
+//      do {
+//         do {
+//            y = TMath::Tan(pi*Rndm());
+//            em = sq*y + mean;
+//         } while( em < 0.0 );
+
+//         em = TMath::Floor(em);
+//         t = 0.9*(1.0 + y*y)* TMath::Exp(em*alxm - TMath::LnGamma(em + 1.0) - g);
+//      } while( Rndm() > t );
+
+//      return em;
+
+//   } else {
+//      // use Gaussian approximation vor very large values
+//      return Gaus(0,1)*TMath::Sqrt(mean) + mean +0.5;
+//   }
+//}
+
+////______________________________________________________________________________
+//void TRandom::Rannor(Float_t &a, Float_t &b)
+//{
+//   // Return 2 numbers distributed following a gaussian with mean=0 and sigma=1.
+
+//   Double_t r, x, y, z;
+
+//   y = Rndm();
+//   z = Rndm();
+//   x = z * 6.28318530717958623;
+//   r = TMath::Sqrt(-2*TMath::Log(y));
+//   a = (Float_t)(r * TMath::Sin(x));
+//   b = (Float_t)(r * TMath::Cos(x));
+//}
+
+////______________________________________________________________________________
+//void TRandom::Rannor(Double_t &a, Double_t &b)
+//{
+//   // Return 2 numbers distributed following a gaussian with mean=0 and sigma=1.
+
+//   Double_t r, x, y, z;
+
+//   y = Rndm();
+//   z = Rndm();
+//   x = z * 6.28318530717958623;
+//   r = TMath::Sqrt(-2*TMath::Log(y));
+//   a = r * TMath::Sin(x);
+//   b = r * TMath::Cos(x);
+//}
+
+////_____________________________________________________________________________
+//void TRandom::ReadRandom(const char *filename)
+//{
+//   // Reads saved random generator status from filename.
+
+//   if (!gDirectory) return;
+//   char *fntmp = gSystem->ExpandPathName(filename);
+//   TDirectory *file = (TDirectory*)gROOT->ProcessLine(Form("TFile::Open(\"%s\");",fntmp));
+//   delete [] fntmp;
+//   if(file && file->GetFile()) {
+//      gDirectory->ReadTObject(this,GetName());
+//      delete file;
+//   }
+//}
+
+//______________________________________________________________________________
+Double_t TRandom::Rndm(Int_t)
+{
+   //  Machine independent random number generator.
+   //  Based on the BSD Unix (Rand) Linear congrential generator.
+   //  Produces uniformly-distributed floating points between 0 and 1.
+   //  Identical sequence on all machines of >= 32 bits.
+   //  Periodicity = 2**31, generates a number in (0,1).
+   //  Note that this is a generator which is known to have defects
+   //  (the lower random bits are correlated) and therefore should NOT be
+   //  used in any statistical study).
+
+#ifdef OLD_TRANDOM_IMPL
+   const Double_t kCONS = 4.6566128730774E-10;
+   const Int_t kMASK24  = 2147483392;
+
+   fSeed *= 69069;
+   UInt_t jy = (fSeed&kMASK24); // Set lower 8 bits to zero to assure exact float
+   if (jy) return kCONS*jy;
+   return Rndm();
+#endif
+
+   // kCONS = 1./2147483648 = 1./(RAND_MAX+1) and RAND_MAX= 0x7fffffffUL
+   const Double_t kCONS = 4.6566128730774E-10; // (1/pow(2,31)
+   fSeed = (1103515245 * fSeed + 12345) & 0x7fffffffUL;
+
+   if (fSeed) return  kCONS*fSeed;
+   return Rndm();
+}
+
+//______________________________________________________________________________
+void TRandom::RndmArray(Int_t n, Double_t *array)
+{
+   // Return an array of n random numbers uniformly distributed in ]0,1].
+
+   const Double_t kCONS = 4.6566128730774E-10; // (1/pow(2,31))
+   Int_t i=0;
+   while (i<n) {
+      fSeed = (1103515245 * fSeed + 12345) & 0x7fffffffUL;
+      if (fSeed) {array[i] = kCONS*fSeed; i++;}
+   }
+}
+
+//______________________________________________________________________________
+void TRandom::RndmArray(Int_t n, Float_t *array)
+{
+   // Return an array of n random numbers uniformly distributed in ]0,1].
+
+   const Double_t kCONS = 4.6566128730774E-10; // (1/pow(2,31))
+   Int_t i=0;
+   while (i<n) {
+      fSeed = (1103515245 * fSeed + 12345) & 0x7fffffffUL;
+      if (fSeed) {array[i] = Float_t(kCONS*fSeed); i++;}
+   }
+}
+
+//______________________________________________________________________________
+void TRandom::SetSeed(UInt_t seed)
+{
+   // Set the random generator seed. Note that default value is zero, which is
+   // different than the default value used when constructing the class.
+   // If the seed is zero the seed is set to a random value
+   // which in case of TRandom depends on the lowest 4 bytes of TUUID
+   // The UUID will be identical if SetSeed(0) is called with time smaller than 100 ns
+   // Instead if a different generator implementation is used (TRandom1, 2 or 3)
+   // the seed is generated using a 128 bit UUID. This results in different seeds
+   // and then random sequence for every SetSeed(0) call.
+
+   if( seed==0 ) {
+      TUUID u;
+      UChar_t uuid[16];
+      u.GetUUID(uuid);
+      fSeed  =  UInt_t(uuid[3])*16777216 + UInt_t(uuid[2])*65536 + UInt_t(uuid[1])*256 + UInt_t(uuid[0]);
+   } else {
+      fSeed = seed;
+   }
+}
+
+////______________________________________________________________________________
+//void TRandom::Sphere(Double_t &x, Double_t &y, Double_t &z, Double_t r)
+//{
+//   // Generates random vectors, uniformly distributed over the surface
+//   // of a sphere of given radius.
+//   //   Input : r = sphere radius
+//   //   Output: x,y,z a random 3-d vector of length r
+//   // Method: (based on algorithm suggested by Knuth and attributed to Robert E Knop)
+//   //         which uses less random numbers than the CERNLIB RN23DIM algorithm
+
+//   Double_t a=0,b=0,r2=1;
+//   while (r2 > 0.25) {
+//      a  = Rndm() - 0.5;
+//      b  = Rndm() - 0.5;
+//      r2 =  a*a + b*b;
+//   }
+//   z = r* ( -1. + 8.0 * r2 );
+
+//   Double_t scale = 8.0 * r * TMath::Sqrt(0.25 - r2);
+//   x = a*scale;
+//   y = b*scale;
+//}
+
+//______________________________________________________________________________
+Double_t TRandom::Uniform(Double_t x1)
+{
+   // Returns a uniform deviate on the interval  (0, x1).
+
+   Double_t ans = Rndm();
+   return x1*ans;
+}
+
+//______________________________________________________________________________
+Double_t TRandom::Uniform(Double_t x1, Double_t x2)
+{
+   // Returns a uniform deviate on the interval (x1, x2).
+
+   Double_t ans= Rndm();
+   return x1 + (x2-x1)*ans;
+}
+
+////_____________________________________________________________________________
+//void TRandom::WriteRandom(const char *filename)
+//{
+//   // Writes random generator status to filename.
+
+//   if (!gDirectory) return;
+//   char *fntmp = gSystem->ExpandPathName(filename);
+//   TDirectory *file = (TDirectory*)gROOT->ProcessLine(Form("TFile::Open(\"%s\",\"recreate\");",fntmp));
+//   delete [] fntmp;
+//   if(file && file->GetFile()) {
+//      gDirectory->WriteTObject(this,GetName());
+//      delete file;
+//   }
+//}
+
+}
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom2.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom2.cxx
new file mode 100644
index 0000000..6e5c304
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom2.cxx
@@ -0,0 +1,163 @@
+// @(#)root/mathcore:$Id$
+// Author: Rene Brun, Lorenzo Moneta  17/05/2006
+
+//////////////////////////////////////////////////////////////////////////
+//
+// TRandom2
+//
+// Random number generator class based on the maximally quidistributed combined
+// Tausworthe generator by L'Ecuyer.
+//
+// The period of the generator is 2**88 (about 10**26) and it uses only 3 words
+// for the state.
+//
+// For more information see:
+// P. L'Ecuyer, Mathematics of Computation, 65, 213 (1996)
+// P. L'Ecuyer, Mathematics of Computation, 68, 225 (1999)
+//
+// The publication are available online at
+//  http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps
+//  http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps
+//////////////////////////////////////////////////////////////////////////
+
+#include "TMVA/TRandom2.h"
+//#include "TRandom3.h"
+#include "TMVA/TUUID.h"
+
+
+//ClassImp(TRandom2)
+
+namespace BA_ROOT {
+
+//______________________________________________________________________________
+TRandom2::TRandom2(UInt_t seed)
+{
+//*-*-*-*-*-*-*-*-*-*-*default constructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+//*-*                  ===================
+
+   SetName("Random2");
+   SetTitle("Random number generator with period of about  10**26");
+   SetSeed(seed);
+}
+
+//______________________________________________________________________________
+TRandom2::~TRandom2()
+{
+//*-*-*-*-*-*-*-*-*-*-*default destructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+//*-*                  ==================
+
+}
+
+//______________________________________________________________________________
+Double_t TRandom2::Rndm(Int_t)
+{
+   //  TausWorth generator from L'Ecuyer, uses as seed 3x32bits integers
+   //  Use a mask of 0xffffffffUL to make in work on 64 bit machines
+   //  Periodicity of about  10**26
+   //  Generate number in interval (0,1)  : 0 and 1 are not included in the interval
+
+#define TAUSWORTHE(s,a,b,c,d) (((s &c) <<d) & 0xffffffffUL ) ^ ((((s <<a) & 0xffffffffUL )^s) >>b)
+
+   // scale by 1./(Max<UINT> + 1) = 1./4294967296
+   const double kScale = 2.3283064365386963e-10;    // range in 32 bit ( 1/(2**32)
+
+   fSeed  = TAUSWORTHE (fSeed, 13, 19, 4294967294UL, 12);
+   fSeed1 = TAUSWORTHE (fSeed1, 2, 25, 4294967288UL, 4);
+   fSeed2 = TAUSWORTHE (fSeed2, 3, 11, 4294967280UL, 17);
+
+   UInt_t iy = fSeed ^ fSeed1 ^ fSeed2;
+   if (iy) return  kScale*static_cast<Double_t>(iy);
+   return Rndm();
+}
+
+//______________________________________________________________________________
+void TRandom2::RndmArray(Int_t n, Float_t *array)
+{
+   // Return an array of n random numbers uniformly distributed in ]0,1]
+
+   const double kScale = 2.3283064365386963e-10;    // range in 32 bit ( 1/(2**32)
+
+   UInt_t iy;
+
+   for(Int_t i=0; i<n; i++) {
+      fSeed  = TAUSWORTHE (fSeed, 13, 19, 4294967294UL, 12);
+      fSeed1 = TAUSWORTHE (fSeed1, 2, 25, 4294967288UL, 4);
+      fSeed2 = TAUSWORTHE (fSeed2, 3, 11, 4294967280UL, 17);
+
+      iy = fSeed ^ fSeed1 ^ fSeed2;
+      if (iy) array[i] = (Float_t)(kScale*static_cast<Double_t>(iy));
+      else    array[i] = (Float_t)Rndm();
+   }
+}
+
+//______________________________________________________________________________
+void TRandom2::RndmArray(Int_t n, Double_t *array)
+{
+   // Return an array of n random numbers uniformly distributed in ]0,1]
+
+   const double kScale = 2.3283064365386963e-10;    // range in 32 bit ( 1/(2**32)
+
+   UInt_t iy;
+   for(Int_t i=0; i<n; i++) {
+      fSeed  = TAUSWORTHE (fSeed, 13, 19, 4294967294UL, 12);
+      fSeed1 = TAUSWORTHE (fSeed1, 2, 25, 4294967288UL, 4);
+      fSeed2 = TAUSWORTHE (fSeed2, 3, 11, 4294967280UL, 17);
+
+      iy = fSeed ^ fSeed1 ^ fSeed2;
+      if (iy) array[i] = kScale*static_cast<Double_t>(iy);
+      else    array[i] = Rndm();
+   }
+}
+
+//______________________________________________________________________________
+void TRandom2::SetSeed(UInt_t seed)
+{
+   // Set the generator seed.
+   // If the seed given is zero, generate automatically seed values which
+   // are different every time by using TRandom3  and TUUID
+   // If a seed is given generate the other two needed for the generator state using
+   // a linear congruential generator
+   // The only condition, stated at the end of the 1999 L'Ecuyer paper is that the seeds
+   // must be greater than 1,7 and 15.
+
+#define LCG(n) ((69069 * n) & 0xffffffffUL)  // linear congurential generator
+
+   if (seed > 0) {
+      fSeed = LCG (seed);
+      if (fSeed < 2) fSeed += 2UL;
+      fSeed1 = LCG (fSeed);
+      if (fSeed1 < 8) fSeed1 += 8UL;
+      fSeed2 = LCG (fSeed1);
+      if (fSeed2 < 16) fSeed2 += 16UL;
+   } else {
+      // initialize using a TUUID
+      TUUID u;
+      UChar_t uuid[16];
+      u.GetUUID(uuid);
+      fSeed  =  UInt_t(uuid[3])*16777216 + UInt_t(uuid[2])*65536 + UInt_t(uuid[1])*256 + UInt_t(uuid[0]);
+      fSeed1  =  UInt_t(uuid[7])*16777216 + UInt_t(uuid[6])*65536 + UInt_t(uuid[5])*256 + UInt_t(uuid[4]);
+      fSeed2  =  UInt_t(uuid[11])*16777216 + UInt_t(uuid[10])*65536 + UInt_t(uuid[9])*256 + UInt_t(uuid[8]);
+      // use also the other bytes
+      UInt_t seed3 = UInt_t(uuid[15])*16777216 + UInt_t(uuid[14])*65536 + UInt_t(uuid[13])*256 + int(uuid[12]);
+      fSeed2 += seed3; 
+
+
+
+      //    TRandom r3(0);
+      // fSeed   = static_cast<UInt_t> (4294967296.*r3.Rndm());
+      // fSeed1  = static_cast<UInt_t> (4294967296.*r3.Rndm());
+      // fSeed2  = static_cast<UInt_t> (4294967296.*r3.Rndm());
+
+      if (fSeed < 2)   fSeed  += 2UL;
+      if (fSeed1 < 8)  fSeed1 += 8UL;
+      if (fSeed2 < 16) fSeed2 += 16UL;
+   }
+
+   // "warm it up" by calling it 6 times
+   for (int i = 0; i < 6; ++i)
+      Rndm();
+
+   return;
+}
+
+}
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom3.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom3.cxx
new file mode 100644
index 0000000..d457e2f
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/TRandom3.cxx
@@ -0,0 +1,249 @@
+// @(#)root/mathcore:$Id$
+// Author: Peter Malzacher   31/08/99
+
+//////////////////////////////////////////////////////////////////////////
+//
+// TRandom3
+//
+// Random number generator class based on
+//   M. Matsumoto and T. Nishimura,
+//   Mersenne Twister: A 623-diminsionally equidistributed
+//   uniform pseudorandom number generator
+//   ACM Transactions on Modeling and Computer Simulation,
+//   Vol. 8, No. 1, January 1998, pp 3--30.
+//
+// For more information see the Mersenne Twister homepage
+//   http://www.math.keio.ac.jp/~matumoto/emt.html
+//
+// Advantage: large period 2**19937-1
+//            relativly fast
+//              (only two times slower than TRandom, but
+//               two times faster than TRandom2)
+// Drawback:  a relative large internal state of 624 integers
+//
+//
+// Aug.99 ROOT implementation based on CLHEP by P.Malzacher
+//
+// the original code contains the following copyright notice:
+/* This library is free software; you can redistribute it and/or   */
+/* modify it under the terms of the GNU Library General Public     */
+/* License as published by the Free Software Foundation; either    */
+/* version 2 of the License, or (at your option) any later         */
+/* version.                                                        */
+/* This library is distributed in the hope that it will be useful, */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of  */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.            */
+/* See the GNU Library General Public License for more details.    */
+/* You should have received a copy of the GNU Library General      */
+/* Public License along with this library; if not, write to the    */
+/* Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   */
+/* 02111-1307  USA                                                 */
+/* Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura.       */
+/* When you use this, send an email to: matumoto at math.keio.ac.jp   */
+/* with an appropriate reference to your work.                     */
+/////////////////////////////////////////////////////////////////////
+
+#include "TMVA/TRandom3.h"
+#include "TMVA/TRandom2.h"
+//#include "TClass.h"
+//#include "TUUID.h"
+
+//TRandom *gRandom = new TRandom3();
+//#ifdef R__COMPLETE_MEM_TERMINATION
+//namespace {
+//   struct TRandomCleanup {
+//      ~TRandomCleanup() { delete gRandom; gRandom = 0; }
+//   };
+//   static TRandomCleanup gCleanupRandom;
+//}
+//#endif
+
+//ClassImp(TRandom3)
+
+namespace BA_ROOT {
+
+//______________________________________________________________________________
+TRandom3::TRandom3(UInt_t seed)
+{
+//*-*-*-*-*-*-*-*-*-*-*default constructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+// If seed is 0, the seed is automatically computed via a TUUID object.
+// In this case the seed is guaranteed to be unique in space and time.
+
+   SetName("Random3");
+   SetTitle("Random number generator: Mersenne Twister");
+   SetSeed(seed);
+}
+
+//______________________________________________________________________________
+TRandom3::~TRandom3()
+{
+//*-*-*-*-*-*-*-*-*-*-*default destructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
+//*-*                  ==================
+
+}
+
+//______________________________________________________________________________
+Double_t TRandom3::Rndm(Int_t)
+{
+//  Machine independent random number generator.
+//  Produces uniformly-distributed floating points in (0,1)
+//  Method: Mersenne Twister
+
+   UInt_t y;
+
+   const Int_t  kM = 397;
+   const Int_t  kN = 624;
+   const UInt_t kTemperingMaskB =  0x9d2c5680;
+   const UInt_t kTemperingMaskC =  0xefc60000;
+   const UInt_t kUpperMask =       0x80000000;
+   const UInt_t kLowerMask =       0x7fffffff;
+   const UInt_t kMatrixA =         0x9908b0df;
+
+   if (fCount624 >= kN) {
+      Int_t i;
+
+      for (i=0; i < kN-kM; i++) {
+         y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask);
+         fMt[i] = fMt[i+kM] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
+      }
+
+      for (   ; i < kN-1    ; i++) {
+         y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask);
+         fMt[i] = fMt[i+kM-kN] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
+      }
+
+      y = (fMt[kN-1] & kUpperMask) | (fMt[0] & kLowerMask);
+      fMt[kN-1] = fMt[kM-1] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
+      fCount624 = 0;
+   }
+
+   y = fMt[fCount624++];
+   y ^=  (y >> 11);
+   y ^= ((y << 7 ) & kTemperingMaskB );
+   y ^= ((y << 15) & kTemperingMaskC );
+   y ^=  (y >> 18);
+
+   // 2.3283064365386963e-10 == 1./(max<UINt_t>+1)  -> then returned value cannot be = 1.0
+   if (y) return ( (Double_t) y * 2.3283064365386963e-10); // * Power(2,-32)
+   return Rndm();
+}
+
+//______________________________________________________________________________
+void TRandom3::RndmArray(Int_t n, Float_t *array)
+{
+  // Return an array of n random numbers uniformly distributed in ]0,1]
+
+  for(Int_t i=0; i<n; i++) array[i]=(Float_t)Rndm();
+}
+
+//______________________________________________________________________________
+void TRandom3::RndmArray(Int_t n, Double_t *array)
+{
+  // Return an array of n random numbers uniformly distributed in ]0,1]
+
+   Int_t k = 0;
+
+   UInt_t y;
+
+   const Int_t  kM = 397;
+   const Int_t  kN = 624;
+   const UInt_t kTemperingMaskB =  0x9d2c5680;
+   const UInt_t kTemperingMaskC =  0xefc60000;
+   const UInt_t kUpperMask =       0x80000000;
+   const UInt_t kLowerMask =       0x7fffffff;
+   const UInt_t kMatrixA =         0x9908b0df;
+
+   while (k < n) {
+      if (fCount624 >= kN) {
+         Int_t i;
+
+         for (i=0; i < kN-kM; i++) {
+            y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask);
+            fMt[i] = fMt[i+kM] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
+         }
+
+         for (   ; i < kN-1    ; i++) {
+            y = (fMt[i] & kUpperMask) | (fMt[i+1] & kLowerMask);
+            fMt[i] = fMt[i+kM-kN] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
+         }
+
+         y = (fMt[kN-1] & kUpperMask) | (fMt[0] & kLowerMask);
+         fMt[kN-1] = fMt[kM-1] ^ (y >> 1) ^ ((y & 0x1) ? kMatrixA : 0x0);
+         fCount624 = 0;
+      }
+
+      y = fMt[fCount624++];
+      y ^=  (y >> 11);
+      y ^= ((y << 7 ) & kTemperingMaskB );
+      y ^= ((y << 15) & kTemperingMaskC );
+      y ^=  (y >> 18);
+
+      if (y) {
+         array[k] = Double_t( y * 2.3283064365386963e-10); // * Power(2,-32)
+         k++;
+      }
+   }
+}
+
+//______________________________________________________________________________
+void TRandom3::SetSeed(UInt_t seed)
+{
+//  Set the random generator sequence
+// if seed is 0 (default value) a TUUID is generated and used to fill
+// the first 8 integers of the seed array.
+// In this case the seed is guaranteed to be unique in space and time.
+// Use upgraded seeding procedure to fix a known problem when seeding with values
+// with many zero in the bit pattern (like 2**28).
+// see http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html
+
+   TRandom::SetSeed(seed);
+   fCount624 = 624;
+   if (seed > 0) {
+      fMt[0] = fSeed;
+
+      // use multipliers from  Knuth's "Art of Computer Programming" Vol. 2, 3rd Ed. p.106
+      for(Int_t i=1; i<624; i++) {
+         fMt[i] = (1812433253 * ( fMt[i-1]  ^ ( fMt[i-1] >> 30)) + i );
+      }
+
+   } else {
+
+      // use TRandom2 (which is based on TUUId to generate the seed
+      // TRandom2 works fairly well  and has been tested against example
+      // layout in https://savannah.cern.ch/bugs/?99516
+      TRandom2 r(0);
+      for (Int_t i = 0; i< 624; i++) {
+         fMt[i]   = static_cast<UInt_t> (4294967296.*r.Rndm());
+      }
+      // warm up the generator calling it 10 times
+      for (Int_t i = 0; i < 10; ++i) Rndm();
+   }
+
+
+}
+
+//______________________________________________________________________________
+//void TRandom3::Streamer(TBuffer &R__b)
+//{
+//   // Stream an object of class TRandom3.
+
+//   if (R__b.IsReading()) {
+//      UInt_t R__s, R__c;
+//      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
+//      if (R__v > 1) {
+//         R__b.ReadClassBuffer(TRandom3::Class(), this, R__v, R__s, R__c);
+//         return;
+//      }
+//      //====process old versions before automatic schema evolution
+//      TRandom::Streamer(R__b);
+//      R__b.ReadStaticArray(fMt);
+//      R__b >> fCount624;
+//      R__b.CheckByteCount(R__s, R__c, TRandom3::IsA());
+//      //====end of old versions
+
+//   } else {
+//      R__b.WriteClassBuffer(TRandom3::Class(),this);
+//   }
+//}
+
+}
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/TUUID.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/TUUID.cxx
new file mode 100644
index 0000000..218b0a6
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/TUUID.cxx
@@ -0,0 +1,26 @@
+#include "TMVA/TUUID.h"
+#include <string.h>
+
+#include <iostream>
+#include <boost/uuid/uuid.hpp>
+#include <boost/uuid/uuid_generators.hpp>
+//#include <boost/uuid/uuid_io.hpp>
+
+namespace BA_ROOT {
+
+TUUID::TUUID() : fTimeLow(0)
+{
+
+}
+
+// ROOT's implementation is removed in the favor of boost implementation
+void TUUID::GetUUID(UChar_t uuid[16]) const
+{
+//   memcpy(uuid, fTimeLow, 16);
+   boost::uuids::random_generator generator;
+   boost::uuids::uuid boost_uuid = generator();
+   memcpy(uuid, boost_uuid.begin(), 16);
+//   std::cout << boost_uuid << "aaa" << uuid[0] << std::endl;
+}
+
+}
diff --git a/ThirdParty/Fit/RootMinimizers/src/TMVA/Types.cxx b/ThirdParty/Fit/RootMinimizers/src/TMVA/Types.cxx
new file mode 100644
index 0000000..a865da3
--- /dev/null
+++ b/ThirdParty/Fit/RootMinimizers/src/TMVA/Types.cxx
@@ -0,0 +1,135 @@
+// @(#)root/tmva $Id$
+// Author: Andreas Hoecker, Joerg Stelzer, Helge Voss
+
+/**********************************************************************************
+ * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
+ * Package: TMVA                                                                  *
+ * Class  : Types                                                                 *
+ * Web    : http://tmva.sourceforge.net                                           *
+ *                                                                                *
+ * Description:                                                                   *
+ *      Implementation                                                            *
+ *                                                                                *
+ * Authors (alphabetical):                                                        *
+ *      Andreas Hoecker <Andreas.Hocker at cern.ch> - CERN, Switzerland              *
+ *      Joerg Stelzer   <Joerg.Stelzer at cern.ch>  - CERN, Switzerland              *
+ *      Helge Voss      <Helge.Voss at cern.ch>     - MPI-K Heidelberg, Germany      *
+ *                                                                                *
+ * Copyright (c) 2005:                                                            *
+ *      CERN, Switzerland                                                         *
+ *      U. of Victoria, Canada                                                    *
+ *      MPI-K Heidelberg, Germany                                                 *
+ *                                                                                *
+ * Redistribution and use in source and binary forms, with or without             *
+ * modification, are permitted according to the terms listed in LICENSE           *
+ * (http://mva.sourceforge.net/license.txt)                                       *
+ **********************************************************************************/
+
+#include <map>
+#include <iostream>
+#if __cplusplus > 199711L
+#include <mutex>
+#endif
+
+#include "TMVA/Types.h"
+//#include "MsgLogger.h"
+
+#if __cplusplus > 199711L
+std::atomic<BA_TMVA::Types*> BA_TMVA::Types::fgTypesPtr{0};
+static std::mutex gTypesMutex;
+#else
+BA_TMVA::Types* BA_TMVA::Types::fgTypesPtr = 0;
+#endif
+
+//_______________________________________________________________________
+BA_TMVA::Types::Types()
+//   : fLogger( new MsgLogger("Types") )
+{
+   // constructor
+}
+
+BA_TMVA::Types::~Types()
+{
+   // destructor
+//   delete fLogger;
+}
+
+//_______________________________________________________________________
+BA_TMVA::Types& BA_TMVA::Types::Instance()
+{
+   // the the single instance of "Types" if existin already, or create it  (Signleton)
+//#if __cplusplus > 199711L
+//  if(!fgTypesPtr) {
+//    Types* tmp = new Types();
+//    Types* expected = 0;
+//    if(!fgTypesPtr.compare_exchange_strong(expected,tmp)) {
+//      //Another thread already did it
+//      delete tmp;
+//    }
+//  }
+//  return *fgTypesPtr;
+//#else
+   return fgTypesPtr ? *fgTypesPtr : *(fgTypesPtr = new Types());
+//#endif
+}
+//_______________________________________________________________________
+void   BA_TMVA::Types::DestroyInstance()
+{
+   // "destructor" of the single instance
+#if __cplusplus > 199711L
+   if (fgTypesPtr != 0) { delete fgTypesPtr.load(); fgTypesPtr = 0; }
+#else
+   if (fgTypesPtr != 0) { delete fgTypesPtr; fgTypesPtr = 0; }
+#endif
+}
+
+
+//_______________________________________________________________________
+Bool_t BA_TMVA::Types::AddTypeMapping( Types::EMVA method, const std::string& methodname )
+{
+//#if __cplusplus > 199711L
+//   std::lock_guard<std::mutex> guard(gTypesMutex);
+//#endif
+   std::map<std::string, EMVA>::const_iterator it = fStr2type.find( methodname );
+   if (it != fStr2type.end()) {
+//       Log() << kFATAL
+//             << "Cannot add method " << methodname
+//             << " to the name->type map because it exists already" << Endl;
+       std::cout << kFATAL
+             << "TMVA::Types::AddTypeMapping() -> Fatal. Cannot add method " << methodname
+             << " to the name->type map because it exists already" << std::endl;
+      return kFALSE;
+   }
+
+   fStr2type[methodname] = method;
+   return kTRUE;
+}
+
+//_______________________________________________________________________
+BA_TMVA::Types::EMVA BA_TMVA::Types::GetMethodType( const std::string& method ) const
+{
+//#if __cplusplus > 199711L
+//   std::lock_guard<std::mutex> guard(gTypesMutex);
+//#endif
+   // returns the method type (enum) for a given method (string)
+   std::map<std::string, EMVA>::const_iterator it = fStr2type.find( method );
+   if (it == fStr2type.end()) {
+//       Log() << kFATAL << "Unknown method in map: " << method << Endl;
+       std::cout << kFATAL << "TMVA::Types::GetMethodType-> Fatal. Unknown method in map: " << method << std::endl;
+      return kVariable; // Inserted to get rid of GCC warning...
+   }
+   else return it->second;
+}
+
+//_______________________________________________________________________
+std::string BA_TMVA::Types::GetMethodName( BA_TMVA::Types::EMVA method ) const
+{
+//#if __cplusplus > 199711L
+//   std::lock_guard<std::mutex> guard(gTypesMutex);
+//#endif
+   std::map<std::string, EMVA>::const_iterator it = fStr2type.begin();
+   for (; it!=fStr2type.end(); it++) if (it->second == method) return it->first;
+//   Log() << kFATAL << "Unknown method index in map: " << method << Endl;
+   std::cout << kFATAL << "TMVA::Types::GetMethodName() -> Fatal. Unknown method index in map: " << method << std::endl;
+   return "";
+}
diff --git a/ThirdParty/GUI/CMakeLists.txt b/ThirdParty/GUI/CMakeLists.txt
new file mode 100644
index 0000000..9d0254f
--- /dev/null
+++ b/ThirdParty/GUI/CMakeLists.txt
@@ -0,0 +1,15 @@
+add_subdirectory(qt-manhattan-style)
+add_subdirectory(qcustomplot)
+add_subdirectory(qtpropertybrowser)
+
+set(QtAddOn_INCLUDE_DIRS
+    ${ManhattanStyle_INCLUDE_DIRS}
+    ${qcustomplot_INCLUDE_DIRS}
+    ${qtpropertybrowser_INCLUDE_DIRS}
+    PARENT_SCOPE)
+
+set(QtAddOn_LIBRARIES
+    ${ManhattanStyle_LIBRARY}
+    ${qcustomplot_LIBRARY}
+    ${qtpropertybrowser_LIBRARY}
+    PARENT_SCOPE)
diff --git a/ThirdParty/GUI/qcustomplot/CMakeLists.txt b/ThirdParty/GUI/qcustomplot/CMakeLists.txt
new file mode 100644
index 0000000..1d73689
--- /dev/null
+++ b/ThirdParty/GUI/qcustomplot/CMakeLists.txt
@@ -0,0 +1,30 @@
+############################################################################
+# CMakeLists.txt file for building qcustomplot static library
+############################################################################
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+set(library_name qcustomplot)
+
+set(source_files qcustomplot.h qcustomplot.cpp)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+
+add_library(
+    ${library_name}
+    STATIC
+    ${source_files} ${mocfiles}
+)
+set(${library_name}_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)
+set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+
+target_link_libraries(${library_name} ${Qt5Widgets_LIBRARIES})
+
+target_link_libraries(${library_name}
+    Qt5::Widgets
+    Qt5::PrintSupport
+)
diff --git a/ThirdParty/GUI/qcustomplot/GPL.txt b/ThirdParty/GUI/qcustomplot/GPL.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/ThirdParty/GUI/qcustomplot/GPL.txt
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ThirdParty/GUI/qcustomplot/changelog.txt b/ThirdParty/GUI/qcustomplot/changelog.txt
new file mode 100644
index 0000000..15096be
--- /dev/null
+++ b/ThirdParty/GUI/qcustomplot/changelog.txt
@@ -0,0 +1,432 @@
+#### Version 1.3.2 released on 22.12.15 ####
+
+  Bugfixes [Backported from 2.0.0 branch]:
+    - Fixed possible crash when having a QCPGraph with scatters only and a non-transparent main/fill brush of the graph
+    - Fixed QCPItemPixmap not updating internally cached scaled pixmap if new pixmap set with same scaled dimensions
+    - When using log axis scale and zooming out as far as possible (~1e-280..1e280), axis doesn't end up in (via mouse) unrecoverable range with strange axis ticks anymore
+    - Axis tick label algorithm for beautifully typeset powers now checks whether "e" in tick label is actually part of a number before converting the exponent to superscript
+    - Fixed QCustomPlot::moveLayer performing incorrect move and possible crash in certain situations
+    - Fixed possible crash on QCustomPlot destruction due to wrong QObject-hierarchy. Only occurs if a QCPAxisRect is removed from the normal QCustomPlot destruction hierarchy by taking it out of its layout
+    - Fixed possible freeze when data values become infinity after coord-to-pixel transformation (e.g. maximally zoomed out log axis), and line style is not solid (e.g. dashed) or phFastPolylines is disabled
+    
+  Other [Backported from 2.0.0 branch]:
+    - A few documentation fixes/improvements
+    - Qt5.5 compatibility (If you use PDF export, test your outputs, as output dimensions might change when switching Qt versions -- QCP does not try to emulate previous Qt version behaviour here)
+    - QCP now includes <QtPrintSupport/QtPrintSupport> instead of just <QtPrintSupport> because some users had problems with the latter. Please report if you now experience issues due to the new include.
+
+#### Version 1.3.1 released on 25.04.15 ####
+
+  Bugfixes:
+    - Fixed bug that prevented automatic axis rescaling when some graphs/curves had only NaN data points
+    - Improved QCPItemBracket selection boundaries, especially bsCurly and bsCalligraphic
+    - Fixed bug of axis rect and colorscale background shifted downward by one logical pixel (visible in scaled png and pdf export)
+    - Replot upon mouse release is now only performed if a selection change has actually happened (improves responsivity on particularly complex plots)
+    - Fixed bug that allowed scatter-only graphs to be selected by clicking the non-existent line between scatters
+    - Fixed crash when trying to select a scatter-only QCPGraph whose only points in the visible key range are at identical key coordinates and vertically off-screen, with adaptive sampling enabled
+    - Fixed pdf export of QCPColorMap with enabled interpolation (didn't appear interpolated in pdf)
+    - Reduced QCPColorMap jitter of internal cell boundaries for small sized maps when viewed with high zoom, by applying oversampling factors dependant on map size
+    - Fixed bug of QCPColorMap::fill() not causing the buffered internal image map to be updated, and thus the change didn't become visible immediately
+    - Axis labels with size set in pixels (setPixelSize) instead of points now correctly calculate the exponent's font size if beautifully typeset powers are enabled
+    - Fixed QCPColorMap appearing at the wrong position for logarithmic axes and color map spanning larger ranges
+    
+  Other:
+    - Pdf export used to embed entire QCPColorMaps, potentially leading to large files. Now only the visible portion of the map is embedded in the pdf
+    - Many documentation fixes and extensions, style modernization
+    - Reduced documentation file size (and thus full package size) by automatically reducing image palettes during package build
+    - Fixed MSVC warning message (at warning level 4) due to temporary QLists in some foreach statements
+
+#### Version 1.3.0 released on 27.12.14 ####
+
+  Added features:
+    - New plottable class QCPFinancial allows display of candlestick/ohlc data
+    - New class QCPBarsGroup allows horizontal grouping of multiple QCPBars plottables
+    - Added QCPBars feature allowing non-zero base values (see property QCPBars::setBaseValue)
+    - Added QCPBars width type, for more flexible bar widths (see property QCPBars::setWidthType)
+    - New QCPCurve optimization algorithm, fixes bug which caused line flicker at deep zoom into curve segment
+    - Item positions can now have different position types and anchors for their x and y coordinates (QCPItemPosition::setTypeX/Y, setParentAnchorX/Y)
+    - QCPGraph and QCPCurve can now display gaps in their lines, when inserting quiet NaNs as values (std::numeric_limits<double>::quiet_NaN())
+    - QCPAxis now supports placing the tick labels inside the axis rect, for particularly space saving plots (QCPAxis::setTickLabelSide)
+  Added features after beta:
+    - Made code compatible with QT_NO_CAST_FROM_ASCII, QT_NO_CAST_TO_ASCII
+    - Added compatibility with QT_NO_KEYWORDS after sending code files through a simple reg-ex script
+    - Added possibility to inject own QCPAxis(-subclasses) via second, optional QCPAxisRect::addAxis parameter
+    - Added parameter to QCPItemPixmap::setScaled to specify transformation mode
+  
+  Bugfixes:
+    - Fixed bug in QCPCurve rendering of very zoomed-in curves (via new optimization algorithm)
+    - Fixed conflict with MSVC-specific keyword "interface" in text-document-integration example
+    - Fixed QCPScatterStyle bug ignoring the specified pen in the custom scatter shape constructor
+    - Fixed bug (possible crash) during QCustomPlot teardown, when a QCPLegend that has no parent layout (i.e. was removed from layout manually) gets deleted
+  Bugfixes after beta:
+    - Fixed bug of QCPColorMap/QCPColorGradient colors being off by one color sampling step (only noticeable in special cases)
+    - Fixed bug of QCPGraph adaptive sampling on vertical key axis, causing staggered look
+    - Fixed low (float) precision in QCPCurve optimization algorithm, by not using QVector2D anymore
+  
+  Other:
+    - Qt 5.3 and Qt 5.4 compatibility
+
+#### Version 1.2.1 released on 07.04.14 ####
+
+  Bugfixes:
+    - Fixed regression which garbled date-time tick labels on axes, if setTickLabelType is ltDateTime and setNumberFormat contains the "b" option
+
+#### Version 1.2.0 released on 14.03.14 ####
+
+  Added features:
+    - Adaptive Sampling for QCPGraph greatly improves performance for high data densities (see QCPGraph::setAdaptiveSampling)
+    - QCPColorMap plottable with QCPColorScale layout element allows plotting of 2D color maps
+    - QCustomPlot::savePdf now has additional optional parameters pdfCreator and pdfTitle to set according PDF metadata fields
+    - QCustomPlot::replot now allows specifying whether the widget update is immediate (repaint) or queued (update)
+    - QCPRange operators +, -, *, / with double operand for range shifting and scaling, and ==, != for range comparison
+    - Layers now have a visibility property (QCPLayer::setVisible)
+    - static functions QCPAxis::opposite and QCPAxis::orientation now offer more convenience when handling axis types
+    - added notification signals for selectability change (selectableChanged) on all objects that have a selected/selectable property
+    - added notification signal for QCPAxis scaleType property
+    - added notification signal QCPLayerable::layerChanged
+  
+  Bugfixes:
+    - Fixed assert halt, when QCPAxis auto tick labels not disabled but nevertheless a custom non-number tick label ending in "e" given
+    - Fixed painting glitches when QCustomPlot resized inside a QMdiArea or under certain conditions inside a QLayout
+    - If changing QCPAxis::scaleType and thus causing range sanitizing and a range modification, rangeChanged wouldn't be emitted
+    - Fixed documentation bug that caused indentation to be lost in code examples
+  Bugfixes after beta:
+    - Fixed bug that caused crash if clicked-on legend item is removed in mousePressEvent.
+    - On some systems, font size defaults to -1, which used to cause a debug output in QCPAxisPainterPrivate::TickLabelDataQCP. Now it's checked before setting values based on the default font size.
+    - When using multiple axes on one side, setting one to invisible didn't properly compress the freed space.
+    - Fixed bug that allowed selection of plottables when clicking in the bottom or top margin of a QCPAxisRect (outside the inner rect)
+    
+  Other:
+    - In method QCPAbstractPlottable::getKeyRange/getValueRange, renamed parameter "validRange" to "foundRange", to better reflect its meaning (and contrast it from QCPRange::validRange)
+    - QCPAxis low-level axis painting methods exported to QCPAxisPainterPrivate
+
+#### Version 1.1.1 released on 09.12.13 ####
+
+  Bugfixes:
+    - Fixed bug causing legends blocking input events from reaching underlying axis rect even if legend is invisible
+    - Added missing Q_PROPERTY for QCPAxis::setDateTimeSpec
+    - Fixed behaviour of QCPAxisRect::setupFullAxesBox (now transfers more properties from bottom/left to top/right axes and sets visibility of bottom/left axes to true)
+    - Made sure PDF export doesn't default to grayscale output on some systems
+  
+  Other:
+    - Plotting hint QCP::phForceRepaint is now enabled on all systems (and not only on windows) by default
+    - Documentation improvements
+
+#### Version 1.1.0 released on 04.11.13 ####
+
+  Added features:
+    - Added QCPRange::expand and QCPRange::expanded
+    - Added QCPAxis::rescale to rescale axis to all associated plottables
+    - Added QCPAxis::setDateTimeSpec/dateTimeSpec to allow axis labels either in UTC or local time
+    - QCPAxis now additionally emits a rangeChanged signal overload that provides the old range as second parameter
+    
+  Bugfixes:
+    - Fixed QCustomPlot::rescaleAxes not rescaling properly if first plottable has an empty range
+    - QCPGraph::rescaleAxes/rescaleKeyAxis/rescaleValueAxis are no longer virtual (never were in base class, was a mistake)
+    - Fixed bugs in QCPAxis::items and QCPAxisRect::items not properly returning associated items and potentially stalling
+    
+  Other:
+    - Internal change from QWeakPointer to QPointer, thus got rid of deprecated Qt functionality
+    - Qt5.1 and Qt5.2 (beta1) compatibility
+    - Release packages now extract to single subdirectory and don't place multiple files in current working directory
+
+#### Version 1.0.1 released on 05.09.13 ####
+
+  Bugfixes:
+    - using define flag QCUSTOMPLOT_CHECK_DATA caused debug output when data was correct, instead of invalid (fixed QCP::isInvalidData)
+    - documentation images are now properly shown when viewed with Qt Assistant
+    - fixed various documentation mistakes
+    
+  Other:
+    - Adapted documentation style sheet to better match Qt5 documentation
+
+#### Version 1.0.0 released on 01.08.13 ####
+
+  Quick Summary:
+    - Layout system for multiple axis rects in one plot
+    - Multiple axes per side
+    - Qt5 compatibility
+    - More flexible and consistent scatter configuration with QCPScatterStyle
+    - Various interface cleanups/refactoring
+    - Pixmap-cached axis labels for improved replot performance
+
+  Changes that break backward compatibility:
+    - QCustomPlot::axisRect() changed meaning due to the extensive changes to how axes and axis rects are handled
+      it now returns a pointer to a QCPAxisRect and takes an integer index as parameter.
+    - QCPAxis constructor changed to now take QCPAxisRect* as parent
+    - setAutoMargin, setMarginLeft/Right/Top/Bottom removed due to the axis rect changes (see QCPAxisRect::setMargins/setAutoMargins)
+    - setAxisRect removed due to the axis rect changes
+    - setAxisBackground(-Scaled/-ScaledMode) now moved to QCPAxisRect as setBackground(-Scaled/ScaledMode) (access via QCustomPlot::axisRects())
+    - QCPLegend now is a QCPLayoutElement
+    - QCPAbstractPlottable::drawLegendIcon parameter "rect" changed from QRect to QRectF
+    - QCPAbstractLegendItem::draw second parameter removed (position/size now handled via QCPLayoutElement base class)
+    - removed QCPLegend::setMargin/setMarginLeft/Right/Top/Bottom (now inherits the capability from QCPLayoutElement::setMargins)
+    - removed QCPLegend::setMinimumSize (now inherits the capability from QCPLayoutElement::setMinimumSize)
+    - removed enum QCPLegend::PositionStyle, QCPLegend::positionStyle/setPositionStyle/position/setPosition (replaced by capabilities of QCPLayoutInset)
+    - QCPLegend transformed to work with new layout system (almost everything changed)
+    - removed entire title interface: QCustomPlot::setTitle/setTitleFont/setTitleColor/setTitleSelected/setTitleSelectedFont/setTitleSelectedColor and
+      the QCustomPlot::iSelectTitle interaction flag (all functionality is now given by the layout element "QCPPlotTitle" which can be added to the plot layout)
+    - selectTest functions now take two additional parameters: bool onlySelectable and QVariant *details=0
+    - selectTest functions now ignores visibility of objects and (if parameter onlySelectable is true) does not anymore ignore selectability of the object
+    - moved QCustomPlot::Interaction/Interactions to QCP namespace as QCP::Interaction/Interactions
+    - moved QCustomPlot::setupFullAxesBox() to QCPAxisRect::setupFullAxesBox. Now also accepts parameter to decide whether to connect opposite axis ranges
+    - moved range dragging/zooming interface from QCustomPlot to QCPAxisRect (setRangeDrag, setRangeZoom, setRangeDragAxes, setRangeZoomAxes,...)
+    - rangeDrag/Zoom is now set to Qt::Horizontal|Qt::Vertical instead of 0 by default, on the other hand, iRangeDrag/Zoom is unset in interactions by
+      default (this makes enabling dragging/zooming easier by just adding the interaction flags)
+    - QCPScatterStyle takes over everything related to handling scatters in all plottables
+    - removed setScatterPen/Size on QCPGraph and QCPCurve, removed setOutlierPen/Size on QCPStatisticalBox (now handled via QCPScatterStyle)
+    - modified setScatterStyle on QCPGraph and QCPCurve, and setOutlierStyle on QCPStatisticalBox, to take QCPScatterStyle
+    - axis grid and subgrid are now reachable via the QCPGrid *QCPAxis::grid() method. (e.g. instead of xAxis->setGrid(true), write xAxis->grid()->setVisible(true))
+
+  Added features:
+    - Axis tick labels are now pixmap-cached, thus increasing replot performance (in usual setups by about 24%). See plotting hint phCacheLabels which is set by default
+    - Advanced layout system, including the classes QCPLayoutElement, QCPLayout, QCPLayoutGrid, QCPLayoutInset, QCPAxisRect
+    - QCustomPlot::axisRects() returns all the axis rects in the QCustomPlot.
+    - QCustomPlot::plotLayout() returns the top level layout (initially a QCPLayoutGrid with one QCPAxisRect inside)
+    - QCPAxis now may have an offset to the axis rect (setOffset)
+    - Multiple axes per QCPAxisRect side are now supported (see QCPAxisRect::addAxis)
+    - QCustomPlot::toPixmap renders the plot into a pixmap and returns it
+    - When setting tick label rotation to +90 or -90 degrees on a vertical axis, the labels are now centered vertically on the tick height
+      (This allows space saving vertical tick labels by having the text direction parallel to the axis)
+    - Substantially increased replot performance when using very large manual tick vectors (> 10000 ticks) via QCPAxis::setTickVector
+    - QCPAxis and QCPAxisRect now allow easy access to all plottables(), graphs() and items() that are associated with them
+    - Added QCustomPlot::hasItem method for consistency with plottable interface, hasPlottable
+    - Added QCPAxisRect::setMinimumMargins as replacement for hardcoded minimum axis margin (15 px) when auto margin is enabled
+    - Added Flags type QCPAxis::AxisTypes (from QCPAxis::AxisType), used in QCPAxisRect interface
+    - Automatic margin calculation can now be enabled/disabled on a per-side basis, see QCPAxisRect::setAutoMargins
+    - QCPAxisRect margins of multiple axis rects can be coupled via QCPMarginGroup
+    - Added new default layers "background" and "legend" (QCPAxisRect draws its background on the "background" layer, QCPLegend is on the "legend" layer by default)
+    - Custom scatter style via QCP::ssCustom and respective setCustomScatter functions that take a QPainterPath
+    - Filled scatters via QCPScatterStyle::setBrush
+  Added features after beta:
+    - Added QCustomPlot::toPainter method, to allow rendering with existing painter
+    - QCPItemEllipse now provides a center anchor
+
+  Bugfixes:
+    - Fixed compile error on ARM
+    - Wrong legend icons were displayed if using pixmaps for scatters that are smaller than the legend icon rect
+    - Fixed clipping inaccuracy for rotated tick labels (were hidden too early, because the non-rotated bounding box was used)
+    - Fixed bug that caused wrong clipping of axis ticks and subticks when the ticks were given manually by QCPAxis::setTickVector
+    - Fixed Qt5 crash when dragging graph out of view (iterator out of bounds in QCPGraph::getVisibleDataBounds)
+    - Fixed QCPItemText not scaling properly when using scaled raster export
+  Bugfixes after beta:
+    - Fixed bug that clipped the rightmost pixel column of tick labels when caching activated (only visible on windows for superscript exponents)
+    - Restored compatibility to Qt4.6
+    - Restored support for -no-RTTI compilation
+    - Empty manual tick labels are handled more gracefully (no QPainter qDebug messages anymore)
+    - Fixed type ambiguity in QCPLineEnding::draw causing compile error on ARM
+    - Fixed bug of grid layouts not propagating the minimum size from their child elements to the parent layout correctly
+    - Fixed bug of child elements (e.g. axis rects) of inset layouts not properly receiving mouse events
+
+  Other:
+    - Opened up non-amalgamated project structure to public via git repository
+
+#### Version released on 09.06.12 ####
+
+  Quick Summary:
+    - Items (arrows, text,...)
+    - Layers (easier control over rendering order)
+    - New antialiasing system (Each objects controls own antialiasing with setAntialiased)
+    - Performance Improvements
+    - improved pixel-precise drawing
+    - easier shared library creation/usage
+
+  Changes that (might) break backward compatibility:
+    - enum QCPGraph::ScatterSymbol was moved to QCP namespace (now QCP::ScatterSymbol).
+      This replace should fix your code: "QCPGraph::ss" -> "QCP::ss"
+    - enum QCustomPlot::AntialiasedElement and flag QCustomPlot::AntialiasedElements was moved to QCP namespace
+      This replace should fix your code: "QCustomPlot::ae" -> "QCP::ae"
+    - the meaning of QCustomPlot::setAntialiasedElements has changed slightly: It is now an override to force elements to be antialiased. If you want to force
+      elements to not be drawn antialiased, use the new setNotAntialiasedElements. If an element is mentioned in neither of those functions, it now controls
+      its antialiasing itself via its "setAntialiased" function(s). (e.g. QCPAxis::setAntialiased(bool), QCPAbstractPlottable::setAntialiased(bool),
+      QCPAbstractPlottable::setAntialiasedScatters(bool), etc.)
+    - QCPAxis::setTickVector and QCPAxis::setTickVectorLabels no longer take a pointer but a const reference of the respective QVector as parameter.
+      (handing over a pointer didn't give any noticeable performance benefits but was inconsistent with the rest of the interface)
+    - Equally QCPAxis::tickVector and QCPAxis::tickVectorLabels don't return by pointer but by value now
+    - QCustomPlot::savePngScaled was removed, its purpose is now included as optional parameter "scale" of savePng.
+    - If you have derived from QCPAbstractPlottable: all selectTest functions now consistently take the argument "const QPointF &pos" which is the test point in pixel coordinates.
+      (the argument there was "double key, double value" in plot coordinates, before).
+    - QCPAbstractPlottable, QCPAxis and QCPLegend now inherit from QCPLayerable
+    - If you have derived from QCPAbstractPlottable: the draw method signature has changed from "draw (..) const" to "draw (..)", i.e. the method
+      is not const anymore. This allows the draw function of your plottable to perform buffering/caching operations, if necessary.
+
+  Added features:
+    - Item system: QCPAbstractItem, QCPItemAnchor, QCPItemPosition, QCPLineEnding. Allows placing of lines, arrows, text, pixmaps etc.
+      - New Items: QCPItemStraightLine, QCPItemLine, QCPItemCurve, QCPItemEllipse, QCPItemRect, QCPItemPixmap, QCPItemText, QCPItemBracket, QCPItemTracer
+      - QCustomPlot::addItem/itemCount/item/removeItem/selectedItems
+      - signals QCustomPlot::itemClicked/itemDoubleClicked
+      - the QCustomPlot interactions property now includes iSelectItems (for selection of QCPAbstractItem)
+      - QCPLineEnding. Represents the different styles a line/curve can end (e.g. different arrows, circle, square, bar, etc.), see e.g. QCPItemCurve::setHead
+    - Layer system: QCPLayerable, QCPLayer. Allows more sophisticated control over drawing order and a kind of grouping.
+      - QCPAbstractPlottable, QCPAbstractItem, QCPAxis, QCPGrid, QCPLegend are layerables and derive from QCPLayerable
+      - QCustomPlot::addLayer/moveLayer/removeLayer/setCurrentLayer/layer/currentLayer/layerCount
+      - Initially there are three layers: "grid", "main", and "axes". The "main" layer is initially empty and set as current layer, so new plottables/items are put there.
+    - QCustomPlot::viewport now makes the previously inaccessible viewport rect read-only-accessible (needed that for item-interface)
+    - PNG export now allows transparent background by calling QCustomPlot::setColor(Qt::transparent) before savePng
+    - QCPStatisticalBox outlier symbols may now be all scatter symbols, not only hardcoded circles.
+    - perfect precision of scatter symbol/error bar drawing and clipping in both antialiased and non-antialiased mode, by introducing QCPPainter
+      that works around some QPainter bugs/inconveniences. Further, more complex symbols like ssCrossSquare used to look crooked, now they look good.
+    - new antialiasing control system: Each drawing element now has its own "setAntialiased" function to control whether it is drawn antialiased.
+      - QCustomPlot::setAntialiasedElements and QCustomPlot::setNotAntialiasedElements can be used to override the individual settings.
+      - Subclasses of QCPAbstractPlottable can now use the convenience functions like applyFillAntialiasingHint or applyScattersAntialiasingHint to
+        easily make their drawing code comply with the overall antialiasing system.
+    - QCustomPlot::setNoAntialiasingOnDrag allows greatly improved performance and responsiveness by temporarily disabling all antialiasing while
+      the user is dragging axis ranges
+    - QCPGraph can now show scatter symbols at data points and hide its line (see QCPGraph::setScatterStyle, setScatterSize, setScatterPixmap, setLineStyle)
+    - Grid drawing code was sourced out from QCPAxis to QCPGrid. QCPGrid is mainly an internal class and every QCPAxis owns one. The grid interface still
+      works through QCPAxis and hasn't changed. The separation allows the grid to be drawn on a different layer as the axes, such that e.g. a graph can
+      be above the grid but below the axes.
+    - QCustomPlot::hasPlottable(plottable), returns whether the QCustomPlot contains the plottable
+    - QCustomPlot::setPlottingHint/setPlottingHints, plotting hints control details about the plotting quality/speed
+    - export to jpg and bmp added (QCustomPlot::saveJpg/saveBmp), as well as control over compression quality for png and jpg
+    - multi-select-modifier may now be specified with QCustomPlot::setMultiSelectModifier and is not fixed to Ctrl anymore
+
+  Bugfixes:
+    - fixed QCustomPlot ignores replot after it had size (0,0) even if size becomes valid again
+    - on Windows, a repaint used to be delayed during dragging/zooming of a complex plot, until the drag operation was done.
+      This was fixed, i.e. repaints are forced after a replot() call. See QCP::phForceRepaint and setPlottingHints.
+    - when using the raster paintengine and exporting to scaled PNG, pen widths are now scaled correctly (QPainter bug workaround via QCPPainter)
+    - PDF export now respects QCustomPlot background color (QCustomPlot::setColor), also Qt::transparent
+    - fixed a bug on QCPBars and QCPStatisticalBox where auto-rescaling of axis would fail when all data is very small (< 1e-11)
+    - fixed mouse event propagation bug that prevented range dragging from working on KDE (GNU/Linux)
+    - fixed a compiler warning on 64-bit systems due to pointer cast to int instead of quintptr in a qDebug output
+
+  Other:
+    - Added support for easier shared library creation (including examples for compiling and using QCustomPlot as shared library)
+    - QCustomPlot now has the Qt::WA_OpaquePaintEvent widget attribute (gives slightly improved performance).
+    - QCP::aeGraphs (enum QCP::AntialiasedElement, previously QCustomPlot::aeGraphs) has been marked deprecated since version 02.02.12 and
+      was now removed. Use QCP::aePlottables instead.
+    - optional performance-quality-tradeoff for solid graph lines (see QCustomPlot::setPlottingHints).
+    - marked data classes and QCPRange as Q_MOVABLE_TYPE
+    - replaced usage of own macro FUNCNAME with Qt macro Q_FUNC_INFO
+    - QCustomPlot now returns a minimum size hint of 50*50
+
+#### Version released on 31.03.12 ####
+
+  Changes that (might) break backward compatibility:
+  - QCPAbstractLegendItem now inherits from QObject
+  - mousePress, mouseMove and mouseRelease signals are now emitted before and not after any QCustomPlot processing (range dragging, selecting, etc.)
+
+  Added features:
+  - Interaction system: now allows selecting of objects like plottables, axes, legend and plot title, see QCustomPlot::setInteractions documentation
+  - Interaction system for plottables:
+    - setSelectable, setSelected, setSelectedPen, setSelectedBrush, selectTest on QCPAbstractPlottable and all derived plottables
+    - setSelectionTolerance on QCustomPlot
+    - selectedPlottables and selectedGraphs on QCustomPlot (returns the list of currently selected plottables/graphs)
+  - Interaction system for axes:
+    - setSelectable, setSelected, setSelectedBasePen, setSelectedTickPen, setSelectedSubTickPen, setSelectedLabelFont, setSelectedTickLabelFont,
+      setSelectedLabelColor, setSelectedTickLabelColor, selectTest on QCPAxis
+    - selectedAxes on QCustomPlot (returns a list of the axes that currently have selected parts)
+  - Interaction system for legend:
+    - setSelectable, setSelected, setSelectedBorderPen, setSelectedIconBorderPen, setSelectedBrush, setSelectedFont, setSelectedTextColor, selectedItems on QCPLegend
+    - setSelectedFont, setSelectedTextColor, setSelectable, setSelected on QCPAbstractLegendItem
+    - selectedLegends on QCustomPlot
+  - Interaction system for title:
+    - setSelectedTitleFont, setSelectedTitleColor, setTitleSelected on QCustomPlot
+  - new signals in accordance with the interaction system:
+    - selectionChangedByUser on QCustomPlot
+    - selectionChanged on QCPAbstractPlottable
+    - selectionChanged on QCPAxis
+    - selectionChanged on QCPLegend and QCPAbstractLegendItem
+    - plottableClick, legendClick, axisClick, titleClick, plottableDoubleClick, legendDoubleClick, axisDoubleClick, titleDoubleClick on QCustomPlot
+  - QCustomPlot::deselectAll (deselects everything, i.e. axes and plottables)
+  - QCPAbstractPlottable::pixelsToCoords (inverse function to the already existing coordsToPixels function)
+  - QCPRange::contains(double value)
+  - QCPAxis::setLabelColor and setTickLabelColor
+  - QCustomPlot::setTitleColor
+  - QCustomPlot now emits beforeReplot and afterReplot signals. Note that it is safe to make two customPlots mutually call eachothers replot functions
+    in one of these slots, it will not cause an infinite loop. (usefull for synchronizing axes ranges between two customPlots, because setRange alone doesn't replot)
+  - If the Qt version is 4.7 or greater, the tick label strings in date-time-mode now support sub-second accuracy (e.g. with format like "hh:mm:ss.zzz").
+
+  Bugfixes:
+  - tick labels/margins should no longer oscillate by one pixel when dragging range or replotting repeatedly while changing e.g. data. This
+    was caused by a bug in Qt's QFontMetrics::boundingRect function when the font has an integer point size (probably some rounding problem).
+    The fix hence consists of creating a temporary font (only for bounding-box calculation) which is 0.05pt larger and thus avoiding the
+    jittering rounding outcome.
+  - tick label, axis label and plot title colors used to be undefined. This was fixed by providing explicit color properties.
+    
+  Other:
+  - fixed some glitches in the documentation
+  - QCustomPlot::replot and QCustomPlot::rescaleAxes are now slots
+
+#### Version released on 02.02.12 ####
+
+  Changes that break backward compatibility:
+  - renamed all secondary classes from QCustomPlot[...] to QCP[...]:
+    QCustomPlotAxis -> QCPAxis
+    QCustomPlotGraph -> QCPGraph
+    QCustomPlotRange -> QCPRange
+    QCustomPlotData -> QCPData
+    QCustomPlotDataMap -> QCPDataMap
+    QCustomPlotLegend -> QCPLegend
+    QCustomPlotDataMapIterator -> QCPDataMapIterator
+    QCustomPlotDataMutableMapIterator -> QCPDataMutableMapIterator
+    A simple search and replace on all code files should make your code run again, e.g. consider the regex "QCustomPlot(?=[AGRDL])" -> "QCP".
+    Make sure not to just replace "QCustomPlot" with "QCP" because the main class QCustomPlot hasn't changed to QCP.
+    This change was necessary because class names became unhandy, pardon my bad naming decision in the beginning.
+  - QCPAxis::tickLength() and QCPAxis::subTickLength() now each split into two functions for inward and outward ticks (tickLengthIn/tickLengthOut).
+  - QCPLegend now uses QCPAbstractLegendItem to carry item data (before, the legend was passed QCPGraphs directly)
+  - QCustomPlot::addGraph() now doesn't return the index of the created graph anymore, but a pointer to the created QCPGraph.
+  - QCustomPlot::setAutoAddGraphToLegend is replaced by setAutoAddPlottableToLegend
+
+  Added features:
+  - Reversed axis range with QCPAxis::setRangeReversed(bool)
+  - Tick labels are now only drawn if not clipped by the viewport (widget border) on the sides (e.g. left and right on a horizontal axis).
+  - Zerolines. Like grid lines only with a separate pen (QCPAxis::setZeroLinePen), at tick position zero.
+  - Outward ticks. QCPAxis::setTickLength/setSubTickLength now accepts two arguments for inward and outward tick length. This doesn't break
+    backward compatibility because the second argument (outward) has default value zero and thereby a call with one argument hasn't changed its meaning.
+  - QCPGraph now inherits from QCPAbstractPlottable
+  - QCustomPlot::addPlottable/plottable/removePlottable/clearPlottables added to interface with the new QCPAbstractPlottable-based system. The simpler interface
+    which only acts on QCPGraphs (addGraph, graph, removeGraph, etc.) was adapted internally and is kept for backward compatibility and ease of use.
+  - QCPLegend items for plottables (e.g. graphs) can automatically wrap their texts to fit the widths, see QCPLegend::setMinimumSize and QCPPlottableLegendItem::setTextWrap.
+  - QCustomPlot::rescaleAxes. Adapts axis ranges to show all plottables/graphs, by calling QCPAbstractPlottable::rescaleAxes on all plottables in the plot.
+  - QCPCurve. For plotting of parametric curves.
+  - QCPBars. For plotting of bar charts.
+  - QCPStatisticalBox. For statistical box plots.
+
+  Bugfixes:
+  - Fixed QCustomPlot::removeGraph(int) not being able to remove graph index 0
+  - made QCustomPlot::replot() abort painting when painter initialization fails (e.g. because width/height of QCustomPlot is zero)
+  - The distance of the axis label from the axis ignored the tick label padding, this could have caused overlapping axis labels and tick labels
+  - fixed memory leak in QCustomPlot (dtor didn't delete legend)
+  - fixed bug that prevented QCPAxis::setRangeLower/Upper from setting the value to exactly 0.
+
+  Other:
+  - Changed default error bar handle size (QCustomPlotGraph::setErrorBarSize) from 4 to 6.
+  - Removed QCustomPlotDataFetcher. Was deprecated and not used class.
+  - Extended documentation, especially class descriptions.
+
+#### Version released on 15.01.12 ####
+
+  Changes that (might) break backward compatibility:
+  - QCustomPlotGraph now inherits from QObject
+  
+  Added features:
+  - Added axis background pixmap (QCustomPlot::setAxisBackground, setAxisBackgroundScaled, setAxisBackgroundScaledMode)
+  - Added width and height parameter on PDF export function QCustomPlot::savePdf(). This now allows PDF export to
+    have arbitrary dimensions, independent of the current geometry of the QCustomPlot.
+  - Added overload of QCustomPlot::removeGraph that takes QCustomPlotGraph* as parameter, instead the index of the graph
+  - Added all enums to the Qt meta system via Q_ENUMS(). The enums can now be transformed
+    to QString values easily with the Qt meta system, which makes saving state e.g. as XML
+    significantly nicer.
+  - added typedef QMapIterator<double,QCustomPlotData> QCustomPlotDataMapIterator
+    and typedef QMutableMapIterator<double,QCustomPlotData> QCustomPlotDataMutableMapIterator
+    for improved information hiding, when using iterators outside QCustomPlot code
+  
+  Bugfixes:
+  - Fixed savePngScaled. Axis/label drawing functions used to reset the painter transform
+    and thereby break savePngScaled. Now they buffer the current transform and restore it afterwards.
+  - Fixed some glitches in the doxygen comments (affects documentation only)
+  
+  Other:
+  - Changed the default tickLabelPadding of top axis from 3 to 6 pixels. Looks better.
+  - Changed the default QCustomPlot::setAntialiasedElements setting: Graph fills are now antialiased
+    by default. That's a bit slower, but makes fill borders look better.
+
+#### Version released on 19.11.11 ####
+
+  Changes that break backward compatibility:
+  - QCustomPlotAxis: tickFont and setTickFont renamed to tickLabelFont and setTickLabelFont (for naming consistency)
+
+  Other:
+  - QCustomPlotAxis: Added rotated tick labels, see setTickLabelRotation
+    
diff --git a/ThirdParty/GUI/qcustomplot/qcustomplot.cpp b/ThirdParty/GUI/qcustomplot/qcustomplot.cpp
new file mode 100644
index 0000000..3086082
--- /dev/null
+++ b/ThirdParty/GUI/qcustomplot/qcustomplot.cpp
@@ -0,0 +1,23553 @@
+/***************************************************************************
+**                                                                        **
+**  QCustomPlot, an easy to use, modern plotting widget for Qt            **
+**  Copyright (C) 2011-2015 Emanuel Eichhammer                            **
+**                                                                        **
+**  This program is free software: you can redistribute it and/or modify  **
+**  it under the terms of the GNU General Public License as published by  **
+**  the Free Software Foundation, either version 3 of the License, or     **
+**  (at your option) any later version.                                   **
+**                                                                        **
+**  This program is distributed in the hope that it will be useful,       **
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of        **
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         **
+**  GNU General Public License for more details.                          **
+**                                                                        **
+**  You should have received a copy of the GNU General Public License     **
+**  along with this program.  If not, see http://www.gnu.org/licenses/.   **
+**                                                                        **
+****************************************************************************
+**           Author: Emanuel Eichhammer                                   **
+**  Website/Contact: http://www.qcustomplot.com/                          **
+**             Date: 22.12.15                                             **
+**          Version: 1.3.2                                                **
+****************************************************************************/
+
+#include "qcustomplot.h"
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPPainter
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPPainter
+  \brief QPainter subclass used internally
+  
+  This QPainter subclass is used to provide some extended functionality e.g. for tweaking position
+  consistency between antialiased and non-antialiased painting. Further it provides workarounds
+  for QPainter quirks.
+  
+  \warning This class intentionally hides non-virtual functions of QPainter, e.g. setPen, save and
+  restore. So while it is possible to pass a QCPPainter instance to a function that expects a
+  QPainter pointer, some of the workarounds and tweaks will be unavailable to the function (because
+  it will call the base class implementations of the functions actually hidden by QCPPainter).
+*/
+
+/*!
+  Creates a new QCPPainter instance and sets default values
+*/
+QCPPainter::QCPPainter() :
+  QPainter(),
+  mModes(pmDefault),
+  mIsAntialiasing(false)
+{
+  // don't setRenderHint(QPainter::NonCosmeticDefautPen) here, because painter isn't active yet and
+  // a call to begin() will follow
+}
+
+/*!
+  Creates a new QCPPainter instance on the specified paint \a device and sets default values. Just
+  like the analogous QPainter constructor, begins painting on \a device immediately.
+  
+  Like \ref begin, this method sets QPainter::NonCosmeticDefaultPen in Qt versions before Qt5.
+*/
+QCPPainter::QCPPainter(QPaintDevice *device) :
+  QPainter(device),
+  mModes(pmDefault),
+  mIsAntialiasing(false)
+{
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) // before Qt5, default pens used to be cosmetic if NonCosmeticDefaultPen flag isn't set. So we set it to get consistency across Qt versions.
+  if (isActive())
+    setRenderHint(QPainter::NonCosmeticDefaultPen);
+#endif
+}
+
+QCPPainter::~QCPPainter()
+{
+}
+
+/*!
+  Sets the pen of the painter and applies certain fixes to it, depending on the mode of this
+  QCPPainter.
+  
+  \note this function hides the non-virtual base class implementation.
+*/
+void QCPPainter::setPen(const QPen &pen)
+{
+  QPainter::setPen(pen);
+  if (mModes.testFlag(pmNonCosmetic))
+    makeNonCosmetic();
+}
+
+/*! \overload
+  
+  Sets the pen (by color) of the painter and applies certain fixes to it, depending on the mode of
+  this QCPPainter.
+  
+  \note this function hides the non-virtual base class implementation.
+*/
+void QCPPainter::setPen(const QColor &color)
+{
+  QPainter::setPen(color);
+  if (mModes.testFlag(pmNonCosmetic))
+    makeNonCosmetic();
+}
+
+/*! \overload
+  
+  Sets the pen (by style) of the painter and applies certain fixes to it, depending on the mode of
+  this QCPPainter.
+  
+  \note this function hides the non-virtual base class implementation.
+*/
+void QCPPainter::setPen(Qt::PenStyle penStyle)
+{
+  QPainter::setPen(penStyle);
+  if (mModes.testFlag(pmNonCosmetic))
+    makeNonCosmetic();
+}
+
+/*! \overload
+  
+  Works around a Qt bug introduced with Qt 4.8 which makes drawing QLineF unpredictable when
+  antialiasing is disabled. Thus when antialiasing is disabled, it rounds the \a line to
+  integer coordinates and then passes it to the original drawLine.
+  
+  \note this function hides the non-virtual base class implementation.
+*/
+void QCPPainter::drawLine(const QLineF &line)
+{
+  if (mIsAntialiasing || mModes.testFlag(pmVectorized))
+    QPainter::drawLine(line);
+  else
+    QPainter::drawLine(line.toLine());
+}
+
+/*!
+  Sets whether painting uses antialiasing or not. Use this method instead of using setRenderHint
+  with QPainter::Antialiasing directly, as it allows QCPPainter to regain pixel exactness between
+  antialiased and non-antialiased painting (Since Qt < 5.0 uses slightly different coordinate systems for
+  AA/Non-AA painting).
+*/
+void QCPPainter::setAntialiasing(bool enabled)
+{
+  setRenderHint(QPainter::Antialiasing, enabled);
+  if (mIsAntialiasing != enabled)
+  {
+    mIsAntialiasing = enabled;
+    if (!mModes.testFlag(pmVectorized)) // antialiasing half-pixel shift only needed for rasterized outputs
+    {
+      if (mIsAntialiasing)
+        translate(0.5, 0.5);
+      else
+        translate(-0.5, -0.5);
+    }
+  }
+}
+
+/*!
+  Sets the mode of the painter. This controls whether the painter shall adjust its
+  fixes/workarounds optimized for certain output devices.
+*/
+void QCPPainter::setModes(QCPPainter::PainterModes modes)
+{
+  mModes = modes;
+}
+
+/*!
+  Sets the QPainter::NonCosmeticDefaultPen in Qt versions before Qt5 after beginning painting on \a
+  device. This is necessary to get cosmetic pen consistency across Qt versions, because since Qt5,
+  all pens are non-cosmetic by default, and in Qt4 this render hint must be set to get that
+  behaviour.
+  
+  The Constructor \ref QCPPainter(QPaintDevice *device) which directly starts painting also sets
+  the render hint as appropriate.
+  
+  \note this function hides the non-virtual base class implementation.
+*/
+bool QCPPainter::begin(QPaintDevice *device)
+{
+  bool result = QPainter::begin(device);
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) // before Qt5, default pens used to be cosmetic if NonCosmeticDefaultPen flag isn't set. So we set it to get consistency across Qt versions.
+  if (result)
+    setRenderHint(QPainter::NonCosmeticDefaultPen);
+#endif
+  return result;
+}
+
+/*! \overload
+  
+  Sets the mode of the painter. This controls whether the painter shall adjust its
+  fixes/workarounds optimized for certain output devices.
+*/
+void QCPPainter::setMode(QCPPainter::PainterMode mode, bool enabled)
+{
+  if (!enabled && mModes.testFlag(mode))
+    mModes &= ~mode;
+  else if (enabled && !mModes.testFlag(mode))
+    mModes |= mode;
+}
+
+/*!
+  Saves the painter (see QPainter::save). Since QCPPainter adds some new internal state to
+  QPainter, the save/restore functions are reimplemented to also save/restore those members.
+  
+  \note this function hides the non-virtual base class implementation.
+  
+  \see restore
+*/
+void QCPPainter::save()
+{
+  mAntialiasingStack.push(mIsAntialiasing);
+  QPainter::save();
+}
+
+/*!
+  Restores the painter (see QPainter::restore). Since QCPPainter adds some new internal state to
+  QPainter, the save/restore functions are reimplemented to also save/restore those members.
+  
+  \note this function hides the non-virtual base class implementation.
+  
+  \see save
+*/
+void QCPPainter::restore()
+{
+  if (!mAntialiasingStack.isEmpty())
+    mIsAntialiasing = mAntialiasingStack.pop();
+  else
+    qDebug() << Q_FUNC_INFO << "Unbalanced save/restore";
+  QPainter::restore();
+}
+
+/*!
+  Changes the pen width to 1 if it currently is 0. This function is called in the \ref setPen
+  overrides when the \ref pmNonCosmetic mode is set.
+*/
+void QCPPainter::makeNonCosmetic()
+{
+  if (qFuzzyIsNull(pen().widthF()))
+  {
+    QPen p = pen();
+    p.setWidth(1);
+    QPainter::setPen(p);
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPScatterStyle
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPScatterStyle
+  \brief Represents the visual appearance of scatter points
+  
+  This class holds information about shape, color and size of scatter points. In plottables like
+  QCPGraph it is used to store how scatter points shall be drawn. For example, \ref
+  QCPGraph::setScatterStyle takes a QCPScatterStyle instance.
+  
+  A scatter style consists of a shape (\ref setShape), a line color (\ref setPen) and possibly a
+  fill (\ref setBrush), if the shape provides a fillable area. Further, the size of the shape can
+  be controlled with \ref setSize.
+
+  \section QCPScatterStyle-defining Specifying a scatter style
+  
+  You can set all these configurations either by calling the respective functions on an instance:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-creation-1
+  
+  Or you can use one of the various constructors that take different parameter combinations, making
+  it easy to specify a scatter style in a single call, like so:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-creation-2
+  
+  \section QCPScatterStyle-undefinedpen Leaving the color/pen up to the plottable
+  
+  There are two constructors which leave the pen undefined: \ref QCPScatterStyle() and \ref
+  QCPScatterStyle(ScatterShape shape, double size). If those constructors are used, a call to \ref
+  isPenDefined will return false. It leads to scatter points that inherit the pen from the
+  plottable that uses the scatter style. Thus, if such a scatter style is passed to QCPGraph, the line
+  color of the graph (\ref QCPGraph::setPen) will be used by the scatter points. This makes
+  it very convenient to set up typical scatter settings:
+  
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-shortcreation
+
+  Notice that it wasn't even necessary to explicitly call a QCPScatterStyle constructor. This works
+  because QCPScatterStyle provides a constructor that can transform a \ref ScatterShape directly
+  into a QCPScatterStyle instance (that's the \ref QCPScatterStyle(ScatterShape shape, double size)
+  constructor with a default for \a size). In those cases, C++ allows directly supplying a \ref
+  ScatterShape, where actually a QCPScatterStyle is expected.
+  
+  \section QCPScatterStyle-custompath-and-pixmap Custom shapes and pixmaps
+  
+  QCPScatterStyle supports drawing custom shapes and arbitrary pixmaps as scatter points.
+
+  For custom shapes, you can provide a QPainterPath with the desired shape to the \ref
+  setCustomPath function or call the constructor that takes a painter path. The scatter shape will
+  automatically be set to \ref ssCustom.
+  
+  For pixmaps, you call \ref setPixmap with the desired QPixmap. Alternatively you can use the
+  constructor that takes a QPixmap. The scatter shape will automatically be set to \ref ssPixmap.
+  Note that \ref setSize does not influence the appearance of the pixmap.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn bool QCPScatterStyle::isNone() const
+  
+  Returns whether the scatter shape is \ref ssNone.
+  
+  \see setShape
+*/
+
+/*! \fn bool QCPScatterStyle::isPenDefined() const
+  
+  Returns whether a pen has been defined for this scatter style.
+  
+  The pen is undefined if a constructor is called that does not carry \a pen as parameter. Those are
+  \ref QCPScatterStyle() and \ref QCPScatterStyle(ScatterShape shape, double size). If the pen is
+  left undefined, the scatter color will be inherited from the plottable that uses this scatter
+  style.
+  
+  \see setPen
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates a new QCPScatterStyle instance with size set to 6. No shape, pen or brush is defined.
+  
+  Since the pen is undefined (\ref isPenDefined returns false), the scatter color will be inherited
+  from the plottable that uses this scatter style.
+*/
+QCPScatterStyle::QCPScatterStyle() :
+  mSize(6),
+  mShape(ssNone),
+  mPen(Qt::NoPen),
+  mBrush(Qt::NoBrush),
+  mPenDefined(false)
+{
+}
+
+/*!
+  Creates a new QCPScatterStyle instance with shape set to \a shape and size to \a size. No pen or
+  brush is defined.
+  
+  Since the pen is undefined (\ref isPenDefined returns false), the scatter color will be inherited
+  from the plottable that uses this scatter style.
+*/
+QCPScatterStyle::QCPScatterStyle(ScatterShape shape, double size) :
+  mSize(size),
+  mShape(shape),
+  mPen(Qt::NoPen),
+  mBrush(Qt::NoBrush),
+  mPenDefined(false)
+{
+}
+
+/*!
+  Creates a new QCPScatterStyle instance with shape set to \a shape, the pen color set to \a color,
+  and size to \a size. No brush is defined, i.e. the scatter point will not be filled.
+*/
+QCPScatterStyle::QCPScatterStyle(ScatterShape shape, const QColor &color, double size) :
+  mSize(size),
+  mShape(shape),
+  mPen(QPen(color)),
+  mBrush(Qt::NoBrush),
+  mPenDefined(true)
+{
+}
+
+/*!
+  Creates a new QCPScatterStyle instance with shape set to \a shape, the pen color set to \a color,
+  the brush color to \a fill (with a solid pattern), and size to \a size.
+*/
+QCPScatterStyle::QCPScatterStyle(ScatterShape shape, const QColor &color, const QColor &fill, double size) :
+  mSize(size),
+  mShape(shape),
+  mPen(QPen(color)),
+  mBrush(QBrush(fill)),
+  mPenDefined(true)
+{
+}
+
+/*!
+  Creates a new QCPScatterStyle instance with shape set to \a shape, the pen set to \a pen, the
+  brush to \a brush, and size to \a size.
+  
+  \warning In some cases it might be tempting to directly use a pen style like <tt>Qt::NoPen</tt> as \a pen
+  and a color like <tt>Qt::blue</tt> as \a brush. Notice however, that the corresponding call\n
+  <tt>QCPScatterStyle(QCPScatterShape::ssCircle, Qt::NoPen, Qt::blue, 5)</tt>\n
+  doesn't necessarily lead C++ to use this constructor in some cases, but might mistake
+  <tt>Qt::NoPen</tt> for a QColor and use the
+  \ref QCPScatterStyle(ScatterShape shape, const QColor &color, const QColor &fill, double size)
+  constructor instead (which will lead to an unexpected look of the scatter points). To prevent
+  this, be more explicit with the parameter types. For example, use <tt>QBrush(Qt::blue)</tt>
+  instead of just <tt>Qt::blue</tt>, to clearly point out to the compiler that this constructor is
+  wanted.
+*/
+QCPScatterStyle::QCPScatterStyle(ScatterShape shape, const QPen &pen, const QBrush &brush, double size) :
+  mSize(size),
+  mShape(shape),
+  mPen(pen),
+  mBrush(brush),
+  mPenDefined(pen.style() != Qt::NoPen)
+{
+}
+
+/*!
+  Creates a new QCPScatterStyle instance which will show the specified \a pixmap. The scatter shape
+  is set to \ref ssPixmap.
+*/
+QCPScatterStyle::QCPScatterStyle(const QPixmap &pixmap) :
+  mSize(5),
+  mShape(ssPixmap),
+  mPen(Qt::NoPen),
+  mBrush(Qt::NoBrush),
+  mPixmap(pixmap),
+  mPenDefined(false)
+{
+}
+
+/*!
+  Creates a new QCPScatterStyle instance with a custom shape that is defined via \a customPath. The
+  scatter shape is set to \ref ssCustom.
+  
+  The custom shape line will be drawn with \a pen and filled with \a brush. The size has a slightly
+  different meaning than for built-in scatter points: The custom path will be drawn scaled by a
+  factor of \a size/6.0. Since the default \a size is 6, the custom path will appear at a its
+  natural size by default. To double the size of the path for example, set \a size to 12.
+*/
+QCPScatterStyle::QCPScatterStyle(const QPainterPath &customPath, const QPen &pen, const QBrush &brush, double size) :
+  mSize(size),
+  mShape(ssCustom),
+  mPen(pen),
+  mBrush(brush),
+  mCustomPath(customPath),
+  mPenDefined(pen.style() != Qt::NoPen)
+{
+}
+
+/*!
+  Sets the size (pixel diameter) of the drawn scatter points to \a size.
+  
+  \see setShape
+*/
+void QCPScatterStyle::setSize(double size)
+{
+  mSize = size;
+}
+
+/*!
+  Sets the shape to \a shape.
+  
+  Note that the calls \ref setPixmap and \ref setCustomPath automatically set the shape to \ref
+  ssPixmap and \ref ssCustom, respectively.
+  
+  \see setSize
+*/
+void QCPScatterStyle::setShape(QCPScatterStyle::ScatterShape shape)
+{
+  mShape = shape;
+}
+
+/*!
+  Sets the pen that will be used to draw scatter points to \a pen.
+  
+  If the pen was previously undefined (see \ref isPenDefined), the pen is considered defined after
+  a call to this function, even if \a pen is <tt>Qt::NoPen</tt>.
+  
+  \see setBrush
+*/
+void QCPScatterStyle::setPen(const QPen &pen)
+{
+  mPenDefined = true;
+  mPen = pen;
+}
+
+/*!
+  Sets the brush that will be used to fill scatter points to \a brush. Note that not all scatter
+  shapes have fillable areas. For example, \ref ssPlus does not while \ref ssCircle does.
+  
+  \see setPen
+*/
+void QCPScatterStyle::setBrush(const QBrush &brush)
+{
+  mBrush = brush;
+}
+
+/*!
+  Sets the pixmap that will be drawn as scatter point to \a pixmap.
+  
+  Note that \ref setSize does not influence the appearance of the pixmap.
+  
+  The scatter shape is automatically set to \ref ssPixmap.
+*/
+void QCPScatterStyle::setPixmap(const QPixmap &pixmap)
+{
+  setShape(ssPixmap);
+  mPixmap = pixmap;
+}
+
+/*!
+  Sets the custom shape that will be drawn as scatter point to \a customPath.
+  
+  The scatter shape is automatically set to \ref ssCustom.
+*/
+void QCPScatterStyle::setCustomPath(const QPainterPath &customPath)
+{
+  setShape(ssCustom);
+  mCustomPath = customPath;
+}
+
+/*!
+  Applies the pen and the brush of this scatter style to \a painter. If this scatter style has an
+  undefined pen (\ref isPenDefined), sets the pen of \a painter to \a defaultPen instead.
+  
+  This function is used by plottables (or any class that wants to draw scatters) just before a
+  number of scatters with this style shall be drawn with the \a painter.
+  
+  \see drawShape
+*/
+void QCPScatterStyle::applyTo(QCPPainter *painter, const QPen &defaultPen) const
+{
+  painter->setPen(mPenDefined ? mPen : defaultPen);
+  painter->setBrush(mBrush);
+}
+
+/*!
+  Draws the scatter shape with \a painter at position \a pos.
+  
+  This function does not modify the pen or the brush on the painter, as \ref applyTo is meant to be
+  called before scatter points are drawn with \ref drawShape.
+  
+  \see applyTo
+*/
+void QCPScatterStyle::drawShape(QCPPainter *painter, QPointF pos) const
+{
+  drawShape(painter, pos.x(), pos.y());
+}
+
+/*! \overload
+  Draws the scatter shape with \a painter at position \a x and \a y.
+*/
+void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const
+{
+  double w = mSize/2.0;
+  switch (mShape)
+  {
+    case ssNone: break;
+    case ssDot:
+    {
+      painter->drawLine(QPointF(x, y), QPointF(x+0.0001, y));
+      break;
+    }
+    case ssCross:
+    {
+      painter->drawLine(QLineF(x-w, y-w, x+w, y+w));
+      painter->drawLine(QLineF(x-w, y+w, x+w, y-w));
+      break;
+    }
+    case ssPlus:
+    {
+      painter->drawLine(QLineF(x-w,   y, x+w,   y));
+      painter->drawLine(QLineF(  x, y+w,   x, y-w));
+      break;
+    }
+    case ssCircle:
+    {
+      painter->drawEllipse(QPointF(x , y), w, w);
+      break;
+    }
+    case ssDisc:
+    {
+      QBrush b = painter->brush();
+      painter->setBrush(painter->pen().color());
+      painter->drawEllipse(QPointF(x , y), w, w);
+      painter->setBrush(b);
+      break;
+    }
+    case ssSquare:
+    {
+      painter->drawRect(QRectF(x-w, y-w, mSize, mSize));
+      break;
+    }
+    case ssDiamond:
+    {
+      painter->drawLine(QLineF(x-w,   y,   x, y-w));
+      painter->drawLine(QLineF(  x, y-w, x+w,   y));
+      painter->drawLine(QLineF(x+w,   y,   x, y+w));
+      painter->drawLine(QLineF(  x, y+w, x-w,   y));
+      break;
+    }
+    case ssStar:
+    {
+      painter->drawLine(QLineF(x-w,   y, x+w,   y));
+      painter->drawLine(QLineF(  x, y+w,   x, y-w));
+      painter->drawLine(QLineF(x-w*0.707, y-w*0.707, x+w*0.707, y+w*0.707));
+      painter->drawLine(QLineF(x-w*0.707, y+w*0.707, x+w*0.707, y-w*0.707));
+      break;
+    }
+    case ssTriangle:
+    {
+       painter->drawLine(QLineF(x-w, y+0.755*w, x+w, y+0.755*w));
+       painter->drawLine(QLineF(x+w, y+0.755*w,   x, y-0.977*w));
+       painter->drawLine(QLineF(  x, y-0.977*w, x-w, y+0.755*w));
+      break;
+    }
+    case ssTriangleInverted:
+    {
+       painter->drawLine(QLineF(x-w, y-0.755*w, x+w, y-0.755*w));
+       painter->drawLine(QLineF(x+w, y-0.755*w,   x, y+0.977*w));
+       painter->drawLine(QLineF(  x, y+0.977*w, x-w, y-0.755*w));
+      break;
+    }
+    case ssCrossSquare:
+    {
+       painter->drawLine(QLineF(x-w, y-w, x+w*0.95, y+w*0.95));
+       painter->drawLine(QLineF(x-w, y+w*0.95, x+w*0.95, y-w));
+       painter->drawRect(QRectF(x-w, y-w, mSize, mSize));
+      break;
+    }
+    case ssPlusSquare:
+    {
+       painter->drawLine(QLineF(x-w,   y, x+w*0.95,   y));
+       painter->drawLine(QLineF(  x, y+w,        x, y-w));
+       painter->drawRect(QRectF(x-w, y-w, mSize, mSize));
+      break;
+    }
+    case ssCrossCircle:
+    {
+       painter->drawLine(QLineF(x-w*0.707, y-w*0.707, x+w*0.670, y+w*0.670));
+       painter->drawLine(QLineF(x-w*0.707, y+w*0.670, x+w*0.670, y-w*0.707));
+       painter->drawEllipse(QPointF(x, y), w, w);
+      break;
+    }
+    case ssPlusCircle:
+    {
+       painter->drawLine(QLineF(x-w,   y, x+w,   y));
+       painter->drawLine(QLineF(  x, y+w,   x, y-w));
+       painter->drawEllipse(QPointF(x, y), w, w);
+      break;
+    }
+    case ssPeace:
+    {
+       painter->drawLine(QLineF(x, y-w,         x,       y+w));
+       painter->drawLine(QLineF(x,   y, x-w*0.707, y+w*0.707));
+       painter->drawLine(QLineF(x,   y, x+w*0.707, y+w*0.707));
+       painter->drawEllipse(QPointF(x, y), w, w);
+      break;
+    }
+    case ssPixmap:
+    {
+      painter->drawPixmap(x-mPixmap.width()*0.5, y-mPixmap.height()*0.5, mPixmap);
+      break;
+    }
+    case ssCustom:
+    {
+      QTransform oldTransform = painter->transform();
+      painter->translate(x, y);
+      painter->scale(mSize/6.0, mSize/6.0);
+      painter->drawPath(mCustomPath);
+      painter->setTransform(oldTransform);
+      break;
+    }
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLayer
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPLayer
+  \brief A layer that may contain objects, to control the rendering order
+  
+  The Layering system of QCustomPlot is the mechanism to control the rendering order of the
+  elements inside the plot.
+  
+  It is based on the two classes QCPLayer and QCPLayerable. QCustomPlot holds an ordered list of
+  one or more instances of QCPLayer (see QCustomPlot::addLayer, QCustomPlot::layer,
+  QCustomPlot::moveLayer, etc.). When replotting, QCustomPlot goes through the list of layers
+  bottom to top and successively draws the layerables of the layers.
+  
+  A QCPLayer contains an ordered list of QCPLayerable instances. QCPLayerable is an abstract base
+  class from which almost all visible objects derive, like axes, grids, graphs, items, etc.
+  
+  Initially, QCustomPlot has five layers: "background", "grid", "main", "axes" and "legend" (in
+  that order). The top two layers "axes" and "legend" contain the default axes and legend, so they
+  will be drawn on top. In the middle, there is the "main" layer. It is initially empty and set as
+  the current layer (see QCustomPlot::setCurrentLayer). This means, all new plottables, items etc.
+  are created on this layer by default. Then comes the "grid" layer which contains the QCPGrid
+  instances (which belong tightly to QCPAxis, see \ref QCPAxis::grid). The Axis rect background
+  shall be drawn behind everything else, thus the default QCPAxisRect instance is placed on the
+  "background" layer. Of course, the layer affiliation of the individual objects can be changed as
+  required (\ref QCPLayerable::setLayer).
+  
+  Controlling the ordering of objects is easy: Create a new layer in the position you want it to
+  be, e.g. above "main", with QCustomPlot::addLayer. Then set the current layer with
+  QCustomPlot::setCurrentLayer to that new layer and finally create the objects normally. They will
+  be placed on the new layer automatically, due to the current layer setting. Alternatively you
+  could have also ignored the current layer setting and just moved the objects with
+  QCPLayerable::setLayer to the desired layer after creating them.
+  
+  It is also possible to move whole layers. For example, If you want the grid to be shown in front
+  of all plottables/items on the "main" layer, just move it above "main" with
+  QCustomPlot::moveLayer.
+  
+  The rendering order within one layer is simply by order of creation or insertion. The item
+  created last (or added last to the layer), is drawn on top of all other objects on that layer.
+  
+  When a layer is deleted, the objects on it are not deleted with it, but fall on the layer below
+  the deleted layer, see QCustomPlot::removeLayer.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QList<QCPLayerable*> QCPLayer::children() const
+  
+  Returns a list of all layerables on this layer. The order corresponds to the rendering order:
+  layerables with higher indices are drawn above layerables with lower indices.
+*/
+
+/*! \fn int QCPLayer::index() const
+  
+  Returns the index this layer has in the QCustomPlot. The index is the integer number by which this layer can be
+  accessed via \ref QCustomPlot::layer.
+  
+  Layers with higher indices will be drawn above layers with lower indices.
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates a new QCPLayer instance.
+  
+  Normally you shouldn't directly instantiate layers, use \ref QCustomPlot::addLayer instead.
+  
+  \warning It is not checked that \a layerName is actually a unique layer name in \a parentPlot.
+  This check is only performed by \ref QCustomPlot::addLayer.
+*/
+QCPLayer::QCPLayer(QCustomPlot *parentPlot, const QString &layerName) :
+  QObject(parentPlot),
+  mParentPlot(parentPlot),
+  mName(layerName),
+  mIndex(-1), // will be set to a proper value by the QCustomPlot layer creation function
+  mVisible(true)
+{
+  // Note: no need to make sure layerName is unique, because layer
+  // management is done with QCustomPlot functions.
+}
+
+QCPLayer::~QCPLayer()
+{
+  // If child layerables are still on this layer, detach them, so they don't try to reach back to this
+  // then invalid layer once they get deleted/moved themselves. This only happens when layers are deleted
+  // directly, like in the QCustomPlot destructor. (The regular layer removal procedure for the user is to
+  // call QCustomPlot::removeLayer, which moves all layerables off this layer before deleting it.)
+  
+  while (!mChildren.isEmpty())
+    mChildren.last()->setLayer(0); // removes itself from mChildren via removeChild()
+  
+  if (mParentPlot->currentLayer() == this)
+    qDebug() << Q_FUNC_INFO << "The parent plot's mCurrentLayer will be a dangling pointer. Should have been set to a valid layer or 0 beforehand.";
+}
+
+/*!
+  Sets whether this layer is visible or not. If \a visible is set to false, all layerables on this
+  layer will be invisible.
+
+  This function doesn't change the visibility property of the layerables (\ref
+  QCPLayerable::setVisible), but the \ref QCPLayerable::realVisibility of each layerable takes the
+  visibility of the parent layer into account.
+*/
+void QCPLayer::setVisible(bool visible)
+{
+  mVisible = visible;
+}
+
+/*! \internal
+  
+  Adds the \a layerable to the list of this layer. If \a prepend is set to true, the layerable will
+  be prepended to the list, i.e. be drawn beneath the other layerables already in the list.
+  
+  This function does not change the \a mLayer member of \a layerable to this layer. (Use
+  QCPLayerable::setLayer to change the layer of an object, not this function.)
+  
+  \see removeChild
+*/
+void QCPLayer::addChild(QCPLayerable *layerable, bool prepend)
+{
+  if (!mChildren.contains(layerable))
+  {
+    if (prepend)
+      mChildren.prepend(layerable);
+    else
+      mChildren.append(layerable);
+  } else
+    qDebug() << Q_FUNC_INFO << "layerable is already child of this layer" << reinterpret_cast<quintptr>(layerable);
+}
+
+/*! \internal
+  
+  Removes the \a layerable from the list of this layer.
+  
+  This function does not change the \a mLayer member of \a layerable. (Use QCPLayerable::setLayer
+  to change the layer of an object, not this function.)
+  
+  \see addChild
+*/
+void QCPLayer::removeChild(QCPLayerable *layerable)
+{
+  if (!mChildren.removeOne(layerable))
+    qDebug() << Q_FUNC_INFO << "layerable is not child of this layer" << reinterpret_cast<quintptr>(layerable);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLayerable
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPLayerable
+  \brief Base class for all drawable objects
+  
+  This is the abstract base class most visible objects derive from, e.g. plottables, axes, grid
+  etc.
+
+  Every layerable is on a layer (QCPLayer) which allows controlling the rendering order by stacking
+  the layers accordingly.
+  
+  For details about the layering mechanism, see the QCPLayer documentation.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QCPLayerable *QCPLayerable::parentLayerable() const
+ 
+  Returns the parent layerable of this layerable. The parent layerable is used to provide
+  visibility hierarchies in conjunction with the method \ref realVisibility. This way, layerables
+  only get drawn if their parent layerables are visible, too.
+  
+  Note that a parent layerable is not necessarily also the QObject parent for memory management.
+  Further, a layerable doesn't always have a parent layerable, so this function may return 0.
+  
+  A parent layerable is set implicitly with when placed inside layout elements and doesn't need to be
+  set manually by the user.
+*/
+
+/* end documentation of inline functions */
+/* start documentation of pure virtual functions */
+
+/*! \fn virtual void QCPLayerable::applyDefaultAntialiasingHint(QCPPainter *painter) const = 0
+  \internal
+  
+  This function applies the default antialiasing setting to the specified \a painter, using the
+  function \ref applyAntialiasingHint. It is the antialiasing state the painter is put in, when
+  \ref draw is called on the layerable. If the layerable has multiple entities whose antialiasing
+  setting may be specified individually, this function should set the antialiasing state of the
+  most prominent entity. In this case however, the \ref draw function usually calls the specialized
+  versions of this function before drawing each entity, effectively overriding the setting of the
+  default antialiasing hint.
+  
+  <b>First example:</b> QCPGraph has multiple entities that have an antialiasing setting: The graph
+  line, fills, scatters and error bars. Those can be configured via QCPGraph::setAntialiased,
+  QCPGraph::setAntialiasedFill, QCPGraph::setAntialiasedScatters etc. Consequently, there isn't
+  only the QCPGraph::applyDefaultAntialiasingHint function (which corresponds to the graph line's
+  antialiasing), but specialized ones like QCPGraph::applyFillAntialiasingHint and
+  QCPGraph::applyScattersAntialiasingHint. So before drawing one of those entities, QCPGraph::draw
+  calls the respective specialized applyAntialiasingHint function.
+  
+  <b>Second example:</b> QCPItemLine consists only of a line so there is only one antialiasing
+  setting which can be controlled with QCPItemLine::setAntialiased. (This function is inherited by
+  all layerables. The specialized functions, as seen on QCPGraph, must be added explicitly to the
+  respective layerable subclass.) Consequently it only has the normal
+  QCPItemLine::applyDefaultAntialiasingHint. The \ref QCPItemLine::draw function doesn't need to
+  care about setting any antialiasing states, because the default antialiasing hint is already set
+  on the painter when the \ref draw function is called, and that's the state it wants to draw the
+  line with.
+*/
+
+/*! \fn virtual void QCPLayerable::draw(QCPPainter *painter) const = 0
+  \internal
+  
+  This function draws the layerable with the specified \a painter. It is only called by
+  QCustomPlot, if the layerable is visible (\ref setVisible).
+  
+  Before this function is called, the painter's antialiasing state is set via \ref
+  applyDefaultAntialiasingHint, see the documentation there. Further, the clipping rectangle was
+  set to \ref clipRect.
+*/
+
+/* end documentation of pure virtual functions */
+/* start documentation of signals */
+
+/*! \fn void QCPLayerable::layerChanged(QCPLayer *newLayer);
+  
+  This signal is emitted when the layer of this layerable changes, i.e. this layerable is moved to
+  a different layer.
+  
+  \see setLayer
+*/
+
+/* end documentation of signals */
+
+/*!
+  Creates a new QCPLayerable instance.
+  
+  Since QCPLayerable is an abstract base class, it can't be instantiated directly. Use one of the
+  derived classes.
+  
+  If \a plot is provided, it automatically places itself on the layer named \a targetLayer. If \a
+  targetLayer is an empty string, it places itself on the current layer of the plot (see \ref
+  QCustomPlot::setCurrentLayer).
+  
+  It is possible to provide 0 as \a plot. In that case, you should assign a parent plot at a later
+  time with \ref initializeParentPlot.
+  
+  The layerable's parent layerable is set to \a parentLayerable, if provided. Direct layerable
+  parents are mainly used to control visibility in a hierarchy of layerables. This means a
+  layerable is only drawn, if all its ancestor layerables are also visible. Note that \a
+  parentLayerable does not become the QObject-parent (for memory management) of this layerable, \a
+  plot does. It is not uncommon to set the QObject-parent to something else in the constructors of
+  QCPLayerable subclasses, to guarantee a working destruction hierarchy.
+*/
+QCPLayerable::QCPLayerable(QCustomPlot *plot, QString targetLayer, QCPLayerable *parentLayerable) :
+  QObject(plot),
+  mVisible(true),
+  mParentPlot(plot),
+  mParentLayerable(parentLayerable),
+  mLayer(0),
+  mAntialiased(true)
+{
+  if (mParentPlot)
+  {
+    if (targetLayer.isEmpty())
+      setLayer(mParentPlot->currentLayer());
+    else if (!setLayer(targetLayer))
+      qDebug() << Q_FUNC_INFO << "setting QCPlayerable initial layer to" << targetLayer << "failed.";
+  }
+}
+
+QCPLayerable::~QCPLayerable()
+{
+  if (mLayer)
+  {
+    mLayer->removeChild(this);
+    mLayer = 0;
+  }
+}
+
+/*!
+  Sets the visibility of this layerable object. If an object is not visible, it will not be drawn
+  on the QCustomPlot surface, and user interaction with it (e.g. click and selection) is not
+  possible.
+*/
+void QCPLayerable::setVisible(bool on)
+{
+  mVisible = on;
+}
+
+/*!
+  Sets the \a layer of this layerable object. The object will be placed on top of the other objects
+  already on \a layer.
+  
+  If \a layer is 0, this layerable will not be on any layer and thus not appear in the plot (or
+  interact/receive events).
+  
+  Returns true if the layer of this layerable was successfully changed to \a layer.
+*/
+bool QCPLayerable::setLayer(QCPLayer *layer)
+{
+  return moveToLayer(layer, false);
+}
+
+/*! \overload
+  Sets the layer of this layerable object by name
+  
+  Returns true on success, i.e. if \a layerName is a valid layer name.
+*/
+bool QCPLayerable::setLayer(const QString &layerName)
+{
+  if (!mParentPlot)
+  {
+    qDebug() << Q_FUNC_INFO << "no parent QCustomPlot set";
+    return false;
+  }
+  if (QCPLayer *layer = mParentPlot->layer(layerName))
+  {
+    return setLayer(layer);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "there is no layer with name" << layerName;
+    return false;
+  }
+}
+
+/*!
+  Sets whether this object will be drawn antialiased or not.
+  
+  Note that antialiasing settings may be overridden by QCustomPlot::setAntialiasedElements and
+  QCustomPlot::setNotAntialiasedElements.
+*/
+void QCPLayerable::setAntialiased(bool enabled)
+{
+  mAntialiased = enabled;
+}
+
+/*!
+  Returns whether this layerable is visible, taking the visibility of the layerable parent and the
+  visibility of the layer this layerable is on into account. This is the method that is consulted
+  to decide whether a layerable shall be drawn or not.
+  
+  If this layerable has a direct layerable parent (usually set via hierarchies implemented in
+  subclasses, like in the case of QCPLayoutElement), this function returns true only if this
+  layerable has its visibility set to true and the parent layerable's \ref realVisibility returns
+  true.
+  
+  If this layerable doesn't have a direct layerable parent, returns the state of this layerable's
+  visibility.
+*/
+bool QCPLayerable::realVisibility() const
+{
+  return mVisible && (!mLayer || mLayer->visible()) && (!mParentLayerable || mParentLayerable.data()->realVisibility());
+}
+
+/*!
+  This function is used to decide whether a click hits a layerable object or not.
+
+  \a pos is a point in pixel coordinates on the QCustomPlot surface. This function returns the
+  shortest pixel distance of this point to the object. If the object is either invisible or the
+  distance couldn't be determined, -1.0 is returned. Further, if \a onlySelectable is true and the
+  object is not selectable, -1.0 is returned, too.
+
+  If the object is represented not by single lines but by an area like a \ref QCPItemText or the
+  bars of a \ref QCPBars plottable, a click inside the area should also be considered a hit. In
+  these cases this function thus returns a constant value greater zero but still below the parent
+  plot's selection tolerance. (typically the selectionTolerance multiplied by 0.99).
+  
+  Providing a constant value for area objects allows selecting line objects even when they are
+  obscured by such area objects, by clicking close to the lines (i.e. closer than
+  0.99*selectionTolerance).
+  
+  The actual setting of the selection state is not done by this function. This is handled by the
+  parent QCustomPlot when the mouseReleaseEvent occurs, and the finally selected object is notified
+  via the selectEvent/deselectEvent methods.
+  
+  \a details is an optional output parameter. Every layerable subclass may place any information
+  in \a details. This information will be passed to \ref selectEvent when the parent QCustomPlot
+  decides on the basis of this selectTest call, that the object was successfully selected. The
+  subsequent call to \ref selectEvent will carry the \a details. This is useful for multi-part
+  objects (like QCPAxis). This way, a possibly complex calculation to decide which part was clicked
+  is only done once in \ref selectTest. The result (i.e. the actually clicked part) can then be
+  placed in \a details. So in the subsequent \ref selectEvent, the decision which part was
+  selected doesn't have to be done a second time for a single selection operation.
+  
+  You may pass 0 as \a details to indicate that you are not interested in those selection details.
+  
+  \see selectEvent, deselectEvent, QCustomPlot::setInteractions
+*/
+double QCPLayerable::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(pos)
+  Q_UNUSED(onlySelectable)
+  Q_UNUSED(details)
+  return -1.0;
+}
+
+/*! \internal
+  
+  Sets the parent plot of this layerable. Use this function once to set the parent plot if you have
+  passed 0 in the constructor. It can not be used to move a layerable from one QCustomPlot to
+  another one.
+  
+  Note that, unlike when passing a non-null parent plot in the constructor, this function does not
+  make \a parentPlot the QObject-parent of this layerable. If you want this, call
+  QObject::setParent(\a parentPlot) in addition to this function.
+  
+  Further, you will probably want to set a layer (\ref setLayer) after calling this function, to
+  make the layerable appear on the QCustomPlot.
+  
+  The parent plot change will be propagated to subclasses via a call to \ref parentPlotInitialized
+  so they can react accordingly (e.g. also initialize the parent plot of child layerables, like
+  QCPLayout does).
+*/
+void QCPLayerable::initializeParentPlot(QCustomPlot *parentPlot)
+{
+  if (mParentPlot)
+  {
+    qDebug() << Q_FUNC_INFO << "called with mParentPlot already initialized";
+    return;
+  }
+  
+  if (!parentPlot)
+    qDebug() << Q_FUNC_INFO << "called with parentPlot zero";
+  
+  mParentPlot = parentPlot;
+  parentPlotInitialized(mParentPlot);
+}
+
+/*! \internal
+  
+  Sets the parent layerable of this layerable to \a parentLayerable. Note that \a parentLayerable does not
+  become the QObject-parent (for memory management) of this layerable.
+  
+  The parent layerable has influence on the return value of the \ref realVisibility method. Only
+  layerables with a fully visible parent tree will return true for \ref realVisibility, and thus be
+  drawn.
+  
+  \see realVisibility
+*/
+void QCPLayerable::setParentLayerable(QCPLayerable *parentLayerable)
+{
+  mParentLayerable = parentLayerable;
+}
+
+/*! \internal
+  
+  Moves this layerable object to \a layer. If \a prepend is true, this object will be prepended to
+  the new layer's list, i.e. it will be drawn below the objects already on the layer. If it is
+  false, the object will be appended.
+  
+  Returns true on success, i.e. if \a layer is a valid layer.
+*/
+bool QCPLayerable::moveToLayer(QCPLayer *layer, bool prepend)
+{
+  if (layer && !mParentPlot)
+  {
+    qDebug() << Q_FUNC_INFO << "no parent QCustomPlot set";
+    return false;
+  }
+  if (layer && layer->parentPlot() != mParentPlot)
+  {
+    qDebug() << Q_FUNC_INFO << "layer" << layer->name() << "is not in same QCustomPlot as this layerable";
+    return false;
+  }
+  
+  QCPLayer *oldLayer = mLayer;
+  if (mLayer)
+    mLayer->removeChild(this);
+  mLayer = layer;
+  if (mLayer)
+    mLayer->addChild(this, prepend);
+  if (mLayer != oldLayer)
+    emit layerChanged(mLayer);
+  return true;
+}
+
+/*! \internal
+
+  Sets the QCPainter::setAntialiasing state on the provided \a painter, depending on the \a
+  localAntialiased value as well as the overrides \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements. Which override enum this function takes into account is
+  controlled via \a overrideElement.
+*/
+void QCPLayerable::applyAntialiasingHint(QCPPainter *painter, bool localAntialiased, QCP::AntialiasedElement overrideElement) const
+{
+  if (mParentPlot && mParentPlot->notAntialiasedElements().testFlag(overrideElement))
+    painter->setAntialiasing(false);
+  else if (mParentPlot && mParentPlot->antialiasedElements().testFlag(overrideElement))
+    painter->setAntialiasing(true);
+  else
+    painter->setAntialiasing(localAntialiased);
+}
+
+/*! \internal
+
+  This function is called by \ref initializeParentPlot, to allow subclasses to react on the setting
+  of a parent plot. This is the case when 0 was passed as parent plot in the constructor, and the
+  parent plot is set at a later time.
+  
+  For example, QCPLayoutElement/QCPLayout hierarchies may be created independently of any
+  QCustomPlot at first. When they are then added to a layout inside the QCustomPlot, the top level
+  element of the hierarchy gets its parent plot initialized with \ref initializeParentPlot. To
+  propagate the parent plot to all the children of the hierarchy, the top level element then uses
+  this function to pass the parent plot on to its child elements.
+  
+  The default implementation does nothing.
+  
+  \see initializeParentPlot
+*/
+void QCPLayerable::parentPlotInitialized(QCustomPlot *parentPlot)
+{
+   Q_UNUSED(parentPlot)
+}
+
+/*! \internal
+
+  Returns the selection category this layerable shall belong to. The selection category is used in
+  conjunction with \ref QCustomPlot::setInteractions to control which objects are selectable and
+  which aren't.
+  
+  Subclasses that don't fit any of the normal \ref QCP::Interaction values can use \ref
+  QCP::iSelectOther. This is what the default implementation returns.
+  
+  \see QCustomPlot::setInteractions
+*/
+QCP::Interaction QCPLayerable::selectionCategory() const
+{
+  return QCP::iSelectOther;
+}
+
+/*! \internal
+  
+  Returns the clipping rectangle of this layerable object. By default, this is the viewport of the
+  parent QCustomPlot. Specific subclasses may reimplement this function to provide different
+  clipping rects.
+  
+  The returned clipping rect is set on the painter before the draw function of the respective
+  object is called.
+*/
+QRect QCPLayerable::clipRect() const
+{
+  if (mParentPlot)
+    return mParentPlot->viewport();
+  else
+    return QRect();
+}
+
+/*! \internal
+  
+  This event is called when the layerable shall be selected, as a consequence of a click by the
+  user. Subclasses should react to it by setting their selection state appropriately. The default
+  implementation does nothing.
+  
+  \a event is the mouse event that caused the selection. \a additive indicates, whether the user
+  was holding the multi-select-modifier while performing the selection (see \ref
+  QCustomPlot::setMultiSelectModifier). if \a additive is true, the selection state must be toggled
+  (i.e. become selected when unselected and unselected when selected).
+  
+  Every selectEvent is preceded by a call to \ref selectTest, which has returned positively (i.e.
+  returned a value greater than 0 and less than the selection tolerance of the parent QCustomPlot).
+  The \a details data you output from \ref selectTest is fed back via \a details here. You may
+  use it to transport any kind of information from the selectTest to the possibly subsequent
+  selectEvent. Usually \a details is used to transfer which part was clicked, if it is a layerable
+  that has multiple individually selectable parts (like QCPAxis). This way selectEvent doesn't need
+  to do the calculation again to find out which part was actually clicked.
+  
+  \a selectionStateChanged is an output parameter. If the pointer is non-null, this function must
+  set the value either to true or false, depending on whether the selection state of this layerable
+  was actually changed. For layerables that only are selectable as a whole and not in parts, this
+  is simple: if \a additive is true, \a selectionStateChanged must also be set to true, because the
+  selection toggles. If \a additive is false, \a selectionStateChanged is only set to true, if the
+  layerable was previously unselected and now is switched to the selected state.
+  
+  \see selectTest, deselectEvent
+*/
+void QCPLayerable::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged)
+{
+  Q_UNUSED(event)
+  Q_UNUSED(additive)
+  Q_UNUSED(details)
+  Q_UNUSED(selectionStateChanged)
+}
+
+/*! \internal
+  
+  This event is called when the layerable shall be deselected, either as consequence of a user
+  interaction or a call to \ref QCustomPlot::deselectAll. Subclasses should react to it by
+  unsetting their selection appropriately.
+  
+  just as in \ref selectEvent, the output parameter \a selectionStateChanged (if non-null), must
+  return true or false when the selection state of this layerable has changed or not changed,
+  respectively.
+  
+  \see selectTest, selectEvent
+*/
+void QCPLayerable::deselectEvent(bool *selectionStateChanged)
+{
+  Q_UNUSED(selectionStateChanged)
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPRange
+////////////////////////////////////////////////////////////////////////////////////////////////////
+/*! \class QCPRange
+  \brief Represents the range an axis is encompassing.
+  
+  contains a \a lower and \a upper double value and provides convenience input, output and
+  modification functions.
+  
+  \see QCPAxis::setRange
+*/
+
+/*!
+  Minimum range size (\a upper - \a lower) the range changing functions will accept. Smaller
+  intervals would cause errors due to the 11-bit exponent of double precision numbers,
+  corresponding to a minimum magnitude of roughly 1e-308.
+  \see validRange, maxRange
+*/
+const double QCPRange::minRange = 1e-280;
+
+/*!
+  Maximum values (negative and positive) the range will accept in range-changing functions.
+  Larger absolute values would cause errors due to the 11-bit exponent of double precision numbers,
+  corresponding to a maximum magnitude of roughly 1e308.
+  Since the number of planck-volumes in the entire visible universe is only ~1e183, this should
+  be enough.
+  \see validRange, minRange
+*/
+const double QCPRange::maxRange = 1e250;
+
+/*!
+  Constructs a range with \a lower and \a upper set to zero.
+*/
+QCPRange::QCPRange() :
+  lower(0),
+  upper(0)
+{
+}
+
+/*! \overload
+  Constructs a range with the specified \a lower and \a upper values.
+*/
+QCPRange::QCPRange(double lower, double upper) :
+  lower(lower),
+  upper(upper)
+{
+  normalize();
+}
+
+/*!
+  Returns the size of the range, i.e. \a upper-\a lower
+*/
+double QCPRange::size() const
+{
+  return upper-lower;
+}
+
+/*!
+  Returns the center of the range, i.e. (\a upper+\a lower)*0.5
+*/
+double QCPRange::center() const
+{
+  return (upper+lower)*0.5;
+}
+
+/*!
+  Makes sure \a lower is numerically smaller than \a upper. If this is not the case, the values
+  are swapped.
+*/
+void QCPRange::normalize()
+{
+  if (lower > upper)
+    qSwap(lower, upper);
+}
+
+/*!
+  Expands this range such that \a otherRange is contained in the new range. It is assumed that both
+  this range and \a otherRange are normalized (see \ref normalize).
+  
+  If \a otherRange is already inside the current range, this function does nothing.
+  
+  \see expanded
+*/
+void QCPRange::expand(const QCPRange &otherRange)
+{
+  if (lower > otherRange.lower)
+    lower = otherRange.lower;
+  if (upper < otherRange.upper)
+    upper = otherRange.upper;
+}
+
+
+/*!
+  Returns an expanded range that contains this and \a otherRange. It is assumed that both this
+  range and \a otherRange are normalized (see \ref normalize).
+  
+  \see expand
+*/
+QCPRange QCPRange::expanded(const QCPRange &otherRange) const
+{
+  QCPRange result = *this;
+  result.expand(otherRange);
+  return result;
+}
+
+/*!
+  Returns a sanitized version of the range. Sanitized means for logarithmic scales, that
+  the range won't span the positive and negative sign domain, i.e. contain zero. Further
+  \a lower will always be numerically smaller (or equal) to \a upper.
+  
+  If the original range does span positive and negative sign domains or contains zero,
+  the returned range will try to approximate the original range as good as possible.
+  If the positive interval of the original range is wider than the negative interval, the
+  returned range will only contain the positive interval, with lower bound set to \a rangeFac or
+  \a rangeFac *\a upper, whichever is closer to zero. Same procedure is used if the negative interval
+  is wider than the positive interval, this time by changing the \a upper bound.
+*/
+QCPRange QCPRange::sanitizedForLogScale() const
+{
+  double rangeFac = 1e-3;
+  QCPRange sanitizedRange(lower, upper);
+  sanitizedRange.normalize();
+  // can't have range spanning negative and positive values in log plot, so change range to fix it
+  //if (qFuzzyCompare(sanitizedRange.lower+1, 1) && !qFuzzyCompare(sanitizedRange.upper+1, 1))
+  if (sanitizedRange.lower == 0.0 && sanitizedRange.upper != 0.0)
+  {
+    // case lower is 0
+    if (rangeFac < sanitizedRange.upper*rangeFac)
+      sanitizedRange.lower = rangeFac;
+    else
+      sanitizedRange.lower = sanitizedRange.upper*rangeFac;
+  } //else if (!qFuzzyCompare(lower+1, 1) && qFuzzyCompare(upper+1, 1))
+  else if (sanitizedRange.lower != 0.0 && sanitizedRange.upper == 0.0)
+  {
+    // case upper is 0
+    if (-rangeFac > sanitizedRange.lower*rangeFac)
+      sanitizedRange.upper = -rangeFac;
+    else
+      sanitizedRange.upper = sanitizedRange.lower*rangeFac;
+  } else if (sanitizedRange.lower < 0 && sanitizedRange.upper > 0)
+  {
+    // find out whether negative or positive interval is wider to decide which sign domain will be chosen
+    if (-sanitizedRange.lower > sanitizedRange.upper)
+    {
+      // negative is wider, do same as in case upper is 0
+      if (-rangeFac > sanitizedRange.lower*rangeFac)
+        sanitizedRange.upper = -rangeFac;
+      else
+        sanitizedRange.upper = sanitizedRange.lower*rangeFac;
+    } else
+    {
+      // positive is wider, do same as in case lower is 0
+      if (rangeFac < sanitizedRange.upper*rangeFac)
+        sanitizedRange.lower = rangeFac;
+      else
+        sanitizedRange.lower = sanitizedRange.upper*rangeFac;
+    }
+  }
+  // due to normalization, case lower>0 && upper<0 should never occur, because that implies upper<lower
+  return sanitizedRange;
+}
+
+/*!
+  Returns a sanitized version of the range. Sanitized means for linear scales, that
+  \a lower will always be numerically smaller (or equal) to \a upper.
+*/
+QCPRange QCPRange::sanitizedForLinScale() const
+{
+  QCPRange sanitizedRange(lower, upper);
+  sanitizedRange.normalize();
+  return sanitizedRange;
+}
+
+/*!
+  Returns true when \a value lies within or exactly on the borders of the range.
+*/
+bool QCPRange::contains(double value) const
+{
+  return value >= lower && value <= upper;
+}
+
+/*!
+  Checks, whether the specified range is within valid bounds, which are defined
+  as QCPRange::maxRange and QCPRange::minRange.
+  A valid range means:
+  \li range bounds within -maxRange and maxRange
+  \li range size above minRange
+  \li range size below maxRange
+*/
+bool QCPRange::validRange(double lower, double upper)
+{
+  return (lower > -maxRange &&
+          upper < maxRange &&
+          qAbs(lower-upper) > minRange &&
+          qAbs(lower-upper) < maxRange &&
+          !(lower > 0 && qIsInf(upper/lower)) &&
+          !(upper < 0 && qIsInf(lower/upper)));
+}
+
+/*!
+  \overload
+  Checks, whether the specified range is within valid bounds, which are defined
+  as QCPRange::maxRange and QCPRange::minRange.
+  A valid range means:
+  \li range bounds within -maxRange and maxRange
+  \li range size above minRange
+  \li range size below maxRange
+*/
+bool QCPRange::validRange(const QCPRange &range)
+{
+  return (range.lower > -maxRange &&
+          range.upper < maxRange &&
+          qAbs(range.lower-range.upper) > minRange &&
+          qAbs(range.lower-range.upper) < maxRange &&
+          !(range.lower > 0 && qIsInf(range.upper/range.lower)) &&
+          !(range.upper < 0 && qIsInf(range.lower/range.upper)));
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPMarginGroup
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPMarginGroup
+  \brief A margin group allows synchronization of margin sides if working with multiple layout elements.
+  
+  QCPMarginGroup allows you to tie a margin side of two or more layout elements together, such that
+  they will all have the same size, based on the largest required margin in the group.
+  
+  \n
+  \image html QCPMarginGroup.png "Demonstration of QCPMarginGroup"
+  \n
+  
+  In certain situations it is desirable that margins at specific sides are synchronized across
+  layout elements. For example, if one QCPAxisRect is below another one in a grid layout, it will
+  provide a cleaner look to the user if the left and right margins of the two axis rects are of the
+  same size. The left axis of the top axis rect will then be at the same horizontal position as the
+  left axis of the lower axis rect, making them appear aligned. The same applies for the right
+  axes. This is what QCPMarginGroup makes possible.
+  
+  To add/remove a specific side of a layout element to/from a margin group, use the \ref
+  QCPLayoutElement::setMarginGroup method. To completely break apart the margin group, either call
+  \ref clear, or just delete the margin group.
+  
+  \section QCPMarginGroup-example Example
+  
+  First create a margin group:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpmargingroup-creation-1
+  Then set this group on the layout element sides:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpmargingroup-creation-2
+  Here, we've used the first two axis rects of the plot and synchronized their left margins with
+  each other and their right margins with each other.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QList<QCPLayoutElement*> QCPMarginGroup::elements(QCP::MarginSide side) const
+  
+  Returns a list of all layout elements that have their margin \a side associated with this margin
+  group.
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates a new QCPMarginGroup instance in \a parentPlot.
+*/
+QCPMarginGroup::QCPMarginGroup(QCustomPlot *parentPlot) :
+  QObject(parentPlot),
+  mParentPlot(parentPlot)
+{
+  mChildren.insert(QCP::msLeft, QList<QCPLayoutElement*>());
+  mChildren.insert(QCP::msRight, QList<QCPLayoutElement*>());
+  mChildren.insert(QCP::msTop, QList<QCPLayoutElement*>());
+  mChildren.insert(QCP::msBottom, QList<QCPLayoutElement*>());
+}
+
+QCPMarginGroup::~QCPMarginGroup()
+{
+  clear();
+}
+
+/*!
+  Returns whether this margin group is empty. If this function returns true, no layout elements use
+  this margin group to synchronize margin sides.
+*/
+bool QCPMarginGroup::isEmpty() const
+{
+  QHashIterator<QCP::MarginSide, QList<QCPLayoutElement*> > it(mChildren);
+  while (it.hasNext())
+  {
+    it.next();
+    if (!it.value().isEmpty())
+      return false;
+  }
+  return true;
+}
+
+/*!
+  Clears this margin group. The synchronization of the margin sides that use this margin group is
+  lifted and they will use their individual margin sizes again.
+*/
+void QCPMarginGroup::clear()
+{
+  // make all children remove themselves from this margin group:
+  QHashIterator<QCP::MarginSide, QList<QCPLayoutElement*> > it(mChildren);
+  while (it.hasNext())
+  {
+    it.next();
+    const QList<QCPLayoutElement*> elements = it.value();
+    for (int i=elements.size()-1; i>=0; --i)
+      elements.at(i)->setMarginGroup(it.key(), 0); // removes itself from mChildren via removeChild
+  }
+}
+
+/*! \internal
+  
+  Returns the synchronized common margin for \a side. This is the margin value that will be used by
+  the layout element on the respective side, if it is part of this margin group.
+  
+  The common margin is calculated by requesting the automatic margin (\ref
+  QCPLayoutElement::calculateAutoMargin) of each element associated with \a side in this margin
+  group, and choosing the largest returned value. (QCPLayoutElement::minimumMargins is taken into
+  account, too.)
+*/
+int QCPMarginGroup::commonMargin(QCP::MarginSide side) const
+{
+  // query all automatic margins of the layout elements in this margin group side and find maximum:
+  int result = 0;
+  const QList<QCPLayoutElement*> elements = mChildren.value(side);
+  for (int i=0; i<elements.size(); ++i)
+  {
+    if (!elements.at(i)->autoMargins().testFlag(side))
+      continue;
+    int m = qMax(elements.at(i)->calculateAutoMargin(side), QCP::getMarginValue(elements.at(i)->minimumMargins(), side));
+    if (m > result)
+      result = m;
+  }
+  return result;
+}
+
+/*! \internal
+  
+  Adds \a element to the internal list of child elements, for the margin \a side.
+  
+  This function does not modify the margin group property of \a element.
+*/
+void QCPMarginGroup::addChild(QCP::MarginSide side, QCPLayoutElement *element)
+{
+  if (!mChildren[side].contains(element))
+    mChildren[side].append(element);
+  else
+    qDebug() << Q_FUNC_INFO << "element is already child of this margin group side" << reinterpret_cast<quintptr>(element);
+}
+
+/*! \internal
+  
+  Removes \a element from the internal list of child elements, for the margin \a side.
+  
+  This function does not modify the margin group property of \a element.
+*/
+void QCPMarginGroup::removeChild(QCP::MarginSide side, QCPLayoutElement *element)
+{
+  if (!mChildren[side].removeOne(element))
+    qDebug() << Q_FUNC_INFO << "element is not child of this margin group side" << reinterpret_cast<quintptr>(element);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLayoutElement
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPLayoutElement
+  \brief The abstract base class for all objects that form \ref thelayoutsystem "the layout system".
+  
+  This is an abstract base class. As such, it can't be instantiated directly, rather use one of its subclasses.
+  
+  A Layout element is a rectangular object which can be placed in layouts. It has an outer rect
+  (QCPLayoutElement::outerRect) and an inner rect (\ref QCPLayoutElement::rect). The difference
+  between outer and inner rect is called its margin. The margin can either be set to automatic or
+  manual (\ref setAutoMargins) on a per-side basis. If a side is set to manual, that margin can be
+  set explicitly with \ref setMargins and will stay fixed at that value. If it's set to automatic,
+  the layout element subclass will control the value itself (via \ref calculateAutoMargin).
+  
+  Layout elements can be placed in layouts (base class QCPLayout) like QCPLayoutGrid. The top level
+  layout is reachable via \ref QCustomPlot::plotLayout, and is a \ref QCPLayoutGrid. Since \ref
+  QCPLayout itself derives from \ref QCPLayoutElement, layouts can be nested.
+  
+  Thus in QCustomPlot one can divide layout elements into two categories: The ones that are
+  invisible by themselves, because they don't draw anything. Their only purpose is to manage the
+  position and size of other layout elements. This category of layout elements usually use
+  QCPLayout as base class. Then there is the category of layout elements which actually draw
+  something. For example, QCPAxisRect, QCPLegend and QCPPlotTitle are of this category. This does
+  not necessarily mean that the latter category can't have child layout elements. QCPLegend for
+  instance, actually derives from QCPLayoutGrid and the individual legend items are child layout
+  elements in the grid layout.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QCPLayout *QCPLayoutElement::layout() const
+  
+  Returns the parent layout of this layout element.
+*/
+
+/*! \fn QRect QCPLayoutElement::rect() const
+  
+  Returns the inner rect of this layout element. The inner rect is the outer rect (\ref
+  setOuterRect) shrinked by the margins (\ref setMargins, \ref setAutoMargins).
+  
+  In some cases, the area between outer and inner rect is left blank. In other cases the margin
+  area is used to display peripheral graphics while the main content is in the inner rect. This is
+  where automatic margin calculation becomes interesting because it allows the layout element to
+  adapt the margins to the peripheral graphics it wants to draw. For example, \ref QCPAxisRect
+  draws the axis labels and tick labels in the margin area, thus needs to adjust the margins (if
+  \ref setAutoMargins is enabled) according to the space required by the labels of the axes.
+*/
+
+/*! \fn virtual void QCPLayoutElement::mousePressEvent(QMouseEvent *event)
+  
+  This event is called, if the mouse was pressed while being inside the outer rect of this layout
+  element.
+*/
+
+/*! \fn virtual void QCPLayoutElement::mouseMoveEvent(QMouseEvent *event)
+  
+  This event is called, if the mouse is moved inside the outer rect of this layout element.
+*/
+
+/*! \fn virtual void QCPLayoutElement::mouseReleaseEvent(QMouseEvent *event)
+  
+  This event is called, if the mouse was previously pressed inside the outer rect of this layout
+  element and is now released.
+*/
+
+/*! \fn virtual void QCPLayoutElement::mouseDoubleClickEvent(QMouseEvent *event)
+  
+  This event is called, if the mouse is double-clicked inside the outer rect of this layout
+  element.
+*/
+
+/*! \fn virtual void QCPLayoutElement::wheelEvent(QWheelEvent *event)
+  
+  This event is called, if the mouse wheel is scrolled while the cursor is inside the rect of this
+  layout element.
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates an instance of QCPLayoutElement and sets default values.
+*/
+QCPLayoutElement::QCPLayoutElement(QCustomPlot *parentPlot) :
+  QCPLayerable(parentPlot), // parenthood is changed as soon as layout element gets inserted into a layout (except for top level layout)
+  mParentLayout(0),
+  mMinimumSize(),
+  mMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX),
+  mRect(0, 0, 0, 0),
+  mOuterRect(0, 0, 0, 0),
+  mMargins(0, 0, 0, 0),
+  mMinimumMargins(0, 0, 0, 0),
+  mAutoMargins(QCP::msAll)
+{
+}
+
+QCPLayoutElement::~QCPLayoutElement()
+{
+  setMarginGroup(QCP::msAll, 0); // unregister at margin groups, if there are any
+  // unregister at layout:
+  if (qobject_cast<QCPLayout*>(mParentLayout)) // the qobject_cast is just a safeguard in case the layout forgets to call clear() in its dtor and this dtor is called by QObject dtor
+    mParentLayout->take(this);
+}
+
+/*!
+  Sets the outer rect of this layout element. If the layout element is inside a layout, the layout
+  sets the position and size of this layout element using this function.
+  
+  Calling this function externally has no effect, since the layout will overwrite any changes to
+  the outer rect upon the next replot.
+  
+  The layout element will adapt its inner \ref rect by applying the margins inward to the outer rect.
+  
+  \see rect
+*/
+void QCPLayoutElement::setOuterRect(const QRect &rect)
+{
+  if (mOuterRect != rect)
+  {
+    mOuterRect = rect;
+    mRect = mOuterRect.adjusted(mMargins.left(), mMargins.top(), -mMargins.right(), -mMargins.bottom());
+  }
+}
+
+/*!
+  Sets the margins of this layout element. If \ref setAutoMargins is disabled for some or all
+  sides, this function is used to manually set the margin on those sides. Sides that are still set
+  to be handled automatically are ignored and may have any value in \a margins.
+  
+  The margin is the distance between the outer rect (controlled by the parent layout via \ref
+  setOuterRect) and the inner \ref rect (which usually contains the main content of this layout
+  element).
+  
+  \see setAutoMargins
+*/
+void QCPLayoutElement::setMargins(const QMargins &margins)
+{
+  if (mMargins != margins)
+  {
+    mMargins = margins;
+    mRect = mOuterRect.adjusted(mMargins.left(), mMargins.top(), -mMargins.right(), -mMargins.bottom());
+  }
+}
+
+/*!
+  If \ref setAutoMargins is enabled on some or all margins, this function is used to provide
+  minimum values for those margins.
+  
+  The minimum values are not enforced on margin sides that were set to be under manual control via
+  \ref setAutoMargins.
+  
+  \see setAutoMargins
+*/
+void QCPLayoutElement::setMinimumMargins(const QMargins &margins)
+{
+  if (mMinimumMargins != margins)
+  {
+    mMinimumMargins = margins;
+  }
+}
+
+/*!
+  Sets on which sides the margin shall be calculated automatically. If a side is calculated
+  automatically, a minimum margin value may be provided with \ref setMinimumMargins. If a side is
+  set to be controlled manually, the value may be specified with \ref setMargins.
+  
+  Margin sides that are under automatic control may participate in a \ref QCPMarginGroup (see \ref
+  setMarginGroup), to synchronize (align) it with other layout elements in the plot.
+  
+  \see setMinimumMargins, setMargins
+*/
+void QCPLayoutElement::setAutoMargins(QCP::MarginSides sides)
+{
+  mAutoMargins = sides;
+}
+
+/*!
+  Sets the minimum size for the inner \ref rect of this layout element. A parent layout tries to
+  respect the \a size here by changing row/column sizes in the layout accordingly.
+  
+  If the parent layout size is not sufficient to satisfy all minimum size constraints of its child
+  layout elements, the layout may set a size that is actually smaller than \a size. QCustomPlot
+  propagates the layout's size constraints to the outside by setting its own minimum QWidget size
+  accordingly, so violations of \a size should be exceptions.
+*/
+void QCPLayoutElement::setMinimumSize(const QSize &size)
+{
+  if (mMinimumSize != size)
+  {
+    mMinimumSize = size;
+    if (mParentLayout)
+      mParentLayout->sizeConstraintsChanged();
+  }
+}
+
+/*! \overload
+  
+  Sets the minimum size for the inner \ref rect of this layout element.
+*/
+void QCPLayoutElement::setMinimumSize(int width, int height)
+{
+  setMinimumSize(QSize(width, height));
+}
+
+/*!
+  Sets the maximum size for the inner \ref rect of this layout element. A parent layout tries to
+  respect the \a size here by changing row/column sizes in the layout accordingly.
+*/
+void QCPLayoutElement::setMaximumSize(const QSize &size)
+{
+  if (mMaximumSize != size)
+  {
+    mMaximumSize = size;
+    if (mParentLayout)
+      mParentLayout->sizeConstraintsChanged();
+  }
+}
+
+/*! \overload
+  
+  Sets the maximum size for the inner \ref rect of this layout element.
+*/
+void QCPLayoutElement::setMaximumSize(int width, int height)
+{
+  setMaximumSize(QSize(width, height));
+}
+
+/*!
+  Sets the margin \a group of the specified margin \a sides.
+  
+  Margin groups allow synchronizing specified margins across layout elements, see the documentation
+  of \ref QCPMarginGroup.
+  
+  To unset the margin group of \a sides, set \a group to 0.
+  
+  Note that margin groups only work for margin sides that are set to automatic (\ref
+  setAutoMargins).
+*/
+void QCPLayoutElement::setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *group)
+{
+  QVector<QCP::MarginSide> sideVector;
+  if (sides.testFlag(QCP::msLeft)) sideVector.append(QCP::msLeft);
+  if (sides.testFlag(QCP::msRight)) sideVector.append(QCP::msRight);
+  if (sides.testFlag(QCP::msTop)) sideVector.append(QCP::msTop);
+  if (sides.testFlag(QCP::msBottom)) sideVector.append(QCP::msBottom);
+  
+  for (int i=0; i<sideVector.size(); ++i)
+  {
+    QCP::MarginSide side = sideVector.at(i);
+    if (marginGroup(side) != group)
+    {
+      QCPMarginGroup *oldGroup = marginGroup(side);
+      if (oldGroup) // unregister at old group
+        oldGroup->removeChild(side, this);
+      
+      if (!group) // if setting to 0, remove hash entry. Else set hash entry to new group and register there
+      {
+        mMarginGroups.remove(side);
+      } else // setting to a new group
+      {
+        mMarginGroups[side] = group;
+        group->addChild(side, this);
+      }
+    }
+  }
+}
+
+/*!
+  Updates the layout element and sub-elements. This function is automatically called before every
+  replot by the parent layout element. It is called multiple times, once for every \ref
+  UpdatePhase. The phases are run through in the order of the enum values. For details about what
+  happens at the different phases, see the documentation of \ref UpdatePhase.
+  
+  Layout elements that have child elements should call the \ref update method of their child
+  elements, and pass the current \a phase unchanged.
+  
+  The default implementation executes the automatic margin mechanism in the \ref upMargins phase.
+  Subclasses should make sure to call the base class implementation.
+*/
+void QCPLayoutElement::update(UpdatePhase phase)
+{
+  if (phase == upMargins)
+  {
+    if (mAutoMargins != QCP::msNone)
+    {
+      // set the margins of this layout element according to automatic margin calculation, either directly or via a margin group:
+      QMargins newMargins = mMargins;
+      QList<QCP::MarginSide> allMarginSides = QList<QCP::MarginSide>() << QCP::msLeft << QCP::msRight << QCP::msTop << QCP::msBottom;
+      foreach (QCP::MarginSide side, allMarginSides)
+      {
+        if (mAutoMargins.testFlag(side)) // this side's margin shall be calculated automatically
+        {
+          if (mMarginGroups.contains(side))
+            QCP::setMarginValue(newMargins, side, mMarginGroups[side]->commonMargin(side)); // this side is part of a margin group, so get the margin value from that group
+          else
+            QCP::setMarginValue(newMargins, side, calculateAutoMargin(side)); // this side is not part of a group, so calculate the value directly
+          // apply minimum margin restrictions:
+          if (QCP::getMarginValue(newMargins, side) < QCP::getMarginValue(mMinimumMargins, side))
+            QCP::setMarginValue(newMargins, side, QCP::getMarginValue(mMinimumMargins, side));
+        }
+      }
+      setMargins(newMargins);
+    }
+  }
+}
+
+/*!
+  Returns the minimum size this layout element (the inner \ref rect) may be compressed to.
+  
+  if a minimum size (\ref setMinimumSize) was not set manually, parent layouts consult this
+  function to determine the minimum allowed size of this layout element. (A manual minimum size is
+  considered set if it is non-zero.)
+*/
+QSize QCPLayoutElement::minimumSizeHint() const
+{
+  return mMinimumSize;
+}
+
+/*!
+  Returns the maximum size this layout element (the inner \ref rect) may be expanded to.
+  
+  if a maximum size (\ref setMaximumSize) was not set manually, parent layouts consult this
+  function to determine the maximum allowed size of this layout element. (A manual maximum size is
+  considered set if it is smaller than Qt's QWIDGETSIZE_MAX.)
+*/
+QSize QCPLayoutElement::maximumSizeHint() const
+{
+  return mMaximumSize;
+}
+
+/*!
+  Returns a list of all child elements in this layout element. If \a recursive is true, all
+  sub-child elements are included in the list, too.
+  
+  \warning There may be entries with value 0 in the returned list. (For example, QCPLayoutGrid may have
+  empty cells which yield 0 at the respective index.)
+*/
+QList<QCPLayoutElement*> QCPLayoutElement::elements(bool recursive) const
+{
+  Q_UNUSED(recursive)
+  return QList<QCPLayoutElement*>();
+}
+
+/*!
+  Layout elements are sensitive to events inside their outer rect. If \a pos is within the outer
+  rect, this method returns a value corresponding to 0.99 times the parent plot's selection
+  tolerance. However, layout elements are not selectable by default. So if \a onlySelectable is
+  true, -1.0 is returned.
+  
+  See \ref QCPLayerable::selectTest for a general explanation of this virtual method.
+  
+  QCPLayoutElement subclasses may reimplement this method to provide more specific selection test
+  behaviour.
+*/
+double QCPLayoutElement::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  
+  if (onlySelectable)
+    return -1;
+  
+  if (QRectF(mOuterRect).contains(pos))
+  {
+    if (mParentPlot)
+      return mParentPlot->selectionTolerance()*0.99;
+    else
+    {
+      qDebug() << Q_FUNC_INFO << "parent plot not defined";
+      return -1;
+    }
+  } else
+    return -1;
+}
+
+/*! \internal
+  
+  propagates the parent plot initialization to all child elements, by calling \ref
+  QCPLayerable::initializeParentPlot on them.
+*/
+void QCPLayoutElement::parentPlotInitialized(QCustomPlot *parentPlot)
+{
+  foreach (QCPLayoutElement* el, elements(false))
+  {
+    if (!el->parentPlot())
+      el->initializeParentPlot(parentPlot);
+  }
+}
+
+/*! \internal
+  
+  Returns the margin size for this \a side. It is used if automatic margins is enabled for this \a
+  side (see \ref setAutoMargins). If a minimum margin was set with \ref setMinimumMargins, the
+  returned value will not be smaller than the specified minimum margin.
+  
+  The default implementation just returns the respective manual margin (\ref setMargins) or the
+  minimum margin, whichever is larger.
+*/
+int QCPLayoutElement::calculateAutoMargin(QCP::MarginSide side)
+{
+  return qMax(QCP::getMarginValue(mMargins, side), QCP::getMarginValue(mMinimumMargins, side));
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLayout
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPLayout
+  \brief The abstract base class for layouts
+  
+  This is an abstract base class for layout elements whose main purpose is to define the position
+  and size of other child layout elements. In most cases, layouts don't draw anything themselves
+  (but there are exceptions to this, e.g. QCPLegend).
+  
+  QCPLayout derives from QCPLayoutElement, and thus can itself be nested in other layouts.
+  
+  QCPLayout introduces a common interface for accessing and manipulating the child elements. Those
+  functions are most notably \ref elementCount, \ref elementAt, \ref takeAt, \ref take, \ref
+  simplify, \ref removeAt, \ref remove and \ref clear. Individual subclasses may add more functions
+  to this interface which are more specialized to the form of the layout. For example, \ref
+  QCPLayoutGrid adds functions that take row and column indices to access cells of the layout grid
+  more conveniently.
+  
+  Since this is an abstract base class, you can't instantiate it directly. Rather use one of its
+  subclasses like QCPLayoutGrid or QCPLayoutInset.
+  
+  For a general introduction to the layout system, see the dedicated documentation page \ref
+  thelayoutsystem "The Layout System".
+*/
+
+/* start documentation of pure virtual functions */
+
+/*! \fn virtual int QCPLayout::elementCount() const = 0
+  
+  Returns the number of elements/cells in the layout.
+  
+  \see elements, elementAt
+*/
+
+/*! \fn virtual QCPLayoutElement* QCPLayout::elementAt(int index) const = 0
+  
+  Returns the element in the cell with the given \a index. If \a index is invalid, returns 0.
+  
+  Note that even if \a index is valid, the respective cell may be empty in some layouts (e.g.
+  QCPLayoutGrid), so this function may return 0 in those cases. You may use this function to check
+  whether a cell is empty or not.
+  
+  \see elements, elementCount, takeAt
+*/
+
+/*! \fn virtual QCPLayoutElement* QCPLayout::takeAt(int index) = 0
+  
+  Removes the element with the given \a index from the layout and returns it.
+  
+  If the \a index is invalid or the cell with that index is empty, returns 0.
+  
+  Note that some layouts don't remove the respective cell right away but leave an empty cell after
+  successful removal of the layout element. To collapse empty cells, use \ref simplify.
+  
+  \see elementAt, take
+*/
+
+/*! \fn virtual bool QCPLayout::take(QCPLayoutElement* element) = 0
+  
+  Removes the specified \a element from the layout and returns true on success.
+  
+  If the \a element isn't in this layout, returns false.
+  
+  Note that some layouts don't remove the respective cell right away but leave an empty cell after
+  successful removal of the layout element. To collapse empty cells, use \ref simplify.
+  
+  \see takeAt
+*/
+
+/* end documentation of pure virtual functions */
+
+/*!
+  Creates an instance of QCPLayout and sets default values. Note that since QCPLayout
+  is an abstract base class, it can't be instantiated directly.
+*/
+QCPLayout::QCPLayout()
+{
+}
+
+/*!
+  First calls the QCPLayoutElement::update base class implementation to update the margins on this
+  layout.
+  
+  Then calls \ref updateLayout which subclasses reimplement to reposition and resize their cells.
+  
+  Finally, \ref update is called on all child elements.
+*/
+void QCPLayout::update(UpdatePhase phase)
+{
+  QCPLayoutElement::update(phase);
+  
+  // set child element rects according to layout:
+  if (phase == upLayout)
+    updateLayout();
+  
+  // propagate update call to child elements:
+  const int elCount = elementCount();
+  for (int i=0; i<elCount; ++i)
+  {
+    if (QCPLayoutElement *el = elementAt(i))
+      el->update(phase);
+  }
+}
+
+/* inherits documentation from base class */
+QList<QCPLayoutElement*> QCPLayout::elements(bool recursive) const
+{
+  const int c = elementCount();
+  QList<QCPLayoutElement*> result;
+#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
+  result.reserve(c);
+#endif
+  for (int i=0; i<c; ++i)
+    result.append(elementAt(i));
+  if (recursive)
+  {
+    for (int i=0; i<c; ++i)
+    {
+      if (result.at(i))
+        result << result.at(i)->elements(recursive);
+    }
+  }
+  return result;
+}
+
+/*!
+  Simplifies the layout by collapsing empty cells. The exact behavior depends on subclasses, the
+  default implementation does nothing.
+  
+  Not all layouts need simplification. For example, QCPLayoutInset doesn't use explicit
+  simplification while QCPLayoutGrid does.
+*/
+void QCPLayout::simplify()
+{
+}
+
+/*!
+  Removes and deletes the element at the provided \a index. Returns true on success. If \a index is
+  invalid or points to an empty cell, returns false.
+  
+  This function internally uses \ref takeAt to remove the element from the layout and then deletes
+  the returned element. Note that some layouts don't remove the respective cell right away but leave an
+  empty cell after successful removal of the layout element. To collapse empty cells, use \ref
+  simplify.
+  
+  \see remove, takeAt
+*/
+bool QCPLayout::removeAt(int index)
+{
+  if (QCPLayoutElement *el = takeAt(index))
+  {
+    delete el;
+    return true;
+  } else
+    return false;
+}
+
+/*!
+  Removes and deletes the provided \a element. Returns true on success. If \a element is not in the
+  layout, returns false.
+  
+  This function internally uses \ref takeAt to remove the element from the layout and then deletes
+  the element. Note that some layouts don't remove the respective cell right away but leave an
+  empty cell after successful removal of the layout element. To collapse empty cells, use \ref
+  simplify.
+  
+  \see removeAt, take
+*/
+bool QCPLayout::remove(QCPLayoutElement *element)
+{
+  if (take(element))
+  {
+    delete element;
+    return true;
+  } else
+    return false;
+}
+
+/*!
+  Removes and deletes all layout elements in this layout. Finally calls \ref simplify to make sure
+  all empty cells are collapsed.
+  
+  \see remove, removeAt
+*/
+void QCPLayout::clear()
+{
+  for (int i=elementCount()-1; i>=0; --i)
+  {
+    if (elementAt(i))
+      removeAt(i);
+  }
+  simplify();
+}
+
+/*!
+  Subclasses call this method to report changed (minimum/maximum) size constraints.
+  
+  If the parent of this layout is again a QCPLayout, forwards the call to the parent's \ref
+  sizeConstraintsChanged. If the parent is a QWidget (i.e. is the \ref QCustomPlot::plotLayout of
+  QCustomPlot), calls QWidget::updateGeometry, so if the QCustomPlot widget is inside a Qt QLayout,
+  it may update itself and resize cells accordingly.
+*/
+void QCPLayout::sizeConstraintsChanged() const
+{
+  if (QWidget *w = qobject_cast<QWidget*>(parent()))
+    w->updateGeometry();
+  else if (QCPLayout *l = qobject_cast<QCPLayout*>(parent()))
+    l->sizeConstraintsChanged();
+}
+
+/*! \internal
+  
+  Subclasses reimplement this method to update the position and sizes of the child elements/cells
+  via calling their \ref QCPLayoutElement::setOuterRect. The default implementation does nothing.
+  
+  The geometry used as a reference is the inner \ref rect of this layout. Child elements should stay
+  within that rect.
+  
+  \ref getSectionSizes may help with the reimplementation of this function.
+  
+  \see update
+*/
+void QCPLayout::updateLayout()
+{
+}
+
+
+/*! \internal
+  
+  Associates \a el with this layout. This is done by setting the \ref QCPLayoutElement::layout, the
+  \ref QCPLayerable::parentLayerable and the QObject parent to this layout.
+  
+  Further, if \a el didn't previously have a parent plot, calls \ref
+  QCPLayerable::initializeParentPlot on \a el to set the paret plot.
+  
+  This method is used by subclass specific methods that add elements to the layout. Note that this
+  method only changes properties in \a el. The removal from the old layout and the insertion into
+  the new layout must be done additionally.
+*/
+void QCPLayout::adoptElement(QCPLayoutElement *el)
+{
+  if (el)
+  {
+    el->mParentLayout = this;
+    el->setParentLayerable(this);
+    el->setParent(this);
+    if (!el->parentPlot())
+      el->initializeParentPlot(mParentPlot);
+  } else
+    qDebug() << Q_FUNC_INFO << "Null element passed";
+}
+
+/*! \internal
+  
+  Disassociates \a el from this layout. This is done by setting the \ref QCPLayoutElement::layout
+  and the \ref QCPLayerable::parentLayerable to zero. The QObject parent is set to the parent
+  QCustomPlot.
+  
+  This method is used by subclass specific methods that remove elements from the layout (e.g. \ref
+  take or \ref takeAt). Note that this method only changes properties in \a el. The removal from
+  the old layout must be done additionally.
+*/
+void QCPLayout::releaseElement(QCPLayoutElement *el)
+{
+  if (el)
+  {
+    el->mParentLayout = 0;
+    el->setParentLayerable(0);
+    el->setParent(mParentPlot);
+    // Note: Don't initializeParentPlot(0) here, because layout element will stay in same parent plot
+  } else
+    qDebug() << Q_FUNC_INFO << "Null element passed";
+}
+
+/*! \internal
+  
+  This is a helper function for the implementation of \ref updateLayout in subclasses.
+  
+  It calculates the sizes of one-dimensional sections with provided constraints on maximum section
+  sizes, minimum section sizes, relative stretch factors and the final total size of all sections.
+  
+  The QVector entries refer to the sections. Thus all QVectors must have the same size.
+  
+  \a maxSizes gives the maximum allowed size of each section. If there shall be no maximum size
+  imposed, set all vector values to Qt's QWIDGETSIZE_MAX.
+  
+  \a minSizes gives the minimum allowed size of each section. If there shall be no minimum size
+  imposed, set all vector values to zero. If the \a minSizes entries add up to a value greater than
+  \a totalSize, sections will be scaled smaller than the proposed minimum sizes. (In other words,
+  not exceeding the allowed total size is taken to be more important than not going below minimum
+  section sizes.)
+  
+  \a stretchFactors give the relative proportions of the sections to each other. If all sections
+  shall be scaled equally, set all values equal. If the first section shall be double the size of
+  each individual other section, set the first number of \a stretchFactors to double the value of
+  the other individual values (e.g. {2, 1, 1, 1}).
+  
+  \a totalSize is the value that the final section sizes will add up to. Due to rounding, the
+  actual sum may differ slightly. If you want the section sizes to sum up to exactly that value,
+  you could distribute the remaining difference on the sections.
+  
+  The return value is a QVector containing the section sizes.
+*/
+QVector<int> QCPLayout::getSectionSizes(QVector<int> maxSizes, QVector<int> minSizes, QVector<double> stretchFactors, int totalSize) const
+{
+  if (maxSizes.size() != minSizes.size() || minSizes.size() != stretchFactors.size())
+  {
+    qDebug() << Q_FUNC_INFO << "Passed vector sizes aren't equal:" << maxSizes << minSizes << stretchFactors;
+    return QVector<int>();
+  }
+  if (stretchFactors.isEmpty())
+    return QVector<int>();
+  int sectionCount = stretchFactors.size();
+  QVector<double> sectionSizes(sectionCount);
+  // if provided total size is forced smaller than total minimum size, ignore minimum sizes (squeeze sections):
+  int minSizeSum = 0;
+  for (int i=0; i<sectionCount; ++i)
+    minSizeSum += minSizes.at(i);
+  if (totalSize < minSizeSum)
+  {
+    // new stretch factors are minimum sizes and minimum sizes are set to zero:
+    for (int i=0; i<sectionCount; ++i)
+    {
+      stretchFactors[i] = minSizes.at(i);
+      minSizes[i] = 0;
+    }
+  }
+  
+  QList<int> minimumLockedSections;
+  QList<int> unfinishedSections;
+  for (int i=0; i<sectionCount; ++i)
+    unfinishedSections.append(i);
+  double freeSize = totalSize;
+  
+  int outerIterations = 0;
+  while (!unfinishedSections.isEmpty() && outerIterations < sectionCount*2) // the iteration check ist just a failsafe in case something really strange happens
+  {
+    ++outerIterations;
+    int innerIterations = 0;
+    while (!unfinishedSections.isEmpty() && innerIterations < sectionCount*2) // the iteration check ist just a failsafe in case something really strange happens
+    {
+      ++innerIterations;
+      // find section that hits its maximum next:
+      int nextId = -1;
+      double nextMax = 1e12;
+      for (int i=0; i<unfinishedSections.size(); ++i)
+      {
+        int secId = unfinishedSections.at(i);
+        double hitsMaxAt = (maxSizes.at(secId)-sectionSizes.at(secId))/stretchFactors.at(secId);
+        if (hitsMaxAt < nextMax)
+        {
+          nextMax = hitsMaxAt;
+          nextId = secId;
+        }
+      }
+      // check if that maximum is actually within the bounds of the total size (i.e. can we stretch all remaining sections so far that the found section
+      // actually hits its maximum, without exceeding the total size when we add up all sections)
+      double stretchFactorSum = 0;
+      for (int i=0; i<unfinishedSections.size(); ++i)
+        stretchFactorSum += stretchFactors.at(unfinishedSections.at(i));
+      double nextMaxLimit = freeSize/stretchFactorSum;
+      if (nextMax < nextMaxLimit) // next maximum is actually hit, move forward to that point and fix the size of that section
+      {
+        for (int i=0; i<unfinishedSections.size(); ++i)
+        {
+          sectionSizes[unfinishedSections.at(i)] += nextMax*stretchFactors.at(unfinishedSections.at(i)); // increment all sections
+          freeSize -= nextMax*stretchFactors.at(unfinishedSections.at(i));
+        }
+        unfinishedSections.removeOne(nextId); // exclude the section that is now at maximum from further changes
+      } else // next maximum isn't hit, just distribute rest of free space on remaining sections
+      {
+        for (int i=0; i<unfinishedSections.size(); ++i)
+          sectionSizes[unfinishedSections.at(i)] += nextMaxLimit*stretchFactors.at(unfinishedSections.at(i)); // increment all sections
+        unfinishedSections.clear();
+      }
+    }
+    if (innerIterations == sectionCount*2)
+      qDebug() << Q_FUNC_INFO << "Exceeded maximum expected inner iteration count, layouting aborted. Input was:" << maxSizes << minSizes << stretchFactors << totalSize;
+    
+    // now check whether the resulting section sizes violate minimum restrictions:
+    bool foundMinimumViolation = false;
+    for (int i=0; i<sectionSizes.size(); ++i)
+    {
+      if (minimumLockedSections.contains(i))
+        continue;
+      if (sectionSizes.at(i) < minSizes.at(i)) // section violates minimum
+      {
+        sectionSizes[i] = minSizes.at(i); // set it to minimum
+        foundMinimumViolation = true; // make sure we repeat the whole optimization process
+        minimumLockedSections.append(i);
+      }
+    }
+    if (foundMinimumViolation)
+    {
+      freeSize = totalSize;
+      for (int i=0; i<sectionCount; ++i)
+      {
+        if (!minimumLockedSections.contains(i)) // only put sections that haven't hit their minimum back into the pool
+          unfinishedSections.append(i);
+        else
+          freeSize -= sectionSizes.at(i); // remove size of minimum locked sections from available space in next round
+      }
+      // reset all section sizes to zero that are in unfinished sections (all others have been set to their minimum):
+      for (int i=0; i<unfinishedSections.size(); ++i)
+        sectionSizes[unfinishedSections.at(i)] = 0;
+    }
+  }
+  if (outerIterations == sectionCount*2)
+    qDebug() << Q_FUNC_INFO << "Exceeded maximum expected outer iteration count, layouting aborted. Input was:" << maxSizes << minSizes << stretchFactors << totalSize;
+  
+  QVector<int> result(sectionCount);
+  for (int i=0; i<sectionCount; ++i)
+    result[i] = qRound(sectionSizes.at(i));
+  return result;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLayoutGrid
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPLayoutGrid
+  \brief A layout that arranges child elements in a grid
+  
+  Elements are laid out in a grid with configurable stretch factors (\ref setColumnStretchFactor,
+  \ref setRowStretchFactor) and spacing (\ref setColumnSpacing, \ref setRowSpacing).
+  
+  Elements can be added to cells via \ref addElement. The grid is expanded if the specified row or
+  column doesn't exist yet. Whether a cell contains a valid layout element can be checked with \ref
+  hasElement, that element can be retrieved with \ref element. If rows and columns that only have
+  empty cells shall be removed, call \ref simplify. Removal of elements is either done by just
+  adding the element to a different layout or by using the QCPLayout interface \ref take or \ref
+  remove.
+  
+  Row and column insertion can be performed with \ref insertRow and \ref insertColumn.
+*/
+
+/*!
+  Creates an instance of QCPLayoutGrid and sets default values.
+*/
+QCPLayoutGrid::QCPLayoutGrid() :
+  mColumnSpacing(5),
+  mRowSpacing(5)
+{
+}
+
+QCPLayoutGrid::~QCPLayoutGrid()
+{
+  // clear all child layout elements. This is important because only the specific layouts know how
+  // to handle removing elements (clear calls virtual removeAt method to do that).
+  clear();
+}
+
+/*!
+  Returns the element in the cell in \a row and \a column.
+  
+  Returns 0 if either the row/column is invalid or if the cell is empty. In those cases, a qDebug
+  message is printed. To check whether a cell exists and isn't empty, use \ref hasElement.
+  
+  \see addElement, hasElement
+*/
+QCPLayoutElement *QCPLayoutGrid::element(int row, int column) const
+{
+  if (row >= 0 && row < mElements.size())
+  {
+    if (column >= 0 && column < mElements.first().size())
+    {
+      if (QCPLayoutElement *result = mElements.at(row).at(column))
+        return result;
+      else
+        qDebug() << Q_FUNC_INFO << "Requested cell is empty. Row:" << row << "Column:" << column;
+    } else
+      qDebug() << Q_FUNC_INFO << "Invalid column. Row:" << row << "Column:" << column;
+  } else
+    qDebug() << Q_FUNC_INFO << "Invalid row. Row:" << row << "Column:" << column;
+  return 0;
+}
+
+/*!
+  Returns the number of rows in the layout.
+  
+  \see columnCount
+*/
+int QCPLayoutGrid::rowCount() const
+{
+  return mElements.size();
+}
+
+/*!
+  Returns the number of columns in the layout.
+  
+  \see rowCount
+*/
+int QCPLayoutGrid::columnCount() const
+{
+  if (mElements.size() > 0)
+    return mElements.first().size();
+  else
+    return 0;
+}
+
+/*!
+  Adds the \a element to cell with \a row and \a column. If \a element is already in a layout, it
+  is first removed from there. If \a row or \a column don't exist yet, the layout is expanded
+  accordingly.
+  
+  Returns true if the element was added successfully, i.e. if the cell at \a row and \a column
+  didn't already have an element.
+  
+  \see element, hasElement, take, remove
+*/
+bool QCPLayoutGrid::addElement(int row, int column, QCPLayoutElement *element)
+{
+  if (element)
+  {
+    if (!hasElement(row, column))
+    {
+      if (element->layout()) // remove from old layout first
+        element->layout()->take(element);
+      expandTo(row+1, column+1);
+      mElements[row][column] = element;
+      adoptElement(element);
+      return true;
+    } else
+      qDebug() << Q_FUNC_INFO << "There is already an element in the specified row/column:" << row << column;
+  } else
+    qDebug() << Q_FUNC_INFO << "Can't add null element to row/column:" << row << column;
+  return false;
+}
+
+/*!
+  Returns whether the cell at \a row and \a column exists and contains a valid element, i.e. isn't
+  empty.
+  
+  \see element
+*/
+bool QCPLayoutGrid::hasElement(int row, int column)
+{
+  if (row >= 0 && row < rowCount() && column >= 0 && column < columnCount())
+    return mElements.at(row).at(column);
+  else
+    return false;
+}
+
+/*!
+  Sets the stretch \a factor of \a column.
+  
+  Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond
+  their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref
+  QCPLayoutElement::setMaximumSize), regardless of the stretch factor.
+  
+  The default stretch factor of newly created rows/columns is 1.
+  
+  \see setColumnStretchFactors, setRowStretchFactor
+*/
+void QCPLayoutGrid::setColumnStretchFactor(int column, double factor)
+{
+  if (column >= 0 && column < columnCount())
+  {
+    if (factor > 0)
+      mColumnStretchFactors[column] = factor;
+    else
+      qDebug() << Q_FUNC_INFO << "Invalid stretch factor, must be positive:" << factor;
+  } else
+    qDebug() << Q_FUNC_INFO << "Invalid column:" << column;
+}
+
+/*!
+  Sets the stretch \a factors of all columns. \a factors must have the size \ref columnCount.
+  
+  Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond
+  their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref
+  QCPLayoutElement::setMaximumSize), regardless of the stretch factor.
+  
+  The default stretch factor of newly created rows/columns is 1.
+  
+  \see setColumnStretchFactor, setRowStretchFactors
+*/
+void QCPLayoutGrid::setColumnStretchFactors(const QList<double> &factors)
+{
+  if (factors.size() == mColumnStretchFactors.size())
+  {
+    mColumnStretchFactors = factors;
+    for (int i=0; i<mColumnStretchFactors.size(); ++i)
+    {
+      if (mColumnStretchFactors.at(i) <= 0)
+      {
+        qDebug() << Q_FUNC_INFO << "Invalid stretch factor, must be positive:" << mColumnStretchFactors.at(i);
+        mColumnStretchFactors[i] = 1;
+      }
+    }
+  } else
+    qDebug() << Q_FUNC_INFO << "Column count not equal to passed stretch factor count:" << factors;
+}
+
+/*!
+  Sets the stretch \a factor of \a row.
+  
+  Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond
+  their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref
+  QCPLayoutElement::setMaximumSize), regardless of the stretch factor.
+  
+  The default stretch factor of newly created rows/columns is 1.
+  
+  \see setColumnStretchFactors, setRowStretchFactor
+*/
+void QCPLayoutGrid::setRowStretchFactor(int row, double factor)
+{
+  if (row >= 0 && row < rowCount())
+  {
+    if (factor > 0)
+      mRowStretchFactors[row] = factor;
+    else
+      qDebug() << Q_FUNC_INFO << "Invalid stretch factor, must be positive:" << factor;
+  } else
+    qDebug() << Q_FUNC_INFO << "Invalid row:" << row;
+}
+
+/*!
+  Sets the stretch \a factors of all rows. \a factors must have the size \ref rowCount.
+  
+  Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond
+  their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref
+  QCPLayoutElement::setMaximumSize), regardless of the stretch factor.
+  
+  The default stretch factor of newly created rows/columns is 1.
+  
+  \see setRowStretchFactor, setColumnStretchFactors
+*/
+void QCPLayoutGrid::setRowStretchFactors(const QList<double> &factors)
+{
+  if (factors.size() == mRowStretchFactors.size())
+  {
+    mRowStretchFactors = factors;
+    for (int i=0; i<mRowStretchFactors.size(); ++i)
+    {
+      if (mRowStretchFactors.at(i) <= 0)
+      {
+        qDebug() << Q_FUNC_INFO << "Invalid stretch factor, must be positive:" << mRowStretchFactors.at(i);
+        mRowStretchFactors[i] = 1;
+      }
+    }
+  } else
+    qDebug() << Q_FUNC_INFO << "Row count not equal to passed stretch factor count:" << factors;
+}
+
+/*!
+  Sets the gap that is left blank between columns to \a pixels.
+  
+  \see setRowSpacing
+*/
+void QCPLayoutGrid::setColumnSpacing(int pixels)
+{
+  mColumnSpacing = pixels;
+}
+
+/*!
+  Sets the gap that is left blank between rows to \a pixels.
+  
+  \see setColumnSpacing
+*/
+void QCPLayoutGrid::setRowSpacing(int pixels)
+{
+  mRowSpacing = pixels;
+}
+
+/*!
+  Expands the layout to have \a newRowCount rows and \a newColumnCount columns. So the last valid
+  row index will be \a newRowCount-1, the last valid column index will be \a newColumnCount-1.
+  
+  If the current column/row count is already larger or equal to \a newColumnCount/\a newRowCount,
+  this function does nothing in that dimension.
+  
+  Newly created cells are empty, new rows and columns have the stretch factor 1.
+  
+  Note that upon a call to \ref addElement, the layout is expanded automatically to contain the
+  specified row and column, using this function.
+  
+  \see simplify
+*/
+void QCPLayoutGrid::expandTo(int newRowCount, int newColumnCount)
+{
+  // add rows as necessary:
+  while (rowCount() < newRowCount)
+  {
+    mElements.append(QList<QCPLayoutElement*>());
+    mRowStretchFactors.append(1);
+  }
+  // go through rows and expand columns as necessary:
+  int newColCount = qMax(columnCount(), newColumnCount);
+  for (int i=0; i<rowCount(); ++i)
+  {
+    while (mElements.at(i).size() < newColCount)
+      mElements[i].append(0);
+  }
+  while (mColumnStretchFactors.size() < newColCount)
+    mColumnStretchFactors.append(1);
+}
+
+/*!
+  Inserts a new row with empty cells at the row index \a newIndex. Valid values for \a newIndex
+  range from 0 (inserts a row at the top) to \a rowCount (appends a row at the bottom).
+  
+  \see insertColumn
+*/
+void QCPLayoutGrid::insertRow(int newIndex)
+{
+  if (mElements.isEmpty() || mElements.first().isEmpty()) // if grid is completely empty, add first cell
+  {
+    expandTo(1, 1);
+    return;
+  }
+  
+  if (newIndex < 0)
+    newIndex = 0;
+  if (newIndex > rowCount())
+    newIndex = rowCount();
+  
+  mRowStretchFactors.insert(newIndex, 1);
+  QList<QCPLayoutElement*> newRow;
+  for (int col=0; col<columnCount(); ++col)
+    newRow.append((QCPLayoutElement*)0);
+  mElements.insert(newIndex, newRow);
+}
+
+/*!
+  Inserts a new column with empty cells at the column index \a newIndex. Valid values for \a
+  newIndex range from 0 (inserts a row at the left) to \a rowCount (appends a row at the right).
+  
+  \see insertRow
+*/
+void QCPLayoutGrid::insertColumn(int newIndex)
+{
+  if (mElements.isEmpty() || mElements.first().isEmpty()) // if grid is completely empty, add first cell
+  {
+    expandTo(1, 1);
+    return;
+  }
+  
+  if (newIndex < 0)
+    newIndex = 0;
+  if (newIndex > columnCount())
+    newIndex = columnCount();
+  
+  mColumnStretchFactors.insert(newIndex, 1);
+  for (int row=0; row<rowCount(); ++row)
+    mElements[row].insert(newIndex, (QCPLayoutElement*)0);
+}
+
+/* inherits documentation from base class */
+void QCPLayoutGrid::updateLayout()
+{
+  QVector<int> minColWidths, minRowHeights, maxColWidths, maxRowHeights;
+  getMinimumRowColSizes(&minColWidths, &minRowHeights);
+  getMaximumRowColSizes(&maxColWidths, &maxRowHeights);
+  
+  int totalRowSpacing = (rowCount()-1) * mRowSpacing;
+  int totalColSpacing = (columnCount()-1) * mColumnSpacing;
+  QVector<int> colWidths = getSectionSizes(maxColWidths, minColWidths, mColumnStretchFactors.toVector(), mRect.width()-totalColSpacing);
+  QVector<int> rowHeights = getSectionSizes(maxRowHeights, minRowHeights, mRowStretchFactors.toVector(), mRect.height()-totalRowSpacing);
+  
+  // go through cells and set rects accordingly:
+  int yOffset = mRect.top();
+  for (int row=0; row<rowCount(); ++row)
+  {
+    if (row > 0)
+      yOffset += rowHeights.at(row-1)+mRowSpacing;
+    int xOffset = mRect.left();
+    for (int col=0; col<columnCount(); ++col)
+    {
+      if (col > 0)
+        xOffset += colWidths.at(col-1)+mColumnSpacing;
+      if (mElements.at(row).at(col))
+        mElements.at(row).at(col)->setOuterRect(QRect(xOffset, yOffset, colWidths.at(col), rowHeights.at(row)));
+    }
+  }
+}
+
+/* inherits documentation from base class */
+int QCPLayoutGrid::elementCount() const
+{
+  return rowCount()*columnCount();
+}
+
+/* inherits documentation from base class */
+QCPLayoutElement *QCPLayoutGrid::elementAt(int index) const
+{
+  if (index >= 0 && index < elementCount())
+    return mElements.at(index / columnCount()).at(index % columnCount());
+  else
+    return 0;
+}
+
+/* inherits documentation from base class */
+QCPLayoutElement *QCPLayoutGrid::takeAt(int index)
+{
+  if (QCPLayoutElement *el = elementAt(index))
+  {
+    releaseElement(el);
+    mElements[index / columnCount()][index % columnCount()] = 0;
+    return el;
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "Attempt to take invalid index:" << index;
+    return 0;
+  }
+}
+
+/* inherits documentation from base class */
+bool QCPLayoutGrid::take(QCPLayoutElement *element)
+{
+  if (element)
+  {
+    for (int i=0; i<elementCount(); ++i)
+    {
+      if (elementAt(i) == element)
+      {
+        takeAt(i);
+        return true;
+      }
+    }
+    qDebug() << Q_FUNC_INFO << "Element not in this layout, couldn't take";
+  } else
+    qDebug() << Q_FUNC_INFO << "Can't take null element";
+  return false;
+}
+
+/* inherits documentation from base class */
+QList<QCPLayoutElement*> QCPLayoutGrid::elements(bool recursive) const
+{
+  QList<QCPLayoutElement*> result;
+  int colC = columnCount();
+  int rowC = rowCount();
+#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
+  result.reserve(colC*rowC);
+#endif
+  for (int row=0; row<rowC; ++row)
+  {
+    for (int col=0; col<colC; ++col)
+    {
+      result.append(mElements.at(row).at(col));
+    }
+  }
+  if (recursive)
+  {
+    int c = result.size();
+    for (int i=0; i<c; ++i)
+    {
+      if (result.at(i))
+        result << result.at(i)->elements(recursive);
+    }
+  }
+  return result;
+}
+
+/*!
+  Simplifies the layout by collapsing rows and columns which only contain empty cells.
+*/
+void QCPLayoutGrid::simplify()
+{
+  // remove rows with only empty cells:
+  for (int row=rowCount()-1; row>=0; --row)
+  {
+    bool hasElements = false;
+    for (int col=0; col<columnCount(); ++col)
+    {
+      if (mElements.at(row).at(col))
+      {
+        hasElements = true;
+        break;
+      }
+    }
+    if (!hasElements)
+    {
+      mRowStretchFactors.removeAt(row);
+      mElements.removeAt(row);
+      if (mElements.isEmpty()) // removed last element, also remove stretch factor (wouldn't happen below because also columnCount changed to 0 now)
+        mColumnStretchFactors.clear();
+    }
+  }
+  
+  // remove columns with only empty cells:
+  for (int col=columnCount()-1; col>=0; --col)
+  {
+    bool hasElements = false;
+    for (int row=0; row<rowCount(); ++row)
+    {
+      if (mElements.at(row).at(col))
+      {
+        hasElements = true;
+        break;
+      }
+    }
+    if (!hasElements)
+    {
+      mColumnStretchFactors.removeAt(col);
+      for (int row=0; row<rowCount(); ++row)
+        mElements[row].removeAt(col);
+    }
+  }
+}
+
+/* inherits documentation from base class */
+QSize QCPLayoutGrid::minimumSizeHint() const
+{
+  QVector<int> minColWidths, minRowHeights;
+  getMinimumRowColSizes(&minColWidths, &minRowHeights);
+  QSize result(0, 0);
+  for (int i=0; i<minColWidths.size(); ++i)
+    result.rwidth() += minColWidths.at(i);
+  for (int i=0; i<minRowHeights.size(); ++i)
+    result.rheight() += minRowHeights.at(i);
+  result.rwidth() += qMax(0, columnCount()-1) * mColumnSpacing + mMargins.left() + mMargins.right();
+  result.rheight() += qMax(0, rowCount()-1) * mRowSpacing + mMargins.top() + mMargins.bottom();
+  return result;
+}
+
+/* inherits documentation from base class */
+QSize QCPLayoutGrid::maximumSizeHint() const
+{
+  QVector<int> maxColWidths, maxRowHeights;
+  getMaximumRowColSizes(&maxColWidths, &maxRowHeights);
+  
+  QSize result(0, 0);
+  for (int i=0; i<maxColWidths.size(); ++i)
+    result.setWidth(qMin(result.width()+maxColWidths.at(i), QWIDGETSIZE_MAX));
+  for (int i=0; i<maxRowHeights.size(); ++i)
+    result.setHeight(qMin(result.height()+maxRowHeights.at(i), QWIDGETSIZE_MAX));
+  result.rwidth() += qMax(0, columnCount()-1) * mColumnSpacing + mMargins.left() + mMargins.right();
+  result.rheight() += qMax(0, rowCount()-1) * mRowSpacing + mMargins.top() + mMargins.bottom();
+  return result;
+}
+
+/*! \internal
+  
+  Places the minimum column widths and row heights into \a minColWidths and \a minRowHeights
+  respectively.
+  
+  The minimum height of a row is the largest minimum height of any element in that row. The minimum
+  width of a column is the largest minimum width of any element in that column.
+  
+  This is a helper function for \ref updateLayout.
+  
+  \see getMaximumRowColSizes
+*/
+void QCPLayoutGrid::getMinimumRowColSizes(QVector<int> *minColWidths, QVector<int> *minRowHeights) const
+{
+  *minColWidths = QVector<int>(columnCount(), 0);
+  *minRowHeights = QVector<int>(rowCount(), 0);
+  for (int row=0; row<rowCount(); ++row)
+  {
+    for (int col=0; col<columnCount(); ++col)
+    {
+      if (mElements.at(row).at(col))
+      {
+        QSize minHint = mElements.at(row).at(col)->minimumSizeHint();
+        QSize min = mElements.at(row).at(col)->minimumSize();
+        QSize final(min.width() > 0 ? min.width() : minHint.width(), min.height() > 0 ? min.height() : minHint.height());
+        if (minColWidths->at(col) < final.width())
+          (*minColWidths)[col] = final.width();
+        if (minRowHeights->at(row) < final.height())
+          (*minRowHeights)[row] = final.height();
+      }
+    }
+  }
+}
+
+/*! \internal
+  
+  Places the maximum column widths and row heights into \a maxColWidths and \a maxRowHeights
+  respectively.
+  
+  The maximum height of a row is the smallest maximum height of any element in that row. The
+  maximum width of a column is the smallest maximum width of any element in that column.
+  
+  This is a helper function for \ref updateLayout.
+  
+  \see getMinimumRowColSizes
+*/
+void QCPLayoutGrid::getMaximumRowColSizes(QVector<int> *maxColWidths, QVector<int> *maxRowHeights) const
+{
+  *maxColWidths = QVector<int>(columnCount(), QWIDGETSIZE_MAX);
+  *maxRowHeights = QVector<int>(rowCount(), QWIDGETSIZE_MAX);
+  for (int row=0; row<rowCount(); ++row)
+  {
+    for (int col=0; col<columnCount(); ++col)
+    {
+      if (mElements.at(row).at(col))
+      {
+        QSize maxHint = mElements.at(row).at(col)->maximumSizeHint();
+        QSize max = mElements.at(row).at(col)->maximumSize();
+        QSize final(max.width() < QWIDGETSIZE_MAX ? max.width() : maxHint.width(), max.height() < QWIDGETSIZE_MAX ? max.height() : maxHint.height());
+        if (maxColWidths->at(col) > final.width())
+          (*maxColWidths)[col] = final.width();
+        if (maxRowHeights->at(row) > final.height())
+          (*maxRowHeights)[row] = final.height();
+      }
+    }
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLayoutInset
+////////////////////////////////////////////////////////////////////////////////////////////////////
+/*! \class QCPLayoutInset
+  \brief A layout that places child elements aligned to the border or arbitrarily positioned
+  
+  Elements are placed either aligned to the border or at arbitrary position in the area of the
+  layout. Which placement applies is controlled with the \ref InsetPlacement (\ref
+  setInsetPlacement).
+
+  Elements are added via \ref addElement(QCPLayoutElement *element, Qt::Alignment alignment) or
+  addElement(QCPLayoutElement *element, const QRectF &rect). If the first method is used, the inset
+  placement will default to \ref ipBorderAligned and the element will be aligned according to the
+  \a alignment parameter. The second method defaults to \ref ipFree and allows placing elements at
+  arbitrary position and size, defined by \a rect.
+  
+  The alignment or rect can be set via \ref setInsetAlignment or \ref setInsetRect, respectively.
+  
+  This is the layout that every QCPAxisRect has as \ref QCPAxisRect::insetLayout.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn virtual void QCPLayoutInset::simplify()
+  
+  The QCPInsetLayout does not need simplification since it can never have empty cells due to its
+  linear index structure. This method does nothing.
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates an instance of QCPLayoutInset and sets default values.
+*/
+QCPLayoutInset::QCPLayoutInset()
+{
+}
+
+QCPLayoutInset::~QCPLayoutInset()
+{
+  // clear all child layout elements. This is important because only the specific layouts know how
+  // to handle removing elements (clear calls virtual removeAt method to do that).
+  clear();
+}
+
+/*!
+  Returns the placement type of the element with the specified \a index.
+*/
+QCPLayoutInset::InsetPlacement QCPLayoutInset::insetPlacement(int index) const
+{
+  if (elementAt(index))
+    return mInsetPlacement.at(index);
+  else
+  {
+    qDebug() << Q_FUNC_INFO << "Invalid element index:" << index;
+    return ipFree;
+  }
+}
+
+/*!
+  Returns the alignment of the element with the specified \a index. The alignment only has a
+  meaning, if the inset placement (\ref setInsetPlacement) is \ref ipBorderAligned.
+*/
+Qt::Alignment QCPLayoutInset::insetAlignment(int index) const
+{
+  if (elementAt(index))
+    return mInsetAlignment.at(index);
+  else
+  {
+    qDebug() << Q_FUNC_INFO << "Invalid element index:" << index;
+    return 0;
+  }
+}
+
+/*!
+  Returns the rect of the element with the specified \a index. The rect only has a
+  meaning, if the inset placement (\ref setInsetPlacement) is \ref ipFree.
+*/
+QRectF QCPLayoutInset::insetRect(int index) const
+{
+  if (elementAt(index))
+    return mInsetRect.at(index);
+  else
+  {
+    qDebug() << Q_FUNC_INFO << "Invalid element index:" << index;
+    return QRectF();
+  }
+}
+
+/*!
+  Sets the inset placement type of the element with the specified \a index to \a placement.
+  
+  \see InsetPlacement
+*/
+void QCPLayoutInset::setInsetPlacement(int index, QCPLayoutInset::InsetPlacement placement)
+{
+  if (elementAt(index))
+    mInsetPlacement[index] = placement;
+  else
+    qDebug() << Q_FUNC_INFO << "Invalid element index:" << index;
+}
+
+/*!
+  If the inset placement (\ref setInsetPlacement) is \ref ipBorderAligned, this function
+  is used to set the alignment of the element with the specified \a index to \a alignment.
+  
+  \a alignment is an or combination of the following alignment flags: Qt::AlignLeft,
+  Qt::AlignHCenter, Qt::AlighRight, Qt::AlignTop, Qt::AlignVCenter, Qt::AlignBottom. Any other
+  alignment flags will be ignored.
+*/
+void QCPLayoutInset::setInsetAlignment(int index, Qt::Alignment alignment)
+{
+  if (elementAt(index))
+    mInsetAlignment[index] = alignment;
+  else
+    qDebug() << Q_FUNC_INFO << "Invalid element index:" << index;
+}
+
+/*!
+  If the inset placement (\ref setInsetPlacement) is \ref ipFree, this function is used to set the
+  position and size of the element with the specified \a index to \a rect.
+  
+  \a rect is given in fractions of the whole inset layout rect. So an inset with rect (0, 0, 1, 1)
+  will span the entire layout. An inset with rect (0.6, 0.1, 0.35, 0.35) will be in the top right
+  corner of the layout, with 35% width and height of the parent layout.
+  
+  Note that the minimum and maximum sizes of the embedded element (\ref
+  QCPLayoutElement::setMinimumSize, \ref QCPLayoutElement::setMaximumSize) are enforced.
+*/
+void QCPLayoutInset::setInsetRect(int index, const QRectF &rect)
+{
+  if (elementAt(index))
+    mInsetRect[index] = rect;
+  else
+    qDebug() << Q_FUNC_INFO << "Invalid element index:" << index;
+}
+
+/* inherits documentation from base class */
+void QCPLayoutInset::updateLayout()
+{
+  for (int i=0; i<mElements.size(); ++i)
+  {
+    QRect insetRect;
+    QSize finalMinSize, finalMaxSize;
+    QSize minSizeHint = mElements.at(i)->minimumSizeHint();
+    QSize maxSizeHint = mElements.at(i)->maximumSizeHint();
+    finalMinSize.setWidth(mElements.at(i)->minimumSize().width() > 0 ? mElements.at(i)->minimumSize().width() : minSizeHint.width());
+    finalMinSize.setHeight(mElements.at(i)->minimumSize().height() > 0 ? mElements.at(i)->minimumSize().height() : minSizeHint.height());
+    finalMaxSize.setWidth(mElements.at(i)->maximumSize().width() < QWIDGETSIZE_MAX ? mElements.at(i)->maximumSize().width() : maxSizeHint.width());
+    finalMaxSize.setHeight(mElements.at(i)->maximumSize().height() < QWIDGETSIZE_MAX ? mElements.at(i)->maximumSize().height() : maxSizeHint.height());
+    if (mInsetPlacement.at(i) == ipFree)
+    {
+      insetRect = QRect(rect().x()+rect().width()*mInsetRect.at(i).x(),
+                        rect().y()+rect().height()*mInsetRect.at(i).y(),
+                        rect().width()*mInsetRect.at(i).width(),
+                        rect().height()*mInsetRect.at(i).height());
+      if (insetRect.size().width() < finalMinSize.width())
+        insetRect.setWidth(finalMinSize.width());
+      if (insetRect.size().height() < finalMinSize.height())
+        insetRect.setHeight(finalMinSize.height());
+      if (insetRect.size().width() > finalMaxSize.width())
+        insetRect.setWidth(finalMaxSize.width());
+      if (insetRect.size().height() > finalMaxSize.height())
+        insetRect.setHeight(finalMaxSize.height());
+    } else if (mInsetPlacement.at(i) == ipBorderAligned)
+    {
+      insetRect.setSize(finalMinSize);
+      Qt::Alignment al = mInsetAlignment.at(i);
+      if (al.testFlag(Qt::AlignLeft)) insetRect.moveLeft(rect().x());
+      else if (al.testFlag(Qt::AlignRight)) insetRect.moveRight(rect().x()+rect().width());
+      else insetRect.moveLeft(rect().x()+rect().width()*0.5-finalMinSize.width()*0.5); // default to Qt::AlignHCenter
+      if (al.testFlag(Qt::AlignTop)) insetRect.moveTop(rect().y());
+      else if (al.testFlag(Qt::AlignBottom)) insetRect.moveBottom(rect().y()+rect().height());
+      else insetRect.moveTop(rect().y()+rect().height()*0.5-finalMinSize.height()*0.5); // default to Qt::AlignVCenter
+    }
+    mElements.at(i)->setOuterRect(insetRect);
+  }
+}
+
+/* inherits documentation from base class */
+int QCPLayoutInset::elementCount() const
+{
+  return mElements.size();
+}
+
+/* inherits documentation from base class */
+QCPLayoutElement *QCPLayoutInset::elementAt(int index) const
+{
+  if (index >= 0 && index < mElements.size())
+    return mElements.at(index);
+  else
+    return 0;
+}
+
+/* inherits documentation from base class */
+QCPLayoutElement *QCPLayoutInset::takeAt(int index)
+{
+  if (QCPLayoutElement *el = elementAt(index))
+  {
+    releaseElement(el);
+    mElements.removeAt(index);
+    mInsetPlacement.removeAt(index);
+    mInsetAlignment.removeAt(index);
+    mInsetRect.removeAt(index);
+    return el;
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "Attempt to take invalid index:" << index;
+    return 0;
+  }
+}
+
+/* inherits documentation from base class */
+bool QCPLayoutInset::take(QCPLayoutElement *element)
+{
+  if (element)
+  {
+    for (int i=0; i<elementCount(); ++i)
+    {
+      if (elementAt(i) == element)
+      {
+        takeAt(i);
+        return true;
+      }
+    }
+    qDebug() << Q_FUNC_INFO << "Element not in this layout, couldn't take";
+  } else
+    qDebug() << Q_FUNC_INFO << "Can't take null element";
+  return false;
+}
+
+/*!
+  The inset layout is sensitive to events only at areas where its (visible) child elements are
+  sensitive. If the selectTest method of any of the child elements returns a positive number for \a
+  pos, this method returns a value corresponding to 0.99 times the parent plot's selection
+  tolerance. The inset layout is not selectable itself by default. So if \a onlySelectable is true,
+  -1.0 is returned.
+  
+  See \ref QCPLayerable::selectTest for a general explanation of this virtual method.
+*/
+double QCPLayoutInset::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable)
+    return -1;
+  
+  for (int i=0; i<mElements.size(); ++i)
+  {
+    // inset layout shall only return positive selectTest, if actually an inset object is at pos
+    // else it would block the entire underlying QCPAxisRect with its surface.
+    if (mElements.at(i)->realVisibility() && mElements.at(i)->selectTest(pos, onlySelectable) >= 0)
+      return mParentPlot->selectionTolerance()*0.99;
+  }
+  return -1;
+}
+
+/*!
+  Adds the specified \a element to the layout as an inset aligned at the border (\ref
+  setInsetAlignment is initialized with \ref ipBorderAligned). The alignment is set to \a
+  alignment.
+  
+  \a alignment is an or combination of the following alignment flags: Qt::AlignLeft,
+  Qt::AlignHCenter, Qt::AlighRight, Qt::AlignTop, Qt::AlignVCenter, Qt::AlignBottom. Any other
+  alignment flags will be ignored.
+  
+  \see addElement(QCPLayoutElement *element, const QRectF &rect)
+*/
+void QCPLayoutInset::addElement(QCPLayoutElement *element, Qt::Alignment alignment)
+{
+  if (element)
+  {
+    if (element->layout()) // remove from old layout first
+      element->layout()->take(element);
+    mElements.append(element);
+    mInsetPlacement.append(ipBorderAligned);
+    mInsetAlignment.append(alignment);
+    mInsetRect.append(QRectF(0.6, 0.6, 0.4, 0.4));
+    adoptElement(element);
+  } else
+    qDebug() << Q_FUNC_INFO << "Can't add null element";
+}
+
+/*!
+  Adds the specified \a element to the layout as an inset with free positioning/sizing (\ref
+  setInsetAlignment is initialized with \ref ipFree). The position and size is set to \a
+  rect.
+  
+  \a rect is given in fractions of the whole inset layout rect. So an inset with rect (0, 0, 1, 1)
+  will span the entire layout. An inset with rect (0.6, 0.1, 0.35, 0.35) will be in the top right
+  corner of the layout, with 35% width and height of the parent layout.
+  
+  \see addElement(QCPLayoutElement *element, Qt::Alignment alignment)
+*/
+void QCPLayoutInset::addElement(QCPLayoutElement *element, const QRectF &rect)
+{
+  if (element)
+  {
+    if (element->layout()) // remove from old layout first
+      element->layout()->take(element);
+    mElements.append(element);
+    mInsetPlacement.append(ipFree);
+    mInsetAlignment.append(Qt::AlignRight|Qt::AlignTop);
+    mInsetRect.append(rect);
+    adoptElement(element);
+  } else
+    qDebug() << Q_FUNC_INFO << "Can't add null element";
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLineEnding
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPLineEnding
+  \brief Handles the different ending decorations for line-like items
+  
+  \image html QCPLineEnding.png "The various ending styles currently supported"
+  
+  For every ending a line-like item has, an instance of this class exists. For example, QCPItemLine
+  has two endings which can be set with QCPItemLine::setHead and QCPItemLine::setTail.
+ 
+  The styles themselves are defined via the enum QCPLineEnding::EndingStyle. Most decorations can
+  be modified regarding width and length, see \ref setWidth and \ref setLength. The direction of
+  the ending decoration (e.g. direction an arrow is pointing) is controlled by the line-like item.
+  For example, when both endings of a QCPItemLine are set to be arrows, they will point to opposite
+  directions, e.g. "outward". This can be changed by \ref setInverted, which would make the
+  respective arrow point inward.
+  
+  Note that due to the overloaded QCPLineEnding constructor, you may directly specify a
+  QCPLineEnding::EndingStyle where actually a QCPLineEnding is expected, e.g.
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcplineending-sethead
+*/
+
+/*!
+  Creates a QCPLineEnding instance with default values (style \ref esNone).
+*/
+QCPLineEnding::QCPLineEnding() :
+  mStyle(esNone),
+  mWidth(8),
+  mLength(10),
+  mInverted(false)
+{
+}
+
+/*!
+  Creates a QCPLineEnding instance with the specified values.
+*/
+QCPLineEnding::QCPLineEnding(QCPLineEnding::EndingStyle style, double width, double length, bool inverted) :
+  mStyle(style),
+  mWidth(width),
+  mLength(length),
+  mInverted(inverted)
+{
+}
+
+/*!
+  Sets the style of the ending decoration.
+*/
+void QCPLineEnding::setStyle(QCPLineEnding::EndingStyle style)
+{
+  mStyle = style;
+}
+
+/*!
+  Sets the width of the ending decoration, if the style supports it. On arrows, for example, the
+  width defines the size perpendicular to the arrow's pointing direction.
+  
+  \see setLength
+*/
+void QCPLineEnding::setWidth(double width)
+{
+  mWidth = width;
+}
+
+/*!
+  Sets the length of the ending decoration, if the style supports it. On arrows, for example, the
+  length defines the size in pointing direction.
+  
+  \see setWidth
+*/
+void QCPLineEnding::setLength(double length)
+{
+  mLength = length;
+}
+
+/*!
+  Sets whether the ending decoration shall be inverted. For example, an arrow decoration will point
+  inward when \a inverted is set to true.
+
+  Note that also the \a width direction is inverted. For symmetrical ending styles like arrows or
+  discs, this doesn't make a difference. However, asymmetric styles like \ref esHalfBar are
+  affected by it, which can be used to control to which side the half bar points to.
+*/
+void QCPLineEnding::setInverted(bool inverted)
+{
+  mInverted = inverted;
+}
+
+/*! \internal
+  
+  Returns the maximum pixel radius the ending decoration might cover, starting from the position
+  the decoration is drawn at (typically a line ending/\ref QCPItemPosition of an item).
+  
+  This is relevant for clipping. Only omit painting of the decoration when the position where the
+  decoration is supposed to be drawn is farther away from the clipping rect than the returned
+  distance.
+*/
+double QCPLineEnding::boundingDistance() const
+{
+  switch (mStyle)
+  {
+    case esNone:
+      return 0;
+      
+    case esFlatArrow:
+    case esSpikeArrow:
+    case esLineArrow:
+    case esSkewedBar:
+      return qSqrt(mWidth*mWidth+mLength*mLength); // items that have width and length
+      
+    case esDisc:
+    case esSquare:
+    case esDiamond:
+    case esBar:
+    case esHalfBar:
+      return mWidth*1.42; // items that only have a width -> width*sqrt(2)
+
+  }
+  return 0;
+}
+
+/*!
+  Starting from the origin of this line ending (which is style specific), returns the length
+  covered by the line ending symbol, in backward direction.
+  
+  For example, the \ref esSpikeArrow has a shorter real length than a \ref esFlatArrow, even if
+  both have the same \ref setLength value, because the spike arrow has an inward curved back, which
+  reduces the length along its center axis (the drawing origin for arrows is at the tip).
+  
+  This function is used for precise, style specific placement of line endings, for example in
+  QCPAxes.
+*/
+double QCPLineEnding::realLength() const
+{
+  switch (mStyle)
+  {
+    case esNone:
+    case esLineArrow:
+    case esSkewedBar:
+    case esBar:
+    case esHalfBar:
+      return 0;
+      
+    case esFlatArrow:
+      return mLength;
+      
+    case esDisc:
+    case esSquare:
+    case esDiamond:
+      return mWidth*0.5;
+      
+    case esSpikeArrow:
+      return mLength*0.8;
+  }
+  return 0;
+}
+
+/*! \internal
+  
+  Draws the line ending with the specified \a painter at the position \a pos. The direction of the
+  line ending is controlled with \a dir.
+*/
+void QCPLineEnding::draw(QCPPainter *painter, const QVector2D &pos, const QVector2D &dir) const
+{
+  if (mStyle == esNone)
+    return;
+  
+  QVector2D lengthVec(dir.normalized());
+  if (lengthVec.isNull())
+    lengthVec = QVector2D(1, 0);
+  QVector2D widthVec(-lengthVec.y(), lengthVec.x());
+  lengthVec *= (float)(mLength*(mInverted ? -1 : 1));
+  widthVec *= (float)(mWidth*0.5*(mInverted ? -1 : 1));
+  
+  QPen penBackup = painter->pen();
+  QBrush brushBackup = painter->brush();
+  QPen miterPen = penBackup;
+  miterPen.setJoinStyle(Qt::MiterJoin); // to make arrow heads spikey
+  QBrush brush(painter->pen().color(), Qt::SolidPattern);
+  switch (mStyle)
+  {
+    case esNone: break;
+    case esFlatArrow:
+    {
+      QPointF points[3] = {pos.toPointF(),
+                           (pos-lengthVec+widthVec).toPointF(),
+                           (pos-lengthVec-widthVec).toPointF()
+                          };
+      painter->setPen(miterPen);
+      painter->setBrush(brush);
+      painter->drawConvexPolygon(points, 3);
+      painter->setBrush(brushBackup);
+      painter->setPen(penBackup);
+      break;
+    }
+    case esSpikeArrow:
+    {
+      QPointF points[4] = {pos.toPointF(),
+                           (pos-lengthVec+widthVec).toPointF(),
+                           (pos-lengthVec*0.8f).toPointF(),
+                           (pos-lengthVec-widthVec).toPointF()
+                          };
+      painter->setPen(miterPen);
+      painter->setBrush(brush);
+      painter->drawConvexPolygon(points, 4);
+      painter->setBrush(brushBackup);
+      painter->setPen(penBackup);
+      break;
+    }
+    case esLineArrow:
+    {
+      QPointF points[3] = {(pos-lengthVec+widthVec).toPointF(),
+                           pos.toPointF(),
+                           (pos-lengthVec-widthVec).toPointF()
+                          };
+      painter->setPen(miterPen);
+      painter->drawPolyline(points, 3);
+      painter->setPen(penBackup);
+      break;
+    }
+    case esDisc:
+    {
+      painter->setBrush(brush);
+      painter->drawEllipse(pos.toPointF(),  mWidth*0.5, mWidth*0.5);
+      painter->setBrush(brushBackup);
+      break;
+    }
+    case esSquare:
+    {
+      QVector2D widthVecPerp(-widthVec.y(), widthVec.x());
+      QPointF points[4] = {(pos-widthVecPerp+widthVec).toPointF(),
+                           (pos-widthVecPerp-widthVec).toPointF(),
+                           (pos+widthVecPerp-widthVec).toPointF(),
+                           (pos+widthVecPerp+widthVec).toPointF()
+                          };
+      painter->setPen(miterPen);
+      painter->setBrush(brush);
+      painter->drawConvexPolygon(points, 4);
+      painter->setBrush(brushBackup);
+      painter->setPen(penBackup);
+      break;
+    }
+    case esDiamond:
+    {
+      QVector2D widthVecPerp(-widthVec.y(), widthVec.x());
+      QPointF points[4] = {(pos-widthVecPerp).toPointF(),
+                           (pos-widthVec).toPointF(),
+                           (pos+widthVecPerp).toPointF(),
+                           (pos+widthVec).toPointF()
+                          };
+      painter->setPen(miterPen);
+      painter->setBrush(brush);
+      painter->drawConvexPolygon(points, 4);
+      painter->setBrush(brushBackup);
+      painter->setPen(penBackup);
+      break;
+    }
+    case esBar:
+    {
+      painter->drawLine((pos+widthVec).toPointF(), (pos-widthVec).toPointF());
+      break;
+    }
+    case esHalfBar:
+    {
+      painter->drawLine((pos+widthVec).toPointF(), pos.toPointF());
+      break;
+    }
+    case esSkewedBar:
+    {
+      if (qFuzzyIsNull(painter->pen().widthF()) && !painter->modes().testFlag(QCPPainter::pmNonCosmetic))
+      {
+        // if drawing with cosmetic pen (perfectly thin stroke, happens only in vector exports), draw bar exactly on tip of line
+        painter->drawLine((pos+widthVec+lengthVec*0.2f*(mInverted?-1:1)).toPointF(),
+                          (pos-widthVec-lengthVec*0.2f*(mInverted?-1:1)).toPointF());
+      } else
+      {
+        // if drawing with thick (non-cosmetic) pen, shift bar a little in line direction to prevent line from sticking through bar slightly
+        painter->drawLine((pos+widthVec+lengthVec*0.2f*(mInverted?-1:1)+dir.normalized()*qMax(1.0f, (float)painter->pen().widthF())*0.5f).toPointF(),
+                          (pos-widthVec-lengthVec*0.2f*(mInverted?-1:1)+dir.normalized()*qMax(1.0f, (float)painter->pen().widthF())*0.5f).toPointF());
+      }
+      break;
+    }
+  }
+}
+
+/*! \internal
+  \overload
+  
+  Draws the line ending. The direction is controlled with the \a angle parameter in radians.
+*/
+void QCPLineEnding::draw(QCPPainter *painter, const QVector2D &pos, double angle) const
+{
+  draw(painter, pos, QVector2D(qCos(angle), qSin(angle)));
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPGrid
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPGrid
+  \brief Responsible for drawing the grid of a QCPAxis.
+  
+  This class is tightly bound to QCPAxis. Every axis owns a grid instance and uses it to draw the
+  grid lines, sub grid lines and zero-line. You can interact with the grid of an axis via \ref
+  QCPAxis::grid. Normally, you don't need to create an instance of QCPGrid yourself.
+  
+  The axis and grid drawing was split into two classes to allow them to be placed on different
+  layers (both QCPAxis and QCPGrid inherit from QCPLayerable). Thus it is possible to have the grid
+  in the background and the axes in the foreground, and any plottables/items in between. This
+  described situation is the default setup, see the QCPLayer documentation.
+*/
+
+/*!
+  Creates a QCPGrid instance and sets default values.
+  
+  You shouldn't instantiate grids on their own, since every QCPAxis brings its own QCPGrid.
+*/
+QCPGrid::QCPGrid(QCPAxis *parentAxis) :
+  QCPLayerable(parentAxis->parentPlot(), QString(), parentAxis),
+  mParentAxis(parentAxis)
+{
+  // warning: this is called in QCPAxis constructor, so parentAxis members should not be accessed/called
+  setParent(parentAxis);
+  setPen(QPen(QColor(200,200,200), 0, Qt::DotLine));
+  setSubGridPen(QPen(QColor(220,220,220), 0, Qt::DotLine));
+  setZeroLinePen(QPen(QColor(200,200,200), 0, Qt::SolidLine));
+  setSubGridVisible(false);
+  setAntialiased(false);
+  setAntialiasedSubGrid(false);
+  setAntialiasedZeroLine(false);
+}
+
+/*!
+  Sets whether grid lines at sub tick marks are drawn.
+  
+  \see setSubGridPen
+*/
+void QCPGrid::setSubGridVisible(bool visible)
+{
+  mSubGridVisible = visible;
+}
+
+/*!
+  Sets whether sub grid lines are drawn antialiased.
+*/
+void QCPGrid::setAntialiasedSubGrid(bool enabled)
+{
+  mAntialiasedSubGrid = enabled;
+}
+
+/*!
+  Sets whether zero lines are drawn antialiased.
+*/
+void QCPGrid::setAntialiasedZeroLine(bool enabled)
+{
+  mAntialiasedZeroLine = enabled;
+}
+
+/*!
+  Sets the pen with which (major) grid lines are drawn.
+*/
+void QCPGrid::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen with which sub grid lines are drawn.
+*/
+void QCPGrid::setSubGridPen(const QPen &pen)
+{
+  mSubGridPen = pen;
+}
+
+/*!
+  Sets the pen with which zero lines are drawn.
+  
+  Zero lines are lines at value coordinate 0 which may be drawn with a different pen than other grid
+  lines. To disable zero lines and just draw normal grid lines at zero, set \a pen to Qt::NoPen.
+*/
+void QCPGrid::setZeroLinePen(const QPen &pen)
+{
+  mZeroLinePen = pen;
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing the major grid lines.
+
+  This is the antialiasing state the painter passed to the \ref draw method is in by default.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased
+*/
+void QCPGrid::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiased, QCP::aeGrid);
+}
+
+/*! \internal
+  
+  Draws grid lines and sub grid lines at the positions of (sub) ticks of the parent axis, spanning
+  over the complete axis rect. Also draws the zero line, if appropriate (\ref setZeroLinePen).
+*/
+void QCPGrid::draw(QCPPainter *painter)
+{
+  if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; }
+  
+  if (mSubGridVisible)
+    drawSubGridLines(painter);
+  drawGridLines(painter);
+}
+
+/*! \internal
+  
+  Draws the main grid lines and possibly a zero line with the specified painter.
+  
+  This is a helper function called by \ref draw.
+*/
+void QCPGrid::drawGridLines(QCPPainter *painter) const
+{
+  if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; }
+  
+  int lowTick = mParentAxis->mLowestVisibleTick;
+  int highTick = mParentAxis->mHighestVisibleTick;
+  double t; // helper variable, result of coordinate-to-pixel transforms
+  if (mParentAxis->orientation() == Qt::Horizontal)
+  {
+    // draw zeroline:
+    int zeroLineIndex = -1;
+    if (mZeroLinePen.style() != Qt::NoPen && mParentAxis->mRange.lower < 0 && mParentAxis->mRange.upper > 0)
+    {
+      applyAntialiasingHint(painter, mAntialiasedZeroLine, QCP::aeZeroLine);
+      painter->setPen(mZeroLinePen);
+      double epsilon = mParentAxis->range().size()*1E-6; // for comparing double to zero
+      for (int i=lowTick; i <= highTick; ++i)
+      {
+        if (qAbs(mParentAxis->mTickVector.at(i)) < epsilon)
+        {
+          zeroLineIndex = i;
+          t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // x
+          painter->drawLine(QLineF(t, mParentAxis->mAxisRect->bottom(), t, mParentAxis->mAxisRect->top()));
+          break;
+        }
+      }
+    }
+    // draw grid lines:
+    applyDefaultAntialiasingHint(painter);
+    painter->setPen(mPen);
+    for (int i=lowTick; i <= highTick; ++i)
+    {
+      if (i == zeroLineIndex) continue; // don't draw a gridline on top of the zeroline
+      t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // x
+      painter->drawLine(QLineF(t, mParentAxis->mAxisRect->bottom(), t, mParentAxis->mAxisRect->top()));
+    }
+  } else
+  {
+    // draw zeroline:
+    int zeroLineIndex = -1;
+    if (mZeroLinePen.style() != Qt::NoPen && mParentAxis->mRange.lower < 0 && mParentAxis->mRange.upper > 0)
+    {
+      applyAntialiasingHint(painter, mAntialiasedZeroLine, QCP::aeZeroLine);
+      painter->setPen(mZeroLinePen);
+      double epsilon = mParentAxis->mRange.size()*1E-6; // for comparing double to zero
+      for (int i=lowTick; i <= highTick; ++i)
+      {
+        if (qAbs(mParentAxis->mTickVector.at(i)) < epsilon)
+        {
+          zeroLineIndex = i;
+          t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // y
+          painter->drawLine(QLineF(mParentAxis->mAxisRect->left(), t, mParentAxis->mAxisRect->right(), t));
+          break;
+        }
+      }
+    }
+    // draw grid lines:
+    applyDefaultAntialiasingHint(painter);
+    painter->setPen(mPen);
+    for (int i=lowTick; i <= highTick; ++i)
+    {
+      if (i == zeroLineIndex) continue; // don't draw a gridline on top of the zeroline
+      t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // y
+      painter->drawLine(QLineF(mParentAxis->mAxisRect->left(), t, mParentAxis->mAxisRect->right(), t));
+    }
+  }
+}
+
+/*! \internal
+  
+  Draws the sub grid lines with the specified painter.
+  
+  This is a helper function called by \ref draw.
+*/
+void QCPGrid::drawSubGridLines(QCPPainter *painter) const
+{
+  if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; }
+  
+  applyAntialiasingHint(painter, mAntialiasedSubGrid, QCP::aeSubGrid);
+  double t; // helper variable, result of coordinate-to-pixel transforms
+  painter->setPen(mSubGridPen);
+  if (mParentAxis->orientation() == Qt::Horizontal)
+  {
+    for (int i=0; i<mParentAxis->mSubTickVector.size(); ++i)
+    {
+      t = mParentAxis->coordToPixel(mParentAxis->mSubTickVector.at(i)); // x
+      painter->drawLine(QLineF(t, mParentAxis->mAxisRect->bottom(), t, mParentAxis->mAxisRect->top()));
+    }
+  } else
+  {
+    for (int i=0; i<mParentAxis->mSubTickVector.size(); ++i)
+    {
+      t = mParentAxis->coordToPixel(mParentAxis->mSubTickVector.at(i)); // y
+      painter->drawLine(QLineF(mParentAxis->mAxisRect->left(), t, mParentAxis->mAxisRect->right(), t));
+    }
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPAxis
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPAxis
+  \brief Manages a single axis inside a QCustomPlot.
+
+  Usually doesn't need to be instantiated externally. Access %QCustomPlot's default four axes via
+  QCustomPlot::xAxis (bottom), QCustomPlot::yAxis (left), QCustomPlot::xAxis2 (top) and
+  QCustomPlot::yAxis2 (right).
+  
+  Axes are always part of an axis rect, see QCPAxisRect.
+  \image html AxisNamesOverview.png
+  <center>Naming convention of axis parts</center>
+  \n
+    
+  \image html AxisRectSpacingOverview.png
+  <center>Overview of the spacings and paddings that define the geometry of an axis. The dashed gray line
+  on the left represents the QCustomPlot widget border.</center>
+
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn Qt::Orientation QCPAxis::orientation() const
+  
+  Returns the orientation of this axis. The axis orientation (horizontal or vertical) is deduced
+  from the axis type (left, top, right or bottom).
+  
+  \see orientation(AxisType type)
+*/
+
+/*! \fn QCPGrid *QCPAxis::grid() const
+  
+  Returns the \ref QCPGrid instance belonging to this axis. Access it to set details about the way the
+  grid is displayed.
+*/
+
+/*! \fn static Qt::Orientation QCPAxis::orientation(AxisType type)
+  
+  Returns the orientation of the specified axis type
+  
+  \see orientation()
+*/
+
+/* end of documentation of inline functions */
+/* start of documentation of signals */
+
+/*! \fn void QCPAxis::ticksRequest()
+  
+  This signal is emitted when \ref setAutoTicks is false and the axis is about to generate tick
+  labels for a replot.
+  
+  Modifying the tick positions can be done with \ref setTickVector. If you also want to control the
+  tick labels, set \ref setAutoTickLabels to false and also provide the labels with \ref
+  setTickVectorLabels.
+  
+  If you only want static ticks you probably don't need this signal, since you can just set the
+  tick vector (and possibly tick label vector) once. However, if you want to provide ticks (and
+  maybe labels) dynamically, e.g. depending on the current axis range, connect a slot to this
+  signal and set the vector/vectors there.
+*/
+
+/*! \fn void QCPAxis::rangeChanged(const QCPRange &newRange)
+
+  This signal is emitted when the range of this axis has changed. You can connect it to the \ref
+  setRange slot of another axis to communicate the new range to the other axis, in order for it to
+  be synchronized.
+  
+  You may also manipulate/correct the range with \ref setRange in a slot connected to this signal.
+  This is useful if for example a maximum range span shall not be exceeded, or if the lower/upper
+  range shouldn't go beyond certain values. For example, the following slot would limit the x axis
+  to only positive ranges:
+  \code
+  if (newRange.lower < 0)
+    plot->xAxis->setRange(0, newRange.size());
+  \endcode
+*/
+
+/*! \fn void QCPAxis::rangeChanged(const QCPRange &newRange, const QCPRange &oldRange)
+  \overload
+  
+  Additionally to the new range, this signal also provides the previous range held by the axis as
+  \a oldRange.
+*/
+
+/*! \fn void QCPAxis::scaleTypeChanged(QCPAxis::ScaleType scaleType);
+  
+  This signal is emitted when the scale type changes, by calls to \ref setScaleType
+*/
+
+/*! \fn void QCPAxis::selectionChanged(QCPAxis::SelectableParts selection)
+  
+  This signal is emitted when the selection state of this axis has changed, either by user interaction
+  or by a direct call to \ref setSelectedParts.
+*/
+
+/*! \fn void QCPAxis::selectableChanged(const QCPAxis::SelectableParts &parts);
+  
+  This signal is emitted when the selectability changes, by calls to \ref setSelectableParts
+*/
+
+/* end of documentation of signals */
+
+/*!
+  Constructs an Axis instance of Type \a type for the axis rect \a parent.
+  
+  Usually it isn't necessary to instantiate axes directly, because you can let QCustomPlot create
+  them for you with \ref QCPAxisRect::addAxis. If you want to use own QCPAxis-subclasses however,
+  create them manually and then inject them also via \ref QCPAxisRect::addAxis.
+*/
+QCPAxis::QCPAxis(QCPAxisRect *parent, AxisType type) :
+  QCPLayerable(parent->parentPlot(), QString(), parent),
+  // axis base:
+  mAxisType(type),
+  mAxisRect(parent),
+  mPadding(5),
+  mOrientation(orientation(type)),
+  mSelectableParts(spAxis | spTickLabels | spAxisLabel),
+  mSelectedParts(spNone),
+  mBasePen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)),
+  mSelectedBasePen(QPen(Qt::blue, 2)),
+  // axis label:
+  mLabel(),
+  mLabelFont(mParentPlot->font()),
+  mSelectedLabelFont(QFont(mLabelFont.family(), mLabelFont.pointSize(), QFont::Bold)),
+  mLabelColor(Qt::black),
+  mSelectedLabelColor(Qt::blue),
+  // tick labels:
+  mTickLabels(true),
+  mAutoTickLabels(true),
+  mTickLabelType(ltNumber),
+  mTickLabelFont(mParentPlot->font()),
+  mSelectedTickLabelFont(QFont(mTickLabelFont.family(), mTickLabelFont.pointSize(), QFont::Bold)),
+  mTickLabelColor(Qt::black),
+  mSelectedTickLabelColor(Qt::blue),
+  mDateTimeFormat(QLatin1String("hh:mm:ss\ndd.MM.yy")),
+  mDateTimeSpec(Qt::LocalTime),
+  mNumberPrecision(6),
+  mNumberFormatChar('g'),
+  mNumberBeautifulPowers(true),
+  // ticks and subticks:
+  mTicks(true),
+  mTickStep(1),
+  mSubTickCount(4),
+  mAutoTickCount(6),
+  mAutoTicks(true),
+  mAutoTickStep(true),
+  mAutoSubTicks(true),
+  mTickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)),
+  mSelectedTickPen(QPen(Qt::blue, 2)),
+  mSubTickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)),
+  mSelectedSubTickPen(QPen(Qt::blue, 2)),
+  // scale and range:
+  mRange(0, 5),
+  mRangeReversed(false),
+  mScaleType(stLinear),
+  mScaleLogBase(10),
+  mScaleLogBaseLogInv(1.0/qLn(mScaleLogBase)),
+  // internal members:
+  mGrid(new QCPGrid(this)),
+  mAxisPainter(new QCPAxisPainterPrivate(parent->parentPlot())),
+  mLowestVisibleTick(0),
+  mHighestVisibleTick(-1),
+  mCachedMarginValid(false),
+  mCachedMargin(0)
+{
+  setParent(parent);
+  mGrid->setVisible(false);
+  setAntialiased(false);
+  setLayer(mParentPlot->currentLayer()); // it's actually on that layer already, but we want it in front of the grid, so we place it on there again
+  
+  if (type == atTop)
+  {
+    setTickLabelPadding(3);
+    setLabelPadding(6);
+  } else if (type == atRight)
+  {
+    setTickLabelPadding(7);
+    setLabelPadding(12);
+  } else if (type == atBottom)
+  {
+    setTickLabelPadding(3);
+    setLabelPadding(3);
+  } else if (type == atLeft)
+  {
+    setTickLabelPadding(5);
+    setLabelPadding(10);
+  }
+}
+
+QCPAxis::~QCPAxis()
+{
+  delete mAxisPainter;
+  delete mGrid; // delete grid here instead of via parent ~QObject for better defined deletion order
+}
+
+/* No documentation as it is a property getter */
+int QCPAxis::tickLabelPadding() const
+{
+  return mAxisPainter->tickLabelPadding;
+}
+
+/* No documentation as it is a property getter */
+double QCPAxis::tickLabelRotation() const
+{
+  return mAxisPainter->tickLabelRotation;
+}
+
+/* No documentation as it is a property getter */
+QCPAxis::LabelSide QCPAxis::tickLabelSide() const
+{
+  return mAxisPainter->tickLabelSide;
+}
+
+/* No documentation as it is a property getter */
+QString QCPAxis::numberFormat() const
+{
+  QString result;
+  result.append(mNumberFormatChar);
+  if (mNumberBeautifulPowers)
+  {
+    result.append(QLatin1Char('b'));
+    if (mAxisPainter->numberMultiplyCross)
+      result.append(QLatin1Char('c'));
+  }
+  return result;
+}
+
+/* No documentation as it is a property getter */
+int QCPAxis::tickLengthIn() const
+{
+  return mAxisPainter->tickLengthIn;
+}
+
+/* No documentation as it is a property getter */
+int QCPAxis::tickLengthOut() const
+{
+  return mAxisPainter->tickLengthOut;
+}
+
+/* No documentation as it is a property getter */
+int QCPAxis::subTickLengthIn() const
+{
+  return mAxisPainter->subTickLengthIn;
+}
+
+/* No documentation as it is a property getter */
+int QCPAxis::subTickLengthOut() const
+{
+  return mAxisPainter->subTickLengthOut;
+}
+
+/* No documentation as it is a property getter */
+int QCPAxis::labelPadding() const
+{
+  return mAxisPainter->labelPadding;
+}
+
+/* No documentation as it is a property getter */
+int QCPAxis::offset() const
+{
+  return mAxisPainter->offset;
+}
+
+/* No documentation as it is a property getter */
+QCPLineEnding QCPAxis::lowerEnding() const
+{
+  return mAxisPainter->lowerEnding;
+}
+
+/* No documentation as it is a property getter */
+QCPLineEnding QCPAxis::upperEnding() const
+{
+  return mAxisPainter->upperEnding;
+}
+
+/*!
+  Sets whether the axis uses a linear scale or a logarithmic scale. If \a type is set to \ref
+  stLogarithmic, the logarithm base can be set with \ref setScaleLogBase. In logarithmic axis
+  scaling, major tick marks appear at all powers of the logarithm base. Properties like tick step
+  (\ref setTickStep) don't apply in logarithmic scaling. If you wish a decimal base but less major
+  ticks, consider choosing a logarithm base of 100, 1000 or even higher.
+  
+  If \a type is \ref stLogarithmic and the number format (\ref setNumberFormat) uses the 'b' option
+  (beautifully typeset decimal powers), the display usually is "1 [multiplication sign] 10
+  [superscript] n", which looks unnatural for logarithmic scaling (the "1 [multiplication sign]"
+  part). To only display the decimal power, set the number precision to zero with
+  \ref setNumberPrecision.
+*/
+void QCPAxis::setScaleType(QCPAxis::ScaleType type)
+{
+  if (mScaleType != type)
+  {
+    mScaleType = type;
+    if (mScaleType == stLogarithmic)
+      setRange(mRange.sanitizedForLogScale());
+    mCachedMarginValid = false;
+    emit scaleTypeChanged(mScaleType);
+  }
+}
+
+/*!
+  If \ref setScaleType is set to \ref stLogarithmic, \a base will be the logarithm base of the
+  scaling. In logarithmic axis scaling, major tick marks appear at all powers of \a base.
+  
+  Properties like tick step (\ref setTickStep) don't apply in logarithmic scaling. If you wish a decimal base but
+  less major ticks, consider choosing \a base 100, 1000 or even higher.
+*/
+void QCPAxis::setScaleLogBase(double base)
+{
+  if (base > 1)
+  {
+    mScaleLogBase = base;
+    mScaleLogBaseLogInv = 1.0/qLn(mScaleLogBase); // buffer for faster baseLog() calculation
+    mCachedMarginValid = false;
+  } else
+    qDebug() << Q_FUNC_INFO << "Invalid logarithmic scale base (must be greater 1):" << base;
+}
+
+/*!
+  Sets the range of the axis.
+  
+  This slot may be connected with the \ref rangeChanged signal of another axis so this axis
+  is always synchronized with the other axis range, when it changes.
+  
+  To invert the direction of an axis, use \ref setRangeReversed.
+*/
+void QCPAxis::setRange(const QCPRange &range)
+{
+  if (range.lower == mRange.lower && range.upper == mRange.upper)
+    return;
+  
+  if (!QCPRange::validRange(range)) return;
+  QCPRange oldRange = mRange;
+  if (mScaleType == stLogarithmic)
+  {
+    mRange = range.sanitizedForLogScale();
+  } else
+  {
+    mRange = range.sanitizedForLinScale();
+  }
+  mCachedMarginValid = false;
+  emit rangeChanged(mRange);
+  emit rangeChanged(mRange, oldRange);
+}
+
+/*!
+  Sets whether the user can (de-)select the parts in \a selectable by clicking on the QCustomPlot surface.
+  (When \ref QCustomPlot::setInteractions contains iSelectAxes.)
+  
+  However, even when \a selectable is set to a value not allowing the selection of a specific part,
+  it is still possible to set the selection of this part manually, by calling \ref setSelectedParts
+  directly.
+  
+  \see SelectablePart, setSelectedParts
+*/
+void QCPAxis::setSelectableParts(const SelectableParts &selectable)
+{
+  if (mSelectableParts != selectable)
+  {
+    mSelectableParts = selectable;
+    emit selectableChanged(mSelectableParts);
+  }
+}
+
+/*!
+  Sets the selected state of the respective axis parts described by \ref SelectablePart. When a part
+  is selected, it uses a different pen/font.
+  
+  The entire selection mechanism for axes is handled automatically when \ref
+  QCustomPlot::setInteractions contains iSelectAxes. You only need to call this function when you
+  wish to change the selection state manually.
+  
+  This function can change the selection state of a part, independent of the \ref setSelectableParts setting.
+  
+  emits the \ref selectionChanged signal when \a selected is different from the previous selection state.
+  
+  \see SelectablePart, setSelectableParts, selectTest, setSelectedBasePen, setSelectedTickPen, setSelectedSubTickPen,
+  setSelectedTickLabelFont, setSelectedLabelFont, setSelectedTickLabelColor, setSelectedLabelColor
+*/
+void QCPAxis::setSelectedParts(const SelectableParts &selected)
+{
+  if (mSelectedParts != selected)
+  {
+    mSelectedParts = selected;
+    emit selectionChanged(mSelectedParts);
+  }
+}
+
+/*!
+  \overload
+  
+  Sets the lower and upper bound of the axis range.
+  
+  To invert the direction of an axis, use \ref setRangeReversed.
+  
+  There is also a slot to set a range, see \ref setRange(const QCPRange &range).
+*/
+void QCPAxis::setRange(double lower, double upper)
+{
+  if (lower == mRange.lower && upper == mRange.upper)
+    return;
+  
+  if (!QCPRange::validRange(lower, upper)) return;
+  QCPRange oldRange = mRange;
+  mRange.lower = lower;
+  mRange.upper = upper;
+  if (mScaleType == stLogarithmic)
+  {
+    mRange = mRange.sanitizedForLogScale();
+  } else
+  {
+    mRange = mRange.sanitizedForLinScale();
+  }
+  mCachedMarginValid = false;
+  emit rangeChanged(mRange);
+  emit rangeChanged(mRange, oldRange);
+}
+
+/*!
+  \overload
+  
+  Sets the range of the axis.
+  
+  The \a position coordinate indicates together with the \a alignment parameter, where the new
+  range will be positioned. \a size defines the size of the new axis range. \a alignment may be
+  Qt::AlignLeft, Qt::AlignRight or Qt::AlignCenter. This will cause the left border, right border,
+  or center of the range to be aligned with \a position. Any other values of \a alignment will
+  default to Qt::AlignCenter.
+*/
+void QCPAxis::setRange(double position, double size, Qt::AlignmentFlag alignment)
+{
+  if (alignment == Qt::AlignLeft)
+    setRange(position, position+size);
+  else if (alignment == Qt::AlignRight)
+    setRange(position-size, position);
+  else // alignment == Qt::AlignCenter
+    setRange(position-size/2.0, position+size/2.0);
+}
+
+/*!
+  Sets the lower bound of the axis range. The upper bound is not changed.
+  \see setRange
+*/
+void QCPAxis::setRangeLower(double lower)
+{
+  if (mRange.lower == lower)
+    return;
+  
+  QCPRange oldRange = mRange;
+  mRange.lower = lower;
+  if (mScaleType == stLogarithmic)
+  {
+    mRange = mRange.sanitizedForLogScale();
+  } else
+  {
+    mRange = mRange.sanitizedForLinScale();
+  }
+  mCachedMarginValid = false;
+  emit rangeChanged(mRange);
+  emit rangeChanged(mRange, oldRange);
+}
+
+/*!
+  Sets the upper bound of the axis range. The lower bound is not changed.
+  \see setRange
+*/
+void QCPAxis::setRangeUpper(double upper)
+{
+  if (mRange.upper == upper)
+    return;
+  
+  QCPRange oldRange = mRange;
+  mRange.upper = upper;
+  if (mScaleType == stLogarithmic)
+  {
+    mRange = mRange.sanitizedForLogScale();
+  } else
+  {
+    mRange = mRange.sanitizedForLinScale();
+  }
+  mCachedMarginValid = false;
+  emit rangeChanged(mRange);
+  emit rangeChanged(mRange, oldRange);
+}
+
+/*!
+  Sets whether the axis range (direction) is displayed reversed. Normally, the values on horizontal
+  axes increase left to right, on vertical axes bottom to top. When \a reversed is set to true, the
+  direction of increasing values is inverted.
+
+  Note that the range and data interface stays the same for reversed axes, e.g. the \a lower part
+  of the \ref setRange interface will still reference the mathematically smaller number than the \a
+  upper part.
+*/
+void QCPAxis::setRangeReversed(bool reversed)
+{
+  if (mRangeReversed != reversed)
+  {
+    mRangeReversed = reversed;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets whether the tick positions should be calculated automatically (either from an automatically
+  generated tick step or a tick step provided manually via \ref setTickStep, see \ref setAutoTickStep).
+  
+  If \a on is set to false, you must provide the tick positions manually via \ref setTickVector.
+  For these manual ticks you may let QCPAxis generate the appropriate labels automatically by
+  leaving \ref setAutoTickLabels set to true. If you also wish to control the displayed labels
+  manually, set \ref setAutoTickLabels to false and provide the label strings with \ref
+  setTickVectorLabels.
+  
+  If you need dynamically calculated tick vectors (and possibly tick label vectors), set the
+  vectors in a slot connected to the \ref ticksRequest signal.
+  
+  \see setAutoTickLabels, setAutoSubTicks, setAutoTickCount, setAutoTickStep
+*/
+void QCPAxis::setAutoTicks(bool on)
+{
+  if (mAutoTicks != on)
+  {
+    mAutoTicks = on;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  When \ref setAutoTickStep is true, \a approximateCount determines how many ticks should be
+  generated in the visible range, approximately.
+  
+  It's not guaranteed that this number of ticks is met exactly, but approximately within a
+  tolerance of about two.
+  
+  Only values greater than zero are accepted as \a approximateCount.
+  
+  \see setAutoTickStep, setAutoTicks, setAutoSubTicks
+*/
+void QCPAxis::setAutoTickCount(int approximateCount)
+{
+  if (mAutoTickCount != approximateCount)
+  {
+    if (approximateCount > 0)
+    {
+      mAutoTickCount = approximateCount;
+      mCachedMarginValid = false;
+    } else
+      qDebug() << Q_FUNC_INFO << "approximateCount must be greater than zero:" << approximateCount;
+  }
+}
+
+/*!
+  Sets whether the tick labels are generated automatically. Depending on the tick label type (\ref
+  ltNumber or \ref ltDateTime), the labels will either show the coordinate as floating point
+  number (\ref setNumberFormat), or a date/time formatted according to \ref setDateTimeFormat.
+  
+  If \a on is set to false, you should provide the tick labels via \ref setTickVectorLabels. This
+  is usually used in a combination with \ref setAutoTicks set to false for complete control over
+  tick positions and labels, e.g. when the ticks should be at multiples of pi and show "2pi", "3pi"
+  etc. as tick labels.
+  
+  If you need dynamically calculated tick vectors (and possibly tick label vectors), set the
+  vectors in a slot connected to the \ref ticksRequest signal.
+  
+  \see setAutoTicks
+*/
+void QCPAxis::setAutoTickLabels(bool on)
+{
+  if (mAutoTickLabels != on)
+  {
+    mAutoTickLabels = on;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets whether the tick step, i.e. the interval between two (major) ticks, is calculated
+  automatically. If \a on is set to true, the axis finds a tick step that is reasonable for human
+  readable plots.
+
+  The number of ticks the algorithm aims for within the visible range can be specified with \ref
+  setAutoTickCount.
+  
+  If \a on is set to false, you may set the tick step manually with \ref setTickStep.
+  
+  \see setAutoTicks, setAutoSubTicks, setAutoTickCount
+*/
+void QCPAxis::setAutoTickStep(bool on)
+{
+  if (mAutoTickStep != on)
+  {
+    mAutoTickStep = on;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets whether the number of sub ticks in one tick interval is determined automatically. This
+  works, as long as the tick step mantissa is a multiple of 0.5. When \ref setAutoTickStep is
+  enabled, this is always the case.
+  
+  When \a on is set to false, you may set the sub tick count with \ref setSubTickCount manually.
+  
+  \see setAutoTickCount, setAutoTicks, setAutoTickStep
+*/
+void QCPAxis::setAutoSubTicks(bool on)
+{
+  if (mAutoSubTicks != on)
+  {
+    mAutoSubTicks = on;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets whether tick marks are displayed.
+
+  Note that setting \a show to false does not imply that tick labels are invisible, too. To achieve
+  that, see \ref setTickLabels.
+*/
+void QCPAxis::setTicks(bool show)
+{
+  if (mTicks != show)
+  {
+    mTicks = show;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets whether tick labels are displayed. Tick labels are the numbers drawn next to tick marks.
+*/
+void QCPAxis::setTickLabels(bool show)
+{
+  if (mTickLabels != show)
+  {
+    mTickLabels = show;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the distance between the axis base line (including any outward ticks) and the tick labels.
+  \see setLabelPadding, setPadding
+*/
+void QCPAxis::setTickLabelPadding(int padding)
+{
+  if (mAxisPainter->tickLabelPadding != padding)
+  {
+    mAxisPainter->tickLabelPadding = padding;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets whether the tick labels display numbers or dates/times.
+  
+  If \a type is set to \ref ltNumber, the format specifications of \ref setNumberFormat apply.
+  
+  If \a type is set to \ref ltDateTime, the format specifications of \ref setDateTimeFormat apply.
+  
+  In QCustomPlot, date/time coordinates are <tt>double</tt> numbers representing the seconds since
+  1970-01-01T00:00:00 UTC. This format can be retrieved from QDateTime objects with the
+  QDateTime::toTime_t() function. Since this only gives a resolution of one second, there is also
+  the QDateTime::toMSecsSinceEpoch() function which returns the timespan described above in
+  milliseconds. Divide its return value by 1000.0 to get a value with the format needed for
+  date/time plotting, with a resolution of one millisecond.
+  
+  Using the toMSecsSinceEpoch function allows dates that go back to 2nd January 4713 B.C.
+  (represented by a negative number), unlike the toTime_t function, which works with unsigned
+  integers and thus only goes back to 1st January 1970. So both for range and accuracy, use of
+  toMSecsSinceEpoch()/1000.0 should be preferred as key coordinate for date/time axes.
+  
+  \see setTickLabels
+*/
+void QCPAxis::setTickLabelType(LabelType type)
+{
+  if (mTickLabelType != type)
+  {
+    mTickLabelType = type;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the font of the tick labels.
+  
+  \see setTickLabels, setTickLabelColor
+*/
+void QCPAxis::setTickLabelFont(const QFont &font)
+{
+  if (font != mTickLabelFont)
+  {
+    mTickLabelFont = font;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the color of the tick labels.
+  
+  \see setTickLabels, setTickLabelFont
+*/
+void QCPAxis::setTickLabelColor(const QColor &color)
+{
+  if (color != mTickLabelColor)
+  {
+    mTickLabelColor = color;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the rotation of the tick labels. If \a degrees is zero, the labels are drawn normally. Else,
+  the tick labels are drawn rotated by \a degrees clockwise. The specified angle is bound to values
+  from -90 to 90 degrees.
+  
+  If \a degrees is exactly -90, 0 or 90, the tick labels are centered on the tick coordinate. For
+  other angles, the label is drawn with an offset such that it seems to point toward or away from
+  the tick mark.
+*/
+void QCPAxis::setTickLabelRotation(double degrees)
+{
+  if (!qFuzzyIsNull(degrees-mAxisPainter->tickLabelRotation))
+  {
+    mAxisPainter->tickLabelRotation = qBound(-90.0, degrees, 90.0);
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets whether the tick labels (numbers) shall appear inside or outside the axis rect.
+  
+  The usual and default setting is \ref lsOutside. Very compact plots sometimes require tick labels
+  to be inside the axis rect, to save space. If \a side is set to \ref lsInside, the tick labels
+  appear on the inside are additionally clipped to the axis rect.
+*/
+void QCPAxis::setTickLabelSide(LabelSide side)
+{
+  mAxisPainter->tickLabelSide = side;
+  mCachedMarginValid = false;
+}
+
+/*!
+  Sets the format in which dates and times are displayed as tick labels, if \ref setTickLabelType is \ref ltDateTime.
+  for details about the \a format string, see the documentation of QDateTime::toString().
+  
+  Newlines can be inserted with "\n".
+  
+  \see setDateTimeSpec
+*/
+void QCPAxis::setDateTimeFormat(const QString &format)
+{
+  if (mDateTimeFormat != format)
+  {
+    mDateTimeFormat = format;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the time spec that is used for the date time values when \ref setTickLabelType is \ref
+  ltDateTime.
+
+  The default value of QDateTime objects (and also QCustomPlot) is <tt>Qt::LocalTime</tt>. However,
+  if the date time values passed to QCustomPlot are given in the UTC spec, set \a
+  timeSpec to <tt>Qt::UTC</tt> to get the correct axis labels.
+  
+  \see setDateTimeFormat
+*/
+void QCPAxis::setDateTimeSpec(const Qt::TimeSpec &timeSpec)
+{
+  mDateTimeSpec = timeSpec;
+}
+
+/*!
+  Sets the number format for the numbers drawn as tick labels (if tick label type is \ref
+  ltNumber). This \a formatCode is an extended version of the format code used e.g. by
+  QString::number() and QLocale::toString(). For reference about that, see the "Argument Formats"
+  section in the detailed description of the QString class. \a formatCode is a string of one, two
+  or three characters. The first character is identical to the normal format code used by Qt. In
+  short, this means: 'e'/'E' scientific format, 'f' fixed format, 'g'/'G' scientific or fixed,
+  whichever is shorter.
+  
+  The second and third characters are optional and specific to QCustomPlot:\n
+  If the first char was 'e' or 'g', numbers are/might be displayed in the scientific format, e.g.
+  "5.5e9", which is ugly in a plot. So when the second char of \a formatCode is set to 'b' (for
+  "beautiful"), those exponential numbers are formatted in a more natural way, i.e. "5.5
+  [multiplication sign] 10 [superscript] 9". By default, the multiplication sign is a centered dot.
+  If instead a cross should be shown (as is usual in the USA), the third char of \a formatCode can
+  be set to 'c'. The inserted multiplication signs are the UTF-8 characters 215 (0xD7) for the
+  cross and 183 (0xB7) for the dot.
+  
+  If the scale type (\ref setScaleType) is \ref stLogarithmic and the \a formatCode uses the 'b'
+  option (beautifully typeset decimal powers), the display usually is "1 [multiplication sign] 10
+  [superscript] n", which looks unnatural for logarithmic scaling (the "1 [multiplication sign]"
+  part). To only display the decimal power, set the number precision to zero with \ref
+  setNumberPrecision.
+  
+  Examples for \a formatCode:
+  \li \c g normal format code behaviour. If number is small, fixed format is used, if number is large,
+  normal scientific format is used
+  \li \c gb If number is small, fixed format is used, if number is large, scientific format is used with
+  beautifully typeset decimal powers and a dot as multiplication sign
+  \li \c ebc All numbers are in scientific format with beautifully typeset decimal power and a cross as
+  multiplication sign
+  \li \c fb illegal format code, since fixed format doesn't support (or need) beautifully typeset decimal
+  powers. Format code will be reduced to 'f'.
+  \li \c hello illegal format code, since first char is not 'e', 'E', 'f', 'g' or 'G'. Current format
+  code will not be changed.
+*/
+void QCPAxis::setNumberFormat(const QString &formatCode)
+{
+  if (formatCode.isEmpty())
+  {
+    qDebug() << Q_FUNC_INFO << "Passed formatCode is empty";
+    return;
+  }
+  mCachedMarginValid = false;
+  
+  // interpret first char as number format char:
+  QString allowedFormatChars(QLatin1String("eEfgG"));
+  if (allowedFormatChars.contains(formatCode.at(0)))
+  {
+    mNumberFormatChar = QLatin1Char(formatCode.at(0).toLatin1());
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "Invalid number format code (first char not in 'eEfgG'):" << formatCode;
+    return;
+  }
+  if (formatCode.length() < 2)
+  {
+    mNumberBeautifulPowers = false;
+    mAxisPainter->numberMultiplyCross = false;
+    return;
+  }
+  
+  // interpret second char as indicator for beautiful decimal powers:
+  if (formatCode.at(1) == QLatin1Char('b') && (mNumberFormatChar == QLatin1Char('e') || mNumberFormatChar == QLatin1Char('g')))
+  {
+    mNumberBeautifulPowers = true;
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "Invalid number format code (second char not 'b' or first char neither 'e' nor 'g'):" << formatCode;
+    return;
+  }
+  if (formatCode.length() < 3)
+  {
+    mAxisPainter->numberMultiplyCross = false;
+    return;
+  }
+  
+  // interpret third char as indicator for dot or cross multiplication symbol:
+  if (formatCode.at(2) == QLatin1Char('c'))
+  {
+    mAxisPainter->numberMultiplyCross = true;
+  } else if (formatCode.at(2) == QLatin1Char('d'))
+  {
+    mAxisPainter->numberMultiplyCross = false;
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "Invalid number format code (third char neither 'c' nor 'd'):" << formatCode;
+    return;
+  }
+}
+
+/*!
+  Sets the precision of the tick label numbers. See QLocale::toString(double i, char f, int prec)
+  for details. The effect of precisions are most notably for number Formats starting with 'e', see
+  \ref setNumberFormat
+
+  If the scale type (\ref setScaleType) is \ref stLogarithmic and the number format (\ref
+  setNumberFormat) uses the 'b' format code (beautifully typeset decimal powers), the display
+  usually is "1 [multiplication sign] 10 [superscript] n", which looks unnatural for logarithmic
+  scaling (the redundant "1 [multiplication sign]" part). To only display the decimal power "10
+  [superscript] n", set \a precision to zero.
+*/
+void QCPAxis::setNumberPrecision(int precision)
+{
+  if (mNumberPrecision != precision)
+  {
+    mNumberPrecision = precision;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  If \ref setAutoTickStep is set to false, use this function to set the tick step manually.
+  The tick step is the interval between (major) ticks, in plot coordinates.
+  \see setSubTickCount
+*/
+void QCPAxis::setTickStep(double step)
+{
+  if (mTickStep != step)
+  {
+    mTickStep = step;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  If you want full control over what ticks (and possibly labels) the axes show, this function is
+  used to set the coordinates at which ticks will appear.\ref setAutoTicks must be disabled, else
+  the provided tick vector will be overwritten with automatically generated tick coordinates upon
+  replot. The labels of the ticks can be generated automatically when \ref setAutoTickLabels is
+  left enabled. If it is disabled, you can set the labels manually with \ref setTickVectorLabels.
+  
+  \a vec is a vector containing the positions of the ticks, in plot coordinates.
+  
+  \warning \a vec must be sorted in ascending order, no additional checks are made to ensure this.
+
+  \see setTickVectorLabels
+*/
+void QCPAxis::setTickVector(const QVector<double> &vec)
+{
+  // don't check whether mTickVector != vec here, because it takes longer than we would save
+  mTickVector = vec;
+  mCachedMarginValid = false;
+}
+
+/*!
+  If you want full control over what ticks and labels the axes show, this function is used to set a
+  number of QStrings that will be displayed at the tick positions which you need to provide with
+  \ref setTickVector. These two vectors should have the same size. (Note that you need to disable
+  \ref setAutoTicks and \ref setAutoTickLabels first.)
+  
+  \a vec is a vector containing the labels of the ticks. The entries correspond to the respective
+  indices in the tick vector, passed via \ref setTickVector.
+  
+  \see setTickVector
+*/
+void QCPAxis::setTickVectorLabels(const QVector<QString> &vec)
+{
+  // don't check whether mTickVectorLabels != vec here, because it takes longer than we would save
+  mTickVectorLabels = vec;
+  mCachedMarginValid = false;
+}
+
+/*!
+  Sets the length of the ticks in pixels. \a inside is the length the ticks will reach inside the
+  plot and \a outside is the length they will reach outside the plot. If \a outside is greater than
+  zero, the tick labels and axis label will increase their distance to the axis accordingly, so
+  they won't collide with the ticks.
+  
+  \see setSubTickLength, setTickLengthIn, setTickLengthOut
+*/
+void QCPAxis::setTickLength(int inside, int outside)
+{
+  setTickLengthIn(inside);
+  setTickLengthOut(outside);
+}
+
+/*!
+  Sets the length of the inward ticks in pixels. \a inside is the length the ticks will reach
+  inside the plot.
+  
+  \see setTickLengthOut, setTickLength, setSubTickLength
+*/
+void QCPAxis::setTickLengthIn(int inside)
+{
+  if (mAxisPainter->tickLengthIn != inside)
+  {
+    mAxisPainter->tickLengthIn = inside;
+  }
+}
+
+/*!
+  Sets the length of the outward ticks in pixels. \a outside is the length the ticks will reach
+  outside the plot. If \a outside is greater than zero, the tick labels and axis label will
+  increase their distance to the axis accordingly, so they won't collide with the ticks.
+  
+  \see setTickLengthIn, setTickLength, setSubTickLength
+*/
+void QCPAxis::setTickLengthOut(int outside)
+{
+  if (mAxisPainter->tickLengthOut != outside)
+  {
+    mAxisPainter->tickLengthOut = outside;
+    mCachedMarginValid = false; // only outside tick length can change margin
+  }
+}
+
+/*!
+  Sets the number of sub ticks in one (major) tick step. A sub tick count of three for example,
+  divides the tick intervals in four sub intervals.
+  
+  By default, the number of sub ticks is chosen automatically in a reasonable manner as long as the
+  mantissa of the tick step is a multiple of 0.5. When \ref setAutoTickStep is enabled, this is
+  always the case.
+
+  If you want to disable automatic sub tick count and use this function to set the count manually,
+  see \ref setAutoSubTicks.
+*/
+void QCPAxis::setSubTickCount(int count)
+{
+  mSubTickCount = count;
+}
+
+/*!
+  Sets the length of the subticks in pixels. \a inside is the length the subticks will reach inside
+  the plot and \a outside is the length they will reach outside the plot. If \a outside is greater
+  than zero, the tick labels and axis label will increase their distance to the axis accordingly,
+  so they won't collide with the ticks.
+  
+  \see setTickLength, setSubTickLengthIn, setSubTickLengthOut
+*/
+void QCPAxis::setSubTickLength(int inside, int outside)
+{
+  setSubTickLengthIn(inside);
+  setSubTickLengthOut(outside);
+}
+
+/*!
+  Sets the length of the inward subticks in pixels. \a inside is the length the subticks will reach inside
+  the plot.
+  
+  \see setSubTickLengthOut, setSubTickLength, setTickLength
+*/
+void QCPAxis::setSubTickLengthIn(int inside)
+{
+  if (mAxisPainter->subTickLengthIn != inside)
+  {
+    mAxisPainter->subTickLengthIn = inside;
+  }
+}
+
+/*!
+  Sets the length of the outward subticks in pixels. \a outside is the length the subticks will reach
+  outside the plot. If \a outside is greater than zero, the tick labels will increase their
+  distance to the axis accordingly, so they won't collide with the ticks.
+  
+  \see setSubTickLengthIn, setSubTickLength, setTickLength
+*/
+void QCPAxis::setSubTickLengthOut(int outside)
+{
+  if (mAxisPainter->subTickLengthOut != outside)
+  {
+    mAxisPainter->subTickLengthOut = outside;
+    mCachedMarginValid = false; // only outside tick length can change margin
+  }
+}
+
+/*!
+  Sets the pen, the axis base line is drawn with.
+  
+  \see setTickPen, setSubTickPen
+*/
+void QCPAxis::setBasePen(const QPen &pen)
+{
+  mBasePen = pen;
+}
+
+/*!
+  Sets the pen, tick marks will be drawn with.
+  
+  \see setTickLength, setBasePen
+*/
+void QCPAxis::setTickPen(const QPen &pen)
+{
+  mTickPen = pen;
+}
+
+/*!
+  Sets the pen, subtick marks will be drawn with.
+  
+  \see setSubTickCount, setSubTickLength, setBasePen
+*/
+void QCPAxis::setSubTickPen(const QPen &pen)
+{
+  mSubTickPen = pen;
+}
+
+/*!
+  Sets the font of the axis label.
+  
+  \see setLabelColor
+*/
+void QCPAxis::setLabelFont(const QFont &font)
+{
+  if (mLabelFont != font)
+  {
+    mLabelFont = font;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the color of the axis label.
+  
+  \see setLabelFont
+*/
+void QCPAxis::setLabelColor(const QColor &color)
+{
+  mLabelColor = color;
+}
+
+/*!
+  Sets the text of the axis label that will be shown below/above or next to the axis, depending on
+  its orientation. To disable axis labels, pass an empty string as \a str.
+*/
+void QCPAxis::setLabel(const QString &str)
+{
+  if (mLabel != str)
+  {
+    mLabel = str;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the distance between the tick labels and the axis label.
+  
+  \see setTickLabelPadding, setPadding
+*/
+void QCPAxis::setLabelPadding(int padding)
+{
+  if (mAxisPainter->labelPadding != padding)
+  {
+    mAxisPainter->labelPadding = padding;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the padding of the axis.
+
+  When \ref QCPAxisRect::setAutoMargins is enabled, the padding is the additional outer most space,
+  that is left blank.
+  
+  The axis padding has no meaning if \ref QCPAxisRect::setAutoMargins is disabled.
+  
+  \see setLabelPadding, setTickLabelPadding
+*/
+void QCPAxis::setPadding(int padding)
+{
+  if (mPadding != padding)
+  {
+    mPadding = padding;
+    mCachedMarginValid = false;
+  }
+}
+
+/*!
+  Sets the offset the axis has to its axis rect side.
+  
+  If an axis rect side has multiple axes and automatic margin calculation is enabled for that side,
+  only the offset of the inner most axis has meaning (even if it is set to be invisible). The
+  offset of the other, outer axes is controlled automatically, to place them at appropriate
+  positions.
+*/
+void QCPAxis::setOffset(int offset)
+{
+  mAxisPainter->offset = offset;
+}
+
+/*!
+  Sets the font that is used for tick labels when they are selected.
+  
+  \see setTickLabelFont, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAxis::setSelectedTickLabelFont(const QFont &font)
+{
+  if (font != mSelectedTickLabelFont)
+  {
+    mSelectedTickLabelFont = font;
+    // don't set mCachedMarginValid to false here because margin calculation is always done with non-selected fonts
+  }
+}
+
+/*!
+  Sets the font that is used for the axis label when it is selected.
+  
+  \see setLabelFont, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAxis::setSelectedLabelFont(const QFont &font)
+{
+  mSelectedLabelFont = font;
+  // don't set mCachedMarginValid to false here because margin calculation is always done with non-selected fonts
+}
+
+/*!
+  Sets the color that is used for tick labels when they are selected.
+  
+  \see setTickLabelColor, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAxis::setSelectedTickLabelColor(const QColor &color)
+{
+  if (color != mSelectedTickLabelColor)
+  {
+    mSelectedTickLabelColor = color;
+  }
+}
+
+/*!
+  Sets the color that is used for the axis label when it is selected.
+  
+  \see setLabelColor, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAxis::setSelectedLabelColor(const QColor &color)
+{
+  mSelectedLabelColor = color;
+}
+
+/*!
+  Sets the pen that is used to draw the axis base line when selected.
+  
+  \see setBasePen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAxis::setSelectedBasePen(const QPen &pen)
+{
+  mSelectedBasePen = pen;
+}
+
+/*!
+  Sets the pen that is used to draw the (major) ticks when selected.
+  
+  \see setTickPen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAxis::setSelectedTickPen(const QPen &pen)
+{
+  mSelectedTickPen = pen;
+}
+
+/*!
+  Sets the pen that is used to draw the subticks when selected.
+  
+  \see setSubTickPen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAxis::setSelectedSubTickPen(const QPen &pen)
+{
+  mSelectedSubTickPen = pen;
+}
+
+/*!
+  Sets the style for the lower axis ending. See the documentation of QCPLineEnding for available
+  styles.
+  
+  For horizontal axes, this method refers to the left ending, for vertical axes the bottom ending.
+  Note that this meaning does not change when the axis range is reversed with \ref
+  setRangeReversed.
+  
+  \see setUpperEnding
+*/
+void QCPAxis::setLowerEnding(const QCPLineEnding &ending)
+{
+  mAxisPainter->lowerEnding = ending;
+}
+
+/*!
+  Sets the style for the upper axis ending. See the documentation of QCPLineEnding for available
+  styles.
+  
+  For horizontal axes, this method refers to the right ending, for vertical axes the top ending.
+  Note that this meaning does not change when the axis range is reversed with \ref
+  setRangeReversed.
+  
+  \see setLowerEnding
+*/
+void QCPAxis::setUpperEnding(const QCPLineEnding &ending)
+{
+  mAxisPainter->upperEnding = ending;
+}
+
+/*!
+  If the scale type (\ref setScaleType) is \ref stLinear, \a diff is added to the lower and upper
+  bounds of the range. The range is simply moved by \a diff.
+  
+  If the scale type is \ref stLogarithmic, the range bounds are multiplied by \a diff. This
+  corresponds to an apparent "linear" move in logarithmic scaling by a distance of log(diff).
+*/
+void QCPAxis::moveRange(double diff)
+{
+  QCPRange oldRange = mRange;
+  if (mScaleType == stLinear)
+  {
+    mRange.lower += diff;
+    mRange.upper += diff;
+  } else // mScaleType == stLogarithmic
+  {
+    mRange.lower *= diff;
+    mRange.upper *= diff;
+  }
+  mCachedMarginValid = false;
+  emit rangeChanged(mRange);
+  emit rangeChanged(mRange, oldRange);
+}
+
+/*!
+  Scales the range of this axis by \a factor around the coordinate \a center. For example, if \a
+  factor is 2.0, \a center is 1.0, then the axis range will double its size, and the point at
+  coordinate 1.0 won't have changed its position in the QCustomPlot widget (i.e. coordinates
+  around 1.0 will have moved symmetrically closer to 1.0).
+*/
+void QCPAxis::scaleRange(double factor, double center)
+{
+  QCPRange oldRange = mRange;
+  if (mScaleType == stLinear)
+  {
+    QCPRange newRange;
+    newRange.lower = (mRange.lower-center)*factor + center;
+    newRange.upper = (mRange.upper-center)*factor + center;
+    if (QCPRange::validRange(newRange))
+      mRange = newRange.sanitizedForLinScale();
+  } else // mScaleType == stLogarithmic
+  {
+    if ((mRange.upper < 0 && center < 0) || (mRange.upper > 0 && center > 0)) // make sure center has same sign as range
+    {
+      QCPRange newRange;
+      newRange.lower = qPow(mRange.lower/center, factor)*center;
+      newRange.upper = qPow(mRange.upper/center, factor)*center;
+      if (QCPRange::validRange(newRange))
+        mRange = newRange.sanitizedForLogScale();
+    } else
+      qDebug() << Q_FUNC_INFO << "Center of scaling operation doesn't lie in same logarithmic sign domain as range:" << center;
+  }
+  mCachedMarginValid = false;
+  emit rangeChanged(mRange);
+  emit rangeChanged(mRange, oldRange);
+}
+
+/*!
+  Scales the range of this axis to have a certain scale \a ratio to \a otherAxis. The scaling will
+  be done around the center of the current axis range.
+
+  For example, if \a ratio is 1, this axis is the \a yAxis and \a otherAxis is \a xAxis, graphs
+  plotted with those axes will appear in a 1:1 aspect ratio, independent of the aspect ratio the
+  axis rect has.
+
+  This is an operation that changes the range of this axis once, it doesn't fix the scale ratio
+  indefinitely. Note that calling this function in the constructor of the QCustomPlot's parent
+  won't have the desired effect, since the widget dimensions aren't defined yet, and a resizeEvent
+  will follow.
+*/
+void QCPAxis::setScaleRatio(const QCPAxis *otherAxis, double ratio)
+{
+  int otherPixelSize, ownPixelSize;
+  
+  if (otherAxis->orientation() == Qt::Horizontal)
+    otherPixelSize = otherAxis->axisRect()->width();
+  else
+    otherPixelSize = otherAxis->axisRect()->height();
+  
+  if (orientation() == Qt::Horizontal)
+    ownPixelSize = axisRect()->width();
+  else
+    ownPixelSize = axisRect()->height();
+  
+  double newRangeSize = ratio*otherAxis->range().size()*ownPixelSize/(double)otherPixelSize;
+  setRange(range().center(), newRangeSize, Qt::AlignCenter);
+}
+
+/*!
+  Changes the axis range such that all plottables associated with this axis are fully visible in
+  that dimension.
+  
+  \see QCPAbstractPlottable::rescaleAxes, QCustomPlot::rescaleAxes
+*/
+void QCPAxis::rescale(bool onlyVisiblePlottables)
+{
+  QList<QCPAbstractPlottable*> p = plottables();
+  QCPRange newRange;
+  bool haveRange = false;
+  for (int i=0; i<p.size(); ++i)
+  {
+    if (!p.at(i)->realVisibility() && onlyVisiblePlottables)
+      continue;
+    QCPRange plottableRange;
+    bool currentFoundRange;
+    QCPAbstractPlottable::SignDomain signDomain = QCPAbstractPlottable::sdBoth;
+    if (mScaleType == stLogarithmic)
+      signDomain = (mRange.upper < 0 ? QCPAbstractPlottable::sdNegative : QCPAbstractPlottable::sdPositive);
+    if (p.at(i)->keyAxis() == this)
+      plottableRange = p.at(i)->getKeyRange(currentFoundRange, signDomain);
+    else
+      plottableRange = p.at(i)->getValueRange(currentFoundRange, signDomain);
+    if (currentFoundRange)
+    {
+      if (!haveRange)
+        newRange = plottableRange;
+      else
+        newRange.expand(plottableRange);
+      haveRange = true;
+    }
+  }
+  if (haveRange)
+  {
+    if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this axis dimension), shift current range to at least center the plottable
+    {
+      double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason
+      if (mScaleType == stLinear)
+      {
+        newRange.lower = center-mRange.size()/2.0;
+        newRange.upper = center+mRange.size()/2.0;
+      } else // mScaleType == stLogarithmic
+      {
+        newRange.lower = center/qSqrt(mRange.upper/mRange.lower);
+        newRange.upper = center*qSqrt(mRange.upper/mRange.lower);
+      }
+    }
+    setRange(newRange);
+  }
+}
+
+/*!
+  Transforms \a value, in pixel coordinates of the QCustomPlot widget, to axis coordinates.
+*/
+double QCPAxis::pixelToCoord(double value) const
+{
+  if (orientation() == Qt::Horizontal)
+  {
+    if (mScaleType == stLinear)
+    {
+      if (!mRangeReversed)
+        return (value-mAxisRect->left())/(double)mAxisRect->width()*mRange.size()+mRange.lower;
+      else
+        return -(value-mAxisRect->left())/(double)mAxisRect->width()*mRange.size()+mRange.upper;
+    } else // mScaleType == stLogarithmic
+    {
+      if (!mRangeReversed)
+        return qPow(mRange.upper/mRange.lower, (value-mAxisRect->left())/(double)mAxisRect->width())*mRange.lower;
+      else
+        return qPow(mRange.upper/mRange.lower, (mAxisRect->left()-value)/(double)mAxisRect->width())*mRange.upper;
+    }
+  } else // orientation() == Qt::Vertical
+  {
+    if (mScaleType == stLinear)
+    {
+      if (!mRangeReversed)
+        return (mAxisRect->bottom()-value)/(double)mAxisRect->height()*mRange.size()+mRange.lower;
+      else
+        return -(mAxisRect->bottom()-value)/(double)mAxisRect->height()*mRange.size()+mRange.upper;
+    } else // mScaleType == stLogarithmic
+    {
+      if (!mRangeReversed)
+        return qPow(mRange.upper/mRange.lower, (mAxisRect->bottom()-value)/(double)mAxisRect->height())*mRange.lower;
+      else
+        return qPow(mRange.upper/mRange.lower, (value-mAxisRect->bottom())/(double)mAxisRect->height())*mRange.upper;
+    }
+  }
+}
+
+/*!
+  Transforms \a value, in coordinates of the axis, to pixel coordinates of the QCustomPlot widget.
+*/
+double QCPAxis::coordToPixel(double value) const
+{
+  if (orientation() == Qt::Horizontal)
+  {
+    if (mScaleType == stLinear)
+    {
+      if (!mRangeReversed)
+        return (value-mRange.lower)/mRange.size()*mAxisRect->width()+mAxisRect->left();
+      else
+        return (mRange.upper-value)/mRange.size()*mAxisRect->width()+mAxisRect->left();
+    } else // mScaleType == stLogarithmic
+    {
+      if (value >= 0 && mRange.upper < 0) // invalid value for logarithmic scale, just draw it outside visible range
+        return !mRangeReversed ? mAxisRect->right()+200 : mAxisRect->left()-200;
+      else if (value <= 0 && mRange.upper > 0) // invalid value for logarithmic scale, just draw it outside visible range
+        return !mRangeReversed ? mAxisRect->left()-200 : mAxisRect->right()+200;
+      else
+      {
+        if (!mRangeReversed)
+          return baseLog(value/mRange.lower)/baseLog(mRange.upper/mRange.lower)*mAxisRect->width()+mAxisRect->left();
+        else
+          return baseLog(mRange.upper/value)/baseLog(mRange.upper/mRange.lower)*mAxisRect->width()+mAxisRect->left();
+      }
+    }
+  } else // orientation() == Qt::Vertical
+  {
+    if (mScaleType == stLinear)
+    {
+      if (!mRangeReversed)
+        return mAxisRect->bottom()-(value-mRange.lower)/mRange.size()*mAxisRect->height();
+      else
+        return mAxisRect->bottom()-(mRange.upper-value)/mRange.size()*mAxisRect->height();
+    } else // mScaleType == stLogarithmic
+    {
+      if (value >= 0 && mRange.upper < 0) // invalid value for logarithmic scale, just draw it outside visible range
+        return !mRangeReversed ? mAxisRect->top()-200 : mAxisRect->bottom()+200;
+      else if (value <= 0 && mRange.upper > 0) // invalid value for logarithmic scale, just draw it outside visible range
+        return !mRangeReversed ? mAxisRect->bottom()+200 : mAxisRect->top()-200;
+      else
+      {
+        if (!mRangeReversed)
+          return mAxisRect->bottom()-baseLog(value/mRange.lower)/baseLog(mRange.upper/mRange.lower)*mAxisRect->height();
+        else
+          return mAxisRect->bottom()-baseLog(mRange.upper/value)/baseLog(mRange.upper/mRange.lower)*mAxisRect->height();
+      }
+    }
+  }
+}
+
+/*!
+  Returns the part of the axis that is hit by \a pos (in pixels). The return value of this function
+  is independent of the user-selectable parts defined with \ref setSelectableParts. Further, this
+  function does not change the current selection state of the axis.
+  
+  If the axis is not visible (\ref setVisible), this function always returns \ref spNone.
+  
+  \see setSelectedParts, setSelectableParts, QCustomPlot::setInteractions
+*/
+QCPAxis::SelectablePart QCPAxis::getPartAt(const QPointF &pos) const
+{
+  if (!mVisible)
+    return spNone;
+  
+  if (mAxisPainter->axisSelectionBox().contains(pos.toPoint()))
+    return spAxis;
+  else if (mAxisPainter->tickLabelsSelectionBox().contains(pos.toPoint()))
+    return spTickLabels;
+  else if (mAxisPainter->labelSelectionBox().contains(pos.toPoint()))
+    return spAxisLabel;
+  else
+    return spNone;
+}
+
+/* inherits documentation from base class */
+double QCPAxis::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  if (!mParentPlot) return -1;
+  SelectablePart part = getPartAt(pos);
+  if ((onlySelectable && !mSelectableParts.testFlag(part)) || part == spNone)
+    return -1;
+  
+  if (details)
+    details->setValue(part);
+  return mParentPlot->selectionTolerance()*0.99;
+}
+
+/*!
+  Returns a list of all the plottables that have this axis as key or value axis.
+  
+  If you are only interested in plottables of type QCPGraph, see \ref graphs.
+  
+  \see graphs, items
+*/
+QList<QCPAbstractPlottable*> QCPAxis::plottables() const
+{
+  QList<QCPAbstractPlottable*> result;
+  if (!mParentPlot) return result;
+  
+  for (int i=0; i<mParentPlot->mPlottables.size(); ++i)
+  {
+    if (mParentPlot->mPlottables.at(i)->keyAxis() == this ||mParentPlot->mPlottables.at(i)->valueAxis() == this)
+      result.append(mParentPlot->mPlottables.at(i));
+  }
+  return result;
+}
+
+/*!
+  Returns a list of all the graphs that have this axis as key or value axis.
+  
+  \see plottables, items
+*/
+QList<QCPGraph*> QCPAxis::graphs() const
+{
+  QList<QCPGraph*> result;
+  if (!mParentPlot) return result;
+  
+  for (int i=0; i<mParentPlot->mGraphs.size(); ++i)
+  {
+    if (mParentPlot->mGraphs.at(i)->keyAxis() == this || mParentPlot->mGraphs.at(i)->valueAxis() == this)
+      result.append(mParentPlot->mGraphs.at(i));
+  }
+  return result;
+}
+
+/*!
+  Returns a list of all the items that are associated with this axis. An item is considered
+  associated with an axis if at least one of its positions uses the axis as key or value axis.
+  
+  \see plottables, graphs
+*/
+QList<QCPAbstractItem*> QCPAxis::items() const
+{
+  QList<QCPAbstractItem*> result;
+  if (!mParentPlot) return result;
+  
+  for (int itemId=0; itemId<mParentPlot->mItems.size(); ++itemId)
+  {
+    QList<QCPItemPosition*> positions = mParentPlot->mItems.at(itemId)->positions();
+    for (int posId=0; posId<positions.size(); ++posId)
+    {
+      if (positions.at(posId)->keyAxis() == this || positions.at(posId)->valueAxis() == this)
+      {
+        result.append(mParentPlot->mItems.at(itemId));
+        break;
+      }
+    }
+  }
+  return result;
+}
+
+/*!
+  Transforms a margin side to the logically corresponding axis type. (QCP::msLeft to
+  QCPAxis::atLeft, QCP::msRight to QCPAxis::atRight, etc.)
+*/
+QCPAxis::AxisType QCPAxis::marginSideToAxisType(QCP::MarginSide side)
+{
+  switch (side)
+  {
+    case QCP::msLeft: return atLeft;
+    case QCP::msRight: return atRight;
+    case QCP::msTop: return atTop;
+    case QCP::msBottom: return atBottom;
+    default: break;
+  }
+  qDebug() << Q_FUNC_INFO << "Invalid margin side passed:" << (int)side;
+  return atLeft;
+}
+
+/*!
+  Returns the axis type that describes the opposite axis of an axis with the specified \a type.
+*/
+QCPAxis::AxisType QCPAxis::opposite(QCPAxis::AxisType type)
+{
+  switch (type)
+  {
+    case atLeft: return atRight; break;
+    case atRight: return atLeft; break;
+    case atBottom: return atTop; break;
+    case atTop: return atBottom; break;
+    default: qDebug() << Q_FUNC_INFO << "invalid axis type"; return atLeft; break;
+  }
+}
+
+/*! \internal
+  
+  This function is called to prepare the tick vector, sub tick vector and tick label vector. If
+  \ref setAutoTicks is set to true, appropriate tick values are determined automatically via \ref
+  generateAutoTicks. If it's set to false, the signal ticksRequest is emitted, which can be used to
+  provide external tick positions. Then the sub tick vectors and tick label vectors are created.
+*/
+void QCPAxis::setupTickVectors()
+{
+  if (!mParentPlot) return;
+  if ((!mTicks && !mTickLabels && !mGrid->visible()) || mRange.size() <= 0) return;
+  
+  // fill tick vectors, either by auto generating or by notifying user to fill the vectors himself
+  if (mAutoTicks)
+  {
+    generateAutoTicks();
+  } else
+  {
+    emit ticksRequest();
+  }
+  
+  visibleTickBounds(mLowestVisibleTick, mHighestVisibleTick);
+  if (mTickVector.isEmpty())
+  {
+    mSubTickVector.clear();
+    return;
+  }
+  
+  // generate subticks between ticks:
+  mSubTickVector.resize((mTickVector.size()-1)*mSubTickCount);
+  if (mSubTickCount > 0)
+  {
+    double subTickStep = 0;
+    double subTickPosition = 0;
+    int subTickIndex = 0;
+    bool done = false;
+    int lowTick = mLowestVisibleTick > 0 ? mLowestVisibleTick-1 : mLowestVisibleTick;
+    int highTick = mHighestVisibleTick < mTickVector.size()-1 ? mHighestVisibleTick+1 : mHighestVisibleTick;
+    for (int i=lowTick+1; i<=highTick; ++i)
+    {
+      subTickStep = (mTickVector.at(i)-mTickVector.at(i-1))/(double)(mSubTickCount+1);
+      for (int k=1; k<=mSubTickCount; ++k)
+      {
+        subTickPosition = mTickVector.at(i-1) + k*subTickStep;
+        if (subTickPosition < mRange.lower)
+          continue;
+        if (subTickPosition > mRange.upper)
+        {
+          done = true;
+          break;
+        }
+        mSubTickVector[subTickIndex] = subTickPosition;
+        subTickIndex++;
+      }
+      if (done) break;
+    }
+    mSubTickVector.resize(subTickIndex);
+  }
+
+  // generate tick labels according to tick positions:
+  if (mAutoTickLabels)
+  {
+    int vecsize = mTickVector.size();
+    mTickVectorLabels.resize(vecsize);
+    if (mTickLabelType == ltNumber)
+    {
+      for (int i=mLowestVisibleTick; i<=mHighestVisibleTick; ++i)
+        mTickVectorLabels[i] = mParentPlot->locale().toString(mTickVector.at(i), mNumberFormatChar.toLatin1(), mNumberPrecision);
+    } else if (mTickLabelType == ltDateTime)
+    {
+      for (int i=mLowestVisibleTick; i<=mHighestVisibleTick; ++i)
+      {
+#if QT_VERSION < QT_VERSION_CHECK(4, 7, 0) // use fromMSecsSinceEpoch function if available, to gain sub-second accuracy on tick labels (e.g. for format "hh:mm:ss:zzz")
+        mTickVectorLabels[i] = mParentPlot->locale().toString(QDateTime::fromTime_t(mTickVector.at(i)).toTimeSpec(mDateTimeSpec), mDateTimeFormat);
+#else
+        mTickVectorLabels[i] = mParentPlot->locale().toString(QDateTime::fromMSecsSinceEpoch(mTickVector.at(i)*1000).toTimeSpec(mDateTimeSpec), mDateTimeFormat);
+#endif
+      }
+    }
+  } else // mAutoTickLabels == false
+  {
+    if (mAutoTicks) // ticks generated automatically, but not ticklabels, so emit ticksRequest here for labels
+    {
+      emit ticksRequest();
+    }
+    // make sure provided tick label vector has correct (minimal) length:
+    if (mTickVectorLabels.size() < mTickVector.size())
+      mTickVectorLabels.resize(mTickVector.size());
+  }
+}
+
+/*! \internal
+  
+  If \ref setAutoTicks is set to true, this function is called by \ref setupTickVectors to
+  generate reasonable tick positions (and subtick count). The algorithm tries to create
+  approximately <tt>mAutoTickCount</tt> ticks (set via \ref setAutoTickCount).
+ 
+  If the scale is logarithmic, \ref setAutoTickCount is ignored, and one tick is generated at every
+  power of the current logarithm base, set via \ref setScaleLogBase.
+*/
+void QCPAxis::generateAutoTicks()
+{
+  if (mScaleType == stLinear)
+  {
+    if (mAutoTickStep)
+    {
+      // Generate tick positions according to linear scaling:
+      mTickStep = mRange.size()/(double)(mAutoTickCount+1e-10); // mAutoTickCount ticks on average, the small addition is to prevent jitter on exact integers
+      double magnitudeFactor = qPow(10.0, qFloor(qLn(mTickStep)/qLn(10.0))); // get magnitude factor e.g. 0.01, 1, 10, 1000 etc.
+      double tickStepMantissa = mTickStep/magnitudeFactor;
+      if (tickStepMantissa < 5)
+      {
+        // round digit after decimal point to 0.5
+        mTickStep = (int)(tickStepMantissa*2)/2.0*magnitudeFactor;
+      } else
+      {
+        // round to first digit in multiples of 2
+        mTickStep = (int)(tickStepMantissa/2.0)*2.0*magnitudeFactor;
+      }
+    }
+    if (mAutoSubTicks)
+      mSubTickCount = calculateAutoSubTickCount(mTickStep);
+    // Generate tick positions according to mTickStep:
+    qint64 firstStep = floor(mRange.lower/mTickStep); // do not use qFloor here, or we'll lose 64 bit precision
+    qint64 lastStep = ceil(mRange.upper/mTickStep); // do not use qCeil here, or we'll lose 64 bit precision
+    int tickcount = lastStep-firstStep+1;
+    if (tickcount < 0) tickcount = 0;
+    mTickVector.resize(tickcount);
+    for (int i=0; i<tickcount; ++i)
+      mTickVector[i] = (firstStep+i)*mTickStep;
+  } else // mScaleType == stLogarithmic
+  {
+    // Generate tick positions according to logbase scaling:
+    if (mRange.lower > 0 && mRange.upper > 0) // positive range
+    {
+      double lowerMag = basePow(qFloor(baseLog(mRange.lower)));
+      double currentMag = lowerMag;
+      mTickVector.clear();
+      mTickVector.append(currentMag);
+      while (currentMag < mRange.upper && currentMag > 0) // currentMag might be zero for ranges ~1e-300, just cancel in that case
+      {
+        currentMag *= mScaleLogBase;
+        mTickVector.append(currentMag);
+      }
+    } else if (mRange.lower < 0 && mRange.upper < 0) // negative range
+    {
+      double lowerMag = -basePow(qCeil(baseLog(-mRange.lower)));
+      double currentMag = lowerMag;
+      mTickVector.clear();
+      mTickVector.append(currentMag);
+      while (currentMag < mRange.upper && currentMag < 0) // currentMag might be zero for ranges ~1e-300, just cancel in that case
+      {
+        currentMag /= mScaleLogBase;
+        mTickVector.append(currentMag);
+      }
+    } else // invalid range for logarithmic scale, because lower and upper have different sign
+    {
+      mTickVector.clear();
+      qDebug() << Q_FUNC_INFO << "Invalid range for logarithmic plot: " << mRange.lower << "-" << mRange.upper;
+    }
+  }
+}
+
+/*! \internal
+  
+  Called by generateAutoTicks when \ref setAutoSubTicks is set to true. Depending on the \a
+  tickStep between two major ticks on the axis, a different number of sub ticks is appropriate. For
+  Example taking 4 sub ticks for a \a tickStep of 1 makes more sense than taking 5 sub ticks,
+  because this corresponds to a sub tick step of 0.2, instead of the less intuitive 0.16667. Note
+  that a subtick count of 4 means dividing the major tick step into 5 sections.
+  
+  This is implemented by a hand made lookup for integer tick steps as well as fractional tick steps
+  with a fractional part of (approximately) 0.5. If a tick step is different (i.e. has no
+  fractional part close to 0.5), the currently set sub tick count (\ref setSubTickCount) is
+  returned.
+*/
+int QCPAxis::calculateAutoSubTickCount(double tickStep) const
+{
+  int result = mSubTickCount; // default to current setting, if no proper value can be found
+  
+  // get mantissa of tickstep:
+  double magnitudeFactor = qPow(10.0, qFloor(qLn(tickStep)/qLn(10.0))); // get magnitude factor e.g. 0.01, 1, 10, 1000 etc.
+  double tickStepMantissa = tickStep/magnitudeFactor;
+  
+  // separate integer and fractional part of mantissa:
+  double epsilon = 0.01;
+  double intPartf;
+  int intPart;
+  double fracPart = modf(tickStepMantissa, &intPartf);
+  intPart = intPartf;
+  
+  // handle cases with (almost) integer mantissa:
+  if (fracPart < epsilon || 1.0-fracPart < epsilon)
+  {
+    if (1.0-fracPart < epsilon)
+      ++intPart;
+    switch (intPart)
+    {
+      case 1: result = 4; break; // 1.0 -> 0.2 substep
+      case 2: result = 3; break; // 2.0 -> 0.5 substep
+      case 3: result = 2; break; // 3.0 -> 1.0 substep
+      case 4: result = 3; break; // 4.0 -> 1.0 substep
+      case 5: result = 4; break; // 5.0 -> 1.0 substep
+      case 6: result = 2; break; // 6.0 -> 2.0 substep
+      case 7: result = 6; break; // 7.0 -> 1.0 substep
+      case 8: result = 3; break; // 8.0 -> 2.0 substep
+      case 9: result = 2; break; // 9.0 -> 3.0 substep
+    }
+  } else
+  {
+    // handle cases with significantly fractional mantissa:
+    if (qAbs(fracPart-0.5) < epsilon) // *.5 mantissa
+    {
+      switch (intPart)
+      {
+        case 1: result = 2; break; // 1.5 -> 0.5 substep
+        case 2: result = 4; break; // 2.5 -> 0.5 substep
+        case 3: result = 4; break; // 3.5 -> 0.7 substep
+        case 4: result = 2; break; // 4.5 -> 1.5 substep
+        case 5: result = 4; break; // 5.5 -> 1.1 substep (won't occur with autoTickStep from here on)
+        case 6: result = 4; break; // 6.5 -> 1.3 substep
+        case 7: result = 2; break; // 7.5 -> 2.5 substep
+        case 8: result = 4; break; // 8.5 -> 1.7 substep
+        case 9: result = 4; break; // 9.5 -> 1.9 substep
+      }
+    }
+    // if mantissa fraction isnt 0.0 or 0.5, don't bother finding good sub tick marks, leave default
+  }
+  
+  return result;
+}
+
+/* inherits documentation from base class */
+void QCPAxis::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged)
+{
+  Q_UNUSED(event)
+  SelectablePart part = details.value<SelectablePart>();
+  if (mSelectableParts.testFlag(part))
+  {
+    SelectableParts selBefore = mSelectedParts;
+    setSelectedParts(additive ? mSelectedParts^part : part);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelectedParts != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPAxis::deselectEvent(bool *selectionStateChanged)
+{
+  SelectableParts selBefore = mSelectedParts;
+  setSelectedParts(mSelectedParts & ~mSelectableParts);
+  if (selectionStateChanged)
+    *selectionStateChanged = mSelectedParts != selBefore;
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing axis lines.
+
+  This is the antialiasing state the painter passed to the \ref draw method is in by default.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased
+*/
+void QCPAxis::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiased, QCP::aeAxes);
+}
+
+/*! \internal
+  
+  Draws the axis with the specified \a painter, using the internal QCPAxisPainterPrivate instance.
+
+*/
+void QCPAxis::draw(QCPPainter *painter)
+{
+  const int lowTick = mLowestVisibleTick;
+  const int highTick = mHighestVisibleTick;
+  QVector<double> subTickPositions; // the final coordToPixel transformed vector passed to QCPAxisPainter
+  QVector<double> tickPositions; // the final coordToPixel transformed vector passed to QCPAxisPainter
+  QVector<QString> tickLabels; // the final vector passed to QCPAxisPainter
+  tickPositions.reserve(highTick-lowTick+1);
+  tickLabels.reserve(highTick-lowTick+1);
+  subTickPositions.reserve(mSubTickVector.size());
+  
+  if (mTicks)
+  {
+    for (int i=lowTick; i<=highTick; ++i)
+    {
+      tickPositions.append(coordToPixel(mTickVector.at(i)));
+      if (mTickLabels)
+        tickLabels.append(mTickVectorLabels.at(i));
+    }
+    
+    if (mSubTickCount > 0)
+    {
+      const int subTickCount = mSubTickVector.size();
+      for (int i=0; i<subTickCount; ++i) // no need to check bounds because subticks are always only created inside current mRange
+        subTickPositions.append(coordToPixel(mSubTickVector.at(i)));
+    }
+  }
+  // transfer all properties of this axis to QCPAxisPainterPrivate which it needs to draw the axis.
+  // Note that some axis painter properties are already set by direct feed-through with QCPAxis setters
+  mAxisPainter->type = mAxisType;
+  mAxisPainter->basePen = getBasePen();
+  mAxisPainter->labelFont = getLabelFont();
+  mAxisPainter->labelColor = getLabelColor();
+  mAxisPainter->label = mLabel;
+  mAxisPainter->substituteExponent = mAutoTickLabels && mNumberBeautifulPowers && mTickLabelType == ltNumber;
+  mAxisPainter->tickPen = getTickPen();
+  mAxisPainter->subTickPen = getSubTickPen();
+  mAxisPainter->tickLabelFont = getTickLabelFont();
+  mAxisPainter->tickLabelColor = getTickLabelColor();
+  mAxisPainter->axisRect = mAxisRect->rect();
+  mAxisPainter->viewportRect = mParentPlot->viewport();
+  mAxisPainter->abbreviateDecimalPowers = mScaleType == stLogarithmic;
+  mAxisPainter->reversedEndings = mRangeReversed;
+  mAxisPainter->tickPositions = tickPositions;
+  mAxisPainter->tickLabels = tickLabels;
+  mAxisPainter->subTickPositions = subTickPositions;
+  mAxisPainter->draw(painter);
+}
+
+/*! \internal
+  
+  Returns via \a lowIndex and \a highIndex, which ticks in the current tick vector are visible in
+  the current range. The return values are indices of the tick vector, not the positions of the
+  ticks themselves.
+  
+  The actual use of this function is when an external tick vector is provided, since it might
+  exceed far beyond the currently displayed range, and would cause unnecessary calculations e.g. of
+  subticks.
+  
+  If all ticks are outside the axis range, an inverted range is returned, i.e. highIndex will be
+  smaller than lowIndex. There is one case, where this function returns indices that are not really
+  visible in the current axis range: When the tick spacing is larger than the axis range size and
+  one tick is below the axis range and the next tick is already above the axis range. Because in
+  such cases it is usually desirable to know the tick pair, to draw proper subticks.
+*/
+void QCPAxis::visibleTickBounds(int &lowIndex, int &highIndex) const
+{
+  bool lowFound = false;
+  bool highFound = false;
+  lowIndex = 0;
+  highIndex = -1;
+  
+  for (int i=0; i < mTickVector.size(); ++i)
+  {
+    if (mTickVector.at(i) >= mRange.lower)
+    {
+      lowFound = true;
+      lowIndex = i;
+      break;
+    }
+  }
+  for (int i=mTickVector.size()-1; i >= 0; --i)
+  {
+    if (mTickVector.at(i) <= mRange.upper)
+    {
+      highFound = true;
+      highIndex = i;
+      break;
+    }
+  }
+  
+  if (!lowFound && highFound)
+    lowIndex = highIndex+1;
+  else if (lowFound && !highFound)
+    highIndex = lowIndex-1;
+}
+
+/*! \internal
+  
+  A log function with the base mScaleLogBase, used mostly for coordinate transforms in logarithmic
+  scales with arbitrary log base. Uses the buffered mScaleLogBaseLogInv for faster calculation.
+  This is set to <tt>1.0/qLn(mScaleLogBase)</tt> in \ref setScaleLogBase.
+  
+  \see basePow, setScaleLogBase, setScaleType
+*/
+double QCPAxis::baseLog(double value) const
+{
+  return qLn(value)*mScaleLogBaseLogInv;
+}
+
+/*! \internal
+  
+  A power function with the base mScaleLogBase, used mostly for coordinate transforms in
+  logarithmic scales with arbitrary log base.
+  
+  \see baseLog, setScaleLogBase, setScaleType
+*/
+double QCPAxis::basePow(double value) const
+{
+  return qPow(mScaleLogBase, value);
+}
+
+/*! \internal
+  
+  Returns the pen that is used to draw the axis base line. Depending on the selection state, this
+  is either mSelectedBasePen or mBasePen.
+*/
+QPen QCPAxis::getBasePen() const
+{
+  return mSelectedParts.testFlag(spAxis) ? mSelectedBasePen : mBasePen;
+}
+
+/*! \internal
+  
+  Returns the pen that is used to draw the (major) ticks. Depending on the selection state, this
+  is either mSelectedTickPen or mTickPen.
+*/
+QPen QCPAxis::getTickPen() const
+{
+  return mSelectedParts.testFlag(spAxis) ? mSelectedTickPen : mTickPen;
+}
+
+/*! \internal
+  
+  Returns the pen that is used to draw the subticks. Depending on the selection state, this
+  is either mSelectedSubTickPen or mSubTickPen.
+*/
+QPen QCPAxis::getSubTickPen() const
+{
+  return mSelectedParts.testFlag(spAxis) ? mSelectedSubTickPen : mSubTickPen;
+}
+
+/*! \internal
+  
+  Returns the font that is used to draw the tick labels. Depending on the selection state, this
+  is either mSelectedTickLabelFont or mTickLabelFont.
+*/
+QFont QCPAxis::getTickLabelFont() const
+{
+  return mSelectedParts.testFlag(spTickLabels) ? mSelectedTickLabelFont : mTickLabelFont;
+}
+
+/*! \internal
+  
+  Returns the font that is used to draw the axis label. Depending on the selection state, this
+  is either mSelectedLabelFont or mLabelFont.
+*/
+QFont QCPAxis::getLabelFont() const
+{
+  return mSelectedParts.testFlag(spAxisLabel) ? mSelectedLabelFont : mLabelFont;
+}
+
+/*! \internal
+  
+  Returns the color that is used to draw the tick labels. Depending on the selection state, this
+  is either mSelectedTickLabelColor or mTickLabelColor.
+*/
+QColor QCPAxis::getTickLabelColor() const
+{
+  return mSelectedParts.testFlag(spTickLabels) ? mSelectedTickLabelColor : mTickLabelColor;
+}
+
+/*! \internal
+  
+  Returns the color that is used to draw the axis label. Depending on the selection state, this
+  is either mSelectedLabelColor or mLabelColor.
+*/
+QColor QCPAxis::getLabelColor() const
+{
+  return mSelectedParts.testFlag(spAxisLabel) ? mSelectedLabelColor : mLabelColor;
+}
+
+/*! \internal
+  
+  Returns the appropriate outward margin for this axis. It is needed if \ref
+  QCPAxisRect::setAutoMargins is set to true on the parent axis rect. An axis with axis type \ref
+  atLeft will return an appropriate left margin, \ref atBottom will return an appropriate bottom
+  margin and so forth. For the calculation, this function goes through similar steps as \ref draw,
+  so changing one function likely requires the modification of the other one as well.
+  
+  The margin consists of the outward tick length, tick label padding, tick label size, label
+  padding, label size, and padding.
+  
+  The margin is cached internally, so repeated calls while leaving the axis range, fonts, etc.
+  unchanged are very fast.
+*/
+int QCPAxis::calculateMargin()
+{
+  if (!mVisible) // if not visible, directly return 0, don't cache 0 because we can't react to setVisible in QCPAxis
+    return 0;
+  
+  if (mCachedMarginValid)
+    return mCachedMargin;
+  
+  // run through similar steps as QCPAxis::draw, and caluclate margin needed to fit axis and its labels
+  int margin = 0;
+  
+  int lowTick, highTick;
+  visibleTickBounds(lowTick, highTick);
+  QVector<double> tickPositions; // the final coordToPixel transformed vector passed to QCPAxisPainter
+  QVector<QString> tickLabels; // the final vector passed to QCPAxisPainter
+  tickPositions.reserve(highTick-lowTick+1);
+  tickLabels.reserve(highTick-lowTick+1);
+  if (mTicks)
+  {
+    for (int i=lowTick; i<=highTick; ++i)
+    {
+      tickPositions.append(coordToPixel(mTickVector.at(i)));
+      if (mTickLabels)
+        tickLabels.append(mTickVectorLabels.at(i));
+    }
+  }
+  // transfer all properties of this axis to QCPAxisPainterPrivate which it needs to calculate the size.
+  // Note that some axis painter properties are already set by direct feed-through with QCPAxis setters
+  mAxisPainter->type = mAxisType;
+  mAxisPainter->labelFont = getLabelFont();
+  mAxisPainter->label = mLabel;
+  mAxisPainter->tickLabelFont = mTickLabelFont;
+  mAxisPainter->axisRect = mAxisRect->rect();
+  mAxisPainter->viewportRect = mParentPlot->viewport();
+  mAxisPainter->tickPositions = tickPositions;
+  mAxisPainter->tickLabels = tickLabels;
+  margin += mAxisPainter->size();
+  margin += mPadding;
+
+  mCachedMargin = margin;
+  mCachedMarginValid = true;
+  return margin;
+}
+
+/* inherits documentation from base class */
+QCP::Interaction QCPAxis::selectionCategory() const
+{
+  return QCP::iSelectAxes;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPAxisPainterPrivate
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPAxisPainterPrivate
+
+  \internal
+  \brief (Private)
+  
+  This is a private class and not part of the public QCustomPlot interface.
+  
+  It is used by QCPAxis to do the low-level drawing of axis backbone, tick marks, tick labels and
+  axis label. It also buffers the labels to reduce replot times. The parameters are configured by
+  directly accessing the public member variables.
+*/
+
+/*!
+  Constructs a QCPAxisPainterPrivate instance. Make sure to not create a new instance on every
+  redraw, to utilize the caching mechanisms.
+*/
+QCPAxisPainterPrivate::QCPAxisPainterPrivate(QCustomPlot *parentPlot) :
+  type(QCPAxis::atLeft),
+  basePen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)),
+  lowerEnding(QCPLineEnding::esNone),
+  upperEnding(QCPLineEnding::esNone),
+  labelPadding(0),
+  tickLabelPadding(0),
+  tickLabelRotation(0),
+  tickLabelSide(QCPAxis::lsOutside),
+  substituteExponent(true),
+  numberMultiplyCross(false),
+  tickLengthIn(5),
+  tickLengthOut(0),
+  subTickLengthIn(2),
+  subTickLengthOut(0),
+  tickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)),
+  subTickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)),
+  offset(0),
+  abbreviateDecimalPowers(false),
+  reversedEndings(false),
+  mParentPlot(parentPlot),
+  mLabelCache(16) // cache at most 16 (tick) labels
+{
+}
+
+QCPAxisPainterPrivate::~QCPAxisPainterPrivate()
+{
+}
+
+/*! \internal
+  
+  Draws the axis with the specified \a painter.
+  
+  The selection boxes (mAxisSelectionBox, mTickLabelsSelectionBox, mLabelSelectionBox) are set
+  here, too.
+*/
+void QCPAxisPainterPrivate::draw(QCPPainter *painter)
+{
+  QByteArray newHash = generateLabelParameterHash();
+  if (newHash != mLabelParameterHash)
+  {
+    mLabelCache.clear();
+    mLabelParameterHash = newHash;
+  }
+  
+  QPoint origin;
+  switch (type)
+  {
+    case QCPAxis::atLeft:   origin = axisRect.bottomLeft() +QPoint(-offset, 0); break;
+    case QCPAxis::atRight:  origin = axisRect.bottomRight()+QPoint(+offset, 0); break;
+    case QCPAxis::atTop:    origin = axisRect.topLeft()    +QPoint(0, -offset); break;
+    case QCPAxis::atBottom: origin = axisRect.bottomLeft() +QPoint(0, +offset); break;
+  }
+
+  double xCor = 0, yCor = 0; // paint system correction, for pixel exact matches (affects baselines and ticks of top/right axes)
+  switch (type)
+  {
+    case QCPAxis::atTop: yCor = -1; break;
+    case QCPAxis::atRight: xCor = 1; break;
+    default: break;
+  }
+  int margin = 0;
+  // draw baseline:
+  QLineF baseLine;
+  painter->setPen(basePen);
+  if (QCPAxis::orientation(type) == Qt::Horizontal)
+    baseLine.setPoints(origin+QPointF(xCor, yCor), origin+QPointF(axisRect.width()+xCor, yCor));
+  else
+    baseLine.setPoints(origin+QPointF(xCor, yCor), origin+QPointF(xCor, -axisRect.height()+yCor));
+  if (reversedEndings)
+    baseLine = QLineF(baseLine.p2(), baseLine.p1()); // won't make a difference for line itself, but for line endings later
+  painter->drawLine(baseLine);
+  
+  // draw ticks:
+  if (!tickPositions.isEmpty())
+  {
+    painter->setPen(tickPen);
+    int tickDir = (type == QCPAxis::atBottom || type == QCPAxis::atRight) ? -1 : 1; // direction of ticks ("inward" is right for left axis and left for right axis)
+    if (QCPAxis::orientation(type) == Qt::Horizontal)
+    {
+      for (int i=0; i<tickPositions.size(); ++i)
+        painter->drawLine(QLineF(tickPositions.at(i)+xCor, origin.y()-tickLengthOut*tickDir+yCor, tickPositions.at(i)+xCor, origin.y()+tickLengthIn*tickDir+yCor));
+    } else
+    {
+      for (int i=0; i<tickPositions.size(); ++i)
+        painter->drawLine(QLineF(origin.x()-tickLengthOut*tickDir+xCor, tickPositions.at(i)+yCor, origin.x()+tickLengthIn*tickDir+xCor, tickPositions.at(i)+yCor));
+    }
+  }
+  
+  // draw subticks:
+  if (!subTickPositions.isEmpty())
+  {
+    painter->setPen(subTickPen);
+    // direction of ticks ("inward" is right for left axis and left for right axis)
+    int tickDir = (type == QCPAxis::atBottom || type == QCPAxis::atRight) ? -1 : 1;
+    if (QCPAxis::orientation(type) == Qt::Horizontal)
+    {
+      for (int i=0; i<subTickPositions.size(); ++i)
+        painter->drawLine(QLineF(subTickPositions.at(i)+xCor, origin.y()-subTickLengthOut*tickDir+yCor, subTickPositions.at(i)+xCor, origin.y()+subTickLengthIn*tickDir+yCor));
+    } else
+    {
+      for (int i=0; i<subTickPositions.size(); ++i)
+        painter->drawLine(QLineF(origin.x()-subTickLengthOut*tickDir+xCor, subTickPositions.at(i)+yCor, origin.x()+subTickLengthIn*tickDir+xCor, subTickPositions.at(i)+yCor));
+    }
+  }
+  margin += qMax(0, qMax(tickLengthOut, subTickLengthOut));
+  
+  // draw axis base endings:
+  bool antialiasingBackup = painter->antialiasing();
+  painter->setAntialiasing(true); // always want endings to be antialiased, even if base and ticks themselves aren't
+  painter->setBrush(QBrush(basePen.color()));
+  QVector2D baseLineVector(baseLine.dx(), baseLine.dy());
+  if (lowerEnding.style() != QCPLineEnding::esNone)
+    lowerEnding.draw(painter, QVector2D(baseLine.p1())-baseLineVector.normalized()*lowerEnding.realLength()*(lowerEnding.inverted()?-1:1), -baseLineVector);
+  if (upperEnding.style() != QCPLineEnding::esNone)
+    upperEnding.draw(painter, QVector2D(baseLine.p2())+baseLineVector.normalized()*upperEnding.realLength()*(upperEnding.inverted()?-1:1), baseLineVector);
+  painter->setAntialiasing(antialiasingBackup);
+  
+  // tick labels:
+  QRect oldClipRect;
+  if (tickLabelSide == QCPAxis::lsInside) // if using inside labels, clip them to the axis rect
+  {
+    oldClipRect = painter->clipRegion().boundingRect();
+    painter->setClipRect(axisRect);
+  }
+  QSize tickLabelsSize(0, 0); // size of largest tick label, for offset calculation of axis label
+  if (!tickLabels.isEmpty())
+  {
+    if (tickLabelSide == QCPAxis::lsOutside)
+      margin += tickLabelPadding;
+    painter->setFont(tickLabelFont);
+    painter->setPen(QPen(tickLabelColor));
+    const int maxLabelIndex = qMin(tickPositions.size(), tickLabels.size());
+    int distanceToAxis = margin;
+    if (tickLabelSide == QCPAxis::lsInside)
+      distanceToAxis = -(qMax(tickLengthIn, subTickLengthIn)+tickLabelPadding);
+    for (int i=0; i<maxLabelIndex; ++i)
+      placeTickLabel(painter, tickPositions.at(i), distanceToAxis, tickLabels.at(i), &tickLabelsSize);
+    if (tickLabelSide == QCPAxis::lsOutside)
+      margin += (QCPAxis::orientation(type) == Qt::Horizontal) ? tickLabelsSize.height() : tickLabelsSize.width();
+  }
+  if (tickLabelSide == QCPAxis::lsInside)
+    painter->setClipRect(oldClipRect);
+  
+  // axis label:
+  QRect labelBounds;
+  if (!label.isEmpty())
+  {
+    margin += labelPadding;
+    painter->setFont(labelFont);
+    painter->setPen(QPen(labelColor));
+    labelBounds = painter->fontMetrics().boundingRect(0, 0, 0, 0, Qt::TextDontClip, label);
+    if (type == QCPAxis::atLeft)
+    {
+      QTransform oldTransform = painter->transform();
+      painter->translate((origin.x()-margin-labelBounds.height()), origin.y());
+      painter->rotate(-90);
+      painter->drawText(0, 0, axisRect.height(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label);
+      painter->setTransform(oldTransform);
+    }
+    else if (type == QCPAxis::atRight)
+    {
+      QTransform oldTransform = painter->transform();
+      painter->translate((origin.x()+margin+labelBounds.height()), origin.y()-axisRect.height());
+      painter->rotate(90);
+      painter->drawText(0, 0, axisRect.height(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label);
+      painter->setTransform(oldTransform);
+    }
+    else if (type == QCPAxis::atTop)
+      painter->drawText(origin.x(), origin.y()-margin-labelBounds.height(), axisRect.width(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label);
+    else if (type == QCPAxis::atBottom)
+      painter->drawText(origin.x(), origin.y()+margin, axisRect.width(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label);
+  }
+  
+  // set selection boxes:
+  int selectionTolerance = 0;
+  if (mParentPlot)
+    selectionTolerance = mParentPlot->selectionTolerance();
+  else
+    qDebug() << Q_FUNC_INFO << "mParentPlot is null";
+  int selAxisOutSize = qMax(qMax(tickLengthOut, subTickLengthOut), selectionTolerance);
+  int selAxisInSize = selectionTolerance;
+  int selTickLabelSize;
+  int selTickLabelOffset;
+  if (tickLabelSide == QCPAxis::lsOutside)
+  {
+    selTickLabelSize = (QCPAxis::orientation(type) == Qt::Horizontal ? tickLabelsSize.height() : tickLabelsSize.width());
+    selTickLabelOffset = qMax(tickLengthOut, subTickLengthOut)+tickLabelPadding;
+  } else
+  {
+    selTickLabelSize = -(QCPAxis::orientation(type) == Qt::Horizontal ? tickLabelsSize.height() : tickLabelsSize.width());
+    selTickLabelOffset = -(qMax(tickLengthIn, subTickLengthIn)+tickLabelPadding);
+  }
+  int selLabelSize = labelBounds.height();
+  int selLabelOffset = qMax(tickLengthOut, subTickLengthOut)+(!tickLabels.isEmpty() && tickLabelSide == QCPAxis::lsOutside ? tickLabelPadding+selTickLabelSize : 0)+labelPadding;
+  if (type == QCPAxis::atLeft)
+  {
+    mAxisSelectionBox.setCoords(origin.x()-selAxisOutSize, axisRect.top(), origin.x()+selAxisInSize, axisRect.bottom());
+    mTickLabelsSelectionBox.setCoords(origin.x()-selTickLabelOffset-selTickLabelSize, axisRect.top(), origin.x()-selTickLabelOffset, axisRect.bottom());
+    mLabelSelectionBox.setCoords(origin.x()-selLabelOffset-selLabelSize, axisRect.top(), origin.x()-selLabelOffset, axisRect.bottom());
+  } else if (type == QCPAxis::atRight)
+  {
+    mAxisSelectionBox.setCoords(origin.x()-selAxisInSize, axisRect.top(), origin.x()+selAxisOutSize, axisRect.bottom());
+    mTickLabelsSelectionBox.setCoords(origin.x()+selTickLabelOffset+selTickLabelSize, axisRect.top(), origin.x()+selTickLabelOffset, axisRect.bottom());
+    mLabelSelectionBox.setCoords(origin.x()+selLabelOffset+selLabelSize, axisRect.top(), origin.x()+selLabelOffset, axisRect.bottom());
+  } else if (type == QCPAxis::atTop)
+  {
+    mAxisSelectionBox.setCoords(axisRect.left(), origin.y()-selAxisOutSize, axisRect.right(), origin.y()+selAxisInSize);
+    mTickLabelsSelectionBox.setCoords(axisRect.left(), origin.y()-selTickLabelOffset-selTickLabelSize, axisRect.right(), origin.y()-selTickLabelOffset);
+    mLabelSelectionBox.setCoords(axisRect.left(), origin.y()-selLabelOffset-selLabelSize, axisRect.right(), origin.y()-selLabelOffset);
+  } else if (type == QCPAxis::atBottom)
+  {
+    mAxisSelectionBox.setCoords(axisRect.left(), origin.y()-selAxisInSize, axisRect.right(), origin.y()+selAxisOutSize);
+    mTickLabelsSelectionBox.setCoords(axisRect.left(), origin.y()+selTickLabelOffset+selTickLabelSize, axisRect.right(), origin.y()+selTickLabelOffset);
+    mLabelSelectionBox.setCoords(axisRect.left(), origin.y()+selLabelOffset+selLabelSize, axisRect.right(), origin.y()+selLabelOffset);
+  }
+  mAxisSelectionBox = mAxisSelectionBox.normalized();
+  mTickLabelsSelectionBox = mTickLabelsSelectionBox.normalized();
+  mLabelSelectionBox = mLabelSelectionBox.normalized();
+  // draw hitboxes for debug purposes:
+  //painter->setBrush(Qt::NoBrush);
+  //painter->drawRects(QVector<QRect>() << mAxisSelectionBox << mTickLabelsSelectionBox << mLabelSelectionBox);
+}
+
+/*! \internal
+  
+  Returns the size ("margin" in QCPAxisRect context, so measured perpendicular to the axis backbone
+  direction) needed to fit the axis.
+*/
+int QCPAxisPainterPrivate::size() const
+{
+  int result = 0;
+  
+  // get length of tick marks pointing outwards:
+  if (!tickPositions.isEmpty())
+    result += qMax(0, qMax(tickLengthOut, subTickLengthOut));
+  
+  // calculate size of tick labels:
+  if (tickLabelSide == QCPAxis::lsOutside)
+  {
+    QSize tickLabelsSize(0, 0);
+    if (!tickLabels.isEmpty())
+    {
+      for (int i=0; i<tickLabels.size(); ++i)
+        getMaxTickLabelSize(tickLabelFont, tickLabels.at(i), &tickLabelsSize);
+      result += QCPAxis::orientation(type) == Qt::Horizontal ? tickLabelsSize.height() : tickLabelsSize.width();
+    result += tickLabelPadding;
+    }
+  }
+  
+  // calculate size of axis label (only height needed, because left/right labels are rotated by 90 degrees):
+  if (!label.isEmpty())
+  {
+    QFontMetrics fontMetrics(labelFont);
+    QRect bounds;
+    bounds = fontMetrics.boundingRect(0, 0, 0, 0, Qt::TextDontClip | Qt::AlignHCenter | Qt::AlignVCenter, label);
+    result += bounds.height() + labelPadding;
+  }
+  
+  return result;
+}
+
+/*! \internal
+  
+  Clears the internal label cache. Upon the next \ref draw, all labels will be created new. This
+  method is called automatically in \ref draw, if any parameters have changed that invalidate the
+  cached labels, such as font, color, etc.
+*/
+void QCPAxisPainterPrivate::clearCache()
+{
+  mLabelCache.clear();
+}
+
+/*! \internal
+  
+  Returns a hash that allows uniquely identifying whether the label parameters have changed such
+  that the cached labels must be refreshed (\ref clearCache). It is used in \ref draw. If the
+  return value of this method hasn't changed since the last redraw, the respective label parameters
+  haven't changed and cached labels may be used.
+*/
+QByteArray QCPAxisPainterPrivate::generateLabelParameterHash() const
+{
+  QByteArray result;
+  result.append(QByteArray::number(tickLabelRotation));
+  result.append(QByteArray::number((int)tickLabelSide));
+  result.append(QByteArray::number((int)substituteExponent));
+  result.append(QByteArray::number((int)numberMultiplyCross));
+  result.append(tickLabelColor.name().toLatin1()+QByteArray::number(tickLabelColor.alpha(), 16));
+  result.append(tickLabelFont.toString().toLatin1());
+  return result;
+}
+
+/*! \internal
+  
+  Draws a single tick label with the provided \a painter, utilizing the internal label cache to
+  significantly speed up drawing of labels that were drawn in previous calls. The tick label is
+  always bound to an axis, the distance to the axis is controllable via \a distanceToAxis in
+  pixels. The pixel position in the axis direction is passed in the \a position parameter. Hence
+  for the bottom axis, \a position would indicate the horizontal pixel position (not coordinate),
+  at which the label should be drawn.
+  
+  In order to later draw the axis label in a place that doesn't overlap with the tick labels, the
+  largest tick label size is needed. This is acquired by passing a \a tickLabelsSize to the \ref
+  drawTickLabel calls during the process of drawing all tick labels of one axis. In every call, \a
+  tickLabelsSize is expanded, if the drawn label exceeds the value \a tickLabelsSize currently
+  holds.
+  
+  The label is drawn with the font and pen that are currently set on the \a painter. To draw
+  superscripted powers, the font is temporarily made smaller by a fixed factor (see \ref
+  getTickLabelData).
+*/
+void QCPAxisPainterPrivate::placeTickLabel(QCPPainter *painter, double position, int distanceToAxis, const QString &text, QSize *tickLabelsSize)
+{
+  // warning: if you change anything here, also adapt getMaxTickLabelSize() accordingly!
+  if (text.isEmpty()) return;
+  QSize finalSize;
+  QPointF labelAnchor;
+  switch (type)
+  {
+    case QCPAxis::atLeft:   labelAnchor = QPointF(axisRect.left()-distanceToAxis-offset, position); break;
+    case QCPAxis::atRight:  labelAnchor = QPointF(axisRect.right()+distanceToAxis+offset, position); break;
+    case QCPAxis::atTop:    labelAnchor = QPointF(position, axisRect.top()-distanceToAxis-offset); break;
+    case QCPAxis::atBottom: labelAnchor = QPointF(position, axisRect.bottom()+distanceToAxis+offset); break;
+  }
+  if (mParentPlot->plottingHints().testFlag(QCP::phCacheLabels) && !painter->modes().testFlag(QCPPainter::pmNoCaching)) // label caching enabled
+  {
+    CachedLabel *cachedLabel = mLabelCache.take(text); // attempt to get label from cache
+    if (!cachedLabel)  // no cached label existed, create it
+    {
+      cachedLabel = new CachedLabel;
+      TickLabelData labelData = getTickLabelData(painter->font(), text);
+      cachedLabel->offset = getTickLabelDrawOffset(labelData)+labelData.rotatedTotalBounds.topLeft();
+      cachedLabel->pixmap = QPixmap(labelData.rotatedTotalBounds.size());
+      cachedLabel->pixmap.fill(Qt::transparent);
+      QCPPainter cachePainter(&cachedLabel->pixmap);
+      cachePainter.setPen(painter->pen());
+      drawTickLabel(&cachePainter, -labelData.rotatedTotalBounds.topLeft().x(), -labelData.rotatedTotalBounds.topLeft().y(), labelData);
+    }
+    // if label would be partly clipped by widget border on sides, don't draw it (only for outside tick labels):
+    bool labelClippedByBorder = false;
+    if (tickLabelSide == QCPAxis::lsOutside)
+    {
+      if (QCPAxis::orientation(type) == Qt::Horizontal)
+        labelClippedByBorder = labelAnchor.x()+cachedLabel->offset.x()+cachedLabel->pixmap.width() > viewportRect.right() || labelAnchor.x()+cachedLabel->offset.x() < viewportRect.left();
+      else
+        labelClippedByBorder = labelAnchor.y()+cachedLabel->offset.y()+cachedLabel->pixmap.height() > viewportRect.bottom() || labelAnchor.y()+cachedLabel->offset.y() < viewportRect.top();
+    }
+    if (!labelClippedByBorder)
+    {
+      painter->drawPixmap(labelAnchor+cachedLabel->offset, cachedLabel->pixmap);
+      finalSize = cachedLabel->pixmap.size();
+    }
+    mLabelCache.insert(text, cachedLabel); // return label to cache or insert for the first time if newly created
+  } else // label caching disabled, draw text directly on surface:
+  {
+    TickLabelData labelData = getTickLabelData(painter->font(), text);
+    QPointF finalPosition = labelAnchor + getTickLabelDrawOffset(labelData);
+    // if label would be partly clipped by widget border on sides, don't draw it (only for outside tick labels):
+     bool labelClippedByBorder = false;
+    if (tickLabelSide == QCPAxis::lsOutside)
+    {
+      if (QCPAxis::orientation(type) == Qt::Horizontal)
+        labelClippedByBorder = finalPosition.x()+(labelData.rotatedTotalBounds.width()+labelData.rotatedTotalBounds.left()) > viewportRect.right() || finalPosition.x()+labelData.rotatedTotalBounds.left() < viewportRect.left();
+      else
+        labelClippedByBorder = finalPosition.y()+(labelData.rotatedTotalBounds.height()+labelData.rotatedTotalBounds.top()) > viewportRect.bottom() || finalPosition.y()+labelData.rotatedTotalBounds.top() < viewportRect.top();
+    }
+    if (!labelClippedByBorder)
+    {
+      drawTickLabel(painter, finalPosition.x(), finalPosition.y(), labelData);
+      finalSize = labelData.rotatedTotalBounds.size();
+    }
+  }
+  
+  // expand passed tickLabelsSize if current tick label is larger:
+  if (finalSize.width() > tickLabelsSize->width())
+    tickLabelsSize->setWidth(finalSize.width());
+  if (finalSize.height() > tickLabelsSize->height())
+    tickLabelsSize->setHeight(finalSize.height());
+}
+
+/*! \internal
+  
+  This is a \ref placeTickLabel helper function.
+  
+  Draws the tick label specified in \a labelData with \a painter at the pixel positions \a x and \a
+  y. This function is used by \ref placeTickLabel to create new tick labels for the cache, or to
+  directly draw the labels on the QCustomPlot surface when label caching is disabled, i.e. when
+  QCP::phCacheLabels plotting hint is not set.
+*/
+void QCPAxisPainterPrivate::drawTickLabel(QCPPainter *painter, double x, double y, const TickLabelData &labelData) const
+{
+  // backup painter settings that we're about to change:
+  QTransform oldTransform = painter->transform();
+  QFont oldFont = painter->font();
+  
+  // transform painter to position/rotation:
+  painter->translate(x, y);
+  if (!qFuzzyIsNull(tickLabelRotation))
+    painter->rotate(tickLabelRotation);
+  
+  // draw text:
+  if (!labelData.expPart.isEmpty()) // indicator that beautiful powers must be used
+  {
+    painter->setFont(labelData.baseFont);
+    painter->drawText(0, 0, 0, 0, Qt::TextDontClip, labelData.basePart);
+    painter->setFont(labelData.expFont);
+    painter->drawText(labelData.baseBounds.width()+1, 0, labelData.expBounds.width(), labelData.expBounds.height(), Qt::TextDontClip,  labelData.expPart);
+  } else
+  {
+    painter->setFont(labelData.baseFont);
+    painter->drawText(0, 0, labelData.totalBounds.width(), labelData.totalBounds.height(), Qt::TextDontClip | Qt::AlignHCenter, labelData.basePart);
+  }
+  
+  // reset painter settings to what it was before:
+  painter->setTransform(oldTransform);
+  painter->setFont(oldFont);
+}
+
+/*! \internal
+  
+  This is a \ref placeTickLabel helper function.
+  
+  Transforms the passed \a text and \a font to a tickLabelData structure that can then be further
+  processed by \ref getTickLabelDrawOffset and \ref drawTickLabel. It splits the text into base and
+  exponent if necessary (member substituteExponent) and calculates appropriate bounding boxes.
+*/
+QCPAxisPainterPrivate::TickLabelData QCPAxisPainterPrivate::getTickLabelData(const QFont &font, const QString &text) const
+{
+  TickLabelData result;
+  
+  // determine whether beautiful decimal powers should be used
+  bool useBeautifulPowers = false;
+  int ePos = -1; // first index of exponent part, text before that will be basePart, text until eLast will be expPart
+  int eLast = -1; // last index of exponent part, rest of text after this will be suffixPart
+  if (substituteExponent)
+  {
+    ePos = text.indexOf(QLatin1Char('e'));
+    if (ePos > 0 && text.at(ePos-1).isDigit())
+    {
+      eLast = ePos;
+      while (eLast+1 < text.size() && (text.at(eLast+1) == QLatin1Char('+') || text.at(eLast+1) == QLatin1Char('-') || text.at(eLast+1).isDigit()))
+        ++eLast;
+      if (eLast > ePos) // only if also to right of 'e' is a digit/+/- interpret it as beautifiable power
+        useBeautifulPowers = true;
+    }
+  }
+  
+  // calculate text bounding rects and do string preparation for beautiful decimal powers:
+  result.baseFont = font;
+  if (result.baseFont.pointSizeF() > 0) // might return -1 if specified with setPixelSize, in that case we can't do correction in next line
+    result.baseFont.setPointSizeF(result.baseFont.pointSizeF()+0.05); // QFontMetrics.boundingRect has a bug for exact point sizes that make the results oscillate due to internal rounding
+  if (useBeautifulPowers)
+  {
+    // split text into parts of number/symbol that will be drawn normally and part that will be drawn as exponent:
+    result.basePart = text.left(ePos);
+    // in log scaling, we want to turn "1*10^n" into "10^n", else add multiplication sign and decimal base:
+    if (abbreviateDecimalPowers && result.basePart == QLatin1String("1"))
+      result.basePart = QLatin1String("10");
+    else
+      result.basePart += (numberMultiplyCross ? QString(QChar(215)) : QString(QChar(183))) + QLatin1String("10");
+    result.expPart = text.mid(ePos+1);
+    // clip "+" and leading zeros off expPart:
+    while (result.expPart.length() > 2 && result.expPart.at(1) == QLatin1Char('0')) // length > 2 so we leave one zero when numberFormatChar is 'e'
+      result.expPart.remove(1, 1);
+    if (!result.expPart.isEmpty() && result.expPart.at(0) == QLatin1Char('+'))
+      result.expPart.remove(0, 1);
+    // prepare smaller font for exponent:
+    result.expFont = font;
+    if (result.expFont.pointSize() > 0)
+      result.expFont.setPointSize(result.expFont.pointSize()*0.75);
+    else
+      result.expFont.setPixelSize(result.expFont.pixelSize()*0.75);
+    // calculate bounding rects of base part, exponent part and total one:
+    result.baseBounds = QFontMetrics(result.baseFont).boundingRect(0, 0, 0, 0, Qt::TextDontClip, result.basePart);
+    result.expBounds = QFontMetrics(result.expFont).boundingRect(0, 0, 0, 0, Qt::TextDontClip, result.expPart);
+    result.totalBounds = result.baseBounds.adjusted(0, 0, result.expBounds.width()+2, 0); // +2 consists of the 1 pixel spacing between base and exponent (see drawTickLabel) and an extra pixel to include AA
+  } else // useBeautifulPowers == false
+  {
+    result.basePart = text;
+    result.totalBounds = QFontMetrics(result.baseFont).boundingRect(0, 0, 0, 0, Qt::TextDontClip | Qt::AlignHCenter, result.basePart);
+  }
+  result.totalBounds.moveTopLeft(QPoint(0, 0)); // want bounding box aligned top left at origin, independent of how it was created, to make further processing simpler
+  
+  // calculate possibly different bounding rect after rotation:
+  result.rotatedTotalBounds = result.totalBounds;
+  if (!qFuzzyIsNull(tickLabelRotation))
+  {
+    QTransform transform;
+    transform.rotate(tickLabelRotation);
+    result.rotatedTotalBounds = transform.mapRect(result.rotatedTotalBounds);
+  }
+  
+  return result;
+}
+
+/*! \internal
+  
+  This is a \ref placeTickLabel helper function.
+  
+  Calculates the offset at which the top left corner of the specified tick label shall be drawn.
+  The offset is relative to a point right next to the tick the label belongs to.
+  
+  This function is thus responsible for e.g. centering tick labels under ticks and positioning them
+  appropriately when they are rotated.
+*/
+QPointF QCPAxisPainterPrivate::getTickLabelDrawOffset(const TickLabelData &labelData) const
+{
+  /*
+    calculate label offset from base point at tick (non-trivial, for best visual appearance): short
+    explanation for bottom axis: The anchor, i.e. the point in the label that is placed
+    horizontally under the corresponding tick is always on the label side that is closer to the
+    axis (e.g. the left side of the text when we're rotating clockwise). On that side, the height
+    is halved and the resulting point is defined the anchor. This way, a 90 degree rotated text
+    will be centered under the tick (i.e. displaced horizontally by half its height). At the same
+    time, a 45 degree rotated text will "point toward" its tick, as is typical for rotated tick
+    labels.
+  */
+  bool doRotation = !qFuzzyIsNull(tickLabelRotation);
+  bool flip = qFuzzyCompare(qAbs(tickLabelRotation), 90.0); // perfect +/-90 degree flip. Indicates vertical label centering on vertical axes.
+  double radians = tickLabelRotation/180.0*M_PI;
+  int x=0, y=0;
+  if ((type == QCPAxis::atLeft && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atRight && tickLabelSide == QCPAxis::lsInside)) // Anchor at right side of tick label
+  {
+    if (doRotation)
+    {
+      if (tickLabelRotation > 0)
+      {
+        x = -qCos(radians)*labelData.totalBounds.width();
+        y = flip ? -labelData.totalBounds.width()/2.0 : -qSin(radians)*labelData.totalBounds.width()-qCos(radians)*labelData.totalBounds.height()/2.0;
+      } else
+      {
+        x = -qCos(-radians)*labelData.totalBounds.width()-qSin(-radians)*labelData.totalBounds.height();
+        y = flip ? +labelData.totalBounds.width()/2.0 : +qSin(-radians)*labelData.totalBounds.width()-qCos(-radians)*labelData.totalBounds.height()/2.0;
+      }
+    } else
+    {
+      x = -labelData.totalBounds.width();
+      y = -labelData.totalBounds.height()/2.0;
+    }
+  } else if ((type == QCPAxis::atRight && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atLeft && tickLabelSide == QCPAxis::lsInside)) // Anchor at left side of tick label
+  {
+    if (doRotation)
+    {
+      if (tickLabelRotation > 0)
+      {
+        x = +qSin(radians)*labelData.totalBounds.height();
+        y = flip ? -labelData.totalBounds.width()/2.0 : -qCos(radians)*labelData.totalBounds.height()/2.0;
+      } else
+      {
+        x = 0;
+        y = flip ? +labelData.totalBounds.width()/2.0 : -qCos(-radians)*labelData.totalBounds.height()/2.0;
+      }
+    } else
+    {
+      x = 0;
+      y = -labelData.totalBounds.height()/2.0;
+    }
+  } else if ((type == QCPAxis::atTop && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atBottom && tickLabelSide == QCPAxis::lsInside)) // Anchor at bottom side of tick label
+  {
+    if (doRotation)
+    {
+      if (tickLabelRotation > 0)
+      {
+        x = -qCos(radians)*labelData.totalBounds.width()+qSin(radians)*labelData.totalBounds.height()/2.0;
+        y = -qSin(radians)*labelData.totalBounds.width()-qCos(radians)*labelData.totalBounds.height();
+      } else
+      {
+        x = -qSin(-radians)*labelData.totalBounds.height()/2.0;
+        y = -qCos(-radians)*labelData.totalBounds.height();
+      }
+    } else
+    {
+      x = -labelData.totalBounds.width()/2.0;
+      y = -labelData.totalBounds.height();
+    }
+  } else if ((type == QCPAxis::atBottom && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atTop && tickLabelSide == QCPAxis::lsInside)) // Anchor at top side of tick label
+  {
+    if (doRotation)
+    {
+      if (tickLabelRotation > 0)
+      {
+        x = +qSin(radians)*labelData.totalBounds.height()/2.0;
+        y = 0;
+      } else
+      {
+        x = -qCos(-radians)*labelData.totalBounds.width()-qSin(-radians)*labelData.totalBounds.height()/2.0;
+        y = +qSin(-radians)*labelData.totalBounds.width();
+      }
+    } else
+    {
+      x = -labelData.totalBounds.width()/2.0;
+      y = 0;
+    }
+  }
+  
+  return QPointF(x, y);
+}
+
+/*! \internal
+  
+  Simulates the steps done by \ref placeTickLabel by calculating bounding boxes of the text label
+  to be drawn, depending on number format etc. Since only the largest tick label is wanted for the
+  margin calculation, the passed \a tickLabelsSize is only expanded, if it's currently set to a
+  smaller width/height.
+*/
+void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString &text,  QSize *tickLabelsSize) const
+{
+  // note: this function must return the same tick label sizes as the placeTickLabel function.
+  QSize finalSize;
+  if (mParentPlot->plottingHints().testFlag(QCP::phCacheLabels) && mLabelCache.contains(text)) // label caching enabled and have cached label
+  {
+    const CachedLabel *cachedLabel = mLabelCache.object(text);
+    finalSize = cachedLabel->pixmap.size();
+  } else // label caching disabled or no label with this text cached:
+  {
+    TickLabelData labelData = getTickLabelData(font, text);
+    finalSize = labelData.rotatedTotalBounds.size();
+  }
+  
+  // expand passed tickLabelsSize if current tick label is larger:
+  if (finalSize.width() > tickLabelsSize->width())
+    tickLabelsSize->setWidth(finalSize.width());
+  if (finalSize.height() > tickLabelsSize->height())
+    tickLabelsSize->setHeight(finalSize.height());
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPAbstractPlottable
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPAbstractPlottable
+  \brief The abstract base class for all data representing objects in a plot.
+
+  It defines a very basic interface like name, pen, brush, visibility etc. Since this class is
+  abstract, it can't be instantiated. Use one of the subclasses or create a subclass yourself to
+  create new ways of displaying data (see "Creating own plottables" below).
+  
+  All further specifics are in the subclasses, for example:
+  \li A normal graph with possibly a line, scatter points and error bars: \ref QCPGraph
+  (typically created with \ref QCustomPlot::addGraph)
+  \li A parametric curve: \ref QCPCurve
+  \li A bar chart: \ref QCPBars
+  \li A statistical box plot: \ref QCPStatisticalBox
+  \li A color encoded two-dimensional map: \ref QCPColorMap
+  \li An OHLC/Candlestick chart: \ref QCPFinancial
+  
+  \section plottables-subclassing Creating own plottables
+  
+  To create an own plottable, you implement a subclass of QCPAbstractPlottable. These are the pure
+  virtual functions, you must implement:
+  \li \ref clearData
+  \li \ref selectTest
+  \li \ref draw
+  \li \ref drawLegendIcon
+  \li \ref getKeyRange
+  \li \ref getValueRange
+  
+  See the documentation of those functions for what they need to do.
+  
+  For drawing your plot, you can use the \ref coordsToPixels functions to translate a point in plot
+  coordinates to pixel coordinates. This function is quite convenient, because it takes the
+  orientation of the key and value axes into account for you (x and y are swapped when the key axis
+  is vertical and the value axis horizontal). If you are worried about performance (i.e. you need
+  to translate many points in a loop like QCPGraph), you can directly use \ref
+  QCPAxis::coordToPixel. However, you must then take care about the orientation of the axis
+  yourself.
+  
+  Here are some important members you inherit from QCPAbstractPlottable:
+  <table>
+  <tr>
+    <td>QCustomPlot *\b mParentPlot</td>
+    <td>A pointer to the parent QCustomPlot instance. The parent plot is inferred from the axes that are passed in the constructor.</td>
+  </tr><tr>
+    <td>QString \b mName</td>
+    <td>The name of the plottable.</td>
+  </tr><tr>
+    <td>QPen \b mPen</td>
+    <td>The generic pen of the plottable. You should use this pen for the most prominent data representing lines in the plottable (e.g QCPGraph uses this pen for its graph lines and scatters)</td>
+  </tr><tr>
+    <td>QPen \b mSelectedPen</td>
+    <td>The generic pen that should be used when the plottable is selected (hint: \ref mainPen gives you the right pen, depending on selection state).</td>
+  </tr><tr>
+    <td>QBrush \b mBrush</td>
+    <td>The generic brush of the plottable. You should use this brush for the most prominent fillable structures in the plottable (e.g. QCPGraph uses this brush to control filling under the graph)</td>
+  </tr><tr>
+    <td>QBrush \b mSelectedBrush</td>
+    <td>The generic brush that should be used when the plottable is selected (hint: \ref mainBrush gives you the right brush, depending on selection state).</td>
+  </tr><tr>
+    <td>QPointer<QCPAxis>\b mKeyAxis, \b mValueAxis</td>
+    <td>The key and value axes this plottable is attached to. Call their QCPAxis::coordToPixel functions to translate coordinates to pixels in either the key or value dimension.
+        Make sure to check whether the pointer is null before using it. If one of the axes is null, don't draw the plottable.</td>
+  </tr><tr>
+    <td>bool \b mSelected</td>
+    <td>indicates whether the plottable is selected or not.</td>
+  </tr>
+  </table>
+*/
+
+/* start of documentation of pure virtual functions */
+
+/*! \fn void QCPAbstractPlottable::clearData() = 0
+  Clears all data in the plottable.
+*/
+
+/*! \fn void QCPAbstractPlottable::drawLegendIcon(QCPPainter *painter, const QRect &rect) const = 0
+  \internal
+  
+  called by QCPLegend::draw (via QCPPlottableLegendItem::draw) to create a graphical representation
+  of this plottable inside \a rect, next to the plottable name.
+  
+  The passed \a painter has its cliprect set to \a rect, so painting outside of \a rect won't
+  appear outside the legend icon border.
+*/
+
+/*! \fn QCPRange QCPAbstractPlottable::getKeyRange(bool &foundRange, SignDomain inSignDomain) const = 0
+  \internal
+  
+  called by rescaleAxes functions to get the full data key bounds. For logarithmic plots, one can
+  set \a inSignDomain to either \ref sdNegative or \ref sdPositive in order to restrict the
+  returned range to that sign domain. E.g. when only negative range is wanted, set \a inSignDomain
+  to \ref sdNegative and all positive points will be ignored for range calculation. For no
+  restriction, just set \a inSignDomain to \ref sdBoth (default). \a foundRange is an output
+  parameter that indicates whether a range could be found or not. If this is false, you shouldn't
+  use the returned range (e.g. no points in data).
+
+  Note that \a foundRange is not the same as \ref QCPRange::validRange, since the range returned by
+  this function may have size zero, which wouldn't count as a valid range.
+  
+  \see rescaleAxes, getValueRange
+*/
+
+/*! \fn QCPRange QCPAbstractPlottable::getValueRange(bool &foundRange, SignDomain inSignDomain) const = 0
+  \internal
+  
+  called by rescaleAxes functions to get the full data value bounds. For logarithmic plots, one can
+  set \a inSignDomain to either \ref sdNegative or \ref sdPositive in order to restrict the
+  returned range to that sign domain. E.g. when only negative range is wanted, set \a inSignDomain
+  to \ref sdNegative and all positive points will be ignored for range calculation. For no
+  restriction, just set \a inSignDomain to \ref sdBoth (default). \a foundRange is an output
+  parameter that indicates whether a range could be found or not. If this is false, you shouldn't
+  use the returned range (e.g. no points in data).
+
+  Note that \a foundRange is not the same as \ref QCPRange::validRange, since the range returned by
+  this function may have size zero, which wouldn't count as a valid range.
+  
+  \see rescaleAxes, getKeyRange
+*/
+
+/* end of documentation of pure virtual functions */
+/* start of documentation of signals */
+
+/*! \fn void QCPAbstractPlottable::selectionChanged(bool selected)
+  
+  This signal is emitted when the selection state of this plottable has changed, either by user
+  interaction or by a direct call to \ref setSelected.
+*/
+
+/*! \fn void QCPAbstractPlottable::selectableChanged(bool selectable);
+  
+  This signal is emitted when the selectability of this plottable has changed.
+  
+  \see setSelectable
+*/
+
+/* end of documentation of signals */
+
+/*!
+  Constructs an abstract plottable which uses \a keyAxis as its key axis ("x") and \a valueAxis as
+  its value axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance
+  and have perpendicular orientations. If either of these restrictions is violated, a corresponding
+  message is printed to the debug output (qDebug), the construction is not aborted, though.
+  
+  Since QCPAbstractPlottable is an abstract class that defines the basic interface to plottables,
+  it can't be directly instantiated.
+  
+  You probably want one of the subclasses like \ref QCPGraph or \ref QCPCurve instead.
+*/
+QCPAbstractPlottable::QCPAbstractPlottable(QCPAxis *keyAxis, QCPAxis *valueAxis) :
+  QCPLayerable(keyAxis->parentPlot(), QString(), keyAxis->axisRect()),
+  mName(),
+  mAntialiasedFill(true),
+  mAntialiasedScatters(true),
+  mAntialiasedErrorBars(false),
+  mPen(Qt::black),
+  mSelectedPen(Qt::black),
+  mBrush(Qt::NoBrush),
+  mSelectedBrush(Qt::NoBrush),
+  mKeyAxis(keyAxis),
+  mValueAxis(valueAxis),
+  mSelectable(true),
+  mSelected(false)
+{
+  if (keyAxis->parentPlot() != valueAxis->parentPlot())
+    qDebug() << Q_FUNC_INFO << "Parent plot of keyAxis is not the same as that of valueAxis.";
+  if (keyAxis->orientation() == valueAxis->orientation())
+    qDebug() << Q_FUNC_INFO << "keyAxis and valueAxis must be orthogonal to each other.";
+}
+
+/*!
+   The name is the textual representation of this plottable as it is displayed in the legend
+   (\ref QCPLegend). It may contain any UTF-8 characters, including newlines.
+*/
+void QCPAbstractPlottable::setName(const QString &name)
+{
+  mName = name;
+}
+
+/*!
+  Sets whether fills of this plottable are drawn antialiased or not.
+  
+  Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+*/
+void QCPAbstractPlottable::setAntialiasedFill(bool enabled)
+{
+  mAntialiasedFill = enabled;
+}
+
+/*!
+  Sets whether the scatter symbols of this plottable are drawn antialiased or not.
+  
+  Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+*/
+void QCPAbstractPlottable::setAntialiasedScatters(bool enabled)
+{
+  mAntialiasedScatters = enabled;
+}
+
+/*!
+  Sets whether the error bars of this plottable are drawn antialiased or not.
+  
+  Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+*/
+void QCPAbstractPlottable::setAntialiasedErrorBars(bool enabled)
+{
+  mAntialiasedErrorBars = enabled;
+}
+
+
+/*!
+  The pen is used to draw basic lines that make up the plottable representation in the
+  plot.
+  
+  For example, the \ref QCPGraph subclass draws its graph lines with this pen.
+
+  \see setBrush
+*/
+void QCPAbstractPlottable::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  When the plottable is selected, this pen is used to draw basic lines instead of the normal
+  pen set via \ref setPen.
+
+  \see setSelected, setSelectable, setSelectedBrush, selectTest
+*/
+void QCPAbstractPlottable::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  The brush is used to draw basic fills of the plottable representation in the
+  plot. The Fill can be a color, gradient or texture, see the usage of QBrush.
+  
+  For example, the \ref QCPGraph subclass draws the fill under the graph with this brush, when
+  it's not set to Qt::NoBrush.
+
+  \see setPen
+*/
+void QCPAbstractPlottable::setBrush(const QBrush &brush)
+{
+  mBrush = brush;
+}
+
+/*!
+  When the plottable is selected, this brush is used to draw fills instead of the normal
+  brush set via \ref setBrush.
+
+  \see setSelected, setSelectable, setSelectedPen, selectTest
+*/
+void QCPAbstractPlottable::setSelectedBrush(const QBrush &brush)
+{
+  mSelectedBrush = brush;
+}
+
+/*!
+  The key axis of a plottable can be set to any axis of a QCustomPlot, as long as it is orthogonal
+  to the plottable's value axis. This function performs no checks to make sure this is the case.
+  The typical mathematical choice is to use the x-axis (QCustomPlot::xAxis) as key axis and the
+  y-axis (QCustomPlot::yAxis) as value axis.
+  
+  Normally, the key and value axes are set in the constructor of the plottable (or \ref
+  QCustomPlot::addGraph when working with QCPGraphs through the dedicated graph interface).
+
+  \see setValueAxis
+*/
+void QCPAbstractPlottable::setKeyAxis(QCPAxis *axis)
+{
+  mKeyAxis = axis;
+}
+
+/*!
+  The value axis of a plottable can be set to any axis of a QCustomPlot, as long as it is
+  orthogonal to the plottable's key axis. This function performs no checks to make sure this is the
+  case. The typical mathematical choice is to use the x-axis (QCustomPlot::xAxis) as key axis and
+  the y-axis (QCustomPlot::yAxis) as value axis.
+
+  Normally, the key and value axes are set in the constructor of the plottable (or \ref
+  QCustomPlot::addGraph when working with QCPGraphs through the dedicated graph interface).
+  
+  \see setKeyAxis
+*/
+void QCPAbstractPlottable::setValueAxis(QCPAxis *axis)
+{
+  mValueAxis = axis;
+}
+
+/*!
+  Sets whether the user can (de-)select this plottable by clicking on the QCustomPlot surface.
+  (When \ref QCustomPlot::setInteractions contains iSelectPlottables.)
+  
+  However, even when \a selectable was set to false, it is possible to set the selection manually,
+  by calling \ref setSelected directly.
+  
+  \see setSelected
+*/
+void QCPAbstractPlottable::setSelectable(bool selectable)
+{
+  if (mSelectable != selectable)
+  {
+    mSelectable = selectable;
+    emit selectableChanged(mSelectable);
+  }
+}
+
+/*!
+  Sets whether this plottable is selected or not. When selected, it uses a different pen and brush
+  to draw its lines and fills, see \ref setSelectedPen and \ref setSelectedBrush.
+
+  The entire selection mechanism for plottables is handled automatically when \ref
+  QCustomPlot::setInteractions contains iSelectPlottables. You only need to call this function when
+  you wish to change the selection state manually.
+  
+  This function can change the selection state even when \ref setSelectable was set to false.
+  
+  emits the \ref selectionChanged signal when \a selected is different from the previous selection state.
+  
+  \see setSelectable, selectTest
+*/
+void QCPAbstractPlottable::setSelected(bool selected)
+{
+  if (mSelected != selected)
+  {
+    mSelected = selected;
+    emit selectionChanged(mSelected);
+  }
+}
+
+/*!
+  Rescales the key and value axes associated with this plottable to contain all displayed data, so
+  the whole plottable is visible. If the scaling of an axis is logarithmic, rescaleAxes will make
+  sure not to rescale to an illegal range i.e. a range containing different signs and/or zero.
+  Instead it will stay in the current sign domain and ignore all parts of the plottable that lie
+  outside of that domain.
+  
+  \a onlyEnlarge makes sure the ranges are only expanded, never reduced. So it's possible to show
+  multiple plottables in their entirety by multiple calls to rescaleAxes where the first call has
+  \a onlyEnlarge set to false (the default), and all subsequent set to true.
+  
+  \see rescaleKeyAxis, rescaleValueAxis, QCustomPlot::rescaleAxes, QCPAxis::rescale
+*/
+void QCPAbstractPlottable::rescaleAxes(bool onlyEnlarge) const
+{
+  rescaleKeyAxis(onlyEnlarge);
+  rescaleValueAxis(onlyEnlarge);
+}
+
+/*!
+  Rescales the key axis of the plottable so the whole plottable is visible.
+  
+  See \ref rescaleAxes for detailed behaviour.
+*/
+void QCPAbstractPlottable::rescaleKeyAxis(bool onlyEnlarge) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  if (!keyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; }
+  
+  SignDomain signDomain = sdBoth;
+  if (keyAxis->scaleType() == QCPAxis::stLogarithmic)
+    signDomain = (keyAxis->range().upper < 0 ? sdNegative : sdPositive);
+  
+  bool foundRange;
+  QCPRange newRange = getKeyRange(foundRange, signDomain);
+  if (foundRange)
+  {
+    if (onlyEnlarge)
+      newRange.expand(keyAxis->range());
+    if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this axis dimension), shift current range to at least center the plottable
+    {
+      double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason
+      if (keyAxis->scaleType() == QCPAxis::stLinear)
+      {
+        newRange.lower = center-keyAxis->range().size()/2.0;
+        newRange.upper = center+keyAxis->range().size()/2.0;
+      } else // scaleType() == stLogarithmic
+      {
+        newRange.lower = center/qSqrt(keyAxis->range().upper/keyAxis->range().lower);
+        newRange.upper = center*qSqrt(keyAxis->range().upper/keyAxis->range().lower);
+      }
+    }
+    keyAxis->setRange(newRange);
+  }
+}
+
+/*!
+  Rescales the value axis of the plottable so the whole plottable is visible.
+  
+  Returns true if the axis was actually scaled. This might not be the case if this plottable has an
+  invalid range, e.g. because it has no data points.
+  
+  See \ref rescaleAxes for detailed behaviour.
+*/
+void QCPAbstractPlottable::rescaleValueAxis(bool onlyEnlarge) const
+{
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!valueAxis) { qDebug() << Q_FUNC_INFO << "invalid value axis"; return; }
+  
+  SignDomain signDomain = sdBoth;
+  if (valueAxis->scaleType() == QCPAxis::stLogarithmic)
+    signDomain = (valueAxis->range().upper < 0 ? sdNegative : sdPositive);
+  
+  bool foundRange;
+  QCPRange newRange = getValueRange(foundRange, signDomain);
+  if (foundRange)
+  {
+    if (onlyEnlarge)
+      newRange.expand(valueAxis->range());
+    if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this axis dimension), shift current range to at least center the plottable
+    {
+      double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason
+      if (valueAxis->scaleType() == QCPAxis::stLinear)
+      {
+        newRange.lower = center-valueAxis->range().size()/2.0;
+        newRange.upper = center+valueAxis->range().size()/2.0;
+      } else // scaleType() == stLogarithmic
+      {
+        newRange.lower = center/qSqrt(valueAxis->range().upper/valueAxis->range().lower);
+        newRange.upper = center*qSqrt(valueAxis->range().upper/valueAxis->range().lower);
+      }
+    }
+    valueAxis->setRange(newRange);
+  }
+}
+
+/*!
+  Adds this plottable to the legend of the parent QCustomPlot (QCustomPlot::legend).
+    
+  Normally, a QCPPlottableLegendItem is created and inserted into the legend. If the plottable
+  needs a more specialized representation in the legend, this function will take this into account
+  and instead create the specialized subclass of QCPAbstractLegendItem.
+    
+  Returns true on success, i.e. when the legend exists and a legend item associated with this plottable isn't already in
+  the legend.
+    
+  \see removeFromLegend, QCPLegend::addItem
+*/
+bool QCPAbstractPlottable::addToLegend()
+{
+  if (!mParentPlot || !mParentPlot->legend)
+    return false;
+  
+  if (!mParentPlot->legend->hasItemWithPlottable(this))
+  {
+    mParentPlot->legend->addItem(new QCPPlottableLegendItem(mParentPlot->legend, this));
+    return true;
+  } else
+    return false;
+}
+
+/*!
+  Removes the plottable from the legend of the parent QCustomPlot. This means the
+  QCPAbstractLegendItem (usually a QCPPlottableLegendItem) that is associated with this plottable
+  is removed.
+    
+  Returns true on success, i.e. if the legend exists and a legend item associated with this
+  plottable was found and removed.
+    
+  \see addToLegend, QCPLegend::removeItem
+*/
+bool QCPAbstractPlottable::removeFromLegend() const
+{
+  if (!mParentPlot->legend)
+    return false;
+  
+  if (QCPPlottableLegendItem *lip = mParentPlot->legend->itemWithPlottable(this))
+    return mParentPlot->legend->removeItem(lip);
+  else
+    return false;
+}
+
+/* inherits documentation from base class */
+QRect QCPAbstractPlottable::clipRect() const
+{
+  if (mKeyAxis && mValueAxis)
+    return mKeyAxis.data()->axisRect()->rect() & mValueAxis.data()->axisRect()->rect();
+  else
+    return QRect();
+}
+
+/* inherits documentation from base class */
+QCP::Interaction QCPAbstractPlottable::selectionCategory() const
+{
+  return QCP::iSelectPlottables;
+}
+
+/*! \internal
+  
+  Convenience function for transforming a key/value pair to pixels on the QCustomPlot surface,
+  taking the orientations of the axes associated with this plottable into account (e.g. whether key
+  represents x or y).
+  
+  \a key and \a value are transformed to the coodinates in pixels and are written to \a x and \a y.
+    
+  \see pixelsToCoords, QCPAxis::coordToPixel
+*/
+void QCPAbstractPlottable::coordsToPixels(double key, double value, double &x, double &y) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    x = keyAxis->coordToPixel(key);
+    y = valueAxis->coordToPixel(value);
+  } else
+  {
+    y = keyAxis->coordToPixel(key);
+    x = valueAxis->coordToPixel(value);
+  }
+}
+
+/*! \internal
+  \overload
+  
+  Returns the input as pixel coordinates in a QPointF.
+*/
+const QPointF QCPAbstractPlottable::coordsToPixels(double key, double value) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); }
+  
+  if (keyAxis->orientation() == Qt::Horizontal)
+    return QPointF(keyAxis->coordToPixel(key), valueAxis->coordToPixel(value));
+  else
+    return QPointF(valueAxis->coordToPixel(value), keyAxis->coordToPixel(key));
+}
+
+/*! \internal
+  
+  Convenience function for transforming a x/y pixel pair on the QCustomPlot surface to plot coordinates,
+  taking the orientations of the axes associated with this plottable into account (e.g. whether key
+  represents x or y).
+  
+  \a x and \a y are transformed to the plot coodinates and are written to \a key and \a value.
+    
+  \see coordsToPixels, QCPAxis::coordToPixel
+*/
+void QCPAbstractPlottable::pixelsToCoords(double x, double y, double &key, double &value) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    key = keyAxis->pixelToCoord(x);
+    value = valueAxis->pixelToCoord(y);
+  } else
+  {
+    key = keyAxis->pixelToCoord(y);
+    value = valueAxis->pixelToCoord(x);
+  }
+}
+
+/*! \internal
+  \overload
+
+  Returns the pixel input \a pixelPos as plot coordinates \a key and \a value.
+*/
+void QCPAbstractPlottable::pixelsToCoords(const QPointF &pixelPos, double &key, double &value) const
+{
+  pixelsToCoords(pixelPos.x(), pixelPos.y(), key, value);
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines of the plottable. Returns mPen when the
+  graph is not selected and mSelectedPen when it is.
+*/
+QPen QCPAbstractPlottable::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+/*! \internal
+
+  Returns the brush that should be used for drawing fills of the plottable. Returns mBrush when the
+  graph is not selected and mSelectedBrush when it is.
+*/
+QBrush QCPAbstractPlottable::mainBrush() const
+{
+  return mSelected ? mSelectedBrush : mBrush;
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing plottable lines.
+
+  This is the antialiasing state the painter passed to the \ref draw method is in by default.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased, applyFillAntialiasingHint, applyScattersAntialiasingHint, applyErrorBarsAntialiasingHint
+*/
+void QCPAbstractPlottable::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiased, QCP::aePlottables);
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing plottable fills.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased, applyDefaultAntialiasingHint, applyScattersAntialiasingHint, applyErrorBarsAntialiasingHint
+*/
+void QCPAbstractPlottable::applyFillAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiasedFill, QCP::aeFills);
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing plottable scatter points.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased, applyFillAntialiasingHint, applyDefaultAntialiasingHint, applyErrorBarsAntialiasingHint
+*/
+void QCPAbstractPlottable::applyScattersAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiasedScatters, QCP::aeScatters);
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing plottable error bars.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased, applyFillAntialiasingHint, applyScattersAntialiasingHint, applyDefaultAntialiasingHint
+*/
+void QCPAbstractPlottable::applyErrorBarsAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiasedErrorBars, QCP::aeErrorBars);
+}
+
+/*! \internal
+
+  Finds the shortest squared distance of \a point to the line segment defined by \a start and \a
+  end.
+  
+  This function may be used to help with the implementation of the \ref selectTest function for
+  specific plottables.
+  
+  \note This function is identical to QCPAbstractItem::distSqrToLine
+*/
+double QCPAbstractPlottable::distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const
+{
+  QVector2D a(start);
+  QVector2D b(end);
+  QVector2D p(point);
+  QVector2D v(b-a);
+  
+  double vLengthSqr = v.lengthSquared();
+  if (!qFuzzyIsNull(vLengthSqr))
+  {
+    double mu = QVector2D::dotProduct(p-a, v)/vLengthSqr;
+    if (mu < 0)
+      return (a-p).lengthSquared();
+    else if (mu > 1)
+      return (b-p).lengthSquared();
+    else
+      return ((a + mu*v)-p).lengthSquared();
+  } else
+    return (a-p).lengthSquared();
+}
+
+/* inherits documentation from base class */
+void QCPAbstractPlottable::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged)
+{
+  Q_UNUSED(event)
+  Q_UNUSED(details)
+  if (mSelectable)
+  {
+    bool selBefore = mSelected;
+    setSelected(additive ? !mSelected : true);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPAbstractPlottable::deselectEvent(bool *selectionStateChanged)
+{
+  if (mSelectable)
+  {
+    bool selBefore = mSelected;
+    setSelected(false);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemAnchor
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemAnchor
+  \brief An anchor of an item to which positions can be attached to.
+  
+  An item (QCPAbstractItem) may have one or more anchors. Unlike QCPItemPosition, an anchor doesn't
+  control anything on its item, but provides a way to tie other items via their positions to the
+  anchor.
+
+  For example, a QCPItemRect is defined by its positions \a topLeft and \a bottomRight.
+  Additionally it has various anchors like \a top, \a topRight or \a bottomLeft etc. So you can
+  attach the \a start (which is a QCPItemPosition) of a QCPItemLine to one of the anchors by
+  calling QCPItemPosition::setParentAnchor on \a start, passing the wanted anchor of the
+  QCPItemRect. This way the start of the line will now always follow the respective anchor location
+  on the rect item.
+  
+  Note that QCPItemPosition derives from QCPItemAnchor, so every position can also serve as an
+  anchor to other positions.
+  
+  To learn how to provide anchors in your own item subclasses, see the subclassing section of the
+  QCPAbstractItem documentation.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn virtual QCPItemPosition *QCPItemAnchor::toQCPItemPosition()
+  
+  Returns 0 if this instance is merely a QCPItemAnchor, and a valid pointer of type QCPItemPosition* if
+  it actually is a QCPItemPosition (which is a subclass of QCPItemAnchor).
+  
+  This safe downcast functionality could also be achieved with a dynamic_cast. However, QCustomPlot avoids
+  dynamic_cast to work with projects that don't have RTTI support enabled (e.g. -fno-rtti flag with
+  gcc compiler).
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates a new QCPItemAnchor. You shouldn't create QCPItemAnchor instances directly, even if
+  you want to make a new item subclass. Use \ref QCPAbstractItem::createAnchor instead, as
+  explained in the subclassing section of the QCPAbstractItem documentation.
+*/
+QCPItemAnchor::QCPItemAnchor(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name, int anchorId) :
+  mName(name),
+  mParentPlot(parentPlot),
+  mParentItem(parentItem),
+  mAnchorId(anchorId)
+{
+}
+
+QCPItemAnchor::~QCPItemAnchor()
+{
+  // unregister as parent at children:
+  foreach (QCPItemPosition *child, mChildrenX.toList())
+  {
+    if (child->parentAnchorX() == this)
+      child->setParentAnchorX(0); // this acts back on this anchor and child removes itself from mChildrenX
+  }
+  foreach (QCPItemPosition *child, mChildrenY.toList())
+  {
+    if (child->parentAnchorY() == this)
+      child->setParentAnchorY(0); // this acts back on this anchor and child removes itself from mChildrenY
+  }
+}
+
+/*!
+  Returns the final absolute pixel position of the QCPItemAnchor on the QCustomPlot surface.
+  
+  The pixel information is internally retrieved via QCPAbstractItem::anchorPixelPosition of the
+  parent item, QCPItemAnchor is just an intermediary.
+*/
+QPointF QCPItemAnchor::pixelPoint() const
+{
+  if (mParentItem)
+  {
+    if (mAnchorId > -1)
+    {
+      return mParentItem->anchorPixelPoint(mAnchorId);
+    } else
+    {
+      qDebug() << Q_FUNC_INFO << "no valid anchor id set:" << mAnchorId;
+      return QPointF();
+    }
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "no parent item set";
+    return QPointF();
+  }
+}
+
+/*! \internal
+
+  Adds \a pos to the childX list of this anchor, which keeps track of which children use this
+  anchor as parent anchor for the respective coordinate. This is necessary to notify the children
+  prior to destruction of the anchor.
+  
+  Note that this function does not change the parent setting in \a pos.
+*/
+void QCPItemAnchor::addChildX(QCPItemPosition *pos)
+{
+  if (!mChildrenX.contains(pos))
+    mChildrenX.insert(pos);
+  else
+    qDebug() << Q_FUNC_INFO << "provided pos is child already" << reinterpret_cast<quintptr>(pos);
+}
+
+/*! \internal
+
+  Removes \a pos from the childX list of this anchor.
+  
+  Note that this function does not change the parent setting in \a pos.
+*/
+void QCPItemAnchor::removeChildX(QCPItemPosition *pos)
+{
+  if (!mChildrenX.remove(pos))
+    qDebug() << Q_FUNC_INFO << "provided pos isn't child" << reinterpret_cast<quintptr>(pos);
+}
+
+/*! \internal
+
+  Adds \a pos to the childY list of this anchor, which keeps track of which children use this
+  anchor as parent anchor for the respective coordinate. This is necessary to notify the children
+  prior to destruction of the anchor.
+  
+  Note that this function does not change the parent setting in \a pos.
+*/
+void QCPItemAnchor::addChildY(QCPItemPosition *pos)
+{
+  if (!mChildrenY.contains(pos))
+    mChildrenY.insert(pos);
+  else
+    qDebug() << Q_FUNC_INFO << "provided pos is child already" << reinterpret_cast<quintptr>(pos);
+}
+
+/*! \internal
+
+  Removes \a pos from the childY list of this anchor.
+  
+  Note that this function does not change the parent setting in \a pos.
+*/
+void QCPItemAnchor::removeChildY(QCPItemPosition *pos)
+{
+  if (!mChildrenY.remove(pos))
+    qDebug() << Q_FUNC_INFO << "provided pos isn't child" << reinterpret_cast<quintptr>(pos);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemPosition
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemPosition
+  \brief Manages the position of an item.
+  
+  Every item has at least one public QCPItemPosition member pointer which provides ways to position the
+  item on the QCustomPlot surface. Some items have multiple positions, for example QCPItemRect has two:
+  \a topLeft and \a bottomRight.
+
+  QCPItemPosition has a type (\ref PositionType) that can be set with \ref setType. This type
+  defines how coordinates passed to \ref setCoords are to be interpreted, e.g. as absolute pixel
+  coordinates, as plot coordinates of certain axes, etc. For more advanced plots it is also
+  possible to assign different types per X/Y coordinate of the position (see \ref setTypeX, \ref
+  setTypeY). This way an item could be positioned at a fixed pixel distance from the top in the Y
+  direction, while following a plot coordinate in the X direction.
+
+  A QCPItemPosition may have a parent QCPItemAnchor, see \ref setParentAnchor. This way you can tie
+  multiple items together. If the QCPItemPosition has a parent, its coordinates (\ref setCoords)
+  are considered to be absolute pixels in the reference frame of the parent anchor, where (0, 0)
+  means directly ontop of the parent anchor. For example, You could attach the \a start position of
+  a QCPItemLine to the \a bottom anchor of a QCPItemText to make the starting point of the line
+  always be centered under the text label, no matter where the text is moved to. For more advanced
+  plots, it is possible to assign different parent anchors per X/Y coordinate of the position, see
+  \ref setParentAnchorX, \ref setParentAnchorY. This way an item could follow another item in the X
+  direction but stay at a fixed position in the Y direction. Or even follow item A in X, and item B
+  in Y.
+
+  Note that every QCPItemPosition inherits from QCPItemAnchor and thus can itself be used as parent
+  anchor for other positions.
+
+  To set the apparent pixel position on the QCustomPlot surface directly, use \ref setPixelPoint. This
+  works no matter what type this QCPItemPosition is or what parent-child situation it is in, as \ref
+  setPixelPoint transforms the coordinates appropriately, to make the position appear at the specified
+  pixel values.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QCPItemPosition::PositionType *QCPItemPosition::type() const
+  
+  Returns the current position type.
+  
+  If different types were set for X and Y (\ref setTypeX, \ref setTypeY), this method returns the
+  type of the X coordinate. In that case rather use \a typeX() and \a typeY().
+  
+  \see setType
+*/
+
+/*! \fn QCPItemAnchor *QCPItemPosition::parentAnchor() const
+  
+  Returns the current parent anchor.
+  
+  If different parent anchors were set for X and Y (\ref setParentAnchorX, \ref setParentAnchorY),
+  this method returns the parent anchor of the Y coordinate. In that case rather use \a
+  parentAnchorX() and \a parentAnchorY().
+  
+  \see setParentAnchor
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates a new QCPItemPosition. You shouldn't create QCPItemPosition instances directly, even if
+  you want to make a new item subclass. Use \ref QCPAbstractItem::createPosition instead, as
+  explained in the subclassing section of the QCPAbstractItem documentation.
+*/
+QCPItemPosition::QCPItemPosition(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name) :
+  QCPItemAnchor(parentPlot, parentItem, name),
+  mPositionTypeX(ptAbsolute),
+  mPositionTypeY(ptAbsolute),
+  mKey(0),
+  mValue(0),
+  mParentAnchorX(0),
+  mParentAnchorY(0)
+{
+}
+
+QCPItemPosition::~QCPItemPosition()
+{
+  // unregister as parent at children:
+  // Note: this is done in ~QCPItemAnchor again, but it's important QCPItemPosition does it itself, because only then
+  //       the setParentAnchor(0) call the correct QCPItemPosition::pixelPoint function instead of QCPItemAnchor::pixelPoint
+  foreach (QCPItemPosition *child, mChildrenX.toList())
+  {
+    if (child->parentAnchorX() == this)
+      child->setParentAnchorX(0); // this acts back on this anchor and child removes itself from mChildrenX
+  }
+  foreach (QCPItemPosition *child, mChildrenY.toList())
+  {
+    if (child->parentAnchorY() == this)
+      child->setParentAnchorY(0); // this acts back on this anchor and child removes itself from mChildrenY
+  }
+  // unregister as child in parent:
+  if (mParentAnchorX)
+    mParentAnchorX->removeChildX(this);
+  if (mParentAnchorY)
+    mParentAnchorY->removeChildY(this);
+}
+
+/* can't make this a header inline function, because QPointer breaks with forward declared types, see QTBUG-29588 */
+QCPAxisRect *QCPItemPosition::axisRect() const
+{
+  return mAxisRect.data();
+}
+
+/*!
+  Sets the type of the position. The type defines how the coordinates passed to \ref setCoords
+  should be handled and how the QCPItemPosition should behave in the plot.
+  
+  The possible values for \a type can be separated in two main categories:
+
+  \li The position is regarded as a point in plot coordinates. This corresponds to \ref ptPlotCoords
+  and requires two axes that define the plot coordinate system. They can be specified with \ref setAxes.
+  By default, the QCustomPlot's x- and yAxis are used.
+  
+  \li The position is fixed on the QCustomPlot surface, i.e. independent of axis ranges. This
+  corresponds to all other types, i.e. \ref ptAbsolute, \ref ptViewportRatio and \ref
+  ptAxisRectRatio. They differ only in the way the absolute position is described, see the
+  documentation of \ref PositionType for details. For \ref ptAxisRectRatio, note that you can specify
+  the axis rect with \ref setAxisRect. By default this is set to the main axis rect.
+  
+  Note that the position type \ref ptPlotCoords is only available (and sensible) when the position
+  has no parent anchor (\ref setParentAnchor).
+  
+  If the type is changed, the apparent pixel position on the plot is preserved. This means
+  the coordinates as retrieved with coords() and set with \ref setCoords may change in the process.
+  
+  This method sets the type for both X and Y directions. It is also possible to set different types
+  for X and Y, see \ref setTypeX, \ref setTypeY.
+*/
+void QCPItemPosition::setType(QCPItemPosition::PositionType type)
+{
+  setTypeX(type);
+  setTypeY(type);
+}
+
+/*!
+  This method sets the position type of the X coordinate to \a type.
+  
+  For a detailed description of what a position type is, see the documentation of \ref setType.
+  
+  \see setType, setTypeY
+*/
+void QCPItemPosition::setTypeX(QCPItemPosition::PositionType type)
+{
+  if (mPositionTypeX != type)
+  {
+    // if switching from or to coordinate type that isn't valid (e.g. because axes or axis rect
+    // were deleted), don't try to recover the pixelPoint() because it would output a qDebug warning.
+    bool retainPixelPosition = true;
+    if ((mPositionTypeX == ptPlotCoords || type == ptPlotCoords) && (!mKeyAxis || !mValueAxis))
+      retainPixelPosition = false;
+    if ((mPositionTypeX == ptAxisRectRatio || type == ptAxisRectRatio) && (!mAxisRect))
+      retainPixelPosition = false;
+    
+    QPointF pixel;
+    if (retainPixelPosition)
+      pixel = pixelPoint();
+    
+    mPositionTypeX = type;
+    
+    if (retainPixelPosition)
+      setPixelPoint(pixel);
+  }
+}
+
+/*!
+  This method sets the position type of the Y coordinate to \a type.
+  
+  For a detailed description of what a position type is, see the documentation of \ref setType.
+  
+  \see setType, setTypeX
+*/
+void QCPItemPosition::setTypeY(QCPItemPosition::PositionType type)
+{
+  if (mPositionTypeY != type)
+  {
+    // if switching from or to coordinate type that isn't valid (e.g. because axes or axis rect
+    // were deleted), don't try to recover the pixelPoint() because it would output a qDebug warning.
+    bool retainPixelPosition = true;
+    if ((mPositionTypeY == ptPlotCoords || type == ptPlotCoords) && (!mKeyAxis || !mValueAxis))
+      retainPixelPosition = false;
+    if ((mPositionTypeY == ptAxisRectRatio || type == ptAxisRectRatio) && (!mAxisRect))
+      retainPixelPosition = false;
+    
+    QPointF pixel;
+    if (retainPixelPosition)
+      pixel = pixelPoint();
+    
+    mPositionTypeY = type;
+    
+    if (retainPixelPosition)
+      setPixelPoint(pixel);
+  }
+}
+
+/*!
+  Sets the parent of this QCPItemPosition to \a parentAnchor. This means the position will now
+  follow any position changes of the anchor. The local coordinate system of positions with a parent
+  anchor always is absolute pixels, with (0, 0) being exactly on top of the parent anchor. (Hence
+  the type shouldn't be set to \ref ptPlotCoords for positions with parent anchors.)
+  
+  if \a keepPixelPosition is true, the current pixel position of the QCPItemPosition is preserved
+  during reparenting. If it's set to false, the coordinates are set to (0, 0), i.e. the position
+  will be exactly on top of the parent anchor.
+  
+  To remove this QCPItemPosition from any parent anchor, set \a parentAnchor to 0.
+  
+  If the QCPItemPosition previously had no parent and the type is \ref ptPlotCoords, the type is
+  set to \ref ptAbsolute, to keep the position in a valid state.
+  
+  This method sets the parent anchor for both X and Y directions. It is also possible to set
+  different parents for X and Y, see \ref setParentAnchorX, \ref setParentAnchorY.
+*/
+bool QCPItemPosition::setParentAnchor(QCPItemAnchor *parentAnchor, bool keepPixelPosition)
+{
+  bool successX = setParentAnchorX(parentAnchor, keepPixelPosition);
+  bool successY = setParentAnchorY(parentAnchor, keepPixelPosition);
+  return successX && successY;
+}
+
+/*!
+  This method sets the parent anchor of the X coordinate to \a parentAnchor.
+  
+  For a detailed description of what a parent anchor is, see the documentation of \ref setParentAnchor.
+  
+  \see setParentAnchor, setParentAnchorY
+*/
+bool QCPItemPosition::setParentAnchorX(QCPItemAnchor *parentAnchor, bool keepPixelPosition)
+{
+  // make sure self is not assigned as parent:
+  if (parentAnchor == this)
+  {
+    qDebug() << Q_FUNC_INFO << "can't set self as parent anchor" << reinterpret_cast<quintptr>(parentAnchor);
+    return false;
+  }
+  // make sure no recursive parent-child-relationships are created:
+  QCPItemAnchor *currentParent = parentAnchor;
+  while (currentParent)
+  {
+    if (QCPItemPosition *currentParentPos = currentParent->toQCPItemPosition())
+    {
+      // is a QCPItemPosition, might have further parent, so keep iterating
+      if (currentParentPos == this)
+      {
+        qDebug() << Q_FUNC_INFO << "can't create recursive parent-child-relationship" << reinterpret_cast<quintptr>(parentAnchor);
+        return false;
+      }
+      currentParent = currentParentPos->parentAnchorX();
+    } else
+    {
+      // is a QCPItemAnchor, can't have further parent. Now make sure the parent items aren't the
+      // same, to prevent a position being child of an anchor which itself depends on the position,
+      // because they're both on the same item:
+      if (currentParent->mParentItem == mParentItem)
+      {
+        qDebug() << Q_FUNC_INFO << "can't set parent to be an anchor which itself depends on this position" << reinterpret_cast<quintptr>(parentAnchor);
+        return false;
+      }
+      break;
+    }
+  }
+  
+  // if previously no parent set and PosType is still ptPlotCoords, set to ptAbsolute:
+  if (!mParentAnchorX && mPositionTypeX == ptPlotCoords)
+    setTypeX(ptAbsolute);
+  
+  // save pixel position:
+  QPointF pixelP;
+  if (keepPixelPosition)
+    pixelP = pixelPoint();
+  // unregister at current parent anchor:
+  if (mParentAnchorX)
+    mParentAnchorX->removeChildX(this);
+  // register at new parent anchor:
+  if (parentAnchor)
+    parentAnchor->addChildX(this);
+  mParentAnchorX = parentAnchor;
+  // restore pixel position under new parent:
+  if (keepPixelPosition)
+    setPixelPoint(pixelP);
+  else
+    setCoords(0, coords().y());
+  return true;
+}
+
+/*!
+  This method sets the parent anchor of the Y coordinate to \a parentAnchor.
+  
+  For a detailed description of what a parent anchor is, see the documentation of \ref setParentAnchor.
+  
+  \see setParentAnchor, setParentAnchorX
+*/
+bool QCPItemPosition::setParentAnchorY(QCPItemAnchor *parentAnchor, bool keepPixelPosition)
+{
+  // make sure self is not assigned as parent:
+  if (parentAnchor == this)
+  {
+    qDebug() << Q_FUNC_INFO << "can't set self as parent anchor" << reinterpret_cast<quintptr>(parentAnchor);
+    return false;
+  }
+  // make sure no recursive parent-child-relationships are created:
+  QCPItemAnchor *currentParent = parentAnchor;
+  while (currentParent)
+  {
+    if (QCPItemPosition *currentParentPos = currentParent->toQCPItemPosition())
+    {
+      // is a QCPItemPosition, might have further parent, so keep iterating
+      if (currentParentPos == this)
+      {
+        qDebug() << Q_FUNC_INFO << "can't create recursive parent-child-relationship" << reinterpret_cast<quintptr>(parentAnchor);
+        return false;
+      }
+      currentParent = currentParentPos->parentAnchorY();
+    } else
+    {
+      // is a QCPItemAnchor, can't have further parent. Now make sure the parent items aren't the
+      // same, to prevent a position being child of an anchor which itself depends on the position,
+      // because they're both on the same item:
+      if (currentParent->mParentItem == mParentItem)
+      {
+        qDebug() << Q_FUNC_INFO << "can't set parent to be an anchor which itself depends on this position" << reinterpret_cast<quintptr>(parentAnchor);
+        return false;
+      }
+      break;
+    }
+  }
+  
+  // if previously no parent set and PosType is still ptPlotCoords, set to ptAbsolute:
+  if (!mParentAnchorY && mPositionTypeY == ptPlotCoords)
+    setTypeY(ptAbsolute);
+  
+  // save pixel position:
+  QPointF pixelP;
+  if (keepPixelPosition)
+    pixelP = pixelPoint();
+  // unregister at current parent anchor:
+  if (mParentAnchorY)
+    mParentAnchorY->removeChildY(this);
+  // register at new parent anchor:
+  if (parentAnchor)
+    parentAnchor->addChildY(this);
+  mParentAnchorY = parentAnchor;
+  // restore pixel position under new parent:
+  if (keepPixelPosition)
+    setPixelPoint(pixelP);
+  else
+    setCoords(coords().x(), 0);
+  return true;
+}
+
+/*!
+  Sets the coordinates of this QCPItemPosition. What the coordinates mean, is defined by the type
+  (\ref setType, \ref setTypeX, \ref setTypeY).
+  
+  For example, if the type is \ref ptAbsolute, \a key and \a value mean the x and y pixel position
+  on the QCustomPlot surface. In that case the origin (0, 0) is in the top left corner of the
+  QCustomPlot viewport. If the type is \ref ptPlotCoords, \a key and \a value mean a point in the
+  plot coordinate system defined by the axes set by \ref setAxes. By default those are the
+  QCustomPlot's xAxis and yAxis. See the documentation of \ref setType for other available
+  coordinate types and their meaning.
+  
+  If different types were configured for X and Y (\ref setTypeX, \ref setTypeY), \a key and \a
+  value must also be provided in the different coordinate systems. Here, the X type refers to \a
+  key, and the Y type refers to \a value.
+
+  \see setPixelPoint
+*/
+void QCPItemPosition::setCoords(double key, double value)
+{
+  mKey = key;
+  mValue = value;
+}
+
+/*! \overload
+
+  Sets the coordinates as a QPointF \a pos where pos.x has the meaning of \a key and pos.y the
+  meaning of \a value of the \ref setCoords(double key, double value) method.
+*/
+void QCPItemPosition::setCoords(const QPointF &pos)
+{
+  setCoords(pos.x(), pos.y());
+}
+
+/*!
+  Returns the final absolute pixel position of the QCPItemPosition on the QCustomPlot surface. It
+  includes all effects of type (\ref setType) and possible parent anchors (\ref setParentAnchor).
+
+  \see setPixelPoint
+*/
+QPointF QCPItemPosition::pixelPoint() const
+{
+  QPointF result;
+  
+  // determine X:
+  switch (mPositionTypeX)
+  {
+    case ptAbsolute:
+    {
+      result.rx() = mKey;
+      if (mParentAnchorX)
+        result.rx() += mParentAnchorX->pixelPoint().x();
+      break;
+    }
+    case ptViewportRatio:
+    {
+      result.rx() = mKey*mParentPlot->viewport().width();
+      if (mParentAnchorX)
+        result.rx() += mParentAnchorX->pixelPoint().x();
+      else
+        result.rx() += mParentPlot->viewport().left();
+      break;
+    }
+    case ptAxisRectRatio:
+    {
+      if (mAxisRect)
+      {
+        result.rx() = mKey*mAxisRect.data()->width();
+        if (mParentAnchorX)
+          result.rx() += mParentAnchorX->pixelPoint().x();
+        else
+          result.rx() += mAxisRect.data()->left();
+      } else
+        qDebug() << Q_FUNC_INFO << "Item position type x is ptAxisRectRatio, but no axis rect was defined";
+      break;
+    }
+    case ptPlotCoords:
+    {
+      if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Horizontal)
+        result.rx() = mKeyAxis.data()->coordToPixel(mKey);
+      else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Horizontal)
+        result.rx() = mValueAxis.data()->coordToPixel(mValue);
+      else
+        qDebug() << Q_FUNC_INFO << "Item position type x is ptPlotCoords, but no axes were defined";
+      break;
+    }
+  }
+  
+  // determine Y:
+  switch (mPositionTypeY)
+  {
+    case ptAbsolute:
+    {
+      result.ry() = mValue;
+      if (mParentAnchorY)
+        result.ry() += mParentAnchorY->pixelPoint().y();
+      break;
+    }
+    case ptViewportRatio:
+    {
+      result.ry() = mValue*mParentPlot->viewport().height();
+      if (mParentAnchorY)
+        result.ry() += mParentAnchorY->pixelPoint().y();
+      else
+        result.ry() += mParentPlot->viewport().top();
+      break;
+    }
+    case ptAxisRectRatio:
+    {
+      if (mAxisRect)
+      {
+        result.ry() = mValue*mAxisRect.data()->height();
+        if (mParentAnchorY)
+          result.ry() += mParentAnchorY->pixelPoint().y();
+        else
+          result.ry() += mAxisRect.data()->top();
+      } else
+        qDebug() << Q_FUNC_INFO << "Item position type y is ptAxisRectRatio, but no axis rect was defined";
+      break;
+    }
+    case ptPlotCoords:
+    {
+      if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Vertical)
+        result.ry() = mKeyAxis.data()->coordToPixel(mKey);
+      else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Vertical)
+        result.ry() = mValueAxis.data()->coordToPixel(mValue);
+      else
+        qDebug() << Q_FUNC_INFO << "Item position type y is ptPlotCoords, but no axes were defined";
+      break;
+    }
+  }
+  
+  return result;
+}
+
+/*!
+  When \ref setType is \ref ptPlotCoords, this function may be used to specify the axes the
+  coordinates set with \ref setCoords relate to. By default they are set to the initial xAxis and
+  yAxis of the QCustomPlot.
+*/
+void QCPItemPosition::setAxes(QCPAxis *keyAxis, QCPAxis *valueAxis)
+{
+  mKeyAxis = keyAxis;
+  mValueAxis = valueAxis;
+}
+
+/*!
+  When \ref setType is \ref ptAxisRectRatio, this function may be used to specify the axis rect the
+  coordinates set with \ref setCoords relate to. By default this is set to the main axis rect of
+  the QCustomPlot.
+*/
+void QCPItemPosition::setAxisRect(QCPAxisRect *axisRect)
+{
+  mAxisRect = axisRect;
+}
+
+/*!
+  Sets the apparent pixel position. This works no matter what type (\ref setType) this
+  QCPItemPosition is or what parent-child situation it is in, as coordinates are transformed
+  appropriately, to make the position finally appear at the specified pixel values.
+
+  Only if the type is \ref ptAbsolute and no parent anchor is set, this function's effect is
+  identical to that of \ref setCoords.
+
+  \see pixelPoint, setCoords
+*/
+void QCPItemPosition::setPixelPoint(const QPointF &pixelPoint)
+{
+  double x = pixelPoint.x();
+  double y = pixelPoint.y();
+  
+  switch (mPositionTypeX)
+  {
+    case ptAbsolute:
+    {
+      if (mParentAnchorX)
+        x -= mParentAnchorX->pixelPoint().x();
+      break;
+    }
+    case ptViewportRatio:
+    {
+      if (mParentAnchorX)
+        x -= mParentAnchorX->pixelPoint().x();
+      else
+        x -= mParentPlot->viewport().left();
+      x /= (double)mParentPlot->viewport().width();
+      break;
+    }
+    case ptAxisRectRatio:
+    {
+      if (mAxisRect)
+      {
+        if (mParentAnchorX)
+          x -= mParentAnchorX->pixelPoint().x();
+        else
+          x -= mAxisRect.data()->left();
+        x /= (double)mAxisRect.data()->width();
+      } else
+        qDebug() << Q_FUNC_INFO << "Item position type x is ptAxisRectRatio, but no axis rect was defined";
+      break;
+    }
+    case ptPlotCoords:
+    {
+      if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Horizontal)
+        x = mKeyAxis.data()->pixelToCoord(x);
+      else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Horizontal)
+        y = mValueAxis.data()->pixelToCoord(x);
+      else
+        qDebug() << Q_FUNC_INFO << "Item position type x is ptPlotCoords, but no axes were defined";
+      break;
+    }
+  }
+  
+  switch (mPositionTypeY)
+  {
+    case ptAbsolute:
+    {
+      if (mParentAnchorY)
+        y -= mParentAnchorY->pixelPoint().y();
+      break;
+    }
+    case ptViewportRatio:
+    {
+      if (mParentAnchorY)
+        y -= mParentAnchorY->pixelPoint().y();
+      else
+        y -= mParentPlot->viewport().top();
+      y /= (double)mParentPlot->viewport().height();
+      break;
+    }
+    case ptAxisRectRatio:
+    {
+      if (mAxisRect)
+      {
+        if (mParentAnchorY)
+          y -= mParentAnchorY->pixelPoint().y();
+        else
+          y -= mAxisRect.data()->top();
+        y /= (double)mAxisRect.data()->height();
+      } else
+        qDebug() << Q_FUNC_INFO << "Item position type y is ptAxisRectRatio, but no axis rect was defined";
+      break;
+    }
+    case ptPlotCoords:
+    {
+      if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Vertical)
+        x = mKeyAxis.data()->pixelToCoord(y);
+      else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Vertical)
+        y = mValueAxis.data()->pixelToCoord(y);
+      else
+        qDebug() << Q_FUNC_INFO << "Item position type y is ptPlotCoords, but no axes were defined";
+      break;
+    }
+  }
+  
+  setCoords(x, y);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPAbstractItem
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPAbstractItem
+  \brief The abstract base class for all items in a plot.
+  
+  In QCustomPlot, items are supplemental graphical elements that are neither plottables
+  (QCPAbstractPlottable) nor axes (QCPAxis). While plottables are always tied to two axes and thus
+  plot coordinates, items can also be placed in absolute coordinates independent of any axes. Each
+  specific item has at least one QCPItemPosition member which controls the positioning. Some items
+  are defined by more than one coordinate and thus have two or more QCPItemPosition members (For
+  example, QCPItemRect has \a topLeft and \a bottomRight).
+  
+  This abstract base class defines a very basic interface like visibility and clipping. Since this
+  class is abstract, it can't be instantiated. Use one of the subclasses or create a subclass
+  yourself to create new items.
+  
+  The built-in items are:
+  <table>
+  <tr><td>QCPItemLine</td><td>A line defined by a start and an end point. May have different ending styles on each side (e.g. arrows).</td></tr>
+  <tr><td>QCPItemStraightLine</td><td>A straight line defined by a start and a direction point. Unlike QCPItemLine, the straight line is infinitely long and has no endings.</td></tr>
+  <tr><td>QCPItemCurve</td><td>A curve defined by start, end and two intermediate control points. May have different ending styles on each side (e.g. arrows).</td></tr>
+  <tr><td>QCPItemRect</td><td>A rectangle</td></tr>
+  <tr><td>QCPItemEllipse</td><td>An ellipse</td></tr>
+  <tr><td>QCPItemPixmap</td><td>An arbitrary pixmap</td></tr>
+  <tr><td>QCPItemText</td><td>A text label</td></tr>
+  <tr><td>QCPItemBracket</td><td>A bracket which may be used to reference/highlight certain parts in the plot.</td></tr>
+  <tr><td>QCPItemTracer</td><td>An item that can be attached to a QCPGraph and sticks to its data points, given a key coordinate.</td></tr>
+  </table>
+  
+  \section items-clipping Clipping
+
+  Items are by default clipped to the main axis rect (they are only visible inside the axis rect).
+  To make an item visible outside that axis rect, disable clipping via \ref setClipToAxisRect
+  "setClipToAxisRect(false)".
+
+  On the other hand if you want the item to be clipped to a different axis rect, specify it via
+  \ref setClipAxisRect. This clipAxisRect property of an item is only used for clipping behaviour, and
+  in principle is independent of the coordinate axes the item might be tied to via its position
+  members (\ref QCPItemPosition::setAxes). However, it is common that the axis rect for clipping
+  also contains the axes used for the item positions.
+  
+  \section items-using Using items
+  
+  First you instantiate the item you want to use and add it to the plot:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-1
+  by default, the positions of the item are bound to the x- and y-Axis of the plot. So we can just
+  set the plot coordinates where the line should start/end:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-2
+  If we don't want the line to be positioned in plot coordinates but a different coordinate system,
+  e.g. absolute pixel positions on the QCustomPlot surface, we need to change the position type like this:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-3
+  Then we can set the coordinates, this time in pixels:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-4
+  and make the line visible on the entire QCustomPlot, by disabling clipping to the axis rect:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-5
+  
+  For more advanced plots, it is even possible to set different types and parent anchors per X/Y
+  coordinate of an item position, using for example \ref QCPItemPosition::setTypeX or \ref
+  QCPItemPosition::setParentAnchorX. For details, see the documentation of \ref QCPItemPosition.
+  
+  \section items-subclassing Creating own items
+  
+  To create an own item, you implement a subclass of QCPAbstractItem. These are the pure
+  virtual functions, you must implement:
+  \li \ref selectTest
+  \li \ref draw
+  
+  See the documentation of those functions for what they need to do.
+  
+  \subsection items-positioning Allowing the item to be positioned
+  
+  As mentioned, item positions are represented by QCPItemPosition members. Let's assume the new item shall
+  have only one point as its position (as opposed to two like a rect or multiple like a polygon). You then add
+  a public member of type QCPItemPosition like so:
+  
+  \code QCPItemPosition * const myPosition;\endcode
+  
+  the const makes sure the pointer itself can't be modified from the user of your new item (the QCPItemPosition
+  instance it points to, can be modified, of course).
+  The initialization of this pointer is made easy with the \ref createPosition function. Just assign
+  the return value of this function to each QCPItemPosition in the constructor of your item. \ref createPosition
+  takes a string which is the name of the position, typically this is identical to the variable name.
+  For example, the constructor of QCPItemExample could look like this:
+  
+  \code
+  QCPItemExample::QCPItemExample(QCustomPlot *parentPlot) :
+    QCPAbstractItem(parentPlot),
+    myPosition(createPosition("myPosition"))
+  {
+    // other constructor code
+  }
+  \endcode
+  
+  \subsection items-drawing The draw function
+  
+  To give your item a visual representation, reimplement the \ref draw function and use the passed
+  QCPPainter to draw the item. You can retrieve the item position in pixel coordinates from the
+  position member(s) via \ref QCPItemPosition::pixelPoint.
+
+  To optimize performance you should calculate a bounding rect first (don't forget to take the pen
+  width into account), check whether it intersects the \ref clipRect, and only draw the item at all
+  if this is the case.
+  
+  \subsection items-selection The selectTest function
+  
+  Your implementation of the \ref selectTest function may use the helpers \ref distSqrToLine and
+  \ref rectSelectTest. With these, the implementation of the selection test becomes significantly
+  simpler for most items. See the documentation of \ref selectTest for what the function parameters
+  mean and what the function should return.
+  
+  \subsection anchors Providing anchors
+  
+  Providing anchors (QCPItemAnchor) starts off like adding a position. First you create a public
+  member, e.g.
+  
+  \code QCPItemAnchor * const bottom;\endcode
+
+  and create it in the constructor with the \ref createAnchor function, assigning it a name and an
+  anchor id (an integer enumerating all anchors on the item, you may create an own enum for this).
+  Since anchors can be placed anywhere, relative to the item's position(s), your item needs to
+  provide the position of every anchor with the reimplementation of the \ref anchorPixelPoint(int
+  anchorId) function.
+  
+  In essence the QCPItemAnchor is merely an intermediary that itself asks your item for the pixel
+  position when anything attached to the anchor needs to know the coordinates.
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn QList<QCPItemPosition*> QCPAbstractItem::positions() const
+  
+  Returns all positions of the item in a list.
+  
+  \see anchors, position
+*/
+
+/*! \fn QList<QCPItemAnchor*> QCPAbstractItem::anchors() const
+  
+  Returns all anchors of the item in a list. Note that since a position (QCPItemPosition) is always
+  also an anchor, the list will also contain the positions of this item.
+  
+  \see positions, anchor
+*/
+
+/* end of documentation of inline functions */
+/* start documentation of pure virtual functions */
+
+/*! \fn void QCPAbstractItem::draw(QCPPainter *painter) = 0
+  \internal
+  
+  Draws this item with the provided \a painter.
+  
+  The cliprect of the provided painter is set to the rect returned by \ref clipRect before this
+  function is called. The clipRect depends on the clipping settings defined by \ref
+  setClipToAxisRect and \ref setClipAxisRect.
+*/
+
+/* end documentation of pure virtual functions */
+/* start documentation of signals */
+
+/*! \fn void QCPAbstractItem::selectionChanged(bool selected)
+  This signal is emitted when the selection state of this item has changed, either by user interaction
+  or by a direct call to \ref setSelected.
+*/
+
+/* end documentation of signals */
+
+/*!
+  Base class constructor which initializes base class members.
+*/
+QCPAbstractItem::QCPAbstractItem(QCustomPlot *parentPlot) :
+  QCPLayerable(parentPlot),
+  mClipToAxisRect(false),
+  mSelectable(true),
+  mSelected(false)
+{
+  QList<QCPAxisRect*> rects = parentPlot->axisRects();
+  if (rects.size() > 0)
+  {
+    setClipToAxisRect(true);
+    setClipAxisRect(rects.first());
+  }
+}
+
+QCPAbstractItem::~QCPAbstractItem()
+{
+  // don't delete mPositions because every position is also an anchor and thus in mAnchors
+  qDeleteAll(mAnchors);
+}
+
+/* can't make this a header inline function, because QPointer breaks with forward declared types, see QTBUG-29588 */
+QCPAxisRect *QCPAbstractItem::clipAxisRect() const
+{
+  return mClipAxisRect.data();
+}
+
+/*!
+  Sets whether the item shall be clipped to an axis rect or whether it shall be visible on the
+  entire QCustomPlot. The axis rect can be set with \ref setClipAxisRect.
+  
+  \see setClipAxisRect
+*/
+void QCPAbstractItem::setClipToAxisRect(bool clip)
+{
+  mClipToAxisRect = clip;
+  if (mClipToAxisRect)
+    setParentLayerable(mClipAxisRect.data());
+}
+
+/*!
+  Sets the clip axis rect. It defines the rect that will be used to clip the item when \ref
+  setClipToAxisRect is set to true.
+  
+  \see setClipToAxisRect
+*/
+void QCPAbstractItem::setClipAxisRect(QCPAxisRect *rect)
+{
+  mClipAxisRect = rect;
+  if (mClipToAxisRect)
+    setParentLayerable(mClipAxisRect.data());
+}
+
+/*!
+  Sets whether the user can (de-)select this item by clicking on the QCustomPlot surface.
+  (When \ref QCustomPlot::setInteractions contains QCustomPlot::iSelectItems.)
+  
+  However, even when \a selectable was set to false, it is possible to set the selection manually,
+  by calling \ref setSelected.
+  
+  \see QCustomPlot::setInteractions, setSelected
+*/
+void QCPAbstractItem::setSelectable(bool selectable)
+{
+  if (mSelectable != selectable)
+  {
+    mSelectable = selectable;
+    emit selectableChanged(mSelectable);
+  }
+}
+
+/*!
+  Sets whether this item is selected or not. When selected, it might use a different visual
+  appearance (e.g. pen and brush), this depends on the specific item though.
+
+  The entire selection mechanism for items is handled automatically when \ref
+  QCustomPlot::setInteractions contains QCustomPlot::iSelectItems. You only need to call this
+  function when you wish to change the selection state manually.
+  
+  This function can change the selection state even when \ref setSelectable was set to false.
+  
+  emits the \ref selectionChanged signal when \a selected is different from the previous selection state.
+  
+  \see setSelectable, selectTest
+*/
+void QCPAbstractItem::setSelected(bool selected)
+{
+  if (mSelected != selected)
+  {
+    mSelected = selected;
+    emit selectionChanged(mSelected);
+  }
+}
+
+/*!
+  Returns the QCPItemPosition with the specified \a name. If this item doesn't have a position by
+  that name, returns 0.
+  
+  This function provides an alternative way to access item positions. Normally, you access
+  positions direcly by their member pointers (which typically have the same variable name as \a
+  name).
+  
+  \see positions, anchor
+*/
+QCPItemPosition *QCPAbstractItem::position(const QString &name) const
+{
+  for (int i=0; i<mPositions.size(); ++i)
+  {
+    if (mPositions.at(i)->name() == name)
+      return mPositions.at(i);
+  }
+  qDebug() << Q_FUNC_INFO << "position with name not found:" << name;
+  return 0;
+}
+
+/*!
+  Returns the QCPItemAnchor with the specified \a name. If this item doesn't have an anchor by
+  that name, returns 0.
+  
+  This function provides an alternative way to access item anchors. Normally, you access
+  anchors direcly by their member pointers (which typically have the same variable name as \a
+  name).
+  
+  \see anchors, position
+*/
+QCPItemAnchor *QCPAbstractItem::anchor(const QString &name) const
+{
+  for (int i=0; i<mAnchors.size(); ++i)
+  {
+    if (mAnchors.at(i)->name() == name)
+      return mAnchors.at(i);
+  }
+  qDebug() << Q_FUNC_INFO << "anchor with name not found:" << name;
+  return 0;
+}
+
+/*!
+  Returns whether this item has an anchor with the specified \a name.
+  
+  Note that you can check for positions with this function, too. This is because every position is
+  also an anchor (QCPItemPosition inherits from QCPItemAnchor).
+  
+  \see anchor, position
+*/
+bool QCPAbstractItem::hasAnchor(const QString &name) const
+{
+  for (int i=0; i<mAnchors.size(); ++i)
+  {
+    if (mAnchors.at(i)->name() == name)
+      return true;
+  }
+  return false;
+}
+
+/*! \internal
+  
+  Returns the rect the visual representation of this item is clipped to. This depends on the
+  current setting of \ref setClipToAxisRect as well as the axis rect set with \ref setClipAxisRect.
+  
+  If the item is not clipped to an axis rect, the \ref QCustomPlot::viewport rect is returned.
+  
+  \see draw
+*/
+QRect QCPAbstractItem::clipRect() const
+{
+  if (mClipToAxisRect && mClipAxisRect)
+    return mClipAxisRect.data()->rect();
+  else
+    return mParentPlot->viewport();
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing item lines.
+
+  This is the antialiasing state the painter passed to the \ref draw method is in by default.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased
+*/
+void QCPAbstractItem::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiased, QCP::aeItems);
+}
+
+/*! \internal
+
+  Finds the shortest squared distance of \a point to the line segment defined by \a start and \a
+  end.
+  
+  This function may be used to help with the implementation of the \ref selectTest function for
+  specific items.
+  
+  \note This function is identical to QCPAbstractPlottable::distSqrToLine
+  
+  \see rectSelectTest
+*/
+double QCPAbstractItem::distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const
+{
+  QVector2D a(start);
+  QVector2D b(end);
+  QVector2D p(point);
+  QVector2D v(b-a);
+  
+  double vLengthSqr = v.lengthSquared();
+  if (!qFuzzyIsNull(vLengthSqr))
+  {
+    double mu = QVector2D::dotProduct(p-a, v)/vLengthSqr;
+    if (mu < 0)
+      return (a-p).lengthSquared();
+    else if (mu > 1)
+      return (b-p).lengthSquared();
+    else
+      return ((a + mu*v)-p).lengthSquared();
+  } else
+    return (a-p).lengthSquared();
+}
+
+/*! \internal
+
+  A convenience function which returns the selectTest value for a specified \a rect and a specified
+  click position \a pos. \a filledRect defines whether a click inside the rect should also be
+  considered a hit or whether only the rect border is sensitive to hits.
+  
+  This function may be used to help with the implementation of the \ref selectTest function for
+  specific items.
+  
+  For example, if your item consists of four rects, call this function four times, once for each
+  rect, in your \ref selectTest reimplementation. Finally, return the minimum of all four returned
+  values.
+  
+  \see distSqrToLine
+*/
+double QCPAbstractItem::rectSelectTest(const QRectF &rect, const QPointF &pos, bool filledRect) const
+{
+  double result = -1;
+
+  // distance to border:
+  QList<QLineF> lines;
+  lines << QLineF(rect.topLeft(), rect.topRight()) << QLineF(rect.bottomLeft(), rect.bottomRight())
+        << QLineF(rect.topLeft(), rect.bottomLeft()) << QLineF(rect.topRight(), rect.bottomRight());
+  double minDistSqr = std::numeric_limits<double>::max();
+  for (int i=0; i<lines.size(); ++i)
+  {
+    double distSqr = distSqrToLine(lines.at(i).p1(), lines.at(i).p2(), pos);
+    if (distSqr < minDistSqr)
+      minDistSqr = distSqr;
+  }
+  result = qSqrt(minDistSqr);
+  
+  // filled rect, allow click inside to count as hit:
+  if (filledRect && result > mParentPlot->selectionTolerance()*0.99)
+  {
+    if (rect.contains(pos))
+      result = mParentPlot->selectionTolerance()*0.99;
+  }
+  return result;
+}
+
+/*! \internal
+
+  Returns the pixel position of the anchor with Id \a anchorId. This function must be reimplemented in
+  item subclasses if they want to provide anchors (QCPItemAnchor).
+  
+  For example, if the item has two anchors with id 0 and 1, this function takes one of these anchor
+  ids and returns the respective pixel points of the specified anchor.
+  
+  \see createAnchor
+*/
+QPointF QCPAbstractItem::anchorPixelPoint(int anchorId) const
+{
+  qDebug() << Q_FUNC_INFO << "called on item which shouldn't have any anchors (this method not reimplemented). anchorId" << anchorId;
+  return QPointF();
+}
+
+/*! \internal
+
+  Creates a QCPItemPosition, registers it with this item and returns a pointer to it. The specified
+  \a name must be a unique string that is usually identical to the variable name of the position
+  member (This is needed to provide the name-based \ref position access to positions).
+  
+  Don't delete positions created by this function manually, as the item will take care of it.
+  
+  Use this function in the constructor (initialization list) of the specific item subclass to
+  create each position member. Don't create QCPItemPositions with \b new yourself, because they
+  won't be registered with the item properly.
+  
+  \see createAnchor
+*/
+QCPItemPosition *QCPAbstractItem::createPosition(const QString &name)
+{
+  if (hasAnchor(name))
+    qDebug() << Q_FUNC_INFO << "anchor/position with name exists already:" << name;
+  QCPItemPosition *newPosition = new QCPItemPosition(mParentPlot, this, name);
+  mPositions.append(newPosition);
+  mAnchors.append(newPosition); // every position is also an anchor
+  newPosition->setAxes(mParentPlot->xAxis, mParentPlot->yAxis);
+  newPosition->setType(QCPItemPosition::ptPlotCoords);
+  if (mParentPlot->axisRect())
+    newPosition->setAxisRect(mParentPlot->axisRect());
+  newPosition->setCoords(0, 0);
+  return newPosition;
+}
+
+/*! \internal
+
+  Creates a QCPItemAnchor, registers it with this item and returns a pointer to it. The specified
+  \a name must be a unique string that is usually identical to the variable name of the anchor
+  member (This is needed to provide the name based \ref anchor access to anchors).
+  
+  The \a anchorId must be a number identifying the created anchor. It is recommended to create an
+  enum (e.g. "AnchorIndex") for this on each item that uses anchors. This id is used by the anchor
+  to identify itself when it calls QCPAbstractItem::anchorPixelPoint. That function then returns
+  the correct pixel coordinates for the passed anchor id.
+  
+  Don't delete anchors created by this function manually, as the item will take care of it.
+  
+  Use this function in the constructor (initialization list) of the specific item subclass to
+  create each anchor member. Don't create QCPItemAnchors with \b new yourself, because then they
+  won't be registered with the item properly.
+  
+  \see createPosition
+*/
+QCPItemAnchor *QCPAbstractItem::createAnchor(const QString &name, int anchorId)
+{
+  if (hasAnchor(name))
+    qDebug() << Q_FUNC_INFO << "anchor/position with name exists already:" << name;
+  QCPItemAnchor *newAnchor = new QCPItemAnchor(mParentPlot, this, name, anchorId);
+  mAnchors.append(newAnchor);
+  return newAnchor;
+}
+
+/* inherits documentation from base class */
+void QCPAbstractItem::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged)
+{
+  Q_UNUSED(event)
+  Q_UNUSED(details)
+  if (mSelectable)
+  {
+    bool selBefore = mSelected;
+    setSelected(additive ? !mSelected : true);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPAbstractItem::deselectEvent(bool *selectionStateChanged)
+{
+  if (mSelectable)
+  {
+    bool selBefore = mSelected;
+    setSelected(false);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+QCP::Interaction QCPAbstractItem::selectionCategory() const
+{
+  return QCP::iSelectItems;
+}
+
+
+/*! \file */
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCustomPlot
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCustomPlot
+  
+  \brief The central class of the library. This is the QWidget which displays the plot and
+  interacts with the user.
+  
+  For tutorials on how to use QCustomPlot, see the website\n
+  http://www.qcustomplot.com/
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn QRect QCustomPlot::viewport() const
+  
+  Returns the viewport rect of this QCustomPlot instance. The viewport is the area the plot is
+  drawn in, all mechanisms, e.g. margin caluclation take the viewport to be the outer border of the
+  plot. The viewport normally is the rect() of the QCustomPlot widget, i.e. a rect with top left
+  (0, 0) and size of the QCustomPlot widget.
+  
+  Don't confuse the viewport with the axis rect (QCustomPlot::axisRect). An axis rect is typically
+  an area enclosed by four axes, where the graphs/plottables are drawn in. The viewport is larger
+  and contains also the axes themselves, their tick numbers, their labels, the plot title etc.
+  
+  Only when saving to a file (see \ref savePng, \ref savePdf etc.) the viewport is temporarily
+  modified to allow saving plots with sizes independent of the current widget size.
+*/
+
+/*! \fn QCPLayoutGrid *QCustomPlot::plotLayout() const
+  
+  Returns the top level layout of this QCustomPlot instance. It is a \ref QCPLayoutGrid, initially containing just
+  one cell with the main QCPAxisRect inside.
+*/
+
+/* end of documentation of inline functions */
+/* start of documentation of signals */
+
+/*! \fn void QCustomPlot::mouseDoubleClick(QMouseEvent *event)
+
+  This signal is emitted when the QCustomPlot receives a mouse double click event.
+*/
+
+/*! \fn void QCustomPlot::mousePress(QMouseEvent *event)
+
+  This signal is emitted when the QCustomPlot receives a mouse press event.
+  
+  It is emitted before QCustomPlot handles any other mechanism like range dragging. So a slot
+  connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeDrag or \ref
+  QCPAxisRect::setRangeDragAxes.
+*/
+
+/*! \fn void QCustomPlot::mouseMove(QMouseEvent *event)
+
+  This signal is emitted when the QCustomPlot receives a mouse move event.
+  
+  It is emitted before QCustomPlot handles any other mechanism like range dragging. So a slot
+  connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeDrag or \ref
+  QCPAxisRect::setRangeDragAxes.
+  
+  \warning It is discouraged to change the drag-axes with \ref QCPAxisRect::setRangeDragAxes here,
+  because the dragging starting point was saved the moment the mouse was pressed. Thus it only has
+  a meaning for the range drag axes that were set at that moment. If you want to change the drag
+  axes, consider doing this in the \ref mousePress signal instead.
+*/
+
+/*! \fn void QCustomPlot::mouseRelease(QMouseEvent *event)
+
+  This signal is emitted when the QCustomPlot receives a mouse release event.
+  
+  It is emitted before QCustomPlot handles any other mechanisms like object selection. So a
+  slot connected to this signal can still influence the behaviour e.g. with \ref setInteractions or
+  \ref QCPAbstractPlottable::setSelectable.
+*/
+
+/*! \fn void QCustomPlot::mouseWheel(QMouseEvent *event)
+
+  This signal is emitted when the QCustomPlot receives a mouse wheel event.
+  
+  It is emitted before QCustomPlot handles any other mechanisms like range zooming. So a slot
+  connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeZoom, \ref
+  QCPAxisRect::setRangeZoomAxes or \ref QCPAxisRect::setRangeZoomFactor.
+*/
+
+/*! \fn void QCustomPlot::plottableClick(QCPAbstractPlottable *plottable, QMouseEvent *event)
+  
+  This signal is emitted when a plottable is clicked.
+
+  \a event is the mouse event that caused the click and \a plottable is the plottable that received
+  the click.
+  
+  \see plottableDoubleClick
+*/
+
+/*! \fn void QCustomPlot::plottableDoubleClick(QCPAbstractPlottable *plottable, QMouseEvent *event)
+  
+  This signal is emitted when a plottable is double clicked.
+  
+  \a event is the mouse event that caused the click and \a plottable is the plottable that received
+  the click.
+  
+  \see plottableClick
+*/
+
+/*! \fn void QCustomPlot::itemClick(QCPAbstractItem *item, QMouseEvent *event)
+  
+  This signal is emitted when an item is clicked.
+
+  \a event is the mouse event that caused the click and \a item is the item that received the
+  click.
+  
+  \see itemDoubleClick
+*/
+
+/*! \fn void QCustomPlot::itemDoubleClick(QCPAbstractItem *item, QMouseEvent *event)
+  
+  This signal is emitted when an item is double clicked.
+  
+  \a event is the mouse event that caused the click and \a item is the item that received the
+  click.
+  
+  \see itemClick
+*/
+
+/*! \fn void QCustomPlot::axisClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event)
+  
+  This signal is emitted when an axis is clicked.
+  
+  \a event is the mouse event that caused the click, \a axis is the axis that received the click and
+  \a part indicates the part of the axis that was clicked.
+  
+  \see axisDoubleClick
+*/
+
+/*! \fn void QCustomPlot::axisDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event)
+
+  This signal is emitted when an axis is double clicked.
+  
+  \a event is the mouse event that caused the click, \a axis is the axis that received the click and
+  \a part indicates the part of the axis that was clicked.
+  
+  \see axisClick
+*/
+
+/*! \fn void QCustomPlot::legendClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event)
+
+  This signal is emitted when a legend (item) is clicked.
+  
+  \a event is the mouse event that caused the click, \a legend is the legend that received the
+  click and \a item is the legend item that received the click. If only the legend and no item is
+  clicked, \a item is 0. This happens for a click inside the legend padding or the space between
+  two items.
+  
+  \see legendDoubleClick
+*/
+
+/*! \fn void QCustomPlot::legendDoubleClick(QCPLegend *legend,  QCPAbstractLegendItem *item, QMouseEvent *event)
+
+  This signal is emitted when a legend (item) is double clicked.
+  
+  \a event is the mouse event that caused the click, \a legend is the legend that received the
+  click and \a item is the legend item that received the click. If only the legend and no item is
+  clicked, \a item is 0. This happens for a click inside the legend padding or the space between
+  two items.
+  
+  \see legendClick
+*/
+
+/*! \fn void QCustomPlot:: titleClick(QMouseEvent *event, QCPPlotTitle *title)
+
+  This signal is emitted when a plot title is clicked.
+  
+  \a event is the mouse event that caused the click and \a title is the plot title that received
+  the click.
+  
+  \see titleDoubleClick
+*/
+
+/*! \fn void QCustomPlot::titleDoubleClick(QMouseEvent *event, QCPPlotTitle *title)
+
+  This signal is emitted when a plot title is double clicked.
+  
+  \a event is the mouse event that caused the click and \a title is the plot title that received
+  the click.
+  
+  \see titleClick
+*/
+
+/*! \fn void QCustomPlot::selectionChangedByUser()
+  
+  This signal is emitted after the user has changed the selection in the QCustomPlot, e.g. by
+  clicking. It is not emitted when the selection state of an object has changed programmatically by
+  a direct call to setSelected() on an object or by calling \ref deselectAll.
+  
+  In addition to this signal, selectable objects also provide individual signals, for example
+  QCPAxis::selectionChanged or QCPAbstractPlottable::selectionChanged. Note that those signals are
+  emitted even if the selection state is changed programmatically.
+  
+  See the documentation of \ref setInteractions for details about the selection mechanism.
+  
+  \see selectedPlottables, selectedGraphs, selectedItems, selectedAxes, selectedLegends
+*/
+
+/*! \fn void QCustomPlot::beforeReplot()
+  
+  This signal is emitted immediately before a replot takes place (caused by a call to the slot \ref
+  replot).
+  
+  It is safe to mutually connect the replot slot with this signal on two QCustomPlots to make them
+  replot synchronously, it won't cause an infinite recursion.
+  
+  \see replot, afterReplot
+*/
+
+/*! \fn void QCustomPlot::afterReplot()
+  
+  This signal is emitted immediately after a replot has taken place (caused by a call to the slot \ref
+  replot).
+  
+  It is safe to mutually connect the replot slot with this signal on two QCustomPlots to make them
+  replot synchronously, it won't cause an infinite recursion.
+  
+  \see replot, beforeReplot
+*/
+
+/* end of documentation of signals */
+/* start of documentation of public members */
+
+/*! \var QCPAxis *QCustomPlot::xAxis
+
+  A pointer to the primary x Axis (bottom) of the main axis rect of the plot.
+  
+  QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref
+  yAxis2) and the \ref legend. They make it very easy working with plots that only have a single
+  axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the
+  layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref
+  QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the
+  default legend is removed due to manipulation of the layout system (e.g. by removing the main
+  axis rect), the corresponding pointers become 0.
+*/
+
+/*! \var QCPAxis *QCustomPlot::yAxis
+
+  A pointer to the primary y Axis (left) of the main axis rect of the plot.
+  
+  QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref
+  yAxis2) and the \ref legend. They make it very easy working with plots that only have a single
+  axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the
+  layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref
+  QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the
+  default legend is removed due to manipulation of the layout system (e.g. by removing the main
+  axis rect), the corresponding pointers become 0.
+*/
+
+/*! \var QCPAxis *QCustomPlot::xAxis2
+
+  A pointer to the secondary x Axis (top) of the main axis rect of the plot. Secondary axes are
+  invisible by default. Use QCPAxis::setVisible to change this (or use \ref
+  QCPAxisRect::setupFullAxesBox).
+  
+  QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref
+  yAxis2) and the \ref legend. They make it very easy working with plots that only have a single
+  axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the
+  layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref
+  QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the
+  default legend is removed due to manipulation of the layout system (e.g. by removing the main
+  axis rect), the corresponding pointers become 0.
+*/
+
+/*! \var QCPAxis *QCustomPlot::yAxis2
+
+  A pointer to the secondary y Axis (right) of the main axis rect of the plot. Secondary axes are
+  invisible by default. Use QCPAxis::setVisible to change this (or use \ref
+  QCPAxisRect::setupFullAxesBox).
+  
+  QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref
+  yAxis2) and the \ref legend. They make it very easy working with plots that only have a single
+  axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the
+  layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref
+  QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the
+  default legend is removed due to manipulation of the layout system (e.g. by removing the main
+  axis rect), the corresponding pointers become 0.
+*/
+
+/*! \var QCPLegend *QCustomPlot::legend
+
+  A pointer to the default legend of the main axis rect. The legend is invisible by default. Use
+  QCPLegend::setVisible to change this.
+  
+  QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref
+  yAxis2) and the \ref legend. They make it very easy working with plots that only have a single
+  axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the
+  layout system\endlink to add multiple legends to the plot, use the layout system interface to
+  access the new legend. For example, legends can be placed inside an axis rect's \ref
+  QCPAxisRect::insetLayout "inset layout", and must then also be accessed via the inset layout. If
+  the default legend is removed due to manipulation of the layout system (e.g. by removing the main
+  axis rect), the corresponding pointer becomes 0.
+*/
+
+/* end of documentation of public members */
+
+/*!
+  Constructs a QCustomPlot and sets reasonable default values.
+*/
+QCustomPlot::QCustomPlot(QWidget *parent) :
+  QWidget(parent),
+  xAxis(0),
+  yAxis(0),
+  xAxis2(0),
+  yAxis2(0),
+  legend(0),
+  mPlotLayout(0),
+  mAutoAddPlottableToLegend(true),
+  mAntialiasedElements(QCP::aeNone),
+  mNotAntialiasedElements(QCP::aeNone),
+  mInteractions(0),
+  mSelectionTolerance(8),
+  mNoAntialiasingOnDrag(false),
+  mBackgroundBrush(Qt::white, Qt::SolidPattern),
+  mBackgroundScaled(true),
+  mBackgroundScaledMode(Qt::KeepAspectRatioByExpanding),
+  mCurrentLayer(0),
+  mPlottingHints(QCP::phCacheLabels|QCP::phForceRepaint),
+  mMultiSelectModifier(Qt::ControlModifier),
+  mPaintBuffer(size()),
+  mMouseEventElement(0),
+  mReplotting(false)
+{
+  setAttribute(Qt::WA_NoMousePropagation);
+  setAttribute(Qt::WA_OpaquePaintEvent);
+  setMouseTracking(true);
+  QLocale currentLocale = locale();
+  currentLocale.setNumberOptions(QLocale::OmitGroupSeparator);
+  setLocale(currentLocale);
+  
+  // create initial layers:
+  mLayers.append(new QCPLayer(this, QLatin1String("background")));
+  mLayers.append(new QCPLayer(this, QLatin1String("grid")));
+  mLayers.append(new QCPLayer(this, QLatin1String("main")));
+  mLayers.append(new QCPLayer(this, QLatin1String("axes")));
+  mLayers.append(new QCPLayer(this, QLatin1String("legend")));
+  updateLayerIndices();
+  setCurrentLayer(QLatin1String("main"));
+  
+  // create initial layout, axis rect and legend:
+  mPlotLayout = new QCPLayoutGrid;
+  mPlotLayout->initializeParentPlot(this);
+  mPlotLayout->setParent(this); // important because if parent is QWidget, QCPLayout::sizeConstraintsChanged will call QWidget::updateGeometry
+  mPlotLayout->setLayer(QLatin1String("main"));
+  QCPAxisRect *defaultAxisRect = new QCPAxisRect(this, true);
+  mPlotLayout->addElement(0, 0, defaultAxisRect);
+  xAxis = defaultAxisRect->axis(QCPAxis::atBottom);
+  yAxis = defaultAxisRect->axis(QCPAxis::atLeft);
+  xAxis2 = defaultAxisRect->axis(QCPAxis::atTop);
+  yAxis2 = defaultAxisRect->axis(QCPAxis::atRight);
+  legend = new QCPLegend;
+  legend->setVisible(false);
+  defaultAxisRect->insetLayout()->addElement(legend, Qt::AlignRight|Qt::AlignTop);
+  defaultAxisRect->insetLayout()->setMargins(QMargins(12, 12, 12, 12));
+  
+  defaultAxisRect->setLayer(QLatin1String("background"));
+  xAxis->setLayer(QLatin1String("axes"));
+  yAxis->setLayer(QLatin1String("axes"));
+  xAxis2->setLayer(QLatin1String("axes"));
+  yAxis2->setLayer(QLatin1String("axes"));
+  xAxis->grid()->setLayer(QLatin1String("grid"));
+  yAxis->grid()->setLayer(QLatin1String("grid"));
+  xAxis2->grid()->setLayer(QLatin1String("grid"));
+  yAxis2->grid()->setLayer(QLatin1String("grid"));
+  legend->setLayer(QLatin1String("legend"));
+  
+  setViewport(rect()); // needs to be called after mPlotLayout has been created
+  
+  replot();
+}
+
+QCustomPlot::~QCustomPlot()
+{
+  clearPlottables();
+  clearItems();
+
+  if (mPlotLayout)
+  {
+    delete mPlotLayout;
+    mPlotLayout = 0;
+  }
+  
+  mCurrentLayer = 0;
+  qDeleteAll(mLayers); // don't use removeLayer, because it would prevent the last layer to be removed
+  mLayers.clear();
+}
+
+/*!
+  Sets which elements are forcibly drawn antialiased as an \a or combination of QCP::AntialiasedElement.
+  
+  This overrides the antialiasing settings for whole element groups, normally controlled with the
+  \a setAntialiasing function on the individual elements. If an element is neither specified in
+  \ref setAntialiasedElements nor in \ref setNotAntialiasedElements, the antialiasing setting on
+  each individual element instance is used.
+  
+  For example, if \a antialiasedElements contains \ref QCP::aePlottables, all plottables will be
+  drawn antialiased, no matter what the specific QCPAbstractPlottable::setAntialiased value was set
+  to.
+  
+  if an element in \a antialiasedElements is already set in \ref setNotAntialiasedElements, it is
+  removed from there.
+  
+  \see setNotAntialiasedElements
+*/
+void QCustomPlot::setAntialiasedElements(const QCP::AntialiasedElements &antialiasedElements)
+{
+  mAntialiasedElements = antialiasedElements;
+  
+  // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously:
+  if ((mNotAntialiasedElements & mAntialiasedElements) != 0)
+    mNotAntialiasedElements |= ~mAntialiasedElements;
+}
+
+/*!
+  Sets whether the specified \a antialiasedElement is forcibly drawn antialiased.
+  
+  See \ref setAntialiasedElements for details.
+  
+  \see setNotAntialiasedElement
+*/
+void QCustomPlot::setAntialiasedElement(QCP::AntialiasedElement antialiasedElement, bool enabled)
+{
+  if (!enabled && mAntialiasedElements.testFlag(antialiasedElement))
+    mAntialiasedElements &= ~antialiasedElement;
+  else if (enabled && !mAntialiasedElements.testFlag(antialiasedElement))
+    mAntialiasedElements |= antialiasedElement;
+  
+  // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously:
+  if ((mNotAntialiasedElements & mAntialiasedElements) != 0)
+    mNotAntialiasedElements |= ~mAntialiasedElements;
+}
+
+/*!
+  Sets which elements are forcibly drawn not antialiased as an \a or combination of
+  QCP::AntialiasedElement.
+  
+  This overrides the antialiasing settings for whole element groups, normally controlled with the
+  \a setAntialiasing function on the individual elements. If an element is neither specified in
+  \ref setAntialiasedElements nor in \ref setNotAntialiasedElements, the antialiasing setting on
+  each individual element instance is used.
+  
+  For example, if \a notAntialiasedElements contains \ref QCP::aePlottables, no plottables will be
+  drawn antialiased, no matter what the specific QCPAbstractPlottable::setAntialiased value was set
+  to.
+  
+  if an element in \a notAntialiasedElements is already set in \ref setAntialiasedElements, it is
+  removed from there.
+  
+  \see setAntialiasedElements
+*/
+void QCustomPlot::setNotAntialiasedElements(const QCP::AntialiasedElements &notAntialiasedElements)
+{
+  mNotAntialiasedElements = notAntialiasedElements;
+  
+  // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously:
+  if ((mNotAntialiasedElements & mAntialiasedElements) != 0)
+    mAntialiasedElements |= ~mNotAntialiasedElements;
+}
+
+/*!
+  Sets whether the specified \a notAntialiasedElement is forcibly drawn not antialiased.
+  
+  See \ref setNotAntialiasedElements for details.
+  
+  \see setAntialiasedElement
+*/
+void QCustomPlot::setNotAntialiasedElement(QCP::AntialiasedElement notAntialiasedElement, bool enabled)
+{
+  if (!enabled && mNotAntialiasedElements.testFlag(notAntialiasedElement))
+    mNotAntialiasedElements &= ~notAntialiasedElement;
+  else if (enabled && !mNotAntialiasedElements.testFlag(notAntialiasedElement))
+    mNotAntialiasedElements |= notAntialiasedElement;
+  
+  // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously:
+  if ((mNotAntialiasedElements & mAntialiasedElements) != 0)
+    mAntialiasedElements |= ~mNotAntialiasedElements;
+}
+
+/*!
+  If set to true, adding a plottable (e.g. a graph) to the QCustomPlot automatically also adds the
+  plottable to the legend (QCustomPlot::legend).
+  
+  \see addPlottable, addGraph, QCPLegend::addItem
+*/
+void QCustomPlot::setAutoAddPlottableToLegend(bool on)
+{
+  mAutoAddPlottableToLegend = on;
+}
+
+/*!
+  Sets the possible interactions of this QCustomPlot as an or-combination of \ref QCP::Interaction
+  enums. There are the following types of interactions:
+  
+  <b>Axis range manipulation</b> is controlled via \ref QCP::iRangeDrag and \ref QCP::iRangeZoom. When the
+  respective interaction is enabled, the user may drag axes ranges and zoom with the mouse wheel.
+  For details how to control which axes the user may drag/zoom and in what orientations, see \ref
+  QCPAxisRect::setRangeDrag, \ref QCPAxisRect::setRangeZoom, \ref QCPAxisRect::setRangeDragAxes,
+  \ref QCPAxisRect::setRangeZoomAxes.
+  
+  <b>Plottable selection</b> is controlled by \ref QCP::iSelectPlottables. If \ref QCP::iSelectPlottables is
+  set, the user may select plottables (graphs, curves, bars,...) by clicking on them or in their
+  vicinity (\ref setSelectionTolerance). Whether the user can actually select a plottable can
+  further be restricted with the \ref QCPAbstractPlottable::setSelectable function on the specific
+  plottable. To find out whether a specific plottable is selected, call
+  QCPAbstractPlottable::selected(). To retrieve a list of all currently selected plottables, call
+  \ref selectedPlottables. If you're only interested in QCPGraphs, you may use the convenience
+  function \ref selectedGraphs.
+  
+  <b>Item selection</b> is controlled by \ref QCP::iSelectItems. If \ref QCP::iSelectItems is set, the user
+  may select items (QCPItemLine, QCPItemText,...) by clicking on them or in their vicinity. To find
+  out whether a specific item is selected, call QCPAbstractItem::selected(). To retrieve a list of
+  all currently selected items, call \ref selectedItems.
+  
+  <b>Axis selection</b> is controlled with \ref QCP::iSelectAxes. If \ref QCP::iSelectAxes is set, the user
+  may select parts of the axes by clicking on them. What parts exactly (e.g. Axis base line, tick
+  labels, axis label) are selectable can be controlled via \ref QCPAxis::setSelectableParts for
+  each axis. To retrieve a list of all axes that currently contain selected parts, call \ref
+  selectedAxes. Which parts of an axis are selected, can be retrieved with QCPAxis::selectedParts().
+  
+  <b>Legend selection</b> is controlled with \ref QCP::iSelectLegend. If this is set, the user may
+  select the legend itself or individual items by clicking on them. What parts exactly are
+  selectable can be controlled via \ref QCPLegend::setSelectableParts. To find out whether the
+  legend or any of its child items are selected, check the value of QCPLegend::selectedParts. To
+  find out which child items are selected, call \ref QCPLegend::selectedItems.
+  
+  <b>All other selectable elements</b> The selection of all other selectable objects (e.g.
+  QCPPlotTitle, or your own layerable subclasses) is controlled with \ref QCP::iSelectOther. If set, the
+  user may select those objects by clicking on them. To find out which are currently selected, you
+  need to check their selected state explicitly.
+  
+  If the selection state has changed by user interaction, the \ref selectionChangedByUser signal is
+  emitted. Each selectable object additionally emits an individual selectionChanged signal whenever
+  their selection state has changed, i.e. not only by user interaction.
+  
+  To allow multiple objects to be selected by holding the selection modifier (\ref
+  setMultiSelectModifier), set the flag \ref QCP::iMultiSelect.
+  
+  \note In addition to the selection mechanism presented here, QCustomPlot always emits
+  corresponding signals, when an object is clicked or double clicked. see \ref plottableClick and
+  \ref plottableDoubleClick for example.
+  
+  \see setInteraction, setSelectionTolerance
+*/
+void QCustomPlot::setInteractions(const QCP::Interactions &interactions)
+{
+  mInteractions = interactions;
+}
+
+/*!
+  Sets the single \a interaction of this QCustomPlot to \a enabled.
+  
+  For details about the interaction system, see \ref setInteractions.
+  
+  \see setInteractions
+*/
+void QCustomPlot::setInteraction(const QCP::Interaction &interaction, bool enabled)
+{
+  if (!enabled && mInteractions.testFlag(interaction))
+    mInteractions &= ~interaction;
+  else if (enabled && !mInteractions.testFlag(interaction))
+    mInteractions |= interaction;
+}
+
+/*!
+  Sets the tolerance that is used to decide whether a click selects an object (e.g. a plottable) or
+  not.
+  
+  If the user clicks in the vicinity of the line of e.g. a QCPGraph, it's only regarded as a
+  potential selection when the minimum distance between the click position and the graph line is
+  smaller than \a pixels. Objects that are defined by an area (e.g. QCPBars) only react to clicks
+  directly inside the area and ignore this selection tolerance. In other words, it only has meaning
+  for parts of objects that are too thin to exactly hit with a click and thus need such a
+  tolerance.
+  
+  \see setInteractions, QCPLayerable::selectTest
+*/
+void QCustomPlot::setSelectionTolerance(int pixels)
+{
+  mSelectionTolerance = pixels;
+}
+
+/*!
+  Sets whether antialiasing is disabled for this QCustomPlot while the user is dragging axes
+  ranges. If many objects, especially plottables, are drawn antialiased, this greatly improves
+  performance during dragging. Thus it creates a more responsive user experience. As soon as the
+  user stops dragging, the last replot is done with normal antialiasing, to restore high image
+  quality.
+  
+  \see setAntialiasedElements, setNotAntialiasedElements
+*/
+void QCustomPlot::setNoAntialiasingOnDrag(bool enabled)
+{
+  mNoAntialiasingOnDrag = enabled;
+}
+
+/*!
+  Sets the plotting hints for this QCustomPlot instance as an \a or combination of QCP::PlottingHint.
+  
+  \see setPlottingHint
+*/
+void QCustomPlot::setPlottingHints(const QCP::PlottingHints &hints)
+{
+  mPlottingHints = hints;
+}
+
+/*!
+  Sets the specified plotting \a hint to \a enabled.
+  
+  \see setPlottingHints
+*/
+void QCustomPlot::setPlottingHint(QCP::PlottingHint hint, bool enabled)
+{
+  QCP::PlottingHints newHints = mPlottingHints;
+  if (!enabled)
+    newHints &= ~hint;
+  else
+    newHints |= hint;
+  
+  if (newHints != mPlottingHints)
+    setPlottingHints(newHints);
+}
+
+/*!
+  Sets the keyboard modifier that will be recognized as multi-select-modifier.
+  
+  If \ref QCP::iMultiSelect is specified in \ref setInteractions, the user may select multiple objects
+  by clicking on them one after the other while holding down \a modifier.
+  
+  By default the multi-select-modifier is set to Qt::ControlModifier.
+  
+  \see setInteractions
+*/
+void QCustomPlot::setMultiSelectModifier(Qt::KeyboardModifier modifier)
+{
+  mMultiSelectModifier = modifier;
+}
+
+/*!
+  Sets the viewport of this QCustomPlot. The Viewport is the area that the top level layout
+  (QCustomPlot::plotLayout()) uses as its rect. Normally, the viewport is the entire widget rect.
+  
+  This function is used to allow arbitrary size exports with \ref toPixmap, \ref savePng, \ref
+  savePdf, etc. by temporarily changing the viewport size.
+*/
+void QCustomPlot::setViewport(const QRect &rect)
+{
+  mViewport = rect;
+  if (mPlotLayout)
+    mPlotLayout->setOuterRect(mViewport);
+}
+
+/*!
+  Sets \a pm as the viewport background pixmap (see \ref setViewport). The pixmap is always drawn
+  below all other objects in the plot.
+
+  For cases where the provided pixmap doesn't have the same size as the viewport, scaling can be
+  enabled with \ref setBackgroundScaled and the scaling mode (whether and how the aspect ratio is
+  preserved) can be set with \ref setBackgroundScaledMode. To set all these options in one call,
+  consider using the overloaded version of this function.
+  
+  If a background brush was set with \ref setBackground(const QBrush &brush), the viewport will
+  first be filled with that brush, before drawing the background pixmap. This can be useful for
+  background pixmaps with translucent areas.
+
+  \see setBackgroundScaled, setBackgroundScaledMode
+*/
+void QCustomPlot::setBackground(const QPixmap &pm)
+{
+  mBackgroundPixmap = pm;
+  mScaledBackgroundPixmap = QPixmap();
+}
+
+/*!
+  Sets the background brush of the viewport (see \ref setViewport).
+
+  Before drawing everything else, the background is filled with \a brush. If a background pixmap
+  was set with \ref setBackground(const QPixmap &pm), this brush will be used to fill the viewport
+  before the background pixmap is drawn. This can be useful for background pixmaps with translucent
+  areas.
+  
+  Set \a brush to Qt::NoBrush or Qt::Transparent to leave background transparent. This can be
+  useful for exporting to image formats which support transparency, e.g. \ref savePng.
+
+  \see setBackgroundScaled, setBackgroundScaledMode
+*/
+void QCustomPlot::setBackground(const QBrush &brush)
+{
+  mBackgroundBrush = brush;
+}
+
+/*! \overload
+  
+  Allows setting the background pixmap of the viewport, whether it shall be scaled and how it
+  shall be scaled in one call.
+
+  \see setBackground(const QPixmap &pm), setBackgroundScaled, setBackgroundScaledMode
+*/
+void QCustomPlot::setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode)
+{
+  mBackgroundPixmap = pm;
+  mScaledBackgroundPixmap = QPixmap();
+  mBackgroundScaled = scaled;
+  mBackgroundScaledMode = mode;
+}
+
+/*!
+  Sets whether the viewport background pixmap shall be scaled to fit the viewport. If \a scaled is
+  set to true, control whether and how the aspect ratio of the original pixmap is preserved with
+  \ref setBackgroundScaledMode.
+  
+  Note that the scaled version of the original pixmap is buffered, so there is no performance
+  penalty on replots. (Except when the viewport dimensions are changed continuously.)
+  
+  \see setBackground, setBackgroundScaledMode
+*/
+void QCustomPlot::setBackgroundScaled(bool scaled)
+{
+  mBackgroundScaled = scaled;
+}
+
+/*!
+  If scaling of the viewport background pixmap is enabled (\ref setBackgroundScaled), use this
+  function to define whether and how the aspect ratio of the original pixmap is preserved.
+  
+  \see setBackground, setBackgroundScaled
+*/
+void QCustomPlot::setBackgroundScaledMode(Qt::AspectRatioMode mode)
+{
+  mBackgroundScaledMode = mode;
+}
+
+/*!
+  Returns the plottable with \a index. If the index is invalid, returns 0.
+  
+  There is an overloaded version of this function with no parameter which returns the last added
+  plottable, see QCustomPlot::plottable()
+  
+  \see plottableCount, addPlottable
+*/
+QCPAbstractPlottable *QCustomPlot::plottable(int index)
+{
+  if (index >= 0 && index < mPlottables.size())
+  {
+    return mPlottables.at(index);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "index out of bounds:" << index;
+    return 0;
+  }
+}
+
+/*! \overload
+  
+  Returns the last plottable that was added with \ref addPlottable. If there are no plottables in
+  the plot, returns 0.
+  
+  \see plottableCount, addPlottable
+*/
+QCPAbstractPlottable *QCustomPlot::plottable()
+{
+  if (!mPlottables.isEmpty())
+  {
+    return mPlottables.last();
+  } else
+    return 0;
+}
+
+/*!
+  Adds the specified plottable to the plot and, if \ref setAutoAddPlottableToLegend is enabled, to
+  the legend (QCustomPlot::legend). QCustomPlot takes ownership of the plottable.
+  
+  Returns true on success, i.e. when \a plottable isn't already in the plot and the parent plot of
+  \a plottable is this QCustomPlot (the latter is controlled by what axes were passed in the
+  plottable's constructor).
+  
+  \see plottable, plottableCount, removePlottable, clearPlottables
+*/
+bool QCustomPlot::addPlottable(QCPAbstractPlottable *plottable)
+{
+  if (mPlottables.contains(plottable))
+  {
+    qDebug() << Q_FUNC_INFO << "plottable already added to this QCustomPlot:" << reinterpret_cast<quintptr>(plottable);
+    return false;
+  }
+  if (plottable->parentPlot() != this)
+  {
+    qDebug() << Q_FUNC_INFO << "plottable not created with this QCustomPlot as parent:" << reinterpret_cast<quintptr>(plottable);
+    return false;
+  }
+  
+  mPlottables.append(plottable);
+  // possibly add plottable to legend:
+  if (mAutoAddPlottableToLegend)
+    plottable->addToLegend();
+  // special handling for QCPGraphs to maintain the simple graph interface:
+  if (QCPGraph *graph = qobject_cast<QCPGraph*>(plottable))
+    mGraphs.append(graph);
+  if (!plottable->layer()) // usually the layer is already set in the constructor of the plottable (via QCPLayerable constructor)
+    plottable->setLayer(currentLayer());
+  return true;
+}
+
+/*!
+  Removes the specified plottable from the plot and, if necessary, from the legend (QCustomPlot::legend).
+  
+  Returns true on success.
+  
+  \see addPlottable, clearPlottables
+*/
+bool QCustomPlot::removePlottable(QCPAbstractPlottable *plottable)
+{
+  if (!mPlottables.contains(plottable))
+  {
+    qDebug() << Q_FUNC_INFO << "plottable not in list:" << reinterpret_cast<quintptr>(plottable);
+    return false;
+  }
+  
+  // remove plottable from legend:
+  plottable->removeFromLegend();
+  // special handling for QCPGraphs to maintain the simple graph interface:
+  if (QCPGraph *graph = qobject_cast<QCPGraph*>(plottable))
+    mGraphs.removeOne(graph);
+  // remove plottable:
+  delete plottable;
+  mPlottables.removeOne(plottable);
+  return true;
+}
+
+/*! \overload
+  
+  Removes the plottable by its \a index.
+*/
+bool QCustomPlot::removePlottable(int index)
+{
+  if (index >= 0 && index < mPlottables.size())
+    return removePlottable(mPlottables[index]);
+  else
+  {
+    qDebug() << Q_FUNC_INFO << "index out of bounds:" << index;
+    return false;
+  }
+}
+
+/*!
+  Removes all plottables from the plot (and the QCustomPlot::legend, if necessary).
+  
+  Returns the number of plottables removed.
+  
+  \see removePlottable
+*/
+int QCustomPlot::clearPlottables()
+{
+  int c = mPlottables.size();
+  for (int i=c-1; i >= 0; --i)
+    removePlottable(mPlottables[i]);
+  return c;
+}
+
+/*!
+  Returns the number of currently existing plottables in the plot
+  
+  \see plottable, addPlottable
+*/
+int QCustomPlot::plottableCount() const
+{
+  return mPlottables.size();
+}
+
+/*!
+  Returns a list of the selected plottables. If no plottables are currently selected, the list is empty.
+  
+  There is a convenience function if you're only interested in selected graphs, see \ref selectedGraphs.
+  
+  \see setInteractions, QCPAbstractPlottable::setSelectable, QCPAbstractPlottable::setSelected
+*/
+QList<QCPAbstractPlottable*> QCustomPlot::selectedPlottables() const
+{
+  QList<QCPAbstractPlottable*> result;
+  foreach (QCPAbstractPlottable *plottable, mPlottables)
+  {
+    if (plottable->selected())
+      result.append(plottable);
+  }
+  return result;
+}
+
+/*!
+  Returns the plottable at the pixel position \a pos. Plottables that only consist of single lines
+  (like graphs) have a tolerance band around them, see \ref setSelectionTolerance. If multiple
+  plottables come into consideration, the one closest to \a pos is returned.
+  
+  If \a onlySelectable is true, only plottables that are selectable
+  (QCPAbstractPlottable::setSelectable) are considered.
+  
+  If there is no plottable at \a pos, the return value is 0.
+  
+  \see itemAt, layoutElementAt
+*/
+QCPAbstractPlottable *QCustomPlot::plottableAt(const QPointF &pos, bool onlySelectable) const
+{
+  QCPAbstractPlottable *resultPlottable = 0;
+  double resultDistance = mSelectionTolerance; // only regard clicks with distances smaller than mSelectionTolerance as selections, so initialize with that value
+  
+  foreach (QCPAbstractPlottable *plottable, mPlottables)
+  {
+    if (onlySelectable && !plottable->selectable()) // we could have also passed onlySelectable to the selectTest function, but checking here is faster, because we have access to QCPabstractPlottable::selectable
+      continue;
+    if ((plottable->keyAxis()->axisRect()->rect() & plottable->valueAxis()->axisRect()->rect()).contains(pos.toPoint())) // only consider clicks inside the rect that is spanned by the plottable's key/value axes
+    {
+      double currentDistance = plottable->selectTest(pos, false);
+      if (currentDistance >= 0 && currentDistance < resultDistance)
+      {
+        resultPlottable = plottable;
+        resultDistance = currentDistance;
+      }
+    }
+  }
+  
+  return resultPlottable;
+}
+
+/*!
+  Returns whether this QCustomPlot instance contains the \a plottable.
+  
+  \see addPlottable
+*/
+bool QCustomPlot::hasPlottable(QCPAbstractPlottable *plottable) const
+{
+  return mPlottables.contains(plottable);
+}
+
+/*!
+  Returns the graph with \a index. If the index is invalid, returns 0.
+  
+  There is an overloaded version of this function with no parameter which returns the last created
+  graph, see QCustomPlot::graph()
+  
+  \see graphCount, addGraph
+*/
+QCPGraph *QCustomPlot::graph(int index) const
+{
+  if (index >= 0 && index < mGraphs.size())
+  {
+    return mGraphs.at(index);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "index out of bounds:" << index;
+    return 0;
+  }
+}
+
+/*! \overload
+  
+  Returns the last graph, that was created with \ref addGraph. If there are no graphs in the plot,
+  returns 0.
+  
+  \see graphCount, addGraph
+*/
+QCPGraph *QCustomPlot::graph() const
+{
+  if (!mGraphs.isEmpty())
+  {
+    return mGraphs.last();
+  } else
+    return 0;
+}
+
+/*!
+  Creates a new graph inside the plot. If \a keyAxis and \a valueAxis are left unspecified (0), the
+  bottom (xAxis) is used as key and the left (yAxis) is used as value axis. If specified, \a
+  keyAxis and \a valueAxis must reside in this QCustomPlot.
+  
+  \a keyAxis will be used as key axis (typically "x") and \a valueAxis as value axis (typically
+  "y") for the graph.
+  
+  Returns a pointer to the newly created graph, or 0 if adding the graph failed.
+  
+  \see graph, graphCount, removeGraph, clearGraphs
+*/
+QCPGraph *QCustomPlot::addGraph(QCPAxis *keyAxis, QCPAxis *valueAxis)
+{
+  if (!keyAxis) keyAxis = xAxis;
+  if (!valueAxis) valueAxis = yAxis;
+  if (!keyAxis || !valueAxis)
+  {
+    qDebug() << Q_FUNC_INFO << "can't use default QCustomPlot xAxis or yAxis, because at least one is invalid (has been deleted)";
+    return 0;
+  }
+  if (keyAxis->parentPlot() != this || valueAxis->parentPlot() != this)
+  {
+    qDebug() << Q_FUNC_INFO << "passed keyAxis or valueAxis doesn't have this QCustomPlot as parent";
+    return 0;
+  }
+  
+  QCPGraph *newGraph = new QCPGraph(keyAxis, valueAxis);
+  if (addPlottable(newGraph))
+  {
+    newGraph->setName(QLatin1String("Graph ")+QString::number(mGraphs.size()));
+    return newGraph;
+  } else
+  {
+    delete newGraph;
+    return 0;
+  }
+}
+
+/*!
+  Removes the specified \a graph from the plot and, if necessary, from the QCustomPlot::legend. If
+  any other graphs in the plot have a channel fill set towards the removed graph, the channel fill
+  property of those graphs is reset to zero (no channel fill).
+  
+  Returns true on success.
+  
+  \see clearGraphs
+*/
+bool QCustomPlot::removeGraph(QCPGraph *graph)
+{
+  return removePlottable(graph);
+}
+
+/*! \overload
+  
+  Removes the graph by its \a index.
+*/
+bool QCustomPlot::removeGraph(int index)
+{
+  if (index >= 0 && index < mGraphs.size())
+    return removeGraph(mGraphs[index]);
+  else
+    return false;
+}
+
+/*!
+  Removes all graphs from the plot (and the QCustomPlot::legend, if necessary).
+
+  Returns the number of graphs removed.
+  
+  \see removeGraph
+*/
+int QCustomPlot::clearGraphs()
+{
+  int c = mGraphs.size();
+  for (int i=c-1; i >= 0; --i)
+    removeGraph(mGraphs[i]);
+  return c;
+}
+
+/*!
+  Returns the number of currently existing graphs in the plot
+  
+  \see graph, addGraph
+*/
+int QCustomPlot::graphCount() const
+{
+  return mGraphs.size();
+}
+
+/*!
+  Returns a list of the selected graphs. If no graphs are currently selected, the list is empty.
+  
+  If you are not only interested in selected graphs but other plottables like QCPCurve, QCPBars,
+  etc., use \ref selectedPlottables.
+  
+  \see setInteractions, selectedPlottables, QCPAbstractPlottable::setSelectable, QCPAbstractPlottable::setSelected
+*/
+QList<QCPGraph*> QCustomPlot::selectedGraphs() const
+{
+  QList<QCPGraph*> result;
+  foreach (QCPGraph *graph, mGraphs)
+  {
+    if (graph->selected())
+      result.append(graph);
+  }
+  return result;
+}
+
+/*!
+  Returns the item with \a index. If the index is invalid, returns 0.
+  
+  There is an overloaded version of this function with no parameter which returns the last added
+  item, see QCustomPlot::item()
+  
+  \see itemCount, addItem
+*/
+QCPAbstractItem *QCustomPlot::item(int index) const
+{
+  if (index >= 0 && index < mItems.size())
+  {
+    return mItems.at(index);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "index out of bounds:" << index;
+    return 0;
+  }
+}
+
+/*! \overload
+  
+  Returns the last item, that was added with \ref addItem. If there are no items in the plot,
+  returns 0.
+  
+  \see itemCount, addItem
+*/
+QCPAbstractItem *QCustomPlot::item() const
+{
+  if (!mItems.isEmpty())
+  {
+    return mItems.last();
+  } else
+    return 0;
+}
+
+/*!
+  Adds the specified item to the plot. QCustomPlot takes ownership of the item.
+  
+  Returns true on success, i.e. when \a item wasn't already in the plot and the parent plot of \a
+  item is this QCustomPlot.
+  
+  \see item, itemCount, removeItem, clearItems
+*/
+bool QCustomPlot::addItem(QCPAbstractItem *item)
+{
+  if (!mItems.contains(item) && item->parentPlot() == this)
+  {
+    mItems.append(item);
+    return true;
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "item either already in list or not created with this QCustomPlot as parent:" << reinterpret_cast<quintptr>(item);
+    return false;
+  }
+}
+
+/*!
+  Removes the specified item from the plot.
+  
+  Returns true on success.
+  
+  \see addItem, clearItems
+*/
+bool QCustomPlot::removeItem(QCPAbstractItem *item)
+{
+  if (mItems.contains(item))
+  {
+    delete item;
+    mItems.removeOne(item);
+    return true;
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "item not in list:" << reinterpret_cast<quintptr>(item);
+    return false;
+  }
+}
+
+/*! \overload
+  
+  Removes the item by its \a index.
+*/
+bool QCustomPlot::removeItem(int index)
+{
+  if (index >= 0 && index < mItems.size())
+    return removeItem(mItems[index]);
+  else
+  {
+    qDebug() << Q_FUNC_INFO << "index out of bounds:" << index;
+    return false;
+  }
+}
+
+/*!
+  Removes all items from the plot.
+  
+  Returns the number of items removed.
+  
+  \see removeItem
+*/
+int QCustomPlot::clearItems()
+{
+  int c = mItems.size();
+  for (int i=c-1; i >= 0; --i)
+    removeItem(mItems[i]);
+  return c;
+}
+
+/*!
+  Returns the number of currently existing items in the plot
+  
+  \see item, addItem
+*/
+int QCustomPlot::itemCount() const
+{
+  return mItems.size();
+}
+
+/*!
+  Returns a list of the selected items. If no items are currently selected, the list is empty.
+  
+  \see setInteractions, QCPAbstractItem::setSelectable, QCPAbstractItem::setSelected
+*/
+QList<QCPAbstractItem*> QCustomPlot::selectedItems() const
+{
+  QList<QCPAbstractItem*> result;
+  foreach (QCPAbstractItem *item, mItems)
+  {
+    if (item->selected())
+      result.append(item);
+  }
+  return result;
+}
+
+/*!
+  Returns the item at the pixel position \a pos. Items that only consist of single lines (e.g. \ref
+  QCPItemLine or \ref QCPItemCurve) have a tolerance band around them, see \ref
+  setSelectionTolerance. If multiple items come into consideration, the one closest to \a pos is
+  returned.
+  
+  If \a onlySelectable is true, only items that are selectable (QCPAbstractItem::setSelectable) are
+  considered.
+  
+  If there is no item at \a pos, the return value is 0.
+  
+  \see plottableAt, layoutElementAt
+*/
+QCPAbstractItem *QCustomPlot::itemAt(const QPointF &pos, bool onlySelectable) const
+{
+  QCPAbstractItem *resultItem = 0;
+  double resultDistance = mSelectionTolerance; // only regard clicks with distances smaller than mSelectionTolerance as selections, so initialize with that value
+  
+  foreach (QCPAbstractItem *item, mItems)
+  {
+    if (onlySelectable && !item->selectable()) // we could have also passed onlySelectable to the selectTest function, but checking here is faster, because we have access to QCPAbstractItem::selectable
+      continue;
+    if (!item->clipToAxisRect() || item->clipRect().contains(pos.toPoint())) // only consider clicks inside axis cliprect of the item if actually clipped to it
+    {
+      double currentDistance = item->selectTest(pos, false);
+      if (currentDistance >= 0 && currentDistance < resultDistance)
+      {
+        resultItem = item;
+        resultDistance = currentDistance;
+      }
+    }
+  }
+  
+  return resultItem;
+}
+
+/*!
+  Returns whether this QCustomPlot contains the \a item.
+  
+  \see addItem
+*/
+bool QCustomPlot::hasItem(QCPAbstractItem *item) const
+{
+  return mItems.contains(item);
+}
+
+/*!
+  Returns the layer with the specified \a name. If there is no layer with the specified name, 0 is
+  returned.
+  
+  Layer names are case-sensitive.
+  
+  \see addLayer, moveLayer, removeLayer
+*/
+QCPLayer *QCustomPlot::layer(const QString &name) const
+{
+  foreach (QCPLayer *layer, mLayers)
+  {
+    if (layer->name() == name)
+      return layer;
+  }
+  return 0;
+}
+
+/*! \overload
+  
+  Returns the layer by \a index. If the index is invalid, 0 is returned.
+  
+  \see addLayer, moveLayer, removeLayer
+*/
+QCPLayer *QCustomPlot::layer(int index) const
+{
+  if (index >= 0 && index < mLayers.size())
+  {
+    return mLayers.at(index);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "index out of bounds:" << index;
+    return 0;
+  }
+}
+
+/*!
+  Returns the layer that is set as current layer (see \ref setCurrentLayer).
+*/
+QCPLayer *QCustomPlot::currentLayer() const
+{
+  return mCurrentLayer;
+}
+
+/*!
+  Sets the layer with the specified \a name to be the current layer. All layerables (\ref
+  QCPLayerable), e.g. plottables and items, are created on the current layer.
+  
+  Returns true on success, i.e. if there is a layer with the specified \a name in the QCustomPlot.
+  
+  Layer names are case-sensitive.
+  
+  \see addLayer, moveLayer, removeLayer, QCPLayerable::setLayer
+*/
+bool QCustomPlot::setCurrentLayer(const QString &name)
+{
+  if (QCPLayer *newCurrentLayer = layer(name))
+  {
+    return setCurrentLayer(newCurrentLayer);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "layer with name doesn't exist:" << name;
+    return false;
+  }
+}
+
+/*! \overload
+  
+  Sets the provided \a layer to be the current layer.
+  
+  Returns true on success, i.e. when \a layer is a valid layer in the QCustomPlot.
+  
+  \see addLayer, moveLayer, removeLayer
+*/
+bool QCustomPlot::setCurrentLayer(QCPLayer *layer)
+{
+  if (!mLayers.contains(layer))
+  {
+    qDebug() << Q_FUNC_INFO << "layer not a layer of this QCustomPlot:" << reinterpret_cast<quintptr>(layer);
+    return false;
+  }
+  
+  mCurrentLayer = layer;
+  return true;
+}
+
+/*!
+  Returns the number of currently existing layers in the plot
+  
+  \see layer, addLayer
+*/
+int QCustomPlot::layerCount() const
+{
+  return mLayers.size();
+}
+
+/*!
+  Adds a new layer to this QCustomPlot instance. The new layer will have the name \a name, which
+  must be unique. Depending on \a insertMode, it is positioned either below or above \a otherLayer.
+  
+  Returns true on success, i.e. if there is no other layer named \a name and \a otherLayer is a
+  valid layer inside this QCustomPlot.
+  
+  If \a otherLayer is 0, the highest layer in the QCustomPlot will be used.
+  
+  For an explanation of what layers are in QCustomPlot, see the documentation of \ref QCPLayer.
+  
+  \see layer, moveLayer, removeLayer
+*/
+bool QCustomPlot::addLayer(const QString &name, QCPLayer *otherLayer, QCustomPlot::LayerInsertMode insertMode)
+{
+  if (!otherLayer)
+    otherLayer = mLayers.last();
+  if (!mLayers.contains(otherLayer))
+  {
+    qDebug() << Q_FUNC_INFO << "otherLayer not a layer of this QCustomPlot:" << reinterpret_cast<quintptr>(otherLayer);
+    return false;
+  }
+  if (layer(name))
+  {
+    qDebug() << Q_FUNC_INFO << "A layer exists already with the name" << name;
+    return false;
+  }
+    
+  QCPLayer *newLayer = new QCPLayer(this, name);
+  mLayers.insert(otherLayer->index() + (insertMode==limAbove ? 1:0), newLayer);
+  updateLayerIndices();
+  return true;
+}
+
+/*!
+  Removes the specified \a layer and returns true on success.
+  
+  All layerables (e.g. plottables and items) on the removed layer will be moved to the layer below
+  \a layer. If \a layer is the bottom layer, the layerables are moved to the layer above. In both
+  cases, the total rendering order of all layerables in the QCustomPlot is preserved.
+  
+  If \a layer is the current layer (\ref setCurrentLayer), the layer below (or above, if bottom
+  layer) becomes the new current layer.
+  
+  It is not possible to remove the last layer of the plot.
+  
+  \see layer, addLayer, moveLayer
+*/
+bool QCustomPlot::removeLayer(QCPLayer *layer)
+{
+  if (!mLayers.contains(layer))
+  {
+    qDebug() << Q_FUNC_INFO << "layer not a layer of this QCustomPlot:" << reinterpret_cast<quintptr>(layer);
+    return false;
+  }
+  if (mLayers.size() < 2)
+  {
+    qDebug() << Q_FUNC_INFO << "can't remove last layer";
+    return false;
+  }
+  
+  // append all children of this layer to layer below (if this is lowest layer, prepend to layer above)
+  int removedIndex = layer->index();
+  bool isFirstLayer = removedIndex==0;
+  QCPLayer *targetLayer = isFirstLayer ? mLayers.at(removedIndex+1) : mLayers.at(removedIndex-1);
+  QList<QCPLayerable*> children = layer->children();
+  if (isFirstLayer) // prepend in reverse order (so order relative to each other stays the same)
+  {
+    for (int i=children.size()-1; i>=0; --i)
+      children.at(i)->moveToLayer(targetLayer, true);
+  } else  // append normally
+  {
+    for (int i=0; i<children.size(); ++i)
+      children.at(i)->moveToLayer(targetLayer, false);
+  }
+  // if removed layer is current layer, change current layer to layer below/above:
+  if (layer == mCurrentLayer)
+    setCurrentLayer(targetLayer);
+  // remove layer:
+  delete layer;
+  mLayers.removeOne(layer);
+  updateLayerIndices();
+  return true;
+}
+
+/*!
+  Moves the specified \a layer either above or below \a otherLayer. Whether it's placed above or
+  below is controlled with \a insertMode.
+  
+  Returns true on success, i.e. when both \a layer and \a otherLayer are valid layers in the
+  QCustomPlot.
+  
+  \see layer, addLayer, moveLayer
+*/
+bool QCustomPlot::moveLayer(QCPLayer *layer, QCPLayer *otherLayer, QCustomPlot::LayerInsertMode insertMode)
+{
+  if (!mLayers.contains(layer))
+  {
+    qDebug() << Q_FUNC_INFO << "layer not a layer of this QCustomPlot:" << reinterpret_cast<quintptr>(layer);
+    return false;
+  }
+  if (!mLayers.contains(otherLayer))
+  {
+    qDebug() << Q_FUNC_INFO << "otherLayer not a layer of this QCustomPlot:" << reinterpret_cast<quintptr>(otherLayer);
+    return false;
+  }
+  
+  if (layer->index() > otherLayer->index())
+    mLayers.move(layer->index(), otherLayer->index() + (insertMode==limAbove ? 1:0));
+  else if (layer->index() < otherLayer->index())
+    mLayers.move(layer->index(), otherLayer->index() + (insertMode==limAbove ? 0:-1));
+  
+  updateLayerIndices();
+  return true;
+}
+
+/*!
+  Returns the number of axis rects in the plot.
+  
+  All axis rects can be accessed via QCustomPlot::axisRect().
+  
+  Initially, only one axis rect exists in the plot.
+  
+  \see axisRect, axisRects
+*/
+int QCustomPlot::axisRectCount() const
+{
+  return axisRects().size();
+}
+
+/*!
+  Returns the axis rect with \a index.
+  
+  Initially, only one axis rect (with index 0) exists in the plot. If multiple axis rects were
+  added, all of them may be accessed with this function in a linear fashion (even when they are
+  nested in a layout hierarchy or inside other axis rects via QCPAxisRect::insetLayout).
+  
+  \see axisRectCount, axisRects
+*/
+QCPAxisRect *QCustomPlot::axisRect(int index) const
+{
+  const QList<QCPAxisRect*> rectList = axisRects();
+  if (index >= 0 && index < rectList.size())
+  {
+    return rectList.at(index);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "invalid axis rect index" << index;
+    return 0;
+  }
+}
+
+/*!
+  Returns all axis rects in the plot.
+  
+  \see axisRectCount, axisRect
+*/
+QList<QCPAxisRect*> QCustomPlot::axisRects() const
+{
+  QList<QCPAxisRect*> result;
+  QStack<QCPLayoutElement*> elementStack;
+  if (mPlotLayout)
+    elementStack.push(mPlotLayout);
+  
+  while (!elementStack.isEmpty())
+  {
+    foreach (QCPLayoutElement *element, elementStack.pop()->elements(false))
+    {
+      if (element)
+      {
+        elementStack.push(element);
+        if (QCPAxisRect *ar = qobject_cast<QCPAxisRect*>(element))
+          result.append(ar);
+      }
+    }
+  }
+  
+  return result;
+}
+
+/*!
+  Returns the layout element at pixel position \a pos. If there is no element at that position,
+  returns 0.
+  
+  Only visible elements are used. If \ref QCPLayoutElement::setVisible on the element itself or on
+  any of its parent elements is set to false, it will not be considered.
+  
+  \see itemAt, plottableAt
+*/
+QCPLayoutElement *QCustomPlot::layoutElementAt(const QPointF &pos) const
+{
+  QCPLayoutElement *currentElement = mPlotLayout;
+  bool searchSubElements = true;
+  while (searchSubElements && currentElement)
+  {
+    searchSubElements = false;
+    foreach (QCPLayoutElement *subElement, currentElement->elements(false))
+    {
+      if (subElement && subElement->realVisibility() && subElement->selectTest(pos, false) >= 0)
+      {
+        currentElement = subElement;
+        searchSubElements = true;
+        break;
+      }
+    }
+  }
+  return currentElement;
+}
+
+/*!
+  Returns the axes that currently have selected parts, i.e. whose selection state is not \ref
+  QCPAxis::spNone.
+  
+  \see selectedPlottables, selectedLegends, setInteractions, QCPAxis::setSelectedParts,
+  QCPAxis::setSelectableParts
+*/
+QList<QCPAxis*> QCustomPlot::selectedAxes() const
+{
+  QList<QCPAxis*> result, allAxes;
+  foreach (QCPAxisRect *rect, axisRects())
+    allAxes << rect->axes();
+  
+  foreach (QCPAxis *axis, allAxes)
+  {
+    if (axis->selectedParts() != QCPAxis::spNone)
+      result.append(axis);
+  }
+  
+  return result;
+}
+
+/*!
+  Returns the legends that currently have selected parts, i.e. whose selection state is not \ref
+  QCPLegend::spNone.
+  
+  \see selectedPlottables, selectedAxes, setInteractions, QCPLegend::setSelectedParts,
+  QCPLegend::setSelectableParts, QCPLegend::selectedItems
+*/
+QList<QCPLegend*> QCustomPlot::selectedLegends() const
+{
+  QList<QCPLegend*> result;
+  
+  QStack<QCPLayoutElement*> elementStack;
+  if (mPlotLayout)
+    elementStack.push(mPlotLayout);
+  
+  while (!elementStack.isEmpty())
+  {
+    foreach (QCPLayoutElement *subElement, elementStack.pop()->elements(false))
+    {
+      if (subElement)
+      {
+        elementStack.push(subElement);
+        if (QCPLegend *leg = qobject_cast<QCPLegend*>(subElement))
+        {
+          if (leg->selectedParts() != QCPLegend::spNone)
+            result.append(leg);
+        }
+      }
+    }
+  }
+  
+  return result;
+}
+
+/*!
+  Deselects all layerables (plottables, items, axes, legends,...) of the QCustomPlot.
+  
+  Since calling this function is not a user interaction, this does not emit the \ref
+  selectionChangedByUser signal. The individual selectionChanged signals are emitted though, if the
+  objects were previously selected.
+  
+  \see setInteractions, selectedPlottables, selectedItems, selectedAxes, selectedLegends
+*/
+void QCustomPlot::deselectAll()
+{
+  foreach (QCPLayer *layer, mLayers)
+  {
+    foreach (QCPLayerable *layerable, layer->children())
+      layerable->deselectEvent(0);
+  }
+}
+
+/*!
+  Causes a complete replot into the internal buffer. Finally, update() is called, to redraw the
+  buffer on the QCustomPlot widget surface. This is the method that must be called to make changes,
+  for example on the axis ranges or data points of graphs, visible.
+  
+  Under a few circumstances, QCustomPlot causes a replot by itself. Those are resize events of the
+  QCustomPlot widget and user interactions (object selection and range dragging/zooming).
+  
+  Before the replot happens, the signal \ref beforeReplot is emitted. After the replot, \ref
+  afterReplot is emitted. It is safe to mutually connect the replot slot with any of those two
+  signals on two QCustomPlots to make them replot synchronously, it won't cause an infinite
+  recursion.
+*/
+void QCustomPlot::replot(QCustomPlot::RefreshPriority refreshPriority)
+{
+  if (mReplotting) // incase signals loop back to replot slot
+    return;
+  mReplotting = true;
+  emit beforeReplot();
+  
+  mPaintBuffer.fill(mBackgroundBrush.style() == Qt::SolidPattern ? mBackgroundBrush.color() : Qt::transparent);
+  QCPPainter painter;
+  painter.begin(&mPaintBuffer);
+  if (painter.isActive())
+  {
+    painter.setRenderHint(QPainter::HighQualityAntialiasing); // to make Antialiasing look good if using the OpenGL graphicssystem
+    if (mBackgroundBrush.style() != Qt::SolidPattern && mBackgroundBrush.style() != Qt::NoBrush)
+      painter.fillRect(mViewport, mBackgroundBrush);
+    draw(&painter);
+    painter.end();
+    if ((refreshPriority == rpHint && mPlottingHints.testFlag(QCP::phForceRepaint)) || refreshPriority==rpImmediate)
+      repaint();
+    else
+      update();
+  } else // might happen if QCustomPlot has width or height zero
+    qDebug() << Q_FUNC_INFO << "Couldn't activate painter on buffer. This usually happens because QCustomPlot has width or height zero.";
+  
+  emit afterReplot();
+  mReplotting = false;
+}
+
+/*!
+  Rescales the axes such that all plottables (like graphs) in the plot are fully visible.
+  
+  if \a onlyVisiblePlottables is set to true, only the plottables that have their visibility set to true
+  (QCPLayerable::setVisible), will be used to rescale the axes.
+  
+  \see QCPAbstractPlottable::rescaleAxes, QCPAxis::rescale
+*/
+void QCustomPlot::rescaleAxes(bool onlyVisiblePlottables)
+{
+  QList<QCPAxis*> allAxes;
+  foreach (QCPAxisRect *rect, axisRects())
+    allAxes << rect->axes();
+  
+  foreach (QCPAxis *axis, allAxes)
+    axis->rescale(onlyVisiblePlottables);
+}
+
+/*!
+  Saves a PDF with the vectorized plot to the file \a fileName. The axis ratio as well as the scale
+  of texts and lines will be derived from the specified \a width and \a height. This means, the
+  output will look like the normal on-screen output of a QCustomPlot widget with the corresponding
+  pixel width and height. If either \a width or \a height is zero, the exported image will have the
+  same dimensions as the QCustomPlot widget currently has.
+
+  \a noCosmeticPen disables the use of cosmetic pens when drawing to the PDF file. Cosmetic pens
+  are pens with numerical width 0, which are always drawn as a one pixel wide line, no matter what
+  zoom factor is set in the PDF-Viewer. For more information about cosmetic pens, see the QPainter
+  and QPen documentation.
+  
+  The objects of the plot will appear in the current selection state. If you don't want any
+  selected objects to be painted in their selected look, deselect everything with \ref deselectAll
+  before calling this function.
+
+  Returns true on success.
+  
+  \warning
+  \li If you plan on editing the exported PDF file with a vector graphics editor like
+  Inkscape, it is advised to set \a noCosmeticPen to true to avoid losing those cosmetic lines
+  (which might be quite many, because cosmetic pens are the default for e.g. axes and tick marks).
+  \li If calling this function inside the constructor of the parent of the QCustomPlot widget
+  (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide
+  explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this
+  function uses the current width and height of the QCustomPlot widget. However, in Qt, these
+  aren't defined yet inside the constructor, so you would get an image that has strange
+  widths/heights.
+  
+  \a pdfCreator and \a pdfTitle may be used to set the according metadata fields in the resulting
+  PDF file.
+  
+  \note On Android systems, this method does nothing and issues an according qDebug warning
+  message. This is also the case if for other reasons the define flag QT_NO_PRINTER is set.
+  
+  \see savePng, saveBmp, saveJpg, saveRastered
+*/
+bool QCustomPlot::savePdf(const QString &fileName, bool noCosmeticPen, int width, int height, const QString &pdfCreator, const QString &pdfTitle)
+{
+  bool success = false;
+#ifdef QT_NO_PRINTER
+  Q_UNUSED(fileName)
+  Q_UNUSED(noCosmeticPen)
+  Q_UNUSED(width)
+  Q_UNUSED(height)
+  Q_UNUSED(pdfCreator)
+  Q_UNUSED(pdfTitle)
+  qDebug() << Q_FUNC_INFO << "Qt was built without printer support (QT_NO_PRINTER). PDF not created.";
+#else
+  int newWidth, newHeight;
+  if (width == 0 || height == 0)
+  {
+    newWidth = this->width();
+    newHeight = this->height();
+  } else
+  {
+    newWidth = width;
+    newHeight = height;
+  }
+  
+  QPrinter printer(QPrinter::ScreenResolution);
+  printer.setOutputFileName(fileName);
+  printer.setOutputFormat(QPrinter::PdfFormat);
+  printer.setColorMode(QPrinter::Color);
+  printer.printEngine()->setProperty(QPrintEngine::PPK_Creator, pdfCreator);
+  printer.printEngine()->setProperty(QPrintEngine::PPK_DocumentName, pdfTitle);
+  QRect oldViewport = viewport();
+  setViewport(QRect(0, 0, newWidth, newHeight));
+#if QT_VERSION < QT_VERSION_CHECK(5, 3, 0)
+  printer.setFullPage(true);
+  printer.setPaperSize(viewport().size(), QPrinter::DevicePixel);
+#else
+  QPageLayout pageLayout;
+  pageLayout.setMode(QPageLayout::FullPageMode);
+  pageLayout.setOrientation(QPageLayout::Portrait);
+  pageLayout.setMargins(QMarginsF(0, 0, 0, 0));
+  pageLayout.setPageSize(QPageSize(viewport().size(), QPageSize::Point, QString(), QPageSize::ExactMatch));
+  printer.setPageLayout(pageLayout);
+#endif
+  QCPPainter printpainter;
+  if (printpainter.begin(&printer))
+  {
+    printpainter.setMode(QCPPainter::pmVectorized);
+    printpainter.setMode(QCPPainter::pmNoCaching);
+    printpainter.setMode(QCPPainter::pmNonCosmetic, noCosmeticPen);
+    printpainter.setWindow(mViewport);
+    if (mBackgroundBrush.style() != Qt::NoBrush &&
+        mBackgroundBrush.color() != Qt::white &&
+        mBackgroundBrush.color() != Qt::transparent &&
+        mBackgroundBrush.color().alpha() > 0) // draw pdf background color if not white/transparent
+      printpainter.fillRect(viewport(), mBackgroundBrush);
+    draw(&printpainter);
+    printpainter.end();
+    success = true;
+  }
+  setViewport(oldViewport);
+#endif // QT_NO_PRINTER
+  return success;
+}
+
+/*!
+  Saves a PNG image file to \a fileName on disc. The output plot will have the dimensions \a width
+  and \a height in pixels. If either \a width or \a height is zero, the exported image will have
+  the same dimensions as the QCustomPlot widget currently has. Line widths and texts etc. are not
+  scaled up when larger widths/heights are used. If you want that effect, use the \a scale parameter.
+
+  For example, if you set both \a width and \a height to 100 and \a scale to 2, you will end up with an
+  image file of size 200*200 in which all graphical elements are scaled up by factor 2 (line widths,
+  texts, etc.). This scaling is not done by stretching a 100*100 image, the result will have full
+  200*200 pixel resolution.
+  
+  If you use a high scaling factor, it is recommended to enable antialiasing for all elements via
+  temporarily setting \ref QCustomPlot::setAntialiasedElements to \ref QCP::aeAll as this allows
+  QCustomPlot to place objects with sub-pixel accuracy.
+
+  \warning If calling this function inside the constructor of the parent of the QCustomPlot widget
+  (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide
+  explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this
+  function uses the current width and height of the QCustomPlot widget. However, in Qt, these
+  aren't defined yet inside the constructor, so you would get an image that has strange
+  widths/heights.
+  
+  The objects of the plot will appear in the current selection state. If you don't want any selected
+  objects to be painted in their selected look, deselect everything with \ref deselectAll before calling
+  this function.
+
+  If you want the PNG to have a transparent background, call \ref setBackground(const QBrush
+  &brush) with no brush (Qt::NoBrush) or a transparent color (Qt::transparent), before saving.
+
+  PNG compression can be controlled with the \a quality parameter which must be between 0 and 100 or
+  -1 to use the default setting.
+  
+  Returns true on success. If this function fails, most likely the PNG format isn't supported by
+  the system, see Qt docs about QImageWriter::supportedImageFormats().
+
+  \see savePdf, saveBmp, saveJpg, saveRastered
+*/
+bool QCustomPlot::savePng(const QString &fileName, int width, int height, double scale, int quality)
+{
+  return saveRastered(fileName, width, height, scale, "PNG", quality);
+}
+
+/*!
+  Saves a JPG image file to \a fileName on disc. The output plot will have the dimensions \a width
+  and \a height in pixels. If either \a width or \a height is zero, the exported image will have
+  the same dimensions as the QCustomPlot widget currently has. Line widths and texts etc. are not
+  scaled up when larger widths/heights are used. If you want that effect, use the \a scale parameter.
+
+  For example, if you set both \a width and \a height to 100 and \a scale to 2, you will end up with an
+  image file of size 200*200 in which all graphical elements are scaled up by factor 2 (line widths,
+  texts, etc.). This scaling is not done by stretching a 100*100 image, the result will have full
+  200*200 pixel resolution.
+  
+  If you use a high scaling factor, it is recommended to enable antialiasing for all elements via
+  temporarily setting \ref QCustomPlot::setAntialiasedElements to \ref QCP::aeAll as this allows
+  QCustomPlot to place objects with sub-pixel accuracy.
+
+  \warning If calling this function inside the constructor of the parent of the QCustomPlot widget
+  (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide
+  explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this
+  function uses the current width and height of the QCustomPlot widget. However, in Qt, these
+  aren't defined yet inside the constructor, so you would get an image that has strange
+  widths/heights.
+
+  The objects of the plot will appear in the current selection state. If you don't want any selected
+  objects to be painted in their selected look, deselect everything with \ref deselectAll before calling
+  this function.
+
+  JPG compression can be controlled with the \a quality parameter which must be between 0 and 100 or
+  -1 to use the default setting.
+  
+  Returns true on success. If this function fails, most likely the JPG format isn't supported by
+  the system, see Qt docs about QImageWriter::supportedImageFormats().
+
+  \see savePdf, savePng, saveBmp, saveRastered
+*/
+bool QCustomPlot::saveJpg(const QString &fileName, int width, int height, double scale, int quality)
+{
+  return saveRastered(fileName, width, height, scale, "JPG", quality);
+}
+
+/*!
+  Saves a BMP image file to \a fileName on disc. The output plot will have the dimensions \a width
+  and \a height in pixels. If either \a width or \a height is zero, the exported image will have
+  the same dimensions as the QCustomPlot widget currently has. Line widths and texts etc. are not
+  scaled up when larger widths/heights are used. If you want that effect, use the \a scale parameter.
+
+  For example, if you set both \a width and \a height to 100 and \a scale to 2, you will end up with an
+  image file of size 200*200 in which all graphical elements are scaled up by factor 2 (line widths,
+  texts, etc.). This scaling is not done by stretching a 100*100 image, the result will have full
+  200*200 pixel resolution.
+  
+  If you use a high scaling factor, it is recommended to enable antialiasing for all elements via
+  temporarily setting \ref QCustomPlot::setAntialiasedElements to \ref QCP::aeAll as this allows
+  QCustomPlot to place objects with sub-pixel accuracy.
+
+  \warning If calling this function inside the constructor of the parent of the QCustomPlot widget
+  (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide
+  explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this
+  function uses the current width and height of the QCustomPlot widget. However, in Qt, these
+  aren't defined yet inside the constructor, so you would get an image that has strange
+  widths/heights.
+
+  The objects of the plot will appear in the current selection state. If you don't want any selected
+  objects to be painted in their selected look, deselect everything with \ref deselectAll before calling
+  this function.
+  
+  Returns true on success. If this function fails, most likely the BMP format isn't supported by
+  the system, see Qt docs about QImageWriter::supportedImageFormats().
+
+  \see savePdf, savePng, saveJpg, saveRastered
+*/
+bool QCustomPlot::saveBmp(const QString &fileName, int width, int height, double scale)
+{
+  return saveRastered(fileName, width, height, scale, "BMP");
+}
+
+/*! \internal
+  
+  Returns a minimum size hint that corresponds to the minimum size of the top level layout
+  (\ref plotLayout). To prevent QCustomPlot from being collapsed to size/width zero, set a minimum
+  size (setMinimumSize) either on the whole QCustomPlot or on any layout elements inside the plot.
+  This is especially important, when placed in a QLayout where other components try to take in as
+  much space as possible (e.g. QMdiArea).
+*/
+QSize QCustomPlot::minimumSizeHint() const
+{
+  return mPlotLayout->minimumSizeHint();
+}
+
+/*! \internal
+  
+  Returns a size hint that is the same as \ref minimumSizeHint.
+  
+*/
+QSize QCustomPlot::sizeHint() const
+{
+  return mPlotLayout->minimumSizeHint();
+}
+
+/*! \internal
+  
+  Event handler for when the QCustomPlot widget needs repainting. This does not cause a \ref replot, but
+  draws the internal buffer on the widget surface.
+*/
+void QCustomPlot::paintEvent(QPaintEvent *event)
+{
+  Q_UNUSED(event);
+  QPainter painter(this);
+  painter.drawPixmap(0, 0, mPaintBuffer);
+}
+
+/*! \internal
+  
+  Event handler for a resize of the QCustomPlot widget. Causes the internal buffer to be resized to
+  the new size. The viewport (which becomes the outer rect of mPlotLayout) is resized
+  appropriately. Finally a \ref replot is performed.
+*/
+void QCustomPlot::resizeEvent(QResizeEvent *event)
+{
+  // resize and repaint the buffer:
+  mPaintBuffer = QPixmap(event->size());
+  setViewport(rect());
+  replot(rpQueued); // queued update is important here, to prevent painting issues in some contexts
+}
+
+/*! \internal
+  
+ Event handler for when a double click occurs. Emits the \ref mouseDoubleClick signal, then emits
+ the specialized signals when certain objecs are clicked (e.g. \ref plottableDoubleClick, \ref
+ axisDoubleClick, etc.). Finally determines the affected layout element and forwards the event to
+ it.
+ 
+ \see mousePressEvent, mouseReleaseEvent
+*/
+void QCustomPlot::mouseDoubleClickEvent(QMouseEvent *event)
+{
+  emit mouseDoubleClick(event);
+  
+  QVariant details;
+  QCPLayerable *clickedLayerable = layerableAt(event->pos(), false, &details);
+  
+  // emit specialized object double click signals:
+  if (QCPAbstractPlottable *ap = qobject_cast<QCPAbstractPlottable*>(clickedLayerable))
+    emit plottableDoubleClick(ap, event);
+  else if (QCPAxis *ax = qobject_cast<QCPAxis*>(clickedLayerable))
+    emit axisDoubleClick(ax, details.value<QCPAxis::SelectablePart>(), event);
+  else if (QCPAbstractItem *ai = qobject_cast<QCPAbstractItem*>(clickedLayerable))
+    emit itemDoubleClick(ai, event);
+  else if (QCPLegend *lg = qobject_cast<QCPLegend*>(clickedLayerable))
+    emit legendDoubleClick(lg, 0, event);
+  else if (QCPAbstractLegendItem *li = qobject_cast<QCPAbstractLegendItem*>(clickedLayerable))
+    emit legendDoubleClick(li->parentLegend(), li, event);
+  else if (QCPPlotTitle *pt = qobject_cast<QCPPlotTitle*>(clickedLayerable))
+    emit titleDoubleClick(event, pt);
+  
+  // call double click event of affected layout element:
+  if (QCPLayoutElement *el = layoutElementAt(event->pos()))
+    el->mouseDoubleClickEvent(event);
+  
+  // call release event of affected layout element (as in mouseReleaseEvent, since the mouseDoubleClick replaces the second release event in double click case):
+  if (mMouseEventElement)
+  {
+    mMouseEventElement->mouseReleaseEvent(event);
+    mMouseEventElement = 0;
+  }
+  
+  //QWidget::mouseDoubleClickEvent(event); don't call base class implementation because it would just cause a mousePress/ReleaseEvent, which we don't want.
+}
+
+/*! \internal
+  
+  Event handler for when a mouse button is pressed. Emits the mousePress signal. Then determines
+  the affected layout element and forwards the event to it.
+  
+  \see mouseMoveEvent, mouseReleaseEvent
+*/
+void QCustomPlot::mousePressEvent(QMouseEvent *event)
+{
+  emit mousePress(event);
+  mMousePressPos = event->pos(); // need this to determine in releaseEvent whether it was a click (no position change between press and release)
+  
+  // call event of affected layout element:
+  mMouseEventElement = layoutElementAt(event->pos());
+  if (mMouseEventElement)
+    mMouseEventElement->mousePressEvent(event);
+  
+  QWidget::mousePressEvent(event);
+}
+
+/*! \internal
+  
+  Event handler for when the cursor is moved. Emits the \ref mouseMove signal.
+
+  If a layout element has mouse capture focus (a mousePressEvent happened on top of the layout
+  element before), the mouseMoveEvent is forwarded to that element.
+  
+  \see mousePressEvent, mouseReleaseEvent
+*/
+void QCustomPlot::mouseMoveEvent(QMouseEvent *event)
+{
+  emit mouseMove(event);
+
+  // call event of affected layout element:
+  if (mMouseEventElement)
+    mMouseEventElement->mouseMoveEvent(event);
+  
+  QWidget::mouseMoveEvent(event);
+}
+
+/*! \internal
+  
+  Event handler for when a mouse button is released. Emits the \ref mouseRelease signal.
+  
+  If the mouse was moved less than a certain threshold in any direction since the \ref
+  mousePressEvent, it is considered a click which causes the selection mechanism (if activated via
+  \ref setInteractions) to possibly change selection states accordingly. Further, specialized mouse
+  click signals are emitted (e.g. \ref plottableClick, \ref axisClick, etc.)
+  
+  If a layout element has mouse capture focus (a \ref mousePressEvent happened on top of the layout
+  element before), the \ref mouseReleaseEvent is forwarded to that element.
+  
+  \see mousePressEvent, mouseMoveEvent
+*/
+void QCustomPlot::mouseReleaseEvent(QMouseEvent *event)
+{
+  emit mouseRelease(event);
+  bool doReplot = false;
+  
+  if ((mMousePressPos-event->pos()).manhattanLength() < 5) // determine whether it was a click operation
+  {
+    if (event->button() == Qt::LeftButton)
+    {
+      // handle selection mechanism:
+      QVariant details;
+      QCPLayerable *clickedLayerable = layerableAt(event->pos(), true, &details);
+      bool selectionStateChanged = false;
+      bool additive = mInteractions.testFlag(QCP::iMultiSelect) && event->modifiers().testFlag(mMultiSelectModifier);
+      // deselect all other layerables if not additive selection:
+      if (!additive)
+      {
+        foreach (QCPLayer *layer, mLayers)
+        {
+          foreach (QCPLayerable *layerable, layer->children())
+          {
+            if (layerable != clickedLayerable && mInteractions.testFlag(layerable->selectionCategory()))
+            {
+              bool selChanged = false;
+              layerable->deselectEvent(&selChanged);
+              selectionStateChanged |= selChanged;
+            }
+          }
+        }
+      }
+      if (clickedLayerable && mInteractions.testFlag(clickedLayerable->selectionCategory()))
+      {
+        // a layerable was actually clicked, call its selectEvent:
+        bool selChanged = false;
+        clickedLayerable->selectEvent(event, additive, details, &selChanged);
+        selectionStateChanged |= selChanged;
+      }
+      if (selectionStateChanged)
+      {
+        doReplot = true;
+        emit selectionChangedByUser();
+      }
+    }
+    
+    // emit specialized object click signals:
+    QVariant details;
+    QCPLayerable *clickedLayerable = layerableAt(event->pos(), false, &details); // for these signals, selectability is ignored, that's why we call this again with onlySelectable set to false
+    if (QCPAbstractPlottable *ap = qobject_cast<QCPAbstractPlottable*>(clickedLayerable))
+      emit plottableClick(ap, event);
+    else if (QCPAxis *ax = qobject_cast<QCPAxis*>(clickedLayerable))
+      emit axisClick(ax, details.value<QCPAxis::SelectablePart>(), event);
+    else if (QCPAbstractItem *ai = qobject_cast<QCPAbstractItem*>(clickedLayerable))
+      emit itemClick(ai, event);
+    else if (QCPLegend *lg = qobject_cast<QCPLegend*>(clickedLayerable))
+      emit legendClick(lg, 0, event);
+    else if (QCPAbstractLegendItem *li = qobject_cast<QCPAbstractLegendItem*>(clickedLayerable))
+      emit legendClick(li->parentLegend(), li, event);
+    else if (QCPPlotTitle *pt = qobject_cast<QCPPlotTitle*>(clickedLayerable))
+      emit titleClick(event, pt);
+  }
+  
+  // call event of affected layout element:
+  if (mMouseEventElement)
+  {
+    mMouseEventElement->mouseReleaseEvent(event);
+    mMouseEventElement = 0;
+  }
+  
+  if (doReplot || noAntialiasingOnDrag())
+    replot();
+  
+  QWidget::mouseReleaseEvent(event);
+}
+
+/*! \internal
+  
+  Event handler for mouse wheel events. First, the \ref mouseWheel signal is emitted. Then
+  determines the affected layout element and forwards the event to it.
+  
+*/
+void QCustomPlot::wheelEvent(QWheelEvent *event)
+{
+  emit mouseWheel(event);
+  
+  // call event of affected layout element:
+  if (QCPLayoutElement *el = layoutElementAt(event->pos()))
+    el->wheelEvent(event);
+  
+  QWidget::wheelEvent(event);
+}
+
+/*! \internal
+  
+  This is the main draw function. It draws the entire plot, including background pixmap, with the
+  specified \a painter. Note that it does not fill the background with the background brush (as the
+  user may specify with \ref setBackground(const QBrush &brush)), this is up to the respective
+  functions calling this method (e.g. \ref replot, \ref toPixmap and \ref toPainter).
+*/
+void QCustomPlot::draw(QCPPainter *painter)
+{
+  // run through layout phases:
+  mPlotLayout->update(QCPLayoutElement::upPreparation);
+  mPlotLayout->update(QCPLayoutElement::upMargins);
+  mPlotLayout->update(QCPLayoutElement::upLayout);
+  
+  // draw viewport background pixmap:
+  drawBackground(painter);
+
+  // draw all layered objects (grid, axes, plottables, items, legend,...):
+  foreach (QCPLayer *layer, mLayers)
+  {
+    foreach (QCPLayerable *child, layer->children())
+    {
+      if (child->realVisibility())
+      {
+        painter->save();
+        painter->setClipRect(child->clipRect().translated(0, -1));
+        child->applyDefaultAntialiasingHint(painter);
+        child->draw(painter);
+        painter->restore();
+      }
+    }
+  }
+  
+  /* Debug code to draw all layout element rects
+  foreach (QCPLayoutElement* el, findChildren<QCPLayoutElement*>())
+  {
+    painter->setBrush(Qt::NoBrush);
+    painter->setPen(QPen(QColor(0, 0, 0, 100), 0, Qt::DashLine));
+    painter->drawRect(el->rect());
+    painter->setPen(QPen(QColor(255, 0, 0, 100), 0, Qt::DashLine));
+    painter->drawRect(el->outerRect());
+  }
+  */
+}
+
+/*! \internal
+  
+  Draws the viewport background pixmap of the plot.
+  
+  If a pixmap was provided via \ref setBackground, this function buffers the scaled version
+  depending on \ref setBackgroundScaled and \ref setBackgroundScaledMode and then draws it inside
+  the viewport with the provided \a painter. The scaled version is buffered in
+  mScaledBackgroundPixmap to prevent expensive rescaling at every redraw. It is only updated, when
+  the axis rect has changed in a way that requires a rescale of the background pixmap (this is
+  dependent on the \ref setBackgroundScaledMode), or when a differend axis background pixmap was
+  set.
+  
+  Note that this function does not draw a fill with the background brush (\ref setBackground(const
+  QBrush &brush)) beneath the pixmap.
+  
+  \see setBackground, setBackgroundScaled, setBackgroundScaledMode
+*/
+void QCustomPlot::drawBackground(QCPPainter *painter)
+{
+  // Note: background color is handled in individual replot/save functions
+
+  // draw background pixmap (on top of fill, if brush specified):
+  if (!mBackgroundPixmap.isNull())
+  {
+    if (mBackgroundScaled)
+    {
+      // check whether mScaledBackground needs to be updated:
+      QSize scaledSize(mBackgroundPixmap.size());
+      scaledSize.scale(mViewport.size(), mBackgroundScaledMode);
+      if (mScaledBackgroundPixmap.size() != scaledSize)
+        mScaledBackgroundPixmap = mBackgroundPixmap.scaled(mViewport.size(), mBackgroundScaledMode, Qt::SmoothTransformation);
+      painter->drawPixmap(mViewport.topLeft(), mScaledBackgroundPixmap, QRect(0, 0, mViewport.width(), mViewport.height()) & mScaledBackgroundPixmap.rect());
+    } else
+    {
+      painter->drawPixmap(mViewport.topLeft(), mBackgroundPixmap, QRect(0, 0, mViewport.width(), mViewport.height()));
+    }
+  }
+}
+
+
+/*! \internal
+  
+  This method is used by \ref QCPAxisRect::removeAxis to report removed axes to the QCustomPlot
+  so it may clear its QCustomPlot::xAxis, yAxis, xAxis2 and yAxis2 members accordingly.
+*/
+void QCustomPlot::axisRemoved(QCPAxis *axis)
+{
+  if (xAxis == axis)
+    xAxis = 0;
+  if (xAxis2 == axis)
+    xAxis2 = 0;
+  if (yAxis == axis)
+    yAxis = 0;
+  if (yAxis2 == axis)
+    yAxis2 = 0;
+  
+  // Note: No need to take care of range drag axes and range zoom axes, because they are stored in smart pointers
+}
+
+/*! \internal
+  
+  This method is used by the QCPLegend destructor to report legend removal to the QCustomPlot so
+  it may clear its QCustomPlot::legend member accordingly.
+*/
+void QCustomPlot::legendRemoved(QCPLegend *legend)
+{
+  if (this->legend == legend)
+    this->legend = 0;
+}
+
+/*! \internal
+  
+  Assigns all layers their index (QCPLayer::mIndex) in the mLayers list. This method is thus called
+  after every operation that changes the layer indices, like layer removal, layer creation, layer
+  moving.
+*/
+void QCustomPlot::updateLayerIndices() const
+{
+  for (int i=0; i<mLayers.size(); ++i)
+    mLayers.at(i)->mIndex = i;
+}
+
+/*! \internal
+  
+  Returns the layerable at pixel position \a pos. If \a onlySelectable is set to true, only those
+  layerables that are selectable will be considered. (Layerable subclasses communicate their
+  selectability via the QCPLayerable::selectTest method, by returning -1.)
+
+  \a selectionDetails is an output parameter that contains selection specifics of the affected
+  layerable. This is useful if the respective layerable shall be given a subsequent
+  QCPLayerable::selectEvent (like in \ref mouseReleaseEvent). \a selectionDetails usually contains
+  information about which part of the layerable was hit, in multi-part layerables (e.g.
+  QCPAxis::SelectablePart).
+*/
+QCPLayerable *QCustomPlot::layerableAt(const QPointF &pos, bool onlySelectable, QVariant *selectionDetails) const
+{
+  for (int layerIndex=mLayers.size()-1; layerIndex>=0; --layerIndex)
+  {
+    const QList<QCPLayerable*> layerables = mLayers.at(layerIndex)->children();
+    double minimumDistance = selectionTolerance()*1.1;
+    QCPLayerable *minimumDistanceLayerable = 0;
+    for (int i=layerables.size()-1; i>=0; --i)
+    {
+      if (!layerables.at(i)->realVisibility())
+        continue;
+      QVariant details;
+      double dist = layerables.at(i)->selectTest(pos, onlySelectable, &details);
+      if (dist >= 0 && dist < minimumDistance)
+      {
+        minimumDistance = dist;
+        minimumDistanceLayerable = layerables.at(i);
+        if (selectionDetails) *selectionDetails = details;
+      }
+    }
+    if (minimumDistance < selectionTolerance())
+      return minimumDistanceLayerable;
+  }
+  return 0;
+}
+
+/*!
+  Saves the plot to a rastered image file \a fileName in the image format \a format. The plot is
+  sized to \a width and \a height in pixels and scaled with \a scale. (width 100 and scale 2.0 lead
+  to a full resolution file with width 200.) If the \a format supports compression, \a quality may
+  be between 0 and 100 to control it.
+  
+  Returns true on success. If this function fails, most likely the given \a format isn't supported
+  by the system, see Qt docs about QImageWriter::supportedImageFormats().
+  
+  \see saveBmp, saveJpg, savePng, savePdf
+*/
+bool QCustomPlot::saveRastered(const QString &fileName, int width, int height, double scale, const char *format, int quality)
+{
+  QPixmap buffer = toPixmap(width, height, scale);
+  if (!buffer.isNull())
+    return buffer.save(fileName, format, quality);
+  else
+    return false;
+}
+
+/*!
+  Renders the plot to a pixmap and returns it.
+  
+  The plot is sized to \a width and \a height in pixels and scaled with \a scale. (width 100 and
+  scale 2.0 lead to a full resolution pixmap with width 200.)
+  
+  \see toPainter, saveRastered, saveBmp, savePng, saveJpg, savePdf
+*/
+QPixmap QCustomPlot::toPixmap(int width, int height, double scale)
+{
+  // this method is somewhat similar to toPainter. Change something here, and a change in toPainter might be necessary, too.
+  int newWidth, newHeight;
+  if (width == 0 || height == 0)
+  {
+    newWidth = this->width();
+    newHeight = this->height();
+  } else
+  {
+    newWidth = width;
+    newHeight = height;
+  }
+  int scaledWidth = qRound(scale*newWidth);
+  int scaledHeight = qRound(scale*newHeight);
+
+  QPixmap result(scaledWidth, scaledHeight);
+  result.fill(mBackgroundBrush.style() == Qt::SolidPattern ? mBackgroundBrush.color() : Qt::transparent); // if using non-solid pattern, make transparent now and draw brush pattern later
+  QCPPainter painter;
+  painter.begin(&result);
+  if (painter.isActive())
+  {
+    QRect oldViewport = viewport();
+    setViewport(QRect(0, 0, newWidth, newHeight));
+    painter.setMode(QCPPainter::pmNoCaching);
+    if (!qFuzzyCompare(scale, 1.0))
+    {
+      if (scale > 1.0) // for scale < 1 we always want cosmetic pens where possible, because else lines might disappear for very small scales
+        painter.setMode(QCPPainter::pmNonCosmetic);
+      painter.scale(scale, scale);
+    }
+    if (mBackgroundBrush.style() != Qt::SolidPattern && mBackgroundBrush.style() != Qt::NoBrush) // solid fills were done a few lines above with QPixmap::fill
+      painter.fillRect(mViewport, mBackgroundBrush);
+    draw(&painter);
+    setViewport(oldViewport);
+    painter.end();
+  } else // might happen if pixmap has width or height zero
+  {
+    qDebug() << Q_FUNC_INFO << "Couldn't activate painter on pixmap";
+    return QPixmap();
+  }
+  return result;
+}
+
+/*!
+  Renders the plot using the passed \a painter.
+  
+  The plot is sized to \a width and \a height in pixels. If the \a painter's scale is not 1.0, the resulting plot will
+  appear scaled accordingly.
+  
+  \note If you are restricted to using a QPainter (instead of QCPPainter), create a temporary QPicture and open a QCPPainter
+  on it. Then call \ref toPainter with this QCPPainter. After ending the paint operation on the picture, draw it with
+  the QPainter. This will reproduce the painter actions the QCPPainter took, with a QPainter.
+  
+  \see toPixmap
+*/
+void QCustomPlot::toPainter(QCPPainter *painter, int width, int height)
+{
+  // this method is somewhat similar to toPixmap. Change something here, and a change in toPixmap might be necessary, too.
+  int newWidth, newHeight;
+  if (width == 0 || height == 0)
+  {
+    newWidth = this->width();
+    newHeight = this->height();
+  } else
+  {
+    newWidth = width;
+    newHeight = height;
+  }
+
+  if (painter->isActive())
+  {
+    QRect oldViewport = viewport();
+    setViewport(QRect(0, 0, newWidth, newHeight));
+    painter->setMode(QCPPainter::pmNoCaching);
+    if (mBackgroundBrush.style() != Qt::NoBrush) // unlike in toPixmap, we can't do QPixmap::fill for Qt::SolidPattern brush style, so we also draw solid fills with fillRect here
+      painter->fillRect(mViewport, mBackgroundBrush);
+    draw(painter);
+    setViewport(oldViewport);
+  } else
+    qDebug() << Q_FUNC_INFO << "Passed painter is not active";
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPColorGradient
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPColorGradient
+  \brief Defines a color gradient for use with e.g. \ref QCPColorMap
+  
+  This class describes a color gradient which can be used to encode data with color. For example,
+  QCPColorMap and QCPColorScale have \ref QCPColorMap::setGradient "setGradient" methods which
+  take an instance of this class. Colors are set with \ref setColorStopAt(double position, const QColor &color)
+  with a \a position from 0 to 1. In between these defined color positions, the
+  color will be interpolated linearly either in RGB or HSV space, see \ref setColorInterpolation.
+
+  Alternatively, load one of the preset color gradients shown in the image below, with \ref
+  loadPreset, or by directly specifying the preset in the constructor.
+  
+  \image html QCPColorGradient.png
+  
+  The fact that the \ref QCPColorGradient(GradientPreset preset) constructor allows directly
+  converting a \ref GradientPreset to a QCPColorGradient, you can also directly pass \ref
+  GradientPreset to all the \a setGradient methods, e.g.:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorgradient-setgradient
+  
+  The total number of levels used in the gradient can be set with \ref setLevelCount. Whether the
+  color gradient shall be applied periodically (wrapping around) to data values that lie outside
+  the data range specified on the plottable instance can be controlled with \ref setPeriodic.
+*/
+
+/*!
+  Constructs a new QCPColorGradient initialized with the colors and color interpolation according
+  to \a preset.
+  
+  The color level count is initialized to 350.
+*/
+QCPColorGradient::QCPColorGradient(GradientPreset preset) :
+  mLevelCount(350),
+  mColorInterpolation(ciRGB),
+  mPeriodic(false),
+  mColorBufferInvalidated(true)
+{
+  mColorBuffer.fill(qRgb(0, 0, 0), mLevelCount);
+  loadPreset(preset);
+}
+
+/* undocumented operator */
+bool QCPColorGradient::operator==(const QCPColorGradient &other) const
+{
+  return ((other.mLevelCount == this->mLevelCount) &&
+          (other.mColorInterpolation == this->mColorInterpolation) &&
+          (other.mPeriodic == this->mPeriodic) &&
+          (other.mColorStops == this->mColorStops));
+}
+
+/*!
+  Sets the number of discretization levels of the color gradient to \a n. The default is 350 which
+  is typically enough to create a smooth appearance.
+  
+  \image html QCPColorGradient-levelcount.png
+*/
+void QCPColorGradient::setLevelCount(int n)
+{
+  if (n < 2)
+  {
+    qDebug() << Q_FUNC_INFO << "n must be greater or equal 2 but was" << n;
+    n = 2;
+  }
+  if (n != mLevelCount)
+  {
+    mLevelCount = n;
+    mColorBufferInvalidated = true;
+  }
+}
+
+/*!
+  Sets at which positions from 0 to 1 which color shall occur. The positions are the keys, the
+  colors are the values of the passed QMap \a colorStops. In between these color stops, the color
+  is interpolated according to \ref setColorInterpolation.
+  
+  A more convenient way to create a custom gradient may be to clear all color stops with \ref
+  clearColorStops and then adding them one by one with \ref setColorStopAt.
+  
+  \see clearColorStops
+*/
+void QCPColorGradient::setColorStops(const QMap<double, QColor> &colorStops)
+{
+  mColorStops = colorStops;
+  mColorBufferInvalidated = true;
+}
+
+/*!
+  Sets the \a color the gradient will have at the specified \a position (from 0 to 1). In between
+  these color stops, the color is interpolated according to \ref setColorInterpolation.
+  
+  \see setColorStops, clearColorStops
+*/
+void QCPColorGradient::setColorStopAt(double position, const QColor &color)
+{
+  mColorStops.insert(position, color);
+  mColorBufferInvalidated = true;
+}
+
+/*!
+  Sets whether the colors in between the configured color stops (see \ref setColorStopAt) shall be
+  interpolated linearly in RGB or in HSV color space.
+  
+  For example, a sweep in RGB space from red to green will have a muddy brown intermediate color,
+  whereas in HSV space the intermediate color is yellow.
+*/
+void QCPColorGradient::setColorInterpolation(QCPColorGradient::ColorInterpolation interpolation)
+{
+  if (interpolation != mColorInterpolation)
+  {
+    mColorInterpolation = interpolation;
+    mColorBufferInvalidated = true;
+  }
+}
+
+/*!
+  Sets whether data points that are outside the configured data range (e.g. \ref
+  QCPColorMap::setDataRange) are colored by periodically repeating the color gradient or whether
+  they all have the same color, corresponding to the respective gradient boundary color.
+  
+  \image html QCPColorGradient-periodic.png
+  
+  As shown in the image above, gradients that have the same start and end color are especially
+  suitable for a periodic gradient mapping, since they produce smooth color transitions throughout
+  the color map. A preset that has this property is \ref gpHues.
+  
+  In practice, using periodic color gradients makes sense when the data corresponds to a periodic
+  dimension, such as an angle or a phase. If this is not the case, the color encoding might become
+  ambiguous, because multiple different data values are shown as the same color.
+*/
+void QCPColorGradient::setPeriodic(bool enabled)
+{
+  mPeriodic = enabled;
+}
+
+/*!
+  This method is used to quickly convert a \a data array to colors. The colors will be output in
+  the array \a scanLine. Both \a data and \a scanLine must have the length \a n when passed to this
+  function. The data range that shall be used for mapping the data value to the gradient is passed
+  in \a range. \a logarithmic indicates whether the data values shall be mapped to colors
+  logarithmically.
+  
+  if \a data actually contains 2D-data linearized via <tt>[row*columnCount + column]</tt>, you can
+  set \a dataIndexFactor to <tt>columnCount</tt> to convert a column instead of a row of the data
+  array, in \a scanLine. \a scanLine will remain a regular (1D) array. This works because \a data
+  is addressed <tt>data[i*dataIndexFactor]</tt>.
+*/
+void QCPColorGradient::colorize(const double *data, const QCPRange &range, QRgb *scanLine, int n, int dataIndexFactor, bool logarithmic)
+{
+  // If you change something here, make sure to also adapt ::color()
+  if (!data)
+  {
+    qDebug() << Q_FUNC_INFO << "null pointer given as data";
+    return;
+  }
+  if (!scanLine)
+  {
+    qDebug() << Q_FUNC_INFO << "null pointer given as scanLine";
+    return;
+  }
+  if (mColorBufferInvalidated)
+    updateColorBuffer();
+  
+  if (!logarithmic)
+  {
+    const double posToIndexFactor = (mLevelCount-1)/range.size();
+    if (mPeriodic)
+    {
+      for (int i=0; i<n; ++i)
+      {
+        int index = (int)((data[dataIndexFactor*i]-range.lower)*posToIndexFactor) % mLevelCount;
+        if (index < 0)
+          index += mLevelCount;
+        scanLine[i] = mColorBuffer.at(index);
+      }
+    } else
+    {
+      for (int i=0; i<n; ++i)
+      {
+        int index = (data[dataIndexFactor*i]-range.lower)*posToIndexFactor;
+        if (index < 0)
+          index = 0;
+        else if (index >= mLevelCount)
+          index = mLevelCount-1;
+        scanLine[i] = mColorBuffer.at(index);
+      }
+    }
+  } else // logarithmic == true
+  {
+    if (mPeriodic)
+    {
+      for (int i=0; i<n; ++i)
+      {
+        int index = (int)(qLn(data[dataIndexFactor*i]/range.lower)/qLn(range.upper/range.lower)*(mLevelCount-1)) % mLevelCount;
+        if (index < 0)
+          index += mLevelCount;
+        scanLine[i] = mColorBuffer.at(index);
+      }
+    } else
+    {
+      for (int i=0; i<n; ++i)
+      {
+        int index = qLn(data[dataIndexFactor*i]/range.lower)/qLn(range.upper/range.lower)*(mLevelCount-1);
+        if (index < 0)
+          index = 0;
+        else if (index >= mLevelCount)
+          index = mLevelCount-1;
+        scanLine[i] = mColorBuffer.at(index);
+      }
+    }
+  }
+}
+
+/*! \internal
+  
+  This method is used to colorize a single data value given in \a position, to colors. The data
+  range that shall be used for mapping the data value to the gradient is passed in \a range. \a
+  logarithmic indicates whether the data value shall be mapped to a color logarithmically.
+  
+  If an entire array of data values shall be converted, rather use \ref colorize, for better
+  performance.
+*/
+QRgb QCPColorGradient::color(double position, const QCPRange &range, bool logarithmic)
+{
+  // If you change something here, make sure to also adapt ::colorize()
+  if (mColorBufferInvalidated)
+    updateColorBuffer();
+  int index = 0;
+  if (!logarithmic)
+    index = (position-range.lower)*(mLevelCount-1)/range.size();
+  else
+    index = qLn(position/range.lower)/qLn(range.upper/range.lower)*(mLevelCount-1);
+  if (mPeriodic)
+  {
+    index = index % mLevelCount;
+    if (index < 0)
+      index += mLevelCount;
+  } else
+  {
+    if (index < 0)
+      index = 0;
+    else if (index >= mLevelCount)
+      index = mLevelCount-1;
+  }
+  return mColorBuffer.at(index);
+}
+
+/*!
+  Clears the current color stops and loads the specified \a preset. A preset consists of predefined
+  color stops and the corresponding color interpolation method.
+  
+  The available presets are:
+  \image html QCPColorGradient.png
+*/
+void QCPColorGradient::loadPreset(GradientPreset preset)
+{
+  clearColorStops();
+  switch (preset)
+  {
+    case gpGrayscale:
+      setColorInterpolation(ciRGB);
+      setColorStopAt(0, Qt::black);
+      setColorStopAt(1, Qt::white);
+      break;
+    case gpHot:
+      setColorInterpolation(ciRGB);
+      setColorStopAt(0, QColor(50, 0, 0));
+      setColorStopAt(0.2, QColor(180, 10, 0));
+      setColorStopAt(0.4, QColor(245, 50, 0));
+      setColorStopAt(0.6, QColor(255, 150, 10));
+      setColorStopAt(0.8, QColor(255, 255, 50));
+      setColorStopAt(1, QColor(255, 255, 255));
+      break;
+    case gpCold:
+      setColorInterpolation(ciRGB);
+      setColorStopAt(0, QColor(0, 0, 50));
+      setColorStopAt(0.2, QColor(0, 10, 180));
+      setColorStopAt(0.4, QColor(0, 50, 245));
+      setColorStopAt(0.6, QColor(10, 150, 255));
+      setColorStopAt(0.8, QColor(50, 255, 255));
+      setColorStopAt(1, QColor(255, 255, 255));
+      break;
+    case gpNight:
+      setColorInterpolation(ciHSV);
+      setColorStopAt(0, QColor(10, 20, 30));
+      setColorStopAt(1, QColor(250, 255, 250));
+      break;
+    case gpCandy:
+      setColorInterpolation(ciHSV);
+      setColorStopAt(0, QColor(0, 0, 255));
+      setColorStopAt(1, QColor(255, 250, 250));
+      break;
+    case gpGeography:
+      setColorInterpolation(ciRGB);
+      setColorStopAt(0, QColor(70, 170, 210));
+      setColorStopAt(0.20, QColor(90, 160, 180));
+      setColorStopAt(0.25, QColor(45, 130, 175));
+      setColorStopAt(0.30, QColor(100, 140, 125));
+      setColorStopAt(0.5, QColor(100, 140, 100));
+      setColorStopAt(0.6, QColor(130, 145, 120));
+      setColorStopAt(0.7, QColor(140, 130, 120));
+      setColorStopAt(0.9, QColor(180, 190, 190));
+      setColorStopAt(1, QColor(210, 210, 230));
+      break;
+    case gpIon:
+      setColorInterpolation(ciHSV);
+      setColorStopAt(0, QColor(50, 10, 10));
+      setColorStopAt(0.45, QColor(0, 0, 255));
+      setColorStopAt(0.8, QColor(0, 255, 255));
+      setColorStopAt(1, QColor(0, 255, 0));
+      break;
+    case gpThermal:
+      setColorInterpolation(ciRGB);
+      setColorStopAt(0, QColor(0, 0, 50));
+      setColorStopAt(0.15, QColor(20, 0, 120));
+      setColorStopAt(0.33, QColor(200, 30, 140));
+      setColorStopAt(0.6, QColor(255, 100, 0));
+      setColorStopAt(0.85, QColor(255, 255, 40));
+      setColorStopAt(1, QColor(255, 255, 255));
+      break;
+    case gpPolar:
+      setColorInterpolation(ciRGB);
+      setColorStopAt(0, QColor(50, 255, 255));
+      setColorStopAt(0.18, QColor(10, 70, 255));
+      setColorStopAt(0.28, QColor(10, 10, 190));
+      setColorStopAt(0.5, QColor(0, 0, 0));
+      setColorStopAt(0.72, QColor(190, 10, 10));
+      setColorStopAt(0.82, QColor(255, 70, 10));
+      setColorStopAt(1, QColor(255, 255, 50));
+      break;
+    case gpSpectrum:
+      setColorInterpolation(ciHSV);
+      setColorStopAt(0, QColor(50, 0, 50));
+      setColorStopAt(0.15, QColor(0, 0, 255));
+      setColorStopAt(0.35, QColor(0, 255, 255));
+      setColorStopAt(0.6, QColor(255, 255, 0));
+      setColorStopAt(0.75, QColor(255, 30, 0));
+      setColorStopAt(1, QColor(50, 0, 0));
+      break;
+    case gpJet:
+      setColorInterpolation(ciRGB);
+      setColorStopAt(0, QColor(0, 0, 100));
+      setColorStopAt(0.15, QColor(0, 50, 255));
+      setColorStopAt(0.35, QColor(0, 255, 255));
+      setColorStopAt(0.65, QColor(255, 255, 0));
+      setColorStopAt(0.85, QColor(255, 30, 0));
+      setColorStopAt(1, QColor(100, 0, 0));
+      break;
+    case gpHues:
+      setColorInterpolation(ciHSV);
+      setColorStopAt(0, QColor(255, 0, 0));
+      setColorStopAt(1.0/3.0, QColor(0, 0, 255));
+      setColorStopAt(2.0/3.0, QColor(0, 255, 0));
+      setColorStopAt(1, QColor(255, 0, 0));
+      break;
+  }
+}
+
+/*!
+  Clears all color stops.
+  
+  \see setColorStops, setColorStopAt
+*/
+void QCPColorGradient::clearColorStops()
+{
+  mColorStops.clear();
+  mColorBufferInvalidated = true;
+}
+
+/*!
+  Returns an inverted gradient. The inverted gradient has all properties as this \ref
+  QCPColorGradient, but the order of the color stops is inverted.
+  
+  \see setColorStops, setColorStopAt
+*/
+QCPColorGradient QCPColorGradient::inverted() const
+{
+  QCPColorGradient result(*this);
+  result.clearColorStops();
+  for (QMap<double, QColor>::const_iterator it=mColorStops.constBegin(); it!=mColorStops.constEnd(); ++it)
+    result.setColorStopAt(1.0-it.key(), it.value());
+  return result;
+}
+
+/*! \internal
+  
+  Updates the internal color buffer which will be used by \ref colorize and \ref color, to quickly
+  convert positions to colors. This is where the interpolation between color stops is calculated.
+*/
+void QCPColorGradient::updateColorBuffer()
+{
+  if (mColorBuffer.size() != mLevelCount)
+    mColorBuffer.resize(mLevelCount);
+  if (mColorStops.size() > 1)
+  {
+    double indexToPosFactor = 1.0/(double)(mLevelCount-1);
+    for (int i=0; i<mLevelCount; ++i)
+    {
+      double position = i*indexToPosFactor;
+      QMap<double, QColor>::const_iterator it = mColorStops.lowerBound(position);
+      if (it == mColorStops.constEnd()) // position is on or after last stop, use color of last stop
+      {
+        mColorBuffer[i] = (it-1).value().rgb();
+      } else if (it == mColorStops.constBegin()) // position is on or before first stop, use color of first stop
+      {
+        mColorBuffer[i] = it.value().rgb();
+      } else // position is in between stops (or on an intermediate stop), interpolate color
+      {
+        QMap<double, QColor>::const_iterator high = it;
+        QMap<double, QColor>::const_iterator low = it-1;
+        double t = (position-low.key())/(high.key()-low.key()); // interpolation factor 0..1
+        switch (mColorInterpolation)
+        {
+          case ciRGB:
+          {
+            mColorBuffer[i] = qRgb((1-t)*low.value().red() + t*high.value().red(),
+                                   (1-t)*low.value().green() + t*high.value().green(),
+                                   (1-t)*low.value().blue() + t*high.value().blue());
+            break;
+          }
+          case ciHSV:
+          {
+            QColor lowHsv = low.value().toHsv();
+            QColor highHsv = high.value().toHsv();
+            double hue = 0;
+            double hueDiff = highHsv.hueF()-lowHsv.hueF();
+            if (hueDiff > 0.5)
+              hue = lowHsv.hueF() - t*(1.0-hueDiff);
+            else if (hueDiff < -0.5)
+              hue = lowHsv.hueF() + t*(1.0+hueDiff);
+            else
+              hue = lowHsv.hueF() + t*hueDiff;
+            if (hue < 0) hue += 1.0;
+            else if (hue >= 1.0) hue -= 1.0;
+            mColorBuffer[i] = QColor::fromHsvF(hue, (1-t)*lowHsv.saturationF() + t*highHsv.saturationF(), (1-t)*lowHsv.valueF() + t*highHsv.valueF()).rgb();
+            break;
+          }
+        }
+      }
+    }
+  } else if (mColorStops.size() == 1)
+  {
+    mColorBuffer.fill(mColorStops.constBegin().value().rgb());
+  } else // mColorStops is empty, fill color buffer with black
+  {
+    mColorBuffer.fill(qRgb(0, 0, 0));
+  }
+  mColorBufferInvalidated = false;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPAxisRect
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPAxisRect
+  \brief Holds multiple axes and arranges them in a rectangular shape.
+  
+  This class represents an axis rect, a rectangular area that is bounded on all sides with an
+  arbitrary number of axes.
+  
+  Initially QCustomPlot has one axis rect, accessible via QCustomPlot::axisRect(). However, the
+  layout system allows to have multiple axis rects, e.g. arranged in a grid layout
+  (QCustomPlot::plotLayout).
+  
+  By default, QCPAxisRect comes with four axes, at bottom, top, left and right. They can be
+  accessed via \ref axis by providing the respective axis type (\ref QCPAxis::AxisType) and index.
+  If you need all axes in the axis rect, use \ref axes. The top and right axes are set to be
+  invisible initially (QCPAxis::setVisible). To add more axes to a side, use \ref addAxis or \ref
+  addAxes. To remove an axis, use \ref removeAxis.
+  
+  The axis rect layerable itself only draws a background pixmap or color, if specified (\ref
+  setBackground). It is placed on the "background" layer initially (see \ref QCPLayer for an
+  explanation of the QCustomPlot layer system). The axes that are held by the axis rect can be
+  placed on other layers, independently of the axis rect.
+  
+  Every axis rect has a child layout of type \ref QCPLayoutInset. It is accessible via \ref
+  insetLayout and can be used to have other layout elements (or even other layouts with multiple
+  elements) hovering inside the axis rect.
+  
+  If an axis rect is clicked and dragged, it processes this by moving certain axis ranges. The
+  behaviour can be controlled with \ref setRangeDrag and \ref setRangeDragAxes. If the mouse wheel
+  is scrolled while the cursor is on the axis rect, certain axes are scaled. This is controllable
+  via \ref setRangeZoom, \ref setRangeZoomAxes and \ref setRangeZoomFactor. These interactions are
+  only enabled if \ref QCustomPlot::setInteractions contains \ref QCP::iRangeDrag and \ref
+  QCP::iRangeZoom.
+  
+  \image html AxisRectSpacingOverview.png
+  <center>Overview of the spacings and paddings that define the geometry of an axis. The dashed
+  line on the far left indicates the viewport/widget border.</center>
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QCPLayoutInset *QCPAxisRect::insetLayout() const
+  
+  Returns the inset layout of this axis rect. It can be used to place other layout elements (or
+  even layouts with multiple other elements) inside/on top of an axis rect.
+  
+  \see QCPLayoutInset
+*/
+
+/*! \fn int QCPAxisRect::left() const
+  
+  Returns the pixel position of the left border of this axis rect. Margins are not taken into
+  account here, so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn int QCPAxisRect::right() const
+  
+  Returns the pixel position of the right border of this axis rect. Margins are not taken into
+  account here, so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn int QCPAxisRect::top() const
+  
+  Returns the pixel position of the top border of this axis rect. Margins are not taken into
+  account here, so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn int QCPAxisRect::bottom() const
+  
+  Returns the pixel position of the bottom border of this axis rect. Margins are not taken into
+  account here, so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn int QCPAxisRect::width() const
+  
+  Returns the pixel width of this axis rect. Margins are not taken into account here, so the
+  returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn int QCPAxisRect::height() const
+  
+  Returns the pixel height of this axis rect. Margins are not taken into account here, so the
+  returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn QSize QCPAxisRect::size() const
+  
+  Returns the pixel size of this axis rect. Margins are not taken into account here, so the
+  returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn QPoint QCPAxisRect::topLeft() const
+  
+  Returns the top left corner of this axis rect in pixels. Margins are not taken into account here,
+  so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn QPoint QCPAxisRect::topRight() const
+  
+  Returns the top right corner of this axis rect in pixels. Margins are not taken into account
+  here, so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn QPoint QCPAxisRect::bottomLeft() const
+  
+  Returns the bottom left corner of this axis rect in pixels. Margins are not taken into account
+  here, so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn QPoint QCPAxisRect::bottomRight() const
+  
+  Returns the bottom right corner of this axis rect in pixels. Margins are not taken into account
+  here, so the returned value is with respect to the inner \ref rect.
+*/
+
+/*! \fn QPoint QCPAxisRect::center() const
+  
+  Returns the center of this axis rect in pixels. Margins are not taken into account here, so the
+  returned value is with respect to the inner \ref rect.
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Creates a QCPAxisRect instance and sets default values. An axis is added for each of the four
+  sides, the top and right axes are set invisible initially.
+*/
+QCPAxisRect::QCPAxisRect(QCustomPlot *parentPlot, bool setupDefaultAxes) :
+  QCPLayoutElement(parentPlot),
+  mBackgroundBrush(Qt::NoBrush),
+  mBackgroundScaled(true),
+  mBackgroundScaledMode(Qt::KeepAspectRatioByExpanding),
+  mInsetLayout(new QCPLayoutInset),
+  mRangeDrag(Qt::Horizontal|Qt::Vertical),
+  mRangeZoom(Qt::Horizontal|Qt::Vertical),
+  mRangeZoomFactorHorz(0.85),
+  mRangeZoomFactorVert(0.85),
+  mDragging(false)
+{
+  mInsetLayout->initializeParentPlot(mParentPlot);
+  mInsetLayout->setParentLayerable(this);
+  mInsetLayout->setParent(this);
+  
+  setMinimumSize(50, 50);
+  setMinimumMargins(QMargins(15, 15, 15, 15));
+  mAxes.insert(QCPAxis::atLeft, QList<QCPAxis*>());
+  mAxes.insert(QCPAxis::atRight, QList<QCPAxis*>());
+  mAxes.insert(QCPAxis::atTop, QList<QCPAxis*>());
+  mAxes.insert(QCPAxis::atBottom, QList<QCPAxis*>());
+  
+  if (setupDefaultAxes)
+  {
+    QCPAxis *xAxis = addAxis(QCPAxis::atBottom);
+    QCPAxis *yAxis = addAxis(QCPAxis::atLeft);
+    QCPAxis *xAxis2 = addAxis(QCPAxis::atTop);
+    QCPAxis *yAxis2 = addAxis(QCPAxis::atRight);
+    setRangeDragAxes(xAxis, yAxis);
+    setRangeZoomAxes(xAxis, yAxis);
+    xAxis2->setVisible(false);
+    yAxis2->setVisible(false);
+    xAxis->grid()->setVisible(true);
+    yAxis->grid()->setVisible(true);
+    xAxis2->grid()->setVisible(false);
+    yAxis2->grid()->setVisible(false);
+    xAxis2->grid()->setZeroLinePen(Qt::NoPen);
+    yAxis2->grid()->setZeroLinePen(Qt::NoPen);
+    xAxis2->grid()->setVisible(false);
+    yAxis2->grid()->setVisible(false);
+  }
+}
+
+QCPAxisRect::~QCPAxisRect()
+{
+  delete mInsetLayout;
+  mInsetLayout = 0;
+  
+  QList<QCPAxis*> axesList = axes();
+  for (int i=0; i<axesList.size(); ++i)
+    removeAxis(axesList.at(i));
+}
+
+/*!
+  Returns the number of axes on the axis rect side specified with \a type.
+  
+  \see axis
+*/
+int QCPAxisRect::axisCount(QCPAxis::AxisType type) const
+{
+  return mAxes.value(type).size();
+}
+
+/*!
+  Returns the axis with the given \a index on the axis rect side specified with \a type.
+  
+  \see axisCount, axes
+*/
+QCPAxis *QCPAxisRect::axis(QCPAxis::AxisType type, int index) const
+{
+  QList<QCPAxis*> ax(mAxes.value(type));
+  if (index >= 0 && index < ax.size())
+  {
+    return ax.at(index);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "Axis index out of bounds:" << index;
+    return 0;
+  }
+}
+
+/*!
+  Returns all axes on the axis rect sides specified with \a types.
+  
+  \a types may be a single \ref QCPAxis::AxisType or an <tt>or</tt>-combination, to get the axes of
+  multiple sides.
+  
+  \see axis
+*/
+QList<QCPAxis*> QCPAxisRect::axes(QCPAxis::AxisTypes types) const
+{
+  QList<QCPAxis*> result;
+  if (types.testFlag(QCPAxis::atLeft))
+    result << mAxes.value(QCPAxis::atLeft);
+  if (types.testFlag(QCPAxis::atRight))
+    result << mAxes.value(QCPAxis::atRight);
+  if (types.testFlag(QCPAxis::atTop))
+    result << mAxes.value(QCPAxis::atTop);
+  if (types.testFlag(QCPAxis::atBottom))
+    result << mAxes.value(QCPAxis::atBottom);
+  return result;
+}
+
+/*! \overload
+  
+  Returns all axes of this axis rect.
+*/
+QList<QCPAxis*> QCPAxisRect::axes() const
+{
+  QList<QCPAxis*> result;
+  QHashIterator<QCPAxis::AxisType, QList<QCPAxis*> > it(mAxes);
+  while (it.hasNext())
+  {
+    it.next();
+    result << it.value();
+  }
+  return result;
+}
+
+/*!
+  Adds a new axis to the axis rect side specified with \a type, and returns it. If \a axis is 0, a
+  new QCPAxis instance is created internally.
+
+  You may inject QCPAxis instances (or sublasses of QCPAxis) by setting \a axis to an axis that was
+  previously created outside QCustomPlot. It is important to note that QCustomPlot takes ownership
+  of the axis, so you may not delete it afterwards. Further, the \a axis must have been created
+  with this axis rect as parent and with the same axis type as specified in \a type. If this is not
+  the case, a debug output is generated, the axis is not added, and the method returns 0.
+  
+  This method can not be used to move \a axis between axis rects. The same \a axis instance must
+  not be added multiple times to the same or different axis rects.
+  
+  If an axis rect side already contains one or more axes, the lower and upper endings of the new
+  axis (\ref QCPAxis::setLowerEnding, \ref QCPAxis::setUpperEnding) are set to \ref
+  QCPLineEnding::esHalfBar.
+  
+  \see addAxes, setupFullAxesBox
+*/
+QCPAxis *QCPAxisRect::addAxis(QCPAxis::AxisType type, QCPAxis *axis)
+{
+  QCPAxis *newAxis = axis;
+  if (!newAxis)
+  {
+    newAxis = new QCPAxis(this, type);
+  } else // user provided existing axis instance, do some sanity checks
+  {
+    if (newAxis->axisType() != type)
+    {
+      qDebug() << Q_FUNC_INFO << "passed axis has different axis type than specified in type parameter";
+      return 0;
+    }
+    if (newAxis->axisRect() != this)
+    {
+      qDebug() << Q_FUNC_INFO << "passed axis doesn't have this axis rect as parent axis rect";
+      return 0;
+    }
+    if (axes().contains(newAxis))
+    {
+      qDebug() << Q_FUNC_INFO << "passed axis is already owned by this axis rect";
+      return 0;
+    }
+  }
+  if (mAxes[type].size() > 0) // multiple axes on one side, add half-bar axis ending to additional axes with offset
+  {
+    bool invert = (type == QCPAxis::atRight) || (type == QCPAxis::atBottom);
+    newAxis->setLowerEnding(QCPLineEnding(QCPLineEnding::esHalfBar, 6, 10, !invert));
+    newAxis->setUpperEnding(QCPLineEnding(QCPLineEnding::esHalfBar, 6, 10, invert));
+  }
+  mAxes[type].append(newAxis);
+  return newAxis;
+}
+
+/*!
+  Adds a new axis with \ref addAxis to each axis rect side specified in \a types. This may be an
+  <tt>or</tt>-combination of QCPAxis::AxisType, so axes can be added to multiple sides at once.
+  
+  Returns a list of the added axes.
+  
+  \see addAxis, setupFullAxesBox
+*/
+QList<QCPAxis*> QCPAxisRect::addAxes(QCPAxis::AxisTypes types)
+{
+  QList<QCPAxis*> result;
+  if (types.testFlag(QCPAxis::atLeft))
+    result << addAxis(QCPAxis::atLeft);
+  if (types.testFlag(QCPAxis::atRight))
+    result << addAxis(QCPAxis::atRight);
+  if (types.testFlag(QCPAxis::atTop))
+    result << addAxis(QCPAxis::atTop);
+  if (types.testFlag(QCPAxis::atBottom))
+    result << addAxis(QCPAxis::atBottom);
+  return result;
+}
+
+/*!
+  Removes the specified \a axis from the axis rect and deletes it.
+  
+  Returns true on success, i.e. if \a axis was a valid axis in this axis rect.
+  
+  \see addAxis
+*/
+bool QCPAxisRect::removeAxis(QCPAxis *axis)
+{
+  // don't access axis->axisType() to provide safety when axis is an invalid pointer, rather go through all axis containers:
+  QHashIterator<QCPAxis::AxisType, QList<QCPAxis*> > it(mAxes);
+  while (it.hasNext())
+  {
+    it.next();
+    if (it.value().contains(axis))
+    {
+      mAxes[it.key()].removeOne(axis);
+      if (qobject_cast<QCustomPlot*>(parentPlot())) // make sure this isn't called from QObject dtor when QCustomPlot is already destructed (happens when the axis rect is not in any layout and thus QObject-child of QCustomPlot)
+        parentPlot()->axisRemoved(axis);
+      delete axis;
+      return true;
+    }
+  }
+  qDebug() << Q_FUNC_INFO << "Axis isn't in axis rect:" << reinterpret_cast<quintptr>(axis);
+  return false;
+}
+
+/*!
+  Convenience function to create an axis on each side that doesn't have any axes yet and set their
+  visibility to true. Further, the top/right axes are assigned the following properties of the
+  bottom/left axes:
+  
+  \li range (\ref QCPAxis::setRange)
+  \li range reversed (\ref QCPAxis::setRangeReversed)
+  \li scale type (\ref QCPAxis::setScaleType)
+  \li scale log base  (\ref QCPAxis::setScaleLogBase)
+  \li ticks (\ref QCPAxis::setTicks)
+  \li auto (major) tick count (\ref QCPAxis::setAutoTickCount)
+  \li sub tick count (\ref QCPAxis::setSubTickCount)
+  \li auto sub ticks (\ref QCPAxis::setAutoSubTicks)
+  \li tick step (\ref QCPAxis::setTickStep)
+  \li auto tick step (\ref QCPAxis::setAutoTickStep)
+  \li number format (\ref QCPAxis::setNumberFormat)
+  \li number precision (\ref QCPAxis::setNumberPrecision)
+  \li tick label type (\ref QCPAxis::setTickLabelType)
+  \li date time format (\ref QCPAxis::setDateTimeFormat)
+  \li date time spec (\ref QCPAxis::setDateTimeSpec)
+  
+  Tick labels (\ref QCPAxis::setTickLabels) of the right and top axes are set to false.
+
+  If \a connectRanges is true, the \ref QCPAxis::rangeChanged "rangeChanged" signals of the bottom
+  and left axes are connected to the \ref QCPAxis::setRange slots of the top and right axes.
+*/
+void QCPAxisRect::setupFullAxesBox(bool connectRanges)
+{
+  QCPAxis *xAxis, *yAxis, *xAxis2, *yAxis2;
+  if (axisCount(QCPAxis::atBottom) == 0)
+    xAxis = addAxis(QCPAxis::atBottom);
+  else
+    xAxis = axis(QCPAxis::atBottom);
+  
+  if (axisCount(QCPAxis::atLeft) == 0)
+    yAxis = addAxis(QCPAxis::atLeft);
+  else
+    yAxis = axis(QCPAxis::atLeft);
+  
+  if (axisCount(QCPAxis::atTop) == 0)
+    xAxis2 = addAxis(QCPAxis::atTop);
+  else
+    xAxis2 = axis(QCPAxis::atTop);
+  
+  if (axisCount(QCPAxis::atRight) == 0)
+    yAxis2 = addAxis(QCPAxis::atRight);
+  else
+    yAxis2 = axis(QCPAxis::atRight);
+  
+  xAxis->setVisible(true);
+  yAxis->setVisible(true);
+  xAxis2->setVisible(true);
+  yAxis2->setVisible(true);
+  xAxis2->setTickLabels(false);
+  yAxis2->setTickLabels(false);
+  
+  xAxis2->setRange(xAxis->range());
+  xAxis2->setRangeReversed(xAxis->rangeReversed());
+  xAxis2->setScaleType(xAxis->scaleType());
+  xAxis2->setScaleLogBase(xAxis->scaleLogBase());
+  xAxis2->setTicks(xAxis->ticks());
+  xAxis2->setAutoTickCount(xAxis->autoTickCount());
+  xAxis2->setSubTickCount(xAxis->subTickCount());
+  xAxis2->setAutoSubTicks(xAxis->autoSubTicks());
+  xAxis2->setTickStep(xAxis->tickStep());
+  xAxis2->setAutoTickStep(xAxis->autoTickStep());
+  xAxis2->setNumberFormat(xAxis->numberFormat());
+  xAxis2->setNumberPrecision(xAxis->numberPrecision());
+  xAxis2->setTickLabelType(xAxis->tickLabelType());
+  xAxis2->setDateTimeFormat(xAxis->dateTimeFormat());
+  xAxis2->setDateTimeSpec(xAxis->dateTimeSpec());
+
+  yAxis2->setRange(yAxis->range());
+  yAxis2->setRangeReversed(yAxis->rangeReversed());
+  yAxis2->setScaleType(yAxis->scaleType());
+  yAxis2->setScaleLogBase(yAxis->scaleLogBase());
+  yAxis2->setTicks(yAxis->ticks());
+  yAxis2->setAutoTickCount(yAxis->autoTickCount());
+  yAxis2->setSubTickCount(yAxis->subTickCount());
+  yAxis2->setAutoSubTicks(yAxis->autoSubTicks());
+  yAxis2->setTickStep(yAxis->tickStep());
+  yAxis2->setAutoTickStep(yAxis->autoTickStep());
+  yAxis2->setNumberFormat(yAxis->numberFormat());
+  yAxis2->setNumberPrecision(yAxis->numberPrecision());
+  yAxis2->setTickLabelType(yAxis->tickLabelType());
+  yAxis2->setDateTimeFormat(yAxis->dateTimeFormat());
+  yAxis2->setDateTimeSpec(yAxis->dateTimeSpec());
+  
+  if (connectRanges)
+  {
+    connect(xAxis, SIGNAL(rangeChanged(QCPRange)), xAxis2, SLOT(setRange(QCPRange)));
+    connect(yAxis, SIGNAL(rangeChanged(QCPRange)), yAxis2, SLOT(setRange(QCPRange)));
+  }
+}
+
+/*!
+  Returns a list of all the plottables that are associated with this axis rect.
+  
+  A plottable is considered associated with an axis rect if its key or value axis (or both) is in
+  this axis rect.
+  
+  \see graphs, items
+*/
+QList<QCPAbstractPlottable*> QCPAxisRect::plottables() const
+{
+  // Note: don't append all QCPAxis::plottables() into a list, because we might get duplicate entries
+  QList<QCPAbstractPlottable*> result;
+  for (int i=0; i<mParentPlot->mPlottables.size(); ++i)
+  {
+    if (mParentPlot->mPlottables.at(i)->keyAxis()->axisRect() == this ||mParentPlot->mPlottables.at(i)->valueAxis()->axisRect() == this)
+      result.append(mParentPlot->mPlottables.at(i));
+  }
+  return result;
+}
+
+/*!
+  Returns a list of all the graphs that are associated with this axis rect.
+  
+  A graph is considered associated with an axis rect if its key or value axis (or both) is in
+  this axis rect.
+  
+  \see plottables, items
+*/
+QList<QCPGraph*> QCPAxisRect::graphs() const
+{
+  // Note: don't append all QCPAxis::graphs() into a list, because we might get duplicate entries
+  QList<QCPGraph*> result;
+  for (int i=0; i<mParentPlot->mGraphs.size(); ++i)
+  {
+    if (mParentPlot->mGraphs.at(i)->keyAxis()->axisRect() == this || mParentPlot->mGraphs.at(i)->valueAxis()->axisRect() == this)
+      result.append(mParentPlot->mGraphs.at(i));
+  }
+  return result;
+}
+
+/*!
+  Returns a list of all the items that are associated with this axis rect.
+  
+  An item is considered associated with an axis rect if any of its positions has key or value axis
+  set to an axis that is in this axis rect, or if any of its positions has \ref
+  QCPItemPosition::setAxisRect set to the axis rect, or if the clip axis rect (\ref
+  QCPAbstractItem::setClipAxisRect) is set to this axis rect.
+  
+  \see plottables, graphs
+*/
+QList<QCPAbstractItem *> QCPAxisRect::items() const
+{
+  // Note: don't just append all QCPAxis::items() into a list, because we might get duplicate entries
+  //       and miss those items that have this axis rect as clipAxisRect.
+  QList<QCPAbstractItem*> result;
+  for (int itemId=0; itemId<mParentPlot->mItems.size(); ++itemId)
+  {
+    if (mParentPlot->mItems.at(itemId)->clipAxisRect() == this)
+    {
+      result.append(mParentPlot->mItems.at(itemId));
+      continue;
+    }
+    QList<QCPItemPosition*> positions = mParentPlot->mItems.at(itemId)->positions();
+    for (int posId=0; posId<positions.size(); ++posId)
+    {
+      if (positions.at(posId)->axisRect() == this ||
+          positions.at(posId)->keyAxis()->axisRect() == this ||
+          positions.at(posId)->valueAxis()->axisRect() == this)
+      {
+        result.append(mParentPlot->mItems.at(itemId));
+        break;
+      }
+    }
+  }
+  return result;
+}
+
+/*!
+  This method is called automatically upon replot and doesn't need to be called by users of
+  QCPAxisRect.
+  
+  Calls the base class implementation to update the margins (see \ref QCPLayoutElement::update),
+  and finally passes the \ref rect to the inset layout (\ref insetLayout) and calls its
+  QCPInsetLayout::update function.
+*/
+void QCPAxisRect::update(UpdatePhase phase)
+{
+  QCPLayoutElement::update(phase);
+  
+  switch (phase)
+  {
+    case upPreparation:
+    {
+      QList<QCPAxis*> allAxes = axes();
+      for (int i=0; i<allAxes.size(); ++i)
+        allAxes.at(i)->setupTickVectors();
+      break;
+    }
+    case upLayout:
+    {
+      mInsetLayout->setOuterRect(rect());
+      break;
+    }
+    default: break;
+  }
+  
+  // pass update call on to inset layout (doesn't happen automatically, because QCPAxisRect doesn't derive from QCPLayout):
+  mInsetLayout->update(phase);
+}
+
+/* inherits documentation from base class */
+QList<QCPLayoutElement*> QCPAxisRect::elements(bool recursive) const
+{
+  QList<QCPLayoutElement*> result;
+  if (mInsetLayout)
+  {
+    result << mInsetLayout;
+    if (recursive)
+      result << mInsetLayout->elements(recursive);
+  }
+  return result;
+}
+
+/* inherits documentation from base class */
+void QCPAxisRect::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  painter->setAntialiasing(false);
+}
+
+/* inherits documentation from base class */
+void QCPAxisRect::draw(QCPPainter *painter)
+{
+  drawBackground(painter);
+}
+
+/*!
+  Sets \a pm as the axis background pixmap. The axis background pixmap will be drawn inside the
+  axis rect. Since axis rects place themselves on the "background" layer by default, the axis rect
+  backgrounds are usually drawn below everything else.
+
+  For cases where the provided pixmap doesn't have the same size as the axis rect, scaling can be
+  enabled with \ref setBackgroundScaled and the scaling mode (i.e. whether and how the aspect ratio
+  is preserved) can be set with \ref setBackgroundScaledMode. To set all these options in one call,
+  consider using the overloaded version of this function.
+
+  Below the pixmap, the axis rect may be optionally filled with a brush, if specified with \ref
+  setBackground(const QBrush &brush).
+  
+  \see setBackgroundScaled, setBackgroundScaledMode, setBackground(const QBrush &brush)
+*/
+void QCPAxisRect::setBackground(const QPixmap &pm)
+{
+  mBackgroundPixmap = pm;
+  mScaledBackgroundPixmap = QPixmap();
+}
+
+/*! \overload
+  
+  Sets \a brush as the background brush. The axis rect background will be filled with this brush.
+  Since axis rects place themselves on the "background" layer by default, the axis rect backgrounds
+  are usually drawn below everything else.
+
+  The brush will be drawn before (under) any background pixmap, which may be specified with \ref
+  setBackground(const QPixmap &pm).
+
+  To disable drawing of a background brush, set \a brush to Qt::NoBrush.
+  
+  \see setBackground(const QPixmap &pm)
+*/
+void QCPAxisRect::setBackground(const QBrush &brush)
+{
+  mBackgroundBrush = brush;
+}
+
+/*! \overload
+  
+  Allows setting the background pixmap of the axis rect, whether it shall be scaled and how it
+  shall be scaled in one call.
+
+  \see setBackground(const QPixmap &pm), setBackgroundScaled, setBackgroundScaledMode
+*/
+void QCPAxisRect::setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode)
+{
+  mBackgroundPixmap = pm;
+  mScaledBackgroundPixmap = QPixmap();
+  mBackgroundScaled = scaled;
+  mBackgroundScaledMode = mode;
+}
+
+/*!
+  Sets whether the axis background pixmap shall be scaled to fit the axis rect or not. If \a scaled
+  is set to true, you may control whether and how the aspect ratio of the original pixmap is
+  preserved with \ref setBackgroundScaledMode.
+  
+  Note that the scaled version of the original pixmap is buffered, so there is no performance
+  penalty on replots. (Except when the axis rect dimensions are changed continuously.)
+  
+  \see setBackground, setBackgroundScaledMode
+*/
+void QCPAxisRect::setBackgroundScaled(bool scaled)
+{
+  mBackgroundScaled = scaled;
+}
+
+/*!
+  If scaling of the axis background pixmap is enabled (\ref setBackgroundScaled), use this function to
+  define whether and how the aspect ratio of the original pixmap passed to \ref setBackground is preserved.
+  \see setBackground, setBackgroundScaled
+*/
+void QCPAxisRect::setBackgroundScaledMode(Qt::AspectRatioMode mode)
+{
+  mBackgroundScaledMode = mode;
+}
+
+/*!
+  Returns the range drag axis of the \a orientation provided.
+  
+  \see setRangeDragAxes
+*/
+QCPAxis *QCPAxisRect::rangeDragAxis(Qt::Orientation orientation)
+{
+  return (orientation == Qt::Horizontal ? mRangeDragHorzAxis.data() : mRangeDragVertAxis.data());
+}
+
+/*!
+  Returns the range zoom axis of the \a orientation provided.
+  
+  \see setRangeZoomAxes
+*/
+QCPAxis *QCPAxisRect::rangeZoomAxis(Qt::Orientation orientation)
+{
+  return (orientation == Qt::Horizontal ? mRangeZoomHorzAxis.data() : mRangeZoomVertAxis.data());
+}
+
+/*!
+  Returns the range zoom factor of the \a orientation provided.
+  
+  \see setRangeZoomFactor
+*/
+double QCPAxisRect::rangeZoomFactor(Qt::Orientation orientation)
+{
+  return (orientation == Qt::Horizontal ? mRangeZoomFactorHorz : mRangeZoomFactorVert);
+}
+
+/*!
+  Sets which axis orientation may be range dragged by the user with mouse interaction.
+  What orientation corresponds to which specific axis can be set with
+  \ref setRangeDragAxes(QCPAxis *horizontal, QCPAxis *vertical). By
+  default, the horizontal axis is the bottom axis (xAxis) and the vertical axis
+  is the left axis (yAxis).
+  
+  To disable range dragging entirely, pass 0 as \a orientations or remove \ref QCP::iRangeDrag from \ref
+  QCustomPlot::setInteractions. To enable range dragging for both directions, pass <tt>Qt::Horizontal |
+  Qt::Vertical</tt> as \a orientations.
+  
+  In addition to setting \a orientations to a non-zero value, make sure \ref QCustomPlot::setInteractions
+  contains \ref QCP::iRangeDrag to enable the range dragging interaction.
+  
+  \see setRangeZoom, setRangeDragAxes, QCustomPlot::setNoAntialiasingOnDrag
+*/
+void QCPAxisRect::setRangeDrag(Qt::Orientations orientations)
+{
+  mRangeDrag = orientations;
+}
+
+/*!
+  Sets which axis orientation may be zoomed by the user with the mouse wheel. What orientation
+  corresponds to which specific axis can be set with \ref setRangeZoomAxes(QCPAxis *horizontal,
+  QCPAxis *vertical). By default, the horizontal axis is the bottom axis (xAxis) and the vertical
+  axis is the left axis (yAxis).
+
+  To disable range zooming entirely, pass 0 as \a orientations or remove \ref QCP::iRangeZoom from \ref
+  QCustomPlot::setInteractions. To enable range zooming for both directions, pass <tt>Qt::Horizontal |
+  Qt::Vertical</tt> as \a orientations.
+  
+  In addition to setting \a orientations to a non-zero value, make sure \ref QCustomPlot::setInteractions
+  contains \ref QCP::iRangeZoom to enable the range zooming interaction.
+  
+  \see setRangeZoomFactor, setRangeZoomAxes, setRangeDrag
+*/
+void QCPAxisRect::setRangeZoom(Qt::Orientations orientations)
+{
+  mRangeZoom = orientations;
+}
+
+/*!
+  Sets the axes whose range will be dragged when \ref setRangeDrag enables mouse range dragging
+  on the QCustomPlot widget.
+  
+  \see setRangeZoomAxes
+*/
+void QCPAxisRect::setRangeDragAxes(QCPAxis *horizontal, QCPAxis *vertical)
+{
+  mRangeDragHorzAxis = horizontal;
+  mRangeDragVertAxis = vertical;
+}
+
+/*!
+  Sets the axes whose range will be zoomed when \ref setRangeZoom enables mouse wheel zooming on the
+  QCustomPlot widget. The two axes can be zoomed with different strengths, when different factors
+  are passed to \ref setRangeZoomFactor(double horizontalFactor, double verticalFactor).
+  
+  \see setRangeDragAxes
+*/
+void QCPAxisRect::setRangeZoomAxes(QCPAxis *horizontal, QCPAxis *vertical)
+{
+  mRangeZoomHorzAxis = horizontal;
+  mRangeZoomVertAxis = vertical;
+}
+
+/*!
+  Sets how strong one rotation step of the mouse wheel zooms, when range zoom was activated with
+  \ref setRangeZoom. The two parameters \a horizontalFactor and \a verticalFactor provide a way to
+  let the horizontal axis zoom at different rates than the vertical axis. Which axis is horizontal
+  and which is vertical, can be set with \ref setRangeZoomAxes.
+
+  When the zoom factor is greater than one, scrolling the mouse wheel backwards (towards the user)
+  will zoom in (make the currently visible range smaller). For zoom factors smaller than one, the
+  same scrolling direction will zoom out.
+*/
+void QCPAxisRect::setRangeZoomFactor(double horizontalFactor, double verticalFactor)
+{
+  mRangeZoomFactorHorz = horizontalFactor;
+  mRangeZoomFactorVert = verticalFactor;
+}
+
+/*! \overload
+  
+  Sets both the horizontal and vertical zoom \a factor.
+*/
+void QCPAxisRect::setRangeZoomFactor(double factor)
+{
+  mRangeZoomFactorHorz = factor;
+  mRangeZoomFactorVert = factor;
+}
+
+/*! \internal
+  
+  Draws the background of this axis rect. It may consist of a background fill (a QBrush) and a
+  pixmap.
+  
+  If a brush was given via \ref setBackground(const QBrush &brush), this function first draws an
+  according filling inside the axis rect with the provided \a painter.
+  
+  Then, if a pixmap was provided via \ref setBackground, this function buffers the scaled version
+  depending on \ref setBackgroundScaled and \ref setBackgroundScaledMode and then draws it inside
+  the axis rect with the provided \a painter. The scaled version is buffered in
+  mScaledBackgroundPixmap to prevent expensive rescaling at every redraw. It is only updated, when
+  the axis rect has changed in a way that requires a rescale of the background pixmap (this is
+  dependant on the \ref setBackgroundScaledMode), or when a differend axis backgroud pixmap was
+  set.
+  
+  \see setBackground, setBackgroundScaled, setBackgroundScaledMode
+*/
+void QCPAxisRect::drawBackground(QCPPainter *painter)
+{
+  // draw background fill:
+  if (mBackgroundBrush != Qt::NoBrush)
+    painter->fillRect(mRect, mBackgroundBrush);
+  
+  // draw background pixmap (on top of fill, if brush specified):
+  if (!mBackgroundPixmap.isNull())
+  {
+    if (mBackgroundScaled)
+    {
+      // check whether mScaledBackground needs to be updated:
+      QSize scaledSize(mBackgroundPixmap.size());
+      scaledSize.scale(mRect.size(), mBackgroundScaledMode);
+      if (mScaledBackgroundPixmap.size() != scaledSize)
+        mScaledBackgroundPixmap = mBackgroundPixmap.scaled(mRect.size(), mBackgroundScaledMode, Qt::SmoothTransformation);
+      painter->drawPixmap(mRect.topLeft()+QPoint(0, -1), mScaledBackgroundPixmap, QRect(0, 0, mRect.width(), mRect.height()) & mScaledBackgroundPixmap.rect());
+    } else
+    {
+      painter->drawPixmap(mRect.topLeft()+QPoint(0, -1), mBackgroundPixmap, QRect(0, 0, mRect.width(), mRect.height()));
+    }
+  }
+}
+
+/*! \internal
+  
+  This function makes sure multiple axes on the side specified with \a type don't collide, but are
+  distributed according to their respective space requirement (QCPAxis::calculateMargin).
+  
+  It does this by setting an appropriate offset (\ref QCPAxis::setOffset) on all axes except the
+  one with index zero.
+  
+  This function is called by \ref calculateAutoMargin.
+*/
+void QCPAxisRect::updateAxesOffset(QCPAxis::AxisType type)
+{
+  const QList<QCPAxis*> axesList = mAxes.value(type);
+  if (axesList.isEmpty())
+    return;
+  
+  bool isFirstVisible = !axesList.first()->visible(); // if the first axis is visible, the second axis (which is where the loop starts) isn't the first visible axis, so initialize with false
+  for (int i=1; i<axesList.size(); ++i)
+  {
+    int offset = axesList.at(i-1)->offset() + axesList.at(i-1)->calculateMargin();
+    if (axesList.at(i)->visible()) // only add inner tick length to offset if this axis is visible and it's not the first visible one (might happen if true first axis is invisible)
+    {
+      if (!isFirstVisible)
+        offset += axesList.at(i)->tickLengthIn();
+      isFirstVisible = false;
+    }
+    axesList.at(i)->setOffset(offset);
+  }
+}
+
+/* inherits documentation from base class */
+int QCPAxisRect::calculateAutoMargin(QCP::MarginSide side)
+{
+  if (!mAutoMargins.testFlag(side))
+    qDebug() << Q_FUNC_INFO << "Called with side that isn't specified as auto margin";
+  
+  updateAxesOffset(QCPAxis::marginSideToAxisType(side));
+  
+  // note: only need to look at the last (outer most) axis to determine the total margin, due to updateAxisOffset call
+  const QList<QCPAxis*> axesList = mAxes.value(QCPAxis::marginSideToAxisType(side));
+  if (axesList.size() > 0)
+    return axesList.last()->offset() + axesList.last()->calculateMargin();
+  else
+    return 0;
+}
+
+/*! \internal
+  
+  Event handler for when a mouse button is pressed on the axis rect. If the left mouse button is
+  pressed, the range dragging interaction is initialized (the actual range manipulation happens in
+  the \ref mouseMoveEvent).
+
+  The mDragging flag is set to true and some anchor points are set that are needed to determine the
+  distance the mouse was dragged in the mouse move/release events later.
+  
+  \see mouseMoveEvent, mouseReleaseEvent
+*/
+void QCPAxisRect::mousePressEvent(QMouseEvent *event)
+{
+  mDragStart = event->pos(); // need this even when not LeftButton is pressed, to determine in releaseEvent whether it was a full click (no position change between press and release)
+  if (event->buttons() & Qt::LeftButton)
+  {
+    mDragging = true;
+    // initialize antialiasing backup in case we start dragging:
+    if (mParentPlot->noAntialiasingOnDrag())
+    {
+      mAADragBackup = mParentPlot->antialiasedElements();
+      mNotAADragBackup = mParentPlot->notAntialiasedElements();
+    }
+    // Mouse range dragging interaction:
+    if (mParentPlot->interactions().testFlag(QCP::iRangeDrag))
+    {
+      if (mRangeDragHorzAxis)
+        mDragStartHorzRange = mRangeDragHorzAxis.data()->range();
+      if (mRangeDragVertAxis)
+        mDragStartVertRange = mRangeDragVertAxis.data()->range();
+    }
+  }
+}
+
+/*! \internal
+  
+  Event handler for when the mouse is moved on the axis rect. If range dragging was activated in a
+  preceding \ref mousePressEvent, the range is moved accordingly.
+  
+  \see mousePressEvent, mouseReleaseEvent
+*/
+void QCPAxisRect::mouseMoveEvent(QMouseEvent *event)
+{
+  // Mouse range dragging interaction:
+  if (mDragging && mParentPlot->interactions().testFlag(QCP::iRangeDrag))
+  {
+    if (mRangeDrag.testFlag(Qt::Horizontal))
+    {
+      if (QCPAxis *rangeDragHorzAxis = mRangeDragHorzAxis.data())
+      {
+        if (rangeDragHorzAxis->mScaleType == QCPAxis::stLinear)
+        {
+          double diff = rangeDragHorzAxis->pixelToCoord(mDragStart.x()) - rangeDragHorzAxis->pixelToCoord(event->pos().x());
+          rangeDragHorzAxis->setRange(mDragStartHorzRange.lower+diff, mDragStartHorzRange.upper+diff);
+        } else if (rangeDragHorzAxis->mScaleType == QCPAxis::stLogarithmic)
+        {
+          double diff = rangeDragHorzAxis->pixelToCoord(mDragStart.x()) / rangeDragHorzAxis->pixelToCoord(event->pos().x());
+          rangeDragHorzAxis->setRange(mDragStartHorzRange.lower*diff, mDragStartHorzRange.upper*diff);
+        }
+      }
+    }
+    if (mRangeDrag.testFlag(Qt::Vertical))
+    {
+      if (QCPAxis *rangeDragVertAxis = mRangeDragVertAxis.data())
+      {
+        if (rangeDragVertAxis->mScaleType == QCPAxis::stLinear)
+        {
+          double diff = rangeDragVertAxis->pixelToCoord(mDragStart.y()) - rangeDragVertAxis->pixelToCoord(event->pos().y());
+          rangeDragVertAxis->setRange(mDragStartVertRange.lower+diff, mDragStartVertRange.upper+diff);
+        } else if (rangeDragVertAxis->mScaleType == QCPAxis::stLogarithmic)
+        {
+          double diff = rangeDragVertAxis->pixelToCoord(mDragStart.y()) / rangeDragVertAxis->pixelToCoord(event->pos().y());
+          rangeDragVertAxis->setRange(mDragStartVertRange.lower*diff, mDragStartVertRange.upper*diff);
+        }
+      }
+    }
+    if (mRangeDrag != 0) // if either vertical or horizontal drag was enabled, do a replot
+    {
+      if (mParentPlot->noAntialiasingOnDrag())
+        mParentPlot->setNotAntialiasedElements(QCP::aeAll);
+      mParentPlot->replot();
+    }
+  }
+}
+
+/* inherits documentation from base class */
+void QCPAxisRect::mouseReleaseEvent(QMouseEvent *event)
+{
+  Q_UNUSED(event)
+  mDragging = false;
+  if (mParentPlot->noAntialiasingOnDrag())
+  {
+    mParentPlot->setAntialiasedElements(mAADragBackup);
+    mParentPlot->setNotAntialiasedElements(mNotAADragBackup);
+  }
+}
+
+/*! \internal
+  
+  Event handler for mouse wheel events. If rangeZoom is Qt::Horizontal, Qt::Vertical or both, the
+  ranges of the axes defined as rangeZoomHorzAxis and rangeZoomVertAxis are scaled. The center of
+  the scaling operation is the current cursor position inside the axis rect. The scaling factor is
+  dependant on the mouse wheel delta (which direction the wheel was rotated) to provide a natural
+  zooming feel. The Strength of the zoom can be controlled via \ref setRangeZoomFactor.
+  
+  Note, that event->delta() is usually +/-120 for single rotation steps. However, if the mouse
+  wheel is turned rapidly, many steps may bunch up to one event, so the event->delta() may then be
+  multiples of 120. This is taken into account here, by calculating \a wheelSteps and using it as
+  exponent of the range zoom factor. This takes care of the wheel direction automatically, by
+  inverting the factor, when the wheel step is negative (f^-1 = 1/f).
+*/
+void QCPAxisRect::wheelEvent(QWheelEvent *event)
+{
+  // Mouse range zooming interaction:
+  if (mParentPlot->interactions().testFlag(QCP::iRangeZoom))
+  {
+    if (mRangeZoom != 0)
+    {
+      double factor;
+      double wheelSteps = event->delta()/120.0; // a single step delta is +/-120 usually
+      if (mRangeZoom.testFlag(Qt::Horizontal))
+      {
+        factor = qPow(mRangeZoomFactorHorz, wheelSteps);
+        if (mRangeZoomHorzAxis.data())
+          mRangeZoomHorzAxis.data()->scaleRange(factor, mRangeZoomHorzAxis.data()->pixelToCoord(event->pos().x()));
+      }
+      if (mRangeZoom.testFlag(Qt::Vertical))
+      {
+        factor = qPow(mRangeZoomFactorVert, wheelSteps);
+        if (mRangeZoomVertAxis.data())
+          mRangeZoomVertAxis.data()->scaleRange(factor, mRangeZoomVertAxis.data()->pixelToCoord(event->pos().y()));
+      }
+      mParentPlot->replot();
+    }
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPAbstractLegendItem
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPAbstractLegendItem
+  \brief The abstract base class for all entries in a QCPLegend.
+  
+  It defines a very basic interface for entries in a QCPLegend. For representing plottables in the
+  legend, the subclass \ref QCPPlottableLegendItem is more suitable.
+  
+  Only derive directly from this class when you need absolute freedom (e.g. a custom legend entry
+  that's not even associated with a plottable).
+
+  You must implement the following pure virtual functions:
+  \li \ref draw (from QCPLayerable)
+  
+  You inherit the following members you may use:
+  <table>
+    <tr>
+      <td>QCPLegend *\b mParentLegend</td>
+      <td>A pointer to the parent QCPLegend.</td>
+    </tr><tr>
+      <td>QFont \b mFont</td>
+      <td>The generic font of the item. You should use this font for all or at least the most prominent text of the item.</td>
+    </tr>
+  </table>
+*/
+
+/* start of documentation of signals */
+
+/*! \fn void QCPAbstractLegendItem::selectionChanged(bool selected)
+  
+  This signal is emitted when the selection state of this legend item has changed, either by user
+  interaction or by a direct call to \ref setSelected.
+*/
+
+/* end of documentation of signals */
+
+/*!
+  Constructs a QCPAbstractLegendItem and associates it with the QCPLegend \a parent. This does not
+  cause the item to be added to \a parent, so \ref QCPLegend::addItem must be called separately.
+*/
+QCPAbstractLegendItem::QCPAbstractLegendItem(QCPLegend *parent) :
+  QCPLayoutElement(parent->parentPlot()),
+  mParentLegend(parent),
+  mFont(parent->font()),
+  mTextColor(parent->textColor()),
+  mSelectedFont(parent->selectedFont()),
+  mSelectedTextColor(parent->selectedTextColor()),
+  mSelectable(true),
+  mSelected(false)
+{
+  setLayer(QLatin1String("legend"));
+  setMargins(QMargins(8, 2, 8, 2));
+}
+
+/*!
+  Sets the default font of this specific legend item to \a font.
+  
+  \see setTextColor, QCPLegend::setFont
+*/
+void QCPAbstractLegendItem::setFont(const QFont &font)
+{
+  mFont = font;
+}
+
+/*!
+  Sets the default text color of this specific legend item to \a color.
+  
+  \see setFont, QCPLegend::setTextColor
+*/
+void QCPAbstractLegendItem::setTextColor(const QColor &color)
+{
+  mTextColor = color;
+}
+
+/*!
+  When this legend item is selected, \a font is used to draw generic text, instead of the normal
+  font set with \ref setFont.
+  
+  \see setFont, QCPLegend::setSelectedFont
+*/
+void QCPAbstractLegendItem::setSelectedFont(const QFont &font)
+{
+  mSelectedFont = font;
+}
+
+/*!
+  When this legend item is selected, \a color is used to draw generic text, instead of the normal
+  color set with \ref setTextColor.
+  
+  \see setTextColor, QCPLegend::setSelectedTextColor
+*/
+void QCPAbstractLegendItem::setSelectedTextColor(const QColor &color)
+{
+  mSelectedTextColor = color;
+}
+
+/*!
+  Sets whether this specific legend item is selectable.
+  
+  \see setSelectedParts, QCustomPlot::setInteractions
+*/
+void QCPAbstractLegendItem::setSelectable(bool selectable)
+{
+  if (mSelectable != selectable)
+  {
+    mSelectable = selectable;
+    emit selectableChanged(mSelectable);
+  }
+}
+
+/*!
+  Sets whether this specific legend item is selected.
+  
+  It is possible to set the selection state of this item by calling this function directly, even if
+  setSelectable is set to false.
+  
+  \see setSelectableParts, QCustomPlot::setInteractions
+*/
+void QCPAbstractLegendItem::setSelected(bool selected)
+{
+  if (mSelected != selected)
+  {
+    mSelected = selected;
+    emit selectionChanged(mSelected);
+  }
+}
+
+/* inherits documentation from base class */
+double QCPAbstractLegendItem::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (!mParentPlot) return -1;
+  if (onlySelectable && (!mSelectable || !mParentLegend->selectableParts().testFlag(QCPLegend::spItems)))
+    return -1;
+  
+  if (mRect.contains(pos.toPoint()))
+    return mParentPlot->selectionTolerance()*0.99;
+  else
+    return -1;
+}
+
+/* inherits documentation from base class */
+void QCPAbstractLegendItem::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiased, QCP::aeLegendItems);
+}
+
+/* inherits documentation from base class */
+QRect QCPAbstractLegendItem::clipRect() const
+{
+  return mOuterRect;
+}
+
+/* inherits documentation from base class */
+void QCPAbstractLegendItem::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged)
+{
+  Q_UNUSED(event)
+  Q_UNUSED(details)
+  if (mSelectable && mParentLegend->selectableParts().testFlag(QCPLegend::spItems))
+  {
+    bool selBefore = mSelected;
+    setSelected(additive ? !mSelected : true);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPAbstractLegendItem::deselectEvent(bool *selectionStateChanged)
+{
+  if (mSelectable && mParentLegend->selectableParts().testFlag(QCPLegend::spItems))
+  {
+    bool selBefore = mSelected;
+    setSelected(false);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPPlottableLegendItem
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPPlottableLegendItem
+  \brief A legend item representing a plottable with an icon and the plottable name.
+  
+  This is the standard legend item for plottables. It displays an icon of the plottable next to the
+  plottable name. The icon is drawn by the respective plottable itself (\ref
+  QCPAbstractPlottable::drawLegendIcon), and tries to give an intuitive symbol for the plottable.
+  For example, the QCPGraph draws a centered horizontal line and/or a single scatter point in the
+  middle.
+  
+  Legend items of this type are always associated with one plottable (retrievable via the
+  plottable() function and settable with the constructor). You may change the font of the plottable
+  name with \ref setFont. Icon padding and border pen is taken from the parent QCPLegend, see \ref
+  QCPLegend::setIconBorderPen and \ref QCPLegend::setIconTextPadding.
+
+  The function \ref QCPAbstractPlottable::addToLegend/\ref QCPAbstractPlottable::removeFromLegend
+  creates/removes legend items of this type in the default implementation. However, these functions
+  may be reimplemented such that a different kind of legend item (e.g a direct subclass of
+  QCPAbstractLegendItem) is used for that plottable.
+  
+  Since QCPLegend is based on QCPLayoutGrid, a legend item itself is just a subclass of
+  QCPLayoutElement. While it could be added to a legend (or any other layout) via the normal layout
+  interface, QCPLegend has specialized functions for handling legend items conveniently, see the
+  documentation of \ref QCPLegend.
+*/
+
+/*!
+  Creates a new legend item associated with \a plottable.
+  
+  Once it's created, it can be added to the legend via \ref QCPLegend::addItem.
+  
+  A more convenient way of adding/removing a plottable to/from the legend is via the functions \ref
+  QCPAbstractPlottable::addToLegend and \ref QCPAbstractPlottable::removeFromLegend.
+*/
+QCPPlottableLegendItem::QCPPlottableLegendItem(QCPLegend *parent, QCPAbstractPlottable *plottable) :
+  QCPAbstractLegendItem(parent),
+  mPlottable(plottable)
+{
+}
+
+/*! \internal
+  
+  Returns the pen that shall be used to draw the icon border, taking into account the selection
+  state of this item.
+*/
+QPen QCPPlottableLegendItem::getIconBorderPen() const
+{
+  return mSelected ? mParentLegend->selectedIconBorderPen() : mParentLegend->iconBorderPen();
+}
+
+/*! \internal
+  
+  Returns the text color that shall be used to draw text, taking into account the selection state
+  of this item.
+*/
+QColor QCPPlottableLegendItem::getTextColor() const
+{
+  return mSelected ? mSelectedTextColor : mTextColor;
+}
+
+/*! \internal
+  
+  Returns the font that shall be used to draw text, taking into account the selection state of this
+  item.
+*/
+QFont QCPPlottableLegendItem::getFont() const
+{
+  return mSelected ? mSelectedFont : mFont;
+}
+
+/*! \internal
+  
+  Draws the item with \a painter. The size and position of the drawn legend item is defined by the
+  parent layout (typically a \ref QCPLegend) and the \ref minimumSizeHint and \ref maximumSizeHint
+  of this legend item.
+*/
+void QCPPlottableLegendItem::draw(QCPPainter *painter)
+{
+  if (!mPlottable) return;
+  painter->setFont(getFont());
+  painter->setPen(QPen(getTextColor()));
+  QSizeF iconSize = mParentLegend->iconSize();
+  QRectF textRect = painter->fontMetrics().boundingRect(0, 0, 0, iconSize.height(), Qt::TextDontClip, mPlottable->name());
+  QRectF iconRect(mRect.topLeft(), iconSize);
+  int textHeight = qMax(textRect.height(), iconSize.height());  // if text has smaller height than icon, center text vertically in icon height, else align tops
+  painter->drawText(mRect.x()+iconSize.width()+mParentLegend->iconTextPadding(), mRect.y(), textRect.width(), textHeight, Qt::TextDontClip, mPlottable->name());
+  // draw icon:
+  painter->save();
+  painter->setClipRect(iconRect, Qt::IntersectClip);
+  mPlottable->drawLegendIcon(painter, iconRect);
+  painter->restore();
+  // draw icon border:
+  if (getIconBorderPen().style() != Qt::NoPen)
+  {
+    painter->setPen(getIconBorderPen());
+    painter->setBrush(Qt::NoBrush);
+    painter->drawRect(iconRect);
+  }
+}
+
+/*! \internal
+  
+  Calculates and returns the size of this item. This includes the icon, the text and the padding in
+  between.
+*/
+QSize QCPPlottableLegendItem::minimumSizeHint() const
+{
+  if (!mPlottable) return QSize();
+  QSize result(0, 0);
+  QRect textRect;
+  QFontMetrics fontMetrics(getFont());
+  QSize iconSize = mParentLegend->iconSize();
+  textRect = fontMetrics.boundingRect(0, 0, 0, iconSize.height(), Qt::TextDontClip, mPlottable->name());
+  result.setWidth(iconSize.width() + mParentLegend->iconTextPadding() + textRect.width() + mMargins.left() + mMargins.right());
+  result.setHeight(qMax(textRect.height(), iconSize.height()) + mMargins.top() + mMargins.bottom());
+  return result;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPLegend
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPLegend
+  \brief Manages a legend inside a QCustomPlot.
+
+  A legend is a small box somewhere in the plot which lists plottables with their name and icon.
+  
+  Normally, the legend is populated by calling \ref QCPAbstractPlottable::addToLegend. The
+  respective legend item can be removed with \ref QCPAbstractPlottable::removeFromLegend. However,
+  QCPLegend also offers an interface to add and manipulate legend items directly: \ref item, \ref
+  itemWithPlottable, \ref itemCount, \ref addItem, \ref removeItem, etc.
+  
+  The QCPLegend derives from QCPLayoutGrid and as such can be placed in any position a
+  QCPLayoutElement may be positioned. The legend items are themselves QCPLayoutElements which are
+  placed in the grid layout of the legend. QCPLegend only adds an interface specialized for
+  handling child elements of type QCPAbstractLegendItem, as mentioned above. In principle, any
+  other layout elements may also be added to a legend via the normal \ref QCPLayoutGrid interface.
+  However, the QCPAbstractLegendItem-Interface will ignore those elements (e.g. \ref itemCount will
+  only return the number of items with QCPAbstractLegendItems type).
+
+  By default, every QCustomPlot has one legend (QCustomPlot::legend) which is placed in the inset
+  layout of the main axis rect (\ref QCPAxisRect::insetLayout). To move the legend to another
+  position inside the axis rect, use the methods of the \ref QCPLayoutInset. To move the legend
+  outside of the axis rect, place it anywhere else with the QCPLayout/QCPLayoutElement interface.
+*/
+
+/* start of documentation of signals */
+
+/*! \fn void QCPLegend::selectionChanged(QCPLegend::SelectableParts selection);
+
+  This signal is emitted when the selection state of this legend has changed.
+  
+  \see setSelectedParts, setSelectableParts
+*/
+
+/* end of documentation of signals */
+
+/*!
+  Constructs a new QCPLegend instance with \a parentPlot as the containing plot and default values.
+  
+  Note that by default, QCustomPlot already contains a legend ready to be used as
+  QCustomPlot::legend
+*/
+QCPLegend::QCPLegend()
+{
+  setRowSpacing(0);
+  setColumnSpacing(10);
+  setMargins(QMargins(2, 3, 2, 2));
+  setAntialiased(false);
+  setIconSize(32, 18);
+  
+  setIconTextPadding(7);
+  
+  setSelectableParts(spLegendBox | spItems);
+  setSelectedParts(spNone);
+  
+  setBorderPen(QPen(Qt::black));
+  setSelectedBorderPen(QPen(Qt::blue, 2));
+  setIconBorderPen(Qt::NoPen);
+  setSelectedIconBorderPen(QPen(Qt::blue, 2));
+  setBrush(Qt::white);
+  setSelectedBrush(Qt::white);
+  setTextColor(Qt::black);
+  setSelectedTextColor(Qt::blue);
+}
+
+QCPLegend::~QCPLegend()
+{
+  clearItems();
+  if (qobject_cast<QCustomPlot*>(mParentPlot)) // make sure this isn't called from QObject dtor when QCustomPlot is already destructed (happens when the legend is not in any layout and thus QObject-child of QCustomPlot)
+    mParentPlot->legendRemoved(this);
+}
+
+/* no doc for getter, see setSelectedParts */
+QCPLegend::SelectableParts QCPLegend::selectedParts() const
+{
+  // check whether any legend elements selected, if yes, add spItems to return value
+  bool hasSelectedItems = false;
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (item(i) && item(i)->selected())
+    {
+      hasSelectedItems = true;
+      break;
+    }
+  }
+  if (hasSelectedItems)
+    return mSelectedParts | spItems;
+  else
+    return mSelectedParts & ~spItems;
+}
+
+/*!
+  Sets the pen, the border of the entire legend is drawn with.
+*/
+void QCPLegend::setBorderPen(const QPen &pen)
+{
+  mBorderPen = pen;
+}
+
+/*!
+  Sets the brush of the legend background.
+*/
+void QCPLegend::setBrush(const QBrush &brush)
+{
+  mBrush = brush;
+}
+
+/*!
+  Sets the default font of legend text. Legend items that draw text (e.g. the name of a graph) will
+  use this font by default. However, a different font can be specified on a per-item-basis by
+  accessing the specific legend item.
+  
+  This function will also set \a font on all already existing legend items.
+  
+  \see QCPAbstractLegendItem::setFont
+*/
+void QCPLegend::setFont(const QFont &font)
+{
+  mFont = font;
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (item(i))
+      item(i)->setFont(mFont);
+  }
+}
+
+/*!
+  Sets the default color of legend text. Legend items that draw text (e.g. the name of a graph)
+  will use this color by default. However, a different colors can be specified on a per-item-basis
+  by accessing the specific legend item.
+  
+  This function will also set \a color on all already existing legend items.
+  
+  \see QCPAbstractLegendItem::setTextColor
+*/
+void QCPLegend::setTextColor(const QColor &color)
+{
+  mTextColor = color;
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (item(i))
+      item(i)->setTextColor(color);
+  }
+}
+
+/*!
+  Sets the size of legend icons. Legend items that draw an icon (e.g. a visual
+  representation of the graph) will use this size by default.
+*/
+void QCPLegend::setIconSize(const QSize &size)
+{
+  mIconSize = size;
+}
+
+/*! \overload
+*/
+void QCPLegend::setIconSize(int width, int height)
+{
+  mIconSize.setWidth(width);
+  mIconSize.setHeight(height);
+}
+
+/*!
+  Sets the horizontal space in pixels between the legend icon and the text next to it.
+  Legend items that draw an icon (e.g. a visual representation of the graph) and text (e.g. the
+  name of the graph) will use this space by default.
+*/
+void QCPLegend::setIconTextPadding(int padding)
+{
+  mIconTextPadding = padding;
+}
+
+/*!
+  Sets the pen used to draw a border around each legend icon. Legend items that draw an
+  icon (e.g. a visual representation of the graph) will use this pen by default.
+  
+  If no border is wanted, set this to \a Qt::NoPen.
+*/
+void QCPLegend::setIconBorderPen(const QPen &pen)
+{
+  mIconBorderPen = pen;
+}
+
+/*!
+  Sets whether the user can (de-)select the parts in \a selectable by clicking on the QCustomPlot surface.
+  (When \ref QCustomPlot::setInteractions contains \ref QCP::iSelectLegend.)
+  
+  However, even when \a selectable is set to a value not allowing the selection of a specific part,
+  it is still possible to set the selection of this part manually, by calling \ref setSelectedParts
+  directly.
+  
+  \see SelectablePart, setSelectedParts
+*/
+void QCPLegend::setSelectableParts(const SelectableParts &selectable)
+{
+  if (mSelectableParts != selectable)
+  {
+    mSelectableParts = selectable;
+    emit selectableChanged(mSelectableParts);
+  }
+}
+
+/*!
+  Sets the selected state of the respective legend parts described by \ref SelectablePart. When a part
+  is selected, it uses a different pen/font and brush. If some legend items are selected and \a selected
+  doesn't contain \ref spItems, those items become deselected.
+  
+  The entire selection mechanism is handled automatically when \ref QCustomPlot::setInteractions
+  contains iSelectLegend. You only need to call this function when you wish to change the selection
+  state manually.
+  
+  This function can change the selection state of a part even when \ref setSelectableParts was set to a
+  value that actually excludes the part.
+  
+  emits the \ref selectionChanged signal when \a selected is different from the previous selection state.
+  
+  Note that it doesn't make sense to set the selected state \ref spItems here when it wasn't set
+  before, because there's no way to specify which exact items to newly select. Do this by calling
+  \ref QCPAbstractLegendItem::setSelected directly on the legend item you wish to select.
+  
+  \see SelectablePart, setSelectableParts, selectTest, setSelectedBorderPen, setSelectedIconBorderPen, setSelectedBrush,
+  setSelectedFont
+*/
+void QCPLegend::setSelectedParts(const SelectableParts &selected)
+{
+  SelectableParts newSelected = selected;
+  mSelectedParts = this->selectedParts(); // update mSelectedParts in case item selection changed
+
+  if (mSelectedParts != newSelected)
+  {
+    if (!mSelectedParts.testFlag(spItems) && newSelected.testFlag(spItems)) // attempt to set spItems flag (can't do that)
+    {
+      qDebug() << Q_FUNC_INFO << "spItems flag can not be set, it can only be unset with this function";
+      newSelected &= ~spItems;
+    }
+    if (mSelectedParts.testFlag(spItems) && !newSelected.testFlag(spItems)) // spItems flag was unset, so clear item selection
+    {
+      for (int i=0; i<itemCount(); ++i)
+      {
+        if (item(i))
+          item(i)->setSelected(false);
+      }
+    }
+    mSelectedParts = newSelected;
+    emit selectionChanged(mSelectedParts);
+  }
+}
+
+/*!
+  When the legend box is selected, this pen is used to draw the border instead of the normal pen
+  set via \ref setBorderPen.
+
+  \see setSelectedParts, setSelectableParts, setSelectedBrush
+*/
+void QCPLegend::setSelectedBorderPen(const QPen &pen)
+{
+  mSelectedBorderPen = pen;
+}
+
+/*!
+  Sets the pen legend items will use to draw their icon borders, when they are selected.
+
+  \see setSelectedParts, setSelectableParts, setSelectedFont
+*/
+void QCPLegend::setSelectedIconBorderPen(const QPen &pen)
+{
+  mSelectedIconBorderPen = pen;
+}
+
+/*!
+  When the legend box is selected, this brush is used to draw the legend background instead of the normal brush
+  set via \ref setBrush.
+
+  \see setSelectedParts, setSelectableParts, setSelectedBorderPen
+*/
+void QCPLegend::setSelectedBrush(const QBrush &brush)
+{
+  mSelectedBrush = brush;
+}
+
+/*!
+  Sets the default font that is used by legend items when they are selected.
+  
+  This function will also set \a font on all already existing legend items.
+
+  \see setFont, QCPAbstractLegendItem::setSelectedFont
+*/
+void QCPLegend::setSelectedFont(const QFont &font)
+{
+  mSelectedFont = font;
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (item(i))
+      item(i)->setSelectedFont(font);
+  }
+}
+
+/*!
+  Sets the default text color that is used by legend items when they are selected.
+  
+  This function will also set \a color on all already existing legend items.
+
+  \see setTextColor, QCPAbstractLegendItem::setSelectedTextColor
+*/
+void QCPLegend::setSelectedTextColor(const QColor &color)
+{
+  mSelectedTextColor = color;
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (item(i))
+      item(i)->setSelectedTextColor(color);
+  }
+}
+
+/*!
+  Returns the item with index \a i.
+  
+  \see itemCount
+*/
+QCPAbstractLegendItem *QCPLegend::item(int index) const
+{
+  return qobject_cast<QCPAbstractLegendItem*>(elementAt(index));
+}
+
+/*!
+  Returns the QCPPlottableLegendItem which is associated with \a plottable (e.g. a \ref QCPGraph*).
+  If such an item isn't in the legend, returns 0.
+  
+  \see hasItemWithPlottable
+*/
+QCPPlottableLegendItem *QCPLegend::itemWithPlottable(const QCPAbstractPlottable *plottable) const
+{
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (QCPPlottableLegendItem *pli = qobject_cast<QCPPlottableLegendItem*>(item(i)))
+    {
+      if (pli->plottable() == plottable)
+        return pli;
+    }
+  }
+  return 0;
+}
+
+/*!
+  Returns the number of items currently in the legend.
+  \see item
+*/
+int QCPLegend::itemCount() const
+{
+  return elementCount();
+}
+
+/*!
+  Returns whether the legend contains \a itm.
+*/
+bool QCPLegend::hasItem(QCPAbstractLegendItem *item) const
+{
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (item == this->item(i))
+        return true;
+  }
+  return false;
+}
+
+/*!
+  Returns whether the legend contains a QCPPlottableLegendItem which is associated with \a plottable (e.g. a \ref QCPGraph*).
+  If such an item isn't in the legend, returns false.
+  
+  \see itemWithPlottable
+*/
+bool QCPLegend::hasItemWithPlottable(const QCPAbstractPlottable *plottable) const
+{
+  return itemWithPlottable(plottable);
+}
+
+/*!
+  Adds \a item to the legend, if it's not present already.
+  
+  Returns true on sucess, i.e. if the item wasn't in the list already and has been successfuly added.
+  
+  The legend takes ownership of the item.
+*/
+bool QCPLegend::addItem(QCPAbstractLegendItem *item)
+{
+  if (!hasItem(item))
+  {
+    return addElement(rowCount(), 0, item);
+  } else
+    return false;
+}
+
+/*!
+  Removes the item with index \a index from the legend.
+
+  Returns true, if successful.
+  
+  \see itemCount, clearItems
+*/
+bool QCPLegend::removeItem(int index)
+{
+  if (QCPAbstractLegendItem *ali = item(index))
+  {
+    bool success = remove(ali);
+    simplify();
+    return success;
+  } else
+    return false;
+}
+
+/*! \overload
+  
+  Removes \a item from the legend.
+
+  Returns true, if successful.
+  
+  \see clearItems
+*/
+bool QCPLegend::removeItem(QCPAbstractLegendItem *item)
+{
+  bool success = remove(item);
+  simplify();
+  return success;
+}
+
+/*!
+  Removes all items from the legend.
+*/
+void QCPLegend::clearItems()
+{
+  for (int i=itemCount()-1; i>=0; --i)
+    removeItem(i);
+}
+
+/*!
+  Returns the legend items that are currently selected. If no items are selected,
+  the list is empty.
+  
+  \see QCPAbstractLegendItem::setSelected, setSelectable
+*/
+QList<QCPAbstractLegendItem *> QCPLegend::selectedItems() const
+{
+  QList<QCPAbstractLegendItem*> result;
+  for (int i=0; i<itemCount(); ++i)
+  {
+    if (QCPAbstractLegendItem *ali = item(i))
+    {
+      if (ali->selected())
+        result.append(ali);
+    }
+  }
+  return result;
+}
+
+/*! \internal
+
+  A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter
+  before drawing main legend elements.
+
+  This is the antialiasing state the painter passed to the \ref draw method is in by default.
+  
+  This function takes into account the local setting of the antialiasing flag as well as the
+  overrides set with \ref QCustomPlot::setAntialiasedElements and \ref
+  QCustomPlot::setNotAntialiasedElements.
+  
+  \see setAntialiased
+*/
+void QCPLegend::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiased, QCP::aeLegend);
+}
+
+/*! \internal
+  
+  Returns the pen used to paint the border of the legend, taking into account the selection state
+  of the legend box.
+*/
+QPen QCPLegend::getBorderPen() const
+{
+  return mSelectedParts.testFlag(spLegendBox) ? mSelectedBorderPen : mBorderPen;
+}
+
+/*! \internal
+  
+  Returns the brush used to paint the background of the legend, taking into account the selection
+  state of the legend box.
+*/
+QBrush QCPLegend::getBrush() const
+{
+  return mSelectedParts.testFlag(spLegendBox) ? mSelectedBrush : mBrush;
+}
+
+/*! \internal
+  
+  Draws the legend box with the provided \a painter. The individual legend items are layerables
+  themselves, thus are drawn independently.
+*/
+void QCPLegend::draw(QCPPainter *painter)
+{
+  // draw background rect:
+  painter->setBrush(getBrush());
+  painter->setPen(getBorderPen());
+  painter->drawRect(mOuterRect);
+}
+
+/* inherits documentation from base class */
+double QCPLegend::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  if (!mParentPlot) return -1;
+  if (onlySelectable && !mSelectableParts.testFlag(spLegendBox))
+    return -1;
+  
+  if (mOuterRect.contains(pos.toPoint()))
+  {
+    if (details) details->setValue(spLegendBox);
+    return mParentPlot->selectionTolerance()*0.99;
+  }
+  return -1;
+}
+
+/* inherits documentation from base class */
+void QCPLegend::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged)
+{
+  Q_UNUSED(event)
+  mSelectedParts = selectedParts(); // in case item selection has changed
+  if (details.value<SelectablePart>() == spLegendBox && mSelectableParts.testFlag(spLegendBox))
+  {
+    SelectableParts selBefore = mSelectedParts;
+    setSelectedParts(additive ? mSelectedParts^spLegendBox : mSelectedParts|spLegendBox); // no need to unset spItems in !additive case, because they will be deselected by QCustomPlot (they're normal QCPLayerables with own deselectEvent)
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelectedParts != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPLegend::deselectEvent(bool *selectionStateChanged)
+{
+  mSelectedParts = selectedParts(); // in case item selection has changed
+  if (mSelectableParts.testFlag(spLegendBox))
+  {
+    SelectableParts selBefore = mSelectedParts;
+    setSelectedParts(selectedParts() & ~spLegendBox);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelectedParts != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+QCP::Interaction QCPLegend::selectionCategory() const
+{
+  return QCP::iSelectLegend;
+}
+
+/* inherits documentation from base class */
+QCP::Interaction QCPAbstractLegendItem::selectionCategory() const
+{
+  return QCP::iSelectLegend;
+}
+
+/* inherits documentation from base class */
+void QCPLegend::parentPlotInitialized(QCustomPlot *parentPlot)
+{
+  Q_UNUSED(parentPlot)
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPPlotTitle
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPPlotTitle
+  \brief A layout element displaying a plot title text
+  
+  The text may be specified with \ref setText, theformatting can be controlled with \ref setFont
+  and \ref setTextColor.
+  
+  A plot title can be added as follows:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpplottitle-creation
+  
+  Since a plot title is a common requirement, QCustomPlot offers specialized selection signals for
+  easy interaction with QCPPlotTitle. If a layout element of type QCPPlotTitle is clicked, the
+  signal \ref QCustomPlot::titleClick is emitted. A double click emits the \ref
+  QCustomPlot::titleDoubleClick signal.
+*/
+
+/* start documentation of signals */
+
+/*! \fn void QCPPlotTitle::selectionChanged(bool selected)
+  
+  This signal is emitted when the selection state has changed to \a selected, either by user
+  interaction or by a direct call to \ref setSelected.
+  
+  \see setSelected, setSelectable
+*/
+
+/* end documentation of signals */
+
+/*!
+  Creates a new QCPPlotTitle instance and sets default values. The initial text is empty (\ref setText).
+  
+  To set the title text in the constructor, rather use \ref QCPPlotTitle(QCustomPlot *parentPlot, const QString &text).
+*/
+QCPPlotTitle::QCPPlotTitle(QCustomPlot *parentPlot) :
+  QCPLayoutElement(parentPlot),
+  mFont(QFont(QLatin1String("sans serif"), 13*1.5, QFont::Bold)),
+  mTextColor(Qt::black),
+  mSelectedFont(QFont(QLatin1String("sans serif"), 13*1.6, QFont::Bold)),
+  mSelectedTextColor(Qt::blue),
+  mSelectable(false),
+  mSelected(false)
+{
+  if (parentPlot)
+  {
+    setLayer(parentPlot->currentLayer());
+    mFont = QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.5, QFont::Bold);
+    mSelectedFont = QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.6, QFont::Bold);
+  }
+  setMargins(QMargins(5, 5, 5, 0));
+}
+
+/*! \overload
+  
+  Creates a new QCPPlotTitle instance and sets default values. The initial text is set to \a text.
+*/
+QCPPlotTitle::QCPPlotTitle(QCustomPlot *parentPlot, const QString &text) :
+  QCPLayoutElement(parentPlot),
+  mText(text),
+  mFont(QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.5, QFont::Bold)),
+  mTextColor(Qt::black),
+  mSelectedFont(QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.6, QFont::Bold)),
+  mSelectedTextColor(Qt::blue),
+  mSelectable(false),
+  mSelected(false)
+{
+  setLayer(QLatin1String("axes"));
+  setMargins(QMargins(5, 5, 5, 0));
+}
+
+/*!
+  Sets the text that will be displayed to \a text. Multiple lines can be created by insertion of "\n".
+  
+  \see setFont, setTextColor
+*/
+void QCPPlotTitle::setText(const QString &text)
+{
+  mText = text;
+}
+
+/*!
+  Sets the \a font of the title text.
+  
+  \see setTextColor, setSelectedFont
+*/
+void QCPPlotTitle::setFont(const QFont &font)
+{
+  mFont = font;
+}
+
+/*!
+  Sets the \a color of the title text.
+  
+  \see setFont, setSelectedTextColor
+*/
+void QCPPlotTitle::setTextColor(const QColor &color)
+{
+  mTextColor = color;
+}
+
+/*!
+  Sets the \a font of the title text that will be used if the plot title is selected (\ref setSelected).
+  
+  \see setFont
+*/
+void QCPPlotTitle::setSelectedFont(const QFont &font)
+{
+  mSelectedFont = font;
+}
+
+/*!
+  Sets the \a color of the title text that will be used if the plot title is selected (\ref setSelected).
+  
+  \see setTextColor
+*/
+void QCPPlotTitle::setSelectedTextColor(const QColor &color)
+{
+  mSelectedTextColor = color;
+}
+
+/*!
+  Sets whether the user may select this plot title to \a selectable.
+
+  Note that even when \a selectable is set to <tt>false</tt>, the selection state may be changed
+  programmatically via \ref setSelected.
+*/
+void QCPPlotTitle::setSelectable(bool selectable)
+{
+  if (mSelectable != selectable)
+  {
+    mSelectable = selectable;
+    emit selectableChanged(mSelectable);
+  }
+}
+
+/*!
+  Sets the selection state of this plot title to \a selected. If the selection has changed, \ref
+  selectionChanged is emitted.
+  
+  Note that this function can change the selection state independently of the current \ref
+  setSelectable state.
+*/
+void QCPPlotTitle::setSelected(bool selected)
+{
+  if (mSelected != selected)
+  {
+    mSelected = selected;
+    emit selectionChanged(mSelected);
+  }
+}
+
+/* inherits documentation from base class */
+void QCPPlotTitle::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  applyAntialiasingHint(painter, mAntialiased, QCP::aeNone);
+}
+
+/* inherits documentation from base class */
+void QCPPlotTitle::draw(QCPPainter *painter)
+{
+  painter->setFont(mainFont());
+  painter->setPen(QPen(mainTextColor()));
+  painter->drawText(mRect, Qt::AlignCenter, mText, &mTextBoundingRect);
+}
+
+/* inherits documentation from base class */
+QSize QCPPlotTitle::minimumSizeHint() const
+{
+  QFontMetrics metrics(mFont);
+  QSize result = metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size();
+  result.rwidth() += mMargins.left() + mMargins.right();
+  result.rheight() += mMargins.top() + mMargins.bottom();
+  return result;
+}
+
+/* inherits documentation from base class */
+QSize QCPPlotTitle::maximumSizeHint() const
+{
+  QFontMetrics metrics(mFont);
+  QSize result = metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size();
+  result.rheight() += mMargins.top() + mMargins.bottom();
+  result.setWidth(QWIDGETSIZE_MAX);
+  return result;
+}
+
+/* inherits documentation from base class */
+void QCPPlotTitle::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged)
+{
+  Q_UNUSED(event)
+  Q_UNUSED(details)
+  if (mSelectable)
+  {
+    bool selBefore = mSelected;
+    setSelected(additive ? !mSelected : true);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPPlotTitle::deselectEvent(bool *selectionStateChanged)
+{
+  if (mSelectable)
+  {
+    bool selBefore = mSelected;
+    setSelected(false);
+    if (selectionStateChanged)
+      *selectionStateChanged = mSelected != selBefore;
+  }
+}
+
+/* inherits documentation from base class */
+double QCPPlotTitle::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  if (mTextBoundingRect.contains(pos.toPoint()))
+    return mParentPlot->selectionTolerance()*0.99;
+  else
+    return -1;
+}
+
+/*! \internal
+  
+  Returns the main font to be used. This is mSelectedFont if \ref setSelected is set to
+  <tt>true</tt>, else mFont is returned.
+*/
+QFont QCPPlotTitle::mainFont() const
+{
+  return mSelected ? mSelectedFont : mFont;
+}
+
+/*! \internal
+  
+  Returns the main color to be used. This is mSelectedTextColor if \ref setSelected is set to
+  <tt>true</tt>, else mTextColor is returned.
+*/
+QColor QCPPlotTitle::mainTextColor() const
+{
+  return mSelected ? mSelectedTextColor : mTextColor;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPColorScale
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPColorScale
+  \brief A color scale for use with color coding data such as QCPColorMap
+  
+  This layout element can be placed on the plot to correlate a color gradient with data values. It
+  is usually used in combination with one or multiple \ref QCPColorMap "QCPColorMaps".
+
+  \image html QCPColorScale.png
+  
+  The color scale can be either horizontal or vertical, as shown in the image above. The
+  orientation and the side where the numbers appear is controlled with \ref setType.
+  
+  Use \ref QCPColorMap::setColorScale to connect a color map with a color scale. Once they are
+  connected, they share their gradient, data range and data scale type (\ref setGradient, \ref
+  setDataRange, \ref setDataScaleType). Multiple color maps may be associated with a single color
+  scale, to make them all synchronize these properties.
+  
+  To have finer control over the number display and axis behaviour, you can directly access the
+  \ref axis. See the documentation of QCPAxis for details about configuring axes. For example, if
+  you want to change the number of automatically generated ticks, call
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-autotickcount
+  
+  Placing a color scale next to the main axis rect works like with any other layout element:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-creation
+  In this case we have placed it to the right of the default axis rect, so it wasn't necessary to
+  call \ref setType, since \ref QCPAxis::atRight is already the default. The text next to the color
+  scale can be set with \ref setLabel.
+  
+  For optimum appearance (like in the image above), it may be desirable to line up the axis rect and
+  the borders of the color scale. Use a \ref QCPMarginGroup to achieve this:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-margingroup
+  
+  Color scales are initialized with a non-zero minimum top and bottom margin (\ref
+  setMinimumMargins), because vertical color scales are most common and the minimum top/bottom
+  margin makes sure it keeps some distance to the top/bottom widget border. So if you change to a
+  horizontal color scale by setting \ref setType to \ref QCPAxis::atBottom or \ref QCPAxis::atTop, you
+  might want to also change the minimum margins accordingly, e.g. <tt>setMinimumMargins(QMargins(6, 0, 6, 0))</tt>.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QCPAxis *QCPColorScale::axis() const
+  
+  Returns the internal \ref QCPAxis instance of this color scale. You can access it to alter the
+  appearance and behaviour of the axis. \ref QCPColorScale duplicates some properties in its
+  interface for convenience. Those are \ref setDataRange (\ref QCPAxis::setRange), \ref
+  setDataScaleType (\ref QCPAxis::setScaleType), and the method \ref setLabel (\ref
+  QCPAxis::setLabel). As they each are connected, it does not matter whether you use the method on
+  the QCPColorScale or on its QCPAxis.
+  
+  If the type of the color scale is changed with \ref setType, the axis returned by this method
+  will change, too, to either the left, right, bottom or top axis, depending on which type was set.
+*/
+
+/* end documentation of signals */
+/* start documentation of signals */
+
+/*! \fn void QCPColorScale::dataRangeChanged(QCPRange newRange);
+  
+  This signal is emitted when the data range changes.
+  
+  \see setDataRange
+*/
+
+/*! \fn void QCPColorScale::dataScaleTypeChanged(QCPAxis::ScaleType scaleType);
+  
+  This signal is emitted when the data scale type changes.
+  
+  \see setDataScaleType
+*/
+
+/*! \fn void QCPColorScale::gradientChanged(QCPColorGradient newGradient);
+  
+  This signal is emitted when the gradient changes.
+  
+  \see setGradient
+*/
+
+/* end documentation of signals */
+
+/*!
+  Constructs a new QCPColorScale.
+*/
+QCPColorScale::QCPColorScale(QCustomPlot *parentPlot) :
+  QCPLayoutElement(parentPlot),
+  mType(QCPAxis::atTop), // set to atTop such that setType(QCPAxis::atRight) below doesn't skip work because it thinks it's already atRight
+  mDataScaleType(QCPAxis::stLinear),
+  mBarWidth(20),
+  mAxisRect(new QCPColorScaleAxisRectPrivate(this))
+{
+  setMinimumMargins(QMargins(0, 6, 0, 6)); // for default right color scale types, keep some room at bottom and top (important if no margin group is used)
+  setType(QCPAxis::atRight);
+  setDataRange(QCPRange(0, 6));
+}
+
+QCPColorScale::~QCPColorScale()
+{
+  delete mAxisRect;
+}
+
+/* undocumented getter */
+QString QCPColorScale::label() const
+{
+  if (!mColorAxis)
+  {
+    qDebug() << Q_FUNC_INFO << "internal color axis undefined";
+    return QString();
+  }
+  
+  return mColorAxis.data()->label();
+}
+
+/* undocumented getter */
+bool QCPColorScale::rangeDrag() const
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return false;
+  }
+  
+  return mAxisRect.data()->rangeDrag().testFlag(QCPAxis::orientation(mType)) &&
+      mAxisRect.data()->rangeDragAxis(QCPAxis::orientation(mType)) &&
+      mAxisRect.data()->rangeDragAxis(QCPAxis::orientation(mType))->orientation() == QCPAxis::orientation(mType);
+}
+
+/* undocumented getter */
+bool QCPColorScale::rangeZoom() const
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return false;
+  }
+  
+  return mAxisRect.data()->rangeZoom().testFlag(QCPAxis::orientation(mType)) &&
+      mAxisRect.data()->rangeZoomAxis(QCPAxis::orientation(mType)) &&
+      mAxisRect.data()->rangeZoomAxis(QCPAxis::orientation(mType))->orientation() == QCPAxis::orientation(mType);
+}
+
+/*!
+  Sets at which side of the color scale the axis is placed, and thus also its orientation.
+  
+  Note that after setting \a type to a different value, the axis returned by \ref axis() will
+  be a different one. The new axis will adopt the following properties from the previous axis: The
+  range, scale type, log base and label.
+*/
+void QCPColorScale::setType(QCPAxis::AxisType type)
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  if (mType != type)
+  {
+    mType = type;
+    QCPRange rangeTransfer(0, 6);
+    double logBaseTransfer = 10;
+    QString labelTransfer;
+    // revert some settings on old axis:
+    if (mColorAxis)
+    {
+      rangeTransfer = mColorAxis.data()->range();
+      labelTransfer = mColorAxis.data()->label();
+      logBaseTransfer = mColorAxis.data()->scaleLogBase();
+      mColorAxis.data()->setLabel(QString());
+      disconnect(mColorAxis.data(), SIGNAL(rangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange)));
+      disconnect(mColorAxis.data(), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType)));
+    }
+    QList<QCPAxis::AxisType> allAxisTypes = QList<QCPAxis::AxisType>() << QCPAxis::atLeft << QCPAxis::atRight << QCPAxis::atBottom << QCPAxis::atTop;
+    foreach (QCPAxis::AxisType atype, allAxisTypes)
+    {
+      mAxisRect.data()->axis(atype)->setTicks(atype == mType);
+      mAxisRect.data()->axis(atype)->setTickLabels(atype== mType);
+    }
+    // set new mColorAxis pointer:
+    mColorAxis = mAxisRect.data()->axis(mType);
+    // transfer settings to new axis:
+    mColorAxis.data()->setRange(rangeTransfer); // transfer range of old axis to new one (necessary if axis changes from vertical to horizontal or vice versa)
+    mColorAxis.data()->setLabel(labelTransfer);
+    mColorAxis.data()->setScaleLogBase(logBaseTransfer); // scaleType is synchronized among axes in realtime via signals (connected in QCPColorScale ctor), so we only need to take care of log base here
+    connect(mColorAxis.data(), SIGNAL(rangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange)));
+    connect(mColorAxis.data(), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType)));
+    mAxisRect.data()->setRangeDragAxes(QCPAxis::orientation(mType) == Qt::Horizontal ? mColorAxis.data() : 0,
+                                       QCPAxis::orientation(mType) == Qt::Vertical ? mColorAxis.data() : 0);
+  }
+}
+
+/*!
+  Sets the range spanned by the color gradient and that is shown by the axis in the color scale.
+  
+  It is equivalent to calling QCPColorMap::setDataRange on any of the connected color maps. It is
+  also equivalent to directly accessing the \ref axis and setting its range with \ref
+  QCPAxis::setRange.
+  
+  \see setDataScaleType, setGradient, rescaleDataRange
+*/
+void QCPColorScale::setDataRange(const QCPRange &dataRange)
+{
+  if (mDataRange.lower != dataRange.lower || mDataRange.upper != dataRange.upper)
+  {
+    mDataRange = dataRange;
+    if (mColorAxis)
+      mColorAxis.data()->setRange(mDataRange);
+    emit dataRangeChanged(mDataRange);
+  }
+}
+
+/*!
+  Sets the scale type of the color scale, i.e. whether values are linearly associated with colors
+  or logarithmically.
+  
+  It is equivalent to calling QCPColorMap::setDataScaleType on any of the connected color maps. It is
+  also equivalent to directly accessing the \ref axis and setting its scale type with \ref
+  QCPAxis::setScaleType.
+  
+  \see setDataRange, setGradient
+*/
+void QCPColorScale::setDataScaleType(QCPAxis::ScaleType scaleType)
+{
+  if (mDataScaleType != scaleType)
+  {
+    mDataScaleType = scaleType;
+    if (mColorAxis)
+      mColorAxis.data()->setScaleType(mDataScaleType);
+    if (mDataScaleType == QCPAxis::stLogarithmic)
+      setDataRange(mDataRange.sanitizedForLogScale());
+    emit dataScaleTypeChanged(mDataScaleType);
+  }
+}
+
+/*!
+  Sets the color gradient that will be used to represent data values.
+  
+  It is equivalent to calling QCPColorMap::setGradient on any of the connected color maps.
+  
+  \see setDataRange, setDataScaleType
+*/
+void QCPColorScale::setGradient(const QCPColorGradient &gradient)
+{
+  if (mGradient != gradient)
+  {
+    mGradient = gradient;
+    if (mAxisRect)
+      mAxisRect.data()->mGradientImageInvalidated = true;
+    emit gradientChanged(mGradient);
+  }
+}
+
+/*!
+  Sets the axis label of the color scale. This is equivalent to calling \ref QCPAxis::setLabel on
+  the internal \ref axis.
+*/
+void QCPColorScale::setLabel(const QString &str)
+{
+  if (!mColorAxis)
+  {
+    qDebug() << Q_FUNC_INFO << "internal color axis undefined";
+    return;
+  }
+  
+  mColorAxis.data()->setLabel(str);
+}
+
+/*!
+  Sets the width (or height, for horizontal color scales) the bar where the gradient is displayed
+  will have.
+*/
+void QCPColorScale::setBarWidth(int width)
+{
+  mBarWidth = width;
+}
+
+/*!
+  Sets whether the user can drag the data range (\ref setDataRange).
+  
+  Note that \ref QCP::iRangeDrag must be in the QCustomPlot's interactions (\ref
+  QCustomPlot::setInteractions) to allow range dragging.
+*/
+void QCPColorScale::setRangeDrag(bool enabled)
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  
+  if (enabled)
+    mAxisRect.data()->setRangeDrag(QCPAxis::orientation(mType));
+  else
+    mAxisRect.data()->setRangeDrag(0);
+}
+
+/*!
+  Sets whether the user can zoom the data range (\ref setDataRange) by scrolling the mouse wheel.
+  
+  Note that \ref QCP::iRangeZoom must be in the QCustomPlot's interactions (\ref
+  QCustomPlot::setInteractions) to allow range dragging.
+*/
+void QCPColorScale::setRangeZoom(bool enabled)
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  
+  if (enabled)
+    mAxisRect.data()->setRangeZoom(QCPAxis::orientation(mType));
+  else
+    mAxisRect.data()->setRangeZoom(0);
+}
+
+/*!
+  Returns a list of all the color maps associated with this color scale.
+*/
+QList<QCPColorMap*> QCPColorScale::colorMaps() const
+{
+  QList<QCPColorMap*> result;
+  for (int i=0; i<mParentPlot->plottableCount(); ++i)
+  {
+    if (QCPColorMap *cm = qobject_cast<QCPColorMap*>(mParentPlot->plottable(i)))
+      if (cm->colorScale() == this)
+        result.append(cm);
+  }
+  return result;
+}
+
+/*!
+  Changes the data range such that all color maps associated with this color scale are fully mapped
+  to the gradient in the data dimension.
+  
+  \see setDataRange
+*/
+void QCPColorScale::rescaleDataRange(bool onlyVisibleMaps)
+{
+  QList<QCPColorMap*> maps = colorMaps();
+  QCPRange newRange;
+  bool haveRange = false;
+  int sign = 0; // TODO: should change this to QCPAbstractPlottable::SignDomain later (currently is protected, maybe move to QCP namespace)
+  if (mDataScaleType == QCPAxis::stLogarithmic)
+    sign = (mDataRange.upper < 0 ? -1 : 1);
+  for (int i=0; i<maps.size(); ++i)
+  {
+    if (!maps.at(i)->realVisibility() && onlyVisibleMaps)
+      continue;
+    QCPRange mapRange;
+    if (maps.at(i)->colorScale() == this)
+    {
+      bool currentFoundRange = true;
+      mapRange = maps.at(i)->data()->dataBounds();
+      if (sign == 1)
+      {
+        if (mapRange.lower <= 0 && mapRange.upper > 0)
+          mapRange.lower = mapRange.upper*1e-3;
+        else if (mapRange.lower <= 0 && mapRange.upper <= 0)
+          currentFoundRange = false;
+      } else if (sign == -1)
+      {
+        if (mapRange.upper >= 0 && mapRange.lower < 0)
+          mapRange.upper = mapRange.lower*1e-3;
+        else if (mapRange.upper >= 0 && mapRange.lower >= 0)
+          currentFoundRange = false;
+      }
+      if (currentFoundRange)
+      {
+        if (!haveRange)
+          newRange = mapRange;
+        else
+          newRange.expand(mapRange);
+        haveRange = true;
+      }
+    }
+  }
+  if (haveRange)
+  {
+    if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this dimension), shift current range to at least center the data
+    {
+      double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason
+      if (mDataScaleType == QCPAxis::stLinear)
+      {
+        newRange.lower = center-mDataRange.size()/2.0;
+        newRange.upper = center+mDataRange.size()/2.0;
+      } else // mScaleType == stLogarithmic
+      {
+        newRange.lower = center/qSqrt(mDataRange.upper/mDataRange.lower);
+        newRange.upper = center*qSqrt(mDataRange.upper/mDataRange.lower);
+      }
+    }
+    setDataRange(newRange);
+  }
+}
+
+/* inherits documentation from base class */
+void QCPColorScale::update(UpdatePhase phase)
+{
+  QCPLayoutElement::update(phase);
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  
+  mAxisRect.data()->update(phase);
+  
+  switch (phase)
+  {
+    case upMargins:
+    {
+      if (mType == QCPAxis::atBottom || mType == QCPAxis::atTop)
+      {
+        setMaximumSize(QWIDGETSIZE_MAX, mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()+margins().top()+margins().bottom());
+        setMinimumSize(0,               mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()+margins().top()+margins().bottom());
+      } else
+      {
+        setMaximumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right()+margins().left()+margins().right(), QWIDGETSIZE_MAX);
+        setMinimumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right()+margins().left()+margins().right(), 0);
+      }
+      break;
+    }
+    case upLayout:
+    {
+      mAxisRect.data()->setOuterRect(rect());
+      break;
+    }
+    default: break;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPColorScale::applyDefaultAntialiasingHint(QCPPainter *painter) const
+{
+  painter->setAntialiasing(false);
+}
+
+/* inherits documentation from base class */
+void QCPColorScale::mousePressEvent(QMouseEvent *event)
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  mAxisRect.data()->mousePressEvent(event);
+}
+
+/* inherits documentation from base class */
+void QCPColorScale::mouseMoveEvent(QMouseEvent *event)
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  mAxisRect.data()->mouseMoveEvent(event);
+}
+
+/* inherits documentation from base class */
+void QCPColorScale::mouseReleaseEvent(QMouseEvent *event)
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  mAxisRect.data()->mouseReleaseEvent(event);
+}
+
+/* inherits documentation from base class */
+void QCPColorScale::wheelEvent(QWheelEvent *event)
+{
+  if (!mAxisRect)
+  {
+    qDebug() << Q_FUNC_INFO << "internal axis rect was deleted";
+    return;
+  }
+  mAxisRect.data()->wheelEvent(event);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPColorScaleAxisRectPrivate
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPColorScaleAxisRectPrivate
+
+  \internal
+  \brief An axis rect subclass for use in a QCPColorScale
+  
+  This is a private class and not part of the public QCustomPlot interface.
+  
+  It provides the axis rect functionality for the QCPColorScale class.
+*/
+
+
+/*!
+  Creates a new instance, as a child of \a parentColorScale.
+*/
+QCPColorScaleAxisRectPrivate::QCPColorScaleAxisRectPrivate(QCPColorScale *parentColorScale) :
+  QCPAxisRect(parentColorScale->parentPlot(), true),
+  mParentColorScale(parentColorScale),
+  mGradientImageInvalidated(true)
+{
+  setParentLayerable(parentColorScale);
+  setMinimumMargins(QMargins(0, 0, 0, 0));
+  QList<QCPAxis::AxisType> allAxisTypes = QList<QCPAxis::AxisType>() << QCPAxis::atBottom << QCPAxis::atTop << QCPAxis::atLeft << QCPAxis::atRight;
+  foreach (QCPAxis::AxisType type, allAxisTypes)
+  {
+    axis(type)->setVisible(true);
+    axis(type)->grid()->setVisible(false);
+    axis(type)->setPadding(0);
+    connect(axis(type), SIGNAL(selectionChanged(QCPAxis::SelectableParts)), this, SLOT(axisSelectionChanged(QCPAxis::SelectableParts)));
+    connect(axis(type), SIGNAL(selectableChanged(QCPAxis::SelectableParts)), this, SLOT(axisSelectableChanged(QCPAxis::SelectableParts)));
+  }
+
+  connect(axis(QCPAxis::atLeft), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atRight), SLOT(setRange(QCPRange)));
+  connect(axis(QCPAxis::atRight), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atLeft), SLOT(setRange(QCPRange)));
+  connect(axis(QCPAxis::atBottom), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atTop), SLOT(setRange(QCPRange)));
+  connect(axis(QCPAxis::atTop), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atBottom), SLOT(setRange(QCPRange)));
+  connect(axis(QCPAxis::atLeft), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atRight), SLOT(setScaleType(QCPAxis::ScaleType)));
+  connect(axis(QCPAxis::atRight), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atLeft), SLOT(setScaleType(QCPAxis::ScaleType)));
+  connect(axis(QCPAxis::atBottom), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atTop), SLOT(setScaleType(QCPAxis::ScaleType)));
+  connect(axis(QCPAxis::atTop), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atBottom), SLOT(setScaleType(QCPAxis::ScaleType)));
+  
+  // make layer transfers of color scale transfer to axis rect and axes
+  // the axes must be set after axis rect, such that they appear above color gradient drawn by axis rect:
+  connect(parentColorScale, SIGNAL(layerChanged(QCPLayer*)), this, SLOT(setLayer(QCPLayer*)));
+  foreach (QCPAxis::AxisType type, allAxisTypes)
+    connect(parentColorScale, SIGNAL(layerChanged(QCPLayer*)), axis(type), SLOT(setLayer(QCPLayer*)));
+}
+
+/*! \internal
+  Updates the color gradient image if necessary, by calling \ref updateGradientImage, then draws
+  it. Then the axes are drawn by calling the \ref QCPAxisRect::draw base class implementation.
+*/
+void QCPColorScaleAxisRectPrivate::draw(QCPPainter *painter)
+{
+  if (mGradientImageInvalidated)
+    updateGradientImage();
+  
+  bool mirrorHorz = false;
+  bool mirrorVert = false;
+  if (mParentColorScale->mColorAxis)
+  {
+    mirrorHorz = mParentColorScale->mColorAxis.data()->rangeReversed() && (mParentColorScale->type() == QCPAxis::atBottom || mParentColorScale->type() == QCPAxis::atTop);
+    mirrorVert = mParentColorScale->mColorAxis.data()->rangeReversed() && (mParentColorScale->type() == QCPAxis::atLeft || mParentColorScale->type() == QCPAxis::atRight);
+  }
+  
+  painter->drawImage(rect().adjusted(0, -1, 0, -1), mGradientImage.mirrored(mirrorHorz, mirrorVert));
+  QCPAxisRect::draw(painter);
+}
+
+/*! \internal
+
+  Uses the current gradient of the parent \ref QCPColorScale (specified in the constructor) to
+  generate a gradient image. This gradient image will be used in the \ref draw method.
+*/
+void QCPColorScaleAxisRectPrivate::updateGradientImage()
+{
+  if (rect().isEmpty())
+    return;
+  
+  int n = mParentColorScale->mGradient.levelCount();
+  int w, h;
+  QVector<double> data(n);
+  for (int i=0; i<n; ++i)
+    data[i] = i;
+  if (mParentColorScale->mType == QCPAxis::atBottom || mParentColorScale->mType == QCPAxis::atTop)
+  {
+    w = n;
+    h = rect().height();
+    mGradientImage = QImage(w, h, QImage::Format_RGB32);
+    QVector<QRgb*> pixels;
+    for (int y=0; y<h; ++y)
+      pixels.append(reinterpret_cast<QRgb*>(mGradientImage.scanLine(y)));
+    mParentColorScale->mGradient.colorize(data.constData(), QCPRange(0, n-1), pixels.first(), n);
+    for (int y=1; y<h; ++y)
+      memcpy(pixels.at(y), pixels.first(), n*sizeof(QRgb));
+  } else
+  {
+    w = rect().width();
+    h = n;
+    mGradientImage = QImage(w, h, QImage::Format_RGB32);
+    for (int y=0; y<h; ++y)
+    {
+      QRgb *pixels = reinterpret_cast<QRgb*>(mGradientImage.scanLine(y));
+      const QRgb lineColor = mParentColorScale->mGradient.color(data[h-1-y], QCPRange(0, n-1));
+      for (int x=0; x<w; ++x)
+        pixels[x] = lineColor;
+    }
+  }
+  mGradientImageInvalidated = false;
+}
+
+/*! \internal
+
+  This slot is connected to the selectionChanged signals of the four axes in the constructor. It
+  synchronizes the selection state of the axes.
+*/
+void QCPColorScaleAxisRectPrivate::axisSelectionChanged(QCPAxis::SelectableParts selectedParts)
+{
+  // axis bases of four axes shall always (de-)selected synchronously:
+  QList<QCPAxis::AxisType> allAxisTypes = QList<QCPAxis::AxisType>() << QCPAxis::atBottom << QCPAxis::atTop << QCPAxis::atLeft << QCPAxis::atRight;
+  foreach (QCPAxis::AxisType type, allAxisTypes)
+  {
+    if (QCPAxis *senderAxis = qobject_cast<QCPAxis*>(sender()))
+      if (senderAxis->axisType() == type)
+        continue;
+    
+    if (axis(type)->selectableParts().testFlag(QCPAxis::spAxis))
+    {
+      if (selectedParts.testFlag(QCPAxis::spAxis))
+        axis(type)->setSelectedParts(axis(type)->selectedParts() | QCPAxis::spAxis);
+      else
+        axis(type)->setSelectedParts(axis(type)->selectedParts() & ~QCPAxis::spAxis);
+    }
+  }
+}
+
+/*! \internal
+
+  This slot is connected to the selectableChanged signals of the four axes in the constructor. It
+  synchronizes the selectability of the axes.
+*/
+void QCPColorScaleAxisRectPrivate::axisSelectableChanged(QCPAxis::SelectableParts selectableParts)
+{
+  // synchronize axis base selectability:
+  QList<QCPAxis::AxisType> allAxisTypes = QList<QCPAxis::AxisType>() << QCPAxis::atBottom << QCPAxis::atTop << QCPAxis::atLeft << QCPAxis::atRight;
+  foreach (QCPAxis::AxisType type, allAxisTypes)
+  {
+    if (QCPAxis *senderAxis = qobject_cast<QCPAxis*>(sender()))
+      if (senderAxis->axisType() == type)
+        continue;
+    
+    if (axis(type)->selectableParts().testFlag(QCPAxis::spAxis))
+    {
+      if (selectableParts.testFlag(QCPAxis::spAxis))
+        axis(type)->setSelectableParts(axis(type)->selectableParts() | QCPAxis::spAxis);
+      else
+        axis(type)->setSelectableParts(axis(type)->selectableParts() & ~QCPAxis::spAxis);
+    }
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPData
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPData
+  \brief Holds the data of one single data point for QCPGraph.
+  
+  The container for storing multiple data points is \ref QCPDataMap.
+  
+  The stored data is:
+  \li \a key: coordinate on the key axis of this data point
+  \li \a value: coordinate on the value axis of this data point
+  \li \a keyErrorMinus: negative error in the key dimension (for error bars)
+  \li \a keyErrorPlus: positive error in the key dimension (for error bars)
+  \li \a valueErrorMinus: negative error in the value dimension (for error bars)
+  \li \a valueErrorPlus: positive error in the value dimension (for error bars)
+  
+  \see QCPDataMap
+*/
+
+/*!
+  Constructs a data point with key, value and all errors set to zero.
+*/
+QCPData::QCPData() :
+  key(0),
+  value(0),
+  keyErrorPlus(0),
+  keyErrorMinus(0),
+  valueErrorPlus(0),
+  valueErrorMinus(0)
+{
+}
+
+/*!
+  Constructs a data point with the specified \a key and \a value. All errors are set to zero.
+*/
+QCPData::QCPData(double key, double value) :
+  key(key),
+  value(value),
+  keyErrorPlus(0),
+  keyErrorMinus(0),
+  valueErrorPlus(0),
+  valueErrorMinus(0)
+{
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPGraph
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPGraph
+  \brief A plottable representing a graph in a plot.
+
+  \image html QCPGraph.png
+  
+  Usually you create new graphs by calling QCustomPlot::addGraph. The resulting instance can be
+  accessed via QCustomPlot::graph.
+
+  To plot data, assign it with the \ref setData or \ref addData functions. Alternatively, you can
+  also access and modify the graph's data via the \ref data method, which returns a pointer to the
+  internal \ref QCPDataMap.
+  
+  Graphs are used to display single-valued data. Single-valued means that there should only be one
+  data point per unique key coordinate. In other words, the graph can't have \a loops. If you do
+  want to plot non-single-valued curves, rather use the QCPCurve plottable.
+  
+  Gaps in the graph line can be created by adding data points with NaN as value
+  (<tt>qQNaN()</tt> or <tt>std::numeric_limits<double>::quiet_NaN()</tt>) in between the two data points that shall be
+  separated.
+  
+  \section appearance Changing the appearance
+  
+  The appearance of the graph is mainly determined by the line style, scatter style, brush and pen
+  of the graph (\ref setLineStyle, \ref setScatterStyle, \ref setBrush, \ref setPen).
+  
+  \subsection filling Filling under or between graphs
+  
+  QCPGraph knows two types of fills: Normal graph fills towards the zero-value-line parallel to
+  the key axis of the graph, and fills between two graphs, called channel fills. To enable a fill,
+  just set a brush with \ref setBrush which is neither Qt::NoBrush nor fully transparent.
+  
+  By default, a normal fill towards the zero-value-line will be drawn. To set up a channel fill
+  between this graph and another one, call \ref setChannelFillGraph with the other graph as
+  parameter.
+
+  \see QCustomPlot::addGraph, QCustomPlot::graph
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn QCPDataMap *QCPGraph::data() const
+  
+  Returns a pointer to the internal data storage of type \ref QCPDataMap. You may use it to
+  directly manipulate the data, which may be more convenient and faster than using the regular \ref
+  setData or \ref addData methods, in certain situations.
+*/
+
+/* end of documentation of inline functions */
+
+/*!
+  Constructs a graph which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value
+  axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have
+  the same orientation. If either of these restrictions is violated, a corresponding message is
+  printed to the debug output (qDebug), the construction is not aborted, though.
+  
+  The constructed QCPGraph can be added to the plot with QCustomPlot::addPlottable, QCustomPlot
+  then takes ownership of the graph.
+  
+  To directly create a graph inside a plot, you can also use the simpler QCustomPlot::addGraph function.
+*/
+QCPGraph::QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) :
+  QCPAbstractPlottable(keyAxis, valueAxis)
+{
+  mData = new QCPDataMap;
+  
+  setPen(QPen(Qt::blue, 0));
+  setErrorPen(QPen(Qt::black));
+  setBrush(Qt::NoBrush);
+  setSelectedPen(QPen(QColor(80, 80, 255), 2.5));
+  setSelectedBrush(Qt::NoBrush);
+  
+  setLineStyle(lsLine);
+  setErrorType(etNone);
+  setErrorBarSize(6);
+  setErrorBarSkipSymbol(true);
+  setChannelFillGraph(0);
+  setAdaptiveSampling(true);
+}
+
+QCPGraph::~QCPGraph()
+{
+  delete mData;
+}
+
+/*!
+  Replaces the current data with the provided \a data.
+  
+  If \a copy is set to true, data points in \a data will only be copied. if false, the graph
+  takes ownership of the passed data and replaces the internal data pointer with it. This is
+  significantly faster than copying for large datasets.
+  
+  Alternatively, you can also access and modify the graph's data via the \ref data method, which
+  returns a pointer to the internal \ref QCPDataMap.
+*/
+void QCPGraph::setData(QCPDataMap *data, bool copy)
+{
+  if (mData == data)
+  {
+    qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast<quintptr>(data);
+    return;
+  }
+  if (copy)
+  {
+    *mData = *data;
+  } else
+  {
+    delete mData;
+    mData = data;
+  }
+}
+
+/*! \overload
+  
+  Replaces the current data with the provided points in \a key and \a value pairs. The provided
+  vectors should have equal length. Else, the number of added points will be the size of the
+  smallest vector.
+*/
+void QCPGraph::setData(const QVector<double> &key, const QVector<double> &value)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    mData->insertMulti(newData.key, newData);
+  }
+}
+
+/*!
+  Replaces the current data with the provided points in \a key and \a value pairs. Additionally the
+  symmetrical value error of the data points are set to the values in \a valueError.
+  For error bars to show appropriately, see \ref setErrorType.
+  The provided vectors should have equal length. Else, the number of added points will be the size of the
+  smallest vector.
+  
+  For asymmetrical errors (plus different from minus), see the overloaded version of this function.
+*/
+void QCPGraph::setDataValueError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &valueError)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  n = qMin(n, valueError.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    newData.valueErrorMinus = valueError[i];
+    newData.valueErrorPlus = valueError[i];
+    mData->insertMulti(key[i], newData);
+  }
+}
+
+/*!
+  \overload
+  Replaces the current data with the provided points in \a key and \a value pairs. Additionally the
+  negative value error of the data points are set to the values in \a valueErrorMinus, the positive
+  value error to \a valueErrorPlus.
+  For error bars to show appropriately, see \ref setErrorType.
+  The provided vectors should have equal length. Else, the number of added points will be the size of the
+  smallest vector.
+*/
+void QCPGraph::setDataValueError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &valueErrorMinus, const QVector<double> &valueErrorPlus)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  n = qMin(n, valueErrorMinus.size());
+  n = qMin(n, valueErrorPlus.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    newData.valueErrorMinus = valueErrorMinus[i];
+    newData.valueErrorPlus = valueErrorPlus[i];
+    mData->insertMulti(key[i], newData);
+  }
+}
+
+/*!
+  Replaces the current data with the provided points in \a key and \a value pairs. Additionally the
+  symmetrical key error of the data points are set to the values in \a keyError.
+  For error bars to show appropriately, see \ref setErrorType.
+  The provided vectors should have equal length. Else, the number of added points will be the size of the
+  smallest vector.
+  
+  For asymmetrical errors (plus different from minus), see the overloaded version of this function.
+*/
+void QCPGraph::setDataKeyError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyError)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  n = qMin(n, keyError.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    newData.keyErrorMinus = keyError[i];
+    newData.keyErrorPlus = keyError[i];
+    mData->insertMulti(key[i], newData);
+  }
+}
+
+/*!
+  \overload
+  Replaces the current data with the provided points in \a key and \a value pairs. Additionally the
+  negative key error of the data points are set to the values in \a keyErrorMinus, the positive
+  key error to \a keyErrorPlus.
+  For error bars to show appropriately, see \ref setErrorType.
+  The provided vectors should have equal length. Else, the number of added points will be the size of the
+  smallest vector.
+*/
+void QCPGraph::setDataKeyError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyErrorMinus, const QVector<double> &keyErrorPlus)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  n = qMin(n, keyErrorMinus.size());
+  n = qMin(n, keyErrorPlus.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    newData.keyErrorMinus = keyErrorMinus[i];
+    newData.keyErrorPlus = keyErrorPlus[i];
+    mData->insertMulti(key[i], newData);
+  }
+}
+
+/*!
+  Replaces the current data with the provided points in \a key and \a value pairs. Additionally the
+  symmetrical key and value errors of the data points are set to the values in \a keyError and \a valueError.
+  For error bars to show appropriately, see \ref setErrorType.
+  The provided vectors should have equal length. Else, the number of added points will be the size of the
+  smallest vector.
+  
+  For asymmetrical errors (plus different from minus), see the overloaded version of this function.
+*/
+void QCPGraph::setDataBothError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyError, const QVector<double> &valueError)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  n = qMin(n, valueError.size());
+  n = qMin(n, keyError.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    newData.keyErrorMinus = keyError[i];
+    newData.keyErrorPlus = keyError[i];
+    newData.valueErrorMinus = valueError[i];
+    newData.valueErrorPlus = valueError[i];
+    mData->insertMulti(key[i], newData);
+  }
+}
+
+/*!
+  \overload
+  Replaces the current data with the provided points in \a key and \a value pairs. Additionally the
+  negative key and value errors of the data points are set to the values in \a keyErrorMinus and \a valueErrorMinus. The positive
+  key and value errors are set to the values in \a keyErrorPlus \a valueErrorPlus.
+  For error bars to show appropriately, see \ref setErrorType.
+  The provided vectors should have equal length. Else, the number of added points will be the size of the
+  smallest vector.
+*/
+void QCPGraph::setDataBothError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyErrorMinus, const QVector<double> &keyErrorPlus, const QVector<double> &valueErrorMinus, const QVector<double> &valueErrorPlus)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  n = qMin(n, valueErrorMinus.size());
+  n = qMin(n, valueErrorPlus.size());
+  n = qMin(n, keyErrorMinus.size());
+  n = qMin(n, keyErrorPlus.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    newData.keyErrorMinus = keyErrorMinus[i];
+    newData.keyErrorPlus = keyErrorPlus[i];
+    newData.valueErrorMinus = valueErrorMinus[i];
+    newData.valueErrorPlus = valueErrorPlus[i];
+    mData->insertMulti(key[i], newData);
+  }
+}
+
+
+/*!
+  Sets how the single data points are connected in the plot. For scatter-only plots, set \a ls to
+  \ref lsNone and \ref setScatterStyle to the desired scatter style.
+  
+  \see setScatterStyle
+*/
+void QCPGraph::setLineStyle(LineStyle ls)
+{
+  mLineStyle = ls;
+}
+
+/*!
+  Sets the visual appearance of single data points in the plot. If set to \ref QCPScatterStyle::ssNone, no scatter points
+  are drawn (e.g. for line-only-plots with appropriate line style).
+  
+  \see QCPScatterStyle, setLineStyle
+*/
+void QCPGraph::setScatterStyle(const QCPScatterStyle &style)
+{
+  mScatterStyle = style;
+}
+
+/*!
+  Sets which kind of error bars (Key Error, Value Error or both) should be drawn on each data
+  point. If you set \a errorType to something other than \ref etNone, make sure to actually pass
+  error data via the specific setData functions along with the data points (e.g. \ref
+  setDataValueError, \ref setDataKeyError, \ref setDataBothError).
+
+  \see ErrorType
+*/
+void QCPGraph::setErrorType(ErrorType errorType)
+{
+  mErrorType = errorType;
+}
+
+/*!
+  Sets the pen with which the error bars will be drawn.
+  \see setErrorBarSize, setErrorType
+*/
+void QCPGraph::setErrorPen(const QPen &pen)
+{
+  mErrorPen = pen;
+}
+
+/*!
+  Sets the width of the handles at both ends of an error bar in pixels.
+*/
+void QCPGraph::setErrorBarSize(double size)
+{
+  mErrorBarSize = size;
+}
+
+/*!
+  If \a enabled is set to true, the error bar will not be drawn as a solid line under the scatter symbol but
+  leave some free space around the symbol.
+  
+  This feature uses the current scatter size (\ref QCPScatterStyle::setSize) to determine the size
+  of the area to leave blank. So when drawing Pixmaps as scatter points (\ref
+  QCPScatterStyle::ssPixmap), the scatter size must be set manually to a value corresponding to the
+  size of the Pixmap, if the error bars should leave gaps to its boundaries.
+  
+  \ref setErrorType, setErrorBarSize, setScatterStyle
+*/
+void QCPGraph::setErrorBarSkipSymbol(bool enabled)
+{
+  mErrorBarSkipSymbol = enabled;
+}
+
+/*!
+  Sets the target graph for filling the area between this graph and \a targetGraph with the current
+  brush (\ref setBrush).
+  
+  When \a targetGraph is set to 0, a normal graph fill to the zero-value-line will be shown. To
+  disable any filling, set the brush to Qt::NoBrush.
+
+  \see setBrush
+*/
+void QCPGraph::setChannelFillGraph(QCPGraph *targetGraph)
+{
+  // prevent setting channel target to this graph itself:
+  if (targetGraph == this)
+  {
+    qDebug() << Q_FUNC_INFO << "targetGraph is this graph itself";
+    mChannelFillGraph = 0;
+    return;
+  }
+  // prevent setting channel target to a graph not in the plot:
+  if (targetGraph && targetGraph->mParentPlot != mParentPlot)
+  {
+    qDebug() << Q_FUNC_INFO << "targetGraph not in same plot";
+    mChannelFillGraph = 0;
+    return;
+  }
+  
+  mChannelFillGraph = targetGraph;
+}
+
+/*!
+  Sets whether adaptive sampling shall be used when plotting this graph. QCustomPlot's adaptive
+  sampling technique can drastically improve the replot performance for graphs with a larger number
+  of points (e.g. above 10,000), without notably changing the appearance of the graph.
+  
+  By default, adaptive sampling is enabled. Even if enabled, QCustomPlot decides whether adaptive
+  sampling shall actually be used on a per-graph basis. So leaving adaptive sampling enabled has no
+  disadvantage in almost all cases.
+  
+  \image html adaptive-sampling-line.png "A line plot of 500,000 points without and with adaptive sampling"
+  
+  As can be seen, line plots experience no visual degradation from adaptive sampling. Outliers are
+  reproduced reliably, as well as the overall shape of the data set. The replot time reduces
+  dramatically though. This allows QCustomPlot to display large amounts of data in realtime.
+  
+  \image html adaptive-sampling-scatter.png "A scatter plot of 100,000 points without and with adaptive sampling"
+  
+  Care must be taken when using high-density scatter plots in combination with adaptive sampling.
+  The adaptive sampling algorithm treats scatter plots more carefully than line plots which still
+  gives a significant reduction of replot times, but not quite as much as for line plots. This is
+  because scatter plots inherently need more data points to be preserved in order to still resemble
+  the original, non-adaptive-sampling plot. As shown above, the results still aren't quite
+  identical, as banding occurs for the outer data points. This is in fact intentional, such that
+  the boundaries of the data cloud stay visible to the viewer. How strong the banding appears,
+  depends on the point density, i.e. the number of points in the plot.
+  
+  For some situations with scatter plots it might thus be desirable to manually turn adaptive
+  sampling off. For example, when saving the plot to disk. This can be achieved by setting \a
+  enabled to false before issuing a command like \ref QCustomPlot::savePng, and setting \a enabled
+  back to true afterwards.
+*/
+void QCPGraph::setAdaptiveSampling(bool enabled)
+{
+  mAdaptiveSampling = enabled;
+}
+
+/*!
+  Adds the provided data points in \a dataMap to the current data.
+  
+  Alternatively, you can also access and modify the graph's data via the \ref data method, which
+  returns a pointer to the internal \ref QCPDataMap.
+  
+  \see removeData
+*/
+void QCPGraph::addData(const QCPDataMap &dataMap)
+{
+  mData->unite(dataMap);
+}
+
+/*! \overload
+  Adds the provided single data point in \a data to the current data.
+  
+  Alternatively, you can also access and modify the graph's data via the \ref data method, which
+  returns a pointer to the internal \ref QCPDataMap.
+  
+  \see removeData
+*/
+void QCPGraph::addData(const QCPData &data)
+{
+  mData->insertMulti(data.key, data);
+}
+
+/*! \overload
+  Adds the provided single data point as \a key and \a value pair to the current data.
+  
+  Alternatively, you can also access and modify the graph's data via the \ref data method, which
+  returns a pointer to the internal \ref QCPDataMap.
+  
+  \see removeData
+*/
+void QCPGraph::addData(double key, double value)
+{
+  QCPData newData;
+  newData.key = key;
+  newData.value = value;
+  mData->insertMulti(newData.key, newData);
+}
+
+/*! \overload
+  Adds the provided data points as \a key and \a value pairs to the current data.
+  
+  Alternatively, you can also access and modify the graph's data via the \ref data method, which
+  returns a pointer to the internal \ref QCPDataMap.
+  
+  \see removeData
+*/
+void QCPGraph::addData(const QVector<double> &keys, const QVector<double> &values)
+{
+  int n = qMin(keys.size(), values.size());
+  QCPData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = keys[i];
+    newData.value = values[i];
+    mData->insertMulti(newData.key, newData);
+  }
+}
+
+/*!
+  Removes all data points with keys smaller than \a key.
+  \see addData, clearData
+*/
+void QCPGraph::removeDataBefore(double key)
+{
+  QCPDataMap::iterator it = mData->begin();
+  while (it != mData->end() && it.key() < key)
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with keys greater than \a key.
+  \see addData, clearData
+*/
+void QCPGraph::removeDataAfter(double key)
+{
+  if (mData->isEmpty()) return;
+  QCPDataMap::iterator it = mData->upperBound(key);
+  while (it != mData->end())
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with keys between \a fromKey and \a toKey.
+  if \a fromKey is greater or equal to \a toKey, the function does nothing. To remove
+  a single data point with known key, use \ref removeData(double key).
+  
+  \see addData, clearData
+*/
+void QCPGraph::removeData(double fromKey, double toKey)
+{
+  if (fromKey >= toKey || mData->isEmpty()) return;
+  QCPDataMap::iterator it = mData->upperBound(fromKey);
+  QCPDataMap::iterator itEnd = mData->upperBound(toKey);
+  while (it != itEnd)
+    it = mData->erase(it);
+}
+
+/*! \overload
+  
+  Removes a single data point at \a key. If the position is not known with absolute precision,
+  consider using \ref removeData(double fromKey, double toKey) with a small fuzziness interval around
+  the suspected position, depeding on the precision with which the key is known.
+
+  \see addData, clearData
+*/
+void QCPGraph::removeData(double key)
+{
+  mData->remove(key);
+}
+
+/*!
+  Removes all data points.
+  \see removeData, removeDataAfter, removeDataBefore
+*/
+void QCPGraph::clearData()
+{
+  mData->clear();
+}
+
+/* inherits documentation from base class */
+double QCPGraph::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if ((onlySelectable && !mSelectable) || mData->isEmpty())
+    return -1;
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+  
+  if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint()))
+    return pointDistance(pos);
+  else
+    return -1;
+}
+
+/*! \overload
+  
+  Allows to define whether error bars are taken into consideration when determining the new axis
+  range.
+  
+  \see rescaleKeyAxis, rescaleValueAxis, QCPAbstractPlottable::rescaleAxes, QCustomPlot::rescaleAxes
+*/
+void QCPGraph::rescaleAxes(bool onlyEnlarge, bool includeErrorBars) const
+{
+  rescaleKeyAxis(onlyEnlarge, includeErrorBars);
+  rescaleValueAxis(onlyEnlarge, includeErrorBars);
+}
+
+/*! \overload
+  
+  Allows to define whether error bars (of kind \ref QCPGraph::etKey) are taken into consideration
+  when determining the new axis range.
+  
+  \see rescaleAxes, QCPAbstractPlottable::rescaleKeyAxis
+*/
+void QCPGraph::rescaleKeyAxis(bool onlyEnlarge, bool includeErrorBars) const
+{
+  // this code is a copy of QCPAbstractPlottable::rescaleKeyAxis with the only change
+  // that getKeyRange is passed the includeErrorBars value.
+  if (mData->isEmpty()) return;
+  
+  QCPAxis *keyAxis = mKeyAxis.data();
+  if (!keyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; }
+
+  SignDomain signDomain = sdBoth;
+  if (keyAxis->scaleType() == QCPAxis::stLogarithmic)
+    signDomain = (keyAxis->range().upper < 0 ? sdNegative : sdPositive);
+  
+  bool foundRange;
+  QCPRange newRange = getKeyRange(foundRange, signDomain, includeErrorBars);
+  
+  if (foundRange)
+  {
+    if (onlyEnlarge)
+    {
+      if (keyAxis->range().lower < newRange.lower)
+        newRange.lower = keyAxis->range().lower;
+      if (keyAxis->range().upper > newRange.upper)
+        newRange.upper = keyAxis->range().upper;
+    }
+    keyAxis->setRange(newRange);
+  }
+}
+
+/*! \overload
+  
+  Allows to define whether error bars (of kind \ref QCPGraph::etValue) are taken into consideration
+  when determining the new axis range.
+  
+  \see rescaleAxes, QCPAbstractPlottable::rescaleValueAxis
+*/
+void QCPGraph::rescaleValueAxis(bool onlyEnlarge, bool includeErrorBars) const
+{
+  // this code is a copy of QCPAbstractPlottable::rescaleValueAxis with the only change
+  // is that getValueRange is passed the includeErrorBars value.
+  if (mData->isEmpty()) return;
+  
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!valueAxis) { qDebug() << Q_FUNC_INFO << "invalid value axis"; return; }
+
+  SignDomain signDomain = sdBoth;
+  if (valueAxis->scaleType() == QCPAxis::stLogarithmic)
+    signDomain = (valueAxis->range().upper < 0 ? sdNegative : sdPositive);
+  
+  bool foundRange;
+  QCPRange newRange = getValueRange(foundRange, signDomain, includeErrorBars);
+  
+  if (foundRange)
+  {
+    if (onlyEnlarge)
+    {
+      if (valueAxis->range().lower < newRange.lower)
+        newRange.lower = valueAxis->range().lower;
+      if (valueAxis->range().upper > newRange.upper)
+        newRange.upper = valueAxis->range().upper;
+    }
+    valueAxis->setRange(newRange);
+  }
+}
+
+/* inherits documentation from base class */
+void QCPGraph::draw(QCPPainter *painter)
+{
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  if (mKeyAxis.data()->range().size() <= 0 || mData->isEmpty()) return;
+  if (mLineStyle == lsNone && mScatterStyle.isNone()) return;
+  
+  // allocate line and (if necessary) point vectors:
+  QVector<QPointF> *lineData = new QVector<QPointF>;
+  QVector<QCPData> *scatterData = 0;
+  if (!mScatterStyle.isNone())
+    scatterData = new QVector<QCPData>;
+  
+  // fill vectors with data appropriate to plot style:
+  getPlotData(lineData, scatterData);
+  
+  // check data validity if flag set:
+#ifdef QCUSTOMPLOT_CHECK_DATA
+  QCPDataMap::const_iterator it;
+  for (it = mData->constBegin(); it != mData->constEnd(); ++it)
+  {
+    if (QCP::isInvalidData(it.value().key, it.value().value) ||
+        QCP::isInvalidData(it.value().keyErrorPlus, it.value().keyErrorMinus) ||
+        QCP::isInvalidData(it.value().valueErrorPlus, it.value().valueErrorPlus))
+      qDebug() << Q_FUNC_INFO << "Data point at" << it.key() << "invalid." << "Plottable name:" << name();
+  }
+#endif
+
+  // draw fill of graph:
+  if (mLineStyle != lsNone)
+    drawFill(painter, lineData);
+  
+  // draw line:
+  if (mLineStyle == lsImpulse)
+    drawImpulsePlot(painter, lineData);
+  else if (mLineStyle != lsNone)
+    drawLinePlot(painter, lineData); // also step plots can be drawn as a line plot
+  
+  // draw scatters:
+  if (scatterData)
+    drawScatterPlot(painter, scatterData);
+  
+  // free allocated line and point vectors:
+  delete lineData;
+  if (scatterData)
+    delete scatterData;
+}
+
+/* inherits documentation from base class */
+void QCPGraph::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const
+{
+  // draw fill:
+  if (mBrush.style() != Qt::NoBrush)
+  {
+    applyFillAntialiasingHint(painter);
+    painter->fillRect(QRectF(rect.left(), rect.top()+rect.height()/2.0, rect.width(), rect.height()/3.0), mBrush);
+  }
+  // draw line vertically centered:
+  if (mLineStyle != lsNone)
+  {
+    applyDefaultAntialiasingHint(painter);
+    painter->setPen(mPen);
+    painter->drawLine(QLineF(rect.left(), rect.top()+rect.height()/2.0, rect.right()+5, rect.top()+rect.height()/2.0)); // +5 on x2 else last segment is missing from dashed/dotted pens
+  }
+  // draw scatter symbol:
+  if (!mScatterStyle.isNone())
+  {
+    applyScattersAntialiasingHint(painter);
+    // scale scatter pixmap if it's too large to fit in legend icon rect:
+    if (mScatterStyle.shape() == QCPScatterStyle::ssPixmap && (mScatterStyle.pixmap().size().width() > rect.width() || mScatterStyle.pixmap().size().height() > rect.height()))
+    {
+      QCPScatterStyle scaledStyle(mScatterStyle);
+      scaledStyle.setPixmap(scaledStyle.pixmap().scaled(rect.size().toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
+      scaledStyle.applyTo(painter, mPen);
+      scaledStyle.drawShape(painter, QRectF(rect).center());
+    } else
+    {
+      mScatterStyle.applyTo(painter, mPen);
+      mScatterStyle.drawShape(painter, QRectF(rect).center());
+    }
+  }
+}
+
+/*! \internal
+
+  This function branches out to the line style specific "get(...)PlotData" functions, according to
+  the line style of the graph.
+  
+  \a lineData will be filled with raw points that will be drawn with the according draw functions,
+  e.g. \ref drawLinePlot and \ref drawImpulsePlot. These aren't necessarily the original data
+  points, since for step plots for example, additional points are needed for drawing lines that
+  make up steps. If the line style of the graph is \ref lsNone, the \a lineData vector will be left
+  untouched.
+  
+  \a scatterData will be filled with the original data points so \ref drawScatterPlot can draw the
+  scatter symbols accordingly. If no scatters need to be drawn, i.e. the scatter style's shape is
+  \ref QCPScatterStyle::ssNone, pass 0 as \a scatterData, and this step will be skipped.
+  
+  \see getScatterPlotData, getLinePlotData, getStepLeftPlotData, getStepRightPlotData,
+  getStepCenterPlotData, getImpulsePlotData
+*/
+void QCPGraph::getPlotData(QVector<QPointF> *lineData, QVector<QCPData> *scatterData) const
+{
+  switch(mLineStyle)
+  {
+    case lsNone: getScatterPlotData(scatterData); break;
+    case lsLine: getLinePlotData(lineData, scatterData); break;
+    case lsStepLeft: getStepLeftPlotData(lineData, scatterData); break;
+    case lsStepRight: getStepRightPlotData(lineData, scatterData); break;
+    case lsStepCenter: getStepCenterPlotData(lineData, scatterData); break;
+    case lsImpulse: getImpulsePlotData(lineData, scatterData); break;
+  }
+}
+
+/*! \internal
+  
+  If line style is \ref lsNone and the scatter style's shape is not \ref QCPScatterStyle::ssNone,
+  this function serves at providing the visible data points in \a scatterData, so the \ref
+  drawScatterPlot function can draw the scatter points accordingly.
+  
+  If line style is not \ref lsNone, this function is not called and the data for the scatter points
+  are (if needed) calculated inside the corresponding other "get(...)PlotData" functions.
+  
+  \see drawScatterPlot
+*/
+void QCPGraph::getScatterPlotData(QVector<QCPData> *scatterData) const
+{
+  getPreparedData(0, scatterData);
+}
+
+/*! \internal
+  
+  Places the raw data points needed for a normal linearly connected graph in \a linePixelData.
+
+  As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter)
+  points that are visible for drawing scatter points, if necessary. If drawing scatter points is
+  disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a
+  scatterData, and the function will skip filling the vector.
+  
+  \see drawLinePlot
+*/
+void QCPGraph::getLinePlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as linePixelData"; return; }
+  
+  QVector<QCPData> lineData;
+  getPreparedData(&lineData, scatterData);
+  linePixelData->reserve(lineData.size()+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill
+  linePixelData->resize(lineData.size());
+  
+  // transform lineData points to pixels:
+  if (keyAxis->orientation() == Qt::Vertical)
+  {
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      (*linePixelData)[i].setX(valueAxis->coordToPixel(lineData.at(i).value));
+      (*linePixelData)[i].setY(keyAxis->coordToPixel(lineData.at(i).key));
+    }
+  } else // key axis is horizontal
+  {
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      (*linePixelData)[i].setX(keyAxis->coordToPixel(lineData.at(i).key));
+      (*linePixelData)[i].setY(valueAxis->coordToPixel(lineData.at(i).value));
+    }
+  }
+}
+
+/*!
+  \internal
+  Places the raw data points needed for a step plot with left oriented steps in \a lineData.
+
+  As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter)
+  points that are visible for drawing scatter points, if necessary. If drawing scatter points is
+  disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a
+  scatterData, and the function will skip filling the vector.
+  
+  \see drawLinePlot
+*/
+void QCPGraph::getStepLeftPlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as lineData"; return; }
+  
+  QVector<QCPData> lineData;
+  getPreparedData(&lineData, scatterData);
+  linePixelData->reserve(lineData.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill
+  linePixelData->resize(lineData.size()*2);
+  
+  // calculate steps from lineData and transform to pixel coordinates:
+  if (keyAxis->orientation() == Qt::Vertical)
+  {
+    double lastValue = valueAxis->coordToPixel(lineData.first().value);
+    double key;
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      key = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+0].setX(lastValue);
+      (*linePixelData)[i*2+0].setY(key);
+      lastValue = valueAxis->coordToPixel(lineData.at(i).value);
+      (*linePixelData)[i*2+1].setX(lastValue);
+      (*linePixelData)[i*2+1].setY(key);
+    }
+  } else // key axis is horizontal
+  {
+    double lastValue = valueAxis->coordToPixel(lineData.first().value);
+    double key;
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      key = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+0].setX(key);
+      (*linePixelData)[i*2+0].setY(lastValue);
+      lastValue = valueAxis->coordToPixel(lineData.at(i).value);
+      (*linePixelData)[i*2+1].setX(key);
+      (*linePixelData)[i*2+1].setY(lastValue);
+    }
+  }
+}
+
+/*!
+  \internal
+  Places the raw data points needed for a step plot with right oriented steps in \a lineData.
+
+  As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter)
+  points that are visible for drawing scatter points, if necessary. If drawing scatter points is
+  disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a
+  scatterData, and the function will skip filling the vector.
+  
+  \see drawLinePlot
+*/
+void QCPGraph::getStepRightPlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as lineData"; return; }
+  
+  QVector<QCPData> lineData;
+  getPreparedData(&lineData, scatterData);
+  linePixelData->reserve(lineData.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill
+  linePixelData->resize(lineData.size()*2);
+  
+  // calculate steps from lineData and transform to pixel coordinates:
+  if (keyAxis->orientation() == Qt::Vertical)
+  {
+    double lastKey = keyAxis->coordToPixel(lineData.first().key);
+    double value;
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      value = valueAxis->coordToPixel(lineData.at(i).value);
+      (*linePixelData)[i*2+0].setX(value);
+      (*linePixelData)[i*2+0].setY(lastKey);
+      lastKey = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+1].setX(value);
+      (*linePixelData)[i*2+1].setY(lastKey);
+    }
+  } else // key axis is horizontal
+  {
+    double lastKey = keyAxis->coordToPixel(lineData.first().key);
+    double value;
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      value = valueAxis->coordToPixel(lineData.at(i).value);
+      (*linePixelData)[i*2+0].setX(lastKey);
+      (*linePixelData)[i*2+0].setY(value);
+      lastKey = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+1].setX(lastKey);
+      (*linePixelData)[i*2+1].setY(value);
+    }
+  }
+}
+
+/*!
+  \internal
+  Places the raw data points needed for a step plot with centered steps in \a lineData.
+
+  As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter)
+  points that are visible for drawing scatter points, if necessary. If drawing scatter points is
+  disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a
+  scatterData, and the function will skip filling the vector.
+  
+  \see drawLinePlot
+*/
+void QCPGraph::getStepCenterPlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as lineData"; return; }
+  
+  QVector<QCPData> lineData;
+  getPreparedData(&lineData, scatterData);
+  linePixelData->reserve(lineData.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill
+  linePixelData->resize(lineData.size()*2);
+  // calculate steps from lineData and transform to pixel coordinates:
+  if (keyAxis->orientation() == Qt::Vertical)
+  {
+    double lastKey = keyAxis->coordToPixel(lineData.first().key);
+    double lastValue = valueAxis->coordToPixel(lineData.first().value);
+    double key;
+    (*linePixelData)[0].setX(lastValue);
+    (*linePixelData)[0].setY(lastKey);
+    for (int i=1; i<lineData.size(); ++i)
+    {
+      key = (keyAxis->coordToPixel(lineData.at(i).key)+lastKey)*0.5;
+      (*linePixelData)[i*2-1].setX(lastValue);
+      (*linePixelData)[i*2-1].setY(key);
+      lastValue = valueAxis->coordToPixel(lineData.at(i).value);
+      lastKey = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+0].setX(lastValue);
+      (*linePixelData)[i*2+0].setY(key);
+    }
+    (*linePixelData)[lineData.size()*2-1].setX(lastValue);
+    (*linePixelData)[lineData.size()*2-1].setY(lastKey);
+  } else // key axis is horizontal
+  {
+    double lastKey = keyAxis->coordToPixel(lineData.first().key);
+    double lastValue = valueAxis->coordToPixel(lineData.first().value);
+    double key;
+    (*linePixelData)[0].setX(lastKey);
+    (*linePixelData)[0].setY(lastValue);
+    for (int i=1; i<lineData.size(); ++i)
+    {
+      key = (keyAxis->coordToPixel(lineData.at(i).key)+lastKey)*0.5;
+      (*linePixelData)[i*2-1].setX(key);
+      (*linePixelData)[i*2-1].setY(lastValue);
+      lastValue = valueAxis->coordToPixel(lineData.at(i).value);
+      lastKey = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+0].setX(key);
+      (*linePixelData)[i*2+0].setY(lastValue);
+    }
+    (*linePixelData)[lineData.size()*2-1].setX(lastKey);
+    (*linePixelData)[lineData.size()*2-1].setY(lastValue);
+  }
+
+}
+
+/*!
+  \internal
+  Places the raw data points needed for an impulse plot in \a lineData.
+
+  As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter)
+  points that are visible for drawing scatter points, if necessary. If drawing scatter points is
+  disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a
+  scatterData, and the function will skip filling the vector.
+  
+  \see drawImpulsePlot
+*/
+void QCPGraph::getImpulsePlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as linePixelData"; return; }
+  
+  QVector<QCPData> lineData;
+  getPreparedData(&lineData, scatterData);
+  linePixelData->resize(lineData.size()*2); // no need to reserve 2 extra points because impulse plot has no fill
+  
+  // transform lineData points to pixels:
+  if (keyAxis->orientation() == Qt::Vertical)
+  {
+    double zeroPointX = valueAxis->coordToPixel(0);
+    double key;
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      key = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+0].setX(zeroPointX);
+      (*linePixelData)[i*2+0].setY(key);
+      (*linePixelData)[i*2+1].setX(valueAxis->coordToPixel(lineData.at(i).value));
+      (*linePixelData)[i*2+1].setY(key);
+    }
+  } else // key axis is horizontal
+  {
+    double zeroPointY = valueAxis->coordToPixel(0);
+    double key;
+    for (int i=0; i<lineData.size(); ++i)
+    {
+      key = keyAxis->coordToPixel(lineData.at(i).key);
+      (*linePixelData)[i*2+0].setX(key);
+      (*linePixelData)[i*2+0].setY(zeroPointY);
+      (*linePixelData)[i*2+1].setX(key);
+      (*linePixelData)[i*2+1].setY(valueAxis->coordToPixel(lineData.at(i).value));
+    }
+  }
+}
+
+/*! \internal
+  
+  Draws the fill of the graph with the specified brush.
+
+  If the fill is a normal fill towards the zero-value-line, only the \a lineData is required (and
+  two extra points at the zero-value-line, which are added by \ref addFillBasePoints and removed by
+  \ref removeFillBasePoints after the fill drawing is done).
+  
+  If the fill is a channel fill between this QCPGraph and another QCPGraph (mChannelFillGraph), the
+  more complex polygon is calculated with the \ref getChannelFillPolygon function.
+  
+  \see drawLinePlot
+*/
+void QCPGraph::drawFill(QCPPainter *painter, QVector<QPointF> *lineData) const
+{
+  if (mLineStyle == lsImpulse) return; // fill doesn't make sense for impulse plot
+  if (mainBrush().style() == Qt::NoBrush || mainBrush().color().alpha() == 0) return;
+  
+  applyFillAntialiasingHint(painter);
+  if (!mChannelFillGraph)
+  {
+    // draw base fill under graph, fill goes all the way to the zero-value-line:
+    addFillBasePoints(lineData);
+    painter->setPen(Qt::NoPen);
+    painter->setBrush(mainBrush());
+    painter->drawPolygon(QPolygonF(*lineData));
+    removeFillBasePoints(lineData);
+  } else
+  {
+    // draw channel fill between this graph and mChannelFillGraph:
+    painter->setPen(Qt::NoPen);
+    painter->setBrush(mainBrush());
+    painter->drawPolygon(getChannelFillPolygon(lineData));
+  }
+}
+
+/*! \internal
+  
+  Draws scatter symbols at every data point passed in \a scatterData. scatter symbols are independent
+  of the line style and are always drawn if the scatter style's shape is not \ref
+  QCPScatterStyle::ssNone. Hence, the \a scatterData vector is outputted by all "get(...)PlotData"
+  functions, together with the (line style dependent) line data.
+  
+  \see drawLinePlot, drawImpulsePlot
+*/
+void QCPGraph::drawScatterPlot(QCPPainter *painter, QVector<QCPData> *scatterData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  
+  // draw error bars:
+  if (mErrorType != etNone)
+  {
+    applyErrorBarsAntialiasingHint(painter);
+    painter->setPen(mErrorPen);
+    if (keyAxis->orientation() == Qt::Vertical)
+    {
+      for (int i=0; i<scatterData->size(); ++i)
+        drawError(painter, valueAxis->coordToPixel(scatterData->at(i).value), keyAxis->coordToPixel(scatterData->at(i).key), scatterData->at(i));
+    } else
+    {
+      for (int i=0; i<scatterData->size(); ++i)
+        drawError(painter, keyAxis->coordToPixel(scatterData->at(i).key), valueAxis->coordToPixel(scatterData->at(i).value), scatterData->at(i));
+    }
+  }
+  
+  // draw scatter point symbols:
+  applyScattersAntialiasingHint(painter);
+  mScatterStyle.applyTo(painter, mPen);
+  if (keyAxis->orientation() == Qt::Vertical)
+  {
+    for (int i=0; i<scatterData->size(); ++i)
+      if (!qIsNaN(scatterData->at(i).value))
+        mScatterStyle.drawShape(painter, valueAxis->coordToPixel(scatterData->at(i).value), keyAxis->coordToPixel(scatterData->at(i).key));
+  } else
+  {
+    for (int i=0; i<scatterData->size(); ++i)
+      if (!qIsNaN(scatterData->at(i).value))
+        mScatterStyle.drawShape(painter, keyAxis->coordToPixel(scatterData->at(i).key), valueAxis->coordToPixel(scatterData->at(i).value));
+  }
+}
+
+/*!  \internal
+  
+  Draws line graphs from the provided data. It connects all points in \a lineData, which was
+  created by one of the "get(...)PlotData" functions for line styles that require simple line
+  connections between the point vector they create. These are for example \ref getLinePlotData,
+  \ref getStepLeftPlotData, \ref getStepRightPlotData and \ref getStepCenterPlotData.
+  
+  \see drawScatterPlot, drawImpulsePlot
+*/
+void QCPGraph::drawLinePlot(QCPPainter *painter, QVector<QPointF> *lineData) const
+{
+  // draw line of graph:
+  if (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0)
+  {
+    applyDefaultAntialiasingHint(painter);
+    painter->setPen(mainPen());
+    painter->setBrush(Qt::NoBrush);
+    
+    /* Draws polyline in batches, currently not used:
+    int p = 0;
+    while (p < lineData->size())
+    {
+      int batch = qMin(25, lineData->size()-p);
+      if (p != 0)
+      {
+        ++batch;
+        --p; // to draw the connection lines between two batches
+      }
+      painter->drawPolyline(lineData->constData()+p, batch);
+      p += batch;
+    }
+    */
+    
+    // if drawing solid line and not in PDF, use much faster line drawing instead of polyline:
+    if (mParentPlot->plottingHints().testFlag(QCP::phFastPolylines) &&
+        painter->pen().style() == Qt::SolidLine &&
+        !painter->modes().testFlag(QCPPainter::pmVectorized) &&
+        !painter->modes().testFlag(QCPPainter::pmNoCaching))
+    {
+      int i = 0;
+      bool lastIsNan = false;
+      const int lineDataSize = lineData->size();
+      while (i < lineDataSize && (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x()))) // make sure first point is not NaN
+        ++i;
+      ++i; // because drawing works in 1 point retrospect
+      while (i < lineDataSize)
+      {
+        if (!qIsNaN(lineData->at(i).y()) && !qIsNaN(lineData->at(i).x())) // NaNs create a gap in the line
+        {
+          if (!lastIsNan)
+            painter->drawLine(lineData->at(i-1), lineData->at(i));
+          else
+            lastIsNan = false;
+        } else
+          lastIsNan = true;
+        ++i;
+      }
+    } else
+    {
+      int segmentStart = 0;
+      int i = 0;
+      const int lineDataSize = lineData->size();
+      while (i < lineDataSize)
+     {
+        if (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x()) || qIsInf(lineData->at(i).y())) // NaNs create a gap in the line. Also filter Infs which make drawPolyline block
+        {
+          painter->drawPolyline(lineData->constData()+segmentStart, i-segmentStart); // i, because we don't want to include the current NaN point
+          segmentStart = i+1;
+        }
+        ++i;
+      }
+      // draw last segment:
+      painter->drawPolyline(lineData->constData()+segmentStart, lineDataSize-segmentStart);
+    }
+  }
+}
+
+/*! \internal
+  
+  Draws impulses from the provided data, i.e. it connects all line pairs in \a lineData, which was
+  created by \ref getImpulsePlotData.
+  
+  \see drawScatterPlot, drawLinePlot
+*/
+void QCPGraph::drawImpulsePlot(QCPPainter *painter, QVector<QPointF> *lineData) const
+{
+  // draw impulses:
+  if (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0)
+  {
+    applyDefaultAntialiasingHint(painter);
+    QPen pen = mainPen();
+    pen.setCapStyle(Qt::FlatCap); // so impulse line doesn't reach beyond zero-line
+    painter->setPen(pen);
+    painter->setBrush(Qt::NoBrush);
+    painter->drawLines(*lineData);
+  }
+}
+
+/*! \internal
+  
+  Returns the \a lineData and \a scatterData that need to be plotted for this graph taking into
+  consideration the current axis ranges and, if \ref setAdaptiveSampling is enabled, local point
+  densities.
+  
+  0 may be passed as \a lineData or \a scatterData to indicate that the respective dataset isn't
+  needed. For example, if the scatter style (\ref setScatterStyle) is \ref QCPScatterStyle::ssNone, \a
+  scatterData should be 0 to prevent unnecessary calculations.
+  
+  This method is used by the various "get(...)PlotData" methods to get the basic working set of data.
+*/
+void QCPGraph::getPreparedData(QVector<QCPData> *lineData, QVector<QCPData> *scatterData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  // get visible data range:
+  QCPDataMap::const_iterator lower, upper; // note that upper is the actual upper point, and not 1 step after the upper point
+  getVisibleDataBounds(lower, upper);
+  if (lower == mData->constEnd() || upper == mData->constEnd())
+    return;
+  
+  // count points in visible range, taking into account that we only need to count to the limit maxCount if using adaptive sampling:
+  int maxCount = std::numeric_limits<int>::max();
+  if (mAdaptiveSampling)
+  {
+    int keyPixelSpan = qAbs(keyAxis->coordToPixel(lower.key())-keyAxis->coordToPixel(upper.key()));
+    maxCount = 2*keyPixelSpan+2;
+  }
+  int dataCount = countDataInBounds(lower, upper, maxCount);
+  
+  if (mAdaptiveSampling && dataCount >= maxCount) // use adaptive sampling only if there are at least two points per pixel on average
+  {
+    if (lineData)
+    {
+      QCPDataMap::const_iterator it = lower;
+      QCPDataMap::const_iterator upperEnd = upper+1;
+      double minValue = it.value().value;
+      double maxValue = it.value().value;
+      QCPDataMap::const_iterator currentIntervalFirstPoint = it;
+      int reversedFactor = keyAxis->rangeReversed() != (keyAxis->orientation()==Qt::Vertical) ? -1 : 1; // is used to calculate keyEpsilon pixel into the correct direction
+      int reversedRound = keyAxis->rangeReversed() != (keyAxis->orientation()==Qt::Vertical) ? 1 : 0; // is used to switch between floor (normal) and ceil (reversed) rounding of currentIntervalStartKey
+      double currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(lower.key())+reversedRound));
+      double lastIntervalEndKey = currentIntervalStartKey;
+      double keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor)); // interval of one pixel on screen when mapped to plot key coordinates
+      bool keyEpsilonVariable = keyAxis->scaleType() == QCPAxis::stLogarithmic; // indicates whether keyEpsilon needs to be updated after every interval (for log axes)
+      int intervalDataCount = 1;
+      ++it; // advance iterator to second data point because adaptive sampling works in 1 point retrospect
+      while (it != upperEnd)
+      {
+        if (it.key() < currentIntervalStartKey+keyEpsilon) // data point is still within same pixel, so skip it and expand value span of this cluster if necessary
+        {
+          if (it.value().value < minValue)
+            minValue = it.value().value;
+          else if (it.value().value > maxValue)
+            maxValue = it.value().value;
+          ++intervalDataCount;
+        } else // new pixel interval started
+        {
+          if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them to a cluster
+          {
+            if (lastIntervalEndKey < currentIntervalStartKey-keyEpsilon) // last point is further away, so first point of this cluster must be at a real data point
+              lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.2, currentIntervalFirstPoint.value().value));
+            lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.25, minValue));
+            lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.75, maxValue));
+            if (it.key() > currentIntervalStartKey+keyEpsilon*2) // new pixel started further away from previous cluster, so make sure the last point of the cluster is at a real data point
+              lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.8, (it-1).value().value));
+          } else
+            lineData->append(QCPData(currentIntervalFirstPoint.key(), currentIntervalFirstPoint.value().value));
+          lastIntervalEndKey = (it-1).value().key;
+          minValue = it.value().value;
+          maxValue = it.value().value;
+          currentIntervalFirstPoint = it;
+          currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(it.key())+reversedRound));
+          if (keyEpsilonVariable)
+            keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor));
+          intervalDataCount = 1;
+        }
+        ++it;
+      }
+      // handle last interval:
+      if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them to a cluster
+      {
+        if (lastIntervalEndKey < currentIntervalStartKey-keyEpsilon) // last point wasn't a cluster, so first point of this cluster must be at a real data point
+          lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.2, currentIntervalFirstPoint.value().value));
+        lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.25, minValue));
+        lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.75, maxValue));
+      } else
+        lineData->append(QCPData(currentIntervalFirstPoint.key(), currentIntervalFirstPoint.value().value));
+    }
+    
+    if (scatterData)
+    {
+      double valueMaxRange = valueAxis->range().upper;
+      double valueMinRange = valueAxis->range().lower;
+      QCPDataMap::const_iterator it = lower;
+      QCPDataMap::const_iterator upperEnd = upper+1;
+      double minValue = it.value().value;
+      double maxValue = it.value().value;
+      QCPDataMap::const_iterator minValueIt = it;
+      QCPDataMap::const_iterator maxValueIt = it;
+      QCPDataMap::const_iterator currentIntervalStart = it;
+      int reversedFactor = keyAxis->rangeReversed() ? -1 : 1; // is used to calculate keyEpsilon pixel into the correct direction
+      int reversedRound = keyAxis->rangeReversed() ? 1 : 0; // is used to switch between floor (normal) and ceil (reversed) rounding of currentIntervalStartKey
+      double currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(lower.key())+reversedRound));
+      double keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor)); // interval of one pixel on screen when mapped to plot key coordinates
+      bool keyEpsilonVariable = keyAxis->scaleType() == QCPAxis::stLogarithmic; // indicates whether keyEpsilon needs to be updated after every interval (for log axes)
+      int intervalDataCount = 1;
+      ++it; // advance iterator to second data point because adaptive sampling works in 1 point retrospect
+      while (it != upperEnd)
+      {
+        if (it.key() < currentIntervalStartKey+keyEpsilon) // data point is still within same pixel, so skip it and expand value span of this pixel if necessary
+        {
+          if (it.value().value < minValue && it.value().value > valueMinRange && it.value().value < valueMaxRange)
+          {
+            minValue = it.value().value;
+            minValueIt = it;
+          } else if (it.value().value > maxValue && it.value().value > valueMinRange && it.value().value < valueMaxRange)
+          {
+            maxValue = it.value().value;
+            maxValueIt = it;
+          }
+          ++intervalDataCount;
+        } else // new pixel started
+        {
+          if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them
+          {
+            // determine value pixel span and add as many points in interval to maintain certain vertical data density (this is specific to scatter plot):
+            double valuePixelSpan = qAbs(valueAxis->coordToPixel(minValue)-valueAxis->coordToPixel(maxValue));
+            int dataModulo = qMax(1, qRound(intervalDataCount/(valuePixelSpan/4.0))); // approximately every 4 value pixels one data point on average
+            QCPDataMap::const_iterator intervalIt = currentIntervalStart;
+            int c = 0;
+            while (intervalIt != it)
+            {
+              if ((c % dataModulo == 0 || intervalIt == minValueIt || intervalIt == maxValueIt) && intervalIt.value().value > valueMinRange && intervalIt.value().value < valueMaxRange)
+                scatterData->append(intervalIt.value());
+              ++c;
+              ++intervalIt;
+            }
+          } else if (currentIntervalStart.value().value > valueMinRange && currentIntervalStart.value().value < valueMaxRange)
+            scatterData->append(currentIntervalStart.value());
+          minValue = it.value().value;
+          maxValue = it.value().value;
+          currentIntervalStart = it;
+          currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(it.key())+reversedRound));
+          if (keyEpsilonVariable)
+            keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor));
+          intervalDataCount = 1;
+        }
+        ++it;
+      }
+      // handle last interval:
+      if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them
+      {
+        // determine value pixel span and add as many points in interval to maintain certain vertical data density (this is specific to scatter plot):
+        double valuePixelSpan = qAbs(valueAxis->coordToPixel(minValue)-valueAxis->coordToPixel(maxValue));
+        int dataModulo = qMax(1, qRound(intervalDataCount/(valuePixelSpan/4.0))); // approximately every 4 value pixels one data point on average
+        QCPDataMap::const_iterator intervalIt = currentIntervalStart;
+        int c = 0;
+        while (intervalIt != it)
+        {
+          if ((c % dataModulo == 0 || intervalIt == minValueIt || intervalIt == maxValueIt) && intervalIt.value().value > valueMinRange && intervalIt.value().value < valueMaxRange)
+            scatterData->append(intervalIt.value());
+          ++c;
+          ++intervalIt;
+        }
+      } else if (currentIntervalStart.value().value > valueMinRange && currentIntervalStart.value().value < valueMaxRange)
+        scatterData->append(currentIntervalStart.value());
+    }
+  } else // don't use adaptive sampling algorithm, transfer points one-to-one from the map into the output parameters
+  {
+    QVector<QCPData> *dataVector = 0;
+    if (lineData)
+      dataVector = lineData;
+    else if (scatterData)
+      dataVector = scatterData;
+    if (dataVector)
+    {
+      QCPDataMap::const_iterator it = lower;
+      QCPDataMap::const_iterator upperEnd = upper+1;
+      dataVector->reserve(dataCount+2); // +2 for possible fill end points
+      while (it != upperEnd)
+      {
+        dataVector->append(it.value());
+        ++it;
+      }
+    }
+    if (lineData && scatterData)
+      *scatterData = *dataVector;
+  }
+}
+
+/*!  \internal
+  
+  called by the scatter drawing function (\ref drawScatterPlot) to draw the error bars on one data
+  point. \a x and \a y pixel positions of the data point are passed since they are already known in
+  pixel coordinates in the drawing function, so we save some extra coordToPixel transforms here. \a
+  data is therefore only used for the errors, not key and value.
+*/
+void QCPGraph::drawError(QCPPainter *painter, double x, double y, const QCPData &data) const
+{
+  if (qIsNaN(data.value))
+    return;
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  
+  double a, b; // positions of error bar bounds in pixels
+  double barWidthHalf = mErrorBarSize*0.5;
+  double skipSymbolMargin = mScatterStyle.size(); // pixels left blank per side, when mErrorBarSkipSymbol is true
+
+  if (keyAxis->orientation() == Qt::Vertical)
+  {
+    // draw key error vertically and value error horizontally
+    if (mErrorType == etKey || mErrorType == etBoth)
+    {
+      a = keyAxis->coordToPixel(data.key-data.keyErrorMinus);
+      b = keyAxis->coordToPixel(data.key+data.keyErrorPlus);
+      if (keyAxis->rangeReversed())
+        qSwap(a,b);
+      // draw spine:
+      if (mErrorBarSkipSymbol)
+      {
+        if (a-y > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin
+          painter->drawLine(QLineF(x, a, x, y+skipSymbolMargin));
+        if (y-b > skipSymbolMargin)
+          painter->drawLine(QLineF(x, y-skipSymbolMargin, x, b));
+      } else
+        painter->drawLine(QLineF(x, a, x, b));
+      // draw handles:
+      painter->drawLine(QLineF(x-barWidthHalf, a, x+barWidthHalf, a));
+      painter->drawLine(QLineF(x-barWidthHalf, b, x+barWidthHalf, b));
+    }
+    if (mErrorType == etValue || mErrorType == etBoth)
+    {
+      a = valueAxis->coordToPixel(data.value-data.valueErrorMinus);
+      b = valueAxis->coordToPixel(data.value+data.valueErrorPlus);
+      if (valueAxis->rangeReversed())
+        qSwap(a,b);
+      // draw spine:
+      if (mErrorBarSkipSymbol)
+      {
+        if (x-a > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin
+          painter->drawLine(QLineF(a, y, x-skipSymbolMargin, y));
+        if (b-x > skipSymbolMargin)
+          painter->drawLine(QLineF(x+skipSymbolMargin, y, b, y));
+      } else
+        painter->drawLine(QLineF(a, y, b, y));
+      // draw handles:
+      painter->drawLine(QLineF(a, y-barWidthHalf, a, y+barWidthHalf));
+      painter->drawLine(QLineF(b, y-barWidthHalf, b, y+barWidthHalf));
+    }
+  } else // mKeyAxis->orientation() is Qt::Horizontal
+  {
+    // draw value error vertically and key error horizontally
+    if (mErrorType == etKey || mErrorType == etBoth)
+    {
+      a = keyAxis->coordToPixel(data.key-data.keyErrorMinus);
+      b = keyAxis->coordToPixel(data.key+data.keyErrorPlus);
+      if (keyAxis->rangeReversed())
+        qSwap(a,b);
+      // draw spine:
+      if (mErrorBarSkipSymbol)
+      {
+        if (x-a > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin
+          painter->drawLine(QLineF(a, y, x-skipSymbolMargin, y));
+        if (b-x > skipSymbolMargin)
+          painter->drawLine(QLineF(x+skipSymbolMargin, y, b, y));
+      } else
+        painter->drawLine(QLineF(a, y, b, y));
+      // draw handles:
+      painter->drawLine(QLineF(a, y-barWidthHalf, a, y+barWidthHalf));
+      painter->drawLine(QLineF(b, y-barWidthHalf, b, y+barWidthHalf));
+    }
+    if (mErrorType == etValue || mErrorType == etBoth)
+    {
+      a = valueAxis->coordToPixel(data.value-data.valueErrorMinus);
+      b = valueAxis->coordToPixel(data.value+data.valueErrorPlus);
+      if (valueAxis->rangeReversed())
+        qSwap(a,b);
+      // draw spine:
+      if (mErrorBarSkipSymbol)
+      {
+        if (a-y > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin
+          painter->drawLine(QLineF(x, a, x, y+skipSymbolMargin));
+        if (y-b > skipSymbolMargin)
+          painter->drawLine(QLineF(x, y-skipSymbolMargin, x, b));
+      } else
+        painter->drawLine(QLineF(x, a, x, b));
+      // draw handles:
+      painter->drawLine(QLineF(x-barWidthHalf, a, x+barWidthHalf, a));
+      painter->drawLine(QLineF(x-barWidthHalf, b, x+barWidthHalf, b));
+    }
+  }
+}
+
+/*!  \internal
+  
+  called by \ref getPreparedData to determine which data (key) range is visible at the current key
+  axis range setting, so only that needs to be processed.
+  
+  \a lower returns an iterator to the lowest data point that needs to be taken into account when
+  plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a
+  lower may still be just outside the visible range.
+  
+  \a upper returns an iterator to the highest data point. Same as before, \a upper may also lie
+  just outside of the visible range.
+  
+  if the graph contains no data, both \a lower and \a upper point to constEnd.
+*/
+void QCPGraph::getVisibleDataBounds(QCPDataMap::const_iterator &lower, QCPDataMap::const_iterator &upper) const
+{
+  if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; }
+  if (mData->isEmpty())
+  {
+    lower = mData->constEnd();
+    upper = mData->constEnd();
+    return;
+  }
+  
+  // get visible data range as QMap iterators
+  QCPDataMap::const_iterator lbound = mData->lowerBound(mKeyAxis.data()->range().lower);
+  QCPDataMap::const_iterator ubound = mData->upperBound(mKeyAxis.data()->range().upper);
+  bool lowoutlier = lbound != mData->constBegin(); // indicates whether there exist points below axis range
+  bool highoutlier = ubound != mData->constEnd(); // indicates whether there exist points above axis range
+  
+  lower = (lowoutlier ? lbound-1 : lbound); // data point range that will be actually drawn
+  upper = (highoutlier ? ubound : ubound-1); // data point range that will be actually drawn
+}
+
+/*!  \internal
+  
+  Counts the number of data points between \a lower and \a upper (including them), up to a maximum
+  of \a maxCount.
+  
+  This function is used by \ref getPreparedData to determine whether adaptive sampling shall be
+  used (if enabled via \ref setAdaptiveSampling) or not. This is also why counting of data points
+  only needs to be done until \a maxCount is reached, which should be set to the number of data
+  points at which adaptive sampling sets in.
+*/
+int QCPGraph::countDataInBounds(const QCPDataMap::const_iterator &lower, const QCPDataMap::const_iterator &upper, int maxCount) const
+{
+  if (upper == mData->constEnd() && lower == mData->constEnd())
+    return 0;
+  QCPDataMap::const_iterator it = lower;
+  int count = 1;
+  while (it != upper && count < maxCount)
+  {
+    ++it;
+    ++count;
+  }
+  return count;
+}
+
+/*! \internal
+  
+  The line data vector generated by e.g. getLinePlotData contains only the line that connects the
+  data points. If the graph needs to be filled, two additional points need to be added at the
+  value-zero-line in the lower and upper key positions of the graph. This function calculates these
+  points and adds them to the end of \a lineData. Since the fill is typically drawn before the line
+  stroke, these added points need to be removed again after the fill is done, with the
+  removeFillBasePoints function.
+  
+  The expanding of \a lineData by two points will not cause unnecessary memory reallocations,
+  because the data vector generation functions (getLinePlotData etc.) reserve two extra points when
+  they allocate memory for \a lineData.
+  
+  \see removeFillBasePoints, lowerFillBasePoint, upperFillBasePoint
+*/
+void QCPGraph::addFillBasePoints(QVector<QPointF> *lineData) const
+{
+  if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; }
+  if (!lineData) { qDebug() << Q_FUNC_INFO << "passed null as lineData"; return; }
+  if (lineData->isEmpty()) return;
+  
+  // append points that close the polygon fill at the key axis:
+  if (mKeyAxis.data()->orientation() == Qt::Vertical)
+  {
+    *lineData << upperFillBasePoint(lineData->last().y());
+    *lineData << lowerFillBasePoint(lineData->first().y());
+  } else
+  {
+    *lineData << upperFillBasePoint(lineData->last().x());
+    *lineData << lowerFillBasePoint(lineData->first().x());
+  }
+}
+
+/*! \internal
+  
+  removes the two points from \a lineData that were added by \ref addFillBasePoints.
+  
+  \see addFillBasePoints, lowerFillBasePoint, upperFillBasePoint
+*/
+void QCPGraph::removeFillBasePoints(QVector<QPointF> *lineData) const
+{
+  if (!lineData) { qDebug() << Q_FUNC_INFO << "passed null as lineData"; return; }
+  if (lineData->isEmpty()) return;
+  
+  lineData->remove(lineData->size()-2, 2);
+}
+
+/*! \internal
+  
+  called by \ref addFillBasePoints to conveniently assign the point which closes the fill polygon
+  on the lower side of the zero-value-line parallel to the key axis. The logarithmic axis scale
+  case is a bit special, since the zero-value-line in pixel coordinates is in positive or negative
+  infinity. So this case is handled separately by just closing the fill polygon on the axis which
+  lies in the direction towards the zero value.
+  
+  \a lowerKey will be the the key (in pixels) of the returned point. Depending on whether the key
+  axis is horizontal or vertical, \a lowerKey will end up as the x or y value of the returned
+  point, respectively.
+  
+  \see upperFillBasePoint, addFillBasePoints
+*/
+QPointF QCPGraph::lowerFillBasePoint(double lowerKey) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); }
+  
+  QPointF point;
+  if (valueAxis->scaleType() == QCPAxis::stLinear)
+  {
+    if (keyAxis->axisType() == QCPAxis::atLeft)
+    {
+      point.setX(valueAxis->coordToPixel(0));
+      point.setY(lowerKey);
+    } else if (keyAxis->axisType() == QCPAxis::atRight)
+    {
+      point.setX(valueAxis->coordToPixel(0));
+      point.setY(lowerKey);
+    } else if (keyAxis->axisType() == QCPAxis::atTop)
+    {
+      point.setX(lowerKey);
+      point.setY(valueAxis->coordToPixel(0));
+    } else if (keyAxis->axisType() == QCPAxis::atBottom)
+    {
+      point.setX(lowerKey);
+      point.setY(valueAxis->coordToPixel(0));
+    }
+  } else // valueAxis->mScaleType == QCPAxis::stLogarithmic
+  {
+    // In logarithmic scaling we can't just draw to value zero so we just fill all the way
+    // to the axis which is in the direction towards zero
+    if (keyAxis->orientation() == Qt::Vertical)
+    {
+      if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) ||
+          (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis
+        point.setX(keyAxis->axisRect()->right());
+      else
+        point.setX(keyAxis->axisRect()->left());
+      point.setY(lowerKey);
+    } else if (keyAxis->axisType() == QCPAxis::atTop || keyAxis->axisType() == QCPAxis::atBottom)
+    {
+      point.setX(lowerKey);
+      if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) ||
+          (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis
+        point.setY(keyAxis->axisRect()->top());
+      else
+        point.setY(keyAxis->axisRect()->bottom());
+    }
+  }
+  return point;
+}
+
+/*! \internal
+  
+  called by \ref addFillBasePoints to conveniently assign the point which closes the fill
+  polygon on the upper side of the zero-value-line parallel to the key axis. The logarithmic axis
+  scale case is a bit special, since the zero-value-line in pixel coordinates is in positive or
+  negative infinity. So this case is handled separately by just closing the fill polygon on the
+  axis which lies in the direction towards the zero value.
+
+  \a upperKey will be the the key (in pixels) of the returned point. Depending on whether the key
+  axis is horizontal or vertical, \a upperKey will end up as the x or y value of the returned
+  point, respectively.
+  
+  \see lowerFillBasePoint, addFillBasePoints
+*/
+QPointF QCPGraph::upperFillBasePoint(double upperKey) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); }
+  
+  QPointF point;
+  if (valueAxis->scaleType() == QCPAxis::stLinear)
+  {
+    if (keyAxis->axisType() == QCPAxis::atLeft)
+    {
+      point.setX(valueAxis->coordToPixel(0));
+      point.setY(upperKey);
+    } else if (keyAxis->axisType() == QCPAxis::atRight)
+    {
+      point.setX(valueAxis->coordToPixel(0));
+      point.setY(upperKey);
+    } else if (keyAxis->axisType() == QCPAxis::atTop)
+    {
+      point.setX(upperKey);
+      point.setY(valueAxis->coordToPixel(0));
+    } else if (keyAxis->axisType() == QCPAxis::atBottom)
+    {
+      point.setX(upperKey);
+      point.setY(valueAxis->coordToPixel(0));
+    }
+  } else // valueAxis->mScaleType == QCPAxis::stLogarithmic
+  {
+    // In logarithmic scaling we can't just draw to value 0 so we just fill all the way
+    // to the axis which is in the direction towards 0
+    if (keyAxis->orientation() == Qt::Vertical)
+    {
+      if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) ||
+          (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis
+        point.setX(keyAxis->axisRect()->right());
+      else
+        point.setX(keyAxis->axisRect()->left());
+      point.setY(upperKey);
+    } else if (keyAxis->axisType() == QCPAxis::atTop || keyAxis->axisType() == QCPAxis::atBottom)
+    {
+      point.setX(upperKey);
+      if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) ||
+          (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis
+        point.setY(keyAxis->axisRect()->top());
+      else
+        point.setY(keyAxis->axisRect()->bottom());
+    }
+  }
+  return point;
+}
+
+/*! \internal
+  
+  Generates the polygon needed for drawing channel fills between this graph (data passed via \a
+  lineData) and the graph specified by mChannelFillGraph (data generated by calling its \ref
+  getPlotData function). May return an empty polygon if the key ranges have no overlap or fill
+  target graph and this graph don't have same orientation (i.e. both key axes horizontal or both
+  key axes vertical). For increased performance (due to implicit sharing), keep the returned
+  QPolygonF const.
+*/
+const QPolygonF QCPGraph::getChannelFillPolygon(const QVector<QPointF> *lineData) const
+{
+  if (!mChannelFillGraph)
+    return QPolygonF();
+  
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPolygonF(); }
+  if (!mChannelFillGraph.data()->mKeyAxis) { qDebug() << Q_FUNC_INFO << "channel fill target key axis invalid"; return QPolygonF(); }
+  
+  if (mChannelFillGraph.data()->mKeyAxis.data()->orientation() != keyAxis->orientation())
+    return QPolygonF(); // don't have same axis orientation, can't fill that (Note: if keyAxis fits, valueAxis will fit too, because it's always orthogonal to keyAxis)
+  
+  if (lineData->isEmpty()) return QPolygonF();
+  QVector<QPointF> otherData;
+  mChannelFillGraph.data()->getPlotData(&otherData, 0);
+  if (otherData.isEmpty()) return QPolygonF();
+  QVector<QPointF> thisData;
+  thisData.reserve(lineData->size()+otherData.size()); // because we will join both vectors at end of this function
+  for (int i=0; i<lineData->size(); ++i) // don't use the vector<<(vector),  it squeezes internally, which ruins the performance tuning with reserve()
+    thisData << lineData->at(i);
+  
+  // pointers to be able to swap them, depending which data range needs cropping:
+  QVector<QPointF> *staticData = &thisData;
+  QVector<QPointF> *croppedData = &otherData;
+  
+  // crop both vectors to ranges in which the keys overlap (which coord is key, depends on axisType):
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    // x is key
+    // if an axis range is reversed, the data point keys will be descending. Reverse them, since following algorithm assumes ascending keys:
+    if (staticData->first().x() > staticData->last().x())
+    {
+      int size = staticData->size();
+      for (int i=0; i<size/2; ++i)
+        qSwap((*staticData)[i], (*staticData)[size-1-i]);
+    }
+    if (croppedData->first().x() > croppedData->last().x())
+    {
+      int size = croppedData->size();
+      for (int i=0; i<size/2; ++i)
+        qSwap((*croppedData)[i], (*croppedData)[size-1-i]);
+    }
+    // crop lower bound:
+    if (staticData->first().x() < croppedData->first().x()) // other one must be cropped
+      qSwap(staticData, croppedData);
+    int lowBound = findIndexBelowX(croppedData, staticData->first().x());
+    if (lowBound == -1) return QPolygonF(); // key ranges have no overlap
+    croppedData->remove(0, lowBound);
+    // set lowest point of cropped data to fit exactly key position of first static data
+    // point via linear interpolation:
+    if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation
+    double slope;
+    if (croppedData->at(1).x()-croppedData->at(0).x() != 0)
+      slope = (croppedData->at(1).y()-croppedData->at(0).y())/(croppedData->at(1).x()-croppedData->at(0).x());
+    else
+      slope = 0;
+    (*croppedData)[0].setY(croppedData->at(0).y()+slope*(staticData->first().x()-croppedData->at(0).x()));
+    (*croppedData)[0].setX(staticData->first().x());
+    
+    // crop upper bound:
+    if (staticData->last().x() > croppedData->last().x()) // other one must be cropped
+      qSwap(staticData, croppedData);
+    int highBound = findIndexAboveX(croppedData, staticData->last().x());
+    if (highBound == -1) return QPolygonF(); // key ranges have no overlap
+    croppedData->remove(highBound+1, croppedData->size()-(highBound+1));
+    // set highest point of cropped data to fit exactly key position of last static data
+    // point via linear interpolation:
+    if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation
+    int li = croppedData->size()-1; // last index
+    if (croppedData->at(li).x()-croppedData->at(li-1).x() != 0)
+      slope = (croppedData->at(li).y()-croppedData->at(li-1).y())/(croppedData->at(li).x()-croppedData->at(li-1).x());
+    else
+      slope = 0;
+    (*croppedData)[li].setY(croppedData->at(li-1).y()+slope*(staticData->last().x()-croppedData->at(li-1).x()));
+    (*croppedData)[li].setX(staticData->last().x());
+  } else // mKeyAxis->orientation() == Qt::Vertical
+  {
+    // y is key
+    // similar to "x is key" but switched x,y. Further, lower/upper meaning is inverted compared to x,
+    // because in pixel coordinates, y increases from top to bottom, not bottom to top like data coordinate.
+    // if an axis range is reversed, the data point keys will be descending. Reverse them, since following algorithm assumes ascending keys:
+    if (staticData->first().y() < staticData->last().y())
+    {
+      int size = staticData->size();
+      for (int i=0; i<size/2; ++i)
+        qSwap((*staticData)[i], (*staticData)[size-1-i]);
+    }
+    if (croppedData->first().y() < croppedData->last().y())
+    {
+      int size = croppedData->size();
+      for (int i=0; i<size/2; ++i)
+        qSwap((*croppedData)[i], (*croppedData)[size-1-i]);
+    }
+    // crop lower bound:
+    if (staticData->first().y() > croppedData->first().y()) // other one must be cropped
+      qSwap(staticData, croppedData);
+    int lowBound = findIndexAboveY(croppedData, staticData->first().y());
+    if (lowBound == -1) return QPolygonF(); // key ranges have no overlap
+    croppedData->remove(0, lowBound);
+    // set lowest point of cropped data to fit exactly key position of first static data
+    // point via linear interpolation:
+    if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation
+    double slope;
+    if (croppedData->at(1).y()-croppedData->at(0).y() != 0) // avoid division by zero in step plots
+      slope = (croppedData->at(1).x()-croppedData->at(0).x())/(croppedData->at(1).y()-croppedData->at(0).y());
+    else
+      slope = 0;
+    (*croppedData)[0].setX(croppedData->at(0).x()+slope*(staticData->first().y()-croppedData->at(0).y()));
+    (*croppedData)[0].setY(staticData->first().y());
+    
+    // crop upper bound:
+    if (staticData->last().y() < croppedData->last().y()) // other one must be cropped
+      qSwap(staticData, croppedData);
+    int highBound = findIndexBelowY(croppedData, staticData->last().y());
+    if (highBound == -1) return QPolygonF(); // key ranges have no overlap
+    croppedData->remove(highBound+1, croppedData->size()-(highBound+1));
+    // set highest point of cropped data to fit exactly key position of last static data
+    // point via linear interpolation:
+    if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation
+    int li = croppedData->size()-1; // last index
+    if (croppedData->at(li).y()-croppedData->at(li-1).y() != 0) // avoid division by zero in step plots
+      slope = (croppedData->at(li).x()-croppedData->at(li-1).x())/(croppedData->at(li).y()-croppedData->at(li-1).y());
+    else
+      slope = 0;
+    (*croppedData)[li].setX(croppedData->at(li-1).x()+slope*(staticData->last().y()-croppedData->at(li-1).y()));
+    (*croppedData)[li].setY(staticData->last().y());
+  }
+  
+  // return joined:
+  for (int i=otherData.size()-1; i>=0; --i) // insert reversed, otherwise the polygon will be twisted
+    thisData << otherData.at(i);
+  return QPolygonF(thisData);
+}
+
+/*! \internal
+  
+  Finds the smallest index of \a data, whose points x value is just above \a x. Assumes x values in
+  \a data points are ordered ascending, as is the case when plotting with horizontal key axis.
+
+  Used to calculate the channel fill polygon, see \ref getChannelFillPolygon.
+*/
+int QCPGraph::findIndexAboveX(const QVector<QPointF> *data, double x) const
+{
+  for (int i=data->size()-1; i>=0; --i)
+  {
+    if (data->at(i).x() < x)
+    {
+      if (i<data->size()-1)
+        return i+1;
+      else
+        return data->size()-1;
+    }
+  }
+  return -1;
+}
+
+/*! \internal
+  
+  Finds the highest index of \a data, whose points x value is just below \a x. Assumes x values in
+  \a data points are ordered ascending, as is the case when plotting with horizontal key axis.
+  
+  Used to calculate the channel fill polygon, see \ref getChannelFillPolygon.
+*/
+int QCPGraph::findIndexBelowX(const QVector<QPointF> *data, double x) const
+{
+  for (int i=0; i<data->size(); ++i)
+  {
+    if (data->at(i).x() > x)
+    {
+      if (i>0)
+        return i-1;
+      else
+        return 0;
+    }
+  }
+  return -1;
+}
+
+/*! \internal
+  
+  Finds the smallest index of \a data, whose points y value is just above \a y. Assumes y values in
+  \a data points are ordered descending, as is the case when plotting with vertical key axis.
+  
+  Used to calculate the channel fill polygon, see \ref getChannelFillPolygon.
+*/
+int QCPGraph::findIndexAboveY(const QVector<QPointF> *data, double y) const
+{
+  for (int i=0; i<data->size(); ++i)
+  {
+    if (data->at(i).y() < y)
+    {
+      if (i>0)
+        return i-1;
+      else
+        return 0;
+    }
+  }
+  return -1;
+}
+
+/*! \internal
+  
+  Calculates the (minimum) distance (in pixels) the graph's representation has from the given \a
+  pixelPoint in pixels. This is used to determine whether the graph was clicked or not, e.g. in
+  \ref selectTest.
+  
+  If either the graph has no data or if the line style is \ref lsNone and the scatter style's shape
+  is \ref QCPScatterStyle::ssNone (i.e. there is no visual representation of the graph), returns -1.0.
+*/
+double QCPGraph::pointDistance(const QPointF &pixelPoint) const
+{
+  if (mData->isEmpty())
+    return -1.0;
+  if (mLineStyle == lsNone && mScatterStyle.isNone())
+    return -1.0;
+  
+  // calculate minimum distances to graph representation:
+  if (mLineStyle == lsNone)
+  {
+    // no line displayed, only calculate distance to scatter points:
+    QVector<QCPData> scatterData;
+    getScatterPlotData(&scatterData);
+    if (scatterData.size() > 0)
+    {
+      double minDistSqr = std::numeric_limits<double>::max();
+      for (int i=0; i<scatterData.size(); ++i)
+      {
+        double currentDistSqr = QVector2D(coordsToPixels(scatterData.at(i).key, scatterData.at(i).value)-pixelPoint).lengthSquared();
+        if (currentDistSqr < minDistSqr)
+          minDistSqr = currentDistSqr;
+      }
+      return qSqrt(minDistSqr);
+    } else // no data available in view to calculate distance to
+      return -1.0;
+  } else
+  {
+    // line displayed, calculate distance to line segments:
+    QVector<QPointF> lineData;
+    getPlotData(&lineData, 0); // unlike with getScatterPlotData we get pixel coordinates here
+    if (lineData.size() > 1) // at least one line segment, compare distance to line segments
+    {
+      double minDistSqr = std::numeric_limits<double>::max();
+      if (mLineStyle == lsImpulse)
+      {
+        // impulse plot differs from other line styles in that the lineData points are only pairwise connected:
+        for (int i=0; i<lineData.size()-1; i+=2) // iterate pairs
+        {
+          double currentDistSqr = distSqrToLine(lineData.at(i), lineData.at(i+1), pixelPoint);
+          if (currentDistSqr < minDistSqr)
+            minDistSqr = currentDistSqr;
+        }
+      } else
+      {
+        // all other line plots (line and step) connect points directly:
+        for (int i=0; i<lineData.size()-1; ++i)
+        {
+          double currentDistSqr = distSqrToLine(lineData.at(i), lineData.at(i+1), pixelPoint);
+          if (currentDistSqr < minDistSqr)
+            minDistSqr = currentDistSqr;
+        }
+      }
+      return qSqrt(minDistSqr);
+    } else if (lineData.size() > 0) // only single data point, calculate distance to that point
+    {
+      return QVector2D(lineData.at(0)-pixelPoint).length();
+    } else // no data available in view to calculate distance to
+      return -1.0;
+  }
+}
+
+/*! \internal
+  
+  Finds the highest index of \a data, whose points y value is just below \a y. Assumes y values in
+  \a data points are ordered descending, as is the case when plotting with vertical key axis (since
+  keys are ordered ascending).
+
+  Used to calculate the channel fill polygon, see \ref getChannelFillPolygon.
+*/
+int QCPGraph::findIndexBelowY(const QVector<QPointF> *data, double y) const
+{
+  for (int i=data->size()-1; i>=0; --i)
+  {
+    if (data->at(i).y() > y)
+    {
+      if (i<data->size()-1)
+        return i+1;
+      else
+        return data->size()-1;
+    }
+  }
+  return -1;
+}
+
+/* inherits documentation from base class */
+QCPRange QCPGraph::getKeyRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  // just call the specialized version which takes an additional argument whether error bars
+  // should also be taken into consideration for range calculation. We set this to true here.
+  return getKeyRange(foundRange, inSignDomain, true);
+}
+
+/* inherits documentation from base class */
+QCPRange QCPGraph::getValueRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  // just call the specialized version which takes an additional argument whether error bars
+  // should also be taken into consideration for range calculation. We set this to true here.
+  return getValueRange(foundRange, inSignDomain, true);
+}
+
+/*! \overload
+  
+  Allows to specify whether the error bars should be included in the range calculation.
+  
+  \see getKeyRange(bool &foundRange, SignDomain inSignDomain)
+*/
+QCPRange QCPGraph::getKeyRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const
+{
+  QCPRange range;
+  bool haveLower = false;
+  bool haveUpper = false;
+  
+  double current, currentErrorMinus, currentErrorPlus;
+  
+  if (inSignDomain == sdBoth) // range may be anywhere
+  {
+    QCPDataMap::const_iterator it = mData->constBegin();
+    while (it != mData->constEnd())
+    {
+      if (!qIsNaN(it.value().value))
+      {
+        current = it.value().key;
+        currentErrorMinus = (includeErrors ? it.value().keyErrorMinus : 0);
+        currentErrorPlus = (includeErrors ? it.value().keyErrorPlus : 0);
+        if (current-currentErrorMinus < range.lower || !haveLower)
+        {
+          range.lower = current-currentErrorMinus;
+          haveLower = true;
+        }
+        if (current+currentErrorPlus > range.upper || !haveUpper)
+        {
+          range.upper = current+currentErrorPlus;
+          haveUpper = true;
+        }
+      }
+      ++it;
+    }
+  } else if (inSignDomain == sdNegative) // range may only be in the negative sign domain
+  {
+    QCPDataMap::const_iterator it = mData->constBegin();
+    while (it != mData->constEnd())
+    {
+      if (!qIsNaN(it.value().value))
+      {
+        current = it.value().key;
+        currentErrorMinus = (includeErrors ? it.value().keyErrorMinus : 0);
+        currentErrorPlus = (includeErrors ? it.value().keyErrorPlus : 0);
+        if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus < 0)
+        {
+          range.lower = current-currentErrorMinus;
+          haveLower = true;
+        }
+        if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus < 0)
+        {
+          range.upper = current+currentErrorPlus;
+          haveUpper = true;
+        }
+        if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to geht that point.
+        {
+          if ((current < range.lower || !haveLower) && current < 0)
+          {
+            range.lower = current;
+            haveLower = true;
+          }
+          if ((current > range.upper || !haveUpper) && current < 0)
+          {
+            range.upper = current;
+            haveUpper = true;
+          }
+        }
+      }
+      ++it;
+    }
+  } else if (inSignDomain == sdPositive) // range may only be in the positive sign domain
+  {
+    QCPDataMap::const_iterator it = mData->constBegin();
+    while (it != mData->constEnd())
+    {
+      if (!qIsNaN(it.value().value))
+      {
+        current = it.value().key;
+        currentErrorMinus = (includeErrors ? it.value().keyErrorMinus : 0);
+        currentErrorPlus = (includeErrors ? it.value().keyErrorPlus : 0);
+        if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus > 0)
+        {
+          range.lower = current-currentErrorMinus;
+          haveLower = true;
+        }
+        if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus > 0)
+        {
+          range.upper = current+currentErrorPlus;
+          haveUpper = true;
+        }
+        if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to get that point.
+        {
+          if ((current < range.lower || !haveLower) && current > 0)
+          {
+            range.lower = current;
+            haveLower = true;
+          }
+          if ((current > range.upper || !haveUpper) && current > 0)
+          {
+            range.upper = current;
+            haveUpper = true;
+          }
+        }
+      }
+      ++it;
+    }
+  }
+  
+  foundRange = haveLower && haveUpper;
+  return range;
+}
+
+/*! \overload
+  
+  Allows to specify whether the error bars should be included in the range calculation.
+  
+  \see getValueRange(bool &foundRange, SignDomain inSignDomain)
+*/
+QCPRange QCPGraph::getValueRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const
+{
+  QCPRange range;
+  bool haveLower = false;
+  bool haveUpper = false;
+  
+  double current, currentErrorMinus, currentErrorPlus;
+  
+  if (inSignDomain == sdBoth) // range may be anywhere
+  {
+    QCPDataMap::const_iterator it = mData->constBegin();
+    while (it != mData->constEnd())
+    {
+      current = it.value().value;
+      if (!qIsNaN(current))
+      {
+        currentErrorMinus = (includeErrors ? it.value().valueErrorMinus : 0);
+        currentErrorPlus = (includeErrors ? it.value().valueErrorPlus : 0);
+        if (current-currentErrorMinus < range.lower || !haveLower)
+        {
+          range.lower = current-currentErrorMinus;
+          haveLower = true;
+        }
+        if (current+currentErrorPlus > range.upper || !haveUpper)
+        {
+          range.upper = current+currentErrorPlus;
+          haveUpper = true;
+        }
+      }
+      ++it;
+    }
+  } else if (inSignDomain == sdNegative) // range may only be in the negative sign domain
+  {
+    QCPDataMap::const_iterator it = mData->constBegin();
+    while (it != mData->constEnd())
+    {
+      current = it.value().value;
+      if (!qIsNaN(current))
+      {
+        currentErrorMinus = (includeErrors ? it.value().valueErrorMinus : 0);
+        currentErrorPlus = (includeErrors ? it.value().valueErrorPlus : 0);
+        if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus < 0)
+        {
+          range.lower = current-currentErrorMinus;
+          haveLower = true;
+        }
+        if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus < 0)
+        {
+          range.upper = current+currentErrorPlus;
+          haveUpper = true;
+        }
+        if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to get that point.
+        {
+          if ((current < range.lower || !haveLower) && current < 0)
+          {
+            range.lower = current;
+            haveLower = true;
+          }
+          if ((current > range.upper || !haveUpper) && current < 0)
+          {
+            range.upper = current;
+            haveUpper = true;
+          }
+        }
+      }
+      ++it;
+    }
+  } else if (inSignDomain == sdPositive) // range may only be in the positive sign domain
+  {
+    QCPDataMap::const_iterator it = mData->constBegin();
+    while (it != mData->constEnd())
+    {
+      current = it.value().value;
+      if (!qIsNaN(current))
+      {
+        currentErrorMinus = (includeErrors ? it.value().valueErrorMinus : 0);
+        currentErrorPlus = (includeErrors ? it.value().valueErrorPlus : 0);
+        if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus > 0)
+        {
+          range.lower = current-currentErrorMinus;
+          haveLower = true;
+        }
+        if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus > 0)
+        {
+          range.upper = current+currentErrorPlus;
+          haveUpper = true;
+        }
+        if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to geht that point.
+        {
+          if ((current < range.lower || !haveLower) && current > 0)
+          {
+            range.lower = current;
+            haveLower = true;
+          }
+          if ((current > range.upper || !haveUpper) && current > 0)
+          {
+            range.upper = current;
+            haveUpper = true;
+          }
+        }
+      }
+      ++it;
+    }
+  }
+  
+  foundRange = haveLower && haveUpper;
+  return range;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPCurveData
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPCurveData
+  \brief Holds the data of one single data point for QCPCurve.
+  
+  The container for storing multiple data points is \ref QCPCurveDataMap.
+  
+  The stored data is:
+  \li \a t: the free parameter of the curve at this curve point (cp. the mathematical vector <em>(x(t), y(t))</em>)
+  \li \a key: coordinate on the key axis of this curve point
+  \li \a value: coordinate on the value axis of this curve point
+  
+  \see QCPCurveDataMap
+*/
+
+/*!
+  Constructs a curve data point with t, key and value set to zero.
+*/
+QCPCurveData::QCPCurveData() :
+  t(0),
+  key(0),
+  value(0)
+{
+}
+
+/*!
+  Constructs a curve data point with the specified \a t, \a key and \a value.
+*/
+QCPCurveData::QCPCurveData(double t, double key, double value) :
+  t(t),
+  key(key),
+  value(value)
+{
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPCurve
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPCurve
+  \brief A plottable representing a parametric curve in a plot.
+  
+  \image html QCPCurve.png
+  
+  Unlike QCPGraph, plottables of this type may have multiple points with the same key coordinate,
+  so their visual representation can have \a loops. This is realized by introducing a third
+  coordinate \a t, which defines the order of the points described by the other two coordinates \a
+  x and \a y.
+
+  To plot data, assign it with the \ref setData or \ref addData functions.
+  
+  Gaps in the curve can be created by adding data points with NaN as key and value
+  (<tt>qQNaN()</tt> or <tt>std::numeric_limits<double>::quiet_NaN()</tt>) in between the two data points that shall be
+  separated.
+  
+  \section appearance Changing the appearance
+  
+  The appearance of the curve is determined by the pen and the brush (\ref setPen, \ref setBrush).
+  \section usage Usage
+  
+  Like all data representing objects in QCustomPlot, the QCPCurve is a plottable (QCPAbstractPlottable). So
+  the plottable-interface of QCustomPlot applies (QCustomPlot::plottable, QCustomPlot::addPlottable, QCustomPlot::removePlottable, etc.)
+  
+  Usually, you first create an instance and add it to the customPlot:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcurve-creation-1
+  and then modify the properties of the newly created plottable, e.g.:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcurve-creation-2
+*/
+
+/*!
+  Constructs a curve which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value
+  axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have
+  the same orientation. If either of these restrictions is violated, a corresponding message is
+  printed to the debug output (qDebug), the construction is not aborted, though.
+  
+  The constructed QCPCurve can be added to the plot with QCustomPlot::addPlottable, QCustomPlot
+  then takes ownership of the graph.
+*/
+QCPCurve::QCPCurve(QCPAxis *keyAxis, QCPAxis *valueAxis) :
+  QCPAbstractPlottable(keyAxis, valueAxis)
+{
+  mData = new QCPCurveDataMap;
+  mPen.setColor(Qt::blue);
+  mPen.setStyle(Qt::SolidLine);
+  mBrush.setColor(Qt::blue);
+  mBrush.setStyle(Qt::NoBrush);
+  mSelectedPen = mPen;
+  mSelectedPen.setWidthF(2.5);
+  mSelectedPen.setColor(QColor(80, 80, 255)); // lighter than Qt::blue of mPen
+  mSelectedBrush = mBrush;
+  
+  setScatterStyle(QCPScatterStyle());
+  setLineStyle(lsLine);
+}
+
+QCPCurve::~QCPCurve()
+{
+  delete mData;
+}
+
+/*!
+  Replaces the current data with the provided \a data.
+  
+  If \a copy is set to true, data points in \a data will only be copied. if false, the plottable
+  takes ownership of the passed data and replaces the internal data pointer with it. This is
+  significantly faster than copying for large datasets.
+*/
+void QCPCurve::setData(QCPCurveDataMap *data, bool copy)
+{
+  if (mData == data)
+  {
+    qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast<quintptr>(data);
+    return;
+  }
+  if (copy)
+  {
+    *mData = *data;
+  } else
+  {
+    delete mData;
+    mData = data;
+  }
+}
+
+/*! \overload
+  
+  Replaces the current data with the provided points in \a t, \a key and \a value tuples. The
+  provided vectors should have equal length. Else, the number of added points will be the size of
+  the smallest vector.
+*/
+void QCPCurve::setData(const QVector<double> &t, const QVector<double> &key, const QVector<double> &value)
+{
+  mData->clear();
+  int n = t.size();
+  n = qMin(n, key.size());
+  n = qMin(n, value.size());
+  QCPCurveData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.t = t[i];
+    newData.key = key[i];
+    newData.value = value[i];
+    mData->insertMulti(newData.t, newData);
+  }
+}
+
+/*! \overload
+  
+  Replaces the current data with the provided \a key and \a value pairs. The t parameter
+  of each data point will be set to the integer index of the respective key/value pair.
+*/
+void QCPCurve::setData(const QVector<double> &key, const QVector<double> &value)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  QCPCurveData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.t = i; // no t vector given, so we assign t the index of the key/value pair
+    newData.key = key[i];
+    newData.value = value[i];
+    mData->insertMulti(newData.t, newData);
+  }
+}
+
+/*!
+  Sets the visual appearance of single data points in the plot. If set to \ref
+  QCPScatterStyle::ssNone, no scatter points are drawn (e.g. for line-only plots with appropriate
+  line style).
+  
+  \see QCPScatterStyle, setLineStyle
+*/
+void QCPCurve::setScatterStyle(const QCPScatterStyle &style)
+{
+  mScatterStyle = style;
+}
+
+/*!
+  Sets how the single data points are connected in the plot or how they are represented visually
+  apart from the scatter symbol. For scatter-only plots, set \a style to \ref lsNone and \ref
+  setScatterStyle to the desired scatter style.
+  
+  \see setScatterStyle
+*/
+void QCPCurve::setLineStyle(QCPCurve::LineStyle style)
+{
+  mLineStyle = style;
+}
+
+/*!
+  Adds the provided data points in \a dataMap to the current data.
+  \see removeData
+*/
+void QCPCurve::addData(const QCPCurveDataMap &dataMap)
+{
+  mData->unite(dataMap);
+}
+
+/*! \overload
+  Adds the provided single data point in \a data to the current data.
+  \see removeData
+*/
+void QCPCurve::addData(const QCPCurveData &data)
+{
+  mData->insertMulti(data.t, data);
+}
+
+/*! \overload
+  Adds the provided single data point as \a t, \a key and \a value tuple to the current data
+  \see removeData
+*/
+void QCPCurve::addData(double t, double key, double value)
+{
+  QCPCurveData newData;
+  newData.t = t;
+  newData.key = key;
+  newData.value = value;
+  mData->insertMulti(newData.t, newData);
+}
+
+/*! \overload
+  
+  Adds the provided single data point as \a key and \a value pair to the current data The t
+  parameter of the data point is set to the t of the last data point plus 1. If there is no last
+  data point, t will be set to 0.
+  
+  \see removeData
+*/
+void QCPCurve::addData(double key, double value)
+{
+  QCPCurveData newData;
+  if (!mData->isEmpty())
+    newData.t = (mData->constEnd()-1).key()+1;
+  else
+    newData.t = 0;
+  newData.key = key;
+  newData.value = value;
+  mData->insertMulti(newData.t, newData);
+}
+
+/*! \overload
+  Adds the provided data points as \a t, \a key and \a value tuples to the current data.
+  \see removeData
+*/
+void QCPCurve::addData(const QVector<double> &ts, const QVector<double> &keys, const QVector<double> &values)
+{
+  int n = ts.size();
+  n = qMin(n, keys.size());
+  n = qMin(n, values.size());
+  QCPCurveData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.t = ts[i];
+    newData.key = keys[i];
+    newData.value = values[i];
+    mData->insertMulti(newData.t, newData);
+  }
+}
+
+/*!
+  Removes all data points with curve parameter t smaller than \a t.
+  \see addData, clearData
+*/
+void QCPCurve::removeDataBefore(double t)
+{
+  QCPCurveDataMap::iterator it = mData->begin();
+  while (it != mData->end() && it.key() < t)
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with curve parameter t greater than \a t.
+  \see addData, clearData
+*/
+void QCPCurve::removeDataAfter(double t)
+{
+  if (mData->isEmpty()) return;
+  QCPCurveDataMap::iterator it = mData->upperBound(t);
+  while (it != mData->end())
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with curve parameter t between \a fromt and \a tot. if \a fromt is
+  greater or equal to \a tot, the function does nothing. To remove a single data point with known
+  t, use \ref removeData(double t).
+  
+  \see addData, clearData
+*/
+void QCPCurve::removeData(double fromt, double tot)
+{
+  if (fromt >= tot || mData->isEmpty()) return;
+  QCPCurveDataMap::iterator it = mData->upperBound(fromt);
+  QCPCurveDataMap::iterator itEnd = mData->upperBound(tot);
+  while (it != itEnd)
+    it = mData->erase(it);
+}
+
+/*! \overload
+  
+  Removes a single data point at curve parameter \a t. If the position is not known with absolute
+  precision, consider using \ref removeData(double fromt, double tot) with a small fuzziness
+  interval around the suspected position, depeding on the precision with which the curve parameter
+  is known.
+  
+  \see addData, clearData
+*/
+void QCPCurve::removeData(double t)
+{
+  mData->remove(t);
+}
+
+/*!
+  Removes all data points.
+  \see removeData, removeDataAfter, removeDataBefore
+*/
+void QCPCurve::clearData()
+{
+  mData->clear();
+}
+
+/* inherits documentation from base class */
+double QCPCurve::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if ((onlySelectable && !mSelectable) || mData->isEmpty())
+    return -1;
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+  
+  if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint()))
+    return pointDistance(pos);
+  else
+    return -1;
+}
+
+/* inherits documentation from base class */
+void QCPCurve::draw(QCPPainter *painter)
+{
+  if (mData->isEmpty()) return;
+  
+  // allocate line vector:
+  QVector<QPointF> *lineData = new QVector<QPointF>;
+  
+  // fill with curve data:
+  getCurveData(lineData);
+  
+  // check data validity if flag set:
+#ifdef QCUSTOMPLOT_CHECK_DATA
+  QCPCurveDataMap::const_iterator it;
+  for (it = mData->constBegin(); it != mData->constEnd(); ++it)
+  {
+    if (QCP::isInvalidData(it.value().t) ||
+        QCP::isInvalidData(it.value().key, it.value().value))
+      qDebug() << Q_FUNC_INFO << "Data point at" << it.key() << "invalid." << "Plottable name:" << name();
+  }
+#endif
+  
+  // draw curve fill:
+  if (mainBrush().style() != Qt::NoBrush && mainBrush().color().alpha() != 0)
+  {
+    applyFillAntialiasingHint(painter);
+    painter->setPen(Qt::NoPen);
+    painter->setBrush(mainBrush());
+    painter->drawPolygon(QPolygonF(*lineData));
+  }
+  
+  // draw curve line:
+  if (mLineStyle != lsNone && mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0)
+  {
+    applyDefaultAntialiasingHint(painter);
+    painter->setPen(mainPen());
+    painter->setBrush(Qt::NoBrush);
+    // if drawing solid line and not in PDF, use much faster line drawing instead of polyline:
+    if (mParentPlot->plottingHints().testFlag(QCP::phFastPolylines) &&
+        painter->pen().style() == Qt::SolidLine &&
+        !painter->modes().testFlag(QCPPainter::pmVectorized) &&
+        !painter->modes().testFlag(QCPPainter::pmNoCaching))
+    {
+      int i = 0;
+      bool lastIsNan = false;
+      const int lineDataSize = lineData->size();
+      while (i < lineDataSize && (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x()))) // make sure first point is not NaN
+        ++i;
+      ++i; // because drawing works in 1 point retrospect
+      while (i < lineDataSize)
+      {
+        if (!qIsNaN(lineData->at(i).y()) && !qIsNaN(lineData->at(i).x())) // NaNs create a gap in the line
+        {
+          if (!lastIsNan)
+            painter->drawLine(lineData->at(i-1), lineData->at(i));
+          else
+            lastIsNan = false;
+        } else
+          lastIsNan = true;
+        ++i;
+      }
+    } else
+    {
+      int segmentStart = 0;
+      int i = 0;
+      const int lineDataSize = lineData->size();
+      while (i < lineDataSize)
+      {
+        if (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x())) // NaNs create a gap in the line
+        {
+          painter->drawPolyline(lineData->constData()+segmentStart, i-segmentStart); // i, because we don't want to include the current NaN point
+          segmentStart = i+1;
+        }
+        ++i;
+      }
+      // draw last segment:
+      painter->drawPolyline(lineData->constData()+segmentStart, lineDataSize-segmentStart);
+    }
+  }
+  
+  // draw scatters:
+  if (!mScatterStyle.isNone())
+    drawScatterPlot(painter, lineData);
+  
+  // free allocated line data:
+  delete lineData;
+}
+
+/* inherits documentation from base class */
+void QCPCurve::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const
+{
+  // draw fill:
+  if (mBrush.style() != Qt::NoBrush)
+  {
+    applyFillAntialiasingHint(painter);
+    painter->fillRect(QRectF(rect.left(), rect.top()+rect.height()/2.0, rect.width(), rect.height()/3.0), mBrush);
+  }
+  // draw line vertically centered:
+  if (mLineStyle != lsNone)
+  {
+    applyDefaultAntialiasingHint(painter);
+    painter->setPen(mPen);
+    painter->drawLine(QLineF(rect.left(), rect.top()+rect.height()/2.0, rect.right()+5, rect.top()+rect.height()/2.0)); // +5 on x2 else last segment is missing from dashed/dotted pens
+  }
+  // draw scatter symbol:
+  if (!mScatterStyle.isNone())
+  {
+    applyScattersAntialiasingHint(painter);
+    // scale scatter pixmap if it's too large to fit in legend icon rect:
+    if (mScatterStyle.shape() == QCPScatterStyle::ssPixmap && (mScatterStyle.pixmap().size().width() > rect.width() || mScatterStyle.pixmap().size().height() > rect.height()))
+    {
+      QCPScatterStyle scaledStyle(mScatterStyle);
+      scaledStyle.setPixmap(scaledStyle.pixmap().scaled(rect.size().toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
+      scaledStyle.applyTo(painter, mPen);
+      scaledStyle.drawShape(painter, QRectF(rect).center());
+    } else
+    {
+      mScatterStyle.applyTo(painter, mPen);
+      mScatterStyle.drawShape(painter, QRectF(rect).center());
+    }
+  }
+}
+
+/*! \internal
+  
+  Draws scatter symbols at every data point passed in \a pointData. scatter symbols are independent of
+  the line style and are always drawn if scatter shape is not \ref QCPScatterStyle::ssNone.
+*/
+void QCPCurve::drawScatterPlot(QCPPainter *painter, const QVector<QPointF> *pointData) const
+{
+  // draw scatter point symbols:
+  applyScattersAntialiasingHint(painter);
+  mScatterStyle.applyTo(painter, mPen);
+  for (int i=0; i<pointData->size(); ++i)
+    if (!qIsNaN(pointData->at(i).x()) && !qIsNaN(pointData->at(i).y()))
+      mScatterStyle.drawShape(painter,  pointData->at(i));
+}
+
+/*! \internal
+  
+  called by QCPCurve::draw to generate a point vector (in pixel coordinates) which represents the
+  line of the curve.
+
+  Line segments that aren't visible in the current axis rect are handled in an optimized way. They
+  are projected onto a rectangle slightly larger than the visible axis rect and simplified
+  regarding point count. The algorithm makes sure to preserve appearance of lines and fills inside
+  the visible axis rect by generating new temporary points on the outer rect if necessary.
+  
+  Methods that are also involved in the algorithm are: \ref getRegion, \ref getOptimizedPoint, \ref
+  getOptimizedCornerPoints \ref mayTraverse, \ref getTraverse, \ref getTraverseCornerPoints.
+*/
+void QCPCurve::getCurveData(QVector<QPointF> *lineData) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  
+  // add margins to rect to compensate for stroke width
+  double strokeMargin = qMax(qreal(1.0), qreal(mainPen().widthF()*0.75)); // stroke radius + 50% safety
+  if (!mScatterStyle.isNone())
+    strokeMargin = qMax(strokeMargin, mScatterStyle.size());
+  double rectLeft = keyAxis->pixelToCoord(keyAxis->coordToPixel(keyAxis->range().lower)-strokeMargin*((keyAxis->orientation()==Qt::Vertical)!=keyAxis->rangeReversed()?-1:1));
+  double rectRight = keyAxis->pixelToCoord(keyAxis->coordToPixel(keyAxis->range().upper)+strokeMargin*((keyAxis->orientation()==Qt::Vertical)!=keyAxis->rangeReversed()?-1:1));
+  double rectBottom = valueAxis->pixelToCoord(valueAxis->coordToPixel(valueAxis->range().lower)+strokeMargin*((valueAxis->orientation()==Qt::Horizontal)!=valueAxis->rangeReversed()?-1:1));
+  double rectTop = valueAxis->pixelToCoord(valueAxis->coordToPixel(valueAxis->range().upper)-strokeMargin*((valueAxis->orientation()==Qt::Horizontal)!=valueAxis->rangeReversed()?-1:1));
+  int currentRegion;
+  QCPCurveDataMap::const_iterator it = mData->constBegin();
+  QCPCurveDataMap::const_iterator prevIt = mData->constEnd()-1;
+  int prevRegion = getRegion(prevIt.value().key, prevIt.value().value, rectLeft, rectTop, rectRight, rectBottom);
+  QVector<QPointF> trailingPoints; // points that must be applied after all other points (are generated only when handling first point to get virtual segment between last and first point right)
+  while (it != mData->constEnd())
+  {
+    currentRegion = getRegion(it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom);
+    if (currentRegion != prevRegion) // changed region, possibly need to add some optimized edge points or original points if entering R
+    {
+      if (currentRegion != 5) // segment doesn't end in R, so it's a candidate for removal
+      {
+        QPointF crossA, crossB;
+        if (prevRegion == 5) // we're coming from R, so add this point optimized
+        {
+          lineData->append(getOptimizedPoint(currentRegion, it.value().key, it.value().value, prevIt.value().key, prevIt.value().value, rectLeft, rectTop, rectRight, rectBottom));
+          // in the situations 5->1/7/9/3 the segment may leave R and directly cross through two outer regions. In these cases we need to add an additional corner point
+          *lineData << getOptimizedCornerPoints(prevRegion, currentRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom);
+        } else if (mayTraverse(prevRegion, currentRegion) &&
+                   getTraverse(prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom, crossA, crossB))
+        {
+          // add the two cross points optimized if segment crosses R and if segment isn't virtual zeroth segment between last and first curve point:
+          QVector<QPointF> beforeTraverseCornerPoints, afterTraverseCornerPoints;
+          getTraverseCornerPoints(prevRegion, currentRegion, rectLeft, rectTop, rectRight, rectBottom, beforeTraverseCornerPoints, afterTraverseCornerPoints);
+          if (it != mData->constBegin())
+          {
+            *lineData << beforeTraverseCornerPoints;
+            lineData->append(crossA);
+            lineData->append(crossB);
+            *lineData << afterTraverseCornerPoints;
+          } else
+          {
+            lineData->append(crossB);
+            *lineData << afterTraverseCornerPoints;
+            trailingPoints << beforeTraverseCornerPoints << crossA ;
+          }
+        } else // doesn't cross R, line is just moving around in outside regions, so only need to add optimized point(s) at the boundary corner(s)
+        {
+          *lineData << getOptimizedCornerPoints(prevRegion, currentRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom);
+        }
+      } else // segment does end in R, so we add previous point optimized and this point at original position
+      {
+        if (it == mData->constBegin()) // it is first point in curve and prevIt is last one. So save optimized point for adding it to the lineData in the end
+          trailingPoints << getOptimizedPoint(prevRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom);
+        else
+          lineData->append(getOptimizedPoint(prevRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom));
+        lineData->append(coordsToPixels(it.value().key, it.value().value));
+      }
+    } else // region didn't change
+    {
+      if (currentRegion == 5) // still in R, keep adding original points
+      {
+        lineData->append(coordsToPixels(it.value().key, it.value().value));
+      } else // still outside R, no need to add anything
+      {
+        // see how this is not doing anything? That's the main optimization...
+      }
+    }
+    prevIt = it;
+    prevRegion = currentRegion;
+    ++it;
+  }
+  *lineData << trailingPoints;
+}
+
+/*! \internal
+  
+  This function is part of the curve optimization algorithm of \ref getCurveData.
+  
+  It returns the region of the given point (\a x, \a y) with respect to a rectangle defined by \a
+  rectLeft, \a rectTop, \a rectRight, and \a rectBottom.
+  
+  The regions are enumerated from top to bottom and left to right:
+  
+  <table style="width:10em; text-align:center">
+    <tr><td>1</td><td>4</td><td>7</td></tr>
+    <tr><td>2</td><td style="border:1px solid black">5</td><td>8</td></tr>
+    <tr><td>3</td><td>6</td><td>9</td></tr>
+  </table>
+  
+  With the rectangle being region 5, and the outer regions extending infinitely outwards. In the
+  curve optimization algorithm, region 5 is considered to be the visible portion of the plot.
+*/
+int QCPCurve::getRegion(double x, double y, double rectLeft, double rectTop, double rectRight, double rectBottom) const
+{
+  if (x < rectLeft) // region 123
+  {
+    if (y > rectTop)
+      return 1;
+    else if (y < rectBottom)
+      return 3;
+    else
+      return 2;
+  } else if (x > rectRight) // region 789
+  {
+    if (y > rectTop)
+      return 7;
+    else if (y < rectBottom)
+      return 9;
+    else
+      return 8;
+  } else // region 456
+  {
+    if (y > rectTop)
+      return 4;
+    else if (y < rectBottom)
+      return 6;
+    else
+      return 5;
+  }
+}
+
+/*! \internal
+  
+  This function is part of the curve optimization algorithm of \ref getCurveData.
+  
+  This method is used in case the current segment passes from inside the visible rect (region 5,
+  see \ref getRegion) to any of the outer regions (\a otherRegion). The current segment is given by
+  the line connecting (\a key, \a value) with (\a otherKey, \a otherValue).
+  
+  It returns the intersection point of the segment with the border of region 5.
+  
+  For this function it doesn't matter whether (\a key, \a value) is the point inside region 5 or
+  whether it's (\a otherKey, \a otherValue), i.e. whether the segment is coming from region 5 or
+  leaving it. It is important though that \a otherRegion correctly identifies the other region not
+  equal to 5.
+*/
+QPointF QCPCurve::getOptimizedPoint(int otherRegion, double otherKey, double otherValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const
+{
+  double intersectKey = rectLeft; // initial value is just fail-safe
+  double intersectValue = rectTop; // initial value is just fail-safe
+  switch (otherRegion)
+  {
+    case 1: // top and left edge
+    {
+      intersectValue = rectTop;
+      intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue);
+      if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other:
+      {
+        intersectKey = rectLeft;
+        intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey);
+      }
+      break;
+    }
+    case 2: // left edge
+    {
+      intersectKey = rectLeft;
+      intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey);
+      break;
+    }
+    case 3: // bottom and left edge
+    {
+      intersectValue = rectBottom;
+      intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue);
+      if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other:
+      {
+        intersectKey = rectLeft;
+        intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey);
+      }
+      break;
+    }
+    case 4: // top edge
+    {
+      intersectValue = rectTop;
+      intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue);
+      break;
+    }
+    case 5:
+    {
+      break; // case 5 shouldn't happen for this function but we add it anyway to prevent potential discontinuity in branch table
+    }
+    case 6: // bottom edge
+    {
+      intersectValue = rectBottom;
+      intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue);
+      break;
+    }
+    case 7: // top and right edge
+    {
+      intersectValue = rectTop;
+      intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue);
+      if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other:
+      {
+        intersectKey = rectRight;
+        intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey);
+      }
+      break;
+    }
+    case 8: // right edge
+    {
+      intersectKey = rectRight;
+      intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey);
+      break;
+    }
+    case 9: // bottom and right edge
+    {
+      intersectValue = rectBottom;
+      intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue);
+      if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other:
+      {
+        intersectKey = rectRight;
+        intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey);
+      }
+      break;
+    }
+  }
+  return coordsToPixels(intersectKey, intersectValue);
+}
+
+/*! \internal
+  
+  This function is part of the curve optimization algorithm of \ref getCurveData.
+  
+  In situations where a single segment skips over multiple regions it might become necessary to add
+  extra points at the corners of region 5 (see \ref getRegion) such that the optimized segment
+  doesn't unintentionally cut through the visible area of the axis rect and create plot artifacts.
+  This method provides these points that must be added, assuming the original segment doesn't
+  start, end, or traverse region 5. (Corner points where region 5 is traversed are calculated by
+  \ref getTraverseCornerPoints.)
+  
+  For example, consider a segment which directly goes from region 4 to 2 but originally is far out
+  to the top left such that it doesn't cross region 5. Naively optimizing these points by
+  projecting them on the top and left borders of region 5 will create a segment that surely crosses
+  5, creating a visual artifact in the plot. This method prevents this by providing extra points at
+  the top left corner, making the optimized curve correctly pass from region 4 to 1 to 2 without
+  traversing 5.
+*/
+QVector<QPointF> QCPCurve::getOptimizedCornerPoints(int prevRegion, int currentRegion, double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const
+{
+  QVector<QPointF> result;
+  switch (prevRegion)
+  {
+    case 1:
+    {
+      switch (currentRegion)
+      {
+        case 2: { result << coordsToPixels(rectLeft, rectTop); break; }
+        case 4: { result << coordsToPixels(rectLeft, rectTop); break; }
+        case 3: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectLeft, rectBottom); break; }
+        case 7: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectRight, rectTop); break; }
+        case 6: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; }
+        case 8: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; }
+        case 9: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points
+          if ((value-prevValue)/(key-prevKey)*(rectLeft-key)+value < rectBottom) // segment passes below R
+          { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); }
+          else
+          { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); }
+          break;
+        }
+      }
+      break;
+    }
+    case 2:
+    {
+      switch (currentRegion)
+      {
+        case 1: { result << coordsToPixels(rectLeft, rectTop); break; }
+        case 3: { result << coordsToPixels(rectLeft, rectBottom); break; }
+        case 4: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; }
+        case 6: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; }
+        case 7: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); break; }
+        case 9: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); break; }
+      }
+      break;
+    }
+    case 3:
+    {
+      switch (currentRegion)
+      {
+        case 2: { result << coordsToPixels(rectLeft, rectBottom); break; }
+        case 6: { result << coordsToPixels(rectLeft, rectBottom); break; }
+        case 1: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectLeft, rectTop); break; }
+        case 9: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectRight, rectBottom); break; }
+        case 4: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; }
+        case 8: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; }
+        case 7: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points
+          if ((value-prevValue)/(key-prevKey)*(rectRight-key)+value < rectBottom) // segment passes below R
+          { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); }
+          else
+          { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); }
+          break;
+        }
+      }
+      break;
+    }
+    case 4:
+    {
+      switch (currentRegion)
+      {
+        case 1: { result << coordsToPixels(rectLeft, rectTop); break; }
+        case 7: { result << coordsToPixels(rectRight, rectTop); break; }
+        case 2: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; }
+        case 8: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; }
+        case 3: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); break; }
+        case 9: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); break; }
+      }
+      break;
+    }
+    case 5:
+    {
+      switch (currentRegion)
+      {
+        case 1: { result << coordsToPixels(rectLeft, rectTop); break; }
+        case 7: { result << coordsToPixels(rectRight, rectTop); break; }
+        case 9: { result << coordsToPixels(rectRight, rectBottom); break; }
+        case 3: { result << coordsToPixels(rectLeft, rectBottom); break; }
+      }
+      break;
+    }
+    case 6:
+    {
+      switch (currentRegion)
+      {
+        case 3: { result << coordsToPixels(rectLeft, rectBottom); break; }
+        case 9: { result << coordsToPixels(rectRight, rectBottom); break; }
+        case 2: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; }
+        case 8: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; }
+        case 1: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); break; }
+        case 7: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); break; }
+      }
+      break;
+    }
+    case 7:
+    {
+      switch (currentRegion)
+      {
+        case 4: { result << coordsToPixels(rectRight, rectTop); break; }
+        case 8: { result << coordsToPixels(rectRight, rectTop); break; }
+        case 1: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectLeft, rectTop); break; }
+        case 9: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectRight, rectBottom); break; }
+        case 2: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; }
+        case 6: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; }
+        case 3: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points
+          if ((value-prevValue)/(key-prevKey)*(rectRight-key)+value < rectBottom) // segment passes below R
+          { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); }
+          else
+          { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); }
+          break;
+        }
+      }
+      break;
+    }
+    case 8:
+    {
+      switch (currentRegion)
+      {
+        case 7: { result << coordsToPixels(rectRight, rectTop); break; }
+        case 9: { result << coordsToPixels(rectRight, rectBottom); break; }
+        case 4: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; }
+        case 6: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; }
+        case 1: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); break; }
+        case 3: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); break; }
+      }
+      break;
+    }
+    case 9:
+    {
+      switch (currentRegion)
+      {
+        case 6: { result << coordsToPixels(rectRight, rectBottom); break; }
+        case 8: { result << coordsToPixels(rectRight, rectBottom); break; }
+        case 3: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectLeft, rectBottom); break; }
+        case 7: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectRight, rectTop); break; }
+        case 2: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; }
+        case 4: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; }
+        case 1: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points
+          if ((value-prevValue)/(key-prevKey)*(rectLeft-key)+value < rectBottom) // segment passes below R
+          { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); }
+          else
+          { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); }
+          break;
+        }
+      }
+      break;
+    }
+  }
+  return result;
+}
+
+/*! \internal
+  
+  This function is part of the curve optimization algorithm of \ref getCurveData.
+  
+  This method returns whether a segment going from \a prevRegion to \a currentRegion (see \ref
+  getRegion) may traverse the visible region 5. This function assumes that neither \a prevRegion
+  nor \a currentRegion is 5 itself.
+  
+  If this method returns false, the segment for sure doesn't pass region 5. If it returns true, the
+  segment may or may not pass region 5 and a more fine-grained calculation must be used (\ref
+  getTraverse).
+*/
+bool QCPCurve::mayTraverse(int prevRegion, int currentRegion) const
+{
+  switch (prevRegion)
+  {
+    case 1:
+    {
+      switch (currentRegion)
+      {
+        case 4:
+        case 7:
+        case 2:
+        case 3: return false;
+        default: return true;
+      }
+    }
+    case 2:
+    {
+      switch (currentRegion)
+      {
+        case 1:
+        case 3: return false;
+        default: return true;
+      }
+    }
+    case 3:
+    {
+      switch (currentRegion)
+      {
+        case 1:
+        case 2:
+        case 6:
+        case 9: return false;
+        default: return true;
+      }
+    }
+    case 4:
+    {
+      switch (currentRegion)
+      {
+        case 1:
+        case 7: return false;
+        default: return true;
+      }
+    }
+    case 5: return false; // should never occur
+    case 6:
+    {
+      switch (currentRegion)
+      {
+        case 3:
+        case 9: return false;
+        default: return true;
+      }
+    }
+    case 7:
+    {
+      switch (currentRegion)
+      {
+        case 1:
+        case 4:
+        case 8:
+        case 9: return false;
+        default: return true;
+      }
+    }
+    case 8:
+    {
+      switch (currentRegion)
+      {
+        case 7:
+        case 9: return false;
+        default: return true;
+      }
+    }
+    case 9:
+    {
+      switch (currentRegion)
+      {
+        case 3:
+        case 6:
+        case 8:
+        case 7: return false;
+        default: return true;
+      }
+    }
+    default: return true;
+  }
+}
+
+
+/*! \internal
+  
+  This function is part of the curve optimization algorithm of \ref getCurveData.
+  
+  This method assumes that the \ref mayTraverse test has returned true, so there is a chance the
+  segment defined by (\a prevKey, \a prevValue) and (\a key, \a value) goes through the visible
+  region 5.
+  
+  The return value of this method indicates whether the segment actually traverses region 5 or not.
+  
+  If the segment traverses 5, the output parameters \a crossA and \a crossB indicate the entry and
+  exit points of region 5. They will become the optimized points for that segment.
+*/
+bool QCPCurve::getTraverse(double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom, QPointF &crossA, QPointF &crossB) const
+{
+  QList<QPointF> intersections; // x of QPointF corresponds to key and y to value
+  if (qFuzzyIsNull(key-prevKey)) // line is parallel to value axis
+  {
+    // due to region filter in mayTraverseR(), if line is parallel to value or key axis, R is traversed here
+    intersections.append(QPointF(key, rectBottom)); // direction will be taken care of at end of method
+    intersections.append(QPointF(key, rectTop));
+  } else if (qFuzzyIsNull(value-prevValue)) // line is parallel to key axis
+  {
+    // due to region filter in mayTraverseR(), if line is parallel to value or key axis, R is traversed here
+    intersections.append(QPointF(rectLeft, value)); // direction will be taken care of at end of method
+    intersections.append(QPointF(rectRight, value));
+  } else // line is skewed
+  {
+    double gamma;
+    double keyPerValue = (key-prevKey)/(value-prevValue);
+    // check top of rect:
+    gamma = prevKey + (rectTop-prevValue)*keyPerValue;
+    if (gamma >= rectLeft && gamma <= rectRight)
+      intersections.append(QPointF(gamma, rectTop));
+    // check bottom of rect:
+    gamma = prevKey + (rectBottom-prevValue)*keyPerValue;
+    if (gamma >= rectLeft && gamma <= rectRight)
+      intersections.append(QPointF(gamma, rectBottom));
+    double valuePerKey = 1.0/keyPerValue;
+    // check left of rect:
+    gamma = prevValue + (rectLeft-prevKey)*valuePerKey;
+    if (gamma >= rectBottom && gamma <= rectTop)
+      intersections.append(QPointF(rectLeft, gamma));
+    // check right of rect:
+    gamma = prevValue + (rectRight-prevKey)*valuePerKey;
+    if (gamma >= rectBottom && gamma <= rectTop)
+      intersections.append(QPointF(rectRight, gamma));
+  }
+  
+  // handle cases where found points isn't exactly 2:
+  if (intersections.size() > 2)
+  {
+    // line probably goes through corner of rect, and we got duplicate points there. single out the point pair with greatest distance in between:
+    double distSqrMax = 0;
+    QPointF pv1, pv2;
+    for (int i=0; i<intersections.size()-1; ++i)
+    {
+      for (int k=i+1; k<intersections.size(); ++k)
+      {
+        QPointF distPoint = intersections.at(i)-intersections.at(k);
+        double distSqr = distPoint.x()*distPoint.x()+distPoint.y()+distPoint.y();
+        if (distSqr > distSqrMax)
+        {
+          pv1 = intersections.at(i);
+          pv2 = intersections.at(k);
+          distSqrMax = distSqr;
+        }
+      }
+    }
+    intersections = QList<QPointF>() << pv1 << pv2;
+  } else if (intersections.size() != 2)
+  {
+    // one or even zero points found (shouldn't happen unless line perfectly tangent to corner), no need to draw segment
+    return false;
+  }
+  
+  // possibly re-sort points so optimized point segment has same direction as original segment:
+  if ((key-prevKey)*(intersections.at(1).x()-intersections.at(0).x()) + (value-prevValue)*(intersections.at(1).y()-intersections.at(0).y()) < 0) // scalar product of both segments < 0 -> opposite direction
+    intersections.move(0, 1);
+  crossA = coordsToPixels(intersections.at(0).x(), intersections.at(0).y());
+  crossB = coordsToPixels(intersections.at(1).x(), intersections.at(1).y());
+  return true;
+}
+
+/*! \internal
+  
+  This function is part of the curve optimization algorithm of \ref getCurveData.
+  
+  This method assumes that the \ref getTraverse test has returned true, so the segment definitely
+  traverses the visible region 5 when going from \a prevRegion to \a currentRegion.
+  
+  In certain situations it is not sufficient to merely generate the entry and exit points of the
+  segment into/out of region 5, as \ref getTraverse provides. It may happen that a single segment, in
+  addition to traversing region 5, skips another region outside of region 5, which makes it
+  necessary to add an optimized corner point there (very similar to the job \ref
+  getOptimizedCornerPoints does for segments that are completely in outside regions and don't
+  traverse 5).
+  
+  As an example, consider a segment going from region 1 to region 6, traversing the lower left
+  corner of region 5. In this configuration, the segment additionally crosses the border between
+  region 1 and 2 before entering region 5. This makes it necessary to add an additional point in
+  the top left corner, before adding the optimized traverse points. So in this case, the output
+  parameter \a beforeTraverse will contain the top left corner point, and \a afterTraverse will be
+  empty.
+  
+  In some cases, such as when going from region 1 to 9, it may even be necessary to add additional
+  corner points before and after the traverse. Then both \a beforeTraverse and \a afterTraverse
+  return the respective corner points.
+*/
+void QCPCurve::getTraverseCornerPoints(int prevRegion, int currentRegion, double rectLeft, double rectTop, double rectRight, double rectBottom, QVector<QPointF> &beforeTraverse, QVector<QPointF> &afterTraverse) const
+{
+  switch (prevRegion)
+  {
+    case 1:
+    {
+      switch (currentRegion)
+      {
+        case 6: { beforeTraverse << coordsToPixels(rectLeft, rectTop); break; }
+        case 9: { beforeTraverse << coordsToPixels(rectLeft, rectTop); afterTraverse << coordsToPixels(rectRight, rectBottom); break; }
+        case 8: { beforeTraverse << coordsToPixels(rectLeft, rectTop); break; }
+      }
+      break;
+    }
+    case 2:
+    {
+      switch (currentRegion)
+      {
+        case 7: { afterTraverse << coordsToPixels(rectRight, rectTop); break; }
+        case 9: { afterTraverse << coordsToPixels(rectRight, rectBottom); break; }
+      }
+      break;
+    }
+    case 3:
+    {
+      switch (currentRegion)
+      {
+        case 4: { beforeTraverse << coordsToPixels(rectLeft, rectBottom); break; }
+        case 7: { beforeTraverse << coordsToPixels(rectLeft, rectBottom); afterTraverse << coordsToPixels(rectRight, rectTop); break; }
+        case 8: { beforeTraverse << coordsToPixels(rectLeft, rectBottom); break; }
+      }
+      break;
+    }
+    case 4:
+    {
+      switch (currentRegion)
+      {
+        case 3: { afterTraverse << coordsToPixels(rectLeft, rectBottom); break; }
+        case 9: { afterTraverse << coordsToPixels(rectRight, rectBottom); break; }
+      }
+      break;
+    }
+    case 5: { break; } // shouldn't happen because this method only handles full traverses
+    case 6:
+    {
+      switch (currentRegion)
+      {
+        case 1: { afterTraverse << coordsToPixels(rectLeft, rectTop); break; }
+        case 7: { afterTraverse << coordsToPixels(rectRight, rectTop); break; }
+      }
+      break;
+    }
+    case 7:
+    {
+      switch (currentRegion)
+      {
+        case 2: { beforeTraverse << coordsToPixels(rectRight, rectTop); break; }
+        case 3: { beforeTraverse << coordsToPixels(rectRight, rectTop); afterTraverse << coordsToPixels(rectLeft, rectBottom); break; }
+        case 6: { beforeTraverse << coordsToPixels(rectRight, rectTop); break; }
+      }
+      break;
+    }
+    case 8:
+    {
+      switch (currentRegion)
+      {
+        case 1: { afterTraverse << coordsToPixels(rectLeft, rectTop); break; }
+        case 3: { afterTraverse << coordsToPixels(rectLeft, rectBottom); break; }
+      }
+      break;
+    }
+    case 9:
+    {
+      switch (currentRegion)
+      {
+        case 2: { beforeTraverse << coordsToPixels(rectRight, rectBottom); break; }
+        case 1: { beforeTraverse << coordsToPixels(rectRight, rectBottom); afterTraverse << coordsToPixels(rectLeft, rectTop); break; }
+        case 4: { beforeTraverse << coordsToPixels(rectRight, rectBottom); break; }
+      }
+      break;
+    }
+  }
+}
+
+/*! \internal
+  
+  Calculates the (minimum) distance (in pixels) the curve's representation has from the given \a
+  pixelPoint in pixels. This is used to determine whether the curve was clicked or not, e.g. in
+  \ref selectTest.
+*/
+double QCPCurve::pointDistance(const QPointF &pixelPoint) const
+{
+  if (mData->isEmpty())
+  {
+    qDebug() << Q_FUNC_INFO << "requested point distance on curve" << mName << "without data";
+    return 500;
+  }
+  if (mData->size() == 1)
+  {
+    QPointF dataPoint = coordsToPixels(mData->constBegin().key(), mData->constBegin().value().value);
+    return QVector2D(dataPoint-pixelPoint).length();
+  }
+  
+  // calculate minimum distance to line segments:
+  QVector<QPointF> *lineData = new QVector<QPointF>;
+  getCurveData(lineData);
+  double minDistSqr = std::numeric_limits<double>::max();
+  for (int i=0; i<lineData->size()-1; ++i)
+  {
+    double currentDistSqr = distSqrToLine(lineData->at(i), lineData->at(i+1), pixelPoint);
+    if (currentDistSqr < minDistSqr)
+      minDistSqr = currentDistSqr;
+  }
+  delete lineData;
+  return qSqrt(minDistSqr);
+}
+
+/* inherits documentation from base class */
+QCPRange QCPCurve::getKeyRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  QCPRange range;
+  bool haveLower = false;
+  bool haveUpper = false;
+  
+  double current;
+  
+  QCPCurveDataMap::const_iterator it = mData->constBegin();
+  while (it != mData->constEnd())
+  {
+    current = it.value().key;
+    if (!qIsNaN(current) && !qIsNaN(it.value().value))
+    {
+      if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0))
+      {
+        if (current < range.lower || !haveLower)
+        {
+          range.lower = current;
+          haveLower = true;
+        }
+        if (current > range.upper || !haveUpper)
+        {
+          range.upper = current;
+          haveUpper = true;
+        }
+      }
+    }
+    ++it;
+  }
+  
+  foundRange = haveLower && haveUpper;
+  return range;
+}
+
+/* inherits documentation from base class */
+QCPRange QCPCurve::getValueRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  QCPRange range;
+  bool haveLower = false;
+  bool haveUpper = false;
+  
+  double current;
+  
+  QCPCurveDataMap::const_iterator it = mData->constBegin();
+  while (it != mData->constEnd())
+  {
+    current = it.value().value;
+    if (!qIsNaN(current) && !qIsNaN(it.value().key))
+    {
+      if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0))
+      {
+        if (current < range.lower || !haveLower)
+        {
+          range.lower = current;
+          haveLower = true;
+        }
+        if (current > range.upper || !haveUpper)
+        {
+          range.upper = current;
+          haveUpper = true;
+        }
+      }
+    }
+    ++it;
+  }
+  
+  foundRange = haveLower && haveUpper;
+  return range;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPBarsGroup
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPBarsGroup
+  \brief Groups multiple QCPBars together so they appear side by side
+  
+  \image html QCPBarsGroup.png
+  
+  When showing multiple QCPBars in one plot which have bars at identical keys, it may be desirable
+  to have them appearing next to each other at each key. This is what adding the respective QCPBars
+  plottables to a QCPBarsGroup achieves. (An alternative approach is to stack them on top of each
+  other, see \ref QCPBars::moveAbove.)
+  
+  \section qcpbarsgroup-usage Usage
+  
+  To add a QCPBars plottable to the group, create a new group and then add the respective bars
+  intances:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbarsgroup-creation
+  Alternatively to appending to the group like shown above, you can also set the group on the
+  QCPBars plottable via \ref QCPBars::setBarsGroup.
+  
+  The spacing between the bars can be configured via \ref setSpacingType and \ref setSpacing. The
+  bars in this group appear in the plot in the order they were appended. To insert a bars plottable
+  at a certain index position, or to reposition a bars plottable which is already in the group, use
+  \ref insert.
+  
+  To remove specific bars from the group, use either \ref remove or call \ref
+  QCPBars::setBarsGroup "QCPBars::setBarsGroup(0)" on the respective bars plottable.
+  
+  To clear the entire group, call \ref clear, or simply delete the group.
+  
+  \section qcpbarsgroup-example Example
+  
+  The image above is generated with the following code:
+  \snippet documentation/doc-image-generator/mainwindow.cpp qcpbarsgroup-example
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn QList<QCPBars*> QCPBarsGroup::bars() const
+  
+  Returns all bars currently in this group.
+  
+  \see bars(int index)
+*/
+
+/*! \fn int QCPBarsGroup::size() const
+  
+  Returns the number of QCPBars plottables that are part of this group.
+  
+*/
+
+/*! \fn bool QCPBarsGroup::isEmpty() const
+  
+  Returns whether this bars group is empty.
+  
+  \see size
+*/
+
+/*! \fn bool QCPBarsGroup::contains(QCPBars *bars)
+  
+  Returns whether the specified \a bars plottable is part of this group.
+  
+*/
+
+/* end of documentation of inline functions */
+
+/*!
+  Constructs a new bars group for the specified QCustomPlot instance.
+*/
+QCPBarsGroup::QCPBarsGroup(QCustomPlot *parentPlot) :
+  QObject(parentPlot),
+  mParentPlot(parentPlot),
+  mSpacingType(stAbsolute),
+  mSpacing(4)
+{
+}
+
+QCPBarsGroup::~QCPBarsGroup()
+{
+  clear();
+}
+
+/*!
+  Sets how the spacing between adjacent bars is interpreted. See \ref SpacingType.
+  
+  The actual spacing can then be specified with \ref setSpacing.
+
+  \see setSpacing
+*/
+void QCPBarsGroup::setSpacingType(SpacingType spacingType)
+{
+  mSpacingType = spacingType;
+}
+
+/*!
+  Sets the spacing between adjacent bars. What the number passed as \a spacing actually means, is
+  defined by the current \ref SpacingType, which can be set with \ref setSpacingType.
+
+  \see setSpacingType
+*/
+void QCPBarsGroup::setSpacing(double spacing)
+{
+  mSpacing = spacing;
+}
+
+/*!
+  Returns the QCPBars instance with the specified \a index in this group. If no such QCPBars
+  exists, returns 0.
+
+  \see bars(), size
+*/
+QCPBars *QCPBarsGroup::bars(int index) const
+{
+  if (index >= 0 && index < mBars.size())
+  {
+    return mBars.at(index);
+  } else
+  {
+    qDebug() << Q_FUNC_INFO << "index out of bounds:" << index;
+    return 0;
+  }
+}
+
+/*!
+  Removes all QCPBars plottables from this group.
+
+  \see isEmpty
+*/
+void QCPBarsGroup::clear()
+{
+  foreach (QCPBars *bars, mBars) // since foreach takes a copy, removing bars in the loop is okay
+    bars->setBarsGroup(0); // removes itself via removeBars
+}
+
+/*!
+  Adds the specified \a bars plottable to this group. Alternatively, you can also use \ref
+  QCPBars::setBarsGroup on the \a bars instance.
+
+  \see insert, remove
+*/
+void QCPBarsGroup::append(QCPBars *bars)
+{
+  if (!bars)
+  {
+    qDebug() << Q_FUNC_INFO << "bars is 0";
+    return;
+  }
+    
+  if (!mBars.contains(bars))
+    bars->setBarsGroup(this);
+  else
+    qDebug() << Q_FUNC_INFO << "bars plottable is already in this bars group:" << reinterpret_cast<quintptr>(bars);
+}
+
+/*!
+  Inserts the specified \a bars plottable into this group at the specified index position \a i.
+  This gives you full control over the ordering of the bars.
+  
+  \a bars may already be part of this group. In that case, \a bars is just moved to the new index
+  position.
+
+  \see append, remove
+*/
+void QCPBarsGroup::insert(int i, QCPBars *bars)
+{
+  if (!bars)
+  {
+    qDebug() << Q_FUNC_INFO << "bars is 0";
+    return;
+  }
+  
+  // first append to bars list normally:
+  if (!mBars.contains(bars))
+    bars->setBarsGroup(this);
+  // then move to according position:
+  mBars.move(mBars.indexOf(bars), qBound(0, i, mBars.size()-1));
+}
+
+/*!
+  Removes the specified \a bars plottable from this group.
+  
+  \see contains, clear
+*/
+void QCPBarsGroup::remove(QCPBars *bars)
+{
+  if (!bars)
+  {
+    qDebug() << Q_FUNC_INFO << "bars is 0";
+    return;
+  }
+  
+  if (mBars.contains(bars))
+    bars->setBarsGroup(0);
+  else
+    qDebug() << Q_FUNC_INFO << "bars plottable is not in this bars group:" << reinterpret_cast<quintptr>(bars);
+}
+
+/*! \internal
+  
+  Adds the specified \a bars to the internal mBars list of bars. This method does not change the
+  barsGroup property on \a bars.
+  
+  \see unregisterBars
+*/
+void QCPBarsGroup::registerBars(QCPBars *bars)
+{
+  if (!mBars.contains(bars))
+    mBars.append(bars);
+}
+
+/*! \internal
+  
+  Removes the specified \a bars from the internal mBars list of bars. This method does not change
+  the barsGroup property on \a bars.
+  
+  \see registerBars
+*/
+void QCPBarsGroup::unregisterBars(QCPBars *bars)
+{
+  mBars.removeOne(bars);
+}
+
+/*! \internal
+  
+  Returns the pixel offset in the key dimension the specified \a bars plottable should have at the
+  given key coordinate \a keyCoord. The offset is relative to the pixel position of the key
+  coordinate \a keyCoord.
+*/
+double QCPBarsGroup::keyPixelOffset(const QCPBars *bars, double keyCoord)
+{
+  // find list of all base bars in case some mBars are stacked:
+  QList<const QCPBars*> baseBars;
+  foreach (const QCPBars *b, mBars)
+  {
+    while (b->barBelow())
+      b = b->barBelow();
+    if (!baseBars.contains(b))
+      baseBars.append(b);
+  }
+  // find base bar this "bars" is stacked on:
+  const QCPBars *thisBase = bars;
+  while (thisBase->barBelow())
+    thisBase = thisBase->barBelow();
+  
+  // determine key pixel offset of this base bars considering all other base bars in this barsgroup:
+  double result = 0;
+  int index = baseBars.indexOf(thisBase);
+  if (index >= 0)
+  {
+    int startIndex;
+    double lowerPixelWidth, upperPixelWidth;
+    if (baseBars.size() % 2 == 1 && index == (baseBars.size()-1)/2) // is center bar (int division on purpose)
+    {
+      return result;
+    } else if (index < (baseBars.size()-1)/2.0) // bar is to the left of center
+    {
+      if (baseBars.size() % 2 == 0) // even number of bars
+      {
+        startIndex = baseBars.size()/2-1;
+        result -= getPixelSpacing(baseBars.at(startIndex), keyCoord)*0.5; // half of middle spacing
+      } else // uneven number of bars
+      {
+        startIndex = (baseBars.size()-1)/2-1;
+        baseBars.at((baseBars.size()-1)/2)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth);
+        result -= qAbs(upperPixelWidth-lowerPixelWidth)*0.5; // half of center bar
+        result -= getPixelSpacing(baseBars.at((baseBars.size()-1)/2), keyCoord); // center bar spacing
+      }
+      for (int i=startIndex; i>index; --i) // add widths and spacings of bars in between center and our bars
+      {
+        baseBars.at(i)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth);
+        result -= qAbs(upperPixelWidth-lowerPixelWidth);
+        result -= getPixelSpacing(baseBars.at(i), keyCoord);
+      }
+      // finally half of our bars width:
+      baseBars.at(index)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth);
+      result -= qAbs(upperPixelWidth-lowerPixelWidth)*0.5;
+    } else // bar is to the right of center
+    {
+      if (baseBars.size() % 2 == 0) // even number of bars
+      {
+        startIndex = baseBars.size()/2;
+        result += getPixelSpacing(baseBars.at(startIndex), keyCoord)*0.5; // half of middle spacing
+      } else // uneven number of bars
+      {
+        startIndex = (baseBars.size()-1)/2+1;
+        baseBars.at((baseBars.size()-1)/2)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth);
+        result += qAbs(upperPixelWidth-lowerPixelWidth)*0.5; // half of center bar
+        result += getPixelSpacing(baseBars.at((baseBars.size()-1)/2), keyCoord); // center bar spacing
+      }
+      for (int i=startIndex; i<index; ++i) // add widths and spacings of bars in between center and our bars
+      {
+        baseBars.at(i)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth);
+        result += qAbs(upperPixelWidth-lowerPixelWidth);
+        result += getPixelSpacing(baseBars.at(i), keyCoord);
+      }
+      // finally half of our bars width:
+      baseBars.at(index)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth);
+      result += qAbs(upperPixelWidth-lowerPixelWidth)*0.5;
+    }
+  }
+  return result;
+}
+
+/*! \internal
+  
+  Returns the spacing in pixels which is between this \a bars and the following one, both at the
+  key coordinate \a keyCoord.
+  
+  \note Typically the returned value doesn't depend on \a bars or \a keyCoord. \a bars is only
+  needed to get acces to the key axis transformation and axis rect for the modes \ref
+  stAxisRectRatio and \ref stPlotCoords. The \a keyCoord is only relevant for spacings given in
+  \ref stPlotCoords on a logarithmic axis.
+*/
+double QCPBarsGroup::getPixelSpacing(const QCPBars *bars, double keyCoord)
+{
+  switch (mSpacingType)
+  {
+    case stAbsolute:
+    {
+      return mSpacing;
+    }
+    case stAxisRectRatio:
+    {
+      if (bars->keyAxis()->orientation() == Qt::Horizontal)
+        return bars->keyAxis()->axisRect()->width()*mSpacing;
+      else
+        return bars->keyAxis()->axisRect()->height()*mSpacing;
+    }
+    case stPlotCoords:
+    {
+      double keyPixel = bars->keyAxis()->coordToPixel(keyCoord);
+      return bars->keyAxis()->coordToPixel(keyCoord+mSpacing)-keyPixel;
+    }
+  }
+  return 0;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPBarData
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPBarData
+  \brief Holds the data of one single data point (one bar) for QCPBars.
+  
+  The container for storing multiple data points is \ref QCPBarDataMap.
+  
+  The stored data is:
+  \li \a key: coordinate on the key axis of this bar
+  \li \a value: height coordinate on the value axis of this bar
+  
+  \see QCPBarDataaMap
+*/
+
+/*!
+  Constructs a bar data point with key and value set to zero.
+*/
+QCPBarData::QCPBarData() :
+  key(0),
+  value(0)
+{
+}
+
+/*!
+  Constructs a bar data point with the specified \a key and \a value.
+*/
+QCPBarData::QCPBarData(double key, double value) :
+  key(key),
+  value(value)
+{
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPBars
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPBars
+  \brief A plottable representing a bar chart in a plot.
+
+  \image html QCPBars.png
+  
+  To plot data, assign it with the \ref setData or \ref addData functions.
+  
+  \section appearance Changing the appearance
+  
+  The appearance of the bars is determined by the pen and the brush (\ref setPen, \ref setBrush).
+  The width of the individual bars can be controlled with \ref setWidthType and \ref setWidth.
+  
+  Bar charts are stackable. This means, two QCPBars plottables can be placed on top of each other
+  (see \ref QCPBars::moveAbove). So when two bars are at the same key position, they will appear
+  stacked.
+  
+  If you would like to group multiple QCPBars plottables together so they appear side by side as
+  shown below, use QCPBarsGroup.
+  
+  \image html QCPBarsGroup.png
+  
+  \section usage Usage
+  
+  Like all data representing objects in QCustomPlot, the QCPBars is a plottable
+  (QCPAbstractPlottable). So the plottable-interface of QCustomPlot applies
+  (QCustomPlot::plottable, QCustomPlot::addPlottable, QCustomPlot::removePlottable, etc.)
+  
+  Usually, you first create an instance:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-creation-1
+  add it to the customPlot with QCustomPlot::addPlottable:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-creation-2
+  and then modify the properties of the newly created plottable, e.g.:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-creation-3
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn QCPBars *QCPBars::barBelow() const
+  Returns the bars plottable that is directly below this bars plottable.
+  If there is no such plottable, returns 0.
+  
+  \see barAbove, moveBelow, moveAbove
+*/
+
+/*! \fn QCPBars *QCPBars::barAbove() const
+  Returns the bars plottable that is directly above this bars plottable.
+  If there is no such plottable, returns 0.
+  
+  \see barBelow, moveBelow, moveAbove
+*/
+
+/* end of documentation of inline functions */
+
+/*!
+  Constructs a bar chart which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value
+  axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have
+  the same orientation. If either of these restrictions is violated, a corresponding message is
+  printed to the debug output (qDebug), the construction is not aborted, though.
+  
+  The constructed QCPBars can be added to the plot with QCustomPlot::addPlottable, QCustomPlot
+  then takes ownership of the bar chart.
+*/
+QCPBars::QCPBars(QCPAxis *keyAxis, QCPAxis *valueAxis) :
+  QCPAbstractPlottable(keyAxis, valueAxis),
+  mData(new QCPBarDataMap),
+  mWidth(0.75),
+  mWidthType(wtPlotCoords),
+  mBarsGroup(0),
+  mBaseValue(0)
+{
+  // modify inherited properties from abstract plottable:
+  mPen.setColor(Qt::blue);
+  mPen.setStyle(Qt::SolidLine);
+  mBrush.setColor(QColor(40, 50, 255, 30));
+  mBrush.setStyle(Qt::SolidPattern);
+  mSelectedPen = mPen;
+  mSelectedPen.setWidthF(2.5);
+  mSelectedPen.setColor(QColor(80, 80, 255)); // lighter than Qt::blue of mPen
+  mSelectedBrush = mBrush;
+}
+
+QCPBars::~QCPBars()
+{
+  setBarsGroup(0);
+  if (mBarBelow || mBarAbove)
+    connectBars(mBarBelow.data(), mBarAbove.data()); // take this bar out of any stacking
+  delete mData;
+}
+
+/*!
+  Sets the width of the bars.
+
+  How the number passed as \a width is interpreted (e.g. screen pixels, plot coordinates,...),
+  depends on the currently set width type, see \ref setWidthType and \ref WidthType.
+*/
+void QCPBars::setWidth(double width)
+{
+  mWidth = width;
+}
+
+/*!
+  Sets how the width of the bars is defined. See the documentation of \ref WidthType for an
+  explanation of the possible values for \a widthType.
+  
+  The default value is \ref wtPlotCoords.
+  
+  \see setWidth
+*/
+void QCPBars::setWidthType(QCPBars::WidthType widthType)
+{
+  mWidthType = widthType;
+}
+
+/*!
+  Sets to which QCPBarsGroup this QCPBars instance belongs to. Alternatively, you can also use \ref
+  QCPBarsGroup::append.
+  
+  To remove this QCPBars from any group, set \a barsGroup to 0.
+*/
+void QCPBars::setBarsGroup(QCPBarsGroup *barsGroup)
+{
+  // deregister at old group:
+  if (mBarsGroup)
+    mBarsGroup->unregisterBars(this);
+  mBarsGroup = barsGroup;
+  // register at new group:
+  if (mBarsGroup)
+    mBarsGroup->registerBars(this);
+}
+
+/*!
+  Sets the base value of this bars plottable.
+
+  The base value defines where on the value coordinate the bars start. How far the bars extend from
+  the base value is given by their individual value data. For example, if the base value is set to
+  1, a bar with data value 2 will have its lowest point at value coordinate 1 and highest point at
+  3.
+  
+  For stacked bars, only the base value of the bottom-most QCPBars has meaning.
+  
+  The default base value is 0.
+*/
+void QCPBars::setBaseValue(double baseValue)
+{
+  mBaseValue = baseValue;
+}
+
+/*!
+  Replaces the current data with the provided \a data.
+  
+  If \a copy is set to true, data points in \a data will only be copied. if false, the plottable
+  takes ownership of the passed data and replaces the internal data pointer with it. This is
+  significantly faster than copying for large datasets.
+*/
+void QCPBars::setData(QCPBarDataMap *data, bool copy)
+{
+  if (mData == data)
+  {
+    qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast<quintptr>(data);
+    return;
+  }
+  if (copy)
+  {
+    *mData = *data;
+  } else
+  {
+    delete mData;
+    mData = data;
+  }
+}
+
+/*! \overload
+  
+  Replaces the current data with the provided points in \a key and \a value tuples. The
+  provided vectors should have equal length. Else, the number of added points will be the size of
+  the smallest vector.
+*/
+void QCPBars::setData(const QVector<double> &key, const QVector<double> &value)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, value.size());
+  QCPBarData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = key[i];
+    newData.value = value[i];
+    mData->insertMulti(newData.key, newData);
+  }
+}
+
+/*!
+  Moves this bars plottable below \a bars. In other words, the bars of this plottable will appear
+  below the bars of \a bars. The move target \a bars must use the same key and value axis as this
+  plottable.
+  
+  Inserting into and removing from existing bar stacking is handled gracefully. If \a bars already
+  has a bars object below itself, this bars object is inserted between the two. If this bars object
+  is already between two other bars, the two other bars will be stacked on top of each other after
+  the operation.
+  
+  To remove this bars plottable from any stacking, set \a bars to 0.
+  
+  \see moveBelow, barAbove, barBelow
+*/
+void QCPBars::moveBelow(QCPBars *bars)
+{
+  if (bars == this) return;
+  if (bars && (bars->keyAxis() != mKeyAxis.data() || bars->valueAxis() != mValueAxis.data()))
+  {
+    qDebug() << Q_FUNC_INFO << "passed QCPBars* doesn't have same key and value axis as this QCPBars";
+    return;
+  }
+  // remove from stacking:
+  connectBars(mBarBelow.data(), mBarAbove.data()); // Note: also works if one (or both) of them is 0
+  // if new bar given, insert this bar below it:
+  if (bars)
+  {
+    if (bars->mBarBelow)
+      connectBars(bars->mBarBelow.data(), this);
+    connectBars(this, bars);
+  }
+}
+
+/*!
+  Moves this bars plottable above \a bars. In other words, the bars of this plottable will appear
+  above the bars of \a bars. The move target \a bars must use the same key and value axis as this
+  plottable.
+  
+  Inserting into and removing from existing bar stacking is handled gracefully. If \a bars already
+  has a bars object above itself, this bars object is inserted between the two. If this bars object
+  is already between two other bars, the two other bars will be stacked on top of each other after
+  the operation.
+  
+  To remove this bars plottable from any stacking, set \a bars to 0.
+  
+  \see moveBelow, barBelow, barAbove
+*/
+void QCPBars::moveAbove(QCPBars *bars)
+{
+  if (bars == this) return;
+  if (bars && (bars->keyAxis() != mKeyAxis.data() || bars->valueAxis() != mValueAxis.data()))
+  {
+    qDebug() << Q_FUNC_INFO << "passed QCPBars* doesn't have same key and value axis as this QCPBars";
+    return;
+  }
+  // remove from stacking:
+  connectBars(mBarBelow.data(), mBarAbove.data()); // Note: also works if one (or both) of them is 0
+  // if new bar given, insert this bar above it:
+  if (bars)
+  {
+    if (bars->mBarAbove)
+      connectBars(this, bars->mBarAbove.data());
+    connectBars(bars, this);
+  }
+}
+
+/*!
+  Adds the provided data points in \a dataMap to the current data.
+  \see removeData
+*/
+void QCPBars::addData(const QCPBarDataMap &dataMap)
+{
+  mData->unite(dataMap);
+}
+
+/*! \overload
+  Adds the provided single data point in \a data to the current data.
+  \see removeData
+*/
+void QCPBars::addData(const QCPBarData &data)
+{
+  mData->insertMulti(data.key, data);
+}
+
+/*! \overload
+  Adds the provided single data point as \a key and \a value tuple to the current data
+  \see removeData
+*/
+void QCPBars::addData(double key, double value)
+{
+  QCPBarData newData;
+  newData.key = key;
+  newData.value = value;
+  mData->insertMulti(newData.key, newData);
+}
+
+/*! \overload
+  Adds the provided data points as \a key and \a value tuples to the current data.
+  \see removeData
+*/
+void QCPBars::addData(const QVector<double> &keys, const QVector<double> &values)
+{
+  int n = keys.size();
+  n = qMin(n, values.size());
+  QCPBarData newData;
+  for (int i=0; i<n; ++i)
+  {
+    newData.key = keys[i];
+    newData.value = values[i];
+    mData->insertMulti(newData.key, newData);
+  }
+}
+
+/*!
+  Removes all data points with key smaller than \a key.
+  \see addData, clearData
+*/
+void QCPBars::removeDataBefore(double key)
+{
+  QCPBarDataMap::iterator it = mData->begin();
+  while (it != mData->end() && it.key() < key)
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with key greater than \a key.
+  \see addData, clearData
+*/
+void QCPBars::removeDataAfter(double key)
+{
+  if (mData->isEmpty()) return;
+  QCPBarDataMap::iterator it = mData->upperBound(key);
+  while (it != mData->end())
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with key between \a fromKey and \a toKey. if \a fromKey is
+  greater or equal to \a toKey, the function does nothing. To remove a single data point with known
+  key, use \ref removeData(double key).
+  
+  \see addData, clearData
+*/
+void QCPBars::removeData(double fromKey, double toKey)
+{
+  if (fromKey >= toKey || mData->isEmpty()) return;
+  QCPBarDataMap::iterator it = mData->upperBound(fromKey);
+  QCPBarDataMap::iterator itEnd = mData->upperBound(toKey);
+  while (it != itEnd)
+    it = mData->erase(it);
+}
+
+/*! \overload
+  
+  Removes a single data point at \a key. If the position is not known with absolute precision,
+  consider using \ref removeData(double fromKey, double toKey) with a small fuzziness interval
+  around the suspected position, depeding on the precision with which the key is known.
+  
+  \see addData, clearData
+*/
+void QCPBars::removeData(double key)
+{
+  mData->remove(key);
+}
+
+/*!
+  Removes all data points.
+  \see removeData, removeDataAfter, removeDataBefore
+*/
+void QCPBars::clearData()
+{
+  mData->clear();
+}
+
+/* inherits documentation from base class */
+double QCPBars::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+  
+  if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint()))
+  {
+    QCPBarDataMap::ConstIterator it;
+    for (it = mData->constBegin(); it != mData->constEnd(); ++it)
+    {
+      if (getBarPolygon(it.value().key, it.value().value).boundingRect().contains(pos))
+        return mParentPlot->selectionTolerance()*0.99;
+    }
+  }
+  return -1;
+}
+
+/* inherits documentation from base class */
+void QCPBars::draw(QCPPainter *painter)
+{
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  if (mData->isEmpty()) return;
+  
+  QCPBarDataMap::const_iterator it, lower, upperEnd;
+  getVisibleDataBounds(lower, upperEnd);
+  for (it = lower; it != upperEnd; ++it)
+  {
+    // check data validity if flag set:
+#ifdef QCUSTOMPLOT_CHECK_DATA
+    if (QCP::isInvalidData(it.value().key, it.value().value))
+      qDebug() << Q_FUNC_INFO << "Data point at" << it.key() << "of drawn range invalid." << "Plottable name:" << name();
+#endif
+    QPolygonF barPolygon = getBarPolygon(it.key(), it.value().value);
+    // draw bar fill:
+    if (mainBrush().style() != Qt::NoBrush && mainBrush().color().alpha() != 0)
+    {
+      applyFillAntialiasingHint(painter);
+      painter->setPen(Qt::NoPen);
+      painter->setBrush(mainBrush());
+      painter->drawPolygon(barPolygon);
+    }
+    // draw bar line:
+    if (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0)
+    {
+      applyDefaultAntialiasingHint(painter);
+      painter->setPen(mainPen());
+      painter->setBrush(Qt::NoBrush);
+      painter->drawPolyline(barPolygon);
+    }
+  }
+}
+
+/* inherits documentation from base class */
+void QCPBars::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const
+{
+  // draw filled rect:
+  applyDefaultAntialiasingHint(painter);
+  painter->setBrush(mBrush);
+  painter->setPen(mPen);
+  QRectF r = QRectF(0, 0, rect.width()*0.67, rect.height()*0.67);
+  r.moveCenter(rect.center());
+  painter->drawRect(r);
+}
+
+/*!  \internal
+  
+  called by \ref draw to determine which data (key) range is visible at the current key axis range
+  setting, so only that needs to be processed. It also takes into account the bar width.
+  
+  \a lower returns an iterator to the lowest data point that needs to be taken into account when
+  plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a
+  lower may still be just outside the visible range.
+  
+  \a upperEnd returns an iterator one higher than the highest visible data point. Same as before, \a
+  upperEnd may also lie just outside of the visible range.
+  
+  if the bars plottable contains no data, both \a lower and \a upperEnd point to constEnd.
+*/
+void QCPBars::getVisibleDataBounds(QCPBarDataMap::const_iterator &lower, QCPBarDataMap::const_iterator &upperEnd) const
+{
+  if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; }
+  if (mData->isEmpty())
+  {
+    lower = mData->constEnd();
+    upperEnd = mData->constEnd();
+    return;
+  }
+  
+  // get visible data range as QMap iterators
+  lower = mData->lowerBound(mKeyAxis.data()->range().lower);
+  upperEnd = mData->upperBound(mKeyAxis.data()->range().upper);
+  double lowerPixelBound = mKeyAxis.data()->coordToPixel(mKeyAxis.data()->range().lower);
+  double upperPixelBound = mKeyAxis.data()->coordToPixel(mKeyAxis.data()->range().upper);
+  bool isVisible = false;
+  // walk left from lbound to find lower bar that actually is completely outside visible pixel range:
+  QCPBarDataMap::const_iterator it = lower;
+  while (it != mData->constBegin())
+  {
+    --it;
+    QRectF barBounds = getBarPolygon(it.value().key, it.value().value).boundingRect();
+    if (mKeyAxis.data()->orientation() == Qt::Horizontal)
+      isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.right() >= lowerPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.left() <= lowerPixelBound));
+    else // keyaxis is vertical
+      isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.top() <= lowerPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.bottom() >= lowerPixelBound));
+    if (isVisible)
+      lower = it;
+    else
+      break;
+  }
+  // walk right from ubound to find upper bar that actually is completely outside visible pixel range:
+  it = upperEnd;
+  while (it != mData->constEnd())
+  {
+    QRectF barBounds = getBarPolygon(upperEnd.value().key, upperEnd.value().value).boundingRect();
+    if (mKeyAxis.data()->orientation() == Qt::Horizontal)
+      isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.left() <= upperPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.right() >= upperPixelBound));
+    else // keyaxis is vertical
+      isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.bottom() >= upperPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.top() <= upperPixelBound));
+    if (isVisible)
+      upperEnd = it+1;
+    else
+      break;
+    ++it;
+  }
+}
+
+/*! \internal
+  
+  Returns the polygon of a single bar with \a key and \a value. The Polygon is open at the bottom
+  and shifted according to the bar stacking (see \ref moveAbove) and base value (see \ref
+  setBaseValue).
+*/
+QPolygonF QCPBars::getBarPolygon(double key, double value) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPolygonF(); }
+  
+  QPolygonF result;
+  double lowerPixelWidth, upperPixelWidth;
+  getPixelWidth(key, lowerPixelWidth, upperPixelWidth);
+  double base = getStackedBaseValue(key, value >= 0);
+  double basePixel = valueAxis->coordToPixel(base);
+  double valuePixel = valueAxis->coordToPixel(base+value);
+  double keyPixel = keyAxis->coordToPixel(key);
+  if (mBarsGroup)
+    keyPixel += mBarsGroup->keyPixelOffset(this, key);
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    result << QPointF(keyPixel+lowerPixelWidth, basePixel);
+    result << QPointF(keyPixel+lowerPixelWidth, valuePixel);
+    result << QPointF(keyPixel+upperPixelWidth, valuePixel);
+    result << QPointF(keyPixel+upperPixelWidth, basePixel);
+  } else
+  {
+    result << QPointF(basePixel, keyPixel+lowerPixelWidth);
+    result << QPointF(valuePixel, keyPixel+lowerPixelWidth);
+    result << QPointF(valuePixel, keyPixel+upperPixelWidth);
+    result << QPointF(basePixel, keyPixel+upperPixelWidth);
+  }
+  return result;
+}
+
+/*! \internal
+  
+  This function is used to determine the width of the bar at coordinate \a key, according to the
+  specified width (\ref setWidth) and width type (\ref setWidthType).
+  
+  The output parameters \a lower and \a upper return the number of pixels the bar extends to lower
+  and higher keys, relative to the \a key coordinate (so with a non-reversed horizontal axis, \a
+  lower is negative and \a upper positive).
+*/
+void QCPBars::getPixelWidth(double key, double &lower, double &upper) const
+{
+  switch (mWidthType)
+  {
+    case wtAbsolute:
+    {
+      upper = mWidth*0.5;
+      lower = -upper;
+      if (mKeyAxis && (mKeyAxis.data()->rangeReversed() ^ (mKeyAxis.data()->orientation() == Qt::Vertical)))
+        qSwap(lower, upper);
+      break;
+    }
+    case wtAxisRectRatio:
+    {
+      if (mKeyAxis && mKeyAxis.data()->axisRect())
+      {
+        if (mKeyAxis.data()->orientation() == Qt::Horizontal)
+          upper = mKeyAxis.data()->axisRect()->width()*mWidth*0.5;
+        else
+          upper = mKeyAxis.data()->axisRect()->height()*mWidth*0.5;
+        lower = -upper;
+        if (mKeyAxis && (mKeyAxis.data()->rangeReversed() ^ (mKeyAxis.data()->orientation() == Qt::Vertical)))
+          qSwap(lower, upper);
+      } else
+        qDebug() << Q_FUNC_INFO << "No key axis or axis rect defined";
+      break;
+    }
+    case wtPlotCoords:
+    {
+      if (mKeyAxis)
+      {
+        double keyPixel = mKeyAxis.data()->coordToPixel(key);
+        upper = mKeyAxis.data()->coordToPixel(key+mWidth*0.5)-keyPixel;
+        lower = mKeyAxis.data()->coordToPixel(key-mWidth*0.5)-keyPixel;
+        // no need to qSwap(lower, higher) when range reversed, because higher/lower are gained by
+        // coordinate transform which includes range direction
+      } else
+        qDebug() << Q_FUNC_INFO << "No key axis defined";
+      break;
+    }
+  }
+}
+
+/*! \internal
+  
+  This function is called to find at which value to start drawing the base of a bar at \a key, when
+  it is stacked on top of another QCPBars (e.g. with \ref moveAbove).
+  
+  positive and negative bars are separated per stack (positive are stacked above baseValue upwards,
+  negative are stacked below baseValue downwards). This can be indicated with \a positive. So if the
+  bar for which we need the base value is negative, set \a positive to false.
+*/
+double QCPBars::getStackedBaseValue(double key, bool positive) const
+{
+  if (mBarBelow)
+  {
+    double max = 0; // don't use mBaseValue here because only base value of bottom-most bar has meaning in a bar stack
+    // find bars of mBarBelow that are approximately at key and find largest one:
+    double epsilon = qAbs(key)*1e-6; // should be safe even when changed to use float at some point
+    if (key == 0)
+      epsilon = 1e-6;
+    QCPBarDataMap::const_iterator it = mBarBelow.data()->mData->lowerBound(key-epsilon);
+    QCPBarDataMap::const_iterator itEnd = mBarBelow.data()->mData->upperBound(key+epsilon);
+    while (it != itEnd)
+    {
+      if ((positive && it.value().value > max) ||
+          (!positive && it.value().value < max))
+        max = it.value().value;
+      ++it;
+    }
+    // recurse down the bar-stack to find the total height:
+    return max + mBarBelow.data()->getStackedBaseValue(key, positive);
+  } else
+    return mBaseValue;
+}
+
+/*! \internal
+
+  Connects \a below and \a above to each other via their mBarAbove/mBarBelow properties. The bar(s)
+  currently above lower and below upper will become disconnected to lower/upper.
+  
+  If lower is zero, upper will be disconnected at the bottom.
+  If upper is zero, lower will be disconnected at the top.
+*/
+void QCPBars::connectBars(QCPBars *lower, QCPBars *upper)
+{
+  if (!lower && !upper) return;
+  
+  if (!lower) // disconnect upper at bottom
+  {
+    // disconnect old bar below upper:
+    if (upper->mBarBelow && upper->mBarBelow.data()->mBarAbove.data() == upper)
+      upper->mBarBelow.data()->mBarAbove = 0;
+    upper->mBarBelow = 0;
+  } else if (!upper) // disconnect lower at top
+  {
+    // disconnect old bar above lower:
+    if (lower->mBarAbove && lower->mBarAbove.data()->mBarBelow.data() == lower)
+      lower->mBarAbove.data()->mBarBelow = 0;
+    lower->mBarAbove = 0;
+  } else // connect lower and upper
+  {
+    // disconnect old bar above lower:
+    if (lower->mBarAbove && lower->mBarAbove.data()->mBarBelow.data() == lower)
+      lower->mBarAbove.data()->mBarBelow = 0;
+    // disconnect old bar below upper:
+    if (upper->mBarBelow && upper->mBarBelow.data()->mBarAbove.data() == upper)
+      upper->mBarBelow.data()->mBarAbove = 0;
+    lower->mBarAbove = upper;
+    upper->mBarBelow = lower;
+  }
+}
+
+/* inherits documentation from base class */
+QCPRange QCPBars::getKeyRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  QCPRange range;
+  bool haveLower = false;
+  bool haveUpper = false;
+  
+  double current;
+  QCPBarDataMap::const_iterator it = mData->constBegin();
+  while (it != mData->constEnd())
+  {
+    current = it.value().key;
+    if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0))
+    {
+      if (current < range.lower || !haveLower)
+      {
+        range.lower = current;
+        haveLower = true;
+      }
+      if (current > range.upper || !haveUpper)
+      {
+        range.upper = current;
+        haveUpper = true;
+      }
+    }
+    ++it;
+  }
+  // determine exact range of bars by including bar width and barsgroup offset:
+  if (haveLower && mKeyAxis)
+  {
+    double lowerPixelWidth, upperPixelWidth, keyPixel;
+    getPixelWidth(range.lower, lowerPixelWidth, upperPixelWidth);
+    keyPixel = mKeyAxis.data()->coordToPixel(range.lower) + lowerPixelWidth;
+    if (mBarsGroup)
+      keyPixel += mBarsGroup->keyPixelOffset(this, range.lower);
+    range.lower = mKeyAxis.data()->pixelToCoord(keyPixel);
+  }
+  if (haveUpper && mKeyAxis)
+  {
+    double lowerPixelWidth, upperPixelWidth, keyPixel;
+    getPixelWidth(range.upper, lowerPixelWidth, upperPixelWidth);
+    keyPixel = mKeyAxis.data()->coordToPixel(range.upper) + upperPixelWidth;
+    if (mBarsGroup)
+      keyPixel += mBarsGroup->keyPixelOffset(this, range.upper);
+    range.upper = mKeyAxis.data()->pixelToCoord(keyPixel);
+  }
+  foundRange = haveLower && haveUpper;
+  return range;
+}
+
+/* inherits documentation from base class */
+QCPRange QCPBars::getValueRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  QCPRange range;
+  range.lower = mBaseValue;
+  range.upper = mBaseValue;
+  bool haveLower = true; // set to true, because baseValue should always be visible in bar charts
+  bool haveUpper = true; // set to true, because baseValue should always be visible in bar charts
+  double current;
+  
+  QCPBarDataMap::const_iterator it = mData->constBegin();
+  while (it != mData->constEnd())
+  {
+    current = it.value().value + getStackedBaseValue(it.value().key, it.value().value >= 0);
+    if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0))
+    {
+      if (current < range.lower || !haveLower)
+      {
+        range.lower = current;
+        haveLower = true;
+      }
+      if (current > range.upper || !haveUpper)
+      {
+        range.upper = current;
+        haveUpper = true;
+      }
+    }
+    ++it;
+  }
+  
+  foundRange = true; // return true because bar charts always have the 0-line visible
+  return range;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPStatisticalBox
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPStatisticalBox
+  \brief A plottable representing a single statistical box in a plot.
+
+  \image html QCPStatisticalBox.png
+  
+  To plot data, assign it with the individual parameter functions or use \ref setData to set all
+  parameters at once. The individual functions are:
+  \li \ref setMinimum
+  \li \ref setLowerQuartile
+  \li \ref setMedian
+  \li \ref setUpperQuartile
+  \li \ref setMaximum
+  
+  Additionally you can define a list of outliers, drawn as scatter datapoints:
+  \li \ref setOutliers
+  
+  \section appearance Changing the appearance
+  
+  The appearance of the box itself is controlled via \ref setPen and \ref setBrush. You may change
+  the width of the box with \ref setWidth in plot coordinates (not pixels).
+
+  Analog functions exist for the minimum/maximum-whiskers: \ref setWhiskerPen, \ref
+  setWhiskerBarPen, \ref setWhiskerWidth. The whisker width is the width of the bar at the top
+  (maximum) and bottom (minimum).
+  
+  The median indicator line has its own pen, \ref setMedianPen.
+  
+  If the whisker backbone pen is changed, make sure to set the capStyle to Qt::FlatCap. Else, the
+  backbone line might exceed the whisker bars by a few pixels due to the pen cap being not
+  perfectly flat.
+  
+  The Outlier data points are drawn as normal scatter points. Their look can be controlled with
+  \ref setOutlierStyle
+  
+  \section usage Usage
+  
+  Like all data representing objects in QCustomPlot, the QCPStatisticalBox is a plottable.
+  Usually, you first create an instance and add it to the customPlot:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpstatisticalbox-creation-1
+  and then modify the properties of the newly created plottable, e.g.:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpstatisticalbox-creation-2
+*/
+
+/*!
+  Constructs a statistical box which uses \a keyAxis as its key axis ("x") and \a valueAxis as its
+  value axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and
+  not have the same orientation. If either of these restrictions is violated, a corresponding
+  message is printed to the debug output (qDebug), the construction is not aborted, though.
+  
+  The constructed statistical box can be added to the plot with QCustomPlot::addPlottable,
+  QCustomPlot then takes ownership of the statistical box.
+*/
+QCPStatisticalBox::QCPStatisticalBox(QCPAxis *keyAxis, QCPAxis *valueAxis) :
+  QCPAbstractPlottable(keyAxis, valueAxis),
+  mKey(0),
+  mMinimum(0),
+  mLowerQuartile(0),
+  mMedian(0),
+  mUpperQuartile(0),
+  mMaximum(0)
+{
+  setOutlierStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, Qt::blue, 6));
+  setWhiskerWidth(0.2);
+  setWidth(0.5);
+  
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue, 2.5));
+  setMedianPen(QPen(Qt::black, 3, Qt::SolidLine, Qt::FlatCap));
+  setWhiskerPen(QPen(Qt::black, 0, Qt::DashLine, Qt::FlatCap));
+  setWhiskerBarPen(QPen(Qt::black));
+  setBrush(Qt::NoBrush);
+  setSelectedBrush(Qt::NoBrush);
+}
+
+/*!
+  Sets the key coordinate of the statistical box.
+*/
+void QCPStatisticalBox::setKey(double key)
+{
+  mKey = key;
+}
+
+/*!
+  Sets the parameter "minimum" of the statistical box plot. This is the position of the lower
+  whisker, typically the minimum measurement of the sample that's not considered an outlier.
+  
+  \see setMaximum, setWhiskerPen, setWhiskerBarPen, setWhiskerWidth
+*/
+void QCPStatisticalBox::setMinimum(double value)
+{
+  mMinimum = value;
+}
+
+/*!
+  Sets the parameter "lower Quartile" of the statistical box plot. This is the lower end of the
+  box. The lower and the upper quartiles are the two statistical quartiles around the median of the
+  sample, they contain 50% of the sample data.
+  
+  \see setUpperQuartile, setPen, setBrush, setWidth
+*/
+void QCPStatisticalBox::setLowerQuartile(double value)
+{
+  mLowerQuartile = value;
+}
+
+/*!
+  Sets the parameter "median" of the statistical box plot. This is the value of the median mark
+  inside the quartile box. The median separates the sample data in half (50% of the sample data is
+  below/above the median).
+  
+  \see setMedianPen
+*/
+void QCPStatisticalBox::setMedian(double value)
+{
+  mMedian = value;
+}
+
+/*!
+  Sets the parameter "upper Quartile" of the statistical box plot. This is the upper end of the
+  box. The lower and the upper quartiles are the two statistical quartiles around the median of the
+  sample, they contain 50% of the sample data.
+  
+  \see setLowerQuartile, setPen, setBrush, setWidth
+*/
+void QCPStatisticalBox::setUpperQuartile(double value)
+{
+  mUpperQuartile = value;
+}
+
+/*!
+  Sets the parameter "maximum" of the statistical box plot. This is the position of the upper
+  whisker, typically the maximum measurement of the sample that's not considered an outlier.
+  
+  \see setMinimum, setWhiskerPen, setWhiskerBarPen, setWhiskerWidth
+*/
+void QCPStatisticalBox::setMaximum(double value)
+{
+  mMaximum = value;
+}
+
+/*!
+  Sets a vector of outlier values that will be drawn as scatters. Any data points in the sample
+  that are not within the whiskers (\ref setMinimum, \ref setMaximum) should be considered outliers
+  and displayed as such.
+  
+  \see setOutlierStyle
+*/
+void QCPStatisticalBox::setOutliers(const QVector<double> &values)
+{
+  mOutliers = values;
+}
+
+/*!
+  Sets all parameters of the statistical box plot at once.
+  
+  \see setKey, setMinimum, setLowerQuartile, setMedian, setUpperQuartile, setMaximum
+*/
+void QCPStatisticalBox::setData(double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum)
+{
+  setKey(key);
+  setMinimum(minimum);
+  setLowerQuartile(lowerQuartile);
+  setMedian(median);
+  setUpperQuartile(upperQuartile);
+  setMaximum(maximum);
+}
+
+/*!
+  Sets the width of the box in key coordinates.
+  
+  \see setWhiskerWidth
+*/
+void QCPStatisticalBox::setWidth(double width)
+{
+  mWidth = width;
+}
+
+/*!
+  Sets the width of the whiskers (\ref setMinimum, \ref setMaximum) in key coordinates.
+  
+  \see setWidth
+*/
+void QCPStatisticalBox::setWhiskerWidth(double width)
+{
+  mWhiskerWidth = width;
+}
+
+/*!
+  Sets the pen used for drawing the whisker backbone (That's the line parallel to the value axis).
+  
+  Make sure to set the \a pen capStyle to Qt::FlatCap to prevent the whisker backbone from reaching
+  a few pixels past the whisker bars, when using a non-zero pen width.
+  
+  \see setWhiskerBarPen
+*/
+void QCPStatisticalBox::setWhiskerPen(const QPen &pen)
+{
+  mWhiskerPen = pen;
+}
+
+/*!
+  Sets the pen used for drawing the whisker bars (Those are the lines parallel to the key axis at
+  each end of the whisker backbone).
+  
+  \see setWhiskerPen
+*/
+void QCPStatisticalBox::setWhiskerBarPen(const QPen &pen)
+{
+  mWhiskerBarPen = pen;
+}
+
+/*!
+  Sets the pen used for drawing the median indicator line inside the statistical box.
+*/
+void QCPStatisticalBox::setMedianPen(const QPen &pen)
+{
+  mMedianPen = pen;
+}
+
+/*!
+  Sets the appearance of the outlier data points.
+  
+  \see setOutliers
+*/
+void QCPStatisticalBox::setOutlierStyle(const QCPScatterStyle &style)
+{
+  mOutlierStyle = style;
+}
+
+/* inherits documentation from base class */
+void QCPStatisticalBox::clearData()
+{
+  setOutliers(QVector<double>());
+  setKey(0);
+  setMinimum(0);
+  setLowerQuartile(0);
+  setMedian(0);
+  setUpperQuartile(0);
+  setMaximum(0);
+}
+
+/* inherits documentation from base class */
+double QCPStatisticalBox::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+  
+  if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint()))
+  {
+    double posKey, posValue;
+    pixelsToCoords(pos, posKey, posValue);
+    // quartile box:
+    QCPRange keyRange(mKey-mWidth*0.5, mKey+mWidth*0.5);
+    QCPRange valueRange(mLowerQuartile, mUpperQuartile);
+    if (keyRange.contains(posKey) && valueRange.contains(posValue))
+      return mParentPlot->selectionTolerance()*0.99;
+    
+    // min/max whiskers:
+    if (QCPRange(mMinimum, mMaximum).contains(posValue))
+      return qAbs(mKeyAxis.data()->coordToPixel(mKey)-mKeyAxis.data()->coordToPixel(posKey));
+  }
+  return -1;
+}
+
+/* inherits documentation from base class */
+void QCPStatisticalBox::draw(QCPPainter *painter)
+{
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+
+  // check data validity if flag set:
+#ifdef QCUSTOMPLOT_CHECK_DATA
+  if (QCP::isInvalidData(mKey, mMedian) ||
+      QCP::isInvalidData(mLowerQuartile, mUpperQuartile) ||
+      QCP::isInvalidData(mMinimum, mMaximum))
+    qDebug() << Q_FUNC_INFO << "Data point at" << mKey << "of drawn range has invalid data." << "Plottable name:" << name();
+  for (int i=0; i<mOutliers.size(); ++i)
+    if (QCP::isInvalidData(mOutliers.at(i)))
+      qDebug() << Q_FUNC_INFO << "Data point outlier at" << mKey << "of drawn range invalid." << "Plottable name:" << name();
+#endif
+  
+  QRectF quartileBox;
+  drawQuartileBox(painter, &quartileBox);
+  
+  painter->save();
+  painter->setClipRect(quartileBox, Qt::IntersectClip);
+  drawMedian(painter);
+  painter->restore();
+  
+  drawWhiskers(painter);
+  drawOutliers(painter);
+}
+
+/* inherits documentation from base class */
+void QCPStatisticalBox::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const
+{
+  // draw filled rect:
+  applyDefaultAntialiasingHint(painter);
+  painter->setPen(mPen);
+  painter->setBrush(mBrush);
+  QRectF r = QRectF(0, 0, rect.width()*0.67, rect.height()*0.67);
+  r.moveCenter(rect.center());
+  painter->drawRect(r);
+}
+
+/*! \internal
+  
+  Draws the quartile box. \a box is an output parameter that returns the quartile box (in pixel
+  coordinates) which is used to set the clip rect of the painter before calling \ref drawMedian (so
+  the median doesn't draw outside the quartile box).
+*/
+void QCPStatisticalBox::drawQuartileBox(QCPPainter *painter, QRectF *quartileBox) const
+{
+  QRectF box;
+  box.setTopLeft(coordsToPixels(mKey-mWidth*0.5, mUpperQuartile));
+  box.setBottomRight(coordsToPixels(mKey+mWidth*0.5, mLowerQuartile));
+  applyDefaultAntialiasingHint(painter);
+  painter->setPen(mainPen());
+  painter->setBrush(mainBrush());
+  painter->drawRect(box);
+  if (quartileBox)
+    *quartileBox = box;
+}
+
+/*! \internal
+  
+  Draws the median line inside the quartile box.
+*/
+void QCPStatisticalBox::drawMedian(QCPPainter *painter) const
+{
+  QLineF medianLine;
+  medianLine.setP1(coordsToPixels(mKey-mWidth*0.5, mMedian));
+  medianLine.setP2(coordsToPixels(mKey+mWidth*0.5, mMedian));
+  applyDefaultAntialiasingHint(painter);
+  painter->setPen(mMedianPen);
+  painter->drawLine(medianLine);
+}
+
+/*! \internal
+  
+  Draws both whisker backbones and bars.
+*/
+void QCPStatisticalBox::drawWhiskers(QCPPainter *painter) const
+{
+  QLineF backboneMin, backboneMax, barMin, barMax;
+  backboneMax.setPoints(coordsToPixels(mKey, mUpperQuartile), coordsToPixels(mKey, mMaximum));
+  backboneMin.setPoints(coordsToPixels(mKey, mLowerQuartile), coordsToPixels(mKey, mMinimum));
+  barMax.setPoints(coordsToPixels(mKey-mWhiskerWidth*0.5, mMaximum), coordsToPixels(mKey+mWhiskerWidth*0.5, mMaximum));
+  barMin.setPoints(coordsToPixels(mKey-mWhiskerWidth*0.5, mMinimum), coordsToPixels(mKey+mWhiskerWidth*0.5, mMinimum));
+  applyErrorBarsAntialiasingHint(painter);
+  painter->setPen(mWhiskerPen);
+  painter->drawLine(backboneMin);
+  painter->drawLine(backboneMax);
+  painter->setPen(mWhiskerBarPen);
+  painter->drawLine(barMin);
+  painter->drawLine(barMax);
+}
+
+/*! \internal
+  
+  Draws the outlier scatter points.
+*/
+void QCPStatisticalBox::drawOutliers(QCPPainter *painter) const
+{
+  applyScattersAntialiasingHint(painter);
+  mOutlierStyle.applyTo(painter, mPen);
+  for (int i=0; i<mOutliers.size(); ++i)
+    mOutlierStyle.drawShape(painter, coordsToPixels(mKey, mOutliers.at(i)));
+}
+
+/* inherits documentation from base class */
+QCPRange QCPStatisticalBox::getKeyRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  foundRange = true;
+  if (inSignDomain == sdBoth)
+  {
+    return QCPRange(mKey-mWidth*0.5, mKey+mWidth*0.5);
+  } else if (inSignDomain == sdNegative)
+  {
+    if (mKey+mWidth*0.5 < 0)
+      return QCPRange(mKey-mWidth*0.5, mKey+mWidth*0.5);
+    else if (mKey < 0)
+      return QCPRange(mKey-mWidth*0.5, mKey);
+    else
+    {
+      foundRange = false;
+      return QCPRange();
+    }
+  } else if (inSignDomain == sdPositive)
+  {
+    if (mKey-mWidth*0.5 > 0)
+      return QCPRange(mKey-mWidth*0.5, mKey+mWidth*0.5);
+    else if (mKey > 0)
+      return QCPRange(mKey, mKey+mWidth*0.5);
+    else
+    {
+      foundRange = false;
+      return QCPRange();
+    }
+  }
+  foundRange = false;
+  return QCPRange();
+}
+
+/* inherits documentation from base class */
+QCPRange QCPStatisticalBox::getValueRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  QVector<double> values; // values that must be considered (i.e. all outliers and the five box-parameters)
+  values.reserve(mOutliers.size() + 5);
+  values << mMaximum << mUpperQuartile << mMedian << mLowerQuartile << mMinimum;
+  values << mOutliers;
+  // go through values and find the ones in legal range:
+  bool haveUpper = false;
+  bool haveLower = false;
+  double upper = 0;
+  double lower = 0;
+  for (int i=0; i<values.size(); ++i)
+  {
+    if ((inSignDomain == sdNegative && values.at(i) < 0) ||
+        (inSignDomain == sdPositive && values.at(i) > 0) ||
+        (inSignDomain == sdBoth))
+    {
+      if (values.at(i) > upper || !haveUpper)
+      {
+        upper = values.at(i);
+        haveUpper = true;
+      }
+      if (values.at(i) < lower || !haveLower)
+      {
+        lower = values.at(i);
+        haveLower = true;
+      }
+    }
+  }
+  // return the bounds if we found some sensible values:
+  if (haveLower && haveUpper)
+  {
+    foundRange = true;
+    return QCPRange(lower, upper);
+  } else // might happen if all values are in other sign domain
+  {
+    foundRange = false;
+    return QCPRange();
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPColorMapData
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPColorMapData
+  \brief Holds the two-dimensional data of a QCPColorMap plottable.
+  
+  This class is a data storage for \ref QCPColorMap. It holds a two-dimensional array, which \ref
+  QCPColorMap then displays as a 2D image in the plot, where the array values are represented by a
+  color, depending on the value.
+  
+  The size of the array can be controlled via \ref setSize (or \ref setKeySize, \ref setValueSize).
+  Which plot coordinates these cells correspond to can be configured with \ref setRange (or \ref
+  setKeyRange, \ref setValueRange).
+  
+  The data cells can be accessed in two ways: They can be directly addressed by an integer index
+  with \ref setCell. This is the fastest method. Alternatively, they can be addressed by their plot
+  coordinate with \ref setData. plot coordinate to cell index transformations and vice versa are
+  provided by the functions \ref coordToCell and \ref cellToCoord.
+  
+  This class also buffers the minimum and maximum values that are in the data set, to provide
+  QCPColorMap::rescaleDataRange with the necessary information quickly. Setting a cell to a value
+  that is greater than the current maximum increases this maximum to the new value. However,
+  setting the cell that currently holds the maximum value to a smaller value doesn't decrease the
+  maximum again, because finding the true new maximum would require going through the entire data
+  array, which might be time consuming. The same holds for the data minimum. This functionality is
+  given by \ref recalculateDataBounds, such that you can decide when it is sensible to find the
+  true current minimum and maximum. The method QCPColorMap::rescaleDataRange offers a convenience
+  parameter \a recalculateDataBounds which may be set to true to automatically call \ref
+  recalculateDataBounds internally.
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn bool QCPColorMapData::isEmpty() const
+  
+  Returns whether this instance carries no data. This is equivalent to having a size where at least
+  one of the dimensions is 0 (see \ref setSize).
+*/
+
+/* end of documentation of inline functions */
+
+/*!
+  Constructs a new QCPColorMapData instance. The instance has \a keySize cells in the key direction
+  and \a valueSize cells in the value direction. These cells will be displayed by the \ref QCPColorMap
+  at the coordinates \a keyRange and \a valueRange.
+  
+  \see setSize, setKeySize, setValueSize, setRange, setKeyRange, setValueRange
+*/
+QCPColorMapData::QCPColorMapData(int keySize, int valueSize, const QCPRange &keyRange, const QCPRange &valueRange) :
+  mKeySize(0),
+  mValueSize(0),
+  mKeyRange(keyRange),
+  mValueRange(valueRange),
+  mIsEmpty(true),
+  mData(0),
+  mDataModified(true)
+{
+  setSize(keySize, valueSize);
+  fill(0);
+}
+
+QCPColorMapData::~QCPColorMapData()
+{
+  if (mData)
+    delete[] mData;
+}
+
+/*!
+  Constructs a new QCPColorMapData instance copying the data and range of \a other.
+*/
+QCPColorMapData::QCPColorMapData(const QCPColorMapData &other) :
+  mKeySize(0),
+  mValueSize(0),
+  mIsEmpty(true),
+  mData(0),
+  mDataModified(true)
+{
+  *this = other;
+}
+
+/*!
+  Overwrites this color map data instance with the data stored in \a other.
+*/
+QCPColorMapData &QCPColorMapData::operator=(const QCPColorMapData &other)
+{
+  if (&other != this)
+  {
+    const int keySize = other.keySize();
+    const int valueSize = other.valueSize();
+    setSize(keySize, valueSize);
+    setRange(other.keyRange(), other.valueRange());
+    if (!mIsEmpty)
+      memcpy(mData, other.mData, sizeof(mData[0])*keySize*valueSize);
+    mDataBounds = other.mDataBounds;
+    mDataModified = true;
+  }
+  return *this;
+}
+
+/* undocumented getter */
+double QCPColorMapData::data(double key, double value)
+{
+  int keyCell = (key-mKeyRange.lower)/(mKeyRange.upper-mKeyRange.lower)*(mKeySize-1)+0.5;
+  int valueCell = (value-mValueRange.lower)/(mValueRange.upper-mValueRange.lower)*(mValueSize-1)+0.5;
+  if (keyCell >= 0 && keyCell < mKeySize && valueCell >= 0 && valueCell < mValueSize)
+    return mData[valueCell*mKeySize + keyCell];
+  else
+    return 0;
+}
+
+/* undocumented getter */
+double QCPColorMapData::cell(int keyIndex, int valueIndex)
+{
+  if (keyIndex >= 0 && keyIndex < mKeySize && valueIndex >= 0 && valueIndex < mValueSize)
+    return mData[valueIndex*mKeySize + keyIndex];
+  else
+    return 0;
+}
+
+/*!
+  Resizes the data array to have \a keySize cells in the key dimension and \a valueSize cells in
+  the value dimension.
+
+  The current data is discarded and the map cells are set to 0, unless the map had already the
+  requested size.
+  
+  Setting at least one of \a keySize or \a valueSize to zero frees the internal data array and \ref
+  isEmpty returns true.
+
+  \see setRange, setKeySize, setValueSize
+*/
+void QCPColorMapData::setSize(int keySize, int valueSize)
+{
+  if (keySize != mKeySize || valueSize != mValueSize)
+  {
+    mKeySize = keySize;
+    mValueSize = valueSize;
+    if (mData)
+      delete[] mData;
+    mIsEmpty = mKeySize == 0 || mValueSize == 0;
+    if (!mIsEmpty)
+    {
+#ifdef __EXCEPTIONS
+      try { // 2D arrays get memory intensive fast. So if the allocation fails, at least output debug message
+#endif
+      mData = new double[mKeySize*mValueSize];
+#ifdef __EXCEPTIONS
+      } catch (...) { mData = 0; }
+#endif
+      if (mData)
+        fill(0);
+      else
+        qDebug() << Q_FUNC_INFO << "out of memory for data dimensions "<< mKeySize << "*" << mValueSize;
+    } else
+      mData = 0;
+    mDataModified = true;
+  }
+}
+
+/*!
+  Resizes the data array to have \a keySize cells in the key dimension.
+
+  The current data is discarded and the map cells are set to 0, unless the map had already the
+  requested size.
+  
+  Setting \a keySize to zero frees the internal data array and \ref isEmpty returns true.
+
+  \see setKeyRange, setSize, setValueSize
+*/
+void QCPColorMapData::setKeySize(int keySize)
+{
+  setSize(keySize, mValueSize);
+}
+
+/*!
+  Resizes the data array to have \a valueSize cells in the value dimension.
+
+  The current data is discarded and the map cells are set to 0, unless the map had already the
+  requested size.
+  
+  Setting \a valueSize to zero frees the internal data array and \ref isEmpty returns true.
+
+  \see setValueRange, setSize, setKeySize
+*/
+void QCPColorMapData::setValueSize(int valueSize)
+{
+  setSize(mKeySize, valueSize);
+}
+
+/*!
+  Sets the coordinate ranges the data shall be distributed over. This defines the rectangular area
+  covered by the color map in plot coordinates.
+  
+  The outer cells will be centered on the range boundaries given to this function. For example, if
+  the key size (\ref setKeySize) is 3 and \a keyRange is set to <tt>QCPRange(2, 3)</tt> there will
+  be cells centered on the key coordinates 2, 2.5 and 3.
+ 
+  \see setSize
+*/
+void QCPColorMapData::setRange(const QCPRange &keyRange, const QCPRange &valueRange)
+{
+  setKeyRange(keyRange);
+  setValueRange(valueRange);
+}
+
+/*!
+  Sets the coordinate range the data shall be distributed over in the key dimension. Together with
+  the value range, This defines the rectangular area covered by the color map in plot coordinates.
+  
+  The outer cells will be centered on the range boundaries given to this function. For example, if
+  the key size (\ref setKeySize) is 3 and \a keyRange is set to <tt>QCPRange(2, 3)</tt> there will
+  be cells centered on the key coordinates 2, 2.5 and 3.
+ 
+  \see setRange, setValueRange, setSize
+*/
+void QCPColorMapData::setKeyRange(const QCPRange &keyRange)
+{
+  mKeyRange = keyRange;
+}
+
+/*!
+  Sets the coordinate range the data shall be distributed over in the value dimension. Together with
+  the key range, This defines the rectangular area covered by the color map in plot coordinates.
+  
+  The outer cells will be centered on the range boundaries given to this function. For example, if
+  the value size (\ref setValueSize) is 3 and \a valueRange is set to <tt>QCPRange(2, 3)</tt> there
+  will be cells centered on the value coordinates 2, 2.5 and 3.
+ 
+  \see setRange, setKeyRange, setSize
+*/
+void QCPColorMapData::setValueRange(const QCPRange &valueRange)
+{
+  mValueRange = valueRange;
+}
+
+/*!
+  Sets the data of the cell, which lies at the plot coordinates given by \a key and \a value, to \a
+  z.
+  
+  \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or
+  value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes,
+  you shouldn't use the \ref QCPColorMapData::setData method as it uses a linear transformation to
+  determine the cell index. Rather directly access the cell index with \ref
+  QCPColorMapData::setCell.
+ 
+  \see setCell, setRange
+*/
+void QCPColorMapData::setData(double key, double value, double z)
+{
+  int keyCell = (key-mKeyRange.lower)/(mKeyRange.upper-mKeyRange.lower)*(mKeySize-1)+0.5;
+  int valueCell = (value-mValueRange.lower)/(mValueRange.upper-mValueRange.lower)*(mValueSize-1)+0.5;
+  if (keyCell >= 0 && keyCell < mKeySize && valueCell >= 0 && valueCell < mValueSize)
+  {
+    mData[valueCell*mKeySize + keyCell] = z;
+    if (z < mDataBounds.lower)
+      mDataBounds.lower = z;
+    if (z > mDataBounds.upper)
+      mDataBounds.upper = z;
+     mDataModified = true;
+  }
+}
+
+/*!
+  Sets the data of the cell with indices \a keyIndex and \a valueIndex to \a z. The indices
+  enumerate the cells starting from zero, up to the map's size-1 in the respective dimension (see
+  \ref setSize).
+  
+  In the standard plot configuration (horizontal key axis and vertical value axis, both not
+  range-reversed), the cell with indices (0, 0) is in the bottom left corner and the cell with
+  indices (keySize-1, valueSize-1) is in the top right corner of the color map.
+  
+  \see setData, setSize
+*/
+void QCPColorMapData::setCell(int keyIndex, int valueIndex, double z)
+{
+  if (keyIndex >= 0 && keyIndex < mKeySize && valueIndex >= 0 && valueIndex < mValueSize)
+  {
+    mData[valueIndex*mKeySize + keyIndex] = z;
+    if (z < mDataBounds.lower)
+      mDataBounds.lower = z;
+    if (z > mDataBounds.upper)
+      mDataBounds.upper = z;
+     mDataModified = true;
+  }
+}
+
+/*!
+  Goes through the data and updates the buffered minimum and maximum data values.
+  
+  Calling this method is only advised if you are about to call \ref QCPColorMap::rescaleDataRange
+  and can not guarantee that the cells holding the maximum or minimum data haven't been overwritten
+  with a smaller or larger value respectively, since the buffered maximum/minimum values have been
+  updated the last time. Why this is the case is explained in the class description (\ref
+  QCPColorMapData).
+  
+  Note that the method \ref QCPColorMap::rescaleDataRange provides a parameter \a
+  recalculateDataBounds for convenience. Setting this to true will call this method for you, before
+  doing the rescale.
+*/
+void QCPColorMapData::recalculateDataBounds()
+{
+  if (mKeySize > 0 && mValueSize > 0)
+  {
+    double minHeight = mData[0];
+    double maxHeight = mData[0];
+    const int dataCount = mValueSize*mKeySize;
+    for (int i=0; i<dataCount; ++i)
+    {
+      if (mData[i] > maxHeight)
+        maxHeight = mData[i];
+      if (mData[i] < minHeight)
+        minHeight = mData[i];
+    }
+    mDataBounds.lower = minHeight;
+    mDataBounds.upper = maxHeight;
+  }
+}
+
+/*!
+  Frees the internal data memory.
+  
+  This is equivalent to calling \ref setSize "setSize(0, 0)".
+*/
+void QCPColorMapData::clear()
+{
+  setSize(0, 0);
+}
+
+/*!
+  Sets all cells to the value \a z.
+*/
+void QCPColorMapData::fill(double z)
+{
+  const int dataCount = mValueSize*mKeySize;
+  for (int i=0; i<dataCount; ++i)
+    mData[i] = z;
+  mDataBounds = QCPRange(z, z);
+  mDataModified = true;
+}
+
+/*!
+  Transforms plot coordinates given by \a key and \a value to cell indices of this QCPColorMapData
+  instance. The resulting cell indices are returned via the output parameters \a keyIndex and \a
+  valueIndex.
+  
+  The retrieved key/value cell indices can then be used for example with \ref setCell.
+  
+  If you are only interested in a key or value index, you may pass 0 as \a valueIndex or \a
+  keyIndex.
+  
+  \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or
+  value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes,
+  you shouldn't use the \ref QCPColorMapData::coordToCell method as it uses a linear transformation to
+  determine the cell index.
+  
+  \see cellToCoord, QCPAxis::coordToPixel
+*/
+void QCPColorMapData::coordToCell(double key, double value, int *keyIndex, int *valueIndex) const
+{
+  if (keyIndex)
+    *keyIndex = (key-mKeyRange.lower)/(mKeyRange.upper-mKeyRange.lower)*(mKeySize-1)+0.5;
+  if (valueIndex)
+    *valueIndex = (value-mValueRange.lower)/(mValueRange.upper-mValueRange.lower)*(mValueSize-1)+0.5;
+}
+
+/*!
+  Transforms cell indices given by \a keyIndex and \a valueIndex to cell indices of this QCPColorMapData
+  instance. The resulting coordinates are returned via the output parameters \a key and \a
+  value.
+  
+  If you are only interested in a key or value coordinate, you may pass 0 as \a key or \a
+  value.
+  
+  \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or
+  value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes,
+  you shouldn't use the \ref QCPColorMapData::cellToCoord method as it uses a linear transformation to
+  determine the cell index.
+  
+  \see coordToCell, QCPAxis::pixelToCoord
+*/
+void QCPColorMapData::cellToCoord(int keyIndex, int valueIndex, double *key, double *value) const
+{
+  if (key)
+    *key = keyIndex/(double)(mKeySize-1)*(mKeyRange.upper-mKeyRange.lower)+mKeyRange.lower;
+  if (value)
+    *value = valueIndex/(double)(mValueSize-1)*(mValueRange.upper-mValueRange.lower)+mValueRange.lower;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPColorMap
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPColorMap
+  \brief A plottable representing a two-dimensional color map in a plot.
+
+  \image html QCPColorMap.png
+  
+  The data is stored in the class \ref QCPColorMapData, which can be accessed via the data()
+  method.
+  
+  A color map has three dimensions to represent a data point: The \a key dimension, the \a value
+  dimension and the \a data dimension. As with other plottables such as graphs, \a key and \a value
+  correspond to two orthogonal axes on the QCustomPlot surface that you specify in the QCPColorMap
+  constructor. The \a data dimension however is encoded as the color of the point at (\a key, \a
+  value).
+
+  Set the number of points (or \a cells) in the key/value dimension via \ref
+  QCPColorMapData::setSize. The plot coordinate range over which these points will be displayed is
+  specified via \ref QCPColorMapData::setRange. The first cell will be centered on the lower range
+  boundary and the last cell will be centered on the upper range boundary. The data can be set by
+  either accessing the cells directly with QCPColorMapData::setCell or by addressing the cells via
+  their plot coordinates with \ref QCPColorMapData::setData. If possible, you should prefer
+  setCell, since it doesn't need to do any coordinate transformation and thus performs a bit
+  better.
+  
+  The cell with index (0, 0) is at the bottom left, if the color map uses normal (i.e. not reversed)
+  key and value axes.
+  
+  To show the user which colors correspond to which \a data values, a \ref QCPColorScale is
+  typically placed to the right of the axis rect. See the documentation there for details on how to
+  add and use a color scale.
+  
+  \section appearance Changing the appearance
+  
+  The central part of the appearance is the color gradient, which can be specified via \ref
+  setGradient. See the documentation of \ref QCPColorGradient for details on configuring a color
+  gradient.
+  
+  The \a data range that is mapped to the colors of the gradient can be specified with \ref
+  setDataRange. To make the data range encompass the whole data set minimum to maximum, call \ref
+  rescaleDataRange.
+  
+  \section usage Usage
+  
+  Like all data representing objects in QCustomPlot, the QCPColorMap is a plottable
+  (QCPAbstractPlottable). So the plottable-interface of QCustomPlot applies
+  (QCustomPlot::plottable, QCustomPlot::addPlottable, QCustomPlot::removePlottable, etc.)
+  
+  Usually, you first create an instance and add it to the customPlot:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolormap-creation-1
+  and then modify the properties of the newly created color map, e.g.:
+  \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolormap-creation-2
+  
+  \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or
+  value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes,
+  you shouldn't use the \ref QCPColorMapData::setData method as it uses a linear transformation to
+  determine the cell index. Rather directly access the cell index with \ref
+  QCPColorMapData::setCell.
+*/
+
+/* start documentation of inline functions */
+
+/*! \fn QCPColorMapData *QCPColorMap::data() const
+  
+  Returns a pointer to the internal data storage of type \ref QCPColorMapData. Access this to
+  modify data points (cells) and the color map key/value range.
+  
+  \see setData
+*/
+
+/* end documentation of inline functions */
+
+/* start documentation of signals */
+
+/*! \fn void QCPColorMap::dataRangeChanged(QCPRange newRange);
+  
+  This signal is emitted when the data range changes.
+  
+  \see setDataRange
+*/
+
+/*! \fn void QCPColorMap::dataScaleTypeChanged(QCPAxis::ScaleType scaleType);
+  
+  This signal is emitted when the data scale type changes.
+  
+  \see setDataScaleType
+*/
+
+/*! \fn void QCPColorMap::gradientChanged(QCPColorGradient newGradient);
+  
+  This signal is emitted when the gradient changes.
+  
+  \see setGradient
+*/
+
+/* end documentation of signals */
+
+/*!
+  Constructs a color map with the specified \a keyAxis and \a valueAxis.
+  
+  The constructed QCPColorMap can be added to the plot with QCustomPlot::addPlottable, QCustomPlot
+  then takes ownership of the color map.
+*/
+QCPColorMap::QCPColorMap(QCPAxis *keyAxis, QCPAxis *valueAxis) :
+  QCPAbstractPlottable(keyAxis, valueAxis),
+  mDataScaleType(QCPAxis::stLinear),
+  mMapData(new QCPColorMapData(10, 10, QCPRange(0, 5), QCPRange(0, 5))),
+  mInterpolate(true),
+  mTightBoundary(false),
+  mMapImageInvalidated(true)
+{
+}
+
+QCPColorMap::~QCPColorMap()
+{
+  delete mMapData;
+}
+
+/*!
+  Replaces the current \ref data with the provided \a data.
+  
+  If \a copy is set to true, the \a data object will only be copied. if false, the color map
+  takes ownership of the passed data and replaces the internal data pointer with it. This is
+  significantly faster than copying for large datasets.
+*/
+void QCPColorMap::setData(QCPColorMapData *data, bool copy)
+{
+  if (mMapData == data)
+  {
+    qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast<quintptr>(data);
+    return;
+  }
+  if (copy)
+  {
+    *mMapData = *data;
+  } else
+  {
+    delete mMapData;
+    mMapData = data;
+  }
+  mMapImageInvalidated = true;
+}
+
+/*!
+  Sets the data range of this color map to \a dataRange. The data range defines which data values
+  are mapped to the color gradient.
+  
+  To make the data range span the full range of the data set, use \ref rescaleDataRange.
+  
+  \see QCPColorScale::setDataRange
+*/
+void QCPColorMap::setDataRange(const QCPRange &dataRange)
+{
+  if (!QCPRange::validRange(dataRange)) return;
+  if (mDataRange.lower != dataRange.lower || mDataRange.upper != dataRange.upper)
+  {
+    if (mDataScaleType == QCPAxis::stLogarithmic)
+      mDataRange = dataRange.sanitizedForLogScale();
+    else
+      mDataRange = dataRange.sanitizedForLinScale();
+    mMapImageInvalidated = true;
+    emit dataRangeChanged(mDataRange);
+  }
+}
+
+/*!
+  Sets whether the data is correlated with the color gradient linearly or logarithmically.
+  
+  \see QCPColorScale::setDataScaleType
+*/
+void QCPColorMap::setDataScaleType(QCPAxis::ScaleType scaleType)
+{
+  if (mDataScaleType != scaleType)
+  {
+    mDataScaleType = scaleType;
+    mMapImageInvalidated = true;
+    emit dataScaleTypeChanged(mDataScaleType);
+    if (mDataScaleType == QCPAxis::stLogarithmic)
+      setDataRange(mDataRange.sanitizedForLogScale());
+  }
+}
+
+/*!
+  Sets the color gradient that is used to represent the data. For more details on how to create an
+  own gradient or use one of the preset gradients, see \ref QCPColorGradient.
+  
+  The colors defined by the gradient will be used to represent data values in the currently set
+  data range, see \ref setDataRange. Data points that are outside this data range will either be
+  colored uniformly with the respective gradient boundary color, or the gradient will repeat,
+  depending on \ref QCPColorGradient::setPeriodic.
+  
+  \see QCPColorScale::setGradient
+*/
+void QCPColorMap::setGradient(const QCPColorGradient &gradient)
+{
+  if (mGradient != gradient)
+  {
+    mGradient = gradient;
+    mMapImageInvalidated = true;
+    emit gradientChanged(mGradient);
+  }
+}
+
+/*!
+  Sets whether the color map image shall use bicubic interpolation when displaying the color map
+  shrinked or expanded, and not at a 1:1 pixel-to-data scale.
+  
+  \image html QCPColorMap-interpolate.png "A 10*10 color map, with interpolation and without interpolation enabled"
+*/
+void QCPColorMap::setInterpolate(bool enabled)
+{
+  mInterpolate = enabled;
+  mMapImageInvalidated = true; // because oversampling factors might need to change
+}
+
+/*!
+  Sets whether the outer most data rows and columns are clipped to the specified key and value
+  range (see \ref QCPColorMapData::setKeyRange, \ref QCPColorMapData::setValueRange).
+  
+  if \a enabled is set to false, the data points at the border of the color map are drawn with the
+  same width and height as all other data points. Since the data points are represented by
+  rectangles of one color centered on the data coordinate, this means that the shown color map
+  extends by half a data point over the specified key/value range in each direction.
+  
+  \image html QCPColorMap-tightboundary.png "A color map, with tight boundary enabled and disabled"
+*/
+void QCPColorMap::setTightBoundary(bool enabled)
+{
+  mTightBoundary = enabled;
+}
+
+/*!
+  Associates the color scale \a colorScale with this color map.
+  
+  This means that both the color scale and the color map synchronize their gradient, data range and
+  data scale type (\ref setGradient, \ref setDataRange, \ref setDataScaleType). Multiple color maps
+  can be associated with one single color scale. This causes the color maps to also synchronize
+  those properties, via the mutual color scale.
+  
+  This function causes the color map to adopt the current color gradient, data range and data scale
+  type of \a colorScale. After this call, you may change these properties at either the color map
+  or the color scale, and the setting will be applied to both.
+  
+  Pass 0 as \a colorScale to disconnect the color scale from this color map again.
+*/
+void QCPColorMap::setColorScale(QCPColorScale *colorScale)
+{
+  if (mColorScale) // unconnect signals from old color scale
+  {
+    disconnect(this, SIGNAL(dataRangeChanged(QCPRange)), mColorScale.data(), SLOT(setDataRange(QCPRange)));
+    disconnect(this, SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), mColorScale.data(), SLOT(setDataScaleType(QCPAxis::ScaleType)));
+    disconnect(this, SIGNAL(gradientChanged(QCPColorGradient)), mColorScale.data(), SLOT(setGradient(QCPColorGradient)));
+    disconnect(mColorScale.data(), SIGNAL(dataRangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange)));
+    disconnect(mColorScale.data(), SIGNAL(gradientChanged(QCPColorGradient)), this, SLOT(setGradient(QCPColorGradient)));
+    disconnect(mColorScale.data(), SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType)));
+  }
+  mColorScale = colorScale;
+  if (mColorScale) // connect signals to new color scale
+  {
+    setGradient(mColorScale.data()->gradient());
+    setDataRange(mColorScale.data()->dataRange());
+    setDataScaleType(mColorScale.data()->dataScaleType());
+    connect(this, SIGNAL(dataRangeChanged(QCPRange)), mColorScale.data(), SLOT(setDataRange(QCPRange)));
+    connect(this, SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), mColorScale.data(), SLOT(setDataScaleType(QCPAxis::ScaleType)));
+    connect(this, SIGNAL(gradientChanged(QCPColorGradient)), mColorScale.data(), SLOT(setGradient(QCPColorGradient)));
+    connect(mColorScale.data(), SIGNAL(dataRangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange)));
+    connect(mColorScale.data(), SIGNAL(gradientChanged(QCPColorGradient)), this, SLOT(setGradient(QCPColorGradient)));
+    connect(mColorScale.data(), SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType)));
+  }
+}
+
+/*!
+  Sets the data range (\ref setDataRange) to span the minimum and maximum values that occur in the
+  current data set. This corresponds to the \ref rescaleKeyAxis or \ref rescaleValueAxis methods,
+  only for the third data dimension of the color map.
+  
+  The minimum and maximum values of the data set are buffered in the internal QCPColorMapData
+  instance (\ref data). As data is updated via its \ref QCPColorMapData::setCell or \ref
+  QCPColorMapData::setData, the buffered minimum and maximum values are updated, too. For
+  performance reasons, however, they are only updated in an expanding fashion. So the buffered
+  maximum can only increase and the buffered minimum can only decrease. In consequence, changes to
+  the data that actually lower the maximum of the data set (by overwriting the cell holding the
+  current maximum with a smaller value), aren't recognized and the buffered maximum overestimates
+  the true maximum of the data set. The same happens for the buffered minimum. To recalculate the
+  true minimum and maximum by explicitly looking at each cell, the method
+  QCPColorMapData::recalculateDataBounds can be used. For convenience, setting the parameter \a
+  recalculateDataBounds calls this method before setting the data range to the buffered minimum and
+  maximum.
+  
+  \see setDataRange
+*/
+void QCPColorMap::rescaleDataRange(bool recalculateDataBounds)
+{
+  if (recalculateDataBounds)
+    mMapData->recalculateDataBounds();
+  setDataRange(mMapData->dataBounds());
+}
+
+/*!
+  Takes the current appearance of the color map and updates the legend icon, which is used to
+  represent this color map in the legend (see \ref QCPLegend).
+  
+  The \a transformMode specifies whether the rescaling is done by a faster, low quality image
+  scaling algorithm (Qt::FastTransformation) or by a slower, higher quality algorithm
+  (Qt::SmoothTransformation).
+  
+  The current color map appearance is scaled down to \a thumbSize. Ideally, this should be equal to
+  the size of the legend icon (see \ref QCPLegend::setIconSize). If it isn't exactly the configured
+  legend icon size, the thumb will be rescaled during drawing of the legend item.
+  
+  \see setDataRange
+*/
+void QCPColorMap::updateLegendIcon(Qt::TransformationMode transformMode, const QSize &thumbSize)
+{
+  if (mMapImage.isNull() && !data()->isEmpty())
+    updateMapImage(); // try to update map image if it's null (happens if no draw has happened yet)
+  
+  if (!mMapImage.isNull()) // might still be null, e.g. if data is empty, so check here again
+  {
+    bool mirrorX = (keyAxis()->orientation() == Qt::Horizontal ? keyAxis() : valueAxis())->rangeReversed();
+    bool mirrorY = (valueAxis()->orientation() == Qt::Vertical ? valueAxis() : keyAxis())->rangeReversed();
+    mLegendIcon = QPixmap::fromImage(mMapImage.mirrored(mirrorX, mirrorY)).scaled(thumbSize, Qt::KeepAspectRatio, transformMode);
+  }
+}
+
+/*!
+  Clears the colormap data by calling \ref QCPColorMapData::clear() on the internal data. This also
+  resizes the map to 0x0 cells.
+*/
+void QCPColorMap::clearData()
+{
+  mMapData->clear();
+}
+
+/* inherits documentation from base class */
+double QCPColorMap::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+  
+  if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint()))
+  {
+    double posKey, posValue;
+    pixelsToCoords(pos, posKey, posValue);
+    if (mMapData->keyRange().contains(posKey) && mMapData->valueRange().contains(posValue))
+      return mParentPlot->selectionTolerance()*0.99;
+  }
+  return -1;
+}
+
+/*! \internal
+  
+  Updates the internal map image buffer by going through the internal \ref QCPColorMapData and
+  turning the data values into color pixels with \ref QCPColorGradient::colorize.
+  
+  This method is called by \ref QCPColorMap::draw if either the data has been modified or the map image
+  has been invalidated for a different reason (e.g. a change of the data range with \ref
+  setDataRange).
+  
+  If the map cell count is low, the image created will be oversampled in order to avoid a
+  QPainter::drawImage bug which makes inner pixel boundaries jitter when stretch-drawing images
+  without smooth transform enabled. Accordingly, oversampling isn't performed if \ref
+  setInterpolate is true.
+*/
+void QCPColorMap::updateMapImage()
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  if (!keyAxis) return;
+  if (mMapData->isEmpty()) return;
+  
+  const int keySize = mMapData->keySize();
+  const int valueSize = mMapData->valueSize();
+  int keyOversamplingFactor = mInterpolate ? 1 : (int)(1.0+100.0/(double)keySize); // make mMapImage have at least size 100, factor becomes 1 if size > 200 or interpolation is on
+  int valueOversamplingFactor = mInterpolate ? 1 : (int)(1.0+100.0/(double)valueSize); // make mMapImage have at least size 100, factor becomes 1 if size > 200 or interpolation is on
+  
+  // resize mMapImage to correct dimensions including possible oversampling factors, according to key/value axes orientation:
+  if (keyAxis->orientation() == Qt::Horizontal && (mMapImage.width() != keySize*keyOversamplingFactor || mMapImage.height() != valueSize*valueOversamplingFactor))
+    mMapImage = QImage(QSize(keySize*keyOversamplingFactor, valueSize*valueOversamplingFactor), QImage::Format_RGB32);
+  else if (keyAxis->orientation() == Qt::Vertical && (mMapImage.width() != valueSize*valueOversamplingFactor || mMapImage.height() != keySize*keyOversamplingFactor))
+    mMapImage = QImage(QSize(valueSize*valueOversamplingFactor, keySize*keyOversamplingFactor), QImage::Format_RGB32);
+  
+  QImage *localMapImage = &mMapImage; // this is the image on which the colorization operates. Either the final mMapImage, or if we need oversampling, mUndersampledMapImage
+  if (keyOversamplingFactor > 1 || valueOversamplingFactor > 1)
+  {
+    // resize undersampled map image to actual key/value cell sizes:
+    if (keyAxis->orientation() == Qt::Horizontal && (mUndersampledMapImage.width() != keySize || mUndersampledMapImage.height() != valueSize))
+      mUndersampledMapImage = QImage(QSize(keySize, valueSize), QImage::Format_RGB32);
+    else if (keyAxis->orientation() == Qt::Vertical && (mUndersampledMapImage.width() != valueSize || mUndersampledMapImage.height() != keySize))
+      mUndersampledMapImage = QImage(QSize(valueSize, keySize), QImage::Format_RGB32);
+    localMapImage = &mUndersampledMapImage; // make the colorization run on the undersampled image
+  } else if (!mUndersampledMapImage.isNull())
+    mUndersampledMapImage = QImage(); // don't need oversampling mechanism anymore (map size has changed) but mUndersampledMapImage still has nonzero size, free it
+  
+  const double *rawData = mMapData->mData;
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    const int lineCount = valueSize;
+    const int rowCount = keySize;
+    for (int line=0; line<lineCount; ++line)
+    {
+      QRgb* pixels = reinterpret_cast<QRgb*>(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system)
+      mGradient.colorize(rawData+line*rowCount, mDataRange, pixels, rowCount, 1, mDataScaleType==QCPAxis::stLogarithmic);
+    }
+  } else // keyAxis->orientation() == Qt::Vertical
+  {
+    const int lineCount = keySize;
+    const int rowCount = valueSize;
+    for (int line=0; line<lineCount; ++line)
+    {
+      QRgb* pixels = reinterpret_cast<QRgb*>(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system)
+      mGradient.colorize(rawData+line, mDataRange, pixels, rowCount, lineCount, mDataScaleType==QCPAxis::stLogarithmic);
+    }
+  }
+  
+  if (keyOversamplingFactor > 1 || valueOversamplingFactor > 1)
+  {
+    if (keyAxis->orientation() == Qt::Horizontal)
+      mMapImage = mUndersampledMapImage.scaled(keySize*keyOversamplingFactor, valueSize*valueOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation);
+    else
+      mMapImage = mUndersampledMapImage.scaled(valueSize*valueOversamplingFactor, keySize*keyOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation);
+  }
+  mMapData->mDataModified = false;
+  mMapImageInvalidated = false;
+}
+
+/* inherits documentation from base class */
+void QCPColorMap::draw(QCPPainter *painter)
+{
+  if (mMapData->isEmpty()) return;
+  if (!mKeyAxis || !mValueAxis) return;
+  applyDefaultAntialiasingHint(painter);
+  
+  if (mMapData->mDataModified || mMapImageInvalidated)
+    updateMapImage();
+  
+  // use buffer if painting vectorized (PDF):
+  bool useBuffer = painter->modes().testFlag(QCPPainter::pmVectorized);
+  QCPPainter *localPainter = painter; // will be redirected to paint on mapBuffer if painting vectorized
+  QRectF mapBufferTarget; // the rect in absolute widget coordinates where the visible map portion/buffer will end up in
+  QPixmap mapBuffer;
+  double mapBufferPixelRatio = 3; // factor by which DPI is increased in embedded bitmaps
+  if (useBuffer)
+  {
+    mapBufferTarget = painter->clipRegion().boundingRect();
+    mapBuffer = QPixmap((mapBufferTarget.size()*mapBufferPixelRatio).toSize());
+    mapBuffer.fill(Qt::transparent);
+    localPainter = new QCPPainter(&mapBuffer);
+    localPainter->scale(mapBufferPixelRatio, mapBufferPixelRatio);
+    localPainter->translate(-mapBufferTarget.topLeft());
+  }
+  
+  QRectF imageRect = QRectF(coordsToPixels(mMapData->keyRange().lower, mMapData->valueRange().lower),
+                            coordsToPixels(mMapData->keyRange().upper, mMapData->valueRange().upper)).normalized();
+  // extend imageRect to contain outer halves/quarters of bordering/cornering pixels (cells are centered on map range boundary):
+  double halfCellWidth = 0; // in pixels
+  double halfCellHeight = 0; // in pixels
+  if (keyAxis()->orientation() == Qt::Horizontal)
+  {
+    if (mMapData->keySize() > 1)
+      halfCellWidth = 0.5*imageRect.width()/(double)(mMapData->keySize()-1);
+    if (mMapData->valueSize() > 1)
+      halfCellHeight = 0.5*imageRect.height()/(double)(mMapData->valueSize()-1);
+  } else // keyAxis orientation is Qt::Vertical
+  {
+    if (mMapData->keySize() > 1)
+      halfCellHeight = 0.5*imageRect.height()/(double)(mMapData->keySize()-1);
+    if (mMapData->valueSize() > 1)
+      halfCellWidth = 0.5*imageRect.width()/(double)(mMapData->valueSize()-1);
+  }
+  imageRect.adjust(-halfCellWidth, -halfCellHeight, halfCellWidth, halfCellHeight);
+  bool mirrorX = (keyAxis()->orientation() == Qt::Horizontal ? keyAxis() : valueAxis())->rangeReversed();
+  bool mirrorY = (valueAxis()->orientation() == Qt::Vertical ? valueAxis() : keyAxis())->rangeReversed();
+  bool smoothBackup = localPainter->renderHints().testFlag(QPainter::SmoothPixmapTransform);
+  localPainter->setRenderHint(QPainter::SmoothPixmapTransform, mInterpolate);
+  QRegion clipBackup;
+  if (mTightBoundary)
+  {
+    clipBackup = localPainter->clipRegion();
+    QRectF tightClipRect = QRectF(coordsToPixels(mMapData->keyRange().lower, mMapData->valueRange().lower),
+                                  coordsToPixels(mMapData->keyRange().upper, mMapData->valueRange().upper)).normalized();
+    localPainter->setClipRect(tightClipRect, Qt::IntersectClip);
+  }
+  localPainter->drawImage(imageRect, mMapImage.mirrored(mirrorX, mirrorY));
+  if (mTightBoundary)
+    localPainter->setClipRegion(clipBackup);
+  localPainter->setRenderHint(QPainter::SmoothPixmapTransform, smoothBackup);
+  
+  if (useBuffer) // localPainter painted to mapBuffer, so now draw buffer with original painter
+  {
+    delete localPainter;
+    painter->drawPixmap(mapBufferTarget.toRect(), mapBuffer);
+  }
+}
+
+/* inherits documentation from base class */
+void QCPColorMap::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const
+{
+  applyDefaultAntialiasingHint(painter);
+  // draw map thumbnail:
+  if (!mLegendIcon.isNull())
+  {
+    QPixmap scaledIcon = mLegendIcon.scaled(rect.size().toSize(), Qt::KeepAspectRatio, Qt::FastTransformation);
+    QRectF iconRect = QRectF(0, 0, scaledIcon.width(), scaledIcon.height());
+    iconRect.moveCenter(rect.center());
+    painter->drawPixmap(iconRect.topLeft(), scaledIcon);
+  }
+  /*
+  // draw frame:
+  painter->setBrush(Qt::NoBrush);
+  painter->setPen(Qt::black);
+  painter->drawRect(rect.adjusted(1, 1, 0, 0));
+  */
+}
+
+/* inherits documentation from base class */
+QCPRange QCPColorMap::getKeyRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  foundRange = true;
+  QCPRange result = mMapData->keyRange();
+  result.normalize();
+  if (inSignDomain == QCPAbstractPlottable::sdPositive)
+  {
+    if (result.lower <= 0 && result.upper > 0)
+      result.lower = result.upper*1e-3;
+    else if (result.lower <= 0 && result.upper <= 0)
+      foundRange = false;
+  } else if (inSignDomain == QCPAbstractPlottable::sdNegative)
+  {
+    if (result.upper >= 0 && result.lower < 0)
+      result.upper = result.lower*1e-3;
+    else if (result.upper >= 0 && result.lower >= 0)
+      foundRange = false;
+  }
+  return result;
+}
+
+/* inherits documentation from base class */
+QCPRange QCPColorMap::getValueRange(bool &foundRange, SignDomain inSignDomain) const
+{
+  foundRange = true;
+  QCPRange result = mMapData->valueRange();
+  result.normalize();
+  if (inSignDomain == QCPAbstractPlottable::sdPositive)
+  {
+    if (result.lower <= 0 && result.upper > 0)
+      result.lower = result.upper*1e-3;
+    else if (result.lower <= 0 && result.upper <= 0)
+      foundRange = false;
+  } else if (inSignDomain == QCPAbstractPlottable::sdNegative)
+  {
+    if (result.upper >= 0 && result.lower < 0)
+      result.upper = result.lower*1e-3;
+    else if (result.upper >= 0 && result.lower >= 0)
+      foundRange = false;
+  }
+  return result;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPFinancialData
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPFinancialData
+  \brief Holds the data of one single data point for QCPFinancial.
+  
+  The container for storing multiple data points is \ref QCPFinancialDataMap.
+  
+  The stored data is:
+  \li \a key: coordinate on the key axis of this data point
+  \li \a open: The opening value at the data point
+  \li \a high: The high/maximum value at the data point
+  \li \a low: The low/minimum value at the data point
+  \li \a close: The closing value at the data point
+  
+  \see QCPFinancialDataMap
+*/
+
+/*!
+  Constructs a data point with key and all values set to zero.
+*/
+QCPFinancialData::QCPFinancialData() :
+  key(0),
+  open(0),
+  high(0),
+  low(0),
+  close(0)
+{
+}
+
+/*!
+  Constructs a data point with the specified \a key and OHLC values.
+*/
+QCPFinancialData::QCPFinancialData(double key, double open, double high, double low, double close) :
+  key(key),
+  open(open),
+  high(high),
+  low(low),
+  close(close)
+{
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPFinancial
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPFinancial
+  \brief A plottable representing a financial stock chart
+
+  \image html QCPFinancial.png
+  
+  This plottable represents time series data binned to certain intervals, mainly used for stock
+  charts. The two common representations OHLC (Open-High-Low-Close) bars and Candlesticks can be
+  set via \ref setChartStyle.
+  
+  The data is passed via \ref setData as a set of open/high/low/close values at certain keys
+  (typically times). This means the data must be already binned appropriately. If data is only
+  available as a series of values (e.g. \a price against \a time), you can use the static
+  convenience function \ref timeSeriesToOhlc to generate binned OHLC-data which can then be passed
+  to \ref setData.
+  
+  The width of the OHLC bars/candlesticks can be controlled with \ref setWidth and is given in plot
+  key coordinates. A typical choice is to set it to (or slightly less than) one bin interval width.
+  
+  \section appearance Changing the appearance
+  
+  Charts can be either single- or two-colored (\ref setTwoColored). If set to be single-colored,
+  lines are drawn with the plottable's pen (\ref setPen) and fills with the brush (\ref setBrush).
+  
+  If set to two-colored, positive changes of the value during an interval (\a close >= \a open) are
+  represented with a different pen and brush than negative changes (\a close < \a open). These can
+  be configured with \ref setPenPositive, \ref setPenNegative, \ref setBrushPositive, and \ref
+  setBrushNegative. In two-colored mode, the normal plottable pen/brush is ignored. Upon selection
+  however, the normal selected pen/brush (\ref setSelectedPen, \ref setSelectedBrush) is used,
+  irrespective of whether the chart is single- or two-colored.
+  
+*/
+
+/* start of documentation of inline functions */
+
+/*! \fn QCPFinancialDataMap *QCPFinancial::data() const
+  
+  Returns a pointer to the internal data storage of type \ref QCPFinancialDataMap. You may use it to
+  directly manipulate the data, which may be more convenient and faster than using the regular \ref
+  setData or \ref addData methods, in certain situations.
+*/
+
+/* end of documentation of inline functions */
+
+/*!
+  Constructs a financial chart which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value
+  axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have
+  the same orientation. If either of these restrictions is violated, a corresponding message is
+  printed to the debug output (qDebug), the construction is not aborted, though.
+  
+  The constructed QCPFinancial can be added to the plot with QCustomPlot::addPlottable, QCustomPlot
+  then takes ownership of the financial chart.
+*/
+QCPFinancial::QCPFinancial(QCPAxis *keyAxis, QCPAxis *valueAxis) :
+  QCPAbstractPlottable(keyAxis, valueAxis),
+  mData(0),
+  mChartStyle(csOhlc),
+  mWidth(0.5),
+  mTwoColored(false),
+  mBrushPositive(QBrush(QColor(210, 210, 255))),
+  mBrushNegative(QBrush(QColor(255, 210, 210))),
+  mPenPositive(QPen(QColor(10, 40, 180))),
+  mPenNegative(QPen(QColor(180, 40, 10)))
+{
+  mData = new QCPFinancialDataMap;
+  
+  setSelectedPen(QPen(QColor(80, 80, 255), 2.5));
+  setSelectedBrush(QBrush(QColor(80, 80, 255)));
+}
+
+QCPFinancial::~QCPFinancial()
+{
+  delete mData;
+}
+
+/*!
+  Replaces the current data with the provided \a data.
+  
+  If \a copy is set to true, data points in \a data will only be copied. if false, the plottable
+  takes ownership of the passed data and replaces the internal data pointer with it. This is
+  significantly faster than copying for large datasets.
+  
+  Alternatively, you can also access and modify the plottable's data via the \ref data method, which
+  returns a pointer to the internal \ref QCPFinancialDataMap.
+  
+  \see timeSeriesToOhlc
+*/
+void QCPFinancial::setData(QCPFinancialDataMap *data, bool copy)
+{
+  if (mData == data)
+  {
+    qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast<quintptr>(data);
+    return;
+  }
+  if (copy)
+  {
+    *mData = *data;
+  } else
+  {
+    delete mData;
+    mData = data;
+  }
+}
+
+/*! \overload
+  
+  Replaces the current data with the provided open/high/low/close data. The provided vectors should
+  have equal length. Else, the number of added points will be the size of the smallest vector.
+  
+  \see timeSeriesToOhlc
+*/
+void QCPFinancial::setData(const QVector<double> &key, const QVector<double> &open, const QVector<double> &high, const QVector<double> &low, const QVector<double> &close)
+{
+  mData->clear();
+  int n = key.size();
+  n = qMin(n, open.size());
+  n = qMin(n, high.size());
+  n = qMin(n, low.size());
+  n = qMin(n, close.size());
+  for (int i=0; i<n; ++i)
+  {
+    mData->insertMulti(key[i], QCPFinancialData(key[i], open[i], high[i], low[i], close[i]));
+  }
+}
+
+/*!
+  Sets which representation style shall be used to display the OHLC data.
+*/
+void QCPFinancial::setChartStyle(QCPFinancial::ChartStyle style)
+{
+  mChartStyle = style;
+}
+
+/*!
+  Sets the width of the individual bars/candlesticks to \a width in plot key coordinates.
+  
+  A typical choice is to set it to (or slightly less than) one bin interval width.
+*/
+void QCPFinancial::setWidth(double width)
+{
+  mWidth = width;
+}
+
+/*!
+  Sets whether this chart shall contrast positive from negative trends per data point by using two
+  separate colors to draw the respective bars/candlesticks.
+  
+  If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref
+  setBrush).
+  
+  \see setPenPositive, setPenNegative, setBrushPositive, setBrushNegative
+*/
+void QCPFinancial::setTwoColored(bool twoColored)
+{
+  mTwoColored = twoColored;
+}
+
+/*!
+  If \ref setTwoColored is set to true, this function controls the brush that is used to draw fills
+  of data points with a positive trend (i.e. bars/candlesticks with close >= open).
+  
+  If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref
+  setBrush).
+  
+  \see setBrushNegative, setPenPositive, setPenNegative
+*/
+void QCPFinancial::setBrushPositive(const QBrush &brush)
+{
+  mBrushPositive = brush;
+}
+
+/*!
+  If \ref setTwoColored is set to true, this function controls the brush that is used to draw fills
+  of data points with a negative trend (i.e. bars/candlesticks with close < open).
+  
+  If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref
+  setBrush).
+  
+  \see setBrushPositive, setPenNegative, setPenPositive
+*/
+void QCPFinancial::setBrushNegative(const QBrush &brush)
+{
+  mBrushNegative = brush;
+}
+
+/*!
+  If \ref setTwoColored is set to true, this function controls the pen that is used to draw
+  outlines of data points with a positive trend (i.e. bars/candlesticks with close >= open).
+  
+  If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref
+  setBrush).
+  
+  \see setPenNegative, setBrushPositive, setBrushNegative
+*/
+void QCPFinancial::setPenPositive(const QPen &pen)
+{
+  mPenPositive = pen;
+}
+
+/*!
+  If \ref setTwoColored is set to true, this function controls the pen that is used to draw
+  outlines of data points with a negative trend (i.e. bars/candlesticks with close < open).
+  
+  If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref
+  setBrush).
+  
+  \see setPenPositive, setBrushNegative, setBrushPositive
+*/
+void QCPFinancial::setPenNegative(const QPen &pen)
+{
+  mPenNegative = pen;
+}
+
+/*!
+  Adds the provided data points in \a dataMap to the current data.
+  
+  Alternatively, you can also access and modify the data via the \ref data method, which returns a
+  pointer to the internal \ref QCPFinancialDataMap.
+  
+  \see removeData
+*/
+void QCPFinancial::addData(const QCPFinancialDataMap &dataMap)
+{
+  mData->unite(dataMap);
+}
+
+/*! \overload
+  
+  Adds the provided single data point in \a data to the current data.
+  
+  Alternatively, you can also access and modify the data via the \ref data method, which returns a
+  pointer to the internal \ref QCPFinancialData.
+  
+  \see removeData
+*/
+void QCPFinancial::addData(const QCPFinancialData &data)
+{
+  mData->insertMulti(data.key, data);
+}
+
+/*! \overload
+  
+  Adds the provided single data point given by \a key, \a open, \a high, \a low, and \a close to
+  the current data.
+  
+  Alternatively, you can also access and modify the data via the \ref data method, which returns a
+  pointer to the internal \ref QCPFinancialData.
+  
+  \see removeData
+*/
+void QCPFinancial::addData(double key, double open, double high, double low, double close)
+{
+  mData->insertMulti(key, QCPFinancialData(key, open, high, low, close));
+}
+
+/*! \overload
+  
+  Adds the provided open/high/low/close data to the current data.
+  
+  Alternatively, you can also access and modify the data via the \ref data method, which returns a
+  pointer to the internal \ref QCPFinancialData.
+  
+  \see removeData
+*/
+void QCPFinancial::addData(const QVector<double> &key, const QVector<double> &open, const QVector<double> &high, const QVector<double> &low, const QVector<double> &close)
+{
+  int n = key.size();
+  n = qMin(n, open.size());
+  n = qMin(n, high.size());
+  n = qMin(n, low.size());
+  n = qMin(n, close.size());
+  for (int i=0; i<n; ++i)
+  {
+    mData->insertMulti(key[i], QCPFinancialData(key[i], open[i], high[i], low[i], close[i]));
+  }
+}
+
+/*!
+  Removes all data points with keys smaller than \a key.
+  
+  \see addData, clearData
+*/
+void QCPFinancial::removeDataBefore(double key)
+{
+  QCPFinancialDataMap::iterator it = mData->begin();
+  while (it != mData->end() && it.key() < key)
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with keys greater than \a key.
+  
+  \see addData, clearData
+*/
+void QCPFinancial::removeDataAfter(double key)
+{
+  if (mData->isEmpty()) return;
+  QCPFinancialDataMap::iterator it = mData->upperBound(key);
+  while (it != mData->end())
+    it = mData->erase(it);
+}
+
+/*!
+  Removes all data points with keys between \a fromKey and \a toKey. if \a fromKey is greater or
+  equal to \a toKey, the function does nothing. To remove a single data point with known key, use
+  \ref removeData(double key).
+  
+  \see addData, clearData
+*/
+void QCPFinancial::removeData(double fromKey, double toKey)
+{
+  if (fromKey >= toKey || mData->isEmpty()) return;
+  QCPFinancialDataMap::iterator it = mData->upperBound(fromKey);
+  QCPFinancialDataMap::iterator itEnd = mData->upperBound(toKey);
+  while (it != itEnd)
+    it = mData->erase(it);
+}
+
+/*! \overload
+  
+  Removes a single data point at \a key. If the position is not known with absolute precision,
+  consider using \ref removeData(double fromKey, double toKey) with a small fuzziness interval
+  around the suspected position, depeding on the precision with which the key is known.
+
+  \see addData, clearData
+*/
+void QCPFinancial::removeData(double key)
+{
+  mData->remove(key);
+}
+
+/*!
+  Removes all data points.
+  
+  \see removeData, removeDataAfter, removeDataBefore
+*/
+void QCPFinancial::clearData()
+{
+  mData->clear();
+}
+
+/* inherits documentation from base class */
+double QCPFinancial::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+  
+  if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint()))
+  {
+    // get visible data range:
+    QCPFinancialDataMap::const_iterator lower, upper; // note that upper is the actual upper point, and not 1 step after the upper point
+    getVisibleDataBounds(lower, upper);
+    if (lower == mData->constEnd() || upper == mData->constEnd())
+      return -1;
+    // perform select test according to configured style:
+    switch (mChartStyle)
+    {
+      case QCPFinancial::csOhlc:
+        return ohlcSelectTest(pos, lower, upper+1); break;
+      case QCPFinancial::csCandlestick:
+        return candlestickSelectTest(pos, lower, upper+1); break;
+    }
+  }
+  return -1;
+}
+
+/*!
+  A convenience function that converts time series data (\a value against \a time) to OHLC binned
+  data points. The return value can then be passed on to \ref setData.
+  
+  The size of the bins can be controlled with \a timeBinSize in the same units as \a time is given.
+  For example, if the unit of \a time is seconds and single OHLC/Candlesticks should span an hour
+  each, set \a timeBinSize to 3600.
+  
+  \a timeBinOffset allows to control precisely at what \a time coordinate a bin should start. The
+  value passed as \a timeBinOffset doesn't need to be in the range encompassed by the \a time keys.
+  It merely defines the mathematical offset/phase of the bins that will be used to process the
+  data.
+*/
+QCPFinancialDataMap QCPFinancial::timeSeriesToOhlc(const QVector<double> &time, const QVector<double> &value, double timeBinSize, double timeBinOffset)
+{
+  QCPFinancialDataMap map;
+  int count = qMin(time.size(), value.size());
+  if (count == 0)
+    return QCPFinancialDataMap();
+  
+  QCPFinancialData currentBinData(0, value.first(), value.first(), value.first(), value.first());
+  int currentBinIndex = qFloor((time.first()-timeBinOffset)/timeBinSize+0.5);
+  for (int i=0; i<count; ++i)
+  {
+    int index = qFloor((time.at(i)-timeBinOffset)/timeBinSize+0.5);
+    if (currentBinIndex == index) // data point still in current bin, extend high/low:
+    {
+      if (value.at(i) < currentBinData.low) currentBinData.low = value.at(i);
+      if (value.at(i) > currentBinData.high) currentBinData.high = value.at(i);
+      if (i == count-1) // last data point is in current bin, finalize bin:
+      {
+        currentBinData.close = value.at(i);
+        currentBinData.key = timeBinOffset+(index)*timeBinSize;
+        map.insert(currentBinData.key, currentBinData);
+      }
+    } else // data point not anymore in current bin, set close of old and open of new bin, and add old to map:
+    {
+      // finalize current bin:
+      currentBinData.close = value.at(i-1);
+      currentBinData.key = timeBinOffset+(index-1)*timeBinSize;
+      map.insert(currentBinData.key, currentBinData);
+      // start next bin:
+      currentBinIndex = index;
+      currentBinData.open = value.at(i);
+      currentBinData.high = value.at(i);
+      currentBinData.low = value.at(i);
+    }
+  }
+  
+  return map;
+}
+
+/* inherits documentation from base class */
+void QCPFinancial::draw(QCPPainter *painter)
+{
+  // get visible data range:
+  QCPFinancialDataMap::const_iterator lower, upper; // note that upper is the actual upper point, and not 1 step after the upper point
+  getVisibleDataBounds(lower, upper);
+  if (lower == mData->constEnd() || upper == mData->constEnd())
+    return;
+  
+  // draw visible data range according to configured style:
+  switch (mChartStyle)
+  {
+    case QCPFinancial::csOhlc:
+      drawOhlcPlot(painter, lower, upper+1); break;
+    case QCPFinancial::csCandlestick:
+      drawCandlestickPlot(painter, lower, upper+1); break;
+  }
+}
+
+/* inherits documentation from base class */
+void QCPFinancial::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const
+{
+  painter->setAntialiasing(false); // legend icon especially of csCandlestick looks better without antialiasing
+  if (mChartStyle == csOhlc)
+  {
+    if (mTwoColored)
+    {
+      // draw upper left half icon with positive color:
+      painter->setBrush(mBrushPositive);
+      painter->setPen(mPenPositive);
+      painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.topLeft().toPoint()));
+      painter->drawLine(QLineF(0, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.2, rect.height()*0.3, rect.width()*0.2, rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.8, rect.height()*0.5, rect.width()*0.8, rect.height()*0.7).translated(rect.topLeft()));
+      // draw bottom right hald icon with negative color:
+      painter->setBrush(mBrushNegative);
+      painter->setPen(mPenNegative);
+      painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.bottomRight().toPoint()));
+      painter->drawLine(QLineF(0, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.2, rect.height()*0.3, rect.width()*0.2, rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.8, rect.height()*0.5, rect.width()*0.8, rect.height()*0.7).translated(rect.topLeft()));
+    } else
+    {
+      painter->setBrush(mBrush);
+      painter->setPen(mPen);
+      painter->drawLine(QLineF(0, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.2, rect.height()*0.3, rect.width()*0.2, rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.8, rect.height()*0.5, rect.width()*0.8, rect.height()*0.7).translated(rect.topLeft()));
+    }
+  } else if (mChartStyle == csCandlestick)
+  {
+    if (mTwoColored)
+    {
+      // draw upper left half icon with positive color:
+      painter->setBrush(mBrushPositive);
+      painter->setPen(mPenPositive);
+      painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.topLeft().toPoint()));
+      painter->drawLine(QLineF(0, rect.height()*0.5, rect.width()*0.25, rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.75, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawRect(QRectF(rect.width()*0.25, rect.height()*0.25, rect.width()*0.5, rect.height()*0.5).translated(rect.topLeft()));
+      // draw bottom right hald icon with negative color:
+      painter->setBrush(mBrushNegative);
+      painter->setPen(mPenNegative);
+      painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.bottomRight().toPoint()));
+      painter->drawLine(QLineF(0, rect.height()*0.5, rect.width()*0.25, rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.75, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawRect(QRectF(rect.width()*0.25, rect.height()*0.25, rect.width()*0.5, rect.height()*0.5).translated(rect.topLeft()));
+    } else
+    {
+      painter->setBrush(mBrush);
+      painter->setPen(mPen);
+      painter->drawLine(QLineF(0, rect.height()*0.5, rect.width()*0.25, rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawLine(QLineF(rect.width()*0.75, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft()));
+      painter->drawRect(QRectF(rect.width()*0.25, rect.height()*0.25, rect.width()*0.5, rect.height()*0.5).translated(rect.topLeft()));
+    }
+  }
+}
+
+/* inherits documentation from base class */
+QCPRange QCPFinancial::getKeyRange(bool &foundRange, QCPAbstractPlottable::SignDomain inSignDomain) const
+{
+  QCPRange range;
+  bool haveLower = false;
+  bool haveUpper = false;
+  
+  double current;
+  QCPFinancialDataMap::const_iterator it = mData->constBegin();
+  while (it != mData->constEnd())
+  {
+    current = it.value().key;
+    if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0))
+    {
+      if (current < range.lower || !haveLower)
+      {
+        range.lower = current;
+        haveLower = true;
+      }
+      if (current > range.upper || !haveUpper)
+      {
+        range.upper = current;
+        haveUpper = true;
+      }
+    }
+    ++it;
+  }
+  // determine exact range by including width of bars/flags:
+  if (haveLower && mKeyAxis)
+    range.lower = range.lower-mWidth*0.5;
+  if (haveUpper && mKeyAxis)
+    range.upper = range.upper+mWidth*0.5;
+  foundRange = haveLower && haveUpper;
+  return range;
+}
+
+/* inherits documentation from base class */
+QCPRange QCPFinancial::getValueRange(bool &foundRange, QCPAbstractPlottable::SignDomain inSignDomain) const
+{
+  QCPRange range;
+  bool haveLower = false;
+  bool haveUpper = false;
+  
+  QCPFinancialDataMap::const_iterator it = mData->constBegin();
+  while (it != mData->constEnd())
+  {
+    // high:
+    if (inSignDomain == sdBoth || (inSignDomain == sdNegative && it.value().high < 0) || (inSignDomain == sdPositive && it.value().high > 0))
+    {
+      if (it.value().high < range.lower || !haveLower)
+      {
+        range.lower = it.value().high;
+        haveLower = true;
+      }
+      if (it.value().high > range.upper || !haveUpper)
+      {
+        range.upper = it.value().high;
+        haveUpper = true;
+      }
+    }
+    // low:
+    if (inSignDomain == sdBoth || (inSignDomain == sdNegative && it.value().low < 0) || (inSignDomain == sdPositive && it.value().low > 0))
+    {
+      if (it.value().low < range.lower || !haveLower)
+      {
+        range.lower = it.value().low;
+        haveLower = true;
+      }
+      if (it.value().low > range.upper || !haveUpper)
+      {
+        range.upper = it.value().low;
+        haveUpper = true;
+      }
+    }
+    ++it;
+  }
+  
+  foundRange = haveLower && haveUpper;
+  return range;
+}
+
+/*! \internal
+  
+  Draws the data from \a begin to \a end as OHLC bars with the provided \a painter.
+
+  This method is a helper function for \ref draw. It is used when the chart style is \ref csOhlc.
+*/
+void QCPFinancial::drawOhlcPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end)
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  
+  QPen linePen;
+  
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it)
+    {
+      if (mSelected)
+        linePen = mSelectedPen;
+      else if (mTwoColored)
+        linePen = it.value().close >= it.value().open ? mPenPositive : mPenNegative;
+      else
+        linePen = mPen;
+      painter->setPen(linePen);
+      double keyPixel = keyAxis->coordToPixel(it.value().key);
+      double openPixel = valueAxis->coordToPixel(it.value().open);
+      double closePixel = valueAxis->coordToPixel(it.value().close);
+      // draw backbone:
+      painter->drawLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(it.value().low)));
+      // draw open:
+      double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5); // sign of this makes sure open/close are on correct sides
+      painter->drawLine(QPointF(keyPixel-keyWidthPixels, openPixel), QPointF(keyPixel, openPixel));
+      // draw close:
+      painter->drawLine(QPointF(keyPixel, closePixel), QPointF(keyPixel+keyWidthPixels, closePixel));
+    }
+  } else
+  {
+    for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it)
+    {
+      if (mSelected)
+        linePen = mSelectedPen;
+      else if (mTwoColored)
+        linePen = it.value().close >= it.value().open ? mPenPositive : mPenNegative;
+      else
+        linePen = mPen;
+      painter->setPen(linePen);
+      double keyPixel = keyAxis->coordToPixel(it.value().key);
+      double openPixel = valueAxis->coordToPixel(it.value().open);
+      double closePixel = valueAxis->coordToPixel(it.value().close);
+      // draw backbone:
+      painter->drawLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(it.value().low), keyPixel));
+      // draw open:
+      double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5); // sign of this makes sure open/close are on correct sides
+      painter->drawLine(QPointF(openPixel, keyPixel-keyWidthPixels), QPointF(openPixel, keyPixel));
+      // draw close:
+      painter->drawLine(QPointF(closePixel, keyPixel), QPointF(closePixel, keyPixel+keyWidthPixels));
+    }
+  }
+}
+
+/*! \internal
+  
+  Draws the data from \a begin to \a end as Candlesticks with the provided \a painter.
+
+  This method is a helper function for \ref draw. It is used when the chart style is \ref csCandlestick.
+*/
+void QCPFinancial::drawCandlestickPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end)
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; }
+  
+  QPen linePen;
+  QBrush boxBrush;
+  
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it)
+    {
+      if (mSelected)
+      {
+        linePen = mSelectedPen;
+        boxBrush = mSelectedBrush;
+      } else if (mTwoColored)
+      {
+        if (it.value().close >= it.value().open)
+        {
+          linePen = mPenPositive;
+          boxBrush = mBrushPositive;
+        } else
+        {
+          linePen = mPenNegative;
+          boxBrush = mBrushNegative;
+        }
+      } else
+      {
+        linePen = mPen;
+        boxBrush = mBrush;
+      }
+      painter->setPen(linePen);
+      painter->setBrush(boxBrush);
+      double keyPixel = keyAxis->coordToPixel(it.value().key);
+      double openPixel = valueAxis->coordToPixel(it.value().open);
+      double closePixel = valueAxis->coordToPixel(it.value().close);
+      // draw high:
+      painter->drawLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(qMax(it.value().open, it.value().close))));
+      // draw low:
+      painter->drawLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().low)), QPointF(keyPixel, valueAxis->coordToPixel(qMin(it.value().open, it.value().close))));
+      // draw open-close box:
+      double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5);
+      painter->drawRect(QRectF(QPointF(keyPixel-keyWidthPixels, closePixel), QPointF(keyPixel+keyWidthPixels, openPixel)));
+    }
+  } else // keyAxis->orientation() == Qt::Vertical
+  {
+    for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it)
+    {
+      if (mSelected)
+      {
+        linePen = mSelectedPen;
+        boxBrush = mSelectedBrush;
+      } else if (mTwoColored)
+      {
+        if (it.value().close >= it.value().open)
+        {
+          linePen = mPenPositive;
+          boxBrush = mBrushPositive;
+        } else
+        {
+          linePen = mPenNegative;
+          boxBrush = mBrushNegative;
+        }
+      } else
+      {
+        linePen = mPen;
+        boxBrush = mBrush;
+      }
+      painter->setPen(linePen);
+      painter->setBrush(boxBrush);
+      double keyPixel = keyAxis->coordToPixel(it.value().key);
+      double openPixel = valueAxis->coordToPixel(it.value().open);
+      double closePixel = valueAxis->coordToPixel(it.value().close);
+      // draw high:
+      painter->drawLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(qMax(it.value().open, it.value().close)), keyPixel));
+      // draw low:
+      painter->drawLine(QPointF(valueAxis->coordToPixel(it.value().low), keyPixel), QPointF(valueAxis->coordToPixel(qMin(it.value().open, it.value().close)), keyPixel));
+      // draw open-close box:
+      double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5);
+      painter->drawRect(QRectF(QPointF(closePixel, keyPixel-keyWidthPixels), QPointF(openPixel, keyPixel+keyWidthPixels)));
+    }
+  }
+}
+
+/*! \internal
+  
+  This method is a helper function for \ref selectTest. It is used to test for selection when the
+  chart style is \ref csOhlc. It only tests against the data points between \a begin and \a end.
+*/
+double QCPFinancial::ohlcSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+
+  double minDistSqr = std::numeric_limits<double>::max();
+  QCPFinancialDataMap::const_iterator it;
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    for (it = begin; it != end; ++it)
+    {
+      double keyPixel = keyAxis->coordToPixel(it.value().key);
+      // calculate distance to backbone:
+      double currentDistSqr = distSqrToLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(it.value().low)), pos);
+      if (currentDistSqr < minDistSqr)
+        minDistSqr = currentDistSqr;
+    }
+  } else // keyAxis->orientation() == Qt::Vertical
+  {
+    for (it = begin; it != end; ++it)
+    {
+      double keyPixel = keyAxis->coordToPixel(it.value().key);
+      // calculate distance to backbone:
+      double currentDistSqr = distSqrToLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(it.value().low), keyPixel), pos);
+      if (currentDistSqr < minDistSqr)
+        minDistSqr = currentDistSqr;
+    }
+  }
+  return qSqrt(minDistSqr);
+}
+
+/*! \internal
+  
+  This method is a helper function for \ref selectTest. It is used to test for selection when the
+  chart style is \ref csCandlestick. It only tests against the data points between \a begin and \a
+  end.
+*/
+double QCPFinancial::candlestickSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const
+{
+  QCPAxis *keyAxis = mKeyAxis.data();
+  QCPAxis *valueAxis = mValueAxis.data();
+  if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; }
+
+  double minDistSqr = std::numeric_limits<double>::max();
+  QCPFinancialDataMap::const_iterator it;
+  if (keyAxis->orientation() == Qt::Horizontal)
+  {
+    for (it = begin; it != end; ++it)
+    {
+      double currentDistSqr;
+      // determine whether pos is in open-close-box:
+      QCPRange boxKeyRange(it.value().key-mWidth*0.5, it.value().key+mWidth*0.5);
+      QCPRange boxValueRange(it.value().close, it.value().open);
+      double posKey, posValue;
+      pixelsToCoords(pos, posKey, posValue);
+      if (boxKeyRange.contains(posKey) && boxValueRange.contains(posValue)) // is in open-close-box
+      {
+        currentDistSqr = mParentPlot->selectionTolerance()*0.99 * mParentPlot->selectionTolerance()*0.99;
+      } else
+      {
+        // calculate distance to high/low lines:
+        double keyPixel = keyAxis->coordToPixel(it.value().key);
+        double highLineDistSqr = distSqrToLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(qMax(it.value().open, it.value().close))), pos);
+        double lowLineDistSqr = distSqrToLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().low)), QPointF(keyPixel, valueAxis->coordToPixel(qMin(it.value().open, it.value().close))), pos);
+        currentDistSqr = qMin(highLineDistSqr, lowLineDistSqr);
+      }
+      if (currentDistSqr < minDistSqr)
+        minDistSqr = currentDistSqr;
+    }
+  } else // keyAxis->orientation() == Qt::Vertical
+  {
+    for (it = begin; it != end; ++it)
+    {
+      double currentDistSqr;
+      // determine whether pos is in open-close-box:
+      QCPRange boxKeyRange(it.value().key-mWidth*0.5, it.value().key+mWidth*0.5);
+      QCPRange boxValueRange(it.value().close, it.value().open);
+      double posKey, posValue;
+      pixelsToCoords(pos, posKey, posValue);
+      if (boxKeyRange.contains(posKey) && boxValueRange.contains(posValue)) // is in open-close-box
+      {
+        currentDistSqr = mParentPlot->selectionTolerance()*0.99 * mParentPlot->selectionTolerance()*0.99;
+      } else
+      {
+        // calculate distance to high/low lines:
+        double keyPixel = keyAxis->coordToPixel(it.value().key);
+        double highLineDistSqr = distSqrToLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(qMax(it.value().open, it.value().close)), keyPixel), pos);
+        double lowLineDistSqr = distSqrToLine(QPointF(valueAxis->coordToPixel(it.value().low), keyPixel), QPointF(valueAxis->coordToPixel(qMin(it.value().open, it.value().close)), keyPixel), pos);
+        currentDistSqr = qMin(highLineDistSqr, lowLineDistSqr);
+      }
+      if (currentDistSqr < minDistSqr)
+        minDistSqr = currentDistSqr;
+    }
+  }
+  return qSqrt(minDistSqr);
+}
+
+/*!  \internal
+  
+  called by the drawing methods to determine which data (key) range is visible at the current key
+  axis range setting, so only that needs to be processed.
+  
+  \a lower returns an iterator to the lowest data point that needs to be taken into account when
+  plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a
+  lower may still be just outside the visible range.
+  
+  \a upper returns an iterator to the highest data point. Same as before, \a upper may also lie
+  just outside of the visible range.
+  
+  if the plottable contains no data, both \a lower and \a upper point to constEnd.
+  
+  \see QCPGraph::getVisibleDataBounds
+*/
+void QCPFinancial::getVisibleDataBounds(QCPFinancialDataMap::const_iterator &lower, QCPFinancialDataMap::const_iterator &upper) const
+{
+  if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; }
+  if (mData->isEmpty())
+  {
+    lower = mData->constEnd();
+    upper = mData->constEnd();
+    return;
+  }
+  
+  // get visible data range as QMap iterators
+  QCPFinancialDataMap::const_iterator lbound = mData->lowerBound(mKeyAxis.data()->range().lower);
+  QCPFinancialDataMap::const_iterator ubound = mData->upperBound(mKeyAxis.data()->range().upper);
+  bool lowoutlier = lbound != mData->constBegin(); // indicates whether there exist points below axis range
+  bool highoutlier = ubound != mData->constEnd(); // indicates whether there exist points above axis range
+  
+  lower = (lowoutlier ? lbound-1 : lbound); // data point range that will be actually drawn
+  upper = (highoutlier ? ubound : ubound-1); // data point range that will be actually drawn
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemStraightLine
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemStraightLine
+  \brief A straight line that spans infinitely in both directions
+
+  \image html QCPItemStraightLine.png "Straight line example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  It has two positions, \a point1 and \a point2, which define the straight line.
+*/
+
+/*!
+  Creates a straight line item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemStraightLine::QCPItemStraightLine(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  point1(createPosition(QLatin1String("point1"))),
+  point2(createPosition(QLatin1String("point2")))
+{
+  point1->setCoords(0, 0);
+  point2->setCoords(1, 1);
+  
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue,2));
+}
+
+QCPItemStraightLine::~QCPItemStraightLine()
+{
+}
+
+/*!
+  Sets the pen that will be used to draw the line
+  
+  \see setSelectedPen
+*/
+void QCPItemStraightLine::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw the line when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemStraightLine::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/* inherits documentation from base class */
+double QCPItemStraightLine::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  return distToStraightLine(QVector2D(point1->pixelPoint()), QVector2D(point2->pixelPoint()-point1->pixelPoint()), QVector2D(pos));
+}
+
+/* inherits documentation from base class */
+void QCPItemStraightLine::draw(QCPPainter *painter)
+{
+  QVector2D start(point1->pixelPoint());
+  QVector2D end(point2->pixelPoint());
+  // get visible segment of straight line inside clipRect:
+  double clipPad = mainPen().widthF();
+  QLineF line = getRectClippedStraightLine(start, end-start, clipRect().adjusted(-clipPad, -clipPad, clipPad, clipPad));
+  // paint visible segment, if existent:
+  if (!line.isNull())
+  {
+    painter->setPen(mainPen());
+    painter->drawLine(line);
+  }
+}
+
+/*! \internal
+
+  finds the shortest distance of \a point to the straight line defined by the base point \a
+  base and the direction vector \a vec.
+  
+  This is a helper function for \ref selectTest.
+*/
+double QCPItemStraightLine::distToStraightLine(const QVector2D &base, const QVector2D &vec, const QVector2D &point) const
+{
+  return qAbs((base.y()-point.y())*vec.x()-(base.x()-point.x())*vec.y())/vec.length();
+}
+
+/*! \internal
+
+  Returns the section of the straight line defined by \a base and direction vector \a
+  vec, that is visible in the specified \a rect.
+  
+  This is a helper function for \ref draw.
+*/
+QLineF QCPItemStraightLine::getRectClippedStraightLine(const QVector2D &base, const QVector2D &vec, const QRect &rect) const
+{
+  double bx, by;
+  double gamma;
+  QLineF result;
+  if (vec.x() == 0 && vec.y() == 0)
+    return result;
+  if (qFuzzyIsNull(vec.x())) // line is vertical
+  {
+    // check top of rect:
+    bx = rect.left();
+    by = rect.top();
+    gamma = base.x()-bx + (by-base.y())*vec.x()/vec.y();
+    if (gamma >= 0 && gamma <= rect.width())
+      result.setLine(bx+gamma, rect.top(), bx+gamma, rect.bottom()); // no need to check bottom because we know line is vertical
+  } else if (qFuzzyIsNull(vec.y())) // line is horizontal
+  {
+    // check left of rect:
+    bx = rect.left();
+    by = rect.top();
+    gamma = base.y()-by + (bx-base.x())*vec.y()/vec.x();
+    if (gamma >= 0 && gamma <= rect.height())
+      result.setLine(rect.left(), by+gamma, rect.right(), by+gamma); // no need to check right because we know line is horizontal
+  } else // line is skewed
+  {
+    QList<QVector2D> pointVectors;
+    // check top of rect:
+    bx = rect.left();
+    by = rect.top();
+    gamma = base.x()-bx + (by-base.y())*vec.x()/vec.y();
+    if (gamma >= 0 && gamma <= rect.width())
+      pointVectors.append(QVector2D(bx+gamma, by));
+    // check bottom of rect:
+    bx = rect.left();
+    by = rect.bottom();
+    gamma = base.x()-bx + (by-base.y())*vec.x()/vec.y();
+    if (gamma >= 0 && gamma <= rect.width())
+      pointVectors.append(QVector2D(bx+gamma, by));
+    // check left of rect:
+    bx = rect.left();
+    by = rect.top();
+    gamma = base.y()-by + (bx-base.x())*vec.y()/vec.x();
+    if (gamma >= 0 && gamma <= rect.height())
+      pointVectors.append(QVector2D(bx, by+gamma));
+    // check right of rect:
+    bx = rect.right();
+    by = rect.top();
+    gamma = base.y()-by + (bx-base.x())*vec.y()/vec.x();
+    if (gamma >= 0 && gamma <= rect.height())
+      pointVectors.append(QVector2D(bx, by+gamma));
+    
+    // evaluate points:
+    if (pointVectors.size() == 2)
+    {
+      result.setPoints(pointVectors.at(0).toPointF(), pointVectors.at(1).toPointF());
+    } else if (pointVectors.size() > 2)
+    {
+      // line probably goes through corner of rect, and we got two points there. single out the point pair with greatest distance:
+      double distSqrMax = 0;
+      QVector2D pv1, pv2;
+      for (int i=0; i<pointVectors.size()-1; ++i)
+      {
+        for (int k=i+1; k<pointVectors.size(); ++k)
+        {
+          double distSqr = (pointVectors.at(i)-pointVectors.at(k)).lengthSquared();
+          if (distSqr > distSqrMax)
+          {
+            pv1 = pointVectors.at(i);
+            pv2 = pointVectors.at(k);
+            distSqrMax = distSqr;
+          }
+        }
+      }
+      result.setPoints(pv1.toPointF(), pv2.toPointF());
+    }
+  }
+  return result;
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the
+  item is not selected and mSelectedPen when it is.
+*/
+QPen QCPItemStraightLine::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemLine
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemLine
+  \brief A line from one point to another
+
+  \image html QCPItemLine.png "Line example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  It has two positions, \a start and \a end, which define the end points of the line.
+  
+  With \ref setHead and \ref setTail you may set different line ending styles, e.g. to create an arrow.
+*/
+
+/*!
+  Creates a line item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemLine::QCPItemLine(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  start(createPosition(QLatin1String("start"))),
+  end(createPosition(QLatin1String("end")))
+{
+  start->setCoords(0, 0);
+  end->setCoords(1, 1);
+  
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue,2));
+}
+
+QCPItemLine::~QCPItemLine()
+{
+}
+
+/*!
+  Sets the pen that will be used to draw the line
+  
+  \see setSelectedPen
+*/
+void QCPItemLine::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw the line when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemLine::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  Sets the line ending style of the head. The head corresponds to the \a end position.
+  
+  Note that due to the overloaded QCPLineEnding constructor, you may directly specify
+  a QCPLineEnding::EndingStyle here, e.g. \code setHead(QCPLineEnding::esSpikeArrow) \endcode
+  
+  \see setTail
+*/
+void QCPItemLine::setHead(const QCPLineEnding &head)
+{
+  mHead = head;
+}
+
+/*!
+  Sets the line ending style of the tail. The tail corresponds to the \a start position.
+  
+  Note that due to the overloaded QCPLineEnding constructor, you may directly specify
+  a QCPLineEnding::EndingStyle here, e.g. \code setTail(QCPLineEnding::esSpikeArrow) \endcode
+  
+  \see setHead
+*/
+void QCPItemLine::setTail(const QCPLineEnding &tail)
+{
+  mTail = tail;
+}
+
+/* inherits documentation from base class */
+double QCPItemLine::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  return qSqrt(distSqrToLine(start->pixelPoint(), end->pixelPoint(), pos));
+}
+
+/* inherits documentation from base class */
+void QCPItemLine::draw(QCPPainter *painter)
+{
+  QVector2D startVec(start->pixelPoint());
+  QVector2D endVec(end->pixelPoint());
+  if (startVec.toPoint() == endVec.toPoint())
+    return;
+  // get visible segment of straight line inside clipRect:
+  double clipPad = qMax(mHead.boundingDistance(), mTail.boundingDistance());
+  clipPad = qMax(clipPad, (double)mainPen().widthF());
+  QLineF line = getRectClippedLine(startVec, endVec, clipRect().adjusted(-clipPad, -clipPad, clipPad, clipPad));
+  // paint visible segment, if existent:
+  if (!line.isNull())
+  {
+    painter->setPen(mainPen());
+    painter->drawLine(line);
+    painter->setBrush(Qt::SolidPattern);
+    if (mTail.style() != QCPLineEnding::esNone)
+      mTail.draw(painter, startVec, startVec-endVec);
+    if (mHead.style() != QCPLineEnding::esNone)
+      mHead.draw(painter, endVec, endVec-startVec);
+  }
+}
+
+/*! \internal
+
+  Returns the section of the line defined by \a start and \a end, that is visible in the specified
+  \a rect.
+  
+  This is a helper function for \ref draw.
+*/
+QLineF QCPItemLine::getRectClippedLine(const QVector2D &start, const QVector2D &end, const QRect &rect) const
+{
+  bool containsStart = rect.contains(start.x(), start.y());
+  bool containsEnd = rect.contains(end.x(), end.y());
+  if (containsStart && containsEnd)
+    return QLineF(start.toPointF(), end.toPointF());
+  
+  QVector2D base = start;
+  QVector2D vec = end-start;
+  double bx, by;
+  double gamma, mu;
+  QLineF result;
+  QList<QVector2D> pointVectors;
+
+  if (!qFuzzyIsNull(vec.y())) // line is not horizontal
+  {
+    // check top of rect:
+    bx = rect.left();
+    by = rect.top();
+    mu = (by-base.y())/vec.y();
+    if (mu >= 0 && mu <= 1)
+    {
+      gamma = base.x()-bx + mu*vec.x();
+      if (gamma >= 0 && gamma <= rect.width())
+        pointVectors.append(QVector2D(bx+gamma, by));
+    }
+    // check bottom of rect:
+    bx = rect.left();
+    by = rect.bottom();
+    mu = (by-base.y())/vec.y();
+    if (mu >= 0 && mu <= 1)
+    {
+      gamma = base.x()-bx + mu*vec.x();
+      if (gamma >= 0 && gamma <= rect.width())
+        pointVectors.append(QVector2D(bx+gamma, by));
+    }
+  }
+  if (!qFuzzyIsNull(vec.x())) // line is not vertical
+  {
+    // check left of rect:
+    bx = rect.left();
+    by = rect.top();
+    mu = (bx-base.x())/vec.x();
+    if (mu >= 0 && mu <= 1)
+    {
+      gamma = base.y()-by + mu*vec.y();
+      if (gamma >= 0 && gamma <= rect.height())
+        pointVectors.append(QVector2D(bx, by+gamma));
+    }
+    // check right of rect:
+    bx = rect.right();
+    by = rect.top();
+    mu = (bx-base.x())/vec.x();
+    if (mu >= 0 && mu <= 1)
+    {
+      gamma = base.y()-by + mu*vec.y();
+      if (gamma >= 0 && gamma <= rect.height())
+        pointVectors.append(QVector2D(bx, by+gamma));
+    }
+  }
+  
+  if (containsStart)
+    pointVectors.append(start);
+  if (containsEnd)
+    pointVectors.append(end);
+  
+  // evaluate points:
+  if (pointVectors.size() == 2)
+  {
+    result.setPoints(pointVectors.at(0).toPointF(), pointVectors.at(1).toPointF());
+  } else if (pointVectors.size() > 2)
+  {
+    // line probably goes through corner of rect, and we got two points there. single out the point pair with greatest distance:
+    double distSqrMax = 0;
+    QVector2D pv1, pv2;
+    for (int i=0; i<pointVectors.size()-1; ++i)
+    {
+      for (int k=i+1; k<pointVectors.size(); ++k)
+      {
+        double distSqr = (pointVectors.at(i)-pointVectors.at(k)).lengthSquared();
+        if (distSqr > distSqrMax)
+        {
+          pv1 = pointVectors.at(i);
+          pv2 = pointVectors.at(k);
+          distSqrMax = distSqr;
+        }
+      }
+    }
+    result.setPoints(pv1.toPointF(), pv2.toPointF());
+  }
+  return result;
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the
+  item is not selected and mSelectedPen when it is.
+*/
+QPen QCPItemLine::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemCurve
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemCurve
+  \brief A curved line from one point to another
+
+  \image html QCPItemCurve.png "Curve example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  It has four positions, \a start and \a end, which define the end points of the line, and two
+  control points which define the direction the line exits from the start and the direction from
+  which it approaches the end: \a startDir and \a endDir.
+  
+  With \ref setHead and \ref setTail you may set different line ending styles, e.g. to create an
+  arrow.
+  
+  Often it is desirable for the control points to stay at fixed relative positions to the start/end
+  point. This can be achieved by setting the parent anchor e.g. of \a startDir simply to \a start,
+  and then specify the desired pixel offset with QCPItemPosition::setCoords on \a startDir.
+*/
+
+/*!
+  Creates a curve item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemCurve::QCPItemCurve(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  start(createPosition(QLatin1String("start"))),
+  startDir(createPosition(QLatin1String("startDir"))),
+  endDir(createPosition(QLatin1String("endDir"))),
+  end(createPosition(QLatin1String("end")))
+{
+  start->setCoords(0, 0);
+  startDir->setCoords(0.5, 0);
+  endDir->setCoords(0, 0.5);
+  end->setCoords(1, 1);
+  
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue,2));
+}
+
+QCPItemCurve::~QCPItemCurve()
+{
+}
+
+/*!
+  Sets the pen that will be used to draw the line
+  
+  \see setSelectedPen
+*/
+void QCPItemCurve::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw the line when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemCurve::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  Sets the line ending style of the head. The head corresponds to the \a end position.
+  
+  Note that due to the overloaded QCPLineEnding constructor, you may directly specify
+  a QCPLineEnding::EndingStyle here, e.g. \code setHead(QCPLineEnding::esSpikeArrow) \endcode
+  
+  \see setTail
+*/
+void QCPItemCurve::setHead(const QCPLineEnding &head)
+{
+  mHead = head;
+}
+
+/*!
+  Sets the line ending style of the tail. The tail corresponds to the \a start position.
+  
+  Note that due to the overloaded QCPLineEnding constructor, you may directly specify
+  a QCPLineEnding::EndingStyle here, e.g. \code setTail(QCPLineEnding::esSpikeArrow) \endcode
+  
+  \see setHead
+*/
+void QCPItemCurve::setTail(const QCPLineEnding &tail)
+{
+  mTail = tail;
+}
+
+/* inherits documentation from base class */
+double QCPItemCurve::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  QPointF startVec(start->pixelPoint());
+  QPointF startDirVec(startDir->pixelPoint());
+  QPointF endDirVec(endDir->pixelPoint());
+  QPointF endVec(end->pixelPoint());
+
+  QPainterPath cubicPath(startVec);
+  cubicPath.cubicTo(startDirVec, endDirVec, endVec);
+  
+  QPolygonF polygon = cubicPath.toSubpathPolygons().first();
+  double minDistSqr = std::numeric_limits<double>::max();
+  for (int i=1; i<polygon.size(); ++i)
+  {
+    double distSqr = distSqrToLine(polygon.at(i-1), polygon.at(i), pos);
+    if (distSqr < minDistSqr)
+      minDistSqr = distSqr;
+  }
+  return qSqrt(minDistSqr);
+}
+
+/* inherits documentation from base class */
+void QCPItemCurve::draw(QCPPainter *painter)
+{
+  QPointF startVec(start->pixelPoint());
+  QPointF startDirVec(startDir->pixelPoint());
+  QPointF endDirVec(endDir->pixelPoint());
+  QPointF endVec(end->pixelPoint());
+  if (QVector2D(endVec-startVec).length() > 1e10f) // too large curves cause crash
+    return;
+
+  QPainterPath cubicPath(startVec);
+  cubicPath.cubicTo(startDirVec, endDirVec, endVec);
+
+  // paint visible segment, if existent:
+  QRect clip = clipRect().adjusted(-mainPen().widthF(), -mainPen().widthF(), mainPen().widthF(), mainPen().widthF());
+  QRect cubicRect = cubicPath.controlPointRect().toRect();
+  if (cubicRect.isEmpty()) // may happen when start and end exactly on same x or y position
+    cubicRect.adjust(0, 0, 1, 1);
+  if (clip.intersects(cubicRect))
+  {
+    painter->setPen(mainPen());
+    painter->drawPath(cubicPath);
+    painter->setBrush(Qt::SolidPattern);
+    if (mTail.style() != QCPLineEnding::esNone)
+      mTail.draw(painter, QVector2D(startVec), M_PI-cubicPath.angleAtPercent(0)/180.0*M_PI);
+    if (mHead.style() != QCPLineEnding::esNone)
+      mHead.draw(painter, QVector2D(endVec), -cubicPath.angleAtPercent(1)/180.0*M_PI);
+  }
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the
+  item is not selected and mSelectedPen when it is.
+*/
+QPen QCPItemCurve::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemRect
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemRect
+  \brief A rectangle
+
+  \image html QCPItemRect.png "Rectangle example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  It has two positions, \a topLeft and \a bottomRight, which define the rectangle.
+*/
+
+/*!
+  Creates a rectangle item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemRect::QCPItemRect(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  topLeft(createPosition(QLatin1String("topLeft"))),
+  bottomRight(createPosition(QLatin1String("bottomRight"))),
+  top(createAnchor(QLatin1String("top"), aiTop)),
+  topRight(createAnchor(QLatin1String("topRight"), aiTopRight)),
+  right(createAnchor(QLatin1String("right"), aiRight)),
+  bottom(createAnchor(QLatin1String("bottom"), aiBottom)),
+  bottomLeft(createAnchor(QLatin1String("bottomLeft"), aiBottomLeft)),
+  left(createAnchor(QLatin1String("left"), aiLeft))
+{
+  topLeft->setCoords(0, 1);
+  bottomRight->setCoords(1, 0);
+  
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue,2));
+  setBrush(Qt::NoBrush);
+  setSelectedBrush(Qt::NoBrush);
+}
+
+QCPItemRect::~QCPItemRect()
+{
+}
+
+/*!
+  Sets the pen that will be used to draw the line of the rectangle
+  
+  \see setSelectedPen, setBrush
+*/
+void QCPItemRect::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw the line of the rectangle when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemRect::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  Sets the brush that will be used to fill the rectangle. To disable filling, set \a brush to
+  Qt::NoBrush.
+  
+  \see setSelectedBrush, setPen
+*/
+void QCPItemRect::setBrush(const QBrush &brush)
+{
+  mBrush = brush;
+}
+
+/*!
+  Sets the brush that will be used to fill the rectangle when selected. To disable filling, set \a
+  brush to Qt::NoBrush.
+  
+  \see setBrush
+*/
+void QCPItemRect::setSelectedBrush(const QBrush &brush)
+{
+  mSelectedBrush = brush;
+}
+
+/* inherits documentation from base class */
+double QCPItemRect::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  QRectF rect = QRectF(topLeft->pixelPoint(), bottomRight->pixelPoint()).normalized();
+  bool filledRect = mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0;
+  return rectSelectTest(rect, pos, filledRect);
+}
+
+/* inherits documentation from base class */
+void QCPItemRect::draw(QCPPainter *painter)
+{
+  QPointF p1 = topLeft->pixelPoint();
+  QPointF p2 = bottomRight->pixelPoint();
+  if (p1.toPoint() == p2.toPoint())
+    return;
+  QRectF rect = QRectF(p1, p2).normalized();
+  double clipPad = mainPen().widthF();
+  QRectF boundingRect = rect.adjusted(-clipPad, -clipPad, clipPad, clipPad);
+  if (boundingRect.intersects(clipRect())) // only draw if bounding rect of rect item is visible in cliprect
+  {
+    painter->setPen(mainPen());
+    painter->setBrush(mainBrush());
+    painter->drawRect(rect);
+  }
+}
+
+/* inherits documentation from base class */
+QPointF QCPItemRect::anchorPixelPoint(int anchorId) const
+{
+  QRectF rect = QRectF(topLeft->pixelPoint(), bottomRight->pixelPoint());
+  switch (anchorId)
+  {
+    case aiTop:         return (rect.topLeft()+rect.topRight())*0.5;
+    case aiTopRight:    return rect.topRight();
+    case aiRight:       return (rect.topRight()+rect.bottomRight())*0.5;
+    case aiBottom:      return (rect.bottomLeft()+rect.bottomRight())*0.5;
+    case aiBottomLeft:  return rect.bottomLeft();
+    case aiLeft:        return (rect.topLeft()+rect.bottomLeft())*0.5;
+  }
+  
+  qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId;
+  return QPointF();
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected
+  and mSelectedPen when it is.
+*/
+QPen QCPItemRect::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+/*! \internal
+
+  Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item
+  is not selected and mSelectedBrush when it is.
+*/
+QBrush QCPItemRect::mainBrush() const
+{
+  return mSelected ? mSelectedBrush : mBrush;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemText
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemText
+  \brief A text label
+
+  \image html QCPItemText.png "Text example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  Its position is defined by the member \a position and the setting of \ref setPositionAlignment.
+  The latter controls which part of the text rect shall be aligned with \a position.
+  
+  The text alignment itself (i.e. left, center, right) can be controlled with \ref
+  setTextAlignment.
+  
+  The text may be rotated around the \a position point with \ref setRotation.
+*/
+
+/*!
+  Creates a text item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemText::QCPItemText(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  position(createPosition(QLatin1String("position"))),
+  topLeft(createAnchor(QLatin1String("topLeft"), aiTopLeft)),
+  top(createAnchor(QLatin1String("top"), aiTop)),
+  topRight(createAnchor(QLatin1String("topRight"), aiTopRight)),
+  right(createAnchor(QLatin1String("right"), aiRight)),
+  bottomRight(createAnchor(QLatin1String("bottomRight"), aiBottomRight)),
+  bottom(createAnchor(QLatin1String("bottom"), aiBottom)),
+  bottomLeft(createAnchor(QLatin1String("bottomLeft"), aiBottomLeft)),
+  left(createAnchor(QLatin1String("left"), aiLeft))
+{
+  position->setCoords(0, 0);
+  
+  setRotation(0);
+  setTextAlignment(Qt::AlignTop|Qt::AlignHCenter);
+  setPositionAlignment(Qt::AlignCenter);
+  setText(QLatin1String("text"));
+  
+  setPen(Qt::NoPen);
+  setSelectedPen(Qt::NoPen);
+  setBrush(Qt::NoBrush);
+  setSelectedBrush(Qt::NoBrush);
+  setColor(Qt::black);
+  setSelectedColor(Qt::blue);
+}
+
+QCPItemText::~QCPItemText()
+{
+}
+
+/*!
+  Sets the color of the text.
+*/
+void QCPItemText::setColor(const QColor &color)
+{
+  mColor = color;
+}
+
+/*!
+  Sets the color of the text that will be used when the item is selected.
+*/
+void QCPItemText::setSelectedColor(const QColor &color)
+{
+  mSelectedColor = color;
+}
+
+/*!
+  Sets the pen that will be used do draw a rectangular border around the text. To disable the
+  border, set \a pen to Qt::NoPen.
+  
+  \see setSelectedPen, setBrush, setPadding
+*/
+void QCPItemText::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used do draw a rectangular border around the text, when the item is
+  selected. To disable the border, set \a pen to Qt::NoPen.
+  
+  \see setPen
+*/
+void QCPItemText::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  Sets the brush that will be used do fill the background of the text. To disable the
+  background, set \a brush to Qt::NoBrush.
+  
+  \see setSelectedBrush, setPen, setPadding
+*/
+void QCPItemText::setBrush(const QBrush &brush)
+{
+  mBrush = brush;
+}
+
+/*!
+  Sets the brush that will be used do fill the background of the text, when the item is selected. To disable the
+  background, set \a brush to Qt::NoBrush.
+  
+  \see setBrush
+*/
+void QCPItemText::setSelectedBrush(const QBrush &brush)
+{
+  mSelectedBrush = brush;
+}
+
+/*!
+  Sets the font of the text.
+  
+  \see setSelectedFont, setColor
+*/
+void QCPItemText::setFont(const QFont &font)
+{
+  mFont = font;
+}
+
+/*!
+  Sets the font of the text that will be used when the item is selected.
+  
+  \see setFont
+*/
+void QCPItemText::setSelectedFont(const QFont &font)
+{
+  mSelectedFont = font;
+}
+
+/*!
+  Sets the text that will be displayed. Multi-line texts are supported by inserting a line break
+  character, e.g. '\n'.
+  
+  \see setFont, setColor, setTextAlignment
+*/
+void QCPItemText::setText(const QString &text)
+{
+  mText = text;
+}
+
+/*!
+  Sets which point of the text rect shall be aligned with \a position.
+  
+  Examples:
+  \li If \a alignment is <tt>Qt::AlignHCenter | Qt::AlignTop</tt>, the text will be positioned such
+  that the top of the text rect will be horizontally centered on \a position.
+  \li If \a alignment is <tt>Qt::AlignLeft | Qt::AlignBottom</tt>, \a position will indicate the
+  bottom left corner of the text rect.
+  
+  If you want to control the alignment of (multi-lined) text within the text rect, use \ref
+  setTextAlignment.
+*/
+void QCPItemText::setPositionAlignment(Qt::Alignment alignment)
+{
+  mPositionAlignment = alignment;
+}
+
+/*!
+  Controls how (multi-lined) text is aligned inside the text rect (typically Qt::AlignLeft, Qt::AlignCenter or Qt::AlignRight).
+*/
+void QCPItemText::setTextAlignment(Qt::Alignment alignment)
+{
+  mTextAlignment = alignment;
+}
+
+/*!
+  Sets the angle in degrees by which the text (and the text rectangle, if visible) will be rotated
+  around \a position.
+*/
+void QCPItemText::setRotation(double degrees)
+{
+  mRotation = degrees;
+}
+
+/*!
+  Sets the distance between the border of the text rectangle and the text. The appearance (and
+  visibility) of the text rectangle can be controlled with \ref setPen and \ref setBrush.
+*/
+void QCPItemText::setPadding(const QMargins &padding)
+{
+  mPadding = padding;
+}
+
+/* inherits documentation from base class */
+double QCPItemText::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  // The rect may be rotated, so we transform the actual clicked pos to the rotated
+  // coordinate system, so we can use the normal rectSelectTest function for non-rotated rects:
+  QPointF positionPixels(position->pixelPoint());
+  QTransform inputTransform;
+  inputTransform.translate(positionPixels.x(), positionPixels.y());
+  inputTransform.rotate(-mRotation);
+  inputTransform.translate(-positionPixels.x(), -positionPixels.y());
+  QPointF rotatedPos = inputTransform.map(pos);
+  QFontMetrics fontMetrics(mFont);
+  QRect textRect = fontMetrics.boundingRect(0, 0, 0, 0, Qt::TextDontClip|mTextAlignment, mText);
+  QRect textBoxRect = textRect.adjusted(-mPadding.left(), -mPadding.top(), mPadding.right(), mPadding.bottom());
+  QPointF textPos = getTextDrawPoint(positionPixels, textBoxRect, mPositionAlignment);
+  textBoxRect.moveTopLeft(textPos.toPoint());
+
+  return rectSelectTest(textBoxRect, rotatedPos, true);
+}
+
+/* inherits documentation from base class */
+void QCPItemText::draw(QCPPainter *painter)
+{
+  QPointF pos(position->pixelPoint());
+  QTransform transform = painter->transform();
+  transform.translate(pos.x(), pos.y());
+  if (!qFuzzyIsNull(mRotation))
+    transform.rotate(mRotation);
+  painter->setFont(mainFont());
+  QRect textRect = painter->fontMetrics().boundingRect(0, 0, 0, 0, Qt::TextDontClip|mTextAlignment, mText);
+  QRect textBoxRect = textRect.adjusted(-mPadding.left(), -mPadding.top(), mPadding.right(), mPadding.bottom());
+  QPointF textPos = getTextDrawPoint(QPointF(0, 0), textBoxRect, mPositionAlignment); // 0, 0 because the transform does the translation
+  textRect.moveTopLeft(textPos.toPoint()+QPoint(mPadding.left(), mPadding.top()));
+  textBoxRect.moveTopLeft(textPos.toPoint());
+  double clipPad = mainPen().widthF();
+  QRect boundingRect = textBoxRect.adjusted(-clipPad, -clipPad, clipPad, clipPad);
+  if (transform.mapRect(boundingRect).intersects(painter->transform().mapRect(clipRect())))
+  {
+    painter->setTransform(transform);
+    if ((mainBrush().style() != Qt::NoBrush && mainBrush().color().alpha() != 0) ||
+        (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0))
+    {
+      painter->setPen(mainPen());
+      painter->setBrush(mainBrush());
+      painter->drawRect(textBoxRect);
+    }
+    painter->setBrush(Qt::NoBrush);
+    painter->setPen(QPen(mainColor()));
+    painter->drawText(textRect, Qt::TextDontClip|mTextAlignment, mText);
+  }
+}
+
+/* inherits documentation from base class */
+QPointF QCPItemText::anchorPixelPoint(int anchorId) const
+{
+  // get actual rect points (pretty much copied from draw function):
+  QPointF pos(position->pixelPoint());
+  QTransform transform;
+  transform.translate(pos.x(), pos.y());
+  if (!qFuzzyIsNull(mRotation))
+    transform.rotate(mRotation);
+  QFontMetrics fontMetrics(mainFont());
+  QRect textRect = fontMetrics.boundingRect(0, 0, 0, 0, Qt::TextDontClip|mTextAlignment, mText);
+  QRectF textBoxRect = textRect.adjusted(-mPadding.left(), -mPadding.top(), mPadding.right(), mPadding.bottom());
+  QPointF textPos = getTextDrawPoint(QPointF(0, 0), textBoxRect, mPositionAlignment); // 0, 0 because the transform does the translation
+  textBoxRect.moveTopLeft(textPos.toPoint());
+  QPolygonF rectPoly = transform.map(QPolygonF(textBoxRect));
+  
+  switch (anchorId)
+  {
+    case aiTopLeft:     return rectPoly.at(0);
+    case aiTop:         return (rectPoly.at(0)+rectPoly.at(1))*0.5;
+    case aiTopRight:    return rectPoly.at(1);
+    case aiRight:       return (rectPoly.at(1)+rectPoly.at(2))*0.5;
+    case aiBottomRight: return rectPoly.at(2);
+    case aiBottom:      return (rectPoly.at(2)+rectPoly.at(3))*0.5;
+    case aiBottomLeft:  return rectPoly.at(3);
+    case aiLeft:        return (rectPoly.at(3)+rectPoly.at(0))*0.5;
+  }
+  
+  qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId;
+  return QPointF();
+}
+
+/*! \internal
+  
+  Returns the point that must be given to the QPainter::drawText function (which expects the top
+  left point of the text rect), according to the position \a pos, the text bounding box \a rect and
+  the requested \a positionAlignment.
+  
+  For example, if \a positionAlignment is <tt>Qt::AlignLeft | Qt::AlignBottom</tt> the returned point
+  will be shifted upward by the height of \a rect, starting from \a pos. So if the text is finally
+  drawn at that point, the lower left corner of the resulting text rect is at \a pos.
+*/
+QPointF QCPItemText::getTextDrawPoint(const QPointF &pos, const QRectF &rect, Qt::Alignment positionAlignment) const
+{
+  if (positionAlignment == 0 || positionAlignment == (Qt::AlignLeft|Qt::AlignTop))
+    return pos;
+  
+  QPointF result = pos; // start at top left
+  if (positionAlignment.testFlag(Qt::AlignHCenter))
+    result.rx() -= rect.width()/2.0;
+  else if (positionAlignment.testFlag(Qt::AlignRight))
+    result.rx() -= rect.width();
+  if (positionAlignment.testFlag(Qt::AlignVCenter))
+    result.ry() -= rect.height()/2.0;
+  else if (positionAlignment.testFlag(Qt::AlignBottom))
+    result.ry() -= rect.height();
+  return result;
+}
+
+/*! \internal
+
+  Returns the font that should be used for drawing text. Returns mFont when the item is not selected
+  and mSelectedFont when it is.
+*/
+QFont QCPItemText::mainFont() const
+{
+  return mSelected ? mSelectedFont : mFont;
+}
+
+/*! \internal
+
+  Returns the color that should be used for drawing text. Returns mColor when the item is not
+  selected and mSelectedColor when it is.
+*/
+QColor QCPItemText::mainColor() const
+{
+  return mSelected ? mSelectedColor : mColor;
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected
+  and mSelectedPen when it is.
+*/
+QPen QCPItemText::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+/*! \internal
+
+  Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item
+  is not selected and mSelectedBrush when it is.
+*/
+QBrush QCPItemText::mainBrush() const
+{
+  return mSelected ? mSelectedBrush : mBrush;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemEllipse
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemEllipse
+  \brief An ellipse
+
+  \image html QCPItemEllipse.png "Ellipse example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  It has two positions, \a topLeft and \a bottomRight, which define the rect the ellipse will be drawn in.
+*/
+
+/*!
+  Creates an ellipse item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemEllipse::QCPItemEllipse(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  topLeft(createPosition(QLatin1String("topLeft"))),
+  bottomRight(createPosition(QLatin1String("bottomRight"))),
+  topLeftRim(createAnchor(QLatin1String("topLeftRim"), aiTopLeftRim)),
+  top(createAnchor(QLatin1String("top"), aiTop)),
+  topRightRim(createAnchor(QLatin1String("topRightRim"), aiTopRightRim)),
+  right(createAnchor(QLatin1String("right"), aiRight)),
+  bottomRightRim(createAnchor(QLatin1String("bottomRightRim"), aiBottomRightRim)),
+  bottom(createAnchor(QLatin1String("bottom"), aiBottom)),
+  bottomLeftRim(createAnchor(QLatin1String("bottomLeftRim"), aiBottomLeftRim)),
+  left(createAnchor(QLatin1String("left"), aiLeft)),
+  center(createAnchor(QLatin1String("center"), aiCenter))
+{
+  topLeft->setCoords(0, 1);
+  bottomRight->setCoords(1, 0);
+  
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue, 2));
+  setBrush(Qt::NoBrush);
+  setSelectedBrush(Qt::NoBrush);
+}
+
+QCPItemEllipse::~QCPItemEllipse()
+{
+}
+
+/*!
+  Sets the pen that will be used to draw the line of the ellipse
+  
+  \see setSelectedPen, setBrush
+*/
+void QCPItemEllipse::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw the line of the ellipse when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemEllipse::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  Sets the brush that will be used to fill the ellipse. To disable filling, set \a brush to
+  Qt::NoBrush.
+  
+  \see setSelectedBrush, setPen
+*/
+void QCPItemEllipse::setBrush(const QBrush &brush)
+{
+  mBrush = brush;
+}
+
+/*!
+  Sets the brush that will be used to fill the ellipse when selected. To disable filling, set \a
+  brush to Qt::NoBrush.
+  
+  \see setBrush
+*/
+void QCPItemEllipse::setSelectedBrush(const QBrush &brush)
+{
+  mSelectedBrush = brush;
+}
+
+/* inherits documentation from base class */
+double QCPItemEllipse::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  double result = -1;
+  QPointF p1 = topLeft->pixelPoint();
+  QPointF p2 = bottomRight->pixelPoint();
+  QPointF center((p1+p2)/2.0);
+  double a = qAbs(p1.x()-p2.x())/2.0;
+  double b = qAbs(p1.y()-p2.y())/2.0;
+  double x = pos.x()-center.x();
+  double y = pos.y()-center.y();
+  
+  // distance to border:
+  double c = 1.0/qSqrt(x*x/(a*a)+y*y/(b*b));
+  result = qAbs(c-1)*qSqrt(x*x+y*y);
+  // filled ellipse, allow click inside to count as hit:
+  if (result > mParentPlot->selectionTolerance()*0.99 && mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0)
+  {
+    if (x*x/(a*a) + y*y/(b*b) <= 1)
+      result = mParentPlot->selectionTolerance()*0.99;
+  }
+  return result;
+}
+
+/* inherits documentation from base class */
+void QCPItemEllipse::draw(QCPPainter *painter)
+{
+  QPointF p1 = topLeft->pixelPoint();
+  QPointF p2 = bottomRight->pixelPoint();
+  if (p1.toPoint() == p2.toPoint())
+    return;
+  QRectF ellipseRect = QRectF(p1, p2).normalized();
+  QRect clip = clipRect().adjusted(-mainPen().widthF(), -mainPen().widthF(), mainPen().widthF(), mainPen().widthF());
+  if (ellipseRect.intersects(clip)) // only draw if bounding rect of ellipse is visible in cliprect
+  {
+    painter->setPen(mainPen());
+    painter->setBrush(mainBrush());
+#ifdef __EXCEPTIONS
+    try // drawEllipse sometimes throws exceptions if ellipse is too big
+    {
+#endif
+      painter->drawEllipse(ellipseRect);
+#ifdef __EXCEPTIONS
+    } catch (...)
+    {
+      qDebug() << Q_FUNC_INFO << "Item too large for memory, setting invisible";
+      setVisible(false);
+    }
+#endif
+  }
+}
+
+/* inherits documentation from base class */
+QPointF QCPItemEllipse::anchorPixelPoint(int anchorId) const
+{
+  QRectF rect = QRectF(topLeft->pixelPoint(), bottomRight->pixelPoint());
+  switch (anchorId)
+  {
+    case aiTopLeftRim:     return rect.center()+(rect.topLeft()-rect.center())*1/qSqrt(2);
+    case aiTop:            return (rect.topLeft()+rect.topRight())*0.5;
+    case aiTopRightRim:    return rect.center()+(rect.topRight()-rect.center())*1/qSqrt(2);
+    case aiRight:          return (rect.topRight()+rect.bottomRight())*0.5;
+    case aiBottomRightRim: return rect.center()+(rect.bottomRight()-rect.center())*1/qSqrt(2);
+    case aiBottom:         return (rect.bottomLeft()+rect.bottomRight())*0.5;
+    case aiBottomLeftRim:  return rect.center()+(rect.bottomLeft()-rect.center())*1/qSqrt(2);
+    case aiLeft:           return (rect.topLeft()+rect.bottomLeft())*0.5;
+    case aiCenter:         return (rect.topLeft()+rect.bottomRight())*0.5;
+  }
+  
+  qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId;
+  return QPointF();
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected
+  and mSelectedPen when it is.
+*/
+QPen QCPItemEllipse::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+/*! \internal
+
+  Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item
+  is not selected and mSelectedBrush when it is.
+*/
+QBrush QCPItemEllipse::mainBrush() const
+{
+  return mSelected ? mSelectedBrush : mBrush;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemPixmap
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemPixmap
+  \brief An arbitrary pixmap
+
+  \image html QCPItemPixmap.png "Pixmap example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  It has two positions, \a topLeft and \a bottomRight, which define the rectangle the pixmap will
+  be drawn in. Depending on the scale setting (\ref setScaled), the pixmap will be either scaled to
+  fit the rectangle or be drawn aligned to the topLeft position.
+  
+  If scaling is enabled and \a topLeft is further to the bottom/right than \a bottomRight (as shown
+  on the right side of the example image), the pixmap will be flipped in the respective
+  orientations.
+*/
+
+/*!
+  Creates a rectangle item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemPixmap::QCPItemPixmap(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  topLeft(createPosition(QLatin1String("topLeft"))),
+  bottomRight(createPosition(QLatin1String("bottomRight"))),
+  top(createAnchor(QLatin1String("top"), aiTop)),
+  topRight(createAnchor(QLatin1String("topRight"), aiTopRight)),
+  right(createAnchor(QLatin1String("right"), aiRight)),
+  bottom(createAnchor(QLatin1String("bottom"), aiBottom)),
+  bottomLeft(createAnchor(QLatin1String("bottomLeft"), aiBottomLeft)),
+  left(createAnchor(QLatin1String("left"), aiLeft)),
+  mScaledPixmapInvalidated(true)
+{
+  topLeft->setCoords(0, 1);
+  bottomRight->setCoords(1, 0);
+  
+  setPen(Qt::NoPen);
+  setSelectedPen(QPen(Qt::blue));
+  setScaled(false, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+}
+
+QCPItemPixmap::~QCPItemPixmap()
+{
+}
+
+/*!
+  Sets the pixmap that will be displayed.
+*/
+void QCPItemPixmap::setPixmap(const QPixmap &pixmap)
+{
+  mPixmap = pixmap;
+  mScaledPixmapInvalidated = true;
+  if (mPixmap.isNull())
+    qDebug() << Q_FUNC_INFO << "pixmap is null";
+}
+
+/*!
+  Sets whether the pixmap will be scaled to fit the rectangle defined by the \a topLeft and \a
+  bottomRight positions.
+*/
+void QCPItemPixmap::setScaled(bool scaled, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformationMode)
+{
+  mScaled = scaled;
+  mAspectRatioMode = aspectRatioMode;
+  mTransformationMode = transformationMode;
+  mScaledPixmapInvalidated = true;
+}
+
+/*!
+  Sets the pen that will be used to draw a border around the pixmap.
+  
+  \see setSelectedPen, setBrush
+*/
+void QCPItemPixmap::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw a border around the pixmap when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemPixmap::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/* inherits documentation from base class */
+double QCPItemPixmap::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  return rectSelectTest(getFinalRect(), pos, true);
+}
+
+/* inherits documentation from base class */
+void QCPItemPixmap::draw(QCPPainter *painter)
+{
+  bool flipHorz = false;
+  bool flipVert = false;
+  QRect rect = getFinalRect(&flipHorz, &flipVert);
+  double clipPad = mainPen().style() == Qt::NoPen ? 0 : mainPen().widthF();
+  QRect boundingRect = rect.adjusted(-clipPad, -clipPad, clipPad, clipPad);
+  if (boundingRect.intersects(clipRect()))
+  {
+    updateScaledPixmap(rect, flipHorz, flipVert);
+    painter->drawPixmap(rect.topLeft(), mScaled ? mScaledPixmap : mPixmap);
+    QPen pen = mainPen();
+    if (pen.style() != Qt::NoPen)
+    {
+      painter->setPen(pen);
+      painter->setBrush(Qt::NoBrush);
+      painter->drawRect(rect);
+    }
+  }
+}
+
+/* inherits documentation from base class */
+QPointF QCPItemPixmap::anchorPixelPoint(int anchorId) const
+{
+  bool flipHorz;
+  bool flipVert;
+  QRect rect = getFinalRect(&flipHorz, &flipVert);
+  // we actually want denormal rects (negative width/height) here, so restore
+  // the flipped state:
+  if (flipHorz)
+    rect.adjust(rect.width(), 0, -rect.width(), 0);
+  if (flipVert)
+    rect.adjust(0, rect.height(), 0, -rect.height());
+  
+  switch (anchorId)
+  {
+    case aiTop:         return (rect.topLeft()+rect.topRight())*0.5;
+    case aiTopRight:    return rect.topRight();
+    case aiRight:       return (rect.topRight()+rect.bottomRight())*0.5;
+    case aiBottom:      return (rect.bottomLeft()+rect.bottomRight())*0.5;
+    case aiBottomLeft:  return rect.bottomLeft();
+    case aiLeft:        return (rect.topLeft()+rect.bottomLeft())*0.5;;
+  }
+  
+  qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId;
+  return QPointF();
+}
+
+/*! \internal
+  
+  Creates the buffered scaled image (\a mScaledPixmap) to fit the specified \a finalRect. The
+  parameters \a flipHorz and \a flipVert control whether the resulting image shall be flipped
+  horizontally or vertically. (This is used when \a topLeft is further to the bottom/right than \a
+  bottomRight.)
+  
+  This function only creates the scaled pixmap when the buffered pixmap has a different size than
+  the expected result, so calling this function repeatedly, e.g. in the \ref draw function, does
+  not cause expensive rescaling every time.
+  
+  If scaling is disabled, sets mScaledPixmap to a null QPixmap.
+*/
+void QCPItemPixmap::updateScaledPixmap(QRect finalRect, bool flipHorz, bool flipVert)
+{
+  if (mPixmap.isNull())
+    return;
+  
+  if (mScaled)
+  {
+    if (finalRect.isNull())
+      finalRect = getFinalRect(&flipHorz, &flipVert);
+    if (mScaledPixmapInvalidated || finalRect.size() != mScaledPixmap.size())
+    {
+      mScaledPixmap = mPixmap.scaled(finalRect.size(), mAspectRatioMode, mTransformationMode);
+      if (flipHorz || flipVert)
+        mScaledPixmap = QPixmap::fromImage(mScaledPixmap.toImage().mirrored(flipHorz, flipVert));
+    }
+  } else if (!mScaledPixmap.isNull())
+    mScaledPixmap = QPixmap();
+  mScaledPixmapInvalidated = false;
+}
+
+/*! \internal
+  
+  Returns the final (tight) rect the pixmap is drawn in, depending on the current item positions
+  and scaling settings.
+  
+  The output parameters \a flippedHorz and \a flippedVert return whether the pixmap should be drawn
+  flipped horizontally or vertically in the returned rect. (The returned rect itself is always
+  normalized, i.e. the top left corner of the rect is actually further to the top/left than the
+  bottom right corner). This is the case when the item position \a topLeft is further to the
+  bottom/right than \a bottomRight.
+  
+  If scaling is disabled, returns a rect with size of the original pixmap and the top left corner
+  aligned with the item position \a topLeft. The position \a bottomRight is ignored.
+*/
+QRect QCPItemPixmap::getFinalRect(bool *flippedHorz, bool *flippedVert) const
+{
+  QRect result;
+  bool flipHorz = false;
+  bool flipVert = false;
+  QPoint p1 = topLeft->pixelPoint().toPoint();
+  QPoint p2 = bottomRight->pixelPoint().toPoint();
+  if (p1 == p2)
+    return QRect(p1, QSize(0, 0));
+  if (mScaled)
+  {
+    QSize newSize = QSize(p2.x()-p1.x(), p2.y()-p1.y());
+    QPoint topLeft = p1;
+    if (newSize.width() < 0)
+    {
+      flipHorz = true;
+      newSize.rwidth() *= -1;
+      topLeft.setX(p2.x());
+    }
+    if (newSize.height() < 0)
+    {
+      flipVert = true;
+      newSize.rheight() *= -1;
+      topLeft.setY(p2.y());
+    }
+    QSize scaledSize = mPixmap.size();
+    scaledSize.scale(newSize, mAspectRatioMode);
+    result = QRect(topLeft, scaledSize);
+  } else
+  {
+    result = QRect(p1, mPixmap.size());
+  }
+  if (flippedHorz)
+    *flippedHorz = flipHorz;
+  if (flippedVert)
+    *flippedVert = flipVert;
+  return result;
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected
+  and mSelectedPen when it is.
+*/
+QPen QCPItemPixmap::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemTracer
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemTracer
+  \brief Item that sticks to QCPGraph data points
+
+  \image html QCPItemTracer.png "Tracer example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  The tracer can be connected with a QCPGraph via \ref setGraph. Then it will automatically adopt
+  the coordinate axes of the graph and update its \a position to be on the graph's data. This means
+  the key stays controllable via \ref setGraphKey, but the value will follow the graph data. If a
+  QCPGraph is connected, note that setting the coordinates of the tracer item directly via \a
+  position will have no effect because they will be overriden in the next redraw (this is when the
+  coordinate update happens).
+  
+  If the specified key in \ref setGraphKey is outside the key bounds of the graph, the tracer will
+  stay at the corresponding end of the graph.
+  
+  With \ref setInterpolating you may specify whether the tracer may only stay exactly on data
+  points or whether it interpolates data points linearly, if given a key that lies between two data
+  points of the graph.
+  
+  The tracer has different visual styles, see \ref setStyle. It is also possible to make the tracer
+  have no own visual appearance (set the style to \ref tsNone), and just connect other item
+  positions to the tracer \a position (used as an anchor) via \ref
+  QCPItemPosition::setParentAnchor.
+  
+  \note The tracer position is only automatically updated upon redraws. So when the data of the
+  graph changes and immediately afterwards (without a redraw) the a position coordinates of the
+  tracer are retrieved, they will not reflect the updated data of the graph. In this case \ref
+  updatePosition must be called manually, prior to reading the tracer coordinates.
+*/
+
+/*!
+  Creates a tracer item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemTracer::QCPItemTracer(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  position(createPosition(QLatin1String("position"))),
+  mGraph(0)
+{
+  position->setCoords(0, 0);
+
+  setBrush(Qt::NoBrush);
+  setSelectedBrush(Qt::NoBrush);
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue, 2));
+  setStyle(tsCrosshair);
+  setSize(6);
+  setInterpolating(false);
+  setGraphKey(0);
+}
+
+QCPItemTracer::~QCPItemTracer()
+{
+}
+
+/*!
+  Sets the pen that will be used to draw the line of the tracer
+  
+  \see setSelectedPen, setBrush
+*/
+void QCPItemTracer::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw the line of the tracer when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemTracer::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  Sets the brush that will be used to draw any fills of the tracer
+  
+  \see setSelectedBrush, setPen
+*/
+void QCPItemTracer::setBrush(const QBrush &brush)
+{
+  mBrush = brush;
+}
+
+/*!
+  Sets the brush that will be used to draw any fills of the tracer, when selected.
+  
+  \see setBrush, setSelected
+*/
+void QCPItemTracer::setSelectedBrush(const QBrush &brush)
+{
+  mSelectedBrush = brush;
+}
+
+/*!
+  Sets the size of the tracer in pixels, if the style supports setting a size (e.g. \ref tsSquare
+  does, \ref tsCrosshair does not).
+*/
+void QCPItemTracer::setSize(double size)
+{
+  mSize = size;
+}
+
+/*!
+  Sets the style/visual appearance of the tracer.
+  
+  If you only want to use the tracer \a position as an anchor for other items, set \a style to
+  \ref tsNone.
+*/
+void QCPItemTracer::setStyle(QCPItemTracer::TracerStyle style)
+{
+  mStyle = style;
+}
+
+/*!
+  Sets the QCPGraph this tracer sticks to. The tracer \a position will be set to type
+  QCPItemPosition::ptPlotCoords and the axes will be set to the axes of \a graph.
+  
+  To free the tracer from any graph, set \a graph to 0. The tracer \a position can then be placed
+  freely like any other item position. This is the state the tracer will assume when its graph gets
+  deleted while still attached to it.
+  
+  \see setGraphKey
+*/
+void QCPItemTracer::setGraph(QCPGraph *graph)
+{
+  if (graph)
+  {
+    if (graph->parentPlot() == mParentPlot)
+    {
+      position->setType(QCPItemPosition::ptPlotCoords);
+      position->setAxes(graph->keyAxis(), graph->valueAxis());
+      mGraph = graph;
+      updatePosition();
+    } else
+      qDebug() << Q_FUNC_INFO << "graph isn't in same QCustomPlot instance as this item";
+  } else
+  {
+    mGraph = 0;
+  }
+}
+
+/*!
+  Sets the key of the graph's data point the tracer will be positioned at. This is the only free
+  coordinate of a tracer when attached to a graph.
+  
+  Depending on \ref setInterpolating, the tracer will be either positioned on the data point
+  closest to \a key, or will stay exactly at \a key and interpolate the value linearly.
+  
+  \see setGraph, setInterpolating
+*/
+void QCPItemTracer::setGraphKey(double key)
+{
+  mGraphKey = key;
+}
+
+/*!
+  Sets whether the value of the graph's data points shall be interpolated, when positioning the
+  tracer.
+  
+  If \a enabled is set to false and a key is given with \ref setGraphKey, the tracer is placed on
+  the data point of the graph which is closest to the key, but which is not necessarily exactly
+  there. If \a enabled is true, the tracer will be positioned exactly at the specified key, and
+  the appropriate value will be interpolated from the graph's data points linearly.
+  
+  \see setGraph, setGraphKey
+*/
+void QCPItemTracer::setInterpolating(bool enabled)
+{
+  mInterpolating = enabled;
+}
+
+/* inherits documentation from base class */
+double QCPItemTracer::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+
+  QPointF center(position->pixelPoint());
+  double w = mSize/2.0;
+  QRect clip = clipRect();
+  switch (mStyle)
+  {
+    case tsNone: return -1;
+    case tsPlus:
+    {
+      if (clipRect().intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect()))
+        return qSqrt(qMin(distSqrToLine(center+QPointF(-w, 0), center+QPointF(w, 0), pos),
+                          distSqrToLine(center+QPointF(0, -w), center+QPointF(0, w), pos)));
+      break;
+    }
+    case tsCrosshair:
+    {
+      return qSqrt(qMin(distSqrToLine(QPointF(clip.left(), center.y()), QPointF(clip.right(), center.y()), pos),
+                        distSqrToLine(QPointF(center.x(), clip.top()), QPointF(center.x(), clip.bottom()), pos)));
+    }
+    case tsCircle:
+    {
+      if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect()))
+      {
+        // distance to border:
+        double centerDist = QVector2D(center-pos).length();
+        double circleLine = w;
+        double result = qAbs(centerDist-circleLine);
+        // filled ellipse, allow click inside to count as hit:
+        if (result > mParentPlot->selectionTolerance()*0.99 && mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0)
+        {
+          if (centerDist <= circleLine)
+            result = mParentPlot->selectionTolerance()*0.99;
+        }
+        return result;
+      }
+      break;
+    }
+    case tsSquare:
+    {
+      if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect()))
+      {
+        QRectF rect = QRectF(center-QPointF(w, w), center+QPointF(w, w));
+        bool filledRect = mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0;
+        return rectSelectTest(rect, pos, filledRect);
+      }
+      break;
+    }
+  }
+  return -1;
+}
+
+/* inherits documentation from base class */
+void QCPItemTracer::draw(QCPPainter *painter)
+{
+  updatePosition();
+  if (mStyle == tsNone)
+    return;
+
+  painter->setPen(mainPen());
+  painter->setBrush(mainBrush());
+  QPointF center(position->pixelPoint());
+  double w = mSize/2.0;
+  QRect clip = clipRect();
+  switch (mStyle)
+  {
+    case tsNone: return;
+    case tsPlus:
+    {
+      if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect()))
+      {
+        painter->drawLine(QLineF(center+QPointF(-w, 0), center+QPointF(w, 0)));
+        painter->drawLine(QLineF(center+QPointF(0, -w), center+QPointF(0, w)));
+      }
+      break;
+    }
+    case tsCrosshair:
+    {
+      if (center.y() > clip.top() && center.y() < clip.bottom())
+        painter->drawLine(QLineF(clip.left(), center.y(), clip.right(), center.y()));
+      if (center.x() > clip.left() && center.x() < clip.right())
+        painter->drawLine(QLineF(center.x(), clip.top(), center.x(), clip.bottom()));
+      break;
+    }
+    case tsCircle:
+    {
+      if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect()))
+        painter->drawEllipse(center, w, w);
+      break;
+    }
+    case tsSquare:
+    {
+      if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect()))
+        painter->drawRect(QRectF(center-QPointF(w, w), center+QPointF(w, w)));
+      break;
+    }
+  }
+}
+
+/*!
+  If the tracer is connected with a graph (\ref setGraph), this function updates the tracer's \a
+  position to reside on the graph data, depending on the configured key (\ref setGraphKey).
+  
+  It is called automatically on every redraw and normally doesn't need to be called manually. One
+  exception is when you want to read the tracer coordinates via \a position and are not sure that
+  the graph's data (or the tracer key with \ref setGraphKey) hasn't changed since the last redraw.
+  In that situation, call this function before accessing \a position, to make sure you don't get
+  out-of-date coordinates.
+  
+  If there is no graph set on this tracer, this function does nothing.
+*/
+void QCPItemTracer::updatePosition()
+{
+  if (mGraph)
+  {
+    if (mParentPlot->hasPlottable(mGraph))
+    {
+      if (mGraph->data()->size() > 1)
+      {
+        QCPDataMap::const_iterator first = mGraph->data()->constBegin();
+        QCPDataMap::const_iterator last = mGraph->data()->constEnd()-1;
+        if (mGraphKey < first.key())
+          position->setCoords(first.key(), first.value().value);
+        else if (mGraphKey > last.key())
+          position->setCoords(last.key(), last.value().value);
+        else
+        {
+          QCPDataMap::const_iterator it = mGraph->data()->lowerBound(mGraphKey);
+          if (it != first) // mGraphKey is somewhere between iterators
+          {
+            QCPDataMap::const_iterator prevIt = it-1;
+            if (mInterpolating)
+            {
+              // interpolate between iterators around mGraphKey:
+              double slope = 0;
+              if (!qFuzzyCompare((double)it.key(), (double)prevIt.key()))
+                slope = (it.value().value-prevIt.value().value)/(it.key()-prevIt.key());
+              position->setCoords(mGraphKey, (mGraphKey-prevIt.key())*slope+prevIt.value().value);
+            } else
+            {
+              // find iterator with key closest to mGraphKey:
+              if (mGraphKey < (prevIt.key()+it.key())*0.5)
+                it = prevIt;
+              position->setCoords(it.key(), it.value().value);
+            }
+          } else // mGraphKey is exactly on first iterator
+            position->setCoords(it.key(), it.value().value);
+        }
+      } else if (mGraph->data()->size() == 1)
+      {
+        QCPDataMap::const_iterator it = mGraph->data()->constBegin();
+        position->setCoords(it.key(), it.value().value);
+      } else
+        qDebug() << Q_FUNC_INFO << "graph has no data";
+    } else
+      qDebug() << Q_FUNC_INFO << "graph not contained in QCustomPlot instance (anymore)";
+  }
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected
+  and mSelectedPen when it is.
+*/
+QPen QCPItemTracer::mainPen() const
+{
+  return mSelected ? mSelectedPen : mPen;
+}
+
+/*! \internal
+
+  Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item
+  is not selected and mSelectedBrush when it is.
+*/
+QBrush QCPItemTracer::mainBrush() const
+{
+  return mSelected ? mSelectedBrush : mBrush;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////// QCPItemBracket
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*! \class QCPItemBracket
+  \brief A bracket for referencing/highlighting certain parts in the plot.
+
+  \image html QCPItemBracket.png "Bracket example. Blue dotted circles are anchors, solid blue discs are positions."
+
+  It has two positions, \a left and \a right, which define the span of the bracket. If \a left is
+  actually farther to the left than \a right, the bracket is opened to the bottom, as shown in the
+  example image.
+  
+  The bracket supports multiple styles via \ref setStyle. The length, i.e. how far the bracket
+  stretches away from the embraced span, can be controlled with \ref setLength.
+  
+  \image html QCPItemBracket-length.png
+  <center>Demonstrating the effect of different values for \ref setLength, for styles \ref
+  bsCalligraphic and \ref bsSquare. Anchors and positions are displayed for reference.</center>
+  
+  It provides an anchor \a center, to allow connection of other items, e.g. an arrow (QCPItemLine
+  or QCPItemCurve) or a text label (QCPItemText), to the bracket.
+*/
+
+/*!
+  Creates a bracket item and sets default values.
+  
+  The constructed item can be added to the plot with QCustomPlot::addItem.
+*/
+QCPItemBracket::QCPItemBracket(QCustomPlot *parentPlot) :
+  QCPAbstractItem(parentPlot),
+  left(createPosition(QLatin1String("left"))),
+  right(createPosition(QLatin1String("right"))),
+  center(createAnchor(QLatin1String("center"), aiCenter))
+{
+  left->setCoords(0, 0);
+  right->setCoords(1, 1);
+  
+  setPen(QPen(Qt::black));
+  setSelectedPen(QPen(Qt::blue, 2));
+  setLength(8);
+  setStyle(bsCalligraphic);
+}
+
+QCPItemBracket::~QCPItemBracket()
+{
+}
+
+/*!
+  Sets the pen that will be used to draw the bracket.
+  
+  Note that when the style is \ref bsCalligraphic, only the color will be taken from the pen, the
+  stroke and width are ignored. To change the apparent stroke width of a calligraphic bracket, use
+  \ref setLength, which has a similar effect.
+  
+  \see setSelectedPen
+*/
+void QCPItemBracket::setPen(const QPen &pen)
+{
+  mPen = pen;
+}
+
+/*!
+  Sets the pen that will be used to draw the bracket when selected
+  
+  \see setPen, setSelected
+*/
+void QCPItemBracket::setSelectedPen(const QPen &pen)
+{
+  mSelectedPen = pen;
+}
+
+/*!
+  Sets the \a length in pixels how far the bracket extends in the direction towards the embraced
+  span of the bracket (i.e. perpendicular to the <i>left</i>-<i>right</i>-direction)
+  
+  \image html QCPItemBracket-length.png
+  <center>Demonstrating the effect of different values for \ref setLength, for styles \ref
+  bsCalligraphic and \ref bsSquare. Anchors and positions are displayed for reference.</center>
+*/
+void QCPItemBracket::setLength(double length)
+{
+  mLength = length;
+}
+
+/*!
+  Sets the style of the bracket, i.e. the shape/visual appearance.
+  
+  \see setPen
+*/
+void QCPItemBracket::setStyle(QCPItemBracket::BracketStyle style)
+{
+  mStyle = style;
+}
+
+/* inherits documentation from base class */
+double QCPItemBracket::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const
+{
+  Q_UNUSED(details)
+  if (onlySelectable && !mSelectable)
+    return -1;
+  
+  QVector2D leftVec(left->pixelPoint());
+  QVector2D rightVec(right->pixelPoint());
+  if (leftVec.toPoint() == rightVec.toPoint())
+    return -1;
+  
+  QVector2D widthVec = (rightVec-leftVec)*0.5f;
+  QVector2D lengthVec(-widthVec.y(), widthVec.x());
+  lengthVec = lengthVec.normalized()*mLength;
+  QVector2D centerVec = (rightVec+leftVec)*0.5f-lengthVec;
+  
+  switch (mStyle)
+  {
+    case QCPItemBracket::bsSquare:
+    case QCPItemBracket::bsRound:
+    {
+      double a = distSqrToLine((centerVec-widthVec).toPointF(), (centerVec+widthVec).toPointF(), pos);
+      double b = distSqrToLine((centerVec-widthVec+lengthVec).toPointF(), (centerVec-widthVec).toPointF(), pos);
+      double c = distSqrToLine((centerVec+widthVec+lengthVec).toPointF(), (centerVec+widthVec).toPointF(), pos);
+      return qSqrt(qMin(qMin(a, b), c));
+    }
+    case QCPItemBracket::bsCurly:
+    case QCPItemBracket::bsCalligraphic:
+    {
+      double a = distSqrToLine((centerVec-widthVec*0.75f+lengthVec*0.15f).toPointF(), (centerVec+lengthVec*0.3f).toPointF(), pos);
+      double b = distSqrToLine((centerVec-widthVec+lengthVec*0.7f).toPointF(), (centerVec-widthVec*0.75f+lengthVec*0.15f).toPointF(), pos);
+      double c = distSqrToLine((centerVec+widthVec*0.75f+lengthVec*0.15f).toPointF(), (centerVec+lengthVec*0.3f).toPointF(), pos);
+      double d = distSqrToLine((centerVec+widthVec+lengthVec*0.7f).toPointF(), (centerVec+widthVec*0.75f+lengthVec*0.15f).toPointF(), pos);
+      return qSqrt(qMin(qMin(a, b), qMin(c, d)));
+    }
+  }
+  return -1;
+}
+
+/* inherits documentation from base class */
+void QCPItemBracket::draw(QCPPainter *painter)
+{
+  QVector2D leftVec(left->pixelPoint());
+  QVector2D rightVec(right->pixelPoint());
+  if (leftVec.toPoint() == rightVec.toPoint())
+    return;
+  
+  QVector2D widthVec = (rightVec-leftVec)*0.5f;
+  QVector2D lengthVec(-widthVec.y(), widthVec.x());
+  lengthVec = lengthVec.normalized()*mLength;
+  QVector2D centerVec = (rightVec+leftVec)*0.5f-lengthVec;
+
+  QPolygon boundingPoly;
+  boundingPoly << leftVec.toPoint() << rightVec.toPoint()
+               << (rightVec-lengthVec).toPoint() << (leftVec-lengthVec).toPoint();
+  QRect clip = clipRect().adjusted(-mainPen().widthF(), -mainPen().widthF(), mainPen().widthF(), mainPen().widthF());
+  if (clip.intersects(boundingPoly.boundingRect()))
+  {
+    painter->setPen(mainPen());
+    switch (mStyle)
+    {
+      case bsSquare:
+      {
+        painter->drawLine((centerVec+widthVec).toPointF(), (centerVec-widthVec).toPointF());
+        painter->drawLine((centerVec+widthVec).toPointF(), (centerVec+widthVec+lengthVec).toPointF());
+        painter->drawLine((centerVec-widthVec).toPointF(), (centerVec-widthVec+lengthVec).toPointF());
+        break;
+      }
+      case bsRound:
+      {
+        painter->setBrush(Qt::NoBrush);
+        QPainterPath path;
+        path.moveTo((centerVec+widthVec+lengthVec).toPointF());
+        path.cubicTo((centerVec+widthVec).toPointF(), (centerVec+widthVec).toPointF(), centerVec.toPointF());
+        path.cubicTo((centerVec-widthVec).toPointF(), (centerVec-widthVec).toPointF(), (centerVec-widthVec+lengthVec).toPointF());
+        painter->drawPath(path);
+        break;
+      }
+      case bsCurly:
+      {
+        painter->setBrush(Qt::NoBrush);
+        QPainterPath path;
+        path.moveTo((centerVec+widthVec+lengthVec).toPointF());
+        path.cubicTo((centerVec+widthVec-lengthVec*0.8f).toPointF(), (centerVec+0.4f*widthVec+lengthVec).toPointF(), centerVec.toPointF());
+        path.cubicTo((centerVec-0.4f*widthVec+lengthVec).toPointF(), (centerVec-widthVec-lengthVec*0.8f).toPointF(), (centerVec-widthVec+lengthVec).toPointF());
+        painter->drawPath(path);
+        break;
+      }
+      case bsCalligraphic:
+      {
+        painter->setPen(Qt::NoPen);
+        painter->setBrush(QBrush(mainPen().color()));
+        QPainterPath path;
+        path.moveTo((centerVec+widthVec+lengthVec).toPointF());
+        
+        path.cubicTo((centerVec+widthVec-lengthVec*0.8f).toPointF(), (centerVec+0.4f*widthVec+0.8f*lengthVec).toPointF(), centerVec.toPointF());
+        path.cubicTo((centerVec-0.4f*widthVec+0.8f*lengthVec).toPointF(), (centerVec-widthVec-lengthVec*0.8f).toPointF(), (centerVec-widthVec+lengthVec).toPointF());
+        
+        path.cubicTo((centerVec-widthVec-lengthVec*0.5f).toPointF(), (centerVec-0.2f*widthVec+1.2f*lengthVec).toPointF(), (centerVec+lengthVec*0.2f).toPointF());
+        path.cubicTo((centerVec+0.2f*widthVec+1.2f*lengthVec).toPointF(), (centerVec+widthVec-lengthVec*0.5f).toPointF(), (centerVec+widthVec+lengthVec).toPointF());
+        
+        painter->drawPath(path);
+        break;
+      }
+    }
+  }
+}
+
+/* inherits documentation from base class */
+QPointF QCPItemBracket::anchorPixelPoint(int anchorId) const
+{
+  QVector2D leftVec(left->pixelPoint());
+  QVector2D rightVec(right->pixelPoint());
+  if (leftVec.toPoint() == rightVec.toPoint())
+    return leftVec.toPointF();
+  
+  QVector2D widthVec = (rightVec-leftVec)*0.5f;
+  QVector2D lengthVec(-widthVec.y(), widthVec.x());
+  lengthVec = lengthVec.normalized()*mLength;
+  QVector2D centerVec = (rightVec+leftVec)*0.5f-lengthVec;
+  
+  switch (anchorId)
+  {
+    case aiCenter:
+      return centerVec.toPointF();
+  }
+  qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId;
+  return QPointF();
+}
+
+/*! \internal
+
+  Returns the pen that should be used for drawing lines. Returns mPen when the
+  item is not selected and mSelectedPen when it is.
+*/
+QPen QCPItemBracket::mainPen() const
+{
+    return mSelected ? mSelectedPen : mPen;
+}
+
diff --git a/ThirdParty/GUI/qcustomplot/qcustomplot.h b/ThirdParty/GUI/qcustomplot/qcustomplot.h
new file mode 100644
index 0000000..bb998f1
--- /dev/null
+++ b/ThirdParty/GUI/qcustomplot/qcustomplot.h
@@ -0,0 +1,3768 @@
+/***************************************************************************
+**                                                                        **
+**  QCustomPlot, an easy to use, modern plotting widget for Qt            **
+**  Copyright (C) 2011-2015 Emanuel Eichhammer                            **
+**                                                                        **
+**  This program is free software: you can redistribute it and/or modify  **
+**  it under the terms of the GNU General Public License as published by  **
+**  the Free Software Foundation, either version 3 of the License, or     **
+**  (at your option) any later version.                                   **
+**                                                                        **
+**  This program is distributed in the hope that it will be useful,       **
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of        **
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         **
+**  GNU General Public License for more details.                          **
+**                                                                        **
+**  You should have received a copy of the GNU General Public License     **
+**  along with this program.  If not, see http://www.gnu.org/licenses/.   **
+**                                                                        **
+****************************************************************************
+**           Author: Emanuel Eichhammer                                   **
+**  Website/Contact: http://www.qcustomplot.com/                          **
+**             Date: 22.12.15                                             **
+**          Version: 1.3.2                                                **
+****************************************************************************/
+
+#ifndef QCUSTOMPLOT_H
+#define QCUSTOMPLOT_H
+
+#include <QObject>
+#include <QPointer>
+#include <QWidget>
+#include <QPainter>
+#include <QPaintEvent>
+#include <QMouseEvent>
+#include <QPixmap>
+#include <QVector>
+#include <QString>
+#include <QDateTime>
+#include <QMultiMap>
+#include <QFlags>
+#include <QDebug>
+#include <QVector2D>
+#include <QStack>
+#include <QCache>
+#include <QMargins>
+#include <qmath.h>
+#include <limits>
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
+#  include <qnumeric.h>
+#  include <QPrinter>
+#  include <QPrintEngine>
+#else
+#  include <QtNumeric>
+#  include <QtPrintSupport/QtPrintSupport>
+#endif
+
+class QCPPainter;
+class QCustomPlot;
+class QCPLayerable;
+class QCPLayoutElement;
+class QCPLayout;
+class QCPAxis;
+class QCPAxisRect;
+class QCPAxisPainterPrivate;
+class QCPAbstractPlottable;
+class QCPGraph;
+class QCPAbstractItem;
+class QCPItemPosition;
+class QCPLayer;
+class QCPPlotTitle;
+class QCPLegend;
+class QCPAbstractLegendItem;
+class QCPColorMap;
+class QCPColorScale;
+class QCPBars;
+
+
+/*! \file */
+
+
+// decl definitions for shared library compilation/usage:
+#if defined(QCUSTOMPLOT_COMPILE_LIBRARY)
+#  define QCP_LIB_DECL Q_DECL_EXPORT
+#elif defined(QCUSTOMPLOT_USE_LIBRARY)
+#  define QCP_LIB_DECL Q_DECL_IMPORT
+#else
+#  define QCP_LIB_DECL
+#endif
+
+/*!
+  The QCP Namespace contains general enums and QFlags used throughout the QCustomPlot library
+*/
+namespace QCP
+{
+/*!
+  Defines the sides of a rectangular entity to which margins can be applied.
+  
+  \see QCPLayoutElement::setAutoMargins, QCPAxisRect::setAutoMargins
+*/
+enum MarginSide { msLeft     = 0x01 ///< <tt>0x01</tt> left margin
+                  ,msRight   = 0x02 ///< <tt>0x02</tt> right margin
+                  ,msTop     = 0x04 ///< <tt>0x04</tt> top margin
+                  ,msBottom  = 0x08 ///< <tt>0x08</tt> bottom margin
+                  ,msAll     = 0xFF ///< <tt>0xFF</tt> all margins
+                  ,msNone    = 0x00 ///< <tt>0x00</tt> no margin
+                };
+Q_DECLARE_FLAGS(MarginSides, MarginSide)
+
+/*!
+  Defines what objects of a plot can be forcibly drawn antialiased/not antialiased. If an object is
+  neither forcibly drawn antialiased nor forcibly drawn not antialiased, it is up to the respective
+  element how it is drawn. Typically it provides a \a setAntialiased function for this.
+  
+  \c AntialiasedElements is a flag of or-combined elements of this enum type.
+  
+  \see QCustomPlot::setAntialiasedElements, QCustomPlot::setNotAntialiasedElements
+*/
+enum AntialiasedElement { aeAxes           = 0x0001 ///< <tt>0x0001</tt> Axis base line and tick marks
+                          ,aeGrid          = 0x0002 ///< <tt>0x0002</tt> Grid lines
+                          ,aeSubGrid       = 0x0004 ///< <tt>0x0004</tt> Sub grid lines
+                          ,aeLegend        = 0x0008 ///< <tt>0x0008</tt> Legend box
+                          ,aeLegendItems   = 0x0010 ///< <tt>0x0010</tt> Legend items
+                          ,aePlottables    = 0x0020 ///< <tt>0x0020</tt> Main lines of plottables (excluding error bars, see element \ref aeErrorBars)
+                          ,aeItems         = 0x0040 ///< <tt>0x0040</tt> Main lines of items
+                          ,aeScatters      = 0x0080 ///< <tt>0x0080</tt> Scatter symbols of plottables (excluding scatter symbols of type ssPixmap)
+                          ,aeErrorBars     = 0x0100 ///< <tt>0x0100</tt> Error bars
+                          ,aeFills         = 0x0200 ///< <tt>0x0200</tt> Borders of fills (e.g. under or between graphs)
+                          ,aeZeroLine      = 0x0400 ///< <tt>0x0400</tt> Zero-lines, see \ref QCPGrid::setZeroLinePen
+                          ,aeAll           = 0xFFFF ///< <tt>0xFFFF</tt> All elements
+                          ,aeNone          = 0x0000 ///< <tt>0x0000</tt> No elements
+                        };
+Q_DECLARE_FLAGS(AntialiasedElements, AntialiasedElement)
+
+/*!
+  Defines plotting hints that control various aspects of the quality and speed of plotting.
+  
+  \see QCustomPlot::setPlottingHints
+*/
+enum PlottingHint { phNone            = 0x000 ///< <tt>0x000</tt> No hints are set
+                    ,phFastPolylines  = 0x001 ///< <tt>0x001</tt> Graph/Curve lines are drawn with a faster method. This reduces the quality
+                                              ///<                especially of the line segment joins. (Only relevant for solid line pens.)
+                    ,phForceRepaint   = 0x002 ///< <tt>0x002</tt> causes an immediate repaint() instead of a soft update() when QCustomPlot::replot() is called with parameter \ref QCustomPlot::rpHint.
+                                              ///<                This is set by default to prevent the plot from freezing on fast consecutive replots (e.g. user drags ranges with mouse).
+                    ,phCacheLabels    = 0x004 ///< <tt>0x004</tt> axis (tick) labels will be cached as pixmaps, increasing replot performance.
+                  };
+Q_DECLARE_FLAGS(PlottingHints, PlottingHint)
+
+/*!
+  Defines the mouse interactions possible with QCustomPlot.
+  
+  \c Interactions is a flag of or-combined elements of this enum type.
+  
+  \see QCustomPlot::setInteractions
+*/
+enum Interaction { iRangeDrag         = 0x001 ///< <tt>0x001</tt> Axis ranges are draggable (see \ref QCPAxisRect::setRangeDrag, \ref QCPAxisRect::setRangeDragAxes)
+                   ,iRangeZoom        = 0x002 ///< <tt>0x002</tt> Axis ranges are zoomable with the mouse wheel (see \ref QCPAxisRect::setRangeZoom, \ref QCPAxisRect::setRangeZoomAxes)
+                   ,iMultiSelect      = 0x004 ///< <tt>0x004</tt> The user can select multiple objects by holding the modifier set by \ref QCustomPlot::setMultiSelectModifier while clicking
+                   ,iSelectPlottables = 0x008 ///< <tt>0x008</tt> Plottables are selectable (e.g. graphs, curves, bars,... see QCPAbstractPlottable)
+                   ,iSelectAxes       = 0x010 ///< <tt>0x010</tt> Axes are selectable (or parts of them, see QCPAxis::setSelectableParts)
+                   ,iSelectLegend     = 0x020 ///< <tt>0x020</tt> Legends are selectable (or their child items, see QCPLegend::setSelectableParts)
+                   ,iSelectItems      = 0x040 ///< <tt>0x040</tt> Items are selectable (Rectangles, Arrows, Textitems, etc. see \ref QCPAbstractItem)
+                   ,iSelectOther      = 0x080 ///< <tt>0x080</tt> All other objects are selectable (e.g. your own derived layerables, the plot title,...)
+                 };
+Q_DECLARE_FLAGS(Interactions, Interaction)
+
+/*! \internal
+  
+  Returns whether the specified \a value is considered an invalid data value for plottables (i.e.
+  is \e nan or \e +/-inf). This function is used to check data validity upon replots, when the
+  compiler flag \c QCUSTOMPLOT_CHECK_DATA is set.
+*/
+inline bool isInvalidData(double value)
+{
+  return qIsNaN(value) || qIsInf(value);
+}
+
+/*! \internal
+  \overload
+  
+  Checks two arguments instead of one.
+*/
+inline bool isInvalidData(double value1, double value2)
+{
+  return isInvalidData(value1) || isInvalidData(value2);
+}
+
+/*! \internal
+  
+  Sets the specified \a side of \a margins to \a value
+  
+  \see getMarginValue
+*/
+inline void setMarginValue(QMargins &margins, QCP::MarginSide side, int value)
+{
+  switch (side)
+  {
+    case QCP::msLeft: margins.setLeft(value); break;
+    case QCP::msRight: margins.setRight(value); break;
+    case QCP::msTop: margins.setTop(value); break;
+    case QCP::msBottom: margins.setBottom(value); break;
+    case QCP::msAll: margins = QMargins(value, value, value, value); break;
+    default: break;
+  }
+}
+
+/*! \internal
+  
+  Returns the value of the specified \a side of \a margins. If \a side is \ref QCP::msNone or
+  \ref QCP::msAll, returns 0.
+  
+  \see setMarginValue
+*/
+inline int getMarginValue(const QMargins &margins, QCP::MarginSide side)
+{
+  switch (side)
+  {
+    case QCP::msLeft: return margins.left();
+    case QCP::msRight: return margins.right();
+    case QCP::msTop: return margins.top();
+    case QCP::msBottom: return margins.bottom();
+    default: break;
+  }
+  return 0;
+}
+
+} // end of namespace QCP
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::AntialiasedElements)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::PlottingHints)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::MarginSides)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::Interactions)
+
+
+class QCP_LIB_DECL QCPScatterStyle
+{
+  Q_GADGET
+public:
+  /*!
+    Defines the shape used for scatter points.
+
+    On plottables/items that draw scatters, the sizes of these visualizations (with exception of
+    \ref ssDot and \ref ssPixmap) can be controlled with the \ref setSize function. Scatters are
+    drawn with the pen and brush specified with \ref setPen and \ref setBrush.
+  */
+  Q_ENUMS(ScatterShape)
+  enum ScatterShape { ssNone       ///< no scatter symbols are drawn (e.g. in QCPGraph, data only represented with lines)
+                      ,ssDot       ///< \enumimage{ssDot.png} a single pixel (use \ref ssDisc or \ref ssCircle if you want a round shape with a certain radius)
+                      ,ssCross     ///< \enumimage{ssCross.png} a cross
+                      ,ssPlus      ///< \enumimage{ssPlus.png} a plus
+                      ,ssCircle    ///< \enumimage{ssCircle.png} a circle
+                      ,ssDisc      ///< \enumimage{ssDisc.png} a circle which is filled with the pen's color (not the brush as with ssCircle)
+                      ,ssSquare    ///< \enumimage{ssSquare.png} a square
+                      ,ssDiamond   ///< \enumimage{ssDiamond.png} a diamond
+                      ,ssStar      ///< \enumimage{ssStar.png} a star with eight arms, i.e. a combination of cross and plus
+                      ,ssTriangle  ///< \enumimage{ssTriangle.png} an equilateral triangle, standing on baseline
+                      ,ssTriangleInverted ///< \enumimage{ssTriangleInverted.png} an equilateral triangle, standing on corner
+                      ,ssCrossSquare      ///< \enumimage{ssCrossSquare.png} a square with a cross inside
+                      ,ssPlusSquare       ///< \enumimage{ssPlusSquare.png} a square with a plus inside
+                      ,ssCrossCircle      ///< \enumimage{ssCrossCircle.png} a circle with a cross inside
+                      ,ssPlusCircle       ///< \enumimage{ssPlusCircle.png} a circle with a plus inside
+                      ,ssPeace     ///< \enumimage{ssPeace.png} a circle, with one vertical and two downward diagonal lines
+                      ,ssPixmap    ///< a custom pixmap specified by \ref setPixmap, centered on the data point coordinates
+                      ,ssCustom    ///< custom painter operations are performed per scatter (As QPainterPath, see \ref setCustomPath)
+                    };
+
+  QCPScatterStyle();
+  QCPScatterStyle(ScatterShape shape, double size=6);
+  QCPScatterStyle(ScatterShape shape, const QColor &color, double size);
+  QCPScatterStyle(ScatterShape shape, const QColor &color, const QColor &fill, double size);
+  QCPScatterStyle(ScatterShape shape, const QPen &pen, const QBrush &brush, double size);
+  QCPScatterStyle(const QPixmap &pixmap);
+  QCPScatterStyle(const QPainterPath &customPath, const QPen &pen, const QBrush &brush=Qt::NoBrush, double size=6);
+  
+  // getters:
+  double size() const { return mSize; }
+  ScatterShape shape() const { return mShape; }
+  QPen pen() const { return mPen; }
+  QBrush brush() const { return mBrush; }
+  QPixmap pixmap() const { return mPixmap; }
+  QPainterPath customPath() const { return mCustomPath; }
+
+  // setters:
+  void setSize(double size);
+  void setShape(ScatterShape shape);
+  void setPen(const QPen &pen);
+  void setBrush(const QBrush &brush);
+  void setPixmap(const QPixmap &pixmap);
+  void setCustomPath(const QPainterPath &customPath);
+
+  // non-property methods:
+  bool isNone() const { return mShape == ssNone; }
+  bool isPenDefined() const { return mPenDefined; }
+  void applyTo(QCPPainter *painter, const QPen &defaultPen) const;
+  void drawShape(QCPPainter *painter, QPointF pos) const;
+  void drawShape(QCPPainter *painter, double x, double y) const;
+
+protected:
+  // property members:
+  double mSize;
+  ScatterShape mShape;
+  QPen mPen;
+  QBrush mBrush;
+  QPixmap mPixmap;
+  QPainterPath mCustomPath;
+  
+  // non-property members:
+  bool mPenDefined;
+};
+Q_DECLARE_TYPEINFO(QCPScatterStyle, Q_MOVABLE_TYPE);
+
+
+class QCP_LIB_DECL QCPPainter : public QPainter
+{
+  Q_GADGET
+public:
+  /*!
+    Defines special modes the painter can operate in. They disable or enable certain subsets of features/fixes/workarounds,
+    depending on whether they are wanted on the respective output device.
+  */
+  enum PainterMode { pmDefault       = 0x00   ///< <tt>0x00</tt> Default mode for painting on screen devices
+                     ,pmVectorized   = 0x01   ///< <tt>0x01</tt> Mode for vectorized painting (e.g. PDF export). For example, this prevents some antialiasing fixes.
+                     ,pmNoCaching    = 0x02   ///< <tt>0x02</tt> Mode for all sorts of exports (e.g. PNG, PDF,...). For example, this prevents using cached pixmap labels
+                     ,pmNonCosmetic  = 0x04   ///< <tt>0x04</tt> Turns pen widths 0 to 1, i.e. disables cosmetic pens. (A cosmetic pen is always drawn with width 1 pixel in the vector image/pdf viewer, independent of zoom.)
+                   };
+  Q_FLAGS(PainterMode PainterModes)
+  Q_DECLARE_FLAGS(PainterModes, PainterMode)
+  
+  QCPPainter();
+  QCPPainter(QPaintDevice *device);
+  ~QCPPainter();
+  
+  // getters:
+  bool antialiasing() const { return testRenderHint(QPainter::Antialiasing); }
+  PainterModes modes() const { return mModes; }
+
+  // setters:
+  void setAntialiasing(bool enabled);
+  void setMode(PainterMode mode, bool enabled=true);
+  void setModes(PainterModes modes);
+
+  // methods hiding non-virtual base class functions (QPainter bug workarounds):
+  bool begin(QPaintDevice *device);
+  void setPen(const QPen &pen);
+  void setPen(const QColor &color);
+  void setPen(Qt::PenStyle penStyle);
+  void drawLine(const QLineF &line);
+  void drawLine(const QPointF &p1, const QPointF &p2) {drawLine(QLineF(p1, p2));}
+  void save();
+  void restore();
+  
+  // non-virtual methods:
+  void makeNonCosmetic();
+  
+protected:
+  // property members:
+  PainterModes mModes;
+  bool mIsAntialiasing;
+  
+  // non-property members:
+  QStack<bool> mAntialiasingStack;
+};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCPPainter::PainterModes)
+
+
+class QCP_LIB_DECL QCPLayer : public QObject
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QCustomPlot* parentPlot READ parentPlot)
+  Q_PROPERTY(QString name READ name)
+  Q_PROPERTY(int index READ index)
+  Q_PROPERTY(QList<QCPLayerable*> children READ children)
+  Q_PROPERTY(bool visible READ visible WRITE setVisible)
+  /// \endcond
+public:
+  QCPLayer(QCustomPlot* parentPlot, const QString &layerName);
+  ~QCPLayer();
+  
+  // getters:
+  QCustomPlot *parentPlot() const { return mParentPlot; }
+  QString name() const { return mName; }
+  int index() const { return mIndex; }
+  QList<QCPLayerable*> children() const { return mChildren; }
+  bool visible() const { return mVisible; }
+  
+  // setters:
+  void setVisible(bool visible);
+  
+protected:
+  // property members:
+  QCustomPlot *mParentPlot;
+  QString mName;
+  int mIndex;
+  QList<QCPLayerable*> mChildren;
+  bool mVisible;
+  
+  // non-virtual methods:
+  void addChild(QCPLayerable *layerable, bool prepend);
+  void removeChild(QCPLayerable *layerable);
+  
+private:
+  Q_DISABLE_COPY(QCPLayer)
+  
+  friend class QCustomPlot;
+  friend class QCPLayerable;
+};
+
+class QCP_LIB_DECL QCPLayerable : public QObject
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(bool visible READ visible WRITE setVisible)
+  Q_PROPERTY(QCustomPlot* parentPlot READ parentPlot)
+  Q_PROPERTY(QCPLayerable* parentLayerable READ parentLayerable)
+  Q_PROPERTY(QCPLayer* layer READ layer WRITE setLayer NOTIFY layerChanged)
+  Q_PROPERTY(bool antialiased READ antialiased WRITE setAntialiased)
+  /// \endcond
+public:
+  QCPLayerable(QCustomPlot *plot, QString targetLayer=QString(), QCPLayerable *parentLayerable=0);
+  ~QCPLayerable();
+  
+  // getters:
+  bool visible() const { return mVisible; }
+  QCustomPlot *parentPlot() const { return mParentPlot; }
+  QCPLayerable *parentLayerable() const { return mParentLayerable.data(); }
+  QCPLayer *layer() const { return mLayer; }
+  bool antialiased() const { return mAntialiased; }
+  
+  // setters:
+  void setVisible(bool on);
+  Q_SLOT bool setLayer(QCPLayer *layer);
+  bool setLayer(const QString &layerName);
+  void setAntialiased(bool enabled);
+  
+  // introduced virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  // non-property methods:
+  bool realVisibility() const;
+  
+signals:
+  void layerChanged(QCPLayer *newLayer);
+  
+protected:
+  // property members:
+  bool mVisible;
+  QCustomPlot *mParentPlot;
+  QPointer<QCPLayerable> mParentLayerable;
+  QCPLayer *mLayer;
+  bool mAntialiased;
+  
+  // introduced virtual methods:
+  virtual void parentPlotInitialized(QCustomPlot *parentPlot);
+  virtual QCP::Interaction selectionCategory() const;
+  virtual QRect clipRect() const;
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const = 0;
+  virtual void draw(QCPPainter *painter) = 0;
+  // events:
+  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
+  virtual void deselectEvent(bool *selectionStateChanged);
+  
+  // non-property methods:
+  void initializeParentPlot(QCustomPlot *parentPlot);
+  void setParentLayerable(QCPLayerable* parentLayerable);
+  bool moveToLayer(QCPLayer *layer, bool prepend);
+  void applyAntialiasingHint(QCPPainter *painter, bool localAntialiased, QCP::AntialiasedElement overrideElement) const;
+  
+private:
+  Q_DISABLE_COPY(QCPLayerable)
+  
+  friend class QCustomPlot;
+  friend class QCPAxisRect;
+};
+
+
+class QCP_LIB_DECL QCPRange
+{
+public:
+  double lower, upper;
+  
+  QCPRange();
+  QCPRange(double lower, double upper);
+  
+  bool operator==(const QCPRange& other) const { return lower == other.lower && upper == other.upper; }
+  bool operator!=(const QCPRange& other) const { return !(*this == other); }
+  
+  QCPRange &operator+=(const double& value) { lower+=value; upper+=value; return *this; }
+  QCPRange &operator-=(const double& value) { lower-=value; upper-=value; return *this; }
+  QCPRange &operator*=(const double& value) { lower*=value; upper*=value; return *this; }
+  QCPRange &operator/=(const double& value) { lower/=value; upper/=value; return *this; }
+  friend inline const QCPRange operator+(const QCPRange&, double);
+  friend inline const QCPRange operator+(double, const QCPRange&);
+  friend inline const QCPRange operator-(const QCPRange& range, double value);
+  friend inline const QCPRange operator*(const QCPRange& range, double value);
+  friend inline const QCPRange operator*(double value, const QCPRange& range);
+  friend inline const QCPRange operator/(const QCPRange& range, double value);
+  
+  double size() const;
+  double center() const;
+  void normalize();
+  void expand(const QCPRange &otherRange);
+  QCPRange expanded(const QCPRange &otherRange) const;
+  QCPRange sanitizedForLogScale() const;
+  QCPRange sanitizedForLinScale() const;
+  bool contains(double value) const;
+  
+  static bool validRange(double lower, double upper);
+  static bool validRange(const QCPRange &range);
+  static const double minRange; //1e-280;
+  static const double maxRange; //1e280;
+  
+};
+Q_DECLARE_TYPEINFO(QCPRange, Q_MOVABLE_TYPE);
+
+/* documentation of inline functions */
+
+/*! \fn QCPRange &QCPRange::operator+=(const double& value)
+  
+  Adds \a value to both boundaries of the range.
+*/
+
+/*! \fn QCPRange &QCPRange::operator-=(const double& value)
+  
+  Subtracts \a value from both boundaries of the range.
+*/
+
+/*! \fn QCPRange &QCPRange::operator*=(const double& value)
+  
+  Multiplies both boundaries of the range by \a value.
+*/
+
+/*! \fn QCPRange &QCPRange::operator/=(const double& value)
+  
+  Divides both boundaries of the range by \a value.
+*/
+
+/* end documentation of inline functions */
+
+/*!
+  Adds \a value to both boundaries of the range.
+*/
+inline const QCPRange operator+(const QCPRange& range, double value)
+{
+  QCPRange result(range);
+  result += value;
+  return result;
+}
+
+/*!
+  Adds \a value to both boundaries of the range.
+*/
+inline const QCPRange operator+(double value, const QCPRange& range)
+{
+  QCPRange result(range);
+  result += value;
+  return result;
+}
+
+/*!
+  Subtracts \a value from both boundaries of the range.
+*/
+inline const QCPRange operator-(const QCPRange& range, double value)
+{
+  QCPRange result(range);
+  result -= value;
+  return result;
+}
+
+/*!
+  Multiplies both boundaries of the range by \a value.
+*/
+inline const QCPRange operator*(const QCPRange& range, double value)
+{
+  QCPRange result(range);
+  result *= value;
+  return result;
+}
+
+/*!
+  Multiplies both boundaries of the range by \a value.
+*/
+inline const QCPRange operator*(double value, const QCPRange& range)
+{
+  QCPRange result(range);
+  result *= value;
+  return result;
+}
+
+/*!
+  Divides both boundaries of the range by \a value.
+*/
+inline const QCPRange operator/(const QCPRange& range, double value)
+{
+  QCPRange result(range);
+  result /= value;
+  return result;
+}
+
+
+class QCP_LIB_DECL QCPMarginGroup : public QObject
+{
+  Q_OBJECT
+public:
+  QCPMarginGroup(QCustomPlot *parentPlot);
+  ~QCPMarginGroup();
+  
+  // non-virtual methods:
+  QList<QCPLayoutElement*> elements(QCP::MarginSide side) const { return mChildren.value(side); }
+  bool isEmpty() const;
+  void clear();
+  
+protected:
+  // non-property members:
+  QCustomPlot *mParentPlot;
+  QHash<QCP::MarginSide, QList<QCPLayoutElement*> > mChildren;
+  
+  // non-virtual methods:
+  int commonMargin(QCP::MarginSide side) const;
+  void addChild(QCP::MarginSide side, QCPLayoutElement *element);
+  void removeChild(QCP::MarginSide side, QCPLayoutElement *element);
+  
+private:
+  Q_DISABLE_COPY(QCPMarginGroup)
+  
+  friend class QCPLayoutElement;
+};
+
+
+class QCP_LIB_DECL QCPLayoutElement : public QCPLayerable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QCPLayout* layout READ layout)
+  Q_PROPERTY(QRect rect READ rect)
+  Q_PROPERTY(QRect outerRect READ outerRect WRITE setOuterRect)
+  Q_PROPERTY(QMargins margins READ margins WRITE setMargins)
+  Q_PROPERTY(QMargins minimumMargins READ minimumMargins WRITE setMinimumMargins)
+  Q_PROPERTY(QSize minimumSize READ minimumSize WRITE setMinimumSize)
+  Q_PROPERTY(QSize maximumSize READ maximumSize WRITE setMaximumSize)
+  /// \endcond
+public:
+  /*!
+    Defines the phases of the update process, that happens just before a replot. At each phase,
+    \ref update is called with the according UpdatePhase value.
+  */
+  enum UpdatePhase { upPreparation ///< Phase used for any type of preparation that needs to be done before margin calculation and layout
+                     ,upMargins    ///< Phase in which the margins are calculated and set
+                     ,upLayout     ///< Final phase in which the layout system places the rects of the elements
+                   };
+  Q_ENUMS(UpdatePhase)
+
+  explicit QCPLayoutElement(QCustomPlot *parentPlot=0);
+  virtual ~QCPLayoutElement();
+  
+  // getters:
+  QCPLayout *layout() const { return mParentLayout; }
+  QRect rect() const { return mRect; }
+  QRect outerRect() const { return mOuterRect; }
+  QMargins margins() const { return mMargins; }
+  QMargins minimumMargins() const { return mMinimumMargins; }
+  QCP::MarginSides autoMargins() const { return mAutoMargins; }
+  QSize minimumSize() const { return mMinimumSize; }
+  QSize maximumSize() const { return mMaximumSize; }
+  QCPMarginGroup *marginGroup(QCP::MarginSide side) const { return mMarginGroups.value(side, (QCPMarginGroup*)0); }
+  QHash<QCP::MarginSide, QCPMarginGroup*> marginGroups() const { return mMarginGroups; }
+  
+  // setters:
+  void setOuterRect(const QRect &rect);
+  void setMargins(const QMargins &margins);
+  void setMinimumMargins(const QMargins &margins);
+  void setAutoMargins(QCP::MarginSides sides);
+  void setMinimumSize(const QSize &size);
+  void setMinimumSize(int width, int height);
+  void setMaximumSize(const QSize &size);
+  void setMaximumSize(int width, int height);
+  void setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *group);
+  
+  // introduced virtual methods:
+  virtual void update(UpdatePhase phase);
+  virtual QSize minimumSizeHint() const;
+  virtual QSize maximumSizeHint() const;
+  virtual QList<QCPLayoutElement*> elements(bool recursive) const;
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+protected:
+  // property members:
+  QCPLayout *mParentLayout;
+  QSize mMinimumSize, mMaximumSize;
+  QRect mRect, mOuterRect;
+  QMargins mMargins, mMinimumMargins;
+  QCP::MarginSides mAutoMargins;
+  QHash<QCP::MarginSide, QCPMarginGroup*> mMarginGroups;
+  
+  // introduced virtual methods:
+  virtual int calculateAutoMargin(QCP::MarginSide side);
+  // events:
+  virtual void mousePressEvent(QMouseEvent *event) {Q_UNUSED(event)}
+  virtual void mouseMoveEvent(QMouseEvent *event) {Q_UNUSED(event)}
+  virtual void mouseReleaseEvent(QMouseEvent *event) {Q_UNUSED(event)}
+  virtual void mouseDoubleClickEvent(QMouseEvent *event) {Q_UNUSED(event)}
+  virtual void wheelEvent(QWheelEvent *event) {Q_UNUSED(event)}
+  
+  // reimplemented virtual methods:
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const { Q_UNUSED(painter) }
+  virtual void draw(QCPPainter *painter) { Q_UNUSED(painter) }
+  virtual void parentPlotInitialized(QCustomPlot *parentPlot);
+
+private:
+  Q_DISABLE_COPY(QCPLayoutElement)
+  
+  friend class QCustomPlot;
+  friend class QCPLayout;
+  friend class QCPMarginGroup;
+};
+
+
+class QCP_LIB_DECL QCPLayout : public QCPLayoutElement
+{
+  Q_OBJECT
+public:
+  explicit QCPLayout();
+  
+  // reimplemented virtual methods:
+  virtual void update(UpdatePhase phase);
+  virtual QList<QCPLayoutElement*> elements(bool recursive) const;
+  
+  // introduced virtual methods:
+  virtual int elementCount() const = 0;
+  virtual QCPLayoutElement* elementAt(int index) const = 0;
+  virtual QCPLayoutElement* takeAt(int index) = 0;
+  virtual bool take(QCPLayoutElement* element) = 0;
+  virtual void simplify();
+  
+  // non-virtual methods:
+  bool removeAt(int index);
+  bool remove(QCPLayoutElement* element);
+  void clear();
+  
+protected:
+  // introduced virtual methods:
+  virtual void updateLayout();
+  
+  // non-virtual methods:
+  void sizeConstraintsChanged() const;
+  void adoptElement(QCPLayoutElement *el);
+  void releaseElement(QCPLayoutElement *el);
+  QVector<int> getSectionSizes(QVector<int> maxSizes, QVector<int> minSizes, QVector<double> stretchFactors, int totalSize) const;
+  
+private:
+  Q_DISABLE_COPY(QCPLayout)
+  friend class QCPLayoutElement;
+};
+
+
+class QCP_LIB_DECL QCPLayoutGrid : public QCPLayout
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(int rowCount READ rowCount)
+  Q_PROPERTY(int columnCount READ columnCount)
+  Q_PROPERTY(QList<double> columnStretchFactors READ columnStretchFactors WRITE setColumnStretchFactors)
+  Q_PROPERTY(QList<double> rowStretchFactors READ rowStretchFactors WRITE setRowStretchFactors)
+  Q_PROPERTY(int columnSpacing READ columnSpacing WRITE setColumnSpacing)
+  Q_PROPERTY(int rowSpacing READ rowSpacing WRITE setRowSpacing)
+  /// \endcond
+public:
+  explicit QCPLayoutGrid();
+  virtual ~QCPLayoutGrid();
+  
+  // getters:
+  int rowCount() const;
+  int columnCount() const;
+  QList<double> columnStretchFactors() const { return mColumnStretchFactors; }
+  QList<double> rowStretchFactors() const { return mRowStretchFactors; }
+  int columnSpacing() const { return mColumnSpacing; }
+  int rowSpacing() const { return mRowSpacing; }
+  
+  // setters:
+  void setColumnStretchFactor(int column, double factor);
+  void setColumnStretchFactors(const QList<double> &factors);
+  void setRowStretchFactor(int row, double factor);
+  void setRowStretchFactors(const QList<double> &factors);
+  void setColumnSpacing(int pixels);
+  void setRowSpacing(int pixels);
+  
+  // reimplemented virtual methods:
+  virtual void updateLayout();
+  virtual int elementCount() const;
+  virtual QCPLayoutElement* elementAt(int index) const;
+  virtual QCPLayoutElement* takeAt(int index);
+  virtual bool take(QCPLayoutElement* element);
+  virtual QList<QCPLayoutElement*> elements(bool recursive) const;
+  virtual void simplify();
+  virtual QSize minimumSizeHint() const;
+  virtual QSize maximumSizeHint() const;
+  
+  // non-virtual methods:
+  QCPLayoutElement *element(int row, int column) const;
+  bool addElement(int row, int column, QCPLayoutElement *element);
+  bool hasElement(int row, int column);
+  void expandTo(int newRowCount, int newColumnCount);
+  void insertRow(int newIndex);
+  void insertColumn(int newIndex);
+  
+protected:
+  // property members:
+  QList<QList<QCPLayoutElement*> > mElements;
+  QList<double> mColumnStretchFactors;
+  QList<double> mRowStretchFactors;
+  int mColumnSpacing, mRowSpacing;
+  
+  // non-virtual methods:
+  void getMinimumRowColSizes(QVector<int> *minColWidths, QVector<int> *minRowHeights) const;
+  void getMaximumRowColSizes(QVector<int> *maxColWidths, QVector<int> *maxRowHeights) const;
+  
+private:
+  Q_DISABLE_COPY(QCPLayoutGrid)
+};
+
+
+class QCP_LIB_DECL QCPLayoutInset : public QCPLayout
+{
+  Q_OBJECT
+public:
+  /*!
+    Defines how the placement and sizing is handled for a certain element in a QCPLayoutInset.
+  */
+  enum InsetPlacement { ipFree            ///< The element may be positioned/sized arbitrarily, see \ref setInsetRect
+                        ,ipBorderAligned  ///< The element is aligned to one of the layout sides, see \ref setInsetAlignment
+                      };
+  
+  explicit QCPLayoutInset();
+  virtual ~QCPLayoutInset();
+  
+  // getters:
+  InsetPlacement insetPlacement(int index) const;
+  Qt::Alignment insetAlignment(int index) const;
+  QRectF insetRect(int index) const;
+  
+  // setters:
+  void setInsetPlacement(int index, InsetPlacement placement);
+  void setInsetAlignment(int index, Qt::Alignment alignment);
+  void setInsetRect(int index, const QRectF &rect);
+  
+  // reimplemented virtual methods:
+  virtual void updateLayout();
+  virtual int elementCount() const;
+  virtual QCPLayoutElement* elementAt(int index) const;
+  virtual QCPLayoutElement* takeAt(int index);
+  virtual bool take(QCPLayoutElement* element);
+  virtual void simplify() {}
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  // non-virtual methods:
+  void addElement(QCPLayoutElement *element, Qt::Alignment alignment);
+  void addElement(QCPLayoutElement *element, const QRectF &rect);
+  
+protected:
+  // property members:
+  QList<QCPLayoutElement*> mElements;
+  QList<InsetPlacement> mInsetPlacement;
+  QList<Qt::Alignment> mInsetAlignment;
+  QList<QRectF> mInsetRect;
+  
+private:
+  Q_DISABLE_COPY(QCPLayoutInset)
+};
+
+
+class QCP_LIB_DECL QCPLineEnding
+{
+  Q_GADGET
+public:
+  /*!
+    Defines the type of ending decoration for line-like items, e.g. an arrow.
+    
+    \image html QCPLineEnding.png
+    
+    The width and length of these decorations can be controlled with the functions \ref setWidth
+    and \ref setLength. Some decorations like \ref esDisc, \ref esSquare, \ref esDiamond and \ref esBar only
+    support a width, the length property is ignored.
+    
+    \see QCPItemLine::setHead, QCPItemLine::setTail, QCPItemCurve::setHead, QCPItemCurve::setTail, QCPAxis::setLowerEnding, QCPAxis::setUpperEnding
+  */
+  Q_ENUMS(EndingStyle)
+  enum EndingStyle { esNone          ///< No ending decoration
+                     ,esFlatArrow    ///< A filled arrow head with a straight/flat back (a triangle)
+                     ,esSpikeArrow   ///< A filled arrow head with an indented back
+                     ,esLineArrow    ///< A non-filled arrow head with open back
+                     ,esDisc         ///< A filled circle
+                     ,esSquare       ///< A filled square
+                     ,esDiamond      ///< A filled diamond (45° rotated square)
+                     ,esBar          ///< A bar perpendicular to the line
+                     ,esHalfBar      ///< A bar perpendicular to the line, pointing out to only one side (to which side can be changed with \ref setInverted)
+                     ,esSkewedBar    ///< A bar that is skewed (skew controllable via \ref setLength)
+                   };
+  
+  QCPLineEnding();
+  QCPLineEnding(EndingStyle style, double width=8, double length=10, bool inverted=false);
+  
+  // getters:
+  EndingStyle style() const { return mStyle; }
+  double width() const { return mWidth; }
+  double length() const { return mLength; }
+  bool inverted() const { return mInverted; }
+  
+  // setters:
+  void setStyle(EndingStyle style);
+  void setWidth(double width);
+  void setLength(double length);
+  void setInverted(bool inverted);
+  
+  // non-property methods:
+  double boundingDistance() const;
+  double realLength() const;
+  void draw(QCPPainter *painter, const QVector2D &pos, const QVector2D &dir) const;
+  void draw(QCPPainter *painter, const QVector2D &pos, double angle) const;
+  
+protected:
+  // property members:
+  EndingStyle mStyle;
+  double mWidth, mLength;
+  bool mInverted;
+};
+Q_DECLARE_TYPEINFO(QCPLineEnding, Q_MOVABLE_TYPE);
+
+
+class QCP_LIB_DECL QCPGrid :public QCPLayerable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(bool subGridVisible READ subGridVisible WRITE setSubGridVisible)
+  Q_PROPERTY(bool antialiasedSubGrid READ antialiasedSubGrid WRITE setAntialiasedSubGrid)
+  Q_PROPERTY(bool antialiasedZeroLine READ antialiasedZeroLine WRITE setAntialiasedZeroLine)
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen subGridPen READ subGridPen WRITE setSubGridPen)
+  Q_PROPERTY(QPen zeroLinePen READ zeroLinePen WRITE setZeroLinePen)
+  /// \endcond
+public:
+  QCPGrid(QCPAxis *parentAxis);
+  
+  // getters:
+  bool subGridVisible() const { return mSubGridVisible; }
+  bool antialiasedSubGrid() const { return mAntialiasedSubGrid; }
+  bool antialiasedZeroLine() const { return mAntialiasedZeroLine; }
+  QPen pen() const { return mPen; }
+  QPen subGridPen() const { return mSubGridPen; }
+  QPen zeroLinePen() const { return mZeroLinePen; }
+  
+  // setters:
+  void setSubGridVisible(bool visible);
+  void setAntialiasedSubGrid(bool enabled);
+  void setAntialiasedZeroLine(bool enabled);
+  void setPen(const QPen &pen);
+  void setSubGridPen(const QPen &pen);
+  void setZeroLinePen(const QPen &pen);
+  
+protected:
+  // property members:
+  bool mSubGridVisible;
+  bool mAntialiasedSubGrid, mAntialiasedZeroLine;
+  QPen mPen, mSubGridPen, mZeroLinePen;
+  // non-property members:
+  QCPAxis *mParentAxis;
+  
+  // reimplemented virtual methods:
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  virtual void draw(QCPPainter *painter);
+  
+  // non-virtual methods:
+  void drawGridLines(QCPPainter *painter) const;
+  void drawSubGridLines(QCPPainter *painter) const;
+  
+  friend class QCPAxis;
+};
+
+
+class QCP_LIB_DECL QCPAxis : public QCPLayerable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(AxisType axisType READ axisType)
+  Q_PROPERTY(QCPAxisRect* axisRect READ axisRect)
+  Q_PROPERTY(ScaleType scaleType READ scaleType WRITE setScaleType NOTIFY scaleTypeChanged)
+  Q_PROPERTY(double scaleLogBase READ scaleLogBase WRITE setScaleLogBase)
+  Q_PROPERTY(QCPRange range READ range WRITE setRange NOTIFY rangeChanged)
+  Q_PROPERTY(bool rangeReversed READ rangeReversed WRITE setRangeReversed)
+  Q_PROPERTY(bool autoTicks READ autoTicks WRITE setAutoTicks)
+  Q_PROPERTY(int autoTickCount READ autoTickCount WRITE setAutoTickCount)
+  Q_PROPERTY(bool autoTickLabels READ autoTickLabels WRITE setAutoTickLabels)
+  Q_PROPERTY(bool autoTickStep READ autoTickStep WRITE setAutoTickStep)
+  Q_PROPERTY(bool autoSubTicks READ autoSubTicks WRITE setAutoSubTicks)
+  Q_PROPERTY(bool ticks READ ticks WRITE setTicks)
+  Q_PROPERTY(bool tickLabels READ tickLabels WRITE setTickLabels)
+  Q_PROPERTY(int tickLabelPadding READ tickLabelPadding WRITE setTickLabelPadding)
+  Q_PROPERTY(LabelType tickLabelType READ tickLabelType WRITE setTickLabelType)
+  Q_PROPERTY(QFont tickLabelFont READ tickLabelFont WRITE setTickLabelFont)
+  Q_PROPERTY(QColor tickLabelColor READ tickLabelColor WRITE setTickLabelColor)
+  Q_PROPERTY(double tickLabelRotation READ tickLabelRotation WRITE setTickLabelRotation)
+  Q_PROPERTY(LabelSide tickLabelSide READ tickLabelSide WRITE setTickLabelSide)
+  Q_PROPERTY(QString dateTimeFormat READ dateTimeFormat WRITE setDateTimeFormat)
+  Q_PROPERTY(Qt::TimeSpec dateTimeSpec READ dateTimeSpec WRITE setDateTimeSpec)
+  Q_PROPERTY(QString numberFormat READ numberFormat WRITE setNumberFormat)
+  Q_PROPERTY(int numberPrecision READ numberPrecision WRITE setNumberPrecision)
+  Q_PROPERTY(double tickStep READ tickStep WRITE setTickStep)
+  Q_PROPERTY(QVector<double> tickVector READ tickVector WRITE setTickVector)
+  Q_PROPERTY(QVector<QString> tickVectorLabels READ tickVectorLabels WRITE setTickVectorLabels)
+  Q_PROPERTY(int tickLengthIn READ tickLengthIn WRITE setTickLengthIn)
+  Q_PROPERTY(int tickLengthOut READ tickLengthOut WRITE setTickLengthOut)
+  Q_PROPERTY(int subTickCount READ subTickCount WRITE setSubTickCount)
+  Q_PROPERTY(int subTickLengthIn READ subTickLengthIn WRITE setSubTickLengthIn)
+  Q_PROPERTY(int subTickLengthOut READ subTickLengthOut WRITE setSubTickLengthOut)
+  Q_PROPERTY(QPen basePen READ basePen WRITE setBasePen)
+  Q_PROPERTY(QPen tickPen READ tickPen WRITE setTickPen)
+  Q_PROPERTY(QPen subTickPen READ subTickPen WRITE setSubTickPen)
+  Q_PROPERTY(QFont labelFont READ labelFont WRITE setLabelFont)
+  Q_PROPERTY(QColor labelColor READ labelColor WRITE setLabelColor)
+  Q_PROPERTY(QString label READ label WRITE setLabel)
+  Q_PROPERTY(int labelPadding READ labelPadding WRITE setLabelPadding)
+  Q_PROPERTY(int padding READ padding WRITE setPadding)
+  Q_PROPERTY(int offset READ offset WRITE setOffset)
+  Q_PROPERTY(SelectableParts selectedParts READ selectedParts WRITE setSelectedParts NOTIFY selectionChanged)
+  Q_PROPERTY(SelectableParts selectableParts READ selectableParts WRITE setSelectableParts NOTIFY selectableChanged)
+  Q_PROPERTY(QFont selectedTickLabelFont READ selectedTickLabelFont WRITE setSelectedTickLabelFont)
+  Q_PROPERTY(QFont selectedLabelFont READ selectedLabelFont WRITE setSelectedLabelFont)
+  Q_PROPERTY(QColor selectedTickLabelColor READ selectedTickLabelColor WRITE setSelectedTickLabelColor)
+  Q_PROPERTY(QColor selectedLabelColor READ selectedLabelColor WRITE setSelectedLabelColor)
+  Q_PROPERTY(QPen selectedBasePen READ selectedBasePen WRITE setSelectedBasePen)
+  Q_PROPERTY(QPen selectedTickPen READ selectedTickPen WRITE setSelectedTickPen)
+  Q_PROPERTY(QPen selectedSubTickPen READ selectedSubTickPen WRITE setSelectedSubTickPen)
+  Q_PROPERTY(QCPLineEnding lowerEnding READ lowerEnding WRITE setLowerEnding)
+  Q_PROPERTY(QCPLineEnding upperEnding READ upperEnding WRITE setUpperEnding)
+  Q_PROPERTY(QCPGrid* grid READ grid)
+  /// \endcond
+public:
+  /*!
+    Defines at which side of the axis rect the axis will appear. This also affects how the tick
+    marks are drawn, on which side the labels are placed etc.
+  */
+  enum AxisType { atLeft    = 0x01  ///< <tt>0x01</tt> Axis is vertical and on the left side of the axis rect
+                  ,atRight  = 0x02  ///< <tt>0x02</tt> Axis is vertical and on the right side of the axis rect
+                  ,atTop    = 0x04  ///< <tt>0x04</tt> Axis is horizontal and on the top side of the axis rect
+                  ,atBottom = 0x08  ///< <tt>0x08</tt> Axis is horizontal and on the bottom side of the axis rect
+                };
+  Q_FLAGS(AxisType AxisTypes)
+  Q_DECLARE_FLAGS(AxisTypes, AxisType)
+  /*!
+    When automatic tick label generation is enabled (\ref setAutoTickLabels), defines how the
+    coordinate of the tick is interpreted, i.e. translated into a string.
+    
+    \see setTickLabelType
+  */
+  enum LabelType { ltNumber    ///< Tick coordinate is regarded as normal number and will be displayed as such. (see \ref setNumberFormat)
+                   ,ltDateTime ///< Tick coordinate is regarded as a date/time (seconds since 1970-01-01T00:00:00 UTC) and will be displayed and formatted as such. (for details, see \ref setDateTimeFormat)
+                 };
+  Q_ENUMS(LabelType)
+  /*!
+    Defines on which side of the axis the tick labels (numbers) shall appear.
+    
+    \see setTickLabelSide
+  */
+  enum LabelSide { lsInside    ///< Tick labels will be displayed inside the axis rect and clipped to the inner axis rect
+                   ,lsOutside  ///< Tick labels will be displayed outside the axis rect
+                 };
+  Q_ENUMS(LabelSide)
+  /*!
+    Defines the scale of an axis.
+    \see setScaleType
+  */
+  enum ScaleType { stLinear       ///< Linear scaling
+                   ,stLogarithmic ///< Logarithmic scaling with correspondingly transformed plots and (major) tick marks at every base power (see \ref setScaleLogBase).
+                 };
+  Q_ENUMS(ScaleType)
+  /*!
+    Defines the selectable parts of an axis.
+    \see setSelectableParts, setSelectedParts
+  */
+  enum SelectablePart { spNone        = 0      ///< None of the selectable parts
+                        ,spAxis       = 0x001  ///< The axis backbone and tick marks
+                        ,spTickLabels = 0x002  ///< Tick labels (numbers) of this axis (as a whole, not individually)
+                        ,spAxisLabel  = 0x004  ///< The axis label
+                      };
+  Q_FLAGS(SelectablePart SelectableParts)
+  Q_DECLARE_FLAGS(SelectableParts, SelectablePart)
+  
+  explicit QCPAxis(QCPAxisRect *parent, AxisType type);
+  virtual ~QCPAxis();
+  
+  // getters:
+  AxisType axisType() const { return mAxisType; }
+  QCPAxisRect *axisRect() const { return mAxisRect; }
+  ScaleType scaleType() const { return mScaleType; }
+  double scaleLogBase() const { return mScaleLogBase; }
+  const QCPRange range() const { return mRange; }
+  bool rangeReversed() const { return mRangeReversed; }
+  bool autoTicks() const { return mAutoTicks; }
+  int autoTickCount() const { return mAutoTickCount; }
+  bool autoTickLabels() const { return mAutoTickLabels; }
+  bool autoTickStep() const { return mAutoTickStep; }
+  bool autoSubTicks() const { return mAutoSubTicks; }
+  bool ticks() const { return mTicks; }
+  bool tickLabels() const { return mTickLabels; }
+  int tickLabelPadding() const;
+  LabelType tickLabelType() const { return mTickLabelType; }
+  QFont tickLabelFont() const { return mTickLabelFont; }
+  QColor tickLabelColor() const { return mTickLabelColor; }
+  double tickLabelRotation() const;
+  LabelSide tickLabelSide() const;
+  QString dateTimeFormat() const { return mDateTimeFormat; }
+  Qt::TimeSpec dateTimeSpec() const { return mDateTimeSpec; }
+  QString numberFormat() const;
+  int numberPrecision() const { return mNumberPrecision; }
+  double tickStep() const { return mTickStep; }
+  QVector<double> tickVector() const { return mTickVector; }
+  QVector<QString> tickVectorLabels() const { return mTickVectorLabels; }
+  int tickLengthIn() const;
+  int tickLengthOut() const;
+  int subTickCount() const { return mSubTickCount; }
+  int subTickLengthIn() const;
+  int subTickLengthOut() const;
+  QPen basePen() const { return mBasePen; }
+  QPen tickPen() const { return mTickPen; }
+  QPen subTickPen() const { return mSubTickPen; }
+  QFont labelFont() const { return mLabelFont; }
+  QColor labelColor() const { return mLabelColor; }
+  QString label() const { return mLabel; }
+  int labelPadding() const;
+  int padding() const { return mPadding; }
+  int offset() const;
+  SelectableParts selectedParts() const { return mSelectedParts; }
+  SelectableParts selectableParts() const { return mSelectableParts; }
+  QFont selectedTickLabelFont() const { return mSelectedTickLabelFont; }
+  QFont selectedLabelFont() const { return mSelectedLabelFont; }
+  QColor selectedTickLabelColor() const { return mSelectedTickLabelColor; }
+  QColor selectedLabelColor() const { return mSelectedLabelColor; }
+  QPen selectedBasePen() const { return mSelectedBasePen; }
+  QPen selectedTickPen() const { return mSelectedTickPen; }
+  QPen selectedSubTickPen() const { return mSelectedSubTickPen; }
+  QCPLineEnding lowerEnding() const;
+  QCPLineEnding upperEnding() const;
+  QCPGrid *grid() const { return mGrid; }
+  
+  // setters:
+  Q_SLOT void setScaleType(QCPAxis::ScaleType type);
+  void setScaleLogBase(double base);
+  Q_SLOT void setRange(const QCPRange &range);
+  void setRange(double lower, double upper);
+  void setRange(double position, double size, Qt::AlignmentFlag alignment);
+  void setRangeLower(double lower);
+  void setRangeUpper(double upper);
+  void setRangeReversed(bool reversed);
+  void setAutoTicks(bool on);
+  void setAutoTickCount(int approximateCount);
+  void setAutoTickLabels(bool on);
+  void setAutoTickStep(bool on);
+  void setAutoSubTicks(bool on);
+  void setTicks(bool show);
+  void setTickLabels(bool show);
+  void setTickLabelPadding(int padding);
+  void setTickLabelType(LabelType type);
+  void setTickLabelFont(const QFont &font);
+  void setTickLabelColor(const QColor &color);
+  void setTickLabelRotation(double degrees);
+  void setTickLabelSide(LabelSide side);
+  void setDateTimeFormat(const QString &format);
+  void setDateTimeSpec(const Qt::TimeSpec &timeSpec);
+  void setNumberFormat(const QString &formatCode);
+  void setNumberPrecision(int precision);
+  void setTickStep(double step);
+  void setTickVector(const QVector<double> &vec);
+  void setTickVectorLabels(const QVector<QString> &vec);
+  void setTickLength(int inside, int outside=0);
+  void setTickLengthIn(int inside);
+  void setTickLengthOut(int outside);
+  void setSubTickCount(int count);
+  void setSubTickLength(int inside, int outside=0);
+  void setSubTickLengthIn(int inside);
+  void setSubTickLengthOut(int outside);
+  void setBasePen(const QPen &pen);
+  void setTickPen(const QPen &pen);
+  void setSubTickPen(const QPen &pen);
+  void setLabelFont(const QFont &font);
+  void setLabelColor(const QColor &color);
+  void setLabel(const QString &str);
+  void setLabelPadding(int padding);
+  void setPadding(int padding);
+  void setOffset(int offset);
+  void setSelectedTickLabelFont(const QFont &font);
+  void setSelectedLabelFont(const QFont &font);
+  void setSelectedTickLabelColor(const QColor &color);
+  void setSelectedLabelColor(const QColor &color);
+  void setSelectedBasePen(const QPen &pen);
+  void setSelectedTickPen(const QPen &pen);
+  void setSelectedSubTickPen(const QPen &pen);
+  Q_SLOT void setSelectableParts(const QCPAxis::SelectableParts &selectableParts);
+  Q_SLOT void setSelectedParts(const QCPAxis::SelectableParts &selectedParts);
+  void setLowerEnding(const QCPLineEnding &ending);
+  void setUpperEnding(const QCPLineEnding &ending);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  // non-property methods:
+  Qt::Orientation orientation() const { return mOrientation; }
+  void moveRange(double diff);
+  void scaleRange(double factor, double center);
+  void setScaleRatio(const QCPAxis *otherAxis, double ratio=1.0);
+  void rescale(bool onlyVisiblePlottables=false);
+  double pixelToCoord(double value) const;
+  double coordToPixel(double value) const;
+  SelectablePart getPartAt(const QPointF &pos) const;
+  QList<QCPAbstractPlottable*> plottables() const;
+  QList<QCPGraph*> graphs() const;
+  QList<QCPAbstractItem*> items() const;
+  
+  static AxisType marginSideToAxisType(QCP::MarginSide side);
+  static Qt::Orientation orientation(AxisType type) { return type==atBottom||type==atTop ? Qt::Horizontal : Qt::Vertical; }
+  static AxisType opposite(AxisType type);
+  
+signals:
+  void ticksRequest();
+  void rangeChanged(const QCPRange &newRange);
+  void rangeChanged(const QCPRange &newRange, const QCPRange &oldRange);
+  void scaleTypeChanged(QCPAxis::ScaleType scaleType);
+  void selectionChanged(const QCPAxis::SelectableParts &parts);
+  void selectableChanged(const QCPAxis::SelectableParts &parts);
+
+protected:
+  // property members:
+  // axis base:
+  AxisType mAxisType;
+  QCPAxisRect *mAxisRect;
+  //int mOffset; // in QCPAxisPainter
+  int mPadding;
+  Qt::Orientation mOrientation;
+  SelectableParts mSelectableParts, mSelectedParts;
+  QPen mBasePen, mSelectedBasePen;
+  //QCPLineEnding mLowerEnding, mUpperEnding; // in QCPAxisPainter
+  // axis label:
+  //int mLabelPadding; // in QCPAxisPainter
+  QString mLabel;
+  QFont mLabelFont, mSelectedLabelFont;
+  QColor mLabelColor, mSelectedLabelColor;
+  // tick labels:
+  //int mTickLabelPadding; // in QCPAxisPainter
+  bool mTickLabels, mAutoTickLabels;
+  //double mTickLabelRotation; // in QCPAxisPainter
+  LabelType mTickLabelType;
+  QFont mTickLabelFont, mSelectedTickLabelFont;
+  QColor mTickLabelColor, mSelectedTickLabelColor;
+  QString mDateTimeFormat;
+  Qt::TimeSpec mDateTimeSpec;
+  int mNumberPrecision;
+  QLatin1Char mNumberFormatChar;
+  bool mNumberBeautifulPowers;
+  //bool mNumberMultiplyCross; // QCPAxisPainter
+  // ticks and subticks:
+  bool mTicks;
+  double mTickStep;
+  int mSubTickCount, mAutoTickCount;
+  bool mAutoTicks, mAutoTickStep, mAutoSubTicks;
+  //int mTickLengthIn, mTickLengthOut, mSubTickLengthIn, mSubTickLengthOut; // QCPAxisPainter
+  QPen mTickPen, mSelectedTickPen;
+  QPen mSubTickPen, mSelectedSubTickPen;
+  // scale and range:
+  QCPRange mRange;
+  bool mRangeReversed;
+  ScaleType mScaleType;
+  double mScaleLogBase, mScaleLogBaseLogInv;
+  
+  // non-property members:
+  QCPGrid *mGrid;
+  QCPAxisPainterPrivate *mAxisPainter;
+  int mLowestVisibleTick, mHighestVisibleTick;
+  QVector<double> mTickVector;
+  QVector<QString> mTickVectorLabels;
+  QVector<double> mSubTickVector;
+  bool mCachedMarginValid;
+  int mCachedMargin;
+  
+  // introduced virtual methods:
+  virtual void setupTickVectors();
+  virtual void generateAutoTicks();
+  virtual int calculateAutoSubTickCount(double tickStep) const;
+  virtual int calculateMargin();
+  
+  // reimplemented virtual methods:
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  virtual void draw(QCPPainter *painter);
+  virtual QCP::Interaction selectionCategory() const;
+  // events:
+  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
+  virtual void deselectEvent(bool *selectionStateChanged);
+  
+  // non-virtual methods:
+  void visibleTickBounds(int &lowIndex, int &highIndex) const;
+  double baseLog(double value) const;
+  double basePow(double value) const;
+  QPen getBasePen() const;
+  QPen getTickPen() const;
+  QPen getSubTickPen() const;
+  QFont getTickLabelFont() const;
+  QFont getLabelFont() const;
+  QColor getTickLabelColor() const;
+  QColor getLabelColor() const;
+  
+private:
+  Q_DISABLE_COPY(QCPAxis)
+  
+  friend class QCustomPlot;
+  friend class QCPGrid;
+  friend class QCPAxisRect;
+};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCPAxis::SelectableParts)
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCPAxis::AxisTypes)
+Q_DECLARE_METATYPE(QCPAxis::SelectablePart)
+
+
+class QCPAxisPainterPrivate
+{
+public:
+  explicit QCPAxisPainterPrivate(QCustomPlot *parentPlot);
+  virtual ~QCPAxisPainterPrivate();
+  
+  virtual void draw(QCPPainter *painter);
+  virtual int size() const;
+  void clearCache();
+  
+  QRect axisSelectionBox() const { return mAxisSelectionBox; }
+  QRect tickLabelsSelectionBox() const { return mTickLabelsSelectionBox; }
+  QRect labelSelectionBox() const { return mLabelSelectionBox; }
+  
+  // public property members:
+  QCPAxis::AxisType type;
+  QPen basePen;
+  QCPLineEnding lowerEnding, upperEnding; // directly accessed by QCPAxis setters/getters
+  int labelPadding; // directly accessed by QCPAxis setters/getters
+  QFont labelFont;
+  QColor labelColor;
+  QString label;
+  int tickLabelPadding; // directly accessed by QCPAxis setters/getters
+  double tickLabelRotation; // directly accessed by QCPAxis setters/getters
+  QCPAxis::LabelSide tickLabelSide; // directly accessed by QCPAxis setters/getters
+  bool substituteExponent;
+  bool numberMultiplyCross; // directly accessed by QCPAxis setters/getters
+  int tickLengthIn, tickLengthOut, subTickLengthIn, subTickLengthOut; // directly accessed by QCPAxis setters/getters
+  QPen tickPen, subTickPen;
+  QFont tickLabelFont;
+  QColor tickLabelColor;
+  QRect axisRect, viewportRect;
+  double offset; // directly accessed by QCPAxis setters/getters
+  bool abbreviateDecimalPowers;
+  bool reversedEndings;
+  
+  QVector<double> subTickPositions;
+  QVector<double> tickPositions;
+  QVector<QString> tickLabels;
+  
+protected:
+  struct CachedLabel
+  {
+    QPointF offset;
+    QPixmap pixmap;
+  };
+  struct TickLabelData
+  {
+    QString basePart, expPart;
+    QRect baseBounds, expBounds, totalBounds, rotatedTotalBounds;
+    QFont baseFont, expFont;
+  };
+  QCustomPlot *mParentPlot;
+  QByteArray mLabelParameterHash; // to determine whether mLabelCache needs to be cleared due to changed parameters
+  QCache<QString, CachedLabel> mLabelCache;
+  QRect mAxisSelectionBox, mTickLabelsSelectionBox, mLabelSelectionBox;
+  
+  virtual QByteArray generateLabelParameterHash() const;
+  
+  virtual void placeTickLabel(QCPPainter *painter, double position, int distanceToAxis, const QString &text, QSize *tickLabelsSize);
+  virtual void drawTickLabel(QCPPainter *painter, double x, double y, const TickLabelData &labelData) const;
+  virtual TickLabelData getTickLabelData(const QFont &font, const QString &text) const;
+  virtual QPointF getTickLabelDrawOffset(const TickLabelData &labelData) const;
+  virtual void getMaxTickLabelSize(const QFont &font, const QString &text, QSize *tickLabelsSize) const;
+};
+
+
+class QCP_LIB_DECL QCPAbstractPlottable : public QCPLayerable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QString name READ name WRITE setName)
+  Q_PROPERTY(bool antialiasedFill READ antialiasedFill WRITE setAntialiasedFill)
+  Q_PROPERTY(bool antialiasedScatters READ antialiasedScatters WRITE setAntialiasedScatters)
+  Q_PROPERTY(bool antialiasedErrorBars READ antialiasedErrorBars WRITE setAntialiasedErrorBars)
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(QBrush brush READ brush WRITE setBrush)
+  Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush)
+  Q_PROPERTY(QCPAxis* keyAxis READ keyAxis WRITE setKeyAxis)
+  Q_PROPERTY(QCPAxis* valueAxis READ valueAxis WRITE setValueAxis)
+  Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectableChanged)
+  Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectionChanged)
+  /// \endcond
+public:
+  QCPAbstractPlottable(QCPAxis *keyAxis, QCPAxis *valueAxis);
+  
+  // getters:
+  QString name() const { return mName; }
+  bool antialiasedFill() const { return mAntialiasedFill; }
+  bool antialiasedScatters() const { return mAntialiasedScatters; }
+  bool antialiasedErrorBars() const { return mAntialiasedErrorBars; }
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  QBrush brush() const { return mBrush; }
+  QBrush selectedBrush() const { return mSelectedBrush; }
+  QCPAxis *keyAxis() const { return mKeyAxis.data(); }
+  QCPAxis *valueAxis() const { return mValueAxis.data(); }
+  bool selectable() const { return mSelectable; }
+  bool selected() const { return mSelected; }
+  
+  // setters:
+  void setName(const QString &name);
+  void setAntialiasedFill(bool enabled);
+  void setAntialiasedScatters(bool enabled);
+  void setAntialiasedErrorBars(bool enabled);
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setBrush(const QBrush &brush);
+  void setSelectedBrush(const QBrush &brush);
+  void setKeyAxis(QCPAxis *axis);
+  void setValueAxis(QCPAxis *axis);
+  Q_SLOT void setSelectable(bool selectable);
+  Q_SLOT void setSelected(bool selected);
+
+  // introduced virtual methods:
+  virtual void clearData() = 0;
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const = 0;
+  virtual bool addToLegend();
+  virtual bool removeFromLegend() const;
+  
+  // non-property methods:
+  void rescaleAxes(bool onlyEnlarge=false) const;
+  void rescaleKeyAxis(bool onlyEnlarge=false) const;
+  void rescaleValueAxis(bool onlyEnlarge=false) const;
+  
+signals:
+  void selectionChanged(bool selected);
+  void selectableChanged(bool selectable);
+  
+protected:
+  /*!
+    Represents negative and positive sign domain for passing to \ref getKeyRange and \ref getValueRange.
+  */
+  enum SignDomain { sdNegative  ///< The negative sign domain, i.e. numbers smaller than zero
+                    ,sdBoth     ///< Both sign domains, including zero, i.e. all (rational) numbers
+                    ,sdPositive ///< The positive sign domain, i.e. numbers greater than zero
+                  };
+  
+  // property members:
+  QString mName;
+  bool mAntialiasedFill, mAntialiasedScatters, mAntialiasedErrorBars;
+  QPen mPen, mSelectedPen;
+  QBrush mBrush, mSelectedBrush;
+  QPointer<QCPAxis> mKeyAxis, mValueAxis;
+  bool mSelectable, mSelected;
+  
+  // reimplemented virtual methods:
+  virtual QRect clipRect() const;
+  virtual void draw(QCPPainter *painter) = 0;
+  virtual QCP::Interaction selectionCategory() const;
+  void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  // events:
+  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
+  virtual void deselectEvent(bool *selectionStateChanged);
+  
+  // introduced virtual methods:
+  virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const = 0;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const = 0;
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const = 0;
+  
+  // non-virtual methods:
+  void coordsToPixels(double key, double value, double &x, double &y) const;
+  const QPointF coordsToPixels(double key, double value) const;
+  void pixelsToCoords(double x, double y, double &key, double &value) const;
+  void pixelsToCoords(const QPointF &pixelPos, double &key, double &value) const;
+  QPen mainPen() const;
+  QBrush mainBrush() const;
+  void applyFillAntialiasingHint(QCPPainter *painter) const;
+  void applyScattersAntialiasingHint(QCPPainter *painter) const;
+  void applyErrorBarsAntialiasingHint(QCPPainter *painter) const;
+  double distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const;
+
+private:
+  Q_DISABLE_COPY(QCPAbstractPlottable)
+  
+  friend class QCustomPlot;
+  friend class QCPAxis;
+  friend class QCPPlottableLegendItem;
+};
+
+
+class QCP_LIB_DECL QCPItemAnchor
+{
+public:
+  QCPItemAnchor(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name, int anchorId=-1);
+  virtual ~QCPItemAnchor();
+  
+  // getters:
+  QString name() const { return mName; }
+  virtual QPointF pixelPoint() const;
+  
+protected:
+  // property members:
+  QString mName;
+  
+  // non-property members:
+  QCustomPlot *mParentPlot;
+  QCPAbstractItem *mParentItem;
+  int mAnchorId;
+  QSet<QCPItemPosition*> mChildrenX, mChildrenY;
+  
+  // introduced virtual methods:
+  virtual QCPItemPosition *toQCPItemPosition() { return 0; }
+  
+  // non-virtual methods:
+  void addChildX(QCPItemPosition* pos); // called from pos when this anchor is set as parent
+  void removeChildX(QCPItemPosition *pos); // called from pos when its parent anchor is reset or pos deleted
+  void addChildY(QCPItemPosition* pos); // called from pos when this anchor is set as parent
+  void removeChildY(QCPItemPosition *pos); // called from pos when its parent anchor is reset or pos deleted
+  
+private:
+  Q_DISABLE_COPY(QCPItemAnchor)
+  
+  friend class QCPItemPosition;
+};
+
+
+
+class QCP_LIB_DECL QCPItemPosition : public QCPItemAnchor
+{
+public:
+  /*!
+    Defines the ways an item position can be specified. Thus it defines what the numbers passed to
+    \ref setCoords actually mean.
+    
+    \see setType
+  */
+  enum PositionType { ptAbsolute        ///< Static positioning in pixels, starting from the top left corner of the viewport/widget.
+                      ,ptViewportRatio  ///< Static positioning given by a fraction of the viewport size. For example, if you call setCoords(0, 0), the position will be at the top
+                                        ///< left corner of the viewport/widget. setCoords(1, 1) will be at the bottom right corner, setCoords(0.5, 0) will be horizontally centered and
+                                        ///< vertically at the top of the viewport/widget, etc.
+                      ,ptAxisRectRatio  ///< Static positioning given by a fraction of the axis rect size (see \ref setAxisRect). For example, if you call setCoords(0, 0), the position will be at the top
+                                        ///< left corner of the axis rect. setCoords(1, 1) will be at the bottom right corner, setCoords(0.5, 0) will be horizontally centered and
+                                        ///< vertically at the top of the axis rect, etc. You can also go beyond the axis rect by providing negative coordinates or coordinates larger than 1.
+                      ,ptPlotCoords     ///< Dynamic positioning at a plot coordinate defined by two axes (see \ref setAxes).
+                    };
+  
+  QCPItemPosition(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name);
+  virtual ~QCPItemPosition();
+  
+  // getters:
+  PositionType type() const { return typeX(); }
+  PositionType typeX() const { return mPositionTypeX; }
+  PositionType typeY() const { return mPositionTypeY; }
+  QCPItemAnchor *parentAnchor() const { return parentAnchorX(); }
+  QCPItemAnchor *parentAnchorX() const { return mParentAnchorX; }
+  QCPItemAnchor *parentAnchorY() const { return mParentAnchorY; }
+  double key() const { return mKey; }
+  double value() const { return mValue; }
+  QPointF coords() const { return QPointF(mKey, mValue); }
+  QCPAxis *keyAxis() const { return mKeyAxis.data(); }
+  QCPAxis *valueAxis() const { return mValueAxis.data(); }
+  QCPAxisRect *axisRect() const;
+  virtual QPointF pixelPoint() const;
+  
+  // setters:
+  void setType(PositionType type);
+  void setTypeX(PositionType type);
+  void setTypeY(PositionType type);
+  bool setParentAnchor(QCPItemAnchor *parentAnchor, bool keepPixelPosition=false);
+  bool setParentAnchorX(QCPItemAnchor *parentAnchor, bool keepPixelPosition=false);
+  bool setParentAnchorY(QCPItemAnchor *parentAnchor, bool keepPixelPosition=false);
+  void setCoords(double key, double value);
+  void setCoords(const QPointF &coords);
+  void setAxes(QCPAxis* keyAxis, QCPAxis* valueAxis);
+  void setAxisRect(QCPAxisRect *axisRect);
+  void setPixelPoint(const QPointF &pixelPoint);
+  
+protected:
+  // property members:
+  PositionType mPositionTypeX, mPositionTypeY;
+  QPointer<QCPAxis> mKeyAxis, mValueAxis;
+  QPointer<QCPAxisRect> mAxisRect;
+  double mKey, mValue;
+  QCPItemAnchor *mParentAnchorX, *mParentAnchorY;
+  
+  // reimplemented virtual methods:
+  virtual QCPItemPosition *toQCPItemPosition() { return this; }
+  
+private:
+  Q_DISABLE_COPY(QCPItemPosition)
+  
+};
+
+
+class QCP_LIB_DECL QCPAbstractItem : public QCPLayerable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(bool clipToAxisRect READ clipToAxisRect WRITE setClipToAxisRect)
+  Q_PROPERTY(QCPAxisRect* clipAxisRect READ clipAxisRect WRITE setClipAxisRect)
+  Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectableChanged)
+  Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectionChanged)
+  /// \endcond
+public:
+  QCPAbstractItem(QCustomPlot *parentPlot);
+  virtual ~QCPAbstractItem();
+  
+  // getters:
+  bool clipToAxisRect() const { return mClipToAxisRect; }
+  QCPAxisRect *clipAxisRect() const;
+  bool selectable() const { return mSelectable; }
+  bool selected() const { return mSelected; }
+  
+  // setters:
+  void setClipToAxisRect(bool clip);
+  void setClipAxisRect(QCPAxisRect *rect);
+  Q_SLOT void setSelectable(bool selectable);
+  Q_SLOT void setSelected(bool selected);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const = 0;
+  
+  // non-virtual methods:
+  QList<QCPItemPosition*> positions() const { return mPositions; }
+  QList<QCPItemAnchor*> anchors() const { return mAnchors; }
+  QCPItemPosition *position(const QString &name) const;
+  QCPItemAnchor *anchor(const QString &name) const;
+  bool hasAnchor(const QString &name) const;
+  
+signals:
+  void selectionChanged(bool selected);
+  void selectableChanged(bool selectable);
+  
+protected:
+  // property members:
+  bool mClipToAxisRect;
+  QPointer<QCPAxisRect> mClipAxisRect;
+  QList<QCPItemPosition*> mPositions;
+  QList<QCPItemAnchor*> mAnchors;
+  bool mSelectable, mSelected;
+  
+  // reimplemented virtual methods:
+  virtual QCP::Interaction selectionCategory() const;
+  virtual QRect clipRect() const;
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  virtual void draw(QCPPainter *painter) = 0;
+  // events:
+  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
+  virtual void deselectEvent(bool *selectionStateChanged);
+  
+  // introduced virtual methods:
+  virtual QPointF anchorPixelPoint(int anchorId) const;
+  
+  // non-virtual methods:
+  double distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const;
+  double rectSelectTest(const QRectF &rect, const QPointF &pos, bool filledRect) const;
+  QCPItemPosition *createPosition(const QString &name);
+  QCPItemAnchor *createAnchor(const QString &name, int anchorId);
+  
+private:
+  Q_DISABLE_COPY(QCPAbstractItem)
+  
+  friend class QCustomPlot;
+  friend class QCPItemAnchor;
+};
+
+
+class QCP_LIB_DECL QCustomPlot : public QWidget
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QRect viewport READ viewport WRITE setViewport)
+  Q_PROPERTY(QPixmap background READ background WRITE setBackground)
+  Q_PROPERTY(bool backgroundScaled READ backgroundScaled WRITE setBackgroundScaled)
+  Q_PROPERTY(Qt::AspectRatioMode backgroundScaledMode READ backgroundScaledMode WRITE setBackgroundScaledMode)
+  Q_PROPERTY(QCPLayoutGrid* plotLayout READ plotLayout)
+  Q_PROPERTY(bool autoAddPlottableToLegend READ autoAddPlottableToLegend WRITE setAutoAddPlottableToLegend)
+  Q_PROPERTY(int selectionTolerance READ selectionTolerance WRITE setSelectionTolerance)
+  Q_PROPERTY(bool noAntialiasingOnDrag READ noAntialiasingOnDrag WRITE setNoAntialiasingOnDrag)
+  Q_PROPERTY(Qt::KeyboardModifier multiSelectModifier READ multiSelectModifier WRITE setMultiSelectModifier)
+  /// \endcond
+public:
+  /*!
+    Defines how a layer should be inserted relative to an other layer.
+
+    \see addLayer, moveLayer
+  */
+  enum LayerInsertMode { limBelow  ///< Layer is inserted below other layer
+                         ,limAbove ///< Layer is inserted above other layer
+                       };
+  Q_ENUMS(LayerInsertMode)
+  
+  /*!
+    Defines with what timing the QCustomPlot surface is refreshed after a replot.
+
+    \see replot
+  */
+  enum RefreshPriority { rpImmediate ///< The QCustomPlot surface is immediately refreshed, by calling QWidget::repaint() after the replot
+                         ,rpQueued   ///< Queues the refresh such that it is performed at a slightly delayed point in time after the replot, by calling QWidget::update() after the replot
+                         ,rpHint     ///< Whether to use immediate repaint or queued update depends on whether the plotting hint \ref QCP::phForceRepaint is set, see \ref setPlottingHints.
+                       };
+  
+  explicit QCustomPlot(QWidget *parent = 0);
+  virtual ~QCustomPlot();
+  
+  // getters:
+  QRect viewport() const { return mViewport; }
+  QPixmap background() const { return mBackgroundPixmap; }
+  bool backgroundScaled() const { return mBackgroundScaled; }
+  Qt::AspectRatioMode backgroundScaledMode() const { return mBackgroundScaledMode; }
+  QCPLayoutGrid *plotLayout() const { return mPlotLayout; }
+  QCP::AntialiasedElements antialiasedElements() const { return mAntialiasedElements; }
+  QCP::AntialiasedElements notAntialiasedElements() const { return mNotAntialiasedElements; }
+  bool autoAddPlottableToLegend() const { return mAutoAddPlottableToLegend; }
+  const QCP::Interactions interactions() const { return mInteractions; }
+  int selectionTolerance() const { return mSelectionTolerance; }
+  bool noAntialiasingOnDrag() const { return mNoAntialiasingOnDrag; }
+  QCP::PlottingHints plottingHints() const { return mPlottingHints; }
+  Qt::KeyboardModifier multiSelectModifier() const { return mMultiSelectModifier; }
+
+  // setters:
+  void setViewport(const QRect &rect);
+  void setBackground(const QPixmap &pm);
+  void setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode=Qt::KeepAspectRatioByExpanding);
+  void setBackground(const QBrush &brush);
+  void setBackgroundScaled(bool scaled);
+  void setBackgroundScaledMode(Qt::AspectRatioMode mode);
+  void setAntialiasedElements(const QCP::AntialiasedElements &antialiasedElements);
+  void setAntialiasedElement(QCP::AntialiasedElement antialiasedElement, bool enabled=true);
+  void setNotAntialiasedElements(const QCP::AntialiasedElements &notAntialiasedElements);
+  void setNotAntialiasedElement(QCP::AntialiasedElement notAntialiasedElement, bool enabled=true);
+  void setAutoAddPlottableToLegend(bool on);
+  void setInteractions(const QCP::Interactions &interactions);
+  void setInteraction(const QCP::Interaction &interaction, bool enabled=true);
+  void setSelectionTolerance(int pixels);
+  void setNoAntialiasingOnDrag(bool enabled);
+  void setPlottingHints(const QCP::PlottingHints &hints);
+  void setPlottingHint(QCP::PlottingHint hint, bool enabled=true);
+  void setMultiSelectModifier(Qt::KeyboardModifier modifier);
+  
+  // non-property methods:
+  // plottable interface:
+  QCPAbstractPlottable *plottable(int index);
+  QCPAbstractPlottable *plottable();
+  bool addPlottable(QCPAbstractPlottable *plottable);
+  bool removePlottable(QCPAbstractPlottable *plottable);
+  bool removePlottable(int index);
+  int clearPlottables();
+  int plottableCount() const;
+  QList<QCPAbstractPlottable*> selectedPlottables() const;
+  QCPAbstractPlottable *plottableAt(const QPointF &pos, bool onlySelectable=false) const;
+  bool hasPlottable(QCPAbstractPlottable *plottable) const;
+ 
+  // specialized interface for QCPGraph:
+  QCPGraph *graph(int index) const;
+  QCPGraph *graph() const;
+  QCPGraph *addGraph(QCPAxis *keyAxis=0, QCPAxis *valueAxis=0);
+  bool removeGraph(QCPGraph *graph);
+  bool removeGraph(int index);
+  int clearGraphs();
+  int graphCount() const;
+  QList<QCPGraph*> selectedGraphs() const;
+
+  // item interface:
+  QCPAbstractItem *item(int index) const;
+  QCPAbstractItem *item() const;
+  bool addItem(QCPAbstractItem* item);
+  bool removeItem(QCPAbstractItem *item);
+  bool removeItem(int index);
+  int clearItems();
+  int itemCount() const;
+  QList<QCPAbstractItem*> selectedItems() const;
+  QCPAbstractItem *itemAt(const QPointF &pos, bool onlySelectable=false) const;
+  bool hasItem(QCPAbstractItem *item) const;
+  
+  // layer interface:
+  QCPLayer *layer(const QString &name) const;
+  QCPLayer *layer(int index) const;
+  QCPLayer *currentLayer() const;
+  bool setCurrentLayer(const QString &name);
+  bool setCurrentLayer(QCPLayer *layer);
+  int layerCount() const;
+  bool addLayer(const QString &name, QCPLayer *otherLayer=0, LayerInsertMode insertMode=limAbove);
+  bool removeLayer(QCPLayer *layer);
+  bool moveLayer(QCPLayer *layer, QCPLayer *otherLayer, LayerInsertMode insertMode=limAbove);
+  
+  // axis rect/layout interface:
+  int axisRectCount() const;
+  QCPAxisRect* axisRect(int index=0) const;
+  QList<QCPAxisRect*> axisRects() const;
+  QCPLayoutElement* layoutElementAt(const QPointF &pos) const;
+  Q_SLOT void rescaleAxes(bool onlyVisiblePlottables=false);
+  
+  QList<QCPAxis*> selectedAxes() const;
+  QList<QCPLegend*> selectedLegends() const;
+  Q_SLOT void deselectAll();
+  
+  bool savePdf(const QString &fileName, bool noCosmeticPen=false, int width=0, int height=0, const QString &pdfCreator=QString(), const QString &pdfTitle=QString());
+  bool savePng(const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1);
+  bool saveJpg(const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1);
+  bool saveBmp(const QString &fileName, int width=0, int height=0, double scale=1.0);
+  bool saveRastered(const QString &fileName, int width, int height, double scale, const char *format, int quality=-1);
+  QPixmap toPixmap(int width=0, int height=0, double scale=1.0);
+  void toPainter(QCPPainter *painter, int width=0, int height=0);
+  Q_SLOT void replot(QCustomPlot::RefreshPriority refreshPriority=QCustomPlot::rpHint);
+  
+  QCPAxis *xAxis, *yAxis, *xAxis2, *yAxis2;
+  QCPLegend *legend;
+  
+signals:
+  void mouseDoubleClick(QMouseEvent *event);
+  void mousePress(QMouseEvent *event);
+  void mouseMove(QMouseEvent *event);
+  void mouseRelease(QMouseEvent *event);
+  void mouseWheel(QWheelEvent *event);
+  
+  void plottableClick(QCPAbstractPlottable *plottable, QMouseEvent *event);
+  void plottableDoubleClick(QCPAbstractPlottable *plottable, QMouseEvent *event);
+  void itemClick(QCPAbstractItem *item, QMouseEvent *event);
+  void itemDoubleClick(QCPAbstractItem *item, QMouseEvent *event);
+  void axisClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event);
+  void axisDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event);
+  void legendClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event);
+  void legendDoubleClick(QCPLegend *legend,  QCPAbstractLegendItem *item, QMouseEvent *event);
+  void titleClick(QMouseEvent *event, QCPPlotTitle *title);
+  void titleDoubleClick(QMouseEvent *event, QCPPlotTitle *title);
+  
+  void selectionChangedByUser();
+  void beforeReplot();
+  void afterReplot();
+  
+protected:
+  // property members:
+  QRect mViewport;
+  QCPLayoutGrid *mPlotLayout;
+  bool mAutoAddPlottableToLegend;
+  QList<QCPAbstractPlottable*> mPlottables;
+  QList<QCPGraph*> mGraphs; // extra list of plottables also in mPlottables that are of type QCPGraph
+  QList<QCPAbstractItem*> mItems;
+  QList<QCPLayer*> mLayers;
+  QCP::AntialiasedElements mAntialiasedElements, mNotAntialiasedElements;
+  QCP::Interactions mInteractions;
+  int mSelectionTolerance;
+  bool mNoAntialiasingOnDrag;
+  QBrush mBackgroundBrush;
+  QPixmap mBackgroundPixmap;
+  QPixmap mScaledBackgroundPixmap;
+  bool mBackgroundScaled;
+  Qt::AspectRatioMode mBackgroundScaledMode;
+  QCPLayer *mCurrentLayer;
+  QCP::PlottingHints mPlottingHints;
+  Qt::KeyboardModifier mMultiSelectModifier;
+  
+  // non-property members:
+  QPixmap mPaintBuffer;
+  QPoint mMousePressPos;
+  QPointer<QCPLayoutElement> mMouseEventElement;
+  bool mReplotting;
+  
+  // reimplemented virtual methods:
+  virtual QSize minimumSizeHint() const;
+  virtual QSize sizeHint() const;
+  virtual void paintEvent(QPaintEvent *event);
+  virtual void resizeEvent(QResizeEvent *event);
+  virtual void mouseDoubleClickEvent(QMouseEvent *event);
+  virtual void mousePressEvent(QMouseEvent *event);
+  virtual void mouseMoveEvent(QMouseEvent *event);
+  virtual void mouseReleaseEvent(QMouseEvent *event);
+  virtual void wheelEvent(QWheelEvent *event);
+  
+  // introduced virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual void axisRemoved(QCPAxis *axis);
+  virtual void legendRemoved(QCPLegend *legend);
+  
+  // non-virtual methods:
+  void updateLayerIndices() const;
+  QCPLayerable *layerableAt(const QPointF &pos, bool onlySelectable, QVariant *selectionDetails=0) const;
+  void drawBackground(QCPPainter *painter);
+  
+  friend class QCPLegend;
+  friend class QCPAxis;
+  friend class QCPLayer;
+  friend class QCPAxisRect;
+};
+
+
+class QCP_LIB_DECL QCPColorGradient
+{
+  Q_GADGET
+public:
+  /*!
+    Defines the color spaces in which color interpolation between gradient stops can be performed.
+    
+    \see setColorInterpolation
+  */
+  enum ColorInterpolation { ciRGB  ///< Color channels red, green and blue are linearly interpolated
+                            ,ciHSV ///< Color channels hue, saturation and value are linearly interpolated (The hue is interpolated over the shortest angle distance)
+                          };
+  Q_ENUMS(ColorInterpolation)
+  
+  /*!
+    Defines the available presets that can be loaded with \ref loadPreset. See the documentation
+    there for an image of the presets.
+  */
+  enum GradientPreset { gpGrayscale  ///< Continuous lightness from black to white (suited for non-biased data representation)
+                        ,gpHot       ///< Continuous lightness from black over firey colors to white (suited for non-biased data representation)
+                        ,gpCold      ///< Continuous lightness from black over icey colors to white (suited for non-biased data representation)
+                        ,gpNight     ///< Continuous lightness from black over weak blueish colors to white (suited for non-biased data representation)
+                        ,gpCandy     ///< Blue over pink to white
+                        ,gpGeography ///< Colors suitable to represent different elevations on geographical maps
+                        ,gpIon       ///< Half hue spectrum from black over purple to blue and finally green (creates banding illusion but allows more precise magnitude estimates)
+                        ,gpThermal   ///< Colors suitable for thermal imaging, ranging from dark blue over purple to orange, yellow and white
+                        ,gpPolar     ///< Colors suitable to emphasize polarity around the center, with blue for negative, black in the middle and red for positive values
+                        ,gpSpectrum  ///< An approximation of the visible light spectrum (creates banding illusion but allows more precise magnitude estimates)
+                        ,gpJet       ///< Hue variation similar to a spectrum, often used in numerical visualization (creates banding illusion but allows more precise magnitude estimates)
+                        ,gpHues      ///< Full hue cycle, with highest and lowest color red (suitable for periodic data, such as angles and phases, see \ref setPeriodic)
+                      };
+  Q_ENUMS(GradientPreset)
+  
+  QCPColorGradient(GradientPreset preset=gpCold);
+  bool operator==(const QCPColorGradient &other) const;
+  bool operator!=(const QCPColorGradient &other) const { return !(*this == other); }
+  
+  // getters:
+  int levelCount() const { return mLevelCount; }
+  QMap<double, QColor> colorStops() const { return mColorStops; }
+  ColorInterpolation colorInterpolation() const { return mColorInterpolation; }
+  bool periodic() const { return mPeriodic; }
+  
+  // setters:
+  void setLevelCount(int n);
+  void setColorStops(const QMap<double, QColor> &colorStops);
+  void setColorStopAt(double position, const QColor &color);
+  void setColorInterpolation(ColorInterpolation interpolation);
+  void setPeriodic(bool enabled);
+  
+  // non-property methods:
+  void colorize(const double *data, const QCPRange &range, QRgb *scanLine, int n, int dataIndexFactor=1, bool logarithmic=false);
+  QRgb color(double position, const QCPRange &range, bool logarithmic=false);
+  void loadPreset(GradientPreset preset);
+  void clearColorStops();
+  QCPColorGradient inverted() const;
+  
+protected:
+  void updateColorBuffer();
+  
+  // property members:
+  int mLevelCount;
+  QMap<double, QColor> mColorStops;
+  ColorInterpolation mColorInterpolation;
+  bool mPeriodic;
+  
+  // non-property members:
+  QVector<QRgb> mColorBuffer;
+  bool mColorBufferInvalidated;
+};
+
+
+class QCP_LIB_DECL QCPAxisRect : public QCPLayoutElement
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPixmap background READ background WRITE setBackground)
+  Q_PROPERTY(bool backgroundScaled READ backgroundScaled WRITE setBackgroundScaled)
+  Q_PROPERTY(Qt::AspectRatioMode backgroundScaledMode READ backgroundScaledMode WRITE setBackgroundScaledMode)
+  Q_PROPERTY(Qt::Orientations rangeDrag READ rangeDrag WRITE setRangeDrag)
+  Q_PROPERTY(Qt::Orientations rangeZoom READ rangeZoom WRITE setRangeZoom)
+  /// \endcond
+public:
+  explicit QCPAxisRect(QCustomPlot *parentPlot, bool setupDefaultAxes=true);
+  virtual ~QCPAxisRect();
+  
+  // getters:
+  QPixmap background() const { return mBackgroundPixmap; }
+  bool backgroundScaled() const { return mBackgroundScaled; }
+  Qt::AspectRatioMode backgroundScaledMode() const { return mBackgroundScaledMode; }
+  Qt::Orientations rangeDrag() const { return mRangeDrag; }
+  Qt::Orientations rangeZoom() const { return mRangeZoom; }
+  QCPAxis *rangeDragAxis(Qt::Orientation orientation);
+  QCPAxis *rangeZoomAxis(Qt::Orientation orientation);
+  double rangeZoomFactor(Qt::Orientation orientation);
+  
+  // setters:
+  void setBackground(const QPixmap &pm);
+  void setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode=Qt::KeepAspectRatioByExpanding);
+  void setBackground(const QBrush &brush);
+  void setBackgroundScaled(bool scaled);
+  void setBackgroundScaledMode(Qt::AspectRatioMode mode);
+  void setRangeDrag(Qt::Orientations orientations);
+  void setRangeZoom(Qt::Orientations orientations);
+  void setRangeDragAxes(QCPAxis *horizontal, QCPAxis *vertical);
+  void setRangeZoomAxes(QCPAxis *horizontal, QCPAxis *vertical);
+  void setRangeZoomFactor(double horizontalFactor, double verticalFactor);
+  void setRangeZoomFactor(double factor);
+  
+  // non-property methods:
+  int axisCount(QCPAxis::AxisType type) const;
+  QCPAxis *axis(QCPAxis::AxisType type, int index=0) const;
+  QList<QCPAxis*> axes(QCPAxis::AxisTypes types) const;
+  QList<QCPAxis*> axes() const;
+  QCPAxis *addAxis(QCPAxis::AxisType type, QCPAxis *axis=0);
+  QList<QCPAxis*> addAxes(QCPAxis::AxisTypes types);
+  bool removeAxis(QCPAxis *axis);
+  QCPLayoutInset *insetLayout() const { return mInsetLayout; }
+  
+  void setupFullAxesBox(bool connectRanges=false);
+  QList<QCPAbstractPlottable*> plottables() const;
+  QList<QCPGraph*> graphs() const;
+  QList<QCPAbstractItem*> items() const;
+  
+  // read-only interface imitating a QRect:
+  int left() const { return mRect.left(); }
+  int right() const { return mRect.right(); }
+  int top() const { return mRect.top(); }
+  int bottom() const { return mRect.bottom(); }
+  int width() const { return mRect.width(); }
+  int height() const { return mRect.height(); }
+  QSize size() const { return mRect.size(); }
+  QPoint topLeft() const { return mRect.topLeft(); }
+  QPoint topRight() const { return mRect.topRight(); }
+  QPoint bottomLeft() const { return mRect.bottomLeft(); }
+  QPoint bottomRight() const { return mRect.bottomRight(); }
+  QPoint center() const { return mRect.center(); }
+  
+  // reimplemented virtual methods:
+  virtual void update(UpdatePhase phase);
+  virtual QList<QCPLayoutElement*> elements(bool recursive) const;
+
+protected:
+  // property members:
+  QBrush mBackgroundBrush;
+  QPixmap mBackgroundPixmap;
+  QPixmap mScaledBackgroundPixmap;
+  bool mBackgroundScaled;
+  Qt::AspectRatioMode mBackgroundScaledMode;
+  QCPLayoutInset *mInsetLayout;
+  Qt::Orientations mRangeDrag, mRangeZoom;
+  QPointer<QCPAxis> mRangeDragHorzAxis, mRangeDragVertAxis, mRangeZoomHorzAxis, mRangeZoomVertAxis;
+  double mRangeZoomFactorHorz, mRangeZoomFactorVert;
+  // non-property members:
+  QCPRange mDragStartHorzRange, mDragStartVertRange;
+  QCP::AntialiasedElements mAADragBackup, mNotAADragBackup;
+  QPoint mDragStart;
+  bool mDragging;
+  QHash<QCPAxis::AxisType, QList<QCPAxis*> > mAxes;
+  
+  // reimplemented virtual methods:
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  virtual void draw(QCPPainter *painter);
+  virtual int calculateAutoMargin(QCP::MarginSide side);
+  // events:
+  virtual void mousePressEvent(QMouseEvent *event);
+  virtual void mouseMoveEvent(QMouseEvent *event);
+  virtual void mouseReleaseEvent(QMouseEvent *event);
+  virtual void wheelEvent(QWheelEvent *event);
+  
+  // non-property methods:
+  void drawBackground(QCPPainter *painter);
+  void updateAxesOffset(QCPAxis::AxisType type);
+  
+private:
+  Q_DISABLE_COPY(QCPAxisRect)
+  
+  friend class QCustomPlot;
+};
+
+
+class QCP_LIB_DECL QCPAbstractLegendItem : public QCPLayoutElement
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QCPLegend* parentLegend READ parentLegend)
+  Q_PROPERTY(QFont font READ font WRITE setFont)
+  Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor)
+  Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont)
+  Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor)
+  Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectionChanged)
+  Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectableChanged)
+  /// \endcond
+public:
+  explicit QCPAbstractLegendItem(QCPLegend *parent);
+  
+  // getters:
+  QCPLegend *parentLegend() const { return mParentLegend; }
+  QFont font() const { return mFont; }
+  QColor textColor() const { return mTextColor; }
+  QFont selectedFont() const { return mSelectedFont; }
+  QColor selectedTextColor() const { return mSelectedTextColor; }
+  bool selectable() const { return mSelectable; }
+  bool selected() const { return mSelected; }
+  
+  // setters:
+  void setFont(const QFont &font);
+  void setTextColor(const QColor &color);
+  void setSelectedFont(const QFont &font);
+  void setSelectedTextColor(const QColor &color);
+  Q_SLOT void setSelectable(bool selectable);
+  Q_SLOT void setSelected(bool selected);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+signals:
+  void selectionChanged(bool selected);
+  void selectableChanged(bool selectable);
+  
+protected:
+  // property members:
+  QCPLegend *mParentLegend;
+  QFont mFont;
+  QColor mTextColor;
+  QFont mSelectedFont;
+  QColor mSelectedTextColor;
+  bool mSelectable, mSelected;
+  
+  // reimplemented virtual methods:
+  virtual QCP::Interaction selectionCategory() const;
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  virtual QRect clipRect() const;
+  virtual void draw(QCPPainter *painter) = 0;
+  // events:
+  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
+  virtual void deselectEvent(bool *selectionStateChanged);
+  
+private:
+  Q_DISABLE_COPY(QCPAbstractLegendItem)
+  
+  friend class QCPLegend;
+};
+
+
+class QCP_LIB_DECL QCPPlottableLegendItem : public QCPAbstractLegendItem
+{
+  Q_OBJECT
+public:
+  QCPPlottableLegendItem(QCPLegend *parent, QCPAbstractPlottable *plottable);
+  
+  // getters:
+  QCPAbstractPlottable *plottable() { return mPlottable; }
+  
+protected:
+  // property members:
+  QCPAbstractPlottable *mPlottable;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual QSize minimumSizeHint() const;
+  
+  // non-virtual methods:
+  QPen getIconBorderPen() const;
+  QColor getTextColor() const;
+  QFont getFont() const;
+};
+
+
+class QCP_LIB_DECL QCPLegend : public QCPLayoutGrid
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen borderPen READ borderPen WRITE setBorderPen)
+  Q_PROPERTY(QBrush brush READ brush WRITE setBrush)
+  Q_PROPERTY(QFont font READ font WRITE setFont)
+  Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor)
+  Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize)
+  Q_PROPERTY(int iconTextPadding READ iconTextPadding WRITE setIconTextPadding)
+  Q_PROPERTY(QPen iconBorderPen READ iconBorderPen WRITE setIconBorderPen)
+  Q_PROPERTY(SelectableParts selectableParts READ selectableParts WRITE setSelectableParts NOTIFY selectionChanged)
+  Q_PROPERTY(SelectableParts selectedParts READ selectedParts WRITE setSelectedParts NOTIFY selectableChanged)
+  Q_PROPERTY(QPen selectedBorderPen READ selectedBorderPen WRITE setSelectedBorderPen)
+  Q_PROPERTY(QPen selectedIconBorderPen READ selectedIconBorderPen WRITE setSelectedIconBorderPen)
+  Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush)
+  Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont)
+  Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor)
+  /// \endcond
+public:
+  /*!
+    Defines the selectable parts of a legend
+    
+    \see setSelectedParts, setSelectableParts
+  */
+  enum SelectablePart { spNone       = 0x000  ///< <tt>0x000</tt> None
+                        ,spLegendBox  = 0x001 ///< <tt>0x001</tt> The legend box (frame)
+                        ,spItems      = 0x002 ///< <tt>0x002</tt> Legend items individually (see \ref selectedItems)
+                      };
+  Q_FLAGS(SelectablePart SelectableParts)
+  Q_DECLARE_FLAGS(SelectableParts, SelectablePart)
+  
+  explicit QCPLegend();
+  virtual ~QCPLegend();
+  
+  // getters:
+  QPen borderPen() const { return mBorderPen; }
+  QBrush brush() const { return mBrush; }
+  QFont font() const { return mFont; }
+  QColor textColor() const { return mTextColor; }
+  QSize iconSize() const { return mIconSize; }
+  int iconTextPadding() const { return mIconTextPadding; }
+  QPen iconBorderPen() const { return mIconBorderPen; }
+  SelectableParts selectableParts() const { return mSelectableParts; }
+  SelectableParts selectedParts() const;
+  QPen selectedBorderPen() const { return mSelectedBorderPen; }
+  QPen selectedIconBorderPen() const { return mSelectedIconBorderPen; }
+  QBrush selectedBrush() const { return mSelectedBrush; }
+  QFont selectedFont() const { return mSelectedFont; }
+  QColor selectedTextColor() const { return mSelectedTextColor; }
+  
+  // setters:
+  void setBorderPen(const QPen &pen);
+  void setBrush(const QBrush &brush);
+  void setFont(const QFont &font);
+  void setTextColor(const QColor &color);
+  void setIconSize(const QSize &size);
+  void setIconSize(int width, int height);
+  void setIconTextPadding(int padding);
+  void setIconBorderPen(const QPen &pen);
+  Q_SLOT void setSelectableParts(const SelectableParts &selectableParts);
+  Q_SLOT void setSelectedParts(const SelectableParts &selectedParts);
+  void setSelectedBorderPen(const QPen &pen);
+  void setSelectedIconBorderPen(const QPen &pen);
+  void setSelectedBrush(const QBrush &brush);
+  void setSelectedFont(const QFont &font);
+  void setSelectedTextColor(const QColor &color);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  // non-virtual methods:
+  QCPAbstractLegendItem *item(int index) const;
+  QCPPlottableLegendItem *itemWithPlottable(const QCPAbstractPlottable *plottable) const;
+  int itemCount() const;
+  bool hasItem(QCPAbstractLegendItem *item) const;
+  bool hasItemWithPlottable(const QCPAbstractPlottable *plottable) const;
+  bool addItem(QCPAbstractLegendItem *item);
+  bool removeItem(int index);
+  bool removeItem(QCPAbstractLegendItem *item);
+  void clearItems();
+  QList<QCPAbstractLegendItem*> selectedItems() const;
+  
+signals:
+  void selectionChanged(QCPLegend::SelectableParts parts);
+  void selectableChanged(QCPLegend::SelectableParts parts);
+  
+protected:
+  // property members:
+  QPen mBorderPen, mIconBorderPen;
+  QBrush mBrush;
+  QFont mFont;
+  QColor mTextColor;
+  QSize mIconSize;
+  int mIconTextPadding;
+  SelectableParts mSelectedParts, mSelectableParts;
+  QPen mSelectedBorderPen, mSelectedIconBorderPen;
+  QBrush mSelectedBrush;
+  QFont mSelectedFont;
+  QColor mSelectedTextColor;
+  
+  // reimplemented virtual methods:
+  virtual void parentPlotInitialized(QCustomPlot *parentPlot);
+  virtual QCP::Interaction selectionCategory() const;
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  virtual void draw(QCPPainter *painter);
+  // events:
+  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
+  virtual void deselectEvent(bool *selectionStateChanged);
+  
+  // non-virtual methods:
+  QPen getBorderPen() const;
+  QBrush getBrush() const;
+  
+private:
+  Q_DISABLE_COPY(QCPLegend)
+  
+  friend class QCustomPlot;
+  friend class QCPAbstractLegendItem;
+};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QCPLegend::SelectableParts)
+Q_DECLARE_METATYPE(QCPLegend::SelectablePart)
+
+
+class QCP_LIB_DECL QCPPlotTitle : public QCPLayoutElement
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QString text READ text WRITE setText)
+  Q_PROPERTY(QFont font READ font WRITE setFont)
+  Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor)
+  Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont)
+  Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor)
+  Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectableChanged)
+  Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectionChanged)
+  /// \endcond
+public:
+  explicit QCPPlotTitle(QCustomPlot *parentPlot);
+  explicit QCPPlotTitle(QCustomPlot *parentPlot, const QString &text);
+  
+  // getters:
+  QString text() const { return mText; }
+  QFont font() const { return mFont; }
+  QColor textColor() const { return mTextColor; }
+  QFont selectedFont() const { return mSelectedFont; }
+  QColor selectedTextColor() const { return mSelectedTextColor; }
+  bool selectable() const { return mSelectable; }
+  bool selected() const { return mSelected; }
+  
+  // setters:
+  void setText(const QString &text);
+  void setFont(const QFont &font);
+  void setTextColor(const QColor &color);
+  void setSelectedFont(const QFont &font);
+  void setSelectedTextColor(const QColor &color);
+  Q_SLOT void setSelectable(bool selectable);
+  Q_SLOT void setSelected(bool selected);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+signals:
+  void selectionChanged(bool selected);
+  void selectableChanged(bool selectable);
+  
+protected:
+  // property members:
+  QString mText;
+  QFont mFont;
+  QColor mTextColor;
+  QFont mSelectedFont;
+  QColor mSelectedTextColor;
+  QRect mTextBoundingRect;
+  bool mSelectable, mSelected;
+  
+  // reimplemented virtual methods:
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  virtual void draw(QCPPainter *painter);
+  virtual QSize minimumSizeHint() const;
+  virtual QSize maximumSizeHint() const;
+  // events:
+  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
+  virtual void deselectEvent(bool *selectionStateChanged);
+  
+  // non-virtual methods:
+  QFont mainFont() const;
+  QColor mainTextColor() const;
+  
+private:
+  Q_DISABLE_COPY(QCPPlotTitle)
+};
+
+
+class QCPColorScaleAxisRectPrivate : public QCPAxisRect
+{
+  Q_OBJECT
+public:
+  explicit QCPColorScaleAxisRectPrivate(QCPColorScale *parentColorScale);
+protected:
+  QCPColorScale *mParentColorScale;
+  QImage mGradientImage;
+  bool mGradientImageInvalidated;
+  // re-using some methods of QCPAxisRect to make them available to friend class QCPColorScale
+  using QCPAxisRect::calculateAutoMargin;
+  using QCPAxisRect::mousePressEvent;
+  using QCPAxisRect::mouseMoveEvent;
+  using QCPAxisRect::mouseReleaseEvent;
+  using QCPAxisRect::wheelEvent;
+  using QCPAxisRect::update;
+  virtual void draw(QCPPainter *painter);
+  void updateGradientImage();
+  Q_SLOT void axisSelectionChanged(QCPAxis::SelectableParts selectedParts);
+  Q_SLOT void axisSelectableChanged(QCPAxis::SelectableParts selectableParts);
+  friend class QCPColorScale;
+};
+
+
+class QCP_LIB_DECL QCPColorScale : public QCPLayoutElement
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QCPAxis::AxisType type READ type WRITE setType)
+  Q_PROPERTY(QCPRange dataRange READ dataRange WRITE setDataRange NOTIFY dataRangeChanged)
+  Q_PROPERTY(QCPAxis::ScaleType dataScaleType READ dataScaleType WRITE setDataScaleType NOTIFY dataScaleTypeChanged)
+  Q_PROPERTY(QCPColorGradient gradient READ gradient WRITE setGradient NOTIFY gradientChanged)
+  Q_PROPERTY(QString label READ label WRITE setLabel)
+  Q_PROPERTY(int barWidth READ barWidth WRITE setBarWidth)
+  Q_PROPERTY(bool rangeDrag READ rangeDrag WRITE setRangeDrag)
+  Q_PROPERTY(bool rangeZoom READ rangeZoom WRITE setRangeZoom)
+  /// \endcond
+public:
+  explicit QCPColorScale(QCustomPlot *parentPlot);
+  virtual ~QCPColorScale();
+  
+  // getters:
+  QCPAxis *axis() const { return mColorAxis.data(); }
+  QCPAxis::AxisType type() const { return mType; }
+  QCPRange dataRange() const { return mDataRange; }
+  QCPAxis::ScaleType dataScaleType() const { return mDataScaleType; }
+  QCPColorGradient gradient() const { return mGradient; }
+  QString label() const;
+  int barWidth () const { return mBarWidth; }
+  bool rangeDrag() const;
+  bool rangeZoom() const;
+  
+  // setters:
+  void setType(QCPAxis::AxisType type);
+  Q_SLOT void setDataRange(const QCPRange &dataRange);
+  Q_SLOT void setDataScaleType(QCPAxis::ScaleType scaleType);
+  Q_SLOT void setGradient(const QCPColorGradient &gradient);
+  void setLabel(const QString &str);
+  void setBarWidth(int width);
+  void setRangeDrag(bool enabled);
+  void setRangeZoom(bool enabled);
+  
+  // non-property methods:
+  QList<QCPColorMap*> colorMaps() const;
+  void rescaleDataRange(bool onlyVisibleMaps);
+  
+  // reimplemented virtual methods:
+  virtual void update(UpdatePhase phase);
+  
+signals:
+  void dataRangeChanged(QCPRange newRange);
+  void dataScaleTypeChanged(QCPAxis::ScaleType scaleType);
+  void gradientChanged(QCPColorGradient newGradient);
+
+protected:
+  // property members:
+  QCPAxis::AxisType mType;
+  QCPRange mDataRange;
+  QCPAxis::ScaleType mDataScaleType;
+  QCPColorGradient mGradient;
+  int mBarWidth;
+  
+  // non-property members:
+  QPointer<QCPColorScaleAxisRectPrivate> mAxisRect;
+  QPointer<QCPAxis> mColorAxis;
+  
+  // reimplemented virtual methods:
+  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
+  // events:
+  virtual void mousePressEvent(QMouseEvent *event);
+  virtual void mouseMoveEvent(QMouseEvent *event);
+  virtual void mouseReleaseEvent(QMouseEvent *event);
+  virtual void wheelEvent(QWheelEvent *event);
+  
+private:
+  Q_DISABLE_COPY(QCPColorScale)
+  
+  friend class QCPColorScaleAxisRectPrivate;
+};
+
+
+/*! \file */
+
+
+
+class QCP_LIB_DECL QCPData
+{
+public:
+  QCPData();
+  QCPData(double key, double value);
+  double key, value;
+  double keyErrorPlus, keyErrorMinus;
+  double valueErrorPlus, valueErrorMinus;
+};
+Q_DECLARE_TYPEINFO(QCPData, Q_MOVABLE_TYPE);
+
+/*! \typedef QCPDataMap
+  Container for storing \ref QCPData items in a sorted fashion. The key of the map
+  is the key member of the QCPData instance.
+  
+  This is the container in which QCPGraph holds its data.
+  \see QCPData, QCPGraph::setData
+*/
+typedef QMap<double, QCPData> QCPDataMap;
+typedef QMapIterator<double, QCPData> QCPDataMapIterator;
+typedef QMutableMapIterator<double, QCPData> QCPDataMutableMapIterator;
+
+
+class QCP_LIB_DECL QCPGraph : public QCPAbstractPlottable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(LineStyle lineStyle READ lineStyle WRITE setLineStyle)
+  Q_PROPERTY(QCPScatterStyle scatterStyle READ scatterStyle WRITE setScatterStyle)
+  Q_PROPERTY(ErrorType errorType READ errorType WRITE setErrorType)
+  Q_PROPERTY(QPen errorPen READ errorPen WRITE setErrorPen)
+  Q_PROPERTY(double errorBarSize READ errorBarSize WRITE setErrorBarSize)
+  Q_PROPERTY(bool errorBarSkipSymbol READ errorBarSkipSymbol WRITE setErrorBarSkipSymbol)
+  Q_PROPERTY(QCPGraph* channelFillGraph READ channelFillGraph WRITE setChannelFillGraph)
+  Q_PROPERTY(bool adaptiveSampling READ adaptiveSampling WRITE setAdaptiveSampling)
+  /// \endcond
+public:
+  /*!
+    Defines how the graph's line is represented visually in the plot. The line is drawn with the
+    current pen of the graph (\ref setPen).
+    \see setLineStyle
+  */
+  enum LineStyle { lsNone        ///< data points are not connected with any lines (e.g. data only represented
+                                 ///< with symbols according to the scatter style, see \ref setScatterStyle)
+                   ,lsLine       ///< data points are connected by a straight line
+                   ,lsStepLeft   ///< line is drawn as steps where the step height is the value of the left data point
+                   ,lsStepRight  ///< line is drawn as steps where the step height is the value of the right data point
+                   ,lsStepCenter ///< line is drawn as steps where the step is in between two data points
+                   ,lsImpulse    ///< each data point is represented by a line parallel to the value axis, which reaches from the data point to the zero-value-line
+                 };
+  Q_ENUMS(LineStyle)
+  /*!
+    Defines what kind of error bars are drawn for each data point
+  */
+  enum ErrorType { etNone   ///< No error bars are shown
+                   ,etKey   ///< Error bars for the key dimension of the data point are shown
+                   ,etValue ///< Error bars for the value dimension of the data point are shown
+                   ,etBoth  ///< Error bars for both key and value dimensions of the data point are shown
+                 };
+  Q_ENUMS(ErrorType)
+  
+  explicit QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis);
+  virtual ~QCPGraph();
+  
+  // getters:
+  QCPDataMap *data() const { return mData; }
+  LineStyle lineStyle() const { return mLineStyle; }
+  QCPScatterStyle scatterStyle() const { return mScatterStyle; }
+  ErrorType errorType() const { return mErrorType; }
+  QPen errorPen() const { return mErrorPen; }
+  double errorBarSize() const { return mErrorBarSize; }
+  bool errorBarSkipSymbol() const { return mErrorBarSkipSymbol; }
+  QCPGraph *channelFillGraph() const { return mChannelFillGraph.data(); }
+  bool adaptiveSampling() const { return mAdaptiveSampling; }
+  
+  // setters:
+  void setData(QCPDataMap *data, bool copy=false);
+  void setData(const QVector<double> &key, const QVector<double> &value);
+  void setDataKeyError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyError);
+  void setDataKeyError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyErrorMinus, const QVector<double> &keyErrorPlus);
+  void setDataValueError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &valueError);
+  void setDataValueError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &valueErrorMinus, const QVector<double> &valueErrorPlus);
+  void setDataBothError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyError, const QVector<double> &valueError);
+  void setDataBothError(const QVector<double> &key, const QVector<double> &value, const QVector<double> &keyErrorMinus, const QVector<double> &keyErrorPlus, const QVector<double> &valueErrorMinus, const QVector<double> &valueErrorPlus);
+  void setLineStyle(LineStyle ls);
+  void setScatterStyle(const QCPScatterStyle &style);
+  void setErrorType(ErrorType errorType);
+  void setErrorPen(const QPen &pen);
+  void setErrorBarSize(double size);
+  void setErrorBarSkipSymbol(bool enabled);
+  void setChannelFillGraph(QCPGraph *targetGraph);
+  void setAdaptiveSampling(bool enabled);
+  
+  // non-property methods:
+  void addData(const QCPDataMap &dataMap);
+  void addData(const QCPData &data);
+  void addData(double key, double value);
+  void addData(const QVector<double> &keys, const QVector<double> &values);
+  void removeDataBefore(double key);
+  void removeDataAfter(double key);
+  void removeData(double fromKey, double toKey);
+  void removeData(double key);
+  
+  // reimplemented virtual methods:
+  virtual void clearData();
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  using QCPAbstractPlottable::rescaleAxes;
+  using QCPAbstractPlottable::rescaleKeyAxis;
+  using QCPAbstractPlottable::rescaleValueAxis;
+  void rescaleAxes(bool onlyEnlarge, bool includeErrorBars) const; // overloads base class interface
+  void rescaleKeyAxis(bool onlyEnlarge, bool includeErrorBars) const; // overloads base class interface
+  void rescaleValueAxis(bool onlyEnlarge, bool includeErrorBars) const; // overloads base class interface
+  
+protected:
+  // property members:
+  QCPDataMap *mData;
+  QPen mErrorPen;
+  LineStyle mLineStyle;
+  QCPScatterStyle mScatterStyle;
+  ErrorType mErrorType;
+  double mErrorBarSize;
+  bool mErrorBarSkipSymbol;
+  QPointer<QCPGraph> mChannelFillGraph;
+  bool mAdaptiveSampling;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const; // overloads base class interface
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const; // overloads base class interface
+  
+  // introduced virtual methods:
+  virtual void drawFill(QCPPainter *painter, QVector<QPointF> *lineData) const;
+  virtual void drawScatterPlot(QCPPainter *painter, QVector<QCPData> *scatterData) const;
+  virtual void drawLinePlot(QCPPainter *painter, QVector<QPointF> *lineData) const;
+  virtual void drawImpulsePlot(QCPPainter *painter, QVector<QPointF> *lineData) const;
+  
+  // non-virtual methods:
+  void getPreparedData(QVector<QCPData> *lineData, QVector<QCPData> *scatterData) const;
+  void getPlotData(QVector<QPointF> *lineData, QVector<QCPData> *scatterData) const;
+  void getScatterPlotData(QVector<QCPData> *scatterData) const;
+  void getLinePlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const;
+  void getStepLeftPlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const;
+  void getStepRightPlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const;
+  void getStepCenterPlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const;
+  void getImpulsePlotData(QVector<QPointF> *linePixelData, QVector<QCPData> *scatterData) const;
+  void drawError(QCPPainter *painter, double x, double y, const QCPData &data) const;
+  void getVisibleDataBounds(QCPDataMap::const_iterator &lower, QCPDataMap::const_iterator &upper) const;
+  int countDataInBounds(const QCPDataMap::const_iterator &lower, const QCPDataMap::const_iterator &upper, int maxCount) const;
+  void addFillBasePoints(QVector<QPointF> *lineData) const;
+  void removeFillBasePoints(QVector<QPointF> *lineData) const;
+  QPointF lowerFillBasePoint(double lowerKey) const;
+  QPointF upperFillBasePoint(double upperKey) const;
+  const QPolygonF getChannelFillPolygon(const QVector<QPointF> *lineData) const;
+  int findIndexBelowX(const QVector<QPointF> *data, double x) const;
+  int findIndexAboveX(const QVector<QPointF> *data, double x) const;
+  int findIndexBelowY(const QVector<QPointF> *data, double y) const;
+  int findIndexAboveY(const QVector<QPointF> *data, double y) const;
+  double pointDistance(const QPointF &pixelPoint) const;
+  
+  friend class QCustomPlot;
+  friend class QCPLegend;
+};
+
+
+/*! \file */
+
+
+
+class QCP_LIB_DECL QCPCurveData
+{
+public:
+  QCPCurveData();
+  QCPCurveData(double t, double key, double value);
+  double t, key, value;
+};
+Q_DECLARE_TYPEINFO(QCPCurveData, Q_MOVABLE_TYPE);
+
+/*! \typedef QCPCurveDataMap
+  Container for storing \ref QCPCurveData items in a sorted fashion. The key of the map
+  is the t member of the QCPCurveData instance.
+  
+  This is the container in which QCPCurve holds its data.
+  \see QCPCurveData, QCPCurve::setData
+*/
+
+typedef QMap<double, QCPCurveData> QCPCurveDataMap;
+typedef QMapIterator<double, QCPCurveData> QCPCurveDataMapIterator;
+typedef QMutableMapIterator<double, QCPCurveData> QCPCurveDataMutableMapIterator;
+
+
+class QCP_LIB_DECL QCPCurve : public QCPAbstractPlottable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QCPScatterStyle scatterStyle READ scatterStyle WRITE setScatterStyle)
+  Q_PROPERTY(LineStyle lineStyle READ lineStyle WRITE setLineStyle)
+  /// \endcond
+public:
+  /*!
+    Defines how the curve's line is represented visually in the plot. The line is drawn with the
+    current pen of the curve (\ref setPen).
+    \see setLineStyle
+  */
+  enum LineStyle { lsNone  ///< No line is drawn between data points (e.g. only scatters)
+                   ,lsLine ///< Data points are connected with a straight line
+                 };
+  explicit QCPCurve(QCPAxis *keyAxis, QCPAxis *valueAxis);
+  virtual ~QCPCurve();
+  
+  // getters:
+  QCPCurveDataMap *data() const { return mData; }
+  QCPScatterStyle scatterStyle() const { return mScatterStyle; }
+  LineStyle lineStyle() const { return mLineStyle; }
+  
+  // setters:
+  void setData(QCPCurveDataMap *data, bool copy=false);
+  void setData(const QVector<double> &t, const QVector<double> &key, const QVector<double> &value);
+  void setData(const QVector<double> &key, const QVector<double> &value);
+  void setScatterStyle(const QCPScatterStyle &style);
+  void setLineStyle(LineStyle style);
+  
+  // non-property methods:
+  void addData(const QCPCurveDataMap &dataMap);
+  void addData(const QCPCurveData &data);
+  void addData(double t, double key, double value);
+  void addData(double key, double value);
+  void addData(const QVector<double> &ts, const QVector<double> &keys, const QVector<double> &values);
+  void removeDataBefore(double t);
+  void removeDataAfter(double t);
+  void removeData(double fromt, double tot);
+  void removeData(double t);
+  
+  // reimplemented virtual methods:
+  virtual void clearData();
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+protected:
+  // property members:
+  QCPCurveDataMap *mData;
+  QCPScatterStyle mScatterStyle;
+  LineStyle mLineStyle;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  
+  // introduced virtual methods:
+  virtual void drawScatterPlot(QCPPainter *painter, const QVector<QPointF> *pointData) const;
+  
+  // non-virtual methods:
+  void getCurveData(QVector<QPointF> *lineData) const;
+  int getRegion(double x, double y, double rectLeft, double rectTop, double rectRight, double rectBottom) const;
+  QPointF getOptimizedPoint(int prevRegion, double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const;
+  QVector<QPointF> getOptimizedCornerPoints(int prevRegion, int currentRegion, double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const;
+  bool mayTraverse(int prevRegion, int currentRegion) const;
+  bool getTraverse(double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom, QPointF &crossA, QPointF &crossB) const;
+  void getTraverseCornerPoints(int prevRegion, int currentRegion, double rectLeft, double rectTop, double rectRight, double rectBottom, QVector<QPointF> &beforeTraverse, QVector<QPointF> &afterTraverse) const;
+  double pointDistance(const QPointF &pixelPoint) const;
+  
+  friend class QCustomPlot;
+  friend class QCPLegend;
+};
+
+
+/*! \file */
+
+
+
+class QCP_LIB_DECL QCPBarsGroup : public QObject
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(SpacingType spacingType READ spacingType WRITE setSpacingType)
+  Q_PROPERTY(double spacing READ spacing WRITE setSpacing)
+  /// \endcond
+public:
+  /*!
+    Defines the ways the spacing between bars in the group can be specified. Thus it defines what
+    the number passed to \ref setSpacing actually means.
+    
+    \see setSpacingType, setSpacing
+  */
+  enum SpacingType { stAbsolute       ///< Bar spacing is in absolute pixels
+                     ,stAxisRectRatio ///< Bar spacing is given by a fraction of the axis rect size
+                     ,stPlotCoords    ///< Bar spacing is in key coordinates and thus scales with the key axis range
+                 };
+  QCPBarsGroup(QCustomPlot *parentPlot);
+  ~QCPBarsGroup();
+  
+  // getters:
+  SpacingType spacingType() const { return mSpacingType; }
+  double spacing() const { return mSpacing; }
+  
+  // setters:
+  void setSpacingType(SpacingType spacingType);
+  void setSpacing(double spacing);
+  
+  // non-virtual methods:
+  QList<QCPBars*> bars() const { return mBars; }
+  QCPBars* bars(int index) const;
+  int size() const { return mBars.size(); }
+  bool isEmpty() const { return mBars.isEmpty(); }
+  void clear();
+  bool contains(QCPBars *bars) const { return mBars.contains(bars); }
+  void append(QCPBars *bars);
+  void insert(int i, QCPBars *bars);
+  void remove(QCPBars *bars);
+  
+protected:
+  // non-property members:
+  QCustomPlot *mParentPlot;
+  SpacingType mSpacingType;
+  double mSpacing;
+  QList<QCPBars*> mBars;
+  
+  // non-virtual methods:
+  void registerBars(QCPBars *bars);
+  void unregisterBars(QCPBars *bars);
+  
+  // virtual methods:
+  double keyPixelOffset(const QCPBars *bars, double keyCoord);
+  double getPixelSpacing(const QCPBars *bars, double keyCoord);
+  
+private:
+  Q_DISABLE_COPY(QCPBarsGroup)
+  
+  friend class QCPBars;
+};
+
+
+class QCP_LIB_DECL QCPBarData
+{
+public:
+  QCPBarData();
+  QCPBarData(double key, double value);
+  double key, value;
+};
+Q_DECLARE_TYPEINFO(QCPBarData, Q_MOVABLE_TYPE);
+
+/*! \typedef QCPBarDataMap
+  Container for storing \ref QCPBarData items in a sorted fashion. The key of the map
+  is the key member of the QCPBarData instance.
+  
+  This is the container in which QCPBars holds its data.
+  \see QCPBarData, QCPBars::setData
+*/
+typedef QMap<double, QCPBarData> QCPBarDataMap;
+typedef QMapIterator<double, QCPBarData> QCPBarDataMapIterator;
+typedef QMutableMapIterator<double, QCPBarData> QCPBarDataMutableMapIterator;
+
+
+class QCP_LIB_DECL QCPBars : public QCPAbstractPlottable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(double width READ width WRITE setWidth)
+  Q_PROPERTY(WidthType widthType READ widthType WRITE setWidthType)
+  Q_PROPERTY(QCPBarsGroup* barsGroup READ barsGroup WRITE setBarsGroup)
+  Q_PROPERTY(double baseValue READ baseValue WRITE setBaseValue)
+  Q_PROPERTY(QCPBars* barBelow READ barBelow)
+  Q_PROPERTY(QCPBars* barAbove READ barAbove)
+  /// \endcond
+public:
+  /*!
+    Defines the ways the width of the bar can be specified. Thus it defines what the number passed
+    to \ref setWidth actually means.
+    
+    \see setWidthType, setWidth
+  */
+  enum WidthType { wtAbsolute       ///< Bar width is in absolute pixels
+                   ,wtAxisRectRatio ///< Bar width is given by a fraction of the axis rect size
+                   ,wtPlotCoords    ///< Bar width is in key coordinates and thus scales with the key axis range
+                 };
+   Q_ENUMS(WidthType)
+  
+  explicit QCPBars(QCPAxis *keyAxis, QCPAxis *valueAxis);
+  virtual ~QCPBars();
+  
+  // getters:
+  double width() const { return mWidth; }
+  WidthType widthType() const { return mWidthType; }
+  QCPBarsGroup *barsGroup() const { return mBarsGroup; }
+  double baseValue() const { return mBaseValue; }
+  QCPBars *barBelow() const { return mBarBelow.data(); }
+  QCPBars *barAbove() const { return mBarAbove.data(); }
+  QCPBarDataMap *data() const { return mData; }
+  
+  // setters:
+  void setWidth(double width);
+  void setWidthType(WidthType widthType);
+  void setBarsGroup(QCPBarsGroup *barsGroup);
+  void setBaseValue(double baseValue);
+  void setData(QCPBarDataMap *data, bool copy=false);
+  void setData(const QVector<double> &key, const QVector<double> &value);
+  
+  // non-property methods:
+  void moveBelow(QCPBars *bars);
+  void moveAbove(QCPBars *bars);
+  void addData(const QCPBarDataMap &dataMap);
+  void addData(const QCPBarData &data);
+  void addData(double key, double value);
+  void addData(const QVector<double> &keys, const QVector<double> &values);
+  void removeDataBefore(double key);
+  void removeDataAfter(double key);
+  void removeData(double fromKey, double toKey);
+  void removeData(double key);
+  
+  // reimplemented virtual methods:
+  virtual void clearData();
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+protected:
+  // property members:
+  QCPBarDataMap *mData;
+  double mWidth;
+  WidthType mWidthType;
+  QCPBarsGroup *mBarsGroup;
+  double mBaseValue;
+  QPointer<QCPBars> mBarBelow, mBarAbove;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  
+  // non-virtual methods:
+  void getVisibleDataBounds(QCPBarDataMap::const_iterator &lower, QCPBarDataMap::const_iterator &upperEnd) const;
+  QPolygonF getBarPolygon(double key, double value) const;
+  void getPixelWidth(double key, double &lower, double &upper) const;
+  double getStackedBaseValue(double key, bool positive) const;
+  static void connectBars(QCPBars* lower, QCPBars* upper);
+  
+  friend class QCustomPlot;
+  friend class QCPLegend;
+  friend class QCPBarsGroup;
+};
+
+
+/*! \file */
+
+
+
+class QCP_LIB_DECL QCPStatisticalBox : public QCPAbstractPlottable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(double key READ key WRITE setKey)
+  Q_PROPERTY(double minimum READ minimum WRITE setMinimum)
+  Q_PROPERTY(double lowerQuartile READ lowerQuartile WRITE setLowerQuartile)
+  Q_PROPERTY(double median READ median WRITE setMedian)
+  Q_PROPERTY(double upperQuartile READ upperQuartile WRITE setUpperQuartile)
+  Q_PROPERTY(double maximum READ maximum WRITE setMaximum)
+  Q_PROPERTY(QVector<double> outliers READ outliers WRITE setOutliers)
+  Q_PROPERTY(double width READ width WRITE setWidth)
+  Q_PROPERTY(double whiskerWidth READ whiskerWidth WRITE setWhiskerWidth)
+  Q_PROPERTY(QPen whiskerPen READ whiskerPen WRITE setWhiskerPen)
+  Q_PROPERTY(QPen whiskerBarPen READ whiskerBarPen WRITE setWhiskerBarPen)
+  Q_PROPERTY(QPen medianPen READ medianPen WRITE setMedianPen)
+  Q_PROPERTY(QCPScatterStyle outlierStyle READ outlierStyle WRITE setOutlierStyle)
+  /// \endcond
+public:
+  explicit QCPStatisticalBox(QCPAxis *keyAxis, QCPAxis *valueAxis);
+  
+  // getters:
+  double key() const { return mKey; }
+  double minimum() const { return mMinimum; }
+  double lowerQuartile() const { return mLowerQuartile; }
+  double median() const { return mMedian; }
+  double upperQuartile() const { return mUpperQuartile; }
+  double maximum() const { return mMaximum; }
+  QVector<double> outliers() const { return mOutliers; }
+  double width() const { return mWidth; }
+  double whiskerWidth() const { return mWhiskerWidth; }
+  QPen whiskerPen() const { return mWhiskerPen; }
+  QPen whiskerBarPen() const { return mWhiskerBarPen; }
+  QPen medianPen() const { return mMedianPen; }
+  QCPScatterStyle outlierStyle() const { return mOutlierStyle; }
+
+  // setters:
+  void setKey(double key);
+  void setMinimum(double value);
+  void setLowerQuartile(double value);
+  void setMedian(double value);
+  void setUpperQuartile(double value);
+  void setMaximum(double value);
+  void setOutliers(const QVector<double> &values);
+  void setData(double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum);
+  void setWidth(double width);
+  void setWhiskerWidth(double width);
+  void setWhiskerPen(const QPen &pen);
+  void setWhiskerBarPen(const QPen &pen);
+  void setMedianPen(const QPen &pen);
+  void setOutlierStyle(const QCPScatterStyle &style);
+  
+  // non-property methods:
+  virtual void clearData();
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+protected:
+  // property members:
+  QVector<double> mOutliers;
+  double mKey, mMinimum, mLowerQuartile, mMedian, mUpperQuartile, mMaximum;
+  double mWidth;
+  double mWhiskerWidth;
+  QPen mWhiskerPen, mWhiskerBarPen, mMedianPen;
+  QCPScatterStyle mOutlierStyle;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  
+  // introduced virtual methods:
+  virtual void drawQuartileBox(QCPPainter *painter, QRectF *quartileBox=0) const;
+  virtual void drawMedian(QCPPainter *painter) const;
+  virtual void drawWhiskers(QCPPainter *painter) const;
+  virtual void drawOutliers(QCPPainter *painter) const;
+  
+  friend class QCustomPlot;
+  friend class QCPLegend;
+};
+
+
+class QCP_LIB_DECL QCPColorMapData
+{
+public:
+  QCPColorMapData(int keySize, int valueSize, const QCPRange &keyRange, const QCPRange &valueRange);
+  ~QCPColorMapData();
+  QCPColorMapData(const QCPColorMapData &other);
+  QCPColorMapData &operator=(const QCPColorMapData &other);
+  
+  // getters:
+  int keySize() const { return mKeySize; }
+  int valueSize() const { return mValueSize; }
+  QCPRange keyRange() const { return mKeyRange; }
+  QCPRange valueRange() const { return mValueRange; }
+  QCPRange dataBounds() const { return mDataBounds; }
+  double data(double key, double value);
+  double cell(int keyIndex, int valueIndex);
+  
+  // setters:
+  void setSize(int keySize, int valueSize);
+  void setKeySize(int keySize);
+  void setValueSize(int valueSize);
+  void setRange(const QCPRange &keyRange, const QCPRange &valueRange);
+  void setKeyRange(const QCPRange &keyRange);
+  void setValueRange(const QCPRange &valueRange);
+  void setData(double key, double value, double z);
+  void setCell(int keyIndex, int valueIndex, double z);
+  
+  // non-property methods:
+  void recalculateDataBounds();
+  void clear();
+  void fill(double z);
+  bool isEmpty() const { return mIsEmpty; }
+  void coordToCell(double key, double value, int *keyIndex, int *valueIndex) const;
+  void cellToCoord(int keyIndex, int valueIndex, double *key, double *value) const;
+  
+protected:
+  // property members:
+  int mKeySize, mValueSize;
+  QCPRange mKeyRange, mValueRange;
+  bool mIsEmpty;
+  // non-property members:
+  double *mData;
+  QCPRange mDataBounds;
+  bool mDataModified;
+  
+  friend class QCPColorMap;
+};
+
+
+class QCP_LIB_DECL QCPColorMap : public QCPAbstractPlottable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QCPRange dataRange READ dataRange WRITE setDataRange NOTIFY dataRangeChanged)
+  Q_PROPERTY(QCPAxis::ScaleType dataScaleType READ dataScaleType WRITE setDataScaleType NOTIFY dataScaleTypeChanged)
+  Q_PROPERTY(QCPColorGradient gradient READ gradient WRITE setGradient NOTIFY gradientChanged)
+  Q_PROPERTY(bool interpolate READ interpolate WRITE setInterpolate)
+  Q_PROPERTY(bool tightBoundary READ tightBoundary WRITE setTightBoundary)
+  Q_PROPERTY(QCPColorScale* colorScale READ colorScale WRITE setColorScale)
+  /// \endcond
+public:
+  explicit QCPColorMap(QCPAxis *keyAxis, QCPAxis *valueAxis);
+  virtual ~QCPColorMap();
+  
+  // getters:
+  QCPColorMapData *data() const { return mMapData; }
+  QCPRange dataRange() const { return mDataRange; }
+  QCPAxis::ScaleType dataScaleType() const { return mDataScaleType; }
+  bool interpolate() const { return mInterpolate; }
+  bool tightBoundary() const { return mTightBoundary; }
+  QCPColorGradient gradient() const { return mGradient; }
+  QCPColorScale *colorScale() const { return mColorScale.data(); }
+  
+  // setters:
+  void setData(QCPColorMapData *data, bool copy=false);
+  Q_SLOT void setDataRange(const QCPRange &dataRange);
+  Q_SLOT void setDataScaleType(QCPAxis::ScaleType scaleType);
+  Q_SLOT void setGradient(const QCPColorGradient &gradient);
+  void setInterpolate(bool enabled);
+  void setTightBoundary(bool enabled);
+  void setColorScale(QCPColorScale *colorScale);
+  
+  // non-property methods:
+  void rescaleDataRange(bool recalculateDataBounds=false);
+  Q_SLOT void updateLegendIcon(Qt::TransformationMode transformMode=Qt::SmoothTransformation, const QSize &thumbSize=QSize(32, 18));
+  
+  // reimplemented virtual methods:
+  virtual void clearData();
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+signals:
+  void dataRangeChanged(QCPRange newRange);
+  void dataScaleTypeChanged(QCPAxis::ScaleType scaleType);
+  void gradientChanged(QCPColorGradient newGradient);
+  
+protected:
+  // property members:
+  QCPRange mDataRange;
+  QCPAxis::ScaleType mDataScaleType;
+  QCPColorMapData *mMapData;
+  QCPColorGradient mGradient;
+  bool mInterpolate;
+  bool mTightBoundary;
+  QPointer<QCPColorScale> mColorScale;
+  // non-property members:
+  QImage mMapImage, mUndersampledMapImage;
+  QPixmap mLegendIcon;
+  bool mMapImageInvalidated;
+  
+  // introduced virtual methods:
+  virtual void updateMapImage();
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  
+  friend class QCustomPlot;
+  friend class QCPLegend;
+};
+
+
+/*! \file */
+
+
+
+class QCP_LIB_DECL QCPFinancialData
+{
+public:
+  QCPFinancialData();
+  QCPFinancialData(double key, double open, double high, double low, double close);
+  double key, open, high, low, close;
+};
+Q_DECLARE_TYPEINFO(QCPFinancialData, Q_MOVABLE_TYPE);
+
+/*! \typedef QCPFinancialDataMap
+  Container for storing \ref QCPFinancialData items in a sorted fashion. The key of the map
+  is the key member of the QCPFinancialData instance.
+  
+  This is the container in which QCPFinancial holds its data.
+  \see QCPFinancial, QCPFinancial::setData
+*/
+typedef QMap<double, QCPFinancialData> QCPFinancialDataMap;
+typedef QMapIterator<double, QCPFinancialData> QCPFinancialDataMapIterator;
+typedef QMutableMapIterator<double, QCPFinancialData> QCPFinancialDataMutableMapIterator;
+
+
+class QCP_LIB_DECL QCPFinancial : public QCPAbstractPlottable
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(ChartStyle chartStyle READ chartStyle WRITE setChartStyle)
+  Q_PROPERTY(double width READ width WRITE setWidth)
+  Q_PROPERTY(bool twoColored READ twoColored WRITE setTwoColored)
+  Q_PROPERTY(QBrush brushPositive READ brushPositive WRITE setBrushPositive)
+  Q_PROPERTY(QBrush brushNegative READ brushNegative WRITE setBrushNegative)
+  Q_PROPERTY(QPen penPositive READ penPositive WRITE setPenPositive)
+  Q_PROPERTY(QPen penNegative READ penNegative WRITE setPenNegative)
+  /// \endcond
+public:
+  /*!
+    Defines the possible representations of OHLC data in the plot.
+    
+    \see setChartStyle
+  */
+  enum ChartStyle { csOhlc         ///< Open-High-Low-Close bar representation
+                   ,csCandlestick  ///< Candlestick representation
+                  };
+  Q_ENUMS(ChartStyle)
+  
+  explicit QCPFinancial(QCPAxis *keyAxis, QCPAxis *valueAxis);
+  virtual ~QCPFinancial();
+  
+  // getters:
+  QCPFinancialDataMap *data() const { return mData; }
+  ChartStyle chartStyle() const { return mChartStyle; }
+  double width() const { return mWidth; }
+  bool twoColored() const { return mTwoColored; }
+  QBrush brushPositive() const { return mBrushPositive; }
+  QBrush brushNegative() const { return mBrushNegative; }
+  QPen penPositive() const { return mPenPositive; }
+  QPen penNegative() const { return mPenNegative; }
+  
+  
+  // setters:
+  void setData(QCPFinancialDataMap *data, bool copy=false);
+  void setData(const QVector<double> &key, const QVector<double> &open, const QVector<double> &high, const QVector<double> &low, const QVector<double> &close);
+  void setChartStyle(ChartStyle style);
+  void setWidth(double width);
+  void setTwoColored(bool twoColored);
+  void setBrushPositive(const QBrush &brush);
+  void setBrushNegative(const QBrush &brush);
+  void setPenPositive(const QPen &pen);
+  void setPenNegative(const QPen &pen);
+  
+  // non-property methods:
+  void addData(const QCPFinancialDataMap &dataMap);
+  void addData(const QCPFinancialData &data);
+  void addData(double key, double open, double high, double low, double close);
+  void addData(const QVector<double> &key, const QVector<double> &open, const QVector<double> &high, const QVector<double> &low, const QVector<double> &close);
+  void removeDataBefore(double key);
+  void removeDataAfter(double key);
+  void removeData(double fromKey, double toKey);
+  void removeData(double key);
+  
+  // reimplemented virtual methods:
+  virtual void clearData();
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  // static methods:
+  static QCPFinancialDataMap timeSeriesToOhlc(const QVector<double> &time, const QVector<double> &value, double timeBinSize, double timeBinOffset = 0);
+  
+protected:
+  // property members:
+  QCPFinancialDataMap *mData;
+  ChartStyle mChartStyle;
+  double mWidth;
+  bool mTwoColored;
+  QBrush mBrushPositive, mBrushNegative;
+  QPen mPenPositive, mPenNegative;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const;
+  virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const;
+  
+  // non-virtual methods:
+  void drawOhlcPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end);
+  void drawCandlestickPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end);
+  double ohlcSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const;
+  double candlestickSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const;
+  void getVisibleDataBounds(QCPFinancialDataMap::const_iterator &lower, QCPFinancialDataMap::const_iterator &upper) const;
+  
+  friend class QCustomPlot;
+  friend class QCPLegend;
+};
+
+
+class QCP_LIB_DECL QCPItemStraightLine : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  /// \endcond
+public:
+  QCPItemStraightLine(QCustomPlot *parentPlot);
+  virtual ~QCPItemStraightLine();
+  
+  // getters:
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  
+  // setters;
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const point1;
+  QCPItemPosition * const point2;
+  
+protected:
+  // property members:
+  QPen mPen, mSelectedPen;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  
+  // non-virtual methods:
+  double distToStraightLine(const QVector2D &point1, const QVector2D &vec, const QVector2D &point) const;
+  QLineF getRectClippedStraightLine(const QVector2D &point1, const QVector2D &vec, const QRect &rect) const;
+  QPen mainPen() const;
+};
+
+
+class QCP_LIB_DECL QCPItemLine : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(QCPLineEnding head READ head WRITE setHead)
+  Q_PROPERTY(QCPLineEnding tail READ tail WRITE setTail)
+  /// \endcond
+public:
+  QCPItemLine(QCustomPlot *parentPlot);
+  virtual ~QCPItemLine();
+  
+  // getters:
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  QCPLineEnding head() const { return mHead; }
+  QCPLineEnding tail() const { return mTail; }
+  
+  // setters;
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setHead(const QCPLineEnding &head);
+  void setTail(const QCPLineEnding &tail);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const start;
+  QCPItemPosition * const end;
+  
+protected:
+  // property members:
+  QPen mPen, mSelectedPen;
+  QCPLineEnding mHead, mTail;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  
+  // non-virtual methods:
+  QLineF getRectClippedLine(const QVector2D &start, const QVector2D &end, const QRect &rect) const;
+  QPen mainPen() const;
+};
+
+
+class QCP_LIB_DECL QCPItemCurve : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(QCPLineEnding head READ head WRITE setHead)
+  Q_PROPERTY(QCPLineEnding tail READ tail WRITE setTail)
+  /// \endcond
+public:
+  QCPItemCurve(QCustomPlot *parentPlot);
+  virtual ~QCPItemCurve();
+  
+  // getters:
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  QCPLineEnding head() const { return mHead; }
+  QCPLineEnding tail() const { return mTail; }
+  
+  // setters;
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setHead(const QCPLineEnding &head);
+  void setTail(const QCPLineEnding &tail);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const start;
+  QCPItemPosition * const startDir;
+  QCPItemPosition * const endDir;
+  QCPItemPosition * const end;
+  
+protected:
+  // property members:
+  QPen mPen, mSelectedPen;
+  QCPLineEnding mHead, mTail;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  
+  // non-virtual methods:
+  QPen mainPen() const;
+};
+
+
+class QCP_LIB_DECL QCPItemRect : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(QBrush brush READ brush WRITE setBrush)
+  Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush)
+  /// \endcond
+public:
+  QCPItemRect(QCustomPlot *parentPlot);
+  virtual ~QCPItemRect();
+  
+  // getters:
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  QBrush brush() const { return mBrush; }
+  QBrush selectedBrush() const { return mSelectedBrush; }
+  
+  // setters;
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setBrush(const QBrush &brush);
+  void setSelectedBrush(const QBrush &brush);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const topLeft;
+  QCPItemPosition * const bottomRight;
+  QCPItemAnchor * const top;
+  QCPItemAnchor * const topRight;
+  QCPItemAnchor * const right;
+  QCPItemAnchor * const bottom;
+  QCPItemAnchor * const bottomLeft;
+  QCPItemAnchor * const left;
+  
+protected:
+  enum AnchorIndex {aiTop, aiTopRight, aiRight, aiBottom, aiBottomLeft, aiLeft};
+  
+  // property members:
+  QPen mPen, mSelectedPen;
+  QBrush mBrush, mSelectedBrush;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual QPointF anchorPixelPoint(int anchorId) const;
+  
+  // non-virtual methods:
+  QPen mainPen() const;
+  QBrush mainBrush() const;
+};
+
+
+class QCP_LIB_DECL QCPItemText : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QColor color READ color WRITE setColor)
+  Q_PROPERTY(QColor selectedColor READ selectedColor WRITE setSelectedColor)
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(QBrush brush READ brush WRITE setBrush)
+  Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush)
+  Q_PROPERTY(QFont font READ font WRITE setFont)
+  Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont)
+  Q_PROPERTY(QString text READ text WRITE setText)
+  Q_PROPERTY(Qt::Alignment positionAlignment READ positionAlignment WRITE setPositionAlignment)
+  Q_PROPERTY(Qt::Alignment textAlignment READ textAlignment WRITE setTextAlignment)
+  Q_PROPERTY(double rotation READ rotation WRITE setRotation)
+  Q_PROPERTY(QMargins padding READ padding WRITE setPadding)
+  /// \endcond
+public:
+  QCPItemText(QCustomPlot *parentPlot);
+  virtual ~QCPItemText();
+  
+  // getters:
+  QColor color() const { return mColor; }
+  QColor selectedColor() const { return mSelectedColor; }
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  QBrush brush() const { return mBrush; }
+  QBrush selectedBrush() const { return mSelectedBrush; }
+  QFont font() const { return mFont; }
+  QFont selectedFont() const { return mSelectedFont; }
+  QString text() const { return mText; }
+  Qt::Alignment positionAlignment() const { return mPositionAlignment; }
+  Qt::Alignment textAlignment() const { return mTextAlignment; }
+  double rotation() const { return mRotation; }
+  QMargins padding() const { return mPadding; }
+  
+  // setters;
+  void setColor(const QColor &color);
+  void setSelectedColor(const QColor &color);
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setBrush(const QBrush &brush);
+  void setSelectedBrush(const QBrush &brush);
+  void setFont(const QFont &font);
+  void setSelectedFont(const QFont &font);
+  void setText(const QString &text);
+  void setPositionAlignment(Qt::Alignment alignment);
+  void setTextAlignment(Qt::Alignment alignment);
+  void setRotation(double degrees);
+  void setPadding(const QMargins &padding);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const position;
+  QCPItemAnchor * const topLeft;
+  QCPItemAnchor * const top;
+  QCPItemAnchor * const topRight;
+  QCPItemAnchor * const right;
+  QCPItemAnchor * const bottomRight;
+  QCPItemAnchor * const bottom;
+  QCPItemAnchor * const bottomLeft;
+  QCPItemAnchor * const left;
+  
+protected:
+  enum AnchorIndex {aiTopLeft, aiTop, aiTopRight, aiRight, aiBottomRight, aiBottom, aiBottomLeft, aiLeft};
+  
+  // property members:
+  QColor mColor, mSelectedColor;
+  QPen mPen, mSelectedPen;
+  QBrush mBrush, mSelectedBrush;
+  QFont mFont, mSelectedFont;
+  QString mText;
+  Qt::Alignment mPositionAlignment;
+  Qt::Alignment mTextAlignment;
+  double mRotation;
+  QMargins mPadding;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual QPointF anchorPixelPoint(int anchorId) const;
+  
+  // non-virtual methods:
+  QPointF getTextDrawPoint(const QPointF &pos, const QRectF &rect, Qt::Alignment positionAlignment) const;
+  QFont mainFont() const;
+  QColor mainColor() const;
+  QPen mainPen() const;
+  QBrush mainBrush() const;
+};
+
+
+class QCP_LIB_DECL QCPItemEllipse : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(QBrush brush READ brush WRITE setBrush)
+  Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush)
+  /// \endcond
+public:
+  QCPItemEllipse(QCustomPlot *parentPlot);
+  virtual ~QCPItemEllipse();
+  
+  // getters:
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  QBrush brush() const { return mBrush; }
+  QBrush selectedBrush() const { return mSelectedBrush; }
+  
+  // setters;
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setBrush(const QBrush &brush);
+  void setSelectedBrush(const QBrush &brush);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const topLeft;
+  QCPItemPosition * const bottomRight;
+  QCPItemAnchor * const topLeftRim;
+  QCPItemAnchor * const top;
+  QCPItemAnchor * const topRightRim;
+  QCPItemAnchor * const right;
+  QCPItemAnchor * const bottomRightRim;
+  QCPItemAnchor * const bottom;
+  QCPItemAnchor * const bottomLeftRim;
+  QCPItemAnchor * const left;
+  QCPItemAnchor * const center;
+  
+protected:
+  enum AnchorIndex {aiTopLeftRim, aiTop, aiTopRightRim, aiRight, aiBottomRightRim, aiBottom, aiBottomLeftRim, aiLeft, aiCenter};
+  
+  // property members:
+  QPen mPen, mSelectedPen;
+  QBrush mBrush, mSelectedBrush;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual QPointF anchorPixelPoint(int anchorId) const;
+  
+  // non-virtual methods:
+  QPen mainPen() const;
+  QBrush mainBrush() const;
+};
+
+
+class QCP_LIB_DECL QCPItemPixmap : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap)
+  Q_PROPERTY(bool scaled READ scaled WRITE setScaled)
+  Q_PROPERTY(Qt::AspectRatioMode aspectRatioMode READ aspectRatioMode)
+  Q_PROPERTY(Qt::TransformationMode transformationMode READ transformationMode)
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  /// \endcond
+public:
+  QCPItemPixmap(QCustomPlot *parentPlot);
+  virtual ~QCPItemPixmap();
+  
+  // getters:
+  QPixmap pixmap() const { return mPixmap; }
+  bool scaled() const { return mScaled; }
+  Qt::AspectRatioMode aspectRatioMode() const { return mAspectRatioMode; }
+  Qt::TransformationMode transformationMode() const { return mTransformationMode; }
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  
+  // setters;
+  void setPixmap(const QPixmap &pixmap);
+  void setScaled(bool scaled, Qt::AspectRatioMode aspectRatioMode=Qt::KeepAspectRatio, Qt::TransformationMode transformationMode=Qt::SmoothTransformation);
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const topLeft;
+  QCPItemPosition * const bottomRight;
+  QCPItemAnchor * const top;
+  QCPItemAnchor * const topRight;
+  QCPItemAnchor * const right;
+  QCPItemAnchor * const bottom;
+  QCPItemAnchor * const bottomLeft;
+  QCPItemAnchor * const left;
+  
+protected:
+  enum AnchorIndex {aiTop, aiTopRight, aiRight, aiBottom, aiBottomLeft, aiLeft};
+  
+  // property members:
+  QPixmap mPixmap;
+  QPixmap mScaledPixmap;
+  bool mScaled;
+  bool mScaledPixmapInvalidated;
+  Qt::AspectRatioMode mAspectRatioMode;
+  Qt::TransformationMode mTransformationMode;
+  QPen mPen, mSelectedPen;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual QPointF anchorPixelPoint(int anchorId) const;
+  
+  // non-virtual methods:
+  void updateScaledPixmap(QRect finalRect=QRect(), bool flipHorz=false, bool flipVert=false);
+  QRect getFinalRect(bool *flippedHorz=0, bool *flippedVert=0) const;
+  QPen mainPen() const;
+};
+
+
+class QCP_LIB_DECL QCPItemTracer : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(QBrush brush READ brush WRITE setBrush)
+  Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush)
+  Q_PROPERTY(double size READ size WRITE setSize)
+  Q_PROPERTY(TracerStyle style READ style WRITE setStyle)
+  Q_PROPERTY(QCPGraph* graph READ graph WRITE setGraph)
+  Q_PROPERTY(double graphKey READ graphKey WRITE setGraphKey)
+  Q_PROPERTY(bool interpolating READ interpolating WRITE setInterpolating)
+  /// \endcond
+public:
+  /*!
+    The different visual appearances a tracer item can have. Some styles size may be controlled with \ref setSize.
+    
+    \see setStyle
+  */
+  enum TracerStyle { tsNone        ///< The tracer is not visible
+                     ,tsPlus       ///< A plus shaped crosshair with limited size
+                     ,tsCrosshair  ///< A plus shaped crosshair which spans the complete axis rect
+                     ,tsCircle     ///< A circle
+                     ,tsSquare     ///< A square
+                   };
+  Q_ENUMS(TracerStyle)
+
+  QCPItemTracer(QCustomPlot *parentPlot);
+  virtual ~QCPItemTracer();
+
+  // getters:
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  QBrush brush() const { return mBrush; }
+  QBrush selectedBrush() const { return mSelectedBrush; }
+  double size() const { return mSize; }
+  TracerStyle style() const { return mStyle; }
+  QCPGraph *graph() const { return mGraph; }
+  double graphKey() const { return mGraphKey; }
+  bool interpolating() const { return mInterpolating; }
+
+  // setters;
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setBrush(const QBrush &brush);
+  void setSelectedBrush(const QBrush &brush);
+  void setSize(double size);
+  void setStyle(TracerStyle style);
+  void setGraph(QCPGraph *graph);
+  void setGraphKey(double key);
+  void setInterpolating(bool enabled);
+
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  // non-virtual methods:
+  void updatePosition();
+
+  QCPItemPosition * const position;
+
+protected:
+  // property members:
+  QPen mPen, mSelectedPen;
+  QBrush mBrush, mSelectedBrush;
+  double mSize;
+  TracerStyle mStyle;
+  QCPGraph *mGraph;
+  double mGraphKey;
+  bool mInterpolating;
+
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+
+  // non-virtual methods:
+  QPen mainPen() const;
+  QBrush mainBrush() const;
+};
+
+
+class QCP_LIB_DECL QCPItemBracket : public QCPAbstractItem
+{
+  Q_OBJECT
+  /// \cond INCLUDE_QPROPERTIES
+  Q_PROPERTY(QPen pen READ pen WRITE setPen)
+  Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen)
+  Q_PROPERTY(double length READ length WRITE setLength)
+  Q_PROPERTY(BracketStyle style READ style WRITE setStyle)
+  /// \endcond
+public:
+  enum BracketStyle { bsSquare  ///< A brace with angled edges
+                      ,bsRound  ///< A brace with round edges
+                      ,bsCurly  ///< A curly brace
+                      ,bsCalligraphic ///< A curly brace with varying stroke width giving a calligraphic impression
+  };
+
+  QCPItemBracket(QCustomPlot *parentPlot);
+  virtual ~QCPItemBracket();
+  
+  // getters:
+  QPen pen() const { return mPen; }
+  QPen selectedPen() const { return mSelectedPen; }
+  double length() const { return mLength; }
+  BracketStyle style() const { return mStyle; }
+  
+  // setters;
+  void setPen(const QPen &pen);
+  void setSelectedPen(const QPen &pen);
+  void setLength(double length);
+  void setStyle(BracketStyle style);
+  
+  // reimplemented virtual methods:
+  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
+  
+  QCPItemPosition * const left;
+  QCPItemPosition * const right;
+  QCPItemAnchor * const center;
+  
+protected:
+  // property members:
+  enum AnchorIndex {aiCenter};
+  QPen mPen, mSelectedPen;
+  double mLength;
+  BracketStyle mStyle;
+  
+  // reimplemented virtual methods:
+  virtual void draw(QCPPainter *painter);
+  virtual QPointF anchorPixelPoint(int anchorId) const;
+  
+  // non-virtual methods:
+  QPen mainPen() const;
+};
+
+#endif // QCUSTOMPLOT_H
+
diff --git a/ThirdParty/GUI/qt-manhattan-style/CMakeLists.txt b/ThirdParty/GUI/qt-manhattan-style/CMakeLists.txt
new file mode 100644
index 0000000..990c2b0
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/CMakeLists.txt
@@ -0,0 +1,86 @@
+############################################################################
+# CMakeLists.txt file for building libManhattanStyle
+############################################################################
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+
+set(library_name ManhattanStyle)
+
+set(SRCS
+    stylehelper.cpp
+    styledbar.cpp
+    styleanimator.cpp
+    stringutils.cpp
+    qtcolorbutton.cpp
+    qtcassert.cpp
+    progressbar.cpp
+    minisplitter.cpp
+    manhattanstyle.cpp
+    historycompleter.cpp
+    fancytabwidget.cpp
+    fancymainwindow.cpp
+    fancylineedit.cpp
+    fancyactionbar.cpp
+    doubletabwidget.cpp
+    extensions/simpleprogressbar.cpp
+    stylehelper.h
+    styledbar.h
+    styleanimator.h
+    stringutils.h
+    qtcolorbutton.h
+    qtcolorbutton_p.h
+    qtcassert.h
+    progressbar.h
+    minisplitter.h
+    manhattanstyle.h
+    historycompleter.h
+    fancytabwidget.h
+    fancymainwindow.h
+    fancylineedit.h
+    fancyactionbar.h
+    doubletabwidget.h
+    coreconstants.h
+    qt-manhattan-style_global.hpp
+    extensions/simpleprogressbar.h
+    extensions/tabwidget.h
+    extensions/tabwidget.cpp
+    extensions/threelevelsitempicker.h
+    extensions/threelevelsitempicker.cpp
+)
+
+set(include_dirs ${CMAKE_CURRENT_SOURCE_DIR})
+include_directories(${include_dirs})
+
+set(RCS
+    resources/resources.qrc
+)
+
+set(UI_FILES
+    doubletabwidget.ui
+)
+
+# --- Qt5 ---------
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+
+qt5_wrap_ui(UI_HDRS ${UI_FILES})
+
+# --- definitions ---------
+add_definitions(-DQTMANHATTANSTYLE_LIBRARY)
+
+
+# --- library ---------
+add_library(${library_name} STATIC ${SRCS} ${UI_HDRS} ${RCS})
+set(${library_name}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+
+
+# --- dependencies ---------
+target_link_libraries(${library_name} ${Qt5Widgets_LIBRARIES})
+target_link_libraries(${library_name} Qt5::Widgets)
+
+
diff --git a/ThirdParty/GUI/qt-manhattan-style/README.md b/ThirdParty/GUI/qt-manhattan-style/README.md
new file mode 100644
index 0000000..9fc32a1
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/README.md
@@ -0,0 +1,5 @@
+qt-manhattan-style
+==================
+
+Extraction into a standalone library of the style and of some widgets used in
+QtCreator 2.6.2 application.
diff --git a/ThirdParty/GUI/qt-manhattan-style/coreconstants.h b/ThirdParty/GUI/qt-manhattan-style/coreconstants.h
new file mode 100644
index 0000000..6f10ad9
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/coreconstants.h
@@ -0,0 +1,235 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef CORECONSTANTS_H
+#define CORECONSTANTS_H
+
+#include <QtGlobal>
+
+namespace Manhattan {
+namespace Constants {
+
+// Modes
+const char MODE_WELCOME[]          = "Welcome";
+const char MODE_WELCOME_TYPE[]     = "Type.Welcome";
+const char MODE_EDIT[]             = "Edit";
+const char MODE_EDIT_TYPE[]        = "Type.Edit";
+const char MODE_DESIGN[]           = "Design";
+const char MODE_DESIGN_TYPE[]      = "Type.Design";
+const int  P_MODE_WELCOME          = 100;
+const int  P_MODE_EDIT             = 90;
+const int  P_MODE_DESIGN           = 89;
+
+// Menubar
+const char MENU_BAR[]              = "QtCreator.MenuBar";
+
+// Menus
+const char M_FILE[]                = "QtCreator.Menu.File";
+const char M_FILE_RECENTFILES[]    = "QtCreator.Menu.File.RecentFiles";
+const char M_EDIT[]                = "QtCreator.Menu.Edit";
+const char M_EDIT_ADVANCED[]       = "QtCreator.Menu.Edit.Advanced";
+const char M_TOOLS[]               = "QtCreator.Menu.Tools";
+const char M_TOOLS_EXTERNAL[]      = "QtCreator.Menu.Tools.External";
+const char M_WINDOW[]              = "QtCreator.Menu.Window";
+const char M_WINDOW_PANES[]        = "QtCreator.Menu.Window.Panes";
+const char M_WINDOW_VIEWS[]        = "QtCreator.Menu.Window.Views";
+const char M_HELP[]                = "QtCreator.Menu.Help";
+
+// Contexts
+const char C_GLOBAL[]              = "Global Context";
+const char C_WELCOME_MODE[]        = "Core.WelcomeMode";
+const char C_EDIT_MODE[]           = "Core.EditMode";
+const char C_DESIGN_MODE[]         = "Core.DesignMode";
+const char C_EDITORMANAGER[]       = "Core.EditorManager";
+const char C_NAVIGATION_PANE[]     = "Core.NavigationPane";
+const char C_PROBLEM_PANE[]        = "Core.ProblemPane";
+const char C_GENERAL_OUTPUT_PANE[] = "Core.GeneralOutputPane";
+
+// Default editor kind
+const char K_DEFAULT_TEXT_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("OpenWith::Editors", "Plain Text Editor");
+const char K_DEFAULT_TEXT_EDITOR_ID[] = "Core.PlainTextEditor";
+const char K_DEFAULT_BINARY_EDITOR_ID[] = "Core.BinaryEditor";
+
+//actions
+const char UNDO[]                  = "QtCreator.Undo";
+const char REDO[]                  = "QtCreator.Redo";
+const char COPY[]                  = "QtCreator.Copy";
+const char PASTE[]                 = "QtCreator.Paste";
+const char CUT[]                   = "QtCreator.Cut";
+const char SELECTALL[]             = "QtCreator.SelectAll";
+
+const char GOTO[]                  = "QtCreator.Goto";
+
+const char NEW[]                   = "QtCreator.New";
+const char OPEN[]                  = "QtCreator.Open";
+const char OPEN_WITH[]             = "QtCreator.OpenWith";
+const char REVERTTOSAVED[]         = "QtCreator.RevertToSaved";
+const char SAVE[]                  = "QtCreator.Save";
+const char SAVEAS[]                = "QtCreator.SaveAs";
+const char SAVEALL[]               = "QtCreator.SaveAll";
+const char PRINT[]                 = "QtCreator.Print";
+const char EXIT[]                  = "QtCreator.Exit";
+
+const char OPTIONS[]               = "QtCreator.Options";
+const char TOGGLE_SIDEBAR[]        = "QtCreator.ToggleSidebar";
+const char TOGGLE_FULLSCREEN[]     = "QtCreator.ToggleFullScreen";
+
+const char MINIMIZE_WINDOW[]       = "QtCreator.MinimizeWindow";
+const char ZOOM_WINDOW[]           = "QtCreator.ZoomWindow";
+
+const char SPLIT[]                 = "QtCreator.Split";
+const char SPLIT_SIDE_BY_SIDE[]    = "QtCreator.SplitSideBySide";
+const char REMOVE_CURRENT_SPLIT[]  = "QtCreator.RemoveCurrentSplit";
+const char REMOVE_ALL_SPLITS[]     = "QtCreator.RemoveAllSplits";
+const char GOTO_OTHER_SPLIT[]      = "QtCreator.GotoOtherSplit";
+const char CLOSE[]                 = "QtCreator.Close";
+#ifdef Q_OS_WIN
+const char CLOSE_ALTERNATIVE[]     = "QtCreator.Close_Alternative"; // temporary, see QTCREATORBUG-72
+#endif
+const char CLOSEALL[]              = "QtCreator.CloseAll";
+const char CLOSEOTHERS[]           = "QtCreator.CloseOthers";
+const char GOTONEXT[]              = "QtCreator.GotoNext";
+const char GOTOPREV[]              = "QtCreator.GotoPrevious";
+const char GOTONEXTINHISTORY[]     = "QtCreator.GotoNextInHistory";
+const char GOTOPREVINHISTORY[]     = "QtCreator.GotoPreviousInHistory";
+const char GO_BACK[]               = "QtCreator.GoBack";
+const char GO_FORWARD[]            = "QtCreator.GoForward";
+const char ABOUT_QTCREATOR[]       = "QtCreator.AboutQtCreator";
+const char ABOUT_PLUGINS[]         = "QtCreator.AboutPlugins";
+const char S_RETURNTOEDITOR[]      = "QtCreator.ReturnToEditor";
+
+// Default groups
+const char G_DEFAULT_ONE[]         = "QtCreator.Group.Default.One";
+const char G_DEFAULT_TWO[]         = "QtCreator.Group.Default.Two";
+const char G_DEFAULT_THREE[]       = "QtCreator.Group.Default.Three";
+
+// Main menu bar groups
+const char G_FILE[]                = "QtCreator.Group.File";
+const char G_EDIT[]                = "QtCreator.Group.Edit";
+const char G_VIEW[]                = "QtCreator.Group.View";
+const char G_TOOLS[]               = "QtCreator.Group.Tools";
+const char G_WINDOW[]              = "QtCreator.Group.Window";
+const char G_HELP[]                = "QtCreator.Group.Help";
+
+// File menu groups
+const char G_FILE_NEW[]            = "QtCreator.Group.File.New";
+const char G_FILE_OPEN[]           = "QtCreator.Group.File.Open";
+const char G_FILE_PROJECT[]        = "QtCreator.Group.File.Project";
+const char G_FILE_SAVE[]           = "QtCreator.Group.File.Save";
+const char G_FILE_CLOSE[]          = "QtCreator.Group.File.Close";
+const char G_FILE_PRINT[]          = "QtCreator.Group.File.Print";
+const char G_FILE_OTHER[]          = "QtCreator.Group.File.Other";
+
+// Edit menu groups
+const char G_EDIT_UNDOREDO[]       = "QtCreator.Group.Edit.UndoRedo";
+const char G_EDIT_COPYPASTE[]      = "QtCreator.Group.Edit.CopyPaste";
+const char G_EDIT_SELECTALL[]      = "QtCreator.Group.Edit.SelectAll";
+const char G_EDIT_ADVANCED[]       = "QtCreator.Group.Edit.Advanced";
+
+const char G_EDIT_FIND[]           = "QtCreator.Group.Edit.Find";
+const char G_EDIT_OTHER[]          = "QtCreator.Group.Edit.Other";
+
+// Advanced edit menu groups
+const char G_EDIT_FORMAT[]         = "QtCreator.Group.Edit.Format";
+const char G_EDIT_COLLAPSING[]     = "QtCreator.Group.Edit.Collapsing";
+const char G_EDIT_BLOCKS[]         = "QtCreator.Group.Edit.Blocks";
+const char G_EDIT_FONT[]           = "QtCreator.Group.Edit.Font";
+const char G_EDIT_EDITOR[]         = "QtCreator.Group.Edit.Editor";
+
+const char G_TOOLS_OPTIONS[]       = "QtCreator.Group.Tools.Options";
+
+// Window menu groups
+const char G_WINDOW_SIZE[]         = "QtCreator.Group.Window.Size";
+const char G_WINDOW_PANES[]        = "QtCreator.Group.Window.Panes";
+const char G_WINDOW_VIEWS[]        = "QtCreator.Group.Window.Views";
+const char G_WINDOW_SPLIT[]        = "QtCreator.Group.Window.Split";
+const char G_WINDOW_NAVIGATE[]     = "QtCreator.Group.Window.Navigate";
+const char G_WINDOW_OTHER[]        = "QtCreator.Group.Window.Other";
+
+// Help groups (global)
+const char G_HELP_HELP[]           = "QtCreator.Group.Help.Help";
+const char G_HELP_ABOUT[]          = "QtCreator.Group.Help.About";
+
+const char ICON_MINUS[]              = ":/core/images/minus.png";
+const char ICON_PLUS[]               = ":/core/images/plus.png";
+const char ICON_NEWFILE[]            = ":/core/images/filenew.png";
+const char ICON_OPENFILE[]           = ":/core/images/fileopen.png";
+const char ICON_SAVEFILE[]           = ":/core/images/filesave.png";
+const char ICON_UNDO[]               = ":/core/images/undo.png";
+const char ICON_REDO[]               = ":/core/images/redo.png";
+const char ICON_COPY[]               = ":/core/images/editcopy.png";
+const char ICON_PASTE[]              = ":/core/images/editpaste.png";
+const char ICON_CUT[]                = ":/core/images/editcut.png";
+const char ICON_NEXT[]               = ":/core/images/next.png";
+const char ICON_PREV[]               = ":/core/images/prev.png";
+const char ICON_DIR[]                = ":/core/images/dir.png";
+const char ICON_CLEAN_PANE[]         = ":/core/images/clean_pane_small.png";
+const char ICON_CLEAR[]              = ":/core/images/clear.png";
+const char ICON_RESET[]              = ":/core/images/reset.png";
+const char ICON_MAGNIFIER[]          = ":/core/images/magnifier.png";
+const char ICON_TOGGLE_SIDEBAR[]     = ":/core/images/sidebaricon.png";
+const char ICON_CLOSE_DOCUMENT[]     = ":/core/images/button_close.png";
+const char ICON_CLOSE[]              = ":/core/images/closebutton.png";
+const char ICON_CLOSE_DARK[]         = ":/core/images/darkclosebutton.png";
+const char ICON_SPLIT_HORIZONTAL[]   = ":/core/images/splitbutton_horizontal.png";
+const char ICON_SPLIT_VERTICAL[]     = ":/core/images/splitbutton_vertical.png";
+const char ICON_CLOSE_SPLIT_TOP[]    = ":/core/images/splitbutton_closetop.png";
+const char ICON_CLOSE_SPLIT_BOTTOM[] = ":/core/images/splitbutton_closebottom.png";
+const char ICON_CLOSE_SPLIT_LEFT[]   = ":/core/images/splitbutton_closeleft.png";
+const char ICON_CLOSE_SPLIT_RIGHT[]  = ":/core/images/splitbutton_closeright.png";
+const char ICON_FILTER[]             = ":/core/images/filtericon.png";
+const char ICON_LINK[]               = ":/core/images/linkicon.png";
+const char ICON_QTLOGO_32[]          = ":/core/images/logo/32/QtProject-qtcreator.png";
+const char ICON_QTLOGO_128[]         = ":/core/images/logo/128/QtProject-qtcreator.png";
+
+const char WIZARD_CATEGORY_QT[] = "R.Qt";
+const char WIZARD_TR_CATEGORY_QT[] = QT_TRANSLATE_NOOP("Core", "Qt");
+
+const char SETTINGS_CATEGORY_CORE[] = "A.Core";
+const char SETTINGS_CATEGORY_CORE_ICON[] = ":/core/images/category_core.png";
+const char SETTINGS_TR_CATEGORY_CORE[] = QT_TRANSLATE_NOOP("Core", "Environment");
+const char SETTINGS_ID_ENVIRONMENT[] = "A.General";
+const char SETTINGS_ID_SHORTCUTS[] = "B.Keyboard";
+const char SETTINGS_ID_TOOLS[] = "C.ExternalTools";
+const char SETTINGS_ID_MIMETYPES[] = "D.MimeTypes";
+
+const char SETTINGS_DEFAULTTEXTENCODING[] = "General/DefaultFileEncoding";
+
+const char ALL_FILES_FILTER[]      = QT_TRANSLATE_NOOP("Core", "All Files (*)");
+
+const char VARIABLE_SUPPORT_PROPERTY[] = "QtCreator.VariableSupport";
+
+const char TR_CLEAR_MENU[]         = QT_TRANSLATE_NOOP("Core", "Clear Menu");
+
+const int TARGET_ICON_SIZE = 32;
+
+} // namespace Manhattan
+} // namespace Core
+
+#endif // CORECONSTANTS_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.cpp b/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.cpp
new file mode 100644
index 0000000..92ed237
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.cpp
@@ -0,0 +1,535 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "doubletabwidget.h"
+#include "ui_doubletabwidget.h"
+
+#include "stylehelper.h"
+
+#include <QRect>
+#include <QPainter>
+#include <QFont>
+#include <QMouseEvent>
+#include <QMenu>
+#include <QToolTip>
+
+#include <QDebug>
+
+using namespace Manhattan;
+
+static const int MIN_LEFT_MARGIN = 50;
+static const int MARGIN = 12;
+static const int OTHER_HEIGHT = 38;
+static const int SELECTION_IMAGE_WIDTH = 10;
+static const int SELECTION_IMAGE_HEIGHT = 20;
+static const int OVERFLOW_DROPDOWN_WIDTH = Utils::StyleHelper::navigationWidgetHeight();
+
+static void drawFirstLevelSeparator(QPainter *painter, QPoint top, QPoint bottom)
+{
+    QLinearGradient grad(top, bottom);
+    grad.setColorAt(0, QColor(255, 255, 255, 20));
+    grad.setColorAt(0.4, QColor(255, 255, 255, 60));
+    grad.setColorAt(0.7, QColor(255, 255, 255, 50));
+    grad.setColorAt(1, QColor(255, 255, 255, 40));
+    painter->setPen(QPen(grad, 0));
+    painter->drawLine(top, bottom);
+    grad.setColorAt(0, QColor(0, 0, 0, 30));
+    grad.setColorAt(0.4, QColor(0, 0, 0, 70));
+    grad.setColorAt(0.7, QColor(0, 0, 0, 70));
+    grad.setColorAt(1, QColor(0, 0, 0, 40));
+    painter->setPen(QPen(grad, 0));
+    painter->drawLine(top - QPoint(1,0), bottom - QPoint(1,0));
+}
+
+static void drawSecondLevelSeparator(QPainter *painter, QPoint top, QPoint bottom)
+{
+    QLinearGradient grad(top, bottom);
+    grad.setColorAt(0, QColor(255, 255, 255, 0));
+    grad.setColorAt(0.4, QColor(255, 255, 255, 100));
+    grad.setColorAt(0.7, QColor(255, 255, 255, 100));
+    grad.setColorAt(1, QColor(255, 255, 255, 0));
+    painter->setPen(QPen(grad, 0));
+    painter->drawLine(top, bottom);
+    grad.setColorAt(0, QColor(0, 0, 0, 0));
+    grad.setColorAt(0.4, QColor(0, 0, 0, 100));
+    grad.setColorAt(0.7, QColor(0, 0, 0, 100));
+    grad.setColorAt(1, QColor(0, 0, 0, 0));
+    painter->setPen(QPen(grad, 0));
+    painter->drawLine(top - QPoint(1,0), bottom - QPoint(1,0));
+}
+
+DoubleTabWidget::DoubleTabWidget(QWidget *parent) :
+    QWidget(parent),
+    m_left(QLatin1String(":/projectexplorer/images/leftselection.png")),
+    m_mid(QLatin1String(":/projectexplorer/images/midselection.png")),
+    m_right(QLatin1String(":/projectexplorer/images/rightselection.png")),
+    ui(new Ui::DoubleTabWidget),
+    m_currentIndex(-1),
+    m_lastVisibleIndex(-1)
+{
+    ui->setupUi(this);
+}
+
+DoubleTabWidget::~DoubleTabWidget()
+{
+    delete ui;
+}
+
+int DoubleTabWidget::currentIndex() const
+{
+    return m_currentIndex;
+}
+
+void DoubleTabWidget::setCurrentIndex(int index)
+{
+    Q_ASSERT(index < m_tabs.size());
+    if (index == m_currentIndex)
+        return;
+    m_currentIndex = index;
+    emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab);
+    update();
+}
+
+int DoubleTabWidget::currentSubIndex() const
+{
+    if (m_currentIndex >= 0 && m_currentIndex < m_tabs.size())
+        return m_tabs.at(m_currentIndex).currentSubTab;
+    return -1;
+}
+
+void DoubleTabWidget::setTitle(const QString &title)
+{
+    m_title = title;
+    update();
+}
+
+QSize DoubleTabWidget::minimumSizeHint() const
+{
+    return QSize(0, Utils::StyleHelper::navigationWidgetHeight() + OTHER_HEIGHT + 1);
+}
+
+void DoubleTabWidget::updateNameIsUniqueAdd(Tab *tab)
+{
+    tab->nameIsUnique = true;
+    for (int i=0; i < m_tabs.size(); ++i) {
+        if (m_tabs.at(i).name == tab->name) {
+            m_tabs[i].nameIsUnique = false;
+            tab->nameIsUnique = false;
+            break;
+        }
+    }
+}
+
+void DoubleTabWidget::updateNameIsUniqueRemove(const Tab &tab)
+{
+    if (tab.nameIsUnique)
+        return;
+    int index;
+    int count = 0;
+    for (int i=0; i < m_tabs.size(); ++i) {
+        if (m_tabs.at(i).name == tab.name) {
+            ++count;
+            index = i;
+        }
+    }
+
+    if (count == 1)
+        m_tabs[index].nameIsUnique = true;
+}
+
+void DoubleTabWidget::addTab(const QString &name, const QString &fullName, const QStringList &subTabs)
+{
+    Tab tab;
+    tab.name = name;
+    tab.fullName = fullName;
+    tab.subTabs = subTabs;
+    tab.currentSubTab = tab.subTabs.isEmpty() ? -1 : 0;
+    updateNameIsUniqueAdd(&tab);
+
+    m_tabs.append(tab);
+    update();
+}
+
+void DoubleTabWidget::insertTab(int index, const QString &name, const QString &fullName, const QStringList &subTabs)
+{
+    Tab tab;
+    tab.name = name;
+    tab.fullName = fullName;
+    tab.subTabs = subTabs;
+    tab.currentSubTab = tab.subTabs.isEmpty() ? -1 : 0;
+    updateNameIsUniqueAdd(&tab);
+
+    m_tabs.insert(index, tab);
+    if (m_currentIndex >= index) {
+        ++m_currentIndex;
+        emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab);
+    }
+    update();
+}
+
+void DoubleTabWidget::removeTab(int index)
+{
+    Tab t = m_tabs.takeAt(index);
+    updateNameIsUniqueRemove(t);
+    if (index <= m_currentIndex) {
+        --m_currentIndex;
+        if (m_currentIndex < 0 && m_tabs.size() > 0)
+            m_currentIndex = 0;
+        if (m_currentIndex < 0) {
+            emit currentIndexChanged(-1, -1);
+        } else {
+            emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab);
+        }
+    }
+    update();
+}
+
+int DoubleTabWidget::tabCount() const
+{
+    return m_tabs.size();
+}
+
+/// Converts a position to the tab/subtab that is undeneath
+/// If HitArea is tab or subtab, then the second part of the pair
+/// is the tab or subtab number
+QPair<DoubleTabWidget::HitArea, int> DoubleTabWidget::convertPosToTab(QPoint pos)
+{
+    if (pos.y() < Utils::StyleHelper::navigationWidgetHeight()) {
+        // on the top level part of the bar
+        int eventX = pos.x();
+        QFontMetrics fm(font());
+        int x = m_title.isEmpty() ? 0 :
+                2 * MARGIN + qMax(fm.width(m_title), MIN_LEFT_MARGIN);
+
+        if (eventX <= x)
+            return qMakePair(HITNOTHING, -1);
+        int i;
+        for (i = 0; i <= m_lastVisibleIndex; ++i) {
+            int otherX = x + 2 * MARGIN + fm.width(m_tabs.at(
+                    m_currentTabIndices.at(i)).displayName());
+            if (eventX > x && eventX < otherX) {
+                break;
+            }
+            x = otherX;
+        }
+        if (i <= m_lastVisibleIndex) {
+            return qMakePair(HITTAB, i);
+        } else if (m_lastVisibleIndex < m_tabs.size() - 1) {
+            // handle overflow menu
+            if (eventX > x && eventX < x + OVERFLOW_DROPDOWN_WIDTH) {
+                return qMakePair(HITOVERFLOW, -1);
+            }
+        }
+    } else if (pos.y() < Utils::StyleHelper::navigationWidgetHeight() + OTHER_HEIGHT) {
+        int diff = (OTHER_HEIGHT - SELECTION_IMAGE_HEIGHT) / 2;
+        if (pos.y() < Utils::StyleHelper::navigationWidgetHeight() + diff
+                || pos.y() > Utils::StyleHelper::navigationWidgetHeight() + OTHER_HEIGHT - diff)
+            return qMakePair(HITNOTHING, -1);
+        // on the lower level part of the bar
+        if (m_currentIndex == -1)
+            return qMakePair(HITNOTHING, -1);
+        Tab currentTab = m_tabs.at(m_currentIndex);
+        QStringList subTabs = currentTab.subTabs;
+        if (subTabs.isEmpty())
+            return qMakePair(HITNOTHING, -1);
+        int eventX = pos.x();
+        QFontMetrics fm(font());
+        int x = MARGIN;
+        int i;
+        for (i = 0; i < subTabs.size(); ++i) {
+            int otherX = x + 2 * SELECTION_IMAGE_WIDTH + fm.width(subTabs.at(i));
+            if (eventX > x && eventX < otherX) {
+                break;
+            }
+            x = otherX + 2 * MARGIN;
+        }
+        if (i < subTabs.size()) {
+            return qMakePair(HITSUBTAB, i);
+        }
+    }
+    return qMakePair(HITNOTHING, -1);
+}
+
+void DoubleTabWidget::mousePressEvent(QMouseEvent *event)
+{
+    // todo:
+    // the even wasn't accepted/ignored in a consistent way
+    // now the event is accepted everywhere were it hitted something interesting
+    // and otherwise ignored
+    // should not make any difference
+    QPair<HitArea, int> hit = convertPosToTab(event->pos());
+    if (hit.first == HITTAB) {
+        if (m_currentIndex != m_currentTabIndices.at(hit.second)) {
+            m_currentIndex = m_currentTabIndices.at(hit.second);
+            update();
+            event->accept();
+            emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab);
+            return;
+        }
+    } else if (hit.first == HITOVERFLOW) {
+        QMenu overflowMenu;
+        QList<QAction *> actions;
+        for (int i = m_lastVisibleIndex + 1; i < m_tabs.size(); ++i) {
+            actions << overflowMenu.addAction(m_tabs.at(m_currentTabIndices.at(i)).displayName());
+        }
+        if (QAction *action = overflowMenu.exec(event->globalPos())) { // todo used different position before
+            int index = m_currentTabIndices.at(actions.indexOf(action) + m_lastVisibleIndex + 1);
+            if (m_currentIndex != index) {
+                m_currentIndex = index;
+                update();
+                event->accept();
+                emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab);
+                return;
+            }
+        }
+    } else if (hit.first == HITSUBTAB) {
+        if (m_tabs[m_currentIndex].currentSubTab != hit.second) {
+            m_tabs[m_currentIndex].currentSubTab = hit.second;
+            update();
+            // todo next two lines were outside the if leading to
+            // unnecessary (?) signal emissions?
+            event->accept();
+            emit currentIndexChanged(m_currentIndex, m_tabs.at(m_currentIndex).currentSubTab);
+            return;
+        }
+    }
+    event->ignore();
+}
+
+void DoubleTabWidget::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+    QPainter painter(this);
+    QRect r = rect();
+
+    // draw top level tab bar
+    r.setHeight(Utils::StyleHelper::navigationWidgetHeight());
+
+    QPoint offset = window()->mapToGlobal(QPoint(0, 0)) - mapToGlobal(r.topLeft());
+    QRect gradientSpan = QRect(offset, window()->size());
+    Utils::StyleHelper::horizontalGradient(&painter, gradientSpan, r);
+
+    painter.setPen(Utils::StyleHelper::borderColor());
+
+    QColor lighter(255, 255, 255, 40);
+    painter.drawLine(r.bottomLeft(), r.bottomRight());
+    painter.setPen(lighter);
+    painter.drawLine(r.topLeft(), r.topRight());
+
+    QFontMetrics fm(font());
+    int baseline = (r.height() + fm.ascent()) / 2 - 1;
+
+    // top level title
+    if (!m_title.isEmpty()) {
+        painter.setPen(Utils::StyleHelper::panelTextColor());
+        painter.drawText(MARGIN, baseline, m_title);
+    }
+
+    QLinearGradient grad(QPoint(0, 0), QPoint(0, r.height() + OTHER_HEIGHT - 1));
+    grad.setColorAt(0, QColor(247, 247, 247));
+    grad.setColorAt(1, QColor(205, 205, 205));
+
+    // draw background of second bar
+    painter.fillRect(QRect(0, r.height(), r.width(), OTHER_HEIGHT), grad);
+    painter.setPen(QColor(0x505050));
+    painter.drawLine(0, r.height() + OTHER_HEIGHT,
+                     r.width(), r.height() + OTHER_HEIGHT);
+    painter.setPen(Qt::white);
+    painter.drawLine(0, r.height(),
+                     r.width(), r.height());
+
+    // top level tabs
+    int x = m_title.isEmpty() ? 0 :
+            2 * MARGIN + qMax(fm.width(m_title), MIN_LEFT_MARGIN);
+
+    // calculate sizes
+    QList<int> nameWidth;
+    int width = x;
+    int indexSmallerThanOverflow = -1;
+    int indexSmallerThanWidth = -1;
+    for (int i = 0; i < m_tabs.size(); ++i) {
+        const Tab &tab = m_tabs.at(i);
+        int w = fm.width(tab.displayName());
+        nameWidth << w;
+        width += 2 * MARGIN + w;
+        if (width < r.width())
+            indexSmallerThanWidth = i;
+        if (width < r.width() - OVERFLOW_DROPDOWN_WIDTH)
+            indexSmallerThanOverflow = i;
+    }
+    m_lastVisibleIndex = -1;
+    m_currentTabIndices.resize(m_tabs.size());
+    if (indexSmallerThanWidth == m_tabs.size() - 1) {
+        // => everything fits
+        for (int i = 0; i < m_tabs.size(); ++i)
+            m_currentTabIndices[i] = i;
+        m_lastVisibleIndex = m_tabs.size()-1;
+    } else {
+        // => we need the overflow thingy
+        if (m_currentIndex <= indexSmallerThanOverflow) {
+            // easy going, simply draw everything that fits
+            for (int i = 0; i < m_tabs.size(); ++i)
+                m_currentTabIndices[i] = i;
+            m_lastVisibleIndex = indexSmallerThanOverflow;
+        } else {
+            // now we need to put the current tab into
+            // visible range. for that we need to find the place
+            // to put it, so it fits
+            width = x;
+            int index = 0;
+            bool handledCurrentIndex = false;
+            for (int i = 0; i < m_tabs.size(); ++i) {
+                if (index != m_currentIndex) {
+                    if (!handledCurrentIndex) {
+                        // check if enough room for current tab after this one
+                        if (width + 2 * MARGIN + nameWidth.at(index)
+                                + 2 * MARGIN + nameWidth.at(m_currentIndex)
+                                < r.width() - OVERFLOW_DROPDOWN_WIDTH) {
+                            m_currentTabIndices[i] = index;
+                            ++index;
+                            width += 2 * MARGIN + nameWidth.at(index);
+                        } else {
+                            m_currentTabIndices[i] = m_currentIndex;
+                            handledCurrentIndex = true;
+                            m_lastVisibleIndex = i;
+                        }
+                    } else {
+                        m_currentTabIndices[i] = index;
+                        ++index;
+                    }
+                } else {
+                    ++index;
+                    --i;
+                }
+            }
+        }
+    }
+
+    // actually draw top level tabs
+    for (int i = 0; i <= m_lastVisibleIndex; ++i) {
+        int actualIndex = m_currentTabIndices.at(i);
+        Tab tab = m_tabs.at(actualIndex);
+        if (actualIndex == m_currentIndex) {
+            painter.setPen(Utils::StyleHelper::borderColor());
+            painter.drawLine(x - 1, 0, x - 1, r.height() - 1);
+            painter.fillRect(QRect(x, 0,
+                                   2 * MARGIN + fm.width(tab.displayName()),
+                                   r.height() + 1),
+                             grad);
+
+            if (actualIndex != 0) {
+                painter.setPen(QColor(255, 255, 255, 170));
+                painter.drawLine(x, 0, x, r.height());
+            }
+            x += MARGIN;
+            painter.setPen(Qt::black);
+            painter.drawText(x, baseline, tab.displayName());
+            x += nameWidth.at(actualIndex);
+            x += MARGIN;
+            painter.setPen(Utils::StyleHelper::borderColor());
+            painter.drawLine(x, 0, x, r.height() - 1);
+            painter.setPen(QColor(0, 0, 0, 20));
+            painter.drawLine(x + 1, 0, x + 1, r.height() - 1);
+            painter.setPen(QColor(255, 255, 255, 170));
+            painter.drawLine(x - 1, 0, x - 1, r.height());
+        } else {
+            if (i == 0)
+                drawFirstLevelSeparator(&painter, QPoint(x, 0), QPoint(x, r.height()-1));
+            x += MARGIN;
+            painter.setPen(Utils::StyleHelper::panelTextColor());
+            painter.drawText(x + 1, baseline, tab.displayName());
+            x += nameWidth.at(actualIndex);
+            x += MARGIN;
+            drawFirstLevelSeparator(&painter, QPoint(x, 0), QPoint(x, r.height()-1));
+        }
+    }
+
+    // draw overflow button
+    if (m_lastVisibleIndex < m_tabs.size() - 1) {
+        QStyleOption opt;
+        opt.rect = QRect(x, 0, OVERFLOW_DROPDOWN_WIDTH - 1, r.height() - 1);
+        style()->drawPrimitive(QStyle::PE_IndicatorArrowDown,
+                               &opt, &painter, this);
+        drawFirstLevelSeparator(&painter, QPoint(x + OVERFLOW_DROPDOWN_WIDTH, 0),
+                                QPoint(x + OVERFLOW_DROPDOWN_WIDTH, r.height()-1));
+    }
+
+    // second level tabs
+    if (m_currentIndex != -1) {
+        int y = r.height() + (OTHER_HEIGHT - m_left.height()) / 2.;
+        int imageHeight = m_left.height();
+        Tab currentTab = m_tabs.at(m_currentIndex);
+        QStringList subTabs = currentTab.subTabs;
+        x = 0;
+        for (int i = 0; i < subTabs.size(); ++i) {
+            x += MARGIN;
+            int textWidth = fm.width(subTabs.at(i));
+            if (currentTab.currentSubTab == i) {
+                painter.setPen(Qt::white);
+                painter.drawPixmap(x, y, m_left);
+                painter.drawPixmap(QRect(x + SELECTION_IMAGE_WIDTH, y,
+                                         textWidth, imageHeight),
+                                   m_mid, QRect(0, 0, m_mid.width(), m_mid.height()));
+                painter.drawPixmap(x + SELECTION_IMAGE_WIDTH + textWidth, y, m_right);
+            } else {
+                painter.setPen(Qt::black);
+            }
+            x += SELECTION_IMAGE_WIDTH;
+            painter.drawText(x, y + (imageHeight + fm.ascent()) / 2. - 1,
+                             subTabs.at(i));
+            x += textWidth + SELECTION_IMAGE_WIDTH + MARGIN;
+            drawSecondLevelSeparator(&painter, QPoint(x, y), QPoint(x, y + imageHeight));
+        }
+    }
+}
+
+void DoubleTabWidget::changeEvent(QEvent *e)
+{
+    QWidget::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+bool DoubleTabWidget::event(QEvent *event)
+{
+    if (event->type() == QEvent::ToolTip) {
+        QHelpEvent *helpevent = static_cast<QHelpEvent*>(event);
+        QPair<HitArea, int> hit = convertPosToTab(helpevent->pos());
+        if (hit.first == HITTAB && m_tabs.at(m_currentTabIndices.at(hit.second)).nameIsUnique)
+            QToolTip::showText(helpevent->globalPos(), m_tabs.at(m_currentTabIndices.at(hit.second)).fullName, this);
+        else
+            QToolTip::showText(helpevent->globalPos(), QString(), this);
+    }
+    return QWidget::event(event);
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.h b/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.h
new file mode 100644
index 0000000..e176b04
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef DOUBLETABWIDGET_H
+#define DOUBLETABWIDGET_H
+
+#include <QVector>
+#include <QWidget>
+#include <QPixmap>
+
+namespace Manhattan {
+
+namespace Ui {
+    class DoubleTabWidget;
+}
+
+class DoubleTabWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    DoubleTabWidget(QWidget *parent = 0);
+    virtual ~DoubleTabWidget();
+
+    void setTitle(const QString &title);
+    QString title() const { return m_title; }
+
+    void addTab(const QString &name, const QString &fullName, const QStringList &subTabs);
+    void insertTab(int index, const QString &name, const QString &fullName, const QStringList &subTabs);
+    void removeTab(int index);
+    int tabCount() const;
+
+    int currentIndex() const;
+    void setCurrentIndex(int index);
+
+    int currentSubIndex() const;
+
+signals:
+    void currentIndexChanged(int index, int subIndex);
+
+protected:
+    virtual void paintEvent(QPaintEvent *event);
+    virtual void mousePressEvent(QMouseEvent *event);
+    virtual void changeEvent(QEvent *e);
+    virtual bool event(QEvent *event);
+    virtual QSize minimumSizeHint() const;
+
+private:
+    struct Tab {
+        QString name;
+        QString fullName;
+        bool nameIsUnique;
+        QStringList subTabs;
+        int currentSubTab;
+        QString displayName() const {
+            return nameIsUnique ? name : fullName;
+        }
+    };
+    void updateNameIsUniqueAdd(Tab *tab);
+    void updateNameIsUniqueRemove(const Tab &tab);
+
+    enum HitArea { HITNOTHING, HITOVERFLOW, HITTAB, HITSUBTAB };
+    QPair<DoubleTabWidget::HitArea, int> convertPosToTab(QPoint pos);
+
+    const QPixmap m_left;
+    const QPixmap m_mid;
+    const QPixmap m_right;
+
+    Ui::DoubleTabWidget *ui;
+
+
+    QString m_title;
+    QList<Tab> m_tabs;
+    int m_currentIndex;
+    QVector<int> m_currentTabIndices;
+    int m_lastVisibleIndex;
+};
+
+} // namespace Manhattan
+
+#endif // DOUBLETABWIDGET_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.ui b/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.ui
new file mode 100644
index 0000000..f397474
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/doubletabwidget.ui
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Manhattan::DoubleTabWidget</class>
+ <widget class="QWidget" name="Manhattan::DoubleTabWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>600</width>
+    <height>400</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>DoubleTabWidget</string>
+  </property>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ThirdParty/GUI/qt-manhattan-style/extensions/simpleprogressbar.cpp b/ThirdParty/GUI/qt-manhattan-style/extensions/simpleprogressbar.cpp
new file mode 100644
index 0000000..158121d
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/extensions/simpleprogressbar.cpp
@@ -0,0 +1,144 @@
+#include "simpleprogressbar.h"
+#include "../stylehelper.h"
+
+#include <QPainter>
+#include <QBrush>
+#include <QColor>
+
+using namespace Manhattan;
+
+SimpleProgressBar::SimpleProgressBar(int width, int height, QWidget *parent)
+    : QWidget(parent)
+    , m_error(false)
+    , m_progressHeight(height + ((height % 2) + 1) % 2) // make odd
+    , m_progressWidth(width)
+    , m_minimum(1)
+    , m_maximum(100)
+    , m_value(1)
+    , m_finished(false)
+{
+    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+}
+
+SimpleProgressBar::~SimpleProgressBar()
+{
+}
+
+void SimpleProgressBar::reset()
+{
+    m_value = m_minimum;
+    m_finished = false;
+    m_error = false;
+    update();
+}
+
+void SimpleProgressBar::setRange(int minimum, int maximum)
+{
+    m_minimum = minimum;
+    m_maximum = maximum;
+    if (m_value < m_minimum || m_value > m_maximum)
+        m_value = m_minimum;
+    update();
+}
+
+void SimpleProgressBar::setValue(int value)
+{
+    if (m_value == value
+            || m_value < m_minimum
+            || m_value > m_maximum) {
+        return;
+    }
+    m_value = value;
+    update();
+}
+
+void SimpleProgressBar::setFinished(bool b)
+{
+    if (b == m_finished)
+        return;
+    m_finished = b;
+    update();
+}
+
+bool SimpleProgressBar::hasError() const
+{
+    return m_error;
+}
+
+void SimpleProgressBar::setError(bool on)
+{
+    m_error = on;
+    update();
+}
+
+QSize SimpleProgressBar::sizeHint() const
+{
+    QSize s;
+    s.setWidth(m_progressWidth + 6);
+    s.setHeight(m_progressHeight + 6);
+    return s;
+}
+
+void SimpleProgressBar::paintEvent(QPaintEvent *)
+{
+    if (bar.isNull())
+        bar.load(QLatin1String(":/core/images/progressbar.png"));
+
+    double range = maximum() - minimum();
+    double percent = 0.;
+    if (range != 0)
+        percent = (value() - minimum()) / range;
+    if (percent > 1)
+        percent = 1;
+    else if (percent < 0)
+        percent = 0;
+
+    if (finished())
+        percent = 1;
+
+    QPainter p(this);
+
+    // draw outer rect
+    QRect rect((size().width() - m_progressWidth) / 2, (size().height() - m_progressHeight) / 2, m_progressWidth, m_progressHeight-1);
+    p.setPen(Utils::StyleHelper::panelTextColor());
+    Utils::StyleHelper::drawCornerImage(bar, &p, rect, 2, 2, 2, 2);
+
+    // draw inner rect
+    QColor c = Utils::StyleHelper::panelTextColor();
+    c.setAlpha(180);
+    p.setPen(Qt::NoPen);
+
+    QRect inner = rect.adjusted(3, 2, -2, -2);
+    inner.adjust(0, 0, qRound((percent - 1) * inner.width()), 0);
+    if (m_error) {
+        QColor red(255, 60, 0, 210);
+        c = red;
+        // avoid too small red bar
+        if (inner.width() < 10)
+            inner.adjust(0, 0, 10 - inner.width(), 0);
+    } else if (m_finished) {
+        c = QColor(90, 170, 60);
+    }
+
+    // Draw line and shadow after the gradient fill
+    if (value() > 0 && value() < maximum()) {
+        p.fillRect(QRect(inner.right() + 1, inner.top(), 2, inner.height()), QColor(0, 0, 0, 20));
+        p.fillRect(QRect(inner.right() + 1, inner.top(), 1, inner.height()), QColor(0, 0, 0, 60));
+    }
+    QLinearGradient grad(inner.topLeft(), inner.bottomLeft());
+    grad.setColorAt(0, c.lighter(130));
+    grad.setColorAt(0.5, c.lighter(106));
+    grad.setColorAt(0.51, c.darker(106));
+    grad.setColorAt(1, c.darker(130));
+    p.setPen(Qt::NoPen);
+    p.setBrush(grad);
+    p.drawRect(inner);
+    p.setBrush(Qt::NoBrush);
+    p.setPen(QPen(QColor(0, 0, 0, 30), 1));
+    p.drawLine(inner.topLeft(), inner.topRight());
+    p.drawLine(inner.topLeft(), inner.bottomLeft());
+    p.drawLine(inner.topRight(), inner.bottomRight());
+    p.drawLine(inner.bottomLeft(), inner.bottomRight());
+    p.drawPoint(inner.bottomLeft());
+    p.drawPoint(inner.bottomRight());
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/extensions/simpleprogressbar.h b/ThirdParty/GUI/qt-manhattan-style/extensions/simpleprogressbar.h
new file mode 100644
index 0000000..064ddfa
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/extensions/simpleprogressbar.h
@@ -0,0 +1,46 @@
+#ifndef SIMPLEPROGRESSBAR_H
+#define SIMPLEPROGRESSBAR_H
+
+#include "../qt-manhattan-style_global.hpp"
+#include <QWidget>
+
+namespace Manhattan {
+
+class QTMANHATTANSTYLESHARED_EXPORT SimpleProgressBar : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit SimpleProgressBar(int width = 50, int height = 12, QWidget *parent = 0);
+    virtual ~SimpleProgressBar();
+
+    void setError(bool on);
+    bool hasError() const;
+    virtual QSize sizeHint() const;
+    virtual void paintEvent(QPaintEvent *);
+    int minimum() const { return m_minimum; }
+    int maximum() const { return m_maximum; }
+    int value() const { return m_value; }
+    bool finished() const { return m_finished; }
+    void setRange(int minimum, int maximum);
+    void setValue(int value);
+    void setFinished(bool b);
+
+public slots:
+    void reset();
+
+private:
+    QImage bar;
+    QString m_text;
+    bool m_error;
+    int m_progressHeight;
+    int m_progressWidth;
+    int m_minimum;
+    int m_maximum;
+    int m_value;
+    bool m_finished;
+};
+
+} // namespace Manhattan
+
+#endif // SIMPLEPROGRESSBAR_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/extensions/tabwidget.cpp b/ThirdParty/GUI/qt-manhattan-style/extensions/tabwidget.cpp
new file mode 100644
index 0000000..c84c21f
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/extensions/tabwidget.cpp
@@ -0,0 +1,413 @@
+#include "tabwidget.h"
+#include "../stylehelper.h"
+#include <QRect>
+#include <QPainter>
+#include <QFont>
+#include <QMouseEvent>
+#include <QMenu>
+#include <QToolTip>
+#include <QStyleOption>
+#include <QVBoxLayout>
+#include <QStackedWidget>
+#include <QDebug>
+
+using namespace Manhattan;
+
+static const int MIN_LEFT_MARGIN = 50;
+static const int MARGIN = 12;
+static const int TAB_HEIGHT = 24;
+static const int CONTENT_HEIGHT_MARGIN = 10;
+//static const int SELECTION_IMAGE_WIDTH = 10;
+//static const int SELECTION_IMAGE_HEIGHT = 20;
+static const int OVERFLOW_DROPDOWN_WIDTH = TAB_HEIGHT;
+
+static void drawFirstLevelSeparator(QPainter *painter, QPoint top, QPoint bottom)
+{
+    painter->setPen(QPen(QColor(Qt::white).darker(110), 0));
+    painter->drawLine(top, bottom);
+    painter->setPen(QPen(Qt::gray, 0));
+    painter->drawLine(top - QPoint(1,0), bottom - QPoint(1,0));
+}
+
+TabWidget::TabWidget(QWidget *parent) :
+    QWidget(parent),
+    m_currentIndex(-1),
+    m_lastVisibleIndex(-1),
+    m_stack(0),
+    m_drawFrame(false)
+{
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->setContentsMargins(0, TAB_HEIGHT + CONTENT_HEIGHT_MARGIN + 1, 0, 0);
+    m_stack = new QStackedWidget;
+    layout->addWidget(m_stack);
+    setLayout(layout);
+
+    connect(this, SIGNAL(currentIndexChanged(int)), m_stack, SLOT(setCurrentIndex(int)));
+}
+
+TabWidget::~TabWidget()
+{
+}
+
+int TabWidget::currentIndex() const
+{
+    return m_currentIndex;
+}
+
+void TabWidget::setCurrentIndex(int index)
+{
+    Q_ASSERT(index < m_tabs.size());
+    if (index == m_currentIndex)
+        return;
+    m_currentIndex = index;
+    emit currentIndexChanged(m_currentIndex);
+    update();
+}
+
+void TabWidget::setTitle(const QString &title)
+{
+    m_title = title;
+    update();
+}
+
+void TabWidget::setFrameVisible(bool visible)
+{
+    if (visible != m_drawFrame) {
+        m_drawFrame = visible;
+        update();
+    }
+}
+
+void TabWidget::addTab(const QString &name, QWidget *widget, const QColor &color)
+{
+    Q_ASSERT(widget);
+    Tab tab;
+    tab.name = name;
+    tab.color = color;
+    tab.widget = widget;
+    m_tabs.append(tab);
+    m_stack->addWidget(widget);
+    if (m_currentIndex == -1) {
+        m_currentIndex = 0;
+        emit currentIndexChanged(m_currentIndex);
+    }
+    update();
+}
+
+void TabWidget::insertTab(int index, const QString &name, QWidget *widget, const QColor &color)
+{
+    Q_ASSERT(widget);
+    Tab tab;
+    tab.name = name;
+    tab.color = color;
+    tab.widget = widget;
+    m_tabs.insert(index, tab);
+    m_stack->insertWidget(index, widget);
+    if (m_currentIndex >= index) {
+        ++m_currentIndex;
+        emit currentIndexChanged(m_currentIndex);
+    }
+    update();
+}
+
+QWidget* TabWidget::removeTab(int index)
+{
+    Tab tab = m_tabs.takeAt(index);
+    if (index <= m_currentIndex) {
+        --m_currentIndex;
+        if (m_currentIndex < 0 && m_tabs.size() > 0)
+            m_currentIndex = 0;
+        if (m_currentIndex < 0) {
+            emit currentIndexChanged(-1);
+        } else {
+            emit currentIndexChanged(m_currentIndex);
+        }
+    }
+    update();
+    return tab.widget;
+}
+
+int TabWidget::tabCount() const
+{
+    return m_tabs.size();
+}
+
+QString TabWidget::tabText(int index) const
+{
+    return m_tabs.value(index).name;
+}
+
+/// Converts a position to the tab that is undeneath
+/// If HitArea is tab, then the second part of the pair
+/// is the tab number
+QPair<TabWidget::HitArea, int> TabWidget::convertPosToTab(QPoint pos)
+{
+    if (pos.y() < TAB_HEIGHT) {
+        // on the top level part of the bar
+        int eventX = pos.x();
+        QFontMetrics fm(font());
+        int x = m_title.isEmpty() ? 0 :
+                2 * MARGIN + qMax(fm.width(m_title), MIN_LEFT_MARGIN);
+
+        if (eventX <= x)
+            return qMakePair(HITNOTHING, -1);
+        int i;
+        for (i = 0; i <= m_lastVisibleIndex; ++i) {
+            int otherX = x + 2 * MARGIN + fm.width(m_tabs.at(
+                    m_currentTabIndices.at(i)).name);
+            if (eventX > x && eventX < otherX) {
+                break;
+            }
+            x = otherX;
+        }
+        if (i <= m_lastVisibleIndex) {
+            return qMakePair(HITTAB, i);
+        } else if (m_lastVisibleIndex < m_tabs.size() - 1) {
+            // handle overflow menu
+            if (eventX > x && eventX < x + OVERFLOW_DROPDOWN_WIDTH) {
+                return qMakePair(HITOVERFLOW, -1);
+            }
+        }
+    }
+
+    return qMakePair(HITNOTHING, -1);
+}
+
+void TabWidget::mousePressEvent(QMouseEvent *event)
+{
+    // todo:
+    // the even wasn't accepted/ignored in a consistent way
+    // now the event is accepted everywhere were it hitted something interesting
+    // and otherwise ignored
+    // should not make any difference
+    QPair<HitArea, int> hit = convertPosToTab(event->pos());
+    if (hit.first == HITTAB) {
+        if (m_currentIndex != m_currentTabIndices.at(hit.second)) {
+            m_currentIndex = m_currentTabIndices.at(hit.second);
+            update();
+            event->accept();
+            emit currentIndexChanged(m_currentIndex);
+            return;
+        }
+    } else if (hit.first == HITOVERFLOW) {
+        QMenu overflowMenu;
+        QList<QAction *> actions;
+        for (int i = m_lastVisibleIndex + 1; i < m_tabs.size(); ++i) {
+            actions << overflowMenu.addAction(m_tabs.at(m_currentTabIndices.at(i)).name);
+        }
+        if (QAction *action = overflowMenu.exec(event->globalPos())) { // todo used different position before
+            int index = m_currentTabIndices.at(actions.indexOf(action) + m_lastVisibleIndex + 1);
+            if (m_currentIndex != index) {
+                m_currentIndex = index;
+                update();
+                event->accept();
+                emit currentIndexChanged(m_currentIndex);
+                return;
+            }
+        }
+    }
+
+    event->ignore();
+}
+
+void TabWidget::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+    QPainter painter(this);
+    QRect r = rect();
+
+    QColor baseColor = palette().window().color();
+    QColor backgroundColor = baseColor.darker(110);
+    QColor lineColor = backgroundColor.darker();
+
+    // draw top level tab bar
+    r.setHeight(TAB_HEIGHT);
+
+    // Fill top bar background
+    if (!m_drawFrame)
+        painter.fillRect(r, backgroundColor);
+
+    QFontMetrics fm(font());
+    int baseline = (r.height() + fm.ascent()) / 2 - 1;
+
+    // top level title
+    if (!m_title.isEmpty()) {
+        painter.setPen(Utils::StyleHelper::panelTextColor());
+        painter.drawText(MARGIN, baseline, m_title);
+    }
+    // draw content background
+    QRect content(r);
+    content.setTop(r.height());
+    content.setHeight(height() - r.height());
+    painter.fillRect(content, baseColor);
+
+    // frames
+    if (m_drawFrame) {
+        painter.setPen(lineColor);
+        painter.drawRect(content.adjusted(0, 0, -1, -1));
+    }
+    else {
+        painter.setPen(lineColor);
+        painter.drawLine(r.left(), r.height(), r.right(), r.height());
+    }
+
+    // top level tabs
+    int x = m_title.isEmpty() ? 0 :
+            2 * MARGIN + qMax(fm.width(m_title), MIN_LEFT_MARGIN);
+
+    // calculate sizes
+    QList<int> nameWidth;
+    int width = x;
+    int indexSmallerThanOverflow = -1;
+    int indexSmallerThanWidth = -1;
+    for (int i = 0; i < m_tabs.size(); ++i) {
+        const Tab& tab = m_tabs.at(i);
+        int w = fm.width(tab.name);
+        nameWidth << w;
+        width += 2 * MARGIN + w;
+        if (width < r.width())
+            indexSmallerThanWidth = i;
+        if (width < r.width() - OVERFLOW_DROPDOWN_WIDTH)
+            indexSmallerThanOverflow = i;
+    }
+    m_lastVisibleIndex = -1;
+    m_currentTabIndices.resize(m_tabs.size());
+    if (indexSmallerThanWidth == m_tabs.size() - 1) {
+        // => everything fits
+        for (int i = 0; i < m_tabs.size(); ++i)
+            m_currentTabIndices[i] = i;
+        m_lastVisibleIndex = m_tabs.size()-1;
+    } else {
+        // => we need the overflow thingy
+        if (m_currentIndex <= indexSmallerThanOverflow) {
+            // easy going, simply draw everything that fits
+            for (int i = 0; i < m_tabs.size(); ++i)
+                m_currentTabIndices[i] = i;
+            m_lastVisibleIndex = indexSmallerThanOverflow;
+        } else {
+            // now we need to put the current tab into
+            // visible range. for that we need to find the place
+            // to put it, so it fits
+            width = x;
+            int index = 0;
+            bool handledCurrentIndex = false;
+            for (int i = 0; i < m_tabs.size(); ++i) {
+                if (index != m_currentIndex) {
+                    if (!handledCurrentIndex) {
+                        // check if enough room for current tab after this one
+                        if (width + 2 * MARGIN + nameWidth.at(index)
+                                + 2 * MARGIN + nameWidth.at(m_currentIndex)
+                                < r.width() - OVERFLOW_DROPDOWN_WIDTH) {
+                            m_currentTabIndices[i] = index;
+                            ++index;
+                            width += 2 * MARGIN + nameWidth.at(index);
+                        } else {
+                            m_currentTabIndices[i] = m_currentIndex;
+                            handledCurrentIndex = true;
+                            m_lastVisibleIndex = i;
+                        }
+                    } else {
+                        m_currentTabIndices[i] = index;
+                        ++index;
+                    }
+                } else {
+                    ++index;
+                    --i;
+                }
+            }
+        }
+    }
+
+    // actually draw top level tabs
+    for (int i = 0; i <= m_lastVisibleIndex; ++i) {
+        int actualIndex = m_currentTabIndices.at(i);
+        const Tab& tab = m_tabs.at(actualIndex);
+
+        painter.setPen(lineColor);
+
+        // top
+        if (m_drawFrame) {
+            painter.drawLine(x, 0, x + 2 * MARGIN + fm.width(tab.name), 0);
+        }
+
+        if (actualIndex == m_currentIndex) {            
+            // tab background
+            painter.fillRect(QRect(x, 1,
+                                   2 * MARGIN + fm.width(tab.name),
+                                   r.height() + 1),
+                             baseColor);
+
+            // Left
+            if (actualIndex == 0) {
+                if (m_drawFrame)
+                    painter.drawLine(x, 0, x, r.height()+1);
+            }
+            else {
+                painter.drawLine(x - 1, 0, x - 1, r.height() - 1);
+                painter.setPen(QColor(255, 255, 255, 170));
+                painter.drawLine(x, 1, x, r.height());
+            }
+
+            x += MARGIN;
+            painter.setPen(tab.color);
+            painter.drawText(x, baseline, tab.name);
+            x += nameWidth.at(actualIndex);
+            x += MARGIN;
+            painter.setPen(lineColor);
+            painter.drawLine(x, 0, x, r.height() - 1);
+            painter.setPen(QColor(0, 0, 0, 20));
+            painter.drawLine(x + 1, 0, x + 1, r.height() - 1);
+            painter.setPen(QColor(255, 255, 255, 170));
+            painter.drawLine(x - 1, 1, x - 1, r.height());
+        } else {
+            // tab background
+            painter.fillRect(QRect(x + 1, 1,
+                                   2 * MARGIN + fm.width(tab.name),
+                                   r.height()-1),
+                             backgroundColor);
+
+            // left
+            if (m_drawFrame && (actualIndex == 0))
+                painter.drawLine(x, 0, x, r.height());
+
+            x += MARGIN;
+            QColor penColor(tab.color);
+            penColor.setAlpha(190);
+            painter.setPen(penColor);
+            painter.drawText(x + 1, baseline, tab.name);
+            x += nameWidth.at(actualIndex);
+            x += MARGIN;
+            if (!m_drawFrame || (actualIndex != m_lastVisibleIndex))
+                drawFirstLevelSeparator(&painter, QPoint(x, 1), QPoint(x, r.height()-1));
+        }
+
+        // end of tabs right vertical line
+        if (m_drawFrame && (actualIndex == m_lastVisibleIndex)) {
+            painter.setPen(lineColor);
+            painter.drawLine(x, 0, x, r.height() - 1);
+        }
+    }
+
+    // draw overflow button
+    if (m_lastVisibleIndex < m_tabs.size() - 1) {
+        QStyleOption opt;
+        opt.rect = QRect(x, 0, OVERFLOW_DROPDOWN_WIDTH - 1, r.height() - 1);
+        style()->drawPrimitive(QStyle::PE_IndicatorArrowDown,
+                               &opt, &painter, this);
+        drawFirstLevelSeparator(&painter, QPoint(x + OVERFLOW_DROPDOWN_WIDTH, 0),
+                                QPoint(x + OVERFLOW_DROPDOWN_WIDTH, r.height()-1));
+    }
+}
+
+bool TabWidget::event(QEvent *event)
+{
+    if (event->type() == QEvent::ToolTip) {
+        QHelpEvent *helpevent = static_cast<QHelpEvent*>(event);
+        QPair<HitArea, int> hit = convertPosToTab(helpevent->pos());
+        if (hit.first == HITTAB)
+            QToolTip::showText(helpevent->globalPos(), m_tabs.at(m_currentTabIndices.at(hit.second)).name, this);
+        else
+            QToolTip::showText(helpevent->globalPos(), QString(), this);
+    }
+    return QWidget::event(event);
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/extensions/tabwidget.h b/ThirdParty/GUI/qt-manhattan-style/extensions/tabwidget.h
new file mode 100644
index 0000000..94c1243
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/extensions/tabwidget.h
@@ -0,0 +1,61 @@
+#ifndef TABWIDGET_H
+#define TABWIDGET_H
+
+#include "../qt-manhattan-style_global.hpp"
+#include <QVector>
+#include <QWidget>
+
+class QStackedWidget;
+
+namespace Manhattan {
+
+class QTMANHATTANSTYLESHARED_EXPORT TabWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    TabWidget(QWidget *parent = 0);
+    virtual ~TabWidget();
+
+    void setTitle(const QString &title);
+    QString title() const { return m_title; }
+
+    void setFrameVisible(bool visible);
+
+    void addTab(const QString &name, QWidget *widget, const QColor &color = Qt::black);
+    void insertTab(int index, const QString &name, QWidget *widget, const QColor &color = Qt::black);
+    QWidget* removeTab(int index);
+    int tabCount() const;
+    QString tabText(int index) const;
+
+    int currentIndex() const;
+    void setCurrentIndex(int index);
+
+signals:
+    void currentIndexChanged(int index);
+
+protected:
+    virtual void paintEvent(QPaintEvent *event);
+    virtual void mousePressEvent(QMouseEvent *event);
+    virtual bool event(QEvent *event);
+
+private:
+    struct Tab {
+        QString name;
+        QColor color;
+        QWidget* widget;
+    };
+    enum HitArea { HITNOTHING, HITOVERFLOW, HITTAB };
+    QPair<TabWidget::HitArea, int> convertPosToTab(QPoint pos);
+
+    QString m_title;
+    QList<Tab> m_tabs;
+    int m_currentIndex;
+    QVector<int> m_currentTabIndices;
+    int m_lastVisibleIndex;
+    QStackedWidget *m_stack;
+    bool m_drawFrame;
+};
+
+} // namespace Manhattan
+
+#endif // TABWIDGET_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/extensions/threelevelsitempicker.cpp b/ThirdParty/GUI/qt-manhattan-style/extensions/threelevelsitempicker.cpp
new file mode 100644
index 0000000..ca0b440
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/extensions/threelevelsitempicker.cpp
@@ -0,0 +1,383 @@
+#include "threelevelsitempicker.h"
+#include "../stylehelper.h"
+#include "../styledbar.h"
+#include <QAction>
+#include <QStyle>
+#include <QStatusBar>
+#include <QHBoxLayout>
+#include <QPainter>
+#include <QKeyEvent>
+#include <QItemDelegate>
+#include <QLabel>
+#include <QTimer>
+
+namespace
+{
+
+QWidget *createTitleLabel(const QString &text)
+{
+    Manhattan::StyledBar *bar = new Manhattan::StyledBar;
+    bar->setSingleRow(true);
+    QVBoxLayout *toolLayout = new QVBoxLayout(bar);
+    toolLayout->setMargin(0);
+    toolLayout->setSpacing(0);
+
+    QLabel *l = new QLabel(text);
+    l->setIndent(6);
+    QFont f = l->font();
+    f.setBold(true);
+    l->setFont(f);
+    toolLayout->addWidget(l);
+
+    int panelHeight = l->fontMetrics().height() + 12;
+    bar->ensurePolished(); // Required since manhattanstyle overrides height
+    bar->setFixedHeight(panelHeight);
+    return bar;
+}
+
+}
+
+class OnePixelGreyLine : public QWidget
+{
+public:
+    OnePixelGreyLine(QWidget *parent = 0)
+        : QWidget(parent)
+    {
+        setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+        setMinimumWidth(1);
+        setMaximumWidth(1);
+    }
+    void paintEvent(QPaintEvent *e)
+    {
+        Q_UNUSED(e);
+        QPainter p(this);
+        p.fillRect(contentsRect(), QColor(160, 160, 160, 255));
+    }
+};
+
+using namespace Manhattan;
+
+ThreeLevelsItemPicker::ThreeLevelsItemPicker(const QString& level1Title,
+                                             const QString& level2Title,
+                                             const QString& level3Title,
+                                             QMap<QString, QStringList> level2ItemsFromlevel1,
+                                             QMap<QString, QStringList> level3ItemsFromLevel2,
+                                             QIcon icon,
+                                             QWidget* anchorWidget)
+    : QWidget()
+    , m_anchorWidget(anchorWidget)
+    , m_triggerAction(0)
+    , m_level2ItemsFromlevel1(level2ItemsFromlevel1)
+    , m_level3ItemsFromLevel2(level3ItemsFromLevel2)
+{
+    // Style
+    QPalette p = palette();
+    p.setColor(QPalette::Text, QColor(255, 255, 255, 160));
+    setPalette(p);
+    setProperty("panelwidget", true);
+    setContentsMargins(QMargins(0, 0, 1, 8));
+    setWindowFlags(Qt::Popup);
+
+    // List widgets
+    m_level1Items = new ListWidget;
+    m_level1Items->setMaxCount(5);
+    m_level1Items->addItems(m_level2ItemsFromlevel1.keys());
+    connect(m_level1Items, SIGNAL(currentTextChanged(QString)), this, SLOT(setLevel1(QString)));
+    m_level2Items = new ListWidget;
+    m_level2Items->setMaxCount(5);
+    connect(m_level2Items, SIGNAL(currentTextChanged(QString)), this, SLOT(setLevel2(QString)));
+    m_level3Items = new ListWidget;
+    m_level3Items->setMaxCount(5);
+    connect(m_level3Items, SIGNAL(currentTextChanged(QString)), this, SLOT(setLevel3(QString)));
+    connect(m_level3Items, SIGNAL(itemReselected()), this, SLOT(hide()));
+
+    QGridLayout *grid = new QGridLayout(this);
+    grid->setMargin(0);
+    grid->setSpacing(0);
+
+    // Level 1 column
+    {
+        QWidget* title = ::createTitleLabel(level1Title);
+        grid->addWidget(title, 0, 0);
+        grid->addWidget(new OnePixelGreyLine, 0, 1);
+        grid->addWidget(m_level1Items, 1, 0);
+        grid->addWidget(new OnePixelGreyLine, 1, 1);
+    }
+
+    // Level 2 column
+    {
+        QWidget* title = ::createTitleLabel(level2Title);
+        grid->addWidget(title, 0, 2);
+        grid->addWidget(new OnePixelGreyLine, 0, 3);
+        grid->addWidget(m_level2Items, 1, 2);
+        grid->addWidget(new OnePixelGreyLine, 1, 3);
+    }
+
+    // Level 3 column
+    {
+        QWidget* title = ::createTitleLabel(level3Title);
+        grid->addWidget(title, 0, 4);
+        grid->addWidget(m_level3Items, 1, 4);
+    }
+
+    this->setLayout(grid);
+
+    // Mode selector action
+    m_triggerAction = new QAction(this);
+    m_triggerAction->setCheckable(true);
+    m_triggerAction->setEnabled(true);
+    m_triggerAction->setIcon(icon);
+    m_triggerAction->setProperty("titledAction", true); // will add the arrow !
+    connect(m_triggerAction, SIGNAL(triggered()), this, SLOT(show()));
+}
+
+void ThreeLevelsItemPicker::setVisible(bool visible)
+{
+    if (visible)
+    {
+        QPoint moveTo = m_anchorWidget->mapToGlobal(QPoint(m_anchorWidget->width() + 1,0));
+        move(moveTo);
+    }
+
+    QWidget::setVisible(visible);
+    m_triggerAction->setChecked(visible);
+}
+
+void ThreeLevelsItemPicker::setMaxVisibleItemCount(int count)
+{
+    m_level1Items->setMaxCount(count);
+    m_level2Items->setMaxCount(count);
+    m_level3Items->setMaxCount(count);
+}
+
+QString ThreeLevelsItemPicker::level1() const
+{
+    QListWidgetItem* item = m_level1Items->currentItem();
+    return item ? item->text() : QString();
+}
+
+QString ThreeLevelsItemPicker::level2() const
+{
+    QListWidgetItem* item = m_level2Items->currentItem();
+    return item ? item->text() : QString();
+}
+
+QString ThreeLevelsItemPicker::level3() const
+{
+    QListWidgetItem* item = m_level3Items->currentItem();
+    return item ? item->text() : QString();
+}
+
+namespace helper_namespace
+{
+
+QListWidgetItem* find(const ListWidget* list, const QString& name)
+{
+    for (int row = 0; row < list->count(); ++row)
+    {
+        QListWidgetItem* item = list->item(row);
+        if (item->text() == name)
+            return item;
+    }
+
+    return 0;
+}
+
+} // Anonymous namespace
+
+void ThreeLevelsItemPicker::setLevel1Item(const QString& name)
+{
+    QListWidgetItem* item = helper_namespace::find(m_level1Items, name);
+    if (item)
+        m_level1Items->setCurrentItem(item);
+}
+
+void ThreeLevelsItemPicker::setLevel2Item(const QString& name)
+{
+    QListWidgetItem* item = helper_namespace::find(m_level2Items, name);
+    if (item)
+        m_level2Items->setCurrentItem(item);
+}
+
+void ThreeLevelsItemPicker::setLevel3Item(const QString& name)
+{
+    QListWidgetItem* item = helper_namespace::find(m_level3Items, name);
+    if (item)
+        m_level3Items->setCurrentItem(item);
+}
+
+void ThreeLevelsItemPicker::setLevel1(const QString& name)
+{
+    m_level2Items->clear();
+    m_level2Items->addItems(m_level2ItemsFromlevel1.value(name));
+}
+
+void ThreeLevelsItemPicker::setLevel2(const QString& name)
+{
+    m_level3Items->clear();
+    m_level3Items->addItems(m_level3ItemsFromLevel2.value(name));
+}
+
+void ThreeLevelsItemPicker::setLevel3(const QString& name)
+{
+    if (name.isEmpty())
+        return;
+
+    m_triggerAction->setProperty("heading", name);
+    QListWidgetItem* item = m_level2Items->currentItem();
+    m_triggerAction->setProperty("subtitle", item ? item->text() : "");
+    smoothHide();
+    emit itemChanged();
+}
+
+void ThreeLevelsItemPicker::smoothHide()
+{
+    QTimer::singleShot(200, this, SLOT(hide()));
+}
+
+// This is a workaround for the problem that Windows
+// will let the mouse events through when you click
+// outside a popup to close it. This causes the popup
+// to open on mouse release if you hit the button, which
+//
+//
+// A similar case can be found in QComboBox
+void ThreeLevelsItemPicker::mousePressEvent(QMouseEvent *e)
+{
+    setAttribute(Qt::WA_NoMouseReplay);
+    QWidget::mousePressEvent(e);
+}
+
+void ThreeLevelsItemPicker::paintEvent(QPaintEvent *)
+{
+    QPainter painter(this);
+    painter.setPen(Manhattan::Utils::StyleHelper::borderColor());
+    painter.drawLine(rect().topRight(), rect().bottomRight());
+
+    QRect bottomRect(0, rect().height() - 8, rect().width(), 8);
+    static QImage image(QLatin1String(":/projectexplorer/images/targetpanel_bottom.png"));
+    Manhattan::Utils::StyleHelper::drawCornerImage(image, &painter, bottomRect, 1, 1, 1, 1);
+}
+
+////////
+// TargetSelectorDelegate
+////////
+class TargetSelectorDelegate : public QItemDelegate
+{
+public:
+    TargetSelectorDelegate(QObject *parent) : QItemDelegate(parent) { }
+private:
+    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
+    void paint(QPainter *painter,
+               const QStyleOptionViewItem &option,
+               const QModelIndex &index) const;
+    mutable QImage selectionGradient;
+};
+
+QSize TargetSelectorDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+    Q_UNUSED(option)
+    Q_UNUSED(index)
+    return QSize(190, 30);
+}
+
+void TargetSelectorDelegate::paint(QPainter *painter,
+                                   const QStyleOptionViewItem &option,
+                                   const QModelIndex &index) const
+{
+    painter->save();
+    painter->setClipping(false);
+
+    if (selectionGradient.isNull())
+        selectionGradient.load(QLatin1String(":/projectexplorer/images/targetpanel_gradient.png"));
+
+    if (option.state & QStyle::State_Selected) {
+        QColor color =(option.state & QStyle::State_HasFocus) ?
+                      option.palette.highlight().color() :
+                      option.palette.dark().color();
+        painter->fillRect(option.rect, color.darker(140));
+        Manhattan::Utils::StyleHelper::drawCornerImage(selectionGradient, painter, option.rect.adjusted(0, 0, 0, -1), 5, 5, 5, 5);
+        painter->setPen(QColor(255, 255, 255, 60));
+        painter->drawLine(option.rect.topLeft(), option.rect.topRight());
+        painter->setPen(QColor(255, 255, 255, 30));
+        painter->drawLine(option.rect.bottomLeft() - QPoint(0,1), option.rect.bottomRight() -  QPoint(0,1));
+        painter->setPen(QColor(0, 0, 0, 80));
+        painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
+    }
+
+    QFontMetrics fm(option.font);
+    QString text = index.data(Qt::DisplayRole).toString();
+    painter->setPen(QColor(255, 255, 255, 160));
+    QString elidedText = fm.elidedText(text, Qt::ElideMiddle, option.rect.width() - 12);
+    if (elidedText != text)
+        const_cast<QAbstractItemModel *>(index.model())->setData(index, text, Qt::ToolTipRole);
+    else
+        const_cast<QAbstractItemModel *>(index.model())->setData(index, QString(), Qt::ToolTipRole);
+    painter->drawText(option.rect.left() + 6, option.rect.top() + (option.rect.height() - fm.height()) / 2 + fm.ascent(), elidedText);
+
+    painter->restore();
+}
+
+////////
+// ListWidget
+////////
+ListWidget::ListWidget(QWidget *parent)
+    : QListWidget(parent), m_maxCount(0)
+{
+    setFocusPolicy(Qt::NoFocus);
+    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    setAlternatingRowColors(false);
+    setFocusPolicy(Qt::WheelFocus);
+    setItemDelegate(new TargetSelectorDelegate(this));
+    setAttribute(Qt::WA_MacShowFocusRect, false);
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+
+    // Style
+    QFile file(":/extensions/qss/threelevelsitempicker-listwidget.qss");
+    file.open(QFile::ReadOnly);
+    QString styleSheet = QLatin1String(file.readAll());
+    setStyleSheet(styleSheet);
+}
+
+QSize ListWidget::sizeHint() const
+{
+    int height = m_maxCount * 30;
+    int width = 190;
+    QSize size(width, height);
+    return size;
+}
+
+void ListWidget::keyPressEvent(QKeyEvent *event)
+{
+    if (event->key() == Qt::Key_Left)
+        focusPreviousChild();
+    else if (event->key() == Qt::Key_Right)
+        focusNextChild();
+    else
+        QListWidget::keyPressEvent(event);
+}
+
+void ListWidget::keyReleaseEvent(QKeyEvent *event)
+{
+    if (event->key() != Qt::LeftArrow && event->key() != Qt::RightArrow)
+        QListWidget::keyReleaseEvent(event);
+}
+
+void ListWidget::setMaxCount(int maxCount)
+{
+    // Note: the current assumption is that, this is not called while the listwidget is visible
+    // Otherwise we would need to add code to MiniProjectTargetSelector reacting to the
+    // updateGeometry (which then would jump ugly)
+    m_maxCount = maxCount;
+    updateGeometry();
+}
+
+void ListWidget::mouseReleaseEvent(QMouseEvent* event)
+{
+    QListWidgetItem* item = currentItem();
+    QListWidget::mouseReleaseEvent(event);
+    if (item == currentItem())
+    {
+        emit itemReselected();
+    }
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/extensions/threelevelsitempicker.h b/ThirdParty/GUI/qt-manhattan-style/extensions/threelevelsitempicker.h
new file mode 100644
index 0000000..e51344c
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/extensions/threelevelsitempicker.h
@@ -0,0 +1,84 @@
+#ifndef THREELEVELSITEMPICKER_H
+#define THREELEVELSITEMPICKER_H
+
+#include "../qt-manhattan-style_global.hpp"
+#include <QWidget>
+#include <QListWidget>
+#include <QMap>
+
+class QStatusBar;
+
+namespace Manhattan {
+
+class ListWidget : public QListWidget
+{
+    Q_OBJECT
+
+public:
+    ListWidget(QWidget *parent = 0);
+    QSize sizeHint() const;
+    void keyPressEvent(QKeyEvent *event);
+    void keyReleaseEvent(QKeyEvent *event);
+    void setMaxCount(int maxCount);
+
+signals:
+    void itemReselected();
+
+protected:
+    void mouseReleaseEvent(QMouseEvent* event);
+
+private:
+    int m_maxCount;
+};
+
+class QTMANHATTANSTYLESHARED_EXPORT ThreeLevelsItemPicker : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit ThreeLevelsItemPicker(const QString& level1Title,
+                                   const QString& level2Title,
+                                   const QString& level3Title,
+                                   QMap<QString, QStringList> level2ItemsFromlevel1,
+                                   QMap<QString, QStringList> level3ItemsFromLevel2,
+                                   QIcon icon,
+                                   QWidget* anchorWidget);
+
+    inline QAction* triggerAction() const { return m_triggerAction; }
+    void setVisible(bool visible);
+    void setMaxVisibleItemCount(int count);
+
+    QString level1() const;
+    QString level2() const;
+    QString level3() const;
+
+    void setLevel1Item(const QString& name);
+    void setLevel2Item(const QString& name);
+    void setLevel3Item(const QString& name);
+
+signals:
+    void itemChanged();
+
+private slots:
+    void setLevel1(const QString& name);
+    void setLevel2(const QString& name);
+    void setLevel3(const QString& name);
+    void smoothHide();
+
+private:
+    void mousePressEvent(QMouseEvent *);
+    void paintEvent(QPaintEvent *);
+
+private:
+    QWidget* m_anchorWidget;
+    QAction* m_triggerAction;
+    QMap<QString, QStringList> m_level2ItemsFromlevel1;
+    QMap<QString, QStringList> m_level3ItemsFromLevel2;
+    ListWidget* m_level1Items;
+    ListWidget* m_level2Items;
+    ListWidget* m_level3Items;
+};
+
+} // namespace Manhattan
+
+#endif // THREELEVELSITEMPICKER_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancyactionbar.cpp b/ThirdParty/GUI/qt-manhattan-style/fancyactionbar.cpp
new file mode 100644
index 0000000..d3fd5d4
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancyactionbar.cpp
@@ -0,0 +1,372 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "fancyactionbar.h"
+#include "coreconstants.h"
+
+#include "stylehelper.h"
+#include "stringutils.h"
+
+
+#include <QHBoxLayout>
+#include <QPainter>
+#include <QPicture>
+#include <QVBoxLayout>
+#include <QAction>
+#include <QStatusBar>
+#include <QStyle>
+#include <QStyleOption>
+#include <QMouseEvent>
+#include <QApplication>
+#include <QEvent>
+#include <QAnimationGroup>
+#include <QPropertyAnimation>
+#include <QDebug>
+
+using namespace Manhattan;
+
+FancyToolButton::FancyToolButton(QWidget *parent)
+    : QToolButton(parent), m_fader(0)
+{
+    m_hasForceVisible = false;
+    setAttribute(Qt::WA_Hover, true);
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+}
+
+void FancyToolButton::forceVisible(bool visible)
+{
+    m_hasForceVisible = true;
+    setVisible(visible);
+}
+
+bool FancyToolButton::event(QEvent *e)
+{
+    switch(e->type()) {
+    case QEvent::Enter:
+        {
+            QPropertyAnimation *animation = new QPropertyAnimation(this, "fader");
+            animation->setDuration(125);
+            animation->setEndValue(1.0);
+            animation->start(QAbstractAnimation::DeleteWhenStopped);
+        }
+        break;
+    case QEvent::Leave:
+        {
+            QPropertyAnimation *animation = new QPropertyAnimation(this, "fader");
+            animation->setDuration(125);
+            animation->setEndValue(0.0);
+            animation->start(QAbstractAnimation::DeleteWhenStopped);
+        }
+        break;
+    default:
+        return QToolButton::event(e);
+    }
+    return false;
+}
+
+static QVector<QString> splitInTwoLines(const QString &text, const QFontMetrics &fontMetrics,
+                                        qreal availableWidth)
+{
+    // split in two lines.
+    // this looks if full words can be split off at the end of the string,
+    // to put them in the second line. First line is drawn with ellipsis,
+    // second line gets ellipsis if it couldn't split off full words.
+    QVector<QString> splitLines(2);
+    QRegExp rx(QLatin1String("\\s+"));
+    int splitPos = -1;
+    int nextSplitPos = text.length();
+    do {
+        nextSplitPos = rx.lastIndexIn(text,
+                                      nextSplitPos - text.length() - 1);
+        if (nextSplitPos != -1) {
+            int splitCandidate = nextSplitPos + rx.matchedLength();
+            if (fontMetrics.width(text.mid(splitCandidate)) <= availableWidth) {
+                splitPos = splitCandidate;
+            } else {
+                break;
+            }
+        }
+    } while (nextSplitPos > 0 && fontMetrics.width(text.left(nextSplitPos)) > availableWidth);
+    // check if we could split at white space at all
+    if (splitPos < 0) {
+        splitLines[0] = fontMetrics.elidedText(text, Qt::ElideRight,
+                                                       availableWidth);
+        QString common = Manhattan::commonPrefix(QStringList()
+                                             << splitLines[0] << text);
+        splitLines[1] = text.mid(common.length());
+        // elide the second line even if it fits, since it is cut off in mid-word
+        while (fontMetrics.width(QChar(0x2026) /*'...'*/ + splitLines[1]) > availableWidth
+               && splitLines[1].length() > 3
+               /*keep at least three original characters (should not happen)*/) {
+            splitLines[1].remove(0, 1);
+        }
+        splitLines[1] = QChar(0x2026) /*'...'*/ + splitLines[1];
+    } else {
+        splitLines[0] = fontMetrics.elidedText(text.left(splitPos).trimmed(), Qt::ElideRight, availableWidth);
+        splitLines[1] = text.mid(splitPos);
+    }
+    return splitLines;
+}
+
+void FancyToolButton::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+    QPainter painter(this);
+
+    // draw borders
+    bool isTitledAction = defaultAction()->property("titledAction").toBool();
+
+#ifndef Q_OS_MAC // Mac UIs usually don't hover
+    if (m_fader > 0 && isEnabled() && !isDown() && !isChecked()) {
+        painter.save();
+        int fader = int(40 * m_fader);
+        QLinearGradient grad(rect().topLeft(), rect().topRight());
+        grad.setColorAt(0, Qt::transparent);
+        grad.setColorAt(0.5, QColor(255, 255, 255, fader));
+        grad.setColorAt(1, Qt::transparent);
+        painter.fillRect(rect(), grad);
+        painter.setPen(QPen(grad, 1.0));
+        painter.drawLine(rect().topLeft(), rect().topRight());
+        painter.drawLine(rect().bottomLeft(), rect().bottomRight());
+        painter.restore();
+    } else
+#endif
+    if (isDown() || isChecked()) {
+        painter.save();
+        QLinearGradient grad(rect().topLeft(), rect().topRight());
+        grad.setColorAt(0, Qt::transparent);
+        grad.setColorAt(0.5, QColor(0, 0, 0, 50));
+        grad.setColorAt(1, Qt::transparent);
+        painter.fillRect(rect(), grad);
+        painter.setPen(QPen(grad, 1.0));
+        painter.drawLine(rect().topLeft(), rect().topRight());
+        painter.drawLine(rect().topLeft(), rect().topRight());
+        painter.drawLine(rect().topLeft() + QPoint(0,1), rect().topRight() + QPoint(0,1));
+        painter.drawLine(rect().bottomLeft(), rect().bottomRight());
+        painter.drawLine(rect().bottomLeft(), rect().bottomRight());
+        painter.drawLine(rect().topLeft() - QPoint(0,1), rect().topRight() - QPoint(0,1));
+        painter.restore();
+    }
+    QPixmap borderPixmap;
+    QMargins margins;
+
+    QRect iconRect(0, 0, Manhattan::Constants::TARGET_ICON_SIZE, Manhattan::Constants::TARGET_ICON_SIZE);
+    // draw popup texts
+    if (isTitledAction) {
+
+        QFont normalFont(painter.font());
+        QRect centerRect = rect();
+        normalFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
+        QFont boldFont(normalFont);
+        boldFont.setBold(true);
+        QFontMetrics fm(normalFont);
+        QFontMetrics boldFm(boldFont);
+        int lineHeight = boldFm.height();
+        int textFlags = Qt::AlignVCenter|Qt::AlignHCenter;
+
+        const QString projectName = defaultAction()->property("heading").toString();
+        if (!projectName.isNull())
+            centerRect.adjust(0, lineHeight + 4, 0, 0);
+
+        centerRect.adjust(0, 0, 0, -lineHeight*2 - 4);
+
+        iconRect.moveCenter(centerRect.center());
+        Utils::StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, isEnabled() ? QIcon::Normal : QIcon::Disabled);
+        painter.setFont(normalFont);
+
+        QPoint textOffset = centerRect.center() - QPoint(iconRect.width()/2, iconRect.height()/2);
+        textOffset = textOffset - QPoint(0, lineHeight + 4);
+        QRectF r(0, textOffset.y(), rect().width(), lineHeight);
+        QColor penColor;
+        if (isEnabled())
+            penColor = Qt::white;
+        else
+            penColor = Qt::gray;
+        painter.setPen(penColor);
+
+        // draw project name
+        const int margin = 6;
+        const qreal availableWidth = r.width() - margin;
+        QString ellidedProjectName = fm.elidedText(projectName, Qt::ElideMiddle, availableWidth);
+        if (isEnabled()) {
+            const QRectF shadowR = r.translated(0, 1);
+            painter.setPen(QColor(30, 30, 30, 80));
+            painter.drawText(shadowR, textFlags, ellidedProjectName);
+            painter.setPen(penColor);
+        }
+        painter.drawText(r, textFlags, ellidedProjectName);
+
+        // draw build configuration name
+        textOffset = iconRect.center() + QPoint(iconRect.width()/2, iconRect.height()/2);
+        QRectF buildConfigRect[2];
+        buildConfigRect[0] = QRectF(0, textOffset.y() + 5, rect().width(), lineHeight);
+        buildConfigRect[1] = QRectF(0, textOffset.y() + 5 + lineHeight, rect().width(), lineHeight);
+        painter.setFont(boldFont);
+        QVector<QString> splitBuildConfiguration(2);
+        const QString buildConfiguration = defaultAction()->property("subtitle").toString();
+        if (boldFm.width(buildConfiguration) <= availableWidth) {
+            // text fits in one line
+            splitBuildConfiguration[0] = buildConfiguration;
+        } else {
+            splitBuildConfiguration = splitInTwoLines(buildConfiguration, boldFm, availableWidth);
+        }
+        // draw the two lines for the build configuration
+        for (int i = 0; i < 2; ++i) {
+            if (splitBuildConfiguration[i].isEmpty())
+                continue;
+            if (isEnabled()) {
+                const QRectF shadowR = buildConfigRect[i].translated(0, 1);
+                painter.setPen(QColor(30, 30, 30, 80));
+                painter.drawText(shadowR, textFlags, splitBuildConfiguration[i]);
+                painter.setPen(penColor);
+            }
+            painter.drawText(buildConfigRect[i], textFlags, splitBuildConfiguration[i]);
+        }
+
+        // pop up arrow next to icon
+        if (!icon().isNull()) {
+            QStyleOption opt;
+            opt.initFrom(this);
+            opt.rect = rect().adjusted(rect().width() - 16, 0, -8, 0);
+            Utils::StyleHelper::drawArrow(QStyle::PE_IndicatorArrowRight, &painter, &opt);
+        }
+    } else {
+        iconRect.moveCenter(rect().center());
+        Utils::StyleHelper::drawIconWithShadow(icon(), iconRect, &painter, isEnabled() ? QIcon::Normal : QIcon::Disabled);
+    }
+}
+
+void FancyActionBar::setSeparator(SeparatorType type)
+{
+    if (type != m_separator) {
+        m_separator = type;
+        update();
+    }
+}
+
+void FancyActionBar::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+
+    if (m_separator == None)
+        return;
+
+    QPainter painter(this);
+    QColor light = Utils::StyleHelper::sidebarHighlight();
+    QColor dark = Utils::StyleHelper::sidebarShadow();
+    if (m_separator == Top) {
+        painter.setPen(dark);
+        painter.drawLine(rect().topLeft(), rect().topRight());
+        painter.setPen(light);
+        painter.drawLine(rect().topLeft() + QPoint(1,1), rect().topRight() + QPoint(0,1));
+    }
+    else {
+        painter.setPen(dark);
+        painter.drawLine(rect().bottomLeft() - QPoint(0,2), rect().bottomRight() - QPoint(0,2));
+        painter.setPen(light);
+        painter.drawLine(rect().bottomLeft() - QPoint(1,1), rect().bottomRight() - QPoint(0,1));
+    }
+}
+
+QSize FancyToolButton::sizeHint() const
+{
+    QSizeF buttonSize = iconSize().expandedTo(QSize(64, 38));
+    if (defaultAction()->property("titledAction").toBool()) {
+        QFont boldFont(font());
+        boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
+        boldFont.setBold(true);
+        QFontMetrics fm(boldFont);
+        qreal lineHeight = fm.height();
+        const QString projectName = defaultAction()->property("heading").toString();
+        buttonSize += QSizeF(0, 10);
+        if (!projectName.isEmpty())
+            buttonSize += QSizeF(0, lineHeight + 2);
+
+        buttonSize += QSizeF(0, lineHeight*2 + 2);
+    }
+    return buttonSize.toSize();
+}
+
+QSize FancyToolButton::minimumSizeHint() const
+{
+    return QSize(8, 8);
+}
+
+void FancyToolButton::actionChanged()
+{
+    // the default action changed in some way, e.g. it might got hidden
+    // since we inherit a tool button we won't get invisible, so do this here
+    if (!m_hasForceVisible) {
+        if (QAction* action = defaultAction())
+            setVisible(action->isVisible());
+    }
+}
+
+FancyActionBar::FancyActionBar(QWidget *parent)
+    : QWidget(parent)
+    , m_separator(Top)
+{
+    setObjectName(QLatin1String("actionbar"));
+    m_actionsLayout = new QVBoxLayout;
+    QVBoxLayout *spacerLayout = new QVBoxLayout;
+    spacerLayout->addLayout(m_actionsLayout);
+    int sbh = 8;
+    spacerLayout->addSpacing(sbh);
+    spacerLayout->setMargin(0);
+    spacerLayout->setSpacing(0);
+    setLayout(spacerLayout);
+    setContentsMargins(0,2,0,0);
+}
+
+void FancyActionBar::addProjectSelector(QAction *action)
+{
+    FancyToolButton* toolButton = new FancyToolButton(this);
+    toolButton->setDefaultAction(action);
+    connect(action, SIGNAL(changed()), toolButton, SLOT(actionChanged()));
+    m_actionsLayout->insertWidget(0, toolButton);
+
+}
+void FancyActionBar::insertAction(int index, QAction *action)
+{
+    FancyToolButton *toolButton = new FancyToolButton(this);
+    toolButton->setDefaultAction(action);
+    connect(action, SIGNAL(changed()), toolButton, SLOT(actionChanged()));
+    m_actionsLayout->insertWidget(index, toolButton);
+}
+
+QLayout *FancyActionBar::actionsLayout() const
+{
+    return m_actionsLayout;
+}
+
+QSize FancyActionBar::minimumSizeHint() const
+{
+    return sizeHint();
+}
+
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancyactionbar.h b/ThirdParty/GUI/qt-manhattan-style/fancyactionbar.h
new file mode 100644
index 0000000..e3e43dc
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancyactionbar.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef FANCYACTIONBAR_H
+#define FANCYACTIONBAR_H
+
+#include "qt-manhattan-style_global.hpp"
+#include <QToolButton>
+
+QT_BEGIN_NAMESPACE
+class QVBoxLayout;
+QT_END_NAMESPACE
+
+namespace Manhattan {
+
+class QTMANHATTANSTYLESHARED_EXPORT FancyToolButton : public QToolButton
+{
+    Q_OBJECT
+
+    Q_PROPERTY(float fader READ fader WRITE setFader)
+
+public:
+    FancyToolButton(QWidget *parent = 0);
+
+    void paintEvent(QPaintEvent *event);
+    bool event(QEvent *e);
+    QSize sizeHint() const;
+    QSize minimumSizeHint() const;
+
+    float m_fader;
+    float fader() { return m_fader; }
+    void setFader(float value) { m_fader = value; update(); }
+
+    void forceVisible(bool visible);
+
+private slots:
+    void actionChanged();
+
+private:
+    bool m_hasForceVisible;
+};
+
+class QTMANHATTANSTYLESHARED_EXPORT FancyActionBar : public QWidget
+{
+    Q_OBJECT
+
+public:
+    FancyActionBar(QWidget *parent = 0);
+
+    enum SeparatorType { None = 0, Top, Bottom };
+    void setSeparator(SeparatorType type);
+
+    void paintEvent(QPaintEvent *event);
+    void insertAction(int index, QAction *action);
+    void addProjectSelector(QAction *action);
+    QLayout *actionsLayout() const;
+    QSize minimumSizeHint() const;
+
+private:
+    QVBoxLayout *m_actionsLayout;
+    SeparatorType m_separator;
+};
+
+} // namespace Manhattan
+
+#endif // FANCYACTIONBAR_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancylineedit.cpp b/ThirdParty/GUI/qt-manhattan-style/fancylineedit.cpp
new file mode 100644
index 0000000..473c349
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancylineedit.cpp
@@ -0,0 +1,372 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "fancylineedit.h"
+#include "historycompleter.h"
+#include "qtcassert.h"
+
+#include <QEvent>
+#include <QDebug>
+#include <QString>
+#include <QPropertyAnimation>
+#include <QApplication>
+#include <QMenu>
+#include <QMouseEvent>
+#include <QLabel>
+#include <QAbstractButton>
+#include <QPainter>
+#include <QStyle>
+#include <QPaintEvent>
+#include <QDesktopWidget>
+
+/*! Opens a menu at the specified widget position.
+ * This functions computes the position where to show the menu, and opens it with
+ * QMenu::exec().
+ * \param menu The menu to open
+ * \param widget The widget next to which to open the menu
+ */
+static void execMenuAtWidget(QMenu *menu, QWidget *widget)
+{
+    QPoint p;
+    QRect screen = qApp->desktop()->availableGeometry(widget);
+    QSize sh = menu->sizeHint();
+    QRect rect = widget->rect();
+    if (widget->isRightToLeft()) {
+        if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height()) {
+            p = widget->mapToGlobal(rect.bottomRight());
+        } else {
+            p = widget->mapToGlobal(rect.topRight() - QPoint(0, sh.height()));
+        }
+        p.rx() -= sh.width();
+    } else {
+        if (widget->mapToGlobal(QPoint(0, rect.bottom())).y() + sh.height() <= screen.height()) {
+            p = widget->mapToGlobal(rect.bottomLeft());
+        } else {
+            p = widget->mapToGlobal(rect.topLeft() - QPoint(0, sh.height()));
+        }
+    }
+    p.rx() = qMax(screen.left(), qMin(p.x(), screen.right() - sh.width()));
+    p.ry() += 1;
+
+    menu->exec(p);
+}
+
+/*!
+    \class Utils::FancyLineEdit
+
+    \brief A line edit with an embedded pixmap on one side that is connected to
+    a menu.
+
+    Additionally, it can display a grayed hintText (like "Type Here to")
+    when not focused and empty. When connecting to the changed signals and
+    querying text, one has to be aware that the text is set to that hint
+    text if isShowingHintText() returns true (that is, does not contain
+    valid user input).
+ */
+
+enum { margin = 6 };
+
+#define ICONBUTTON_HEIGHT 18
+#define FADE_TIME 160
+
+namespace Manhattan {
+
+// --------- FancyLineEditPrivate
+class FancyLineEditPrivate : public QObject
+{
+public:
+    explicit FancyLineEditPrivate(FancyLineEdit *parent);
+
+    virtual bool eventFilter(QObject *obj, QEvent *event);
+
+    FancyLineEdit  *m_lineEdit;
+    QPixmap m_pixmap[2];
+    QMenu *m_menu[2];
+    bool m_menuTabFocusTrigger[2];
+    IconButton *m_iconbutton[2];
+    bool m_iconEnabled[2];
+
+    HistoryCompleter *m_historyCompleter;
+};
+
+
+FancyLineEditPrivate::FancyLineEditPrivate(FancyLineEdit *parent) :
+    QObject(parent), m_lineEdit(parent),  m_historyCompleter(0)
+{
+    for (int i = 0; i < 2; ++i) {
+        m_menu[i] = 0;
+        m_menuTabFocusTrigger[i] = false;
+        m_iconbutton[i] = new IconButton(parent);
+        m_iconbutton[i]->installEventFilter(this);
+        m_iconbutton[i]->hide();
+        m_iconbutton[i]->setAutoHide(false);
+        m_iconEnabled[i] = false;
+    }
+}
+
+bool FancyLineEditPrivate::eventFilter(QObject *obj, QEvent *event)
+{
+    int buttonIndex = -1;
+    for (int i = 0; i < 2; ++i) {
+        if (obj == m_iconbutton[i]) {
+            buttonIndex = i;
+            break;
+        }
+    }
+    if (buttonIndex == -1)
+        return QObject::eventFilter(obj, event);
+    switch (event->type()) {
+    case QEvent::FocusIn:
+        if (m_menuTabFocusTrigger[buttonIndex] && m_menu[buttonIndex]) {
+            m_lineEdit->setFocus();
+            execMenuAtWidget(m_menu[buttonIndex], m_iconbutton[buttonIndex]);
+            return true;
+        }
+    default:
+        break;
+    }
+    return QObject::eventFilter(obj, event);
+}
+
+
+// --------- FancyLineEdit
+FancyLineEdit::FancyLineEdit(QWidget *parent) :
+    QLineEdit(parent),
+    d(new FancyLineEditPrivate(this))
+{
+    ensurePolished();
+    updateMargins();
+
+    connect(this, SIGNAL(textChanged(QString)), this, SLOT(checkButtons(QString)));
+    connect(d->m_iconbutton[Left], SIGNAL(clicked()), this, SLOT(iconClicked()));
+    connect(d->m_iconbutton[Right], SIGNAL(clicked()), this, SLOT(iconClicked()));
+}
+
+void FancyLineEdit::checkButtons(const QString &text)
+{
+    if (m_oldText.isEmpty() || text.isEmpty()) {
+        for (int i = 0; i < 2; ++i) {
+            if (d->m_iconbutton[i]->hasAutoHide())
+                d->m_iconbutton[i]->animateShow(!text.isEmpty());
+        }
+        m_oldText = text;
+    }
+}
+
+FancyLineEdit::~FancyLineEdit()
+{
+}
+
+void FancyLineEdit::setButtonVisible(Side side, bool visible)
+{
+    d->m_iconbutton[side]->setVisible(visible);
+    d->m_iconEnabled[side] = visible;
+    updateMargins();
+}
+
+bool FancyLineEdit::isButtonVisible(Side side) const
+{
+    return d->m_iconEnabled[side];
+}
+
+void FancyLineEdit::iconClicked()
+{
+    IconButton *button = qobject_cast<IconButton *>(sender());
+    int index = -1;
+    for (int i = 0; i < 2; ++i)
+        if (d->m_iconbutton[i] == button)
+            index = i;
+    if (index == -1)
+        return;
+    if (d->m_menu[index]) {
+        execMenuAtWidget(d->m_menu[index], button);
+    } else {
+        emit buttonClicked((Side)index);
+        if (index == Left)
+            emit leftButtonClicked();
+        else if (index == Right)
+            emit rightButtonClicked();
+    }
+}
+
+void FancyLineEdit::updateMargins()
+{
+    bool leftToRight = (layoutDirection() == Qt::LeftToRight);
+    Side realLeft = (leftToRight ? Left : Right);
+    Side realRight = (leftToRight ? Right : Left);
+
+    int leftMargin = d->m_iconbutton[realLeft]->pixmap().width() + 8;
+    int rightMargin = d->m_iconbutton[realRight]->pixmap().width() + 8;
+    // Note KDE does not reserve space for the highlight color
+    if (style()->inherits("OxygenStyle")) {
+        leftMargin = qMax(24, leftMargin);
+        rightMargin = qMax(24, rightMargin);
+    }
+
+    QMargins margins((d->m_iconEnabled[realLeft] ? leftMargin : 0), 0,
+                     (d->m_iconEnabled[realRight] ? rightMargin : 0), 0);
+
+    setTextMargins(margins);
+}
+
+void FancyLineEdit::updateButtonPositions()
+{
+    QRect contentRect = rect();
+    for (int i = 0; i < 2; ++i) {
+        Side iconpos = (Side)i;
+        if (layoutDirection() == Qt::RightToLeft)
+            iconpos = (iconpos == Left ? Right : Left);
+
+        if (iconpos == FancyLineEdit::Right) {
+            const int iconoffset = textMargins().right() + 4;
+            d->m_iconbutton[i]->setGeometry(contentRect.adjusted(width() - iconoffset, 0, 0, 0));
+        } else {
+            const int iconoffset = textMargins().left() + 4;
+            d->m_iconbutton[i]->setGeometry(contentRect.adjusted(0, 0, -width() + iconoffset, 0));
+        }
+    }
+}
+
+void FancyLineEdit::resizeEvent(QResizeEvent *)
+{
+    updateButtonPositions();
+}
+
+void FancyLineEdit::setButtonPixmap(Side side, const QPixmap &buttonPixmap)
+{
+    d->m_iconbutton[side]->setPixmap(buttonPixmap);
+    updateMargins();
+    updateButtonPositions();
+    update();
+}
+
+QPixmap FancyLineEdit::buttonPixmap(Side side) const
+{
+    return d->m_pixmap[side];
+}
+
+void FancyLineEdit::setButtonMenu(Side side, QMenu *buttonMenu)
+{
+     d->m_menu[side] = buttonMenu;
+     d->m_iconbutton[side]->setIconOpacity(1.0);
+ }
+
+QMenu *FancyLineEdit::buttonMenu(Side side) const
+{
+    return  d->m_menu[side];
+}
+
+bool FancyLineEdit::hasMenuTabFocusTrigger(Side side) const
+{
+    return d->m_menuTabFocusTrigger[side];
+}
+
+void FancyLineEdit::setMenuTabFocusTrigger(Side side, bool v)
+{
+    if (d->m_menuTabFocusTrigger[side] == v)
+        return;
+
+    d->m_menuTabFocusTrigger[side] = v;
+    d->m_iconbutton[side]->setFocusPolicy(v ? Qt::TabFocus : Qt::NoFocus);
+}
+
+bool FancyLineEdit::hasAutoHideButton(Side side) const
+{
+    return d->m_iconbutton[side]->hasAutoHide();
+}
+
+void FancyLineEdit::setHistoryCompleter(const QString &historyKey)
+{
+    QTC_ASSERT(!d->m_historyCompleter, return);
+    d->m_historyCompleter = new HistoryCompleter(this, historyKey, this);
+    QLineEdit::setCompleter(d->m_historyCompleter);
+}
+
+void FancyLineEdit::setSpecialCompleter(QCompleter *completer)
+{
+    QTC_ASSERT(!d->m_historyCompleter, return);
+    QLineEdit::setCompleter(completer);
+}
+
+void FancyLineEdit::setAutoHideButton(Side side, bool h)
+{
+    d->m_iconbutton[side]->setAutoHide(h);
+    if (h)
+        d->m_iconbutton[side]->setIconOpacity(text().isEmpty() ?  0.0 : 1.0);
+    else
+        d->m_iconbutton[side]->setIconOpacity(1.0);
+}
+
+void FancyLineEdit::setButtonToolTip(Side side, const QString &tip)
+{
+    d->m_iconbutton[side]->setToolTip(tip);
+}
+
+void FancyLineEdit::setButtonFocusPolicy(Side side, Qt::FocusPolicy policy)
+{
+    d->m_iconbutton[side]->setFocusPolicy(policy);
+}
+
+// IconButton - helper class to represent a clickable icon
+
+IconButton::IconButton(QWidget *parent)
+    : QAbstractButton(parent), m_autoHide(false)
+{
+    setCursor(Qt::ArrowCursor);
+    setFocusPolicy(Qt::NoFocus);
+}
+
+void IconButton::paintEvent(QPaintEvent *)
+{
+    QPainter painter(this);
+    QRect pixmapRect = QRect(0, 0, m_pixmap.width(), m_pixmap.height());
+    pixmapRect.moveCenter(rect().center());
+
+    if (m_autoHide)
+        painter.setOpacity(m_iconOpacity);
+
+    painter.drawPixmap(pixmapRect, m_pixmap);
+}
+
+void IconButton::animateShow(bool visible)
+{
+    if (visible) {
+        QPropertyAnimation *animation = new QPropertyAnimation(this, "iconOpacity");
+        animation->setDuration(FADE_TIME);
+        animation->setEndValue(1.0);
+        animation->start(QAbstractAnimation::DeleteWhenStopped);
+    } else {
+        QPropertyAnimation *animation = new QPropertyAnimation(this, "iconOpacity");
+        animation->setDuration(FADE_TIME);
+        animation->setEndValue(0.0);
+        animation->start(QAbstractAnimation::DeleteWhenStopped);
+    }
+}
+
+} // namespace Manhattan
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancylineedit.h b/ThirdParty/GUI/qt-manhattan-style/fancylineedit.h
new file mode 100644
index 0000000..2f14c0f
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancylineedit.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef FANCYLINEEDIT_H
+#define FANCYLINEEDIT_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QLineEdit>
+#include <QAbstractButton>
+
+namespace Manhattan {
+
+class FancyLineEditPrivate;
+
+class QTMANHATTANSTYLESHARED_EXPORT IconButton: public QAbstractButton
+{
+    Q_OBJECT
+    Q_PROPERTY(float iconOpacity READ iconOpacity WRITE setIconOpacity)
+    Q_PROPERTY(bool autoHide READ hasAutoHide WRITE setAutoHide)
+    Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap)
+public:
+    explicit IconButton(QWidget *parent = 0);
+    void paintEvent(QPaintEvent *event);
+    void setPixmap(const QPixmap &pixmap) { m_pixmap = pixmap; update(); }
+    QPixmap pixmap() const { return m_pixmap; }
+    float iconOpacity() { return m_iconOpacity; }
+    void setIconOpacity(float value) { m_iconOpacity = value; update(); }
+    void animateShow(bool visible);
+
+    void setAutoHide(bool hide) { m_autoHide = hide; }
+    bool hasAutoHide() const { return m_autoHide; }
+private:
+    float m_iconOpacity;
+    bool m_autoHide;
+    QPixmap m_pixmap;
+};
+
+class QTMANHATTANSTYLESHARED_EXPORT FancyLineEdit : public QLineEdit
+{
+    Q_OBJECT
+    Q_ENUMS(Side)
+
+public:
+    enum Side {Left = 0, Right = 1};
+
+    explicit FancyLineEdit(QWidget *parent = 0);
+    virtual ~FancyLineEdit();
+
+    QPixmap buttonPixmap(Side side) const;
+    void setButtonPixmap(Side side, const QPixmap &pixmap);
+
+    QMenu *buttonMenu(Side side) const;
+    void setButtonMenu(Side side, QMenu *menu);
+
+    void setButtonVisible(Side side, bool visible);
+    bool isButtonVisible(Side side) const;
+
+    void setButtonToolTip(Side side, const QString &);
+    void setButtonFocusPolicy(Side side, Qt::FocusPolicy policy);
+
+    // Set whether tabbing in will trigger the menu.
+    void setMenuTabFocusTrigger(Side side, bool v);
+    bool hasMenuTabFocusTrigger(Side side) const;
+
+    // Set if icon should be hidden when text is empty
+    void setAutoHideButton(Side side, bool h);
+    bool hasAutoHideButton(Side side) const;
+
+    // Enable a history completer with a history of entries.
+    void setHistoryCompleter(const QString &historyKey);
+
+    // Sets a completer that is not a history completer.
+    void setSpecialCompleter(QCompleter *completer);
+
+signals:
+    void buttonClicked(Manhattan::FancyLineEdit::Side side);
+    void leftButtonClicked();
+    void rightButtonClicked();
+
+private slots:
+    void checkButtons(const QString &);
+    void iconClicked();
+
+protected:
+    virtual void resizeEvent(QResizeEvent *e);
+
+private:
+    // Unimplemented, to force the user to make a decision on
+    // whether to use setHistoryKey() or setSpecialCompleter().
+    void setCompleter(QCompleter *);
+
+    void updateMargins();
+    void updateButtonPositions();
+    friend class Manhattan::FancyLineEditPrivate;
+
+    FancyLineEditPrivate *d;
+    QString m_oldText;
+};
+
+} // namespace Manhattan
+
+#endif // FANCYLINEEDIT_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.cpp b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.cpp
new file mode 100644
index 0000000..eec96e4
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.cpp
@@ -0,0 +1,342 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "fancymainwindow.h"
+
+#include "qtcassert.h"
+
+#include <QList>
+#include <QHash>
+
+#include <QAction>
+#include <QContextMenuEvent>
+#include <QMenu>
+#include <QDockWidget>
+#include <QSettings>
+
+static const char lockedKeyC[] = "Locked";
+static const char stateKeyC[] = "State";
+static const int settingsVersion = 2;
+static const char dockWidgetActiveState[] = "DockWidgetActiveState";
+
+namespace Manhattan {
+
+/*! \class Manhattan::FancyMainWindow
+
+    \brief MainWindow with dock widgets and additional "lock" functionality
+    (locking the dock widgets in place) and "reset layout" functionality.
+
+    The dock actions and the additional actions should be accessible
+    in a Window-menu.
+*/
+
+struct FancyMainWindowPrivate
+{
+    FancyMainWindowPrivate();
+
+    bool m_locked;
+    bool m_handleDockVisibilityChanges;
+
+    QAction m_menuSeparator1;
+    QAction m_toggleLockedAction;
+    QAction m_menuSeparator2;
+    QAction m_resetLayoutAction;
+    QDockWidget *m_toolBarDockWidget;
+};
+
+FancyMainWindowPrivate::FancyMainWindowPrivate() :
+    m_locked(true),
+    m_handleDockVisibilityChanges(true),
+    m_menuSeparator1(0),
+    m_toggleLockedAction(FancyMainWindow::tr("Locked"), 0),
+    m_menuSeparator2(0),
+    m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), 0),
+    m_toolBarDockWidget(0)
+{
+    m_toggleLockedAction.setCheckable(true);
+    m_toggleLockedAction.setChecked(m_locked);
+    m_menuSeparator1.setSeparator(true);
+    m_menuSeparator2.setSeparator(true);
+}
+
+FancyMainWindow::FancyMainWindow(QWidget *parent) :
+    QMainWindow(parent), d(new FancyMainWindowPrivate)
+{
+    connect(&d->m_toggleLockedAction, SIGNAL(toggled(bool)),
+            this, SLOT(setLocked(bool)));
+    connect(&d->m_resetLayoutAction, SIGNAL(triggered()),
+            this, SIGNAL(resetLayout()));
+}
+
+FancyMainWindow::~FancyMainWindow()
+{
+    delete d;
+}
+
+QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget)
+{
+    QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), this);
+    dockWidget->setWidget(widget);
+    // Set an object name to be used in settings, derive from widget name
+    const QString objectName = widget->objectName();
+    if (objectName.isEmpty()) {
+        dockWidget->setObjectName(QLatin1String("dockWidget")
+                                  + QString::number(dockWidgets().size() + 1));
+    } else {
+        dockWidget->setObjectName(objectName + QLatin1String("DockWidget"));
+    }
+    connect(dockWidget->toggleViewAction(), SIGNAL(triggered()),
+        this, SLOT(onDockActionTriggered()), Qt::QueuedConnection);
+    connect(dockWidget, SIGNAL(visibilityChanged(bool)),
+            this, SLOT(onDockVisibilityChange(bool)));
+    connect(dockWidget, SIGNAL(topLevelChanged(bool)),
+            this, SLOT(onTopLevelChanged()));
+    dockWidget->setProperty(dockWidgetActiveState, true);
+    updateDockWidget(dockWidget);
+    return dockWidget;
+}
+
+void FancyMainWindow::updateDockWidget(QDockWidget *dockWidget)
+{
+    const QDockWidget::DockWidgetFeatures features =
+            (d->m_locked) ?
+            QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable :
+            QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable
+                | QDockWidget::DockWidgetFloatable;
+    // for the debugger tool bar
+    if (dockWidget->property("managed_dockwidget").isNull()) {
+        QWidget *titleBarWidget = dockWidget->titleBarWidget();
+        if (d->m_locked && !titleBarWidget && !dockWidget->isFloating())
+            titleBarWidget = new QWidget(dockWidget);
+        else if ((!d->m_locked || dockWidget->isFloating()) && titleBarWidget) {
+            delete titleBarWidget;
+            titleBarWidget = 0;
+        }
+        dockWidget->setTitleBarWidget(titleBarWidget);
+    }
+    dockWidget->setFeatures(features);
+}
+
+void FancyMainWindow::onDockActionTriggered()
+{
+    QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent());
+    if (dw) {
+        if (dw->isVisible())
+            dw->raise();
+    }
+}
+
+void FancyMainWindow::onDockVisibilityChange(bool visible)
+{
+    if (d->m_handleDockVisibilityChanges)
+        sender()->setProperty(dockWidgetActiveState, visible);
+}
+
+void FancyMainWindow::onTopLevelChanged()
+{
+    updateDockWidget(qobject_cast<QDockWidget*>(sender()));
+}
+
+void FancyMainWindow::setTrackingEnabled(bool enabled)
+{
+    if (enabled) {
+        d->m_handleDockVisibilityChanges = true;
+        foreach (QDockWidget *dockWidget, dockWidgets())
+            dockWidget->setProperty(dockWidgetActiveState,
+                                    dockWidget->isVisible());
+    } else {
+        d->m_handleDockVisibilityChanges = false;
+    }
+}
+
+void FancyMainWindow::setLocked(bool locked)
+{
+    d->m_locked = locked;
+    foreach (QDockWidget *dockWidget, dockWidgets()) {
+        updateDockWidget(dockWidget);
+    }
+}
+
+void FancyMainWindow::hideEvent(QHideEvent *event)
+{
+    Q_UNUSED(event)
+    handleVisibilityChanged(false);
+}
+
+void FancyMainWindow::showEvent(QShowEvent *event)
+{
+    Q_UNUSED(event)
+    handleVisibilityChanged(true);
+}
+
+void FancyMainWindow::contextMenuEvent(QContextMenuEvent *event)
+{
+    QMenu *menu = createPopupMenu();
+    menu->exec(event->globalPos());
+    delete menu;
+}
+
+void FancyMainWindow::handleVisibilityChanged(bool visible)
+{
+    d->m_handleDockVisibilityChanges = false;
+    foreach (QDockWidget *dockWidget, dockWidgets()) {
+        if (dockWidget->isFloating()) {
+            dockWidget->setVisible(visible
+                && dockWidget->property(dockWidgetActiveState).toBool());
+        }
+    }
+    if (visible)
+        d->m_handleDockVisibilityChanges = true;
+}
+
+void FancyMainWindow::saveSettings(QSettings *settings) const
+{
+    QHash<QString, QVariant> hash = saveSettings();
+    QHashIterator<QString, QVariant> it(hash);
+    while (it.hasNext()) {
+        it.next();
+        settings->setValue(it.key(), it.value());
+    }
+}
+
+void FancyMainWindow::restoreSettings(const QSettings *settings)
+{
+    QHash<QString, QVariant> hash;
+    foreach (const QString &key, settings->childKeys()) {
+        hash.insert(key, settings->value(key));
+    }
+    restoreSettings(hash);
+}
+
+QHash<QString, QVariant> FancyMainWindow::saveSettings() const
+{
+    QHash<QString, QVariant> settings;
+    settings.insert(QLatin1String(stateKeyC), saveState(settingsVersion));
+    settings.insert(QLatin1String(lockedKeyC), d->m_locked);
+    foreach (QDockWidget *dockWidget, dockWidgets()) {
+        settings.insert(dockWidget->objectName(),
+                dockWidget->property(dockWidgetActiveState));
+    }
+    return settings;
+}
+
+void FancyMainWindow::restoreSettings(const QHash<QString, QVariant> &settings)
+{
+    QByteArray ba = settings.value(QLatin1String(stateKeyC),
+                                   QByteArray()).toByteArray();
+    if (!ba.isEmpty())
+        restoreState(ba, settingsVersion);
+    d->m_locked = settings.value(QLatin1String("Locked"), true).toBool();
+    d->m_toggleLockedAction.setChecked(d->m_locked);
+    foreach (QDockWidget *widget, dockWidgets()) {
+        widget->setProperty(dockWidgetActiveState,
+            settings.value(widget->objectName(), false));
+    }
+}
+
+QList<QDockWidget *> FancyMainWindow::dockWidgets() const
+{
+    return this->findChildren<QDockWidget *>();
+}
+
+bool FancyMainWindow::isLocked() const
+{
+    return d->m_locked;
+}
+
+static bool actionLessThan(const QAction *action1, const QAction *action2)
+{
+    QTC_ASSERT(action1, return true);
+    QTC_ASSERT(action2, return false);
+    return action1->text().toLower() < action2->text().toLower();
+}
+
+QMenu *FancyMainWindow::createPopupMenu()
+{
+    QList<QAction *> actions;
+    QList<QDockWidget *> dockwidgets = this->findChildren<QDockWidget *>();
+    for (int i = 0; i < dockwidgets.size(); ++i) {
+        QDockWidget *dockWidget = dockwidgets.at(i);
+        if (dockWidget->property("managed_dockwidget").isNull()
+                && dockWidget->parentWidget() == this) {
+            actions.append(dockwidgets.at(i)->toggleViewAction());
+        }
+    }
+    qSort(actions.begin(), actions.end(), actionLessThan);
+    QMenu *menu = new QMenu(this);
+    foreach (QAction *action, actions)
+        menu->addAction(action);
+    menu->addAction(&d->m_menuSeparator1);
+    menu->addAction(&d->m_toggleLockedAction);
+    menu->addAction(&d->m_menuSeparator2);
+    menu->addAction(&d->m_resetLayoutAction);
+    return menu;
+}
+
+QAction *FancyMainWindow::menuSeparator1() const
+{
+    return &d->m_menuSeparator1;
+}
+
+QAction *FancyMainWindow::toggleLockedAction() const
+{
+    return &d->m_toggleLockedAction;
+}
+
+QAction *FancyMainWindow::menuSeparator2() const
+{
+    return &d->m_menuSeparator2;
+}
+
+QAction *FancyMainWindow::resetLayoutAction() const
+{
+    return &d->m_resetLayoutAction;
+}
+
+void FancyMainWindow::setDockActionsVisible(bool v)
+{
+    foreach (const QDockWidget *dockWidget, dockWidgets())
+        dockWidget->toggleViewAction()->setVisible(v);
+    d->m_toggleLockedAction.setVisible(v);
+    d->m_menuSeparator1.setVisible(v);
+    d->m_menuSeparator2.setVisible(v);
+    d->m_resetLayoutAction.setVisible(v);
+}
+
+QDockWidget *FancyMainWindow::toolBarDockWidget() const
+{
+    return d->m_toolBarDockWidget;
+}
+
+void FancyMainWindow::setToolBarDockWidget(QDockWidget *dock)
+{
+    d->m_toolBarDockWidget = dock;
+}
+
+} // namespace Manhattan
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.h b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.h
new file mode 100644
index 0000000..4c28448
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef FANCYMAINWINDOW_H
+#define FANCYMAINWINDOW_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QMainWindow>
+
+QT_BEGIN_NAMESPACE
+class QSettings;
+QT_END_NAMESPACE
+
+namespace Manhattan {
+
+struct FancyMainWindowPrivate;
+
+class QTMANHATTANSTYLESHARED_EXPORT FancyMainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit FancyMainWindow(QWidget *parent = 0);
+    virtual ~FancyMainWindow();
+
+    /* The widget passed in should have an objectname set
+     * which will then be used as key for QSettings. */
+    QDockWidget *addDockForWidget(QWidget *widget);
+    QList<QDockWidget *> dockWidgets() const;
+
+    void setTrackingEnabled(bool enabled);
+    bool isLocked() const;
+
+    void saveSettings(QSettings *settings) const;
+    void restoreSettings(const QSettings *settings);
+    QHash<QString, QVariant> saveSettings() const;
+    void restoreSettings(const QHash<QString, QVariant> &settings);
+
+    // Additional context menu actions
+    QAction *menuSeparator1() const;
+    QAction *toggleLockedAction() const;
+    QAction *menuSeparator2() const;
+    QAction *resetLayoutAction() const;
+
+    // Overwritten to add locked/reset.
+    virtual QMenu *createPopupMenu();
+
+
+    QDockWidget *toolBarDockWidget() const;
+    void setToolBarDockWidget(QDockWidget *dock);
+
+signals:
+    // Emitted by resetLayoutAction(). Connect to a slot
+    // restoring the default layout.
+    void resetLayout();
+
+public slots:
+    void setLocked(bool locked);
+    void setDockActionsVisible(bool v);
+
+protected:
+    void hideEvent(QHideEvent *event);
+    void showEvent(QShowEvent *event);
+    void contextMenuEvent(QContextMenuEvent *event);
+private slots:
+    void onDockActionTriggered();
+    void onDockVisibilityChange(bool);
+    void onTopLevelChanged();
+
+private:
+    void updateDockWidget(QDockWidget *dockWidget);
+    void handleVisibilityChanged(bool visible);
+
+    FancyMainWindowPrivate *d;
+};
+
+} // namespace Manhattan
+
+#endif // FANCYMAINWINDOW_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancytabwidget.cpp b/ThirdParty/GUI/qt-manhattan-style/fancytabwidget.cpp
new file mode 100644
index 0000000..6187d05
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancytabwidget.cpp
@@ -0,0 +1,566 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "fancytabwidget.h"
+#include "stylehelper.h"
+#include "styledbar.h"
+
+#include <QDebug>
+
+#include <QColorDialog>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QMouseEvent>
+#include <QStyleFactory>
+#include <QPainter>
+#include <QSplitter>
+#include <QStackedLayout>
+#include <QStatusBar>
+#include <QToolButton>
+#include <QToolTip>
+#include <QAnimationGroup>
+#include <QPropertyAnimation>
+
+using namespace Manhattan;
+
+const int FancyTabBar::m_rounding = 22;
+const int FancyTabBar::m_textPadding = 4;
+
+void FancyTab::fadeIn()
+{
+    animator.stop();
+    animator.setDuration(80);
+    animator.setEndValue(40);
+    animator.start();
+}
+
+void FancyTab::fadeOut()
+{
+    animator.stop();
+    animator.setDuration(160);
+    animator.setEndValue(0);
+    animator.start();
+}
+
+void FancyTab::setFader(float value)
+{
+    m_fader = value;
+    tabbar->update();
+}
+
+FancyTabBar::FancyTabBar(QWidget *parent)
+    : QWidget(parent)
+{
+    m_hoverIndex = -1;
+    m_currentIndex = -1;
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+    setStyle(QStyleFactory::create(QLatin1String("windows")));
+    setMinimumWidth(qMax(2 * m_rounding, 40));
+    setAttribute(Qt::WA_Hover, true);
+    setFocusPolicy(Qt::NoFocus);
+    setMouseTracking(true); // Needed for hover events
+    m_triggerTimer.setSingleShot(true);
+
+    // We use a zerotimer to keep the sidebar responsive
+    connect(&m_triggerTimer, SIGNAL(timeout()), this, SLOT(emitCurrentIndex()));
+}
+
+FancyTabBar::~FancyTabBar()
+{
+    delete style();
+}
+
+QSize FancyTabBar::tabSizeHint(bool minimum) const
+{
+    QFont boldFont(font());
+    boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
+    boldFont.setBold(true);
+    QFontMetrics fm(boldFont);
+    int spacing = 8;
+    int width = 60 + spacing + 2;
+    int maxLabelwidth = 0;
+    for (int tab=0 ; tab<count() ;++tab) {
+        int width = fm.width(tabText(tab));
+        if (width > maxLabelwidth)
+            maxLabelwidth = width;
+    }
+    int iconHeight = minimum ? 0 : 48;
+    return QSize(qMax(width, maxLabelwidth + 4), iconHeight + spacing + fm.height());
+}
+
+void FancyTabBar::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+    QPainter p(this);
+
+    for (int i = 0; i < count(); ++i)
+        if (i != currentIndex())
+            paintTab(&p, i);
+
+    // paint active tab last, since it overlaps the neighbors
+    if (currentIndex() != -1)
+        paintTab(&p, currentIndex());
+}
+
+// Handle hover events for mouse fade ins
+void FancyTabBar::mouseMoveEvent(QMouseEvent *e)
+{
+    int newHover = -1;
+    for (int i = 0; i < count(); ++i) {
+        QRect area = tabRect(i);
+        if (area.contains(e->pos())) {
+            newHover = i;
+            break;
+        }
+    }
+    if (newHover == m_hoverIndex)
+        return;
+
+    if (validIndex(m_hoverIndex))
+        m_tabs[m_hoverIndex]->fadeOut();
+
+    m_hoverIndex = newHover;
+
+    if (validIndex(m_hoverIndex)) {
+        m_tabs[m_hoverIndex]->fadeIn();
+        m_hoverRect = tabRect(m_hoverIndex);
+    }
+}
+
+bool FancyTabBar::event(QEvent *event)
+{
+    if (event->type() == QEvent::ToolTip) {
+        if (validIndex(m_hoverIndex)) {
+            QString tt = tabToolTip(m_hoverIndex);
+            if (!tt.isEmpty()) {
+                QToolTip::showText(static_cast<QHelpEvent*>(event)->globalPos(), tt, this);
+                return true;
+            }
+        }
+    }
+    return QWidget::event(event);
+}
+
+// Resets hover animation on mouse enter
+void FancyTabBar::enterEvent(QEvent *e)
+{
+    Q_UNUSED(e)
+    m_hoverRect = QRect();
+    m_hoverIndex = -1;
+}
+
+// Resets hover animation on mouse enter
+void FancyTabBar::leaveEvent(QEvent *e)
+{
+    Q_UNUSED(e)
+    m_hoverIndex = -1;
+    m_hoverRect = QRect();
+    for (int i = 0 ; i < m_tabs.count() ; ++i) {
+        m_tabs[i]->fadeOut();
+    }
+}
+
+QSize FancyTabBar::sizeHint() const
+{
+    QSize sh = tabSizeHint();
+    return QSize(sh.width(), sh.height() * m_tabs.count());
+}
+
+QSize FancyTabBar::minimumSizeHint() const
+{
+    QSize sh = tabSizeHint(true);
+    return QSize(sh.width(), sh.height() * m_tabs.count());
+}
+
+QRect FancyTabBar::tabRect(int index) const
+{
+    QSize sh = tabSizeHint();
+
+    if (sh.height() * m_tabs.count() > height())
+        sh.setHeight(height() / m_tabs.count());
+
+    return QRect(0, index * sh.height(), sh.width(), sh.height());
+
+}
+
+// This keeps the sidebar responsive since
+// we get a repaint before loading the
+// mode itself
+void FancyTabBar::emitCurrentIndex()
+{
+    emit currentChanged(m_currentIndex);
+}
+
+void FancyTabBar::mousePressEvent(QMouseEvent *e)
+{
+    e->accept();
+    for (int index = 0; index < m_tabs.count(); ++index) {
+        if (tabRect(index).contains(e->pos())) {
+
+            if (isTabEnabled(index)) {
+                m_currentIndex = index;
+                update();
+                m_triggerTimer.start(0);
+            }
+            break;
+        }
+    }
+}
+
+void FancyTabBar::paintTab(QPainter *painter, int tabIndex) const
+{
+    if (!validIndex(tabIndex)) {
+        qWarning("invalid index");
+        return;
+    }
+    painter->save();
+
+    QRect rect = tabRect(tabIndex);
+    bool selected = (tabIndex == m_currentIndex);
+    bool enabled = isTabEnabled(tabIndex);
+
+    if (selected) {
+        //background
+        painter->save();
+        QLinearGradient grad(rect.topLeft(), rect.topRight());
+        grad.setColorAt(0, QColor(255, 255, 255, 140));
+        grad.setColorAt(1, QColor(255, 255, 255, 210));
+        painter->fillRect(rect.adjusted(0, 0, 0, -1), grad);
+        painter->restore();
+
+        //shadows
+        painter->setPen(QColor(0, 0, 0, 110));
+        painter->drawLine(rect.topLeft() + QPoint(1,-1), rect.topRight() - QPoint(0,1));
+        painter->drawLine(rect.bottomLeft(), rect.bottomRight());
+        painter->setPen(QColor(0, 0, 0, 40));
+        painter->drawLine(rect.topLeft(), rect.bottomLeft());
+
+        //highlights
+        painter->setPen(QColor(255, 255, 255, 50));
+        painter->drawLine(rect.topLeft() + QPoint(0, -2), rect.topRight() - QPoint(0,2));
+        painter->drawLine(rect.bottomLeft() + QPoint(0, 1), rect.bottomRight() + QPoint(0,1));
+        painter->setPen(QColor(255, 255, 255, 40));
+        painter->drawLine(rect.topLeft() + QPoint(0, 0), rect.topRight());
+        painter->drawLine(rect.topRight() + QPoint(0, 1), rect.bottomRight() - QPoint(0, 1));
+        painter->drawLine(rect.bottomLeft() + QPoint(0,-1), rect.bottomRight()-QPoint(0,1));
+    }
+
+    QString tabText(this->tabText(tabIndex));
+    QRect tabTextRect(tabRect(tabIndex));
+    QRect tabIconRect(tabTextRect);
+    tabTextRect.translate(0, -2);
+    QFont boldFont(painter->font());
+    boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
+    boldFont.setBold(true);
+    painter->setFont(boldFont);
+    painter->setPen(selected ? QColor(255, 255, 255, 160) : QColor(0, 0, 0, 110));
+    int textFlags = Qt::AlignCenter | Qt::AlignBottom | Qt::TextWordWrap;
+    if (enabled) {
+        painter->drawText(tabTextRect, textFlags, tabText);
+        painter->setPen(selected ? QColor(60, 60, 60) : Utils::StyleHelper::panelTextColor());
+    } else {
+        painter->setPen(selected ? Utils::StyleHelper::panelTextColor() : QColor(255, 255, 255, 120));
+    }
+#ifndef Q_OS_MAC
+    if (!selected && enabled) {
+        painter->save();
+        int fader = int(m_tabs[tabIndex]->fader());
+        QLinearGradient grad(rect.topLeft(), rect.topRight());
+        grad.setColorAt(0, Qt::transparent);
+        grad.setColorAt(0.5, QColor(255, 255, 255, fader));
+        grad.setColorAt(1, Qt::transparent);
+        painter->fillRect(rect, grad);
+        painter->setPen(QPen(grad, 1.0));
+        painter->drawLine(rect.topLeft(), rect.topRight());
+        painter->drawLine(rect.bottomLeft(), rect.bottomRight());
+        painter->restore();
+    }
+#endif
+
+    if (!enabled)
+        painter->setOpacity(0.7);
+
+    int textHeight = painter->fontMetrics().boundingRect(QRect(0, 0, width(), height()), Qt::TextWordWrap, tabText).height();
+    tabIconRect.adjust(0, 4, 0, -textHeight);
+    Utils::StyleHelper::drawIconWithShadow(tabIcon(tabIndex), tabIconRect, painter, enabled ? QIcon::Normal : QIcon::Disabled);
+
+    painter->translate(0, -1);
+    painter->drawText(tabTextRect, textFlags, tabText);
+    painter->restore();
+}
+
+void FancyTabBar::setCurrentIndex(int index) {
+    if (isTabEnabled(index)) {
+        m_currentIndex = index;
+        update();
+        emit currentChanged(m_currentIndex);
+    }
+}
+
+void FancyTabBar::setTabEnabled(int index, bool enable)
+{
+    Q_ASSERT(index < m_tabs.size());
+    Q_ASSERT(index >= 0);
+
+    if (index < m_tabs.size() && index >= 0) {
+        m_tabs[index]->enabled = enable;
+        update(tabRect(index));
+    }
+}
+
+bool FancyTabBar::isTabEnabled(int index) const
+{
+    Q_ASSERT(index < m_tabs.size());
+    Q_ASSERT(index >= 0);
+
+    if (index < m_tabs.size() && index >= 0)
+        return m_tabs[index]->enabled;
+
+    return false;
+}
+
+
+//////
+// FancyColorButton
+//////
+
+class FancyColorButton : public QWidget
+{
+public:
+    FancyColorButton(QWidget *parent)
+      : m_parent(parent)
+    {
+        setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+    }
+
+    void mousePressEvent(QMouseEvent *ev)
+    {
+        if (ev->modifiers() & Qt::ShiftModifier) {
+            QColor color = QColorDialog::getColor(Utils::StyleHelper::requestedBaseColor(), m_parent);
+            if (color.isValid())
+                Utils::StyleHelper::setBaseColor(color);
+        }
+    }
+private:
+    QWidget *m_parent;
+};
+
+//////
+// FancyTabWidget
+//////
+
+FancyTabWidget::FancyTabWidget(QWidget *parent)
+    : QWidget(parent)
+{
+    m_tabBar = new FancyTabBar(this);
+
+    m_selectionWidget = new QWidget(this);
+    QVBoxLayout *selectionLayout = new QVBoxLayout;
+    selectionLayout->setSpacing(0);
+    selectionLayout->setMargin(0);
+
+    // top stub
+    StyledBar *bar = new StyledBar;
+    QHBoxLayout *layout = new QHBoxLayout(bar);
+    layout->setMargin(0);
+    layout->setSpacing(0);
+    layout->addWidget(new FancyColorButton(this));
+    selectionLayout->addWidget(bar);
+
+    // top corner widget container
+    m_topCornerWidgetContainer = new QWidget(this);
+    m_topCornerWidgetContainer->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
+    m_topCornerWidgetContainer->setAutoFillBackground(false);
+    QVBoxLayout *topCornerWidgetLayout = new QVBoxLayout;
+    topCornerWidgetLayout->setSpacing(0);
+    topCornerWidgetLayout->setMargin(0);
+    m_topCornerWidgetContainer->setLayout(topCornerWidgetLayout);
+    selectionLayout->addWidget(m_topCornerWidgetContainer, 0);
+
+    // Tab bar
+    selectionLayout->addWidget(m_tabBar, 1);
+    m_selectionWidget->setLayout(selectionLayout);
+    m_selectionWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+
+    // bottom corner widget container
+    m_bottomCornerWidgetContainer = new QWidget(this);
+    m_bottomCornerWidgetContainer->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
+    m_bottomCornerWidgetContainer->setAutoFillBackground(false);
+    QVBoxLayout *bottomCornerWidgetLayout = new QVBoxLayout;
+    bottomCornerWidgetLayout->setSpacing(0);
+    bottomCornerWidgetLayout->setMargin(0);
+    m_bottomCornerWidgetContainer->setLayout(bottomCornerWidgetLayout);
+    selectionLayout->addWidget(m_bottomCornerWidgetContainer, 0);
+
+    m_modesStack = new QStackedLayout;
+    m_statusBar = new QStatusBar;
+    m_statusBar->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
+
+    QVBoxLayout *vlayout = new QVBoxLayout;
+    vlayout->setMargin(0);
+    vlayout->setSpacing(0);
+    vlayout->addLayout(m_modesStack);
+    vlayout->addWidget(m_statusBar);
+
+    QHBoxLayout *mainLayout = new QHBoxLayout;
+    mainLayout->setMargin(0);
+    mainLayout->setSpacing(1);
+    mainLayout->addWidget(m_selectionWidget);
+    mainLayout->addLayout(vlayout);
+    setLayout(mainLayout);
+
+    connect(m_tabBar, SIGNAL(currentChanged(int)), this, SLOT(showWidget(int)));
+}
+
+void FancyTabWidget::setSelectionWidgetHidden(bool hidden) {
+    m_selectionWidget->setHidden(hidden);
+}
+
+//void FancyTabWidget::insertTab(int index, QWidget *tab, const QIcon &icon)
+void FancyTabWidget::insertTab(int index, QWidget *tab, const QIcon &icon, const QString &label)
+{
+//    QString label("XXX");
+    m_modesStack->insertWidget(index, tab);
+    m_tabBar->insertTab(index, icon, label);
+    setTabEnabled(index, true);
+}
+
+void FancyTabWidget::removeTab(int index)
+{
+    m_modesStack->removeWidget(m_modesStack->widget(index));
+    m_tabBar->removeTab(index);
+}
+
+void FancyTabWidget::removeTabs()
+{
+    while (m_modesStack->count() != 0)
+    {
+        m_modesStack->removeWidget(m_modesStack->widget(0));
+        m_tabBar->removeTab(0);
+    }
+}
+
+void FancyTabWidget::setBackgroundBrush(const QBrush &brush)
+{
+    QPalette pal = m_tabBar->palette();
+    pal.setBrush(QPalette::Mid, brush);
+    m_tabBar->setPalette(pal);
+    pal = m_topCornerWidgetContainer->palette();
+    pal.setBrush(QPalette::Mid, brush);
+    m_topCornerWidgetContainer->setPalette(pal);
+    pal = m_bottomCornerWidgetContainer->palette();
+    pal.setBrush(QPalette::Mid, brush);
+    m_bottomCornerWidgetContainer->setPalette(pal);
+}
+
+void FancyTabWidget::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+    QPainter painter(this);
+
+    QRect rect = m_selectionWidget->rect().adjusted(0, 0, 1, 0);
+    rect = style()->visualRect(layoutDirection(), geometry(), rect);
+    Utils::StyleHelper::verticalGradient(&painter, rect, rect);
+    painter.setPen(Utils::StyleHelper::borderColor());
+    painter.drawLine(rect.topRight(), rect.bottomRight());
+
+    QColor light = Utils::StyleHelper::sidebarHighlight();
+    painter.setPen(light);
+    painter.drawLine(rect.bottomLeft(), rect.bottomRight());
+}
+
+void FancyTabWidget::insertTopCornerWidget(int pos, QWidget *widget)
+{
+    QVBoxLayout *layout = static_cast<QVBoxLayout *>(m_topCornerWidgetContainer->layout());
+    layout->insertWidget(pos, widget);
+}
+
+int FancyTabWidget::topCornerWidgetCount() const
+{
+    return m_topCornerWidgetContainer->layout()->count();
+}
+
+void FancyTabWidget::addTopCornerWidget(QWidget *widget)
+{
+    m_topCornerWidgetContainer->layout()->addWidget(widget);
+}
+
+void FancyTabWidget::insertBottomCornerWidget(int pos, QWidget *widget)
+{
+    QVBoxLayout *layout = static_cast<QVBoxLayout *>(m_bottomCornerWidgetContainer->layout());
+    layout->insertWidget(pos, widget);
+}
+
+int FancyTabWidget::bottomCornerWidgetCount() const
+{
+    return m_bottomCornerWidgetContainer->layout()->count();
+}
+
+void FancyTabWidget::addBottomCornerWidget(QWidget *widget)
+{
+    m_bottomCornerWidgetContainer->layout()->addWidget(widget);
+}
+
+int FancyTabWidget::currentIndex() const
+{
+    return m_tabBar->currentIndex();
+}
+
+QStatusBar *FancyTabWidget::statusBar() const
+{
+    return m_statusBar;
+}
+
+void FancyTabWidget::setCurrentIndex(int index)
+{
+    if (m_tabBar->isTabEnabled(index))
+        m_tabBar->setCurrentIndex(index);
+}
+
+void FancyTabWidget::showWidget(int index)
+{
+    emit currentAboutToShow(index);
+    m_modesStack->setCurrentIndex(index);
+    emit currentChanged(index);
+}
+
+void FancyTabWidget::setTabToolTip(int index, const QString &toolTip)
+{
+    m_tabBar->setTabToolTip(index, toolTip);
+}
+
+void FancyTabWidget::setTabEnabled(int index, bool enable)
+{
+    m_tabBar->setTabEnabled(index, enable);
+}
+
+bool FancyTabWidget::isTabEnabled(int index) const
+{
+    return m_tabBar->isTabEnabled(index);
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancytabwidget.h b/ThirdParty/GUI/qt-manhattan-style/fancytabwidget.h
new file mode 100644
index 0000000..fab7b31
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/fancytabwidget.h
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef FANCYTABWIDGET_H
+#define FANCYTABWIDGET_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QIcon>
+#include <QWidget>
+
+#include <QTimer>
+#include <QPropertyAnimation>
+
+QT_BEGIN_NAMESPACE
+class QPainter;
+class QStackedLayout;
+class QStatusBar;
+QT_END_NAMESPACE
+
+namespace Manhattan {
+
+class QTMANHATTANSTYLESHARED_EXPORT FancyTab : public QObject
+{
+    Q_OBJECT
+
+    Q_PROPERTY(float fader READ fader WRITE setFader)
+public:
+    FancyTab(QWidget *tabbar) : QObject(tabbar), enabled(false), tabbar(tabbar), m_fader(0) {
+        animator.setPropertyName("fader");
+        animator.setTargetObject(this);
+    }
+    float fader() { return m_fader; }
+    void setFader(float value);
+
+    void fadeIn();
+    void fadeOut();
+
+    QIcon icon;
+    QString text;
+    QString toolTip;
+    bool enabled;
+
+private:
+    QPropertyAnimation animator;
+    QWidget *tabbar;
+    float m_fader;
+};
+
+class FancyTabBar : public QWidget
+{
+    Q_OBJECT
+
+public:
+    FancyTabBar(QWidget *parent = 0);
+    virtual ~FancyTabBar();
+
+    bool event(QEvent *event);
+
+    virtual void paintEvent(QPaintEvent *event);
+    void paintTab(QPainter *painter, int tabIndex) const;
+    virtual void mousePressEvent(QMouseEvent *);
+    virtual void mouseMoveEvent(QMouseEvent *);
+    virtual void enterEvent(QEvent *);
+    virtual void leaveEvent(QEvent *);
+    bool validIndex(int index) const { return index >= 0 && index < m_tabs.count(); }
+
+    virtual QSize sizeHint() const;
+    virtual QSize minimumSizeHint() const;
+
+    void setTabEnabled(int index, bool enable);
+    bool isTabEnabled(int index) const;
+
+    void insertTab(int index, const QIcon &icon, const QString &label) {
+        FancyTab *tab = new FancyTab(this);
+        tab->icon = icon;
+        tab->text = label;
+        m_tabs.insert(index, tab);
+    }
+    void setEnabled(int index, bool enabled);
+    void removeTab(int index) {
+        FancyTab *tab = m_tabs.takeAt(index);
+        delete tab;
+    }
+    void setCurrentIndex(int index);
+    int currentIndex() const { return m_currentIndex; }
+
+    void setTabToolTip(int index, QString toolTip) { m_tabs[index]->toolTip = toolTip; }
+    QString tabToolTip(int index) const { return m_tabs.at(index)->toolTip; }
+
+    QIcon tabIcon(int index) const { return m_tabs.at(index)->icon; }
+    QString tabText(int index) const { return m_tabs.at(index)->text; }
+    int count() const {return m_tabs.count(); }
+    QRect tabRect(int index) const;
+
+signals:
+    void currentChanged(int);
+
+public slots:
+    void emitCurrentIndex();
+
+private:
+    static const int m_rounding;
+    static const int m_textPadding;
+    QRect m_hoverRect;
+    int m_hoverIndex;
+    int m_currentIndex;
+    QList<FancyTab*> m_tabs;
+    QTimer m_triggerTimer;
+    QSize tabSizeHint(bool minimum = false) const;
+
+};
+
+class QTMANHATTANSTYLESHARED_EXPORT FancyTabWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    FancyTabWidget(QWidget *parent = 0);
+
+//    void insertTab(int index, QWidget *tab, const QIcon &icon);
+    void insertTab(int index, QWidget *tab, const QIcon &icon, const QString &label);
+    void removeTab(int index);
+    void removeTabs();
+    void setBackgroundBrush(const QBrush &brush);
+    void addTopCornerWidget(QWidget *widget);
+    void insertTopCornerWidget(int pos, QWidget *widget);
+    void addBottomCornerWidget(QWidget *widget);
+    void insertBottomCornerWidget(int pos, QWidget *widget);
+    int topCornerWidgetCount() const;
+    int bottomCornerWidgetCount() const;
+    void setTabToolTip(int index, const QString &toolTip);
+
+    void paintEvent(QPaintEvent *event);
+
+    int currentIndex() const;
+    QStatusBar *statusBar() const;
+
+    void setTabEnabled(int index, bool enable);
+    bool isTabEnabled(int index) const;
+
+signals:
+    void currentAboutToShow(int index);
+    void currentChanged(int index);
+
+public slots:
+    void setCurrentIndex(int index);
+    void setSelectionWidgetHidden(bool hidden);
+
+private slots:
+    void showWidget(int index);
+
+private:
+    FancyTabBar *m_tabBar;
+    QWidget *m_topCornerWidgetContainer;
+    QWidget *m_bottomCornerWidgetContainer;
+    QStackedLayout *m_modesStack;
+    QWidget *m_selectionWidget;
+    QStatusBar *m_statusBar;
+};
+
+} // namespace Manhattan
+
+#endif // FANCYTABWIDGET_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/historycompleter.cpp b/ThirdParty/GUI/qt-manhattan-style/historycompleter.cpp
new file mode 100644
index 0000000..53e283b
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/historycompleter.cpp
@@ -0,0 +1,222 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "historycompleter.h"
+
+#include "qtcassert.h"
+
+#include <QAbstractListModel>
+#include <QSettings>
+
+#include <QItemDelegate>
+#include <QKeyEvent>
+#include <QLineEdit>
+#include <QListView>
+#include <QPainter>
+#include <QStyle>
+
+namespace Manhattan {
+
+static QSettings *theSettings = 0;
+
+class HistoryCompleterPrivate : public QAbstractListModel
+{
+public:
+    HistoryCompleterPrivate() : maxLines(30), lineEdit(0) {}
+
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
+
+    void clearHistory();
+    void saveEntry(const QString &str);
+
+    QStringList list;
+    QString historyKey;
+    int maxLines;
+    QLineEdit *lineEdit;
+};
+
+class HistoryLineDelegate : public QItemDelegate
+{
+public:
+    HistoryLineDelegate()
+        : pixmap(QLatin1String(":/core/images/editclear.png"))
+    {}
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+    {
+        QItemDelegate::paint(painter,option,index);
+        QRect r = QStyle::alignedRect(option.direction, Qt::AlignRight | Qt::AlignVCenter , pixmap.size(), option.rect);
+        painter->drawPixmap(r, pixmap);
+    }
+
+    QPixmap pixmap;
+};
+
+class HistoryLineView : public QListView
+{
+public:
+    HistoryLineView(HistoryCompleterPrivate *model_)
+        : model(model_)
+    {
+        HistoryLineDelegate *delegate = new HistoryLineDelegate;
+        pixmapWidth = delegate->pixmap.width();
+        setItemDelegate(delegate);
+    }
+
+private:
+    void mousePressEvent(QMouseEvent *event)
+    {
+        int rr= event->x();
+        if (layoutDirection() == Qt::LeftToRight)
+            rr = viewport()->width() - event->x();
+        if (rr < pixmapWidth) {
+            model->removeRow(indexAt(event->pos()).row());
+            return;
+        }
+        QListView::mousePressEvent(event);
+    }
+
+    HistoryCompleterPrivate *model;
+    int pixmapWidth;
+};
+
+int HistoryCompleterPrivate::rowCount(const QModelIndex &parent) const
+{
+    return parent.isValid() ? 0 : list.count();
+}
+
+QVariant HistoryCompleterPrivate::data(const QModelIndex &index, int role) const
+{
+    if (index.row() >= list.count() || index.column() != 0)
+        return QVariant();
+    if (role == Qt::DisplayRole || role == Qt::EditRole)
+        return list.at(index.row());
+    return QVariant();
+}
+
+bool HistoryCompleterPrivate::removeRows(int row, int count, const QModelIndex &parent)
+{
+    beginRemoveRows (parent, row, row + count);
+    list.removeAt(row);
+    theSettings->setValue(historyKey, list);
+    endRemoveRows();
+    return true;
+}
+
+void HistoryCompleterPrivate::clearHistory()
+{
+    list.clear();
+    beginResetModel();
+    endResetModel();
+}
+
+void HistoryCompleterPrivate::saveEntry(const QString &str)
+{
+    QTC_ASSERT(theSettings, return);
+    if (str.isEmpty())
+        return;
+    if (list.contains(str))
+        return;
+    beginInsertRows (QModelIndex(), list.count(), list.count());
+    list.prepend(str);
+    list = list.mid(0, maxLines);
+    endInsertRows();
+    theSettings->setValue(historyKey, list);
+}
+
+HistoryCompleter::HistoryCompleter(QLineEdit *lineEdit, const QString &historyKey, QObject *parent)
+    : QCompleter(parent),
+      d(new HistoryCompleterPrivate)
+{
+    QTC_ASSERT(lineEdit, return);
+    QTC_ASSERT(!historyKey.isEmpty(), return);
+    QTC_ASSERT(theSettings, return);
+
+    d->historyKey = QLatin1String("CompleterHistory/") + historyKey;
+    d->list = theSettings->value(d->historyKey).toStringList();
+    d->lineEdit = lineEdit;
+    if (d->list.count())
+        lineEdit->setText(d->list.at(0));
+
+    setModel(d);
+    setPopup(new HistoryLineView(d));
+    lineEdit->installEventFilter(this);
+
+    connect(lineEdit, SIGNAL(editingFinished()), this, SLOT(saveHistory()));
+}
+
+HistoryCompleter::~HistoryCompleter()
+{
+    delete d;
+}
+
+bool HistoryCompleter::eventFilter(QObject *obj, QEvent *event)
+{
+    if (event->type() == QEvent::KeyPress
+            && static_cast<QKeyEvent *>(event)->key() == Qt::Key_Down
+            && !popup()->isVisible()) {
+        setCompletionPrefix(QString());
+        complete();
+    }
+    return QCompleter::eventFilter(obj, event);
+}
+
+int HistoryCompleter::historySize() const
+{
+    return d->rowCount();
+}
+
+int HistoryCompleter::maximalHistorySize() const
+{
+    return d->maxLines;
+}
+
+void HistoryCompleter::setMaximalHistorySize(int numberOfEntries)
+{
+    d->maxLines = numberOfEntries;
+}
+
+void HistoryCompleter::clearHistory()
+{
+    d->clearHistory();
+}
+
+void HistoryCompleter::saveHistory()
+{
+    d->saveEntry(d->lineEdit->text());
+}
+
+void HistoryCompleter::setSettings(QSettings *settings)
+{
+    theSettings = settings;
+}
+
+} // namespace Manhattan
diff --git a/ThirdParty/GUI/qt-manhattan-style/historycompleter.h b/ThirdParty/GUI/qt-manhattan-style/historycompleter.h
new file mode 100644
index 0000000..1413546
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/historycompleter.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef HISTORYCOMPLETER_H
+#define HISTORYCOMPLETER_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QCompleter>
+
+QT_BEGIN_NAMESPACE
+class QLineEdit;
+class QSettings;
+QT_END_NAMESPACE
+
+namespace Manhattan {
+
+class HistoryCompleterPrivate;
+
+class QTMANHATTANSTYLESHARED_EXPORT HistoryCompleter : public QCompleter
+{
+    Q_OBJECT
+
+public:
+    static void setSettings(QSettings *settings);
+    HistoryCompleter(QLineEdit *lineEdit, const QString &historyKey, QObject *parent = 0);
+
+private:
+    virtual ~HistoryCompleter();
+    int historySize() const;
+    int maximalHistorySize() const;
+    void setMaximalHistorySize(int numberOfEntries);
+    virtual bool eventFilter(QObject *obj, QEvent *event);
+
+public Q_SLOTS:
+    void clearHistory();
+    void saveHistory();
+
+private:
+    HistoryCompleterPrivate *d;
+};
+
+} // namespace Manhattan
+
+#endif // HISTORYCOMPLETER_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/manhattanstyle.cpp b/ThirdParty/GUI/qt-manhattan-style/manhattanstyle.cpp
new file mode 100644
index 0000000..0d3baec
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/manhattanstyle.cpp
@@ -0,0 +1,1034 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "manhattanstyle.h"
+
+#include "styleanimator.h"
+
+#include <QLibrary>
+
+#include "coreconstants.h"
+
+#include "qtcassert.h"
+#include "stylehelper.h"
+
+#include "fancymainwindow.h"
+
+#include <QApplication>
+#include <QComboBox>
+#include <QDialogButtonBox>
+#include <QDockWidget>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMenuBar>
+#include <QPainter>
+#include <QPixmap>
+#include <QPixmapCache>
+#include <QPushButton>
+#include <QScrollArea>
+#include <QSplitter>
+#include <QStatusBar>
+#include <QStyleFactory>
+#include <QStyleOption>
+#include <QToolBar>
+#include <QTreeView>
+#include <QToolButton>
+#include <QAbstractItemView>
+#include <QDebug>
+
+using namespace Manhattan;
+
+// We define a currently unused state for indicating animations
+const QStyle::State State_Animating = QStyle::State(0x00000040);
+
+// Because designer needs to disable this for widget previews
+// we have a custom property that is inherited
+bool styleEnabled(const QWidget *widget)
+{
+    const QWidget *p = widget;
+    while (p) {
+        if (p->property("_q_custom_style_disabled").toBool())
+            return false;
+        p = p->parentWidget();
+    }
+    return true;
+}
+
+// Consider making this a QStyle state
+bool panelWidget(const QWidget *widget)
+{
+    if (!widget)
+        return false;
+
+    // Do not style dialogs or explicitly ignored widgets
+    if ((widget->window()->windowFlags() & Qt::WindowType_Mask) == Qt::Dialog)
+        return false;
+
+    if (qobject_cast<const Manhattan::FancyMainWindow *>(widget))
+        return true;
+
+    if (qobject_cast<const QTabBar *>(widget))
+        return styleEnabled(widget);
+
+    const QWidget *p = widget;
+    while (p) {
+        if (qobject_cast<const QToolBar *>(p) ||
+            qobject_cast<const QStatusBar *>(p) ||
+            qobject_cast<const QMenuBar *>(p) ||
+            p->property("panelwidget").toBool())
+            return styleEnabled(widget);
+        p = p->parentWidget();
+    }
+    return false;
+}
+
+// Consider making this a QStyle state
+bool lightColored(const QWidget *widget)
+{
+    if (!widget)
+        return false;
+
+    // Don't style dialogs or explicitly ignored widgets
+    if ((widget->window()->windowFlags() & Qt::WindowType_Mask) == Qt::Dialog)
+        return false;
+
+    const QWidget *p = widget;
+    while (p) {
+        if (p->property("lightColored").toBool())
+            return true;
+        p = p->parentWidget();
+    }
+    return false;
+}
+
+bool hasProperty(const QWidget *widget, const QByteArray& name)
+{
+    if (!widget)
+        return false;
+
+    // Don't style dialogs or explicitly ignored widgets
+    if ((widget->window()->windowFlags() & Qt::WindowType_Mask) == Qt::Dialog)
+        return false;
+
+    const QWidget *p = widget;
+    while (p) {
+        if (p->property(name).isValid())
+            return true;
+        p = p->parentWidget();
+    }
+    return false;
+}
+
+class ManhattanStylePrivate
+{
+public:
+    explicit ManhattanStylePrivate();
+    void init();
+
+public:
+    const QImage lineeditImage;
+    const QImage lineeditImage_disabled;
+    const QPixmap extButtonPixmap;
+    const QPixmap closeButtonPixmap;
+    StyleAnimator animator;
+};
+
+ManhattanStylePrivate::ManhattanStylePrivate() :
+    lineeditImage(QLatin1String(":/core/images/inputfield.png")),
+    lineeditImage_disabled(QLatin1String(":/core/images/inputfield_disabled.png")),
+    extButtonPixmap(QLatin1String(":/core/images/extension.png")),
+    closeButtonPixmap(QLatin1String(Manhattan::Constants::ICON_CLOSE))
+{
+}
+
+ManhattanStyle::ManhattanStyle(const QString &baseStyleName)
+    : QProxyStyle(QStyleFactory::create(baseStyleName)),
+    d(new ManhattanStylePrivate())
+{
+}
+
+ManhattanStyle::~ManhattanStyle()
+{
+    delete d;
+    d = 0;
+}
+
+QPixmap ManhattanStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const
+{
+    return QProxyStyle::generatedIconPixmap(iconMode, pixmap, opt);
+}
+
+QSize ManhattanStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
+                                       const QSize &size, const QWidget *widget) const
+{
+    QSize newSize = QProxyStyle::sizeFromContents(type, option, size, widget);
+
+    if (type == CT_Splitter && widget && widget->property("minisplitter").toBool())
+        return QSize(1, 1);
+    else if (type == CT_ComboBox && panelWidget(widget))
+        newSize += QSize(14, 0);
+    return newSize;
+}
+
+QRect ManhattanStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const
+{
+    return QProxyStyle::subElementRect(element, option, widget);
+}
+
+QRect ManhattanStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option,
+                                     SubControl subControl, const QWidget *widget) const
+{
+    return QProxyStyle::subControlRect(control, option, subControl, widget);
+}
+
+QStyle::SubControl ManhattanStyle::hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option,
+                                                         const QPoint &pos, const QWidget *widget) const
+{
+    return QProxyStyle::hitTestComplexControl(control, option, pos, widget);
+}
+
+int ManhattanStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
+{
+    int retval = 0;
+    retval = QProxyStyle::pixelMetric(metric, option, widget);
+    switch (metric) {
+    case PM_SplitterWidth:
+        if (widget && widget->property("minisplitter").toBool())
+            retval = 1;
+        break;
+    case PM_ToolBarIconSize:
+        if (panelWidget(widget))
+            retval = 16;
+        break;
+    case PM_DockWidgetHandleExtent:
+    case PM_DockWidgetSeparatorExtent:
+        return 1;
+    case PM_MenuPanelWidth:
+    case PM_MenuBarHMargin:
+    case PM_MenuBarVMargin:
+    case PM_ToolBarFrameWidth:
+        if (panelWidget(widget))
+            retval = 1;
+        break;
+    case PM_ButtonShiftVertical:
+    case PM_ButtonShiftHorizontal:
+    case PM_MenuBarPanelWidth:
+    case PM_ToolBarItemMargin:
+    case PM_ToolBarItemSpacing:
+        if (panelWidget(widget))
+            retval = 0;
+        break;
+    case PM_DefaultFrameWidth:
+        if (qobject_cast<const QLineEdit*>(widget) && panelWidget(widget))
+            return 1;
+        break;
+    default:
+        break;
+    }
+    return retval;
+}
+
+QPalette ManhattanStyle::standardPalette() const
+{
+    return QProxyStyle::standardPalette();
+}
+
+void ManhattanStyle::polish(QApplication *app)
+{
+    return QProxyStyle::polish(app);
+}
+
+void ManhattanStyle::unpolish(QApplication *app)
+{
+    return QProxyStyle::unpolish(app);
+}
+
+QPalette panelPalette(const QPalette &oldPalette, bool lightColored = false)
+{
+    QColor color = Utils::StyleHelper::panelTextColor(lightColored);
+    QPalette pal = oldPalette;
+    pal.setBrush(QPalette::All, QPalette::WindowText, color);
+    pal.setBrush(QPalette::All, QPalette::ButtonText, color);
+    pal.setBrush(QPalette::All, QPalette::Foreground, color);
+    color.setAlpha(100);
+    pal.setBrush(QPalette::Disabled, QPalette::WindowText, color);
+    pal.setBrush(QPalette::Disabled, QPalette::ButtonText, color);
+    pal.setBrush(QPalette::Disabled, QPalette::Foreground, color);
+    return pal;
+}
+
+#include <QDebug>
+
+void ManhattanStyle::polish(QWidget *widget)
+{
+    QProxyStyle::polish(widget);
+
+    // g.p. added KDE 5 style to avoid one pixel frame
+    // see styles ./qtbase/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
+
+    // OxygenStyle forces a rounded widget mask on toolbars and dock widgets
+    if (baseStyle()->inherits("OxygenStyle") || baseStyle()->inherits("Oxygen::Style")
+            || baseStyle()->inherits("Breeze::Style")) {
+        if (qobject_cast<QToolBar*>(widget) || qobject_cast<QDockWidget*>(widget)) {
+            widget->removeEventFilter(baseStyle());
+            widget->setContentsMargins(0, 0, 0, 0);
+        }
+    }
+    if (panelWidget(widget)) {
+
+        // Oxygen and possibly other styles override this
+        if (qobject_cast<QDockWidget*>(widget))
+            widget->setContentsMargins(0, 0, 0, 0);
+
+        widget->setAttribute(Qt::WA_LayoutUsesWidgetRect, true);
+        if (qobject_cast<QToolButton*>(widget)) {
+            widget->setAttribute(Qt::WA_Hover);
+            widget->setMaximumHeight(Utils::StyleHelper::navigationWidgetHeight() - 2);
+        }
+        else if (qobject_cast<QLineEdit*>(widget)) {
+            widget->setAttribute(Qt::WA_Hover);
+            widget->setMaximumHeight(Utils::StyleHelper::navigationWidgetHeight() - 2);
+        }
+        else if (qobject_cast<QLabel*>(widget))
+            widget->setPalette(panelPalette(widget->palette(), lightColored(widget)));
+        else if (widget->property("panelwidget_singlerow").toBool())
+            widget->setFixedHeight(Utils::StyleHelper::navigationWidgetHeight());
+        else if (qobject_cast<QStatusBar*>(widget))
+            widget->setFixedHeight(Utils::StyleHelper::navigationWidgetHeight() + 2);
+        else if (qobject_cast<QComboBox*>(widget)) {
+            widget->setMaximumHeight(Utils::StyleHelper::navigationWidgetHeight() - 2);
+            widget->setAttribute(Qt::WA_Hover);
+        }
+    }
+}
+
+void ManhattanStyle::unpolish(QWidget *widget)
+{
+    QProxyStyle::unpolish(widget);
+    if (panelWidget(widget)) {
+        widget->setAttribute(Qt::WA_LayoutUsesWidgetRect, false);
+        if (qobject_cast<QTabBar*>(widget))
+            widget->setAttribute(Qt::WA_Hover, false);
+        else if (qobject_cast<QToolBar*>(widget))
+            widget->setAttribute(Qt::WA_Hover, false);
+        else if (qobject_cast<QComboBox*>(widget))
+            widget->setAttribute(Qt::WA_Hover, false);
+    }
+}
+
+void ManhattanStyle::polish(QPalette &pal)
+{
+    QProxyStyle::polish(pal);
+}
+
+QIcon ManhattanStyle::standardIconImplementation(StandardPixmap standardIcon, const QStyleOption *option, const QWidget *widget) const
+{
+    QIcon icon;
+    switch (standardIcon) {
+    case QStyle::SP_TitleBarCloseButton:
+    case QStyle::SP_ToolBarHorizontalExtensionButton:
+        return QIcon(standardPixmap(standardIcon, option, widget));
+    default:
+        icon = baseStyle()->standardIcon(standardIcon, option, widget);
+    }
+    return icon;
+}
+
+QPixmap ManhattanStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt,
+                                       const QWidget *widget) const
+{
+    if (widget && !panelWidget(widget))
+        return QProxyStyle::standardPixmap(standardPixmap, opt, widget);
+
+    QPixmap pixmap;
+    switch (standardPixmap) {
+    case QStyle::SP_ToolBarHorizontalExtensionButton:
+        pixmap = d->extButtonPixmap;
+        break;
+    case QStyle::SP_TitleBarCloseButton:
+        pixmap = d->closeButtonPixmap;
+        break;
+    default:
+        pixmap = QProxyStyle::standardPixmap(standardPixmap, opt, widget);
+        break;
+    }
+    return pixmap;
+}
+
+int ManhattanStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
+                              QStyleHintReturn *returnData) const
+{
+    int ret = QProxyStyle::styleHint(hint, option, widget, returnData);
+    switch (hint) {
+    // Make project explorer alternate rows all the way
+    case QStyle::SH_ItemView_PaintAlternatingRowColorsForEmptyArea:
+        if (widget && widget->property("AlternateEmpty").toBool())
+            ret = true;
+        break;
+    case QStyle::SH_EtchDisabledText:
+        if (panelWidget(widget))
+            ret = false;
+        break;
+    case QStyle::SH_ItemView_ArrowKeysNavigateIntoChildren:
+        ret = true;
+        break;
+    default:
+        break;
+    }
+    return ret;
+}
+
+void ManhattanStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
+                                   QPainter *painter, const QWidget *widget) const
+{
+    if (!panelWidget(widget))
+        return QProxyStyle::drawPrimitive(element, option, painter, widget);
+
+    bool animating = (option->state & State_Animating);
+    int state = option->state;
+    QRect rect = option->rect;
+    QRect oldRect;
+    QRect newRect;
+    if (widget && (element == PE_PanelButtonTool) && !animating) {
+        QWidget *w = const_cast<QWidget *> (widget);
+        int oldState = w->property("_q_stylestate").toInt();
+        oldRect = w->property("_q_stylerect").toRect();
+        newRect = w->rect();
+        w->setProperty("_q_stylestate", (int)option->state);
+        w->setProperty("_q_stylerect", w->rect());
+
+        // Determine the animated transition
+        bool doTransition = ((state & State_On)         != (oldState & State_On)     ||
+                             (state & State_MouseOver)  != (oldState & State_MouseOver));
+
+#ifndef Q_OS_MAC
+        if (oldRect != newRect)
+        {
+            doTransition = false;
+            d->animator.stopAnimation(widget);
+        }
+#else
+        doTransition = false;
+        d->animator.stopAnimation(widget);
+#endif
+
+
+        if (doTransition) {
+            QImage startImage(option->rect.size(), QImage::Format_ARGB32_Premultiplied);
+            QImage endImage(option->rect.size(), QImage::Format_ARGB32_Premultiplied);
+            Animation *anim = d->animator.widgetAnimation(widget);
+            QStyleOption opt = *option;
+            opt.state = (QStyle::State)oldState;
+            opt.state |= State_Animating;
+            startImage.fill(0);
+            Transition *t = new Transition;
+            t->setWidget(w);
+            QPainter startPainter(&startImage);
+            if (!anim) {
+                drawPrimitive(element, &opt, &startPainter, widget);
+            } else {
+                anim->paint(&startPainter, &opt);
+                d->animator.stopAnimation(widget);
+            }
+            QStyleOption endOpt = *option;
+            endOpt.state |= State_Animating;
+            t->setStartImage(startImage);
+            d->animator.startAnimation(t);
+            endImage.fill(0);
+            QPainter endPainter(&endImage);
+            drawPrimitive(element, &endOpt, &endPainter, widget);
+            t->setEndImage(endImage);
+            if (oldState & State_MouseOver)
+                t->setDuration(150);
+            else
+                t->setDuration(75);
+            t->setStartTime(QTime::currentTime());
+        }
+    }
+
+    switch (element) {
+    case PE_IndicatorDockWidgetResizeHandle:
+        painter->fillRect(option->rect, Utils::StyleHelper::borderColor());
+        break;
+    case PE_FrameDockWidget:
+        QCommonStyle::drawPrimitive(element, option, painter, widget);
+        break;
+    case PE_PanelLineEdit:
+        {
+            painter->save();
+
+            // Fill the line edit background
+            QRect filledRect = option->rect.adjusted(1, 1, -1, -1);
+            painter->setBrushOrigin(filledRect.topLeft());
+            painter->fillRect(filledRect, option->palette.base());
+
+            if (option->state & State_Enabled)
+                Utils::StyleHelper::drawCornerImage(d->lineeditImage, painter, option->rect, 5, 5, 5, 5);
+            else
+                Utils::StyleHelper::drawCornerImage(d->lineeditImage_disabled, painter, option->rect, 5, 5, 5, 5);
+
+            if (option->state & State_HasFocus || option->state & State_MouseOver) {
+                QColor hover = Utils::StyleHelper::baseColor();
+                if (state & State_HasFocus)
+                    hover.setAlpha(100);
+                else
+                    hover.setAlpha(50);
+
+                painter->setPen(QPen(hover, 1));
+                painter->drawRect(option->rect.adjusted(1, 1, -2 ,-2));
+            }
+            painter->restore();
+        }
+        break;
+
+    case PE_FrameStatusBarItem:
+        break;
+
+    case PE_PanelButtonTool: {
+            Animation *anim = d->animator.widgetAnimation(widget);
+            if (!animating && anim) {
+                anim->paint(painter, option);
+            } else {
+                bool pressed = option->state & State_Sunken || option->state & State_On;
+#ifndef Q_OS_MAC
+                QColor shadow(0, 0, 0, 30);
+                painter->setPen(shadow);
+#else
+                painter->setPen(QColor(255, 255, 255));
+#endif
+                if (pressed) {
+                    painter->setPen(QColor(0, 0, 0, 30)); // g.p.
+                    QColor shade(0, 0, 0, 40);
+                    painter->fillRect(rect, shade);
+                    painter->drawLine(rect.topLeft() + QPoint(1, 0), rect.topRight() - QPoint(1, 0));
+                    painter->drawLine(rect.topLeft(), rect.bottomLeft());
+                    painter->drawLine(rect.topRight(), rect.bottomRight());
+                   // painter->drawLine(rect.bottomLeft()  + QPoint(1, 0), rect.bottomRight()  - QPoint(1, 0));
+                    QColor highlight(255, 255, 255, 30);
+                    painter->setPen(highlight);
+                }
+                else if (option->state & State_Enabled &&
+                         option->state & State_MouseOver) {
+                    QColor lighter(255, 255, 255, 37);
+                    painter->fillRect(rect, lighter);
+                }
+                if (option->state & State_HasFocus && (option->state & State_KeyboardFocusChange)) {
+                    QColor highlight = option->palette.highlight().color();
+                    highlight.setAlphaF(0.4);
+                    painter->setPen(QPen(highlight.lighter(), 1));
+                    highlight.setAlphaF(0.3);
+                    painter->setBrush(highlight);
+                    painter->setRenderHint(QPainter::Antialiasing);
+                    QRectF rect = option->rect;
+                    rect.translate(0.5, 0.5);
+                    painter->drawRoundedRect(rect.adjusted(2, 2, -3, -3), 2, 2);
+                }
+           }
+        }
+        break;
+
+    case PE_PanelStatusBar:
+        {
+            painter->save();
+            QLinearGradient grad(option->rect.topLeft(), QPoint(rect.center().x(), rect.bottom()));
+            QColor startColor = Utils::StyleHelper::shadowColor().darker(164);
+            QColor endColor = Utils::StyleHelper::baseColor().darker(130);
+            grad.setColorAt(0, startColor);
+            grad.setColorAt(1, endColor);
+            painter->fillRect(option->rect, grad);
+            painter->setPen(QColor(255, 255, 255, 60));
+            painter->drawLine(rect.topLeft() + QPoint(0,1),
+                              rect.topRight()+ QPoint(0,1));
+            painter->setPen(Utils::StyleHelper::borderColor().darker(110));
+            painter->drawLine(rect.topLeft(), rect.topRight());
+            painter->restore();
+        }
+        break;
+
+    case PE_IndicatorToolBarSeparator:
+        {
+            QColor separatorColor = Utils::StyleHelper::borderColor();
+            //separatorColor.setAlpha(100);
+            painter->setPen(separatorColor);
+            //const int margin = 6; gp
+            const int margin = 2;
+            if (option->state & State_Horizontal) {
+                const int offset = rect.width()/2;
+                painter->drawLine(rect.bottomLeft().x() + offset,
+                            rect.bottomLeft().y() - margin,
+                            rect.topLeft().x() + offset,
+                            rect.topLeft().y() + margin);
+            } else { //Draw vertical separator
+                const int offset = rect.height()/2;
+                painter->setPen(QPen(option->palette.background().color().darker(110)));
+                painter->drawLine(rect.topLeft().x() + margin ,
+                            rect.topLeft().y() + offset,
+                            rect.topRight().x() - margin,
+                            rect.topRight().y() + offset);
+            }
+        }
+        break;
+
+    case PE_IndicatorToolBarHandle:
+        {
+            bool horizontal = option->state & State_Horizontal;
+            painter->save();
+            QPainterPath path;
+            int x = option->rect.x() + (horizontal ? 2 : 6);
+            int y = option->rect.y() + (horizontal ? 6 : 2);
+            static const int RectHeight = 2;
+            if (horizontal) {
+                while (y < option->rect.height() - RectHeight - 6) {
+                    path.moveTo(x, y);
+                    path.addRect(x, y, RectHeight, RectHeight);
+                    y += 6;
+                }
+            } else {
+                while (x < option->rect.width() - RectHeight - 6) {
+                    path.moveTo(x, y);
+                    path.addRect(x, y, RectHeight, RectHeight);
+                    x += 6;
+                }
+            }
+
+            painter->setPen(Qt::NoPen);
+            QColor dark = Utils::StyleHelper::borderColor();
+            dark.setAlphaF(0.4);
+
+            QColor light = Utils::StyleHelper::baseColor();
+            light.setAlphaF(0.4);
+
+            painter->fillPath(path, light);
+            painter->save();
+            painter->translate(1, 1);
+            painter->fillPath(path, dark);
+            painter->restore();
+            painter->translate(3, 3);
+            painter->fillPath(path, light);
+            painter->translate(1, 1);
+            painter->fillPath(path, dark);
+            painter->restore();
+        }
+        break;
+    case PE_IndicatorArrowUp:
+    case PE_IndicatorArrowDown:
+    case PE_IndicatorArrowRight:
+    case PE_IndicatorArrowLeft:
+        {
+            Utils::StyleHelper::drawArrow(element, painter, option);
+        }
+        break;
+
+    default:
+        QProxyStyle::drawPrimitive(element, option, painter, widget);
+        break;
+    }
+}
+
+void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *option,
+                                 QPainter *painter, const QWidget *widget) const
+{
+    if (!panelWidget(widget))
+        return QProxyStyle::drawControl(element, option, painter, widget);
+
+    switch (element) {
+    case CE_Splitter:
+        painter->fillRect(option->rect, Utils::StyleHelper::borderColor());
+        break;
+
+    case CE_TabBarTabShape:
+        // Most styles draw a single dark outline. This looks rather ugly when combined with our
+        // single pixel dark separator so we adjust the first tab to compensate for this
+
+        if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
+            QStyleOptionTab adjustedTab = *tab;
+            if (tab->cornerWidgets == QStyleOptionTab::NoCornerWidgets && (
+                    tab->position == QStyleOptionTab::Beginning ||
+                    tab->position == QStyleOptionTab::OnlyOneTab))
+            {
+                if (option->direction == Qt::LeftToRight)
+                    adjustedTab.rect = adjustedTab.rect.adjusted(-1, 0, 0, 0);
+                else
+                    adjustedTab.rect = adjustedTab.rect.adjusted(0, 0, 1 ,0);
+            }
+            QProxyStyle::drawControl(element, &adjustedTab, painter, widget);
+            return;
+        }
+        break;
+
+    case CE_MenuBarItem:
+        painter->save();
+        if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
+            QColor highlightOutline = Utils::StyleHelper::borderColor().lighter(120);
+            bool act = mbi->state & State_Sunken;
+            bool dis = !(mbi->state & State_Enabled);
+            Utils::StyleHelper::menuGradient(painter, option->rect, option->rect);
+            QStyleOptionMenuItem item = *mbi;
+            item.rect = mbi->rect;
+            QPalette pal = mbi->palette;
+            pal.setBrush(QPalette::ButtonText, dis ? Qt::gray : Qt::black);
+            item.palette = pal;
+            QCommonStyle::drawControl(element, &item, painter, widget);
+            QRect r = option->rect;
+
+            if (act) {
+                // Fill|
+                QColor baseColor = Utils::StyleHelper::baseColor();
+                QLinearGradient grad(option->rect.topLeft(), option->rect.bottomLeft());
+                grad.setColorAt(0, baseColor.lighter(120));
+                grad.setColorAt(1, baseColor.lighter(130));
+                painter->fillRect(option->rect.adjusted(1, 1, -1, 0), grad);
+
+                // Outline
+                painter->setPen(QPen(highlightOutline, 0));
+                painter->drawLine(QPoint(r.left(), r.top() + 1), QPoint(r.left(), r.bottom()));
+                painter->drawLine(QPoint(r.right(), r.top() + 1), QPoint(r.right(), r.bottom()));
+                painter->drawLine(QPoint(r.left() + 1, r.top()), QPoint(r.right() - 1, r.top()));
+                highlightOutline.setAlpha(60);
+                painter->setPen(QPen(highlightOutline, 0));
+                painter->drawPoint(r.topLeft());
+                painter->drawPoint(r.topRight());
+
+                QPalette pal = mbi->palette;
+                uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
+                if (!styleHint(SH_UnderlineShortcut, mbi, widget))
+                    alignment |= Qt::TextHideMnemonic;
+                pal.setBrush(QPalette::Text, dis ? Qt::gray : QColor(0, 0, 0, 60));
+                drawItemText(painter, item.rect.translated(0, 1), alignment, pal, mbi->state & State_Enabled, mbi->text, QPalette::Text);
+                pal.setBrush(QPalette::Text, dis ? Qt::gray : Qt::white);
+                drawItemText(painter, item.rect, alignment, pal, mbi->state & State_Enabled, mbi->text, QPalette::Text);
+            }
+        }
+        painter->restore();
+        break;
+
+    case CE_ComboBoxLabel:
+        if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
+            if (panelWidget(widget)) {
+                painter->save();
+                QRect editRect = subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget);
+                QPalette customPal = cb->palette;
+                bool drawIcon = !(widget && widget->property("hideicon").toBool());
+
+                if (!cb->currentIcon.isNull() && drawIcon) {
+                    QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
+                                                                 : QIcon::Disabled;
+                    QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode);
+                    QRect iconRect(editRect);
+                    iconRect.setWidth(cb->iconSize.width() + 4);
+                    iconRect = alignedRect(cb->direction,
+                                           Qt::AlignLeft | Qt::AlignVCenter,
+                                           iconRect.size(), editRect);
+                    if (cb->editable)
+                        painter->fillRect(iconRect, customPal.brush(QPalette::Base));
+                    drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap);
+
+                    if (cb->direction == Qt::RightToLeft)
+                        editRect.translate(-4 - cb->iconSize.width(), 0);
+                    else
+                        editRect.translate(cb->iconSize.width() + 4, 0);
+
+                    // Reserve some space for the down-arrow
+                    editRect.adjust(0, 0, -13, 0);
+                }
+
+                QString text = option->fontMetrics.elidedText(cb->currentText, Qt::ElideRight, editRect.width());
+                if ((option->state & State_Enabled)) {
+                    painter->setPen(QColor(0, 0, 0, 70));
+                    painter->drawText(editRect.adjusted(1, 0, -1, 0), Qt::AlignLeft | Qt::AlignVCenter, text);
+                } else {
+                    painter->setOpacity(0.8);
+                }
+                painter->setPen(Utils::StyleHelper::panelTextColor(lightColored(widget)));
+                painter->drawText(editRect.adjusted(1, 0, -1, 0), Qt::AlignLeft | Qt::AlignVCenter, text);
+
+                painter->restore();
+            } else {
+                QProxyStyle::drawControl(element, option, painter, widget);
+            }
+        }
+        break;
+
+    case CE_SizeGrip: {
+            painter->save();
+            QColor dark = Qt::white;
+            dark.setAlphaF(0.1);
+            int x, y, w, h;
+            option->rect.getRect(&x, &y, &w, &h);
+            int sw = qMin(h, w);
+            if (h > w)
+                painter->translate(0, h - w);
+            else
+                painter->translate(w - h, 0);
+            int sx = x;
+            int sy = y;
+            int s = 4;
+            painter->setPen(dark);
+            if (option->direction == Qt::RightToLeft) {
+                sx = x + sw;
+                for (int i = 0; i < 4; ++i) {
+                    painter->drawLine(x, sy, sx, sw);
+                    sx -= s;
+                    sy += s;
+                }
+            } else {
+                for (int i = 0; i < 4; ++i) {
+                    painter->drawLine(sx, sw, sw, sy);
+                    sx += s;
+                    sy += s;
+                }
+            }
+            painter->restore();
+        }
+        break;
+
+    case CE_MenuBarEmptyArea: {
+            Utils::StyleHelper::menuGradient(painter, option->rect, option->rect);
+            painter->save();
+            painter->setPen(Utils::StyleHelper::borderColor());
+            painter->drawLine(option->rect.bottomLeft(), option->rect.bottomRight());
+            painter->restore();
+        }
+        break;
+
+    case CE_ToolBar:
+        {
+            QRect rect = option->rect;
+            bool horizontal = option->state & State_Horizontal;
+            rect = option->rect;
+
+            // Map offset for global window gradient
+            QPoint offset = widget->window()->mapToGlobal(option->rect.topLeft()) -
+                            widget->mapToGlobal(option->rect.topLeft());
+            QRect gradientSpan;
+            if (widget)
+                gradientSpan = QRect(offset, widget->window()->size());
+
+            bool drawLightColored = lightColored(widget);
+            if (horizontal)
+                Utils::StyleHelper::horizontalGradient(painter, gradientSpan, rect, drawLightColored);
+            else
+                Utils::StyleHelper::verticalGradient(painter, gradientSpan, rect, drawLightColored);
+
+            if (!drawLightColored)
+                painter->setPen(Utils::StyleHelper::borderColor());
+            else
+                painter->setPen(QColor(0x888888));
+
+            if (horizontal) {
+                // Note: This is a hack to determine if the
+                // toolbar should draw the top or bottom outline
+                // (needed for the find toolbar for instance)
+                QColor lighter(Utils::StyleHelper::sidebarHighlight());
+                if (drawLightColored)
+                    lighter = QColor(255, 255, 255, 180);
+                if (widget && widget->property("topBorder").toBool()) {
+                    painter->drawLine(rect.topLeft(), rect.topRight());
+                    painter->setPen(lighter);
+                    painter->drawLine(rect.topLeft() + QPoint(0, 1), rect.topRight() + QPoint(0, 1));
+                } else {
+                    painter->drawLine(rect.bottomLeft(), rect.bottomRight());
+                    painter->setPen(lighter);
+                    painter->drawLine(rect.topLeft(), rect.topRight());
+                }
+            } else {
+                painter->drawLine(rect.topLeft(), rect.bottomLeft());
+                painter->drawLine(rect.topRight(), rect.bottomRight());
+            }
+        }
+        break;
+
+    default:
+        QProxyStyle::drawControl(element, option, painter, widget);
+        break;
+    }
+}
+
+void ManhattanStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
+                                        QPainter *painter, const QWidget *widget) const
+{
+    if (!panelWidget(widget))
+         return     QProxyStyle::drawComplexControl(control, option, painter, widget);
+
+    QRect rect = option->rect;
+    switch (control) {
+    case CC_ToolButton:
+        if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
+            bool reverse = option->direction == Qt::RightToLeft;
+            bool drawborder = (widget && widget->property("showborder").toBool());
+
+            if (drawborder)
+                drawButtonSeparator(painter, rect, reverse);
+
+            QRect button, menuarea;
+            button = subControlRect(control, toolbutton, SC_ToolButton, widget);
+            menuarea = subControlRect(control, toolbutton, SC_ToolButtonMenu, widget);
+
+            State bflags = toolbutton->state;
+            if (bflags & State_AutoRaise) {
+                if (!(bflags & State_MouseOver)) {
+                    bflags &= ~State_Raised;
+                }
+            }
+
+            State mflags = bflags;
+            if (toolbutton->state & State_Sunken) {
+                if (toolbutton->activeSubControls & SC_ToolButton)
+                    bflags |= State_Sunken;
+                if (toolbutton->activeSubControls & SC_ToolButtonMenu)
+                    mflags |= State_Sunken;
+            }
+
+            QStyleOption tool(0);
+            tool.palette = toolbutton->palette;
+            if (toolbutton->subControls & SC_ToolButton) {
+                tool.rect = button;
+                tool.state = bflags;
+                drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
+            }
+
+            QStyleOptionToolButton label = *toolbutton;
+
+            label.palette = panelPalette(option->palette, lightColored(widget));
+            int fw = pixelMetric(PM_DefaultFrameWidth, option, widget);
+            label.rect = button.adjusted(fw, fw, -fw, -fw);
+
+            drawControl(CE_ToolButtonLabel, &label, painter, widget);
+
+            if (toolbutton->subControls & SC_ToolButtonMenu) {
+                tool.state = mflags;
+                tool.rect = menuarea.adjusted(1, 1, -1, -1);
+                if (mflags & (State_Sunken | State_On | State_Raised)) {
+                    painter->setPen(Qt::gray);
+                    painter->drawLine(tool.rect.topLeft(), tool.rect.bottomLeft());
+                    if (mflags & (State_Sunken)) {
+                        QColor shade(0, 0, 0, 50);
+                        painter->fillRect(tool.rect.adjusted(0, -1, 1, 1), shade);
+                    }
+#ifndef Q_OS_MAC
+                    else if (mflags & (State_MouseOver)) {
+                        QColor shade(255, 255, 255, 50);
+                        painter->fillRect(tool.rect.adjusted(0, -1, 1, 1), shade);
+                    }
+#endif
+                }
+                tool.rect = tool.rect.adjusted(2, 2, -2, -2);
+                drawPrimitive(PE_IndicatorArrowDown, &tool, painter, widget);
+            } else if (toolbutton->features & QStyleOptionToolButton::HasMenu
+                       && !widget->property("noArrow").toBool()) {
+                int arrowSize = 6;
+                QRect ir = toolbutton->rect.adjusted(1, 1, -1, -1);
+                QStyleOptionToolButton newBtn = *toolbutton;
+                newBtn.palette = panelPalette(option->palette);
+                newBtn.rect = QRect(ir.right() - arrowSize - 1,
+                                    ir.height() - arrowSize - 2, arrowSize, arrowSize);
+                drawPrimitive(PE_IndicatorArrowDown, &newBtn, painter, widget);
+            }
+        }
+        break;
+
+    case CC_ComboBox:
+        if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
+            painter->save();
+            bool isEmpty = cb->currentText.isEmpty() && cb->currentIcon.isNull();
+            bool reverse = option->direction == Qt::RightToLeft;
+            bool drawborder = !(widget && widget->property("hideborder").toBool());
+            bool alignarrow = !(widget && widget->property("alignarrow").toBool());
+
+            if (drawborder)
+                drawButtonSeparator(painter, rect, reverse);
+
+            QStyleOption toolbutton = *option;
+            if (isEmpty)
+                toolbutton.state &= ~(State_Enabled | State_Sunken);
+            painter->save();
+            if (drawborder)
+                painter->setClipRect(toolbutton.rect.adjusted(0, 0, -2, 0));
+            drawPrimitive(PE_PanelButtonTool, &toolbutton, painter, widget);
+            painter->restore();
+            // Draw arrow
+            int menuButtonWidth = 12;
+            int left = !reverse ? rect.right() - menuButtonWidth : rect.left();
+            int right = !reverse ? rect.right() : rect.left() + menuButtonWidth;
+            QRect arrowRect((left + right) / 2 + (reverse ? 6 : -6), rect.center().y() - 3, 9, 9);
+
+            if (!alignarrow) {
+                int labelwidth = option->fontMetrics.width(cb->currentText);
+                if (reverse)
+                    arrowRect.moveLeft(qMax(rect.width() - labelwidth - menuButtonWidth - 2, 4));
+                else
+                    arrowRect.moveLeft(qMin(labelwidth + menuButtonWidth - 2, rect.width() - menuButtonWidth - 4));
+            }
+            if (option->state & State_On)
+                arrowRect.translate(QProxyStyle::pixelMetric(PM_ButtonShiftHorizontal, option, widget),
+                                    QProxyStyle::pixelMetric(PM_ButtonShiftVertical, option, widget));
+
+            QStyleOption arrowOpt = *option;
+            arrowOpt.rect = arrowRect;
+            if (isEmpty)
+                arrowOpt.state &= ~(State_Enabled | State_Sunken);
+
+            if (styleHint(SH_ComboBox_Popup, option, widget)) {
+                arrowOpt.rect.translate(0, -3);
+                drawPrimitive(PE_IndicatorArrowUp, &arrowOpt, painter, widget);
+                arrowOpt.rect.translate(0, 6);
+                drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, painter, widget);
+            } else {
+                drawPrimitive(PE_IndicatorArrowDown, &arrowOpt, painter, widget);
+            }
+
+            painter->restore();
+        }
+        break;
+
+    default:
+        QProxyStyle::drawComplexControl(control, option, painter, widget);
+        break;
+    }
+}
+
+void ManhattanStyle::drawButtonSeparator(QPainter *painter, const QRect &rect, bool reverse) const
+{
+    QLinearGradient grad(rect.topRight(), rect.bottomRight());
+    grad.setColorAt(0, QColor(255, 255, 255, 20));
+    grad.setColorAt(0.4, QColor(255, 255, 255, 60));
+    grad.setColorAt(0.7, QColor(255, 255, 255, 50));
+    grad.setColorAt(1, QColor(255, 255, 255, 40));
+    painter->setPen(QPen(grad, 0));
+    painter->drawLine(rect.topRight(), rect.bottomRight());
+    grad.setColorAt(0, QColor(0, 0, 0, 30));
+    grad.setColorAt(0.4, QColor(0, 0, 0, 70));
+    grad.setColorAt(0.7, QColor(0, 0, 0, 70));
+    grad.setColorAt(1, QColor(0, 0, 0, 40));
+    painter->setPen(QPen(grad, 0));
+    if (!reverse)
+       painter->drawLine(rect.topRight() - QPoint(1,0), rect.bottomRight() - QPoint(1,0));
+    else
+       painter->drawLine(rect.topLeft(), rect.bottomLeft());
+ }
diff --git a/ThirdParty/GUI/qt-manhattan-style/manhattanstyle.h b/ThirdParty/GUI/qt-manhattan-style/manhattanstyle.h
new file mode 100644
index 0000000..fe761a3
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/manhattanstyle.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef MANHATTANSTYLE_H
+#define MANHATTANSTYLE_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QProxyStyle>
+
+class ManhattanStylePrivate;
+
+class QTMANHATTANSTYLESHARED_EXPORT ManhattanStyle : public QProxyStyle
+{
+    Q_OBJECT
+
+public:
+    explicit ManhattanStyle(const QString &baseStyleName);
+
+    virtual ~ManhattanStyle();
+
+    virtual void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
+                               QPainter *painter, const QWidget *widget = 0) const;
+    virtual void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter,
+                             const QWidget *widget = 0) const;
+    virtual void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
+                                    QPainter *painter, const QWidget *widget = 0) const;
+
+    virtual QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size,
+                                   const QWidget *widget) const;
+    virtual QRect subElementRect(SubElement element, const QStyleOption *option,
+                                 const QWidget *widget) const;
+    virtual QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc,
+                                 const QWidget *widget) const;
+
+    virtual SubControl hitTestComplexControl(ComplexControl control,
+                                             const QStyleOptionComplex *option, const QPoint &pos,
+                                             const QWidget *widget = 0) const;
+    virtual QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt,
+                                   const QWidget *widget = 0) const;
+    virtual int styleHint(StyleHint hint, const QStyleOption *option = 0, const QWidget *widget = 0,
+                          QStyleHintReturn *returnData = 0) const;
+    QRect itemRect(QPainter *p, const QRect &r, int flags, bool enabled, const QPixmap *pixmap,
+                   const QString &text, int len = -1) const;
+    virtual QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
+                                        const QStyleOption *opt) const;
+
+    virtual int pixelMetric(PixelMetric metric, const QStyleOption *option = 0,
+                            const QWidget *widget = 0) const;
+
+    virtual QPalette standardPalette() const;
+
+    virtual void polish(QWidget *widget);
+    virtual void polish(QPalette &pal);
+    virtual void polish(QApplication *app);
+
+    virtual void unpolish(QWidget *widget);
+    virtual void unpolish(QApplication *app);
+
+protected slots:
+    QIcon standardIconImplementation(StandardPixmap standardIcon, const QStyleOption *option, const QWidget *widget) const;
+
+private:
+    void drawButtonSeparator(QPainter *painter, const QRect &rect, bool reverse) const;
+
+    ManhattanStylePrivate *d;
+};
+
+#endif // MANHATTANSTYLE_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/minisplitter.cpp b/ThirdParty/GUI/qt-manhattan-style/minisplitter.cpp
new file mode 100644
index 0000000..bf18d53
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/minisplitter.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "minisplitter.h"
+
+#include "stylehelper.h"
+
+#include <QPaintEvent>
+#include <QPainter>
+#include <QSplitterHandle>
+
+using namespace Manhattan;
+
+class MiniSplitterHandle : public QSplitterHandle
+{
+public:
+    MiniSplitterHandle(Qt::Orientation orientation, QSplitter *parent)
+            : QSplitterHandle(orientation, parent)
+    {
+        setMask(QRegion(contentsRect()));
+        setAttribute(Qt::WA_MouseNoMask, true);
+    }
+protected:
+    void resizeEvent(QResizeEvent *event);
+    void paintEvent(QPaintEvent *event);
+};
+
+void MiniSplitterHandle::resizeEvent(QResizeEvent *event)
+{
+    if (orientation() == Qt::Horizontal)
+        setContentsMargins(2, 0, 2, 0);
+    else
+        setContentsMargins(0, 2, 0, 2);
+    setMask(QRegion(contentsRect()));
+    QSplitterHandle::resizeEvent(event);
+}
+
+void MiniSplitterHandle::paintEvent(QPaintEvent *event)
+{
+    QPainter painter(this);
+    painter.fillRect(event->rect(), Utils::StyleHelper::borderColor());
+}
+
+QSplitterHandle *MiniSplitter::createHandle()
+{
+    return new MiniSplitterHandle(orientation(), this);
+}
+
+MiniSplitter::MiniSplitter(QWidget *parent)
+    : QSplitter(parent)
+{
+    setHandleWidth(1);
+    setChildrenCollapsible(false);
+    setProperty("minisplitter", true);
+}
+
+MiniSplitter::MiniSplitter(Qt::Orientation orientation)
+    : QSplitter(orientation)
+{
+    setHandleWidth(1);
+    setChildrenCollapsible(false);
+    setProperty("minisplitter", true);
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/minisplitter.h b/ThirdParty/GUI/qt-manhattan-style/minisplitter.h
new file mode 100644
index 0000000..ef9caa9
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/minisplitter.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef MINISPLITTER_H
+#define MINISPLITTER_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QSplitter>
+
+QT_BEGIN_NAMESPACE
+class QSplitterHandle;
+QT_END_NAMESPACE
+
+namespace Manhattan {
+
+/*! This is a simple helper-class to obtain mac-style 1-pixel wide splitters */
+class QTMANHATTANSTYLESHARED_EXPORT MiniSplitter : public QSplitter
+{
+public:
+    MiniSplitter(QWidget *parent = 0);
+    MiniSplitter(Qt::Orientation orientation);
+
+protected:
+    QSplitterHandle *createHandle();
+};
+
+} // namespace Manhattan
+
+#endif // MINISPLITTER_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/progressbar.cpp b/ThirdParty/GUI/qt-manhattan-style/progressbar.cpp
new file mode 100644
index 0000000..cef9022
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/progressbar.cpp
@@ -0,0 +1,301 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "progressbar.h"
+
+#include "stylehelper.h"
+
+#include <QPropertyAnimation>
+#include <QPainter>
+#include <QFont>
+#include <QBrush>
+#include <QColor>
+#include <QMouseEvent>
+
+using namespace Manhattan;
+
+#define PROGRESSBAR_HEIGHT 12
+#define CANCELBUTTON_SIZE 15
+
+ProgressBar::ProgressBar(QWidget *parent)
+    : QWidget(parent), m_error(false), m_progressHeight(0), m_minimum(1), m_maximum(100), m_value(1), m_cancelButtonFader(0), m_finished(false)
+{
+    setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+    setMouseTracking(true);
+}
+
+ProgressBar::~ProgressBar()
+{
+}
+
+bool ProgressBar::event(QEvent *e)
+{
+    switch(e->type()) {
+    case QEvent::Enter:
+        {
+            QPropertyAnimation *animation = new QPropertyAnimation(this, "cancelButtonFader");
+            animation->setDuration(125);
+            animation->setEndValue(1.0);
+            animation->start(QAbstractAnimation::DeleteWhenStopped);
+        }
+        break;
+    case QEvent::Leave:
+        {
+            QPropertyAnimation *animation = new QPropertyAnimation(this, "cancelButtonFader");
+            animation->setDuration(225);
+            animation->setEndValue(0.0);
+            animation->start(QAbstractAnimation::DeleteWhenStopped);
+        }
+        break;
+    default:
+        return QWidget::event(e);
+    }
+    return false;
+}
+
+
+void ProgressBar::reset()
+{
+    m_value = m_minimum;
+    update();
+}
+
+void ProgressBar::setRange(int minimum, int maximum)
+{
+    m_minimum = minimum;
+    m_maximum = maximum;
+    if (m_value < m_minimum || m_value > m_maximum)
+        m_value = m_minimum;
+    update();
+}
+
+void ProgressBar::setValue(int value)
+{
+    if (m_value == value
+            || m_value < m_minimum
+            || m_value > m_maximum) {
+        return;
+    }
+    m_value = value;
+    update();
+}
+
+void ProgressBar::setFinished(bool b)
+{
+    if (b == m_finished)
+        return;
+    m_finished = b;
+    update();
+}
+
+QString ProgressBar::title() const
+{
+    return m_title;
+}
+
+bool ProgressBar::hasError() const
+{
+    return m_error;
+}
+
+void ProgressBar::setTitle(const QString &title)
+{
+    m_title = title;
+    update();
+}
+
+void ProgressBar::setError(bool on)
+{
+    m_error = on;
+    update();
+}
+
+QSize ProgressBar::sizeHint() const
+{
+    QSize s;
+    s.setWidth(50);
+    s.setHeight(fontMetrics().height() + PROGRESSBAR_HEIGHT + 6);
+    return s;
+}
+
+namespace { const int INDENT = 6; }
+
+void ProgressBar::mousePressEvent(QMouseEvent *event)
+{
+    QFont boldFont(font());
+    boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
+    boldFont.setBold(true);
+    QFontMetrics fm(boldFont);
+    int h = fm.height();
+    QRect rect(INDENT - 1, h+8, size().width()-2*INDENT + 1, m_progressHeight-1);
+    QRect cancelRect(rect.adjusted(rect.width() - CANCELBUTTON_SIZE, 1, -1, 0));
+
+    if (event->modifiers() == Qt::NoModifier
+        && cancelRect.contains(event->pos())) {
+        event->accept();
+        emit clicked();
+        return;
+    }
+    QWidget::mousePressEvent(event);
+}
+
+void ProgressBar::mouseMoveEvent(QMouseEvent *)
+{
+    update();
+}
+
+void ProgressBar::paintEvent(QPaintEvent *)
+{
+    // TODO move font into Utils::StyleHelper
+    // TODO use Utils::StyleHelper white
+
+    if (bar.isNull())
+        bar.load(QLatin1String(":/core/images/progressbar.png"));
+
+    double range = maximum() - minimum();
+    double percent = 0.;
+    if (range != 0)
+        percent = (value() - minimum()) / range;
+    if (percent > 1)
+        percent = 1;
+    else if (percent < 0)
+        percent = 0;
+
+    if (finished())
+        percent = 1;
+
+    QPainter p(this);
+    QFont boldFont(p.font());
+    boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
+    boldFont.setBold(true);
+    p.setFont(boldFont);
+    QFontMetrics fm(boldFont);
+
+    // Draw separator
+    int h = fm.height();
+    p.setPen(Utils::StyleHelper::sidebarShadow());
+    p.drawLine(0,0, size().width(), 0);
+
+    p.setPen(Utils::StyleHelper::sidebarHighlight());
+    p.drawLine(1, 1, size().width(), 1);
+
+    QRect textBounds = fm.boundingRect(m_title);
+    textBounds.moveCenter(rect().center());
+    int alignment = Qt::AlignHCenter;
+
+    int textSpace = rect().width() - 8;
+    // If there is not enough room when centered, we left align and
+    // elide the text
+    QString elidedtitle  = fm.elidedText(m_title, Qt::ElideRight, textSpace);
+
+    QRect textRect = rect().adjusted(3, 1, -3, 0);
+    textRect.setHeight(h+5);
+
+    p.setPen(QColor(0, 0, 0, 120));
+    p.drawText(textRect, alignment | Qt::AlignBottom, elidedtitle);
+    p.translate(0, -1);
+    p.setPen(Utils::StyleHelper::panelTextColor());
+    p.drawText(textRect, alignment | Qt::AlignBottom, elidedtitle);
+    p.translate(0, 1);
+
+    m_progressHeight = PROGRESSBAR_HEIGHT;
+    m_progressHeight += ((m_progressHeight % 2) + 1) % 2; // make odd
+    // draw outer rect
+    QRect rect(INDENT - 1, h+6, size().width()-2*INDENT + 1, m_progressHeight-1);
+    p.setPen(Utils::StyleHelper::panelTextColor());
+    Utils::StyleHelper::drawCornerImage(bar, &p, rect, 2, 2, 2, 2);
+
+    // draw inner rect
+    QColor c = Utils::StyleHelper::panelTextColor();
+    c.setAlpha(180);
+    p.setPen(Qt::NoPen);
+
+
+    QRect inner = rect.adjusted(3, 2, -2, -2);
+    inner.adjust(0, 0, qRound((percent - 1) * inner.width()), 0);
+    if (m_error) {
+        QColor red(255, 60, 0, 210);
+        c = red;
+        // avoid too small red bar
+        if (inner.width() < 10)
+            inner.adjust(0, 0, 10 - inner.width(), 0);
+    } else if (m_finished) {
+        c = QColor(90, 170, 60);
+    }
+
+    // Draw line and shadow after the gradient fill
+    if (value() > 0 && value() < maximum()) {
+        p.fillRect(QRect(inner.right() + 1, inner.top(), 2, inner.height()), QColor(0, 0, 0, 20));
+        p.fillRect(QRect(inner.right() + 1, inner.top(), 1, inner.height()), QColor(0, 0, 0, 60));
+    }
+    QLinearGradient grad(inner.topLeft(), inner.bottomLeft());
+    grad.setColorAt(0, c.lighter(130));
+    grad.setColorAt(0.5, c.lighter(106));
+    grad.setColorAt(0.51, c.darker(106));
+    grad.setColorAt(1, c.darker(130));
+    p.setPen(Qt::NoPen);
+    p.setBrush(grad);
+    p.drawRect(inner);
+    p.setBrush(Qt::NoBrush);
+    p.setPen(QPen(QColor(0, 0, 0, 30), 1));
+    p.drawLine(inner.topLeft(), inner.topRight());
+    p.drawLine(inner.topLeft(), inner.bottomLeft());
+    p.drawLine(inner.topRight(), inner.bottomRight());
+    p.drawLine(inner.bottomLeft(), inner.bottomRight());
+    p.drawPoint(inner.bottomLeft());
+    p.drawPoint(inner.bottomRight());
+
+    // Draw cancel button
+    p.setOpacity(m_cancelButtonFader);
+
+    if (value() < maximum() && !m_error) {
+        QRect cancelRect(rect.adjusted(rect.width() - CANCELBUTTON_SIZE, 1, -1, 0));
+        bool hover = cancelRect.contains(mapFromGlobal(QCursor::pos()));
+        QLinearGradient grad(cancelRect.topLeft(), cancelRect.bottomLeft());
+        int intensity = hover ? 90 : 70;
+        QColor buttonColor(intensity, intensity, intensity, 255);
+        grad.setColorAt(0, buttonColor.lighter(130));
+        grad.setColorAt(1, buttonColor.darker(130));
+        p.setPen(Qt::NoPen);
+        p.setBrush(grad);
+        p.drawRect(cancelRect.adjusted(1, 1, -1, -1));
+
+        p.setPen(QPen(QColor(0, 0, 0, 30)));
+        p.drawLine(cancelRect.topLeft() + QPoint(0,1), cancelRect.bottomLeft() + QPoint(0,-1));
+        p.setPen(QPen(QColor(0, 0, 0, 120)));
+        p.drawLine(cancelRect.topLeft() + QPoint(1,1), cancelRect.bottomLeft() + QPoint(1,-1));
+        p.setPen(QPen(QColor(255, 255, 255, 30)));
+        p.drawLine(cancelRect.topLeft() + QPoint(2,1), cancelRect.bottomLeft() + QPoint(2,-1));
+        p.setPen(QPen(hover ? Utils::StyleHelper::panelTextColor() : QColor(180, 180, 180), 1));
+        p.setRenderHint(QPainter::Antialiasing);
+        p.translate(0.5, 0.5);
+        p.drawLine(cancelRect.center()+QPoint(-1,-2), cancelRect.center()+QPoint(+3,+2));
+        p.drawLine(cancelRect.center()+QPoint(+3,-2), cancelRect.center()+QPoint(-1,+2));
+    }
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/progressbar.h b/ThirdParty/GUI/qt-manhattan-style/progressbar.h
new file mode 100644
index 0000000..13b45f9
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/progressbar.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef PROGRESSPIE_H
+#define PROGRESSPIE_H
+
+#include "qt-manhattan-style_global.hpp"
+#include <QString>
+#include <QWidget>
+
+namespace Manhattan {
+
+class QTMANHATTANSTYLESHARED_EXPORT ProgressBar : public QWidget
+{
+    Q_OBJECT
+
+    Q_PROPERTY(float cancelButtonFader READ cancelButtonFader WRITE setCancelButtonFader)
+
+public:
+    explicit ProgressBar(QWidget *parent = 0);
+    virtual ~ProgressBar();
+
+    QString title() const;
+    void setTitle(const QString &title);
+    void setError(bool on);
+    bool hasError() const;
+    virtual QSize sizeHint() const;
+    virtual void paintEvent(QPaintEvent *);
+    virtual void mouseMoveEvent(QMouseEvent *);
+    int minimum() const { return m_minimum; }
+    int maximum() const { return m_maximum; }
+    int value() const { return m_value; }
+    bool finished() const { return m_finished; }
+    void reset();
+    void setRange(int minimum, int maximum);
+    void setValue(int value);
+    void setFinished(bool b);
+    float cancelButtonFader() { return m_cancelButtonFader; }
+    void setCancelButtonFader(float value) { update(); m_cancelButtonFader= value;}
+    virtual bool event(QEvent *);
+
+signals:
+    void clicked();
+
+protected:
+    virtual void mousePressEvent(QMouseEvent *event);
+
+private:
+    QImage bar;
+    QString m_text;
+    QString m_title;
+    bool m_error;
+    int m_progressHeight;
+    int m_minimum;
+    int m_maximum;
+    int m_value;
+    float m_cancelButtonFader;
+    bool m_finished;
+};
+
+} // namespace Manhattan
+
+#endif // PROGRESSPIE_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/qt-manhattan-style_global.hpp b/ThirdParty/GUI/qt-manhattan-style/qt-manhattan-style_global.hpp
new file mode 100644
index 0000000..6032ece
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/qt-manhattan-style_global.hpp
@@ -0,0 +1,12 @@
+#ifndef QTMANHATTANSTYLE_GLOBAL_HPP
+#define QTMANHATTANSTYLE_GLOBAL_HPP
+
+#include <qglobal.h>
+
+#if defined(QTMANHATTANSTYLE_LIBRARY)
+#  define QTMANHATTANSTYLESHARED_EXPORT Q_DECL_EXPORT
+#else
+#  define QTMANHATTANSTYLESHARED_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // QTMANHATTANSTYLE_GLOBAL_HPP
diff --git a/ThirdParty/GUI/qt-manhattan-style/qtcassert.cpp b/ThirdParty/GUI/qt-manhattan-style/qtcassert.cpp
new file mode 100644
index 0000000..256190f
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/qtcassert.cpp
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "qtcassert.h"
+
+namespace Manhattan {
+
+void writeAssertLocation(const char *msg)
+{
+    qDebug("SOFT ASSERT: %s", msg);
+}
+
+} // namespace Utils
diff --git a/ThirdParty/GUI/qt-manhattan-style/qtcassert.h b/ThirdParty/GUI/qt-manhattan-style/qtcassert.h
new file mode 100644
index 0000000..eb49fa8
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/qtcassert.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef QTC_ASSERT_H
+#define QTC_ASSERT_H
+
+#include "qt-manhattan-style_global.hpp"
+
+namespace Manhattan { QTMANHATTANSTYLESHARED_EXPORT void writeAssertLocation(const char *msg); }
+
+#define QTC_ASSERT_STRINGIFY_HELPER(x) #x
+#define QTC_ASSERT_STRINGIFY(x) QTC_ASSERT_STRINGIFY_HELPER(x)
+#define QTC_ASSERT_STRING(cond) ::Manhattan::writeAssertLocation(\
+    "\"" cond"\" in file " __FILE__ ", line " QTC_ASSERT_STRINGIFY(__LINE__))
+
+// The 'do {...} while (0)' idiom is not used for the main block here to be
+// able to use 'break' and 'continue' as 'actions'.
+
+#define QTC_ASSERT(cond, action) if (cond) {} else { QTC_ASSERT_STRING(#cond); action; } do {} while (0)
+#define QTC_CHECK(cond) if (cond) {} else { QTC_ASSERT_STRING(#cond); } do {} while (0)
+
+#endif // QTC_ASSERT_H
+
diff --git a/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton.cpp b/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton.cpp
new file mode 100644
index 0000000..186a6dd
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton.cpp
@@ -0,0 +1,268 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "qtcolorbutton.h"
+#include "qtcolorbutton_p.h"
+
+#include <QMimeData>
+#include <QApplication>
+#include <QColorDialog>
+#include <QDragEnterEvent>
+#include <QPainter>
+#include <QDrag>
+
+namespace Manhattan {
+
+void QtColorButtonPrivate::slotEditColor()
+{
+    QColor newColor;
+    if (m_alphaAllowed) {
+        bool ok;
+        const QRgb rgba = QColorDialog::getRgba(m_color.rgba(), &ok, q_ptr);
+        if (!ok)
+            return;
+        newColor = QColor::fromRgba(rgba);
+    } else {
+        newColor = QColorDialog::getColor(m_color, q_ptr);
+        if (!newColor.isValid())
+            return;
+    }
+    if (newColor == q_ptr->color())
+        return;
+    q_ptr->setColor(newColor);
+    emit q_ptr->colorChanged(m_color);
+}
+
+QColor QtColorButtonPrivate::shownColor() const
+{
+#ifndef QT_NO_DRAGANDDROP
+    if (m_dragging)
+        return m_dragColor;
+#endif
+    return m_color;
+}
+
+QPixmap QtColorButtonPrivate::generatePixmap() const
+{
+    QPixmap pix(24, 24);
+
+    int pixSize = 20;
+    QBrush br(shownColor());
+
+    QPixmap pm(2 * pixSize, 2 * pixSize);
+    QPainter pmp(&pm);
+    pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
+    pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
+    pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
+    pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
+    pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, shownColor());
+    br = QBrush(pm);
+
+    QPainter p(&pix);
+    int corr = 1;
+    QRect r = pix.rect().adjusted(corr, corr, -corr, -corr);
+    p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
+    p.fillRect(r, br);
+
+    p.fillRect(r.width() / 4 + corr, r.height() / 4 + corr,
+               r.width() / 2, r.height() / 2,
+               QColor(shownColor().rgb()));
+    p.drawRect(pix.rect().adjusted(0, 0, -1, -1));
+
+    return pix;
+}
+
+///////////////
+
+QtColorButton::QtColorButton(QWidget *parent)
+    : QToolButton(parent)
+{
+    d_ptr = new QtColorButtonPrivate;
+    d_ptr->q_ptr = this;
+    d_ptr->m_dragging = false;
+    d_ptr->m_backgroundCheckered = true;
+    d_ptr->m_alphaAllowed = true;
+
+    setAcceptDrops(true);
+
+    connect(this, SIGNAL(clicked()), d_ptr, SLOT(slotEditColor()));
+    setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
+}
+
+QtColorButton::~QtColorButton()
+{
+    delete d_ptr;
+}
+
+void QtColorButton::setColor(const QColor &color)
+{
+    if (d_ptr->m_color == color)
+        return;
+    d_ptr->m_color = color;
+    update();
+}
+
+QColor QtColorButton::color() const
+{
+    return d_ptr->m_color;
+}
+
+void QtColorButton::setBackgroundCheckered(bool checkered)
+{
+    if (d_ptr->m_backgroundCheckered == checkered)
+        return;
+    d_ptr->m_backgroundCheckered = checkered;
+    update();
+}
+
+bool QtColorButton::isBackgroundCheckered() const
+{
+    return d_ptr->m_backgroundCheckered;
+}
+
+void QtColorButton::setAlphaAllowed(bool allowed)
+{
+    d_ptr->m_alphaAllowed = allowed;
+}
+
+bool QtColorButton::isAlphaAllowed() const
+{
+    return d_ptr->m_alphaAllowed;
+}
+
+void QtColorButton::paintEvent(QPaintEvent *event)
+{
+    QToolButton::paintEvent(event);
+    if (!isEnabled())
+        return;
+
+    const int pixSize = 10;
+    QBrush br(d_ptr->shownColor());
+    if (d_ptr->m_backgroundCheckered) {
+        QPixmap pm(2 * pixSize, 2 * pixSize);
+        QPainter pmp(&pm);
+        pmp.fillRect(0, 0, pixSize, pixSize, Qt::white);
+        pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white);
+        pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black);
+        pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black);
+        pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, d_ptr->shownColor());
+        br = QBrush(pm);
+    }
+
+    QPainter p(this);
+    const int corr = 5;
+    QRect r = rect().adjusted(corr, corr, -corr, -corr);
+    p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
+    p.fillRect(r, br);
+
+    //const int adjX = qRound(r.width() / 4.0);
+    //const int adjY = qRound(r.height() / 4.0);
+    //p.fillRect(r.adjusted(adjX, adjY, -adjX, -adjY),
+    //           QColor(d_ptr->shownColor().rgb()));
+    /*
+    p.fillRect(r.adjusted(0, r.height() * 3 / 4, 0, 0),
+               QColor(d_ptr->shownColor().rgb()));
+    p.fillRect(r.adjusted(0, 0, 0, -r.height() * 3 / 4),
+               QColor(d_ptr->shownColor().rgb()));
+               */
+    /*
+    const QColor frameColor0(0, 0, 0, qRound(0.2 * (0xFF - d_ptr->shownColor().alpha())));
+    p.setPen(frameColor0);
+    p.drawRect(r.adjusted(adjX, adjY, -adjX - 1, -adjY - 1));
+    */
+
+    const QColor frameColor1(0, 0, 0, 26);
+    p.setPen(frameColor1);
+    p.drawRect(r.adjusted(1, 1, -2, -2));
+    const QColor frameColor2(0, 0, 0, 51);
+    p.setPen(frameColor2);
+    p.drawRect(r.adjusted(0, 0, -1, -1));
+}
+
+void QtColorButton::mousePressEvent(QMouseEvent *event)
+{
+#ifndef QT_NO_DRAGANDDROP
+    if (event->button() == Qt::LeftButton)
+        d_ptr->m_dragStart = event->pos();
+#endif
+    QToolButton::mousePressEvent(event);
+}
+
+void QtColorButton::mouseMoveEvent(QMouseEvent *event)
+{
+#ifndef QT_NO_DRAGANDDROP
+    if (event->buttons() & Qt::LeftButton &&
+            (d_ptr->m_dragStart - event->pos()).manhattanLength() > QApplication::startDragDistance()) {
+        QMimeData *mime = new QMimeData;
+        mime->setColorData(color());
+        QDrag *drg = new QDrag(this);
+        drg->setMimeData(mime);
+        drg->setPixmap(d_ptr->generatePixmap());
+        setDown(false);
+        event->accept();
+        drg->start();
+        return;
+    }
+#endif
+    QToolButton::mouseMoveEvent(event);
+}
+
+#ifndef QT_NO_DRAGANDDROP
+void QtColorButton::dragEnterEvent(QDragEnterEvent *event)
+{
+    const QMimeData *mime = event->mimeData();
+    if (!mime->hasColor())
+        return;
+
+    event->accept();
+    d_ptr->m_dragColor = qvariant_cast<QColor>(mime->colorData());
+    d_ptr->m_dragging = true;
+    update();
+}
+
+void QtColorButton::dragLeaveEvent(QDragLeaveEvent *event)
+{
+    event->accept();
+    d_ptr->m_dragging = false;
+    update();
+}
+
+void QtColorButton::dropEvent(QDropEvent *event)
+{
+    event->accept();
+    d_ptr->m_dragging = false;
+    if (d_ptr->m_dragColor == color())
+        return;
+    setColor(d_ptr->m_dragColor);
+    emit colorChanged(color());
+}
+#endif
+
+} // namespace Manhattan
+
diff --git a/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton.h b/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton.h
new file mode 100644
index 0000000..8c3a7b8
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef QTCOLORBUTTON_H
+#define QTCOLORBUTTON_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QToolButton>
+
+namespace Manhattan {
+
+class QTMANHATTANSTYLESHARED_EXPORT QtColorButton : public QToolButton
+{
+    Q_OBJECT
+    Q_PROPERTY(bool backgroundCheckered READ isBackgroundCheckered WRITE setBackgroundCheckered)
+    Q_PROPERTY(bool alphaAllowed READ isAlphaAllowed WRITE setAlphaAllowed)
+    Q_PROPERTY(QColor color READ color WRITE setColor)
+public:
+    QtColorButton(QWidget *parent = 0);
+    virtual ~QtColorButton();
+
+    bool isBackgroundCheckered() const;
+    void setBackgroundCheckered(bool checkered);
+
+    bool isAlphaAllowed() const;
+    void setAlphaAllowed(bool allowed);
+
+    QColor color() const;
+
+public slots:
+    void setColor(const QColor &color);
+
+signals:
+    void colorChanged(const QColor &color);
+protected:
+    virtual void paintEvent(QPaintEvent *event);
+    virtual void mousePressEvent(QMouseEvent *event);
+    virtual void mouseMoveEvent(QMouseEvent *event);
+#ifndef QT_NO_DRAGANDDROP
+    virtual void dragEnterEvent(QDragEnterEvent *event);
+    virtual void dragLeaveEvent(QDragLeaveEvent *event);
+    virtual void dropEvent(QDropEvent *event);
+#endif
+private:
+    class QtColorButtonPrivate *d_ptr;
+    friend class QtColorButtonPrivate;
+};
+
+} // namespace Manhattan
+
+#endif // QTCOLORBUTTON_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton_p.h b/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton_p.h
new file mode 100644
index 0000000..c1102cf
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/qtcolorbutton_p.h
@@ -0,0 +1,27 @@
+#include "qtcolorbutton.h"
+
+namespace Manhattan {
+
+class QtColorButtonPrivate: public QObject
+{
+    Q_OBJECT
+    QtColorButton *q_ptr;
+    Q_DECLARE_PUBLIC(QtColorButton)
+public slots:
+    void slotEditColor();
+
+public:
+    QColor shownColor() const;
+    QPixmap generatePixmap() const;
+
+    QColor m_color;
+#ifndef QT_NO_DRAGANDDROP
+    QColor m_dragColor;
+    QPoint m_dragStart;
+    bool m_dragging;
+#endif
+    bool m_backgroundCheckered;
+    bool m_alphaAllowed;
+};
+
+} // namespace Utils
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/leftselection.png b/ThirdParty/GUI/qt-manhattan-style/resources/leftselection.png
new file mode 100644
index 0000000..8b787ca
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/leftselection.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/midselection.png b/ThirdParty/GUI/qt-manhattan-style/resources/midselection.png
new file mode 100644
index 0000000..d6db82e
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/midselection.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/progressbar.png b/ThirdParty/GUI/qt-manhattan-style/resources/progressbar.png
new file mode 100644
index 0000000..806ed87
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/progressbar.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/resources.qrc b/ThirdParty/GUI/qt-manhattan-style/resources/resources.qrc
new file mode 100644
index 0000000..1c216e9
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/resources/resources.qrc
@@ -0,0 +1,24 @@
+<RCC>
+    <qresource prefix="/core/images">
+        <file>progressbar.png</file>
+    </qresource>
+    <qresource prefix="/projectexplorer/images">
+        <file>targetpanel_gradient.png</file>
+        <file>leftselection.png</file>
+        <file>midselection.png</file>
+        <file>rightselection.png</file>
+        <file>targetpanel_bottom.png</file>
+    </qresource>
+    <qresource prefix="/extensions/images">
+        <file>scrollbar-vertical-up-highlight.png</file>
+        <file>scrollbar-vertical-background.png</file>
+        <file>scrollbar-vertical-down.png</file>
+        <file>scrollbar-vertical-down-highlight.png</file>
+        <file>scrollbar-vertical-slider.png</file>
+        <file>scrollbar-vertical-slider-highlight.png</file>
+        <file>scrollbar-vertical-up.png</file>
+    </qresource>
+    <qresource prefix="/extensions/qss">
+        <file>threelevelsitempicker-listwidget.qss</file>
+    </qresource>
+</RCC>
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/rightselection.png b/ThirdParty/GUI/qt-manhattan-style/resources/rightselection.png
new file mode 100644
index 0000000..26b181c
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/rightselection.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-background.png b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-background.png
new file mode 100644
index 0000000..42a9b86
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-background.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-down-highlight.png b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-down-highlight.png
new file mode 100644
index 0000000..e4bf7b4
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-down-highlight.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-down.png b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-down.png
new file mode 100644
index 0000000..5f91b59
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-down.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-slider-highlight.png b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-slider-highlight.png
new file mode 100644
index 0000000..96cba68
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-slider-highlight.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-slider.png b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-slider.png
new file mode 100644
index 0000000..e3b100f
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-slider.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-up-highlight.png b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-up-highlight.png
new file mode 100644
index 0000000..73851f6
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-up-highlight.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-up.png b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-up.png
new file mode 100644
index 0000000..3638898
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/scrollbar-vertical-up.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/targetpanel_bottom.png b/ThirdParty/GUI/qt-manhattan-style/resources/targetpanel_bottom.png
new file mode 100644
index 0000000..28bddc0
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/targetpanel_bottom.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/targetpanel_gradient.png b/ThirdParty/GUI/qt-manhattan-style/resources/targetpanel_gradient.png
new file mode 100644
index 0000000..c2d8b58
Binary files /dev/null and b/ThirdParty/GUI/qt-manhattan-style/resources/targetpanel_gradient.png differ
diff --git a/ThirdParty/GUI/qt-manhattan-style/resources/threelevelsitempicker-listwidget.qss b/ThirdParty/GUI/qt-manhattan-style/resources/threelevelsitempicker-listwidget.qss
new file mode 100644
index 0000000..52a99b4
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/resources/threelevelsitempicker-listwidget.qss
@@ -0,0 +1,48 @@
+QListWidget {
+    background: #464646;
+    border-style: none;
+}
+
+QScrollBar:vertical {
+    margin: 17px 0 17px 0;
+    border-image: url(:extensions/images/scrollbar-vertical-background.png) 10 0 10 0 stretch stretch;
+}
+
+QScrollBar::handle:vertical {
+    border-width: 1px;
+    border-image: url(:extensions/images/scrollbar-vertical-slider.png) 2 1 2 1 stretch stretch;
+    min-height: 20px;
+}
+
+QScrollBar::handle:vertical:hover {
+    border-image: url(:extensions/images/scrollbar-vertical-slider-highlight.png) 2 1 2 1 stretch stretch;
+    min-height: 20px;
+}
+
+QScrollBar::add-line:vertical {
+    border-image: url(:extensions/images/scrollbar-vertical-down.png);
+    height: 16px;
+    subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:vertical:hover {
+    border-image: url(:extensions/images/scrollbar-vertical-down-highlight.png);
+    height: 16px;
+    subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:vertical {
+    border-image: url(:extensions/images/scrollbar-vertical-up.png);
+    height: 16px;
+    subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:vertical:hover {
+    border-image: url(:extensions/images/scrollbar-vertical-up-highlight.png);
+    height: 16px;
+    subcontrol-origin: margin;
+}
+
+QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
+    background: none;
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/stringutils.cpp b/ThirdParty/GUI/qt-manhattan-style/stringutils.cpp
new file mode 100644
index 0000000..83b6524
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/stringutils.cpp
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "stringutils.h"
+
+#include <QString>
+#include <QStringList>
+#include <QFileInfo>
+#include <QDir>
+
+#include <limits.h>
+
+namespace Manhattan {
+
+QTMANHATTANSTYLESHARED_EXPORT QString settingsKey(const QString &category)
+{
+    QString rc(category);
+    const QChar underscore = QLatin1Char('_');
+    // Remove the sort category "X.Category" -> "Category"
+    if (rc.size() > 2 && rc.at(0).isLetter() && rc.at(1) == QLatin1Char('.'))
+        rc.remove(0, 2);
+    // Replace special characters
+    const int size = rc.size();
+    for (int i = 0; i < size; i++) {
+        const QChar c = rc.at(i);
+        if (!c.isLetterOrNumber() && c != underscore)
+            rc[i] = underscore;
+    }
+    return rc;
+}
+
+// Figure out length of common start of string ("C:\a", "c:\b"  -> "c:\"
+static inline int commonPartSize(const QString &s1, const QString &s2)
+{
+    const int size = qMin(s1.size(), s2.size());
+    for (int i = 0; i < size; i++)
+        if (s1.at(i) != s2.at(i))
+            return i;
+    return size;
+}
+
+QTMANHATTANSTYLESHARED_EXPORT QString commonPrefix(const QStringList &strings)
+{
+    switch (strings.size()) {
+    case 0:
+        return QString();
+    case 1:
+        return strings.front();
+    default:
+        break;
+    }
+    // Figure out common string part: "C:\foo\bar1" "C:\foo\bar2"  -> "C:\foo\bar"
+    int commonLength = INT_MAX;
+    const int last = strings.size() - 1;
+    for (int i = 0; i < last; i++)
+        commonLength = qMin(commonLength, commonPartSize(strings.at(i), strings.at(i + 1)));
+    if (!commonLength)
+        return QString();
+    return strings.at(0).left(commonLength);
+}
+
+QTMANHATTANSTYLESHARED_EXPORT QString commonPath(const QStringList &files)
+{
+    QString common = commonPrefix(files);
+    // Find common directory part: "C:\foo\bar" -> "C:\foo"
+    int lastSeparatorPos = common.lastIndexOf(QLatin1Char('/'));
+    if (lastSeparatorPos == -1)
+        lastSeparatorPos = common.lastIndexOf(QLatin1Char('\\'));
+    if (lastSeparatorPos == -1)
+        return QString();
+#ifdef Q_OS_UNIX
+    if (lastSeparatorPos == 0) // Unix: "/a", "/b" -> '/'
+        lastSeparatorPos = 1;
+#endif
+    common.truncate(lastSeparatorPos);
+    return common;
+}
+
+QTMANHATTANSTYLESHARED_EXPORT QString withTildeHomePath(const QString &path)
+{
+#ifdef Q_OS_WIN
+    QString outPath = path;
+#else
+    static const QString homePath = QDir::homePath();
+
+    QFileInfo fi(QDir::cleanPath(path));
+    QString outPath = fi.absoluteFilePath();
+    if (outPath.startsWith(homePath))
+        outPath = QLatin1Char('~') + outPath.mid(homePath.size());
+    else
+        outPath = path;
+#endif
+    return outPath;
+}
+
+int AbstractQtcMacroExpander::findMacro(const QString &str, int *pos, QString *ret)
+{
+    forever {
+        int openPos = str.indexOf(QLatin1String("%{"), *pos);
+        if (openPos < 0)
+            return 0;
+        int varPos = openPos + 2;
+        int closePos = str.indexOf(QLatin1Char('}'), varPos);
+        if (closePos < 0)
+            return 0;
+        int varLen = closePos - varPos;
+        if (resolveMacro(str.mid(varPos, varLen), ret)) {
+            *pos = openPos;
+            return varLen + 3;
+        }
+        // An actual expansion may be nested into a "false" one,
+        // so we continue right after the last %{.
+        *pos = varPos;
+    }
+}
+
+QTMANHATTANSTYLESHARED_EXPORT void expandMacros(QString *str, AbstractMacroExpander *mx)
+{
+    QString rsts;
+
+    for (int pos = 0; int len = mx->findMacro(*str, &pos, &rsts); ) {
+        str->replace(pos, len, rsts);
+        pos += rsts.length();
+    }
+}
+
+QTMANHATTANSTYLESHARED_EXPORT QString expandMacros(const QString &str, AbstractMacroExpander *mx)
+{
+    QString ret = str;
+    expandMacros(&ret, mx);
+    return ret;
+}
+
+} // namespace Manhattan
diff --git a/ThirdParty/GUI/qt-manhattan-style/stringutils.h b/ThirdParty/GUI/qt-manhattan-style/stringutils.h
new file mode 100644
index 0000000..29c658b
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/stringutils.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef SETTINGSTUTILS_H
+#define SETTINGSTUTILS_H
+
+#include "qt-manhattan-style_global.hpp"
+
+QT_BEGIN_NAMESPACE
+class QStringList;
+QT_END_NAMESPACE
+
+namespace Manhattan {
+
+// Create a usable settings key from a category,
+// for example Editor|C++ -> Editor_C__
+QTMANHATTANSTYLESHARED_EXPORT QString settingsKey(const QString &category);
+
+// Return the common prefix part of a string list:
+// "C:\foo\bar1" "C:\foo\bar2"  -> "C:\foo\bar"
+QTMANHATTANSTYLESHARED_EXPORT QString commonPrefix(const QStringList &strings);
+
+// Return the common path of a list of files:
+// "C:\foo\bar1" "C:\foo\bar2"  -> "C:\foo"
+QTMANHATTANSTYLESHARED_EXPORT QString commonPath(const QStringList &files);
+
+// On Linux/Mac replace user's home path with ~
+// Uses cleaned path and tries to use absolute path of "path" if possible
+// If path is not sub of home path, or when running on Windows, returns the input
+QTMANHATTANSTYLESHARED_EXPORT QString withTildeHomePath(const QString &path);
+
+class QTMANHATTANSTYLESHARED_EXPORT AbstractMacroExpander {
+public:
+    virtual ~AbstractMacroExpander() {}
+    // Not const, as it may change the state of the expander.
+    //! Find an expando to replace and provide a replacement string.
+    //! \param str The string to scan
+    //! \param pos Position to start scan on input, found position on output
+    //! \param ret Replacement string on output
+    //! \return Length of string part to replace, zero if no (further) matches found
+    virtual int findMacro(const QString &str, int *pos, QString *ret) = 0;
+};
+
+class QTMANHATTANSTYLESHARED_EXPORT AbstractQtcMacroExpander : public AbstractMacroExpander {
+public:
+    virtual int findMacro(const QString &str, int *pos, QString *ret);
+    //! Provide a replacement string for an expando
+    //! \param name The name of the expando
+    //! \param ret Replacement string on output
+    //! \return True if the expando was found
+    virtual bool resolveMacro(const QString &name, QString *ret) = 0;
+};
+
+QTMANHATTANSTYLESHARED_EXPORT void expandMacros(QString *str, AbstractMacroExpander *mx);
+QTMANHATTANSTYLESHARED_EXPORT QString expandMacros(const QString &str, AbstractMacroExpander *mx);
+
+} // namespace Manhattan
+
+#endif // SETTINGSTUTILS_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/styleanimator.cpp b/ThirdParty/GUI/qt-manhattan-style/styleanimator.cpp
new file mode 100644
index 0000000..8ad1a78
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/styleanimator.cpp
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "styleanimator.h"
+
+#include <QStyleOption>
+
+Animation * StyleAnimator::widgetAnimation(const QWidget *widget) const
+{
+    if (!widget)
+        return 0;
+    foreach (Animation *a, animations) {
+        if (a->widget() == widget)
+            return a;
+    }
+    return 0;
+}
+
+void Animation::paint(QPainter *painter, const QStyleOption *option)
+{
+    Q_UNUSED(option)
+    Q_UNUSED(painter)
+}
+
+void Animation::drawBlendedImage(QPainter *painter, QRect rect, float alpha)
+{
+    if (m_secondaryImage.isNull() || m_primaryImage.isNull())
+        return;
+
+    if (m_tempImage.isNull())
+        m_tempImage = m_secondaryImage;
+
+    const int a = qRound(alpha*256);
+    const int ia = 256 - a;
+    const int sw = m_primaryImage.width();
+    const int sh = m_primaryImage.height();
+    const int bpl = m_primaryImage.bytesPerLine();
+    switch (m_primaryImage.depth()) {
+    case 32:
+        {
+            uchar *mixed_data = m_tempImage.bits();
+            const uchar *back_data = m_primaryImage.bits();
+            const uchar *front_data = m_secondaryImage.bits();
+            for (int sy = 0; sy < sh; sy++) {
+                quint32 *mixed = (quint32*)mixed_data;
+                const quint32* back = (const quint32*)back_data;
+                const quint32* front = (const quint32*)front_data;
+                for (int sx = 0; sx < sw; sx++) {
+                    quint32 bp = back[sx];
+                    quint32 fp = front[sx];
+                    mixed[sx] =  qRgba ((qRed(bp)*ia + qRed(fp)*a)>>8,
+                                        (qGreen(bp)*ia + qGreen(fp)*a)>>8,
+                                        (qBlue(bp)*ia + qBlue(fp)*a)>>8,
+                                        (qAlpha(bp)*ia + qAlpha(fp)*a)>>8);
+                }
+                mixed_data += bpl;
+                back_data += bpl;
+                front_data += bpl;
+            }
+        }
+    default:
+        break;
+    }
+    painter->drawImage(rect, m_tempImage);
+}
+
+void Transition::paint(QPainter *painter, const QStyleOption *option)
+{
+    float alpha = 1.0;
+    if (m_duration > 0) {
+        QTime current = QTime::currentTime();
+
+        if (m_startTime > current)
+            m_startTime = current;
+
+        int timeDiff = m_startTime.msecsTo(current);
+        alpha = timeDiff/(float)m_duration;
+        if (timeDiff > m_duration) {
+            m_running = false;
+            alpha = 1.0;
+        }
+    }
+    else {
+        m_running = false;
+    }
+    drawBlendedImage(painter, option->rect, alpha);
+}
+
+void StyleAnimator::timerEvent(QTimerEvent *)
+{
+    for (int i = animations.size() - 1 ; i >= 0 ; --i) {
+        if (animations[i]->widget())
+            animations[i]->widget()->update();
+
+        if (!animations[i]->widget() ||
+            !animations[i]->widget()->isEnabled() ||
+            !animations[i]->widget()->isVisible() ||
+            animations[i]->widget()->window()->isMinimized() ||
+            !animations[i]->running())
+        {
+            Animation *a = animations.takeAt(i);
+            delete a;
+        }
+    }
+    if (animations.size() == 0 && animationTimer.isActive()) {
+        animationTimer.stop();
+    }
+}
+
+void StyleAnimator::stopAnimation(const QWidget *w)
+{
+    for (int i = animations.size() - 1 ; i >= 0 ; --i) {
+        if (animations[i]->widget() == w) {
+            Animation *a = animations.takeAt(i);
+            delete a;
+            break;
+        }
+    }
+}
+
+void StyleAnimator::startAnimation(Animation *t)
+{
+    stopAnimation(t->widget());
+    animations.append(t);
+    if (animations.size() > 0 && !animationTimer.isActive()) {
+        animationTimer.start(35, this);
+    }
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/styleanimator.h b/ThirdParty/GUI/qt-manhattan-style/styleanimator.h
new file mode 100644
index 0000000..08452c6
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/styleanimator.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef ANIMATION_H
+#define ANIMATION_H
+
+#include <QPointer>
+#include <QTime>
+#include <QBasicTimer>
+#include <QStyle>
+#include <QPainter>
+#include <QWidget>
+
+/*
+ * This is a set of helper classes to allow for widget animations in
+ * the style. Its mostly taken from Vista style so it should be fully documented
+ * there.
+ *
+ */
+
+class Animation
+{
+public :
+    Animation() : m_running(true) { }
+    virtual ~Animation() { }
+    QWidget * widget() const { return m_widget; }
+    bool running() const { return m_running; }
+    const QTime &startTime() const { return m_startTime; }
+    void setRunning(bool val) { m_running = val; }
+    void setWidget(QWidget *widget) { m_widget = widget; }
+    void setStartTime(const QTime &startTime) { m_startTime = startTime; }
+    virtual void paint(QPainter *painter, const QStyleOption *option);
+
+protected:
+    void drawBlendedImage(QPainter *painter, QRect rect, float value);
+    QTime m_startTime;
+    QPointer<QWidget> m_widget;
+    QImage m_primaryImage;
+    QImage m_secondaryImage;
+    QImage m_tempImage;
+    bool m_running;
+};
+
+// Handles state transition animations
+class Transition : public Animation
+{
+public :
+    Transition() : Animation() {}
+    virtual ~Transition() {}
+    void setDuration(int duration) { m_duration = duration; }
+    void setStartImage(const QImage &image) { m_primaryImage = image; }
+    void setEndImage(const QImage &image) { m_secondaryImage = image; }
+    virtual void paint(QPainter *painter, const QStyleOption *option);
+    int duration() const { return m_duration; }
+    int m_duration; //set time in ms to complete a state transition
+};
+
+class StyleAnimator : public QObject
+{
+    Q_OBJECT
+
+public:
+    StyleAnimator(QObject *parent = 0) : QObject(parent) {}
+
+    void timerEvent(QTimerEvent *);
+    void startAnimation(Animation *);
+    void stopAnimation(const QWidget *);
+    Animation* widgetAnimation(const QWidget *) const;
+
+private:
+    QBasicTimer animationTimer;
+    QList <Animation*> animations;
+};
+
+#endif // ANIMATION_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/styledbar.cpp b/ThirdParty/GUI/qt-manhattan-style/styledbar.cpp
new file mode 100644
index 0000000..de2e220
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/styledbar.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "styledbar.h"
+
+#include "stylehelper.h"
+
+#include <QVariant>
+#include <QPainter>
+#include <QPixmapCache>
+#include <QStyle>
+#include <QStyleOption>
+
+using namespace Manhattan;
+
+StyledBar::StyledBar(QWidget *parent)
+    : QWidget(parent)
+{
+    setProperty("panelwidget", true);
+    setProperty("panelwidget_singlerow", true);
+    setProperty("lightColored", false);
+}
+
+void StyledBar::setSingleRow(bool singleRow)
+{
+    setProperty("panelwidget_singlerow", singleRow);
+}
+
+bool StyledBar::isSingleRow() const
+{
+    return property("panelwidget_singlerow").toBool();
+}
+
+void StyledBar::setLightColored(bool lightColored)
+{
+    setProperty("lightColored", lightColored);
+}
+
+bool StyledBar::isLightColored() const
+{
+    return property("lightColored").toBool();
+}
+
+void StyledBar::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+    QPainter painter(this);
+    QStyleOption option;
+    option.rect = rect();
+    option.state = QStyle::State_Horizontal;
+    style()->drawControl(QStyle::CE_ToolBar, &option, &painter, this);
+}
+
+StyledSeparator::StyledSeparator(QWidget *parent)
+    : QWidget(parent)
+{
+    setFixedWidth(10);
+}
+
+void StyledSeparator::paintEvent(QPaintEvent *event)
+{
+    Q_UNUSED(event)
+    QPainter painter(this);
+    QStyleOption option;
+    option.rect = rect();
+    option.state = QStyle::State_Horizontal;
+    option.palette = palette();
+    style()->drawPrimitive(QStyle::PE_IndicatorToolBarSeparator, &option, &painter, this);
+}
diff --git a/ThirdParty/GUI/qt-manhattan-style/styledbar.h b/ThirdParty/GUI/qt-manhattan-style/styledbar.h
new file mode 100644
index 0000000..b273da7
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/styledbar.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef STYLEDBAR_H
+#define STYLEDBAR_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QWidget>
+
+namespace Manhattan {
+
+class QTMANHATTANSTYLESHARED_EXPORT StyledBar : public QWidget
+{
+    Q_OBJECT
+public:
+    StyledBar(QWidget *parent = 0);
+    void setSingleRow(bool singleRow);
+    bool isSingleRow() const;
+
+    void setLightColored(bool lightColored);
+    bool isLightColored() const;
+
+protected:
+    void paintEvent(QPaintEvent *event);
+};
+
+class QTMANHATTANSTYLESHARED_EXPORT StyledSeparator : public QWidget
+{
+    Q_OBJECT
+public:
+    StyledSeparator(QWidget *parent = 0);
+protected:
+    void paintEvent(QPaintEvent *event);
+};
+
+} // Manhattan
+
+#endif // STYLEDBAR_H
diff --git a/ThirdParty/GUI/qt-manhattan-style/stylehelper.cpp b/ThirdParty/GUI/qt-manhattan-style/stylehelper.cpp
new file mode 100644
index 0000000..692157f
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/stylehelper.cpp
@@ -0,0 +1,519 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "stylehelper.h"
+
+#include <QPixmapCache>
+#include <QWidget>
+#include <QRect>
+#include <QPainter>
+#include <QApplication>
+#include <QPalette>
+#include <QStyleOption>
+#include <QObject>
+
+// Clamps float color values within (0, 255)
+static int clamp(float x)
+{
+    const int val = x > 255 ? 255 : static_cast<int>(x);
+    return val < 0 ? 0 : val;
+}
+
+// Clamps float color values within (0, 255)
+/*
+static int range(float x, int min, int max)
+{
+    int val = x > max ? max : x;
+    return val < min ? min : val;
+}
+*/
+
+namespace Manhattan {
+namespace Utils {
+
+QColor StyleHelper::mergedColors(const QColor &colorA, const QColor &colorB, int factor)
+{
+    const int maxFactor = 100;
+    QColor tmp = colorA;
+    tmp.setRed((tmp.red() * factor) / maxFactor + (colorB.red() * (maxFactor - factor)) / maxFactor);
+    tmp.setGreen((tmp.green() * factor) / maxFactor + (colorB.green() * (maxFactor - factor)) / maxFactor);
+    tmp.setBlue((tmp.blue() * factor) / maxFactor + (colorB.blue() * (maxFactor - factor)) / maxFactor);
+    return tmp;
+}
+
+qreal StyleHelper::sidebarFontSize()
+{
+#if defined(Q_OS_MAC)
+    return 10;
+#else
+    return 7.5;
+#endif
+}
+
+QPalette StyleHelper::sidebarFontPalette(const QPalette &original)
+{
+    QPalette palette = original;
+    palette.setColor(QPalette::Active, QPalette::Text, panelTextColor());
+    palette.setColor(QPalette::Active, QPalette::WindowText, panelTextColor());
+    palette.setColor(QPalette::Inactive, QPalette::Text, panelTextColor().darker());
+    palette.setColor(QPalette::Inactive, QPalette::WindowText, panelTextColor().darker());
+    return palette;
+}
+
+QColor StyleHelper::panelTextColor(bool lightColored)
+{
+    //qApp->palette().highlightedText().color();
+    if (!lightColored)
+        return Qt::white;
+    else
+        return Qt::black;
+}
+
+// Invalid by default, setBaseColor needs to be called at least once
+QColor StyleHelper::m_baseColor;
+QColor StyleHelper::m_requestedBaseColor;
+int StyleHelper::m_navigationWidgetHeight = 24;
+
+QColor StyleHelper::baseColor(bool lightColored)
+{
+    if (!lightColored)
+        return m_baseColor;
+    else
+        return m_baseColor.lighter(230);
+}
+
+QColor StyleHelper::highlightColor(bool lightColored)
+{
+    QColor result = baseColor(lightColored);
+    if (!lightColored)
+        result.setHsv(result.hue(),
+                  clamp(result.saturation()),
+                  clamp(result.value() * 1.16));
+    else
+        result.setHsv(result.hue(),
+                  clamp(result.saturation()),
+                  clamp(result.value() * 1.06));
+    return result;
+}
+
+QColor StyleHelper::shadowColor(bool lightColored)
+{
+    QColor result = baseColor(lightColored);
+    result.setHsv(result.hue(),
+                  clamp(result.saturation() * 1.1),
+                  clamp(result.value() * 0.70));
+    return result;
+}
+
+QColor StyleHelper::borderColor(bool lightColored)
+{
+    QColor result = baseColor(lightColored);
+    result.setHsv(result.hue(),
+                  result.saturation(),
+                  result.value() / 2);
+    return result;
+}
+
+// We try to ensure that the actual color used are within
+// reasonalbe bounds while generating the actual baseColor
+// from the users request.
+void StyleHelper::setBaseColor(const QColor &newcolor)
+{
+    m_requestedBaseColor = newcolor;
+
+    QColor color;
+    color.setHsv(newcolor.hue(),
+                 newcolor.saturation() * 0.7,
+                 64 + newcolor.value() / 3);
+
+    if (color.isValid() && color != m_baseColor) {
+        m_baseColor = color;
+        foreach (QWidget *w, QApplication::topLevelWidgets())
+            w->update();
+    }
+}
+
+static void verticalGradientHelper(QPainter *p, const QRect &spanRect, const QRect &rect, bool lightColored)
+{
+    QColor highlight = StyleHelper::highlightColor(lightColored);
+    QColor shadow = StyleHelper::shadowColor(lightColored);
+    QLinearGradient grad(spanRect.topRight(), spanRect.topLeft());
+    grad.setColorAt(0, highlight.lighter(117));
+    grad.setColorAt(1, shadow.darker(109));
+    p->fillRect(rect, grad);
+
+    QColor light(255, 255, 255, 80);
+    p->setPen(light);
+    p->drawLine(rect.topRight() - QPoint(1, 0), rect.bottomRight() - QPoint(1, 0));
+    QColor dark(0, 0, 0, 90);
+    p->setPen(dark);
+    p->drawLine(rect.topLeft(), rect.bottomLeft());
+}
+
+void StyleHelper::verticalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect, bool lightColored)
+{
+    if (StyleHelper::usePixmapCache()) {
+        QString key;
+        QColor keyColor = baseColor(lightColored);
+        key.sprintf("mh_vertical %d %d %d %d %d",
+            spanRect.width(), spanRect.height(), clipRect.width(),
+            clipRect.height(), keyColor.rgb());;
+
+        QPixmap pixmap;
+        if (!QPixmapCache::find(key, pixmap)) {
+            pixmap = QPixmap(clipRect.size());
+            QPainter p(&pixmap);
+            QRect rect(0, 0, clipRect.width(), clipRect.height());
+            verticalGradientHelper(&p, spanRect, rect, lightColored);
+            p.end();
+            QPixmapCache::insert(key, pixmap);
+        }
+
+        painter->drawPixmap(clipRect.topLeft(), pixmap);
+    } else {
+        verticalGradientHelper(painter, spanRect, clipRect, lightColored);
+    }
+}
+
+static void horizontalGradientHelper(QPainter *p, const QRect &spanRect, const
+QRect &rect, bool lightColored)
+{
+    if (lightColored) {
+        QLinearGradient shadowGradient(rect.topLeft(), rect.bottomLeft());
+        shadowGradient.setColorAt(0, 0xf0f0f0);
+        shadowGradient.setColorAt(1, 0xcfcfcf);
+        p->fillRect(rect, shadowGradient);
+        return;
+    }
+
+    QColor base = StyleHelper::baseColor(lightColored);
+    QColor highlight = StyleHelper::highlightColor(lightColored);
+    QColor shadow = StyleHelper::shadowColor(lightColored);
+    QLinearGradient grad(rect.topLeft(), rect.bottomLeft());
+    grad.setColorAt(0, highlight.lighter(120));
+    if (rect.height() == StyleHelper::navigationWidgetHeight()) {
+        grad.setColorAt(0.4, highlight);
+        grad.setColorAt(0.401, base);
+    }
+    grad.setColorAt(1, shadow);
+    p->fillRect(rect, grad);
+
+    QLinearGradient shadowGradient(spanRect.topLeft(), spanRect.topRight());
+        shadowGradient.setColorAt(0, QColor(0, 0, 0, 30));
+    QColor lighterHighlight;
+    lighterHighlight = highlight.lighter(130);
+    lighterHighlight.setAlpha(100);
+    shadowGradient.setColorAt(0.7, lighterHighlight);
+        shadowGradient.setColorAt(1, QColor(0, 0, 0, 40));
+    p->fillRect(rect, shadowGradient);
+}
+
+void StyleHelper::horizontalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect, bool lightColored)
+{
+    if (StyleHelper::usePixmapCache()) {
+        QString key;
+        QColor keyColor = baseColor(lightColored);
+        key.sprintf("mh_horizontal %d %d %d %d %d %d",
+            spanRect.width(), spanRect.height(), clipRect.width(),
+            clipRect.height(), keyColor.rgb(), spanRect.x());
+
+        QPixmap pixmap;
+        if (!QPixmapCache::find(key, pixmap)) {
+            pixmap = QPixmap(clipRect.size());
+            QPainter p(&pixmap);
+            QRect rect = QRect(0, 0, clipRect.width(), clipRect.height());
+            horizontalGradientHelper(&p, spanRect, rect, lightColored);
+            p.end();
+            QPixmapCache::insert(key, pixmap);
+        }
+
+        painter->drawPixmap(clipRect.topLeft(), pixmap);
+
+    } else {
+        horizontalGradientHelper(painter, spanRect, clipRect, lightColored);
+    }
+}
+
+static void menuGradientHelper(QPainter *p, const QRect &spanRect, const QRect &rect)
+{
+    QLinearGradient grad(spanRect.topLeft(), spanRect.bottomLeft());
+    QColor menuColor = StyleHelper::mergedColors(StyleHelper::baseColor(), QColor(244, 244, 244), 25);
+    grad.setColorAt(0, menuColor.lighter(112));
+    grad.setColorAt(1, menuColor);
+    p->fillRect(rect, grad);
+}
+
+void StyleHelper::drawArrow(QStyle::PrimitiveElement element, QPainter *painter, const QStyleOption *option)
+{
+    // From windowsstyle but modified to enable AA
+    if (option->rect.width() <= 1 || option->rect.height() <= 1)
+        return;
+
+    QRect r = option->rect;
+    int size = qMin(r.height(), r.width());
+    QPixmap pixmap;
+    QString pixmapName;
+    pixmapName.sprintf("arrow-%s-%d-%d-%d-%lld",
+                       "$qt_ia",
+                       uint(option->state), element,
+                       size, option->palette.cacheKey());
+    if (!QPixmapCache::find(pixmapName, pixmap)) {
+        int border = size/5;
+        int sqsize = 2*(size/2);
+        QImage image(sqsize, sqsize, QImage::Format_ARGB32);
+        image.fill(Qt::transparent);
+        QPainter imagePainter(&image);
+        imagePainter.setRenderHint(QPainter::Antialiasing, true);
+        imagePainter.translate(0.5, 0.5);
+        QPolygon a;
+        switch (element) {
+            case QStyle::PE_IndicatorArrowUp:
+                a.setPoints(3, border, sqsize/2,  sqsize/2, border,  sqsize - border, sqsize/2);
+                break;
+            case QStyle::PE_IndicatorArrowDown:
+                a.setPoints(3, border, sqsize/2,  sqsize/2, sqsize - border,  sqsize - border, sqsize/2);
+                break;
+            case QStyle::PE_IndicatorArrowRight:
+                a.setPoints(3, sqsize - border, sqsize/2,  sqsize/2, border,  sqsize/2, sqsize - border);
+                break;
+            case QStyle::PE_IndicatorArrowLeft:
+                a.setPoints(3, border, sqsize/2,  sqsize/2, border,  sqsize/2, sqsize - border);
+                break;
+            default:
+                break;
+        }
+
+        int bsx = 0;
+        int bsy = 0;
+
+        if (option->state & QStyle::State_Sunken) {
+            bsx = qApp->style()->pixelMetric(QStyle::PM_ButtonShiftHorizontal);
+            bsy = qApp->style()->pixelMetric(QStyle::PM_ButtonShiftVertical);
+        }
+
+        QRect bounds = a.boundingRect();
+        int sx = sqsize / 2 - bounds.center().x() - 1;
+        int sy = sqsize / 2 - bounds.center().y() - 1;
+        imagePainter.translate(sx + bsx, sy + bsy);
+
+        if (!(option->state & QStyle::State_Enabled)) {
+            QColor foreGround(150, 150, 150, 150);
+            imagePainter.setBrush(option->palette.mid().color());
+            imagePainter.setPen(option->palette.mid().color());
+        } else {
+            QColor shadow(0, 0, 0, 100);
+            imagePainter.translate(0, 1);
+            imagePainter.setPen(shadow);
+            imagePainter.setBrush(shadow);
+            QColor foreGround(255, 255, 255, 210);
+            imagePainter.drawPolygon(a);
+            imagePainter.translate(0, -1);
+            imagePainter.setPen(foreGround);
+            imagePainter.setBrush(foreGround);
+        }
+        imagePainter.drawPolygon(a);
+        imagePainter.end();
+        pixmap = QPixmap::fromImage(image);
+        QPixmapCache::insert(pixmapName, pixmap);
+    }
+    int xOffset = r.x() + (r.width() - size)/2;
+    int yOffset = r.y() + (r.height() - size)/2;
+    painter->drawPixmap(xOffset, yOffset, pixmap);
+}
+
+void StyleHelper::menuGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect)
+{
+    if (StyleHelper::usePixmapCache()) {
+        QString key;
+        key.sprintf("mh_menu %d %d %d %d %d",
+            spanRect.width(), spanRect.height(), clipRect.width(),
+            clipRect.height(), StyleHelper::baseColor().rgb());
+
+        QPixmap pixmap;
+        if (!QPixmapCache::find(key, pixmap)) {
+            pixmap = QPixmap(clipRect.size());
+            QPainter p(&pixmap);
+            QRect rect = QRect(0, 0, clipRect.width(), clipRect.height());
+            menuGradientHelper(&p, spanRect, rect);
+            p.end();
+            QPixmapCache::insert(key, pixmap);
+        }
+
+        painter->drawPixmap(clipRect.topLeft(), pixmap);
+    } else {
+        menuGradientHelper(painter, spanRect, clipRect);
+    }
+}
+
+// Draws a cached pixmap with shadow
+void StyleHelper::drawIconWithShadow(const QIcon &icon, const QRect &rect,
+                                     QPainter *p, QIcon::Mode iconMode, int radius, const QColor &color, const QPoint &offset)
+{
+    QPixmap cache;
+    QString pixmapName = QString::fromLatin1("icon %0 %1 %2").arg(icon.cacheKey()).arg(iconMode).arg(rect.height());
+
+    if (!QPixmapCache::find(pixmapName, cache)) {
+        QPixmap px = icon.pixmap(rect.size());
+        cache = QPixmap(px.size() + QSize(radius * 2, radius * 2));
+        cache.fill(Qt::transparent);
+
+        QPainter cachePainter(&cache);
+        if (iconMode == QIcon::Disabled) {
+            QImage im = px.toImage().convertToFormat(QImage::Format_ARGB32);
+            for (int y=0; y<im.height(); ++y) {
+                QRgb *scanLine = (QRgb*)im.scanLine(y);
+                for (int x=0; x<im.width(); ++x) {
+                    QRgb pixel = *scanLine;
+                    char intensity = qGray(pixel);
+                    *scanLine = qRgba(intensity, intensity, intensity, qAlpha(pixel));
+                    ++scanLine;
+                }
+            }
+            px = QPixmap::fromImage(im);
+        }
+
+        // Draw shadow
+        QImage tmp(px.size() + QSize(radius * 2, radius * 2 + 1), QImage::Format_ARGB32_Premultiplied);
+        tmp.fill(Qt::transparent);
+
+        QPainter tmpPainter(&tmp);
+        tmpPainter.setCompositionMode(QPainter::CompositionMode_Source);
+        tmpPainter.drawPixmap(QPoint(radius, radius), px);
+        tmpPainter.end();
+
+        // blur the alpha channel
+        QImage blurred(tmp.size(), QImage::Format_ARGB32_Premultiplied);
+        blurred.fill(Qt::transparent);
+        QPainter blurPainter(&blurred);
+        qt_blurImage(&blurPainter, tmp, radius, false, true);
+        blurPainter.end();
+
+        tmp = blurred;
+
+        // blacken the image...
+        tmpPainter.begin(&tmp);
+        tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
+        tmpPainter.fillRect(tmp.rect(), color);
+        tmpPainter.end();
+
+        tmpPainter.begin(&tmp);
+        tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
+        tmpPainter.fillRect(tmp.rect(), color);
+        tmpPainter.end();
+
+        // draw the blurred drop shadow...
+        cachePainter.drawImage(QRect(0, 0, cache.rect().width(), cache.rect().height()), tmp);
+
+        // Draw the actual pixmap...
+        cachePainter.drawPixmap(QPoint(radius, radius) + offset, px);
+        QPixmapCache::insert(pixmapName, cache);
+    }
+
+    QRect targetRect = cache.rect();
+    targetRect.moveCenter(rect.center());
+    p->drawPixmap(targetRect.topLeft() - offset, cache);
+}
+
+// Draws a CSS-like border image where the defined borders are not stretched
+void StyleHelper::drawCornerImage(const QImage &img, QPainter *painter, QRect rect,
+                                  int left, int top, int right, int bottom)
+{
+    QSize size = img.size();
+    if (top > 0) { //top
+        painter->drawImage(QRect(rect.left() + left, rect.top(), rect.width() -right - left, top), img,
+                           QRect(left, 0, size.width() -right - left, top));
+        if (left > 0) //top-left
+            painter->drawImage(QRect(rect.left(), rect.top(), left, top), img,
+                               QRect(0, 0, left, top));
+        if (right > 0) //top-right
+            painter->drawImage(QRect(rect.left() + rect.width() - right, rect.top(), right, top), img,
+                               QRect(size.width() - right, 0, right, top));
+    }
+    //left
+    if (left > 0)
+        painter->drawImage(QRect(rect.left(), rect.top()+top, left, rect.height() - top - bottom), img,
+                           QRect(0, top, left, size.height() - bottom - top));
+    //center
+    painter->drawImage(QRect(rect.left() + left, rect.top()+top, rect.width() -right - left,
+                             rect.height() - bottom - top), img,
+                       QRect(left, top, size.width() -right -left,
+                             size.height() - bottom - top));
+    if (right > 0) //right
+        painter->drawImage(QRect(rect.left() +rect.width() - right, rect.top()+top, right, rect.height() - top - bottom), img,
+                           QRect(size.width() - right, top, right, size.height() - bottom - top));
+    if (bottom > 0) { //bottom
+        painter->drawImage(QRect(rect.left() +left, rect.top() + rect.height() - bottom,
+                                 rect.width() - right - left, bottom), img,
+                           QRect(left, size.height() - bottom,
+                                 size.width() - right - left, bottom));
+    if (left > 0) //bottom-left
+        painter->drawImage(QRect(rect.left(), rect.top() + rect.height() - bottom, left, bottom), img,
+                           QRect(0, size.height() - bottom, left, bottom));
+    if (right > 0) //bottom-right
+        painter->drawImage(QRect(rect.left() + rect.width() - right, rect.top() + rect.height() - bottom, right, bottom), img,
+                           QRect(size.width() - right, size.height() - bottom, right, bottom));
+    }
+}
+
+// Tints an image with tintColor, while preserving alpha and lightness
+void StyleHelper::tintImage(QImage &img, const QColor &tintColor)
+{
+    QPainter p(&img);
+    p.setCompositionMode(QPainter::CompositionMode_Screen);
+
+    for (int x = 0; x < img.width(); ++x) {
+        for (int y = 0; y < img.height(); ++y) {
+            QRgb rgbColor = img.pixel(x, y);
+            int alpha = qAlpha(rgbColor);
+            QColor c = QColor(rgbColor);
+
+            if (alpha > 0) {
+                c.toHsl();
+                qreal l = c.lightnessF();
+                QColor newColor = QColor::fromHslF(tintColor.hslHueF(), tintColor.hslSaturationF(), l);
+                newColor.setAlpha(alpha);
+                img.setPixel(x, y, newColor.rgba());
+            }
+        }
+    }
+}
+
+int StyleHelper::navigationWidgetHeight()
+{
+    return m_navigationWidgetHeight;
+}
+
+void StyleHelper::setNavigationWidgetHeight(int height)
+{
+    m_navigationWidgetHeight = height;
+}
+
+
+} // namespace Utils
+} // namespace Manhattan
diff --git a/ThirdParty/GUI/qt-manhattan-style/stylehelper.h b/ThirdParty/GUI/qt-manhattan-style/stylehelper.h
new file mode 100644
index 0000000..19745dd
--- /dev/null
+++ b/ThirdParty/GUI/qt-manhattan-style/stylehelper.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#ifndef STYLEHELPER_H
+#define STYLEHELPER_H
+
+#include "qt-manhattan-style_global.hpp"
+
+#include <QColor>
+#include <QStyle>
+
+QT_BEGIN_NAMESPACE
+class QPalette;
+class QPainter;
+class QRect;
+// Note, this is exported but in a private header as qtopengl depends on it.
+// We should consider adding this as a public helper function.
+void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0);
+QT_END_NAMESPACE
+
+// Helper class holding all custom color values
+
+namespace Manhattan {
+namespace Utils {
+class QTMANHATTANSTYLESHARED_EXPORT StyleHelper
+{
+public:
+    static const unsigned int DEFAULT_BASE_COLOR = 0x666666;
+
+    // Height of the project explorer navigation bar
+    static int navigationWidgetHeight();
+    static void setNavigationWidgetHeight(int height);
+    static qreal sidebarFontSize();
+    static QPalette sidebarFontPalette(const QPalette &original);
+
+    // This is our color table, all colors derive from baseColor
+    static QColor requestedBaseColor() { return m_requestedBaseColor; }
+    static QColor baseColor(bool lightColored = false);
+    static QColor panelTextColor(bool lightColored = false);
+    static QColor highlightColor(bool lightColored = false);
+    static QColor shadowColor(bool lightColored = false);
+    static QColor borderColor(bool lightColored = false);
+    static QColor buttonTextColor() { return QColor(0x4c4c4c); }
+    static QColor mergedColors(const QColor &colorA, const QColor &colorB, int factor = 50);
+
+    static QColor sidebarHighlight() { return QColor(255, 255, 255, 40); }
+    static QColor sidebarShadow() { return QColor(0, 0, 0, 40); }
+
+    // Sets the base color and makes sure all top level widgets are updated
+    static void setBaseColor(const QColor &color);
+
+    // Draws a shaded anti-aliased arrow
+    static void drawArrow(QStyle::PrimitiveElement element, QPainter *painter, const QStyleOption *option);
+
+    // Gradients used for panels
+    static void horizontalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect, bool lightColored = false);
+    static void verticalGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect, bool lightColored = false);
+    static void menuGradient(QPainter *painter, const QRect &spanRect, const QRect &clipRect);
+    static bool usePixmapCache() { return true; }
+
+    static void drawIconWithShadow(const QIcon &icon, const QRect &rect, QPainter *p, QIcon::Mode iconMode,
+                                   int radius = 3, const QColor &color = QColor(0, 0, 0, 130),
+                                   const QPoint &offset = QPoint(1, -2));
+    static void drawCornerImage(const QImage &img, QPainter *painter, QRect rect,
+                         int left = 0, int top = 0, int right = 0, int bottom = 0);
+
+    static void tintImage(QImage &img, const QColor &tintColor);
+
+private:
+    static QColor m_baseColor;
+    static QColor m_requestedBaseColor;
+    static int m_navigationWidgetHeight;
+};
+
+} // namespace Utils
+} // namespace Manhattan
+#endif // STYLEHELPER_H
diff --git a/ThirdParty/GUI/qtpropertybrowser/CMakeLists.txt b/ThirdParty/GUI/qtpropertybrowser/CMakeLists.txt
new file mode 100644
index 0000000..b950261
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/CMakeLists.txt
@@ -0,0 +1,53 @@
+############################################################################
+# CMakeLists.txt file for building static qtpropertybrowser library from qtsolutions
+############################################################################
+if(POLICY CMP0020)
+    cmake_policy(SET CMP0020 NEW)
+endif()
+if(POLICY CMP0043)
+    cmake_policy(SET CMP0043 NEW)
+endif()
+set(library_name qtpropertybrowser)
+
+file(GLOB source_files "*.cpp")
+file(GLOB include_files "*.h")
+
+set(include_dirs
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_BINARY_DIR} # qtpropertybrowser needs some moc files
+)
+
+include_directories(${include_dirs})
+
+set(resource_files
+    "qtpropertybrowser.qrc"
+)
+
+
+# --- definitions ---------
+if(NOT WIN32)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-overloaded-virtual")
+endif()
+
+
+# --- Qt configuration ---------
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+qt5_add_resources(RC_SRCS ${resource_files})
+
+
+# --- library ---------
+add_library(
+    ${library_name}
+    STATIC
+    ${source_files} ${include_files} ${RC_SRCS} ${mocfiles}
+)
+set(${library_name}_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)
+set(${library_name}_LIBRARY ${library_name} PARENT_SCOPE)
+
+
+# --- dependencies ---------
+target_link_libraries(${library_name} ${Qt5Widgets_LIBRARIES})
+target_link_libraries(${library_name} Qt5::Widgets)
+
+
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtAbstractEditorFactoryBase b/ThirdParty/GUI/qtpropertybrowser/QtAbstractEditorFactoryBase
new file mode 100644
index 0000000..ab4e710
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtAbstractEditorFactoryBase
@@ -0,0 +1 @@
+#include "qtpropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtAbstractPropertyBrowser b/ThirdParty/GUI/qtpropertybrowser/QtAbstractPropertyBrowser
new file mode 100644
index 0000000..ab4e710
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtAbstractPropertyBrowser
@@ -0,0 +1 @@
+#include "qtpropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtAbstractPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtAbstractPropertyManager
new file mode 100644
index 0000000..ab4e710
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtAbstractPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtBoolPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtBoolPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtBoolPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtBrowserItem b/ThirdParty/GUI/qtpropertybrowser/QtBrowserItem
new file mode 100644
index 0000000..ab4e710
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtBrowserItem
@@ -0,0 +1 @@
+#include "qtpropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtButtonPropertyBrowser b/ThirdParty/GUI/qtpropertybrowser/QtButtonPropertyBrowser
new file mode 100644
index 0000000..56e0897
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtButtonPropertyBrowser
@@ -0,0 +1 @@
+#include "qtbuttonpropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtCharEditorFactory b/ThirdParty/GUI/qtpropertybrowser/QtCharEditorFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtCharEditorFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtCharPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtCharPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtCharPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtCheckBoxFactory b/ThirdParty/GUI/qtpropertybrowser/QtCheckBoxFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtCheckBoxFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtColorEditorFactory b/ThirdParty/GUI/qtpropertybrowser/QtColorEditorFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtColorEditorFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtColorPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtColorPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtColorPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtCursorEditorFactory b/ThirdParty/GUI/qtpropertybrowser/QtCursorEditorFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtCursorEditorFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtCursorPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtCursorPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtCursorPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtDateEditFactory b/ThirdParty/GUI/qtpropertybrowser/QtDateEditFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtDateEditFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtDatePropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtDatePropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtDatePropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtDateTimeEditFactory b/ThirdParty/GUI/qtpropertybrowser/QtDateTimeEditFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtDateTimeEditFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtDateTimePropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtDateTimePropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtDateTimePropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtDoublePropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtDoublePropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtDoublePropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtDoubleSpinBoxFactory b/ThirdParty/GUI/qtpropertybrowser/QtDoubleSpinBoxFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtDoubleSpinBoxFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtEnumEditorFactory b/ThirdParty/GUI/qtpropertybrowser/QtEnumEditorFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtEnumEditorFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtEnumPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtEnumPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtEnumPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtFlagPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtFlagPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtFlagPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtFontEditorFactory b/ThirdParty/GUI/qtpropertybrowser/QtFontEditorFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtFontEditorFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtFontPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtFontPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtFontPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtGroupBoxPropertyBrowser b/ThirdParty/GUI/qtpropertybrowser/QtGroupBoxPropertyBrowser
new file mode 100644
index 0000000..27964c0
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtGroupBoxPropertyBrowser
@@ -0,0 +1 @@
+#include "qtgroupboxpropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtGroupPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtGroupPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtGroupPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtIntPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtIntPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtIntPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtKeySequenceEditorFactory b/ThirdParty/GUI/qtpropertybrowser/QtKeySequenceEditorFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtKeySequenceEditorFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtKeySequencePropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtKeySequencePropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtKeySequencePropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtLineEditFactory b/ThirdParty/GUI/qtpropertybrowser/QtLineEditFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtLineEditFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtLocalePropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtLocalePropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtLocalePropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtPointFPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtPointFPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtPointFPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtPointPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtPointPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtPointPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtProperty b/ThirdParty/GUI/qtpropertybrowser/QtProperty
new file mode 100644
index 0000000..ab4e710
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtProperty
@@ -0,0 +1 @@
+#include "qtpropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtRectFPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtRectFPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtRectFPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtRectPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtRectPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtRectPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtScrollBarFactory b/ThirdParty/GUI/qtpropertybrowser/QtScrollBarFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtScrollBarFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtSizeFPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtSizeFPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtSizeFPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtSizePolicyPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtSizePolicyPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtSizePolicyPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtSizePropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtSizePropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtSizePropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtSliderFactory b/ThirdParty/GUI/qtpropertybrowser/QtSliderFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtSliderFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtSpinBoxFactory b/ThirdParty/GUI/qtpropertybrowser/QtSpinBoxFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtSpinBoxFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtStringPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtStringPropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtStringPropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtTimeEditFactory b/ThirdParty/GUI/qtpropertybrowser/QtTimeEditFactory
new file mode 100644
index 0000000..75f35ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtTimeEditFactory
@@ -0,0 +1 @@
+#include "qteditorfactory.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtTimePropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtTimePropertyManager
new file mode 100644
index 0000000..1842e43
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtTimePropertyManager
@@ -0,0 +1 @@
+#include "qtpropertymanager.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtTreePropertyBrowser b/ThirdParty/GUI/qtpropertybrowser/QtTreePropertyBrowser
new file mode 100644
index 0000000..aab106c
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtTreePropertyBrowser
@@ -0,0 +1 @@
+#include "qttreepropertybrowser.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtVariantEditorFactory b/ThirdParty/GUI/qtpropertybrowser/QtVariantEditorFactory
new file mode 100644
index 0000000..8118190
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtVariantEditorFactory
@@ -0,0 +1 @@
+#include "qtvariantproperty.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtVariantProperty b/ThirdParty/GUI/qtpropertybrowser/QtVariantProperty
new file mode 100644
index 0000000..8118190
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtVariantProperty
@@ -0,0 +1 @@
+#include "qtvariantproperty.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/QtVariantPropertyManager b/ThirdParty/GUI/qtpropertybrowser/QtVariantPropertyManager
new file mode 100644
index 0000000..8118190
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/QtVariantPropertyManager
@@ -0,0 +1 @@
+#include "qtvariantproperty.h"
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-arrow.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-arrow.png
new file mode 100644
index 0000000..a69ef4e
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-arrow.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-busy.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-busy.png
new file mode 100644
index 0000000..53717e4
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-busy.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-closedhand.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-closedhand.png
new file mode 100644
index 0000000..b78dd1d
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-closedhand.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-cross.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-cross.png
new file mode 100644
index 0000000..fe38e74
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-cross.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-forbidden.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-forbidden.png
new file mode 100644
index 0000000..2b08c4e
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-forbidden.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-hand.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-hand.png
new file mode 100644
index 0000000..d2004ae
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-hand.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-hsplit.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-hsplit.png
new file mode 100644
index 0000000..a5667e3
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-hsplit.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-ibeam.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-ibeam.png
new file mode 100644
index 0000000..097fc5f
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-ibeam.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-openhand.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-openhand.png
new file mode 100644
index 0000000..9181c85
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-openhand.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeall.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeall.png
new file mode 100644
index 0000000..69f13eb
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeall.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeb.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeb.png
new file mode 100644
index 0000000..f37d7b9
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeb.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizef.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizef.png
new file mode 100644
index 0000000..3b127a0
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizef.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeh.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeh.png
new file mode 100644
index 0000000..a9f40cb
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizeh.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizev.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizev.png
new file mode 100644
index 0000000..1edbab2
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-sizev.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-uparrow.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-uparrow.png
new file mode 100644
index 0000000..d3e70ef
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-uparrow.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-vsplit.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-vsplit.png
new file mode 100644
index 0000000..1beda25
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-vsplit.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-wait.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-wait.png
new file mode 100644
index 0000000..69056c4
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-wait.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/images/cursor-whatsthis.png b/ThirdParty/GUI/qtpropertybrowser/images/cursor-whatsthis.png
new file mode 100644
index 0000000..b47601c
Binary files /dev/null and b/ThirdParty/GUI/qtpropertybrowser/images/cursor-whatsthis.png differ
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtbuttonpropertybrowser.cpp b/ThirdParty/GUI/qtpropertybrowser/qtbuttonpropertybrowser.cpp
new file mode 100644
index 0000000..a98a8be
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtbuttonpropertybrowser.cpp
@@ -0,0 +1,616 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtbuttonpropertybrowser.h"
+#include <QtCore/QSet>
+#include <QtWidgets/QGridLayout>
+#include <QtWidgets/QLabel>
+#include <QtCore/QTimer>
+#include <QtCore/QMap>
+#include <QtWidgets/QToolButton>
+#include <QtWidgets/QStyle>
+
+QT_BEGIN_NAMESPACE
+
+class QtButtonPropertyBrowserPrivate
+{
+    QtButtonPropertyBrowser *q_ptr;
+    Q_DECLARE_PUBLIC(QtButtonPropertyBrowser)
+public:
+
+    void init(QWidget *parent);
+
+    void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex);
+    void propertyRemoved(QtBrowserItem *index);
+    void propertyChanged(QtBrowserItem *index);
+    QWidget *createEditor(QtProperty *property, QWidget *parent) const
+        { return q_ptr->createEditor(property, parent); }
+
+    void slotEditorDestroyed();
+    void slotUpdate();
+    void slotToggled(bool checked);
+
+    struct WidgetItem
+    {
+        WidgetItem() : widget(0), label(0), widgetLabel(0),
+                button(0), container(0), layout(0), /*line(0), */parent(0), expanded(false) { }
+        QWidget *widget; // can be null
+        QLabel *label; // main label with property name
+        QLabel *widgetLabel; // label substitute showing the current value if there is no widget
+        QToolButton *button; // expandable button for items with children
+        QWidget *container; // container which is expanded when the button is clicked
+        QGridLayout *layout; // layout in container
+        WidgetItem *parent;
+        QList<WidgetItem *> children;
+        bool expanded;
+    };
+private:
+    void updateLater();
+    void updateItem(WidgetItem *item);
+    void insertRow(QGridLayout *layout, int row) const;
+    void removeRow(QGridLayout *layout, int row) const;
+    int gridRow(WidgetItem *item) const;
+    int gridSpan(WidgetItem *item) const;
+    void setExpanded(WidgetItem *item, bool expanded);
+    QToolButton *createButton(QWidget *panret = 0) const;
+
+    QMap<QtBrowserItem *, WidgetItem *> m_indexToItem;
+    QMap<WidgetItem *, QtBrowserItem *> m_itemToIndex;
+    QMap<QWidget *, WidgetItem *> m_widgetToItem;
+    QMap<QObject *, WidgetItem *> m_buttonToItem;
+    QGridLayout *m_mainLayout;
+    QList<WidgetItem *> m_children;
+    QList<WidgetItem *> m_recreateQueue;
+};
+
+QToolButton *QtButtonPropertyBrowserPrivate::createButton(QWidget *parent) const
+{
+    QToolButton *button = new QToolButton(parent);
+    button->setCheckable(true);
+    button->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed));
+    button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    button->setArrowType(Qt::DownArrow);
+    button->setIconSize(QSize(3, 16));
+    /*
+    QIcon icon;
+    icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowDown), QIcon::Normal, QIcon::Off);
+    icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowUp), QIcon::Normal, QIcon::On);
+    button->setIcon(icon);
+    */
+    return button;
+}
+
+int QtButtonPropertyBrowserPrivate::gridRow(WidgetItem *item) const
+{
+    QList<WidgetItem *> siblings;
+    if (item->parent)
+        siblings = item->parent->children;
+    else
+        siblings = m_children;
+
+    int row = 0;
+    QListIterator<WidgetItem *> it(siblings);
+    while (it.hasNext()) {
+        WidgetItem *sibling = it.next();
+        if (sibling == item)
+            return row;
+        row += gridSpan(sibling);
+    }
+    return -1;
+}
+
+int QtButtonPropertyBrowserPrivate::gridSpan(WidgetItem *item) const
+{
+    if (item->container && item->expanded)
+        return 2;
+    return 1;
+}
+
+void QtButtonPropertyBrowserPrivate::init(QWidget *parent)
+{
+    m_mainLayout = new QGridLayout();
+    parent->setLayout(m_mainLayout);
+    QLayoutItem *item = new QSpacerItem(0, 0,
+                QSizePolicy::Fixed, QSizePolicy::Expanding);
+    m_mainLayout->addItem(item, 0, 0);
+}
+
+void QtButtonPropertyBrowserPrivate::slotEditorDestroyed()
+{
+    QWidget *editor = qobject_cast<QWidget *>(q_ptr->sender());
+    if (!editor)
+        return;
+    if (!m_widgetToItem.contains(editor))
+        return;
+    m_widgetToItem[editor]->widget = 0;
+    m_widgetToItem.remove(editor);
+}
+
+void QtButtonPropertyBrowserPrivate::slotUpdate()
+{
+    QListIterator<WidgetItem *> itItem(m_recreateQueue);
+    while (itItem.hasNext()) {
+        WidgetItem *item = itItem.next();
+
+        WidgetItem *parent = item->parent;
+        QWidget *w = 0;
+        QGridLayout *l = 0;
+        const int oldRow = gridRow(item);
+        if (parent) {
+            w = parent->container;
+            l = parent->layout;
+        } else {
+            w = q_ptr;
+            l = m_mainLayout;
+        }
+
+        int span = 1;
+        if (!item->widget && !item->widgetLabel)
+            span = 2;
+        item->label = new QLabel(w);
+        item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+        l->addWidget(item->label, oldRow, 0, 1, span);
+
+        updateItem(item);
+    }
+    m_recreateQueue.clear();
+}
+
+void QtButtonPropertyBrowserPrivate::setExpanded(WidgetItem *item, bool expanded)
+{
+    if (item->expanded == expanded)
+        return;
+
+    if (!item->container)
+        return;
+
+    item->expanded = expanded;
+    const int row = gridRow(item);
+    WidgetItem *parent = item->parent;
+    QGridLayout *l = 0;
+    if (parent)
+        l = parent->layout;
+    else
+        l = m_mainLayout;
+
+    if (expanded) {
+        insertRow(l, row + 1);
+        l->addWidget(item->container, row + 1, 0, 1, 2);
+        item->container->show();
+    } else {
+        l->removeWidget(item->container);
+        item->container->hide();
+        removeRow(l, row + 1);
+    }
+
+    item->button->setChecked(expanded);
+    item->button->setArrowType(expanded ? Qt::UpArrow : Qt::DownArrow);
+}
+
+void QtButtonPropertyBrowserPrivate::slotToggled(bool checked)
+{
+    WidgetItem *item = m_buttonToItem.value(q_ptr->sender());
+    if (!item)
+        return;
+
+    setExpanded(item, checked);
+
+    if (checked)
+        emit q_ptr->expanded(m_itemToIndex.value(item));
+    else
+        emit q_ptr->collapsed(m_itemToIndex.value(item));
+}
+
+void QtButtonPropertyBrowserPrivate::updateLater()
+{
+    QTimer::singleShot(0, q_ptr, SLOT(slotUpdate()));
+}
+
+void QtButtonPropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex)
+{
+    WidgetItem *afterItem = m_indexToItem.value(afterIndex);
+    WidgetItem *parentItem = m_indexToItem.value(index->parent());
+
+    WidgetItem *newItem = new WidgetItem();
+    newItem->parent = parentItem;
+
+    QGridLayout *layout = 0;
+    QWidget *parentWidget = 0;
+    int row = -1;
+    if (!afterItem) {
+        row = 0;
+        if (parentItem)
+            parentItem->children.insert(0, newItem);
+        else
+            m_children.insert(0, newItem);
+    } else {
+        row = gridRow(afterItem) + gridSpan(afterItem);
+        if (parentItem)
+            parentItem->children.insert(parentItem->children.indexOf(afterItem) + 1, newItem);
+        else
+            m_children.insert(m_children.indexOf(afterItem) + 1, newItem);
+    }
+
+    if (!parentItem) {
+        layout = m_mainLayout;
+        parentWidget = q_ptr;
+    } else {
+        if (!parentItem->container) {
+            m_recreateQueue.removeAll(parentItem);
+            WidgetItem *grandParent = parentItem->parent;
+            QGridLayout *l = 0;
+            const int oldRow = gridRow(parentItem);
+            if (grandParent) {
+                l = grandParent->layout;
+            } else {
+                l = m_mainLayout;
+            }
+            QFrame *container = new QFrame();
+            container->setFrameShape(QFrame::Panel);
+            container->setFrameShadow(QFrame::Raised);
+            parentItem->container = container;
+            parentItem->button = createButton();
+            m_buttonToItem[parentItem->button] = parentItem;
+            q_ptr->connect(parentItem->button, SIGNAL(toggled(bool)), q_ptr, SLOT(slotToggled(bool)));
+            parentItem->layout = new QGridLayout();
+            container->setLayout(parentItem->layout);
+            if (parentItem->label) {
+                l->removeWidget(parentItem->label);
+                delete parentItem->label;
+                parentItem->label = 0;
+            }
+            int span = 1;
+            if (!parentItem->widget && !parentItem->widgetLabel)
+                span = 2;
+            l->addWidget(parentItem->button, oldRow, 0, 1, span);
+            updateItem(parentItem);
+        }
+        layout = parentItem->layout;
+        parentWidget = parentItem->container;
+    }
+
+    newItem->label = new QLabel(parentWidget);
+    newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+    newItem->widget = createEditor(index->property(), parentWidget);
+    if (newItem->widget) {
+        QObject::connect(newItem->widget, SIGNAL(destroyed()), q_ptr, SLOT(slotEditorDestroyed()));
+        m_widgetToItem[newItem->widget] = newItem;
+    } else if (index->property()->hasValue()) {
+        newItem->widgetLabel = new QLabel(parentWidget);
+        newItem->widgetLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed));
+    }
+
+    insertRow(layout, row);
+    int span = 1;
+    if (newItem->widget)
+        layout->addWidget(newItem->widget, row, 1);
+    else if (newItem->widgetLabel)
+        layout->addWidget(newItem->widgetLabel, row, 1);
+    else
+        span = 2;
+    layout->addWidget(newItem->label, row, 0, span, 1);
+
+    m_itemToIndex[newItem] = index;
+    m_indexToItem[index] = newItem;
+
+    updateItem(newItem);
+}
+
+void QtButtonPropertyBrowserPrivate::propertyRemoved(QtBrowserItem *index)
+{
+    WidgetItem *item = m_indexToItem.value(index);
+
+    m_indexToItem.remove(index);
+    m_itemToIndex.remove(item);
+
+    WidgetItem *parentItem = item->parent;
+
+    const int row = gridRow(item);
+
+    if (parentItem)
+        parentItem->children.removeAt(parentItem->children.indexOf(item));
+    else
+        m_children.removeAt(m_children.indexOf(item));
+
+    const int colSpan = gridSpan(item);
+
+    m_buttonToItem.remove(item->button);
+
+    if (item->widget)
+        delete item->widget;
+    if (item->label)
+        delete item->label;
+    if (item->widgetLabel)
+        delete item->widgetLabel;
+    if (item->button)
+        delete item->button;
+    if (item->container)
+        delete item->container;
+
+    if (!parentItem) {
+        removeRow(m_mainLayout, row);
+        if (colSpan > 1)
+            removeRow(m_mainLayout, row);
+    } else if (parentItem->children.count() != 0) {
+        removeRow(parentItem->layout, row);
+        if (colSpan > 1)
+            removeRow(parentItem->layout, row);
+    } else {
+        const WidgetItem *grandParent = parentItem->parent;
+        QGridLayout *l = 0;
+        if (grandParent) {
+            l = grandParent->layout;
+        } else {
+            l = m_mainLayout;
+        }
+
+        const int parentRow = gridRow(parentItem);
+        const int parentSpan = gridSpan(parentItem);
+
+        l->removeWidget(parentItem->button);
+        l->removeWidget(parentItem->container);
+        delete parentItem->button;
+        delete parentItem->container;
+        parentItem->button = 0;
+        parentItem->container = 0;
+        parentItem->layout = 0;
+        if (!m_recreateQueue.contains(parentItem))
+            m_recreateQueue.append(parentItem);
+        if (parentSpan > 1)
+            removeRow(l, parentRow + 1);
+
+        updateLater();
+    }
+    m_recreateQueue.removeAll(item);
+
+    delete item;
+}
+
+void QtButtonPropertyBrowserPrivate::insertRow(QGridLayout *layout, int row) const
+{
+    QMap<QLayoutItem *, QRect> itemToPos;
+    int idx = 0;
+    while (idx < layout->count()) {
+        int r, c, rs, cs;
+        layout->getItemPosition(idx, &r, &c, &rs, &cs);
+        if (r >= row) {
+            itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs);
+        } else {
+            idx++;
+        }
+    }
+
+    const QMap<QLayoutItem *, QRect>::ConstIterator icend =  itemToPos.constEnd();
+    for(QMap<QLayoutItem *, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) {
+        const QRect r = it.value();
+        layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
+    }
+}
+
+void QtButtonPropertyBrowserPrivate::removeRow(QGridLayout *layout, int row) const
+{
+    QMap<QLayoutItem *, QRect> itemToPos;
+    int idx = 0;
+    while (idx < layout->count()) {
+        int r, c, rs, cs;
+        layout->getItemPosition(idx, &r, &c, &rs, &cs);
+        if (r > row) {
+            itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
+        } else {
+            idx++;
+        }
+    }
+
+    const QMap<QLayoutItem *, QRect>::ConstIterator icend =  itemToPos.constEnd();
+    for(QMap<QLayoutItem *, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) {
+        const QRect r = it.value();
+        layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
+    }
+}
+
+void QtButtonPropertyBrowserPrivate::propertyChanged(QtBrowserItem *index)
+{
+    WidgetItem *item = m_indexToItem.value(index);
+
+    updateItem(item);
+}
+
+void QtButtonPropertyBrowserPrivate::updateItem(WidgetItem *item)
+{
+    QtProperty *property = m_itemToIndex[item]->property();
+    if (item->button) {
+        QFont font = item->button->font();
+        font.setUnderline(property->isModified());
+        item->button->setFont(font);
+        item->button->setText(property->propertyName());
+        item->button->setToolTip(property->toolTip());
+        item->button->setStatusTip(property->statusTip());
+        item->button->setWhatsThis(property->whatsThis());
+        item->button->setEnabled(property->isEnabled());
+    }
+    if (item->label) {
+        QFont font = item->label->font();
+        font.setUnderline(property->isModified());
+        item->label->setFont(font);
+        item->label->setText(property->propertyName());
+        item->label->setToolTip(property->toolTip());
+        item->label->setStatusTip(property->statusTip());
+        item->label->setWhatsThis(property->whatsThis());
+        item->label->setEnabled(property->isEnabled());
+    }
+    if (item->widgetLabel) {
+        QFont font = item->widgetLabel->font();
+        font.setUnderline(false);
+        item->widgetLabel->setFont(font);
+        item->widgetLabel->setText(property->valueText());
+        item->widgetLabel->setToolTip(property->valueText());
+        item->widgetLabel->setEnabled(property->isEnabled());
+    }
+    if (item->widget) {
+        QFont font = item->widget->font();
+        font.setUnderline(false);
+        item->widget->setFont(font);
+        item->widget->setEnabled(property->isEnabled());
+        item->widget->setToolTip(property->valueText());
+    }
+}
+
+
+
+/*!
+    \class QtButtonPropertyBrowser
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtButtonPropertyBrowser class provides a drop down QToolButton
+    based property browser.
+
+    A property browser is a widget that enables the user to edit a
+    given set of properties. Each property is represented by a label
+    specifying the property's name, and an editing widget (e.g. a line
+    edit or a combobox) holding its value. A property can have zero or
+    more subproperties.
+
+    QtButtonPropertyBrowser provides drop down button for all nested
+    properties, i.e. subproperties are enclosed by a container associated with
+    the drop down button. The parent property's name is displayed as button text. For example:
+
+    \image qtbuttonpropertybrowser.png
+
+    Use the QtAbstractPropertyBrowser API to add, insert and remove
+    properties from an instance of the QtButtonPropertyBrowser
+    class. The properties themselves are created and managed by
+    implementations of the QtAbstractPropertyManager class.
+
+    \sa QtTreePropertyBrowser, QtAbstractPropertyBrowser
+*/
+
+/*!
+    \fn void QtButtonPropertyBrowser::collapsed(QtBrowserItem *item)
+
+    This signal is emitted when the \a item is collapsed.
+
+    \sa expanded(), setExpanded()
+*/
+
+/*!
+    \fn void QtButtonPropertyBrowser::expanded(QtBrowserItem *item)
+
+    This signal is emitted when the \a item is expanded.
+
+    \sa collapsed(), setExpanded()
+*/
+
+/*!
+    Creates a property browser with the given \a parent.
+*/
+QtButtonPropertyBrowser::QtButtonPropertyBrowser(QWidget *parent)
+    : QtAbstractPropertyBrowser(parent), d_ptr(new QtButtonPropertyBrowserPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->init(this);
+}
+
+/*!
+    Destroys this property browser.
+
+    Note that the properties that were inserted into this browser are
+    \e not destroyed since they may still be used in other
+    browsers. The properties are owned by the manager that created
+    them.
+
+    \sa QtProperty, QtAbstractPropertyManager
+*/
+QtButtonPropertyBrowser::~QtButtonPropertyBrowser()
+{
+    const QMap<QtButtonPropertyBrowserPrivate::WidgetItem *, QtBrowserItem *>::ConstIterator icend = d_ptr->m_itemToIndex.constEnd();
+    for (QMap<QtButtonPropertyBrowserPrivate::WidgetItem *, QtBrowserItem *>::ConstIterator  it =  d_ptr->m_itemToIndex.constBegin(); it != icend; ++it)
+        delete it.key();
+}
+
+/*!
+    \reimp
+*/
+void QtButtonPropertyBrowser::itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem)
+{
+    d_ptr->propertyInserted(item, afterItem);
+}
+
+/*!
+    \reimp
+*/
+void QtButtonPropertyBrowser::itemRemoved(QtBrowserItem *item)
+{
+    d_ptr->propertyRemoved(item);
+}
+
+/*!
+    \reimp
+*/
+void QtButtonPropertyBrowser::itemChanged(QtBrowserItem *item)
+{
+    d_ptr->propertyChanged(item);
+}
+
+/*!
+    Sets the \a item to either collapse or expanded, depending on the value of \a expanded.
+
+    \sa isExpanded(), expanded(), collapsed()
+*/
+
+void QtButtonPropertyBrowser::setExpanded(QtBrowserItem *item, bool expanded)
+{
+    QtButtonPropertyBrowserPrivate::WidgetItem *itm = d_ptr->m_indexToItem.value(item);
+    if (itm)
+        d_ptr->setExpanded(itm, expanded);
+}
+
+/*!
+    Returns true if the \a item is expanded; otherwise returns false.
+
+    \sa setExpanded()
+*/
+
+bool QtButtonPropertyBrowser::isExpanded(QtBrowserItem *item) const
+{
+    QtButtonPropertyBrowserPrivate::WidgetItem *itm = d_ptr->m_indexToItem.value(item);
+    if (itm)
+        return itm->expanded;
+    return false;
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qtbuttonpropertybrowser.cpp"
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtbuttonpropertybrowser.h b/ThirdParty/GUI/qtpropertybrowser/qtbuttonpropertybrowser.h
new file mode 100644
index 0000000..871fcc0
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtbuttonpropertybrowser.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTBUTTONPROPERTYBROWSER_H
+#define QTBUTTONPROPERTYBROWSER_H
+
+#include "qtpropertybrowser.h"
+
+QT_BEGIN_NAMESPACE
+
+class QtButtonPropertyBrowserPrivate;
+
+class QtButtonPropertyBrowser : public QtAbstractPropertyBrowser
+{
+    Q_OBJECT
+
+public:
+    QtButtonPropertyBrowser(QWidget *parent = 0);
+    virtual ~QtButtonPropertyBrowser();
+
+    void setExpanded(QtBrowserItem *item, bool expanded);
+    bool isExpanded(QtBrowserItem *item) const;
+
+Q_SIGNALS:
+    void collapsed(QtBrowserItem *item);
+    void expanded(QtBrowserItem *item);
+
+protected:
+    virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem);
+    virtual void itemRemoved(QtBrowserItem *item);
+    virtual void itemChanged(QtBrowserItem *item);
+
+private:
+    QScopedPointer<QtButtonPropertyBrowserPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtButtonPropertyBrowser)
+    Q_DISABLE_COPY(QtButtonPropertyBrowser)
+    Q_PRIVATE_SLOT(d_func(), void slotUpdate())
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed())
+    Q_PRIVATE_SLOT(d_func(), void slotToggled(bool))
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/ThirdParty/GUI/qtpropertybrowser/qteditorfactory.cpp b/ThirdParty/GUI/qtpropertybrowser/qteditorfactory.cpp
new file mode 100644
index 0000000..ce2669a
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qteditorfactory.cpp
@@ -0,0 +1,2553 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qteditorfactory.h"
+#include "qtpropertybrowserutils_p.h"
+#include <QtWidgets/QSpinBox>
+#include <QtWidgets/QScrollBar>
+#include <QtWidgets/QComboBox>
+#include <QtWidgets/QAbstractItemView>
+#include <QtWidgets/QLineEdit>
+#include <QtWidgets/QDateTimeEdit>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QMenu>
+#include <QtGui/QKeyEvent>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QLabel>
+#include <QtWidgets/QToolButton>
+#include <QtWidgets/QColorDialog>
+#include <QtWidgets/QFontDialog>
+#include <QtWidgets/QSpacerItem>
+#include <QtWidgets/QKeySequenceEdit>
+#include <QtCore/QMap>
+
+#if defined(Q_CC_MSVC)
+#    pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */
+#endif
+
+QT_BEGIN_NAMESPACE
+
+// Set a hard coded left margin to account for the indentation
+// of the tree view icon when switching to an editor
+
+static inline void setupTreeViewEditorMargin(QLayout *lt)
+{
+    enum { DecorationMargin = 4 };
+    if (QApplication::layoutDirection() == Qt::LeftToRight)
+        lt->setContentsMargins(DecorationMargin, 0, 0, 0);
+    else
+        lt->setContentsMargins(0, 0, DecorationMargin, 0);
+}
+
+// ---------- EditorFactoryPrivate :
+// Base class for editor factory private classes. Manages mapping of properties to editors and vice versa.
+
+template <class Editor>
+class EditorFactoryPrivate
+{
+public:
+
+    typedef QList<Editor *> EditorList;
+    typedef QMap<QtProperty *, EditorList> PropertyToEditorListMap;
+    typedef QMap<Editor *, QtProperty *> EditorToPropertyMap;
+
+    Editor *createEditor(QtProperty *property, QWidget *parent);
+    void initializeEditor(QtProperty *property, Editor *e);
+    void slotEditorDestroyed(QObject *object);
+
+    PropertyToEditorListMap  m_createdEditors;
+    EditorToPropertyMap m_editorToProperty;
+};
+
+template <class Editor>
+Editor *EditorFactoryPrivate<Editor>::createEditor(QtProperty *property, QWidget *parent)
+{
+    Editor *editor = new Editor(parent);
+    initializeEditor(property, editor);
+    return editor;
+}
+
+template <class Editor>
+void EditorFactoryPrivate<Editor>::initializeEditor(QtProperty *property, Editor *editor)
+{
+    typename PropertyToEditorListMap::iterator it = m_createdEditors.find(property);
+    if (it == m_createdEditors.end())
+        it = m_createdEditors.insert(property, EditorList());
+    it.value().append(editor);
+    m_editorToProperty.insert(editor, property);
+}
+
+template <class Editor>
+void EditorFactoryPrivate<Editor>::slotEditorDestroyed(QObject *object)
+{
+    const typename EditorToPropertyMap::iterator ecend = m_editorToProperty.end();
+    for (typename EditorToPropertyMap::iterator itEditor = m_editorToProperty.begin(); itEditor !=  ecend; ++itEditor) {
+        if (itEditor.key() == object) {
+            Editor *editor = itEditor.key();
+            QtProperty *property = itEditor.value();
+            const typename PropertyToEditorListMap::iterator pit = m_createdEditors.find(property);
+            if (pit != m_createdEditors.end()) {
+                pit.value().removeAll(editor);
+                if (pit.value().empty())
+                    m_createdEditors.erase(pit);
+            }
+            m_editorToProperty.erase(itEditor);
+            return;
+        }
+    }
+}
+
+// ------------ QtSpinBoxFactory
+
+class QtSpinBoxFactoryPrivate : public EditorFactoryPrivate<QSpinBox>
+{
+    QtSpinBoxFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtSpinBoxFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, int value);
+    void slotRangeChanged(QtProperty *property, int min, int max);
+    void slotSingleStepChanged(QtProperty *property, int step);
+    void slotSetValue(int value);
+};
+
+void QtSpinBoxFactoryPrivate::slotPropertyChanged(QtProperty *property, int value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+    QListIterator<QSpinBox *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QSpinBox *editor = itEditor.next();
+        if (editor->value() != value) {
+            editor->blockSignals(true);
+            editor->setValue(value);
+            editor->blockSignals(false);
+        }
+    }
+}
+
+void QtSpinBoxFactoryPrivate::slotRangeChanged(QtProperty *property, int min, int max)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtIntPropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QListIterator<QSpinBox *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QSpinBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setRange(min, max);
+        editor->setValue(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtSpinBoxFactoryPrivate::slotSingleStepChanged(QtProperty *property, int step)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+    QListIterator<QSpinBox *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QSpinBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setSingleStep(step);
+        editor->blockSignals(false);
+    }
+}
+
+void QtSpinBoxFactoryPrivate::slotSetValue(int value)
+{
+    QObject *object = q_ptr->sender();
+    const QMap<QSpinBox *, QtProperty *>::ConstIterator  ecend = m_editorToProperty.constEnd();
+    for (QMap<QSpinBox *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor !=  ecend; ++itEditor) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtIntPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+    }
+}
+
+/*!
+    \class QtSpinBoxFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtSpinBoxFactory class provides QSpinBox widgets for
+    properties created by QtIntPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtIntPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtSpinBoxFactory::QtSpinBoxFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtIntPropertyManager>(parent), d_ptr(new QtSpinBoxFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtSpinBoxFactory::~QtSpinBoxFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtSpinBoxFactory::connectPropertyManager(QtIntPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    connect(manager, SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(manager, SIGNAL(singleStepChanged(QtProperty*,int)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,int)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtSpinBoxFactory::createEditor(QtIntPropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QSpinBox *editor = d_ptr->createEditor(property, parent);
+    editor->setSingleStep(manager->singleStep(property));
+    editor->setRange(manager->minimum(property), manager->maximum(property));
+    editor->setValue(manager->value(property));
+    editor->setKeyboardTracking(false);
+
+    connect(editor, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtSpinBoxFactory::disconnectPropertyManager(QtIntPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    disconnect(manager, SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    disconnect(manager, SIGNAL(singleStepChanged(QtProperty*,int)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,int)));
+}
+
+// QtSliderFactory
+
+class QtSliderFactoryPrivate : public EditorFactoryPrivate<QSlider>
+{
+    QtSliderFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtSliderFactory)
+public:
+    void slotPropertyChanged(QtProperty *property, int value);
+    void slotRangeChanged(QtProperty *property, int min, int max);
+    void slotSingleStepChanged(QtProperty *property, int step);
+    void slotSetValue(int value);
+};
+
+void QtSliderFactoryPrivate::slotPropertyChanged(QtProperty *property, int value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+    QListIterator<QSlider *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QSlider *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setValue(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtSliderFactoryPrivate::slotRangeChanged(QtProperty *property, int min, int max)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtIntPropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QListIterator<QSlider *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QSlider *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setRange(min, max);
+        editor->setValue(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtSliderFactoryPrivate::slotSingleStepChanged(QtProperty *property, int step)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+    QListIterator<QSlider *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QSlider *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setSingleStep(step);
+        editor->blockSignals(false);
+    }
+}
+
+void QtSliderFactoryPrivate::slotSetValue(int value)
+{
+    QObject *object = q_ptr->sender();
+    const QMap<QSlider *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QSlider *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor ) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtIntPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+    }
+}
+
+/*!
+    \class QtSliderFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtSliderFactory class provides QSlider widgets for
+    properties created by QtIntPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtIntPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtSliderFactory::QtSliderFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtIntPropertyManager>(parent), d_ptr(new QtSliderFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtSliderFactory::~QtSliderFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtSliderFactory::connectPropertyManager(QtIntPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    connect(manager, SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(manager, SIGNAL(singleStepChanged(QtProperty*,int)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,int)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtSliderFactory::createEditor(QtIntPropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QSlider *editor = new QSlider(Qt::Horizontal, parent);
+    d_ptr->initializeEditor(property, editor);
+    editor->setSingleStep(manager->singleStep(property));
+    editor->setRange(manager->minimum(property), manager->maximum(property));
+    editor->setValue(manager->value(property));
+
+    connect(editor, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtSliderFactory::disconnectPropertyManager(QtIntPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    disconnect(manager, SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    disconnect(manager, SIGNAL(singleStepChanged(QtProperty*,int)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,int)));
+}
+
+// QtSliderFactory
+
+class QtScrollBarFactoryPrivate : public  EditorFactoryPrivate<QScrollBar>
+{
+    QtScrollBarFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtScrollBarFactory)
+public:
+    void slotPropertyChanged(QtProperty *property, int value);
+    void slotRangeChanged(QtProperty *property, int min, int max);
+    void slotSingleStepChanged(QtProperty *property, int step);
+    void slotSetValue(int value);
+};
+
+void QtScrollBarFactoryPrivate::slotPropertyChanged(QtProperty *property, int value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QListIterator<QScrollBar *> itEditor( m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QScrollBar *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setValue(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtScrollBarFactoryPrivate::slotRangeChanged(QtProperty *property, int min, int max)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtIntPropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QListIterator<QScrollBar *> itEditor( m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QScrollBar *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setRange(min, max);
+        editor->setValue(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtScrollBarFactoryPrivate::slotSingleStepChanged(QtProperty *property, int step)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+    QListIterator<QScrollBar *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QScrollBar *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setSingleStep(step);
+        editor->blockSignals(false);
+    }
+}
+
+void QtScrollBarFactoryPrivate::slotSetValue(int value)
+{
+    QObject *object = q_ptr->sender();
+    const QMap<QScrollBar *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QScrollBar *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtIntPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtScrollBarFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtScrollBarFactory class provides QScrollBar widgets for
+    properties created by QtIntPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtIntPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtScrollBarFactory::QtScrollBarFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtIntPropertyManager>(parent), d_ptr(new QtScrollBarFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtScrollBarFactory::~QtScrollBarFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtScrollBarFactory::connectPropertyManager(QtIntPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    connect(manager, SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(manager, SIGNAL(singleStepChanged(QtProperty*,int)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,int)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtScrollBarFactory::createEditor(QtIntPropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QScrollBar *editor = new QScrollBar(Qt::Horizontal, parent);
+    d_ptr->initializeEditor(property, editor);
+    editor->setSingleStep(manager->singleStep(property));
+    editor->setRange(manager->minimum(property), manager->maximum(property));
+    editor->setValue(manager->value(property));
+    connect(editor, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtScrollBarFactory::disconnectPropertyManager(QtIntPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    disconnect(manager, SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    disconnect(manager, SIGNAL(singleStepChanged(QtProperty*,int)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,int)));
+}
+
+// QtCheckBoxFactory
+
+class QtCheckBoxFactoryPrivate : public EditorFactoryPrivate<QtBoolEdit>
+{
+    QtCheckBoxFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtCheckBoxFactory)
+public:
+    void slotPropertyChanged(QtProperty *property, bool value);
+    void slotSetValue(bool value);
+};
+
+void QtCheckBoxFactoryPrivate::slotPropertyChanged(QtProperty *property, bool value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QListIterator<QtBoolEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QtBoolEdit *editor = itEditor.next();
+        editor->blockCheckBoxSignals(true);
+        editor->setChecked(value);
+        editor->blockCheckBoxSignals(false);
+    }
+}
+
+void QtCheckBoxFactoryPrivate::slotSetValue(bool value)
+{
+    QObject *object = q_ptr->sender();
+
+    const QMap<QtBoolEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QtBoolEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend;  ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtBoolPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtCheckBoxFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtCheckBoxFactory class provides QCheckBox widgets for
+    properties created by QtBoolPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtBoolPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtCheckBoxFactory::QtCheckBoxFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtBoolPropertyManager>(parent), d_ptr(new QtCheckBoxFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtCheckBoxFactory::~QtCheckBoxFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtCheckBoxFactory::connectPropertyManager(QtBoolPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,bool)),
+                this, SLOT(slotPropertyChanged(QtProperty*,bool)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtCheckBoxFactory::createEditor(QtBoolPropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QtBoolEdit *editor = d_ptr->createEditor(property, parent);
+    editor->setChecked(manager->value(property));
+
+    connect(editor, SIGNAL(toggled(bool)), this, SLOT(slotSetValue(bool)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtCheckBoxFactory::disconnectPropertyManager(QtBoolPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,bool)),
+                this, SLOT(slotPropertyChanged(QtProperty*,bool)));
+}
+
+// QtDoubleSpinBoxFactory
+
+class QtDoubleSpinBoxFactoryPrivate : public EditorFactoryPrivate<QDoubleSpinBox>
+{
+    QtDoubleSpinBoxFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtDoubleSpinBoxFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, double value);
+    void slotRangeChanged(QtProperty *property, double min, double max);
+    void slotSingleStepChanged(QtProperty *property, double step);
+    void slotDecimalsChanged(QtProperty *property, int prec);
+    void slotSetValue(double value);
+};
+
+void QtDoubleSpinBoxFactoryPrivate::slotPropertyChanged(QtProperty *property, double value)
+{
+    QList<QDoubleSpinBox *> editors = m_createdEditors[property];
+    QListIterator<QDoubleSpinBox *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QDoubleSpinBox *editor = itEditor.next();
+        if (editor->value() != value) {
+            editor->blockSignals(true);
+            editor->setValue(value);
+            editor->blockSignals(false);
+        }
+    }
+}
+
+void QtDoubleSpinBoxFactoryPrivate::slotRangeChanged(QtProperty *property,
+            double min, double max)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtDoublePropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QList<QDoubleSpinBox *> editors = m_createdEditors[property];
+    QListIterator<QDoubleSpinBox *> itEditor(editors);
+    while (itEditor.hasNext()) {
+        QDoubleSpinBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setRange(min, max);
+        editor->setValue(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtDoubleSpinBoxFactoryPrivate::slotSingleStepChanged(QtProperty *property, double step)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtDoublePropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QList<QDoubleSpinBox *> editors = m_createdEditors[property];
+    QListIterator<QDoubleSpinBox *> itEditor(editors);
+    while (itEditor.hasNext()) {
+        QDoubleSpinBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setSingleStep(step);
+        editor->blockSignals(false);
+    }
+}
+
+void QtDoubleSpinBoxFactoryPrivate::slotDecimalsChanged(QtProperty *property, int prec)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtDoublePropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QList<QDoubleSpinBox *> editors = m_createdEditors[property];
+    QListIterator<QDoubleSpinBox *> itEditor(editors);
+    while (itEditor.hasNext()) {
+        QDoubleSpinBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setDecimals(prec);
+        editor->setValue(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtDoubleSpinBoxFactoryPrivate::slotSetValue(double value)
+{
+    QObject *object = q_ptr->sender();
+    const QMap<QDoubleSpinBox *, QtProperty *>::ConstIterator itcend = m_editorToProperty.constEnd();
+    for (QMap<QDoubleSpinBox *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != itcend; ++itEditor) {
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtDoublePropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+    }
+}
+
+/*! \class QtDoubleSpinBoxFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtDoubleSpinBoxFactory class provides QDoubleSpinBox
+    widgets for properties created by QtDoublePropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtDoublePropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtDoubleSpinBoxFactory::QtDoubleSpinBoxFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtDoublePropertyManager>(parent), d_ptr(new QtDoubleSpinBoxFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtDoubleSpinBoxFactory::~QtDoubleSpinBoxFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtDoubleSpinBoxFactory::connectPropertyManager(QtDoublePropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotPropertyChanged(QtProperty*,double)));
+    connect(manager, SIGNAL(rangeChanged(QtProperty*,double,double)),
+                this, SLOT(slotRangeChanged(QtProperty*,double,double)));
+    connect(manager, SIGNAL(singleStepChanged(QtProperty*,double)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,double)));
+    connect(manager, SIGNAL(decimalsChanged(QtProperty*,int)),
+                this, SLOT(slotDecimalsChanged(QtProperty*,int)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtDoubleSpinBoxFactory::createEditor(QtDoublePropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+    QDoubleSpinBox *editor = d_ptr->createEditor(property, parent);
+    editor->setSingleStep(manager->singleStep(property));
+    editor->setDecimals(manager->decimals(property));
+    editor->setRange(manager->minimum(property), manager->maximum(property));
+    editor->setValue(manager->value(property));
+    editor->setKeyboardTracking(false);
+
+    connect(editor, SIGNAL(valueChanged(double)), this, SLOT(slotSetValue(double)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtDoubleSpinBoxFactory::disconnectPropertyManager(QtDoublePropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotPropertyChanged(QtProperty*,double)));
+    disconnect(manager, SIGNAL(rangeChanged(QtProperty*,double,double)),
+                this, SLOT(slotRangeChanged(QtProperty*,double,double)));
+    disconnect(manager, SIGNAL(singleStepChanged(QtProperty*,double)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,double)));
+    disconnect(manager, SIGNAL(decimalsChanged(QtProperty*,int)),
+                this, SLOT(slotDecimalsChanged(QtProperty*,int)));
+}
+
+// QtLineEditFactory
+
+class QtLineEditFactoryPrivate : public EditorFactoryPrivate<QLineEdit>
+{
+    QtLineEditFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtLineEditFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QString &value);
+    void slotRegExpChanged(QtProperty *property, const QRegExp &regExp);
+    void slotSetValue(const QString &value);
+};
+
+void QtLineEditFactoryPrivate::slotPropertyChanged(QtProperty *property,
+                const QString &value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QListIterator<QLineEdit *> itEditor( m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QLineEdit *editor = itEditor.next();
+        if (editor->text() != value)
+            editor->setText(value);
+    }
+}
+
+void QtLineEditFactoryPrivate::slotRegExpChanged(QtProperty *property,
+            const QRegExp &regExp)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtStringPropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QListIterator<QLineEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QLineEdit *editor = itEditor.next();
+        editor->blockSignals(true);
+        const QValidator *oldValidator = editor->validator();
+        QValidator *newValidator = 0;
+        if (regExp.isValid()) {
+            newValidator = new QRegExpValidator(regExp, editor);
+        }
+        editor->setValidator(newValidator);
+        if (oldValidator)
+            delete oldValidator;
+        editor->blockSignals(false);
+    }
+}
+
+void QtLineEditFactoryPrivate::slotSetValue(const QString &value)
+{
+    QObject *object = q_ptr->sender();
+    const QMap<QLineEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QLineEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtStringPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtLineEditFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtLineEditFactory class provides QLineEdit widgets for
+    properties created by QtStringPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtStringPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtLineEditFactory::QtLineEditFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtStringPropertyManager>(parent), d_ptr(new QtLineEditFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtLineEditFactory::~QtLineEditFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtLineEditFactory::connectPropertyManager(QtStringPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QString)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QString)));
+    connect(manager, SIGNAL(regExpChanged(QtProperty*,QRegExp)),
+                this, SLOT(slotRegExpChanged(QtProperty*,QRegExp)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+
+    QLineEdit *editor = d_ptr->createEditor(property, parent);
+    QRegExp regExp = manager->regExp(property);
+    if (regExp.isValid()) {
+        QValidator *validator = new QRegExpValidator(regExp, editor);
+        editor->setValidator(validator);
+    }
+    editor->setText(manager->value(property));
+
+    connect(editor, SIGNAL(textEdited(QString)),
+                this, SLOT(slotSetValue(QString)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtLineEditFactory::disconnectPropertyManager(QtStringPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QString)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QString)));
+    disconnect(manager, SIGNAL(regExpChanged(QtProperty*,QRegExp)),
+                this, SLOT(slotRegExpChanged(QtProperty*,QRegExp)));
+}
+
+// QtDateEditFactory
+
+class QtDateEditFactoryPrivate : public EditorFactoryPrivate<QDateEdit>
+{
+    QtDateEditFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtDateEditFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QDate &value);
+    void slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max);
+    void slotSetValue(const QDate &value);
+};
+
+void QtDateEditFactoryPrivate::slotPropertyChanged(QtProperty *property, const QDate &value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+    QListIterator<QDateEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QDateEdit *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setDate(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtDateEditFactoryPrivate::slotRangeChanged(QtProperty *property,
+                const QDate &min, const QDate &max)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtDatePropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QListIterator<QDateEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QDateEdit *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setDateRange(min, max);
+        editor->setDate(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtDateEditFactoryPrivate::slotSetValue(const QDate &value)
+{
+    QObject *object = q_ptr->sender();
+    const QMap<QDateEdit *, QtProperty *>::ConstIterator  ecend = m_editorToProperty.constEnd();
+    for (QMap<QDateEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtDatePropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtDateEditFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtDateEditFactory class provides QDateEdit widgets for
+    properties created by QtDatePropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtDatePropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtDateEditFactory::QtDateEditFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtDatePropertyManager>(parent), d_ptr(new QtDateEditFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtDateEditFactory::~QtDateEditFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtDateEditFactory::connectPropertyManager(QtDatePropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QDate)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QDate)));
+    connect(manager, SIGNAL(rangeChanged(QtProperty*,QDate,QDate)),
+                this, SLOT(slotRangeChanged(QtProperty*,QDate,QDate)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtDateEditFactory::createEditor(QtDatePropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QDateEdit *editor = d_ptr->createEditor(property, parent);
+    editor->setDisplayFormat(QtPropertyBrowserUtils::dateFormat());
+    editor->setCalendarPopup(true);
+    editor->setDateRange(manager->minimum(property), manager->maximum(property));
+    editor->setDate(manager->value(property));
+
+    connect(editor, SIGNAL(dateChanged(QDate)),
+                this, SLOT(slotSetValue(QDate)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtDateEditFactory::disconnectPropertyManager(QtDatePropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QDate)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QDate)));
+    disconnect(manager, SIGNAL(rangeChanged(QtProperty*,QDate,QDate)),
+                this, SLOT(slotRangeChanged(QtProperty*,QDate,QDate)));
+}
+
+// QtTimeEditFactory
+
+class QtTimeEditFactoryPrivate : public EditorFactoryPrivate<QTimeEdit>
+{
+    QtTimeEditFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtTimeEditFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QTime &value);
+    void slotSetValue(const QTime &value);
+};
+
+void QtTimeEditFactoryPrivate::slotPropertyChanged(QtProperty *property, const QTime &value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+    QListIterator<QTimeEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QTimeEdit *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setTime(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtTimeEditFactoryPrivate::slotSetValue(const QTime &value)
+{
+    QObject *object = q_ptr->sender();
+    const  QMap<QTimeEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QTimeEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtTimePropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtTimeEditFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtTimeEditFactory class provides QTimeEdit widgets for
+    properties created by QtTimePropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtTimePropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtTimeEditFactory::QtTimeEditFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtTimePropertyManager>(parent), d_ptr(new QtTimeEditFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtTimeEditFactory::~QtTimeEditFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtTimeEditFactory::connectPropertyManager(QtTimePropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QTime)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QTime)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtTimeEditFactory::createEditor(QtTimePropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QTimeEdit *editor = d_ptr->createEditor(property, parent);
+    editor->setDisplayFormat(QtPropertyBrowserUtils::timeFormat());
+    editor->setTime(manager->value(property));
+
+    connect(editor, SIGNAL(timeChanged(QTime)),
+                this, SLOT(slotSetValue(QTime)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtTimeEditFactory::disconnectPropertyManager(QtTimePropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QTime)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QTime)));
+}
+
+// QtDateTimeEditFactory
+
+class QtDateTimeEditFactoryPrivate : public EditorFactoryPrivate<QDateTimeEdit>
+{
+    QtDateTimeEditFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtDateTimeEditFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QDateTime &value);
+    void slotSetValue(const QDateTime &value);
+
+};
+
+void QtDateTimeEditFactoryPrivate::slotPropertyChanged(QtProperty *property,
+            const QDateTime &value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QListIterator<QDateTimeEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QDateTimeEdit *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setDateTime(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtDateTimeEditFactoryPrivate::slotSetValue(const QDateTime &value)
+{
+    QObject *object = q_ptr->sender();
+    const  QMap<QDateTimeEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QDateTimeEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend;  ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtDateTimePropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtDateTimeEditFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtDateTimeEditFactory class provides QDateTimeEdit
+    widgets for properties created by QtDateTimePropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtDateTimePropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtDateTimeEditFactory::QtDateTimeEditFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtDateTimePropertyManager>(parent), d_ptr(new QtDateTimeEditFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtDateTimeEditFactory::~QtDateTimeEditFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtDateTimeEditFactory::connectPropertyManager(QtDateTimePropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QDateTime)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QDateTime)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtDateTimeEditFactory::createEditor(QtDateTimePropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+    QDateTimeEdit *editor =  d_ptr->createEditor(property, parent);
+    editor->setDisplayFormat(QtPropertyBrowserUtils::dateTimeFormat());
+    editor->setDateTime(manager->value(property));
+
+    connect(editor, SIGNAL(dateTimeChanged(QDateTime)),
+                this, SLOT(slotSetValue(QDateTime)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtDateTimeEditFactory::disconnectPropertyManager(QtDateTimePropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QDateTime)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QDateTime)));
+}
+
+// QtKeySequenceEditorFactory
+
+class QtKeySequenceEditorFactoryPrivate : public EditorFactoryPrivate<QKeySequenceEdit>
+{
+    QtKeySequenceEditorFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtKeySequenceEditorFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QKeySequence &value);
+    void slotSetValue(const QKeySequence &value);
+};
+
+void QtKeySequenceEditorFactoryPrivate::slotPropertyChanged(QtProperty *property,
+            const QKeySequence &value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QListIterator<QKeySequenceEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QKeySequenceEdit *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setKeySequence(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtKeySequenceEditorFactoryPrivate::slotSetValue(const QKeySequence &value)
+{
+    QObject *object = q_ptr->sender();
+    const  QMap<QKeySequenceEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QKeySequenceEdit *, QtProperty *>::ConstIterator itEditor =  m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtKeySequencePropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtKeySequenceEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtKeySequenceEditorFactory class provides editor
+    widgets for properties created by QtKeySequencePropertyManager objects.
+
+    \sa QtAbstractEditorFactory
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtKeySequenceEditorFactory::QtKeySequenceEditorFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtKeySequencePropertyManager>(parent), d_ptr(new QtKeySequenceEditorFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtKeySequenceEditorFactory::~QtKeySequenceEditorFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtKeySequenceEditorFactory::connectPropertyManager(QtKeySequencePropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QKeySequence)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QKeySequence)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtKeySequenceEditorFactory::createEditor(QtKeySequencePropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+    QKeySequenceEdit *editor = d_ptr->createEditor(property, parent);
+    editor->setKeySequence(manager->value(property));
+
+    connect(editor, SIGNAL(keySequenceChanged(QKeySequence)),
+                this, SLOT(slotSetValue(QKeySequence)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtKeySequenceEditorFactory::disconnectPropertyManager(QtKeySequencePropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QKeySequence)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QKeySequence)));
+}
+
+// QtCharEdit
+
+class QtCharEdit : public QWidget
+{
+    Q_OBJECT
+public:
+    QtCharEdit(QWidget *parent = 0);
+
+    QChar value() const;
+    bool eventFilter(QObject *o, QEvent *e);
+public Q_SLOTS:
+    void setValue(const QChar &value);
+Q_SIGNALS:
+    void valueChanged(const QChar &value);
+protected:
+    void focusInEvent(QFocusEvent *e);
+    void focusOutEvent(QFocusEvent *e);
+    void keyPressEvent(QKeyEvent *e);
+    void keyReleaseEvent(QKeyEvent *e);
+    bool event(QEvent *e);
+private slots:
+    void slotClearChar();
+private:
+    void handleKeyEvent(QKeyEvent *e);
+
+    QChar m_value;
+    QLineEdit *m_lineEdit;
+};
+
+QtCharEdit::QtCharEdit(QWidget *parent)
+    : QWidget(parent),  m_lineEdit(new QLineEdit(this))
+{
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->addWidget(m_lineEdit);
+    layout->setMargin(0);
+    m_lineEdit->installEventFilter(this);
+    m_lineEdit->setReadOnly(true);
+    m_lineEdit->setFocusProxy(this);
+    setFocusPolicy(m_lineEdit->focusPolicy());
+    setAttribute(Qt::WA_InputMethodEnabled);
+}
+
+bool QtCharEdit::eventFilter(QObject *o, QEvent *e)
+{
+    if (o == m_lineEdit && e->type() == QEvent::ContextMenu) {
+        QContextMenuEvent *c = static_cast<QContextMenuEvent *>(e);
+        QMenu *menu = m_lineEdit->createStandardContextMenu();
+        QList<QAction *> actions = menu->actions();
+        QListIterator<QAction *> itAction(actions);
+        while (itAction.hasNext()) {
+            QAction *action = itAction.next();
+            action->setShortcut(QKeySequence());
+            QString actionString = action->text();
+            const int pos = actionString.lastIndexOf(QLatin1Char('\t'));
+            if (pos > 0)
+                actionString = actionString.remove(pos, actionString.length() - pos);
+            action->setText(actionString);
+        }
+        QAction *actionBefore = 0;
+        if (actions.count() > 0)
+            actionBefore = actions[0];
+        QAction *clearAction = new QAction(tr("Clear Char"), menu);
+        menu->insertAction(actionBefore, clearAction);
+        menu->insertSeparator(actionBefore);
+        clearAction->setEnabled(!m_value.isNull());
+        connect(clearAction, SIGNAL(triggered()), this, SLOT(slotClearChar()));
+        menu->exec(c->globalPos());
+        delete menu;
+        e->accept();
+        return true;
+    }
+
+    return QWidget::eventFilter(o, e);
+}
+
+void QtCharEdit::slotClearChar()
+{
+    if (m_value.isNull())
+        return;
+    setValue(QChar());
+    emit valueChanged(m_value);
+}
+
+void QtCharEdit::handleKeyEvent(QKeyEvent *e)
+{
+    const int key = e->key();
+    switch (key) {
+    case Qt::Key_Control:
+    case Qt::Key_Shift:
+    case Qt::Key_Meta:
+    case Qt::Key_Alt:
+    case Qt::Key_Super_L:
+    case Qt::Key_Return:
+        return;
+    default:
+        break;
+    }
+
+    const QString text = e->text();
+    if (text.count() != 1)
+        return;
+
+    const QChar c = text.at(0);
+    if (!c.isPrint())
+        return;
+
+    if (m_value == c)
+        return;
+
+    m_value = c;
+    const QString str = m_value.isNull() ? QString() : QString(m_value);
+    m_lineEdit->setText(str);
+    e->accept();
+    emit valueChanged(m_value);
+}
+
+void QtCharEdit::setValue(const QChar &value)
+{
+    if (value == m_value)
+        return;
+
+    m_value = value;
+    QString str = value.isNull() ? QString() : QString(value);
+    m_lineEdit->setText(str);
+}
+
+QChar QtCharEdit::value() const
+{
+    return m_value;
+}
+
+void QtCharEdit::focusInEvent(QFocusEvent *e)
+{
+    m_lineEdit->event(e);
+    m_lineEdit->selectAll();
+    QWidget::focusInEvent(e);
+}
+
+void QtCharEdit::focusOutEvent(QFocusEvent *e)
+{
+    m_lineEdit->event(e);
+    QWidget::focusOutEvent(e);
+}
+
+void QtCharEdit::keyPressEvent(QKeyEvent *e)
+{
+    handleKeyEvent(e);
+    e->accept();
+}
+
+void QtCharEdit::keyReleaseEvent(QKeyEvent *e)
+{
+    m_lineEdit->event(e);
+}
+
+bool QtCharEdit::event(QEvent *e)
+{
+    switch(e->type()) {
+    case QEvent::Shortcut:
+    case QEvent::ShortcutOverride:
+    case QEvent::KeyRelease:
+        e->accept();
+        return true;
+    default:
+        break;
+    }
+    return QWidget::event(e);
+}
+
+// QtCharEditorFactory
+
+class QtCharEditorFactoryPrivate : public EditorFactoryPrivate<QtCharEdit>
+{
+    QtCharEditorFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtCharEditorFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QChar &value);
+    void slotSetValue(const QChar &value);
+
+};
+
+void QtCharEditorFactoryPrivate::slotPropertyChanged(QtProperty *property,
+            const QChar &value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QListIterator<QtCharEdit *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QtCharEdit *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setValue(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtCharEditorFactoryPrivate::slotSetValue(const QChar &value)
+{
+    QObject *object = q_ptr->sender();
+    const QMap<QtCharEdit *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QtCharEdit *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend;  ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtCharPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtCharEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtCharEditorFactory class provides editor
+    widgets for properties created by QtCharPropertyManager objects.
+
+    \sa QtAbstractEditorFactory
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtCharEditorFactory::QtCharEditorFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtCharPropertyManager>(parent), d_ptr(new QtCharEditorFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtCharEditorFactory::~QtCharEditorFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtCharEditorFactory::connectPropertyManager(QtCharPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QChar)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QChar)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtCharEditorFactory::createEditor(QtCharPropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+    QtCharEdit *editor = d_ptr->createEditor(property, parent);
+    editor->setValue(manager->value(property));
+
+    connect(editor, SIGNAL(valueChanged(QChar)),
+                this, SLOT(slotSetValue(QChar)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtCharEditorFactory::disconnectPropertyManager(QtCharPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QChar)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QChar)));
+}
+
+// QtEnumEditorFactory
+
+class QtEnumEditorFactoryPrivate : public EditorFactoryPrivate<QComboBox>
+{
+    QtEnumEditorFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtEnumEditorFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, int value);
+    void slotEnumNamesChanged(QtProperty *property, const QStringList &);
+    void slotEnumIconsChanged(QtProperty *property, const QMap<int, QIcon> &);
+    void slotSetValue(int value);
+};
+
+void QtEnumEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, int value)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QListIterator<QComboBox *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QComboBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->setCurrentIndex(value);
+        editor->blockSignals(false);
+    }
+}
+
+void QtEnumEditorFactoryPrivate::slotEnumNamesChanged(QtProperty *property,
+                const QStringList &enumNames)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtEnumPropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    QMap<int, QIcon> enumIcons = manager->enumIcons(property);
+
+    QListIterator<QComboBox *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QComboBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        editor->clear();
+        editor->addItems(enumNames);
+        const int nameCount = enumNames.count();
+        for (int i = 0; i < nameCount; i++)
+            editor->setItemIcon(i, enumIcons.value(i));
+        editor->setCurrentIndex(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtEnumEditorFactoryPrivate::slotEnumIconsChanged(QtProperty *property,
+                const QMap<int, QIcon> &enumIcons)
+{
+    if (!m_createdEditors.contains(property))
+        return;
+
+    QtEnumPropertyManager *manager = q_ptr->propertyManager(property);
+    if (!manager)
+        return;
+
+    const QStringList enumNames = manager->enumNames(property);
+    QListIterator<QComboBox *> itEditor(m_createdEditors[property]);
+    while (itEditor.hasNext()) {
+        QComboBox *editor = itEditor.next();
+        editor->blockSignals(true);
+        const int nameCount = enumNames.count();
+        for (int i = 0; i < nameCount; i++)
+            editor->setItemIcon(i, enumIcons.value(i));
+        editor->setCurrentIndex(manager->value(property));
+        editor->blockSignals(false);
+    }
+}
+
+void QtEnumEditorFactoryPrivate::slotSetValue(int value)
+{
+    QObject *object = q_ptr->sender();
+    const  QMap<QComboBox *, QtProperty *>::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (QMap<QComboBox *, QtProperty *>::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtEnumPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtEnumEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtEnumEditorFactory class provides QComboBox widgets for
+    properties created by QtEnumPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtEnumPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtEnumEditorFactory::QtEnumEditorFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtEnumPropertyManager>(parent), d_ptr(new QtEnumEditorFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtEnumEditorFactory::~QtEnumEditorFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtEnumEditorFactory::connectPropertyManager(QtEnumPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    connect(manager, SIGNAL(enumNamesChanged(QtProperty*,QStringList)),
+                this, SLOT(slotEnumNamesChanged(QtProperty*,QStringList)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtEnumEditorFactory::createEditor(QtEnumPropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QComboBox *editor = d_ptr->createEditor(property, parent);
+    editor->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
+    editor->view()->setTextElideMode(Qt::ElideRight);
+    QStringList enumNames = manager->enumNames(property);
+    editor->addItems(enumNames);
+    QMap<int, QIcon> enumIcons = manager->enumIcons(property);
+    const int enumNamesCount = enumNames.count();
+    for (int i = 0; i < enumNamesCount; i++)
+        editor->setItemIcon(i, enumIcons.value(i));
+    editor->setCurrentIndex(manager->value(property));
+
+    connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSetValue(int)));
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtEnumEditorFactory::disconnectPropertyManager(QtEnumPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotPropertyChanged(QtProperty*,int)));
+    disconnect(manager, SIGNAL(enumNamesChanged(QtProperty*,QStringList)),
+                this, SLOT(slotEnumNamesChanged(QtProperty*,QStringList)));
+}
+
+// QtCursorEditorFactory
+
+Q_GLOBAL_STATIC(QtCursorDatabase, cursorDatabase)
+
+class QtCursorEditorFactoryPrivate
+{
+    QtCursorEditorFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtCursorEditorFactory)
+public:
+    QtCursorEditorFactoryPrivate();
+
+    void slotPropertyChanged(QtProperty *property, const QCursor &cursor);
+    void slotEnumChanged(QtProperty *property, int value);
+    void slotEditorDestroyed(QObject *object);
+
+    QtEnumEditorFactory *m_enumEditorFactory;
+    QtEnumPropertyManager *m_enumPropertyManager;
+
+    QMap<QtProperty *, QtProperty *> m_propertyToEnum;
+    QMap<QtProperty *, QtProperty *> m_enumToProperty;
+    QMap<QtProperty *, QList<QWidget *> > m_enumToEditors;
+    QMap<QWidget *, QtProperty *> m_editorToEnum;
+    bool m_updatingEnum;
+};
+
+QtCursorEditorFactoryPrivate::QtCursorEditorFactoryPrivate()
+    : m_updatingEnum(false)
+{
+
+}
+
+void QtCursorEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, const QCursor &cursor)
+{
+    // update enum property
+    QtProperty *enumProp = m_propertyToEnum.value(property);
+    if (!enumProp)
+        return;
+
+    m_updatingEnum = true;
+    m_enumPropertyManager->setValue(enumProp, cursorDatabase()->cursorToValue(cursor));
+    m_updatingEnum = false;
+}
+
+void QtCursorEditorFactoryPrivate::slotEnumChanged(QtProperty *property, int value)
+{
+    if (m_updatingEnum)
+        return;
+    // update cursor property
+    QtProperty *prop = m_enumToProperty.value(property);
+    if (!prop)
+        return;
+    QtCursorPropertyManager *cursorManager = q_ptr->propertyManager(prop);
+    if (!cursorManager)
+        return;
+#ifndef QT_NO_CURSOR
+    cursorManager->setValue(prop, QCursor(cursorDatabase()->valueToCursor(value)));
+#endif
+}
+
+void QtCursorEditorFactoryPrivate::slotEditorDestroyed(QObject *object)
+{
+    // remove from m_editorToEnum map;
+    // remove from m_enumToEditors map;
+    // if m_enumToEditors doesn't contains more editors delete enum property;
+    const  QMap<QWidget *, QtProperty *>::ConstIterator ecend = m_editorToEnum.constEnd();
+    for (QMap<QWidget *, QtProperty *>::ConstIterator itEditor = m_editorToEnum.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QWidget *editor = itEditor.key();
+            QtProperty *enumProp = itEditor.value();
+            m_editorToEnum.remove(editor);
+            m_enumToEditors[enumProp].removeAll(editor);
+            if (m_enumToEditors[enumProp].isEmpty()) {
+                m_enumToEditors.remove(enumProp);
+                QtProperty *property = m_enumToProperty.value(enumProp);
+                m_enumToProperty.remove(enumProp);
+                m_propertyToEnum.remove(property);
+                delete enumProp;
+            }
+            return;
+        }
+}
+
+/*!
+    \class QtCursorEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtCursorEditorFactory class provides QComboBox widgets for
+    properties created by QtCursorPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtCursorPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtCursorEditorFactory::QtCursorEditorFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtCursorPropertyManager>(parent), d_ptr(new QtCursorEditorFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_enumEditorFactory = new QtEnumEditorFactory(this);
+    d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this);
+    connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotEnumChanged(QtProperty*,int)));
+    d_ptr->m_enumEditorFactory->addPropertyManager(d_ptr->m_enumPropertyManager);
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtCursorEditorFactory::~QtCursorEditorFactory()
+{
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtCursorEditorFactory::connectPropertyManager(QtCursorPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QCursor)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QCursor)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtCursorEditorFactory::createEditor(QtCursorPropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    QtProperty *enumProp = 0;
+    if (d_ptr->m_propertyToEnum.contains(property)) {
+        enumProp = d_ptr->m_propertyToEnum[property];
+    } else {
+        enumProp = d_ptr->m_enumPropertyManager->addProperty(property->propertyName());
+        d_ptr->m_enumPropertyManager->setEnumNames(enumProp, cursorDatabase()->cursorShapeNames());
+        d_ptr->m_enumPropertyManager->setEnumIcons(enumProp, cursorDatabase()->cursorShapeIcons());
+#ifndef QT_NO_CURSOR
+        d_ptr->m_enumPropertyManager->setValue(enumProp, cursorDatabase()->cursorToValue(manager->value(property)));
+#endif
+        d_ptr->m_propertyToEnum[property] = enumProp;
+        d_ptr->m_enumToProperty[enumProp] = property;
+    }
+    QtAbstractEditorFactoryBase *af = d_ptr->m_enumEditorFactory;
+    QWidget *editor = af->createEditor(enumProp, parent);
+    d_ptr->m_enumToEditors[enumProp].append(editor);
+    d_ptr->m_editorToEnum[editor] = enumProp;
+    connect(editor, SIGNAL(destroyed(QObject*)),
+                this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtCursorEditorFactory::disconnectPropertyManager(QtCursorPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QCursor)),
+                this, SLOT(slotPropertyChanged(QtProperty*,QCursor)));
+}
+
+// QtColorEditWidget
+
+class QtColorEditWidget : public QWidget {
+    Q_OBJECT
+
+public:
+    QtColorEditWidget(QWidget *parent);
+
+    bool eventFilter(QObject *obj, QEvent *ev);
+
+public Q_SLOTS:
+    void setValue(const QColor &value);
+
+private Q_SLOTS:
+    void buttonClicked();
+
+Q_SIGNALS:
+    void valueChanged(const QColor &value);
+
+private:
+    QColor m_color;
+    QLabel *m_pixmapLabel;
+    QLabel *m_label;
+    QToolButton *m_button;
+};
+
+QtColorEditWidget::QtColorEditWidget(QWidget *parent) :
+    QWidget(parent),
+    m_pixmapLabel(new QLabel),
+    m_label(new QLabel),
+    m_button(new QToolButton)
+{
+    QHBoxLayout *lt = new QHBoxLayout(this);
+    setupTreeViewEditorMargin(lt);
+    lt->setSpacing(0);
+    lt->addWidget(m_pixmapLabel);
+    lt->addWidget(m_label);
+    lt->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
+
+    m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored);
+    m_button->setFixedWidth(20);
+    setFocusProxy(m_button);
+    setFocusPolicy(m_button->focusPolicy());
+    m_button->setText(tr("..."));
+    m_button->installEventFilter(this);
+    connect(m_button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
+    lt->addWidget(m_button);
+    m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::brushValuePixmap(QBrush(m_color)));
+    m_label->setText(QtPropertyBrowserUtils::colorValueText(m_color));
+}
+
+void QtColorEditWidget::setValue(const QColor &c)
+{
+    if (m_color != c) {
+        m_color = c;
+        m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::brushValuePixmap(QBrush(c)));
+        m_label->setText(QtPropertyBrowserUtils::colorValueText(c));
+    }
+}
+
+void QtColorEditWidget::buttonClicked()
+{
+    const QColor newColor = QColorDialog::getColor(m_color, this, QString(), QColorDialog::ShowAlphaChannel);
+    if (newColor.isValid() && newColor != m_color) {
+        setValue(newColor);
+        emit valueChanged(m_color);
+    }
+}
+
+bool QtColorEditWidget::eventFilter(QObject *obj, QEvent *ev)
+{
+    if (obj == m_button) {
+        switch (ev->type()) {
+        case QEvent::KeyPress:
+        case QEvent::KeyRelease: { // Prevent the QToolButton from handling Enter/Escape meant control the delegate
+            switch (static_cast<const QKeyEvent*>(ev)->key()) {
+            case Qt::Key_Escape:
+            case Qt::Key_Enter:
+            case Qt::Key_Return:
+                ev->ignore();
+                return true;
+            default:
+                break;
+            }
+        }
+            break;
+        default:
+            break;
+        }
+    }
+    return QWidget::eventFilter(obj, ev);
+}
+
+// QtColorEditorFactoryPrivate
+
+class QtColorEditorFactoryPrivate : public EditorFactoryPrivate<QtColorEditWidget>
+{
+    QtColorEditorFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtColorEditorFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QColor &value);
+    void slotSetValue(const QColor &value);
+};
+
+void QtColorEditorFactoryPrivate::slotPropertyChanged(QtProperty *property,
+                const QColor &value)
+{
+    const PropertyToEditorListMap::iterator it = m_createdEditors.find(property);
+    if (it == m_createdEditors.end())
+        return;
+    QListIterator<QtColorEditWidget *> itEditor(it.value());
+
+    while (itEditor.hasNext())
+        itEditor.next()->setValue(value);
+}
+
+void QtColorEditorFactoryPrivate::slotSetValue(const QColor &value)
+{
+    QObject *object = q_ptr->sender();
+    const EditorToPropertyMap::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (EditorToPropertyMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtColorPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtColorEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtColorEditorFactory class provides color editing  for
+    properties created by QtColorPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtColorPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtColorEditorFactory::QtColorEditorFactory(QObject *parent) :
+    QtAbstractEditorFactory<QtColorPropertyManager>(parent),
+    d_ptr(new QtColorEditorFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtColorEditorFactory::~QtColorEditorFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtColorEditorFactory::connectPropertyManager(QtColorPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QColor)),
+            this, SLOT(slotPropertyChanged(QtProperty*,QColor)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtColorEditorFactory::createEditor(QtColorPropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+    QtColorEditWidget *editor = d_ptr->createEditor(property, parent);
+    editor->setValue(manager->value(property));
+    connect(editor, SIGNAL(valueChanged(QColor)), this, SLOT(slotSetValue(QColor)));
+    connect(editor, SIGNAL(destroyed(QObject*)), this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtColorEditorFactory::disconnectPropertyManager(QtColorPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QColor)), this, SLOT(slotPropertyChanged(QtProperty*,QColor)));
+}
+
+// QtFontEditWidget
+
+class QtFontEditWidget : public QWidget {
+    Q_OBJECT
+
+public:
+    QtFontEditWidget(QWidget *parent);
+
+    bool eventFilter(QObject *obj, QEvent *ev);
+
+public Q_SLOTS:
+    void setValue(const QFont &value);
+
+private Q_SLOTS:
+    void buttonClicked();
+
+Q_SIGNALS:
+    void valueChanged(const QFont &value);
+
+private:
+    QFont m_font;
+    QLabel *m_pixmapLabel;
+    QLabel *m_label;
+    QToolButton *m_button;
+};
+
+QtFontEditWidget::QtFontEditWidget(QWidget *parent) :
+    QWidget(parent),
+    m_pixmapLabel(new QLabel),
+    m_label(new QLabel),
+    m_button(new QToolButton)
+{
+    QHBoxLayout *lt = new QHBoxLayout(this);
+    setupTreeViewEditorMargin(lt);
+    lt->setSpacing(0);
+    lt->addWidget(m_pixmapLabel);
+    lt->addWidget(m_label);
+    lt->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
+
+    m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored);
+    m_button->setFixedWidth(20);
+    setFocusProxy(m_button);
+    setFocusPolicy(m_button->focusPolicy());
+    m_button->setText(tr("..."));
+    m_button->installEventFilter(this);
+    connect(m_button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
+    lt->addWidget(m_button);
+    m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::fontValuePixmap(m_font));
+    m_label->setText(QtPropertyBrowserUtils::fontValueText(m_font));
+}
+
+void QtFontEditWidget::setValue(const QFont &f)
+{
+    if (m_font != f) {
+        m_font = f;
+        m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::fontValuePixmap(f));
+        m_label->setText(QtPropertyBrowserUtils::fontValueText(f));
+    }
+}
+
+void QtFontEditWidget::buttonClicked()
+{
+    bool ok = false;
+    QFont newFont = QFontDialog::getFont(&ok, m_font, this, tr("Select Font"));
+    if (ok && newFont != m_font) {
+        QFont f = m_font;
+        // prevent mask for unchanged attributes, don't change other attributes (like kerning, etc...)
+        if (m_font.family() != newFont.family())
+            f.setFamily(newFont.family());
+        if (m_font.pointSize() != newFont.pointSize())
+            f.setPointSize(newFont.pointSize());
+        if (m_font.bold() != newFont.bold())
+            f.setBold(newFont.bold());
+        if (m_font.italic() != newFont.italic())
+            f.setItalic(newFont.italic());
+        if (m_font.underline() != newFont.underline())
+            f.setUnderline(newFont.underline());
+        if (m_font.strikeOut() != newFont.strikeOut())
+            f.setStrikeOut(newFont.strikeOut());
+        setValue(f);
+        emit valueChanged(m_font);
+    }
+}
+
+bool QtFontEditWidget::eventFilter(QObject *obj, QEvent *ev)
+{
+    if (obj == m_button) {
+        switch (ev->type()) {
+        case QEvent::KeyPress:
+        case QEvent::KeyRelease: { // Prevent the QToolButton from handling Enter/Escape meant control the delegate
+            switch (static_cast<const QKeyEvent*>(ev)->key()) {
+            case Qt::Key_Escape:
+            case Qt::Key_Enter:
+            case Qt::Key_Return:
+                ev->ignore();
+                return true;
+            default:
+                break;
+            }
+        }
+            break;
+        default:
+            break;
+        }
+    }
+    return QWidget::eventFilter(obj, ev);
+}
+
+// QtFontEditorFactoryPrivate
+
+class QtFontEditorFactoryPrivate : public EditorFactoryPrivate<QtFontEditWidget>
+{
+    QtFontEditorFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtFontEditorFactory)
+public:
+
+    void slotPropertyChanged(QtProperty *property, const QFont &value);
+    void slotSetValue(const QFont &value);
+};
+
+void QtFontEditorFactoryPrivate::slotPropertyChanged(QtProperty *property,
+                const QFont &value)
+{
+    const PropertyToEditorListMap::iterator it = m_createdEditors.find(property);
+    if (it == m_createdEditors.end())
+        return;
+    QListIterator<QtFontEditWidget *> itEditor(it.value());
+
+    while (itEditor.hasNext())
+        itEditor.next()->setValue(value);
+}
+
+void QtFontEditorFactoryPrivate::slotSetValue(const QFont &value)
+{
+    QObject *object = q_ptr->sender();
+    const EditorToPropertyMap::ConstIterator ecend = m_editorToProperty.constEnd();
+    for (EditorToPropertyMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor)
+        if (itEditor.key() == object) {
+            QtProperty *property = itEditor.value();
+            QtFontPropertyManager *manager = q_ptr->propertyManager(property);
+            if (!manager)
+                return;
+            manager->setValue(property, value);
+            return;
+        }
+}
+
+/*!
+    \class QtFontEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtFontEditorFactory class provides font editing for
+    properties created by QtFontPropertyManager objects.
+
+    \sa QtAbstractEditorFactory, QtFontPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtFontEditorFactory::QtFontEditorFactory(QObject *parent) :
+    QtAbstractEditorFactory<QtFontPropertyManager>(parent),
+    d_ptr(new QtFontEditorFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtFontEditorFactory::~QtFontEditorFactory()
+{
+    qDeleteAll(d_ptr->m_editorToProperty.keys());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtFontEditorFactory::connectPropertyManager(QtFontPropertyManager *manager)
+{
+    connect(manager, SIGNAL(valueChanged(QtProperty*,QFont)),
+            this, SLOT(slotPropertyChanged(QtProperty*,QFont)));
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtFontEditorFactory::createEditor(QtFontPropertyManager *manager,
+        QtProperty *property, QWidget *parent)
+{
+    QtFontEditWidget *editor = d_ptr->createEditor(property, parent);
+    editor->setValue(manager->value(property));
+    connect(editor, SIGNAL(valueChanged(QFont)), this, SLOT(slotSetValue(QFont)));
+    connect(editor, SIGNAL(destroyed(QObject*)), this, SLOT(slotEditorDestroyed(QObject*)));
+    return editor;
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtFontEditorFactory::disconnectPropertyManager(QtFontPropertyManager *manager)
+{
+    disconnect(manager, SIGNAL(valueChanged(QtProperty*,QFont)), this, SLOT(slotPropertyChanged(QtProperty*,QFont)));
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qteditorfactory.cpp"
+#include "qteditorfactory.moc"
diff --git a/ThirdParty/GUI/qtpropertybrowser/qteditorfactory.h b/ThirdParty/GUI/qtpropertybrowser/qteditorfactory.h
new file mode 100644
index 0000000..a156378
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qteditorfactory.h
@@ -0,0 +1,389 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTEDITORFACTORY_H
+#define QTEDITORFACTORY_H
+
+#include "qtpropertymanager.h"
+
+QT_BEGIN_NAMESPACE
+
+class QtSpinBoxFactoryPrivate;
+
+class QtSpinBoxFactory : public QtAbstractEditorFactory<QtIntPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtSpinBoxFactory(QObject *parent = 0);
+    virtual ~QtSpinBoxFactory();
+protected:
+    virtual void connectPropertyManager(QtIntPropertyManager *manager);
+    virtual QWidget *createEditor(QtIntPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtIntPropertyManager *manager);
+private:
+    QScopedPointer<QtSpinBoxFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtSpinBoxFactory)
+    Q_DISABLE_COPY(QtSpinBoxFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(int))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtSliderFactoryPrivate;
+
+class QtSliderFactory : public QtAbstractEditorFactory<QtIntPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtSliderFactory(QObject *parent = 0);
+    virtual ~QtSliderFactory();
+protected:
+    virtual void connectPropertyManager(QtIntPropertyManager *manager);
+    QWidget *createEditor(QtIntPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtIntPropertyManager *manager);
+private:
+    QScopedPointer<QtSliderFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtSliderFactory)
+    Q_DISABLE_COPY(QtSliderFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(int))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtScrollBarFactoryPrivate;
+
+class QtScrollBarFactory : public QtAbstractEditorFactory<QtIntPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtScrollBarFactory(QObject *parent = 0);
+    virtual ~QtScrollBarFactory();
+protected:
+    virtual void connectPropertyManager(QtIntPropertyManager *manager);
+    QWidget *createEditor(QtIntPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtIntPropertyManager *manager);
+private:
+    QScopedPointer<QtScrollBarFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtScrollBarFactory)
+    Q_DISABLE_COPY(QtScrollBarFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(int))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtCheckBoxFactoryPrivate;
+
+class QtCheckBoxFactory : public QtAbstractEditorFactory<QtBoolPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtCheckBoxFactory(QObject *parent = 0);
+    virtual ~QtCheckBoxFactory();
+protected:
+    virtual void connectPropertyManager(QtBoolPropertyManager *manager);
+    virtual QWidget *createEditor(QtBoolPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtBoolPropertyManager *manager);
+private:
+    QScopedPointer<QtCheckBoxFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtCheckBoxFactory)
+    Q_DISABLE_COPY(QtCheckBoxFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, bool))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(bool))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtDoubleSpinBoxFactoryPrivate;
+
+class QtDoubleSpinBoxFactory : public QtAbstractEditorFactory<QtDoublePropertyManager>
+{
+    Q_OBJECT
+public:
+    QtDoubleSpinBoxFactory(QObject *parent = 0);
+    virtual ~QtDoubleSpinBoxFactory();
+protected:
+    virtual void connectPropertyManager(QtDoublePropertyManager *manager);
+    virtual QWidget *createEditor(QtDoublePropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtDoublePropertyManager *manager);
+private:
+    QScopedPointer<QtDoubleSpinBoxFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtDoubleSpinBoxFactory)
+    Q_DISABLE_COPY(QtDoubleSpinBoxFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, double))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, double, double))
+    Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, double))
+    Q_PRIVATE_SLOT(d_func(), void slotDecimalsChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(double))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtLineEditFactoryPrivate;
+
+class QtLineEditFactory : public QtAbstractEditorFactory<QtStringPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtLineEditFactory(QObject *parent = 0);
+    virtual ~QtLineEditFactory();
+protected:
+    virtual void connectPropertyManager(QtStringPropertyManager *manager);
+    virtual QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtStringPropertyManager *manager);
+private:
+    QScopedPointer<QtLineEditFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtLineEditFactory)
+    Q_DISABLE_COPY(QtLineEditFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &))
+    Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtDateEditFactoryPrivate;
+
+class QtDateEditFactory : public QtAbstractEditorFactory<QtDatePropertyManager>
+{
+    Q_OBJECT
+public:
+    QtDateEditFactory(QObject *parent = 0);
+    virtual ~QtDateEditFactory();
+protected:
+    virtual void connectPropertyManager(QtDatePropertyManager *manager);
+    virtual QWidget *createEditor(QtDatePropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtDatePropertyManager *manager);
+private:
+    QScopedPointer<QtDateEditFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtDateEditFactory)
+    Q_DISABLE_COPY(QtDateEditFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QDate &))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *,
+                        const QDate &, const QDate &))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QDate &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtTimeEditFactoryPrivate;
+
+class QtTimeEditFactory : public QtAbstractEditorFactory<QtTimePropertyManager>
+{
+    Q_OBJECT
+public:
+    QtTimeEditFactory(QObject *parent = 0);
+    virtual ~QtTimeEditFactory();
+protected:
+    virtual void connectPropertyManager(QtTimePropertyManager *manager);
+    virtual QWidget *createEditor(QtTimePropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtTimePropertyManager *manager);
+private:
+    QScopedPointer<QtTimeEditFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtTimeEditFactory)
+    Q_DISABLE_COPY(QtTimeEditFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QTime &))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QTime &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtDateTimeEditFactoryPrivate;
+
+class QtDateTimeEditFactory : public QtAbstractEditorFactory<QtDateTimePropertyManager>
+{
+    Q_OBJECT
+public:
+    QtDateTimeEditFactory(QObject *parent = 0);
+    virtual ~QtDateTimeEditFactory();
+protected:
+    virtual void connectPropertyManager(QtDateTimePropertyManager *manager);
+    virtual QWidget *createEditor(QtDateTimePropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtDateTimePropertyManager *manager);
+private:
+    QScopedPointer<QtDateTimeEditFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtDateTimeEditFactory)
+    Q_DISABLE_COPY(QtDateTimeEditFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QDateTime &))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QDateTime &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtKeySequenceEditorFactoryPrivate;
+
+class QtKeySequenceEditorFactory : public QtAbstractEditorFactory<QtKeySequencePropertyManager>
+{
+    Q_OBJECT
+public:
+    QtKeySequenceEditorFactory(QObject *parent = 0);
+    virtual ~QtKeySequenceEditorFactory();
+protected:
+    virtual void connectPropertyManager(QtKeySequencePropertyManager *manager);
+    virtual QWidget *createEditor(QtKeySequencePropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtKeySequencePropertyManager *manager);
+private:
+    QScopedPointer<QtKeySequenceEditorFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtKeySequenceEditorFactory)
+    Q_DISABLE_COPY(QtKeySequenceEditorFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QKeySequence &))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QKeySequence &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtCharEditorFactoryPrivate;
+
+class QtCharEditorFactory : public QtAbstractEditorFactory<QtCharPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtCharEditorFactory(QObject *parent = 0);
+    virtual ~QtCharEditorFactory();
+protected:
+    virtual void connectPropertyManager(QtCharPropertyManager *manager);
+    virtual QWidget *createEditor(QtCharPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtCharPropertyManager *manager);
+private:
+    QScopedPointer<QtCharEditorFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtCharEditorFactory)
+    Q_DISABLE_COPY(QtCharEditorFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QChar &))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QChar &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtEnumEditorFactoryPrivate;
+
+class QtEnumEditorFactory : public QtAbstractEditorFactory<QtEnumPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtEnumEditorFactory(QObject *parent = 0);
+    virtual ~QtEnumEditorFactory();
+protected:
+    virtual void connectPropertyManager(QtEnumPropertyManager *manager);
+    virtual QWidget *createEditor(QtEnumPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtEnumPropertyManager *manager);
+private:
+    QScopedPointer<QtEnumEditorFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtEnumEditorFactory)
+    Q_DISABLE_COPY(QtEnumEditorFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotEnumNamesChanged(QtProperty *,
+                        const QStringList &))
+    Q_PRIVATE_SLOT(d_func(), void slotEnumIconsChanged(QtProperty *,
+                        const QMap<int, QIcon> &))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(int))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtCursorEditorFactoryPrivate;
+
+class QtCursorEditorFactory : public QtAbstractEditorFactory<QtCursorPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtCursorEditorFactory(QObject *parent = 0);
+    virtual ~QtCursorEditorFactory();
+protected:
+    virtual void connectPropertyManager(QtCursorPropertyManager *manager);
+    virtual QWidget *createEditor(QtCursorPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtCursorPropertyManager *manager);
+private:
+    QScopedPointer<QtCursorEditorFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtCursorEditorFactory)
+    Q_DISABLE_COPY(QtCursorEditorFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QCursor &))
+    Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+};
+
+class QtColorEditorFactoryPrivate;
+
+class QtColorEditorFactory : public QtAbstractEditorFactory<QtColorPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtColorEditorFactory(QObject *parent = 0);
+    virtual ~QtColorEditorFactory();
+protected:
+    virtual void connectPropertyManager(QtColorPropertyManager *manager);
+    virtual QWidget *createEditor(QtColorPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtColorPropertyManager *manager);
+private:
+    QScopedPointer<QtColorEditorFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtColorEditorFactory)
+    Q_DISABLE_COPY(QtColorEditorFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QColor &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QColor &))
+};
+
+class QtFontEditorFactoryPrivate;
+
+class QtFontEditorFactory : public QtAbstractEditorFactory<QtFontPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtFontEditorFactory(QObject *parent = 0);
+    virtual ~QtFontEditorFactory();
+protected:
+    virtual void connectPropertyManager(QtFontPropertyManager *manager);
+    virtual QWidget *createEditor(QtFontPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtFontPropertyManager *manager);
+private:
+    QScopedPointer<QtFontEditorFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtFontEditorFactory)
+    Q_DISABLE_COPY(QtFontEditorFactory)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QFont &))
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *))
+    Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QFont &))
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtgroupboxpropertybrowser.cpp b/ThirdParty/GUI/qtpropertybrowser/qtgroupboxpropertybrowser.cpp
new file mode 100644
index 0000000..a8f43ad
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtgroupboxpropertybrowser.cpp
@@ -0,0 +1,521 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtgroupboxpropertybrowser.h"
+#include <QtCore/QSet>
+#include <QtWidgets/QGridLayout>
+#include <QtWidgets/QLabel>
+#include <QtWidgets/QGroupBox>
+#include <QtCore/QTimer>
+#include <QtCore/QMap>
+
+QT_BEGIN_NAMESPACE
+
+class QtGroupBoxPropertyBrowserPrivate
+{
+    QtGroupBoxPropertyBrowser *q_ptr;
+    Q_DECLARE_PUBLIC(QtGroupBoxPropertyBrowser)
+public:
+
+    void init(QWidget *parent);
+
+    void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex);
+    void propertyRemoved(QtBrowserItem *index);
+    void propertyChanged(QtBrowserItem *index);
+    QWidget *createEditor(QtProperty *property, QWidget *parent) const
+        { return q_ptr->createEditor(property, parent); }
+
+    void slotEditorDestroyed();
+    void slotUpdate();
+
+    struct WidgetItem
+    {
+        WidgetItem() : widget(0), label(0), widgetLabel(0),
+                groupBox(0), layout(0), line(0), parent(0) { }
+        QWidget *widget; // can be null
+        QLabel *label;
+        QLabel *widgetLabel;
+        QGroupBox *groupBox;
+        QGridLayout *layout;
+        QFrame *line;
+        WidgetItem *parent;
+        QList<WidgetItem *> children;
+    };
+private:
+    void updateLater();
+    void updateItem(WidgetItem *item);
+    void insertRow(QGridLayout *layout, int row) const;
+    void removeRow(QGridLayout *layout, int row) const;
+
+    bool hasHeader(WidgetItem *item) const;
+
+    QMap<QtBrowserItem *, WidgetItem *> m_indexToItem;
+    QMap<WidgetItem *, QtBrowserItem *> m_itemToIndex;
+    QMap<QWidget *, WidgetItem *> m_widgetToItem;
+    QGridLayout *m_mainLayout;
+    QList<WidgetItem *> m_children;
+    QList<WidgetItem *> m_recreateQueue;
+};
+
+void QtGroupBoxPropertyBrowserPrivate::init(QWidget *parent)
+{
+    m_mainLayout = new QGridLayout();
+    parent->setLayout(m_mainLayout);
+    QLayoutItem *item = new QSpacerItem(0, 0,
+                QSizePolicy::Fixed, QSizePolicy::Expanding);
+    m_mainLayout->addItem(item, 0, 0);
+}
+
+void QtGroupBoxPropertyBrowserPrivate::slotEditorDestroyed()
+{
+    QWidget *editor = qobject_cast<QWidget *>(q_ptr->sender());
+    if (!editor)
+        return;
+    if (!m_widgetToItem.contains(editor))
+        return;
+    m_widgetToItem[editor]->widget = 0;
+    m_widgetToItem.remove(editor);
+}
+
+void QtGroupBoxPropertyBrowserPrivate::slotUpdate()
+{
+    QListIterator<WidgetItem *> itItem(m_recreateQueue);
+    while (itItem.hasNext()) {
+        WidgetItem *item = itItem.next();
+
+        WidgetItem *par = item->parent;
+        QWidget *w = 0;
+        QGridLayout *l = 0;
+        int oldRow = -1;
+        if (!par) {
+            w = q_ptr;
+            l = m_mainLayout;
+            oldRow = m_children.indexOf(item);
+        } else {
+            w = par->groupBox;
+            l = par->layout;
+            oldRow = par->children.indexOf(item);
+            if (hasHeader(par))
+                oldRow += 2;
+        }
+
+        if (item->widget) {
+            item->widget->setParent(w);
+        } else if (item->widgetLabel) {
+            item->widgetLabel->setParent(w);
+        } else {
+            item->widgetLabel = new QLabel(w);
+        }
+        int span = 1;
+        if (item->widget)
+            l->addWidget(item->widget, oldRow, 1, 1, 1);
+        else if (item->widgetLabel)
+            l->addWidget(item->widgetLabel, oldRow, 1, 1, 1);
+        else
+            span = 2;
+        item->label = new QLabel(w);
+        item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+        l->addWidget(item->label, oldRow, 0, 1, span);
+
+        updateItem(item);
+    }
+    m_recreateQueue.clear();
+}
+
+void QtGroupBoxPropertyBrowserPrivate::updateLater()
+{
+    QTimer::singleShot(0, q_ptr, SLOT(slotUpdate()));
+}
+
+void QtGroupBoxPropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex)
+{
+    WidgetItem *afterItem = m_indexToItem.value(afterIndex);
+    WidgetItem *parentItem = m_indexToItem.value(index->parent());
+
+    WidgetItem *newItem = new WidgetItem();
+    newItem->parent = parentItem;
+
+    QGridLayout *layout = 0;
+    QWidget *parentWidget = 0;
+    int row = -1;
+    if (!afterItem) {
+        row = 0;
+        if (parentItem)
+            parentItem->children.insert(0, newItem);
+        else
+            m_children.insert(0, newItem);
+    } else {
+        if (parentItem) {
+            row = parentItem->children.indexOf(afterItem) + 1;
+            parentItem->children.insert(row, newItem);
+        } else {
+            row = m_children.indexOf(afterItem) + 1;
+            m_children.insert(row, newItem);
+        }
+    }
+    if (parentItem && hasHeader(parentItem))
+        row += 2;
+
+    if (!parentItem) {
+        layout = m_mainLayout;
+        parentWidget = q_ptr;;
+    } else {
+        if (!parentItem->groupBox) {
+            m_recreateQueue.removeAll(parentItem);
+            WidgetItem *par = parentItem->parent;
+            QWidget *w = 0;
+            QGridLayout *l = 0;
+            int oldRow = -1;
+            if (!par) {
+                w = q_ptr;
+                l = m_mainLayout;
+                oldRow = m_children.indexOf(parentItem);
+            } else {
+                w = par->groupBox;
+                l = par->layout;
+                oldRow = par->children.indexOf(parentItem);
+                if (hasHeader(par))
+                    oldRow += 2;
+            }
+            parentItem->groupBox = new QGroupBox(w);
+            parentItem->layout = new QGridLayout();
+            parentItem->groupBox->setLayout(parentItem->layout);
+            if (parentItem->label) {
+                l->removeWidget(parentItem->label);
+                delete parentItem->label;
+                parentItem->label = 0;
+            }
+            if (parentItem->widget) {
+                l->removeWidget(parentItem->widget);
+                parentItem->widget->setParent(parentItem->groupBox);
+                parentItem->layout->addWidget(parentItem->widget, 0, 0, 1, 2);
+                parentItem->line = new QFrame(parentItem->groupBox);
+                // g.p. 18.02.2015 AwesomePropertyEditor Bedurf
+                parentItem->widget->show();
+            } else if (parentItem->widgetLabel) {
+                l->removeWidget(parentItem->widgetLabel);
+                delete parentItem->widgetLabel;
+                parentItem->widgetLabel = 0;
+            }
+            if (parentItem->line) {
+                parentItem->line->setFrameShape(QFrame::HLine);
+                parentItem->line->setFrameShadow(QFrame::Sunken);
+                parentItem->layout->addWidget(parentItem->line, 1, 0, 1, 2);
+            }
+            l->addWidget(parentItem->groupBox, oldRow, 0, 1, 2);
+            updateItem(parentItem);
+        }
+        layout = parentItem->layout;
+        parentWidget = parentItem->groupBox;
+    }
+
+    newItem->label = new QLabel(parentWidget);
+    newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+    newItem->widget = createEditor(index->property(), parentWidget);
+    if (!newItem->widget) {
+        newItem->widgetLabel = new QLabel(parentWidget);
+    } else {
+        QObject::connect(newItem->widget, SIGNAL(destroyed()), q_ptr, SLOT(slotEditorDestroyed()));
+        m_widgetToItem[newItem->widget] = newItem;
+    }
+
+    insertRow(layout, row);
+    int span = 1;
+    if (newItem->widget)
+        layout->addWidget(newItem->widget, row, 1);
+    else if (newItem->widgetLabel)
+        layout->addWidget(newItem->widgetLabel, row, 1);
+    else
+        span = 2;
+    layout->addWidget(newItem->label, row, 0, 1, span);
+
+    m_itemToIndex[newItem] = index;
+    m_indexToItem[index] = newItem;
+
+    updateItem(newItem);
+}
+
+void QtGroupBoxPropertyBrowserPrivate::propertyRemoved(QtBrowserItem *index)
+{
+    WidgetItem *item = m_indexToItem.value(index);
+
+    m_indexToItem.remove(index);
+    m_itemToIndex.remove(item);
+
+    WidgetItem *parentItem = item->parent;
+
+    int row = -1;
+
+    if (parentItem) {
+        row = parentItem->children.indexOf(item);
+        parentItem->children.removeAt(row);
+        if (hasHeader(parentItem))
+            row += 2;
+    } else {
+        row = m_children.indexOf(item);
+        m_children.removeAt(row);
+    }
+
+    if (item->widget)
+        delete item->widget;
+    if (item->label)
+        delete item->label;
+    if (item->widgetLabel)
+        delete item->widgetLabel;
+    if (item->groupBox)
+        delete item->groupBox;
+
+    if (!parentItem) {
+        removeRow(m_mainLayout, row);
+    } else if (parentItem->children.count() != 0) {
+        removeRow(parentItem->layout, row);
+    } else {
+        WidgetItem *par = parentItem->parent;
+        QGridLayout *l = 0;
+        int oldRow = -1;
+        if (!par) {
+            l = m_mainLayout;
+            oldRow = m_children.indexOf(parentItem);
+        } else {
+            l = par->layout;
+            oldRow = par->children.indexOf(parentItem);
+            if (hasHeader(par))
+                oldRow += 2;
+        }
+
+        if (parentItem->widget) {
+            // g.p. 18.02.2015 AwesomePropertyEditor Bedurf
+            //parentItem->widget->hide();
+            parentItem->widget->setParent(0);
+        } else if (parentItem->widgetLabel) {
+            parentItem->widgetLabel->hide();
+            parentItem->widgetLabel->setParent(0);
+        } else {
+            //parentItem->widgetLabel = new QLabel(w);
+        }
+        l->removeWidget(parentItem->groupBox);
+        delete parentItem->groupBox;
+        parentItem->groupBox = 0;
+        parentItem->line = 0;
+        parentItem->layout = 0;
+        if (!m_recreateQueue.contains(parentItem))
+            m_recreateQueue.append(parentItem);
+        updateLater();
+    }
+    m_recreateQueue.removeAll(item);
+
+    delete item;
+}
+
+void QtGroupBoxPropertyBrowserPrivate::insertRow(QGridLayout *layout, int row) const
+{
+    QMap<QLayoutItem *, QRect> itemToPos;
+    int idx = 0;
+    while (idx < layout->count()) {
+        int r, c, rs, cs;
+        layout->getItemPosition(idx, &r, &c, &rs, &cs);
+        if (r >= row) {
+            itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs);
+        } else {
+            idx++;
+        }
+    }
+
+    const QMap<QLayoutItem *, QRect>::ConstIterator icend = itemToPos.constEnd();
+    for (QMap<QLayoutItem *, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) {
+        const QRect r = it.value();
+        layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
+    }
+}
+
+void QtGroupBoxPropertyBrowserPrivate::removeRow(QGridLayout *layout, int row) const
+{
+    QMap<QLayoutItem *, QRect> itemToPos;
+    int idx = 0;
+    while (idx < layout->count()) {
+        int r, c, rs, cs;
+        layout->getItemPosition(idx, &r, &c, &rs, &cs);
+        if (r > row) {
+            itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs);
+        } else {
+            idx++;
+        }
+    }
+
+    const QMap<QLayoutItem *, QRect>::ConstIterator icend = itemToPos.constEnd();
+    for (QMap<QLayoutItem *, QRect>::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) {
+        const QRect r = it.value();
+        layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height());
+    }
+}
+
+bool QtGroupBoxPropertyBrowserPrivate::hasHeader(WidgetItem *item) const
+{
+    if (item->widget)
+        return true;
+    return false;
+}
+
+void QtGroupBoxPropertyBrowserPrivate::propertyChanged(QtBrowserItem *index)
+{
+    WidgetItem *item = m_indexToItem.value(index);
+
+    updateItem(item);
+}
+
+void QtGroupBoxPropertyBrowserPrivate::updateItem(WidgetItem *item)
+{
+    QtProperty *property = m_itemToIndex[item]->property();
+    if (item->groupBox) {
+        QFont font = item->groupBox->font();
+        font.setUnderline(property->isModified());
+        item->groupBox->setFont(font);
+        item->groupBox->setTitle(property->propertyName());
+        item->groupBox->setToolTip(property->toolTip());
+        item->groupBox->setStatusTip(property->statusTip());
+        item->groupBox->setWhatsThis(property->whatsThis());
+        item->groupBox->setEnabled(property->isEnabled());
+    }
+    if (item->label) {
+        QFont font = item->label->font();
+        font.setUnderline(property->isModified());
+        item->label->setFont(font);
+        item->label->setText(property->propertyName());
+        item->label->setToolTip(property->toolTip());
+        item->label->setStatusTip(property->statusTip());
+        item->label->setWhatsThis(property->whatsThis());
+        item->label->setEnabled(property->isEnabled());
+    }
+    if (item->widgetLabel) {
+        QFont font = item->widgetLabel->font();
+        font.setUnderline(false);
+        item->widgetLabel->setFont(font);
+        item->widgetLabel->setText(property->valueText());
+        item->widgetLabel->setEnabled(property->isEnabled());
+    }
+    if (item->widget) {
+        QFont font = item->widget->font();
+        font.setUnderline(false);
+        item->widget->setFont(font);
+        item->widget->setEnabled(property->isEnabled());
+        item->widget->setToolTip(property->valueText());
+    }
+    //item->setIcon(1, property->valueIcon());
+}
+
+
+
+/*!
+    \class QtGroupBoxPropertyBrowser
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtGroupBoxPropertyBrowser class provides a QGroupBox
+    based property browser.
+
+    A property browser is a widget that enables the user to edit a
+    given set of properties. Each property is represented by a label
+    specifying the property's name, and an editing widget (e.g. a line
+    edit or a combobox) holding its value. A property can have zero or
+    more subproperties.
+
+    QtGroupBoxPropertyBrowser provides group boxes for all nested
+    properties, i.e. subproperties are enclosed by a group box with
+    the parent property's name as its title. For example:
+
+    \image qtgroupboxpropertybrowser.png
+
+    Use the QtAbstractPropertyBrowser API to add, insert and remove
+    properties from an instance of the QtGroupBoxPropertyBrowser
+    class. The properties themselves are created and managed by
+    implementations of the QtAbstractPropertyManager class.
+
+    \sa QtTreePropertyBrowser, QtAbstractPropertyBrowser
+*/
+
+/*!
+    Creates a property browser with the given \a parent.
+*/
+QtGroupBoxPropertyBrowser::QtGroupBoxPropertyBrowser(QWidget *parent)
+    : QtAbstractPropertyBrowser(parent), d_ptr(new QtGroupBoxPropertyBrowserPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->init(this);
+}
+
+/*!
+    Destroys this property browser.
+
+    Note that the properties that were inserted into this browser are
+    \e not destroyed since they may still be used in other
+    browsers. The properties are owned by the manager that created
+    them.
+
+    \sa QtProperty, QtAbstractPropertyManager
+*/
+QtGroupBoxPropertyBrowser::~QtGroupBoxPropertyBrowser()
+{
+    const QMap<QtGroupBoxPropertyBrowserPrivate::WidgetItem *, QtBrowserItem *>::ConstIterator icend = d_ptr->m_itemToIndex.constEnd();
+    for (QMap<QtGroupBoxPropertyBrowserPrivate::WidgetItem *, QtBrowserItem *>::ConstIterator it = d_ptr->m_itemToIndex.constBegin(); it != icend; ++it)
+        delete it.key();
+}
+
+/*!
+    \reimp
+*/
+void QtGroupBoxPropertyBrowser::itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem)
+{
+    d_ptr->propertyInserted(item, afterItem);
+}
+
+/*!
+    \reimp
+*/
+void QtGroupBoxPropertyBrowser::itemRemoved(QtBrowserItem *item)
+{
+    d_ptr->propertyRemoved(item);
+}
+
+/*!
+    \reimp
+*/
+void QtGroupBoxPropertyBrowser::itemChanged(QtBrowserItem *item)
+{
+    d_ptr->propertyChanged(item);
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qtgroupboxpropertybrowser.cpp"
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtgroupboxpropertybrowser.h b/ThirdParty/GUI/qtpropertybrowser/qtgroupboxpropertybrowser.h
new file mode 100644
index 0000000..f4ac0ed
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtgroupboxpropertybrowser.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTGROUPBOXPROPERTYBROWSER_H
+#define QTGROUPBOXPROPERTYBROWSER_H
+
+#include "qtpropertybrowser.h"
+
+QT_BEGIN_NAMESPACE
+
+class QtGroupBoxPropertyBrowserPrivate;
+
+class QtGroupBoxPropertyBrowser : public QtAbstractPropertyBrowser
+{
+    Q_OBJECT
+
+public:
+    QtGroupBoxPropertyBrowser(QWidget *parent = 0);
+    virtual ~QtGroupBoxPropertyBrowser();
+
+protected:
+    virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem);
+    virtual void itemRemoved(QtBrowserItem *item);
+    virtual void itemChanged(QtBrowserItem *item);
+
+private:
+    QScopedPointer<QtGroupBoxPropertyBrowserPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtGroupBoxPropertyBrowser)
+    Q_DISABLE_COPY(QtGroupBoxPropertyBrowser)
+    Q_PRIVATE_SLOT(d_func(), void slotUpdate())
+    Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed())
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.cpp b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.cpp
new file mode 100644
index 0000000..76246d1
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.cpp
@@ -0,0 +1,1951 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtpropertybrowser.h"
+#include <QtCore/QSet>
+#include <QtCore/QMap>
+#include <QtGui/QIcon>
+
+#if defined(Q_CC_MSVC)
+#    pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QtPropertyPrivate
+{
+public:
+    QtPropertyPrivate(QtAbstractPropertyManager *manager) : m_enabled(true), m_modified(false), m_manager(manager) {}
+    QtProperty *q_ptr;
+
+    QSet<QtProperty *> m_parentItems;
+    QList<QtProperty *> m_subItems;
+
+    QString m_toolTip;
+    QString m_statusTip;
+    QString m_whatsThis;
+    QString m_name;
+    bool m_enabled;
+    bool m_modified;
+
+    QtAbstractPropertyManager * const m_manager;
+};
+
+class QtAbstractPropertyManagerPrivate
+{
+    QtAbstractPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtAbstractPropertyManager)
+public:
+    void propertyDestroyed(QtProperty *property);
+    void propertyChanged(QtProperty *property) const;
+    void propertyRemoved(QtProperty *property,
+                QtProperty *parentProperty) const;
+    void propertyInserted(QtProperty *property, QtProperty *parentProperty,
+                QtProperty *afterProperty) const;
+
+    QSet<QtProperty *> m_properties;
+};
+
+/*!
+    \class QtProperty
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtProperty class encapsulates an instance of a property.
+
+    Properties are created by objects of QtAbstractPropertyManager
+    subclasses; a manager can create properties of a given type, and
+    is used in conjunction with the QtAbstractPropertyBrowser class. A
+    property is always owned by the manager that created it, which can
+    be retrieved using the propertyManager() function.
+
+    QtProperty contains the most common property attributes, and
+    provides functions for retrieving as well as setting their values:
+
+    \table
+    \header \li Getter \li Setter
+    \row
+    \li propertyName() \li setPropertyName()
+    \row
+    \li statusTip() \li setStatusTip()
+    \row
+    \li toolTip() \li setToolTip()
+    \row
+    \li whatsThis() \li setWhatsThis()
+    \row
+    \li isEnabled() \li setEnabled()
+    \row
+    \li isModified() \li setModified()
+    \row
+    \li valueText() \li Nop
+    \row
+    \li valueIcon() \li Nop
+    \endtable
+
+    It is also possible to nest properties: QtProperty provides the
+    addSubProperty(), insertSubProperty() and removeSubProperty() functions to
+    manipulate the set of subproperties. Use the subProperties()
+    function to retrieve a property's current set of subproperties.
+    Note that nested properties are not owned by the parent property,
+    i.e. each subproperty is owned by the manager that created it.
+
+    \sa QtAbstractPropertyManager, QtBrowserItem
+*/
+
+/*!
+    Creates a property with the given \a manager.
+
+    This constructor is only useful when creating a custom QtProperty
+    subclass (e.g. QtVariantProperty). To create a regular QtProperty
+    object, use the QtAbstractPropertyManager::addProperty()
+    function instead.
+
+    \sa QtAbstractPropertyManager::addProperty()
+*/
+QtProperty::QtProperty(QtAbstractPropertyManager *manager)
+    : d_ptr(new QtPropertyPrivate(manager))
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this property.
+
+    Note that subproperties are detached but not destroyed, i.e. they
+    can still be used in another context.
+
+    \sa QtAbstractPropertyManager::clear()
+
+*/
+QtProperty::~QtProperty()
+{
+    QSetIterator<QtProperty *> itParent(d_ptr->m_parentItems);
+    while (itParent.hasNext()) {
+        QtProperty *property = itParent.next();
+        property->d_ptr->m_manager->d_ptr->propertyRemoved(this, property);
+    }
+
+    d_ptr->m_manager->d_ptr->propertyDestroyed(this);
+
+    QListIterator<QtProperty *> itChild(d_ptr->m_subItems);
+    while (itChild.hasNext()) {
+        QtProperty *property = itChild.next();
+        property->d_ptr->m_parentItems.remove(this);
+    }
+
+    itParent.toFront();
+    while (itParent.hasNext()) {
+        QtProperty *property = itParent.next();
+        property->d_ptr->m_subItems.removeAll(this);
+    }
+}
+
+/*!
+    Returns the set of subproperties.
+
+    Note that subproperties are not owned by \e this property, but by
+    the manager that created them.
+
+    \sa insertSubProperty(), removeSubProperty()
+*/
+QList<QtProperty *> QtProperty::subProperties() const
+{
+    return d_ptr->m_subItems;
+}
+
+/*!
+    Returns a pointer to the manager that owns this property.
+*/
+QtAbstractPropertyManager *QtProperty::propertyManager() const
+{
+    return d_ptr->m_manager;
+}
+
+/*!
+    Returns the property's  tool tip.
+
+    \sa setToolTip()
+*/
+QString QtProperty::toolTip() const
+{
+    return d_ptr->m_toolTip;
+}
+
+/*!
+    Returns the property's status tip.
+
+    \sa setStatusTip()
+*/
+QString QtProperty::statusTip() const
+{
+    return d_ptr->m_statusTip;
+}
+
+/*!
+    Returns the property's "What's This" help text.
+
+    \sa setWhatsThis()
+*/
+QString QtProperty::whatsThis() const
+{
+    return d_ptr->m_whatsThis;
+}
+
+/*!
+    Returns the property's name.
+
+    \sa setPropertyName()
+*/
+QString QtProperty::propertyName() const
+{
+    return d_ptr->m_name;
+}
+
+/*!
+    Returns whether the property is enabled.
+
+    \sa setEnabled()
+*/
+bool QtProperty::isEnabled() const
+{
+    return d_ptr->m_enabled;
+}
+
+/*!
+    Returns whether the property is modified.
+
+    \sa setModified()
+*/
+bool QtProperty::isModified() const
+{
+    return d_ptr->m_modified;
+}
+
+/*!
+    Returns whether the property has a value.
+
+    \sa QtAbstractPropertyManager::hasValue()
+*/
+bool QtProperty::hasValue() const
+{
+    return d_ptr->m_manager->hasValue(this);
+}
+
+/*!
+    Returns an icon representing the current state of this property.
+
+    If the given property type can not generate such an icon, this
+    function returns an invalid icon.
+
+    \sa QtAbstractPropertyManager::valueIcon()
+*/
+QIcon QtProperty::valueIcon() const
+{
+    return d_ptr->m_manager->valueIcon(this);
+}
+
+/*!
+    Returns a string representing the current state of this property.
+
+    If the given property type can not generate such a string, this
+    function returns an empty string.
+
+    \sa QtAbstractPropertyManager::valueText()
+*/
+QString QtProperty::valueText() const
+{
+    return d_ptr->m_manager->valueText(this);
+}
+
+/*!
+    Sets the property's tool tip to the given \a text.
+
+    \sa toolTip()
+*/
+void QtProperty::setToolTip(const QString &text)
+{
+    if (d_ptr->m_toolTip == text)
+        return;
+
+    d_ptr->m_toolTip = text;
+    propertyChanged();
+}
+
+/*!
+    Sets the property's status tip to the given \a text.
+
+    \sa statusTip()
+*/
+void QtProperty::setStatusTip(const QString &text)
+{
+    if (d_ptr->m_statusTip == text)
+        return;
+
+    d_ptr->m_statusTip = text;
+    propertyChanged();
+}
+
+/*!
+    Sets the property's "What's This" help text to the given \a text.
+
+    \sa whatsThis()
+*/
+void QtProperty::setWhatsThis(const QString &text)
+{
+    if (d_ptr->m_whatsThis == text)
+        return;
+
+    d_ptr->m_whatsThis = text;
+    propertyChanged();
+}
+
+/*!
+    \fn void QtProperty::setPropertyName(const QString &name)
+
+    Sets the property's  name to the given \a name.
+
+    \sa propertyName()
+*/
+void QtProperty::setPropertyName(const QString &text)
+{
+    if (d_ptr->m_name == text)
+        return;
+
+    d_ptr->m_name = text;
+    propertyChanged();
+}
+
+/*!
+    Enables or disables the property according to the passed \a enable value.
+
+    \sa isEnabled()
+*/
+void QtProperty::setEnabled(bool enable)
+{
+    if (d_ptr->m_enabled == enable)
+        return;
+
+    d_ptr->m_enabled = enable;
+    propertyChanged();
+}
+
+/*!
+    Sets the property's modified state according to the passed \a modified value.
+
+    \sa isModified()
+*/
+void QtProperty::setModified(bool modified)
+{
+    if (d_ptr->m_modified == modified)
+        return;
+
+    d_ptr->m_modified = modified;
+    propertyChanged();
+}
+
+/*!
+    Appends the given \a property to this property's subproperties.
+
+    If the given \a property already is added, this function does
+    nothing.
+
+    \sa insertSubProperty(), removeSubProperty()
+*/
+void QtProperty::addSubProperty(QtProperty *property)
+{
+    QtProperty *after = 0;
+    if (d_ptr->m_subItems.count() > 0)
+        after = d_ptr->m_subItems.last();
+    insertSubProperty(property, after);
+}
+
+/*!
+    \fn void QtProperty::insertSubProperty(QtProperty *property, QtProperty *precedingProperty)
+
+    Inserts the given \a property after the specified \a
+    precedingProperty into this property's list of subproperties.  If
+    \a precedingProperty is 0, the specified \a property is inserted
+    at the beginning of the list.
+
+    If the given \a property already is inserted, this function does
+    nothing.
+
+    \sa addSubProperty(), removeSubProperty()
+*/
+void QtProperty::insertSubProperty(QtProperty *property,
+            QtProperty *afterProperty)
+{
+    if (!property)
+        return;
+
+    if (property == this)
+        return;
+
+    // traverse all children of item. if this item is a child of item then cannot add.
+    QList<QtProperty *> pendingList = property->subProperties();
+    QMap<QtProperty *, bool> visited;
+    while (!pendingList.isEmpty()) {
+        QtProperty *i = pendingList.first();
+        if (i == this)
+            return;
+        pendingList.removeFirst();
+        if (visited.contains(i))
+            continue;
+        visited[i] = true;
+        pendingList += i->subProperties();
+    }
+
+    pendingList = subProperties();
+    int pos = 0;
+    int newPos = 0;
+    QtProperty *properAfterProperty = 0;
+    while (pos < pendingList.count()) {
+        QtProperty *i = pendingList.at(pos);
+        if (i == property)
+            return; // if item is already inserted in this item then cannot add.
+        if (i == afterProperty) {
+            newPos = pos + 1;
+            properAfterProperty = afterProperty;
+        }
+        pos++;
+    }
+
+    d_ptr->m_subItems.insert(newPos, property);
+    property->d_ptr->m_parentItems.insert(this);
+
+    d_ptr->m_manager->d_ptr->propertyInserted(property, this, properAfterProperty);
+}
+
+/*!
+    Removes the given \a property from the list of subproperties
+    without deleting it.
+
+    \sa addSubProperty(), insertSubProperty()
+*/
+void QtProperty::removeSubProperty(QtProperty *property)
+{
+    if (!property)
+        return;
+
+    d_ptr->m_manager->d_ptr->propertyRemoved(property, this);
+
+    QList<QtProperty *> pendingList = subProperties();
+    int pos = 0;
+    while (pos < pendingList.count()) {
+        if (pendingList.at(pos) == property) {
+            d_ptr->m_subItems.removeAt(pos);
+            property->d_ptr->m_parentItems.remove(this);
+
+            return;
+        }
+        pos++;
+    }
+}
+
+/*!
+    \internal
+*/
+void QtProperty::propertyChanged()
+{
+    d_ptr->m_manager->d_ptr->propertyChanged(this);
+}
+
+////////////////////////////////
+
+void QtAbstractPropertyManagerPrivate::propertyDestroyed(QtProperty *property)
+{
+    if (m_properties.contains(property)) {
+        emit q_ptr->propertyDestroyed(property);
+        q_ptr->uninitializeProperty(property);
+        m_properties.remove(property);
+    }
+}
+
+void QtAbstractPropertyManagerPrivate::propertyChanged(QtProperty *property) const
+{
+    emit q_ptr->propertyChanged(property);
+}
+
+void QtAbstractPropertyManagerPrivate::propertyRemoved(QtProperty *property,
+            QtProperty *parentProperty) const
+{
+    emit q_ptr->propertyRemoved(property, parentProperty);
+}
+
+void QtAbstractPropertyManagerPrivate::propertyInserted(QtProperty *property,
+            QtProperty *parentProperty, QtProperty *afterProperty) const
+{
+    emit q_ptr->propertyInserted(property, parentProperty, afterProperty);
+}
+
+/*!
+    \class QtAbstractPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtAbstractPropertyManager provides an interface for
+    property managers.
+
+    A manager can create and manage properties of a given type, and is
+    used in conjunction with the QtAbstractPropertyBrowser class.
+
+    When using a property browser widget, the properties are created
+    and managed by implementations of the QtAbstractPropertyManager
+    class. To ensure that the properties' values will be displayed
+    using suitable editing widgets, the managers are associated with
+    objects of QtAbstractEditorFactory subclasses. The property browser
+    will use these associations to determine which factories it should
+    use to create the preferred editing widgets.
+
+    The QtAbstractPropertyManager class provides common functionality
+    like creating a property using the addProperty() function, and
+    retrieving the properties created by the manager using the
+    properties() function. The class also provides signals that are
+    emitted when the manager's properties change: propertyInserted(),
+    propertyRemoved(), propertyChanged() and propertyDestroyed().
+
+    QtAbstractPropertyManager subclasses are supposed to provide their
+    own type specific API. Note that several ready-made
+    implementations are available:
+
+    \list
+    \li QtBoolPropertyManager
+    \li QtColorPropertyManager
+    \li QtDatePropertyManager
+    \li QtDateTimePropertyManager
+    \li QtDoublePropertyManager
+    \li QtEnumPropertyManager
+    \li QtFlagPropertyManager
+    \li QtFontPropertyManager
+    \li QtGroupPropertyManager
+    \li QtIntPropertyManager
+    \li QtPointPropertyManager
+    \li QtRectPropertyManager
+    \li QtSizePropertyManager
+    \li QtSizePolicyPropertyManager
+    \li QtStringPropertyManager
+    \li QtTimePropertyManager
+    \li QtVariantPropertyManager
+    \endlist
+
+    \sa QtAbstractEditorFactoryBase, QtAbstractPropertyBrowser, QtProperty
+*/
+
+/*!
+    \fn void QtAbstractPropertyManager::propertyInserted(QtProperty *newProperty,
+                QtProperty *parentProperty, QtProperty *precedingProperty)
+
+    This signal is emitted when a new subproperty is inserted into an
+    existing property, passing pointers to the \a newProperty, \a
+    parentProperty and \a precedingProperty as parameters.
+
+    If \a precedingProperty is 0, the \a newProperty was inserted at
+    the beginning of the \a parentProperty's subproperties list.
+
+    Note that signal is emitted only if the \a parentProperty is created
+    by this manager.
+
+    \sa QtAbstractPropertyBrowser::itemInserted()
+*/
+
+/*!
+    \fn void QtAbstractPropertyManager::propertyChanged(QtProperty *property)
+
+    This signal is emitted whenever a property's data changes, passing
+    a pointer to the \a property as parameter.
+
+    Note that signal is only emitted for properties that are created by
+    this manager.
+
+    \sa QtAbstractPropertyBrowser::itemChanged()
+*/
+
+/*!
+    \fn void QtAbstractPropertyManager::propertyRemoved(QtProperty *property, QtProperty *parent)
+
+    This signal is emitted when a subproperty is removed, passing
+    pointers to the removed \a property and the \a parent property as
+    parameters.
+
+    Note that signal is emitted only when the \a parent property is
+    created by this manager.
+
+    \sa QtAbstractPropertyBrowser::itemRemoved()
+*/
+
+/*!
+    \fn void QtAbstractPropertyManager::propertyDestroyed(QtProperty *property)
+
+    This signal is emitted when the specified \a property is about to
+    be destroyed.
+
+    Note that signal is only emitted for properties that are created
+    by this manager.
+
+    \sa clear(), uninitializeProperty()
+*/
+
+/*!
+    \fn void QtAbstractPropertyBrowser::currentItemChanged(QtBrowserItem *current)
+
+    This signal is emitted when the current item changes. The current item is specified by \a current.
+
+    \sa QtAbstractPropertyBrowser::setCurrentItem()
+*/
+
+/*!
+    Creates an abstract property manager with the given \a parent.
+*/
+QtAbstractPropertyManager::QtAbstractPropertyManager(QObject *parent)
+    : QObject(parent), d_ptr(new QtAbstractPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys the manager. All properties created by the manager are
+    destroyed.
+*/
+QtAbstractPropertyManager::~QtAbstractPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Destroys all the properties that this manager has created.
+
+    \sa propertyDestroyed(), uninitializeProperty()
+*/
+void QtAbstractPropertyManager::clear() const
+{
+    while (!properties().isEmpty()) {
+        QSetIterator<QtProperty *> itProperty(properties());
+        QtProperty *prop = itProperty.next();
+        delete prop;
+    }
+}
+
+/*!
+    Returns the set of properties created by this manager.
+
+    \sa addProperty()
+*/
+QSet<QtProperty *> QtAbstractPropertyManager::properties() const
+{
+    return d_ptr->m_properties;
+}
+
+/*!
+    Returns whether the given \a property has a value.
+
+    The default implementation of this function returns true.
+
+    \sa QtProperty::hasValue()
+*/
+bool QtAbstractPropertyManager::hasValue(const QtProperty *property) const
+{
+    Q_UNUSED(property)
+    return true;
+}
+
+/*!
+    Returns an icon representing the current state of the given \a
+    property.
+
+    The default implementation of this function returns an invalid
+    icon.
+
+    \sa QtProperty::valueIcon()
+*/
+QIcon QtAbstractPropertyManager::valueIcon(const QtProperty *property) const
+{
+    Q_UNUSED(property)
+    return QIcon();
+}
+
+/*!
+    Returns a string representing the current state of the given \a
+    property.
+
+    The default implementation of this function returns an empty
+    string.
+
+    \sa QtProperty::valueText()
+*/
+QString QtAbstractPropertyManager::valueText(const QtProperty *property) const
+{
+    Q_UNUSED(property)
+    return QString();
+}
+
+/*!
+    Creates a property with the given \a name which then is owned by this manager.
+
+    Internally, this function calls the createProperty() and
+    initializeProperty() functions.
+
+    \sa initializeProperty(), properties()
+*/
+QtProperty *QtAbstractPropertyManager::addProperty(const QString &name)
+{
+    QtProperty *property = createProperty();
+    if (property) {
+        property->setPropertyName(name);
+        d_ptr->m_properties.insert(property);
+        initializeProperty(property);
+    }
+    return property;
+}
+
+/*!
+    Creates a property.
+
+    The base implementation produce QtProperty instances; Reimplement
+    this function to make this manager produce objects of a QtProperty
+    subclass.
+
+    \sa addProperty(), initializeProperty()
+*/
+QtProperty *QtAbstractPropertyManager::createProperty()
+{
+    return new QtProperty(this);
+}
+
+/*!
+    \fn void QtAbstractPropertyManager::initializeProperty(QtProperty *property) = 0
+
+    This function is called whenever a new valid property pointer has
+    been created, passing the pointer as parameter.
+
+    The purpose is to let the manager know that the \a property has
+    been created so that it can provide additional attributes for the
+    new property, e.g. QtIntPropertyManager adds \l
+    {QtIntPropertyManager::value()}{value}, \l
+    {QtIntPropertyManager::minimum()}{minimum} and \l
+    {QtIntPropertyManager::maximum()}{maximum} attributes. Since each manager
+    subclass adds type specific attributes, this function is pure
+    virtual and must be reimplemented when deriving from the
+    QtAbstractPropertyManager class.
+
+    \sa addProperty(), createProperty()
+*/
+
+/*!
+    This function is called just before the specified \a property is destroyed.
+
+    The purpose is to let the property manager know that the \a
+    property is being destroyed so that it can remove the property's
+    additional attributes.
+
+    \sa clear(), propertyDestroyed()
+*/
+void QtAbstractPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    Q_UNUSED(property)
+}
+
+////////////////////////////////////
+
+/*!
+    \class QtAbstractEditorFactoryBase
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtAbstractEditorFactoryBase provides an interface for
+    editor factories.
+
+    An editor factory is a class that is able to create an editing
+    widget of a specified type (e.g. line edits or comboboxes) for a
+    given QtProperty object, and it is used in conjunction with the
+    QtAbstractPropertyManager and QtAbstractPropertyBrowser classes.
+
+    When using a property browser widget, the properties are created
+    and managed by implementations of the QtAbstractPropertyManager
+    class. To ensure that the properties' values will be displayed
+    using suitable editing widgets, the managers are associated with
+    objects of QtAbstractEditorFactory subclasses. The property browser
+    will use these associations to determine which factories it should
+    use to create the preferred editing widgets.
+
+    Typically, an editor factory is created by subclassing the
+    QtAbstractEditorFactory template class which inherits
+    QtAbstractEditorFactoryBase. But note that several ready-made
+    implementations are available:
+
+    \list
+    \li QtCheckBoxFactory
+    \li QtDateEditFactory
+    \li QtDateTimeEditFactory
+    \li QtDoubleSpinBoxFactory
+    \li QtEnumEditorFactory
+    \li QtLineEditFactory
+    \li QtScrollBarFactory
+    \li QtSliderFactory
+    \li QtSpinBoxFactory
+    \li QtTimeEditFactory
+    \li QtVariantEditorFactory
+    \endlist
+
+    \sa QtAbstractPropertyManager, QtAbstractPropertyBrowser
+*/
+
+/*!
+    \fn virtual QWidget *QtAbstractEditorFactoryBase::createEditor(QtProperty *property,
+        QWidget *parent) = 0
+
+    Creates an editing widget (with the given \a parent) for the given
+    \a property.
+
+    This function is reimplemented in QtAbstractEditorFactory template class
+    which also provides a pure virtual convenience overload of this
+    function enabling access to the property's manager.
+
+    \sa QtAbstractEditorFactory::createEditor()
+*/
+
+/*!
+    \fn QtAbstractEditorFactoryBase::QtAbstractEditorFactoryBase(QObject *parent = 0)
+
+    Creates an abstract editor factory with the given \a parent.
+*/
+
+/*!
+    \fn virtual void QtAbstractEditorFactoryBase::breakConnection(QtAbstractPropertyManager *manager) = 0
+
+    \internal
+
+    Detaches property manager from factory.
+    This method is reimplemented in QtAbstractEditorFactory template subclass.
+    You don't need to reimplement it in your subclasses. Instead implement more convenient
+    QtAbstractEditorFactory::disconnectPropertyManager() which gives you access to particular manager subclass.
+*/
+
+/*!
+    \fn virtual void QtAbstractEditorFactoryBase::managerDestroyed(QObject *manager) = 0
+
+    \internal
+
+    This method is called when property manager is being destroyed.
+    Basically it notifies factory not to produce editors for properties owned by \a manager.
+    You don't need to reimplement it in your subclass. This method is implemented in
+    QtAbstractEditorFactory template subclass.
+*/
+
+/*!
+    \class QtAbstractEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtAbstractEditorFactory is the base template class for editor
+    factories.
+
+    An editor factory is a class that is able to create an editing
+    widget of a specified type (e.g. line edits or comboboxes) for a
+    given QtProperty object, and it is used in conjunction with the
+    QtAbstractPropertyManager and QtAbstractPropertyBrowser classes.
+
+    Note that the QtAbstractEditorFactory functions are using the
+    PropertyManager template argument class which can be any
+    QtAbstractPropertyManager subclass. For example:
+
+    \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtpropertybrowser.cpp 0
+
+    Note that QtSpinBoxFactory by definition creates editing widgets
+    \e only for properties created by QtIntPropertyManager.
+
+    When using a property browser widget, the properties are created
+    and managed by implementations of the QtAbstractPropertyManager
+    class. To ensure that the properties' values will be displayed
+    using suitable editing widgets, the managers are associated with
+    objects of QtAbstractEditorFactory subclasses. The property browser will
+    use these associations to determine which factories it should use
+    to create the preferred editing widgets.
+
+    A QtAbstractEditorFactory object is capable of producing editors for
+    several property managers at the same time. To create an
+    association between this factory and a given manager, use the
+    addPropertyManager() function. Use the removePropertyManager() function to make
+    this factory stop producing editors for a given property
+    manager. Use the propertyManagers() function to retrieve the set of
+    managers currently associated with this factory.
+
+    Several ready-made implementations of the QtAbstractEditorFactory class
+    are available:
+
+    \list
+    \li QtCheckBoxFactory
+    \li QtDateEditFactory
+    \li QtDateTimeEditFactory
+    \li QtDoubleSpinBoxFactory
+    \li QtEnumEditorFactory
+    \li QtLineEditFactory
+    \li QtScrollBarFactory
+    \li QtSliderFactory
+    \li QtSpinBoxFactory
+    \li QtTimeEditFactory
+    \li QtVariantEditorFactory
+    \endlist
+
+    When deriving from the QtAbstractEditorFactory class, several pure virtual
+    functions must be implemented: the connectPropertyManager() function is
+    used by the factory to connect to the given manager's signals, the
+    createEditor() function is supposed to create an editor for the
+    given property controlled by the given manager, and finally the
+    disconnectPropertyManager() function is used by the factory to disconnect
+    from the specified manager's signals.
+
+    \sa QtAbstractEditorFactoryBase, QtAbstractPropertyManager
+*/
+
+/*!
+    \fn QtAbstractEditorFactory::QtAbstractEditorFactory(QObject *parent = 0)
+
+    Creates an editor factory with the given \a parent.
+
+    \sa addPropertyManager()
+*/
+
+/*!
+    \fn QWidget *QtAbstractEditorFactory::createEditor(QtProperty *property, QWidget *parent)
+
+    Creates an editing widget (with the given \a parent) for the given
+    \a property.
+*/
+
+/*!
+    \fn void QtAbstractEditorFactory::addPropertyManager(PropertyManager *manager)
+
+    Adds the given \a manager to this factory's set of managers,
+    making this factory produce editing widgets for properties created
+    by the given manager.
+
+    The PropertyManager type is a template argument class, and represents the chosen
+    QtAbstractPropertyManager subclass.
+
+    \sa propertyManagers(), removePropertyManager()
+*/
+
+/*!
+    \fn void QtAbstractEditorFactory::removePropertyManager(PropertyManager *manager)
+
+    Removes the given \a manager from this factory's set of
+    managers. The PropertyManager type is a template argument class, and may be
+    any QtAbstractPropertyManager subclass.
+
+    \sa propertyManagers(), addPropertyManager()
+*/
+
+/*!
+    \fn virtual void QtAbstractEditorFactory::connectPropertyManager(PropertyManager *manager) = 0
+
+    Connects this factory to the given \a manager's signals.  The
+    PropertyManager type is a template argument class, and represents
+    the chosen QtAbstractPropertyManager subclass.
+
+    This function is used internally by the addPropertyManager() function, and
+    makes it possible to update an editing widget when the associated
+    property's data changes. This is typically done in custom slots
+    responding to the signals emitted by the property's manager,
+    e.g. QtIntPropertyManager::valueChanged() and
+    QtIntPropertyManager::rangeChanged().
+
+    \sa propertyManagers(), disconnectPropertyManager()
+*/
+
+/*!
+    \fn virtual QWidget *QtAbstractEditorFactory::createEditor(PropertyManager *manager, QtProperty *property,
+                QWidget *parent) = 0
+
+    Creates an editing widget with the given \a parent for the
+    specified \a property created by the given \a manager. The
+    PropertyManager type is a template argument class, and represents
+    the chosen QtAbstractPropertyManager subclass.
+
+    This function must be implemented in derived classes: It is
+    recommended to store a pointer to the widget and map it to the
+    given \a property, since the widget must be updated whenever the
+    associated property's data changes. This is typically done in
+    custom slots responding to the signals emitted by the property's
+    manager, e.g. QtIntPropertyManager::valueChanged() and
+    QtIntPropertyManager::rangeChanged().
+
+    \sa connectPropertyManager()
+*/
+
+/*!
+    \fn virtual void QtAbstractEditorFactory::disconnectPropertyManager(PropertyManager *manager) = 0
+
+    Disconnects this factory from the given \a manager's signals. The
+    PropertyManager type is a template argument class, and represents
+    the chosen QtAbstractPropertyManager subclass.
+
+    This function is used internally by the removePropertyManager() function.
+
+    \sa propertyManagers(), connectPropertyManager()
+*/
+
+/*!
+    \fn QSet<PropertyManager *> QtAbstractEditorFactory::propertyManagers() const
+
+    Returns the factory's set of associated managers.  The
+    PropertyManager type is a template argument class, and represents
+    the chosen QtAbstractPropertyManager subclass.
+
+    \sa addPropertyManager(), removePropertyManager()
+*/
+
+/*!
+    \fn PropertyManager *QtAbstractEditorFactory::propertyManager(QtProperty *property) const
+
+    Returns the property manager for the given \a property, or 0 if
+    the given \a property doesn't belong to any of this factory's
+    registered managers.
+
+    The PropertyManager type is a template argument class, and represents the chosen
+    QtAbstractPropertyManager subclass.
+
+    \sa propertyManagers()
+*/
+
+/*!
+    \fn virtual void QtAbstractEditorFactory::managerDestroyed(QObject *manager)
+
+    \internal
+*/
+
+////////////////////////////////////
+class QtBrowserItemPrivate
+{
+public:
+    QtBrowserItemPrivate(QtAbstractPropertyBrowser *browser, QtProperty *property, QtBrowserItem *parent)
+        : m_browser(browser), m_property(property), m_parent(parent), q_ptr(0) {}
+
+    void addChild(QtBrowserItem *index, QtBrowserItem *after);
+    void removeChild(QtBrowserItem *index);
+
+    QtAbstractPropertyBrowser * const m_browser;
+    QtProperty *m_property;
+    QtBrowserItem *m_parent;
+
+    QtBrowserItem *q_ptr;
+
+    QList<QtBrowserItem *> m_children;
+
+};
+
+void QtBrowserItemPrivate::addChild(QtBrowserItem *index, QtBrowserItem *after)
+{
+    if (m_children.contains(index))
+        return;
+    int idx = m_children.indexOf(after) + 1; // we insert after returned idx, if it was -1 then we set idx to 0;
+    m_children.insert(idx, index);
+}
+
+void QtBrowserItemPrivate::removeChild(QtBrowserItem *index)
+{
+    m_children.removeAll(index);
+}
+
+
+/*!
+    \class QtBrowserItem
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtBrowserItem class represents a property in
+    a property browser instance.
+
+    Browser items are created whenever a QtProperty is inserted to the
+    property browser. A QtBrowserItem uniquely identifies a
+    browser's item. Thus, if the same QtProperty is inserted multiple
+    times, each occurrence gets its own unique QtBrowserItem. The
+    items are owned by QtAbstractPropertyBrowser and automatically
+    deleted when they are removed from the browser.
+
+    You can traverse a browser's properties by calling parent() and
+    children(). The property and the browser associated with an item
+    are available as property() and browser().
+
+    \sa QtAbstractPropertyBrowser, QtProperty
+*/
+
+/*!
+    Returns the property which is accosiated with this item. Note that
+    several items can be associated with the same property instance in
+    the same property browser.
+
+    \sa QtAbstractPropertyBrowser::items()
+*/
+
+QtProperty *QtBrowserItem::property() const
+{
+    return d_ptr->m_property;
+}
+
+/*!
+    Returns the parent item of \e this item. Returns 0 if \e this item
+    is associated with top-level property in item's property browser.
+
+    \sa children()
+*/
+
+QtBrowserItem *QtBrowserItem::parent() const
+{
+    return d_ptr->m_parent;
+}
+
+/*!
+    Returns the children items of \e this item. The properties
+    reproduced from children items are always the same as
+    reproduced from associated property' children, for example:
+
+    \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtpropertybrowser.cpp 1
+
+    The \e childrenItems list represents the same list as \e childrenProperties.
+*/
+
+QList<QtBrowserItem *> QtBrowserItem::children() const
+{
+    return d_ptr->m_children;
+}
+
+/*!
+    Returns the property browser which owns \e this item.
+*/
+
+QtAbstractPropertyBrowser *QtBrowserItem::browser() const
+{
+    return d_ptr->m_browser;
+}
+
+QtBrowserItem::QtBrowserItem(QtAbstractPropertyBrowser *browser, QtProperty *property, QtBrowserItem *parent)
+    : d_ptr(new QtBrowserItemPrivate(browser, property, parent))
+{
+    d_ptr->q_ptr = this;
+}
+
+QtBrowserItem::~QtBrowserItem()
+{
+}
+
+
+////////////////////////////////////
+
+typedef QMap<QtAbstractPropertyBrowser *, QMap<QtAbstractPropertyManager *,
+                            QtAbstractEditorFactoryBase *> > Map1;
+typedef QMap<QtAbstractPropertyManager *, QMap<QtAbstractEditorFactoryBase *,
+                            QList<QtAbstractPropertyBrowser *> > > Map2;
+Q_GLOBAL_STATIC(Map1, m_viewToManagerToFactory)
+Q_GLOBAL_STATIC(Map2, m_managerToFactoryToViews)
+
+class QtAbstractPropertyBrowserPrivate
+{
+    QtAbstractPropertyBrowser *q_ptr;
+    Q_DECLARE_PUBLIC(QtAbstractPropertyBrowser)
+public:
+    QtAbstractPropertyBrowserPrivate();
+
+    void insertSubTree(QtProperty *property,
+            QtProperty *parentProperty);
+    void removeSubTree(QtProperty *property,
+            QtProperty *parentProperty);
+    void createBrowserIndexes(QtProperty *property, QtProperty *parentProperty, QtProperty *afterProperty);
+    void removeBrowserIndexes(QtProperty *property, QtProperty *parentProperty);
+    QtBrowserItem *createBrowserIndex(QtProperty *property, QtBrowserItem *parentIndex, QtBrowserItem *afterIndex);
+    void removeBrowserIndex(QtBrowserItem *index);
+    void clearIndex(QtBrowserItem *index);
+
+    void slotPropertyInserted(QtProperty *property,
+            QtProperty *parentProperty, QtProperty *afterProperty);
+    void slotPropertyRemoved(QtProperty *property, QtProperty *parentProperty);
+    void slotPropertyDestroyed(QtProperty *property);
+    void slotPropertyDataChanged(QtProperty *property);
+
+    QList<QtProperty *> m_subItems;
+    QMap<QtAbstractPropertyManager *, QList<QtProperty *> > m_managerToProperties;
+    QMap<QtProperty *, QList<QtProperty *> > m_propertyToParents;
+
+    QMap<QtProperty *, QtBrowserItem *> m_topLevelPropertyToIndex;
+    QList<QtBrowserItem *> m_topLevelIndexes;
+    QMap<QtProperty *, QList<QtBrowserItem *> > m_propertyToIndexes;
+
+    QtBrowserItem *m_currentItem;
+};
+
+QtAbstractPropertyBrowserPrivate::QtAbstractPropertyBrowserPrivate() :
+   m_currentItem(0)
+{
+}
+
+void QtAbstractPropertyBrowserPrivate::insertSubTree(QtProperty *property,
+            QtProperty *parentProperty)
+{
+    if (m_propertyToParents.contains(property)) {
+        // property was already inserted, so its manager is connected
+        // and all its children are inserted and theirs managers are connected
+        // we just register new parent (parent has to be new).
+        m_propertyToParents[property].append(parentProperty);
+        // don't need to update m_managerToProperties map since
+        // m_managerToProperties[manager] already contains property.
+        return;
+    }
+    QtAbstractPropertyManager *manager = property->propertyManager();
+    if (m_managerToProperties[manager].isEmpty()) {
+        // connect manager's signals
+        q_ptr->connect(manager, SIGNAL(propertyInserted(QtProperty *,
+                            QtProperty *, QtProperty *)),
+                q_ptr, SLOT(slotPropertyInserted(QtProperty *,
+                            QtProperty *, QtProperty *)));
+        q_ptr->connect(manager, SIGNAL(propertyRemoved(QtProperty *,
+                            QtProperty *)),
+                q_ptr, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+        q_ptr->connect(manager, SIGNAL(propertyDestroyed(QtProperty*)),
+                q_ptr, SLOT(slotPropertyDestroyed(QtProperty*)));
+        q_ptr->connect(manager, SIGNAL(propertyChanged(QtProperty*)),
+                q_ptr, SLOT(slotPropertyDataChanged(QtProperty*)));
+    }
+    m_managerToProperties[manager].append(property);
+    m_propertyToParents[property].append(parentProperty);
+
+    QList<QtProperty *> subList = property->subProperties();
+    QListIterator<QtProperty *> itSub(subList);
+    while (itSub.hasNext()) {
+        QtProperty *subProperty = itSub.next();
+        insertSubTree(subProperty, property);
+    }
+}
+
+void QtAbstractPropertyBrowserPrivate::removeSubTree(QtProperty *property,
+            QtProperty *parentProperty)
+{
+    if (!m_propertyToParents.contains(property)) {
+        // ASSERT
+        return;
+    }
+
+    m_propertyToParents[property].removeAll(parentProperty);
+    if (!m_propertyToParents[property].isEmpty())
+        return;
+
+    m_propertyToParents.remove(property);
+    QtAbstractPropertyManager *manager = property->propertyManager();
+    m_managerToProperties[manager].removeAll(property);
+    if (m_managerToProperties[manager].isEmpty()) {
+        // disconnect manager's signals
+        q_ptr->disconnect(manager, SIGNAL(propertyInserted(QtProperty *,
+                            QtProperty *, QtProperty *)),
+                q_ptr, SLOT(slotPropertyInserted(QtProperty *,
+                            QtProperty *, QtProperty *)));
+        q_ptr->disconnect(manager, SIGNAL(propertyRemoved(QtProperty *,
+                            QtProperty *)),
+                q_ptr, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+        q_ptr->disconnect(manager, SIGNAL(propertyDestroyed(QtProperty*)),
+                q_ptr, SLOT(slotPropertyDestroyed(QtProperty*)));
+        q_ptr->disconnect(manager, SIGNAL(propertyChanged(QtProperty*)),
+                q_ptr, SLOT(slotPropertyDataChanged(QtProperty*)));
+
+        m_managerToProperties.remove(manager);
+    }
+
+    QList<QtProperty *> subList = property->subProperties();
+    QListIterator<QtProperty *> itSub(subList);
+    while (itSub.hasNext()) {
+        QtProperty *subProperty = itSub.next();
+        removeSubTree(subProperty, property);
+    }
+}
+
+void QtAbstractPropertyBrowserPrivate::createBrowserIndexes(QtProperty *property, QtProperty *parentProperty, QtProperty *afterProperty)
+{
+    QMap<QtBrowserItem *, QtBrowserItem *> parentToAfter;
+    if (afterProperty) {
+        QMap<QtProperty *, QList<QtBrowserItem *> >::ConstIterator it =
+            m_propertyToIndexes.find(afterProperty);
+        if (it == m_propertyToIndexes.constEnd())
+            return;
+
+        QList<QtBrowserItem *> indexes = it.value();
+        QListIterator<QtBrowserItem *> itIndex(indexes);
+        while (itIndex.hasNext()) {
+            QtBrowserItem *idx = itIndex.next();
+            QtBrowserItem *parentIdx = idx->parent();
+            if ((parentProperty && parentIdx && parentIdx->property() == parentProperty) || (!parentProperty && !parentIdx))
+                parentToAfter[idx->parent()] = idx;
+        }
+    } else if (parentProperty) {
+        QMap<QtProperty *, QList<QtBrowserItem *> >::ConstIterator it =
+                m_propertyToIndexes.find(parentProperty);
+        if (it == m_propertyToIndexes.constEnd())
+            return;
+
+        QList<QtBrowserItem *> indexes = it.value();
+        QListIterator<QtBrowserItem *> itIndex(indexes);
+        while (itIndex.hasNext()) {
+            QtBrowserItem *idx = itIndex.next();
+            parentToAfter[idx] = 0;
+        }
+    } else {
+        parentToAfter[0] = 0;
+    }
+
+    const QMap<QtBrowserItem *, QtBrowserItem *>::ConstIterator pcend = parentToAfter.constEnd();
+    for (QMap<QtBrowserItem *, QtBrowserItem *>::ConstIterator it = parentToAfter.constBegin(); it != pcend; ++it)
+        createBrowserIndex(property, it.key(), it.value());
+}
+
+QtBrowserItem *QtAbstractPropertyBrowserPrivate::createBrowserIndex(QtProperty *property,
+        QtBrowserItem *parentIndex, QtBrowserItem *afterIndex)
+{
+    QtBrowserItem *newIndex = new QtBrowserItem(q_ptr, property, parentIndex);
+    if (parentIndex) {
+        parentIndex->d_ptr->addChild(newIndex, afterIndex);
+    } else {
+        m_topLevelPropertyToIndex[property] = newIndex;
+        m_topLevelIndexes.insert(m_topLevelIndexes.indexOf(afterIndex) + 1, newIndex);
+    }
+    m_propertyToIndexes[property].append(newIndex);
+
+    q_ptr->itemInserted(newIndex, afterIndex);
+
+    QList<QtProperty *> subItems = property->subProperties();
+    QListIterator<QtProperty *> itChild(subItems);
+    QtBrowserItem *afterChild = 0;
+    while (itChild.hasNext()) {
+        QtProperty *child = itChild.next();
+        afterChild = createBrowserIndex(child, newIndex, afterChild);
+    }
+    return newIndex;
+}
+
+void QtAbstractPropertyBrowserPrivate::removeBrowserIndexes(QtProperty *property, QtProperty *parentProperty)
+{
+    QList<QtBrowserItem *> toRemove;
+    QMap<QtProperty *, QList<QtBrowserItem *> >::ConstIterator it =
+        m_propertyToIndexes.find(property);
+    if (it == m_propertyToIndexes.constEnd())
+        return;
+
+    QList<QtBrowserItem *> indexes = it.value();
+    QListIterator<QtBrowserItem *> itIndex(indexes);
+    while (itIndex.hasNext()) {
+        QtBrowserItem *idx = itIndex.next();
+        QtBrowserItem *parentIdx = idx->parent();
+        if ((parentProperty && parentIdx && parentIdx->property() == parentProperty) || (!parentProperty && !parentIdx))
+            toRemove.append(idx);
+    }
+
+    QListIterator<QtBrowserItem *> itRemove(toRemove);
+    while (itRemove.hasNext()) {
+        QtBrowserItem *index = itRemove.next();
+        removeBrowserIndex(index);
+    }
+}
+
+void QtAbstractPropertyBrowserPrivate::removeBrowserIndex(QtBrowserItem *index)
+{
+    QList<QtBrowserItem *> children = index->children();
+    for (int i = children.count(); i > 0; i--) {
+        removeBrowserIndex(children.at(i - 1));
+    }
+
+    q_ptr->itemRemoved(index);
+
+    if (index->parent()) {
+        index->parent()->d_ptr->removeChild(index);
+    } else {
+        m_topLevelPropertyToIndex.remove(index->property());
+        m_topLevelIndexes.removeAll(index);
+    }
+
+    QtProperty *property = index->property();
+
+    m_propertyToIndexes[property].removeAll(index);
+    if (m_propertyToIndexes[property].isEmpty())
+        m_propertyToIndexes.remove(property);
+
+    delete index;
+}
+
+void QtAbstractPropertyBrowserPrivate::clearIndex(QtBrowserItem *index)
+{
+    QList<QtBrowserItem *> children = index->children();
+    QListIterator<QtBrowserItem *> itChild(children);
+    while (itChild.hasNext()) {
+        clearIndex(itChild.next());
+    }
+    delete index;
+}
+
+void QtAbstractPropertyBrowserPrivate::slotPropertyInserted(QtProperty *property,
+        QtProperty *parentProperty, QtProperty *afterProperty)
+{
+    if (!m_propertyToParents.contains(parentProperty))
+        return;
+    createBrowserIndexes(property, parentProperty, afterProperty);
+    insertSubTree(property, parentProperty);
+    //q_ptr->propertyInserted(property, parentProperty, afterProperty);
+}
+
+void QtAbstractPropertyBrowserPrivate::slotPropertyRemoved(QtProperty *property,
+        QtProperty *parentProperty)
+{
+    if (!m_propertyToParents.contains(parentProperty))
+        return;
+    removeSubTree(property, parentProperty); // this line should be probably moved down after propertyRemoved call
+    //q_ptr->propertyRemoved(property, parentProperty);
+    removeBrowserIndexes(property, parentProperty);
+}
+
+void QtAbstractPropertyBrowserPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (!m_subItems.contains(property))
+        return;
+    q_ptr->removeProperty(property);
+}
+
+void QtAbstractPropertyBrowserPrivate::slotPropertyDataChanged(QtProperty *property)
+{
+    if (!m_propertyToParents.contains(property))
+        return;
+
+    QMap<QtProperty *, QList<QtBrowserItem *> >::ConstIterator it =
+            m_propertyToIndexes.find(property);
+    if (it == m_propertyToIndexes.constEnd())
+        return;
+
+    QList<QtBrowserItem *> indexes = it.value();
+    QListIterator<QtBrowserItem *> itIndex(indexes);
+    while (itIndex.hasNext()) {
+        QtBrowserItem *idx = itIndex.next();
+        q_ptr->itemChanged(idx);
+    }
+    //q_ptr->propertyChanged(property);
+}
+
+/*!
+    \class QtAbstractPropertyBrowser
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief QtAbstractPropertyBrowser provides a base class for
+    implementing property browsers.
+
+    A property browser is a widget that enables the user to edit a
+    given set of properties.  Each property is represented by a label
+    specifying the property's name, and an editing widget (e.g. a line
+    edit or a combobox) holding its value. A property can have zero or
+    more subproperties.
+
+    \image qtpropertybrowser.png
+
+    The top level properties can be retrieved using the
+    properties() function. To traverse each property's
+    subproperties, use the QtProperty::subProperties() function. In
+    addition, the set of top level properties can be manipulated using
+    the addProperty(), insertProperty() and removeProperty()
+    functions. Note that the QtProperty class provides a corresponding
+    set of functions making it possible to manipulate the set of
+    subproperties as well.
+
+    To remove all the properties from the property browser widget, use
+    the clear() function. This function will clear the editor, but it
+    will not delete the properties since they can still be used in
+    other editors.
+
+    The properties themselves are created and managed by
+    implementations of the QtAbstractPropertyManager class. A manager
+    can handle (i.e. create and manage) properties of a given type. In
+    the property browser the managers are associated with
+    implementations of the QtAbstractEditorFactory: A factory is a
+    class able to create an editing widget of a specified type.
+
+    When using a property browser widget, managers must be created for
+    each of the required property types before the properties
+    themselves can be created. To ensure that the properties' values
+    will be displayed using suitable editing widgets, the managers
+    must be associated with objects of the preferred factory
+    implementations using the setFactoryForManager() function. The
+    property browser will use these associations to determine which
+    factory it should use to create the preferred editing widget.
+
+    Note that a factory can be associated with many managers, but a
+    manager can only be associated with one single factory within the
+    context of a single property browser.  The associations between
+    managers and factories can at any time be removed using the
+    unsetFactoryForManager() function.
+
+    Whenever the property data changes or a property is inserted or
+    removed, the itemChanged(), itemInserted() or
+    itemRemoved() functions are called, respectively. These
+    functions must be reimplemented in derived classes in order to
+    update the property browser widget. Be aware that some property
+    instances can appear several times in an abstract tree
+    structure. For example:
+
+    \table 100%
+    \row
+    \li
+    \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtpropertybrowser.cpp 2
+    \li  \image qtpropertybrowser-duplicate.png
+    \endtable
+
+    The addProperty() function returns a QtBrowserItem that uniquely
+    identifies the created item.
+
+    To make a property editable in the property browser, the
+    createEditor() function must be called to provide the
+    property with a suitable editing widget.
+
+    Note that there are two ready-made property browser
+    implementations:
+
+    \list
+        \li QtGroupBoxPropertyBrowser
+        \li QtTreePropertyBrowser
+    \endlist
+
+    \sa QtAbstractPropertyManager, QtAbstractEditorFactoryBase
+*/
+
+/*!
+    \fn void QtAbstractPropertyBrowser::setFactoryForManager(PropertyManager *manager,
+                    QtAbstractEditorFactory<PropertyManager> *factory)
+
+    Connects the given \a manager to the given \a factory, ensuring
+    that properties of the \a manager's type will be displayed with an
+    editing widget suitable for their value.
+
+    For example:
+
+    \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtpropertybrowser.cpp 3
+
+    In this example the \c myInteger property's value is displayed
+    with a QSpinBox widget, while the \c myDouble property's value is
+    displayed with a QDoubleSpinBox widget.
+
+    Note that a factory can be associated with many managers, but a
+    manager can only be associated with one single factory.  If the
+    given \a manager already is associated with another factory, the
+    old association is broken before the new one established.
+
+    This function ensures that the given \a manager and the given \a
+    factory are compatible, and it automatically calls the
+    QtAbstractEditorFactory::addPropertyManager() function if necessary.
+
+    \sa unsetFactoryForManager()
+*/
+
+/*!
+    \fn virtual void QtAbstractPropertyBrowser::itemInserted(QtBrowserItem *insertedItem,
+        QtBrowserItem *precedingItem) = 0
+
+    This function is called to update the widget whenever a property
+    is inserted or added to the property browser, passing pointers to
+    the \a insertedItem of property and the specified
+    \a precedingItem as parameters.
+
+    If \a precedingItem is 0, the \a insertedItem was put at
+    the beginning of its parent item's list of subproperties. If
+    the parent of \a insertedItem is 0, the \a insertedItem was added as a top
+    level property of \e this property browser.
+
+    This function must be reimplemented in derived classes. Note that
+    if the \a insertedItem's property has subproperties, this
+    method will be called for those properties as soon as the current call is finished.
+
+    \sa insertProperty(), addProperty()
+*/
+
+/*!
+    \fn virtual void QtAbstractPropertyBrowser::itemRemoved(QtBrowserItem *item) = 0
+
+    This function is called to update the widget whenever a property
+    is removed from the property browser, passing the pointer to the
+    \a item of the property as parameters. The passed \a item is
+    deleted just after this call is finished.
+
+    If the the parent of \a item is 0, the removed \a item was a
+    top level property in this editor.
+
+    This function must be reimplemented in derived classes. Note that
+    if the removed \a item's property has subproperties, this
+    method will be called for those properties just before the current call is started.
+
+    \sa removeProperty()
+*/
+
+/*!
+    \fn virtual void QtAbstractPropertyBrowser::itemChanged(QtBrowserItem *item) = 0
+
+    This function is called whenever a property's data changes,
+    passing a pointer to the \a item of property as parameter.
+
+    This function must be reimplemented in derived classes in order to
+    update the property browser widget whenever a property's name,
+    tool tip, status tip, "what's this" text, value text or value icon
+    changes.
+
+    Note that if the property browser contains several occurrences of
+    the same property, this method will be called once for each
+    occurrence (with a different item each time).
+
+    \sa QtProperty, items()
+*/
+
+/*!
+    Creates an abstract property browser with the given \a parent.
+*/
+QtAbstractPropertyBrowser::QtAbstractPropertyBrowser(QWidget *parent)
+    : QWidget(parent), d_ptr(new QtAbstractPropertyBrowserPrivate)
+{
+    d_ptr->q_ptr = this;
+
+}
+
+/*!
+    Destroys the property browser, and destroys all the items that were
+    created by this property browser.
+
+    Note that the properties that were displayed in the editor are not
+    deleted since they still can be used in other editors. Neither
+    does the destructor delete the property managers and editor
+    factories that were used by this property browser widget unless
+    this widget was their parent.
+
+    \sa QtAbstractPropertyManager::~QtAbstractPropertyManager()
+*/
+QtAbstractPropertyBrowser::~QtAbstractPropertyBrowser()
+{
+    QList<QtBrowserItem *> indexes = topLevelItems();
+    QListIterator<QtBrowserItem *> itItem(indexes);
+    while (itItem.hasNext())
+        d_ptr->clearIndex(itItem.next());
+}
+
+/*!
+    Returns the property browser's list of top level properties.
+
+    To traverse the subproperties, use the QtProperty::subProperties()
+    function.
+
+    \sa addProperty(), insertProperty(), removeProperty()
+*/
+QList<QtProperty *> QtAbstractPropertyBrowser::properties() const
+{
+    return d_ptr->m_subItems;
+}
+
+/*!
+    Returns the property browser's list of all items associated
+    with the given \a property.
+
+    There is one item per instance of the property in the browser.
+
+    \sa topLevelItem()
+*/
+
+QList<QtBrowserItem *> QtAbstractPropertyBrowser::items(QtProperty *property) const
+{
+    return d_ptr->m_propertyToIndexes.value(property);
+}
+
+/*!
+    Returns the top-level items associated with the given \a property.
+
+    Returns 0 if \a property wasn't inserted into this property
+    browser or isn't a top-level one.
+
+    \sa topLevelItems(), items()
+*/
+
+QtBrowserItem *QtAbstractPropertyBrowser::topLevelItem(QtProperty *property) const
+{
+    return d_ptr->m_topLevelPropertyToIndex.value(property);
+}
+
+/*!
+    Returns the list of top-level items.
+
+    \sa topLevelItem()
+*/
+
+QList<QtBrowserItem *> QtAbstractPropertyBrowser::topLevelItems() const
+{
+    return d_ptr->m_topLevelIndexes;
+}
+
+/*!
+    Removes all the properties from the editor, but does not delete
+    them since they can still be used in other editors.
+
+    \sa removeProperty(), QtAbstractPropertyManager::clear()
+*/
+void QtAbstractPropertyBrowser::clear()
+{
+    QList<QtProperty *> subList = properties();
+    QListIterator<QtProperty *> itSub(subList);
+    itSub.toBack();
+    while (itSub.hasPrevious()) {
+        QtProperty *property = itSub.previous();
+        removeProperty(property);
+    }
+}
+
+/*!
+    Appends the given \a property (and its subproperties) to the
+    property browser's list of top level properties. Returns the item
+    created by property browser which is associated with the \a property.
+    In order to get all children items created by the property
+    browser in this call, the returned item should be traversed.
+
+    If the specified \a property is already added, this function does
+    nothing and returns 0.
+
+    \sa insertProperty(), QtProperty::addSubProperty(), properties()
+*/
+QtBrowserItem *QtAbstractPropertyBrowser::addProperty(QtProperty *property)
+{
+    QtProperty *afterProperty = 0;
+    if (d_ptr->m_subItems.count() > 0)
+        afterProperty = d_ptr->m_subItems.last();
+    return insertProperty(property, afterProperty);
+}
+
+/*!
+    \fn QtBrowserItem *QtAbstractPropertyBrowser::insertProperty(QtProperty *property,
+            QtProperty *afterProperty)
+
+    Inserts the given \a property (and its subproperties) after
+    the specified \a afterProperty in the browser's list of top
+    level properties. Returns item created by property browser which
+    is associated with the \a property. In order to get all children items
+    created by the property browser in this call returned item should be traversed.
+
+    If the specified \a afterProperty is 0, the given \a property is
+    inserted at the beginning of the list.  If \a property is
+    already inserted, this function does nothing and returns 0.
+
+    \sa addProperty(), QtProperty::insertSubProperty(), properties()
+*/
+QtBrowserItem *QtAbstractPropertyBrowser::insertProperty(QtProperty *property,
+            QtProperty *afterProperty)
+{
+    if (!property)
+        return 0;
+
+    // if item is already inserted in this item then cannot add.
+    QList<QtProperty *> pendingList = properties();
+    int pos = 0;
+    int newPos = 0;
+    while (pos < pendingList.count()) {
+        QtProperty *prop = pendingList.at(pos);
+        if (prop == property)
+            return 0;
+        if (prop == afterProperty) {
+            newPos = pos + 1;
+        }
+        pos++;
+    }
+    d_ptr->createBrowserIndexes(property, 0, afterProperty);
+
+    // traverse inserted subtree and connect to manager's signals
+    d_ptr->insertSubTree(property, 0);
+
+    d_ptr->m_subItems.insert(newPos, property);
+    //propertyInserted(property, 0, properAfterProperty);
+    return topLevelItem(property);
+}
+
+/*!
+    Removes the specified \a property (and its subproperties) from the
+    property browser's list of top level properties. All items
+    that were associated with the given \a property and its children
+    are deleted.
+
+    Note that the properties are \e not deleted since they can still
+    be used in other editors.
+
+    \sa clear(), QtProperty::removeSubProperty(), properties()
+*/
+void QtAbstractPropertyBrowser::removeProperty(QtProperty *property)
+{
+    if (!property)
+        return;
+
+    QList<QtProperty *> pendingList = properties();
+    int pos = 0;
+    while (pos < pendingList.count()) {
+        if (pendingList.at(pos) == property) {
+            d_ptr->m_subItems.removeAt(pos); //perhaps this two lines
+            d_ptr->removeSubTree(property, 0); //should be moved down after propertyRemoved call.
+            //propertyRemoved(property, 0);
+
+            d_ptr->removeBrowserIndexes(property, 0);
+
+            // when item is deleted, item will call removeItem for top level items,
+            // and itemRemoved for nested items.
+
+            return;
+        }
+        pos++;
+    }
+}
+
+/*!
+    Creates an editing widget (with the given \a parent) for the given
+    \a property according to the previously established associations
+    between property managers and editor factories.
+
+    If the property is created by a property manager which was not
+    associated with any of the existing factories in \e this property
+    editor, the function returns 0.
+
+    To make a property editable in the property browser, the
+    createEditor() function must be called to provide the
+    property with a suitable editing widget.
+
+    Reimplement this function to provide additional decoration for the
+    editing widgets created by the installed factories.
+
+    \sa setFactoryForManager()
+*/
+QWidget *QtAbstractPropertyBrowser::createEditor(QtProperty *property,
+                QWidget *parent)
+{
+    QtAbstractEditorFactoryBase *factory = 0;
+    QtAbstractPropertyManager *manager = property->propertyManager();
+
+    if (m_viewToManagerToFactory()->contains(this) &&
+        (*m_viewToManagerToFactory())[this].contains(manager)) {
+        factory = (*m_viewToManagerToFactory())[this][manager];
+    }
+
+    if (!factory)
+        return 0;
+    QWidget *w = factory->createEditor(property, parent);
+    // Since some editors can be QComboBoxes, and we changed their focus policy in Qt 5
+    // to make them feel more native on Mac, we need to relax the focus policy to something
+    // more permissive to keep the combo box from losing focus, allowing it to stay alive,
+    // when the user clicks on it to show the popup.
+    if (w)
+        w->setFocusPolicy(Qt::WheelFocus);
+    return w;
+}
+
+bool QtAbstractPropertyBrowser::addFactory(QtAbstractPropertyManager *abstractManager,
+            QtAbstractEditorFactoryBase *abstractFactory)
+{
+    bool connectNeeded = false;
+    if (!m_managerToFactoryToViews()->contains(abstractManager) ||
+        !(*m_managerToFactoryToViews())[abstractManager].contains(abstractFactory)) {
+        connectNeeded = true;
+    } else if ((*m_managerToFactoryToViews())[abstractManager][abstractFactory]
+                    .contains(this)) {
+        return connectNeeded;
+    }
+
+    if (m_viewToManagerToFactory()->contains(this) &&
+        (*m_viewToManagerToFactory())[this].contains(abstractManager)) {
+        unsetFactoryForManager(abstractManager);
+    }
+
+    (*m_managerToFactoryToViews())[abstractManager][abstractFactory].append(this);
+    (*m_viewToManagerToFactory())[this][abstractManager] = abstractFactory;
+
+    return connectNeeded;
+}
+
+/*!
+    Removes the association between the given \a manager and the
+    factory bound to it, automatically calling the
+    QtAbstractEditorFactory::removePropertyManager() function if necessary.
+
+    \sa setFactoryForManager()
+*/
+void QtAbstractPropertyBrowser::unsetFactoryForManager(QtAbstractPropertyManager *manager)
+{
+    if (!m_viewToManagerToFactory()->contains(this) ||
+        !(*m_viewToManagerToFactory())[this].contains(manager)) {
+        return;
+    }
+
+    QtAbstractEditorFactoryBase *abstractFactory =
+                (*m_viewToManagerToFactory())[this][manager];
+    (*m_viewToManagerToFactory())[this].remove(manager);
+    if ((*m_viewToManagerToFactory())[this].isEmpty()) {
+        (*m_viewToManagerToFactory()).remove(this);
+    }
+
+    (*m_managerToFactoryToViews())[manager][abstractFactory].removeAll(this);
+    if ((*m_managerToFactoryToViews())[manager][abstractFactory].isEmpty()) {
+        (*m_managerToFactoryToViews())[manager].remove(abstractFactory);
+        abstractFactory->breakConnection(manager);
+        if ((*m_managerToFactoryToViews())[manager].isEmpty()) {
+            (*m_managerToFactoryToViews()).remove(manager);
+        }
+    }
+}
+
+/*!
+    Returns the current item in the property browser.
+
+    \sa setCurrentItem()
+*/
+QtBrowserItem *QtAbstractPropertyBrowser::currentItem() const
+{
+    return d_ptr->m_currentItem;
+}
+
+/*!
+    Sets the current item in the property browser to \a item.
+
+    \sa currentItem(), currentItemChanged()
+*/
+void QtAbstractPropertyBrowser::setCurrentItem(QtBrowserItem *item)
+{
+    QtBrowserItem *oldItem = d_ptr->m_currentItem;
+    d_ptr->m_currentItem = item;
+    if (oldItem != item)
+        emit  currentItemChanged(item);
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qtpropertybrowser.cpp"
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.h b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.h
new file mode 100644
index 0000000..688efd0
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.h
@@ -0,0 +1,301 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTPROPERTYBROWSER_H
+#define QTPROPERTYBROWSER_H
+
+#include <QtWidgets/QWidget>
+#include <QtCore/QSet>
+
+QT_BEGIN_NAMESPACE
+
+class QtAbstractPropertyManager;
+class QtPropertyPrivate;
+
+class QtProperty
+{
+public:
+    virtual ~QtProperty();
+
+    QList<QtProperty *> subProperties() const;
+
+    QtAbstractPropertyManager *propertyManager() const;
+
+    QString toolTip() const;
+    QString statusTip() const;
+    QString whatsThis() const;
+    QString propertyName() const;
+    bool isEnabled() const;
+    bool isModified() const;
+
+    bool hasValue() const;
+    QIcon valueIcon() const;
+    QString valueText() const;
+
+    void setToolTip(const QString &text);
+    void setStatusTip(const QString &text);
+    void setWhatsThis(const QString &text);
+    void setPropertyName(const QString &text);
+    void setEnabled(bool enable);
+    void setModified(bool modified);
+
+    void addSubProperty(QtProperty *property);
+    void insertSubProperty(QtProperty *property, QtProperty *afterProperty);
+    void removeSubProperty(QtProperty *property);
+protected:
+    explicit QtProperty(QtAbstractPropertyManager *manager);
+    void propertyChanged();
+private:
+    friend class QtAbstractPropertyManager;
+    QScopedPointer<QtPropertyPrivate> d_ptr;
+};
+
+class QtAbstractPropertyManagerPrivate;
+
+class QtAbstractPropertyManager : public QObject
+{
+    Q_OBJECT
+public:
+
+    explicit QtAbstractPropertyManager(QObject *parent = 0);
+    virtual ~QtAbstractPropertyManager();
+
+    QSet<QtProperty *> properties() const;
+    void clear() const;
+
+    QtProperty *addProperty(const QString &name = QString());
+Q_SIGNALS:
+
+    void propertyInserted(QtProperty *property,
+                QtProperty *parent, QtProperty *after);
+    void propertyChanged(QtProperty *property);
+    void propertyRemoved(QtProperty *property, QtProperty *parent);
+    void propertyDestroyed(QtProperty *property);
+protected:
+    virtual bool hasValue(const QtProperty *property) const;
+    virtual QIcon valueIcon(const QtProperty *property) const;
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property) = 0;
+    virtual void uninitializeProperty(QtProperty *property);
+    virtual QtProperty *createProperty();
+private:
+    friend class QtProperty;
+    QScopedPointer<QtAbstractPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtAbstractPropertyManager)
+    Q_DISABLE_COPY(QtAbstractPropertyManager)
+};
+
+class QtAbstractEditorFactoryBase : public QObject
+{
+    Q_OBJECT
+public:
+    virtual QWidget *createEditor(QtProperty *property, QWidget *parent) = 0;
+protected:
+    explicit QtAbstractEditorFactoryBase(QObject *parent = 0)
+        : QObject(parent) {}
+
+    virtual void breakConnection(QtAbstractPropertyManager *manager) = 0;
+protected Q_SLOTS:
+    virtual void managerDestroyed(QObject *manager) = 0;
+
+    friend class QtAbstractPropertyBrowser;
+};
+
+template <class PropertyManager>
+class QtAbstractEditorFactory : public QtAbstractEditorFactoryBase
+{
+public:
+    explicit QtAbstractEditorFactory(QObject *parent) : QtAbstractEditorFactoryBase(parent) {}
+    virtual QWidget *createEditor(QtProperty *property, QWidget *parent)
+    {
+        QSetIterator<PropertyManager *> it(m_managers);
+        while (it.hasNext()) {
+            PropertyManager *manager = it.next();
+            if (manager == property->propertyManager()) {
+                return createEditor(manager, property, parent);
+            }
+        }
+        return 0;
+    }
+    void addPropertyManager(PropertyManager *manager)
+    {
+        if (m_managers.contains(manager))
+            return;
+        m_managers.insert(manager);
+        connectPropertyManager(manager);
+        connect(manager, SIGNAL(destroyed(QObject *)),
+                    this, SLOT(managerDestroyed(QObject *)));
+    }
+    void removePropertyManager(PropertyManager *manager)
+    {
+        if (!m_managers.contains(manager))
+            return;
+        disconnect(manager, SIGNAL(destroyed(QObject *)),
+                    this, SLOT(managerDestroyed(QObject *)));
+        disconnectPropertyManager(manager);
+        m_managers.remove(manager);
+    }
+    QSet<PropertyManager *> propertyManagers() const
+    {
+        return m_managers;
+    }
+    PropertyManager *propertyManager(QtProperty *property) const
+    {
+        QtAbstractPropertyManager *manager = property->propertyManager();
+        QSetIterator<PropertyManager *> itManager(m_managers);
+        while (itManager.hasNext()) {
+            PropertyManager *m = itManager.next();
+            if (m == manager) {
+                return m;
+            }
+        }
+        return 0;
+    }
+protected:
+    virtual void connectPropertyManager(PropertyManager *manager) = 0;
+    virtual QWidget *createEditor(PropertyManager *manager, QtProperty *property,
+                QWidget *parent) = 0;
+    virtual void disconnectPropertyManager(PropertyManager *manager) = 0;
+    virtual void managerDestroyed(QObject *manager)
+    {
+        QSetIterator<PropertyManager *> it(m_managers);
+        while (it.hasNext()) {
+            PropertyManager *m = it.next();
+            if (m == manager) {
+                m_managers.remove(m);
+                return;
+            }
+        }
+    }
+private:
+    virtual void breakConnection(QtAbstractPropertyManager *manager)
+    {
+        QSetIterator<PropertyManager *> it(m_managers);
+        while (it.hasNext()) {
+            PropertyManager *m = it.next();
+            if (m == manager) {
+                removePropertyManager(m);
+                return;
+            }
+        }
+    }
+private:
+    QSet<PropertyManager *> m_managers;
+    friend class QtAbstractPropertyEditor;
+};
+
+class QtAbstractPropertyBrowser;
+class QtBrowserItemPrivate;
+
+class QtBrowserItem
+{
+public:
+    QtProperty *property() const;
+    QtBrowserItem *parent() const;
+    QList<QtBrowserItem *> children() const;
+    QtAbstractPropertyBrowser *browser() const;
+private:
+    explicit QtBrowserItem(QtAbstractPropertyBrowser *browser, QtProperty *property, QtBrowserItem *parent);
+    ~QtBrowserItem();
+    QScopedPointer<QtBrowserItemPrivate> d_ptr;
+    friend class QtAbstractPropertyBrowserPrivate;
+};
+
+class QtAbstractPropertyBrowserPrivate;
+
+class QtAbstractPropertyBrowser : public QWidget
+{
+    Q_OBJECT
+public:
+
+    explicit QtAbstractPropertyBrowser(QWidget *parent = 0);
+    virtual ~QtAbstractPropertyBrowser();
+
+    QList<QtProperty *> properties() const;
+    QList<QtBrowserItem *> items(QtProperty *property) const;
+    QtBrowserItem *topLevelItem(QtProperty *property) const;
+    QList<QtBrowserItem *> topLevelItems() const;
+    void clear();
+
+    template <class PropertyManager>
+    void setFactoryForManager(PropertyManager *manager,
+                    QtAbstractEditorFactory<PropertyManager> *factory) {
+        QtAbstractPropertyManager *abstractManager = manager;
+        QtAbstractEditorFactoryBase *abstractFactory = factory;
+
+        if (addFactory(abstractManager, abstractFactory))
+            factory->addPropertyManager(manager);
+    }
+
+    void unsetFactoryForManager(QtAbstractPropertyManager *manager);
+
+    QtBrowserItem *currentItem() const;
+    void setCurrentItem(QtBrowserItem *);
+
+Q_SIGNALS:
+    void currentItemChanged(QtBrowserItem *);
+
+public Q_SLOTS:
+
+    QtBrowserItem *addProperty(QtProperty *property);
+    QtBrowserItem *insertProperty(QtProperty *property, QtProperty *afterProperty);
+    void removeProperty(QtProperty *property);
+
+protected:
+
+    virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) = 0;
+    virtual void itemRemoved(QtBrowserItem *item) = 0;
+    // can be tooltip, statustip, whatsthis, name, icon, text.
+    virtual void itemChanged(QtBrowserItem *item) = 0;
+
+    virtual QWidget *createEditor(QtProperty *property, QWidget *parent);
+private:
+
+    bool addFactory(QtAbstractPropertyManager *abstractManager,
+                QtAbstractEditorFactoryBase *abstractFactory);
+
+    QScopedPointer<QtAbstractPropertyBrowserPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtAbstractPropertyBrowser)
+    Q_DISABLE_COPY(QtAbstractPropertyBrowser)
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyInserted(QtProperty *,
+                            QtProperty *, QtProperty *))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyRemoved(QtProperty *,
+                            QtProperty *))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDataChanged(QtProperty *))
+
+};
+
+QT_END_NAMESPACE
+
+#endif // QTPROPERTYBROWSER_H
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.qrc b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.qrc
new file mode 100644
index 0000000..a7d37dd
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowser.qrc
@@ -0,0 +1,23 @@
+<RCC version="1.0">
+    <qresource prefix="/qt-project.org/qtpropertybrowser">
+        <file>images/cursor-arrow.png</file>
+        <file>images/cursor-busy.png</file>
+        <file>images/cursor-closedhand.png</file>
+        <file>images/cursor-cross.png</file>
+        <file>images/cursor-forbidden.png</file>
+        <file>images/cursor-hand.png</file>
+        <file>images/cursor-hsplit.png</file>
+        <file>images/cursor-ibeam.png</file>
+        <file>images/cursor-openhand.png</file>
+        <file>images/cursor-sizeall.png</file>
+        <file>images/cursor-sizeb.png</file>
+        <file>images/cursor-sizef.png</file>
+        <file>images/cursor-sizeh.png</file>
+        <file>images/cursor-sizev.png</file>
+        <file>images/cursor-uparrow.png</file>
+        <file>images/cursor-vsplit.png</file>
+        <file>images/cursor-wait.png</file>
+        <file>images/cursor-whatsthis.png</file>
+    </qresource>
+</RCC>
+
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowserutils.cpp b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowserutils.cpp
new file mode 100644
index 0000000..d7a26b1
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowserutils.cpp
@@ -0,0 +1,296 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtpropertybrowserutils_p.h"
+#include <QtWidgets/QApplication>
+#include <QtGui/QPainter>
+#include <QtWidgets/QHBoxLayout>
+#include <QtGui/QMouseEvent>
+#include <QtWidgets/QCheckBox>
+#include <QtWidgets/QLineEdit>
+#include <QtWidgets/QMenu>
+#include <QtCore/QLocale>
+
+QT_BEGIN_NAMESPACE
+
+QtCursorDatabase::QtCursorDatabase()
+{
+    appendCursor(Qt::ArrowCursor, QCoreApplication::translate("QtCursorDatabase", "Arrow"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-arrow.png")));
+    appendCursor(Qt::UpArrowCursor, QCoreApplication::translate("QtCursorDatabase", "Up Arrow"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-uparrow.png")));
+    appendCursor(Qt::CrossCursor, QCoreApplication::translate("QtCursorDatabase", "Cross"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-cross.png")));
+    appendCursor(Qt::WaitCursor, QCoreApplication::translate("QtCursorDatabase", "Wait"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-wait.png")));
+    appendCursor(Qt::IBeamCursor, QCoreApplication::translate("QtCursorDatabase", "IBeam"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-ibeam.png")));
+    appendCursor(Qt::SizeVerCursor, QCoreApplication::translate("QtCursorDatabase", "Size Vertical"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-sizev.png")));
+    appendCursor(Qt::SizeHorCursor, QCoreApplication::translate("QtCursorDatabase", "Size Horizontal"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-sizeh.png")));
+    appendCursor(Qt::SizeFDiagCursor, QCoreApplication::translate("QtCursorDatabase", "Size Backslash"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-sizef.png")));
+    appendCursor(Qt::SizeBDiagCursor, QCoreApplication::translate("QtCursorDatabase", "Size Slash"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-sizeb.png")));
+    appendCursor(Qt::SizeAllCursor, QCoreApplication::translate("QtCursorDatabase", "Size All"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-sizeall.png")));
+    appendCursor(Qt::BlankCursor, QCoreApplication::translate("QtCursorDatabase", "Blank"),
+                 QIcon());
+    appendCursor(Qt::SplitVCursor, QCoreApplication::translate("QtCursorDatabase", "Split Vertical"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-vsplit.png")));
+    appendCursor(Qt::SplitHCursor, QCoreApplication::translate("QtCursorDatabase", "Split Horizontal"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-hsplit.png")));
+    appendCursor(Qt::PointingHandCursor, QCoreApplication::translate("QtCursorDatabase", "Pointing Hand"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-hand.png")));
+    appendCursor(Qt::ForbiddenCursor, QCoreApplication::translate("QtCursorDatabase", "Forbidden"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-forbidden.png")));
+    appendCursor(Qt::OpenHandCursor, QCoreApplication::translate("QtCursorDatabase", "Open Hand"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-openhand.png")));
+    appendCursor(Qt::ClosedHandCursor, QCoreApplication::translate("QtCursorDatabase", "Closed Hand"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-closedhand.png")));
+    appendCursor(Qt::WhatsThisCursor, QCoreApplication::translate("QtCursorDatabase", "What's This"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-whatsthis.png")));
+    appendCursor(Qt::BusyCursor, QCoreApplication::translate("QtCursorDatabase", "Busy"),
+                 QIcon(QLatin1String(":/qt-project.org/qtpropertybrowser/images/cursor-busy.png")));
+}
+
+void QtCursorDatabase::clear()
+{
+    m_cursorNames.clear();
+    m_cursorIcons.clear();
+    m_valueToCursorShape.clear();
+    m_cursorShapeToValue.clear();
+}
+
+void QtCursorDatabase::appendCursor(Qt::CursorShape shape, const QString &name, const QIcon &icon)
+{
+    if (m_cursorShapeToValue.contains(shape))
+        return;
+    const int value = m_cursorNames.count();
+    m_cursorNames.append(name);
+    m_cursorIcons.insert(value, icon);
+    m_valueToCursorShape.insert(value, shape);
+    m_cursorShapeToValue.insert(shape, value);
+}
+
+QStringList QtCursorDatabase::cursorShapeNames() const
+{
+    return m_cursorNames;
+}
+
+QMap<int, QIcon> QtCursorDatabase::cursorShapeIcons() const
+{
+    return m_cursorIcons;
+}
+
+QString QtCursorDatabase::cursorToShapeName(const QCursor &cursor) const
+{
+    int val = cursorToValue(cursor);
+    if (val >= 0)
+        return m_cursorNames.at(val);
+    return QString();
+}
+
+QIcon QtCursorDatabase::cursorToShapeIcon(const QCursor &cursor) const
+{
+    int val = cursorToValue(cursor);
+    return m_cursorIcons.value(val);
+}
+
+int QtCursorDatabase::cursorToValue(const QCursor &cursor) const
+{
+#ifndef QT_NO_CURSOR
+    Qt::CursorShape shape = cursor.shape();
+    if (m_cursorShapeToValue.contains(shape))
+        return m_cursorShapeToValue[shape];
+#endif
+    return -1;
+}
+
+#ifndef QT_NO_CURSOR
+QCursor QtCursorDatabase::valueToCursor(int value) const
+{
+    if (m_valueToCursorShape.contains(value))
+        return QCursor(m_valueToCursorShape[value]);
+    return QCursor();
+}
+#endif
+
+QPixmap QtPropertyBrowserUtils::brushValuePixmap(const QBrush &b)
+{
+    QImage img(16, 16, QImage::Format_ARGB32_Premultiplied);
+    img.fill(0);
+
+    QPainter painter(&img);
+    painter.setCompositionMode(QPainter::CompositionMode_Source);
+    painter.fillRect(0, 0, img.width(), img.height(), b);
+    QColor color = b.color();
+    if (color.alpha() != 255) { // indicate alpha by an inset
+        QBrush  opaqueBrush = b;
+        color.setAlpha(255);
+        opaqueBrush.setColor(color);
+        painter.fillRect(img.width() / 4, img.height() / 4,
+                         img.width() / 2, img.height() / 2, opaqueBrush);
+    }
+    painter.end();
+    return QPixmap::fromImage(img);
+}
+
+QIcon QtPropertyBrowserUtils::brushValueIcon(const QBrush &b)
+{
+    return QIcon(brushValuePixmap(b));
+}
+
+QString QtPropertyBrowserUtils::colorValueText(const QColor &c)
+{
+    return QCoreApplication::translate("QtPropertyBrowserUtils", "[%1, %2, %3] (%4)")
+           .arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha());
+}
+
+QPixmap QtPropertyBrowserUtils::fontValuePixmap(const QFont &font)
+{
+    QFont f = font;
+    QImage img(16, 16, QImage::Format_ARGB32_Premultiplied);
+    img.fill(0);
+    QPainter p(&img);
+    p.setRenderHint(QPainter::TextAntialiasing, true);
+    p.setRenderHint(QPainter::Antialiasing, true);
+    f.setPointSize(13);
+    p.setFont(f);
+    QTextOption t;
+    t.setAlignment(Qt::AlignCenter);
+    p.drawText(QRect(0, 0, 16, 16), QString(QLatin1Char('A')), t);
+    return QPixmap::fromImage(img);
+}
+
+QIcon QtPropertyBrowserUtils::fontValueIcon(const QFont &f)
+{
+    return QIcon(fontValuePixmap(f));
+}
+
+QString QtPropertyBrowserUtils::fontValueText(const QFont &f)
+{
+    return QCoreApplication::translate("QtPropertyBrowserUtils", "[%1, %2]")
+           .arg(f.family()).arg(f.pointSize());
+}
+
+QString QtPropertyBrowserUtils::dateFormat()
+{
+    QLocale loc;
+    return loc.dateFormat(QLocale::ShortFormat);
+}
+
+QString QtPropertyBrowserUtils::timeFormat()
+{
+    QLocale loc;
+    // ShortFormat is missing seconds on UNIX.
+    return loc.timeFormat(QLocale::LongFormat);
+}
+
+QString QtPropertyBrowserUtils::dateTimeFormat()
+{
+    QString format = dateFormat();
+    format += QLatin1Char(' ');
+    format += timeFormat();
+    return format;
+}
+
+QtBoolEdit::QtBoolEdit(QWidget *parent) :
+    QWidget(parent),
+    m_checkBox(new QCheckBox(this)),
+    m_textVisible(true)
+{
+    QHBoxLayout *lt = new QHBoxLayout;
+    if (QApplication::layoutDirection() == Qt::LeftToRight)
+        lt->setContentsMargins(4, 0, 0, 0);
+    else
+        lt->setContentsMargins(0, 0, 4, 0);
+    lt->addWidget(m_checkBox);
+    setLayout(lt);
+    connect(m_checkBox, SIGNAL(toggled(bool)), this, SIGNAL(toggled(bool)));
+    setFocusProxy(m_checkBox);
+    m_checkBox->setText(tr("True"));
+}
+
+void QtBoolEdit::setTextVisible(bool textVisible)
+{
+    if (m_textVisible == textVisible)
+        return;
+
+    m_textVisible = textVisible;
+    if (m_textVisible)
+        m_checkBox->setText(isChecked() ? tr("True") : tr("False"));
+    else
+        m_checkBox->setText(QString());
+}
+
+Qt::CheckState QtBoolEdit::checkState() const
+{
+    return m_checkBox->checkState();
+}
+
+void QtBoolEdit::setCheckState(Qt::CheckState state)
+{
+    m_checkBox->setCheckState(state);
+}
+
+bool QtBoolEdit::isChecked() const
+{
+    return m_checkBox->isChecked();
+}
+
+void QtBoolEdit::setChecked(bool c)
+{
+    m_checkBox->setChecked(c);
+    if (!m_textVisible)
+        return;
+    m_checkBox->setText(isChecked() ? tr("True") : tr("False"));
+}
+
+bool QtBoolEdit::blockCheckBoxSignals(bool block)
+{
+    return m_checkBox->blockSignals(block);
+}
+
+void QtBoolEdit::mousePressEvent(QMouseEvent *event)
+{
+    if (event->buttons() == Qt::LeftButton) {
+        m_checkBox->click();
+        event->accept();
+    } else {
+        QWidget::mousePressEvent(event);
+    }
+}
+
+QT_END_NAMESPACE
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowserutils_p.h b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowserutils_p.h
new file mode 100644
index 0000000..5566f9a
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtpropertybrowserutils_p.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists for the convenience
+// of Qt Designer.  This header
+// file may change from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifndef QTPROPERTYBROWSERUTILS_H
+#define QTPROPERTYBROWSERUTILS_H
+
+#include <QtCore/QMap>
+#include <QtGui/QIcon>
+#include <QtWidgets/QWidget>
+#include <QtCore/QStringList>
+
+QT_BEGIN_NAMESPACE
+
+class QMouseEvent;
+class QCheckBox;
+class QLineEdit;
+
+class QtCursorDatabase
+{
+public:
+    QtCursorDatabase();
+    void clear();
+
+    QStringList cursorShapeNames() const;
+    QMap<int, QIcon> cursorShapeIcons() const;
+    QString cursorToShapeName(const QCursor &cursor) const;
+    QIcon cursorToShapeIcon(const QCursor &cursor) const;
+    int cursorToValue(const QCursor &cursor) const;
+#ifndef QT_NO_CURSOR
+    QCursor valueToCursor(int value) const;
+#endif
+private:
+    void appendCursor(Qt::CursorShape shape, const QString &name, const QIcon &icon);
+    QStringList m_cursorNames;
+    QMap<int, QIcon> m_cursorIcons;
+    QMap<int, Qt::CursorShape> m_valueToCursorShape;
+    QMap<Qt::CursorShape, int> m_cursorShapeToValue;
+};
+
+class QtPropertyBrowserUtils
+{
+public:
+    static QPixmap brushValuePixmap(const QBrush &b);
+    static QIcon brushValueIcon(const QBrush &b);
+    static QString colorValueText(const QColor &c);
+    static QPixmap fontValuePixmap(const QFont &f);
+    static QIcon fontValueIcon(const QFont &f);
+    static QString fontValueText(const QFont &f);
+    static QString dateFormat();
+    static QString timeFormat();
+    static QString dateTimeFormat();
+};
+
+class QtBoolEdit : public QWidget {
+    Q_OBJECT
+public:
+    QtBoolEdit(QWidget *parent = 0);
+
+    bool textVisible() const { return m_textVisible; }
+    void setTextVisible(bool textVisible);
+
+    Qt::CheckState checkState() const;
+    void setCheckState(Qt::CheckState state);
+
+    bool isChecked() const;
+    void setChecked(bool c);
+
+    bool blockCheckBoxSignals(bool block);
+
+Q_SIGNALS:
+    void toggled(bool);
+
+protected:
+    void mousePressEvent(QMouseEvent * event);
+
+private:
+    QCheckBox *m_checkBox;
+    bool m_textVisible;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtpropertymanager.cpp b/ThirdParty/GUI/qtpropertybrowser/qtpropertymanager.cpp
new file mode 100644
index 0000000..2e88849
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtpropertymanager.cpp
@@ -0,0 +1,6452 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtpropertymanager.h"
+#include "qtpropertybrowserutils_p.h"
+#include <QtCore/QDateTime>
+#include <QtCore/QLocale>
+#include <QtCore/QMap>
+#include <QtCore/QTimer>
+#include <QtGui/QIcon>
+#include <QtCore/QMetaEnum>
+#include <QtGui/QFontDatabase>
+#include <QtWidgets/QStyleOption>
+#include <QtWidgets/QStyle>
+#include <QtWidgets/QApplication>
+#include <QtGui/QPainter>
+#include <QtWidgets/QLabel>
+
+#include <limits.h>
+#include <float.h>
+
+#if defined(Q_CC_MSVC)
+#    pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */
+#endif
+
+QT_BEGIN_NAMESPACE
+
+template <class PrivateData, class Value>
+static void setSimpleMinimumData(PrivateData *data, const Value &minVal)
+{
+    data->minVal = minVal;
+    if (data->maxVal < data->minVal)
+        data->maxVal = data->minVal;
+
+    if (data->val < data->minVal)
+        data->val = data->minVal;
+}
+
+template <class PrivateData, class Value>
+static void setSimpleMaximumData(PrivateData *data, const Value &maxVal)
+{
+    data->maxVal = maxVal;
+    if (data->minVal > data->maxVal)
+        data->minVal = data->maxVal;
+
+    if (data->val > data->maxVal)
+        data->val = data->maxVal;
+}
+
+template <class PrivateData, class Value>
+static void setSizeMinimumData(PrivateData *data, const Value &newMinVal)
+{
+    data->minVal = newMinVal;
+    if (data->maxVal.width() < data->minVal.width())
+        data->maxVal.setWidth(data->minVal.width());
+    if (data->maxVal.height() < data->minVal.height())
+        data->maxVal.setHeight(data->minVal.height());
+
+    if (data->val.width() < data->minVal.width())
+        data->val.setWidth(data->minVal.width());
+    if (data->val.height() < data->minVal.height())
+        data->val.setHeight(data->minVal.height());
+}
+
+template <class PrivateData, class Value>
+static void setSizeMaximumData(PrivateData *data, const Value &newMaxVal)
+{
+    data->maxVal = newMaxVal;
+    if (data->minVal.width() > data->maxVal.width())
+        data->minVal.setWidth(data->maxVal.width());
+    if (data->minVal.height() > data->maxVal.height())
+        data->minVal.setHeight(data->maxVal.height());
+
+    if (data->val.width() > data->maxVal.width())
+        data->val.setWidth(data->maxVal.width());
+    if (data->val.height() > data->maxVal.height())
+        data->val.setHeight(data->maxVal.height());
+}
+
+template <class SizeValue>
+static SizeValue qBoundSize(const SizeValue &minVal, const SizeValue &val, const SizeValue &maxVal)
+{
+    SizeValue croppedVal = val;
+    if (minVal.width() > val.width())
+        croppedVal.setWidth(minVal.width());
+    else if (maxVal.width() < val.width())
+        croppedVal.setWidth(maxVal.width());
+
+    if (minVal.height() > val.height())
+        croppedVal.setHeight(minVal.height());
+    else if (maxVal.height() < val.height())
+        croppedVal.setHeight(maxVal.height());
+
+    return croppedVal;
+}
+
+// Match the exact signature of qBound for VS 6.
+QSize qBound(QSize minVal, QSize val, QSize maxVal)
+{
+    return qBoundSize(minVal, val, maxVal);
+}
+
+QSizeF qBound(QSizeF minVal, QSizeF val, QSizeF maxVal)
+{
+    return qBoundSize(minVal, val, maxVal);
+}
+
+namespace {
+
+namespace {
+template <class Value>
+void orderBorders(Value &minVal, Value &maxVal)
+{
+    if (minVal > maxVal)
+        qSwap(minVal, maxVal);
+}
+
+template <class Value>
+static void orderSizeBorders(Value &minVal, Value &maxVal)
+{
+    Value fromSize = minVal;
+    Value toSize = maxVal;
+    if (fromSize.width() > toSize.width()) {
+        fromSize.setWidth(maxVal.width());
+        toSize.setWidth(minVal.width());
+    }
+    if (fromSize.height() > toSize.height()) {
+        fromSize.setHeight(maxVal.height());
+        toSize.setHeight(minVal.height());
+    }
+    minVal = fromSize;
+    maxVal = toSize;
+}
+
+void orderBorders(QSize &minVal, QSize &maxVal)
+{
+    orderSizeBorders(minVal, maxVal);
+}
+
+void orderBorders(QSizeF &minVal, QSizeF &maxVal)
+{
+    orderSizeBorders(minVal, maxVal);
+}
+
+}
+}
+////////
+
+template <class Value, class PrivateData>
+static Value getData(const QMap<const QtProperty *, PrivateData> &propertyMap,
+            Value PrivateData::*data,
+            const QtProperty *property, const Value &defaultValue = Value())
+{
+    typedef QMap<const QtProperty *, PrivateData> PropertyToData;
+    typedef typename PropertyToData::const_iterator PropertyToDataConstIterator;
+    const PropertyToDataConstIterator it = propertyMap.constFind(property);
+    if (it == propertyMap.constEnd())
+        return defaultValue;
+    return it.value().*data;
+}
+
+template <class Value, class PrivateData>
+static Value getValue(const QMap<const QtProperty *, PrivateData> &propertyMap,
+            const QtProperty *property, const Value &defaultValue = Value())
+{
+    return getData<Value>(propertyMap, &PrivateData::val, property, defaultValue);
+}
+
+template <class Value, class PrivateData>
+static Value getMinimum(const QMap<const QtProperty *, PrivateData> &propertyMap,
+            const QtProperty *property, const Value &defaultValue = Value())
+{
+    return getData<Value>(propertyMap, &PrivateData::minVal, property, defaultValue);
+}
+
+template <class Value, class PrivateData>
+static Value getMaximum(const QMap<const QtProperty *, PrivateData> &propertyMap,
+            const QtProperty *property, const Value &defaultValue = Value())
+{
+    return getData<Value>(propertyMap, &PrivateData::maxVal, property, defaultValue);
+}
+
+template <class ValueChangeParameter, class Value, class PropertyManager>
+static void setSimpleValue(QMap<const QtProperty *, Value> &propertyMap,
+            PropertyManager *manager,
+            void (PropertyManager::*propertyChangedSignal)(QtProperty *),
+            void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
+            QtProperty *property, const Value &val)
+{
+    typedef QMap<const QtProperty *, Value> PropertyToData;
+    typedef typename PropertyToData::iterator PropertyToDataIterator;
+    const PropertyToDataIterator it = propertyMap.find(property);
+    if (it == propertyMap.end())
+        return;
+
+    if (it.value() == val)
+        return;
+
+    it.value() = val;
+
+    emit (manager->*propertyChangedSignal)(property);
+    emit (manager->*valueChangedSignal)(property, val);
+}
+
+template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value>
+static void setValueInRange(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
+            void (PropertyManager::*propertyChangedSignal)(QtProperty *),
+            void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
+            QtProperty *property, const Value &val,
+            void (PropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, ValueChangeParameter))
+{
+    typedef typename PropertyManagerPrivate::Data PrivateData;
+    typedef QMap<const QtProperty *, PrivateData> PropertyToData;
+    typedef typename PropertyToData::iterator PropertyToDataIterator;
+    const PropertyToDataIterator it = managerPrivate->m_values.find(property);
+    if (it == managerPrivate->m_values.end())
+        return;
+
+    PrivateData &data = it.value();
+
+    if (data.val == val)
+        return;
+
+    const Value oldVal = data.val;
+
+    data.val = qBound(data.minVal, val, data.maxVal);
+
+    if (data.val == oldVal)
+        return;
+
+    if (setSubPropertyValue)
+        (managerPrivate->*setSubPropertyValue)(property, data.val);
+
+    emit (manager->*propertyChangedSignal)(property);
+    emit (manager->*valueChangedSignal)(property, data.val);
+}
+
+template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value>
+static void setBorderValues(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
+            void (PropertyManager::*propertyChangedSignal)(QtProperty *),
+            void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
+            void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
+            QtProperty *property, const Value &minVal, const Value &maxVal,
+            void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
+                    ValueChangeParameter, ValueChangeParameter, ValueChangeParameter))
+{
+    typedef typename PropertyManagerPrivate::Data PrivateData;
+    typedef QMap<const QtProperty *, PrivateData> PropertyToData;
+    typedef typename PropertyToData::iterator PropertyToDataIterator;
+    const PropertyToDataIterator it = managerPrivate->m_values.find(property);
+    if (it == managerPrivate->m_values.end())
+        return;
+
+    Value fromVal = minVal;
+    Value toVal = maxVal;
+    orderBorders(fromVal, toVal);
+
+    PrivateData &data = it.value();
+
+    if (data.minVal == fromVal && data.maxVal == toVal)
+        return;
+
+    const Value oldVal = data.val;
+
+    data.setMinimumValue(fromVal);
+    data.setMaximumValue(toVal);
+
+    emit (manager->*rangeChangedSignal)(property, data.minVal, data.maxVal);
+
+    if (setSubPropertyRange)
+        (managerPrivate->*setSubPropertyRange)(property, data.minVal, data.maxVal, data.val);
+
+    if (data.val == oldVal)
+        return;
+
+    emit (manager->*propertyChangedSignal)(property);
+    emit (manager->*valueChangedSignal)(property, data.val);
+}
+
+template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value, class PrivateData>
+static void setBorderValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
+            void (PropertyManager::*propertyChangedSignal)(QtProperty *),
+            void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
+            void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
+            QtProperty *property,
+            Value (PrivateData::*getRangeVal)() const,
+            void (PrivateData::*setRangeVal)(ValueChangeParameter), const Value &borderVal,
+            void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
+                    ValueChangeParameter, ValueChangeParameter, ValueChangeParameter))
+{
+    typedef QMap<const QtProperty *, PrivateData> PropertyToData;
+    typedef typename PropertyToData::iterator PropertyToDataIterator;
+    const PropertyToDataIterator it = managerPrivate->m_values.find(property);
+    if (it == managerPrivate->m_values.end())
+        return;
+
+    PrivateData &data = it.value();
+
+    if ((data.*getRangeVal)() == borderVal)
+        return;
+
+    const Value oldVal = data.val;
+
+    (data.*setRangeVal)(borderVal);
+
+    emit (manager->*rangeChangedSignal)(property, data.minVal, data.maxVal);
+
+    if (setSubPropertyRange)
+        (managerPrivate->*setSubPropertyRange)(property, data.minVal, data.maxVal, data.val);
+
+    if (data.val == oldVal)
+        return;
+
+    emit (manager->*propertyChangedSignal)(property);
+    emit (manager->*valueChangedSignal)(property, data.val);
+}
+
+template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value, class PrivateData>
+static void setMinimumValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
+            void (PropertyManager::*propertyChangedSignal)(QtProperty *),
+            void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
+            void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
+            QtProperty *property, const Value &minVal)
+{
+    void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
+                    ValueChangeParameter, ValueChangeParameter, ValueChangeParameter) = 0;
+    setBorderValue<ValueChangeParameter, PropertyManagerPrivate, PropertyManager, Value, PrivateData>(manager, managerPrivate,
+            propertyChangedSignal, valueChangedSignal, rangeChangedSignal,
+            property, &PropertyManagerPrivate::Data::minimumValue, &PropertyManagerPrivate::Data::setMinimumValue, minVal, setSubPropertyRange);
+}
+
+template <class ValueChangeParameter, class PropertyManagerPrivate, class PropertyManager, class Value, class PrivateData>
+static void setMaximumValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate,
+            void (PropertyManager::*propertyChangedSignal)(QtProperty *),
+            void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter),
+            void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter),
+            QtProperty *property, const Value &maxVal)
+{
+    void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *,
+                    ValueChangeParameter, ValueChangeParameter, ValueChangeParameter) = 0;
+    setBorderValue<ValueChangeParameter, PropertyManagerPrivate, PropertyManager, Value, PrivateData>(manager, managerPrivate,
+            propertyChangedSignal, valueChangedSignal, rangeChangedSignal,
+            property, &PropertyManagerPrivate::Data::maximumValue, &PropertyManagerPrivate::Data::setMaximumValue, maxVal, setSubPropertyRange);
+}
+
+class QtMetaEnumWrapper : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QSizePolicy::Policy policy READ policy)
+public:
+    QSizePolicy::Policy policy() const { return QSizePolicy::Ignored; }
+private:
+    QtMetaEnumWrapper(QObject *parent) : QObject(parent) {}
+};
+
+class QtMetaEnumProvider
+{
+public:
+    QtMetaEnumProvider();
+
+    QStringList policyEnumNames() const { return m_policyEnumNames; }
+    QStringList languageEnumNames() const { return m_languageEnumNames; }
+    QStringList countryEnumNames(QLocale::Language language) const { return m_countryEnumNames.value(language); }
+
+    QSizePolicy::Policy indexToSizePolicy(int index) const;
+    int sizePolicyToIndex(QSizePolicy::Policy policy) const;
+
+    void indexToLocale(int languageIndex, int countryIndex, QLocale::Language *language, QLocale::Country *country) const;
+    void localeToIndex(QLocale::Language language, QLocale::Country country, int *languageIndex, int *countryIndex) const;
+
+private:
+    void initLocale();
+
+    QStringList m_policyEnumNames;
+    QStringList m_languageEnumNames;
+    QMap<QLocale::Language, QStringList> m_countryEnumNames;
+    QMap<int, QLocale::Language> m_indexToLanguage;
+    QMap<QLocale::Language, int> m_languageToIndex;
+    QMap<int, QMap<int, QLocale::Country> > m_indexToCountry;
+    QMap<QLocale::Language, QMap<QLocale::Country, int> > m_countryToIndex;
+    QMetaEnum m_policyEnum;
+};
+
+static QList<QLocale::Country> sortCountries(const QList<QLocale::Country> &countries)
+{
+    QMultiMap<QString, QLocale::Country> nameToCountry;
+    QListIterator<QLocale::Country> itCountry(countries);
+    while (itCountry.hasNext()) {
+        QLocale::Country country = itCountry.next();
+        nameToCountry.insert(QLocale::countryToString(country), country);
+    }
+    return nameToCountry.values();
+}
+
+void QtMetaEnumProvider::initLocale()
+{
+    QMultiMap<QString, QLocale::Language> nameToLanguage;
+    QLocale::Language language = QLocale::C;
+    while (language <= QLocale::LastLanguage) {
+        QLocale locale(language);
+        if (locale.language() == language)
+            nameToLanguage.insert(QLocale::languageToString(language), language);
+        language = (QLocale::Language)((uint)language + 1); // ++language
+    }
+
+    const QLocale system = QLocale::system();
+    if (!nameToLanguage.contains(QLocale::languageToString(system.language())))
+        nameToLanguage.insert(QLocale::languageToString(system.language()), system.language());
+
+    QList<QLocale::Language> languages = nameToLanguage.values();
+    QListIterator<QLocale::Language> itLang(languages);
+    while (itLang.hasNext()) {
+        QLocale::Language language = itLang.next();
+        QList<QLocale::Country> countries;
+        countries = QLocale::countriesForLanguage(language);
+        if (countries.isEmpty() && language == system.language())
+            countries << system.country();
+
+        if (!countries.isEmpty() && !m_languageToIndex.contains(language)) {
+            countries = sortCountries(countries);
+            int langIdx = m_languageEnumNames.count();
+            m_indexToLanguage[langIdx] = language;
+            m_languageToIndex[language] = langIdx;
+            QStringList countryNames;
+            QListIterator<QLocale::Country> it(countries);
+            int countryIdx = 0;
+            while (it.hasNext()) {
+                QLocale::Country country = it.next();
+                countryNames << QLocale::countryToString(country);
+                m_indexToCountry[langIdx][countryIdx] = country;
+                m_countryToIndex[language][country] = countryIdx;
+                ++countryIdx;
+            }
+            m_languageEnumNames << QLocale::languageToString(language);
+            m_countryEnumNames[language] = countryNames;
+        }
+    }
+}
+
+QtMetaEnumProvider::QtMetaEnumProvider()
+{
+    QMetaProperty p;
+
+    p = QtMetaEnumWrapper::staticMetaObject.property(
+                QtMetaEnumWrapper::staticMetaObject.propertyOffset() + 0);
+    m_policyEnum = p.enumerator();
+    const int keyCount = m_policyEnum.keyCount();
+    for (int i = 0; i < keyCount; i++)
+        m_policyEnumNames << QLatin1String(m_policyEnum.key(i));
+
+    initLocale();
+}
+
+QSizePolicy::Policy QtMetaEnumProvider::indexToSizePolicy(int index) const
+{
+    return static_cast<QSizePolicy::Policy>(m_policyEnum.value(index));
+}
+
+int QtMetaEnumProvider::sizePolicyToIndex(QSizePolicy::Policy policy) const
+{
+     const int keyCount = m_policyEnum.keyCount();
+    for (int i = 0; i < keyCount; i++)
+        if (indexToSizePolicy(i) == policy)
+            return i;
+    return -1;
+}
+
+void QtMetaEnumProvider::indexToLocale(int languageIndex, int countryIndex, QLocale::Language *language, QLocale::Country *country) const
+{
+    QLocale::Language l = QLocale::C;
+    QLocale::Country c = QLocale::AnyCountry;
+    if (m_indexToLanguage.contains(languageIndex)) {
+        l = m_indexToLanguage[languageIndex];
+        if (m_indexToCountry.contains(languageIndex) && m_indexToCountry[languageIndex].contains(countryIndex))
+            c = m_indexToCountry[languageIndex][countryIndex];
+    }
+    if (language)
+        *language = l;
+    if (country)
+        *country = c;
+}
+
+void QtMetaEnumProvider::localeToIndex(QLocale::Language language, QLocale::Country country, int *languageIndex, int *countryIndex) const
+{
+    int l = -1;
+    int c = -1;
+    if (m_languageToIndex.contains(language)) {
+        l = m_languageToIndex[language];
+        if (m_countryToIndex.contains(language) && m_countryToIndex[language].contains(country))
+            c = m_countryToIndex[language][country];
+    }
+
+    if (languageIndex)
+        *languageIndex = l;
+    if (countryIndex)
+        *countryIndex = c;
+}
+
+Q_GLOBAL_STATIC(QtMetaEnumProvider, metaEnumProvider)
+
+// QtGroupPropertyManager
+
+/*!
+    \class QtGroupPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtGroupPropertyManager provides and manages group properties.
+
+    This class is intended to provide a grouping element without any value.
+
+    \sa QtAbstractPropertyManager
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtGroupPropertyManager::QtGroupPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent)
+{
+
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtGroupPropertyManager::~QtGroupPropertyManager()
+{
+
+}
+
+/*!
+    \reimp
+*/
+bool QtGroupPropertyManager::hasValue(const QtProperty *property) const
+{
+    Q_UNUSED(property)
+    return false;
+}
+
+/*!
+    \reimp
+*/
+void QtGroupPropertyManager::initializeProperty(QtProperty *property)
+{
+    Q_UNUSED(property)
+}
+
+/*!
+    \reimp
+*/
+void QtGroupPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    Q_UNUSED(property)
+}
+
+// QtIntPropertyManager
+
+class QtIntPropertyManagerPrivate
+{
+    QtIntPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtIntPropertyManager)
+public:
+
+    struct Data
+    {
+        Data() : val(0), minVal(-INT_MAX), maxVal(INT_MAX), singleStep(1) {}
+        int val;
+        int minVal;
+        int maxVal;
+        int singleStep;
+        int minimumValue() const { return minVal; }
+        int maximumValue() const { return maxVal; }
+        void setMinimumValue(int newMinVal) { setSimpleMinimumData(this, newMinVal); }
+        void setMaximumValue(int newMaxVal) { setSimpleMaximumData(this, newMaxVal); }
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+/*!
+    \class QtIntPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtIntPropertyManager provides and manages int properties.
+
+    An int property has a current value, and a range specifying the
+    valid values. The range is defined by a minimum and a maximum
+    value.
+
+    The property's value and range can be retrieved using the value(),
+    minimum() and maximum() functions, and can be set using the
+    setValue(), setMinimum() and setMaximum() slots. Alternatively,
+    the range can be defined in one go using the setRange() slot.
+
+    In addition, QtIntPropertyManager provides the valueChanged() signal which
+    is emitted whenever a property created by this manager changes,
+    and the rangeChanged() signal which is emitted whenever such a
+    property changes its range of valid values.
+
+    \sa QtAbstractPropertyManager, QtSpinBoxFactory, QtSliderFactory, QtScrollBarFactory
+*/
+
+/*!
+    \fn void QtIntPropertyManager::valueChanged(QtProperty *property, int value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtIntPropertyManager::rangeChanged(QtProperty *property, int minimum, int maximum)
+
+    This signal is emitted whenever a property created by this manager
+    changes its range of valid values, passing a pointer to the
+    \a property and the new \a minimum and \a maximum values.
+
+    \sa setRange()
+*/
+
+/*!
+    \fn void QtIntPropertyManager::singleStepChanged(QtProperty *property, int step)
+
+    This signal is emitted whenever a property created by this manager
+    changes its single step property, passing a pointer to the
+    \a property and the new \a step value
+
+    \sa setSingleStep()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtIntPropertyManager::QtIntPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtIntPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtIntPropertyManager::~QtIntPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns 0.
+
+    \sa setValue()
+*/
+int QtIntPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<int>(d_ptr->m_values, property, 0);
+}
+
+/*!
+    Returns the given \a property's minimum value.
+
+    \sa setMinimum(), maximum(), setRange()
+*/
+int QtIntPropertyManager::minimum(const QtProperty *property) const
+{
+    return getMinimum<int>(d_ptr->m_values, property, 0);
+}
+
+/*!
+    Returns the given \a property's maximum value.
+
+    \sa setMaximum(), minimum(), setRange()
+*/
+int QtIntPropertyManager::maximum(const QtProperty *property) const
+{
+    return getMaximum<int>(d_ptr->m_values, property, 0);
+}
+
+/*!
+    Returns the given \a property's step value.
+
+    The step is typically used to increment or decrement a property value while pressing an arrow key.
+
+    \sa setSingleStep()
+*/
+int QtIntPropertyManager::singleStep(const QtProperty *property) const
+{
+    return getData<int>(d_ptr->m_values, &QtIntPropertyManagerPrivate::Data::singleStep, property, 0);
+}
+
+/*!
+    \reimp
+*/
+QString QtIntPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtIntPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    return QString::number(it.value().val);
+}
+
+/*!
+    \fn void QtIntPropertyManager::setValue(QtProperty *property, int value)
+
+    Sets the value of the given \a property to \a value.
+
+    If the specified \a value is not valid according to the given \a
+    property's range, the \a value is adjusted to the nearest valid
+    value within the range.
+
+    \sa value(), setRange(), valueChanged()
+*/
+void QtIntPropertyManager::setValue(QtProperty *property, int val)
+{
+    void (QtIntPropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, int) = 0;
+    setValueInRange<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int>(this, d_ptr.data(),
+                &QtIntPropertyManager::propertyChanged,
+                &QtIntPropertyManager::valueChanged,
+                property, val, setSubPropertyValue);
+}
+
+/*!
+    Sets the minimum value for the given \a property to \a minVal.
+
+    When setting the minimum value, the maximum and current values are
+    adjusted if necessary (ensuring that the range remains valid and
+    that the current value is within the range).
+
+    \sa minimum(), setRange(), rangeChanged()
+*/
+void QtIntPropertyManager::setMinimum(QtProperty *property, int minVal)
+{
+    setMinimumValue<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int, QtIntPropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtIntPropertyManager::propertyChanged,
+                &QtIntPropertyManager::valueChanged,
+                &QtIntPropertyManager::rangeChanged,
+                property, minVal);
+}
+
+/*!
+    Sets the maximum value for the given \a property to \a maxVal.
+
+    When setting maximum value, the minimum and current values are
+    adjusted if necessary (ensuring that the range remains valid and
+    that the current value is within the range).
+
+    \sa maximum(), setRange(), rangeChanged()
+*/
+void QtIntPropertyManager::setMaximum(QtProperty *property, int maxVal)
+{
+    setMaximumValue<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int, QtIntPropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtIntPropertyManager::propertyChanged,
+                &QtIntPropertyManager::valueChanged,
+                &QtIntPropertyManager::rangeChanged,
+                property, maxVal);
+}
+
+/*!
+    \fn void QtIntPropertyManager::setRange(QtProperty *property, int minimum, int maximum)
+
+    Sets the range of valid values.
+
+    This is a convenience function defining the range of valid values
+    in one go; setting the \a minimum and \a maximum values for the
+    given \a property with a single function call.
+
+    When setting a new range, the current value is adjusted if
+    necessary (ensuring that the value remains within range).
+
+    \sa setMinimum(), setMaximum(), rangeChanged()
+*/
+void QtIntPropertyManager::setRange(QtProperty *property, int minVal, int maxVal)
+{
+    void (QtIntPropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, int, int, int) = 0;
+    setBorderValues<int, QtIntPropertyManagerPrivate, QtIntPropertyManager, int>(this, d_ptr.data(),
+                &QtIntPropertyManager::propertyChanged,
+                &QtIntPropertyManager::valueChanged,
+                &QtIntPropertyManager::rangeChanged,
+                property, minVal, maxVal, setSubPropertyRange);
+}
+
+/*!
+    Sets the step value for the given \a property to \a step.
+
+    The step is typically used to increment or decrement a property value while pressing an arrow key.
+
+    \sa singleStep()
+*/
+void QtIntPropertyManager::setSingleStep(QtProperty *property, int step)
+{
+    const QtIntPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtIntPropertyManagerPrivate::Data data = it.value();
+
+    if (step < 0)
+        step = 0;
+
+    if (data.singleStep == step)
+        return;
+
+    data.singleStep = step;
+
+    it.value() = data;
+
+    emit singleStepChanged(property, data.singleStep);
+}
+
+/*!
+    \reimp
+*/
+void QtIntPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtIntPropertyManagerPrivate::Data();
+}
+
+/*!
+    \reimp
+*/
+void QtIntPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtDoublePropertyManager
+
+class QtDoublePropertyManagerPrivate
+{
+    QtDoublePropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtDoublePropertyManager)
+public:
+
+    struct Data
+    {
+        Data() : val(0), minVal(-DBL_MAX), maxVal(DBL_MAX), singleStep(1), decimals(2) {}
+        double val;
+        double minVal;
+        double maxVal;
+        double singleStep;
+        int decimals;
+        double minimumValue() const { return minVal; }
+        double maximumValue() const { return maxVal; }
+        void setMinimumValue(double newMinVal) { setSimpleMinimumData(this, newMinVal); }
+        void setMaximumValue(double newMaxVal) { setSimpleMaximumData(this, newMaxVal); }
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+/*!
+    \class QtDoublePropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtDoublePropertyManager provides and manages double properties.
+
+    A double property has a current value, and a range specifying the
+    valid values. The range is defined by a minimum and a maximum
+    value.
+
+    The property's value and range can be retrieved using the value(),
+    minimum() and maximum() functions, and can be set using the
+    setValue(), setMinimum() and setMaximum() slots.
+    Alternatively, the range can be defined in one go using the
+    setRange() slot.
+
+    In addition, QtDoublePropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the rangeChanged() signal which is emitted whenever
+    such a property changes its range of valid values.
+
+    \sa QtAbstractPropertyManager, QtDoubleSpinBoxFactory
+*/
+
+/*!
+    \fn void QtDoublePropertyManager::valueChanged(QtProperty *property, double value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtDoublePropertyManager::rangeChanged(QtProperty *property, double minimum, double maximum)
+
+    This signal is emitted whenever a property created by this manager
+    changes its range of valid values, passing a pointer to the
+    \a property and the new \a minimum and \a maximum values
+
+    \sa setRange()
+*/
+
+/*!
+    \fn void QtDoublePropertyManager::decimalsChanged(QtProperty *property, int prec)
+
+    This signal is emitted whenever a property created by this manager
+    changes its precision of value, passing a pointer to the
+    \a property and the new \a prec value
+
+    \sa setDecimals()
+*/
+
+/*!
+    \fn void QtDoublePropertyManager::singleStepChanged(QtProperty *property, double step)
+
+    This signal is emitted whenever a property created by this manager
+    changes its single step property, passing a pointer to the
+    \a property and the new \a step value
+
+    \sa setSingleStep()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtDoublePropertyManager::QtDoublePropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtDoublePropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys  this manager, and all the properties it has created.
+*/
+QtDoublePropertyManager::~QtDoublePropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns 0.
+
+    \sa setValue()
+*/
+double QtDoublePropertyManager::value(const QtProperty *property) const
+{
+    return getValue<double>(d_ptr->m_values, property, 0.0);
+}
+
+/*!
+    Returns the given \a property's minimum value.
+
+    \sa maximum(), setRange()
+*/
+double QtDoublePropertyManager::minimum(const QtProperty *property) const
+{
+    return getMinimum<double>(d_ptr->m_values, property, 0.0);
+}
+
+/*!
+    Returns the given \a property's maximum value.
+
+    \sa minimum(), setRange()
+*/
+double QtDoublePropertyManager::maximum(const QtProperty *property) const
+{
+    return getMaximum<double>(d_ptr->m_values, property, 0.0);
+}
+
+/*!
+    Returns the given \a property's step value.
+
+    The step is typically used to increment or decrement a property value while pressing an arrow key.
+
+    \sa setSingleStep()
+*/
+double QtDoublePropertyManager::singleStep(const QtProperty *property) const
+{
+    return getData<double>(d_ptr->m_values, &QtDoublePropertyManagerPrivate::Data::singleStep, property, 0);
+}
+
+/*!
+    Returns the given \a property's precision, in decimals.
+
+    \sa setDecimals()
+*/
+int QtDoublePropertyManager::decimals(const QtProperty *property) const
+{
+    return getData<int>(d_ptr->m_values, &QtDoublePropertyManagerPrivate::Data::decimals, property, 0);
+}
+
+/*!
+    \reimp
+*/
+QString QtDoublePropertyManager::valueText(const QtProperty *property) const
+{
+    const QtDoublePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    return QString::number(it.value().val, 'f', it.value().decimals);
+}
+
+/*!
+    \fn void QtDoublePropertyManager::setValue(QtProperty *property, double value)
+
+    Sets the value of the given \a property to \a value.
+
+    If the specified \a value is not valid according to the given
+    \a property's range, the \a value is adjusted to the nearest valid value
+    within the range.
+
+    \sa value(), setRange(), valueChanged()
+*/
+void QtDoublePropertyManager::setValue(QtProperty *property, double val)
+{
+    void (QtDoublePropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, double) = 0;
+    setValueInRange<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double>(this, d_ptr.data(),
+                &QtDoublePropertyManager::propertyChanged,
+                &QtDoublePropertyManager::valueChanged,
+                property, val, setSubPropertyValue);
+}
+
+/*!
+    Sets the step value for the given \a property to \a step.
+
+    The step is typically used to increment or decrement a property value while pressing an arrow key.
+
+    \sa singleStep()
+*/
+void QtDoublePropertyManager::setSingleStep(QtProperty *property, double step)
+{
+    const QtDoublePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtDoublePropertyManagerPrivate::Data data = it.value();
+
+    if (step < 0)
+        step = 0;
+
+    if (data.singleStep == step)
+        return;
+
+    data.singleStep = step;
+
+    it.value() = data;
+
+    emit singleStepChanged(property, data.singleStep);
+}
+
+/*!
+    \fn void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec)
+
+    Sets the precision of the given \a property to \a prec.
+
+    The valid decimal range is 0-13. The default is 2.
+
+    \sa decimals()
+*/
+void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec)
+{
+    const QtDoublePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtDoublePropertyManagerPrivate::Data data = it.value();
+
+    if (prec > 13)
+        prec = 13;
+    else if (prec < 0)
+        prec = 0;
+
+    if (data.decimals == prec)
+        return;
+
+    data.decimals = prec;
+
+    it.value() = data;
+
+    emit decimalsChanged(property, data.decimals);
+}
+
+/*!
+    Sets the minimum value for the given \a property to \a minVal.
+
+    When setting the minimum value, the maximum and current values are
+    adjusted if necessary (ensuring that the range remains valid and
+    that the current value is within in the range).
+
+    \sa minimum(), setRange(), rangeChanged()
+*/
+void QtDoublePropertyManager::setMinimum(QtProperty *property, double minVal)
+{
+    setMinimumValue<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double, QtDoublePropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtDoublePropertyManager::propertyChanged,
+                &QtDoublePropertyManager::valueChanged,
+                &QtDoublePropertyManager::rangeChanged,
+                property, minVal);
+}
+
+/*!
+    Sets the maximum value for the given \a property to \a maxVal.
+
+    When setting the maximum value, the minimum and current values are
+    adjusted if necessary (ensuring that the range remains valid and
+    that the current value is within in the range).
+
+    \sa maximum(), setRange(), rangeChanged()
+*/
+void QtDoublePropertyManager::setMaximum(QtProperty *property, double maxVal)
+{
+    setMaximumValue<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double, QtDoublePropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtDoublePropertyManager::propertyChanged,
+                &QtDoublePropertyManager::valueChanged,
+                &QtDoublePropertyManager::rangeChanged,
+                property, maxVal);
+}
+
+/*!
+    \fn void QtDoublePropertyManager::setRange(QtProperty *property, double minimum, double maximum)
+
+    Sets the range of valid values.
+
+    This is a convenience function defining the range of valid values
+    in one go; setting the \a minimum and \a maximum values for the
+    given \a property with a single function call.
+
+    When setting a new range, the current value is adjusted if
+    necessary (ensuring that the value remains within range).
+
+    \sa setMinimum(), setMaximum(), rangeChanged()
+*/
+void QtDoublePropertyManager::setRange(QtProperty *property, double minVal, double maxVal)
+{
+    void (QtDoublePropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, double, double, double) = 0;
+    setBorderValues<double, QtDoublePropertyManagerPrivate, QtDoublePropertyManager, double>(this, d_ptr.data(),
+                &QtDoublePropertyManager::propertyChanged,
+                &QtDoublePropertyManager::valueChanged,
+                &QtDoublePropertyManager::rangeChanged,
+                property, minVal, maxVal, setSubPropertyRange);
+}
+
+/*!
+    \reimp
+*/
+void QtDoublePropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtDoublePropertyManagerPrivate::Data();
+}
+
+/*!
+    \reimp
+*/
+void QtDoublePropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtStringPropertyManager
+
+class QtStringPropertyManagerPrivate
+{
+    QtStringPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtStringPropertyManager)
+public:
+
+    struct Data
+    {
+        Data() : regExp(QString(QLatin1Char('*')),  Qt::CaseSensitive, QRegExp::Wildcard)
+        {
+        }
+        QString val;
+        QRegExp regExp;
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    QMap<const QtProperty *, Data> m_values;
+};
+
+/*!
+    \class QtStringPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtStringPropertyManager provides and manages QString properties.
+
+    A string property's value can be retrieved using the value()
+    function, and set using the setValue() slot.
+
+    The current value can be checked against a regular expression. To
+    set the regular expression use the setRegExp() slot, use the
+    regExp() function to retrieve the currently set expression.
+
+    In addition, QtStringPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the regExpChanged() signal which is emitted whenever
+    such a property changes its currently set regular expression.
+
+    \sa QtAbstractPropertyManager, QtLineEditFactory
+*/
+
+/*!
+    \fn void QtStringPropertyManager::valueChanged(QtProperty *property, const QString &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtStringPropertyManager::regExpChanged(QtProperty *property, const QRegExp &regExp)
+
+    This signal is emitted whenever a property created by this manager
+    changes its currenlty set regular expression, passing a pointer to
+    the \a property and the new \a regExp as parameters.
+
+    \sa setRegExp()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtStringPropertyManager::QtStringPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtStringPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtStringPropertyManager::~QtStringPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns an empty string.
+
+    \sa setValue()
+*/
+QString QtStringPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<QString>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's currently set regular expression.
+
+    If the given \a property is not managed by this manager, this
+    function returns an empty expression.
+
+    \sa setRegExp()
+*/
+QRegExp QtStringPropertyManager::regExp(const QtProperty *property) const
+{
+    return getData<QRegExp>(d_ptr->m_values, &QtStringPropertyManagerPrivate::Data::regExp, property, QRegExp());
+}
+
+/*!
+    \reimp
+*/
+QString QtStringPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtStringPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    return it.value().val;
+}
+
+/*!
+    \fn void QtStringPropertyManager::setValue(QtProperty *property, const QString &value)
+
+    Sets the value of the given \a property to \a value.
+
+    If the specified \a value doesn't match the given \a property's
+    regular expression, this function does nothing.
+
+    \sa value(), setRegExp(), valueChanged()
+*/
+void QtStringPropertyManager::setValue(QtProperty *property, const QString &val)
+{
+    const QtStringPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtStringPropertyManagerPrivate::Data data = it.value();
+
+    if (data.val == val)
+        return;
+
+    if (data.regExp.isValid() && !data.regExp.exactMatch(val))
+        return;
+
+    data.val = val;
+
+    it.value() = data;
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    Sets the regular expression of the given \a property to \a regExp.
+
+    \sa regExp(), setValue(), regExpChanged()
+*/
+void QtStringPropertyManager::setRegExp(QtProperty *property, const QRegExp &regExp)
+{
+    const QtStringPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtStringPropertyManagerPrivate::Data data = it.value() ;
+
+    if (data.regExp == regExp)
+        return;
+
+    data.regExp = regExp;
+
+    it.value() = data;
+
+    emit regExpChanged(property, data.regExp);
+}
+
+/*!
+    \reimp
+*/
+void QtStringPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtStringPropertyManagerPrivate::Data();
+}
+
+/*!
+    \reimp
+*/
+void QtStringPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtBoolPropertyManager
+//     Return an icon containing a check box indicator
+static QIcon drawCheckBox(bool value)
+{
+    QStyleOptionButton opt;
+    opt.state |= value ? QStyle::State_On : QStyle::State_Off;
+    opt.state |= QStyle::State_Enabled;
+    const QStyle *style = QApplication::style();
+    // Figure out size of an indicator and make sure it is not scaled down in a list view item
+    // by making the pixmap as big as a list view icon and centering the indicator in it.
+    // (if it is smaller, it can't be helped)
+    const int indicatorWidth = style->pixelMetric(QStyle::PM_IndicatorWidth, &opt);
+    const int indicatorHeight = style->pixelMetric(QStyle::PM_IndicatorHeight, &opt);
+    const int listViewIconSize = indicatorWidth;
+    const int pixmapWidth = indicatorWidth;
+    const int pixmapHeight = qMax(indicatorHeight, listViewIconSize);
+
+    opt.rect = QRect(0, 0, indicatorWidth, indicatorHeight);
+    QPixmap pixmap = QPixmap(pixmapWidth, pixmapHeight);
+    pixmap.fill(Qt::transparent);
+    {
+        // Center?
+        const int xoff = (pixmapWidth  > indicatorWidth)  ? (pixmapWidth  - indicatorWidth)  / 2 : 0;
+        const int yoff = (pixmapHeight > indicatorHeight) ? (pixmapHeight - indicatorHeight) / 2 : 0;
+        QPainter painter(&pixmap);
+        painter.translate(xoff, yoff);
+        style->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, &painter);
+    }
+    return QIcon(pixmap);
+}
+
+class QtBoolPropertyManagerPrivate
+{
+    QtBoolPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtBoolPropertyManager)
+public:
+    QtBoolPropertyManagerPrivate();
+
+    QMap<const QtProperty *, bool> m_values;
+    const QIcon m_checkedIcon;
+    const QIcon m_uncheckedIcon;
+};
+
+QtBoolPropertyManagerPrivate::QtBoolPropertyManagerPrivate() :
+    m_checkedIcon(drawCheckBox(true)),
+    m_uncheckedIcon(drawCheckBox(false))
+{
+}
+
+/*!
+    \class QtBoolPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtBoolPropertyManager class provides and manages boolean properties.
+
+    The property's value can be retrieved using the value() function,
+    and set using the setValue() slot.
+
+    In addition, QtBoolPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes.
+
+    \sa QtAbstractPropertyManager, QtCheckBoxFactory
+*/
+
+/*!
+    \fn void QtBoolPropertyManager::valueChanged(QtProperty *property, bool value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtBoolPropertyManager::QtBoolPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtBoolPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtBoolPropertyManager::~QtBoolPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by \e this manager, this
+    function returns false.
+
+    \sa setValue()
+*/
+bool QtBoolPropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, false);
+}
+
+/*!
+    \reimp
+*/
+QString QtBoolPropertyManager::valueText(const QtProperty *property) const
+{
+    const QMap<const QtProperty *, bool>::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    static const QString trueText = tr("True");
+    static const QString falseText = tr("False");
+    return it.value() ? trueText : falseText;
+}
+
+/*!
+    \reimp
+*/
+QIcon QtBoolPropertyManager::valueIcon(const QtProperty *property) const
+{
+    const QMap<const QtProperty *, bool>::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QIcon();
+
+    return it.value() ? d_ptr->m_checkedIcon : d_ptr->m_uncheckedIcon;
+}
+
+/*!
+    \fn void QtBoolPropertyManager::setValue(QtProperty *property, bool value)
+
+    Sets the value of the given \a property to \a value.
+
+    \sa value()
+*/
+void QtBoolPropertyManager::setValue(QtProperty *property, bool val)
+{
+    setSimpleValue<bool, bool, QtBoolPropertyManager>(d_ptr->m_values, this,
+                &QtBoolPropertyManager::propertyChanged,
+                &QtBoolPropertyManager::valueChanged,
+                property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtBoolPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = false;
+}
+
+/*!
+    \reimp
+*/
+void QtBoolPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtDatePropertyManager
+
+class QtDatePropertyManagerPrivate
+{
+    QtDatePropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtDatePropertyManager)
+public:
+    explicit QtDatePropertyManagerPrivate(QtDatePropertyManager *q);
+
+    struct Data
+    {
+        Data() : val(QDate::currentDate()), minVal(QDate(1752, 9, 14)),
+                maxVal(QDate(7999, 12, 31)) {}
+        QDate val;
+        QDate minVal;
+        QDate maxVal;
+        QDate minimumValue() const { return minVal; }
+        QDate maximumValue() const { return maxVal; }
+        void setMinimumValue(const QDate &newMinVal) { setSimpleMinimumData(this, newMinVal); }
+        void setMaximumValue(const QDate &newMaxVal) { setSimpleMaximumData(this, newMaxVal); }
+    };
+
+    QString m_format;
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    QMap<const QtProperty *, Data> m_values;
+};
+
+QtDatePropertyManagerPrivate::QtDatePropertyManagerPrivate(QtDatePropertyManager *q) :
+    q_ptr(q),
+    m_format(QtPropertyBrowserUtils::dateFormat())
+{
+}
+
+/*!
+    \class QtDatePropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtDatePropertyManager provides and manages QDate properties.
+
+    A date property has a current value, and a range specifying the
+    valid dates. The range is defined by a minimum and a maximum
+    value.
+
+    The property's values can be retrieved using the minimum(),
+    maximum() and value() functions, and can be set using the
+    setMinimum(), setMaximum() and setValue() slots. Alternatively,
+    the range can be defined in one go using the setRange() slot.
+
+    In addition, QtDatePropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the rangeChanged() signal which is emitted whenever
+    such a property changes its range of valid dates.
+
+    \sa QtAbstractPropertyManager, QtDateEditFactory, QtDateTimePropertyManager
+*/
+
+/*!
+    \fn void QtDatePropertyManager::valueChanged(QtProperty *property, const QDate &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtDatePropertyManager::rangeChanged(QtProperty *property, const QDate &minimum, const QDate &maximum)
+
+    This signal is emitted whenever a property created by this manager
+    changes its range of valid dates, passing a pointer to the \a
+    property and the new \a minimum and \a maximum dates.
+
+    \sa setRange()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtDatePropertyManager::QtDatePropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtDatePropertyManagerPrivate(this))
+{
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtDatePropertyManager::~QtDatePropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by \e this manager, this
+    function returns an invalid date.
+
+    \sa setValue()
+*/
+QDate QtDatePropertyManager::value(const QtProperty *property) const
+{
+    return getValue<QDate>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a  property's  minimum date.
+
+    \sa maximum(), setRange()
+*/
+QDate QtDatePropertyManager::minimum(const QtProperty *property) const
+{
+    return getMinimum<QDate>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's maximum date.
+
+    \sa minimum(), setRange()
+*/
+QDate QtDatePropertyManager::maximum(const QtProperty *property) const
+{
+    return getMaximum<QDate>(d_ptr->m_values, property);
+}
+
+/*!
+    \reimp
+*/
+QString QtDatePropertyManager::valueText(const QtProperty *property) const
+{
+    const QtDatePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    return it.value().val.toString(d_ptr->m_format);
+}
+
+/*!
+    \fn void QtDatePropertyManager::setValue(QtProperty *property, const QDate &value)
+
+    Sets the value of the given \a property to \a value.
+
+    If the specified \a value is not a valid date according to the
+    given \a property's range, the value is adjusted to the nearest
+    valid value within the range.
+
+    \sa value(), setRange(), valueChanged()
+*/
+void QtDatePropertyManager::setValue(QtProperty *property, const QDate &val)
+{
+    void (QtDatePropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, const QDate &) = 0;
+    setValueInRange<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, const QDate>(this, d_ptr.data(),
+                &QtDatePropertyManager::propertyChanged,
+                &QtDatePropertyManager::valueChanged,
+                property, val, setSubPropertyValue);
+}
+
+/*!
+    Sets the minimum value for the given \a property to \a minVal.
+
+    When setting the minimum value, the maximum and current values are
+    adjusted if necessary (ensuring that the range remains valid and
+    that the current value is within in the range).
+
+    \sa minimum(), setRange()
+*/
+void QtDatePropertyManager::setMinimum(QtProperty *property, const QDate &minVal)
+{
+    setMinimumValue<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, QDate, QtDatePropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtDatePropertyManager::propertyChanged,
+                &QtDatePropertyManager::valueChanged,
+                &QtDatePropertyManager::rangeChanged,
+                property, minVal);
+}
+
+/*!
+    Sets the maximum value for the given \a property to \a maxVal.
+
+    When setting the maximum value, the minimum and current
+    values are adjusted if necessary (ensuring that the range remains
+    valid and that the current value is within in the range).
+
+    \sa maximum(), setRange()
+*/
+void QtDatePropertyManager::setMaximum(QtProperty *property, const QDate &maxVal)
+{
+    setMaximumValue<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, QDate, QtDatePropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtDatePropertyManager::propertyChanged,
+                &QtDatePropertyManager::valueChanged,
+                &QtDatePropertyManager::rangeChanged,
+                property, maxVal);
+}
+
+/*!
+    \fn void QtDatePropertyManager::setRange(QtProperty *property, const QDate &minimum, const QDate &maximum)
+
+    Sets the range of valid dates.
+
+    This is a convenience function defining the range of valid dates
+    in one go; setting the \a minimum and \a maximum values for the
+    given \a property with a single function call.
+
+    When setting a new date range, the current value is adjusted if
+    necessary (ensuring that the value remains in date range).
+
+    \sa setMinimum(), setMaximum(), rangeChanged()
+*/
+void QtDatePropertyManager::setRange(QtProperty *property, const QDate &minVal, const QDate &maxVal)
+{
+    void (QtDatePropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, const QDate &,
+          const QDate &, const QDate &) = 0;
+    setBorderValues<const QDate &, QtDatePropertyManagerPrivate, QtDatePropertyManager, QDate>(this, d_ptr.data(),
+                &QtDatePropertyManager::propertyChanged,
+                &QtDatePropertyManager::valueChanged,
+                &QtDatePropertyManager::rangeChanged,
+                property, minVal, maxVal, setSubPropertyRange);
+}
+
+/*!
+    \reimp
+*/
+void QtDatePropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtDatePropertyManagerPrivate::Data();
+}
+
+/*!
+    \reimp
+*/
+void QtDatePropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtTimePropertyManager
+
+class QtTimePropertyManagerPrivate
+{
+    QtTimePropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtTimePropertyManager)
+public:
+    explicit QtTimePropertyManagerPrivate(QtTimePropertyManager *q);
+
+    const QString m_format;
+
+    typedef QMap<const QtProperty *, QTime> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+QtTimePropertyManagerPrivate::QtTimePropertyManagerPrivate(QtTimePropertyManager *q) :
+    q_ptr(q),
+    m_format(QtPropertyBrowserUtils::timeFormat())
+{
+}
+
+/*!
+    \class QtTimePropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtTimePropertyManager provides and manages QTime properties.
+
+    A time property's value can be retrieved using the value()
+    function, and set using the setValue() slot.
+
+    In addition, QtTimePropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes.
+
+    \sa QtAbstractPropertyManager, QtTimeEditFactory
+*/
+
+/*!
+    \fn void QtTimePropertyManager::valueChanged(QtProperty *property, const QTime &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtTimePropertyManager::QtTimePropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtTimePropertyManagerPrivate(this))
+{
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtTimePropertyManager::~QtTimePropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns an invalid time object.
+
+    \sa setValue()
+*/
+QTime QtTimePropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QTime());
+}
+
+/*!
+    \reimp
+*/
+QString QtTimePropertyManager::valueText(const QtProperty *property) const
+{
+   const QtTimePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    return it.value().toString(d_ptr->m_format);
+}
+
+/*!
+    \fn void QtTimePropertyManager::setValue(QtProperty *property, const QTime &value)
+
+    Sets the value of the given \a property to \a value.
+
+    \sa value(), valueChanged()
+*/
+void QtTimePropertyManager::setValue(QtProperty *property, const QTime &val)
+{
+    setSimpleValue<const QTime &, QTime, QtTimePropertyManager>(d_ptr->m_values, this,
+                &QtTimePropertyManager::propertyChanged,
+                &QtTimePropertyManager::valueChanged,
+                property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtTimePropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QTime::currentTime();
+}
+
+/*!
+    \reimp
+*/
+void QtTimePropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtDateTimePropertyManager
+
+class QtDateTimePropertyManagerPrivate
+{
+    QtDateTimePropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtDateTimePropertyManager)
+public:
+    explicit QtDateTimePropertyManagerPrivate(QtDateTimePropertyManager *q);
+
+    const QString m_format;
+
+    typedef QMap<const QtProperty *, QDateTime> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+QtDateTimePropertyManagerPrivate::QtDateTimePropertyManagerPrivate(QtDateTimePropertyManager *q) :
+    q_ptr(q),
+    m_format(QtPropertyBrowserUtils::dateTimeFormat())
+{
+}
+
+/*! \class QtDateTimePropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtDateTimePropertyManager provides and manages QDateTime properties.
+
+    A date and time property has a current value which can be
+    retrieved using the value() function, and set using the setValue()
+    slot. In addition, QtDateTimePropertyManager provides the
+    valueChanged() signal which is emitted whenever a property created
+    by this manager changes.
+
+    \sa QtAbstractPropertyManager, QtDateTimeEditFactory, QtDatePropertyManager
+*/
+
+/*!
+    \fn void QtDateTimePropertyManager::valueChanged(QtProperty *property, const QDateTime &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtDateTimePropertyManager::QtDateTimePropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtDateTimePropertyManagerPrivate(this))
+{
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtDateTimePropertyManager::~QtDateTimePropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an invalid QDateTime object.
+
+    \sa setValue()
+*/
+QDateTime QtDateTimePropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QDateTime());
+}
+
+/*!
+    \reimp
+*/
+QString QtDateTimePropertyManager::valueText(const QtProperty *property) const
+{
+   const QtDateTimePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    return it.value().toString(d_ptr->m_format);
+}
+
+/*!
+    \fn void QtDateTimePropertyManager::setValue(QtProperty *property, const QDateTime &value)
+
+    Sets the value of the given \a property to \a value.
+
+    \sa value(), valueChanged()
+*/
+void QtDateTimePropertyManager::setValue(QtProperty *property, const QDateTime &val)
+{
+    setSimpleValue<const QDateTime &, QDateTime, QtDateTimePropertyManager>(d_ptr->m_values, this,
+                &QtDateTimePropertyManager::propertyChanged,
+                &QtDateTimePropertyManager::valueChanged,
+                property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtDateTimePropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QDateTime::currentDateTime();
+}
+
+/*!
+    \reimp
+*/
+void QtDateTimePropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtKeySequencePropertyManager
+
+class QtKeySequencePropertyManagerPrivate
+{
+    QtKeySequencePropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtKeySequencePropertyManager)
+public:
+
+    QString m_format;
+
+    typedef QMap<const QtProperty *, QKeySequence> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+/*! \class QtKeySequencePropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtKeySequencePropertyManager provides and manages QKeySequence properties.
+
+    A key sequence's value can be retrieved using the value()
+    function, and set using the setValue() slot.
+
+    In addition, QtKeySequencePropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes.
+
+    \sa QtAbstractPropertyManager
+*/
+
+/*!
+    \fn void QtKeySequencePropertyManager::valueChanged(QtProperty *property, const QKeySequence &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtKeySequencePropertyManager::QtKeySequencePropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtKeySequencePropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtKeySequencePropertyManager::~QtKeySequencePropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an empty QKeySequence object.
+
+    \sa setValue()
+*/
+QKeySequence QtKeySequencePropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QKeySequence());
+}
+
+/*!
+    \reimp
+*/
+QString QtKeySequencePropertyManager::valueText(const QtProperty *property) const
+{
+    const QtKeySequencePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    return it.value().toString(QKeySequence::NativeText);
+}
+
+/*!
+    \fn void QtKeySequencePropertyManager::setValue(QtProperty *property, const QKeySequence &value)
+
+    Sets the value of the given \a property to \a value.
+
+    \sa value(), valueChanged()
+*/
+void QtKeySequencePropertyManager::setValue(QtProperty *property, const QKeySequence &val)
+{
+    setSimpleValue<const QKeySequence &, QKeySequence, QtKeySequencePropertyManager>(d_ptr->m_values, this,
+                &QtKeySequencePropertyManager::propertyChanged,
+                &QtKeySequencePropertyManager::valueChanged,
+                property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtKeySequencePropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QKeySequence();
+}
+
+/*!
+    \reimp
+*/
+void QtKeySequencePropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtCharPropertyManager
+
+class QtCharPropertyManagerPrivate
+{
+    QtCharPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtCharPropertyManager)
+public:
+
+    typedef QMap<const QtProperty *, QChar> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+/*! \class QtCharPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtCharPropertyManager provides and manages QChar properties.
+
+    A char's value can be retrieved using the value()
+    function, and set using the setValue() slot.
+
+    In addition, QtCharPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes.
+
+    \sa QtAbstractPropertyManager
+*/
+
+/*!
+    \fn void QtCharPropertyManager::valueChanged(QtProperty *property, const QChar &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtCharPropertyManager::QtCharPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtCharPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtCharPropertyManager::~QtCharPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an null QChar object.
+
+    \sa setValue()
+*/
+QChar QtCharPropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QChar());
+}
+
+/*!
+    \reimp
+*/
+QString QtCharPropertyManager::valueText(const QtProperty *property) const
+{
+   const QtCharPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    const QChar c = it.value();
+    return c.isNull() ? QString() : QString(c);
+}
+
+/*!
+    \fn void QtCharPropertyManager::setValue(QtProperty *property, const QChar &value)
+
+    Sets the value of the given \a property to \a value.
+
+    \sa value(), valueChanged()
+*/
+void QtCharPropertyManager::setValue(QtProperty *property, const QChar &val)
+{
+    setSimpleValue<const QChar &, QChar, QtCharPropertyManager>(d_ptr->m_values, this,
+                &QtCharPropertyManager::propertyChanged,
+                &QtCharPropertyManager::valueChanged,
+                property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtCharPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QChar();
+}
+
+/*!
+    \reimp
+*/
+void QtCharPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtLocalePropertyManager
+
+class QtLocalePropertyManagerPrivate
+{
+    QtLocalePropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtLocalePropertyManager)
+public:
+
+    QtLocalePropertyManagerPrivate();
+
+    void slotEnumChanged(QtProperty *property, int value);
+    void slotPropertyDestroyed(QtProperty *property);
+
+    typedef QMap<const QtProperty *, QLocale> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtEnumPropertyManager *m_enumPropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToLanguage;
+    QMap<const QtProperty *, QtProperty *> m_propertyToCountry;
+
+    QMap<const QtProperty *, QtProperty *> m_languageToProperty;
+    QMap<const QtProperty *, QtProperty *> m_countryToProperty;
+};
+
+QtLocalePropertyManagerPrivate::QtLocalePropertyManagerPrivate()
+{
+}
+
+void QtLocalePropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value)
+{
+    if (QtProperty *prop = m_languageToProperty.value(property, 0)) {
+        const QLocale loc = m_values[prop];
+        QLocale::Language newLanguage = loc.language();
+        QLocale::Country newCountry = loc.country();
+        metaEnumProvider()->indexToLocale(value, 0, &newLanguage, 0);
+        QLocale newLoc(newLanguage, newCountry);
+        q_ptr->setValue(prop, newLoc);
+    } else if (QtProperty *prop = m_countryToProperty.value(property, 0)) {
+        const QLocale loc = m_values[prop];
+        QLocale::Language newLanguage = loc.language();
+        QLocale::Country newCountry = loc.country();
+        metaEnumProvider()->indexToLocale(m_enumPropertyManager->value(m_propertyToLanguage.value(prop)), value, &newLanguage, &newCountry);
+        QLocale newLoc(newLanguage, newCountry);
+        q_ptr->setValue(prop, newLoc);
+    }
+}
+
+void QtLocalePropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *subProp = m_languageToProperty.value(property, 0)) {
+        m_propertyToLanguage[subProp] = 0;
+        m_languageToProperty.remove(property);
+    } else if (QtProperty *subProp = m_countryToProperty.value(property, 0)) {
+        m_propertyToCountry[subProp] = 0;
+        m_countryToProperty.remove(property);
+    }
+}
+
+/*!
+    \class QtLocalePropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtLocalePropertyManager provides and manages QLocale properties.
+
+    A locale property has nested \e language and \e country
+    subproperties. The top-level property's value can be retrieved
+    using the value() function, and set using the setValue() slot.
+
+    The subproperties are created by QtEnumPropertyManager object.
+    These submanager can be retrieved using the subEnumPropertyManager()
+    function. In order to provide editing widgets for the subproperties
+    in a property browser widget, this manager must be associated with editor factory.
+
+    In addition, QtLocalePropertyManager provides the valueChanged()
+    signal which is emitted whenever a property created by this
+    manager changes.
+
+    \sa QtAbstractPropertyManager, QtEnumPropertyManager
+*/
+
+/*!
+    \fn void QtLocalePropertyManager::valueChanged(QtProperty *property, const QLocale &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtLocalePropertyManager::QtLocalePropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtLocalePropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this);
+    connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotEnumChanged(QtProperty*,int)));
+
+    connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtLocalePropertyManager::~QtLocalePropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e language
+    and \e country subproperties.
+
+    In order to provide editing widgets for the mentioned subproperties
+    in a property browser widget, this manager must be associated with
+    an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtEnumPropertyManager *QtLocalePropertyManager::subEnumPropertyManager() const
+{
+    return d_ptr->m_enumPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns the default locale.
+
+    \sa setValue()
+*/
+QLocale QtLocalePropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QLocale());
+}
+
+/*!
+    \reimp
+*/
+QString QtLocalePropertyManager::valueText(const QtProperty *property) const
+{
+    const QtLocalePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    const QLocale loc = it.value();
+
+    int langIdx = 0;
+    int countryIdx = 0;
+    const QtMetaEnumProvider *me = metaEnumProvider();
+    me->localeToIndex(loc.language(), loc.country(), &langIdx, &countryIdx);
+    if (langIdx < 0) {
+        qWarning("QtLocalePropertyManager::valueText: Unknown language %d", loc.language());
+        return tr("<Invalid>");
+    }
+    const QString languageName = me->languageEnumNames().at(langIdx);
+    if (countryIdx < 0) {
+        qWarning("QtLocalePropertyManager::valueText: Unknown country %d for %s", loc.country(), qPrintable(languageName));
+        return languageName;
+    }
+    const QString countryName = me->countryEnumNames(loc.language()).at(countryIdx);
+    return tr("%1, %2").arg(languageName, countryName);
+}
+
+/*!
+    \fn void QtLocalePropertyManager::setValue(QtProperty *property, const QLocale &value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    \sa value(), valueChanged()
+*/
+void QtLocalePropertyManager::setValue(QtProperty *property, const QLocale &val)
+{
+    const QtLocalePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    const QLocale loc = it.value();
+    if (loc == val)
+        return;
+
+    it.value() = val;
+
+    int langIdx = 0;
+    int countryIdx = 0;
+    metaEnumProvider()->localeToIndex(val.language(), val.country(), &langIdx, &countryIdx);
+    if (loc.language() != val.language()) {
+        d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToLanguage.value(property), langIdx);
+        d_ptr->m_enumPropertyManager->setEnumNames(d_ptr->m_propertyToCountry.value(property),
+                    metaEnumProvider()->countryEnumNames(val.language()));
+    }
+    d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToCountry.value(property), countryIdx);
+
+    emit propertyChanged(property);
+    emit valueChanged(property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtLocalePropertyManager::initializeProperty(QtProperty *property)
+{
+    QLocale val;
+    d_ptr->m_values[property] = val;
+
+    int langIdx = 0;
+    int countryIdx = 0;
+    metaEnumProvider()->localeToIndex(val.language(), val.country(), &langIdx, &countryIdx);
+
+    QtProperty *languageProp = d_ptr->m_enumPropertyManager->addProperty();
+    languageProp->setPropertyName(tr("Language"));
+    d_ptr->m_enumPropertyManager->setEnumNames(languageProp, metaEnumProvider()->languageEnumNames());
+    d_ptr->m_enumPropertyManager->setValue(languageProp, langIdx);
+    d_ptr->m_propertyToLanguage[property] = languageProp;
+    d_ptr->m_languageToProperty[languageProp] = property;
+    property->addSubProperty(languageProp);
+
+    QtProperty *countryProp = d_ptr->m_enumPropertyManager->addProperty();
+    countryProp->setPropertyName(tr("Country"));
+    d_ptr->m_enumPropertyManager->setEnumNames(countryProp, metaEnumProvider()->countryEnumNames(val.language()));
+    d_ptr->m_enumPropertyManager->setValue(countryProp, countryIdx);
+    d_ptr->m_propertyToCountry[property] = countryProp;
+    d_ptr->m_countryToProperty[countryProp] = property;
+    property->addSubProperty(countryProp);
+}
+
+/*!
+    \reimp
+*/
+void QtLocalePropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *languageProp = d_ptr->m_propertyToLanguage[property];
+    if (languageProp) {
+        d_ptr->m_languageToProperty.remove(languageProp);
+        delete languageProp;
+    }
+    d_ptr->m_propertyToLanguage.remove(property);
+
+    QtProperty *countryProp = d_ptr->m_propertyToCountry[property];
+    if (countryProp) {
+        d_ptr->m_countryToProperty.remove(countryProp);
+        delete countryProp;
+    }
+    d_ptr->m_propertyToCountry.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtPointPropertyManager
+
+class QtPointPropertyManagerPrivate
+{
+    QtPointPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtPointPropertyManager)
+public:
+
+    void slotIntChanged(QtProperty *property, int value);
+    void slotPropertyDestroyed(QtProperty *property);
+
+    typedef QMap<const QtProperty *, QPoint> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtIntPropertyManager *m_intPropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToX;
+    QMap<const QtProperty *, QtProperty *> m_propertyToY;
+
+    QMap<const QtProperty *, QtProperty *> m_xToProperty;
+    QMap<const QtProperty *, QtProperty *> m_yToProperty;
+};
+
+void QtPointPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
+{
+    if (QtProperty *xprop = m_xToProperty.value(property, 0)) {
+        QPoint p = m_values[xprop];
+        p.setX(value);
+        q_ptr->setValue(xprop, p);
+    } else if (QtProperty *yprop = m_yToProperty.value(property, 0)) {
+        QPoint p = m_values[yprop];
+        p.setY(value);
+        q_ptr->setValue(yprop, p);
+    }
+}
+
+void QtPointPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_xToProperty.value(property, 0)) {
+        m_propertyToX[pointProp] = 0;
+        m_xToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
+        m_propertyToY[pointProp] = 0;
+        m_yToProperty.remove(property);
+    }
+}
+
+/*! \class QtPointPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtPointPropertyManager provides and manages QPoint properties.
+
+    A point property has nested \e x and \e y subproperties. The
+    top-level property's value can be retrieved using the value()
+    function, and set using the setValue() slot.
+
+    The subproperties are created by a QtIntPropertyManager object. This
+    manager can be retrieved using the subIntPropertyManager() function. In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    In addition, QtPointPropertyManager provides the valueChanged() signal which
+    is emitted whenever a property created by this manager changes.
+
+    \sa QtAbstractPropertyManager, QtIntPropertyManager, QtPointFPropertyManager
+*/
+
+/*!
+    \fn void QtPointPropertyManager::valueChanged(QtProperty *property, const QPoint &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtPointPropertyManager::QtPointPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtPointPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
+    connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotIntChanged(QtProperty*,int)));
+    connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtPointPropertyManager::~QtPointPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e x and \e y
+    subproperties.
+
+    In order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtIntPropertyManager *QtPointPropertyManager::subIntPropertyManager() const
+{
+    return d_ptr->m_intPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns a point with coordinates (0, 0).
+
+    \sa setValue()
+*/
+QPoint QtPointPropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QPoint());
+}
+
+/*!
+    \reimp
+*/
+QString QtPointPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtPointPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    const QPoint v = it.value();
+    return tr("(%1, %2)").arg(QString::number(v.x()))
+                         .arg(QString::number(v.y()));
+}
+
+/*!
+    \fn void QtPointPropertyManager::setValue(QtProperty *property, const QPoint &value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    \sa value(), valueChanged()
+*/
+void QtPointPropertyManager::setValue(QtProperty *property, const QPoint &val)
+{
+    const QtPointPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    if (it.value() == val)
+        return;
+
+    it.value() = val;
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToX[property], val.x());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToY[property], val.y());
+
+    emit propertyChanged(property);
+    emit valueChanged(property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtPointPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QPoint(0, 0);
+
+    QtProperty *xProp = d_ptr->m_intPropertyManager->addProperty();
+    xProp->setPropertyName(tr("X"));
+    d_ptr->m_intPropertyManager->setValue(xProp, 0);
+    d_ptr->m_propertyToX[property] = xProp;
+    d_ptr->m_xToProperty[xProp] = property;
+    property->addSubProperty(xProp);
+
+    QtProperty *yProp = d_ptr->m_intPropertyManager->addProperty();
+    yProp->setPropertyName(tr("Y"));
+    d_ptr->m_intPropertyManager->setValue(yProp, 0);
+    d_ptr->m_propertyToY[property] = yProp;
+    d_ptr->m_yToProperty[yProp] = property;
+    property->addSubProperty(yProp);
+}
+
+/*!
+    \reimp
+*/
+void QtPointPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *xProp = d_ptr->m_propertyToX[property];
+    if (xProp) {
+        d_ptr->m_xToProperty.remove(xProp);
+        delete xProp;
+    }
+    d_ptr->m_propertyToX.remove(property);
+
+    QtProperty *yProp = d_ptr->m_propertyToY[property];
+    if (yProp) {
+        d_ptr->m_yToProperty.remove(yProp);
+        delete yProp;
+    }
+    d_ptr->m_propertyToY.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtPointFPropertyManager
+
+class QtPointFPropertyManagerPrivate
+{
+    QtPointFPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtPointFPropertyManager)
+public:
+
+    struct Data
+    {
+        Data() : decimals(2) {}
+        QPointF val;
+        int decimals;
+    };
+
+    void slotDoubleChanged(QtProperty *property, double value);
+    void slotPropertyDestroyed(QtProperty *property);
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtDoublePropertyManager *m_doublePropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToX;
+    QMap<const QtProperty *, QtProperty *> m_propertyToY;
+
+    QMap<const QtProperty *, QtProperty *> m_xToProperty;
+    QMap<const QtProperty *, QtProperty *> m_yToProperty;
+};
+
+void QtPointFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value)
+{
+    if (QtProperty *prop = m_xToProperty.value(property, 0)) {
+        QPointF p = m_values[prop].val;
+        p.setX(value);
+        q_ptr->setValue(prop, p);
+    } else if (QtProperty *prop = m_yToProperty.value(property, 0)) {
+        QPointF p = m_values[prop].val;
+        p.setY(value);
+        q_ptr->setValue(prop, p);
+    }
+}
+
+void QtPointFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp  = m_xToProperty.value(property, 0)) {
+        m_propertyToX[pointProp] = 0;
+        m_xToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
+        m_propertyToY[pointProp] = 0;
+        m_yToProperty.remove(property);
+    }
+}
+
+/*! \class QtPointFPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtPointFPropertyManager provides and manages QPointF properties.
+
+    A point property has nested \e x and \e y subproperties. The
+    top-level property's value can be retrieved using the value()
+    function, and set using the setValue() slot.
+
+    The subproperties are created by a QtDoublePropertyManager object. This
+    manager can be retrieved using the subDoublePropertyManager() function. In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    In addition, QtPointFPropertyManager provides the valueChanged() signal which
+    is emitted whenever a property created by this manager changes.
+
+    \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtPointPropertyManager
+*/
+
+/*!
+    \fn void QtPointFPropertyManager::valueChanged(QtProperty *property, const QPointF &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtPointFPropertyManager::decimalsChanged(QtProperty *property, int prec)
+
+    This signal is emitted whenever a property created by this manager
+    changes its precision of value, passing a pointer to the
+    \a property and the new \a prec value
+
+    \sa setDecimals()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtPointFPropertyManager::QtPointFPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtPointFPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this);
+    connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotDoubleChanged(QtProperty*,double)));
+    connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtPointFPropertyManager::~QtPointFPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e x and \e y
+    subproperties.
+
+    In order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtDoublePropertyManager *QtPointFPropertyManager::subDoublePropertyManager() const
+{
+    return d_ptr->m_doublePropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns a point with coordinates (0, 0).
+
+    \sa setValue()
+*/
+QPointF QtPointFPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<QPointF>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's precision, in decimals.
+
+    \sa setDecimals()
+*/
+int QtPointFPropertyManager::decimals(const QtProperty *property) const
+{
+    return getData<int>(d_ptr->m_values, &QtPointFPropertyManagerPrivate::Data::decimals, property, 0);
+}
+
+/*!
+    \reimp
+*/
+QString QtPointFPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtPointFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    const QPointF v = it.value().val;
+    const int dec =  it.value().decimals;
+    return tr("(%1, %2)").arg(QString::number(v.x(), 'f', dec))
+                         .arg(QString::number(v.y(), 'f', dec));
+}
+
+/*!
+    \fn void QtPointFPropertyManager::setValue(QtProperty *property, const QPointF &value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    \sa value(), valueChanged()
+*/
+void QtPointFPropertyManager::setValue(QtProperty *property, const QPointF &val)
+{
+    const QtPointFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    if (it.value().val == val)
+        return;
+
+    it.value().val = val;
+    d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToX[property], val.x());
+    d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToY[property], val.y());
+
+    emit propertyChanged(property);
+    emit valueChanged(property, val);
+}
+
+/*!
+    \fn void QtPointFPropertyManager::setDecimals(QtProperty *property, int prec)
+
+    Sets the precision of the given \a property to \a prec.
+
+    The valid decimal range is 0-13. The default is 2.
+
+    \sa decimals()
+*/
+void QtPointFPropertyManager::setDecimals(QtProperty *property, int prec)
+{
+    const QtPointFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtPointFPropertyManagerPrivate::Data data = it.value();
+
+    if (prec > 13)
+        prec = 13;
+    else if (prec < 0)
+        prec = 0;
+
+    if (data.decimals == prec)
+        return;
+
+    data.decimals = prec;
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToX[property], prec);
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToY[property], prec);
+
+    it.value() = data;
+
+    emit decimalsChanged(property, data.decimals);
+}
+
+/*!
+    \reimp
+*/
+void QtPointFPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtPointFPropertyManagerPrivate::Data();
+
+    QtProperty *xProp = d_ptr->m_doublePropertyManager->addProperty();
+    xProp->setPropertyName(tr("X"));
+    d_ptr->m_doublePropertyManager->setDecimals(xProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(xProp, 0);
+    d_ptr->m_propertyToX[property] = xProp;
+    d_ptr->m_xToProperty[xProp] = property;
+    property->addSubProperty(xProp);
+
+    QtProperty *yProp = d_ptr->m_doublePropertyManager->addProperty();
+    yProp->setPropertyName(tr("Y"));
+    d_ptr->m_doublePropertyManager->setDecimals(yProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(yProp, 0);
+    d_ptr->m_propertyToY[property] = yProp;
+    d_ptr->m_yToProperty[yProp] = property;
+    property->addSubProperty(yProp);
+}
+
+/*!
+    \reimp
+*/
+void QtPointFPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *xProp = d_ptr->m_propertyToX[property];
+    if (xProp) {
+        d_ptr->m_xToProperty.remove(xProp);
+        delete xProp;
+    }
+    d_ptr->m_propertyToX.remove(property);
+
+    QtProperty *yProp = d_ptr->m_propertyToY[property];
+    if (yProp) {
+        d_ptr->m_yToProperty.remove(yProp);
+        delete yProp;
+    }
+    d_ptr->m_propertyToY.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtSizePropertyManager
+
+class QtSizePropertyManagerPrivate
+{
+    QtSizePropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtSizePropertyManager)
+public:
+
+    void slotIntChanged(QtProperty *property, int value);
+    void slotPropertyDestroyed(QtProperty *property);
+    void setValue(QtProperty *property, const QSize &val);
+    void setRange(QtProperty *property,
+                const QSize &minVal, const QSize &maxVal, const QSize &val);
+
+    struct Data
+    {
+        Data() : val(QSize(0, 0)), minVal(QSize(0, 0)), maxVal(QSize(INT_MAX, INT_MAX)) {}
+        QSize val;
+        QSize minVal;
+        QSize maxVal;
+        QSize minimumValue() const { return minVal; }
+        QSize maximumValue() const { return maxVal; }
+        void setMinimumValue(const QSize &newMinVal) { setSizeMinimumData(this, newMinVal); }
+        void setMaximumValue(const QSize &newMaxVal) { setSizeMaximumData(this, newMaxVal); }
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtIntPropertyManager *m_intPropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToW;
+    QMap<const QtProperty *, QtProperty *> m_propertyToH;
+
+    QMap<const QtProperty *, QtProperty *> m_wToProperty;
+    QMap<const QtProperty *, QtProperty *> m_hToProperty;
+};
+
+void QtSizePropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
+{
+    if (QtProperty *prop = m_wToProperty.value(property, 0)) {
+        QSize s = m_values[prop].val;
+        s.setWidth(value);
+        q_ptr->setValue(prop, s);
+    } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
+        QSize s = m_values[prop].val;
+        s.setHeight(value);
+        q_ptr->setValue(prop, s);
+    }
+}
+
+void QtSizePropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
+        m_propertyToW[pointProp] = 0;
+        m_wToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
+        m_propertyToH[pointProp] = 0;
+        m_hToProperty.remove(property);
+    }
+}
+
+void QtSizePropertyManagerPrivate::setValue(QtProperty *property, const QSize &val)
+{
+    m_intPropertyManager->setValue(m_propertyToW.value(property), val.width());
+    m_intPropertyManager->setValue(m_propertyToH.value(property), val.height());
+}
+
+void QtSizePropertyManagerPrivate::setRange(QtProperty *property,
+                const QSize &minVal, const QSize &maxVal, const QSize &val)
+{
+    QtProperty *wProperty = m_propertyToW.value(property);
+    QtProperty *hProperty = m_propertyToH.value(property);
+    m_intPropertyManager->setRange(wProperty, minVal.width(), maxVal.width());
+    m_intPropertyManager->setValue(wProperty, val.width());
+    m_intPropertyManager->setRange(hProperty, minVal.height(), maxVal.height());
+    m_intPropertyManager->setValue(hProperty, val.height());
+}
+
+/*!
+    \class QtSizePropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtSizePropertyManager provides and manages QSize properties.
+
+    A size property has nested \e width and \e height
+    subproperties. The top-level property's value can be retrieved
+    using the value() function, and set using the setValue() slot.
+
+    The subproperties are created by a QtIntPropertyManager object. This
+    manager can be retrieved using the subIntPropertyManager() function. In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    A size property also has a range of valid values defined by a
+    minimum size and a maximum size. These sizes can be retrieved
+    using the minimum() and the maximum() functions, and set using the
+    setMinimum() and setMaximum() slots. Alternatively, the range can
+    be defined in one go using the setRange() slot.
+
+    In addition, QtSizePropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the rangeChanged() signal which is emitted whenever
+    such a property changes its range of valid sizes.
+
+    \sa QtAbstractPropertyManager, QtIntPropertyManager, QtSizeFPropertyManager
+*/
+
+/*!
+    \fn void QtSizePropertyManager::valueChanged(QtProperty *property, const QSize &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtSizePropertyManager::rangeChanged(QtProperty *property, const QSize &minimum, const QSize &maximum)
+
+    This signal is emitted whenever a property created by this manager
+    changes its range of valid sizes, passing a pointer to the \a
+    property and the new \a minimum and \a maximum sizes.
+
+    \sa setRange()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtSizePropertyManager::QtSizePropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtSizePropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
+    connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotIntChanged(QtProperty*,int)));
+    connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtSizePropertyManager::~QtSizePropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e width and \e height
+    subproperties.
+
+    In order to provide editing widgets for the \e width and \e height
+    properties in a property browser widget, this manager must be
+    associated with an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtIntPropertyManager *QtSizePropertyManager::subIntPropertyManager() const
+{
+    return d_ptr->m_intPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an invalid size
+
+    \sa setValue()
+*/
+QSize QtSizePropertyManager::value(const QtProperty *property) const
+{
+    return getValue<QSize>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's minimum size value.
+
+    \sa setMinimum(), maximum(), setRange()
+*/
+QSize QtSizePropertyManager::minimum(const QtProperty *property) const
+{
+    return getMinimum<QSize>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's maximum size value.
+
+    \sa setMaximum(), minimum(), setRange()
+*/
+QSize QtSizePropertyManager::maximum(const QtProperty *property) const
+{
+    return getMaximum<QSize>(d_ptr->m_values, property);
+}
+
+/*!
+    \reimp
+*/
+QString QtSizePropertyManager::valueText(const QtProperty *property) const
+{
+    const QtSizePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    const QSize v = it.value().val;
+    return tr("%1 x %2").arg(QString::number(v.width()))
+                        .arg(QString::number(v.height()));
+}
+
+/*!
+    \fn void QtSizePropertyManager::setValue(QtProperty *property, const QSize &value)
+
+    Sets the value of the given \a property to \a value.
+
+    If the specified \a value is not valid according to the given \a
+    property's size range, the \a value is adjusted to the nearest
+    valid value within the size range.
+
+    \sa value(), setRange(), valueChanged()
+*/
+void QtSizePropertyManager::setValue(QtProperty *property, const QSize &val)
+{
+    setValueInRange<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, const QSize>(this, d_ptr.data(),
+                &QtSizePropertyManager::propertyChanged,
+                &QtSizePropertyManager::valueChanged,
+                property, val, &QtSizePropertyManagerPrivate::setValue);
+}
+
+/*!
+    Sets the minimum size value for the given \a property to \a minVal.
+
+    When setting the minimum size value, the maximum and current
+    values are adjusted if necessary (ensuring that the size range
+    remains valid and that the current value is within the range).
+
+    \sa minimum(), setRange(), rangeChanged()
+*/
+void QtSizePropertyManager::setMinimum(QtProperty *property, const QSize &minVal)
+{
+    setBorderValue<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, QSize, QtSizePropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtSizePropertyManager::propertyChanged,
+                &QtSizePropertyManager::valueChanged,
+                &QtSizePropertyManager::rangeChanged,
+                property,
+                &QtSizePropertyManagerPrivate::Data::minimumValue,
+                &QtSizePropertyManagerPrivate::Data::setMinimumValue,
+                minVal, &QtSizePropertyManagerPrivate::setRange);
+}
+
+/*!
+    Sets the maximum size value for the given \a property to \a maxVal.
+
+    When setting the maximum size value, the minimum and current
+    values are adjusted if necessary (ensuring that the size range
+    remains valid and that the current value is within the range).
+
+    \sa maximum(), setRange(), rangeChanged()
+*/
+void QtSizePropertyManager::setMaximum(QtProperty *property, const QSize &maxVal)
+{
+    setBorderValue<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, QSize, QtSizePropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtSizePropertyManager::propertyChanged,
+                &QtSizePropertyManager::valueChanged,
+                &QtSizePropertyManager::rangeChanged,
+                property,
+                &QtSizePropertyManagerPrivate::Data::maximumValue,
+                &QtSizePropertyManagerPrivate::Data::setMaximumValue,
+                maxVal, &QtSizePropertyManagerPrivate::setRange);
+}
+
+/*!
+    \fn void QtSizePropertyManager::setRange(QtProperty *property, const QSize &minimum, const QSize &maximum)
+
+    Sets the range of valid values.
+
+    This is a convenience function defining the range of valid values
+    in one go; setting the \a minimum and \a maximum values for the
+    given \a property with a single function call.
+
+    When setting a new range, the current value is adjusted if
+    necessary (ensuring that the value remains within the range).
+
+    \sa setMinimum(), setMaximum(), rangeChanged()
+*/
+void QtSizePropertyManager::setRange(QtProperty *property, const QSize &minVal, const QSize &maxVal)
+{
+    setBorderValues<const QSize &, QtSizePropertyManagerPrivate, QtSizePropertyManager, QSize>(this, d_ptr.data(),
+                &QtSizePropertyManager::propertyChanged,
+                &QtSizePropertyManager::valueChanged,
+                &QtSizePropertyManager::rangeChanged,
+                property, minVal, maxVal, &QtSizePropertyManagerPrivate::setRange);
+}
+
+/*!
+    \reimp
+*/
+void QtSizePropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtSizePropertyManagerPrivate::Data();
+
+    QtProperty *wProp = d_ptr->m_intPropertyManager->addProperty();
+    wProp->setPropertyName(tr("Width"));
+    d_ptr->m_intPropertyManager->setValue(wProp, 0);
+    d_ptr->m_intPropertyManager->setMinimum(wProp, 0);
+    d_ptr->m_propertyToW[property] = wProp;
+    d_ptr->m_wToProperty[wProp] = property;
+    property->addSubProperty(wProp);
+
+    QtProperty *hProp = d_ptr->m_intPropertyManager->addProperty();
+    hProp->setPropertyName(tr("Height"));
+    d_ptr->m_intPropertyManager->setValue(hProp, 0);
+    d_ptr->m_intPropertyManager->setMinimum(hProp, 0);
+    d_ptr->m_propertyToH[property] = hProp;
+    d_ptr->m_hToProperty[hProp] = property;
+    property->addSubProperty(hProp);
+}
+
+/*!
+    \reimp
+*/
+void QtSizePropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *wProp = d_ptr->m_propertyToW[property];
+    if (wProp) {
+        d_ptr->m_wToProperty.remove(wProp);
+        delete wProp;
+    }
+    d_ptr->m_propertyToW.remove(property);
+
+    QtProperty *hProp = d_ptr->m_propertyToH[property];
+    if (hProp) {
+        d_ptr->m_hToProperty.remove(hProp);
+        delete hProp;
+    }
+    d_ptr->m_propertyToH.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtSizeFPropertyManager
+
+class QtSizeFPropertyManagerPrivate
+{
+    QtSizeFPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtSizeFPropertyManager)
+public:
+
+    void slotDoubleChanged(QtProperty *property, double value);
+    void slotPropertyDestroyed(QtProperty *property);
+    void setValue(QtProperty *property, const QSizeF &val);
+    void setRange(QtProperty *property,
+                const QSizeF &minVal, const QSizeF &maxVal, const QSizeF &val);
+
+    struct Data
+    {
+        Data() : val(QSizeF(0, 0)), minVal(QSizeF(0, 0)), maxVal(QSizeF(INT_MAX, INT_MAX)), decimals(2) {}
+        QSizeF val;
+        QSizeF minVal;
+        QSizeF maxVal;
+        int decimals;
+        QSizeF minimumValue() const { return minVal; }
+        QSizeF maximumValue() const { return maxVal; }
+        void setMinimumValue(const QSizeF &newMinVal) { setSizeMinimumData(this, newMinVal); }
+        void setMaximumValue(const QSizeF &newMaxVal) { setSizeMaximumData(this, newMaxVal); }
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtDoublePropertyManager *m_doublePropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToW;
+    QMap<const QtProperty *, QtProperty *> m_propertyToH;
+
+    QMap<const QtProperty *, QtProperty *> m_wToProperty;
+    QMap<const QtProperty *, QtProperty *> m_hToProperty;
+};
+
+void QtSizeFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value)
+{
+    if (QtProperty *prop = m_wToProperty.value(property, 0)) {
+        QSizeF s = m_values[prop].val;
+        s.setWidth(value);
+        q_ptr->setValue(prop, s);
+    } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
+        QSizeF s = m_values[prop].val;
+        s.setHeight(value);
+        q_ptr->setValue(prop, s);
+    }
+}
+
+void QtSizeFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
+        m_propertyToW[pointProp] = 0;
+        m_wToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
+        m_propertyToH[pointProp] = 0;
+        m_hToProperty.remove(property);
+    }
+}
+
+void QtSizeFPropertyManagerPrivate::setValue(QtProperty *property, const QSizeF &val)
+{
+    m_doublePropertyManager->setValue(m_propertyToW.value(property), val.width());
+    m_doublePropertyManager->setValue(m_propertyToH.value(property), val.height());
+}
+
+void QtSizeFPropertyManagerPrivate::setRange(QtProperty *property,
+                const QSizeF &minVal, const QSizeF &maxVal, const QSizeF &val)
+{
+    m_doublePropertyManager->setRange(m_propertyToW[property], minVal.width(), maxVal.width());
+    m_doublePropertyManager->setValue(m_propertyToW[property], val.width());
+    m_doublePropertyManager->setRange(m_propertyToH[property], minVal.height(), maxVal.height());
+    m_doublePropertyManager->setValue(m_propertyToH[property], val.height());
+}
+
+/*!
+    \class QtSizeFPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtSizeFPropertyManager provides and manages QSizeF properties.
+
+    A size property has nested \e width and \e height
+    subproperties. The top-level property's value can be retrieved
+    using the value() function, and set using the setValue() slot.
+
+    The subproperties are created by a QtDoublePropertyManager object. This
+    manager can be retrieved using the subDoublePropertyManager() function. In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    A size property also has a range of valid values defined by a
+    minimum size and a maximum size. These sizes can be retrieved
+    using the minimum() and the maximum() functions, and set using the
+    setMinimum() and setMaximum() slots. Alternatively, the range can
+    be defined in one go using the setRange() slot.
+
+    In addition, QtSizeFPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the rangeChanged() signal which is emitted whenever
+    such a property changes its range of valid sizes.
+
+    \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtSizePropertyManager
+*/
+
+/*!
+    \fn void QtSizeFPropertyManager::valueChanged(QtProperty *property, const QSizeF &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtSizeFPropertyManager::rangeChanged(QtProperty *property, const QSizeF &minimum, const QSizeF &maximum)
+
+    This signal is emitted whenever a property created by this manager
+    changes its range of valid sizes, passing a pointer to the \a
+    property and the new \a minimum and \a maximum sizes.
+
+    \sa setRange()
+*/
+
+/*!
+    \fn void QtSizeFPropertyManager::decimalsChanged(QtProperty *property, int prec)
+
+    This signal is emitted whenever a property created by this manager
+    changes its precision of value, passing a pointer to the
+    \a property and the new \a prec value
+
+    \sa setDecimals()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtSizeFPropertyManager::QtSizeFPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtSizeFPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this);
+    connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotDoubleChanged(QtProperty*,double)));
+    connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtSizeFPropertyManager::~QtSizeFPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e width and \e height
+    subproperties.
+
+    In order to provide editing widgets for the \e width and \e height
+    properties in a property browser widget, this manager must be
+    associated with an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtDoublePropertyManager *QtSizeFPropertyManager::subDoublePropertyManager() const
+{
+    return d_ptr->m_doublePropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an invalid size
+
+    \sa setValue()
+*/
+QSizeF QtSizeFPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<QSizeF>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's precision, in decimals.
+
+    \sa setDecimals()
+*/
+int QtSizeFPropertyManager::decimals(const QtProperty *property) const
+{
+    return getData<int>(d_ptr->m_values, &QtSizeFPropertyManagerPrivate::Data::decimals, property, 0);
+}
+
+/*!
+    Returns the given \a property's minimum size value.
+
+    \sa setMinimum(), maximum(), setRange()
+*/
+QSizeF QtSizeFPropertyManager::minimum(const QtProperty *property) const
+{
+    return getMinimum<QSizeF>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's maximum size value.
+
+    \sa setMaximum(), minimum(), setRange()
+*/
+QSizeF QtSizeFPropertyManager::maximum(const QtProperty *property) const
+{
+    return getMaximum<QSizeF>(d_ptr->m_values, property);
+}
+
+/*!
+    \reimp
+*/
+QString QtSizeFPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtSizeFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    const QSizeF v = it.value().val;
+    const int dec = it.value().decimals;
+    return tr("%1 x %2").arg(QString::number(v.width(), 'f', dec))
+                        .arg(QString::number(v.height(), 'f', dec));
+}
+
+/*!
+    \fn void QtSizeFPropertyManager::setValue(QtProperty *property, const QSizeF &value)
+
+    Sets the value of the given \a property to \a value.
+
+    If the specified \a value is not valid according to the given \a
+    property's size range, the \a value is adjusted to the nearest
+    valid value within the size range.
+
+    \sa value(), setRange(), valueChanged()
+*/
+void QtSizeFPropertyManager::setValue(QtProperty *property, const QSizeF &val)
+{
+    setValueInRange<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF>(this, d_ptr.data(),
+                &QtSizeFPropertyManager::propertyChanged,
+                &QtSizeFPropertyManager::valueChanged,
+                property, val, &QtSizeFPropertyManagerPrivate::setValue);
+}
+
+/*!
+    \fn void QtSizeFPropertyManager::setDecimals(QtProperty *property, int prec)
+
+    Sets the precision of the given \a property to \a prec.
+
+    The valid decimal range is 0-13. The default is 2.
+
+    \sa decimals()
+*/
+void QtSizeFPropertyManager::setDecimals(QtProperty *property, int prec)
+{
+    const QtSizeFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtSizeFPropertyManagerPrivate::Data data = it.value();
+
+    if (prec > 13)
+        prec = 13;
+    else if (prec < 0)
+        prec = 0;
+
+    if (data.decimals == prec)
+        return;
+
+    data.decimals = prec;
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToW[property], prec);
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToH[property], prec);
+
+    it.value() = data;
+
+    emit decimalsChanged(property, data.decimals);
+}
+
+/*!
+    Sets the minimum size value for the given \a property to \a minVal.
+
+    When setting the minimum size value, the maximum and current
+    values are adjusted if necessary (ensuring that the size range
+    remains valid and that the current value is within the range).
+
+    \sa minimum(), setRange(), rangeChanged()
+*/
+void QtSizeFPropertyManager::setMinimum(QtProperty *property, const QSizeF &minVal)
+{
+    setBorderValue<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF, QtSizeFPropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtSizeFPropertyManager::propertyChanged,
+                &QtSizeFPropertyManager::valueChanged,
+                &QtSizeFPropertyManager::rangeChanged,
+                property,
+                &QtSizeFPropertyManagerPrivate::Data::minimumValue,
+                &QtSizeFPropertyManagerPrivate::Data::setMinimumValue,
+                minVal, &QtSizeFPropertyManagerPrivate::setRange);
+}
+
+/*!
+    Sets the maximum size value for the given \a property to \a maxVal.
+
+    When setting the maximum size value, the minimum and current
+    values are adjusted if necessary (ensuring that the size range
+    remains valid and that the current value is within the range).
+
+    \sa maximum(), setRange(), rangeChanged()
+*/
+void QtSizeFPropertyManager::setMaximum(QtProperty *property, const QSizeF &maxVal)
+{
+    setBorderValue<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF, QtSizeFPropertyManagerPrivate::Data>(this, d_ptr.data(),
+                &QtSizeFPropertyManager::propertyChanged,
+                &QtSizeFPropertyManager::valueChanged,
+                &QtSizeFPropertyManager::rangeChanged,
+                property,
+                &QtSizeFPropertyManagerPrivate::Data::maximumValue,
+                &QtSizeFPropertyManagerPrivate::Data::setMaximumValue,
+                maxVal, &QtSizeFPropertyManagerPrivate::setRange);
+}
+
+/*!
+    \fn void QtSizeFPropertyManager::setRange(QtProperty *property, const QSizeF &minimum, const QSizeF &maximum)
+
+    Sets the range of valid values.
+
+    This is a convenience function defining the range of valid values
+    in one go; setting the \a minimum and \a maximum values for the
+    given \a property with a single function call.
+
+    When setting a new range, the current value is adjusted if
+    necessary (ensuring that the value remains within the range).
+
+    \sa setMinimum(), setMaximum(), rangeChanged()
+*/
+void QtSizeFPropertyManager::setRange(QtProperty *property, const QSizeF &minVal, const QSizeF &maxVal)
+{
+    setBorderValues<const QSizeF &, QtSizeFPropertyManagerPrivate, QtSizeFPropertyManager, QSizeF>(this, d_ptr.data(),
+                &QtSizeFPropertyManager::propertyChanged,
+                &QtSizeFPropertyManager::valueChanged,
+                &QtSizeFPropertyManager::rangeChanged,
+                property, minVal, maxVal, &QtSizeFPropertyManagerPrivate::setRange);
+}
+
+/*!
+    \reimp
+*/
+void QtSizeFPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtSizeFPropertyManagerPrivate::Data();
+
+    QtProperty *wProp = d_ptr->m_doublePropertyManager->addProperty();
+    wProp->setPropertyName(tr("Width"));
+    d_ptr->m_doublePropertyManager->setDecimals(wProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(wProp, 0);
+    d_ptr->m_doublePropertyManager->setMinimum(wProp, 0);
+    d_ptr->m_propertyToW[property] = wProp;
+    d_ptr->m_wToProperty[wProp] = property;
+    property->addSubProperty(wProp);
+
+    QtProperty *hProp = d_ptr->m_doublePropertyManager->addProperty();
+    hProp->setPropertyName(tr("Height"));
+    d_ptr->m_doublePropertyManager->setDecimals(hProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(hProp, 0);
+    d_ptr->m_doublePropertyManager->setMinimum(hProp, 0);
+    d_ptr->m_propertyToH[property] = hProp;
+    d_ptr->m_hToProperty[hProp] = property;
+    property->addSubProperty(hProp);
+}
+
+/*!
+    \reimp
+*/
+void QtSizeFPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *wProp = d_ptr->m_propertyToW[property];
+    if (wProp) {
+        d_ptr->m_wToProperty.remove(wProp);
+        delete wProp;
+    }
+    d_ptr->m_propertyToW.remove(property);
+
+    QtProperty *hProp = d_ptr->m_propertyToH[property];
+    if (hProp) {
+        d_ptr->m_hToProperty.remove(hProp);
+        delete hProp;
+    }
+    d_ptr->m_propertyToH.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtRectPropertyManager
+
+class QtRectPropertyManagerPrivate
+{
+    QtRectPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtRectPropertyManager)
+public:
+
+    void slotIntChanged(QtProperty *property, int value);
+    void slotPropertyDestroyed(QtProperty *property);
+    void setConstraint(QtProperty *property, const QRect &constraint, const QRect &val);
+
+    struct Data
+    {
+        Data() : val(0, 0, 0, 0) {}
+        QRect val;
+        QRect constraint;
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtIntPropertyManager *m_intPropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToX;
+    QMap<const QtProperty *, QtProperty *> m_propertyToY;
+    QMap<const QtProperty *, QtProperty *> m_propertyToW;
+    QMap<const QtProperty *, QtProperty *> m_propertyToH;
+
+    QMap<const QtProperty *, QtProperty *> m_xToProperty;
+    QMap<const QtProperty *, QtProperty *> m_yToProperty;
+    QMap<const QtProperty *, QtProperty *> m_wToProperty;
+    QMap<const QtProperty *, QtProperty *> m_hToProperty;
+};
+
+void QtRectPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
+{
+    if (QtProperty *prop = m_xToProperty.value(property, 0)) {
+        QRect r = m_values[prop].val;
+        r.moveLeft(value);
+        q_ptr->setValue(prop, r);
+    } else if (QtProperty *prop = m_yToProperty.value(property)) {
+        QRect r = m_values[prop].val;
+        r.moveTop(value);
+        q_ptr->setValue(prop, r);
+    } else if (QtProperty *prop = m_wToProperty.value(property, 0)) {
+        Data data = m_values[prop];
+        QRect r = data.val;
+        r.setWidth(value);
+        if (!data.constraint.isNull() && data.constraint.x() + data.constraint.width() < r.x() + r.width()) {
+            r.moveLeft(data.constraint.left() + data.constraint.width() - r.width());
+        }
+        q_ptr->setValue(prop, r);
+    } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
+        Data data = m_values[prop];
+        QRect r = data.val;
+        r.setHeight(value);
+        if (!data.constraint.isNull() && data.constraint.y() + data.constraint.height() < r.y() + r.height()) {
+            r.moveTop(data.constraint.top() + data.constraint.height() - r.height());
+        }
+        q_ptr->setValue(prop, r);
+    }
+}
+
+void QtRectPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_xToProperty.value(property, 0)) {
+        m_propertyToX[pointProp] = 0;
+        m_xToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
+        m_propertyToY[pointProp] = 0;
+        m_yToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
+        m_propertyToW[pointProp] = 0;
+        m_wToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
+        m_propertyToH[pointProp] = 0;
+        m_hToProperty.remove(property);
+    }
+}
+
+void QtRectPropertyManagerPrivate::setConstraint(QtProperty *property,
+            const QRect &constraint, const QRect &val)
+{
+    const bool isNull = constraint.isNull();
+    const int left   = isNull ? INT_MIN : constraint.left();
+    const int right  = isNull ? INT_MAX : constraint.left() + constraint.width();
+    const int top    = isNull ? INT_MIN : constraint.top();
+    const int bottom = isNull ? INT_MAX : constraint.top() + constraint.height();
+    const int width  = isNull ? INT_MAX : constraint.width();
+    const int height = isNull ? INT_MAX : constraint.height();
+
+    m_intPropertyManager->setRange(m_propertyToX[property], left, right);
+    m_intPropertyManager->setRange(m_propertyToY[property], top, bottom);
+    m_intPropertyManager->setRange(m_propertyToW[property], 0, width);
+    m_intPropertyManager->setRange(m_propertyToH[property], 0, height);
+
+    m_intPropertyManager->setValue(m_propertyToX[property], val.x());
+    m_intPropertyManager->setValue(m_propertyToY[property], val.y());
+    m_intPropertyManager->setValue(m_propertyToW[property], val.width());
+    m_intPropertyManager->setValue(m_propertyToH[property], val.height());
+}
+
+/*!
+    \class QtRectPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtRectPropertyManager provides and manages QRect properties.
+
+    A rectangle property has nested \e x, \e y, \e width and \e height
+    subproperties. The top-level property's value can be retrieved
+    using the value() function, and set using the setValue() slot.
+
+    The subproperties are created by a QtIntPropertyManager object. This
+    manager can be retrieved using the subIntPropertyManager() function. In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    A rectangle property also has a constraint rectangle which can be
+    retrieved using the constraint() function, and set using the
+    setConstraint() slot.
+
+    In addition, QtRectPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the constraintChanged() signal which is emitted
+    whenever such a property changes its constraint rectangle.
+
+    \sa QtAbstractPropertyManager, QtIntPropertyManager, QtRectFPropertyManager
+*/
+
+/*!
+    \fn void QtRectPropertyManager::valueChanged(QtProperty *property, const QRect &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtRectPropertyManager::constraintChanged(QtProperty *property, const QRect &constraint)
+
+    This signal is emitted whenever property changes its constraint
+    rectangle, passing a pointer to the \a property and the new \a
+    constraint rectangle as parameters.
+
+    \sa setConstraint()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtRectPropertyManager::QtRectPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtRectPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
+    connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotIntChanged(QtProperty*,int)));
+    connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtRectPropertyManager::~QtRectPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e x, \e y, \e width
+    and \e height subproperties.
+
+    In order to provide editing widgets for the mentioned
+    subproperties in a property browser widget, this manager must be
+    associated with an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtIntPropertyManager *QtRectPropertyManager::subIntPropertyManager() const
+{
+    return d_ptr->m_intPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an invalid rectangle.
+
+    \sa setValue(), constraint()
+*/
+QRect QtRectPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<QRect>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's constraining rectangle. If returned value is null QRect it means there is no constraint applied.
+
+    \sa value(), setConstraint()
+*/
+QRect QtRectPropertyManager::constraint(const QtProperty *property) const
+{
+    return getData<QRect>(d_ptr->m_values, &QtRectPropertyManagerPrivate::Data::constraint, property, QRect());
+}
+
+/*!
+    \reimp
+*/
+QString QtRectPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtRectPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    const QRect v = it.value().val;
+    return tr("[(%1, %2), %3 x %4]").arg(QString::number(v.x()))
+                                    .arg(QString::number(v.y()))
+                                    .arg(QString::number(v.width()))
+                                    .arg(QString::number(v.height()));
+}
+
+/*!
+    \fn void QtRectPropertyManager::setValue(QtProperty *property, const QRect &value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    If the specified \a value is not inside the given \a property's
+    constraining rectangle, the value is adjusted accordingly to fit
+    within the constraint.
+
+    \sa value(), setConstraint(), valueChanged()
+*/
+void QtRectPropertyManager::setValue(QtProperty *property, const QRect &val)
+{
+    const QtRectPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtRectPropertyManagerPrivate::Data data = it.value();
+
+    QRect newRect = val.normalized();
+    if (!data.constraint.isNull() && !data.constraint.contains(newRect)) {
+        const QRect r1 = data.constraint;
+        const QRect r2 = newRect;
+        newRect.setLeft(qMax(r1.left(), r2.left()));
+        newRect.setRight(qMin(r1.right(), r2.right()));
+        newRect.setTop(qMax(r1.top(), r2.top()));
+        newRect.setBottom(qMin(r1.bottom(), r2.bottom()));
+        if (newRect.width() < 0 || newRect.height() < 0)
+            return;
+    }
+
+    if (data.val == newRect)
+        return;
+
+    data.val = newRect;
+
+    it.value() = data;
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToX[property], newRect.x());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToY[property], newRect.y());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToW[property], newRect.width());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToH[property], newRect.height());
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    Sets the given \a property's constraining rectangle to \a
+    constraint.
+
+    When setting the constraint, the current value is adjusted if
+    necessary (ensuring that the current rectangle value is inside the
+    constraint). In order to reset the constraint pass a null QRect value.
+
+    \sa setValue(), constraint(), constraintChanged()
+*/
+void QtRectPropertyManager::setConstraint(QtProperty *property, const QRect &constraint)
+{
+    const QtRectPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtRectPropertyManagerPrivate::Data data = it.value();
+
+    QRect newConstraint = constraint.normalized();
+    if (data.constraint == newConstraint)
+        return;
+
+    const QRect oldVal = data.val;
+
+    data.constraint = newConstraint;
+
+    if (!data.constraint.isNull() && !data.constraint.contains(oldVal)) {
+        QRect r1 = data.constraint;
+        QRect r2 = data.val;
+
+        if (r2.width() > r1.width())
+            r2.setWidth(r1.width());
+        if (r2.height() > r1.height())
+            r2.setHeight(r1.height());
+        if (r2.left() < r1.left())
+            r2.moveLeft(r1.left());
+        else if (r2.right() > r1.right())
+            r2.moveRight(r1.right());
+        if (r2.top() < r1.top())
+            r2.moveTop(r1.top());
+        else if (r2.bottom() > r1.bottom())
+            r2.moveBottom(r1.bottom());
+
+        data.val = r2;
+    }
+
+    it.value() = data;
+
+    emit constraintChanged(property, data.constraint);
+
+    d_ptr->setConstraint(property, data.constraint, data.val);
+
+    if (data.val == oldVal)
+        return;
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    \reimp
+*/
+void QtRectPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtRectPropertyManagerPrivate::Data();
+
+    QtProperty *xProp = d_ptr->m_intPropertyManager->addProperty();
+    xProp->setPropertyName(tr("X"));
+    d_ptr->m_intPropertyManager->setValue(xProp, 0);
+    d_ptr->m_propertyToX[property] = xProp;
+    d_ptr->m_xToProperty[xProp] = property;
+    property->addSubProperty(xProp);
+
+    QtProperty *yProp = d_ptr->m_intPropertyManager->addProperty();
+    yProp->setPropertyName(tr("Y"));
+    d_ptr->m_intPropertyManager->setValue(yProp, 0);
+    d_ptr->m_propertyToY[property] = yProp;
+    d_ptr->m_yToProperty[yProp] = property;
+    property->addSubProperty(yProp);
+
+    QtProperty *wProp = d_ptr->m_intPropertyManager->addProperty();
+    wProp->setPropertyName(tr("Width"));
+    d_ptr->m_intPropertyManager->setValue(wProp, 0);
+    d_ptr->m_intPropertyManager->setMinimum(wProp, 0);
+    d_ptr->m_propertyToW[property] = wProp;
+    d_ptr->m_wToProperty[wProp] = property;
+    property->addSubProperty(wProp);
+
+    QtProperty *hProp = d_ptr->m_intPropertyManager->addProperty();
+    hProp->setPropertyName(tr("Height"));
+    d_ptr->m_intPropertyManager->setValue(hProp, 0);
+    d_ptr->m_intPropertyManager->setMinimum(hProp, 0);
+    d_ptr->m_propertyToH[property] = hProp;
+    d_ptr->m_hToProperty[hProp] = property;
+    property->addSubProperty(hProp);
+}
+
+/*!
+    \reimp
+*/
+void QtRectPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *xProp = d_ptr->m_propertyToX[property];
+    if (xProp) {
+        d_ptr->m_xToProperty.remove(xProp);
+        delete xProp;
+    }
+    d_ptr->m_propertyToX.remove(property);
+
+    QtProperty *yProp = d_ptr->m_propertyToY[property];
+    if (yProp) {
+        d_ptr->m_yToProperty.remove(yProp);
+        delete yProp;
+    }
+    d_ptr->m_propertyToY.remove(property);
+
+    QtProperty *wProp = d_ptr->m_propertyToW[property];
+    if (wProp) {
+        d_ptr->m_wToProperty.remove(wProp);
+        delete wProp;
+    }
+    d_ptr->m_propertyToW.remove(property);
+
+    QtProperty *hProp = d_ptr->m_propertyToH[property];
+    if (hProp) {
+        d_ptr->m_hToProperty.remove(hProp);
+        delete hProp;
+    }
+    d_ptr->m_propertyToH.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtRectFPropertyManager
+
+class QtRectFPropertyManagerPrivate
+{
+    QtRectFPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtRectFPropertyManager)
+public:
+
+    void slotDoubleChanged(QtProperty *property, double value);
+    void slotPropertyDestroyed(QtProperty *property);
+    void setConstraint(QtProperty *property, const QRectF &constraint, const QRectF &val);
+
+    struct Data
+    {
+        Data() : val(0, 0, 0, 0), decimals(2) {}
+        QRectF val;
+        QRectF constraint;
+        int decimals;
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtDoublePropertyManager *m_doublePropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToX;
+    QMap<const QtProperty *, QtProperty *> m_propertyToY;
+    QMap<const QtProperty *, QtProperty *> m_propertyToW;
+    QMap<const QtProperty *, QtProperty *> m_propertyToH;
+
+    QMap<const QtProperty *, QtProperty *> m_xToProperty;
+    QMap<const QtProperty *, QtProperty *> m_yToProperty;
+    QMap<const QtProperty *, QtProperty *> m_wToProperty;
+    QMap<const QtProperty *, QtProperty *> m_hToProperty;
+};
+
+void QtRectFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value)
+{
+    if (QtProperty *prop = m_xToProperty.value(property, 0)) {
+        QRectF r = m_values[prop].val;
+        r.moveLeft(value);
+        q_ptr->setValue(prop, r);
+    } else if (QtProperty *prop = m_yToProperty.value(property, 0)) {
+        QRectF r = m_values[prop].val;
+        r.moveTop(value);
+        q_ptr->setValue(prop, r);
+    } else if (QtProperty *prop = m_wToProperty.value(property, 0)) {
+        Data data = m_values[prop];
+        QRectF r = data.val;
+        r.setWidth(value);
+        if (!data.constraint.isNull() && data.constraint.x() + data.constraint.width() < r.x() + r.width()) {
+            r.moveLeft(data.constraint.left() + data.constraint.width() - r.width());
+        }
+        q_ptr->setValue(prop, r);
+    } else if (QtProperty *prop = m_hToProperty.value(property, 0)) {
+        Data data = m_values[prop];
+        QRectF r = data.val;
+        r.setHeight(value);
+        if (!data.constraint.isNull() && data.constraint.y() + data.constraint.height() < r.y() + r.height()) {
+            r.moveTop(data.constraint.top() + data.constraint.height() - r.height());
+        }
+        q_ptr->setValue(prop, r);
+    }
+}
+
+void QtRectFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_xToProperty.value(property, 0)) {
+        m_propertyToX[pointProp] = 0;
+        m_xToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) {
+        m_propertyToY[pointProp] = 0;
+        m_yToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_wToProperty.value(property, 0)) {
+        m_propertyToW[pointProp] = 0;
+        m_wToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) {
+        m_propertyToH[pointProp] = 0;
+        m_hToProperty.remove(property);
+    }
+}
+
+void QtRectFPropertyManagerPrivate::setConstraint(QtProperty *property,
+            const QRectF &constraint, const QRectF &val)
+{
+    const bool isNull = constraint.isNull();
+    const float left   = isNull ? FLT_MIN : constraint.left();
+    const float right  = isNull ? FLT_MAX : constraint.left() + constraint.width();
+    const float top    = isNull ? FLT_MIN : constraint.top();
+    const float bottom = isNull ? FLT_MAX : constraint.top() + constraint.height();
+    const float width  = isNull ? FLT_MAX : constraint.width();
+    const float height = isNull ? FLT_MAX : constraint.height();
+
+    m_doublePropertyManager->setRange(m_propertyToX[property], left, right);
+    m_doublePropertyManager->setRange(m_propertyToY[property], top, bottom);
+    m_doublePropertyManager->setRange(m_propertyToW[property], 0, width);
+    m_doublePropertyManager->setRange(m_propertyToH[property], 0, height);
+
+    m_doublePropertyManager->setValue(m_propertyToX[property], val.x());
+    m_doublePropertyManager->setValue(m_propertyToY[property], val.y());
+    m_doublePropertyManager->setValue(m_propertyToW[property], val.width());
+    m_doublePropertyManager->setValue(m_propertyToH[property], val.height());
+}
+
+/*!
+    \class QtRectFPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtRectFPropertyManager provides and manages QRectF properties.
+
+    A rectangle property has nested \e x, \e y, \e width and \e height
+    subproperties. The top-level property's value can be retrieved
+    using the value() function, and set using the setValue() slot.
+
+    The subproperties are created by a QtDoublePropertyManager object. This
+    manager can be retrieved using the subDoublePropertyManager() function. In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    A rectangle property also has a constraint rectangle which can be
+    retrieved using the constraint() function, and set using the
+    setConstraint() slot.
+
+    In addition, QtRectFPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the constraintChanged() signal which is emitted
+    whenever such a property changes its constraint rectangle.
+
+    \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtRectPropertyManager
+*/
+
+/*!
+    \fn void QtRectFPropertyManager::valueChanged(QtProperty *property, const QRectF &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtRectFPropertyManager::constraintChanged(QtProperty *property, const QRectF &constraint)
+
+    This signal is emitted whenever property changes its constraint
+    rectangle, passing a pointer to the \a property and the new \a
+    constraint rectangle as parameters.
+
+    \sa setConstraint()
+*/
+
+/*!
+    \fn void QtRectFPropertyManager::decimalsChanged(QtProperty *property, int prec)
+
+    This signal is emitted whenever a property created by this manager
+    changes its precision of value, passing a pointer to the
+    \a property and the new \a prec value
+
+    \sa setDecimals()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtRectFPropertyManager::QtRectFPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtRectFPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this);
+    connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotDoubleChanged(QtProperty*,double)));
+    connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtRectFPropertyManager::~QtRectFPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e x, \e y, \e width
+    and \e height subproperties.
+
+    In order to provide editing widgets for the mentioned
+    subproperties in a property browser widget, this manager must be
+    associated with an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtDoublePropertyManager *QtRectFPropertyManager::subDoublePropertyManager() const
+{
+    return d_ptr->m_doublePropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an invalid rectangle.
+
+    \sa setValue(), constraint()
+*/
+QRectF QtRectFPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<QRectF>(d_ptr->m_values, property);
+}
+
+/*!
+    Returns the given \a property's precision, in decimals.
+
+    \sa setDecimals()
+*/
+int QtRectFPropertyManager::decimals(const QtProperty *property) const
+{
+    return getData<int>(d_ptr->m_values, &QtRectFPropertyManagerPrivate::Data::decimals, property, 0);
+}
+
+/*!
+    Returns the given \a property's constraining rectangle. If returned value is null QRectF it means there is no constraint applied.
+
+    \sa value(), setConstraint()
+*/
+QRectF QtRectFPropertyManager::constraint(const QtProperty *property) const
+{
+    return getData<QRectF>(d_ptr->m_values, &QtRectFPropertyManagerPrivate::Data::constraint, property, QRect());
+}
+
+/*!
+    \reimp
+*/
+QString QtRectFPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtRectFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+    const QRectF v = it.value().val;
+    const int dec = it.value().decimals;
+    return QString(tr("[(%1, %2), %3 x %4]").arg(QString::number(v.x(), 'f', dec))
+                                .arg(QString::number(v.y(), 'f', dec))
+                                .arg(QString::number(v.width(), 'f', dec))
+                                .arg(QString::number(v.height(), 'f', dec)));
+}
+
+/*!
+    \fn void QtRectFPropertyManager::setValue(QtProperty *property, const QRectF &value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    If the specified \a value is not inside the given \a property's
+    constraining rectangle, the value is adjusted accordingly to fit
+    within the constraint.
+
+    \sa value(), setConstraint(), valueChanged()
+*/
+void QtRectFPropertyManager::setValue(QtProperty *property, const QRectF &val)
+{
+    const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtRectFPropertyManagerPrivate::Data data = it.value();
+
+    QRectF newRect = val.normalized();
+    if (!data.constraint.isNull() && !data.constraint.contains(newRect)) {
+        const QRectF r1 = data.constraint;
+        const QRectF r2 = newRect;
+        newRect.setLeft(qMax(r1.left(), r2.left()));
+        newRect.setRight(qMin(r1.right(), r2.right()));
+        newRect.setTop(qMax(r1.top(), r2.top()));
+        newRect.setBottom(qMin(r1.bottom(), r2.bottom()));
+        if (newRect.width() < 0 || newRect.height() < 0)
+            return;
+    }
+
+    if (data.val == newRect)
+        return;
+
+    data.val = newRect;
+
+    it.value() = data;
+    d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToX[property], newRect.x());
+    d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToY[property], newRect.y());
+    d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToW[property], newRect.width());
+    d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToH[property], newRect.height());
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    Sets the given \a property's constraining rectangle to \a
+    constraint.
+
+    When setting the constraint, the current value is adjusted if
+    necessary (ensuring that the current rectangle value is inside the
+    constraint). In order to reset the constraint pass a null QRectF value.
+
+    \sa setValue(), constraint(), constraintChanged()
+*/
+void QtRectFPropertyManager::setConstraint(QtProperty *property, const QRectF &constraint)
+{
+    const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtRectFPropertyManagerPrivate::Data data = it.value();
+
+    QRectF newConstraint = constraint.normalized();
+    if (data.constraint == newConstraint)
+        return;
+
+    const QRectF oldVal = data.val;
+
+    data.constraint = newConstraint;
+
+    if (!data.constraint.isNull() && !data.constraint.contains(oldVal)) {
+        QRectF r1 = data.constraint;
+        QRectF r2 = data.val;
+
+        if (r2.width() > r1.width())
+            r2.setWidth(r1.width());
+        if (r2.height() > r1.height())
+            r2.setHeight(r1.height());
+        if (r2.left() < r1.left())
+            r2.moveLeft(r1.left());
+        else if (r2.right() > r1.right())
+            r2.moveRight(r1.right());
+        if (r2.top() < r1.top())
+            r2.moveTop(r1.top());
+        else if (r2.bottom() > r1.bottom())
+            r2.moveBottom(r1.bottom());
+
+        data.val = r2;
+    }
+
+    it.value() = data;
+
+    emit constraintChanged(property, data.constraint);
+
+    d_ptr->setConstraint(property, data.constraint, data.val);
+
+    if (data.val == oldVal)
+        return;
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    \fn void QtRectFPropertyManager::setDecimals(QtProperty *property, int prec)
+
+    Sets the precision of the given \a property to \a prec.
+
+    The valid decimal range is 0-13. The default is 2.
+
+    \sa decimals()
+*/
+void QtRectFPropertyManager::setDecimals(QtProperty *property, int prec)
+{
+    const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtRectFPropertyManagerPrivate::Data data = it.value();
+
+    if (prec > 13)
+        prec = 13;
+    else if (prec < 0)
+        prec = 0;
+
+    if (data.decimals == prec)
+        return;
+
+    data.decimals = prec;
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToX[property], prec);
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToY[property], prec);
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToW[property], prec);
+    d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToH[property], prec);
+
+    it.value() = data;
+
+    emit decimalsChanged(property, data.decimals);
+}
+
+/*!
+    \reimp
+*/
+void QtRectFPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtRectFPropertyManagerPrivate::Data();
+
+    QtProperty *xProp = d_ptr->m_doublePropertyManager->addProperty();
+    xProp->setPropertyName(tr("X"));
+    d_ptr->m_doublePropertyManager->setDecimals(xProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(xProp, 0);
+    d_ptr->m_propertyToX[property] = xProp;
+    d_ptr->m_xToProperty[xProp] = property;
+    property->addSubProperty(xProp);
+
+    QtProperty *yProp = d_ptr->m_doublePropertyManager->addProperty();
+    yProp->setPropertyName(tr("Y"));
+    d_ptr->m_doublePropertyManager->setDecimals(yProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(yProp, 0);
+    d_ptr->m_propertyToY[property] = yProp;
+    d_ptr->m_yToProperty[yProp] = property;
+    property->addSubProperty(yProp);
+
+    QtProperty *wProp = d_ptr->m_doublePropertyManager->addProperty();
+    wProp->setPropertyName(tr("Width"));
+    d_ptr->m_doublePropertyManager->setDecimals(wProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(wProp, 0);
+    d_ptr->m_doublePropertyManager->setMinimum(wProp, 0);
+    d_ptr->m_propertyToW[property] = wProp;
+    d_ptr->m_wToProperty[wProp] = property;
+    property->addSubProperty(wProp);
+
+    QtProperty *hProp = d_ptr->m_doublePropertyManager->addProperty();
+    hProp->setPropertyName(tr("Height"));
+    d_ptr->m_doublePropertyManager->setDecimals(hProp, decimals(property));
+    d_ptr->m_doublePropertyManager->setValue(hProp, 0);
+    d_ptr->m_doublePropertyManager->setMinimum(hProp, 0);
+    d_ptr->m_propertyToH[property] = hProp;
+    d_ptr->m_hToProperty[hProp] = property;
+    property->addSubProperty(hProp);
+}
+
+/*!
+    \reimp
+*/
+void QtRectFPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *xProp = d_ptr->m_propertyToX[property];
+    if (xProp) {
+        d_ptr->m_xToProperty.remove(xProp);
+        delete xProp;
+    }
+    d_ptr->m_propertyToX.remove(property);
+
+    QtProperty *yProp = d_ptr->m_propertyToY[property];
+    if (yProp) {
+        d_ptr->m_yToProperty.remove(yProp);
+        delete yProp;
+    }
+    d_ptr->m_propertyToY.remove(property);
+
+    QtProperty *wProp = d_ptr->m_propertyToW[property];
+    if (wProp) {
+        d_ptr->m_wToProperty.remove(wProp);
+        delete wProp;
+    }
+    d_ptr->m_propertyToW.remove(property);
+
+    QtProperty *hProp = d_ptr->m_propertyToH[property];
+    if (hProp) {
+        d_ptr->m_hToProperty.remove(hProp);
+        delete hProp;
+    }
+    d_ptr->m_propertyToH.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtEnumPropertyManager
+
+class QtEnumPropertyManagerPrivate
+{
+    QtEnumPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtEnumPropertyManager)
+public:
+
+    struct Data
+    {
+        Data() : val(-1) {}
+        int val;
+        QStringList enumNames;
+        QMap<int, QIcon> enumIcons;
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+/*!
+    \class QtEnumPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtEnumPropertyManager provides and manages enum properties.
+
+    Each enum property has an associated list of enum names which can
+    be retrieved using the enumNames() function, and set using the
+    corresponding setEnumNames() function. An enum property's value is
+    represented by an index in this list, and can be retrieved and set
+    using the value() and setValue() slots respectively.
+
+    Each enum value can also have an associated icon. The mapping from
+    values to icons can be set using the setEnumIcons() function and
+    queried with the enumIcons() function.
+
+    In addition, QtEnumPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes. The enumNamesChanged() or enumIconsChanged() signal is emitted
+    whenever the list of enum names or icons is altered.
+
+    \sa QtAbstractPropertyManager, QtEnumEditorFactory
+*/
+
+/*!
+    \fn void QtEnumPropertyManager::valueChanged(QtProperty *property, int value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtEnumPropertyManager::enumNamesChanged(QtProperty *property, const QStringList &names)
+
+    This signal is emitted whenever a property created by this manager
+    changes its enum names, passing a pointer to the \a property and
+    the new \a names as parameters.
+
+    \sa setEnumNames()
+*/
+
+/*!
+    \fn void QtEnumPropertyManager::enumIconsChanged(QtProperty *property, const QMap<int, QIcon> &icons)
+
+    This signal is emitted whenever a property created by this manager
+    changes its enum icons, passing a pointer to the \a property and
+    the new mapping of values to \a icons as parameters.
+
+    \sa setEnumIcons()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtEnumPropertyManager::QtEnumPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtEnumPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtEnumPropertyManager::~QtEnumPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value which is an index in the
+    list returned by enumNames()
+
+    If the given property is not managed by this manager, this
+    function returns -1.
+
+    \sa enumNames(), setValue()
+*/
+int QtEnumPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<int>(d_ptr->m_values, property, -1);
+}
+
+/*!
+    Returns the given \a property's list of enum names.
+
+    \sa value(), setEnumNames()
+*/
+QStringList QtEnumPropertyManager::enumNames(const QtProperty *property) const
+{
+    return getData<QStringList>(d_ptr->m_values, &QtEnumPropertyManagerPrivate::Data::enumNames, property, QStringList());
+}
+
+/*!
+    Returns the given \a property's map of enum values to their icons.
+
+    \sa value(), setEnumIcons()
+*/
+QMap<int, QIcon> QtEnumPropertyManager::enumIcons(const QtProperty *property) const
+{
+    return getData<QMap<int, QIcon> >(d_ptr->m_values, &QtEnumPropertyManagerPrivate::Data::enumIcons, property, QMap<int, QIcon>());
+}
+
+/*!
+    \reimp
+*/
+QString QtEnumPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtEnumPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    const QtEnumPropertyManagerPrivate::Data &data = it.value();
+
+    const int v = data.val;
+    if (v >= 0 && v < data.enumNames.count())
+        return data.enumNames.at(v);
+    return QString();
+}
+
+/*!
+    \reimp
+*/
+QIcon QtEnumPropertyManager::valueIcon(const QtProperty *property) const
+{
+    const QtEnumPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QIcon();
+
+    const QtEnumPropertyManagerPrivate::Data &data = it.value();
+
+    const int v = data.val;
+    return data.enumIcons.value(v);
+}
+
+/*!
+    \fn void QtEnumPropertyManager::setValue(QtProperty *property, int value)
+
+    Sets the value of the given  \a property to \a value.
+
+    The specified \a value must be less than the size of the given \a
+    property's enumNames() list, and larger than (or equal to) 0.
+
+    \sa value(), valueChanged()
+*/
+void QtEnumPropertyManager::setValue(QtProperty *property, int val)
+{
+    const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtEnumPropertyManagerPrivate::Data data = it.value();
+
+    if (val >= data.enumNames.count())
+        return;
+
+    if (val < 0 && data.enumNames.count() > 0)
+        return;
+
+    if (val < 0)
+        val = -1;
+
+    if (data.val == val)
+        return;
+
+    data.val = val;
+
+    it.value() = data;
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    Sets the given \a property's list of enum names to \a
+    enumNames. The \a property's current value is reset to 0
+    indicating the first item of the list.
+
+    If the specified \a enumNames list is empty, the \a property's
+    current value is set to -1.
+
+    \sa enumNames(), enumNamesChanged()
+*/
+void QtEnumPropertyManager::setEnumNames(QtProperty *property, const QStringList &enumNames)
+{
+    const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtEnumPropertyManagerPrivate::Data data = it.value();
+
+    if (data.enumNames == enumNames)
+        return;
+
+    data.enumNames = enumNames;
+
+    data.val = -1;
+
+    if (enumNames.count() > 0)
+        data.val = 0;
+
+    it.value() = data;
+
+    emit enumNamesChanged(property, data.enumNames);
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    Sets the given \a property's map of enum values to their icons to \a
+    enumIcons.
+
+    Each enum value can have associated icon. This association is represented with passed \a enumIcons map.
+
+    \sa enumNames(), enumNamesChanged()
+*/
+void QtEnumPropertyManager::setEnumIcons(QtProperty *property, const QMap<int, QIcon> &enumIcons)
+{
+    const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    it.value().enumIcons = enumIcons;
+
+    emit enumIconsChanged(property, it.value().enumIcons);
+
+    emit propertyChanged(property);
+}
+
+/*!
+    \reimp
+*/
+void QtEnumPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtEnumPropertyManagerPrivate::Data();
+}
+
+/*!
+    \reimp
+*/
+void QtEnumPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+// QtFlagPropertyManager
+
+class QtFlagPropertyManagerPrivate
+{
+    QtFlagPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtFlagPropertyManager)
+public:
+
+    void slotBoolChanged(QtProperty *property, bool value);
+    void slotPropertyDestroyed(QtProperty *property);
+
+    struct Data
+    {
+        Data() : val(-1) {}
+        int val;
+        QStringList flagNames;
+    };
+
+    typedef QMap<const QtProperty *, Data> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtBoolPropertyManager *m_boolPropertyManager;
+
+    QMap<const QtProperty *, QList<QtProperty *> > m_propertyToFlags;
+
+    QMap<const QtProperty *, QtProperty *> m_flagToProperty;
+};
+
+void QtFlagPropertyManagerPrivate::slotBoolChanged(QtProperty *property, bool value)
+{
+    QtProperty *prop = m_flagToProperty.value(property, 0);
+    if (prop == 0)
+        return;
+
+    QListIterator<QtProperty *> itProp(m_propertyToFlags[prop]);
+    int level = 0;
+    while (itProp.hasNext()) {
+        QtProperty *p = itProp.next();
+        if (p == property) {
+            int v = m_values[prop].val;
+            if (value) {
+                v |= (1 << level);
+            } else {
+                v &= ~(1 << level);
+            }
+            q_ptr->setValue(prop, v);
+            return;
+        }
+        level++;
+    }
+}
+
+void QtFlagPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    QtProperty *flagProperty = m_flagToProperty.value(property, 0);
+    if (flagProperty == 0)
+        return;
+
+    m_propertyToFlags[flagProperty].replace(m_propertyToFlags[flagProperty].indexOf(property), 0);
+    m_flagToProperty.remove(property);
+}
+
+/*!
+    \class QtFlagPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtFlagPropertyManager provides and manages flag properties.
+
+    Each flag property has an associated list of flag names which can
+    be retrieved using the flagNames() function, and set using the
+    corresponding setFlagNames() function.
+
+    The flag manager provides properties with nested boolean
+    subproperties representing each flag, i.e. a flag property's value
+    is the binary combination of the subproperties' values. A
+    property's value can be retrieved and set using the value() and
+    setValue() slots respectively. The combination of flags is represented
+    by single int value - that's why it's possible to store up to
+    32 independent flags in one flag property.
+
+    The subproperties are created by a QtBoolPropertyManager object. This
+    manager can be retrieved using the subBoolPropertyManager() function. In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    In addition, QtFlagPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes, and the flagNamesChanged() signal which is emitted
+    whenever the list of flag names is altered.
+
+    \sa QtAbstractPropertyManager, QtBoolPropertyManager
+*/
+
+/*!
+    \fn void QtFlagPropertyManager::valueChanged(QtProperty *property, int value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a  property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtFlagPropertyManager::flagNamesChanged(QtProperty *property, const QStringList &names)
+
+    This signal is emitted whenever a property created by this manager
+    changes its flag names, passing a pointer to the \a property and the
+    new \a names as parameters.
+
+    \sa setFlagNames()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtFlagPropertyManager::QtFlagPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtFlagPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_boolPropertyManager = new QtBoolPropertyManager(this);
+    connect(d_ptr->m_boolPropertyManager, SIGNAL(valueChanged(QtProperty*,bool)),
+                this, SLOT(slotBoolChanged(QtProperty*,bool)));
+    connect(d_ptr->m_boolPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtFlagPropertyManager::~QtFlagPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that produces the nested boolean subproperties
+    representing each flag.
+
+    In order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtBoolPropertyManager *QtFlagPropertyManager::subBoolPropertyManager() const
+{
+    return d_ptr->m_boolPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns 0.
+
+    \sa flagNames(), setValue()
+*/
+int QtFlagPropertyManager::value(const QtProperty *property) const
+{
+    return getValue<int>(d_ptr->m_values, property, 0);
+}
+
+/*!
+    Returns the given \a property's list of flag names.
+
+    \sa value(), setFlagNames()
+*/
+QStringList QtFlagPropertyManager::flagNames(const QtProperty *property) const
+{
+    return getData<QStringList>(d_ptr->m_values, &QtFlagPropertyManagerPrivate::Data::flagNames, property, QStringList());
+}
+
+/*!
+    \reimp
+*/
+QString QtFlagPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtFlagPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    const QtFlagPropertyManagerPrivate::Data &data = it.value();
+
+    QString str;
+    int level = 0;
+    const QChar bar = QLatin1Char('|');
+    const QStringList::const_iterator fncend = data.flagNames.constEnd();
+    for (QStringList::const_iterator it =  data.flagNames.constBegin(); it != fncend; ++it) {
+        if (data.val & (1 << level)) {
+            if (!str.isEmpty())
+                str += bar;
+            str += *it;
+        }
+
+        level++;
+    }
+    return str;
+}
+
+/*!
+    \fn void QtFlagPropertyManager::setValue(QtProperty *property, int value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    The specified \a value must be less than the binary combination of
+    the property's flagNames() list size (i.e. less than 2\sup n,
+    where \c n is the size of the list) and larger than (or equal to)
+    0.
+
+    \sa value(), valueChanged()
+*/
+void QtFlagPropertyManager::setValue(QtProperty *property, int val)
+{
+    const QtFlagPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtFlagPropertyManagerPrivate::Data data = it.value();
+
+    if (data.val == val)
+        return;
+
+    if (val > (1 << data.flagNames.count()) - 1)
+        return;
+
+    if (val < 0)
+        return;
+
+    data.val = val;
+
+    it.value() = data;
+
+    QListIterator<QtProperty *> itProp(d_ptr->m_propertyToFlags[property]);
+    int level = 0;
+    while (itProp.hasNext()) {
+        QtProperty *prop = itProp.next();
+        if (prop)
+            d_ptr->m_boolPropertyManager->setValue(prop, val & (1 << level));
+        level++;
+    }
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    Sets the given \a property's list of flag names to \a flagNames. The
+    property's current value is reset to 0 indicating the first item
+    of the list.
+
+    \sa flagNames(), flagNamesChanged()
+*/
+void QtFlagPropertyManager::setFlagNames(QtProperty *property, const QStringList &flagNames)
+{
+    const QtFlagPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    QtFlagPropertyManagerPrivate::Data data = it.value();
+
+    if (data.flagNames == flagNames)
+        return;
+
+    data.flagNames = flagNames;
+    data.val = 0;
+
+    it.value() = data;
+
+    QListIterator<QtProperty *> itProp(d_ptr->m_propertyToFlags[property]);
+    while (itProp.hasNext()) {
+        QtProperty *prop = itProp.next();
+        if (prop) {
+            delete prop;
+            d_ptr->m_flagToProperty.remove(prop);
+        }
+    }
+    d_ptr->m_propertyToFlags[property].clear();
+
+    QStringListIterator itFlag(flagNames);
+    while (itFlag.hasNext()) {
+        const QString flagName = itFlag.next();
+        QtProperty *prop = d_ptr->m_boolPropertyManager->addProperty();
+        prop->setPropertyName(flagName);
+        property->addSubProperty(prop);
+        d_ptr->m_propertyToFlags[property].append(prop);
+        d_ptr->m_flagToProperty[prop] = property;
+    }
+
+    emit flagNamesChanged(property, data.flagNames);
+
+    emit propertyChanged(property);
+    emit valueChanged(property, data.val);
+}
+
+/*!
+    \reimp
+*/
+void QtFlagPropertyManager::initializeProperty(QtProperty *property)
+{
+    d_ptr->m_values[property] = QtFlagPropertyManagerPrivate::Data();
+
+    d_ptr->m_propertyToFlags[property] = QList<QtProperty *>();
+}
+
+/*!
+    \reimp
+*/
+void QtFlagPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QListIterator<QtProperty *> itProp(d_ptr->m_propertyToFlags[property]);
+    while (itProp.hasNext()) {
+        QtProperty *prop = itProp.next();
+        if (prop) {
+            delete prop;
+            d_ptr->m_flagToProperty.remove(prop);
+        }
+    }
+    d_ptr->m_propertyToFlags.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtSizePolicyPropertyManager
+
+class QtSizePolicyPropertyManagerPrivate
+{
+    QtSizePolicyPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtSizePolicyPropertyManager)
+public:
+
+    QtSizePolicyPropertyManagerPrivate();
+
+    void slotIntChanged(QtProperty *property, int value);
+    void slotEnumChanged(QtProperty *property, int value);
+    void slotPropertyDestroyed(QtProperty *property);
+
+    typedef QMap<const QtProperty *, QSizePolicy> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtIntPropertyManager *m_intPropertyManager;
+    QtEnumPropertyManager *m_enumPropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToHPolicy;
+    QMap<const QtProperty *, QtProperty *> m_propertyToVPolicy;
+    QMap<const QtProperty *, QtProperty *> m_propertyToHStretch;
+    QMap<const QtProperty *, QtProperty *> m_propertyToVStretch;
+
+    QMap<const QtProperty *, QtProperty *> m_hPolicyToProperty;
+    QMap<const QtProperty *, QtProperty *> m_vPolicyToProperty;
+    QMap<const QtProperty *, QtProperty *> m_hStretchToProperty;
+    QMap<const QtProperty *, QtProperty *> m_vStretchToProperty;
+};
+
+QtSizePolicyPropertyManagerPrivate::QtSizePolicyPropertyManagerPrivate()
+{
+}
+
+void QtSizePolicyPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
+{
+    if (QtProperty *prop = m_hStretchToProperty.value(property, 0)) {
+        QSizePolicy sp = m_values[prop];
+        sp.setHorizontalStretch(value);
+        q_ptr->setValue(prop, sp);
+    } else if (QtProperty *prop = m_vStretchToProperty.value(property, 0)) {
+        QSizePolicy sp = m_values[prop];
+        sp.setVerticalStretch(value);
+        q_ptr->setValue(prop, sp);
+    }
+}
+
+void QtSizePolicyPropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value)
+{
+    if (QtProperty *prop = m_hPolicyToProperty.value(property, 0)) {
+        QSizePolicy sp = m_values[prop];
+        sp.setHorizontalPolicy(metaEnumProvider()->indexToSizePolicy(value));
+        q_ptr->setValue(prop, sp);
+    } else if (QtProperty *prop = m_vPolicyToProperty.value(property, 0)) {
+        QSizePolicy sp = m_values[prop];
+        sp.setVerticalPolicy(metaEnumProvider()->indexToSizePolicy(value));
+        q_ptr->setValue(prop, sp);
+    }
+}
+
+void QtSizePolicyPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_hStretchToProperty.value(property, 0)) {
+        m_propertyToHStretch[pointProp] = 0;
+        m_hStretchToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_vStretchToProperty.value(property, 0)) {
+        m_propertyToVStretch[pointProp] = 0;
+        m_vStretchToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_hPolicyToProperty.value(property, 0)) {
+        m_propertyToHPolicy[pointProp] = 0;
+        m_hPolicyToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_vPolicyToProperty.value(property, 0)) {
+        m_propertyToVPolicy[pointProp] = 0;
+        m_vPolicyToProperty.remove(property);
+    }
+}
+
+/*!
+    \class QtSizePolicyPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtSizePolicyPropertyManager provides and manages QSizePolicy properties.
+
+    A size policy property has nested \e horizontalPolicy, \e
+    verticalPolicy, \e horizontalStretch and \e verticalStretch
+    subproperties. The top-level property's value can be retrieved
+    using the value() function, and set using the setValue() slot.
+
+    The subproperties are created by QtIntPropertyManager and QtEnumPropertyManager
+    objects. These managers can be retrieved using the subIntPropertyManager()
+    and subEnumPropertyManager() functions respectively. In order to provide
+    editing widgets for the subproperties in a property browser widget,
+    these managers must be associated with editor factories.
+
+    In addition, QtSizePolicyPropertyManager provides the valueChanged()
+    signal which is emitted whenever a property created by this
+    manager changes.
+
+    \sa QtAbstractPropertyManager, QtIntPropertyManager, QtEnumPropertyManager
+*/
+
+/*!
+    \fn void QtSizePolicyPropertyManager::valueChanged(QtProperty *property, const QSizePolicy &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtSizePolicyPropertyManager::QtSizePolicyPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtSizePolicyPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
+    connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotIntChanged(QtProperty*,int)));
+    d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this);
+    connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotEnumChanged(QtProperty*,int)));
+
+    connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+    connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtSizePolicyPropertyManager::~QtSizePolicyPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the nested \e horizontalStretch
+    and \e verticalStretch subproperties.
+
+    In order to provide editing widgets for the mentioned subproperties
+    in a property browser widget, this manager must be associated with
+    an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtIntPropertyManager *QtSizePolicyPropertyManager::subIntPropertyManager() const
+{
+    return d_ptr->m_intPropertyManager;
+}
+
+/*!
+    Returns the manager that creates the nested \e horizontalPolicy
+    and \e verticalPolicy subproperties.
+
+    In order to provide editing widgets for the mentioned subproperties
+    in a property browser widget, this manager must be associated with
+    an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtEnumPropertyManager *QtSizePolicyPropertyManager::subEnumPropertyManager() const
+{
+    return d_ptr->m_enumPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns the default size policy.
+
+    \sa setValue()
+*/
+QSizePolicy QtSizePolicyPropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QSizePolicy());
+}
+
+/*!
+    \reimp
+*/
+QString QtSizePolicyPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtSizePolicyPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    const QSizePolicy sp = it.value();
+    const QtMetaEnumProvider *mep = metaEnumProvider();
+    const int hIndex = mep->sizePolicyToIndex(sp.horizontalPolicy());
+    const int vIndex = mep->sizePolicyToIndex(sp.verticalPolicy());
+    //! Unknown size policy on reading invalid uic3 files
+    const QString hPolicy = hIndex != -1 ? mep->policyEnumNames().at(hIndex) : tr("<Invalid>");
+    const QString vPolicy = vIndex != -1 ? mep->policyEnumNames().at(vIndex) : tr("<Invalid>");
+    const QString str = tr("[%1, %2, %3, %4]").arg(hPolicy, vPolicy).arg(sp.horizontalStretch()).arg(sp.verticalStretch());
+    return str;
+}
+
+/*!
+    \fn void QtSizePolicyPropertyManager::setValue(QtProperty *property, const QSizePolicy &value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    \sa value(), valueChanged()
+*/
+void QtSizePolicyPropertyManager::setValue(QtProperty *property, const QSizePolicy &val)
+{
+    const QtSizePolicyPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    if (it.value() == val)
+        return;
+
+    it.value() = val;
+
+    d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToHPolicy[property],
+                metaEnumProvider()->sizePolicyToIndex(val.horizontalPolicy()));
+    d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToVPolicy[property],
+                metaEnumProvider()->sizePolicyToIndex(val.verticalPolicy()));
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToHStretch[property],
+                val.horizontalStretch());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToVStretch[property],
+                val.verticalStretch());
+
+    emit propertyChanged(property);
+    emit valueChanged(property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtSizePolicyPropertyManager::initializeProperty(QtProperty *property)
+{
+    QSizePolicy val;
+    d_ptr->m_values[property] = val;
+
+    QtProperty *hPolicyProp = d_ptr->m_enumPropertyManager->addProperty();
+    hPolicyProp->setPropertyName(tr("Horizontal Policy"));
+    d_ptr->m_enumPropertyManager->setEnumNames(hPolicyProp, metaEnumProvider()->policyEnumNames());
+    d_ptr->m_enumPropertyManager->setValue(hPolicyProp,
+                metaEnumProvider()->sizePolicyToIndex(val.horizontalPolicy()));
+    d_ptr->m_propertyToHPolicy[property] = hPolicyProp;
+    d_ptr->m_hPolicyToProperty[hPolicyProp] = property;
+    property->addSubProperty(hPolicyProp);
+
+    QtProperty *vPolicyProp = d_ptr->m_enumPropertyManager->addProperty();
+    vPolicyProp->setPropertyName(tr("Vertical Policy"));
+    d_ptr->m_enumPropertyManager->setEnumNames(vPolicyProp, metaEnumProvider()->policyEnumNames());
+    d_ptr->m_enumPropertyManager->setValue(vPolicyProp,
+                metaEnumProvider()->sizePolicyToIndex(val.verticalPolicy()));
+    d_ptr->m_propertyToVPolicy[property] = vPolicyProp;
+    d_ptr->m_vPolicyToProperty[vPolicyProp] = property;
+    property->addSubProperty(vPolicyProp);
+
+    QtProperty *hStretchProp = d_ptr->m_intPropertyManager->addProperty();
+    hStretchProp->setPropertyName(tr("Horizontal Stretch"));
+    d_ptr->m_intPropertyManager->setValue(hStretchProp, val.horizontalStretch());
+    d_ptr->m_intPropertyManager->setRange(hStretchProp, 0, 0xff);
+    d_ptr->m_propertyToHStretch[property] = hStretchProp;
+    d_ptr->m_hStretchToProperty[hStretchProp] = property;
+    property->addSubProperty(hStretchProp);
+
+    QtProperty *vStretchProp = d_ptr->m_intPropertyManager->addProperty();
+    vStretchProp->setPropertyName(tr("Vertical Stretch"));
+    d_ptr->m_intPropertyManager->setValue(vStretchProp, val.verticalStretch());
+    d_ptr->m_intPropertyManager->setRange(vStretchProp, 0, 0xff);
+    d_ptr->m_propertyToVStretch[property] = vStretchProp;
+    d_ptr->m_vStretchToProperty[vStretchProp] = property;
+    property->addSubProperty(vStretchProp);
+
+}
+
+/*!
+    \reimp
+*/
+void QtSizePolicyPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *hPolicyProp = d_ptr->m_propertyToHPolicy[property];
+    if (hPolicyProp) {
+        d_ptr->m_hPolicyToProperty.remove(hPolicyProp);
+        delete hPolicyProp;
+    }
+    d_ptr->m_propertyToHPolicy.remove(property);
+
+    QtProperty *vPolicyProp = d_ptr->m_propertyToVPolicy[property];
+    if (vPolicyProp) {
+        d_ptr->m_vPolicyToProperty.remove(vPolicyProp);
+        delete vPolicyProp;
+    }
+    d_ptr->m_propertyToVPolicy.remove(property);
+
+    QtProperty *hStretchProp = d_ptr->m_propertyToHStretch[property];
+    if (hStretchProp) {
+        d_ptr->m_hStretchToProperty.remove(hStretchProp);
+        delete hStretchProp;
+    }
+    d_ptr->m_propertyToHStretch.remove(property);
+
+    QtProperty *vStretchProp = d_ptr->m_propertyToVStretch[property];
+    if (vStretchProp) {
+        d_ptr->m_vStretchToProperty.remove(vStretchProp);
+        delete vStretchProp;
+    }
+    d_ptr->m_propertyToVStretch.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtFontPropertyManager:
+// QtFontPropertyManagerPrivate has a mechanism for reacting
+// to QApplication::fontDatabaseChanged() [4.5], which is emitted
+// when someone loads an application font. The signals are compressed
+// using a timer with interval 0, which then causes the family
+// enumeration manager to re-set its strings and index values
+// for each property.
+
+Q_GLOBAL_STATIC(QFontDatabase, fontDatabase)
+
+class QtFontPropertyManagerPrivate
+{
+    QtFontPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtFontPropertyManager)
+public:
+
+    QtFontPropertyManagerPrivate();
+
+    void slotIntChanged(QtProperty *property, int value);
+    void slotEnumChanged(QtProperty *property, int value);
+    void slotBoolChanged(QtProperty *property, bool value);
+    void slotPropertyDestroyed(QtProperty *property);
+    void slotFontDatabaseChanged();
+    void slotFontDatabaseDelayedChange();
+
+    QStringList m_familyNames;
+
+    typedef QMap<const QtProperty *, QFont> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtIntPropertyManager *m_intPropertyManager;
+    QtEnumPropertyManager *m_enumPropertyManager;
+    QtBoolPropertyManager *m_boolPropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToFamily;
+    QMap<const QtProperty *, QtProperty *> m_propertyToPointSize;
+    QMap<const QtProperty *, QtProperty *> m_propertyToBold;
+    QMap<const QtProperty *, QtProperty *> m_propertyToItalic;
+    QMap<const QtProperty *, QtProperty *> m_propertyToUnderline;
+    QMap<const QtProperty *, QtProperty *> m_propertyToStrikeOut;
+    QMap<const QtProperty *, QtProperty *> m_propertyToKerning;
+
+    QMap<const QtProperty *, QtProperty *> m_familyToProperty;
+    QMap<const QtProperty *, QtProperty *> m_pointSizeToProperty;
+    QMap<const QtProperty *, QtProperty *> m_boldToProperty;
+    QMap<const QtProperty *, QtProperty *> m_italicToProperty;
+    QMap<const QtProperty *, QtProperty *> m_underlineToProperty;
+    QMap<const QtProperty *, QtProperty *> m_strikeOutToProperty;
+    QMap<const QtProperty *, QtProperty *> m_kerningToProperty;
+
+    bool m_settingValue;
+    QTimer *m_fontDatabaseChangeTimer;
+};
+
+QtFontPropertyManagerPrivate::QtFontPropertyManagerPrivate() :
+    m_settingValue(false),
+    m_fontDatabaseChangeTimer(0)
+{
+}
+
+void QtFontPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
+{
+    if (m_settingValue)
+        return;
+    if (QtProperty *prop = m_pointSizeToProperty.value(property, 0)) {
+        QFont f = m_values[prop];
+        f.setPointSize(value);
+        q_ptr->setValue(prop, f);
+    }
+}
+
+void QtFontPropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value)
+{
+    if (m_settingValue)
+        return;
+    if (QtProperty *prop = m_familyToProperty.value(property, 0)) {
+        QFont f = m_values[prop];
+        f.setFamily(m_familyNames.at(value));
+        q_ptr->setValue(prop, f);
+    }
+}
+
+void QtFontPropertyManagerPrivate::slotBoolChanged(QtProperty *property, bool value)
+{
+    if (m_settingValue)
+        return;
+    if (QtProperty *prop = m_boldToProperty.value(property, 0)) {
+        QFont f = m_values[prop];
+        f.setBold(value);
+        q_ptr->setValue(prop, f);
+    } else if (QtProperty *prop = m_italicToProperty.value(property, 0)) {
+        QFont f = m_values[prop];
+        f.setItalic(value);
+        q_ptr->setValue(prop, f);
+    } else if (QtProperty *prop = m_underlineToProperty.value(property, 0)) {
+        QFont f = m_values[prop];
+        f.setUnderline(value);
+        q_ptr->setValue(prop, f);
+    } else if (QtProperty *prop = m_strikeOutToProperty.value(property, 0)) {
+        QFont f = m_values[prop];
+        f.setStrikeOut(value);
+        q_ptr->setValue(prop, f);
+    } else if (QtProperty *prop = m_kerningToProperty.value(property, 0)) {
+        QFont f = m_values[prop];
+        f.setKerning(value);
+        q_ptr->setValue(prop, f);
+    }
+}
+
+void QtFontPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_pointSizeToProperty.value(property, 0)) {
+        m_propertyToPointSize[pointProp] = 0;
+        m_pointSizeToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_familyToProperty.value(property, 0)) {
+        m_propertyToFamily[pointProp] = 0;
+        m_familyToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_boldToProperty.value(property, 0)) {
+        m_propertyToBold[pointProp] = 0;
+        m_boldToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_italicToProperty.value(property, 0)) {
+        m_propertyToItalic[pointProp] = 0;
+        m_italicToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_underlineToProperty.value(property, 0)) {
+        m_propertyToUnderline[pointProp] = 0;
+        m_underlineToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_strikeOutToProperty.value(property, 0)) {
+        m_propertyToStrikeOut[pointProp] = 0;
+        m_strikeOutToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_kerningToProperty.value(property, 0)) {
+        m_propertyToKerning[pointProp] = 0;
+        m_kerningToProperty.remove(property);
+    }
+}
+
+void  QtFontPropertyManagerPrivate::slotFontDatabaseChanged()
+{
+    if (!m_fontDatabaseChangeTimer) {
+        m_fontDatabaseChangeTimer = new QTimer(q_ptr);
+        m_fontDatabaseChangeTimer->setInterval(0);
+        m_fontDatabaseChangeTimer->setSingleShot(true);
+        QObject::connect(m_fontDatabaseChangeTimer, SIGNAL(timeout()), q_ptr, SLOT(slotFontDatabaseDelayedChange()));
+    }
+    if (!m_fontDatabaseChangeTimer->isActive())
+        m_fontDatabaseChangeTimer->start();
+}
+
+void QtFontPropertyManagerPrivate::slotFontDatabaseDelayedChange()
+{
+    typedef QMap<const QtProperty *, QtProperty *> PropertyPropertyMap;
+    // rescan available font names
+    const QStringList oldFamilies = m_familyNames;
+    m_familyNames = fontDatabase()->families();
+
+    // Adapt all existing properties
+    if (!m_propertyToFamily.empty()) {
+        PropertyPropertyMap::const_iterator cend = m_propertyToFamily.constEnd();
+        for (PropertyPropertyMap::const_iterator it = m_propertyToFamily.constBegin(); it != cend; ++it) {
+            QtProperty *familyProp = it.value();
+            const int oldIdx = m_enumPropertyManager->value(familyProp);
+            int newIdx = m_familyNames.indexOf(oldFamilies.at(oldIdx));
+            if (newIdx < 0)
+                newIdx = 0;
+            m_enumPropertyManager->setEnumNames(familyProp, m_familyNames);
+            m_enumPropertyManager->setValue(familyProp, newIdx);
+        }
+    }
+}
+
+/*!
+    \class QtFontPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtFontPropertyManager provides and manages QFont properties.
+
+    A font property has nested \e family, \e pointSize, \e bold, \e
+    italic, \e underline, \e strikeOut and \e kerning subproperties. The top-level
+    property's value can be retrieved using the value() function, and
+    set using the setValue() slot.
+
+    The subproperties are created by QtIntPropertyManager, QtEnumPropertyManager and
+    QtBoolPropertyManager objects. These managers can be retrieved using the
+    corresponding subIntPropertyManager(), subEnumPropertyManager() and
+    subBoolPropertyManager() functions. In order to provide editing widgets
+    for the subproperties in a property browser widget, these managers
+    must be associated with editor factories.
+
+    In addition, QtFontPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes.
+
+    \sa QtAbstractPropertyManager, QtEnumPropertyManager, QtIntPropertyManager, QtBoolPropertyManager
+*/
+
+/*!
+    \fn void QtFontPropertyManager::valueChanged(QtProperty *property, const QFont &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtFontPropertyManager::QtFontPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtFontPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+    QObject::connect(qApp, SIGNAL(fontDatabaseChanged()), this, SLOT(slotFontDatabaseChanged()));
+
+    d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
+    connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotIntChanged(QtProperty*,int)));
+    d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this);
+    connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotEnumChanged(QtProperty*,int)));
+    d_ptr->m_boolPropertyManager = new QtBoolPropertyManager(this);
+    connect(d_ptr->m_boolPropertyManager, SIGNAL(valueChanged(QtProperty*,bool)),
+                this, SLOT(slotBoolChanged(QtProperty*,bool)));
+
+    connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+    connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+    connect(d_ptr->m_boolPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtFontPropertyManager::~QtFontPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that creates the \e pointSize subproperty.
+
+    In order to provide editing widgets for the \e pointSize property
+    in a property browser widget, this manager must be associated
+    with an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtIntPropertyManager *QtFontPropertyManager::subIntPropertyManager() const
+{
+    return d_ptr->m_intPropertyManager;
+}
+
+/*!
+    Returns the manager that create the \e family subproperty.
+
+    In order to provide editing widgets for the \e family property
+    in a property browser widget, this manager must be associated
+    with an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtEnumPropertyManager *QtFontPropertyManager::subEnumPropertyManager() const
+{
+    return d_ptr->m_enumPropertyManager;
+}
+
+/*!
+    Returns the manager that creates the  \e bold, \e italic, \e underline,
+    \e strikeOut and \e kerning subproperties.
+
+    In order to provide editing widgets for the mentioned properties
+    in a property browser widget, this manager must be associated with
+    an editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtBoolPropertyManager *QtFontPropertyManager::subBoolPropertyManager() const
+{
+    return d_ptr->m_boolPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given property is not managed by this manager, this
+    function returns a font object that uses the application's default
+    font.
+
+    \sa setValue()
+*/
+QFont QtFontPropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QFont());
+}
+
+/*!
+    \reimp
+*/
+QString QtFontPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtFontPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    return QtPropertyBrowserUtils::fontValueText(it.value());
+}
+
+/*!
+    \reimp
+*/
+QIcon QtFontPropertyManager::valueIcon(const QtProperty *property) const
+{
+    const QtFontPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QIcon();
+
+    return QtPropertyBrowserUtils::fontValueIcon(it.value());
+}
+
+/*!
+    \fn void QtFontPropertyManager::setValue(QtProperty *property, const QFont &value)
+
+    Sets the value of the given \a property to \a value. Nested
+    properties are updated automatically.
+
+    \sa value(), valueChanged()
+*/
+void QtFontPropertyManager::setValue(QtProperty *property, const QFont &val)
+{
+    const QtFontPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    const QFont oldVal = it.value();
+    if (oldVal == val && oldVal.resolve() == val.resolve())
+        return;
+
+    it.value() = val;
+
+    int idx = d_ptr->m_familyNames.indexOf(val.family());
+    if (idx == -1)
+        idx = 0;
+    bool settingValue = d_ptr->m_settingValue;
+    d_ptr->m_settingValue = true;
+    d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToFamily[property], idx);
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToPointSize[property], val.pointSize());
+    d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToBold[property], val.bold());
+    d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToItalic[property], val.italic());
+    d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToUnderline[property], val.underline());
+    d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToStrikeOut[property], val.strikeOut());
+    d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToKerning[property], val.kerning());
+    d_ptr->m_settingValue = settingValue;
+
+    emit propertyChanged(property);
+    emit valueChanged(property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtFontPropertyManager::initializeProperty(QtProperty *property)
+{
+    QFont val;
+    d_ptr->m_values[property] = val;
+
+    QtProperty *familyProp = d_ptr->m_enumPropertyManager->addProperty();
+    familyProp->setPropertyName(tr("Family"));
+    if (d_ptr->m_familyNames.empty())
+        d_ptr->m_familyNames = fontDatabase()->families();
+    d_ptr->m_enumPropertyManager->setEnumNames(familyProp, d_ptr->m_familyNames);
+    int idx = d_ptr->m_familyNames.indexOf(val.family());
+    if (idx == -1)
+        idx = 0;
+    d_ptr->m_enumPropertyManager->setValue(familyProp, idx);
+    d_ptr->m_propertyToFamily[property] = familyProp;
+    d_ptr->m_familyToProperty[familyProp] = property;
+    property->addSubProperty(familyProp);
+
+    QtProperty *pointSizeProp = d_ptr->m_intPropertyManager->addProperty();
+    pointSizeProp->setPropertyName(tr("Point Size"));
+    d_ptr->m_intPropertyManager->setValue(pointSizeProp, val.pointSize());
+    d_ptr->m_intPropertyManager->setMinimum(pointSizeProp, 1);
+    d_ptr->m_propertyToPointSize[property] = pointSizeProp;
+    d_ptr->m_pointSizeToProperty[pointSizeProp] = property;
+    property->addSubProperty(pointSizeProp);
+
+    QtProperty *boldProp = d_ptr->m_boolPropertyManager->addProperty();
+    boldProp->setPropertyName(tr("Bold"));
+    d_ptr->m_boolPropertyManager->setValue(boldProp, val.bold());
+    d_ptr->m_propertyToBold[property] = boldProp;
+    d_ptr->m_boldToProperty[boldProp] = property;
+    property->addSubProperty(boldProp);
+
+    QtProperty *italicProp = d_ptr->m_boolPropertyManager->addProperty();
+    italicProp->setPropertyName(tr("Italic"));
+    d_ptr->m_boolPropertyManager->setValue(italicProp, val.italic());
+    d_ptr->m_propertyToItalic[property] = italicProp;
+    d_ptr->m_italicToProperty[italicProp] = property;
+    property->addSubProperty(italicProp);
+
+    QtProperty *underlineProp = d_ptr->m_boolPropertyManager->addProperty();
+    underlineProp->setPropertyName(tr("Underline"));
+    d_ptr->m_boolPropertyManager->setValue(underlineProp, val.underline());
+    d_ptr->m_propertyToUnderline[property] = underlineProp;
+    d_ptr->m_underlineToProperty[underlineProp] = property;
+    property->addSubProperty(underlineProp);
+
+    QtProperty *strikeOutProp = d_ptr->m_boolPropertyManager->addProperty();
+    strikeOutProp->setPropertyName(tr("Strikeout"));
+    d_ptr->m_boolPropertyManager->setValue(strikeOutProp, val.strikeOut());
+    d_ptr->m_propertyToStrikeOut[property] = strikeOutProp;
+    d_ptr->m_strikeOutToProperty[strikeOutProp] = property;
+    property->addSubProperty(strikeOutProp);
+
+    QtProperty *kerningProp = d_ptr->m_boolPropertyManager->addProperty();
+    kerningProp->setPropertyName(tr("Kerning"));
+    d_ptr->m_boolPropertyManager->setValue(kerningProp, val.kerning());
+    d_ptr->m_propertyToKerning[property] = kerningProp;
+    d_ptr->m_kerningToProperty[kerningProp] = property;
+    property->addSubProperty(kerningProp);
+}
+
+/*!
+    \reimp
+*/
+void QtFontPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *familyProp = d_ptr->m_propertyToFamily[property];
+    if (familyProp) {
+        d_ptr->m_familyToProperty.remove(familyProp);
+        delete familyProp;
+    }
+    d_ptr->m_propertyToFamily.remove(property);
+
+    QtProperty *pointSizeProp = d_ptr->m_propertyToPointSize[property];
+    if (pointSizeProp) {
+        d_ptr->m_pointSizeToProperty.remove(pointSizeProp);
+        delete pointSizeProp;
+    }
+    d_ptr->m_propertyToPointSize.remove(property);
+
+    QtProperty *boldProp = d_ptr->m_propertyToBold[property];
+    if (boldProp) {
+        d_ptr->m_boldToProperty.remove(boldProp);
+        delete boldProp;
+    }
+    d_ptr->m_propertyToBold.remove(property);
+
+    QtProperty *italicProp = d_ptr->m_propertyToItalic[property];
+    if (italicProp) {
+        d_ptr->m_italicToProperty.remove(italicProp);
+        delete italicProp;
+    }
+    d_ptr->m_propertyToItalic.remove(property);
+
+    QtProperty *underlineProp = d_ptr->m_propertyToUnderline[property];
+    if (underlineProp) {
+        d_ptr->m_underlineToProperty.remove(underlineProp);
+        delete underlineProp;
+    }
+    d_ptr->m_propertyToUnderline.remove(property);
+
+    QtProperty *strikeOutProp = d_ptr->m_propertyToStrikeOut[property];
+    if (strikeOutProp) {
+        d_ptr->m_strikeOutToProperty.remove(strikeOutProp);
+        delete strikeOutProp;
+    }
+    d_ptr->m_propertyToStrikeOut.remove(property);
+
+    QtProperty *kerningProp = d_ptr->m_propertyToKerning[property];
+    if (kerningProp) {
+        d_ptr->m_kerningToProperty.remove(kerningProp);
+        delete kerningProp;
+    }
+    d_ptr->m_propertyToKerning.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtColorPropertyManager
+
+class QtColorPropertyManagerPrivate
+{
+    QtColorPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtColorPropertyManager)
+public:
+
+    void slotIntChanged(QtProperty *property, int value);
+    void slotPropertyDestroyed(QtProperty *property);
+
+    typedef QMap<const QtProperty *, QColor> PropertyValueMap;
+    PropertyValueMap m_values;
+
+    QtIntPropertyManager *m_intPropertyManager;
+
+    QMap<const QtProperty *, QtProperty *> m_propertyToR;
+    QMap<const QtProperty *, QtProperty *> m_propertyToG;
+    QMap<const QtProperty *, QtProperty *> m_propertyToB;
+    QMap<const QtProperty *, QtProperty *> m_propertyToA;
+
+    QMap<const QtProperty *, QtProperty *> m_rToProperty;
+    QMap<const QtProperty *, QtProperty *> m_gToProperty;
+    QMap<const QtProperty *, QtProperty *> m_bToProperty;
+    QMap<const QtProperty *, QtProperty *> m_aToProperty;
+};
+
+void QtColorPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value)
+{
+    if (QtProperty *prop = m_rToProperty.value(property, 0)) {
+        QColor c = m_values[prop];
+        c.setRed(value);
+        q_ptr->setValue(prop, c);
+    } else if (QtProperty *prop = m_gToProperty.value(property, 0)) {
+        QColor c = m_values[prop];
+        c.setGreen(value);
+        q_ptr->setValue(prop, c);
+    } else if (QtProperty *prop = m_bToProperty.value(property, 0)) {
+        QColor c = m_values[prop];
+        c.setBlue(value);
+        q_ptr->setValue(prop, c);
+    } else if (QtProperty *prop = m_aToProperty.value(property, 0)) {
+        QColor c = m_values[prop];
+        c.setAlpha(value);
+        q_ptr->setValue(prop, c);
+    }
+}
+
+void QtColorPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property)
+{
+    if (QtProperty *pointProp = m_rToProperty.value(property, 0)) {
+        m_propertyToR[pointProp] = 0;
+        m_rToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_gToProperty.value(property, 0)) {
+        m_propertyToG[pointProp] = 0;
+        m_gToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_bToProperty.value(property, 0)) {
+        m_propertyToB[pointProp] = 0;
+        m_bToProperty.remove(property);
+    } else if (QtProperty *pointProp = m_aToProperty.value(property, 0)) {
+        m_propertyToA[pointProp] = 0;
+        m_aToProperty.remove(property);
+    }
+}
+
+/*!
+    \class QtColorPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtColorPropertyManager provides and manages QColor properties.
+
+    A color property has nested \e red, \e green and \e blue
+    subproperties. The top-level property's value can be retrieved
+    using the value() function, and set using the setValue() slot.
+
+    The subproperties are created by a QtIntPropertyManager object. This
+    manager can be retrieved using the subIntPropertyManager() function.  In
+    order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    In addition, QtColorPropertyManager provides the valueChanged() signal
+    which is emitted whenever a property created by this manager
+    changes.
+
+    \sa QtAbstractPropertyManager, QtAbstractPropertyBrowser, QtIntPropertyManager
+*/
+
+/*!
+    \fn void QtColorPropertyManager::valueChanged(QtProperty *property, const QColor &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtColorPropertyManager::QtColorPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtColorPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_intPropertyManager = new QtIntPropertyManager(this);
+    connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotIntChanged(QtProperty*,int)));
+
+    connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty*)),
+                this, SLOT(slotPropertyDestroyed(QtProperty*)));
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtColorPropertyManager::~QtColorPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the manager that produces the nested \e red, \e green and
+    \e blue subproperties.
+
+    In order to provide editing widgets for the subproperties in a
+    property browser widget, this manager must be associated with an
+    editor factory.
+
+    \sa QtAbstractPropertyBrowser::setFactoryForManager()
+*/
+QtIntPropertyManager *QtColorPropertyManager::subIntPropertyManager() const
+{
+    return d_ptr->m_intPropertyManager;
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by \e this manager, this
+    function returns an invalid color.
+
+    \sa setValue()
+*/
+QColor QtColorPropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QColor());
+}
+
+/*!
+    \reimp
+*/
+
+QString QtColorPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtColorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    return QtPropertyBrowserUtils::colorValueText(it.value());
+}
+
+/*!
+    \reimp
+*/
+
+QIcon QtColorPropertyManager::valueIcon(const QtProperty *property) const
+{
+    const QtColorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QIcon();
+    return QtPropertyBrowserUtils::brushValueIcon(QBrush(it.value()));
+}
+
+/*!
+    \fn void QtColorPropertyManager::setValue(QtProperty *property, const QColor &value)
+
+    Sets the value of the given \a property to \a value.  Nested
+    properties are updated automatically.
+
+    \sa value(), valueChanged()
+*/
+void QtColorPropertyManager::setValue(QtProperty *property, const QColor &val)
+{
+    const QtColorPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    if (it.value() == val)
+        return;
+
+    it.value() = val;
+
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToR[property], val.red());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToG[property], val.green());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToB[property], val.blue());
+    d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToA[property], val.alpha());
+
+    emit propertyChanged(property);
+    emit valueChanged(property, val);
+}
+
+/*!
+    \reimp
+*/
+void QtColorPropertyManager::initializeProperty(QtProperty *property)
+{
+    QColor val;
+    d_ptr->m_values[property] = val;
+
+    QtProperty *rProp = d_ptr->m_intPropertyManager->addProperty();
+    rProp->setPropertyName(tr("Red"));
+    d_ptr->m_intPropertyManager->setValue(rProp, val.red());
+    d_ptr->m_intPropertyManager->setRange(rProp, 0, 0xFF);
+    d_ptr->m_propertyToR[property] = rProp;
+    d_ptr->m_rToProperty[rProp] = property;
+    property->addSubProperty(rProp);
+
+    QtProperty *gProp = d_ptr->m_intPropertyManager->addProperty();
+    gProp->setPropertyName(tr("Green"));
+    d_ptr->m_intPropertyManager->setValue(gProp, val.green());
+    d_ptr->m_intPropertyManager->setRange(gProp, 0, 0xFF);
+    d_ptr->m_propertyToG[property] = gProp;
+    d_ptr->m_gToProperty[gProp] = property;
+    property->addSubProperty(gProp);
+
+    QtProperty *bProp = d_ptr->m_intPropertyManager->addProperty();
+    bProp->setPropertyName(tr("Blue"));
+    d_ptr->m_intPropertyManager->setValue(bProp, val.blue());
+    d_ptr->m_intPropertyManager->setRange(bProp, 0, 0xFF);
+    d_ptr->m_propertyToB[property] = bProp;
+    d_ptr->m_bToProperty[bProp] = property;
+    property->addSubProperty(bProp);
+
+    QtProperty *aProp = d_ptr->m_intPropertyManager->addProperty();
+    aProp->setPropertyName(tr("Alpha"));
+    d_ptr->m_intPropertyManager->setValue(aProp, val.alpha());
+    d_ptr->m_intPropertyManager->setRange(aProp, 0, 0xFF);
+    d_ptr->m_propertyToA[property] = aProp;
+    d_ptr->m_aToProperty[aProp] = property;
+    property->addSubProperty(aProp);
+}
+
+/*!
+    \reimp
+*/
+void QtColorPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    QtProperty *rProp = d_ptr->m_propertyToR[property];
+    if (rProp) {
+        d_ptr->m_rToProperty.remove(rProp);
+        delete rProp;
+    }
+    d_ptr->m_propertyToR.remove(property);
+
+    QtProperty *gProp = d_ptr->m_propertyToG[property];
+    if (gProp) {
+        d_ptr->m_gToProperty.remove(gProp);
+        delete gProp;
+    }
+    d_ptr->m_propertyToG.remove(property);
+
+    QtProperty *bProp = d_ptr->m_propertyToB[property];
+    if (bProp) {
+        d_ptr->m_bToProperty.remove(bProp);
+        delete bProp;
+    }
+    d_ptr->m_propertyToB.remove(property);
+
+    QtProperty *aProp = d_ptr->m_propertyToA[property];
+    if (aProp) {
+        d_ptr->m_aToProperty.remove(aProp);
+        delete aProp;
+    }
+    d_ptr->m_propertyToA.remove(property);
+
+    d_ptr->m_values.remove(property);
+}
+
+// QtCursorPropertyManager
+
+// Make sure icons are removed as soon as QApplication is destroyed, otherwise,
+// handles are leaked on X11.
+static void clearCursorDatabase();
+namespace {
+struct CursorDatabase : public QtCursorDatabase
+{
+    CursorDatabase()
+    {
+        qAddPostRoutine(clearCursorDatabase);
+    }
+};
+}
+Q_GLOBAL_STATIC(QtCursorDatabase, cursorDatabase)
+
+static void clearCursorDatabase()
+{
+    cursorDatabase()->clear();
+}
+
+class QtCursorPropertyManagerPrivate
+{
+    QtCursorPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtCursorPropertyManager)
+public:
+    typedef QMap<const QtProperty *, QCursor> PropertyValueMap;
+    PropertyValueMap m_values;
+};
+
+/*!
+    \class QtCursorPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtCursorPropertyManager provides and manages QCursor properties.
+
+    A cursor property has a current value which can be
+    retrieved using the value() function, and set using the setValue()
+    slot. In addition, QtCursorPropertyManager provides the
+    valueChanged() signal which is emitted whenever a property created
+    by this manager changes.
+
+    \sa QtAbstractPropertyManager
+*/
+
+/*!
+    \fn void QtCursorPropertyManager::valueChanged(QtProperty *property, const QCursor &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the new
+    \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtCursorPropertyManager::QtCursorPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtCursorPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtCursorPropertyManager::~QtCursorPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns a default QCursor object.
+
+    \sa setValue()
+*/
+#ifndef QT_NO_CURSOR
+QCursor QtCursorPropertyManager::value(const QtProperty *property) const
+{
+    return d_ptr->m_values.value(property, QCursor());
+}
+#endif
+
+/*!
+    \reimp
+*/
+QString QtCursorPropertyManager::valueText(const QtProperty *property) const
+{
+   const QtCursorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QString();
+
+    return cursorDatabase()->cursorToShapeName(it.value());
+}
+
+/*!
+    \reimp
+*/
+QIcon QtCursorPropertyManager::valueIcon(const QtProperty *property) const
+{
+    const QtCursorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property);
+    if (it == d_ptr->m_values.constEnd())
+        return QIcon();
+
+    return cursorDatabase()->cursorToShapeIcon(it.value());
+}
+
+/*!
+    \fn void QtCursorPropertyManager::setValue(QtProperty *property, const QCursor &value)
+
+    Sets the value of the given \a property to \a value.
+
+    \sa value(), valueChanged()
+*/
+void QtCursorPropertyManager::setValue(QtProperty *property, const QCursor &value)
+{
+#ifndef QT_NO_CURSOR
+    const QtCursorPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property);
+    if (it == d_ptr->m_values.end())
+        return;
+
+    if (it.value().shape() == value.shape() && value.shape() != Qt::BitmapCursor)
+        return;
+
+    it.value() = value;
+
+    emit propertyChanged(property);
+    emit valueChanged(property, value);
+#endif
+}
+
+/*!
+    \reimp
+*/
+void QtCursorPropertyManager::initializeProperty(QtProperty *property)
+{
+#ifndef QT_NO_CURSOR
+    d_ptr->m_values[property] = QCursor();
+#endif
+}
+
+/*!
+    \reimp
+*/
+void QtCursorPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    d_ptr->m_values.remove(property);
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qtpropertymanager.cpp"
+#include "qtpropertymanager.moc"
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtpropertymanager.h b/ThirdParty/GUI/qtpropertybrowser/qtpropertymanager.h
new file mode 100644
index 0000000..340898f
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtpropertymanager.h
@@ -0,0 +1,738 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTPROPERTYMANAGER_H
+#define QTPROPERTYMANAGER_H
+
+#include "qtpropertybrowser.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDate;
+class QTime;
+class QDateTime;
+class QLocale;
+
+class QtGroupPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtGroupPropertyManager(QObject *parent = 0);
+    virtual ~QtGroupPropertyManager();
+
+protected:
+    virtual bool hasValue(const QtProperty *property) const;
+
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+};
+
+class QtIntPropertyManagerPrivate;
+
+class QtIntPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtIntPropertyManager(QObject *parent = 0);
+    virtual ~QtIntPropertyManager();
+
+    int value(const QtProperty *property) const;
+    int minimum(const QtProperty *property) const;
+    int maximum(const QtProperty *property) const;
+    int singleStep(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, int val);
+    void setMinimum(QtProperty *property, int minVal);
+    void setMaximum(QtProperty *property, int maxVal);
+    void setRange(QtProperty *property, int minVal, int maxVal);
+    void setSingleStep(QtProperty *property, int step);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, int val);
+    void rangeChanged(QtProperty *property, int minVal, int maxVal);
+    void singleStepChanged(QtProperty *property, int step);
+protected:
+    QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtIntPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtIntPropertyManager)
+    Q_DISABLE_COPY(QtIntPropertyManager)
+};
+
+class QtBoolPropertyManagerPrivate;
+
+class QtBoolPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtBoolPropertyManager(QObject *parent = 0);
+    virtual ~QtBoolPropertyManager();
+
+    bool value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, bool val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, bool val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual QIcon valueIcon(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtBoolPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtBoolPropertyManager)
+    Q_DISABLE_COPY(QtBoolPropertyManager)
+};
+
+class QtDoublePropertyManagerPrivate;
+
+class QtDoublePropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtDoublePropertyManager(QObject *parent = 0);
+    virtual ~QtDoublePropertyManager();
+
+    double value(const QtProperty *property) const;
+    double minimum(const QtProperty *property) const;
+    double maximum(const QtProperty *property) const;
+    double singleStep(const QtProperty *property) const;
+    int decimals(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, double val);
+    void setMinimum(QtProperty *property, double minVal);
+    void setMaximum(QtProperty *property, double maxVal);
+    void setRange(QtProperty *property, double minVal, double maxVal);
+    void setSingleStep(QtProperty *property, double step);
+    void setDecimals(QtProperty *property, int prec);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, double val);
+    void rangeChanged(QtProperty *property, double minVal, double maxVal);
+    void singleStepChanged(QtProperty *property, double step);
+    void decimalsChanged(QtProperty *property, int prec);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtDoublePropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtDoublePropertyManager)
+    Q_DISABLE_COPY(QtDoublePropertyManager)
+};
+
+class QtStringPropertyManagerPrivate;
+
+class QtStringPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtStringPropertyManager(QObject *parent = 0);
+    virtual ~QtStringPropertyManager();
+
+    QString value(const QtProperty *property) const;
+    QRegExp regExp(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QString &val);
+    void setRegExp(QtProperty *property, const QRegExp &regExp);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QString &val);
+    void regExpChanged(QtProperty *property, const QRegExp &regExp);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtStringPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtStringPropertyManager)
+    Q_DISABLE_COPY(QtStringPropertyManager)
+};
+
+class QtDatePropertyManagerPrivate;
+
+class QtDatePropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtDatePropertyManager(QObject *parent = 0);
+    virtual ~QtDatePropertyManager();
+
+    QDate value(const QtProperty *property) const;
+    QDate minimum(const QtProperty *property) const;
+    QDate maximum(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QDate &val);
+    void setMinimum(QtProperty *property, const QDate &minVal);
+    void setMaximum(QtProperty *property, const QDate &maxVal);
+    void setRange(QtProperty *property, const QDate &minVal, const QDate &maxVal);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QDate &val);
+    void rangeChanged(QtProperty *property, const QDate &minVal, const QDate &maxVal);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtDatePropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtDatePropertyManager)
+    Q_DISABLE_COPY(QtDatePropertyManager)
+};
+
+class QtTimePropertyManagerPrivate;
+
+class QtTimePropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtTimePropertyManager(QObject *parent = 0);
+    virtual ~QtTimePropertyManager();
+
+    QTime value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QTime &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QTime &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtTimePropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtTimePropertyManager)
+    Q_DISABLE_COPY(QtTimePropertyManager)
+};
+
+class QtDateTimePropertyManagerPrivate;
+
+class QtDateTimePropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtDateTimePropertyManager(QObject *parent = 0);
+    virtual ~QtDateTimePropertyManager();
+
+    QDateTime value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QDateTime &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QDateTime &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtDateTimePropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtDateTimePropertyManager)
+    Q_DISABLE_COPY(QtDateTimePropertyManager)
+};
+
+class QtKeySequencePropertyManagerPrivate;
+
+class QtKeySequencePropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtKeySequencePropertyManager(QObject *parent = 0);
+    virtual ~QtKeySequencePropertyManager();
+
+    QKeySequence value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QKeySequence &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QKeySequence &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtKeySequencePropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtKeySequencePropertyManager)
+    Q_DISABLE_COPY(QtKeySequencePropertyManager)
+};
+
+class QtCharPropertyManagerPrivate;
+
+class QtCharPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtCharPropertyManager(QObject *parent = 0);
+    virtual ~QtCharPropertyManager();
+
+    QChar value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QChar &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QChar &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtCharPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtCharPropertyManager)
+    Q_DISABLE_COPY(QtCharPropertyManager)
+};
+
+class QtEnumPropertyManager;
+class QtLocalePropertyManagerPrivate;
+
+class QtLocalePropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtLocalePropertyManager(QObject *parent = 0);
+    virtual ~QtLocalePropertyManager();
+
+    QtEnumPropertyManager *subEnumPropertyManager() const;
+
+    QLocale value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QLocale &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QLocale &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtLocalePropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtLocalePropertyManager)
+    Q_DISABLE_COPY(QtLocalePropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtPointPropertyManagerPrivate;
+
+class QtPointPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtPointPropertyManager(QObject *parent = 0);
+    virtual ~QtPointPropertyManager();
+
+    QtIntPropertyManager *subIntPropertyManager() const;
+
+    QPoint value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QPoint &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QPoint &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtPointPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtPointPropertyManager)
+    Q_DISABLE_COPY(QtPointPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtPointFPropertyManagerPrivate;
+
+class QtPointFPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtPointFPropertyManager(QObject *parent = 0);
+    virtual ~QtPointFPropertyManager();
+
+    QtDoublePropertyManager *subDoublePropertyManager() const;
+
+    QPointF value(const QtProperty *property) const;
+    int decimals(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QPointF &val);
+    void setDecimals(QtProperty *property, int prec);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QPointF &val);
+    void decimalsChanged(QtProperty *property, int prec);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtPointFPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtPointFPropertyManager)
+    Q_DISABLE_COPY(QtPointFPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtSizePropertyManagerPrivate;
+
+class QtSizePropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtSizePropertyManager(QObject *parent = 0);
+    virtual ~QtSizePropertyManager();
+
+    QtIntPropertyManager *subIntPropertyManager() const;
+
+    QSize value(const QtProperty *property) const;
+    QSize minimum(const QtProperty *property) const;
+    QSize maximum(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QSize &val);
+    void setMinimum(QtProperty *property, const QSize &minVal);
+    void setMaximum(QtProperty *property, const QSize &maxVal);
+    void setRange(QtProperty *property, const QSize &minVal, const QSize &maxVal);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QSize &val);
+    void rangeChanged(QtProperty *property, const QSize &minVal, const QSize &maxVal);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtSizePropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtSizePropertyManager)
+    Q_DISABLE_COPY(QtSizePropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtSizeFPropertyManagerPrivate;
+
+class QtSizeFPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtSizeFPropertyManager(QObject *parent = 0);
+    virtual ~QtSizeFPropertyManager();
+
+    QtDoublePropertyManager *subDoublePropertyManager() const;
+
+    QSizeF value(const QtProperty *property) const;
+    QSizeF minimum(const QtProperty *property) const;
+    QSizeF maximum(const QtProperty *property) const;
+    int decimals(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QSizeF &val);
+    void setMinimum(QtProperty *property, const QSizeF &minVal);
+    void setMaximum(QtProperty *property, const QSizeF &maxVal);
+    void setRange(QtProperty *property, const QSizeF &minVal, const QSizeF &maxVal);
+    void setDecimals(QtProperty *property, int prec);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QSizeF &val);
+    void rangeChanged(QtProperty *property, const QSizeF &minVal, const QSizeF &maxVal);
+    void decimalsChanged(QtProperty *property, int prec);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtSizeFPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtSizeFPropertyManager)
+    Q_DISABLE_COPY(QtSizeFPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtRectPropertyManagerPrivate;
+
+class QtRectPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtRectPropertyManager(QObject *parent = 0);
+    virtual ~QtRectPropertyManager();
+
+    QtIntPropertyManager *subIntPropertyManager() const;
+
+    QRect value(const QtProperty *property) const;
+    QRect constraint(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QRect &val);
+    void setConstraint(QtProperty *property, const QRect &constraint);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QRect &val);
+    void constraintChanged(QtProperty *property, const QRect &constraint);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtRectPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtRectPropertyManager)
+    Q_DISABLE_COPY(QtRectPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtRectFPropertyManagerPrivate;
+
+class QtRectFPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtRectFPropertyManager(QObject *parent = 0);
+    virtual ~QtRectFPropertyManager();
+
+    QtDoublePropertyManager *subDoublePropertyManager() const;
+
+    QRectF value(const QtProperty *property) const;
+    QRectF constraint(const QtProperty *property) const;
+    int decimals(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QRectF &val);
+    void setConstraint(QtProperty *property, const QRectF &constraint);
+    void setDecimals(QtProperty *property, int prec);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QRectF &val);
+    void constraintChanged(QtProperty *property, const QRectF &constraint);
+    void decimalsChanged(QtProperty *property, int prec);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtRectFPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtRectFPropertyManager)
+    Q_DISABLE_COPY(QtRectFPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtEnumPropertyManagerPrivate;
+
+class QtEnumPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtEnumPropertyManager(QObject *parent = 0);
+    virtual ~QtEnumPropertyManager();
+
+    int value(const QtProperty *property) const;
+    QStringList enumNames(const QtProperty *property) const;
+    QMap<int, QIcon> enumIcons(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, int val);
+    void setEnumNames(QtProperty *property, const QStringList &names);
+    void setEnumIcons(QtProperty *property, const QMap<int, QIcon> &icons);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, int val);
+    void enumNamesChanged(QtProperty *property, const QStringList &names);
+    void enumIconsChanged(QtProperty *property, const QMap<int, QIcon> &icons);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual QIcon valueIcon(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtEnumPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtEnumPropertyManager)
+    Q_DISABLE_COPY(QtEnumPropertyManager)
+};
+
+class QtFlagPropertyManagerPrivate;
+
+class QtFlagPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtFlagPropertyManager(QObject *parent = 0);
+    virtual ~QtFlagPropertyManager();
+
+    QtBoolPropertyManager *subBoolPropertyManager() const;
+
+    int value(const QtProperty *property) const;
+    QStringList flagNames(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, int val);
+    void setFlagNames(QtProperty *property, const QStringList &names);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, int val);
+    void flagNamesChanged(QtProperty *property, const QStringList &names);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtFlagPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtFlagPropertyManager)
+    Q_DISABLE_COPY(QtFlagPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotBoolChanged(QtProperty *, bool))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtSizePolicyPropertyManagerPrivate;
+
+class QtSizePolicyPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtSizePolicyPropertyManager(QObject *parent = 0);
+    virtual ~QtSizePolicyPropertyManager();
+
+    QtIntPropertyManager *subIntPropertyManager() const;
+    QtEnumPropertyManager *subEnumPropertyManager() const;
+
+    QSizePolicy value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QSizePolicy &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QSizePolicy &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtSizePolicyPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtSizePolicyPropertyManager)
+    Q_DISABLE_COPY(QtSizePolicyPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtFontPropertyManagerPrivate;
+
+class QtFontPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtFontPropertyManager(QObject *parent = 0);
+    virtual ~QtFontPropertyManager();
+
+    QtIntPropertyManager *subIntPropertyManager() const;
+    QtEnumPropertyManager *subEnumPropertyManager() const;
+    QtBoolPropertyManager *subBoolPropertyManager() const;
+
+    QFont value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QFont &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QFont &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual QIcon valueIcon(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtFontPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtFontPropertyManager)
+    Q_DISABLE_COPY(QtFontPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotBoolChanged(QtProperty *, bool))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+    Q_PRIVATE_SLOT(d_func(), void slotFontDatabaseChanged())
+    Q_PRIVATE_SLOT(d_func(), void slotFontDatabaseDelayedChange())
+};
+
+class QtColorPropertyManagerPrivate;
+
+class QtColorPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtColorPropertyManager(QObject *parent = 0);
+    virtual ~QtColorPropertyManager();
+
+    QtIntPropertyManager *subIntPropertyManager() const;
+
+    QColor value(const QtProperty *property) const;
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QColor &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QColor &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual QIcon valueIcon(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtColorPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtColorPropertyManager)
+    Q_DISABLE_COPY(QtColorPropertyManager)
+    Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *))
+};
+
+class QtCursorPropertyManagerPrivate;
+
+class QtCursorPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtCursorPropertyManager(QObject *parent = 0);
+    virtual ~QtCursorPropertyManager();
+
+#ifndef QT_NO_CURSOR
+    QCursor value(const QtProperty *property) const;
+#endif
+
+public Q_SLOTS:
+    void setValue(QtProperty *property, const QCursor &val);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QCursor &val);
+protected:
+    virtual QString valueText(const QtProperty *property) const;
+    virtual QIcon valueIcon(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+private:
+    QScopedPointer<QtCursorPropertyManagerPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtCursorPropertyManager)
+    Q_DISABLE_COPY(QtCursorPropertyManager)
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/ThirdParty/GUI/qtpropertybrowser/qttreepropertybrowser.cpp b/ThirdParty/GUI/qtpropertybrowser/qttreepropertybrowser.cpp
new file mode 100644
index 0000000..a5c4353
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qttreepropertybrowser.cpp
@@ -0,0 +1,1034 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qttreepropertybrowser.h"
+#include <QtCore/QSet>
+#include <QtGui/QIcon>
+#include <QtWidgets/QTreeWidget>
+#include <QtWidgets/QItemDelegate>
+#include <QtWidgets/QHBoxLayout>
+#include <QtWidgets/QHeaderView>
+#include <QtGui/QPainter>
+#include <QtWidgets/QApplication>
+#include <QtGui/QFocusEvent>
+#include <QtWidgets/QStyle>
+#include <QtGui/QPalette>
+
+QT_BEGIN_NAMESPACE
+
+class QtPropertyEditorView;
+
+class QtTreePropertyBrowserPrivate
+{
+    QtTreePropertyBrowser *q_ptr;
+    Q_DECLARE_PUBLIC(QtTreePropertyBrowser)
+
+public:
+    QtTreePropertyBrowserPrivate();
+    void init(QWidget *parent);
+
+    void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex);
+    void propertyRemoved(QtBrowserItem *index);
+    void propertyChanged(QtBrowserItem *index);
+    QWidget *createEditor(QtProperty *property, QWidget *parent) const
+        { return q_ptr->createEditor(property, parent); }
+    QtProperty *indexToProperty(const QModelIndex &index) const;
+    QTreeWidgetItem *indexToItem(const QModelIndex &index) const;
+    QtBrowserItem *indexToBrowserItem(const QModelIndex &index) const;
+    bool lastColumn(int column) const;
+    void disableItem(QTreeWidgetItem *item) const;
+    void enableItem(QTreeWidgetItem *item) const;
+    bool hasValue(QTreeWidgetItem *item) const;
+
+    void slotCollapsed(const QModelIndex &index);
+    void slotExpanded(const QModelIndex &index);
+
+    QColor calculatedBackgroundColor(QtBrowserItem *item) const;
+
+    QtPropertyEditorView *treeWidget() const { return m_treeWidget; }
+    bool markPropertiesWithoutValue() const { return m_markPropertiesWithoutValue; }
+
+    QtBrowserItem *currentItem() const;
+    void setCurrentItem(QtBrowserItem *browserItem, bool block);
+    void editItem(QtBrowserItem *browserItem);
+
+    void slotCurrentBrowserItemChanged(QtBrowserItem *item);
+    void slotCurrentTreeItemChanged(QTreeWidgetItem *newItem, QTreeWidgetItem *);
+
+    QTreeWidgetItem *editedItem() const;
+
+private:
+    void updateItem(QTreeWidgetItem *item);
+
+    QMap<QtBrowserItem *, QTreeWidgetItem *> m_indexToItem;
+    QMap<QTreeWidgetItem *, QtBrowserItem *> m_itemToIndex;
+
+    QMap<QtBrowserItem *, QColor> m_indexToBackgroundColor;
+
+    QtPropertyEditorView *m_treeWidget;
+
+    bool m_headerVisible;
+    QtTreePropertyBrowser::ResizeMode m_resizeMode;
+    class QtPropertyEditorDelegate *m_delegate;
+    bool m_markPropertiesWithoutValue;
+    bool m_browserChangedBlocked;
+    QIcon m_expandIcon;
+};
+
+// ------------ QtPropertyEditorView
+class QtPropertyEditorView : public QTreeWidget
+{
+    Q_OBJECT
+public:
+    QtPropertyEditorView(QWidget *parent = 0);
+
+    void setEditorPrivate(QtTreePropertyBrowserPrivate *editorPrivate)
+        { m_editorPrivate = editorPrivate; }
+
+    QTreeWidgetItem *indexToItem(const QModelIndex &index) const
+        { return itemFromIndex(index); }
+
+protected:
+    void keyPressEvent(QKeyEvent *event);
+    void mousePressEvent(QMouseEvent *event);
+    void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+
+private:
+    QtTreePropertyBrowserPrivate *m_editorPrivate;
+};
+
+QtPropertyEditorView::QtPropertyEditorView(QWidget *parent) :
+    QTreeWidget(parent),
+    m_editorPrivate(0)
+{
+    connect(header(), SIGNAL(sectionDoubleClicked(int)), this, SLOT(resizeColumnToContents(int)));
+}
+
+void QtPropertyEditorView::drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+    QStyleOptionViewItem opt = option;
+    bool hasValue = true;
+    if (m_editorPrivate) {
+        QtProperty *property = m_editorPrivate->indexToProperty(index);
+        if (property)
+            hasValue = property->hasValue();
+    }
+    if (!hasValue && m_editorPrivate->markPropertiesWithoutValue()) {
+        const QColor c = option.palette.color(QPalette::Dark);
+        painter->fillRect(option.rect, c);
+        opt.palette.setColor(QPalette::AlternateBase, c);
+    } else {
+        const QColor c = m_editorPrivate->calculatedBackgroundColor(m_editorPrivate->indexToBrowserItem(index));
+        if (c.isValid()) {
+            painter->fillRect(option.rect, c);
+            opt.palette.setColor(QPalette::AlternateBase, c.lighter(112));
+        }
+    }
+    QTreeWidget::drawRow(painter, opt, index);
+    QColor color = static_cast<QRgb>(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &opt));
+    painter->save();
+    painter->setPen(QPen(color));
+    painter->drawLine(opt.rect.x(), opt.rect.bottom(), opt.rect.right(), opt.rect.bottom());
+    painter->restore();
+}
+
+void QtPropertyEditorView::keyPressEvent(QKeyEvent *event)
+{
+    switch (event->key()) {
+    case Qt::Key_Return:
+    case Qt::Key_Enter:
+    case Qt::Key_Space: // Trigger Edit
+        if (!m_editorPrivate->editedItem())
+            if (const QTreeWidgetItem *item = currentItem())
+                if (item->columnCount() >= 2 && ((item->flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled))) {
+                    event->accept();
+                    // If the current position is at column 0, move to 1.
+                    QModelIndex index = currentIndex();
+                    if (index.column() == 0) {
+                        index = index.sibling(index.row(), 1);
+                        setCurrentIndex(index);
+                    }
+                    edit(index);
+                    return;
+                }
+        break;
+    default:
+        break;
+    }
+    QTreeWidget::keyPressEvent(event);
+}
+
+void QtPropertyEditorView::mousePressEvent(QMouseEvent *event)
+{
+    QTreeWidget::mousePressEvent(event);
+    QTreeWidgetItem *item = itemAt(event->pos());
+
+    if (item) {
+        if ((item != m_editorPrivate->editedItem()) && (event->button() == Qt::LeftButton)
+                && (header()->logicalIndexAt(event->pos().x()) == 1)
+                && ((item->flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled))) {
+            editItem(item, 1);
+        } else if (!m_editorPrivate->hasValue(item) && m_editorPrivate->markPropertiesWithoutValue() && !rootIsDecorated()) {
+            if (event->pos().x() + header()->offset() < 20)
+                item->setExpanded(!item->isExpanded());
+        }
+    }
+}
+
+// ------------ QtPropertyEditorDelegate
+class QtPropertyEditorDelegate : public QItemDelegate
+{
+    Q_OBJECT
+public:
+    QtPropertyEditorDelegate(QObject *parent = 0)
+        : QItemDelegate(parent), m_editorPrivate(0), m_editedItem(0), m_editedWidget(0)
+        {}
+
+    void setEditorPrivate(QtTreePropertyBrowserPrivate *editorPrivate)
+        { m_editorPrivate = editorPrivate; }
+
+    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+            const QModelIndex &index) const;
+
+    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
+            const QModelIndex &index) const;
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+            const QModelIndex &index) const;
+
+    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
+
+    void setModelData(QWidget *, QAbstractItemModel *,
+            const QModelIndex &) const {}
+
+    void setEditorData(QWidget *, const QModelIndex &) const {}
+
+    bool eventFilter(QObject *object, QEvent *event);
+    void closeEditor(QtProperty *property);
+
+    QTreeWidgetItem *editedItem() const { return m_editedItem; }
+
+private slots:
+    void slotEditorDestroyed(QObject *object);
+
+private:
+    int indentation(const QModelIndex &index) const;
+
+    typedef QMap<QWidget *, QtProperty *> EditorToPropertyMap;
+    mutable EditorToPropertyMap m_editorToProperty;
+
+    typedef QMap<QtProperty *, QWidget *> PropertyToEditorMap;
+    mutable PropertyToEditorMap m_propertyToEditor;
+    QtTreePropertyBrowserPrivate *m_editorPrivate;
+    mutable QTreeWidgetItem *m_editedItem;
+    mutable QWidget *m_editedWidget;
+};
+
+int QtPropertyEditorDelegate::indentation(const QModelIndex &index) const
+{
+    if (!m_editorPrivate)
+        return 0;
+
+    QTreeWidgetItem *item = m_editorPrivate->indexToItem(index);
+    int indent = 0;
+    while (item->parent()) {
+        item = item->parent();
+        ++indent;
+    }
+    if (m_editorPrivate->treeWidget()->rootIsDecorated())
+        ++indent;
+    return indent * m_editorPrivate->treeWidget()->indentation();
+}
+
+void QtPropertyEditorDelegate::slotEditorDestroyed(QObject *object)
+{
+    if (QWidget *w = qobject_cast<QWidget *>(object)) {
+        const EditorToPropertyMap::iterator it = m_editorToProperty.find(w);
+        if (it != m_editorToProperty.end()) {
+            m_propertyToEditor.remove(it.value());
+            m_editorToProperty.erase(it);
+        }
+        if (m_editedWidget == w) {
+            m_editedWidget = 0;
+            m_editedItem = 0;
+        }
+    }
+}
+
+void QtPropertyEditorDelegate::closeEditor(QtProperty *property)
+{
+    if (QWidget *w = m_propertyToEditor.value(property, 0))
+        w->deleteLater();
+}
+
+QWidget *QtPropertyEditorDelegate::createEditor(QWidget *parent,
+        const QStyleOptionViewItem &, const QModelIndex &index) const
+{
+    if (index.column() == 1 && m_editorPrivate) {
+        QtProperty *property = m_editorPrivate->indexToProperty(index);
+        QTreeWidgetItem *item = m_editorPrivate->indexToItem(index);
+        if (property && item && (item->flags() & Qt::ItemIsEnabled)) {
+            QWidget *editor = m_editorPrivate->createEditor(property, parent);
+            if (editor) {
+                editor->setAutoFillBackground(true);
+                editor->installEventFilter(const_cast<QtPropertyEditorDelegate *>(this));
+                connect(editor, SIGNAL(destroyed(QObject*)), this, SLOT(slotEditorDestroyed(QObject*)));
+                m_propertyToEditor[property] = editor;
+                m_editorToProperty[editor] = property;
+                m_editedItem = item;
+                m_editedWidget = editor;
+            }
+            return editor;
+        }
+    }
+    return 0;
+}
+
+void QtPropertyEditorDelegate::updateEditorGeometry(QWidget *editor,
+        const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+    Q_UNUSED(index)
+    editor->setGeometry(option.rect.adjusted(0, 0, 0, -1));
+}
+
+void QtPropertyEditorDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
+            const QModelIndex &index) const
+{
+    bool hasValue = true;
+    if (m_editorPrivate) {
+        QtProperty *property = m_editorPrivate->indexToProperty(index);
+        if (property)
+            hasValue = property->hasValue();
+    }
+    QStyleOptionViewItem opt = option;
+    if ((m_editorPrivate && index.column() == 0) || !hasValue) {
+        QtProperty *property = m_editorPrivate->indexToProperty(index);
+        if (property && property->isModified()) {
+            opt.font.setBold(true);
+            opt.fontMetrics = QFontMetrics(opt.font);
+        }
+    }
+    QColor c;
+    if (!hasValue && m_editorPrivate->markPropertiesWithoutValue()) {
+        c = opt.palette.color(QPalette::Dark);
+        opt.palette.setColor(QPalette::Text, opt.palette.color(QPalette::BrightText));
+    } else {
+        c = m_editorPrivate->calculatedBackgroundColor(m_editorPrivate->indexToBrowserItem(index));
+        if (c.isValid() && (opt.features & QStyleOptionViewItemV2::Alternate))
+            c = c.lighter(112);
+    }
+    if (c.isValid())
+        painter->fillRect(option.rect, c);
+    opt.state &= ~QStyle::State_HasFocus;
+    QItemDelegate::paint(painter, opt, index);
+
+    opt.palette.setCurrentColorGroup(QPalette::Active);
+    QColor color = static_cast<QRgb>(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &opt));
+    painter->save();
+    painter->setPen(QPen(color));
+    if (!m_editorPrivate || (!m_editorPrivate->lastColumn(index.column()) && hasValue)) {
+        int right = (option.direction == Qt::LeftToRight) ? option.rect.right() : option.rect.left();
+        painter->drawLine(right, option.rect.y(), right, option.rect.bottom());
+    }
+    painter->restore();
+}
+
+QSize QtPropertyEditorDelegate::sizeHint(const QStyleOptionViewItem &option,
+            const QModelIndex &index) const
+{
+    return QItemDelegate::sizeHint(option, index) + QSize(3, 4);
+}
+
+bool QtPropertyEditorDelegate::eventFilter(QObject *object, QEvent *event)
+{
+    if (event->type() == QEvent::FocusOut) {
+        QFocusEvent *fe = static_cast<QFocusEvent *>(event);
+        if (fe->reason() == Qt::ActiveWindowFocusReason)
+            return false;
+    }
+    return QItemDelegate::eventFilter(object, event);
+}
+
+//  -------- QtTreePropertyBrowserPrivate implementation
+QtTreePropertyBrowserPrivate::QtTreePropertyBrowserPrivate() :
+    m_treeWidget(0),
+    m_headerVisible(true),
+    m_resizeMode(QtTreePropertyBrowser::Stretch),
+    m_delegate(0),
+    m_markPropertiesWithoutValue(false),
+    m_browserChangedBlocked(false)
+{
+}
+
+// Draw an icon indicating opened/closing branches
+static QIcon drawIndicatorIcon(const QPalette &palette, QStyle *style)
+{
+    QPixmap pix(14, 14);
+    pix.fill(Qt::transparent);
+    QStyleOption branchOption;
+    QRect r(QPoint(0, 0), pix.size());
+    branchOption.rect = QRect(2, 2, 9, 9); // ### hardcoded in qcommonstyle.cpp
+    branchOption.palette = palette;
+    branchOption.state = QStyle::State_Children;
+
+    QPainter p;
+    // Draw closed state
+    p.begin(&pix);
+    style->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, &p);
+    p.end();
+    QIcon rc = pix;
+    rc.addPixmap(pix, QIcon::Selected, QIcon::Off);
+    // Draw opened state
+    branchOption.state |= QStyle::State_Open;
+    pix.fill(Qt::transparent);
+    p.begin(&pix);
+    style->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, &p);
+    p.end();
+
+    rc.addPixmap(pix, QIcon::Normal, QIcon::On);
+    rc.addPixmap(pix, QIcon::Selected, QIcon::On);
+    return rc;
+}
+
+void QtTreePropertyBrowserPrivate::init(QWidget *parent)
+{
+    QHBoxLayout *layout = new QHBoxLayout(parent);
+    layout->setMargin(0);
+    m_treeWidget = new QtPropertyEditorView(parent);
+    m_treeWidget->setEditorPrivate(this);
+    m_treeWidget->setIconSize(QSize(18, 18));
+    layout->addWidget(m_treeWidget);
+
+    m_treeWidget->setColumnCount(2);
+    QStringList labels;
+    labels.append(QCoreApplication::translate("QtTreePropertyBrowser", "Property"));
+    labels.append(QCoreApplication::translate("QtTreePropertyBrowser", "Value"));
+    m_treeWidget->setHeaderLabels(labels);
+    m_treeWidget->setAlternatingRowColors(true);
+    m_treeWidget->setEditTriggers(QAbstractItemView::EditKeyPressed);
+    m_delegate = new QtPropertyEditorDelegate(parent);
+    m_delegate->setEditorPrivate(this);
+    m_treeWidget->setItemDelegate(m_delegate);
+    m_treeWidget->header()->setSectionsMovable(false);
+    m_treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch);
+
+    m_expandIcon = drawIndicatorIcon(q_ptr->palette(), q_ptr->style());
+
+    QObject::connect(m_treeWidget, SIGNAL(collapsed(QModelIndex)), q_ptr, SLOT(slotCollapsed(QModelIndex)));
+    QObject::connect(m_treeWidget, SIGNAL(expanded(QModelIndex)), q_ptr, SLOT(slotExpanded(QModelIndex)));
+    QObject::connect(m_treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), q_ptr, SLOT(slotCurrentTreeItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)));
+}
+
+QtBrowserItem *QtTreePropertyBrowserPrivate::currentItem() const
+{
+    if (QTreeWidgetItem *treeItem = m_treeWidget->currentItem())
+        return m_itemToIndex.value(treeItem);
+    return 0;
+}
+
+void QtTreePropertyBrowserPrivate::setCurrentItem(QtBrowserItem *browserItem, bool block)
+{
+    const bool blocked = block ? m_treeWidget->blockSignals(true) : false;
+    if (browserItem == 0)
+        m_treeWidget->setCurrentItem(0);
+    else
+        m_treeWidget->setCurrentItem(m_indexToItem.value(browserItem));
+    if (block)
+        m_treeWidget->blockSignals(blocked);
+}
+
+QtProperty *QtTreePropertyBrowserPrivate::indexToProperty(const QModelIndex &index) const
+{
+    QTreeWidgetItem *item = m_treeWidget->indexToItem(index);
+    QtBrowserItem *idx = m_itemToIndex.value(item);
+    if (idx)
+        return idx->property();
+    return 0;
+}
+
+QtBrowserItem *QtTreePropertyBrowserPrivate::indexToBrowserItem(const QModelIndex &index) const
+{
+    QTreeWidgetItem *item = m_treeWidget->indexToItem(index);
+    return m_itemToIndex.value(item);
+}
+
+QTreeWidgetItem *QtTreePropertyBrowserPrivate::indexToItem(const QModelIndex &index) const
+{
+    return m_treeWidget->indexToItem(index);
+}
+
+bool QtTreePropertyBrowserPrivate::lastColumn(int column) const
+{
+    return m_treeWidget->header()->visualIndex(column) == m_treeWidget->columnCount() - 1;
+}
+
+void QtTreePropertyBrowserPrivate::disableItem(QTreeWidgetItem *item) const
+{
+    Qt::ItemFlags flags = item->flags();
+    if (flags & Qt::ItemIsEnabled) {
+        flags &= ~Qt::ItemIsEnabled;
+        item->setFlags(flags);
+        m_delegate->closeEditor(m_itemToIndex[item]->property());
+        const int childCount = item->childCount();
+        for (int i = 0; i < childCount; i++) {
+            QTreeWidgetItem *child = item->child(i);
+            disableItem(child);
+        }
+    }
+}
+
+void QtTreePropertyBrowserPrivate::enableItem(QTreeWidgetItem *item) const
+{
+    Qt::ItemFlags flags = item->flags();
+    flags |= Qt::ItemIsEnabled;
+    item->setFlags(flags);
+    const int childCount = item->childCount();
+    for (int i = 0; i < childCount; i++) {
+        QTreeWidgetItem *child = item->child(i);
+        QtProperty *property = m_itemToIndex[child]->property();
+        if (property->isEnabled()) {
+            enableItem(child);
+        }
+    }
+}
+
+bool QtTreePropertyBrowserPrivate::hasValue(QTreeWidgetItem *item) const
+{
+    QtBrowserItem *browserItem = m_itemToIndex.value(item);
+    if (browserItem)
+        return browserItem->property()->hasValue();
+    return false;
+}
+
+void QtTreePropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex)
+{
+    QTreeWidgetItem *afterItem = m_indexToItem.value(afterIndex);
+    QTreeWidgetItem *parentItem = m_indexToItem.value(index->parent());
+
+    QTreeWidgetItem *newItem = 0;
+    if (parentItem) {
+        newItem = new QTreeWidgetItem(parentItem, afterItem);
+    } else {
+        newItem = new QTreeWidgetItem(m_treeWidget, afterItem);
+    }
+    m_itemToIndex[newItem] = index;
+    m_indexToItem[index] = newItem;
+
+    newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
+    m_treeWidget->setItemExpanded(newItem, true);
+
+    updateItem(newItem);
+}
+
+void QtTreePropertyBrowserPrivate::propertyRemoved(QtBrowserItem *index)
+{
+    QTreeWidgetItem *item = m_indexToItem.value(index);
+
+    if (m_treeWidget->currentItem() == item) {
+        m_treeWidget->setCurrentItem(0);
+    }
+
+    delete item;
+
+    m_indexToItem.remove(index);
+    m_itemToIndex.remove(item);
+    m_indexToBackgroundColor.remove(index);
+}
+
+void QtTreePropertyBrowserPrivate::propertyChanged(QtBrowserItem *index)
+{
+    QTreeWidgetItem *item = m_indexToItem.value(index);
+
+    updateItem(item);
+}
+
+void QtTreePropertyBrowserPrivate::updateItem(QTreeWidgetItem *item)
+{
+    QtProperty *property = m_itemToIndex[item]->property();
+    QIcon expandIcon;
+    if (property->hasValue()) {
+        QString toolTip = property->toolTip();
+        if (toolTip.isEmpty())
+            toolTip = property->valueText();
+        item->setToolTip(1, toolTip);
+        item->setIcon(1, property->valueIcon());
+        item->setText(1, property->valueText());
+    } else if (markPropertiesWithoutValue() && !m_treeWidget->rootIsDecorated()) {
+        expandIcon = m_expandIcon;
+    }
+    item->setIcon(0, expandIcon);
+    //item->setFirstColumnSpanned(!property->hasValue());
+    item->setToolTip(0, property->propertyName());
+    item->setStatusTip(0, property->statusTip());
+    item->setWhatsThis(0, property->whatsThis());
+    item->setText(0, property->propertyName());
+    bool wasEnabled = item->flags() & Qt::ItemIsEnabled;
+    bool isEnabled = wasEnabled;
+    if (property->isEnabled()) {
+        QTreeWidgetItem *parent = item->parent();
+        if (!parent || (parent->flags() & Qt::ItemIsEnabled))
+            isEnabled = true;
+        else
+            isEnabled = false;
+    } else {
+        isEnabled = false;
+    }
+    if (wasEnabled != isEnabled) {
+        if (isEnabled)
+            enableItem(item);
+        else
+            disableItem(item);
+    }
+    m_treeWidget->viewport()->update();
+}
+
+QColor QtTreePropertyBrowserPrivate::calculatedBackgroundColor(QtBrowserItem *item) const
+{
+    QtBrowserItem *i = item;
+    const QMap<QtBrowserItem *, QColor>::const_iterator itEnd = m_indexToBackgroundColor.constEnd();
+    while (i) {
+        QMap<QtBrowserItem *, QColor>::const_iterator it = m_indexToBackgroundColor.constFind(i);
+        if (it != itEnd)
+            return it.value();
+        i = i->parent();
+    }
+    return QColor();
+}
+
+void QtTreePropertyBrowserPrivate::slotCollapsed(const QModelIndex &index)
+{
+    QTreeWidgetItem *item = indexToItem(index);
+    QtBrowserItem *idx = m_itemToIndex.value(item);
+    if (item)
+        emit q_ptr->collapsed(idx);
+}
+
+void QtTreePropertyBrowserPrivate::slotExpanded(const QModelIndex &index)
+{
+    QTreeWidgetItem *item = indexToItem(index);
+    QtBrowserItem *idx = m_itemToIndex.value(item);
+    if (item)
+        emit q_ptr->expanded(idx);
+}
+
+void QtTreePropertyBrowserPrivate::slotCurrentBrowserItemChanged(QtBrowserItem *item)
+{
+    if (!m_browserChangedBlocked && item != currentItem())
+        setCurrentItem(item, true);
+}
+
+void QtTreePropertyBrowserPrivate::slotCurrentTreeItemChanged(QTreeWidgetItem *newItem, QTreeWidgetItem *)
+{
+    QtBrowserItem *browserItem = newItem ? m_itemToIndex.value(newItem) : 0;
+    m_browserChangedBlocked = true;
+    q_ptr->setCurrentItem(browserItem);
+    m_browserChangedBlocked = false;
+}
+
+QTreeWidgetItem *QtTreePropertyBrowserPrivate::editedItem() const
+{
+    return m_delegate->editedItem();
+}
+
+void QtTreePropertyBrowserPrivate::editItem(QtBrowserItem *browserItem)
+{
+    if (QTreeWidgetItem *treeItem = m_indexToItem.value(browserItem, 0)) {
+        m_treeWidget->setCurrentItem (treeItem, 1);
+        m_treeWidget->editItem(treeItem, 1);
+    }
+}
+
+/*!
+    \class QtTreePropertyBrowser
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtTreePropertyBrowser class provides QTreeWidget based
+    property browser.
+
+    A property browser is a widget that enables the user to edit a
+    given set of properties. Each property is represented by a label
+    specifying the property's name, and an editing widget (e.g. a line
+    edit or a combobox) holding its value. A property can have zero or
+    more subproperties.
+
+    QtTreePropertyBrowser provides a tree based view for all nested
+    properties, i.e. properties that have subproperties can be in an
+    expanded (subproperties are visible) or collapsed (subproperties
+    are hidden) state. For example:
+
+    \image qttreepropertybrowser.png
+
+    Use the QtAbstractPropertyBrowser API to add, insert and remove
+    properties from an instance of the QtTreePropertyBrowser class.
+    The properties themselves are created and managed by
+    implementations of the QtAbstractPropertyManager class.
+
+    \sa QtGroupBoxPropertyBrowser, QtAbstractPropertyBrowser
+*/
+
+/*!
+    \fn void QtTreePropertyBrowser::collapsed(QtBrowserItem *item)
+
+    This signal is emitted when the \a item is collapsed.
+
+    \sa expanded(), setExpanded()
+*/
+
+/*!
+    \fn void QtTreePropertyBrowser::expanded(QtBrowserItem *item)
+
+    This signal is emitted when the \a item is expanded.
+
+    \sa collapsed(), setExpanded()
+*/
+
+/*!
+    Creates a property browser with the given \a parent.
+*/
+QtTreePropertyBrowser::QtTreePropertyBrowser(QWidget *parent)
+    : QtAbstractPropertyBrowser(parent), d_ptr(new QtTreePropertyBrowserPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->init(this);
+    connect(this, SIGNAL(currentItemChanged(QtBrowserItem*)), this, SLOT(slotCurrentBrowserItemChanged(QtBrowserItem*)));
+}
+
+/*!
+    Destroys this property browser.
+
+    Note that the properties that were inserted into this browser are
+    \e not destroyed since they may still be used in other
+    browsers. The properties are owned by the manager that created
+    them.
+
+    \sa QtProperty, QtAbstractPropertyManager
+*/
+QtTreePropertyBrowser::~QtTreePropertyBrowser()
+{
+}
+
+/*!
+    \property QtTreePropertyBrowser::indentation
+    \brief indentation of the items in the tree view.
+*/
+int QtTreePropertyBrowser::indentation() const
+{
+    return d_ptr->m_treeWidget->indentation();
+}
+
+void QtTreePropertyBrowser::setIndentation(int i)
+{
+    d_ptr->m_treeWidget->setIndentation(i);
+}
+
+/*!
+  \property QtTreePropertyBrowser::rootIsDecorated
+  \brief whether to show controls for expanding and collapsing root items.
+*/
+bool QtTreePropertyBrowser::rootIsDecorated() const
+{
+    return d_ptr->m_treeWidget->rootIsDecorated();
+}
+
+void QtTreePropertyBrowser::setRootIsDecorated(bool show)
+{
+    d_ptr->m_treeWidget->setRootIsDecorated(show);
+    QMapIterator<QTreeWidgetItem *, QtBrowserItem *> it(d_ptr->m_itemToIndex);
+    while (it.hasNext()) {
+        QtProperty *property = it.next().value()->property();
+        if (!property->hasValue())
+            d_ptr->updateItem(it.key());
+    }
+}
+
+/*!
+  \property QtTreePropertyBrowser::alternatingRowColors
+  \brief whether to draw the background using alternating colors.
+  By default this property is set to true.
+*/
+bool QtTreePropertyBrowser::alternatingRowColors() const
+{
+    return d_ptr->m_treeWidget->alternatingRowColors();
+}
+
+void QtTreePropertyBrowser::setAlternatingRowColors(bool enable)
+{
+    d_ptr->m_treeWidget->setAlternatingRowColors(enable);
+    QMapIterator<QTreeWidgetItem *, QtBrowserItem *> it(d_ptr->m_itemToIndex);
+}
+
+/*!
+  \property QtTreePropertyBrowser::headerVisible
+  \brief whether to show the header.
+*/
+bool QtTreePropertyBrowser::isHeaderVisible() const
+{
+    return d_ptr->m_headerVisible;
+}
+
+void QtTreePropertyBrowser::setHeaderVisible(bool visible)
+{
+    if (d_ptr->m_headerVisible == visible)
+        return;
+
+    d_ptr->m_headerVisible = visible;
+    d_ptr->m_treeWidget->header()->setVisible(visible);
+}
+
+/*!
+  \enum QtTreePropertyBrowser::ResizeMode
+
+  The resize mode specifies the behavior of the header sections.
+
+  \value Interactive The user can resize the sections.
+  The sections can also be resized programmatically using setSplitterPosition().
+
+  \value Fixed The user cannot resize the section.
+  The section can only be resized programmatically using setSplitterPosition().
+
+  \value Stretch QHeaderView will automatically resize the section to fill the available space.
+  The size cannot be changed by the user or programmatically.
+
+  \value ResizeToContents QHeaderView will automatically resize the section to its optimal
+  size based on the contents of the entire column.
+  The size cannot be changed by the user or programmatically.
+
+  \sa setResizeMode()
+*/
+
+/*!
+    \property QtTreePropertyBrowser::resizeMode
+    \brief the resize mode of setions in the header.
+*/
+
+QtTreePropertyBrowser::ResizeMode QtTreePropertyBrowser::resizeMode() const
+{
+    return d_ptr->m_resizeMode;
+}
+
+void QtTreePropertyBrowser::setResizeMode(QtTreePropertyBrowser::ResizeMode mode)
+{
+    if (d_ptr->m_resizeMode == mode)
+        return;
+
+    d_ptr->m_resizeMode = mode;
+    QHeaderView::ResizeMode m = QHeaderView::Stretch;
+    switch (mode) {
+        case QtTreePropertyBrowser::Interactive:      m = QHeaderView::Interactive;      break;
+        case QtTreePropertyBrowser::Fixed:            m = QHeaderView::Fixed;            break;
+        case QtTreePropertyBrowser::ResizeToContents: m = QHeaderView::ResizeToContents; break;
+        case QtTreePropertyBrowser::Stretch:
+        default:                                      m = QHeaderView::Stretch;          break;
+    }
+    d_ptr->m_treeWidget->header()->setSectionResizeMode(m);
+}
+
+/*!
+    \property QtTreePropertyBrowser::splitterPosition
+    \brief the position of the splitter between the colunms.
+*/
+
+int QtTreePropertyBrowser::splitterPosition() const
+{
+    return d_ptr->m_treeWidget->header()->sectionSize(0);
+}
+
+void QtTreePropertyBrowser::setSplitterPosition(int position)
+{
+    d_ptr->m_treeWidget->header()->resizeSection(0, position);
+}
+
+/*!
+    Sets the \a item to either collapse or expanded, depending on the value of \a expanded.
+
+    \sa isExpanded(), expanded(), collapsed()
+*/
+
+void QtTreePropertyBrowser::setExpanded(QtBrowserItem *item, bool expanded)
+{
+    QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item);
+    if (treeItem)
+        treeItem->setExpanded(expanded);
+}
+
+/*!
+    Returns true if the \a item is expanded; otherwise returns false.
+
+    \sa setExpanded()
+*/
+
+bool QtTreePropertyBrowser::isExpanded(QtBrowserItem *item) const
+{
+    QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item);
+    if (treeItem)
+        return treeItem->isExpanded();
+    return false;
+}
+
+/*!
+    Returns true if the \a item is visible; otherwise returns false.
+
+    \sa setItemVisible()
+    \since 4.5
+*/
+
+bool QtTreePropertyBrowser::isItemVisible(QtBrowserItem *item) const
+{
+    if (const QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item))
+        return !treeItem->isHidden();
+    return false;
+}
+
+/*!
+    Sets the \a item to be visible, depending on the value of \a visible.
+
+   \sa isItemVisible()
+   \since 4.5
+*/
+
+void QtTreePropertyBrowser::setItemVisible(QtBrowserItem *item, bool visible)
+{
+    if (QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item))
+        treeItem->setHidden(!visible);
+}
+
+/*!
+    Sets the \a item's background color to \a color. Note that while item's background
+    is rendered every second row is being drawn with alternate color (which is a bit lighter than items \a color)
+
+    \sa backgroundColor(), calculatedBackgroundColor()
+*/
+
+void QtTreePropertyBrowser::setBackgroundColor(QtBrowserItem *item, const QColor &color)
+{
+    if (!d_ptr->m_indexToItem.contains(item))
+        return;
+    if (color.isValid())
+        d_ptr->m_indexToBackgroundColor[item] = color;
+    else
+        d_ptr->m_indexToBackgroundColor.remove(item);
+    d_ptr->m_treeWidget->viewport()->update();
+}
+
+/*!
+    Returns the \a item's color. If there is no color set for item it returns invalid color.
+
+    \sa calculatedBackgroundColor(), setBackgroundColor()
+*/
+
+QColor QtTreePropertyBrowser::backgroundColor(QtBrowserItem *item) const
+{
+    return d_ptr->m_indexToBackgroundColor.value(item);
+}
+
+/*!
+    Returns the \a item's color. If there is no color set for item it returns parent \a item's
+    color (if there is no color set for parent it returns grandparent's color and so on). In case
+    the color is not set for \a item and it's top level item it returns invalid color.
+
+    \sa backgroundColor(), setBackgroundColor()
+*/
+
+QColor QtTreePropertyBrowser::calculatedBackgroundColor(QtBrowserItem *item) const
+{
+    return d_ptr->calculatedBackgroundColor(item);
+}
+
+/*!
+    \property QtTreePropertyBrowser::propertiesWithoutValueMarked
+    \brief whether to enable or disable marking properties without value.
+
+    When marking is enabled the item's background is rendered in dark color and item's
+    foreground is rendered with light color.
+
+    \sa propertiesWithoutValueMarked()
+*/
+void QtTreePropertyBrowser::setPropertiesWithoutValueMarked(bool mark)
+{
+    if (d_ptr->m_markPropertiesWithoutValue == mark)
+        return;
+
+    d_ptr->m_markPropertiesWithoutValue = mark;
+    QMapIterator<QTreeWidgetItem *, QtBrowserItem *> it(d_ptr->m_itemToIndex);
+    while (it.hasNext()) {
+        QtProperty *property = it.next().value()->property();
+        if (!property->hasValue())
+            d_ptr->updateItem(it.key());
+    }
+    d_ptr->m_treeWidget->viewport()->update();
+}
+
+bool QtTreePropertyBrowser::propertiesWithoutValueMarked() const
+{
+    return d_ptr->m_markPropertiesWithoutValue;
+}
+
+/*!
+    \reimp
+*/
+void QtTreePropertyBrowser::itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem)
+{
+    d_ptr->propertyInserted(item, afterItem);
+}
+
+/*!
+    \reimp
+*/
+void QtTreePropertyBrowser::itemRemoved(QtBrowserItem *item)
+{
+    d_ptr->propertyRemoved(item);
+}
+
+/*!
+    \reimp
+*/
+void QtTreePropertyBrowser::itemChanged(QtBrowserItem *item)
+{
+    d_ptr->propertyChanged(item);
+}
+
+/*!
+    Sets the current item to \a item and opens the relevant editor for it.
+*/
+void QtTreePropertyBrowser::editItem(QtBrowserItem *item)
+{
+    d_ptr->editItem(item);
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qttreepropertybrowser.cpp"
+#include "qttreepropertybrowser.moc"
diff --git a/ThirdParty/GUI/qtpropertybrowser/qttreepropertybrowser.h b/ThirdParty/GUI/qtpropertybrowser/qttreepropertybrowser.h
new file mode 100644
index 0000000..58fce61
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qttreepropertybrowser.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTTREEPROPERTYBROWSER_H
+#define QTTREEPROPERTYBROWSER_H
+
+#include "qtpropertybrowser.h"
+
+QT_BEGIN_NAMESPACE
+
+class QTreeWidgetItem;
+class QtTreePropertyBrowserPrivate;
+
+class QtTreePropertyBrowser : public QtAbstractPropertyBrowser
+{
+    Q_OBJECT
+    Q_ENUMS(ResizeMode)
+    Q_PROPERTY(int indentation READ indentation WRITE setIndentation)
+    Q_PROPERTY(bool rootIsDecorated READ rootIsDecorated WRITE setRootIsDecorated)
+    Q_PROPERTY(bool alternatingRowColors READ alternatingRowColors WRITE setAlternatingRowColors)
+    Q_PROPERTY(bool headerVisible READ isHeaderVisible WRITE setHeaderVisible)
+    Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode)
+    Q_PROPERTY(int splitterPosition READ splitterPosition WRITE setSplitterPosition)
+    Q_PROPERTY(bool propertiesWithoutValueMarked READ propertiesWithoutValueMarked WRITE setPropertiesWithoutValueMarked)
+public:
+
+    enum ResizeMode
+    {
+        Interactive,
+        Stretch,
+        Fixed,
+        ResizeToContents
+    };
+
+    QtTreePropertyBrowser(QWidget *parent = 0);
+    virtual ~QtTreePropertyBrowser();
+
+    int indentation() const;
+    void setIndentation(int i);
+
+    bool rootIsDecorated() const;
+    void setRootIsDecorated(bool show);
+
+    bool alternatingRowColors() const;
+    void setAlternatingRowColors(bool enable);
+
+    bool isHeaderVisible() const;
+    void setHeaderVisible(bool visible);
+
+    ResizeMode resizeMode() const;
+    void setResizeMode(ResizeMode mode);
+
+    int splitterPosition() const;
+    void setSplitterPosition(int position);
+
+    void setExpanded(QtBrowserItem *item, bool expanded);
+    bool isExpanded(QtBrowserItem *item) const;
+
+    bool isItemVisible(QtBrowserItem *item) const;
+    void setItemVisible(QtBrowserItem *item, bool visible);
+
+    void setBackgroundColor(QtBrowserItem *item, const QColor &color);
+    QColor backgroundColor(QtBrowserItem *item) const;
+    QColor calculatedBackgroundColor(QtBrowserItem *item) const;
+
+    void setPropertiesWithoutValueMarked(bool mark);
+    bool propertiesWithoutValueMarked() const;
+
+    void editItem(QtBrowserItem *item);
+
+Q_SIGNALS:
+
+    void collapsed(QtBrowserItem *item);
+    void expanded(QtBrowserItem *item);
+
+protected:
+    virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem);
+    virtual void itemRemoved(QtBrowserItem *item);
+    virtual void itemChanged(QtBrowserItem *item);
+
+private:
+
+    QScopedPointer<QtTreePropertyBrowserPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtTreePropertyBrowser)
+    Q_DISABLE_COPY(QtTreePropertyBrowser)
+
+    Q_PRIVATE_SLOT(d_func(), void slotCollapsed(const QModelIndex &))
+    Q_PRIVATE_SLOT(d_func(), void slotExpanded(const QModelIndex &))
+    Q_PRIVATE_SLOT(d_func(), void slotCurrentBrowserItemChanged(QtBrowserItem *))
+    Q_PRIVATE_SLOT(d_func(), void slotCurrentTreeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *))
+
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtvariantproperty.cpp b/ThirdParty/GUI/qtpropertybrowser/qtvariantproperty.cpp
new file mode 100644
index 0000000..3056984
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtvariantproperty.cpp
@@ -0,0 +1,2259 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qtvariantproperty.h"
+#include "qtpropertymanager.h"
+#include "qteditorfactory.h"
+#include <QtCore/QVariant>
+#include <QtGui/QIcon>
+#include <QtCore/QDate>
+#include <QtCore/QLocale>
+
+#if defined(Q_CC_MSVC)
+#    pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QtEnumPropertyType
+{
+};
+
+
+class QtFlagPropertyType
+{
+};
+
+
+class QtGroupPropertyType
+{
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QtEnumPropertyType)
+Q_DECLARE_METATYPE(QtFlagPropertyType)
+Q_DECLARE_METATYPE(QtGroupPropertyType)
+
+QT_BEGIN_NAMESPACE
+
+/*!
+    Returns the type id for an enum property.
+
+    Note that the property's value type can be retrieved using the
+    valueType() function (which is QVariant::Int for the enum property
+    type).
+
+    \sa propertyType(), valueType()
+*/
+int QtVariantPropertyManager::enumTypeId()
+{
+    return qMetaTypeId<QtEnumPropertyType>();
+}
+
+/*!
+    Returns the type id for a flag property.
+
+    Note that the property's value type can be retrieved using the
+    valueType() function (which is QVariant::Int for the flag property
+    type).
+
+    \sa propertyType(), valueType()
+*/
+int QtVariantPropertyManager::flagTypeId()
+{
+    return qMetaTypeId<QtFlagPropertyType>();
+}
+
+/*!
+    Returns the type id for a group property.
+
+    Note that the property's value type can be retrieved using the
+    valueType() function (which is QVariant::Invalid for the group
+    property type, since it doesn't provide any value).
+
+    \sa propertyType(), valueType()
+*/
+int QtVariantPropertyManager::groupTypeId()
+{
+    return qMetaTypeId<QtGroupPropertyType>();
+}
+
+/*!
+    Returns the type id for a icon map attribute.
+
+    Note that the property's attribute type can be retrieved using the
+    attributeType() function.
+
+    \sa attributeType(), QtEnumPropertyManager::enumIcons()
+*/
+int QtVariantPropertyManager::iconMapTypeId()
+{
+    return qMetaTypeId<QtIconMap>();
+}
+
+typedef QMap<const QtProperty *, QtProperty *> PropertyMap;
+Q_GLOBAL_STATIC(PropertyMap, propertyToWrappedProperty)
+
+static QtProperty *wrappedProperty(QtProperty *property)
+{
+    return propertyToWrappedProperty()->value(property, 0);
+}
+
+class QtVariantPropertyPrivate
+{
+public:
+    QtVariantPropertyPrivate(QtVariantPropertyManager *m) : manager(m) {}
+
+    QtVariantPropertyManager *manager;
+};
+
+/*!
+    \class QtVariantProperty
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtVariantProperty class is a convenience class handling
+    QVariant based properties.
+
+    QtVariantProperty provides additional API: A property's type,
+    value type, attribute values and current value can easily be
+    retrieved using the propertyType(), valueType(), attributeValue()
+    and value() functions respectively. In addition, the attribute
+    values and the current value can be set using the corresponding
+    setValue() and setAttribute() functions.
+
+    For example, instead of writing:
+
+    \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtvariantproperty.cpp 0
+
+    you can write:
+
+    \snippet doc/src/snippets/code/tools_shared_qtpropertybrowser_qtvariantproperty.cpp 1
+
+    QtVariantProperty instances can only be created by the
+    QtVariantPropertyManager class.
+
+    \sa QtProperty, QtVariantPropertyManager, QtVariantEditorFactory
+*/
+
+/*!
+    Creates a variant property using the given \a manager.
+
+    Do not use this constructor to create variant property instances;
+    use the QtVariantPropertyManager::addProperty() function
+    instead.  This constructor is used internally by the
+    QtVariantPropertyManager::createProperty() function.
+
+    \sa QtVariantPropertyManager
+*/
+QtVariantProperty::QtVariantProperty(QtVariantPropertyManager *manager)
+    : QtProperty(manager), d_ptr(new QtVariantPropertyPrivate(manager))
+{
+}
+
+/*!
+    Destroys this property.
+
+    \sa QtProperty::~QtProperty()
+*/
+QtVariantProperty::~QtVariantProperty()
+{
+}
+
+/*!
+    Returns the property's current value.
+
+    \sa valueType(), setValue()
+*/
+QVariant QtVariantProperty::value() const
+{
+    return d_ptr->manager->value(this);
+}
+
+/*!
+    Returns this property's value for the specified \a attribute.
+
+    QtVariantPropertyManager provides a couple of related functions:
+    \l{QtVariantPropertyManager::attributes()}{attributes()} and
+    \l{QtVariantPropertyManager::attributeType()}{attributeType()}.
+
+    \sa setAttribute()
+*/
+QVariant QtVariantProperty::attributeValue(const QString &attribute) const
+{
+    return d_ptr->manager->attributeValue(this, attribute);
+}
+
+/*!
+    Returns the type of this property's value.
+
+    \sa propertyType()
+*/
+int QtVariantProperty::valueType() const
+{
+    return d_ptr->manager->valueType(this);
+}
+
+/*!
+    Returns this property's type.
+
+    QtVariantPropertyManager provides several related functions:
+    \l{QtVariantPropertyManager::enumTypeId()}{enumTypeId()},
+    \l{QtVariantPropertyManager::flagTypeId()}{flagTypeId()} and
+    \l{QtVariantPropertyManager::groupTypeId()}{groupTypeId()}.
+
+    \sa valueType()
+*/
+int QtVariantProperty::propertyType() const
+{
+    return d_ptr->manager->propertyType(this);
+}
+
+/*!
+    Sets the value of this property to \a value.
+
+    The specified \a value must be of the type returned by
+    valueType(), or of a type that can be converted to valueType()
+    using the QVariant::canConvert() function; otherwise this function
+    does nothing.
+
+    \sa value()
+*/
+void QtVariantProperty::setValue(const QVariant &value)
+{
+    d_ptr->manager->setValue(this, value);
+}
+
+/*!
+    Sets the \a attribute of property to \a value.
+
+    QtVariantPropertyManager provides the related
+    \l{QtVariantPropertyManager::setAttribute()}{setAttribute()}
+    function.
+
+    \sa attributeValue()
+*/
+void QtVariantProperty::setAttribute(const QString &attribute, const QVariant &value)
+{
+    d_ptr->manager->setAttribute(this, attribute, value);
+}
+
+class QtVariantPropertyManagerPrivate
+{
+    QtVariantPropertyManager *q_ptr;
+    Q_DECLARE_PUBLIC(QtVariantPropertyManager)
+public:
+    QtVariantPropertyManagerPrivate();
+
+    bool m_creatingProperty;
+    bool m_creatingSubProperties;
+    bool m_destroyingSubProperties;
+    int m_propertyType;
+
+    void slotValueChanged(QtProperty *property, int val);
+    void slotRangeChanged(QtProperty *property, int min, int max);
+    void slotSingleStepChanged(QtProperty *property, int step);
+    void slotValueChanged(QtProperty *property, double val);
+    void slotRangeChanged(QtProperty *property, double min, double max);
+    void slotSingleStepChanged(QtProperty *property, double step);
+    void slotDecimalsChanged(QtProperty *property, int prec);
+    void slotValueChanged(QtProperty *property, bool val);
+    void slotValueChanged(QtProperty *property, const QString &val);
+    void slotRegExpChanged(QtProperty *property, const QRegExp &regExp);
+    void slotValueChanged(QtProperty *property, const QDate &val);
+    void slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max);
+    void slotValueChanged(QtProperty *property, const QTime &val);
+    void slotValueChanged(QtProperty *property, const QDateTime &val);
+    void slotValueChanged(QtProperty *property, const QKeySequence &val);
+    void slotValueChanged(QtProperty *property, const QChar &val);
+    void slotValueChanged(QtProperty *property, const QLocale &val);
+    void slotValueChanged(QtProperty *property, const QPoint &val);
+    void slotValueChanged(QtProperty *property, const QPointF &val);
+    void slotValueChanged(QtProperty *property, const QSize &val);
+    void slotRangeChanged(QtProperty *property, const QSize &min, const QSize &max);
+    void slotValueChanged(QtProperty *property, const QSizeF &val);
+    void slotRangeChanged(QtProperty *property, const QSizeF &min, const QSizeF &max);
+    void slotValueChanged(QtProperty *property, const QRect &val);
+    void slotConstraintChanged(QtProperty *property, const QRect &val);
+    void slotValueChanged(QtProperty *property, const QRectF &val);
+    void slotConstraintChanged(QtProperty *property, const QRectF &val);
+    void slotValueChanged(QtProperty *property, const QColor &val);
+    void slotEnumChanged(QtProperty *property, int val);
+    void slotEnumNamesChanged(QtProperty *property, const QStringList &enumNames);
+    void slotEnumIconsChanged(QtProperty *property, const QMap<int, QIcon> &enumIcons);
+    void slotValueChanged(QtProperty *property, const QSizePolicy &val);
+    void slotValueChanged(QtProperty *property, const QFont &val);
+    void slotValueChanged(QtProperty *property, const QCursor &val);
+    void slotFlagChanged(QtProperty *property, int val);
+    void slotFlagNamesChanged(QtProperty *property, const QStringList &flagNames);
+    void slotPropertyInserted(QtProperty *property, QtProperty *parent, QtProperty *after);
+    void slotPropertyRemoved(QtProperty *property, QtProperty *parent);
+
+    void valueChanged(QtProperty *property, const QVariant &val);
+
+    int internalPropertyToType(QtProperty *property) const;
+    QtVariantProperty *createSubProperty(QtVariantProperty *parent, QtVariantProperty *after,
+            QtProperty *internal);
+    void removeSubProperty(QtVariantProperty *property);
+
+    QMap<int, QtAbstractPropertyManager *> m_typeToPropertyManager;
+    QMap<int, QMap<QString, int> > m_typeToAttributeToAttributeType;
+
+    QMap<const QtProperty *, QPair<QtVariantProperty *, int> > m_propertyToType;
+
+    QMap<int, int> m_typeToValueType;
+
+
+    QMap<QtProperty *, QtVariantProperty *> m_internalToProperty;
+
+    const QString m_constraintAttribute;
+    const QString m_singleStepAttribute;
+    const QString m_decimalsAttribute;
+    const QString m_enumIconsAttribute;
+    const QString m_enumNamesAttribute;
+    const QString m_flagNamesAttribute;
+    const QString m_maximumAttribute;
+    const QString m_minimumAttribute;
+    const QString m_regExpAttribute;
+};
+
+QtVariantPropertyManagerPrivate::QtVariantPropertyManagerPrivate() :
+    m_constraintAttribute(QLatin1String("constraint")),
+    m_singleStepAttribute(QLatin1String("singleStep")),
+    m_decimalsAttribute(QLatin1String("decimals")),
+    m_enumIconsAttribute(QLatin1String("enumIcons")),
+    m_enumNamesAttribute(QLatin1String("enumNames")),
+    m_flagNamesAttribute(QLatin1String("flagNames")),
+    m_maximumAttribute(QLatin1String("maximum")),
+    m_minimumAttribute(QLatin1String("minimum")),
+    m_regExpAttribute(QLatin1String("regExp"))
+{
+}
+
+int QtVariantPropertyManagerPrivate::internalPropertyToType(QtProperty *property) const
+{
+    int type = 0;
+    QtAbstractPropertyManager *internPropertyManager = property->propertyManager();
+    if (qobject_cast<QtIntPropertyManager *>(internPropertyManager))
+        type = QVariant::Int;
+    else if (qobject_cast<QtEnumPropertyManager *>(internPropertyManager))
+        type = QtVariantPropertyManager::enumTypeId();
+    else if (qobject_cast<QtBoolPropertyManager *>(internPropertyManager))
+        type = QVariant::Bool;
+    else if (qobject_cast<QtDoublePropertyManager *>(internPropertyManager))
+        type = QVariant::Double;
+    return type;
+}
+
+QtVariantProperty *QtVariantPropertyManagerPrivate::createSubProperty(QtVariantProperty *parent,
+            QtVariantProperty *after, QtProperty *internal)
+{
+    int type = internalPropertyToType(internal);
+    if (!type)
+        return 0;
+
+    bool wasCreatingSubProperties = m_creatingSubProperties;
+    m_creatingSubProperties = true;
+
+    QtVariantProperty *varChild = q_ptr->addProperty(type, internal->propertyName());
+
+    m_creatingSubProperties = wasCreatingSubProperties;
+
+    varChild->setPropertyName(internal->propertyName());
+    varChild->setToolTip(internal->toolTip());
+    varChild->setStatusTip(internal->statusTip());
+    varChild->setWhatsThis(internal->whatsThis());
+
+    parent->insertSubProperty(varChild, after);
+
+    m_internalToProperty[internal] = varChild;
+    propertyToWrappedProperty()->insert(varChild, internal);
+    return varChild;
+}
+
+void QtVariantPropertyManagerPrivate::removeSubProperty(QtVariantProperty *property)
+{
+    QtProperty *internChild = wrappedProperty(property);
+    bool wasDestroyingSubProperties = m_destroyingSubProperties;
+    m_destroyingSubProperties = true;
+    delete property;
+    m_destroyingSubProperties = wasDestroyingSubProperties;
+    m_internalToProperty.remove(internChild);
+    propertyToWrappedProperty()->remove(property);
+}
+
+void QtVariantPropertyManagerPrivate::slotPropertyInserted(QtProperty *property,
+            QtProperty *parent, QtProperty *after)
+{
+    if (m_creatingProperty)
+        return;
+
+    QtVariantProperty *varParent = m_internalToProperty.value(parent, 0);
+    if (!varParent)
+        return;
+
+    QtVariantProperty *varAfter = 0;
+    if (after) {
+        varAfter = m_internalToProperty.value(after, 0);
+        if (!varAfter)
+            return;
+    }
+
+    createSubProperty(varParent, varAfter, property);
+}
+
+void QtVariantPropertyManagerPrivate::slotPropertyRemoved(QtProperty *property, QtProperty *parent)
+{
+    Q_UNUSED(parent)
+
+    QtVariantProperty *varProperty = m_internalToProperty.value(property, 0);
+    if (!varProperty)
+        return;
+
+    removeSubProperty(varProperty);
+}
+
+void QtVariantPropertyManagerPrivate::valueChanged(QtProperty *property, const QVariant &val)
+{
+    QtVariantProperty *varProp = m_internalToProperty.value(property, 0);
+    if (!varProp)
+        return;
+    emit q_ptr->valueChanged(varProp, val);
+    emit q_ptr->propertyChanged(varProp);
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, int val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, int min, int max)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
+        emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
+        emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
+    }
+}
+
+void QtVariantPropertyManagerPrivate::slotSingleStepChanged(QtProperty *property, int step)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_singleStepAttribute, QVariant(step));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, double val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, double min, double max)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
+        emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
+        emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
+    }
+}
+
+void QtVariantPropertyManagerPrivate::slotSingleStepChanged(QtProperty *property, double step)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_singleStepAttribute, QVariant(step));
+}
+
+void QtVariantPropertyManagerPrivate::slotDecimalsChanged(QtProperty *property, int prec)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_decimalsAttribute, QVariant(prec));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, bool val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QString &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotRegExpChanged(QtProperty *property, const QRegExp &regExp)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_regExpAttribute, QVariant(regExp));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QDate &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
+        emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
+        emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
+    }
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QTime &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QDateTime &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QKeySequence &val)
+{
+    QVariant v;
+    v.setValue(val);
+    valueChanged(property, v);
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QChar &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QLocale &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QPoint &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QPointF &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSize &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QSize &min, const QSize &max)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
+        emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
+        emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
+    }
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSizeF &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QSizeF &min, const QSizeF &max)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
+        emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min));
+        emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max));
+    }
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QRect &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotConstraintChanged(QtProperty *property, const QRect &constraint)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_constraintAttribute, QVariant(constraint));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QRectF &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotConstraintChanged(QtProperty *property, const QRectF &constraint)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_constraintAttribute, QVariant(constraint));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QColor &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotEnumNamesChanged(QtProperty *property, const QStringList &enumNames)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_enumNamesAttribute, QVariant(enumNames));
+}
+
+void QtVariantPropertyManagerPrivate::slotEnumIconsChanged(QtProperty *property, const QMap<int, QIcon> &enumIcons)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) {
+        QVariant v;
+        v.setValue(enumIcons);
+        emit q_ptr->attributeChanged(varProp, m_enumIconsAttribute, v);
+    }
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSizePolicy &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QFont &val)
+{
+    valueChanged(property, QVariant(val));
+}
+
+void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QCursor &val)
+{
+#ifndef QT_NO_CURSOR
+    valueChanged(property, QVariant(val));
+#endif
+}
+
+void QtVariantPropertyManagerPrivate::slotFlagNamesChanged(QtProperty *property, const QStringList &flagNames)
+{
+    if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0))
+        emit q_ptr->attributeChanged(varProp, m_flagNamesAttribute, QVariant(flagNames));
+}
+
+/*!
+    \class QtVariantPropertyManager
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtVariantPropertyManager class provides and manages QVariant based properties.
+
+    QtVariantPropertyManager provides the addProperty() function which
+    creates QtVariantProperty objects. The QtVariantProperty class is
+    a convenience class handling QVariant based properties inheriting
+    QtProperty. A QtProperty object created by a
+    QtVariantPropertyManager instance can be converted into a
+    QtVariantProperty object using the variantProperty() function.
+
+    The property's value can be retrieved using the value(), and set
+    using the setValue() slot. In addition the property's type, and
+    the type of its value, can be retrieved using the propertyType()
+    and valueType() functions respectively.
+
+    A property's type is a QVariant::Type enumerator value, and
+    usually a property's type is the same as its value type. But for
+    some properties the types differ, for example for enums, flags and
+    group types in which case QtVariantPropertyManager provides the
+    enumTypeId(), flagTypeId() and groupTypeId() functions,
+    respectively, to identify their property type (the value types are
+    QVariant::Int for the enum and flag types, and QVariant::Invalid
+    for the group type).
+
+    Use the isPropertyTypeSupported() function to check if a particular
+    property type is supported. The currently supported property types
+    are:
+
+    \table
+    \header
+        \li Property Type
+        \li Property Type Id
+    \row
+        \li int
+        \li QVariant::Int
+    \row
+        \li double
+        \li QVariant::Double
+    \row
+        \li bool
+        \li QVariant::Bool
+    \row
+        \li QString
+        \li QVariant::String
+    \row
+        \li QDate
+        \li QVariant::Date
+    \row
+        \li QTime
+        \li QVariant::Time
+    \row
+        \li QDateTime
+        \li QVariant::DateTime
+    \row
+        \li QKeySequence
+        \li QVariant::KeySequence
+    \row
+        \li QChar
+        \li QVariant::Char
+    \row
+        \li QLocale
+        \li QVariant::Locale
+    \row
+        \li QPoint
+        \li QVariant::Point
+    \row
+        \li QPointF
+        \li QVariant::PointF
+    \row
+        \li QSize
+        \li QVariant::Size
+    \row
+        \li QSizeF
+        \li QVariant::SizeF
+    \row
+        \li QRect
+        \li QVariant::Rect
+    \row
+        \li QRectF
+        \li QVariant::RectF
+    \row
+        \li QColor
+        \li QVariant::Color
+    \row
+        \li QSizePolicy
+        \li QVariant::SizePolicy
+    \row
+        \li QFont
+        \li QVariant::Font
+    \row
+        \li QCursor
+        \li QVariant::Cursor
+    \row
+        \li enum
+        \li enumTypeId()
+    \row
+        \li flag
+        \li flagTypeId()
+    \row
+        \li group
+        \li groupTypeId()
+    \endtable
+
+    Each property type can provide additional attributes,
+    e.g. QVariant::Int and QVariant::Double provides minimum and
+    maximum values. The currently supported attributes are:
+
+    \table
+    \header
+        \li Property Type
+        \li Attribute Name
+        \li Attribute Type
+    \row
+        \li \c int
+        \li minimum
+        \li QVariant::Int
+    \row
+        \li
+        \li maximum
+        \li QVariant::Int
+    \row
+        \li
+        \li singleStep
+        \li QVariant::Int
+    \row
+        \li \c double
+        \li minimum
+        \li QVariant::Double
+    \row
+        \li
+        \li maximum
+        \li QVariant::Double
+    \row
+        \li
+        \li singleStep
+        \li QVariant::Double
+    \row
+        \li
+        \li decimals
+        \li QVariant::Int
+    \row
+        \li QString
+        \li regExp
+        \li QVariant::RegExp
+    \row
+        \li QDate
+        \li minimum
+        \li QVariant::Date
+    \row
+        \li
+        \li maximum
+        \li QVariant::Date
+    \row
+        \li QPointF
+        \li decimals
+        \li QVariant::Int
+    \row
+        \li QSize
+        \li minimum
+        \li QVariant::Size
+    \row
+        \li
+        \li maximum
+        \li QVariant::Size
+    \row
+        \li QSizeF
+        \li minimum
+        \li QVariant::SizeF
+    \row
+        \li
+        \li maximum
+        \li QVariant::SizeF
+    \row
+        \li
+        \li decimals
+        \li QVariant::Int
+    \row
+        \li QRect
+        \li constraint
+        \li QVariant::Rect
+    \row
+        \li QRectF
+        \li constraint
+        \li QVariant::RectF
+    \row
+        \li
+        \li decimals
+        \li QVariant::Int
+    \row
+        \li \c enum
+        \li enumNames
+        \li QVariant::StringList
+    \row
+        \li
+        \li enumIcons
+        \li iconMapTypeId()
+    \row
+        \li \c flag
+        \li flagNames
+        \li QVariant::StringList
+    \endtable
+
+    The attributes for a given property type can be retrieved using
+    the attributes() function. Each attribute has a value type which
+    can be retrieved using the attributeType() function, and a value
+    accessible through the attributeValue() function. In addition, the
+    value can be set using the setAttribute() slot.
+
+    QtVariantManager also provides the valueChanged() signal which is
+    emitted whenever a property created by this manager change, and
+    the attributeChanged() signal which is emitted whenever an
+    attribute of such a property changes.
+
+    \sa QtVariantProperty, QtVariantEditorFactory
+*/
+
+/*!
+    \fn void QtVariantPropertyManager::valueChanged(QtProperty *property, const QVariant &value)
+
+    This signal is emitted whenever a property created by this manager
+    changes its value, passing a pointer to the \a property and the
+    new \a value as parameters.
+
+    \sa setValue()
+*/
+
+/*!
+    \fn void QtVariantPropertyManager::attributeChanged(QtProperty *property,
+                const QString &attribute, const QVariant &value)
+
+    This signal is emitted whenever an attribute of a property created
+    by this manager changes its value, passing a pointer to the \a
+    property, the \a attribute and the new \a value as parameters.
+
+    \sa setAttribute()
+*/
+
+/*!
+    Creates a manager with the given \a parent.
+*/
+QtVariantPropertyManager::QtVariantPropertyManager(QObject *parent)
+    : QtAbstractPropertyManager(parent), d_ptr(new QtVariantPropertyManagerPrivate)
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_creatingProperty = false;
+    d_ptr->m_creatingSubProperties = false;
+    d_ptr->m_destroyingSubProperties = false;
+    d_ptr->m_propertyType = 0;
+
+    // IntPropertyManager
+    QtIntPropertyManager *intPropertyManager = new QtIntPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Int] = intPropertyManager;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_minimumAttribute] = QVariant::Int;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_maximumAttribute] = QVariant::Int;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_singleStepAttribute] = QVariant::Int;
+    d_ptr->m_typeToValueType[QVariant::Int] = QVariant::Int;
+    connect(intPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(intPropertyManager, SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(intPropertyManager, SIGNAL(singleStepChanged(QtProperty*,int)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,int)));
+    // DoublePropertyManager
+    QtDoublePropertyManager *doublePropertyManager = new QtDoublePropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Double] = doublePropertyManager;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_minimumAttribute] =
+            QVariant::Double;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_maximumAttribute] =
+            QVariant::Double;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_singleStepAttribute] =
+            QVariant::Double;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_decimalsAttribute] =
+            QVariant::Int;
+    d_ptr->m_typeToValueType[QVariant::Double] = QVariant::Double;
+    connect(doublePropertyManager, SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotValueChanged(QtProperty*,double)));
+    connect(doublePropertyManager, SIGNAL(rangeChanged(QtProperty*,double,double)),
+                this, SLOT(slotRangeChanged(QtProperty*,double,double)));
+    connect(doublePropertyManager, SIGNAL(singleStepChanged(QtProperty*,double)),
+                this, SLOT(slotSingleStepChanged(QtProperty*,double)));
+    connect(doublePropertyManager, SIGNAL(decimalsChanged(QtProperty*,int)),
+                this, SLOT(slotDecimalsChanged(QtProperty*,int)));
+    // BoolPropertyManager
+    QtBoolPropertyManager *boolPropertyManager = new QtBoolPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Bool] = boolPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Bool] = QVariant::Bool;
+    connect(boolPropertyManager, SIGNAL(valueChanged(QtProperty*,bool)),
+                this, SLOT(slotValueChanged(QtProperty*,bool)));
+    // StringPropertyManager
+    QtStringPropertyManager *stringPropertyManager = new QtStringPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::String] = stringPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::String] = QVariant::String;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::String][d_ptr->m_regExpAttribute] =
+            QVariant::RegExp;
+    connect(stringPropertyManager, SIGNAL(valueChanged(QtProperty*,QString)),
+                this, SLOT(slotValueChanged(QtProperty*,QString)));
+    connect(stringPropertyManager, SIGNAL(regExpChanged(QtProperty*,QRegExp)),
+                this, SLOT(slotRegExpChanged(QtProperty*,QRegExp)));
+    // DatePropertyManager
+    QtDatePropertyManager *datePropertyManager = new QtDatePropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Date] = datePropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Date] = QVariant::Date;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Date][d_ptr->m_minimumAttribute] =
+            QVariant::Date;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Date][d_ptr->m_maximumAttribute] =
+            QVariant::Date;
+    connect(datePropertyManager, SIGNAL(valueChanged(QtProperty*,QDate)),
+                this, SLOT(slotValueChanged(QtProperty*,QDate)));
+    connect(datePropertyManager, SIGNAL(rangeChanged(QtProperty*,QDate,QDate)),
+                this, SLOT(slotRangeChanged(QtProperty*,QDate,QDate)));
+    // TimePropertyManager
+    QtTimePropertyManager *timePropertyManager = new QtTimePropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Time] = timePropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Time] = QVariant::Time;
+    connect(timePropertyManager, SIGNAL(valueChanged(QtProperty*,QTime)),
+                this, SLOT(slotValueChanged(QtProperty*,QTime)));
+    // DateTimePropertyManager
+    QtDateTimePropertyManager *dateTimePropertyManager = new QtDateTimePropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::DateTime] = dateTimePropertyManager;
+    d_ptr->m_typeToValueType[QVariant::DateTime] = QVariant::DateTime;
+    connect(dateTimePropertyManager, SIGNAL(valueChanged(QtProperty*,QDateTime)),
+                this, SLOT(slotValueChanged(QtProperty*,QDateTime)));
+    // KeySequencePropertyManager
+    QtKeySequencePropertyManager *keySequencePropertyManager = new QtKeySequencePropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::KeySequence] = keySequencePropertyManager;
+    d_ptr->m_typeToValueType[QVariant::KeySequence] = QVariant::KeySequence;
+    connect(keySequencePropertyManager, SIGNAL(valueChanged(QtProperty*,QKeySequence)),
+                this, SLOT(slotValueChanged(QtProperty*,QKeySequence)));
+    // CharPropertyManager
+    QtCharPropertyManager *charPropertyManager = new QtCharPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Char] = charPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Char] = QVariant::Char;
+    connect(charPropertyManager, SIGNAL(valueChanged(QtProperty*,QChar)),
+                this, SLOT(slotValueChanged(QtProperty*,QChar)));
+    // LocalePropertyManager
+    QtLocalePropertyManager *localePropertyManager = new QtLocalePropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Locale] = localePropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Locale] = QVariant::Locale;
+    connect(localePropertyManager, SIGNAL(valueChanged(QtProperty*,QLocale)),
+                this, SLOT(slotValueChanged(QtProperty*,QLocale)));
+    connect(localePropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(localePropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(localePropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // PointPropertyManager
+    QtPointPropertyManager *pointPropertyManager = new QtPointPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Point] = pointPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Point] = QVariant::Point;
+    connect(pointPropertyManager, SIGNAL(valueChanged(QtProperty*,QPoint)),
+                this, SLOT(slotValueChanged(QtProperty*,QPoint)));
+    connect(pointPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(pointPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(pointPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // PointFPropertyManager
+    QtPointFPropertyManager *pointFPropertyManager = new QtPointFPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::PointF] = pointFPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::PointF] = QVariant::PointF;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::PointF][d_ptr->m_decimalsAttribute] =
+            QVariant::Int;
+    connect(pointFPropertyManager, SIGNAL(valueChanged(QtProperty*,QPointF)),
+                this, SLOT(slotValueChanged(QtProperty*,QPointF)));
+    connect(pointFPropertyManager, SIGNAL(decimalsChanged(QtProperty*,int)),
+                this, SLOT(slotDecimalsChanged(QtProperty*,int)));
+    connect(pointFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotValueChanged(QtProperty*,double)));
+    connect(pointFPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(pointFPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // SizePropertyManager
+    QtSizePropertyManager *sizePropertyManager = new QtSizePropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Size] = sizePropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Size] = QVariant::Size;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Size][d_ptr->m_minimumAttribute] =
+            QVariant::Size;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Size][d_ptr->m_maximumAttribute] =
+            QVariant::Size;
+    connect(sizePropertyManager, SIGNAL(valueChanged(QtProperty*,QSize)),
+                this, SLOT(slotValueChanged(QtProperty*,QSize)));
+    connect(sizePropertyManager, SIGNAL(rangeChanged(QtProperty*,QSize,QSize)),
+                this, SLOT(slotRangeChanged(QtProperty*,QSize,QSize)));
+    connect(sizePropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(sizePropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(sizePropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(sizePropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // SizeFPropertyManager
+    QtSizeFPropertyManager *sizeFPropertyManager = new QtSizeFPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::SizeF] = sizeFPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::SizeF] = QVariant::SizeF;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_minimumAttribute] =
+            QVariant::SizeF;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_maximumAttribute] =
+            QVariant::SizeF;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_decimalsAttribute] =
+            QVariant::Int;
+    connect(sizeFPropertyManager, SIGNAL(valueChanged(QtProperty*,QSizeF)),
+                this, SLOT(slotValueChanged(QtProperty*,QSizeF)));
+    connect(sizeFPropertyManager, SIGNAL(rangeChanged(QtProperty*,QSizeF,QSizeF)),
+                this, SLOT(slotRangeChanged(QtProperty*,QSizeF,QSizeF)));
+    connect(sizeFPropertyManager, SIGNAL(decimalsChanged(QtProperty*,int)),
+                this, SLOT(slotDecimalsChanged(QtProperty*,int)));
+    connect(sizeFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotValueChanged(QtProperty*,double)));
+    connect(sizeFPropertyManager->subDoublePropertyManager(), SIGNAL(rangeChanged(QtProperty*,double,double)),
+                this, SLOT(slotRangeChanged(QtProperty*,double,double)));
+    connect(sizeFPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(sizeFPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // RectPropertyManager
+    QtRectPropertyManager *rectPropertyManager = new QtRectPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Rect] = rectPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Rect] = QVariant::Rect;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::Rect][d_ptr->m_constraintAttribute] =
+            QVariant::Rect;
+    connect(rectPropertyManager, SIGNAL(valueChanged(QtProperty*,QRect)),
+                this, SLOT(slotValueChanged(QtProperty*,QRect)));
+    connect(rectPropertyManager, SIGNAL(constraintChanged(QtProperty*,QRect)),
+                this, SLOT(slotConstraintChanged(QtProperty*,QRect)));
+    connect(rectPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(rectPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(rectPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(rectPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // RectFPropertyManager
+    QtRectFPropertyManager *rectFPropertyManager = new QtRectFPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::RectF] = rectFPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::RectF] = QVariant::RectF;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::RectF][d_ptr->m_constraintAttribute] =
+            QVariant::RectF;
+    d_ptr->m_typeToAttributeToAttributeType[QVariant::RectF][d_ptr->m_decimalsAttribute] =
+            QVariant::Int;
+    connect(rectFPropertyManager, SIGNAL(valueChanged(QtProperty*,QRectF)),
+                this, SLOT(slotValueChanged(QtProperty*,QRectF)));
+    connect(rectFPropertyManager, SIGNAL(constraintChanged(QtProperty*,QRectF)),
+                this, SLOT(slotConstraintChanged(QtProperty*,QRectF)));
+    connect(rectFPropertyManager, SIGNAL(decimalsChanged(QtProperty*,int)),
+                this, SLOT(slotDecimalsChanged(QtProperty*,int)));
+    connect(rectFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty*,double)),
+                this, SLOT(slotValueChanged(QtProperty*,double)));
+    connect(rectFPropertyManager->subDoublePropertyManager(), SIGNAL(rangeChanged(QtProperty*,double,double)),
+                this, SLOT(slotRangeChanged(QtProperty*,double,double)));
+    connect(rectFPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(rectFPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // ColorPropertyManager
+    QtColorPropertyManager *colorPropertyManager = new QtColorPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Color] = colorPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Color] = QVariant::Color;
+    connect(colorPropertyManager, SIGNAL(valueChanged(QtProperty*,QColor)),
+                this, SLOT(slotValueChanged(QtProperty*,QColor)));
+    connect(colorPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(colorPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(colorPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // EnumPropertyManager
+    int enumId = enumTypeId();
+    QtEnumPropertyManager *enumPropertyManager = new QtEnumPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[enumId] = enumPropertyManager;
+    d_ptr->m_typeToValueType[enumId] = QVariant::Int;
+    d_ptr->m_typeToAttributeToAttributeType[enumId][d_ptr->m_enumNamesAttribute] =
+            QVariant::StringList;
+    d_ptr->m_typeToAttributeToAttributeType[enumId][d_ptr->m_enumIconsAttribute] =
+            iconMapTypeId();
+    connect(enumPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(enumPropertyManager, SIGNAL(enumNamesChanged(QtProperty*,QStringList)),
+                this, SLOT(slotEnumNamesChanged(QtProperty*,QStringList)));
+    connect(enumPropertyManager, SIGNAL(enumIconsChanged(QtProperty*,QMap<int,QIcon>)),
+                this, SLOT(slotEnumIconsChanged(QtProperty*,QMap<int,QIcon>)));
+    // SizePolicyPropertyManager
+    QtSizePolicyPropertyManager *sizePolicyPropertyManager = new QtSizePolicyPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::SizePolicy] = sizePolicyPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::SizePolicy] = QVariant::SizePolicy;
+    connect(sizePolicyPropertyManager, SIGNAL(valueChanged(QtProperty*,QSizePolicy)),
+                this, SLOT(slotValueChanged(QtProperty*,QSizePolicy)));
+    connect(sizePolicyPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(sizePolicyPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(sizePolicyPropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(sizePolicyPropertyManager->subEnumPropertyManager(),
+                SIGNAL(enumNamesChanged(QtProperty*,QStringList)),
+                this, SLOT(slotEnumNamesChanged(QtProperty*,QStringList)));
+    connect(sizePolicyPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(sizePolicyPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // FontPropertyManager
+    QtFontPropertyManager *fontPropertyManager = new QtFontPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Font] = fontPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Font] = QVariant::Font;
+    connect(fontPropertyManager, SIGNAL(valueChanged(QtProperty*,QFont)),
+                this, SLOT(slotValueChanged(QtProperty*,QFont)));
+    connect(fontPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(fontPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty*,int,int)),
+                this, SLOT(slotRangeChanged(QtProperty*,int,int)));
+    connect(fontPropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(fontPropertyManager->subEnumPropertyManager(),
+                SIGNAL(enumNamesChanged(QtProperty*,QStringList)),
+                this, SLOT(slotEnumNamesChanged(QtProperty*,QStringList)));
+    connect(fontPropertyManager->subBoolPropertyManager(), SIGNAL(valueChanged(QtProperty*,bool)),
+                this, SLOT(slotValueChanged(QtProperty*,bool)));
+    connect(fontPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(fontPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // CursorPropertyManager
+    QtCursorPropertyManager *cursorPropertyManager = new QtCursorPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[QVariant::Cursor] = cursorPropertyManager;
+    d_ptr->m_typeToValueType[QVariant::Cursor] = QVariant::Cursor;
+    connect(cursorPropertyManager, SIGNAL(valueChanged(QtProperty*,QCursor)),
+                this, SLOT(slotValueChanged(QtProperty*,QCursor)));
+    // FlagPropertyManager
+    int flagId = flagTypeId();
+    QtFlagPropertyManager *flagPropertyManager = new QtFlagPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[flagId] = flagPropertyManager;
+    d_ptr->m_typeToValueType[flagId] = QVariant::Int;
+    d_ptr->m_typeToAttributeToAttributeType[flagId][d_ptr->m_flagNamesAttribute] =
+            QVariant::StringList;
+    connect(flagPropertyManager, SIGNAL(valueChanged(QtProperty*,int)),
+                this, SLOT(slotValueChanged(QtProperty*,int)));
+    connect(flagPropertyManager, SIGNAL(flagNamesChanged(QtProperty*,QStringList)),
+                this, SLOT(slotFlagNamesChanged(QtProperty*,QStringList)));
+    connect(flagPropertyManager->subBoolPropertyManager(), SIGNAL(valueChanged(QtProperty*,bool)),
+                this, SLOT(slotValueChanged(QtProperty*,bool)));
+    connect(flagPropertyManager, SIGNAL(propertyInserted(QtProperty*,QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyInserted(QtProperty*,QtProperty*,QtProperty*)));
+    connect(flagPropertyManager, SIGNAL(propertyRemoved(QtProperty*,QtProperty*)),
+                this, SLOT(slotPropertyRemoved(QtProperty*,QtProperty*)));
+    // FlagPropertyManager
+    int groupId = groupTypeId();
+    QtGroupPropertyManager *groupPropertyManager = new QtGroupPropertyManager(this);
+    d_ptr->m_typeToPropertyManager[groupId] = groupPropertyManager;
+    d_ptr->m_typeToValueType[groupId] = QVariant::Invalid;
+}
+
+/*!
+    Destroys this manager, and all the properties it has created.
+*/
+QtVariantPropertyManager::~QtVariantPropertyManager()
+{
+    clear();
+}
+
+/*!
+    Returns the given \a property converted into a QtVariantProperty.
+
+    If the \a property was not created by this variant manager, the
+    function returns 0.
+
+    \sa createProperty()
+*/
+QtVariantProperty *QtVariantPropertyManager::variantProperty(const QtProperty *property) const
+{
+    const QMap<const QtProperty *, QPair<QtVariantProperty *, int> >::const_iterator it = d_ptr->m_propertyToType.constFind(property);
+    if (it == d_ptr->m_propertyToType.constEnd())
+        return 0;
+    return it.value().first;
+}
+
+/*!
+    Returns true if the given \a propertyType is supported by this
+    variant manager; otherwise false.
+
+    \sa propertyType()
+*/
+bool QtVariantPropertyManager::isPropertyTypeSupported(int propertyType) const
+{
+    if (d_ptr->m_typeToValueType.contains(propertyType))
+        return true;
+    return false;
+}
+
+/*!
+   Creates and returns a variant property of the given \a propertyType
+   with the given \a name.
+
+   If the specified \a propertyType is not supported by this variant
+   manager, this function returns 0.
+
+   Do not use the inherited
+   QtAbstractPropertyManager::addProperty() function to create a
+   variant property (that function will always return 0 since it will
+   not be clear what type the property should have).
+
+    \sa isPropertyTypeSupported()
+*/
+QtVariantProperty *QtVariantPropertyManager::addProperty(int propertyType, const QString &name)
+{
+    if (!isPropertyTypeSupported(propertyType))
+        return 0;
+
+    bool wasCreating = d_ptr->m_creatingProperty;
+    d_ptr->m_creatingProperty = true;
+    d_ptr->m_propertyType = propertyType;
+    QtProperty *property = QtAbstractPropertyManager::addProperty(name);
+    d_ptr->m_creatingProperty = wasCreating;
+    d_ptr->m_propertyType = 0;
+
+    if (!property)
+        return 0;
+
+    return variantProperty(property);
+}
+
+/*!
+    Returns the given \a property's value.
+
+    If the given \a property is not managed by this manager, this
+    function returns an invalid variant.
+
+    \sa setValue()
+*/
+QVariant QtVariantPropertyManager::value(const QtProperty *property) const
+{
+    QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
+    if (internProp == 0)
+        return QVariant();
+
+    QtAbstractPropertyManager *manager = internProp->propertyManager();
+    if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
+        return intManager->value(internProp);
+    } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
+        return doubleManager->value(internProp);
+    } else if (QtBoolPropertyManager *boolManager = qobject_cast<QtBoolPropertyManager *>(manager)) {
+        return boolManager->value(internProp);
+    } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
+        return stringManager->value(internProp);
+    } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
+        return dateManager->value(internProp);
+    } else if (QtTimePropertyManager *timeManager = qobject_cast<QtTimePropertyManager *>(manager)) {
+        return timeManager->value(internProp);
+    } else if (QtDateTimePropertyManager *dateTimeManager = qobject_cast<QtDateTimePropertyManager *>(manager)) {
+        return dateTimeManager->value(internProp);
+    } else if (QtKeySequencePropertyManager *keySequenceManager = qobject_cast<QtKeySequencePropertyManager *>(manager)) {
+        return QVariant::fromValue(keySequenceManager->value(internProp));
+    } else if (QtCharPropertyManager *charManager = qobject_cast<QtCharPropertyManager *>(manager)) {
+        return charManager->value(internProp);
+    } else if (QtLocalePropertyManager *localeManager = qobject_cast<QtLocalePropertyManager *>(manager)) {
+        return localeManager->value(internProp);
+    } else if (QtPointPropertyManager *pointManager = qobject_cast<QtPointPropertyManager *>(manager)) {
+        return pointManager->value(internProp);
+    } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
+        return pointFManager->value(internProp);
+    } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
+        return sizeManager->value(internProp);
+    } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
+        return sizeFManager->value(internProp);
+    } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
+        return rectManager->value(internProp);
+    } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
+        return rectFManager->value(internProp);
+    } else if (QtColorPropertyManager *colorManager = qobject_cast<QtColorPropertyManager *>(manager)) {
+        return colorManager->value(internProp);
+    } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
+        return enumManager->value(internProp);
+    } else if (QtSizePolicyPropertyManager *sizePolicyManager =
+               qobject_cast<QtSizePolicyPropertyManager *>(manager)) {
+        return sizePolicyManager->value(internProp);
+    } else if (QtFontPropertyManager *fontManager = qobject_cast<QtFontPropertyManager *>(manager)) {
+        return fontManager->value(internProp);
+#ifndef QT_NO_CURSOR
+    } else if (QtCursorPropertyManager *cursorManager = qobject_cast<QtCursorPropertyManager *>(manager)) {
+        return cursorManager->value(internProp);
+#endif
+    } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
+        return flagManager->value(internProp);
+    }
+    return QVariant();
+}
+
+/*!
+    Returns the given \a property's value type.
+
+    \sa propertyType()
+*/
+int QtVariantPropertyManager::valueType(const QtProperty *property) const
+{
+    int propType = propertyType(property);
+    return valueType(propType);
+}
+
+/*!
+    \overload
+
+    Returns the value type associated with the given \a propertyType.
+*/
+int QtVariantPropertyManager::valueType(int propertyType) const
+{
+    if (d_ptr->m_typeToValueType.contains(propertyType))
+        return d_ptr->m_typeToValueType[propertyType];
+    return 0;
+}
+
+/*!
+    Returns the given \a property's type.
+
+    \sa valueType()
+*/
+int QtVariantPropertyManager::propertyType(const QtProperty *property) const
+{
+    const QMap<const QtProperty *, QPair<QtVariantProperty *, int> >::const_iterator it = d_ptr->m_propertyToType.constFind(property);
+    if (it == d_ptr->m_propertyToType.constEnd())
+        return 0;
+    return it.value().second;
+}
+
+/*!
+    Returns the given \a property's value for the specified \a
+    attribute
+
+    If the given \a property was not created by \e this manager, or if
+    the specified \a attribute does not exist, this function returns
+    an invalid variant.
+
+    \sa attributes(), attributeType(), setAttribute()
+*/
+QVariant QtVariantPropertyManager::attributeValue(const QtProperty *property, const QString &attribute) const
+{
+    int propType = propertyType(property);
+    if (!propType)
+        return QVariant();
+
+    QMap<int, QMap<QString, int> >::ConstIterator it =
+            d_ptr->m_typeToAttributeToAttributeType.find(propType);
+    if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd())
+        return QVariant();
+
+    QMap<QString, int> attributes = it.value();
+    QMap<QString, int>::ConstIterator itAttr = attributes.find(attribute);
+    if (itAttr == attributes.constEnd())
+        return QVariant();
+
+    QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
+    if (internProp == 0)
+        return QVariant();
+
+    QtAbstractPropertyManager *manager = internProp->propertyManager();
+    if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            return intManager->maximum(internProp);
+        if (attribute == d_ptr->m_minimumAttribute)
+            return intManager->minimum(internProp);
+        if (attribute == d_ptr->m_singleStepAttribute)
+            return intManager->singleStep(internProp);
+        return QVariant();
+    } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            return doubleManager->maximum(internProp);
+        if (attribute == d_ptr->m_minimumAttribute)
+            return doubleManager->minimum(internProp);
+        if (attribute == d_ptr->m_singleStepAttribute)
+            return doubleManager->singleStep(internProp);
+        if (attribute == d_ptr->m_decimalsAttribute)
+            return doubleManager->decimals(internProp);
+        return QVariant();
+    } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_regExpAttribute)
+            return stringManager->regExp(internProp);
+        return QVariant();
+    } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            return dateManager->maximum(internProp);
+        if (attribute == d_ptr->m_minimumAttribute)
+            return dateManager->minimum(internProp);
+        return QVariant();
+    } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_decimalsAttribute)
+            return pointFManager->decimals(internProp);
+        return QVariant();
+    } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            return sizeManager->maximum(internProp);
+        if (attribute == d_ptr->m_minimumAttribute)
+            return sizeManager->minimum(internProp);
+        return QVariant();
+    } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            return sizeFManager->maximum(internProp);
+        if (attribute == d_ptr->m_minimumAttribute)
+            return sizeFManager->minimum(internProp);
+        if (attribute == d_ptr->m_decimalsAttribute)
+            return sizeFManager->decimals(internProp);
+        return QVariant();
+    } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_constraintAttribute)
+            return rectManager->constraint(internProp);
+        return QVariant();
+    } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_constraintAttribute)
+            return rectFManager->constraint(internProp);
+        if (attribute == d_ptr->m_decimalsAttribute)
+            return rectFManager->decimals(internProp);
+        return QVariant();
+    } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_enumNamesAttribute)
+            return enumManager->enumNames(internProp);
+        if (attribute == d_ptr->m_enumIconsAttribute) {
+            QVariant v;
+            v.setValue(enumManager->enumIcons(internProp));
+            return v;
+        }
+        return QVariant();
+    } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_flagNamesAttribute)
+            return flagManager->flagNames(internProp);
+        return QVariant();
+    }
+    return QVariant();
+}
+
+/*!
+    Returns a list of the given \a propertyType 's attributes.
+
+    \sa attributeValue(), attributeType()
+*/
+QStringList QtVariantPropertyManager::attributes(int propertyType) const
+{
+    QMap<int, QMap<QString, int> >::ConstIterator it =
+            d_ptr->m_typeToAttributeToAttributeType.find(propertyType);
+    if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd())
+        return QStringList();
+    return it.value().keys();
+}
+
+/*!
+    Returns the type of the specified \a attribute of the given \a
+    propertyType.
+
+    If the given \a propertyType is not supported by \e this manager,
+    or if the given \a propertyType does not possess the specified \a
+    attribute, this function returns QVariant::Invalid.
+
+    \sa attributes(), valueType()
+*/
+int QtVariantPropertyManager::attributeType(int propertyType, const QString &attribute) const
+{
+    QMap<int, QMap<QString, int> >::ConstIterator it =
+            d_ptr->m_typeToAttributeToAttributeType.find(propertyType);
+    if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd())
+        return 0;
+
+    QMap<QString, int> attributes = it.value();
+    QMap<QString, int>::ConstIterator itAttr = attributes.find(attribute);
+    if (itAttr == attributes.constEnd())
+        return 0;
+    return itAttr.value();
+}
+
+/*!
+    \fn void QtVariantPropertyManager::setValue(QtProperty *property, const QVariant &value)
+
+    Sets the value of the given \a property to \a value.
+
+    The specified \a value must be of a type returned by valueType(),
+    or of type that can be converted to valueType() using the
+    QVariant::canConvert() function, otherwise this function does
+    nothing.
+
+    \sa value(), QtVariantProperty::setValue(), valueChanged()
+*/
+void QtVariantPropertyManager::setValue(QtProperty *property, const QVariant &val)
+{
+    int propType = val.userType();
+    if (!propType)
+        return;
+
+    int valType = valueType(property);
+
+    if (propType != valType && !val.canConvert(static_cast<QVariant::Type>(valType)))
+        return;
+
+    QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
+    if (internProp == 0)
+        return;
+
+
+    QtAbstractPropertyManager *manager = internProp->propertyManager();
+    if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
+        intManager->setValue(internProp, qvariant_cast<int>(val));
+        return;
+    } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
+        doubleManager->setValue(internProp, qvariant_cast<double>(val));
+        return;
+    } else if (QtBoolPropertyManager *boolManager = qobject_cast<QtBoolPropertyManager *>(manager)) {
+        boolManager->setValue(internProp, qvariant_cast<bool>(val));
+        return;
+    } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
+        stringManager->setValue(internProp, qvariant_cast<QString>(val));
+        return;
+    } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
+        dateManager->setValue(internProp, qvariant_cast<QDate>(val));
+        return;
+    } else if (QtTimePropertyManager *timeManager = qobject_cast<QtTimePropertyManager *>(manager)) {
+        timeManager->setValue(internProp, qvariant_cast<QTime>(val));
+        return;
+    } else if (QtDateTimePropertyManager *dateTimeManager = qobject_cast<QtDateTimePropertyManager *>(manager)) {
+        dateTimeManager->setValue(internProp, qvariant_cast<QDateTime>(val));
+        return;
+    } else if (QtKeySequencePropertyManager *keySequenceManager = qobject_cast<QtKeySequencePropertyManager *>(manager)) {
+        keySequenceManager->setValue(internProp, qvariant_cast<QKeySequence>(val));
+        return;
+    } else if (QtCharPropertyManager *charManager = qobject_cast<QtCharPropertyManager *>(manager)) {
+        charManager->setValue(internProp, qvariant_cast<QChar>(val));
+        return;
+    } else if (QtLocalePropertyManager *localeManager = qobject_cast<QtLocalePropertyManager *>(manager)) {
+        localeManager->setValue(internProp, qvariant_cast<QLocale>(val));
+        return;
+    } else if (QtPointPropertyManager *pointManager = qobject_cast<QtPointPropertyManager *>(manager)) {
+        pointManager->setValue(internProp, qvariant_cast<QPoint>(val));
+        return;
+    } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
+        pointFManager->setValue(internProp, qvariant_cast<QPointF>(val));
+        return;
+    } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
+        sizeManager->setValue(internProp, qvariant_cast<QSize>(val));
+        return;
+    } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
+        sizeFManager->setValue(internProp, qvariant_cast<QSizeF>(val));
+        return;
+    } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
+        rectManager->setValue(internProp, qvariant_cast<QRect>(val));
+        return;
+    } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
+        rectFManager->setValue(internProp, qvariant_cast<QRectF>(val));
+        return;
+    } else if (QtColorPropertyManager *colorManager = qobject_cast<QtColorPropertyManager *>(manager)) {
+        colorManager->setValue(internProp, qvariant_cast<QColor>(val));
+        return;
+    } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
+        enumManager->setValue(internProp, qvariant_cast<int>(val));
+        return;
+    } else if (QtSizePolicyPropertyManager *sizePolicyManager =
+               qobject_cast<QtSizePolicyPropertyManager *>(manager)) {
+        sizePolicyManager->setValue(internProp, qvariant_cast<QSizePolicy>(val));
+        return;
+    } else if (QtFontPropertyManager *fontManager = qobject_cast<QtFontPropertyManager *>(manager)) {
+        fontManager->setValue(internProp, qvariant_cast<QFont>(val));
+        return;
+#ifndef QT_NO_CURSOR
+    } else if (QtCursorPropertyManager *cursorManager = qobject_cast<QtCursorPropertyManager *>(manager)) {
+        cursorManager->setValue(internProp, qvariant_cast<QCursor>(val));
+        return;
+#endif
+    } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
+        flagManager->setValue(internProp, qvariant_cast<int>(val));
+        return;
+    }
+}
+
+/*!
+    Sets the value of the specified \a attribute of the given \a
+    property, to \a value.
+
+    The new \a value's type must be of the type returned by
+    attributeType(), or of a type that can be converted to
+    attributeType() using the QVariant::canConvert() function,
+    otherwise this function does nothing.
+
+    \sa attributeValue(), QtVariantProperty::setAttribute(), attributeChanged()
+*/
+void QtVariantPropertyManager::setAttribute(QtProperty *property,
+        const QString &attribute, const QVariant &value)
+{
+    QVariant oldAttr = attributeValue(property, attribute);
+    if (!oldAttr.isValid())
+        return;
+
+    int attrType = value.userType();
+    if (!attrType)
+        return;
+
+    if (attrType != attributeType(propertyType(property), attribute) &&
+                !value.canConvert((QVariant::Type)attrType))
+        return;
+
+    QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
+    if (internProp == 0)
+        return;
+
+    QtAbstractPropertyManager *manager = internProp->propertyManager();
+    if (QtIntPropertyManager *intManager = qobject_cast<QtIntPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            intManager->setMaximum(internProp, qvariant_cast<int>(value));
+        else if (attribute == d_ptr->m_minimumAttribute)
+            intManager->setMinimum(internProp, qvariant_cast<int>(value));
+        else if (attribute == d_ptr->m_singleStepAttribute)
+            intManager->setSingleStep(internProp, qvariant_cast<int>(value));
+        return;
+    } else if (QtDoublePropertyManager *doubleManager = qobject_cast<QtDoublePropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            doubleManager->setMaximum(internProp, qvariant_cast<double>(value));
+        if (attribute == d_ptr->m_minimumAttribute)
+            doubleManager->setMinimum(internProp, qvariant_cast<double>(value));
+        if (attribute == d_ptr->m_singleStepAttribute)
+            doubleManager->setSingleStep(internProp, qvariant_cast<double>(value));
+        if (attribute == d_ptr->m_decimalsAttribute)
+            doubleManager->setDecimals(internProp, qvariant_cast<int>(value));
+        return;
+    } else if (QtStringPropertyManager *stringManager = qobject_cast<QtStringPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_regExpAttribute)
+            stringManager->setRegExp(internProp, qvariant_cast<QRegExp>(value));
+        return;
+    } else if (QtDatePropertyManager *dateManager = qobject_cast<QtDatePropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            dateManager->setMaximum(internProp, qvariant_cast<QDate>(value));
+        if (attribute == d_ptr->m_minimumAttribute)
+            dateManager->setMinimum(internProp, qvariant_cast<QDate>(value));
+        return;
+    } else if (QtPointFPropertyManager *pointFManager = qobject_cast<QtPointFPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_decimalsAttribute)
+            pointFManager->setDecimals(internProp, qvariant_cast<int>(value));
+        return;
+    } else if (QtSizePropertyManager *sizeManager = qobject_cast<QtSizePropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            sizeManager->setMaximum(internProp, qvariant_cast<QSize>(value));
+        if (attribute == d_ptr->m_minimumAttribute)
+            sizeManager->setMinimum(internProp, qvariant_cast<QSize>(value));
+        return;
+    } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast<QtSizeFPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_maximumAttribute)
+            sizeFManager->setMaximum(internProp, qvariant_cast<QSizeF>(value));
+        if (attribute == d_ptr->m_minimumAttribute)
+            sizeFManager->setMinimum(internProp, qvariant_cast<QSizeF>(value));
+        if (attribute == d_ptr->m_decimalsAttribute)
+            sizeFManager->setDecimals(internProp, qvariant_cast<int>(value));
+        return;
+    } else if (QtRectPropertyManager *rectManager = qobject_cast<QtRectPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_constraintAttribute)
+            rectManager->setConstraint(internProp, qvariant_cast<QRect>(value));
+        return;
+    } else if (QtRectFPropertyManager *rectFManager = qobject_cast<QtRectFPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_constraintAttribute)
+            rectFManager->setConstraint(internProp, qvariant_cast<QRectF>(value));
+        if (attribute == d_ptr->m_decimalsAttribute)
+            rectFManager->setDecimals(internProp, qvariant_cast<int>(value));
+        return;
+    } else if (QtEnumPropertyManager *enumManager = qobject_cast<QtEnumPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_enumNamesAttribute)
+            enumManager->setEnumNames(internProp, qvariant_cast<QStringList>(value));
+        if (attribute == d_ptr->m_enumIconsAttribute)
+            enumManager->setEnumIcons(internProp, qvariant_cast<QtIconMap>(value));
+        return;
+    } else if (QtFlagPropertyManager *flagManager = qobject_cast<QtFlagPropertyManager *>(manager)) {
+        if (attribute == d_ptr->m_flagNamesAttribute)
+            flagManager->setFlagNames(internProp, qvariant_cast<QStringList>(value));
+        return;
+    }
+}
+
+/*!
+    \internal
+*/
+bool QtVariantPropertyManager::hasValue(const QtProperty *property) const
+{
+    if (propertyType(property) == groupTypeId())
+        return false;
+    return true;
+}
+
+/*!
+    \internal
+*/
+QString QtVariantPropertyManager::valueText(const QtProperty *property) const
+{
+    const QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
+    return internProp ? internProp->valueText() : QString();
+}
+
+/*!
+    \internal
+*/
+QIcon QtVariantPropertyManager::valueIcon(const QtProperty *property) const
+{
+    const QtProperty *internProp = propertyToWrappedProperty()->value(property, 0);
+    return internProp ? internProp->valueIcon() : QIcon();
+}
+
+/*!
+    \internal
+*/
+void QtVariantPropertyManager::initializeProperty(QtProperty *property)
+{
+    QtVariantProperty *varProp = variantProperty(property);
+    if (!varProp)
+        return;
+
+    QMap<int, QtAbstractPropertyManager *>::ConstIterator it =
+            d_ptr->m_typeToPropertyManager.find(d_ptr->m_propertyType);
+    if (it != d_ptr->m_typeToPropertyManager.constEnd()) {
+        QtProperty *internProp = 0;
+        if (!d_ptr->m_creatingSubProperties) {
+            QtAbstractPropertyManager *manager = it.value();
+            internProp = manager->addProperty();
+            d_ptr->m_internalToProperty[internProp] = varProp;
+        }
+        propertyToWrappedProperty()->insert(varProp, internProp);
+        if (internProp) {
+            QList<QtProperty *> children = internProp->subProperties();
+            QListIterator<QtProperty *> itChild(children);
+            QtVariantProperty *lastProperty = 0;
+            while (itChild.hasNext()) {
+                QtVariantProperty *prop = d_ptr->createSubProperty(varProp, lastProperty, itChild.next());
+                lastProperty = prop ? prop : lastProperty;
+            }
+        }
+    }
+}
+
+/*!
+    \internal
+*/
+void QtVariantPropertyManager::uninitializeProperty(QtProperty *property)
+{
+    const QMap<const QtProperty *, QPair<QtVariantProperty *, int> >::iterator type_it = d_ptr->m_propertyToType.find(property);
+    if (type_it == d_ptr->m_propertyToType.end())
+        return;
+
+    PropertyMap::iterator it = propertyToWrappedProperty()->find(property);
+    if (it != propertyToWrappedProperty()->end()) {
+        QtProperty *internProp = it.value();
+        if (internProp) {
+            d_ptr->m_internalToProperty.remove(internProp);
+            if (!d_ptr->m_destroyingSubProperties) {
+                delete internProp;
+            }
+        }
+        propertyToWrappedProperty()->erase(it);
+    }
+    d_ptr->m_propertyToType.erase(type_it);
+}
+
+/*!
+    \internal
+*/
+QtProperty *QtVariantPropertyManager::createProperty()
+{
+    if (!d_ptr->m_creatingProperty)
+        return 0;
+
+    QtVariantProperty *property = new QtVariantProperty(this);
+    d_ptr->m_propertyToType.insert(property, qMakePair(property, d_ptr->m_propertyType));
+
+    return property;
+}
+
+/////////////////////////////
+
+class QtVariantEditorFactoryPrivate
+{
+    QtVariantEditorFactory *q_ptr;
+    Q_DECLARE_PUBLIC(QtVariantEditorFactory)
+public:
+
+    QtSpinBoxFactory           *m_spinBoxFactory;
+    QtDoubleSpinBoxFactory     *m_doubleSpinBoxFactory;
+    QtCheckBoxFactory          *m_checkBoxFactory;
+    QtLineEditFactory          *m_lineEditFactory;
+    QtDateEditFactory          *m_dateEditFactory;
+    QtTimeEditFactory          *m_timeEditFactory;
+    QtDateTimeEditFactory      *m_dateTimeEditFactory;
+    QtKeySequenceEditorFactory *m_keySequenceEditorFactory;
+    QtCharEditorFactory        *m_charEditorFactory;
+    QtEnumEditorFactory        *m_comboBoxFactory;
+    QtCursorEditorFactory      *m_cursorEditorFactory;
+    QtColorEditorFactory       *m_colorEditorFactory;
+    QtFontEditorFactory        *m_fontEditorFactory;
+
+    QMap<QtAbstractEditorFactoryBase *, int> m_factoryToType;
+    QMap<int, QtAbstractEditorFactoryBase *> m_typeToFactory;
+};
+
+/*!
+    \class QtVariantEditorFactory
+    \internal
+    \inmodule QtDesigner
+    \since 4.4
+
+    \brief The QtVariantEditorFactory class provides widgets for properties
+    created by QtVariantPropertyManager objects.
+
+    The variant factory provides the following widgets for the
+    specified property types:
+
+    \table
+    \header
+        \li Property Type
+        \li Widget
+    \row
+        \li \c int
+        \li QSpinBox
+    \row
+        \li \c double
+        \li QDoubleSpinBox
+    \row
+        \li \c bool
+        \li QCheckBox
+    \row
+        \li QString
+        \li QLineEdit
+    \row
+        \li QDate
+        \li QDateEdit
+    \row
+        \li QTime
+        \li QTimeEdit
+    \row
+        \li QDateTime
+        \li QDateTimeEdit
+    \row
+        \li QKeySequence
+        \li customized editor
+    \row
+        \li QChar
+        \li customized editor
+    \row
+        \li \c enum
+        \li QComboBox
+    \row
+        \li QCursor
+        \li QComboBox
+    \endtable
+
+    Note that QtVariantPropertyManager supports several additional property
+    types for which the QtVariantEditorFactory class does not provide
+    editing widgets, e.g. QPoint and QSize. To provide widgets for other
+    types using the variant approach, derive from the QtVariantEditorFactory
+    class.
+
+    \sa QtAbstractEditorFactory, QtVariantPropertyManager
+*/
+
+/*!
+    Creates a factory with the given \a parent.
+*/
+QtVariantEditorFactory::QtVariantEditorFactory(QObject *parent)
+    : QtAbstractEditorFactory<QtVariantPropertyManager>(parent), d_ptr(new QtVariantEditorFactoryPrivate())
+{
+    d_ptr->q_ptr = this;
+
+    d_ptr->m_spinBoxFactory = new QtSpinBoxFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_spinBoxFactory] = QVariant::Int;
+    d_ptr->m_typeToFactory[QVariant::Int] = d_ptr->m_spinBoxFactory;
+
+    d_ptr->m_doubleSpinBoxFactory = new QtDoubleSpinBoxFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_doubleSpinBoxFactory] = QVariant::Double;
+    d_ptr->m_typeToFactory[QVariant::Double] = d_ptr->m_doubleSpinBoxFactory;
+
+    d_ptr->m_checkBoxFactory = new QtCheckBoxFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_checkBoxFactory] = QVariant::Bool;
+    d_ptr->m_typeToFactory[QVariant::Bool] = d_ptr->m_checkBoxFactory;
+
+    d_ptr->m_lineEditFactory = new QtLineEditFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_lineEditFactory] = QVariant::String;
+    d_ptr->m_typeToFactory[QVariant::String] = d_ptr->m_lineEditFactory;
+
+    d_ptr->m_dateEditFactory = new QtDateEditFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_dateEditFactory] = QVariant::Date;
+    d_ptr->m_typeToFactory[QVariant::Date] = d_ptr->m_dateEditFactory;
+
+    d_ptr->m_timeEditFactory = new QtTimeEditFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_timeEditFactory] = QVariant::Time;
+    d_ptr->m_typeToFactory[QVariant::Time] = d_ptr->m_timeEditFactory;
+
+    d_ptr->m_dateTimeEditFactory = new QtDateTimeEditFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_dateTimeEditFactory] = QVariant::DateTime;
+    d_ptr->m_typeToFactory[QVariant::DateTime] = d_ptr->m_dateTimeEditFactory;
+
+    d_ptr->m_keySequenceEditorFactory = new QtKeySequenceEditorFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_keySequenceEditorFactory] = QVariant::KeySequence;
+    d_ptr->m_typeToFactory[QVariant::KeySequence] = d_ptr->m_keySequenceEditorFactory;
+
+    d_ptr->m_charEditorFactory = new QtCharEditorFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_charEditorFactory] = QVariant::Char;
+    d_ptr->m_typeToFactory[QVariant::Char] = d_ptr->m_charEditorFactory;
+
+    d_ptr->m_cursorEditorFactory = new QtCursorEditorFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_cursorEditorFactory] = QVariant::Cursor;
+    d_ptr->m_typeToFactory[QVariant::Cursor] = d_ptr->m_cursorEditorFactory;
+
+    d_ptr->m_colorEditorFactory = new QtColorEditorFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_colorEditorFactory] = QVariant::Color;
+    d_ptr->m_typeToFactory[QVariant::Color] = d_ptr->m_colorEditorFactory;
+
+    d_ptr->m_fontEditorFactory = new QtFontEditorFactory(this);
+    d_ptr->m_factoryToType[d_ptr->m_fontEditorFactory] = QVariant::Font;
+    d_ptr->m_typeToFactory[QVariant::Font] = d_ptr->m_fontEditorFactory;
+
+    d_ptr->m_comboBoxFactory = new QtEnumEditorFactory(this);
+    const int enumId = QtVariantPropertyManager::enumTypeId();
+    d_ptr->m_factoryToType[d_ptr->m_comboBoxFactory] = enumId;
+    d_ptr->m_typeToFactory[enumId] = d_ptr->m_comboBoxFactory;
+}
+
+/*!
+    Destroys this factory, and all the widgets it has created.
+*/
+QtVariantEditorFactory::~QtVariantEditorFactory()
+{
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtVariantEditorFactory::connectPropertyManager(QtVariantPropertyManager *manager)
+{
+    QList<QtIntPropertyManager *> intPropertyManagers = manager->findChildren<QtIntPropertyManager *>();
+    QListIterator<QtIntPropertyManager *> itInt(intPropertyManagers);
+    while (itInt.hasNext())
+        d_ptr->m_spinBoxFactory->addPropertyManager(itInt.next());
+
+    QList<QtDoublePropertyManager *> doublePropertyManagers = manager->findChildren<QtDoublePropertyManager *>();
+    QListIterator<QtDoublePropertyManager *> itDouble(doublePropertyManagers);
+    while (itDouble.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itDouble.next());
+
+    QList<QtBoolPropertyManager *> boolPropertyManagers = manager->findChildren<QtBoolPropertyManager *>();
+    QListIterator<QtBoolPropertyManager *> itBool(boolPropertyManagers);
+    while (itBool.hasNext())
+        d_ptr->m_checkBoxFactory->addPropertyManager(itBool.next());
+
+    QList<QtStringPropertyManager *> stringPropertyManagers = manager->findChildren<QtStringPropertyManager *>();
+    QListIterator<QtStringPropertyManager *> itString(stringPropertyManagers);
+    while (itString.hasNext())
+        d_ptr->m_lineEditFactory->addPropertyManager(itString.next());
+
+    QList<QtDatePropertyManager *> datePropertyManagers = manager->findChildren<QtDatePropertyManager *>();
+    QListIterator<QtDatePropertyManager *> itDate(datePropertyManagers);
+    while (itDate.hasNext())
+        d_ptr->m_dateEditFactory->addPropertyManager(itDate.next());
+
+    QList<QtTimePropertyManager *> timePropertyManagers = manager->findChildren<QtTimePropertyManager *>();
+    QListIterator<QtTimePropertyManager *> itTime(timePropertyManagers);
+    while (itTime.hasNext())
+        d_ptr->m_timeEditFactory->addPropertyManager(itTime.next());
+
+    QList<QtDateTimePropertyManager *> dateTimePropertyManagers = manager->findChildren<QtDateTimePropertyManager *>();
+    QListIterator<QtDateTimePropertyManager *> itDateTime(dateTimePropertyManagers);
+    while (itDateTime.hasNext())
+        d_ptr->m_dateTimeEditFactory->addPropertyManager(itDateTime.next());
+
+    QList<QtKeySequencePropertyManager *> keySequencePropertyManagers = manager->findChildren<QtKeySequencePropertyManager *>();
+    QListIterator<QtKeySequencePropertyManager *> itKeySequence(keySequencePropertyManagers);
+    while (itKeySequence.hasNext())
+        d_ptr->m_keySequenceEditorFactory->addPropertyManager(itKeySequence.next());
+
+    QList<QtCharPropertyManager *> charPropertyManagers = manager->findChildren<QtCharPropertyManager *>();
+    QListIterator<QtCharPropertyManager *> itChar(charPropertyManagers);
+    while (itChar.hasNext())
+        d_ptr->m_charEditorFactory->addPropertyManager(itChar.next());
+
+    QList<QtLocalePropertyManager *> localePropertyManagers = manager->findChildren<QtLocalePropertyManager *>();
+    QListIterator<QtLocalePropertyManager *> itLocale(localePropertyManagers);
+    while (itLocale.hasNext())
+        d_ptr->m_comboBoxFactory->addPropertyManager(itLocale.next()->subEnumPropertyManager());
+
+    QList<QtPointPropertyManager *> pointPropertyManagers = manager->findChildren<QtPointPropertyManager *>();
+    QListIterator<QtPointPropertyManager *> itPoint(pointPropertyManagers);
+    while (itPoint.hasNext())
+        d_ptr->m_spinBoxFactory->addPropertyManager(itPoint.next()->subIntPropertyManager());
+
+    QList<QtPointFPropertyManager *> pointFPropertyManagers = manager->findChildren<QtPointFPropertyManager *>();
+    QListIterator<QtPointFPropertyManager *> itPointF(pointFPropertyManagers);
+    while (itPointF.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itPointF.next()->subDoublePropertyManager());
+
+    QList<QtSizePropertyManager *> sizePropertyManagers = manager->findChildren<QtSizePropertyManager *>();
+    QListIterator<QtSizePropertyManager *> itSize(sizePropertyManagers);
+    while (itSize.hasNext())
+        d_ptr->m_spinBoxFactory->addPropertyManager(itSize.next()->subIntPropertyManager());
+
+    QList<QtSizeFPropertyManager *> sizeFPropertyManagers = manager->findChildren<QtSizeFPropertyManager *>();
+    QListIterator<QtSizeFPropertyManager *> itSizeF(sizeFPropertyManagers);
+    while (itSizeF.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itSizeF.next()->subDoublePropertyManager());
+
+    QList<QtRectPropertyManager *> rectPropertyManagers = manager->findChildren<QtRectPropertyManager *>();
+    QListIterator<QtRectPropertyManager *> itRect(rectPropertyManagers);
+    while (itRect.hasNext())
+        d_ptr->m_spinBoxFactory->addPropertyManager(itRect.next()->subIntPropertyManager());
+
+    QList<QtRectFPropertyManager *> rectFPropertyManagers = manager->findChildren<QtRectFPropertyManager *>();
+    QListIterator<QtRectFPropertyManager *> itRectF(rectFPropertyManagers);
+    while (itRectF.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itRectF.next()->subDoublePropertyManager());
+
+    QList<QtColorPropertyManager *> colorPropertyManagers = manager->findChildren<QtColorPropertyManager *>();
+    QListIterator<QtColorPropertyManager *> itColor(colorPropertyManagers);
+    while (itColor.hasNext()) {
+        QtColorPropertyManager *manager = itColor.next();
+        d_ptr->m_colorEditorFactory->addPropertyManager(manager);
+        d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager());
+    }
+
+    QList<QtEnumPropertyManager *> enumPropertyManagers = manager->findChildren<QtEnumPropertyManager *>();
+    QListIterator<QtEnumPropertyManager *> itEnum(enumPropertyManagers);
+    while (itEnum.hasNext())
+        d_ptr->m_comboBoxFactory->addPropertyManager(itEnum.next());
+
+    QList<QtSizePolicyPropertyManager *> sizePolicyPropertyManagers = manager->findChildren<QtSizePolicyPropertyManager *>();
+    QListIterator<QtSizePolicyPropertyManager *> itSizePolicy(sizePolicyPropertyManagers);
+    while (itSizePolicy.hasNext()) {
+        QtSizePolicyPropertyManager *manager = itSizePolicy.next();
+        d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager());
+        d_ptr->m_comboBoxFactory->addPropertyManager(manager->subEnumPropertyManager());
+    }
+
+    QList<QtFontPropertyManager *> fontPropertyManagers = manager->findChildren<QtFontPropertyManager *>();
+    QListIterator<QtFontPropertyManager *> itFont(fontPropertyManagers);
+    while (itFont.hasNext()) {
+        QtFontPropertyManager *manager = itFont.next();
+        d_ptr->m_fontEditorFactory->addPropertyManager(manager);
+        d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager());
+        d_ptr->m_comboBoxFactory->addPropertyManager(manager->subEnumPropertyManager());
+        d_ptr->m_checkBoxFactory->addPropertyManager(manager->subBoolPropertyManager());
+    }
+
+    QList<QtCursorPropertyManager *> cursorPropertyManagers = manager->findChildren<QtCursorPropertyManager *>();
+    QListIterator<QtCursorPropertyManager *> itCursor(cursorPropertyManagers);
+    while (itCursor.hasNext())
+        d_ptr->m_cursorEditorFactory->addPropertyManager(itCursor.next());
+
+    QList<QtFlagPropertyManager *> flagPropertyManagers = manager->findChildren<QtFlagPropertyManager *>();
+    QListIterator<QtFlagPropertyManager *> itFlag(flagPropertyManagers);
+    while (itFlag.hasNext())
+        d_ptr->m_checkBoxFactory->addPropertyManager(itFlag.next()->subBoolPropertyManager());
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+QWidget *QtVariantEditorFactory::createEditor(QtVariantPropertyManager *manager, QtProperty *property,
+        QWidget *parent)
+{
+    const int propType = manager->propertyType(property);
+    QtAbstractEditorFactoryBase *factory = d_ptr->m_typeToFactory.value(propType, 0);
+    if (!factory)
+        return 0;
+    return factory->createEditor(wrappedProperty(property), parent);
+}
+
+/*!
+    \internal
+
+    Reimplemented from the QtAbstractEditorFactory class.
+*/
+void QtVariantEditorFactory::disconnectPropertyManager(QtVariantPropertyManager *manager)
+{
+    QList<QtIntPropertyManager *> intPropertyManagers = manager->findChildren<QtIntPropertyManager *>();
+    QListIterator<QtIntPropertyManager *> itInt(intPropertyManagers);
+    while (itInt.hasNext())
+        d_ptr->m_spinBoxFactory->removePropertyManager(itInt.next());
+
+    QList<QtDoublePropertyManager *> doublePropertyManagers = manager->findChildren<QtDoublePropertyManager *>();
+    QListIterator<QtDoublePropertyManager *> itDouble(doublePropertyManagers);
+    while (itDouble.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itDouble.next());
+
+    QList<QtBoolPropertyManager *> boolPropertyManagers = manager->findChildren<QtBoolPropertyManager *>();
+    QListIterator<QtBoolPropertyManager *> itBool(boolPropertyManagers);
+    while (itBool.hasNext())
+        d_ptr->m_checkBoxFactory->removePropertyManager(itBool.next());
+
+    QList<QtStringPropertyManager *> stringPropertyManagers = manager->findChildren<QtStringPropertyManager *>();
+    QListIterator<QtStringPropertyManager *> itString(stringPropertyManagers);
+    while (itString.hasNext())
+        d_ptr->m_lineEditFactory->removePropertyManager(itString.next());
+
+    QList<QtDatePropertyManager *> datePropertyManagers = manager->findChildren<QtDatePropertyManager *>();
+    QListIterator<QtDatePropertyManager *> itDate(datePropertyManagers);
+    while (itDate.hasNext())
+        d_ptr->m_dateEditFactory->removePropertyManager(itDate.next());
+
+    QList<QtTimePropertyManager *> timePropertyManagers = manager->findChildren<QtTimePropertyManager *>();
+    QListIterator<QtTimePropertyManager *> itTime(timePropertyManagers);
+    while (itTime.hasNext())
+        d_ptr->m_timeEditFactory->removePropertyManager(itTime.next());
+
+    QList<QtDateTimePropertyManager *> dateTimePropertyManagers = manager->findChildren<QtDateTimePropertyManager *>();
+    QListIterator<QtDateTimePropertyManager *> itDateTime(dateTimePropertyManagers);
+    while (itDateTime.hasNext())
+        d_ptr->m_dateTimeEditFactory->removePropertyManager(itDateTime.next());
+
+    QList<QtKeySequencePropertyManager *> keySequencePropertyManagers = manager->findChildren<QtKeySequencePropertyManager *>();
+    QListIterator<QtKeySequencePropertyManager *> itKeySequence(keySequencePropertyManagers);
+    while (itKeySequence.hasNext())
+        d_ptr->m_keySequenceEditorFactory->removePropertyManager(itKeySequence.next());
+
+    QList<QtCharPropertyManager *> charPropertyManagers = manager->findChildren<QtCharPropertyManager *>();
+    QListIterator<QtCharPropertyManager *> itChar(charPropertyManagers);
+    while (itChar.hasNext())
+        d_ptr->m_charEditorFactory->removePropertyManager(itChar.next());
+
+    QList<QtLocalePropertyManager *> localePropertyManagers = manager->findChildren<QtLocalePropertyManager *>();
+    QListIterator<QtLocalePropertyManager *> itLocale(localePropertyManagers);
+    while (itLocale.hasNext())
+        d_ptr->m_comboBoxFactory->removePropertyManager(itLocale.next()->subEnumPropertyManager());
+
+    QList<QtPointPropertyManager *> pointPropertyManagers = manager->findChildren<QtPointPropertyManager *>();
+    QListIterator<QtPointPropertyManager *> itPoint(pointPropertyManagers);
+    while (itPoint.hasNext())
+        d_ptr->m_spinBoxFactory->removePropertyManager(itPoint.next()->subIntPropertyManager());
+
+    QList<QtPointFPropertyManager *> pointFPropertyManagers = manager->findChildren<QtPointFPropertyManager *>();
+    QListIterator<QtPointFPropertyManager *> itPointF(pointFPropertyManagers);
+    while (itPointF.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itPointF.next()->subDoublePropertyManager());
+
+    QList<QtSizePropertyManager *> sizePropertyManagers = manager->findChildren<QtSizePropertyManager *>();
+    QListIterator<QtSizePropertyManager *> itSize(sizePropertyManagers);
+    while (itSize.hasNext())
+        d_ptr->m_spinBoxFactory->removePropertyManager(itSize.next()->subIntPropertyManager());
+
+    QList<QtSizeFPropertyManager *> sizeFPropertyManagers = manager->findChildren<QtSizeFPropertyManager *>();
+    QListIterator<QtSizeFPropertyManager *> itSizeF(sizeFPropertyManagers);
+    while (itSizeF.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itSizeF.next()->subDoublePropertyManager());
+
+    QList<QtRectPropertyManager *> rectPropertyManagers = manager->findChildren<QtRectPropertyManager *>();
+    QListIterator<QtRectPropertyManager *> itRect(rectPropertyManagers);
+    while (itRect.hasNext())
+        d_ptr->m_spinBoxFactory->removePropertyManager(itRect.next()->subIntPropertyManager());
+
+    QList<QtRectFPropertyManager *> rectFPropertyManagers = manager->findChildren<QtRectFPropertyManager *>();
+    QListIterator<QtRectFPropertyManager *> itRectF(rectFPropertyManagers);
+    while (itRectF.hasNext())
+        d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itRectF.next()->subDoublePropertyManager());
+
+    QList<QtColorPropertyManager *> colorPropertyManagers = manager->findChildren<QtColorPropertyManager *>();
+    QListIterator<QtColorPropertyManager *> itColor(colorPropertyManagers);
+    while (itColor.hasNext()) {
+        QtColorPropertyManager *manager = itColor.next();
+        d_ptr->m_colorEditorFactory->removePropertyManager(manager);
+        d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager());
+    }
+
+    QList<QtEnumPropertyManager *> enumPropertyManagers = manager->findChildren<QtEnumPropertyManager *>();
+    QListIterator<QtEnumPropertyManager *> itEnum(enumPropertyManagers);
+    while (itEnum.hasNext())
+        d_ptr->m_comboBoxFactory->removePropertyManager(itEnum.next());
+
+    QList<QtSizePolicyPropertyManager *> sizePolicyPropertyManagers = manager->findChildren<QtSizePolicyPropertyManager *>();
+    QListIterator<QtSizePolicyPropertyManager *> itSizePolicy(sizePolicyPropertyManagers);
+    while (itSizePolicy.hasNext()) {
+        QtSizePolicyPropertyManager *manager = itSizePolicy.next();
+        d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager());
+        d_ptr->m_comboBoxFactory->removePropertyManager(manager->subEnumPropertyManager());
+    }
+
+    QList<QtFontPropertyManager *> fontPropertyManagers = manager->findChildren<QtFontPropertyManager *>();
+    QListIterator<QtFontPropertyManager *> itFont(fontPropertyManagers);
+    while (itFont.hasNext()) {
+        QtFontPropertyManager *manager = itFont.next();
+        d_ptr->m_fontEditorFactory->removePropertyManager(manager);
+        d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager());
+        d_ptr->m_comboBoxFactory->removePropertyManager(manager->subEnumPropertyManager());
+        d_ptr->m_checkBoxFactory->removePropertyManager(manager->subBoolPropertyManager());
+    }
+
+    QList<QtCursorPropertyManager *> cursorPropertyManagers = manager->findChildren<QtCursorPropertyManager *>();
+    QListIterator<QtCursorPropertyManager *> itCursor(cursorPropertyManagers);
+    while (itCursor.hasNext())
+        d_ptr->m_cursorEditorFactory->removePropertyManager(itCursor.next());
+
+    QList<QtFlagPropertyManager *> flagPropertyManagers = manager->findChildren<QtFlagPropertyManager *>();
+    QListIterator<QtFlagPropertyManager *> itFlag(flagPropertyManagers);
+    while (itFlag.hasNext())
+        d_ptr->m_checkBoxFactory->removePropertyManager(itFlag.next()->subBoolPropertyManager());
+}
+
+QT_END_NAMESPACE
+
+#include "moc_qtvariantproperty.cpp"
diff --git a/ThirdParty/GUI/qtpropertybrowser/qtvariantproperty.h b/ThirdParty/GUI/qtpropertybrowser/qtvariantproperty.h
new file mode 100644
index 0000000..bd439be
--- /dev/null
+++ b/ThirdParty/GUI/qtpropertybrowser/qtvariantproperty.h
@@ -0,0 +1,178 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTVARIANTPROPERTY_H
+#define QTVARIANTPROPERTY_H
+
+#include "qtpropertybrowser.h"
+#include <QtCore/QVariant>
+#include <QtGui/QIcon>
+
+QT_BEGIN_NAMESPACE
+
+typedef QMap<int, QIcon> QtIconMap;
+
+class QtVariantPropertyManager;
+
+class QtVariantProperty : public QtProperty
+{
+public:
+    virtual ~QtVariantProperty();
+    QVariant value() const;
+    QVariant attributeValue(const QString &attribute) const;
+    int valueType() const;
+    int propertyType() const;
+
+    void setValue(const QVariant &value);
+    void setAttribute(const QString &attribute, const QVariant &value);
+protected:
+    QtVariantProperty(QtVariantPropertyManager *manager);
+private:
+    friend class QtVariantPropertyManager;
+    QScopedPointer<class QtVariantPropertyPrivate> d_ptr;
+};
+
+class QtVariantPropertyManager : public QtAbstractPropertyManager
+{
+    Q_OBJECT
+public:
+    QtVariantPropertyManager(QObject *parent = 0);
+    virtual ~QtVariantPropertyManager();
+
+    virtual QtVariantProperty *addProperty(int propertyType, const QString &name = QString());
+
+    int propertyType(const QtProperty *property) const;
+    virtual int valueType(const QtProperty *property) const;
+    QtVariantProperty *variantProperty(const QtProperty *property) const;
+
+    virtual bool isPropertyTypeSupported(int propertyType) const;
+    virtual int valueType(int propertyType) const;
+    virtual QStringList attributes(int propertyType) const;
+    virtual int attributeType(int propertyType, const QString &attribute) const;
+
+    virtual QVariant value(const QtProperty *property) const;
+    virtual QVariant attributeValue(const QtProperty *property, const QString &attribute) const;
+
+    static int enumTypeId();
+    static int flagTypeId();
+    static int groupTypeId();
+    static int iconMapTypeId();
+public Q_SLOTS:
+    virtual void setValue(QtProperty *property, const QVariant &val);
+    virtual void setAttribute(QtProperty *property,
+                const QString &attribute, const QVariant &value);
+Q_SIGNALS:
+    void valueChanged(QtProperty *property, const QVariant &val);
+    void attributeChanged(QtProperty *property,
+                const QString &attribute, const QVariant &val);
+protected:
+    virtual bool hasValue(const QtProperty *property) const;
+    virtual QString valueText(const QtProperty *property) const;
+    virtual QIcon valueIcon(const QtProperty *property) const;
+    virtual void initializeProperty(QtProperty *property);
+    virtual void uninitializeProperty(QtProperty *property);
+    virtual QtProperty *createProperty();
+private:
+    QScopedPointer<class QtVariantPropertyManagerPrivate> d_ptr;
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int))
+    Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, double))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, double, double))
+    Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, double))
+    Q_PRIVATE_SLOT(d_func(), void slotDecimalsChanged(QtProperty *, int))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, bool))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QString &))
+    Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QDate &))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, const QDate &, const QDate &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QTime &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QDateTime &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QKeySequence &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QChar &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QLocale &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QPoint &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QPointF &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QSize &))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, const QSize &, const QSize &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QSizeF &))
+    Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, const QSizeF &, const QSizeF &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QRect &))
+    Q_PRIVATE_SLOT(d_func(), void slotConstraintChanged(QtProperty *, const QRect &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QRectF &))
+    Q_PRIVATE_SLOT(d_func(), void slotConstraintChanged(QtProperty *, const QRectF &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QColor &))
+    Q_PRIVATE_SLOT(d_func(), void slotEnumNamesChanged(QtProperty *, const QStringList &))
+    Q_PRIVATE_SLOT(d_func(), void slotEnumIconsChanged(QtProperty *, const QMap<int, QIcon> &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QSizePolicy &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QFont &))
+    Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QCursor &))
+    Q_PRIVATE_SLOT(d_func(), void slotFlagNamesChanged(QtProperty *, const QStringList &))
+
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))
+    Q_PRIVATE_SLOT(d_func(), void slotPropertyRemoved(QtProperty *, QtProperty *))
+    Q_DECLARE_PRIVATE(QtVariantPropertyManager)
+    Q_DISABLE_COPY(QtVariantPropertyManager)
+};
+
+class QtVariantEditorFactory : public QtAbstractEditorFactory<QtVariantPropertyManager>
+{
+    Q_OBJECT
+public:
+    QtVariantEditorFactory(QObject *parent = 0);
+    virtual ~QtVariantEditorFactory();
+    using QtAbstractEditorFactory<QtVariantPropertyManager>::createEditor;
+protected:
+    virtual void connectPropertyManager(QtVariantPropertyManager *manager);
+    virtual QWidget *createEditor(QtVariantPropertyManager *manager, QtProperty *property,
+                QWidget *parent);
+    virtual void disconnectPropertyManager(QtVariantPropertyManager *manager);
+private:
+    QScopedPointer<class QtVariantEditorFactoryPrivate> d_ptr;
+    Q_DECLARE_PRIVATE(QtVariantEditorFactory)
+    Q_DISABLE_COPY(QtVariantEditorFactory)
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(QIcon)
+Q_DECLARE_METATYPE(QtIconMap)
+#endif
diff --git a/ThirdParty/common/CMakeLists.txt b/ThirdParty/common/CMakeLists.txt
new file mode 100644
index 0000000..2082bf1
--- /dev/null
+++ b/ThirdParty/common/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(gtest)
diff --git a/ThirdParty/common/gtest/00_PATCHES b/ThirdParty/common/gtest/00_PATCHES
new file mode 100644
index 0000000..0dd25bf
--- /dev/null
+++ b/ThirdParty/common/gtest/00_PATCHES
@@ -0,0 +1,3 @@
+This copy of gtest-1.7.0 is patched at the following places:
+
+- src/gtest.cc (compare gtest.orig.cc)
diff --git a/ThirdParty/common/gtest/CMakeLists.txt b/ThirdParty/common/gtest/CMakeLists.txt
new file mode 100644
index 0000000..51dcc0a
--- /dev/null
+++ b/ThirdParty/common/gtest/CMakeLists.txt
@@ -0,0 +1,13 @@
+############################################################################
+# CMakeLists.txt file for building gtest library
+############################################################################
+if(POLICY CMP0042)
+    cmake_policy(SET CMP0042 NEW)
+endif()
+
+if(MSVC)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_VARIADIC_MAX=10")
+endif()
+
+option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." ON)
+add_subdirectory(gtest-1.7.0)
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/CHANGES b/ThirdParty/common/gtest/gtest-1.7.0/CHANGES
new file mode 100644
index 0000000..0552132
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/CHANGES
@@ -0,0 +1,157 @@
+Changes for 1.7.0:
+
+* New feature: death tests are supported on OpenBSD and in iOS
+  simulator now.
+* New feature: Google Test now implements a protocol to allow
+  a test runner to detect that a test program has exited
+  prematurely and report it as a failure (before it would be
+  falsely reported as a success if the exit code is 0).
+* New feature: Test::RecordProperty() can now be used outside of the
+  lifespan of a test method, in which case it will be attributed to
+  the current test case or the test program in the XML report.
+* New feature (potentially breaking): --gtest_list_tests now prints
+  the type parameters and value parameters for each test.
+* Improvement: char pointers and char arrays are now escaped properly
+  in failure messages.
+* Improvement: failure summary in XML reports now includes file and
+  line information.
+* Improvement: the <testsuites> XML element now has a timestamp attribute.
+* Improvement: When --gtest_filter is specified, XML report now doesn't
+  contain information about tests that are filtered out.
+* Fixed the bug where long --gtest_filter flag values are truncated in
+  death tests.
+* Potentially breaking change: RUN_ALL_TESTS() is now implemented as a
+  function instead of a macro in order to work better with Clang.
+* Compatibility fixes with C++ 11 and various platforms.
+* Bug/warning fixes.
+
+Changes for 1.6.0:
+
+* New feature: ADD_FAILURE_AT() for reporting a test failure at the
+  given source location -- useful for writing testing utilities.
+* New feature: the universal value printer is moved from Google Mock
+  to Google Test.
+* New feature: type parameters and value parameters are reported in
+  the XML report now.
+* A gtest_disable_pthreads CMake option.
+* Colored output works in GNU Screen sessions now.
+* Parameters of value-parameterized tests are now printed in the
+  textual output.
+* Failures from ad hoc test assertions run before RUN_ALL_TESTS() are
+  now correctly reported.
+* Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to
+  ostream.
+* More complete handling of exceptions.
+* GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter
+  name is already used by another library.
+* --gtest_catch_exceptions is now true by default, allowing a test
+  program to continue after an exception is thrown.
+* Value-parameterized test fixtures can now derive from Test and
+  WithParamInterface<T> separately, easing conversion of legacy tests.
+* Death test messages are clearly marked to make them more
+  distinguishable from other messages.
+* Compatibility fixes for Android, Google Native Client, MinGW, HP UX,
+  PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear),
+  IBM XL C++ (Visual Age C++), and C++0x.
+* Bug fixes and implementation clean-ups.
+* Potentially incompatible changes: disables the harmful 'make install'
+  command in autotools.
+
+Changes for 1.5.0:
+
+ * New feature: assertions can be safely called in multiple threads
+   where the pthreads library is available.
+ * New feature: predicates used inside EXPECT_TRUE() and friends
+   can now generate custom failure messages.
+ * New feature: Google Test can now be compiled as a DLL.
+ * New feature: fused source files are included.
+ * New feature: prints help when encountering unrecognized Google Test flags.
+ * Experimental feature: CMake build script (requires CMake 2.6.4+).
+ * Experimental feature: the Pump script for meta programming.
+ * double values streamed to an assertion are printed with enough precision
+   to differentiate any two different values.
+ * Google Test now works on Solaris and AIX.
+ * Build and test script improvements.
+ * Bug fixes and implementation clean-ups.
+
+ Potentially breaking changes:
+
+ * Stopped supporting VC++ 7.1 with exceptions disabled.
+ * Dropped support for 'make install'.
+
+Changes for 1.4.0:
+
+ * New feature: the event listener API
+ * New feature: test shuffling
+ * New feature: the XML report format is closer to junitreport and can
+   be parsed by Hudson now.
+ * New feature: when a test runs under Visual Studio, its failures are
+   integrated in the IDE.
+ * New feature: /MD(d) versions of VC++ projects.
+ * New feature: elapsed time for the tests is printed by default.
+ * New feature: comes with a TR1 tuple implementation such that Boost
+   is no longer needed for Combine().
+ * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.
+ * New feature: the Xcode project can now produce static gtest
+   libraries in addition to a framework.
+ * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,
+   Symbian, gcc, and C++Builder.
+ * Bug fixes and implementation clean-ups.
+
+Changes for 1.3.0:
+
+ * New feature: death tests on Windows, Cygwin, and Mac.
+ * New feature: ability to use Google Test assertions in other testing
+   frameworks.
+ * New feature: ability to run disabled test via
+   --gtest_also_run_disabled_tests.
+ * New feature: the --help flag for printing the usage.
+ * New feature: access to Google Test flag values in user code.
+ * New feature: a script that packs Google Test into one .h and one
+   .cc file for easy deployment.
+ * New feature: support for distributing test functions to multiple
+   machines (requires support from the test runner).
+ * Bug fixes and implementation clean-ups.
+
+Changes for 1.2.1:
+
+ * Compatibility fixes for Linux IA-64 and IBM z/OS.
+ * Added support for using Boost and other TR1 implementations.
+ * Changes to the build scripts to support upcoming release of Google C++
+   Mocking Framework.
+ * Added Makefile to the distribution package.
+ * Improved build instructions in README.
+
+Changes for 1.2.0:
+
+ * New feature: value-parameterized tests.
+ * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)
+   macros.
+ * Changed the XML report format to match JUnit/Ant's.
+ * Added tests to the Xcode project.
+ * Added scons/SConscript for building with SCons.
+ * Added src/gtest-all.cc for building Google Test from a single file.
+ * Fixed compatibility with Solaris and z/OS.
+ * Enabled running Python tests on systems with python 2.3 installed,
+   e.g. Mac OS X 10.4.
+ * Bug fixes.
+
+Changes for 1.1.0:
+
+ * New feature: type-parameterized tests.
+ * New feature: exception assertions.
+ * New feature: printing elapsed time of tests.
+ * Improved the robustness of death tests.
+ * Added an Xcode project and samples.
+ * Adjusted the output format on Windows to be understandable by Visual Studio.
+ * Minor bug fixes.
+
+Changes for 1.0.1:
+
+ * Added project files for Visual Studio 7.1.
+ * Fixed issues with compiling on Mac OS X.
+ * Fixed issues with compiling on Cygwin.
+
+Changes for 1.0.0:
+
+ * Initial Open Source release of Google Test
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/CMakeLists.txt b/ThirdParty/common/gtest/gtest-1.7.0/CMakeLists.txt
new file mode 100644
index 0000000..254e606
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/CMakeLists.txt
@@ -0,0 +1,254 @@
+########################################################################
+# CMake build script for Google Test.
+#
+# To run the tests for Google Test itself on Linux, use 'make test' or
+# ctest.  You can select which tests to run using 'ctest -R regex'.
+# For more options, run 'ctest --help'.
+
+# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
+# make it prominent in the GUI.
+option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
+
+# When other libraries are using a shared version of runtime libraries,
+# Google Test also has to use one.
+option(
+  gtest_force_shared_crt
+  "Use shared (DLL) run-time lib even when Google Test is built as static lib."
+  OFF)
+
+option(gtest_build_tests "Build all of gtest's own tests." OFF)
+
+option(gtest_build_samples "Build gtest's sample programs." OFF)
+
+option(gtest_disable_pthreads "Disable uses of pthreads in gtest." OFF)
+
+# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().
+include(cmake/hermetic_build.cmake OPTIONAL)
+
+if (COMMAND pre_project_set_up_hermetic_build)
+  pre_project_set_up_hermetic_build()
+endif()
+
+########################################################################
+#
+# Project-wide settings
+
+# Name of the project.
+#
+# CMake files in this project can refer to the root source directory
+# as ${gtest_SOURCE_DIR} and to the root binary directory as
+# ${gtest_BINARY_DIR}.
+# Language "C" is required for find_package(Threads).
+project(gtest CXX C)
+if(POLICY CMP0042)
+cmake_policy(SET CMP0042 NEW)
+endif()
+
+if (COMMAND set_up_hermetic_build)
+  set_up_hermetic_build()
+endif()
+
+# Define helper functions and macros used by Google Test.
+include(cmake/internal_utils.cmake)
+
+config_compiler_and_linker()  # Defined in internal_utils.cmake.
+
+# Where Google Test's .h files can be found.
+include_directories(
+  ${gtest_SOURCE_DIR}/include
+  ${gtest_SOURCE_DIR})
+
+# Where Google Test's libraries can be found.
+link_directories(${gtest_BINARY_DIR}/src)
+
+########################################################################
+#
+# Defines the gtest & gtest_main libraries.  User tests should link
+# with one of them.
+
+# Google Test libraries.  We build them using more strict warnings than what
+# are used for other targets, to ensure that gtest can be compiled by a user
+# aggressive about warnings.
+cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
+cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
+target_link_libraries(gtest_main gtest)
+
+########################################################################
+#
+# Samples on how to link user tests with gtest or gtest_main.
+#
+# They are not built by default.  To build them, set the
+# gtest_build_samples option to ON.  You can do it by running ccmake
+# or specifying the -Dgtest_build_samples=ON flag when running cmake.
+
+if (gtest_build_samples)
+  cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)
+  cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)
+  cxx_executable(sample3_unittest samples gtest_main)
+  cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)
+  cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)
+  cxx_executable(sample6_unittest samples gtest_main)
+  cxx_executable(sample7_unittest samples gtest_main)
+  cxx_executable(sample8_unittest samples gtest_main)
+  cxx_executable(sample9_unittest samples gtest)
+  cxx_executable(sample10_unittest samples gtest)
+endif()
+
+########################################################################
+#
+# Google Test's own tests.
+#
+# You can skip this section if you aren't interested in testing
+# Google Test itself.
+#
+# The tests are not built by default.  To build them, set the
+# gtest_build_tests option to ON.  You can do it by running ccmake
+# or specifying the -Dgtest_build_tests=ON flag when running cmake.
+
+if (gtest_build_tests)
+  # This must be set in the root directory for the tests to be run by
+  # 'make test' or ctest.
+  enable_testing()
+
+  ############################################################
+  # C++ tests built with standard compiler flags.
+
+  cxx_test(gtest-death-test_test gtest_main)
+  cxx_test(gtest_environment_test gtest)
+  cxx_test(gtest-filepath_test gtest_main)
+  cxx_test(gtest-linked_ptr_test gtest_main)
+  cxx_test(gtest-listener_test gtest_main)
+  cxx_test(gtest_main_unittest gtest_main)
+  cxx_test(gtest-message_test gtest_main)
+  cxx_test(gtest_no_test_unittest gtest)
+  cxx_test(gtest-options_test gtest_main)
+  cxx_test(gtest-param-test_test gtest
+    test/gtest-param-test2_test.cc)
+  cxx_test(gtest-port_test gtest_main)
+  cxx_test(gtest_pred_impl_unittest gtest_main)
+  cxx_test(gtest_premature_exit_test gtest
+    test/gtest_premature_exit_test.cc)
+  cxx_test(gtest-printers_test gtest_main)
+  cxx_test(gtest_prod_test gtest_main
+    test/production.cc)
+  cxx_test(gtest_repeat_test gtest)
+  cxx_test(gtest_sole_header_test gtest_main)
+  cxx_test(gtest_stress_test gtest)
+  cxx_test(gtest-test-part_test gtest_main)
+  cxx_test(gtest_throw_on_failure_ex_test gtest)
+  cxx_test(gtest-typed-test_test gtest_main
+    test/gtest-typed-test2_test.cc)
+  cxx_test(gtest_unittest gtest_main)
+  cxx_test(gtest-unittest-api_test gtest)
+
+  ############################################################
+  # C++ tests built with non-standard compiler flags.
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_library(gtest_no_exception "${cxx_no_exception}"
+      src/gtest-all.cc)
+    cxx_library(gtest_main_no_exception "${cxx_no_exception}"
+      src/gtest-all.cc src/gtest_main.cc)
+  endif()
+  cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
+    src/gtest-all.cc src/gtest_main.cc)
+
+  cxx_test_with_flags(gtest-death-test_ex_nocatch_test
+    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0"
+    gtest test/gtest-death-test_ex_test.cc)
+  cxx_test_with_flags(gtest-death-test_ex_catch_test
+    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1"
+    gtest test/gtest-death-test_ex_test.cc)
+
+  cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}"
+    gtest_main_no_rtti test/gtest_unittest.cc)
+
+  cxx_shared_library(gtest_dll "${cxx_default}"
+    src/gtest-all.cc src/gtest_main.cc)
+
+  cxx_executable_with_flags(gtest_dll_test_ "${cxx_default}"
+    gtest_dll test/gtest_all_test.cc)
+  set_target_properties(gtest_dll_test_
+                        PROPERTIES
+                        COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
+
+  if (NOT MSVC OR NOT MSVC_VERSION EQUAL 1600)
+    # The C++ Standard specifies tuple_element<int, class>.
+    # Yet MSVC 10's <utility> declares tuple_element<size_t, class>.
+    # That declaration conflicts with our own standard-conforming
+    # tuple implementation.  Therefore using our own tuple with
+    # MSVC 10 doesn't compile.
+    cxx_library(gtest_main_use_own_tuple "${cxx_use_own_tuple}"
+      src/gtest-all.cc src/gtest_main.cc)
+
+    cxx_test_with_flags(gtest-tuple_test "${cxx_use_own_tuple}"
+      gtest_main_use_own_tuple test/gtest-tuple_test.cc)
+
+    cxx_test_with_flags(gtest_use_own_tuple_test "${cxx_use_own_tuple}"
+      gtest_main_use_own_tuple
+      test/gtest-param-test_test.cc test/gtest-param-test2_test.cc)
+  endif()
+
+  ############################################################
+  # Python tests.
+
+  cxx_executable(gtest_break_on_failure_unittest_ test gtest)
+  py_test(gtest_break_on_failure_unittest)
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_executable_with_flags(
+      gtest_catch_exceptions_no_ex_test_
+      "${cxx_no_exception}"
+      gtest_main_no_exception
+      test/gtest_catch_exceptions_test_.cc)
+  endif()
+
+  cxx_executable_with_flags(
+    gtest_catch_exceptions_ex_test_
+    "${cxx_exception}"
+    gtest_main
+    test/gtest_catch_exceptions_test_.cc)
+  py_test(gtest_catch_exceptions_test)
+
+  cxx_executable(gtest_color_test_ test gtest)
+  py_test(gtest_color_test)
+
+  cxx_executable(gtest_env_var_test_ test gtest)
+  py_test(gtest_env_var_test)
+
+  cxx_executable(gtest_filter_unittest_ test gtest)
+  py_test(gtest_filter_unittest)
+
+  cxx_executable(gtest_help_test_ test gtest_main)
+  py_test(gtest_help_test)
+
+  cxx_executable(gtest_list_tests_unittest_ test gtest)
+  py_test(gtest_list_tests_unittest)
+
+  cxx_executable(gtest_output_test_ test gtest)
+  py_test(gtest_output_test)
+
+  cxx_executable(gtest_shuffle_test_ test gtest)
+  py_test(gtest_shuffle_test)
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)
+    set_target_properties(gtest_throw_on_failure_test_
+      PROPERTIES
+      COMPILE_FLAGS "${cxx_no_exception}")
+    py_test(gtest_throw_on_failure_test)
+  endif()
+
+  cxx_executable(gtest_uninitialized_test_ test gtest)
+  py_test(gtest_uninitialized_test)
+
+  cxx_executable(gtest_xml_outfile1_test_ test gtest_main)
+  cxx_executable(gtest_xml_outfile2_test_ test gtest_main)
+  py_test(gtest_xml_outfiles_test)
+
+  cxx_executable(gtest_xml_output_unittest_ test gtest)
+  py_test(gtest_xml_output_unittest)
+endif()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/CONTRIBUTORS b/ThirdParty/common/gtest/gtest-1.7.0/CONTRIBUTORS
new file mode 100644
index 0000000..feae2fc
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/CONTRIBUTORS
@@ -0,0 +1,37 @@
+# This file contains a list of people who've made non-trivial
+# contribution to the Google C++ Testing Framework project.  People
+# who commit code to the project are encouraged to add their names
+# here.  Please keep the list sorted by first names.
+
+Ajay Joshi <jaj at google.com>
+Balázs Dán <balazs.dan at gmail.com>
+Bharat Mediratta <bharat at menalto.com>
+Chandler Carruth <chandlerc at google.com>
+Chris Prince <cprince at google.com>
+Chris Taylor <taylorc at google.com>
+Dan Egnor <egnor at google.com>
+Eric Roman <eroman at chromium.org>
+Hady Zalek <hady.zalek at gmail.com>
+Jeffrey Yasskin <jyasskin at google.com>
+Jói Sigurðsson <joi at google.com>
+Keir Mierle <mierle at gmail.com>
+Keith Ray <keith.ray at gmail.com>
+Kenton Varda <kenton at google.com>
+Manuel Klimek <klimek at google.com>
+Markus Heule <markus.heule at gmail.com>
+Mika Raento <mikie at iki.fi>
+Miklós Fazekas <mfazekas at szemafor.com>
+Pasi Valminen <pasi.valminen at gmail.com>
+Patrick Hanna <phanna at google.com>
+Patrick Riley <pfr at google.com>
+Peter Kaminski <piotrk at google.com>
+Preston Jackson <preston.a.jackson at gmail.com>
+Rainer Klaffenboeck <rainer.klaffenboeck at dynatrace.com>
+Russ Cox <rsc at google.com>
+Russ Rufer <russ at pentad.com>
+Sean Mcafee <eefacm at gmail.com>
+Sigurður Ásgeirsson <siggi at google.com>
+Tracy Bialik <tracy at pentad.com>
+Vadim Berman <vadimb at google.com>
+Vlad Losev <vladl at google.com>
+Zhanyong Wan <wan at google.com>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/LICENSE b/ThirdParty/common/gtest/gtest-1.7.0/LICENSE
new file mode 100644
index 0000000..1941a11
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/LICENSE
@@ -0,0 +1,28 @@
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/Makefile.am b/ThirdParty/common/gtest/gtest-1.7.0/Makefile.am
new file mode 100644
index 0000000..9c96b42
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/Makefile.am
@@ -0,0 +1,306 @@
+# Automake file
+
+ACLOCAL_AMFLAGS = -I m4
+
+# Nonstandard package files for distribution
+EXTRA_DIST = \
+  CHANGES \
+  CONTRIBUTORS \
+  LICENSE \
+  include/gtest/gtest-param-test.h.pump \
+  include/gtest/internal/gtest-param-util-generated.h.pump \
+  include/gtest/internal/gtest-tuple.h.pump \
+  include/gtest/internal/gtest-type-util.h.pump \
+  make/Makefile \
+  scripts/fuse_gtest_files.py \
+  scripts/gen_gtest_pred_impl.py \
+  scripts/pump.py \
+  scripts/test/Makefile
+
+# gtest source files that we don't compile directly.  They are
+# #included by gtest-all.cc.
+GTEST_SRC = \
+  src/gtest-death-test.cc \
+  src/gtest-filepath.cc \
+  src/gtest-internal-inl.h \
+  src/gtest-port.cc \
+  src/gtest-printers.cc \
+  src/gtest-test-part.cc \
+  src/gtest-typed-test.cc \
+  src/gtest.cc
+
+EXTRA_DIST += $(GTEST_SRC)
+
+# Sample files that we don't compile.
+EXTRA_DIST += \
+  samples/prime_tables.h \
+  samples/sample2_unittest.cc \
+  samples/sample3_unittest.cc \
+  samples/sample4_unittest.cc \
+  samples/sample5_unittest.cc \
+  samples/sample6_unittest.cc \
+  samples/sample7_unittest.cc \
+  samples/sample8_unittest.cc \
+  samples/sample9_unittest.cc
+
+# C++ test files that we don't compile directly.
+EXTRA_DIST += \
+  test/gtest-death-test_ex_test.cc \
+  test/gtest-death-test_test.cc \
+  test/gtest-filepath_test.cc \
+  test/gtest-linked_ptr_test.cc \
+  test/gtest-listener_test.cc \
+  test/gtest-message_test.cc \
+  test/gtest-options_test.cc \
+  test/gtest-param-test2_test.cc \
+  test/gtest-param-test2_test.cc \
+  test/gtest-param-test_test.cc \
+  test/gtest-param-test_test.cc \
+  test/gtest-param-test_test.h \
+  test/gtest-port_test.cc \
+  test/gtest_premature_exit_test.cc \
+  test/gtest-printers_test.cc \
+  test/gtest-test-part_test.cc \
+  test/gtest-tuple_test.cc \
+  test/gtest-typed-test2_test.cc \
+  test/gtest-typed-test_test.cc \
+  test/gtest-typed-test_test.h \
+  test/gtest-unittest-api_test.cc \
+  test/gtest_break_on_failure_unittest_.cc \
+  test/gtest_catch_exceptions_test_.cc \
+  test/gtest_color_test_.cc \
+  test/gtest_env_var_test_.cc \
+  test/gtest_environment_test.cc \
+  test/gtest_filter_unittest_.cc \
+  test/gtest_help_test_.cc \
+  test/gtest_list_tests_unittest_.cc \
+  test/gtest_main_unittest.cc \
+  test/gtest_no_test_unittest.cc \
+  test/gtest_output_test_.cc \
+  test/gtest_pred_impl_unittest.cc \
+  test/gtest_prod_test.cc \
+  test/gtest_repeat_test.cc \
+  test/gtest_shuffle_test_.cc \
+  test/gtest_sole_header_test.cc \
+  test/gtest_stress_test.cc \
+  test/gtest_throw_on_failure_ex_test.cc \
+  test/gtest_throw_on_failure_test_.cc \
+  test/gtest_uninitialized_test_.cc \
+  test/gtest_unittest.cc \
+  test/gtest_unittest.cc \
+  test/gtest_xml_outfile1_test_.cc \
+  test/gtest_xml_outfile2_test_.cc \
+  test/gtest_xml_output_unittest_.cc \
+  test/production.cc \
+  test/production.h
+
+# Python tests that we don't run.
+EXTRA_DIST += \
+  test/gtest_break_on_failure_unittest.py \
+  test/gtest_catch_exceptions_test.py \
+  test/gtest_color_test.py \
+  test/gtest_env_var_test.py \
+  test/gtest_filter_unittest.py \
+  test/gtest_help_test.py \
+  test/gtest_list_tests_unittest.py \
+  test/gtest_output_test.py \
+  test/gtest_output_test_golden_lin.txt \
+  test/gtest_shuffle_test.py \
+  test/gtest_test_utils.py \
+  test/gtest_throw_on_failure_test.py \
+  test/gtest_uninitialized_test.py \
+  test/gtest_xml_outfiles_test.py \
+  test/gtest_xml_output_unittest.py \
+  test/gtest_xml_test_utils.py
+
+# CMake script
+EXTRA_DIST += \
+  CMakeLists.txt \
+  cmake/internal_utils.cmake
+
+# MSVC project files
+EXTRA_DIST += \
+  msvc/gtest-md.sln \
+  msvc/gtest-md.vcproj \
+  msvc/gtest.sln \
+  msvc/gtest.vcproj \
+  msvc/gtest_main-md.vcproj \
+  msvc/gtest_main.vcproj \
+  msvc/gtest_prod_test-md.vcproj \
+  msvc/gtest_prod_test.vcproj \
+  msvc/gtest_unittest-md.vcproj \
+  msvc/gtest_unittest.vcproj
+
+# xcode project files
+EXTRA_DIST += \
+  xcode/Config/DebugProject.xcconfig \
+  xcode/Config/FrameworkTarget.xcconfig \
+  xcode/Config/General.xcconfig \
+  xcode/Config/ReleaseProject.xcconfig \
+  xcode/Config/StaticLibraryTarget.xcconfig \
+  xcode/Config/TestTarget.xcconfig \
+  xcode/Resources/Info.plist \
+  xcode/Scripts/runtests.sh \
+  xcode/Scripts/versiongenerate.py \
+  xcode/gtest.xcodeproj/project.pbxproj
+
+# xcode sample files
+EXTRA_DIST += \
+  xcode/Samples/FrameworkSample/Info.plist \
+  xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \
+  xcode/Samples/FrameworkSample/runtests.sh \
+  xcode/Samples/FrameworkSample/widget.cc \
+  xcode/Samples/FrameworkSample/widget.h \
+  xcode/Samples/FrameworkSample/widget_test.cc
+
+# C++Builder project files
+EXTRA_DIST += \
+  codegear/gtest.cbproj \
+  codegear/gtest.groupproj \
+  codegear/gtest_all.cc \
+  codegear/gtest_link.cc \
+  codegear/gtest_main.cbproj \
+  codegear/gtest_unittest.cbproj
+
+# Distribute and install M4 macro
+m4datadir = $(datadir)/aclocal
+m4data_DATA = m4/gtest.m4
+EXTRA_DIST += $(m4data_DATA)
+
+# We define the global AM_CPPFLAGS as everything we compile includes from these
+# directories.
+AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include
+
+# Modifies compiler and linker flags for pthreads compatibility.
+if HAVE_PTHREADS
+  AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1
+  AM_LIBS = @PTHREAD_LIBS@
+else
+  AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0
+endif
+
+# Build rules for libraries.
+lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
+
+lib_libgtest_la_SOURCES = src/gtest-all.cc
+
+pkginclude_HEADERS = \
+  include/gtest/gtest-death-test.h \
+  include/gtest/gtest-message.h \
+  include/gtest/gtest-param-test.h \
+  include/gtest/gtest-printers.h \
+  include/gtest/gtest-spi.h \
+  include/gtest/gtest-test-part.h \
+  include/gtest/gtest-typed-test.h \
+  include/gtest/gtest.h \
+  include/gtest/gtest_pred_impl.h \
+  include/gtest/gtest_prod.h
+
+pkginclude_internaldir = $(pkgincludedir)/internal
+pkginclude_internal_HEADERS = \
+  include/gtest/internal/gtest-death-test-internal.h \
+  include/gtest/internal/gtest-filepath.h \
+  include/gtest/internal/gtest-internal.h \
+  include/gtest/internal/gtest-linked_ptr.h \
+  include/gtest/internal/gtest-param-util-generated.h \
+  include/gtest/internal/gtest-param-util.h \
+  include/gtest/internal/gtest-port.h \
+  include/gtest/internal/gtest-string.h \
+  include/gtest/internal/gtest-tuple.h \
+  include/gtest/internal/gtest-type-util.h
+
+lib_libgtest_main_la_SOURCES = src/gtest_main.cc
+lib_libgtest_main_la_LIBADD = lib/libgtest.la
+
+# Bulid rules for samples and tests. Automake's naming for some of
+# these variables isn't terribly obvious, so this is a brief
+# reference:
+#
+# TESTS -- Programs run automatically by "make check"
+# check_PROGRAMS -- Programs built by "make check" but not necessarily run
+
+noinst_LTLIBRARIES = samples/libsamples.la
+
+samples_libsamples_la_SOURCES = \
+  samples/sample1.cc \
+  samples/sample1.h \
+  samples/sample2.cc \
+  samples/sample2.h \
+  samples/sample3-inl.h \
+  samples/sample4.cc \
+  samples/sample4.h
+
+TESTS=
+TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
+                    GTEST_BUILD_DIR="$(top_builddir)/test"
+check_PROGRAMS=
+
+# A simple sample on using gtest.
+TESTS += samples/sample1_unittest
+check_PROGRAMS += samples/sample1_unittest
+samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
+samples_sample1_unittest_LDADD = lib/libgtest_main.la \
+                                 lib/libgtest.la \
+                                 samples/libsamples.la
+
+# Another sample.  It also verifies that libgtest works.
+TESTS += samples/sample10_unittest
+check_PROGRAMS += samples/sample10_unittest
+samples_sample10_unittest_SOURCES = samples/sample10_unittest.cc
+samples_sample10_unittest_LDADD = lib/libgtest.la
+
+# This tests most constructs of gtest and verifies that libgtest_main
+# and libgtest work.
+TESTS += test/gtest_all_test
+check_PROGRAMS += test/gtest_all_test
+test_gtest_all_test_SOURCES = test/gtest_all_test.cc
+test_gtest_all_test_LDADD = lib/libgtest_main.la \
+                            lib/libgtest.la
+
+# Tests that fused gtest files compile and work.
+FUSED_GTEST_SRC = \
+  fused-src/gtest/gtest-all.cc \
+  fused-src/gtest/gtest.h \
+  fused-src/gtest/gtest_main.cc
+
+if HAVE_PYTHON
+TESTS += test/fused_gtest_test
+check_PROGRAMS += test/fused_gtest_test
+test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
+                                samples/sample1.cc samples/sample1_unittest.cc
+test_fused_gtest_test_CPPFLAGS = -I"$(srcdir)/fused-src"
+
+# Build rules for putting fused Google Test files into the distribution
+# package. The user can also create those files by manually running
+# scripts/fuse_gtest_files.py.
+$(test_fused_gtest_test_SOURCES): fused-gtest
+
+fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
+             $(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \
+             scripts/fuse_gtest_files.py
+	mkdir -p "$(srcdir)/fused-src"
+	chmod -R u+w "$(srcdir)/fused-src"
+	rm -f "$(srcdir)/fused-src/gtest/gtest-all.cc"
+	rm -f "$(srcdir)/fused-src/gtest/gtest.h"
+	"$(srcdir)/scripts/fuse_gtest_files.py" "$(srcdir)/fused-src"
+	cp -f "$(srcdir)/src/gtest_main.cc" "$(srcdir)/fused-src/gtest/"
+
+maintainer-clean-local:
+	rm -rf "$(srcdir)/fused-src"
+endif
+
+# Death tests may produce core dumps in the build directory. In case
+# this happens, clean them to keep distcleancheck happy.
+CLEANFILES = core
+
+# Disables 'make install' as installing a compiled version of Google
+# Test can lead to undefined behavior due to violation of the
+# One-Definition Rule.
+
+install-exec-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
+
+install-data-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/Makefile.in b/ThirdParty/common/gtest/gtest-1.7.0/Makefile.in
new file mode 100644
index 0000000..874de74
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/Makefile.in
@@ -0,0 +1,1360 @@
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake file
+
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = samples/sample1_unittest$(EXEEXT) \
+	samples/sample10_unittest$(EXEEXT) \
+	test/gtest_all_test$(EXEEXT) $(am__EXEEXT_1)
+check_PROGRAMS = samples/sample1_unittest$(EXEEXT) \
+	samples/sample10_unittest$(EXEEXT) \
+	test/gtest_all_test$(EXEEXT) $(am__EXEEXT_1)
+ at HAVE_PYTHON_TRUE@am__append_1 = test/fused_gtest_test
+ at HAVE_PYTHON_TRUE@am__append_2 = test/fused_gtest_test
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \
+	$(pkginclude_internal_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/build-aux/config.h.in \
+	$(top_srcdir)/configure $(top_srcdir)/scripts/gtest-config.in \
+	build-aux/config.guess build-aux/config.sub build-aux/depcomp \
+	build-aux/install-sh build-aux/ltmain.sh build-aux/missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/acx_pthread.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/build-aux/config.h
+CONFIG_CLEAN_FILES = scripts/gtest-config
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" \
+	"$(DESTDIR)$(pkgincludedir)" \
+	"$(DESTDIR)$(pkginclude_internaldir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+lib_libgtest_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_lib_libgtest_la_OBJECTS = src/gtest-all.lo
+lib_libgtest_la_OBJECTS = $(am_lib_libgtest_la_OBJECTS)
+lib_libgtest_main_la_DEPENDENCIES = lib/libgtest.la
+am_lib_libgtest_main_la_OBJECTS = src/gtest_main.lo
+lib_libgtest_main_la_OBJECTS = $(am_lib_libgtest_main_la_OBJECTS)
+samples_libsamples_la_LIBADD =
+am_samples_libsamples_la_OBJECTS = samples/sample1.lo \
+	samples/sample2.lo samples/sample4.lo
+samples_libsamples_la_OBJECTS = $(am_samples_libsamples_la_OBJECTS)
+ at HAVE_PYTHON_TRUE@am__EXEEXT_1 = test/fused_gtest_test$(EXEEXT)
+am_samples_sample10_unittest_OBJECTS =  \
+	samples/sample10_unittest.$(OBJEXT)
+samples_sample10_unittest_OBJECTS =  \
+	$(am_samples_sample10_unittest_OBJECTS)
+samples_sample10_unittest_DEPENDENCIES = lib/libgtest.la
+am_samples_sample1_unittest_OBJECTS =  \
+	samples/sample1_unittest.$(OBJEXT)
+samples_sample1_unittest_OBJECTS =  \
+	$(am_samples_sample1_unittest_OBJECTS)
+samples_sample1_unittest_DEPENDENCIES = lib/libgtest_main.la \
+	lib/libgtest.la samples/libsamples.la
+am__test_fused_gtest_test_SOURCES_DIST = fused-src/gtest/gtest-all.cc \
+	fused-src/gtest/gtest.h fused-src/gtest/gtest_main.cc \
+	samples/sample1.cc samples/sample1_unittest.cc
+am__objects_1 =  \
+	fused-src/gtest/test_fused_gtest_test-gtest-all.$(OBJEXT) \
+	fused-src/gtest/test_fused_gtest_test-gtest_main.$(OBJEXT)
+ at HAVE_PYTHON_TRUE@am_test_fused_gtest_test_OBJECTS = $(am__objects_1) \
+ at HAVE_PYTHON_TRUE@	samples/test_fused_gtest_test-sample1.$(OBJEXT) \
+ at HAVE_PYTHON_TRUE@	samples/test_fused_gtest_test-sample1_unittest.$(OBJEXT)
+test_fused_gtest_test_OBJECTS = $(am_test_fused_gtest_test_OBJECTS)
+test_fused_gtest_test_LDADD = $(LDADD)
+am_test_gtest_all_test_OBJECTS = test/gtest_all_test.$(OBJEXT)
+test_gtest_all_test_OBJECTS = $(am_test_gtest_all_test_OBJECTS)
+test_gtest_all_test_DEPENDENCIES = lib/libgtest_main.la \
+	lib/libgtest.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/build-aux
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(lib_libgtest_la_SOURCES) $(lib_libgtest_main_la_SOURCES) \
+	$(samples_libsamples_la_SOURCES) \
+	$(samples_sample10_unittest_SOURCES) \
+	$(samples_sample1_unittest_SOURCES) \
+	$(test_fused_gtest_test_SOURCES) \
+	$(test_gtest_all_test_SOURCES)
+DIST_SOURCES = $(lib_libgtest_la_SOURCES) \
+	$(lib_libgtest_main_la_SOURCES) \
+	$(samples_libsamples_la_SOURCES) \
+	$(samples_sample10_unittest_SOURCES) \
+	$(samples_sample1_unittest_SOURCES) \
+	$(am__test_fused_gtest_test_SOURCES_DIST) \
+	$(test_gtest_all_test_SOURCES)
+DATA = $(m4data_DATA)
+HEADERS = $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ACLOCAL_AMFLAGS = -I m4
+
+# Nonstandard package files for distribution
+
+# Sample files that we don't compile.
+
+# C++ test files that we don't compile directly.
+
+# Python tests that we don't run.
+
+# CMake script
+
+# MSVC project files
+
+# xcode project files
+
+# xcode sample files
+
+# C++Builder project files
+EXTRA_DIST = CHANGES CONTRIBUTORS LICENSE \
+	include/gtest/gtest-param-test.h.pump \
+	include/gtest/internal/gtest-param-util-generated.h.pump \
+	include/gtest/internal/gtest-tuple.h.pump \
+	include/gtest/internal/gtest-type-util.h.pump make/Makefile \
+	scripts/fuse_gtest_files.py scripts/gen_gtest_pred_impl.py \
+	scripts/pump.py scripts/test/Makefile $(GTEST_SRC) \
+	samples/prime_tables.h samples/sample2_unittest.cc \
+	samples/sample3_unittest.cc samples/sample4_unittest.cc \
+	samples/sample5_unittest.cc samples/sample6_unittest.cc \
+	samples/sample7_unittest.cc samples/sample8_unittest.cc \
+	samples/sample9_unittest.cc test/gtest-death-test_ex_test.cc \
+	test/gtest-death-test_test.cc test/gtest-filepath_test.cc \
+	test/gtest-linked_ptr_test.cc test/gtest-listener_test.cc \
+	test/gtest-message_test.cc test/gtest-options_test.cc \
+	test/gtest-param-test2_test.cc test/gtest-param-test2_test.cc \
+	test/gtest-param-test_test.cc test/gtest-param-test_test.cc \
+	test/gtest-param-test_test.h test/gtest-port_test.cc \
+	test/gtest_premature_exit_test.cc test/gtest-printers_test.cc \
+	test/gtest-test-part_test.cc test/gtest-tuple_test.cc \
+	test/gtest-typed-test2_test.cc test/gtest-typed-test_test.cc \
+	test/gtest-typed-test_test.h test/gtest-unittest-api_test.cc \
+	test/gtest_break_on_failure_unittest_.cc \
+	test/gtest_catch_exceptions_test_.cc test/gtest_color_test_.cc \
+	test/gtest_env_var_test_.cc test/gtest_environment_test.cc \
+	test/gtest_filter_unittest_.cc test/gtest_help_test_.cc \
+	test/gtest_list_tests_unittest_.cc test/gtest_main_unittest.cc \
+	test/gtest_no_test_unittest.cc test/gtest_output_test_.cc \
+	test/gtest_pred_impl_unittest.cc test/gtest_prod_test.cc \
+	test/gtest_repeat_test.cc test/gtest_shuffle_test_.cc \
+	test/gtest_sole_header_test.cc test/gtest_stress_test.cc \
+	test/gtest_throw_on_failure_ex_test.cc \
+	test/gtest_throw_on_failure_test_.cc \
+	test/gtest_uninitialized_test_.cc test/gtest_unittest.cc \
+	test/gtest_unittest.cc test/gtest_xml_outfile1_test_.cc \
+	test/gtest_xml_outfile2_test_.cc \
+	test/gtest_xml_output_unittest_.cc test/production.cc \
+	test/production.h test/gtest_break_on_failure_unittest.py \
+	test/gtest_catch_exceptions_test.py test/gtest_color_test.py \
+	test/gtest_env_var_test.py test/gtest_filter_unittest.py \
+	test/gtest_help_test.py test/gtest_list_tests_unittest.py \
+	test/gtest_output_test.py \
+	test/gtest_output_test_golden_lin.txt \
+	test/gtest_shuffle_test.py test/gtest_test_utils.py \
+	test/gtest_throw_on_failure_test.py \
+	test/gtest_uninitialized_test.py \
+	test/gtest_xml_outfiles_test.py \
+	test/gtest_xml_output_unittest.py test/gtest_xml_test_utils.py \
+	CMakeLists.txt cmake/internal_utils.cmake msvc/gtest-md.sln \
+	msvc/gtest-md.vcproj msvc/gtest.sln msvc/gtest.vcproj \
+	msvc/gtest_main-md.vcproj msvc/gtest_main.vcproj \
+	msvc/gtest_prod_test-md.vcproj msvc/gtest_prod_test.vcproj \
+	msvc/gtest_unittest-md.vcproj msvc/gtest_unittest.vcproj \
+	xcode/Config/DebugProject.xcconfig \
+	xcode/Config/FrameworkTarget.xcconfig \
+	xcode/Config/General.xcconfig \
+	xcode/Config/ReleaseProject.xcconfig \
+	xcode/Config/StaticLibraryTarget.xcconfig \
+	xcode/Config/TestTarget.xcconfig xcode/Resources/Info.plist \
+	xcode/Scripts/runtests.sh xcode/Scripts/versiongenerate.py \
+	xcode/gtest.xcodeproj/project.pbxproj \
+	xcode/Samples/FrameworkSample/Info.plist \
+	xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \
+	xcode/Samples/FrameworkSample/runtests.sh \
+	xcode/Samples/FrameworkSample/widget.cc \
+	xcode/Samples/FrameworkSample/widget.h \
+	xcode/Samples/FrameworkSample/widget_test.cc \
+	codegear/gtest.cbproj codegear/gtest.groupproj \
+	codegear/gtest_all.cc codegear/gtest_link.cc \
+	codegear/gtest_main.cbproj codegear/gtest_unittest.cbproj \
+	$(m4data_DATA)
+
+# gtest source files that we don't compile directly.  They are
+# #included by gtest-all.cc.
+GTEST_SRC = \
+  src/gtest-death-test.cc \
+  src/gtest-filepath.cc \
+  src/gtest-internal-inl.h \
+  src/gtest-port.cc \
+  src/gtest-printers.cc \
+  src/gtest-test-part.cc \
+  src/gtest-typed-test.cc \
+  src/gtest.cc
+
+
+# Distribute and install M4 macro
+m4datadir = $(datadir)/aclocal
+m4data_DATA = m4/gtest.m4
+
+# We define the global AM_CPPFLAGS as everything we compile includes from these
+# directories.
+AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include
+ at HAVE_PTHREADS_FALSE@AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0
+
+# Modifies compiler and linker flags for pthreads compatibility.
+ at HAVE_PTHREADS_TRUE@AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1
+ at HAVE_PTHREADS_TRUE@AM_LIBS = @PTHREAD_LIBS@
+
+# Build rules for libraries.
+lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
+lib_libgtest_la_SOURCES = src/gtest-all.cc
+pkginclude_HEADERS = \
+  include/gtest/gtest-death-test.h \
+  include/gtest/gtest-message.h \
+  include/gtest/gtest-param-test.h \
+  include/gtest/gtest-printers.h \
+  include/gtest/gtest-spi.h \
+  include/gtest/gtest-test-part.h \
+  include/gtest/gtest-typed-test.h \
+  include/gtest/gtest.h \
+  include/gtest/gtest_pred_impl.h \
+  include/gtest/gtest_prod.h
+
+pkginclude_internaldir = $(pkgincludedir)/internal
+pkginclude_internal_HEADERS = \
+  include/gtest/internal/gtest-death-test-internal.h \
+  include/gtest/internal/gtest-filepath.h \
+  include/gtest/internal/gtest-internal.h \
+  include/gtest/internal/gtest-linked_ptr.h \
+  include/gtest/internal/gtest-param-util-generated.h \
+  include/gtest/internal/gtest-param-util.h \
+  include/gtest/internal/gtest-port.h \
+  include/gtest/internal/gtest-string.h \
+  include/gtest/internal/gtest-tuple.h \
+  include/gtest/internal/gtest-type-util.h
+
+lib_libgtest_main_la_SOURCES = src/gtest_main.cc
+lib_libgtest_main_la_LIBADD = lib/libgtest.la
+
+# Bulid rules for samples and tests. Automake's naming for some of
+# these variables isn't terribly obvious, so this is a brief
+# reference:
+#
+# TESTS -- Programs run automatically by "make check"
+# check_PROGRAMS -- Programs built by "make check" but not necessarily run
+noinst_LTLIBRARIES = samples/libsamples.la
+samples_libsamples_la_SOURCES = \
+  samples/sample1.cc \
+  samples/sample1.h \
+  samples/sample2.cc \
+  samples/sample2.h \
+  samples/sample3-inl.h \
+  samples/sample4.cc \
+  samples/sample4.h
+
+TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
+                    GTEST_BUILD_DIR="$(top_builddir)/test"
+
+samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
+samples_sample1_unittest_LDADD = lib/libgtest_main.la \
+                                 lib/libgtest.la \
+                                 samples/libsamples.la
+
+samples_sample10_unittest_SOURCES = samples/sample10_unittest.cc
+samples_sample10_unittest_LDADD = lib/libgtest.la
+test_gtest_all_test_SOURCES = test/gtest_all_test.cc
+test_gtest_all_test_LDADD = lib/libgtest_main.la \
+                            lib/libgtest.la
+
+
+# Tests that fused gtest files compile and work.
+FUSED_GTEST_SRC = \
+  fused-src/gtest/gtest-all.cc \
+  fused-src/gtest/gtest.h \
+  fused-src/gtest/gtest_main.cc
+
+ at HAVE_PYTHON_TRUE@test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
+ at HAVE_PYTHON_TRUE@                                samples/sample1.cc samples/sample1_unittest.cc
+
+ at HAVE_PYTHON_TRUE@test_fused_gtest_test_CPPFLAGS = -I"$(srcdir)/fused-src"
+
+# Death tests may produce core dumps in the build directory. In case
+# this happens, clean them to keep distcleancheck happy.
+CLEANFILES = core
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+build-aux/config.h: build-aux/stamp-h1
+	@if test ! -f $@; then rm -f build-aux/stamp-h1; else :; fi
+	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) build-aux/stamp-h1; else :; fi
+
+build-aux/stamp-h1: $(top_srcdir)/build-aux/config.h.in $(top_builddir)/config.status
+	@rm -f build-aux/stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status build-aux/config.h
+$(top_srcdir)/build-aux/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f build-aux/stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f build-aux/config.h build-aux/stamp-h1
+scripts/gtest-config: $(top_builddir)/config.status $(top_srcdir)/scripts/gtest-config.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/$(DEPDIR)
+	@: > src/$(DEPDIR)/$(am__dirstamp)
+src/gtest-all.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+lib/$(am__dirstamp):
+	@$(MKDIR_P) lib
+	@: > lib/$(am__dirstamp)
+lib/libgtest.la: $(lib_libgtest_la_OBJECTS) $(lib_libgtest_la_DEPENDENCIES) $(EXTRA_lib_libgtest_la_DEPENDENCIES) lib/$(am__dirstamp)
+	$(CXXLINK) -rpath $(libdir) $(lib_libgtest_la_OBJECTS) $(lib_libgtest_la_LIBADD) $(LIBS)
+src/gtest_main.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+lib/libgtest_main.la: $(lib_libgtest_main_la_OBJECTS) $(lib_libgtest_main_la_DEPENDENCIES) $(EXTRA_lib_libgtest_main_la_DEPENDENCIES) lib/$(am__dirstamp)
+	$(CXXLINK) -rpath $(libdir) $(lib_libgtest_main_la_OBJECTS) $(lib_libgtest_main_la_LIBADD) $(LIBS)
+samples/$(am__dirstamp):
+	@$(MKDIR_P) samples
+	@: > samples/$(am__dirstamp)
+samples/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) samples/$(DEPDIR)
+	@: > samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample1.lo: samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample2.lo: samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample4.lo: samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/libsamples.la: $(samples_libsamples_la_OBJECTS) $(samples_libsamples_la_DEPENDENCIES) $(EXTRA_samples_libsamples_la_DEPENDENCIES) samples/$(am__dirstamp)
+	$(CXXLINK)  $(samples_libsamples_la_OBJECTS) $(samples_libsamples_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+samples/sample10_unittest.$(OBJEXT): samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample10_unittest$(EXEEXT): $(samples_sample10_unittest_OBJECTS) $(samples_sample10_unittest_DEPENDENCIES) $(EXTRA_samples_sample10_unittest_DEPENDENCIES) samples/$(am__dirstamp)
+	@rm -f samples/sample10_unittest$(EXEEXT)
+	$(CXXLINK) $(samples_sample10_unittest_OBJECTS) $(samples_sample10_unittest_LDADD) $(LIBS)
+samples/sample1_unittest.$(OBJEXT): samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample1_unittest$(EXEEXT): $(samples_sample1_unittest_OBJECTS) $(samples_sample1_unittest_DEPENDENCIES) $(EXTRA_samples_sample1_unittest_DEPENDENCIES) samples/$(am__dirstamp)
+	@rm -f samples/sample1_unittest$(EXEEXT)
+	$(CXXLINK) $(samples_sample1_unittest_OBJECTS) $(samples_sample1_unittest_LDADD) $(LIBS)
+fused-src/gtest/$(am__dirstamp):
+	@$(MKDIR_P) fused-src/gtest
+	@: > fused-src/gtest/$(am__dirstamp)
+fused-src/gtest/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) fused-src/gtest/$(DEPDIR)
+	@: > fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+fused-src/gtest/test_fused_gtest_test-gtest-all.$(OBJEXT):  \
+	fused-src/gtest/$(am__dirstamp) \
+	fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+fused-src/gtest/test_fused_gtest_test-gtest_main.$(OBJEXT):  \
+	fused-src/gtest/$(am__dirstamp) \
+	fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+samples/test_fused_gtest_test-sample1.$(OBJEXT):  \
+	samples/$(am__dirstamp) samples/$(DEPDIR)/$(am__dirstamp)
+samples/test_fused_gtest_test-sample1_unittest.$(OBJEXT):  \
+	samples/$(am__dirstamp) samples/$(DEPDIR)/$(am__dirstamp)
+test/$(am__dirstamp):
+	@$(MKDIR_P) test
+	@: > test/$(am__dirstamp)
+test/fused_gtest_test$(EXEEXT): $(test_fused_gtest_test_OBJECTS) $(test_fused_gtest_test_DEPENDENCIES) $(EXTRA_test_fused_gtest_test_DEPENDENCIES) test/$(am__dirstamp)
+	@rm -f test/fused_gtest_test$(EXEEXT)
+	$(CXXLINK) $(test_fused_gtest_test_OBJECTS) $(test_fused_gtest_test_LDADD) $(LIBS)
+test/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) test/$(DEPDIR)
+	@: > test/$(DEPDIR)/$(am__dirstamp)
+test/gtest_all_test.$(OBJEXT): test/$(am__dirstamp) \
+	test/$(DEPDIR)/$(am__dirstamp)
+test/gtest_all_test$(EXEEXT): $(test_gtest_all_test_OBJECTS) $(test_gtest_all_test_DEPENDENCIES) $(EXTRA_test_gtest_all_test_DEPENDENCIES) test/$(am__dirstamp)
+	@rm -f test/gtest_all_test$(EXEEXT)
+	$(CXXLINK) $(test_gtest_all_test_OBJECTS) $(test_gtest_all_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f fused-src/gtest/test_fused_gtest_test-gtest-all.$(OBJEXT)
+	-rm -f fused-src/gtest/test_fused_gtest_test-gtest_main.$(OBJEXT)
+	-rm -f samples/sample1.$(OBJEXT)
+	-rm -f samples/sample1.lo
+	-rm -f samples/sample10_unittest.$(OBJEXT)
+	-rm -f samples/sample1_unittest.$(OBJEXT)
+	-rm -f samples/sample2.$(OBJEXT)
+	-rm -f samples/sample2.lo
+	-rm -f samples/sample4.$(OBJEXT)
+	-rm -f samples/sample4.lo
+	-rm -f samples/test_fused_gtest_test-sample1.$(OBJEXT)
+	-rm -f samples/test_fused_gtest_test-sample1_unittest.$(OBJEXT)
+	-rm -f src/gtest-all.$(OBJEXT)
+	-rm -f src/gtest-all.lo
+	-rm -f src/gtest_main.$(OBJEXT)
+	-rm -f src/gtest_main.lo
+	-rm -f test/gtest_all_test.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample1.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample10_unittest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample1_unittest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample2.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample4.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/test_fused_gtest_test-sample1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/gtest-all.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/gtest_main.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/gtest_all_test.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+fused-src/gtest/test_fused_gtest_test-gtest-all.o: fused-src/gtest/gtest-all.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest-all.o -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.o `test -f 'fused-src/gtest/gtest-all.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest-all.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest-all.cc' object='fused-src/gtest/test_fused_gtest_test-gtest-all.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.o `test -f 'fused-src/gtest/gtest-all.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest-all.cc
+
+fused-src/gtest/test_fused_gtest_test-gtest-all.obj: fused-src/gtest/gtest-all.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest-all.obj -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.obj `if test -f 'fused-src/gtest/gtest-all.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest-all.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest-all.cc' object='fused-src/gtest/test_fused_gtest_test-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.obj `if test -f 'fused-src/gtest/gtest-all.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest-all.cc'; fi`
+
+fused-src/gtest/test_fused_gtest_test-gtest_main.o: fused-src/gtest/gtest_main.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest_main.o -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.o `test -f 'fused-src/gtest/gtest_main.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest_main.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest_main.cc' object='fused-src/gtest/test_fused_gtest_test-gtest_main.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.o `test -f 'fused-src/gtest/gtest_main.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest_main.cc
+
+fused-src/gtest/test_fused_gtest_test-gtest_main.obj: fused-src/gtest/gtest_main.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest_main.obj -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.obj `if test -f 'fused-src/gtest/gtest_main.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest_main.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest_main.cc' object='fused-src/gtest/test_fused_gtest_test-gtest_main.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.obj `if test -f 'fused-src/gtest/gtest_main.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest_main.cc'; fi`
+
+samples/test_fused_gtest_test-sample1.o: samples/sample1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1.o -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo -c -o samples/test_fused_gtest_test-sample1.o `test -f 'samples/sample1.cc' || echo '$(srcdir)/'`samples/sample1.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1.cc' object='samples/test_fused_gtest_test-sample1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1.o `test -f 'samples/sample1.cc' || echo '$(srcdir)/'`samples/sample1.cc
+
+samples/test_fused_gtest_test-sample1.obj: samples/sample1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1.obj -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo -c -o samples/test_fused_gtest_test-sample1.obj `if test -f 'samples/sample1.cc'; then $(CYGPATH_W) 'samples/sample1.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1.cc' object='samples/test_fused_gtest_test-sample1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1.obj `if test -f 'samples/sample1.cc'; then $(CYGPATH_W) 'samples/sample1.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1.cc'; fi`
+
+samples/test_fused_gtest_test-sample1_unittest.o: samples/sample1_unittest.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1_unittest.o -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo -c -o samples/test_fused_gtest_test-sample1_unittest.o `test -f 'samples/sample1_unittest.cc' || echo '$(srcdir)/'`samples/sample1_unittest.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1_unittest.cc' object='samples/test_fused_gtest_test-sample1_unittest.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1_unittest.o `test -f 'samples/sample1_unittest.cc' || echo '$(srcdir)/'`samples/sample1_unittest.cc
+
+samples/test_fused_gtest_test-sample1_unittest.obj: samples/sample1_unittest.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1_unittest.obj -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo -c -o samples/test_fused_gtest_test-sample1_unittest.obj `if test -f 'samples/sample1_unittest.cc'; then $(CYGPATH_W) 'samples/sample1_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1_unittest.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1_unittest.cc' object='samples/test_fused_gtest_test-sample1_unittest.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1_unittest.obj `if test -f 'samples/sample1_unittest.cc'; then $(CYGPATH_W) 'samples/sample1_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1_unittest.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf lib/.libs lib/_libs
+	-rm -rf samples/.libs samples/_libs
+	-rm -rf src/.libs src/_libs
+	-rm -rf test/.libs test/_libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-m4dataDATA: $(m4data_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)"
+	@list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \
+	done
+
+uninstall-m4dataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir)
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
+	done
+
+uninstall-pkgincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
+install-pkginclude_internalHEADERS: $(pkginclude_internal_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkginclude_internaldir)" || $(MKDIR_P) "$(DESTDIR)$(pkginclude_internaldir)"
+	@list='$(pkginclude_internal_HEADERS)'; test -n "$(pkginclude_internaldir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkginclude_internaldir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkginclude_internaldir)" || exit $$?; \
+	done
+
+uninstall-pkginclude_internalHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkginclude_internal_HEADERS)'; test -n "$(pkginclude_internaldir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkginclude_internaldir)'; $(am__uninstall_files_from_dir)
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkginclude_internaldir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+	-rm -f fused-src/gtest/$(am__dirstamp)
+	-rm -f lib/$(am__dirstamp)
+	-rm -f samples/$(DEPDIR)/$(am__dirstamp)
+	-rm -f samples/$(am__dirstamp)
+	-rm -f src/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/$(am__dirstamp)
+	-rm -f test/$(DEPDIR)/$(am__dirstamp)
+	-rm -f test/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+ at HAVE_PYTHON_FALSE@maintainer-clean-local:
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf fused-src/gtest/$(DEPDIR) samples/$(DEPDIR) src/$(DEPDIR) test/$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-m4dataDATA \
+	install-pkgincludeHEADERS install-pkginclude_internalHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-exec-local install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf fused-src/gtest/$(DEPDIR) samples/$(DEPDIR) src/$(DEPDIR) test/$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+	maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES uninstall-m4dataDATA \
+	uninstall-pkgincludeHEADERS \
+	uninstall-pkginclude_internalHEADERS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \
+	clean clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES ctags dist dist-all \
+	dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-compile \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-data-local install-dvi \
+	install-dvi-am install-exec install-exec-am install-exec-local \
+	install-html install-html-am install-info install-info-am \
+	install-libLTLIBRARIES install-m4dataDATA install-man \
+	install-pdf install-pdf-am install-pkgincludeHEADERS \
+	install-pkginclude_internalHEADERS install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic \
+	maintainer-clean-local mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-libLTLIBRARIES \
+	uninstall-m4dataDATA uninstall-pkgincludeHEADERS \
+	uninstall-pkginclude_internalHEADERS
+
+
+# Build rules for putting fused Google Test files into the distribution
+# package. The user can also create those files by manually running
+# scripts/fuse_gtest_files.py.
+ at HAVE_PYTHON_TRUE@$(test_fused_gtest_test_SOURCES): fused-gtest
+
+ at HAVE_PYTHON_TRUE@fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
+ at HAVE_PYTHON_TRUE@             $(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \
+ at HAVE_PYTHON_TRUE@             scripts/fuse_gtest_files.py
+ at HAVE_PYTHON_TRUE@	mkdir -p "$(srcdir)/fused-src"
+ at HAVE_PYTHON_TRUE@	chmod -R u+w "$(srcdir)/fused-src"
+ at HAVE_PYTHON_TRUE@	rm -f "$(srcdir)/fused-src/gtest/gtest-all.cc"
+ at HAVE_PYTHON_TRUE@	rm -f "$(srcdir)/fused-src/gtest/gtest.h"
+ at HAVE_PYTHON_TRUE@	"$(srcdir)/scripts/fuse_gtest_files.py" "$(srcdir)/fused-src"
+ at HAVE_PYTHON_TRUE@	cp -f "$(srcdir)/src/gtest_main.cc" "$(srcdir)/fused-src/gtest/"
+
+ at HAVE_PYTHON_TRUE@maintainer-clean-local:
+ at HAVE_PYTHON_TRUE@	rm -rf "$(srcdir)/fused-src"
+
+# Disables 'make install' as installing a compiled version of Google
+# Test can lead to undefined behavior due to violation of the
+# One-Definition Rule.
+
+install-exec-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
+
+install-data-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/README b/ThirdParty/common/gtest/gtest-1.7.0/README
new file mode 100644
index 0000000..26f35a8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/README
@@ -0,0 +1,435 @@
+Google C++ Testing Framework
+============================
+
+http://code.google.com/p/googletest/
+
+Overview
+--------
+
+Google's framework for writing C++ tests on a variety of platforms
+(Linux, Mac OS X, Windows, Windows CE, Symbian, etc).  Based on the
+xUnit architecture.  Supports automatic test discovery, a rich set of
+assertions, user-defined assertions, death tests, fatal and non-fatal
+failures, various options for running the tests, and XML test report
+generation.
+
+Please see the project page above for more information as well as the
+mailing list for questions, discussions, and development.  There is
+also an IRC channel on OFTC (irc.oftc.net) #gtest available.  Please
+join us!
+
+Requirements for End Users
+--------------------------
+
+Google Test is designed to have fairly minimal requirements to build
+and use with your projects, but there are some.  Currently, we support
+Linux, Windows, Mac OS X, and Cygwin.  We will also make our best
+effort to support other platforms (e.g. Solaris, AIX, and z/OS).
+However, since core members of the Google Test project have no access
+to these platforms, Google Test may have outstanding issues there.  If
+you notice any problems on your platform, please notify
+googletestframework at googlegroups.com.  Patches for fixing them are
+even more welcome!
+
+### Linux Requirements ###
+
+These are the base requirements to build and use Google Test from a source
+package (as described below):
+  * GNU-compatible Make or gmake
+  * POSIX-standard shell
+  * POSIX(-2) Regular Expressions (regex.h)
+  * A C++98-standard-compliant compiler
+
+### Windows Requirements ###
+
+  * Microsoft Visual C++ 7.1 or newer
+
+### Cygwin Requirements ###
+
+  * Cygwin 1.5.25-14 or newer
+
+### Mac OS X Requirements ###
+
+  * Mac OS X 10.4 Tiger or newer
+  * Developer Tools Installed
+
+Also, you'll need CMake 2.6.4 or higher if you want to build the
+samples using the provided CMake script, regardless of the platform.
+
+Requirements for Contributors
+-----------------------------
+
+We welcome patches.  If you plan to contribute a patch, you need to
+build Google Test and its own tests from an SVN checkout (described
+below), which has further requirements:
+
+  * Python version 2.3 or newer (for running some of the tests and
+    re-generating certain source files from templates)
+  * CMake 2.6.4 or newer
+
+Getting the Source
+------------------
+
+There are two primary ways of getting Google Test's source code: you
+can download a stable source release in your preferred archive format,
+or directly check out the source from our Subversion (SVN) repositary.
+The SVN checkout requires a few extra steps and some extra software
+packages on your system, but lets you track the latest development and
+make patches much more easily, so we highly encourage it.
+
+### Source Package ###
+
+Google Test is released in versioned source packages which can be
+downloaded from the download page [1].  Several different archive
+formats are provided, but the only difference is the tools used to
+manipulate them, and the size of the resulting file.  Download
+whichever you are most comfortable with.
+
+  [1] http://code.google.com/p/googletest/downloads/list
+
+Once the package is downloaded, expand it using whichever tools you
+prefer for that type.  This will result in a new directory with the
+name "gtest-X.Y.Z" which contains all of the source code.  Here are
+some examples on Linux:
+
+  tar -xvzf gtest-X.Y.Z.tar.gz
+  tar -xvjf gtest-X.Y.Z.tar.bz2
+  unzip gtest-X.Y.Z.zip
+
+### SVN Checkout ###
+
+To check out the main branch (also known as the "trunk") of Google
+Test, run the following Subversion command:
+
+  svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn
+
+Setting up the Build
+--------------------
+
+To build Google Test and your tests that use it, you need to tell your
+build system where to find its headers and source files.  The exact
+way to do it depends on which build system you use, and is usually
+straightforward.
+
+### Generic Build Instructions ###
+
+Suppose you put Google Test in directory ${GTEST_DIR}.  To build it,
+create a library build target (or a project as called by Visual Studio
+and Xcode) to compile
+
+  ${GTEST_DIR}/src/gtest-all.cc
+
+with ${GTEST_DIR}/include in the system header search path and ${GTEST_DIR}
+in the normal header search path.  Assuming a Linux-like system and gcc,
+something like the following will do:
+
+  g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \
+      -pthread -c ${GTEST_DIR}/src/gtest-all.cc
+  ar -rv libgtest.a gtest-all.o
+
+(We need -pthread as Google Test uses threads.)
+
+Next, you should compile your test source file with
+${GTEST_DIR}/include in the system header search path, and link it
+with gtest and any other necessary libraries:
+
+  g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \
+      -o your_test
+
+As an example, the make/ directory contains a Makefile that you can
+use to build Google Test on systems where GNU make is available
+(e.g. Linux, Mac OS X, and Cygwin).  It doesn't try to build Google
+Test's own tests.  Instead, it just builds the Google Test library and
+a sample test.  You can use it as a starting point for your own build
+script.
+
+If the default settings are correct for your environment, the
+following commands should succeed:
+
+  cd ${GTEST_DIR}/make
+  make
+  ./sample1_unittest
+
+If you see errors, try to tweak the contents of make/Makefile to make
+them go away.  There are instructions in make/Makefile on how to do
+it.
+
+### Using CMake ###
+
+Google Test comes with a CMake build script (CMakeLists.txt) that can
+be used on a wide range of platforms ("C" stands for cross-platofrm.).
+If you don't have CMake installed already, you can download it for
+free from http://www.cmake.org/.
+
+CMake works by generating native makefiles or build projects that can
+be used in the compiler environment of your choice.  The typical
+workflow starts with:
+
+  mkdir mybuild       # Create a directory to hold the build output.
+  cd mybuild
+  cmake ${GTEST_DIR}  # Generate native build scripts.
+
+If you want to build Google Test's samples, you should replace the
+last command with
+
+  cmake -Dgtest_build_samples=ON ${GTEST_DIR}
+
+If you are on a *nix system, you should now see a Makefile in the
+current directory.  Just type 'make' to build gtest.
+
+If you use Windows and have Vistual Studio installed, a gtest.sln file
+and several .vcproj files will be created.  You can then build them
+using Visual Studio.
+
+On Mac OS X with Xcode installed, a .xcodeproj file will be generated.
+
+### Legacy Build Scripts ###
+
+Before settling on CMake, we have been providing hand-maintained build
+projects/scripts for Visual Studio, Xcode, and Autotools.  While we
+continue to provide them for convenience, they are not actively
+maintained any more.  We highly recommend that you follow the
+instructions in the previous two sections to integrate Google Test
+with your existing build system.
+
+If you still need to use the legacy build scripts, here's how:
+
+The msvc\ folder contains two solutions with Visual C++ projects.
+Open the gtest.sln or gtest-md.sln file using Visual Studio, and you
+are ready to build Google Test the same way you build any Visual
+Studio project.  Files that have names ending with -md use DLL
+versions of Microsoft runtime libraries (the /MD or the /MDd compiler
+option).  Files without that suffix use static versions of the runtime
+libraries (the /MT or the /MTd option).  Please note that one must use
+the same option to compile both gtest and the test code.  If you use
+Visual Studio 2005 or above, we recommend the -md version as /MD is
+the default for new projects in these versions of Visual Studio.
+
+On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using
+Xcode.  Build the "gtest" target.  The universal binary framework will
+end up in your selected build directory (selected in the Xcode
+"Preferences..." -> "Building" pane and defaults to xcode/build).
+Alternatively, at the command line, enter:
+
+  xcodebuild
+
+This will build the "Release" configuration of gtest.framework in your
+default build location.  See the "xcodebuild" man page for more
+information about building different configurations and building in
+different locations.
+
+If you wish to use the Google Test Xcode project with Xcode 4.x and
+above, you need to either:
+ * update the SDK configuration options in xcode/Config/General.xconfig.
+   Comment options SDKROOT, MACOS_DEPLOYMENT_TARGET, and GCC_VERSION. If
+   you choose this route you lose the ability to target earlier versions
+   of MacOS X.
+ * Install an SDK for an earlier version. This doesn't appear to be
+   supported by Apple, but has been reported to work
+   (http://stackoverflow.com/questions/5378518).
+
+Tweaking Google Test
+--------------------
+
+Google Test can be used in diverse environments.  The default
+configuration may not work (or may not work well) out of the box in
+some environments.  However, you can easily tweak Google Test by
+defining control macros on the compiler command line.  Generally,
+these macros are named like GTEST_XYZ and you define them to either 1
+or 0 to enable or disable a certain feature.
+
+We list the most frequently used macros below.  For a complete list,
+see file include/gtest/internal/gtest-port.h.
+
+### Choosing a TR1 Tuple Library ###
+
+Some Google Test features require the C++ Technical Report 1 (TR1)
+tuple library, which is not yet available with all compilers.  The
+good news is that Google Test implements a subset of TR1 tuple that's
+enough for its own need, and will automatically use this when the
+compiler doesn't provide TR1 tuple.
+
+Usually you don't need to care about which tuple library Google Test
+uses.  However, if your project already uses TR1 tuple, you need to
+tell Google Test to use the same TR1 tuple library the rest of your
+project uses, or the two tuple implementations will clash.  To do
+that, add
+
+  -DGTEST_USE_OWN_TR1_TUPLE=0
+
+to the compiler flags while compiling Google Test and your tests.  If
+you want to force Google Test to use its own tuple library, just add
+
+  -DGTEST_USE_OWN_TR1_TUPLE=1
+
+to the compiler flags instead.
+
+If you don't want Google Test to use tuple at all, add
+
+  -DGTEST_HAS_TR1_TUPLE=0
+
+and all features using tuple will be disabled.
+
+### Multi-threaded Tests ###
+
+Google Test is thread-safe where the pthread library is available.
+After #include "gtest/gtest.h", you can check the GTEST_IS_THREADSAFE
+macro to see whether this is the case (yes if the macro is #defined to
+1, no if it's undefined.).
+
+If Google Test doesn't correctly detect whether pthread is available
+in your environment, you can force it with
+
+  -DGTEST_HAS_PTHREAD=1
+
+or
+
+  -DGTEST_HAS_PTHREAD=0
+
+When Google Test uses pthread, you may need to add flags to your
+compiler and/or linker to select the pthread library, or you'll get
+link errors.  If you use the CMake script or the deprecated Autotools
+script, this is taken care of for you.  If you use your own build
+script, you'll need to read your compiler and linker's manual to
+figure out what flags to add.
+
+### As a Shared Library (DLL) ###
+
+Google Test is compact, so most users can build and link it as a
+static library for the simplicity.  You can choose to use Google Test
+as a shared library (known as a DLL on Windows) if you prefer.
+
+To compile *gtest* as a shared library, add
+
+  -DGTEST_CREATE_SHARED_LIBRARY=1
+
+to the compiler flags.  You'll also need to tell the linker to produce
+a shared library instead - consult your linker's manual for how to do
+it.
+
+To compile your *tests* that use the gtest shared library, add
+
+  -DGTEST_LINKED_AS_SHARED_LIBRARY=1
+
+to the compiler flags.
+
+Note: while the above steps aren't technically necessary today when
+using some compilers (e.g. GCC), they may become necessary in the
+future, if we decide to improve the speed of loading the library (see
+http://gcc.gnu.org/wiki/Visibility for details).  Therefore you are
+recommended to always add the above flags when using Google Test as a
+shared library.  Otherwise a future release of Google Test may break
+your build script.
+
+### Avoiding Macro Name Clashes ###
+
+In C++, macros don't obey namespaces.  Therefore two libraries that
+both define a macro of the same name will clash if you #include both
+definitions.  In case a Google Test macro clashes with another
+library, you can force Google Test to rename its macro to avoid the
+conflict.
+
+Specifically, if both Google Test and some other code define macro
+FOO, you can add
+
+  -DGTEST_DONT_DEFINE_FOO=1
+
+to the compiler flags to tell Google Test to change the macro's name
+from FOO to GTEST_FOO.  Currently FOO can be FAIL, SUCCEED, or TEST.
+For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write
+
+  GTEST_TEST(SomeTest, DoesThis) { ... }
+
+instead of
+
+  TEST(SomeTest, DoesThis) { ... }
+
+in order to define a test.
+
+Upgrating from an Earlier Version
+---------------------------------
+
+We strive to keep Google Test releases backward compatible.
+Sometimes, though, we have to make some breaking changes for the
+users' long-term benefits.  This section describes what you'll need to
+do if you are upgrading from an earlier version of Google Test.
+
+### Upgrading from 1.3.0 or Earlier ###
+
+You may need to explicitly enable or disable Google Test's own TR1
+tuple library.  See the instructions in section "Choosing a TR1 Tuple
+Library".
+
+### Upgrading from 1.4.0 or Earlier ###
+
+The Autotools build script (configure + make) is no longer officially
+supportted.  You are encouraged to migrate to your own build system or
+use CMake.  If you still need to use Autotools, you can find
+instructions in the README file from Google Test 1.4.0.
+
+On platforms where the pthread library is available, Google Test uses
+it in order to be thread-safe.  See the "Multi-threaded Tests" section
+for what this means to your build script.
+
+If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google
+Test will no longer compile.  This should affect very few people, as a
+large portion of STL (including <string>) doesn't compile in this mode
+anyway.  We decided to stop supporting it in order to greatly simplify
+Google Test's implementation.
+
+Developing Google Test
+----------------------
+
+This section discusses how to make your own changes to Google Test.
+
+### Testing Google Test Itself ###
+
+To make sure your changes work as intended and don't break existing
+functionality, you'll want to compile and run Google Test's own tests.
+For that you can use CMake:
+
+  mkdir mybuild
+  cd mybuild
+  cmake -Dgtest_build_tests=ON ${GTEST_DIR}
+
+Make sure you have Python installed, as some of Google Test's tests
+are written in Python.  If the cmake command complains about not being
+able to find Python ("Could NOT find PythonInterp (missing:
+PYTHON_EXECUTABLE)"), try telling it explicitly where your Python
+executable can be found:
+
+  cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR}
+
+Next, you can build Google Test and all of its own tests.  On *nix,
+this is usually done by 'make'.  To run the tests, do
+
+  make test
+
+All tests should pass.
+
+### Regenerating Source Files ###
+
+Some of Google Test's source files are generated from templates (not
+in the C++ sense) using a script.  A template file is named FOO.pump,
+where FOO is the name of the file it will generate.  For example, the
+file include/gtest/internal/gtest-type-util.h.pump is used to generate
+gtest-type-util.h in the same directory.
+
+Normally you don't need to worry about regenerating the source files,
+unless you need to modify them.  In that case, you should modify the
+corresponding .pump files instead and run the pump.py Python script to
+regenerate them.  You can find pump.py in the scripts/ directory.
+Read the Pump manual [2] for how to use it.
+
+  [2] http://code.google.com/p/googletest/wiki/PumpManual
+
+### Contributing a Patch ###
+
+We welcome patches.  Please read the Google Test developer's guide [3]
+for how you can contribute.  In particular, make sure you have signed
+the Contributor License Agreement, or we won't be able to accept the
+patch.
+
+  [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide
+
+Happy testing!
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/aclocal.m4 b/ThirdParty/common/gtest/gtest-1.7.0/aclocal.m4
new file mode 100644
index 0000000..e7df9fe
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/aclocal.m4
@@ -0,0 +1,1198 @@
+# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.3], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.3])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009,
+# 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------------
+# Adds support for distributing Python modules and packages.  To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable.  To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+#
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+#
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+#
+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement.  MINIMUM-VERSION should consist of
+# numbers and dots only.
+AC_DEFUN([AM_PATH_PYTHON],
+ [
+  dnl Find a Python interpreter.  Python versions prior to 2.0 are not
+  dnl supported. (2.0 was released on October 16, 2000).
+  m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
+[python python2 python3 python3.2 python3.1 python3.0 python2.7 dnl
+ python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0])
+
+  AC_ARG_VAR([PYTHON], [the Python interpreter])
+
+  m4_if([$1],[],[
+    dnl No version check is needed.
+    # Find any Python interpreter.
+    if test -z "$PYTHON"; then
+      AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
+    fi
+    am_display_PYTHON=python
+  ], [
+    dnl A version check is needed.
+    if test -n "$PYTHON"; then
+      # If the user set $PYTHON, use it and don't search something else.
+      AC_MSG_CHECKING([whether $PYTHON version >= $1])
+      AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
+			      [AC_MSG_RESULT(yes)],
+			      [AC_MSG_ERROR(too old)])
+      am_display_PYTHON=$PYTHON
+    else
+      # Otherwise, try each interpreter until we find one that satisfies
+      # VERSION.
+      AC_CACHE_CHECK([for a Python interpreter with version >= $1],
+	[am_cv_pathless_PYTHON],[
+	for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
+	  test "$am_cv_pathless_PYTHON" = none && break
+	  AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
+	done])
+      # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+      if test "$am_cv_pathless_PYTHON" = none; then
+	PYTHON=:
+      else
+        AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
+      fi
+      am_display_PYTHON=$am_cv_pathless_PYTHON
+    fi
+  ])
+
+  if test "$PYTHON" = :; then
+  dnl Run any user-specified action, or abort.
+    m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
+  else
+
+  dnl Query Python for its version number.  Getting [:3] seems to be
+  dnl the best way to do this; it's what "site.py" does in the standard
+  dnl library.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
+    [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])
+  AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
+
+  dnl Use the values of $prefix and $exec_prefix for the corresponding
+  dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX.  These are made
+  dnl distinct variables so they can be overridden if need be.  However,
+  dnl general consensus is that you shouldn't need this ability.
+
+  AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
+  AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
+
+  dnl At times (like when building shared libraries) you may want
+  dnl to know which OS platform Python thinks this is.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
+    [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
+  AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
+
+
+  dnl Set up 4 directories:
+
+  dnl pythondir -- where to install python scripts.  This is the
+  dnl   site-packages directory, not the python standard library
+  dnl   directory like in previous automake betas.  This behavior
+  dnl   is more consistent with lispdir.m4 for example.
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON script directory],
+    [am_cv_python_pythondir],
+    [if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     *)
+       case $am_py_prefix in
+         /usr|/System*) ;;
+         *)
+	  am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	  ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pythondir], [$am_cv_python_pythondir])
+
+  dnl pkgpythondir -- $PACKAGE directory under pythondir.  Was
+  dnl   PYTHON_SITE_PACKAGE in previous betas, but this naming is
+  dnl   more consistent with the rest of automake.
+
+  AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
+
+  dnl pyexecdir -- directory for installing python extension modules
+  dnl   (shared libraries)
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
+    [am_cv_python_pyexecdir],
+    [if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     *)
+       case $am_py_exec_prefix in
+         /usr|/System*) ;;
+         *)
+	   am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	   ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
+
+  dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
+
+  AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
+
+  dnl Run any user-specified action.
+  $2
+  fi
+
+])
+
+
+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ---------------------------------------------------------------------------
+# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
+# Run ACTION-IF-FALSE otherwise.
+# This test uses sys.hexversion instead of the string equivalent (first
+# word of sys.version), in order to cope with versions such as 2.2c1.
+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
+AC_DEFUN([AM_PYTHON_CHECK_VERSION],
+ [prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
+sys.exit(sys.hexversion < minverhex)"
+  AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4_if([$1], [v7],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.guess b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.guess
new file mode 100755
index 0000000..d622a44
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.guess
@@ -0,0 +1,1530 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches at gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel at ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    i386)
+		eval $set_cc_for_build
+		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		      grep IS_64BIT_ARCH >/dev/null
+		  then
+		      UNAME_PROCESSOR="x86_64"
+		  fi
+		fi ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+	"4"
+#else
+	""
+#endif
+	); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.h.in b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.h.in
new file mode 100644
index 0000000..843b5b1
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.h.in
@@ -0,0 +1,69 @@
+/* build-aux/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.sub b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.sub
new file mode 100755
index 0000000..c894da4
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/config.sub
@@ -0,0 +1,1773 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| open8 \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i386-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/build-aux/depcomp b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/depcomp
new file mode 100755
index 0000000..bd0ac08
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/depcomp
@@ -0,0 +1,688 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2011-12-04.11; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+   # This is just like msvc7 but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvc7
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+      | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test "$stat" = 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/	\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/	/
+  G
+  p
+}' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/build-aux/install-sh b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/install-sh
new file mode 100755
index 0000000..a9244eb
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/install-sh
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-01-19.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	# Protect names problematic for `test' and other utilities.
+	case $dst_arg in
+	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
+	esac
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for `test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	[-=\(\)!]*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test X"$d" = X && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/build-aux/ltmain.sh b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/ltmain.sh
new file mode 100644
index 0000000..c2852d8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/ltmain.sh
@@ -0,0 +1,9661 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.2 Debian-2.4.2-1ubuntu1"
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+func_append preserve_args " $opt"
+			;;
+      --no-warning|--no-warn)
+			opt_warning=false
+func_append preserve_args " $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+func_append preserve_args " $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Remove ${wl} instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " ${wl}-bind_at_load"
+	      func_append finalize_command " ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    func_append oldobjs " $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		func_resolve_sysroot "$deplib"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/build-aux/missing b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/missing
new file mode 100755
index 0000000..86a8fc3
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/build-aux/missing
@@ -0,0 +1,331 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2012-01-06.13; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/cmake/internal_utils.cmake b/ThirdParty/common/gtest/gtest-1.7.0/cmake/internal_utils.cmake
new file mode 100644
index 0000000..8cb2189
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/cmake/internal_utils.cmake
@@ -0,0 +1,227 @@
+# Defines functions and macros useful for building Google Test and
+# Google Mock.
+#
+# Note:
+#
+# - This file will be run twice when building Google Mock (once via
+#   Google Test's CMakeLists.txt, and once via Google Mock's).
+#   Therefore it shouldn't have any side effects other than defining
+#   the functions and macros.
+#
+# - The functions/macros defined in this file may depend on Google
+#   Test and Google Mock's option() definitions, and thus must be
+#   called *after* the options have been defined.
+
+# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.
+#
+# This must be a macro(), as inside a function string() can only
+# update variables in the function scope.
+macro(fix_default_compiler_settings_)
+  if (MSVC)
+    # For MSVC, CMake sets certain flags to defaults we want to override.
+    # This replacement code is taken from sample in the CMake Wiki at
+    # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
+    foreach (flag_var
+             CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+             CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+      if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
+        # When Google Test is built as a shared library, it should also use
+        # shared runtime libraries.  Otherwise, it may end up with multiple
+        # copies of runtime library data in different modules, resulting in
+        # hard-to-find crashes. When it is built as a static library, it is
+        # preferable to use CRT as static libraries, as we don't have to rely
+        # on CRT DLLs being available. CMake always defaults to using shared
+        # CRT libraries, so we override that default here.
+        string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
+      endif()
+
+      # We prefer more strict warning checking for building Google Test.
+      # Replaces /W3 with /W4 in defaults.
+      string(REPLACE "/W3" "-W4" ${flag_var} "${${flag_var}}")
+    endforeach()
+  endif()
+endmacro()
+
+# Defines the compiler/linker flags used to build Google Test and
+# Google Mock.  You can tweak these definitions to suit your need.  A
+# variable's value is empty before it's explicitly assigned to.
+macro(config_compiler_and_linker)
+  if (NOT gtest_disable_pthreads)
+    # Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
+    find_package(Threads)
+  endif()
+
+  fix_default_compiler_settings_()
+  if (MSVC)
+    # Newlines inside flags variables break CMake's NMake generator.
+    # TODO(vladl at google.com): Add -RTCs and -RTCu to debug builds.
+    set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
+    if (MSVC_VERSION LESS 1400)
+      # Suppress spurious warnings MSVC 7.1 sometimes issues.
+      # Forcing value to bool.
+      set(cxx_base_flags "${cxx_base_flags} -wd4800")
+      # Copy constructor and assignment operator could not be generated.
+      set(cxx_base_flags "${cxx_base_flags} -wd4511 -wd4512")
+      # Compatibility warnings not applicable to Google Test.
+      # Resolved overload was found by argument-dependent lookup.
+      set(cxx_base_flags "${cxx_base_flags} -wd4675")
+    endif()
+    set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
+    set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
+    set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
+    set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0")
+    set(cxx_no_rtti_flags "-GR-")
+  elseif (CMAKE_COMPILER_IS_GNUCXX)
+    set(cxx_base_flags "-Wall -Wshadow")
+    set(cxx_exception_flags "-fexceptions")
+    set(cxx_no_exception_flags "-fno-exceptions")
+    # Until version 4.3.2, GCC doesn't define a macro to indicate
+    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
+    # explicitly.
+    set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0")
+    set(cxx_strict_flags
+      "-Wextra -Wno-unused-parameter -Wno-missing-field-initializers")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
+    set(cxx_exception_flags "-features=except")
+    # Sun Pro doesn't provide macros to indicate whether exceptions and
+    # RTTI are enabled, so we define GTEST_HAS_* explicitly.
+    set(cxx_no_exception_flags "-features=no%except -DGTEST_HAS_EXCEPTIONS=0")
+    set(cxx_no_rtti_flags "-features=no%rtti -DGTEST_HAS_RTTI=0")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "VisualAge" OR
+      CMAKE_CXX_COMPILER_ID STREQUAL "XL")
+    # CMake 2.8 changes Visual Age's compiler ID to "XL".
+    set(cxx_exception_flags "-qeh")
+    set(cxx_no_exception_flags "-qnoeh")
+    # Until version 9.0, Visual Age doesn't define a macro to indicate
+    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
+    # explicitly.
+    set(cxx_no_rtti_flags "-qnortti -DGTEST_HAS_RTTI=0")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "HP")
+    set(cxx_base_flags "-AA -mt")
+    set(cxx_exception_flags "-DGTEST_HAS_EXCEPTIONS=1")
+    set(cxx_no_exception_flags "+noeh -DGTEST_HAS_EXCEPTIONS=0")
+    # RTTI can not be disabled in HP aCC compiler.
+    set(cxx_no_rtti_flags "")
+  endif()
+
+  if (CMAKE_USE_PTHREADS_INIT)  # The pthreads library is available and allowed.
+    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=1")
+  else()
+    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=0")
+  endif()
+
+  # For building gtest's own tests and samples.
+  set(cxx_exception "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}")
+  set(cxx_no_exception
+    "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}")
+  set(cxx_default "${cxx_exception}")
+  set(cxx_no_rtti "${cxx_default} ${cxx_no_rtti_flags}")
+  set(cxx_use_own_tuple "${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1")
+
+  # For building the gtest libraries.
+  set(cxx_strict "${cxx_default} ${cxx_strict_flags}")
+endmacro()
+
+# Defines the gtest & gtest_main libraries.  User tests should link
+# with one of them.
+function(cxx_library_with_type name type cxx_flags)
+  # type can be either STATIC or SHARED to denote a static or shared library.
+  # ARGN refers to additional arguments after 'cxx_flags'.
+  add_library(${name} ${type} ${ARGN})
+  set_target_properties(${name}
+    PROPERTIES
+    COMPILE_FLAGS "${cxx_flags}")
+  if (BUILD_SHARED_LIBS OR type STREQUAL "SHARED")
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_DEFINITIONS "GTEST_CREATE_SHARED_LIBRARY=1")
+  endif()
+  if (CMAKE_USE_PTHREADS_INIT)
+    target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT})
+  endif()
+endfunction()
+
+########################################################################
+#
+# Helper functions for creating build targets.
+
+function(cxx_shared_library name cxx_flags)
+  cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN})
+endfunction()
+
+function(cxx_library name cxx_flags)
+  cxx_library_with_type(${name} "" "${cxx_flags}" ${ARGN})
+endfunction()
+
+# cxx_executable_with_flags(name cxx_flags libs srcs...)
+#
+# creates a named C++ executable that depends on the given libraries and
+# is built from the given source files with the given compiler flags.
+function(cxx_executable_with_flags name cxx_flags libs)
+  add_executable(${name} ${ARGN})
+  if (cxx_flags)
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_FLAGS "${cxx_flags}")
+  endif()
+  if (BUILD_SHARED_LIBS)
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
+  endif()
+  # To support mixing linking in static and dynamic libraries, link each
+  # library in with an extra call to target_link_libraries.
+  foreach (lib "${libs}")
+    target_link_libraries(${name} ${lib})
+  endforeach()
+endfunction()
+
+# cxx_executable(name dir lib srcs...)
+#
+# creates a named target that depends on the given libs and is built
+# from the given source files.  dir/name.cc is implicitly included in
+# the source file list.
+function(cxx_executable name dir libs)
+  cxx_executable_with_flags(
+    ${name} "${cxx_default}" "${libs}" "${dir}/${name}.cc" ${ARGN})
+endfunction()
+
+# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.
+find_package(PythonInterp)
+
+# cxx_test_with_flags(name cxx_flags libs srcs...)
+#
+# creates a named C++ test that depends on the given libs and is built
+# from the given source files with the given compiler flags.
+function(cxx_test_with_flags name cxx_flags libs)
+  cxx_executable_with_flags(${name} "${cxx_flags}" "${libs}" ${ARGN})
+  add_test(${name} ${name})
+endfunction()
+
+# cxx_test(name libs srcs...)
+#
+# creates a named test target that depends on the given libs and is
+# built from the given source files.  Unlike cxx_test_with_flags,
+# test/name.cc is already implicitly included in the source file list.
+function(cxx_test name libs)
+  cxx_test_with_flags("${name}" "${cxx_default}" "${libs}"
+    "test/${name}.cc" ${ARGN})
+endfunction()
+
+# py_test(name)
+#
+# creates a Python test with the given name whose main module is in
+# test/name.py.  It does nothing if Python is not installed.
+function(py_test name)
+  # We are not supporting Python tests on Linux yet as they consider
+  # all Linux environments to be google3 and try to use google3 features.
+  if (PYTHONINTERP_FOUND)
+    # ${CMAKE_BINARY_DIR} is known at configuration time, so we can
+    # directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known
+    # only at ctest runtime (by calling ctest -c <Configuration>), so
+    # we have to escape $ to delay variable substitution here.
+    add_test(${name}
+      ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
+          --build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE})
+  endif()
+endfunction()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest.cbproj b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest.cbproj
new file mode 100644
index 0000000..285bb2a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest.cbproj
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <OutputExt>lib</OutputExt>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <Defines>NO_STRICT</Defines>
+    <DynamicRTL>true</DynamicRTL>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppStaticLibrary</ProjectType>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi; [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
+    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
+    <TLIB_PageSize>32</TLIB_PageSize>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      
+      
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <None Include="..\include\gtest\gtest-death-test.h">
+      <BuildOrder>3</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-message.h">
+      <BuildOrder>4</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-param-test.h">
+      <BuildOrder>5</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-spi.h">
+      <BuildOrder>6</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-test-part.h">
+      <BuildOrder>7</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-typed-test.h">
+      <BuildOrder>8</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest.h">
+      <BuildOrder>0</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest_pred_impl.h">
+      <BuildOrder>1</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest_prod.h">
+      <BuildOrder>2</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-death-test-internal.h">
+      <BuildOrder>9</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-filepath.h">
+      <BuildOrder>10</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-internal.h">
+      <BuildOrder>11</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-linked_ptr.h">
+      <BuildOrder>12</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-param-util-generated.h">
+      <BuildOrder>14</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-param-util.h">
+      <BuildOrder>13</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-port.h">
+      <BuildOrder>15</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-string.h">
+      <BuildOrder>16</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-type-util.h">
+      <BuildOrder>17</BuildOrder>
+    </None>
+    <CppCompile Include="gtest_all.cc">
+      <BuildOrder>18</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest.groupproj b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest.groupproj
new file mode 100644
index 0000000..849f4c4
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest.groupproj
@@ -0,0 +1,54 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>
+  </PropertyGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Projects Include="gtest.cbproj" />
+    <Projects Include="gtest_main.cbproj" />
+    <Projects Include="gtest_unittest.cbproj" />
+  </ItemGroup>
+  <ProjectExtensions>
+    <Borland.Personality>Default.Personality</Borland.Personality>
+    <Borland.ProjectType />
+    <BorlandProject>
+<BorlandProject xmlns=""><Default.Personality></Default.Personality></BorlandProject></BorlandProject>
+  </ProjectExtensions>
+  <Target Name="gtest">
+    <MSBuild Projects="gtest.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest:Clean">
+    <MSBuild Projects="gtest.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest:Make">
+    <MSBuild Projects="gtest.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="gtest_main">
+    <MSBuild Projects="gtest_main.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest_main:Clean">
+    <MSBuild Projects="gtest_main.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest_main:Make">
+    <MSBuild Projects="gtest_main.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="gtest_unittest">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest_unittest:Clean">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest_unittest:Make">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="Build">
+    <CallTarget Targets="gtest;gtest_main;gtest_unittest" />
+  </Target>
+  <Target Name="Clean">
+    <CallTarget Targets="gtest:Clean;gtest_main:Clean;gtest_unittest:Clean" />
+  </Target>
+  <Target Name="Make">
+    <CallTarget Targets="gtest:Make;gtest_main:Make;gtest_unittest:Make" />
+  </Target>
+  <Import Condition="Exists('$(MSBuildBinPath)\Borland.Group.Targets')" Project="$(MSBuildBinPath)\Borland.Group.Targets" />
+</Project>
\ No newline at end of file
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_all.cc b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_all.cc
new file mode 100644
index 0000000..ba7ad68
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_all.cc
@@ -0,0 +1,38 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Josh Kelley (joshkel at gmail.com)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// C++Builder's IDE cannot build a static library from files with hyphens
+// in their name.  See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .
+// This file serves as a workaround.
+
+#include "src/gtest-all.cc"
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_link.cc b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_link.cc
new file mode 100644
index 0000000..b955ebf
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_link.cc
@@ -0,0 +1,40 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Josh Kelley (joshkel at gmail.com)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Links gtest.lib and gtest_main.lib into the current project in C++Builder.
+// This means that these libraries can't be renamed, but it's the only way to
+// ensure that Debug versus Release test builds are linked against the
+// appropriate Debug or Release build of the libraries.
+
+#pragma link "gtest.lib"
+#pragma link "gtest_main.lib"
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_main.cbproj b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_main.cbproj
new file mode 100644
index 0000000..fae32cb
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_main.cbproj
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <OutputExt>lib</OutputExt>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <Defines>NO_STRICT</Defines>
+    <DynamicRTL>true</DynamicRTL>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppStaticLibrary</ProjectType>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi; [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
+    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
+    <TLIB_PageSize>32</TLIB_PageSize>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <CppCompile Include="..\src\gtest_main.cc">
+      <BuildOrder>0</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_unittest.cbproj b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_unittest.cbproj
new file mode 100644
index 0000000..33f7056
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/codegear/gtest_unittest.cbproj
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <OutputExt>exe</OutputExt>
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <Defines>NO_STRICT</Defines>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <DynamicRTL>true</DynamicRTL>
+    <ILINK_ObjectSearchPath>..\test</ILINK_ObjectSearchPath>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppConsoleApplication</ProjectType>
+    <NoVCL>true</NoVCL>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSy [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</IncludePath>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</ILINK_LibraryPath>
+    <Multithreaded>true</Multithreaded>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      
+      
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <CppCompile Include="..\test\gtest_unittest.cc">
+      <BuildOrder>0</BuildOrder>
+    </CppCompile>
+    <CppCompile Include="gtest_link.cc">
+      <BuildOrder>1</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/configure b/ThirdParty/common/gtest/gtest-1.7.0/configure
new file mode 100755
index 0000000..582a9a0
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/configure
@@ -0,0 +1,18222 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for Google C++ Testing Framework 1.7.0.
+#
+# Report bugs to <googletestframework at googlegroups.com>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf at gnu.org and
+$0: googletestframework at googlegroups.com about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='Google C++ Testing Framework'
+PACKAGE_TARNAME='gtest'
+PACKAGE_VERSION='1.7.0'
+PACKAGE_STRING='Google C++ Testing Framework 1.7.0'
+PACKAGE_BUGREPORT='googletestframework at googlegroups.com'
+PACKAGE_URL=''
+
+ac_unique_file="./LICENSE"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+HAVE_PTHREADS_FALSE
+HAVE_PTHREADS_TRUE
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+acx_pthread_config
+HAVE_PYTHON_FALSE
+HAVE_PYTHON_TRUE
+PYTHON
+CXXCPP
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+with_pthreads
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CPP
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures Google C++ Testing Framework 1.7.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/gtest]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of Google C++ Testing Framework 1.7.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+  --with-pthreads         use pthreads (default is yes)
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CPP         C preprocessor
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <googletestframework at googlegroups.com>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+Google C++ Testing Framework configure 1.7.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by Google C++ Testing Framework $as_me 1.7.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Provide various options to initialize the Autoconf and configure processes.
+
+
+
+ac_aux_dir=
+for ac_dir in build-aux "$srcdir"/build-aux; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+ac_config_headers="$ac_config_headers build-aux/config.h"
+
+ac_config_files="$ac_config_files Makefile"
+
+ac_config_files="$ac_config_files scripts/gtest-config"
+
+
+# Initialize Automake with various options. We require at least v1.9, prevent
+# pedantic complaints about package files, and enable various distribution
+# targets.
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gtest'
+ VERSION='1.7.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# Check for programs used in building Google Test.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	link_all_deplibs=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' ${wl}-bernotok'
+	    allow_undefined_flag_CXX=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	ld_shlibs_CXX=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='${wl}-E'
+	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='${wl}-z,text'
+	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+	      '"$old_archive_cmds_CXX"
+	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+	      '"$reload_cmds_CXX"
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_CXX
+	  pic_flag=$lt_prog_compiler_pic_CXX
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+	  allow_undefined_flag_CXX=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_CXX=no
+	  else
+	    lt_cv_archive_cmds_need_lc_CXX=yes
+	  fi
+	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+# TODO(chandlerc at google.com): Currently we aren't running the Python tests
+# against the interpreter detected by AM_PATH_PYTHON, and so we condition
+# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
+# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
+# hashbang.
+PYTHON=  # We *do not* allow the user to specify a python interpreter
+# Extract the first word of "python", so it can be a program name with args.
+set dummy python; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PYTHON" && ac_cv_path_PYTHON=":"
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test "$PYTHON" != ":"; then :
+  prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+  if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+   ($PYTHON -c "$prog") >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }; then :
+  :
+else
+  PYTHON=":"
+fi
+fi
+ if test "$PYTHON" != ":"; then
+  HAVE_PYTHON_TRUE=
+  HAVE_PYTHON_FALSE='#'
+else
+  HAVE_PYTHON_TRUE='#'
+  HAVE_PYTHON_FALSE=
+fi
+
+
+# Configure pthreads.
+
+# Check whether --with-pthreads was given.
+if test "${with_pthreads+set}" = set; then :
+  withval=$with_pthreads; with_pthreads=$withval
+else
+  with_pthreads=check
+fi
+
+
+have_pthreads=no
+if test "x$with_pthreads" != "xno"; then :
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
+$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+                ;;
+
+                -*)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
+$as_echo_n "checking whether pthreads work with $flag... " >&6; }
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+		pthread-config)
+		# Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_acx_pthread_config+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$acx_pthread_config"; then
+  ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_acx_pthread_config="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no"
+fi
+fi
+acx_pthread_config=$ac_cv_prog_acx_pthread_config
+if test -n "$acx_pthread_config"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5
+$as_echo "$acx_pthread_config" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+		if test x"$acx_pthread_config" = xno; then continue; fi
+		PTHREAD_CFLAGS="`pthread-config --cflags`"
+		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+		;;
+
+                *)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
+$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+	attr_name=unknown
+	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+	    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int attr=$attr; return attr;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  attr_name=$attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	done
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
+$as_echo "$attr_name" >&6; }
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $attr_name
+_ACEOF
+
+        fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
+$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
+$as_echo "${flag}" >&6; }
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+        # More AIX lossage: must compile with xlc_r or cc_r
+	if test x"$GCC" != xyes; then
+          for ac_prog in xlc_r cc_r
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PTHREAD_CC"; then
+  ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_PTHREAD_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}"
+
+        else
+          PTHREAD_CC=$CC
+	fi
+
+	# The next part tries to detect GCC inconsistency with -shared on some
+	# architectures and systems. The problem is that in certain
+	# configurations, when -shared is specified, GCC "forgets" to
+	# internally use various flags which are still necessary.
+
+	#
+	# Prepare the flags
+	#
+	save_CFLAGS="$CFLAGS"
+	save_LIBS="$LIBS"
+	save_CC="$CC"
+
+	# Try with the flags determined by the earlier checks.
+	#
+	# -Wl,-z,defs forces link-time symbol resolution, so that the
+	# linking checks with -shared actually have any value
+	#
+	# FIXME: -fPIC is required for -shared on many architectures,
+	# so we specify it here, but the right way would probably be to
+	# properly detect whether it is actually required.
+	CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
+	LIBS="$PTHREAD_LIBS $LIBS"
+	CC="$PTHREAD_CC"
+
+	# In order not to create several levels of indentation, we test
+	# the value of "$done" until we find the cure or run out of ideas.
+	done="no"
+
+	# First, make sure the CFLAGS we added are actually accepted by our
+	# compiler.  If not (and OS X's ld, for instance, does not accept -z),
+	# then we can't do this test.
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to check for GCC pthread/shared inconsistencies" >&5
+$as_echo_n "checking whether to check for GCC pthread/shared inconsistencies... " >&6; }
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes ; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	   fi
+	fi
+
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is sufficient with -shared" >&5
+$as_echo_n "checking whether -pthread is sufficient with -shared... " >&6; }
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+
+	#
+	# Linux gcc on some architectures such as mips/mipsel forgets
+	# about -lpthread
+	#
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lpthread fixes that" >&5
+$as_echo_n "checking whether -lpthread fixes that... " >&6; }
+	   LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	      PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+	#
+	# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
+	#
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc_r fixes that" >&5
+$as_echo_n "checking whether -lc_r fixes that... " >&6; }
+	   LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	        pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	        pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	      PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+	if test x"$done" = xno; then
+	   # OK, we have run out of ideas
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Impossible to determine how to use pthreads with shared libraries" >&5
+$as_echo "$as_me: WARNING: Impossible to determine how to use pthreads with shared libraries" >&2;}
+
+	   # so it's not safe to assume that we may use pthreads
+	   acx_pthread_ok=no
+	fi
+
+	CFLAGS="$save_CFLAGS"
+	LIBS="$save_LIBS"
+	CC="$save_CC"
+else
+        PTHREAD_CC="$CC"
+fi
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+
+$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+
+        :
+else
+        acx_pthread_ok=no
+        if test "x$with_pthreads" != "xcheck"; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "--with-pthreads was specified, but unable to be used
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+       have_pthreads="$acx_pthread_ok"
+fi
+ if test "x$have_pthreads" = "xyes"; then
+  HAVE_PTHREADS_TRUE=
+  HAVE_PTHREADS_FALSE='#'
+else
+  HAVE_PTHREADS_TRUE='#'
+  HAVE_PTHREADS_FALSE=
+fi
+
+
+
+
+# TODO(chandlerc at google.com) Check for the necessary system headers.
+
+# TODO(chandlerc at google.com) Check the types, structures, and other compiler
+# and architecture characteristics.
+
+# Output the generated files. No further autoconf macros may be used.
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PYTHON\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PTHREADS_TRUE}" && test -z "${HAVE_PTHREADS_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by Google C++ Testing Framework $as_me 1.7.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <googletestframework at googlegroups.com>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+Google C++ Testing Framework config.status 1.7.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "build-aux/config.h") CONFIG_HEADERS="$CONFIG_HEADERS build-aux/config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "scripts/gtest-config") CONFIG_FILES="$CONFIG_FILES scripts/gtest-config" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "scripts/gtest-config":F) chmod +x scripts/gtest-config ;;
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/configure.ac b/ThirdParty/common/gtest/gtest-1.7.0/configure.ac
new file mode 100644
index 0000000..cc592e1
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/configure.ac
@@ -0,0 +1,68 @@
+m4_include(m4/acx_pthread.m4)
+
+# At this point, the Xcode project assumes the version string will be three
+# integers separated by periods and surrounded by square brackets (e.g.
+# "[1.0.1]"). It also asumes that there won't be any closing parenthesis
+# between "AC_INIT(" and the closing ")" including comments and strings.
+AC_INIT([Google C++ Testing Framework],
+        [1.7.0],
+        [googletestframework at googlegroups.com],
+        [gtest])
+
+# Provide various options to initialize the Autoconf and configure processes.
+AC_PREREQ([2.59])
+AC_CONFIG_SRCDIR([./LICENSE])
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_HEADERS([build-aux/config.h])
+AC_CONFIG_FILES([Makefile])
+AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])
+
+# Initialize Automake with various options. We require at least v1.9, prevent
+# pedantic complaints about package files, and enable various distribution
+# targets.
+AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])
+
+# Check for programs used in building Google Test.
+AC_PROG_CC
+AC_PROG_CXX
+AC_LANG([C++])
+AC_PROG_LIBTOOL
+
+# TODO(chandlerc at google.com): Currently we aren't running the Python tests
+# against the interpreter detected by AM_PATH_PYTHON, and so we condition
+# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
+# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
+# hashbang.
+PYTHON=  # We *do not* allow the user to specify a python interpreter
+AC_PATH_PROG([PYTHON],[python],[:])
+AS_IF([test "$PYTHON" != ":"],
+      [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])])
+AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"])
+
+# Configure pthreads.
+AC_ARG_WITH([pthreads],
+            [AS_HELP_STRING([--with-pthreads],
+               [use pthreads (default is yes)])],
+            [with_pthreads=$withval],
+            [with_pthreads=check])
+
+have_pthreads=no
+AS_IF([test "x$with_pthreads" != "xno"],
+      [ACX_PTHREAD(
+        [],
+        [AS_IF([test "x$with_pthreads" != "xcheck"],
+               [AC_MSG_FAILURE(
+                 [--with-pthreads was specified, but unable to be used])])])
+       have_pthreads="$acx_pthread_ok"])
+AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" = "xyes"])
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_LIBS)
+
+# TODO(chandlerc at google.com) Check for the necessary system headers.
+
+# TODO(chandlerc at google.com) Check the types, structures, and other compiler
+# and architecture characteristics.
+
+# Output the generated files. No further autoconf macros may be used.
+AC_OUTPUT
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest-all.cc b/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest-all.cc
new file mode 100644
index 0000000..a9a03b2
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest-all.cc
@@ -0,0 +1,9592 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build Google Test by compiling a single file.
+// This file serves this purpose.
+
+// This line ensures that gtest.h can be compiled on its own, even
+// when it's fused.
+#include "gtest/gtest.h"
+
+// The following lines pull in the real gtest *.cc files.
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  // The two possible mocking modes of this object.
+  enum InterceptMode {
+    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
+    INTERCEPT_ALL_THREADS           // Intercepts all failures.
+  };
+
+  // The c'tor sets this object as the test part result reporter used
+  // by Google Test.  The 'result' parameter specifies where to report the
+  // results. This reporter will only catch failures generated in the current
+  // thread. DEPRECATED
+  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+  // Same as above, but you can choose the interception scope of this object.
+  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+                                   TestPartResultArray* result);
+
+  // The d'tor restores the previous test part result reporter.
+  virtual ~ScopedFakeTestPartResultReporter();
+
+  // Appends the TestPartResult object to the TestPartResultArray
+  // received in the constructor.
+  //
+  // This method is from the TestPartResultReporterInterface
+  // interface.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+  void Init();
+
+  const InterceptMode intercept_mode_;
+  TestPartResultReporterInterface* old_reporter_;
+  TestPartResultArray* const result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+  // The constructor remembers the arguments.
+  SingleFailureChecker(const TestPartResultArray* results,
+                       TestPartResult::Type type,
+                       const string& substr);
+  ~SingleFailureChecker();
+ private:
+  const TestPartResultArray* const results_;
+  const TestPartResult::Type type_;
+  const string substr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures.  It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - 'statement' cannot reference local non-static variables or
+//     non-static members of the current object.
+//   - 'statement' cannot return a value.
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ALL_THREADS, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures.  It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma.  The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+//   if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+          &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation.  Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif  // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif  // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
+#include <string.h>  // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+    const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+  const unsigned int raw_seed = (random_seed_flag == 0) ?
+      static_cast<unsigned int>(GetTimeInMillis()) :
+      static_cast<unsigned int>(random_seed_flag);
+
+  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+  // it's easy to type.
+  const int normalized_seed =
+      static_cast<int>((raw_seed - 1U) %
+                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+  return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'.  The behavior is
+// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+      << "Invalid random seed " << seed << " - must be in [1, "
+      << kMaxRandomSeed << "].";
+  const int next_seed = seed + 1;
+  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+  // The c'tor.
+  GTestFlagSaver() {
+    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+    break_on_failure_ = GTEST_FLAG(break_on_failure);
+    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+    color_ = GTEST_FLAG(color);
+    death_test_style_ = GTEST_FLAG(death_test_style);
+    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+    filter_ = GTEST_FLAG(filter);
+    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+    list_tests_ = GTEST_FLAG(list_tests);
+    output_ = GTEST_FLAG(output);
+    print_time_ = GTEST_FLAG(print_time);
+    random_seed_ = GTEST_FLAG(random_seed);
+    repeat_ = GTEST_FLAG(repeat);
+    shuffle_ = GTEST_FLAG(shuffle);
+    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+    stream_result_to_ = GTEST_FLAG(stream_result_to);
+    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+  }
+
+  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
+  ~GTestFlagSaver() {
+    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+    GTEST_FLAG(break_on_failure) = break_on_failure_;
+    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+    GTEST_FLAG(color) = color_;
+    GTEST_FLAG(death_test_style) = death_test_style_;
+    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+    GTEST_FLAG(filter) = filter_;
+    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+    GTEST_FLAG(list_tests) = list_tests_;
+    GTEST_FLAG(output) = output_;
+    GTEST_FLAG(print_time) = print_time_;
+    GTEST_FLAG(random_seed) = random_seed_;
+    GTEST_FLAG(repeat) = repeat_;
+    GTEST_FLAG(shuffle) = shuffle_;
+    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+    GTEST_FLAG(stream_result_to) = stream_result_to_;
+    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+  }
+
+ private:
+  // Fields for saving the original values of flags.
+  bool also_run_disabled_tests_;
+  bool break_on_failure_;
+  bool catch_exceptions_;
+  std::string color_;
+  std::string death_test_style_;
+  bool death_test_use_fork_;
+  std::string filter_;
+  std::string internal_run_death_test_;
+  bool list_tests_;
+  std::string output_;
+  bool print_time_;
+  internal::Int32 random_seed_;
+  internal::Int32 repeat_;
+  bool shuffle_;
+  internal::Int32 stack_trace_depth_;
+  std::string stream_result_to_;
+  bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+                            const char* shard_index_str,
+                            bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+    int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+  // Implemented as an explicit loop since std::count_if() in libCstd on
+  // Solaris has a non-standard signature.
+  int count = 0;
+  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+    if (predicate(*it))
+      ++count;
+  }
+  return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+  std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+                  std::vector<E>* v) {
+  const int size = static_cast<int>(v->size());
+  GTEST_CHECK_(0 <= begin && begin <= size)
+      << "Invalid shuffle range start " << begin << ": must be in range [0, "
+      << size << "].";
+  GTEST_CHECK_(begin <= end && end <= size)
+      << "Invalid shuffle range finish " << end << ": must be in range ["
+      << begin << ", " << size << "].";
+
+  // Fisher-Yates shuffle, from
+  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+  for (int range_width = end - begin; range_width >= 2; range_width--) {
+    const int last_in_range = begin + range_width - 1;
+    const int selected = begin + random->Generate(range_width);
+    std::swap((*v)[selected], (*v)[last_in_range]);
+  }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object.  Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+  delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+  // Constructor.
+  //
+  // TestPropertyKeyIs has NO default constructor.
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+  // Returns true iff the test name of test property matches on key_.
+  bool operator()(const TestProperty& test_property) const {
+    return test_property.key() == key_;
+  }
+
+ private:
+  std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests.  It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag.  E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter.  If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+  // Functions for processing the gtest_output flag.
+
+  // Returns the output format, or "" for normal printed output.
+  static std::string GetOutputFormat();
+
+  // Returns the absolute path of the requested output file, or the
+  // default (test_detail.xml in the original working directory) if
+  // none was explicitly specified.
+  static std::string GetAbsolutePathToOutputFile();
+
+  // Functions for processing the gtest_filter flag.
+
+  // Returns true iff the wildcard pattern matches the string.  The
+  // first ':' or '\0' character in pattern marks the end of it.
+  //
+  // This recursive algorithm isn't very efficient, but is clear and
+  // works well enough for matching test names, which are short.
+  static bool PatternMatchesString(const char *pattern, const char *str);
+
+  // Returns true iff the user-specified filter matches the test case
+  // name and the test name.
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+  // Function for supporting the gtest_catch_exception flag.
+
+  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+  // This function is useful as an __except condition.
+  static int GTestShouldProcessSEH(DWORD exception_code);
+#endif  // GTEST_OS_WINDOWS
+
+  // Returns true if "name" matches the ':' separated list of glob-style
+  // filters in "filter".
+  static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present.  Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetterInterface() {}
+  virtual ~OsStackTraceGetterInterface() {}
+
+  // Returns the current OS stack trace as an std::string.  Parameters:
+  //
+  //   max_depth  - the maximum number of stack frames to be included
+  //                in the trace.
+  //   skip_count - the number of top frames to be skipped; doesn't count
+  //                against max_depth.
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+  // UponLeavingGTest() should be called immediately before Google Test calls
+  // user code. It saves some information about the current stack that
+  // CurrentStackTrace() will use to find and hide Google Test stack frames.
+  virtual void UponLeavingGTest() = 0;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetter() : caller_frame_(NULL) {}
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // This string is inserted in place of stack frames that are part of
+  // Google Test's implementation.
+  static const char* const kElidedFramesMarker;
+
+ private:
+  Mutex mutex_;  // protects all internal state
+
+  // We save the stack frame below the frame that calls user code.
+  // We do this because the address of the frame immediately below
+  // the user code changes between the call to UponLeavingGTest()
+  // and any calls to CurrentStackTrace() from within the user code.
+  void* caller_frame_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+  const char* file;
+  int line;
+  std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+  : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. Reports the test part
+  // result in the current test.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. The implementation just
+  // delegates to the current global test part result reporter of *unit_test_.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class.  We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+  explicit UnitTestImpl(UnitTest* parent);
+  virtual ~UnitTestImpl();
+
+  // There are two different ways to register your own TestPartResultReporter.
+  // You can register your own repoter to listen either only for test results
+  // from the current thread or for results from all threads.
+  // By default, each per-thread test result repoter just passes a new
+  // TestPartResult to the global test result reporter, which registers the
+  // test part result for the currently running test.
+
+  // Returns the global test part result reporter.
+  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+  // Sets the global test part result reporter.
+  void SetGlobalTestPartResultReporter(
+      TestPartResultReporterInterface* reporter);
+
+  // Returns the test part result reporter for the current thread.
+  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+  // Sets the test part result reporter for the current thread.
+  void SetTestPartResultReporterForCurrentThread(
+      TestPartResultReporterInterface* reporter);
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const {
+    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[i];
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i) {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[index];
+  }
+
+  // Provides access to the event listener list.
+  TestEventListeners* listeners() { return &listeners_; }
+
+  // Returns the TestResult for the test that's currently running, or
+  // the TestResult for the ad hoc test if no test is running.
+  TestResult* current_test_result();
+
+  // Returns the TestResult for the ad hoc test.
+  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+  // Sets the OS stack trace getter.
+  //
+  // Does nothing if the input and the current OS stack trace getter
+  // are the same; otherwise, deletes the old getter and makes the
+  // input the current getter.
+  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+  // Returns the current OS stack trace getter if it is not NULL;
+  // otherwise, creates an OsStackTraceGetter, makes it the current
+  // getter, and returns it.
+  OsStackTraceGetterInterface* os_stack_trace_getter();
+
+  // Returns the current OS stack trace as an std::string.
+  //
+  // The maximum number of stack frames to be included is specified by
+  // the gtest_stack_trace_depth flag.  The skip_count parameter
+  // specifies the number of top frames to be skipped, which doesn't
+  // count against the number of frames to be included.
+  //
+  // For example, if Foo() calls Bar(), which in turn calls
+  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+  // Finds and returns a TestCase with the given name.  If one doesn't
+  // exist, creates one and returns it.
+  //
+  // Arguments:
+  //
+  //   test_case_name: name of the test case
+  //   type_param:     the name of the test's type parameter, or NULL if
+  //                   this is not a typed or a type-parameterized test.
+  //   set_up_tc:      pointer to the function that sets up the test case
+  //   tear_down_tc:   pointer to the function that tears down the test case
+  TestCase* GetTestCase(const char* test_case_name,
+                        const char* type_param,
+                        Test::SetUpTestCaseFunc set_up_tc,
+                        Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Adds a TestInfo to the unit test.
+  //
+  // Arguments:
+  //
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  //   test_info:    the TestInfo object
+  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc,
+                   TestInfo* test_info) {
+    // In order to support thread-safe death tests, we need to
+    // remember the original working directory when the test program
+    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
+    // the user may have changed the current directory before calling
+    // RUN_ALL_TESTS().  Therefore we capture the current directory in
+    // AddTestInfo(), which is called to register a TEST or TEST_F
+    // before main() is reached.
+    if (original_working_dir_.IsEmpty()) {
+      original_working_dir_.Set(FilePath::GetCurrentDir());
+      GTEST_CHECK_(!original_working_dir_.IsEmpty())
+          << "Failed to get the current working directory.";
+    }
+
+    GetTestCase(test_info->test_case_name(),
+                test_info->type_param(),
+                set_up_tc,
+                tear_down_tc)->AddTestInfo(test_info);
+  }
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+    return parameterized_test_registry_;
+  }
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Sets the TestCase object for the test that's currently running.
+  void set_current_test_case(TestCase* a_current_test_case) {
+    current_test_case_ = a_current_test_case;
+  }
+
+  // Sets the TestInfo object for the test that's currently running.  If
+  // current_test_info is NULL, the assertion results will be stored in
+  // ad_hoc_test_result_.
+  void set_current_test_info(TestInfo* a_current_test_info) {
+    current_test_info_ = a_current_test_info;
+  }
+
+  // Registers all parameterized tests defined using TEST_P and
+  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+  // combination. This method can be called more then once; it has guards
+  // protecting from registering the tests more then once.  If
+  // value-parameterized tests are disabled, RegisterParameterizedTests is
+  // present but does nothing.
+  void RegisterParameterizedTests();
+
+  // Runs all tests in this UnitTest object, prints the result, and
+  // returns true if all tests are successful.  If any exception is
+  // thrown during a test, this test is considered to be failed, but
+  // the rest of the tests will still be run.
+  bool RunAllTests();
+
+  // Clears the results of all tests, except the ad hoc tests.
+  void ClearNonAdHocTestResult() {
+    ForEach(test_cases_, TestCase::ClearTestCaseResult);
+  }
+
+  // Clears the results of ad-hoc test assertions.
+  void ClearAdHocTestResult() {
+    ad_hoc_test_result_.Clear();
+  }
+
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
+  enum ReactionToSharding {
+    HONOR_SHARDING_PROTOCOL,
+    IGNORE_SHARDING_PROTOCOL
+  };
+
+  // Matches the full name of each test against the user-specified
+  // filter to decide whether the test should run, then records the
+  // result in each TestCase and TestInfo object.
+  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+  // based on sharding variables in the environment.
+  // Returns the number of tests that should run.
+  int FilterTests(ReactionToSharding shard_tests);
+
+  // Prints the names of the tests matching the user-specified filter flag.
+  void ListTestsMatchingFilter();
+
+  const TestCase* current_test_case() const { return current_test_case_; }
+  TestInfo* current_test_info() { return current_test_info_; }
+  const TestInfo* current_test_info() const { return current_test_info_; }
+
+  // Returns the vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*>& environments() { return environments_; }
+
+  // Getters for the per-thread Google Test trace stack.
+  std::vector<TraceInfo>& gtest_trace_stack() {
+    return *(gtest_trace_stack_.pointer());
+  }
+  const std::vector<TraceInfo>& gtest_trace_stack() const {
+    return gtest_trace_stack_.get();
+  }
+
+#if GTEST_HAS_DEATH_TEST
+  void InitDeathTestSubprocessControlInfo() {
+    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+  }
+  // Returns a pointer to the parsed --gtest_internal_run_death_test
+  // flag, or NULL if that flag was not specified.
+  // This information is useful only in a death test child process.
+  // Must not be called before a call to InitGoogleTest.
+  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+    return internal_run_death_test_flag_.get();
+  }
+
+  // Returns a pointer to the current death test factory.
+  internal::DeathTestFactory* death_test_factory() {
+    return death_test_factory_.get();
+  }
+
+  void SuppressTestEventsIfInSubprocess();
+
+  friend class ReplaceDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // Initializes the event listener performing XML output as specified by
+  // UnitTestOptions. Must not be called before InitGoogleTest.
+  void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+  // Initializes the event listener for streaming test results to a socket.
+  // Must not be called before InitGoogleTest.
+  void ConfigureStreamingOutput();
+#endif
+
+  // Performs initialization dependent upon flag values obtained in
+  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+  // this function is also called from RunAllTests.  Since this function can be
+  // called more than once, it has to be idempotent.
+  void PostFlagParsingInit();
+
+  // Gets the random seed used at the start of the current test iteration.
+  int random_seed() const { return random_seed_; }
+
+  // Gets the random number generator.
+  internal::Random* random() { return &random_; }
+
+  // Shuffles all test cases, and the tests within each test case,
+  // making sure that death tests are still run first.
+  void ShuffleTests();
+
+  // Restores the test cases and tests to their order before the first shuffle.
+  void UnshuffleTests();
+
+  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+  // UnitTest::Run() starts.
+  bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+  friend class ::testing::UnitTest;
+
+  // Used by UnitTest::Run() to capture the state of
+  // GTEST_FLAG(catch_exceptions) at the moment it starts.
+  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+  // The UnitTest object that owns this implementation object.
+  UnitTest* const parent_;
+
+  // The working directory when the first TEST() or TEST_F() was
+  // executed.
+  internal::FilePath original_working_dir_;
+
+  // The default test part result reporters.
+  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+  DefaultPerThreadTestPartResultReporter
+      default_per_thread_test_part_result_reporter_;
+
+  // Points to (but doesn't own) the global test part result reporter.
+  TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+  // Protects read and write access to global_test_part_result_reporter_.
+  internal::Mutex global_test_part_result_reporter_mutex_;
+
+  // Points to (but doesn't own) the per-thread test part result reporter.
+  internal::ThreadLocal<TestPartResultReporterInterface*>
+      per_thread_test_part_result_reporter_;
+
+  // The vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*> environments_;
+
+  // The vector of TestCases in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestCase*> test_cases_;
+
+  // Provides a level of indirection for the test case list to allow
+  // easy shuffling and restoring the test case order.  The i-th
+  // element of this vector is the index of the i-th test case in the
+  // shuffled order.
+  std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+  // ParameterizedTestRegistry object used to register value-parameterized
+  // tests.
+  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+  // Indicates whether RegisterParameterizedTests() has been called already.
+  bool parameterized_tests_registered_;
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Index of the last death test case registered.  Initially -1.
+  int last_death_test_case_;
+
+  // This points to the TestCase for the currently running test.  It
+  // changes as Google Test goes through one test case after another.
+  // When no test is running, this is set to NULL and Google Test
+  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestCase* current_test_case_;
+
+  // This points to the TestInfo for the currently running test.  It
+  // changes as Google Test goes through one test after another.  When
+  // no test is running, this is set to NULL and Google Test stores
+  // assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestInfo* current_test_info_;
+
+  // Normally, a user only writes assertions inside a TEST or TEST_F,
+  // or inside a function called by a TEST or TEST_F.  Since Google
+  // Test keeps track of which test is current running, it can
+  // associate such an assertion with the test it belongs to.
+  //
+  // If an assertion is encountered when no TEST or TEST_F is running,
+  // Google Test attributes the assertion result to an imaginary "ad hoc"
+  // test, and records the result in ad_hoc_test_result_.
+  TestResult ad_hoc_test_result_;
+
+  // The list of event listeners that can be used to track events inside
+  // Google Test.
+  TestEventListeners listeners_;
+
+  // The OS stack trace getter.  Will be deleted when the UnitTest
+  // object is destructed.  By default, an OsStackTraceGetter is used,
+  // but the user can set this field to use a custom getter if that is
+  // desired.
+  OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+  // True iff PostFlagParsingInit() has been called.
+  bool post_flag_parse_init_performed_;
+
+  // The random number seed used at the beginning of the test run.
+  int random_seed_;
+
+  // Our random number generator.
+  internal::Random random_;
+
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
+  // How long the test took to run, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+  // The decomposed components of the gtest_internal_run_death_test flag,
+  // parsed when RUN_ALL_TESTS is called.
+  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+  // starts.
+  bool catch_exceptions_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+};  // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+  return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif  // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+  ~AutoHandle() { Reset(); }
+
+  HANDLE Get() const { return handle_; }
+  void Reset() { Reset(INVALID_HANDLE_VALUE); }
+  void Reset(HANDLE handle) {
+    if (handle != handle_) {
+      if (handle_ != INVALID_HANDLE_VALUE)
+        ::CloseHandle(handle_);
+      handle_ = handle;
+    }
+  }
+
+ private:
+  HANDLE handle_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif  // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter.  Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+  // Fail fast if the given string does not begin with a digit;
+  // this bypasses strtoXXX's "optional leading whitespace and plus
+  // or minus sign" semantics, which are undesirable here.
+  if (str.empty() || !IsDigit(str[0])) {
+    return false;
+  }
+  errno = 0;
+
+  char* end;
+  // BiggestConvertible is the largest integer type that system-provided
+  // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  // MSVC and C++ Builder define __int64 instead of the standard long long.
+  typedef unsigned __int64 BiggestConvertible;
+  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+  typedef unsigned long long BiggestConvertible;  // NOLINT
+  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  const bool parse_success = *end == '\0' && errno == 0;
+
+  // TODO(vladl at google.com): Convert this to compile time assertion when it is
+  // available.
+  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+  const Integer result = static_cast<Integer>(parsed);
+  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+    *number = result;
+    return true;
+  }
+  return false;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+  static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
+                             const TestProperty& property) {
+    test_result->RecordProperty(xml_element, property);
+  }
+
+  static void ClearTestPartResults(TestResult* test_result) {
+    test_result->ClearTestPartResults();
+  }
+
+  static const std::vector<testing::TestPartResult>& test_part_results(
+      const TestResult& test_result) {
+    return test_result.test_part_results();
+  }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  printf("\n");
+  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s (%s ms total)\n\n",
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+#  include <crt_externs.h>
+# endif  // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+#  include <windows.h>
+# else
+#  include <sys/mman.h>
+#  include <sys/wait.h>
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+    death_test_style,
+    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+    "Indicates how to run a death test in a forked child process: "
+    "\"threadsafe\" (child process re-executes the test binary "
+    "from the beginning, running only the specific death test) or "
+    "\"fast\" (child process runs the death test immediately "
+    "after forking).");
+
+GTEST_DEFINE_bool_(
+    death_test_use_fork,
+    internal::BoolFromGTestEnv("death_test_use_fork", false),
+    "Instructs to use fork()/_exit() instead of clone() in death tests. "
+    "Ignored and always uses fork() on POSIX systems where clone() is not "
+    "implemented. Useful when running under valgrind or similar tools if "
+    "those do not support clone(). Valgrind 3.3.1 will just fail if "
+    "it sees an unsupported combination of clone() flags. "
+    "It is not recommended to use this flag w/o valgrind though it will "
+    "work in 99% of the cases. Once valgrind is fixed, this flag will "
+    "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+    internal_run_death_test, "",
+    "Indicates the file, line number, temporal index of "
+    "the single death test to run, and a file descriptor to "
+    "which a success code may be sent, all separated by "
+    "the '|' characters.  This flag is specified if and only if the current "
+    "process is a sub-process launched for running a thread-safe "
+    "death test.  FOR INTERNAL USE ONLY.");
+}  // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+  return exit_status == exit_code_;
+
+# else
+
+  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif  // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif  // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+  Message m;
+
+# if GTEST_OS_WINDOWS
+
+  m << "Exited with exit status " << exit_code;
+
+# else
+
+  if (WIFEXITED(exit_code)) {
+    m << "Exited with exit status " << WEXITSTATUS(exit_code);
+  } else if (WIFSIGNALED(exit_code)) {
+    m << "Terminated by signal " << WTERMSIG(exit_code);
+  }
+#  ifdef WCOREDUMP
+  if (WCOREDUMP(exit_code)) {
+    m << " (core dumped)";
+  }
+#  endif
+# endif  // GTEST_OS_WINDOWS
+
+  return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+  return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement.  It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+  Message msg;
+  msg << "Death tests use fork(), which is unsafe particularly"
+      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+  if (thread_count == 0)
+    msg << "couldn't detect the number of threads.";
+  else
+    msg << "detected " << thread_count << " threads.";
+  return msg.GetString();
+}
+# endif  // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude.  DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception.  IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process.  Otherwise, the
+// message is simply printed to stderr.  In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+  // On a POSIX system, this function may be called from a threadsafe-style
+  // death test child process, which operates on a very small stack.  Use
+  // the heap for any additional non-minuscule memory requirements.
+  const InternalRunDeathTestFlag* const flag =
+      GetUnitTestImpl()->internal_run_death_test_flag();
+  if (flag != NULL) {
+    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+    fputc(kDeathTestInternalError, parent);
+    fprintf(parent, "%s", message.c_str());
+    fflush(parent);
+    _exit(1);
+  } else {
+    fprintf(stderr, "%s", message.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+  do { \
+    if (!::testing::internal::IsTrue(expression)) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again.  The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR.  If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+  do { \
+    int gtest_retval; \
+    do { \
+      gtest_retval = (expression); \
+    } while (gtest_retval == -1 && errno == EINTR); \
+    if (gtest_retval == -1) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+  Message error;
+  char buffer[256];
+  int num_read;
+
+  do {
+    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+      buffer[num_read] = '\0';
+      error << buffer;
+    }
+  } while (num_read == -1 && errno == EINTR);
+
+  if (num_read == 0) {
+    GTEST_LOG_(FATAL) << error.GetString();
+  } else {
+    const int last_error = errno;
+    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+                      << GetLastErrnoDescription() << " [" << last_error << "]";
+  }
+}
+
+// Death test constructor.  Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+  TestInfo* const info = GetUnitTestImpl()->current_test_info();
+  if (info == NULL) {
+    DeathTestAbort("Cannot run a death test outside of a TEST or "
+                   "TEST_F construct");
+  }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+                       const char* file, int line, DeathTest** test) {
+  return GetUnitTestImpl()->death_test_factory()->Create(
+      statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+  return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+  last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+  DeathTestImpl(const char* a_statement, const RE* a_regex)
+      : statement_(a_statement),
+        regex_(a_regex),
+        spawned_(false),
+        status_(-1),
+        outcome_(IN_PROGRESS),
+        read_fd_(-1),
+        write_fd_(-1) {}
+
+  // read_fd_ is expected to be closed and cleared by a derived class.
+  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+  void Abort(AbortReason reason);
+  virtual bool Passed(bool status_ok);
+
+  const char* statement() const { return statement_; }
+  const RE* regex() const { return regex_; }
+  bool spawned() const { return spawned_; }
+  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+  int status() const { return status_; }
+  void set_status(int a_status) { status_ = a_status; }
+  DeathTestOutcome outcome() const { return outcome_; }
+  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+  int read_fd() const { return read_fd_; }
+  void set_read_fd(int fd) { read_fd_ = fd; }
+  int write_fd() const { return write_fd_; }
+  void set_write_fd(int fd) { write_fd_ = fd; }
+
+  // Called in the parent process only. Reads the result code of the death
+  // test child process via a pipe, interprets it to set the outcome_
+  // member, and closes read_fd_.  Outputs diagnostics and terminates in
+  // case of unexpected codes.
+  void ReadAndInterpretStatusByte();
+
+ private:
+  // The textual content of the code this object is testing.  This class
+  // doesn't own this string and should not attempt to delete it.
+  const char* const statement_;
+  // The regular expression which test output must match.  DeathTestImpl
+  // doesn't own this object and should not attempt to delete it.
+  const RE* const regex_;
+  // True if the death test child process has been successfully spawned.
+  bool spawned_;
+  // The exit status of the child process.
+  int status_;
+  // How the death test concluded.
+  DeathTestOutcome outcome_;
+  // Descriptor to the read end of the pipe to the child process.  It is
+  // always -1 in the child process.  The child keeps its write end of the
+  // pipe in write_fd_.
+  int read_fd_;
+  // Descriptor to the child's write end of the pipe to the parent process.
+  // It is always -1 in the parent process.  The parent keeps its end of the
+  // pipe in read_fd_.
+  int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_.  Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+  char flag;
+  int bytes_read;
+
+  // The read() here blocks until data is available (signifying the
+  // failure of the death test) or until the pipe is closed (signifying
+  // its success), so it's okay to call this in the parent before
+  // the child process has exited.
+  do {
+    bytes_read = posix::Read(read_fd(), &flag, 1);
+  } while (bytes_read == -1 && errno == EINTR);
+
+  if (bytes_read == 0) {
+    set_outcome(DIED);
+  } else if (bytes_read == 1) {
+    switch (flag) {
+      case kDeathTestReturned:
+        set_outcome(RETURNED);
+        break;
+      case kDeathTestThrew:
+        set_outcome(THREW);
+        break;
+      case kDeathTestLived:
+        set_outcome(LIVED);
+        break;
+      case kDeathTestInternalError:
+        FailFromInternalError(read_fd());  // Does not return.
+        break;
+      default:
+        GTEST_LOG_(FATAL) << "Death test child process reported "
+                          << "unexpected status byte ("
+                          << static_cast<unsigned int>(flag) << ")";
+    }
+  } else {
+    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+                      << GetLastErrnoDescription();
+  }
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+  set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+  // The parent process considers the death test to be a failure if
+  // it finds any data in our pipe.  So, here we write a single flag byte
+  // to the pipe, then exit.
+  const char status_ch =
+      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+  // We are leaking the descriptor here because on some platforms (i.e.,
+  // when built as Windows DLL), destructors of global objects will still
+  // run after calling _exit(). On such systems, write_fd_ will be
+  // indirectly closed from the destructor of UnitTestImpl, causing double
+  // close if it is also closed here. On debug configurations, double close
+  // may assert. As there are no in-process buffers to flush here, we are
+  // relying on the OS to close the descriptor after the process terminates
+  // when the destructors are not run.
+  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+  ::std::string ret;
+  for (size_t at = 0; ; ) {
+    const size_t line_end = output.find('\n', at);
+    ret += "[  DEATH   ] ";
+    if (line_end == ::std::string::npos) {
+      ret += output.substr(at);
+      break;
+    }
+    ret += output.substr(at, line_end + 1 - at);
+    at = line_end + 1;
+  }
+  return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+//   outcome:  An enumeration describing how the death test
+//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
+//             fails in the latter three cases.
+//   status:   The exit status of the child process. On *nix, it is in the
+//             in the format specified by wait(2). On Windows, this is the
+//             value supplied to the ExitProcess() API or a numeric code
+//             of the exception that terminated the program.
+//   regex:    A regular expression object to be applied to
+//             the test's captured standard error output; the death test
+//             fails if it does not match.
+//
+// Argument:
+//   status_ok: true if exit_status is acceptable in the context of
+//              this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met.  Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+  if (!spawned())
+    return false;
+
+  const std::string error_message = GetCapturedStderr();
+
+  bool success = false;
+  Message buffer;
+
+  buffer << "Death test: " << statement() << "\n";
+  switch (outcome()) {
+    case LIVED:
+      buffer << "    Result: failed to die.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case THREW:
+      buffer << "    Result: threw an exception.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case RETURNED:
+      buffer << "    Result: illegal return in test statement.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case DIED:
+      if (status_ok) {
+        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+        if (matched) {
+          success = true;
+        } else {
+          buffer << "    Result: died but not with expected error.\n"
+                 << "  Expected: " << regex()->pattern() << "\n"
+                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+        }
+      } else {
+        buffer << "    Result: died but not with expected exit code:\n"
+               << "            " << ExitSummary(status()) << "\n"
+               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+      }
+      break;
+    case IN_PROGRESS:
+    default:
+      GTEST_LOG_(FATAL)
+          << "DeathTest::Passed somehow called before conclusion of test";
+  }
+
+  DeathTest::set_last_death_test_message(buffer.GetString());
+  return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes:  Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+//    ends of it.
+// 2. The parent starts the child and provides it with the information
+//    necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+//    using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+//    this is done before step 3, the object's reference count goes down to
+//    0 and it is destroyed, preventing the child from acquiring it. The
+//    parent now has to release it, or read operations on the read end of
+//    the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+//    any possible error messages) from the pipe, and its stderr and then
+//    determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+  WindowsDeathTest(const char* a_statement,
+                   const RE* a_regex,
+                   const char* file,
+                   int line)
+      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+  virtual TestRole AssumeRole();
+
+ private:
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+  // Handle to the write end of the pipe to the child process.
+  AutoHandle write_handle_;
+  // Child process handle.
+  AutoHandle child_handle_;
+  // Event the child process uses to signal the parent that it has
+  // acquired the handle to the write end of the pipe. After seeing this
+  // event the parent can release its own handles to make sure its
+  // ReadFile() calls return when the child terminates.
+  AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  // Wait until the child either signals that it has acquired the write end
+  // of the pipe or it dies.
+  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+  switch (::WaitForMultipleObjects(2,
+                                   wait_handles,
+                                   FALSE,  // Waits for any of the handles.
+                                   INFINITE)) {
+    case WAIT_OBJECT_0:
+    case WAIT_OBJECT_0 + 1:
+      break;
+    default:
+      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
+  }
+
+  // The child has acquired the write end of the pipe or exited.
+  // We release the handle on our side and continue.
+  write_handle_.Reset();
+  event_handle_.Reset();
+
+  ReadAndInterpretStatusByte();
+
+  // Waits for the child process to exit if it haven't already. This
+  // returns immediately if the child has already exited, regardless of
+  // whether previous calls to WaitForMultipleObjects synchronized on this
+  // handle or not.
+  GTEST_DEATH_TEST_CHECK_(
+      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+                                             INFINITE));
+  DWORD status_code;
+  GTEST_DEATH_TEST_CHECK_(
+      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+  child_handle_.Reset();
+  set_status(static_cast<int>(status_code));
+  return status();
+}
+
+// The AssumeRole process for a Windows death test.  It creates a child
+// process with the same executable as the current process to run the
+// death test.  The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    // ParseInternalRunDeathTestFlag() has performed all the necessary
+    // processing.
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  // WindowsDeathTest uses an anonymous pipe to communicate results of
+  // a death test.
+  SECURITY_ATTRIBUTES handles_are_inheritable = {
+    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+  HANDLE read_handle, write_handle;
+  GTEST_DEATH_TEST_CHECK_(
+      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+                   0)  // Default buffer size.
+      != FALSE);
+  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+                                O_RDONLY));
+  write_handle_.Reset(write_handle);
+  event_handle_.Reset(::CreateEvent(
+      &handles_are_inheritable,
+      TRUE,    // The event will automatically reset to non-signaled state.
+      FALSE,   // The initial state is non-signalled.
+      NULL));  // The even is unnamed.
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
+      // Windows platforms.
+      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+  char executable_path[_MAX_PATH + 1];  // NOLINT
+  GTEST_DEATH_TEST_CHECK_(
+      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+                                            executable_path,
+                                            _MAX_PATH));
+
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // Flush the log buffers since the log streams are shared with the child.
+  FlushInfoLog();
+
+  // The child process will share the standard handles with the parent.
+  STARTUPINFOA startup_info;
+  memset(&startup_info, 0, sizeof(STARTUPINFO));
+  startup_info.dwFlags = STARTF_USESTDHANDLES;
+  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+  PROCESS_INFORMATION process_info;
+  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+      executable_path,
+      const_cast<char*>(command_line.c_str()),
+      NULL,   // Retuned process handle is not inheritable.
+      NULL,   // Retuned thread handle is not inheritable.
+      TRUE,   // Child inherits all inheritable handles (for write_handle_).
+      0x0,    // Default creation flags.
+      NULL,   // Inherit the parent's environment.
+      UnitTest::GetInstance()->original_working_dir(),
+      &startup_info,
+      &process_info) != FALSE);
+  child_handle_.Reset(process_info.hProcess);
+  ::CloseHandle(process_info.hThread);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+# else  // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface.  Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+  ForkingDeathTest(const char* statement, const RE* regex);
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+
+ protected:
+  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+  // PID of child process during death test; 0 in the child process itself.
+  pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+    : DeathTestImpl(a_statement, a_regex),
+      child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  ReadAndInterpretStatusByte();
+
+  int status_value;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+  set_status(status_value);
+  return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+      ForkingDeathTest(a_statement, a_regex) { }
+  virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test.  It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+  const size_t thread_count = GetThreadCount();
+  if (thread_count != 1) {
+    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+  DeathTest::set_last_death_test_message("");
+  CaptureStderr();
+  // When we fork the process below, the log file buffers are copied, but the
+  // file descriptors are shared.  We flush all log files here so that closing
+  // the file descriptors in the child process doesn't throw off the
+  // synchronization between descriptors and buffers in the parent process.
+  // This is as close to the fork as possible to avoid a race condition in case
+  // there are multiple threads running before the death test, and another
+  // thread writes to the log file.
+  FlushInfoLog();
+
+  const pid_t child_pid = fork();
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  set_child_pid(child_pid);
+  if (child_pid == 0) {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+    set_write_fd(pipe_fd[1]);
+    // Redirects all logging to stderr in the child process to prevent
+    // concurrent writes to the log files.  We capture stderr in the parent
+    // process and append the child process' output to a log.
+    LogToStderr();
+    // Event forwarding to the listeners of event listener API mush be shut
+    // down in death test subprocesses.
+    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
+    return EXECUTE_TEST;
+  } else {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+    set_read_fd(pipe_fd[0]);
+    set_spawned(true);
+    return OVERSEE_TEST;
+  }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+  ExecDeathTest(const char* a_statement, const RE* a_regex,
+                const char* file, int line) :
+      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+  virtual TestRole AssumeRole();
+ private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+  Arguments() {
+    args_.push_back(NULL);
+  }
+
+  ~Arguments() {
+    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+         ++i) {
+      free(*i);
+    }
+  }
+  void AddArgument(const char* argument) {
+    args_.insert(args_.end() - 1, posix::StrDup(argument));
+  }
+
+  template <typename Str>
+  void AddArguments(const ::std::vector<Str>& arguments) {
+    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+         i != arguments.end();
+         ++i) {
+      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+    }
+  }
+  char* const* Argv() {
+    return &args_[0];
+  }
+
+ private:
+  std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+  char* const* argv;  // Command-line arguments for the child's call to exec
+  int close_fd;       // File descriptor to close; the read end of a pipe
+};
+
+#  if GTEST_OS_MAC
+inline char** GetEnviron() {
+  // When Google Test is built as a framework on MacOS X, the environ variable
+  // is unavailable. Apple's documentation (man environ) recommends using
+  // _NSGetEnviron() instead.
+  return *_NSGetEnviron();
+}
+#  else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+#  endif  // GTEST_OS_MAC
+
+#  if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  // We can safely call execve() as it's a direct system call.  We
+  // cannot use execvp() as it's a libc function and thus potentially
+  // unsafe.  Since execve() doesn't search the PATH, the user must
+  // invoke the test program via a valid path that contains at least
+  // one path separator.
+  execve(args->argv[0], args->argv, GetEnviron());
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
+  return EXIT_FAILURE;
+}
+#  endif  // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+  int dummy;
+  *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+  int dummy;
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+  ExecDeathTestArgs args = { argv, close_fd };
+  pid_t child_pid = -1;
+
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
+  const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+  if (!use_fork) {
+    static const bool stack_grows_down = StackGrowsDown();
+    const size_t stack_size = getpagesize();
+    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+                             MAP_ANON | MAP_PRIVATE, -1, 0);
+    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
+    void* const stack_top =
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+  }
+#   else
+  const bool use_fork = true;
+#   endif  // GTEST_HAS_CLONE
+
+  if (use_fork && (child_pid = fork()) == 0) {
+      ExecDeathTestChildMain(&args);
+      _exit(0);
+  }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
+
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test.  It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+  // Clear the close-on-exec flag on the write end of the pipe, lest
+  // it be closed when the child process does an exec:
+  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
+  Arguments args;
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
+  args.AddArgument(filter_flag.c_str());
+  args.AddArgument(internal_flag.c_str());
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // See the comment in NoExecDeathTest::AssumeRole for why the next line
+  // is necessary.
+  FlushInfoLog();
+
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+  set_child_pid(child_pid);
+  set_read_fd(pipe_fd[0]);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+
+# endif  // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address.  If the test should be
+// skipped, sets that pointer to NULL.  Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+                                     const char* file, int line,
+                                     DeathTest** test) {
+  UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const int death_test_index = impl->current_test_info()
+      ->increment_death_test_count();
+
+  if (flag != NULL) {
+    if (death_test_index > flag->index()) {
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
+      return false;
+    }
+
+    if (!(flag->file() == file && flag->line() == line &&
+          flag->index() == death_test_index)) {
+      *test = NULL;
+      return true;
+    }
+  }
+
+# if GTEST_OS_WINDOWS
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+      GTEST_FLAG(death_test_style) == "fast") {
+    *test = new WindowsDeathTest(statement, regex, file, line);
+  }
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe") {
+    *test = new ExecDeathTest(statement, regex, file, line);
+  } else if (GTEST_FLAG(death_test_style) == "fast") {
+    *test = new NoExecDeathTest(statement, regex);
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
+    return false;
+  }
+
+  return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+                        ::std::vector< ::std::string>* dest) {
+  ::std::vector< ::std::string> parsed;
+  ::std::string::size_type pos = 0;
+  while (::testing::internal::AlwaysTrue()) {
+    const ::std::string::size_type colon = str.find(delimiter, pos);
+    if (colon == ::std::string::npos) {
+      parsed.push_back(str.substr(pos));
+      break;
+    } else {
+      parsed.push_back(str.substr(pos, colon - pos));
+      pos = colon + 1;
+    }
+  }
+  dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+                            size_t write_handle_as_size_t,
+                            size_t event_handle_as_size_t) {
+  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+                                                   FALSE,  // Non-inheritable.
+                                                   parent_process_id));
+  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  // TODO(vladl at google.com): Replace the following check with a
+  // compile-time assertion when available.
+  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+  const HANDLE write_handle =
+      reinterpret_cast<HANDLE>(write_handle_as_size_t);
+  HANDLE dup_write_handle;
+
+  // The newly initialized handle is accessible only in in the parent
+  // process. To obtain one accessible within the child, we need to use
+  // DuplicateHandle.
+  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+                         ::GetCurrentProcess(), &dup_write_handle,
+                         0x0,    // Requested privileges ignored since
+                                 // DUPLICATE_SAME_ACCESS is used.
+                         FALSE,  // Request non-inheritable handler.
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+  HANDLE dup_event_handle;
+
+  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+                         ::GetCurrentProcess(), &dup_event_handle,
+                         0x0,
+                         FALSE,
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const int write_fd =
+      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+  if (write_fd == -1) {
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
+  }
+
+  // Signals the parent that the write end of the pipe has been acquired
+  // so the parent can release its own write end.
+  ::SetEvent(dup_event_handle);
+
+  return write_fd;
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+  // can use it here.
+  int line = -1;
+  int index = -1;
+  ::std::vector< ::std::string> fields;
+  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+  int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+  unsigned int parent_process_id = 0;
+  size_t write_handle_as_size_t = 0;
+  size_t event_handle_as_size_t = 0;
+
+  if (fields.size() != 6
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &parent_process_id)
+      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
+  }
+  write_fd = GetStatusFileDescriptor(parent_process_id,
+                                     write_handle_as_size_t,
+                                     event_handle_as_size_t);
+# else
+
+  if (fields.size() != 4
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &write_fd)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+}  // namespace internal
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits>  // Some Linux distributions define PATH_MAX here.
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif  // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif  // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+  return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE doesn't have a current directory, so we just return
+  // something reasonable.
+  return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
+  }
+  return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+  const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+  // Comparing two pointers of which only one is NULL is undefined.
+  if (last_alt_sep != NULL &&
+      (last_sep == NULL || last_alt_sep > last_sep)) {
+    return last_alt_sep;
+  }
+#endif
+  return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  std::string dir;
+  if (last_sep) {
+    dir = std::string(c_str(), last_sep + 1 - c_str());
+  } else {
+    dir = kCurrentDirectoryString;
+  }
+  return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+                                const FilePath& base_name,
+                                int number,
+                                const char* extension) {
+  std::string file;
+  if (number == 0) {
+    file = base_name.string() + "." + extension;
+  } else {
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
+  }
+  return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+                               const FilePath& relative_path) {
+  if (directory.IsEmpty())
+    return relative_path;
+  const FilePath dir(directory.RemoveTrailingPathSeparator());
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  return attributes != kInvalidFileAttributes;
+#else
+  posix::StatStruct file_stat;
+  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+  bool result = false;
+#if GTEST_OS_WINDOWS
+  // Don't strip off trailing separator if path is a root directory on
+  // Windows (like "C:\\").
+  const FilePath& path(IsRootDirectory() ? *this :
+                                           RemoveTrailingPathSeparator());
+#else
+  const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  if ((attributes != kInvalidFileAttributes) &&
+      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    result = true;
+  }
+#else
+  posix::StatStruct file_stat;
+  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+      posix::IsDir(file_stat);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+  // TODO(wan at google.com): on Windows a network share like
+  // \\server\share can be a root directory, although it cannot be the
+  // current directory.  Handle this properly.
+  return pathname_.length() == 3 && IsAbsolutePath();
+#else
+  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+  const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+  return pathname_.length() >= 3 &&
+     ((name[0] >= 'a' && name[0] <= 'z') ||
+      (name[0] >= 'A' && name[0] <= 'Z')) &&
+     name[1] == ':' &&
+     IsPathSeparator(name[2]);
+#else
+  return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+                                          const FilePath& base_name,
+                                          const char* extension) {
+  FilePath full_pathname;
+  int number = 0;
+  do {
+    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+  } while (full_pathname.FileOrDirectoryExists());
+  return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+  return !pathname_.empty() &&
+         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+  if (!this->IsDirectory()) {
+    return false;
+  }
+
+  if (pathname_.length() == 0 || this->DirectoryExists()) {
+    return true;
+  }
+
+  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  FilePath removed_sep(this->RemoveTrailingPathSeparator());
+  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+  delete [] unicode;
+#elif GTEST_OS_WINDOWS
+  int result = _mkdir(pathname_.c_str());
+#else
+  int result = mkdir(pathname_.c_str(), 0777);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  if (result == -1) {
+    return this->DirectoryExists();  // An error is OK if the directory exists.
+  }
+  return true;  // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+  return IsDirectory()
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+      : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+  if (pathname_.c_str() == NULL) {
+    pathname_ = "";
+    return;
+  }
+  const char* src = pathname_.c_str();
+  char* const dest = new char[pathname_.length() + 1];
+  char* dest_ptr = dest;
+  memset(dest_ptr, 0, pathname_.length() + 1);
+
+  while (*src != '\0') {
+    *dest_ptr = *src;
+    if (!IsPathSeparator(*src)) {
+      src++;
+    } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+      if (*dest_ptr == kAlternatePathSeparator) {
+        *dest_ptr = kPathSeparator;
+      }
+#endif
+      while (IsPathSeparator(*src))
+        src++;
+    }
+    dest_ptr++;
+  }
+  *dest_ptr = '\0';
+  pathname_ = dest;
+  delete[] dest;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif  // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif  // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const task_t task = mach_task_self();
+  mach_msg_type_number_t thread_count;
+  thread_act_array_t thread_list;
+  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+  if (status == KERN_SUCCESS) {
+    // task_threads allocates resources in thread_list and we need to free them
+    // to avoid leaks.
+    vm_deallocate(task,
+                  reinterpret_cast<vm_address_t>(thread_list),
+                  sizeof(thread_t) * thread_count);
+    return static_cast<size_t>(thread_count);
+  } else {
+    return 0;
+  }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
+#else
+
+size_t GetThreadCount() {
+  // There's no portable way to detect the number of threads, so we just
+  // return 0 to indicate that we cannot detect it.
+  return 0;
+}
+
+#endif  // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE.  Currently only needed for death tests.
+
+RE::~RE() {
+  if (is_valid_) {
+    // regfree'ing an invalid regex might crash because the content
+    // of the regex is undefined. Since the regex's are essentially
+    // the same, one cannot be valid (or invalid) without the other
+    // being so too.
+    regfree(&partial_regex_);
+    regfree(&full_regex_);
+  }
+  free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = posix::StrDup(regex);
+
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match.
+  const size_t full_regex_len = strlen(regex) + 10;
+  char* const full_pattern = new char[full_regex_len];
+
+  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+  // We want to call regcomp(&partial_regex_, ...) even if the
+  // previous expression returns false.  Otherwise partial_regex_ may
+  // not be properly initialized can may cause trouble when it's
+  // freed.
+  //
+  // Some implementation of POSIX regex (e.g. on at least some
+  // versions of Cygwin) doesn't accept the empty string as a valid
+  // regex.  We change it to an equivalent form "()" to be safe.
+  if (is_valid_) {
+    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+  }
+  EXPECT_TRUE(is_valid_)
+      << "Regular expression \"" << regex
+      << "\" is not a valid POSIX Extended regular expression.";
+
+  delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+  return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification.  Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+      ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch.  The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+  if (escaped) {  // "\\p" where p is pattern_char.
+    switch (pattern_char) {
+      case 'd': return IsAsciiDigit(ch);
+      case 'D': return !IsAsciiDigit(ch);
+      case 'f': return ch == '\f';
+      case 'n': return ch == '\n';
+      case 'r': return ch == '\r';
+      case 's': return IsAsciiWhiteSpace(ch);
+      case 'S': return !IsAsciiWhiteSpace(ch);
+      case 't': return ch == '\t';
+      case 'v': return ch == '\v';
+      case 'w': return IsAsciiWordChar(ch);
+      case 'W': return !IsAsciiWordChar(ch);
+    }
+    return IsAsciiPunct(pattern_char) && pattern_char == ch;
+  }
+
+  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+  return (Message() << "Syntax error at index " << index
+          << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+  if (regex == NULL) {
+    // TODO(wan at google.com): fix the source file location in the
+    // assertion failures to match where the regex is used in user
+    // code.
+    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+    return false;
+  }
+
+  bool is_valid = true;
+
+  // True iff ?, *, or + can follow the previous atom.
+  bool prev_repeatable = false;
+  for (int i = 0; regex[i]; i++) {
+    if (regex[i] == '\\') {  // An escape sequence
+      i++;
+      if (regex[i] == '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "'\\' cannot appear at the end.";
+        return false;
+      }
+
+      if (!IsValidEscape(regex[i])) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "invalid escape sequence \"\\" << regex[i] << "\".";
+        is_valid = false;
+      }
+      prev_repeatable = true;
+    } else {  // Not an escape sequence.
+      const char ch = regex[i];
+
+      if (ch == '^' && i > 0) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'^' can only appear at the beginning.";
+        is_valid = false;
+      } else if (ch == '$' && regex[i + 1] != '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'$' can only appear at the end.";
+        is_valid = false;
+      } else if (IsInSet(ch, "()[]{}|")) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' is unsupported.";
+        is_valid = false;
+      } else if (IsRepeat(ch) && !prev_repeatable) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' can only follow a repeatable token.";
+        is_valid = false;
+      }
+
+      prev_repeatable = !IsInSet(ch, "^$?*+");
+    }
+  }
+
+  return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression.  The regex atom is defined as c if escaped is false,
+// or \c otherwise.  repeat is the repetition meta character (?, *,
+// or +).  The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway.  We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char c, char repeat, const char* regex,
+    const char* str) {
+  const size_t min_count = (repeat == '+') ? 1 : 0;
+  const size_t max_count = (repeat == '?') ? 1 :
+      static_cast<size_t>(-1) - 1;
+  // We cannot call numeric_limits::max() as it conflicts with the
+  // max() macro on Windows.
+
+  for (size_t i = 0; i <= max_count; ++i) {
+    // We know that the atom matches each of the first i characters in str.
+    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+      // We have enough matches at the head, and the tail matches too.
+      // Since we only care about *whether* the pattern matches str
+      // (as opposed to *how* it matches), there is no need to find a
+      // greedy match.
+      return true;
+    }
+    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+      return false;
+  }
+  return false;
+}
+
+// Returns true iff regex matches a prefix of str.  regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+  if (*regex == '\0')  // An empty regex matches a prefix of anything.
+    return true;
+
+  // "$" only matches the end of a string.  Note that regex being
+  // valid guarantees that there's nothing after "$" in it.
+  if (*regex == '$')
+    return *str == '\0';
+
+  // Is the first thing in regex an escape sequence?
+  const bool escaped = *regex == '\\';
+  if (escaped)
+    ++regex;
+  if (IsRepeat(regex[1])) {
+    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+    // here's an indirect recursion.  It terminates as the regex gets
+    // shorter in each recursion.
+    return MatchRepetitionAndRegexAtHead(
+        escaped, regex[0], regex[1], regex + 2, str);
+  } else {
+    // regex isn't empty, isn't "$", and doesn't start with a
+    // repetition.  We match the first atom of regex with the first
+    // character of str and recurse.
+    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+        MatchRegexAtHead(regex + 1, str + 1);
+  }
+}
+
+// Returns true iff regex matches any substring of str.  regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally.  In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+  if (regex == NULL || str == NULL)
+    return false;
+
+  if (*regex == '^')
+    return MatchRegexAtHead(regex + 1, str);
+
+  // A successful match can be anywhere in str.
+  do {
+    if (MatchRegexAtHead(regex, str))
+      return true;
+  } while (*str++ != '\0');
+  return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+  free(const_cast<char*>(pattern_));
+  free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = full_pattern_ = NULL;
+  if (regex != NULL) {
+    pattern_ = posix::StrDup(regex);
+  }
+
+  is_valid_ = ValidateRegex(regex);
+  if (!is_valid_) {
+    // No need to calculate the full pattern when the regex is invalid.
+    return;
+  }
+
+  const size_t len = strlen(regex);
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match: we need space to prepend a '^', append a '$', and
+  // terminate the string with '\0'.
+  char* buffer = static_cast<char*>(malloc(len + 3));
+  full_pattern_ = buffer;
+
+  if (*regex != '^')
+    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
+
+  // We don't use snprintf or strncpy, as they trigger a warning when
+  // compiled with VC++ 8.0.
+  memcpy(buffer, regex, len);
+  buffer += len;
+
+  if (len == 0 || regex[len - 1] != '$')
+    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
+
+  *buffer = '\0';
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0) {
+    return file_name + ":";
+  }
+#ifdef _MSC_VER
+  return file_name + "(" + StreamableToString(line) + "):";
+#else
+  return file_name + ":" + StreamableToString(line) + ":";
+#endif  // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+    const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0)
+    return file_name;
+  else
+    return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+    : severity_(severity) {
+  const char* const marker =
+      severity == GTEST_INFO ?    "[  INFO ]" :
+      severity == GTEST_WARNING ? "[WARNING]" :
+      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
+  GetStream() << ::std::endl << marker << " "
+              << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+  GetStream() << ::std::endl;
+  if (severity_ == GTEST_FATAL) {
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif  // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+  // The ctor redirects the stream to a temporary file.
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+
+    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+    const UINT success = ::GetTempFileNameA(temp_dir_path,
+                                            "gtest_redir",
+                                            0,  // Generate unique file name.
+                                            temp_file_path);
+    GTEST_CHECK_(success != 0)
+        << "Unable to create a temporary file in " << temp_dir_path;
+    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+                                    << temp_file_path;
+    filename_ = temp_file_path;
+# else
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
+    char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
+    const int captured_fd = mkstemp(name_template);
+    filename_ = name_template;
+# endif  // GTEST_OS_WINDOWS
+    fflush(NULL);
+    dup2(captured_fd, fd_);
+    close(captured_fd);
+  }
+
+  ~CapturedStream() {
+    remove(filename_.c_str());
+  }
+
+  std::string GetCapturedString() {
+    if (uncaptured_fd_ != -1) {
+      // Restores the original stream.
+      fflush(NULL);
+      dup2(uncaptured_fd_, fd_);
+      close(uncaptured_fd_);
+      uncaptured_fd_ = -1;
+    }
+
+    FILE* const file = posix::FOpen(filename_.c_str(), "r");
+    const std::string content = ReadEntireFile(file);
+    posix::FClose(file);
+    return content;
+  }
+
+ private:
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
+
+  // Returns the size (in bytes) of a file.
+  static size_t GetFileSize(FILE* file);
+
+  const int fd_;  // A stream to capture.
+  int uncaptured_fd_;
+  // Name of the temporary file holding the stderr output.
+  ::std::string filename_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+  fseek(file, 0, SEEK_END);
+  return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+  const size_t file_size = GetFileSize(file);
+  char* const buffer = new char[file_size];
+
+  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
+  size_t bytes_read = 0;       // # of bytes read so far
+
+  fseek(file, 0, SEEK_SET);
+
+  // Keeps reading the file until we cannot read further or the
+  // pre-determined file size is reached.
+  do {
+    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+    bytes_read += bytes_last_read;
+  } while (bytes_last_read > 0 && bytes_read < file_size);
+
+  const std::string content(buffer, bytes_read);
+  delete[] buffer;
+
+  return content;
+}
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+  if (*stream != NULL) {
+    GTEST_LOG_(FATAL) << "Only one " << stream_name
+                      << " capturer can exist at a time.";
+  }
+  *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
+
+  delete *captured_stream;
+  *captured_stream = NULL;
+
+  return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+  DebugBreak();
+  TerminateProcess(GetCurrentProcess(), 1);
+}
+}  // namespace posix
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag.  For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
+      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+  Message env_var;
+  for (size_t i = 0; i != full_flag.length(); i++) {
+    env_var << ToUpper(full_flag.c_str()[i]);
+  }
+
+  return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+  // Parses the environment variable as a decimal integer.
+  char* end = NULL;
+  const long long_value = strtol(str, &end, 10);  // NOLINT
+
+  // Has strtol() consumed all characters in the string?
+  if (*end != '\0') {
+    // No - an invalid character was encountered.
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value \"" << str << "\".\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  // Is the parsed value in the range of an Int32?
+  const Int32 result = static_cast<Int32>(long_value);
+  if (long_value == LONG_MAX || long_value == LONG_MIN ||
+      // The parsed value overflows as a long.  (strtol() returns
+      // LONG_MAX or LONG_MIN when the input overflows.)
+      result != long_value
+      // The parsed value overflows as an Int32.
+      ) {
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value " << str << ", which overflows.\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  *value = result;
+  return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  return string_value == NULL ?
+      default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  if (string_value == NULL) {
+    // The environment variable is not set.
+    return default_value;
+  }
+
+  Int32 result = default_value;
+  if (!ParseInt32(Message() << "Environment variable " << env_var,
+                  string_value, &result)) {
+    printf("The default value %s is used.\n",
+           (Message() << default_value).GetString().c_str());
+    fflush(stdout);
+    return default_value;
+  }
+
+  return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const value = posix::GetEnv(env_var.c_str());
+  return value == NULL ? default_value : value;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise.  A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream>  // NOLINT
+#include <string>
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+                                size_t count, ostream* os) {
+  char text[5] = "";
+  for (size_t i = 0; i != count; i++) {
+    const size_t j = start + i;
+    if (i != 0) {
+      // Organizes the bytes into groups of 2 for easy parsing by
+      // human.
+      if ((j % 2) == 0)
+        *os << ' ';
+      else
+        *os << '-';
+    }
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+    *os << text;
+  }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+                              ostream* os) {
+  // Tells the user how big the object is.
+  *os << count << "-byte object <";
+
+  const size_t kThreshold = 132;
+  const size_t kChunkSize = 64;
+  // If the object size is bigger than kThreshold, we'll have to omit
+  // some details by printing only the first and the last kChunkSize
+  // bytes.
+  // TODO(wan): let the user control the threshold using a flag.
+  if (count < kThreshold) {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+  } else {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+    *os << " ... ";
+    // Rounds up to 2-byte boundary.
+    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+  }
+  *os << ">";
+}
+
+}  // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object.  The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+                          ostream* os) {
+  PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+}  // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
+//   - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+  kAsIs,
+  kHexEscape,
+  kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character.  We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+  return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+  switch (static_cast<wchar_t>(c)) {
+    case L'\0':
+      *os << "\\0";
+      break;
+    case L'\'':
+      *os << "\\'";
+      break;
+    case L'\\':
+      *os << "\\\\";
+      break;
+    case L'\a':
+      *os << "\\a";
+      break;
+    case L'\b':
+      *os << "\\b";
+      break;
+    case L'\f':
+      *os << "\\f";
+      break;
+    case L'\n':
+      *os << "\\n";
+      break;
+    case L'\r':
+      *os << "\\r";
+      break;
+    case L'\t':
+      *os << "\\t";
+      break;
+    case L'\v':
+      *os << "\\v";
+      break;
+    default:
+      if (IsPrintableAscii(c)) {
+        *os << static_cast<char>(c);
+        return kAsIs;
+      } else {
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+        return kHexEscape;
+      }
+  }
+  return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+  switch (c) {
+    case L'\'':
+      *os << "'";
+      return kAsIs;
+    case L'"':
+      *os << "\\\"";
+      return kSpecialEscape;
+    default:
+      return PrintAsCharLiteralTo<wchar_t>(c, os);
+  }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code.  '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence.  The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+  // First, print c as a literal in the most readable form we can find.
+  *os << ((sizeof(c) > 1) ? "L'" : "'");
+  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+  *os << "'";
+
+  // To aid user debugging, we also print c's code in decimal, unless
+  // it's 0 (in which case c was printed as '\\0', making the code
+  // obvious).
+  if (c == 0)
+    return;
+  *os << " (" << static_cast<int>(c);
+
+  // For more convenience, we print c's code again in hexidecimal,
+  // unless c was already printed in the form '\x##' or the code is in
+  // [1, 9].
+  if (format == kHexEscape || (1 <= c && c <= 9)) {
+    // Do nothing.
+  } else {
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+  }
+  *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+  PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
+  bool is_previous_hex = false;
+  for (size_t index = 0; index < len; ++index) {
+    const CharType cur = begin[index];
+    if (is_previous_hex && IsXDigit(cur)) {
+      // Previous character is of '\x..' form and this character can be
+      // interpreted as another hexadecimal digit in its number. Break string to
+      // disambiguate.
+      *os << "\" " << kQuoteBegin;
+    }
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+  }
+  *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, strlen(s), os);
+  }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, wcslen(s), os);
+  }
+}
+#endif  // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+  return os
+      << result.file_name() << ":" << result.line_number() << ": "
+      << (result.type() == TestPartResult::kSuccess ? "Success" :
+          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+          "Non-fatal failure") << ":\n"
+      << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+  array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+  if (index < 0 || index >= size()) {
+    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+    internal::posix::Abort();
+  }
+
+  return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+  return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+    : has_new_fatal_failure_(false),
+      original_reporter_(GetUnitTestImpl()->
+                         GetTestPartResultReporterForCurrentThread()) {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+      original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+    const TestPartResult& result) {
+  if (result.fatally_failed())
+    has_new_fatal_failure_ = true;
+  original_reporter_->ReportTestPartResult(result);
+}
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+  while (IsSpace(*str))
+    str++;
+  return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+    const char* file, int line, const char* registered_tests) {
+  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+  registered_ = true;
+
+  // Skip initial whitespace in registered_tests since some
+  // preprocessors prefix stringizied literals with whitespace.
+  registered_tests = SkipSpaces(registered_tests);
+
+  Message errors;
+  ::std::set<std::string> tests;
+  for (const char* names = registered_tests; names != NULL;
+       names = SkipComma(names)) {
+    const std::string name = GetPrefixUntilComma(names);
+    if (tests.count(name) != 0) {
+      errors << "Test " << name << " is listed more than once.\n";
+      continue;
+    }
+
+    bool found = false;
+    for (DefinedTestIter it = defined_test_names_.begin();
+         it != defined_test_names_.end();
+         ++it) {
+      if (name == *it) {
+        found = true;
+        break;
+      }
+    }
+
+    if (found) {
+      tests.insert(name);
+    } else {
+      errors << "No test named " << name
+             << " can be found in this test case.\n";
+    }
+  }
+
+  for (DefinedTestIter it = defined_test_names_.begin();
+       it != defined_test_names_.end();
+       ++it) {
+    if (tests.count(*it) == 0) {
+      errors << "You forgot to list test " << *it << ".\n";
+    }
+  }
+
+  const std::string& errors_str = errors.GetString();
+  if (errors_str != "") {
+    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+            errors_str.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+
+  return registered_tests;
+}
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest.h b/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest.h
new file mode 100644
index 0000000..4f3804f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest.h
@@ -0,0 +1,20061 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test.  It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms.  They are subject to change without notice.  DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior.  If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
+//                              is/isn't available.
+//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
+//                              are enabled.
+//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::string, which is different to std::string).
+//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::wstring, which is different to std::wstring).
+//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
+//                              expressions are/aren't available.
+//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
+//                              is/isn't available.
+//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
+//                              enabled.
+//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
+//                              std::wstring does/doesn't work (Google Test can
+//                              be used where std::wstring is unavailable).
+//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
+//                              is/isn't available.
+//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
+//                              compiler supports Microsoft's "Structured
+//                              Exception Handling".
+//   GTEST_HAS_STREAM_REDIRECTION
+//                            - Define it to 1/0 to indicate whether the
+//                              platform supports I/O stream redirection using
+//                              dup() and dup2().
+//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
+//                              Test's own tr1 tuple implementation should be
+//                              used.  Unused when the user sets
+//                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
+//   GTEST_LINKED_AS_SHARED_LIBRARY
+//                            - Define to 1 when compiling tests that use
+//                              Google Test as a shared library (known as
+//                              DLL on Windows).
+//   GTEST_CREATE_SHARED_LIBRARY
+//                            - Define to 1 when compiling Google Test itself
+//                              as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+//   GTEST_OS_AIX      - IBM AIX
+//   GTEST_OS_CYGWIN   - Cygwin
+//   GTEST_OS_HPUX     - HP-UX
+//   GTEST_OS_LINUX    - Linux
+//     GTEST_OS_LINUX_ANDROID - Google Android
+//   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
+//   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
+//   GTEST_OS_SOLARIS  - Sun Solaris
+//   GTEST_OS_SYMBIAN  - Symbian
+//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
+//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
+//     GTEST_OS_WINDOWS_MINGW    - MinGW
+//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
+//   GTEST_OS_ZOS      - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support.  Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable.  If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
+//                            tests)
+//   GTEST_HAS_DEATH_TEST   - death tests
+//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
+//   GTEST_HAS_TYPED_TEST   - typed tests
+//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
+//                            GTEST_HAS_POSIX_RE (see above) which users can
+//                            define themselves.
+//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
+//                            the above two are mutually exclusive.
+//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
+//                              variable don't have to be used.
+//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
+//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
+//
+// Synchronization:
+//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
+//                  - synchronization primitives.
+//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+//                         synchronization primitives have real implementations
+//                         and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
+//   IteratorTraits - partial implementation of std::iterator_traits, which
+//                    is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+//   scoped_ptr     - as in TR2.
+//
+// Regular expressions:
+//   RE             - a simple regular expression class using the POSIX
+//                    Extended Regular Expression syntax on UNIX-like
+//                    platforms, or a reduced regular exception syntax on
+//                    other platforms, including Windows.
+//
+// Logging:
+//   GTEST_LOG_()   - logs messages at the specified severity level.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+//   CaptureStdout()     - starts capturing stdout.
+//   GetCapturedStdout() - stops capturing stdout and returns the captured
+//                         string.
+//   CaptureStderr()     - starts capturing stderr.
+//   GetCapturedStderr() - stops capturing stderr and returns the captured
+//                         string.
+//
+// Integer types:
+//   TypeWithSize   - maps an integer to a int type.
+//   Int32, UInt32, Int64, UInt64, TimeInMillis
+//                  - integers of known sizes.
+//   BiggestInt     - the biggest signed integer type.
+//
+// Command-line utilities:
+//   GTEST_FLAG()       - references a flag.
+//   GTEST_DECLARE_*()  - declares a flag.
+//   GTEST_DEFINE_*()   - defines a flag.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+//   GetEnv()             - gets the value of an environment variable.
+//   BoolFromGTestEnv()   - parses a bool environment variable.
+//   Int32FromGTestEnv()  - parses an Int32 environment variable.
+//   StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h>   // for isspace, etc
+#include <stddef.h>  // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif  // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream>  // NOLINT
+#include <sstream>  // NOLINT
+#include <string>  // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif  // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+#  define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+#  define GTEST_OS_WINDOWS_MINGW 1
+# else
+#  define GTEST_OS_WINDOWS_DESKTOP 1
+# endif  // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+#  define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif  // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise.  We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h>  // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows.  Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform.  Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif  // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+#  ifndef _HAS_EXCEPTIONS
+#   define _HAS_EXCEPTIONS 1
+#  endif  // _HAS_EXCEPTIONS
+#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions.  However, there is no compile-time way of
+// detecting whether they are enabled or not.  Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+#  define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+#  define GTEST_HAS_EXCEPTIONS 0
+# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif  // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif  // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+//   is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either.  Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+#  ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif  // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+#  ifdef __RTTI_ALL__
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+#  define GTEST_HAS_RTTI 1
+
+# endif  // _MSC_VER
+
+#endif  // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
+#endif  // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h>  // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h>  // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple.  You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+#  define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+#  define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif  // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+    void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+    void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+    void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+    void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+    typename T3 = void, typename T4 = void, typename T5 = void,
+    typename T6 = void, typename T7 = void, typename T8 = void,
+    typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
+
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+  tuple(const tuple& t) : f0_(t.f0_) {}
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    return *this;
+  }
+
+  T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+      f1_(f1) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_) {}
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_) {}
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+      f9_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+      f9_(t.f9_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    f9_ = t.f9_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+  T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+  return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+  return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+  return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3) {
+  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4) {
+  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5) {
+  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8) {
+  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8, const T9& f9) {
+  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  Field(Tuple& t) { return t.f0_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  Field(Tuple& t) { return t.f1_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  Field(Tuple& t) { return t.f2_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  Field(Tuple& t) { return t.f3_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  Field(Tuple& t) { return t.f4_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  Field(Tuple& t) { return t.f5_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  Field(Tuple& t) { return t.f6_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  Field(Tuple& t) { return t.f7_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  Field(Tuple& t) { return t.f8_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  Field(Tuple& t) { return t.f9_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  ConstField(const Tuple& t) { return t.f9_; }
+};
+
+}  // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+#  ifdef BOOST_HAS_TR1_TUPLE
+#   undef BOOST_HAS_TR1_TUPLE
+#  endif  // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled.  _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>.  Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#   define _TR1_FUNCTIONAL 1
+#   include <tr1/tuple>
+#   undef _TR1_FUNCTIONAL  // Allows the user to #include
+                        // <tr1/functional> if he chooses to.
+#  else
+#   include <tr1/tuple>  // NOLINT
+#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+#  include <tuple>  // NOLINT
+# endif  // GTEST_USE_OWN_TR1_TUPLE
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
+# else
+#  define GTEST_HAS_CLONE 0
+# endif  // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif  // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+#  define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+#  define GTEST_HAS_STREAM_REDIRECTION 1
+# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector>  // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+    defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled.  The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding.  This leads to problems with code like:
+//
+//   if (gate)
+//     ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used.  This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor.  Example:
+//
+//   struct Foo {
+//     Foo() { ... }
+//   } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+  void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+  type(type const &);\
+  GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro.  The macro should be used on function declarations
+// following the argument list:
+//
+//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling.  This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+#  define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+#  define GTEST_HAS_SEH 0
+# endif
+
+#endif  // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif  // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+//                         content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+//   elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+//   does not work, as gcc supports variable-length arrays whose sizes
+//   are determined at run-time (this is gcc's extension and not part
+//   of the C++ standard).  As a result, gcc fails to reject the
+//   following code with the simple definition:
+//
+//     int foo;
+//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+//                                      // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+//   expr is a compile-time constant.  (Template arguments must be
+//   determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
+//
+//     CompileAssert<bool(expr)>
+//
+//   instead, these compilers will refuse to compile
+//
+//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+//   (They seem to think the ">" in "5 > 0" marks the end of the
+//   template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+//     ((expr) ? 1 : -1).
+//
+//   This is to avoid running into a bug in MS VC 7.1, which
+//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition.  It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+  typedef T element_type;
+
+  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+  ~scoped_ptr() { reset(); }
+
+  T& operator*() const { return *ptr_; }
+  T* operator->() const { return ptr_; }
+  T* get() const { return ptr_; }
+
+  T* release() {
+    T* const ptr = ptr_;
+    ptr_ = NULL;
+    return ptr;
+  }
+
+  void reset(T* p = NULL) {
+    if (p != ptr_) {
+      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
+        delete ptr_;
+      }
+      ptr_ = p;
+    }
+  }
+
+ private:
+  T* ptr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+  // A copy constructor is required by the Standard to initialize object
+  // references from r-values.
+  RE(const RE& other) { Init(other.pattern()); }
+
+  // Constructs an RE from a string.
+  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  RE(const char* regex) { Init(regex); }  // NOLINT
+  ~RE();
+
+  // Returns the string representation of the regex.
+  const char* pattern() const { return pattern_; }
+
+  // FullMatch(str, re) returns true iff regular expression re matches
+  // the entire str.
+  // PartialMatch(str, re) returns true iff regular expression re
+  // matches a substring of str (including str itself).
+  //
+  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+  // when str contains NUL characters.
+  static bool FullMatch(const ::std::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::std::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const ::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const char* str, const RE& re);
+  static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+  void Init(const char* regex);
+
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
+  const char* pattern_;
+  bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+  regex_t full_regex_;     // For FullMatch().
+  regex_t partial_regex_;  // For PartialMatch().
+
+#else  // GTEST_USES_SIMPLE_RE
+
+  const char* full_pattern_;  // For FullMatch();
+
+#endif
+
+  GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+                                                               int line);
+
+// Defines logging utilities:
+//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
+//                          message itself is streamed into the macro.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+  GTEST_INFO,
+  GTEST_WARNING,
+  GTEST_ERROR,
+  GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+  GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+  ~GTestLog();
+
+  ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+  const GTestLogSeverity severity_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+                                  __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+//  Synopsys:
+//    GTEST_CHECK_(boolean_condition);
+//     or
+//    GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+//    This checks the condition and if the condition is not satisfied
+//    it prints message about the condition violation, including the
+//    condition itself, plus additional message streamed into it, if any,
+//    and then it aborts the program. It aborts the program irrespective of
+//    whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::IsTrue(condition)) \
+      ; \
+    else \
+      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success).  Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+  if (const int gtest_error = (posix_call)) \
+    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+                      << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*).  When you use ImplicitCast_, the compiler checks that
+// the cast is safe.  Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+//   ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late.  It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed.  When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo?  It
+// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
+// when you downcast, you should use this macro.  In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not).  In normal mode, we do the efficient static_cast<>
+// instead.  Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+//    This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) {  // so we only accept pointers
+  // Ensures that To is a sub-type of From *.  This test is here only
+  // for compile-time type checking, and has no overhead in an
+  // optimized build at run-time, as it will be optimized away
+  // completely.
+  if (false) {
+    const To to = NULL;
+    ::testing::internal::ImplicitCast_<From*>(to);
+  }
+
+#if GTEST_HAS_RTTI
+  // RTTI: debug mode only!
+  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+  return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+  GTEST_CHECK_(typeid(*base) == typeid(Derived));
+  return dynamic_cast<Derived*>(base);  // NOLINT
+#else
+  return static_cast<Derived*>(base);  // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+//   CaptureStdout     - starts capturing stdout.
+//   GetCapturedStdout - stops capturing stdout and returns the captured string.
+//   CaptureStderr     - starts capturing stderr.
+//   GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds.  This function is only for
+// testing Google Test's own constructs.  Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+  const timespec time = {
+    0,                  // 0 seconds.
+    n * 1000L * 1000L,  // And n ms.
+  };
+  nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified.  Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
+
+  // Notifies all threads created with this notification to start. Must
+  // be called from the controller thread.
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
+
+  // Blocks until the controller thread notifies. Must be called from a test
+  // thread.
+  void WaitForNotification() {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
+      SleepMilliseconds(10);
+    }
+  }
+
+ private:
+  pthread_mutex_t mutex_;
+  bool notified_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+  virtual ~ThreadWithParamBase() {}
+  virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical.  Some compilers (for
+// example, SunStudio) treat them as different types.  Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+  static_cast<ThreadWithParamBase*>(thread)->Run();
+  return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+//   void ThreadFunc(int param) { /* Do things with param */ }
+//   Notification thread_can_start;
+//   ...
+//   // The thread_can_start parameter is optional; you can supply NULL.
+//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+//   thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+  typedef void (*UserThreadFunc)(T);
+
+  ThreadWithParam(
+      UserThreadFunc func, T param, Notification* thread_can_start)
+      : func_(func),
+        param_(param),
+        thread_can_start_(thread_can_start),
+        finished_(false) {
+    ThreadWithParamBase* const base = this;
+    // The thread can be created only after all fields except thread_
+    // have been initialized.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+  }
+  ~ThreadWithParam() { Join(); }
+
+  void Join() {
+    if (!finished_) {
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+      finished_ = true;
+    }
+  }
+
+  virtual void Run() {
+    if (thread_can_start_ != NULL)
+      thread_can_start_->WaitForNotification();
+    func_(param_);
+  }
+
+ private:
+  const UserThreadFunc func_;  // User-supplied thread function.
+  const T param_;  // User-supplied parameter to the thread function.
+  // When non-NULL, used to block execution until the controller thread
+  // notifies.
+  Notification* const thread_can_start_;
+  bool finished_;  // true iff we know that the thread function has finished.
+  pthread_t thread_;  // The native thread object.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+//   Mutex mutex;
+//   ...
+//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
+//                            // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes.  Do not use MutexBase directly.  Instead, write
+// the following to define a static mutex:
+//
+//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+  // Acquires this mutex.
+  void Lock() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+    owner_ = pthread_self();
+    has_owner_ = true;
+  }
+
+  // Releases this mutex.
+  void Unlock() {
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
+    // mutex when this is called.
+    has_owner_ = false;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+  }
+
+  // Does nothing if the current thread holds the mutex. Otherwise, crashes
+  // with high probability.
+  void AssertHeld() const {
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+        << "The current thread is not holding the mutex @" << this;
+  }
+
+  // A static mutex may be used before main() is entered.  It may even
+  // be used before the dynamic initialization stage.  Therefore we
+  // must be able to initialize a static mutex object at link time.
+  // This means MutexBase has to be a POD and its member variables
+  // have to be public.
+ public:
+  pthread_mutex_t mutex_;  // The underlying pthread mutex.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+    extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+  Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+    has_owner_ = false;
+  }
+  ~Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms.  Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(MutexBase* mutex)
+      : mutex_(mutex) { mutex_->Lock(); }
+
+  ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+  MutexBase* const mutex_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage.  Therefore it cannot be templatized to access
+// ThreadLocal<T>.  Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+  virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+//   // Thread 1
+//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
+//
+//   // Thread 2
+//   tl.set(150);  // Changes the value for thread 2 only.
+//   EXPECT_EQ(150, tl.get());
+//
+//   // Thread 1
+//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
+//   tl.set(200);
+//   EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits.  Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies.  It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects.  That means they
+// will die after main() has returned.  Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : key_(CreateKey()),
+                  default_() {}
+  explicit ThreadLocal(const T& value) : key_(CreateKey()),
+                                         default_(value) {}
+
+  ~ThreadLocal() {
+    // Destroys the managed object for the current thread, if any.
+    DeleteThreadLocalValue(pthread_getspecific(key_));
+
+    // Releases resources associated with the key.  This will *not*
+    // delete managed objects for other threads.
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+  }
+
+  T* pointer() { return GetOrCreateValue(); }
+  const T* pointer() const { return GetOrCreateValue(); }
+  const T& get() const { return *pointer(); }
+  void set(const T& value) { *pointer() = value; }
+
+ private:
+  // Holds a value of type T.
+  class ValueHolder : public ThreadLocalValueHolderBase {
+   public:
+    explicit ValueHolder(const T& value) : value_(value) {}
+
+    T* pointer() { return &value_; }
+
+   private:
+    T value_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+  };
+
+  static pthread_key_t CreateKey() {
+    pthread_key_t key;
+    // When a thread exits, DeleteThreadLocalValue() will be called on
+    // the object managed for that thread.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_key_create(&key, &DeleteThreadLocalValue));
+    return key;
+  }
+
+  T* GetOrCreateValue() const {
+    ThreadLocalValueHolderBase* const holder =
+        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+    if (holder != NULL) {
+      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+    }
+
+    ValueHolder* const new_holder = new ValueHolder(default_);
+    ThreadLocalValueHolderBase* const holder_base = new_holder;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+    return new_holder->pointer();
+  }
+
+  // A key pthreads uses for looking up per-thread values.
+  const pthread_key_t key_;
+  const T default_;  // The default value for each thread.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else  // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable).  Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+  Mutex() {}
+  void Lock() {}
+  void Unlock() {}
+  void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+  extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(Mutex*) {}  // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : value_() {}
+  explicit ThreadLocal(const T& value) : value_(value) {}
+  T* pointer() { return &value_; }
+  const T* pointer() const { return &value_; }
+  const T& get() const { return value_; }
+  void set(const T& value) { value_ = value; }
+ private:
+  T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif  // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio.  The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects.  We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template.  These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+  typedef bool_constant<bool_value> type;
+  static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+  typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+  typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+  typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF.  char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+  return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+  return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+  return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+  return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+  return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+  return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+  return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions.  These wrappers hide the differences between
+// Windows/MSVC and POSIX systems.  Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else  // !__BORLANDC__
+#  if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+#  else
+inline int IsATTY(int fd) { return _isatty(fd); }
+#  endif  // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif  // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+  return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif  // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+  return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+  return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+  return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+  return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+  return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // We are on Windows CE, which has no environment variables.
+  return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // Environment variables which we programmatically clear will be set to the
+  // empty string rather than unset (NULL).  Handle that case.
+  const char* const env = getenv(name);
+  return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+  return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop)  // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+}  // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent.  This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type.  It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+//   TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs.  Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+  // This prevents the user from using TypeWithSize<N> with incorrect
+  // values of N.
+  typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+  // unsigned int has size 4 in both gcc and MSVC.
+  //
+  // As base/basictypes.h doesn't compile on Windows, we cannot use
+  // uint32, uint64, and etc here.
+  typedef int Int;
+  typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+  typedef __int64 Int;
+  typedef unsigned __int64 UInt;
+#else
+  typedef long long Int;  // NOLINT
+  typedef unsigned long long UInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+//   1. You stream a bunch of values to a Message object.
+//      It will remember the text in a stringstream.
+//   2. Then you stream the Message object to an ostream.
+//      This causes the text in the Message to be streamed
+//      to the ostream.
+//
+// For example;
+//
+//   testing::Message foo;
+//   foo << 1 << " != " << 2;
+//   std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from.  In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC.  You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do).  The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+  // The type of basic IO manipulators (endl, ends, and flush) for
+  // narrow streams.
+  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+  // Constructs an empty Message.
+  Message();
+
+  // Copy constructor.
+  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
+    *ss_ << msg.GetString();
+  }
+
+  // Constructs a Message from a C-string.
+  explicit Message(const char* str) : ss_(new ::std::stringstream) {
+    *ss_ << str;
+  }
+
+#if GTEST_OS_SYMBIAN
+  // Streams a value (either a pointer or not) to this object.
+  template <typename T>
+  inline Message& operator <<(const T& value) {
+    StreamHelper(typename internal::is_pointer<T>::type(), value);
+    return *this;
+  }
+#else
+  // Streams a non-pointer value to this object.
+  template <typename T>
+  inline Message& operator <<(const T& val) {
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
+    return *this;
+  }
+
+  // Streams a pointer value to this object.
+  //
+  // This function is an overload of the previous one.  When you
+  // stream a pointer to a Message, this definition will be used as it
+  // is more specialized.  (The C++ Standard, section
+  // [temp.func.order].)  If you stream a non-pointer, then the
+  // previous definition will be used.
+  //
+  // The reason for this overload is that streaming a NULL pointer to
+  // ostream is undefined behavior.  Depending on the compiler, you
+  // may get "0", "(nil)", "(null)", or an access violation.  To
+  // ensure consistent result across compilers, we always treat NULL
+  // as "(null)".
+  template <typename T>
+  inline Message& operator <<(T* const& pointer) {  // NOLINT
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+    return *this;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // Since the basic IO manipulators are overloaded for both narrow
+  // and wide streams, we have to provide this specialized definition
+  // of operator <<, even though its body is the same as the
+  // templatized version above.  Without this definition, streaming
+  // endl or other basic IO manipulators to Message will confuse the
+  // compiler.
+  Message& operator <<(BasicNarrowIoManip val) {
+    *ss_ << val;
+    return *this;
+  }
+
+  // Instead of 1/0, we want to see true/false for bool values.
+  Message& operator <<(bool b) {
+    return *this << (b ? "true" : "false");
+  }
+
+  // These two overloads allow streaming a wide C string to a Message
+  // using the UTF-8 encoding.
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::std::wstring& wstr);
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::wstring& wstr);
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+  // Gets the text streamed to this object so far as an std::string.
+  // Each '\0' character in the buffer is replaced with "\\0".
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+  // These are needed as the Nokia Symbian Compiler cannot decide between
+  // const T& and const T* in a function template. The Nokia compiler _can_
+  // decide between class template specializations for T and T*, so a
+  // tr1::type_traits-like is_pointer works, and we can overload on that.
+  template <typename T>
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+  }
+  template <typename T>
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // We'll hold the text streamed to this object here.
+  const internal::scoped_ptr< ::std::stringstream> ss_;
+
+  // We declare (but don't implement) this to prevent the compiler
+  // from implementing the assignment operator.
+  void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+  return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test.  They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+  // Static utility methods
+
+  // Clones a 0-terminated C string, allocating memory using new.  The
+  // caller is responsible for deleting the return value using
+  // delete[].  Returns the cloned string, or NULL if the input is
+  // NULL.
+  //
+  // This is different from strdup() in string.h, which allocates
+  // memory using malloc().
+  static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+  // able to pass strings to Win32 APIs on CE we need to convert them
+  // to 'Unicode', UTF-16.
+
+  // Creates a UTF-16 wide string from the given ANSI string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the wide string, or NULL if the
+  // input is NULL.
+  //
+  // The wide string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static LPCWSTR AnsiToUtf16(const char* c_str);
+
+  // Creates an ANSI string from the given wide string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the ANSI string, or NULL if the
+  // input is NULL.
+  //
+  // The returned string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+  // Compares two C strings.  Returns true iff they have the same content.
+  //
+  // Unlike strcmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CStringEquals(const char* lhs, const char* rhs);
+
+  // Converts a wide C string to a String using the UTF-8 encoding.
+  // NULL will be converted to "(null)".  If an error occurred during
+  // the conversion, "(failed to convert from wide string)" is
+  // returned.
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+  // Compares two wide C strings.  Returns true iff they have the same
+  // content.
+  //
+  // Unlike wcscmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+  // Compares two C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike strcasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CaseInsensitiveCStringEquals(const char* lhs,
+                                           const char* rhs);
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                               const wchar_t* rhs);
+
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
+
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
+
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
+
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
+
+ private:
+  String();  // Not meant to be instantiated.
+};  // class String
+
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+  FilePath() : pathname_("") { }
+  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+    Normalize();
+  }
+
+  FilePath& operator=(const FilePath& rhs) {
+    Set(rhs);
+    return *this;
+  }
+
+  void Set(const FilePath& rhs) {
+    pathname_ = rhs.pathname_;
+  }
+
+  const std::string& string() const { return pathname_; }
+  const char* c_str() const { return pathname_.c_str(); }
+
+  // Returns the current working directory, or "" if unsuccessful.
+  static FilePath GetCurrentDir();
+
+  // Given directory = "dir", base_name = "test", number = 0,
+  // extension = "xml", returns "dir/test.xml". If number is greater
+  // than zero (e.g., 12), returns "dir/test_12.xml".
+  // On Windows platform, uses \ as the separator rather than /.
+  static FilePath MakeFileName(const FilePath& directory,
+                               const FilePath& base_name,
+                               int number,
+                               const char* extension);
+
+  // Given directory = "dir", relative_path = "test.xml",
+  // returns "dir/test.xml".
+  // On Windows, uses \ as the separator rather than /.
+  static FilePath ConcatPaths(const FilePath& directory,
+                              const FilePath& relative_path);
+
+  // Returns a pathname for a file that does not currently exist. The pathname
+  // will be directory/base_name.extension or
+  // directory/base_name_<number>.extension if directory/base_name.extension
+  // already exists. The number will be incremented until a pathname is found
+  // that does not already exist.
+  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+  // There could be a race condition if two or more processes are calling this
+  // function at the same time -- they could both pick the same filename.
+  static FilePath GenerateUniqueFileName(const FilePath& directory,
+                                         const FilePath& base_name,
+                                         const char* extension);
+
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
+
+  // If input name has a trailing separator character, removes it and returns
+  // the name, otherwise return the name string unmodified.
+  // On Windows platform, uses \ as the separator, other platforms use /.
+  FilePath RemoveTrailingPathSeparator() const;
+
+  // Returns a copy of the FilePath with the directory part removed.
+  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+  // returns an empty FilePath ("").
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveDirectoryName() const;
+
+  // RemoveFileName returns the directory path with the filename removed.
+  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveFileName() const;
+
+  // Returns a copy of the FilePath with the case-insensitive extension removed.
+  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+  // FilePath("dir/file"). If a case-insensitive extension is not
+  // found, returns a copy of the original FilePath.
+  FilePath RemoveExtension(const char* extension) const;
+
+  // Creates directories so that path exists. Returns true if successful or if
+  // the directories already exist; returns false if unable to create
+  // directories for any reason. Will also return false if the FilePath does
+  // not represent a directory (that is, it doesn't end with a path separator).
+  bool CreateDirectoriesRecursively() const;
+
+  // Create the directory so that path exists. Returns true if successful or
+  // if the directory already exists; returns false if unable to create the
+  // directory for any reason, including if the parent directory does not
+  // exist. Not named "CreateDirectory" because that's a macro on Windows.
+  bool CreateFolder() const;
+
+  // Returns true if FilePath describes something in the file-system,
+  // either a file, directory, or whatever, and that something exists.
+  bool FileOrDirectoryExists() const;
+
+  // Returns true if pathname describes a directory in the file-system
+  // that exists.
+  bool DirectoryExists() const;
+
+  // Returns true if FilePath ends with a path separator, which indicates that
+  // it is intended to represent a directory. Returns false otherwise.
+  // This does NOT check that a directory (or file) actually exists.
+  bool IsDirectory() const;
+
+  // Returns true if pathname describes a root directory. (Windows has one
+  // root directory per disk drive.)
+  bool IsRootDirectory() const;
+
+  // Returns true if pathname describes an absolute path.
+  bool IsAbsolutePath() const;
+
+ private:
+  // Replaces multiple consecutive separators with a single separator.
+  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+  // redundancies that might be in a pathname involving "." or "..".
+  //
+  // A pathname with multiple consecutive separators may occur either through
+  // user error or as a result of some scripts or APIs that generate a pathname
+  // with a trailing separator. On other platforms the same API or script
+  // may NOT generate a pathname with a trailing "/". Then elsewhere that
+  // pathname may have another "/" and pathname components added to it,
+  // without checking for the separator already being there.
+  // The script language and operating system may allow paths like "foo//bar"
+  // but some of the functions in FilePath will not handle that correctly. In
+  // particular, RemoveTrailingPathSeparator() only removes one separator, and
+  // it is called in CreateDirectoriesRecursively() assuming that it will change
+  // a pathname from directory syntax (trailing separator) to filename syntax.
+  //
+  // On Windows this method also replaces the alternate path separator '/' with
+  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+  // "bar\\foo".
+
+  void Normalize();
+
+  // Returns a pointer to the last occurence of a valid path separator in
+  // the FilePath. On Windows, for example, both '/' and '\' are valid path
+  // separators. Returns NULL if no path separator was found.
+  const char* FindLastPathSeparator() const;
+
+  std::string pathname_;
+};  // class FilePath
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+// This file was GENERATED by command:
+//     pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+  typedef T1 Head;
+  typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+  typedef T1 Head;
+  typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+  typedef T1 Head;
+  typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+  typedef T1 Head;
+  typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types6 {
+  typedef T1 Head;
+  typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types7 {
+  typedef T1 Head;
+  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types8 {
+  typedef T1 Head;
+  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+  typedef T1 Head;
+  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+  typedef T1 Head;
+  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types11 {
+  typedef T1 Head;
+  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types12 {
+  typedef T1 Head;
+  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types13 {
+  typedef T1 Head;
+  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+  typedef T1 Head;
+  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+  typedef T1 Head;
+  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types16 {
+  typedef T1 Head;
+  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types17 {
+  typedef T1 Head;
+  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types18 {
+  typedef T1 Head;
+  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+  typedef T1 Head;
+  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+  typedef T1 Head;
+  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types21 {
+  typedef T1 Head;
+  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types22 {
+  typedef T1 Head;
+  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types23 {
+  typedef T1 Head;
+  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+  typedef T1 Head;
+  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+  typedef T1 Head;
+  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types26 {
+  typedef T1 Head;
+  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types27 {
+  typedef T1 Head;
+  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types28 {
+  typedef T1 Head;
+  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+  typedef T1 Head;
+  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+  typedef T1 Head;
+  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types31 {
+  typedef T1 Head;
+  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types32 {
+  typedef T1 Head;
+  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types33 {
+  typedef T1 Head;
+  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+  typedef T1 Head;
+  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+  typedef T1 Head;
+  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types36 {
+  typedef T1 Head;
+  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types37 {
+  typedef T1 Head;
+  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types38 {
+  typedef T1 Head;
+  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+  typedef T1 Head;
+  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+  typedef T1 Head;
+  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types41 {
+  typedef T1 Head;
+  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types42 {
+  typedef T1 Head;
+  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types43 {
+  typedef T1 Head;
+  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+  typedef T1 Head;
+  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+  typedef T1 Head;
+  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types46 {
+  typedef T1 Head;
+  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types47 {
+  typedef T1 Head;
+  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types48 {
+  typedef T1 Head;
+  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+  typedef T1 Head;
+  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+  typedef T1 Head;
+  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+    typename T3 = internal::None, typename T4 = internal::None,
+    typename T5 = internal::None, typename T6 = internal::None,
+    typename T7 = internal::None, typename T8 = internal::None,
+    typename T9 = internal::None, typename T10 = internal::None,
+    typename T11 = internal::None, typename T12 = internal::None,
+    typename T13 = internal::None, typename T14 = internal::None,
+    typename T15 = internal::None, typename T16 = internal::None,
+    typename T17 = internal::None, typename T18 = internal::None,
+    typename T19 = internal::None, typename T20 = internal::None,
+    typename T21 = internal::None, typename T22 = internal::None,
+    typename T23 = internal::None, typename T24 = internal::None,
+    typename T25 = internal::None, typename T26 = internal::None,
+    typename T27 = internal::None, typename T28 = internal::None,
+    typename T29 = internal::None, typename T30 = internal::None,
+    typename T31 = internal::None, typename T32 = internal::None,
+    typename T33 = internal::None, typename T34 = internal::None,
+    typename T35 = internal::None, typename T36 = internal::None,
+    typename T37 = internal::None, typename T38 = internal::None,
+    typename T39 = internal::None, typename T40 = internal::None,
+    typename T41 = internal::None, typename T42 = internal::None,
+    typename T43 = internal::None, typename T44 = internal::None,
+    typename T45 = internal::None, typename T46 = internal::None,
+    typename T47 = internal::None, typename T48 = internal::None,
+    typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, internal::None, internal::None, internal::None> {
+  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, internal::None, internal::None> {
+  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, T49, internal::None> {
+  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates4 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates7 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates10 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates13 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates16 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates19 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates22 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates25 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates28 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates31 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates34 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates37 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates40 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates43 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates46 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates49 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, NoneT, NoneT, NoneT> {
+  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, NoneT, NoneT> {
+  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, T49, NoneT> {
+  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> > {
+  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__.  Writing
+//
+//   foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number.  For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult;                 // Result of an assertion.
+class Message;                         // Represents a failure message.
+class Test;                            // Represents a test.
+class TestInfo;                        // Information about a test.
+class TestPartResult;                  // Result of a test part.
+class UnitTest;                        // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo;                      // Information about a trace point.
+class ScopedTrace;                     // Implements scoped trace.
+class TestInfoImpl;                    // Opaque implementation of TestInfo
+class UnitTestImpl;                    // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant).  Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler.  These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise.  Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal.  Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];  // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif  // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+  // The c'tor pushes the given source file location and message onto
+  // a trace stack maintained by Google Test.
+  ScopedTrace(const char* file, int line, const Message& message);
+
+  // The d'tor pops the info pushed by the c'tor.
+  //
+  // Note that the d'tor is not virtual in order to be efficient.
+  // Don't inherit from ScopedTrace!
+  ~ScopedTrace();
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
+                            // c'tor and d'tor.  Therefore it doesn't
+                            // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+                                     const char* actual_expression,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
+                                     bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison.  (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly.  Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+//   The most-significant bit being the leftmost, an IEEE
+//   floating-point looks like
+//
+//     sign_bit exponent_bits fraction_bits
+//
+//   Here, sign_bit is a single bit that designates the sign of the
+//   number.
+//
+//   For float, there are 8 exponent bits and 23 fraction bits.
+//
+//   For double, there are 11 exponent bits and 52 fraction bits.
+//
+//   More details can be found at
+//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+  // Defines the unsigned integer type that has the same size as the
+  // floating point number.
+  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+  // Constants.
+
+  // # of bits in a number.
+  static const size_t kBitCount = 8*sizeof(RawType);
+
+  // # of fraction bits in a number.
+  static const size_t kFractionBitCount =
+    std::numeric_limits<RawType>::digits - 1;
+
+  // # of exponent bits in a number.
+  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+  // The mask for the sign bit.
+  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+  // The mask for the fraction bits.
+  static const Bits kFractionBitMask =
+    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+  // The mask for the exponent bits.
+  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+  // How many ULP's (Units in the Last Place) we want to tolerate when
+  // comparing two numbers.  The larger the value, the more error we
+  // allow.  A 0 value means that two numbers must be exactly the same
+  // to be considered equal.
+  //
+  // The maximum error of a single floating-point operation is 0.5
+  // units in the last place.  On Intel CPU's, all floating-point
+  // calculations are done with 80-bit precision, while double has 64
+  // bits.  Therefore, 4 should be enough for ordinary use.
+  //
+  // See the following article for more details on ULP:
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+  static const size_t kMaxUlps = 4;
+
+  // Constructs a FloatingPoint from a raw floating-point number.
+  //
+  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+  // around may change its bits, although the new value is guaranteed
+  // to be also a NAN.  Therefore, don't expect this constructor to
+  // preserve the bits in x when x is a NAN.
+  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+  // Static methods
+
+  // Reinterprets a bit pattern as a floating-point number.
+  //
+  // This function is needed to test the AlmostEquals() method.
+  static RawType ReinterpretBits(const Bits bits) {
+    FloatingPoint fp(0);
+    fp.u_.bits_ = bits;
+    return fp.u_.value_;
+  }
+
+  // Returns the floating-point number that represent positive infinity.
+  static RawType Infinity() {
+    return ReinterpretBits(kExponentBitMask);
+  }
+
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
+  // Non-static methods
+
+  // Returns the bits that represents this number.
+  const Bits &bits() const { return u_.bits_; }
+
+  // Returns the exponent bits of this number.
+  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+  // Returns the fraction bits of this number.
+  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+  // Returns the sign bit of this number.
+  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+  // Returns true iff this is NAN (not a number).
+  bool is_nan() const {
+    // It's a NAN if the exponent bits are all ones and the fraction
+    // bits are not entirely zeros.
+    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+  }
+
+  // Returns true iff this number is at most kMaxUlps ULP's away from
+  // rhs.  In particular, this function:
+  //
+  //   - returns false if either number is (or both are) NAN.
+  //   - treats really large numbers as almost equal to infinity.
+  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
+  bool AlmostEquals(const FloatingPoint& rhs) const {
+    // The IEEE standard says that any comparison operation involving
+    // a NAN must return false.
+    if (is_nan() || rhs.is_nan()) return false;
+
+    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+        <= kMaxUlps;
+  }
+
+ private:
+  // The data type used to store the actual floating-point number.
+  union FloatingPointUnion {
+    RawType value_;  // The raw floating-point number.
+    Bits bits_;      // The bits that represent the number.
+  };
+
+  // Converts an integer from the sign-and-magnitude representation to
+  // the biased representation.  More precisely, let N be 2 to the
+  // power of (kBitCount - 1), an integer x is represented by the
+  // unsigned number x + N.
+  //
+  // For instance,
+  //
+  //   -N + 1 (the most negative number representable using
+  //          sign-and-magnitude) is represented by 1;
+  //   0      is represented by N; and
+  //   N - 1  (the biggest number representable using
+  //          sign-and-magnitude) is represented by 2N - 1.
+  //
+  // Read http://en.wikipedia.org/wiki/Signed_number_representations
+  // for more details on signed number representations.
+  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+    if (kSignBitMask & sam) {
+      // sam represents a negative number.
+      return ~sam + 1;
+    } else {
+      // sam represents a positive number.
+      return kSignBitMask | sam;
+    }
+  }
+
+  // Given two numbers in the sign-and-magnitude representation,
+  // returns the distance between them as an unsigned number.
+  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+                                                     const Bits &sam2) {
+    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+  }
+
+  FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them.  The TypeId type is
+// used to hold such IDs.  The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+  // dummy_ must not have a const type.  Otherwise an overly eager
+  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+  static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T.  Different values will be
+// returned for different types.  Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+  // The compiler is required to allocate a different
+  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+  // the template.  Therefore, the address of dummy_ is guaranteed to
+  // be unique.
+  return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test.  Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+  virtual ~TestFactoryBase() {}
+
+  // Creates a test instance to run. The instance is both created and destroyed
+  // within TestInfoImpl::Run()
+  virtual Test* CreateTest() = 0;
+
+ protected:
+  TestFactoryBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+  virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+                                            long hr);  // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+                                            long hr);  // NOLINT
+
+#endif  // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param        the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param       text representation of the test's value parameter,
+//                     or NULL if this is not a type-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+  TypedTestCasePState() : registered_(false) {}
+
+  // Adds the given test name to defined_test_names_ and return true
+  // if the test case hasn't been registered; otherwise aborts the
+  // program.
+  bool AddTestName(const char* file, int line, const char* case_name,
+                   const char* test_name) {
+    if (registered_) {
+      fprintf(stderr, "%s Test %s must be defined before "
+              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+              FormatFileLocation(file, line).c_str(), test_name, case_name);
+      fflush(stderr);
+      posix::Abort();
+    }
+    defined_test_names_.insert(test_name);
+    return true;
+  }
+
+  // Verifies that registered_tests match the test names in
+  // defined_test_names_; returns registered_tests if successful, or
+  // aborts the program otherwise.
+  const char* VerifyRegisteredTestNames(
+      const char* file, int line, const char* registered_tests);
+
+ private:
+  bool registered_;
+  ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  if (comma == NULL) {
+    return NULL;
+  }
+  while (IsSpace(*(++comma))) {}
+  return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test.  The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter.  It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+  // 'index' is the index of the test in the type list 'Types'
+  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+  // Types).  Valid values for 'index' are [0, N - 1] where N is the
+  // length of Types.
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names, int index) {
+    typedef typename Types::Head Type;
+    typedef Fixture<Type> FixtureClass;
+    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+    // First, registers the first type-parameterized test in the type
+    // list.
+    MakeAndRegisterTestInfo(
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
+        GetPrefixUntilComma(test_names).c_str(),
+        GetTypeName<Type>().c_str(),
+        NULL,  // No value parameter.
+        GetTypeId<FixtureClass>(),
+        TestClass::SetUpTestCase,
+        TestClass::TearDownTestCase,
+        new TestFactoryImpl<TestClass>);
+
+    // Next, recurses (at compile time) with the tail of the type list.
+    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+        ::Register(prefix, case_name, test_names, index + 1);
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/, int /*index*/) {
+    return true;
+  }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test.  The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names) {
+    typedef typename Tests::Head Head;
+
+    // First, register the first test in 'Test' for each type in 'Types'.
+    TypeParameterizedTest<Fixture, Head, Types>::Register(
+        prefix, case_name, test_names, 0);
+
+    // Next, recurses (at compile time) with the tail of the test list.
+    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+        ::Register(prefix, case_name, SkipComma(test_names));
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/) {
+    return true;
+  }
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+  ConstCharPtr(const char* str) : value(str) {}
+  operator bool() const { return true; }
+  const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution.  Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+  static const UInt32 kMaxRange = 1u << 31;
+
+  explicit Random(UInt32 seed) : state_(seed) {}
+
+  void Reseed(UInt32 seed) { state_ = seed; }
+
+  // Generates a random number from [0, range).  Crashes if 'range' is
+  // 0 or greater than kMaxRange.
+  UInt32 Generate(UInt32 range);
+
+ private:
+  UInt32 state_;
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; };  // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+    typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged.  This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; };  // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'.  The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+    typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+    typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary.  For example,
+// it transforms
+//
+//   char         ==> const char&
+//   const char   ==> const char&
+//   char&        ==> const char&
+//   const char&  ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+  // We need the following helper functions only for their types.
+  // They have no implementations.
+
+  // MakeFrom() is an expression whose type is From.  We cannot simply
+  // use From(), as the type From may not have a public default
+  // constructor.
+  static From MakeFrom();
+
+  // These two functions are overloaded.  Given an expression
+  // Helper(x), the compiler will pick the first version if x can be
+  // implicitly converted to type To; otherwise it will pick the
+  // second version.
+  //
+  // The first version returns a value of size 1, and the second
+  // version returns a value of size 2.  Therefore, by checking the
+  // size of Helper(x), which can be done at compile time, we can tell
+  // which version of Helper() is used, and hence whether x can be
+  // implicitly converted to type To.
+  static char Helper(To);
+  static char (&Helper(...))[2];  // NOLINT
+
+  // We have to put the 'public' section after the 'private' section,
+  // or MSVC refuses to compile the code.
+ public:
+  // MSVC warns about implicitly converting from double to int for
+  // possible loss of data, so we need to temporarily disable the
+  // warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4244)  // Temporarily disables warning 4244.
+
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop)           // Restores the warning state.
+#elif defined(__BORLANDC__)
+  // C++Builder cannot use member overload resolution during template
+  // instantiation.  The simplest workaround is to use its C++0x type traits
+  // functions (C++Builder 2009 and above only).
+  static const bool value = __is_convertible(From, To);
+#else
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif  // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+    : public bool_constant<
+  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them).  It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0.  If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked.  Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator.  The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator').  If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+                            typename C::iterator* /* it */ = NULL,
+                            typename C::const_iterator* /* const_it */ = NULL) {
+  return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false.  To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; };  // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0.  When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+  return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+  for (size_t i = 0; i != size; i++) {
+    if (!internal::ArrayEq(lhs[i], rhs[i]))
+      return false;
+  }
+  return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem.  Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+  for (Iter it = begin; it != end; ++it) {
+    if (internal::ArrayEq(*it, elem))
+      return it;
+  }
+  return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0.  When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+  internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+  for (size_t i = 0; i != size; i++) {
+    internal::CopyArray(from[i], to + i);
+  }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+  kReference,  // The NativeArray references the native array.
+  kCopy        // The NativeArray makes a copy of the native array and
+               // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container.  Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers.  New members
+// should be added as needed.  To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier).  It's the client's responsibility to satisfy
+// this requirement.  Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+  // STL-style container typedefs.
+  typedef Element value_type;
+  typedef Element* iterator;
+  typedef const Element* const_iterator;
+
+  // Constructs from a native array.
+  NativeArray(const Element* array, size_t count, RelationToSource relation) {
+    Init(array, count, relation);
+  }
+
+  // Copy constructor.
+  NativeArray(const NativeArray& rhs) {
+    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+  }
+
+  ~NativeArray() {
+    // Ensures that the user doesn't instantiate NativeArray with a
+    // const or reference type.
+    static_cast<void>(StaticAssertTypeEqHelper<Element,
+        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+    if (relation_to_source_ == kCopy)
+      delete[] array_;
+  }
+
+  // STL-style container methods.
+  size_t size() const { return size_; }
+  const_iterator begin() const { return array_; }
+  const_iterator end() const { return array_ + size_; }
+  bool operator==(const NativeArray& rhs) const {
+    return size() == rhs.size() &&
+        ArrayEq(begin(), size(), rhs.begin());
+  }
+
+ private:
+  // Initializes this object; makes a copy of the input array if
+  // 'relation' is kCopy.
+  void Init(const Element* array, size_t a_size, RelationToSource relation) {
+    if (relation == kReference) {
+      array_ = array;
+    } else {
+      Element* const copy = new Element[a_size];
+      CopyArray(array, a_size, copy);
+      array_ = copy;
+    }
+    size_ = a_size;
+    relation_to_source_ = relation;
+  }
+
+  const Element* array_;
+  size_t size_;
+  RelationToSource relation_to_source_;
+
+  GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+  ::testing::internal::AssertHelper(result_type, file, line, message) \
+    = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+  if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+    bool gtest_caught_expected = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (expected_exception const&) { \
+      gtest_caught_expected = true; \
+    } \
+    catch (...) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws a different type."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+    if (!gtest_caught_expected) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws nothing."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+      fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+      fail("Expected: " #statement " doesn't throw an exception.\n" \
+           "  Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    bool gtest_caught_any = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      gtest_caught_any = true; \
+    } \
+    if (!gtest_caught_any) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+      fail("Expected: " #statement " throws an exception.\n" \
+           "  Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar_ = \
+      ::testing::AssertionResult(expression)) \
+    ; \
+  else \
+    fail(::testing::internal::GetBoolAssertionFailureMessage(\
+        gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+      fail("Expected: " #statement " doesn't generate new fatal " \
+           "failures in the current thread.\n" \
+           "  Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+  test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+  virtual void TestBody();\
+  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+  ::test_info_ =\
+    ::testing::internal::MakeAndRegisterTestInfo(\
+        #test_case_name, #test_name, NULL, NULL, \
+        (parent_id), \
+        parent_class::SetUpTestCase, \
+        parent_class::TearDownTestCase, \
+        new ::testing::internal::TestFactoryImpl<\
+            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests.  It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status:  The integer exit information in the format specified
+//               by wait(2)
+// exit code:    The integer code passed to exit(3), _exit(2), or
+//               returned from main()
+class GTEST_API_ DeathTest {
+ public:
+  // Create returns false if there was an error determining the
+  // appropriate action to take for the current death test; for example,
+  // if the gtest_death_test_style flag is set to an invalid value.
+  // The LastMessage method will return a more detailed message in that
+  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
+  // argument is set.  If the death test should be skipped, the pointer
+  // is set to NULL; otherwise, it is set to the address of a new concrete
+  // DeathTest object that controls the execution of the current test.
+  static bool Create(const char* statement, const RE* regex,
+                     const char* file, int line, DeathTest** test);
+  DeathTest();
+  virtual ~DeathTest() { }
+
+  // A helper class that aborts a death test when it's deleted.
+  class ReturnSentinel {
+   public:
+    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+   private:
+    DeathTest* const test_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+  } GTEST_ATTRIBUTE_UNUSED_;
+
+  // An enumeration of possible roles that may be taken when a death
+  // test is encountered.  EXECUTE means that the death test logic should
+  // be executed immediately.  OVERSEE means that the program should prepare
+  // the appropriate environment for a child process to execute the death
+  // test, then wait for it to complete.
+  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+  // An enumeration of the three reasons that a test might be aborted.
+  enum AbortReason {
+    TEST_ENCOUNTERED_RETURN_STATEMENT,
+    TEST_THREW_EXCEPTION,
+    TEST_DID_NOT_DIE
+  };
+
+  // Assumes one of the above roles.
+  virtual TestRole AssumeRole() = 0;
+
+  // Waits for the death test to finish and returns its status.
+  virtual int Wait() = 0;
+
+  // Returns true if the death test passed; that is, the test process
+  // exited during the test, its exit status matches a user-supplied
+  // predicate, and its stderr output matches a user-supplied regular
+  // expression.
+  // The user-supplied predicate may be a macro expression rather
+  // than a function pointer or functor, or else Wait and Passed could
+  // be combined.
+  virtual bool Passed(bool exit_status_ok) = 0;
+
+  // Signals that the death test did not die as expected.
+  virtual void Abort(AbortReason reason) = 0;
+
+  // Returns a human-readable outcome message regarding the outcome of
+  // the last death test.
+  static const char* LastMessage();
+
+  static void set_last_death_test_message(const std::string& message);
+
+ private:
+  // A string containing a description of the outcome of the last death test.
+  static std::string last_death_test_message_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests.  May be mocked out for testing.
+class DeathTestFactory {
+ public:
+  virtual ~DeathTestFactory() { }
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  try { \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } catch (const ::std::exception& gtest_exception) { \
+    fprintf(\
+        stderr, \
+        "\n%s: Caught std::exception-derived exception escaping the " \
+        "death test statement. Exception message: %s\n", \
+        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+        gtest_exception.what()); \
+    fflush(stderr); \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  } catch (...) { \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  }
+
+# else
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    const ::testing::internal::RE& gtest_regex = (regex); \
+    ::testing::internal::DeathTest* gtest_dt; \
+    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+        __FILE__, __LINE__, &gtest_dt)) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+    } \
+    if (gtest_dt != NULL) { \
+      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+          gtest_dt_ptr(gtest_dt); \
+      switch (gtest_dt->AssumeRole()) { \
+        case ::testing::internal::DeathTest::OVERSEE_TEST: \
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+          } \
+          break; \
+        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+          ::testing::internal::DeathTest::ReturnSentinel \
+              gtest_sentinel(gtest_dt); \
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+          break; \
+        } \
+        default: \
+          break; \
+      } \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+      fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+  InternalRunDeathTestFlag(const std::string& a_file,
+                           int a_line,
+                           int an_index,
+                           int a_write_fd)
+      : file_(a_file), line_(a_line), index_(an_index),
+        write_fd_(a_write_fd) {}
+
+  ~InternalRunDeathTestFlag() {
+    if (write_fd_ >= 0)
+      posix::Close(write_fd_);
+  }
+
+  const std::string& file() const { return file_; }
+  int line() const { return line_; }
+  int index() const { return index_; }
+  int write_fd() const { return write_fd_; }
+
+ private:
+  std::string file_;
+  int line_;
+  int index_;
+  int write_fd_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else  // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+//   statement -  A statement that a macro such as EXPECT_DEATH would test
+//                for program termination. This macro has to make sure this
+//                statement is compiled but not executed, to ensure that
+//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+//                parameter iff EXPECT_DEATH compiles with it.
+//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
+//                the output of statement.  This parameter has to be
+//                compiled but not evaluated by this macro, to ensure that
+//                this macro only accepts expressions that a macro such as
+//                EXPECT_DEATH would accept.
+//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+//                compile inside functions where ASSERT_DEATH doesn't
+//                compile.
+//
+//  The branch that has an always false condition is used to ensure that
+//  statement and regex are compiled (and thus syntactically correct) but
+//  never executed. The unreachable code macro protects the terminator
+//  statement from generating an 'unreachable code' warning in case
+//  statement unconditionally returns or throws. The Message constructor at
+//  the end allows the syntax of streaming additional messages into the
+//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::AlwaysTrue()) { \
+      GTEST_LOG_(WARNING) \
+          << "Death tests are not supported on this platform.\n" \
+          << "Statement '" #statement "' cannot be verified."; \
+    } else if (::testing::internal::AlwaysFalse()) { \
+      ::testing::internal::RE::PartialMatch(".*", (regex)); \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+      terminator; \
+    } else \
+      ::testing::Message()
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+namespace testing {
+
+// This flag controls the style of death tests.  Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+//   1. It generates a warning if there is more than one active
+//   thread.  This is because it's safe to fork() or clone() only
+//   when there is a single thread.
+//
+//   2. The parent process clone()s a sub-process and runs the death
+//   test in it; the sub-process exits with code 0 at the end of the
+//   death test, if it hasn't exited already.
+//
+//   3. The parent process waits for the sub-process to terminate.
+//
+//   4. The parent process checks the exit code and error message of
+//   the sub-process.
+//
+// Examples:
+//
+//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+//   for (int i = 0; i < 5; i++) {
+//     EXPECT_DEATH(server.ProcessRequest(i),
+//                  "Invalid request .* in ProcessRequest()")
+//                  << "Failed to die on request " << i;
+//   }
+//
+//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+//   bool KilledBySIGHUP(int exit_code) {
+//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+//   }
+//
+//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
+//   which uses the POSIX extended regex syntax.
+//
+//   On other platforms (e.g. Windows), we only support a simple regex
+//   syntax implemented as part of Google Test.  This limited
+//   implementation should be enough most of the time when writing
+//   death tests; though it lacks many features you can find in PCRE
+//   or POSIX extended regex syntax.  For example, we don't support
+//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+//   repetition count ("x{5,7}"), among others.
+//
+//   Below is the syntax that we do support.  We chose it to be a
+//   subset of both PCRE and POSIX extended regex, so it's easy to
+//   learn wherever you come from.  In the following: 'A' denotes a
+//   literal character, period (.), or a single \\ escape sequence;
+//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
+//   natural numbers.
+//
+//     c     matches any literal character c
+//     \\d   matches any decimal digit
+//     \\D   matches any character that's not a decimal digit
+//     \\f   matches \f
+//     \\n   matches \n
+//     \\r   matches \r
+//     \\s   matches any ASCII whitespace, including \n
+//     \\S   matches any character that's not a whitespace
+//     \\t   matches \t
+//     \\v   matches \v
+//     \\w   matches any letter, _, or decimal digit
+//     \\W   matches any character that \\w doesn't match
+//     \\c   matches any literal character c, which must be a punctuation
+//     .     matches any single character except \n
+//     A?    matches 0 or 1 occurrences of A
+//     A*    matches 0 or many occurrences of A
+//     A+    matches 1 or many occurrences of A
+//     ^     matches the beginning of a string (not that of each line)
+//     $     matches the end of a string (not that of each line)
+//     xy    matches x followed by y
+//
+//   If you accidentally use PCRE or POSIX extended regex features
+//   not implemented by us, you will get a run-time failure.  In that
+//   case, please try to rewrite your regular expression within the
+//   above syntax.
+//
+//   This implementation is *not* meant to be as highly tuned or robust
+//   as a compiled regex library, but should perform well enough for a
+//   death test, which already incurs significant overhead by launching
+//   a child process.
+//
+// Known caveats:
+//
+//   A "threadsafe" style death test obtains the path to the test
+//   program from argv[0] and re-executes it in the sub-process.  For
+//   simplicity, the current implementation doesn't search the PATH
+//   when launching the sub-process.  This means that the user must
+//   invoke the test program via a path that contains at least one
+//   path separator (e.g. path/to/foo_test and
+//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
+//   is rarely a problem as people usually don't put the test binary
+//   directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+  explicit ExitedWithCode(int exit_code);
+  bool operator()(int exit_status) const;
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ExitedWithCode& other);
+
+  const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+  explicit KilledBySignal(int signum);
+  bool operator()(int exit_status) const;
+ private:
+  const int signum_;
+};
+# endif  // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+//   if (sideeffect) {
+//     *sideeffect = 12;
+//   }
+//   LOG(DFATAL) << "death";
+//   return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+//   int sideeffect = 0;
+//   // Only asserts in dbg.
+//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+//   // opt-mode has sideeffect visible.
+//   EXPECT_EQ(12, sideeffect);
+// #else
+//   // dbg-mode no visible sideeffect.
+//   EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects.  A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+//   // Side-effects here will have an effect after this statement in
+//   // opt mode, but none in debug mode.
+//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  EXPECT_DEATH(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  ASSERT_DEATH(statement, regex)
+
+# endif  // NDEBUG for EXPECT_DEBUG_DEATH
+#endif  // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning.  This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking.  Every pointer to a
+// particular object is kept on a circular linked list.  When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+//   object is traversed.  This class is therefore NOT SUITABLE when there
+//   will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+//   will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+//   Unlike other linked_ptr implementations, in this implementation
+//   a linked_ptr object is thread-safe in the sense that:
+//     - it's safe to copy linked_ptr objects concurrently,
+//     - it's safe to copy *from* a linked_ptr and read its underlying
+//       raw pointer (e.g. via get()) concurrently, and
+//     - it's safe to write to two linked_ptrs that point to the same
+//       shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>.  It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+  // Create a new circle that includes only this instance.
+  void join_new() {
+    next_ = this;
+  }
+
+  // Many linked_ptr operations may change p.link_ for some linked_ptr
+  // variable p in the same circle as this object.  Therefore we need
+  // to prevent two such operations from occurring concurrently.
+  //
+  // Note that different types of linked_ptr objects can coexist in a
+  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
+  // protect all linked_ptr objects.  This can create serious
+  // contention in production code, but is acceptable in a testing
+  // framework.
+
+  // Join an existing circle.
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    linked_ptr_internal const* p = ptr;
+    while (p->next_ != ptr) p = p->next_;
+    p->next_ = this;
+    next_ = ptr;
+  }
+
+  // Leave whatever circle we're part of.  Returns true if we were the
+  // last member of the circle.  Once this is done, you can join() another.
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    if (next_ == this) return true;
+    linked_ptr_internal const* p = next_;
+    while (p->next_ != this) p = p->next_;
+    p->next_ = next_;
+    return false;
+  }
+
+ private:
+  mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+  typedef T element_type;
+
+  // Take over ownership of a raw pointer.  This should happen as soon as
+  // possible after the object is created.
+  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+  ~linked_ptr() { depart(); }
+
+  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+  linked_ptr(linked_ptr const& ptr) {  // NOLINT
+    assert(&ptr != this);
+    copy(&ptr);
+  }
+
+  // Assignment releases the old value and acquires the new.
+  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+    depart();
+    copy(&ptr);
+    return *this;
+  }
+
+  linked_ptr& operator=(linked_ptr const& ptr) {
+    if (&ptr != this) {
+      depart();
+      copy(&ptr);
+    }
+    return *this;
+  }
+
+  // Smart pointer members.
+  void reset(T* ptr = NULL) {
+    depart();
+    capture(ptr);
+  }
+  T* get() const { return value_; }
+  T* operator->() const { return value_; }
+  T& operator*() const { return *value_; }
+
+  bool operator==(T* p) const { return value_ == p; }
+  bool operator!=(T* p) const { return value_ != p; }
+  template <typename U>
+  bool operator==(linked_ptr<U> const& ptr) const {
+    return value_ == ptr.get();
+  }
+  template <typename U>
+  bool operator!=(linked_ptr<U> const& ptr) const {
+    return value_ != ptr.get();
+  }
+
+ private:
+  template <typename U>
+  friend class linked_ptr;
+
+  T* value_;
+  linked_ptr_internal link_;
+
+  void depart() {
+    if (link_.depart()) delete value_;
+  }
+
+  void capture(T* ptr) {
+    value_ = ptr;
+    link_.join_new();
+  }
+
+  template <typename U> void copy(linked_ptr<U> const* ptr) {
+    value_ = ptr->get();
+    if (value_)
+      link_.join(&ptr->link_);
+    else
+      link_.join_new();
+  }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+  return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+  return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+  return linked_ptr<T>(ptr);
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T.  More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+//   1. foo::PrintTo(const T&, ostream*)
+//   2. operator<<(ostream&, const T&) defined in either foo or the
+//      global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+//   // Prints a value to a string.  For a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   std::string ::testing::PrintToString(const T& value);
+//
+//   // Prints a value tersely: for a reference type, the referenced
+//   // value (but not the address) is printed; for a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+//   // Prints value using the type inferred by the compiler.  The difference
+//   // from UniversalTersePrint() is that this function prints both the
+//   // pointer and the NUL-terminated string for a (const or not) char pointer.
+//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+//   // Prints the fields of a tuple tersely to a string vector, one
+//   // element for each field. Tuple support must be enabled in
+//   // gtest-port.h.
+//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+//       const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container.  When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect.  In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator.  We'll fix this if there's an
+// actual need for it.  Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice.  DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+                                     size_t count,
+                                     ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+  kProtobuf,              // a protobuf type
+  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
+                          // (e.g. a named or unnamed enum type)
+  kOtherType              // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+  // This default version is called when kTypeKind is kOtherType.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+                         sizeof(value), os);
+  }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const ::testing::internal::string short_str = value.ShortDebugString();
+    const ::testing::internal::string pretty_str =
+        short_str.length() <= kProtobufOneLinerMaxLength ?
+        short_str : ("\n" + value.DebugString());
+    *os << ("<" + pretty_str + ">");
+  }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+  // Since T has no << operator or PrintTo() but can be implicitly
+  // converted to BiggestInt, we print it as a BiggestInt.
+  //
+  // Most likely T is an enum type (either named or unnamed), in which
+  // case printing it as an integer is the desired behavior.  In case
+  // T is not an enum, printing it as an integer is the best we can do
+  // given that it has no user-defined printer.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const internal::BiggestInt kBigInt = value;
+    *os << kBigInt;
+  }
+};
+
+// Prints the given value to the given ostream.  If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed.  This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream.  If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+  TypeWithoutFormatter<T,
+      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+  return os;
+}
+
+}  // namespace internal2
+}  // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+  // With the following statement, during unqualified name lookup,
+  // testing::internal2::operator<< appears as if it was declared in
+  // the nearest enclosing namespace that contains both
+  // ::testing_internal and ::testing::internal2, i.e. the global
+  // namespace.  For more details, refer to the C++ Standard section
+  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
+  // testing::internal2::operator<< in case T doesn't come with a <<
+  // operator.
+  //
+  // We cannot write 'using ::testing::internal2::operator<<;', which
+  // gcc 3.3 fails to compile due to a compiler bug.
+  using namespace ::testing::internal2;  // NOLINT
+
+  // Assuming T is defined in namespace foo, in the next statement,
+  // the compiler will consider all of:
+  //
+  //   1. foo::operator<< (thanks to Koenig look-up),
+  //   2. ::operator<< (as the current namespace is enclosed in ::),
+  //   3. testing::internal2::operator<< (thanks to the using statement above).
+  //
+  // The operator<< whose type matches T best will be picked.
+  //
+  // We deliberately allow #2 to be a candidate, as sometimes it's
+  // impossible to define #1 (e.g. when foo is ::std, defining
+  // anything in it is undefined behavior unless you are a compiler
+  // vendor.).
+  *os << value;
+}
+
+}  // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream.  The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const C& container, ::std::ostream* os) {
+  const size_t kMaxCount = 32;  // The maximum number of elements to print.
+  *os << '{';
+  size_t count = 0;
+  for (typename C::const_iterator it = container.begin();
+       it != container.end(); ++it, ++count) {
+    if (count > 0) {
+      *os << ',';
+      if (count == kMaxCount) {  // Enough has been printed.
+        *os << " ...";
+        break;
+      }
+    }
+    *os << ' ';
+    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+    // handle *it being a native array.
+    internal::UniversalPrint(*it, os);
+  }
+
+  if (count > 0) {
+    *os << ' ';
+  }
+  *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it.  (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space.  Their representation is
+// implementation-defined.  Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    true_type /* is a pointer */,
+                    T* p, ::std::ostream* os) {
+  if (p == NULL) {
+    *os << "NULL";
+  } else {
+    // C++ doesn't allow casting from a function pointer to any object
+    // pointer.
+    //
+    // IsTrue() silences warnings: "Condition is always true",
+    // "unreachable code".
+    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+      // T is not a function type.  We just call << to print p,
+      // relying on ADL to pick up user-defined << for their pointer
+      // types, if any.
+      *os << p;
+    } else {
+      // T is a function type, so '*os << p' doesn't do what we want
+      // (it just prints p as bool).  We want to print p as a const
+      // void*.  However, we cannot cast it to const void* directly,
+      // even using reinterpret_cast, as earlier versions of gcc
+      // (e.g. 3.4.5) cannot compile the cast when p is a function
+      // pointer.  Casting to UInt64 first solves the problem.
+      *os << reinterpret_cast<const void*>(
+          reinterpret_cast<internal::UInt64>(p));
+    }
+  }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const T& value, ::std::ostream* os) {
+  ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it.  This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined.  We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+  // DefaultPrintTo() is overloaded.  The type of its first two
+  // arguments determine which version will be picked.  If T is an
+  // STL-style container, the version for container will be called; if
+  // T is a pointer, the pointer version will be called; otherwise the
+  // generic version will be called.
+  //
+  // Note that we check for container types here, prior to we check
+  // for protocol message types in our operator<<.  The rationale is:
+  //
+  // For protocol messages, we want to give people a chance to
+  // override Google Mock's format by defining a PrintTo() or
+  // operator<<.  For STL containers, other formats can be
+  // incompatible with Google Mock's format for the container
+  // elements; therefore we check for container types here to ensure
+  // that our format is used.
+  //
+  // The second argument of DefaultPrintTo() is needed to bypass a bug
+  // in Symbian's C++ compiler that prevents it from picking the right
+  // overload between:
+  //
+  //   PrintTo(const T& x, ...);
+  //   PrintTo(T* x, ...);
+  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+  // When printing a plain char, we always treat it as unsigned.  This
+  // way, the output won't be affected by whether the compiler thinks
+  // char is signed or not.
+  PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+  *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type.  When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays.  Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+  UniversalPrint(a[0], os);
+  for (size_t i = 1; i != count; i++) {
+    *os << ", ";
+    UniversalPrint(a[i], os);
+  }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities.  We support
+// tuples of up-to 10 fields.  The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+    ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+  *os << '(';
+  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+  // a reference type.  The same for printing value.second.
+  UniversalPrinter<T1>::Print(value.first, os);
+  *os << ", ";
+  UniversalPrinter<T2>::Print(value.second, os);
+  *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  // Note: we deliberately don't call this PrintTo(), as that name
+  // conflicts with ::testing::internal::PrintTo in the body of the
+  // function.
+  static void Print(const T& value, ::std::ostream* os) {
+    // By default, ::testing::internal::PrintTo() is used for printing
+    // the value.
+    //
+    // Thanks to Koenig look-up, if T is a class and has its own
+    // PrintTo() function defined in its namespace, that function will
+    // be visible here.  Since it is more specific than the generic ones
+    // in ::testing::internal, it will be picked by the compiler in the
+    // following statement - exactly what we want.
+    PrintTo(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+  if (len == 0) {
+    *os << "{}";
+  } else {
+    *os << "{ ";
+    const size_t kThreshold = 18;
+    const size_t kChunkSize = 8;
+    // If the array has more than kThreshold elements, we'll have to
+    // omit some details by printing only the first and the last
+    // kChunkSize elements.
+    // TODO(wan at google.com): let the user control the threshold using a flag.
+    if (len <= kThreshold) {
+      PrintRawArrayTo(begin, len, os);
+    } else {
+      PrintRawArrayTo(begin, kChunkSize, os);
+      *os << ", ..., ";
+      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+    }
+    *os << " }";
+  }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+  // Prints the given array, omitting some elements when there are too
+  // many.
+  static void Print(const T (&a)[N], ::std::ostream* os) {
+    UniversalPrintArray(a, N, os);
+  }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  static void Print(const T& value, ::std::ostream* os) {
+    // Prints the address of the value.  We use reinterpret_cast here
+    // as static_cast doesn't compile when T is a function type.
+    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+    // Then prints the value itself.
+    UniversalPrint(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler.  The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields.  The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+  // Prints the first N fields of a tuple.
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+    *os << ", ";
+    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+        ::Print(::std::tr1::get<N - 1>(t), os);
+  }
+
+  // Tersely prints the first N fields of a tuple to a string vector,
+  // one element for each field.
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+        Print(::std::tr1::get<0>(t), os);
+  }
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+  *os << "(";
+  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+      PrintPrefixTo(t, os);
+  *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field.  See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+  Strings result;
+  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+      TersePrintPrefixToStrings(value, &result);
+  return result;
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+  ::std::stringstream ss;
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+                                          const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+  virtual ~ParamIteratorInterface() {}
+  // A pointer to the base generator instance.
+  // Used only for the purposes of iterator comparison
+  // to make sure that two iterators belong to the same generator.
+  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+  // Advances iterator to point to the next element
+  // provided by the generator. The caller is responsible
+  // for not calling Advance() on an iterator equal to
+  // BaseGenerator()->End().
+  virtual void Advance() = 0;
+  // Clones the iterator object. Used for implementing copy semantics
+  // of ParamIterator<T>.
+  virtual ParamIteratorInterface* Clone() const = 0;
+  // Dereferences the current iterator and provides (read-only) access
+  // to the pointed value. It is the caller's responsibility not to call
+  // Current() on an iterator equal to BaseGenerator()->End().
+  // Used for implementing ParamGenerator<T>::operator*().
+  virtual const T* Current() const = 0;
+  // Determines whether the given iterator and other point to the same
+  // element in the sequence generated by the generator.
+  // Used for implementing ParamGenerator<T>::operator==().
+  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+  typedef T value_type;
+  typedef const T& reference;
+  typedef ptrdiff_t difference_type;
+
+  // ParamIterator assumes ownership of the impl_ pointer.
+  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+  ParamIterator& operator=(const ParamIterator& other) {
+    if (this != &other)
+      impl_.reset(other.impl_->Clone());
+    return *this;
+  }
+
+  const T& operator*() const { return *impl_->Current(); }
+  const T* operator->() const { return impl_->Current(); }
+  // Prefix version of operator++.
+  ParamIterator& operator++() {
+    impl_->Advance();
+    return *this;
+  }
+  // Postfix version of operator++.
+  ParamIterator operator++(int /*unused*/) {
+    ParamIteratorInterface<T>* clone = impl_->Clone();
+    impl_->Advance();
+    return ParamIterator(clone);
+  }
+  bool operator==(const ParamIterator& other) const {
+    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+  }
+  bool operator!=(const ParamIterator& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  friend class ParamGenerator<T>;
+  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+  scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+  typedef T ParamType;
+
+  virtual ~ParamGeneratorInterface() {}
+
+  // Generator interface definition
+  virtual ParamIteratorInterface<T>* Begin() const = 0;
+  virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+  typedef ParamIterator<T> iterator;
+
+  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+  ParamGenerator& operator=(const ParamGenerator& other) {
+    impl_ = other.impl_;
+    return *this;
+  }
+
+  iterator begin() const { return iterator(impl_->Begin()); }
+  iterator end() const { return iterator(impl_->End()); }
+
+ private:
+  linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  RangeGenerator(T begin, T end, IncrementT step)
+      : begin_(begin), end_(end),
+        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+  virtual ~RangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, begin_, 0, step_);
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, end_, end_index_, step_);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+             IncrementT step)
+        : base_(base), value_(value), index_(index), step_(step) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      value_ = value_ + step_;
+      index_++;
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const T* Current() const { return &value_; }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const int other_index =
+          CheckedDowncastToActualType<const Iterator>(&other)->index_;
+      return index_ == other_index;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : ParamIteratorInterface<T>(),
+          base_(other.base_), value_(other.value_), index_(other.index_),
+          step_(other.step_) {}
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<T>* const base_;
+    T value_;
+    int index_;
+    const IncrementT step_;
+  };  // class RangeGenerator::Iterator
+
+  static int CalculateEndIndex(const T& begin,
+                               const T& end,
+                               const IncrementT& step) {
+    int end_index = 0;
+    for (T i = begin; i < end; i = i + step)
+      end_index++;
+    return end_index;
+  }
+
+  // No implementation - assignment is unsupported.
+  void operator=(const RangeGenerator& other);
+
+  const T begin_;
+  const T end_;
+  const IncrementT step_;
+  // The index for the end() iterator. All the elements in the generated
+  // sequence are indexed (0-based) to aid iterator comparison.
+  const int end_index_;
+};  // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  template <typename ForwardIterator>
+  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+      : container_(begin, end) {}
+  virtual ~ValuesInIteratorRangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, container_.begin());
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, container_.end());
+  }
+
+ private:
+  typedef typename ::std::vector<T> ContainerType;
+
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base,
+             typename ContainerType::const_iterator iterator)
+        : base_(base), iterator_(iterator) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      ++iterator_;
+      value_.reset();
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    // We need to use cached value referenced by iterator_ because *iterator_
+    // can return a temporary object (and of type other then T), so just
+    // having "return &*iterator_;" doesn't work.
+    // value_ is updated here and not in Advance() because Advance()
+    // can advance iterator_ beyond the end of the range, and we cannot
+    // detect that fact. The client code, on the other hand, is
+    // responsible for not calling Current() on an out-of-range iterator.
+    virtual const T* Current() const {
+      if (value_.get() == NULL)
+        value_.reset(new T(*iterator_));
+      return value_.get();
+    }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      return iterator_ ==
+          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+          // The explicit constructor call suppresses a false warning
+          // emitted by gcc when supplied with the -Wextra option.
+        : ParamIteratorInterface<T>(),
+          base_(other.base_),
+          iterator_(other.iterator_) {}
+
+    const ParamGeneratorInterface<T>* const base_;
+    typename ContainerType::const_iterator iterator_;
+    // A cached value of *iterator_. We keep it here to allow access by
+    // pointer in the wrapping iterator's operator->().
+    // value_ needs to be mutable to be accessed in Current().
+    // Use of scoped_ptr helps manage cached value's lifetime,
+    // which is bound by the lifespan of the iterator itself.
+    mutable scoped_ptr<const T> value_;
+  };  // class ValuesInIteratorRangeGenerator::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const ValuesInIteratorRangeGenerator& other);
+
+  const ContainerType container_;
+};  // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+  typedef typename TestClass::ParamType ParamType;
+  explicit ParameterizedTestFactory(ParamType parameter) :
+      parameter_(parameter) {}
+  virtual Test* CreateTest() {
+    TestClass::SetParam(&parameter_);
+    return new TestClass();
+  }
+
+ private:
+  const ParamType parameter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+  virtual ~TestMetaFactoryBase() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+    : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+  typedef typename TestCase::ParamType ParamType;
+
+  TestMetaFactory() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+    return new ParameterizedTestFactory<TestCase>(parameter);
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+  virtual ~ParameterizedTestCaseInfoBase() {}
+
+  // Base part of test case name for display purposes.
+  virtual const string& GetTestCaseName() const = 0;
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const = 0;
+  // UnitTest class invokes this method to register tests in this
+  // test case right before running them in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  virtual void RegisterTests() = 0;
+
+ protected:
+  ParameterizedTestCaseInfoBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+  // ParamType and GeneratorCreationFunc are private types but are required
+  // for declarations of public methods AddTestPattern() and
+  // AddTestCaseInstantiation().
+  typedef typename TestCase::ParamType ParamType;
+  // A function that returns an instance of appropriate generator type.
+  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+  explicit ParameterizedTestCaseInfo(const char* name)
+      : test_case_name_(name) {}
+
+  // Test case base name for display purposes.
+  virtual const string& GetTestCaseName() const { return test_case_name_; }
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+  // TEST_P macro uses AddTestPattern() to record information
+  // about a single test in a LocalTestInfo structure.
+  // test_case_name is the base name of the test case (without invocation
+  // prefix). test_base_name is the name of an individual test without
+  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+  // test case base name and DoBar is test base name.
+  void AddTestPattern(const char* test_case_name,
+                      const char* test_base_name,
+                      TestMetaFactoryBase<ParamType>* meta_factory) {
+    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+                                                       test_base_name,
+                                                       meta_factory)));
+  }
+  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+  // about a generator.
+  int AddTestCaseInstantiation(const string& instantiation_name,
+                               GeneratorCreationFunc* func,
+                               const char* /* file */,
+                               int /* line */) {
+    instantiations_.push_back(::std::make_pair(instantiation_name, func));
+    return 0;  // Return value used only to run this method in namespace scope.
+  }
+  // UnitTest class invokes this method to register tests in this test case
+  // test cases right before running tests in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  // UnitTest has a guard to prevent from calling this method more then once.
+  virtual void RegisterTests() {
+    for (typename TestInfoContainer::iterator test_it = tests_.begin();
+         test_it != tests_.end(); ++test_it) {
+      linked_ptr<TestInfo> test_info = *test_it;
+      for (typename InstantiationContainer::iterator gen_it =
+               instantiations_.begin(); gen_it != instantiations_.end();
+               ++gen_it) {
+        const string& instantiation_name = gen_it->first;
+        ParamGenerator<ParamType> generator((*gen_it->second)());
+
+        string test_case_name;
+        if ( !instantiation_name.empty() )
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
+
+        int i = 0;
+        for (typename ParamGenerator<ParamType>::iterator param_it =
+                 generator.begin();
+             param_it != generator.end(); ++param_it, ++i) {
+          Message test_name_stream;
+          test_name_stream << test_info->test_base_name << "/" << i;
+          MakeAndRegisterTestInfo(
+              test_case_name.c_str(),
+              test_name_stream.GetString().c_str(),
+              NULL,  // No type parameter.
+              PrintToString(*param_it).c_str(),
+              GetTestCaseTypeId(),
+              TestCase::SetUpTestCase,
+              TestCase::TearDownTestCase,
+              test_info->test_meta_factory->CreateTestFactory(*param_it));
+        }  // for param_it
+      }  // for gen_it
+    }  // for test_it
+  }  // RegisterTests
+
+ private:
+  // LocalTestInfo structure keeps information about a single test registered
+  // with TEST_P macro.
+  struct TestInfo {
+    TestInfo(const char* a_test_case_base_name,
+             const char* a_test_base_name,
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+        test_case_base_name(a_test_case_base_name),
+        test_base_name(a_test_base_name),
+        test_meta_factory(a_test_meta_factory) {}
+
+    const string test_case_base_name;
+    const string test_base_name;
+    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+  };
+  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+  // Keeps pairs of <Instantiation name, Sequence generator creation function>
+  // received from INSTANTIATE_TEST_CASE_P macros.
+  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+      InstantiationContainer;
+
+  const string test_case_name_;
+  TestInfoContainer tests_;
+  InstantiationContainer instantiations_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+};  // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+  ParameterizedTestCaseRegistry() {}
+  ~ParameterizedTestCaseRegistry() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      delete *it;
+    }
+  }
+
+  // Looks up or creates and returns a structure containing information about
+  // tests and instantiations of a particular test case.
+  template <class TestCase>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+      const char* test_case_name,
+      const char* file,
+      int line) {
+    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      if ((*it)->GetTestCaseName() == test_case_name) {
+        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+          // Complain about incorrect usage of Google Test facilities
+          // and terminate the program since we cannot guaranty correct
+          // test case setup and tear-down in this case.
+          ReportInvalidTestCaseType(test_case_name,  file, line);
+          posix::Abort();
+        } else {
+          // At this point we are sure that the object we found is of the same
+          // type we are looking for, so we downcast it to that type
+          // without further checks.
+          typed_test_info = CheckedDowncastToActualType<
+              ParameterizedTestCaseInfo<TestCase> >(*it);
+        }
+        break;
+      }
+    }
+    if (typed_test_info == NULL) {
+      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+      test_case_infos_.push_back(typed_test_info);
+    }
+    return typed_test_info;
+  }
+  void RegisterTests() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      (*it)->RegisterTests();
+    }
+  }
+
+ private:
+  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+  TestCaseInfoContainer test_case_infos_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray2& other);
+
+  const T1 v1_;
+  const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray3& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray4& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray5& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class ValueArray6 {
+ public:
+  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray6& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class ValueArray7 {
+ public:
+  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray7& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray8& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray9& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray10& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+class ValueArray11 {
+ public:
+  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray11& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+class ValueArray12 {
+ public:
+  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray12& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray13& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray14& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray15& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+class ValueArray16 {
+ public:
+  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray16& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+class ValueArray17 {
+ public:
+  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray17& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray18& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray19& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray20& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+class ValueArray21 {
+ public:
+  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray21& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+class ValueArray22 {
+ public:
+  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray22& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray23& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray24& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray25& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+class ValueArray26 {
+ public:
+  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray26& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+class ValueArray27 {
+ public:
+  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray27& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray28& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray29& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray30& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+class ValueArray31 {
+ public:
+  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray31& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+class ValueArray32 {
+ public:
+  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray32& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray33& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray34& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray35& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+class ValueArray36 {
+ public:
+  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray36& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+class ValueArray37 {
+ public:
+  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray37& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray38& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray39& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray40& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+class ValueArray41 {
+ public:
+  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray41& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+class ValueArray42 {
+ public:
+  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray42& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray43& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+      v43_(v43), v44_(v44) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray44& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray45& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+class ValueArray46 {
+ public:
+  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray46& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+class ValueArray47 {
+ public:
+  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+      v47_(v47) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray47& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+      v46_(v46), v47_(v47), v48_(v48) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray48& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray49& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray50& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+  const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2)
+      : g1_(g1), g2_(g2) {}
+  virtual ~CartesianProductGenerator2() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current2_;
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator2::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator2& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+};  // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  virtual ~CartesianProductGenerator3() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current3_;
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator3::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator3& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+};  // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  virtual ~CartesianProductGenerator4() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current4_;
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator4::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator4& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+};  // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  virtual ~CartesianProductGenerator5() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current5_;
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator5::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator5& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+};  // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class CartesianProductGenerator6
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+        T6> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  virtual ~CartesianProductGenerator6() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current6_;
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator6::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator6& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+};  // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class CartesianProductGenerator7
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  virtual ~CartesianProductGenerator7() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current7_;
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator7::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator7& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+};  // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  virtual ~CartesianProductGenerator8() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current8_;
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator8::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator8& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+};  // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  virtual ~CartesianProductGenerator9() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current9_;
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator9::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator9& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+};  // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9, T10> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+      const ParamGenerator<T10>& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  virtual ~CartesianProductGenerator10() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9,
+      const ParamGenerator<T10>& g10,
+      const typename ParamGenerator<T10>::iterator& current10)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current10_;
+      if (current10_ == end10_) {
+        current10_ = begin10_;
+        ++current9_;
+      }
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_ &&
+          current10_ == typed_other->current10_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_),
+        begin10_(other.begin10_),
+        end10_(other.end10_),
+        current10_(other.current10_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_, *current10_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_ ||
+          current10_ == end10_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    const typename ParamGenerator<T10>::iterator begin10_;
+    const typename ParamGenerator<T10>::iterator end10_;
+    typename ParamGenerator<T10>::iterator current10_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator10::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator10& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+  const ParamGenerator<T10> g10_;
+};  // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+      : g1_(g1), g2_(g2) {}
+  template <typename T1, typename T2>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+        new CartesianProductGenerator2<T1, T2>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder2& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+};  // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  template <typename T1, typename T2, typename T3>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+        new CartesianProductGenerator3<T1, T2, T3>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder3& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+};  // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  template <typename T1, typename T2, typename T3, typename T4>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+        new CartesianProductGenerator4<T1, T2, T3, T4>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder4& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+};  // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder5& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+};  // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder6& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+};  // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+      T7> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder7& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+};  // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+      T8> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder8& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+};  // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9> >(
+        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder9& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+};  // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9, const Generator10& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9, typename T10>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9, T10> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9, T10> >(
+        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+            T10>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_),
+        static_cast<ParamGenerator<T10> >(g10_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder10& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+  const Generator10 g10_;
+};  // class CartesianProductHolder10
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+  return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+  return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5) {
+  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6) {
+  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7) {
+  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+      v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+      v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11) {
+  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12) {
+  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13) {
+  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16) {
+  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17) {
+  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18) {
+  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22) {
+  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23) {
+  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24) {
+  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26) {
+  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27) {
+  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28) {
+  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29) {
+  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32) {
+  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33) {
+  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34) {
+  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37) {
+  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38) {
+  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+      v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38, T39 v39) {
+  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+      v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42) {
+  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+      v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43) {
+  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+      v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43, T44 v44) {
+  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+      v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+      v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+    T48 v48) {
+  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+    T47 v47, T48 v48, T49 v49) {
+  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+      v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+    const Generator1& g1, const Generator2& g2) {
+  return internal::CartesianProductHolder2<Generator1, Generator2>(
+      g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+      g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+    Generator4> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4) {
+  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+      Generator4>(
+      g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+    Generator4, Generator5> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5) {
+  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+      Generator4, Generator5>(
+      g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6>(
+      g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7) {
+  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7>(
+      g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8) {
+  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8>(
+      g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8,
+    Generator9> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9,
+    typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+    Generator10> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9,
+        const Generator10& g10) {
+  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+      Generator10>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class.  For example:
+//
+// class MyClass {
+//  private:
+//   void MyMethod();
+//   FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+//   // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+//   // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+  // The possible outcomes of a test part (i.e. an assertion or an
+  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+  enum Type {
+    kSuccess,          // Succeeded.
+    kNonFatalFailure,  // Failed but the test can continue.
+    kFatalFailure      // Failed and the test should be terminated.
+  };
+
+  // C'tor.  TestPartResult does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestPartResult object.
+  TestPartResult(Type a_type,
+                 const char* a_file_name,
+                 int a_line_number,
+                 const char* a_message)
+      : type_(a_type),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
+        line_number_(a_line_number),
+        summary_(ExtractSummary(a_message)),
+        message_(a_message) {
+  }
+
+  // Gets the outcome of the test part.
+  Type type() const { return type_; }
+
+  // Gets the name of the source file where the test part took place, or
+  // NULL if it's unknown.
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
+
+  // Gets the line in the source file where the test part took place,
+  // or -1 if it's unknown.
+  int line_number() const { return line_number_; }
+
+  // Gets the summary of the failure message.
+  const char* summary() const { return summary_.c_str(); }
+
+  // Gets the message associated with the test part.
+  const char* message() const { return message_.c_str(); }
+
+  // Returns true iff the test part passed.
+  bool passed() const { return type_ == kSuccess; }
+
+  // Returns true iff the test part failed.
+  bool failed() const { return type_ != kSuccess; }
+
+  // Returns true iff the test part non-fatally failed.
+  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+  // Returns true iff the test part fatally failed.
+  bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+  Type type_;
+
+  // Gets the summary of the failure message by omitting the stack
+  // trace in it.
+  static std::string ExtractSummary(const char* message);
+
+  // The name of the source file where the test part took place, or
+  // "" if the source file is unknown.
+  std::string file_name_;
+  // The line in the source file where the test part took place, or -1
+  // if the line number is unknown.
+  int line_number_;
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+  TestPartResultArray() {}
+
+  // Appends the given TestPartResult to the array.
+  void Append(const TestPartResult& result);
+
+  // Returns the TestPartResult at the given index (0-based).
+  const TestPartResult& GetTestPartResult(int index) const;
+
+  // Returns the number of TestPartResult objects in the array.
+  int size() const;
+
+ private:
+  std::vector<TestPartResult> array_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+  virtual ~TestPartResultReporterInterface() {}
+
+  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+    : public TestPartResultReporterInterface {
+ public:
+  HasNewFatalFailureHelper();
+  virtual ~HasNewFatalFailureHelper();
+  virtual void ReportTestPartResult(const TestPartResult& result);
+  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+  bool has_new_fatal_failure_;
+  TestPartResultReporterInterface* original_reporter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list.  You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+  ...
+  typedef std::list<T> List;
+  static T shared_;
+  T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list.  The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  // Since we are inside a derived class template, C++ requires use to
+  // visit the members of FooTest via 'this'.
+  TypeParam n = this->value_;
+
+  // To visit static members of the fixture, add the TestFixture::
+  // prefix.
+  n += TestFixture::shared_;
+
+  // To refer to typedefs in the fixture, add the "typename
+  // TestFixture::" prefix.
+  typename TestFixture::List values;
+  values.push_back(n);
+  ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif  // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type.  Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are.  The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have.  Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly.  Here's an example:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+  ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  TypeParam n = 0;
+  ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them.  The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+                           DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want.  If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name.  Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif  // 0
+
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+  typedef ::testing::internal::TypeList< Types >::type \
+      GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+  template <typename gtest_TypeParam_> \
+  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+      : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTest< \
+          CaseName, \
+          ::testing::internal::TemplateSel< \
+              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+              "", #CaseName, #TestName, 0); \
+  template <typename gtest_TypeParam_> \
+  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in.  The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+  gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+  gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+  gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+  static ::testing::internal::TypedTestCasePState \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  template <typename gtest_TypeParam_> \
+  class TestName : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+          __FILE__, __LINE__, #CaseName, #TestName); \
+  } \
+  template <typename gtest_TypeParam_> \
+  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+  } \
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+          __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTestCase<CaseName, \
+          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+          ::testing::internal::TypeList< Types >::type>::Register(\
+              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message);
+
+}  // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful.  When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+//   1. Defining predicate functions to be used with Boolean test assertions
+//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+//   2. Defining predicate-format functions to be
+//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false (5 is odd)
+//   Expected: true
+//
+// instead of a more opaque
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false
+//   Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess() << n << " is even";
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+//   Value of: IsEven(Fib(6))
+//     Actual: true (8 is even)
+//   Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+//   // Verifies that Foo() returns an even number.
+//   EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+//   testing::AssertionResult IsEven(const char* expr, int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure()
+//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
+//   }
+//
+// If Foo() returns 5, you will see the following message:
+//
+//   Expected: Foo() is even
+//     Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+  // Copy constructor.
+  // Used in EXPECT_TRUE/FALSE(assertion_result).
+  AssertionResult(const AssertionResult& other);
+  // Used in the EXPECT_TRUE/FALSE(bool_expression).
+  explicit AssertionResult(bool success) : success_(success) {}
+
+  // Returns true iff the assertion succeeded.
+  operator bool() const { return success_; }  // NOLINT
+
+  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+  AssertionResult operator!() const;
+
+  // Returns the text streamed into this AssertionResult. Test assertions
+  // use it when they fail (i.e., the predicate's outcome doesn't match the
+  // assertion's expectation). When nothing has been streamed into the
+  // object, returns an empty string.
+  const char* message() const {
+    return message_.get() != NULL ?  message_->c_str() : "";
+  }
+  // TODO(vladl at google.com): Remove this after making sure no clients use it.
+  // Deprecated; please use message() instead.
+  const char* failure_message() const { return message(); }
+
+  // Streams a custom failure message into this object.
+  template <typename T> AssertionResult& operator<<(const T& value) {
+    AppendMessage(Message() << value);
+    return *this;
+  }
+
+  // Allows streaming basic output manipulators such as endl or flush into
+  // this object.
+  AssertionResult& operator<<(
+      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+    AppendMessage(Message() << basic_manipulator);
+    return *this;
+  }
+
+ private:
+  // Appends the contents of message to message_.
+  void AppendMessage(const Message& a_message) {
+    if (message_.get() == NULL)
+      message_.reset(new ::std::string);
+    message_->append(a_message.GetString().c_str());
+  }
+
+  // Stores result of the assertion predicate.
+  bool success_;
+  // Stores the message describing the condition in case the expectation
+  // construct is not satisfied with the predicate's outcome.
+  // Referenced via a pointer to avoid taking too much stack frame space
+  // with test assertions.
+  internal::scoped_ptr< ::std::string> message_;
+
+  GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F.  For example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { ... }
+//     virtual void TearDown() { ... }
+//     ...
+//   };
+//
+//   TEST_F(FooTest, Bar) { ... }
+//   TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+  friend class TestInfo;
+
+  // Defines types for pointers to functions that set up and tear down
+  // a test case.
+  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+  // The d'tor is virtual as we intend to inherit from Test.
+  virtual ~Test();
+
+  // Sets up the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::SetUpTestCase() before running the first
+  // test in test case Foo.  Hence a sub-class can define its own
+  // SetUpTestCase() method to shadow the one defined in the super
+  // class.
+  static void SetUpTestCase() {}
+
+  // Tears down the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::TearDownTestCase() after running the last
+  // test in test case Foo.  Hence a sub-class can define its own
+  // TearDownTestCase() method to shadow the one defined in the super
+  // class.
+  static void TearDownTestCase() {}
+
+  // Returns true iff the current test has a fatal failure.
+  static bool HasFatalFailure();
+
+  // Returns true iff the current test has a non-fatal failure.
+  static bool HasNonfatalFailure();
+
+  // Returns true iff the current test has a (either fatal or
+  // non-fatal) failure.
+  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
+
+ protected:
+  // Creates a Test object.
+  Test();
+
+  // Sets up the test fixture.
+  virtual void SetUp();
+
+  // Tears down the test fixture.
+  virtual void TearDown();
+
+ private:
+  // Returns true iff the current test has the same fixture class as
+  // the first test in the current test case.
+  static bool HasSameFixtureClass();
+
+  // Runs the test after the test fixture has been set up.
+  //
+  // A sub-class must implement this to define the test logic.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+  // Instead, use the TEST or TEST_F macro.
+  virtual void TestBody() = 0;
+
+  // Sets up, executes, and tears down the test.
+  void Run();
+
+  // Deletes self.  We deliberately pick an unusual name for this
+  // internal method to avoid clashing with names used in user TESTs.
+  void DeleteSelf_() { delete this; }
+
+  // Uses a GTestFlagSaver to save and restore all Google Test flags.
+  const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+  // Often a user mis-spells SetUp() as Setup() and spends a long time
+  // wondering why it is never called by Google Test.  The declaration of
+  // the following method is solely for catching such an error at
+  // compile time:
+  //
+  //   - The return type is deliberately chosen to be not void, so it
+  //   will be a conflict if a user declares void Setup() in his test
+  //   fixture.
+  //
+  //   - This method is private, so it will be another compiler error
+  //   if a user calls it from his test fixture.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION.
+  //
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+  // We disallow copying Tests.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+  // C'tor.  TestProperty does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestProperty object.
+  TestProperty(const std::string& a_key, const std::string& a_value) :
+    key_(a_key), value_(a_value) {
+  }
+
+  // Gets the user supplied key.
+  const char* key() const {
+    return key_.c_str();
+  }
+
+  // Gets the user supplied value.
+  const char* value() const {
+    return value_.c_str();
+  }
+
+  // Sets a new value, overriding the one supplied in the constructor.
+  void SetValue(const std::string& new_value) {
+    value_ = new_value;
+  }
+
+ private:
+  // The key supplied by the user.
+  std::string key_;
+  // The value supplied by the user.
+  std::string value_;
+};
+
+// The result of a single Test.  This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+  // Creates an empty TestResult.
+  TestResult();
+
+  // D'tor.  Do not inherit from TestResult.
+  ~TestResult();
+
+  // Gets the number of all test parts.  This is the sum of the number
+  // of successful test parts and the number of failed test parts.
+  int total_part_count() const;
+
+  // Returns the number of the test properties.
+  int test_property_count() const;
+
+  // Returns true iff the test passed (i.e. no test part failed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test failed.
+  bool Failed() const;
+
+  // Returns true iff the test fatally failed.
+  bool HasFatalFailure() const;
+
+  // Returns true iff the test has a non-fatal failure.
+  bool HasNonfatalFailure() const;
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test part result among all the results. i can range
+  // from 0 to test_property_count() - 1. If i is not in that range, aborts
+  // the program.
+  const TestPartResult& GetTestPartResult(int i) const;
+
+  // Returns the i-th test property. i can range from 0 to
+  // test_property_count() - 1. If i is not in that range, aborts the
+  // program.
+  const TestProperty& GetTestProperty(int i) const;
+
+ private:
+  friend class TestInfo;
+  friend class TestCase;
+  friend class UnitTest;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::ExecDeathTest;
+  friend class internal::TestResultAccessor;
+  friend class internal::UnitTestImpl;
+  friend class internal::WindowsDeathTest;
+
+  // Gets the vector of TestPartResults.
+  const std::vector<TestPartResult>& test_part_results() const {
+    return test_part_results_;
+  }
+
+  // Gets the vector of TestProperties.
+  const std::vector<TestProperty>& test_properties() const {
+    return test_properties_;
+  }
+
+  // Sets the elapsed time.
+  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+  // Adds a test property to the list. The property is validated and may add
+  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+  // key names). If a property is already recorded for the same key, the
+  // value will be updated, rather than storing multiple values for the same
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
+
+  // Adds a failure if the key is a reserved attribute of Google Test
+  // testcase tags.  Returns true if the property is valid.
+  // TODO(russr): Validate attribute names are legal and human readable.
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
+
+  // Adds a test part result to the list.
+  void AddTestPartResult(const TestPartResult& test_part_result);
+
+  // Returns the death test count.
+  int death_test_count() const { return death_test_count_; }
+
+  // Increments the death test count, returning the new count.
+  int increment_death_test_count() { return ++death_test_count_; }
+
+  // Clears the test part results.
+  void ClearTestPartResults();
+
+  // Clears the object.
+  void Clear();
+
+  // Protects mutable state of the property vector and of owned
+  // properties, whose values may be updated.
+  internal::Mutex test_properites_mutex_;
+
+  // The vector of TestPartResults
+  std::vector<TestPartResult> test_part_results_;
+  // The vector of TestProperties
+  std::vector<TestProperty> test_properties_;
+  // Running count of death tests.
+  int death_test_count_;
+  // The elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+  // We disallow copying TestResult.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+};  // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+//   Test case name
+//   Test name
+//   Whether the test should be run
+//   A function pointer that creates the test object when invoked
+//   Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+  // Destructs a TestInfo object.  This function is not virtual, so
+  // don't inherit from TestInfo.
+  ~TestInfo();
+
+  // Returns the test case name.
+  const char* test_case_name() const { return test_case_name_.c_str(); }
+
+  // Returns the test name.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a typed
+  // or a type-parameterized test.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns the text representation of the value parameter, or NULL if this
+  // is not a value-parameterized test.
+  const char* value_param() const {
+    if (value_param_.get() != NULL)
+      return value_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
+  //
+  // Google Test allows the user to filter the tests by their full names.
+  // The full name of a test Bar in test case Foo is defined as
+  // "Foo.Bar".  Only the tests that match the filter will run.
+  //
+  // A filter is a colon-separated list of glob (not regex) patterns,
+  // optionally followed by a '-' and a colon-separated list of
+  // negative patterns (tests to exclude).  A test is run if it
+  // matches one of the positive patterns and does not match any of
+  // the negative patterns.
+  //
+  // For example, *A*:Foo.* is a filter that matches any string that
+  // contains the character 'A' or starts with "Foo.".
+  bool should_run() const { return should_run_; }
+
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
+  // Returns the result of the test.
+  const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+  friend class internal::DefaultDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+  friend class Test;
+  friend class TestCase;
+  friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
+  friend TestInfo* internal::MakeAndRegisterTestInfo(
+      const char* test_case_name,
+      const char* name,
+      const char* type_param,
+      const char* value_param,
+      internal::TypeId fixture_class_id,
+      Test::SetUpTestCaseFunc set_up_tc,
+      Test::TearDownTestCaseFunc tear_down_tc,
+      internal::TestFactoryBase* factory);
+
+  // Constructs a TestInfo object. The newly constructed instance assumes
+  // ownership of the factory object.
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
+           internal::TypeId fixture_class_id,
+           internal::TestFactoryBase* factory);
+
+  // Increments the number of death tests encountered in this test so
+  // far.
+  int increment_death_test_count() {
+    return result_.increment_death_test_count();
+  }
+
+  // Creates the test object, runs it, records its result, and then
+  // deletes it.
+  void Run();
+
+  static void ClearTestResult(TestInfo* test_info) {
+    test_info->result_.Clear();
+  }
+
+  // These fields are immutable properties of the test.
+  const std::string test_case_name_;     // Test case name
+  const std::string name_;               // Test name
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // Text representation of the value parameter, or NULL if this is not a
+  // value-parameterized test.
+  const internal::scoped_ptr<const ::std::string> value_param_;
+  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
+  bool should_run_;                 // True iff this test should run
+  bool is_disabled_;                // True iff this test is disabled
+  bool matches_filter_;             // True if this test matches the
+                                    // user-specified filter.
+  internal::TestFactoryBase* const factory_;  // The factory that creates
+                                              // the test object
+
+  // This field is mutable and needs to be reset before running the
+  // test for the second time.
+  TestResult result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+  // Creates a TestCase with the given name.
+  //
+  // TestCase does NOT have a default constructor.  Always use this
+  // constructor to create a TestCase object.
+  //
+  // Arguments:
+  //
+  //   name:         name of the test case
+  //   a_type_param: the name of the test's type parameter, or NULL if
+  //                 this is not a type-parameterized test.
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  TestCase(const char* name, const char* a_type_param,
+           Test::SetUpTestCaseFunc set_up_tc,
+           Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Destructor of TestCase.
+  virtual ~TestCase();
+
+  // Gets the name of the TestCase.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a
+  // type-parameterized test case.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if any test in this test case should run.
+  bool should_run() const { return should_run_; }
+
+  // Gets the number of successful tests in this test case.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests in this test case.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests in this test case.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Get the number of tests in this test case that should run.
+  int test_to_run_count() const;
+
+  // Gets the number of all tests in this test case.
+  int total_test_count() const;
+
+  // Returns true iff the test case passed.
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test case failed.
+  bool Failed() const { return failed_test_count() > 0; }
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  const TestInfo* GetTestInfo(int i) const;
+
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+  friend class Test;
+  friend class internal::UnitTestImpl;
+
+  // Gets the (mutable) vector of TestInfos in this TestCase.
+  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+  // Gets the (immutable) vector of TestInfos in this TestCase.
+  const std::vector<TestInfo*>& test_info_list() const {
+    return test_info_list_;
+  }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  TestInfo* GetMutableTestInfo(int i);
+
+  // Sets the should_run member.
+  void set_should_run(bool should) { should_run_ = should; }
+
+  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
+  // destruction of the TestCase object.
+  void AddTestInfo(TestInfo * test_info);
+
+  // Clears the results of all tests in this test case.
+  void ClearResult();
+
+  // Clears the results of all tests in the given test case.
+  static void ClearTestCaseResult(TestCase* test_case) {
+    test_case->ClearResult();
+  }
+
+  // Runs every test in this TestCase.
+  void Run();
+
+  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
+  // for catching exceptions thrown from SetUpTestCase().
+  void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+  // Runs TearDownTestCase() for this TestCase.  This wrapper is
+  // needed for catching exceptions thrown from TearDownTestCase().
+  void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+  // Returns true iff test passed.
+  static bool TestPassed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Passed();
+  }
+
+  // Returns true iff test failed.
+  static bool TestFailed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Failed();
+  }
+
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
+  // Returns true iff test is disabled.
+  static bool TestDisabled(const TestInfo* test_info) {
+    return test_info->is_disabled_;
+  }
+
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
+  // Returns true if the given test should run.
+  static bool ShouldRunTest(const TestInfo* test_info) {
+    return test_info->should_run();
+  }
+
+  // Shuffles the tests in this test case.
+  void ShuffleTests(internal::Random* random);
+
+  // Restores the test order to before the first shuffle.
+  void UnshuffleTests();
+
+  // Name of the test case.
+  std::string name_;
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // The vector of TestInfos in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestInfo*> test_info_list_;
+  // Provides a level of indirection for the test list to allow easy
+  // shuffling and restoring the test order.  The i-th element in this
+  // vector is the index of the i-th test in the shuffled test list.
+  std::vector<int> test_indices_;
+  // Pointer to the function that sets up the test case.
+  Test::SetUpTestCaseFunc set_up_tc_;
+  // Pointer to the function that tears down the test case.
+  Test::TearDownTestCaseFunc tear_down_tc_;
+  // True iff any test in this test case should run.
+  bool should_run_;
+  // Elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
+
+  // We disallow copying TestCases.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment.  The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+//   1. You cannot safely throw from a destructor.  This is a problem
+//      as in some cases Google Test is used where exceptions are enabled, and
+//      we may want to implement ASSERT_* using exceptions where they are
+//      available.
+//   2. You cannot use ASSERT_* directly in a constructor or
+//      destructor.
+class Environment {
+ public:
+  // The d'tor is virtual as we need to subclass Environment.
+  virtual ~Environment() {}
+
+  // Override this to define how to set up the environment.
+  virtual void SetUp() {}
+
+  // Override this to define how to tear down the environment.
+  virtual void TearDown() {}
+ private:
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+  virtual ~TestEventListener() {}
+
+  // Fired before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+  // Fired before each iteration of tests starts.  There may be more than
+  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+  // index, starting from 0.
+  virtual void OnTestIterationStart(const UnitTest& unit_test,
+                                    int iteration) = 0;
+
+  // Fired before environment set-up for each iteration of tests starts.
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment set-up for each iteration of tests ends.
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+  // Fired before the test case starts.
+  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+  // Fired before the test starts.
+  virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+  // Fired after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+  // Fired after the test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+  // Fired after the test case ends.
+  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+  // Fired before environment tear-down for each iteration of tests starts.
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment tear-down for each iteration of tests ends.
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+  // Fired after each iteration of tests finishes.
+  virtual void OnTestIterationEnd(const UnitTest& unit_test,
+                                  int iteration) = 0;
+
+  // Fired after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build.  For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {}
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {}
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+  TestEventListeners();
+  ~TestEventListeners();
+
+  // Appends an event listener to the end of the list. Google Test assumes
+  // the ownership of the listener (i.e. it will delete the listener when
+  // the test program finishes).
+  void Append(TestEventListener* listener);
+
+  // Removes the given event listener from the list and returns it.  It then
+  // becomes the caller's responsibility to delete the listener. Returns
+  // NULL if the listener is not found in the list.
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Returns the standard listener responsible for the default console
+  // output.  Can be removed from the listeners list to shut down default
+  // console output.  Note that removing this object from the listener list
+  // with Release transfers its ownership to the caller and makes this
+  // function return NULL the next time.
+  TestEventListener* default_result_printer() const {
+    return default_result_printer_;
+  }
+
+  // Returns the standard listener responsible for the default XML output
+  // controlled by the --gtest_output=xml flag.  Can be removed from the
+  // listeners list by users who want to shut down the default XML output
+  // controlled by this flag and substitute it with custom one.  Note that
+  // removing this object from the listener list with Release transfers its
+  // ownership to the caller and makes this function return NULL the next
+  // time.
+  TestEventListener* default_xml_generator() const {
+    return default_xml_generator_;
+  }
+
+ private:
+  friend class TestCase;
+  friend class TestInfo;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::NoExecDeathTest;
+  friend class internal::TestEventListenersAccessor;
+  friend class internal::UnitTestImpl;
+
+  // Returns repeater that broadcasts the TestEventListener events to all
+  // subscribers.
+  TestEventListener* repeater();
+
+  // Sets the default_result_printer attribute to the provided listener.
+  // The listener is also added to the listener list and previous
+  // default_result_printer is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultResultPrinter(TestEventListener* listener);
+
+  // Sets the default_xml_generator attribute to the provided listener.  The
+  // listener is also added to the listener list and previous
+  // default_xml_generator is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultXmlGenerator(TestEventListener* listener);
+
+  // Controls whether events will be forwarded by the repeater to the
+  // listeners in the list.
+  bool EventForwardingEnabled() const;
+  void SuppressEventForwarding();
+
+  // The actual list of listeners.
+  internal::TestEventRepeater* repeater_;
+  // Listener responsible for the standard result output.
+  TestEventListener* default_result_printer_;
+  // Listener responsible for the creation of the XML output file.
+  TestEventListener* default_xml_generator_;
+
+  // We disallow copying TestEventListeners.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class.  The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called.  This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+  // Gets the singleton UnitTest object.  The first time this method
+  // is called, a UnitTest object is constructed and returned.
+  // Consecutive calls will return the same object.
+  static UnitTest* GetInstance();
+
+  // Runs all tests in this UnitTest object and prints the result.
+  // Returns 0 if successful, or 1 otherwise.
+  //
+  // This method can only be called from the main thread.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  int Run() GTEST_MUST_USE_RESULT_;
+
+  // Returns the working directory when the first TEST() or TEST_F()
+  // was executed.  The UnitTest object owns the string.
+  const char* original_working_dir() const;
+
+  // Returns the TestCase object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the TestInfo object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the random seed used at the start of the current test run.
+  int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns the ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const;
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const;
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const;
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const;
+
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
+  // Returns the list of event listeners that can be used to track events
+  // inside Google Test.
+  TestEventListeners& listeners();
+
+ private:
+  // Registers and returns a global test environment.  When a test
+  // program is run, all global test environments will be set-up in
+  // the order they were registered.  After all tests in the program
+  // have finished, all global test environments will be torn-down in
+  // the *reverse* order they were registered.
+  //
+  // The UnitTest object takes ownership of the given environment.
+  //
+  // This method can only be called from the main thread.
+  Environment* AddEnvironment(Environment* env);
+
+  // Adds a TestPartResult to the current TestResult object.  All
+  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+  // eventually call this to report their results.  The user code
+  // should use the assertion macros instead of calling this directly.
+  void AddTestPartResult(TestPartResult::Type result_type,
+                         const char* file_name,
+                         int line_number,
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i);
+
+  // Accessors for the implementation object.
+  internal::UnitTestImpl* impl() { return impl_; }
+  const internal::UnitTestImpl* impl() const { return impl_; }
+
+  // These classes and funcions are friends as they need to access private
+  // members of UnitTest.
+  friend class Test;
+  friend class internal::AssertHelper;
+  friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
+  friend Environment* AddGlobalTestEnvironment(Environment* env);
+  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+  friend void internal::ReportFailureInUnknownLocation(
+      TestPartResult::Type result_type,
+      const std::string& message);
+
+  // Creates an empty UnitTest.
+  UnitTest();
+
+  // D'tor
+  virtual ~UnitTest();
+
+  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+  // Google Test trace stack.
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Pops a trace from the per-thread Google Test trace stack.
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Protects mutable state in *impl_.  This is mutable as some const
+  // methods need to lock it too.
+  mutable internal::Mutex mutex_;
+
+  // Opaque implementation object.  This field is never changed once
+  // the object is constructed.  We don't mark it as const here, as
+  // doing so will cause a warning in the constructor of UnitTest.
+  // Mutable state in *impl_ is protected by mutex_.
+  internal::UnitTestImpl* impl_;
+
+  // We disallow copying UnitTest.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main().  If you use gtest_main, you need to call this before main()
+// starts for it to take effect.  For example, you can define a global
+// variable like this:
+//
+//   testing::Environment* const foo_env =
+//       testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+  return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message.  The type (but not value)
+// of the other operand may affect the format.  This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            const T1& expected,
+                            const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4389)  // Temporarily disables warning on
+                                // signed/unsigned mismatch.
+#endif
+
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)          // Restores the warning state.
+#endif
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+                                       const char* actual_expression,
+                                       BiggestInt expected,
+                                       BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal.  The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+  // This templatized version is for the general case.
+  template <typename T1, typename T2>
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 const T1& expected,
+                                 const T2& actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // With this overloaded version, we allow anonymous enums to be used
+  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+  // enums can be implicitly cast to BiggestInt.
+  //
+  // Even though its body looks the same as the above version, we
+  // cannot merge the two, as it will make anonymous enums unhappy.
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 BiggestInt expected,
+                                 BiggestInt actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+  // We define two overloaded versions of Compare().  The first
+  // version will be picked when the second argument to ASSERT_EQ() is
+  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+  // EXPECT_EQ(false, a_bool).
+  template <typename T1, typename T2>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      const T1& expected,
+      const T2& actual,
+      // The following line prevents this overload from being considered if T2
+      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
+      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+      // to match the Secret* in the other overload, which would otherwise make
+      // this template match better.
+      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // This version will be picked when the second argument to ASSERT_EQ() is a
+  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+  template <typename T>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      // We used to have a second template parameter instead of Secret*.  That
+      // template parameter would deduce to 'long', making this a better match
+      // than the first overload even without the first overload's EnableIf.
+      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+      // non-pointer argument" (even a deduced integral argument), so the old
+      // implementation caused warnings in user code.
+      Secret* /* expected (NULL) */,
+      T* actual) {
+    // We already know that 'expected' is a null pointer.
+    return CmpHelperEQ(expected_expression, actual_expression,
+                       static_cast<T*>(NULL), actual);
+  }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   const T1& val1, const T2& val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const char* expected,
+                                          const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                              const char* actual_expression,
+                                              const char* expected,
+                                              const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const char* s1,
+                                          const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                              const char* s2_expression,
+                                              const char* s1,
+                                              const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const wchar_t* expected,
+                                          const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const wchar_t* s1,
+                                          const wchar_t* s2);
+
+}  // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves.  They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+                                         const char* actual_expression,
+                                         RawType expected,
+                                         RawType actual) {
+  const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  ::std::stringstream expected_ss;
+  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+              << expected;
+
+  ::std::stringstream actual_ss;
+  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+            << actual;
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   StringStreamToString(&expected_ss),
+                   StringStreamToString(&actual_ss),
+                   false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+                                                const char* expr2,
+                                                const char* abs_error_expr,
+                                                double val1,
+                                                double val2,
+                                                double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+  // Constructor.
+  AssertHelper(TestPartResult::Type type,
+               const char* file,
+               int line,
+               const char* message);
+  ~AssertHelper();
+
+  // Message assignment is a semantic trick to enable assertion
+  // streaming; see the GTEST_MESSAGE_ macro below.
+  void operator=(const Message& message) const;
+
+ private:
+  // We put our data in a struct so that the size of the AssertHelper class can
+  // be as small as possible.  This is important because gcc is incapable of
+  // re-using stack space even for temporary variables, so every EXPECT_EQ
+  // reserves stack space for another AssertHelper.
+  struct AssertHelperData {
+    AssertHelperData(TestPartResult::Type t,
+                     const char* srcfile,
+                     int line_num,
+                     const char* msg)
+        : type(t), file(srcfile), line(line_num), message(msg) { }
+
+    TestPartResult::Type const type;
+    const char* const file;
+    int const line;
+    std::string const message;
+
+   private:
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+  };
+
+  AssertHelperData* const data_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+}  // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+//  protected:
+//   FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual ~FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void SetUp() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void TearDown {
+//     // Can use GetParam() here.
+//   }
+// };
+// TEST_P(FooTest, DoesBar) {
+//   // Can use GetParam() method here.
+//   Foo foo;
+//   ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+  typedef T ParamType;
+  virtual ~WithParamInterface() {}
+
+  // The current parameter value. Is also available in the test fixture's
+  // constructor. This member function is non-static, even though it only
+  // references static data, to reduce the opportunity for incorrect uses
+  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+  // uses a fixture whose parameter type is int.
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
+
+ private:
+  // Sets parameter value. The caller is responsible for making sure the value
+  // remains alive and unchanged throughout the current test.
+  static void SetParam(const ParamType* parameter) {
+    parameter_ = parameter;
+  }
+
+  // Static value used for accessing parameter during a test lifetime.
+  static const ParamType* parameter_;
+
+  // TestClass must be a subclass of WithParamInterface<T> and Test.
+  template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied.  If not,
+// it behaves like ADD_FAILURE.  In particular:
+//
+//   EXPECT_TRUE  verifies that a Boolean condition is true.
+//   EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure.  People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+  GTEST_MESSAGE_AT_(file, line, "Failed", \
+                    ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+//         Tests that the statement throws the expected exception.
+//    * {ASSERT|EXPECT}_NO_THROW(statement):
+//         Tests that the statement doesn't throw any exception.
+//    * {ASSERT|EXPECT}_ANY_THROW(statement):
+//         Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \
+    ; \
+  else \
+    on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+                                  const char* e1,
+                                  Pred pred,
+                                  const T1& v1) {
+  if (pred(v1)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+                                             #v1, \
+                                             pred, \
+                                             v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2) {
+  if (pred(v1, v2)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             pred, \
+                                             v1, \
+                                             v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3) {
+  if (pred(v1, v2, v3)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4) {
+  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4,
+          typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  const char* e5,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4,
+                                  const T5& v5) {
+  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ", "
+                            << e5 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4
+                            << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             #v5, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4, \
+                                             v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Macros for testing equalities and inequalities.
+//
+//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
+//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
+//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
+//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
+//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values.  The values must be compatible built-in types,
+// or you will get a compiler error.  By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+//   1. It is possible to make a user-defined type work with
+//   {ASSERT|EXPECT}_??(), but that requires overloading the
+//   comparison operators and is thus discouraged by the Google C++
+//   Usage Guide.  Therefore, you are advised to use the
+//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+//   equal.
+//
+//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+//   pointers (in particular, C strings).  Therefore, if you use it
+//   with two C strings, you are testing how their locations in memory
+//   are related, not how their content is related.  To compare two C
+//   strings by content, use {ASSERT|EXPECT}_STR*().
+//
+//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+//   what the actual value is when it fails, and similarly for the
+//   other comparisons.
+//
+//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+//   evaluate their arguments, which is undefined.
+//
+//   5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+//   EXPECT_NE(5, Foo());
+//   EXPECT_EQ(NULL, a_pointer);
+//   ASSERT_LT(i, array_size);
+//   ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define EXPECT_NE(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
+// as different.  Two NULLs are equal.
+//
+//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
+//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
+//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+//         Tests that two float values are almost equal.
+//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+//         Tests that two double values are almost equal.
+//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+//         Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands.  See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+                                   float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                                    double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif  // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+//   EXPECT_NO_FATAL_FAILURE(Process());
+//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope.  The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+    __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type.  The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template.  This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated.  For example, given:
+//
+//   template <typename T> class Foo {
+//    public:
+//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+//   };
+//
+// the code:
+//
+//   void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated.  Instead, you need:
+//
+//   void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+  return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test".  For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro.  Example:
+//
+//   TEST(FooTest, InitializesCorrectly) {
+//     Foo foo;
+//     EXPECT_TRUE(foo.StatusIsOK());
+//   }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test.  This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X.  The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code.  GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+  GTEST_TEST_(test_case_name, test_name, \
+              ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name.  The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier.  The user should put
+// his test code between braces after using this macro.  Example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { b_.AddElement(3); }
+//
+//     Foo a_;
+//     Foo b_;
+//   };
+//
+//   TEST_F(FooTest, InitializesCorrectly) {
+//     EXPECT_TRUE(a_.StatusIsOK());
+//   }
+//
+//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
+//     EXPECT_EQ(0, a_.size());
+//     EXPECT_EQ(1, b_.size());
+//   }
+
+#define TEST_F(test_fixture, test_name)\
+  GTEST_TEST_(test_fixture, test_name, test_fixture, \
+              ::testing::internal::GetTypeId<test_fixture>())
+
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest_main.cc b/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest_main.cc
new file mode 100644
index 0000000..f302822
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/fused-src/gtest/gtest_main.cc
@@ -0,0 +1,38 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+GTEST_API_ int main(int argc, char **argv) {
+  printf("Running main() from gtest_main.cc\n");
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-death-test.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-death-test.h
new file mode 100644
index 0000000..957a69c
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-death-test.h
@@ -0,0 +1,294 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests.  It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+#include "gtest/internal/gtest-death-test-internal.h"
+
+namespace testing {
+
+// This flag controls the style of death tests.  Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+//   1. It generates a warning if there is more than one active
+//   thread.  This is because it's safe to fork() or clone() only
+//   when there is a single thread.
+//
+//   2. The parent process clone()s a sub-process and runs the death
+//   test in it; the sub-process exits with code 0 at the end of the
+//   death test, if it hasn't exited already.
+//
+//   3. The parent process waits for the sub-process to terminate.
+//
+//   4. The parent process checks the exit code and error message of
+//   the sub-process.
+//
+// Examples:
+//
+//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+//   for (int i = 0; i < 5; i++) {
+//     EXPECT_DEATH(server.ProcessRequest(i),
+//                  "Invalid request .* in ProcessRequest()")
+//                  << "Failed to die on request " << i;
+//   }
+//
+//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+//   bool KilledBySIGHUP(int exit_code) {
+//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+//   }
+//
+//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
+//   which uses the POSIX extended regex syntax.
+//
+//   On other platforms (e.g. Windows), we only support a simple regex
+//   syntax implemented as part of Google Test.  This limited
+//   implementation should be enough most of the time when writing
+//   death tests; though it lacks many features you can find in PCRE
+//   or POSIX extended regex syntax.  For example, we don't support
+//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+//   repetition count ("x{5,7}"), among others.
+//
+//   Below is the syntax that we do support.  We chose it to be a
+//   subset of both PCRE and POSIX extended regex, so it's easy to
+//   learn wherever you come from.  In the following: 'A' denotes a
+//   literal character, period (.), or a single \\ escape sequence;
+//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
+//   natural numbers.
+//
+//     c     matches any literal character c
+//     \\d   matches any decimal digit
+//     \\D   matches any character that's not a decimal digit
+//     \\f   matches \f
+//     \\n   matches \n
+//     \\r   matches \r
+//     \\s   matches any ASCII whitespace, including \n
+//     \\S   matches any character that's not a whitespace
+//     \\t   matches \t
+//     \\v   matches \v
+//     \\w   matches any letter, _, or decimal digit
+//     \\W   matches any character that \\w doesn't match
+//     \\c   matches any literal character c, which must be a punctuation
+//     .     matches any single character except \n
+//     A?    matches 0 or 1 occurrences of A
+//     A*    matches 0 or many occurrences of A
+//     A+    matches 1 or many occurrences of A
+//     ^     matches the beginning of a string (not that of each line)
+//     $     matches the end of a string (not that of each line)
+//     xy    matches x followed by y
+//
+//   If you accidentally use PCRE or POSIX extended regex features
+//   not implemented by us, you will get a run-time failure.  In that
+//   case, please try to rewrite your regular expression within the
+//   above syntax.
+//
+//   This implementation is *not* meant to be as highly tuned or robust
+//   as a compiled regex library, but should perform well enough for a
+//   death test, which already incurs significant overhead by launching
+//   a child process.
+//
+// Known caveats:
+//
+//   A "threadsafe" style death test obtains the path to the test
+//   program from argv[0] and re-executes it in the sub-process.  For
+//   simplicity, the current implementation doesn't search the PATH
+//   when launching the sub-process.  This means that the user must
+//   invoke the test program via a path that contains at least one
+//   path separator (e.g. path/to/foo_test and
+//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
+//   is rarely a problem as people usually don't put the test binary
+//   directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+  explicit ExitedWithCode(int exit_code);
+  bool operator()(int exit_status) const;
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ExitedWithCode& other);
+
+  const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+  explicit KilledBySignal(int signum);
+  bool operator()(int exit_status) const;
+ private:
+  const int signum_;
+};
+# endif  // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+//   if (sideeffect) {
+//     *sideeffect = 12;
+//   }
+//   LOG(DFATAL) << "death";
+//   return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+//   int sideeffect = 0;
+//   // Only asserts in dbg.
+//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+//   // opt-mode has sideeffect visible.
+//   EXPECT_EQ(12, sideeffect);
+// #else
+//   // dbg-mode no visible sideeffect.
+//   EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects.  A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+//   // Side-effects here will have an effect after this statement in
+//   // opt mode, but none in debug mode.
+//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  EXPECT_DEATH(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  ASSERT_DEATH(statement, regex)
+
+# endif  // NDEBUG for EXPECT_DEBUG_DEATH
+#endif  // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning.  This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-message.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-message.h
new file mode 100644
index 0000000..fe879bc
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-message.h
@@ -0,0 +1,250 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+#include "gtest/internal/gtest-port.h"
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+//   1. You stream a bunch of values to a Message object.
+//      It will remember the text in a stringstream.
+//   2. Then you stream the Message object to an ostream.
+//      This causes the text in the Message to be streamed
+//      to the ostream.
+//
+// For example;
+//
+//   testing::Message foo;
+//   foo << 1 << " != " << 2;
+//   std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from.  In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC.  You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do).  The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+  // The type of basic IO manipulators (endl, ends, and flush) for
+  // narrow streams.
+  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+  // Constructs an empty Message.
+  Message();
+
+  // Copy constructor.
+  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
+    *ss_ << msg.GetString();
+  }
+
+  // Constructs a Message from a C-string.
+  explicit Message(const char* str) : ss_(new ::std::stringstream) {
+    *ss_ << str;
+  }
+
+#if GTEST_OS_SYMBIAN
+  // Streams a value (either a pointer or not) to this object.
+  template <typename T>
+  inline Message& operator <<(const T& value) {
+    StreamHelper(typename internal::is_pointer<T>::type(), value);
+    return *this;
+  }
+#else
+  // Streams a non-pointer value to this object.
+  template <typename T>
+  inline Message& operator <<(const T& val) {
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
+    return *this;
+  }
+
+  // Streams a pointer value to this object.
+  //
+  // This function is an overload of the previous one.  When you
+  // stream a pointer to a Message, this definition will be used as it
+  // is more specialized.  (The C++ Standard, section
+  // [temp.func.order].)  If you stream a non-pointer, then the
+  // previous definition will be used.
+  //
+  // The reason for this overload is that streaming a NULL pointer to
+  // ostream is undefined behavior.  Depending on the compiler, you
+  // may get "0", "(nil)", "(null)", or an access violation.  To
+  // ensure consistent result across compilers, we always treat NULL
+  // as "(null)".
+  template <typename T>
+  inline Message& operator <<(T* const& pointer) {  // NOLINT
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+    return *this;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // Since the basic IO manipulators are overloaded for both narrow
+  // and wide streams, we have to provide this specialized definition
+  // of operator <<, even though its body is the same as the
+  // templatized version above.  Without this definition, streaming
+  // endl or other basic IO manipulators to Message will confuse the
+  // compiler.
+  Message& operator <<(BasicNarrowIoManip val) {
+    *ss_ << val;
+    return *this;
+  }
+
+  // Instead of 1/0, we want to see true/false for bool values.
+  Message& operator <<(bool b) {
+    return *this << (b ? "true" : "false");
+  }
+
+  // These two overloads allow streaming a wide C string to a Message
+  // using the UTF-8 encoding.
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::std::wstring& wstr);
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::wstring& wstr);
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+  // Gets the text streamed to this object so far as an std::string.
+  // Each '\0' character in the buffer is replaced with "\\0".
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+  // These are needed as the Nokia Symbian Compiler cannot decide between
+  // const T& and const T* in a function template. The Nokia compiler _can_
+  // decide between class template specializations for T and T*, so a
+  // tr1::type_traits-like is_pointer works, and we can overload on that.
+  template <typename T>
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+  }
+  template <typename T>
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // We'll hold the text streamed to this object here.
+  const internal::scoped_ptr< ::std::stringstream> ss_;
+
+  // We declare (but don't implement) this to prevent the compiler
+  // from implementing the assignment operator.
+  void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+  return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-param-test.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-param-test.h
new file mode 100644
index 0000000..d6702c8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-param-test.h
@@ -0,0 +1,1421 @@
+// This file was GENERATED by command:
+//     pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-param-util-generated.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+  return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+  return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5) {
+  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6) {
+  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7) {
+  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+      v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+      v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11) {
+  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12) {
+  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13) {
+  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16) {
+  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17) {
+  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18) {
+  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22) {
+  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23) {
+  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24) {
+  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26) {
+  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27) {
+  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28) {
+  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29) {
+  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32) {
+  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33) {
+  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34) {
+  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37) {
+  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38) {
+  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+      v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38, T39 v39) {
+  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+      v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42) {
+  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+      v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43) {
+  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+      v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43, T44 v44) {
+  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+      v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+      v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+    T48 v48) {
+  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+    T47 v47, T48 v48, T49 v49) {
+  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+      v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+    const Generator1& g1, const Generator2& g2) {
+  return internal::CartesianProductHolder2<Generator1, Generator2>(
+      g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+      g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+    Generator4> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4) {
+  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+      Generator4>(
+      g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+    Generator4, Generator5> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5) {
+  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+      Generator4, Generator5>(
+      g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6>(
+      g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7) {
+  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7>(
+      g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8) {
+  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8>(
+      g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8,
+    Generator9> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9,
+    typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+    Generator10> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9,
+        const Generator10& g10) {
+  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+      Generator10>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-param-test.h.pump b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-param-test.h.pump
new file mode 100644
index 0000000..2dc9303
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-param-test.h.pump
@@ -0,0 +1,487 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of Values arguments we want to support.
+$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-param-util-generated.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to $n parameters.
+//
+$range i 1..n
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename T$j]]>
+internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {
+  return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);
+}
+
+]]
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to $maxtuple arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename Generator$j]]>
+internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(
+    $for j, [[const Generator$j& g$j]]) {
+  return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(
+      $for j, [[g$j]]);
+}
+
+]]
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-printers.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-printers.h
new file mode 100644
index 0000000..0639d9f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-printers.h
@@ -0,0 +1,855 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T.  More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+//   1. foo::PrintTo(const T&, ostream*)
+//   2. operator<<(ostream&, const T&) defined in either foo or the
+//      global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+//   // Prints a value to a string.  For a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   std::string ::testing::PrintToString(const T& value);
+//
+//   // Prints a value tersely: for a reference type, the referenced
+//   // value (but not the address) is printed; for a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+//   // Prints value using the type inferred by the compiler.  The difference
+//   // from UniversalTersePrint() is that this function prints both the
+//   // pointer and the NUL-terminated string for a (const or not) char pointer.
+//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+//   // Prints the fields of a tuple tersely to a string vector, one
+//   // element for each field. Tuple support must be enabled in
+//   // gtest-port.h.
+//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+//       const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container.  When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect.  In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator.  We'll fix this if there's an
+// actual need for it.  Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+#include "gtest/internal/gtest-port.h"
+#include "gtest/internal/gtest-internal.h"
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice.  DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+                                     size_t count,
+                                     ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+  kProtobuf,              // a protobuf type
+  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
+                          // (e.g. a named or unnamed enum type)
+  kOtherType              // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+  // This default version is called when kTypeKind is kOtherType.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+                         sizeof(value), os);
+  }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const ::testing::internal::string short_str = value.ShortDebugString();
+    const ::testing::internal::string pretty_str =
+        short_str.length() <= kProtobufOneLinerMaxLength ?
+        short_str : ("\n" + value.DebugString());
+    *os << ("<" + pretty_str + ">");
+  }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+  // Since T has no << operator or PrintTo() but can be implicitly
+  // converted to BiggestInt, we print it as a BiggestInt.
+  //
+  // Most likely T is an enum type (either named or unnamed), in which
+  // case printing it as an integer is the desired behavior.  In case
+  // T is not an enum, printing it as an integer is the best we can do
+  // given that it has no user-defined printer.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const internal::BiggestInt kBigInt = value;
+    *os << kBigInt;
+  }
+};
+
+// Prints the given value to the given ostream.  If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed.  This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream.  If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+  TypeWithoutFormatter<T,
+      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+  return os;
+}
+
+}  // namespace internal2
+}  // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+  // With the following statement, during unqualified name lookup,
+  // testing::internal2::operator<< appears as if it was declared in
+  // the nearest enclosing namespace that contains both
+  // ::testing_internal and ::testing::internal2, i.e. the global
+  // namespace.  For more details, refer to the C++ Standard section
+  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
+  // testing::internal2::operator<< in case T doesn't come with a <<
+  // operator.
+  //
+  // We cannot write 'using ::testing::internal2::operator<<;', which
+  // gcc 3.3 fails to compile due to a compiler bug.
+  using namespace ::testing::internal2;  // NOLINT
+
+  // Assuming T is defined in namespace foo, in the next statement,
+  // the compiler will consider all of:
+  //
+  //   1. foo::operator<< (thanks to Koenig look-up),
+  //   2. ::operator<< (as the current namespace is enclosed in ::),
+  //   3. testing::internal2::operator<< (thanks to the using statement above).
+  //
+  // The operator<< whose type matches T best will be picked.
+  //
+  // We deliberately allow #2 to be a candidate, as sometimes it's
+  // impossible to define #1 (e.g. when foo is ::std, defining
+  // anything in it is undefined behavior unless you are a compiler
+  // vendor.).
+  *os << value;
+}
+
+}  // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream.  The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const C& container, ::std::ostream* os) {
+  const size_t kMaxCount = 32;  // The maximum number of elements to print.
+  *os << '{';
+  size_t count = 0;
+  for (typename C::const_iterator it = container.begin();
+       it != container.end(); ++it, ++count) {
+    if (count > 0) {
+      *os << ',';
+      if (count == kMaxCount) {  // Enough has been printed.
+        *os << " ...";
+        break;
+      }
+    }
+    *os << ' ';
+    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+    // handle *it being a native array.
+    internal::UniversalPrint(*it, os);
+  }
+
+  if (count > 0) {
+    *os << ' ';
+  }
+  *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it.  (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space.  Their representation is
+// implementation-defined.  Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    true_type /* is a pointer */,
+                    T* p, ::std::ostream* os) {
+  if (p == NULL) {
+    *os << "NULL";
+  } else {
+    // C++ doesn't allow casting from a function pointer to any object
+    // pointer.
+    //
+    // IsTrue() silences warnings: "Condition is always true",
+    // "unreachable code".
+    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+      // T is not a function type.  We just call << to print p,
+      // relying on ADL to pick up user-defined << for their pointer
+      // types, if any.
+      *os << p;
+    } else {
+      // T is a function type, so '*os << p' doesn't do what we want
+      // (it just prints p as bool).  We want to print p as a const
+      // void*.  However, we cannot cast it to const void* directly,
+      // even using reinterpret_cast, as earlier versions of gcc
+      // (e.g. 3.4.5) cannot compile the cast when p is a function
+      // pointer.  Casting to UInt64 first solves the problem.
+      *os << reinterpret_cast<const void*>(
+          reinterpret_cast<internal::UInt64>(p));
+    }
+  }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const T& value, ::std::ostream* os) {
+  ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it.  This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined.  We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+  // DefaultPrintTo() is overloaded.  The type of its first two
+  // arguments determine which version will be picked.  If T is an
+  // STL-style container, the version for container will be called; if
+  // T is a pointer, the pointer version will be called; otherwise the
+  // generic version will be called.
+  //
+  // Note that we check for container types here, prior to we check
+  // for protocol message types in our operator<<.  The rationale is:
+  //
+  // For protocol messages, we want to give people a chance to
+  // override Google Mock's format by defining a PrintTo() or
+  // operator<<.  For STL containers, other formats can be
+  // incompatible with Google Mock's format for the container
+  // elements; therefore we check for container types here to ensure
+  // that our format is used.
+  //
+  // The second argument of DefaultPrintTo() is needed to bypass a bug
+  // in Symbian's C++ compiler that prevents it from picking the right
+  // overload between:
+  //
+  //   PrintTo(const T& x, ...);
+  //   PrintTo(T* x, ...);
+  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+  // When printing a plain char, we always treat it as unsigned.  This
+  // way, the output won't be affected by whether the compiler thinks
+  // char is signed or not.
+  PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+  *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type.  When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays.  Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+  UniversalPrint(a[0], os);
+  for (size_t i = 1; i != count; i++) {
+    *os << ", ";
+    UniversalPrint(a[i], os);
+  }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities.  We support
+// tuples of up-to 10 fields.  The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+    ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+  *os << '(';
+  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+  // a reference type.  The same for printing value.second.
+  UniversalPrinter<T1>::Print(value.first, os);
+  *os << ", ";
+  UniversalPrinter<T2>::Print(value.second, os);
+  *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  // Note: we deliberately don't call this PrintTo(), as that name
+  // conflicts with ::testing::internal::PrintTo in the body of the
+  // function.
+  static void Print(const T& value, ::std::ostream* os) {
+    // By default, ::testing::internal::PrintTo() is used for printing
+    // the value.
+    //
+    // Thanks to Koenig look-up, if T is a class and has its own
+    // PrintTo() function defined in its namespace, that function will
+    // be visible here.  Since it is more specific than the generic ones
+    // in ::testing::internal, it will be picked by the compiler in the
+    // following statement - exactly what we want.
+    PrintTo(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+  if (len == 0) {
+    *os << "{}";
+  } else {
+    *os << "{ ";
+    const size_t kThreshold = 18;
+    const size_t kChunkSize = 8;
+    // If the array has more than kThreshold elements, we'll have to
+    // omit some details by printing only the first and the last
+    // kChunkSize elements.
+    // TODO(wan at google.com): let the user control the threshold using a flag.
+    if (len <= kThreshold) {
+      PrintRawArrayTo(begin, len, os);
+    } else {
+      PrintRawArrayTo(begin, kChunkSize, os);
+      *os << ", ..., ";
+      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+    }
+    *os << " }";
+  }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+  // Prints the given array, omitting some elements when there are too
+  // many.
+  static void Print(const T (&a)[N], ::std::ostream* os) {
+    UniversalPrintArray(a, N, os);
+  }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  static void Print(const T& value, ::std::ostream* os) {
+    // Prints the address of the value.  We use reinterpret_cast here
+    // as static_cast doesn't compile when T is a function type.
+    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+    // Then prints the value itself.
+    UniversalPrint(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler.  The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields.  The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+  // Prints the first N fields of a tuple.
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+    *os << ", ";
+    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+        ::Print(::std::tr1::get<N - 1>(t), os);
+  }
+
+  // Tersely prints the first N fields of a tuple to a string vector,
+  // one element for each field.
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+        Print(::std::tr1::get<0>(t), os);
+  }
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+  *os << "(";
+  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+      PrintPrefixTo(t, os);
+  *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field.  See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+  Strings result;
+  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+      TersePrintPrefixToStrings(value, &result);
+  return result;
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+  ::std::stringstream ss;
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-spi.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-spi.h
new file mode 100644
index 0000000..f63fa9a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-spi.h
@@ -0,0 +1,232 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include "gtest/gtest.h"
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  // The two possible mocking modes of this object.
+  enum InterceptMode {
+    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
+    INTERCEPT_ALL_THREADS           // Intercepts all failures.
+  };
+
+  // The c'tor sets this object as the test part result reporter used
+  // by Google Test.  The 'result' parameter specifies where to report the
+  // results. This reporter will only catch failures generated in the current
+  // thread. DEPRECATED
+  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+  // Same as above, but you can choose the interception scope of this object.
+  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+                                   TestPartResultArray* result);
+
+  // The d'tor restores the previous test part result reporter.
+  virtual ~ScopedFakeTestPartResultReporter();
+
+  // Appends the TestPartResult object to the TestPartResultArray
+  // received in the constructor.
+  //
+  // This method is from the TestPartResultReporterInterface
+  // interface.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+  void Init();
+
+  const InterceptMode intercept_mode_;
+  TestPartResultReporterInterface* old_reporter_;
+  TestPartResultArray* const result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+  // The constructor remembers the arguments.
+  SingleFailureChecker(const TestPartResultArray* results,
+                       TestPartResult::Type type,
+                       const string& substr);
+  ~SingleFailureChecker();
+ private:
+  const TestPartResultArray* const results_;
+  const TestPartResult::Type type_;
+  const string substr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures.  It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - 'statement' cannot reference local non-static variables or
+//     non-static members of the current object.
+//   - 'statement' cannot return a value.
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ALL_THREADS, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures.  It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma.  The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+//   if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+          &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-test-part.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-test-part.h
new file mode 100644
index 0000000..77eb844
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-test-part.h
@@ -0,0 +1,179 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+  // The possible outcomes of a test part (i.e. an assertion or an
+  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+  enum Type {
+    kSuccess,          // Succeeded.
+    kNonFatalFailure,  // Failed but the test can continue.
+    kFatalFailure      // Failed and the test should be terminated.
+  };
+
+  // C'tor.  TestPartResult does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestPartResult object.
+  TestPartResult(Type a_type,
+                 const char* a_file_name,
+                 int a_line_number,
+                 const char* a_message)
+      : type_(a_type),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
+        line_number_(a_line_number),
+        summary_(ExtractSummary(a_message)),
+        message_(a_message) {
+  }
+
+  // Gets the outcome of the test part.
+  Type type() const { return type_; }
+
+  // Gets the name of the source file where the test part took place, or
+  // NULL if it's unknown.
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
+
+  // Gets the line in the source file where the test part took place,
+  // or -1 if it's unknown.
+  int line_number() const { return line_number_; }
+
+  // Gets the summary of the failure message.
+  const char* summary() const { return summary_.c_str(); }
+
+  // Gets the message associated with the test part.
+  const char* message() const { return message_.c_str(); }
+
+  // Returns true iff the test part passed.
+  bool passed() const { return type_ == kSuccess; }
+
+  // Returns true iff the test part failed.
+  bool failed() const { return type_ != kSuccess; }
+
+  // Returns true iff the test part non-fatally failed.
+  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+  // Returns true iff the test part fatally failed.
+  bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+  Type type_;
+
+  // Gets the summary of the failure message by omitting the stack
+  // trace in it.
+  static std::string ExtractSummary(const char* message);
+
+  // The name of the source file where the test part took place, or
+  // "" if the source file is unknown.
+  std::string file_name_;
+  // The line in the source file where the test part took place, or -1
+  // if the line number is unknown.
+  int line_number_;
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+  TestPartResultArray() {}
+
+  // Appends the given TestPartResult to the array.
+  void Append(const TestPartResult& result);
+
+  // Returns the TestPartResult at the given index (0-based).
+  const TestPartResult& GetTestPartResult(int index) const;
+
+  // Returns the number of TestPartResult objects in the array.
+  int size() const;
+
+ private:
+  std::vector<TestPartResult> array_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+  virtual ~TestPartResultReporterInterface() {}
+
+  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+    : public TestPartResultReporterInterface {
+ public:
+  HasNewFatalFailureHelper();
+  virtual ~HasNewFatalFailureHelper();
+  virtual void ReportTestPartResult(const TestPartResult& result);
+  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+  bool has_new_fatal_failure_;
+  TestPartResultReporterInterface* original_reporter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-typed-test.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-typed-test.h
new file mode 100644
index 0000000..fe1e83b
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest-typed-test.h
@@ -0,0 +1,259 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list.  You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+  ...
+  typedef std::list<T> List;
+  static T shared_;
+  T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list.  The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  // Since we are inside a derived class template, C++ requires use to
+  // visit the members of FooTest via 'this'.
+  TypeParam n = this->value_;
+
+  // To visit static members of the fixture, add the TestFixture::
+  // prefix.
+  n += TestFixture::shared_;
+
+  // To refer to typedefs in the fixture, add the "typename
+  // TestFixture::" prefix.
+  typename TestFixture::List values;
+  values.push_back(n);
+  ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif  // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type.  Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are.  The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have.  Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly.  Here's an example:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+  ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  TypeParam n = 0;
+  ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them.  The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+                           DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want.  If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name.  Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+#include "gtest/internal/gtest-type-util.h"
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+  typedef ::testing::internal::TypeList< Types >::type \
+      GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+  template <typename gtest_TypeParam_> \
+  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+      : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTest< \
+          CaseName, \
+          ::testing::internal::TemplateSel< \
+              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+              "", #CaseName, #TestName, 0); \
+  template <typename gtest_TypeParam_> \
+  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in.  The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+  gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+  gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+  gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+  static ::testing::internal::TypedTestCasePState \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  template <typename gtest_TypeParam_> \
+  class TestName : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+          __FILE__, __LINE__, #CaseName, #TestName); \
+  } \
+  template <typename gtest_TypeParam_> \
+  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+  } \
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+          __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTestCase<CaseName, \
+          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+          ::testing::internal::TypeList< Types >::type>::Register(\
+              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest.h
new file mode 100644
index 0000000..6fa0a39
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest.h
@@ -0,0 +1,2291 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test.  It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest-message.h"
+#include "gtest/gtest-param-test.h"
+#include "gtest/gtest-printers.h"
+#include "gtest/gtest_prod.h"
+#include "gtest/gtest-test-part.h"
+#include "gtest/gtest-typed-test.h"
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message);
+
+}  // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful.  When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+//   1. Defining predicate functions to be used with Boolean test assertions
+//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+//   2. Defining predicate-format functions to be
+//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false (5 is odd)
+//   Expected: true
+//
+// instead of a more opaque
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false
+//   Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess() << n << " is even";
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+//   Value of: IsEven(Fib(6))
+//     Actual: true (8 is even)
+//   Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+//   // Verifies that Foo() returns an even number.
+//   EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+//   testing::AssertionResult IsEven(const char* expr, int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure()
+//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
+//   }
+//
+// If Foo() returns 5, you will see the following message:
+//
+//   Expected: Foo() is even
+//     Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+  // Copy constructor.
+  // Used in EXPECT_TRUE/FALSE(assertion_result).
+  AssertionResult(const AssertionResult& other);
+  // Used in the EXPECT_TRUE/FALSE(bool_expression).
+  explicit AssertionResult(bool success) : success_(success) {}
+
+  // Returns true iff the assertion succeeded.
+  operator bool() const { return success_; }  // NOLINT
+
+  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+  AssertionResult operator!() const;
+
+  // Returns the text streamed into this AssertionResult. Test assertions
+  // use it when they fail (i.e., the predicate's outcome doesn't match the
+  // assertion's expectation). When nothing has been streamed into the
+  // object, returns an empty string.
+  const char* message() const {
+    return message_.get() != NULL ?  message_->c_str() : "";
+  }
+  // TODO(vladl at google.com): Remove this after making sure no clients use it.
+  // Deprecated; please use message() instead.
+  const char* failure_message() const { return message(); }
+
+  // Streams a custom failure message into this object.
+  template <typename T> AssertionResult& operator<<(const T& value) {
+    AppendMessage(Message() << value);
+    return *this;
+  }
+
+  // Allows streaming basic output manipulators such as endl or flush into
+  // this object.
+  AssertionResult& operator<<(
+      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+    AppendMessage(Message() << basic_manipulator);
+    return *this;
+  }
+
+ private:
+  // Appends the contents of message to message_.
+  void AppendMessage(const Message& a_message) {
+    if (message_.get() == NULL)
+      message_.reset(new ::std::string);
+    message_->append(a_message.GetString().c_str());
+  }
+
+  // Stores result of the assertion predicate.
+  bool success_;
+  // Stores the message describing the condition in case the expectation
+  // construct is not satisfied with the predicate's outcome.
+  // Referenced via a pointer to avoid taking too much stack frame space
+  // with test assertions.
+  internal::scoped_ptr< ::std::string> message_;
+
+  GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F.  For example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { ... }
+//     virtual void TearDown() { ... }
+//     ...
+//   };
+//
+//   TEST_F(FooTest, Bar) { ... }
+//   TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+  friend class TestInfo;
+
+  // Defines types for pointers to functions that set up and tear down
+  // a test case.
+  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+  // The d'tor is virtual as we intend to inherit from Test.
+  virtual ~Test();
+
+  // Sets up the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::SetUpTestCase() before running the first
+  // test in test case Foo.  Hence a sub-class can define its own
+  // SetUpTestCase() method to shadow the one defined in the super
+  // class.
+  static void SetUpTestCase() {}
+
+  // Tears down the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::TearDownTestCase() after running the last
+  // test in test case Foo.  Hence a sub-class can define its own
+  // TearDownTestCase() method to shadow the one defined in the super
+  // class.
+  static void TearDownTestCase() {}
+
+  // Returns true iff the current test has a fatal failure.
+  static bool HasFatalFailure();
+
+  // Returns true iff the current test has a non-fatal failure.
+  static bool HasNonfatalFailure();
+
+  // Returns true iff the current test has a (either fatal or
+  // non-fatal) failure.
+  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
+
+ protected:
+  // Creates a Test object.
+  Test();
+
+  // Sets up the test fixture.
+  virtual void SetUp();
+
+  // Tears down the test fixture.
+  virtual void TearDown();
+
+ private:
+  // Returns true iff the current test has the same fixture class as
+  // the first test in the current test case.
+  static bool HasSameFixtureClass();
+
+  // Runs the test after the test fixture has been set up.
+  //
+  // A sub-class must implement this to define the test logic.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+  // Instead, use the TEST or TEST_F macro.
+  virtual void TestBody() = 0;
+
+  // Sets up, executes, and tears down the test.
+  void Run();
+
+  // Deletes self.  We deliberately pick an unusual name for this
+  // internal method to avoid clashing with names used in user TESTs.
+  void DeleteSelf_() { delete this; }
+
+  // Uses a GTestFlagSaver to save and restore all Google Test flags.
+  const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+  // Often a user mis-spells SetUp() as Setup() and spends a long time
+  // wondering why it is never called by Google Test.  The declaration of
+  // the following method is solely for catching such an error at
+  // compile time:
+  //
+  //   - The return type is deliberately chosen to be not void, so it
+  //   will be a conflict if a user declares void Setup() in his test
+  //   fixture.
+  //
+  //   - This method is private, so it will be another compiler error
+  //   if a user calls it from his test fixture.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION.
+  //
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+  // We disallow copying Tests.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+  // C'tor.  TestProperty does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestProperty object.
+  TestProperty(const std::string& a_key, const std::string& a_value) :
+    key_(a_key), value_(a_value) {
+  }
+
+  // Gets the user supplied key.
+  const char* key() const {
+    return key_.c_str();
+  }
+
+  // Gets the user supplied value.
+  const char* value() const {
+    return value_.c_str();
+  }
+
+  // Sets a new value, overriding the one supplied in the constructor.
+  void SetValue(const std::string& new_value) {
+    value_ = new_value;
+  }
+
+ private:
+  // The key supplied by the user.
+  std::string key_;
+  // The value supplied by the user.
+  std::string value_;
+};
+
+// The result of a single Test.  This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+  // Creates an empty TestResult.
+  TestResult();
+
+  // D'tor.  Do not inherit from TestResult.
+  ~TestResult();
+
+  // Gets the number of all test parts.  This is the sum of the number
+  // of successful test parts and the number of failed test parts.
+  int total_part_count() const;
+
+  // Returns the number of the test properties.
+  int test_property_count() const;
+
+  // Returns true iff the test passed (i.e. no test part failed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test failed.
+  bool Failed() const;
+
+  // Returns true iff the test fatally failed.
+  bool HasFatalFailure() const;
+
+  // Returns true iff the test has a non-fatal failure.
+  bool HasNonfatalFailure() const;
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test part result among all the results. i can range
+  // from 0 to test_property_count() - 1. If i is not in that range, aborts
+  // the program.
+  const TestPartResult& GetTestPartResult(int i) const;
+
+  // Returns the i-th test property. i can range from 0 to
+  // test_property_count() - 1. If i is not in that range, aborts the
+  // program.
+  const TestProperty& GetTestProperty(int i) const;
+
+ private:
+  friend class TestInfo;
+  friend class TestCase;
+  friend class UnitTest;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::ExecDeathTest;
+  friend class internal::TestResultAccessor;
+  friend class internal::UnitTestImpl;
+  friend class internal::WindowsDeathTest;
+
+  // Gets the vector of TestPartResults.
+  const std::vector<TestPartResult>& test_part_results() const {
+    return test_part_results_;
+  }
+
+  // Gets the vector of TestProperties.
+  const std::vector<TestProperty>& test_properties() const {
+    return test_properties_;
+  }
+
+  // Sets the elapsed time.
+  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+  // Adds a test property to the list. The property is validated and may add
+  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+  // key names). If a property is already recorded for the same key, the
+  // value will be updated, rather than storing multiple values for the same
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
+
+  // Adds a failure if the key is a reserved attribute of Google Test
+  // testcase tags.  Returns true if the property is valid.
+  // TODO(russr): Validate attribute names are legal and human readable.
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
+
+  // Adds a test part result to the list.
+  void AddTestPartResult(const TestPartResult& test_part_result);
+
+  // Returns the death test count.
+  int death_test_count() const { return death_test_count_; }
+
+  // Increments the death test count, returning the new count.
+  int increment_death_test_count() { return ++death_test_count_; }
+
+  // Clears the test part results.
+  void ClearTestPartResults();
+
+  // Clears the object.
+  void Clear();
+
+  // Protects mutable state of the property vector and of owned
+  // properties, whose values may be updated.
+  internal::Mutex test_properites_mutex_;
+
+  // The vector of TestPartResults
+  std::vector<TestPartResult> test_part_results_;
+  // The vector of TestProperties
+  std::vector<TestProperty> test_properties_;
+  // Running count of death tests.
+  int death_test_count_;
+  // The elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+  // We disallow copying TestResult.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+};  // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+//   Test case name
+//   Test name
+//   Whether the test should be run
+//   A function pointer that creates the test object when invoked
+//   Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+  // Destructs a TestInfo object.  This function is not virtual, so
+  // don't inherit from TestInfo.
+  ~TestInfo();
+
+  // Returns the test case name.
+  const char* test_case_name() const { return test_case_name_.c_str(); }
+
+  // Returns the test name.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a typed
+  // or a type-parameterized test.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns the text representation of the value parameter, or NULL if this
+  // is not a value-parameterized test.
+  const char* value_param() const {
+    if (value_param_.get() != NULL)
+      return value_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
+  //
+  // Google Test allows the user to filter the tests by their full names.
+  // The full name of a test Bar in test case Foo is defined as
+  // "Foo.Bar".  Only the tests that match the filter will run.
+  //
+  // A filter is a colon-separated list of glob (not regex) patterns,
+  // optionally followed by a '-' and a colon-separated list of
+  // negative patterns (tests to exclude).  A test is run if it
+  // matches one of the positive patterns and does not match any of
+  // the negative patterns.
+  //
+  // For example, *A*:Foo.* is a filter that matches any string that
+  // contains the character 'A' or starts with "Foo.".
+  bool should_run() const { return should_run_; }
+
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
+  // Returns the result of the test.
+  const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+  friend class internal::DefaultDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+  friend class Test;
+  friend class TestCase;
+  friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
+  friend TestInfo* internal::MakeAndRegisterTestInfo(
+      const char* test_case_name,
+      const char* name,
+      const char* type_param,
+      const char* value_param,
+      internal::TypeId fixture_class_id,
+      Test::SetUpTestCaseFunc set_up_tc,
+      Test::TearDownTestCaseFunc tear_down_tc,
+      internal::TestFactoryBase* factory);
+
+  // Constructs a TestInfo object. The newly constructed instance assumes
+  // ownership of the factory object.
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
+           internal::TypeId fixture_class_id,
+           internal::TestFactoryBase* factory);
+
+  // Increments the number of death tests encountered in this test so
+  // far.
+  int increment_death_test_count() {
+    return result_.increment_death_test_count();
+  }
+
+  // Creates the test object, runs it, records its result, and then
+  // deletes it.
+  void Run();
+
+  static void ClearTestResult(TestInfo* test_info) {
+    test_info->result_.Clear();
+  }
+
+  // These fields are immutable properties of the test.
+  const std::string test_case_name_;     // Test case name
+  const std::string name_;               // Test name
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // Text representation of the value parameter, or NULL if this is not a
+  // value-parameterized test.
+  const internal::scoped_ptr<const ::std::string> value_param_;
+  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
+  bool should_run_;                 // True iff this test should run
+  bool is_disabled_;                // True iff this test is disabled
+  bool matches_filter_;             // True if this test matches the
+                                    // user-specified filter.
+  internal::TestFactoryBase* const factory_;  // The factory that creates
+                                              // the test object
+
+  // This field is mutable and needs to be reset before running the
+  // test for the second time.
+  TestResult result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+  // Creates a TestCase with the given name.
+  //
+  // TestCase does NOT have a default constructor.  Always use this
+  // constructor to create a TestCase object.
+  //
+  // Arguments:
+  //
+  //   name:         name of the test case
+  //   a_type_param: the name of the test's type parameter, or NULL if
+  //                 this is not a type-parameterized test.
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  TestCase(const char* name, const char* a_type_param,
+           Test::SetUpTestCaseFunc set_up_tc,
+           Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Destructor of TestCase.
+  virtual ~TestCase();
+
+  // Gets the name of the TestCase.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a
+  // type-parameterized test case.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if any test in this test case should run.
+  bool should_run() const { return should_run_; }
+
+  // Gets the number of successful tests in this test case.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests in this test case.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests in this test case.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Get the number of tests in this test case that should run.
+  int test_to_run_count() const;
+
+  // Gets the number of all tests in this test case.
+  int total_test_count() const;
+
+  // Returns true iff the test case passed.
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test case failed.
+  bool Failed() const { return failed_test_count() > 0; }
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  const TestInfo* GetTestInfo(int i) const;
+
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+  friend class Test;
+  friend class internal::UnitTestImpl;
+
+  // Gets the (mutable) vector of TestInfos in this TestCase.
+  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+  // Gets the (immutable) vector of TestInfos in this TestCase.
+  const std::vector<TestInfo*>& test_info_list() const {
+    return test_info_list_;
+  }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  TestInfo* GetMutableTestInfo(int i);
+
+  // Sets the should_run member.
+  void set_should_run(bool should) { should_run_ = should; }
+
+  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
+  // destruction of the TestCase object.
+  void AddTestInfo(TestInfo * test_info);
+
+  // Clears the results of all tests in this test case.
+  void ClearResult();
+
+  // Clears the results of all tests in the given test case.
+  static void ClearTestCaseResult(TestCase* test_case) {
+    test_case->ClearResult();
+  }
+
+  // Runs every test in this TestCase.
+  void Run();
+
+  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
+  // for catching exceptions thrown from SetUpTestCase().
+  void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+  // Runs TearDownTestCase() for this TestCase.  This wrapper is
+  // needed for catching exceptions thrown from TearDownTestCase().
+  void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+  // Returns true iff test passed.
+  static bool TestPassed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Passed();
+  }
+
+  // Returns true iff test failed.
+  static bool TestFailed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Failed();
+  }
+
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
+  // Returns true iff test is disabled.
+  static bool TestDisabled(const TestInfo* test_info) {
+    return test_info->is_disabled_;
+  }
+
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
+  // Returns true if the given test should run.
+  static bool ShouldRunTest(const TestInfo* test_info) {
+    return test_info->should_run();
+  }
+
+  // Shuffles the tests in this test case.
+  void ShuffleTests(internal::Random* random);
+
+  // Restores the test order to before the first shuffle.
+  void UnshuffleTests();
+
+  // Name of the test case.
+  std::string name_;
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // The vector of TestInfos in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestInfo*> test_info_list_;
+  // Provides a level of indirection for the test list to allow easy
+  // shuffling and restoring the test order.  The i-th element in this
+  // vector is the index of the i-th test in the shuffled test list.
+  std::vector<int> test_indices_;
+  // Pointer to the function that sets up the test case.
+  Test::SetUpTestCaseFunc set_up_tc_;
+  // Pointer to the function that tears down the test case.
+  Test::TearDownTestCaseFunc tear_down_tc_;
+  // True iff any test in this test case should run.
+  bool should_run_;
+  // Elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
+
+  // We disallow copying TestCases.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment.  The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+//   1. You cannot safely throw from a destructor.  This is a problem
+//      as in some cases Google Test is used where exceptions are enabled, and
+//      we may want to implement ASSERT_* using exceptions where they are
+//      available.
+//   2. You cannot use ASSERT_* directly in a constructor or
+//      destructor.
+class Environment {
+ public:
+  // The d'tor is virtual as we need to subclass Environment.
+  virtual ~Environment() {}
+
+  // Override this to define how to set up the environment.
+  virtual void SetUp() {}
+
+  // Override this to define how to tear down the environment.
+  virtual void TearDown() {}
+ private:
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+  virtual ~TestEventListener() {}
+
+  // Fired before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+  // Fired before each iteration of tests starts.  There may be more than
+  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+  // index, starting from 0.
+  virtual void OnTestIterationStart(const UnitTest& unit_test,
+                                    int iteration) = 0;
+
+  // Fired before environment set-up for each iteration of tests starts.
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment set-up for each iteration of tests ends.
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+  // Fired before the test case starts.
+  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+  // Fired before the test starts.
+  virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+  // Fired after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+  // Fired after the test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+  // Fired after the test case ends.
+  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+  // Fired before environment tear-down for each iteration of tests starts.
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment tear-down for each iteration of tests ends.
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+  // Fired after each iteration of tests finishes.
+  virtual void OnTestIterationEnd(const UnitTest& unit_test,
+                                  int iteration) = 0;
+
+  // Fired after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build.  For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {}
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {}
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+  TestEventListeners();
+  ~TestEventListeners();
+
+  // Appends an event listener to the end of the list. Google Test assumes
+  // the ownership of the listener (i.e. it will delete the listener when
+  // the test program finishes).
+  void Append(TestEventListener* listener);
+
+  // Removes the given event listener from the list and returns it.  It then
+  // becomes the caller's responsibility to delete the listener. Returns
+  // NULL if the listener is not found in the list.
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Returns the standard listener responsible for the default console
+  // output.  Can be removed from the listeners list to shut down default
+  // console output.  Note that removing this object from the listener list
+  // with Release transfers its ownership to the caller and makes this
+  // function return NULL the next time.
+  TestEventListener* default_result_printer() const {
+    return default_result_printer_;
+  }
+
+  // Returns the standard listener responsible for the default XML output
+  // controlled by the --gtest_output=xml flag.  Can be removed from the
+  // listeners list by users who want to shut down the default XML output
+  // controlled by this flag and substitute it with custom one.  Note that
+  // removing this object from the listener list with Release transfers its
+  // ownership to the caller and makes this function return NULL the next
+  // time.
+  TestEventListener* default_xml_generator() const {
+    return default_xml_generator_;
+  }
+
+ private:
+  friend class TestCase;
+  friend class TestInfo;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::NoExecDeathTest;
+  friend class internal::TestEventListenersAccessor;
+  friend class internal::UnitTestImpl;
+
+  // Returns repeater that broadcasts the TestEventListener events to all
+  // subscribers.
+  TestEventListener* repeater();
+
+  // Sets the default_result_printer attribute to the provided listener.
+  // The listener is also added to the listener list and previous
+  // default_result_printer is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultResultPrinter(TestEventListener* listener);
+
+  // Sets the default_xml_generator attribute to the provided listener.  The
+  // listener is also added to the listener list and previous
+  // default_xml_generator is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultXmlGenerator(TestEventListener* listener);
+
+  // Controls whether events will be forwarded by the repeater to the
+  // listeners in the list.
+  bool EventForwardingEnabled() const;
+  void SuppressEventForwarding();
+
+  // The actual list of listeners.
+  internal::TestEventRepeater* repeater_;
+  // Listener responsible for the standard result output.
+  TestEventListener* default_result_printer_;
+  // Listener responsible for the creation of the XML output file.
+  TestEventListener* default_xml_generator_;
+
+  // We disallow copying TestEventListeners.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class.  The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called.  This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+  // Gets the singleton UnitTest object.  The first time this method
+  // is called, a UnitTest object is constructed and returned.
+  // Consecutive calls will return the same object.
+  static UnitTest* GetInstance();
+
+  // Runs all tests in this UnitTest object and prints the result.
+  // Returns 0 if successful, or 1 otherwise.
+  //
+  // This method can only be called from the main thread.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  int Run() GTEST_MUST_USE_RESULT_;
+
+  // Returns the working directory when the first TEST() or TEST_F()
+  // was executed.  The UnitTest object owns the string.
+  const char* original_working_dir() const;
+
+  // Returns the TestCase object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the TestInfo object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the random seed used at the start of the current test run.
+  int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns the ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const;
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const;
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const;
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const;
+
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
+  // Returns the list of event listeners that can be used to track events
+  // inside Google Test.
+  TestEventListeners& listeners();
+
+ private:
+  // Registers and returns a global test environment.  When a test
+  // program is run, all global test environments will be set-up in
+  // the order they were registered.  After all tests in the program
+  // have finished, all global test environments will be torn-down in
+  // the *reverse* order they were registered.
+  //
+  // The UnitTest object takes ownership of the given environment.
+  //
+  // This method can only be called from the main thread.
+  Environment* AddEnvironment(Environment* env);
+
+  // Adds a TestPartResult to the current TestResult object.  All
+  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+  // eventually call this to report their results.  The user code
+  // should use the assertion macros instead of calling this directly.
+  void AddTestPartResult(TestPartResult::Type result_type,
+                         const char* file_name,
+                         int line_number,
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i);
+
+  // Accessors for the implementation object.
+  internal::UnitTestImpl* impl() { return impl_; }
+  const internal::UnitTestImpl* impl() const { return impl_; }
+
+  // These classes and funcions are friends as they need to access private
+  // members of UnitTest.
+  friend class Test;
+  friend class internal::AssertHelper;
+  friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
+  friend Environment* AddGlobalTestEnvironment(Environment* env);
+  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+  friend void internal::ReportFailureInUnknownLocation(
+      TestPartResult::Type result_type,
+      const std::string& message);
+
+  // Creates an empty UnitTest.
+  UnitTest();
+
+  // D'tor
+  virtual ~UnitTest();
+
+  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+  // Google Test trace stack.
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Pops a trace from the per-thread Google Test trace stack.
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Protects mutable state in *impl_.  This is mutable as some const
+  // methods need to lock it too.
+  mutable internal::Mutex mutex_;
+
+  // Opaque implementation object.  This field is never changed once
+  // the object is constructed.  We don't mark it as const here, as
+  // doing so will cause a warning in the constructor of UnitTest.
+  // Mutable state in *impl_ is protected by mutex_.
+  internal::UnitTestImpl* impl_;
+
+  // We disallow copying UnitTest.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main().  If you use gtest_main, you need to call this before main()
+// starts for it to take effect.  For example, you can define a global
+// variable like this:
+//
+//   testing::Environment* const foo_env =
+//       testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+  return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message.  The type (but not value)
+// of the other operand may affect the format.  This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            const T1& expected,
+                            const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4389)  // Temporarily disables warning on
+                                // signed/unsigned mismatch.
+#endif
+
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)          // Restores the warning state.
+#endif
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+                                       const char* actual_expression,
+                                       BiggestInt expected,
+                                       BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal.  The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+  // This templatized version is for the general case.
+  template <typename T1, typename T2>
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 const T1& expected,
+                                 const T2& actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // With this overloaded version, we allow anonymous enums to be used
+  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+  // enums can be implicitly cast to BiggestInt.
+  //
+  // Even though its body looks the same as the above version, we
+  // cannot merge the two, as it will make anonymous enums unhappy.
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 BiggestInt expected,
+                                 BiggestInt actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+  // We define two overloaded versions of Compare().  The first
+  // version will be picked when the second argument to ASSERT_EQ() is
+  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+  // EXPECT_EQ(false, a_bool).
+  template <typename T1, typename T2>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      const T1& expected,
+      const T2& actual,
+      // The following line prevents this overload from being considered if T2
+      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
+      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+      // to match the Secret* in the other overload, which would otherwise make
+      // this template match better.
+      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // This version will be picked when the second argument to ASSERT_EQ() is a
+  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+  template <typename T>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      // We used to have a second template parameter instead of Secret*.  That
+      // template parameter would deduce to 'long', making this a better match
+      // than the first overload even without the first overload's EnableIf.
+      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+      // non-pointer argument" (even a deduced integral argument), so the old
+      // implementation caused warnings in user code.
+      Secret* /* expected (NULL) */,
+      T* actual) {
+    // We already know that 'expected' is a null pointer.
+    return CmpHelperEQ(expected_expression, actual_expression,
+                       static_cast<T*>(NULL), actual);
+  }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   const T1& val1, const T2& val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const char* expected,
+                                          const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                              const char* actual_expression,
+                                              const char* expected,
+                                              const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const char* s1,
+                                          const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                              const char* s2_expression,
+                                              const char* s1,
+                                              const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const wchar_t* expected,
+                                          const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const wchar_t* s1,
+                                          const wchar_t* s2);
+
+}  // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves.  They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+                                         const char* actual_expression,
+                                         RawType expected,
+                                         RawType actual) {
+  const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  ::std::stringstream expected_ss;
+  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+              << expected;
+
+  ::std::stringstream actual_ss;
+  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+            << actual;
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   StringStreamToString(&expected_ss),
+                   StringStreamToString(&actual_ss),
+                   false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+                                                const char* expr2,
+                                                const char* abs_error_expr,
+                                                double val1,
+                                                double val2,
+                                                double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+  // Constructor.
+  AssertHelper(TestPartResult::Type type,
+               const char* file,
+               int line,
+               const char* message);
+  ~AssertHelper();
+
+  // Message assignment is a semantic trick to enable assertion
+  // streaming; see the GTEST_MESSAGE_ macro below.
+  void operator=(const Message& message) const;
+
+ private:
+  // We put our data in a struct so that the size of the AssertHelper class can
+  // be as small as possible.  This is important because gcc is incapable of
+  // re-using stack space even for temporary variables, so every EXPECT_EQ
+  // reserves stack space for another AssertHelper.
+  struct AssertHelperData {
+    AssertHelperData(TestPartResult::Type t,
+                     const char* srcfile,
+                     int line_num,
+                     const char* msg)
+        : type(t), file(srcfile), line(line_num), message(msg) { }
+
+    TestPartResult::Type const type;
+    const char* const file;
+    int const line;
+    std::string const message;
+
+   private:
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+  };
+
+  AssertHelperData* const data_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+}  // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+//  protected:
+//   FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual ~FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void SetUp() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void TearDown {
+//     // Can use GetParam() here.
+//   }
+// };
+// TEST_P(FooTest, DoesBar) {
+//   // Can use GetParam() method here.
+//   Foo foo;
+//   ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+  typedef T ParamType;
+  virtual ~WithParamInterface() {}
+
+  // The current parameter value. Is also available in the test fixture's
+  // constructor. This member function is non-static, even though it only
+  // references static data, to reduce the opportunity for incorrect uses
+  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+  // uses a fixture whose parameter type is int.
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
+
+ private:
+  // Sets parameter value. The caller is responsible for making sure the value
+  // remains alive and unchanged throughout the current test.
+  static void SetParam(const ParamType* parameter) {
+    parameter_ = parameter;
+  }
+
+  // Static value used for accessing parameter during a test lifetime.
+  static const ParamType* parameter_;
+
+  // TestClass must be a subclass of WithParamInterface<T> and Test.
+  template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied.  If not,
+// it behaves like ADD_FAILURE.  In particular:
+//
+//   EXPECT_TRUE  verifies that a Boolean condition is true.
+//   EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure.  People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+  GTEST_MESSAGE_AT_(file, line, "Failed", \
+                    ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+//         Tests that the statement throws the expected exception.
+//    * {ASSERT|EXPECT}_NO_THROW(statement):
+//         Tests that the statement doesn't throw any exception.
+//    * {ASSERT|EXPECT}_ANY_THROW(statement):
+//         Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+#include "gtest/gtest_pred_impl.h"
+
+// Macros for testing equalities and inequalities.
+//
+//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
+//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
+//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
+//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
+//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values.  The values must be compatible built-in types,
+// or you will get a compiler error.  By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+//   1. It is possible to make a user-defined type work with
+//   {ASSERT|EXPECT}_??(), but that requires overloading the
+//   comparison operators and is thus discouraged by the Google C++
+//   Usage Guide.  Therefore, you are advised to use the
+//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+//   equal.
+//
+//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+//   pointers (in particular, C strings).  Therefore, if you use it
+//   with two C strings, you are testing how their locations in memory
+//   are related, not how their content is related.  To compare two C
+//   strings by content, use {ASSERT|EXPECT}_STR*().
+//
+//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+//   what the actual value is when it fails, and similarly for the
+//   other comparisons.
+//
+//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+//   evaluate their arguments, which is undefined.
+//
+//   5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+//   EXPECT_NE(5, Foo());
+//   EXPECT_EQ(NULL, a_pointer);
+//   ASSERT_LT(i, array_size);
+//   ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define EXPECT_NE(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
+// as different.  Two NULLs are equal.
+//
+//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
+//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
+//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+//         Tests that two float values are almost equal.
+//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+//         Tests that two double values are almost equal.
+//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+//         Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands.  See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+                                   float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                                    double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif  // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+//   EXPECT_NO_FATAL_FAILURE(Process());
+//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope.  The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+    __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type.  The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template.  This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated.  For example, given:
+//
+//   template <typename T> class Foo {
+//    public:
+//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+//   };
+//
+// the code:
+//
+//   void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated.  Instead, you need:
+//
+//   void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+  return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test".  For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro.  Example:
+//
+//   TEST(FooTest, InitializesCorrectly) {
+//     Foo foo;
+//     EXPECT_TRUE(foo.StatusIsOK());
+//   }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test.  This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X.  The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code.  GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+  GTEST_TEST_(test_case_name, test_name, \
+              ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name.  The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier.  The user should put
+// his test code between braces after using this macro.  Example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { b_.AddElement(3); }
+//
+//     Foo a_;
+//     Foo b_;
+//   };
+//
+//   TEST_F(FooTest, InitializesCorrectly) {
+//     EXPECT_TRUE(a_.StatusIsOK());
+//   }
+//
+//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
+//     EXPECT_EQ(0, a_.size());
+//     EXPECT_EQ(1, b_.size());
+//   }
+
+#define TEST_F(test_fixture, test_name)\
+  GTEST_TEST_(test_fixture, test_name, test_fixture, \
+              ::testing::internal::GetTypeId<test_fixture>())
+
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest_pred_impl.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest_pred_impl.h
new file mode 100644
index 0000000..30ae712
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest_pred_impl.h
@@ -0,0 +1,358 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \
+    ; \
+  else \
+    on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+                                  const char* e1,
+                                  Pred pred,
+                                  const T1& v1) {
+  if (pred(v1)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+                                             #v1, \
+                                             pred, \
+                                             v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2) {
+  if (pred(v1, v2)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             pred, \
+                                             v1, \
+                                             v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3) {
+  if (pred(v1, v2, v3)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4) {
+  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4,
+          typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  const char* e5,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4,
+                                  const T5& v5) {
+  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ", "
+                            << e5 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4
+                            << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             #v5, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4, \
+                                             v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest_prod.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest_prod.h
new file mode 100644
index 0000000..da80ddc
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/gtest_prod.h
@@ -0,0 +1,58 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class.  For example:
+//
+// class MyClass {
+//  private:
+//   void MyMethod();
+//   FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+//   // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+//   // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h
new file mode 100644
index 0000000..2b3a78f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h
@@ -0,0 +1,319 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+#include "gtest/internal/gtest-internal.h"
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status:  The integer exit information in the format specified
+//               by wait(2)
+// exit code:    The integer code passed to exit(3), _exit(2), or
+//               returned from main()
+class GTEST_API_ DeathTest {
+ public:
+  // Create returns false if there was an error determining the
+  // appropriate action to take for the current death test; for example,
+  // if the gtest_death_test_style flag is set to an invalid value.
+  // The LastMessage method will return a more detailed message in that
+  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
+  // argument is set.  If the death test should be skipped, the pointer
+  // is set to NULL; otherwise, it is set to the address of a new concrete
+  // DeathTest object that controls the execution of the current test.
+  static bool Create(const char* statement, const RE* regex,
+                     const char* file, int line, DeathTest** test);
+  DeathTest();
+  virtual ~DeathTest() { }
+
+  // A helper class that aborts a death test when it's deleted.
+  class ReturnSentinel {
+   public:
+    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+   private:
+    DeathTest* const test_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+  } GTEST_ATTRIBUTE_UNUSED_;
+
+  // An enumeration of possible roles that may be taken when a death
+  // test is encountered.  EXECUTE means that the death test logic should
+  // be executed immediately.  OVERSEE means that the program should prepare
+  // the appropriate environment for a child process to execute the death
+  // test, then wait for it to complete.
+  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+  // An enumeration of the three reasons that a test might be aborted.
+  enum AbortReason {
+    TEST_ENCOUNTERED_RETURN_STATEMENT,
+    TEST_THREW_EXCEPTION,
+    TEST_DID_NOT_DIE
+  };
+
+  // Assumes one of the above roles.
+  virtual TestRole AssumeRole() = 0;
+
+  // Waits for the death test to finish and returns its status.
+  virtual int Wait() = 0;
+
+  // Returns true if the death test passed; that is, the test process
+  // exited during the test, its exit status matches a user-supplied
+  // predicate, and its stderr output matches a user-supplied regular
+  // expression.
+  // The user-supplied predicate may be a macro expression rather
+  // than a function pointer or functor, or else Wait and Passed could
+  // be combined.
+  virtual bool Passed(bool exit_status_ok) = 0;
+
+  // Signals that the death test did not die as expected.
+  virtual void Abort(AbortReason reason) = 0;
+
+  // Returns a human-readable outcome message regarding the outcome of
+  // the last death test.
+  static const char* LastMessage();
+
+  static void set_last_death_test_message(const std::string& message);
+
+ private:
+  // A string containing a description of the outcome of the last death test.
+  static std::string last_death_test_message_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests.  May be mocked out for testing.
+class DeathTestFactory {
+ public:
+  virtual ~DeathTestFactory() { }
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  try { \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } catch (const ::std::exception& gtest_exception) { \
+    fprintf(\
+        stderr, \
+        "\n%s: Caught std::exception-derived exception escaping the " \
+        "death test statement. Exception message: %s\n", \
+        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+        gtest_exception.what()); \
+    fflush(stderr); \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  } catch (...) { \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  }
+
+# else
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    const ::testing::internal::RE& gtest_regex = (regex); \
+    ::testing::internal::DeathTest* gtest_dt; \
+    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+        __FILE__, __LINE__, &gtest_dt)) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+    } \
+    if (gtest_dt != NULL) { \
+      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+          gtest_dt_ptr(gtest_dt); \
+      switch (gtest_dt->AssumeRole()) { \
+        case ::testing::internal::DeathTest::OVERSEE_TEST: \
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+          } \
+          break; \
+        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+          ::testing::internal::DeathTest::ReturnSentinel \
+              gtest_sentinel(gtest_dt); \
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+          break; \
+        } \
+        default: \
+          break; \
+      } \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+      fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+  InternalRunDeathTestFlag(const std::string& a_file,
+                           int a_line,
+                           int an_index,
+                           int a_write_fd)
+      : file_(a_file), line_(a_line), index_(an_index),
+        write_fd_(a_write_fd) {}
+
+  ~InternalRunDeathTestFlag() {
+    if (write_fd_ >= 0)
+      posix::Close(write_fd_);
+  }
+
+  const std::string& file() const { return file_; }
+  int line() const { return line_; }
+  int index() const { return index_; }
+  int write_fd() const { return write_fd_; }
+
+ private:
+  std::string file_;
+  int line_;
+  int index_;
+  int write_fd_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else  // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+//   statement -  A statement that a macro such as EXPECT_DEATH would test
+//                for program termination. This macro has to make sure this
+//                statement is compiled but not executed, to ensure that
+//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+//                parameter iff EXPECT_DEATH compiles with it.
+//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
+//                the output of statement.  This parameter has to be
+//                compiled but not evaluated by this macro, to ensure that
+//                this macro only accepts expressions that a macro such as
+//                EXPECT_DEATH would accept.
+//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+//                compile inside functions where ASSERT_DEATH doesn't
+//                compile.
+//
+//  The branch that has an always false condition is used to ensure that
+//  statement and regex are compiled (and thus syntactically correct) but
+//  never executed. The unreachable code macro protects the terminator
+//  statement from generating an 'unreachable code' warning in case
+//  statement unconditionally returns or throws. The Message constructor at
+//  the end allows the syntax of streaming additional messages into the
+//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::AlwaysTrue()) { \
+      GTEST_LOG_(WARNING) \
+          << "Death tests are not supported on this platform.\n" \
+          << "Statement '" #statement "' cannot be verified."; \
+    } else if (::testing::internal::AlwaysFalse()) { \
+      ::testing::internal::RE::PartialMatch(".*", (regex)); \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+      terminator; \
+    } else \
+      ::testing::Message()
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-filepath.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-filepath.h
new file mode 100644
index 0000000..7a13b4b
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-filepath.h
@@ -0,0 +1,206 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+  FilePath() : pathname_("") { }
+  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+    Normalize();
+  }
+
+  FilePath& operator=(const FilePath& rhs) {
+    Set(rhs);
+    return *this;
+  }
+
+  void Set(const FilePath& rhs) {
+    pathname_ = rhs.pathname_;
+  }
+
+  const std::string& string() const { return pathname_; }
+  const char* c_str() const { return pathname_.c_str(); }
+
+  // Returns the current working directory, or "" if unsuccessful.
+  static FilePath GetCurrentDir();
+
+  // Given directory = "dir", base_name = "test", number = 0,
+  // extension = "xml", returns "dir/test.xml". If number is greater
+  // than zero (e.g., 12), returns "dir/test_12.xml".
+  // On Windows platform, uses \ as the separator rather than /.
+  static FilePath MakeFileName(const FilePath& directory,
+                               const FilePath& base_name,
+                               int number,
+                               const char* extension);
+
+  // Given directory = "dir", relative_path = "test.xml",
+  // returns "dir/test.xml".
+  // On Windows, uses \ as the separator rather than /.
+  static FilePath ConcatPaths(const FilePath& directory,
+                              const FilePath& relative_path);
+
+  // Returns a pathname for a file that does not currently exist. The pathname
+  // will be directory/base_name.extension or
+  // directory/base_name_<number>.extension if directory/base_name.extension
+  // already exists. The number will be incremented until a pathname is found
+  // that does not already exist.
+  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+  // There could be a race condition if two or more processes are calling this
+  // function at the same time -- they could both pick the same filename.
+  static FilePath GenerateUniqueFileName(const FilePath& directory,
+                                         const FilePath& base_name,
+                                         const char* extension);
+
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
+
+  // If input name has a trailing separator character, removes it and returns
+  // the name, otherwise return the name string unmodified.
+  // On Windows platform, uses \ as the separator, other platforms use /.
+  FilePath RemoveTrailingPathSeparator() const;
+
+  // Returns a copy of the FilePath with the directory part removed.
+  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+  // returns an empty FilePath ("").
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveDirectoryName() const;
+
+  // RemoveFileName returns the directory path with the filename removed.
+  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveFileName() const;
+
+  // Returns a copy of the FilePath with the case-insensitive extension removed.
+  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+  // FilePath("dir/file"). If a case-insensitive extension is not
+  // found, returns a copy of the original FilePath.
+  FilePath RemoveExtension(const char* extension) const;
+
+  // Creates directories so that path exists. Returns true if successful or if
+  // the directories already exist; returns false if unable to create
+  // directories for any reason. Will also return false if the FilePath does
+  // not represent a directory (that is, it doesn't end with a path separator).
+  bool CreateDirectoriesRecursively() const;
+
+  // Create the directory so that path exists. Returns true if successful or
+  // if the directory already exists; returns false if unable to create the
+  // directory for any reason, including if the parent directory does not
+  // exist. Not named "CreateDirectory" because that's a macro on Windows.
+  bool CreateFolder() const;
+
+  // Returns true if FilePath describes something in the file-system,
+  // either a file, directory, or whatever, and that something exists.
+  bool FileOrDirectoryExists() const;
+
+  // Returns true if pathname describes a directory in the file-system
+  // that exists.
+  bool DirectoryExists() const;
+
+  // Returns true if FilePath ends with a path separator, which indicates that
+  // it is intended to represent a directory. Returns false otherwise.
+  // This does NOT check that a directory (or file) actually exists.
+  bool IsDirectory() const;
+
+  // Returns true if pathname describes a root directory. (Windows has one
+  // root directory per disk drive.)
+  bool IsRootDirectory() const;
+
+  // Returns true if pathname describes an absolute path.
+  bool IsAbsolutePath() const;
+
+ private:
+  // Replaces multiple consecutive separators with a single separator.
+  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+  // redundancies that might be in a pathname involving "." or "..".
+  //
+  // A pathname with multiple consecutive separators may occur either through
+  // user error or as a result of some scripts or APIs that generate a pathname
+  // with a trailing separator. On other platforms the same API or script
+  // may NOT generate a pathname with a trailing "/". Then elsewhere that
+  // pathname may have another "/" and pathname components added to it,
+  // without checking for the separator already being there.
+  // The script language and operating system may allow paths like "foo//bar"
+  // but some of the functions in FilePath will not handle that correctly. In
+  // particular, RemoveTrailingPathSeparator() only removes one separator, and
+  // it is called in CreateDirectoriesRecursively() assuming that it will change
+  // a pathname from directory syntax (trailing separator) to filename syntax.
+  //
+  // On Windows this method also replaces the alternate path separator '/' with
+  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+  // "bar\\foo".
+
+  void Normalize();
+
+  // Returns a pointer to the last occurence of a valid path separator in
+  // the FilePath. On Windows, for example, both '/' and '\' are valid path
+  // separators. Returns NULL if no path separator was found.
+  const char* FindLastPathSeparator() const;
+
+  std::string pathname_;
+};  // class FilePath
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-internal.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-internal.h
new file mode 100644
index 0000000..0dcc3a3
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-internal.h
@@ -0,0 +1,1158 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-string.h"
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/internal/gtest-type-util.h"
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__.  Writing
+//
+//   foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number.  For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult;                 // Result of an assertion.
+class Message;                         // Represents a failure message.
+class Test;                            // Represents a test.
+class TestInfo;                        // Information about a test.
+class TestPartResult;                  // Result of a test part.
+class UnitTest;                        // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo;                      // Information about a trace point.
+class ScopedTrace;                     // Implements scoped trace.
+class TestInfoImpl;                    // Opaque implementation of TestInfo
+class UnitTestImpl;                    // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant).  Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler.  These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise.  Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal.  Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];  // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif  // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+  // The c'tor pushes the given source file location and message onto
+  // a trace stack maintained by Google Test.
+  ScopedTrace(const char* file, int line, const Message& message);
+
+  // The d'tor pops the info pushed by the c'tor.
+  //
+  // Note that the d'tor is not virtual in order to be efficient.
+  // Don't inherit from ScopedTrace!
+  ~ScopedTrace();
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
+                            // c'tor and d'tor.  Therefore it doesn't
+                            // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+                                     const char* actual_expression,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
+                                     bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison.  (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly.  Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+//   The most-significant bit being the leftmost, an IEEE
+//   floating-point looks like
+//
+//     sign_bit exponent_bits fraction_bits
+//
+//   Here, sign_bit is a single bit that designates the sign of the
+//   number.
+//
+//   For float, there are 8 exponent bits and 23 fraction bits.
+//
+//   For double, there are 11 exponent bits and 52 fraction bits.
+//
+//   More details can be found at
+//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+  // Defines the unsigned integer type that has the same size as the
+  // floating point number.
+  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+  // Constants.
+
+  // # of bits in a number.
+  static const size_t kBitCount = 8*sizeof(RawType);
+
+  // # of fraction bits in a number.
+  static const size_t kFractionBitCount =
+    std::numeric_limits<RawType>::digits - 1;
+
+  // # of exponent bits in a number.
+  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+  // The mask for the sign bit.
+  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+  // The mask for the fraction bits.
+  static const Bits kFractionBitMask =
+    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+  // The mask for the exponent bits.
+  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+  // How many ULP's (Units in the Last Place) we want to tolerate when
+  // comparing two numbers.  The larger the value, the more error we
+  // allow.  A 0 value means that two numbers must be exactly the same
+  // to be considered equal.
+  //
+  // The maximum error of a single floating-point operation is 0.5
+  // units in the last place.  On Intel CPU's, all floating-point
+  // calculations are done with 80-bit precision, while double has 64
+  // bits.  Therefore, 4 should be enough for ordinary use.
+  //
+  // See the following article for more details on ULP:
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+  static const size_t kMaxUlps = 4;
+
+  // Constructs a FloatingPoint from a raw floating-point number.
+  //
+  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+  // around may change its bits, although the new value is guaranteed
+  // to be also a NAN.  Therefore, don't expect this constructor to
+  // preserve the bits in x when x is a NAN.
+  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+  // Static methods
+
+  // Reinterprets a bit pattern as a floating-point number.
+  //
+  // This function is needed to test the AlmostEquals() method.
+  static RawType ReinterpretBits(const Bits bits) {
+    FloatingPoint fp(0);
+    fp.u_.bits_ = bits;
+    return fp.u_.value_;
+  }
+
+  // Returns the floating-point number that represent positive infinity.
+  static RawType Infinity() {
+    return ReinterpretBits(kExponentBitMask);
+  }
+
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
+  // Non-static methods
+
+  // Returns the bits that represents this number.
+  const Bits &bits() const { return u_.bits_; }
+
+  // Returns the exponent bits of this number.
+  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+  // Returns the fraction bits of this number.
+  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+  // Returns the sign bit of this number.
+  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+  // Returns true iff this is NAN (not a number).
+  bool is_nan() const {
+    // It's a NAN if the exponent bits are all ones and the fraction
+    // bits are not entirely zeros.
+    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+  }
+
+  // Returns true iff this number is at most kMaxUlps ULP's away from
+  // rhs.  In particular, this function:
+  //
+  //   - returns false if either number is (or both are) NAN.
+  //   - treats really large numbers as almost equal to infinity.
+  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
+  bool AlmostEquals(const FloatingPoint& rhs) const {
+    // The IEEE standard says that any comparison operation involving
+    // a NAN must return false.
+    if (is_nan() || rhs.is_nan()) return false;
+
+    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+        <= kMaxUlps;
+  }
+
+ private:
+  // The data type used to store the actual floating-point number.
+  union FloatingPointUnion {
+    RawType value_;  // The raw floating-point number.
+    Bits bits_;      // The bits that represent the number.
+  };
+
+  // Converts an integer from the sign-and-magnitude representation to
+  // the biased representation.  More precisely, let N be 2 to the
+  // power of (kBitCount - 1), an integer x is represented by the
+  // unsigned number x + N.
+  //
+  // For instance,
+  //
+  //   -N + 1 (the most negative number representable using
+  //          sign-and-magnitude) is represented by 1;
+  //   0      is represented by N; and
+  //   N - 1  (the biggest number representable using
+  //          sign-and-magnitude) is represented by 2N - 1.
+  //
+  // Read http://en.wikipedia.org/wiki/Signed_number_representations
+  // for more details on signed number representations.
+  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+    if (kSignBitMask & sam) {
+      // sam represents a negative number.
+      return ~sam + 1;
+    } else {
+      // sam represents a positive number.
+      return kSignBitMask | sam;
+    }
+  }
+
+  // Given two numbers in the sign-and-magnitude representation,
+  // returns the distance between them as an unsigned number.
+  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+                                                     const Bits &sam2) {
+    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+  }
+
+  FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them.  The TypeId type is
+// used to hold such IDs.  The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+  // dummy_ must not have a const type.  Otherwise an overly eager
+  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+  static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T.  Different values will be
+// returned for different types.  Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+  // The compiler is required to allocate a different
+  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+  // the template.  Therefore, the address of dummy_ is guaranteed to
+  // be unique.
+  return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test.  Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+  virtual ~TestFactoryBase() {}
+
+  // Creates a test instance to run. The instance is both created and destroyed
+  // within TestInfoImpl::Run()
+  virtual Test* CreateTest() = 0;
+
+ protected:
+  TestFactoryBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+  virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+                                            long hr);  // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+                                            long hr);  // NOLINT
+
+#endif  // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param        the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param       text representation of the test's value parameter,
+//                     or NULL if this is not a type-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+  TypedTestCasePState() : registered_(false) {}
+
+  // Adds the given test name to defined_test_names_ and return true
+  // if the test case hasn't been registered; otherwise aborts the
+  // program.
+  bool AddTestName(const char* file, int line, const char* case_name,
+                   const char* test_name) {
+    if (registered_) {
+      fprintf(stderr, "%s Test %s must be defined before "
+              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+              FormatFileLocation(file, line).c_str(), test_name, case_name);
+      fflush(stderr);
+      posix::Abort();
+    }
+    defined_test_names_.insert(test_name);
+    return true;
+  }
+
+  // Verifies that registered_tests match the test names in
+  // defined_test_names_; returns registered_tests if successful, or
+  // aborts the program otherwise.
+  const char* VerifyRegisteredTestNames(
+      const char* file, int line, const char* registered_tests);
+
+ private:
+  bool registered_;
+  ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  if (comma == NULL) {
+    return NULL;
+  }
+  while (IsSpace(*(++comma))) {}
+  return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test.  The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter.  It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+  // 'index' is the index of the test in the type list 'Types'
+  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+  // Types).  Valid values for 'index' are [0, N - 1] where N is the
+  // length of Types.
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names, int index) {
+    typedef typename Types::Head Type;
+    typedef Fixture<Type> FixtureClass;
+    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+    // First, registers the first type-parameterized test in the type
+    // list.
+    MakeAndRegisterTestInfo(
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
+        GetPrefixUntilComma(test_names).c_str(),
+        GetTypeName<Type>().c_str(),
+        NULL,  // No value parameter.
+        GetTypeId<FixtureClass>(),
+        TestClass::SetUpTestCase,
+        TestClass::TearDownTestCase,
+        new TestFactoryImpl<TestClass>);
+
+    // Next, recurses (at compile time) with the tail of the type list.
+    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+        ::Register(prefix, case_name, test_names, index + 1);
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/, int /*index*/) {
+    return true;
+  }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test.  The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names) {
+    typedef typename Tests::Head Head;
+
+    // First, register the first test in 'Test' for each type in 'Types'.
+    TypeParameterizedTest<Fixture, Head, Types>::Register(
+        prefix, case_name, test_names, 0);
+
+    // Next, recurses (at compile time) with the tail of the test list.
+    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+        ::Register(prefix, case_name, SkipComma(test_names));
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/) {
+    return true;
+  }
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+  ConstCharPtr(const char* str) : value(str) {}
+  operator bool() const { return true; }
+  const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution.  Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+  static const UInt32 kMaxRange = 1u << 31;
+
+  explicit Random(UInt32 seed) : state_(seed) {}
+
+  void Reseed(UInt32 seed) { state_ = seed; }
+
+  // Generates a random number from [0, range).  Crashes if 'range' is
+  // 0 or greater than kMaxRange.
+  UInt32 Generate(UInt32 range);
+
+ private:
+  UInt32 state_;
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; };  // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+    typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged.  This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; };  // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'.  The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+    typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+    typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary.  For example,
+// it transforms
+//
+//   char         ==> const char&
+//   const char   ==> const char&
+//   char&        ==> const char&
+//   const char&  ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+  // We need the following helper functions only for their types.
+  // They have no implementations.
+
+  // MakeFrom() is an expression whose type is From.  We cannot simply
+  // use From(), as the type From may not have a public default
+  // constructor.
+  static From MakeFrom();
+
+  // These two functions are overloaded.  Given an expression
+  // Helper(x), the compiler will pick the first version if x can be
+  // implicitly converted to type To; otherwise it will pick the
+  // second version.
+  //
+  // The first version returns a value of size 1, and the second
+  // version returns a value of size 2.  Therefore, by checking the
+  // size of Helper(x), which can be done at compile time, we can tell
+  // which version of Helper() is used, and hence whether x can be
+  // implicitly converted to type To.
+  static char Helper(To);
+  static char (&Helper(...))[2];  // NOLINT
+
+  // We have to put the 'public' section after the 'private' section,
+  // or MSVC refuses to compile the code.
+ public:
+  // MSVC warns about implicitly converting from double to int for
+  // possible loss of data, so we need to temporarily disable the
+  // warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4244)  // Temporarily disables warning 4244.
+
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop)           // Restores the warning state.
+#elif defined(__BORLANDC__)
+  // C++Builder cannot use member overload resolution during template
+  // instantiation.  The simplest workaround is to use its C++0x type traits
+  // functions (C++Builder 2009 and above only).
+  static const bool value = __is_convertible(From, To);
+#else
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif  // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+    : public bool_constant<
+  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them).  It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0.  If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked.  Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator.  The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator').  If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+                            typename C::iterator* /* it */ = NULL,
+                            typename C::const_iterator* /* const_it */ = NULL) {
+  return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false.  To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; };  // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0.  When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+  return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+  for (size_t i = 0; i != size; i++) {
+    if (!internal::ArrayEq(lhs[i], rhs[i]))
+      return false;
+  }
+  return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem.  Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+  for (Iter it = begin; it != end; ++it) {
+    if (internal::ArrayEq(*it, elem))
+      return it;
+  }
+  return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0.  When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+  internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+  for (size_t i = 0; i != size; i++) {
+    internal::CopyArray(from[i], to + i);
+  }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+  kReference,  // The NativeArray references the native array.
+  kCopy        // The NativeArray makes a copy of the native array and
+               // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container.  Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers.  New members
+// should be added as needed.  To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier).  It's the client's responsibility to satisfy
+// this requirement.  Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+  // STL-style container typedefs.
+  typedef Element value_type;
+  typedef Element* iterator;
+  typedef const Element* const_iterator;
+
+  // Constructs from a native array.
+  NativeArray(const Element* array, size_t count, RelationToSource relation) {
+    Init(array, count, relation);
+  }
+
+  // Copy constructor.
+  NativeArray(const NativeArray& rhs) {
+    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+  }
+
+  ~NativeArray() {
+    // Ensures that the user doesn't instantiate NativeArray with a
+    // const or reference type.
+    static_cast<void>(StaticAssertTypeEqHelper<Element,
+        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+    if (relation_to_source_ == kCopy)
+      delete[] array_;
+  }
+
+  // STL-style container methods.
+  size_t size() const { return size_; }
+  const_iterator begin() const { return array_; }
+  const_iterator end() const { return array_ + size_; }
+  bool operator==(const NativeArray& rhs) const {
+    return size() == rhs.size() &&
+        ArrayEq(begin(), size(), rhs.begin());
+  }
+
+ private:
+  // Initializes this object; makes a copy of the input array if
+  // 'relation' is kCopy.
+  void Init(const Element* array, size_t a_size, RelationToSource relation) {
+    if (relation == kReference) {
+      array_ = array;
+    } else {
+      Element* const copy = new Element[a_size];
+      CopyArray(array, a_size, copy);
+      array_ = copy;
+    }
+    size_ = a_size;
+    relation_to_source_ = relation;
+  }
+
+  const Element* array_;
+  size_t size_;
+  RelationToSource relation_to_source_;
+
+  GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+  ::testing::internal::AssertHelper(result_type, file, line, message) \
+    = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+  if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+    bool gtest_caught_expected = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (expected_exception const&) { \
+      gtest_caught_expected = true; \
+    } \
+    catch (...) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws a different type."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+    if (!gtest_caught_expected) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws nothing."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+      fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+      fail("Expected: " #statement " doesn't throw an exception.\n" \
+           "  Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    bool gtest_caught_any = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      gtest_caught_any = true; \
+    } \
+    if (!gtest_caught_any) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+      fail("Expected: " #statement " throws an exception.\n" \
+           "  Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar_ = \
+      ::testing::AssertionResult(expression)) \
+    ; \
+  else \
+    fail(::testing::internal::GetBoolAssertionFailureMessage(\
+        gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+      fail("Expected: " #statement " doesn't generate new fatal " \
+           "failures in the current thread.\n" \
+           "  Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+  test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+  virtual void TestBody();\
+  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+  ::test_info_ =\
+    ::testing::internal::MakeAndRegisterTestInfo(\
+        #test_case_name, #test_name, NULL, NULL, \
+        (parent_id), \
+        parent_class::SetUpTestCase, \
+        parent_class::TearDownTestCase, \
+        new ::testing::internal::TestFactoryImpl<\
+            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h
new file mode 100644
index 0000000..b1362cd
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h
@@ -0,0 +1,233 @@
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking.  Every pointer to a
+// particular object is kept on a circular linked list.  When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+//   object is traversed.  This class is therefore NOT SUITABLE when there
+//   will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+//   will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+//   Unlike other linked_ptr implementations, in this implementation
+//   a linked_ptr object is thread-safe in the sense that:
+//     - it's safe to copy linked_ptr objects concurrently,
+//     - it's safe to copy *from* a linked_ptr and read its underlying
+//       raw pointer (e.g. via get()) concurrently, and
+//     - it's safe to write to two linked_ptrs that point to the same
+//       shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>.  It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+  // Create a new circle that includes only this instance.
+  void join_new() {
+    next_ = this;
+  }
+
+  // Many linked_ptr operations may change p.link_ for some linked_ptr
+  // variable p in the same circle as this object.  Therefore we need
+  // to prevent two such operations from occurring concurrently.
+  //
+  // Note that different types of linked_ptr objects can coexist in a
+  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
+  // protect all linked_ptr objects.  This can create serious
+  // contention in production code, but is acceptable in a testing
+  // framework.
+
+  // Join an existing circle.
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    linked_ptr_internal const* p = ptr;
+    while (p->next_ != ptr) p = p->next_;
+    p->next_ = this;
+    next_ = ptr;
+  }
+
+  // Leave whatever circle we're part of.  Returns true if we were the
+  // last member of the circle.  Once this is done, you can join() another.
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    if (next_ == this) return true;
+    linked_ptr_internal const* p = next_;
+    while (p->next_ != this) p = p->next_;
+    p->next_ = next_;
+    return false;
+  }
+
+ private:
+  mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+  typedef T element_type;
+
+  // Take over ownership of a raw pointer.  This should happen as soon as
+  // possible after the object is created.
+  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+  ~linked_ptr() { depart(); }
+
+  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+  linked_ptr(linked_ptr const& ptr) {  // NOLINT
+    assert(&ptr != this);
+    copy(&ptr);
+  }
+
+  // Assignment releases the old value and acquires the new.
+  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+    depart();
+    copy(&ptr);
+    return *this;
+  }
+
+  linked_ptr& operator=(linked_ptr const& ptr) {
+    if (&ptr != this) {
+      depart();
+      copy(&ptr);
+    }
+    return *this;
+  }
+
+  // Smart pointer members.
+  void reset(T* ptr = NULL) {
+    depart();
+    capture(ptr);
+  }
+  T* get() const { return value_; }
+  T* operator->() const { return value_; }
+  T& operator*() const { return *value_; }
+
+  bool operator==(T* p) const { return value_ == p; }
+  bool operator!=(T* p) const { return value_ != p; }
+  template <typename U>
+  bool operator==(linked_ptr<U> const& ptr) const {
+    return value_ == ptr.get();
+  }
+  template <typename U>
+  bool operator!=(linked_ptr<U> const& ptr) const {
+    return value_ != ptr.get();
+  }
+
+ private:
+  template <typename U>
+  friend class linked_ptr;
+
+  T* value_;
+  linked_ptr_internal link_;
+
+  void depart() {
+    if (link_.depart()) delete value_;
+  }
+
+  void capture(T* ptr) {
+    value_ = ptr;
+    link_.join_new();
+  }
+
+  template <typename U> void copy(linked_ptr<U> const* ptr) {
+    value_ = ptr->get();
+    if (value_)
+      link_.join(&ptr->link_);
+    else
+      link_.join_new();
+  }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+  return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+  return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+  return linked_ptr<T>(ptr);
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h
new file mode 100644
index 0000000..e805485
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h
@@ -0,0 +1,5143 @@
+// This file was GENERATED by command:
+//     pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray2& other);
+
+  const T1 v1_;
+  const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray3& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray4& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray5& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class ValueArray6 {
+ public:
+  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray6& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class ValueArray7 {
+ public:
+  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray7& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray8& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray9& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray10& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+class ValueArray11 {
+ public:
+  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray11& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+class ValueArray12 {
+ public:
+  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray12& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray13& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray14& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray15& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+class ValueArray16 {
+ public:
+  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray16& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+class ValueArray17 {
+ public:
+  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray17& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray18& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray19& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray20& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+class ValueArray21 {
+ public:
+  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray21& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+class ValueArray22 {
+ public:
+  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray22& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray23& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray24& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray25& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+class ValueArray26 {
+ public:
+  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray26& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+class ValueArray27 {
+ public:
+  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray27& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray28& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray29& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray30& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+class ValueArray31 {
+ public:
+  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray31& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+class ValueArray32 {
+ public:
+  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray32& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray33& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray34& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray35& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+class ValueArray36 {
+ public:
+  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray36& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+class ValueArray37 {
+ public:
+  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray37& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray38& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray39& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray40& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+class ValueArray41 {
+ public:
+  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray41& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+class ValueArray42 {
+ public:
+  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray42& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray43& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+      v43_(v43), v44_(v44) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray44& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray45& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+class ValueArray46 {
+ public:
+  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray46& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+class ValueArray47 {
+ public:
+  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+      v47_(v47) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray47& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+      v46_(v46), v47_(v47), v48_(v48) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray48& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray49& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray50& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+  const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2)
+      : g1_(g1), g2_(g2) {}
+  virtual ~CartesianProductGenerator2() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current2_;
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator2::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator2& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+};  // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  virtual ~CartesianProductGenerator3() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current3_;
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator3::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator3& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+};  // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  virtual ~CartesianProductGenerator4() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current4_;
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator4::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator4& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+};  // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  virtual ~CartesianProductGenerator5() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current5_;
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator5::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator5& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+};  // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class CartesianProductGenerator6
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+        T6> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  virtual ~CartesianProductGenerator6() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current6_;
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator6::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator6& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+};  // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class CartesianProductGenerator7
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  virtual ~CartesianProductGenerator7() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current7_;
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator7::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator7& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+};  // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  virtual ~CartesianProductGenerator8() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current8_;
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator8::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator8& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+};  // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  virtual ~CartesianProductGenerator9() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current9_;
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator9::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator9& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+};  // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9, T10> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+      const ParamGenerator<T10>& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  virtual ~CartesianProductGenerator10() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9,
+      const ParamGenerator<T10>& g10,
+      const typename ParamGenerator<T10>::iterator& current10)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current10_;
+      if (current10_ == end10_) {
+        current10_ = begin10_;
+        ++current9_;
+      }
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_ &&
+          current10_ == typed_other->current10_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_),
+        begin10_(other.begin10_),
+        end10_(other.end10_),
+        current10_(other.current10_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_, *current10_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_ ||
+          current10_ == end10_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    const typename ParamGenerator<T10>::iterator begin10_;
+    const typename ParamGenerator<T10>::iterator end10_;
+    typename ParamGenerator<T10>::iterator current10_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator10::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator10& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+  const ParamGenerator<T10> g10_;
+};  // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+      : g1_(g1), g2_(g2) {}
+  template <typename T1, typename T2>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+        new CartesianProductGenerator2<T1, T2>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder2& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+};  // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  template <typename T1, typename T2, typename T3>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+        new CartesianProductGenerator3<T1, T2, T3>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder3& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+};  // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  template <typename T1, typename T2, typename T3, typename T4>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+        new CartesianProductGenerator4<T1, T2, T3, T4>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder4& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+};  // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder5& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+};  // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder6& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+};  // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+      T7> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder7& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+};  // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+      T8> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder8& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+};  // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9> >(
+        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder9& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+};  // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9, const Generator10& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9, typename T10>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9, T10> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9, T10> >(
+        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+            T10>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_),
+        static_cast<ParamGenerator<T10> >(g10_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder10& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+  const Generator10 g10_;
+};  // class CartesianProductHolder10
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump
new file mode 100644
index 0000000..009206f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump
@@ -0,0 +1,301 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of Values arguments we want to support.
+$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most $n arguments in Values,
+// and at most $maxtuple arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at $maxtuple.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+$range i 2..n
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename T$j]]>
+class ValueArray$i {
+ public:
+  ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray$i& other);
+
+$for j [[
+
+  const T$j v$(j)_;
+]]
+
+};
+
+]]
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+$range k 2..i
+
+template <$for j, [[typename T$j]]>
+class CartesianProductGenerator$i
+    : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > {
+ public:
+  typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType;
+
+  CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
+      : $for j, [[g$(j)_(g$j)]] {}
+  virtual ~CartesianProductGenerator$i() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
+
+      const ParamGenerator<T$j>& g$j,
+      const typename ParamGenerator<T$j>::iterator& current$(j)]])
+        : base_(base),
+$for j, [[
+
+          begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
+]]    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current$(i)_;
+
+$for k [[
+      if (current$(i+2-k)_ == end$(i+2-k)_) {
+        current$(i+2-k)_ = begin$(i+2-k)_;
+        ++current$(i+2-k-1)_;
+      }
+
+]]
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         ($for j  && [[
+
+          current$(j)_ == typed_other->current$(j)_
+]]);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_), $for j, [[
+
+        begin$(j)_(other.begin$(j)_),
+        end$(j)_(other.end$(j)_),
+        current$(j)_(other.current$(j)_)
+]] {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType($for j, [[*current$(j)_]]);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+$for j  || [[
+
+          current$(j)_ == end$(j)_
+]];
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+$for j [[
+
+    const typename ParamGenerator<T$j>::iterator begin$(j)_;
+    const typename ParamGenerator<T$j>::iterator end$(j)_;
+    typename ParamGenerator<T$j>::iterator current$(j)_;
+]]
+
+    ParamType current_value_;
+  };  // class CartesianProductGenerator$i::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator$i& other);
+
+
+$for j [[
+  const ParamGenerator<T$j> g$(j)_;
+
+]]
+};  // class CartesianProductGenerator$i
+
+
+]]
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+
+template <$for j, [[class Generator$j]]>
+class CartesianProductHolder$i {
+ public:
+CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
+      : $for j, [[g$(j)_(g$j)]] {}
+  template <$for j, [[typename T$j]]>
+  operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const {
+    return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >(
+        new CartesianProductGenerator$i<$for j, [[T$j]]>(
+$for j,[[
+
+        static_cast<ParamGenerator<T$j> >(g$(j)_)
+]]));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder$i& other);
+
+
+$for j [[
+  const Generator$j g$(j)_;
+
+]]
+};  // class CartesianProductHolder$i
+
+]]
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util.h
new file mode 100644
index 0000000..d5e1028
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-param-util.h
@@ -0,0 +1,619 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-linked_ptr.h"
+#include "gtest/internal/gtest-port.h"
+#include "gtest/gtest-printers.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+                                          const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+  virtual ~ParamIteratorInterface() {}
+  // A pointer to the base generator instance.
+  // Used only for the purposes of iterator comparison
+  // to make sure that two iterators belong to the same generator.
+  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+  // Advances iterator to point to the next element
+  // provided by the generator. The caller is responsible
+  // for not calling Advance() on an iterator equal to
+  // BaseGenerator()->End().
+  virtual void Advance() = 0;
+  // Clones the iterator object. Used for implementing copy semantics
+  // of ParamIterator<T>.
+  virtual ParamIteratorInterface* Clone() const = 0;
+  // Dereferences the current iterator and provides (read-only) access
+  // to the pointed value. It is the caller's responsibility not to call
+  // Current() on an iterator equal to BaseGenerator()->End().
+  // Used for implementing ParamGenerator<T>::operator*().
+  virtual const T* Current() const = 0;
+  // Determines whether the given iterator and other point to the same
+  // element in the sequence generated by the generator.
+  // Used for implementing ParamGenerator<T>::operator==().
+  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+  typedef T value_type;
+  typedef const T& reference;
+  typedef ptrdiff_t difference_type;
+
+  // ParamIterator assumes ownership of the impl_ pointer.
+  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+  ParamIterator& operator=(const ParamIterator& other) {
+    if (this != &other)
+      impl_.reset(other.impl_->Clone());
+    return *this;
+  }
+
+  const T& operator*() const { return *impl_->Current(); }
+  const T* operator->() const { return impl_->Current(); }
+  // Prefix version of operator++.
+  ParamIterator& operator++() {
+    impl_->Advance();
+    return *this;
+  }
+  // Postfix version of operator++.
+  ParamIterator operator++(int /*unused*/) {
+    ParamIteratorInterface<T>* clone = impl_->Clone();
+    impl_->Advance();
+    return ParamIterator(clone);
+  }
+  bool operator==(const ParamIterator& other) const {
+    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+  }
+  bool operator!=(const ParamIterator& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  friend class ParamGenerator<T>;
+  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+  scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+  typedef T ParamType;
+
+  virtual ~ParamGeneratorInterface() {}
+
+  // Generator interface definition
+  virtual ParamIteratorInterface<T>* Begin() const = 0;
+  virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+  typedef ParamIterator<T> iterator;
+
+  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+  ParamGenerator& operator=(const ParamGenerator& other) {
+    impl_ = other.impl_;
+    return *this;
+  }
+
+  iterator begin() const { return iterator(impl_->Begin()); }
+  iterator end() const { return iterator(impl_->End()); }
+
+ private:
+  linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  RangeGenerator(T begin, T end, IncrementT step)
+      : begin_(begin), end_(end),
+        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+  virtual ~RangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, begin_, 0, step_);
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, end_, end_index_, step_);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+             IncrementT step)
+        : base_(base), value_(value), index_(index), step_(step) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      value_ = value_ + step_;
+      index_++;
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const T* Current() const { return &value_; }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const int other_index =
+          CheckedDowncastToActualType<const Iterator>(&other)->index_;
+      return index_ == other_index;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : ParamIteratorInterface<T>(),
+          base_(other.base_), value_(other.value_), index_(other.index_),
+          step_(other.step_) {}
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<T>* const base_;
+    T value_;
+    int index_;
+    const IncrementT step_;
+  };  // class RangeGenerator::Iterator
+
+  static int CalculateEndIndex(const T& begin,
+                               const T& end,
+                               const IncrementT& step) {
+    int end_index = 0;
+    for (T i = begin; i < end; i = i + step)
+      end_index++;
+    return end_index;
+  }
+
+  // No implementation - assignment is unsupported.
+  void operator=(const RangeGenerator& other);
+
+  const T begin_;
+  const T end_;
+  const IncrementT step_;
+  // The index for the end() iterator. All the elements in the generated
+  // sequence are indexed (0-based) to aid iterator comparison.
+  const int end_index_;
+};  // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  template <typename ForwardIterator>
+  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+      : container_(begin, end) {}
+  virtual ~ValuesInIteratorRangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, container_.begin());
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, container_.end());
+  }
+
+ private:
+  typedef typename ::std::vector<T> ContainerType;
+
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base,
+             typename ContainerType::const_iterator iterator)
+        : base_(base), iterator_(iterator) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      ++iterator_;
+      value_.reset();
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    // We need to use cached value referenced by iterator_ because *iterator_
+    // can return a temporary object (and of type other then T), so just
+    // having "return &*iterator_;" doesn't work.
+    // value_ is updated here and not in Advance() because Advance()
+    // can advance iterator_ beyond the end of the range, and we cannot
+    // detect that fact. The client code, on the other hand, is
+    // responsible for not calling Current() on an out-of-range iterator.
+    virtual const T* Current() const {
+      if (value_.get() == NULL)
+        value_.reset(new T(*iterator_));
+      return value_.get();
+    }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      return iterator_ ==
+          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+          // The explicit constructor call suppresses a false warning
+          // emitted by gcc when supplied with the -Wextra option.
+        : ParamIteratorInterface<T>(),
+          base_(other.base_),
+          iterator_(other.iterator_) {}
+
+    const ParamGeneratorInterface<T>* const base_;
+    typename ContainerType::const_iterator iterator_;
+    // A cached value of *iterator_. We keep it here to allow access by
+    // pointer in the wrapping iterator's operator->().
+    // value_ needs to be mutable to be accessed in Current().
+    // Use of scoped_ptr helps manage cached value's lifetime,
+    // which is bound by the lifespan of the iterator itself.
+    mutable scoped_ptr<const T> value_;
+  };  // class ValuesInIteratorRangeGenerator::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const ValuesInIteratorRangeGenerator& other);
+
+  const ContainerType container_;
+};  // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+  typedef typename TestClass::ParamType ParamType;
+  explicit ParameterizedTestFactory(ParamType parameter) :
+      parameter_(parameter) {}
+  virtual Test* CreateTest() {
+    TestClass::SetParam(&parameter_);
+    return new TestClass();
+  }
+
+ private:
+  const ParamType parameter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+  virtual ~TestMetaFactoryBase() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+    : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+  typedef typename TestCase::ParamType ParamType;
+
+  TestMetaFactory() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+    return new ParameterizedTestFactory<TestCase>(parameter);
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+  virtual ~ParameterizedTestCaseInfoBase() {}
+
+  // Base part of test case name for display purposes.
+  virtual const string& GetTestCaseName() const = 0;
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const = 0;
+  // UnitTest class invokes this method to register tests in this
+  // test case right before running them in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  virtual void RegisterTests() = 0;
+
+ protected:
+  ParameterizedTestCaseInfoBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+  // ParamType and GeneratorCreationFunc are private types but are required
+  // for declarations of public methods AddTestPattern() and
+  // AddTestCaseInstantiation().
+  typedef typename TestCase::ParamType ParamType;
+  // A function that returns an instance of appropriate generator type.
+  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+  explicit ParameterizedTestCaseInfo(const char* name)
+      : test_case_name_(name) {}
+
+  // Test case base name for display purposes.
+  virtual const string& GetTestCaseName() const { return test_case_name_; }
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+  // TEST_P macro uses AddTestPattern() to record information
+  // about a single test in a LocalTestInfo structure.
+  // test_case_name is the base name of the test case (without invocation
+  // prefix). test_base_name is the name of an individual test without
+  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+  // test case base name and DoBar is test base name.
+  void AddTestPattern(const char* test_case_name,
+                      const char* test_base_name,
+                      TestMetaFactoryBase<ParamType>* meta_factory) {
+    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+                                                       test_base_name,
+                                                       meta_factory)));
+  }
+  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+  // about a generator.
+  int AddTestCaseInstantiation(const string& instantiation_name,
+                               GeneratorCreationFunc* func,
+                               const char* /* file */,
+                               int /* line */) {
+    instantiations_.push_back(::std::make_pair(instantiation_name, func));
+    return 0;  // Return value used only to run this method in namespace scope.
+  }
+  // UnitTest class invokes this method to register tests in this test case
+  // test cases right before running tests in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  // UnitTest has a guard to prevent from calling this method more then once.
+  virtual void RegisterTests() {
+    for (typename TestInfoContainer::iterator test_it = tests_.begin();
+         test_it != tests_.end(); ++test_it) {
+      linked_ptr<TestInfo> test_info = *test_it;
+      for (typename InstantiationContainer::iterator gen_it =
+               instantiations_.begin(); gen_it != instantiations_.end();
+               ++gen_it) {
+        const string& instantiation_name = gen_it->first;
+        ParamGenerator<ParamType> generator((*gen_it->second)());
+
+        string test_case_name;
+        if ( !instantiation_name.empty() )
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
+
+        int i = 0;
+        for (typename ParamGenerator<ParamType>::iterator param_it =
+                 generator.begin();
+             param_it != generator.end(); ++param_it, ++i) {
+          Message test_name_stream;
+          test_name_stream << test_info->test_base_name << "/" << i;
+          MakeAndRegisterTestInfo(
+              test_case_name.c_str(),
+              test_name_stream.GetString().c_str(),
+              NULL,  // No type parameter.
+              PrintToString(*param_it).c_str(),
+              GetTestCaseTypeId(),
+              TestCase::SetUpTestCase,
+              TestCase::TearDownTestCase,
+              test_info->test_meta_factory->CreateTestFactory(*param_it));
+        }  // for param_it
+      }  // for gen_it
+    }  // for test_it
+  }  // RegisterTests
+
+ private:
+  // LocalTestInfo structure keeps information about a single test registered
+  // with TEST_P macro.
+  struct TestInfo {
+    TestInfo(const char* a_test_case_base_name,
+             const char* a_test_base_name,
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+        test_case_base_name(a_test_case_base_name),
+        test_base_name(a_test_base_name),
+        test_meta_factory(a_test_meta_factory) {}
+
+    const string test_case_base_name;
+    const string test_base_name;
+    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+  };
+  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+  // Keeps pairs of <Instantiation name, Sequence generator creation function>
+  // received from INSTANTIATE_TEST_CASE_P macros.
+  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+      InstantiationContainer;
+
+  const string test_case_name_;
+  TestInfoContainer tests_;
+  InstantiationContainer instantiations_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+};  // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+  ParameterizedTestCaseRegistry() {}
+  ~ParameterizedTestCaseRegistry() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      delete *it;
+    }
+  }
+
+  // Looks up or creates and returns a structure containing information about
+  // tests and instantiations of a particular test case.
+  template <class TestCase>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+      const char* test_case_name,
+      const char* file,
+      int line) {
+    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      if ((*it)->GetTestCaseName() == test_case_name) {
+        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+          // Complain about incorrect usage of Google Test facilities
+          // and terminate the program since we cannot guaranty correct
+          // test case setup and tear-down in this case.
+          ReportInvalidTestCaseType(test_case_name,  file, line);
+          posix::Abort();
+        } else {
+          // At this point we are sure that the object we found is of the same
+          // type we are looking for, so we downcast it to that type
+          // without further checks.
+          typed_test_info = CheckedDowncastToActualType<
+              ParameterizedTestCaseInfo<TestCase> >(*it);
+        }
+        break;
+      }
+    }
+    if (typed_test_info == NULL) {
+      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+      test_case_infos_.push_back(typed_test_info);
+    }
+    return typed_test_info;
+  }
+  void RegisterTests() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      (*it)->RegisterTests();
+    }
+  }
+
+ private:
+  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+  TestCaseInfoContainer test_case_infos_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-port.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-port.h
new file mode 100644
index 0000000..dc4fe0c
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-port.h
@@ -0,0 +1,1947 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms.  They are subject to change without notice.  DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior.  If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
+//                              is/isn't available.
+//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
+//                              are enabled.
+//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::string, which is different to std::string).
+//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::wstring, which is different to std::wstring).
+//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
+//                              expressions are/aren't available.
+//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
+//                              is/isn't available.
+//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
+//                              enabled.
+//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
+//                              std::wstring does/doesn't work (Google Test can
+//                              be used where std::wstring is unavailable).
+//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
+//                              is/isn't available.
+//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
+//                              compiler supports Microsoft's "Structured
+//                              Exception Handling".
+//   GTEST_HAS_STREAM_REDIRECTION
+//                            - Define it to 1/0 to indicate whether the
+//                              platform supports I/O stream redirection using
+//                              dup() and dup2().
+//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
+//                              Test's own tr1 tuple implementation should be
+//                              used.  Unused when the user sets
+//                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
+//   GTEST_LINKED_AS_SHARED_LIBRARY
+//                            - Define to 1 when compiling tests that use
+//                              Google Test as a shared library (known as
+//                              DLL on Windows).
+//   GTEST_CREATE_SHARED_LIBRARY
+//                            - Define to 1 when compiling Google Test itself
+//                              as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+//   GTEST_OS_AIX      - IBM AIX
+//   GTEST_OS_CYGWIN   - Cygwin
+//   GTEST_OS_HPUX     - HP-UX
+//   GTEST_OS_LINUX    - Linux
+//     GTEST_OS_LINUX_ANDROID - Google Android
+//   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
+//   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
+//   GTEST_OS_SOLARIS  - Sun Solaris
+//   GTEST_OS_SYMBIAN  - Symbian
+//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
+//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
+//     GTEST_OS_WINDOWS_MINGW    - MinGW
+//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
+//   GTEST_OS_ZOS      - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support.  Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable.  If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
+//                            tests)
+//   GTEST_HAS_DEATH_TEST   - death tests
+//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
+//   GTEST_HAS_TYPED_TEST   - typed tests
+//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
+//                            GTEST_HAS_POSIX_RE (see above) which users can
+//                            define themselves.
+//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
+//                            the above two are mutually exclusive.
+//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
+//                              variable don't have to be used.
+//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
+//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
+//
+// Synchronization:
+//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
+//                  - synchronization primitives.
+//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+//                         synchronization primitives have real implementations
+//                         and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
+//   IteratorTraits - partial implementation of std::iterator_traits, which
+//                    is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+//   scoped_ptr     - as in TR2.
+//
+// Regular expressions:
+//   RE             - a simple regular expression class using the POSIX
+//                    Extended Regular Expression syntax on UNIX-like
+//                    platforms, or a reduced regular exception syntax on
+//                    other platforms, including Windows.
+//
+// Logging:
+//   GTEST_LOG_()   - logs messages at the specified severity level.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+//   CaptureStdout()     - starts capturing stdout.
+//   GetCapturedStdout() - stops capturing stdout and returns the captured
+//                         string.
+//   CaptureStderr()     - starts capturing stderr.
+//   GetCapturedStderr() - stops capturing stderr and returns the captured
+//                         string.
+//
+// Integer types:
+//   TypeWithSize   - maps an integer to a int type.
+//   Int32, UInt32, Int64, UInt64, TimeInMillis
+//                  - integers of known sizes.
+//   BiggestInt     - the biggest signed integer type.
+//
+// Command-line utilities:
+//   GTEST_FLAG()       - references a flag.
+//   GTEST_DECLARE_*()  - declares a flag.
+//   GTEST_DEFINE_*()   - defines a flag.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+//   GetEnv()             - gets the value of an environment variable.
+//   BoolFromGTestEnv()   - parses a bool environment variable.
+//   Int32FromGTestEnv()  - parses an Int32 environment variable.
+//   StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h>   // for isspace, etc
+#include <stddef.h>  // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif  // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream>  // NOLINT
+#include <sstream>  // NOLINT
+#include <string>  // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif  // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+#  define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+#  define GTEST_OS_WINDOWS_MINGW 1
+# else
+#  define GTEST_OS_WINDOWS_DESKTOP 1
+# endif  // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+#  define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif  // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise.  We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h>  // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows.  Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform.  Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif  // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+#  ifndef _HAS_EXCEPTIONS
+#   define _HAS_EXCEPTIONS 1
+#  endif  // _HAS_EXCEPTIONS
+#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions.  However, there is no compile-time way of
+// detecting whether they are enabled or not.  Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+#  define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+#  define GTEST_HAS_EXCEPTIONS 0
+# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif  // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif  // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+//   is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either.  Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+#  ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif  // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+#  ifdef __RTTI_ALL__
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+#  define GTEST_HAS_RTTI 1
+
+# endif  // _MSC_VER
+
+#endif  // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
+#endif  // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h>  // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h>  // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple.  You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+#  define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+#  define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif  // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+#  include "gtest/internal/gtest-tuple.h"
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+#  ifdef BOOST_HAS_TR1_TUPLE
+#   undef BOOST_HAS_TR1_TUPLE
+#  endif  // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled.  _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>.  Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#   define _TR1_FUNCTIONAL 1
+#   include <tr1/tuple>
+#   undef _TR1_FUNCTIONAL  // Allows the user to #include
+                        // <tr1/functional> if he chooses to.
+#  else
+#   include <tr1/tuple>  // NOLINT
+#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+#  include <tuple>  // NOLINT
+# endif  // GTEST_USE_OWN_TR1_TUPLE
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
+# else
+#  define GTEST_HAS_CLONE 0
+# endif  // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif  // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+#  define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+#  define GTEST_HAS_STREAM_REDIRECTION 1
+# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector>  // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+    defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled.  The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding.  This leads to problems with code like:
+//
+//   if (gate)
+//     ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used.  This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor.  Example:
+//
+//   struct Foo {
+//     Foo() { ... }
+//   } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+  void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+  type(type const &);\
+  GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro.  The macro should be used on function declarations
+// following the argument list:
+//
+//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling.  This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+#  define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+#  define GTEST_HAS_SEH 0
+# endif
+
+#endif  // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif  // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+//                         content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+//   elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+//   does not work, as gcc supports variable-length arrays whose sizes
+//   are determined at run-time (this is gcc's extension and not part
+//   of the C++ standard).  As a result, gcc fails to reject the
+//   following code with the simple definition:
+//
+//     int foo;
+//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+//                                      // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+//   expr is a compile-time constant.  (Template arguments must be
+//   determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
+//
+//     CompileAssert<bool(expr)>
+//
+//   instead, these compilers will refuse to compile
+//
+//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+//   (They seem to think the ">" in "5 > 0" marks the end of the
+//   template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+//     ((expr) ? 1 : -1).
+//
+//   This is to avoid running into a bug in MS VC 7.1, which
+//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition.  It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+  typedef T element_type;
+
+  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+  ~scoped_ptr() { reset(); }
+
+  T& operator*() const { return *ptr_; }
+  T* operator->() const { return ptr_; }
+  T* get() const { return ptr_; }
+
+  T* release() {
+    T* const ptr = ptr_;
+    ptr_ = NULL;
+    return ptr;
+  }
+
+  void reset(T* p = NULL) {
+    if (p != ptr_) {
+      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
+        delete ptr_;
+      }
+      ptr_ = p;
+    }
+  }
+
+ private:
+  T* ptr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+  // A copy constructor is required by the Standard to initialize object
+  // references from r-values.
+  RE(const RE& other) { Init(other.pattern()); }
+
+  // Constructs an RE from a string.
+  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  RE(const char* regex) { Init(regex); }  // NOLINT
+  ~RE();
+
+  // Returns the string representation of the regex.
+  const char* pattern() const { return pattern_; }
+
+  // FullMatch(str, re) returns true iff regular expression re matches
+  // the entire str.
+  // PartialMatch(str, re) returns true iff regular expression re
+  // matches a substring of str (including str itself).
+  //
+  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+  // when str contains NUL characters.
+  static bool FullMatch(const ::std::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::std::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const ::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const char* str, const RE& re);
+  static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+  void Init(const char* regex);
+
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
+  const char* pattern_;
+  bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+  regex_t full_regex_;     // For FullMatch().
+  regex_t partial_regex_;  // For PartialMatch().
+
+#else  // GTEST_USES_SIMPLE_RE
+
+  const char* full_pattern_;  // For FullMatch();
+
+#endif
+
+  GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+                                                               int line);
+
+// Defines logging utilities:
+//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
+//                          message itself is streamed into the macro.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+  GTEST_INFO,
+  GTEST_WARNING,
+  GTEST_ERROR,
+  GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+  GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+  ~GTestLog();
+
+  ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+  const GTestLogSeverity severity_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+                                  __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+//  Synopsys:
+//    GTEST_CHECK_(boolean_condition);
+//     or
+//    GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+//    This checks the condition and if the condition is not satisfied
+//    it prints message about the condition violation, including the
+//    condition itself, plus additional message streamed into it, if any,
+//    and then it aborts the program. It aborts the program irrespective of
+//    whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::IsTrue(condition)) \
+      ; \
+    else \
+      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success).  Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+  if (const int gtest_error = (posix_call)) \
+    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+                      << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*).  When you use ImplicitCast_, the compiler checks that
+// the cast is safe.  Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+//   ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late.  It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed.  When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo?  It
+// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
+// when you downcast, you should use this macro.  In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not).  In normal mode, we do the efficient static_cast<>
+// instead.  Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+//    This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) {  // so we only accept pointers
+  // Ensures that To is a sub-type of From *.  This test is here only
+  // for compile-time type checking, and has no overhead in an
+  // optimized build at run-time, as it will be optimized away
+  // completely.
+  if (false) {
+    const To to = NULL;
+    ::testing::internal::ImplicitCast_<From*>(to);
+  }
+
+#if GTEST_HAS_RTTI
+  // RTTI: debug mode only!
+  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+  return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+  GTEST_CHECK_(typeid(*base) == typeid(Derived));
+  return dynamic_cast<Derived*>(base);  // NOLINT
+#else
+  return static_cast<Derived*>(base);  // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+//   CaptureStdout     - starts capturing stdout.
+//   GetCapturedStdout - stops capturing stdout and returns the captured string.
+//   CaptureStderr     - starts capturing stderr.
+//   GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds.  This function is only for
+// testing Google Test's own constructs.  Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+  const timespec time = {
+    0,                  // 0 seconds.
+    n * 1000L * 1000L,  // And n ms.
+  };
+  nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified.  Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
+
+  // Notifies all threads created with this notification to start. Must
+  // be called from the controller thread.
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
+
+  // Blocks until the controller thread notifies. Must be called from a test
+  // thread.
+  void WaitForNotification() {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
+      SleepMilliseconds(10);
+    }
+  }
+
+ private:
+  pthread_mutex_t mutex_;
+  bool notified_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+  virtual ~ThreadWithParamBase() {}
+  virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical.  Some compilers (for
+// example, SunStudio) treat them as different types.  Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+  static_cast<ThreadWithParamBase*>(thread)->Run();
+  return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+//   void ThreadFunc(int param) { /* Do things with param */ }
+//   Notification thread_can_start;
+//   ...
+//   // The thread_can_start parameter is optional; you can supply NULL.
+//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+//   thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+  typedef void (*UserThreadFunc)(T);
+
+  ThreadWithParam(
+      UserThreadFunc func, T param, Notification* thread_can_start)
+      : func_(func),
+        param_(param),
+        thread_can_start_(thread_can_start),
+        finished_(false) {
+    ThreadWithParamBase* const base = this;
+    // The thread can be created only after all fields except thread_
+    // have been initialized.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+  }
+  ~ThreadWithParam() { Join(); }
+
+  void Join() {
+    if (!finished_) {
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+      finished_ = true;
+    }
+  }
+
+  virtual void Run() {
+    if (thread_can_start_ != NULL)
+      thread_can_start_->WaitForNotification();
+    func_(param_);
+  }
+
+ private:
+  const UserThreadFunc func_;  // User-supplied thread function.
+  const T param_;  // User-supplied parameter to the thread function.
+  // When non-NULL, used to block execution until the controller thread
+  // notifies.
+  Notification* const thread_can_start_;
+  bool finished_;  // true iff we know that the thread function has finished.
+  pthread_t thread_;  // The native thread object.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+//   Mutex mutex;
+//   ...
+//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
+//                            // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes.  Do not use MutexBase directly.  Instead, write
+// the following to define a static mutex:
+//
+//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+  // Acquires this mutex.
+  void Lock() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+    owner_ = pthread_self();
+    has_owner_ = true;
+  }
+
+  // Releases this mutex.
+  void Unlock() {
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
+    // mutex when this is called.
+    has_owner_ = false;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+  }
+
+  // Does nothing if the current thread holds the mutex. Otherwise, crashes
+  // with high probability.
+  void AssertHeld() const {
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+        << "The current thread is not holding the mutex @" << this;
+  }
+
+  // A static mutex may be used before main() is entered.  It may even
+  // be used before the dynamic initialization stage.  Therefore we
+  // must be able to initialize a static mutex object at link time.
+  // This means MutexBase has to be a POD and its member variables
+  // have to be public.
+ public:
+  pthread_mutex_t mutex_;  // The underlying pthread mutex.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+    extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+  Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+    has_owner_ = false;
+  }
+  ~Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms.  Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(MutexBase* mutex)
+      : mutex_(mutex) { mutex_->Lock(); }
+
+  ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+  MutexBase* const mutex_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage.  Therefore it cannot be templatized to access
+// ThreadLocal<T>.  Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+  virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+//   // Thread 1
+//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
+//
+//   // Thread 2
+//   tl.set(150);  // Changes the value for thread 2 only.
+//   EXPECT_EQ(150, tl.get());
+//
+//   // Thread 1
+//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
+//   tl.set(200);
+//   EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits.  Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies.  It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects.  That means they
+// will die after main() has returned.  Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : key_(CreateKey()),
+                  default_() {}
+  explicit ThreadLocal(const T& value) : key_(CreateKey()),
+                                         default_(value) {}
+
+  ~ThreadLocal() {
+    // Destroys the managed object for the current thread, if any.
+    DeleteThreadLocalValue(pthread_getspecific(key_));
+
+    // Releases resources associated with the key.  This will *not*
+    // delete managed objects for other threads.
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+  }
+
+  T* pointer() { return GetOrCreateValue(); }
+  const T* pointer() const { return GetOrCreateValue(); }
+  const T& get() const { return *pointer(); }
+  void set(const T& value) { *pointer() = value; }
+
+ private:
+  // Holds a value of type T.
+  class ValueHolder : public ThreadLocalValueHolderBase {
+   public:
+    explicit ValueHolder(const T& value) : value_(value) {}
+
+    T* pointer() { return &value_; }
+
+   private:
+    T value_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+  };
+
+  static pthread_key_t CreateKey() {
+    pthread_key_t key;
+    // When a thread exits, DeleteThreadLocalValue() will be called on
+    // the object managed for that thread.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_key_create(&key, &DeleteThreadLocalValue));
+    return key;
+  }
+
+  T* GetOrCreateValue() const {
+    ThreadLocalValueHolderBase* const holder =
+        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+    if (holder != NULL) {
+      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+    }
+
+    ValueHolder* const new_holder = new ValueHolder(default_);
+    ThreadLocalValueHolderBase* const holder_base = new_holder;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+    return new_holder->pointer();
+  }
+
+  // A key pthreads uses for looking up per-thread values.
+  const pthread_key_t key_;
+  const T default_;  // The default value for each thread.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else  // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable).  Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+  Mutex() {}
+  void Lock() {}
+  void Unlock() {}
+  void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+  extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(Mutex*) {}  // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : value_() {}
+  explicit ThreadLocal(const T& value) : value_(value) {}
+  T* pointer() { return &value_; }
+  const T* pointer() const { return &value_; }
+  const T& get() const { return value_; }
+  void set(const T& value) { value_ = value; }
+ private:
+  T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif  // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio.  The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects.  We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template.  These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+  typedef bool_constant<bool_value> type;
+  static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+  typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+  typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+  typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF.  char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+  return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+  return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+  return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+  return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+  return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+  return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+  return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions.  These wrappers hide the differences between
+// Windows/MSVC and POSIX systems.  Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else  // !__BORLANDC__
+#  if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+#  else
+inline int IsATTY(int fd) { return _isatty(fd); }
+#  endif  // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif  // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+  return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif  // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+  return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+  return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+  return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+  return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+  return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // We are on Windows CE, which has no environment variables.
+  return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // Environment variables which we programmatically clear will be set to the
+  // empty string rather than unset (NULL).  Handle that case.
+  const char* const env = getenv(name);
+  return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+  return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop)  // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+}  // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent.  This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type.  It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+//   TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs.  Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+  // This prevents the user from using TypeWithSize<N> with incorrect
+  // values of N.
+  typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+  // unsigned int has size 4 in both gcc and MSVC.
+  //
+  // As base/basictypes.h doesn't compile on Windows, we cannot use
+  // uint32, uint64, and etc here.
+  typedef int Int;
+  typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+  typedef __int64 Int;
+  typedef unsigned __int64 UInt;
+#else
+  typedef long long Int;  // NOLINT
+  typedef unsigned long long UInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-string.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-string.h
new file mode 100644
index 0000000..97f1a7f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-string.h
@@ -0,0 +1,167 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test.  They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+  // Static utility methods
+
+  // Clones a 0-terminated C string, allocating memory using new.  The
+  // caller is responsible for deleting the return value using
+  // delete[].  Returns the cloned string, or NULL if the input is
+  // NULL.
+  //
+  // This is different from strdup() in string.h, which allocates
+  // memory using malloc().
+  static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+  // able to pass strings to Win32 APIs on CE we need to convert them
+  // to 'Unicode', UTF-16.
+
+  // Creates a UTF-16 wide string from the given ANSI string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the wide string, or NULL if the
+  // input is NULL.
+  //
+  // The wide string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static LPCWSTR AnsiToUtf16(const char* c_str);
+
+  // Creates an ANSI string from the given wide string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the ANSI string, or NULL if the
+  // input is NULL.
+  //
+  // The returned string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+  // Compares two C strings.  Returns true iff they have the same content.
+  //
+  // Unlike strcmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CStringEquals(const char* lhs, const char* rhs);
+
+  // Converts a wide C string to a String using the UTF-8 encoding.
+  // NULL will be converted to "(null)".  If an error occurred during
+  // the conversion, "(failed to convert from wide string)" is
+  // returned.
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+  // Compares two wide C strings.  Returns true iff they have the same
+  // content.
+  //
+  // Unlike wcscmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+  // Compares two C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike strcasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CaseInsensitiveCStringEquals(const char* lhs,
+                                           const char* rhs);
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                               const wchar_t* rhs);
+
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
+
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
+
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
+
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
+
+ private:
+  String();  // Not meant to be instantiated.
+};  // class String
+
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-tuple.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-tuple.h
new file mode 100644
index 0000000..7b3dfc3
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-tuple.h
@@ -0,0 +1,1012 @@
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+    void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+    void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+    void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+    void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+    typename T3 = void, typename T4 = void, typename T5 = void,
+    typename T6 = void, typename T7 = void, typename T8 = void,
+    typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
+
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+  tuple(const tuple& t) : f0_(t.f0_) {}
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    return *this;
+  }
+
+  T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+      f1_(f1) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_) {}
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_) {}
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+      f9_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+      f9_(t.f9_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    f9_ = t.f9_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+  T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+  return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+  return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+  return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3) {
+  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4) {
+  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5) {
+  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8) {
+  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8, const T9& f9) {
+  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  Field(Tuple& t) { return t.f0_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  Field(Tuple& t) { return t.f1_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  Field(Tuple& t) { return t.f2_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  Field(Tuple& t) { return t.f3_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  Field(Tuple& t) { return t.f4_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  Field(Tuple& t) { return t.f5_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  Field(Tuple& t) { return t.f6_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  Field(Tuple& t) { return t.f7_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  Field(Tuple& t) { return t.f8_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  Field(Tuple& t) { return t.f9_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  ConstField(const Tuple& t) { return t.f9_; }
+};
+
+}  // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump
new file mode 100644
index 0000000..c7d9e03
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump
@@ -0,0 +1,339 @@
+$$ -*- mode: c++; -*-
+$var n = 10  $$ Maximum number of tuple fields we want to support.
+$$ This meta comment fixes auto-indentation in Emacs. }}
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+
+$range i 0..n-1
+$range j 0..n
+$range k 1..n
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+
+$for k [[
+$range m 0..k-1
+$range m2 k..n-1
+#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>
+
+]]
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+
+$for j [[
+$range m 0..j-1
+#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]
+
+
+]]
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <$for i, [[typename T$i = void]]>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+
+$for i [[
+template <GTEST_$(n)_TYPENAMES_(T)>
+struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > {
+  typedef T$i type;
+};
+
+
+]]
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+
+$for k [[
+$range m 0..k-1
+template <GTEST_$(k)_TYPENAMES_(T)>
+class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : $for m, [[f$(m)_()]] {}
+
+  explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]]
+$for m, [[f$(m)_(f$m)]] {}
+
+  tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
+
+$if k == 2 [[
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+]]
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+$if k == 2 [[
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+]]
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) {
+
+$for m [[
+    f$(m)_ = t.f$(m)_;
+
+]]
+    return *this;
+  }
+
+
+$for m [[
+  T$m f$(m)_;
+
+]]
+};
+
+
+]]
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+$for k [[
+$range m 0..k-1
+
+template <GTEST_$(k)_TYPENAMES_(T)>
+inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) {
+  return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]);
+}
+
+]]
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+
+$for j [[
+template <GTEST_$(j)_TYPENAMES_(T)>
+struct tuple_size<GTEST_$(j)_TUPLE_(T) > {
+  static const int value = $j;
+};
+
+
+]]
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+
+$for i [[
+template <>
+class Get<$i> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
+  Field(Tuple& t) { return t.f$(i)_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
+  ConstField(const Tuple& t) { return t.f$(i)_; }
+};
+
+
+]]
+}  // namespace gtest_internal
+
+template <int k, GTEST_$(n)_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))
+get(GTEST_$(n)_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_$(n)_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_$(n)_TUPLE_(T)))
+get(const GTEST_$(n)_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
+inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,
+                       const GTEST_$(n)_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_$(n)_TUPLE_(T) >::value,
+      tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t,
+                       const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+
+$for j [[
+#undef GTEST_$(j)_TUPLE_
+
+]]
+
+
+$for j [[
+#undef GTEST_$(j)_TYPENAMES_
+
+]]
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-type-util.h b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-type-util.h
new file mode 100644
index 0000000..e46f7cf
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-type-util.h
@@ -0,0 +1,3331 @@
+// This file was GENERATED by command:
+//     pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+  typedef T1 Head;
+  typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+  typedef T1 Head;
+  typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+  typedef T1 Head;
+  typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+  typedef T1 Head;
+  typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types6 {
+  typedef T1 Head;
+  typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types7 {
+  typedef T1 Head;
+  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types8 {
+  typedef T1 Head;
+  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+  typedef T1 Head;
+  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+  typedef T1 Head;
+  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types11 {
+  typedef T1 Head;
+  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types12 {
+  typedef T1 Head;
+  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types13 {
+  typedef T1 Head;
+  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+  typedef T1 Head;
+  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+  typedef T1 Head;
+  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types16 {
+  typedef T1 Head;
+  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types17 {
+  typedef T1 Head;
+  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types18 {
+  typedef T1 Head;
+  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+  typedef T1 Head;
+  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+  typedef T1 Head;
+  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types21 {
+  typedef T1 Head;
+  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types22 {
+  typedef T1 Head;
+  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types23 {
+  typedef T1 Head;
+  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+  typedef T1 Head;
+  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+  typedef T1 Head;
+  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types26 {
+  typedef T1 Head;
+  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types27 {
+  typedef T1 Head;
+  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types28 {
+  typedef T1 Head;
+  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+  typedef T1 Head;
+  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+  typedef T1 Head;
+  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types31 {
+  typedef T1 Head;
+  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types32 {
+  typedef T1 Head;
+  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types33 {
+  typedef T1 Head;
+  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+  typedef T1 Head;
+  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+  typedef T1 Head;
+  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types36 {
+  typedef T1 Head;
+  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types37 {
+  typedef T1 Head;
+  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types38 {
+  typedef T1 Head;
+  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+  typedef T1 Head;
+  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+  typedef T1 Head;
+  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types41 {
+  typedef T1 Head;
+  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types42 {
+  typedef T1 Head;
+  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types43 {
+  typedef T1 Head;
+  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+  typedef T1 Head;
+  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+  typedef T1 Head;
+  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types46 {
+  typedef T1 Head;
+  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types47 {
+  typedef T1 Head;
+  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types48 {
+  typedef T1 Head;
+  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+  typedef T1 Head;
+  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+  typedef T1 Head;
+  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+    typename T3 = internal::None, typename T4 = internal::None,
+    typename T5 = internal::None, typename T6 = internal::None,
+    typename T7 = internal::None, typename T8 = internal::None,
+    typename T9 = internal::None, typename T10 = internal::None,
+    typename T11 = internal::None, typename T12 = internal::None,
+    typename T13 = internal::None, typename T14 = internal::None,
+    typename T15 = internal::None, typename T16 = internal::None,
+    typename T17 = internal::None, typename T18 = internal::None,
+    typename T19 = internal::None, typename T20 = internal::None,
+    typename T21 = internal::None, typename T22 = internal::None,
+    typename T23 = internal::None, typename T24 = internal::None,
+    typename T25 = internal::None, typename T26 = internal::None,
+    typename T27 = internal::None, typename T28 = internal::None,
+    typename T29 = internal::None, typename T30 = internal::None,
+    typename T31 = internal::None, typename T32 = internal::None,
+    typename T33 = internal::None, typename T34 = internal::None,
+    typename T35 = internal::None, typename T36 = internal::None,
+    typename T37 = internal::None, typename T38 = internal::None,
+    typename T39 = internal::None, typename T40 = internal::None,
+    typename T41 = internal::None, typename T42 = internal::None,
+    typename T43 = internal::None, typename T44 = internal::None,
+    typename T45 = internal::None, typename T46 = internal::None,
+    typename T47 = internal::None, typename T48 = internal::None,
+    typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, internal::None, internal::None, internal::None> {
+  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, internal::None, internal::None> {
+  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, T49, internal::None> {
+  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates4 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates7 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates10 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates13 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates16 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates19 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates22 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates25 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates28 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates31 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates34 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates37 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates40 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates43 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates46 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates49 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, NoneT, NoneT, NoneT> {
+  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, NoneT, NoneT> {
+  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, T49, NoneT> {
+  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> > {
+  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump
new file mode 100644
index 0000000..251fdf0
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump
@@ -0,0 +1,297 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of type lists we want to support.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most $n types in a list, and at most $n
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+
+$range i 2..n
+
+$for i [[
+$range j 1..i
+$range k 2..i
+template <$for j, [[typename T$j]]>
+struct Types$i {
+  typedef T1 Head;
+  typedef Types$(i-1)<$for k, [[T$k]]> Tail;
+};
+
+
+]]
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+
+$range i 1..n
+template <$for i, [[typename T$i = internal::None]]>
+struct Types {
+  typedef internal::Types$n<$for i, [[T$i]]> type;
+};
+
+template <>
+struct Types<$for i, [[internal::None]]> {
+  typedef internal::Types0 type;
+};
+
+$range i 1..n-1
+$for i [[
+$range j 1..i
+$range k i+1..n
+template <$for j, [[typename T$j]]>
+struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
+  typedef internal::Types$i<$for j, [[T$j]]> type;
+};
+
+]]
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+
+$range i 2..n
+
+$for i [[
+$range j 1..i
+$range k 2..i
+template <$for j, [[GTEST_TEMPLATE_ T$j]]>
+struct Templates$i {
+  typedef TemplateSel<T1> Head;
+  typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
+};
+
+
+]]
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+
+$range i 1..n
+template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
+struct Templates {
+  typedef Templates$n<$for i, [[T$i]]> type;
+};
+
+template <>
+struct Templates<$for i, [[NoneT]]> {
+  typedef Templates0 type;
+};
+
+$range i 1..n-1
+$for i [[
+$range j 1..i
+$range k i+1..n
+template <$for j, [[GTEST_TEMPLATE_ T$j]]>
+struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
+  typedef Templates$i<$for j, [[T$j]]> type;
+};
+
+]]
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+
+$range i 1..n
+template <$for i, [[typename T$i]]>
+struct TypeList<Types<$for i, [[T$i]]> > {
+  typedef typename Types<$for i, [[T$i]]>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/m4/acx_pthread.m4 b/ThirdParty/common/gtest/gtest-1.7.0/m4/acx_pthread.m4
new file mode 100644
index 0000000..2cf20de
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/m4/acx_pthread.m4
@@ -0,0 +1,363 @@
+# This was retrieved from
+#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi
+# See also (perhaps for new versions?)
+#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi
+#
+# We've rewritten the inconsistency check code (from avahi), to work
+# more broadly.  In particular, it no longer assumes ld accepts -zdefs.
+# This caused a restructing of the code, but the functionality has only
+# changed a little.
+
+dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+dnl
+dnl @summary figure out how to build C programs using POSIX threads
+dnl
+dnl This macro figures out how to build C programs using POSIX threads.
+dnl It sets the PTHREAD_LIBS output variable to the threads library and
+dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
+dnl C compiler flags that are needed. (The user can also force certain
+dnl compiler flags/libs to be tested by setting these environment
+dnl variables.)
+dnl
+dnl Also sets PTHREAD_CC to any special C compiler that is needed for
+dnl multi-threaded programs (defaults to the value of CC otherwise).
+dnl (This is necessary on AIX to use the special cc_r compiler alias.)
+dnl
+dnl NOTE: You are assumed to not only compile your program with these
+dnl flags, but also link it with them as well. e.g. you should link
+dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
+dnl $LIBS
+dnl
+dnl If you are only building threads programs, you may wish to use
+dnl these variables in your default LIBS, CFLAGS, and CC:
+dnl
+dnl        LIBS="$PTHREAD_LIBS $LIBS"
+dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+dnl        CC="$PTHREAD_CC"
+dnl
+dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
+dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
+dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+dnl
+dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
+dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
+dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
+dnl default action will define HAVE_PTHREAD.
+dnl
+dnl Please let the authors know if this macro fails on any platform, or
+dnl if you have any other suggestions or comments. This macro was based
+dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
+dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
+dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
+dnl We are also grateful for the helpful feedback of numerous users.
+dnl
+dnl @category InstalledPackages
+dnl @author Steven G. Johnson <stevenj at alum.mit.edu>
+dnl @version 2006-05-29
+dnl @license GPLWithACException
+dnl 
+dnl Checks for GCC shared/pthread inconsistency based on work by
+dnl Marcin Owsiany <marcin at owsiany.pl>
+
+
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_SAVE
+AC_LANG_C
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $flag])
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+		pthread-config)
+		AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
+		if test x"$acx_pthread_config" = xno; then continue; fi
+		PTHREAD_CFLAGS="`pthread-config --cflags`"
+		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+		;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$flag])
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        AC_TRY_LINK([#include <pthread.h>],
+                    [pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+                    [acx_pthread_ok=yes])
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+	AC_MSG_CHECKING([for joinable pthread attribute])
+	attr_name=unknown
+	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+	    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
+                        [attr_name=$attr; break])
+	done
+        AC_MSG_RESULT($attr_name)
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
+                               [Define to necessary symbol if this constant
+                                uses a non-standard name on your system.])
+        fi
+
+        AC_MSG_CHECKING([if more special flags are required for pthreads])
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        AC_MSG_RESULT(${flag})
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+        # More AIX lossage: must compile with xlc_r or cc_r
+	if test x"$GCC" != xyes; then
+          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
+        else
+          PTHREAD_CC=$CC
+	fi
+
+	# The next part tries to detect GCC inconsistency with -shared on some
+	# architectures and systems. The problem is that in certain
+	# configurations, when -shared is specified, GCC "forgets" to
+	# internally use various flags which are still necessary.
+	
+	#
+	# Prepare the flags
+	#
+	save_CFLAGS="$CFLAGS"
+	save_LIBS="$LIBS"
+	save_CC="$CC"
+	
+	# Try with the flags determined by the earlier checks.
+	#
+	# -Wl,-z,defs forces link-time symbol resolution, so that the
+	# linking checks with -shared actually have any value
+	#
+	# FIXME: -fPIC is required for -shared on many architectures,
+	# so we specify it here, but the right way would probably be to
+	# properly detect whether it is actually required.
+	CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
+	LIBS="$PTHREAD_LIBS $LIBS"
+	CC="$PTHREAD_CC"
+	
+	# In order not to create several levels of indentation, we test
+	# the value of "$done" until we find the cure or run out of ideas.
+	done="no"
+	
+	# First, make sure the CFLAGS we added are actually accepted by our
+	# compiler.  If not (and OS X's ld, for instance, does not accept -z),
+	# then we can't do this test.
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])
+	   AC_TRY_LINK(,, , [done=yes])
+	
+	   if test "x$done" = xyes ; then
+	      AC_MSG_RESULT([no])
+	   else
+	      AC_MSG_RESULT([yes])
+	   fi
+	fi
+	
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])
+	   AC_TRY_LINK([#include <pthread.h>],
+	      [pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	      [done=yes])
+	   
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	
+	#
+	# Linux gcc on some architectures such as mips/mipsel forgets
+	# about -lpthread
+	#
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -lpthread fixes that])
+	   LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
+	   AC_TRY_LINK([#include <pthread.h>],
+	      [pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	      [done=yes])
+	
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	      PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	#
+	# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
+	#
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -lc_r fixes that])
+	   LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
+	   AC_TRY_LINK([#include <pthread.h>],
+	       [pthread_t th; pthread_join(th, 0);
+	        pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	       [done=yes])
+	
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	      PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	if test x"$done" = xno; then
+	   # OK, we have run out of ideas
+	   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])
+	
+	   # so it's not safe to assume that we may use pthreads
+	   acx_pthread_ok=no
+	fi
+	
+	CFLAGS="$save_CFLAGS"
+	LIBS="$save_LIBS"
+	CC="$save_CC"
+else
+        PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+        :
+else
+        acx_pthread_ok=no
+        $2
+fi
+AC_LANG_RESTORE
+])dnl ACX_PTHREAD
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/m4/gtest.m4 b/ThirdParty/common/gtest/gtest-1.7.0/m4/gtest.m4
new file mode 100644
index 0000000..6598ba7
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/m4/gtest.m4
@@ -0,0 +1,74 @@
+dnl GTEST_LIB_CHECK([minimum version [,
+dnl                  action if found [,action if not found]]])
+dnl
+dnl Check for the presence of the Google Test library, optionally at a minimum
+dnl version, and indicate a viable version with the HAVE_GTEST flag. It defines
+dnl standard variables for substitution including GTEST_CPPFLAGS,
+dnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines
+dnl GTEST_VERSION as the version of Google Test found. Finally, it provides
+dnl optional custom action slots in the event GTEST is found or not.
+AC_DEFUN([GTEST_LIB_CHECK],
+[
+dnl Provide a flag to enable or disable Google Test usage.
+AC_ARG_ENABLE([gtest],
+  [AS_HELP_STRING([--enable-gtest],
+                  [Enable tests using the Google C++ Testing Framework.
+                  (Default is enabled.)])],
+  [],
+  [enable_gtest=])
+AC_ARG_VAR([GTEST_CONFIG],
+           [The exact path of Google Test's 'gtest-config' script.])
+AC_ARG_VAR([GTEST_CPPFLAGS],
+           [C-like preprocessor flags for Google Test.])
+AC_ARG_VAR([GTEST_CXXFLAGS],
+           [C++ compile flags for Google Test.])
+AC_ARG_VAR([GTEST_LDFLAGS],
+           [Linker path and option flags for Google Test.])
+AC_ARG_VAR([GTEST_LIBS],
+           [Library linking flags for Google Test.])
+AC_ARG_VAR([GTEST_VERSION],
+           [The version of Google Test available.])
+HAVE_GTEST="no"
+AS_IF([test "x${enable_gtest}" != "xno"],
+  [AC_MSG_CHECKING([for 'gtest-config'])
+   AS_IF([test "x${enable_gtest}" != "xyes"],
+     [AS_IF([test -x "${enable_gtest}/scripts/gtest-config"],
+        [GTEST_CONFIG="${enable_gtest}/scripts/gtest-config"],
+        [GTEST_CONFIG="${enable_gtest}/bin/gtest-config"])
+      AS_IF([test -x "${GTEST_CONFIG}"], [],
+        [AC_MSG_RESULT([no])
+         AC_MSG_ERROR([dnl
+Unable to locate either a built or installed Google Test.
+The specific location '${enable_gtest}' was provided for a built or installed
+Google Test, but no 'gtest-config' script could be found at this location.])
+         ])],
+     [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])
+   AS_IF([test -x "${GTEST_CONFIG}"],
+     [AC_MSG_RESULT([${GTEST_CONFIG}])
+      m4_ifval([$1],
+        [_gtest_min_version="--min-version=$1"
+         AC_MSG_CHECKING([for Google Test at least version >= $1])],
+        [_gtest_min_version="--min-version=0"
+         AC_MSG_CHECKING([for Google Test])])
+      AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],
+        [AC_MSG_RESULT([yes])
+         HAVE_GTEST='yes'],
+        [AC_MSG_RESULT([no])])],
+     [AC_MSG_RESULT([no])])
+   AS_IF([test "x${HAVE_GTEST}" = "xyes"],
+     [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`
+      GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`
+      GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
+      GTEST_LIBS=`${GTEST_CONFIG} --libs`
+      GTEST_VERSION=`${GTEST_CONFIG} --version`
+      AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],
+     [AS_IF([test "x${enable_gtest}" = "xyes"],
+        [AC_MSG_ERROR([dnl
+Google Test was enabled, but no viable version could be found.])
+         ])])])
+AC_SUBST([HAVE_GTEST])
+AM_CONDITIONAL([HAVE_GTEST],[test "x$HAVE_GTEST" = "xyes"])
+AS_IF([test "x$HAVE_GTEST" = "xyes"],
+  [m4_ifval([$2], [$2])],
+  [m4_ifval([$3], [$3])])
+])
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/m4/libtool.m4 b/ThirdParty/common/gtest/gtest-1.7.0/m4/libtool.m4
new file mode 100644
index 0000000..828104c
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/m4/libtool.m4
@@ -0,0 +1,8001 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t at _DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/m4/ltoptions.m4 b/ThirdParty/common/gtest/gtest-1.7.0/m4/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/m4/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/m4/ltsugar.m4 b/ThirdParty/common/gtest/gtest-1.7.0/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/m4/ltversion.m4 b/ThirdParty/common/gtest/gtest-1.7.0/m4/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/m4/lt~obsolete.m4 b/ThirdParty/common/gtest/gtest-1.7.0/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/make/Makefile b/ThirdParty/common/gtest/gtest-1.7.0/make/Makefile
new file mode 100644
index 0000000..9ac7449
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/make/Makefile
@@ -0,0 +1,82 @@
+# A sample Makefile for building Google Test and using it in user
+# tests.  Please tweak it to suit your environment and project.  You
+# may want to move it to your project's root directory.
+#
+# SYNOPSIS:
+#
+#   make [all]  - makes everything.
+#   make TARGET - makes the given target.
+#   make clean  - removes all files generated by make.
+
+# Please tweak the following variable definitions as needed by your
+# project, except GTEST_HEADERS, which you can use in your own targets
+# but shouldn't modify.
+
+# Points to the root of Google Test, relative to where this file is.
+# Remember to tweak this if you move this file.
+GTEST_DIR = ..
+
+# Where to find user code.
+USER_DIR = ../samples
+
+# Flags passed to the preprocessor.
+# Set Google Test's header directory as a system directory, such that
+# the compiler doesn't generate warnings in Google Test headers.
+CPPFLAGS += -isystem $(GTEST_DIR)/include
+
+# Flags passed to the C++ compiler.
+CXXFLAGS += -g -Wall -Wextra -pthread
+
+# All tests produced by this Makefile.  Remember to add new tests you
+# created to the list.
+TESTS = sample1_unittest
+
+# All Google Test headers.  Usually you shouldn't change this
+# definition.
+GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
+                $(GTEST_DIR)/include/gtest/internal/*.h
+
+# House-keeping build targets.
+
+all : $(TESTS)
+
+clean :
+	rm -f $(TESTS) gtest.a gtest_main.a *.o
+
+# Builds gtest.a and gtest_main.a.
+
+# Usually you shouldn't tweak such internal variables, indicated by a
+# trailing _.
+GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
+
+# For simplicity and to avoid depending on Google Test's
+# implementation details, the dependencies specified below are
+# conservative and not optimized.  This is fine as Google Test
+# compiles fast and for ordinary users its source rarely changes.
+gtest-all.o : $(GTEST_SRCS_)
+	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
+            $(GTEST_DIR)/src/gtest-all.cc
+
+gtest_main.o : $(GTEST_SRCS_)
+	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
+            $(GTEST_DIR)/src/gtest_main.cc
+
+gtest.a : gtest-all.o
+	$(AR) $(ARFLAGS) $@ $^
+
+gtest_main.a : gtest-all.o gtest_main.o
+	$(AR) $(ARFLAGS) $@ $^
+
+# Builds a sample test.  A test should link with either gtest.a or
+# gtest_main.a, depending on whether it defines its own main()
+# function.
+
+sample1.o : $(USER_DIR)/sample1.cc $(USER_DIR)/sample1.h $(GTEST_HEADERS)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1.cc
+
+sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \
+                     $(USER_DIR)/sample1.h $(GTEST_HEADERS)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1_unittest.cc
+
+sample1_unittest : sample1.o sample1_unittest.o gtest_main.a
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest-md.sln b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest-md.sln
new file mode 100755
index 0000000..f7908da
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest-md.sln
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest-md", "gtest-md.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main-md", "gtest_main-md.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test-md", "gtest_prod_test-md.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest-md", "gtest_unittest-md.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.ActiveCfg = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.Build.0 = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.ActiveCfg = Release|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.Build.0 = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.ActiveCfg = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.Build.0 = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.ActiveCfg = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.Build.0 = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.ActiveCfg = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.Build.0 = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.ActiveCfg = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.Build.0 = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.ActiveCfg = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.Build.0 = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.ActiveCfg = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest-md.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest-md.vcproj
new file mode 100755
index 0000000..1c35c3a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest-md.vcproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest-md"
+	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtestd.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtest.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest-all.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest.sln b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest.sln
new file mode 100755
index 0000000..ef4b057
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest.sln
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "gtest.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main", "gtest_main.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest", "gtest_unittest.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test", "gtest_prod_test.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.ActiveCfg = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.Build.0 = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.ActiveCfg = Release|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.Build.0 = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.ActiveCfg = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.Build.0 = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.ActiveCfg = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.Build.0 = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.ActiveCfg = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.Build.0 = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.ActiveCfg = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.Build.0 = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.ActiveCfg = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.Build.0 = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.ActiveCfg = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest.vcproj
new file mode 100755
index 0000000..a8373ce
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest.vcproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest"
+	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtestd.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtest.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest-all.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_main-md.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_main-md.vcproj
new file mode 100755
index 0000000..b5379fe
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_main-md.vcproj
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_main-md"
+	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName).lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+			Name="gtest-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest_main.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_main.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_main.vcproj
new file mode 100755
index 0000000..e8b763c
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_main.vcproj
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_main"
+	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName).lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+			Name="gtest"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest_main.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj
new file mode 100755
index 0000000..05b05d9
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_prod_test-md"
+	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+			Name="gtest_main-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_prod_test.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\test\production.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\test\production.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_prod_test.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_prod_test.vcproj
new file mode 100755
index 0000000..6d7a2f0
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_prod_test.vcproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_prod_test"
+	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+			Name="gtest_main"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_prod_test.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\test\production.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\test\production.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_unittest-md.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_unittest-md.vcproj
new file mode 100755
index 0000000..38a5e56
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_unittest-md.vcproj
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_unittest-md"
+	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+			Name="gtest_main-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_unittest.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						Optimization="1"
+						AdditionalIncludeDirectories=""..";"..\include""
+						BasicRuntimeChecks="0"
+						UsePrecompiledHeader="0"
+						DebugInformationFormat="3"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_unittest.vcproj b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_unittest.vcproj
new file mode 100755
index 0000000..cb1f52b
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/msvc/gtest_unittest.vcproj
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_unittest"
+	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+			Name="gtest_main"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_unittest.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						Optimization="1"
+						AdditionalIncludeDirectories=""..";"..\include""
+						BasicRuntimeChecks="0"
+						UsePrecompiledHeader="0"
+						DebugInformationFormat="3"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/prime_tables.h b/ThirdParty/common/gtest/gtest-1.7.0/samples/prime_tables.h
new file mode 100644
index 0000000..92ce16a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/prime_tables.h
@@ -0,0 +1,123 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+// Author: vladl at google.com (Vlad Losev)
+
+// This provides interface PrimeTable that determines whether a number is a
+// prime and determines a next prime number. This interface is used
+// in Google Test samples demonstrating use of parameterized tests.
+
+#ifndef GTEST_SAMPLES_PRIME_TABLES_H_
+#define GTEST_SAMPLES_PRIME_TABLES_H_
+
+#include <algorithm>
+
+// The prime table interface.
+class PrimeTable {
+ public:
+  virtual ~PrimeTable() {}
+
+  // Returns true iff n is a prime number.
+  virtual bool IsPrime(int n) const = 0;
+
+  // Returns the smallest prime number greater than p; or returns -1
+  // if the next prime is beyond the capacity of the table.
+  virtual int GetNextPrime(int p) const = 0;
+};
+
+// Implementation #1 calculates the primes on-the-fly.
+class OnTheFlyPrimeTable : public PrimeTable {
+ public:
+  virtual bool IsPrime(int n) const {
+    if (n <= 1) return false;
+
+    for (int i = 2; i*i <= n; i++) {
+      // n is divisible by an integer other than 1 and itself.
+      if ((n % i) == 0) return false;
+    }
+
+    return true;
+  }
+
+  virtual int GetNextPrime(int p) const {
+    for (int n = p + 1; n > 0; n++) {
+      if (IsPrime(n)) return n;
+    }
+
+    return -1;
+  }
+};
+
+// Implementation #2 pre-calculates the primes and stores the result
+// in an array.
+class PreCalculatedPrimeTable : public PrimeTable {
+ public:
+  // 'max' specifies the maximum number the prime table holds.
+  explicit PreCalculatedPrimeTable(int max)
+      : is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {
+    CalculatePrimesUpTo(max);
+  }
+  virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }
+
+  virtual bool IsPrime(int n) const {
+    return 0 <= n && n < is_prime_size_ && is_prime_[n];
+  }
+
+  virtual int GetNextPrime(int p) const {
+    for (int n = p + 1; n < is_prime_size_; n++) {
+      if (is_prime_[n]) return n;
+    }
+
+    return -1;
+  }
+
+ private:
+  void CalculatePrimesUpTo(int max) {
+    ::std::fill(is_prime_, is_prime_ + is_prime_size_, true);
+    is_prime_[0] = is_prime_[1] = false;
+
+    for (int i = 2; i <= max; i++) {
+      if (!is_prime_[i]) continue;
+
+      // Marks all multiples of i (except i itself) as non-prime.
+      for (int j = 2*i; j <= max; j += i) {
+        is_prime_[j] = false;
+      }
+    }
+  }
+
+  const int is_prime_size_;
+  bool* const is_prime_;
+
+  // Disables compiler warning "assignment operator could not be generated."
+  void operator=(const PreCalculatedPrimeTable& rhs);
+};
+
+#endif  // GTEST_SAMPLES_PRIME_TABLES_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1.cc
new file mode 100644
index 0000000..f171e26
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1.cc
@@ -0,0 +1,68 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "sample1.h"
+
+// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
+int Factorial(int n) {
+  int result = 1;
+  for (int i = 1; i <= n; i++) {
+    result *= i;
+  }
+
+  return result;
+}
+
+// Returns true iff n is a prime number.
+bool IsPrime(int n) {
+  // Trivial case 1: small numbers
+  if (n <= 1) return false;
+
+  // Trivial case 2: even numbers
+  if (n % 2 == 0) return n == 2;
+
+  // Now, we have that n is odd and n >= 3.
+
+  // Try to divide n by every odd number i, starting from 3
+  for (int i = 3; ; i += 2) {
+    // We only have to try i up to the squre root of n
+    if (i > n/i) break;
+
+    // Now, we have i <= n/i < n.
+    // If n is divisible by i, n is not prime.
+    if (n % i == 0) return false;
+  }
+
+  // n has no integer factor in the range (1, n), and thus is prime.
+  return true;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1.h b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1.h
new file mode 100644
index 0000000..3dfeb98
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1.h
@@ -0,0 +1,43 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE1_H_
+#define GTEST_SAMPLES_SAMPLE1_H_
+
+// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
+int Factorial(int n);
+
+// Returns true iff n is a prime number.
+bool IsPrime(int n);
+
+#endif  // GTEST_SAMPLES_SAMPLE1_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample10_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample10_unittest.cc
new file mode 100644
index 0000000..0051cd5
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample10_unittest.cc
@@ -0,0 +1,144 @@
+// Copyright 2009 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to use Google Test listener API to implement
+// a primitive leak checker.
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+namespace {
+
+// We will track memory used by this class.
+class Water {
+ public:
+  // Normal Water declarations go here.
+
+  // operator new and operator delete help us control water allocation.
+  void* operator new(size_t allocation_size) {
+    allocated_++;
+    return malloc(allocation_size);
+  }
+
+  void operator delete(void* block, size_t /* allocation_size */) {
+    allocated_--;
+    free(block);
+  }
+
+  static int allocated() { return allocated_; }
+
+ private:
+  static int allocated_;
+};
+
+int Water::allocated_ = 0;
+
+// This event listener monitors how many Water objects are created and
+// destroyed by each test, and reports a failure if a test leaks some Water
+// objects. It does this by comparing the number of live Water objects at
+// the beginning of a test and at the end of a test.
+class LeakChecker : public EmptyTestEventListener {
+ private:
+  // Called before a test starts.
+  virtual void OnTestStart(const TestInfo& /* test_info */) {
+    initially_allocated_ = Water::allocated();
+  }
+
+  // Called after a test ends.
+  virtual void OnTestEnd(const TestInfo& /* test_info */) {
+    int difference = Water::allocated() - initially_allocated_;
+
+    // You can generate a failure in any event handler except
+    // OnTestPartResult. Just use an appropriate Google Test assertion to do
+    // it.
+    EXPECT_LE(difference, 0) << "Leaked " << difference << " unit(s) of Water!";
+  }
+
+  int initially_allocated_;
+};
+
+TEST(ListenersTest, DoesNotLeak) {
+  Water* water = new Water;
+  delete water;
+}
+
+// This should fail when the --check_for_leaks command line flag is
+// specified.
+TEST(ListenersTest, LeaksWater) {
+  Water* water = new Water;
+  EXPECT_TRUE(water != NULL);
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  bool check_for_leaks = false;
+  if (argc > 1 && strcmp(argv[1], "--check_for_leaks") == 0 )
+    check_for_leaks = true;
+  else
+    printf("%s\n", "Run this program with --check_for_leaks to enable "
+           "custom leak checking in the tests.");
+
+  // If we are given the --check_for_leaks command line flag, installs the
+  // leak checker.
+  if (check_for_leaks) {
+    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+
+    // Adds the leak checker to the end of the test event listener list,
+    // after the default text output printer and the default XML report
+    // generator.
+    //
+    // The order is important - it ensures that failures generated in the
+    // leak checker's OnTestEnd() method are processed by the text and XML
+    // printers *before* their OnTestEnd() methods are called, such that
+    // they are attributed to the right test. Remember that a listener
+    // receives an OnXyzStart event *after* listeners preceding it in the
+    // list received that event, and receives an OnXyzEnd event *before*
+    // listeners preceding it.
+    //
+    // We don't need to worry about deleting the new listener later, as
+    // Google Test will do it.
+    listeners.Append(new LeakChecker);
+  }
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1_unittest.cc
new file mode 100644
index 0000000..aefc4f1
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample1_unittest.cc
@@ -0,0 +1,153 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// This sample shows how to write a simple unit test for a function,
+// using Google C++ testing framework.
+//
+// Writing a unit test using Google C++ testing framework is easy as 1-2-3:
+
+
+// Step 1. Include necessary header files such that the stuff your
+// test logic needs is declared.
+//
+// Don't forget gtest.h, which declares the testing framework.
+
+#include <limits.h>
+#include "sample1.h"
+#include "gtest/gtest.h"
+
+
+// Step 2. Use the TEST macro to define your tests.
+//
+// TEST has two parameters: the test case name and the test name.
+// After using the macro, you should define your test logic between a
+// pair of braces.  You can use a bunch of macros to indicate the
+// success or failure of a test.  EXPECT_TRUE and EXPECT_EQ are
+// examples of such macros.  For a complete list, see gtest.h.
+//
+// <TechnicalDetails>
+//
+// In Google Test, tests are grouped into test cases.  This is how we
+// keep test code organized.  You should put logically related tests
+// into the same test case.
+//
+// The test case name and the test name should both be valid C++
+// identifiers.  And you should not use underscore (_) in the names.
+//
+// Google Test guarantees that each test you define is run exactly
+// once, but it makes no guarantee on the order the tests are
+// executed.  Therefore, you should write your tests in such a way
+// that their results don't depend on their order.
+//
+// </TechnicalDetails>
+
+
+// Tests Factorial().
+
+// Tests factorial of negative numbers.
+TEST(FactorialTest, Negative) {
+  // This test is named "Negative", and belongs to the "FactorialTest"
+  // test case.
+  EXPECT_EQ(1, Factorial(-5));
+  EXPECT_EQ(1, Factorial(-1));
+  EXPECT_GT(Factorial(-10), 0);
+
+  // <TechnicalDetails>
+  //
+  // EXPECT_EQ(expected, actual) is the same as
+  //
+  //   EXPECT_TRUE((expected) == (actual))
+  //
+  // except that it will print both the expected value and the actual
+  // value when the assertion fails.  This is very helpful for
+  // debugging.  Therefore in this case EXPECT_EQ is preferred.
+  //
+  // On the other hand, EXPECT_TRUE accepts any Boolean expression,
+  // and is thus more general.
+  //
+  // </TechnicalDetails>
+}
+
+// Tests factorial of 0.
+TEST(FactorialTest, Zero) {
+  EXPECT_EQ(1, Factorial(0));
+}
+
+// Tests factorial of positive numbers.
+TEST(FactorialTest, Positive) {
+  EXPECT_EQ(1, Factorial(1));
+  EXPECT_EQ(2, Factorial(2));
+  EXPECT_EQ(6, Factorial(3));
+  EXPECT_EQ(40320, Factorial(8));
+}
+
+
+// Tests IsPrime()
+
+// Tests negative input.
+TEST(IsPrimeTest, Negative) {
+  // This test belongs to the IsPrimeTest test case.
+
+  EXPECT_FALSE(IsPrime(-1));
+  EXPECT_FALSE(IsPrime(-2));
+  EXPECT_FALSE(IsPrime(INT_MIN));
+}
+
+// Tests some trivial cases.
+TEST(IsPrimeTest, Trivial) {
+  EXPECT_FALSE(IsPrime(0));
+  EXPECT_FALSE(IsPrime(1));
+  EXPECT_TRUE(IsPrime(2));
+  EXPECT_TRUE(IsPrime(3));
+}
+
+// Tests positive input.
+TEST(IsPrimeTest, Positive) {
+  EXPECT_FALSE(IsPrime(4));
+  EXPECT_TRUE(IsPrime(5));
+  EXPECT_FALSE(IsPrime(6));
+  EXPECT_TRUE(IsPrime(23));
+}
+
+// Step 3. Call RUN_ALL_TESTS() in main().
+//
+// We do this by linking in src/gtest_main.cc file, which consists of
+// a main() function which calls RUN_ALL_TESTS() for us.
+//
+// This runs all the tests you've defined, prints the result, and
+// returns 0 if successful, or 1 otherwise.
+//
+// Did you notice that we didn't register the tests?  The
+// RUN_ALL_TESTS() macro magically knows about all the tests we
+// defined.  Isn't this convenient?
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2.cc
new file mode 100644
index 0000000..5f763b9
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2.cc
@@ -0,0 +1,56 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "sample2.h"
+
+#include <string.h>
+
+// Clones a 0-terminated C string, allocating memory using new.
+const char* MyString::CloneCString(const char* a_c_string) {
+  if (a_c_string == NULL) return NULL;
+
+  const size_t len = strlen(a_c_string);
+  char* const clone = new char[ len + 1 ];
+  memcpy(clone, a_c_string, len + 1);
+
+  return clone;
+}
+
+// Sets the 0-terminated C string this MyString object
+// represents.
+void MyString::Set(const char* a_c_string) {
+  // Makes sure this works when c_string == c_string_
+  const char* const temp = MyString::CloneCString(a_c_string);
+  delete[] c_string_;
+  c_string_ = temp;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2.h b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2.h
new file mode 100644
index 0000000..cb485c7
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2.h
@@ -0,0 +1,85 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE2_H_
+#define GTEST_SAMPLES_SAMPLE2_H_
+
+#include <string.h>
+
+
+// A simple string class.
+class MyString {
+ private:
+  const char* c_string_;
+  const MyString& operator=(const MyString& rhs);
+
+ public:
+  // Clones a 0-terminated C string, allocating memory using new.
+  static const char* CloneCString(const char* a_c_string);
+
+  ////////////////////////////////////////////////////////////
+  //
+  // C'tors
+
+  // The default c'tor constructs a NULL string.
+  MyString() : c_string_(NULL) {}
+
+  // Constructs a MyString by cloning a 0-terminated C string.
+  explicit MyString(const char* a_c_string) : c_string_(NULL) {
+    Set(a_c_string);
+  }
+
+  // Copy c'tor
+  MyString(const MyString& string) : c_string_(NULL) {
+    Set(string.c_string_);
+  }
+
+  ////////////////////////////////////////////////////////////
+  //
+  // D'tor.  MyString is intended to be a final class, so the d'tor
+  // doesn't need to be virtual.
+  ~MyString() { delete[] c_string_; }
+
+  // Gets the 0-terminated C string this MyString object represents.
+  const char* c_string() const { return c_string_; }
+
+  size_t Length() const {
+    return c_string_ == NULL ? 0 : strlen(c_string_);
+  }
+
+  // Sets the 0-terminated C string this MyString object represents.
+  void Set(const char* c_string);
+};
+
+
+#endif  // GTEST_SAMPLES_SAMPLE2_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2_unittest.cc
new file mode 100644
index 0000000..4fa19b7
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample2_unittest.cc
@@ -0,0 +1,109 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// This sample shows how to write a more complex unit test for a class
+// that has multiple member functions.
+//
+// Usually, it's a good idea to have one test for each method in your
+// class.  You don't have to do that exactly, but it helps to keep
+// your tests organized.  You may also throw in additional tests as
+// needed.
+
+#include "sample2.h"
+#include "gtest/gtest.h"
+
+// In this example, we test the MyString class (a simple string).
+
+// Tests the default c'tor.
+TEST(MyString, DefaultConstructor) {
+  const MyString s;
+
+  // Asserts that s.c_string() returns NULL.
+  //
+  // <TechnicalDetails>
+  //
+  // If we write NULL instead of
+  //
+  //   static_cast<const char *>(NULL)
+  //
+  // in this assertion, it will generate a warning on gcc 3.4.  The
+  // reason is that EXPECT_EQ needs to know the types of its
+  // arguments in order to print them when it fails.  Since NULL is
+  // #defined as 0, the compiler will use the formatter function for
+  // int to print it.  However, gcc thinks that NULL should be used as
+  // a pointer, not an int, and therefore complains.
+  //
+  // The root of the problem is C++'s lack of distinction between the
+  // integer number 0 and the null pointer constant.  Unfortunately,
+  // we have to live with this fact.
+  //
+  // </TechnicalDetails>
+  EXPECT_STREQ(NULL, s.c_string());
+
+  EXPECT_EQ(0u, s.Length());
+}
+
+const char kHelloString[] = "Hello, world!";
+
+// Tests the c'tor that accepts a C string.
+TEST(MyString, ConstructorFromCString) {
+  const MyString s(kHelloString);
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+  EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
+            s.Length());
+}
+
+// Tests the copy c'tor.
+TEST(MyString, CopyConstructor) {
+  const MyString s1(kHelloString);
+  const MyString s2 = s1;
+  EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString));
+}
+
+// Tests the Set method.
+TEST(MyString, Set) {
+  MyString s;
+
+  s.Set(kHelloString);
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+
+  // Set should work when the input pointer is the same as the one
+  // already in the MyString object.
+  s.Set(s.c_string());
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+
+  // Can we set the MyString to NULL?
+  s.Set(NULL);
+  EXPECT_STREQ(NULL, s.c_string());
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample3-inl.h b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample3-inl.h
new file mode 100644
index 0000000..7e3084d
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample3-inl.h
@@ -0,0 +1,172 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
+#define GTEST_SAMPLES_SAMPLE3_INL_H_
+
+#include <stddef.h>
+
+
+// Queue is a simple queue implemented as a singled-linked list.
+//
+// The element type must support copy constructor.
+template <typename E>  // E is the element type
+class Queue;
+
+// QueueNode is a node in a Queue, which consists of an element of
+// type E and a pointer to the next node.
+template <typename E>  // E is the element type
+class QueueNode {
+  friend class Queue<E>;
+
+ public:
+  // Gets the element in this node.
+  const E& element() const { return element_; }
+
+  // Gets the next node in the queue.
+  QueueNode* next() { return next_; }
+  const QueueNode* next() const { return next_; }
+
+ private:
+  // Creates a node with a given element value.  The next pointer is
+  // set to NULL.
+  explicit QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}
+
+  // We disable the default assignment operator and copy c'tor.
+  const QueueNode& operator = (const QueueNode&);
+  QueueNode(const QueueNode&);
+
+  E element_;
+  QueueNode* next_;
+};
+
+template <typename E>  // E is the element type.
+class Queue {
+ public:
+  // Creates an empty queue.
+  Queue() : head_(NULL), last_(NULL), size_(0) {}
+
+  // D'tor.  Clears the queue.
+  ~Queue() { Clear(); }
+
+  // Clears the queue.
+  void Clear() {
+    if (size_ > 0) {
+      // 1. Deletes every node.
+      QueueNode<E>* node = head_;
+      QueueNode<E>* next = node->next();
+      for (; ;) {
+        delete node;
+        node = next;
+        if (node == NULL) break;
+        next = node->next();
+      }
+
+      // 2. Resets the member variables.
+      head_ = last_ = NULL;
+      size_ = 0;
+    }
+  }
+
+  // Gets the number of elements.
+  size_t Size() const { return size_; }
+
+  // Gets the first element of the queue, or NULL if the queue is empty.
+  QueueNode<E>* Head() { return head_; }
+  const QueueNode<E>* Head() const { return head_; }
+
+  // Gets the last element of the queue, or NULL if the queue is empty.
+  QueueNode<E>* Last() { return last_; }
+  const QueueNode<E>* Last() const { return last_; }
+
+  // Adds an element to the end of the queue.  A copy of the element is
+  // created using the copy constructor, and then stored in the queue.
+  // Changes made to the element in the queue doesn't affect the source
+  // object, and vice versa.
+  void Enqueue(const E& element) {
+    QueueNode<E>* new_node = new QueueNode<E>(element);
+
+    if (size_ == 0) {
+      head_ = last_ = new_node;
+      size_ = 1;
+    } else {
+      last_->next_ = new_node;
+      last_ = new_node;
+      size_++;
+    }
+  }
+
+  // Removes the head of the queue and returns it.  Returns NULL if
+  // the queue is empty.
+  E* Dequeue() {
+    if (size_ == 0) {
+      return NULL;
+    }
+
+    const QueueNode<E>* const old_head = head_;
+    head_ = head_->next_;
+    size_--;
+    if (size_ == 0) {
+      last_ = NULL;
+    }
+
+    E* element = new E(old_head->element());
+    delete old_head;
+
+    return element;
+  }
+
+  // Applies a function/functor on each element of the queue, and
+  // returns the result in a new queue.  The original queue is not
+  // affected.
+  template <typename F>
+  Queue* Map(F function) const {
+    Queue* new_queue = new Queue();
+    for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {
+      new_queue->Enqueue(function(node->element()));
+    }
+
+    return new_queue;
+  }
+
+ private:
+  QueueNode<E>* head_;  // The first node of the queue.
+  QueueNode<E>* last_;  // The last node of the queue.
+  size_t size_;  // The number of elements in the queue.
+
+  // We disallow copying a queue.
+  Queue(const Queue&);
+  const Queue& operator = (const Queue&);
+};
+
+#endif  // GTEST_SAMPLES_SAMPLE3_INL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample3_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample3_unittest.cc
new file mode 100644
index 0000000..bf3877d
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample3_unittest.cc
@@ -0,0 +1,151 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// In this example, we use a more advanced feature of Google Test called
+// test fixture.
+//
+// A test fixture is a place to hold objects and functions shared by
+// all tests in a test case.  Using a test fixture avoids duplicating
+// the test code necessary to initialize and cleanup those common
+// objects for each test.  It is also useful for defining sub-routines
+// that your tests need to invoke a lot.
+//
+// <TechnicalDetails>
+//
+// The tests share the test fixture in the sense of code sharing, not
+// data sharing.  Each test is given its own fresh copy of the
+// fixture.  You cannot expect the data modified by one test to be
+// passed on to another test, which is a bad idea.
+//
+// The reason for this design is that tests should be independent and
+// repeatable.  In particular, a test should not fail as the result of
+// another test's failure.  If one test depends on info produced by
+// another test, then the two tests should really be one big test.
+//
+// The macros for indicating the success/failure of a test
+// (EXPECT_TRUE, FAIL, etc) need to know what the current test is
+// (when Google Test prints the test result, it tells you which test
+// each failure belongs to).  Technically, these macros invoke a
+// member function of the Test class.  Therefore, you cannot use them
+// in a global function.  That's why you should put test sub-routines
+// in a test fixture.
+//
+// </TechnicalDetails>
+
+#include "sample3-inl.h"
+#include "gtest/gtest.h"
+
+// To use a test fixture, derive a class from testing::Test.
+class QueueTest : public testing::Test {
+ protected:  // You should make the members protected s.t. they can be
+             // accessed from sub-classes.
+
+  // virtual void SetUp() will be called before each test is run.  You
+  // should define it if you need to initialize the varaibles.
+  // Otherwise, this can be skipped.
+  virtual void SetUp() {
+    q1_.Enqueue(1);
+    q2_.Enqueue(2);
+    q2_.Enqueue(3);
+  }
+
+  // virtual void TearDown() will be called after each test is run.
+  // You should define it if there is cleanup work to do.  Otherwise,
+  // you don't have to provide it.
+  //
+  // virtual void TearDown() {
+  // }
+
+  // A helper function that some test uses.
+  static int Double(int n) {
+    return 2*n;
+  }
+
+  // A helper function for testing Queue::Map().
+  void MapTester(const Queue<int> * q) {
+    // Creates a new queue, where each element is twice as big as the
+    // corresponding one in q.
+    const Queue<int> * const new_q = q->Map(Double);
+
+    // Verifies that the new queue has the same size as q.
+    ASSERT_EQ(q->Size(), new_q->Size());
+
+    // Verifies the relationship between the elements of the two queues.
+    for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
+          n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
+      EXPECT_EQ(2 * n1->element(), n2->element());
+    }
+
+    delete new_q;
+  }
+
+  // Declares the variables your tests want to use.
+  Queue<int> q0_;
+  Queue<int> q1_;
+  Queue<int> q2_;
+};
+
+// When you have a test fixture, you define a test using TEST_F
+// instead of TEST.
+
+// Tests the default c'tor.
+TEST_F(QueueTest, DefaultConstructor) {
+  // You can access data in the test fixture here.
+  EXPECT_EQ(0u, q0_.Size());
+}
+
+// Tests Dequeue().
+TEST_F(QueueTest, Dequeue) {
+  int * n = q0_.Dequeue();
+  EXPECT_TRUE(n == NULL);
+
+  n = q1_.Dequeue();
+  ASSERT_TRUE(n != NULL);
+  EXPECT_EQ(1, *n);
+  EXPECT_EQ(0u, q1_.Size());
+  delete n;
+
+  n = q2_.Dequeue();
+  ASSERT_TRUE(n != NULL);
+  EXPECT_EQ(2, *n);
+  EXPECT_EQ(1u, q2_.Size());
+  delete n;
+}
+
+// Tests the Queue::Map() function.
+TEST_F(QueueTest, Map) {
+  MapTester(&q0_);
+  MapTester(&q1_);
+  MapTester(&q2_);
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4.cc
new file mode 100644
index 0000000..ae44bda
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4.cc
@@ -0,0 +1,46 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <stdio.h>
+
+#include "sample4.h"
+
+// Returns the current counter value, and increments it.
+int Counter::Increment() {
+  return counter_++;
+}
+
+// Prints the current counter value to STDOUT.
+void Counter::Print() const {
+  printf("%d", counter_);
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4.h b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4.h
new file mode 100644
index 0000000..cd60f0d
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4.h
@@ -0,0 +1,53 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE4_H_
+#define GTEST_SAMPLES_SAMPLE4_H_
+
+// A simple monotonic counter.
+class Counter {
+ private:
+  int counter_;
+
+ public:
+  // Creates a counter that starts at 0.
+  Counter() : counter_(0) {}
+
+  // Returns the current counter value, and increments it.
+  int Increment();
+
+  // Prints the current counter value to STDOUT.
+  void Print() const;
+};
+
+#endif  // GTEST_SAMPLES_SAMPLE4_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4_unittest.cc
new file mode 100644
index 0000000..fa5afc7
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample4_unittest.cc
@@ -0,0 +1,45 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+#include "sample4.h"
+
+// Tests the Increment() method.
+TEST(Counter, Increment) {
+  Counter c;
+
+  // EXPECT_EQ() evaluates its arguments exactly once, so they
+  // can have side effects.
+
+  EXPECT_EQ(0, c.Increment());
+  EXPECT_EQ(1, c.Increment());
+  EXPECT_EQ(2, c.Increment());
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample5_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample5_unittest.cc
new file mode 100644
index 0000000..43d8e57
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample5_unittest.cc
@@ -0,0 +1,199 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This sample teaches how to reuse a test fixture in multiple test
+// cases by deriving sub-fixtures from it.
+//
+// When you define a test fixture, you specify the name of the test
+// case that will use this fixture.  Therefore, a test fixture can
+// be used by only one test case.
+//
+// Sometimes, more than one test cases may want to use the same or
+// slightly different test fixtures.  For example, you may want to
+// make sure that all tests for a GUI library don't leak important
+// system resources like fonts and brushes.  In Google Test, you do
+// this by putting the shared logic in a super (as in "super class")
+// test fixture, and then have each test case use a fixture derived
+// from this super fixture.
+
+#include <limits.h>
+#include <time.h>
+#include "sample3-inl.h"
+#include "gtest/gtest.h"
+#include "sample1.h"
+
+// In this sample, we want to ensure that every test finishes within
+// ~5 seconds.  If a test takes longer to run, we consider it a
+// failure.
+//
+// We put the code for timing a test in a test fixture called
+// "QuickTest".  QuickTest is intended to be the super fixture that
+// other fixtures derive from, therefore there is no test case with
+// the name "QuickTest".  This is OK.
+//
+// Later, we will derive multiple test fixtures from QuickTest.
+class QuickTest : public testing::Test {
+ protected:
+  // Remember that SetUp() is run immediately before a test starts.
+  // This is a good place to record the start time.
+  virtual void SetUp() {
+    start_time_ = time(NULL);
+  }
+
+  // TearDown() is invoked immediately after a test finishes.  Here we
+  // check if the test was too slow.
+  virtual void TearDown() {
+    // Gets the time when the test finishes
+    const time_t end_time = time(NULL);
+
+    // Asserts that the test took no more than ~5 seconds.  Did you
+    // know that you can use assertions in SetUp() and TearDown() as
+    // well?
+    EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
+  }
+
+  // The UTC time (in seconds) when the test starts
+  time_t start_time_;
+};
+
+
+// We derive a fixture named IntegerFunctionTest from the QuickTest
+// fixture.  All tests using this fixture will be automatically
+// required to be quick.
+class IntegerFunctionTest : public QuickTest {
+  // We don't need any more logic than already in the QuickTest fixture.
+  // Therefore the body is empty.
+};
+
+
+// Now we can write tests in the IntegerFunctionTest test case.
+
+// Tests Factorial()
+TEST_F(IntegerFunctionTest, Factorial) {
+  // Tests factorial of negative numbers.
+  EXPECT_EQ(1, Factorial(-5));
+  EXPECT_EQ(1, Factorial(-1));
+  EXPECT_GT(Factorial(-10), 0);
+
+  // Tests factorial of 0.
+  EXPECT_EQ(1, Factorial(0));
+
+  // Tests factorial of positive numbers.
+  EXPECT_EQ(1, Factorial(1));
+  EXPECT_EQ(2, Factorial(2));
+  EXPECT_EQ(6, Factorial(3));
+  EXPECT_EQ(40320, Factorial(8));
+}
+
+
+// Tests IsPrime()
+TEST_F(IntegerFunctionTest, IsPrime) {
+  // Tests negative input.
+  EXPECT_FALSE(IsPrime(-1));
+  EXPECT_FALSE(IsPrime(-2));
+  EXPECT_FALSE(IsPrime(INT_MIN));
+
+  // Tests some trivial cases.
+  EXPECT_FALSE(IsPrime(0));
+  EXPECT_FALSE(IsPrime(1));
+  EXPECT_TRUE(IsPrime(2));
+  EXPECT_TRUE(IsPrime(3));
+
+  // Tests positive input.
+  EXPECT_FALSE(IsPrime(4));
+  EXPECT_TRUE(IsPrime(5));
+  EXPECT_FALSE(IsPrime(6));
+  EXPECT_TRUE(IsPrime(23));
+}
+
+
+// The next test case (named "QueueTest") also needs to be quick, so
+// we derive another fixture from QuickTest.
+//
+// The QueueTest test fixture has some logic and shared objects in
+// addition to what's in QuickTest already.  We define the additional
+// stuff inside the body of the test fixture, as usual.
+class QueueTest : public QuickTest {
+ protected:
+  virtual void SetUp() {
+    // First, we need to set up the super fixture (QuickTest).
+    QuickTest::SetUp();
+
+    // Second, some additional setup for this fixture.
+    q1_.Enqueue(1);
+    q2_.Enqueue(2);
+    q2_.Enqueue(3);
+  }
+
+  // By default, TearDown() inherits the behavior of
+  // QuickTest::TearDown().  As we have no additional cleaning work
+  // for QueueTest, we omit it here.
+  //
+  // virtual void TearDown() {
+  //   QuickTest::TearDown();
+  // }
+
+  Queue<int> q0_;
+  Queue<int> q1_;
+  Queue<int> q2_;
+};
+
+
+// Now, let's write tests using the QueueTest fixture.
+
+// Tests the default constructor.
+TEST_F(QueueTest, DefaultConstructor) {
+  EXPECT_EQ(0u, q0_.Size());
+}
+
+// Tests Dequeue().
+TEST_F(QueueTest, Dequeue) {
+  int* n = q0_.Dequeue();
+  EXPECT_TRUE(n == NULL);
+
+  n = q1_.Dequeue();
+  EXPECT_TRUE(n != NULL);
+  EXPECT_EQ(1, *n);
+  EXPECT_EQ(0u, q1_.Size());
+  delete n;
+
+  n = q2_.Dequeue();
+  EXPECT_TRUE(n != NULL);
+  EXPECT_EQ(2, *n);
+  EXPECT_EQ(1u, q2_.Size());
+  delete n;
+}
+
+// If necessary, you can derive further test fixtures from a derived
+// fixture itself.  For example, you can derive another fixture from
+// QueueTest.  Google Test imposes no limit on how deep the hierarchy
+// can be.  In practice, however, you probably don't want it to be too
+// deep as to be confusing.
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample6_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample6_unittest.cc
new file mode 100644
index 0000000..8f2036a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample6_unittest.cc
@@ -0,0 +1,224 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This sample shows how to test common properties of multiple
+// implementations of the same interface (aka interface tests).
+
+// The interface and its implementations are in this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+// First, we define some factory functions for creating instances of
+// the implementations.  You may be able to skip this step if all your
+// implementations can be constructed the same way.
+
+template <class T>
+PrimeTable* CreatePrimeTable();
+
+template <>
+PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {
+  return new OnTheFlyPrimeTable;
+}
+
+template <>
+PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {
+  return new PreCalculatedPrimeTable(10000);
+}
+
+// Then we define a test fixture class template.
+template <class T>
+class PrimeTableTest : public testing::Test {
+ protected:
+  // The ctor calls the factory function to create a prime table
+  // implemented by T.
+  PrimeTableTest() : table_(CreatePrimeTable<T>()) {}
+
+  virtual ~PrimeTableTest() { delete table_; }
+
+  // Note that we test an implementation via the base interface
+  // instead of the actual implementation class.  This is important
+  // for keeping the tests close to the real world scenario, where the
+  // implementation is invoked via the base interface.  It avoids
+  // got-yas where the implementation class has a method that shadows
+  // a method with the same name (but slightly different argument
+  // types) in the base interface, for example.
+  PrimeTable* const table_;
+};
+
+#if GTEST_HAS_TYPED_TEST
+
+using testing::Types;
+
+// Google Test offers two ways for reusing tests for different types.
+// The first is called "typed tests".  You should use it if you
+// already know *all* the types you are gonna exercise when you write
+// the tests.
+
+// To write a typed test case, first use
+//
+//   TYPED_TEST_CASE(TestCaseName, TypeList);
+//
+// to declare it and specify the type parameters.  As with TEST_F,
+// TestCaseName must match the test fixture name.
+
+// The list of types we want to test.
+typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;
+
+TYPED_TEST_CASE(PrimeTableTest, Implementations);
+
+// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,
+// similar to TEST_F.
+TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  // Inside the test body, you can refer to the type parameter by
+  // TypeParam, and refer to the fixture class by TestFixture.  We
+  // don't need them in this example.
+
+  // Since we are in the template world, C++ requires explicitly
+  // writing 'this->' when referring to members of the fixture class.
+  // This is something you have to learn to live with.
+  EXPECT_FALSE(this->table_->IsPrime(-5));
+  EXPECT_FALSE(this->table_->IsPrime(0));
+  EXPECT_FALSE(this->table_->IsPrime(1));
+  EXPECT_FALSE(this->table_->IsPrime(4));
+  EXPECT_FALSE(this->table_->IsPrime(6));
+  EXPECT_FALSE(this->table_->IsPrime(100));
+}
+
+TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(this->table_->IsPrime(2));
+  EXPECT_TRUE(this->table_->IsPrime(3));
+  EXPECT_TRUE(this->table_->IsPrime(5));
+  EXPECT_TRUE(this->table_->IsPrime(7));
+  EXPECT_TRUE(this->table_->IsPrime(11));
+  EXPECT_TRUE(this->table_->IsPrime(131));
+}
+
+TYPED_TEST(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, this->table_->GetNextPrime(0));
+  EXPECT_EQ(3, this->table_->GetNextPrime(2));
+  EXPECT_EQ(5, this->table_->GetNextPrime(3));
+  EXPECT_EQ(7, this->table_->GetNextPrime(5));
+  EXPECT_EQ(11, this->table_->GetNextPrime(7));
+  EXPECT_EQ(131, this->table_->GetNextPrime(128));
+}
+
+// That's it!  Google Test will repeat each TYPED_TEST for each type
+// in the type list specified in TYPED_TEST_CASE.  Sit back and be
+// happy that you don't have to define them multiple times.
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Types;
+
+// Sometimes, however, you don't yet know all the types that you want
+// to test when you write the tests.  For example, if you are the
+// author of an interface and expect other people to implement it, you
+// might want to write a set of tests to make sure each implementation
+// conforms to some basic requirements, but you don't know what
+// implementations will be written in the future.
+//
+// How can you write the tests without committing to the type
+// parameters?  That's what "type-parameterized tests" can do for you.
+// It is a bit more involved than typed tests, but in return you get a
+// test pattern that can be reused in many contexts, which is a big
+// win.  Here's how you do it:
+
+// First, define a test fixture class template.  Here we just reuse
+// the PrimeTableTest fixture defined earlier:
+
+template <class T>
+class PrimeTableTest2 : public PrimeTableTest<T> {
+};
+
+// Then, declare the test case.  The argument is the name of the test
+// fixture, and also the name of the test case (as usual).  The _P
+// suffix is for "parameterized" or "pattern".
+TYPED_TEST_CASE_P(PrimeTableTest2);
+
+// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,
+// similar to what you do with TEST_F.
+TYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {
+  EXPECT_FALSE(this->table_->IsPrime(-5));
+  EXPECT_FALSE(this->table_->IsPrime(0));
+  EXPECT_FALSE(this->table_->IsPrime(1));
+  EXPECT_FALSE(this->table_->IsPrime(4));
+  EXPECT_FALSE(this->table_->IsPrime(6));
+  EXPECT_FALSE(this->table_->IsPrime(100));
+}
+
+TYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(this->table_->IsPrime(2));
+  EXPECT_TRUE(this->table_->IsPrime(3));
+  EXPECT_TRUE(this->table_->IsPrime(5));
+  EXPECT_TRUE(this->table_->IsPrime(7));
+  EXPECT_TRUE(this->table_->IsPrime(11));
+  EXPECT_TRUE(this->table_->IsPrime(131));
+}
+
+TYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {
+  EXPECT_EQ(2, this->table_->GetNextPrime(0));
+  EXPECT_EQ(3, this->table_->GetNextPrime(2));
+  EXPECT_EQ(5, this->table_->GetNextPrime(3));
+  EXPECT_EQ(7, this->table_->GetNextPrime(5));
+  EXPECT_EQ(11, this->table_->GetNextPrime(7));
+  EXPECT_EQ(131, this->table_->GetNextPrime(128));
+}
+
+// Type-parameterized tests involve one extra step: you have to
+// enumerate the tests you defined:
+REGISTER_TYPED_TEST_CASE_P(
+    PrimeTableTest2,  // The first argument is the test case name.
+    // The rest of the arguments are the test names.
+    ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);
+
+// At this point the test pattern is done.  However, you don't have
+// any real test yet as you haven't said which types you want to run
+// the tests with.
+
+// To turn the abstract test pattern into real tests, you instantiate
+// it with a list of types.  Usually the test pattern will be defined
+// in a .h file, and anyone can #include and instantiate it.  You can
+// even instantiate it more than once in the same program.  To tell
+// different instances apart, you give each of them a name, which will
+// become part of the test case name and can be used in test filters.
+
+// The list of types we want to test.  Note that it doesn't have to be
+// defined at the time we write the TYPED_TEST_P()s.
+typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>
+    PrimeTableImplementations;
+INSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated,    // Instance name
+                              PrimeTableTest2,             // Test case name
+                              PrimeTableImplementations);  // Type list
+
+#endif  // GTEST_HAS_TYPED_TEST_P
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample7_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample7_unittest.cc
new file mode 100644
index 0000000..1b651a2
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample7_unittest.cc
@@ -0,0 +1,130 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to test common properties of multiple
+// implementations of an interface (aka interface tests) using
+// value-parameterized tests. Each test in the test case has
+// a parameter that is an interface pointer to an implementation
+// tested.
+
+// The interface and its implementations are in this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+using ::testing::TestWithParam;
+using ::testing::Values;
+
+// As a general rule, to prevent a test from affecting the tests that come
+// after it, you should create and destroy the tested objects for each test
+// instead of reusing them.  In this sample we will define a simple factory
+// function for PrimeTable objects.  We will instantiate objects in test's
+// SetUp() method and delete them in TearDown() method.
+typedef PrimeTable* CreatePrimeTableFunc();
+
+PrimeTable* CreateOnTheFlyPrimeTable() {
+  return new OnTheFlyPrimeTable();
+}
+
+template <size_t max_precalculated>
+PrimeTable* CreatePreCalculatedPrimeTable() {
+  return new PreCalculatedPrimeTable(max_precalculated);
+}
+
+// Inside the test body, fixture constructor, SetUp(), and TearDown() you
+// can refer to the test parameter by GetParam().  In this case, the test
+// parameter is a factory function which we call in fixture's SetUp() to
+// create and store an instance of PrimeTable.
+class PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> {
+ public:
+  virtual ~PrimeTableTest() { delete table_; }
+  virtual void SetUp() { table_ = (*GetParam())(); }
+  virtual void TearDown() {
+    delete table_;
+    table_ = NULL;
+  }
+
+ protected:
+  PrimeTable* table_;
+};
+
+TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  EXPECT_FALSE(table_->IsPrime(-5));
+  EXPECT_FALSE(table_->IsPrime(0));
+  EXPECT_FALSE(table_->IsPrime(1));
+  EXPECT_FALSE(table_->IsPrime(4));
+  EXPECT_FALSE(table_->IsPrime(6));
+  EXPECT_FALSE(table_->IsPrime(100));
+}
+
+TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(table_->IsPrime(2));
+  EXPECT_TRUE(table_->IsPrime(3));
+  EXPECT_TRUE(table_->IsPrime(5));
+  EXPECT_TRUE(table_->IsPrime(7));
+  EXPECT_TRUE(table_->IsPrime(11));
+  EXPECT_TRUE(table_->IsPrime(131));
+}
+
+TEST_P(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, table_->GetNextPrime(0));
+  EXPECT_EQ(3, table_->GetNextPrime(2));
+  EXPECT_EQ(5, table_->GetNextPrime(3));
+  EXPECT_EQ(7, table_->GetNextPrime(5));
+  EXPECT_EQ(11, table_->GetNextPrime(7));
+  EXPECT_EQ(131, table_->GetNextPrime(128));
+}
+
+// In order to run value-parameterized tests, you need to instantiate them,
+// or bind them to a list of values which will be used as test parameters.
+// You can instantiate them in a different translation module, or even
+// instantiate them several times.
+//
+// Here, we instantiate our tests with a list of two PrimeTable object
+// factory functions:
+INSTANTIATE_TEST_CASE_P(
+    OnTheFlyAndPreCalculated,
+    PrimeTableTest,
+    Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>));
+
+#else
+
+// Google Test may not support value-parameterized tests with some
+// compilers. If we use conditional compilation to compile out all
+// code referring to the gtest_main library, MSVC linker will not link
+// that library at all and consequently complain about missing entry
+// point defined in that library (fatal error LNK1561: entry point
+// must be defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}
+
+#endif  // GTEST_HAS_PARAM_TEST
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample8_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample8_unittest.cc
new file mode 100644
index 0000000..5ad2e2c
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample8_unittest.cc
@@ -0,0 +1,173 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to test code relying on some global flag variables.
+// Combine() helps with generating all possible combinations of such flags,
+// and each test is given one combination as a parameter.
+
+// Use class definitions to test from this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_COMBINE
+
+// Suppose we want to introduce a new, improved implementation of PrimeTable
+// which combines speed of PrecalcPrimeTable and versatility of
+// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both
+// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more
+// appropriate under the circumstances. But in low memory conditions, it can be
+// told to instantiate without PrecalcPrimeTable instance at all and use only
+// OnTheFlyPrimeTable.
+class HybridPrimeTable : public PrimeTable {
+ public:
+  HybridPrimeTable(bool force_on_the_fly, int max_precalculated)
+      : on_the_fly_impl_(new OnTheFlyPrimeTable),
+        precalc_impl_(force_on_the_fly ? NULL :
+                          new PreCalculatedPrimeTable(max_precalculated)),
+        max_precalculated_(max_precalculated) {}
+  virtual ~HybridPrimeTable() {
+    delete on_the_fly_impl_;
+    delete precalc_impl_;
+  }
+
+  virtual bool IsPrime(int n) const {
+    if (precalc_impl_ != NULL && n < max_precalculated_)
+      return precalc_impl_->IsPrime(n);
+    else
+      return on_the_fly_impl_->IsPrime(n);
+  }
+
+  virtual int GetNextPrime(int p) const {
+    int next_prime = -1;
+    if (precalc_impl_ != NULL && p < max_precalculated_)
+      next_prime = precalc_impl_->GetNextPrime(p);
+
+    return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
+  }
+
+ private:
+  OnTheFlyPrimeTable* on_the_fly_impl_;
+  PreCalculatedPrimeTable* precalc_impl_;
+  int max_precalculated_;
+};
+
+using ::testing::TestWithParam;
+using ::testing::Bool;
+using ::testing::Values;
+using ::testing::Combine;
+
+// To test all code paths for HybridPrimeTable we must test it with numbers
+// both within and outside PreCalculatedPrimeTable's capacity and also with
+// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
+// accept different combinations of parameters for instantiating a
+// HybridPrimeTable instance.
+class PrimeTableTest : public TestWithParam< ::std::tr1::tuple<bool, int> > {
+ protected:
+  virtual void SetUp() {
+    // This can be written as
+    //
+    // bool force_on_the_fly;
+    // int max_precalculated;
+    // tie(force_on_the_fly, max_precalculated) = GetParam();
+    //
+    // once the Google C++ Style Guide allows use of ::std::tr1::tie.
+    //
+    bool force_on_the_fly = ::std::tr1::get<0>(GetParam());
+    int max_precalculated = ::std::tr1::get<1>(GetParam());
+    table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);
+  }
+  virtual void TearDown() {
+    delete table_;
+    table_ = NULL;
+  }
+  HybridPrimeTable* table_;
+};
+
+TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  // Inside the test body, you can refer to the test parameter by GetParam().
+  // In this case, the test parameter is a PrimeTable interface pointer which
+  // we can use directly.
+  // Please note that you can also save it in the fixture's SetUp() method
+  // or constructor and use saved copy in the tests.
+
+  EXPECT_FALSE(table_->IsPrime(-5));
+  EXPECT_FALSE(table_->IsPrime(0));
+  EXPECT_FALSE(table_->IsPrime(1));
+  EXPECT_FALSE(table_->IsPrime(4));
+  EXPECT_FALSE(table_->IsPrime(6));
+  EXPECT_FALSE(table_->IsPrime(100));
+}
+
+TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(table_->IsPrime(2));
+  EXPECT_TRUE(table_->IsPrime(3));
+  EXPECT_TRUE(table_->IsPrime(5));
+  EXPECT_TRUE(table_->IsPrime(7));
+  EXPECT_TRUE(table_->IsPrime(11));
+  EXPECT_TRUE(table_->IsPrime(131));
+}
+
+TEST_P(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, table_->GetNextPrime(0));
+  EXPECT_EQ(3, table_->GetNextPrime(2));
+  EXPECT_EQ(5, table_->GetNextPrime(3));
+  EXPECT_EQ(7, table_->GetNextPrime(5));
+  EXPECT_EQ(11, table_->GetNextPrime(7));
+  EXPECT_EQ(131, table_->GetNextPrime(128));
+}
+
+// In order to run value-parameterized tests, you need to instantiate them,
+// or bind them to a list of values which will be used as test parameters.
+// You can instantiate them in a different translation module, or even
+// instantiate them several times.
+//
+// Here, we instantiate our tests with a list of parameters. We must combine
+// all variations of the boolean flag suppressing PrecalcPrimeTable and some
+// meaningful values for tests. We choose a small value (1), and a value that
+// will put some of the tested numbers beyond the capability of the
+// PrecalcPrimeTable instance and some inside it (10). Combine will produce all
+// possible combinations.
+INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,
+                        PrimeTableTest,
+                        Combine(Bool(), Values(1, 10)));
+
+#else
+
+// Google Test may not support Combine() with some compilers. If we
+// use conditional compilation to compile out all code referring to
+// the gtest_main library, MSVC linker will not link that library at
+// all and consequently complain about missing entry point defined in
+// that library (fatal error LNK1561: entry point must be
+// defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}
+
+#endif  // GTEST_HAS_COMBINE
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/samples/sample9_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample9_unittest.cc
new file mode 100644
index 0000000..b2e2079
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/samples/sample9_unittest.cc
@@ -0,0 +1,160 @@
+// Copyright 2009 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to use Google Test listener API to implement
+// an alternative console output and how to use the UnitTest reflection API
+// to enumerate test cases and tests and to inspect their results.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+namespace {
+
+// Provides alternative output mode which produces minimal amount of
+// information about tests.
+class TersePrinter : public EmptyTestEventListener {
+ private:
+  // Called before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {}
+
+  // Called after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) {
+    fprintf(stdout, "TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED");
+    fflush(stdout);
+  }
+
+  // Called before a test starts.
+  virtual void OnTestStart(const TestInfo& test_info) {
+    fprintf(stdout,
+            "*** Test %s.%s starting.\n",
+            test_info.test_case_name(),
+            test_info.name());
+    fflush(stdout);
+  }
+
+  // Called after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) {
+    fprintf(stdout,
+            "%s in %s:%d\n%s\n",
+            test_part_result.failed() ? "*** Failure" : "Success",
+            test_part_result.file_name(),
+            test_part_result.line_number(),
+            test_part_result.summary());
+    fflush(stdout);
+  }
+
+  // Called after a test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) {
+    fprintf(stdout,
+            "*** Test %s.%s ending.\n",
+            test_info.test_case_name(),
+            test_info.name());
+    fflush(stdout);
+  }
+};  // class TersePrinter
+
+TEST(CustomOutputTest, PrintsMessage) {
+  printf("Printing something from the test body...\n");
+}
+
+TEST(CustomOutputTest, Succeeds) {
+  SUCCEED() << "SUCCEED() has been invoked from here";
+}
+
+TEST(CustomOutputTest, Fails) {
+  EXPECT_EQ(1, 2)
+      << "This test fails in order to demonstrate alternative failure messages";
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  bool terse_output = false;
+  if (argc > 1 && strcmp(argv[1], "--terse_output") == 0 )
+    terse_output = true;
+  else
+    printf("%s\n", "Run this program with --terse_output to change the way "
+           "it prints its output.");
+
+  UnitTest& unit_test = *UnitTest::GetInstance();
+
+  // If we are given the --terse_output command line flag, suppresses the
+  // standard output and attaches own result printer.
+  if (terse_output) {
+    TestEventListeners& listeners = unit_test.listeners();
+
+    // Removes the default console output listener from the list so it will
+    // not receive events from Google Test and won't print any output. Since
+    // this operation transfers ownership of the listener to the caller we
+    // have to delete it as well.
+    delete listeners.Release(listeners.default_result_printer());
+
+    // Adds the custom output listener to the list. It will now receive
+    // events from Google Test and print the alternative output. We don't
+    // have to worry about deleting it since Google Test assumes ownership
+    // over it after adding it to the list.
+    listeners.Append(new TersePrinter);
+  }
+  int ret_val = RUN_ALL_TESTS();
+
+  // This is an example of using the UnitTest reflection API to inspect test
+  // results. Here we discount failures from the tests we expected to fail.
+  int unexpectedly_failed_tests = 0;
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      // Counts failed tests that were not meant to fail (those without
+      // 'Fails' in the name).
+      if (test_info.result()->Failed() &&
+          strcmp(test_info.name(), "Fails") != 0) {
+        unexpectedly_failed_tests++;
+      }
+    }
+  }
+
+  // Test that were meant to fail should not affect the test program outcome.
+  if (unexpectedly_failed_tests == 0)
+    ret_val = 0;
+
+  return ret_val;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/scripts/fuse_gtest_files.py b/ThirdParty/common/gtest/gtest-1.7.0/scripts/fuse_gtest_files.py
new file mode 100755
index 0000000..57ef72f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/scripts/fuse_gtest_files.py
@@ -0,0 +1,250 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""fuse_gtest_files.py v0.2.0
+Fuses Google Test source code into a .h file and a .cc file.
+
+SYNOPSIS
+       fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR
+
+       Scans GTEST_ROOT_DIR for Google Test source code, and generates
+       two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.
+       Then you can build your tests by adding OUTPUT_DIR to the include
+       search path and linking with OUTPUT_DIR/gtest/gtest-all.cc.  These
+       two files contain everything you need to use Google Test.  Hence
+       you can "install" Google Test by copying them to wherever you want.
+
+       GTEST_ROOT_DIR can be omitted and defaults to the parent
+       directory of the directory holding this script.
+
+EXAMPLES
+       ./fuse_gtest_files.py fused_gtest
+       ./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest
+
+This tool is experimental.  In particular, it assumes that there is no
+conditional inclusion of Google Test headers.  Please report any
+problems to googletestframework at googlegroups.com.  You can read
+http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for
+more information.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sets
+import sys
+
+# We assume that this file is in the scripts/ directory in the Google
+# Test root directory.
+DEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
+
+# Regex for matching '#include "gtest/..."'.
+INCLUDE_GTEST_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(gtest/.+)"')
+
+# Regex for matching '#include "src/..."'.
+INCLUDE_SRC_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(src/.+)"')
+
+# Where to find the source seed files.
+GTEST_H_SEED = 'include/gtest/gtest.h'
+GTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'
+GTEST_ALL_CC_SEED = 'src/gtest-all.cc'
+
+# Where to put the generated files.
+GTEST_H_OUTPUT = 'gtest/gtest.h'
+GTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'
+
+
+def VerifyFileExists(directory, relative_path):
+  """Verifies that the given file exists; aborts on failure.
+
+  relative_path is the file path relative to the given directory.
+  """
+
+  if not os.path.isfile(os.path.join(directory, relative_path)):
+    print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
+                                                      directory)
+    print ('Please either specify a valid project root directory '
+           'or omit it on the command line.')
+    sys.exit(1)
+
+
+def ValidateGTestRootDir(gtest_root):
+  """Makes sure gtest_root points to a valid gtest root directory.
+
+  The function aborts the program on failure.
+  """
+
+  VerifyFileExists(gtest_root, GTEST_H_SEED)
+  VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED)
+
+
+def VerifyOutputFile(output_dir, relative_path):
+  """Verifies that the given output file path is valid.
+
+  relative_path is relative to the output_dir directory.
+  """
+
+  # Makes sure the output file either doesn't exist or can be overwritten.
+  output_file = os.path.join(output_dir, relative_path)
+  if os.path.exists(output_file):
+    # TODO(wan at google.com): The following user-interaction doesn't
+    # work with automated processes.  We should provide a way for the
+    # Makefile to force overwriting the files.
+    print ('%s already exists in directory %s - overwrite it? (y/N) ' %
+           (relative_path, output_dir))
+    answer = sys.stdin.readline().strip()
+    if answer not in ['y', 'Y']:
+      print 'ABORTED.'
+      sys.exit(1)
+
+  # Makes sure the directory holding the output file exists; creates
+  # it and all its ancestors if necessary.
+  parent_directory = os.path.dirname(output_file)
+  if not os.path.isdir(parent_directory):
+    os.makedirs(parent_directory)
+
+
+def ValidateOutputDir(output_dir):
+  """Makes sure output_dir points to a valid output directory.
+
+  The function aborts the program on failure.
+  """
+
+  VerifyOutputFile(output_dir, GTEST_H_OUTPUT)
+  VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT)
+
+
+def FuseGTestH(gtest_root, output_dir):
+  """Scans folder gtest_root to generate gtest/gtest.h in output_dir."""
+
+  output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
+  processed_files = sets.Set()  # Holds all gtest headers we've processed.
+
+  def ProcessFile(gtest_header_path):
+    """Processes the given gtest header file."""
+
+    # We don't process the same header twice.
+    if gtest_header_path in processed_files:
+      return
+
+    processed_files.add(gtest_header_path)
+
+    # Reads each line in the given gtest header.
+    for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
+      m = INCLUDE_GTEST_FILE_REGEX.match(line)
+      if m:
+        # It's '#include "gtest/..."' - let's process it recursively.
+        ProcessFile('include/' + m.group(1))
+      else:
+        # Otherwise we copy the line unchanged to the output file.
+        output_file.write(line)
+
+  ProcessFile(GTEST_H_SEED)
+  output_file.close()
+
+
+def FuseGTestAllCcToFile(gtest_root, output_file):
+  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_file."""
+
+  processed_files = sets.Set()
+
+  def ProcessFile(gtest_source_file):
+    """Processes the given gtest source file."""
+
+    # We don't process the same #included file twice.
+    if gtest_source_file in processed_files:
+      return
+
+    processed_files.add(gtest_source_file)
+
+    # Reads each line in the given gtest source file.
+    for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
+      m = INCLUDE_GTEST_FILE_REGEX.match(line)
+      if m:
+        if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
+          # It's '#include "gtest/gtest-spi.h"'.  This file is not
+          # #included by "gtest/gtest.h", so we need to process it.
+          ProcessFile(GTEST_SPI_H_SEED)
+        else:
+          # It's '#include "gtest/foo.h"' where foo is not gtest-spi.
+          # We treat it as '#include "gtest/gtest.h"', as all other
+          # gtest headers are being fused into gtest.h and cannot be
+          # #included directly.
+
+          # There is no need to #include "gtest/gtest.h" more than once.
+          if not GTEST_H_SEED in processed_files:
+            processed_files.add(GTEST_H_SEED)
+            output_file.write('#include "%s"\n' % (GTEST_H_OUTPUT,))
+      else:
+        m = INCLUDE_SRC_FILE_REGEX.match(line)
+        if m:
+          # It's '#include "src/foo"' - let's process it recursively.
+          ProcessFile(m.group(1))
+        else:
+          output_file.write(line)
+
+  ProcessFile(GTEST_ALL_CC_SEED)
+
+
+def FuseGTestAllCc(gtest_root, output_dir):
+  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""
+
+  output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
+  FuseGTestAllCcToFile(gtest_root, output_file)
+  output_file.close()
+
+
+def FuseGTest(gtest_root, output_dir):
+  """Fuses gtest.h and gtest-all.cc."""
+
+  ValidateGTestRootDir(gtest_root)
+  ValidateOutputDir(output_dir)
+
+  FuseGTestH(gtest_root, output_dir)
+  FuseGTestAllCc(gtest_root, output_dir)
+
+
+def main():
+  argc = len(sys.argv)
+  if argc == 2:
+    # fuse_gtest_files.py OUTPUT_DIR
+    FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1])
+  elif argc == 3:
+    # fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
+    FuseGTest(sys.argv[1], sys.argv[2])
+  else:
+    print __doc__
+    sys.exit(1)
+
+
+if __name__ == '__main__':
+  main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/scripts/gen_gtest_pred_impl.py b/ThirdParty/common/gtest/gtest-1.7.0/scripts/gen_gtest_pred_impl.py
new file mode 100755
index 0000000..3e7ab04
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/scripts/gen_gtest_pred_impl.py
@@ -0,0 +1,730 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""gen_gtest_pred_impl.py v0.1
+
+Generates the implementation of Google Test predicate assertions and
+accompanying tests.
+
+Usage:
+
+  gen_gtest_pred_impl.py MAX_ARITY
+
+where MAX_ARITY is a positive integer.
+
+The command generates the implementation of up-to MAX_ARITY-ary
+predicate assertions, and writes it to file gtest_pred_impl.h in the
+directory where the script is.  It also generates the accompanying
+unit test in file gtest_pred_impl_unittest.cc.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import sys
+import time
+
+# Where this script is.
+SCRIPT_DIR = os.path.dirname(sys.argv[0])
+
+# Where to store the generated header.
+HEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')
+
+# Where to store the generated unit test.
+UNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')
+
+
+def HeaderPreamble(n):
+  """Returns the preamble for the header file.
+
+  Args:
+    n:  the maximum arity of the predicate macros to be generated.
+  """
+
+  # A map that defines the values used in the preamble template.
+  DEFS = {
+    'today' : time.strftime('%m/%d/%Y'),
+    'year' : time.strftime('%Y'),
+    'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),
+    'n' : n
+    }
+
+  return (
+"""// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on %(today)s by command
+// '%(command)s'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most %(n)s.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \\
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \\
+    ; \\
+  else \\
+    on_failure(gtest_ar.failure_message())
+""" % DEFS)
+
+
+def Arity(n):
+  """Returns the English name of the given arity."""
+
+  if n < 0:
+    return None
+  elif n <= 3:
+    return ['nullary', 'unary', 'binary', 'ternary'][n]
+  else:
+    return '%s-ary' % n
+
+
+def Title(word):
+  """Returns the given word in title case.  The difference between
+  this and string's title() method is that Title('4-ary') is '4-ary'
+  while '4-ary'.title() is '4-Ary'."""
+
+  return word[0].upper() + word[1:]
+
+
+def OneTo(n):
+  """Returns the list [1, 2, 3, ..., n]."""
+
+  return range(1, n + 1)
+
+
+def Iter(n, format, sep=''):
+  """Given a positive integer n, a format string that contains 0 or
+  more '%s' format specs, and optionally a separator string, returns
+  the join of n strings, each formatted with the format string on an
+  iterator ranged from 1 to n.
+
+  Example:
+
+  Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.
+  """
+
+  # How many '%s' specs are in format?
+  spec_count = len(format.split('%s')) - 1
+  return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])
+
+
+def ImplementationForArity(n):
+  """Returns the implementation of n-ary predicate assertions."""
+
+  # A map the defines the values used in the implementation template.
+  DEFS = {
+    'n' : str(n),
+    'vs' : Iter(n, 'v%s', sep=', '),
+    'vts' : Iter(n, '#v%s', sep=', '),
+    'arity' : Arity(n),
+    'Arity' : Title(Arity(n))
+    }
+
+  impl = """
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
+// this in your code.
+template <typename Pred""" % DEFS
+
+  impl += Iter(n, """,
+          typename T%s""")
+
+  impl += """>
+AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
+
+  impl += Iter(n, """,
+                                  const char* e%s""")
+
+  impl += """,
+                                  Pred pred"""
+
+  impl += Iter(n, """,
+                                  const T%s& v%s""")
+
+  impl += """) {
+  if (pred(%(vs)s)) return AssertionSuccess();
+
+""" % DEFS
+
+  impl += '  return AssertionFailure() << pred_text << "("'
+
+  impl += Iter(n, """
+                            << e%s""", sep=' << ", "')
+
+  impl += ' << ") evaluates to false, where"'
+
+  impl += Iter(n, """
+                            << "\\n" << e%s << " evaluates to " << v%s""")
+
+  impl += """;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\
+  GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s), \\
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
+// this in your code.
+#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\
+  GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
+
+  impl += Iter(n, """, \\
+                                             #v%s""")
+
+  impl += """, \\
+                                             pred"""
+
+  impl += Iter(n, """, \\
+                                             v%s""")
+
+  impl += """), on_failure)
+
+// %(Arity)s predicate assertion macros.
+#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
+  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED%(n)s(pred, %(vs)s) \\
+  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
+  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED%(n)s(pred, %(vs)s) \\
+  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)
+
+""" % DEFS
+
+  return impl
+
+
+def HeaderPostamble():
+  """Returns the postamble for the header file."""
+
+  return """
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+"""
+
+
+def GenerateFile(path, content):
+  """Given a file path and a content string, overwrites it with the
+  given content."""
+
+  print 'Updating file %s . . .' % path
+
+  f = file(path, 'w+')
+  print >>f, content,
+  f.close()
+
+  print 'File %s has been updated.' % path
+
+
+def GenerateHeader(n):
+  """Given the maximum arity n, updates the header file that implements
+  the predicate assertions."""
+
+  GenerateFile(HEADER,
+               HeaderPreamble(n)
+               + ''.join([ImplementationForArity(i) for i in OneTo(n)])
+               + HeaderPostamble())
+
+
+def UnitTestPreamble():
+  """Returns the preamble for the unit test file."""
+
+  # A map that defines the values used in the preamble template.
+  DEFS = {
+    'today' : time.strftime('%m/%d/%Y'),
+    'year' : time.strftime('%Y'),
+    'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),
+    }
+
+  return (
+"""// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on %(today)s by command
+// '%(command)s'.  DO NOT EDIT BY HAND!
+
+// Regression test for gtest_pred_impl.h
+//
+// This file is generated by a script and quite long.  If you intend to
+// learn how Google Test works by reading its unit tests, read
+// gtest_unittest.cc instead.
+//
+// This is intended as a regression test for the Google Test predicate
+// assertions.  We compile it as part of the gtest_unittest target
+// only to keep the implementation tidy and compact, as it is quite
+// involved to set up the stage for testing Google Test using Google
+// Test itself.
+//
+// Currently, gtest_unittest takes ~11 seconds to run in the testing
+// daemon.  In the future, if it grows too large and needs much more
+// time to finish, we should consider separating this file into a
+// stand-alone regression test.
+
+#include <iostream>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// A user-defined data type.
+struct Bool {
+  explicit Bool(int val) : value(val != 0) {}
+
+  bool operator>(int n) const { return value > Bool(n).value; }
+
+  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
+
+  bool operator==(const Bool& rhs) const { return value == rhs.value; }
+
+  bool value;
+};
+
+// Enables Bool to be used in assertions.
+std::ostream& operator<<(std::ostream& os, const Bool& x) {
+  return os << (x.value ? "true" : "false");
+}
+
+""" % DEFS)
+
+
+def TestsForArity(n):
+  """Returns the tests for n-ary predicate assertions."""
+
+  # A map that defines the values used in the template for the tests.
+  DEFS = {
+    'n' : n,
+    'es' : Iter(n, 'e%s', sep=', '),
+    'vs' : Iter(n, 'v%s', sep=', '),
+    'vts' : Iter(n, '#v%s', sep=', '),
+    'tvs' : Iter(n, 'T%s v%s', sep=', '),
+    'int_vs' : Iter(n, 'int v%s', sep=', '),
+    'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),
+    'types' : Iter(n, 'typename T%s', sep=', '),
+    'v_sum' : Iter(n, 'v%s', sep=' + '),
+    'arity' : Arity(n),
+    'Arity' : Title(Arity(n)),
+    }
+
+  tests = (
+"""// Sample functions/functors for testing %(arity)s predicate assertions.
+
+// A %(arity)s predicate function.
+template <%(types)s>
+bool PredFunction%(n)s(%(tvs)s) {
+  return %(v_sum)s > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction%(n)sInt(%(int_vs)s) {
+  return %(v_sum)s > 0;
+}
+bool PredFunction%(n)sBool(%(Bool_vs)s) {
+  return %(v_sum)s > 0;
+}
+""" % DEFS)
+
+  tests += """
+// A %(arity)s predicate functor.
+struct PredFunctor%(n)s {
+  template <%(types)s>
+  bool operator()(""" % DEFS
+
+  tests += Iter(n, 'const T%s& v%s', sep=""",
+                  """)
+
+  tests += """) {
+    return %(v_sum)s > 0;
+  }
+};
+""" % DEFS
+
+  tests += """
+// A %(arity)s predicate-formatter function.
+template <%(types)s>
+testing::AssertionResult PredFormatFunction%(n)s(""" % DEFS
+
+  tests += Iter(n, 'const char* e%s', sep=""",
+                                             """)
+
+  tests += Iter(n, """,
+                                             const T%s& v%s""")
+
+  tests += """) {
+  if (PredFunction%(n)s(%(vs)s))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << """ % DEFS
+
+  tests += Iter(n, 'e%s', sep=' << " + " << ')
+
+  tests += """
+      << " is expected to be positive, but evaluates to "
+      << %(v_sum)s << ".";
+}
+""" % DEFS
+
+  tests += """
+// A %(arity)s predicate-formatter functor.
+struct PredFormatFunctor%(n)s {
+  template <%(types)s>
+  testing::AssertionResult operator()(""" % DEFS
+
+  tests += Iter(n, 'const char* e%s', sep=""",
+                                      """)
+
+  tests += Iter(n, """,
+                                      const T%s& v%s""")
+
+  tests += """) const {
+    return PredFormatFunction%(n)s(%(es)s, %(vs)s);
+  }
+};
+""" % DEFS
+
+  tests += """
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
+
+class Predicate%(n)sTest : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;""" % DEFS
+
+  tests += """
+    """ + Iter(n, 'n%s_ = ') + """0;
+  }
+"""
+
+  tests += """
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once."""
+
+  tests += ''.join(["""
+    EXPECT_EQ(1, n%s_) <<
+        "The predicate assertion didn't evaluate argument %s "
+        "exactly once.";""" % (i, i + 1) for i in OneTo(n)])
+
+  tests += """
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+""" % DEFS
+
+  tests += Iter(n, """
+  static int n%s_;""")
+
+  tests += """
+};
+
+bool Predicate%(n)sTest::expected_to_finish_;
+bool Predicate%(n)sTest::finished_;
+""" % DEFS
+
+  tests += Iter(n, """int Predicate%%(n)sTest::n%s_;
+""") % DEFS
+
+  tests += """
+typedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;
+typedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;
+typedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;
+typedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;
+""" % DEFS
+
+  def GenTest(use_format, use_assert, expect_failure,
+              use_functor, use_user_type):
+    """Returns the test for a predicate assertion macro.
+
+    Args:
+      use_format:     true iff the assertion is a *_PRED_FORMAT*.
+      use_assert:     true iff the assertion is a ASSERT_*.
+      expect_failure: true iff the assertion is expected to fail.
+      use_functor:    true iff the first argument of the assertion is
+                      a functor (as opposed to a function)
+      use_user_type:  true iff the predicate functor/function takes
+                      argument(s) of a user-defined type.
+
+    Example:
+
+      GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior
+      of a successful EXPECT_PRED_FORMATn() that takes a functor
+      whose arguments have built-in types."""
+
+    if use_assert:
+      assrt = 'ASSERT'  # 'assert' is reserved, so we cannot use
+                        # that identifier here.
+    else:
+      assrt = 'EXPECT'
+
+    assertion = assrt + '_PRED'
+
+    if use_format:
+      pred_format = 'PredFormat'
+      assertion += '_FORMAT'
+    else:
+      pred_format = 'Pred'
+
+    assertion += '%(n)s' % DEFS
+
+    if use_functor:
+      pred_format_type = 'functor'
+      pred_format += 'Functor%(n)s()'
+    else:
+      pred_format_type = 'function'
+      pred_format += 'Function%(n)s'
+      if not use_format:
+        if use_user_type:
+          pred_format += 'Bool'
+        else:
+          pred_format += 'Int'
+
+    test_name = pred_format_type.title()
+
+    if use_user_type:
+      arg_type = 'user-defined type (Bool)'
+      test_name += 'OnUserType'
+      if expect_failure:
+        arg = 'Bool(n%s_++)'
+      else:
+        arg = 'Bool(++n%s_)'
+    else:
+      arg_type = 'built-in type (int)'
+      test_name += 'OnBuiltInType'
+      if expect_failure:
+        arg = 'n%s_++'
+      else:
+        arg = '++n%s_'
+
+    if expect_failure:
+      successful_or_failed = 'failed'
+      expected_or_not = 'expected.'
+      test_name +=  'Failure'
+    else:
+      successful_or_failed = 'successful'
+      expected_or_not = 'UNEXPECTED!'
+      test_name +=  'Success'
+
+    # A map that defines the values used in the test template.
+    defs = DEFS.copy()
+    defs.update({
+      'assert' : assrt,
+      'assertion' : assertion,
+      'test_name' : test_name,
+      'pf_type' : pred_format_type,
+      'pf' : pred_format,
+      'arg_type' : arg_type,
+      'arg' : arg,
+      'successful' : successful_or_failed,
+      'expected' : expected_or_not,
+      })
+
+    test = """
+// Tests a %(successful)s %(assertion)s where the
+// predicate-formatter is a %(pf_type)s on a %(arg_type)s.
+TEST_F(%(assertion)sTest, %(test_name)s) {""" % defs
+
+    indent = (len(assertion) + 3)*' '
+    extra_indent = ''
+
+    if expect_failure:
+      extra_indent = '  '
+      if use_assert:
+        test += """
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT"""
+      else:
+        test += """
+  EXPECT_NONFATAL_FAILURE({  // NOLINT"""
+
+    test += '\n' + extra_indent + """  %(assertion)s(%(pf)s""" % defs
+
+    test = test % defs
+    test += Iter(n, ',\n' + indent + extra_indent + '%(arg)s' % defs)
+    test += ');\n' + extra_indent + '  finished_ = true;\n'
+
+    if expect_failure:
+      test += '  }, "");\n'
+
+    test += '}\n'
+    return test
+
+  # Generates tests for all 2**6 = 64 combinations.
+  tests += ''.join([GenTest(use_format, use_assert, expect_failure,
+                            use_functor, use_user_type)
+                    for use_format in [0, 1]
+                    for use_assert in [0, 1]
+                    for expect_failure in [0, 1]
+                    for use_functor in [0, 1]
+                    for use_user_type in [0, 1]
+                    ])
+
+  return tests
+
+
+def UnitTestPostamble():
+  """Returns the postamble for the tests."""
+
+  return ''
+
+
+def GenerateUnitTest(n):
+  """Returns the tests for up-to n-ary predicate assertions."""
+
+  GenerateFile(UNIT_TEST,
+               UnitTestPreamble()
+               + ''.join([TestsForArity(i) for i in OneTo(n)])
+               + UnitTestPostamble())
+
+
+def _Main():
+  """The entry point of the script.  Generates the header file and its
+  unit test."""
+
+  if len(sys.argv) != 2:
+    print __doc__
+    print 'Author: ' + __author__
+    sys.exit(1)
+
+  n = int(sys.argv[1])
+  GenerateHeader(n)
+  GenerateUnitTest(n)
+
+
+if __name__ == '__main__':
+  _Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/scripts/gtest-config.in b/ThirdParty/common/gtest/gtest-1.7.0/scripts/gtest-config.in
new file mode 100755
index 0000000..780f843
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/scripts/gtest-config.in
@@ -0,0 +1,274 @@
+#!/bin/sh
+
+# These variables are automatically filled in by the configure script.
+name="@PACKAGE_TARNAME@"
+version="@PACKAGE_VERSION@"
+
+show_usage()
+{
+  echo "Usage: gtest-config [OPTIONS...]"
+}
+
+show_help()
+{
+  show_usage
+  cat <<\EOF
+
+The `gtest-config' script provides access to the necessary compile and linking
+flags to connect with Google C++ Testing Framework, both in a build prior to
+installation, and on the system proper after installation. The installation
+overrides may be issued in combination with any other queries, but will only
+affect installation queries if called on a built but not installed gtest. The
+installation queries may not be issued with any other types of queries, and
+only one installation query may be made at a time. The version queries and
+compiler flag queries may be combined as desired but not mixed. Different
+version queries are always combined with logical "and" semantics, and only the
+last of any particular query is used while all previous ones ignored. All
+versions must be specified as a sequence of numbers separated by periods.
+Compiler flag queries output the union of the sets of flags when combined.
+
+ Examples:
+  gtest-config --min-version=1.0 || echo "Insufficient Google Test version."
+
+  g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp
+  g++ $(gtest-config --ldflags --libs) -o foo foo.o
+
+  # When using a built but not installed Google Test:
+  g++ $(../../my_gtest_build/scripts/gtest-config ...) ...
+
+  # When using an installed Google Test, but with installation overrides:
+  export GTEST_PREFIX="/opt"
+  g++ $(gtest-config --libdir="/opt/lib64" ...) ...
+
+ Help:
+  --usage                    brief usage information
+  --help                     display this help message
+
+ Installation Overrides:
+  --prefix=<dir>             overrides the installation prefix
+  --exec-prefix=<dir>        overrides the executable installation prefix
+  --libdir=<dir>             overrides the library installation prefix
+  --includedir=<dir>         overrides the header file installation prefix
+
+ Installation Queries:
+  --prefix                   installation prefix
+  --exec-prefix              executable installation prefix
+  --libdir                   library installation directory
+  --includedir               header file installation directory
+  --version                  the version of the Google Test installation
+
+ Version Queries:
+  --min-version=VERSION      return 0 if the version is at least VERSION
+  --exact-version=VERSION    return 0 if the version is exactly VERSION
+  --max-version=VERSION      return 0 if the version is at most VERSION
+
+ Compilation Flag Queries:
+  --cppflags                 compile flags specific to the C-like preprocessors
+  --cxxflags                 compile flags appropriate for C++ programs
+  --ldflags                  linker flags
+  --libs                     libraries for linking
+
+EOF
+}
+
+# This function bounds our version with a min and a max. It uses some clever
+# POSIX-compliant variable expansion to portably do all the work in the shell
+# and avoid any dependency on a particular "sed" or "awk" implementation.
+# Notable is that it will only ever compare the first 3 components of versions.
+# Further components will be cleanly stripped off. All versions must be
+# unadorned, so "v1.0" will *not* work. The minimum version must be in $1, and
+# the max in $2. TODO(chandlerc at google.com): If this ever breaks, we should
+# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than
+# continuing to maintain our own shell version.
+check_versions()
+{
+  major_version=${version%%.*}
+  minor_version="0"
+  point_version="0"
+  if test "${version#*.}" != "${version}"; then
+    minor_version=${version#*.}
+    minor_version=${minor_version%%.*}
+  fi
+  if test "${version#*.*.}" != "${version}"; then
+    point_version=${version#*.*.}
+    point_version=${point_version%%.*}
+  fi
+
+  min_version="$1"
+  min_major_version=${min_version%%.*}
+  min_minor_version="0"
+  min_point_version="0"
+  if test "${min_version#*.}" != "${min_version}"; then
+    min_minor_version=${min_version#*.}
+    min_minor_version=${min_minor_version%%.*}
+  fi
+  if test "${min_version#*.*.}" != "${min_version}"; then
+    min_point_version=${min_version#*.*.}
+    min_point_version=${min_point_version%%.*}
+  fi
+
+  max_version="$2"
+  max_major_version=${max_version%%.*}
+  max_minor_version="0"
+  max_point_version="0"
+  if test "${max_version#*.}" != "${max_version}"; then
+    max_minor_version=${max_version#*.}
+    max_minor_version=${max_minor_version%%.*}
+  fi
+  if test "${max_version#*.*.}" != "${max_version}"; then
+    max_point_version=${max_version#*.*.}
+    max_point_version=${max_point_version%%.*}
+  fi
+
+  test $(($major_version)) -lt $(($min_major_version)) && exit 1
+  if test $(($major_version)) -eq $(($min_major_version)); then
+    test $(($minor_version)) -lt $(($min_minor_version)) && exit 1
+    if test $(($minor_version)) -eq $(($min_minor_version)); then
+      test $(($point_version)) -lt $(($min_point_version)) && exit 1
+    fi
+  fi
+
+  test $(($major_version)) -gt $(($max_major_version)) && exit 1
+  if test $(($major_version)) -eq $(($max_major_version)); then
+    test $(($minor_version)) -gt $(($max_minor_version)) && exit 1
+    if test $(($minor_version)) -eq $(($max_minor_version)); then
+      test $(($point_version)) -gt $(($max_point_version)) && exit 1
+    fi
+  fi
+
+  exit 0
+}
+
+# Show the usage line when no arguments are specified.
+if test $# -eq 0; then
+  show_usage
+  exit 1
+fi
+
+while test $# -gt 0; do
+  case $1 in
+    --usage)          show_usage;         exit 0;;
+    --help)           show_help;          exit 0;;
+
+    # Installation overrides
+    --prefix=*)       GTEST_PREFIX=${1#--prefix=};;
+    --exec-prefix=*)  GTEST_EXEC_PREFIX=${1#--exec-prefix=};;
+    --libdir=*)       GTEST_LIBDIR=${1#--libdir=};;
+    --includedir=*)   GTEST_INCLUDEDIR=${1#--includedir=};;
+
+    # Installation queries
+    --prefix|--exec-prefix|--libdir|--includedir|--version)
+      if test -n "${do_query}"; then
+        show_usage
+        exit 1
+      fi
+      do_query=${1#--}
+      ;;
+
+    # Version checking
+    --min-version=*)
+      do_check_versions=yes
+      min_version=${1#--min-version=}
+      ;;
+    --max-version=*)
+      do_check_versions=yes
+      max_version=${1#--max-version=}
+      ;;
+    --exact-version=*)
+      do_check_versions=yes
+      exact_version=${1#--exact-version=}
+      ;;
+
+    # Compiler flag output
+    --cppflags)       echo_cppflags=yes;;
+    --cxxflags)       echo_cxxflags=yes;;
+    --ldflags)        echo_ldflags=yes;;
+    --libs)           echo_libs=yes;;
+
+    # Everything else is an error
+    *)                show_usage;         exit 1;;
+  esac
+  shift
+done
+
+# These have defaults filled in by the configure script but can also be
+# overridden by environment variables or command line parameters.
+prefix="${GTEST_PREFIX:- at prefix@}"
+exec_prefix="${GTEST_EXEC_PREFIX:- at exec_prefix@}"
+libdir="${GTEST_LIBDIR:- at libdir@}"
+includedir="${GTEST_INCLUDEDIR:- at includedir@}"
+
+# We try and detect if our binary is not located at its installed location. If
+# it's not, we provide variables pointing to the source and build tree rather
+# than to the install tree. This allows building against a just-built gtest
+# rather than an installed gtest.
+bindir="@bindir@"
+this_relative_bindir=`dirname $0`
+this_bindir=`cd ${this_relative_bindir}; pwd -P`
+if test "${this_bindir}" = "${this_bindir%${bindir}}"; then
+  # The path to the script doesn't end in the bindir sequence from Autoconf,
+  # assume that we are in a build tree.
+  build_dir=`dirname ${this_bindir}`
+  src_dir=`cd ${this_bindir}; cd @top_srcdir@; pwd -P`
+
+  # TODO(chandlerc at google.com): This is a dangerous dependency on libtool, we
+  # should work to remove it, and/or remove libtool altogether, replacing it
+  # with direct references to the library and a link path.
+  gtest_libs="${build_dir}/lib/libgtest.la @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
+  gtest_ldflags=""
+
+  # We provide hooks to include from either the source or build dir, where the
+  # build dir is always preferred. This will potentially allow us to write
+  # build rules for generated headers and have them automatically be preferred
+  # over provided versions.
+  gtest_cppflags="-I${build_dir}/include -I${src_dir}/include"
+  gtest_cxxflags="@PTHREAD_CFLAGS@"
+else
+  # We're using an installed gtest, although it may be staged under some
+  # prefix. Assume (as our own libraries do) that we can resolve the prefix,
+  # and are present in the dynamic link paths.
+  gtest_ldflags="-L${libdir}"
+  gtest_libs="-l${name} @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
+  gtest_cppflags="-I${includedir}"
+  gtest_cxxflags="@PTHREAD_CFLAGS@"
+fi
+
+# Do an installation query if requested.
+if test -n "$do_query"; then
+  case $do_query in
+    prefix)           echo $prefix;       exit 0;;
+    exec-prefix)      echo $exec_prefix;  exit 0;;
+    libdir)           echo $libdir;       exit 0;;
+    includedir)       echo $includedir;   exit 0;;
+    version)          echo $version;      exit 0;;
+    *)                show_usage;         exit 1;;
+  esac
+fi
+
+# Do a version check if requested.
+if test "$do_check_versions" = "yes"; then
+  # Make sure we didn't receive a bad combination of parameters.
+  test "$echo_cppflags" = "yes" && show_usage && exit 1
+  test "$echo_cxxflags" = "yes" && show_usage && exit 1
+  test "$echo_ldflags" = "yes"  && show_usage && exit 1
+  test "$echo_libs" = "yes"     && show_usage && exit 1
+
+  if test "$exact_version" != ""; then
+    check_versions $exact_version $exact_version
+    # unreachable
+  else
+    check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}
+    # unreachable
+  fi
+fi
+
+# Do the output in the correct order so that these can be used in-line of
+# a compiler invocation.
+output=""
+test "$echo_cppflags" = "yes" && output="$output $gtest_cppflags"
+test "$echo_cxxflags" = "yes" && output="$output $gtest_cxxflags"
+test "$echo_ldflags" = "yes"  && output="$output $gtest_ldflags"
+test "$echo_libs" = "yes"     && output="$output $gtest_libs"
+echo $output
+
+exit 0
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/scripts/pump.py b/ThirdParty/common/gtest/gtest-1.7.0/scripts/pump.py
new file mode 100755
index 0000000..5efb653
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/scripts/pump.py
@@ -0,0 +1,855 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""pump v0.2.0 - Pretty Useful for Meta Programming.
+
+A tool for preprocessor meta programming.  Useful for generating
+repetitive boilerplate code.  Especially useful for writing C++
+classes, functions, macros, and templates that need to work with
+various number of arguments.
+
+USAGE:
+       pump.py SOURCE_FILE
+
+EXAMPLES:
+       pump.py foo.cc.pump
+         Converts foo.cc.pump to foo.cc.
+
+GRAMMAR:
+       CODE ::= ATOMIC_CODE*
+       ATOMIC_CODE ::= $var ID = EXPRESSION
+           | $var ID = [[ CODE ]]
+           | $range ID EXPRESSION..EXPRESSION
+           | $for ID SEPARATOR [[ CODE ]]
+           | $($)
+           | $ID
+           | $(EXPRESSION)
+           | $if EXPRESSION [[ CODE ]] ELSE_BRANCH
+           | [[ CODE ]]
+           | RAW_CODE
+       SEPARATOR ::= RAW_CODE | EMPTY
+       ELSE_BRANCH ::= $else [[ CODE ]]
+           | $elif EXPRESSION [[ CODE ]] ELSE_BRANCH
+           | EMPTY
+       EXPRESSION has Python syntax.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sys
+
+
+TOKEN_TABLE = [
+    (re.compile(r'\$var\s+'), '$var'),
+    (re.compile(r'\$elif\s+'), '$elif'),
+    (re.compile(r'\$else\s+'), '$else'),
+    (re.compile(r'\$for\s+'), '$for'),
+    (re.compile(r'\$if\s+'), '$if'),
+    (re.compile(r'\$range\s+'), '$range'),
+    (re.compile(r'\$[_A-Za-z]\w*'), '$id'),
+    (re.compile(r'\$\(\$\)'), '$($)'),
+    (re.compile(r'\$'), '$'),
+    (re.compile(r'\[\[\n?'), '[['),
+    (re.compile(r'\]\]\n?'), ']]'),
+    ]
+
+
+class Cursor:
+  """Represents a position (line and column) in a text file."""
+
+  def __init__(self, line=-1, column=-1):
+    self.line = line
+    self.column = column
+
+  def __eq__(self, rhs):
+    return self.line == rhs.line and self.column == rhs.column
+
+  def __ne__(self, rhs):
+    return not self == rhs
+
+  def __lt__(self, rhs):
+    return self.line < rhs.line or (
+        self.line == rhs.line and self.column < rhs.column)
+
+  def __le__(self, rhs):
+    return self < rhs or self == rhs
+
+  def __gt__(self, rhs):
+    return rhs < self
+
+  def __ge__(self, rhs):
+    return rhs <= self
+
+  def __str__(self):
+    if self == Eof():
+      return 'EOF'
+    else:
+      return '%s(%s)' % (self.line + 1, self.column)
+
+  def __add__(self, offset):
+    return Cursor(self.line, self.column + offset)
+
+  def __sub__(self, offset):
+    return Cursor(self.line, self.column - offset)
+
+  def Clone(self):
+    """Returns a copy of self."""
+
+    return Cursor(self.line, self.column)
+
+
+# Special cursor to indicate the end-of-file.
+def Eof():
+  """Returns the special cursor to denote the end-of-file."""
+  return Cursor(-1, -1)
+
+
+class Token:
+  """Represents a token in a Pump source file."""
+
+  def __init__(self, start=None, end=None, value=None, token_type=None):
+    if start is None:
+      self.start = Eof()
+    else:
+      self.start = start
+    if end is None:
+      self.end = Eof()
+    else:
+      self.end = end
+    self.value = value
+    self.token_type = token_type
+
+  def __str__(self):
+    return 'Token @%s: \'%s\' type=%s' % (
+        self.start, self.value, self.token_type)
+
+  def Clone(self):
+    """Returns a copy of self."""
+
+    return Token(self.start.Clone(), self.end.Clone(), self.value,
+                 self.token_type)
+
+
+def StartsWith(lines, pos, string):
+  """Returns True iff the given position in lines starts with 'string'."""
+
+  return lines[pos.line][pos.column:].startswith(string)
+
+
+def FindFirstInLine(line, token_table):
+  best_match_start = -1
+  for (regex, token_type) in token_table:
+    m = regex.search(line)
+    if m:
+      # We found regex in lines
+      if best_match_start < 0 or m.start() < best_match_start:
+        best_match_start = m.start()
+        best_match_length = m.end() - m.start()
+        best_match_token_type = token_type
+
+  if best_match_start < 0:
+    return None
+
+  return (best_match_start, best_match_length, best_match_token_type)
+
+
+def FindFirst(lines, token_table, cursor):
+  """Finds the first occurrence of any string in strings in lines."""
+
+  start = cursor.Clone()
+  cur_line_number = cursor.line
+  for line in lines[start.line:]:
+    if cur_line_number == start.line:
+      line = line[start.column:]
+    m = FindFirstInLine(line, token_table)
+    if m:
+      # We found a regex in line.
+      (start_column, length, token_type) = m
+      if cur_line_number == start.line:
+        start_column += start.column
+      found_start = Cursor(cur_line_number, start_column)
+      found_end = found_start + length
+      return MakeToken(lines, found_start, found_end, token_type)
+    cur_line_number += 1
+  # We failed to find str in lines
+  return None
+
+
+def SubString(lines, start, end):
+  """Returns a substring in lines."""
+
+  if end == Eof():
+    end = Cursor(len(lines) - 1, len(lines[-1]))
+
+  if start >= end:
+    return ''
+
+  if start.line == end.line:
+    return lines[start.line][start.column:end.column]
+
+  result_lines = ([lines[start.line][start.column:]] +
+                  lines[start.line + 1:end.line] +
+                  [lines[end.line][:end.column]])
+  return ''.join(result_lines)
+
+
+def StripMetaComments(str):
+  """Strip meta comments from each line in the given string."""
+
+  # First, completely remove lines containing nothing but a meta
+  # comment, including the trailing \n.
+  str = re.sub(r'^\s*\$\$.*\n', '', str)
+
+  # Then, remove meta comments from contentful lines.
+  return re.sub(r'\s*\$\$.*', '', str)
+
+
+def MakeToken(lines, start, end, token_type):
+  """Creates a new instance of Token."""
+
+  return Token(start, end, SubString(lines, start, end), token_type)
+
+
+def ParseToken(lines, pos, regex, token_type):
+  line = lines[pos.line][pos.column:]
+  m = regex.search(line)
+  if m and not m.start():
+    return MakeToken(lines, pos, pos + m.end(), token_type)
+  else:
+    print 'ERROR: %s expected at %s.' % (token_type, pos)
+    sys.exit(1)
+
+
+ID_REGEX = re.compile(r'[_A-Za-z]\w*')
+EQ_REGEX = re.compile(r'=')
+REST_OF_LINE_REGEX = re.compile(r'.*?(?=$|\$\$)')
+OPTIONAL_WHITE_SPACES_REGEX = re.compile(r'\s*')
+WHITE_SPACE_REGEX = re.compile(r'\s')
+DOT_DOT_REGEX = re.compile(r'\.\.')
+
+
+def Skip(lines, pos, regex):
+  line = lines[pos.line][pos.column:]
+  m = re.search(regex, line)
+  if m and not m.start():
+    return pos + m.end()
+  else:
+    return pos
+
+
+def SkipUntil(lines, pos, regex, token_type):
+  line = lines[pos.line][pos.column:]
+  m = re.search(regex, line)
+  if m:
+    return pos + m.start()
+  else:
+    print ('ERROR: %s expected on line %s after column %s.' %
+           (token_type, pos.line + 1, pos.column))
+    sys.exit(1)
+
+
+def ParseExpTokenInParens(lines, pos):
+  def ParseInParens(pos):
+    pos = Skip(lines, pos, OPTIONAL_WHITE_SPACES_REGEX)
+    pos = Skip(lines, pos, r'\(')
+    pos = Parse(pos)
+    pos = Skip(lines, pos, r'\)')
+    return pos
+
+  def Parse(pos):
+    pos = SkipUntil(lines, pos, r'\(|\)', ')')
+    if SubString(lines, pos, pos + 1) == '(':
+      pos = Parse(pos + 1)
+      pos = Skip(lines, pos, r'\)')
+      return Parse(pos)
+    else:
+      return pos
+
+  start = pos.Clone()
+  pos = ParseInParens(pos)
+  return MakeToken(lines, start, pos, 'exp')
+
+
+def RStripNewLineFromToken(token):
+  if token.value.endswith('\n'):
+    return Token(token.start, token.end, token.value[:-1], token.token_type)
+  else:
+    return token
+
+
+def TokenizeLines(lines, pos):
+  while True:
+    found = FindFirst(lines, TOKEN_TABLE, pos)
+    if not found:
+      yield MakeToken(lines, pos, Eof(), 'code')
+      return
+
+    if found.start == pos:
+      prev_token = None
+      prev_token_rstripped = None
+    else:
+      prev_token = MakeToken(lines, pos, found.start, 'code')
+      prev_token_rstripped = RStripNewLineFromToken(prev_token)
+
+    if found.token_type == '$var':
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
+      yield id_token
+      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
+
+      eq_token = ParseToken(lines, pos, EQ_REGEX, '=')
+      yield eq_token
+      pos = Skip(lines, eq_token.end, r'\s*')
+
+      if SubString(lines, pos, pos + 2) != '[[':
+        exp_token = ParseToken(lines, pos, REST_OF_LINE_REGEX, 'exp')
+        yield exp_token
+        pos = Cursor(exp_token.end.line + 1, 0)
+    elif found.token_type == '$for':
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
+      yield id_token
+      pos = Skip(lines, id_token.end, WHITE_SPACE_REGEX)
+    elif found.token_type == '$range':
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
+      yield id_token
+      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
+
+      dots_pos = SkipUntil(lines, pos, DOT_DOT_REGEX, '..')
+      yield MakeToken(lines, pos, dots_pos, 'exp')
+      yield MakeToken(lines, dots_pos, dots_pos + 2, '..')
+      pos = dots_pos + 2
+      new_pos = Cursor(pos.line + 1, 0)
+      yield MakeToken(lines, pos, new_pos, 'exp')
+      pos = new_pos
+    elif found.token_type == '$':
+      if prev_token:
+        yield prev_token
+      yield found
+      exp_token = ParseExpTokenInParens(lines, found.end)
+      yield exp_token
+      pos = exp_token.end
+    elif (found.token_type == ']]' or found.token_type == '$if' or
+          found.token_type == '$elif' or found.token_type == '$else'):
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      pos = found.end
+    else:
+      if prev_token:
+        yield prev_token
+      yield found
+      pos = found.end
+
+
+def Tokenize(s):
+  """A generator that yields the tokens in the given string."""
+  if s != '':
+    lines = s.splitlines(True)
+    for token in TokenizeLines(lines, Cursor(0, 0)):
+      yield token
+
+
+class CodeNode:
+  def __init__(self, atomic_code_list=None):
+    self.atomic_code = atomic_code_list
+
+
+class VarNode:
+  def __init__(self, identifier=None, atomic_code=None):
+    self.identifier = identifier
+    self.atomic_code = atomic_code
+
+
+class RangeNode:
+  def __init__(self, identifier=None, exp1=None, exp2=None):
+    self.identifier = identifier
+    self.exp1 = exp1
+    self.exp2 = exp2
+
+
+class ForNode:
+  def __init__(self, identifier=None, sep=None, code=None):
+    self.identifier = identifier
+    self.sep = sep
+    self.code = code
+
+
+class ElseNode:
+  def __init__(self, else_branch=None):
+    self.else_branch = else_branch
+
+
+class IfNode:
+  def __init__(self, exp=None, then_branch=None, else_branch=None):
+    self.exp = exp
+    self.then_branch = then_branch
+    self.else_branch = else_branch
+
+
+class RawCodeNode:
+  def __init__(self, token=None):
+    self.raw_code = token
+
+
+class LiteralDollarNode:
+  def __init__(self, token):
+    self.token = token
+
+
+class ExpNode:
+  def __init__(self, token, python_exp):
+    self.token = token
+    self.python_exp = python_exp
+
+
+def PopFront(a_list):
+  head = a_list[0]
+  a_list[:1] = []
+  return head
+
+
+def PushFront(a_list, elem):
+  a_list[:0] = [elem]
+
+
+def PopToken(a_list, token_type=None):
+  token = PopFront(a_list)
+  if token_type is not None and token.token_type != token_type:
+    print 'ERROR: %s expected at %s' % (token_type, token.start)
+    print 'ERROR: %s found instead' % (token,)
+    sys.exit(1)
+
+  return token
+
+
+def PeekToken(a_list):
+  if not a_list:
+    return None
+
+  return a_list[0]
+
+
+def ParseExpNode(token):
+  python_exp = re.sub(r'([_A-Za-z]\w*)', r'self.GetValue("\1")', token.value)
+  return ExpNode(token, python_exp)
+
+
+def ParseElseNode(tokens):
+  def Pop(token_type=None):
+    return PopToken(tokens, token_type)
+
+  next = PeekToken(tokens)
+  if not next:
+    return None
+  if next.token_type == '$else':
+    Pop('$else')
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return code_node
+  elif next.token_type == '$elif':
+    Pop('$elif')
+    exp = Pop('code')
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    inner_else_node = ParseElseNode(tokens)
+    return CodeNode([IfNode(ParseExpNode(exp), code_node, inner_else_node)])
+  elif not next.value.strip():
+    Pop('code')
+    return ParseElseNode(tokens)
+  else:
+    return None
+
+
+def ParseAtomicCodeNode(tokens):
+  def Pop(token_type=None):
+    return PopToken(tokens, token_type)
+
+  head = PopFront(tokens)
+  t = head.token_type
+  if t == 'code':
+    return RawCodeNode(head)
+  elif t == '$var':
+    id_token = Pop('id')
+    Pop('=')
+    next = PeekToken(tokens)
+    if next.token_type == 'exp':
+      exp_token = Pop()
+      return VarNode(id_token, ParseExpNode(exp_token))
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return VarNode(id_token, code_node)
+  elif t == '$for':
+    id_token = Pop('id')
+    next_token = PeekToken(tokens)
+    if next_token.token_type == 'code':
+      sep_token = next_token
+      Pop('code')
+    else:
+      sep_token = None
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return ForNode(id_token, sep_token, code_node)
+  elif t == '$if':
+    exp_token = Pop('code')
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    else_node = ParseElseNode(tokens)
+    return IfNode(ParseExpNode(exp_token), code_node, else_node)
+  elif t == '$range':
+    id_token = Pop('id')
+    exp1_token = Pop('exp')
+    Pop('..')
+    exp2_token = Pop('exp')
+    return RangeNode(id_token, ParseExpNode(exp1_token),
+                     ParseExpNode(exp2_token))
+  elif t == '$id':
+    return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id'))
+  elif t == '$($)':
+    return LiteralDollarNode(head)
+  elif t == '$':
+    exp_token = Pop('exp')
+    return ParseExpNode(exp_token)
+  elif t == '[[':
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return code_node
+  else:
+    PushFront(tokens, head)
+    return None
+
+
+def ParseCodeNode(tokens):
+  atomic_code_list = []
+  while True:
+    if not tokens:
+      break
+    atomic_code_node = ParseAtomicCodeNode(tokens)
+    if atomic_code_node:
+      atomic_code_list.append(atomic_code_node)
+    else:
+      break
+  return CodeNode(atomic_code_list)
+
+
+def ParseToAST(pump_src_text):
+  """Convert the given Pump source text into an AST."""
+  tokens = list(Tokenize(pump_src_text))
+  code_node = ParseCodeNode(tokens)
+  return code_node
+
+
+class Env:
+  def __init__(self):
+    self.variables = []
+    self.ranges = []
+
+  def Clone(self):
+    clone = Env()
+    clone.variables = self.variables[:]
+    clone.ranges = self.ranges[:]
+    return clone
+
+  def PushVariable(self, var, value):
+    # If value looks like an int, store it as an int.
+    try:
+      int_value = int(value)
+      if ('%s' % int_value) == value:
+        value = int_value
+    except Exception:
+      pass
+    self.variables[:0] = [(var, value)]
+
+  def PopVariable(self):
+    self.variables[:1] = []
+
+  def PushRange(self, var, lower, upper):
+    self.ranges[:0] = [(var, lower, upper)]
+
+  def PopRange(self):
+    self.ranges[:1] = []
+
+  def GetValue(self, identifier):
+    for (var, value) in self.variables:
+      if identifier == var:
+        return value
+
+    print 'ERROR: meta variable %s is undefined.' % (identifier,)
+    sys.exit(1)
+
+  def EvalExp(self, exp):
+    try:
+      result = eval(exp.python_exp)
+    except Exception, e:
+      print 'ERROR: caught exception %s: %s' % (e.__class__.__name__, e)
+      print ('ERROR: failed to evaluate meta expression %s at %s' %
+             (exp.python_exp, exp.token.start))
+      sys.exit(1)
+    return result
+
+  def GetRange(self, identifier):
+    for (var, lower, upper) in self.ranges:
+      if identifier == var:
+        return (lower, upper)
+
+    print 'ERROR: range %s is undefined.' % (identifier,)
+    sys.exit(1)
+
+
+class Output:
+  def __init__(self):
+    self.string = ''
+
+  def GetLastLine(self):
+    index = self.string.rfind('\n')
+    if index < 0:
+      return ''
+
+    return self.string[index + 1:]
+
+  def Append(self, s):
+    self.string += s
+
+
+def RunAtomicCode(env, node, output):
+  if isinstance(node, VarNode):
+    identifier = node.identifier.value.strip()
+    result = Output()
+    RunAtomicCode(env.Clone(), node.atomic_code, result)
+    value = result.string
+    env.PushVariable(identifier, value)
+  elif isinstance(node, RangeNode):
+    identifier = node.identifier.value.strip()
+    lower = int(env.EvalExp(node.exp1))
+    upper = int(env.EvalExp(node.exp2))
+    env.PushRange(identifier, lower, upper)
+  elif isinstance(node, ForNode):
+    identifier = node.identifier.value.strip()
+    if node.sep is None:
+      sep = ''
+    else:
+      sep = node.sep.value
+    (lower, upper) = env.GetRange(identifier)
+    for i in range(lower, upper + 1):
+      new_env = env.Clone()
+      new_env.PushVariable(identifier, i)
+      RunCode(new_env, node.code, output)
+      if i != upper:
+        output.Append(sep)
+  elif isinstance(node, RawCodeNode):
+    output.Append(node.raw_code.value)
+  elif isinstance(node, IfNode):
+    cond = env.EvalExp(node.exp)
+    if cond:
+      RunCode(env.Clone(), node.then_branch, output)
+    elif node.else_branch is not None:
+      RunCode(env.Clone(), node.else_branch, output)
+  elif isinstance(node, ExpNode):
+    value = env.EvalExp(node)
+    output.Append('%s' % (value,))
+  elif isinstance(node, LiteralDollarNode):
+    output.Append('$')
+  elif isinstance(node, CodeNode):
+    RunCode(env.Clone(), node, output)
+  else:
+    print 'BAD'
+    print node
+    sys.exit(1)
+
+
+def RunCode(env, code_node, output):
+  for atomic_code in code_node.atomic_code:
+    RunAtomicCode(env, atomic_code, output)
+
+
+def IsSingleLineComment(cur_line):
+  return '//' in cur_line
+
+
+def IsInPreprocessorDirective(prev_lines, cur_line):
+  if cur_line.lstrip().startswith('#'):
+    return True
+  return prev_lines and prev_lines[-1].endswith('\\')
+
+
+def WrapComment(line, output):
+  loc = line.find('//')
+  before_comment = line[:loc].rstrip()
+  if before_comment == '':
+    indent = loc
+  else:
+    output.append(before_comment)
+    indent = len(before_comment) - len(before_comment.lstrip())
+  prefix = indent*' ' + '// '
+  max_len = 80 - len(prefix)
+  comment = line[loc + 2:].strip()
+  segs = [seg for seg in re.split(r'(\w+\W*)', comment) if seg != '']
+  cur_line = ''
+  for seg in segs:
+    if len((cur_line + seg).rstrip()) < max_len:
+      cur_line += seg
+    else:
+      if cur_line.strip() != '':
+        output.append(prefix + cur_line.rstrip())
+      cur_line = seg.lstrip()
+  if cur_line.strip() != '':
+    output.append(prefix + cur_line.strip())
+
+
+def WrapCode(line, line_concat, output):
+  indent = len(line) - len(line.lstrip())
+  prefix = indent*' '  # Prefix of the current line
+  max_len = 80 - indent - len(line_concat)  # Maximum length of the current line
+  new_prefix = prefix + 4*' '  # Prefix of a continuation line
+  new_max_len = max_len - 4  # Maximum length of a continuation line
+  # Prefers to wrap a line after a ',' or ';'.
+  segs = [seg for seg in re.split(r'([^,;]+[,;]?)', line.strip()) if seg != '']
+  cur_line = ''  # The current line without leading spaces.
+  for seg in segs:
+    # If the line is still too long, wrap at a space.
+    while cur_line == '' and len(seg.strip()) > max_len:
+      seg = seg.lstrip()
+      split_at = seg.rfind(' ', 0, max_len)
+      output.append(prefix + seg[:split_at].strip() + line_concat)
+      seg = seg[split_at + 1:]
+      prefix = new_prefix
+      max_len = new_max_len
+
+    if len((cur_line + seg).rstrip()) < max_len:
+      cur_line = (cur_line + seg).lstrip()
+    else:
+      output.append(prefix + cur_line.rstrip() + line_concat)
+      prefix = new_prefix
+      max_len = new_max_len
+      cur_line = seg.lstrip()
+  if cur_line.strip() != '':
+    output.append(prefix + cur_line.strip())
+
+
+def WrapPreprocessorDirective(line, output):
+  WrapCode(line, ' \\', output)
+
+
+def WrapPlainCode(line, output):
+  WrapCode(line, '', output)
+
+
+def IsMultiLineIWYUPragma(line):
+  return re.search(r'/\* IWYU pragma: ', line)
+
+
+def IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
+  return (re.match(r'^#(ifndef|define|endif\s*//)\s*[\w_]+\s*$', line) or
+          re.match(r'^#include\s', line) or
+          # Don't break IWYU pragmas, either; that causes iwyu.py problems.
+          re.search(r'// IWYU pragma: ', line))
+
+
+def WrapLongLine(line, output):
+  line = line.rstrip()
+  if len(line) <= 80:
+    output.append(line)
+  elif IsSingleLineComment(line):
+    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
+      # The style guide made an exception to allow long header guard lines,
+      # includes and IWYU pragmas.
+      output.append(line)
+    else:
+      WrapComment(line, output)
+  elif IsInPreprocessorDirective(output, line):
+    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
+      # The style guide made an exception to allow long header guard lines,
+      # includes and IWYU pragmas.
+      output.append(line)
+    else:
+      WrapPreprocessorDirective(line, output)
+  elif IsMultiLineIWYUPragma(line):
+    output.append(line)
+  else:
+    WrapPlainCode(line, output)
+
+
+def BeautifyCode(string):
+  lines = string.splitlines()
+  output = []
+  for line in lines:
+    WrapLongLine(line, output)
+  output2 = [line.rstrip() for line in output]
+  return '\n'.join(output2) + '\n'
+
+
+def ConvertFromPumpSource(src_text):
+  """Return the text generated from the given Pump source text."""
+  ast = ParseToAST(StripMetaComments(src_text))
+  output = Output()
+  RunCode(Env(), ast, output)
+  return BeautifyCode(output.string)
+
+
+def main(argv):
+  if len(argv) == 1:
+    print __doc__
+    sys.exit(1)
+
+  file_path = argv[-1]
+  output_str = ConvertFromPumpSource(file(file_path, 'r').read())
+  if file_path.endswith('.pump'):
+    output_file_path = file_path[:-5]
+  else:
+    output_file_path = '-'
+  if output_file_path == '-':
+    print output_str,
+  else:
+    output_file = file(output_file_path, 'w')
+    output_file.write('// This file was GENERATED by command:\n')
+    output_file.write('//     %s %s\n' %
+                      (os.path.basename(__file__), os.path.basename(file_path)))
+    output_file.write('// DO NOT EDIT BY HAND!!!\n\n')
+    output_file.write(output_str)
+    output_file.close()
+
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/scripts/test/Makefile b/ThirdParty/common/gtest/gtest-1.7.0/scripts/test/Makefile
new file mode 100644
index 0000000..cdff584
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/scripts/test/Makefile
@@ -0,0 +1,59 @@
+# A Makefile for fusing Google Test and building a sample test against it.
+#
+# SYNOPSIS:
+#
+#   make [all]  - makes everything.
+#   make TARGET - makes the given target.
+#   make check  - makes everything and runs the built sample test.
+#   make clean  - removes all files generated by make.
+
+# Points to the root of fused Google Test, relative to where this file is.
+FUSED_GTEST_DIR = output
+
+# Paths to the fused gtest files.
+FUSED_GTEST_H = $(FUSED_GTEST_DIR)/gtest/gtest.h
+FUSED_GTEST_ALL_CC = $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
+
+# Where to find the sample test.
+SAMPLE_DIR = ../../samples
+
+# Where to find gtest_main.cc.
+GTEST_MAIN_CC = ../../src/gtest_main.cc
+
+# Flags passed to the preprocessor.
+# We have no idea here whether pthreads is available in the system, so
+# disable its use.
+CPPFLAGS += -I$(FUSED_GTEST_DIR) -DGTEST_HAS_PTHREAD=0
+
+# Flags passed to the C++ compiler.
+CXXFLAGS += -g
+
+all : sample1_unittest
+
+check : all
+	./sample1_unittest
+
+clean :
+	rm -rf $(FUSED_GTEST_DIR) sample1_unittest *.o
+
+$(FUSED_GTEST_H) :
+	../fuse_gtest_files.py $(FUSED_GTEST_DIR)
+
+$(FUSED_GTEST_ALL_CC) :
+	../fuse_gtest_files.py $(FUSED_GTEST_DIR)
+
+gtest-all.o : $(FUSED_GTEST_H) $(FUSED_GTEST_ALL_CC)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
+
+gtest_main.o : $(FUSED_GTEST_H) $(GTEST_MAIN_CC)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_MAIN_CC)
+
+sample1.o : $(SAMPLE_DIR)/sample1.cc $(SAMPLE_DIR)/sample1.h
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1.cc
+
+sample1_unittest.o : $(SAMPLE_DIR)/sample1_unittest.cc \
+                     $(SAMPLE_DIR)/sample1.h $(FUSED_GTEST_H)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1_unittest.cc
+
+sample1_unittest : sample1.o sample1_unittest.o gtest-all.o gtest_main.o
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-all.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-all.cc
new file mode 100644
index 0000000..0a9cee5
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-all.cc
@@ -0,0 +1,48 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build Google Test by compiling a single file.
+// This file serves this purpose.
+
+// This line ensures that gtest.h can be compiled on its own, even
+// when it's fused.
+#include "gtest/gtest.h"
+
+// The following lines pull in the real gtest *.cc files.
+#include "src/gtest.cc"
+#include "src/gtest-death-test.cc"
+#include "src/gtest-filepath.cc"
+#include "src/gtest-port.cc"
+#include "src/gtest-printers.cc"
+#include "src/gtest-test-part.cc"
+#include "src/gtest-typed-test.cc"
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-death-test.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-death-test.cc
new file mode 100644
index 0000000..a6023fc
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-death-test.cc
@@ -0,0 +1,1344 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+#  include <crt_externs.h>
+# endif  // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+#  include <windows.h>
+# else
+#  include <sys/mman.h>
+#  include <sys/wait.h>
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-string.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+    death_test_style,
+    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+    "Indicates how to run a death test in a forked child process: "
+    "\"threadsafe\" (child process re-executes the test binary "
+    "from the beginning, running only the specific death test) or "
+    "\"fast\" (child process runs the death test immediately "
+    "after forking).");
+
+GTEST_DEFINE_bool_(
+    death_test_use_fork,
+    internal::BoolFromGTestEnv("death_test_use_fork", false),
+    "Instructs to use fork()/_exit() instead of clone() in death tests. "
+    "Ignored and always uses fork() on POSIX systems where clone() is not "
+    "implemented. Useful when running under valgrind or similar tools if "
+    "those do not support clone(). Valgrind 3.3.1 will just fail if "
+    "it sees an unsupported combination of clone() flags. "
+    "It is not recommended to use this flag w/o valgrind though it will "
+    "work in 99% of the cases. Once valgrind is fixed, this flag will "
+    "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+    internal_run_death_test, "",
+    "Indicates the file, line number, temporal index of "
+    "the single death test to run, and a file descriptor to "
+    "which a success code may be sent, all separated by "
+    "the '|' characters.  This flag is specified if and only if the current "
+    "process is a sub-process launched for running a thread-safe "
+    "death test.  FOR INTERNAL USE ONLY.");
+}  // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+  return exit_status == exit_code_;
+
+# else
+
+  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif  // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif  // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+  Message m;
+
+# if GTEST_OS_WINDOWS
+
+  m << "Exited with exit status " << exit_code;
+
+# else
+
+  if (WIFEXITED(exit_code)) {
+    m << "Exited with exit status " << WEXITSTATUS(exit_code);
+  } else if (WIFSIGNALED(exit_code)) {
+    m << "Terminated by signal " << WTERMSIG(exit_code);
+  }
+#  ifdef WCOREDUMP
+  if (WCOREDUMP(exit_code)) {
+    m << " (core dumped)";
+  }
+#  endif
+# endif  // GTEST_OS_WINDOWS
+
+  return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+  return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement.  It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+  Message msg;
+  msg << "Death tests use fork(), which is unsafe particularly"
+      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+  if (thread_count == 0)
+    msg << "couldn't detect the number of threads.";
+  else
+    msg << "detected " << thread_count << " threads.";
+  return msg.GetString();
+}
+# endif  // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude.  DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception.  IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process.  Otherwise, the
+// message is simply printed to stderr.  In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+  // On a POSIX system, this function may be called from a threadsafe-style
+  // death test child process, which operates on a very small stack.  Use
+  // the heap for any additional non-minuscule memory requirements.
+  const InternalRunDeathTestFlag* const flag =
+      GetUnitTestImpl()->internal_run_death_test_flag();
+  if (flag != NULL) {
+    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+    fputc(kDeathTestInternalError, parent);
+    fprintf(parent, "%s", message.c_str());
+    fflush(parent);
+    _exit(1);
+  } else {
+    fprintf(stderr, "%s", message.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+  do { \
+    if (!::testing::internal::IsTrue(expression)) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again.  The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR.  If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+  do { \
+    int gtest_retval; \
+    do { \
+      gtest_retval = (expression); \
+    } while (gtest_retval == -1 && errno == EINTR); \
+    if (gtest_retval == -1) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+  Message error;
+  char buffer[256];
+  int num_read;
+
+  do {
+    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+      buffer[num_read] = '\0';
+      error << buffer;
+    }
+  } while (num_read == -1 && errno == EINTR);
+
+  if (num_read == 0) {
+    GTEST_LOG_(FATAL) << error.GetString();
+  } else {
+    const int last_error = errno;
+    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+                      << GetLastErrnoDescription() << " [" << last_error << "]";
+  }
+}
+
+// Death test constructor.  Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+  TestInfo* const info = GetUnitTestImpl()->current_test_info();
+  if (info == NULL) {
+    DeathTestAbort("Cannot run a death test outside of a TEST or "
+                   "TEST_F construct");
+  }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+                       const char* file, int line, DeathTest** test) {
+  return GetUnitTestImpl()->death_test_factory()->Create(
+      statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+  return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+  last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+  DeathTestImpl(const char* a_statement, const RE* a_regex)
+      : statement_(a_statement),
+        regex_(a_regex),
+        spawned_(false),
+        status_(-1),
+        outcome_(IN_PROGRESS),
+        read_fd_(-1),
+        write_fd_(-1) {}
+
+  // read_fd_ is expected to be closed and cleared by a derived class.
+  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+  void Abort(AbortReason reason);
+  virtual bool Passed(bool status_ok);
+
+  const char* statement() const { return statement_; }
+  const RE* regex() const { return regex_; }
+  bool spawned() const { return spawned_; }
+  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+  int status() const { return status_; }
+  void set_status(int a_status) { status_ = a_status; }
+  DeathTestOutcome outcome() const { return outcome_; }
+  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+  int read_fd() const { return read_fd_; }
+  void set_read_fd(int fd) { read_fd_ = fd; }
+  int write_fd() const { return write_fd_; }
+  void set_write_fd(int fd) { write_fd_ = fd; }
+
+  // Called in the parent process only. Reads the result code of the death
+  // test child process via a pipe, interprets it to set the outcome_
+  // member, and closes read_fd_.  Outputs diagnostics and terminates in
+  // case of unexpected codes.
+  void ReadAndInterpretStatusByte();
+
+ private:
+  // The textual content of the code this object is testing.  This class
+  // doesn't own this string and should not attempt to delete it.
+  const char* const statement_;
+  // The regular expression which test output must match.  DeathTestImpl
+  // doesn't own this object and should not attempt to delete it.
+  const RE* const regex_;
+  // True if the death test child process has been successfully spawned.
+  bool spawned_;
+  // The exit status of the child process.
+  int status_;
+  // How the death test concluded.
+  DeathTestOutcome outcome_;
+  // Descriptor to the read end of the pipe to the child process.  It is
+  // always -1 in the child process.  The child keeps its write end of the
+  // pipe in write_fd_.
+  int read_fd_;
+  // Descriptor to the child's write end of the pipe to the parent process.
+  // It is always -1 in the parent process.  The parent keeps its end of the
+  // pipe in read_fd_.
+  int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_.  Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+  char flag;
+  int bytes_read;
+
+  // The read() here blocks until data is available (signifying the
+  // failure of the death test) or until the pipe is closed (signifying
+  // its success), so it's okay to call this in the parent before
+  // the child process has exited.
+  do {
+    bytes_read = posix::Read(read_fd(), &flag, 1);
+  } while (bytes_read == -1 && errno == EINTR);
+
+  if (bytes_read == 0) {
+    set_outcome(DIED);
+  } else if (bytes_read == 1) {
+    switch (flag) {
+      case kDeathTestReturned:
+        set_outcome(RETURNED);
+        break;
+      case kDeathTestThrew:
+        set_outcome(THREW);
+        break;
+      case kDeathTestLived:
+        set_outcome(LIVED);
+        break;
+      case kDeathTestInternalError:
+        FailFromInternalError(read_fd());  // Does not return.
+        break;
+      default:
+        GTEST_LOG_(FATAL) << "Death test child process reported "
+                          << "unexpected status byte ("
+                          << static_cast<unsigned int>(flag) << ")";
+    }
+  } else {
+    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+                      << GetLastErrnoDescription();
+  }
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+  set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+  // The parent process considers the death test to be a failure if
+  // it finds any data in our pipe.  So, here we write a single flag byte
+  // to the pipe, then exit.
+  const char status_ch =
+      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+  // We are leaking the descriptor here because on some platforms (i.e.,
+  // when built as Windows DLL), destructors of global objects will still
+  // run after calling _exit(). On such systems, write_fd_ will be
+  // indirectly closed from the destructor of UnitTestImpl, causing double
+  // close if it is also closed here. On debug configurations, double close
+  // may assert. As there are no in-process buffers to flush here, we are
+  // relying on the OS to close the descriptor after the process terminates
+  // when the destructors are not run.
+  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+  ::std::string ret;
+  for (size_t at = 0; ; ) {
+    const size_t line_end = output.find('\n', at);
+    ret += "[  DEATH   ] ";
+    if (line_end == ::std::string::npos) {
+      ret += output.substr(at);
+      break;
+    }
+    ret += output.substr(at, line_end + 1 - at);
+    at = line_end + 1;
+  }
+  return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+//   outcome:  An enumeration describing how the death test
+//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
+//             fails in the latter three cases.
+//   status:   The exit status of the child process. On *nix, it is in the
+//             in the format specified by wait(2). On Windows, this is the
+//             value supplied to the ExitProcess() API or a numeric code
+//             of the exception that terminated the program.
+//   regex:    A regular expression object to be applied to
+//             the test's captured standard error output; the death test
+//             fails if it does not match.
+//
+// Argument:
+//   status_ok: true if exit_status is acceptable in the context of
+//              this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met.  Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+  if (!spawned())
+    return false;
+
+  const std::string error_message = GetCapturedStderr();
+
+  bool success = false;
+  Message buffer;
+
+  buffer << "Death test: " << statement() << "\n";
+  switch (outcome()) {
+    case LIVED:
+      buffer << "    Result: failed to die.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case THREW:
+      buffer << "    Result: threw an exception.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case RETURNED:
+      buffer << "    Result: illegal return in test statement.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case DIED:
+      if (status_ok) {
+        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+        if (matched) {
+          success = true;
+        } else {
+          buffer << "    Result: died but not with expected error.\n"
+                 << "  Expected: " << regex()->pattern() << "\n"
+                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+        }
+      } else {
+        buffer << "    Result: died but not with expected exit code:\n"
+               << "            " << ExitSummary(status()) << "\n"
+               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+      }
+      break;
+    case IN_PROGRESS:
+    default:
+      GTEST_LOG_(FATAL)
+          << "DeathTest::Passed somehow called before conclusion of test";
+  }
+
+  DeathTest::set_last_death_test_message(buffer.GetString());
+  return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes:  Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+//    ends of it.
+// 2. The parent starts the child and provides it with the information
+//    necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+//    using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+//    this is done before step 3, the object's reference count goes down to
+//    0 and it is destroyed, preventing the child from acquiring it. The
+//    parent now has to release it, or read operations on the read end of
+//    the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+//    any possible error messages) from the pipe, and its stderr and then
+//    determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+  WindowsDeathTest(const char* a_statement,
+                   const RE* a_regex,
+                   const char* file,
+                   int line)
+      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+  virtual TestRole AssumeRole();
+
+ private:
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+  // Handle to the write end of the pipe to the child process.
+  AutoHandle write_handle_;
+  // Child process handle.
+  AutoHandle child_handle_;
+  // Event the child process uses to signal the parent that it has
+  // acquired the handle to the write end of the pipe. After seeing this
+  // event the parent can release its own handles to make sure its
+  // ReadFile() calls return when the child terminates.
+  AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  // Wait until the child either signals that it has acquired the write end
+  // of the pipe or it dies.
+  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+  switch (::WaitForMultipleObjects(2,
+                                   wait_handles,
+                                   FALSE,  // Waits for any of the handles.
+                                   INFINITE)) {
+    case WAIT_OBJECT_0:
+    case WAIT_OBJECT_0 + 1:
+      break;
+    default:
+      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
+  }
+
+  // The child has acquired the write end of the pipe or exited.
+  // We release the handle on our side and continue.
+  write_handle_.Reset();
+  event_handle_.Reset();
+
+  ReadAndInterpretStatusByte();
+
+  // Waits for the child process to exit if it haven't already. This
+  // returns immediately if the child has already exited, regardless of
+  // whether previous calls to WaitForMultipleObjects synchronized on this
+  // handle or not.
+  GTEST_DEATH_TEST_CHECK_(
+      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+                                             INFINITE));
+  DWORD status_code;
+  GTEST_DEATH_TEST_CHECK_(
+      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+  child_handle_.Reset();
+  set_status(static_cast<int>(status_code));
+  return status();
+}
+
+// The AssumeRole process for a Windows death test.  It creates a child
+// process with the same executable as the current process to run the
+// death test.  The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    // ParseInternalRunDeathTestFlag() has performed all the necessary
+    // processing.
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  // WindowsDeathTest uses an anonymous pipe to communicate results of
+  // a death test.
+  SECURITY_ATTRIBUTES handles_are_inheritable = {
+    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+  HANDLE read_handle, write_handle;
+  GTEST_DEATH_TEST_CHECK_(
+      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+                   0)  // Default buffer size.
+      != FALSE);
+  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+                                O_RDONLY));
+  write_handle_.Reset(write_handle);
+  event_handle_.Reset(::CreateEvent(
+      &handles_are_inheritable,
+      TRUE,    // The event will automatically reset to non-signaled state.
+      FALSE,   // The initial state is non-signalled.
+      NULL));  // The even is unnamed.
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
+      // Windows platforms.
+      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+  char executable_path[_MAX_PATH + 1];  // NOLINT
+  GTEST_DEATH_TEST_CHECK_(
+      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+                                            executable_path,
+                                            _MAX_PATH));
+
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // Flush the log buffers since the log streams are shared with the child.
+  FlushInfoLog();
+
+  // The child process will share the standard handles with the parent.
+  STARTUPINFOA startup_info;
+  memset(&startup_info, 0, sizeof(STARTUPINFO));
+  startup_info.dwFlags = STARTF_USESTDHANDLES;
+  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+  PROCESS_INFORMATION process_info;
+  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+      executable_path,
+      const_cast<char*>(command_line.c_str()),
+      NULL,   // Retuned process handle is not inheritable.
+      NULL,   // Retuned thread handle is not inheritable.
+      TRUE,   // Child inherits all inheritable handles (for write_handle_).
+      0x0,    // Default creation flags.
+      NULL,   // Inherit the parent's environment.
+      UnitTest::GetInstance()->original_working_dir(),
+      &startup_info,
+      &process_info) != FALSE);
+  child_handle_.Reset(process_info.hProcess);
+  ::CloseHandle(process_info.hThread);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+# else  // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface.  Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+  ForkingDeathTest(const char* statement, const RE* regex);
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+
+ protected:
+  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+  // PID of child process during death test; 0 in the child process itself.
+  pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+    : DeathTestImpl(a_statement, a_regex),
+      child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  ReadAndInterpretStatusByte();
+
+  int status_value;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+  set_status(status_value);
+  return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+      ForkingDeathTest(a_statement, a_regex) { }
+  virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test.  It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+  const size_t thread_count = GetThreadCount();
+  if (thread_count != 1) {
+    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+  DeathTest::set_last_death_test_message("");
+  CaptureStderr();
+  // When we fork the process below, the log file buffers are copied, but the
+  // file descriptors are shared.  We flush all log files here so that closing
+  // the file descriptors in the child process doesn't throw off the
+  // synchronization between descriptors and buffers in the parent process.
+  // This is as close to the fork as possible to avoid a race condition in case
+  // there are multiple threads running before the death test, and another
+  // thread writes to the log file.
+  FlushInfoLog();
+
+  const pid_t child_pid = fork();
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  set_child_pid(child_pid);
+  if (child_pid == 0) {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+    set_write_fd(pipe_fd[1]);
+    // Redirects all logging to stderr in the child process to prevent
+    // concurrent writes to the log files.  We capture stderr in the parent
+    // process and append the child process' output to a log.
+    LogToStderr();
+    // Event forwarding to the listeners of event listener API mush be shut
+    // down in death test subprocesses.
+    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
+    return EXECUTE_TEST;
+  } else {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+    set_read_fd(pipe_fd[0]);
+    set_spawned(true);
+    return OVERSEE_TEST;
+  }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+  ExecDeathTest(const char* a_statement, const RE* a_regex,
+                const char* file, int line) :
+      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+  virtual TestRole AssumeRole();
+ private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+  Arguments() {
+    args_.push_back(NULL);
+  }
+
+  ~Arguments() {
+    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+         ++i) {
+      free(*i);
+    }
+  }
+  void AddArgument(const char* argument) {
+    args_.insert(args_.end() - 1, posix::StrDup(argument));
+  }
+
+  template <typename Str>
+  void AddArguments(const ::std::vector<Str>& arguments) {
+    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+         i != arguments.end();
+         ++i) {
+      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+    }
+  }
+  char* const* Argv() {
+    return &args_[0];
+  }
+
+ private:
+  std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+  char* const* argv;  // Command-line arguments for the child's call to exec
+  int close_fd;       // File descriptor to close; the read end of a pipe
+};
+
+#  if GTEST_OS_MAC
+inline char** GetEnviron() {
+  // When Google Test is built as a framework on MacOS X, the environ variable
+  // is unavailable. Apple's documentation (man environ) recommends using
+  // _NSGetEnviron() instead.
+  return *_NSGetEnviron();
+}
+#  else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+#  endif  // GTEST_OS_MAC
+
+#  if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  // We can safely call execve() as it's a direct system call.  We
+  // cannot use execvp() as it's a libc function and thus potentially
+  // unsafe.  Since execve() doesn't search the PATH, the user must
+  // invoke the test program via a valid path that contains at least
+  // one path separator.
+  execve(args->argv[0], args->argv, GetEnviron());
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
+  return EXIT_FAILURE;
+}
+#  endif  // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+  int dummy;
+  *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+  int dummy;
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+  ExecDeathTestArgs args = { argv, close_fd };
+  pid_t child_pid = -1;
+
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
+  const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+  if (!use_fork) {
+    static const bool stack_grows_down = StackGrowsDown();
+    const size_t stack_size = getpagesize();
+    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+                             MAP_ANON | MAP_PRIVATE, -1, 0);
+    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
+    void* const stack_top =
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+  }
+#   else
+  const bool use_fork = true;
+#   endif  // GTEST_HAS_CLONE
+
+  if (use_fork && (child_pid = fork()) == 0) {
+      ExecDeathTestChildMain(&args);
+      _exit(0);
+  }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
+
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test.  It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+  // Clear the close-on-exec flag on the write end of the pipe, lest
+  // it be closed when the child process does an exec:
+  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
+  Arguments args;
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
+  args.AddArgument(filter_flag.c_str());
+  args.AddArgument(internal_flag.c_str());
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // See the comment in NoExecDeathTest::AssumeRole for why the next line
+  // is necessary.
+  FlushInfoLog();
+
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+  set_child_pid(child_pid);
+  set_read_fd(pipe_fd[0]);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+
+# endif  // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address.  If the test should be
+// skipped, sets that pointer to NULL.  Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+                                     const char* file, int line,
+                                     DeathTest** test) {
+  UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const int death_test_index = impl->current_test_info()
+      ->increment_death_test_count();
+
+  if (flag != NULL) {
+    if (death_test_index > flag->index()) {
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
+      return false;
+    }
+
+    if (!(flag->file() == file && flag->line() == line &&
+          flag->index() == death_test_index)) {
+      *test = NULL;
+      return true;
+    }
+  }
+
+# if GTEST_OS_WINDOWS
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+      GTEST_FLAG(death_test_style) == "fast") {
+    *test = new WindowsDeathTest(statement, regex, file, line);
+  }
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe") {
+    *test = new ExecDeathTest(statement, regex, file, line);
+  } else if (GTEST_FLAG(death_test_style) == "fast") {
+    *test = new NoExecDeathTest(statement, regex);
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
+    return false;
+  }
+
+  return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+                        ::std::vector< ::std::string>* dest) {
+  ::std::vector< ::std::string> parsed;
+  ::std::string::size_type pos = 0;
+  while (::testing::internal::AlwaysTrue()) {
+    const ::std::string::size_type colon = str.find(delimiter, pos);
+    if (colon == ::std::string::npos) {
+      parsed.push_back(str.substr(pos));
+      break;
+    } else {
+      parsed.push_back(str.substr(pos, colon - pos));
+      pos = colon + 1;
+    }
+  }
+  dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+                            size_t write_handle_as_size_t,
+                            size_t event_handle_as_size_t) {
+  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+                                                   FALSE,  // Non-inheritable.
+                                                   parent_process_id));
+  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  // TODO(vladl at google.com): Replace the following check with a
+  // compile-time assertion when available.
+  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+  const HANDLE write_handle =
+      reinterpret_cast<HANDLE>(write_handle_as_size_t);
+  HANDLE dup_write_handle;
+
+  // The newly initialized handle is accessible only in in the parent
+  // process. To obtain one accessible within the child, we need to use
+  // DuplicateHandle.
+  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+                         ::GetCurrentProcess(), &dup_write_handle,
+                         0x0,    // Requested privileges ignored since
+                                 // DUPLICATE_SAME_ACCESS is used.
+                         FALSE,  // Request non-inheritable handler.
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+  HANDLE dup_event_handle;
+
+  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+                         ::GetCurrentProcess(), &dup_event_handle,
+                         0x0,
+                         FALSE,
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const int write_fd =
+      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+  if (write_fd == -1) {
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
+  }
+
+  // Signals the parent that the write end of the pipe has been acquired
+  // so the parent can release its own write end.
+  ::SetEvent(dup_event_handle);
+
+  return write_fd;
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+  // can use it here.
+  int line = -1;
+  int index = -1;
+  ::std::vector< ::std::string> fields;
+  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+  int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+  unsigned int parent_process_id = 0;
+  size_t write_handle_as_size_t = 0;
+  size_t event_handle_as_size_t = 0;
+
+  if (fields.size() != 6
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &parent_process_id)
+      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
+  }
+  write_fd = GetStatusFileDescriptor(parent_process_id,
+                                     write_handle_as_size_t,
+                                     event_handle_as_size_t);
+# else
+
+  if (fields.size() != 4
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &write_fd)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+}  // namespace internal
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-filepath.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-filepath.cc
new file mode 100644
index 0000000..6be58b6
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-filepath.cc
@@ -0,0 +1,382 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/internal/gtest-port.h"
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits>  // Some Linux distributions define PATH_MAX here.
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif  // GTEST_OS_WINDOWS
+
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif  // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif  // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+  return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE doesn't have a current directory, so we just return
+  // something reasonable.
+  return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
+  }
+  return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+  const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+  // Comparing two pointers of which only one is NULL is undefined.
+  if (last_alt_sep != NULL &&
+      (last_sep == NULL || last_alt_sep > last_sep)) {
+    return last_alt_sep;
+  }
+#endif
+  return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  std::string dir;
+  if (last_sep) {
+    dir = std::string(c_str(), last_sep + 1 - c_str());
+  } else {
+    dir = kCurrentDirectoryString;
+  }
+  return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+                                const FilePath& base_name,
+                                int number,
+                                const char* extension) {
+  std::string file;
+  if (number == 0) {
+    file = base_name.string() + "." + extension;
+  } else {
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
+  }
+  return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+                               const FilePath& relative_path) {
+  if (directory.IsEmpty())
+    return relative_path;
+  const FilePath dir(directory.RemoveTrailingPathSeparator());
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  return attributes != kInvalidFileAttributes;
+#else
+  posix::StatStruct file_stat;
+  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+  bool result = false;
+#if GTEST_OS_WINDOWS
+  // Don't strip off trailing separator if path is a root directory on
+  // Windows (like "C:\\").
+  const FilePath& path(IsRootDirectory() ? *this :
+                                           RemoveTrailingPathSeparator());
+#else
+  const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  if ((attributes != kInvalidFileAttributes) &&
+      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    result = true;
+  }
+#else
+  posix::StatStruct file_stat;
+  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+      posix::IsDir(file_stat);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+  // TODO(wan at google.com): on Windows a network share like
+  // \\server\share can be a root directory, although it cannot be the
+  // current directory.  Handle this properly.
+  return pathname_.length() == 3 && IsAbsolutePath();
+#else
+  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+  const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+  return pathname_.length() >= 3 &&
+     ((name[0] >= 'a' && name[0] <= 'z') ||
+      (name[0] >= 'A' && name[0] <= 'Z')) &&
+     name[1] == ':' &&
+     IsPathSeparator(name[2]);
+#else
+  return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+                                          const FilePath& base_name,
+                                          const char* extension) {
+  FilePath full_pathname;
+  int number = 0;
+  do {
+    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+  } while (full_pathname.FileOrDirectoryExists());
+  return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+  return !pathname_.empty() &&
+         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+  if (!this->IsDirectory()) {
+    return false;
+  }
+
+  if (pathname_.length() == 0 || this->DirectoryExists()) {
+    return true;
+  }
+
+  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  FilePath removed_sep(this->RemoveTrailingPathSeparator());
+  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+  delete [] unicode;
+#elif GTEST_OS_WINDOWS
+  int result = _mkdir(pathname_.c_str());
+#else
+  int result = mkdir(pathname_.c_str(), 0777);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  if (result == -1) {
+    return this->DirectoryExists();  // An error is OK if the directory exists.
+  }
+  return true;  // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+  return IsDirectory()
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+      : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+  if (pathname_.c_str() == NULL) {
+    pathname_ = "";
+    return;
+  }
+  const char* src = pathname_.c_str();
+  char* const dest = new char[pathname_.length() + 1];
+  char* dest_ptr = dest;
+  memset(dest_ptr, 0, pathname_.length() + 1);
+
+  while (*src != '\0') {
+    *dest_ptr = *src;
+    if (!IsPathSeparator(*src)) {
+      src++;
+    } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+      if (*dest_ptr == kAlternatePathSeparator) {
+        *dest_ptr = kPathSeparator;
+      }
+#endif
+      while (IsPathSeparator(*src))
+        src++;
+    }
+    dest_ptr++;
+  }
+  *dest_ptr = '\0';
+  pathname_ = dest;
+  delete[] dest;
+}
+
+}  // namespace internal
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-internal-inl.h b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-internal-inl.h
new file mode 100644
index 0000000..35df303
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-internal-inl.h
@@ -0,0 +1,1218 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation.  Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif  // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif  // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
+#include <string.h>  // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+#include "gtest/gtest.h"  // NOLINT
+#include "gtest/gtest-spi.h"
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+    const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+  const unsigned int raw_seed = (random_seed_flag == 0) ?
+      static_cast<unsigned int>(GetTimeInMillis()) :
+      static_cast<unsigned int>(random_seed_flag);
+
+  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+  // it's easy to type.
+  const int normalized_seed =
+      static_cast<int>((raw_seed - 1U) %
+                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+  return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'.  The behavior is
+// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+      << "Invalid random seed " << seed << " - must be in [1, "
+      << kMaxRandomSeed << "].";
+  const int next_seed = seed + 1;
+  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+  // The c'tor.
+  GTestFlagSaver() {
+    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+    break_on_failure_ = GTEST_FLAG(break_on_failure);
+    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+    color_ = GTEST_FLAG(color);
+    death_test_style_ = GTEST_FLAG(death_test_style);
+    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+    filter_ = GTEST_FLAG(filter);
+    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+    list_tests_ = GTEST_FLAG(list_tests);
+    output_ = GTEST_FLAG(output);
+    print_time_ = GTEST_FLAG(print_time);
+    random_seed_ = GTEST_FLAG(random_seed);
+    repeat_ = GTEST_FLAG(repeat);
+    shuffle_ = GTEST_FLAG(shuffle);
+    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+    stream_result_to_ = GTEST_FLAG(stream_result_to);
+    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+  }
+
+  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
+  ~GTestFlagSaver() {
+    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+    GTEST_FLAG(break_on_failure) = break_on_failure_;
+    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+    GTEST_FLAG(color) = color_;
+    GTEST_FLAG(death_test_style) = death_test_style_;
+    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+    GTEST_FLAG(filter) = filter_;
+    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+    GTEST_FLAG(list_tests) = list_tests_;
+    GTEST_FLAG(output) = output_;
+    GTEST_FLAG(print_time) = print_time_;
+    GTEST_FLAG(random_seed) = random_seed_;
+    GTEST_FLAG(repeat) = repeat_;
+    GTEST_FLAG(shuffle) = shuffle_;
+    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+    GTEST_FLAG(stream_result_to) = stream_result_to_;
+    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+  }
+
+ private:
+  // Fields for saving the original values of flags.
+  bool also_run_disabled_tests_;
+  bool break_on_failure_;
+  bool catch_exceptions_;
+  std::string color_;
+  std::string death_test_style_;
+  bool death_test_use_fork_;
+  std::string filter_;
+  std::string internal_run_death_test_;
+  bool list_tests_;
+  std::string output_;
+  bool print_time_;
+  internal::Int32 random_seed_;
+  internal::Int32 repeat_;
+  bool shuffle_;
+  internal::Int32 stack_trace_depth_;
+  std::string stream_result_to_;
+  bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+                            const char* shard_index_str,
+                            bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+    int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+  // Implemented as an explicit loop since std::count_if() in libCstd on
+  // Solaris has a non-standard signature.
+  int count = 0;
+  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+    if (predicate(*it))
+      ++count;
+  }
+  return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+  std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+                  std::vector<E>* v) {
+  const int size = static_cast<int>(v->size());
+  GTEST_CHECK_(0 <= begin && begin <= size)
+      << "Invalid shuffle range start " << begin << ": must be in range [0, "
+      << size << "].";
+  GTEST_CHECK_(begin <= end && end <= size)
+      << "Invalid shuffle range finish " << end << ": must be in range ["
+      << begin << ", " << size << "].";
+
+  // Fisher-Yates shuffle, from
+  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+  for (int range_width = end - begin; range_width >= 2; range_width--) {
+    const int last_in_range = begin + range_width - 1;
+    const int selected = begin + random->Generate(range_width);
+    std::swap((*v)[selected], (*v)[last_in_range]);
+  }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object.  Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+  delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+  // Constructor.
+  //
+  // TestPropertyKeyIs has NO default constructor.
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+  // Returns true iff the test name of test property matches on key_.
+  bool operator()(const TestProperty& test_property) const {
+    return test_property.key() == key_;
+  }
+
+ private:
+  std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests.  It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag.  E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter.  If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+  // Functions for processing the gtest_output flag.
+
+  // Returns the output format, or "" for normal printed output.
+  static std::string GetOutputFormat();
+
+  // Returns the absolute path of the requested output file, or the
+  // default (test_detail.xml in the original working directory) if
+  // none was explicitly specified.
+  static std::string GetAbsolutePathToOutputFile();
+
+  // Functions for processing the gtest_filter flag.
+
+  // Returns true iff the wildcard pattern matches the string.  The
+  // first ':' or '\0' character in pattern marks the end of it.
+  //
+  // This recursive algorithm isn't very efficient, but is clear and
+  // works well enough for matching test names, which are short.
+  static bool PatternMatchesString(const char *pattern, const char *str);
+
+  // Returns true iff the user-specified filter matches the test case
+  // name and the test name.
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+  // Function for supporting the gtest_catch_exception flag.
+
+  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+  // This function is useful as an __except condition.
+  static int GTestShouldProcessSEH(DWORD exception_code);
+#endif  // GTEST_OS_WINDOWS
+
+  // Returns true if "name" matches the ':' separated list of glob-style
+  // filters in "filter".
+  static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present.  Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetterInterface() {}
+  virtual ~OsStackTraceGetterInterface() {}
+
+  // Returns the current OS stack trace as an std::string.  Parameters:
+  //
+  //   max_depth  - the maximum number of stack frames to be included
+  //                in the trace.
+  //   skip_count - the number of top frames to be skipped; doesn't count
+  //                against max_depth.
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+  // UponLeavingGTest() should be called immediately before Google Test calls
+  // user code. It saves some information about the current stack that
+  // CurrentStackTrace() will use to find and hide Google Test stack frames.
+  virtual void UponLeavingGTest() = 0;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetter() : caller_frame_(NULL) {}
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // This string is inserted in place of stack frames that are part of
+  // Google Test's implementation.
+  static const char* const kElidedFramesMarker;
+
+ private:
+  Mutex mutex_;  // protects all internal state
+
+  // We save the stack frame below the frame that calls user code.
+  // We do this because the address of the frame immediately below
+  // the user code changes between the call to UponLeavingGTest()
+  // and any calls to CurrentStackTrace() from within the user code.
+  void* caller_frame_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+  const char* file;
+  int line;
+  std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+  : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. Reports the test part
+  // result in the current test.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. The implementation just
+  // delegates to the current global test part result reporter of *unit_test_.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class.  We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+  explicit UnitTestImpl(UnitTest* parent);
+  virtual ~UnitTestImpl();
+
+  // There are two different ways to register your own TestPartResultReporter.
+  // You can register your own repoter to listen either only for test results
+  // from the current thread or for results from all threads.
+  // By default, each per-thread test result repoter just passes a new
+  // TestPartResult to the global test result reporter, which registers the
+  // test part result for the currently running test.
+
+  // Returns the global test part result reporter.
+  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+  // Sets the global test part result reporter.
+  void SetGlobalTestPartResultReporter(
+      TestPartResultReporterInterface* reporter);
+
+  // Returns the test part result reporter for the current thread.
+  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+  // Sets the test part result reporter for the current thread.
+  void SetTestPartResultReporterForCurrentThread(
+      TestPartResultReporterInterface* reporter);
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const {
+    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[i];
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i) {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[index];
+  }
+
+  // Provides access to the event listener list.
+  TestEventListeners* listeners() { return &listeners_; }
+
+  // Returns the TestResult for the test that's currently running, or
+  // the TestResult for the ad hoc test if no test is running.
+  TestResult* current_test_result();
+
+  // Returns the TestResult for the ad hoc test.
+  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+  // Sets the OS stack trace getter.
+  //
+  // Does nothing if the input and the current OS stack trace getter
+  // are the same; otherwise, deletes the old getter and makes the
+  // input the current getter.
+  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+  // Returns the current OS stack trace getter if it is not NULL;
+  // otherwise, creates an OsStackTraceGetter, makes it the current
+  // getter, and returns it.
+  OsStackTraceGetterInterface* os_stack_trace_getter();
+
+  // Returns the current OS stack trace as an std::string.
+  //
+  // The maximum number of stack frames to be included is specified by
+  // the gtest_stack_trace_depth flag.  The skip_count parameter
+  // specifies the number of top frames to be skipped, which doesn't
+  // count against the number of frames to be included.
+  //
+  // For example, if Foo() calls Bar(), which in turn calls
+  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+  // Finds and returns a TestCase with the given name.  If one doesn't
+  // exist, creates one and returns it.
+  //
+  // Arguments:
+  //
+  //   test_case_name: name of the test case
+  //   type_param:     the name of the test's type parameter, or NULL if
+  //                   this is not a typed or a type-parameterized test.
+  //   set_up_tc:      pointer to the function that sets up the test case
+  //   tear_down_tc:   pointer to the function that tears down the test case
+  TestCase* GetTestCase(const char* test_case_name,
+                        const char* type_param,
+                        Test::SetUpTestCaseFunc set_up_tc,
+                        Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Adds a TestInfo to the unit test.
+  //
+  // Arguments:
+  //
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  //   test_info:    the TestInfo object
+  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc,
+                   TestInfo* test_info) {
+    // In order to support thread-safe death tests, we need to
+    // remember the original working directory when the test program
+    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
+    // the user may have changed the current directory before calling
+    // RUN_ALL_TESTS().  Therefore we capture the current directory in
+    // AddTestInfo(), which is called to register a TEST or TEST_F
+    // before main() is reached.
+    if (original_working_dir_.IsEmpty()) {
+      original_working_dir_.Set(FilePath::GetCurrentDir());
+      GTEST_CHECK_(!original_working_dir_.IsEmpty())
+          << "Failed to get the current working directory.";
+    }
+
+    GetTestCase(test_info->test_case_name(),
+                test_info->type_param(),
+                set_up_tc,
+                tear_down_tc)->AddTestInfo(test_info);
+  }
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+    return parameterized_test_registry_;
+  }
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Sets the TestCase object for the test that's currently running.
+  void set_current_test_case(TestCase* a_current_test_case) {
+    current_test_case_ = a_current_test_case;
+  }
+
+  // Sets the TestInfo object for the test that's currently running.  If
+  // current_test_info is NULL, the assertion results will be stored in
+  // ad_hoc_test_result_.
+  void set_current_test_info(TestInfo* a_current_test_info) {
+    current_test_info_ = a_current_test_info;
+  }
+
+  // Registers all parameterized tests defined using TEST_P and
+  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+  // combination. This method can be called more then once; it has guards
+  // protecting from registering the tests more then once.  If
+  // value-parameterized tests are disabled, RegisterParameterizedTests is
+  // present but does nothing.
+  void RegisterParameterizedTests();
+
+  // Runs all tests in this UnitTest object, prints the result, and
+  // returns true if all tests are successful.  If any exception is
+  // thrown during a test, this test is considered to be failed, but
+  // the rest of the tests will still be run.
+  bool RunAllTests();
+
+  // Clears the results of all tests, except the ad hoc tests.
+  void ClearNonAdHocTestResult() {
+    ForEach(test_cases_, TestCase::ClearTestCaseResult);
+  }
+
+  // Clears the results of ad-hoc test assertions.
+  void ClearAdHocTestResult() {
+    ad_hoc_test_result_.Clear();
+  }
+
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
+  enum ReactionToSharding {
+    HONOR_SHARDING_PROTOCOL,
+    IGNORE_SHARDING_PROTOCOL
+  };
+
+  // Matches the full name of each test against the user-specified
+  // filter to decide whether the test should run, then records the
+  // result in each TestCase and TestInfo object.
+  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+  // based on sharding variables in the environment.
+  // Returns the number of tests that should run.
+  int FilterTests(ReactionToSharding shard_tests);
+
+  // Prints the names of the tests matching the user-specified filter flag.
+  void ListTestsMatchingFilter();
+
+  const TestCase* current_test_case() const { return current_test_case_; }
+  TestInfo* current_test_info() { return current_test_info_; }
+  const TestInfo* current_test_info() const { return current_test_info_; }
+
+  // Returns the vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*>& environments() { return environments_; }
+
+  // Getters for the per-thread Google Test trace stack.
+  std::vector<TraceInfo>& gtest_trace_stack() {
+    return *(gtest_trace_stack_.pointer());
+  }
+  const std::vector<TraceInfo>& gtest_trace_stack() const {
+    return gtest_trace_stack_.get();
+  }
+
+#if GTEST_HAS_DEATH_TEST
+  void InitDeathTestSubprocessControlInfo() {
+    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+  }
+  // Returns a pointer to the parsed --gtest_internal_run_death_test
+  // flag, or NULL if that flag was not specified.
+  // This information is useful only in a death test child process.
+  // Must not be called before a call to InitGoogleTest.
+  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+    return internal_run_death_test_flag_.get();
+  }
+
+  // Returns a pointer to the current death test factory.
+  internal::DeathTestFactory* death_test_factory() {
+    return death_test_factory_.get();
+  }
+
+  void SuppressTestEventsIfInSubprocess();
+
+  friend class ReplaceDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // Initializes the event listener performing XML output as specified by
+  // UnitTestOptions. Must not be called before InitGoogleTest.
+  void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+  // Initializes the event listener for streaming test results to a socket.
+  // Must not be called before InitGoogleTest.
+  void ConfigureStreamingOutput();
+#endif
+
+  // Performs initialization dependent upon flag values obtained in
+  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+  // this function is also called from RunAllTests.  Since this function can be
+  // called more than once, it has to be idempotent.
+  void PostFlagParsingInit();
+
+  // Gets the random seed used at the start of the current test iteration.
+  int random_seed() const { return random_seed_; }
+
+  // Gets the random number generator.
+  internal::Random* random() { return &random_; }
+
+  // Shuffles all test cases, and the tests within each test case,
+  // making sure that death tests are still run first.
+  void ShuffleTests();
+
+  // Restores the test cases and tests to their order before the first shuffle.
+  void UnshuffleTests();
+
+  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+  // UnitTest::Run() starts.
+  bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+  friend class ::testing::UnitTest;
+
+  // Used by UnitTest::Run() to capture the state of
+  // GTEST_FLAG(catch_exceptions) at the moment it starts.
+  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+  // The UnitTest object that owns this implementation object.
+  UnitTest* const parent_;
+
+  // The working directory when the first TEST() or TEST_F() was
+  // executed.
+  internal::FilePath original_working_dir_;
+
+  // The default test part result reporters.
+  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+  DefaultPerThreadTestPartResultReporter
+      default_per_thread_test_part_result_reporter_;
+
+  // Points to (but doesn't own) the global test part result reporter.
+  TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+  // Protects read and write access to global_test_part_result_reporter_.
+  internal::Mutex global_test_part_result_reporter_mutex_;
+
+  // Points to (but doesn't own) the per-thread test part result reporter.
+  internal::ThreadLocal<TestPartResultReporterInterface*>
+      per_thread_test_part_result_reporter_;
+
+  // The vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*> environments_;
+
+  // The vector of TestCases in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestCase*> test_cases_;
+
+  // Provides a level of indirection for the test case list to allow
+  // easy shuffling and restoring the test case order.  The i-th
+  // element of this vector is the index of the i-th test case in the
+  // shuffled order.
+  std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+  // ParameterizedTestRegistry object used to register value-parameterized
+  // tests.
+  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+  // Indicates whether RegisterParameterizedTests() has been called already.
+  bool parameterized_tests_registered_;
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Index of the last death test case registered.  Initially -1.
+  int last_death_test_case_;
+
+  // This points to the TestCase for the currently running test.  It
+  // changes as Google Test goes through one test case after another.
+  // When no test is running, this is set to NULL and Google Test
+  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestCase* current_test_case_;
+
+  // This points to the TestInfo for the currently running test.  It
+  // changes as Google Test goes through one test after another.  When
+  // no test is running, this is set to NULL and Google Test stores
+  // assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestInfo* current_test_info_;
+
+  // Normally, a user only writes assertions inside a TEST or TEST_F,
+  // or inside a function called by a TEST or TEST_F.  Since Google
+  // Test keeps track of which test is current running, it can
+  // associate such an assertion with the test it belongs to.
+  //
+  // If an assertion is encountered when no TEST or TEST_F is running,
+  // Google Test attributes the assertion result to an imaginary "ad hoc"
+  // test, and records the result in ad_hoc_test_result_.
+  TestResult ad_hoc_test_result_;
+
+  // The list of event listeners that can be used to track events inside
+  // Google Test.
+  TestEventListeners listeners_;
+
+  // The OS stack trace getter.  Will be deleted when the UnitTest
+  // object is destructed.  By default, an OsStackTraceGetter is used,
+  // but the user can set this field to use a custom getter if that is
+  // desired.
+  OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+  // True iff PostFlagParsingInit() has been called.
+  bool post_flag_parse_init_performed_;
+
+  // The random number seed used at the beginning of the test run.
+  int random_seed_;
+
+  // Our random number generator.
+  internal::Random random_;
+
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
+  // How long the test took to run, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+  // The decomposed components of the gtest_internal_run_death_test flag,
+  // parsed when RUN_ALL_TESTS is called.
+  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+  // starts.
+  bool catch_exceptions_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+};  // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+  return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif  // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+  ~AutoHandle() { Reset(); }
+
+  HANDLE Get() const { return handle_; }
+  void Reset() { Reset(INVALID_HANDLE_VALUE); }
+  void Reset(HANDLE handle) {
+    if (handle != handle_) {
+      if (handle_ != INVALID_HANDLE_VALUE)
+        ::CloseHandle(handle_);
+      handle_ = handle;
+    }
+  }
+
+ private:
+  HANDLE handle_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif  // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter.  Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+  // Fail fast if the given string does not begin with a digit;
+  // this bypasses strtoXXX's "optional leading whitespace and plus
+  // or minus sign" semantics, which are undesirable here.
+  if (str.empty() || !IsDigit(str[0])) {
+    return false;
+  }
+  errno = 0;
+
+  char* end;
+  // BiggestConvertible is the largest integer type that system-provided
+  // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  // MSVC and C++ Builder define __int64 instead of the standard long long.
+  typedef unsigned __int64 BiggestConvertible;
+  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+  typedef unsigned long long BiggestConvertible;  // NOLINT
+  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  const bool parse_success = *end == '\0' && errno == 0;
+
+  // TODO(vladl at google.com): Convert this to compile time assertion when it is
+  // available.
+  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+  const Integer result = static_cast<Integer>(parsed);
+  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+    *number = result;
+    return true;
+  }
+  return false;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+  static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
+                             const TestProperty& property) {
+    test_result->RecordProperty(xml_element, property);
+  }
+
+  static void ClearTestPartResults(TestResult* test_result) {
+    test_result->ClearTestPartResults();
+  }
+
+  static const std::vector<testing::TestPartResult>& test_part_results(
+      const TestResult& test_result) {
+    return test_result.test_part_results();
+  }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-port.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-port.cc
new file mode 100644
index 0000000..0c4df5f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-port.cc
@@ -0,0 +1,805 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/internal/gtest-port.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif  // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif  // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const task_t task = mach_task_self();
+  mach_msg_type_number_t thread_count;
+  thread_act_array_t thread_list;
+  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+  if (status == KERN_SUCCESS) {
+    // task_threads allocates resources in thread_list and we need to free them
+    // to avoid leaks.
+    vm_deallocate(task,
+                  reinterpret_cast<vm_address_t>(thread_list),
+                  sizeof(thread_t) * thread_count);
+    return static_cast<size_t>(thread_count);
+  } else {
+    return 0;
+  }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
+#else
+
+size_t GetThreadCount() {
+  // There's no portable way to detect the number of threads, so we just
+  // return 0 to indicate that we cannot detect it.
+  return 0;
+}
+
+#endif  // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE.  Currently only needed for death tests.
+
+RE::~RE() {
+  if (is_valid_) {
+    // regfree'ing an invalid regex might crash because the content
+    // of the regex is undefined. Since the regex's are essentially
+    // the same, one cannot be valid (or invalid) without the other
+    // being so too.
+    regfree(&partial_regex_);
+    regfree(&full_regex_);
+  }
+  free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = posix::StrDup(regex);
+
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match.
+  const size_t full_regex_len = strlen(regex) + 10;
+  char* const full_pattern = new char[full_regex_len];
+
+  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+  // We want to call regcomp(&partial_regex_, ...) even if the
+  // previous expression returns false.  Otherwise partial_regex_ may
+  // not be properly initialized can may cause trouble when it's
+  // freed.
+  //
+  // Some implementation of POSIX regex (e.g. on at least some
+  // versions of Cygwin) doesn't accept the empty string as a valid
+  // regex.  We change it to an equivalent form "()" to be safe.
+  if (is_valid_) {
+    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+  }
+  EXPECT_TRUE(is_valid_)
+      << "Regular expression \"" << regex
+      << "\" is not a valid POSIX Extended regular expression.";
+
+  delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+  return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification.  Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+      ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch.  The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+  if (escaped) {  // "\\p" where p is pattern_char.
+    switch (pattern_char) {
+      case 'd': return IsAsciiDigit(ch);
+      case 'D': return !IsAsciiDigit(ch);
+      case 'f': return ch == '\f';
+      case 'n': return ch == '\n';
+      case 'r': return ch == '\r';
+      case 's': return IsAsciiWhiteSpace(ch);
+      case 'S': return !IsAsciiWhiteSpace(ch);
+      case 't': return ch == '\t';
+      case 'v': return ch == '\v';
+      case 'w': return IsAsciiWordChar(ch);
+      case 'W': return !IsAsciiWordChar(ch);
+    }
+    return IsAsciiPunct(pattern_char) && pattern_char == ch;
+  }
+
+  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+  return (Message() << "Syntax error at index " << index
+          << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+  if (regex == NULL) {
+    // TODO(wan at google.com): fix the source file location in the
+    // assertion failures to match where the regex is used in user
+    // code.
+    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+    return false;
+  }
+
+  bool is_valid = true;
+
+  // True iff ?, *, or + can follow the previous atom.
+  bool prev_repeatable = false;
+  for (int i = 0; regex[i]; i++) {
+    if (regex[i] == '\\') {  // An escape sequence
+      i++;
+      if (regex[i] == '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "'\\' cannot appear at the end.";
+        return false;
+      }
+
+      if (!IsValidEscape(regex[i])) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "invalid escape sequence \"\\" << regex[i] << "\".";
+        is_valid = false;
+      }
+      prev_repeatable = true;
+    } else {  // Not an escape sequence.
+      const char ch = regex[i];
+
+      if (ch == '^' && i > 0) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'^' can only appear at the beginning.";
+        is_valid = false;
+      } else if (ch == '$' && regex[i + 1] != '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'$' can only appear at the end.";
+        is_valid = false;
+      } else if (IsInSet(ch, "()[]{}|")) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' is unsupported.";
+        is_valid = false;
+      } else if (IsRepeat(ch) && !prev_repeatable) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' can only follow a repeatable token.";
+        is_valid = false;
+      }
+
+      prev_repeatable = !IsInSet(ch, "^$?*+");
+    }
+  }
+
+  return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression.  The regex atom is defined as c if escaped is false,
+// or \c otherwise.  repeat is the repetition meta character (?, *,
+// or +).  The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway.  We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char c, char repeat, const char* regex,
+    const char* str) {
+  const size_t min_count = (repeat == '+') ? 1 : 0;
+  const size_t max_count = (repeat == '?') ? 1 :
+      static_cast<size_t>(-1) - 1;
+  // We cannot call numeric_limits::max() as it conflicts with the
+  // max() macro on Windows.
+
+  for (size_t i = 0; i <= max_count; ++i) {
+    // We know that the atom matches each of the first i characters in str.
+    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+      // We have enough matches at the head, and the tail matches too.
+      // Since we only care about *whether* the pattern matches str
+      // (as opposed to *how* it matches), there is no need to find a
+      // greedy match.
+      return true;
+    }
+    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+      return false;
+  }
+  return false;
+}
+
+// Returns true iff regex matches a prefix of str.  regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+  if (*regex == '\0')  // An empty regex matches a prefix of anything.
+    return true;
+
+  // "$" only matches the end of a string.  Note that regex being
+  // valid guarantees that there's nothing after "$" in it.
+  if (*regex == '$')
+    return *str == '\0';
+
+  // Is the first thing in regex an escape sequence?
+  const bool escaped = *regex == '\\';
+  if (escaped)
+    ++regex;
+  if (IsRepeat(regex[1])) {
+    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+    // here's an indirect recursion.  It terminates as the regex gets
+    // shorter in each recursion.
+    return MatchRepetitionAndRegexAtHead(
+        escaped, regex[0], regex[1], regex + 2, str);
+  } else {
+    // regex isn't empty, isn't "$", and doesn't start with a
+    // repetition.  We match the first atom of regex with the first
+    // character of str and recurse.
+    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+        MatchRegexAtHead(regex + 1, str + 1);
+  }
+}
+
+// Returns true iff regex matches any substring of str.  regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally.  In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+  if (regex == NULL || str == NULL)
+    return false;
+
+  if (*regex == '^')
+    return MatchRegexAtHead(regex + 1, str);
+
+  // A successful match can be anywhere in str.
+  do {
+    if (MatchRegexAtHead(regex, str))
+      return true;
+  } while (*str++ != '\0');
+  return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+  free(const_cast<char*>(pattern_));
+  free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = full_pattern_ = NULL;
+  if (regex != NULL) {
+    pattern_ = posix::StrDup(regex);
+  }
+
+  is_valid_ = ValidateRegex(regex);
+  if (!is_valid_) {
+    // No need to calculate the full pattern when the regex is invalid.
+    return;
+  }
+
+  const size_t len = strlen(regex);
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match: we need space to prepend a '^', append a '$', and
+  // terminate the string with '\0'.
+  char* buffer = static_cast<char*>(malloc(len + 3));
+  full_pattern_ = buffer;
+
+  if (*regex != '^')
+    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
+
+  // We don't use snprintf or strncpy, as they trigger a warning when
+  // compiled with VC++ 8.0.
+  memcpy(buffer, regex, len);
+  buffer += len;
+
+  if (len == 0 || regex[len - 1] != '$')
+    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
+
+  *buffer = '\0';
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0) {
+    return file_name + ":";
+  }
+#ifdef _MSC_VER
+  return file_name + "(" + StreamableToString(line) + "):";
+#else
+  return file_name + ":" + StreamableToString(line) + ":";
+#endif  // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+    const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0)
+    return file_name;
+  else
+    return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+    : severity_(severity) {
+  const char* const marker =
+      severity == GTEST_INFO ?    "[  INFO ]" :
+      severity == GTEST_WARNING ? "[WARNING]" :
+      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
+  GetStream() << ::std::endl << marker << " "
+              << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+  GetStream() << ::std::endl;
+  if (severity_ == GTEST_FATAL) {
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif  // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+  // The ctor redirects the stream to a temporary file.
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+
+    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+    const UINT success = ::GetTempFileNameA(temp_dir_path,
+                                            "gtest_redir",
+                                            0,  // Generate unique file name.
+                                            temp_file_path);
+    GTEST_CHECK_(success != 0)
+        << "Unable to create a temporary file in " << temp_dir_path;
+    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+                                    << temp_file_path;
+    filename_ = temp_file_path;
+# else
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
+    char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
+    const int captured_fd = mkstemp(name_template);
+    filename_ = name_template;
+# endif  // GTEST_OS_WINDOWS
+    fflush(NULL);
+    dup2(captured_fd, fd_);
+    close(captured_fd);
+  }
+
+  ~CapturedStream() {
+    remove(filename_.c_str());
+  }
+
+  std::string GetCapturedString() {
+    if (uncaptured_fd_ != -1) {
+      // Restores the original stream.
+      fflush(NULL);
+      dup2(uncaptured_fd_, fd_);
+      close(uncaptured_fd_);
+      uncaptured_fd_ = -1;
+    }
+
+    FILE* const file = posix::FOpen(filename_.c_str(), "r");
+    const std::string content = ReadEntireFile(file);
+    posix::FClose(file);
+    return content;
+  }
+
+ private:
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
+
+  // Returns the size (in bytes) of a file.
+  static size_t GetFileSize(FILE* file);
+
+  const int fd_;  // A stream to capture.
+  int uncaptured_fd_;
+  // Name of the temporary file holding the stderr output.
+  ::std::string filename_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+  fseek(file, 0, SEEK_END);
+  return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+  const size_t file_size = GetFileSize(file);
+  char* const buffer = new char[file_size];
+
+  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
+  size_t bytes_read = 0;       // # of bytes read so far
+
+  fseek(file, 0, SEEK_SET);
+
+  // Keeps reading the file until we cannot read further or the
+  // pre-determined file size is reached.
+  do {
+    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+    bytes_read += bytes_last_read;
+  } while (bytes_last_read > 0 && bytes_read < file_size);
+
+  const std::string content(buffer, bytes_read);
+  delete[] buffer;
+
+  return content;
+}
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+  if (*stream != NULL) {
+    GTEST_LOG_(FATAL) << "Only one " << stream_name
+                      << " capturer can exist at a time.";
+  }
+  *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
+
+  delete *captured_stream;
+  *captured_stream = NULL;
+
+  return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+  DebugBreak();
+  TerminateProcess(GetCurrentProcess(), 1);
+}
+}  // namespace posix
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag.  For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
+      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+  Message env_var;
+  for (size_t i = 0; i != full_flag.length(); i++) {
+    env_var << ToUpper(full_flag.c_str()[i]);
+  }
+
+  return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+  // Parses the environment variable as a decimal integer.
+  char* end = NULL;
+  const long long_value = strtol(str, &end, 10);  // NOLINT
+
+  // Has strtol() consumed all characters in the string?
+  if (*end != '\0') {
+    // No - an invalid character was encountered.
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value \"" << str << "\".\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  // Is the parsed value in the range of an Int32?
+  const Int32 result = static_cast<Int32>(long_value);
+  if (long_value == LONG_MAX || long_value == LONG_MIN ||
+      // The parsed value overflows as a long.  (strtol() returns
+      // LONG_MAX or LONG_MIN when the input overflows.)
+      result != long_value
+      // The parsed value overflows as an Int32.
+      ) {
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value " << str << ", which overflows.\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  *value = result;
+  return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  return string_value == NULL ?
+      default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  if (string_value == NULL) {
+    // The environment variable is not set.
+    return default_value;
+  }
+
+  Int32 result = default_value;
+  if (!ParseInt32(Message() << "Environment variable " << env_var,
+                  string_value, &result)) {
+    printf("The default value %s is used.\n",
+           (Message() << default_value).GetString().c_str());
+    fflush(stdout);
+    return default_value;
+  }
+
+  return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const value = posix::GetEnv(env_var.c_str());
+  return value == NULL ? default_value : value;
+}
+
+}  // namespace internal
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-printers.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-printers.cc
new file mode 100644
index 0000000..75fa408
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-printers.cc
@@ -0,0 +1,363 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise.  A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include "gtest/gtest-printers.h"
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream>  // NOLINT
+#include <string>
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+                                size_t count, ostream* os) {
+  char text[5] = "";
+  for (size_t i = 0; i != count; i++) {
+    const size_t j = start + i;
+    if (i != 0) {
+      // Organizes the bytes into groups of 2 for easy parsing by
+      // human.
+      if ((j % 2) == 0)
+        *os << ' ';
+      else
+        *os << '-';
+    }
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+    *os << text;
+  }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+                              ostream* os) {
+  // Tells the user how big the object is.
+  *os << count << "-byte object <";
+
+  const size_t kThreshold = 132;
+  const size_t kChunkSize = 64;
+  // If the object size is bigger than kThreshold, we'll have to omit
+  // some details by printing only the first and the last kChunkSize
+  // bytes.
+  // TODO(wan): let the user control the threshold using a flag.
+  if (count < kThreshold) {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+  } else {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+    *os << " ... ";
+    // Rounds up to 2-byte boundary.
+    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+  }
+  *os << ">";
+}
+
+}  // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object.  The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+                          ostream* os) {
+  PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+}  // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
+//   - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+  kAsIs,
+  kHexEscape,
+  kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character.  We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+  return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+  switch (static_cast<wchar_t>(c)) {
+    case L'\0':
+      *os << "\\0";
+      break;
+    case L'\'':
+      *os << "\\'";
+      break;
+    case L'\\':
+      *os << "\\\\";
+      break;
+    case L'\a':
+      *os << "\\a";
+      break;
+    case L'\b':
+      *os << "\\b";
+      break;
+    case L'\f':
+      *os << "\\f";
+      break;
+    case L'\n':
+      *os << "\\n";
+      break;
+    case L'\r':
+      *os << "\\r";
+      break;
+    case L'\t':
+      *os << "\\t";
+      break;
+    case L'\v':
+      *os << "\\v";
+      break;
+    default:
+      if (IsPrintableAscii(c)) {
+        *os << static_cast<char>(c);
+        return kAsIs;
+      } else {
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+        return kHexEscape;
+      }
+  }
+  return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+  switch (c) {
+    case L'\'':
+      *os << "'";
+      return kAsIs;
+    case L'"':
+      *os << "\\\"";
+      return kSpecialEscape;
+    default:
+      return PrintAsCharLiteralTo<wchar_t>(c, os);
+  }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code.  '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence.  The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+  // First, print c as a literal in the most readable form we can find.
+  *os << ((sizeof(c) > 1) ? "L'" : "'");
+  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+  *os << "'";
+
+  // To aid user debugging, we also print c's code in decimal, unless
+  // it's 0 (in which case c was printed as '\\0', making the code
+  // obvious).
+  if (c == 0)
+    return;
+  *os << " (" << static_cast<int>(c);
+
+  // For more convenience, we print c's code again in hexidecimal,
+  // unless c was already printed in the form '\x##' or the code is in
+  // [1, 9].
+  if (format == kHexEscape || (1 <= c && c <= 9)) {
+    // Do nothing.
+  } else {
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+  }
+  *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+  PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
+  bool is_previous_hex = false;
+  for (size_t index = 0; index < len; ++index) {
+    const CharType cur = begin[index];
+    if (is_previous_hex && IsXDigit(cur)) {
+      // Previous character is of '\x..' form and this character can be
+      // interpreted as another hexadecimal digit in its number. Break string to
+      // disambiguate.
+      *os << "\" " << kQuoteBegin;
+    }
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+  }
+  *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, strlen(s), os);
+  }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, wcslen(s), os);
+  }
+}
+#endif  // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+}  // namespace internal
+
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-test-part.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-test-part.cc
new file mode 100644
index 0000000..c60eef3
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-test-part.cc
@@ -0,0 +1,110 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+#include "gtest/gtest-test-part.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+  return os
+      << result.file_name() << ":" << result.line_number() << ": "
+      << (result.type() == TestPartResult::kSuccess ? "Success" :
+          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+          "Non-fatal failure") << ":\n"
+      << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+  array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+  if (index < 0 || index >= size()) {
+    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+    internal::posix::Abort();
+  }
+
+  return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+  return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+    : has_new_fatal_failure_(false),
+      original_reporter_(GetUnitTestImpl()->
+                         GetTestPartResultReporterForCurrentThread()) {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+      original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+    const TestPartResult& result) {
+  if (result.fatally_failed())
+    has_new_fatal_failure_ = true;
+  original_reporter_->ReportTestPartResult(result);
+}
+
+}  // namespace internal
+
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-typed-test.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-typed-test.cc
new file mode 100644
index 0000000..f0079f4
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest-typed-test.cc
@@ -0,0 +1,110 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest-typed-test.h"
+#include "gtest/gtest.h"
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+  while (IsSpace(*str))
+    str++;
+  return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+    const char* file, int line, const char* registered_tests) {
+  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+  registered_ = true;
+
+  // Skip initial whitespace in registered_tests since some
+  // preprocessors prefix stringizied literals with whitespace.
+  registered_tests = SkipSpaces(registered_tests);
+
+  Message errors;
+  ::std::set<std::string> tests;
+  for (const char* names = registered_tests; names != NULL;
+       names = SkipComma(names)) {
+    const std::string name = GetPrefixUntilComma(names);
+    if (tests.count(name) != 0) {
+      errors << "Test " << name << " is listed more than once.\n";
+      continue;
+    }
+
+    bool found = false;
+    for (DefinedTestIter it = defined_test_names_.begin();
+         it != defined_test_names_.end();
+         ++it) {
+      if (name == *it) {
+        found = true;
+        break;
+      }
+    }
+
+    if (found) {
+      tests.insert(name);
+    } else {
+      errors << "No test named " << name
+             << " can be found in this test case.\n";
+    }
+  }
+
+  for (DefinedTestIter it = defined_test_names_.begin();
+       it != defined_test_names_.end();
+       ++it) {
+    if (tests.count(*it) == 0) {
+      errors << "You forgot to list test " << *it << ".\n";
+    }
+  }
+
+  const std::string& errors_str = errors.GetString();
+  if (errors_str != "") {
+    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+            errors_str.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+
+  return registered_tests;
+}
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest.cc
new file mode 100644
index 0000000..16b7668
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest.cc
@@ -0,0 +1,5020 @@
+// patched for BornAgain -  all patches are marked with 'PATCHED/BA'
+//
+// JWu 5/16: suppressed output for successful tests (cf http://stackoverflow.com/questions/36847322)
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[ RUN      ] "); // PATCHED/BA
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo&) {
+//  PATCHED/BA
+//  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+//  PrintTestName(test_info.test_case_name(), test_info.name());
+//  printf("\n");
+//  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+      return;// PATCHED/BA ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[     DONE ] "); // PATCH/BA
+  printf("%s from %s (%s ms total)\n", // patched JWu
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest.orig.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest.orig.cc
new file mode 100644
index 0000000..6de53dd
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest.orig.cc
@@ -0,0 +1,5015 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  printf("\n");
+  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s (%s ms total)\n\n",
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/src/gtest_main.cc b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest_main.cc
new file mode 100644
index 0000000..f302822
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/src/gtest_main.cc
@@ -0,0 +1,38 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+GTEST_API_ int main(int argc, char **argv) {
+  printf("Running main() from gtest_main.cc\n");
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-death-test_ex_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-death-test_ex_test.cc
new file mode 100644
index 0000000..b50a13d
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-death-test_ex_test.cc
@@ -0,0 +1,93 @@
+// Copyright 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests that verify interaction of exceptions and death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_HAS_SEH
+#  include <windows.h>          // For RaiseException().
+# endif
+
+# include "gtest/gtest-spi.h"
+
+# if GTEST_HAS_EXCEPTIONS
+
+#  include <exception>  // For std::exception.
+
+// Tests that death tests report thrown exceptions as failures and that the
+// exceptions do not escape death test macros.
+TEST(CxxExceptionDeathTest, ExceptionIsFailure) {
+  try {
+    EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw 1, ""), "threw an exception");
+  } catch (...) {  // NOLINT
+    FAIL() << "An exception escaped a death test macro invocation "
+           << "with catch_exceptions "
+           << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
+  }
+}
+
+class TestException : public std::exception {
+ public:
+  virtual const char* what() const throw() { return "exceptional message"; }
+};
+
+TEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {
+  // Verifies that the exception message is quoted in the failure text.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
+                          "exceptional message");
+  // Verifies that the location is mentioned in the failure text.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
+                          "gtest-death-test_ex_test.cc");
+}
+# endif  // GTEST_HAS_EXCEPTIONS
+
+# if GTEST_HAS_SEH
+// Tests that enabling interception of SEH exceptions with the
+// catch_exceptions flag does not interfere with SEH exceptions being
+// treated as death by death tests.
+TEST(SehExceptionDeasTest, CatchExceptionsDoesNotInterfere) {
+  EXPECT_DEATH(RaiseException(42, 0x0, 0, NULL), "")
+      << "with catch_exceptions "
+      << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
+}
+# endif
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+  testing::GTEST_FLAG(catch_exceptions) = GTEST_ENABLE_CATCH_EXCEPTIONS_ != 0;
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-death-test_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-death-test_test.cc
new file mode 100644
index 0000000..c2d26df
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-death-test_test.cc
@@ -0,0 +1,1367 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest.h"
+#include "gtest/internal/gtest-filepath.h"
+
+using testing::internal::AlwaysFalse;
+using testing::internal::AlwaysTrue;
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_WINDOWS
+#  include <direct.h>          // For chdir().
+# else
+#  include <unistd.h>
+#  include <sys/wait.h>        // For waitpid.
+# endif  // GTEST_OS_WINDOWS
+
+# include <limits.h>
+# include <signal.h>
+# include <stdio.h>
+
+# if GTEST_OS_LINUX
+#  include <sys/time.h>
+# endif  // GTEST_OS_LINUX
+
+# include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+# define GTEST_IMPLEMENTATION_ 1
+# include "src/gtest-internal-inl.h"
+# undef GTEST_IMPLEMENTATION_
+
+namespace posix = ::testing::internal::posix;
+
+using testing::Message;
+using testing::internal::DeathTest;
+using testing::internal::DeathTestFactory;
+using testing::internal::FilePath;
+using testing::internal::GetLastErrnoDescription;
+using testing::internal::GetUnitTestImpl;
+using testing::internal::InDeathTestChild;
+using testing::internal::ParseNaturalNumber;
+
+namespace testing {
+namespace internal {
+
+// A helper class whose objects replace the death test factory for a
+// single UnitTest object during their lifetimes.
+class ReplaceDeathTestFactory {
+ public:
+  explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory)
+      : unit_test_impl_(GetUnitTestImpl()) {
+    old_factory_ = unit_test_impl_->death_test_factory_.release();
+    unit_test_impl_->death_test_factory_.reset(new_factory);
+  }
+
+  ~ReplaceDeathTestFactory() {
+    unit_test_impl_->death_test_factory_.release();
+    unit_test_impl_->death_test_factory_.reset(old_factory_);
+  }
+ private:
+  // Prevents copying ReplaceDeathTestFactory objects.
+  ReplaceDeathTestFactory(const ReplaceDeathTestFactory&);
+  void operator=(const ReplaceDeathTestFactory&);
+
+  UnitTestImpl* unit_test_impl_;
+  DeathTestFactory* old_factory_;
+};
+
+}  // namespace internal
+}  // namespace testing
+
+void DieWithMessage(const ::std::string& message) {
+  fprintf(stderr, "%s", message.c_str());
+  fflush(stderr);  // Make sure the text is printed before the process exits.
+
+  // We call _exit() instead of exit(), as the former is a direct
+  // system call and thus safer in the presence of threads.  exit()
+  // will invoke user-defined exit-hooks, which may do dangerous
+  // things that conflict with death tests.
+  //
+  // Some compilers can recognize that _exit() never returns and issue the
+  // 'unreachable code' warning for code following this function, unless
+  // fooled by a fake condition.
+  if (AlwaysTrue())
+    _exit(1);
+}
+
+void DieInside(const ::std::string& function) {
+  DieWithMessage("death inside " + function + "().");
+}
+
+// Tests that death tests work.
+
+class TestForDeathTest : public testing::Test {
+ protected:
+  TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {}
+
+  virtual ~TestForDeathTest() {
+    posix::ChDir(original_dir_.c_str());
+  }
+
+  // A static member function that's expected to die.
+  static void StaticMemberFunction() { DieInside("StaticMemberFunction"); }
+
+  // A method of the test fixture that may die.
+  void MemberFunction() {
+    if (should_die_)
+      DieInside("MemberFunction");
+  }
+
+  // True iff MemberFunction() should die.
+  bool should_die_;
+  const FilePath original_dir_;
+};
+
+// A class with a member function that may die.
+class MayDie {
+ public:
+  explicit MayDie(bool should_die) : should_die_(should_die) {}
+
+  // A member function that may die.
+  void MemberFunction() const {
+    if (should_die_)
+      DieInside("MayDie::MemberFunction");
+  }
+
+ private:
+  // True iff MemberFunction() should die.
+  bool should_die_;
+};
+
+// A global function that's expected to die.
+void GlobalFunction() { DieInside("GlobalFunction"); }
+
+// A non-void function that's expected to die.
+int NonVoidFunction() {
+  DieInside("NonVoidFunction");
+  return 1;
+}
+
+// A unary function that may die.
+void DieIf(bool should_die) {
+  if (should_die)
+    DieInside("DieIf");
+}
+
+// A binary function that may die.
+bool DieIfLessThan(int x, int y) {
+  if (x < y) {
+    DieInside("DieIfLessThan");
+  }
+  return true;
+}
+
+// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
+void DeathTestSubroutine() {
+  EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction");
+  ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction");
+}
+
+// Death in dbg, not opt.
+int DieInDebugElse12(int* sideeffect) {
+  if (sideeffect) *sideeffect = 12;
+
+# ifndef NDEBUG
+
+  DieInside("DieInDebugElse12");
+
+# endif  // NDEBUG
+
+  return 12;
+}
+
+# if GTEST_OS_WINDOWS
+
+// Tests the ExitedWithCode predicate.
+TEST(ExitStatusPredicateTest, ExitedWithCode) {
+  // On Windows, the process's exit code is the same as its exit status,
+  // so the predicate just compares the its input with its parameter.
+  EXPECT_TRUE(testing::ExitedWithCode(0)(0));
+  EXPECT_TRUE(testing::ExitedWithCode(1)(1));
+  EXPECT_TRUE(testing::ExitedWithCode(42)(42));
+  EXPECT_FALSE(testing::ExitedWithCode(0)(1));
+  EXPECT_FALSE(testing::ExitedWithCode(1)(0));
+}
+
+# else
+
+// Returns the exit status of a process that calls _exit(2) with a
+// given exit code.  This is a helper function for the
+// ExitStatusPredicateTest test suite.
+static int NormalExitStatus(int exit_code) {
+  pid_t child_pid = fork();
+  if (child_pid == 0) {
+    _exit(exit_code);
+  }
+  int status;
+  waitpid(child_pid, &status, 0);
+  return status;
+}
+
+// Returns the exit status of a process that raises a given signal.
+// If the signal does not cause the process to die, then it returns
+// instead the exit status of a process that exits normally with exit
+// code 1.  This is a helper function for the ExitStatusPredicateTest
+// test suite.
+static int KilledExitStatus(int signum) {
+  pid_t child_pid = fork();
+  if (child_pid == 0) {
+    raise(signum);
+    _exit(1);
+  }
+  int status;
+  waitpid(child_pid, &status, 0);
+  return status;
+}
+
+// Tests the ExitedWithCode predicate.
+TEST(ExitStatusPredicateTest, ExitedWithCode) {
+  const int status0  = NormalExitStatus(0);
+  const int status1  = NormalExitStatus(1);
+  const int status42 = NormalExitStatus(42);
+  const testing::ExitedWithCode pred0(0);
+  const testing::ExitedWithCode pred1(1);
+  const testing::ExitedWithCode pred42(42);
+  EXPECT_PRED1(pred0,  status0);
+  EXPECT_PRED1(pred1,  status1);
+  EXPECT_PRED1(pred42, status42);
+  EXPECT_FALSE(pred0(status1));
+  EXPECT_FALSE(pred42(status0));
+  EXPECT_FALSE(pred1(status42));
+}
+
+// Tests the KilledBySignal predicate.
+TEST(ExitStatusPredicateTest, KilledBySignal) {
+  const int status_segv = KilledExitStatus(SIGSEGV);
+  const int status_kill = KilledExitStatus(SIGKILL);
+  const testing::KilledBySignal pred_segv(SIGSEGV);
+  const testing::KilledBySignal pred_kill(SIGKILL);
+  EXPECT_PRED1(pred_segv, status_segv);
+  EXPECT_PRED1(pred_kill, status_kill);
+  EXPECT_FALSE(pred_segv(status_kill));
+  EXPECT_FALSE(pred_kill(status_segv));
+}
+
+# endif  // GTEST_OS_WINDOWS
+
+// Tests that the death test macros expand to code which may or may not
+// be followed by operator<<, and that in either case the complete text
+// comprises only a single C++ statement.
+TEST_F(TestForDeathTest, SingleStatement) {
+  if (AlwaysFalse())
+    // This would fail if executed; this is a compilation test only
+    ASSERT_DEATH(return, "");
+
+  if (AlwaysTrue())
+    EXPECT_DEATH(_exit(1), "");
+  else
+    // This empty "else" branch is meant to ensure that EXPECT_DEATH
+    // doesn't expand into an "if" statement without an "else"
+    ;
+
+  if (AlwaysFalse())
+    ASSERT_DEATH(return, "") << "did not die";
+
+  if (AlwaysFalse())
+    ;
+  else
+    EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3;
+}
+
+void DieWithEmbeddedNul() {
+  fprintf(stderr, "Hello%cmy null world.\n", '\0');
+  fflush(stderr);
+  _exit(1);
+}
+
+# if GTEST_USES_PCRE
+// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error
+// message has a NUL character in it.
+TEST_F(TestForDeathTest, EmbeddedNulInMessage) {
+  // TODO(wan at google.com): <regex.h> doesn't support matching strings
+  // with embedded NUL characters - find a way to workaround it.
+  EXPECT_DEATH(DieWithEmbeddedNul(), "my null world");
+  ASSERT_DEATH(DieWithEmbeddedNul(), "my null world");
+}
+# endif  // GTEST_USES_PCRE
+
+// Tests that death test macros expand to code which interacts well with switch
+// statements.
+TEST_F(TestForDeathTest, SwitchStatement) {
+// Microsoft compiler usually complains about switch statements without
+// case labels. We suppress that warning for this test.
+# ifdef _MSC_VER
+#  pragma warning(push)
+#  pragma warning(disable: 4065)
+# endif  // _MSC_VER
+
+  switch (0)
+    default:
+      ASSERT_DEATH(_exit(1), "") << "exit in default switch handler";
+
+  switch (0)
+    case 0:
+      EXPECT_DEATH(_exit(1), "") << "exit in switch case";
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+}
+
+// Tests that a static member function can be used in a "fast" style
+// death test.
+TEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
+}
+
+// Tests that a method of the test fixture can be used in a "fast"
+// style death test.
+TEST_F(TestForDeathTest, MemberFunctionFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  should_die_ = true;
+  EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
+}
+
+void ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); }
+
+// Tests that death tests work even if the current directory has been
+// changed.
+TEST_F(TestForDeathTest, FastDeathTestInChangedDir) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+
+  ChangeToRootDir();
+  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
+
+  ChangeToRootDir();
+  ASSERT_DEATH(_exit(1), "");
+}
+
+# if GTEST_OS_LINUX
+void SigprofAction(int, siginfo_t*, void*) { /* no op */ }
+
+// Sets SIGPROF action and ITIMER_PROF timer (interval: 1ms).
+void SetSigprofActionAndTimer() {
+  struct itimerval timer;
+  timer.it_interval.tv_sec = 0;
+  timer.it_interval.tv_usec = 1;
+  timer.it_value = timer.it_interval;
+  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
+  struct sigaction signal_action;
+  memset(&signal_action, 0, sizeof(signal_action));
+  sigemptyset(&signal_action.sa_mask);
+  signal_action.sa_sigaction = SigprofAction;
+  signal_action.sa_flags = SA_RESTART | SA_SIGINFO;
+  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, NULL));
+}
+
+// Disables ITIMER_PROF timer and ignores SIGPROF signal.
+void DisableSigprofActionAndTimer(struct sigaction* old_signal_action) {
+  struct itimerval timer;
+  timer.it_interval.tv_sec = 0;
+  timer.it_interval.tv_usec = 0;
+  timer.it_value = timer.it_interval;
+  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
+  struct sigaction signal_action;
+  memset(&signal_action, 0, sizeof(signal_action));
+  sigemptyset(&signal_action.sa_mask);
+  signal_action.sa_handler = SIG_IGN;
+  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, old_signal_action));
+}
+
+// Tests that death tests work when SIGPROF handler and timer are set.
+TEST_F(TestForDeathTest, FastSigprofActionSet) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  SetSigprofActionAndTimer();
+  EXPECT_DEATH(_exit(1), "");
+  struct sigaction old_signal_action;
+  DisableSigprofActionAndTimer(&old_signal_action);
+  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
+}
+
+TEST_F(TestForDeathTest, ThreadSafeSigprofActionSet) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  SetSigprofActionAndTimer();
+  EXPECT_DEATH(_exit(1), "");
+  struct sigaction old_signal_action;
+  DisableSigprofActionAndTimer(&old_signal_action);
+  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
+}
+# endif  // GTEST_OS_LINUX
+
+// Repeats a representative sample of death tests in the "threadsafe" style:
+
+TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
+}
+
+TEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  should_die_ = true;
+  EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
+}
+
+TEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+
+  for (int i = 0; i < 3; ++i)
+    EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), "") << ": i = " << i;
+}
+
+TEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+
+  ChangeToRootDir();
+  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
+
+  ChangeToRootDir();
+  ASSERT_DEATH(_exit(1), "");
+}
+
+TEST_F(TestForDeathTest, MixedStyles) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_DEATH(_exit(1), "");
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH(_exit(1), "");
+}
+
+# if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD
+
+namespace {
+
+bool pthread_flag;
+
+void SetPthreadFlag() {
+  pthread_flag = true;
+}
+
+}  // namespace
+
+TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {
+  if (!testing::GTEST_FLAG(death_test_use_fork)) {
+    testing::GTEST_FLAG(death_test_style) = "threadsafe";
+    pthread_flag = false;
+    ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL));
+    ASSERT_DEATH(_exit(1), "");
+    ASSERT_FALSE(pthread_flag);
+  }
+}
+
+# endif  // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD
+
+// Tests that a method of another class can be used in a death test.
+TEST_F(TestForDeathTest, MethodOfAnotherClass) {
+  const MayDie x(true);
+  ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction");
+}
+
+// Tests that a global function can be used in a death test.
+TEST_F(TestForDeathTest, GlobalFunction) {
+  EXPECT_DEATH(GlobalFunction(), "GlobalFunction");
+}
+
+// Tests that any value convertible to an RE works as a second
+// argument to EXPECT_DEATH.
+TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {
+  static const char regex_c_str[] = "GlobalFunction";
+  EXPECT_DEATH(GlobalFunction(), regex_c_str);
+
+  const testing::internal::RE regex(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex);
+
+# if GTEST_HAS_GLOBAL_STRING
+
+  const string regex_str(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex_str);
+
+# endif  // GTEST_HAS_GLOBAL_STRING
+
+  const ::std::string regex_std_str(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex_std_str);
+}
+
+// Tests that a non-void function can be used in a death test.
+TEST_F(TestForDeathTest, NonVoidFunction) {
+  ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction");
+}
+
+// Tests that functions that take parameter(s) can be used in a death test.
+TEST_F(TestForDeathTest, FunctionWithParameter) {
+  EXPECT_DEATH(DieIf(true), "DieIf\\(\\)");
+  EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan");
+}
+
+// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
+TEST_F(TestForDeathTest, OutsideFixture) {
+  DeathTestSubroutine();
+}
+
+// Tests that death tests can be done inside a loop.
+TEST_F(TestForDeathTest, InsideLoop) {
+  for (int i = 0; i < 5; i++) {
+    EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i;
+  }
+}
+
+// Tests that a compound statement can be used in a death test.
+TEST_F(TestForDeathTest, CompoundStatement) {
+  EXPECT_DEATH({  // NOLINT
+    const int x = 2;
+    const int y = x + 1;
+    DieIfLessThan(x, y);
+  },
+  "DieIfLessThan");
+}
+
+// Tests that code that doesn't die causes a death test to fail.
+TEST_F(TestForDeathTest, DoesNotDie) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"),
+                          "failed to die");
+}
+
+// Tests that a death test fails when the error message isn't expected.
+TEST_F(TestForDeathTest, ErrorMessageMismatch) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(DieIf(true), "DieIfLessThan") << "End of death test message.";
+  }, "died but not with expected error");
+}
+
+// On exit, *aborted will be true iff the EXPECT_DEATH() statement
+// aborted the function.
+void ExpectDeathTestHelper(bool* aborted) {
+  *aborted = true;
+  EXPECT_DEATH(DieIf(false), "DieIf");  // This assertion should fail.
+  *aborted = false;
+}
+
+// Tests that EXPECT_DEATH doesn't abort the test on failure.
+TEST_F(TestForDeathTest, EXPECT_DEATH) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted),
+                          "failed to die");
+  EXPECT_FALSE(aborted);
+}
+
+// Tests that ASSERT_DEATH does abort the test on failure.
+TEST_F(TestForDeathTest, ASSERT_DEATH) {
+  static bool aborted;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    aborted = true;
+    ASSERT_DEATH(DieIf(false), "DieIf");  // This assertion should fail.
+    aborted = false;
+  }, "failed to die");
+  EXPECT_TRUE(aborted);
+}
+
+// Tests that EXPECT_DEATH evaluates the arguments exactly once.
+TEST_F(TestForDeathTest, SingleEvaluation) {
+  int x = 3;
+  EXPECT_DEATH(DieIf((++x) == 4), "DieIf");
+
+  const char* regex = "DieIf";
+  const char* regex_save = regex;
+  EXPECT_DEATH(DieIfLessThan(3, 4), regex++);
+  EXPECT_EQ(regex_save + 1, regex);
+}
+
+// Tests that run-away death tests are reported as failures.
+TEST_F(TestForDeathTest, RunawayIsFailure) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), "Foo"),
+                          "failed to die.");
+}
+
+// Tests that death tests report executing 'return' in the statement as
+// failure.
+TEST_F(TestForDeathTest, ReturnIsFailure) {
+  EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"),
+                       "illegal return in test statement.");
+}
+
+// Tests that EXPECT_DEBUG_DEATH works as expected, that is, you can stream a
+// message to it, and in debug mode it:
+// 1. Asserts on death.
+// 2. Has no side effect.
+//
+// And in opt mode, it:
+// 1.  Has side effects but does not assert.
+TEST_F(TestForDeathTest, TestExpectDebugDeath) {
+  int sideeffect = 0;
+
+  EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12")
+      << "Must accept a streamed message";
+
+# ifdef NDEBUG
+
+  // Checks that the assignment occurs in opt mode (sideeffect).
+  EXPECT_EQ(12, sideeffect);
+
+# else
+
+  // Checks that the assignment does not occur in dbg mode (no sideeffect).
+  EXPECT_EQ(0, sideeffect);
+
+# endif
+}
+
+// Tests that ASSERT_DEBUG_DEATH works as expected, that is, you can stream a
+// message to it, and in debug mode it:
+// 1. Asserts on death.
+// 2. Has no side effect.
+//
+// And in opt mode, it:
+// 1.  Has side effects but does not assert.
+TEST_F(TestForDeathTest, TestAssertDebugDeath) {
+  int sideeffect = 0;
+
+  ASSERT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12")
+      << "Must accept a streamed message";
+
+# ifdef NDEBUG
+
+  // Checks that the assignment occurs in opt mode (sideeffect).
+  EXPECT_EQ(12, sideeffect);
+
+# else
+
+  // Checks that the assignment does not occur in dbg mode (no sideeffect).
+  EXPECT_EQ(0, sideeffect);
+
+# endif
+}
+
+# ifndef NDEBUG
+
+void ExpectDebugDeathHelper(bool* aborted) {
+  *aborted = true;
+  EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail.";
+  *aborted = false;
+}
+
+#  if GTEST_OS_WINDOWS
+TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {
+  printf("This test should be considered failing if it shows "
+         "any pop-up dialogs.\n");
+  fflush(stdout);
+
+  EXPECT_DEATH({
+    testing::GTEST_FLAG(catch_exceptions) = false;
+    abort();
+  }, "");
+}
+#  endif  // GTEST_OS_WINDOWS
+
+// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort
+// the function.
+TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), "");
+  EXPECT_FALSE(aborted);
+}
+
+void AssertDebugDeathHelper(bool* aborted) {
+  *aborted = true;
+  ASSERT_DEBUG_DEATH(return, "") << "This is expected to fail.";
+  *aborted = false;
+}
+
+// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on
+// failure.
+TEST_F(TestForDeathTest, AssertDebugDeathAborts) {
+  static bool aborted;
+  aborted = false;
+  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), "");
+  EXPECT_TRUE(aborted);
+}
+
+# endif  // _NDEBUG
+
+// Tests the *_EXIT family of macros, using a variety of predicates.
+static void TestExitMacros() {
+  EXPECT_EXIT(_exit(1),  testing::ExitedWithCode(1),  "");
+  ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), "");
+
+# if GTEST_OS_WINDOWS
+
+  // Of all signals effects on the process exit code, only those of SIGABRT
+  // are documented on Windows.
+  // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx.
+  EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "") << "b_ar";
+
+# else
+
+  EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo";
+  ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar";
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "")
+      << "This failure is expected, too.";
+  }, "This failure is expected, too.");
+
+# endif  // GTEST_OS_WINDOWS
+
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "")
+      << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+TEST_F(TestForDeathTest, ExitMacros) {
+  TestExitMacros();
+}
+
+TEST_F(TestForDeathTest, ExitMacrosUsingFork) {
+  testing::GTEST_FLAG(death_test_use_fork) = true;
+  TestExitMacros();
+}
+
+TEST_F(TestForDeathTest, InvalidStyle) {
+  testing::GTEST_FLAG(death_test_style) = "rococo";
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(_exit(0), "") << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+TEST_F(TestForDeathTest, DeathTestFailedOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH(DieWithMessage("death\n"),
+                   "expected message"),
+      "Actual msg:\n"
+      "[  DEATH   ] death\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestUnexpectedReturnOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH({
+          fprintf(stderr, "returning\n");
+          fflush(stderr);
+          return;
+        }, ""),
+      "    Result: illegal return in test statement.\n"
+      " Error msg:\n"
+      "[  DEATH   ] returning\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestBadExitCodeOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_EXIT(DieWithMessage("exiting with rc 1\n"),
+                  testing::ExitedWithCode(3),
+                  "expected message"),
+      "    Result: died but not with expected exit code:\n"
+      "            Exited with exit status 1\n"
+      "Actual msg:\n"
+      "[  DEATH   ] exiting with rc 1\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestMultiLineMatchFail) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"),
+                   "line 1\nxyz\nline 3\n"),
+      "Actual msg:\n"
+      "[  DEATH   ] line 1\n"
+      "[  DEATH   ] line 2\n"
+      "[  DEATH   ] line 3\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestMultiLineMatchPass) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"),
+               "line 1\nline 2\nline 3\n");
+}
+
+// A DeathTestFactory that returns MockDeathTests.
+class MockDeathTestFactory : public DeathTestFactory {
+ public:
+  MockDeathTestFactory();
+  virtual bool Create(const char* statement,
+                      const ::testing::internal::RE* regex,
+                      const char* file, int line, DeathTest** test);
+
+  // Sets the parameters for subsequent calls to Create.
+  void SetParameters(bool create, DeathTest::TestRole role,
+                     int status, bool passed);
+
+  // Accessors.
+  int AssumeRoleCalls() const { return assume_role_calls_; }
+  int WaitCalls() const { return wait_calls_; }
+  int PassedCalls() const { return passed_args_.size(); }
+  bool PassedArgument(int n) const { return passed_args_[n]; }
+  int AbortCalls() const { return abort_args_.size(); }
+  DeathTest::AbortReason AbortArgument(int n) const {
+    return abort_args_[n];
+  }
+  bool TestDeleted() const { return test_deleted_; }
+
+ private:
+  friend class MockDeathTest;
+  // If true, Create will return a MockDeathTest; otherwise it returns
+  // NULL.
+  bool create_;
+  // The value a MockDeathTest will return from its AssumeRole method.
+  DeathTest::TestRole role_;
+  // The value a MockDeathTest will return from its Wait method.
+  int status_;
+  // The value a MockDeathTest will return from its Passed method.
+  bool passed_;
+
+  // Number of times AssumeRole was called.
+  int assume_role_calls_;
+  // Number of times Wait was called.
+  int wait_calls_;
+  // The arguments to the calls to Passed since the last call to
+  // SetParameters.
+  std::vector<bool> passed_args_;
+  // The arguments to the calls to Abort since the last call to
+  // SetParameters.
+  std::vector<DeathTest::AbortReason> abort_args_;
+  // True if the last MockDeathTest returned by Create has been
+  // deleted.
+  bool test_deleted_;
+};
+
+
+// A DeathTest implementation useful in testing.  It returns values set
+// at its creation from its various inherited DeathTest methods, and
+// reports calls to those methods to its parent MockDeathTestFactory
+// object.
+class MockDeathTest : public DeathTest {
+ public:
+  MockDeathTest(MockDeathTestFactory *parent,
+                TestRole role, int status, bool passed) :
+      parent_(parent), role_(role), status_(status), passed_(passed) {
+  }
+  virtual ~MockDeathTest() {
+    parent_->test_deleted_ = true;
+  }
+  virtual TestRole AssumeRole() {
+    ++parent_->assume_role_calls_;
+    return role_;
+  }
+  virtual int Wait() {
+    ++parent_->wait_calls_;
+    return status_;
+  }
+  virtual bool Passed(bool exit_status_ok) {
+    parent_->passed_args_.push_back(exit_status_ok);
+    return passed_;
+  }
+  virtual void Abort(AbortReason reason) {
+    parent_->abort_args_.push_back(reason);
+  }
+
+ private:
+  MockDeathTestFactory* const parent_;
+  const TestRole role_;
+  const int status_;
+  const bool passed_;
+};
+
+
+// MockDeathTestFactory constructor.
+MockDeathTestFactory::MockDeathTestFactory()
+    : create_(true),
+      role_(DeathTest::OVERSEE_TEST),
+      status_(0),
+      passed_(true),
+      assume_role_calls_(0),
+      wait_calls_(0),
+      passed_args_(),
+      abort_args_() {
+}
+
+
+// Sets the parameters for subsequent calls to Create.
+void MockDeathTestFactory::SetParameters(bool create,
+                                         DeathTest::TestRole role,
+                                         int status, bool passed) {
+  create_ = create;
+  role_ = role;
+  status_ = status;
+  passed_ = passed;
+
+  assume_role_calls_ = 0;
+  wait_calls_ = 0;
+  passed_args_.clear();
+  abort_args_.clear();
+}
+
+
+// Sets test to NULL (if create_ is false) or to the address of a new
+// MockDeathTest object with parameters taken from the last call
+// to SetParameters (if create_ is true).  Always returns true.
+bool MockDeathTestFactory::Create(const char* /*statement*/,
+                                  const ::testing::internal::RE* /*regex*/,
+                                  const char* /*file*/,
+                                  int /*line*/,
+                                  DeathTest** test) {
+  test_deleted_ = false;
+  if (create_) {
+    *test = new MockDeathTest(this, role_, status_, passed_);
+  } else {
+    *test = NULL;
+  }
+  return true;
+}
+
+// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro.
+// It installs a MockDeathTestFactory that is used for the duration
+// of the test case.
+class MacroLogicDeathTest : public testing::Test {
+ protected:
+  static testing::internal::ReplaceDeathTestFactory* replacer_;
+  static MockDeathTestFactory* factory_;
+
+  static void SetUpTestCase() {
+    factory_ = new MockDeathTestFactory;
+    replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_);
+  }
+
+  static void TearDownTestCase() {
+    delete replacer_;
+    replacer_ = NULL;
+    delete factory_;
+    factory_ = NULL;
+  }
+
+  // Runs a death test that breaks the rules by returning.  Such a death
+  // test cannot be run directly from a test routine that uses a
+  // MockDeathTest, or the remainder of the routine will not be executed.
+  static void RunReturningDeathTest(bool* flag) {
+    ASSERT_DEATH({  // NOLINT
+      *flag = true;
+      return;
+    }, "");
+  }
+};
+
+testing::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_
+    = NULL;
+MockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL;
+
+
+// Test that nothing happens when the factory doesn't return a DeathTest:
+TEST_F(MacroLogicDeathTest, NothingHappens) {
+  bool flag = false;
+  factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(0, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_FALSE(factory_->TestDeleted());
+}
+
+// Test that the parent process doesn't run the death test code,
+// and that the Passed method returns false when the (simulated)
+// child process exits with status 0:
+TEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(1, factory_->WaitCalls());
+  ASSERT_EQ(1, factory_->PassedCalls());
+  EXPECT_FALSE(factory_->PassedArgument(0));
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the Passed method was given the argument "true" when
+// the (simulated) child process exits with status 1:
+TEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(1, factory_->WaitCalls());
+  ASSERT_EQ(1, factory_->PassedCalls());
+  EXPECT_TRUE(factory_->PassedArgument(0));
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the (simulated) child process executes the death test
+// code, and is aborted with the correct AbortReason if it
+// executes a return statement.
+TEST_F(MacroLogicDeathTest, ChildPerformsReturn) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
+  RunReturningDeathTest(&flag);
+  EXPECT_TRUE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  EXPECT_EQ(1, factory_->AbortCalls());
+  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
+            factory_->AbortArgument(0));
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the (simulated) child process is aborted with the
+// correct AbortReason if it does not die.
+TEST_F(MacroLogicDeathTest, ChildDoesNotDie) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_TRUE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  // This time there are two calls to Abort: one since the test didn't
+  // die, and another from the ReturnSentinel when it's destroyed.  The
+  // sentinel normally isn't destroyed if a test doesn't die, since
+  // _exit(2) is called in that case by ForkingDeathTest, but not by
+  // our MockDeathTest.
+  ASSERT_EQ(2, factory_->AbortCalls());
+  EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE,
+            factory_->AbortArgument(0));
+  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
+            factory_->AbortArgument(1));
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that a successful death test does not register a successful
+// test part.
+TEST(SuccessRegistrationDeathTest, NoSuccessPart) {
+  EXPECT_DEATH(_exit(1), "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+TEST(StreamingAssertionsDeathTest, DeathTest) {
+  EXPECT_DEATH(_exit(1), "") << "unexpected failure";
+  ASSERT_DEATH(_exit(1), "") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(_exit(0), "") << "expected failure";
+  }, "expected failure");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_DEATH(_exit(0), "") << "expected failure";
+  }, "expected failure");
+}
+
+// Tests that GetLastErrnoDescription returns an empty string when the
+// last error is 0 and non-empty string when it is non-zero.
+TEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) {
+  errno = ENOENT;
+  EXPECT_STRNE("", GetLastErrnoDescription().c_str());
+  errno = 0;
+  EXPECT_STREQ("", GetLastErrnoDescription().c_str());
+}
+
+# if GTEST_OS_WINDOWS
+TEST(AutoHandleTest, AutoHandleWorks) {
+  HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
+  ASSERT_NE(INVALID_HANDLE_VALUE, handle);
+
+  // Tests that the AutoHandle is correctly initialized with a handle.
+  testing::internal::AutoHandle auto_handle(handle);
+  EXPECT_EQ(handle, auto_handle.Get());
+
+  // Tests that Reset assigns INVALID_HANDLE_VALUE.
+  // Note that this cannot verify whether the original handle is closed.
+  auto_handle.Reset();
+  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get());
+
+  // Tests that Reset assigns the new handle.
+  // Note that this cannot verify whether the original handle is closed.
+  handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
+  ASSERT_NE(INVALID_HANDLE_VALUE, handle);
+  auto_handle.Reset(handle);
+  EXPECT_EQ(handle, auto_handle.Get());
+
+  // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default.
+  testing::internal::AutoHandle auto_handle2;
+  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get());
+}
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_WINDOWS
+typedef unsigned __int64 BiggestParsable;
+typedef signed __int64 BiggestSignedParsable;
+# else
+typedef unsigned long long BiggestParsable;
+typedef signed long long BiggestSignedParsable;
+# endif  // GTEST_OS_WINDOWS
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the
+// max() macro defined by <windows.h>.
+const BiggestParsable kBiggestParsableMax = ULLONG_MAX;
+const BiggestSignedParsable kBiggestSignedParsableMax = LLONG_MAX;
+
+TEST(ParseNaturalNumberTest, RejectsInvalidFormat) {
+  BiggestParsable result = 0;
+
+  // Rejects non-numbers.
+  EXPECT_FALSE(ParseNaturalNumber("non-number string", &result));
+
+  // Rejects numbers with whitespace prefix.
+  EXPECT_FALSE(ParseNaturalNumber(" 123", &result));
+
+  // Rejects negative numbers.
+  EXPECT_FALSE(ParseNaturalNumber("-123", &result));
+
+  // Rejects numbers starting with a plus sign.
+  EXPECT_FALSE(ParseNaturalNumber("+123", &result));
+  errno = 0;
+}
+
+TEST(ParseNaturalNumberTest, RejectsOverflownNumbers) {
+  BiggestParsable result = 0;
+
+  EXPECT_FALSE(ParseNaturalNumber("99999999999999999999999", &result));
+
+  signed char char_result = 0;
+  EXPECT_FALSE(ParseNaturalNumber("200", &char_result));
+  errno = 0;
+}
+
+TEST(ParseNaturalNumberTest, AcceptsValidNumbers) {
+  BiggestParsable result = 0;
+
+  result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &result));
+  EXPECT_EQ(123U, result);
+
+  // Check 0 as an edge case.
+  result = 1;
+  ASSERT_TRUE(ParseNaturalNumber("0", &result));
+  EXPECT_EQ(0U, result);
+
+  result = 1;
+  ASSERT_TRUE(ParseNaturalNumber("00000", &result));
+  EXPECT_EQ(0U, result);
+}
+
+TEST(ParseNaturalNumberTest, AcceptsTypeLimits) {
+  Message msg;
+  msg << kBiggestParsableMax;
+
+  BiggestParsable result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result));
+  EXPECT_EQ(kBiggestParsableMax, result);
+
+  Message msg2;
+  msg2 << kBiggestSignedParsableMax;
+
+  BiggestSignedParsable signed_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result));
+  EXPECT_EQ(kBiggestSignedParsableMax, signed_result);
+
+  Message msg3;
+  msg3 << INT_MAX;
+
+  int int_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result));
+  EXPECT_EQ(INT_MAX, int_result);
+
+  Message msg4;
+  msg4 << UINT_MAX;
+
+  unsigned int uint_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result));
+  EXPECT_EQ(UINT_MAX, uint_result);
+}
+
+TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
+  short short_result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &short_result));
+  EXPECT_EQ(123, short_result);
+
+  signed char char_result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &char_result));
+  EXPECT_EQ(123, char_result);
+}
+
+# if GTEST_OS_WINDOWS
+TEST(EnvironmentTest, HandleFitsIntoSizeT) {
+  // TODO(vladl at google.com): Remove this test after this condition is verified
+  // in a static assertion in gtest-death-test.cc in the function
+  // GetStatusFileDescriptor.
+  ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger
+// failures when death tests are available on the system.
+TEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) {
+  EXPECT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestExpectMacro"),
+                            "death inside CondDeathTestExpectMacro");
+  ASSERT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestAssertMacro"),
+                            "death inside CondDeathTestAssertMacro");
+
+  // Empty statement will not crash, which must trigger a failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, ""), "");
+  EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, ""), "");
+}
+
+#else
+
+using testing::internal::CaptureStderr;
+using testing::internal::GetCapturedStderr;
+
+// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still
+// defined but do not trigger failures when death tests are not available on
+// the system.
+TEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) {
+  // Empty statement will not crash, but that should not trigger a failure
+  // when death tests are not supported.
+  CaptureStderr();
+  EXPECT_DEATH_IF_SUPPORTED(;, "");
+  std::string output = GetCapturedStderr();
+  ASSERT_TRUE(NULL != strstr(output.c_str(),
+                             "Death tests are not supported on this platform"));
+  ASSERT_TRUE(NULL != strstr(output.c_str(), ";"));
+
+  // The streamed message should not be printed as there is no test failure.
+  CaptureStderr();
+  EXPECT_DEATH_IF_SUPPORTED(;, "") << "streamed message";
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message"));
+
+  CaptureStderr();
+  ASSERT_DEATH_IF_SUPPORTED(;, "");  // NOLINT
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL != strstr(output.c_str(),
+                             "Death tests are not supported on this platform"));
+  ASSERT_TRUE(NULL != strstr(output.c_str(), ";"));
+
+  CaptureStderr();
+  ASSERT_DEATH_IF_SUPPORTED(;, "") << "streamed message";  // NOLINT
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message"));
+}
+
+void FuncWithAssert(int* n) {
+  ASSERT_DEATH_IF_SUPPORTED(return;, "");
+  (*n)++;
+}
+
+// Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current
+// function (as ASSERT_DEATH does) if death tests are not supported.
+TEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) {
+  int n = 0;
+  FuncWithAssert(&n);
+  EXPECT_EQ(1, n);
+}
+
+TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_FALSE(InDeathTestChild());
+  EXPECT_DEATH({
+    fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside");
+    fflush(stderr);
+    _exit(1);
+  }, "Inside");
+}
+
+TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInThreadSafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_FALSE(InDeathTestChild());
+  EXPECT_DEATH({
+    fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside");
+    fflush(stderr);
+    _exit(1);
+  }, "Inside");
+}
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Tests that the death test macros expand to code which may or may not
+// be followed by operator<<, and that in either case the complete text
+// comprises only a single C++ statement.
+//
+// The syntax should work whether death tests are available or not.
+TEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) {
+  if (AlwaysFalse())
+    // This would fail if executed; this is a compilation test only
+    ASSERT_DEATH_IF_SUPPORTED(return, "");
+
+  if (AlwaysTrue())
+    EXPECT_DEATH_IF_SUPPORTED(_exit(1), "");
+  else
+    // This empty "else" branch is meant to ensure that EXPECT_DEATH
+    // doesn't expand into an "if" statement without an "else"
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_DEATH_IF_SUPPORTED(return, "") << "did not die";
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << 1 << 2 << 3;
+}
+
+// Tests that conditional death test macros expand to code which interacts
+// well with switch statements.
+TEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) {
+// Microsoft compiler usually complains about switch statements without
+// case labels. We suppress that warning for this test.
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4065)
+#endif  // _MSC_VER
+
+  switch (0)
+    default:
+      ASSERT_DEATH_IF_SUPPORTED(_exit(1), "")
+          << "exit in default switch handler";
+
+  switch (0)
+    case 0:
+      EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << "exit in switch case";
+
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif  // _MSC_VER
+}
+
+// Tests that a test case whose name ends with "DeathTest" works fine
+// on Windows.
+TEST(NotADeathTest, Test) {
+  SUCCEED();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-filepath_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-filepath_test.cc
new file mode 100644
index 0000000..ae9f55a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-filepath_test.cc
@@ -0,0 +1,680 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This file tests classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included from gtest_unittest.cc, to avoid changing
+// build or make-files for some existing Google Test clients. Do not
+// #include this file anywhere else!
+
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // NOLINT
+#elif GTEST_OS_WINDOWS
+# include <direct.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+namespace testing {
+namespace internal {
+namespace {
+
+#if GTEST_OS_WINDOWS_MOBILE
+// TODO(wan at google.com): Move these to the POSIX adapter section in
+// gtest-port.h.
+
+// Windows CE doesn't have the remove C function.
+int remove(const char* path) {
+  LPCWSTR wpath = String::AnsiToUtf16(path);
+  int ret = DeleteFile(wpath) ? 0 : -1;
+  delete [] wpath;
+  return ret;
+}
+// Windows CE doesn't have the _rmdir C function.
+int _rmdir(const char* path) {
+  FilePath filepath(path);
+  LPCWSTR wpath = String::AnsiToUtf16(
+      filepath.RemoveTrailingPathSeparator().c_str());
+  int ret = RemoveDirectory(wpath) ? 0 : -1;
+  delete [] wpath;
+  return ret;
+}
+
+#else
+
+TEST(GetCurrentDirTest, ReturnsCurrentDir) {
+  const FilePath original_dir = FilePath::GetCurrentDir();
+  EXPECT_FALSE(original_dir.IsEmpty());
+
+  posix::ChDir(GTEST_PATH_SEP_);
+  const FilePath cwd = FilePath::GetCurrentDir();
+  posix::ChDir(original_dir.c_str());
+
+# if GTEST_OS_WINDOWS
+
+  // Skips the ":".
+  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
+  ASSERT_TRUE(cwd_without_drive != NULL);
+  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
+
+# else
+
+  EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
+
+# endif
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
+  EXPECT_TRUE(FilePath("").IsEmpty());
+}
+
+TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
+  EXPECT_FALSE(FilePath("a").IsEmpty());
+  EXPECT_FALSE(FilePath(".").IsEmpty());
+  EXPECT_FALSE(FilePath("a/b").IsEmpty());
+  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
+}
+
+// RemoveDirectoryName "" -> ""
+TEST(RemoveDirectoryNameTest, WhenEmptyName) {
+  EXPECT_EQ("", FilePath("").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ButNoDirectory) {
+  EXPECT_EQ("afile",
+      FilePath("afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/" -> ""
+TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
+  EXPECT_EQ("",
+      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/subdir/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
+      .RemoveDirectoryName().string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that RemoveDirectoryName() works with the alternate separator
+// on Windows.
+
+// RemoveDirectoryName("/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile", FilePath("/afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/") -> ""
+TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
+  EXPECT_EQ("", FilePath("adir/").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile", FilePath("adir/afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/subdir/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile",
+            FilePath("adir/subdir/afile").RemoveDirectoryName().string());
+}
+
+#endif
+
+// RemoveFileName "" -> "./"
+TEST(RemoveFileNameTest, EmptyName) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // On Windows CE, we use the root as the current directory.
+  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
+#else
+  EXPECT_EQ("." GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
+#endif
+}
+
+// RemoveFileName "adir/" -> "adir/"
+TEST(RemoveFileNameTest, ButNoFile) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().string());
+}
+
+// RemoveFileName "adir/afile" -> "adir/"
+TEST(RemoveFileNameTest, GivesDirName) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveFileName().string());
+}
+
+// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
+TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
+      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
+      .RemoveFileName().string());
+}
+
+// RemoveFileName "/afile" -> "/"
+TEST(RemoveFileNameTest, GivesRootDir) {
+  EXPECT_EQ(GTEST_PATH_SEP_,
+      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that RemoveFileName() works with the alternate separator on
+// Windows.
+
+// RemoveFileName("adir/") -> "adir/"
+TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir/").RemoveFileName().string());
+}
+
+// RemoveFileName("adir/afile") -> "adir/"
+TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir/afile").RemoveFileName().string());
+}
+
+// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
+TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
+            FilePath("adir/subdir/afile").RemoveFileName().string());
+}
+
+// RemoveFileName("/afile") -> "\"
+TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
+  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("/afile").RemoveFileName().string());
+}
+
+#endif
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
+      0, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
+      12, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar"), 0, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar"), 12, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
+  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
+      0, "xml");
+  EXPECT_EQ("bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
+  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
+      14, "xml");
+  EXPECT_EQ("bar_14.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, Path1BeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath(""),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, Path2BeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"), FilePath(""));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_, actual.string());
+}
+
+TEST(ConcatPathsTest, BothPathBeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath(""),
+                                          FilePath(""));
+  EXPECT_EQ("", actual.string());
+}
+
+TEST(ConcatPathsTest, Path1ContainsPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
+                                          FilePath("foobar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
+            actual.string());
+}
+
+TEST(ConcatPathsTest, Path2ContainsPathSep) {
+  FilePath actual = FilePath::ConcatPaths(
+      FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
+            actual.string());
+}
+
+TEST(ConcatPathsTest, Path2EndsWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
+                                          FilePath("bar" GTEST_PATH_SEP_));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.string());
+}
+
+// RemoveTrailingPathSeparator "" -> ""
+TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
+  EXPECT_EQ("", FilePath("").RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo" -> "foo"
+TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
+  EXPECT_EQ("foo", FilePath("foo").RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo/" -> "foo"
+TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
+  EXPECT_EQ("foo",
+      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());
+#if GTEST_HAS_ALT_PATH_SEP_
+  EXPECT_EQ("foo", FilePath("foo/").RemoveTrailingPathSeparator().string());
+#endif
+}
+
+// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
+TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
+                .RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
+TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar")
+                .RemoveTrailingPathSeparator().string());
+}
+
+TEST(DirectoryTest, RootDirectoryExists) {
+#if GTEST_OS_WINDOWS  // We are on Windows.
+  char current_drive[_MAX_PATH];  // NOLINT
+  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
+  current_drive[1] = ':';
+  current_drive[2] = '\\';
+  current_drive[3] = '\0';
+  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
+#else
+  EXPECT_TRUE(FilePath("/").DirectoryExists());
+#endif  // GTEST_OS_WINDOWS
+}
+
+#if GTEST_OS_WINDOWS
+TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
+  const int saved_drive_ = _getdrive();
+  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
+  for (char drive = 'Z'; drive >= 'A'; drive--)
+    if (_chdrive(drive - 'A' + 1) == -1) {
+      char non_drive[_MAX_PATH];  // NOLINT
+      non_drive[0] = drive;
+      non_drive[1] = ':';
+      non_drive[2] = '\\';
+      non_drive[3] = '\0';
+      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
+      break;
+    }
+  _chdrive(saved_drive_);
+}
+#endif  // GTEST_OS_WINDOWS
+
+#if !GTEST_OS_WINDOWS_MOBILE
+// Windows CE _does_ consider an empty directory to exist.
+TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
+  EXPECT_FALSE(FilePath("").DirectoryExists());
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+TEST(DirectoryTest, CurrentDirectoryExists) {
+#if GTEST_OS_WINDOWS  // We are on Windows.
+# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
+
+  EXPECT_TRUE(FilePath(".").DirectoryExists());
+  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
+
+# endif  // _WIN32_CE
+#else
+  EXPECT_TRUE(FilePath(".").DirectoryExists());
+  EXPECT_TRUE(FilePath("./").DirectoryExists());
+#endif  // GTEST_OS_WINDOWS
+}
+
+// "foo/bar" == foo//bar" == "foo///bar"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
+                     GTEST_PATH_SEP_ "bar").string());
+}
+
+// "/bar" == //bar" == "///bar"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+}
+
+// "foo/" == foo//" == "foo///"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_).string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that separators at the end of the string are normalized
+// regardless of their combination (e.g. "foo\" =="foo/\" ==
+// "foo\\/").
+TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo/").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo" GTEST_PATH_SEP_ "/").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo//" GTEST_PATH_SEP_).string());
+}
+
+#endif
+
+TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
+  FilePath default_path;
+  FilePath non_default_path("path");
+  non_default_path = default_path;
+  EXPECT_EQ("", non_default_path.string());
+  EXPECT_EQ("", default_path.string());  // RHS var is unchanged.
+}
+
+TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
+  FilePath non_default_path("path");
+  FilePath default_path;
+  default_path = non_default_path;
+  EXPECT_EQ("path", default_path.string());
+  EXPECT_EQ("path", non_default_path.string());  // RHS var is unchanged.
+}
+
+TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
+  const FilePath const_default_path("const_path");
+  FilePath non_default_path("path");
+  non_default_path = const_default_path;
+  EXPECT_EQ("const_path", non_default_path.string());
+}
+
+class DirectoryCreationTest : public Test {
+ protected:
+  virtual void SetUp() {
+    testdata_path_.Set(FilePath(
+        TempDir() + GetCurrentExecutableName().string() +
+        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_));
+    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
+
+    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
+        0, "txt"));
+    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
+        1, "txt"));
+
+    remove(testdata_file_.c_str());
+    remove(unique_file0_.c_str());
+    remove(unique_file1_.c_str());
+    posix::RmDir(testdata_path_.c_str());
+  }
+
+  virtual void TearDown() {
+    remove(testdata_file_.c_str());
+    remove(unique_file0_.c_str());
+    remove(unique_file1_.c_str());
+    posix::RmDir(testdata_path_.c_str());
+  }
+
+  std::string TempDir() const {
+#if GTEST_OS_WINDOWS_MOBILE
+    return "\\temp\\";
+#elif GTEST_OS_WINDOWS
+    const char* temp_dir = posix::GetEnv("TEMP");
+    if (temp_dir == NULL || temp_dir[0] == '\0')
+      return "\\temp\\";
+    else if (temp_dir[strlen(temp_dir) - 1] == '\\')
+      return temp_dir;
+    else
+      return std::string(temp_dir) + "\\";
+#elif GTEST_OS_LINUX_ANDROID
+    return "/sdcard/";
+#else
+    return "/tmp/";
+#endif  // GTEST_OS_WINDOWS_MOBILE
+  }
+
+  void CreateTextFile(const char* filename) {
+    FILE* f = posix::FOpen(filename, "w");
+    fprintf(f, "text\n");
+    fclose(f);
+  }
+
+  // Strings representing a directory and a file, with identical paths
+  // except for the trailing separator character that distinquishes
+  // a directory named 'test' from a file named 'test'. Example names:
+  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
+  FilePath testdata_file_;  // "/tmp/directory_creation/test"
+  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
+  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
+};
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
+  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+  EXPECT_TRUE(testdata_path_.DirectoryExists());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
+  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+  // Call 'create' again... should still succeed.
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
+  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
+      FilePath("unique"), "txt"));
+  EXPECT_EQ(unique_file0_.string(), file_path.string());
+  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
+
+  testdata_path_.CreateDirectoriesRecursively();
+  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
+  CreateTextFile(file_path.c_str());
+  EXPECT_TRUE(file_path.FileOrDirectoryExists());
+
+  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
+      FilePath("unique"), "txt"));
+  EXPECT_EQ(unique_file1_.string(), file_path2.string());
+  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
+  CreateTextFile(file_path2.c_str());
+  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
+  // force a failure by putting a file where we will try to create a directory.
+  CreateTextFile(testdata_file_.c_str());
+  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
+  EXPECT_FALSE(testdata_file_.DirectoryExists());
+  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
+}
+
+TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
+  const FilePath test_detail_xml("test_detail.xml");
+  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
+}
+
+TEST(FilePathTest, DefaultConstructor) {
+  FilePath fp;
+  EXPECT_EQ("", fp.string());
+}
+
+TEST(FilePathTest, CharAndCopyConstructors) {
+  const FilePath fp("spicy");
+  EXPECT_EQ("spicy", fp.string());
+
+  const FilePath fp_copy(fp);
+  EXPECT_EQ("spicy", fp_copy.string());
+}
+
+TEST(FilePathTest, StringConstructor) {
+  const FilePath fp(std::string("cider"));
+  EXPECT_EQ("cider", fp.string());
+}
+
+TEST(FilePathTest, Set) {
+  const FilePath apple("apple");
+  FilePath mac("mac");
+  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
+  EXPECT_EQ("apple", mac.string());
+  EXPECT_EQ("apple", apple.string());
+}
+
+TEST(FilePathTest, ToString) {
+  const FilePath file("drink");
+  EXPECT_EQ("drink", file.string());
+}
+
+TEST(FilePathTest, RemoveExtension) {
+  EXPECT_EQ("app", FilePath("app.cc").RemoveExtension("cc").string());
+  EXPECT_EQ("app", FilePath("app.exe").RemoveExtension("exe").string());
+  EXPECT_EQ("APP", FilePath("APP.EXE").RemoveExtension("exe").string());
+}
+
+TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
+  EXPECT_EQ("app", FilePath("app").RemoveExtension("exe").string());
+}
+
+TEST(FilePathTest, IsDirectory) {
+  EXPECT_FALSE(FilePath("cola").IsDirectory());
+  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
+#if GTEST_HAS_ALT_PATH_SEP_
+  EXPECT_TRUE(FilePath("koala/").IsDirectory());
+#endif
+}
+
+TEST(FilePathTest, IsAbsolutePath) {
+  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+  EXPECT_FALSE(FilePath("").IsAbsolutePath());
+#if GTEST_OS_WINDOWS
+  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
+                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
+  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
+                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+#else
+  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
+              .IsAbsolutePath());
+#endif  // GTEST_OS_WINDOWS
+}
+
+TEST(FilePathTest, IsRootDirectory) {
+#if GTEST_OS_WINDOWS
+  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
+  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
+  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
+  EXPECT_FALSE(FilePath("").IsRootDirectory());
+  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
+  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
+  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
+  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
+#else
+  EXPECT_TRUE(FilePath("/").IsRootDirectory());
+  EXPECT_TRUE(FilePath("//").IsRootDirectory());
+  EXPECT_FALSE(FilePath("").IsRootDirectory());
+  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
+  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
+#endif
+}
+
+}  // namespace
+}  // namespace internal
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-linked_ptr_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-linked_ptr_test.cc
new file mode 100644
index 0000000..6fcf512
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-linked_ptr_test.cc
@@ -0,0 +1,154 @@
+// Copyright 2003, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+// Ported to Windows: Vadim Berman (vadimb at google.com)
+
+#include "gtest/internal/gtest-linked_ptr.h"
+
+#include <stdlib.h>
+#include "gtest/gtest.h"
+
+namespace {
+
+using testing::Message;
+using testing::internal::linked_ptr;
+
+int num;
+Message* history = NULL;
+
+// Class which tracks allocation/deallocation
+class A {
+ public:
+  A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
+  virtual ~A() { *history << "A" << mynum << " dtor\n"; }
+  virtual void Use() { *history << "A" << mynum << " use\n"; }
+ protected:
+  int mynum;
+};
+
+// Subclass
+class B : public A {
+ public:
+  B() { *history << "B" << mynum << " ctor\n"; }
+  ~B() { *history << "B" << mynum << " dtor\n"; }
+  virtual void Use() { *history << "B" << mynum << " use\n"; }
+};
+
+class LinkedPtrTest : public testing::Test {
+ public:
+  LinkedPtrTest() {
+    num = 0;
+    history = new Message;
+  }
+
+  virtual ~LinkedPtrTest() {
+    delete history;
+    history = NULL;
+  }
+};
+
+TEST_F(LinkedPtrTest, GeneralTest) {
+  {
+    linked_ptr<A> a0, a1, a2;
+    // Use explicit function call notation here to suppress self-assign warning.
+    a0.operator=(a0);
+    a1 = a2;
+    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
+    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
+    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
+    ASSERT_TRUE(a0 == NULL);
+    ASSERT_TRUE(a1 == NULL);
+    ASSERT_TRUE(a2 == NULL);
+
+    {
+      linked_ptr<A> a3(new A);
+      a0 = a3;
+      ASSERT_TRUE(a0 == a3);
+      ASSERT_TRUE(a0 != NULL);
+      ASSERT_TRUE(a0.get() == a3);
+      ASSERT_TRUE(a0 == a3.get());
+      linked_ptr<A> a4(a0);
+      a1 = a4;
+      linked_ptr<A> a5(new A);
+      ASSERT_TRUE(a5.get() != a3);
+      ASSERT_TRUE(a5 != a3.get());
+      a2 = a5;
+      linked_ptr<B> b0(new B);
+      linked_ptr<A> a6(b0);
+      ASSERT_TRUE(b0 == a6);
+      ASSERT_TRUE(a6 == b0);
+      ASSERT_TRUE(b0 != NULL);
+      a5 = b0;
+      a5 = b0;
+      a3->Use();
+      a4->Use();
+      a5->Use();
+      a6->Use();
+      b0->Use();
+      (*b0).Use();
+      b0.get()->Use();
+    }
+
+    a0->Use();
+    a1->Use();
+    a2->Use();
+
+    a1 = a2;
+    a2.reset(new A);
+    a0.reset();
+
+    linked_ptr<A> a7;
+  }
+
+  ASSERT_STREQ(
+    "A0 ctor\n"
+    "A1 ctor\n"
+    "A2 ctor\n"
+    "B2 ctor\n"
+    "A0 use\n"
+    "A0 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 dtor\n"
+    "A2 dtor\n"
+    "A0 use\n"
+    "A0 use\n"
+    "A1 use\n"
+    "A3 ctor\n"
+    "A0 dtor\n"
+    "A3 dtor\n"
+    "A1 dtor\n",
+    history->GetString().c_str());
+}
+
+}  // Unnamed namespace
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-listener_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-listener_test.cc
new file mode 100644
index 0000000..99662cf
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-listener_test.cc
@@ -0,0 +1,310 @@
+// Copyright 2009 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This file verifies Google Test event listeners receive events at the
+// right times.
+
+#include "gtest/gtest.h"
+#include <vector>
+
+using ::testing::AddGlobalTestEnvironment;
+using ::testing::Environment;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListener;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+// Used by tests to register their events.
+std::vector<std::string>* g_events = NULL;
+
+namespace testing {
+namespace internal {
+
+class EventRecordingListener : public TestEventListener {
+ public:
+  explicit EventRecordingListener(const char* name) : name_(name) {}
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnTestProgramStart"));
+  }
+
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int iteration) {
+    Message message;
+    message << GetFullMethodName("OnTestIterationStart")
+            << "(" << iteration << ")";
+    g_events->push_back(message.GetString());
+  }
+
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
+  }
+
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
+  }
+
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {
+    g_events->push_back(GetFullMethodName("OnTestCaseStart"));
+  }
+
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {
+    g_events->push_back(GetFullMethodName("OnTestStart"));
+  }
+
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {
+    g_events->push_back(GetFullMethodName("OnTestPartResult"));
+  }
+
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {
+    g_events->push_back(GetFullMethodName("OnTestEnd"));
+  }
+
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {
+    g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
+  }
+
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
+  }
+
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
+  }
+
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int iteration) {
+    Message message;
+    message << GetFullMethodName("OnTestIterationEnd")
+            << "("  << iteration << ")";
+    g_events->push_back(message.GetString());
+  }
+
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
+  }
+
+ private:
+  std::string GetFullMethodName(const char* name) {
+    return name_ + "." + name;
+  }
+
+  std::string name_;
+};
+
+class EnvironmentInvocationCatcher : public Environment {
+ protected:
+  virtual void SetUp() {
+    g_events->push_back("Environment::SetUp");
+  }
+
+  virtual void TearDown() {
+    g_events->push_back("Environment::TearDown");
+  }
+};
+
+class ListenerTest : public Test {
+ protected:
+  static void SetUpTestCase() {
+    g_events->push_back("ListenerTest::SetUpTestCase");
+  }
+
+  static void TearDownTestCase() {
+    g_events->push_back("ListenerTest::TearDownTestCase");
+  }
+
+  virtual void SetUp() {
+    g_events->push_back("ListenerTest::SetUp");
+  }
+
+  virtual void TearDown() {
+    g_events->push_back("ListenerTest::TearDown");
+  }
+};
+
+TEST_F(ListenerTest, DoesFoo) {
+  // Test execution order within a test case is not guaranteed so we are not
+  // recording the test name.
+  g_events->push_back("ListenerTest::* Test Body");
+  SUCCEED();  // Triggers OnTestPartResult.
+}
+
+TEST_F(ListenerTest, DoesBar) {
+  g_events->push_back("ListenerTest::* Test Body");
+  SUCCEED();  // Triggers OnTestPartResult.
+}
+
+}  // namespace internal
+
+}  // namespace testing
+
+using ::testing::internal::EnvironmentInvocationCatcher;
+using ::testing::internal::EventRecordingListener;
+
+void VerifyResults(const std::vector<std::string>& data,
+                   const char* const* expected_data,
+                   int expected_data_size) {
+  const int actual_size = data.size();
+  // If the following assertion fails, a new entry will be appended to
+  // data.  Hence we save data.size() first.
+  EXPECT_EQ(expected_data_size, actual_size);
+
+  // Compares the common prefix.
+  const int shorter_size = expected_data_size <= actual_size ?
+      expected_data_size : actual_size;
+  int i = 0;
+  for (; i < shorter_size; ++i) {
+    ASSERT_STREQ(expected_data[i], data[i].c_str())
+        << "at position " << i;
+  }
+
+  // Prints extra elements in the actual data.
+  for (; i < actual_size; ++i) {
+    printf("  Actual event #%d: %s\n", i, data[i].c_str());
+  }
+}
+
+int main(int argc, char **argv) {
+  std::vector<std::string> events;
+  g_events = &events;
+  InitGoogleTest(&argc, argv);
+
+  UnitTest::GetInstance()->listeners().Append(
+      new EventRecordingListener("1st"));
+  UnitTest::GetInstance()->listeners().Append(
+      new EventRecordingListener("2nd"));
+
+  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
+
+  GTEST_CHECK_(events.size() == 0)
+      << "AddGlobalTestEnvironment should not generate any events itself.";
+
+  ::testing::GTEST_FLAG(repeat) = 2;
+  int ret_val = RUN_ALL_TESTS();
+
+  const char* const expected_events[] = {
+    "1st.OnTestProgramStart",
+    "2nd.OnTestProgramStart",
+    "1st.OnTestIterationStart(0)",
+    "2nd.OnTestIterationStart(0)",
+    "1st.OnEnvironmentsSetUpStart",
+    "2nd.OnEnvironmentsSetUpStart",
+    "Environment::SetUp",
+    "2nd.OnEnvironmentsSetUpEnd",
+    "1st.OnEnvironmentsSetUpEnd",
+    "1st.OnTestCaseStart",
+    "2nd.OnTestCaseStart",
+    "ListenerTest::SetUpTestCase",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "ListenerTest::TearDownTestCase",
+    "2nd.OnTestCaseEnd",
+    "1st.OnTestCaseEnd",
+    "1st.OnEnvironmentsTearDownStart",
+    "2nd.OnEnvironmentsTearDownStart",
+    "Environment::TearDown",
+    "2nd.OnEnvironmentsTearDownEnd",
+    "1st.OnEnvironmentsTearDownEnd",
+    "2nd.OnTestIterationEnd(0)",
+    "1st.OnTestIterationEnd(0)",
+    "1st.OnTestIterationStart(1)",
+    "2nd.OnTestIterationStart(1)",
+    "1st.OnEnvironmentsSetUpStart",
+    "2nd.OnEnvironmentsSetUpStart",
+    "Environment::SetUp",
+    "2nd.OnEnvironmentsSetUpEnd",
+    "1st.OnEnvironmentsSetUpEnd",
+    "1st.OnTestCaseStart",
+    "2nd.OnTestCaseStart",
+    "ListenerTest::SetUpTestCase",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "ListenerTest::TearDownTestCase",
+    "2nd.OnTestCaseEnd",
+    "1st.OnTestCaseEnd",
+    "1st.OnEnvironmentsTearDownStart",
+    "2nd.OnEnvironmentsTearDownStart",
+    "Environment::TearDown",
+    "2nd.OnEnvironmentsTearDownEnd",
+    "1st.OnEnvironmentsTearDownEnd",
+    "2nd.OnTestIterationEnd(1)",
+    "1st.OnTestIterationEnd(1)",
+    "2nd.OnTestProgramEnd",
+    "1st.OnTestProgramEnd"
+  };
+  VerifyResults(events,
+                expected_events,
+                sizeof(expected_events)/sizeof(expected_events[0]));
+
+  // We need to check manually for ad hoc test failures that happen after
+  // RUN_ALL_TESTS finishes.
+  if (UnitTest::GetInstance()->Failed())
+    ret_val = 1;
+
+  return ret_val;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-message_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-message_test.cc
new file mode 100644
index 0000000..175238e
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-message_test.cc
@@ -0,0 +1,159 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for the Message class.
+
+#include "gtest/gtest-message.h"
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::testing::Message;
+
+// Tests the testing::Message class
+
+// Tests the default constructor.
+TEST(MessageTest, DefaultConstructor) {
+  const Message msg;
+  EXPECT_EQ("", msg.GetString());
+}
+
+// Tests the copy constructor.
+TEST(MessageTest, CopyConstructor) {
+  const Message msg1("Hello");
+  const Message msg2(msg1);
+  EXPECT_EQ("Hello", msg2.GetString());
+}
+
+// Tests constructing a Message from a C-string.
+TEST(MessageTest, ConstructsFromCString) {
+  Message msg("Hello");
+  EXPECT_EQ("Hello", msg.GetString());
+}
+
+// Tests streaming a float.
+TEST(MessageTest, StreamsFloat) {
+  const std::string s = (Message() << 1.23456F << " " << 2.34567F).GetString();
+  // Both numbers should be printed with enough precision.
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1.234560", s.c_str());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 2.345669", s.c_str());
+}
+
+// Tests streaming a double.
+TEST(MessageTest, StreamsDouble) {
+  const std::string s = (Message() << 1260570880.4555497 << " "
+                                  << 1260572265.1954534).GetString();
+  // Both numbers should be printed with enough precision.
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1260570880.45", s.c_str());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 1260572265.19", s.c_str());
+}
+
+// Tests streaming a non-char pointer.
+TEST(MessageTest, StreamsPointer) {
+  int n = 0;
+  int* p = &n;
+  EXPECT_NE("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming a NULL non-char pointer.
+TEST(MessageTest, StreamsNullPointer) {
+  int* p = NULL;
+  EXPECT_EQ("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming a C string.
+TEST(MessageTest, StreamsCString) {
+  EXPECT_EQ("Foo", (Message() << "Foo").GetString());
+}
+
+// Tests streaming a NULL C string.
+TEST(MessageTest, StreamsNullCString) {
+  char* p = NULL;
+  EXPECT_EQ("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming std::string.
+TEST(MessageTest, StreamsString) {
+  const ::std::string str("Hello");
+  EXPECT_EQ("Hello", (Message() << str).GetString());
+}
+
+// Tests that we can output strings containing embedded NULs.
+TEST(MessageTest, StreamsStringWithEmbeddedNUL) {
+  const char char_array_with_nul[] =
+      "Here's a NUL\0 and some more string";
+  const ::std::string string_with_nul(char_array_with_nul,
+                                      sizeof(char_array_with_nul) - 1);
+  EXPECT_EQ("Here's a NUL\\0 and some more string",
+            (Message() << string_with_nul).GetString());
+}
+
+// Tests streaming a NUL char.
+TEST(MessageTest, StreamsNULChar) {
+  EXPECT_EQ("\\0", (Message() << '\0').GetString());
+}
+
+// Tests streaming int.
+TEST(MessageTest, StreamsInt) {
+  EXPECT_EQ("123", (Message() << 123).GetString());
+}
+
+// Tests that basic IO manipulators (endl, ends, and flush) can be
+// streamed to Message.
+TEST(MessageTest, StreamsBasicIoManip) {
+  EXPECT_EQ("Line 1.\nA NUL char \\0 in line 2.",
+               (Message() << "Line 1." << std::endl
+                         << "A NUL char " << std::ends << std::flush
+                         << " in line 2.").GetString());
+}
+
+// Tests Message::GetString()
+TEST(MessageTest, GetString) {
+  Message msg;
+  msg << 1 << " lamb";
+  EXPECT_EQ("1 lamb", msg.GetString());
+}
+
+// Tests streaming a Message object to an ostream.
+TEST(MessageTest, StreamsToOStream) {
+  Message msg("Hello");
+  ::std::stringstream ss;
+  ss << msg;
+  EXPECT_EQ("Hello", testing::internal::StringStreamToString(&ss));
+}
+
+// Tests that a Message object doesn't take up too much stack space.
+TEST(MessageTest, DoesNotTakeUpMuchStackSpace) {
+  EXPECT_LE(sizeof(Message), 16U);
+}
+
+}  // namespace
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-options_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-options_test.cc
new file mode 100644
index 0000000..5586dc3
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-options_test.cc
@@ -0,0 +1,215 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test UnitTestOptions tests
+//
+// This file tests classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included from gtest.cc, to avoid changing build or
+// make-files on Windows and other platforms. Do not #include this file
+// anywhere else!
+
+#include "gtest/gtest.h"
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+namespace {
+
+// Turns the given relative path into an absolute path.
+FilePath GetAbsolutePathOf(const FilePath& relative_path) {
+  return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);
+}
+
+// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
+
+TEST(XmlOutputTest, GetOutputFormatDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str());
+}
+
+TEST(XmlOutputTest, GetOutputFormat) {
+  GTEST_FLAG(output) = "xml:filename";
+  EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str());
+}
+
+TEST(XmlOutputTest, GetOutputFileDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_EQ(GetAbsolutePathOf(FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST(XmlOutputTest, GetOutputFileSingleFile) {
+  GTEST_FLAG(output) = "xml:filename.abc";
+  EXPECT_EQ(GetAbsolutePathOf(FilePath("filename.abc")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
+  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
+  const std::string expected_output_file =
+      GetAbsolutePathOf(
+          FilePath(std::string("path") + GTEST_PATH_SEP_ +
+                   GetCurrentExecutableName().string() + ".xml")).string();
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+TEST(OutputFileHelpersTest, GetCurrentExecutableName) {
+  const std::string exe_str = GetCurrentExecutableName().string();
+#if GTEST_OS_WINDOWS
+  const bool success =
+      _strcmpi("gtest-options_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest_all_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest_dll_test", exe_str.c_str()) == 0;
+#else
+  // TODO(wan at google.com): remove the hard-coded "lt-" prefix when
+  //   Chandler Carruth's libtool replacement is ready.
+  const bool success =
+      exe_str == "gtest-options_test" ||
+      exe_str == "gtest_all_test" ||
+      exe_str == "lt-gtest_all_test" ||
+      exe_str == "gtest_dll_test";
+#endif  // GTEST_OS_WINDOWS
+  if (!success)
+    FAIL() << "GetCurrentExecutableName() returns " << exe_str;
+}
+
+class XmlOutputChangeDirTest : public Test {
+ protected:
+  virtual void SetUp() {
+    original_working_dir_ = FilePath::GetCurrentDir();
+    posix::ChDir("..");
+    // This will make the test fail if run from the root directory.
+    EXPECT_NE(original_working_dir_.string(),
+              FilePath::GetCurrentDir().string());
+  }
+
+  virtual void TearDown() {
+    posix::ChDir(original_working_dir_.string().c_str());
+  }
+
+  FilePath original_working_dir_;
+};
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {
+  GTEST_FLAG(output) = "xml";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {
+  GTEST_FLAG(output) = "xml:filename.abc";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("filename.abc")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {
+  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
+  const std::string expected_output_file =
+      FilePath::ConcatPaths(
+          original_working_dir_,
+          FilePath(std::string("path") + GTEST_PATH_SEP_ +
+                   GetCurrentExecutableName().string() + ".xml")).string();
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {
+#if GTEST_OS_WINDOWS
+  GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc";
+  EXPECT_EQ(FilePath("c:\\tmp\\filename.abc").string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+#else
+  GTEST_FLAG(output) ="xml:/tmp/filename.abc";
+  EXPECT_EQ(FilePath("/tmp/filename.abc").string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+#endif
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {
+#if GTEST_OS_WINDOWS
+  const std::string path = "c:\\tmp\\";
+#else
+  const std::string path = "/tmp/";
+#endif
+
+  GTEST_FLAG(output) = "xml:" + path;
+  const std::string expected_output_file =
+      path + GetCurrentExecutableName().string() + ".xml";
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+}  // namespace
+}  // namespace internal
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test2_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test2_test.cc
new file mode 100644
index 0000000..4a782fe
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test2_test.cc
@@ -0,0 +1,65 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself.  This verifies that the basic constructs of
+// Google Test work.
+
+#include "gtest/gtest.h"
+
+#include "test/gtest-param-test_test.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+using ::testing::Values;
+using ::testing::internal::ParamGenerator;
+
+// Tests that generators defined in a different translation unit
+// are functional. The test using extern_gen is defined
+// in gtest-param-test_test.cc.
+ParamGenerator<int> extern_gen = Values(33);
+
+// Tests that a parameterized test case can be defined in one translation unit
+// and instantiated in another. The test is defined in gtest-param-test_test.cc
+// and ExternalInstantiationTest fixture class is defined in
+// gtest-param-test_test.h.
+INSTANTIATE_TEST_CASE_P(MultiplesOf33,
+                        ExternalInstantiationTest,
+                        Values(33, 66));
+
+// Tests that a parameterized test case can be instantiated
+// in multiple translation units. Another instantiation is defined
+// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest
+// fixture is defined in gtest-param-test_test.h
+INSTANTIATE_TEST_CASE_P(Sequence2,
+                        InstantiationInMultipleTranslaionUnitsTest,
+                        Values(42*3, 42*4, 42*5));
+
+#endif  // GTEST_HAS_PARAM_TEST
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test_test.cc
new file mode 100644
index 0000000..f60cb8a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test_test.cc
@@ -0,0 +1,904 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself. This file verifies that the parameter
+// generators objects produce correct parameter sequences and that
+// Google Test runtime instantiates correct tests from those sequences.
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+# include <algorithm>
+# include <iostream>
+# include <list>
+# include <sstream>
+# include <string>
+# include <vector>
+
+// To include gtest-internal-inl.h.
+# define GTEST_IMPLEMENTATION_ 1
+# include "src/gtest-internal-inl.h"  // for UnitTestOptions
+# undef GTEST_IMPLEMENTATION_
+
+# include "test/gtest-param-test_test.h"
+
+using ::std::vector;
+using ::std::sort;
+
+using ::testing::AddGlobalTestEnvironment;
+using ::testing::Bool;
+using ::testing::Message;
+using ::testing::Range;
+using ::testing::TestWithParam;
+using ::testing::Values;
+using ::testing::ValuesIn;
+
+# if GTEST_HAS_COMBINE
+using ::testing::Combine;
+using ::std::tr1::get;
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+# endif  // GTEST_HAS_COMBINE
+
+using ::testing::internal::ParamGenerator;
+using ::testing::internal::UnitTestOptions;
+
+// Prints a value to a string.
+//
+// TODO(wan at google.com): remove PrintValue() when we move matchers and
+// EXPECT_THAT() from Google Mock to Google Test.  At that time, we
+// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
+// EXPECT_THAT() and the matchers know how to print tuples.
+template <typename T>
+::std::string PrintValue(const T& value) {
+  ::std::stringstream stream;
+  stream << value;
+  return stream.str();
+}
+
+# if GTEST_HAS_COMBINE
+
+// These overloads allow printing tuples in our tests.  We cannot
+// define an operator<< for tuples, as that definition needs to be in
+// the std namespace in order to be picked up by Google Test via
+// Argument-Dependent Lookup, yet defining anything in the std
+// namespace in non-STL code is undefined behavior.
+
+template <typename T1, typename T2>
+::std::string PrintValue(const tuple<T1, T2>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
+  return stream.str();
+}
+
+template <typename T1, typename T2, typename T3>
+::std::string PrintValue(const tuple<T1, T2, T3>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value)
+         << ", "<< get<2>(value) << ")";
+  return stream.str();
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+::std::string PrintValue(
+    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value)
+         << ", "<< get<2>(value) << ", " << get<3>(value)
+         << ", "<< get<4>(value) << ", " << get<5>(value)
+         << ", "<< get<6>(value) << ", " << get<7>(value)
+         << ", "<< get<8>(value) << ", " << get<9>(value) << ")";
+  return stream.str();
+}
+
+# endif  // GTEST_HAS_COMBINE
+
+// Verifies that a sequence generated by the generator and accessed
+// via the iterator object matches the expected one using Google Test
+// assertions.
+template <typename T, size_t N>
+void VerifyGenerator(const ParamGenerator<T>& generator,
+                     const T (&expected_values)[N]) {
+  typename ParamGenerator<T>::iterator it = generator.begin();
+  for (size_t i = 0; i < N; ++i) {
+    ASSERT_FALSE(it == generator.end())
+        << "At element " << i << " when accessing via an iterator "
+        << "created with the copy constructor.\n";
+    // We cannot use EXPECT_EQ() here as the values may be tuples,
+    // which don't support <<.
+    EXPECT_TRUE(expected_values[i] == *it)
+        << "where i is " << i
+        << ", expected_values[i] is " << PrintValue(expected_values[i])
+        << ", *it is " << PrintValue(*it)
+        << ", and 'it' is an iterator created with the copy constructor.\n";
+    it++;
+  }
+  EXPECT_TRUE(it == generator.end())
+        << "At the presumed end of sequence when accessing via an iterator "
+        << "created with the copy constructor.\n";
+
+  // Test the iterator assignment. The following lines verify that
+  // the sequence accessed via an iterator initialized via the
+  // assignment operator (as opposed to a copy constructor) matches
+  // just the same.
+  it = generator.begin();
+  for (size_t i = 0; i < N; ++i) {
+    ASSERT_FALSE(it == generator.end())
+        << "At element " << i << " when accessing via an iterator "
+        << "created with the assignment operator.\n";
+    EXPECT_TRUE(expected_values[i] == *it)
+        << "where i is " << i
+        << ", expected_values[i] is " << PrintValue(expected_values[i])
+        << ", *it is " << PrintValue(*it)
+        << ", and 'it' is an iterator created with the copy constructor.\n";
+    it++;
+  }
+  EXPECT_TRUE(it == generator.end())
+        << "At the presumed end of sequence when accessing via an iterator "
+        << "created with the assignment operator.\n";
+}
+
+template <typename T>
+void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
+  typename ParamGenerator<T>::iterator it = generator.begin();
+  EXPECT_TRUE(it == generator.end());
+
+  it = generator.begin();
+  EXPECT_TRUE(it == generator.end());
+}
+
+// Generator tests. They test that each of the provided generator functions
+// generates an expected sequence of values. The general test pattern
+// instantiates a generator using one of the generator functions,
+// checks the sequence produced by the generator using its iterator API,
+// and then resets the iterator back to the beginning of the sequence
+// and checks the sequence again.
+
+// Tests that iterators produced by generator functions conform to the
+// ForwardIterator concept.
+TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
+  const ParamGenerator<int> gen = Range(0, 10);
+  ParamGenerator<int>::iterator it = gen.begin();
+
+  // Verifies that iterator initialization works as expected.
+  ParamGenerator<int>::iterator it2 = it;
+  EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
+                           << "element same as its source points to";
+
+  // Verifies that iterator assignment works as expected.
+  it++;
+  EXPECT_FALSE(*it == *it2);
+  it2 = it;
+  EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
+                           << "element same as its source points to";
+
+  // Verifies that prefix operator++() returns *this.
+  EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
+                          << "refer to the original object";
+
+  // Verifies that the result of the postfix operator++ points to the value
+  // pointed to by the original iterator.
+  int original_value = *it;  // Have to compute it outside of macro call to be
+                             // unaffected by the parameter evaluation order.
+  EXPECT_EQ(original_value, *(it++));
+
+  // Verifies that prefix and postfix operator++() advance an iterator
+  // all the same.
+  it2 = it;
+  it++;
+  ++it2;
+  EXPECT_TRUE(*it == *it2);
+}
+
+// Tests that Range() generates the expected sequence.
+TEST(RangeTest, IntRangeWithDefaultStep) {
+  const ParamGenerator<int> gen = Range(0, 3);
+  const int expected_values[] = {0, 1, 2};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that Range() generates the single element sequence
+// as expected when provided with range limits that are equal.
+TEST(RangeTest, IntRangeSingleValue) {
+  const ParamGenerator<int> gen = Range(0, 1);
+  const int expected_values[] = {0};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that Range() with generates empty sequence when
+// supplied with an empty range.
+TEST(RangeTest, IntRangeEmpty) {
+  const ParamGenerator<int> gen = Range(0, 0);
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that Range() with custom step (greater then one) generates
+// the expected sequence.
+TEST(RangeTest, IntRangeWithCustomStep) {
+  const ParamGenerator<int> gen = Range(0, 9, 3);
+  const int expected_values[] = {0, 3, 6};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Range() with custom step (greater then one) generates
+// the expected sequence when the last element does not fall on the
+// upper range limit. Sequences generated by Range() must not have
+// elements beyond the range limits.
+TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
+  const ParamGenerator<int> gen = Range(0, 4, 3);
+  const int expected_values[] = {0, 3};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Verifies that Range works with user-defined types that define
+// copy constructor, operator=(), operator+(), and operator<().
+class DogAdder {
+ public:
+  explicit DogAdder(const char* a_value) : value_(a_value) {}
+  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
+
+  DogAdder operator=(const DogAdder& other) {
+    if (this != &other)
+      value_ = other.value_;
+    return *this;
+  }
+  DogAdder operator+(const DogAdder& other) const {
+    Message msg;
+    msg << value_.c_str() << other.value_.c_str();
+    return DogAdder(msg.GetString().c_str());
+  }
+  bool operator<(const DogAdder& other) const {
+    return value_ < other.value_;
+  }
+  const std::string& value() const { return value_; }
+
+ private:
+  std::string value_;
+};
+
+TEST(RangeTest, WorksWithACustomType) {
+  const ParamGenerator<DogAdder> gen =
+      Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
+  ParamGenerator<DogAdder>::iterator it = gen.begin();
+
+  ASSERT_FALSE(it == gen.end());
+  EXPECT_STREQ("cat", it->value().c_str());
+
+  ASSERT_FALSE(++it == gen.end());
+  EXPECT_STREQ("catdog", it->value().c_str());
+
+  EXPECT_TRUE(++it == gen.end());
+}
+
+class IntWrapper {
+ public:
+  explicit IntWrapper(int a_value) : value_(a_value) {}
+  IntWrapper(const IntWrapper& other) : value_(other.value_) {}
+
+  IntWrapper operator=(const IntWrapper& other) {
+    value_ = other.value_;
+    return *this;
+  }
+  // operator+() adds a different type.
+  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
+  bool operator<(const IntWrapper& other) const {
+    return value_ < other.value_;
+  }
+  int value() const { return value_; }
+
+ private:
+  int value_;
+};
+
+TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
+  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
+  ParamGenerator<IntWrapper>::iterator it = gen.begin();
+
+  ASSERT_FALSE(it == gen.end());
+  EXPECT_EQ(0, it->value());
+
+  ASSERT_FALSE(++it == gen.end());
+  EXPECT_EQ(1, it->value());
+
+  EXPECT_TRUE(++it == gen.end());
+}
+
+// Tests that ValuesIn() with an array parameter generates
+// the expected sequence.
+TEST(ValuesInTest, ValuesInArray) {
+  int array[] = {3, 5, 8};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Tests that ValuesIn() with a const array parameter generates
+// the expected sequence.
+TEST(ValuesInTest, ValuesInConstArray) {
+  const int array[] = {3, 5, 8};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Edge case. Tests that ValuesIn() with an array parameter containing a
+// single element generates the single element sequence.
+TEST(ValuesInTest, ValuesInSingleElementArray) {
+  int array[] = {42};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Tests that ValuesIn() generates the expected sequence for an STL
+// container (vector).
+TEST(ValuesInTest, ValuesInVector) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(3);
+  values.push_back(5);
+  values.push_back(8);
+  const ParamGenerator<int> gen = ValuesIn(values);
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that ValuesIn() generates the expected sequence.
+TEST(ValuesInTest, ValuesInIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(3);
+  values.push_back(5);
+  values.push_back(8);
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that ValuesIn() provided with an iterator range specifying a
+// single value generates a single-element sequence.
+TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(42);
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  const int expected_values[] = {42};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that ValuesIn() provided with an empty iterator range
+// generates an empty sequence.
+TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that the Values() generates the expected sequence.
+TEST(ValuesTest, ValuesWorks) {
+  const ParamGenerator<int> gen = Values(3, 5, 8);
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Values() generates the expected sequences from elements of
+// different types convertible to ParamGenerator's parameter type.
+TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
+  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
+
+  const double expected_values[] = {3.0, 5.0, 8.0};
+  VerifyGenerator(gen, expected_values);
+}
+
+TEST(ValuesTest, ValuesWorksForMaxLengthList) {
+  const ParamGenerator<int> gen = Values(
+      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
+      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
+      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
+      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
+      410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
+
+  const int expected_values[] = {
+      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
+      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
+      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
+      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
+      410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case test. Tests that single-parameter Values() generates the sequence
+// with the single value.
+TEST(ValuesTest, ValuesWithSingleParameter) {
+  const ParamGenerator<int> gen = Values(42);
+
+  const int expected_values[] = {42};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Bool() generates sequence (false, true).
+TEST(BoolTest, BoolWorks) {
+  const ParamGenerator<bool> gen = Bool();
+
+  const bool expected_values[] = {false, true};
+  VerifyGenerator(gen, expected_values);
+}
+
+# if GTEST_HAS_COMBINE
+
+// Tests that Combine() with two parameters generates the expected sequence.
+TEST(CombineTest, CombineWithTwoParameters) {
+  const char* foo = "foo";
+  const char* bar = "bar";
+  const ParamGenerator<tuple<const char*, int> > gen =
+      Combine(Values(foo, bar), Values(3, 4));
+
+  tuple<const char*, int> expected_values[] = {
+    make_tuple(foo, 3), make_tuple(foo, 4),
+    make_tuple(bar, 3), make_tuple(bar, 4)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Combine() with three parameters generates the expected sequence.
+TEST(CombineTest, CombineWithThreeParameters) {
+  const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),
+                                                            Values(3, 4),
+                                                            Values(5, 6));
+  tuple<int, int, int> expected_values[] = {
+    make_tuple(0, 3, 5), make_tuple(0, 3, 6),
+    make_tuple(0, 4, 5), make_tuple(0, 4, 6),
+    make_tuple(1, 3, 5), make_tuple(1, 3, 6),
+    make_tuple(1, 4, 5), make_tuple(1, 4, 6)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that the Combine() with the first parameter generating a single value
+// sequence generates a sequence with the number of elements equal to the
+// number of elements in the sequence generated by the second parameter.
+TEST(CombineTest, CombineWithFirstParameterSingleValue) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),
+                                                       Values(0, 1));
+
+  tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that the Combine() with the second parameter generating a single value
+// sequence generates a sequence with the number of elements equal to the
+// number of elements in the sequence generated by the first parameter.
+TEST(CombineTest, CombineWithSecondParameterSingleValue) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
+                                                       Values(42));
+
+  tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that when the first parameter produces an empty sequence,
+// Combine() produces an empty sequence, too.
+TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),
+                                                       Values(0, 1));
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that when the second parameter produces an empty sequence,
+// Combine() produces an empty sequence, too.
+TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
+                                                       Range(1, 1));
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Edge case. Tests that combine works with the maximum number
+// of parameters supported by Google Test (currently 10).
+TEST(CombineTest, CombineWithMaxNumberOfParameters) {
+  const char* foo = "foo";
+  const char* bar = "bar";
+  const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,
+                             int, int> > gen = Combine(Values(foo, bar),
+                                                       Values(1), Values(2),
+                                                       Values(3), Values(4),
+                                                       Values(5), Values(6),
+                                                       Values(7), Values(8),
+                                                       Values(9));
+
+  tuple<const char*, int, int, int, int, int, int, int, int, int>
+      expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
+                           make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
+  VerifyGenerator(gen, expected_values);
+}
+
+# endif  // GTEST_HAS_COMBINE
+
+// Tests that an generator produces correct sequence after being
+// assigned from another generator.
+TEST(ParamGeneratorTest, AssignmentWorks) {
+  ParamGenerator<int> gen = Values(1, 2);
+  const ParamGenerator<int> gen2 = Values(3, 4);
+  gen = gen2;
+
+  const int expected_values[] = {3, 4};
+  VerifyGenerator(gen, expected_values);
+}
+
+// This test verifies that the tests are expanded and run as specified:
+// one test per element from the sequence produced by the generator
+// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's
+// fixture constructor, SetUp(), and TearDown() have run and have been
+// supplied with the correct parameters.
+
+// The use of environment object allows detection of the case where no test
+// case functionality is run at all. In this case TestCaseTearDown will not
+// be able to detect missing tests, naturally.
+template <int kExpectedCalls>
+class TestGenerationEnvironment : public ::testing::Environment {
+ public:
+  static TestGenerationEnvironment* Instance() {
+    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
+    return instance;
+  }
+
+  void FixtureConstructorExecuted() { fixture_constructor_count_++; }
+  void SetUpExecuted() { set_up_count_++; }
+  void TearDownExecuted() { tear_down_count_++; }
+  void TestBodyExecuted() { test_body_count_++; }
+
+  virtual void TearDown() {
+    // If all MultipleTestGenerationTest tests have been de-selected
+    // by the filter flag, the following checks make no sense.
+    bool perform_check = false;
+
+    for (int i = 0; i < kExpectedCalls; ++i) {
+      Message msg;
+      msg << "TestsExpandedAndRun/" << i;
+      if (UnitTestOptions::FilterMatchesTest(
+             "TestExpansionModule/MultipleTestGenerationTest",
+              msg.GetString().c_str())) {
+        perform_check = true;
+      }
+    }
+    if (perform_check) {
+      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
+          << "Fixture constructor of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, set_up_count_)
+          << "Fixture SetUp method of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, tear_down_count_)
+          << "Fixture TearDown method of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, test_body_count_)
+          << "Test in ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+    }
+  }
+
+ private:
+  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
+                                tear_down_count_(0), test_body_count_(0) {}
+
+  int fixture_constructor_count_;
+  int set_up_count_;
+  int tear_down_count_;
+  int test_body_count_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
+};
+
+const int test_generation_params[] = {36, 42, 72};
+
+class TestGenerationTest : public TestWithParam<int> {
+ public:
+  enum {
+    PARAMETER_COUNT =
+        sizeof(test_generation_params)/sizeof(test_generation_params[0])
+  };
+
+  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
+
+  TestGenerationTest() {
+    Environment::Instance()->FixtureConstructorExecuted();
+    current_parameter_ = GetParam();
+  }
+  virtual void SetUp() {
+    Environment::Instance()->SetUpExecuted();
+    EXPECT_EQ(current_parameter_, GetParam());
+  }
+  virtual void TearDown() {
+    Environment::Instance()->TearDownExecuted();
+    EXPECT_EQ(current_parameter_, GetParam());
+  }
+
+  static void SetUpTestCase() {
+    bool all_tests_in_test_case_selected = true;
+
+    for (int i = 0; i < PARAMETER_COUNT; ++i) {
+      Message test_name;
+      test_name << "TestsExpandedAndRun/" << i;
+      if ( !UnitTestOptions::FilterMatchesTest(
+                "TestExpansionModule/MultipleTestGenerationTest",
+                test_name.GetString())) {
+        all_tests_in_test_case_selected = false;
+      }
+    }
+    EXPECT_TRUE(all_tests_in_test_case_selected)
+        << "When running the TestGenerationTest test case all of its tests\n"
+        << "must be selected by the filter flag for the test case to pass.\n"
+        << "If not all of them are enabled, we can't reliably conclude\n"
+        << "that the correct number of tests have been generated.";
+
+    collected_parameters_.clear();
+  }
+
+  static void TearDownTestCase() {
+    vector<int> expected_values(test_generation_params,
+                                test_generation_params + PARAMETER_COUNT);
+    // Test execution order is not guaranteed by Google Test,
+    // so the order of values in collected_parameters_ can be
+    // different and we have to sort to compare.
+    sort(expected_values.begin(), expected_values.end());
+    sort(collected_parameters_.begin(), collected_parameters_.end());
+
+    EXPECT_TRUE(collected_parameters_ == expected_values);
+  }
+
+ protected:
+  int current_parameter_;
+  static vector<int> collected_parameters_;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
+};
+vector<int> TestGenerationTest::collected_parameters_;
+
+TEST_P(TestGenerationTest, TestsExpandedAndRun) {
+  Environment::Instance()->TestBodyExecuted();
+  EXPECT_EQ(current_parameter_, GetParam());
+  collected_parameters_.push_back(GetParam());
+}
+INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,
+                        ValuesIn(test_generation_params));
+
+// This test verifies that the element sequence (third parameter of
+// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at
+// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS().  For
+// that, we declare param_value_ to be a static member of
+// GeneratorEvaluationTest and initialize it to 0.  We set it to 1 in
+// main(), just before invocation of InitGoogleTest().  After calling
+// InitGoogleTest(), we set the value to 2.  If the sequence is evaluated
+// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a
+// test with parameter other than 1, and the test body will fail the
+// assertion.
+class GeneratorEvaluationTest : public TestWithParam<int> {
+ public:
+  static int param_value() { return param_value_; }
+  static void set_param_value(int param_value) { param_value_ = param_value; }
+
+ private:
+  static int param_value_;
+};
+int GeneratorEvaluationTest::param_value_ = 0;
+
+TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
+  EXPECT_EQ(1, GetParam());
+}
+INSTANTIATE_TEST_CASE_P(GenEvalModule,
+                        GeneratorEvaluationTest,
+                        Values(GeneratorEvaluationTest::param_value()));
+
+// Tests that generators defined in a different translation unit are
+// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
+extern ParamGenerator<int> extern_gen;
+class ExternalGeneratorTest : public TestWithParam<int> {};
+TEST_P(ExternalGeneratorTest, ExternalGenerator) {
+  // Sequence produced by extern_gen contains only a single value
+  // which we verify here.
+  EXPECT_EQ(GetParam(), 33);
+}
+INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,
+                        ExternalGeneratorTest,
+                        extern_gen);
+
+// Tests that a parameterized test case can be defined in one translation
+// unit and instantiated in another. This test will be instantiated in
+// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
+// defined in gtest-param-test_test.h.
+TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
+  EXPECT_EQ(0, GetParam() % 33);
+}
+
+// Tests that a parameterized test case can be instantiated with multiple
+// generators.
+class MultipleInstantiationTest : public TestWithParam<int> {};
+TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
+}
+INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
+INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
+
+// Tests that a parameterized test case can be instantiated
+// in multiple translation units. This test will be instantiated
+// here and in gtest-param-test_test2.cc.
+// InstantiationInMultipleTranslationUnitsTest fixture class
+// is defined in gtest-param-test_test.h.
+TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
+  EXPECT_EQ(0, GetParam() % 42);
+}
+INSTANTIATE_TEST_CASE_P(Sequence1,
+                        InstantiationInMultipleTranslaionUnitsTest,
+                        Values(42, 42*2));
+
+// Tests that each iteration of parameterized test runs in a separate test
+// object.
+class SeparateInstanceTest : public TestWithParam<int> {
+ public:
+  SeparateInstanceTest() : count_(0) {}
+
+  static void TearDownTestCase() {
+    EXPECT_GE(global_count_, 2)
+        << "If some (but not all) SeparateInstanceTest tests have been "
+        << "filtered out this test will fail. Make sure that all "
+        << "GeneratorEvaluationTest are selected or de-selected together "
+        << "by the test filter.";
+  }
+
+ protected:
+  int count_;
+  static int global_count_;
+};
+int SeparateInstanceTest::global_count_ = 0;
+
+TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
+  EXPECT_EQ(0, count_++);
+  global_count_++;
+}
+INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
+
+// Tests that all instantiations of a test have named appropriately. Test
+// defined with TEST_P(TestCaseName, TestName) and instantiated with
+// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named
+// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the
+// sequence element used to instantiate the test.
+class NamingTest : public TestWithParam<int> {};
+
+TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
+  const ::testing::TestInfo* const test_info =
+     ::testing::UnitTest::GetInstance()->current_test_info();
+
+  EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name());
+
+  Message index_stream;
+  index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
+  EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
+
+  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
+}
+
+INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
+
+// Class that cannot be streamed into an ostream.  It needs to be copyable
+// (and, in case of MSVC, also assignable) in order to be a test parameter
+// type.  Its default copy constructor and assignment operator do exactly
+// what we need.
+class Unstreamable {
+ public:
+  explicit Unstreamable(int value) : value_(value) {}
+
+ private:
+  int value_;
+};
+
+class CommentTest : public TestWithParam<Unstreamable> {};
+
+TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
+  const ::testing::TestInfo* const test_info =
+     ::testing::UnitTest::GetInstance()->current_test_info();
+
+  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
+}
+
+INSTANTIATE_TEST_CASE_P(InstantiationWithComments,
+                        CommentTest,
+                        Values(Unstreamable(1)));
+
+// Verify that we can create a hierarchy of test fixtures, where the base
+// class fixture is not parameterized and the derived class is. In this case
+// ParameterizedDerivedTest inherits from NonParameterizedBaseTest.  We
+// perform simple tests on both.
+class NonParameterizedBaseTest : public ::testing::Test {
+ public:
+  NonParameterizedBaseTest() : n_(17) { }
+ protected:
+  int n_;
+};
+
+class ParameterizedDerivedTest : public NonParameterizedBaseTest,
+                                 public ::testing::WithParamInterface<int> {
+ protected:
+  ParameterizedDerivedTest() : count_(0) { }
+  int count_;
+  static int global_count_;
+};
+
+int ParameterizedDerivedTest::global_count_ = 0;
+
+TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
+  EXPECT_EQ(17, n_);
+}
+
+TEST_P(ParameterizedDerivedTest, SeesSequence) {
+  EXPECT_EQ(17, n_);
+  EXPECT_EQ(0, count_++);
+  EXPECT_EQ(GetParam(), global_count_++);
+}
+
+class ParameterizedDeathTest : public ::testing::TestWithParam<int> { };
+
+TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
+  EXPECT_DEATH_IF_SUPPORTED(GetParam(),
+                            ".* value-parameterized test .*");
+}
+
+INSTANTIATE_TEST_CASE_P(RangeZeroToFive, ParameterizedDerivedTest, Range(0, 5));
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {
+#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST
+  FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n"
+#endif
+}
+
+int main(int argc, char **argv) {
+#if GTEST_HAS_PARAM_TEST
+  // Used in TestGenerationTest test case.
+  AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
+  // Used in GeneratorEvaluationTest test case. Tests that the updated value
+  // will be picked up for instantiating tests in GeneratorEvaluationTest.
+  GeneratorEvaluationTest::set_param_value(1);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  ::testing::InitGoogleTest(&argc, argv);
+
+#if GTEST_HAS_PARAM_TEST
+  // Used in GeneratorEvaluationTest test case. Tests that value updated
+  // here will NOT be used for instantiating tests in
+  // GeneratorEvaluationTest.
+  GeneratorEvaluationTest::set_param_value(2);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test_test.h b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test_test.h
new file mode 100644
index 0000000..26ea122
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-param-test_test.h
@@ -0,0 +1,57 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file provides classes and functions used internally
+// for testing Google Test itself.
+
+#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
+#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+// Test fixture for testing definition and instantiation of a test
+// in separate translation units.
+class ExternalInstantiationTest : public ::testing::TestWithParam<int> {
+};
+
+// Test fixture for testing instantiation of a test in multiple
+// translation units.
+class InstantiationInMultipleTranslaionUnitsTest
+    : public ::testing::TestWithParam<int> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-port_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-port_test.cc
new file mode 100644
index 0000000..43f1f20
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-port_test.cc
@@ -0,0 +1,1253 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev), wan at google.com (Zhanyong Wan)
+//
+// This file tests the internal cross-platform support utilities.
+
+#include "gtest/internal/gtest-port.h"
+
+#include <stdio.h>
+
+#if GTEST_OS_MAC
+# include <time.h>
+#endif  // GTEST_OS_MAC
+
+#include <list>
+#include <utility>  // For std::pair and std::make_pair.
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using std::make_pair;
+using std::pair;
+
+namespace testing {
+namespace internal {
+
+TEST(IsXDigitTest, WorksForNarrowAscii) {
+  EXPECT_TRUE(IsXDigit('0'));
+  EXPECT_TRUE(IsXDigit('9'));
+  EXPECT_TRUE(IsXDigit('A'));
+  EXPECT_TRUE(IsXDigit('F'));
+  EXPECT_TRUE(IsXDigit('a'));
+  EXPECT_TRUE(IsXDigit('f'));
+
+  EXPECT_FALSE(IsXDigit('-'));
+  EXPECT_FALSE(IsXDigit('g'));
+  EXPECT_FALSE(IsXDigit('G'));
+}
+
+TEST(IsXDigitTest, ReturnsFalseForNarrowNonAscii) {
+  EXPECT_FALSE(IsXDigit(static_cast<char>(0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<char>('0' | 0x80)));
+}
+
+TEST(IsXDigitTest, WorksForWideAscii) {
+  EXPECT_TRUE(IsXDigit(L'0'));
+  EXPECT_TRUE(IsXDigit(L'9'));
+  EXPECT_TRUE(IsXDigit(L'A'));
+  EXPECT_TRUE(IsXDigit(L'F'));
+  EXPECT_TRUE(IsXDigit(L'a'));
+  EXPECT_TRUE(IsXDigit(L'f'));
+
+  EXPECT_FALSE(IsXDigit(L'-'));
+  EXPECT_FALSE(IsXDigit(L'g'));
+  EXPECT_FALSE(IsXDigit(L'G'));
+}
+
+TEST(IsXDigitTest, ReturnsFalseForWideNonAscii) {
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x100)));
+}
+
+class Base {
+ public:
+  // Copy constructor and assignment operator do exactly what we need, so we
+  // use them.
+  Base() : member_(0) {}
+  explicit Base(int n) : member_(n) {}
+  virtual ~Base() {}
+  int member() { return member_; }
+
+ private:
+  int member_;
+};
+
+class Derived : public Base {
+ public:
+  explicit Derived(int n) : Base(n) {}
+};
+
+TEST(ImplicitCastTest, ConvertsPointers) {
+  Derived derived(0);
+  EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived));
+}
+
+TEST(ImplicitCastTest, CanUseInheritance) {
+  Derived derived(1);
+  Base base = ::testing::internal::ImplicitCast_<Base>(derived);
+  EXPECT_EQ(derived.member(), base.member());
+}
+
+class Castable {
+ public:
+  explicit Castable(bool* converted) : converted_(converted) {}
+  operator Base() {
+    *converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+};
+
+TEST(ImplicitCastTest, CanUseNonConstCastOperator) {
+  bool converted = false;
+  Castable castable(&converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
+  EXPECT_TRUE(converted);
+}
+
+class ConstCastable {
+ public:
+  explicit ConstCastable(bool* converted) : converted_(converted) {}
+  operator Base() const {
+    *converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+};
+
+TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) {
+  bool converted = false;
+  const ConstCastable const_castable(&converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(const_castable);
+  EXPECT_TRUE(converted);
+}
+
+class ConstAndNonConstCastable {
+ public:
+  ConstAndNonConstCastable(bool* converted, bool* const_converted)
+      : converted_(converted), const_converted_(const_converted) {}
+  operator Base() {
+    *converted_ = true;
+    return Base();
+  }
+  operator Base() const {
+    *const_converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+  bool* const_converted_;
+};
+
+TEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) {
+  bool converted = false;
+  bool const_converted = false;
+  ConstAndNonConstCastable castable(&converted, &const_converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
+  EXPECT_TRUE(converted);
+  EXPECT_FALSE(const_converted);
+
+  converted = false;
+  const_converted = false;
+  const ConstAndNonConstCastable const_castable(&converted, &const_converted);
+  base = ::testing::internal::ImplicitCast_<Base>(const_castable);
+  EXPECT_FALSE(converted);
+  EXPECT_TRUE(const_converted);
+}
+
+class To {
+ public:
+  To(bool* converted) { *converted = true; }  // NOLINT
+};
+
+TEST(ImplicitCastTest, CanUseImplicitConstructor) {
+  bool converted = false;
+  To to = ::testing::internal::ImplicitCast_<To>(&converted);
+  (void)to;
+  EXPECT_TRUE(converted);
+}
+
+TEST(IteratorTraitsTest, WorksForSTLContainerIterators) {
+  StaticAssertTypeEq<int,
+      IteratorTraits< ::std::vector<int>::const_iterator>::value_type>();
+  StaticAssertTypeEq<bool,
+      IteratorTraits< ::std::list<bool>::iterator>::value_type>();
+}
+
+TEST(IteratorTraitsTest, WorksForPointerToNonConst) {
+  StaticAssertTypeEq<char, IteratorTraits<char*>::value_type>();
+  StaticAssertTypeEq<const void*, IteratorTraits<const void**>::value_type>();
+}
+
+TEST(IteratorTraitsTest, WorksForPointerToConst) {
+  StaticAssertTypeEq<char, IteratorTraits<const char*>::value_type>();
+  StaticAssertTypeEq<const void*,
+      IteratorTraits<const void* const*>::value_type>();
+}
+
+// Tests that the element_type typedef is available in scoped_ptr and refers
+// to the parameter type.
+TEST(ScopedPtrTest, DefinesElementType) {
+  StaticAssertTypeEq<int, ::testing::internal::scoped_ptr<int>::element_type>();
+}
+
+// TODO(vladl at google.com): Implement THE REST of scoped_ptr tests.
+
+TEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {
+  if (AlwaysFalse())
+    GTEST_CHECK_(false) << "This should never be executed; "
+                           "It's a compilation test only.";
+
+  if (AlwaysTrue())
+    GTEST_CHECK_(true);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    GTEST_CHECK_(true) << "";
+}
+
+TEST(GtestCheckSyntaxTest, WorksWithSwitch) {
+  switch (0) {
+    case 1:
+      break;
+    default:
+      GTEST_CHECK_(true);
+  }
+
+  switch (0)
+    case 0:
+      GTEST_CHECK_(true) << "Check failed in switch case";
+}
+
+// Verifies behavior of FormatFileLocation.
+TEST(FormatFileLocationTest, FormatsFileLocation) {
+  EXPECT_PRED_FORMAT2(IsSubstring, "foo.cc", FormatFileLocation("foo.cc", 42));
+  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation("foo.cc", 42));
+}
+
+TEST(FormatFileLocationTest, FormatsUnknownFile) {
+  EXPECT_PRED_FORMAT2(
+      IsSubstring, "unknown file", FormatFileLocation(NULL, 42));
+  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation(NULL, 42));
+}
+
+TEST(FormatFileLocationTest, FormatsUknownLine) {
+  EXPECT_EQ("foo.cc:", FormatFileLocation("foo.cc", -1));
+}
+
+TEST(FormatFileLocationTest, FormatsUknownFileAndLine) {
+  EXPECT_EQ("unknown file:", FormatFileLocation(NULL, -1));
+}
+
+// Verifies behavior of FormatCompilerIndependentFileLocation.
+TEST(FormatCompilerIndependentFileLocationTest, FormatsFileLocation) {
+  EXPECT_EQ("foo.cc:42", FormatCompilerIndependentFileLocation("foo.cc", 42));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFile) {
+  EXPECT_EQ("unknown file:42",
+            FormatCompilerIndependentFileLocation(NULL, 42));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownLine) {
+  EXPECT_EQ("foo.cc", FormatCompilerIndependentFileLocation("foo.cc", -1));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) {
+  EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1));
+}
+
+#if GTEST_OS_MAC || GTEST_OS_QNX
+void* ThreadFunc(void* data) {
+  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data);
+  pthread_mutex_lock(mutex);
+  pthread_mutex_unlock(mutex);
+  return NULL;
+}
+
+TEST(GetThreadCountTest, ReturnsCorrectValue) {
+  EXPECT_EQ(1U, GetThreadCount());
+  pthread_mutex_t mutex;
+  pthread_attr_t  attr;
+  pthread_t       thread_id;
+
+  // TODO(vladl at google.com): turn mutex into internal::Mutex for automatic
+  // destruction.
+  pthread_mutex_init(&mutex, NULL);
+  pthread_mutex_lock(&mutex);
+  ASSERT_EQ(0, pthread_attr_init(&attr));
+  ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
+
+  const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex);
+  ASSERT_EQ(0, pthread_attr_destroy(&attr));
+  ASSERT_EQ(0, status);
+  EXPECT_EQ(2U, GetThreadCount());
+  pthread_mutex_unlock(&mutex);
+
+  void* dummy;
+  ASSERT_EQ(0, pthread_join(thread_id, &dummy));
+
+# if GTEST_OS_MAC
+
+  // MacOS X may not immediately report the updated thread count after
+  // joining a thread, causing flakiness in this test. To counter that, we
+  // wait for up to .5 seconds for the OS to report the correct value.
+  for (int i = 0; i < 5; ++i) {
+    if (GetThreadCount() == 1)
+      break;
+
+    SleepMilliseconds(100);
+  }
+
+# endif  // GTEST_OS_MAC
+
+  EXPECT_EQ(1U, GetThreadCount());
+  pthread_mutex_destroy(&mutex);
+}
+#else
+TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {
+  EXPECT_EQ(0U, GetThreadCount());
+}
+#endif  // GTEST_OS_MAC || GTEST_OS_QNX
+
+TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
+  const bool a_false_condition = false;
+  const char regex[] =
+#ifdef _MSC_VER
+     "gtest-port_test\\.cc\\(\\d+\\):"
+#elif GTEST_USES_POSIX_RE
+     "gtest-port_test\\.cc:[0-9]+"
+#else
+     "gtest-port_test\\.cc:\\d+"
+#endif  // _MSC_VER
+     ".*a_false_condition.*Extra info.*";
+
+  EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info",
+                            regex);
+}
+
+#if GTEST_HAS_DEATH_TEST
+
+TEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {
+  EXPECT_EXIT({
+      GTEST_CHECK_(true) << "Extra info";
+      ::std::cerr << "Success\n";
+      exit(0); },
+      ::testing::ExitedWithCode(0), "Success");
+}
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Verifies that Google Test choose regular expression engine appropriate to
+// the platform. The test will produce compiler errors in case of failure.
+// For simplicity, we only cover the most important platforms here.
+TEST(RegexEngineSelectionTest, SelectsCorrectRegexEngine) {
+#if GTEST_HAS_POSIX_RE
+
+  EXPECT_TRUE(GTEST_USES_POSIX_RE);
+
+#else
+
+  EXPECT_TRUE(GTEST_USES_SIMPLE_RE);
+
+#endif
+}
+
+#if GTEST_USES_POSIX_RE
+
+# if GTEST_HAS_TYPED_TEST
+
+template <typename Str>
+class RETest : public ::testing::Test {};
+
+// Defines StringTypes as the list of all string types that class RE
+// supports.
+typedef testing::Types<
+    ::std::string,
+#  if GTEST_HAS_GLOBAL_STRING
+    ::string,
+#  endif  // GTEST_HAS_GLOBAL_STRING
+    const char*> StringTypes;
+
+TYPED_TEST_CASE(RETest, StringTypes);
+
+// Tests RE's implicit constructors.
+TYPED_TEST(RETest, ImplicitConstructorWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_STREQ("", empty.pattern());
+
+  const RE simple(TypeParam("hello"));
+  EXPECT_STREQ("hello", simple.pattern());
+
+  const RE normal(TypeParam(".*(\\w+)"));
+  EXPECT_STREQ(".*(\\w+)", normal.pattern());
+}
+
+// Tests that RE's constructors reject invalid regular expressions.
+TYPED_TEST(RETest, RejectsInvalidRegex) {
+  EXPECT_NONFATAL_FAILURE({
+    const RE invalid(TypeParam("?"));
+  }, "\"?\" is not a valid POSIX Extended regular expression.");
+}
+
+// Tests RE::FullMatch().
+TYPED_TEST(RETest, FullMatchWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty));
+
+  const RE re(TypeParam("a.*z"));
+  EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re));
+  EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re));
+}
+
+// Tests RE::PartialMatch().
+TYPED_TEST(RETest, PartialMatchWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty));
+
+  const RE re(TypeParam("a.*z"));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re));
+  EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re));
+}
+
+# endif  // GTEST_HAS_TYPED_TEST
+
+#elif GTEST_USES_SIMPLE_RE
+
+TEST(IsInSetTest, NulCharIsNotInAnySet) {
+  EXPECT_FALSE(IsInSet('\0', ""));
+  EXPECT_FALSE(IsInSet('\0', "\0"));
+  EXPECT_FALSE(IsInSet('\0', "a"));
+}
+
+TEST(IsInSetTest, WorksForNonNulChars) {
+  EXPECT_FALSE(IsInSet('a', "Ab"));
+  EXPECT_FALSE(IsInSet('c', ""));
+
+  EXPECT_TRUE(IsInSet('b', "bcd"));
+  EXPECT_TRUE(IsInSet('b', "ab"));
+}
+
+TEST(IsAsciiDigitTest, IsFalseForNonDigit) {
+  EXPECT_FALSE(IsAsciiDigit('\0'));
+  EXPECT_FALSE(IsAsciiDigit(' '));
+  EXPECT_FALSE(IsAsciiDigit('+'));
+  EXPECT_FALSE(IsAsciiDigit('-'));
+  EXPECT_FALSE(IsAsciiDigit('.'));
+  EXPECT_FALSE(IsAsciiDigit('a'));
+}
+
+TEST(IsAsciiDigitTest, IsTrueForDigit) {
+  EXPECT_TRUE(IsAsciiDigit('0'));
+  EXPECT_TRUE(IsAsciiDigit('1'));
+  EXPECT_TRUE(IsAsciiDigit('5'));
+  EXPECT_TRUE(IsAsciiDigit('9'));
+}
+
+TEST(IsAsciiPunctTest, IsFalseForNonPunct) {
+  EXPECT_FALSE(IsAsciiPunct('\0'));
+  EXPECT_FALSE(IsAsciiPunct(' '));
+  EXPECT_FALSE(IsAsciiPunct('\n'));
+  EXPECT_FALSE(IsAsciiPunct('a'));
+  EXPECT_FALSE(IsAsciiPunct('0'));
+}
+
+TEST(IsAsciiPunctTest, IsTrueForPunct) {
+  for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) {
+    EXPECT_PRED1(IsAsciiPunct, *p);
+  }
+}
+
+TEST(IsRepeatTest, IsFalseForNonRepeatChar) {
+  EXPECT_FALSE(IsRepeat('\0'));
+  EXPECT_FALSE(IsRepeat(' '));
+  EXPECT_FALSE(IsRepeat('a'));
+  EXPECT_FALSE(IsRepeat('1'));
+  EXPECT_FALSE(IsRepeat('-'));
+}
+
+TEST(IsRepeatTest, IsTrueForRepeatChar) {
+  EXPECT_TRUE(IsRepeat('?'));
+  EXPECT_TRUE(IsRepeat('*'));
+  EXPECT_TRUE(IsRepeat('+'));
+}
+
+TEST(IsAsciiWhiteSpaceTest, IsFalseForNonWhiteSpace) {
+  EXPECT_FALSE(IsAsciiWhiteSpace('\0'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('a'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('1'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('+'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('_'));
+}
+
+TEST(IsAsciiWhiteSpaceTest, IsTrueForWhiteSpace) {
+  EXPECT_TRUE(IsAsciiWhiteSpace(' '));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\n'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\r'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\t'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\v'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\f'));
+}
+
+TEST(IsAsciiWordCharTest, IsFalseForNonWordChar) {
+  EXPECT_FALSE(IsAsciiWordChar('\0'));
+  EXPECT_FALSE(IsAsciiWordChar('+'));
+  EXPECT_FALSE(IsAsciiWordChar('.'));
+  EXPECT_FALSE(IsAsciiWordChar(' '));
+  EXPECT_FALSE(IsAsciiWordChar('\n'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForLetter) {
+  EXPECT_TRUE(IsAsciiWordChar('a'));
+  EXPECT_TRUE(IsAsciiWordChar('b'));
+  EXPECT_TRUE(IsAsciiWordChar('A'));
+  EXPECT_TRUE(IsAsciiWordChar('Z'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForDigit) {
+  EXPECT_TRUE(IsAsciiWordChar('0'));
+  EXPECT_TRUE(IsAsciiWordChar('1'));
+  EXPECT_TRUE(IsAsciiWordChar('7'));
+  EXPECT_TRUE(IsAsciiWordChar('9'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForUnderscore) {
+  EXPECT_TRUE(IsAsciiWordChar('_'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForNonPrintable) {
+  EXPECT_FALSE(IsValidEscape('\0'));
+  EXPECT_FALSE(IsValidEscape('\007'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForDigit) {
+  EXPECT_FALSE(IsValidEscape('0'));
+  EXPECT_FALSE(IsValidEscape('9'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForWhiteSpace) {
+  EXPECT_FALSE(IsValidEscape(' '));
+  EXPECT_FALSE(IsValidEscape('\n'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForSomeLetter) {
+  EXPECT_FALSE(IsValidEscape('a'));
+  EXPECT_FALSE(IsValidEscape('Z'));
+}
+
+TEST(IsValidEscapeTest, IsTrueForPunct) {
+  EXPECT_TRUE(IsValidEscape('.'));
+  EXPECT_TRUE(IsValidEscape('-'));
+  EXPECT_TRUE(IsValidEscape('^'));
+  EXPECT_TRUE(IsValidEscape('$'));
+  EXPECT_TRUE(IsValidEscape('('));
+  EXPECT_TRUE(IsValidEscape(']'));
+  EXPECT_TRUE(IsValidEscape('{'));
+  EXPECT_TRUE(IsValidEscape('|'));
+}
+
+TEST(IsValidEscapeTest, IsTrueForSomeLetter) {
+  EXPECT_TRUE(IsValidEscape('d'));
+  EXPECT_TRUE(IsValidEscape('D'));
+  EXPECT_TRUE(IsValidEscape('s'));
+  EXPECT_TRUE(IsValidEscape('S'));
+  EXPECT_TRUE(IsValidEscape('w'));
+  EXPECT_TRUE(IsValidEscape('W'));
+}
+
+TEST(AtomMatchesCharTest, EscapedPunct) {
+  EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, '\\', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));
+  EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\'));
+  EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));
+  EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));
+  EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_d) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_D) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_s) {
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));
+  EXPECT_TRUE(AtomMatchesChar(true, 's', '\n'));
+  EXPECT_TRUE(AtomMatchesChar(true, 's', '\t'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_S) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_w) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_W) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n'));
+}
+
+TEST(AtomMatchesCharTest, EscapedWhiteSpace) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 't', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r'));
+  EXPECT_TRUE(AtomMatchesChar(true, 't', '\t'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v'));
+}
+
+TEST(AtomMatchesCharTest, UnescapedDot) {
+  EXPECT_FALSE(AtomMatchesChar(false, '.', '\n'));
+
+  EXPECT_TRUE(AtomMatchesChar(false, '.', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));
+}
+
+TEST(AtomMatchesCharTest, UnescapedChar) {
+  EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));
+  EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));
+
+  EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));
+  EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));
+  EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));
+}
+
+TEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),
+                          "NULL is not a valid simple regular expression");
+  EXPECT_NONFATAL_FAILURE(
+      ASSERT_FALSE(ValidateRegex("a\\")),
+      "Syntax error at index 1 in simple regular expression \"a\\\": ");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")),
+                          "'\\' cannot appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")),
+                          "'\\' cannot appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")),
+                          "invalid escape sequence \"\\h\"");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")),
+                          "'^' can only appear at the beginning");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")),
+                          "'^' can only appear at the beginning");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")),
+                          "'$' can only appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")),
+                          "'$' can only appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")),
+                          "'(' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")),
+                          "')' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")),
+                          "'[' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")),
+                          "'{' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")),
+                          "'?' can only follow a repeatable token");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")),
+                          "'*' can only follow a repeatable token");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")),
+                          "'+' can only follow a repeatable token");
+}
+
+TEST(ValidateRegexTest, ReturnsTrueForValid) {
+  EXPECT_TRUE(ValidateRegex(""));
+  EXPECT_TRUE(ValidateRegex("a"));
+  EXPECT_TRUE(ValidateRegex(".*"));
+  EXPECT_TRUE(ValidateRegex("^a_+"));
+  EXPECT_TRUE(ValidateRegex("^a\\t\\&?"));
+  EXPECT_TRUE(ValidateRegex("09*$"));
+  EXPECT_TRUE(ValidateRegex("^Z$"));
+  EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba"));
+  // Repeating more than once.
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab"));
+
+  // Repeating zero times.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba"));
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab"));
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab"));
+
+  // Repeating zero times.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc"));
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc"));
+  // Repeating more than once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab"));
+  // Repeating zero times.
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc"));
+
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc"));
+  // Repeating more than once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g"));
+}
+
+TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {
+  EXPECT_TRUE(MatchRegexAtHead("", ""));
+  EXPECT_TRUE(MatchRegexAtHead("", "ab"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {
+  EXPECT_FALSE(MatchRegexAtHead("$", "a"));
+
+  EXPECT_TRUE(MatchRegexAtHead("$", ""));
+  EXPECT_TRUE(MatchRegexAtHead("a$", "a"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {
+  EXPECT_FALSE(MatchRegexAtHead("\\w", "+"));
+  EXPECT_FALSE(MatchRegexAtHead("\\W", "ab"));
+
+  EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab"));
+  EXPECT_TRUE(MatchRegexAtHead("\\d", "1a"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {
+  EXPECT_FALSE(MatchRegexAtHead(".+a", "abc"));
+  EXPECT_FALSE(MatchRegexAtHead("a?b", "aab"));
+
+  EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab"));
+  EXPECT_TRUE(MatchRegexAtHead("a?b", "b"));
+  EXPECT_TRUE(MatchRegexAtHead("a?b", "ab"));
+}
+
+TEST(MatchRegexAtHeadTest,
+     WorksWhenRegexStartsWithRepetionOfEscapeSequence) {
+  EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc"));
+  EXPECT_FALSE(MatchRegexAtHead("\\s?b", "  b"));
+
+  EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab"));
+  EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b"));
+  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b"));
+  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b"));
+}
+
+TEST(MatchRegexAtHeadTest, MatchesSequentially) {
+  EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc"));
+
+  EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {
+  EXPECT_FALSE(MatchRegexAnywhere("", NULL));
+}
+
+TEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {
+  EXPECT_FALSE(MatchRegexAnywhere("^a", "ba"));
+  EXPECT_FALSE(MatchRegexAnywhere("^$", "a"));
+
+  EXPECT_TRUE(MatchRegexAnywhere("^a", "ab"));
+  EXPECT_TRUE(MatchRegexAnywhere("^", "ab"));
+  EXPECT_TRUE(MatchRegexAnywhere("^$", ""));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {
+  EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123"));
+  EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {
+  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5"));
+  EXPECT_TRUE(MatchRegexAnywhere(".*=", "="));
+  EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {
+  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5"));
+  EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "=  ...="));
+}
+
+// Tests RE's implicit constructors.
+TEST(RETest, ImplicitConstructorWorks) {
+  const RE empty("");
+  EXPECT_STREQ("", empty.pattern());
+
+  const RE simple("hello");
+  EXPECT_STREQ("hello", simple.pattern());
+}
+
+// Tests that RE's constructors reject invalid regular expressions.
+TEST(RETest, RejectsInvalidRegex) {
+  EXPECT_NONFATAL_FAILURE({
+    const RE normal(NULL);
+  }, "NULL is not a valid simple regular expression");
+
+  EXPECT_NONFATAL_FAILURE({
+    const RE normal(".*(\\w+");
+  }, "'(' is unsupported");
+
+  EXPECT_NONFATAL_FAILURE({
+    const RE invalid("^?");
+  }, "'?' can only follow a repeatable token");
+}
+
+// Tests RE::FullMatch().
+TEST(RETest, FullMatchWorks) {
+  const RE empty("");
+  EXPECT_TRUE(RE::FullMatch("", empty));
+  EXPECT_FALSE(RE::FullMatch("a", empty));
+
+  const RE re1("a");
+  EXPECT_TRUE(RE::FullMatch("a", re1));
+
+  const RE re("a.*z");
+  EXPECT_TRUE(RE::FullMatch("az", re));
+  EXPECT_TRUE(RE::FullMatch("axyz", re));
+  EXPECT_FALSE(RE::FullMatch("baz", re));
+  EXPECT_FALSE(RE::FullMatch("azy", re));
+}
+
+// Tests RE::PartialMatch().
+TEST(RETest, PartialMatchWorks) {
+  const RE empty("");
+  EXPECT_TRUE(RE::PartialMatch("", empty));
+  EXPECT_TRUE(RE::PartialMatch("a", empty));
+
+  const RE re("a.*z");
+  EXPECT_TRUE(RE::PartialMatch("az", re));
+  EXPECT_TRUE(RE::PartialMatch("axyz", re));
+  EXPECT_TRUE(RE::PartialMatch("baz", re));
+  EXPECT_TRUE(RE::PartialMatch("azy", re));
+  EXPECT_FALSE(RE::PartialMatch("zza", re));
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+#if !GTEST_OS_WINDOWS_MOBILE
+
+TEST(CaptureTest, CapturesStdout) {
+  CaptureStdout();
+  fprintf(stdout, "abc");
+  EXPECT_STREQ("abc", GetCapturedStdout().c_str());
+
+  CaptureStdout();
+  fprintf(stdout, "def%cghi", '\0');
+  EXPECT_EQ(::std::string("def\0ghi", 7), ::std::string(GetCapturedStdout()));
+}
+
+TEST(CaptureTest, CapturesStderr) {
+  CaptureStderr();
+  fprintf(stderr, "jkl");
+  EXPECT_STREQ("jkl", GetCapturedStderr().c_str());
+
+  CaptureStderr();
+  fprintf(stderr, "jkl%cmno", '\0');
+  EXPECT_EQ(::std::string("jkl\0mno", 7), ::std::string(GetCapturedStderr()));
+}
+
+// Tests that stdout and stderr capture don't interfere with each other.
+TEST(CaptureTest, CapturesStdoutAndStderr) {
+  CaptureStdout();
+  CaptureStderr();
+  fprintf(stdout, "pqr");
+  fprintf(stderr, "stu");
+  EXPECT_STREQ("pqr", GetCapturedStdout().c_str());
+  EXPECT_STREQ("stu", GetCapturedStderr().c_str());
+}
+
+TEST(CaptureDeathTest, CannotReenterStdoutCapture) {
+  CaptureStdout();
+  EXPECT_DEATH_IF_SUPPORTED(CaptureStdout(),
+                            "Only one stdout capturer can exist at a time");
+  GetCapturedStdout();
+
+  // We cannot test stderr capturing using death tests as they use it
+  // themselves.
+}
+
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+TEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) {
+  ThreadLocal<int> t1;
+  EXPECT_EQ(0, t1.get());
+
+  ThreadLocal<void*> t2;
+  EXPECT_TRUE(t2.get() == NULL);
+}
+
+TEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) {
+  ThreadLocal<int> t1(123);
+  EXPECT_EQ(123, t1.get());
+
+  int i = 0;
+  ThreadLocal<int*> t2(&i);
+  EXPECT_EQ(&i, t2.get());
+}
+
+class NoDefaultContructor {
+ public:
+  explicit NoDefaultContructor(const char*) {}
+  NoDefaultContructor(const NoDefaultContructor&) {}
+};
+
+TEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) {
+  ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor("foo"));
+  bar.pointer();
+}
+
+TEST(ThreadLocalTest, GetAndPointerReturnSameValue) {
+  ThreadLocal<std::string> thread_local_string;
+
+  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
+
+  // Verifies the condition still holds after calling set.
+  thread_local_string.set("foo");
+  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
+}
+
+TEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {
+  ThreadLocal<std::string> thread_local_string;
+  const ThreadLocal<std::string>& const_thread_local_string =
+      thread_local_string;
+
+  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
+
+  thread_local_string.set("foo");
+  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
+}
+
+#if GTEST_IS_THREADSAFE
+
+void AddTwo(int* param) { *param += 2; }
+
+TEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) {
+  int i = 40;
+  ThreadWithParam<int*> thread(&AddTwo, &i, NULL);
+  thread.Join();
+  EXPECT_EQ(42, i);
+}
+
+TEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) {
+  // AssertHeld() is flaky only in the presence of multiple threads accessing
+  // the lock. In this case, the test is robust.
+  EXPECT_DEATH_IF_SUPPORTED({
+    Mutex m;
+    { MutexLock lock(&m); }
+    m.AssertHeld();
+  },
+  "thread .*hold");
+}
+
+TEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) {
+  Mutex m;
+  MutexLock lock(&m);
+  m.AssertHeld();
+}
+
+class AtomicCounterWithMutex {
+ public:
+  explicit AtomicCounterWithMutex(Mutex* mutex) :
+    value_(0), mutex_(mutex), random_(42) {}
+
+  void Increment() {
+    MutexLock lock(mutex_);
+    int temp = value_;
+    {
+      // Locking a mutex puts up a memory barrier, preventing reads and
+      // writes to value_ rearranged when observed from other threads.
+      //
+      // We cannot use Mutex and MutexLock here or rely on their memory
+      // barrier functionality as we are testing them here.
+      pthread_mutex_t memory_barrier_mutex;
+      GTEST_CHECK_POSIX_SUCCESS_(
+          pthread_mutex_init(&memory_barrier_mutex, NULL));
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex));
+
+      SleepMilliseconds(random_.Generate(30));
+
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex));
+    }
+    value_ = temp + 1;
+  }
+  int value() const { return value_; }
+
+ private:
+  volatile int value_;
+  Mutex* const mutex_;  // Protects value_.
+  Random       random_;
+};
+
+void CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) {
+  for (int i = 0; i < param.second; ++i)
+      param.first->Increment();
+}
+
+// Tests that the mutex only lets one thread at a time to lock it.
+TEST(MutexTest, OnlyOneThreadCanLockAtATime) {
+  Mutex mutex;
+  AtomicCounterWithMutex locked_counter(&mutex);
+
+  typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType;
+  const int kCycleCount = 20;
+  const int kThreadCount = 7;
+  scoped_ptr<ThreadType> counting_threads[kThreadCount];
+  Notification threads_can_start;
+  // Creates and runs kThreadCount threads that increment locked_counter
+  // kCycleCount times each.
+  for (int i = 0; i < kThreadCount; ++i) {
+    counting_threads[i].reset(new ThreadType(&CountingThreadFunc,
+                                             make_pair(&locked_counter,
+                                                       kCycleCount),
+                                             &threads_can_start));
+  }
+  threads_can_start.Notify();
+  for (int i = 0; i < kThreadCount; ++i)
+    counting_threads[i]->Join();
+
+  // If the mutex lets more than one thread to increment the counter at a
+  // time, they are likely to encounter a race condition and have some
+  // increments overwritten, resulting in the lower then expected counter
+  // value.
+  EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value());
+}
+
+template <typename T>
+void RunFromThread(void (func)(T), T param) {
+  ThreadWithParam<T> thread(func, param, NULL);
+  thread.Join();
+}
+
+void RetrieveThreadLocalValue(
+    pair<ThreadLocal<std::string>*, std::string*> param) {
+  *param.second = param.first->get();
+}
+
+TEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {
+  ThreadLocal<std::string> thread_local_string("foo");
+  EXPECT_STREQ("foo", thread_local_string.get().c_str());
+
+  thread_local_string.set("bar");
+  EXPECT_STREQ("bar", thread_local_string.get().c_str());
+
+  std::string result;
+  RunFromThread(&RetrieveThreadLocalValue,
+                make_pair(&thread_local_string, &result));
+  EXPECT_STREQ("foo", result.c_str());
+}
+
+// DestructorTracker keeps track of whether its instances have been
+// destroyed.
+static std::vector<bool> g_destroyed;
+
+class DestructorTracker {
+ public:
+  DestructorTracker() : index_(GetNewIndex()) {}
+  DestructorTracker(const DestructorTracker& /* rhs */)
+      : index_(GetNewIndex()) {}
+  ~DestructorTracker() {
+    // We never access g_destroyed concurrently, so we don't need to
+    // protect the write operation under a mutex.
+    g_destroyed[index_] = true;
+  }
+
+ private:
+  static int GetNewIndex() {
+    g_destroyed.push_back(false);
+    return g_destroyed.size() - 1;
+  }
+  const int index_;
+};
+
+typedef ThreadLocal<DestructorTracker>* ThreadParam;
+
+void CallThreadLocalGet(ThreadParam thread_local_param) {
+  thread_local_param->get();
+}
+
+// Tests that when a ThreadLocal object dies in a thread, it destroys
+// the managed object for that thread.
+TEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) {
+  g_destroyed.clear();
+
+  {
+    // The next line default constructs a DestructorTracker object as
+    // the default value of objects managed by thread_local_tracker.
+    ThreadLocal<DestructorTracker> thread_local_tracker;
+    ASSERT_EQ(1U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+
+    // This creates another DestructorTracker object for the main thread.
+    thread_local_tracker.get();
+    ASSERT_EQ(2U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+    ASSERT_FALSE(g_destroyed[1]);
+  }
+
+  // Now thread_local_tracker has died.  It should have destroyed both the
+  // default value shared by all threads and the value for the main
+  // thread.
+  ASSERT_EQ(2U, g_destroyed.size());
+  EXPECT_TRUE(g_destroyed[0]);
+  EXPECT_TRUE(g_destroyed[1]);
+
+  g_destroyed.clear();
+}
+
+// Tests that when a thread exits, the thread-local object for that
+// thread is destroyed.
+TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {
+  g_destroyed.clear();
+
+  {
+    // The next line default constructs a DestructorTracker object as
+    // the default value of objects managed by thread_local_tracker.
+    ThreadLocal<DestructorTracker> thread_local_tracker;
+    ASSERT_EQ(1U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+
+    // This creates another DestructorTracker object in the new thread.
+    ThreadWithParam<ThreadParam> thread(
+        &CallThreadLocalGet, &thread_local_tracker, NULL);
+    thread.Join();
+
+    // Now the new thread has exited.  The per-thread object for it
+    // should have been destroyed.
+    ASSERT_EQ(2U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+    ASSERT_TRUE(g_destroyed[1]);
+  }
+
+  // Now thread_local_tracker has died.  The default value should have been
+  // destroyed too.
+  ASSERT_EQ(2U, g_destroyed.size());
+  EXPECT_TRUE(g_destroyed[0]);
+  EXPECT_TRUE(g_destroyed[1]);
+
+  g_destroyed.clear();
+}
+
+TEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {
+  ThreadLocal<std::string> thread_local_string;
+  thread_local_string.set("Foo");
+  EXPECT_STREQ("Foo", thread_local_string.get().c_str());
+
+  std::string result;
+  RunFromThread(&RetrieveThreadLocalValue,
+                make_pair(&thread_local_string, &result));
+  EXPECT_TRUE(result.empty());
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+}  // namespace internal
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-printers_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-printers_test.cc
new file mode 100644
index 0000000..c2beca7
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-printers_test.cc
@@ -0,0 +1,1566 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file tests the universal value printer.
+
+#include "gtest/gtest-printers.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <algorithm>
+#include <deque>
+#include <list>
+#include <map>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+// hash_map and hash_set are available under Visual C++.
+#if _MSC_VER
+# define GTEST_HAS_HASH_MAP_ 1  // Indicates that hash_map is available.
+# include <hash_map>            // NOLINT
+# define GTEST_HAS_HASH_SET_ 1  // Indicates that hash_set is available.
+# include <hash_set>            // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Some user-defined types for testing the universal value printer.
+
+// An anonymous enum type.
+enum AnonymousEnum {
+  kAE1 = -1,
+  kAE2 = 1
+};
+
+// An enum without a user-defined printer.
+enum EnumWithoutPrinter {
+  kEWP1 = -2,
+  kEWP2 = 42
+};
+
+// An enum with a << operator.
+enum EnumWithStreaming {
+  kEWS1 = 10
+};
+
+std::ostream& operator<<(std::ostream& os, EnumWithStreaming e) {
+  return os << (e == kEWS1 ? "kEWS1" : "invalid");
+}
+
+// An enum with a PrintTo() function.
+enum EnumWithPrintTo {
+  kEWPT1 = 1
+};
+
+void PrintTo(EnumWithPrintTo e, std::ostream* os) {
+  *os << (e == kEWPT1 ? "kEWPT1" : "invalid");
+}
+
+// A class implicitly convertible to BiggestInt.
+class BiggestIntConvertible {
+ public:
+  operator ::testing::internal::BiggestInt() const { return 42; }
+};
+
+// A user-defined unprintable class template in the global namespace.
+template <typename T>
+class UnprintableTemplateInGlobal {
+ public:
+  UnprintableTemplateInGlobal() : value_() {}
+ private:
+  T value_;
+};
+
+// A user-defined streamable type in the global namespace.
+class StreamableInGlobal {
+ public:
+  virtual ~StreamableInGlobal() {}
+};
+
+inline void operator<<(::std::ostream& os, const StreamableInGlobal& /* x */) {
+  os << "StreamableInGlobal";
+}
+
+void operator<<(::std::ostream& os, const StreamableInGlobal* /* x */) {
+  os << "StreamableInGlobal*";
+}
+
+namespace foo {
+
+// A user-defined unprintable type in a user namespace.
+class UnprintableInFoo {
+ public:
+  UnprintableInFoo() : z_(0) { memcpy(xy_, "\xEF\x12\x0\x0\x34\xAB\x0\x0", 8); }
+ private:
+  char xy_[8];
+  double z_;
+};
+
+// A user-defined printable type in a user-chosen namespace.
+struct PrintableViaPrintTo {
+  PrintableViaPrintTo() : value() {}
+  int value;
+};
+
+void PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) {
+  *os << "PrintableViaPrintTo: " << x.value;
+}
+
+// A type with a user-defined << for printing its pointer.
+struct PointerPrintable {
+};
+
+::std::ostream& operator<<(::std::ostream& os,
+                           const PointerPrintable* /* x */) {
+  return os << "PointerPrintable*";
+}
+
+// A user-defined printable class template in a user-chosen namespace.
+template <typename T>
+class PrintableViaPrintToTemplate {
+ public:
+  explicit PrintableViaPrintToTemplate(const T& a_value) : value_(a_value) {}
+
+  const T& value() const { return value_; }
+ private:
+  T value_;
+};
+
+template <typename T>
+void PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) {
+  *os << "PrintableViaPrintToTemplate: " << x.value();
+}
+
+// A user-defined streamable class template in a user namespace.
+template <typename T>
+class StreamableTemplateInFoo {
+ public:
+  StreamableTemplateInFoo() : value_() {}
+
+  const T& value() const { return value_; }
+ private:
+  T value_;
+};
+
+template <typename T>
+inline ::std::ostream& operator<<(::std::ostream& os,
+                                  const StreamableTemplateInFoo<T>& x) {
+  return os << "StreamableTemplateInFoo: " << x.value();
+}
+
+}  // namespace foo
+
+namespace testing {
+namespace gtest_printers_test {
+
+using ::std::deque;
+using ::std::list;
+using ::std::make_pair;
+using ::std::map;
+using ::std::multimap;
+using ::std::multiset;
+using ::std::pair;
+using ::std::set;
+using ::std::vector;
+using ::testing::PrintToString;
+using ::testing::internal::FormatForComparisonFailureMessage;
+using ::testing::internal::ImplicitCast_;
+using ::testing::internal::NativeArray;
+using ::testing::internal::RE;
+using ::testing::internal::Strings;
+using ::testing::internal::UniversalPrint;
+using ::testing::internal::UniversalPrinter;
+using ::testing::internal::UniversalTersePrint;
+using ::testing::internal::UniversalTersePrintTupleFieldsToStrings;
+using ::testing::internal::kReference;
+using ::testing::internal::string;
+
+#if GTEST_HAS_TR1_TUPLE
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+#endif
+
+// The hash_* classes are not part of the C++ standard.  STLport
+// defines them in namespace std.  MSVC defines them in ::stdext.  GCC
+// defines them in ::.
+#ifdef _STLP_HASH_MAP  // We got <hash_map> from STLport.
+using ::std::hash_map;
+using ::std::hash_set;
+using ::std::hash_multimap;
+using ::std::hash_multiset;
+#elif _MSC_VER
+using ::stdext::hash_map;
+using ::stdext::hash_set;
+using ::stdext::hash_multimap;
+using ::stdext::hash_multiset;
+#endif
+
+// Prints a value to a string using the universal value printer.  This
+// is a helper for testing UniversalPrinter<T>::Print() for various types.
+template <typename T>
+string Print(const T& value) {
+  ::std::stringstream ss;
+  UniversalPrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+// Prints a value passed by reference to a string, using the universal
+// value printer.  This is a helper for testing
+// UniversalPrinter<T&>::Print() for various types.
+template <typename T>
+string PrintByRef(const T& value) {
+  ::std::stringstream ss;
+  UniversalPrinter<T&>::Print(value, &ss);
+  return ss.str();
+}
+
+// Tests printing various enum types.
+
+TEST(PrintEnumTest, AnonymousEnum) {
+  EXPECT_EQ("-1", Print(kAE1));
+  EXPECT_EQ("1", Print(kAE2));
+}
+
+TEST(PrintEnumTest, EnumWithoutPrinter) {
+  EXPECT_EQ("-2", Print(kEWP1));
+  EXPECT_EQ("42", Print(kEWP2));
+}
+
+TEST(PrintEnumTest, EnumWithStreaming) {
+  EXPECT_EQ("kEWS1", Print(kEWS1));
+  EXPECT_EQ("invalid", Print(static_cast<EnumWithStreaming>(0)));
+}
+
+TEST(PrintEnumTest, EnumWithPrintTo) {
+  EXPECT_EQ("kEWPT1", Print(kEWPT1));
+  EXPECT_EQ("invalid", Print(static_cast<EnumWithPrintTo>(0)));
+}
+
+// Tests printing a class implicitly convertible to BiggestInt.
+
+TEST(PrintClassTest, BiggestIntConvertible) {
+  EXPECT_EQ("42", Print(BiggestIntConvertible()));
+}
+
+// Tests printing various char types.
+
+// char.
+TEST(PrintCharTest, PlainChar) {
+  EXPECT_EQ("'\\0'", Print('\0'));
+  EXPECT_EQ("'\\'' (39, 0x27)", Print('\''));
+  EXPECT_EQ("'\"' (34, 0x22)", Print('"'));
+  EXPECT_EQ("'?' (63, 0x3F)", Print('?'));
+  EXPECT_EQ("'\\\\' (92, 0x5C)", Print('\\'));
+  EXPECT_EQ("'\\a' (7)", Print('\a'));
+  EXPECT_EQ("'\\b' (8)", Print('\b'));
+  EXPECT_EQ("'\\f' (12, 0xC)", Print('\f'));
+  EXPECT_EQ("'\\n' (10, 0xA)", Print('\n'));
+  EXPECT_EQ("'\\r' (13, 0xD)", Print('\r'));
+  EXPECT_EQ("'\\t' (9)", Print('\t'));
+  EXPECT_EQ("'\\v' (11, 0xB)", Print('\v'));
+  EXPECT_EQ("'\\x7F' (127)", Print('\x7F'));
+  EXPECT_EQ("'\\xFF' (255)", Print('\xFF'));
+  EXPECT_EQ("' ' (32, 0x20)", Print(' '));
+  EXPECT_EQ("'a' (97, 0x61)", Print('a'));
+}
+
+// signed char.
+TEST(PrintCharTest, SignedChar) {
+  EXPECT_EQ("'\\0'", Print(static_cast<signed char>('\0')));
+  EXPECT_EQ("'\\xCE' (-50)",
+            Print(static_cast<signed char>(-50)));
+}
+
+// unsigned char.
+TEST(PrintCharTest, UnsignedChar) {
+  EXPECT_EQ("'\\0'", Print(static_cast<unsigned char>('\0')));
+  EXPECT_EQ("'b' (98, 0x62)",
+            Print(static_cast<unsigned char>('b')));
+}
+
+// Tests printing other simple, built-in types.
+
+// bool.
+TEST(PrintBuiltInTypeTest, Bool) {
+  EXPECT_EQ("false", Print(false));
+  EXPECT_EQ("true", Print(true));
+}
+
+// wchar_t.
+TEST(PrintBuiltInTypeTest, Wchar_t) {
+  EXPECT_EQ("L'\\0'", Print(L'\0'));
+  EXPECT_EQ("L'\\'' (39, 0x27)", Print(L'\''));
+  EXPECT_EQ("L'\"' (34, 0x22)", Print(L'"'));
+  EXPECT_EQ("L'?' (63, 0x3F)", Print(L'?'));
+  EXPECT_EQ("L'\\\\' (92, 0x5C)", Print(L'\\'));
+  EXPECT_EQ("L'\\a' (7)", Print(L'\a'));
+  EXPECT_EQ("L'\\b' (8)", Print(L'\b'));
+  EXPECT_EQ("L'\\f' (12, 0xC)", Print(L'\f'));
+  EXPECT_EQ("L'\\n' (10, 0xA)", Print(L'\n'));
+  EXPECT_EQ("L'\\r' (13, 0xD)", Print(L'\r'));
+  EXPECT_EQ("L'\\t' (9)", Print(L'\t'));
+  EXPECT_EQ("L'\\v' (11, 0xB)", Print(L'\v'));
+  EXPECT_EQ("L'\\x7F' (127)", Print(L'\x7F'));
+  EXPECT_EQ("L'\\xFF' (255)", Print(L'\xFF'));
+  EXPECT_EQ("L' ' (32, 0x20)", Print(L' '));
+  EXPECT_EQ("L'a' (97, 0x61)", Print(L'a'));
+  EXPECT_EQ("L'\\x576' (1398)", Print(static_cast<wchar_t>(0x576)));
+  EXPECT_EQ("L'\\xC74D' (51021)", Print(static_cast<wchar_t>(0xC74D)));
+}
+
+// Test that Int64 provides more storage than wchar_t.
+TEST(PrintTypeSizeTest, Wchar_t) {
+  EXPECT_LT(sizeof(wchar_t), sizeof(testing::internal::Int64));
+}
+
+// Various integer types.
+TEST(PrintBuiltInTypeTest, Integer) {
+  EXPECT_EQ("'\\xFF' (255)", Print(static_cast<unsigned char>(255)));  // uint8
+  EXPECT_EQ("'\\x80' (-128)", Print(static_cast<signed char>(-128)));  // int8
+  EXPECT_EQ("65535", Print(USHRT_MAX));  // uint16
+  EXPECT_EQ("-32768", Print(SHRT_MIN));  // int16
+  EXPECT_EQ("4294967295", Print(UINT_MAX));  // uint32
+  EXPECT_EQ("-2147483648", Print(INT_MIN));  // int32
+  EXPECT_EQ("18446744073709551615",
+            Print(static_cast<testing::internal::UInt64>(-1)));  // uint64
+  EXPECT_EQ("-9223372036854775808",
+            Print(static_cast<testing::internal::Int64>(1) << 63));  // int64
+}
+
+// Size types.
+TEST(PrintBuiltInTypeTest, Size_t) {
+  EXPECT_EQ("1", Print(sizeof('a')));  // size_t.
+#if !GTEST_OS_WINDOWS
+  // Windows has no ssize_t type.
+  EXPECT_EQ("-2", Print(static_cast<ssize_t>(-2)));  // ssize_t.
+#endif  // !GTEST_OS_WINDOWS
+}
+
+// Floating-points.
+TEST(PrintBuiltInTypeTest, FloatingPoints) {
+  EXPECT_EQ("1.5", Print(1.5f));   // float
+  EXPECT_EQ("-2.5", Print(-2.5));  // double
+}
+
+// Since ::std::stringstream::operator<<(const void *) formats the pointer
+// output differently with different compilers, we have to create the expected
+// output first and use it as our expectation.
+static string PrintPointer(const void *p) {
+  ::std::stringstream expected_result_stream;
+  expected_result_stream << p;
+  return expected_result_stream.str();
+}
+
+// Tests printing C strings.
+
+// const char*.
+TEST(PrintCStringTest, Const) {
+  const char* p = "World";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"World\"", Print(p));
+}
+
+// char*.
+TEST(PrintCStringTest, NonConst) {
+  char p[] = "Hi";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"Hi\"",
+            Print(static_cast<char*>(p)));
+}
+
+// NULL C string.
+TEST(PrintCStringTest, Null) {
+  const char* p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests that C strings are escaped properly.
+TEST(PrintCStringTest, EscapesProperly) {
+  const char* p = "'\"?\\\a\b\f\n\r\t\v\x7F\xFF a";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"'\\\"?\\\\\\a\\b\\f"
+            "\\n\\r\\t\\v\\x7F\\xFF a\"",
+            Print(p));
+}
+
+
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+
+// const wchar_t*.
+TEST(PrintWideCStringTest, Const) {
+  const wchar_t* p = L"World";
+  EXPECT_EQ(PrintPointer(p) + " pointing to L\"World\"", Print(p));
+}
+
+// wchar_t*.
+TEST(PrintWideCStringTest, NonConst) {
+  wchar_t p[] = L"Hi";
+  EXPECT_EQ(PrintPointer(p) + " pointing to L\"Hi\"",
+            Print(static_cast<wchar_t*>(p)));
+}
+
+// NULL wide C string.
+TEST(PrintWideCStringTest, Null) {
+  const wchar_t* p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests that wide C strings are escaped properly.
+TEST(PrintWideCStringTest, EscapesProperly) {
+  const wchar_t s[] = {'\'', '"', '?', '\\', '\a', '\b', '\f', '\n', '\r',
+                       '\t', '\v', 0xD3, 0x576, 0x8D3, 0xC74D, ' ', 'a', '\0'};
+  EXPECT_EQ(PrintPointer(s) + " pointing to L\"'\\\"?\\\\\\a\\b\\f"
+            "\\n\\r\\t\\v\\xD3\\x576\\x8D3\\xC74D a\"",
+            Print(static_cast<const wchar_t*>(s)));
+}
+#endif  // native wchar_t
+
+// Tests printing pointers to other char types.
+
+// signed char*.
+TEST(PrintCharPointerTest, SignedChar) {
+  signed char* p = reinterpret_cast<signed char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const signed char*.
+TEST(PrintCharPointerTest, ConstSignedChar) {
+  signed char* p = reinterpret_cast<signed char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// unsigned char*.
+TEST(PrintCharPointerTest, UnsignedChar) {
+  unsigned char* p = reinterpret_cast<unsigned char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const unsigned char*.
+TEST(PrintCharPointerTest, ConstUnsignedChar) {
+  const unsigned char* p = reinterpret_cast<const unsigned char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing pointers to simple, built-in types.
+
+// bool*.
+TEST(PrintPointerToBuiltInTypeTest, Bool) {
+  bool* p = reinterpret_cast<bool*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// void*.
+TEST(PrintPointerToBuiltInTypeTest, Void) {
+  void* p = reinterpret_cast<void*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const void*.
+TEST(PrintPointerToBuiltInTypeTest, ConstVoid) {
+  const void* p = reinterpret_cast<const void*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing pointers to pointers.
+TEST(PrintPointerToPointerTest, IntPointerPointer) {
+  int** p = reinterpret_cast<int**>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing (non-member) function pointers.
+
+void MyFunction(int /* n */) {}
+
+TEST(PrintPointerTest, NonMemberFunctionPointer) {
+  // We cannot directly cast &MyFunction to const void* because the
+  // standard disallows casting between pointers to functions and
+  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
+  // this limitation.
+  EXPECT_EQ(
+      PrintPointer(reinterpret_cast<const void*>(
+          reinterpret_cast<internal::BiggestInt>(&MyFunction))),
+      Print(&MyFunction));
+  int (*p)(bool) = NULL;  // NOLINT
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// An assertion predicate determining whether a one string is a prefix for
+// another.
+template <typename StringType>
+AssertionResult HasPrefix(const StringType& str, const StringType& prefix) {
+  if (str.find(prefix, 0) == 0)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(prefix[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << begin_string_quote << prefix << "\" is not a prefix of "
+      << begin_string_quote << str << "\"\n";
+}
+
+// Tests printing member variable pointers.  Although they are called
+// pointers, they don't point to a location in the address space.
+// Their representation is implementation-defined.  Thus they will be
+// printed as raw bytes.
+
+struct Foo {
+ public:
+  virtual ~Foo() {}
+  int MyMethod(char x) { return x + 1; }
+  virtual char MyVirtualMethod(int /* n */) { return 'a'; }
+
+  int value;
+};
+
+TEST(PrintPointerTest, MemberVariablePointer) {
+  EXPECT_TRUE(HasPrefix(Print(&Foo::value),
+                        Print(sizeof(&Foo::value)) + "-byte object "));
+  int (Foo::*p) = NULL;  // NOLINT
+  EXPECT_TRUE(HasPrefix(Print(p),
+                        Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests printing member function pointers.  Although they are called
+// pointers, they don't point to a location in the address space.
+// Their representation is implementation-defined.  Thus they will be
+// printed as raw bytes.
+TEST(PrintPointerTest, MemberFunctionPointer) {
+  EXPECT_TRUE(HasPrefix(Print(&Foo::MyMethod),
+                        Print(sizeof(&Foo::MyMethod)) + "-byte object "));
+  EXPECT_TRUE(
+      HasPrefix(Print(&Foo::MyVirtualMethod),
+                Print(sizeof((&Foo::MyVirtualMethod))) + "-byte object "));
+  int (Foo::*p)(char) = NULL;  // NOLINT
+  EXPECT_TRUE(HasPrefix(Print(p),
+                        Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests printing C arrays.
+
+// The difference between this and Print() is that it ensures that the
+// argument is a reference to an array.
+template <typename T, size_t N>
+string PrintArrayHelper(T (&a)[N]) {
+  return Print(a);
+}
+
+// One-dimensional array.
+TEST(PrintArrayTest, OneDimensionalArray) {
+  int a[5] = { 1, 2, 3, 4, 5 };
+  EXPECT_EQ("{ 1, 2, 3, 4, 5 }", PrintArrayHelper(a));
+}
+
+// Two-dimensional array.
+TEST(PrintArrayTest, TwoDimensionalArray) {
+  int a[2][5] = {
+    { 1, 2, 3, 4, 5 },
+    { 6, 7, 8, 9, 0 }
+  };
+  EXPECT_EQ("{ { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 0 } }", PrintArrayHelper(a));
+}
+
+// Array of const elements.
+TEST(PrintArrayTest, ConstArray) {
+  const bool a[1] = { false };
+  EXPECT_EQ("{ false }", PrintArrayHelper(a));
+}
+
+// char array without terminating NUL.
+TEST(PrintArrayTest, CharArrayWithNoTerminatingNul) {
+  // Array a contains '\0' in the middle and doesn't end with '\0'.
+  char a[] = { 'H', '\0', 'i' };
+  EXPECT_EQ("\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
+}
+
+// const char array with terminating NUL.
+TEST(PrintArrayTest, ConstCharArrayWithTerminatingNul) {
+  const char a[] = "\0Hi";
+  EXPECT_EQ("\"\\0Hi\"", PrintArrayHelper(a));
+}
+
+// const wchar_t array without terminating NUL.
+TEST(PrintArrayTest, WCharArrayWithNoTerminatingNul) {
+  // Array a contains '\0' in the middle and doesn't end with '\0'.
+  const wchar_t a[] = { L'H', L'\0', L'i' };
+  EXPECT_EQ("L\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
+}
+
+// wchar_t array with terminating NUL.
+TEST(PrintArrayTest, WConstCharArrayWithTerminatingNul) {
+  const wchar_t a[] = L"\0Hi";
+  EXPECT_EQ("L\"\\0Hi\"", PrintArrayHelper(a));
+}
+
+// Array of objects.
+TEST(PrintArrayTest, ObjectArray) {
+  string a[3] = { "Hi", "Hello", "Ni hao" };
+  EXPECT_EQ("{ \"Hi\", \"Hello\", \"Ni hao\" }", PrintArrayHelper(a));
+}
+
+// Array with many elements.
+TEST(PrintArrayTest, BigArray) {
+  int a[100] = { 1, 2, 3 };
+  EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0, 0, 0, 0, 0 }",
+            PrintArrayHelper(a));
+}
+
+// Tests printing ::string and ::std::string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// ::string.
+TEST(PrintStringTest, StringInGlobalNamespace) {
+  const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a";
+  const ::string str(s, sizeof(s));
+  EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"",
+            Print(str));
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+// ::std::string.
+TEST(PrintStringTest, StringInStdNamespace) {
+  const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a";
+  const ::std::string str(s, sizeof(s));
+  EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"",
+            Print(str));
+}
+
+TEST(PrintStringTest, StringAmbiguousHex) {
+  // "\x6BANANA" is ambiguous, it can be interpreted as starting with either of:
+  // '\x6', '\x6B', or '\x6BA'.
+
+  // a hex escaping sequence following by a decimal digit
+  EXPECT_EQ("\"0\\x12\" \"3\"", Print(::std::string("0\x12" "3")));
+  // a hex escaping sequence following by a hex digit (lower-case)
+  EXPECT_EQ("\"mm\\x6\" \"bananas\"", Print(::std::string("mm\x6" "bananas")));
+  // a hex escaping sequence following by a hex digit (upper-case)
+  EXPECT_EQ("\"NOM\\x6\" \"BANANA\"", Print(::std::string("NOM\x6" "BANANA")));
+  // a hex escaping sequence following by a non-xdigit
+  EXPECT_EQ("\"!\\x5-!\"", Print(::std::string("!\x5-!")));
+}
+
+// Tests printing ::wstring and ::std::wstring.
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// ::wstring.
+TEST(PrintWideStringTest, StringInGlobalNamespace) {
+  const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a";
+  const ::wstring str(s, sizeof(s)/sizeof(wchar_t));
+  EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v"
+            "\\xD3\\x576\\x8D3\\xC74D a\\0\"",
+            Print(str));
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+// ::std::wstring.
+TEST(PrintWideStringTest, StringInStdNamespace) {
+  const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a";
+  const ::std::wstring str(s, sizeof(s)/sizeof(wchar_t));
+  EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v"
+            "\\xD3\\x576\\x8D3\\xC74D a\\0\"",
+            Print(str));
+}
+
+TEST(PrintWideStringTest, StringAmbiguousHex) {
+  // same for wide strings.
+  EXPECT_EQ("L\"0\\x12\" L\"3\"", Print(::std::wstring(L"0\x12" L"3")));
+  EXPECT_EQ("L\"mm\\x6\" L\"bananas\"",
+            Print(::std::wstring(L"mm\x6" L"bananas")));
+  EXPECT_EQ("L\"NOM\\x6\" L\"BANANA\"",
+            Print(::std::wstring(L"NOM\x6" L"BANANA")));
+  EXPECT_EQ("L\"!\\x5-!\"", Print(::std::wstring(L"!\x5-!")));
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests printing types that support generic streaming (i.e. streaming
+// to std::basic_ostream<Char, CharTraits> for any valid Char and
+// CharTraits types).
+
+// Tests printing a non-template type that supports generic streaming.
+
+class AllowsGenericStreaming {};
+
+template <typename Char, typename CharTraits>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreaming& /* a */) {
+  return os << "AllowsGenericStreaming";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, NonTemplateType) {
+  AllowsGenericStreaming a;
+  EXPECT_EQ("AllowsGenericStreaming", Print(a));
+}
+
+// Tests printing a template type that supports generic streaming.
+
+template <typename T>
+class AllowsGenericStreamingTemplate {};
+
+template <typename Char, typename CharTraits, typename T>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreamingTemplate<T>& /* a */) {
+  return os << "AllowsGenericStreamingTemplate";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, TemplateType) {
+  AllowsGenericStreamingTemplate<int> a;
+  EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a));
+}
+
+// Tests printing a type that supports generic streaming and can be
+// implicitly converted to another printable type.
+
+template <typename T>
+class AllowsGenericStreamingAndImplicitConversionTemplate {
+ public:
+  operator bool() const { return false; }
+};
+
+template <typename Char, typename CharTraits, typename T>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreamingAndImplicitConversionTemplate<T>& /* a */) {
+  return os << "AllowsGenericStreamingAndImplicitConversionTemplate";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {
+  AllowsGenericStreamingAndImplicitConversionTemplate<int> a;
+  EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a));
+}
+
+#if GTEST_HAS_STRING_PIECE_
+
+// Tests printing StringPiece.
+
+TEST(PrintStringPieceTest, SimpleStringPiece) {
+  const StringPiece sp = "Hello";
+  EXPECT_EQ("\"Hello\"", Print(sp));
+}
+
+TEST(PrintStringPieceTest, UnprintableCharacters) {
+  const char str[] = "NUL (\0) and \r\t";
+  const StringPiece sp(str, sizeof(str) - 1);
+  EXPECT_EQ("\"NUL (\\0) and \\r\\t\"", Print(sp));
+}
+
+#endif  // GTEST_HAS_STRING_PIECE_
+
+// Tests printing STL containers.
+
+TEST(PrintStlContainerTest, EmptyDeque) {
+  deque<char> empty;
+  EXPECT_EQ("{}", Print(empty));
+}
+
+TEST(PrintStlContainerTest, NonEmptyDeque) {
+  deque<int> non_empty;
+  non_empty.push_back(1);
+  non_empty.push_back(3);
+  EXPECT_EQ("{ 1, 3 }", Print(non_empty));
+}
+
+#if GTEST_HAS_HASH_MAP_
+
+TEST(PrintStlContainerTest, OneElementHashMap) {
+  hash_map<int, char> map1;
+  map1[1] = 'a';
+  EXPECT_EQ("{ (1, 'a' (97, 0x61)) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, HashMultiMap) {
+  hash_multimap<int, bool> map1;
+  map1.insert(make_pair(5, true));
+  map1.insert(make_pair(5, false));
+
+  // Elements of hash_multimap can be printed in any order.
+  const string result = Print(map1);
+  EXPECT_TRUE(result == "{ (5, true), (5, false) }" ||
+              result == "{ (5, false), (5, true) }")
+                  << " where Print(map1) returns \"" << result << "\".";
+}
+
+#endif  // GTEST_HAS_HASH_MAP_
+
+#if GTEST_HAS_HASH_SET_
+
+TEST(PrintStlContainerTest, HashSet) {
+  hash_set<string> set1;
+  set1.insert("hello");
+  EXPECT_EQ("{ \"hello\" }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, HashMultiSet) {
+  const int kSize = 5;
+  int a[kSize] = { 1, 1, 2, 5, 1 };
+  hash_multiset<int> set1(a, a + kSize);
+
+  // Elements of hash_multiset can be printed in any order.
+  const string result = Print(set1);
+  const string expected_pattern = "{ d, d, d, d, d }";  // d means a digit.
+
+  // Verifies the result matches the expected pattern; also extracts
+  // the numbers in the result.
+  ASSERT_EQ(expected_pattern.length(), result.length());
+  std::vector<int> numbers;
+  for (size_t i = 0; i != result.length(); i++) {
+    if (expected_pattern[i] == 'd') {
+      ASSERT_NE(isdigit(static_cast<unsigned char>(result[i])), 0);
+      numbers.push_back(result[i] - '0');
+    } else {
+      EXPECT_EQ(expected_pattern[i], result[i]) << " where result is "
+                                                << result;
+    }
+  }
+
+  // Makes sure the result contains the right numbers.
+  std::sort(numbers.begin(), numbers.end());
+  std::sort(a, a + kSize);
+  EXPECT_TRUE(std::equal(a, a + kSize, numbers.begin()));
+}
+
+#endif  // GTEST_HAS_HASH_SET_
+
+TEST(PrintStlContainerTest, List) {
+  const string a[] = {
+    "hello",
+    "world"
+  };
+  const list<string> strings(a, a + 2);
+  EXPECT_EQ("{ \"hello\", \"world\" }", Print(strings));
+}
+
+TEST(PrintStlContainerTest, Map) {
+  map<int, bool> map1;
+  map1[1] = true;
+  map1[5] = false;
+  map1[3] = true;
+  EXPECT_EQ("{ (1, true), (3, true), (5, false) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, MultiMap) {
+  multimap<bool, int> map1;
+  // The make_pair template function would deduce the type as
+  // pair<bool, int> here, and since the key part in a multimap has to
+  // be constant, without a templated ctor in the pair class (as in
+  // libCstd on Solaris), make_pair call would fail to compile as no
+  // implicit conversion is found.  Thus explicit typename is used
+  // here instead.
+  map1.insert(pair<const bool, int>(true, 0));
+  map1.insert(pair<const bool, int>(true, 1));
+  map1.insert(pair<const bool, int>(false, 2));
+  EXPECT_EQ("{ (false, 2), (true, 0), (true, 1) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, Set) {
+  const unsigned int a[] = { 3, 0, 5 };
+  set<unsigned int> set1(a, a + 3);
+  EXPECT_EQ("{ 0, 3, 5 }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, MultiSet) {
+  const int a[] = { 1, 1, 2, 5, 1 };
+  multiset<int> set1(a, a + 5);
+  EXPECT_EQ("{ 1, 1, 1, 2, 5 }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, Pair) {
+  pair<const bool, int> p(true, 5);
+  EXPECT_EQ("(true, 5)", Print(p));
+}
+
+TEST(PrintStlContainerTest, Vector) {
+  vector<int> v;
+  v.push_back(1);
+  v.push_back(2);
+  EXPECT_EQ("{ 1, 2 }", Print(v));
+}
+
+TEST(PrintStlContainerTest, LongSequence) {
+  const int a[100] = { 1, 2, 3 };
+  const vector<int> v(a, a + 100);
+  EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
+            "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... }", Print(v));
+}
+
+TEST(PrintStlContainerTest, NestedContainer) {
+  const int a1[] = { 1, 2 };
+  const int a2[] = { 3, 4, 5 };
+  const list<int> l1(a1, a1 + 2);
+  const list<int> l2(a2, a2 + 3);
+
+  vector<list<int> > v;
+  v.push_back(l1);
+  v.push_back(l2);
+  EXPECT_EQ("{ { 1, 2 }, { 3, 4, 5 } }", Print(v));
+}
+
+TEST(PrintStlContainerTest, OneDimensionalNativeArray) {
+  const int a[3] = { 1, 2, 3 };
+  NativeArray<int> b(a, 3, kReference);
+  EXPECT_EQ("{ 1, 2, 3 }", Print(b));
+}
+
+TEST(PrintStlContainerTest, TwoDimensionalNativeArray) {
+  const int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
+  NativeArray<int[3]> b(a, 2, kReference);
+  EXPECT_EQ("{ { 1, 2, 3 }, { 4, 5, 6 } }", Print(b));
+}
+
+// Tests that a class named iterator isn't treated as a container.
+
+struct iterator {
+  char x;
+};
+
+TEST(PrintStlContainerTest, Iterator) {
+  iterator it = {};
+  EXPECT_EQ("1-byte object <00>", Print(it));
+}
+
+// Tests that a class named const_iterator isn't treated as a container.
+
+struct const_iterator {
+  char x;
+};
+
+TEST(PrintStlContainerTest, ConstIterator) {
+  const_iterator it = {};
+  EXPECT_EQ("1-byte object <00>", Print(it));
+}
+
+#if GTEST_HAS_TR1_TUPLE
+// Tests printing tuples.
+
+// Tuples of various arities.
+TEST(PrintTupleTest, VariousSizes) {
+  tuple<> t0;
+  EXPECT_EQ("()", Print(t0));
+
+  tuple<int> t1(5);
+  EXPECT_EQ("(5)", Print(t1));
+
+  tuple<char, bool> t2('a', true);
+  EXPECT_EQ("('a' (97, 0x61), true)", Print(t2));
+
+  tuple<bool, int, int> t3(false, 2, 3);
+  EXPECT_EQ("(false, 2, 3)", Print(t3));
+
+  tuple<bool, int, int, int> t4(false, 2, 3, 4);
+  EXPECT_EQ("(false, 2, 3, 4)", Print(t4));
+
+  tuple<bool, int, int, int, bool> t5(false, 2, 3, 4, true);
+  EXPECT_EQ("(false, 2, 3, 4, true)", Print(t5));
+
+  tuple<bool, int, int, int, bool, int> t6(false, 2, 3, 4, true, 6);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6)", Print(t6));
+
+  tuple<bool, int, int, int, bool, int, int> t7(false, 2, 3, 4, true, 6, 7);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7)", Print(t7));
+
+  tuple<bool, int, int, int, bool, int, int, bool> t8(
+      false, 2, 3, 4, true, 6, 7, true);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true)", Print(t8));
+
+  tuple<bool, int, int, int, bool, int, int, bool, int> t9(
+      false, 2, 3, 4, true, 6, 7, true, 9);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true, 9)", Print(t9));
+
+  const char* const str = "8";
+  // VC++ 2010's implementation of tuple of C++0x is deficient, requiring
+  // an explicit type cast of NULL to be used.
+  tuple<bool, char, short, testing::internal::Int32,  // NOLINT
+      testing::internal::Int64, float, double, const char*, void*, string>
+      t10(false, 'a', 3, 4, 5, 1.5F, -2.5, str,
+          ImplicitCast_<void*>(NULL), "10");
+  EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) +
+            " pointing to \"8\", NULL, \"10\")",
+            Print(t10));
+}
+
+// Nested tuples.
+TEST(PrintTupleTest, NestedTuple) {
+  tuple<tuple<int, bool>, char> nested(make_tuple(5, true), 'a');
+  EXPECT_EQ("((5, true), 'a' (97, 0x61))", Print(nested));
+}
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Tests printing user-defined unprintable types.
+
+// Unprintable types in the global namespace.
+TEST(PrintUnprintableTypeTest, InGlobalNamespace) {
+  EXPECT_EQ("1-byte object <00>",
+            Print(UnprintableTemplateInGlobal<char>()));
+}
+
+// Unprintable types in a user namespace.
+TEST(PrintUnprintableTypeTest, InUserNamespace) {
+  EXPECT_EQ("16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
+            Print(::foo::UnprintableInFoo()));
+}
+
+// Unprintable types are that too big to be printed completely.
+
+struct Big {
+  Big() { memset(array, 0, sizeof(array)); }
+  char array[257];
+};
+
+TEST(PrintUnpritableTypeTest, BigObject) {
+  EXPECT_EQ("257-byte object <00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 ... 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00>",
+            Print(Big()));
+}
+
+// Tests printing user-defined streamable types.
+
+// Streamable types in the global namespace.
+TEST(PrintStreamableTypeTest, InGlobalNamespace) {
+  StreamableInGlobal x;
+  EXPECT_EQ("StreamableInGlobal", Print(x));
+  EXPECT_EQ("StreamableInGlobal*", Print(&x));
+}
+
+// Printable template types in a user namespace.
+TEST(PrintStreamableTypeTest, TemplateTypeInUserNamespace) {
+  EXPECT_EQ("StreamableTemplateInFoo: 0",
+            Print(::foo::StreamableTemplateInFoo<int>()));
+}
+
+// Tests printing user-defined types that have a PrintTo() function.
+TEST(PrintPrintableTypeTest, InUserNamespace) {
+  EXPECT_EQ("PrintableViaPrintTo: 0",
+            Print(::foo::PrintableViaPrintTo()));
+}
+
+// Tests printing a pointer to a user-defined type that has a <<
+// operator for its pointer.
+TEST(PrintPrintableTypeTest, PointerInUserNamespace) {
+  ::foo::PointerPrintable x;
+  EXPECT_EQ("PointerPrintable*", Print(&x));
+}
+
+// Tests printing user-defined class template that have a PrintTo() function.
+TEST(PrintPrintableTypeTest, TemplateInUserNamespace) {
+  EXPECT_EQ("PrintableViaPrintToTemplate: 5",
+            Print(::foo::PrintableViaPrintToTemplate<int>(5)));
+}
+
+#if GTEST_HAS_PROTOBUF_
+
+// Tests printing a protocol message.
+TEST(PrintProtocolMessageTest, PrintsShortDebugString) {
+  testing::internal::TestMessage msg;
+  msg.set_member("yes");
+  EXPECT_EQ("<member:\"yes\">", Print(msg));
+}
+
+// Tests printing a short proto2 message.
+TEST(PrintProto2MessageTest, PrintsShortDebugStringWhenItIsShort) {
+  testing::internal::FooMessage msg;
+  msg.set_int_field(2);
+  msg.set_string_field("hello");
+  EXPECT_PRED2(RE::FullMatch, Print(msg),
+               "<int_field:\\s*2\\s+string_field:\\s*\"hello\">");
+}
+
+// Tests printing a long proto2 message.
+TEST(PrintProto2MessageTest, PrintsDebugStringWhenItIsLong) {
+  testing::internal::FooMessage msg;
+  msg.set_int_field(2);
+  msg.set_string_field("hello");
+  msg.add_names("peter");
+  msg.add_names("paul");
+  msg.add_names("mary");
+  EXPECT_PRED2(RE::FullMatch, Print(msg),
+               "<\n"
+               "int_field:\\s*2\n"
+               "string_field:\\s*\"hello\"\n"
+               "names:\\s*\"peter\"\n"
+               "names:\\s*\"paul\"\n"
+               "names:\\s*\"mary\"\n"
+               ">");
+}
+
+#endif  // GTEST_HAS_PROTOBUF_
+
+// Tests that the universal printer prints both the address and the
+// value of a reference.
+TEST(PrintReferenceTest, PrintsAddressAndValue) {
+  int n = 5;
+  EXPECT_EQ("@" + PrintPointer(&n) + " 5", PrintByRef(n));
+
+  int a[2][3] = {
+    { 0, 1, 2 },
+    { 3, 4, 5 }
+  };
+  EXPECT_EQ("@" + PrintPointer(a) + " { { 0, 1, 2 }, { 3, 4, 5 } }",
+            PrintByRef(a));
+
+  const ::foo::UnprintableInFoo x;
+  EXPECT_EQ("@" + PrintPointer(&x) + " 16-byte object "
+            "<EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
+            PrintByRef(x));
+}
+
+// Tests that the universal printer prints a function pointer passed by
+// reference.
+TEST(PrintReferenceTest, HandlesFunctionPointer) {
+  void (*fp)(int n) = &MyFunction;
+  const string fp_pointer_string =
+      PrintPointer(reinterpret_cast<const void*>(&fp));
+  // We cannot directly cast &MyFunction to const void* because the
+  // standard disallows casting between pointers to functions and
+  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
+  // this limitation.
+  const string fp_string = PrintPointer(reinterpret_cast<const void*>(
+      reinterpret_cast<internal::BiggestInt>(fp)));
+  EXPECT_EQ("@" + fp_pointer_string + " " + fp_string,
+            PrintByRef(fp));
+}
+
+// Tests that the universal printer prints a member function pointer
+// passed by reference.
+TEST(PrintReferenceTest, HandlesMemberFunctionPointer) {
+  int (Foo::*p)(char ch) = &Foo::MyMethod;
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p),
+      "@" + PrintPointer(reinterpret_cast<const void*>(&p)) + " " +
+          Print(sizeof(p)) + "-byte object "));
+
+  char (Foo::*p2)(int n) = &Foo::MyVirtualMethod;
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p2),
+      "@" + PrintPointer(reinterpret_cast<const void*>(&p2)) + " " +
+          Print(sizeof(p2)) + "-byte object "));
+}
+
+// Tests that the universal printer prints a member variable pointer
+// passed by reference.
+TEST(PrintReferenceTest, HandlesMemberVariablePointer) {
+  int (Foo::*p) = &Foo::value;  // NOLINT
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p),
+      "@" + PrintPointer(&p) + " " + Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests that FormatForComparisonFailureMessage(), which is used to print
+// an operand in a comparison assertion (e.g. ASSERT_EQ) when the assertion
+// fails, formats the operand in the desired way.
+
+// scalar
+TEST(FormatForComparisonFailureMessageTest, WorksForScalar) {
+  EXPECT_STREQ("123",
+               FormatForComparisonFailureMessage(123, 124).c_str());
+}
+
+// non-char pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForNonCharPointer) {
+  int n = 0;
+  EXPECT_EQ(PrintPointer(&n),
+            FormatForComparisonFailureMessage(&n, &n).c_str());
+}
+
+// non-char array
+TEST(FormatForComparisonFailureMessageTest, FormatsNonCharArrayAsPointer) {
+  // In expression 'array == x', 'array' is compared by pointer.
+  // Therefore we want to print an array operand as a pointer.
+  int n[] = { 1, 2, 3 };
+  EXPECT_EQ(PrintPointer(n),
+            FormatForComparisonFailureMessage(n, n).c_str());
+}
+
+// Tests formatting a char pointer when it's compared with another pointer.
+// In this case we want to print it as a raw pointer, as the comparision is by
+// pointer.
+
+// char pointer vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsPointer) {
+  // In expression 'p == x', where 'p' and 'x' are (const or not) char
+  // pointers, the operands are compared by pointer.  Therefore we
+  // want to print 'p' as a pointer instead of a C string (we don't
+  // even know if it's supposed to point to a valid C string).
+
+  // const char*
+  const char* s = "hello";
+  EXPECT_EQ(PrintPointer(s),
+            FormatForComparisonFailureMessage(s, s).c_str());
+
+  // char*
+  char ch = 'a';
+  EXPECT_EQ(PrintPointer(&ch),
+            FormatForComparisonFailureMessage(&ch, &ch).c_str());
+}
+
+// wchar_t pointer vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsPointer) {
+  // In expression 'p == x', where 'p' and 'x' are (const or not) char
+  // pointers, the operands are compared by pointer.  Therefore we
+  // want to print 'p' as a pointer instead of a wide C string (we don't
+  // even know if it's supposed to point to a valid wide C string).
+
+  // const wchar_t*
+  const wchar_t* s = L"hello";
+  EXPECT_EQ(PrintPointer(s),
+            FormatForComparisonFailureMessage(s, s).c_str());
+
+  // wchar_t*
+  wchar_t ch = L'a';
+  EXPECT_EQ(PrintPointer(&ch),
+            FormatForComparisonFailureMessage(&ch, &ch).c_str());
+}
+
+// Tests formatting a char pointer when it's compared to a string object.
+// In this case we want to print the char pointer as a C string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// char pointer vs ::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsString) {
+  const char* s = "hello \"world";
+  EXPECT_STREQ("\"hello \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::string()).c_str());
+
+  // char*
+  char str[] = "hi\1";
+  char* p = str;
+  EXPECT_STREQ("\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::string()).c_str());
+}
+#endif
+
+// char pointer vs std::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsStdString) {
+  const char* s = "hello \"world";
+  EXPECT_STREQ("\"hello \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::std::string()).c_str());
+
+  // char*
+  char str[] = "hi\1";
+  char* p = str;
+  EXPECT_STREQ("\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::std::string()).c_str());
+}
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// wchar_t pointer vs ::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsWString) {
+  const wchar_t* s = L"hi \"world";
+  EXPECT_STREQ("L\"hi \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::wstring()).c_str());
+
+  // wchar_t*
+  wchar_t str[] = L"hi\1";
+  wchar_t* p = str;
+  EXPECT_STREQ("L\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::wstring()).c_str());
+}
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+// wchar_t pointer vs std::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsStdWString) {
+  const wchar_t* s = L"hi \"world";
+  EXPECT_STREQ("L\"hi \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::std::wstring()).c_str());
+
+  // wchar_t*
+  wchar_t str[] = L"hi\1";
+  wchar_t* p = str;
+  EXPECT_STREQ("L\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::std::wstring()).c_str());
+}
+#endif
+
+// Tests formatting a char array when it's compared with a pointer or array.
+// In this case we want to print the array as a row pointer, as the comparison
+// is by pointer.
+
+// char array vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsPointer) {
+  char str[] = "hi \"world\"";
+  char* p = NULL;
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, p).c_str());
+}
+
+// char array vs char array
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsCharArray) {
+  const char str[] = "hi \"world\"";
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, str).c_str());
+}
+
+// wchar_t array vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsPointer) {
+  wchar_t str[] = L"hi \"world\"";
+  wchar_t* p = NULL;
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, p).c_str());
+}
+
+// wchar_t array vs wchar_t array
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWCharArray) {
+  const wchar_t str[] = L"hi \"world\"";
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, str).c_str());
+}
+
+// Tests formatting a char array when it's compared with a string object.
+// In this case we want to print the array as a C string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// char array vs string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsString) {
+  const char str[] = "hi \"w\0rld\"";
+  EXPECT_STREQ("\"hi \\\"w\"",  // The content should be escaped.
+                                // Embedded NUL terminates the string.
+               FormatForComparisonFailureMessage(str, ::string()).c_str());
+}
+#endif
+
+// char array vs std::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsStdString) {
+  const char str[] = "hi \"world\"";
+  EXPECT_STREQ("\"hi \\\"world\\\"\"",  // The content should be escaped.
+               FormatForComparisonFailureMessage(str, ::std::string()).c_str());
+}
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// wchar_t array vs wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWString) {
+  const wchar_t str[] = L"hi \"world\"";
+  EXPECT_STREQ("L\"hi \\\"world\\\"\"",  // The content should be escaped.
+               FormatForComparisonFailureMessage(str, ::wstring()).c_str());
+}
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+// wchar_t array vs std::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsStdWString) {
+  const wchar_t str[] = L"hi \"w\0rld\"";
+  EXPECT_STREQ(
+      "L\"hi \\\"w\"",  // The content should be escaped.
+                        // Embedded NUL terminates the string.
+      FormatForComparisonFailureMessage(str, ::std::wstring()).c_str());
+}
+#endif
+
+// Useful for testing PrintToString().  We cannot use EXPECT_EQ()
+// there as its implementation uses PrintToString().  The caller must
+// ensure that 'value' has no side effect.
+#define EXPECT_PRINT_TO_STRING_(value, expected_string)         \
+  EXPECT_TRUE(PrintToString(value) == (expected_string))        \
+      << " where " #value " prints as " << (PrintToString(value))
+
+TEST(PrintToStringTest, WorksForScalar) {
+  EXPECT_PRINT_TO_STRING_(123, "123");
+}
+
+TEST(PrintToStringTest, WorksForPointerToConstChar) {
+  const char* p = "hello";
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
+}
+
+TEST(PrintToStringTest, WorksForPointerToNonConstChar) {
+  char s[] = "hello";
+  char* p = s;
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
+}
+
+TEST(PrintToStringTest, EscapesForPointerToConstChar) {
+  const char* p = "hello\n";
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\\n\"");
+}
+
+TEST(PrintToStringTest, EscapesForPointerToNonConstChar) {
+  char s[] = "hello\1";
+  char* p = s;
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\\x1\"");
+}
+
+TEST(PrintToStringTest, WorksForArray) {
+  int n[3] = { 1, 2, 3 };
+  EXPECT_PRINT_TO_STRING_(n, "{ 1, 2, 3 }");
+}
+
+TEST(PrintToStringTest, WorksForCharArray) {
+  char s[] = "hello";
+  EXPECT_PRINT_TO_STRING_(s, "\"hello\"");
+}
+
+TEST(PrintToStringTest, WorksForCharArrayWithEmbeddedNul) {
+  const char str_with_nul[] = "hello\0 world";
+  EXPECT_PRINT_TO_STRING_(str_with_nul, "\"hello\\0 world\"");
+
+  char mutable_str_with_nul[] = "hello\0 world";
+  EXPECT_PRINT_TO_STRING_(mutable_str_with_nul, "\"hello\\0 world\"");
+}
+
+#undef EXPECT_PRINT_TO_STRING_
+
+TEST(UniversalTersePrintTest, WorksForNonReference) {
+  ::std::stringstream ss;
+  UniversalTersePrint(123, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalTersePrintTest, WorksForReference) {
+  const int& n = 123;
+  ::std::stringstream ss;
+  UniversalTersePrint(n, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalTersePrintTest, WorksForCString) {
+  const char* s1 = "abc";
+  ::std::stringstream ss1;
+  UniversalTersePrint(s1, &ss1);
+  EXPECT_EQ("\"abc\"", ss1.str());
+
+  char* s2 = const_cast<char*>(s1);
+  ::std::stringstream ss2;
+  UniversalTersePrint(s2, &ss2);
+  EXPECT_EQ("\"abc\"", ss2.str());
+
+  const char* s3 = NULL;
+  ::std::stringstream ss3;
+  UniversalTersePrint(s3, &ss3);
+  EXPECT_EQ("NULL", ss3.str());
+}
+
+TEST(UniversalPrintTest, WorksForNonReference) {
+  ::std::stringstream ss;
+  UniversalPrint(123, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalPrintTest, WorksForReference) {
+  const int& n = 123;
+  ::std::stringstream ss;
+  UniversalPrint(n, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalPrintTest, WorksForCString) {
+  const char* s1 = "abc";
+  ::std::stringstream ss1;
+  UniversalPrint(s1, &ss1);
+  EXPECT_EQ(PrintPointer(s1) + " pointing to \"abc\"", string(ss1.str()));
+
+  char* s2 = const_cast<char*>(s1);
+  ::std::stringstream ss2;
+  UniversalPrint(s2, &ss2);
+  EXPECT_EQ(PrintPointer(s2) + " pointing to \"abc\"", string(ss2.str()));
+
+  const char* s3 = NULL;
+  ::std::stringstream ss3;
+  UniversalPrint(s3, &ss3);
+  EXPECT_EQ("NULL", ss3.str());
+}
+
+TEST(UniversalPrintTest, WorksForCharArray) {
+  const char str[] = "\"Line\0 1\"\nLine 2";
+  ::std::stringstream ss1;
+  UniversalPrint(str, &ss1);
+  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss1.str());
+
+  const char mutable_str[] = "\"Line\0 1\"\nLine 2";
+  ::std::stringstream ss2;
+  UniversalPrint(mutable_str, &ss2);
+  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss2.str());
+}
+
+#if GTEST_HAS_TR1_TUPLE
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsEmptyTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple());
+  EXPECT_EQ(0u, result.size());
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsOneTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple(1));
+  ASSERT_EQ(1u, result.size());
+  EXPECT_EQ("1", result[0]);
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTwoTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple(1, 'a'));
+  ASSERT_EQ(2u, result.size());
+  EXPECT_EQ("1", result[0]);
+  EXPECT_EQ("'a' (97, 0x61)", result[1]);
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTersely) {
+  const int n = 1;
+  Strings result = UniversalTersePrintTupleFieldsToStrings(
+      tuple<const int&, const char*>(n, "a"));
+  ASSERT_EQ(2u, result.size());
+  EXPECT_EQ("1", result[0]);
+  EXPECT_EQ("\"a\"", result[1]);
+}
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace gtest_printers_test
+}  // namespace testing
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-test-part_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-test-part_test.cc
new file mode 100644
index 0000000..ca8ba93
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-test-part_test.cc
@@ -0,0 +1,208 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#include "gtest/gtest-test-part.h"
+
+#include "gtest/gtest.h"
+
+using testing::Message;
+using testing::Test;
+using testing::TestPartResult;
+using testing::TestPartResultArray;
+
+namespace {
+
+// Tests the TestPartResult class.
+
+// The test fixture for testing TestPartResult.
+class TestPartResultTest : public Test {
+ protected:
+  TestPartResultTest()
+      : r1_(TestPartResult::kSuccess, "foo/bar.cc", 10, "Success!"),
+        r2_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure!"),
+        r3_(TestPartResult::kFatalFailure, NULL, -1, "Failure!") {}
+
+  TestPartResult r1_, r2_, r3_;
+};
+
+
+TEST_F(TestPartResultTest, ConstructorWorks) {
+  Message message;
+  message << "something is terribly wrong";
+  message << static_cast<const char*>(testing::internal::kStackTraceMarker);
+  message << "some unimportant stack trace";
+
+  const TestPartResult result(TestPartResult::kNonFatalFailure,
+                              "some_file.cc",
+                              42,
+                              message.GetString().c_str());
+
+  EXPECT_EQ(TestPartResult::kNonFatalFailure, result.type());
+  EXPECT_STREQ("some_file.cc", result.file_name());
+  EXPECT_EQ(42, result.line_number());
+  EXPECT_STREQ(message.GetString().c_str(), result.message());
+  EXPECT_STREQ("something is terribly wrong", result.summary());
+}
+
+TEST_F(TestPartResultTest, ResultAccessorsWork) {
+  const TestPartResult success(TestPartResult::kSuccess,
+                               "file.cc",
+                               42,
+                               "message");
+  EXPECT_TRUE(success.passed());
+  EXPECT_FALSE(success.failed());
+  EXPECT_FALSE(success.nonfatally_failed());
+  EXPECT_FALSE(success.fatally_failed());
+
+  const TestPartResult nonfatal_failure(TestPartResult::kNonFatalFailure,
+                                        "file.cc",
+                                        42,
+                                        "message");
+  EXPECT_FALSE(nonfatal_failure.passed());
+  EXPECT_TRUE(nonfatal_failure.failed());
+  EXPECT_TRUE(nonfatal_failure.nonfatally_failed());
+  EXPECT_FALSE(nonfatal_failure.fatally_failed());
+
+  const TestPartResult fatal_failure(TestPartResult::kFatalFailure,
+                                     "file.cc",
+                                     42,
+                                     "message");
+  EXPECT_FALSE(fatal_failure.passed());
+  EXPECT_TRUE(fatal_failure.failed());
+  EXPECT_FALSE(fatal_failure.nonfatally_failed());
+  EXPECT_TRUE(fatal_failure.fatally_failed());
+}
+
+// Tests TestPartResult::type().
+TEST_F(TestPartResultTest, type) {
+  EXPECT_EQ(TestPartResult::kSuccess, r1_.type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure, r2_.type());
+  EXPECT_EQ(TestPartResult::kFatalFailure, r3_.type());
+}
+
+// Tests TestPartResult::file_name().
+TEST_F(TestPartResultTest, file_name) {
+  EXPECT_STREQ("foo/bar.cc", r1_.file_name());
+  EXPECT_STREQ(NULL, r3_.file_name());
+}
+
+// Tests TestPartResult::line_number().
+TEST_F(TestPartResultTest, line_number) {
+  EXPECT_EQ(10, r1_.line_number());
+  EXPECT_EQ(-1, r2_.line_number());
+}
+
+// Tests TestPartResult::message().
+TEST_F(TestPartResultTest, message) {
+  EXPECT_STREQ("Success!", r1_.message());
+}
+
+// Tests TestPartResult::passed().
+TEST_F(TestPartResultTest, Passed) {
+  EXPECT_TRUE(r1_.passed());
+  EXPECT_FALSE(r2_.passed());
+  EXPECT_FALSE(r3_.passed());
+}
+
+// Tests TestPartResult::failed().
+TEST_F(TestPartResultTest, Failed) {
+  EXPECT_FALSE(r1_.failed());
+  EXPECT_TRUE(r2_.failed());
+  EXPECT_TRUE(r3_.failed());
+}
+
+// Tests TestPartResult::fatally_failed().
+TEST_F(TestPartResultTest, FatallyFailed) {
+  EXPECT_FALSE(r1_.fatally_failed());
+  EXPECT_FALSE(r2_.fatally_failed());
+  EXPECT_TRUE(r3_.fatally_failed());
+}
+
+// Tests TestPartResult::nonfatally_failed().
+TEST_F(TestPartResultTest, NonfatallyFailed) {
+  EXPECT_FALSE(r1_.nonfatally_failed());
+  EXPECT_TRUE(r2_.nonfatally_failed());
+  EXPECT_FALSE(r3_.nonfatally_failed());
+}
+
+// Tests the TestPartResultArray class.
+
+class TestPartResultArrayTest : public Test {
+ protected:
+  TestPartResultArrayTest()
+      : r1_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure 1"),
+        r2_(TestPartResult::kFatalFailure, "foo/bar.cc", -1, "Failure 2") {}
+
+  const TestPartResult r1_, r2_;
+};
+
+// Tests that TestPartResultArray initially has size 0.
+TEST_F(TestPartResultArrayTest, InitialSizeIsZero) {
+  TestPartResultArray results;
+  EXPECT_EQ(0, results.size());
+}
+
+// Tests that TestPartResultArray contains the given TestPartResult
+// after one Append() operation.
+TEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) {
+  TestPartResultArray results;
+  results.Append(r1_);
+  EXPECT_EQ(1, results.size());
+  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
+}
+
+// Tests that TestPartResultArray contains the given TestPartResults
+// after two Append() operations.
+TEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) {
+  TestPartResultArray results;
+  results.Append(r1_);
+  results.Append(r2_);
+  EXPECT_EQ(2, results.size());
+  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
+  EXPECT_STREQ("Failure 2", results.GetTestPartResult(1).message());
+}
+
+typedef TestPartResultArrayTest TestPartResultArrayDeathTest;
+
+// Tests that the program dies when GetTestPartResult() is called with
+// an invalid index.
+TEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) {
+  TestPartResultArray results;
+  results.Append(r1_);
+
+  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(-1), "");
+  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(1), "");
+}
+
+// TODO(mheule at google.com): Add a test for the class HasNewFatalFailureHelper.
+
+}  // namespace
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-tuple_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-tuple_test.cc
new file mode 100644
index 0000000..bfaa3e0
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-tuple_test.cc
@@ -0,0 +1,320 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/internal/gtest-tuple.h"
+#include <utility>
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::std::tr1::get;
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+using ::std::tr1::tuple_element;
+using ::std::tr1::tuple_size;
+using ::testing::StaticAssertTypeEq;
+
+// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK.
+TEST(tuple_element_Test, ReturnsElementType) {
+  StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>();
+  StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>();
+  StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>();
+}
+
+// Tests that tuple_size<T>::value gives the number of fields in tuple
+// type T.
+TEST(tuple_size_Test, ReturnsNumberOfFields) {
+  EXPECT_EQ(0, +tuple_size<tuple<> >::value);
+  EXPECT_EQ(1, +tuple_size<tuple<void*> >::value);
+  EXPECT_EQ(1, +tuple_size<tuple<char> >::value);
+  EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value));
+  EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value));
+  EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value));
+}
+
+// Tests comparing a tuple with itself.
+TEST(ComparisonTest, ComparesWithSelf) {
+  const tuple<int, char, bool> a(5, 'a', false);
+
+  EXPECT_TRUE(a == a);
+  EXPECT_FALSE(a != a);
+}
+
+// Tests comparing two tuples with the same value.
+TEST(ComparisonTest, ComparesEqualTuples) {
+  const tuple<int, bool> a(5, true), b(5, true);
+
+  EXPECT_TRUE(a == b);
+  EXPECT_FALSE(a != b);
+}
+
+// Tests comparing two different tuples that have no reference fields.
+TEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) {
+  typedef tuple<const int, char> FooTuple;
+
+  const FooTuple a(0, 'x');
+  const FooTuple b(1, 'a');
+
+  EXPECT_TRUE(a != b);
+  EXPECT_FALSE(a == b);
+
+  const FooTuple c(1, 'b');
+
+  EXPECT_TRUE(b != c);
+  EXPECT_FALSE(b == c);
+}
+
+// Tests comparing two different tuples that have reference fields.
+TEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) {
+  typedef tuple<int&, const char&> FooTuple;
+
+  int i = 5;
+  const char ch = 'a';
+  const FooTuple a(i, ch);
+
+  int j = 6;
+  const FooTuple b(j, ch);
+
+  EXPECT_TRUE(a != b);
+  EXPECT_FALSE(a == b);
+
+  j = 5;
+  const char ch2 = 'b';
+  const FooTuple c(j, ch2);
+
+  EXPECT_TRUE(b != c);
+  EXPECT_FALSE(b == c);
+}
+
+// Tests that a tuple field with a reference type is an alias of the
+// variable it's supposed to reference.
+TEST(ReferenceFieldTest, IsAliasOfReferencedVariable) {
+  int n = 0;
+  tuple<bool, int&> t(true, n);
+
+  n = 1;
+  EXPECT_EQ(n, get<1>(t))
+      << "Changing a underlying variable should update the reference field.";
+
+  // Makes sure that the implementation doesn't do anything funny with
+  // the & operator for the return type of get<>().
+  EXPECT_EQ(&n, &(get<1>(t)))
+      << "The address of a reference field should equal the address of "
+      << "the underlying variable.";
+
+  get<1>(t) = 2;
+  EXPECT_EQ(2, n)
+      << "Changing a reference field should update the underlying variable.";
+}
+
+// Tests that tuple's default constructor default initializes each field.
+// This test needs to compile without generating warnings.
+TEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) {
+  // The TR1 report requires that tuple's default constructor default
+  // initializes each field, even if it's a primitive type.  If the
+  // implementation forgets to do this, this test will catch it by
+  // generating warnings about using uninitialized variables (assuming
+  // a decent compiler).
+
+  tuple<> empty;
+
+  tuple<int> a1, b1;
+  b1 = a1;
+  EXPECT_EQ(0, get<0>(b1));
+
+  tuple<int, double> a2, b2;
+  b2 = a2;
+  EXPECT_EQ(0, get<0>(b2));
+  EXPECT_EQ(0.0, get<1>(b2));
+
+  tuple<double, char, bool*> a3, b3;
+  b3 = a3;
+  EXPECT_EQ(0.0, get<0>(b3));
+  EXPECT_EQ('\0', get<1>(b3));
+  EXPECT_TRUE(get<2>(b3) == NULL);
+
+  tuple<int, int, int, int, int, int, int, int, int, int> a10, b10;
+  b10 = a10;
+  EXPECT_EQ(0, get<0>(b10));
+  EXPECT_EQ(0, get<1>(b10));
+  EXPECT_EQ(0, get<2>(b10));
+  EXPECT_EQ(0, get<3>(b10));
+  EXPECT_EQ(0, get<4>(b10));
+  EXPECT_EQ(0, get<5>(b10));
+  EXPECT_EQ(0, get<6>(b10));
+  EXPECT_EQ(0, get<7>(b10));
+  EXPECT_EQ(0, get<8>(b10));
+  EXPECT_EQ(0, get<9>(b10));
+}
+
+// Tests constructing a tuple from its fields.
+TEST(TupleConstructorTest, ConstructsFromFields) {
+  int n = 1;
+  // Reference field.
+  tuple<int&> a(n);
+  EXPECT_EQ(&n, &(get<0>(a)));
+
+  // Non-reference fields.
+  tuple<int, char> b(5, 'a');
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_EQ('a', get<1>(b));
+
+  // Const reference field.
+  const int m = 2;
+  tuple<bool, const int&> c(true, m);
+  EXPECT_TRUE(get<0>(c));
+  EXPECT_EQ(&m, &(get<1>(c)));
+}
+
+// Tests tuple's copy constructor.
+TEST(TupleConstructorTest, CopyConstructor) {
+  tuple<double, bool> a(0.0, true);
+  tuple<double, bool> b(a);
+
+  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
+  EXPECT_TRUE(get<1>(b));
+}
+
+// Tests constructing a tuple from another tuple that has a compatible
+// but different type.
+TEST(TupleConstructorTest, ConstructsFromDifferentTupleType) {
+  tuple<int, int, char> a(0, 1, 'a');
+  tuple<double, long, int> b(a);
+
+  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
+  EXPECT_EQ(1, get<1>(b));
+  EXPECT_EQ('a', get<2>(b));
+}
+
+// Tests constructing a 2-tuple from an std::pair.
+TEST(TupleConstructorTest, ConstructsFromPair) {
+  ::std::pair<int, char> a(1, 'a');
+  tuple<int, char> b(a);
+  tuple<int, const char&> c(a);
+}
+
+// Tests assigning a tuple to another tuple with the same type.
+TEST(TupleAssignmentTest, AssignsToSameTupleType) {
+  const tuple<int, long> a(5, 7L);
+  tuple<int, long> b;
+  b = a;
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_EQ(7L, get<1>(b));
+}
+
+// Tests assigning a tuple to another tuple with a different but
+// compatible type.
+TEST(TupleAssignmentTest, AssignsToDifferentTupleType) {
+  const tuple<int, long, bool> a(1, 7L, true);
+  tuple<long, int, bool> b;
+  b = a;
+  EXPECT_EQ(1L, get<0>(b));
+  EXPECT_EQ(7, get<1>(b));
+  EXPECT_TRUE(get<2>(b));
+}
+
+// Tests assigning an std::pair to a 2-tuple.
+TEST(TupleAssignmentTest, AssignsFromPair) {
+  const ::std::pair<int, bool> a(5, true);
+  tuple<int, bool> b;
+  b = a;
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_TRUE(get<1>(b));
+
+  tuple<long, bool> c;
+  c = a;
+  EXPECT_EQ(5L, get<0>(c));
+  EXPECT_TRUE(get<1>(c));
+}
+
+// A fixture for testing big tuples.
+class BigTupleTest : public testing::Test {
+ protected:
+  typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple;
+
+  BigTupleTest() :
+      a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2),
+      b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {}
+
+  BigTuple a_, b_;
+};
+
+// Tests constructing big tuples.
+TEST_F(BigTupleTest, Construction) {
+  BigTuple a;
+  BigTuple b(b_);
+}
+
+// Tests that get<N>(t) returns the N-th (0-based) field of tuple t.
+TEST_F(BigTupleTest, get) {
+  EXPECT_EQ(1, get<0>(a_));
+  EXPECT_EQ(2, get<9>(a_));
+
+  // Tests that get() works on a const tuple too.
+  const BigTuple a(a_);
+  EXPECT_EQ(1, get<0>(a));
+  EXPECT_EQ(2, get<9>(a));
+}
+
+// Tests comparing big tuples.
+TEST_F(BigTupleTest, Comparisons) {
+  EXPECT_TRUE(a_ == a_);
+  EXPECT_FALSE(a_ != a_);
+
+  EXPECT_TRUE(a_ != b_);
+  EXPECT_FALSE(a_ == b_);
+}
+
+TEST(MakeTupleTest, WorksForScalarTypes) {
+  tuple<bool, int> a;
+  a = make_tuple(true, 5);
+  EXPECT_TRUE(get<0>(a));
+  EXPECT_EQ(5, get<1>(a));
+
+  tuple<char, int, long> b;
+  b = make_tuple('a', 'b', 5);
+  EXPECT_EQ('a', get<0>(b));
+  EXPECT_EQ('b', get<1>(b));
+  EXPECT_EQ(5, get<2>(b));
+}
+
+TEST(MakeTupleTest, WorksForPointers) {
+  int a[] = { 1, 2, 3, 4 };
+  const char* const str = "hi";
+  int* const p = a;
+
+  tuple<const char*, int*> t;
+  t = make_tuple(str, p);
+  EXPECT_EQ(str, get<0>(t));
+  EXPECT_EQ(p, get<1>(t));
+}
+
+}  // namespace
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test2_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test2_test.cc
new file mode 100644
index 0000000..c284700
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test2_test.cc
@@ -0,0 +1,45 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <vector>
+
+#include "test/gtest-typed-test_test.h"
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Tests that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
+INSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest,
+                              testing::Types<std::vector<int> >);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test_test.cc
new file mode 100644
index 0000000..dd4ba43
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test_test.cc
@@ -0,0 +1,360 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <set>
+#include <vector>
+
+#include "test/gtest-typed-test_test.h"
+#include "gtest/gtest.h"
+
+using testing::Test;
+
+// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture
+// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and
+// type-parameterized test.
+template <typename T>
+class CommonTest : public Test {
+  // For some technical reason, SetUpTestCase() and TearDownTestCase()
+  // must be public.
+ public:
+  static void SetUpTestCase() {
+    shared_ = new T(5);
+  }
+
+  static void TearDownTestCase() {
+    delete shared_;
+    shared_ = NULL;
+  }
+
+  // This 'protected:' is optional.  There's no harm in making all
+  // members of this fixture class template public.
+ protected:
+  // We used to use std::list here, but switched to std::vector since
+  // MSVC's <list> doesn't compile cleanly with /W4.
+  typedef std::vector<T> Vector;
+  typedef std::set<int> IntSet;
+
+  CommonTest() : value_(1) {}
+
+  virtual ~CommonTest() { EXPECT_EQ(3, value_); }
+
+  virtual void SetUp() {
+    EXPECT_EQ(1, value_);
+    value_++;
+  }
+
+  virtual void TearDown() {
+    EXPECT_EQ(2, value_);
+    value_++;
+  }
+
+  T value_;
+  static T* shared_;
+};
+
+template <typename T>
+T* CommonTest<T>::shared_ = NULL;
+
+// This #ifdef block tests typed tests.
+#if GTEST_HAS_TYPED_TEST
+
+using testing::Types;
+
+// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
+// and SetUp()/TearDown() work correctly in typed tests
+
+typedef Types<char, int> TwoTypes;
+TYPED_TEST_CASE(CommonTest, TwoTypes);
+
+TYPED_TEST(CommonTest, ValuesAreCorrect) {
+  // Static members of the fixture class template can be visited via
+  // the TestFixture:: prefix.
+  EXPECT_EQ(5, *TestFixture::shared_);
+
+  // Typedefs in the fixture class template can be visited via the
+  // "typename TestFixture::" prefix.
+  typename TestFixture::Vector empty;
+  EXPECT_EQ(0U, empty.size());
+
+  typename TestFixture::IntSet empty2;
+  EXPECT_EQ(0U, empty2.size());
+
+  // Non-static members of the fixture class must be visited via
+  // 'this', as required by C++ for class templates.
+  EXPECT_EQ(2, this->value_);
+}
+
+// The second test makes sure shared_ is not deleted after the first
+// test.
+TYPED_TEST(CommonTest, ValuesAreStillCorrect) {
+  // Static members of the fixture class template can also be visited
+  // via 'this'.
+  ASSERT_TRUE(this->shared_ != NULL);
+  EXPECT_EQ(5, *this->shared_);
+
+  // TypeParam can be used to refer to the type parameter.
+  EXPECT_EQ(static_cast<TypeParam>(2), this->value_);
+}
+
+// Tests that multiple TYPED_TEST_CASE's can be defined in the same
+// translation unit.
+
+template <typename T>
+class TypedTest1 : public Test {
+};
+
+// Verifies that the second argument of TYPED_TEST_CASE can be a
+// single type.
+TYPED_TEST_CASE(TypedTest1, int);
+TYPED_TEST(TypedTest1, A) {}
+
+template <typename T>
+class TypedTest2 : public Test {
+};
+
+// Verifies that the second argument of TYPED_TEST_CASE can be a
+// Types<...> type list.
+TYPED_TEST_CASE(TypedTest2, Types<int>);
+
+// This also verifies that tests from different typed test cases can
+// share the same name.
+TYPED_TEST(TypedTest2, A) {}
+
+// Tests that a typed test case can be defined in a namespace.
+
+namespace library1 {
+
+template <typename T>
+class NumericTest : public Test {
+};
+
+typedef Types<int, long> NumericTypes;
+TYPED_TEST_CASE(NumericTest, NumericTypes);
+
+TYPED_TEST(NumericTest, DefaultIsZero) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+}  // namespace library1
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// This #ifdef block tests type-parameterized tests.
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Types;
+using testing::internal::TypedTestCasePState;
+
+// Tests TypedTestCasePState.
+
+class TypedTestCasePStateTest : public Test {
+ protected:
+  virtual void SetUp() {
+    state_.AddTestName("foo.cc", 0, "FooTest", "A");
+    state_.AddTestName("foo.cc", 0, "FooTest", "B");
+    state_.AddTestName("foo.cc", 0, "FooTest", "C");
+  }
+
+  TypedTestCasePState state_;
+};
+
+TEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {
+  const char* tests = "A, B, C";
+  EXPECT_EQ(tests,
+            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
+}
+
+// Makes sure that the order of the tests and spaces around the names
+// don't matter.
+TEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {
+  const char* tests = "A,C,   B";
+  EXPECT_EQ(tests,
+            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
+}
+
+typedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"),
+      "foo\\.cc.1.?: Test A is listed more than once\\.");
+}
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"),
+      "foo\\.cc.1.?: No test named D can be found in this test case\\.");
+}
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"),
+      "foo\\.cc.1.?: You forgot to list test B\\.");
+}
+
+// Tests that defining a test for a parameterized test case generates
+// a run-time error if the test case has been registered.
+TEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {
+  state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C");
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.AddTestName("foo.cc", 2, "FooTest", "D"),
+      "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P"
+      "\\(FooTest, \\.\\.\\.\\)\\.");
+}
+
+// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
+// and SetUp()/TearDown() work correctly in type-parameterized tests.
+
+template <typename T>
+class DerivedTest : public CommonTest<T> {
+};
+
+TYPED_TEST_CASE_P(DerivedTest);
+
+TYPED_TEST_P(DerivedTest, ValuesAreCorrect) {
+  // Static members of the fixture class template can be visited via
+  // the TestFixture:: prefix.
+  EXPECT_EQ(5, *TestFixture::shared_);
+
+  // Non-static members of the fixture class must be visited via
+  // 'this', as required by C++ for class templates.
+  EXPECT_EQ(2, this->value_);
+}
+
+// The second test makes sure shared_ is not deleted after the first
+// test.
+TYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {
+  // Static members of the fixture class template can also be visited
+  // via 'this'.
+  ASSERT_TRUE(this->shared_ != NULL);
+  EXPECT_EQ(5, *this->shared_);
+  EXPECT_EQ(2, this->value_);
+}
+
+REGISTER_TYPED_TEST_CASE_P(DerivedTest,
+                           ValuesAreCorrect, ValuesAreStillCorrect);
+
+typedef Types<short, long> MyTwoTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);
+
+// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same
+// translation unit.
+
+template <typename T>
+class TypedTestP1 : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP1);
+
+// For testing that the code between TYPED_TEST_CASE_P() and
+// TYPED_TEST_P() is not enclosed in a namespace.
+typedef int IntAfterTypedTestCaseP;
+
+TYPED_TEST_P(TypedTestP1, A) {}
+TYPED_TEST_P(TypedTestP1, B) {}
+
+// For testing that the code between TYPED_TEST_P() and
+// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
+typedef int IntBeforeRegisterTypedTestCaseP;
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);
+
+template <typename T>
+class TypedTestP2 : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP2);
+
+// This also verifies that tests from different type-parameterized
+// test cases can share the same name.
+TYPED_TEST_P(TypedTestP2, A) {}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);
+
+// Verifies that the code between TYPED_TEST_CASE_P() and
+// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
+IntAfterTypedTestCaseP after = 0;
+IntBeforeRegisterTypedTestCaseP before = 0;
+
+// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()
+// can be either a single type or a Types<...> type list.
+INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);
+INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);
+
+// Tests that the same type-parameterized test case can be
+// instantiated more than once in the same translation unit.
+INSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);
+
+// Tests that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
+typedef Types<std::vector<double>, std::set<char> > MyContainers;
+INSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);
+
+// Tests that a type-parameterized test case can be defined and
+// instantiated in a namespace.
+
+namespace library2 {
+
+template <typename T>
+class NumericTest : public Test {
+};
+
+TYPED_TEST_CASE_P(NumericTest);
+
+TYPED_TEST_P(NumericTest, DefaultIsZero) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+TYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {
+  EXPECT_LT(TypeParam(0), TypeParam(1));
+}
+
+REGISTER_TYPED_TEST_CASE_P(NumericTest,
+                           DefaultIsZero, ZeroIsLessThanOne);
+typedef Types<int, double> NumericTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);
+
+}  // namespace library2
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
+
+// Google Test may not support type-parameterized tests with some
+// compilers. If we use conditional compilation to compile out all
+// code referring to the gtest_main library, MSVC linker will not link
+// that library at all and consequently complain about missing entry
+// point defined in that library (fatal error LNK1561: entry point
+// must be defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}
+
+#endif  // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test_test.h b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test_test.h
new file mode 100644
index 0000000..41d7570
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-typed-test_test.h
@@ -0,0 +1,66 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
+#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Test;
+
+// For testing that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// ContainerTest will be instantiated in both gtest-typed-test_test.cc
+// and gtest-typed-test2_test.cc.
+
+template <typename T>
+class ContainerTest : public Test {
+};
+
+TYPED_TEST_CASE_P(ContainerTest);
+
+TYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) {
+  TypeParam container;
+}
+
+TYPED_TEST_P(ContainerTest, InitialSizeIsZero) {
+  TypeParam container;
+  EXPECT_EQ(0U, container.size());
+}
+
+REGISTER_TYPED_TEST_CASE_P(ContainerTest,
+                           CanBeDefaultConstructed, InitialSizeIsZero);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-unittest-api_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-unittest-api_test.cc
new file mode 100644
index 0000000..07083e5
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest-unittest-api_test.cc
@@ -0,0 +1,341 @@
+// Copyright 2009 Google Inc.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This file contains tests verifying correctness of data provided via
+// UnitTest's public methods.
+
+#include "gtest/gtest.h"
+
+#include <string.h>  // For strcmp.
+#include <algorithm>
+
+using ::testing::InitGoogleTest;
+
+namespace testing {
+namespace internal {
+
+template <typename T>
+struct LessByName {
+  bool operator()(const T* a, const T* b) {
+    return strcmp(a->name(), b->name()) < 0;
+  }
+};
+
+class UnitTestHelper {
+ public:
+  // Returns the array of pointers to all test cases sorted by the test case
+  // name.  The caller is responsible for deleting the array.
+  static TestCase const** const GetSortedTestCases() {
+    UnitTest& unit_test = *UnitTest::GetInstance();
+    TestCase const** const test_cases =
+        new const TestCase*[unit_test.total_test_case_count()];
+
+    for (int i = 0; i < unit_test.total_test_case_count(); ++i)
+      test_cases[i] = unit_test.GetTestCase(i);
+
+    std::sort(test_cases,
+              test_cases + unit_test.total_test_case_count(),
+              LessByName<TestCase>());
+    return test_cases;
+  }
+
+  // Returns the test case by its name.  The caller doesn't own the returned
+  // pointer.
+  static const TestCase* FindTestCase(const char* name) {
+    UnitTest& unit_test = *UnitTest::GetInstance();
+    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+      const TestCase* test_case = unit_test.GetTestCase(i);
+      if (0 == strcmp(test_case->name(), name))
+        return test_case;
+    }
+    return NULL;
+  }
+
+  // Returns the array of pointers to all tests in a particular test case
+  // sorted by the test name.  The caller is responsible for deleting the
+  // array.
+  static TestInfo const** const GetSortedTests(const TestCase* test_case) {
+    TestInfo const** const tests =
+        new const TestInfo*[test_case->total_test_count()];
+
+    for (int i = 0; i < test_case->total_test_count(); ++i)
+      tests[i] = test_case->GetTestInfo(i);
+
+    std::sort(tests, tests + test_case->total_test_count(),
+              LessByName<TestInfo>());
+    return tests;
+  }
+};
+
+#if GTEST_HAS_TYPED_TEST
+template <typename T> class TestCaseWithCommentTest : public Test {};
+TYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);
+TYPED_TEST(TestCaseWithCommentTest, Dummy) {}
+
+const int kTypedTestCases = 1;
+const int kTypedTests = 1;
+#else
+const int kTypedTestCases = 0;
+const int kTypedTests = 0;
+#endif  // GTEST_HAS_TYPED_TEST
+
+// We can only test the accessors that do not change value while tests run.
+// Since tests can be run in any order, the values the accessors that track
+// test execution (such as failed_test_count) can not be predicted.
+TEST(ApiTest, UnitTestImmutableAccessorsWork) {
+  UnitTest* unit_test = UnitTest::GetInstance();
+
+  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
+  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());
+  EXPECT_EQ(2, unit_test->disabled_test_count());
+  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());
+  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());
+
+  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
+
+  EXPECT_STREQ("ApiTest", test_cases[0]->name());
+  EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
+#if GTEST_HAS_TYPED_TEST
+  EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
+#endif  // GTEST_HAS_TYPED_TEST
+
+  delete[] test_cases;
+
+  // The following lines initiate actions to verify certain methods in
+  // FinalSuccessChecker::TearDown.
+
+  // Records a test property to verify TestResult::GetTestProperty().
+  RecordProperty("key", "value");
+}
+
+AssertionResult IsNull(const char* str) {
+  if (str != NULL) {
+    return testing::AssertionFailure() << "argument is " << str;
+  }
+  return AssertionSuccess();
+}
+
+TEST(ApiTest, TestCaseImmutableAccessorsWork) {
+  const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("ApiTest", test_case->name());
+  EXPECT_TRUE(IsNull(test_case->type_param()));
+  EXPECT_TRUE(test_case->should_run());
+  EXPECT_EQ(1, test_case->disabled_test_count());
+  EXPECT_EQ(3, test_case->test_to_run_count());
+  ASSERT_EQ(4, test_case->total_test_count());
+
+  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
+
+  EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
+  EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[0]->value_param()));
+  EXPECT_TRUE(IsNull(tests[0]->type_param()));
+  EXPECT_FALSE(tests[0]->should_run());
+
+  EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
+  EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[1]->value_param()));
+  EXPECT_TRUE(IsNull(tests[1]->type_param()));
+  EXPECT_TRUE(tests[1]->should_run());
+
+  EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
+  EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[2]->value_param()));
+  EXPECT_TRUE(IsNull(tests[2]->type_param()));
+  EXPECT_TRUE(tests[2]->should_run());
+
+  EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
+  EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[3]->value_param()));
+  EXPECT_TRUE(IsNull(tests[3]->type_param()));
+  EXPECT_TRUE(tests[3]->should_run());
+
+  delete[] tests;
+  tests = NULL;
+
+#if GTEST_HAS_TYPED_TEST
+  test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("TestCaseWithCommentTest/0", test_case->name());
+  EXPECT_STREQ(GetTypeName<int>().c_str(), test_case->type_param());
+  EXPECT_TRUE(test_case->should_run());
+  EXPECT_EQ(0, test_case->disabled_test_count());
+  EXPECT_EQ(1, test_case->test_to_run_count());
+  ASSERT_EQ(1, test_case->total_test_count());
+
+  tests = UnitTestHelper::GetSortedTests(test_case);
+
+  EXPECT_STREQ("Dummy", tests[0]->name());
+  EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[0]->value_param()));
+  EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
+  EXPECT_TRUE(tests[0]->should_run());
+
+  delete[] tests;
+#endif  // GTEST_HAS_TYPED_TEST
+}
+
+TEST(ApiTest, TestCaseDisabledAccessorsWork) {
+  const TestCase* test_case = UnitTestHelper::FindTestCase("DISABLED_Test");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("DISABLED_Test", test_case->name());
+  EXPECT_TRUE(IsNull(test_case->type_param()));
+  EXPECT_FALSE(test_case->should_run());
+  EXPECT_EQ(1, test_case->disabled_test_count());
+  EXPECT_EQ(0, test_case->test_to_run_count());
+  ASSERT_EQ(1, test_case->total_test_count());
+
+  const TestInfo* const test_info = test_case->GetTestInfo(0);
+  EXPECT_STREQ("Dummy2", test_info->name());
+  EXPECT_STREQ("DISABLED_Test", test_info->test_case_name());
+  EXPECT_TRUE(IsNull(test_info->value_param()));
+  EXPECT_TRUE(IsNull(test_info->type_param()));
+  EXPECT_FALSE(test_info->should_run());
+}
+
+// These two tests are here to provide support for testing
+// test_case_to_run_count, disabled_test_count, and test_to_run_count.
+TEST(ApiTest, DISABLED_Dummy1) {}
+TEST(DISABLED_Test, Dummy2) {}
+
+class FinalSuccessChecker : public Environment {
+ protected:
+  virtual void TearDown() {
+    UnitTest* unit_test = UnitTest::GetInstance();
+
+    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());
+    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());
+    EXPECT_EQ(0, unit_test->failed_test_case_count());
+    EXPECT_EQ(0, unit_test->failed_test_count());
+    EXPECT_TRUE(unit_test->Passed());
+    EXPECT_FALSE(unit_test->Failed());
+    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
+
+    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
+
+    EXPECT_STREQ("ApiTest", test_cases[0]->name());
+    EXPECT_TRUE(IsNull(test_cases[0]->type_param()));
+    EXPECT_TRUE(test_cases[0]->should_run());
+    EXPECT_EQ(1, test_cases[0]->disabled_test_count());
+    ASSERT_EQ(4, test_cases[0]->total_test_count());
+    EXPECT_EQ(3, test_cases[0]->successful_test_count());
+    EXPECT_EQ(0, test_cases[0]->failed_test_count());
+    EXPECT_TRUE(test_cases[0]->Passed());
+    EXPECT_FALSE(test_cases[0]->Failed());
+
+    EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
+    EXPECT_TRUE(IsNull(test_cases[1]->type_param()));
+    EXPECT_FALSE(test_cases[1]->should_run());
+    EXPECT_EQ(1, test_cases[1]->disabled_test_count());
+    ASSERT_EQ(1, test_cases[1]->total_test_count());
+    EXPECT_EQ(0, test_cases[1]->successful_test_count());
+    EXPECT_EQ(0, test_cases[1]->failed_test_count());
+
+#if GTEST_HAS_TYPED_TEST
+    EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
+    EXPECT_STREQ(GetTypeName<int>().c_str(), test_cases[2]->type_param());
+    EXPECT_TRUE(test_cases[2]->should_run());
+    EXPECT_EQ(0, test_cases[2]->disabled_test_count());
+    ASSERT_EQ(1, test_cases[2]->total_test_count());
+    EXPECT_EQ(1, test_cases[2]->successful_test_count());
+    EXPECT_EQ(0, test_cases[2]->failed_test_count());
+    EXPECT_TRUE(test_cases[2]->Passed());
+    EXPECT_FALSE(test_cases[2]->Failed());
+#endif  // GTEST_HAS_TYPED_TEST
+
+    const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
+    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
+    EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
+    EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
+    EXPECT_FALSE(tests[0]->should_run());
+
+    EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
+    EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[1]->value_param()));
+    EXPECT_TRUE(IsNull(tests[1]->type_param()));
+    EXPECT_TRUE(tests[1]->should_run());
+    EXPECT_TRUE(tests[1]->result()->Passed());
+    EXPECT_EQ(0, tests[1]->result()->test_property_count());
+
+    EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
+    EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[2]->value_param()));
+    EXPECT_TRUE(IsNull(tests[2]->type_param()));
+    EXPECT_TRUE(tests[2]->should_run());
+    EXPECT_TRUE(tests[2]->result()->Passed());
+    EXPECT_EQ(0, tests[2]->result()->test_property_count());
+
+    EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
+    EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[3]->value_param()));
+    EXPECT_TRUE(IsNull(tests[3]->type_param()));
+    EXPECT_TRUE(tests[3]->should_run());
+    EXPECT_TRUE(tests[3]->result()->Passed());
+    EXPECT_EQ(1, tests[3]->result()->test_property_count());
+    const TestProperty& property = tests[3]->result()->GetTestProperty(0);
+    EXPECT_STREQ("key", property.key());
+    EXPECT_STREQ("value", property.value());
+
+    delete[] tests;
+
+#if GTEST_HAS_TYPED_TEST
+    test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
+    tests = UnitTestHelper::GetSortedTests(test_case);
+
+    EXPECT_STREQ("Dummy", tests[0]->name());
+    EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[0]->value_param()));
+    EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
+    EXPECT_TRUE(tests[0]->should_run());
+    EXPECT_TRUE(tests[0]->result()->Passed());
+    EXPECT_EQ(0, tests[0]->result()->test_property_count());
+
+    delete[] tests;
+#endif  // GTEST_HAS_TYPED_TEST
+    delete[] test_cases;
+  }
+};
+
+}  // namespace internal
+}  // namespace testing
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());
+
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_all_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_all_test.cc
new file mode 100644
index 0000000..955aa62
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_all_test.cc
@@ -0,0 +1,47 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build most of Google Test's own tests
+// by compiling a single file.  This file serves this purpose.
+#include "test/gtest-filepath_test.cc"
+#include "test/gtest-linked_ptr_test.cc"
+#include "test/gtest-message_test.cc"
+#include "test/gtest-options_test.cc"
+#include "test/gtest-port_test.cc"
+#include "test/gtest_pred_impl_unittest.cc"
+#include "test/gtest_prod_test.cc"
+#include "test/gtest-test-part_test.cc"
+#include "test/gtest-typed-test_test.cc"
+#include "test/gtest-typed-test2_test.cc"
+#include "test/gtest_unittest.cc"
+#include "test/production.cc"
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_break_on_failure_unittest.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_break_on_failure_unittest.py
new file mode 100755
index 0000000..78f3e0f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_break_on_failure_unittest.py
@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test's break-on-failure mode.
+
+A user can ask Google Test to seg-fault when an assertion fails, using
+either the GTEST_BREAK_ON_FAILURE environment variable or the
+--gtest_break_on_failure flag.  This script tests such functionality
+by invoking gtest_break_on_failure_unittest_ (a program written with
+Google Test) with different environments and command line flags.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import gtest_test_utils
+import os
+import sys
+
+
+# Constants.
+
+IS_WINDOWS = os.name == 'nt'
+
+# The environment variable for enabling/disabling the break-on-failure mode.
+BREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'
+
+# The command line flag for enabling/disabling the break-on-failure mode.
+BREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'
+
+# The environment variable for enabling/disabling the throw-on-failure mode.
+THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'
+
+# The environment variable for enabling/disabling the catch-exceptions mode.
+CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'
+
+# Path to the gtest_break_on_failure_unittest_ program.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_break_on_failure_unittest_')
+
+
+environ = gtest_test_utils.environ
+SetEnvVar = gtest_test_utils.SetEnvVar
+
+# Tests in this file run a Google-Test-based test program and expect it
+# to terminate prematurely.  Therefore they are incompatible with
+# the premature-exit-file protocol by design.  Unset the
+# premature-exit filepath to prevent Google Test from creating
+# the file.
+SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
+
+
+def Run(command):
+  """Runs a command; returns 1 if it was killed by a signal, or 0 otherwise."""
+
+  p = gtest_test_utils.Subprocess(command, env=environ)
+  if p.terminated_by_signal:
+    return 1
+  else:
+    return 0
+
+
+# The tests.
+
+
+class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
+  """Tests using the GTEST_BREAK_ON_FAILURE environment variable or
+  the --gtest_break_on_failure flag to turn assertion failures into
+  segmentation faults.
+  """
+
+  def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
+    """Runs gtest_break_on_failure_unittest_ and verifies that it does
+    (or does not) have a seg-fault.
+
+    Args:
+      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
+                        variable; None if the variable should be unset.
+      flag_value:       value of the --gtest_break_on_failure flag;
+                        None if the flag should not be present.
+      expect_seg_fault: 1 if the program is expected to generate a seg-fault;
+                        0 otherwise.
+    """
+
+    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)
+
+    if env_var_value is None:
+      env_var_value_msg = ' is not set'
+    else:
+      env_var_value_msg = '=' + env_var_value
+
+    if flag_value is None:
+      flag = ''
+    elif flag_value == '0':
+      flag = '--%s=0' % BREAK_ON_FAILURE_FLAG
+    else:
+      flag = '--%s' % BREAK_ON_FAILURE_FLAG
+
+    command = [EXE_PATH]
+    if flag:
+      command.append(flag)
+
+    if expect_seg_fault:
+      should_or_not = 'should'
+    else:
+      should_or_not = 'should not'
+
+    has_seg_fault = Run(command)
+
+    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)
+
+    msg = ('when %s%s, an assertion failure in "%s" %s cause a seg-fault.' %
+           (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command),
+            should_or_not))
+    self.assert_(has_seg_fault == expect_seg_fault, msg)
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value=None,
+                      expect_seg_fault=0)
+
+  def testEnvVar(self):
+    """Tests using the GTEST_BREAK_ON_FAILURE environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value=None,
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value=None,
+                      expect_seg_fault=1)
+
+  def testFlag(self):
+    """Tests using the --gtest_break_on_failure flag."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='1',
+                      expect_seg_fault=1)
+
+  def testFlagOverridesEnvVar(self):
+    """Tests that the flag overrides the environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='1',
+                      expect_seg_fault=1)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='1',
+                      expect_seg_fault=1)
+
+  def testBreakOnFailureOverridesThrowOnFailure(self):
+    """Tests that gtest_break_on_failure overrides gtest_throw_on_failure."""
+
+    SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')
+    try:
+      self.RunAndVerify(env_var_value=None,
+                        flag_value='1',
+                        expect_seg_fault=1)
+    finally:
+      SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)
+
+  if IS_WINDOWS:
+    def testCatchExceptionsDoesNotInterfere(self):
+      """Tests that gtest_catch_exceptions doesn't interfere."""
+
+      SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')
+      try:
+        self.RunAndVerify(env_var_value='1',
+                          flag_value='1',
+                          expect_seg_fault=1)
+      finally:
+        SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc
new file mode 100644
index 0000000..dd07478
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc
@@ -0,0 +1,88 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Unit test for Google Test's break-on-failure mode.
+//
+// A user can ask Google Test to seg-fault when an assertion fails, using
+// either the GTEST_BREAK_ON_FAILURE environment variable or the
+// --gtest_break_on_failure flag.  This file is used for testing such
+// functionality.
+//
+// This program will be invoked from a Python unit test.  It is
+// expected to fail.  Don't run it directly.
+
+#include "gtest/gtest.h"
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>
+# include <stdlib.h>
+#endif
+
+namespace {
+
+// A test that's expected to fail.
+TEST(Foo, Bar) {
+  EXPECT_EQ(2, 3);
+}
+
+#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
+// On Windows Mobile global exception handlers are not supported.
+LONG WINAPI ExitWithExceptionCode(
+    struct _EXCEPTION_POINTERS* exception_pointers) {
+  exit(exception_pointers->ExceptionRecord->ExceptionCode);
+}
+#endif
+
+}  // namespace
+
+int main(int argc, char **argv) {
+#if GTEST_OS_WINDOWS
+  // Suppresses display of the Windows error dialog upon encountering
+  // a general protection fault (segment violation).
+  SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
+
+# if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
+
+  // The default unhandled exception filter does not always exit
+  // with the exception code as exit code - for example it exits with
+  // 0 for EXCEPTION_ACCESS_VIOLATION and 1 for EXCEPTION_BREAKPOINT
+  // if the application is compiled in debug mode. Thus we use our own
+  // filter which always exits with the exception code for unhandled
+  // exceptions.
+  SetUnhandledExceptionFilter(ExitWithExceptionCode);
+
+# endif
+#endif
+
+  testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_catch_exceptions_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_catch_exceptions_test.py
new file mode 100755
index 0000000..e6fc22f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_catch_exceptions_test.py
@@ -0,0 +1,237 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 Google Inc.  All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests Google Test's exception catching behavior.
+
+This script invokes gtest_catch_exceptions_test_ and
+gtest_catch_exceptions_ex_test_ (programs written with
+Google Test) and verifies their output.
+"""
+
+__author__ = 'vladl at google.com (Vlad Losev)'
+
+import os
+
+import gtest_test_utils
+
+# Constants.
+FLAG_PREFIX = '--gtest_'
+LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
+NO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'
+FILTER_FLAG = FLAG_PREFIX + 'filter'
+
+# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with
+# exceptions enabled.
+EX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_catch_exceptions_ex_test_')
+
+# Path to the gtest_catch_exceptions_test_ binary, compiled with
+# exceptions disabled.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_catch_exceptions_no_ex_test_')
+
+environ = gtest_test_utils.environ
+SetEnvVar = gtest_test_utils.SetEnvVar
+
+# Tests in this file run a Google-Test-based test program and expect it
+# to terminate prematurely.  Therefore they are incompatible with
+# the premature-exit-file protocol by design.  Unset the
+# premature-exit filepath to prevent Google Test from creating
+# the file.
+SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
+
+TEST_LIST = gtest_test_utils.Subprocess(
+    [EXE_PATH, LIST_TESTS_FLAG], env=environ).output
+
+SUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST
+
+if SUPPORTS_SEH_EXCEPTIONS:
+  BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH], env=environ).output
+
+EX_BINARY_OUTPUT = gtest_test_utils.Subprocess(
+    [EX_EXE_PATH], env=environ).output
+
+
+# The tests.
+if SUPPORTS_SEH_EXCEPTIONS:
+  # pylint:disable-msg=C6302
+  class CatchSehExceptionsTest(gtest_test_utils.TestCase):
+    """Tests exception-catching behavior."""
+
+
+    def TestSehExceptions(self, test_output):
+      self.assert_('SEH exception with code 0x2a thrown '
+                   'in the test fixture\'s constructor'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown '
+                   'in the test fixture\'s destructor'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in SetUp()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in TearDown()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in the test body'
+                   in test_output)
+
+    def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):
+      self.TestSehExceptions(EX_BINARY_OUTPUT)
+
+    def testCatchesSehExceptionsWithCxxExceptionsDisabled(self):
+      self.TestSehExceptions(BINARY_OUTPUT)
+
+
+class CatchCxxExceptionsTest(gtest_test_utils.TestCase):
+  """Tests C++ exception-catching behavior.
+
+     Tests in this test case verify that:
+     * C++ exceptions are caught and logged as C++ (not SEH) exceptions
+     * Exception thrown affect the remainder of the test work flow in the
+       expected manner.
+  """
+
+  def testCatchesCxxExceptionsInFixtureConstructor(self):
+    self.assert_('C++ exception with description '
+                 '"Standard C++ exception" thrown '
+                 'in the test fixture\'s constructor'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
+                 'This failure belongs in this test only if '
+                 '"CxxExceptionInConstructorTest" (no quotes) '
+                 'appears on the same line as words "called unexpectedly"')
+
+  if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in
+      EX_BINARY_OUTPUT):
+
+    def testCatchesCxxExceptionsInFixtureDestructor(self):
+      self.assert_('C++ exception with description '
+                   '"Standard C++ exception" thrown '
+                   'in the test fixture\'s destructor'
+                   in EX_BINARY_OUTPUT)
+      self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() '
+                   'called as expected.'
+                   in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInSetUpTestCase(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in SetUpTestCase()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest constructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest test body '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInTearDownTestCase(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in TearDownTestCase()'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInSetUp(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in SetUp()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
+                 'This failure belongs in this test only if '
+                 '"CxxExceptionInSetUpTest" (no quotes) '
+                 'appears on the same line as words "called unexpectedly"')
+
+  def testCatchesCxxExceptionsInTearDown(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in TearDown()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTearDownTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInTestBody(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in the test body'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesNonStdCxxExceptions(self):
+    self.assert_('Unknown C++ exception thrown in the test body'
+                 in EX_BINARY_OUTPUT)
+
+  def testUnhandledCxxExceptionsAbortTheProgram(self):
+    # Filters out SEH exception tests on Windows. Unhandled SEH exceptions
+    # cause tests to show pop-up windows there.
+    FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'
+    # By default, Google Test doesn't catch the exceptions.
+    uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(
+        [EX_EXE_PATH,
+         NO_CATCH_EXCEPTIONS_FLAG,
+         FITLER_OUT_SEH_TESTS_FLAG],
+        env=environ).output
+
+    self.assert_('Unhandled C++ exception terminating the program'
+                 in uncaught_exceptions_ex_binary_output)
+    self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc
new file mode 100644
index 0000000..d0fc82c
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc
@@ -0,0 +1,311 @@
+// Copyright 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself. Tests in this file throw C++ or SEH
+// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
+
+#include "gtest/gtest.h"
+
+#include <stdio.h>  // NOLINT
+#include <stdlib.h>  // For exit().
+
+#if GTEST_HAS_SEH
+# include <windows.h>
+#endif
+
+#if GTEST_HAS_EXCEPTIONS
+# include <exception>  // For set_terminate().
+# include <stdexcept>
+#endif
+
+using testing::Test;
+
+#if GTEST_HAS_SEH
+
+class SehExceptionInConstructorTest : public Test {
+ public:
+  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}
+
+class SehExceptionInDestructorTest : public Test {
+ public:
+  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
+
+class SehExceptionInSetUpTestCaseTest : public Test {
+ public:
+  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}
+
+class SehExceptionInTearDownTestCaseTest : public Test {
+ public:
+  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
+
+class SehExceptionInSetUpTest : public Test {
+ protected:
+  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}
+
+class SehExceptionInTearDownTest : public Test {
+ protected:
+  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
+
+TEST(SehExceptionTest, ThrowsSehException) {
+  RaiseException(42, 0, 0, NULL);
+}
+
+#endif  // GTEST_HAS_SEH
+
+#if GTEST_HAS_EXCEPTIONS
+
+class CxxExceptionInConstructorTest : public Test {
+ public:
+  CxxExceptionInConstructorTest() {
+    // Without this macro VC++ complains about unreachable code at the end of
+    // the constructor.
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
+        throw std::runtime_error("Standard C++ exception"));
+  }
+
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInConstructorTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInConstructorTest() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest destructor "
+                  << "called unexpectedly.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() "
+                  << "called unexpectedly.";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() "
+                  << "called unexpectedly.";
+  }
+};
+
+TEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {
+  ADD_FAILURE() << "CxxExceptionInConstructorTest test body "
+                << "called unexpectedly.";
+}
+
+// Exceptions in destructors are not supported in C++11.
+#if !defined(__GXX_EXPERIMENTAL_CXX0X__) &&  __cplusplus < 201103L
+class CxxExceptionInDestructorTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInDestructorTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInDestructorTest() {
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
+        throw std::runtime_error("Standard C++ exception"));
+  }
+};
+
+TEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
+#endif  // C++11 mode
+
+class CxxExceptionInSetUpTestCaseTest : public Test {
+ public:
+  CxxExceptionInSetUpTestCaseTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest constructor "
+           "called as expected.\n");
+  }
+
+  static void SetUpTestCase() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInSetUpTestCaseTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void SetUp() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::SetUp() "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {
+  printf("%s",
+         "CxxExceptionInSetUpTestCaseTest test body "
+         "called as expected.\n");
+}
+
+class CxxExceptionInTearDownTestCaseTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+};
+
+TEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
+
+class CxxExceptionInSetUpTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInSetUpTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInSetUpTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInSetUpTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {
+  ADD_FAILURE() << "CxxExceptionInSetUpTest test body "
+                << "called unexpectedly.";
+}
+
+class CxxExceptionInTearDownTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInTearDownTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInTearDownTest() {
+    printf("%s",
+           "CxxExceptionInTearDownTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+};
+
+TEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
+
+class CxxExceptionInTestBodyTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInTestBodyTest() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {
+  throw std::runtime_error("Standard C++ exception");
+}
+
+TEST(CxxExceptionTest, ThrowsNonStdCxxException) {
+  throw "C-string";
+}
+
+// This terminate handler aborts the program using exit() rather than abort().
+// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
+// ones.
+void TerminateHandler() {
+  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
+  fflush(NULL);
+  exit(3);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+int main(int argc, char** argv) {
+#if GTEST_HAS_EXCEPTIONS
+  std::set_terminate(&TerminateHandler);
+#endif
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_color_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_color_test.py
new file mode 100755
index 0000000..d02a53e
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_color_test.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test correctly determines whether to use colors."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+IS_WINDOWS = os.name = 'nt'
+
+COLOR_ENV_VAR = 'GTEST_COLOR'
+COLOR_FLAG = 'gtest_color'
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_color_test_')
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    os.environ[env_var] = value
+  elif env_var in os.environ:
+    del os.environ[env_var]
+
+
+def UsesColor(term, color_env_var, color_flag):
+  """Runs gtest_color_test_ and returns its exit code."""
+
+  SetEnvVar('TERM', term)
+  SetEnvVar(COLOR_ENV_VAR, color_env_var)
+
+  if color_flag is None:
+    args = []
+  else:
+    args = ['--%s=%s' % (COLOR_FLAG, color_flag)]
+  p = gtest_test_utils.Subprocess([COMMAND] + args)
+  return not p.exited or p.exit_code
+
+
+class GTestColorTest(gtest_test_utils.TestCase):
+  def testNoEnvVarNoFlag(self):
+    """Tests the case when there's neither GTEST_COLOR nor --gtest_color."""
+
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('dumb', None, None))
+      self.assert_(not UsesColor('emacs', None, None))
+      self.assert_(not UsesColor('xterm-mono', None, None))
+      self.assert_(not UsesColor('unknown', None, None))
+      self.assert_(not UsesColor(None, None, None))
+    self.assert_(UsesColor('linux', None, None))
+    self.assert_(UsesColor('cygwin', None, None))
+    self.assert_(UsesColor('xterm', None, None))
+    self.assert_(UsesColor('xterm-color', None, None))
+    self.assert_(UsesColor('xterm-256color', None, None))
+
+  def testFlagOnly(self):
+    """Tests the case when there's --gtest_color but not GTEST_COLOR."""
+
+    self.assert_(not UsesColor('dumb', None, 'no'))
+    self.assert_(not UsesColor('xterm-color', None, 'no'))
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('emacs', None, 'auto'))
+    self.assert_(UsesColor('xterm', None, 'auto'))
+    self.assert_(UsesColor('dumb', None, 'yes'))
+    self.assert_(UsesColor('xterm', None, 'yes'))
+
+  def testEnvVarOnly(self):
+    """Tests the case when there's GTEST_COLOR but not --gtest_color."""
+
+    self.assert_(not UsesColor('dumb', 'no', None))
+    self.assert_(not UsesColor('xterm-color', 'no', None))
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('dumb', 'auto', None))
+    self.assert_(UsesColor('xterm-color', 'auto', None))
+    self.assert_(UsesColor('dumb', 'yes', None))
+    self.assert_(UsesColor('xterm-color', 'yes', None))
+
+  def testEnvVarAndFlag(self):
+    """Tests the case when there are both GTEST_COLOR and --gtest_color."""
+
+    self.assert_(not UsesColor('xterm-color', 'no', 'no'))
+    self.assert_(UsesColor('dumb', 'no', 'yes'))
+    self.assert_(UsesColor('xterm-color', 'no', 'auto'))
+
+  def testAliasesOfYesAndNo(self):
+    """Tests using aliases in specifying --gtest_color."""
+
+    self.assert_(UsesColor('dumb', None, 'true'))
+    self.assert_(UsesColor('dumb', None, 'YES'))
+    self.assert_(UsesColor('dumb', None, 'T'))
+    self.assert_(UsesColor('dumb', None, '1'))
+
+    self.assert_(not UsesColor('xterm', None, 'f'))
+    self.assert_(not UsesColor('xterm', None, 'false'))
+    self.assert_(not UsesColor('xterm', None, '0'))
+    self.assert_(not UsesColor('xterm', None, 'unknown'))
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_color_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_color_test_.cc
new file mode 100644
index 0000000..f61ebb8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_color_test_.cc
@@ -0,0 +1,71 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// A helper program for testing how Google Test determines whether to use
+// colors in the output.  It prints "YES" and returns 1 if Google Test
+// decides to use colors, and prints "NO" and returns 0 otherwise.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using testing::internal::ShouldUseColor;
+
+// The purpose of this is to ensure that the UnitTest singleton is
+// created before main() is entered, and thus that ShouldUseColor()
+// works the same way as in a real Google-Test-based test.  We don't actual
+// run the TEST itself.
+TEST(GTestColorTest, Dummy) {
+}
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  if (ShouldUseColor(true)) {
+    // Google Test decides to use colors in the output (assuming it
+    // goes to a TTY).
+    printf("YES\n");
+    return 1;
+  } else {
+    // Google Test decides not to use colors in the output.
+    printf("NO\n");
+    return 0;
+  }
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_env_var_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_env_var_test.py
new file mode 100755
index 0000000..ac24337
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_env_var_test.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test correctly parses environment variables."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+IS_WINDOWS = os.name == 'nt'
+IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
+
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_env_var_test_')
+
+environ = os.environ.copy()
+
+
+def AssertEq(expected, actual):
+  if expected != actual:
+    print 'Expected: %s' % (expected,)
+    print '  Actual: %s' % (actual,)
+    raise AssertionError
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+def GetFlag(flag):
+  """Runs gtest_env_var_test_ and returns its output."""
+
+  args = [COMMAND]
+  if flag is not None:
+    args += [flag]
+  return gtest_test_utils.Subprocess(args, env=environ).output
+
+
+def TestFlag(flag, test_val, default_val):
+  """Verifies that the given flag is affected by the corresponding env var."""
+
+  env_var = 'GTEST_' + flag.upper()
+  SetEnvVar(env_var, test_val)
+  AssertEq(test_val, GetFlag(flag))
+  SetEnvVar(env_var, None)
+  AssertEq(default_val, GetFlag(flag))
+
+
+class GTestEnvVarTest(gtest_test_utils.TestCase):
+  def testEnvVarAffectsFlag(self):
+    """Tests that environment variable should affect the corresponding flag."""
+
+    TestFlag('break_on_failure', '1', '0')
+    TestFlag('color', 'yes', 'auto')
+    TestFlag('filter', 'FooTest.Bar', '*')
+    TestFlag('output', 'xml:tmp/foo.xml', '')
+    TestFlag('print_time', '0', '1')
+    TestFlag('repeat', '999', '1')
+    TestFlag('throw_on_failure', '1', '0')
+    TestFlag('death_test_style', 'threadsafe', 'fast')
+    TestFlag('catch_exceptions', '0', '1')
+
+    if IS_LINUX:
+      TestFlag('death_test_use_fork', '1', '0')
+      TestFlag('stack_trace_depth', '0', '100')
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_env_var_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_env_var_test_.cc
new file mode 100644
index 0000000..539afc9
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_env_var_test_.cc
@@ -0,0 +1,126 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// A helper program for testing that Google Test parses the environment
+// variables correctly.
+
+#include "gtest/gtest.h"
+
+#include <iostream>
+
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using ::std::cout;
+
+namespace testing {
+
+// The purpose of this is to make the test more realistic by ensuring
+// that the UnitTest singleton is created before main() is entered.
+// We don't actual run the TEST itself.
+TEST(GTestEnvVarTest, Dummy) {
+}
+
+void PrintFlag(const char* flag) {
+  if (strcmp(flag, "break_on_failure") == 0) {
+    cout << GTEST_FLAG(break_on_failure);
+    return;
+  }
+
+  if (strcmp(flag, "catch_exceptions") == 0) {
+    cout << GTEST_FLAG(catch_exceptions);
+    return;
+  }
+
+  if (strcmp(flag, "color") == 0) {
+    cout << GTEST_FLAG(color);
+    return;
+  }
+
+  if (strcmp(flag, "death_test_style") == 0) {
+    cout << GTEST_FLAG(death_test_style);
+    return;
+  }
+
+  if (strcmp(flag, "death_test_use_fork") == 0) {
+    cout << GTEST_FLAG(death_test_use_fork);
+    return;
+  }
+
+  if (strcmp(flag, "filter") == 0) {
+    cout << GTEST_FLAG(filter);
+    return;
+  }
+
+  if (strcmp(flag, "output") == 0) {
+    cout << GTEST_FLAG(output);
+    return;
+  }
+
+  if (strcmp(flag, "print_time") == 0) {
+    cout << GTEST_FLAG(print_time);
+    return;
+  }
+
+  if (strcmp(flag, "repeat") == 0) {
+    cout << GTEST_FLAG(repeat);
+    return;
+  }
+
+  if (strcmp(flag, "stack_trace_depth") == 0) {
+    cout << GTEST_FLAG(stack_trace_depth);
+    return;
+  }
+
+  if (strcmp(flag, "throw_on_failure") == 0) {
+    cout << GTEST_FLAG(throw_on_failure);
+    return;
+  }
+
+  cout << "Invalid flag name " << flag
+       << ".  Valid names are break_on_failure, color, filter, etc.\n";
+  exit(1);
+}
+
+}  // namespace testing
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  if (argc != 2) {
+    cout << "Usage: gtest_env_var_test_ NAME_OF_FLAG\n";
+    return 1;
+  }
+
+  testing::PrintFlag(argv[1]);
+  return 0;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_environment_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_environment_test.cc
new file mode 100644
index 0000000..3cff19e
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_environment_test.cc
@@ -0,0 +1,192 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests using global test environments.
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "gtest/gtest.h"
+
+#define GTEST_IMPLEMENTATION_ 1  // Required for the next #include.
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+GTEST_DECLARE_string_(filter);
+}
+
+namespace {
+
+enum FailureType {
+  NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE
+};
+
+// For testing using global test environments.
+class MyEnvironment : public testing::Environment {
+ public:
+  MyEnvironment() { Reset(); }
+
+  // Depending on the value of failure_in_set_up_, SetUp() will
+  // generate a non-fatal failure, generate a fatal failure, or
+  // succeed.
+  virtual void SetUp() {
+    set_up_was_run_ = true;
+
+    switch (failure_in_set_up_) {
+      case NON_FATAL_FAILURE:
+        ADD_FAILURE() << "Expected non-fatal failure in global set-up.";
+        break;
+      case FATAL_FAILURE:
+        FAIL() << "Expected fatal failure in global set-up.";
+        break;
+      default:
+        break;
+    }
+  }
+
+  // Generates a non-fatal failure.
+  virtual void TearDown() {
+    tear_down_was_run_ = true;
+    ADD_FAILURE() << "Expected non-fatal failure in global tear-down.";
+  }
+
+  // Resets the state of the environment s.t. it can be reused.
+  void Reset() {
+    failure_in_set_up_ = NO_FAILURE;
+    set_up_was_run_ = false;
+    tear_down_was_run_ = false;
+  }
+
+  // We call this function to set the type of failure SetUp() should
+  // generate.
+  void set_failure_in_set_up(FailureType type) {
+    failure_in_set_up_ = type;
+  }
+
+  // Was SetUp() run?
+  bool set_up_was_run() const { return set_up_was_run_; }
+
+  // Was TearDown() run?
+  bool tear_down_was_run() const { return tear_down_was_run_; }
+
+ private:
+  FailureType failure_in_set_up_;
+  bool set_up_was_run_;
+  bool tear_down_was_run_;
+};
+
+// Was the TEST run?
+bool test_was_run;
+
+// The sole purpose of this TEST is to enable us to check whether it
+// was run.
+TEST(FooTest, Bar) {
+  test_was_run = true;
+}
+
+// Prints the message and aborts the program if condition is false.
+void Check(bool condition, const char* msg) {
+  if (!condition) {
+    printf("FAILED: %s\n", msg);
+    testing::internal::posix::Abort();
+  }
+}
+
+// Runs the tests.  Return true iff successful.
+//
+// The 'failure' parameter specifies the type of failure that should
+// be generated by the global set-up.
+int RunAllTests(MyEnvironment* env, FailureType failure) {
+  env->Reset();
+  env->set_failure_in_set_up(failure);
+  test_was_run = false;
+  testing::internal::GetUnitTestImpl()->ClearAdHocTestResult();
+  return RUN_ALL_TESTS();
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // Registers a global test environment, and verifies that the
+  // registration function returns its argument.
+  MyEnvironment* const env = new MyEnvironment;
+  Check(testing::AddGlobalTestEnvironment(env) == env,
+        "AddGlobalTestEnvironment() should return its argument.");
+
+  // Verifies that RUN_ALL_TESTS() runs the tests when the global
+  // set-up is successful.
+  Check(RunAllTests(env, NO_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as the global tear-down "
+        "should generate a failure.");
+  Check(test_was_run,
+        "The tests should run, as the global set-up should generate no "
+        "failure");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() runs the tests when the global
+  // set-up generates no fatal failure.
+  Check(RunAllTests(env, NON_FATAL_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as both the global set-up "
+        "and the global tear-down should generate a non-fatal failure.");
+  Check(test_was_run,
+        "The tests should run, as the global set-up should generate no "
+        "fatal failure.");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() runs no test when the global set-up
+  // generates a fatal failure.
+  Check(RunAllTests(env, FATAL_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as the global set-up "
+        "should generate a fatal failure.");
+  Check(!test_was_run,
+        "The tests should not run, as the global set-up should generate "
+        "a fatal failure.");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() doesn't do global set-up or
+  // tear-down when there is no test to run.
+  testing::GTEST_FLAG(filter) = "-*";
+  Check(RunAllTests(env, NO_FAILURE) == 0,
+        "RUN_ALL_TESTS() should return zero, as there is no test to run.");
+  Check(!env->set_up_was_run(),
+        "The global set-up should not run, as there is no test to run.");
+  Check(!env->tear_down_was_run(),
+        "The global tear-down should not run, "
+        "as the global set-up was not run.");
+
+  printf("PASS\n");
+  return 0;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_filter_unittest.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_filter_unittest.py
new file mode 100755
index 0000000..0d1a770
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_filter_unittest.py
@@ -0,0 +1,633 @@
+#!/usr/bin/env python
+#
+# Copyright 2005 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test test filters.
+
+A user can specify which test(s) in a Google Test program to run via either
+the GTEST_FILTER environment variable or the --gtest_filter flag.
+This script tests such functionality by invoking
+gtest_filter_unittest_ (a program written with Google Test) with different
+environments and command line flags.
+
+Note that test sharding may also influence which tests are filtered. Therefore,
+we test that here also.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sets
+import sys
+
+import gtest_test_utils
+
+# Constants.
+
+# Checks if this platform can pass empty environment variables to child
+# processes.  We set an env variable to an empty string and invoke a python
+# script in a subprocess to print whether the variable is STILL in
+# os.environ.  We then use 'eval' to parse the child's output so that an
+# exception is thrown if the input is anything other than 'True' nor 'False'.
+os.environ['EMPTY_VAR'] = ''
+child = gtest_test_utils.Subprocess(
+    [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ'])
+CAN_PASS_EMPTY_ENV = eval(child.output)
+
+
+# Check if this platform can unset environment variables in child processes.
+# We set an env variable to a non-empty string, unset it, and invoke
+# a python script in a subprocess to print whether the variable
+# is NO LONGER in os.environ.
+# We use 'eval' to parse the child's output so that an exception
+# is thrown if the input is neither 'True' nor 'False'.
+os.environ['UNSET_VAR'] = 'X'
+del os.environ['UNSET_VAR']
+child = gtest_test_utils.Subprocess(
+    [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ'])
+CAN_UNSET_ENV = eval(child.output)
+
+
+# Checks if we should test with an empty filter. This doesn't
+# make sense on platforms that cannot pass empty env variables (Win32)
+# and on platforms that cannot unset variables (since we cannot tell
+# the difference between "" and NULL -- Borland and Solaris < 5.10)
+CAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)
+
+
+# The environment variable for specifying the test filters.
+FILTER_ENV_VAR = 'GTEST_FILTER'
+
+# The environment variables for test sharding.
+TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
+SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
+SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
+
+# The command line flag for specifying the test filters.
+FILTER_FLAG = 'gtest_filter'
+
+# The command line flag for including disabled tests.
+ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
+
+# Command to run the gtest_filter_unittest_ program.
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
+
+# Regex for determining whether parameterized tests are enabled in the binary.
+PARAM_TEST_REGEX = re.compile(r'/ParamTest')
+
+# Regex for parsing test case names from Google Test's output.
+TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
+
+# Regex for parsing test names from Google Test's output.
+TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
+
+# The command line flag to tell Google Test to output the list of tests it
+# will run.
+LIST_TESTS_FLAG = '--gtest_list_tests'
+
+# Indicates whether Google Test supports death tests.
+SUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(
+    [COMMAND, LIST_TESTS_FLAG]).output
+
+# Full names of all tests in gtest_filter_unittests_.
+PARAM_TESTS = [
+    'SeqP/ParamTest.TestX/0',
+    'SeqP/ParamTest.TestX/1',
+    'SeqP/ParamTest.TestY/0',
+    'SeqP/ParamTest.TestY/1',
+    'SeqQ/ParamTest.TestX/0',
+    'SeqQ/ParamTest.TestX/1',
+    'SeqQ/ParamTest.TestY/0',
+    'SeqQ/ParamTest.TestY/1',
+    ]
+
+DISABLED_TESTS = [
+    'BarTest.DISABLED_TestFour',
+    'BarTest.DISABLED_TestFive',
+    'BazTest.DISABLED_TestC',
+    'DISABLED_FoobarTest.Test1',
+    'DISABLED_FoobarTest.DISABLED_Test2',
+    'DISABLED_FoobarbazTest.TestA',
+    ]
+
+if SUPPORTS_DEATH_TESTS:
+  DEATH_TESTS = [
+    'HasDeathTest.Test1',
+    'HasDeathTest.Test2',
+    ]
+else:
+  DEATH_TESTS = []
+
+# All the non-disabled tests.
+ACTIVE_TESTS = [
+    'FooTest.Abc',
+    'FooTest.Xyz',
+
+    'BarTest.TestOne',
+    'BarTest.TestTwo',
+    'BarTest.TestThree',
+
+    'BazTest.TestOne',
+    'BazTest.TestA',
+    'BazTest.TestB',
+    ] + DEATH_TESTS + PARAM_TESTS
+
+param_tests_present = None
+
+# Utilities.
+
+environ = os.environ.copy()
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+def RunAndReturnOutput(args = None):
+  """Runs the test program and returns its output."""
+
+  return gtest_test_utils.Subprocess([COMMAND] + (args or []),
+                                     env=environ).output
+
+
+def RunAndExtractTestList(args = None):
+  """Runs the test program and returns its exit code and a list of tests run."""
+
+  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)
+  tests_run = []
+  test_case = ''
+  test = ''
+  for line in p.output.split('\n'):
+    match = TEST_CASE_REGEX.match(line)
+    if match is not None:
+      test_case = match.group(1)
+    else:
+      match = TEST_REGEX.match(line)
+      if match is not None:
+        test = match.group(1)
+        tests_run.append(test_case + '.' + test)
+  return (tests_run, p.exit_code)
+
+
+def InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
+  """Runs the given function and arguments in a modified environment."""
+  try:
+    original_env = environ.copy()
+    environ.update(extra_env)
+    return function(*args, **kwargs)
+  finally:
+    environ.clear()
+    environ.update(original_env)
+
+
+def RunWithSharding(total_shards, shard_index, command):
+  """Runs a test program shard and returns exit code and a list of tests run."""
+
+  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
+               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
+  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
+
+# The unit test.
+
+
+class GTestFilterUnitTest(gtest_test_utils.TestCase):
+  """Tests the env variable or the command line flag to filter tests."""
+
+  # Utilities.
+
+  def AssertSetEqual(self, lhs, rhs):
+    """Asserts that two sets are equal."""
+
+    for elem in lhs:
+      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
+
+    for elem in rhs:
+      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
+
+  def AssertPartitionIsValid(self, set_var, list_of_sets):
+    """Asserts that list_of_sets is a valid partition of set_var."""
+
+    full_partition = []
+    for slice_var in list_of_sets:
+      full_partition.extend(slice_var)
+    self.assertEqual(len(set_var), len(full_partition))
+    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
+
+  def AdjustForParameterizedTests(self, tests_to_run):
+    """Adjust tests_to_run in case value parameterized tests are disabled."""
+
+    global param_tests_present
+    if not param_tests_present:
+      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
+    else:
+      return tests_to_run
+
+  def RunAndVerify(self, gtest_filter, tests_to_run):
+    """Checks that the binary runs correct set of tests for a given filter."""
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # First, tests using the environment variable.
+
+    # Windows removes empty variables from the environment when passing it
+    # to a new process.  This means it is impossible to pass an empty filter
+    # into a process using the environment variable.  However, we can still
+    # test the case when the variable is not supplied (i.e., gtest_filter is
+    # None).
+    # pylint: disable-msg=C6403
+    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
+      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
+      tests_run = RunAndExtractTestList()[0]
+      SetEnvVar(FILTER_ENV_VAR, None)
+      self.AssertSetEqual(tests_run, tests_to_run)
+    # pylint: enable-msg=C6403
+
+    # Next, tests using the command line flag.
+
+    if gtest_filter is None:
+      args = []
+    else:
+      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
+
+    tests_run = RunAndExtractTestList(args)[0]
+    self.AssertSetEqual(tests_run, tests_to_run)
+
+  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
+                               args=None, check_exit_0=False):
+    """Checks that binary runs correct tests for the given filter and shard.
+
+    Runs all shards of gtest_filter_unittest_ with the given filter, and
+    verifies that the right set of tests were run. The union of tests run
+    on each shard should be identical to tests_to_run, without duplicates.
+
+    Args:
+      gtest_filter: A filter to apply to the tests.
+      total_shards: A total number of shards to split test run into.
+      tests_to_run: A set of tests expected to run.
+      args   :      Arguments to pass to the to the test binary.
+      check_exit_0: When set to a true value, make sure that all shards
+                    return 0.
+    """
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # Windows removes empty variables from the environment when passing it
+    # to a new process.  This means it is impossible to pass an empty filter
+    # into a process using the environment variable.  However, we can still
+    # test the case when the variable is not supplied (i.e., gtest_filter is
+    # None).
+    # pylint: disable-msg=C6403
+    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
+      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
+      partition = []
+      for i in range(0, total_shards):
+        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
+        if check_exit_0:
+          self.assertEqual(0, exit_code)
+        partition.append(tests_run)
+
+      self.AssertPartitionIsValid(tests_to_run, partition)
+      SetEnvVar(FILTER_ENV_VAR, None)
+    # pylint: enable-msg=C6403
+
+  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
+    """Checks that the binary runs correct set of tests for the given filter.
+
+    Runs gtest_filter_unittest_ with the given filter, and enables
+    disabled tests. Verifies that the right set of tests were run.
+
+    Args:
+      gtest_filter: A filter to apply to the tests.
+      tests_to_run: A set of tests expected to run.
+    """
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # Construct the command line.
+    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
+    if gtest_filter is not None:
+      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
+
+    tests_run = RunAndExtractTestList(args)[0]
+    self.AssertSetEqual(tests_run, tests_to_run)
+
+  def setUp(self):
+    """Sets up test case.
+
+    Determines whether value-parameterized tests are enabled in the binary and
+    sets the flags accordingly.
+    """
+
+    global param_tests_present
+    if param_tests_present is None:
+      param_tests_present = PARAM_TEST_REGEX.search(
+          RunAndReturnOutput()) is not None
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of not specifying the filter."""
+
+    self.RunAndVerify(None, ACTIVE_TESTS)
+
+  def testDefaultBehaviorWithShards(self):
+    """Tests the behavior without the filter, with sharding enabled."""
+
+    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
+
+  def testEmptyFilter(self):
+    """Tests an empty filter."""
+
+    self.RunAndVerify('', [])
+    self.RunAndVerifyWithSharding('', 1, [])
+    self.RunAndVerifyWithSharding('', 2, [])
+
+  def testBadFilter(self):
+    """Tests a filter that matches nothing."""
+
+    self.RunAndVerify('BadFilter', [])
+    self.RunAndVerifyAllowingDisabled('BadFilter', [])
+
+  def testFullName(self):
+    """Tests filtering by full name."""
+
+    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
+    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
+    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
+
+  def testUniversalFilters(self):
+    """Tests filters that match everything."""
+
+    self.RunAndVerify('*', ACTIVE_TESTS)
+    self.RunAndVerify('*.*', ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
+    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
+    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
+
+  def testFilterByTestCase(self):
+    """Tests filtering by test case name."""
+
+    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
+
+    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
+    self.RunAndVerify('BazTest.*', BAZ_TESTS)
+    self.RunAndVerifyAllowingDisabled('BazTest.*',
+                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
+
+  def testFilterByTest(self):
+    """Tests filtering by test name."""
+
+    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
+
+  def testFilterDisabledTests(self):
+    """Select only the disabled tests to run."""
+
+    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
+    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
+                                      ['DISABLED_FoobarTest.Test1'])
+
+    self.RunAndVerify('*DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
+
+    self.RunAndVerify('*.DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
+        'BarTest.DISABLED_TestFour',
+        'BarTest.DISABLED_TestFive',
+        'BazTest.DISABLED_TestC',
+        'DISABLED_FoobarTest.DISABLED_Test2',
+        ])
+
+    self.RunAndVerify('DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
+        'DISABLED_FoobarTest.Test1',
+        'DISABLED_FoobarTest.DISABLED_Test2',
+        'DISABLED_FoobarbazTest.TestA',
+        ])
+
+  def testWildcardInTestCaseName(self):
+    """Tests using wildcard in the test case name."""
+
+    self.RunAndVerify('*a*.*', [
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)
+
+  def testWildcardInTestName(self):
+    """Tests using wildcard in the test name."""
+
+    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
+
+  def testFilterWithoutDot(self):
+    """Tests a filter that has no '.' in it."""
+
+    self.RunAndVerify('*z*', [
+        'FooTest.Xyz',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        'BazTest.TestB',
+        ])
+
+  def testTwoPatterns(self):
+    """Tests filters that consist of two patterns."""
+
+    self.RunAndVerify('Foo*.*:*A*', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BazTest.TestA',
+        ])
+
+    # An empty pattern + a non-empty one
+    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
+
+  def testThreePatterns(self):
+    """Tests filters that consist of three patterns."""
+
+    self.RunAndVerify('*oo*:*A*:*One', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        ])
+
+    # The 2nd pattern is empty.
+    self.RunAndVerify('*oo*::*One', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+
+        'BazTest.TestOne',
+        ])
+
+    # The last 2 patterns are empty.
+    self.RunAndVerify('*oo*::', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+        ])
+
+  def testNegativeFilters(self):
+    self.RunAndVerify('*-BazTest.TestOne', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+
+        'BazTest.TestA',
+        'BazTest.TestB',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ])
+
+    # Tests without leading '*'.
+    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    # Value parameterized tests.
+    self.RunAndVerify('*/*', PARAM_TESTS)
+
+    # Value parameterized tests filtering by the sequence name.
+    self.RunAndVerify('SeqP/*', [
+        'SeqP/ParamTest.TestX/0',
+        'SeqP/ParamTest.TestX/1',
+        'SeqP/ParamTest.TestY/0',
+        'SeqP/ParamTest.TestY/1',
+        ])
+
+    # Value parameterized tests filtering by the test name.
+    self.RunAndVerify('*/0', [
+        'SeqP/ParamTest.TestX/0',
+        'SeqP/ParamTest.TestY/0',
+        'SeqQ/ParamTest.TestX/0',
+        'SeqQ/ParamTest.TestY/0',
+        ])
+
+  def testFlagOverridesEnvVar(self):
+    """Tests that the filter flag overrides the filtering env. variable."""
+
+    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
+    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
+    tests_run = RunAndExtractTestList(args)[0]
+    SetEnvVar(FILTER_ENV_VAR, None)
+
+    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
+
+  def testShardStatusFileIsCreated(self):
+    """Tests that the shard file is created if specified in the environment."""
+
+    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
+                                     'shard_status_file')
+    self.assert_(not os.path.exists(shard_status_file))
+
+    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
+    try:
+      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
+    finally:
+      self.assert_(os.path.exists(shard_status_file))
+      os.remove(shard_status_file)
+
+  def testShardStatusFileIsCreatedWithListTests(self):
+    """Tests that the shard file is created with the "list_tests" flag."""
+
+    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
+                                     'shard_status_file2')
+    self.assert_(not os.path.exists(shard_status_file))
+
+    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
+    try:
+      output = InvokeWithModifiedEnv(extra_env,
+                                     RunAndReturnOutput,
+                                     [LIST_TESTS_FLAG])
+    finally:
+      # This assertion ensures that Google Test enumerated the tests as
+      # opposed to running them.
+      self.assert_('[==========]' not in output,
+                   'Unexpected output during test enumeration.\n'
+                   'Please ensure that LIST_TESTS_FLAG is assigned the\n'
+                   'correct flag value for listing Google Test tests.')
+
+      self.assert_(os.path.exists(shard_status_file))
+      os.remove(shard_status_file)
+
+  if SUPPORTS_DEATH_TESTS:
+    def testShardingWorksWithDeathTests(self):
+      """Tests integration with death tests and sharding."""
+
+      gtest_filter = 'HasDeathTest.*:SeqP/*'
+      expected_tests = [
+          'HasDeathTest.Test1',
+          'HasDeathTest.Test2',
+
+          'SeqP/ParamTest.TestX/0',
+          'SeqP/ParamTest.TestX/1',
+          'SeqP/ParamTest.TestY/0',
+          'SeqP/ParamTest.TestY/1',
+          ]
+
+      for flag in ['--gtest_death_test_style=threadsafe',
+                   '--gtest_death_test_style=fast']:
+        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
+                                      check_exit_0=True, args=[flag])
+        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
+                                      check_exit_0=True, args=[flag])
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_filter_unittest_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_filter_unittest_.cc
new file mode 100644
index 0000000..77deffc
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_filter_unittest_.cc
@@ -0,0 +1,140 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Unit test for Google Test test filters.
+//
+// A user can specify which test(s) in a Google Test program to run via
+// either the GTEST_FILTER environment variable or the --gtest_filter
+// flag.  This is used for testing such functionality.
+//
+// The program will be invoked from a Python unit test.  Don't run it
+// directly.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+// Test case FooTest.
+
+class FooTest : public testing::Test {
+};
+
+TEST_F(FooTest, Abc) {
+}
+
+TEST_F(FooTest, Xyz) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case BarTest.
+
+TEST(BarTest, TestOne) {
+}
+
+TEST(BarTest, TestTwo) {
+}
+
+TEST(BarTest, TestThree) {
+}
+
+TEST(BarTest, DISABLED_TestFour) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(BarTest, DISABLED_TestFive) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case BazTest.
+
+TEST(BazTest, TestOne) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(BazTest, TestA) {
+}
+
+TEST(BazTest, TestB) {
+}
+
+TEST(BazTest, DISABLED_TestC) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case HasDeathTest
+
+TEST(HasDeathTest, Test1) {
+  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
+}
+
+// We need at least two death tests to make sure that the all death tests
+// aren't on the first shard.
+TEST(HasDeathTest, Test2) {
+  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
+}
+
+// Test case FoobarTest
+
+TEST(DISABLED_FoobarTest, Test1) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(DISABLED_FoobarTest, DISABLED_Test2) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case FoobarbazTest
+
+TEST(DISABLED_FoobarbazTest, TestA) {
+  FAIL() << "Expected failure.";
+}
+
+#if GTEST_HAS_PARAM_TEST
+class ParamTest : public testing::TestWithParam<int> {
+};
+
+TEST_P(ParamTest, TestX) {
+}
+
+TEST_P(ParamTest, TestY) {
+}
+
+INSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2));
+INSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6));
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_help_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_help_test.py
new file mode 100755
index 0000000..093c838
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_help_test.py
@@ -0,0 +1,172 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests the --help flag of Google C++ Testing Framework.
+
+SYNOPSIS
+       gtest_help_test.py --build_dir=BUILD/DIR
+         # where BUILD/DIR contains the built gtest_help_test_ file.
+       gtest_help_test.py
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import gtest_test_utils
+
+
+IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
+IS_WINDOWS = os.name == 'nt'
+
+PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')
+FLAG_PREFIX = '--gtest_'
+DEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'
+STREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'
+UNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'
+LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
+INCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),
+                           re.sub('^--', '/', LIST_TESTS_FLAG),
+                           re.sub('_', '-', LIST_TESTS_FLAG)]
+INTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'
+
+SUPPORTS_DEATH_TESTS = "DeathTest" in gtest_test_utils.Subprocess(
+    [PROGRAM_PATH, LIST_TESTS_FLAG]).output
+
+# The help message must match this regex.
+HELP_REGEX = re.compile(
+    FLAG_PREFIX + r'list_tests.*' +
+    FLAG_PREFIX + r'filter=.*' +
+    FLAG_PREFIX + r'also_run_disabled_tests.*' +
+    FLAG_PREFIX + r'repeat=.*' +
+    FLAG_PREFIX + r'shuffle.*' +
+    FLAG_PREFIX + r'random_seed=.*' +
+    FLAG_PREFIX + r'color=.*' +
+    FLAG_PREFIX + r'print_time.*' +
+    FLAG_PREFIX + r'output=.*' +
+    FLAG_PREFIX + r'break_on_failure.*' +
+    FLAG_PREFIX + r'throw_on_failure.*' +
+    FLAG_PREFIX + r'catch_exceptions=0.*',
+    re.DOTALL)
+
+
+def RunWithFlag(flag):
+  """Runs gtest_help_test_ with the given flag.
+
+  Returns:
+    the exit code and the text output as a tuple.
+  Args:
+    flag: the command-line flag to pass to gtest_help_test_, or None.
+  """
+
+  if flag is None:
+    command = [PROGRAM_PATH]
+  else:
+    command = [PROGRAM_PATH, flag]
+  child = gtest_test_utils.Subprocess(command)
+  return child.exit_code, child.output
+
+
+class GTestHelpTest(gtest_test_utils.TestCase):
+  """Tests the --help flag and its equivalent forms."""
+
+  def TestHelpFlag(self, flag):
+    """Verifies correct behavior when help flag is specified.
+
+    The right message must be printed and the tests must
+    skipped when the given flag is specified.
+
+    Args:
+      flag:  A flag to pass to the binary or None.
+    """
+
+    exit_code, output = RunWithFlag(flag)
+    self.assertEquals(0, exit_code)
+    self.assert_(HELP_REGEX.search(output), output)
+
+    if IS_LINUX:
+      self.assert_(STREAM_RESULT_TO_FLAG in output, output)
+    else:
+      self.assert_(STREAM_RESULT_TO_FLAG not in output, output)
+
+    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:
+      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)
+    else:
+      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)
+
+  def TestNonHelpFlag(self, flag):
+    """Verifies correct behavior when no help flag is specified.
+
+    Verifies that when no help flag is specified, the tests are run
+    and the help message is not printed.
+
+    Args:
+      flag:  A flag to pass to the binary or None.
+    """
+
+    exit_code, output = RunWithFlag(flag)
+    self.assert_(exit_code != 0)
+    self.assert_(not HELP_REGEX.search(output), output)
+
+  def testPrintsHelpWithFullFlag(self):
+    self.TestHelpFlag('--help')
+
+  def testPrintsHelpWithShortFlag(self):
+    self.TestHelpFlag('-h')
+
+  def testPrintsHelpWithQuestionFlag(self):
+    self.TestHelpFlag('-?')
+
+  def testPrintsHelpWithWindowsStyleQuestionFlag(self):
+    self.TestHelpFlag('/?')
+
+  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):
+    self.TestHelpFlag(UNKNOWN_FLAG)
+
+  def testPrintsHelpWithIncorrectFlagStyle(self):
+    for incorrect_flag in INCORRECT_FLAG_VARIANTS:
+      self.TestHelpFlag(incorrect_flag)
+
+  def testRunsTestsWithoutHelpFlag(self):
+    """Verifies that when no help flag is specified, the tests are run
+    and the help message is not printed."""
+
+    self.TestNonHelpFlag(None)
+
+  def testRunsTestsWithGtestInternalFlag(self):
+    """Verifies that the tests are run and no help message is printed when
+    a flag starting with Google Test prefix and 'internal_' is supplied."""
+
+    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_help_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_help_test_.cc
new file mode 100644
index 0000000..31f78c2
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_help_test_.cc
@@ -0,0 +1,46 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This program is meant to be run by gtest_help_test.py.  Do not run
+// it directly.
+
+#include "gtest/gtest.h"
+
+// When a help flag is specified, this program should skip the tests
+// and exit with 0; otherwise the following test will be executed,
+// causing this program to exit with a non-zero code.
+TEST(HelpFlagTest, ShouldNotBeRun) {
+  ASSERT_TRUE(false) << "Tests shouldn't be run when --help is specified.";
+}
+
+#if GTEST_HAS_DEATH_TEST
+TEST(DeathTest, UsedByPythonScriptToDetectSupportForDeathTestsInThisBinary) {}
+#endif
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_list_tests_unittest.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_list_tests_unittest.py
new file mode 100755
index 0000000..925b09d
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_list_tests_unittest.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test's --gtest_list_tests flag.
+
+A user can ask Google Test to list all tests by specifying the
+--gtest_list_tests flag.  This script tests such functionality
+by invoking gtest_list_tests_unittest_ (a program written with
+Google Test) the command line flags.
+"""
+
+__author__ = 'phanna at google.com (Patrick Hanna)'
+
+import gtest_test_utils
+import re
+
+
+# Constants.
+
+# The command line flag for enabling/disabling listing all tests.
+LIST_TESTS_FLAG = 'gtest_list_tests'
+
+# Path to the gtest_list_tests_unittest_ program.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_')
+
+# The expected output when running gtest_list_tests_unittest_ with
+# --gtest_list_tests
+EXPECTED_OUTPUT_NO_FILTER_RE = re.compile(r"""FooDeathTest\.
+  Test1
+Foo\.
+  Bar1
+  Bar2
+  DISABLED_Bar3
+Abc\.
+  Xyz
+  Def
+FooBar\.
+  Baz
+FooTest\.
+  Test1
+  DISABLED_Test2
+  Test3
+TypedTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
+  TestA
+  TestB
+TypedTest/1\.  # TypeParam = int\s*\*
+  TestA
+  TestB
+TypedTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
+  TestA
+  TestB
+My/TypeParamTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
+  TestA
+  TestB
+My/TypeParamTest/1\.  # TypeParam = int\s*\*
+  TestA
+  TestB
+My/TypeParamTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
+  TestA
+  TestB
+MyInstantiation/ValueParamTest\.
+  TestA/0  # GetParam\(\) = one line
+  TestA/1  # GetParam\(\) = two\\nlines
+  TestA/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
+  TestB/0  # GetParam\(\) = one line
+  TestB/1  # GetParam\(\) = two\\nlines
+  TestB/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
+""")
+
+# The expected output when running gtest_list_tests_unittest_ with
+# --gtest_list_tests and --gtest_filter=Foo*.
+EXPECTED_OUTPUT_FILTER_FOO_RE = re.compile(r"""FooDeathTest\.
+  Test1
+Foo\.
+  Bar1
+  Bar2
+  DISABLED_Bar3
+FooBar\.
+  Baz
+FooTest\.
+  Test1
+  DISABLED_Test2
+  Test3
+""")
+
+# Utilities.
+
+
+def Run(args):
+  """Runs gtest_list_tests_unittest_ and returns the list of tests printed."""
+
+  return gtest_test_utils.Subprocess([EXE_PATH] + args,
+                                     capture_stderr=False).output
+
+
+# The unit test.
+
+class GTestListTestsUnitTest(gtest_test_utils.TestCase):
+  """Tests using the --gtest_list_tests flag to list all tests."""
+
+  def RunAndVerify(self, flag_value, expected_output_re, other_flag):
+    """Runs gtest_list_tests_unittest_ and verifies that it prints
+    the correct tests.
+
+    Args:
+      flag_value:         value of the --gtest_list_tests flag;
+                          None if the flag should not be present.
+      expected_output_re: regular expression that matches the expected
+                          output after running command;
+      other_flag:         a different flag to be passed to command
+                          along with gtest_list_tests;
+                          None if the flag should not be present.
+    """
+
+    if flag_value is None:
+      flag = ''
+      flag_expression = 'not set'
+    elif flag_value == '0':
+      flag = '--%s=0' % LIST_TESTS_FLAG
+      flag_expression = '0'
+    else:
+      flag = '--%s' % LIST_TESTS_FLAG
+      flag_expression = '1'
+
+    args = [flag]
+
+    if other_flag is not None:
+      args += [other_flag]
+
+    output = Run(args)
+
+    if expected_output_re:
+      self.assert_(
+          expected_output_re.match(output),
+          ('when %s is %s, the output of "%s" is "%s",\n'
+           'which does not match regex "%s"' %
+           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output,
+            expected_output_re.pattern)))
+    else:
+      self.assert_(
+          not EXPECTED_OUTPUT_NO_FILTER_RE.match(output),
+          ('when %s is %s, the output of "%s" is "%s"'%
+           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output)))
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(flag_value=None,
+                      expected_output_re=None,
+                      other_flag=None)
+
+  def testFlag(self):
+    """Tests using the --gtest_list_tests flag."""
+
+    self.RunAndVerify(flag_value='0',
+                      expected_output_re=None,
+                      other_flag=None)
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
+                      other_flag=None)
+
+  def testOverrideNonFilterFlags(self):
+    """Tests that --gtest_list_tests overrides the non-filter flags."""
+
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
+                      other_flag='--gtest_break_on_failure')
+
+  def testWithFilterFlags(self):
+    """Tests that --gtest_list_tests takes into account the
+    --gtest_filter flag."""
+
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_FILTER_FOO_RE,
+                      other_flag='--gtest_filter=Foo*')
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_list_tests_unittest_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_list_tests_unittest_.cc
new file mode 100644
index 0000000..907c176
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_list_tests_unittest_.cc
@@ -0,0 +1,157 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: phanna at google.com (Patrick Hanna)
+
+// Unit test for Google Test's --gtest_list_tests flag.
+//
+// A user can ask Google Test to list all tests that will run
+// so that when using a filter, a user will know what
+// tests to look for. The tests will not be run after listing.
+//
+// This program will be invoked from a Python unit test.
+// Don't run it directly.
+
+#include "gtest/gtest.h"
+
+// Several different test cases and tests that will be listed.
+TEST(Foo, Bar1) {
+}
+
+TEST(Foo, Bar2) {
+}
+
+TEST(Foo, DISABLED_Bar3) {
+}
+
+TEST(Abc, Xyz) {
+}
+
+TEST(Abc, Def) {
+}
+
+TEST(FooBar, Baz) {
+}
+
+class FooTest : public testing::Test {
+};
+
+TEST_F(FooTest, Test1) {
+}
+
+TEST_F(FooTest, DISABLED_Test2) {
+}
+
+TEST_F(FooTest, Test3) {
+}
+
+TEST(FooDeathTest, Test1) {
+}
+
+// A group of value-parameterized tests.
+
+class MyType {
+ public:
+  explicit MyType(const std::string& a_value) : value_(a_value) {}
+
+  const std::string& value() const { return value_; }
+
+ private:
+  std::string value_;
+};
+
+// Teaches Google Test how to print a MyType.
+void PrintTo(const MyType& x, std::ostream* os) {
+  *os << x.value();
+}
+
+class ValueParamTest : public testing::TestWithParam<MyType> {
+};
+
+TEST_P(ValueParamTest, TestA) {
+}
+
+TEST_P(ValueParamTest, TestB) {
+}
+
+INSTANTIATE_TEST_CASE_P(
+    MyInstantiation, ValueParamTest,
+    testing::Values(MyType("one line"),
+                    MyType("two\nlines"),
+                    MyType("a very\nloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line")));  // NOLINT
+
+// A group of typed tests.
+
+// A deliberately long type name for testing the line-truncating
+// behavior when printing a type parameter.
+class VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName {  // NOLINT
+};
+
+template <typename T>
+class TypedTest : public testing::Test {
+};
+
+template <typename T, int kSize>
+class MyArray {
+};
+
+typedef testing::Types<VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName,  // NOLINT
+                       int*, MyArray<bool, 42> > MyTypes;
+
+TYPED_TEST_CASE(TypedTest, MyTypes);
+
+TYPED_TEST(TypedTest, TestA) {
+}
+
+TYPED_TEST(TypedTest, TestB) {
+}
+
+// A group of type-parameterized tests.
+
+template <typename T>
+class TypeParamTest : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(TypeParamTest);
+
+TYPED_TEST_P(TypeParamTest, TestA) {
+}
+
+TYPED_TEST_P(TypeParamTest, TestB) {
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypeParamTest, TestA, TestB);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, TypeParamTest, MyTypes);
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_main_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_main_unittest.cc
new file mode 100644
index 0000000..ecd9bb8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_main_unittest.cc
@@ -0,0 +1,45 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+// Tests that we don't have to define main() when we link to
+// gtest_main instead of gtest.
+
+namespace {
+
+TEST(GTestMainTest, ShouldSucceed) {
+}
+
+}  // namespace
+
+// We are using the main() function defined in src/gtest_main.cc, so
+// we don't define it here.
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_no_test_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_no_test_unittest.cc
new file mode 100644
index 0000000..292599a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_no_test_unittest.cc
@@ -0,0 +1,56 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Tests that a Google Test program that has no test defined can run
+// successfully.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // An ad-hoc assertion outside of all tests.
+  //
+  // This serves three purposes:
+  //
+  // 1. It verifies that an ad-hoc assertion can be executed even if
+  //    no test is defined.
+  // 2. It verifies that a failed ad-hoc assertion causes the test
+  //    program to fail.
+  // 3. We had a bug where the XML output won't be generated if an
+  //    assertion is executed before RUN_ALL_TESTS() is called, even
+  //    though --gtest_output=xml is specified.  This makes sure the
+  //    bug is fixed and doesn't regress.
+  EXPECT_EQ(1, 2);
+
+  // The above EXPECT_EQ() should cause RUN_ALL_TESTS() to return non-zero.
+  return RUN_ALL_TESTS() ? 0 : 1;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test.py
new file mode 100755
index 0000000..f409e2a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test.py
@@ -0,0 +1,335 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests the text output of Google C++ Testing Framework.
+
+SYNOPSIS
+       gtest_output_test.py --build_dir=BUILD/DIR --gengolden
+         # where BUILD/DIR contains the built gtest_output_test_ file.
+       gtest_output_test.py --gengolden
+       gtest_output_test.py
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sys
+import gtest_test_utils
+
+
+# The flag for generating the golden file
+GENGOLDEN_FLAG = '--gengolden'
+CATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS'
+
+IS_WINDOWS = os.name == 'nt'
+
+# TODO(vladl at google.com): remove the _lin suffix.
+GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
+
+PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_')
+
+# At least one command we exercise must not have the
+# --gtest_internal_skip_environment_and_ad_hoc_tests flag.
+COMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests'])
+COMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes'])
+COMMAND_WITH_TIME = ({}, [PROGRAM_PATH,
+                          '--gtest_print_time',
+                          '--gtest_internal_skip_environment_and_ad_hoc_tests',
+                          '--gtest_filter=FatalFailureTest.*:LoggingTest.*'])
+COMMAND_WITH_DISABLED = (
+    {}, [PROGRAM_PATH,
+         '--gtest_also_run_disabled_tests',
+         '--gtest_internal_skip_environment_and_ad_hoc_tests',
+         '--gtest_filter=*DISABLED_*'])
+COMMAND_WITH_SHARDING = (
+    {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'},
+    [PROGRAM_PATH,
+     '--gtest_internal_skip_environment_and_ad_hoc_tests',
+     '--gtest_filter=PassingTest.*'])
+
+GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME)
+
+
+def ToUnixLineEnding(s):
+  """Changes all Windows/Mac line endings in s to UNIX line endings."""
+
+  return s.replace('\r\n', '\n').replace('\r', '\n')
+
+
+def RemoveLocations(test_output):
+  """Removes all file location info from a Google Test program's output.
+
+  Args:
+       test_output:  the output of a Google Test program.
+
+  Returns:
+       output with all file location info (in the form of
+       'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or
+       'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by
+       'FILE_NAME:#: '.
+  """
+
+  return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output)
+
+
+def RemoveStackTraceDetails(output):
+  """Removes all stack traces from a Google Test program's output."""
+
+  # *? means "find the shortest string that matches".
+  return re.sub(r'Stack trace:(.|\n)*?\n\n',
+                'Stack trace: (omitted)\n\n', output)
+
+
+def RemoveStackTraces(output):
+  """Removes all traces of stack traces from a Google Test program's output."""
+
+  # *? means "find the shortest string that matches".
+  return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output)
+
+
+def RemoveTime(output):
+  """Removes all time information from a Google Test program's output."""
+
+  return re.sub(r'\(\d+ ms', '(? ms', output)
+
+
+def RemoveTypeInfoDetails(test_output):
+  """Removes compiler-specific type info from Google Test program's output.
+
+  Args:
+       test_output:  the output of a Google Test program.
+
+  Returns:
+       output with type information normalized to canonical form.
+  """
+
+  # some compilers output the name of type 'unsigned int' as 'unsigned'
+  return re.sub(r'unsigned int', 'unsigned', test_output)
+
+
+def NormalizeToCurrentPlatform(test_output):
+  """Normalizes platform specific output details for easier comparison."""
+
+  if IS_WINDOWS:
+    # Removes the color information that is not present on Windows.
+    test_output = re.sub('\x1b\\[(0;3\d)?m', '', test_output)
+    # Changes failure message headers into the Windows format.
+    test_output = re.sub(r': Failure\n', r': error: ', test_output)
+    # Changes file(line_number) to file:line_number.
+    test_output = re.sub(r'((\w|\.)+)\((\d+)\):', r'\1:\3:', test_output)
+
+  return test_output
+
+
+def RemoveTestCounts(output):
+  """Removes test counts from a Google Test program's output."""
+
+  output = re.sub(r'\d+ tests?, listed below',
+                  '? tests, listed below', output)
+  output = re.sub(r'\d+ FAILED TESTS',
+                  '? FAILED TESTS', output)
+  output = re.sub(r'\d+ tests? from \d+ test cases?',
+                  '? tests from ? test cases', output)
+  output = re.sub(r'\d+ tests? from ([a-zA-Z_])',
+                  r'? tests from \1', output)
+  return re.sub(r'\d+ tests?\.', '? tests.', output)
+
+
+def RemoveMatchingTests(test_output, pattern):
+  """Removes output of specified tests from a Google Test program's output.
+
+  This function strips not only the beginning and the end of a test but also
+  all output in between.
+
+  Args:
+    test_output:       A string containing the test output.
+    pattern:           A regex string that matches names of test cases or
+                       tests to remove.
+
+  Returns:
+    Contents of test_output with tests whose names match pattern removed.
+  """
+
+  test_output = re.sub(
+      r'.*\[ RUN      \] .*%s(.|\n)*?\[(  FAILED  |       OK )\] .*%s.*\n' % (
+          pattern, pattern),
+      '',
+      test_output)
+  return re.sub(r'.*%s.*\n' % pattern, '', test_output)
+
+
+def NormalizeOutput(output):
+  """Normalizes output (the output of gtest_output_test_.exe)."""
+
+  output = ToUnixLineEnding(output)
+  output = RemoveLocations(output)
+  output = RemoveStackTraceDetails(output)
+  output = RemoveTime(output)
+  return output
+
+
+def GetShellCommandOutput(env_cmd):
+  """Runs a command in a sub-process, and returns its output in a string.
+
+  Args:
+    env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra
+             environment variables to set, and element 1 is a string with
+             the command and any flags.
+
+  Returns:
+    A string with the command's combined standard and diagnostic output.
+  """
+
+  # Spawns cmd in a sub-process, and gets its standard I/O file objects.
+  # Set and save the environment properly.
+  environ = os.environ.copy()
+  environ.update(env_cmd[0])
+  p = gtest_test_utils.Subprocess(env_cmd[1], env=environ)
+
+  return p.output
+
+
+def GetCommandOutput(env_cmd):
+  """Runs a command and returns its output with all file location
+  info stripped off.
+
+  Args:
+    env_cmd:  The shell command. A 2-tuple where element 0 is a dict of extra
+              environment variables to set, and element 1 is a string with
+              the command and any flags.
+  """
+
+  # Disables exception pop-ups on Windows.
+  environ, cmdline = env_cmd
+  environ = dict(environ)  # Ensures we are modifying a copy.
+  environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1'
+  return NormalizeOutput(GetShellCommandOutput((environ, cmdline)))
+
+
+def GetOutputOfAllCommands():
+  """Returns concatenated output from several representative commands."""
+
+  return (GetCommandOutput(COMMAND_WITH_COLOR) +
+          GetCommandOutput(COMMAND_WITH_TIME) +
+          GetCommandOutput(COMMAND_WITH_DISABLED) +
+          GetCommandOutput(COMMAND_WITH_SHARDING))
+
+
+test_list = GetShellCommandOutput(COMMAND_LIST_TESTS)
+SUPPORTS_DEATH_TESTS = 'DeathTest' in test_list
+SUPPORTS_TYPED_TESTS = 'TypedTest' in test_list
+SUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list
+SUPPORTS_STACK_TRACES = False
+
+CAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and
+                            SUPPORTS_TYPED_TESTS and
+                            SUPPORTS_THREADS)
+
+
+class GTestOutputTest(gtest_test_utils.TestCase):
+  def RemoveUnsupportedTests(self, test_output):
+    if not SUPPORTS_DEATH_TESTS:
+      test_output = RemoveMatchingTests(test_output, 'DeathTest')
+    if not SUPPORTS_TYPED_TESTS:
+      test_output = RemoveMatchingTests(test_output, 'TypedTest')
+      test_output = RemoveMatchingTests(test_output, 'TypedDeathTest')
+      test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest')
+    if not SUPPORTS_THREADS:
+      test_output = RemoveMatchingTests(test_output,
+                                        'ExpectFailureWithThreadsTest')
+      test_output = RemoveMatchingTests(test_output,
+                                        'ScopedFakeTestPartResultReporterTest')
+      test_output = RemoveMatchingTests(test_output,
+                                        'WorksConcurrently')
+    if not SUPPORTS_STACK_TRACES:
+      test_output = RemoveStackTraces(test_output)
+
+    return test_output
+
+  def testOutput(self):
+    output = GetOutputOfAllCommands()
+
+    golden_file = open(GOLDEN_PATH, 'rb')
+    # A mis-configured source control system can cause \r appear in EOL
+    # sequences when we read the golden file irrespective of an operating
+    # system used. Therefore, we need to strip those \r's from newlines
+    # unconditionally.
+    golden = ToUnixLineEnding(golden_file.read())
+    golden_file.close()
+
+    # We want the test to pass regardless of certain features being
+    # supported or not.
+
+    # We still have to remove type name specifics in all cases.
+    normalized_actual = RemoveTypeInfoDetails(output)
+    normalized_golden = RemoveTypeInfoDetails(golden)
+
+    if CAN_GENERATE_GOLDEN_FILE:
+      self.assertEqual(normalized_golden, normalized_actual)
+    else:
+      normalized_actual = NormalizeToCurrentPlatform(
+          RemoveTestCounts(normalized_actual))
+      normalized_golden = NormalizeToCurrentPlatform(
+          RemoveTestCounts(self.RemoveUnsupportedTests(normalized_golden)))
+
+      # This code is very handy when debugging golden file differences:
+      if os.getenv('DEBUG_GTEST_OUTPUT_TEST'):
+        open(os.path.join(
+            gtest_test_utils.GetSourceDir(),
+            '_gtest_output_test_normalized_actual.txt'), 'wb').write(
+                normalized_actual)
+        open(os.path.join(
+            gtest_test_utils.GetSourceDir(),
+            '_gtest_output_test_normalized_golden.txt'), 'wb').write(
+                normalized_golden)
+
+      self.assertEqual(normalized_golden, normalized_actual)
+
+
+if __name__ == '__main__':
+  if sys.argv[1:] == [GENGOLDEN_FLAG]:
+    if CAN_GENERATE_GOLDEN_FILE:
+      output = GetOutputOfAllCommands()
+      golden_file = open(GOLDEN_PATH, 'wb')
+      golden_file.write(output)
+      golden_file.close()
+    else:
+      message = (
+          """Unable to write a golden file when compiled in an environment
+that does not support all the required features (death tests, typed tests,
+and multiple threads).  Please generate the golden file using a binary built
+with those features enabled.""")
+
+      sys.stderr.write(message)
+      sys.exit(1)
+  else:
+    gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test_.cc
new file mode 100644
index 0000000..07ab633
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test_.cc
@@ -0,0 +1,1034 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The purpose of this file is to generate Google Test output under
+// various conditions.  The output will then be verified by
+// gtest_output_test.py to ensure that Google Test generates the
+// desired messages.  Therefore, most tests in this file are MEANT TO
+// FAIL.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#include <stdlib.h>
+
+#if GTEST_IS_THREADSAFE
+using testing::ScopedFakeTestPartResultReporter;
+using testing::TestPartResultArray;
+
+using testing::internal::Notification;
+using testing::internal::ThreadWithParam;
+#endif
+
+namespace posix = ::testing::internal::posix;
+using testing::internal::scoped_ptr;
+
+// Tests catching fatal failures.
+
+// A subroutine used by the following test.
+void TestEq1(int x) {
+  ASSERT_EQ(1, x);
+}
+
+// This function calls a test subroutine, catches the fatal failure it
+// generates, and then returns early.
+void TryTestSubroutine() {
+  // Calls a subrountine that yields a fatal failure.
+  TestEq1(2);
+
+  // Catches the fatal failure and aborts the test.
+  //
+  // The testing::Test:: prefix is necessary when calling
+  // HasFatalFailure() outside of a TEST, TEST_F, or test fixture.
+  if (testing::Test::HasFatalFailure()) return;
+
+  // If we get here, something is wrong.
+  FAIL() << "This should never be reached.";
+}
+
+TEST(PassingTest, PassingTest1) {
+}
+
+TEST(PassingTest, PassingTest2) {
+}
+
+// Tests that parameters of failing parameterized tests are printed in the
+// failing test summary.
+class FailingParamTest : public testing::TestWithParam<int> {};
+
+TEST_P(FailingParamTest, Fails) {
+  EXPECT_EQ(1, GetParam());
+}
+
+// This generates a test which will fail. Google Test is expected to print
+// its parameter when it outputs the list of all failed tests.
+INSTANTIATE_TEST_CASE_P(PrintingFailingParams,
+                        FailingParamTest,
+                        testing::Values(2));
+
+static const char kGoldenString[] = "\"Line\0 1\"\nLine 2";
+
+TEST(NonfatalFailureTest, EscapesStringOperands) {
+  std::string actual = "actual \"string\"";
+  EXPECT_EQ(kGoldenString, actual);
+
+  const char* golden = kGoldenString;
+  EXPECT_EQ(golden, actual);
+}
+
+// Tests catching a fatal failure in a subroutine.
+TEST(FatalFailureTest, FatalFailureInSubroutine) {
+  printf("(expecting a failure that x should be 1)\n");
+
+  TryTestSubroutine();
+}
+
+// Tests catching a fatal failure in a nested subroutine.
+TEST(FatalFailureTest, FatalFailureInNestedSubroutine) {
+  printf("(expecting a failure that x should be 1)\n");
+
+  // Calls a subrountine that yields a fatal failure.
+  TryTestSubroutine();
+
+  // Catches the fatal failure and aborts the test.
+  //
+  // When calling HasFatalFailure() inside a TEST, TEST_F, or test
+  // fixture, the testing::Test:: prefix is not needed.
+  if (HasFatalFailure()) return;
+
+  // If we get here, something is wrong.
+  FAIL() << "This should never be reached.";
+}
+
+// Tests HasFatalFailure() after a failed EXPECT check.
+TEST(FatalFailureTest, NonfatalFailureInSubroutine) {
+  printf("(expecting a failure on false)\n");
+  EXPECT_TRUE(false);  // Generates a nonfatal failure
+  ASSERT_FALSE(HasFatalFailure());  // This should succeed.
+}
+
+// Tests interleaving user logging and Google Test assertions.
+TEST(LoggingTest, InterleavingLoggingAndAssertions) {
+  static const int a[4] = {
+    3, 9, 2, 6
+  };
+
+  printf("(expecting 2 failures on (3) >= (a[i]))\n");
+  for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {
+    printf("i == %d\n", i);
+    EXPECT_GE(3, a[i]);
+  }
+}
+
+// Tests the SCOPED_TRACE macro.
+
+// A helper function for testing SCOPED_TRACE.
+void SubWithoutTrace(int n) {
+  EXPECT_EQ(1, n);
+  ASSERT_EQ(2, n);
+}
+
+// Another helper function for testing SCOPED_TRACE.
+void SubWithTrace(int n) {
+  SCOPED_TRACE(testing::Message() << "n = " << n);
+
+  SubWithoutTrace(n);
+}
+
+// Tests that SCOPED_TRACE() obeys lexical scopes.
+TEST(SCOPED_TRACETest, ObeysScopes) {
+  printf("(expected to fail)\n");
+
+  // There should be no trace before SCOPED_TRACE() is invoked.
+  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
+
+  {
+    SCOPED_TRACE("Expected trace");
+    // After SCOPED_TRACE(), a failure in the current scope should contain
+    // the trace.
+    ADD_FAILURE() << "This failure is expected, and should have a trace.";
+  }
+
+  // Once the control leaves the scope of the SCOPED_TRACE(), there
+  // should be no trace again.
+  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
+}
+
+// Tests that SCOPED_TRACE works inside a loop.
+TEST(SCOPED_TRACETest, WorksInLoop) {
+  printf("(expected to fail)\n");
+
+  for (int i = 1; i <= 2; i++) {
+    SCOPED_TRACE(testing::Message() << "i = " << i);
+
+    SubWithoutTrace(i);
+  }
+}
+
+// Tests that SCOPED_TRACE works in a subroutine.
+TEST(SCOPED_TRACETest, WorksInSubroutine) {
+  printf("(expected to fail)\n");
+
+  SubWithTrace(1);
+  SubWithTrace(2);
+}
+
+// Tests that SCOPED_TRACE can be nested.
+TEST(SCOPED_TRACETest, CanBeNested) {
+  printf("(expected to fail)\n");
+
+  SCOPED_TRACE("");  // A trace without a message.
+
+  SubWithTrace(2);
+}
+
+// Tests that multiple SCOPED_TRACEs can be used in the same scope.
+TEST(SCOPED_TRACETest, CanBeRepeated) {
+  printf("(expected to fail)\n");
+
+  SCOPED_TRACE("A");
+  ADD_FAILURE()
+      << "This failure is expected, and should contain trace point A.";
+
+  SCOPED_TRACE("B");
+  ADD_FAILURE()
+      << "This failure is expected, and should contain trace point A and B.";
+
+  {
+    SCOPED_TRACE("C");
+    ADD_FAILURE() << "This failure is expected, and should "
+                  << "contain trace point A, B, and C.";
+  }
+
+  SCOPED_TRACE("D");
+  ADD_FAILURE() << "This failure is expected, and should "
+                << "contain trace point A, B, and D.";
+}
+
+#if GTEST_IS_THREADSAFE
+// Tests that SCOPED_TRACE()s can be used concurrently from multiple
+// threads.  Namely, an assertion should be affected by
+// SCOPED_TRACE()s in its own thread only.
+
+// Here's the sequence of actions that happen in the test:
+//
+//   Thread A (main)                | Thread B (spawned)
+//   ===============================|================================
+//   spawns thread B                |
+//   -------------------------------+--------------------------------
+//   waits for n1                   | SCOPED_TRACE("Trace B");
+//                                  | generates failure #1
+//                                  | notifies n1
+//   -------------------------------+--------------------------------
+//   SCOPED_TRACE("Trace A");       | waits for n2
+//   generates failure #2           |
+//   notifies n2                    |
+//   -------------------------------|--------------------------------
+//   waits for n3                   | generates failure #3
+//                                  | trace B dies
+//                                  | generates failure #4
+//                                  | notifies n3
+//   -------------------------------|--------------------------------
+//   generates failure #5           | finishes
+//   trace A dies                   |
+//   generates failure #6           |
+//   -------------------------------|--------------------------------
+//   waits for thread B to finish   |
+
+struct CheckPoints {
+  Notification n1;
+  Notification n2;
+  Notification n3;
+};
+
+static void ThreadWithScopedTrace(CheckPoints* check_points) {
+  {
+    SCOPED_TRACE("Trace B");
+    ADD_FAILURE()
+        << "Expected failure #1 (in thread B, only trace B alive).";
+    check_points->n1.Notify();
+    check_points->n2.WaitForNotification();
+
+    ADD_FAILURE()
+        << "Expected failure #3 (in thread B, trace A & B both alive).";
+  }  // Trace B dies here.
+  ADD_FAILURE()
+      << "Expected failure #4 (in thread B, only trace A alive).";
+  check_points->n3.Notify();
+}
+
+TEST(SCOPED_TRACETest, WorksConcurrently) {
+  printf("(expecting 6 failures)\n");
+
+  CheckPoints check_points;
+  ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace,
+                                       &check_points,
+                                       NULL);
+  check_points.n1.WaitForNotification();
+
+  {
+    SCOPED_TRACE("Trace A");
+    ADD_FAILURE()
+        << "Expected failure #2 (in thread A, trace A & B both alive).";
+    check_points.n2.Notify();
+    check_points.n3.WaitForNotification();
+
+    ADD_FAILURE()
+        << "Expected failure #5 (in thread A, only trace A alive).";
+  }  // Trace A dies here.
+  ADD_FAILURE()
+      << "Expected failure #6 (in thread A, no trace alive).";
+  thread.Join();
+}
+#endif  // GTEST_IS_THREADSAFE
+
+TEST(DisabledTestsWarningTest,
+     DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {
+  // This test body is intentionally empty.  Its sole purpose is for
+  // verifying that the --gtest_also_run_disabled_tests flag
+  // suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of
+  // the test output.
+}
+
+// Tests using assertions outside of TEST and TEST_F.
+//
+// This function creates two failures intentionally.
+void AdHocTest() {
+  printf("The non-test part of the code is expected to have 2 failures.\n\n");
+  EXPECT_TRUE(false);
+  EXPECT_EQ(2, 3);
+}
+
+// Runs all TESTs, all TEST_Fs, and the ad hoc test.
+int RunAllTests() {
+  AdHocTest();
+  return RUN_ALL_TESTS();
+}
+
+// Tests non-fatal failures in the fixture constructor.
+class NonFatalFailureInFixtureConstructorTest : public testing::Test {
+ protected:
+  NonFatalFailureInFixtureConstructorTest() {
+    printf("(expecting 5 failures)\n");
+    ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor.";
+  }
+
+  ~NonFatalFailureInFixtureConstructorTest() {
+    ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "Expected failure #2, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "Expected failure #4, in TearDown.";
+  }
+};
+
+TEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {
+  ADD_FAILURE() << "Expected failure #3, in the test body.";
+}
+
+// Tests fatal failures in the fixture constructor.
+class FatalFailureInFixtureConstructorTest : public testing::Test {
+ protected:
+  FatalFailureInFixtureConstructorTest() {
+    printf("(expecting 2 failures)\n");
+    Init();
+  }
+
+  ~FatalFailureInFixtureConstructorTest() {
+    ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "UNEXPECTED failure in SetUp().  "
+                  << "We should never get here, as the test fixture c'tor "
+                  << "had a fatal failure.";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "UNEXPECTED failure in TearDown().  "
+                  << "We should never get here, as the test fixture c'tor "
+                  << "had a fatal failure.";
+  }
+
+ private:
+  void Init() {
+    FAIL() << "Expected failure #1, in the test fixture c'tor.";
+  }
+};
+
+TEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {
+  ADD_FAILURE() << "UNEXPECTED failure in the test body.  "
+                << "We should never get here, as the test fixture c'tor "
+                << "had a fatal failure.";
+}
+
+// Tests non-fatal failures in SetUp().
+class NonFatalFailureInSetUpTest : public testing::Test {
+ protected:
+  virtual ~NonFatalFailureInSetUpTest() {
+    Deinit();
+  }
+
+  virtual void SetUp() {
+    printf("(expecting 4 failures)\n");
+    ADD_FAILURE() << "Expected failure #1, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    FAIL() << "Expected failure #3, in TearDown().";
+  }
+ private:
+  void Deinit() {
+    FAIL() << "Expected failure #4, in the test fixture d'tor.";
+  }
+};
+
+TEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {
+  FAIL() << "Expected failure #2, in the test function.";
+}
+
+// Tests fatal failures in SetUp().
+class FatalFailureInSetUpTest : public testing::Test {
+ protected:
+  virtual ~FatalFailureInSetUpTest() {
+    Deinit();
+  }
+
+  virtual void SetUp() {
+    printf("(expecting 3 failures)\n");
+    FAIL() << "Expected failure #1, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    FAIL() << "Expected failure #2, in TearDown().";
+  }
+ private:
+  void Deinit() {
+    FAIL() << "Expected failure #3, in the test fixture d'tor.";
+  }
+};
+
+TEST_F(FatalFailureInSetUpTest, FailureInSetUp) {
+  FAIL() << "UNEXPECTED failure in the test function.  "
+         << "We should never get here, as SetUp() failed.";
+}
+
+TEST(AddFailureAtTest, MessageContainsSpecifiedFileAndLineNumber) {
+  ADD_FAILURE_AT("foo.cc", 42) << "Expected failure in foo.cc";
+}
+
+#if GTEST_IS_THREADSAFE
+
+// A unary function that may die.
+void DieIf(bool should_die) {
+  GTEST_CHECK_(!should_die) << " - death inside DieIf().";
+}
+
+// Tests running death tests in a multi-threaded context.
+
+// Used for coordination between the main and the spawn thread.
+struct SpawnThreadNotifications {
+  SpawnThreadNotifications() {}
+
+  Notification spawn_thread_started;
+  Notification spawn_thread_ok_to_terminate;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications);
+};
+
+// The function to be executed in the thread spawn by the
+// MultipleThreads test (below).
+static void ThreadRoutine(SpawnThreadNotifications* notifications) {
+  // Signals the main thread that this thread has started.
+  notifications->spawn_thread_started.Notify();
+
+  // Waits for permission to finish from the main thread.
+  notifications->spawn_thread_ok_to_terminate.WaitForNotification();
+}
+
+// This is a death-test test, but it's not named with a DeathTest
+// suffix.  It starts threads which might interfere with later
+// death tests, so it must run after all other death tests.
+class DeathTestAndMultiThreadsTest : public testing::Test {
+ protected:
+  // Starts a thread and waits for it to begin.
+  virtual void SetUp() {
+    thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>(
+        &ThreadRoutine, &notifications_, NULL));
+    notifications_.spawn_thread_started.WaitForNotification();
+  }
+  // Tells the thread to finish, and reaps it.
+  // Depending on the version of the thread library in use,
+  // a manager thread might still be left running that will interfere
+  // with later death tests.  This is unfortunate, but this class
+  // cleans up after itself as best it can.
+  virtual void TearDown() {
+    notifications_.spawn_thread_ok_to_terminate.Notify();
+  }
+
+ private:
+  SpawnThreadNotifications notifications_;
+  scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> > thread_;
+};
+
+#endif  // GTEST_IS_THREADSAFE
+
+// The MixedUpTestCaseTest test case verifies that Google Test will fail a
+// test if it uses a different fixture class than what other tests in
+// the same test case use.  It deliberately contains two fixture
+// classes with the same name but defined in different namespaces.
+
+// The MixedUpTestCaseWithSameTestNameTest test case verifies that
+// when the user defines two tests with the same test case name AND
+// same test name (but in different namespaces), the second test will
+// fail.
+
+namespace foo {
+
+class MixedUpTestCaseTest : public testing::Test {
+};
+
+TEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}
+TEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}
+
+class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
+};
+
+TEST_F(MixedUpTestCaseWithSameTestNameTest,
+       TheSecondTestWithThisNameShouldFail) {}
+
+}  // namespace foo
+
+namespace bar {
+
+class MixedUpTestCaseTest : public testing::Test {
+};
+
+// The following two tests are expected to fail.  We rely on the
+// golden file to check that Google Test generates the right error message.
+TEST_F(MixedUpTestCaseTest, ThisShouldFail) {}
+TEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}
+
+class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
+};
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST_F(MixedUpTestCaseWithSameTestNameTest,
+       TheSecondTestWithThisNameShouldFail) {}
+
+}  // namespace bar
+
+// The following two test cases verify that Google Test catches the user
+// error of mixing TEST and TEST_F in the same test case.  The first
+// test case checks the scenario where TEST_F appears before TEST, and
+// the second one checks where TEST appears before TEST_F.
+
+class TEST_F_before_TEST_in_same_test_case : public testing::Test {
+};
+
+TEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}
+
+class TEST_before_TEST_F_in_same_test_case : public testing::Test {
+};
+
+TEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {
+}
+
+// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().
+int global_integer = 0;
+
+// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.
+TEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {
+  global_integer = 0;
+  EXPECT_NONFATAL_FAILURE({
+    EXPECT_EQ(1, global_integer) << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables
+// (static or not).
+TEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {
+  int m = 0;
+  static int n;
+  n = 1;
+  EXPECT_NONFATAL_FAILURE({
+    EXPECT_EQ(m, n) << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly
+// one non-fatal failure and no fatal failure.
+TEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {
+  EXPECT_NONFATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no
+// non-fatal failure.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two
+// non-fatal failures.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure 1.";
+    ADD_FAILURE() << "Expected non-fatal failure 2.";
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal
+// failure.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    FAIL() << "Expected fatal failure.";
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
+// tested returns.
+TEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    return;
+  }, "");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
+// tested throws.
+TEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {
+  printf("(expecting a failure)\n");
+  try {
+    EXPECT_NONFATAL_FAILURE({
+      throw 0;
+    }, "");
+  } catch(int) {  // NOLINT
+  }
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_FATAL_FAILURE() can reference global variables.
+TEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {
+  global_integer = 0;
+  EXPECT_FATAL_FAILURE({
+    ASSERT_EQ(1, global_integer) << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() can reference local static
+// variables.
+TEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {
+  static int n;
+  n = 1;
+  EXPECT_FATAL_FAILURE({
+    ASSERT_EQ(0, n) << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly
+// one fatal failure and no non-fatal failure.
+TEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {
+  EXPECT_FATAL_FAILURE({
+    FAIL() << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal
+// failure.
+TEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+  }, "");
+}
+
+// A helper for generating a fatal failure.
+void FatalFailure() {
+  FAIL() << "Expected fatal failure.";
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there are two
+// fatal failures.
+TEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    FatalFailure();
+    FatalFailure();
+  }, "");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal
+// failure.
+TEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }, "");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
+// tested returns.
+TEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    return;
+  }, "");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
+// tested throws.
+TEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {
+  printf("(expecting a failure)\n");
+  try {
+    EXPECT_FATAL_FAILURE({
+      throw 0;
+    }, "");
+  } catch(int) {  // NOLINT
+  }
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// This #ifdef block tests the output of typed tests.
+#if GTEST_HAS_TYPED_TEST
+
+template <typename T>
+class TypedTest : public testing::Test {
+};
+
+TYPED_TEST_CASE(TypedTest, testing::Types<int>);
+
+TYPED_TEST(TypedTest, Success) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+TYPED_TEST(TypedTest, Failure) {
+  EXPECT_EQ(1, TypeParam()) << "Expected failure";
+}
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// This #ifdef block tests the output of type-parameterized tests.
+#if GTEST_HAS_TYPED_TEST_P
+
+template <typename T>
+class TypedTestP : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP);
+
+TYPED_TEST_P(TypedTestP, Success) {
+  EXPECT_EQ(0U, TypeParam());
+}
+
+TYPED_TEST_P(TypedTestP, Failure) {
+  EXPECT_EQ(1U, TypeParam()) << "Expected failure";
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);
+
+typedef testing::Types<unsigned char, unsigned int> UnsignedTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#if GTEST_HAS_DEATH_TEST
+
+// We rely on the golden file to verify that tests whose test case
+// name ends with DeathTest are run first.
+
+TEST(ADeathTest, ShouldRunFirst) {
+}
+
+# if GTEST_HAS_TYPED_TEST
+
+// We rely on the golden file to verify that typed tests whose test
+// case name ends with DeathTest are run first.
+
+template <typename T>
+class ATypedDeathTest : public testing::Test {
+};
+
+typedef testing::Types<int, double> NumericTypes;
+TYPED_TEST_CASE(ATypedDeathTest, NumericTypes);
+
+TYPED_TEST(ATypedDeathTest, ShouldRunFirst) {
+}
+
+# endif  // GTEST_HAS_TYPED_TEST
+
+# if GTEST_HAS_TYPED_TEST_P
+
+
+// We rely on the golden file to verify that type-parameterized tests
+// whose test case name ends with DeathTest are run first.
+
+template <typename T>
+class ATypeParamDeathTest : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(ATypeParamDeathTest);
+
+TYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {
+}
+
+REGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);
+
+# endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Tests various failure conditions of
+// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.
+class ExpectFailureTest : public testing::Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  enum FailureMode {
+    FATAL_FAILURE,
+    NONFATAL_FAILURE
+  };
+  static void AddFailure(FailureMode failure) {
+    if (failure == FATAL_FAILURE) {
+      FAIL() << "Expected fatal failure.";
+    } else {
+      ADD_FAILURE() << "Expected non-fatal failure.";
+    }
+  }
+};
+
+TEST_F(ExpectFailureTest, ExpectFatalFailure) {
+  // Expected fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure.");
+  // Expected fatal failure, but got a non-fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal "
+                       "failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure "
+                       "expected.");
+}
+
+TEST_F(ExpectFailureTest, ExpectNonFatalFailure) {
+  // Expected non-fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure.");
+  // Expected non-fatal failure, but got a fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal "
+                          "failure.");
+}
+
+#if GTEST_IS_THREADSAFE
+
+class ExpectFailureWithThreadsTest : public ExpectFailureTest {
+ protected:
+  static void AddFailureInOtherThread(FailureMode failure) {
+    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
+    thread.Join();
+  }
+};
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {
+  // We only intercept the current thread.
+  printf("(expecting 2 failures)\n");
+  EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),
+                       "Expected fatal failure.");
+}
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {
+  // We only intercept the current thread.
+  printf("(expecting 2 failures)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),
+                          "Expected non-fatal failure.");
+}
+
+typedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;
+
+// Tests that the ScopedFakeTestPartResultReporter only catches failures from
+// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.
+TEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {
+  printf("(expecting 2 failures)\n");
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
+        &results);
+    AddFailureInOtherThread(FATAL_FAILURE);
+    AddFailureInOtherThread(NONFATAL_FAILURE);
+  }
+  // The two failures should not have been intercepted.
+  EXPECT_EQ(0, results.size()) << "This shouldn't fail.";
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+TEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {
+  // Expected fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure.");
+  // Expected fatal failure, but got a non-fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
+                                      "Expected non-fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
+                                      "Some other fatal failure expected.");
+}
+
+TEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {
+  // Expected non-fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal "
+                                         "failure.");
+  // Expected non-fatal failure, but got a fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
+                                         "Expected fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
+                                         "Some other non-fatal failure.");
+}
+
+
+// Two test environments for testing testing::AddGlobalTestEnvironment().
+
+class FooEnvironment : public testing::Environment {
+ public:
+  virtual void SetUp() {
+    printf("%s", "FooEnvironment::SetUp() called.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s", "FooEnvironment::TearDown() called.\n");
+    FAIL() << "Expected fatal failure.";
+  }
+};
+
+class BarEnvironment : public testing::Environment {
+ public:
+  virtual void SetUp() {
+    printf("%s", "BarEnvironment::SetUp() called.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s", "BarEnvironment::TearDown() called.\n");
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }
+};
+
+bool GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = false;
+
+// The main function.
+//
+// The idea is to use Google Test to run all the tests we have defined (some
+// of them are intended to fail), and then compare the test results
+// with the "golden" file.
+int main(int argc, char **argv) {
+  testing::GTEST_FLAG(print_time) = false;
+
+  // We just run the tests, knowing some of them are intended to fail.
+  // We will use a separate Python script to compare the output of
+  // this program with the golden file.
+
+  // It's hard to test InitGoogleTest() directly, as it has many
+  // global side effects.  The following line serves as a sanity test
+  // for it.
+  testing::InitGoogleTest(&argc, argv);
+  if (argc >= 2 &&
+      (std::string(argv[1]) ==
+       "--gtest_internal_skip_environment_and_ad_hoc_tests"))
+    GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true;
+
+#if GTEST_HAS_DEATH_TEST
+  if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
+    // Skip the usual output capturing if we're running as the child
+    // process of an threadsafe-style death test.
+# if GTEST_OS_WINDOWS
+    posix::FReopen("nul:", "w", stdout);
+# else
+    posix::FReopen("/dev/null", "w", stdout);
+# endif  // GTEST_OS_WINDOWS
+    return RUN_ALL_TESTS();
+  }
+#endif  // GTEST_HAS_DEATH_TEST
+
+  if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests))
+    return RUN_ALL_TESTS();
+
+  // Registers two global test environments.
+  // The golden file verifies that they are set up in the order they
+  // are registered, and torn down in the reverse order.
+  testing::AddGlobalTestEnvironment(new FooEnvironment);
+  testing::AddGlobalTestEnvironment(new BarEnvironment);
+
+  return RunAllTests();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test_golden_lin.txt b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test_golden_lin.txt
new file mode 100644
index 0000000..960eedc
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_output_test_golden_lin.txt
@@ -0,0 +1,720 @@
+The non-test part of the code is expected to have 2 failures.
+
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+gtest_output_test_.cc:#: Failure
+Value of: 3
+Expected: 2
+[==========] Running 63 tests from 28 test cases.
+[----------] Global test environment set-up.
+FooEnvironment::SetUp() called.
+BarEnvironment::SetUp() called.
+[----------] 1 test from ADeathTest
+[ RUN      ] ADeathTest.ShouldRunFirst
+[       OK ] ADeathTest.ShouldRunFirst
+[----------] 1 test from ATypedDeathTest/0, where TypeParam = int
+[ RUN      ] ATypedDeathTest/0.ShouldRunFirst
+[       OK ] ATypedDeathTest/0.ShouldRunFirst
+[----------] 1 test from ATypedDeathTest/1, where TypeParam = double
+[ RUN      ] ATypedDeathTest/1.ShouldRunFirst
+[       OK ] ATypedDeathTest/1.ShouldRunFirst
+[----------] 1 test from My/ATypeParamDeathTest/0, where TypeParam = int
+[ RUN      ] My/ATypeParamDeathTest/0.ShouldRunFirst
+[       OK ] My/ATypeParamDeathTest/0.ShouldRunFirst
+[----------] 1 test from My/ATypeParamDeathTest/1, where TypeParam = double
+[ RUN      ] My/ATypeParamDeathTest/1.ShouldRunFirst
+[       OK ] My/ATypeParamDeathTest/1.ShouldRunFirst
+[----------] 2 tests from PassingTest
+[ RUN      ] PassingTest.PassingTest1
+[       OK ] PassingTest.PassingTest1
+[ RUN      ] PassingTest.PassingTest2
+[       OK ] PassingTest.PassingTest2
+[----------] 1 test from NonfatalFailureTest
+[ RUN      ] NonfatalFailureTest.EscapesStringOperands
+gtest_output_test_.cc:#: Failure
+Value of: actual
+  Actual: "actual \"string\""
+Expected: kGoldenString
+Which is: "\"Line"
+gtest_output_test_.cc:#: Failure
+Value of: actual
+  Actual: "actual \"string\""
+Expected: golden
+Which is: "\"Line"
+[  FAILED  ] NonfatalFailureTest.EscapesStringOperands
+[----------] 3 tests from FatalFailureTest
+[ RUN      ] FatalFailureTest.FatalFailureInSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine
+(expecting a failure on false)
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[----------] 1 test from LoggingTest
+[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions
+(expecting 2 failures on (3) >= (a[i]))
+i == 0
+i == 1
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 9
+i == 2
+i == 3
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 6
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+[----------] 6 tests from SCOPED_TRACETest
+[ RUN      ] SCOPED_TRACETest.ObeysScopes
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and shouldn't have a trace.
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should have a trace.
+Google Test trace:
+gtest_output_test_.cc:#: Expected trace
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and shouldn't have a trace.
+[  FAILED  ] SCOPED_TRACETest.ObeysScopes
+[ RUN      ] SCOPED_TRACETest.WorksInLoop
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 1
+Expected: 2
+Google Test trace:
+gtest_output_test_.cc:#: i = 1
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: i = 2
+[  FAILED  ] SCOPED_TRACETest.WorksInLoop
+[ RUN      ] SCOPED_TRACETest.WorksInSubroutine
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 1
+Expected: 2
+Google Test trace:
+gtest_output_test_.cc:#: n = 1
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: n = 2
+[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine
+[ RUN      ] SCOPED_TRACETest.CanBeNested
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: n = 2
+gtest_output_test_.cc:#: 
+[  FAILED  ] SCOPED_TRACETest.CanBeNested
+[ RUN      ] SCOPED_TRACETest.CanBeRepeated
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A.
+Google Test trace:
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A and B.
+Google Test trace:
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A, B, and C.
+Google Test trace:
+gtest_output_test_.cc:#: C
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A, B, and D.
+Google Test trace:
+gtest_output_test_.cc:#: D
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+[  FAILED  ] SCOPED_TRACETest.CanBeRepeated
+[ RUN      ] SCOPED_TRACETest.WorksConcurrently
+(expecting 6 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1 (in thread B, only trace B alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace B
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2 (in thread A, trace A & B both alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace A
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3 (in thread B, trace A & B both alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace B
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4 (in thread B, only trace A alive).
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #5 (in thread A, only trace A alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace A
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #6 (in thread A, no trace alive).
+[  FAILED  ] SCOPED_TRACETest.WorksConcurrently
+[----------] 1 test from NonFatalFailureInFixtureConstructorTest
+[ RUN      ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+(expecting 5 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in the test fixture c'tor.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in the test body.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4, in TearDown.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #5, in the test fixture d'tor.
+[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+[----------] 1 test from FatalFailureInFixtureConstructorTest
+[ RUN      ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in the test fixture c'tor.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in the test fixture d'tor.
+[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+[----------] 1 test from NonFatalFailureInSetUpTest
+[ RUN      ] NonFatalFailureInSetUpTest.FailureInSetUp
+(expecting 4 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in the test function.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in TearDown().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4, in the test fixture d'tor.
+[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp
+[----------] 1 test from FatalFailureInSetUpTest
+[ RUN      ] FatalFailureInSetUpTest.FailureInSetUp
+(expecting 3 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in TearDown().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in the test fixture d'tor.
+[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp
+[----------] 1 test from AddFailureAtTest
+[ RUN      ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+foo.cc:42: Failure
+Failed
+Expected failure in foo.cc
+[  FAILED  ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+[----------] 4 tests from MixedUpTestCaseTest
+[ RUN      ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
+[       OK ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
+[ RUN      ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
+[       OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
+[ RUN      ] MixedUpTestCaseTest.ThisShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseTest,
+you defined test FirstTestFromNamespaceFoo and test ThisShouldFail
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail
+[ RUN      ] MixedUpTestCaseTest.ThisShouldFailToo
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseTest,
+you defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo
+[----------] 2 tests from MixedUpTestCaseWithSameTestNameTest
+[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[       OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseWithSameTestNameTest,
+you defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[----------] 2 tests from TEST_F_before_TEST_in_same_test_case
+[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
+[       OK ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
+[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class, so mixing TEST_F and TEST in the same test case is
+illegal.  In test case TEST_F_before_TEST_in_same_test_case,
+test DefinedUsingTEST_F is defined using TEST_F but
+test DefinedUsingTESTAndShouldFail is defined using TEST.  You probably
+want to change the TEST to TEST_F or move it to another test
+case.
+[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+[----------] 2 tests from TEST_before_TEST_F_in_same_test_case
+[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
+[       OK ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
+[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class, so mixing TEST_F and TEST in the same test case is
+illegal.  In test case TEST_before_TEST_F_in_same_test_case,
+test DefinedUsingTEST_FAndShouldFail is defined using TEST_F but
+test DefinedUsingTEST is defined using TEST.  You probably
+want to change the TEST to TEST_F or move it to another test
+case.
+[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+[----------] 8 tests from ExpectNonfatalFailureTest
+[ RUN      ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
+[       OK ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
+[ RUN      ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
+[       OK ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
+[ RUN      ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
+[       OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 2 failures
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure 1.
+
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure 2.
+
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+[----------] 8 tests from ExpectFatalFailureTest
+[ RUN      ] ExpectFatalFailureTest.CanReferenceGlobalVariables
+[       OK ] ExpectFatalFailureTest.CanReferenceGlobalVariables
+[ RUN      ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
+[       OK ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
+[ RUN      ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
+[       OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 2 failures
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementReturns
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns
+[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementThrows
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows
+[----------] 2 tests from TypedTest/0, where TypeParam = int
+[ RUN      ] TypedTest/0.Success
+[       OK ] TypedTest/0.Success
+[ RUN      ] TypedTest/0.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: 0
+Expected: 1
+Expected failure
+[  FAILED  ] TypedTest/0.Failure, where TypeParam = int
+[----------] 2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char
+[ RUN      ] Unsigned/TypedTestP/0.Success
+[       OK ] Unsigned/TypedTestP/0.Success
+[ RUN      ] Unsigned/TypedTestP/0.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: '\0'
+Expected: 1U
+Which is: 1
+Expected failure
+[  FAILED  ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
+[----------] 2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int
+[ RUN      ] Unsigned/TypedTestP/1.Success
+[       OK ] Unsigned/TypedTestP/1.Success
+[ RUN      ] Unsigned/TypedTestP/1.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: 0
+Expected: 1U
+Which is: 1
+Expected failure
+[  FAILED  ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
+[----------] 4 tests from ExpectFailureTest
+[ RUN      ] ExpectFailureTest.ExpectFatalFailure
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure containing "Some other fatal failure expected."
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailure
+[ RUN      ] ExpectFailureTest.ExpectNonFatalFailure
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure containing "Some other non-fatal failure."
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure
+[ RUN      ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure containing "Some other fatal failure expected."
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+[ RUN      ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure containing "Some other non-fatal failure."
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+[----------] 2 tests from ExpectFailureWithThreadsTest
+[ RUN      ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+[ RUN      ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+[----------] 1 test from ScopedFakeTestPartResultReporterTest
+[ RUN      ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+[  FAILED  ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+[----------] 1 test from PrintingFailingParams/FailingParamTest
+[ RUN      ] PrintingFailingParams/FailingParamTest.Fails/0
+gtest_output_test_.cc:#: Failure
+Value of: GetParam()
+  Actual: 2
+Expected: 1
+[  FAILED  ] PrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2
+[----------] Global test environment tear-down
+BarEnvironment::TearDown() called.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+FooEnvironment::TearDown() called.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+[==========] 63 tests from 28 test cases ran.
+[  PASSED  ] 21 tests.
+[  FAILED  ] 42 tests, listed below:
+[  FAILED  ] NonfatalFailureTest.EscapesStringOperands
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+[  FAILED  ] SCOPED_TRACETest.ObeysScopes
+[  FAILED  ] SCOPED_TRACETest.WorksInLoop
+[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine
+[  FAILED  ] SCOPED_TRACETest.CanBeNested
+[  FAILED  ] SCOPED_TRACETest.CanBeRepeated
+[  FAILED  ] SCOPED_TRACETest.WorksConcurrently
+[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp
+[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp
+[  FAILED  ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo
+[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows
+[  FAILED  ] TypedTest/0.Failure, where TypeParam = int
+[  FAILED  ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
+[  FAILED  ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailure
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+[  FAILED  ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+[  FAILED  ] PrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2
+
+42 FAILED TESTS
+  YOU HAVE 1 DISABLED TEST
+
+Note: Google Test filter = FatalFailureTest.*:LoggingTest.*
+[==========] Running 4 tests from 2 test cases.
+[----------] Global test environment set-up.
+[----------] 3 tests from FatalFailureTest
+[ RUN      ] FatalFailureTest.FatalFailureInSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine (? ms)
+[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms)
+[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine
+(expecting a failure on false)
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)
+[----------] 3 tests from FatalFailureTest (? ms total)
+
+[----------] 1 test from LoggingTest
+[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions
+(expecting 2 failures on (3) >= (a[i]))
+i == 0
+i == 1
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 9
+i == 2
+i == 3
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 6
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions (? ms)
+[----------] 1 test from LoggingTest (? ms total)
+
+[----------] Global test environment tear-down
+[==========] 4 tests from 2 test cases ran. (? ms total)
+[  PASSED  ] 0 tests.
+[  FAILED  ] 4 tests, listed below:
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+
+ 4 FAILED TESTS
+Note: Google Test filter = *DISABLED_*
+[==========] Running 1 test from 1 test case.
+[----------] Global test environment set-up.
+[----------] 1 test from DisabledTestsWarningTest
+[ RUN      ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
+[       OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
+[----------] Global test environment tear-down
+[==========] 1 test from 1 test case ran.
+[  PASSED  ] 1 test.
+Note: Google Test filter = PassingTest.*
+Note: This is test shard 2 of 2.
+[==========] Running 1 test from 1 test case.
+[----------] Global test environment set-up.
+[----------] 1 test from PassingTest
+[ RUN      ] PassingTest.PassingTest2
+[       OK ] PassingTest.PassingTest2
+[----------] Global test environment tear-down
+[==========] 1 test from 1 test case ran.
+[  PASSED  ] 1 test.
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_pred_impl_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_pred_impl_unittest.cc
new file mode 100644
index 0000000..a84eff8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_pred_impl_unittest.cc
@@ -0,0 +1,2427 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+
+// Regression test for gtest_pred_impl.h
+//
+// This file is generated by a script and quite long.  If you intend to
+// learn how Google Test works by reading its unit tests, read
+// gtest_unittest.cc instead.
+//
+// This is intended as a regression test for the Google Test predicate
+// assertions.  We compile it as part of the gtest_unittest target
+// only to keep the implementation tidy and compact, as it is quite
+// involved to set up the stage for testing Google Test using Google
+// Test itself.
+//
+// Currently, gtest_unittest takes ~11 seconds to run in the testing
+// daemon.  In the future, if it grows too large and needs much more
+// time to finish, we should consider separating this file into a
+// stand-alone regression test.
+
+#include <iostream>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// A user-defined data type.
+struct Bool {
+  explicit Bool(int val) : value(val != 0) {}
+
+  bool operator>(int n) const { return value > Bool(n).value; }
+
+  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
+
+  bool operator==(const Bool& rhs) const { return value == rhs.value; }
+
+  bool value;
+};
+
+// Enables Bool to be used in assertions.
+std::ostream& operator<<(std::ostream& os, const Bool& x) {
+  return os << (x.value ? "true" : "false");
+}
+
+// Sample functions/functors for testing unary predicate assertions.
+
+// A unary predicate function.
+template <typename T1>
+bool PredFunction1(T1 v1) {
+  return v1 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction1Int(int v1) {
+  return v1 > 0;
+}
+bool PredFunction1Bool(Bool v1) {
+  return v1 > 0;
+}
+
+// A unary predicate functor.
+struct PredFunctor1 {
+  template <typename T1>
+  bool operator()(const T1& v1) {
+    return v1 > 0;
+  }
+};
+
+// A unary predicate-formatter function.
+template <typename T1>
+testing::AssertionResult PredFormatFunction1(const char* e1,
+                                             const T1& v1) {
+  if (PredFunction1(v1))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1
+      << " is expected to be positive, but evaluates to "
+      << v1 << ".";
+}
+
+// A unary predicate-formatter functor.
+struct PredFormatFunctor1 {
+  template <typename T1>
+  testing::AssertionResult operator()(const char* e1,
+                                      const T1& v1) const {
+    return PredFormatFunction1(e1, v1);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT1.
+
+class Predicate1Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+};
+
+bool Predicate1Test::expected_to_finish_;
+bool Predicate1Test::finished_;
+int Predicate1Test::n1_;
+
+typedef Predicate1Test EXPECT_PRED_FORMAT1Test;
+typedef Predicate1Test ASSERT_PRED_FORMAT1Test;
+typedef Predicate1Test EXPECT_PRED1Test;
+typedef Predicate1Test ASSERT_PRED1Test;
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED1(PredFunction1Int,
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED1(PredFunction1Bool,
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED1(PredFunctor1(),
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED1(PredFunctor1(),
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunction1Int,
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunction1Bool,
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunctor1(),
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunctor1(),
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED1(PredFunction1Int,
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED1(PredFunction1Bool,
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED1(PredFunctor1(),
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED1(PredFunctor1(),
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunction1Int,
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunction1Bool,
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunctor1(),
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunctor1(),
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing binary predicate assertions.
+
+// A binary predicate function.
+template <typename T1, typename T2>
+bool PredFunction2(T1 v1, T2 v2) {
+  return v1 + v2 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction2Int(int v1, int v2) {
+  return v1 + v2 > 0;
+}
+bool PredFunction2Bool(Bool v1, Bool v2) {
+  return v1 + v2 > 0;
+}
+
+// A binary predicate functor.
+struct PredFunctor2 {
+  template <typename T1, typename T2>
+  bool operator()(const T1& v1,
+                  const T2& v2) {
+    return v1 + v2 > 0;
+  }
+};
+
+// A binary predicate-formatter function.
+template <typename T1, typename T2>
+testing::AssertionResult PredFormatFunction2(const char* e1,
+                                             const char* e2,
+                                             const T1& v1,
+                                             const T2& v2) {
+  if (PredFunction2(v1, v2))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 << ".";
+}
+
+// A binary predicate-formatter functor.
+struct PredFormatFunctor2 {
+  template <typename T1, typename T2>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const T1& v1,
+                                      const T2& v2) const {
+    return PredFormatFunction2(e1, e2, v1, v2);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT2.
+
+class Predicate2Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+};
+
+bool Predicate2Test::expected_to_finish_;
+bool Predicate2Test::finished_;
+int Predicate2Test::n1_;
+int Predicate2Test::n2_;
+
+typedef Predicate2Test EXPECT_PRED_FORMAT2Test;
+typedef Predicate2Test ASSERT_PRED_FORMAT2Test;
+typedef Predicate2Test EXPECT_PRED2Test;
+typedef Predicate2Test ASSERT_PRED2Test;
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED2(PredFunction2Int,
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED2(PredFunction2Bool,
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED2(PredFunctor2(),
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED2(PredFunctor2(),
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunction2Int,
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunction2Bool,
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunctor2(),
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunctor2(),
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED2(PredFunction2Int,
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED2(PredFunction2Bool,
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED2(PredFunctor2(),
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED2(PredFunctor2(),
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunction2Int,
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunction2Bool,
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunctor2(),
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunctor2(),
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing ternary predicate assertions.
+
+// A ternary predicate function.
+template <typename T1, typename T2, typename T3>
+bool PredFunction3(T1 v1, T2 v2, T3 v3) {
+  return v1 + v2 + v3 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction3Int(int v1, int v2, int v3) {
+  return v1 + v2 + v3 > 0;
+}
+bool PredFunction3Bool(Bool v1, Bool v2, Bool v3) {
+  return v1 + v2 + v3 > 0;
+}
+
+// A ternary predicate functor.
+struct PredFunctor3 {
+  template <typename T1, typename T2, typename T3>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3) {
+    return v1 + v2 + v3 > 0;
+  }
+};
+
+// A ternary predicate-formatter function.
+template <typename T1, typename T2, typename T3>
+testing::AssertionResult PredFormatFunction3(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3) {
+  if (PredFunction3(v1, v2, v3))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 << ".";
+}
+
+// A ternary predicate-formatter functor.
+struct PredFormatFunctor3 {
+  template <typename T1, typename T2, typename T3>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3) const {
+    return PredFormatFunction3(e1, e2, e3, v1, v2, v3);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT3.
+
+class Predicate3Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+};
+
+bool Predicate3Test::expected_to_finish_;
+bool Predicate3Test::finished_;
+int Predicate3Test::n1_;
+int Predicate3Test::n2_;
+int Predicate3Test::n3_;
+
+typedef Predicate3Test EXPECT_PRED_FORMAT3Test;
+typedef Predicate3Test ASSERT_PRED_FORMAT3Test;
+typedef Predicate3Test EXPECT_PRED3Test;
+typedef Predicate3Test ASSERT_PRED3Test;
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED3(PredFunction3Int,
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED3(PredFunction3Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED3(PredFunctor3(),
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED3(PredFunctor3(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunction3Int,
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunction3Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunctor3(),
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunctor3(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED3(PredFunction3Int,
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED3(PredFunction3Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED3(PredFunctor3(),
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED3(PredFunctor3(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunction3Int,
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunction3Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunctor3(),
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunctor3(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing 4-ary predicate assertions.
+
+// A 4-ary predicate function.
+template <typename T1, typename T2, typename T3, typename T4>
+bool PredFunction4(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction4Int(int v1, int v2, int v3, int v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+bool PredFunction4Bool(Bool v1, Bool v2, Bool v3, Bool v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+
+// A 4-ary predicate functor.
+struct PredFunctor4 {
+  template <typename T1, typename T2, typename T3, typename T4>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3,
+                  const T4& v4) {
+    return v1 + v2 + v3 + v4 > 0;
+  }
+};
+
+// A 4-ary predicate-formatter function.
+template <typename T1, typename T2, typename T3, typename T4>
+testing::AssertionResult PredFormatFunction4(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const char* e4,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3,
+                                             const T4& v4) {
+  if (PredFunction4(v1, v2, v3, v4))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3 << " + " << e4
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 + v4 << ".";
+}
+
+// A 4-ary predicate-formatter functor.
+struct PredFormatFunctor4 {
+  template <typename T1, typename T2, typename T3, typename T4>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const char* e4,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3,
+                                      const T4& v4) const {
+    return PredFormatFunction4(e1, e2, e3, e4, v1, v2, v3, v4);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT4.
+
+class Predicate4Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = n4_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+    EXPECT_EQ(1, n4_) <<
+        "The predicate assertion didn't evaluate argument 5 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+  static int n4_;
+};
+
+bool Predicate4Test::expected_to_finish_;
+bool Predicate4Test::finished_;
+int Predicate4Test::n1_;
+int Predicate4Test::n2_;
+int Predicate4Test::n3_;
+int Predicate4Test::n4_;
+
+typedef Predicate4Test EXPECT_PRED_FORMAT4Test;
+typedef Predicate4Test ASSERT_PRED_FORMAT4Test;
+typedef Predicate4Test EXPECT_PRED4Test;
+typedef Predicate4Test ASSERT_PRED4Test;
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED4(PredFunction4Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED4(PredFunction4Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED4(PredFunctor4(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED4(PredFunctor4(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunction4Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunction4Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunctor4(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunctor4(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED4(PredFunction4Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED4(PredFunction4Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED4(PredFunctor4(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED4(PredFunctor4(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunction4Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunction4Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunctor4(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunctor4(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing 5-ary predicate assertions.
+
+// A 5-ary predicate function.
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+bool PredFunction5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction5Int(int v1, int v2, int v3, int v4, int v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+bool PredFunction5Bool(Bool v1, Bool v2, Bool v3, Bool v4, Bool v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+
+// A 5-ary predicate functor.
+struct PredFunctor5 {
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3,
+                  const T4& v4,
+                  const T5& v5) {
+    return v1 + v2 + v3 + v4 + v5 > 0;
+  }
+};
+
+// A 5-ary predicate-formatter function.
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+testing::AssertionResult PredFormatFunction5(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const char* e4,
+                                             const char* e5,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3,
+                                             const T4& v4,
+                                             const T5& v5) {
+  if (PredFunction5(v1, v2, v3, v4, v5))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 + v4 + v5 << ".";
+}
+
+// A 5-ary predicate-formatter functor.
+struct PredFormatFunctor5 {
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const char* e4,
+                                      const char* e5,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3,
+                                      const T4& v4,
+                                      const T5& v5) const {
+    return PredFormatFunction5(e1, e2, e3, e4, e5, v1, v2, v3, v4, v5);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT5.
+
+class Predicate5Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = n4_ = n5_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+    EXPECT_EQ(1, n4_) <<
+        "The predicate assertion didn't evaluate argument 5 "
+        "exactly once.";
+    EXPECT_EQ(1, n5_) <<
+        "The predicate assertion didn't evaluate argument 6 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+  static int n4_;
+  static int n5_;
+};
+
+bool Predicate5Test::expected_to_finish_;
+bool Predicate5Test::finished_;
+int Predicate5Test::n1_;
+int Predicate5Test::n2_;
+int Predicate5Test::n3_;
+int Predicate5Test::n4_;
+int Predicate5Test::n5_;
+
+typedef Predicate5Test EXPECT_PRED_FORMAT5Test;
+typedef Predicate5Test ASSERT_PRED_FORMAT5Test;
+typedef Predicate5Test EXPECT_PRED5Test;
+typedef Predicate5Test ASSERT_PRED5Test;
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED5(PredFunction5Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED5(PredFunction5Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED5(PredFunctor5(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED5(PredFunctor5(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunction5Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunction5Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunctor5(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunctor5(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED5(PredFunction5Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED5(PredFunction5Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED5(PredFunctor5(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED5(PredFunctor5(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunction5Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunction5Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunctor5(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunctor5(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_premature_exit_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_premature_exit_test.cc
new file mode 100644
index 0000000..f6b6be9
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_premature_exit_test.cc
@@ -0,0 +1,141 @@
+// Copyright 2013, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests that Google Test manipulates the premature-exit-detection
+// file correctly.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::internal::posix::GetEnv;
+using ::testing::internal::posix::Stat;
+using ::testing::internal::posix::StatStruct;
+
+namespace {
+
+// Is the TEST_PREMATURE_EXIT_FILE environment variable expected to be
+// set?
+const bool kTestPrematureExitFileEnvVarShouldBeSet = false;
+
+class PrematureExitTest : public Test {
+ public:
+  // Returns true iff the given file exists.
+  static bool FileExists(const char* filepath) {
+    StatStruct stat;
+    return Stat(filepath, &stat) == 0;
+  }
+
+ protected:
+  PrematureExitTest() {
+    premature_exit_file_path_ = GetEnv("TEST_PREMATURE_EXIT_FILE");
+
+    // Normalize NULL to "" for ease of handling.
+    if (premature_exit_file_path_ == NULL) {
+      premature_exit_file_path_ = "";
+    }
+  }
+
+  // Returns true iff the premature-exit file exists.
+  bool PrematureExitFileExists() const {
+    return FileExists(premature_exit_file_path_);
+  }
+
+  const char* premature_exit_file_path_;
+};
+
+typedef PrematureExitTest PrematureExitDeathTest;
+
+// Tests that:
+//   - the premature-exit file exists during the execution of a
+//     death test (EXPECT_DEATH*), and
+//   - a death test doesn't interfere with the main test process's
+//     handling of the premature-exit file.
+TEST_F(PrematureExitDeathTest, FileExistsDuringExecutionOfDeathTest) {
+  if (*premature_exit_file_path_ == '\0') {
+    return;
+  }
+
+  EXPECT_DEATH_IF_SUPPORTED({
+      // If the file exists, crash the process such that the main test
+      // process will catch the (expected) crash and report a success;
+      // otherwise don't crash, which will cause the main test process
+      // to report that the death test has failed.
+      if (PrematureExitFileExists()) {
+        exit(1);
+      }
+    }, "");
+}
+
+// Tests that TEST_PREMATURE_EXIT_FILE is set where it's expected to
+// be set.
+TEST_F(PrematureExitTest, TestPrematureExitFileEnvVarIsSet) {
+  if (kTestPrematureExitFileEnvVarShouldBeSet) {
+    const char* const filepath = GetEnv("TEST_PREMATURE_EXIT_FILE");
+    ASSERT_TRUE(filepath != NULL);
+    ASSERT_NE(*filepath, '\0');
+  }
+}
+
+// Tests that the premature-exit file exists during the execution of a
+// normal (non-death) test.
+TEST_F(PrematureExitTest, PrematureExitFileExistsDuringTestExecution) {
+  if (*premature_exit_file_path_ == '\0') {
+    return;
+  }
+
+  EXPECT_TRUE(PrematureExitFileExists())
+      << " file " << premature_exit_file_path_
+      << " should exist during test execution, but doesn't.";
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+  const int exit_code = RUN_ALL_TESTS();
+
+  // Test that the premature-exit file is deleted upon return from
+  // RUN_ALL_TESTS().
+  const char* const filepath = GetEnv("TEST_PREMATURE_EXIT_FILE");
+  if (filepath != NULL && *filepath != '\0') {
+    if (PrematureExitTest::FileExists(filepath)) {
+      printf(
+          "File %s shouldn't exist after the test program finishes, but does.",
+          filepath);
+      return 1;
+    }
+  }
+
+  return exit_code;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_prod_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_prod_test.cc
new file mode 100644
index 0000000..060abce
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_prod_test.cc
@@ -0,0 +1,57 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Unit test for include/gtest/gtest_prod.h.
+
+#include "gtest/gtest.h"
+#include "test/production.h"
+
+// Tests that private members can be accessed from a TEST declared as
+// a friend of the class.
+TEST(PrivateCodeTest, CanAccessPrivateMembers) {
+  PrivateCode a;
+  EXPECT_EQ(0, a.x_);
+
+  a.set_x(1);
+  EXPECT_EQ(1, a.x_);
+}
+
+typedef testing::Test PrivateCodeFixtureTest;
+
+// Tests that private members can be accessed from a TEST_F declared
+// as a friend of the class.
+TEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) {
+  PrivateCode a;
+  EXPECT_EQ(0, a.x_);
+
+  a.set_x(2);
+  EXPECT_EQ(2, a.x_);
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_repeat_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_repeat_test.cc
new file mode 100644
index 0000000..481012a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_repeat_test.cc
@@ -0,0 +1,253 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests the --gtest_repeat=number flag.
+
+#include <stdlib.h>
+#include <iostream>
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+GTEST_DECLARE_string_(death_test_style);
+GTEST_DECLARE_string_(filter);
+GTEST_DECLARE_int32_(repeat);
+
+}  // namespace testing
+
+using testing::GTEST_FLAG(death_test_style);
+using testing::GTEST_FLAG(filter);
+using testing::GTEST_FLAG(repeat);
+
+namespace {
+
+// We need this when we are testing Google Test itself and therefore
+// cannot use Google Test assertions.
+#define GTEST_CHECK_INT_EQ_(expected, actual) \
+  do {\
+    const int expected_val = (expected);\
+    const int actual_val = (actual);\
+    if (::testing::internal::IsTrue(expected_val != actual_val)) {\
+      ::std::cout << "Value of: " #actual "\n"\
+                  << "  Actual: " << actual_val << "\n"\
+                  << "Expected: " #expected "\n"\
+                  << "Which is: " << expected_val << "\n";\
+      ::testing::internal::posix::Abort();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+
+// Used for verifying that global environment set-up and tear-down are
+// inside the gtest_repeat loop.
+
+int g_environment_set_up_count = 0;
+int g_environment_tear_down_count = 0;
+
+class MyEnvironment : public testing::Environment {
+ public:
+  MyEnvironment() {}
+  virtual void SetUp() { g_environment_set_up_count++; }
+  virtual void TearDown() { g_environment_tear_down_count++; }
+};
+
+// A test that should fail.
+
+int g_should_fail_count = 0;
+
+TEST(FooTest, ShouldFail) {
+  g_should_fail_count++;
+  EXPECT_EQ(0, 1) << "Expected failure.";
+}
+
+// A test that should pass.
+
+int g_should_pass_count = 0;
+
+TEST(FooTest, ShouldPass) {
+  g_should_pass_count++;
+}
+
+// A test that contains a thread-safe death test and a fast death
+// test.  It should pass.
+
+int g_death_test_count = 0;
+
+TEST(BarDeathTest, ThreadSafeAndFast) {
+  g_death_test_count++;
+
+  GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
+
+  GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
+}
+
+#if GTEST_HAS_PARAM_TEST
+int g_param_test_count = 0;
+
+const int kNumberOfParamTests = 10;
+
+class MyParamTest : public testing::TestWithParam<int> {};
+
+TEST_P(MyParamTest, ShouldPass) {
+  // TODO(vladl at google.com): Make parameter value checking robust
+  //                         WRT order of tests.
+  GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
+  g_param_test_count++;
+}
+INSTANTIATE_TEST_CASE_P(MyParamSequence,
+                        MyParamTest,
+                        testing::Range(0, kNumberOfParamTests));
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Resets the count for each test.
+void ResetCounts() {
+  g_environment_set_up_count = 0;
+  g_environment_tear_down_count = 0;
+  g_should_fail_count = 0;
+  g_should_pass_count = 0;
+  g_death_test_count = 0;
+#if GTEST_HAS_PARAM_TEST
+  g_param_test_count = 0;
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Checks that the count for each test is expected.
+void CheckCounts(int expected) {
+  GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Tests the behavior of Google Test when --gtest_repeat is not specified.
+void TestRepeatUnspecified() {
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
+  CheckCounts(1);
+}
+
+// Tests the behavior of Google Test when --gtest_repeat has the given value.
+void TestRepeat(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
+  CheckCounts(repeat);
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies an empty
+// set of tests.
+void TestRepeatWithEmptyFilter(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "None";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
+  CheckCounts(0);
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies a set of
+// successful tests.
+void TestRepeatWithFilterForSuccessfulTests(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "*-*ShouldFail";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies a set of
+// failed tests.
+void TestRepeatWithFilterForFailedTests(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "*ShouldFail";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(0, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(0, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+  testing::AddGlobalTestEnvironment(new MyEnvironment);
+
+  TestRepeatUnspecified();
+  TestRepeat(0);
+  TestRepeat(1);
+  TestRepeat(5);
+
+  TestRepeatWithEmptyFilter(2);
+  TestRepeatWithEmptyFilter(3);
+
+  TestRepeatWithFilterForSuccessfulTests(3);
+
+  TestRepeatWithFilterForFailedTests(4);
+
+  // It would be nice to verify that the tests indeed loop forever
+  // when GTEST_FLAG(repeat) is negative, but this test will be quite
+  // complicated to write.  Since this flag is for interactive
+  // debugging only and doesn't affect the normal test result, such a
+  // test would be an overkill.
+
+  printf("PASS\n");
+  return 0;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_shuffle_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_shuffle_test.py
new file mode 100755
index 0000000..30d0303
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_shuffle_test.py
@@ -0,0 +1,325 @@
+#!/usr/bin/env python
+#
+# Copyright 2009 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that test shuffling works."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+# Command to run the gtest_shuffle_test_ program.
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_shuffle_test_')
+
+# The environment variables for test sharding.
+TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
+SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
+
+TEST_FILTER = 'A*.A:A*.B:C*'
+
+ALL_TESTS = []
+ACTIVE_TESTS = []
+FILTERED_TESTS = []
+SHARDED_TESTS = []
+
+SHUFFLED_ALL_TESTS = []
+SHUFFLED_ACTIVE_TESTS = []
+SHUFFLED_FILTERED_TESTS = []
+SHUFFLED_SHARDED_TESTS = []
+
+
+def AlsoRunDisabledTestsFlag():
+  return '--gtest_also_run_disabled_tests'
+
+
+def FilterFlag(test_filter):
+  return '--gtest_filter=%s' % (test_filter,)
+
+
+def RepeatFlag(n):
+  return '--gtest_repeat=%s' % (n,)
+
+
+def ShuffleFlag():
+  return '--gtest_shuffle'
+
+
+def RandomSeedFlag(n):
+  return '--gtest_random_seed=%s' % (n,)
+
+
+def RunAndReturnOutput(extra_env, args):
+  """Runs the test program and returns its output."""
+
+  environ_copy = os.environ.copy()
+  environ_copy.update(extra_env)
+
+  return gtest_test_utils.Subprocess([COMMAND] + args, env=environ_copy).output
+
+
+def GetTestsForAllIterations(extra_env, args):
+  """Runs the test program and returns a list of test lists.
+
+  Args:
+    extra_env: a map from environment variables to their values
+    args: command line flags to pass to gtest_shuffle_test_
+
+  Returns:
+    A list where the i-th element is the list of tests run in the i-th
+    test iteration.
+  """
+
+  test_iterations = []
+  for line in RunAndReturnOutput(extra_env, args).split('\n'):
+    if line.startswith('----'):
+      tests = []
+      test_iterations.append(tests)
+    elif line.strip():
+      tests.append(line.strip())  # 'TestCaseName.TestName'
+
+  return test_iterations
+
+
+def GetTestCases(tests):
+  """Returns a list of test cases in the given full test names.
+
+  Args:
+    tests: a list of full test names
+
+  Returns:
+    A list of test cases from 'tests', in their original order.
+    Consecutive duplicates are removed.
+  """
+
+  test_cases = []
+  for test in tests:
+    test_case = test.split('.')[0]
+    if not test_case in test_cases:
+      test_cases.append(test_case)
+
+  return test_cases
+
+
+def CalculateTestLists():
+  """Calculates the list of tests run under different flags."""
+
+  if not ALL_TESTS:
+    ALL_TESTS.extend(
+        GetTestsForAllIterations({}, [AlsoRunDisabledTestsFlag()])[0])
+
+  if not ACTIVE_TESTS:
+    ACTIVE_TESTS.extend(GetTestsForAllIterations({}, [])[0])
+
+  if not FILTERED_TESTS:
+    FILTERED_TESTS.extend(
+        GetTestsForAllIterations({}, [FilterFlag(TEST_FILTER)])[0])
+
+  if not SHARDED_TESTS:
+    SHARDED_TESTS.extend(
+        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                  SHARD_INDEX_ENV_VAR: '1'},
+                                 [])[0])
+
+  if not SHUFFLED_ALL_TESTS:
+    SHUFFLED_ALL_TESTS.extend(GetTestsForAllIterations(
+        {}, [AlsoRunDisabledTestsFlag(), ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+  if not SHUFFLED_ACTIVE_TESTS:
+    SHUFFLED_ACTIVE_TESTS.extend(GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+  if not SHUFFLED_FILTERED_TESTS:
+    SHUFFLED_FILTERED_TESTS.extend(GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1), FilterFlag(TEST_FILTER)])[0])
+
+  if not SHUFFLED_SHARDED_TESTS:
+    SHUFFLED_SHARDED_TESTS.extend(
+        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                  SHARD_INDEX_ENV_VAR: '1'},
+                                 [ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+
+class GTestShuffleUnitTest(gtest_test_utils.TestCase):
+  """Tests test shuffling."""
+
+  def setUp(self):
+    CalculateTestLists()
+
+  def testShufflePreservesNumberOfTests(self):
+    self.assertEqual(len(ALL_TESTS), len(SHUFFLED_ALL_TESTS))
+    self.assertEqual(len(ACTIVE_TESTS), len(SHUFFLED_ACTIVE_TESTS))
+    self.assertEqual(len(FILTERED_TESTS), len(SHUFFLED_FILTERED_TESTS))
+    self.assertEqual(len(SHARDED_TESTS), len(SHUFFLED_SHARDED_TESTS))
+
+  def testShuffleChangesTestOrder(self):
+    self.assert_(SHUFFLED_ALL_TESTS != ALL_TESTS, SHUFFLED_ALL_TESTS)
+    self.assert_(SHUFFLED_ACTIVE_TESTS != ACTIVE_TESTS, SHUFFLED_ACTIVE_TESTS)
+    self.assert_(SHUFFLED_FILTERED_TESTS != FILTERED_TESTS,
+                 SHUFFLED_FILTERED_TESTS)
+    self.assert_(SHUFFLED_SHARDED_TESTS != SHARDED_TESTS,
+                 SHUFFLED_SHARDED_TESTS)
+
+  def testShuffleChangesTestCaseOrder(self):
+    self.assert_(GetTestCases(SHUFFLED_ALL_TESTS) != GetTestCases(ALL_TESTS),
+                 GetTestCases(SHUFFLED_ALL_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_ACTIVE_TESTS) != GetTestCases(ACTIVE_TESTS),
+        GetTestCases(SHUFFLED_ACTIVE_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_FILTERED_TESTS) != GetTestCases(FILTERED_TESTS),
+        GetTestCases(SHUFFLED_FILTERED_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_SHARDED_TESTS) != GetTestCases(SHARDED_TESTS),
+        GetTestCases(SHUFFLED_SHARDED_TESTS))
+
+  def testShuffleDoesNotRepeatTest(self):
+    for test in SHUFFLED_ALL_TESTS:
+      self.assertEqual(1, SHUFFLED_ALL_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_ACTIVE_TESTS:
+      self.assertEqual(1, SHUFFLED_ACTIVE_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_FILTERED_TESTS:
+      self.assertEqual(1, SHUFFLED_FILTERED_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_SHARDED_TESTS:
+      self.assertEqual(1, SHUFFLED_SHARDED_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+
+  def testShuffleDoesNotCreateNewTest(self):
+    for test in SHUFFLED_ALL_TESTS:
+      self.assert_(test in ALL_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_ACTIVE_TESTS:
+      self.assert_(test in ACTIVE_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_FILTERED_TESTS:
+      self.assert_(test in FILTERED_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_SHARDED_TESTS:
+      self.assert_(test in SHARDED_TESTS, '%s is an invalid test' % (test,))
+
+  def testShuffleIncludesAllTests(self):
+    for test in ALL_TESTS:
+      self.assert_(test in SHUFFLED_ALL_TESTS, '%s is missing' % (test,))
+    for test in ACTIVE_TESTS:
+      self.assert_(test in SHUFFLED_ACTIVE_TESTS, '%s is missing' % (test,))
+    for test in FILTERED_TESTS:
+      self.assert_(test in SHUFFLED_FILTERED_TESTS, '%s is missing' % (test,))
+    for test in SHARDED_TESTS:
+      self.assert_(test in SHUFFLED_SHARDED_TESTS, '%s is missing' % (test,))
+
+  def testShuffleLeavesDeathTestsAtFront(self):
+    non_death_test_found = False
+    for test in SHUFFLED_ACTIVE_TESTS:
+      if 'DeathTest.' in test:
+        self.assert_(not non_death_test_found,
+                     '%s appears after a non-death test' % (test,))
+      else:
+        non_death_test_found = True
+
+  def _VerifyTestCasesDoNotInterleave(self, tests):
+    test_cases = []
+    for test in tests:
+      [test_case, _] = test.split('.')
+      if test_cases and test_cases[-1] != test_case:
+        test_cases.append(test_case)
+        self.assertEqual(1, test_cases.count(test_case),
+                         'Test case %s is not grouped together in %s' %
+                         (test_case, tests))
+
+  def testShuffleDoesNotInterleaveTestCases(self):
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ALL_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ACTIVE_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_FILTERED_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_SHARDED_TESTS)
+
+  def testShuffleRestoresOrderAfterEachIteration(self):
+    # Get the test lists in all 3 iterations, using random seed 1, 2,
+    # and 3 respectively.  Google Test picks a different seed in each
+    # iteration, and this test depends on the current implementation
+    # picking successive numbers.  This dependency is not ideal, but
+    # makes the test much easier to write.
+    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
+        GetTestsForAllIterations(
+            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
+
+    # Make sure running the tests with random seed 1 gets the same
+    # order as in iteration 1 above.
+    [tests_with_seed1] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1)])
+    self.assertEqual(tests_in_iteration1, tests_with_seed1)
+
+    # Make sure running the tests with random seed 2 gets the same
+    # order as in iteration 2 above.  Success means that Google Test
+    # correctly restores the test order before re-shuffling at the
+    # beginning of iteration 2.
+    [tests_with_seed2] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(2)])
+    self.assertEqual(tests_in_iteration2, tests_with_seed2)
+
+    # Make sure running the tests with random seed 3 gets the same
+    # order as in iteration 3 above.  Success means that Google Test
+    # correctly restores the test order before re-shuffling at the
+    # beginning of iteration 3.
+    [tests_with_seed3] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(3)])
+    self.assertEqual(tests_in_iteration3, tests_with_seed3)
+
+  def testShuffleGeneratesNewOrderInEachIteration(self):
+    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
+        GetTestsForAllIterations(
+            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
+
+    self.assert_(tests_in_iteration1 != tests_in_iteration2,
+                 tests_in_iteration1)
+    self.assert_(tests_in_iteration1 != tests_in_iteration3,
+                 tests_in_iteration1)
+    self.assert_(tests_in_iteration2 != tests_in_iteration3,
+                 tests_in_iteration2)
+
+  def testShuffleShardedTestsPreservesPartition(self):
+    # If we run M tests on N shards, the same M tests should be run in
+    # total, regardless of the random seeds used by the shards.
+    [tests1] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '0'},
+                                        [ShuffleFlag(), RandomSeedFlag(1)])
+    [tests2] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '1'},
+                                        [ShuffleFlag(), RandomSeedFlag(20)])
+    [tests3] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '2'},
+                                        [ShuffleFlag(), RandomSeedFlag(25)])
+    sorted_sharded_tests = tests1 + tests2 + tests3
+    sorted_sharded_tests.sort()
+    sorted_active_tests = []
+    sorted_active_tests.extend(ACTIVE_TESTS)
+    sorted_active_tests.sort()
+    self.assertEqual(sorted_active_tests, sorted_sharded_tests)
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_shuffle_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_shuffle_test_.cc
new file mode 100644
index 0000000..6fb441b
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_shuffle_test_.cc
@@ -0,0 +1,103 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Verifies that test shuffling works.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Message;
+using ::testing::Test;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::UnitTest;
+using ::testing::internal::scoped_ptr;
+
+// The test methods are empty, as the sole purpose of this program is
+// to print the test names before/after shuffling.
+
+class A : public Test {};
+TEST_F(A, A) {}
+TEST_F(A, B) {}
+
+TEST(ADeathTest, A) {}
+TEST(ADeathTest, B) {}
+TEST(ADeathTest, C) {}
+
+TEST(B, A) {}
+TEST(B, B) {}
+TEST(B, C) {}
+TEST(B, DISABLED_D) {}
+TEST(B, DISABLED_E) {}
+
+TEST(BDeathTest, A) {}
+TEST(BDeathTest, B) {}
+
+TEST(C, A) {}
+TEST(C, B) {}
+TEST(C, C) {}
+TEST(C, DISABLED_D) {}
+
+TEST(CDeathTest, A) {}
+
+TEST(DISABLED_D, A) {}
+TEST(DISABLED_D, DISABLED_B) {}
+
+// This printer prints the full test names only, starting each test
+// iteration with a "----" marker.
+class TestNamePrinter : public EmptyTestEventListener {
+ public:
+  virtual void OnTestIterationStart(const UnitTest& /* unit_test */,
+                                    int /* iteration */) {
+    printf("----\n");
+  }
+
+  virtual void OnTestStart(const TestInfo& test_info) {
+    printf("%s.%s\n", test_info.test_case_name(), test_info.name());
+  }
+};
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  // Replaces the default printer with TestNamePrinter, which prints
+  // the test name only.
+  TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+  delete listeners.Release(listeners.default_result_printer());
+  listeners.Append(new TestNamePrinter);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_sole_header_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_sole_header_test.cc
new file mode 100644
index 0000000..ccd091a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_sole_header_test.cc
@@ -0,0 +1,57 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// This test verifies that it's possible to use Google Test by including
+// the gtest.h header file alone.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+void Subroutine() {
+  EXPECT_EQ(42, 42);
+}
+
+TEST(NoFatalFailureTest, ExpectNoFatalFailure) {
+  EXPECT_NO_FATAL_FAILURE(;);
+  EXPECT_NO_FATAL_FAILURE(SUCCEED());
+  EXPECT_NO_FATAL_FAILURE(Subroutine());
+  EXPECT_NO_FATAL_FAILURE({ SUCCEED(); });
+}
+
+TEST(NoFatalFailureTest, AssertNoFatalFailure) {
+  ASSERT_NO_FATAL_FAILURE(;);
+  ASSERT_NO_FATAL_FAILURE(SUCCEED());
+  ASSERT_NO_FATAL_FAILURE(Subroutine());
+  ASSERT_NO_FATAL_FAILURE({ SUCCEED(); });
+}
+
+}  // namespace
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_stress_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_stress_test.cc
new file mode 100644
index 0000000..e7daa43
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_stress_test.cc
@@ -0,0 +1,256 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests that SCOPED_TRACE() and various Google Test assertions can be
+// used in a large number of threads concurrently.
+
+#include "gtest/gtest.h"
+
+#include <iostream>
+#include <vector>
+
+// We must define this macro in order to #include
+// gtest-internal-inl.h.  This is how Google Test prevents a user from
+// accidentally depending on its internal implementation.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_IS_THREADSAFE
+
+namespace testing {
+namespace {
+
+using internal::Notification;
+using internal::TestPropertyKeyIs;
+using internal::ThreadWithParam;
+using internal::scoped_ptr;
+
+// In order to run tests in this file, for platforms where Google Test is
+// thread safe, implement ThreadWithParam. See the description of its API
+// in gtest-port.h, where it is defined for already supported platforms.
+
+// How many threads to create?
+const int kThreadCount = 50;
+
+std::string IdToKey(int id, const char* suffix) {
+  Message key;
+  key << "key_" << id << "_" << suffix;
+  return key.GetString();
+}
+
+std::string IdToString(int id) {
+  Message id_message;
+  id_message << id;
+  return id_message.GetString();
+}
+
+void ExpectKeyAndValueWereRecordedForId(
+    const std::vector<TestProperty>& properties,
+    int id, const char* suffix) {
+  TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str());
+  const std::vector<TestProperty>::const_iterator property =
+      std::find_if(properties.begin(), properties.end(), matches_key);
+  ASSERT_TRUE(property != properties.end())
+      << "expecting " << suffix << " value for id " << id;
+  EXPECT_STREQ(IdToString(id).c_str(), property->value());
+}
+
+// Calls a large number of Google Test assertions, where exactly one of them
+// will fail.
+void ManyAsserts(int id) {
+  GTEST_LOG_(INFO) << "Thread #" << id << " running...";
+
+  SCOPED_TRACE(Message() << "Thread #" << id);
+
+  for (int i = 0; i < kThreadCount; i++) {
+    SCOPED_TRACE(Message() << "Iteration #" << i);
+
+    // A bunch of assertions that should succeed.
+    EXPECT_TRUE(true);
+    ASSERT_FALSE(false) << "This shouldn't fail.";
+    EXPECT_STREQ("a", "a");
+    ASSERT_LE(5, 6);
+    EXPECT_EQ(i, i) << "This shouldn't fail.";
+
+    // RecordProperty() should interact safely with other threads as well.
+    // The shared_key forces property updates.
+    Test::RecordProperty(IdToKey(id, "string").c_str(), IdToString(id).c_str());
+    Test::RecordProperty(IdToKey(id, "int").c_str(), id);
+    Test::RecordProperty("shared_key", IdToString(id).c_str());
+
+    // This assertion should fail kThreadCount times per thread.  It
+    // is for testing whether Google Test can handle failed assertions in a
+    // multi-threaded context.
+    EXPECT_LT(i, 0) << "This should always fail.";
+  }
+}
+
+void CheckTestFailureCount(int expected_failures) {
+  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();
+  const TestResult* const result = info->result();
+  GTEST_CHECK_(expected_failures == result->total_part_count())
+      << "Logged " << result->total_part_count() << " failures "
+      << " vs. " << expected_failures << " expected";
+}
+
+// Tests using SCOPED_TRACE() and Google Test assertions in many threads
+// concurrently.
+TEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) {
+  {
+    scoped_ptr<ThreadWithParam<int> > threads[kThreadCount];
+    Notification threads_can_start;
+    for (int i = 0; i != kThreadCount; i++)
+      threads[i].reset(new ThreadWithParam<int>(&ManyAsserts,
+                                                i,
+                                                &threads_can_start));
+
+    threads_can_start.Notify();
+
+    // Blocks until all the threads are done.
+    for (int i = 0; i != kThreadCount; i++)
+      threads[i]->Join();
+  }
+
+  // Ensures that kThreadCount*kThreadCount failures have been reported.
+  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();
+  const TestResult* const result = info->result();
+
+  std::vector<TestProperty> properties;
+  // We have no access to the TestResult's list of properties but we can
+  // copy them one by one.
+  for (int i = 0; i < result->test_property_count(); ++i)
+    properties.push_back(result->GetTestProperty(i));
+
+  EXPECT_EQ(kThreadCount * 2 + 1, result->test_property_count())
+      << "String and int values recorded on each thread, "
+      << "as well as one shared_key";
+  for (int i = 0; i < kThreadCount; ++i) {
+    ExpectKeyAndValueWereRecordedForId(properties, i, "string");
+    ExpectKeyAndValueWereRecordedForId(properties, i, "int");
+  }
+  CheckTestFailureCount(kThreadCount*kThreadCount);
+}
+
+void FailingThread(bool is_fatal) {
+  if (is_fatal)
+    FAIL() << "Fatal failure in some other thread. "
+           << "(This failure is expected.)";
+  else
+    ADD_FAILURE() << "Non-fatal failure in some other thread. "
+                  << "(This failure is expected.)";
+}
+
+void GenerateFatalFailureInAnotherThread(bool is_fatal) {
+  ThreadWithParam<bool> thread(&FailingThread, is_fatal, NULL);
+  thread.Join();
+}
+
+TEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) {
+  EXPECT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));
+  // We should only have one failure (the one from
+  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE
+  // should succeed.
+  CheckTestFailureCount(1);
+}
+
+void AssertNoFatalFailureIgnoresFailuresInOtherThreads() {
+  ASSERT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));
+}
+TEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) {
+  // Using a subroutine, to make sure, that the test continues.
+  AssertNoFatalFailureIgnoresFailuresInOtherThreads();
+  // We should only have one failure (the one from
+  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE
+  // should succeed.
+  CheckTestFailureCount(1);
+}
+
+TEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) {
+  // This statement should fail, since the current thread doesn't generate a
+  // fatal failure, only another one does.
+  EXPECT_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true), "expected");
+  CheckTestFailureCount(2);
+}
+
+TEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) {
+  // This statement should succeed, because failures in all threads are
+  // considered.
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(
+      GenerateFatalFailureInAnotherThread(true), "expected");
+  CheckTestFailureCount(0);
+  // We need to add a failure, because main() checks that there are failures.
+  // But when only this test is run, we shouldn't have any failures.
+  ADD_FAILURE() << "This is an expected non-fatal failure.";
+}
+
+TEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) {
+  // This statement should fail, since the current thread doesn't generate a
+  // fatal failure, only another one does.
+  EXPECT_NONFATAL_FAILURE(GenerateFatalFailureInAnotherThread(false),
+                          "expected");
+  CheckTestFailureCount(2);
+}
+
+TEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) {
+  // This statement should succeed, because failures in all threads are
+  // considered.
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(
+      GenerateFatalFailureInAnotherThread(false), "expected");
+  CheckTestFailureCount(0);
+  // We need to add a failure, because main() checks that there are failures,
+  // But when only this test is run, we shouldn't have any failures.
+  ADD_FAILURE() << "This is an expected non-fatal failure.";
+}
+
+}  // namespace
+}  // namespace testing
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  const int result = RUN_ALL_TESTS();  // Expected to fail.
+  GTEST_CHECK_(result == 1) << "RUN_ALL_TESTS() did not fail as expected";
+
+  printf("\nPASS\n");
+  return 0;
+}
+
+#else
+TEST(StressTest,
+     DISABLED_ThreadSafetyTestsAreSkippedWhenGoogleTestIsNotThreadSafe) {
+}
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
+#endif  // GTEST_IS_THREADSAFE
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_test_utils.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_test_utils.py
new file mode 100755
index 0000000..28884bd
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_test_utils.py
@@ -0,0 +1,320 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test utilities for Google C++ Testing Framework."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import atexit
+import os
+import shutil
+import sys
+import tempfile
+import unittest
+_test_module = unittest
+
+# Suppresses the 'Import not at the top of the file' lint complaint.
+# pylint: disable-msg=C6204
+try:
+  import subprocess
+  _SUBPROCESS_MODULE_AVAILABLE = True
+except:
+  import popen2
+  _SUBPROCESS_MODULE_AVAILABLE = False
+# pylint: enable-msg=C6204
+
+GTEST_OUTPUT_VAR_NAME = 'GTEST_OUTPUT'
+
+IS_WINDOWS = os.name == 'nt'
+IS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]
+
+# The environment variable for specifying the path to the premature-exit file.
+PREMATURE_EXIT_FILE_ENV_VAR = 'TEST_PREMATURE_EXIT_FILE'
+
+environ = os.environ.copy()
+
+
+def SetEnvVar(env_var, value):
+  """Sets/unsets an environment variable to a given value."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+# Here we expose a class from a particular module, depending on the
+# environment. The comment suppresses the 'Invalid variable name' lint
+# complaint.
+TestCase = _test_module.TestCase  # pylint: disable-msg=C6409
+
+# Initially maps a flag to its default value. After
+# _ParseAndStripGTestFlags() is called, maps a flag to its actual value.
+_flag_map = {'source_dir': os.path.dirname(sys.argv[0]),
+             'build_dir': os.path.dirname(sys.argv[0])}
+_gtest_flags_are_parsed = False
+
+
+def _ParseAndStripGTestFlags(argv):
+  """Parses and strips Google Test flags from argv.  This is idempotent."""
+
+  # Suppresses the lint complaint about a global variable since we need it
+  # here to maintain module-wide state.
+  global _gtest_flags_are_parsed  # pylint: disable-msg=W0603
+  if _gtest_flags_are_parsed:
+    return
+
+  _gtest_flags_are_parsed = True
+  for flag in _flag_map:
+    # The environment variable overrides the default value.
+    if flag.upper() in os.environ:
+      _flag_map[flag] = os.environ[flag.upper()]
+
+    # The command line flag overrides the environment variable.
+    i = 1  # Skips the program name.
+    while i < len(argv):
+      prefix = '--' + flag + '='
+      if argv[i].startswith(prefix):
+        _flag_map[flag] = argv[i][len(prefix):]
+        del argv[i]
+        break
+      else:
+        # We don't increment i in case we just found a --gtest_* flag
+        # and removed it from argv.
+        i += 1
+
+
+def GetFlag(flag):
+  """Returns the value of the given flag."""
+
+  # In case GetFlag() is called before Main(), we always call
+  # _ParseAndStripGTestFlags() here to make sure the --gtest_* flags
+  # are parsed.
+  _ParseAndStripGTestFlags(sys.argv)
+
+  return _flag_map[flag]
+
+
+def GetSourceDir():
+  """Returns the absolute path of the directory where the .py files are."""
+
+  return os.path.abspath(GetFlag('source_dir'))
+
+
+def GetBuildDir():
+  """Returns the absolute path of the directory where the test binaries are."""
+
+  return os.path.abspath(GetFlag('build_dir'))
+
+
+_temp_dir = None
+
+def _RemoveTempDir():
+  if _temp_dir:
+    shutil.rmtree(_temp_dir, ignore_errors=True)
+
+atexit.register(_RemoveTempDir)
+
+
+def GetTempDir():
+  """Returns a directory for temporary files."""
+
+  global _temp_dir
+  if not _temp_dir:
+    _temp_dir = tempfile.mkdtemp()
+  return _temp_dir
+
+
+def GetTestExecutablePath(executable_name, build_dir=None):
+  """Returns the absolute path of the test binary given its name.
+
+  The function will print a message and abort the program if the resulting file
+  doesn't exist.
+
+  Args:
+    executable_name: name of the test binary that the test script runs.
+    build_dir:       directory where to look for executables, by default
+                     the result of GetBuildDir().
+
+  Returns:
+    The absolute path of the test binary.
+  """
+
+  path = os.path.abspath(os.path.join(build_dir or GetBuildDir(),
+                                      executable_name))
+  if (IS_WINDOWS or IS_CYGWIN) and not path.endswith('.exe'):
+    path += '.exe'
+
+  if not os.path.exists(path):
+    message = (
+        'Unable to find the test binary. Please make sure to provide path\n'
+        'to the binary via the --build_dir flag or the BUILD_DIR\n'
+        'environment variable.')
+    print >> sys.stderr, message
+    sys.exit(1)
+
+  return path
+
+
+def GetExitStatus(exit_code):
+  """Returns the argument to exit(), or -1 if exit() wasn't called.
+
+  Args:
+    exit_code: the result value of os.system(command).
+  """
+
+  if os.name == 'nt':
+    # On Windows, os.WEXITSTATUS() doesn't work and os.system() returns
+    # the argument to exit() directly.
+    return exit_code
+  else:
+    # On Unix, os.WEXITSTATUS() must be used to extract the exit status
+    # from the result of os.system().
+    if os.WIFEXITED(exit_code):
+      return os.WEXITSTATUS(exit_code)
+    else:
+      return -1
+
+
+class Subprocess:
+  def __init__(self, command, working_dir=None, capture_stderr=True, env=None):
+    """Changes into a specified directory, if provided, and executes a command.
+
+    Restores the old directory afterwards.
+
+    Args:
+      command:        The command to run, in the form of sys.argv.
+      working_dir:    The directory to change into.
+      capture_stderr: Determines whether to capture stderr in the output member
+                      or to discard it.
+      env:            Dictionary with environment to pass to the subprocess.
+
+    Returns:
+      An object that represents outcome of the executed process. It has the
+      following attributes:
+        terminated_by_signal   True iff the child process has been terminated
+                               by a signal.
+        signal                 Sygnal that terminated the child process.
+        exited                 True iff the child process exited normally.
+        exit_code              The code with which the child process exited.
+        output                 Child process's stdout and stderr output
+                               combined in a string.
+    """
+
+    # The subprocess module is the preferrable way of running programs
+    # since it is available and behaves consistently on all platforms,
+    # including Windows. But it is only available starting in python 2.4.
+    # In earlier python versions, we revert to the popen2 module, which is
+    # available in python 2.0 and later but doesn't provide required
+    # functionality (Popen4) under Windows. This allows us to support Mac
+    # OS X 10.4 Tiger, which has python 2.3 installed.
+    if _SUBPROCESS_MODULE_AVAILABLE:
+      if capture_stderr:
+        stderr = subprocess.STDOUT
+      else:
+        stderr = subprocess.PIPE
+
+      p = subprocess.Popen(command,
+                           stdout=subprocess.PIPE, stderr=stderr,
+                           cwd=working_dir, universal_newlines=True, env=env)
+      # communicate returns a tuple with the file obect for the child's
+      # output.
+      self.output = p.communicate()[0]
+      self._return_code = p.returncode
+    else:
+      old_dir = os.getcwd()
+
+      def _ReplaceEnvDict(dest, src):
+        # Changes made by os.environ.clear are not inheritable by child
+        # processes until Python 2.6. To produce inheritable changes we have
+        # to delete environment items with the del statement.
+        for key in dest.keys():
+          del dest[key]
+        dest.update(src)
+
+      # When 'env' is not None, backup the environment variables and replace
+      # them with the passed 'env'. When 'env' is None, we simply use the
+      # current 'os.environ' for compatibility with the subprocess.Popen
+      # semantics used above.
+      if env is not None:
+        old_environ = os.environ.copy()
+        _ReplaceEnvDict(os.environ, env)
+
+      try:
+        if working_dir is not None:
+          os.chdir(working_dir)
+        if capture_stderr:
+          p = popen2.Popen4(command)
+        else:
+          p = popen2.Popen3(command)
+        p.tochild.close()
+        self.output = p.fromchild.read()
+        ret_code = p.wait()
+      finally:
+        os.chdir(old_dir)
+
+        # Restore the old environment variables
+        # if they were replaced.
+        if env is not None:
+          _ReplaceEnvDict(os.environ, old_environ)
+
+      # Converts ret_code to match the semantics of
+      # subprocess.Popen.returncode.
+      if os.WIFSIGNALED(ret_code):
+        self._return_code = -os.WTERMSIG(ret_code)
+      else:  # os.WIFEXITED(ret_code) should return True here.
+        self._return_code = os.WEXITSTATUS(ret_code)
+
+    if self._return_code < 0:
+      self.terminated_by_signal = True
+      self.exited = False
+      self.signal = -self._return_code
+    else:
+      self.terminated_by_signal = False
+      self.exited = True
+      self.exit_code = self._return_code
+
+
+def Main():
+  """Runs the unit test."""
+
+  # We must call _ParseAndStripGTestFlags() before calling
+  # unittest.main().  Otherwise the latter will be confused by the
+  # --gtest_* flags.
+  _ParseAndStripGTestFlags(sys.argv)
+  # The tested binaries should not be writing XML output files unless the
+  # script explicitly instructs them to.
+  # TODO(vladl at google.com): Move this into Subprocess when we implement
+  # passing environment into it as a parameter.
+  if GTEST_OUTPUT_VAR_NAME in os.environ:
+    del os.environ[GTEST_OUTPUT_VAR_NAME]
+
+  _test_module.main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc
new file mode 100644
index 0000000..8d46c76
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc
@@ -0,0 +1,92 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests Google Test's throw-on-failure mode with exceptions enabled.
+
+#include "gtest/gtest.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdexcept>
+
+// Prints the given failure message and exits the program with
+// non-zero.  We use this instead of a Google Test assertion to
+// indicate a failure, as the latter is been tested and cannot be
+// relied on.
+void Fail(const char* msg) {
+  printf("FAILURE: %s\n", msg);
+  fflush(stdout);
+  exit(1);
+}
+
+// Tests that an assertion failure throws a subclass of
+// std::runtime_error.
+void TestFailureThrowsRuntimeError() {
+  testing::GTEST_FLAG(throw_on_failure) = true;
+
+  // A successful assertion shouldn't throw.
+  try {
+    EXPECT_EQ(3, 3);
+  } catch(...) {
+    Fail("A successful assertion wrongfully threw.");
+  }
+
+  // A failed assertion should throw a subclass of std::runtime_error.
+  try {
+    EXPECT_EQ(2, 3) << "Expected failure";
+  } catch(const std::runtime_error& e) {
+    if (strstr(e.what(), "Expected failure") != NULL)
+      return;
+
+    printf("%s",
+           "A failed assertion did throw an exception of the right type, "
+           "but the message is incorrect.  Instead of containing \"Expected "
+           "failure\", it is:\n");
+    Fail(e.what());
+  } catch(...) {
+    Fail("A failed assertion threw the wrong type of exception.");
+  }
+  Fail("A failed assertion should've thrown but didn't.");
+}
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // We want to ensure that people can use Google Test assertions in
+  // other testing frameworks, as long as they initialize Google Test
+  // properly and set the thrown-on-failure mode.  Therefore, we don't
+  // use Google Test's constructs for defining and running tests
+  // (e.g. TEST and RUN_ALL_TESTS) here.
+
+  TestFailureThrowsRuntimeError();
+  return 0;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_test.py
new file mode 100755
index 0000000..5678ffe
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_test.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests Google Test's throw-on-failure mode with exceptions disabled.
+
+This script invokes gtest_throw_on_failure_test_ (a program written with
+Google Test) with different environments and command line flags.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+# Constants.
+
+# The command line flag for enabling/disabling the throw-on-failure mode.
+THROW_ON_FAILURE = 'gtest_throw_on_failure'
+
+# Path to the gtest_throw_on_failure_test_ program, compiled with
+# exceptions disabled.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_throw_on_failure_test_')
+
+
+# Utilities.
+
+
+def SetEnvVar(env_var, value):
+  """Sets an environment variable to a given value; unsets it when the
+  given value is None.
+  """
+
+  env_var = env_var.upper()
+  if value is not None:
+    os.environ[env_var] = value
+  elif env_var in os.environ:
+    del os.environ[env_var]
+
+
+def Run(command):
+  """Runs a command; returns True/False if its exit code is/isn't 0."""
+
+  print 'Running "%s". . .' % ' '.join(command)
+  p = gtest_test_utils.Subprocess(command)
+  return p.exited and p.exit_code == 0
+
+
+# The tests.  TODO(wan at google.com): refactor the class to share common
+# logic with code in gtest_break_on_failure_unittest.py.
+class ThrowOnFailureTest(gtest_test_utils.TestCase):
+  """Tests the throw-on-failure mode."""
+
+  def RunAndVerify(self, env_var_value, flag_value, should_fail):
+    """Runs gtest_throw_on_failure_test_ and verifies that it does
+    (or does not) exit with a non-zero code.
+
+    Args:
+      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
+                        variable; None if the variable should be unset.
+      flag_value:       value of the --gtest_break_on_failure flag;
+                        None if the flag should not be present.
+      should_fail:      True iff the program is expected to fail.
+    """
+
+    SetEnvVar(THROW_ON_FAILURE, env_var_value)
+
+    if env_var_value is None:
+      env_var_value_msg = ' is not set'
+    else:
+      env_var_value_msg = '=' + env_var_value
+
+    if flag_value is None:
+      flag = ''
+    elif flag_value == '0':
+      flag = '--%s=0' % THROW_ON_FAILURE
+    else:
+      flag = '--%s' % THROW_ON_FAILURE
+
+    command = [EXE_PATH]
+    if flag:
+      command.append(flag)
+
+    if should_fail:
+      should_or_not = 'should'
+    else:
+      should_or_not = 'should not'
+
+    failed = not Run(command)
+
+    SetEnvVar(THROW_ON_FAILURE, None)
+
+    msg = ('when %s%s, an assertion failure in "%s" %s cause a non-zero '
+           'exit code.' %
+           (THROW_ON_FAILURE, env_var_value_msg, ' '.join(command),
+            should_or_not))
+    self.assert_(failed == should_fail, msg)
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False)
+
+  def testThrowOnFailureEnvVar(self):
+    """Tests using the GTEST_THROW_ON_FAILURE environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value=None,
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value=None,
+                      should_fail=True)
+
+  def testThrowOnFailureFlag(self):
+    """Tests using the --gtest_throw_on_failure flag."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='1',
+                      should_fail=True)
+
+  def testThrowOnFailureFlagOverridesEnvVar(self):
+    """Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='1',
+                      should_fail=True)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='1',
+                      should_fail=True)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc
new file mode 100644
index 0000000..2b88fe3
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc
@@ -0,0 +1,72 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests Google Test's throw-on-failure mode with exceptions disabled.
+//
+// This program must be compiled with exceptions disabled.  It will be
+// invoked by gtest_throw_on_failure_test.py, and is expected to exit
+// with non-zero in the throw-on-failure mode or 0 otherwise.
+
+#include "gtest/gtest.h"
+
+#include <stdio.h>                      // for fflush, fprintf, NULL, etc.
+#include <stdlib.h>                     // for exit
+#include <exception>                    // for set_terminate
+
+// This terminate handler aborts the program using exit() rather than abort().
+// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
+// ones.
+void TerminateHandler() {
+  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
+  fflush(NULL);
+  exit(1);
+}
+
+int main(int argc, char** argv) {
+#if GTEST_HAS_EXCEPTIONS
+  std::set_terminate(&TerminateHandler);
+#endif
+  testing::InitGoogleTest(&argc, argv);
+
+  // We want to ensure that people can use Google Test assertions in
+  // other testing frameworks, as long as they initialize Google Test
+  // properly and set the throw-on-failure mode.  Therefore, we don't
+  // use Google Test's constructs for defining and running tests
+  // (e.g. TEST and RUN_ALL_TESTS) here.
+
+  // In the throw-on-failure mode with exceptions disabled, this
+  // assertion will cause the program to exit with a non-zero code.
+  EXPECT_EQ(2, 3);
+
+  // When not in the throw-on-failure mode, the control will reach
+  // here.
+  return 0;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_uninitialized_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_uninitialized_test.py
new file mode 100755
index 0000000..6ae57ee
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_uninitialized_test.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test warns the user when not initialized properly."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import gtest_test_utils
+
+
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_uninitialized_test_')
+
+
+def Assert(condition):
+  if not condition:
+    raise AssertionError
+
+
+def AssertEq(expected, actual):
+  if expected != actual:
+    print 'Expected: %s' % (expected,)
+    print '  Actual: %s' % (actual,)
+    raise AssertionError
+
+
+def TestExitCodeAndOutput(command):
+  """Runs the given command and verifies its exit code and output."""
+
+  # Verifies that 'command' exits with code 1.
+  p = gtest_test_utils.Subprocess(command)
+  Assert(p.exited)
+  AssertEq(1, p.exit_code)
+  Assert('InitGoogleTest' in p.output)
+
+
+class GTestUninitializedTest(gtest_test_utils.TestCase):
+  def testExitCodeAndOutput(self):
+    TestExitCodeAndOutput(COMMAND)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_uninitialized_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_uninitialized_test_.cc
new file mode 100644
index 0000000..4431698
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_uninitialized_test_.cc
@@ -0,0 +1,43 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+TEST(DummyTest, Dummy) {
+  // This test doesn't verify anything.  We just need it to create a
+  // realistic stage for testing the behavior of Google Test when
+  // RUN_ALL_TESTS() is called without testing::InitGoogleTest() being
+  // called first.
+}
+
+int main() {
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_unittest.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_unittest.cc
new file mode 100644
index 0000000..0cab07d
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_unittest.cc
@@ -0,0 +1,7415 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for Google Test itself.  This verifies that the basic constructs of
+// Google Test work.
+
+#include "gtest/gtest.h"
+
+// Verifies that the command line flag variables can be accessed
+// in code once <gtest/gtest.h> has been #included.
+// Do not move it after other #includes.
+TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
+  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests)
+      || testing::GTEST_FLAG(break_on_failure)
+      || testing::GTEST_FLAG(catch_exceptions)
+      || testing::GTEST_FLAG(color) != "unknown"
+      || testing::GTEST_FLAG(filter) != "unknown"
+      || testing::GTEST_FLAG(list_tests)
+      || testing::GTEST_FLAG(output) != "unknown"
+      || testing::GTEST_FLAG(print_time)
+      || testing::GTEST_FLAG(random_seed)
+      || testing::GTEST_FLAG(repeat) > 0
+      || testing::GTEST_FLAG(show_internal_stack_frames)
+      || testing::GTEST_FLAG(shuffle)
+      || testing::GTEST_FLAG(stack_trace_depth) > 0
+      || testing::GTEST_FLAG(stream_result_to) != "unknown"
+      || testing::GTEST_FLAG(throw_on_failure);
+  EXPECT_TRUE(dummy || !dummy);  // Suppresses warning that dummy is unused.
+}
+
+#include <limits.h>  // For INT_MAX.
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <map>
+#include <vector>
+#include <ostream>
+
+#include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+class StreamingListenerTest : public Test {
+ public:
+  class FakeSocketWriter : public StreamingListener::AbstractSocketWriter {
+   public:
+    // Sends a string to the socket.
+    virtual void Send(const string& message) { output_ += message; }
+
+    string output_;
+  };
+
+  StreamingListenerTest()
+      : fake_sock_writer_(new FakeSocketWriter),
+        streamer_(fake_sock_writer_),
+        test_info_obj_("FooTest", "Bar", NULL, NULL, 0, NULL) {}
+
+ protected:
+  string* output() { return &(fake_sock_writer_->output_); }
+
+  FakeSocketWriter* const fake_sock_writer_;
+  StreamingListener streamer_;
+  UnitTest unit_test_;
+  TestInfo test_info_obj_;  // The name test_info_ was taken by testing::Test.
+};
+
+TEST_F(StreamingListenerTest, OnTestProgramEnd) {
+  *output() = "";
+  streamer_.OnTestProgramEnd(unit_test_);
+  EXPECT_EQ("event=TestProgramEnd&passed=1\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestIterationEnd) {
+  *output() = "";
+  streamer_.OnTestIterationEnd(unit_test_, 42);
+  EXPECT_EQ("event=TestIterationEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestCaseStart) {
+  *output() = "";
+  streamer_.OnTestCaseStart(TestCase("FooTest", "Bar", NULL, NULL));
+  EXPECT_EQ("event=TestCaseStart&name=FooTest\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestCaseEnd) {
+  *output() = "";
+  streamer_.OnTestCaseEnd(TestCase("FooTest", "Bar", NULL, NULL));
+  EXPECT_EQ("event=TestCaseEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestStart) {
+  *output() = "";
+  streamer_.OnTestStart(test_info_obj_);
+  EXPECT_EQ("event=TestStart&name=Bar\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestEnd) {
+  *output() = "";
+  streamer_.OnTestEnd(test_info_obj_);
+  EXPECT_EQ("event=TestEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestPartResult) {
+  *output() = "";
+  streamer_.OnTestPartResult(TestPartResult(
+      TestPartResult::kFatalFailure, "foo.cc", 42, "failed=\n&%"));
+
+  // Meta characters in the failure message should be properly escaped.
+  EXPECT_EQ(
+      "event=TestPartResult&file=foo.cc&line=42&message=failed%3D%0A%26%25\n",
+      *output());
+}
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Provides access to otherwise private parts of the TestEventListeners class
+// that are needed to test it.
+class TestEventListenersAccessor {
+ public:
+  static TestEventListener* GetRepeater(TestEventListeners* listeners) {
+    return listeners->repeater();
+  }
+
+  static void SetDefaultResultPrinter(TestEventListeners* listeners,
+                                      TestEventListener* listener) {
+    listeners->SetDefaultResultPrinter(listener);
+  }
+  static void SetDefaultXmlGenerator(TestEventListeners* listeners,
+                                     TestEventListener* listener) {
+    listeners->SetDefaultXmlGenerator(listener);
+  }
+
+  static bool EventForwardingEnabled(const TestEventListeners& listeners) {
+    return listeners.EventForwardingEnabled();
+  }
+
+  static void SuppressEventForwarding(TestEventListeners* listeners) {
+    listeners->SuppressEventForwarding();
+  }
+};
+
+class UnitTestRecordPropertyTestHelper : public Test {
+ protected:
+  UnitTestRecordPropertyTestHelper() {}
+
+  // Forwards to UnitTest::RecordProperty() to bypass access controls.
+  void UnitTestRecordProperty(const char* key, const std::string& value) {
+    unit_test_.RecordProperty(key, value);
+  }
+
+  UnitTest unit_test_;
+};
+
+}  // namespace internal
+}  // namespace testing
+
+using testing::AssertionFailure;
+using testing::AssertionResult;
+using testing::AssertionSuccess;
+using testing::DoubleLE;
+using testing::EmptyTestEventListener;
+using testing::Environment;
+using testing::FloatLE;
+using testing::GTEST_FLAG(also_run_disabled_tests);
+using testing::GTEST_FLAG(break_on_failure);
+using testing::GTEST_FLAG(catch_exceptions);
+using testing::GTEST_FLAG(color);
+using testing::GTEST_FLAG(death_test_use_fork);
+using testing::GTEST_FLAG(filter);
+using testing::GTEST_FLAG(list_tests);
+using testing::GTEST_FLAG(output);
+using testing::GTEST_FLAG(print_time);
+using testing::GTEST_FLAG(random_seed);
+using testing::GTEST_FLAG(repeat);
+using testing::GTEST_FLAG(show_internal_stack_frames);
+using testing::GTEST_FLAG(shuffle);
+using testing::GTEST_FLAG(stack_trace_depth);
+using testing::GTEST_FLAG(stream_result_to);
+using testing::GTEST_FLAG(throw_on_failure);
+using testing::IsNotSubstring;
+using testing::IsSubstring;
+using testing::Message;
+using testing::ScopedFakeTestPartResultReporter;
+using testing::StaticAssertTypeEq;
+using testing::Test;
+using testing::TestCase;
+using testing::TestEventListeners;
+using testing::TestInfo;
+using testing::TestPartResult;
+using testing::TestPartResultArray;
+using testing::TestProperty;
+using testing::TestResult;
+using testing::TimeInMillis;
+using testing::UnitTest;
+using testing::kMaxStackTraceDepth;
+using testing::internal::AddReference;
+using testing::internal::AlwaysFalse;
+using testing::internal::AlwaysTrue;
+using testing::internal::AppendUserMessage;
+using testing::internal::ArrayAwareFind;
+using testing::internal::ArrayEq;
+using testing::internal::CodePointToUtf8;
+using testing::internal::CompileAssertTypesEqual;
+using testing::internal::CopyArray;
+using testing::internal::CountIf;
+using testing::internal::EqFailure;
+using testing::internal::FloatingPoint;
+using testing::internal::ForEach;
+using testing::internal::FormatEpochTimeInMillisAsIso8601;
+using testing::internal::FormatTimeInMillisAsSeconds;
+using testing::internal::GTestFlagSaver;
+using testing::internal::GetCurrentOsStackTraceExceptTop;
+using testing::internal::GetElementOr;
+using testing::internal::GetNextRandomSeed;
+using testing::internal::GetRandomSeedFromFlag;
+using testing::internal::GetTestTypeId;
+using testing::internal::GetTimeInMillis;
+using testing::internal::GetTypeId;
+using testing::internal::GetUnitTestImpl;
+using testing::internal::ImplicitlyConvertible;
+using testing::internal::Int32;
+using testing::internal::Int32FromEnvOrDie;
+using testing::internal::IsAProtocolMessage;
+using testing::internal::IsContainer;
+using testing::internal::IsContainerTest;
+using testing::internal::IsNotContainer;
+using testing::internal::NativeArray;
+using testing::internal::ParseInt32Flag;
+using testing::internal::RemoveConst;
+using testing::internal::RemoveReference;
+using testing::internal::ShouldRunTestOnShard;
+using testing::internal::ShouldShard;
+using testing::internal::ShouldUseColor;
+using testing::internal::Shuffle;
+using testing::internal::ShuffleRange;
+using testing::internal::SkipPrefix;
+using testing::internal::StreamableToString;
+using testing::internal::String;
+using testing::internal::TestEventListenersAccessor;
+using testing::internal::TestResultAccessor;
+using testing::internal::UInt32;
+using testing::internal::WideStringToUtf8;
+using testing::internal::kCopy;
+using testing::internal::kMaxRandomSeed;
+using testing::internal::kReference;
+using testing::internal::kTestTypeIdInGoogleTest;
+using testing::internal::scoped_ptr;
+
+#if GTEST_HAS_STREAM_REDIRECTION
+using testing::internal::CaptureStdout;
+using testing::internal::GetCapturedStdout;
+#endif
+
+#if GTEST_IS_THREADSAFE
+using testing::internal::ThreadWithParam;
+#endif
+
+class TestingVector : public std::vector<int> {
+};
+
+::std::ostream& operator<<(::std::ostream& os,
+                           const TestingVector& vector) {
+  os << "{ ";
+  for (size_t i = 0; i < vector.size(); i++) {
+    os << vector[i] << " ";
+  }
+  os << "}";
+  return os;
+}
+
+// This line tests that we can define tests in an unnamed namespace.
+namespace {
+
+TEST(GetRandomSeedFromFlagTest, HandlesZero) {
+  const int seed = GetRandomSeedFromFlag(0);
+  EXPECT_LE(1, seed);
+  EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed));
+}
+
+TEST(GetRandomSeedFromFlagTest, PreservesValidSeed) {
+  EXPECT_EQ(1, GetRandomSeedFromFlag(1));
+  EXPECT_EQ(2, GetRandomSeedFromFlag(2));
+  EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1));
+  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
+            GetRandomSeedFromFlag(kMaxRandomSeed));
+}
+
+TEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) {
+  const int seed1 = GetRandomSeedFromFlag(-1);
+  EXPECT_LE(1, seed1);
+  EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed));
+
+  const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1);
+  EXPECT_LE(1, seed2);
+  EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed));
+}
+
+TEST(GetNextRandomSeedTest, WorksForValidInput) {
+  EXPECT_EQ(2, GetNextRandomSeed(1));
+  EXPECT_EQ(3, GetNextRandomSeed(2));
+  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
+            GetNextRandomSeed(kMaxRandomSeed - 1));
+  EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed));
+
+  // We deliberately don't test GetNextRandomSeed() with invalid
+  // inputs, as that requires death tests, which are expensive.  This
+  // is fine as GetNextRandomSeed() is internal and has a
+  // straightforward definition.
+}
+
+static void ClearCurrentTestPartResults() {
+  TestResultAccessor::ClearTestPartResults(
+      GetUnitTestImpl()->current_test_result());
+}
+
+// Tests GetTypeId.
+
+TEST(GetTypeIdTest, ReturnsSameValueForSameType) {
+  EXPECT_EQ(GetTypeId<int>(), GetTypeId<int>());
+  EXPECT_EQ(GetTypeId<Test>(), GetTypeId<Test>());
+}
+
+class SubClassOfTest : public Test {};
+class AnotherSubClassOfTest : public Test {};
+
+TEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) {
+  EXPECT_NE(GetTypeId<int>(), GetTypeId<const int>());
+  EXPECT_NE(GetTypeId<int>(), GetTypeId<char>());
+  EXPECT_NE(GetTypeId<int>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<SubClassOfTest>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTypeId<SubClassOfTest>());
+}
+
+// Verifies that GetTestTypeId() returns the same value, no matter it
+// is called from inside Google Test or outside of it.
+TEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) {
+  EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId());
+}
+
+// Tests FormatTimeInMillisAsSeconds().
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsZero) {
+  EXPECT_EQ("0", FormatTimeInMillisAsSeconds(0));
+}
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) {
+  EXPECT_EQ("0.003", FormatTimeInMillisAsSeconds(3));
+  EXPECT_EQ("0.01", FormatTimeInMillisAsSeconds(10));
+  EXPECT_EQ("0.2", FormatTimeInMillisAsSeconds(200));
+  EXPECT_EQ("1.2", FormatTimeInMillisAsSeconds(1200));
+  EXPECT_EQ("3", FormatTimeInMillisAsSeconds(3000));
+}
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) {
+  EXPECT_EQ("-0.003", FormatTimeInMillisAsSeconds(-3));
+  EXPECT_EQ("-0.01", FormatTimeInMillisAsSeconds(-10));
+  EXPECT_EQ("-0.2", FormatTimeInMillisAsSeconds(-200));
+  EXPECT_EQ("-1.2", FormatTimeInMillisAsSeconds(-1200));
+  EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000));
+}
+
+// Tests FormatEpochTimeInMillisAsIso8601().  The correctness of conversion
+// for particular dates below was verified in Python using
+// datetime.datetime.fromutctimestamp(<timetamp>/1000).
+
+// FormatEpochTimeInMillisAsIso8601 depends on the current timezone, so we
+// have to set up a particular timezone to obtain predictable results.
+class FormatEpochTimeInMillisAsIso8601Test : public Test {
+ public:
+  // On Cygwin, GCC doesn't allow unqualified integer literals to exceed
+  // 32 bits, even when 64-bit integer types are available.  We have to
+  // force the constants to have a 64-bit type here.
+  static const TimeInMillis kMillisPerSec = 1000;
+
+ private:
+  virtual void SetUp() {
+    saved_tz_ = NULL;
+#if _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe
+                                // for getenv, function is deprecated for
+                                // strdup).
+    if (getenv("TZ"))
+      saved_tz_ = strdup(getenv("TZ"));
+# pragma warning(pop)           // Restores the warning state again.
+#else
+    if (getenv("TZ"))
+      saved_tz_ = strdup(getenv("TZ"));
+#endif
+
+    // Set up the time zone for FormatEpochTimeInMillisAsIso8601 to use.  We
+    // cannot use the local time zone because the function's output depends
+    // on the time zone.
+    SetTimeZone("UTC+00");
+  }
+
+  virtual void TearDown() {
+    SetTimeZone(saved_tz_);
+    free(const_cast<char*>(saved_tz_));
+    saved_tz_ = NULL;
+  }
+
+  static void SetTimeZone(const char* time_zone) {
+    // tzset() distinguishes between the TZ variable being present and empty
+    // and not being present, so we have to consider the case of time_zone
+    // being NULL.
+#if _MSC_VER
+    // ...Unless it's MSVC, whose standard library's _putenv doesn't
+    // distinguish between an empty and a missing variable.
+    const std::string env_var =
+        std::string("TZ=") + (time_zone ? time_zone : "");
+    _putenv(env_var.c_str());
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function is deprecated).
+    tzset();
+# pragma warning(pop)           // Restores the warning state again.
+#else
+    if (time_zone) {
+      setenv(("TZ"), time_zone, 1);
+    } else {
+      unsetenv("TZ");
+    }
+    tzset();
+#endif
+  }
+
+  const char* saved_tz_;
+};
+
+const TimeInMillis FormatEpochTimeInMillisAsIso8601Test::kMillisPerSec;
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsTwoDigitSegments) {
+  EXPECT_EQ("2011-10-31T18:52:42",
+            FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, MillisecondsDoNotAffectResult) {
+  EXPECT_EQ(
+      "2011-10-31T18:52:42",
+      FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec + 234));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsLeadingZeroes) {
+  EXPECT_EQ("2011-09-03T05:07:02",
+            FormatEpochTimeInMillisAsIso8601(1315026422 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, Prints24HourTime) {
+  EXPECT_EQ("2011-09-28T17:08:22",
+            FormatEpochTimeInMillisAsIso8601(1317229702 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsEpochStart) {
+  EXPECT_EQ("1970-01-01T00:00:00", FormatEpochTimeInMillisAsIso8601(0));
+}
+
+#if GTEST_CAN_COMPARE_NULL
+
+# ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+#  pragma option push -w-ccc -w-rch
+# endif
+
+// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null
+// pointer literal.
+TEST(NullLiteralTest, IsTrueForNullLiterals) {
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L));
+}
+
+// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null
+// pointer literal.
+TEST(NullLiteralTest, IsFalseForNonNullLiterals) {
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a'));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast<void*>(NULL)));
+}
+
+# ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" suppressed them.
+#  pragma option pop
+# endif
+
+#endif  // GTEST_CAN_COMPARE_NULL
+//
+// Tests CodePointToUtf8().
+
+// Tests that the NUL character L'\0' is encoded correctly.
+TEST(CodePointToUtf8Test, CanEncodeNul) {
+  EXPECT_EQ("", CodePointToUtf8(L'\0'));
+}
+
+// Tests that ASCII characters are encoded correctly.
+TEST(CodePointToUtf8Test, CanEncodeAscii) {
+  EXPECT_EQ("a", CodePointToUtf8(L'a'));
+  EXPECT_EQ("Z", CodePointToUtf8(L'Z'));
+  EXPECT_EQ("&", CodePointToUtf8(L'&'));
+  EXPECT_EQ("\x7F", CodePointToUtf8(L'\x7F'));
+}
+
+// Tests that Unicode code-points that have 8 to 11 bits are encoded
+// as 110xxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode8To11Bits) {
+  // 000 1101 0011 => 110-00011 10-010011
+  EXPECT_EQ("\xC3\x93", CodePointToUtf8(L'\xD3'));
+
+  // 101 0111 0110 => 110-10101 10-110110
+  // Some compilers (e.g., GCC on MinGW) cannot handle non-ASCII codepoints
+  // in wide strings and wide chars. In order to accomodate them, we have to
+  // introduce such character constants as integers.
+  EXPECT_EQ("\xD5\xB6",
+            CodePointToUtf8(static_cast<wchar_t>(0x576)));
+}
+
+// Tests that Unicode code-points that have 12 to 16 bits are encoded
+// as 1110xxxx 10xxxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode12To16Bits) {
+  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
+  EXPECT_EQ("\xE0\xA3\x93",
+            CodePointToUtf8(static_cast<wchar_t>(0x8D3)));
+
+  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
+  EXPECT_EQ("\xEC\x9D\x8D",
+            CodePointToUtf8(static_cast<wchar_t>(0xC74D)));
+}
+
+#if !GTEST_WIDE_STRING_USES_UTF16_
+// Tests in this group require a wchar_t to hold > 16 bits, and thus
+// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is
+// 16-bit wide. This code may not compile on those systems.
+
+// Tests that Unicode code-points that have 17 to 21 bits are encoded
+// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode17To21Bits) {
+  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
+  EXPECT_EQ("\xF0\x90\xA3\x93", CodePointToUtf8(L'\x108D3'));
+
+  // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000
+  EXPECT_EQ("\xF0\x90\x90\x80", CodePointToUtf8(L'\x10400'));
+
+  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
+  EXPECT_EQ("\xF4\x88\x98\xB4", CodePointToUtf8(L'\x108634'));
+}
+
+// Tests that encoding an invalid code-point generates the expected result.
+TEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) {
+  EXPECT_EQ("(Invalid Unicode 0x1234ABCD)", CodePointToUtf8(L'\x1234ABCD'));
+}
+
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests WideStringToUtf8().
+
+// Tests that the NUL character L'\0' is encoded correctly.
+TEST(WideStringToUtf8Test, CanEncodeNul) {
+  EXPECT_STREQ("", WideStringToUtf8(L"", 0).c_str());
+  EXPECT_STREQ("", WideStringToUtf8(L"", -1).c_str());
+}
+
+// Tests that ASCII strings are encoded correctly.
+TEST(WideStringToUtf8Test, CanEncodeAscii) {
+  EXPECT_STREQ("a", WideStringToUtf8(L"a", 1).c_str());
+  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", 2).c_str());
+  EXPECT_STREQ("a", WideStringToUtf8(L"a", -1).c_str());
+  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", -1).c_str());
+}
+
+// Tests that Unicode code-points that have 8 to 11 bits are encoded
+// as 110xxxxx 10xxxxxx.
+TEST(WideStringToUtf8Test, CanEncode8To11Bits) {
+  // 000 1101 0011 => 110-00011 10-010011
+  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", 1).c_str());
+  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", -1).c_str());
+
+  // 101 0111 0110 => 110-10101 10-110110
+  const wchar_t s[] = { 0x576, '\0' };
+  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, 1).c_str());
+  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, -1).c_str());
+}
+
+// Tests that Unicode code-points that have 12 to 16 bits are encoded
+// as 1110xxxx 10xxxxxx 10xxxxxx.
+TEST(WideStringToUtf8Test, CanEncode12To16Bits) {
+  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
+  const wchar_t s1[] = { 0x8D3, '\0' };
+  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, 1).c_str());
+  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, -1).c_str());
+
+  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
+  const wchar_t s2[] = { 0xC74D, '\0' };
+  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, 1).c_str());
+  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, -1).c_str());
+}
+
+// Tests that the conversion stops when the function encounters \0 character.
+TEST(WideStringToUtf8Test, StopsOnNulCharacter) {
+  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABC\0XYZ", 100).c_str());
+}
+
+// Tests that the conversion stops when the function reaches the limit
+// specified by the 'length' parameter.
+TEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) {
+  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABCDEF", 3).c_str());
+}
+
+#if !GTEST_WIDE_STRING_USES_UTF16_
+// Tests that Unicode code-points that have 17 to 21 bits are encoded
+// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile
+// on the systems using UTF-16 encoding.
+TEST(WideStringToUtf8Test, CanEncode17To21Bits) {
+  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
+  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", 1).c_str());
+  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", -1).c_str());
+
+  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
+  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", 1).c_str());
+  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", -1).c_str());
+}
+
+// Tests that encoding an invalid code-point generates the expected result.
+TEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) {
+  EXPECT_STREQ("(Invalid Unicode 0xABCDFF)",
+               WideStringToUtf8(L"\xABCDFF", -1).c_str());
+}
+#else  // !GTEST_WIDE_STRING_USES_UTF16_
+// Tests that surrogate pairs are encoded correctly on the systems using
+// UTF-16 encoding in the wide strings.
+TEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) {
+  const wchar_t s[] = { 0xD801, 0xDC00, '\0' };
+  EXPECT_STREQ("\xF0\x90\x90\x80", WideStringToUtf8(s, -1).c_str());
+}
+
+// Tests that encoding an invalid UTF-16 surrogate pair
+// generates the expected result.
+TEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) {
+  // Leading surrogate is at the end of the string.
+  const wchar_t s1[] = { 0xD800, '\0' };
+  EXPECT_STREQ("\xED\xA0\x80", WideStringToUtf8(s1, -1).c_str());
+  // Leading surrogate is not followed by the trailing surrogate.
+  const wchar_t s2[] = { 0xD800, 'M', '\0' };
+  EXPECT_STREQ("\xED\xA0\x80M", WideStringToUtf8(s2, -1).c_str());
+  // Trailing surrogate appearas without a leading surrogate.
+  const wchar_t s3[] = { 0xDC00, 'P', 'Q', 'R', '\0' };
+  EXPECT_STREQ("\xED\xB0\x80PQR", WideStringToUtf8(s3, -1).c_str());
+}
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests that codepoint concatenation works correctly.
+#if !GTEST_WIDE_STRING_USES_UTF16_
+TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
+  const wchar_t s[] = { 0x108634, 0xC74D, '\n', 0x576, 0x8D3, 0x108634, '\0'};
+  EXPECT_STREQ(
+      "\xF4\x88\x98\xB4"
+          "\xEC\x9D\x8D"
+          "\n"
+          "\xD5\xB6"
+          "\xE0\xA3\x93"
+          "\xF4\x88\x98\xB4",
+      WideStringToUtf8(s, -1).c_str());
+}
+#else
+TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
+  const wchar_t s[] = { 0xC74D, '\n', 0x576, 0x8D3, '\0'};
+  EXPECT_STREQ(
+      "\xEC\x9D\x8D" "\n" "\xD5\xB6" "\xE0\xA3\x93",
+      WideStringToUtf8(s, -1).c_str());
+}
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests the Random class.
+
+TEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) {
+  testing::internal::Random random(42);
+  EXPECT_DEATH_IF_SUPPORTED(
+      random.Generate(0),
+      "Cannot generate a number in the range \\[0, 0\\)");
+  EXPECT_DEATH_IF_SUPPORTED(
+      random.Generate(testing::internal::Random::kMaxRange + 1),
+      "Generation of a number in \\[0, 2147483649\\) was requested, "
+      "but this can only generate numbers in \\[0, 2147483648\\)");
+}
+
+TEST(RandomTest, GeneratesNumbersWithinRange) {
+  const UInt32 kRange = 10000;
+  testing::internal::Random random(12345);
+  for (int i = 0; i < 10; i++) {
+    EXPECT_LT(random.Generate(kRange), kRange) << " for iteration " << i;
+  }
+
+  testing::internal::Random random2(testing::internal::Random::kMaxRange);
+  for (int i = 0; i < 10; i++) {
+    EXPECT_LT(random2.Generate(kRange), kRange) << " for iteration " << i;
+  }
+}
+
+TEST(RandomTest, RepeatsWhenReseeded) {
+  const int kSeed = 123;
+  const int kArraySize = 10;
+  const UInt32 kRange = 10000;
+  UInt32 values[kArraySize];
+
+  testing::internal::Random random(kSeed);
+  for (int i = 0; i < kArraySize; i++) {
+    values[i] = random.Generate(kRange);
+  }
+
+  random.Reseed(kSeed);
+  for (int i = 0; i < kArraySize; i++) {
+    EXPECT_EQ(values[i], random.Generate(kRange)) << " for iteration " << i;
+  }
+}
+
+// Tests STL container utilities.
+
+// Tests CountIf().
+
+static bool IsPositive(int n) { return n > 0; }
+
+TEST(ContainerUtilityTest, CountIf) {
+  std::vector<int> v;
+  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works for an empty container.
+
+  v.push_back(-1);
+  v.push_back(0);
+  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works when no value satisfies.
+
+  v.push_back(2);
+  v.push_back(-10);
+  v.push_back(10);
+  EXPECT_EQ(2, CountIf(v, IsPositive));
+}
+
+// Tests ForEach().
+
+static int g_sum = 0;
+static void Accumulate(int n) { g_sum += n; }
+
+TEST(ContainerUtilityTest, ForEach) {
+  std::vector<int> v;
+  g_sum = 0;
+  ForEach(v, Accumulate);
+  EXPECT_EQ(0, g_sum);  // Works for an empty container;
+
+  g_sum = 0;
+  v.push_back(1);
+  ForEach(v, Accumulate);
+  EXPECT_EQ(1, g_sum);  // Works for a container with one element.
+
+  g_sum = 0;
+  v.push_back(20);
+  v.push_back(300);
+  ForEach(v, Accumulate);
+  EXPECT_EQ(321, g_sum);
+}
+
+// Tests GetElementOr().
+TEST(ContainerUtilityTest, GetElementOr) {
+  std::vector<char> a;
+  EXPECT_EQ('x', GetElementOr(a, 0, 'x'));
+
+  a.push_back('a');
+  a.push_back('b');
+  EXPECT_EQ('a', GetElementOr(a, 0, 'x'));
+  EXPECT_EQ('b', GetElementOr(a, 1, 'x'));
+  EXPECT_EQ('x', GetElementOr(a, -2, 'x'));
+  EXPECT_EQ('x', GetElementOr(a, 2, 'x'));
+}
+
+TEST(ContainerUtilityDeathTest, ShuffleRange) {
+  std::vector<int> a;
+  a.push_back(0);
+  a.push_back(1);
+  a.push_back(2);
+  testing::internal::Random random(1);
+
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, -1, 1, &a),
+      "Invalid shuffle range start -1: must be in range \\[0, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 4, 4, &a),
+      "Invalid shuffle range start 4: must be in range \\[0, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 3, 2, &a),
+      "Invalid shuffle range finish 2: must be in range \\[3, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 3, 4, &a),
+      "Invalid shuffle range finish 4: must be in range \\[3, 3\\]");
+}
+
+class VectorShuffleTest : public Test {
+ protected:
+  static const int kVectorSize = 20;
+
+  VectorShuffleTest() : random_(1) {
+    for (int i = 0; i < kVectorSize; i++) {
+      vector_.push_back(i);
+    }
+  }
+
+  static bool VectorIsCorrupt(const TestingVector& vector) {
+    if (kVectorSize != static_cast<int>(vector.size())) {
+      return true;
+    }
+
+    bool found_in_vector[kVectorSize] = { false };
+    for (size_t i = 0; i < vector.size(); i++) {
+      const int e = vector[i];
+      if (e < 0 || e >= kVectorSize || found_in_vector[e]) {
+        return true;
+      }
+      found_in_vector[e] = true;
+    }
+
+    // Vector size is correct, elements' range is correct, no
+    // duplicate elements.  Therefore no corruption has occurred.
+    return false;
+  }
+
+  static bool VectorIsNotCorrupt(const TestingVector& vector) {
+    return !VectorIsCorrupt(vector);
+  }
+
+  static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) {
+    for (int i = begin; i < end; i++) {
+      if (i != vector[i]) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static bool RangeIsUnshuffled(
+      const TestingVector& vector, int begin, int end) {
+    return !RangeIsShuffled(vector, begin, end);
+  }
+
+  static bool VectorIsShuffled(const TestingVector& vector) {
+    return RangeIsShuffled(vector, 0, static_cast<int>(vector.size()));
+  }
+
+  static bool VectorIsUnshuffled(const TestingVector& vector) {
+    return !VectorIsShuffled(vector);
+  }
+
+  testing::internal::Random random_;
+  TestingVector vector_;
+};  // class VectorShuffleTest
+
+const int VectorShuffleTest::kVectorSize;
+
+TEST_F(VectorShuffleTest, HandlesEmptyRange) {
+  // Tests an empty range at the beginning...
+  ShuffleRange(&random_, 0, 0, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...in the middle...
+  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...at the end...
+  ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...and past the end.
+  ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+}
+
+TEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) {
+  // Tests a size one range at the beginning...
+  ShuffleRange(&random_, 0, 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...in the middle...
+  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...and at the end.
+  ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+}
+
+// Because we use our own random number generator and a fixed seed,
+// we can guarantee that the following "random" tests will succeed.
+
+TEST_F(VectorShuffleTest, ShufflesEntireVector) {
+  Shuffle(&random_, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_;
+
+  // Tests the first and last elements in particular to ensure that
+  // there are no off-by-one problems in our shuffle algorithm.
+  EXPECT_NE(0, vector_[0]);
+  EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]);
+}
+
+TEST_F(VectorShuffleTest, ShufflesStartOfVector) {
+  const int kRangeSize = kVectorSize/2;
+
+  ShuffleRange(&random_, 0, kRangeSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesEndOfVector) {
+  const int kRangeSize = kVectorSize / 2;
+  ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesMiddleOfVector) {
+  int kRangeSize = kVectorSize/3;
+  ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesRepeatably) {
+  TestingVector vector2;
+  for (int i = 0; i < kVectorSize; i++) {
+    vector2.push_back(i);
+  }
+
+  random_.Reseed(1234);
+  Shuffle(&random_, &vector_);
+  random_.Reseed(1234);
+  Shuffle(&random_, &vector2);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector2);
+
+  for (int i = 0; i < kVectorSize; i++) {
+    EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i;
+  }
+}
+
+// Tests the size of the AssertHelper class.
+
+TEST(AssertHelperTest, AssertHelperIsSmall) {
+  // To avoid breaking clients that use lots of assertions in one
+  // function, we cannot grow the size of AssertHelper.
+  EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*));
+}
+
+// Tests String::EndsWithCaseInsensitive().
+TEST(StringTest, EndsWithCaseInsensitive) {
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", "BAR"));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobaR", "bar"));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", ""));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("", ""));
+
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("Foobar", "foo"));
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("foobar", "Foo"));
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("", "foo"));
+}
+
+// C++Builder's preprocessor is buggy; it fails to expand macros that
+// appear in macro parameters after wide char literals.  Provide an alias
+// for NULL as a workaround.
+static const wchar_t* const kNull = NULL;
+
+// Tests String::CaseInsensitiveWideCStringEquals
+TEST(StringTest, CaseInsensitiveWideCStringEquals) {
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L""));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"", kNull));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"foobar"));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"foobar", kNull));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"foobar"));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"FOOBAR"));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"FOOBAR", L"foobar"));
+}
+
+#if GTEST_OS_WINDOWS
+
+// Tests String::ShowWideCString().
+TEST(StringTest, ShowWideCString) {
+  EXPECT_STREQ("(null)",
+               String::ShowWideCString(NULL).c_str());
+  EXPECT_STREQ("", String::ShowWideCString(L"").c_str());
+  EXPECT_STREQ("foo", String::ShowWideCString(L"foo").c_str());
+}
+
+# if GTEST_OS_WINDOWS_MOBILE
+TEST(StringTest, AnsiAndUtf16Null) {
+  EXPECT_EQ(NULL, String::AnsiToUtf16(NULL));
+  EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL));
+}
+
+TEST(StringTest, AnsiAndUtf16ConvertBasic) {
+  const char* ansi = String::Utf16ToAnsi(L"str");
+  EXPECT_STREQ("str", ansi);
+  delete [] ansi;
+  const WCHAR* utf16 = String::AnsiToUtf16("str");
+  EXPECT_EQ(0, wcsncmp(L"str", utf16, 3));
+  delete [] utf16;
+}
+
+TEST(StringTest, AnsiAndUtf16ConvertPathChars) {
+  const char* ansi = String::Utf16ToAnsi(L".:\\ \"*?");
+  EXPECT_STREQ(".:\\ \"*?", ansi);
+  delete [] ansi;
+  const WCHAR* utf16 = String::AnsiToUtf16(".:\\ \"*?");
+  EXPECT_EQ(0, wcsncmp(L".:\\ \"*?", utf16, 3));
+  delete [] utf16;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#endif  // GTEST_OS_WINDOWS
+
+// Tests TestProperty construction.
+TEST(TestPropertyTest, StringValue) {
+  TestProperty property("key", "1");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("1", property.value());
+}
+
+// Tests TestProperty replacing a value.
+TEST(TestPropertyTest, ReplaceStringValue) {
+  TestProperty property("key", "1");
+  EXPECT_STREQ("1", property.value());
+  property.SetValue("2");
+  EXPECT_STREQ("2", property.value());
+}
+
+// AddFatalFailure() and AddNonfatalFailure() must be stand-alone
+// functions (i.e. their definitions cannot be inlined at the call
+// sites), or C++Builder won't compile the code.
+static void AddFatalFailure() {
+  FAIL() << "Expected fatal failure.";
+}
+
+static void AddNonfatalFailure() {
+  ADD_FAILURE() << "Expected non-fatal failure.";
+}
+
+class ScopedFakeTestPartResultReporterTest : public Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  enum FailureMode {
+    FATAL_FAILURE,
+    NONFATAL_FAILURE
+  };
+  static void AddFailure(FailureMode failure) {
+    if (failure == FATAL_FAILURE) {
+      AddFatalFailure();
+    } else {
+      AddNonfatalFailure();
+    }
+  }
+};
+
+// Tests that ScopedFakeTestPartResultReporter intercepts test
+// failures.
+TEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) {
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
+        &results);
+    AddFailure(NONFATAL_FAILURE);
+    AddFailure(FATAL_FAILURE);
+  }
+
+  EXPECT_EQ(2, results.size());
+  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
+}
+
+TEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) {
+  TestPartResultArray results;
+  {
+    // Tests, that the deprecated constructor still works.
+    ScopedFakeTestPartResultReporter reporter(&results);
+    AddFailure(NONFATAL_FAILURE);
+  }
+  EXPECT_EQ(1, results.size());
+}
+
+#if GTEST_IS_THREADSAFE
+
+class ScopedFakeTestPartResultReporterWithThreadsTest
+  : public ScopedFakeTestPartResultReporterTest {
+ protected:
+  static void AddFailureInOtherThread(FailureMode failure) {
+    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
+    thread.Join();
+  }
+};
+
+TEST_F(ScopedFakeTestPartResultReporterWithThreadsTest,
+       InterceptsTestFailuresInAllThreads) {
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results);
+    AddFailure(NONFATAL_FAILURE);
+    AddFailure(FATAL_FAILURE);
+    AddFailureInOtherThread(NONFATAL_FAILURE);
+    AddFailureInOtherThread(FATAL_FAILURE);
+  }
+
+  EXPECT_EQ(4, results.size());
+  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed());
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.  Makes sure that they
+// work even if the failure is generated in a called function rather than
+// the current context.
+
+typedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest;
+
+TEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(), "Expected fatal failure.");
+}
+
+#if GTEST_HAS_GLOBAL_STRING
+TEST_F(ExpectFatalFailureTest, AcceptsStringObject) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(), ::string("Expected fatal failure."));
+}
+#endif
+
+TEST_F(ExpectFatalFailureTest, AcceptsStdStringObject) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(),
+                       ::std::string("Expected fatal failure."));
+}
+
+TEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) {
+  // We have another test below to verify that the macro catches fatal
+  // failures generated on another thread.
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(),
+                                      "Expected fatal failure.");
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true"
+# pragma option push -w-ccc
+#endif
+
+// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void
+// function even when the statement in it contains ASSERT_*.
+
+int NonVoidFunction() {
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
+  return 0;
+}
+
+TEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) {
+  NonVoidFunction();
+}
+
+// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the
+// current function even though 'statement' generates a fatal failure.
+
+void DoesNotAbortHelper(bool* aborted) {
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
+
+  *aborted = false;
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" suppressed them.
+# pragma option pop
+#endif
+
+TEST_F(ExpectFatalFailureTest, DoesNotAbort) {
+  bool aborted = true;
+  DoesNotAbortHelper(&aborted);
+  EXPECT_FALSE(aborted);
+}
+
+// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a
+// statement that contains a macro which expands to code containing an
+// unprotected comma.
+
+static int global_var = 0;
+#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++
+
+TEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddFatalFailure();
+  }, "");
+#endif
+
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddFatalFailure();
+  }, "");
+}
+
+// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}.
+
+typedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest;
+
+TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          "Expected non-fatal failure.");
+}
+
+#if GTEST_HAS_GLOBAL_STRING
+TEST_F(ExpectNonfatalFailureTest, AcceptsStringObject) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          ::string("Expected non-fatal failure."));
+}
+#endif
+
+TEST_F(ExpectNonfatalFailureTest, AcceptsStdStringObject) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          ::std::string("Expected non-fatal failure."));
+}
+
+TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) {
+  // We have another test below to verify that the macro catches
+  // non-fatal failures generated on another thread.
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(),
+                                         "Expected non-fatal failure.");
+}
+
+// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a
+// statement that contains a macro which expands to code containing an
+// unprotected comma.
+TEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
+  EXPECT_NONFATAL_FAILURE({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddNonfatalFailure();
+  }, "");
+
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddNonfatalFailure();
+  }, "");
+}
+
+#if GTEST_IS_THREADSAFE
+
+typedef ScopedFakeTestPartResultReporterWithThreadsTest
+    ExpectFailureWithThreadsTest;
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) {
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE),
+                                      "Expected fatal failure.");
+}
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) {
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(
+      AddFailureInOtherThread(NONFATAL_FAILURE), "Expected non-fatal failure.");
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+// Tests the TestProperty class.
+
+TEST(TestPropertyTest, ConstructorWorks) {
+  const TestProperty property("key", "value");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("value", property.value());
+}
+
+TEST(TestPropertyTest, SetValue) {
+  TestProperty property("key", "value_1");
+  EXPECT_STREQ("key", property.key());
+  property.SetValue("value_2");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("value_2", property.value());
+}
+
+// Tests the TestResult class
+
+// The test fixture for testing TestResult.
+class TestResultTest : public Test {
+ protected:
+  typedef std::vector<TestPartResult> TPRVector;
+
+  // We make use of 2 TestPartResult objects,
+  TestPartResult * pr1, * pr2;
+
+  // ... and 3 TestResult objects.
+  TestResult * r0, * r1, * r2;
+
+  virtual void SetUp() {
+    // pr1 is for success.
+    pr1 = new TestPartResult(TestPartResult::kSuccess,
+                             "foo/bar.cc",
+                             10,
+                             "Success!");
+
+    // pr2 is for fatal failure.
+    pr2 = new TestPartResult(TestPartResult::kFatalFailure,
+                             "foo/bar.cc",
+                             -1,  // This line number means "unknown"
+                             "Failure!");
+
+    // Creates the TestResult objects.
+    r0 = new TestResult();
+    r1 = new TestResult();
+    r2 = new TestResult();
+
+    // In order to test TestResult, we need to modify its internal
+    // state, in particular the TestPartResult vector it holds.
+    // test_part_results() returns a const reference to this vector.
+    // We cast it to a non-const object s.t. it can be modified (yes,
+    // this is a hack).
+    TPRVector* results1 = const_cast<TPRVector*>(
+        &TestResultAccessor::test_part_results(*r1));
+    TPRVector* results2 = const_cast<TPRVector*>(
+        &TestResultAccessor::test_part_results(*r2));
+
+    // r0 is an empty TestResult.
+
+    // r1 contains a single SUCCESS TestPartResult.
+    results1->push_back(*pr1);
+
+    // r2 contains a SUCCESS, and a FAILURE.
+    results2->push_back(*pr1);
+    results2->push_back(*pr2);
+  }
+
+  virtual void TearDown() {
+    delete pr1;
+    delete pr2;
+
+    delete r0;
+    delete r1;
+    delete r2;
+  }
+
+  // Helper that compares two two TestPartResults.
+  static void CompareTestPartResult(const TestPartResult& expected,
+                                    const TestPartResult& actual) {
+    EXPECT_EQ(expected.type(), actual.type());
+    EXPECT_STREQ(expected.file_name(), actual.file_name());
+    EXPECT_EQ(expected.line_number(), actual.line_number());
+    EXPECT_STREQ(expected.summary(), actual.summary());
+    EXPECT_STREQ(expected.message(), actual.message());
+    EXPECT_EQ(expected.passed(), actual.passed());
+    EXPECT_EQ(expected.failed(), actual.failed());
+    EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed());
+    EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed());
+  }
+};
+
+// Tests TestResult::total_part_count().
+TEST_F(TestResultTest, total_part_count) {
+  ASSERT_EQ(0, r0->total_part_count());
+  ASSERT_EQ(1, r1->total_part_count());
+  ASSERT_EQ(2, r2->total_part_count());
+}
+
+// Tests TestResult::Passed().
+TEST_F(TestResultTest, Passed) {
+  ASSERT_TRUE(r0->Passed());
+  ASSERT_TRUE(r1->Passed());
+  ASSERT_FALSE(r2->Passed());
+}
+
+// Tests TestResult::Failed().
+TEST_F(TestResultTest, Failed) {
+  ASSERT_FALSE(r0->Failed());
+  ASSERT_FALSE(r1->Failed());
+  ASSERT_TRUE(r2->Failed());
+}
+
+// Tests TestResult::GetTestPartResult().
+
+typedef TestResultTest TestResultDeathTest;
+
+TEST_F(TestResultDeathTest, GetTestPartResult) {
+  CompareTestPartResult(*pr1, r2->GetTestPartResult(0));
+  CompareTestPartResult(*pr2, r2->GetTestPartResult(1));
+  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), "");
+  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), "");
+}
+
+// Tests TestResult has no properties when none are added.
+TEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) {
+  TestResult test_result;
+  ASSERT_EQ(0, test_result.test_property_count());
+}
+
+// Tests TestResult has the expected property when added.
+TEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) {
+  TestResult test_result;
+  TestProperty property("key_1", "1");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property);
+  ASSERT_EQ(1, test_result.test_property_count());
+  const TestProperty& actual_property = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property.key());
+  EXPECT_STREQ("1", actual_property.value());
+}
+
+// Tests TestResult has multiple properties when added.
+TEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) {
+  TestResult test_result;
+  TestProperty property_1("key_1", "1");
+  TestProperty property_2("key_2", "2");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
+  ASSERT_EQ(2, test_result.test_property_count());
+  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property_1.key());
+  EXPECT_STREQ("1", actual_property_1.value());
+
+  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
+  EXPECT_STREQ("key_2", actual_property_2.key());
+  EXPECT_STREQ("2", actual_property_2.value());
+}
+
+// Tests TestResult::RecordProperty() overrides values for duplicate keys.
+TEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) {
+  TestResult test_result;
+  TestProperty property_1_1("key_1", "1");
+  TestProperty property_2_1("key_2", "2");
+  TestProperty property_1_2("key_1", "12");
+  TestProperty property_2_2("key_2", "22");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_2);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_2);
+
+  ASSERT_EQ(2, test_result.test_property_count());
+  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property_1.key());
+  EXPECT_STREQ("12", actual_property_1.value());
+
+  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
+  EXPECT_STREQ("key_2", actual_property_2.key());
+  EXPECT_STREQ("22", actual_property_2.value());
+}
+
+// Tests TestResult::GetTestProperty().
+TEST(TestResultPropertyTest, GetTestProperty) {
+  TestResult test_result;
+  TestProperty property_1("key_1", "1");
+  TestProperty property_2("key_2", "2");
+  TestProperty property_3("key_3", "3");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_3);
+
+  const TestProperty& fetched_property_1 = test_result.GetTestProperty(0);
+  const TestProperty& fetched_property_2 = test_result.GetTestProperty(1);
+  const TestProperty& fetched_property_3 = test_result.GetTestProperty(2);
+
+  EXPECT_STREQ("key_1", fetched_property_1.key());
+  EXPECT_STREQ("1", fetched_property_1.value());
+
+  EXPECT_STREQ("key_2", fetched_property_2.key());
+  EXPECT_STREQ("2", fetched_property_2.value());
+
+  EXPECT_STREQ("key_3", fetched_property_3.key());
+  EXPECT_STREQ("3", fetched_property_3.value());
+
+  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), "");
+  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), "");
+}
+
+// Tests that GTestFlagSaver works on Windows and Mac.
+
+class GTestFlagSaverTest : public Test {
+ protected:
+  // Saves the Google Test flags such that we can restore them later, and
+  // then sets them to their default values.  This will be called
+  // before the first test in this test case is run.
+  static void SetUpTestCase() {
+    saver_ = new GTestFlagSaver;
+
+    GTEST_FLAG(also_run_disabled_tests) = false;
+    GTEST_FLAG(break_on_failure) = false;
+    GTEST_FLAG(catch_exceptions) = false;
+    GTEST_FLAG(death_test_use_fork) = false;
+    GTEST_FLAG(color) = "auto";
+    GTEST_FLAG(filter) = "";
+    GTEST_FLAG(list_tests) = false;
+    GTEST_FLAG(output) = "";
+    GTEST_FLAG(print_time) = true;
+    GTEST_FLAG(random_seed) = 0;
+    GTEST_FLAG(repeat) = 1;
+    GTEST_FLAG(shuffle) = false;
+    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
+    GTEST_FLAG(stream_result_to) = "";
+    GTEST_FLAG(throw_on_failure) = false;
+  }
+
+  // Restores the Google Test flags that the tests have modified.  This will
+  // be called after the last test in this test case is run.
+  static void TearDownTestCase() {
+    delete saver_;
+    saver_ = NULL;
+  }
+
+  // Verifies that the Google Test flags have their default values, and then
+  // modifies each of them.
+  void VerifyAndModifyFlags() {
+    EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests));
+    EXPECT_FALSE(GTEST_FLAG(break_on_failure));
+    EXPECT_FALSE(GTEST_FLAG(catch_exceptions));
+    EXPECT_STREQ("auto", GTEST_FLAG(color).c_str());
+    EXPECT_FALSE(GTEST_FLAG(death_test_use_fork));
+    EXPECT_STREQ("", GTEST_FLAG(filter).c_str());
+    EXPECT_FALSE(GTEST_FLAG(list_tests));
+    EXPECT_STREQ("", GTEST_FLAG(output).c_str());
+    EXPECT_TRUE(GTEST_FLAG(print_time));
+    EXPECT_EQ(0, GTEST_FLAG(random_seed));
+    EXPECT_EQ(1, GTEST_FLAG(repeat));
+    EXPECT_FALSE(GTEST_FLAG(shuffle));
+    EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth));
+    EXPECT_STREQ("", GTEST_FLAG(stream_result_to).c_str());
+    EXPECT_FALSE(GTEST_FLAG(throw_on_failure));
+
+    GTEST_FLAG(also_run_disabled_tests) = true;
+    GTEST_FLAG(break_on_failure) = true;
+    GTEST_FLAG(catch_exceptions) = true;
+    GTEST_FLAG(color) = "no";
+    GTEST_FLAG(death_test_use_fork) = true;
+    GTEST_FLAG(filter) = "abc";
+    GTEST_FLAG(list_tests) = true;
+    GTEST_FLAG(output) = "xml:foo.xml";
+    GTEST_FLAG(print_time) = false;
+    GTEST_FLAG(random_seed) = 1;
+    GTEST_FLAG(repeat) = 100;
+    GTEST_FLAG(shuffle) = true;
+    GTEST_FLAG(stack_trace_depth) = 1;
+    GTEST_FLAG(stream_result_to) = "localhost:1234";
+    GTEST_FLAG(throw_on_failure) = true;
+  }
+
+ private:
+  // For saving Google Test flags during this test case.
+  static GTestFlagSaver* saver_;
+};
+
+GTestFlagSaver* GTestFlagSaverTest::saver_ = NULL;
+
+// Google Test doesn't guarantee the order of tests.  The following two
+// tests are designed to work regardless of their order.
+
+// Modifies the Google Test flags in the test body.
+TEST_F(GTestFlagSaverTest, ModifyGTestFlags) {
+  VerifyAndModifyFlags();
+}
+
+// Verifies that the Google Test flags in the body of the previous test were
+// restored to their original values.
+TEST_F(GTestFlagSaverTest, VerifyGTestFlags) {
+  VerifyAndModifyFlags();
+}
+
+// Sets an environment variable with the given name to the given
+// value.  If the value argument is "", unsets the environment
+// variable.  The caller must ensure that both arguments are not NULL.
+static void SetEnv(const char* name, const char* value) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Environment variables are not supported on Windows CE.
+  return;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // C++Builder's putenv only stores a pointer to its parameter; we have to
+  // ensure that the string remains valid as long as it might be needed.
+  // We use an std::map to do so.
+  static std::map<std::string, std::string*> added_env;
+
+  // Because putenv stores a pointer to the string buffer, we can't delete the
+  // previous string (if present) until after it's replaced.
+  std::string *prev_env = NULL;
+  if (added_env.find(name) != added_env.end()) {
+    prev_env = added_env[name];
+  }
+  added_env[name] = new std::string(
+      (Message() << name << "=" << value).GetString());
+
+  // The standard signature of putenv accepts a 'char*' argument. Other
+  // implementations, like C++Builder's, accept a 'const char*'.
+  // We cast away the 'const' since that would work for both variants.
+  putenv(const_cast<char*>(added_env[name]->c_str()));
+  delete prev_env;
+#elif GTEST_OS_WINDOWS  // If we are on Windows proper.
+  _putenv((Message() << name << "=" << value).GetString().c_str());
+#else
+  if (*value == '\0') {
+    unsetenv(name);
+  } else {
+    setenv(name, value, 1);
+  }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+#if !GTEST_OS_WINDOWS_MOBILE
+// Environment variables are not supported on Windows CE.
+
+using testing::internal::Int32FromGTestEnv;
+
+// Tests Int32FromGTestEnv().
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable is not set.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "");
+  EXPECT_EQ(10, Int32FromGTestEnv("temp", 10));
+}
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable overflows as an Int32.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) {
+  printf("(expecting 2 warnings)\n");
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12345678987654321");
+  EXPECT_EQ(20, Int32FromGTestEnv("temp", 20));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-12345678987654321");
+  EXPECT_EQ(30, Int32FromGTestEnv("temp", 30));
+}
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable does not represent a valid decimal integer.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) {
+  printf("(expecting 2 warnings)\n");
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "A1");
+  EXPECT_EQ(40, Int32FromGTestEnv("temp", 40));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12X");
+  EXPECT_EQ(50, Int32FromGTestEnv("temp", 50));
+}
+
+// Tests that Int32FromGTestEnv() parses and returns the value of the
+// environment variable when it represents a valid decimal integer in
+// the range of an Int32.
+TEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "123");
+  EXPECT_EQ(123, Int32FromGTestEnv("temp", 0));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-321");
+  EXPECT_EQ(-321, Int32FromGTestEnv("temp", 0));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests ParseInt32Flag().
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag has wrong format
+TEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) {
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--a=100", "b", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("a=100", "a", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag overflows as an Int32.
+TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) {
+  printf("(expecting 2 warnings)\n");
+
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--abc=12345678987654321", "abc", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("--abc=-12345678987654321", "abc", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag does not represent a valid decimal
+// integer.
+TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) {
+  printf("(expecting 2 warnings)\n");
+
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--abc=A1", "abc", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("--abc=12X", "abc", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() parses the value of the flag and
+// returns true when the flag represents a valid decimal integer in
+// the range of an Int32.
+TEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) {
+  Int32 value = 123;
+  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=456", "abc", &value));
+  EXPECT_EQ(456, value);
+
+  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=-789",
+                             "abc", &value));
+  EXPECT_EQ(-789, value);
+}
+
+// Tests that Int32FromEnvOrDie() parses the value of the var or
+// returns the correct default.
+// Environment variables are not supported on Windows CE.
+#if !GTEST_OS_WINDOWS_MOBILE
+TEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) {
+  EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "123");
+  EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "-123");
+  EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests that Int32FromEnvOrDie() aborts with an error message
+// if the variable is not an Int32.
+TEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "xxx");
+  EXPECT_DEATH_IF_SUPPORTED(
+      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
+      ".*");
+}
+
+// Tests that Int32FromEnvOrDie() aborts with an error message
+// if the variable cannot be represnted by an Int32.
+TEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "1234567891234567891234");
+  EXPECT_DEATH_IF_SUPPORTED(
+      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
+      ".*");
+}
+
+// Tests that ShouldRunTestOnShard() selects all tests
+// where there is 1 shard.
+TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) {
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4));
+}
+
+class ShouldShardTest : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    index_var_ = GTEST_FLAG_PREFIX_UPPER_ "INDEX";
+    total_var_ = GTEST_FLAG_PREFIX_UPPER_ "TOTAL";
+  }
+
+  virtual void TearDown() {
+    SetEnv(index_var_, "");
+    SetEnv(total_var_, "");
+  }
+
+  const char* index_var_;
+  const char* total_var_;
+};
+
+// Tests that sharding is disabled if neither of the environment variables
+// are set.
+TEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) {
+  SetEnv(index_var_, "");
+  SetEnv(total_var_, "");
+
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+
+// Tests that sharding is not enabled if total_shards  == 1.
+TEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) {
+  SetEnv(index_var_, "0");
+  SetEnv(total_var_, "1");
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+
+// Tests that sharding is enabled if total_shards > 1 and
+// we are not in a death test subprocess.
+// Environment variables are not supported on Windows CE.
+#if !GTEST_OS_WINDOWS_MOBILE
+TEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) {
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "22");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+
+  SetEnv(index_var_, "8");
+  SetEnv(total_var_, "9");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+
+  SetEnv(index_var_, "0");
+  SetEnv(total_var_, "9");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests that we exit in error if the sharding values are not valid.
+
+typedef ShouldShardTest ShouldShardDeathTest;
+
+TEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) {
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "4");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "-2");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "5");
+  SetEnv(total_var_, "");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "");
+  SetEnv(total_var_, "5");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+}
+
+// Tests that ShouldRunTestOnShard is a partition when 5
+// shards are used.
+TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) {
+  // Choose an arbitrary number of tests and shards.
+  const int num_tests = 17;
+  const int num_shards = 5;
+
+  // Check partitioning: each test should be on exactly 1 shard.
+  for (int test_id = 0; test_id < num_tests; test_id++) {
+    int prev_selected_shard_index = -1;
+    for (int shard_index = 0; shard_index < num_shards; shard_index++) {
+      if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) {
+        if (prev_selected_shard_index < 0) {
+          prev_selected_shard_index = shard_index;
+        } else {
+          ADD_FAILURE() << "Shard " << prev_selected_shard_index << " and "
+            << shard_index << " are both selected to run test " << test_id;
+        }
+      }
+    }
+  }
+
+  // Check balance: This is not required by the sharding protocol, but is a
+  // desirable property for performance.
+  for (int shard_index = 0; shard_index < num_shards; shard_index++) {
+    int num_tests_on_shard = 0;
+    for (int test_id = 0; test_id < num_tests; test_id++) {
+      num_tests_on_shard +=
+        ShouldRunTestOnShard(num_shards, shard_index, test_id);
+    }
+    EXPECT_GE(num_tests_on_shard, num_tests / num_shards);
+  }
+}
+
+// For the same reason we are not explicitly testing everything in the
+// Test class, there are no separate tests for the following classes
+// (except for some trivial cases):
+//
+//   TestCase, UnitTest, UnitTestResultPrinter.
+//
+// Similarly, there are no separate tests for the following macros:
+//
+//   TEST, TEST_F, RUN_ALL_TESTS
+
+TEST(UnitTestTest, CanGetOriginalWorkingDir) {
+  ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL);
+  EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), "");
+}
+
+TEST(UnitTestTest, ReturnsPlausibleTimestamp) {
+  EXPECT_LT(0, UnitTest::GetInstance()->start_timestamp());
+  EXPECT_LE(UnitTest::GetInstance()->start_timestamp(), GetTimeInMillis());
+}
+
+// When a property using a reserved key is supplied to this function, it
+// tests that a non-fatal failure is added, a fatal failure is not added,
+// and that the property is not recorded.
+void ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+    const TestResult& test_result, const char* key) {
+  EXPECT_NONFATAL_FAILURE(Test::RecordProperty(key, "1"), "Reserved key");
+  ASSERT_EQ(0, test_result.test_property_count()) << "Property for key '" << key
+                                                  << "' recorded unexpectedly.";
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+    const char* key) {
+  const TestInfo* test_info = UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(test_info != NULL);
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(*test_info->result(),
+                                                        key);
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+    const char* key) {
+  const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
+  ASSERT_TRUE(test_case != NULL);
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+      test_case->ad_hoc_test_result(), key);
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+    const char* key) {
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+      UnitTest::GetInstance()->ad_hoc_test_result(), key);
+}
+
+// Tests that property recording functions in UnitTest outside of tests
+// functions correcly.  Creating a separate instance of UnitTest ensures it
+// is in a state similar to the UnitTest's singleton's between tests.
+class UnitTestRecordPropertyTest :
+    public testing::internal::UnitTestRecordPropertyTestHelper {
+ public:
+  static void SetUpTestCase() {
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "disabled");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "errors");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "failures");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "name");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "tests");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "time");
+
+    Test::RecordProperty("test_case_key_1", "1");
+    const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
+    ASSERT_TRUE(test_case != NULL);
+
+    ASSERT_EQ(1, test_case->ad_hoc_test_result().test_property_count());
+    EXPECT_STREQ("test_case_key_1",
+                 test_case->ad_hoc_test_result().GetTestProperty(0).key());
+    EXPECT_STREQ("1",
+                 test_case->ad_hoc_test_result().GetTestProperty(0).value());
+  }
+};
+
+// Tests TestResult has the expected property when added.
+TEST_F(UnitTestRecordPropertyTest, OnePropertyFoundWhenAdded) {
+  UnitTestRecordProperty("key_1", "1");
+
+  ASSERT_EQ(1, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+}
+
+// Tests TestResult has multiple properties when added.
+TEST_F(UnitTestRecordPropertyTest, MultiplePropertiesFoundWhenAdded) {
+  UnitTestRecordProperty("key_1", "1");
+  UnitTestRecordProperty("key_2", "2");
+
+  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("1", unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+
+  EXPECT_STREQ("key_2",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
+  EXPECT_STREQ("2", unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
+}
+
+// Tests TestResult::RecordProperty() overrides values for duplicate keys.
+TEST_F(UnitTestRecordPropertyTest, OverridesValuesForDuplicateKeys) {
+  UnitTestRecordProperty("key_1", "1");
+  UnitTestRecordProperty("key_2", "2");
+  UnitTestRecordProperty("key_1", "12");
+  UnitTestRecordProperty("key_2", "22");
+
+  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("12",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+
+  EXPECT_STREQ("key_2",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
+  EXPECT_STREQ("22",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
+}
+
+TEST_F(UnitTestRecordPropertyTest,
+       AddFailureInsideTestsWhenUsingTestCaseReservedKeys) {
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "name");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "value_param");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "type_param");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "status");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "time");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "classname");
+}
+
+TEST_F(UnitTestRecordPropertyTest,
+       AddRecordWithReservedKeysGeneratesCorrectPropertyList) {
+  EXPECT_NONFATAL_FAILURE(
+      Test::RecordProperty("name", "1"),
+      "'classname', 'name', 'status', 'time', 'type_param', and 'value_param'"
+      " are reserved");
+}
+
+class UnitTestRecordPropertyTestEnvironment : public Environment {
+ public:
+  virtual void TearDown() {
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "tests");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "failures");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "disabled");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "errors");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "name");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "timestamp");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "time");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "random_seed");
+  }
+};
+
+// This will test property recording outside of any test or test case.
+static Environment* record_property_env =
+    AddGlobalTestEnvironment(new UnitTestRecordPropertyTestEnvironment);
+
+// This group of tests is for predicate assertions (ASSERT_PRED*, etc)
+// of various arities.  They do not attempt to be exhaustive.  Rather,
+// view them as smoke tests that can be easily reviewed and verified.
+// A more complete set of tests for predicate assertions can be found
+// in gtest_pred_impl_unittest.cc.
+
+// First, some predicates and predicate-formatters needed by the tests.
+
+// Returns true iff the argument is an even number.
+bool IsEven(int n) {
+  return (n % 2) == 0;
+}
+
+// A functor that returns true iff the argument is an even number.
+struct IsEvenFunctor {
+  bool operator()(int n) { return IsEven(n); }
+};
+
+// A predicate-formatter function that asserts the argument is an even
+// number.
+AssertionResult AssertIsEven(const char* expr, int n) {
+  if (IsEven(n)) {
+    return AssertionSuccess();
+  }
+
+  Message msg;
+  msg << expr << " evaluates to " << n << ", which is not even.";
+  return AssertionFailure(msg);
+}
+
+// A predicate function that returns AssertionResult for use in
+// EXPECT/ASSERT_TRUE/FALSE.
+AssertionResult ResultIsEven(int n) {
+  if (IsEven(n))
+    return AssertionSuccess() << n << " is even";
+  else
+    return AssertionFailure() << n << " is odd";
+}
+
+// A predicate function that returns AssertionResult but gives no
+// explanation why it succeeds. Needed for testing that
+// EXPECT/ASSERT_FALSE handles such functions correctly.
+AssertionResult ResultIsEvenNoExplanation(int n) {
+  if (IsEven(n))
+    return AssertionSuccess();
+  else
+    return AssertionFailure() << n << " is odd";
+}
+
+// A predicate-formatter functor that asserts the argument is an even
+// number.
+struct AssertIsEvenFunctor {
+  AssertionResult operator()(const char* expr, int n) {
+    return AssertIsEven(expr, n);
+  }
+};
+
+// Returns true iff the sum of the arguments is an even number.
+bool SumIsEven2(int n1, int n2) {
+  return IsEven(n1 + n2);
+}
+
+// A functor that returns true iff the sum of the arguments is an even
+// number.
+struct SumIsEven3Functor {
+  bool operator()(int n1, int n2, int n3) {
+    return IsEven(n1 + n2 + n3);
+  }
+};
+
+// A predicate-formatter function that asserts the sum of the
+// arguments is an even number.
+AssertionResult AssertSumIsEven4(
+    const char* e1, const char* e2, const char* e3, const char* e4,
+    int n1, int n2, int n3, int n4) {
+  const int sum = n1 + n2 + n3 + n4;
+  if (IsEven(sum)) {
+    return AssertionSuccess();
+  }
+
+  Message msg;
+  msg << e1 << " + " << e2 << " + " << e3 << " + " << e4
+      << " (" << n1 << " + " << n2 << " + " << n3 << " + " << n4
+      << ") evaluates to " << sum << ", which is not even.";
+  return AssertionFailure(msg);
+}
+
+// A predicate-formatter functor that asserts the sum of the arguments
+// is an even number.
+struct AssertSumIsEven5Functor {
+  AssertionResult operator()(
+      const char* e1, const char* e2, const char* e3, const char* e4,
+      const char* e5, int n1, int n2, int n3, int n4, int n5) {
+    const int sum = n1 + n2 + n3 + n4 + n5;
+    if (IsEven(sum)) {
+      return AssertionSuccess();
+    }
+
+    Message msg;
+    msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
+        << " ("
+        << n1 << " + " << n2 << " + " << n3 << " + " << n4 << " + " << n5
+        << ") evaluates to " << sum << ", which is not even.";
+    return AssertionFailure(msg);
+  }
+};
+
+
+// Tests unary predicate assertions.
+
+// Tests unary predicate assertions that don't use a custom formatter.
+TEST(Pred1Test, WithoutFormat) {
+  // Success cases.
+  EXPECT_PRED1(IsEvenFunctor(), 2) << "This failure is UNEXPECTED!";
+  ASSERT_PRED1(IsEven, 4);
+
+  // Failure cases.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(IsEven, 5) << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5),
+                       "evaluates to false");
+}
+
+// Tests unary predicate assertions that use a custom formatter.
+TEST(Pred1Test, WithFormat) {
+  // Success cases.
+  EXPECT_PRED_FORMAT1(AssertIsEven, 2);
+  ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4)
+    << "This failure is UNEXPECTED!";
+
+  // Failure cases.
+  const int n = 5;
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n),
+                          "n evaluates to 5, which is not even.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(AssertIsEven, 5) << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+// Tests that unary predicate assertions evaluates their arguments
+// exactly once.
+TEST(Pred1Test, SingleEvaluationOnFailure) {
+  // A success case.
+  static int n = 0;
+  EXPECT_PRED1(IsEven, n++);
+  EXPECT_EQ(1, n) << "The argument is not evaluated exactly once.";
+
+  // A failure case.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_EQ(2, n) << "The argument is not evaluated exactly once.";
+}
+
+
+// Tests predicate assertions whose arity is >= 2.
+
+// Tests predicate assertions that don't use a custom formatter.
+TEST(PredTest, WithoutFormat) {
+  // Success cases.
+  ASSERT_PRED2(SumIsEven2, 2, 4) << "This failure is UNEXPECTED!";
+  EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8);
+
+  // Failure cases.
+  const int n1 = 1;
+  const int n2 = 2;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(SumIsEven2, n1, n2) << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4);
+  }, "evaluates to false");
+}
+
+// Tests predicate assertions that use a custom formatter.
+TEST(PredTest, WithFormat) {
+  // Success cases.
+  ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) <<
+    "This failure is UNEXPECTED!";
+  EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10);
+
+  // Failure cases.
+  const int n1 = 1;
+  const int n2 = 2;
+  const int n3 = 4;
+  const int n4 = 6;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4);
+  }, "evaluates to 13, which is not even.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+// Tests that predicate assertions evaluates their arguments
+// exactly once.
+TEST(PredTest, SingleEvaluationOnFailure) {
+  // A success case.
+  int n1 = 0;
+  int n2 = 0;
+  EXPECT_PRED2(SumIsEven2, n1++, n2++);
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+
+  // Another success case.
+  n1 = n2 = 0;
+  int n3 = 0;
+  int n4 = 0;
+  int n5 = 0;
+  ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(),
+                      n1++, n2++, n3++, n4++, n5++)
+                        << "This failure is UNEXPECTED!";
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
+  EXPECT_EQ(1, n5) << "Argument 5 is not evaluated exactly once.";
+
+  // A failure case.
+  n1 = n2 = n3 = 0;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+
+  // Another failure case.
+  n1 = n2 = n3 = n4 = 0;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++);
+  }, "evaluates to 1, which is not even.");
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
+}
+
+
+// Some helper functions for testing using overloaded/template
+// functions with ASSERT_PREDn and EXPECT_PREDn.
+
+bool IsPositive(double x) {
+  return x > 0;
+}
+
+template <typename T>
+bool IsNegative(T x) {
+  return x < 0;
+}
+
+template <typename T1, typename T2>
+bool GreaterThan(T1 x1, T2 x2) {
+  return x1 > x2;
+}
+
+// Tests that overloaded functions can be used in *_PRED* as long as
+// their types are explicitly specified.
+TEST(PredicateAssertionTest, AcceptsOverloadedFunction) {
+  // C++Builder requires C-style casts rather than static_cast.
+  EXPECT_PRED1((bool (*)(int))(IsPositive), 5);  // NOLINT
+  ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0);  // NOLINT
+}
+
+// Tests that template functions can be used in *_PRED* as long as
+// their types are explicitly specified.
+TEST(PredicateAssertionTest, AcceptsTemplateFunction) {
+  EXPECT_PRED1(IsNegative<int>, -5);
+  // Makes sure that we can handle templates with more than one
+  // parameter.
+  ASSERT_PRED2((GreaterThan<int, int>), 5, 0);
+}
+
+
+// Some helper functions for testing using overloaded/template
+// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn.
+
+AssertionResult IsPositiveFormat(const char* /* expr */, int n) {
+  return n > 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+AssertionResult IsPositiveFormat(const char* /* expr */, double x) {
+  return x > 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+template <typename T>
+AssertionResult IsNegativeFormat(const char* /* expr */, T x) {
+  return x < 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+template <typename T1, typename T2>
+AssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */,
+                             const T1& x1, const T2& x2) {
+  return x1 == x2 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+// Tests that overloaded functions can be used in *_PRED_FORMAT*
+// without explicitly specifying their types.
+TEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) {
+  EXPECT_PRED_FORMAT1(IsPositiveFormat, 5);
+  ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0);
+}
+
+// Tests that template functions can be used in *_PRED_FORMAT* without
+// explicitly specifying their types.
+TEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) {
+  EXPECT_PRED_FORMAT1(IsNegativeFormat, -5);
+  ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3);
+}
+
+
+// Tests string assertions.
+
+// Tests ASSERT_STREQ with non-NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ) {
+  const char * const p1 = "good";
+  ASSERT_STREQ(p1, p1);
+
+  // Let p2 have the same content as p1, but be at a different address.
+  const char p2[] = "good";
+  ASSERT_STREQ(p1, p2);
+
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("bad", "good"),
+                       "Expected: \"bad\"");
+}
+
+// Tests ASSERT_STREQ with NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ_Null) {
+  ASSERT_STREQ(static_cast<const char *>(NULL), NULL);
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, "non-null"),
+                       "non-null");
+}
+
+// Tests ASSERT_STREQ with NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ_Null2) {
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("non-null", NULL),
+                       "non-null");
+}
+
+// Tests ASSERT_STRNE.
+TEST(StringAssertionTest, ASSERT_STRNE) {
+  ASSERT_STRNE("hi", "Hi");
+  ASSERT_STRNE("Hi", NULL);
+  ASSERT_STRNE(NULL, "Hi");
+  ASSERT_STRNE("", NULL);
+  ASSERT_STRNE(NULL, "");
+  ASSERT_STRNE("", "Hi");
+  ASSERT_STRNE("Hi", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRNE("Hi", "Hi"),
+                       "\"Hi\" vs \"Hi\"");
+}
+
+// Tests ASSERT_STRCASEEQ.
+TEST(StringAssertionTest, ASSERT_STRCASEEQ) {
+  ASSERT_STRCASEEQ("hi", "Hi");
+  ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL);
+
+  ASSERT_STRCASEEQ("", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("Hi", "hi2"),
+                       "(ignoring case)");
+}
+
+// Tests ASSERT_STRCASENE.
+TEST(StringAssertionTest, ASSERT_STRCASENE) {
+  ASSERT_STRCASENE("hi1", "Hi2");
+  ASSERT_STRCASENE("Hi", NULL);
+  ASSERT_STRCASENE(NULL, "Hi");
+  ASSERT_STRCASENE("", NULL);
+  ASSERT_STRCASENE(NULL, "");
+  ASSERT_STRCASENE("", "Hi");
+  ASSERT_STRCASENE("Hi", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("Hi", "hi"),
+                       "(ignoring case)");
+}
+
+// Tests *_STREQ on wide strings.
+TEST(StringAssertionTest, STREQ_Wide) {
+  // NULL strings.
+  ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL);
+
+  // Empty strings.
+  ASSERT_STREQ(L"", L"");
+
+  // Non-null vs NULL.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"non-null", NULL),
+                          "non-null");
+
+  // Equal strings.
+  EXPECT_STREQ(L"Hi", L"Hi");
+
+  // Unequal strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc", L"Abc"),
+                          "Abc");
+
+  // Strings containing wide characters.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc\x8119", L"abc\x8120"),
+                          "abc");
+
+  // The streaming variation.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_STREQ(L"abc\x8119", L"abc\x8121") << "Expected failure";
+  }, "Expected failure");
+}
+
+// Tests *_STRNE on wide strings.
+TEST(StringAssertionTest, STRNE_Wide) {
+  // NULL strings.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL);
+  }, "");
+
+  // Empty strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"", L""),
+                          "L\"\"");
+
+  // Non-null vs NULL.
+  ASSERT_STRNE(L"non-null", NULL);
+
+  // Equal strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"Hi", L"Hi"),
+                          "L\"Hi\"");
+
+  // Unequal strings.
+  EXPECT_STRNE(L"abc", L"Abc");
+
+  // Strings containing wide characters.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"abc\x8119", L"abc\x8119"),
+                          "abc");
+
+  // The streaming variation.
+  ASSERT_STRNE(L"abc\x8119", L"abc\x8120") << "This shouldn't happen";
+}
+
+// Tests for ::testing::IsSubstring().
+
+// Tests that IsSubstring() returns the correct result when the input
+// argument type is const char*.
+TEST(IsSubstringTest, ReturnsCorrectResultForCString) {
+  EXPECT_FALSE(IsSubstring("", "", NULL, "a"));
+  EXPECT_FALSE(IsSubstring("", "", "b", NULL));
+  EXPECT_FALSE(IsSubstring("", "", "needle", "haystack"));
+
+  EXPECT_TRUE(IsSubstring("", "", static_cast<const char*>(NULL), NULL));
+  EXPECT_TRUE(IsSubstring("", "", "needle", "two needles"));
+}
+
+// Tests that IsSubstring() returns the correct result when the input
+// argument type is const wchar_t*.
+TEST(IsSubstringTest, ReturnsCorrectResultForWideCString) {
+  EXPECT_FALSE(IsSubstring("", "", kNull, L"a"));
+  EXPECT_FALSE(IsSubstring("", "", L"b", kNull));
+  EXPECT_FALSE(IsSubstring("", "", L"needle", L"haystack"));
+
+  EXPECT_TRUE(IsSubstring("", "", static_cast<const wchar_t*>(NULL), NULL));
+  EXPECT_TRUE(IsSubstring("", "", L"needle", L"two needles"));
+}
+
+// Tests that IsSubstring() generates the correct message when the input
+// argument type is const char*.
+TEST(IsSubstringTest, GeneratesCorrectMessageForCString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: \"needle\"\n"
+               "Expected: a substring of haystack_expr\n"
+               "Which is: \"haystack\"",
+               IsSubstring("needle_expr", "haystack_expr",
+                           "needle", "haystack").failure_message());
+}
+
+// Tests that IsSubstring returns the correct result when the input
+// argument type is ::std::string.
+TEST(IsSubstringTest, ReturnsCorrectResultsForStdString) {
+  EXPECT_TRUE(IsSubstring("", "", std::string("hello"), "ahellob"));
+  EXPECT_FALSE(IsSubstring("", "", "hello", std::string("world")));
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Tests that IsSubstring returns the correct result when the input
+// argument type is ::std::wstring.
+TEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) {
+  EXPECT_TRUE(IsSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
+  EXPECT_FALSE(IsSubstring("", "", L"needle", ::std::wstring(L"haystack")));
+}
+
+// Tests that IsSubstring() generates the correct message when the input
+// argument type is ::std::wstring.
+TEST(IsSubstringTest, GeneratesCorrectMessageForWstring) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: L\"needle\"\n"
+               "Expected: a substring of haystack_expr\n"
+               "Which is: L\"haystack\"",
+               IsSubstring(
+                   "needle_expr", "haystack_expr",
+                   ::std::wstring(L"needle"), L"haystack").failure_message());
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests for ::testing::IsNotSubstring().
+
+// Tests that IsNotSubstring() returns the correct result when the input
+// argument type is const char*.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForCString) {
+  EXPECT_TRUE(IsNotSubstring("", "", "needle", "haystack"));
+  EXPECT_FALSE(IsNotSubstring("", "", "needle", "two needles"));
+}
+
+// Tests that IsNotSubstring() returns the correct result when the input
+// argument type is const wchar_t*.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) {
+  EXPECT_TRUE(IsNotSubstring("", "", L"needle", L"haystack"));
+  EXPECT_FALSE(IsNotSubstring("", "", L"needle", L"two needles"));
+}
+
+// Tests that IsNotSubstring() generates the correct message when the input
+// argument type is const wchar_t*.
+TEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: L\"needle\"\n"
+               "Expected: not a substring of haystack_expr\n"
+               "Which is: L\"two needles\"",
+               IsNotSubstring(
+                   "needle_expr", "haystack_expr",
+                   L"needle", L"two needles").failure_message());
+}
+
+// Tests that IsNotSubstring returns the correct result when the input
+// argument type is ::std::string.
+TEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) {
+  EXPECT_FALSE(IsNotSubstring("", "", std::string("hello"), "ahellob"));
+  EXPECT_TRUE(IsNotSubstring("", "", "hello", std::string("world")));
+}
+
+// Tests that IsNotSubstring() generates the correct message when the input
+// argument type is ::std::string.
+TEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: \"needle\"\n"
+               "Expected: not a substring of haystack_expr\n"
+               "Which is: \"two needles\"",
+               IsNotSubstring(
+                   "needle_expr", "haystack_expr",
+                   ::std::string("needle"), "two needles").failure_message());
+}
+
+#if GTEST_HAS_STD_WSTRING
+
+// Tests that IsNotSubstring returns the correct result when the input
+// argument type is ::std::wstring.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) {
+  EXPECT_FALSE(
+      IsNotSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
+  EXPECT_TRUE(IsNotSubstring("", "", L"needle", ::std::wstring(L"haystack")));
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests floating-point assertions.
+
+template <typename RawType>
+class FloatingPointTest : public Test {
+ protected:
+  // Pre-calculated numbers to be used by the tests.
+  struct TestValues {
+    RawType close_to_positive_zero;
+    RawType close_to_negative_zero;
+    RawType further_from_negative_zero;
+
+    RawType close_to_one;
+    RawType further_from_one;
+
+    RawType infinity;
+    RawType close_to_infinity;
+    RawType further_from_infinity;
+
+    RawType nan1;
+    RawType nan2;
+  };
+
+  typedef typename testing::internal::FloatingPoint<RawType> Floating;
+  typedef typename Floating::Bits Bits;
+
+  virtual void SetUp() {
+    const size_t max_ulps = Floating::kMaxUlps;
+
+    // The bits that represent 0.0.
+    const Bits zero_bits = Floating(0).bits();
+
+    // Makes some numbers close to 0.0.
+    values_.close_to_positive_zero = Floating::ReinterpretBits(
+        zero_bits + max_ulps/2);
+    values_.close_to_negative_zero = -Floating::ReinterpretBits(
+        zero_bits + max_ulps - max_ulps/2);
+    values_.further_from_negative_zero = -Floating::ReinterpretBits(
+        zero_bits + max_ulps + 1 - max_ulps/2);
+
+    // The bits that represent 1.0.
+    const Bits one_bits = Floating(1).bits();
+
+    // Makes some numbers close to 1.0.
+    values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps);
+    values_.further_from_one = Floating::ReinterpretBits(
+        one_bits + max_ulps + 1);
+
+    // +infinity.
+    values_.infinity = Floating::Infinity();
+
+    // The bits that represent +infinity.
+    const Bits infinity_bits = Floating(values_.infinity).bits();
+
+    // Makes some numbers close to infinity.
+    values_.close_to_infinity = Floating::ReinterpretBits(
+        infinity_bits - max_ulps);
+    values_.further_from_infinity = Floating::ReinterpretBits(
+        infinity_bits - max_ulps - 1);
+
+    // Makes some NAN's.  Sets the most significant bit of the fraction so that
+    // our NaN's are quiet; trying to process a signaling NaN would raise an
+    // exception if our environment enables floating point exceptions.
+    values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask
+        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 1);
+    values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask
+        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 200);
+  }
+
+  void TestSize() {
+    EXPECT_EQ(sizeof(RawType), sizeof(Bits));
+  }
+
+  static TestValues values_;
+};
+
+template <typename RawType>
+typename FloatingPointTest<RawType>::TestValues
+    FloatingPointTest<RawType>::values_;
+
+// Instantiates FloatingPointTest for testing *_FLOAT_EQ.
+typedef FloatingPointTest<float> FloatTest;
+
+// Tests that the size of Float::Bits matches the size of float.
+TEST_F(FloatTest, Size) {
+  TestSize();
+}
+
+// Tests comparing with +0 and -0.
+TEST_F(FloatTest, Zeros) {
+  EXPECT_FLOAT_EQ(0.0, -0.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0),
+                          "1.0");
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5),
+                       "1.5");
+}
+
+// Tests comparing numbers close to 0.
+//
+// This ensures that *_FLOAT_EQ handles the sign correctly and no
+// overflow occurs when comparing numbers whose absolute value is very
+// small.
+TEST_F(FloatTest, AlmostZeros) {
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const FloatTest::TestValues& v = this->values_;
+
+  EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero);
+  EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero);
+  EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_FLOAT_EQ(v.close_to_positive_zero,
+                    v.further_from_negative_zero);
+  }, "v.further_from_negative_zero");
+}
+
+// Tests comparing numbers close to each other.
+TEST_F(FloatTest, SmallDiff) {
+  EXPECT_FLOAT_EQ(1.0, values_.close_to_one);
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one),
+                          "values_.further_from_one");
+}
+
+// Tests comparing numbers far apart.
+TEST_F(FloatTest, LargeDiff) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0),
+                          "3.0");
+}
+
+// Tests comparing with infinity.
+//
+// This ensures that no overflow occurs when comparing numbers whose
+// absolute value is very large.
+TEST_F(FloatTest, Infinity) {
+  EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity);
+  EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity),
+                          "-values_.infinity");
+
+  // This is interesting as the representations of infinity and nan1
+  // are only 1 DLP apart.
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1),
+                          "values_.nan1");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that comparing with NAN always returns false.
+TEST_F(FloatTest, NaN) {
+#if !GTEST_OS_SYMBIAN
+// Nokia's STLport crashes if we try to output infinity or NaN.
+
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const FloatTest::TestValues& v = this->values_;
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1),
+                          "v.nan1");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2),
+                          "v.nan2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1),
+                          "v.nan1");
+
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity),
+                       "v.infinity");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_FLOAT_EQ are reflexive.
+TEST_F(FloatTest, Reflexive) {
+  EXPECT_FLOAT_EQ(0.0, 0.0);
+  EXPECT_FLOAT_EQ(1.0, 1.0);
+  ASSERT_FLOAT_EQ(values_.infinity, values_.infinity);
+}
+
+// Tests that *_FLOAT_EQ are commutative.
+TEST_F(FloatTest, Commutative) {
+  // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one).
+  EXPECT_FLOAT_EQ(values_.close_to_one, 1.0);
+
+  // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one).
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0),
+                          "1.0");
+}
+
+// Tests EXPECT_NEAR.
+TEST_F(FloatTest, EXPECT_NEAR) {
+  EXPECT_NEAR(-1.0f, -1.1f, 0.2f);
+  EXPECT_NEAR(2.0f, 3.0f, 1.0f);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
+                          "The difference between 1.0f and 1.5f is 0.5, "
+                          "which exceeds 0.25f");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous line.
+}
+
+// Tests ASSERT_NEAR.
+TEST_F(FloatTest, ASSERT_NEAR) {
+  ASSERT_NEAR(-1.0f, -1.1f, 0.2f);
+  ASSERT_NEAR(2.0f, 3.0f, 1.0f);
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
+                       "The difference between 1.0f and 1.5f is 0.5, "
+                       "which exceeds 0.25f");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous line.
+}
+
+// Tests the cases where FloatLE() should succeed.
+TEST_F(FloatTest, FloatLESucceeds) {
+  EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f);  // When val1 < val2,
+  ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f);  // val1 == val2,
+
+  // or when val1 is greater than, but almost equals to, val2.
+  EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f);
+}
+
+// Tests the cases where FloatLE() should fail.
+TEST_F(FloatTest, FloatLEFails) {
+  // When val1 is greater than val2 by a large margin,
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f),
+                          "(2.0f) <= (1.0f)");
+
+  // or by a small yet non-negligible margin,
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f);
+  }, "(values_.further_from_one) <= (1.0f)");
+
+#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  // C++Builder gives bad results for ordered comparisons involving NaNs
+  // due to compiler bugs.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity);
+  }, "(values_.nan1) <= (values_.infinity)");
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1);
+  }, "(-values_.infinity) <= (values_.nan1)");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1);
+  }, "(values_.nan1) <= (values_.nan1)");
+#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+}
+
+// Instantiates FloatingPointTest for testing *_DOUBLE_EQ.
+typedef FloatingPointTest<double> DoubleTest;
+
+// Tests that the size of Double::Bits matches the size of double.
+TEST_F(DoubleTest, Size) {
+  TestSize();
+}
+
+// Tests comparing with +0 and -0.
+TEST_F(DoubleTest, Zeros) {
+  EXPECT_DOUBLE_EQ(0.0, -0.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0),
+                          "1.0");
+  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0),
+                       "1.0");
+}
+
+// Tests comparing numbers close to 0.
+//
+// This ensures that *_DOUBLE_EQ handles the sign correctly and no
+// overflow occurs when comparing numbers whose absolute value is very
+// small.
+TEST_F(DoubleTest, AlmostZeros) {
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const DoubleTest::TestValues& v = this->values_;
+
+  EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero);
+  EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero);
+  EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_DOUBLE_EQ(v.close_to_positive_zero,
+                     v.further_from_negative_zero);
+  }, "v.further_from_negative_zero");
+}
+
+// Tests comparing numbers close to each other.
+TEST_F(DoubleTest, SmallDiff) {
+  EXPECT_DOUBLE_EQ(1.0, values_.close_to_one);
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one),
+                          "values_.further_from_one");
+}
+
+// Tests comparing numbers far apart.
+TEST_F(DoubleTest, LargeDiff) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0),
+                          "3.0");
+}
+
+// Tests comparing with infinity.
+//
+// This ensures that no overflow occurs when comparing numbers whose
+// absolute value is very large.
+TEST_F(DoubleTest, Infinity) {
+  EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity);
+  EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity),
+                          "-values_.infinity");
+
+  // This is interesting as the representations of infinity_ and nan1_
+  // are only 1 DLP apart.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1),
+                          "values_.nan1");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that comparing with NAN always returns false.
+TEST_F(DoubleTest, NaN) {
+#if !GTEST_OS_SYMBIAN
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const DoubleTest::TestValues& v = this->values_;
+
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1),
+                          "v.nan1");
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), "v.nan2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), "v.nan1");
+  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity),
+                       "v.infinity");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_DOUBLE_EQ are reflexive.
+TEST_F(DoubleTest, Reflexive) {
+  EXPECT_DOUBLE_EQ(0.0, 0.0);
+  EXPECT_DOUBLE_EQ(1.0, 1.0);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity);
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_DOUBLE_EQ are commutative.
+TEST_F(DoubleTest, Commutative) {
+  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one).
+  EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0);
+
+  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one).
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0),
+                          "1.0");
+}
+
+// Tests EXPECT_NEAR.
+TEST_F(DoubleTest, EXPECT_NEAR) {
+  EXPECT_NEAR(-1.0, -1.1, 0.2);
+  EXPECT_NEAR(2.0, 3.0, 1.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25),  // NOLINT
+                          "The difference between 1.0 and 1.5 is 0.5, "
+                          "which exceeds 0.25");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests ASSERT_NEAR.
+TEST_F(DoubleTest, ASSERT_NEAR) {
+  ASSERT_NEAR(-1.0, -1.1, 0.2);
+  ASSERT_NEAR(2.0, 3.0, 1.0);
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25),  // NOLINT
+                       "The difference between 1.0 and 1.5 is 0.5, "
+                       "which exceeds 0.25");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests the cases where DoubleLE() should succeed.
+TEST_F(DoubleTest, DoubleLESucceeds) {
+  EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0);  // When val1 < val2,
+  ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0);  // val1 == val2,
+
+  // or when val1 is greater than, but almost equals to, val2.
+  EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0);
+}
+
+// Tests the cases where DoubleLE() should fail.
+TEST_F(DoubleTest, DoubleLEFails) {
+  // When val1 is greater than val2 by a large margin,
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0),
+                          "(2.0) <= (1.0)");
+
+  // or by a small yet non-negligible margin,
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0);
+  }, "(values_.further_from_one) <= (1.0)");
+
+#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  // C++Builder gives bad results for ordered comparisons involving NaNs
+  // due to compiler bugs.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity);
+  }, "(values_.nan1) <= (values_.infinity)");
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1);
+  }, " (-values_.infinity) <= (values_.nan1)");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1);
+  }, "(values_.nan1) <= (values_.nan1)");
+#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+}
+
+
+// Verifies that a test or test case whose name starts with DISABLED_ is
+// not run.
+
+// A test whose name starts with DISABLED_.
+// Should not run.
+TEST(DisabledTest, DISABLED_TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+// A test whose name does not start with DISABLED_.
+// Should run.
+TEST(DisabledTest, NotDISABLED_TestShouldRun) {
+  EXPECT_EQ(1, 1);
+}
+
+// A test case whose name starts with DISABLED_.
+// Should not run.
+TEST(DISABLED_TestCase, TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
+}
+
+// A test case and test whose names start with DISABLED_.
+// Should not run.
+TEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
+}
+
+// Check that when all tests in a test case are disabled, SetupTestCase() and
+// TearDownTestCase() are not called.
+class DisabledTestsTest : public Test {
+ protected:
+  static void SetUpTestCase() {
+    FAIL() << "Unexpected failure: All tests disabled in test case. "
+              "SetupTestCase() should not be called.";
+  }
+
+  static void TearDownTestCase() {
+    FAIL() << "Unexpected failure: All tests disabled in test case. "
+              "TearDownTestCase() should not be called.";
+  }
+};
+
+TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+// Tests that disabled typed tests aren't run.
+
+#if GTEST_HAS_TYPED_TEST
+
+template <typename T>
+class TypedTest : public Test {
+};
+
+typedef testing::Types<int, double> NumericTypes;
+TYPED_TEST_CASE(TypedTest, NumericTypes);
+
+TYPED_TEST(TypedTest, DISABLED_ShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled typed test should not run.";
+}
+
+template <typename T>
+class DISABLED_TypedTest : public Test {
+};
+
+TYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes);
+
+TYPED_TEST(DISABLED_TypedTest, ShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled typed test should not run.";
+}
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Tests that disabled type-parameterized tests aren't run.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+template <typename T>
+class TypedTestP : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP);
+
+TYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) {
+  FAIL() << "Unexpected failure: "
+         << "Disabled type-parameterized test should not run.";
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes);
+
+template <typename T>
+class DISABLED_TypedTestP : public Test {
+};
+
+TYPED_TEST_CASE_P(DISABLED_TypedTestP);
+
+TYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) {
+  FAIL() << "Unexpected failure: "
+         << "Disabled type-parameterized test should not run.";
+}
+
+REGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+// Tests that assertion macros evaluate their arguments exactly once.
+
+class SingleEvaluationTest : public Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  // This helper function is needed by the FailedASSERT_STREQ test
+  // below.  It's public to work around C++Builder's bug with scoping local
+  // classes.
+  static void CompareAndIncrementCharPtrs() {
+    ASSERT_STREQ(p1_++, p2_++);
+  }
+
+  // This helper function is needed by the FailedASSERT_NE test below.  It's
+  // public to work around C++Builder's bug with scoping local classes.
+  static void CompareAndIncrementInts() {
+    ASSERT_NE(a_++, b_++);
+  }
+
+ protected:
+  SingleEvaluationTest() {
+    p1_ = s1_;
+    p2_ = s2_;
+    a_ = 0;
+    b_ = 0;
+  }
+
+  static const char* const s1_;
+  static const char* const s2_;
+  static const char* p1_;
+  static const char* p2_;
+
+  static int a_;
+  static int b_;
+};
+
+const char* const SingleEvaluationTest::s1_ = "01234";
+const char* const SingleEvaluationTest::s2_ = "abcde";
+const char* SingleEvaluationTest::p1_;
+const char* SingleEvaluationTest::p2_;
+int SingleEvaluationTest::a_;
+int SingleEvaluationTest::b_;
+
+// Tests that when ASSERT_STREQ fails, it evaluates its arguments
+// exactly once.
+TEST_F(SingleEvaluationTest, FailedASSERT_STREQ) {
+  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(),
+                       "p2_++");
+  EXPECT_EQ(s1_ + 1, p1_);
+  EXPECT_EQ(s2_ + 1, p2_);
+}
+
+// Tests that string assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, ASSERT_STR) {
+  // successful EXPECT_STRNE
+  EXPECT_STRNE(p1_++, p2_++);
+  EXPECT_EQ(s1_ + 1, p1_);
+  EXPECT_EQ(s2_ + 1, p2_);
+
+  // failed EXPECT_STRCASEEQ
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++),
+                          "ignoring case");
+  EXPECT_EQ(s1_ + 2, p1_);
+  EXPECT_EQ(s2_ + 2, p2_);
+}
+
+// Tests that when ASSERT_NE fails, it evaluates its arguments exactly
+// once.
+TEST_F(SingleEvaluationTest, FailedASSERT_NE) {
+  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(),
+                       "(a_++) != (b_++)");
+  EXPECT_EQ(1, a_);
+  EXPECT_EQ(1, b_);
+}
+
+// Tests that assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, OtherCases) {
+  // successful EXPECT_TRUE
+  EXPECT_TRUE(0 == a_++);  // NOLINT
+  EXPECT_EQ(1, a_);
+
+  // failed EXPECT_TRUE
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), "-1 == a_++");
+  EXPECT_EQ(2, a_);
+
+  // successful EXPECT_GT
+  EXPECT_GT(a_++, b_++);
+  EXPECT_EQ(3, a_);
+  EXPECT_EQ(1, b_);
+
+  // failed EXPECT_LT
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), "(a_++) < (b_++)");
+  EXPECT_EQ(4, a_);
+  EXPECT_EQ(2, b_);
+
+  // successful ASSERT_TRUE
+  ASSERT_TRUE(0 < a_++);  // NOLINT
+  EXPECT_EQ(5, a_);
+
+  // successful ASSERT_GT
+  ASSERT_GT(a_++, b_++);
+  EXPECT_EQ(6, a_);
+  EXPECT_EQ(3, b_);
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowAnInteger() {
+  throw 1;
+}
+
+// Tests that assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, ExceptionTests) {
+  // successful EXPECT_THROW
+  EXPECT_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }, int);
+  EXPECT_EQ(1, a_);
+
+  // failed EXPECT_THROW, throws different
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }, bool), "throws a different type");
+  EXPECT_EQ(2, a_);
+
+  // failed EXPECT_THROW, throws nothing
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), "throws nothing");
+  EXPECT_EQ(3, a_);
+
+  // successful EXPECT_NO_THROW
+  EXPECT_NO_THROW(a_++);
+  EXPECT_EQ(4, a_);
+
+  // failed EXPECT_NO_THROW
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }), "it throws");
+  EXPECT_EQ(5, a_);
+
+  // successful EXPECT_ANY_THROW
+  EXPECT_ANY_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  });
+  EXPECT_EQ(6, a_);
+
+  // failed EXPECT_ANY_THROW
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), "it doesn't");
+  EXPECT_EQ(7, a_);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE.
+class NoFatalFailureTest : public Test {
+ protected:
+  void Succeeds() {}
+  void FailsNonFatal() {
+    ADD_FAILURE() << "some non-fatal failure";
+  }
+  void Fails() {
+    FAIL() << "some fatal failure";
+  }
+
+  void DoAssertNoFatalFailureOnFails() {
+    ASSERT_NO_FATAL_FAILURE(Fails());
+    ADD_FAILURE() << "shold not reach here.";
+  }
+
+  void DoExpectNoFatalFailureOnFails() {
+    EXPECT_NO_FATAL_FAILURE(Fails());
+    ADD_FAILURE() << "other failure";
+  }
+};
+
+TEST_F(NoFatalFailureTest, NoFailure) {
+  EXPECT_NO_FATAL_FAILURE(Succeeds());
+  ASSERT_NO_FATAL_FAILURE(Succeeds());
+}
+
+TEST_F(NoFatalFailureTest, NonFatalIsNoFailure) {
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_NO_FATAL_FAILURE(FailsNonFatal()),
+      "some non-fatal failure");
+  EXPECT_NONFATAL_FAILURE(
+      ASSERT_NO_FATAL_FAILURE(FailsNonFatal()),
+      "some non-fatal failure");
+}
+
+TEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    DoAssertNoFatalFailureOnFails();
+  }
+  ASSERT_EQ(2, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
+                      gtest_failures.GetTestPartResult(1).message());
+}
+
+TEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    DoExpectNoFatalFailureOnFails();
+  }
+  ASSERT_EQ(3, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(2).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
+                      gtest_failures.GetTestPartResult(1).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "other failure",
+                      gtest_failures.GetTestPartResult(2).message());
+}
+
+TEST_F(NoFatalFailureTest, MessageIsStreamable) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    EXPECT_NO_FATAL_FAILURE(FAIL() << "foo") << "my message";
+  }
+  ASSERT_EQ(2, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "foo",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "my message",
+                      gtest_failures.GetTestPartResult(1).message());
+}
+
+// Tests non-string assertions.
+
+// Tests EqFailure(), used for implementing *EQ* assertions.
+TEST(AssertionTest, EqFailure) {
+  const std::string foo_val("5"), bar_val("6");
+  const std::string msg1(
+      EqFailure("foo", "bar", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: 6\n"
+      "Expected: foo\n"
+      "Which is: 5",
+      msg1.c_str());
+
+  const std::string msg2(
+      EqFailure("foo", "6", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: 6\n"
+      "Expected: foo\n"
+      "Which is: 5",
+      msg2.c_str());
+
+  const std::string msg3(
+      EqFailure("5", "bar", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: 6\n"
+      "Expected: 5",
+      msg3.c_str());
+
+  const std::string msg4(
+      EqFailure("5", "6", foo_val, bar_val, false).failure_message());
+  EXPECT_STREQ(
+      "Value of: 6\n"
+      "Expected: 5",
+      msg4.c_str());
+
+  const std::string msg5(
+      EqFailure("foo", "bar",
+                std::string("\"x\""), std::string("\"y\""),
+                true).failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: \"y\"\n"
+      "Expected: foo (ignoring case)\n"
+      "Which is: \"x\"",
+      msg5.c_str());
+}
+
+// Tests AppendUserMessage(), used for implementing the *EQ* macros.
+TEST(AssertionTest, AppendUserMessage) {
+  const std::string foo("foo");
+
+  Message msg;
+  EXPECT_STREQ("foo",
+               AppendUserMessage(foo, msg).c_str());
+
+  msg << "bar";
+  EXPECT_STREQ("foo\nbar",
+               AppendUserMessage(foo, msg).c_str());
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+// Tests ASSERT_TRUE.
+TEST(AssertionTest, ASSERT_TRUE) {
+  ASSERT_TRUE(2 > 1);  // NOLINT
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1),
+                       "2 < 1");
+}
+
+// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult.
+TEST(AssertionTest, AssertTrueWithAssertionResult) {
+  ASSERT_TRUE(ResultIsEven(2));
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)),
+                       "Value of: ResultIsEven(3)\n"
+                       "  Actual: false (3 is odd)\n"
+                       "Expected: true");
+#endif
+  ASSERT_TRUE(ResultIsEvenNoExplanation(2));
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)),
+                       "Value of: ResultIsEvenNoExplanation(3)\n"
+                       "  Actual: false (3 is odd)\n"
+                       "Expected: true");
+}
+
+// Tests ASSERT_FALSE.
+TEST(AssertionTest, ASSERT_FALSE) {
+  ASSERT_FALSE(2 < 1);  // NOLINT
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1),
+                       "Value of: 2 > 1\n"
+                       "  Actual: true\n"
+                       "Expected: false");
+}
+
+// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult.
+TEST(AssertionTest, AssertFalseWithAssertionResult) {
+  ASSERT_FALSE(ResultIsEven(3));
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)),
+                       "Value of: ResultIsEven(2)\n"
+                       "  Actual: true (2 is even)\n"
+                       "Expected: false");
+#endif
+  ASSERT_FALSE(ResultIsEvenNoExplanation(3));
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)),
+                       "Value of: ResultIsEvenNoExplanation(2)\n"
+                       "  Actual: true\n"
+                       "Expected: false");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+// Tests using ASSERT_EQ on double values.  The purpose is to make
+// sure that the specialization we did for integer and anonymous enums
+// isn't used for double arguments.
+TEST(ExpectTest, ASSERT_EQ_Double) {
+  // A success.
+  ASSERT_EQ(5.6, 5.6);
+
+  // A failure.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2),
+                       "5.1");
+}
+
+// Tests ASSERT_EQ.
+TEST(AssertionTest, ASSERT_EQ) {
+  ASSERT_EQ(5, 2 + 3);
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3),
+                       "Value of: 2*3\n"
+                       "  Actual: 6\n"
+                       "Expected: 5");
+}
+
+// Tests ASSERT_EQ(NULL, pointer).
+#if GTEST_CAN_COMPARE_NULL
+TEST(AssertionTest, ASSERT_EQ_NULL) {
+  // A success.
+  const char* p = NULL;
+  // Some older GCC versions may issue a spurious waring in this or the next
+  // assertion statement. This warning should not be suppressed with
+  // static_cast since the test verifies the ability to use bare NULL as the
+  // expected parameter to the macro.
+  ASSERT_EQ(NULL, p);
+
+  // A failure.
+  static int n = 0;
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n),
+                       "Value of: &n\n");
+}
+#endif  // GTEST_CAN_COMPARE_NULL
+
+// Tests ASSERT_EQ(0, non_pointer).  Since the literal 0 can be
+// treated as a null pointer by the compiler, we need to make sure
+// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as
+// ASSERT_EQ(static_cast<void*>(NULL), non_pointer).
+TEST(ExpectTest, ASSERT_EQ_0) {
+  int n = 0;
+
+  // A success.
+  ASSERT_EQ(0, n);
+
+  // A failure.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6),
+                       "Expected: 0");
+}
+
+// Tests ASSERT_NE.
+TEST(AssertionTest, ASSERT_NE) {
+  ASSERT_NE(6, 7);
+  EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'),
+                       "Expected: ('a') != ('a'), "
+                       "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
+}
+
+// Tests ASSERT_LE.
+TEST(AssertionTest, ASSERT_LE) {
+  ASSERT_LE(2, 3);
+  ASSERT_LE(2, 2);
+  EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0),
+                       "Expected: (2) <= (0), actual: 2 vs 0");
+}
+
+// Tests ASSERT_LT.
+TEST(AssertionTest, ASSERT_LT) {
+  ASSERT_LT(2, 3);
+  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2),
+                       "Expected: (2) < (2), actual: 2 vs 2");
+}
+
+// Tests ASSERT_GE.
+TEST(AssertionTest, ASSERT_GE) {
+  ASSERT_GE(2, 1);
+  ASSERT_GE(2, 2);
+  EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3),
+                       "Expected: (2) >= (3), actual: 2 vs 3");
+}
+
+// Tests ASSERT_GT.
+TEST(AssertionTest, ASSERT_GT) {
+  ASSERT_GT(2, 1);
+  EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2),
+                       "Expected: (2) > (2), actual: 2 vs 2");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowNothing() {}
+
+// Tests ASSERT_THROW.
+TEST(AssertionTest, ASSERT_THROW) {
+  ASSERT_THROW(ThrowAnInteger(), int);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(
+      ASSERT_THROW(ThrowAnInteger(), bool),
+      "Expected: ThrowAnInteger() throws an exception of type bool.\n"
+      "  Actual: it throws a different type.");
+# endif
+
+  EXPECT_FATAL_FAILURE(
+      ASSERT_THROW(ThrowNothing(), bool),
+      "Expected: ThrowNothing() throws an exception of type bool.\n"
+      "  Actual: it throws nothing.");
+}
+
+// Tests ASSERT_NO_THROW.
+TEST(AssertionTest, ASSERT_NO_THROW) {
+  ASSERT_NO_THROW(ThrowNothing());
+  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()),
+                       "Expected: ThrowAnInteger() doesn't throw an exception."
+                       "\n  Actual: it throws.");
+}
+
+// Tests ASSERT_ANY_THROW.
+TEST(AssertionTest, ASSERT_ANY_THROW) {
+  ASSERT_ANY_THROW(ThrowAnInteger());
+  EXPECT_FATAL_FAILURE(
+      ASSERT_ANY_THROW(ThrowNothing()),
+      "Expected: ThrowNothing() throws an exception.\n"
+      "  Actual: it doesn't.");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Makes sure we deal with the precedence of <<.  This test should
+// compile.
+TEST(AssertionTest, AssertPrecedence) {
+  ASSERT_EQ(1 < 2, true);
+  bool false_value = false;
+  ASSERT_EQ(true && false_value, false);
+}
+
+// A subroutine used by the following test.
+void TestEq1(int x) {
+  ASSERT_EQ(1, x);
+}
+
+// Tests calling a test subroutine that's not part of a fixture.
+TEST(AssertionTest, NonFixtureSubroutine) {
+  EXPECT_FATAL_FAILURE(TestEq1(2),
+                       "Value of: x");
+}
+
+// An uncopyable class.
+class Uncopyable {
+ public:
+  explicit Uncopyable(int a_value) : value_(a_value) {}
+
+  int value() const { return value_; }
+  bool operator==(const Uncopyable& rhs) const {
+    return value() == rhs.value();
+  }
+ private:
+  // This constructor deliberately has no implementation, as we don't
+  // want this class to be copyable.
+  Uncopyable(const Uncopyable&);  // NOLINT
+
+  int value_;
+};
+
+::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) {
+  return os << value.value();
+}
+
+
+bool IsPositiveUncopyable(const Uncopyable& x) {
+  return x.value() > 0;
+}
+
+// A subroutine used by the following test.
+void TestAssertNonPositive() {
+  Uncopyable y(-1);
+  ASSERT_PRED1(IsPositiveUncopyable, y);
+}
+// A subroutine used by the following test.
+void TestAssertEqualsUncopyable() {
+  Uncopyable x(5);
+  Uncopyable y(-1);
+  ASSERT_EQ(x, y);
+}
+
+// Tests that uncopyable objects can be used in assertions.
+TEST(AssertionTest, AssertWorksWithUncopyableObject) {
+  Uncopyable x(5);
+  ASSERT_PRED1(IsPositiveUncopyable, x);
+  ASSERT_EQ(x, x);
+  EXPECT_FATAL_FAILURE(TestAssertNonPositive(),
+    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
+  EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(),
+    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
+}
+
+// Tests that uncopyable objects can be used in expects.
+TEST(AssertionTest, ExpectWorksWithUncopyableObject) {
+  Uncopyable x(5);
+  EXPECT_PRED1(IsPositiveUncopyable, x);
+  Uncopyable y(-1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y),
+    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
+  EXPECT_EQ(x, x);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y),
+    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
+}
+
+enum NamedEnum {
+  kE1 = 0,
+  kE2 = 1
+};
+
+TEST(AssertionTest, NamedEnum) {
+  EXPECT_EQ(kE1, kE1);
+  EXPECT_LT(kE1, kE2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Which is: 0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Actual: 1");
+}
+
+// The version of gcc used in XCode 2.2 has a bug and doesn't allow
+// anonymous enums in assertions.  Therefore the following test is not
+// done on Mac.
+// Sun Studio and HP aCC also reject this code.
+#if !GTEST_OS_MAC && !defined(__SUNPRO_CC) && !defined(__HP_aCC)
+
+// Tests using assertions with anonymous enums.
+enum {
+  kCaseA = -1,
+
+# if GTEST_OS_LINUX
+
+  // We want to test the case where the size of the anonymous enum is
+  // larger than sizeof(int), to make sure our implementation of the
+  // assertions doesn't truncate the enums.  However, MSVC
+  // (incorrectly) doesn't allow an enum value to exceed the range of
+  // an int, so this has to be conditionally compiled.
+  //
+  // On Linux, kCaseB and kCaseA have the same value when truncated to
+  // int size.  We want to test whether this will confuse the
+  // assertions.
+  kCaseB = testing::internal::kMaxBiggestInt,
+
+# else
+
+  kCaseB = INT_MAX,
+
+# endif  // GTEST_OS_LINUX
+
+  kCaseC = 42
+};
+
+TEST(AssertionTest, AnonymousEnum) {
+# if GTEST_OS_LINUX
+
+  EXPECT_EQ(static_cast<int>(kCaseA), static_cast<int>(kCaseB));
+
+# endif  // GTEST_OS_LINUX
+
+  EXPECT_EQ(kCaseA, kCaseA);
+  EXPECT_NE(kCaseA, kCaseB);
+  EXPECT_LT(kCaseA, kCaseB);
+  EXPECT_LE(kCaseA, kCaseB);
+  EXPECT_GT(kCaseB, kCaseA);
+  EXPECT_GE(kCaseA, kCaseA);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseB),
+                          "(kCaseA) >= (kCaseB)");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseC),
+                          "-1 vs 42");
+
+  ASSERT_EQ(kCaseA, kCaseA);
+  ASSERT_NE(kCaseA, kCaseB);
+  ASSERT_LT(kCaseA, kCaseB);
+  ASSERT_LE(kCaseA, kCaseB);
+  ASSERT_GT(kCaseB, kCaseA);
+  ASSERT_GE(kCaseA, kCaseA);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseB),
+                       "Value of: kCaseB");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
+                       "Actual: 42");
+# endif
+
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
+                       "Which is: -1");
+}
+
+#endif  // !GTEST_OS_MAC && !defined(__SUNPRO_CC)
+
+#if GTEST_OS_WINDOWS
+
+static HRESULT UnexpectedHRESULTFailure() {
+  return E_UNEXPECTED;
+}
+
+static HRESULT OkHRESULTSuccess() {
+  return S_OK;
+}
+
+static HRESULT FalseHRESULTSuccess() {
+  return S_FALSE;
+}
+
+// HRESULT assertion tests test both zero and non-zero
+// success codes as well as failure message for each.
+//
+// Windows CE doesn't support message texts.
+TEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) {
+  EXPECT_HRESULT_SUCCEEDED(S_OK);
+  EXPECT_HRESULT_SUCCEEDED(S_FALSE);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
+    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
+    "  Actual: 0x8000FFFF");
+}
+
+TEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) {
+  ASSERT_HRESULT_SUCCEEDED(S_OK);
+  ASSERT_HRESULT_SUCCEEDED(S_FALSE);
+
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
+    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
+    "  Actual: 0x8000FFFF");
+}
+
+TEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) {
+  EXPECT_HRESULT_FAILED(E_UNEXPECTED);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()),
+    "Expected: (OkHRESULTSuccess()) fails.\n"
+    "  Actual: 0x0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()),
+    "Expected: (FalseHRESULTSuccess()) fails.\n"
+    "  Actual: 0x1");
+}
+
+TEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) {
+  ASSERT_HRESULT_FAILED(E_UNEXPECTED);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()),
+    "Expected: (OkHRESULTSuccess()) fails.\n"
+    "  Actual: 0x0");
+# endif
+
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()),
+    "Expected: (FalseHRESULTSuccess()) fails.\n"
+    "  Actual: 0x1");
+}
+
+// Tests that streaming to the HRESULT macros works.
+TEST(HRESULTAssertionTest, Streaming) {
+  EXPECT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
+  ASSERT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
+  EXPECT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
+  ASSERT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
+
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
+      "expected failure");
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(
+      ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
+      "expected failure");
+# endif
+
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_HRESULT_FAILED(S_OK) << "expected failure",
+      "expected failure");
+
+  EXPECT_FATAL_FAILURE(
+      ASSERT_HRESULT_FAILED(S_OK) << "expected failure",
+      "expected failure");
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+// Tests that the assertion macros behave like single statements.
+TEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    ASSERT_TRUE(false) << "This should never be executed; "
+                          "It's a compilation test only.";
+
+  if (AlwaysTrue())
+    EXPECT_FALSE(false);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_LT(1, 3);
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    EXPECT_GT(3, 2) << "";
+}
+
+#if GTEST_HAS_EXCEPTIONS
+// Tests that the compiler will not complain about unreachable code in the
+// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros.
+TEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) {
+  int n = 0;
+
+  EXPECT_THROW(throw 1, int);
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), "");
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), "");
+  EXPECT_NO_THROW(n++);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), "");
+  EXPECT_ANY_THROW(throw 1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), "");
+}
+
+TEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    EXPECT_THROW(ThrowNothing(), bool);
+
+  if (AlwaysTrue())
+    EXPECT_THROW(ThrowAnInteger(), int);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    EXPECT_NO_THROW(ThrowAnInteger());
+
+  if (AlwaysTrue())
+    EXPECT_NO_THROW(ThrowNothing());
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    EXPECT_ANY_THROW(ThrowNothing());
+
+  if (AlwaysTrue())
+    EXPECT_ANY_THROW(ThrowAnInteger());
+  else
+    ;  // NOLINT
+}
+#endif  // GTEST_HAS_EXCEPTIONS
+
+TEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    EXPECT_NO_FATAL_FAILURE(FAIL()) << "This should never be executed. "
+                                    << "It's a compilation test only.";
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_NO_FATAL_FAILURE(FAIL()) << "";
+  else
+    ;  // NOLINT
+
+  if (AlwaysTrue())
+    EXPECT_NO_FATAL_FAILURE(SUCCEED());
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    ASSERT_NO_FATAL_FAILURE(SUCCEED());
+}
+
+// Tests that the assertion macros work well with switch statements.
+TEST(AssertionSyntaxTest, WorksWithSwitch) {
+  switch (0) {
+    case 1:
+      break;
+    default:
+      ASSERT_TRUE(true);
+  }
+
+  switch (0)
+    case 0:
+      EXPECT_FALSE(false) << "EXPECT_FALSE failed in switch case";
+
+  // Binary assertions are implemented using a different code path
+  // than the Boolean assertions.  Hence we test them separately.
+  switch (0) {
+    case 1:
+    default:
+      ASSERT_EQ(1, 1) << "ASSERT_EQ failed in default switch handler";
+  }
+
+  switch (0)
+    case 0:
+      EXPECT_NE(1, 2);
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowAString() {
+    throw "std::string";
+}
+
+// Test that the exception assertion macros compile and work with const
+// type qualifier.
+TEST(AssertionSyntaxTest, WorksWithConst) {
+    ASSERT_THROW(ThrowAString(), const char*);
+
+    EXPECT_THROW(ThrowAString(), const char*);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+}  // namespace
+
+namespace testing {
+
+// Tests that Google Test tracks SUCCEED*.
+TEST(SuccessfulAssertionTest, SUCCEED) {
+  SUCCEED();
+  SUCCEED() << "OK";
+  EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful EXPECT_*.
+TEST(SuccessfulAssertionTest, EXPECT) {
+  EXPECT_TRUE(true);
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful EXPECT_STR*.
+TEST(SuccessfulAssertionTest, EXPECT_STR) {
+  EXPECT_STREQ("", "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful ASSERT_*.
+TEST(SuccessfulAssertionTest, ASSERT) {
+  ASSERT_TRUE(true);
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful ASSERT_STR*.
+TEST(SuccessfulAssertionTest, ASSERT_STR) {
+  ASSERT_STREQ("", "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+}  // namespace testing
+
+namespace {
+
+// Tests the message streaming variation of assertions.
+
+TEST(AssertionWithMessageTest, EXPECT) {
+  EXPECT_EQ(1, 1) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(1, 1) << "Expected failure #1.",
+                          "Expected failure #1");
+  EXPECT_LE(1, 2) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(1, 0) << "Expected failure #2.",
+                          "Expected failure #2.");
+  EXPECT_GE(1, 0) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(1, 2) << "Expected failure #3.",
+                          "Expected failure #3.");
+
+  EXPECT_STREQ("1", "1") << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("1", "1") << "Expected failure #4.",
+                          "Expected failure #4.");
+  EXPECT_STRCASEEQ("a", "A") << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("a", "A") << "Expected failure #5.",
+                          "Expected failure #5.");
+
+  EXPECT_FLOAT_EQ(1, 1) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1, 1.2) << "Expected failure #6.",
+                          "Expected failure #6.");
+  EXPECT_NEAR(1, 1.1, 0.2) << "This should succeed.";
+}
+
+TEST(AssertionWithMessageTest, ASSERT) {
+  ASSERT_EQ(1, 1) << "This should succeed.";
+  ASSERT_NE(1, 2) << "This should succeed.";
+  ASSERT_LE(1, 2) << "This should succeed.";
+  ASSERT_LT(1, 2) << "This should succeed.";
+  ASSERT_GE(1, 0) << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_GT(1, 2) << "Expected failure.",
+                       "Expected failure.");
+}
+
+TEST(AssertionWithMessageTest, ASSERT_STR) {
+  ASSERT_STREQ("1", "1") << "This should succeed.";
+  ASSERT_STRNE("1", "2") << "This should succeed.";
+  ASSERT_STRCASEEQ("a", "A") << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("a", "A") << "Expected failure.",
+                       "Expected failure.");
+}
+
+TEST(AssertionWithMessageTest, ASSERT_FLOATING) {
+  ASSERT_FLOAT_EQ(1, 1) << "This should succeed.";
+  ASSERT_DOUBLE_EQ(1, 1) << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1,1.2, 0.1) << "Expect failure.",  // NOLINT
+                       "Expect failure.");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests using ASSERT_FALSE with a streamed message.
+TEST(AssertionWithMessageTest, ASSERT_FALSE) {
+  ASSERT_FALSE(false) << "This shouldn't fail.";
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_FALSE(true) << "Expected failure: " << 2 << " > " << 1
+                       << " evaluates to " << true;
+  }, "Expected failure");
+}
+
+// Tests using FAIL with a streamed message.
+TEST(AssertionWithMessageTest, FAIL) {
+  EXPECT_FATAL_FAILURE(FAIL() << 0,
+                       "0");
+}
+
+// Tests using SUCCEED with a streamed message.
+TEST(AssertionWithMessageTest, SUCCEED) {
+  SUCCEED() << "Success == " << 1;
+}
+
+// Tests using ASSERT_TRUE with a streamed message.
+TEST(AssertionWithMessageTest, ASSERT_TRUE) {
+  ASSERT_TRUE(true) << "This should succeed.";
+  ASSERT_TRUE(true) << true;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_TRUE(false) << static_cast<const char *>(NULL)
+                       << static_cast<char *>(NULL);
+  }, "(null)(null)");
+}
+
+#if GTEST_OS_WINDOWS
+// Tests using wide strings in assertion messages.
+TEST(AssertionWithMessageTest, WideStringMessage) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_TRUE(false) << L"This failure is expected.\x8119";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(1, 2) << "This failure is "
+                    << L"expected too.\x8120";
+  }, "This failure is expected too.");
+}
+#endif  // GTEST_OS_WINDOWS
+
+// Tests EXPECT_TRUE.
+TEST(ExpectTest, EXPECT_TRUE) {
+  EXPECT_TRUE(true) << "Intentional success";
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #1.",
+                          "Intentional failure #1.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #2.",
+                          "Intentional failure #2.");
+  EXPECT_TRUE(2 > 1);  // NOLINT
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1),
+                          "Value of: 2 < 1\n"
+                          "  Actual: false\n"
+                          "Expected: true");
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3),
+                          "2 > 3");
+}
+
+// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult.
+TEST(ExpectTest, ExpectTrueWithAssertionResult) {
+  EXPECT_TRUE(ResultIsEven(2));
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)),
+                          "Value of: ResultIsEven(3)\n"
+                          "  Actual: false (3 is odd)\n"
+                          "Expected: true");
+  EXPECT_TRUE(ResultIsEvenNoExplanation(2));
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)),
+                          "Value of: ResultIsEvenNoExplanation(3)\n"
+                          "  Actual: false (3 is odd)\n"
+                          "Expected: true");
+}
+
+// Tests EXPECT_FALSE with a streamed message.
+TEST(ExpectTest, EXPECT_FALSE) {
+  EXPECT_FALSE(2 < 1);  // NOLINT
+  EXPECT_FALSE(false) << "Intentional success";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #1.",
+                          "Intentional failure #1.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #2.",
+                          "Intentional failure #2.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1),
+                          "Value of: 2 > 1\n"
+                          "  Actual: true\n"
+                          "Expected: false");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3),
+                          "2 < 3");
+}
+
+// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult.
+TEST(ExpectTest, ExpectFalseWithAssertionResult) {
+  EXPECT_FALSE(ResultIsEven(3));
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)),
+                          "Value of: ResultIsEven(2)\n"
+                          "  Actual: true (2 is even)\n"
+                          "Expected: false");
+  EXPECT_FALSE(ResultIsEvenNoExplanation(3));
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)),
+                          "Value of: ResultIsEvenNoExplanation(2)\n"
+                          "  Actual: true\n"
+                          "Expected: false");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+// Tests EXPECT_EQ.
+TEST(ExpectTest, EXPECT_EQ) {
+  EXPECT_EQ(5, 2 + 3);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3),
+                          "Value of: 2*3\n"
+                          "  Actual: 6\n"
+                          "Expected: 5");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3),
+                          "2 - 3");
+}
+
+// Tests using EXPECT_EQ on double values.  The purpose is to make
+// sure that the specialization we did for integer and anonymous enums
+// isn't used for double arguments.
+TEST(ExpectTest, EXPECT_EQ_Double) {
+  // A success.
+  EXPECT_EQ(5.6, 5.6);
+
+  // A failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2),
+                          "5.1");
+}
+
+#if GTEST_CAN_COMPARE_NULL
+// Tests EXPECT_EQ(NULL, pointer).
+TEST(ExpectTest, EXPECT_EQ_NULL) {
+  // A success.
+  const char* p = NULL;
+  // Some older GCC versions may issue a spurious warning in this or the next
+  // assertion statement. This warning should not be suppressed with
+  // static_cast since the test verifies the ability to use bare NULL as the
+  // expected parameter to the macro.
+  EXPECT_EQ(NULL, p);
+
+  // A failure.
+  int n = 0;
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n),
+                          "Value of: &n\n");
+}
+#endif  // GTEST_CAN_COMPARE_NULL
+
+// Tests EXPECT_EQ(0, non_pointer).  Since the literal 0 can be
+// treated as a null pointer by the compiler, we need to make sure
+// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as
+// EXPECT_EQ(static_cast<void*>(NULL), non_pointer).
+TEST(ExpectTest, EXPECT_EQ_0) {
+  int n = 0;
+
+  // A success.
+  EXPECT_EQ(0, n);
+
+  // A failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6),
+                          "Expected: 0");
+}
+
+// Tests EXPECT_NE.
+TEST(ExpectTest, EXPECT_NE) {
+  EXPECT_NE(6, 7);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'),
+                          "Expected: ('a') != ('a'), "
+                          "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2),
+                          "2");
+  char* const p0 = NULL;
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0),
+                          "p0");
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  char* const p1 = reinterpret_cast<char*>(pv1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1),
+                          "p1");
+}
+
+// Tests EXPECT_LE.
+TEST(ExpectTest, EXPECT_LE) {
+  EXPECT_LE(2, 3);
+  EXPECT_LE(2, 2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0),
+                          "Expected: (2) <= (0), actual: 2 vs 0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9),
+                          "(1.1) <= (0.9)");
+}
+
+// Tests EXPECT_LT.
+TEST(ExpectTest, EXPECT_LT) {
+  EXPECT_LT(2, 3);
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2),
+                          "Expected: (2) < (2), actual: 2 vs 2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1),
+                          "(2) < (1)");
+}
+
+// Tests EXPECT_GE.
+TEST(ExpectTest, EXPECT_GE) {
+  EXPECT_GE(2, 1);
+  EXPECT_GE(2, 2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3),
+                          "Expected: (2) >= (3), actual: 2 vs 3");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1),
+                          "(0.9) >= (1.1)");
+}
+
+// Tests EXPECT_GT.
+TEST(ExpectTest, EXPECT_GT) {
+  EXPECT_GT(2, 1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2),
+                          "Expected: (2) > (2), actual: 2 vs 2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3),
+                          "(2) > (3)");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests EXPECT_THROW.
+TEST(ExpectTest, EXPECT_THROW) {
+  EXPECT_THROW(ThrowAnInteger(), int);
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool),
+                          "Expected: ThrowAnInteger() throws an exception of "
+                          "type bool.\n  Actual: it throws a different type.");
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_THROW(ThrowNothing(), bool),
+      "Expected: ThrowNothing() throws an exception of type bool.\n"
+      "  Actual: it throws nothing.");
+}
+
+// Tests EXPECT_NO_THROW.
+TEST(ExpectTest, EXPECT_NO_THROW) {
+  EXPECT_NO_THROW(ThrowNothing());
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()),
+                          "Expected: ThrowAnInteger() doesn't throw an "
+                          "exception.\n  Actual: it throws.");
+}
+
+// Tests EXPECT_ANY_THROW.
+TEST(ExpectTest, EXPECT_ANY_THROW) {
+  EXPECT_ANY_THROW(ThrowAnInteger());
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_ANY_THROW(ThrowNothing()),
+      "Expected: ThrowNothing() throws an exception.\n"
+      "  Actual: it doesn't.");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Make sure we deal with the precedence of <<.
+TEST(ExpectTest, ExpectPrecedence) {
+  EXPECT_EQ(1 < 2, true);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false),
+                          "Value of: true && false");
+}
+
+
+// Tests the StreamableToString() function.
+
+// Tests using StreamableToString() on a scalar.
+TEST(StreamableToStringTest, Scalar) {
+  EXPECT_STREQ("5", StreamableToString(5).c_str());
+}
+
+// Tests using StreamableToString() on a non-char pointer.
+TEST(StreamableToStringTest, Pointer) {
+  int n = 0;
+  int* p = &n;
+  EXPECT_STRNE("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using StreamableToString() on a NULL non-char pointer.
+TEST(StreamableToStringTest, NullPointer) {
+  int* p = NULL;
+  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using StreamableToString() on a C string.
+TEST(StreamableToStringTest, CString) {
+  EXPECT_STREQ("Foo", StreamableToString("Foo").c_str());
+}
+
+// Tests using StreamableToString() on a NULL C string.
+TEST(StreamableToStringTest, NullCString) {
+  char* p = NULL;
+  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using streamable values as assertion messages.
+
+// Tests using std::string as an assertion message.
+TEST(StreamableTest, string) {
+  static const std::string str(
+      "This failure message is a std::string, and is expected.");
+  EXPECT_FATAL_FAILURE(FAIL() << str,
+                       str.c_str());
+}
+
+// Tests that we can output strings containing embedded NULs.
+// Limited to Linux because we can only do this with std::string's.
+TEST(StreamableTest, stringWithEmbeddedNUL) {
+  static const char char_array_with_nul[] =
+      "Here's a NUL\0 and some more string";
+  static const std::string string_with_nul(char_array_with_nul,
+                                           sizeof(char_array_with_nul)
+                                           - 1);  // drops the trailing NUL
+  EXPECT_FATAL_FAILURE(FAIL() << string_with_nul,
+                       "Here's a NUL\\0 and some more string");
+}
+
+// Tests that we can output a NUL char.
+TEST(StreamableTest, NULChar) {
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    FAIL() << "A NUL" << '\0' << " and some more string";
+  }, "A NUL\\0 and some more string");
+}
+
+// Tests using int as an assertion message.
+TEST(StreamableTest, int) {
+  EXPECT_FATAL_FAILURE(FAIL() << 900913,
+                       "900913");
+}
+
+// Tests using NULL char pointer as an assertion message.
+//
+// In MSVC, streaming a NULL char * causes access violation.  Google Test
+// implemented a workaround (substituting "(null)" for NULL).  This
+// tests whether the workaround works.
+TEST(StreamableTest, NullCharPtr) {
+  EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL),
+                       "(null)");
+}
+
+// Tests that basic IO manipulators (endl, ends, and flush) can be
+// streamed to testing::Message.
+TEST(StreamableTest, BasicIoManip) {
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    FAIL() << "Line 1." << std::endl
+           << "A NUL char " << std::ends << std::flush << " in line 2.";
+  }, "Line 1.\nA NUL char \\0 in line 2.");
+}
+
+// Tests the macros that haven't been covered so far.
+
+void AddFailureHelper(bool* aborted) {
+  *aborted = true;
+  ADD_FAILURE() << "Intentional failure.";
+  *aborted = false;
+}
+
+// Tests ADD_FAILURE.
+TEST(MacroTest, ADD_FAILURE) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted),
+                          "Intentional failure.");
+  EXPECT_FALSE(aborted);
+}
+
+// Tests ADD_FAILURE_AT.
+TEST(MacroTest, ADD_FAILURE_AT) {
+  // Verifies that ADD_FAILURE_AT does generate a nonfatal failure and
+  // the failure message contains the user-streamed part.
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42) << "Wrong!", "Wrong!");
+
+  // Verifies that the user-streamed part is optional.
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42), "Failed");
+
+  // Unfortunately, we cannot verify that the failure message contains
+  // the right file path and line number the same way, as
+  // EXPECT_NONFATAL_FAILURE() doesn't get to see the file path and
+  // line number.  Instead, we do that in gtest_output_test_.cc.
+}
+
+// Tests FAIL.
+TEST(MacroTest, FAIL) {
+  EXPECT_FATAL_FAILURE(FAIL(),
+                       "Failed");
+  EXPECT_FATAL_FAILURE(FAIL() << "Intentional failure.",
+                       "Intentional failure.");
+}
+
+// Tests SUCCEED
+TEST(MacroTest, SUCCEED) {
+  SUCCEED();
+  SUCCEED() << "Explicit success.";
+}
+
+// Tests for EXPECT_EQ() and ASSERT_EQ().
+//
+// These tests fail *intentionally*, s.t. the failure messages can be
+// generated and tested.
+//
+// We have different tests for different argument types.
+
+// Tests using bool values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Bool) {
+  EXPECT_EQ(true,  true);
+  EXPECT_FATAL_FAILURE({
+      bool false_value = false;
+      ASSERT_EQ(false_value, true);
+    }, "Value of: true");
+}
+
+// Tests using int values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Int) {
+  ASSERT_EQ(32, 32);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33),
+                          "33");
+}
+
+// Tests using time_t values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Time_T) {
+  EXPECT_EQ(static_cast<time_t>(0),
+            static_cast<time_t>(0));
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0),
+                                 static_cast<time_t>(1234)),
+                       "1234");
+}
+
+// Tests using char values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Char) {
+  ASSERT_EQ('z', 'z');
+  const char ch = 'b';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\0', ch),
+                          "ch");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch),
+                          "ch");
+}
+
+// Tests using wchar_t values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, WideChar) {
+  EXPECT_EQ(L'b', L'b');
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\0', L'x'),
+                          "Value of: L'x'\n"
+                          "  Actual: L'x' (120, 0x78)\n"
+                          "Expected: L'\0'\n"
+                          "Which is: L'\0' (0, 0x0)");
+
+  static wchar_t wchar;
+  wchar = L'b';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar),
+                          "wchar");
+  wchar = 0x8119;
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<wchar_t>(0x8120), wchar),
+                       "Value of: wchar");
+}
+
+// Tests using ::std::string values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, StdString) {
+  // Compares a const char* to an std::string that has identical
+  // content.
+  ASSERT_EQ("Test", ::std::string("Test"));
+
+  // Compares two identical std::strings.
+  static const ::std::string str1("A * in the middle");
+  static const ::std::string str2(str1);
+  EXPECT_EQ(str1, str2);
+
+  // Compares a const char* to an std::string that has different
+  // content
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ("Test", ::std::string("test")),
+                          "\"test\"");
+
+  // Compares an std::string to a char* that has different content.
+  char* const p1 = const_cast<char*>("foo");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string("bar"), p1),
+                          "p1");
+
+  // Compares two std::strings that have different contents, one of
+  // which having a NUL character in the middle.  This should fail.
+  static ::std::string str3(str1);
+  str3.at(2) = '\0';
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3),
+                       "Value of: str3\n"
+                       "  Actual: \"A \\0 in the middle\"");
+}
+
+#if GTEST_HAS_STD_WSTRING
+
+// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, StdWideString) {
+  // Compares two identical std::wstrings.
+  const ::std::wstring wstr1(L"A * in the middle");
+  const ::std::wstring wstr2(wstr1);
+  ASSERT_EQ(wstr1, wstr2);
+
+  // Compares an std::wstring to a const wchar_t* that has identical
+  // content.
+  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
+  EXPECT_EQ(::std::wstring(kTestX8119), kTestX8119);
+
+  // Compares an std::wstring to a const wchar_t* that has different
+  // content.
+  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EQ(::std::wstring(kTestX8119), kTestX8120);
+  }, "kTestX8120");
+
+  // Compares two std::wstrings that have different contents, one of
+  // which having a NUL character in the middle.
+  ::std::wstring wstr3(wstr1);
+  wstr3.at(2) = L'\0';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3),
+                          "wstr3");
+
+  // Compares a wchar_t* to an std::wstring that has different
+  // content.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(const_cast<wchar_t*>(L"foo"), ::std::wstring(L"bar"));
+  }, "");
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_STRING
+// Tests using ::string values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, GlobalString) {
+  // Compares a const char* to a ::string that has identical content.
+  EXPECT_EQ("Test", ::string("Test"));
+
+  // Compares two identical ::strings.
+  const ::string str1("A * in the middle");
+  const ::string str2(str1);
+  ASSERT_EQ(str1, str2);
+
+  // Compares a ::string to a const char* that has different content.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string("Test"), "test"),
+                          "test");
+
+  // Compares two ::strings that have different contents, one of which
+  // having a NUL character in the middle.
+  ::string str3(str1);
+  str3.at(2) = '\0';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3),
+                          "str3");
+
+  // Compares a ::string to a char* that has different content.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(::string("bar"), const_cast<char*>("foo"));
+  }, "");
+}
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+
+// Tests using ::wstring values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, GlobalWideString) {
+  // Compares two identical ::wstrings.
+  static const ::wstring wstr1(L"A * in the middle");
+  static const ::wstring wstr2(wstr1);
+  EXPECT_EQ(wstr1, wstr2);
+
+  // Compares a const wchar_t* to a ::wstring that has identical content.
+  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
+  ASSERT_EQ(kTestX8119, ::wstring(kTestX8119));
+
+  // Compares a const wchar_t* to a ::wstring that has different
+  // content.
+  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EQ(kTestX8120, ::wstring(kTestX8119));
+  }, "Test\\x8119");
+
+  // Compares a wchar_t* to a ::wstring that has different content.
+  wchar_t* const p1 = const_cast<wchar_t*>(L"foo");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L"bar")),
+                          "bar");
+
+  // Compares two ::wstrings that have different contents, one of which
+  // having a NUL character in the middle.
+  static ::wstring wstr3;
+  wstr3 = wstr1;
+  wstr3.at(2) = L'\0';
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3),
+                       "wstr3");
+}
+
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Tests using char pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, CharPointer) {
+  char* const p0 = NULL;
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  void* pv2 = (void*)0xABC0;  // NOLINT
+  char* const p1 = reinterpret_cast<char*>(pv1);
+  char* const p2 = reinterpret_cast<char*>(pv2);
+  ASSERT_EQ(p1, p1);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
+                          "Value of: p2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
+                          "p2");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234),
+                                 reinterpret_cast<char*>(0xABC0)),
+                       "ABC0");
+}
+
+// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, WideCharPointer) {
+  wchar_t* const p0 = NULL;
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  void* pv2 = (void*)0xABC0;  // NOLINT
+  wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1);
+  wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2);
+  EXPECT_EQ(p0, p0);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
+                          "Value of: p2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
+                          "p2");
+  void* pv3 = (void*)0x1234;  // NOLINT
+  void* pv4 = (void*)0xABC0;  // NOLINT
+  const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3);
+  const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4),
+                          "p4");
+}
+
+// Tests using other types of pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, OtherPointer) {
+  ASSERT_EQ(static_cast<const int*>(NULL),
+            static_cast<const int*>(NULL));
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL),
+                                 reinterpret_cast<const int*>(0x1234)),
+                       "0x1234");
+}
+
+// A class that supports binary comparison operators but not streaming.
+class UnprintableChar {
+ public:
+  explicit UnprintableChar(char ch) : char_(ch) {}
+
+  bool operator==(const UnprintableChar& rhs) const {
+    return char_ == rhs.char_;
+  }
+  bool operator!=(const UnprintableChar& rhs) const {
+    return char_ != rhs.char_;
+  }
+  bool operator<(const UnprintableChar& rhs) const {
+    return char_ < rhs.char_;
+  }
+  bool operator<=(const UnprintableChar& rhs) const {
+    return char_ <= rhs.char_;
+  }
+  bool operator>(const UnprintableChar& rhs) const {
+    return char_ > rhs.char_;
+  }
+  bool operator>=(const UnprintableChar& rhs) const {
+    return char_ >= rhs.char_;
+  }
+
+ private:
+  char char_;
+};
+
+// Tests that ASSERT_EQ() and friends don't require the arguments to
+// be printable.
+TEST(ComparisonAssertionTest, AcceptsUnprintableArgs) {
+  const UnprintableChar x('x'), y('y');
+  ASSERT_EQ(x, x);
+  EXPECT_NE(x, y);
+  ASSERT_LT(x, y);
+  EXPECT_LE(x, y);
+  ASSERT_GT(y, x);
+  EXPECT_GE(x, x);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <78>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <79>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(y, y), "1-byte object <79>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <78>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <79>");
+
+  // Code tested by EXPECT_FATAL_FAILURE cannot reference local
+  // variables, so we have to write UnprintableChar('x') instead of x.
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_NE(UnprintableChar('x'), UnprintableChar('x')),
+                       "1-byte object <78>");
+  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
+                       "1-byte object <78>");
+#endif
+  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
+                       "1-byte object <79>");
+  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
+                       "1-byte object <78>");
+  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
+                       "1-byte object <79>");
+}
+
+// Tests the FRIEND_TEST macro.
+
+// This class has a private member we want to test.  We will test it
+// both in a TEST and in a TEST_F.
+class Foo {
+ public:
+  Foo() {}
+
+ private:
+  int Bar() const { return 1; }
+
+  // Declares the friend tests that can access the private member
+  // Bar().
+  FRIEND_TEST(FRIEND_TEST_Test, TEST);
+  FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
+};
+
+// Tests that the FRIEND_TEST declaration allows a TEST to access a
+// class's private members.  This should compile.
+TEST(FRIEND_TEST_Test, TEST) {
+  ASSERT_EQ(1, Foo().Bar());
+}
+
+// The fixture needed to test using FRIEND_TEST with TEST_F.
+class FRIEND_TEST_Test2 : public Test {
+ protected:
+  Foo foo;
+};
+
+// Tests that the FRIEND_TEST declaration allows a TEST_F to access a
+// class's private members.  This should compile.
+TEST_F(FRIEND_TEST_Test2, TEST_F) {
+  ASSERT_EQ(1, foo.Bar());
+}
+
+// Tests the life cycle of Test objects.
+
+// The test fixture for testing the life cycle of Test objects.
+//
+// This class counts the number of live test objects that uses this
+// fixture.
+class TestLifeCycleTest : public Test {
+ protected:
+  // Constructor.  Increments the number of test objects that uses
+  // this fixture.
+  TestLifeCycleTest() { count_++; }
+
+  // Destructor.  Decrements the number of test objects that uses this
+  // fixture.
+  ~TestLifeCycleTest() { count_--; }
+
+  // Returns the number of live test objects that uses this fixture.
+  int count() const { return count_; }
+
+ private:
+  static int count_;
+};
+
+int TestLifeCycleTest::count_ = 0;
+
+// Tests the life cycle of test objects.
+TEST_F(TestLifeCycleTest, Test1) {
+  // There should be only one test object in this test case that's
+  // currently alive.
+  ASSERT_EQ(1, count());
+}
+
+// Tests the life cycle of test objects.
+TEST_F(TestLifeCycleTest, Test2) {
+  // After Test1 is done and Test2 is started, there should still be
+  // only one live test object, as the object for Test1 should've been
+  // deleted.
+  ASSERT_EQ(1, count());
+}
+
+}  // namespace
+
+// Tests that the copy constructor works when it is NOT optimized away by
+// the compiler.
+TEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) {
+  // Checks that the copy constructor doesn't try to dereference NULL pointers
+  // in the source object.
+  AssertionResult r1 = AssertionSuccess();
+  AssertionResult r2 = r1;
+  // The following line is added to prevent the compiler from optimizing
+  // away the constructor call.
+  r1 << "abc";
+
+  AssertionResult r3 = r1;
+  EXPECT_EQ(static_cast<bool>(r3), static_cast<bool>(r1));
+  EXPECT_STREQ("abc", r1.message());
+}
+
+// Tests that AssertionSuccess and AssertionFailure construct
+// AssertionResult objects as expected.
+TEST(AssertionResultTest, ConstructionWorks) {
+  AssertionResult r1 = AssertionSuccess();
+  EXPECT_TRUE(r1);
+  EXPECT_STREQ("", r1.message());
+
+  AssertionResult r2 = AssertionSuccess() << "abc";
+  EXPECT_TRUE(r2);
+  EXPECT_STREQ("abc", r2.message());
+
+  AssertionResult r3 = AssertionFailure();
+  EXPECT_FALSE(r3);
+  EXPECT_STREQ("", r3.message());
+
+  AssertionResult r4 = AssertionFailure() << "def";
+  EXPECT_FALSE(r4);
+  EXPECT_STREQ("def", r4.message());
+
+  AssertionResult r5 = AssertionFailure(Message() << "ghi");
+  EXPECT_FALSE(r5);
+  EXPECT_STREQ("ghi", r5.message());
+}
+
+// Tests that the negation flips the predicate result but keeps the message.
+TEST(AssertionResultTest, NegationWorks) {
+  AssertionResult r1 = AssertionSuccess() << "abc";
+  EXPECT_FALSE(!r1);
+  EXPECT_STREQ("abc", (!r1).message());
+
+  AssertionResult r2 = AssertionFailure() << "def";
+  EXPECT_TRUE(!r2);
+  EXPECT_STREQ("def", (!r2).message());
+}
+
+TEST(AssertionResultTest, StreamingWorks) {
+  AssertionResult r = AssertionSuccess();
+  r << "abc" << 'd' << 0 << true;
+  EXPECT_STREQ("abcd0true", r.message());
+}
+
+TEST(AssertionResultTest, CanStreamOstreamManipulators) {
+  AssertionResult r = AssertionSuccess();
+  r << "Data" << std::endl << std::flush << std::ends << "Will be visible";
+  EXPECT_STREQ("Data\n\\0Will be visible", r.message());
+}
+
+// Tests streaming a user type whose definition and operator << are
+// both in the global namespace.
+class Base {
+ public:
+  explicit Base(int an_x) : x_(an_x) {}
+  int x() const { return x_; }
+ private:
+  int x_;
+};
+std::ostream& operator<<(std::ostream& os,
+                         const Base& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const Base* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+
+TEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) {
+  Message msg;
+  Base a(1);
+
+  msg << a << &a;  // Uses ::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition and operator<< are
+// both in an unnamed namespace.
+namespace {
+class MyTypeInUnnamedNameSpace : public Base {
+ public:
+  explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {}
+};
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInUnnamedNameSpace& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInUnnamedNameSpace* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+}  // namespace
+
+TEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) {
+  Message msg;
+  MyTypeInUnnamedNameSpace a(1);
+
+  msg << a << &a;  // Uses <unnamed_namespace>::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition and operator<< are
+// both in a user namespace.
+namespace namespace1 {
+class MyTypeInNameSpace1 : public Base {
+ public:
+  explicit MyTypeInNameSpace1(int an_x): Base(an_x) {}
+};
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInNameSpace1& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInNameSpace1* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+}  // namespace namespace1
+
+TEST(MessageTest, CanStreamUserTypeInUserNameSpace) {
+  Message msg;
+  namespace1::MyTypeInNameSpace1 a(1);
+
+  msg << a << &a;  // Uses namespace1::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition is in a user namespace
+// but whose operator<< is in the global namespace.
+namespace namespace2 {
+class MyTypeInNameSpace2 : public ::Base {
+ public:
+  explicit MyTypeInNameSpace2(int an_x): Base(an_x) {}
+};
+}  // namespace namespace2
+std::ostream& operator<<(std::ostream& os,
+                         const namespace2::MyTypeInNameSpace2& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const namespace2::MyTypeInNameSpace2* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+
+TEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) {
+  Message msg;
+  namespace2::MyTypeInNameSpace2 a(1);
+
+  msg << a << &a;  // Uses ::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming NULL pointers to testing::Message.
+TEST(MessageTest, NullPointers) {
+  Message msg;
+  char* const p1 = NULL;
+  unsigned char* const p2 = NULL;
+  int* p3 = NULL;
+  double* p4 = NULL;
+  bool* p5 = NULL;
+  Message* p6 = NULL;
+
+  msg << p1 << p2 << p3 << p4 << p5 << p6;
+  ASSERT_STREQ("(null)(null)(null)(null)(null)(null)",
+               msg.GetString().c_str());
+}
+
+// Tests streaming wide strings to testing::Message.
+TEST(MessageTest, WideStrings) {
+  // Streams a NULL of type const wchar_t*.
+  const wchar_t* const_wstr = NULL;
+  EXPECT_STREQ("(null)",
+               (Message() << const_wstr).GetString().c_str());
+
+  // Streams a NULL of type wchar_t*.
+  wchar_t* wstr = NULL;
+  EXPECT_STREQ("(null)",
+               (Message() << wstr).GetString().c_str());
+
+  // Streams a non-NULL of type const wchar_t*.
+  const_wstr = L"abc\x8119";
+  EXPECT_STREQ("abc\xe8\x84\x99",
+               (Message() << const_wstr).GetString().c_str());
+
+  // Streams a non-NULL of type wchar_t*.
+  wstr = const_cast<wchar_t*>(const_wstr);
+  EXPECT_STREQ("abc\xe8\x84\x99",
+               (Message() << wstr).GetString().c_str());
+}
+
+
+// This line tests that we can define tests in the testing namespace.
+namespace testing {
+
+// Tests the TestInfo class.
+
+class TestInfoTest : public Test {
+ protected:
+  static const TestInfo* GetTestInfo(const char* test_name) {
+    const TestCase* const test_case = GetUnitTestImpl()->
+        GetTestCase("TestInfoTest", "", NULL, NULL);
+
+    for (int i = 0; i < test_case->total_test_count(); ++i) {
+      const TestInfo* const test_info = test_case->GetTestInfo(i);
+      if (strcmp(test_name, test_info->name()) == 0)
+        return test_info;
+    }
+    return NULL;
+  }
+
+  static const TestResult* GetTestResult(
+      const TestInfo* test_info) {
+    return test_info->result();
+  }
+};
+
+// Tests TestInfo::test_case_name() and TestInfo::name().
+TEST_F(TestInfoTest, Names) {
+  const TestInfo* const test_info = GetTestInfo("Names");
+
+  ASSERT_STREQ("TestInfoTest", test_info->test_case_name());
+  ASSERT_STREQ("Names", test_info->name());
+}
+
+// Tests TestInfo::result().
+TEST_F(TestInfoTest, result) {
+  const TestInfo* const test_info = GetTestInfo("result");
+
+  // Initially, there is no TestPartResult for this test.
+  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
+
+  // After the previous assertion, there is still none.
+  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
+}
+
+// Tests setting up and tearing down a test case.
+
+class SetUpTestCaseTest : public Test {
+ protected:
+  // This will be called once before the first test in this test case
+  // is run.
+  static void SetUpTestCase() {
+    printf("Setting up the test case . . .\n");
+
+    // Initializes some shared resource.  In this simple example, we
+    // just create a C string.  More complex stuff can be done if
+    // desired.
+    shared_resource_ = "123";
+
+    // Increments the number of test cases that have been set up.
+    counter_++;
+
+    // SetUpTestCase() should be called only once.
+    EXPECT_EQ(1, counter_);
+  }
+
+  // This will be called once after the last test in this test case is
+  // run.
+  static void TearDownTestCase() {
+    printf("Tearing down the test case . . .\n");
+
+    // Decrements the number of test cases that have been set up.
+    counter_--;
+
+    // TearDownTestCase() should be called only once.
+    EXPECT_EQ(0, counter_);
+
+    // Cleans up the shared resource.
+    shared_resource_ = NULL;
+  }
+
+  // This will be called before each test in this test case.
+  virtual void SetUp() {
+    // SetUpTestCase() should be called only once, so counter_ should
+    // always be 1.
+    EXPECT_EQ(1, counter_);
+  }
+
+  // Number of test cases that have been set up.
+  static int counter_;
+
+  // Some resource to be shared by all tests in this test case.
+  static const char* shared_resource_;
+};
+
+int SetUpTestCaseTest::counter_ = 0;
+const char* SetUpTestCaseTest::shared_resource_ = NULL;
+
+// A test that uses the shared resource.
+TEST_F(SetUpTestCaseTest, Test1) {
+  EXPECT_STRNE(NULL, shared_resource_);
+}
+
+// Another test that uses the shared resource.
+TEST_F(SetUpTestCaseTest, Test2) {
+  EXPECT_STREQ("123", shared_resource_);
+}
+
+// The InitGoogleTestTest test case tests testing::InitGoogleTest().
+
+// The Flags struct stores a copy of all Google Test flags.
+struct Flags {
+  // Constructs a Flags struct where each flag has its default value.
+  Flags() : also_run_disabled_tests(false),
+            break_on_failure(false),
+            catch_exceptions(false),
+            death_test_use_fork(false),
+            filter(""),
+            list_tests(false),
+            output(""),
+            print_time(true),
+            random_seed(0),
+            repeat(1),
+            shuffle(false),
+            stack_trace_depth(kMaxStackTraceDepth),
+            stream_result_to(""),
+            throw_on_failure(false) {}
+
+  // Factory methods.
+
+  // Creates a Flags struct where the gtest_also_run_disabled_tests flag has
+  // the given value.
+  static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) {
+    Flags flags;
+    flags.also_run_disabled_tests = also_run_disabled_tests;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_break_on_failure flag has
+  // the given value.
+  static Flags BreakOnFailure(bool break_on_failure) {
+    Flags flags;
+    flags.break_on_failure = break_on_failure;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_catch_exceptions flag has
+  // the given value.
+  static Flags CatchExceptions(bool catch_exceptions) {
+    Flags flags;
+    flags.catch_exceptions = catch_exceptions;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_death_test_use_fork flag has
+  // the given value.
+  static Flags DeathTestUseFork(bool death_test_use_fork) {
+    Flags flags;
+    flags.death_test_use_fork = death_test_use_fork;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_filter flag has the given
+  // value.
+  static Flags Filter(const char* filter) {
+    Flags flags;
+    flags.filter = filter;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_list_tests flag has the
+  // given value.
+  static Flags ListTests(bool list_tests) {
+    Flags flags;
+    flags.list_tests = list_tests;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_output flag has the given
+  // value.
+  static Flags Output(const char* output) {
+    Flags flags;
+    flags.output = output;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_print_time flag has the given
+  // value.
+  static Flags PrintTime(bool print_time) {
+    Flags flags;
+    flags.print_time = print_time;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_random_seed flag has
+  // the given value.
+  static Flags RandomSeed(Int32 random_seed) {
+    Flags flags;
+    flags.random_seed = random_seed;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_repeat flag has the given
+  // value.
+  static Flags Repeat(Int32 repeat) {
+    Flags flags;
+    flags.repeat = repeat;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_shuffle flag has
+  // the given value.
+  static Flags Shuffle(bool shuffle) {
+    Flags flags;
+    flags.shuffle = shuffle;
+    return flags;
+  }
+
+  // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has
+  // the given value.
+  static Flags StackTraceDepth(Int32 stack_trace_depth) {
+    Flags flags;
+    flags.stack_trace_depth = stack_trace_depth;
+    return flags;
+  }
+
+  // Creates a Flags struct where the GTEST_FLAG(stream_result_to) flag has
+  // the given value.
+  static Flags StreamResultTo(const char* stream_result_to) {
+    Flags flags;
+    flags.stream_result_to = stream_result_to;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_throw_on_failure flag has
+  // the given value.
+  static Flags ThrowOnFailure(bool throw_on_failure) {
+    Flags flags;
+    flags.throw_on_failure = throw_on_failure;
+    return flags;
+  }
+
+  // These fields store the flag values.
+  bool also_run_disabled_tests;
+  bool break_on_failure;
+  bool catch_exceptions;
+  bool death_test_use_fork;
+  const char* filter;
+  bool list_tests;
+  const char* output;
+  bool print_time;
+  Int32 random_seed;
+  Int32 repeat;
+  bool shuffle;
+  Int32 stack_trace_depth;
+  const char* stream_result_to;
+  bool throw_on_failure;
+};
+
+// Fixture for testing InitGoogleTest().
+class InitGoogleTestTest : public Test {
+ protected:
+  // Clears the flags before each test.
+  virtual void SetUp() {
+    GTEST_FLAG(also_run_disabled_tests) = false;
+    GTEST_FLAG(break_on_failure) = false;
+    GTEST_FLAG(catch_exceptions) = false;
+    GTEST_FLAG(death_test_use_fork) = false;
+    GTEST_FLAG(filter) = "";
+    GTEST_FLAG(list_tests) = false;
+    GTEST_FLAG(output) = "";
+    GTEST_FLAG(print_time) = true;
+    GTEST_FLAG(random_seed) = 0;
+    GTEST_FLAG(repeat) = 1;
+    GTEST_FLAG(shuffle) = false;
+    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
+    GTEST_FLAG(stream_result_to) = "";
+    GTEST_FLAG(throw_on_failure) = false;
+  }
+
+  // Asserts that two narrow or wide string arrays are equal.
+  template <typename CharType>
+  static void AssertStringArrayEq(size_t size1, CharType** array1,
+                                  size_t size2, CharType** array2) {
+    ASSERT_EQ(size1, size2) << " Array sizes different.";
+
+    for (size_t i = 0; i != size1; i++) {
+      ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i;
+    }
+  }
+
+  // Verifies that the flag values match the expected values.
+  static void CheckFlags(const Flags& expected) {
+    EXPECT_EQ(expected.also_run_disabled_tests,
+              GTEST_FLAG(also_run_disabled_tests));
+    EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure));
+    EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions));
+    EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork));
+    EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str());
+    EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));
+    EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());
+    EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));
+    EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed));
+    EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));
+    EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle));
+    EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth));
+    EXPECT_STREQ(expected.stream_result_to,
+                 GTEST_FLAG(stream_result_to).c_str());
+    EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));
+  }
+
+  // Parses a command line (specified by argc1 and argv1), then
+  // verifies that the flag values are expected and that the
+  // recognized flags are removed from the command line.
+  template <typename CharType>
+  static void TestParsingFlags(int argc1, const CharType** argv1,
+                               int argc2, const CharType** argv2,
+                               const Flags& expected, bool should_print_help) {
+    const bool saved_help_flag = ::testing::internal::g_help_flag;
+    ::testing::internal::g_help_flag = false;
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    CaptureStdout();
+#endif
+
+    // Parses the command line.
+    internal::ParseGoogleTestFlagsOnly(&argc1, const_cast<CharType**>(argv1));
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    const std::string captured_stdout = GetCapturedStdout();
+#endif
+
+    // Verifies the flag values.
+    CheckFlags(expected);
+
+    // Verifies that the recognized flags are removed from the command
+    // line.
+    AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2);
+
+    // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the
+    // help message for the flags it recognizes.
+    EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag);
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    const char* const expected_help_fragment =
+        "This program contains tests written using";
+    if (should_print_help) {
+      EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout);
+    } else {
+      EXPECT_PRED_FORMAT2(IsNotSubstring,
+                          expected_help_fragment, captured_stdout);
+    }
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+    ::testing::internal::g_help_flag = saved_help_flag;
+  }
+
+  // This macro wraps TestParsingFlags s.t. the user doesn't need
+  // to specify the array sizes.
+
+#define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \
+  TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \
+                   sizeof(argv2)/sizeof(*argv2) - 1, argv2, \
+                   expected, should_print_help)
+};
+
+// Tests parsing an empty command line.
+TEST_F(InitGoogleTestTest, Empty) {
+  const char* argv[] = {
+    NULL
+  };
+
+  const char* argv2[] = {
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
+}
+
+// Tests parsing a command line that has no flag.
+TEST_F(InitGoogleTestTest, NoFlag) {
+  const char* argv[] = {
+    "foo.exe",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
+}
+
+// Tests parsing a bad --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterBad) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "--gtest_filter",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), true);
+}
+
+// Tests parsing an empty --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), false);
+}
+
+// Tests parsing a non-empty --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterNonEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=abc",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("abc"), false);
+}
+
+// Tests parsing --gtest_break_on_failure.
+TEST_F(InitGoogleTestTest, BreakOnFailureWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
+}
+
+// Tests parsing --gtest_break_on_failure=0.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing --gtest_break_on_failure=f.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing --gtest_break_on_failure=F.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing a --gtest_break_on_failure flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, BreakOnFailureTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
+}
+
+// Tests parsing --gtest_catch_exceptions.
+TEST_F(InitGoogleTestTest, CatchExceptions) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_catch_exceptions",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false);
+}
+
+// Tests parsing --gtest_death_test_use_fork.
+TEST_F(InitGoogleTestTest, DeathTestUseFork) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_death_test_use_fork",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false);
+}
+
+// Tests having the same flag twice with different values.  The
+// expected behavior is that the one coming last takes precedence.
+TEST_F(InitGoogleTestTest, DuplicatedFlags) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=a",
+    "--gtest_filter=b",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("b"), false);
+}
+
+// Tests having an unrecognized flag on the command line.
+TEST_F(InitGoogleTestTest, UnrecognizedFlag) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure",
+    "bar",  // Unrecognized by Google Test.
+    "--gtest_filter=b",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "bar",
+    NULL
+  };
+
+  Flags flags;
+  flags.break_on_failure = true;
+  flags.filter = "b";
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false);
+}
+
+// Tests having a --gtest_list_tests flag
+TEST_F(InitGoogleTestTest, ListTestsFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
+}
+
+// Tests having a --gtest_list_tests flag with a "true" value
+TEST_F(InitGoogleTestTest, ListTestsTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
+}
+
+// Tests having a --gtest_list_tests flag with a "false" value
+TEST_F(InitGoogleTestTest, ListTestsFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_list_tests=f.
+TEST_F(InitGoogleTestTest, ListTestsFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_list_tests=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_list_tests=F.
+TEST_F(InitGoogleTestTest, ListTestsFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_list_tests=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_output (invalid).
+TEST_F(InitGoogleTestTest, OutputEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "--gtest_output",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true);
+}
+
+// Tests parsing --gtest_output=xml
+TEST_F(InitGoogleTestTest, OutputXml) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml"), false);
+}
+
+// Tests parsing --gtest_output=xml:file
+TEST_F(InitGoogleTestTest, OutputXmlFile) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml:file",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml:file"), false);
+}
+
+// Tests parsing --gtest_output=xml:directory/path/
+TEST_F(InitGoogleTestTest, OutputXmlDirectory) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml:directory/path/",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                            Flags::Output("xml:directory/path/"), false);
+}
+
+// Tests having a --gtest_print_time flag
+TEST_F(InitGoogleTestTest, PrintTimeFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
+}
+
+// Tests having a --gtest_print_time flag with a "true" value
+TEST_F(InitGoogleTestTest, PrintTimeTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
+}
+
+// Tests having a --gtest_print_time flag with a "false" value
+TEST_F(InitGoogleTestTest, PrintTimeFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_print_time=f.
+TEST_F(InitGoogleTestTest, PrintTimeFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_print_time=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_print_time=F.
+TEST_F(InitGoogleTestTest, PrintTimeFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_print_time=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_random_seed=number
+TEST_F(InitGoogleTestTest, RandomSeed) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_random_seed=1000",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false);
+}
+
+// Tests parsing --gtest_repeat=number
+TEST_F(InitGoogleTestTest, Repeat) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_repeat=1000",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(true), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag with a "true" value
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(true), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag with a "false" value
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(false), false);
+}
+
+// Tests parsing --gtest_shuffle.
+TEST_F(InitGoogleTestTest, ShuffleWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
+}
+
+// Tests parsing --gtest_shuffle=0.
+TEST_F(InitGoogleTestTest, ShuffleFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false);
+}
+
+// Tests parsing a --gtest_shuffle flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, ShuffleTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
+}
+
+// Tests parsing --gtest_stack_trace_depth=number.
+TEST_F(InitGoogleTestTest, StackTraceDepth) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_stack_trace_depth=5",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false);
+}
+
+TEST_F(InitGoogleTestTest, StreamResultTo) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_stream_result_to=localhost:1234",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(
+      argv, argv2, Flags::StreamResultTo("localhost:1234"), false);
+}
+
+// Tests parsing --gtest_throw_on_failure.
+TEST_F(InitGoogleTestTest, ThrowOnFailureWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
+}
+
+// Tests parsing --gtest_throw_on_failure=0.
+TEST_F(InitGoogleTestTest, ThrowOnFailureFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false);
+}
+
+// Tests parsing a --gtest_throw_on_failure flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, ThrowOnFailureTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
+}
+
+#if GTEST_OS_WINDOWS
+// Tests parsing wide strings.
+TEST_F(InitGoogleTestTest, WideStrings) {
+  const wchar_t* argv[] = {
+    L"foo.exe",
+    L"--gtest_filter=Foo*",
+    L"--gtest_list_tests=1",
+    L"--gtest_break_on_failure",
+    L"--non_gtest_flag",
+    NULL
+  };
+
+  const wchar_t* argv2[] = {
+    L"foo.exe",
+    L"--non_gtest_flag",
+    NULL
+  };
+
+  Flags expected_flags;
+  expected_flags.break_on_failure = true;
+  expected_flags.filter = "Foo*";
+  expected_flags.list_tests = true;
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false);
+}
+#endif  // GTEST_OS_WINDOWS
+
+// Tests current_test_info() in UnitTest.
+class CurrentTestInfoTest : public Test {
+ protected:
+  // Tests that current_test_info() returns NULL before the first test in
+  // the test case is run.
+  static void SetUpTestCase() {
+    // There should be no tests running at this point.
+    const TestInfo* test_info =
+      UnitTest::GetInstance()->current_test_info();
+    EXPECT_TRUE(test_info == NULL)
+        << "There should be no tests running at this point.";
+  }
+
+  // Tests that current_test_info() returns NULL after the last test in
+  // the test case has run.
+  static void TearDownTestCase() {
+    const TestInfo* test_info =
+      UnitTest::GetInstance()->current_test_info();
+    EXPECT_TRUE(test_info == NULL)
+        << "There should be no tests running at this point.";
+  }
+};
+
+// Tests that current_test_info() returns TestInfo for currently running
+// test by checking the expected test name against the actual one.
+TEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) {
+  const TestInfo* test_info =
+    UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(NULL != test_info)
+      << "There is a test running so we should have a valid TestInfo.";
+  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
+      << "Expected the name of the currently running test case.";
+  EXPECT_STREQ("WorksForFirstTestInATestCase", test_info->name())
+      << "Expected the name of the currently running test.";
+}
+
+// Tests that current_test_info() returns TestInfo for currently running
+// test by checking the expected test name against the actual one.  We
+// use this test to see that the TestInfo object actually changed from
+// the previous invocation.
+TEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) {
+  const TestInfo* test_info =
+    UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(NULL != test_info)
+      << "There is a test running so we should have a valid TestInfo.";
+  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
+      << "Expected the name of the currently running test case.";
+  EXPECT_STREQ("WorksForSecondTestInATestCase", test_info->name())
+      << "Expected the name of the currently running test.";
+}
+
+}  // namespace testing
+
+// These two lines test that we can define tests in a namespace that
+// has the name "testing" and is nested in another namespace.
+namespace my_namespace {
+namespace testing {
+
+// Makes sure that TEST knows to use ::testing::Test instead of
+// ::my_namespace::testing::Test.
+class Test {};
+
+// Makes sure that an assertion knows to use ::testing::Message instead of
+// ::my_namespace::testing::Message.
+class Message {};
+
+// Makes sure that an assertion knows to use
+// ::testing::AssertionResult instead of
+// ::my_namespace::testing::AssertionResult.
+class AssertionResult {};
+
+// Tests that an assertion that should succeed works as expected.
+TEST(NestedTestingNamespaceTest, Success) {
+  EXPECT_EQ(1, 1) << "This shouldn't fail.";
+}
+
+// Tests that an assertion that should fail works as expected.
+TEST(NestedTestingNamespaceTest, Failure) {
+  EXPECT_FATAL_FAILURE(FAIL() << "This failure is expected.",
+                       "This failure is expected.");
+}
+
+}  // namespace testing
+}  // namespace my_namespace
+
+// Tests that one can call superclass SetUp and TearDown methods--
+// that is, that they are not private.
+// No tests are based on this fixture; the test "passes" if it compiles
+// successfully.
+class ProtectedFixtureMethodsTest : public Test {
+ protected:
+  virtual void SetUp() {
+    Test::SetUp();
+  }
+  virtual void TearDown() {
+    Test::TearDown();
+  }
+};
+
+// StreamingAssertionsTest tests the streaming versions of a representative
+// sample of assertions.
+TEST(StreamingAssertionsTest, Unconditional) {
+  SUCCEED() << "expected success";
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(FAIL() << "expected failure",
+                       "expected failure");
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+TEST(StreamingAssertionsTest, Truth) {
+  EXPECT_TRUE(true) << "unexpected failure";
+  ASSERT_TRUE(true) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, Truth2) {
+  EXPECT_FALSE(false) << "unexpected failure";
+  ASSERT_FALSE(false) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << "expected failure",
+                       "expected failure");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+TEST(StreamingAssertionsTest, IntegerEquals) {
+  EXPECT_EQ(1, 1) << "unexpected failure";
+  ASSERT_EQ(1, 1) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, IntegerLessThan) {
+  EXPECT_LT(1, 2) << "unexpected failure";
+  ASSERT_LT(1, 2) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsEqual) {
+  EXPECT_STREQ("foo", "foo") << "unexpected failure";
+  ASSERT_STREQ("foo", "foo") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ("foo", "bar") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("foo", "bar") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsNotEqual) {
+  EXPECT_STRNE("foo", "bar") << "unexpected failure";
+  ASSERT_STRNE("foo", "bar") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("foo", "foo") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRNE("foo", "foo") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsEqualIgnoringCase) {
+  EXPECT_STRCASEEQ("foo", "FOO") << "unexpected failure";
+  ASSERT_STRCASEEQ("foo", "FOO") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ("foo", "bar") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("foo", "bar") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) {
+  EXPECT_STRCASENE("foo", "bar") << "unexpected failure";
+  ASSERT_STRCASENE("foo", "bar") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("foo", "FOO") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("bar", "BAR") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, FloatingPointEquals) {
+  EXPECT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
+  ASSERT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << "expected failure",
+                       "expected failure");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+TEST(StreamingAssertionsTest, Throw) {
+  EXPECT_THROW(ThrowAnInteger(), int) << "unexpected failure";
+  ASSERT_THROW(ThrowAnInteger(), int) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) <<
+                       "expected failure", "expected failure");
+}
+
+TEST(StreamingAssertionsTest, NoThrow) {
+  EXPECT_NO_THROW(ThrowNothing()) << "unexpected failure";
+  ASSERT_NO_THROW(ThrowNothing()) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) <<
+                       "expected failure", "expected failure");
+}
+
+TEST(StreamingAssertionsTest, AnyThrow) {
+  EXPECT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
+  ASSERT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) <<
+                       "expected failure", "expected failure");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests that Google Test correctly decides whether to use colors in the output.
+
+TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) {
+  GTEST_FLAG(color) = "yes";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) {
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+
+  GTEST_FLAG(color) = "True";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  GTEST_FLAG(color) = "t";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  GTEST_FLAG(color) = "1";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) {
+  GTEST_FLAG(color) = "no";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) {
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+
+  GTEST_FLAG(color) = "F";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  GTEST_FLAG(color) = "0";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  GTEST_FLAG(color) = "unknown";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) {
+  GTEST_FLAG(color) = "auto";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+  EXPECT_TRUE(ShouldUseColor(true));    // Stdout is a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) {
+  GTEST_FLAG(color) = "auto";
+
+#if GTEST_OS_WINDOWS
+  // On Windows, we ignore the TERM variable as it's usually not set.
+
+  SetEnv("TERM", "dumb");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+#else
+  // On non-Windows platforms, we rely on TERM to determine if the
+  // terminal supports colors.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "emacs");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "vt100");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-mono");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-256color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "screen");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "screen-256color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "linux");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "cygwin");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+#endif  // GTEST_OS_WINDOWS
+}
+
+// Verifies that StaticAssertTypeEq works in a namespace scope.
+
+static bool dummy1 GTEST_ATTRIBUTE_UNUSED_ = StaticAssertTypeEq<bool, bool>();
+static bool dummy2 GTEST_ATTRIBUTE_UNUSED_ =
+    StaticAssertTypeEq<const int, const int>();
+
+// Verifies that StaticAssertTypeEq works in a class.
+
+template <typename T>
+class StaticAssertTypeEqTestHelper {
+ public:
+  StaticAssertTypeEqTestHelper() { StaticAssertTypeEq<bool, T>(); }
+};
+
+TEST(StaticAssertTypeEqTest, WorksInClass) {
+  StaticAssertTypeEqTestHelper<bool>();
+}
+
+// Verifies that StaticAssertTypeEq works inside a function.
+
+typedef int IntAlias;
+
+TEST(StaticAssertTypeEqTest, CompilesForEqualTypes) {
+  StaticAssertTypeEq<int, IntAlias>();
+  StaticAssertTypeEq<int*, IntAlias*>();
+}
+
+TEST(GetCurrentOsStackTraceExceptTopTest, ReturnsTheStackTrace) {
+  testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
+
+  // We don't have a stack walker in Google Test yet.
+  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 0).c_str());
+  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 1).c_str());
+}
+
+TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) {
+  EXPECT_FALSE(HasNonfatalFailure());
+}
+
+static void FailFatally() { FAIL(); }
+
+TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) {
+  FailFatally();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_FALSE(has_nonfatal_failure);
+}
+
+TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
+  FailFatally();
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+// A wrapper for calling HasNonfatalFailure outside of a test body.
+static bool HasNonfatalFailureHelper() {
+  return testing::Test::HasNonfatalFailure();
+}
+
+TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) {
+  EXPECT_FALSE(HasNonfatalFailureHelper());
+}
+
+TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) {
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailureHelper();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+TEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) {
+  EXPECT_FALSE(HasFailure());
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) {
+  FailFatally();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
+  ADD_FAILURE();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
+  FailFatally();
+  ADD_FAILURE();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+// A wrapper for calling HasFailure outside of a test body.
+static bool HasFailureHelper() { return testing::Test::HasFailure(); }
+
+TEST(HasFailureTest, WorksOutsideOfTestBody) {
+  EXPECT_FALSE(HasFailureHelper());
+}
+
+TEST(HasFailureTest, WorksOutsideOfTestBody2) {
+  ADD_FAILURE();
+  const bool has_failure = HasFailureHelper();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+class TestListener : public EmptyTestEventListener {
+ public:
+  TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {}
+  TestListener(int* on_start_counter, bool* is_destroyed)
+      : on_start_counter_(on_start_counter),
+        is_destroyed_(is_destroyed) {}
+
+  virtual ~TestListener() {
+    if (is_destroyed_)
+      *is_destroyed_ = true;
+  }
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    if (on_start_counter_ != NULL)
+      (*on_start_counter_)++;
+  }
+
+ private:
+  int* on_start_counter_;
+  bool* is_destroyed_;
+};
+
+// Tests the constructor.
+TEST(TestEventListenersTest, ConstructionWorks) {
+  TestEventListeners listeners;
+
+  EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL);
+  EXPECT_TRUE(listeners.default_result_printer() == NULL);
+  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+}
+
+// Tests that the TestEventListeners destructor deletes all the listeners it
+// owns.
+TEST(TestEventListenersTest, DestructionWorks) {
+  bool default_result_printer_is_destroyed = false;
+  bool default_xml_printer_is_destroyed = false;
+  bool extra_listener_is_destroyed = false;
+  TestListener* default_result_printer = new TestListener(
+      NULL, &default_result_printer_is_destroyed);
+  TestListener* default_xml_printer = new TestListener(
+      NULL, &default_xml_printer_is_destroyed);
+  TestListener* extra_listener = new TestListener(
+      NULL, &extra_listener_is_destroyed);
+
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners,
+                                                        default_result_printer);
+    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners,
+                                                       default_xml_printer);
+    listeners.Append(extra_listener);
+  }
+  EXPECT_TRUE(default_result_printer_is_destroyed);
+  EXPECT_TRUE(default_xml_printer_is_destroyed);
+  EXPECT_TRUE(extra_listener_is_destroyed);
+}
+
+// Tests that a listener Append'ed to a TestEventListeners list starts
+// receiving events.
+TEST(TestEventListenersTest, Append) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    listeners.Append(listener);
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(1, on_start_counter);
+  }
+  EXPECT_TRUE(is_destroyed);
+}
+
+// Tests that listeners receive events in the order they were appended to
+// the list, except for *End requests, which must be received in the reverse
+// order.
+class SequenceTestingListener : public EmptyTestEventListener {
+ public:
+  SequenceTestingListener(std::vector<std::string>* vector, const char* id)
+      : vector_(vector), id_(id) {}
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    vector_->push_back(GetEventDescription("OnTestProgramStart"));
+  }
+
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
+    vector_->push_back(GetEventDescription("OnTestProgramEnd"));
+  }
+
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {
+    vector_->push_back(GetEventDescription("OnTestIterationStart"));
+  }
+
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {
+    vector_->push_back(GetEventDescription("OnTestIterationEnd"));
+  }
+
+ private:
+  std::string GetEventDescription(const char* method) {
+    Message message;
+    message << id_ << "." << method;
+    return message.GetString();
+  }
+
+  std::vector<std::string>* vector_;
+  const char* const id_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener);
+};
+
+TEST(EventListenerTest, AppendKeepsOrder) {
+  std::vector<std::string> vec;
+  TestEventListeners listeners;
+  listeners.Append(new SequenceTestingListener(&vec, "1st"));
+  listeners.Append(new SequenceTestingListener(&vec, "2nd"));
+  listeners.Append(new SequenceTestingListener(&vec, "3rd"));
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("1st.OnTestProgramStart", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestProgramStart", vec[1].c_str());
+  EXPECT_STREQ("3rd.OnTestProgramStart", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd(
+      *UnitTest::GetInstance());
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("3rd.OnTestProgramEnd", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestProgramEnd", vec[1].c_str());
+  EXPECT_STREQ("1st.OnTestProgramEnd", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart(
+      *UnitTest::GetInstance(), 0);
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("1st.OnTestIterationStart", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestIterationStart", vec[1].c_str());
+  EXPECT_STREQ("3rd.OnTestIterationStart", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd(
+      *UnitTest::GetInstance(), 0);
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("3rd.OnTestIterationEnd", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestIterationEnd", vec[1].c_str());
+  EXPECT_STREQ("1st.OnTestIterationEnd", vec[2].c_str());
+}
+
+// Tests that a listener removed from a TestEventListeners list stops receiving
+// events and is not deleted when the list is destroyed.
+TEST(TestEventListenersTest, Release) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    listeners.Append(listener);
+    EXPECT_EQ(listener, listeners.Release(listener));
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_TRUE(listeners.Release(listener) == NULL);
+  }
+  EXPECT_EQ(0, on_start_counter);
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Tests that no events are forwarded when event forwarding is disabled.
+TEST(EventListenerTest, SuppressEventForwarding) {
+  int on_start_counter = 0;
+  TestListener* listener = new TestListener(&on_start_counter, NULL);
+
+  TestEventListeners listeners;
+  listeners.Append(listener);
+  ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
+  TestEventListenersAccessor::SuppressEventForwarding(&listeners);
+  ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(0, on_start_counter);
+}
+
+// Tests that events generated by Google Test are not forwarded in
+// death test subprocesses.
+TEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) {
+  EXPECT_DEATH_IF_SUPPORTED({
+      GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled(
+          *GetUnitTestImpl()->listeners())) << "expected failure";},
+      "expected failure");
+}
+
+// Tests that a listener installed via SetDefaultResultPrinter() starts
+// receiving events and is returned via default_result_printer() and that
+// the previous default_result_printer is removed from the list and deleted.
+TEST(EventListenerTest, default_result_printer) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+
+  TestEventListeners listeners;
+  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
+
+  EXPECT_EQ(listener, listeners.default_result_printer());
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+
+  EXPECT_EQ(1, on_start_counter);
+
+  // Replacing default_result_printer with something else should remove it
+  // from the list and destroy it.
+  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL);
+
+  EXPECT_TRUE(listeners.default_result_printer() == NULL);
+  EXPECT_TRUE(is_destroyed);
+
+  // After broadcasting an event the counter is still the same, indicating
+  // the listener is not in the list anymore.
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(1, on_start_counter);
+}
+
+// Tests that the default_result_printer listener stops receiving events
+// when removed via Release and that is not owned by the list anymore.
+TEST(EventListenerTest, RemovingDefaultResultPrinterWorks) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
+
+    EXPECT_EQ(listener, listeners.Release(listener));
+    EXPECT_TRUE(listeners.default_result_printer() == NULL);
+    EXPECT_FALSE(is_destroyed);
+
+    // Broadcasting events now should not affect default_result_printer.
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(0, on_start_counter);
+  }
+  // Destroying the list should not affect the listener now, too.
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Tests that a listener installed via SetDefaultXmlGenerator() starts
+// receiving events and is returned via default_xml_generator() and that
+// the previous default_xml_generator is removed from the list and deleted.
+TEST(EventListenerTest, default_xml_generator) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+
+  TestEventListeners listeners;
+  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
+
+  EXPECT_EQ(listener, listeners.default_xml_generator());
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+
+  EXPECT_EQ(1, on_start_counter);
+
+  // Replacing default_xml_generator with something else should remove it
+  // from the list and destroy it.
+  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL);
+
+  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+  EXPECT_TRUE(is_destroyed);
+
+  // After broadcasting an event the counter is still the same, indicating
+  // the listener is not in the list anymore.
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(1, on_start_counter);
+}
+
+// Tests that the default_xml_generator listener stops receiving events
+// when removed via Release and that is not owned by the list anymore.
+TEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
+
+    EXPECT_EQ(listener, listeners.Release(listener));
+    EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+    EXPECT_FALSE(is_destroyed);
+
+    // Broadcasting events now should not affect default_xml_generator.
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(0, on_start_counter);
+  }
+  // Destroying the list should not affect the listener now, too.
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Sanity tests to ensure that the alternative, verbose spellings of
+// some of the macros work.  We don't test them thoroughly as that
+// would be quite involved.  Since their implementations are
+// straightforward, and they are rarely used, we'll just rely on the
+// users to tell us when they are broken.
+GTEST_TEST(AlternativeNameTest, Works) {  // GTEST_TEST is the same as TEST.
+  GTEST_SUCCEED() << "OK";  // GTEST_SUCCEED is the same as SUCCEED.
+
+  // GTEST_FAIL is the same as FAIL.
+  EXPECT_FATAL_FAILURE(GTEST_FAIL() << "An expected failure",
+                       "An expected failure");
+
+  // GTEST_ASSERT_XY is the same as ASSERT_XY.
+
+  GTEST_ASSERT_EQ(0, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(0, 1) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_NE(0, 1);
+  GTEST_ASSERT_NE(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_NE(0, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_LE(0, 0);
+  GTEST_ASSERT_LE(0, 1);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LE(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_LT(0, 1);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(0, 0) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_GE(0, 0);
+  GTEST_ASSERT_GE(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GE(0, 1) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_GT(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(0, 1) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(1, 1) << "An expected failure",
+                       "An expected failure");
+}
+
+// Tests for internal utilities necessary for implementation of the universal
+// printing.
+// TODO(vladl at google.com): Find a better home for them.
+
+class ConversionHelperBase {};
+class ConversionHelperDerived : public ConversionHelperBase {};
+
+// Tests that IsAProtocolMessage<T>::value is a compile-time constant.
+TEST(IsAProtocolMessageTest, ValueIsCompileTimeConstant) {
+  GTEST_COMPILE_ASSERT_(IsAProtocolMessage<ProtocolMessage>::value,
+                        const_true);
+  GTEST_COMPILE_ASSERT_(!IsAProtocolMessage<int>::value, const_false);
+}
+
+// Tests that IsAProtocolMessage<T>::value is true when T is
+// proto2::Message or a sub-class of it.
+TEST(IsAProtocolMessageTest, ValueIsTrueWhenTypeIsAProtocolMessage) {
+  EXPECT_TRUE(IsAProtocolMessage< ::proto2::Message>::value);
+  EXPECT_TRUE(IsAProtocolMessage<ProtocolMessage>::value);
+}
+
+// Tests that IsAProtocolMessage<T>::value is false when T is neither
+// ProtocolMessage nor a sub-class of it.
+TEST(IsAProtocolMessageTest, ValueIsFalseWhenTypeIsNotAProtocolMessage) {
+  EXPECT_FALSE(IsAProtocolMessage<int>::value);
+  EXPECT_FALSE(IsAProtocolMessage<const ConversionHelperBase>::value);
+}
+
+// Tests that CompileAssertTypesEqual compiles when the type arguments are
+// equal.
+TEST(CompileAssertTypesEqual, CompilesWhenTypesAreEqual) {
+  CompileAssertTypesEqual<void, void>();
+  CompileAssertTypesEqual<int*, int*>();
+}
+
+// Tests that RemoveReference does not affect non-reference types.
+TEST(RemoveReferenceTest, DoesNotAffectNonReferenceType) {
+  CompileAssertTypesEqual<int, RemoveReference<int>::type>();
+  CompileAssertTypesEqual<const char, RemoveReference<const char>::type>();
+}
+
+// Tests that RemoveReference removes reference from reference types.
+TEST(RemoveReferenceTest, RemovesReference) {
+  CompileAssertTypesEqual<int, RemoveReference<int&>::type>();
+  CompileAssertTypesEqual<const char, RemoveReference<const char&>::type>();
+}
+
+// Tests GTEST_REMOVE_REFERENCE_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveReference() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_(T2)>();
+}
+
+TEST(RemoveReferenceTest, MacroVersion) {
+  TestGTestRemoveReference<int, int>();
+  TestGTestRemoveReference<const char, const char&>();
+}
+
+
+// Tests that RemoveConst does not affect non-const types.
+TEST(RemoveConstTest, DoesNotAffectNonConstType) {
+  CompileAssertTypesEqual<int, RemoveConst<int>::type>();
+  CompileAssertTypesEqual<char&, RemoveConst<char&>::type>();
+}
+
+// Tests that RemoveConst removes const from const types.
+TEST(RemoveConstTest, RemovesConst) {
+  CompileAssertTypesEqual<int, RemoveConst<const int>::type>();
+  CompileAssertTypesEqual<char[2], RemoveConst<const char[2]>::type>();
+  CompileAssertTypesEqual<char[2][3], RemoveConst<const char[2][3]>::type>();
+}
+
+// Tests GTEST_REMOVE_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveConst() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_CONST_(T2)>();
+}
+
+TEST(RemoveConstTest, MacroVersion) {
+  TestGTestRemoveConst<int, int>();
+  TestGTestRemoveConst<double&, double&>();
+  TestGTestRemoveConst<char, const char>();
+}
+
+// Tests GTEST_REMOVE_REFERENCE_AND_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveReferenceAndConst() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_AND_CONST_(T2)>();
+}
+
+TEST(RemoveReferenceToConstTest, Works) {
+  TestGTestRemoveReferenceAndConst<int, int>();
+  TestGTestRemoveReferenceAndConst<double, double&>();
+  TestGTestRemoveReferenceAndConst<char, const char>();
+  TestGTestRemoveReferenceAndConst<char, const char&>();
+  TestGTestRemoveReferenceAndConst<const char*, const char*>();
+}
+
+// Tests that AddReference does not affect reference types.
+TEST(AddReferenceTest, DoesNotAffectReferenceType) {
+  CompileAssertTypesEqual<int&, AddReference<int&>::type>();
+  CompileAssertTypesEqual<const char&, AddReference<const char&>::type>();
+}
+
+// Tests that AddReference adds reference to non-reference types.
+TEST(AddReferenceTest, AddsReference) {
+  CompileAssertTypesEqual<int&, AddReference<int>::type>();
+  CompileAssertTypesEqual<const char&, AddReference<const char>::type>();
+}
+
+// Tests GTEST_ADD_REFERENCE_.
+
+template <typename T1, typename T2>
+void TestGTestAddReference() {
+  CompileAssertTypesEqual<T1, GTEST_ADD_REFERENCE_(T2)>();
+}
+
+TEST(AddReferenceTest, MacroVersion) {
+  TestGTestAddReference<int&, int>();
+  TestGTestAddReference<const char&, const char&>();
+}
+
+// Tests GTEST_REFERENCE_TO_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestReferenceToConst() {
+  CompileAssertTypesEqual<T1, GTEST_REFERENCE_TO_CONST_(T2)>();
+}
+
+TEST(GTestReferenceToConstTest, Works) {
+  TestGTestReferenceToConst<const char&, char>();
+  TestGTestReferenceToConst<const int&, const int>();
+  TestGTestReferenceToConst<const double&, double>();
+  TestGTestReferenceToConst<const std::string&, const std::string&>();
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is a compile-time constant.
+TEST(ImplicitlyConvertibleTest, ValueIsCompileTimeConstant) {
+  GTEST_COMPILE_ASSERT_((ImplicitlyConvertible<int, int>::value), const_true);
+  GTEST_COMPILE_ASSERT_((!ImplicitlyConvertible<void*, int*>::value),
+                        const_false);
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is true when T1 can
+// be implicitly converted to T2.
+TEST(ImplicitlyConvertibleTest, ValueIsTrueWhenConvertible) {
+  EXPECT_TRUE((ImplicitlyConvertible<int, double>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<double, int>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<int*, void*>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<int*, const int*>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<ConversionHelperDerived&,
+                                     const ConversionHelperBase&>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<const ConversionHelperBase,
+                                     ConversionHelperBase>::value));
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is false when T1
+// cannot be implicitly converted to T2.
+TEST(ImplicitlyConvertibleTest, ValueIsFalseWhenNotConvertible) {
+  EXPECT_FALSE((ImplicitlyConvertible<double, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<void*, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<const int*, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<ConversionHelperBase&,
+                                      ConversionHelperDerived&>::value));
+}
+
+// Tests IsContainerTest.
+
+class NonContainer {};
+
+TEST(IsContainerTestTest, WorksForNonContainer) {
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<int>(0)));
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<char[5]>(0)));
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<NonContainer>(0)));
+}
+
+TEST(IsContainerTestTest, WorksForContainer) {
+  EXPECT_EQ(sizeof(IsContainer),
+            sizeof(IsContainerTest<std::vector<bool> >(0)));
+  EXPECT_EQ(sizeof(IsContainer),
+            sizeof(IsContainerTest<std::map<int, double> >(0)));
+}
+
+// Tests ArrayEq().
+
+TEST(ArrayEqTest, WorksForDegeneratedArrays) {
+  EXPECT_TRUE(ArrayEq(5, 5L));
+  EXPECT_FALSE(ArrayEq('a', 0));
+}
+
+TEST(ArrayEqTest, WorksForOneDimensionalArrays) {
+  // Note that a and b are distinct but compatible types.
+  const int a[] = { 0, 1 };
+  long b[] = { 0, 1 };
+  EXPECT_TRUE(ArrayEq(a, b));
+  EXPECT_TRUE(ArrayEq(a, 2, b));
+
+  b[0] = 2;
+  EXPECT_FALSE(ArrayEq(a, b));
+  EXPECT_FALSE(ArrayEq(a, 1, b));
+}
+
+TEST(ArrayEqTest, WorksForTwoDimensionalArrays) {
+  const char a[][3] = { "hi", "lo" };
+  const char b[][3] = { "hi", "lo" };
+  const char c[][3] = { "hi", "li" };
+
+  EXPECT_TRUE(ArrayEq(a, b));
+  EXPECT_TRUE(ArrayEq(a, 2, b));
+
+  EXPECT_FALSE(ArrayEq(a, c));
+  EXPECT_FALSE(ArrayEq(a, 2, c));
+}
+
+// Tests ArrayAwareFind().
+
+TEST(ArrayAwareFindTest, WorksForOneDimensionalArray) {
+  const char a[] = "hello";
+  EXPECT_EQ(a + 4, ArrayAwareFind(a, a + 5, 'o'));
+  EXPECT_EQ(a + 5, ArrayAwareFind(a, a + 5, 'x'));
+}
+
+TEST(ArrayAwareFindTest, WorksForTwoDimensionalArray) {
+  int a[][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
+  const int b[2] = { 2, 3 };
+  EXPECT_EQ(a + 1, ArrayAwareFind(a, a + 3, b));
+
+  const int c[2] = { 6, 7 };
+  EXPECT_EQ(a + 3, ArrayAwareFind(a, a + 3, c));
+}
+
+// Tests CopyArray().
+
+TEST(CopyArrayTest, WorksForDegeneratedArrays) {
+  int n = 0;
+  CopyArray('a', &n);
+  EXPECT_EQ('a', n);
+}
+
+TEST(CopyArrayTest, WorksForOneDimensionalArrays) {
+  const char a[3] = "hi";
+  int b[3];
+#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
+  CopyArray(a, &b);
+  EXPECT_TRUE(ArrayEq(a, b));
+#endif
+
+  int c[3];
+  CopyArray(a, 3, c);
+  EXPECT_TRUE(ArrayEq(a, c));
+}
+
+TEST(CopyArrayTest, WorksForTwoDimensionalArrays) {
+  const int a[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
+  int b[2][3];
+#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
+  CopyArray(a, &b);
+  EXPECT_TRUE(ArrayEq(a, b));
+#endif
+
+  int c[2][3];
+  CopyArray(a, 2, c);
+  EXPECT_TRUE(ArrayEq(a, c));
+}
+
+// Tests NativeArray.
+
+TEST(NativeArrayTest, ConstructorFromArrayWorks) {
+  const int a[3] = { 0, 1, 2 };
+  NativeArray<int> na(a, 3, kReference);
+  EXPECT_EQ(3U, na.size());
+  EXPECT_EQ(a, na.begin());
+}
+
+TEST(NativeArrayTest, CreatesAndDeletesCopyOfArrayWhenAskedTo) {
+  typedef int Array[2];
+  Array* a = new Array[1];
+  (*a)[0] = 0;
+  (*a)[1] = 1;
+  NativeArray<int> na(*a, 2, kCopy);
+  EXPECT_NE(*a, na.begin());
+  delete[] a;
+  EXPECT_EQ(0, na.begin()[0]);
+  EXPECT_EQ(1, na.begin()[1]);
+
+  // We rely on the heap checker to verify that na deletes the copy of
+  // array.
+}
+
+TEST(NativeArrayTest, TypeMembersAreCorrect) {
+  StaticAssertTypeEq<char, NativeArray<char>::value_type>();
+  StaticAssertTypeEq<int[2], NativeArray<int[2]>::value_type>();
+
+  StaticAssertTypeEq<const char*, NativeArray<char>::const_iterator>();
+  StaticAssertTypeEq<const bool(*)[2], NativeArray<bool[2]>::const_iterator>();
+}
+
+TEST(NativeArrayTest, MethodsWork) {
+  const int a[3] = { 0, 1, 2 };
+  NativeArray<int> na(a, 3, kCopy);
+  ASSERT_EQ(3U, na.size());
+  EXPECT_EQ(3, na.end() - na.begin());
+
+  NativeArray<int>::const_iterator it = na.begin();
+  EXPECT_EQ(0, *it);
+  ++it;
+  EXPECT_EQ(1, *it);
+  it++;
+  EXPECT_EQ(2, *it);
+  ++it;
+  EXPECT_EQ(na.end(), it);
+
+  EXPECT_TRUE(na == na);
+
+  NativeArray<int> na2(a, 3, kReference);
+  EXPECT_TRUE(na == na2);
+
+  const int b1[3] = { 0, 1, 1 };
+  const int b2[4] = { 0, 1, 2, 3 };
+  EXPECT_FALSE(na == NativeArray<int>(b1, 3, kReference));
+  EXPECT_FALSE(na == NativeArray<int>(b2, 4, kCopy));
+}
+
+TEST(NativeArrayTest, WorksForTwoDimensionalArray) {
+  const char a[2][3] = { "hi", "lo" };
+  NativeArray<char[3]> na(a, 2, kReference);
+  ASSERT_EQ(2U, na.size());
+  EXPECT_EQ(a, na.begin());
+}
+
+// Tests SkipPrefix().
+
+TEST(SkipPrefixTest, SkipsWhenPrefixMatches) {
+  const char* const str = "hello";
+
+  const char* p = str;
+  EXPECT_TRUE(SkipPrefix("", &p));
+  EXPECT_EQ(str, p);
+
+  p = str;
+  EXPECT_TRUE(SkipPrefix("hell", &p));
+  EXPECT_EQ(str + 4, p);
+}
+
+TEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) {
+  const char* const str = "world";
+
+  const char* p = str;
+  EXPECT_FALSE(SkipPrefix("W", &p));
+  EXPECT_EQ(str, p);
+
+  p = str;
+  EXPECT_FALSE(SkipPrefix("world!", &p));
+  EXPECT_EQ(str, p);
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc
new file mode 100644
index 0000000..531ced4
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc
@@ -0,0 +1,49 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// gtest_xml_outfile1_test_ writes some xml via TestProperty used by
+// gtest_xml_outfiles_test.py
+
+#include "gtest/gtest.h"
+
+class PropertyOne : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    RecordProperty("SetUpProp", 1);
+  }
+  virtual void TearDown() {
+    RecordProperty("TearDownProp", 1);
+  }
+};
+
+TEST_F(PropertyOne, TestSomeProperties) {
+  RecordProperty("TestSomeProperty", 1);
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc
new file mode 100644
index 0000000..7b400b2
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc
@@ -0,0 +1,49 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// gtest_xml_outfile2_test_ writes some xml via TestProperty used by
+// gtest_xml_outfiles_test.py
+
+#include "gtest/gtest.h"
+
+class PropertyTwo : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    RecordProperty("SetUpProp", 2);
+  }
+  virtual void TearDown() {
+    RecordProperty("TearDownProp", 2);
+  }
+};
+
+TEST_F(PropertyTwo, TestSomeProperties) {
+  RecordProperty("TestSomeProperty", 2);
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfiles_test.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfiles_test.py
new file mode 100755
index 0000000..524e437
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_outfiles_test.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for the gtest_xml_output module."""
+
+__author__ = "keith.ray at gmail.com (Keith Ray)"
+
+import os
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+import gtest_xml_test_utils
+
+
+GTEST_OUTPUT_SUBDIR = "xml_outfiles"
+GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"
+GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
+
+EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
+  <testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
+  </testsuite>
+</testsuites>
+"""
+
+EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
+  <testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
+  </testsuite>
+</testsuites>
+"""
+
+
+class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):
+  """Unit test for Google Test's XML output functionality."""
+
+  def setUp(self):
+    # We want the trailing '/' that the last "" provides in os.path.join, for
+    # telling Google Test to create an output directory instead of a single file
+    # for xml output.
+    self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),
+                                    GTEST_OUTPUT_SUBDIR, "")
+    self.DeleteFilesAndDir()
+
+  def tearDown(self):
+    self.DeleteFilesAndDir()
+
+  def DeleteFilesAndDir(self):
+    try:
+      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + ".xml"))
+    except os.error:
+      pass
+    try:
+      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + ".xml"))
+    except os.error:
+      pass
+    try:
+      os.rmdir(self.output_dir_)
+    except os.error:
+      pass
+
+  def testOutfile1(self):
+    self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1)
+
+  def testOutfile2(self):
+    self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2)
+
+  def _TestOutFile(self, test_name, expected_xml):
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)
+    command = [gtest_prog_path, "--gtest_output=xml:%s" % self.output_dir_]
+    p = gtest_test_utils.Subprocess(command,
+                                    working_dir=gtest_test_utils.GetTempDir())
+    self.assert_(p.exited)
+    self.assertEquals(0, p.exit_code)
+
+    # TODO(wan at google.com): libtool causes the built test binary to be
+    #   named lt-gtest_xml_outfiles_test_ instead of
+    #   gtest_xml_outfiles_test_.  To account for this possibillity, we
+    #   allow both names in the following code.  We should remove this
+    #   hack when Chandler Carruth's libtool replacement tool is ready.
+    output_file_name1 = test_name + ".xml"
+    output_file1 = os.path.join(self.output_dir_, output_file_name1)
+    output_file_name2 = 'lt-' + output_file_name1
+    output_file2 = os.path.join(self.output_dir_, output_file_name2)
+    self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),
+                 output_file1)
+
+    expected = minidom.parseString(expected_xml)
+    if os.path.isfile(output_file1):
+      actual = minidom.parse(output_file1)
+    else:
+      actual = minidom.parse(output_file2)
+    self.NormalizeXml(actual.documentElement)
+    self.AssertEquivalentNodes(expected.documentElement,
+                               actual.documentElement)
+    expected.unlink()
+    actual.unlink()
+
+
+if __name__ == "__main__":
+  os.environ["GTEST_STACK_TRACE_DEPTH"] = "0"
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_output_unittest.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_output_unittest.py
new file mode 100755
index 0000000..f605d4e
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_output_unittest.py
@@ -0,0 +1,307 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for the gtest_xml_output module"""
+
+__author__ = 'eefacm at gmail.com (Sean Mcafee)'
+
+import datetime
+import errno
+import os
+import re
+import sys
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+import gtest_xml_test_utils
+
+
+GTEST_FILTER_FLAG = '--gtest_filter'
+GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'
+GTEST_OUTPUT_FLAG         = "--gtest_output"
+GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
+GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
+
+SUPPORTS_STACK_TRACES = False
+
+if SUPPORTS_STACK_TRACES:
+  STACK_TRACE_TEMPLATE = '\nStack trace:\n*'
+else:
+  STACK_TRACE_TEMPLATE = ''
+
+EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="23" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
+  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
+  </testsuite>
+  <testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="Fails" status="run" time="*" classname="FailedTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 2
+Expected: 1%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>
+    <testcase name="Fails" status="run" time="*" classname="MixedResultTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 2
+Expected: 1%(stack)s]]></failure>
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 3&#x0A;Expected: 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 3
+Expected: 2%(stack)s]]></failure>
+    </testcase>
+    <testcase name="DISABLED_test" status="notrun" time="*" classname="MixedResultTest"/>
+  </testsuite>
+  <testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="OutputsCData" status="run" time="*" classname="XmlQuotingTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]></top>" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Failed
+XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]><![CDATA[</top>%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="InvalidCharactersInMessage" status="run" time="*" classname="InvalidCharactersTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Failed
+Invalid characters in brackets []%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*">
+    <testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
+  </testsuite>
+  <testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
+    <testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest" key_1="1"/>
+    <testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest" key_int="1"/>
+    <testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest" key_1="1" key_2="2" key_3="3"/>
+    <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest" key_1="2"/>
+  </testsuite>
+  <testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*">
+     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
+     <testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_int="1"/>
+     <testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_string="1"/>
+  </testsuite>
+  <testsuite name="Single/ValueParamTest" tests="4" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="HasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
+  </testsuite>
+  <testsuite name="TypedTest/0" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="TypedTest/0" />
+  </testsuite>
+  <testsuite name="TypedTest/1" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="TypedTest/1" />
+  </testsuite>
+  <testsuite name="Single/TypeParameterizedTestCase/0" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="Single/TypeParameterizedTestCase/0" />
+  </testsuite>
+  <testsuite name="Single/TypeParameterizedTestCase/1" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="Single/TypeParameterizedTestCase/1" />
+  </testsuite>
+</testsuites>""" % {'stack': STACK_TRACE_TEMPLATE}
+
+EXPECTED_FILTERED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*"
+            timestamp="*" name="AllTests" ad_hoc_property="42">
+  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0"
+             errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
+  </testsuite>
+</testsuites>"""
+
+EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="0" failures="0" disabled="0" errors="0" time="*"
+            timestamp="*" name="AllTests">
+</testsuites>"""
+
+GTEST_PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)
+
+SUPPORTS_TYPED_TESTS = 'TypedTest' in gtest_test_utils.Subprocess(
+    [GTEST_PROGRAM_PATH, GTEST_LIST_TESTS_FLAG], capture_stderr=False).output
+
+
+class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
+  """
+  Unit test for Google Test's XML output functionality.
+  """
+
+  # This test currently breaks on platforms that do not support typed and
+  # type-parameterized tests, so we don't run it under them.
+  if SUPPORTS_TYPED_TESTS:
+    def testNonEmptyXmlOutput(self):
+      """
+      Runs a test program that generates a non-empty XML output, and
+      tests that the XML output is expected.
+      """
+      self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)
+
+  def testEmptyXmlOutput(self):
+    """Verifies XML output for a Google Test binary without actual tests.
+
+    Runs a test program that generates an empty XML output, and
+    tests that the XML output is expected.
+    """
+
+    self._TestXmlOutput('gtest_no_test_unittest', EXPECTED_EMPTY_XML, 0)
+
+  def testTimestampValue(self):
+    """Checks whether the timestamp attribute in the XML output is valid.
+
+    Runs a test program that generates an empty XML output, and checks if
+    the timestamp attribute in the testsuites tag is valid.
+    """
+    actual = self._GetXmlOutput('gtest_no_test_unittest', [], 0)
+    date_time_str = actual.documentElement.getAttributeNode('timestamp').value
+    # datetime.strptime() is only available in Python 2.5+ so we have to
+    # parse the expected datetime manually.
+    match = re.match(r'(\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)', date_time_str)
+    self.assertTrue(
+        re.match,
+        'XML datettime string %s has incorrect format' % date_time_str)
+    date_time_from_xml = datetime.datetime(
+        year=int(match.group(1)), month=int(match.group(2)),
+        day=int(match.group(3)), hour=int(match.group(4)),
+        minute=int(match.group(5)), second=int(match.group(6)))
+
+    time_delta = abs(datetime.datetime.now() - date_time_from_xml)
+    # timestamp value should be near the current local time
+    self.assertTrue(time_delta < datetime.timedelta(seconds=600),
+                    'time_delta is %s' % time_delta)
+    actual.unlink()
+
+  def testDefaultOutputFile(self):
+    """
+    Confirms that Google Test produces an XML output file with the expected
+    default name if no name is explicitly specified.
+    """
+    output_file = os.path.join(gtest_test_utils.GetTempDir(),
+                               GTEST_DEFAULT_OUTPUT_FILE)
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(
+        'gtest_no_test_unittest')
+    try:
+      os.remove(output_file)
+    except OSError, e:
+      if e.errno != errno.ENOENT:
+        raise
+
+    p = gtest_test_utils.Subprocess(
+        [gtest_prog_path, '%s=xml' % GTEST_OUTPUT_FLAG],
+        working_dir=gtest_test_utils.GetTempDir())
+    self.assert_(p.exited)
+    self.assertEquals(0, p.exit_code)
+    self.assert_(os.path.isfile(output_file))
+
+  def testSuppressedXmlOutput(self):
+    """
+    Tests that no XML file is generated if the default XML listener is
+    shut down before RUN_ALL_TESTS is invoked.
+    """
+
+    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
+                            GTEST_PROGRAM_NAME + 'out.xml')
+    if os.path.isfile(xml_path):
+      os.remove(xml_path)
+
+    command = [GTEST_PROGRAM_PATH,
+               '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path),
+               '--shut_down_xml']
+    p = gtest_test_utils.Subprocess(command)
+    if p.terminated_by_signal:
+      # p.signal is avalable only if p.terminated_by_signal is True.
+      self.assertFalse(
+          p.terminated_by_signal,
+          '%s was killed by signal %d' % (GTEST_PROGRAM_NAME, p.signal))
+    else:
+      self.assert_(p.exited)
+      self.assertEquals(1, p.exit_code,
+                        "'%s' exited with code %s, which doesn't match "
+                        'the expected exit code %s.'
+                        % (command, p.exit_code, 1))
+
+    self.assert_(not os.path.isfile(xml_path))
+
+  def testFilteredTestXmlOutput(self):
+    """Verifies XML output when a filter is applied.
+
+    Runs a test program that executes only some tests and verifies that
+    non-selected tests do not show up in the XML output.
+    """
+
+    self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_FILTERED_TEST_XML, 0,
+                        extra_args=['%s=SuccessfulTest.*' % GTEST_FILTER_FLAG])
+
+  def _GetXmlOutput(self, gtest_prog_name, extra_args, expected_exit_code):
+    """
+    Returns the xml output generated by running the program gtest_prog_name.
+    Furthermore, the program's exit code must be expected_exit_code.
+    """
+    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
+                            gtest_prog_name + 'out.xml')
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)
+
+    command = ([gtest_prog_path, '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path)] +
+               extra_args)
+    p = gtest_test_utils.Subprocess(command)
+    if p.terminated_by_signal:
+      self.assert_(False,
+                   '%s was killed by signal %d' % (gtest_prog_name, p.signal))
+    else:
+      self.assert_(p.exited)
+      self.assertEquals(expected_exit_code, p.exit_code,
+                        "'%s' exited with code %s, which doesn't match "
+                        'the expected exit code %s.'
+                        % (command, p.exit_code, expected_exit_code))
+    actual = minidom.parse(xml_path)
+    return actual
+
+  def _TestXmlOutput(self, gtest_prog_name, expected_xml,
+                     expected_exit_code, extra_args=None):
+    """
+    Asserts that the XML document generated by running the program
+    gtest_prog_name matches expected_xml, a string containing another
+    XML document.  Furthermore, the program's exit code must be
+    expected_exit_code.
+    """
+
+    actual = self._GetXmlOutput(gtest_prog_name, extra_args or [],
+                                expected_exit_code)
+    expected = minidom.parseString(expected_xml)
+    self.NormalizeXml(actual.documentElement)
+    self.AssertEquivalentNodes(expected.documentElement,
+                               actual.documentElement)
+    expected.unlink()
+    actual.unlink()
+
+
+if __name__ == '__main__':
+  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'
+  gtest_test_utils.Main()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_output_unittest_.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_output_unittest_.cc
new file mode 100644
index 0000000..48b8771
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_output_unittest_.cc
@@ -0,0 +1,181 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: eefacm at gmail.com (Sean Mcafee)
+
+// Unit test for Google Test XML output.
+//
+// A user can specify XML output in a Google Test program to run via
+// either the GTEST_OUTPUT environment variable or the --gtest_output
+// flag.  This is used for testing such functionality.
+//
+// This program will be invoked from a Python unit test.  Don't run it
+// directly.
+
+#include "gtest/gtest.h"
+
+using ::testing::InitGoogleTest;
+using ::testing::TestEventListeners;
+using ::testing::TestWithParam;
+using ::testing::UnitTest;
+using ::testing::Test;
+using ::testing::Values;
+
+class SuccessfulTest : public Test {
+};
+
+TEST_F(SuccessfulTest, Succeeds) {
+  SUCCEED() << "This is a success.";
+  ASSERT_EQ(1, 1);
+}
+
+class FailedTest : public Test {
+};
+
+TEST_F(FailedTest, Fails) {
+  ASSERT_EQ(1, 2);
+}
+
+class DisabledTest : public Test {
+};
+
+TEST_F(DisabledTest, DISABLED_test_not_run) {
+  FAIL() << "Unexpected failure: Disabled test should not be run";
+}
+
+TEST(MixedResultTest, Succeeds) {
+  EXPECT_EQ(1, 1);
+  ASSERT_EQ(1, 1);
+}
+
+TEST(MixedResultTest, Fails) {
+  EXPECT_EQ(1, 2);
+  ASSERT_EQ(2, 3);
+}
+
+TEST(MixedResultTest, DISABLED_test) {
+  FAIL() << "Unexpected failure: Disabled test should not be run";
+}
+
+TEST(XmlQuotingTest, OutputsCData) {
+  FAIL() << "XML output: "
+            "<?xml encoding=\"utf-8\"><top><![CDATA[cdata text]]></top>";
+}
+
+// Helps to test that invalid characters produced by test code do not make
+// it into the XML file.
+TEST(InvalidCharactersTest, InvalidCharactersInMessage) {
+  FAIL() << "Invalid characters in brackets [\x1\x2]";
+}
+
+class PropertyRecordingTest : public Test {
+ public:
+  static void SetUpTestCase() { RecordProperty("SetUpTestCase", "yes"); }
+  static void TearDownTestCase() { RecordProperty("TearDownTestCase", "aye"); }
+};
+
+TEST_F(PropertyRecordingTest, OneProperty) {
+  RecordProperty("key_1", "1");
+}
+
+TEST_F(PropertyRecordingTest, IntValuedProperty) {
+  RecordProperty("key_int", 1);
+}
+
+TEST_F(PropertyRecordingTest, ThreeProperties) {
+  RecordProperty("key_1", "1");
+  RecordProperty("key_2", "2");
+  RecordProperty("key_3", "3");
+}
+
+TEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {
+  RecordProperty("key_1", "1");
+  RecordProperty("key_1", "2");
+}
+
+TEST(NoFixtureTest, RecordProperty) {
+  RecordProperty("key", "1");
+}
+
+void ExternalUtilityThatCallsRecordProperty(const std::string& key, int value) {
+  testing::Test::RecordProperty(key, value);
+}
+
+void ExternalUtilityThatCallsRecordProperty(const std::string& key,
+                                            const std::string& value) {
+  testing::Test::RecordProperty(key, value);
+}
+
+TEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {
+  ExternalUtilityThatCallsRecordProperty("key_for_utility_int", 1);
+}
+
+TEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {
+  ExternalUtilityThatCallsRecordProperty("key_for_utility_string", "1");
+}
+
+// Verifies that the test parameter value is output in the 'value_param'
+// XML attribute for value-parameterized tests.
+class ValueParamTest : public TestWithParam<int> {};
+TEST_P(ValueParamTest, HasValueParamAttribute) {}
+TEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}
+INSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));
+
+#if GTEST_HAS_TYPED_TEST
+// Verifies that the type parameter name is output in the 'type_param'
+// XML attribute for typed tests.
+template <typename T> class TypedTest : public Test {};
+typedef testing::Types<int, long> TypedTestTypes;
+TYPED_TEST_CASE(TypedTest, TypedTestTypes);
+TYPED_TEST(TypedTest, HasTypeParamAttribute) {}
+#endif
+
+#if GTEST_HAS_TYPED_TEST_P
+// Verifies that the type parameter name is output in the 'type_param'
+// XML attribute for type-parameterized tests.
+template <typename T> class TypeParameterizedTestCase : public Test {};
+TYPED_TEST_CASE_P(TypeParameterizedTestCase);
+TYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}
+REGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);
+typedef testing::Types<int, long> TypeParameterizedTestCaseTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(Single,
+                              TypeParameterizedTestCase,
+                              TypeParameterizedTestCaseTypes);
+#endif
+
+int main(int argc, char** argv) {
+  InitGoogleTest(&argc, argv);
+
+  if (argc > 1 && strcmp(argv[1], "--shut_down_xml") == 0) {
+    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+    delete listeners.Release(listeners.default_xml_generator());
+  }
+  testing::Test::RecordProperty("ad_hoc_property", "42");
+  return RUN_ALL_TESTS();
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_test_utils.py b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_test_utils.py
new file mode 100755
index 0000000..3d0c3b2
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/gtest_xml_test_utils.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test utilities for gtest_xml_output"""
+
+__author__ = 'eefacm at gmail.com (Sean Mcafee)'
+
+import re
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+
+
+GTEST_OUTPUT_FLAG         = '--gtest_output'
+GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'
+
+class GTestXMLTestCase(gtest_test_utils.TestCase):
+  """
+  Base class for tests of Google Test's XML output functionality.
+  """
+
+
+  def AssertEquivalentNodes(self, expected_node, actual_node):
+    """
+    Asserts that actual_node (a DOM node object) is equivalent to
+    expected_node (another DOM node object), in that either both of
+    them are CDATA nodes and have the same value, or both are DOM
+    elements and actual_node meets all of the following conditions:
+
+    *  It has the same tag name as expected_node.
+    *  It has the same set of attributes as expected_node, each with
+       the same value as the corresponding attribute of expected_node.
+       Exceptions are any attribute named "time", which needs only be
+       convertible to a floating-point number and any attribute named
+       "type_param" which only has to be non-empty.
+    *  It has an equivalent set of child nodes (including elements and
+       CDATA sections) as expected_node.  Note that we ignore the
+       order of the children as they are not guaranteed to be in any
+       particular order.
+    """
+
+    if expected_node.nodeType == Node.CDATA_SECTION_NODE:
+      self.assertEquals(Node.CDATA_SECTION_NODE, actual_node.nodeType)
+      self.assertEquals(expected_node.nodeValue, actual_node.nodeValue)
+      return
+
+    self.assertEquals(Node.ELEMENT_NODE, actual_node.nodeType)
+    self.assertEquals(Node.ELEMENT_NODE, expected_node.nodeType)
+    self.assertEquals(expected_node.tagName, actual_node.tagName)
+
+    expected_attributes = expected_node.attributes
+    actual_attributes   = actual_node  .attributes
+    self.assertEquals(
+        expected_attributes.length, actual_attributes.length,
+        'attribute numbers differ in element %s:\nExpected: %r\nActual: %r' % (
+            actual_node.tagName, expected_attributes.keys(),
+            actual_attributes.keys()))
+    for i in range(expected_attributes.length):
+      expected_attr = expected_attributes.item(i)
+      actual_attr   = actual_attributes.get(expected_attr.name)
+      self.assert_(
+          actual_attr is not None,
+          'expected attribute %s not found in element %s' %
+          (expected_attr.name, actual_node.tagName))
+      self.assertEquals(
+          expected_attr.value, actual_attr.value,
+          ' values of attribute %s in element %s differ: %s vs %s' %
+          (expected_attr.name, actual_node.tagName,
+           expected_attr.value, actual_attr.value))
+
+    expected_children = self._GetChildren(expected_node)
+    actual_children = self._GetChildren(actual_node)
+    self.assertEquals(
+        len(expected_children), len(actual_children),
+        'number of child elements differ in element ' + actual_node.tagName)
+    for child_id, child in expected_children.iteritems():
+      self.assert_(child_id in actual_children,
+                   '<%s> is not in <%s> (in element %s)' %
+                   (child_id, actual_children, actual_node.tagName))
+      self.AssertEquivalentNodes(child, actual_children[child_id])
+
+  identifying_attribute = {
+    'testsuites': 'name',
+    'testsuite': 'name',
+    'testcase':  'name',
+    'failure':   'message',
+    }
+
+  def _GetChildren(self, element):
+    """
+    Fetches all of the child nodes of element, a DOM Element object.
+    Returns them as the values of a dictionary keyed by the IDs of the
+    children.  For <testsuites>, <testsuite> and <testcase> elements, the ID
+    is the value of their "name" attribute; for <failure> elements, it is
+    the value of the "message" attribute; CDATA sections and non-whitespace
+    text nodes are concatenated into a single CDATA section with ID
+    "detail".  An exception is raised if any element other than the above
+    four is encountered, if two child elements with the same identifying
+    attributes are encountered, or if any other type of node is encountered.
+    """
+
+    children = {}
+    for child in element.childNodes:
+      if child.nodeType == Node.ELEMENT_NODE:
+        self.assert_(child.tagName in self.identifying_attribute,
+                     'Encountered unknown element <%s>' % child.tagName)
+        childID = child.getAttribute(self.identifying_attribute[child.tagName])
+        self.assert_(childID not in children)
+        children[childID] = child
+      elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
+        if 'detail' not in children:
+          if (child.nodeType == Node.CDATA_SECTION_NODE or
+              not child.nodeValue.isspace()):
+            children['detail'] = child.ownerDocument.createCDATASection(
+                child.nodeValue)
+        else:
+          children['detail'].nodeValue += child.nodeValue
+      else:
+        self.fail('Encountered unexpected node type %d' % child.nodeType)
+    return children
+
+  def NormalizeXml(self, element):
+    """
+    Normalizes Google Test's XML output to eliminate references to transient
+    information that may change from run to run.
+
+    *  The "time" attribute of <testsuites>, <testsuite> and <testcase>
+       elements is replaced with a single asterisk, if it contains
+       only digit characters.
+    *  The "timestamp" attribute of <testsuites> elements is replaced with a
+       single asterisk, if it contains a valid ISO8601 datetime value.
+    *  The "type_param" attribute of <testcase> elements is replaced with a
+       single asterisk (if it sn non-empty) as it is the type name returned
+       by the compiler and is platform dependent.
+    *  The line info reported in the first line of the "message"
+       attribute and CDATA section of <failure> elements is replaced with the
+       file's basename and a single asterisk for the line number.
+    *  The directory names in file paths are removed.
+    *  The stack traces are removed.
+    """
+
+    if element.tagName == 'testsuites':
+      timestamp = element.getAttributeNode('timestamp')
+      timestamp.value = re.sub(r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d$',
+                               '*', timestamp.value)
+    if element.tagName in ('testsuites', 'testsuite', 'testcase'):
+      time = element.getAttributeNode('time')
+      time.value = re.sub(r'^\d+(\.\d+)?$', '*', time.value)
+      type_param = element.getAttributeNode('type_param')
+      if type_param and type_param.value:
+        type_param.value = '*'
+    elif element.tagName == 'failure':
+      source_line_pat = r'^.*[/\\](.*:)\d+\n'
+      # Replaces the source line information with a normalized form.
+      message = element.getAttributeNode('message')
+      message.value = re.sub(source_line_pat, '\\1*\n', message.value)
+      for child in element.childNodes:
+        if child.nodeType == Node.CDATA_SECTION_NODE:
+          # Replaces the source line information with a normalized form.
+          cdata = re.sub(source_line_pat, '\\1*\n', child.nodeValue)
+          # Removes the actual stack trace.
+          child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
+                                   '', cdata)
+    for child in element.childNodes:
+      if child.nodeType == Node.ELEMENT_NODE:
+        self.NormalizeXml(child)
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/production.cc b/ThirdParty/common/gtest/gtest-1.7.0/test/production.cc
new file mode 100644
index 0000000..8b8a40b
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/production.cc
@@ -0,0 +1,36 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This is part of the unit test for include/gtest/gtest_prod.h.
+
+#include "production.h"
+
+PrivateCode::PrivateCode() : x_(0) {}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/test/production.h b/ThirdParty/common/gtest/gtest-1.7.0/test/production.h
new file mode 100644
index 0000000..98fd5e4
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/test/production.h
@@ -0,0 +1,55 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This is part of the unit test for include/gtest/gtest_prod.h.
+
+#ifndef GTEST_TEST_PRODUCTION_H_
+#define GTEST_TEST_PRODUCTION_H_
+
+#include "gtest/gtest_prod.h"
+
+class PrivateCode {
+ public:
+  // Declares a friend test that does not use a fixture.
+  FRIEND_TEST(PrivateCodeTest, CanAccessPrivateMembers);
+
+  // Declares a friend test that uses a fixture.
+  FRIEND_TEST(PrivateCodeFixtureTest, CanAccessPrivateMembers);
+
+  PrivateCode();
+
+  int x() const { return x_; }
+ private:
+  void set_x(int an_x) { x_ = an_x; }
+  int x_;
+};
+
+#endif  // GTEST_TEST_PRODUCTION_H_
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/DebugProject.xcconfig b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/DebugProject.xcconfig
new file mode 100644
index 0000000..3d68157
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/DebugProject.xcconfig
@@ -0,0 +1,30 @@
+//
+//  DebugProject.xcconfig
+//
+//  These are Debug Configuration project settings for the gtest framework and
+//  examples. It is set in the "Based On:" dropdown in the "Project" info
+//  dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+#include "General.xcconfig"
+
+// No optimization
+GCC_OPTIMIZATION_LEVEL = 0
+
+// Deployment postprocessing is what triggers Xcode to strip, turn it off
+DEPLOYMENT_POSTPROCESSING = NO
+
+// Dead code stripping off
+DEAD_CODE_STRIPPING = NO
+
+// Debug symbols should be on obviously
+GCC_GENERATE_DEBUGGING_SYMBOLS = YES
+
+// Define the DEBUG macro in all debug builds
+OTHER_CFLAGS = $(OTHER_CFLAGS) -DDEBUG=1
+
+// These are turned off to avoid STL incompatibilities with client code
+// // Turns on special C++ STL checks to "encourage" good STL use
+// GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) _GLIBCXX_DEBUG_PEDANTIC _GLIBCXX_DEBUG _GLIBCPP_CONCEPT_CHECKS
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig
new file mode 100644
index 0000000..357b1c8
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig
@@ -0,0 +1,17 @@
+//
+//  FrameworkTarget.xcconfig
+//
+//  These are Framework target settings for the gtest framework and examples. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Dynamic libs need to be position independent
+GCC_DYNAMIC_NO_PIC = NO
+
+// Dynamic libs should not have their external symbols stripped.
+STRIP_STYLE = non-global
+
+// Let the user install by specifying the $DSTROOT with xcodebuild
+SKIP_INSTALL = NO
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/General.xcconfig b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/General.xcconfig
new file mode 100644
index 0000000..f23e322
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/General.xcconfig
@@ -0,0 +1,41 @@
+//
+//  General.xcconfig
+//
+//  These are General configuration settings for the gtest framework and
+//  examples.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Build for PPC and Intel, 32- and 64-bit
+ARCHS = i386 x86_64 ppc ppc64
+
+// Zerolink prevents link warnings so turn it off
+ZERO_LINK = NO
+
+// Prebinding considered unhelpful in 10.3 and later
+PREBINDING = NO
+
+// Strictest warning policy
+WARNING_CFLAGS = -Wall -Werror -Wendif-labels -Wnewline-eof -Wno-sign-compare -Wshadow
+
+// Work around Xcode bugs by using external strip. See:
+// http://lists.apple.com/archives/Xcode-users/2006/Feb/msg00050.html
+SEPARATE_STRIP = YES
+
+// Force C99 dialect
+GCC_C_LANGUAGE_STANDARD = c99
+
+// not sure why apple defaults this on, but it's pretty risky
+ALWAYS_SEARCH_USER_PATHS = NO
+
+// Turn on position dependent code for most cases (overridden where appropriate)
+GCC_DYNAMIC_NO_PIC = YES
+
+// Default SDK and minimum OS version is 10.4
+SDKROOT = $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk
+MACOSX_DEPLOYMENT_TARGET = 10.4
+GCC_VERSION = 4.0
+
+// VERSIONING BUILD SETTINGS (used in Info.plist)
+GTEST_VERSIONINFO_ABOUT =  © 2008 Google Inc.
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig
new file mode 100644
index 0000000..5349f0a
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig
@@ -0,0 +1,32 @@
+//
+//  ReleaseProject.xcconfig
+//
+//  These are Release Configuration project settings for the gtest framework
+//  and examples. It is set in the "Based On:" dropdown in the "Project" info
+//  dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+#include "General.xcconfig"
+
+// subconfig/Release.xcconfig
+
+// Optimize for space and size (Apple recommendation)
+GCC_OPTIMIZATION_LEVEL = s
+
+// Deploment postprocessing is what triggers Xcode to strip
+DEPLOYMENT_POSTPROCESSING = YES
+
+// No symbols
+GCC_GENERATE_DEBUGGING_SYMBOLS = NO
+
+// Dead code strip does not affect ObjC code but can help for C
+DEAD_CODE_STRIPPING = YES
+
+// NDEBUG is used by things like assert.h, so define it for general compat.
+// ASSERT going away in release tends to create unused vars.
+OTHER_CFLAGS = $(OTHER_CFLAGS) -DNDEBUG=1 -Wno-unused-variable
+
+// When we strip we want to strip all symbols in release, but save externals.
+STRIP_STYLE = all
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig
new file mode 100644
index 0000000..3922fa5
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig
@@ -0,0 +1,18 @@
+//
+//  StaticLibraryTarget.xcconfig
+//
+//  These are static library target settings for libgtest.a. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Static libs can be included in bundles so make them position independent
+GCC_DYNAMIC_NO_PIC = NO
+
+// Static libs should not have their internal globals or external symbols
+// stripped.
+STRIP_STYLE = debugging
+
+// Let the user install by specifying the $DSTROOT with xcodebuild
+SKIP_INSTALL = NO
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/TestTarget.xcconfig b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/TestTarget.xcconfig
new file mode 100644
index 0000000..e6652ba
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Config/TestTarget.xcconfig
@@ -0,0 +1,8 @@
+//
+//  TestTarget.xcconfig
+//
+//  These are Test target settings for the gtest framework and examples. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+
+PRODUCT_NAME = $(TARGET_NAME)
+HEADER_SEARCH_PATHS = ../include
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Resources/Info.plist b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Resources/Info.plist
new file mode 100644
index 0000000..9dd28ea
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Resources/Info.plist
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.${PRODUCT_NAME}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>GTEST_VERSIONINFO_LONG</string>
+	<key>CFBundleShortVersionString</key>
+	<string>GTEST_VERSIONINFO_SHORT</string>
+	<key>CFBundleGetInfoString</key>
+	<string>${PRODUCT_NAME} GTEST_VERSIONINFO_LONG, ${GTEST_VERSIONINFO_ABOUT}</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>${GTEST_VERSIONINFO_ABOUT}</string>
+	<key>CSResourcesFileMapped</key>
+	<true/>
+</dict>
+</plist>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist
new file mode 100644
index 0000000..f3852ed
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.gtest.${PRODUCT_NAME:identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>CSResourcesFileMapped</key>
+	<true/>
+</dict>
+</plist>
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..497617e
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj
@@ -0,0 +1,457 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 42;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		4024D162113D7D2400C7059E /* Test */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget "Test" */;
+			buildPhases = (
+				4024D161113D7D2400C7059E /* ShellScript */,
+			);
+			dependencies = (
+				4024D166113D7D3100C7059E /* PBXTargetDependency */,
+			);
+			name = Test;
+			productName = TestAndBuild;
+		};
+		4024D1E9113D83FF00C7059E /* TestAndBuild */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget "TestAndBuild" */;
+			buildPhases = (
+			);
+			dependencies = (
+				4024D1ED113D840900C7059E /* PBXTargetDependency */,
+				4024D1EF113D840D00C7059E /* PBXTargetDependency */,
+			);
+			name = TestAndBuild;
+			productName = TestAndBuild;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1230E5AEE3500C7F239 /* widget.cc */; };
+		3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7EB1240E5AEE3500C7F239 /* widget.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1270E5AEE4600C7F239 /* widget_test.cc */; };
+		3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */; };
+		4024D188113D7D7800C7059E /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D185113D7D5500C7059E /* libgtest.a */; };
+		4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D183113D7D5500C7059E /* libgtest_main.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = gTestExample;
+		};
+		4024D165113D7D3100C7059E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 3B07BDE90E3F3F9E00647869;
+			remoteInfo = WidgetFrameworkTest;
+		};
+		4024D1EC113D840900C7059E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = WidgetFramework;
+		};
+		4024D1EE113D840D00C7059E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 4024D162113D7D2400C7059E;
+			remoteInfo = Test;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = WidgetFrameworkTest; sourceTree = BUILT_PRODUCTS_DIR; };
+		3B7EB1230E5AEE3500C7F239 /* widget.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget.cc; sourceTree = "<group>"; };
+		3B7EB1240E5AEE3500C7F239 /* widget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = widget.h; sourceTree = "<group>"; };
+		3B7EB1270E5AEE4600C7F239 /* widget_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget_test.cc; sourceTree = "<group>"; };
+		4024D183113D7D5500C7059E /* libgtest_main.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest_main.a; path = /usr/local/lib/libgtest_main.a; sourceTree = "<absolute>"; };
+		4024D185113D7D5500C7059E /* libgtest.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest.a; path = /usr/local/lib/libgtest.a; sourceTree = "<absolute>"; };
+		4024D1E2113D838200C7059E /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = "<group>"; };
+		8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
+		8D07F2C80486CC7A007CD1D0 /* Widget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Widget.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		3B07BDE80E3F3F9E00647869 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */,
+				4024D188113D7D7800C7059E /* libgtest.a in Frameworks */,
+				3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D07F2C30486CC7A007CD1D0 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		034768DDFF38A45A11DB9C8B /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				8D07F2C80486CC7A007CD1D0 /* Widget.framework */,
+				3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		0867D691FE84028FC02AAC07 /* gTestExample */ = {
+			isa = PBXGroup;
+			children = (
+				4024D1E1113D836C00C7059E /* Scripts */,
+				08FB77ACFE841707C02AAC07 /* Source */,
+				089C1665FE841158C02AAC07 /* Resources */,
+				3B07BE350E4094E400647869 /* Test */,
+				0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
+				034768DDFF38A45A11DB9C8B /* Products */,
+			);
+			name = gTestExample;
+			sourceTree = "<group>";
+		};
+		0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
+			isa = PBXGroup;
+			children = (
+				4024D183113D7D5500C7059E /* libgtest_main.a */,
+				4024D185113D7D5500C7059E /* libgtest.a */,
+			);
+			name = "External Frameworks and Libraries";
+			sourceTree = "<group>";
+		};
+		089C1665FE841158C02AAC07 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				8D07F2C70486CC7A007CD1D0 /* Info.plist */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		08FB77ACFE841707C02AAC07 /* Source */ = {
+			isa = PBXGroup;
+			children = (
+				3B7EB1230E5AEE3500C7F239 /* widget.cc */,
+				3B7EB1240E5AEE3500C7F239 /* widget.h */,
+			);
+			name = Source;
+			sourceTree = "<group>";
+		};
+		3B07BE350E4094E400647869 /* Test */ = {
+			isa = PBXGroup;
+			children = (
+				3B7EB1270E5AEE4600C7F239 /* widget_test.cc */,
+			);
+			name = Test;
+			sourceTree = "<group>";
+		};
+		4024D1E1113D836C00C7059E /* Scripts */ = {
+			isa = PBXGroup;
+			children = (
+				4024D1E2113D838200C7059E /* runtests.sh */,
+			);
+			name = Scripts;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		8D07F2BD0486CC7A007CD1D0 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget "WidgetFrameworkTest" */;
+			buildPhases = (
+				3B07BDE70E3F3F9E00647869 /* Sources */,
+				3B07BDE80E3F3F9E00647869 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */,
+			);
+			name = WidgetFrameworkTest;
+			productName = gTestExampleTest;
+			productReference = 3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */;
+			productType = "com.apple.product-type.tool";
+		};
+		8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "WidgetFramework" */;
+			buildPhases = (
+				8D07F2C10486CC7A007CD1D0 /* Sources */,
+				8D07F2C30486CC7A007CD1D0 /* Frameworks */,
+				8D07F2BD0486CC7A007CD1D0 /* Headers */,
+				8D07F2BF0486CC7A007CD1D0 /* Resources */,
+				8D07F2C50486CC7A007CD1D0 /* Rez */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = WidgetFramework;
+			productInstallPath = "$(HOME)/Library/Frameworks";
+			productName = gTestExample;
+			productReference = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */;
+			productType = "com.apple.product-type.framework";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		0867D690FE84028FC02AAC07 /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "WidgetFramework" */;
+			compatibilityVersion = "Xcode 2.4";
+			hasScannedForEncodings = 1;
+			mainGroup = 0867D691FE84028FC02AAC07 /* gTestExample */;
+			productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */,
+				3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */,
+				4024D162113D7D2400C7059E /* Test */,
+				4024D1E9113D83FF00C7059E /* TestAndBuild */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		8D07F2BF0486CC7A007CD1D0 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXRezBuildPhase section */
+		8D07F2C50486CC7A007CD1D0 /* Rez */ = {
+			isa = PBXRezBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXRezBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		4024D161113D7D2400C7059E /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/bash $SRCROOT/runtests.sh $BUILT_PRODUCTS_DIR/WidgetFrameworkTest\n";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		3B07BDE70E3F3F9E00647869 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D07F2C10486CC7A007CD1D0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;
+			targetProxy = 3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */;
+		};
+		4024D166113D7D3100C7059E /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */;
+			targetProxy = 4024D165113D7D3100C7059E /* PBXContainerItemProxy */;
+		};
+		4024D1ED113D840900C7059E /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;
+			targetProxy = 4024D1EC113D840900C7059E /* PBXContainerItemProxy */;
+		};
+		4024D1EF113D840D00C7059E /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 4024D162113D7D2400C7059E /* Test */;
+			targetProxy = 4024D1EE113D840D00C7059E /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		3B07BDEC0E3F3F9F00647869 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = WidgetFrameworkTest;
+			};
+			name = Debug;
+		};
+		3B07BDED0E3F3F9F00647869 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = WidgetFrameworkTest;
+			};
+			name = Release;
+		};
+		4024D163113D7D2400C7059E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Debug;
+		};
+		4024D164113D7D2400C7059E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Release;
+		};
+		4024D1EA113D83FF00C7059E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Debug;
+		};
+		4024D1EB113D83FF00C7059E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Release;
+		};
+		4FADC24308B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				FRAMEWORK_VERSION = A;
+				INFOPLIST_FILE = Info.plist;
+				INSTALL_PATH = "@loader_path/../Frameworks";
+				PRODUCT_NAME = Widget;
+			};
+			name = Debug;
+		};
+		4FADC24408B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				FRAMEWORK_VERSION = A;
+				INFOPLIST_FILE = Info.plist;
+				INSTALL_PATH = "@loader_path/../Frameworks";
+				PRODUCT_NAME = Widget;
+			};
+			name = Release;
+		};
+		4FADC24708B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = 4.0;
+				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+			};
+			name = Debug;
+		};
+		4FADC24808B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = 4.0;
+				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget "WidgetFrameworkTest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3B07BDEC0E3F3F9F00647869 /* Debug */,
+				3B07BDED0E3F3F9F00647869 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget "Test" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4024D163113D7D2400C7059E /* Debug */,
+				4024D164113D7D2400C7059E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget "TestAndBuild" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4024D1EA113D83FF00C7059E /* Debug */,
+				4024D1EB113D83FF00C7059E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "WidgetFramework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24308B4156D00ABE55E /* Debug */,
+				4FADC24408B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "WidgetFramework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24708B4156D00ABE55E /* Debug */,
+				4FADC24808B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh
new file mode 100644
index 0000000..4a0d413
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Executes the samples and tests for the Google Test Framework.
+
+# Help the dynamic linker find the path to the libraries.
+export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR
+export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR
+
+# Create some executables.
+test_executables=$@
+
+# Now execute each one in turn keeping track of how many succeeded and failed.
+succeeded=0
+failed=0
+failed_list=()
+for test in ${test_executables[*]}; do
+  "$test"
+  result=$?
+  if [ $result -eq 0 ]; then
+    succeeded=$(( $succeeded + 1 ))
+  else
+    failed=$(( failed + 1 ))
+    failed_list="$failed_list $test"
+  fi
+done
+
+# Report the successes and failures to the console.
+echo "Tests complete with $succeeded successes and $failed failures."
+if [ $failed -ne 0 ]; then
+  echo "The following tests failed:"
+  echo $failed_list
+fi
+exit $failed
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc
new file mode 100644
index 0000000..bfc4e7f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc
@@ -0,0 +1,63 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget.cc
+//
+
+// Widget is a very simple class used for demonstrating the use of gtest
+
+#include "widget.h"
+
+Widget::Widget(int number, const std::string& name)
+    : number_(number),
+      name_(name) {}
+
+Widget::~Widget() {}
+
+float Widget::GetFloatValue() const {
+  return number_;
+}
+
+int Widget::GetIntValue() const {
+  return static_cast<int>(number_);
+}
+
+std::string Widget::GetStringValue() const {
+  return name_;
+}
+
+void Widget::GetCharPtrValue(char* buffer, size_t max_size) const {
+  // Copy the char* representation of name_ into buffer, up to max_size.
+  strncpy(buffer, name_.c_str(), max_size-1);
+  buffer[max_size-1] = '\0';
+  return;
+}
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h
new file mode 100644
index 0000000..0c55cdc
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h
@@ -0,0 +1,59 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget.h
+//
+
+// Widget is a very simple class used for demonstrating the use of gtest. It
+// simply stores two values a string and an integer, which are returned via
+// public accessors in multiple forms.
+
+#import <string>
+
+class Widget {
+ public:
+  Widget(int number, const std::string& name);
+  ~Widget();
+
+  // Public accessors to number data
+  float GetFloatValue() const;
+  int GetIntValue() const;
+
+  // Public accessors to the string data
+  std::string GetStringValue() const;
+  void GetCharPtrValue(char* buffer, size_t max_size) const;
+
+ private:
+  // Data members
+  float number_;
+  std::string name_;
+};
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc
new file mode 100644
index 0000000..8725994
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc
@@ -0,0 +1,68 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget_test.cc
+//
+
+// This is a simple test file for the Widget class in the Widget.framework
+
+#include <string>
+#include "gtest/gtest.h"
+
+#include <Widget/widget.h>
+
+// This test verifies that the constructor sets the internal state of the
+// Widget class correctly.
+TEST(WidgetInitializerTest, TestConstructor) {
+  Widget widget(1.0f, "name");
+  EXPECT_FLOAT_EQ(1.0f, widget.GetFloatValue());
+  EXPECT_EQ(std::string("name"), widget.GetStringValue());
+}
+
+// This test verifies the conversion of the float and string values to int and
+// char*, respectively.
+TEST(WidgetInitializerTest, TestConversion) {
+  Widget widget(1.0f, "name");
+  EXPECT_EQ(1, widget.GetIntValue());
+
+  size_t max_size = 128;
+  char buffer[max_size];
+  widget.GetCharPtrValue(buffer, max_size);
+  EXPECT_STREQ("name", buffer);
+}
+
+// Use the Google Test main that is linked into the framework. It does something
+// like this:
+// int main(int argc, char** argv) {
+//   testing::InitGoogleTest(&argc, argv);
+//   return RUN_ALL_TESTS();
+// }
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Scripts/runtests.sh b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Scripts/runtests.sh
new file mode 100644
index 0000000..3fc229f
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Scripts/runtests.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Executes the samples and tests for the Google Test Framework.
+
+# Help the dynamic linker find the path to the libraries.
+export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR
+export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR
+
+# Create some executables.
+test_executables=("$BUILT_PRODUCTS_DIR/gtest_unittest-framework"
+                  "$BUILT_PRODUCTS_DIR/gtest_unittest"
+                  "$BUILT_PRODUCTS_DIR/sample1_unittest-framework"
+                  "$BUILT_PRODUCTS_DIR/sample1_unittest-static")
+
+# Now execute each one in turn keeping track of how many succeeded and failed. 
+succeeded=0
+failed=0
+failed_list=()
+for test in ${test_executables[*]}; do
+  "$test"
+  result=$?
+  if [ $result -eq 0 ]; then
+    succeeded=$(( $succeeded + 1 ))
+  else
+    failed=$(( failed + 1 ))
+    failed_list="$failed_list $test"
+  fi
+done
+
+# Report the successes and failures to the console.
+echo "Tests complete with $succeeded successes and $failed failures."
+if [ $failed -ne 0 ]; then
+  echo "The following tests failed:"
+  echo $failed_list
+fi
+exit $failed
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/Scripts/versiongenerate.py b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Scripts/versiongenerate.py
new file mode 100755
index 0000000..81de8c9
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/Scripts/versiongenerate.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""A script to prepare version informtion for use the gtest Info.plist file.
+
+  This script extracts the version information from the configure.ac file and
+  uses it to generate a header file containing the same information. The
+  #defines in this header file will be included in during the generation of
+  the Info.plist of the framework, giving the correct value to the version
+  shown in the Finder.
+
+  This script makes the following assumptions (these are faults of the script,
+  not problems with the Autoconf):
+    1. The AC_INIT macro will be contained within the first 1024 characters
+       of configure.ac
+    2. The version string will be 3 integers separated by periods and will be
+       surrounded by squre brackets, "[" and "]" (e.g. [1.0.1]). The first
+       segment represents the major version, the second represents the minor
+       version and the third represents the fix version.
+    3. No ")" character exists between the opening "(" and closing ")" of
+       AC_INIT, including in comments and character strings.
+"""
+
+import sys
+import re
+
+# Read the command line argument (the output directory for Version.h)
+if (len(sys.argv) < 3):
+  print "Usage: versiongenerate.py input_dir output_dir"
+  sys.exit(1)
+else:
+  input_dir = sys.argv[1]
+  output_dir = sys.argv[2]
+
+# Read the first 1024 characters of the configure.ac file
+config_file = open("%s/configure.ac" % input_dir, 'r')
+buffer_size = 1024
+opening_string = config_file.read(buffer_size)
+config_file.close()
+
+# Extract the version string from the AC_INIT macro
+#   The following init_expression means:
+#     Extract three integers separated by periods and surrounded by squre
+#     brackets(e.g. "[1.0.1]") between "AC_INIT(" and ")". Do not be greedy
+#     (*? is the non-greedy flag) since that would pull in everything between
+#     the first "(" and the last ")" in the file.
+version_expression = re.compile(r"AC_INIT\(.*?\[(\d+)\.(\d+)\.(\d+)\].*?\)",
+                                re.DOTALL)
+version_values = version_expression.search(opening_string)
+major_version = version_values.group(1)
+minor_version = version_values.group(2)
+fix_version = version_values.group(3)
+
+# Write the version information to a header file to be included in the
+# Info.plist file.
+file_data = """//
+// DO NOT MODIFY THIS FILE (but you can delete it)
+//
+// This file is autogenerated by the versiongenerate.py script. This script
+// is executed in a "Run Script" build phase when creating gtest.framework. This
+// header file is not used during compilation of C-source. Rather, it simply
+// defines some version strings for substitution in the Info.plist. Because of
+// this, we are not not restricted to C-syntax nor are we using include guards.
+//
+
+#define GTEST_VERSIONINFO_SHORT %s.%s
+#define GTEST_VERSIONINFO_LONG %s.%s.%s
+
+""" % (major_version, minor_version, major_version, minor_version, fix_version)
+version_file = open("%s/Version.h" % output_dir, 'w')
+version_file.write(file_data)
+version_file.close()
diff --git a/ThirdParty/common/gtest/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj b/ThirdParty/common/gtest/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..0452a63
--- /dev/null
+++ b/ThirdParty/common/gtest/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj
@@ -0,0 +1,1135 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		3B238F5F0E828B5400846E11 /* Check */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget "Check" */;
+			buildPhases = (
+				3B238F5E0E828B5400846E11 /* ShellScript */,
+			);
+			dependencies = (
+				40899F9D0FFA740F000B29AE /* PBXTargetDependency */,
+				40C849F7101A43440083642A /* PBXTargetDependency */,
+				4089A0980FFAD34A000B29AE /* PBXTargetDependency */,
+				40C849F9101A43490083642A /* PBXTargetDependency */,
+			);
+			name = Check;
+			productName = Check;
+		};
+		40C44ADC0E3798F4008FCC51 /* Version Info */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget "Version Info" */;
+			buildPhases = (
+				40C44ADB0E3798F4008FCC51 /* Generate Version.h */,
+			);
+			comments = "The generation of Version.h must be performed in its own target. Since the Info.plist is preprocessed before any of the other build phases in gtest, the Version.h file would not be ready if included as a build phase of that target.";
+			dependencies = (
+			);
+			name = "Version Info";
+			productName = Version.h;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */ = {isa = PBXBuildFile; fileRef = 224A12A20E9EADCC00BD17FD /* gtest-test-part.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */; };
+		3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DB0E2F799B00CF7658 /* gtest-death-test.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		404884390E2F799B00CF7658 /* gtest-message.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DC0E2F799B00CF7658 /* gtest-message.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DD0E2F799B00CF7658 /* gtest-spi.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843B0E2F799B00CF7658 /* gtest.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DE0E2F799B00CF7658 /* gtest.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883E00E2F799B00CF7658 /* gtest_prod.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		404884500E2F799B00CF7658 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 404883F60E2F799B00CF7658 /* README */; };
+		404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */; };
+		404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E30E2F799B00CF7658 /* gtest-filepath.h */; };
+		404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E40E2F799B00CF7658 /* gtest-internal.h */; };
+		404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E50E2F799B00CF7658 /* gtest-port.h */; };
+		404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E60E2F799B00CF7658 /* gtest-string.h */; };
+		404884AC0E2F7CD900CF7658 /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 404884A90E2F7CD900CF7658 /* CHANGES */; };
+		404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */ = {isa = PBXBuildFile; fileRef = 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */; };
+		404884AE0E2F7CD900CF7658 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 404884AB0E2F7CD900CF7658 /* LICENSE */; };
+		40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };
+		40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 40899F4D0FFA7271000B29AE /* gtest-tuple.h */; };
+		40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };
+		4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };
+		4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };
+		40C848FF101A21150083642A /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };
+		40C84915101A21DF0083642A /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4048840D0E2F799B00CF7658 /* gtest_main.cc */; };
+		40C84916101A235B0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C84978101A36540083642A /* libgtest_main.a in Resources */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C84980101A36850083642A /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };
+		40C84982101A36850083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };
+		40C84983101A36850083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C8498F101A36A60083642A /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };
+		40C84990101A36A60083642A /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };
+		40C84992101A36A60083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };
+		40C84993101A36A60083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C849A2101A37050083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };
+		40C849A4101A37150083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };
+		4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 4539C9330EC280AE00A70F4C /* gtest-param-test.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */; };
+		4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */; };
+		4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9370EC280E200A70F4C /* gtest-param-util.h */; };
+		4567C8181264FF71007740BE /* gtest-printers.h in Headers */ = {isa = PBXBuildFile; fileRef = 4567C8171264FF71007740BE /* gtest-printers.h */; settings = {ATTRIBUTES = (Public, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40899F420FFA7184000B29AE;
+			remoteInfo = gtest_unittest;
+		};
+		4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 4089A0120FFACEFC000B29AE;
+			remoteInfo = sample1_unittest;
+		};
+		408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C848F9101A209C0083642A;
+			remoteInfo = "gtest-static";
+		};
+		40C44AE50E379922008FCC51 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C44ADC0E3798F4008FCC51;
+			remoteInfo = Version.h;
+		};
+		40C8497C101A36850083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C848F9101A209C0083642A;
+			remoteInfo = "gtest-static";
+		};
+		40C8497E101A36850083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8490A101A217E0083642A;
+			remoteInfo = "gtest_main-static";
+		};
+		40C8498B101A36A60083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C848F9101A209C0083642A;
+			remoteInfo = "gtest-static";
+		};
+		40C8498D101A36A60083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8490A101A217E0083642A;
+			remoteInfo = "gtest_main-static";
+		};
+		40C8499B101A36DC0083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8490A101A217E0083642A;
+			remoteInfo = "gtest_main-static";
+		};
+		40C8499D101A36E50083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = "gtest-framework";
+		};
+		40C8499F101A36F10083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = "gtest-framework";
+		};
+		40C849F6101A43440083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8497A101A36850083642A;
+			remoteInfo = "gtest_unittest-static";
+		};
+		40C849F8101A43490083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C84989101A36A60083642A;
+			remoteInfo = "sample1_unittest-static";
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		404884A50E2F7C0400CF7658 /* Copy Headers Internal */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = Headers/internal;
+			dstSubfolderSpec = 6;
+			files = (
+				404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */,
+				404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */,
+				404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */,
+				4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */,
+				4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */,
+				4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */,
+				404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */,
+				404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */,
+				40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */,
+				3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */,
+			);
+			name = "Copy Headers Internal";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		224A12A10E9EADA700BD17FD /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "gtest-all.cc"; sourceTree = "<group>"; };
+		224A12A20E9EADCC00BD17FD /* gtest-test-part.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "gtest-test-part.h"; sourceTree = "<group>"; };
+		3B238C120E7FE13C00846E11 /* gtest_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_unittest.cc; sourceTree = "<group>"; };
+		3B87D2100E96B92E000D1852 /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = "<group>"; };
+		3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-type-util.h"; sourceTree = "<group>"; };
+		3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-typed-test.h"; sourceTree = "<group>"; };
+		403EE37C0E377822004BD1E2 /* versiongenerate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = versiongenerate.py; sourceTree = "<group>"; };
+		404883DB0E2F799B00CF7658 /* gtest-death-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-death-test.h"; sourceTree = "<group>"; };
+		404883DC0E2F799B00CF7658 /* gtest-message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-message.h"; sourceTree = "<group>"; };
+		404883DD0E2F799B00CF7658 /* gtest-spi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-spi.h"; sourceTree = "<group>"; };
+		404883DE0E2F799B00CF7658 /* gtest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest.h; sourceTree = "<group>"; };
+		404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_pred_impl.h; sourceTree = "<group>"; };
+		404883E00E2F799B00CF7658 /* gtest_prod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_prod.h; sourceTree = "<group>"; };
+		404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-death-test-internal.h"; sourceTree = "<group>"; };
+		404883E30E2F799B00CF7658 /* gtest-filepath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-filepath.h"; sourceTree = "<group>"; };
+		404883E40E2F799B00CF7658 /* gtest-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-internal.h"; sourceTree = "<group>"; };
+		404883E50E2F799B00CF7658 /* gtest-port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-port.h"; sourceTree = "<group>"; };
+		404883E60E2F799B00CF7658 /* gtest-string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-string.h"; sourceTree = "<group>"; };
+		404883F60E2F799B00CF7658 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../README; sourceTree = SOURCE_ROOT; };
+		4048840D0E2F799B00CF7658 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_main.cc; sourceTree = "<group>"; };
+		404884A90E2F7CD900CF7658 /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CHANGES; path = ../CHANGES; sourceTree = SOURCE_ROOT; };
+		404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CONTRIBUTORS; path = ../CONTRIBUTORS; sourceTree = SOURCE_ROOT; };
+		404884AB0E2F7CD900CF7658 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = SOURCE_ROOT; };
+		40899F430FFA7184000B29AE /* gtest_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "gtest_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; };
+		40899F4D0FFA7271000B29AE /* gtest-tuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-tuple.h"; sourceTree = "<group>"; };
+		40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = StaticLibraryTarget.xcconfig; sourceTree = "<group>"; };
+		4089A0130FFACEFC000B29AE /* sample1_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "sample1_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; };
+		4089A02C0FFACF7F000B29AE /* sample1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1.cc; sourceTree = "<group>"; };
+		4089A02D0FFACF7F000B29AE /* sample1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample1.h; sourceTree = "<group>"; };
+		4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1_unittest.cc; sourceTree = "<group>"; };
+		40C848FA101A209C0083642A /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		40C8490B101A217E0083642A /* libgtest_main.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest_main.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		40C84987101A36850083642A /* gtest_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = gtest_unittest; sourceTree = BUILT_PRODUCTS_DIR; };
+		40C84997101A36A60083642A /* sample1_unittest-static */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "sample1_unittest-static"; sourceTree = BUILT_PRODUCTS_DIR; };
+		40D4CDF10E30E07400294801 /* DebugProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugProject.xcconfig; sourceTree = "<group>"; };
+		40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FrameworkTarget.xcconfig; sourceTree = "<group>"; };
+		40D4CDF30E30E07400294801 /* General.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = General.xcconfig; sourceTree = "<group>"; };
+		40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ReleaseProject.xcconfig; sourceTree = "<group>"; };
+		40D4CF510E30F5E200294801 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		4539C8FF0EC27F6400A70F4C /* gtest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = gtest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		4539C9330EC280AE00A70F4C /* gtest-param-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-test.h"; sourceTree = "<group>"; };
+		4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-linked_ptr.h"; sourceTree = "<group>"; };
+		4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-util-generated.h"; sourceTree = "<group>"; };
+		4539C9370EC280E200A70F4C /* gtest-param-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-util.h"; sourceTree = "<group>"; };
+		4567C8171264FF71007740BE /* gtest-printers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-printers.h"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		40899F410FFA7184000B29AE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C849A4101A37150083642A /* gtest.framework in Frameworks */,
+				40C84916101A235B0083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		4089A0110FFACEFC000B29AE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C849A2101A37050083642A /* gtest.framework in Frameworks */,
+				40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C84981101A36850083642A /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84982101A36850083642A /* libgtest.a in Frameworks */,
+				40C84983101A36850083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C84991101A36A60083642A /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84992101A36A60083642A /* libgtest.a in Frameworks */,
+				40C84993101A36A60083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		034768DDFF38A45A11DB9C8B /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				4539C8FF0EC27F6400A70F4C /* gtest.framework */,
+				40C848FA101A209C0083642A /* libgtest.a */,
+				40C8490B101A217E0083642A /* libgtest_main.a */,
+				40899F430FFA7184000B29AE /* gtest_unittest-framework */,
+				40C84987101A36850083642A /* gtest_unittest */,
+				4089A0130FFACEFC000B29AE /* sample1_unittest-framework */,
+				40C84997101A36A60083642A /* sample1_unittest-static */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		0867D691FE84028FC02AAC07 /* gtest */ = {
+			isa = PBXGroup;
+			children = (
+				40D4CDF00E30E07400294801 /* Config */,
+				08FB77ACFE841707C02AAC07 /* Source */,
+				40D4CF4E0E30F5E200294801 /* Resources */,
+				403EE37B0E377822004BD1E2 /* Scripts */,
+				034768DDFF38A45A11DB9C8B /* Products */,
+			);
+			name = gtest;
+			sourceTree = "<group>";
+		};
+		08FB77ACFE841707C02AAC07 /* Source */ = {
+			isa = PBXGroup;
+			children = (
+				404884A90E2F7CD900CF7658 /* CHANGES */,
+				404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */,
+				404884AB0E2F7CD900CF7658 /* LICENSE */,
+				404883F60E2F799B00CF7658 /* README */,
+				404883D90E2F799B00CF7658 /* include */,
+				4089A02F0FFACF84000B29AE /* samples */,
+				404884070E2F799B00CF7658 /* src */,
+				3B238BF00E7FE13B00846E11 /* test */,
+			);
+			name = Source;
+			sourceTree = "<group>";
+		};
+		3B238BF00E7FE13B00846E11 /* test */ = {
+			isa = PBXGroup;
+			children = (
+				3B238C120E7FE13C00846E11 /* gtest_unittest.cc */,
+			);
+			name = test;
+			path = ../test;
+			sourceTree = SOURCE_ROOT;
+		};
+		403EE37B0E377822004BD1E2 /* Scripts */ = {
+			isa = PBXGroup;
+			children = (
+				403EE37C0E377822004BD1E2 /* versiongenerate.py */,
+				3B87D2100E96B92E000D1852 /* runtests.sh */,
+			);
+			path = Scripts;
+			sourceTree = "<group>";
+		};
+		404883D90E2F799B00CF7658 /* include */ = {
+			isa = PBXGroup;
+			children = (
+				404883DA0E2F799B00CF7658 /* gtest */,
+			);
+			name = include;
+			path = ../include;
+			sourceTree = SOURCE_ROOT;
+		};
+		404883DA0E2F799B00CF7658 /* gtest */ = {
+			isa = PBXGroup;
+			children = (
+				404883E10E2F799B00CF7658 /* internal */,
+				224A12A20E9EADCC00BD17FD /* gtest-test-part.h */,
+				404883DB0E2F799B00CF7658 /* gtest-death-test.h */,
+				404883DC0E2F799B00CF7658 /* gtest-message.h */,
+				4539C9330EC280AE00A70F4C /* gtest-param-test.h */,
+				4567C8171264FF71007740BE /* gtest-printers.h */,
+				404883DD0E2F799B00CF7658 /* gtest-spi.h */,
+				404883DE0E2F799B00CF7658 /* gtest.h */,
+				404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */,
+				404883E00E2F799B00CF7658 /* gtest_prod.h */,
+				3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */,
+			);
+			path = gtest;
+			sourceTree = "<group>";
+		};
+		404883E10E2F799B00CF7658 /* internal */ = {
+			isa = PBXGroup;
+			children = (
+				404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */,
+				404883E30E2F799B00CF7658 /* gtest-filepath.h */,
+				404883E40E2F799B00CF7658 /* gtest-internal.h */,
+				4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */,
+				4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */,
+				4539C9370EC280E200A70F4C /* gtest-param-util.h */,
+				404883E50E2F799B00CF7658 /* gtest-port.h */,
+				404883E60E2F799B00CF7658 /* gtest-string.h */,
+				40899F4D0FFA7271000B29AE /* gtest-tuple.h */,
+				3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */,
+			);
+			path = internal;
+			sourceTree = "<group>";
+		};
+		404884070E2F799B00CF7658 /* src */ = {
+			isa = PBXGroup;
+			children = (
+				224A12A10E9EADA700BD17FD /* gtest-all.cc */,
+				4048840D0E2F799B00CF7658 /* gtest_main.cc */,
+			);
+			name = src;
+			path = ../src;
+			sourceTree = SOURCE_ROOT;
+		};
+		4089A02F0FFACF84000B29AE /* samples */ = {
+			isa = PBXGroup;
+			children = (
+				4089A02C0FFACF7F000B29AE /* sample1.cc */,
+				4089A02D0FFACF7F000B29AE /* sample1.h */,
+				4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */,
+			);
+			name = samples;
+			path = ../samples;
+			sourceTree = SOURCE_ROOT;
+		};
+		40D4CDF00E30E07400294801 /* Config */ = {
+			isa = PBXGroup;
+			children = (
+				40D4CDF10E30E07400294801 /* DebugProject.xcconfig */,
+				40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */,
+				40D4CDF30E30E07400294801 /* General.xcconfig */,
+				40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */,
+				40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */,
+			);
+			path = Config;
+			sourceTree = "<group>";
+		};
+		40D4CF4E0E30F5E200294801 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				40D4CF510E30F5E200294801 /* Info.plist */,
+			);
+			path = Resources;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		8D07F2BD0486CC7A007CD1D0 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */,
+				404884390E2F799B00CF7658 /* gtest-message.h in Headers */,
+				4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */,
+				4567C8181264FF71007740BE /* gtest-printers.h in Headers */,
+				3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */,
+				4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */,
+				4048843B0E2F799B00CF7658 /* gtest.h in Headers */,
+				4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */,
+				4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */,
+				224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		40899F420FFA7184000B29AE /* gtest_unittest-framework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget "gtest_unittest-framework" */;
+			buildPhases = (
+				40899F400FFA7184000B29AE /* Sources */,
+				40899F410FFA7184000B29AE /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C849A0101A36F10083642A /* PBXTargetDependency */,
+			);
+			name = "gtest_unittest-framework";
+			productName = gtest_unittest;
+			productReference = 40899F430FFA7184000B29AE /* gtest_unittest-framework */;
+			productType = "com.apple.product-type.tool";
+		};
+		4089A0120FFACEFC000B29AE /* sample1_unittest-framework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget "sample1_unittest-framework" */;
+			buildPhases = (
+				4089A0100FFACEFC000B29AE /* Sources */,
+				4089A0110FFACEFC000B29AE /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C8499E101A36E50083642A /* PBXTargetDependency */,
+			);
+			name = "sample1_unittest-framework";
+			productName = sample1_unittest;
+			productReference = 4089A0130FFACEFC000B29AE /* sample1_unittest-framework */;
+			productType = "com.apple.product-type.tool";
+		};
+		40C848F9101A209C0083642A /* gtest-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget "gtest-static" */;
+			buildPhases = (
+				40C848F7101A209C0083642A /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "gtest-static";
+			productName = "gtest-static";
+			productReference = 40C848FA101A209C0083642A /* libgtest.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		40C8490A101A217E0083642A /* gtest_main-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget "gtest_main-static" */;
+			buildPhases = (
+				40C84908101A217E0083642A /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "gtest_main-static";
+			productName = "gtest_main-static";
+			productReference = 40C8490B101A217E0083642A /* libgtest_main.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		40C8497A101A36850083642A /* gtest_unittest-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84984101A36850083642A /* Build configuration list for PBXNativeTarget "gtest_unittest-static" */;
+			buildPhases = (
+				40C8497F101A36850083642A /* Sources */,
+				40C84981101A36850083642A /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C8497B101A36850083642A /* PBXTargetDependency */,
+				40C8497D101A36850083642A /* PBXTargetDependency */,
+			);
+			name = "gtest_unittest-static";
+			productName = gtest_unittest;
+			productReference = 40C84987101A36850083642A /* gtest_unittest */;
+			productType = "com.apple.product-type.tool";
+		};
+		40C84989101A36A60083642A /* sample1_unittest-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget "sample1_unittest-static" */;
+			buildPhases = (
+				40C8498E101A36A60083642A /* Sources */,
+				40C84991101A36A60083642A /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C8498A101A36A60083642A /* PBXTargetDependency */,
+				40C8498C101A36A60083642A /* PBXTargetDependency */,
+			);
+			name = "sample1_unittest-static";
+			productName = sample1_unittest;
+			productReference = 40C84997101A36A60083642A /* sample1_unittest-static */;
+			productType = "com.apple.product-type.tool";
+		};
+		8D07F2BC0486CC7A007CD1D0 /* gtest-framework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "gtest-framework" */;
+			buildPhases = (
+				8D07F2C10486CC7A007CD1D0 /* Sources */,
+				8D07F2BD0486CC7A007CD1D0 /* Headers */,
+				404884A50E2F7C0400CF7658 /* Copy Headers Internal */,
+				8D07F2BF0486CC7A007CD1D0 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C44AE60E379922008FCC51 /* PBXTargetDependency */,
+				408BEC101046CFE900DEF522 /* PBXTargetDependency */,
+				40C8499C101A36DC0083642A /* PBXTargetDependency */,
+			);
+			name = "gtest-framework";
+			productInstallPath = "$(HOME)/Library/Frameworks";
+			productName = gtest;
+			productReference = 4539C8FF0EC27F6400A70F4C /* gtest.framework */;
+			productType = "com.apple.product-type.framework";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		0867D690FE84028FC02AAC07 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0460;
+			};
+			buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "gtest" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 1;
+			knownRegions = (
+				English,
+				Japanese,
+				French,
+				German,
+				en,
+			);
+			mainGroup = 0867D691FE84028FC02AAC07 /* gtest */;
+			productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				8D07F2BC0486CC7A007CD1D0 /* gtest-framework */,
+				40C848F9101A209C0083642A /* gtest-static */,
+				40C8490A101A217E0083642A /* gtest_main-static */,
+				40899F420FFA7184000B29AE /* gtest_unittest-framework */,
+				40C8497A101A36850083642A /* gtest_unittest-static */,
+				4089A0120FFACEFC000B29AE /* sample1_unittest-framework */,
+				40C84989101A36A60083642A /* sample1_unittest-static */,
+				3B238F5F0E828B5400846E11 /* Check */,
+				40C44ADC0E3798F4008FCC51 /* Version Info */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		8D07F2BF0486CC7A007CD1D0 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				404884500E2F799B00CF7658 /* README in Resources */,
+				404884AC0E2F7CD900CF7658 /* CHANGES in Resources */,
+				404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */,
+				404884AE0E2F7CD900CF7658 /* LICENSE in Resources */,
+				40C84978101A36540083642A /* libgtest_main.a in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3B238F5E0E828B5400846E11 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# Remember, this \"Run Script\" build phase will be executed from $SRCROOT\n/bin/bash Scripts/runtests.sh";
+		};
+		40C44ADB0E3798F4008FCC51 /* Generate Version.h */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"$(SRCROOT)/Scripts/versiongenerate.py",
+				"$(SRCROOT)/../configure.ac",
+			);
+			name = "Generate Version.h";
+			outputPaths = (
+				"$(PROJECT_TEMP_DIR)/Version.h",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# Remember, this \"Run Script\" build phase will be executed from $SRCROOT\n/usr/bin/python Scripts/versiongenerate.py ../ $PROJECT_TEMP_DIR";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		40899F400FFA7184000B29AE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		4089A0100FFACEFC000B29AE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */,
+				4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C848F7101A209C0083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C848FF101A21150083642A /* gtest-all.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C84908101A217E0083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84915101A21DF0083642A /* gtest_main.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C8497F101A36850083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84980101A36850083642A /* gtest_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C8498E101A36A60083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C8498F101A36A60083642A /* sample1.cc in Sources */,
+				40C84990101A36A60083642A /* sample1_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D07F2C10486CC7A007CD1D0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		40899F9D0FFA740F000B29AE /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40899F420FFA7184000B29AE /* gtest_unittest-framework */;
+			targetProxy = 40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */;
+		};
+		4089A0980FFAD34A000B29AE /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 4089A0120FFACEFC000B29AE /* sample1_unittest-framework */;
+			targetProxy = 4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */;
+		};
+		408BEC101046CFE900DEF522 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C848F9101A209C0083642A /* gtest-static */;
+			targetProxy = 408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */;
+		};
+		40C44AE60E379922008FCC51 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C44ADC0E3798F4008FCC51 /* Version Info */;
+			targetProxy = 40C44AE50E379922008FCC51 /* PBXContainerItemProxy */;
+		};
+		40C8497B101A36850083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C848F9101A209C0083642A /* gtest-static */;
+			targetProxy = 40C8497C101A36850083642A /* PBXContainerItemProxy */;
+		};
+		40C8497D101A36850083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8490A101A217E0083642A /* gtest_main-static */;
+			targetProxy = 40C8497E101A36850083642A /* PBXContainerItemProxy */;
+		};
+		40C8498A101A36A60083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C848F9101A209C0083642A /* gtest-static */;
+			targetProxy = 40C8498B101A36A60083642A /* PBXContainerItemProxy */;
+		};
+		40C8498C101A36A60083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8490A101A217E0083642A /* gtest_main-static */;
+			targetProxy = 40C8498D101A36A60083642A /* PBXContainerItemProxy */;
+		};
+		40C8499C101A36DC0083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8490A101A217E0083642A /* gtest_main-static */;
+			targetProxy = 40C8499B101A36DC0083642A /* PBXContainerItemProxy */;
+		};
+		40C8499E101A36E50083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;
+			targetProxy = 40C8499D101A36E50083642A /* PBXContainerItemProxy */;
+		};
+		40C849A0101A36F10083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;
+			targetProxy = 40C8499F101A36F10083642A /* PBXContainerItemProxy */;
+		};
+		40C849F7101A43440083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8497A101A36850083642A /* gtest_unittest-static */;
+			targetProxy = 40C849F6101A43440083642A /* PBXContainerItemProxy */;
+		};
+		40C849F9101A43490083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C84989101A36A60083642A /* sample1_unittest-static */;
+			targetProxy = 40C849F8101A43490083642A /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		3B238F600E828B5400846E11 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = Check;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		3B238F610E828B5400846E11 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				COPY_PHASE_STRIP = YES;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = Check;
+				SDKROOT = macosx;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		40899F450FFA7185000B29AE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = "gtest_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40899F460FFA7185000B29AE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = "gtest_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		4089A0150FFACEFD000B29AE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		4089A0160FFACEFD000B29AE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C44ADF0E3798F4008FCC51 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				TARGET_NAME = gtest;
+			};
+			name = Debug;
+		};
+		40C44AE00E3798F4008FCC51 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				TARGET_NAME = gtest;
+			};
+			name = Release;
+		};
+		40C848FB101A209D0083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C848FC101A209D0083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C8490E101A217F0083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest_main;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C8490F101A217F0083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest_main;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C84985101A36850083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = gtest_unittest;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C84986101A36850083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = gtest_unittest;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C84995101A36A60083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-static";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C84996101A36A60083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-static";
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		4FADC24308B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				INFOPLIST_FILE = Resources/Info.plist;
+				INFOPLIST_PREFIX_HEADER = "$(PROJECT_TEMP_DIR)/Version.h";
+				INFOPLIST_PREPROCESS = YES;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Debug;
+		};
+		4FADC24408B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				INFOPLIST_FILE = Resources/Info.plist;
+				INFOPLIST_PREFIX_HEADER = "$(PROJECT_TEMP_DIR)/Version.h";
+				INFOPLIST_PREPROCESS = YES;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Release;
+		};
+		4FADC24708B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF10E30E07400294801 /* DebugProject.xcconfig */;
+			buildSettings = {
+			};
+			name = Debug;
+		};
+		4FADC24808B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */;
+			buildSettings = {
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget "Check" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3B238F600E828B5400846E11 /* Debug */,
+				3B238F610E828B5400846E11 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget "gtest_unittest-framework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40899F450FFA7185000B29AE /* Debug */,
+				40899F460FFA7185000B29AE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget "sample1_unittest-framework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4089A0150FFACEFD000B29AE /* Debug */,
+				4089A0160FFACEFD000B29AE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget "Version Info" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C44ADF0E3798F4008FCC51 /* Debug */,
+				40C44AE00E3798F4008FCC51 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget "gtest-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C848FB101A209D0083642A /* Debug */,
+				40C848FC101A209D0083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget "gtest_main-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C8490E101A217F0083642A /* Debug */,
+				40C8490F101A217F0083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84984101A36850083642A /* Build configuration list for PBXNativeTarget "gtest_unittest-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C84985101A36850083642A /* Debug */,
+				40C84986101A36850083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget "sample1_unittest-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C84995101A36A60083642A /* Debug */,
+				40C84996101A36A60083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "gtest-framework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24308B4156D00ABE55E /* Debug */,
+				4FADC24408B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "gtest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24708B4156D00ABE55E /* Debug */,
+				4FADC24808B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
+}
diff --git a/VERSION.cmake b/VERSION.cmake
new file mode 100644
index 0000000..f8d0c23
--- /dev/null
+++ b/VERSION.cmake
@@ -0,0 +1,3 @@
+set(BornAgain_VERSION_MAJOR 1)
+set(BornAgain_VERSION_MINOR 7)
+set(BornAgain_VERSION_PATCH 0)
diff --git a/Wrap/WinDllMacros.h b/Wrap/WinDllMacros.h
new file mode 100644
index 0000000..cda5600
--- /dev/null
+++ b/Wrap/WinDllMacros.h
@@ -0,0 +1,34 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Wrap/WinDllMacros.h
+//! @brief     Defines macroses for building dll.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef WINDLLMACROS_H
+#define WINDLLMACROS_H
+
+#ifdef _WIN32
+
+#ifdef BA_CORE_BUILD_DLL
+
+#define BA_CORE_API_ __declspec(dllexport)
+#else
+#define BA_CORE_API_ __declspec(dllimport)
+#endif  // BA_CORE_BUILD_DLL
+
+#endif  // _WIN32
+
+#ifndef BA_CORE_API_
+#define BA_CORE_API_
+#endif
+
+#endif // WINDLLMACROS_H
diff --git a/Wrap/python/README b/Wrap/python/README
new file mode 100644
index 0000000..b5816c4
--- /dev/null
+++ b/Wrap/python/README
@@ -0,0 +1,10 @@
+Python utilities to setup and use BornAgain libraries
+
+1) Installation script
+      bornagain_python_install.py (Mac only)
+
+2) End-user code
+      __init__.py
+      plot_utils.py
+to be installed into lib directory. The goal is to have
+the directive 'import bornagain' available on Python.
diff --git a/Wrap/python/__init__.py.in b/Wrap/python/__init__.py.in
new file mode 100644
index 0000000..6d90ffe
--- /dev/null
+++ b/Wrap/python/__init__.py.in
@@ -0,0 +1,13 @@
+import sys
+import os
+
+sys.path.append(os.path.abspath(
+                os.path.join(os.path.split(__file__)[0], '@BA_MODULES_IMPORT_PATH@')))
+
+from libBornAgainFit import *
+from libBornAgainCore import *
+
+# this line needed to fix python3 import problem
+sys.path.append(os.path.abspath(os.path.dirname(__file__)))
+
+from plot_utils import *
diff --git a/Wrap/python/bornagain_python_install.py b/Wrap/python/bornagain_python_install.py
new file mode 100644
index 0000000..b4365b3
--- /dev/null
+++ b/Wrap/python/bornagain_python_install.py
@@ -0,0 +1,297 @@
+"""
+Installs BornAgain libraries into user Python (Mac only).
+
+Usage: python bornagain_python_install.py
+
+The script generates BornAgain python package in temporary directory and then 
+installs it into user's Python site_packages.
+
+Requirements: BornAgain.app has to be installed on the system using .dmg installer.
+
+During generation of Python package
+1) The script copies BornAgain libraries from the GUI installation directory (normally 
+   it is /Applications/BornAgain.app) into temporary bundle directory
+2) Adjusts libraries using Mac's install_name_tool to rely on Python's own libpython2.7.dylib.
+   The exact site-packages library location is deduced from the interpreter itself.
+3) Generates other files necessary for Python packaging (setup.py, __init__.py)
+
+During installation of Python package
+1) The script just runs standard 'python setup.py install' command from the temporary bundle directory
+"""
+
+import os
+import sys
+import sysconfig
+import glob
+import tempfile
+import shutil
+import platform
+import site
+from distutils.sysconfig import get_python_lib
+
+
+BORNAGAIN_VERSION = "0.0"
+
+def run_command(cmd):
+    #print ">>>", cmd
+    returncode = os.system(cmd)
+    if returncode:
+        exit("Error while running command '"+cmd+"'")
+
+
+def get_python_shared_library():
+    """
+    Returns full path to the python shared library on which current interpreter is relying
+    """
+    prefix = sys.prefix
+    suffix = sysconfig.get_config_var('LDVERSION') or sysconfig.get_config_var('VERSION')
+    result = sys.prefix+"/lib/libpython"+suffix+".dylib"
+    return result
+
+
+def get_script_path():
+    """
+    Returns the full path to the directory where given scripts resides
+    """
+    return os.path.dirname(os.path.realpath(sys.argv[0]))
+
+
+def get_application_dir():
+    """
+    Returns BornAgain.app directory location, determines BornAgain version number
+    """
+    global BORNAGAIN_VERSION
+    app_dir = ""
+    if len(sys.argv) == 2:
+        app_dir = sys.argv[1]
+    else:
+        script_dir = get_script_path()
+        app_dir = os.path.abspath(os.path.join(script_dir, "..", "..", ".."))
+        
+    # getting version number
+    lib_dir = glob.glob( os.path.join(app_dir, "Contents", "lib", "BornAgain-*"))
+    if len(lib_dir) != 1:
+        exit("Can't find BornAgain libraries in "+app_dir)
+    
+    BORNAGAIN_VERSION = lib_dir[0].split("BornAgain-")[1]
+    return app_dir
+
+    
+def create_bundle_temp_dir():
+    """
+    Creates temporary directory for BornAgain package bundle
+    """
+    tmpdir = os.path.join(tempfile.gettempdir(), "bornagain_bundle")
+    if os.path.exists(tmpdir):
+        shutil.rmtree(tmpdir)
+    os.makedirs(tmpdir)
+    return tmpdir
+
+
+def create_package_dir(destination_dir):
+    """
+    Create package directory in bundle directory
+    """
+    packagedir = os.path.join(destination_dir, "bornagain")
+    os.makedirs(packagedir)
+    return packagedir
+
+
+def create_library_dir(destination_dir):
+    """
+    Create library directory in bundle directory
+    """
+    librarydir = os.path.join(destination_dir, "lib")
+    os.makedirs(librarydir)
+    return librarydir
+
+
+def generate_setup_py(destination_dir):
+    """
+    Generates setup.py file in BornAgain's bundle directory
+    """
+    text = '''\
+# BornAgain setup.py to install BornAgain libraries into Python's site-packages             
+# Usage: python setup.py install
+
+import os
+import glob
+from setuptools import setup
+
+
+datadir = os.path.join('bornagain', 'lib','BornAgain-{0}')
+datafiles = [(datadir, [f for f in glob.glob(os.path.join(datadir, '*'))])]
+
+datadir = os.path.join('bornagain', 'lib','Frameworks')
+datafiles += [(datadir, [f for f in glob.glob(os.path.join(datadir, '*'))])]
+
+setup(name='bornagain',
+    version='{0}',
+    description='Simulate and fit grazing-incidence small-angle scattering',
+    url='www.bornagainproject.org',
+    author='Scientific Computing Group at MLZ',
+    author_email='contact at bornagainproject.org',
+    license='GPL',
+    packages=['bornagain'],
+    data_files = datafiles,
+    zip_safe=False,
+    )
+'''.format(BORNAGAIN_VERSION)
+    with open(os.path.join(destination_dir, "setup.py"), "w") as fout:
+        fout.write(text)
+        fout.close()
+    pass
+
+
+def generate_init_py(destination_dir):
+    """
+    Generates __init__.py file in BornAgain's Python package directory
+    """
+    text = '''\
+import sys
+import os
+
+sys.path.append(
+    os.path.join(os.path.abspath(os.path.dirname(__file__)), "lib/BornAgain-{0}")
+    )
+
+from libBornAgainCore import *
+from libBornAgainFit import * 
+    
+'''.format(BORNAGAIN_VERSION)
+    with open(os.path.join(destination_dir,"__init__.py"), "w") as fout:
+        fout.write(text)
+        fout.close()
+    pass
+
+
+def prepare_init_module(app_dir, bundle_dir):
+    source_dir = os.path.join(app_dir, "Contents", "libexec")
+    libexec_dir = os.path.join(source_dir, "BornAgain-"+BORNAGAIN_VERSION, "bornagain")    
+    package_dir = os.path.join(bundle_dir, "bornagain")
+    print "--> Copying modules from '{0}' to '{1}'".format(libexec_dir, package_dir)
+    shutil.copytree(libexec_dir, package_dir)
+    return package_dir
+    
+
+def copy_libraries(app_dir, destination_dir):
+    """
+    Copy libraries from BornAgain.app into corresponding BornAgain Python package directory
+    """
+    print "--> Copying libraries from '{0}'".format(app_dir)
+    app_bornagainlib_dir = os.path.join(app_dir, "Contents", "lib", "BornAgain-"+BORNAGAIN_VERSION)
+    app_frameworks_dir = os.path.join(app_dir, "Contents", "Frameworks")
+
+    # copying BornAgain libraries
+    shutil.copytree(app_bornagainlib_dir, os.path.join(destination_dir, "BornAgain-"+BORNAGAIN_VERSION))
+
+    # cleaning unnecessary files
+    libfiles = glob.glob(os.path.join(destination_dir, '*/libBornAgainGUI*'))
+    for f in libfiles:
+        os.remove(f)
+    pass
+
+    # copying libraries from Frameworks
+    frameworks_libs = glob.glob(os.path.join(app_frameworks_dir, 'lib*'))
+    frameworks_dest = os.path.join(destination_dir, "Frameworks")
+    if not os.path.exists(frameworks_dest):
+        os.makedirs(frameworks_dest)
+    for lib in frameworks_libs:
+        shutil.copyfile(lib, os.path.join(frameworks_dest, os.path.basename(lib)))
+
+
+def patch_libraries(dir_name):
+    """
+    Patches libraries depending on Python to point on the same shared libpython2.7.dylib which current interpreter is using
+    """
+    print "--> Patching libraries to rely on '{0}'".format(get_python_shared_library())
+    libfiles = glob.glob(os.path.join(dir_name, '*/_libBornAgain*'))
+    for f in libfiles:
+        if "libBornAgainCore" in f or "libBornAgainFit" in f:
+            cmd = "install_name_tool -delete_rpath  @loader_path/../../Frameworks " + f
+            run_command(cmd)
+        cmd = "install_name_tool -add_rpath  @loader_path/../Frameworks " + f
+        run_command(cmd)
+        if "libBornAgainCore" in f:
+            cmd = "install_name_tool -add_rpath  @loader_path/. " + f
+            run_command(cmd)
+
+    libfiles += glob.glob(os.path.join(dir_name, '*/libboost_python*'))
+    for f in libfiles:
+        # cmd = "install_name_tool -change @rpath/libpython2.7.dylib " + get_python_shared_library() + " " + f
+        cmd = "install_name_tool -change @rpath/Python.framework/Versions/2.7/Python " + get_python_shared_library() + " " + f
+        run_command(cmd)
+
+    pass
+
+    
+def create_bundle(app_dir):
+    """
+    Creates ready to install BornAgain Python bundle package
+    """
+    bundle_dir = create_bundle_temp_dir()
+    print '-'*80
+    print "Generating Python bundle in temporary '{0}'".format(bundle_dir)
+    print '-'*80
+
+    print "--> Generating bundle setup files"
+    
+    generate_setup_py(bundle_dir)
+    
+    package_dir = prepare_init_module(app_dir, bundle_dir)
+    
+    library_dir = create_library_dir(package_dir)
+    copy_libraries(app_dir, library_dir)
+    
+    patch_libraries(library_dir)
+    
+    print "\nBornAgain Python bundle is successfully created in temporary directory '{0}'".format(bundle_dir)
+    print "Run 'python setup.py install' from there to install it into your Python's site-packages"
+    return bundle_dir
+        
+
+def install_bundle(dir_name):
+    """
+    Installs BornAgain Python bundle previously generated in the directory dir_name
+    """
+    print '-'*80
+    print "Installing bundle in Python site-packages '{0}'".format(get_python_lib())
+    print '-'*80
+    
+    os.chdir(bundle_dir)
+    sys.argv = ['setup.py', 'install']
+    execfile('setup.py')
+    print "\nBornAgain Python bundle is successfully installed in '{0}'".format(get_python_lib())
+    print "Congratulations!"
+    
+    
+if __name__ == '__main__':
+    if not platform.system() == 'Darwin':
+        exit("This script is intended for MacOs systems. Exiting...")
+        
+    app_dir = get_application_dir()
+    
+    print '-'*80
+    print "Installation of BornAgain-{0} libraries into site-packages of your Python".format(BORNAGAIN_VERSION)
+    print '-'*80
+    print "From :", app_dir
+    print "To   :", get_python_lib()
+    print " "
+    print "Possible options:"
+    print "[0] - Generate bundle with BornAgain libraries, do not install it."
+    print "[1] - Generate bundle and install it into site-packages of your Python."
+    print "[2] - Exit"
+    
+    var = int(raw_input("Enter your choice [1]: ") or "1")
+            
+    if var == 0:
+        create_bundle(app_dir)
+    elif var == 1:
+        bundle_dir = create_bundle(app_dir)
+        install_bundle(bundle_dir)
+    else:
+        exit("Good bye")
+        
+
+
+
diff --git a/Wrap/python/plot_utils.py b/Wrap/python/plot_utils.py
new file mode 100644
index 0000000..e7320cb
--- /dev/null
+++ b/Wrap/python/plot_utils.py
@@ -0,0 +1,214 @@
+#  **************************************************************************  #
+'''
+#   BornAgain: simulate and fit scattering at grazing incidence
+#
+#   @file      Wrap/python.plot_utils
+#   @brief     Python extensions of the SWIG-generated Python module bornagain.
+#
+#   @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+#   @license   GNU General Public License v3 or higher (see COPYING)
+#   @copyright Forschungszentrum Juelich GmbH 2016
+#   @authors   Scientific Computing Group at MLZ Garching
+#   @authors   J. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+'''
+#  **************************************************************************  #
+
+from __future__ import print_function
+from bornagain import deg as deg
+from bornagain import IFitObserver as IFitObserver
+import bornagain as ba
+
+def standardIntensityPlot(result):
+    """
+    Plots intensity map.
+    """
+    import matplotlib
+    import sys
+    from matplotlib import pyplot as plt
+
+    zmin, zmax = 1.0, result.getMaximum()
+    if zmin >= zmax:
+        zmax = 1.0
+        zmin = 1e-6*zmax
+
+    im = plt.imshow(
+        result.getArray(),
+        norm=matplotlib.colors.LogNorm(zmin, zmax),
+        extent=[result.getXmin()/deg, result.getXmax()/deg,
+                result.getYmin()/deg, result.getYmax()/deg],
+        aspect='auto',
+    )
+    cb = plt.colorbar(im)
+    cb.set_label(r'Intensity (arb. u.)', size=16)
+    plt.xlabel(r'$\phi_f (^{\circ})$', fontsize=16)
+    plt.ylabel(r'$\alpha_f (^{\circ})$', fontsize=16)
+    plt.show()
+
+
+def exoticIntensityPlot(result):
+    """
+    Plots intensity map.
+    """
+    import matplotlib
+    import sys
+    from matplotlib import pyplot as plt
+    from matplotlib import rc
+    rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
+    rc('text', usetex=True)
+    im = plt.imshow(
+        result.getArray(),
+        norm=matplotlib.colors.LogNorm(1.0, result.getMaximum()),
+        extent=[result.getXmin()/deg, result.getXmax()/deg,
+                result.getYmin()/deg, result.getYmax()/deg],
+        aspect='auto',
+    )
+    cb = plt.colorbar(im)
+    cb.set_label(r'Intensity (arb. u.)', size=16)
+    plt.xlabel(r'$\phi_f (^{\circ})$', fontsize=16)
+    plt.ylabel(r'$\alpha_f (^{\circ})$', fontsize=16)
+    plt.title(sys.argv[0])
+    plt.show()
+
+
+def standardIntensitySave(filename, result):
+    """
+    Saves simulation result, which must be in an intensity map,
+    or a dictionary of such maps.
+    """
+    ba.IntensityDataIOFactory.writeIntensityData(result, filename+".int")
+
+class FlowSeq( list ):
+    pass
+
+def yamlDump(filename, data):
+    """
+    Saves an arbitrary hierarchical data set as YAML-formatted text file.
+    """
+    import yaml
+    global yaml
+    from collections import OrderedDict
+    class ImprovedDumper(yaml.Dumper):
+        pass
+    def odict_representer(dumper, data):
+        return dumper.represent_mapping(
+            yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
+            data.items())
+    def flowseq_representer(dumper, data):
+        return dumper.represent_sequence(
+            yaml.resolver.BaseResolver.DEFAULT_SEQUENCE_TAG,
+            data,
+            flow_style=True )
+    ImprovedDumper.add_representer(OrderedDict, odict_representer)
+    ImprovedDumper.add_representer(FlowSeq, flowseq_representer)
+    with open(filename+".yaml", "w") as f:
+        f.write(yaml.dump(data, None, ImprovedDumper,
+                          allow_unicode=True, encoding='utf-8',
+                          default_flow_style=False, indent=4, width=70).decode('utf-8'))
+
+
+def getFilenameOrPlotflag():
+    """
+    Used at beginning of main program, this function returns a filename or a flag
+    obtained from the command-line argument, or prints a help message and exit.
+    """
+    import sys
+    # if len(sys.argv)<=1:
+    #     print("Usage:")
+    #     print("  " + sys.argv[0] + " -p                           # to plot results")
+    #     print("  " + sys.argv[0] + " <filename without extension> # to save results")
+    #     sys.exit()
+    # return sys.argv[1]
+    if len(sys.argv)<=1:
+        return '-p'
+    else:
+        return sys.argv[1]
+
+
+def simulateThenPlotOrSave(
+        simulate, plot=standardIntensityPlot, save=standardIntensitySave):
+    """
+    Runs a simulation. Then plots the function or saves the result,
+    depending on the command-line argument argv[1].
+    """
+    arg = getFilenameOrPlotflag()
+    result = simulate()
+    if arg == '-p':
+        plot(result)
+        return
+    # save result
+    if type(result) is dict:
+        for name, subresult in result.items(): # inefficient under Py2, but good enough
+            save(arg+"."+str(name), subresult)
+    else:
+        save(arg+".ref", result)
+
+
+def plot_intensity_data(intensity_data, plot=standardIntensityPlot, save=standardIntensitySave):
+    """
+    Plots intensity data (if no command line arguments are provided).
+    If there is an additional command line arguments, silently saves the data into the file for testing purposes.
+    """
+    import sys
+    if len(sys.argv) <= 1:
+        plot(intensity_data)
+
+    else:
+        filename = sys.argv[1]
+        # save result
+        if type(intensity_data) is dict:
+            for name, subresult in intensity_data.items():  # inefficient under Py2, but good enough
+                save(filename+"."+str(name), subresult)
+        else:
+            save(filename+".ref", intensity_data)
+
+
+class DefaultFitObserver(IFitObserver):
+    """
+    Draws fit progress every nth iteration. This class has to be attached to
+    FitSuite via attachObserver method.
+    FitSuite kernel will call DrawObserver's update() method every n'th iteration.
+    It is up to the user what to do here.
+    """
+
+    def __init__(self, draw_every_nth=10):
+        IFitObserver.__init__(self, draw_every_nth)
+
+        import matplotlib
+        from matplotlib import pyplot as plt
+        global matplotlib, plt
+
+        self.fig = plt.figure(figsize=(10.25, 7.69))
+        self.fig.canvas.draw()
+        plt.ion()
+
+    def plot(self, data, title, nplot, min=1, max=1e6):
+        plt.subplot(2, 2, nplot)
+        plt.subplots_adjust(wspace=0.2, hspace=0.2)
+        im = plt.imshow(data.getArray(),
+                        norm=matplotlib.colors.LogNorm(min, max),
+                        extent=[data.getXmin(), data.getXmax(), data.getYmin(), data.getYmax()],
+                        aspect='auto')
+        plt.colorbar(im)
+        plt.title(title)
+
+    def update(self, fit_suite):
+        self.fig.clf()
+        real_data = fit_suite.getRealData()
+        self.plot(real_data, "\"Real\" data", nplot=1, min=1.0, max=real_data.getMaximum())
+        self.plot(fit_suite.getSimulationData(), "Simulated data", nplot=2, min=1.0, max=real_data.getMaximum())
+        self.plot(fit_suite.getChiSquaredMap(), "Chi2 map", nplot=3, min=0.001, max=10.0)
+
+        plt.subplot(2, 2, 4)
+        plt.title('Parameters')
+        plt.axis('off')
+        plt.text(0.01, 0.85, "Iterations  " + '{:d}     {:s}'.
+                 format(fit_suite.numberOfIterations(), fit_suite.minimizer().minimizerName()))
+        plt.text(0.01, 0.75, "Chi2       " + '{:8.4f}'.format(fit_suite.getChi2()))
+        for index, fitPar in enumerate(fit_suite.fitParameters()):
+            plt.text(0.01, 0.55 - index*0.1,  '{:30.30s}: {:6.3f}'.format(fitPar.name(), fitPar.value()))
+
+        plt.draw()
+        plt.pause(0.01)
+
+        if fit_suite.isLastIteration():
+            plt.ioff()
diff --git a/Wrap/swig/DoxyfileSwig.in b/Wrap/swig/DoxyfileSwig.in
new file mode 100644
index 0000000..dcdf84e
--- /dev/null
+++ b/Wrap/swig/DoxyfileSwig.in
@@ -0,0 +1,1194 @@
+# Doxyfile 1.8.5
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "BornAgain"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = @BornAgain_VERSION_MAJOR at .@BornAgain_VERSION_MINOR at .@BornAgain_VERSION_PATCH@
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Simulate and fit neutron and x-ray scattering at grazing incidence"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = @TMP_DIR@
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-
+# Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,
+# Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,
+# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,
+# Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+ALIASES                += homepage="@par Homepage:\n"
+ALIASES                += license="@par License:\n"
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = YES
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = # DoxygenLayout.xml
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. Do not use file names with spaces, bibtex cannot handle them. See
+# also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.cpp *.h *.doc *.py
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */PythonAPI/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = NO
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+GENERATE_HTML          = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+GENERATE_LATEX         = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+GENERATE_RTF           = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+GENERATE_MAN           = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+# Note: we must set this to YES for doxy2swig.py
+
+GENERATE_XML           = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             =
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+GENERATE_DOCBOOK       = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+GENERATE_PERLMOD       = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all refrences to function-like macros that are alone on a line, have an
+# all uppercase name, and do not end with a semicolon. Such function macros are
+# typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have an unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+DOT_GRAPH_MAX_NODES = 400
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes.
diff --git a/Wrap/swig/directors.i b/Wrap/swig/directors.i
new file mode 100644
index 0000000..b9483fe
--- /dev/null
+++ b/Wrap/swig/directors.i
@@ -0,0 +1,15 @@
+ // manually declare which classes can be derived in Python and passed back to C++
+ // this can be used to reduce the bloat in the swig-generated code
+
+%feature("director") IMultiLayerBuilder;
+%feature("director") INamed;
+%feature("director") INamedShared;
+%feature("director") IParameterized;
+%feature("director") IParameterizedShared;
+%feature("director") IParameterizedTemplate<ICloneable>;
+%feature("director") IParameterizedTemplate<IShareable>;
+%feature("director") ISample;
+%feature("director") IFormFactor;
+%feature("director") IFormFactorBorn;
+%feature("director") IFitObserver;
+%feature("director") IObservable;
diff --git a/Wrap/swig/doxy2swig.py b/Wrap/swig/doxy2swig.py
new file mode 100755
index 0000000..7fb59d4
--- /dev/null
+++ b/Wrap/swig/doxy2swig.py
@@ -0,0 +1,379 @@
+#!/usr/bin/env python
+"""Doxygen XML to SWIG docstring converter.
+
+Converts Doxygen generated XML files into a file containing docstrings
+that can be used by SWIG-1.3.x.  Note that you need to get SWIG
+version > 1.3.23 or use Robin Dunn's docstring patch to be able to use
+the resulting output.
+
+Usage:
+
+  doxy2swig.py input.xml output.i
+
+input.xml is your doxygen generated XML file and output.i is where the
+output will be written (the file will be clobbered).
+
+"""
+
+# This code is implemented using Mark Pilgrim's code as a guideline:
+#   http://www.faqs.org/docs/diveintopython/kgp_divein.html
+#
+# Author: Prabhu Ramachandran
+# License: BSD style
+#
+# update 01.03.2016:
+# This version has been modified by Jonathan Fisher (j.fisher at fz-juelich.de)
+# to be forwards-compatible with Python 3
+
+from __future__ import print_function
+from xml.dom import minidom
+import re
+import textwrap
+import sys
+import types
+import os.path
+
+
+def my_open_read(source):
+    if hasattr(source, "read"):
+        return source
+    else:
+        return open(source)
+
+def my_open_write(dest, mode='w'):
+    if hasattr(dest, "write"):
+        return dest
+    else:
+        return open(dest, mode)
+
+
+class Doxy2SWIG:
+    """Converts Doxygen generated XML files into a file containing
+    docstrings that can be used by SWIG-1.3.x that have support for
+    feature("docstring").  Once the data is parsed it is stored in
+    self.pieces.
+
+    """
+
+    def __init__(self, src):
+        """Initialize the instance given a source object (file or
+        filename).
+
+        """
+        f = my_open_read(src)
+        self.my_dir = os.path.dirname(f.name)
+        self.xmldoc = minidom.parse(f).documentElement
+        f.close()
+
+        self.pieces = []
+        self.pieces.append('\n// File: %s\n'%\
+                           os.path.basename(f.name))
+
+        self.space_re = re.compile(r'\s+')
+        self.lead_spc = re.compile(r'^(%feature\S+\s+\S+\s*?)"\s+(\S)')
+        self.multi = 0
+        self.ignores = ('inheritancegraph', 'param', 'listofallmembers',
+                        'innerclass', 'name', 'declname', 'incdepgraph',
+                        'invincdepgraph', 'programlisting', 'type',
+                        'references', 'referencedby', 'location',
+                        'collaborationgraph', 'reimplements',
+                        'reimplementedby', 'derivedcompoundref',
+                        'basecompoundref')
+        #self.generics = []
+
+    def generate(self):
+        """Parses the file set in the initialization.  The resulting
+        data is stored in `self.pieces`.
+
+        """
+        self.parse(self.xmldoc)
+
+    def parse(self, node):
+        """Parse a given node.  This function in turn calls the
+        `parse_<nodeType>` functions which handle the respective
+        nodes.
+
+        """
+        pm = getattr(self, "parse_%s"%node.__class__.__name__)
+        pm(node)
+
+    def parse_Document(self, node):
+        self.parse(node.documentElement)
+
+    def parse_Text(self, node):
+        txt = node.data
+        txt = txt.replace('\\', r'\\\\')
+        txt = txt.replace('"', r'\"')
+        # ignore pure whitespace
+        m = self.space_re.match(txt)
+        if m and len(m.group()) == len(txt):
+            pass
+        else:
+            #self.add_text(textwrap.fill(txt))
+            self.add_text(txt)
+
+    def parse_Element(self, node):
+        """Parse an `ELEMENT_NODE`.  This calls specific
+        `do_<tagName>` handers for different elements.  If no handler
+        is available the `generic_parse` method is called.  All
+        tagNames specified in `self.ignores` are simply ignored.
+
+        """
+        name = node.tagName
+        ignores = self.ignores
+        if name in ignores:
+            return
+        attr = "do_%s" % name
+        if hasattr(self, attr):
+            handlerMethod = getattr(self, attr)
+            handlerMethod(node)
+        else:
+            self.generic_parse(node)
+            #if name not in self.generics: self.generics.append(name)
+
+    def add_text(self, value):
+        """Adds text corresponding to `value` into `self.pieces`."""
+        #if type(value) in (types.ListType, types.TupleType):
+        if type(value) in (list, tuple):
+            self.pieces.extend(value)
+        else:
+            self.pieces.append(value)
+
+    def get_specific_nodes(self, node, names):
+        """Given a node and a sequence of strings in `names`, return a
+        dictionary containing the names as keys and child
+        `ELEMENT_NODEs`, that have a `tagName` equal to the name.
+
+        """
+        nodes = [(x.tagName, x) for x in node.childNodes \
+                 if x.nodeType == x.ELEMENT_NODE and \
+                 x.tagName in names]
+        return dict(nodes)
+
+    def generic_parse(self, node, pad=0):
+        """A Generic parser for arbitrary tags in a node.
+
+        Parameters:
+
+         - node:  A node in the DOM.
+         - pad: `int` (default: 0)
+
+           If 0 the node data is not padded with newlines.  If 1 it
+           appends a newline after parsing the childNodes.  If 2 it
+           pads before and after the nodes are processed.  Defaults to
+           0.
+
+        """
+        npiece = 0
+        if pad:
+            npiece = len(self.pieces)
+            if pad == 2:
+                self.add_text('\n')
+        for n in node.childNodes:
+            self.parse(n)
+        if pad:
+            if len(self.pieces) > npiece:
+                self.add_text('\n')
+
+    def space_parse(self, node):
+        self.add_text(' ')
+        self.generic_parse(node)
+
+    do_ref = space_parse
+    do_emphasis = space_parse
+    do_bold = space_parse
+    do_computeroutput = space_parse
+    do_formula = space_parse
+
+    def do_compoundname(self, node):
+        self.add_text('\n\n')
+        data = node.firstChild.data
+        self.add_text('%%feature("docstring") %s "\n'%data)
+
+    def do_compounddef(self, node):
+        kind = node.attributes['kind'].value
+        if kind in ('class', 'struct'):
+            prot = node.attributes['prot'].value
+            if prot != 'public':
+                return
+            names = ('compoundname', 'briefdescription',
+                     'detaileddescription', 'includes')
+            first = self.get_specific_nodes(node, names)
+            for n in names:
+                #if first.has_key(n):
+                if n in first:
+                    self.parse(first[n])
+            self.add_text(['";','\n'])
+            for n in node.childNodes:
+                if n not in first.values():
+                    self.parse(n)
+        elif kind in ('file', 'namespace'):
+            nodes = node.getElementsByTagName('sectiondef')
+            for n in nodes:
+                self.parse(n)
+
+    def do_includes(self, node):
+        self.add_text('C++ includes: ')
+        self.generic_parse(node, pad=1)
+
+    def do_parameterlist(self, node):
+        self.add_text(['\n', '\n', 'Parameters:', '\n'])
+        self.generic_parse(node, pad=1)
+
+    def do_para(self, node):
+        self.add_text('\n')
+        self.generic_parse(node, pad=1)
+
+    def do_parametername(self, node):
+        self.add_text('\n')
+        self.add_text("%s: "%node.firstChild.data)
+
+    def do_parameterdefinition(self, node):
+        self.generic_parse(node, pad=1)
+
+    def do_detaileddescription(self, node):
+        self.generic_parse(node, pad=1)
+
+    def do_briefdescription(self, node):
+        self.generic_parse(node, pad=1)
+
+    def do_memberdef(self, node):
+        prot = node.attributes['prot'].value
+        id = node.attributes['id'].value
+        kind = node.attributes['kind'].value
+        tmp = node.parentNode.parentNode.parentNode
+        compdef = tmp.getElementsByTagName('compounddef')[0]
+        cdef_kind = compdef.attributes['kind'].value
+
+        if prot == 'public':
+            first = self.get_specific_nodes(node, ('definition', 'name'))
+            name = first['name'].firstChild.data
+            if name[:8] == 'operator': # Don't handle operators yet.
+                return
+
+            defn = first['definition'].firstChild.data
+            self.add_text('\n')
+            self.add_text('%feature("docstring") ')
+
+            anc = node.parentNode.parentNode
+            if cdef_kind in ('file', 'namespace'):
+                ns_node = anc.getElementsByTagName('innernamespace')
+                if not ns_node and cdef_kind == 'namespace':
+                    ns_node = anc.getElementsByTagName('compoundname')
+                if ns_node:
+                    ns = ns_node[0].firstChild.data
+                    self.add_text(' %s::%s "\n%s'%(ns, name, defn))
+                else:
+                    self.add_text(' %s "\n%s'%(name, defn))
+            elif cdef_kind in ('class', 'struct'):
+                # Get the full function name.
+                anc_node = anc.getElementsByTagName('compoundname')
+                cname = anc_node[0].firstChild.data
+                self.add_text(' %s::%s "\n%s'%(cname, name, defn))
+
+            for n in node.childNodes:
+                if n not in first.values():
+                    self.parse(n)
+            self.add_text(['";', '\n'])
+
+    def do_definition(self, node):
+        data = node.firstChild.data
+        self.add_text('%s "\n%s'%(data, data))
+
+    def do_sectiondef(self, node):
+        kind = node.attributes['kind'].value
+        if kind in ('public-func', 'func'):
+            self.generic_parse(node)
+
+    def do_simplesect(self, node):
+        kind = node.attributes['kind'].value
+        if kind in ('date', 'rcs', 'version'):
+            pass
+        elif kind == 'warning':
+            self.add_text(['\n', 'WARNING: '])
+            self.generic_parse(node)
+        elif kind == 'see':
+            self.add_text('\n')
+            self.add_text('See: ')
+            self.generic_parse(node)
+        else:
+            self.generic_parse(node)
+
+    def do_argsstring(self, node):
+        self.generic_parse(node, pad=1)
+
+    def do_member(self, node):
+        kind = node.attributes['kind'].value
+        refid = node.attributes['refid'].value
+        if kind == 'function' and refid[:9] == 'namespace':
+            self.generic_parse(node)
+
+    def do_doxygenindex(self, node):
+        self.multi = 1
+        comps = node.getElementsByTagName('compound')
+        for c in comps:
+            refid = c.attributes['refid'].value
+            fname = refid + '.xml'
+            if not os.path.exists(fname):
+                fname = os.path.join(self.my_dir,  fname)
+            print("parsing file: %s"%fname)
+            p = Doxy2SWIG(fname)
+            p.generate()
+            self.pieces.extend(self.clean_pieces(p.pieces))
+
+    def write(self, fname, mode='w'):
+        o = my_open_write(fname, mode)
+        if self.multi:
+            o.write("".join(self.pieces))
+        else:
+            o.write("".join(self.clean_pieces(self.pieces)))
+        o.close()
+
+    def clean_pieces(self, pieces):
+        """Cleans the list of strings given as `pieces`.  It replaces
+        multiple newlines by a maximum of 2 and returns a new list.
+        It also wraps the paragraphs nicely.
+
+        """
+        ret = []
+        count = 0
+        for i in pieces:
+            if i == '\n':
+                count = count + 1
+            else:
+                if i == '";':
+                    if count:
+                        ret.append('\n')
+                elif count > 2:
+                    ret.append('\n\n')
+                elif count:
+                    ret.append('\n'*count)
+                count = 0
+                ret.append(i)
+
+        _data = "".join(ret)
+        ret = []
+        for i in _data.split('\n\n'):
+            if i == 'Parameters:':
+                ret.extend(['Parameters:\n-----------', '\n\n'])
+            elif i.find('// File:') > -1: # leave comments alone.
+                ret.extend([i, '\n'])
+            else:
+                #_tmp = textwrap.fill(i.strip())
+                _tmp = i.strip()
+                _tmp = self.lead_spc.sub(r'\1"\2', _tmp)
+                ret.extend([_tmp, '\n\n'])
+        return ret
+
+
+def main(input, output):
+    p = Doxy2SWIG(input)
+    p.generate()
+    p.write(output)
+
+
+if __name__ == '__main__':
+    if len(sys.argv) != 3:
+        print(__doc__)
+        sys.exit(1)
+    main(sys.argv[1], sys.argv[2])
diff --git a/Wrap/swig/extendCore.i b/Wrap/swig/extendCore.i
new file mode 100644
index 0000000..cc7a39e
--- /dev/null
+++ b/Wrap/swig/extendCore.i
@@ -0,0 +1,70 @@
+%extend BasicVector3D<double> {
+    BasicVector3D<double> __add__(const BasicVector3D<double>& rhs) const {
+        return *($self) + rhs; }
+    BasicVector3D<double> __mul__(double c) const {
+        return c * *($self); }
+    BasicVector3D<double> __rmul__(double c) const {
+        return *($self) * c; }
+    BasicVector3D<double> __neg__() const {
+        return - *($self); }
+};
+
+%extend OutputData<double> {
+    double __getitem__(unsigned int i) { return (*($self))[i]; }
+    double __setitem__(unsigned int i, double value)
+    {
+        (*($self))[i] = value;
+        return (*($self))[i];
+    }
+};
+
+%extend FixedBinAxis {
+    double __getitem__(unsigned int i) { return (*($self))[i]; }
+};
+
+%extend VariableBinAxis {
+    double __getitem__(unsigned int i) { return (*($self))[i]; }
+};
+
+%extend IMultiLayerBuilder {
+    virtual RealParameter* registerParameter(const std::string& name, int64_t parpointer) {
+        return &((*($self)).registerParameter(name, (double*)parpointer)); }
+
+    virtual void setParameterValue(const std::string& name, double value) {
+        dynamic_cast<IParameterized*>($self)->setParameterValue(name, value); }
+
+    static bool isPythonBuilder() {
+        return true; }
+};
+
+// necessary to export this since Python does not support dynamic casting
+%extend Histogram2D {
+    static Histogram2D* dynamicCast(IHistogram* pHistogram) {
+        return dynamic_cast<Histogram2D*>(pHistogram); }
+};
+
+// necessary to export this since Python does not support dynamic casting
+%extend Histogram1D {
+    static Histogram1D* dynamicCast(IHistogram* pHistogram) {
+        return dynamic_cast<Histogram1D*>(pHistogram); }
+};
+
+// needed to prevent ownership problems with passed IMultiLayerBuilder
+%rename(setSampleBuilderCpp) Simulation::setSampleBuilder;
+%extend Simulation {
+    %pythoncode %{
+         def setSampleBuilder(self, ptr):
+             self.samplebuilder = ptr
+             self.setSampleBuilderCpp(ptr)
+    %}
+ };
+
+%rename(setSampleBuilderCpp) SpecularSimulation::setSampleBuilder;
+%extend SpecularSimulation {
+    %pythoncode %{
+         def setSampleBuilder(self, ptr):
+             self.samplebuilder = ptr
+             self.setSampleBuilderCpp(ptr)
+    %}
+ };
+
diff --git a/Wrap/swig/extendFit.i b/Wrap/swig/extendFit.i
new file mode 100644
index 0000000..ed4c57e
--- /dev/null
+++ b/Wrap/swig/extendFit.i
@@ -0,0 +1,43 @@
+
+// FitParameterSet iterator
+
+%pythoncode %{
+class FitParameterSetIterator(object):
+
+    def __init__(self, fitParameters):
+        self.fitParameters = fitParameters
+        self.index = -1
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        self.index += 1
+        if self.index < self.fitParameters.size():
+            return self.fitParameters[self.index]
+        else:
+            raise StopIteration
+
+    def __next__(self):
+        return self.next()
+%}
+
+// FitParameterSet accessors
+
+%extend FitParameterSet {
+    const FitParameter* __getitem__(std::string name) const
+    {
+        return (*($self))[name];
+    }
+    const FitParameter* __getitem__(size_t index) const
+    {
+        return (*($self))[index];
+    }
+
+%pythoncode {
+    def __iter__(self):
+        return FitParameterSetIterator(self)
+}
+};
+
+
diff --git a/Wrap/swig/ignores.i b/Wrap/swig/ignores.i
new file mode 100644
index 0000000..2cab5d9
--- /dev/null
+++ b/Wrap/swig/ignores.i
@@ -0,0 +1,69 @@
+
+// fix SWIG warning 509, certain C++ overloads create ambiguities in Python
+%ignore ParticleLayout::addInterferenceFunction(IInterferenceFunction*);
+%ignore ParticleLayout::addInterferenceFunction(const IInterferenceFunction*);
+%ignore MesoCrystal::MesoCrystal(IClusteredParticles*, IFormFactor*);
+%ignore MesoCrystal::MesoCrystal(const IClusteredParticles*, const IFormFactor*);
+%ignore Instrument::setDetectorResolutionFunction(IResolutionFunction2D*);
+%ignore Instrument::setDetectorResolutionFunction(const IResolutionFunction2D*);
+
+
+// used to return numpy array
+/*
+%ignore Histogram1D::getBinCenters() const;
+%ignore Histogram1D::getBinValues() const;
+%ignore Histogram1D::getBinErrors() const;
+*/
+// need to fix SWIG error, PI2 multiply defined
+%ignore Units::PI2;
+
+
+// problems with BasicVector3D.h
+%ignore BasicVector3D<std::complex<double>>::complex() const;
+%ignore BasicVector3D<std::complex<double>>::angle(const BasicVector3D<std::complex<double>>&) const;
+%ignore BasicVector3D<std::complex<double>>::perp2(const BasicVector3D<std::complex<double>>&) const;
+%ignore BasicVector3D<std::complex<double>>::sin2Theta() const;
+%ignore BasicVector3D<std::complex<double>>::cosTheta() const;
+%ignore BasicVector3D<std::complex<double>>::theta() const;
+%ignore BasicVector3D<std::complex<double>>::phi() const;
+%ignore BasicVector3D<std::complex<double>>::rotated(double, const BasicVector3D<std::complex<double>>&) const;
+%ignore BasicVector3D<std::complex<double>>::rotatedX(double) const;
+%ignore BasicVector3D<std::complex<double>>::rotatedY(double) const;
+%ignore BasicVector3D<std::complex<double>>::rotatedZ(double) const;
+
+%ignore BasicVector3D<std::complex<double>>::cross(const BasicVector3D<std::complex<double>>&) const;
+%ignore BasicVector3D<std::complex<double>>::perp(const BasicVector3D<std::complex<double>>&) const;
+
+%ignore BasicVector3D<double>::rotated(double, const BasicVector3D<double>&) const;
+%ignore BasicVector3D<double>::rotatedX(double) const;
+%ignore BasicVector3D<double>::rotatedY(double) const;
+%ignore BasicVector3D<double>::rotatedZ(double) const;
+
+
+// need this to play nicely with ctypes
+%ignore IParameterized::addParametersToExternalPool(const std::string&, ParameterPool*, int) const;
+%ignore IParameterized::addParametersToExternalPool(const std::string&, ParameterPool*) const;
+%ignore IMultiLayerBuilder::addParametersToExternalPool(const std::string&, ParameterPool*, int) const;
+%ignore IMultiLayerBuilder::addParametersToExternalPool(const std::string&, ParameterPool*) const;
+
+// for determining if clone is neccesary after buildSample() call
+%ignore IMultiLayerBuilder::isPythonBuilder();
+
+// ignored to avoid error (todo: check whether this is really necessary)
+%ignore Crystal::getTransformedLattice(const IRotation*) const;
+
+// taken from dev-tools/python-bindings/settings_fit.py
+%ignore FitSuite::setOptions(const FitOptions&);
+%ignore FitSuite::getOptions();
+
+
+// extra ignores for types and methods that shouldn't be visible in Python
+%ignore FormFactorDWBAPol;
+%ignore ISampleVisitor::visit(const FormFactorDWBAPol*);
+%ignore FormFactorDWBA;
+%ignore ISampleVisitor::visit(const FormFactorDWBA*);
+%ignore MainComputation;
+%ignore DecoratedLayerComputation;
+%ignore RoughMultiLayerComputation;
+%ignore SpecularComputation;
+
diff --git a/Wrap/swig/libBornAgainCore.i b/Wrap/swig/libBornAgainCore.i
new file mode 100644
index 0000000..55063d8
--- /dev/null
+++ b/Wrap/swig/libBornAgainCore.i
@@ -0,0 +1,428 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Wrap/swig/libBornAgainCore.i
+//! @brief     SWIG interface file for libBornAgainCore
+//!
+//!            Configuration is done in Core/CMakeLists.txt
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+%module(directors="1") "libBornAgainCore"
+
+%feature("autodoc");
+
+/**/
+%include "stdint.i"
+%include "std_complex.i"
+%include "std_string.i"
+%include "std_vector.i"
+%include "std_shared_ptr.i"
+
+// TODO CLARIFY WHY THIS IS INCLUDED
+%include "../../auto/Wrap/doxygen_core.i"
+
+// include the list of smart pointers (common between Core and Fit)
+%include "shared_pointers.i"
+
+%include "warnings.i"
+%include "extendCore.i"
+%include "ignores.i"
+%include "directors.i"
+
+%template(vdouble1d_t) std::vector<double>;
+%template(vdouble2d_t) std::vector< std::vector<double>>;
+%template(vector_integer_t) std::vector<int>;
+%template(vector_longinteger_t) std::vector<unsigned long int>;
+%template(vector_complex_t) std::vector< std::complex<double>>;
+%template(vector_string_t) std::vector<std::string>;
+%nodefaultctor ParameterPool;
+
+#define SWIG_FILE_WITH_INIT
+
+%{
+#define SWIG_FILE_WITH_INIT
+#define PY_ARRAY_UNIQUE_SYMBOL BORNAGAIN_PYTHONAPI_ARRAY
+%}
+
+%include "numpy.i"
+%init %{
+    import_array();
+%}
+
+#define GCC_DIAG_OFF(x)
+#define GCC_DIAG_ON(x)
+
+#ifndef BORNAGAIN_PYTHON
+#define BORNAGAIN_PYTHON
+#endif
+
+%import "WinDllMacros.h"
+
+%{
+#include "BAVersion.h"
+#include "BasicVector3D.h"
+#include "Beam.h"
+#include "Bin.h"
+#include "ChiSquaredModule.h"
+#include "Complex.h"
+#include "ConstKBinAxis.h"
+#include "Crystal.h"
+#include "CustomBinAxis.h"
+#include "DetectorMask.h"
+#include "Distributions.h"
+#include "Distributions.h"
+#include "Ellipse.h"
+#include "FTDecayFunctions.h"
+#include "FTDecayFunctions.h"
+#include "FTDistributions1D.h"
+#include "FTDistributions2D.h"
+#include "FitObject.h"
+#include "FitOptions.h"
+#include "FitParameterLinked.h"
+#include "FitSuite.h"
+#include "FitSuiteImpl.h"
+#include "FitSuiteObjects.h"
+#include "FitParameterSet.h"
+#include "FixedBinAxis.h"
+#include "FormFactorAnisoPyramid.h"
+#include "FormFactorBox.h"
+#include "FormFactorCone.h"
+#include "FormFactorCone6.h"
+#include "FormFactorCrystal.h"
+#include "FormFactorCuboctahedron.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorDecoratorDebyeWaller.h"
+#include "FormFactorDodecahedron.h"
+#include "FormFactorEllipsoidalCylinder.h"
+#include "FormFactorFullSphere.h"
+#include "FormFactorFullSpheroid.h"
+#include "FormFactorGauss.h"
+#include "FormFactorHemiEllipsoid.h"
+#include "FormFactorIcosahedron.h"
+#include "FormFactorLongBoxGauss.h"
+#include "FormFactorLongBoxLorentz.h"
+#include "FormFactorLongRipple1Gauss.h"
+#include "FormFactorLongRipple1Lorentz.h"
+#include "FormFactorLongRipple2Gauss.h"
+#include "FormFactorLongRipple2Lorentz.h"
+#include "FormFactorLorentz.h"
+#include "FormFactorPolyhedron.h"
+#include "FormFactorPolyhedron.h"
+#include "FormFactorPrism3.h"
+#include "FormFactorPrism6.h"
+#include "FormFactorPyramid.h"
+#include "FormFactorRipple1.h"
+#include "FormFactorRipple2.h"
+#include "FormFactorSphereGaussianRadius.h"
+#include "FormFactorSphereLogNormalRadius.h"
+#include "FormFactorSphereUniformRadius.h"
+#include "FormFactorTetrahedron.h"
+#include "FormFactorTrivial.h"
+#include "FormFactorTruncatedCube.h"
+#include "FormFactorTruncatedSphere.h"
+#include "FormFactorTruncatedSpheroid.h"
+#include "FormFactorWeighted.h"
+#include "GISASSimulation.h"
+#include "Histogram1D.h"
+#include "Histogram2D.h"
+#include "HomogeneousMagneticMaterial.h"
+#include "HomogeneousMaterial.h"
+#include "IAbstractParticle.h"
+#include "ICloneable.h"
+#include "IClusteredParticles.h"
+#include "ICompositeSample.h"
+#include "IDetector2D.h"
+#include "IDetectorResolution.h"
+#include "IFitObserver.h"
+#include "IFitStrategy.h"
+#include "IFormFactorDecorator.h"
+#include "IHistogram.h"
+#include "IIntensityFunction.h"
+#include "IInterferenceFunction.h"
+#include "ILayout.h"
+#include "IMaterial.h"
+#include "INamed.h"
+#include "INoncopyable.h"
+#include "IObserver.h"
+#include "IParameterized.h"
+#include "IParticle.h"
+#include "IResolutionFunction2D.h"
+#include "ISample.h"
+#include "IMultiLayerBuilder.h"
+#include "ISampleVisitor.h"
+#include "ISelectionRule.h"
+#include "IShape2D.h"
+#include "ISingleton.h"
+#include "Instrument.h"
+#include "IntensityDataFunctions.h"
+#include "IntensityDataIOFactory.h"
+#include "InterferenceFunction1DLattice.h"
+#include "InterferenceFunction1DLattice.h"
+#include "InterferenceFunction2DLattice.h"
+#include "InterferenceFunction2DLattice.h"
+#include "InterferenceFunction2DParaCrystal.h"
+#include "InterferenceFunction2DParaCrystal.h"
+#include "InterferenceFunctionNone.h"
+#include "InterferenceFunctionNone.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "IsGISAXSDetector.h"
+#include "Lattice.h"
+#include "Lattice1DParameters.h"
+#include "Lattice2DParameters.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "Line.h"
+#include "Logger.h"
+#include "MathFunctions.h"
+#include "MesoCrystal.h"
+#include "MultiLayer.h"
+#include "OffSpecSimulation.h"
+#include "OutputData.h"
+#include "ParameterDistribution.h"
+#include "ParameterPool.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleCoreShell.h"
+#include "ParticleDistribution.h"
+#include "ParticleLayout.h"
+#include "Polygon.h"
+#include "RealParameter.h"
+#include "Rectangle.h"
+#include "RectangularDetector.h"
+#include "ResolutionFunction2DGaussian.h"
+#include "Rotations.h"
+#include "Rotations.h"
+#include "SampleBuilderFactory.h"
+#include "Simulation.h"
+#include "SimulationFactory.h"
+#include "SimulationOptions.h"
+#include "SpecularSimulation.h"
+#include "SphericalDetector.h"
+#include "ThreadInfo.h"
+#include "Units.h"
+#include "VariableBinAxis.h"
+#include "Vectors3D.h"
+#include "WavevectorInfo.h"
+#include "IChiSquaredModule.h"
+#include "IIntensityFunction.h"
+#include "IIntensityNormalizer.h"
+#include "ISquaredFunction.h"
+#include "MathFunctions.h"
+#include "AdjustMinimizerStrategy.h"
+%}
+
+// ownership
+
+%newobject GISASSimulation::getIntensityData(IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const;
+%newobject GISASSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const;
+
+%newobject OffSpecSimulation::getIntensityData(IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const;
+%newobject OffSpecSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type = IDetector2D::DEFAULT) const;
+
+%newobject IntensityDataIOFactory::readOutputData(const std::string& file_name);
+%newobject IntensityDataIOFactory::readIntensityData(const std::string& file_name);
+
+%newobject DetectorMask::createHistogram() const;
+
+%newobject IHistogram::createFrom(const std::string& filename);
+%newobject IHistogram::createFrom(const std::vector<std::vector<double>>& data);
+
+// The following goes verbatim from libBornAgainCore.i to libBornAgainCore_wrap.cxx.
+// Note that the order matters, as base classes must be included before derived classes.
+
+%import(module="libBornAgainFit") "AttLimits.h"
+%import(module="libBornAgainFit") "Attributes.h"
+%import(module="libBornAgainFit") "RealLimits.h"
+%import(module="libBornAgainFit") "IFitParameter.h"
+%import(module="libBornAgainFit") "FitParameter.h"
+
+%include "BAVersion.h"
+%include "BasicVector3D.h"
+%include "INoncopyable.h"
+%include "ICloneable.h"
+%include "INamed.h"
+%include "IParameterized.h"
+
+// SWIG does not automatically instantiate templates, so we declare these by hand
+%template(kvector_t) BasicVector3D<double>;
+%template(vector_kvector_t) std::vector<BasicVector3D<double>>;
+%template(cvector_t) BasicVector3D<std::complex<double>>;
+%template(vector_cvector_t) std::vector<BasicVector3D<std::complex<double>>>;
+
+%include "Complex.h"
+%include "Units.h"
+%include "Vectors3D.h"
+%include "WavevectorInfo.h"
+
+%include "Beam.h"
+%include "Bin.h"
+
+%include "IAxis.h"
+%include "VariableBinAxis.h"
+%include "ConstKBinAxis.h"
+%include "CustomBinAxis.h"
+
+%include "IShape2D.h"
+%include "ISample.h"
+
+// need to tell SWIG explicitly to instantiate these templates with given types
+%template(swig_dummy_type_isample_vector) std::vector<ISample*>;
+%template(swig_dummy_type_const_isample_vector) std::vector<const ISample*>;
+
+%include "IChiSquaredModule.h"
+%include "IObserver.h"
+%include "IFitObserver.h"
+%include "IFitStrategy.h"
+%include "IIntensityFunction.h"
+%include "IIntensityNormalizer.h"
+%include "ISquaredFunction.h"
+%include "ChiSquaredModule.h"
+%include "FitObject.h"
+%include "FitOptions.h"
+%include "FitParameterLinked.h"
+%include "FitSuite.h"
+%include "FitSuiteObjects.h"
+%include "MathFunctions.h"
+%include "AdjustMinimizerStrategy.h"
+%include "IFactory.h"
+%include "IMultiLayerBuilder.h"
+%include "ISampleVisitor.h"
+%include "ICompositeSample.h"
+%include "IClusteredParticles.h"
+%include "Crystal.h"
+%include "Distributions.h"
+%include "DetectorMask.h"
+%include "Ellipse.h"
+%include "FTDecayFunctions.h"
+%include "FTDistributions1D.h"
+%include "FTDistributions2D.h"
+%include "FixedBinAxis.h"
+%include "IFormFactor.h"
+%template(vector_IFormFactorPtr_t) std::vector<IFormFactor*>;
+%include "IFormFactorBorn.h"
+%include "IFormFactorDecorator.h"
+%include "FormFactorPolyhedron.h"
+
+%include "FormFactorAnisoPyramid.h"
+%include "FormFactorBox.h"
+%include "FormFactorCone.h"
+%include "FormFactorCone6.h"
+%include "FormFactorCrystal.h"
+%include "FormFactorCuboctahedron.h"
+%include "FormFactorCylinder.h"
+%include "FormFactorDecoratorDebyeWaller.h"
+%include "FormFactorDodecahedron.h"
+%include "FormFactorEllipsoidalCylinder.h"
+%include "FormFactorFullSphere.h"
+%include "FormFactorFullSpheroid.h"
+%include "FormFactorGauss.h"
+%include "FormFactorHemiEllipsoid.h"
+%include "FormFactorIcosahedron.h"
+%include "FormFactorLongBoxGauss.h"
+%include "FormFactorLongBoxLorentz.h"
+%include "FormFactorLongRipple1Gauss.h"
+%include "FormFactorLongRipple1Lorentz.h"
+%include "FormFactorLongRipple2Gauss.h"
+%include "FormFactorLongRipple2Lorentz.h"
+%include "FormFactorLorentz.h"
+%include "FormFactorPolyhedron.h"
+%include "FormFactorPrism3.h"
+%include "FormFactorPrism6.h"
+%include "FormFactorPyramid.h"
+%include "FormFactorRipple1.h"
+%include "FormFactorRipple2.h"
+%include "FormFactorSphereGaussianRadius.h"
+%include "FormFactorSphereLogNormalRadius.h"
+%include "FormFactorSphereUniformRadius.h"
+%include "FormFactorTetrahedron.h"
+%include "FormFactorTrivial.h"
+%include "FormFactorTruncatedCube.h"
+%include "FormFactorTruncatedSphere.h"
+%include "FormFactorTruncatedSpheroid.h"
+%include "FormFactorWeighted.h"
+
+%include "Simulation.h"
+%include "SimulationOptions.h"
+%include "GISASSimulation.h"
+%include "IHistogram.h"
+%include "Histogram1D.h"
+%include "Histogram2D.h"
+%include "IMaterial.h"
+%include "HomogeneousMaterial.h"
+%include "HomogeneousMagneticMaterial.h"
+%include "IDetector2D.h"
+%include "IDetectorResolution.h"
+%include "Distributions.h"
+%include "FTDecayFunctions.h"
+%include "IInterferenceFunction.h"
+%include "ILayout.h"
+%include "IAbstractParticle.h"
+%include "IParameter.h" // needed?
+%template(IParameterReal) IParameter<double>; // needed to avoid warning 401?
+%include "IParticle.h"
+%include "IResolutionFunction2D.h"
+%include "Rotations.h"
+%include "ISelectionRule.h"
+%include "ISingleton.h"
+%include "Instrument.h"
+%include "IntensityDataFunctions.h"
+%include "IntensityDataIOFactory.h"
+%include "InterferenceFunction1DLattice.h"
+%include "InterferenceFunctionRadialParaCrystal.h"
+%include "InterferenceFunction2DLattice.h"
+%include "InterferenceFunction2DParaCrystal.h"
+%include "InterferenceFunctionNone.h"
+%include "InterferenceFunction1DLattice.h"
+%include "InterferenceFunctionRadialParaCrystal.h"
+%include "InterferenceFunction2DLattice.h"
+%include "InterferenceFunction2DParaCrystal.h"
+%include "InterferenceFunctionNone.h"
+%include "IPixelMap.h"
+%include "SphericalDetector.h"
+%include "IsGISAXSDetector.h"
+%include "Lattice.h"
+%include "Lattice1DParameters.h"
+%include "Lattice2DParameters.h"
+%include "Layer.h"
+%include "IRoughness.h"
+%include "LayerRoughness.h"
+%include "Line.h"
+%include "MathFunctions.h"
+%include "MesoCrystal.h"
+%include "Logger.h"
+%include "MultiLayer.h"
+%include "OffSpecSimulation.h"
+%include "IIntensityFunction.h"
+%include "OutputData.h"
+%template(IntensityData) OutputData<double>;
+%include "ParameterDistribution.h"
+%include "ParameterPool.h"
+%include "Particle.h"
+%include "ParticleComposition.h"
+%include "ParticleCoreShell.h"
+%include "ParticleDistribution.h"
+%include "ParticleLayout.h"
+%include "Polygon.h"
+%include "RealParameter.h"
+%include "Rectangle.h"
+%include "RectangularDetector.h"
+%include "ResolutionFunction2DGaussian.h"
+%include "Rotations.h"
+%include "ISelectionRule.h"
+%include "SpecularSimulation.h"
+%include "ThreadInfo.h"
+%template(SampleBuilderFactoryTemp) IFactory<std::string, IMultiLayerBuilder>;
+%include "SampleBuilderFactory.h"
+%template(SimulationFactoryTemp) IFactory<std::string, GISASSimulation>;
+%include "SimulationFactory.h"
+
diff --git a/Wrap/swig/libBornAgainFit.i b/Wrap/swig/libBornAgainFit.i
new file mode 100644
index 0000000..3874f91
--- /dev/null
+++ b/Wrap/swig/libBornAgainFit.i
@@ -0,0 +1,89 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Wrap/swig/libBornAgainFit.i
+//! @brief     SWIG interface file for libBornAgainFit
+//!
+//!            Configuration is done in Fit/CMakeLists.txt
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+%module(directors="1") "libBornAgainFit"
+
+%feature("autodoc");
+
+%include "stdint.i"
+%include "std_complex.i"
+%include "std_string.i"
+%include "std_vector.i"
+%include "std_shared_ptr.i"
+
+%include "shared_pointers.i"
+
+%include "warnings.i"
+%include "ignores.i"
+%include "directors.i"
+%include "../../auto/Wrap/doxygen_fit.i"
+
+%template(vdouble1d_t) std::vector<double>;
+%template(vdouble2d_t) std::vector< std::vector<double> >;
+%template(vector_integer_t) std::vector<int >;
+%template(vector_longinteger_t) std::vector<unsigned long int >;
+%template(vector_complex_t) std::vector< std::complex<double> >;
+%template(vector_string_t) std::vector<std::string>;
+
+#define SWIG_FILE_WITH_INIT
+
+%{
+#define SWIG_FILE_WITH_INIT
+#define PY_ARRAY_UNIQUE_SYMBOL BORNAGAIN_PYTHONAPI_ARRAY
+%}
+
+%include "numpy.i"
+%init %{
+import_array();
+%}
+
+#define GCC_DIAG_OFF(x)
+#define GCC_DIAG_ON(x)
+
+#ifndef BORNAGAIN_PYTHON
+#define BORNAGAIN_PYTHON
+#endif
+
+%import "WinDllMacros.h"
+
+%{
+#include "AttLimits.h"
+#include "IFitParameter.h"
+#include "FitParameter.h"
+#include "FitParameterSet.h"
+#include "IMinimizer.h"
+#include "MinimizerCatalogue.h"
+#include "MinimizerFactory.h"
+%}
+
+// ownership
+%newobject FitSuite::getRealData(size_t i_item = 0) const;
+%newobject FitSuite::getSimulationData(size_t i_item = 0) const;
+%newobject FitSuite::getChiSquaredMap(size_t i_item = 0) const;
+
+// The following goes verbatim from libBornAgainFit.i to libBornAgainFit_wrap.cxx.
+// Note that the order matters, as base classes must be included before derived classes.
+
+%include "AttLimits.h"
+%include "IMinimizer.h"
+%include "IFitParameter.h"
+%include "FitParameter.h"
+%include "FitParameterSet.h"
+%include "MinimizerCatalogue.h"
+%include "MinimizerFactory.h"
+
+%include "extendFit.i"
diff --git a/Wrap/swig/numpy.i b/Wrap/swig/numpy.i
new file mode 100644
index 0000000..67a519e
--- /dev/null
+++ b/Wrap/swig/numpy.i
@@ -0,0 +1,3161 @@
+/* -*- C -*-  (not really, but good for syntax highlighting) */
+
+/*
+ * Copyright (c) 2005-2015, NumPy Developers.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *        notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials provided
+ *        with the distribution.
+ *
+ *     * Neither the name of the NumPy Developers nor the names of any
+ *        contributors may be used to endorse or promote products derived
+ *        from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef SWIGPYTHON
+
+%{
+#ifndef SWIG_FILE_WITH_INIT
+#define NO_IMPORT_ARRAY
+#endif
+#include "stdio.h"
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#include <numpy/arrayobject.h>
+%}
+
+/**********************************************************************/
+
+%fragment("NumPy_Backward_Compatibility", "header")
+{
+%#if NPY_API_VERSION < 0x00000007
+%#define NPY_ARRAY_DEFAULT NPY_DEFAULT
+%#define NPY_ARRAY_FARRAY  NPY_FARRAY
+%#define NPY_FORTRANORDER  NPY_FORTRAN
+%#endif
+}
+
+/**********************************************************************/
+
+/* The following code originally appeared in
+ * enthought/kiva/agg/src/numeric.i written by Eric Jones.  It was
+ * translated from C++ to C by John Hunter.  Bill Spotz has modified
+ * it to fix some minor bugs, upgrade from Numeric to numpy (all
+ * versions), add some comments and functionality, and convert from
+ * direct code insertion to SWIG fragments.
+ */
+
+%fragment("NumPy_Macros", "header")
+{
+/* Macros to extract array attributes.
+ */
+%#if NPY_API_VERSION < 0x00000007
+%#define is_array(a)            ((a) && PyArray_Check((PyArrayObject*)a))
+%#define array_type(a)          (int)(PyArray_TYPE((PyArrayObject*)a))
+%#define array_numdims(a)       (((PyArrayObject*)a)->nd)
+%#define array_dimensions(a)    (((PyArrayObject*)a)->dimensions)
+%#define array_size(a,i)        (((PyArrayObject*)a)->dimensions[i])
+%#define array_strides(a)       (((PyArrayObject*)a)->strides)
+%#define array_stride(a,i)      (((PyArrayObject*)a)->strides[i])
+%#define array_data(a)          (((PyArrayObject*)a)->data)
+%#define array_descr(a)         (((PyArrayObject*)a)->descr)
+%#define array_flags(a)         (((PyArrayObject*)a)->flags)
+%#define array_enableflags(a,f) (((PyArrayObject*)a)->flags) = f
+%#else
+%#define is_array(a)            ((a) && PyArray_Check(a))
+%#define array_type(a)          PyArray_TYPE((PyArrayObject*)a)
+%#define array_numdims(a)       PyArray_NDIM((PyArrayObject*)a)
+%#define array_dimensions(a)    PyArray_DIMS((PyArrayObject*)a)
+%#define array_strides(a)       PyArray_STRIDES((PyArrayObject*)a)
+%#define array_stride(a,i)      PyArray_STRIDE((PyArrayObject*)a,i)
+%#define array_size(a,i)        PyArray_DIM((PyArrayObject*)a,i)
+%#define array_data(a)          PyArray_DATA((PyArrayObject*)a)
+%#define array_descr(a)         PyArray_DESCR((PyArrayObject*)a)
+%#define array_flags(a)         PyArray_FLAGS((PyArrayObject*)a)
+%#define array_enableflags(a,f) PyArray_ENABLEFLAGS((PyArrayObject*)a,f)
+%#endif
+%#define array_is_contiguous(a) (PyArray_ISCONTIGUOUS((PyArrayObject*)a))
+%#define array_is_native(a)     (PyArray_ISNOTSWAPPED((PyArrayObject*)a))
+%#define array_is_fortran(a)    (PyArray_IS_F_CONTIGUOUS((PyArrayObject*)a))
+}
+
+/**********************************************************************/
+
+%fragment("NumPy_Utilities",
+          "header")
+{
+  /* Given a PyObject, return a string describing its type.
+   */
+  const char* pytype_string(PyObject* py_obj)
+  {
+    if (py_obj == NULL          ) return "C NULL value";
+    if (py_obj == Py_None       ) return "Python None" ;
+    if (PyCallable_Check(py_obj)) return "callable"    ;
+    if (PyString_Check(  py_obj)) return "string"      ;
+    if (PyInt_Check(     py_obj)) return "int"         ;
+    if (PyFloat_Check(   py_obj)) return "float"       ;
+    if (PyDict_Check(    py_obj)) return "dict"        ;
+    if (PyList_Check(    py_obj)) return "list"        ;
+    if (PyTuple_Check(   py_obj)) return "tuple"       ;
+%#if PY_MAJOR_VERSION < 3
+    if (PyFile_Check(    py_obj)) return "file"        ;
+    if (PyModule_Check(  py_obj)) return "module"      ;
+    if (PyInstance_Check(py_obj)) return "instance"    ;
+%#endif
+
+    return "unknown type";
+  }
+
+  /* Given a NumPy typecode, return a string describing the type.
+   */
+  const char* typecode_string(int typecode)
+  {
+    static const char* type_names[25] = {"bool",
+                                         "byte",
+                                         "unsigned byte",
+                                         "short",
+                                         "unsigned short",
+                                         "int",
+                                         "unsigned int",
+                                         "long",
+                                         "unsigned long",
+                                         "long long",
+                                         "unsigned long long",
+                                         "float",
+                                         "double",
+                                         "long double",
+                                         "complex float",
+                                         "complex double",
+                                         "complex long double",
+                                         "object",
+                                         "string",
+                                         "unicode",
+                                         "void",
+                                         "ntypes",
+                                         "notype",
+                                         "char",
+                                         "unknown"};
+    return typecode < 24 ? type_names[typecode] : type_names[24];
+  }
+
+  /* Make sure input has correct numpy type.  This now just calls
+     PyArray_EquivTypenums().
+   */
+  int type_match(int actual_type,
+                 int desired_type)
+  {
+    return PyArray_EquivTypenums(actual_type, desired_type);
+  }
+
+%#ifdef SWIGPY_USE_CAPSULE
+  void free_cap(PyObject * cap)
+  {
+    void* array = (void*) PyCapsule_GetPointer(cap,SWIGPY_CAPSULE_NAME);
+    if (array != NULL) free(array);
+  }
+%#endif
+
+
+}
+
+/**********************************************************************/
+
+%fragment("NumPy_Object_to_Array",
+          "header",
+          fragment="NumPy_Backward_Compatibility",
+          fragment="NumPy_Macros",
+          fragment="NumPy_Utilities")
+{
+  /* Given a PyObject pointer, cast it to a PyArrayObject pointer if
+   * legal.  If not, set the python error string appropriately and
+   * return NULL.
+   */
+  PyArrayObject* obj_to_array_no_conversion(PyObject* input,
+                                            int        typecode)
+  {
+    PyArrayObject* ary = NULL;
+    if (is_array(input) && (typecode == NPY_NOTYPE ||
+                            PyArray_EquivTypenums(array_type(input), typecode)))
+    {
+      ary = (PyArrayObject*) input;
+    }
+    else if is_array(input)
+    {
+      const char* desired_type = typecode_string(typecode);
+      const char* actual_type  = typecode_string(array_type(input));
+      PyErr_Format(PyExc_TypeError,
+                   "Array of type '%s' required.  Array of type '%s' given",
+                   desired_type, actual_type);
+      ary = NULL;
+    }
+    else
+    {
+      const char* desired_type = typecode_string(typecode);
+      const char* actual_type  = pytype_string(input);
+      PyErr_Format(PyExc_TypeError,
+                   "Array of type '%s' required.  A '%s' was given",
+                   desired_type,
+                   actual_type);
+      ary = NULL;
+    }
+    return ary;
+  }
+
+  /* Convert the given PyObject to a NumPy array with the given
+   * typecode.  On success, return a valid PyArrayObject* with the
+   * correct type.  On failure, the python error string will be set and
+   * the routine returns NULL.
+   */
+  PyArrayObject* obj_to_array_allow_conversion(PyObject* input,
+                                               int       typecode,
+                                               int*      is_new_object)
+  {
+    PyArrayObject* ary = NULL;
+    PyObject*      py_obj;
+    if (is_array(input) && (typecode == NPY_NOTYPE ||
+                            PyArray_EquivTypenums(array_type(input),typecode)))
+    {
+      ary = (PyArrayObject*) input;
+      *is_new_object = 0;
+    }
+    else
+    {
+      py_obj = PyArray_FROMANY(input, typecode, 0, 0, NPY_ARRAY_DEFAULT);
+      /* If NULL, PyArray_FromObject will have set python error value.*/
+      ary = (PyArrayObject*) py_obj;
+      *is_new_object = 1;
+    }
+    return ary;
+  }
+
+  /* Given a PyArrayObject, check to see if it is contiguous.  If so,
+   * return the input pointer and flag it as not a new object.  If it is
+   * not contiguous, create a new PyArrayObject using the original data,
+   * flag it as a new object and return the pointer.
+   */
+  PyArrayObject* make_contiguous(PyArrayObject* ary,
+                                 int*           is_new_object,
+                                 int            min_dims,
+                                 int            max_dims)
+  {
+    PyArrayObject* result;
+    if (array_is_contiguous(ary))
+    {
+      result = ary;
+      *is_new_object = 0;
+    }
+    else
+    {
+      result = (PyArrayObject*) PyArray_ContiguousFromObject((PyObject*)ary,
+                                                              array_type(ary),
+                                                              min_dims,
+                                                              max_dims);
+      *is_new_object = 1;
+    }
+    return result;
+  }
+
+  /* Given a PyArrayObject, check to see if it is Fortran-contiguous.
+   * If so, return the input pointer, but do not flag it as not a new
+   * object.  If it is not Fortran-contiguous, create a new
+   * PyArrayObject using the original data, flag it as a new object
+   * and return the pointer.
+   */
+  PyArrayObject* make_fortran(PyArrayObject* ary,
+                              int*           is_new_object)
+  {
+    PyArrayObject* result;
+    if (array_is_fortran(ary))
+    {
+      result = ary;
+      *is_new_object = 0;
+    }
+    else
+    {
+      Py_INCREF(array_descr(ary));
+      result = (PyArrayObject*) PyArray_FromArray(ary,
+                                                  array_descr(ary),
+                                                  NPY_ARRAY_F_CONTIGUOUS);
+      *is_new_object = 1;
+    }
+    return result;
+  }
+
+  /* Convert a given PyObject to a contiguous PyArrayObject of the
+   * specified type.  If the input object is not a contiguous
+   * PyArrayObject, a new one will be created and the new object flag
+   * will be set.
+   */
+  PyArrayObject* obj_to_array_contiguous_allow_conversion(PyObject* input,
+                                                          int       typecode,
+                                                          int*      is_new_object)
+  {
+    int is_new1 = 0;
+    int is_new2 = 0;
+    PyArrayObject* ary2;
+    PyArrayObject* ary1 = obj_to_array_allow_conversion(input,
+                                                        typecode,
+                                                        &is_new1);
+    if (ary1)
+    {
+      ary2 = make_contiguous(ary1, &is_new2, 0, 0);
+      if ( is_new1 && is_new2)
+      {
+        Py_DECREF(ary1);
+      }
+      ary1 = ary2;
+    }
+    *is_new_object = is_new1 || is_new2;
+    return ary1;
+  }
+
+  /* Convert a given PyObject to a Fortran-ordered PyArrayObject of the
+   * specified type.  If the input object is not a Fortran-ordered
+   * PyArrayObject, a new one will be created and the new object flag
+   * will be set.
+   */
+  PyArrayObject* obj_to_array_fortran_allow_conversion(PyObject* input,
+                                                       int       typecode,
+                                                       int*      is_new_object)
+  {
+    int is_new1 = 0;
+    int is_new2 = 0;
+    PyArrayObject* ary2;
+    PyArrayObject* ary1 = obj_to_array_allow_conversion(input,
+                                                        typecode,
+                                                        &is_new1);
+    if (ary1)
+    {
+      ary2 = make_fortran(ary1, &is_new2);
+      if (is_new1 && is_new2)
+      {
+        Py_DECREF(ary1);
+      }
+      ary1 = ary2;
+    }
+    *is_new_object = is_new1 || is_new2;
+    return ary1;
+  }
+} /* end fragment */
+
+/**********************************************************************/
+
+%fragment("NumPy_Array_Requirements",
+          "header",
+          fragment="NumPy_Backward_Compatibility",
+          fragment="NumPy_Macros")
+{
+  /* Test whether a python object is contiguous.  If array is
+   * contiguous, return 1.  Otherwise, set the python error string and
+   * return 0.
+   */
+  int require_contiguous(PyArrayObject* ary)
+  {
+    int contiguous = 1;
+    if (!array_is_contiguous(ary))
+    {
+      PyErr_SetString(PyExc_TypeError,
+                      "Array must be contiguous.  A non-contiguous array was given");
+      contiguous = 0;
+    }
+    return contiguous;
+  }
+
+  /* Test whether a python object is (C_ or F_) contiguous.  If array is
+   * contiguous, return 1.  Otherwise, set the python error string and
+   * return 0.
+   */
+  int require_c_or_f_contiguous(PyArrayObject* ary)
+  {
+    int contiguous = 1;
+    if (!(array_is_contiguous(ary) || array_is_fortran(ary)))
+    {
+      PyErr_SetString(PyExc_TypeError,
+                      "Array must be contiguous (C_ or F_).  A non-contiguous array was given");
+      contiguous = 0;
+    }
+    return contiguous;
+  }
+
+  /* Require that a numpy array is not byte-swapped.  If the array is
+   * not byte-swapped, return 1.  Otherwise, set the python error string
+   * and return 0.
+   */
+  int require_native(PyArrayObject* ary)
+  {
+    int native = 1;
+    if (!array_is_native(ary))
+    {
+      PyErr_SetString(PyExc_TypeError,
+                      "Array must have native byteorder.  "
+                      "A byte-swapped array was given");
+      native = 0;
+    }
+    return native;
+  }
+
+  /* Require the given PyArrayObject to have a specified number of
+   * dimensions.  If the array has the specified number of dimensions,
+   * return 1.  Otherwise, set the python error string and return 0.
+   */
+  int require_dimensions(PyArrayObject* ary,
+                         int            exact_dimensions)
+  {
+    int success = 1;
+    if (array_numdims(ary) != exact_dimensions)
+    {
+      PyErr_Format(PyExc_TypeError,
+                   "Array must have %d dimensions.  Given array has %d dimensions",
+                   exact_dimensions,
+                   array_numdims(ary));
+      success = 0;
+    }
+    return success;
+  }
+
+  /* Require the given PyArrayObject to have one of a list of specified
+   * number of dimensions.  If the array has one of the specified number
+   * of dimensions, return 1.  Otherwise, set the python error string
+   * and return 0.
+   */
+  int require_dimensions_n(PyArrayObject* ary,
+                           int*           exact_dimensions,
+                           int            n)
+  {
+    int success = 0;
+    int i;
+    char dims_str[255] = "";
+    char s[255];
+    for (i = 0; i < n && !success; i++)
+    {
+      if (array_numdims(ary) == exact_dimensions[i])
+      {
+        success = 1;
+      }
+    }
+    if (!success)
+    {
+      for (i = 0; i < n-1; i++)
+      {
+        sprintf(s, "%d, ", exact_dimensions[i]);
+        strcat(dims_str,s);
+      }
+      sprintf(s, " or %d", exact_dimensions[n-1]);
+      strcat(dims_str,s);
+      PyErr_Format(PyExc_TypeError,
+                   "Array must have %s dimensions.  Given array has %d dimensions",
+                   dims_str,
+                   array_numdims(ary));
+    }
+    return success;
+  }
+
+  /* Require the given PyArrayObject to have a specified shape.  If the
+   * array has the specified shape, return 1.  Otherwise, set the python
+   * error string and return 0.
+   */
+  int require_size(PyArrayObject* ary,
+                   npy_intp*      size,
+                   int            n)
+  {
+    int i;
+    int success = 1;
+    int len;
+    char desired_dims[255] = "[";
+    char s[255];
+    char actual_dims[255] = "[";
+    for(i=0; i < n;i++)
+    {
+      if (size[i] != -1 &&  size[i] != array_size(ary,i))
+      {
+        success = 0;
+      }
+    }
+    if (!success)
+    {
+      for (i = 0; i < n; i++)
+      {
+        if (size[i] == -1)
+        {
+          sprintf(s, "*,");
+        }
+        else
+        {
+          sprintf(s, "%ld,", (long int)size[i]);
+        }
+        strcat(desired_dims,s);
+      }
+      len = strlen(desired_dims);
+      desired_dims[len-1] = ']';
+      for (i = 0; i < n; i++)
+      {
+        sprintf(s, "%ld,", (long int)array_size(ary,i));
+        strcat(actual_dims,s);
+      }
+      len = strlen(actual_dims);
+      actual_dims[len-1] = ']';
+      PyErr_Format(PyExc_TypeError,
+                   "Array must have shape of %s.  Given array has shape of %s",
+                   desired_dims,
+                   actual_dims);
+    }
+    return success;
+  }
+
+  /* Require the given PyArrayObject to to be Fortran ordered.  If the
+   * the PyArrayObject is already Fortran ordered, do nothing.  Else,
+   * set the Fortran ordering flag and recompute the strides.
+   */
+  int require_fortran(PyArrayObject* ary)
+  {
+    int success = 1;
+    int nd = array_numdims(ary);
+    int i;
+    npy_intp * strides = array_strides(ary);
+    if (array_is_fortran(ary)) return success;
+    /* Set the Fortran ordered flag */
+    array_enableflags(ary,NPY_ARRAY_FARRAY);
+    /* Recompute the strides */
+    strides[0] = strides[nd-1];
+    for (i=1; i < nd; ++i)
+      strides[i] = strides[i-1] * array_size(ary,i-1);
+    return success;
+  }
+}
+
+/* Combine all NumPy fragments into one for convenience */
+%fragment("NumPy_Fragments",
+          "header",
+          fragment="NumPy_Backward_Compatibility",
+          fragment="NumPy_Macros",
+          fragment="NumPy_Utilities",
+          fragment="NumPy_Object_to_Array",
+          fragment="NumPy_Array_Requirements")
+{
+}
+
+/* End John Hunter translation (with modifications by Bill Spotz)
+ */
+
+/* %numpy_typemaps() macro
+ *
+ * This macro defines a family of 75 typemaps that allow C arguments
+ * of the form
+ *
+ *    1. (DATA_TYPE IN_ARRAY1[ANY])
+ *    2. (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)
+ *    3. (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)
+ *
+ *    4. (DATA_TYPE IN_ARRAY2[ANY][ANY])
+ *    5. (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ *    6. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)
+ *    7. (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ *    8. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)
+ *
+ *    9. (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])
+ *   10. (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+ *   11. (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+ *   12. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)
+ *   13. (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+ *   14. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)
+ *
+ *   15. (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])
+ *   16. (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+ *   17. (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+ *   18. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, , DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)
+ *   19. (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+ *   20. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)
+ *
+ *   21. (DATA_TYPE INPLACE_ARRAY1[ANY])
+ *   22. (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)
+ *   23. (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)
+ *
+ *   24. (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])
+ *   25. (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ *   26. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)
+ *   27. (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ *   28. (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)
+ *
+ *   29. (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])
+ *   30. (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+ *   31. (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+ *   32. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3)
+ *   33. (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+ *   34. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3)
+ *
+ *   35. (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])
+ *   36. (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+ *   37. (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+ *   38. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4)
+ *   39. (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+ *   40. (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4)
+ *
+ *   41. (DATA_TYPE ARGOUT_ARRAY1[ANY])
+ *   42. (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)
+ *   43. (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)
+ *
+ *   44. (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])
+ *
+ *   45. (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])
+ *
+ *   46. (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])
+ *
+ *   47. (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1)
+ *   48. (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1)
+ *
+ *   49. (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ *   50. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2)
+ *   51. (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ *   52. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2)
+ *
+ *   53. (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+ *   54. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3)
+ *   55. (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+ *   56. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3)
+ *
+ *   57. (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ *   58. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4)
+ *   59. (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ *   60. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4)
+ *
+ *   61. (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1)
+ *   62. (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1)
+ *
+ *   63. (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ *   64. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2)
+ *   65. (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ *   66. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2)
+ *
+ *   67. (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+ *   68. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3)
+ *   69. (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+ *   70. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3)
+ *
+ *   71. (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ *   72. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4)
+ *   73. (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ *   74. (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4)
+ *
+ *   75. (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT)
+ *
+ * where "DATA_TYPE" is any type supported by the NumPy module, and
+ * "DIM_TYPE" is any int-like type suitable for specifying dimensions.
+ * The difference between "ARRAY" typemaps and "FARRAY" typemaps is
+ * that the "FARRAY" typemaps expect Fortran ordering of
+ * multidimensional arrays.  In python, the dimensions will not need
+ * to be specified (except for the "DATA_TYPE* ARGOUT_ARRAY1"
+ * typemaps).  The IN_ARRAYs can be a numpy array or any sequence that
+ * can be converted to a numpy array of the specified type.  The
+ * INPLACE_ARRAYs must be numpy arrays of the appropriate type.  The
+ * ARGOUT_ARRAYs will be returned as new numpy arrays of the
+ * appropriate type.
+ *
+ * These typemaps can be applied to existing functions using the
+ * %apply directive.  For example:
+ *
+ *     %apply (double* IN_ARRAY1, int DIM1) {(double* series, int length)};
+ *     double prod(double* series, int length);
+ *
+ *     %apply (int DIM1, int DIM2, double* INPLACE_ARRAY2)
+ *           {(int rows, int cols, double* matrix        )};
+ *     void floor(int rows, int cols, double* matrix, double f);
+ *
+ *     %apply (double IN_ARRAY3[ANY][ANY][ANY])
+ *           {(double tensor[2][2][2]         )};
+ *     %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY])
+ *           {(double low[2][2][2]                )};
+ *     %apply (double ARGOUT_ARRAY3[ANY][ANY][ANY])
+ *           {(double upp[2][2][2]                )};
+ *     void luSplit(double tensor[2][2][2],
+ *                  double low[2][2][2],
+ *                  double upp[2][2][2]    );
+ *
+ * or directly with
+ *
+ *     double prod(double* IN_ARRAY1, int DIM1);
+ *
+ *     void floor(int DIM1, int DIM2, double* INPLACE_ARRAY2, double f);
+ *
+ *     void luSplit(double IN_ARRAY3[ANY][ANY][ANY],
+ *                  double ARGOUT_ARRAY3[ANY][ANY][ANY],
+ *                  double ARGOUT_ARRAY3[ANY][ANY][ANY]);
+ */
+
+%define %numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE)
+
+/************************/
+/* Input Array Typemaps */
+/************************/
+
+/* Typemap suite for (DATA_TYPE IN_ARRAY1[ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE IN_ARRAY1[ANY])
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE IN_ARRAY1[ANY])
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[1] = { $1_dim0 };
+  array = obj_to_array_contiguous_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 1) ||
+      !require_size(array, size, 1)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(freearg)
+  (DATA_TYPE IN_ARRAY1[ANY])
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[1] = { -1 };
+  array = obj_to_array_contiguous_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 1) ||
+      !require_size(array, size, 1)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+}
+%typemap(freearg)
+  (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[1] = {-1};
+  array = obj_to_array_contiguous_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 1) ||
+      !require_size(array, size, 1)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DATA_TYPE*) array_data(array);
+}
+%typemap(freearg)
+  (DIM_TYPE DIM1, DATA_TYPE* IN_ARRAY1)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE IN_ARRAY2[ANY][ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE IN_ARRAY2[ANY][ANY])
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE IN_ARRAY2[ANY][ANY])
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[2] = { $1_dim0, $1_dim1 };
+  array = obj_to_array_contiguous_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 2) ||
+      !require_size(array, size, 2)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(freearg)
+  (DATA_TYPE IN_ARRAY2[ANY][ANY])
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[2] = { -1, -1 };
+  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 2) ||
+      !require_size(array, size, 2)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+}
+%typemap(freearg)
+  (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[2] = { -1, -1 };
+  array = obj_to_array_contiguous_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 2) ||
+      !require_size(array, size, 2)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DATA_TYPE*) array_data(array);
+}
+%typemap(freearg)
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[2] = { -1, -1 };
+  array = obj_to_array_fortran_allow_conversion($input,
+                                                DATA_TYPECODE,
+                                                &is_new_object);
+  if (!array || !require_dimensions(array, 2) ||
+      !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+}
+%typemap(freearg)
+  (DATA_TYPE* IN_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[2] = { -1, -1 };
+  array = obj_to_array_fortran_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 2) ||
+      !require_size(array, size, 2) || !require_fortran(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DATA_TYPE*) array_data(array);
+}
+%typemap(freearg)
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_FARRAY2)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 };
+  array = obj_to_array_contiguous_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 3) ||
+      !require_size(array, size, 3)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(freearg)
+  (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY])
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[3] = { -1, -1, -1 };
+  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 3) ||
+      !require_size(array, size, 3)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+}
+%typemap(freearg)
+  (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  /* for now, only concerned with lists */
+  $1 = PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL, int* is_new_object_array=NULL)
+{
+  npy_intp size[2] = { -1, -1 };
+  PyArrayObject* temp_array;
+  Py_ssize_t i;
+  int is_new_object;
+
+  /* length of the list */
+  $2 = PyList_Size($input);
+
+  /* the arrays */
+  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));
+  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));
+  is_new_object_array = (int *)calloc($2,sizeof(int));
+
+  if (array == NULL || object_array == NULL || is_new_object_array == NULL)
+  {
+    SWIG_fail;
+  }
+
+  for (i=0; i<$2; i++)
+  {
+    temp_array = obj_to_array_contiguous_allow_conversion(PySequence_GetItem($input,i), DATA_TYPECODE, &is_new_object);
+
+    /* the new array must be stored so that it can be destroyed in freearg */
+    object_array[i] = temp_array;
+    is_new_object_array[i] = is_new_object;
+
+    if (!temp_array || !require_dimensions(temp_array, 2)) SWIG_fail;
+
+    /* store the size of the first array in the list, then use that for comparison. */
+    if (i == 0)
+    {
+      size[0] = array_size(temp_array,0);
+      size[1] = array_size(temp_array,1);
+    }
+
+    if (!require_size(temp_array, size, 2)) SWIG_fail;
+
+    array[i] = (DATA_TYPE*) array_data(temp_array);
+  }
+
+  $1 = (DATA_TYPE**) array;
+  $3 = (DIM_TYPE) size[0];
+  $4 = (DIM_TYPE) size[1];
+}
+%typemap(freearg)
+  (DATA_TYPE** IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  Py_ssize_t i;
+
+  if (array$argnum!=NULL) free(array$argnum);
+
+  /*freeing the individual arrays if needed */
+  if (object_array$argnum!=NULL)
+  {
+    if (is_new_object_array$argnum!=NULL)
+    {
+      for (i=0; i<$2; i++)
+      {
+        if (object_array$argnum[i] != NULL && is_new_object_array$argnum[i])
+        { Py_DECREF(object_array$argnum[i]); }
+      }
+      free(is_new_object_array$argnum);
+    }
+    free(object_array$argnum);
+  }
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,
+ *                    DATA_TYPE* IN_ARRAY3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[3] = { -1, -1, -1 };
+  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 3) ||
+      !require_size(array, size, 3)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DATA_TYPE*) array_data(array);
+}
+%typemap(freearg)
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[3] = { -1, -1, -1 };
+  array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE,
+                                                &is_new_object);
+  if (!array || !require_dimensions(array, 3) ||
+      !require_size(array, size, 3) | !require_fortran(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+}
+%typemap(freearg)
+  (DATA_TYPE* IN_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,
+ *                    DATA_TYPE* IN_FARRAY3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[3] = { -1, -1, -1 };
+  array = obj_to_array_fortran_allow_conversion($input,
+                                                   DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 3) ||
+      !require_size(array, size, 3) || !require_fortran(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DATA_TYPE*) array_data(array);
+}
+%typemap(freearg)
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_FARRAY3)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[4] = { $1_dim0, $1_dim1, $1_dim2 , $1_dim3};
+  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 4) ||
+      !require_size(array, size, 4)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(freearg)
+  (DATA_TYPE IN_ARRAY4[ANY][ANY][ANY][ANY])
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3, DIM_TYPE DIM4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[4] = { -1, -1, -1, -1 };
+  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 4) ||
+      !require_size(array, size, 4)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+  $5 = (DIM_TYPE) array_size(array,3);
+}
+%typemap(freearg)
+  (DATA_TYPE* IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3, DIM_TYPE DIM4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  /* for now, only concerned with lists */
+  $1 = PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL, int* is_new_object_array=NULL)
+{
+  npy_intp size[3] = { -1, -1, -1 };
+  PyArrayObject* temp_array;
+  Py_ssize_t i;
+  int is_new_object;
+
+  /* length of the list */
+  $2 = PyList_Size($input);
+
+  /* the arrays */
+  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));
+  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));
+  is_new_object_array = (int *)calloc($2,sizeof(int));
+
+  if (array == NULL || object_array == NULL || is_new_object_array == NULL)
+  {
+    SWIG_fail;
+  }
+
+  for (i=0; i<$2; i++)
+  {
+    temp_array = obj_to_array_contiguous_allow_conversion(PySequence_GetItem($input,i), DATA_TYPECODE, &is_new_object);
+
+    /* the new array must be stored so that it can be destroyed in freearg */
+    object_array[i] = temp_array;
+    is_new_object_array[i] = is_new_object;
+
+    if (!temp_array || !require_dimensions(temp_array, 3)) SWIG_fail;
+
+    /* store the size of the first array in the list, then use that for comparison. */
+    if (i == 0)
+    {
+      size[0] = array_size(temp_array,0);
+      size[1] = array_size(temp_array,1);
+      size[2] = array_size(temp_array,2);
+    }
+
+    if (!require_size(temp_array, size, 3)) SWIG_fail;
+
+    array[i] = (DATA_TYPE*) array_data(temp_array);
+  }
+
+  $1 = (DATA_TYPE**) array;
+  $3 = (DIM_TYPE) size[0];
+  $4 = (DIM_TYPE) size[1];
+  $5 = (DIM_TYPE) size[2];
+}
+%typemap(freearg)
+  (DATA_TYPE** IN_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  Py_ssize_t i;
+
+  if (array$argnum!=NULL) free(array$argnum);
+
+  /*freeing the individual arrays if needed */
+  if (object_array$argnum!=NULL)
+  {
+    if (is_new_object_array$argnum!=NULL)
+    {
+      for (i=0; i<$2; i++)
+      {
+        if (object_array$argnum[i] != NULL && is_new_object_array$argnum[i])
+        { Py_DECREF(object_array$argnum[i]); }
+      }
+      free(is_new_object_array$argnum);
+    }
+    free(object_array$argnum);
+  }
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4,
+ *                    DATA_TYPE* IN_ARRAY4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[4] = { -1, -1, -1 , -1};
+  array = obj_to_array_contiguous_allow_conversion($input, DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 4) ||
+      !require_size(array, size, 4)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DIM_TYPE) array_size(array,3);
+  $5 = (DATA_TYPE*) array_data(array);
+}
+%typemap(freearg)
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_ARRAY4)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3, DIM_TYPE DIM4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[4] = { -1, -1, -1, -1 };
+  array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE,
+                                                &is_new_object);
+  if (!array || !require_dimensions(array, 4) ||
+      !require_size(array, size, 4) | !require_fortran(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+  $5 = (DIM_TYPE) array_size(array,3);
+}
+%typemap(freearg)
+  (DATA_TYPE* IN_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4,
+ *                    DATA_TYPE* IN_FARRAY4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)
+{
+  $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)
+  (PyArrayObject* array=NULL, int is_new_object=0)
+{
+  npy_intp size[4] = { -1, -1, -1 , -1 };
+  array = obj_to_array_fortran_allow_conversion($input, DATA_TYPECODE,
+                                                   &is_new_object);
+  if (!array || !require_dimensions(array, 4) ||
+      !require_size(array, size, 4) || !require_fortran(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DIM_TYPE) array_size(array,3);
+  $5 = (DATA_TYPE*) array_data(array);
+}
+%typemap(freearg)
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* IN_FARRAY4)
+{
+  if (is_new_object$argnum && array$argnum)
+    { Py_DECREF(array$argnum); }
+}
+
+/***************************/
+/* In-Place Array Typemaps */
+/***************************/
+
+/* Typemap suite for (DATA_TYPE INPLACE_ARRAY1[ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE INPLACE_ARRAY1[ANY])
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE INPLACE_ARRAY1[ANY])
+  (PyArrayObject* array=NULL)
+{
+  npy_intp size[1] = { $1_dim0 };
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,1) || !require_size(array, size, 1) ||
+      !require_contiguous(array) || !require_native(array)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1)
+  (PyArrayObject* array=NULL, int i=1)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,1) || !require_contiguous(array)
+      || !require_native(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = 1;
+  for (i=0; i < array_numdims(array); ++i) $2 *= array_size(array,i);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1)
+  (PyArrayObject* array=NULL, int i=0)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,1) || !require_contiguous(array)
+      || !require_native(array)) SWIG_fail;
+  $1 = 1;
+  for (i=0; i < array_numdims(array); ++i) $1 *= array_size(array,i);
+  $2 = (DATA_TYPE*) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE INPLACE_ARRAY2[ANY][ANY])
+  (PyArrayObject* array=NULL)
+{
+  npy_intp size[2] = { $1_dim0, $1_dim1 };
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,2) || !require_size(array, size, 2) ||
+      !require_contiguous(array) || !require_native(array)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,2) || !require_contiguous(array)
+      || !require_native(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,2) || !require_contiguous(array) ||
+      !require_native(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DATA_TYPE*) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_FARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,2) || !require_contiguous(array)
+      || !require_native(array) || !require_fortran(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_FARRAY2)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,2) || !require_contiguous(array) ||
+      !require_native(array) || !require_fortran(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DATA_TYPE*) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY])
+  (PyArrayObject* array=NULL)
+{
+  npy_intp size[3] = { $1_dim0, $1_dim1, $1_dim2 };
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,3) || !require_size(array, size, 3) ||
+      !require_contiguous(array) || !require_native(array)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,3) || !require_contiguous(array) ||
+      !require_native(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+}
+
+/* Typemap suite for (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  $1 = PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL)
+{
+  npy_intp size[2] = { -1, -1 };
+  PyArrayObject* temp_array;
+  Py_ssize_t i;
+
+  /* length of the list */
+  $2 = PyList_Size($input);
+
+  /* the arrays */
+  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));
+  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));
+
+  if (array == NULL || object_array == NULL)
+  {
+    SWIG_fail;
+  }
+
+  for (i=0; i<$2; i++)
+  {
+    temp_array = obj_to_array_no_conversion(PySequence_GetItem($input,i), DATA_TYPECODE);
+
+    /* the new array must be stored so that it can be destroyed in freearg */
+    object_array[i] = temp_array;
+
+    if ( !temp_array || !require_dimensions(temp_array, 2) ||
+      !require_contiguous(temp_array) ||
+      !require_native(temp_array) ||
+      !PyArray_EquivTypenums(array_type(temp_array), DATA_TYPECODE)
+    ) SWIG_fail;
+
+    /* store the size of the first array in the list, then use that for comparison. */
+    if (i == 0)
+    {
+      size[0] = array_size(temp_array,0);
+      size[1] = array_size(temp_array,1);
+    }
+
+    if (!require_size(temp_array, size, 2)) SWIG_fail;
+
+    array[i] = (DATA_TYPE*) array_data(temp_array);
+  }
+
+  $1 = (DATA_TYPE**) array;
+  $3 = (DIM_TYPE) size[0];
+  $4 = (DIM_TYPE) size[1];
+}
+%typemap(freearg)
+  (DATA_TYPE** INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  if (array$argnum!=NULL) free(array$argnum);
+  if (object_array$argnum!=NULL) free(object_array$argnum);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,
+ *                    DATA_TYPE* INPLACE_ARRAY3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,3) || !require_contiguous(array)
+      || !require_native(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DATA_TYPE*) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_FARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,3) || !require_contiguous(array) ||
+      !require_native(array) || !require_fortran(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,
+ *                    DATA_TYPE* INPLACE_FARRAY3)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_FARRAY3)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,3) || !require_contiguous(array)
+      || !require_native(array) || !require_fortran(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DATA_TYPE*) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE INPLACE_ARRAY4[ANY][ANY][ANY][ANY])
+  (PyArrayObject* array=NULL)
+{
+  npy_intp size[4] = { $1_dim0, $1_dim1, $1_dim2 , $1_dim3 };
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,4) || !require_size(array, size, 4) ||
+      !require_contiguous(array) || !require_native(array)) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3, DIM_TYPE DIM4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,4) || !require_contiguous(array) ||
+      !require_native(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+  $5 = (DIM_TYPE) array_size(array,3);
+}
+
+/* Typemap suite for (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3, DIM_TYPE DIM4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  $1 = PySequence_Check($input);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+  (DATA_TYPE** array=NULL, PyArrayObject** object_array=NULL)
+{
+  npy_intp size[3] = { -1, -1, -1 };
+  PyArrayObject* temp_array;
+  Py_ssize_t i;
+
+  /* length of the list */
+  $2 = PyList_Size($input);
+
+  /* the arrays */
+  array = (DATA_TYPE **)malloc($2*sizeof(DATA_TYPE *));
+  object_array = (PyArrayObject **)calloc($2,sizeof(PyArrayObject *));
+
+  if (array == NULL || object_array == NULL)
+  {
+    SWIG_fail;
+  }
+
+  for (i=0; i<$2; i++)
+  {
+    temp_array = obj_to_array_no_conversion(PySequence_GetItem($input,i), DATA_TYPECODE);
+
+    /* the new array must be stored so that it can be destroyed in freearg */
+    object_array[i] = temp_array;
+
+    if ( !temp_array || !require_dimensions(temp_array, 3) ||
+      !require_contiguous(temp_array) ||
+      !require_native(temp_array) ||
+      !PyArray_EquivTypenums(array_type(temp_array), DATA_TYPECODE)
+    ) SWIG_fail;
+
+    /* store the size of the first array in the list, then use that for comparison. */
+    if (i == 0)
+    {
+      size[0] = array_size(temp_array,0);
+      size[1] = array_size(temp_array,1);
+      size[2] = array_size(temp_array,2);
+    }
+
+    if (!require_size(temp_array, size, 3)) SWIG_fail;
+
+    array[i] = (DATA_TYPE*) array_data(temp_array);
+  }
+
+  $1 = (DATA_TYPE**) array;
+  $3 = (DIM_TYPE) size[0];
+  $4 = (DIM_TYPE) size[1];
+  $5 = (DIM_TYPE) size[2];
+}
+%typemap(freearg)
+  (DATA_TYPE** INPLACE_ARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  if (array$argnum!=NULL) free(array$argnum);
+  if (object_array$argnum!=NULL) free(object_array$argnum);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4,
+ *                    DATA_TYPE* INPLACE_ARRAY4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_ARRAY4)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,4) || !require_contiguous(array)
+      || !require_native(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DIM_TYPE) array_size(array,3);
+  $5 = (DATA_TYPE*) array_data(array);
+}
+
+/* Typemap suite for (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2,
+ *                    DIM_TYPE DIM3, DIM_TYPE DIM4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_FARRAY4, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,4) || !require_contiguous(array) ||
+      !require_native(array) || !require_fortran(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = (DIM_TYPE) array_size(array,0);
+  $3 = (DIM_TYPE) array_size(array,1);
+  $4 = (DIM_TYPE) array_size(array,2);
+  $5 = (DIM_TYPE) array_size(array,3);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3,
+ *                    DATA_TYPE* INPLACE_FARRAY4)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DIM_TYPE DIM4, DATA_TYPE* INPLACE_FARRAY4)
+  (PyArrayObject* array=NULL)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_dimensions(array,4) || !require_contiguous(array)
+      || !require_native(array) || !require_fortran(array)) SWIG_fail;
+  $1 = (DIM_TYPE) array_size(array,0);
+  $2 = (DIM_TYPE) array_size(array,1);
+  $3 = (DIM_TYPE) array_size(array,2);
+  $4 = (DIM_TYPE) array_size(array,3);
+  $5 = (DATA_TYPE*) array_data(array);
+}
+
+/*************************/
+/* Argout Array Typemaps */
+/*************************/
+
+/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY1[ANY])
+ */
+%typemap(in,numinputs=0,
+         fragment="NumPy_Backward_Compatibility,NumPy_Macros")
+  (DATA_TYPE ARGOUT_ARRAY1[ANY])
+  (PyObject* array = NULL)
+{
+  npy_intp dims[1] = { $1_dim0 };
+  array = PyArray_SimpleNew(1, dims, DATA_TYPECODE);
+  if (!array) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(argout)
+  (DATA_TYPE ARGOUT_ARRAY1[ANY])
+{
+  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);
+}
+
+/* Typemap suite for (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)
+ */
+%typemap(in,numinputs=1,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)
+  (PyObject* array = NULL)
+{
+  npy_intp dims[1];
+  if (!PyInt_Check($input))
+  {
+    const char* typestring = pytype_string($input);
+    PyErr_Format(PyExc_TypeError,
+                 "Int dimension expected.  '%s' given.",
+                 typestring);
+    SWIG_fail;
+  }
+  $2 = (DIM_TYPE) PyInt_AsLong($input);
+  dims[0] = (npy_intp) $2;
+  array = PyArray_SimpleNew(1, dims, DATA_TYPECODE);
+  if (!array) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+}
+%typemap(argout)
+  (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1)
+{
+  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);
+}
+
+/* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)
+ */
+%typemap(in,numinputs=1,
+         fragment="NumPy_Fragments")
+  (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)
+  (PyObject* array = NULL)
+{
+  npy_intp dims[1];
+  if (!PyInt_Check($input))
+  {
+    const char* typestring = pytype_string($input);
+    PyErr_Format(PyExc_TypeError,
+                 "Int dimension expected.  '%s' given.",
+                 typestring);
+    SWIG_fail;
+  }
+  $1 = (DIM_TYPE) PyInt_AsLong($input);
+  dims[0] = (npy_intp) $1;
+  array = PyArray_SimpleNew(1, dims, DATA_TYPECODE);
+  if (!array) SWIG_fail;
+  $2 = (DATA_TYPE*) array_data(array);
+}
+%typemap(argout)
+  (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1)
+{
+  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);
+}
+
+/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])
+ */
+%typemap(in,numinputs=0,
+         fragment="NumPy_Backward_Compatibility,NumPy_Macros")
+  (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])
+  (PyObject* array = NULL)
+{
+  npy_intp dims[2] = { $1_dim0, $1_dim1 };
+  array = PyArray_SimpleNew(2, dims, DATA_TYPECODE);
+  if (!array) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(argout)
+  (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY])
+{
+  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);
+}
+
+/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])
+ */
+%typemap(in,numinputs=0,
+         fragment="NumPy_Backward_Compatibility,NumPy_Macros")
+  (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])
+  (PyObject* array = NULL)
+{
+  npy_intp dims[3] = { $1_dim0, $1_dim1, $1_dim2 };
+  array = PyArray_SimpleNew(3, dims, DATA_TYPECODE);
+  if (!array) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(argout)
+  (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY])
+{
+  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);
+}
+
+/* Typemap suite for (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])
+ */
+%typemap(in,numinputs=0,
+         fragment="NumPy_Backward_Compatibility,NumPy_Macros")
+  (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])
+  (PyObject* array = NULL)
+{
+  npy_intp dims[4] = { $1_dim0, $1_dim1, $1_dim2, $1_dim3 };
+  array = PyArray_SimpleNew(4, dims, DATA_TYPECODE);
+  if (!array) SWIG_fail;
+  $1 = ($1_ltype) array_data(array);
+}
+%typemap(argout)
+  (DATA_TYPE ARGOUT_ARRAY4[ANY][ANY][ANY][ANY])
+{
+  $result = SWIG_Python_AppendOutput($result,(PyObject*)array$argnum);
+}
+
+/*****************************/
+/* Argoutview Array Typemaps */
+/*****************************/
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1    )
+  (DATA_TYPE*  data_temp = NULL , DIM_TYPE  dim_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DATA_TYPE** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1)
+{
+  npy_intp dims[1] = { *$2 };
+  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DATA_TYPE** ARGOUTVIEW_ARRAY1)
+  (DIM_TYPE  dim_temp, DATA_TYPE*  data_temp = NULL )
+{
+  $1 = &dim_temp;
+  $2 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEW_ARRAY1)
+{
+  npy_intp dims[1] = { *$1 };
+  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$2));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )
+  (DATA_TYPE*  data_temp = NULL , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DATA_TYPE** ARGOUTVIEW_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+{
+  npy_intp dims[2] = { *$2, *$3 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEW_ARRAY2)
+  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_ARRAY2)
+{
+  npy_intp dims[2] = { *$1, *$2 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )
+  (DATA_TYPE*  data_temp = NULL  , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements")
+  (DATA_TYPE** ARGOUTVIEW_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+{
+  npy_intp dims[2] = { *$2, *$3 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEW_FARRAY2)
+  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL  )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEW_FARRAY2)
+{
+  npy_intp dims[2] = { *$1, *$2 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )
+  (DATA_TYPE* data_temp = NULL  , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DATA_TYPE** ARGOUTVIEW_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+{
+  npy_intp dims[3] = { *$2, *$3, *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,
+                      DATA_TYPE** ARGOUTVIEW_ARRAY3)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL)
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_ARRAY3)
+{
+  npy_intp dims[3] = { *$1, *$2, *$3 };
+  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )
+  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements")
+  (DATA_TYPE** ARGOUTVIEW_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+{
+  npy_intp dims[3] = { *$2, *$3, *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,
+                      DATA_TYPE** ARGOUTVIEW_FARRAY3)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DATA_TYPE** ARGOUTVIEW_FARRAY3)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL   )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEW_FARRAY3)
+{
+  npy_intp dims[3] = { *$1, *$2, *$3 };
+  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )
+  (DATA_TYPE* data_temp = NULL  , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+  $5 = &dim4_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DATA_TYPE** ARGOUTVIEW_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+{
+  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,
+                      DATA_TYPE** ARGOUTVIEW_ARRAY4)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEW_ARRAY4)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL  )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &dim4_temp;
+  $5 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_ARRAY4)
+{
+  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )
+  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+  $5 = &dim4_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements")
+  (DATA_TYPE** ARGOUTVIEW_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+{
+  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,
+                      DATA_TYPE** ARGOUTVIEW_FARRAY4)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEW_FARRAY4)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL   )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &dim4_temp;
+  $5 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEW_FARRAY4)
+{
+  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/*************************************/
+/* Managed Argoutview Array Typemaps */
+/*************************************/
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1    )
+  (DATA_TYPE*  data_temp = NULL  , DIM_TYPE  dim_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY1, DIM_TYPE* DIM1)
+{
+  npy_intp dims[1] = { *$2 };
+  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DATA_TYPE** ARGOUTVIEWM_ARRAY1)
+  (DIM_TYPE  dim_temp, DATA_TYPE*  data_temp = NULL  )
+{
+  $1 = &dim_temp;
+  $2 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DATA_TYPE** ARGOUTVIEWM_ARRAY1)
+{
+  npy_intp dims[1] = { *$1 };
+  PyObject* obj = PyArray_SimpleNewFromData(1, dims, DATA_TYPECODE, (void*)(*$2));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )
+  (DATA_TYPE*  data_temp = NULL  , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+{
+  npy_intp dims[2] = { *$2, *$3 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEWM_ARRAY2)
+  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL  )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_ARRAY2)
+{
+  npy_intp dims[2] = { *$1, *$2 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1     , DIM_TYPE* DIM2     )
+  (DATA_TYPE*  data_temp = NULL   , DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY2, DIM_TYPE* DIM1, DIM_TYPE* DIM2)
+{
+  npy_intp dims[2] = { *$2, *$3 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1     , DIM_TYPE* DIM2     , DATA_TYPE** ARGOUTVIEWM_FARRAY2)
+  (DIM_TYPE  dim1_temp, DIM_TYPE  dim2_temp, DATA_TYPE*  data_temp = NULL   )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DATA_TYPE** ARGOUTVIEWM_FARRAY2)
+{
+  npy_intp dims[2] = { *$1, *$2 };
+  PyObject* obj = PyArray_SimpleNewFromData(2, dims, DATA_TYPECODE, (void*)(*$3));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )
+  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+{
+  npy_intp dims[3] = { *$2, *$3, *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,
+                      DATA_TYPE** ARGOUTVIEWM_ARRAY3)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DATA_TYPE** ARGOUTVIEWM_ARRAY3)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL   )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_ARRAY3)
+{
+  npy_intp dims[3] = { *$1, *$2, *$3 };
+  PyObject* obj= PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    )
+  (DATA_TYPE* data_temp = NULL    , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY3, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+{
+  npy_intp dims[3] = { *$2, *$3, *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3,
+                      DATA_TYPE** ARGOUTVIEWM_FARRAY3)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DATA_TYPE** ARGOUTVIEWM_FARRAY3)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DATA_TYPE* data_temp = NULL    )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DATA_TYPE** ARGOUTVIEWM_FARRAY3)
+{
+  npy_intp dims[3] = { *$1, *$2, *$3 };
+  PyObject* obj = PyArray_SimpleNewFromData(3, dims, DATA_TYPECODE, (void*)(*$4));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )
+  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+  $5 = &dim4_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+{
+  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,
+                      DATA_TYPE** ARGOUTVIEWM_ARRAY4)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_ARRAY4)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL   )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &dim4_temp;
+  $5 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4)
+{
+  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )
+  (DATA_TYPE* data_temp = NULL    , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+  $5 = &dim4_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3)
+{
+  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,
+                      DATA_TYPE** ARGOUTVIEWM_FARRAY4)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_FARRAY4)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL    )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &dim4_temp;
+  $5 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4)
+{
+  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )
+  (DATA_TYPE* data_temp = NULL   , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+  $5 = &dim4_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_ARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+{
+  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,
+                      DATA_TYPE** ARGOUTVIEWM_ARRAY4)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_ARRAY4)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL   )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &dim4_temp;
+  $5 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_ARRAY4)
+{
+  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2,
+                      DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+ */
+%typemap(in,numinputs=0)
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    )
+  (DATA_TYPE* data_temp = NULL    , DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp)
+{
+  $1 = &data_temp;
+  $2 = &dim1_temp;
+  $3 = &dim2_temp;
+  $4 = &dim3_temp;
+  $5 = &dim4_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DATA_TYPE** ARGOUTVIEWM_FARRAY4, DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4)
+{
+  npy_intp dims[4] = { *$2, *$3, *$4 , *$5 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$1));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/* Typemap suite for (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4,
+                      DATA_TYPE** ARGOUTVIEWM_FARRAY4)
+ */
+%typemap(in,numinputs=0)
+  (DIM_TYPE* DIM1    , DIM_TYPE* DIM2    , DIM_TYPE* DIM3    , DIM_TYPE* DIM4    , DATA_TYPE** ARGOUTVIEWM_FARRAY4)
+  (DIM_TYPE dim1_temp, DIM_TYPE dim2_temp, DIM_TYPE dim3_temp, DIM_TYPE dim4_temp, DATA_TYPE* data_temp = NULL    )
+{
+  $1 = &dim1_temp;
+  $2 = &dim2_temp;
+  $3 = &dim3_temp;
+  $4 = &dim4_temp;
+  $5 = &data_temp;
+}
+%typemap(argout,
+         fragment="NumPy_Backward_Compatibility,NumPy_Array_Requirements,NumPy_Utilities")
+  (DIM_TYPE* DIM1, DIM_TYPE* DIM2, DIM_TYPE* DIM3, DIM_TYPE* DIM4, DATA_TYPE** ARGOUTVIEWM_FARRAY4)
+{
+  npy_intp dims[4] = { *$1, *$2, *$3 , *$4 };
+  PyObject* obj = PyArray_SimpleNewFromData(4, dims, DATA_TYPECODE, (void*)(*$5));
+  PyArrayObject* array = (PyArrayObject*) obj;
+
+  if (!array || !require_fortran(array)) SWIG_fail;
+
+%#ifdef SWIGPY_USE_CAPSULE
+    PyObject* cap = PyCapsule_New((void*)(*$1), SWIGPY_CAPSULE_NAME, free_cap);
+%#else
+    PyObject* cap = PyCObject_FromVoidPtr((void*)(*$1), free);
+%#endif
+
+%#if NPY_API_VERSION < 0x00000007
+  PyArray_BASE(array) = cap;
+%#else
+  PyArray_SetBaseObject(array,cap);
+%#endif
+
+  $result = SWIG_Python_AppendOutput($result,obj);
+}
+
+/**************************************/
+/* In-Place Array Typemap - flattened */
+/**************************************/
+
+/* Typemap suite for (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY,
+           fragment="NumPy_Macros")
+  (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT)
+{
+  $1 = is_array($input) && PyArray_EquivTypenums(array_type($input),
+                                                 DATA_TYPECODE);
+}
+%typemap(in,
+         fragment="NumPy_Fragments")
+  (DATA_TYPE* INPLACE_ARRAY_FLAT, DIM_TYPE DIM_FLAT)
+  (PyArrayObject* array=NULL, int i=1)
+{
+  array = obj_to_array_no_conversion($input, DATA_TYPECODE);
+  if (!array || !require_c_or_f_contiguous(array)
+      || !require_native(array)) SWIG_fail;
+  $1 = (DATA_TYPE*) array_data(array);
+  $2 = 1;
+  for (i=0; i < array_numdims(array); ++i) $2 *= array_size(array,i);
+}
+
+%enddef    /* %numpy_typemaps() macro */
+/* *************************************************************** */
+
+/* Concrete instances of the %numpy_typemaps() macro: Each invocation
+ * below applies all of the typemaps above to the specified data type.
+ */
+%numpy_typemaps(signed char       , NPY_BYTE     , int)
+%numpy_typemaps(unsigned char     , NPY_UBYTE    , int)
+%numpy_typemaps(short             , NPY_SHORT    , int)
+%numpy_typemaps(unsigned short    , NPY_USHORT   , int)
+%numpy_typemaps(int               , NPY_INT      , int)
+%numpy_typemaps(unsigned int      , NPY_UINT     , int)
+%numpy_typemaps(long              , NPY_LONG     , int)
+%numpy_typemaps(unsigned long     , NPY_ULONG    , int)
+%numpy_typemaps(long long         , NPY_LONGLONG , int)
+%numpy_typemaps(unsigned long long, NPY_ULONGLONG, int)
+%numpy_typemaps(float             , NPY_FLOAT    , int)
+%numpy_typemaps(double            , NPY_DOUBLE   , int)
+
+/* ***************************************************************
+ * The follow macro expansion does not work, because C++ bool is 4
+ * bytes and NPY_BOOL is 1 byte
+ *
+ *    %numpy_typemaps(bool, NPY_BOOL, int)
+ */
+
+/* ***************************************************************
+ * On my Mac, I get the following warning for this macro expansion:
+ * 'swig/python detected a memory leak of type 'long double *', no destructor found.'
+ *
+ *    %numpy_typemaps(long double, NPY_LONGDOUBLE, int)
+ */
+
+#ifdef __cplusplus
+
+%include <std_complex.i>
+
+%numpy_typemaps(std::complex<float>,  NPY_CFLOAT , int)
+%numpy_typemaps(std::complex<double>, NPY_CDOUBLE, int)
+
+#endif
+
+#endif /* SWIGPYTHON */
diff --git a/Wrap/swig/shared_pointers.i b/Wrap/swig/shared_pointers.i
new file mode 100644
index 0000000..601e897
--- /dev/null
+++ b/Wrap/swig/shared_pointers.i
@@ -0,0 +1,3 @@
+%shared_ptr(IMultiLayerBuilder)
+%shared_ptr(IObserver)
+%shared_ptr(IFitObserver)
diff --git a/Wrap/swig/tweaks.py b/Wrap/swig/tweaks.py
new file mode 100644
index 0000000..9f40be8
--- /dev/null
+++ b/Wrap/swig/tweaks.py
@@ -0,0 +1,44 @@
+# this script is used to manually tweak swig-generated wrapper
+
+from __future__ import print_function
+import sys
+import os
+import string
+
+# compatibility with windows filename conventions
+def windowsify(filename):
+    if ( sys.platform == "win32" ):
+        new_filename = filename.replace("/", "\\")
+    else:
+        new_filename = filename
+
+    return os.path.abspath(new_filename)
+
+if len(sys.argv) != 3:
+    print("Usage: tweaks.py inputfile outputfile")
+    exit(1)
+
+in_name = windowsify(sys.argv[1])
+out_name = windowsify(sys.argv[2])
+
+print("tweaks.py:", in_name, out_name)
+
+fd = open(in_name, "r")
+text_in = fd.read().splitlines()
+fd.close()
+
+text_out = []
+for line in text_in:
+    line = line.replace("_libBornAgainCore.ICloneable_transferToCPP(self)", "self.__disown__()")
+    line = line.replace("_libBornAgainCore.Histogram1D_getBinCenters(self)", "self.getBinCentersNumpy()")
+    line = line.replace("_libBornAgainCore.Histogram1D_getBinErrors(self)", "self.getBinErrorsNumpy()")
+    line = line.replace("_libBornAgainCore.Histogram1D_getBinValues(self)", "self.getBinValuesNumpy()")
+    text_out.append(line)
+
+# done the search/replace
+fd = open(out_name, "w")
+fd.write( "\n".join( text_out ) )
+fd.close()
+
+def simulate_then_plot_or_save():
+    print("JAA!")
diff --git a/Wrap/swig/warnings.i b/Wrap/swig/warnings.i
new file mode 100644
index 0000000..6541ca4
--- /dev/null
+++ b/Wrap/swig/warnings.i
@@ -0,0 +1,8 @@
+#pragma SWIG nowarn=314 // print conflicts with Python, renamed to _print
+#pragma SWIG nowarn=315 // nothing known about std::size_t
+#pragma SWIG nowarn=362 // operator=
+#pragma SWIG nowarn=389 // operator[]
+#pragma SWIG nowarn=473 // returning pointer in a director method (object ownership problem)
+#pragma SWIG nowarn=503 // operator<<
+#pragma SWIG nowarn=509 // overload ignored since reference=pointer
+#pragma SWIG nowarn=520 // shared_ptr not declared for entire hierarchy [stackoverflow 11380483]
diff --git a/auto/README b/auto/README
new file mode 100644
index 0000000..cd664e1
--- /dev/null
+++ b/auto/README
@@ -0,0 +1,20 @@
+This directory, auto, contains files that are automatically
+generated by tools other than CMake, Make, and the compiler.
+
+They are distributed as part of the source archive. A user
+who just wants to compile BornAgain should consider the
+contents of this directory as part of the source, period.
+
+A developer, on the other hand, will sooner or later need
+to regenerate some or all sources contained in this directory.
+For this, use the command top-level cmake command with option
+-DAUTOGENERATE=ON, or with more specific options like
+-DBORNAGAIN_GENERATE_BINDINGS=ON.
+
+Contents of this directory:
+
+Doc/man:
+  Unix man page in troff format, generated by pod2man.
+
+Wrap:
+  Python wrapper, generated by Doxygen and Swig.
diff --git a/auto/Wrap/doxygen_core.i b/auto/Wrap/doxygen_core.i
new file mode 100644
index 0000000..002b493
--- /dev/null
+++ b/auto/Wrap/doxygen_core.i
@@ -0,0 +1,14866 @@
+
+// File: index.xml
+
+// File: classAdjustMinimizerStrategy.xml
+%feature("docstring") AdjustMinimizerStrategy "
+
+Strategy modifies mimimizer settings before running minimization round.
+
+C++ includes: AdjustMinimizerStrategy.h
+";
+
+%feature("docstring")  AdjustMinimizerStrategy::AdjustMinimizerStrategy "AdjustMinimizerStrategy::AdjustMinimizerStrategy()
+";
+
+%feature("docstring")  AdjustMinimizerStrategy::AdjustMinimizerStrategy "AdjustMinimizerStrategy::AdjustMinimizerStrategy(const std::string &minimizerName, const std::string &algorithmName=std::string(), const std::string &optionString=std::string())
+";
+
+%feature("docstring")  AdjustMinimizerStrategy::clone "AdjustMinimizerStrategy * AdjustMinimizerStrategy::clone() const 
+";
+
+%feature("docstring")  AdjustMinimizerStrategy::setMinimizer "void AdjustMinimizerStrategy::setMinimizer(const std::string &minimizerName, const std::string &algorithmName=std::string(), const std::string &optionString=std::string())
+";
+
+%feature("docstring")  AdjustMinimizerStrategy::execute "void AdjustMinimizerStrategy::execute()
+";
+
+
+// File: classAngularPixelMap.xml
+%feature("docstring") AngularPixelMap "";
+
+%feature("docstring")  AngularPixelMap::AngularPixelMap "AngularPixelMap::AngularPixelMap(Bin1D alpha_bin, Bin1D phi_bin)
+";
+
+%feature("docstring")  AngularPixelMap::~AngularPixelMap "virtual AngularPixelMap::~AngularPixelMap()
+";
+
+%feature("docstring")  AngularPixelMap::clone "AngularPixelMap * AngularPixelMap::clone() const override
+";
+
+%feature("docstring")  AngularPixelMap::createZeroSizeMap "AngularPixelMap * AngularPixelMap::createZeroSizeMap(double x, double y) const override
+";
+
+%feature("docstring")  AngularPixelMap::getK "kvector_t AngularPixelMap::getK(double x, double y, double wavelength) const override
+";
+
+%feature("docstring")  AngularPixelMap::getIntegrationFactor "double AngularPixelMap::getIntegrationFactor(double x, double y) const override
+";
+
+%feature("docstring")  AngularPixelMap::getSolidAngle "double AngularPixelMap::getSolidAngle() const override
+";
+
+
+// File: classBasic2DParaCrystalBuilder.xml
+%feature("docstring") Basic2DParaCrystalBuilder "
+
+Builds sample: basic two dimensional paracrystal with various probability distribution functions (PDF's). They are initialized via component service.
+
+C++ includes: ParaCrystalBuilder.h
+";
+
+%feature("docstring")  Basic2DParaCrystalBuilder::Basic2DParaCrystalBuilder "Basic2DParaCrystalBuilder::Basic2DParaCrystalBuilder()
+";
+
+%feature("docstring")  Basic2DParaCrystalBuilder::~Basic2DParaCrystalBuilder "Basic2DParaCrystalBuilder::~Basic2DParaCrystalBuilder()
+";
+
+%feature("docstring")  Basic2DParaCrystalBuilder::buildSample "MultiLayer * Basic2DParaCrystalBuilder::buildSample() const 
+";
+
+
+// File: classBasicVector3D.xml
+%feature("docstring") BasicVector3D "
+
+Three-dimensional vector template, for use with integer, double, or complex components.
+
+C++ includes: BasicVector3D.h
+";
+
+%feature("docstring")  BasicVector3D::BasicVector3D "BasicVector3D< T >::BasicVector3D()
+
+Default constructor. 
+";
+
+%feature("docstring")  BasicVector3D::BasicVector3D "BasicVector3D< T >::BasicVector3D(const T x1, const T y1, const T z1)
+
+Constructor from cartesian components. 
+";
+
+%feature("docstring")  BasicVector3D::x "T BasicVector3D< T >::x() const
+
+Returns x-component in cartesian coordinate system. 
+";
+
+%feature("docstring")  BasicVector3D::y "T BasicVector3D< T >::y() const
+
+Returns y-component in cartesian coordinate system. 
+";
+
+%feature("docstring")  BasicVector3D::z "T BasicVector3D< T >::z() const
+
+Returns z-component in cartesian coordinate system. 
+";
+
+%feature("docstring")  BasicVector3D::setX "void BasicVector3D< T >::setX(const T &a)
+
+Sets x-component in cartesian coordinate system. 
+";
+
+%feature("docstring")  BasicVector3D::setY "void BasicVector3D< T >::setY(const T &a)
+
+Sets y-component in cartesian coordinate system. 
+";
+
+%feature("docstring")  BasicVector3D::setZ "void BasicVector3D< T >::setZ(const T &a)
+
+Sets z-component in cartesian coordinate system. 
+";
+
+%feature("docstring")  BasicVector3D::setXYZ "void BasicVector3D< T >::setXYZ(const T &x1, const T &y1, const T &z1)
+
+Sets components in cartesian coordinate system. 
+";
+
+%feature("docstring")  BasicVector3D::conj "BasicVector3D<T> BasicVector3D< T >::conj() const
+
+Returns complex conjugate vector. 
+";
+
+%feature("docstring")  BasicVector3D::mag2 "double BasicVector3D< T >::mag2() const
+
+Returns squared magnitude squared of the vector. 
+";
+
+%feature("docstring")  BasicVector3D::mag "double BasicVector3D< T >::mag() const
+
+Returns magnitude of the vector. 
+";
+
+%feature("docstring")  BasicVector3D::magxy2 "double BasicVector3D< T >::magxy2() const
+
+Returns squared distance from z axis. 
+";
+
+%feature("docstring")  BasicVector3D::magxy "double BasicVector3D< T >::magxy() const
+
+Returns distance from z axis. 
+";
+
+%feature("docstring")  BasicVector3D::phi "double BasicVector3D< T >::phi() const
+
+Returns azimuth angle. 
+";
+
+%feature("docstring")  BasicVector3D::theta "double BasicVector3D< T >::theta() const
+
+Returns polar angle. 
+";
+
+%feature("docstring")  BasicVector3D::cosTheta "double BasicVector3D< T >::cosTheta() const
+
+Returns cosine of polar angle. 
+";
+
+%feature("docstring")  BasicVector3D::sin2Theta "double BasicVector3D< T >::sin2Theta() const
+
+Returns squared sine of polar angle. 
+";
+
+%feature("docstring")  BasicVector3D::unit "BasicVector3D<T> BasicVector3D< T >::unit() const
+
+Returns unit vector in direction of this. Throws for null vector. 
+";
+
+%feature("docstring")  BasicVector3D::complex "BasicVector3D<std::complex<double> > BasicVector3D< T >::complex() const
+
+Returns this, trivially converted to complex type. 
+";
+
+%feature("docstring")  BasicVector3D::real "BasicVector3D<double> BasicVector3D< T >::real() const
+
+Returns real parts. 
+";
+
+%feature("docstring")  BasicVector3D::dot "auto BasicVector3D< T >::dot(const BasicVector3D< U > &v) const -> decltype(this->x()*v.x())
+
+Returns dot product of vectors (antilinear in the first [=self] argument).
+
+Returns dot product of (complex) vectors (antilinear in the first [=self] argument). 
+";
+
+%feature("docstring")  BasicVector3D::cross "auto BasicVector3D< T >::cross(const BasicVector3D< U > &v) const -> BasicVector3D< decltype(this->x()*v.x())>
+
+Returns cross product of vectors (linear in both arguments).
+
+Returns cross product of (complex) vectors. 
+";
+
+%feature("docstring")  BasicVector3D::angle "double BasicVector3D< T >::angle(const BasicVector3D< T > &v) const
+
+Returns angle with respect to another vector. 
+";
+
+%feature("docstring")  BasicVector3D::project "BasicVector3D<T> BasicVector3D< T >::project(const BasicVector3D< T > &v) const
+
+Returns projection of this onto other vector: (this*v)*v/|v|^2. 
+";
+
+%feature("docstring")  BasicVector3D::rotatedX "BasicVector3D<T> BasicVector3D< T >::rotatedX(double a) const
+
+Returns result of rotation around x-axis. 
+";
+
+%feature("docstring")  BasicVector3D::rotatedY "BasicVector3D<T> BasicVector3D< T >::rotatedY(double a) const
+
+Returns result of rotation around y-axis. 
+";
+
+%feature("docstring")  BasicVector3D::rotatedZ "BasicVector3D<T> BasicVector3D< T >::rotatedZ(double a) const
+
+Returns result of rotation around z-axis. 
+";
+
+%feature("docstring")  BasicVector3D::rotated "BasicVector3D<T> BasicVector3D< T >::rotated(double a, const BasicVector3D< T > &v) const
+
+Returns result of rotation around the axis specified by another vector. 
+";
+
+%feature("docstring")  BasicVector3D::conj "BasicVector3D< complex_t > BasicVector3D< complex_t >::conj() const
+
+Returns complex conjugate vector. 
+";
+
+%feature("docstring")  BasicVector3D::real "BasicVector3D< double > BasicVector3D< complex_t >::real() const
+
+Returns real parts. 
+";
+
+%feature("docstring")  BasicVector3D::unit "BasicVector3D< complex_t > BasicVector3D< complex_t >::unit() const
+";
+
+
+// File: classBeam.xml
+%feature("docstring") Beam "
+
+Ideal collimated beam defined by wavelength, direction and intensity.
+
+C++ includes: Beam.h
+";
+
+%feature("docstring")  Beam::Beam "Beam::Beam()
+";
+
+%feature("docstring")  Beam::Beam "Beam::Beam(const Beam &other)
+";
+
+%feature("docstring")  Beam::~Beam "virtual Beam::~Beam()
+";
+
+%feature("docstring")  Beam::getCentralK "kvector_t Beam::getCentralK() const
+
+Returns the wavevector. 
+";
+
+%feature("docstring")  Beam::setCentralK "void Beam::setCentralK(double wavelength, double alpha_i, double phi_i)
+
+Sets the wavevector in terms of wavelength and incoming angles. 
+";
+
+%feature("docstring")  Beam::getIntensity "double Beam::getIntensity() const
+
+Returns the beam intensity in neutrons/sec. 
+";
+
+%feature("docstring")  Beam::setIntensity "void Beam::setIntensity(double intensity)
+
+Sets the beam intensity in neutrons/sec. 
+";
+
+%feature("docstring")  Beam::setPolarization "void Beam::setPolarization(const kvector_t bloch_vector)
+
+Sets the polarization density matrix according to the given Bloch vector. 
+";
+
+%feature("docstring")  Beam::getPolarization "Eigen::Matrix2cd Beam::getPolarization() const
+
+Returns the polarization density matrix (in spin basis along z-axis) 
+";
+
+%feature("docstring")  Beam::getWavelength "double Beam::getWavelength() const 
+";
+
+%feature("docstring")  Beam::getAlpha "double Beam::getAlpha() const 
+";
+
+%feature("docstring")  Beam::getPhi "double Beam::getPhi() const 
+";
+
+
+// File: structBin1D.xml
+%feature("docstring") Bin1D "";
+
+%feature("docstring")  Bin1D::Bin1D "Bin1D::Bin1D()
+";
+
+%feature("docstring")  Bin1D::Bin1D "Bin1D::Bin1D(double lower, double upper)
+";
+
+%feature("docstring")  Bin1D::getMidPoint "double Bin1D::getMidPoint() const 
+";
+
+%feature("docstring")  Bin1D::getBinSize "double Bin1D::getBinSize() const 
+";
+
+
+// File: classBin1DCVector.xml
+%feature("docstring") Bin1DCVector "
+
+An one-dimensional range of cvector_t's.
+
+C++ includes: Bin.h
+";
+
+%feature("docstring")  Bin1DCVector::Bin1DCVector "Bin1DCVector::Bin1DCVector()
+";
+
+%feature("docstring")  Bin1DCVector::Bin1DCVector "Bin1DCVector::Bin1DCVector(const cvector_t lower, const cvector_t upper)
+";
+
+%feature("docstring")  Bin1DCVector::Bin1DCVector "Bin1DCVector::Bin1DCVector(double wavelength, const Bin1D &alpha_bin, const Bin1D &phi_bin)
+
+creation on  Bin1DCVector from alpha and phi bins 
+";
+
+%feature("docstring")  Bin1DCVector::getMidPoint "cvector_t Bin1DCVector::getMidPoint() const 
+";
+
+%feature("docstring")  Bin1DCVector::getDelta "cvector_t Bin1DCVector::getDelta() const 
+";
+
+
+// File: structBin1DKVector.xml
+%feature("docstring") Bin1DKVector "
+
+An one-dimensional range of kvector_t's.
+
+C++ includes: Bin.h
+";
+
+%feature("docstring")  Bin1DKVector::Bin1DKVector "Bin1DKVector::Bin1DKVector()
+";
+
+%feature("docstring")  Bin1DKVector::Bin1DKVector "Bin1DKVector::Bin1DKVector(const kvector_t lower, const kvector_t upper)
+";
+
+%feature("docstring")  Bin1DKVector::Bin1DKVector "Bin1DKVector::Bin1DKVector(double wavelength, const Bin1D &alpha_bin, const Bin1D &phi_bin)
+
+creation on  Bin1DKVector from alpha and phi bins 
+";
+
+%feature("docstring")  Bin1DKVector::getMidPoint "kvector_t Bin1DKVector::getMidPoint() const 
+";
+
+%feature("docstring")  Bin1DKVector::getDelta "kvector_t Bin1DKVector::getDelta() const 
+";
+
+
+// File: classBoxCompositionBuilder.xml
+%feature("docstring") BoxCompositionBuilder "
+
+Parent class to test all kind of compositions made out of boxes. Reproduces Python functional test transform_BoxComposition.py.
+
+C++ includes: BoxCompositionBuilder.h
+";
+
+%feature("docstring")  BoxCompositionBuilder::BoxCompositionBuilder "BoxCompositionBuilder::BoxCompositionBuilder()
+";
+
+%feature("docstring")  BoxCompositionBuilder::~BoxCompositionBuilder "BoxCompositionBuilder::~BoxCompositionBuilder()
+";
+
+
+// File: classBoxCompositionRotateXBuilder.xml
+%feature("docstring") BoxCompositionRotateXBuilder "
+
+Two boxes in particle composition rotated in X by 90 degrees.
+
+C++ includes: BoxCompositionBuilder.h
+";
+
+%feature("docstring")  BoxCompositionRotateXBuilder::BoxCompositionRotateXBuilder "BoxCompositionRotateXBuilder::BoxCompositionRotateXBuilder()
+";
+
+%feature("docstring")  BoxCompositionRotateXBuilder::buildSample "MultiLayer * BoxCompositionRotateXBuilder::buildSample() const 
+";
+
+
+// File: classBoxCompositionRotateYBuilder.xml
+%feature("docstring") BoxCompositionRotateYBuilder "
+
+Two boxes in particle composition rotated in Y by 90 degrees.
+
+C++ includes: BoxCompositionBuilder.h
+";
+
+%feature("docstring")  BoxCompositionRotateYBuilder::BoxCompositionRotateYBuilder "BoxCompositionRotateYBuilder::BoxCompositionRotateYBuilder()
+";
+
+%feature("docstring")  BoxCompositionRotateYBuilder::buildSample "MultiLayer * BoxCompositionRotateYBuilder::buildSample() const 
+";
+
+
+// File: classBoxCompositionRotateZandYBuilder.xml
+%feature("docstring") BoxCompositionRotateZandYBuilder "
+
+Two boxes in particle composition rotated in Z and Y by 90 degrees.
+
+C++ includes: BoxCompositionBuilder.h
+";
+
+%feature("docstring")  BoxCompositionRotateZandYBuilder::BoxCompositionRotateZandYBuilder "BoxCompositionRotateZandYBuilder::BoxCompositionRotateZandYBuilder()
+";
+
+%feature("docstring")  BoxCompositionRotateZandYBuilder::buildSample "MultiLayer * BoxCompositionRotateZandYBuilder::buildSample() const 
+";
+
+
+// File: classBoxCompositionRotateZBuilder.xml
+%feature("docstring") BoxCompositionRotateZBuilder "
+
+Two boxes in particle composition rotated in Z by 90 degrees.
+
+C++ includes: BoxCompositionBuilder.h
+";
+
+%feature("docstring")  BoxCompositionRotateZBuilder::BoxCompositionRotateZBuilder "BoxCompositionRotateZBuilder::BoxCompositionRotateZBuilder()
+";
+
+%feature("docstring")  BoxCompositionRotateZBuilder::buildSample "MultiLayer * BoxCompositionRotateZBuilder::buildSample() const 
+";
+
+
+// File: classBoxStackCompositionBuilder.xml
+%feature("docstring") BoxStackCompositionBuilder "
+
+Two different boxes are first rotated and then composed, composition is then rotated.
+
+C++ includes: BoxCompositionBuilder.h
+";
+
+%feature("docstring")  BoxStackCompositionBuilder::BoxStackCompositionBuilder "BoxStackCompositionBuilder::BoxStackCompositionBuilder()
+";
+
+%feature("docstring")  BoxStackCompositionBuilder::buildSample "MultiLayer * BoxStackCompositionBuilder::buildSample() const 
+";
+
+
+// File: structIntegratorReal_1_1CallBackHolder.xml
+%feature("docstring") IntegratorReal::CallBackHolder "
+
+structure holding the object and possible extra parameters
+
+C++ includes: IntegratorReal.h
+";
+
+
+// File: structIntegratorMCMiser_1_1CallBackHolder.xml
+%feature("docstring") IntegratorMCMiser::CallBackHolder "
+
+structure holding the object and possible extra parameters
+
+C++ includes: IntegratorMCMiser.h
+";
+
+
+// File: classCenteredSquareLatticeBuilder.xml
+%feature("docstring") CenteredSquareLatticeBuilder "
+
+Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
+
+C++ includes: TwoDimLatticeBuilder.h
+";
+
+%feature("docstring")  CenteredSquareLatticeBuilder::CenteredSquareLatticeBuilder "CenteredSquareLatticeBuilder::CenteredSquareLatticeBuilder()
+";
+
+%feature("docstring")  CenteredSquareLatticeBuilder::buildSample "MultiLayer * CenteredSquareLatticeBuilder::buildSample() const 
+";
+
+
+// File: classChiSquaredModule.xml
+%feature("docstring") ChiSquaredModule "
+
+Calculation of chi2 between two data sets.
+
+C++ includes: ChiSquaredModule.h
+";
+
+%feature("docstring")  ChiSquaredModule::ChiSquaredModule "ChiSquaredModule::ChiSquaredModule()
+";
+
+%feature("docstring")  ChiSquaredModule::ChiSquaredModule "ChiSquaredModule::ChiSquaredModule(const ChiSquaredModule &other)
+";
+
+%feature("docstring")  ChiSquaredModule::~ChiSquaredModule "virtual ChiSquaredModule::~ChiSquaredModule()
+";
+
+%feature("docstring")  ChiSquaredModule::clone "virtual ChiSquaredModule* ChiSquaredModule::clone() const
+
+clone method 
+";
+
+%feature("docstring")  ChiSquaredModule::processFitElements "void ChiSquaredModule::processFitElements(std::vector< FitElement >::iterator first, std::vector< FitElement >::iterator last)
+";
+
+
+// File: classExceptions_1_1ClassInitializationException.xml
+%feature("docstring") Exceptions::ClassInitializationException "";
+
+%feature("docstring")  Exceptions::ClassInitializationException::ClassInitializationException "Exceptions::ClassInitializationException::ClassInitializationException(const std::string &message)
+";
+
+
+// File: classComputationOutcome.xml
+%feature("docstring") ComputationOutcome "
+
+Completion status (flag and text) of a numeric computation. Pure virtual base class for our model evaluation routines. Currently, the only child is Computations, which is the base for some more classes.
+
+C++ includes: ComputationOutcome.h
+";
+
+%feature("docstring")  ComputationOutcome::ComputationOutcome "ComputationOutcome::ComputationOutcome()
+";
+
+%feature("docstring")  ComputationOutcome::isCompleted "bool ComputationOutcome::isCompleted() const 
+";
+
+%feature("docstring")  ComputationOutcome::getRunMessage "std::string ComputationOutcome::getRunMessage() const 
+";
+
+%feature("docstring")  ComputationOutcome::setRunning "void ComputationOutcome::setRunning()
+";
+
+%feature("docstring")  ComputationOutcome::setCompleted "void ComputationOutcome::setCompleted()
+";
+
+%feature("docstring")  ComputationOutcome::setFailed "void ComputationOutcome::setFailed()
+";
+
+%feature("docstring")  ComputationOutcome::setRunMessage "void ComputationOutcome::setRunMessage(const std::string &message)
+";
+
+
+// File: classConstKBinAxis.xml
+%feature("docstring") ConstKBinAxis "
+
+Axis with fixed bin size in sin(angle) space.
+
+C++ includes: ConstKBinAxis.h
+";
+
+%feature("docstring")  ConstKBinAxis::ConstKBinAxis "ConstKBinAxis::ConstKBinAxis(const std::string &name, size_t nbins, double start, double end)
+
+ConstKBinAxis constructor.
+
+Parameters:
+-----------
+
+name: 
+Axis name
+
+nbins: 
+number of bins
+
+start: 
+low edge of first bin
+
+end: 
+upper edge of last bin 
+";
+
+%feature("docstring")  ConstKBinAxis::~ConstKBinAxis "virtual ConstKBinAxis::~ConstKBinAxis()
+";
+
+%feature("docstring")  ConstKBinAxis::clone "ConstKBinAxis * ConstKBinAxis::clone() const
+
+clone function 
+";
+
+%feature("docstring")  ConstKBinAxis::createClippedAxis "ConstKBinAxis * ConstKBinAxis::createClippedAxis(double left, double right) const
+
+Creates a new clipped axis. 
+";
+
+
+// File: classConvolutionDetectorResolution.xml
+%feature("docstring") ConvolutionDetectorResolution "
+
+Limitation: this class assumes that the data points are evenly distributed on each axis.
+
+Convolutes the intensity in 1 or 2 dimensions with a resolution function.
+
+C++ includes: ConvolutionDetectorResolution.h
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::ConvolutionDetectorResolution "ConvolutionDetectorResolution::ConvolutionDetectorResolution(cumulative_DF_1d res_function_1d)
+
+Constructor taking a 1 dimensional resolution function as argument. 
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::ConvolutionDetectorResolution "ConvolutionDetectorResolution::ConvolutionDetectorResolution(IResolutionFunction2D *p_res_function_2d)
+
+Constructor taking a 2 dimensional resolution function as argument. 
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::ConvolutionDetectorResolution "ConvolutionDetectorResolution::ConvolutionDetectorResolution(const IResolutionFunction2D &p_res_function_2d)
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::~ConvolutionDetectorResolution "ConvolutionDetectorResolution::~ConvolutionDetectorResolution()
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::applyDetectorResolution "void ConvolutionDetectorResolution::applyDetectorResolution(OutputData< double > *p_intensity_map) const
+
+Convolve given intensities with the encapsulated resolution. 
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::addParametersToExternalPool "std::string ConvolutionDetectorResolution::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const
+
+Adds parameters from local pool to external pool and recursively call children. 
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::clone "ConvolutionDetectorResolution * ConvolutionDetectorResolution::clone() const
+
+clone object 
+";
+
+%feature("docstring")  ConvolutionDetectorResolution::getResolutionFunction2D "const IResolutionFunction2D * ConvolutionDetectorResolution::getResolutionFunction2D() const 
+";
+
+
+// File: classMathFunctions_1_1Convolve.xml
+%feature("docstring") MathFunctions::Convolve "
+
+Convolution of two real vectors (in 1D or 2D) using Fast Fourier Transform.
+
+Usage: std::vector<double> signal, kernel, result;  Convolve cv; cv.fftconvolve(signal, kernel, result)
+
+Given code rely on code from Jeremy Fix page http://jeremy.fix.free.fr/spip.php?article15 see also \"Efficient convolution using the Fast Fourier Transform, Application in C++\" by Jeremy Fix, May 30, 2011
+
+C++ includes: Convolve.h
+";
+
+%feature("docstring")  MathFunctions::Convolve::Convolve "MathFunctions::Convolve::Convolve()
+";
+
+%feature("docstring")  MathFunctions::Convolve::fftconvolve "void MathFunctions::Convolve::fftconvolve(const double1d_t &source, const double1d_t &kernel, double1d_t &result)
+
+convolution in 1D 
+";
+
+%feature("docstring")  MathFunctions::Convolve::fftconvolve "void MathFunctions::Convolve::fftconvolve(const double2d_t &source, const double2d_t &kernel, double2d_t &result)
+
+convolution in 2D 
+";
+
+%feature("docstring")  MathFunctions::Convolve::init "void MathFunctions::Convolve::init(int h_src, int w_src, int h_kernel, int w_kernel)
+
+prepare arrays for 2D convolution of given vectors 
+";
+
+%feature("docstring")  MathFunctions::Convolve::setMode "void MathFunctions::Convolve::setMode(EConvolutionMode mode)
+
+Sets convolution mode. 
+";
+
+
+// File: classCoreShellBoxRotateZandYBuilder.xml
+%feature("docstring") CoreShellBoxRotateZandYBuilder "
+
+Rotation and translation of core shell box particle in 3 layers system.
+
+C++ includes: CoreShellParticleBuilder.h
+";
+
+%feature("docstring")  CoreShellBoxRotateZandYBuilder::CoreShellBoxRotateZandYBuilder "CoreShellBoxRotateZandYBuilder::CoreShellBoxRotateZandYBuilder()
+";
+
+%feature("docstring")  CoreShellBoxRotateZandYBuilder::buildSample "MultiLayer * CoreShellBoxRotateZandYBuilder::buildSample() const 
+";
+
+
+// File: classCoreShellParticleBuilder.xml
+%feature("docstring") CoreShellParticleBuilder "
+
+Builds sample: Core Shell Nanoparticles (IsGISAXS example #11).
+
+C++ includes: CoreShellParticleBuilder.h
+";
+
+%feature("docstring")  CoreShellParticleBuilder::CoreShellParticleBuilder "CoreShellParticleBuilder::CoreShellParticleBuilder()
+";
+
+%feature("docstring")  CoreShellParticleBuilder::buildSample "MultiLayer * CoreShellParticleBuilder::buildSample() const 
+";
+
+
+// File: classCosineRippleBuilder.xml
+%feature("docstring") CosineRippleBuilder "
+
+Builds sample: cosine ripple within the 1D-paracrystal model.
+
+C++ includes: RipplesBuilder.h
+";
+
+%feature("docstring")  CosineRippleBuilder::CosineRippleBuilder "CosineRippleBuilder::CosineRippleBuilder()
+";
+
+%feature("docstring")  CosineRippleBuilder::buildSample "MultiLayer * CosineRippleBuilder::buildSample() const 
+";
+
+
+// File: classCrystal.xml
+%feature("docstring") Crystal "
+
+A crystal structure with a  ParticleComposition as a basis. Used in  MesoCrystal, where it is given an outer shape.
+
+C++ includes: Crystal.h
+";
+
+%feature("docstring")  Crystal::Crystal "Crystal::Crystal(const ParticleComposition &lattice_basis, const Lattice &lattice)
+";
+
+%feature("docstring")  Crystal::~Crystal "Crystal::~Crystal()
+";
+
+%feature("docstring")  Crystal::clone "Crystal * Crystal::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  Crystal::cloneInvertB "Crystal * Crystal::cloneInvertB() const final
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  Crystal::accept "void Crystal::accept(ISampleVisitor *visitor) const final
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  Crystal::setAmbientMaterial "void Crystal::setAmbientMaterial(const IMaterial &material) final
+";
+
+%feature("docstring")  Crystal::getAmbientMaterial "const IMaterial * Crystal::getAmbientMaterial() const final
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  Crystal::createTotalFormFactor "IFormFactor * Crystal::createTotalFormFactor(const IFormFactor &meso_crystal_form_factor, const IRotation *p_rotation, const kvector_t &translation) const
+
+Creates a total form factor for the mesocrystal with a specific shape and content The bulk content of the mesocrystal is encapsulated by the  IClusteredParticles object itself 
+";
+
+%feature("docstring")  Crystal::getTransformedLattice "Lattice Crystal::getTransformedLattice(const IRotation *p_rotation) const 
+";
+
+%feature("docstring")  Crystal::getLatticeBasis "const ParticleComposition* Crystal::getLatticeBasis() const 
+";
+
+%feature("docstring")  Crystal::setDWFactor "void Crystal::setDWFactor(double dw_factor)
+";
+
+
+// File: classCumulativeValue.xml
+%feature("docstring") CumulativeValue "
+
+The cumulative value with average and rms on-the-flight calculations.
+
+C++ includes: CumulativeValue.h
+";
+
+%feature("docstring")  CumulativeValue::CumulativeValue "CumulativeValue::CumulativeValue()
+";
+
+%feature("docstring")  CumulativeValue::clear "void CumulativeValue::clear()
+";
+
+%feature("docstring")  CumulativeValue::setContent "void CumulativeValue::setContent(double value)
+";
+
+%feature("docstring")  CumulativeValue::add "void CumulativeValue::add(double value, double weight=1.0)
+";
+
+%feature("docstring")  CumulativeValue::getNumberOfEntries "int CumulativeValue::getNumberOfEntries() const 
+";
+
+%feature("docstring")  CumulativeValue::getContent "double CumulativeValue::getContent() const 
+";
+
+%feature("docstring")  CumulativeValue::getAverage "double CumulativeValue::getAverage() const 
+";
+
+%feature("docstring")  CumulativeValue::getRMS "double CumulativeValue::getRMS() const 
+";
+
+
+// File: classCustomBinAxis.xml
+%feature("docstring") CustomBinAxis "
+
+Axis with fixed bin size in sin(angle) space used for numerical comparison with IsGisaxs. The main feature of the axis is that it produces zero bin sizes.
+
+C++ includes: CustomBinAxis.h
+";
+
+%feature("docstring")  CustomBinAxis::CustomBinAxis "CustomBinAxis::CustomBinAxis(const std::string &name, size_t nbins, double start, double end)
+
+CustomBinAxis constructor.
+
+Parameters:
+-----------
+
+name: 
+Axis name
+
+nbins: 
+number of bins
+
+start: 
+center of first bin (IsGisaxs convention)
+
+end: 
+center of last bin (IsGisaxs convention) 
+";
+
+%feature("docstring")  CustomBinAxis::~CustomBinAxis "virtual CustomBinAxis::~CustomBinAxis()
+";
+
+%feature("docstring")  CustomBinAxis::clone "CustomBinAxis * CustomBinAxis::clone() const
+
+clone function 
+";
+
+%feature("docstring")  CustomBinAxis::getBin "Bin1D CustomBinAxis::getBin(size_t index) const
+
+retrieve a 1d bin for the given index 
+";
+
+%feature("docstring")  CustomBinAxis::getBinCenters "std::vector< double > CustomBinAxis::getBinCenters() const 
+";
+
+%feature("docstring")  CustomBinAxis::createClippedAxis "CustomBinAxis * CustomBinAxis::createClippedAxis(double left, double right) const
+
+Creates a new clipped axis. 
+";
+
+
+// File: classCustomMorphologyBuilder.xml
+%feature("docstring") CustomMorphologyBuilder "
+
+Builds sample: mixture of different particles (IsGISAXS example #7)
+
+C++ includes: CustomMorphologyBuilder.h
+";
+
+%feature("docstring")  CustomMorphologyBuilder::CustomMorphologyBuilder "CustomMorphologyBuilder::CustomMorphologyBuilder()
+";
+
+%feature("docstring")  CustomMorphologyBuilder::buildSample "MultiLayer * CustomMorphologyBuilder::buildSample() const 
+";
+
+
+// File: classCylindersAndPrismsBuilder.xml
+%feature("docstring") CylindersAndPrismsBuilder "
+
+Builds sample: mixture of cylinders and prisms without interference (IsGISAXS example #1)
+
+C++ includes: CylindersAndPrismsBuilder.h
+";
+
+%feature("docstring")  CylindersAndPrismsBuilder::CylindersAndPrismsBuilder "CylindersAndPrismsBuilder::CylindersAndPrismsBuilder()
+";
+
+%feature("docstring")  CylindersAndPrismsBuilder::buildSample "MultiLayer * CylindersAndPrismsBuilder::buildSample() const 
+";
+
+
+// File: classCylindersInBABuilder.xml
+%feature("docstring") CylindersInBABuilder "
+
+Builds sample: cylinder formfactor in BA (IsGISAXS example #3, part II)
+
+C++ includes: CylindersBuilder.h
+";
+
+%feature("docstring")  CylindersInBABuilder::CylindersInBABuilder "CylindersInBABuilder::CylindersInBABuilder()
+";
+
+%feature("docstring")  CylindersInBABuilder::buildSample "MultiLayer * CylindersInBABuilder::buildSample() const 
+";
+
+
+// File: classCylindersInDWBABuilder.xml
+%feature("docstring") CylindersInDWBABuilder "
+
+Builds sample: cylinder formfactor in DWBA (IsGISAXS example #3, part I)
+
+C++ includes: CylindersBuilder.h
+";
+
+%feature("docstring")  CylindersInDWBABuilder::CylindersInDWBABuilder "CylindersInDWBABuilder::CylindersInDWBABuilder()
+";
+
+%feature("docstring")  CylindersInDWBABuilder::buildSample "MultiLayer * CylindersInDWBABuilder::buildSample() const 
+";
+
+
+// File: classCylindersInSSCABuilder.xml
+%feature("docstring") CylindersInSSCABuilder "
+
+Builds sample: size spacing correlation approximation (IsGISAXS example #15).
+
+C++ includes: SizeDistributionModelsBuilder.h
+";
+
+%feature("docstring")  CylindersInSSCABuilder::CylindersInSSCABuilder "CylindersInSSCABuilder::CylindersInSSCABuilder()
+";
+
+%feature("docstring")  CylindersInSSCABuilder::buildSample "MultiLayer * CylindersInSSCABuilder::buildSample() const 
+";
+
+
+// File: classCylindersWithSizeDistributionBuilder.xml
+%feature("docstring") CylindersWithSizeDistributionBuilder "
+
+Cylinders in BA with size distributions (IsGISAXS example #3, part II).
+
+C++ includes: ParticleDistributionsBuilder.h
+";
+
+%feature("docstring")  CylindersWithSizeDistributionBuilder::CylindersWithSizeDistributionBuilder "CylindersWithSizeDistributionBuilder::CylindersWithSizeDistributionBuilder()
+";
+
+%feature("docstring")  CylindersWithSizeDistributionBuilder::buildSample "MultiLayer * CylindersWithSizeDistributionBuilder::buildSample() const 
+";
+
+
+// File: classExceptions_1_1DeadReferenceException.xml
+%feature("docstring") Exceptions::DeadReferenceException "";
+
+%feature("docstring")  Exceptions::DeadReferenceException::DeadReferenceException "Exceptions::DeadReferenceException::DeadReferenceException(const std::string &message)
+";
+
+
+// File: classDecoratedLayerComputation.xml
+%feature("docstring") DecoratedLayerComputation "
+
+Computes the scattering contribution from one layer with particles in/on it. Controlled by  MainComputation.
+
+C++ includes: DecoratedLayerComputation.h
+";
+
+%feature("docstring")  DecoratedLayerComputation::DecoratedLayerComputation "DecoratedLayerComputation::DecoratedLayerComputation(const Layer *p_layer, size_t layout_index=0)
+";
+
+%feature("docstring")  DecoratedLayerComputation::setSpecularInfo "void DecoratedLayerComputation::setSpecularInfo(const LayerSpecularInfo &specular_info)
+";
+
+%feature("docstring")  DecoratedLayerComputation::eval "void DecoratedLayerComputation::eval(const SimulationOptions &options, ProgressHandler *progress, bool polarized, const std::vector< SimulationElement >::iterator &begin_it, const std::vector< SimulationElement >::iterator &end_it) const
+
+Computes scattering intensity for given range of simulation elements. 
+";
+
+
+// File: classDecouplingApproximationStrategy1.xml
+%feature("docstring") DecouplingApproximationStrategy1 "
+
+Strategy class to compute the total scalar scattering from a decorated layer in decoupling approximation.
+
+C++ includes: DecouplingApproximationStrategy.h
+";
+
+%feature("docstring")  DecouplingApproximationStrategy1::DecouplingApproximationStrategy1 "DecouplingApproximationStrategy1::DecouplingApproximationStrategy1(SimulationOptions sim_params)
+";
+
+
+// File: classDecouplingApproximationStrategy2.xml
+%feature("docstring") DecouplingApproximationStrategy2 "
+
+Strategy class to compute the total polarized scattering from a decorated layer in decoupling approximation.
+
+C++ includes: DecouplingApproximationStrategy.h
+";
+
+%feature("docstring")  DecouplingApproximationStrategy2::DecouplingApproximationStrategy2 "DecouplingApproximationStrategy2::DecouplingApproximationStrategy2(SimulationOptions sim_params)
+";
+
+
+// File: classDetectionProperties.xml
+%feature("docstring") DetectionProperties "
+
+Detector properties (efficiency, transmission).
+
+C++ includes: DetectionProperties.h
+";
+
+%feature("docstring")  DetectionProperties::DetectionProperties "DetectionProperties::DetectionProperties()
+";
+
+%feature("docstring")  DetectionProperties::setAnalyzerProperties "void DetectionProperties::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)
+
+Sets the polarization analyzer characteristics of the detector. 
+";
+
+%feature("docstring")  DetectionProperties::analyzerOperator "Eigen::Matrix2cd DetectionProperties::analyzerOperator() const
+
+Gets the polarization density matrix (in spin basis along z-axis) 
+";
+
+
+// File: classDetectorMask.xml
+%feature("docstring") DetectorMask "
+
+Collection of detector masks.
+
+C++ includes: DetectorMask.h
+";
+
+%feature("docstring")  DetectorMask::DetectorMask "DetectorMask::DetectorMask()
+";
+
+%feature("docstring")  DetectorMask::DetectorMask "DetectorMask::DetectorMask(const DetectorMask &other)
+";
+
+%feature("docstring")  DetectorMask::addMask "void DetectorMask::addMask(const Geometry::IShape2D &shape, bool mask_value)
+
+Add mask to the stack of detector masks. The value \"true\" means that the area will be excluded from the analysis.
+
+Parameters:
+-----------
+
+shape: 
+The shape of mask.
+
+mask_value: 
+The value of mask 
+";
+
+%feature("docstring")  DetectorMask::initMaskData "void DetectorMask::initMaskData(const IDetector2D &detector)
+
+Init the map of masks for the given detector plane. 
+";
+
+%feature("docstring")  DetectorMask::initMaskData "void DetectorMask::initMaskData(const OutputData< double > &data)
+";
+
+%feature("docstring")  DetectorMask::isMasked "bool DetectorMask::isMasked(size_t index) const 
+";
+
+%feature("docstring")  DetectorMask::getMaskData "const OutputData<bool>* DetectorMask::getMaskData() const 
+";
+
+%feature("docstring")  DetectorMask::createHistogram "Histogram2D * DetectorMask::createHistogram() const 
+";
+
+%feature("docstring")  DetectorMask::removeMasks "void DetectorMask::removeMasks()
+
+remove all masks and return object to initial state 
+";
+
+%feature("docstring")  DetectorMask::hasMasks "bool DetectorMask::hasMasks() const
+
+returns true if has masks 
+";
+
+%feature("docstring")  DetectorMask::numberOfMaskedChannels "int DetectorMask::numberOfMaskedChannels() const 
+";
+
+%feature("docstring")  DetectorMask::numberOfMasks "size_t DetectorMask::numberOfMasks() const 
+";
+
+%feature("docstring")  DetectorMask::getMaskShape "const Geometry::IShape2D * DetectorMask::getMaskShape(size_t mask_index, bool &mask_value) const 
+";
+
+
+// File: classDistributionCosine.xml
+%feature("docstring") DistributionCosine "
+
+Cosine distribution.
+
+C++ includes: Distributions.h
+";
+
+%feature("docstring")  DistributionCosine::DistributionCosine "DistributionCosine::DistributionCosine()
+";
+
+%feature("docstring")  DistributionCosine::DistributionCosine "DistributionCosine::DistributionCosine(double mean, double sigma)
+";
+
+%feature("docstring")  DistributionCosine::~DistributionCosine "virtual DistributionCosine::~DistributionCosine()
+";
+
+%feature("docstring")  DistributionCosine::clone "virtual DistributionCosine* DistributionCosine::clone() const
+
+clone method 
+";
+
+%feature("docstring")  DistributionCosine::probabilityDensity "double DistributionCosine::probabilityDensity(double x) const
+
+get the probability density for value x 
+";
+
+%feature("docstring")  DistributionCosine::getMean "virtual double DistributionCosine::getMean() const
+
+Returns the mean of the distribution. 
+";
+
+%feature("docstring")  DistributionCosine::getSigma "double DistributionCosine::getSigma() const
+
+Returns the sigma parameter of the distribution. 
+";
+
+%feature("docstring")  DistributionCosine::generateValueList "std::vector< double > DistributionCosine::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+generate list of sample values 
+";
+
+%feature("docstring")  DistributionCosine::isDelta "bool DistributionCosine::isDelta() const
+
+signals that the distribution is in the limit case of a delta distribution 
+";
+
+
+// File: classDistributionGate.xml
+%feature("docstring") DistributionGate "
+
+Uniform distribution function with half width hwhm.
+
+C++ includes: Distributions.h
+";
+
+%feature("docstring")  DistributionGate::DistributionGate "DistributionGate::DistributionGate()
+";
+
+%feature("docstring")  DistributionGate::DistributionGate "DistributionGate::DistributionGate(double min, double max)
+";
+
+%feature("docstring")  DistributionGate::~DistributionGate "virtual DistributionGate::~DistributionGate()
+";
+
+%feature("docstring")  DistributionGate::clone "virtual DistributionGate* DistributionGate::clone() const
+
+clone method 
+";
+
+%feature("docstring")  DistributionGate::probabilityDensity "double DistributionGate::probabilityDensity(double x) const
+
+get the probability density for value x 
+";
+
+%feature("docstring")  DistributionGate::getMean "virtual double DistributionGate::getMean() const
+
+get the mean of the distribution 
+";
+
+%feature("docstring")  DistributionGate::getMin "double DistributionGate::getMin() const
+
+Returns the minimum value of the distribution. 
+";
+
+%feature("docstring")  DistributionGate::getMax "double DistributionGate::getMax() const
+
+Returns the maximum value of the distribution. 
+";
+
+%feature("docstring")  DistributionGate::generateValueList "std::vector< double > DistributionGate::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+Returns list of sample values. 
+";
+
+%feature("docstring")  DistributionGate::isDelta "bool DistributionGate::isDelta() const
+
+signals that the distribution is in the limit case of a delta distribution 
+";
+
+
+// File: classDistributionGaussian.xml
+%feature("docstring") DistributionGaussian "
+
+Gaussian distribution with standard deviation std_dev.
+
+C++ includes: Distributions.h
+";
+
+%feature("docstring")  DistributionGaussian::DistributionGaussian "DistributionGaussian::DistributionGaussian()
+";
+
+%feature("docstring")  DistributionGaussian::DistributionGaussian "DistributionGaussian::DistributionGaussian(double mean, double std_dev)
+";
+
+%feature("docstring")  DistributionGaussian::~DistributionGaussian "virtual DistributionGaussian::~DistributionGaussian()
+";
+
+%feature("docstring")  DistributionGaussian::clone "virtual DistributionGaussian* DistributionGaussian::clone() const
+
+clone method 
+";
+
+%feature("docstring")  DistributionGaussian::probabilityDensity "double DistributionGaussian::probabilityDensity(double x) const
+
+get the probability density for value x 
+";
+
+%feature("docstring")  DistributionGaussian::getMean "virtual double DistributionGaussian::getMean() const
+
+Returns the mean of the distribution. 
+";
+
+%feature("docstring")  DistributionGaussian::getStdDev "double DistributionGaussian::getStdDev() const
+
+Returns the standard deviation. 
+";
+
+%feature("docstring")  DistributionGaussian::generateValueList "std::vector< double > DistributionGaussian::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+generate list of sample values 
+";
+
+%feature("docstring")  DistributionGaussian::isDelta "bool DistributionGaussian::isDelta() const
+
+signals that the distribution is in the limit case of a delta distribution 
+";
+
+
+// File: classDistributionHandler.xml
+%feature("docstring") DistributionHandler "
+
+Provides the functionality to average over parameter distributions with weights.
+
+C++ includes: DistributionHandler.h
+";
+
+%feature("docstring")  DistributionHandler::DistributionHandler "DistributionHandler::DistributionHandler()
+";
+
+%feature("docstring")  DistributionHandler::~DistributionHandler "DistributionHandler::~DistributionHandler()
+";
+
+%feature("docstring")  DistributionHandler::addParameterDistribution "void DistributionHandler::addParameterDistribution(const std::string &param_name, const IDistribution1D &distribution, size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits())
+
+add a sampled parameter distribution 
+";
+
+%feature("docstring")  DistributionHandler::addParameterDistribution "void DistributionHandler::addParameterDistribution(const ParameterDistribution &par_distr)
+";
+
+%feature("docstring")  DistributionHandler::getTotalNumberOfSamples "size_t DistributionHandler::getTotalNumberOfSamples() const
+
+get the total number of parameter value combinations (product of the individual sizes of each parameter distribution 
+";
+
+%feature("docstring")  DistributionHandler::setParameterValues "double DistributionHandler::setParameterValues(ParameterPool *p_parameter_pool, size_t index)
+
+set the parameter values of the simulation object to a specific combination of values, determined by the index (which must be smaller than the total number of combinations) and returns the weight associated with this combination of parameter values 
+";
+
+%feature("docstring")  DistributionHandler::getDistributions "const DistributionHandler::Distributions_t & DistributionHandler::getDistributions() const 
+";
+
+
+// File: classDistributionLogNormal.xml
+%feature("docstring") DistributionLogNormal "
+
+Log-normal distribution.
+
+C++ includes: Distributions.h
+";
+
+%feature("docstring")  DistributionLogNormal::DistributionLogNormal "DistributionLogNormal::DistributionLogNormal(double scale_param)
+";
+
+%feature("docstring")  DistributionLogNormal::DistributionLogNormal "DistributionLogNormal::DistributionLogNormal(double median, double scale_param)
+";
+
+%feature("docstring")  DistributionLogNormal::~DistributionLogNormal "virtual DistributionLogNormal::~DistributionLogNormal()
+";
+
+%feature("docstring")  DistributionLogNormal::clone "virtual DistributionLogNormal* DistributionLogNormal::clone() const
+
+clone method 
+";
+
+%feature("docstring")  DistributionLogNormal::probabilityDensity "double DistributionLogNormal::probabilityDensity(double x) const
+
+get the probability density for value x 
+";
+
+%feature("docstring")  DistributionLogNormal::getMean "double DistributionLogNormal::getMean() const
+
+get the mean of the distribution 
+";
+
+%feature("docstring")  DistributionLogNormal::getMedian "double DistributionLogNormal::getMedian() const
+
+Returns the median of the distribution. 
+";
+
+%feature("docstring")  DistributionLogNormal::getScalePar "double DistributionLogNormal::getScalePar() const
+
+Returns the scale parameter of the distribution. 
+";
+
+%feature("docstring")  DistributionLogNormal::generateValueList "std::vector< double > DistributionLogNormal::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+generate list of sample values 
+";
+
+%feature("docstring")  DistributionLogNormal::isDelta "bool DistributionLogNormal::isDelta() const
+
+signals that the distribution is in the limit case of a delta distribution 
+";
+
+
+// File: classDistributionLorentz.xml
+%feature("docstring") DistributionLorentz "
+
+Lorentz distribution with half width hwhm.
+
+C++ includes: Distributions.h
+";
+
+%feature("docstring")  DistributionLorentz::DistributionLorentz "DistributionLorentz::DistributionLorentz()
+";
+
+%feature("docstring")  DistributionLorentz::DistributionLorentz "DistributionLorentz::DistributionLorentz(double mean, double hwhm)
+";
+
+%feature("docstring")  DistributionLorentz::~DistributionLorentz "virtual DistributionLorentz::~DistributionLorentz()
+";
+
+%feature("docstring")  DistributionLorentz::clone "virtual DistributionLorentz* DistributionLorentz::clone() const 
+";
+
+%feature("docstring")  DistributionLorentz::probabilityDensity "double DistributionLorentz::probabilityDensity(double x) const
+
+get the probability density for value x 
+";
+
+%feature("docstring")  DistributionLorentz::getMean "virtual double DistributionLorentz::getMean() const
+
+Returns the mean of the distribution. 
+";
+
+%feature("docstring")  DistributionLorentz::getHWHM "double DistributionLorentz::getHWHM() const
+
+Returns the half width at half maximum. 
+";
+
+%feature("docstring")  DistributionLorentz::generateValueList "std::vector< double > DistributionLorentz::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+generate list of sample values 
+";
+
+%feature("docstring")  DistributionLorentz::isDelta "bool DistributionLorentz::isDelta() const
+
+signals that the distribution is in the limit case of a delta distribution 
+";
+
+
+// File: classExceptions_1_1DivisionByZeroException.xml
+%feature("docstring") Exceptions::DivisionByZeroException "";
+
+%feature("docstring")  Exceptions::DivisionByZeroException::DivisionByZeroException "Exceptions::DivisionByZeroException::DivisionByZeroException(const std::string &message)
+";
+
+
+// File: classExceptions_1_1DomainErrorException.xml
+%feature("docstring") Exceptions::DomainErrorException "";
+
+%feature("docstring")  Exceptions::DomainErrorException::DomainErrorException "Exceptions::DomainErrorException::DomainErrorException(const std::string &message)
+";
+
+
+// File: classDWBADiffuseReflection.xml
+%feature("docstring") DWBADiffuseReflection "
+
+Calculation of diffuse (aka off-specular) reflection from multilayers.
+
+C++ includes: DWBADiffuseReflection.h
+";
+
+%feature("docstring")  DWBADiffuseReflection::DWBADiffuseReflection "DWBADiffuseReflection::DWBADiffuseReflection()
+";
+
+%feature("docstring")  DWBADiffuseReflection::execute "void DWBADiffuseReflection::execute(const MultiLayer &sample, const kvector_t ki, const kvector_t kf)
+";
+
+%feature("docstring")  DWBADiffuseReflection::setSample "void DWBADiffuseReflection::setSample(const MultiLayer &sample)
+";
+
+%feature("docstring")  DWBADiffuseReflection::getDiffuseAutocorr "double DWBADiffuseReflection::getDiffuseAutocorr() const 
+";
+
+%feature("docstring")  DWBADiffuseReflection::getDiffuseCrosscorr "double DWBADiffuseReflection::getDiffuseCrosscorr() const 
+";
+
+%feature("docstring")  DWBADiffuseReflection::setKvectors "void DWBADiffuseReflection::setKvectors(const kvector_t ki, const kvector_t kf)
+";
+
+
+// File: classGeometry_1_1Ellipse.xml
+%feature("docstring") Geometry::Ellipse "
+
+Ellipse shape.
+
+C++ includes: Ellipse.h
+";
+
+%feature("docstring")  Geometry::Ellipse::Ellipse "Geometry::Ellipse::Ellipse(double xcenter, double ycenter, double xradius, double yradius, double theta=0.0)
+
+Parameters:
+-----------
+
+xcenter: 
+x-coordinate of  Ellipse's center
+
+ycenter: 
+y-coordinate of  Ellipse's center
+
+xradius: 
+Radius along x-axis
+
+yradius: 
+Radius along y-axis
+
+theta: 
+Angle of  Ellipse rotation in radians 
+";
+
+%feature("docstring")  Geometry::Ellipse::clone "Ellipse* Geometry::Ellipse::clone() const 
+";
+
+%feature("docstring")  Geometry::Ellipse::contains "bool Geometry::Ellipse::contains(double x, double y) const
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::Ellipse::contains "bool Geometry::Ellipse::contains(const Bin1D &binx, const Bin1D &biny) const
+
+Returns true if area defined by two bins is inside or on border of ellipse; more precisely, if mid point of two bins satisfy this condition. 
+";
+
+%feature("docstring")  Geometry::Ellipse::getCenterX "double Geometry::Ellipse::getCenterX() const 
+";
+
+%feature("docstring")  Geometry::Ellipse::getCenterY "double Geometry::Ellipse::getCenterY() const 
+";
+
+%feature("docstring")  Geometry::Ellipse::getRadiusX "double Geometry::Ellipse::getRadiusX() const 
+";
+
+%feature("docstring")  Geometry::Ellipse::getRadiusY "double Geometry::Ellipse::getRadiusY() const 
+";
+
+%feature("docstring")  Geometry::Ellipse::getTheta "double Geometry::Ellipse::getTheta() const 
+";
+
+
+// File: classExceptions_1_1ExistingClassRegistrationException.xml
+%feature("docstring") Exceptions::ExistingClassRegistrationException "";
+
+%feature("docstring")  Exceptions::ExistingClassRegistrationException::ExistingClassRegistrationException "Exceptions::ExistingClassRegistrationException::ExistingClassRegistrationException(const std::string &message)
+";
+
+
+// File: classExportToPython.xml
+%feature("docstring") ExportToPython "
+
+Write a Python script that allows to run the current simulation.
+
+C++ includes: ExportToPython.h
+";
+
+%feature("docstring")  ExportToPython::ExportToPython "ExportToPython::ExportToPython(const MultiLayer &multilayer)
+";
+
+%feature("docstring")  ExportToPython::~ExportToPython "ExportToPython::~ExportToPython()
+";
+
+%feature("docstring")  ExportToPython::simulationToPythonLowlevel "std::string ExportToPython::simulationToPythonLowlevel(const GISASSimulation *simulation)
+
+Returns a Python script that sets up a simulation and runs it if invoked as main program. 
+";
+
+%feature("docstring")  ExportToPython::defineGetSample "std::string ExportToPython::defineGetSample() const 
+";
+
+
+// File: classExceptions_1_1FileIsBadException.xml
+%feature("docstring") Exceptions::FileIsBadException "";
+
+%feature("docstring")  Exceptions::FileIsBadException::FileIsBadException "Exceptions::FileIsBadException::FileIsBadException(const std::string &message)
+";
+
+
+// File: classExceptions_1_1FileNotIsOpenException.xml
+%feature("docstring") Exceptions::FileNotIsOpenException "";
+
+%feature("docstring")  Exceptions::FileNotIsOpenException::FileNotIsOpenException "Exceptions::FileNotIsOpenException::FileNotIsOpenException(const std::string &message)
+";
+
+
+// File: classFitElement.xml
+%feature("docstring") FitElement "
+
+Measured (\"real\") and simulated scattering intensity value for one detector cell. Used for chi2/residual calculations.
+
+C++ includes: FitElement.h
+";
+
+%feature("docstring")  FitElement::FitElement "FitElement::FitElement()
+";
+
+%feature("docstring")  FitElement::FitElement "FitElement::FitElement(size_t index, double simul_value, double real_value, double weight=1.0)
+";
+
+%feature("docstring")  FitElement::FitElement "FitElement::FitElement(const FitElement &other)
+";
+
+%feature("docstring")  FitElement::getIndex "size_t FitElement::getIndex() const 
+";
+
+%feature("docstring")  FitElement::getSimulValue "double FitElement::getSimulValue() const 
+";
+
+%feature("docstring")  FitElement::getRealValue "double FitElement::getRealValue() const 
+";
+
+%feature("docstring")  FitElement::getWeight "double FitElement::getWeight() const 
+";
+
+%feature("docstring")  FitElement::getSquaredDifference "double FitElement::getSquaredDifference() const 
+";
+
+%feature("docstring")  FitElement::setSquaredDifference "void FitElement::setSquaredDifference(double value)
+";
+
+%feature("docstring")  FitElement::getResidual "double FitElement::getResidual() const 
+";
+
+%feature("docstring")  FitElement::setResidual "void FitElement::setResidual(double value)
+";
+
+
+// File: classFitObject.xml
+%feature("docstring") FitObject "
+
+Holds simulation description and real data to run the fit.
+
+C++ includes: FitObject.h
+";
+
+%feature("docstring")  FitObject::FitObject "FitObject::FitObject(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight=1)
+
+FitObject constructor
+
+Parameters:
+-----------
+
+simulation: 
+The simulation to run
+
+real_data: 
+The real data
+
+weight: 
+Weight of dataset in chi2 calculations
+
+adjust_detector_to_data: 
+Detector axes will be adjusted to real data axes, if true 
+";
+
+%feature("docstring")  FitObject::~FitObject "FitObject::~FitObject()
+";
+
+%feature("docstring")  FitObject::realData "const OutputData< double > & FitObject::realData() const
+
+Returns real (experimental) data. 
+";
+
+%feature("docstring")  FitObject::simulationData "const OutputData< double > & FitObject::simulationData() const
+
+Returns simulated data. 
+";
+
+%feature("docstring")  FitObject::chiSquaredMap "const OutputData< double > & FitObject::chiSquaredMap() const
+
+Returns chi2 map. 
+";
+
+%feature("docstring")  FitObject::simulation "const GISASSimulation & FitObject::simulation() const
+
+Returns simulation. 
+";
+
+%feature("docstring")  FitObject::weight "double FitObject::weight() const
+
+Returns weight of data set in chi2 calculations. 
+";
+
+%feature("docstring")  FitObject::numberOfFitElements "size_t FitObject::numberOfFitElements() const
+
+Returns the size of the data. It is equal to the number of non-masked detector channels which will participate in chi2 calculations. 
+";
+
+%feature("docstring")  FitObject::prepareFitElements "void FitObject::prepareFitElements(std::vector< FitElement > &fit_elements, double weight, IIntensityNormalizer *normalizer=0)
+
+Runs simulation and put results (the real and simulated intensities) into external vector. Masked channels will be excluded from the vector. 
+";
+
+%feature("docstring")  FitObject::transferToChi2Map "void FitObject::transferToChi2Map(std::vector< FitElement >::const_iterator first, std::vector< FitElement >::const_iterator last) const
+
+Updates ChiSquared map from external vector and returns const reference to it. Used from Python in FitSuiteDrawObserver. 
+";
+
+%feature("docstring")  FitObject::addParametersToExternalPool "std::string FitObject::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const
+
+Adds parameters from local pool to external pool and recursively calls its direct children.
+
+Adds parameters from local pool to external pool. 
+";
+
+
+// File: classFitParameterLinked.xml
+%feature("docstring") FitParameterLinked "
+
+Fittable parameter, linked to other parameters from pools.
+
+C++ includes: FitParameterLinked.h
+";
+
+%feature("docstring")  FitParameterLinked::FitParameterLinked "FitParameterLinked::FitParameterLinked()
+";
+
+%feature("docstring")  FitParameterLinked::FitParameterLinked "FitParameterLinked::FitParameterLinked(const std::string &name, double value, const AttLimits &lim=AttLimits::limitless(), double step=0.0)
+";
+
+%feature("docstring")  FitParameterLinked::~FitParameterLinked "FitParameterLinked::~FitParameterLinked() final
+";
+
+%feature("docstring")  FitParameterLinked::clone "FitParameterLinked * FitParameterLinked::clone() const 
+";
+
+%feature("docstring")  FitParameterLinked::setValue "void FitParameterLinked::setValue(double value) final
+
+Sets given value for all bound parameters. 
+";
+
+%feature("docstring")  FitParameterLinked::addParameter "void FitParameterLinked::addParameter(RealParameter *par)
+
+Adds real parameter to the collection. 
+";
+
+%feature("docstring")  FitParameterLinked::addMatchedParametersFromPool "void FitParameterLinked::addMatchedParametersFromPool(const ParameterPool *pool, const std::string &wildcard=std::string())
+
+Adds parameters from pool which match given wildcard. 
+";
+
+
+// File: classFitStrategyAdjustParameters.xml
+%feature("docstring") FitStrategyAdjustParameters "
+
+Strategy which fixes/releases fit parameters and call minimizer.
+
+C++ includes: FitStrategyAdjustParameters.h
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::FitStrategyAdjustParameters "FitStrategyAdjustParameters::FitStrategyAdjustParameters(const std::string &name)
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::FitStrategyAdjustParameters "FitStrategyAdjustParameters::FitStrategyAdjustParameters()
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::~FitStrategyAdjustParameters "virtual FitStrategyAdjustParameters::~FitStrategyAdjustParameters()
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::clone "virtual FitStrategyAdjustParameters* FitStrategyAdjustParameters::clone() const 
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::execute "void FitStrategyAdjustParameters::execute()
+
+strategy which fixes/releases fit parameters and then call minimizer 
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::fix_all "virtual FitStrategyAdjustParameters& FitStrategyAdjustParameters::fix_all()
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::release_all "virtual FitStrategyAdjustParameters& FitStrategyAdjustParameters::release_all()
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::fix "virtual FitStrategyAdjustParameters& FitStrategyAdjustParameters::fix(std::string parname)
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::release "virtual FitStrategyAdjustParameters& FitStrategyAdjustParameters::release(std::string parname)
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::setPreserveOriginalValues "virtual void FitStrategyAdjustParameters::setPreserveOriginalValues(bool preserve_values)
+";
+
+%feature("docstring")  FitStrategyAdjustParameters::clear "virtual void FitStrategyAdjustParameters::clear()
+";
+
+
+// File: classFitStrategyDefault.xml
+%feature("docstring") FitStrategyDefault "
+
+Default fit strategy just let  FitSuite to run it's minimization round.
+
+C++ includes: IFitStrategy.h
+";
+
+%feature("docstring")  FitStrategyDefault::FitStrategyDefault "FitStrategyDefault::FitStrategyDefault()
+";
+
+%feature("docstring")  FitStrategyDefault::clone "FitStrategyDefault * FitStrategyDefault::clone() const 
+";
+
+%feature("docstring")  FitStrategyDefault::execute "void FitStrategyDefault::execute()
+";
+
+
+// File: classFitStrategyFixParameters.xml
+%feature("docstring") FitStrategyFixParameters "
+
+Strategy which fixes certain fit parameters leaving other released.
+
+C++ includes: FitStrategyAdjustParameters.h
+";
+
+%feature("docstring")  FitStrategyFixParameters::FitStrategyFixParameters "FitStrategyFixParameters::FitStrategyFixParameters()
+";
+
+%feature("docstring")  FitStrategyFixParameters::FitStrategyFixParameters "FitStrategyFixParameters::FitStrategyFixParameters(const std::vector< std::string > &pars)
+";
+
+%feature("docstring")  FitStrategyFixParameters::~FitStrategyFixParameters "virtual FitStrategyFixParameters::~FitStrategyFixParameters()
+";
+
+%feature("docstring")  FitStrategyFixParameters::clone "virtual FitStrategyFixParameters* FitStrategyFixParameters::clone() const 
+";
+
+%feature("docstring")  FitStrategyFixParameters::clear "virtual void FitStrategyFixParameters::clear()
+";
+
+%feature("docstring")  FitStrategyFixParameters::setFixed "virtual void FitStrategyFixParameters::setFixed(const std::vector< std::string > &pars)
+";
+
+
+// File: classFitStrategyReleaseParameters.xml
+%feature("docstring") FitStrategyReleaseParameters "
+
+Strategy which releases certain fit parameters leaving other fixed.
+
+C++ includes: FitStrategyAdjustParameters.h
+";
+
+%feature("docstring")  FitStrategyReleaseParameters::FitStrategyReleaseParameters "FitStrategyReleaseParameters::FitStrategyReleaseParameters()
+";
+
+%feature("docstring")  FitStrategyReleaseParameters::FitStrategyReleaseParameters "FitStrategyReleaseParameters::FitStrategyReleaseParameters(const std::vector< std::string > &pars)
+";
+
+%feature("docstring")  FitStrategyReleaseParameters::~FitStrategyReleaseParameters "virtual FitStrategyReleaseParameters::~FitStrategyReleaseParameters()
+";
+
+%feature("docstring")  FitStrategyReleaseParameters::clone "virtual FitStrategyReleaseParameters* FitStrategyReleaseParameters::clone() const 
+";
+
+%feature("docstring")  FitStrategyReleaseParameters::clear "virtual void FitStrategyReleaseParameters::clear()
+";
+
+%feature("docstring")  FitStrategyReleaseParameters::setReleased "virtual void FitStrategyReleaseParameters::setReleased(const std::vector< std::string > &pars)
+";
+
+
+// File: classFitSuite.xml
+%feature("docstring") FitSuite "
+
+User interface class that wraps all fit methods.
+
+C++ includes: FitSuite.h
+";
+
+%feature("docstring")  FitSuite::FitSuite "FitSuite::FitSuite()
+";
+
+%feature("docstring")  FitSuite::FitSuite "FitSuite::FitSuite(const FitSuite &)=delete
+";
+
+%feature("docstring")  FitSuite::~FitSuite "FitSuite::~FitSuite()
+";
+
+%feature("docstring")  FitSuite::addSimulationAndRealData "void FitSuite::addSimulationAndRealData(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight=1)
+
+Assigns pair of (simulation, real data) for fitting. More than one pair can be added. 
+";
+
+%feature("docstring")  FitSuite::addSimulationAndRealData "void FitSuite::addSimulationAndRealData(const GISASSimulation &simulation, const IHistogram &real_data, double weight=1)
+
+Assigns pair of (simulation, real data) for fitting. More than one pair can be added. 
+";
+
+%feature("docstring")  FitSuite::addFitParameter "FitParameterLinked * FitSuite::addFitParameter(const std::string &name, double value, const AttLimits &limits=AttLimits::limitless(), double step=0.0)
+
+Adds fit parameter
+
+Parameters:
+-----------
+
+name: 
+The name of fit parameter
+
+value: 
+Parameter's starting value
+
+limits: 
+Limits attribute
+
+step: 
+Initial parameter's step (some minimizers don't use it) 
+";
+
+%feature("docstring")  FitSuite::setMinimizer "void FitSuite::setMinimizer(const std::string &minimizer_name, const std::string &algorithm_name=std::string(), const std::string &minimizer_options=std::string())
+
+Sets minimizer with given name and algorithm type
+
+Parameters:
+-----------
+
+minimizer_name: 
+The name of the minimizer
+
+algorithm_name: 
+Optional name of the minimizer's algorithm
+
+minimizer_options: 
+Optional string with additional minimizer settings 
+";
+
+%feature("docstring")  FitSuite::setChiSquaredModule "void FitSuite::setChiSquaredModule(const IChiSquaredModule &chi2_module)
+
+Replaces default  ChiSquaredModule with new one. 
+";
+
+%feature("docstring")  FitSuite::addFitStrategy "void FitSuite::addFitStrategy(const IFitStrategy &strategy)
+
+Adds fit strategy. 
+";
+
+%feature("docstring")  FitSuite::setMinimizer "void FitSuite::setMinimizer(IMinimizer *minimizer)
+
+Sets minimizer. 
+";
+
+%feature("docstring")  FitSuite::minimizer "const IMinimizer * FitSuite::minimizer() const
+
+Returns minimizer. 
+";
+
+%feature("docstring")  FitSuite::initPrint "void FitSuite::initPrint(int print_every_nth)
+
+Initializes printing to standard output during the fitting. Prints also the summary when completed.
+
+Parameters:
+-----------
+
+print_every_nth: 
+Print every n'th iteration 
+";
+
+%feature("docstring")  FitSuite::runFit "void FitSuite::runFit()
+
+main method to run the fitting 
+";
+
+%feature("docstring")  FitSuite::numberOfFitObjects "int FitSuite::numberOfFitObjects() const
+
+Returns number of fit objects, where fit object stands for (real, simulated) pair. 
+";
+
+%feature("docstring")  FitSuite::getRealData "IHistogram * FitSuite::getRealData(size_t i_item=0) const
+
+returns real data histogram
+
+Parameters:
+-----------
+
+i_item: 
+The index of fit object 
+";
+
+%feature("docstring")  FitSuite::getSimulationData "IHistogram * FitSuite::getSimulationData(size_t i_item=0) const
+
+returns simulated data histogram
+
+Parameters:
+-----------
+
+i_item: 
+The index of fit object 
+";
+
+%feature("docstring")  FitSuite::getChiSquaredMap "IHistogram * FitSuite::getChiSquaredMap(size_t i_item=0) const
+
+returns chi2 histogram calculated for (real, simulated) data pair
+
+Parameters:
+-----------
+
+i_item: 
+The index of fit object 
+";
+
+%feature("docstring")  FitSuite::fitObjects "FitSuiteObjects * FitSuite::fitObjects()
+
+returns  FitObject (pair of simulation/real data) 
+";
+
+%feature("docstring")  FitSuite::fitParameters "FitParameterSet * FitSuite::fitParameters()
+
+Returns reference to fit parameters. 
+";
+
+%feature("docstring")  FitSuite::fitStrategies "FitSuiteStrategies * FitSuite::fitStrategies()
+
+Returns reference to fit parameters. 
+";
+
+%feature("docstring")  FitSuite::isLastIteration "bool FitSuite::isLastIteration() const
+
+if the last iteration is done (used by observers to print summary) 
+";
+
+%feature("docstring")  FitSuite::numberOfIterations "size_t FitSuite::numberOfIterations() const
+
+Returns current number of minimization function calls. 
+";
+
+%feature("docstring")  FitSuite::currentStrategyIndex "size_t FitSuite::currentStrategyIndex() const
+
+Returns the number of current strategy. 
+";
+
+%feature("docstring")  FitSuite::printResults "void FitSuite::printResults() const
+
+Prints results of the minimization to the standard output. 
+";
+
+%feature("docstring")  FitSuite::reportResults "std::string FitSuite::reportResults() const
+
+Reports results of minimization in the form of multi-line string. 
+";
+
+%feature("docstring")  FitSuite::getChi2 "double FitSuite::getChi2() const
+
+Returns minimum chi squared value found. 
+";
+
+%feature("docstring")  FitSuite::interruptFitting "void FitSuite::interruptFitting()
+";
+
+%feature("docstring")  FitSuite::resetInterrupt "void FitSuite::resetInterrupt()
+";
+
+%feature("docstring")  FitSuite::isInterrupted "bool FitSuite::isInterrupted()
+";
+
+%feature("docstring")  FitSuite::getRealOutputData "const OutputData< double > * FitSuite::getRealOutputData(size_t i_item=0) const 
+";
+
+%feature("docstring")  FitSuite::getSimulationOutputData "const OutputData< double > * FitSuite::getSimulationOutputData(size_t i_item=0) const 
+";
+
+%feature("docstring")  FitSuite::getChiSquaredOutputData "const OutputData< double > * FitSuite::getChiSquaredOutputData(size_t i_item=0) const 
+";
+
+
+// File: classFitSuiteChiSquaredFunction.xml
+%feature("docstring") FitSuiteChiSquaredFunction "
+
+Chi squared fitting function for minimizer.
+
+C++ includes: FitSuiteFunctions.h
+";
+
+%feature("docstring")  FitSuiteChiSquaredFunction::FitSuiteChiSquaredFunction "FitSuiteChiSquaredFunction::FitSuiteChiSquaredFunction()
+";
+
+%feature("docstring")  FitSuiteChiSquaredFunction::~FitSuiteChiSquaredFunction "virtual FitSuiteChiSquaredFunction::~FitSuiteChiSquaredFunction()
+";
+
+%feature("docstring")  FitSuiteChiSquaredFunction::evaluate "double FitSuiteChiSquaredFunction::evaluate(const std::vector< double > &pars)
+
+evaluate method for chi2 value called directly from the minimizer
+
+evaluate chi squared value 
+";
+
+
+// File: classFitSuiteGradientFunction.xml
+%feature("docstring") FitSuiteGradientFunction "
+
+Gradient fitting function for minimizer.
+
+C++ includes: FitSuiteFunctions.h
+";
+
+%feature("docstring")  FitSuiteGradientFunction::FitSuiteGradientFunction "FitSuiteGradientFunction::FitSuiteGradientFunction()
+";
+
+%feature("docstring")  FitSuiteGradientFunction::~FitSuiteGradientFunction "virtual FitSuiteGradientFunction::~FitSuiteGradientFunction()
+";
+
+%feature("docstring")  FitSuiteGradientFunction::evaluate "double FitSuiteGradientFunction::evaluate(const std::vector< double > &pars, unsigned int index, std::vector< double > &gradients)
+
+evaluate method for gradients and residuals called directly from the minimizer
+
+evaluate residual and derivative for given data element 
+";
+
+%feature("docstring")  FitSuiteGradientFunction::getNCallsTotal "virtual size_t FitSuiteGradientFunction::getNCallsTotal() const 
+";
+
+%feature("docstring")  FitSuiteGradientFunction::getNCallsGradient "virtual size_t FitSuiteGradientFunction::getNCallsGradient() const 
+";
+
+
+// File: classFitSuiteImpl.xml
+%feature("docstring") FitSuiteImpl "
+
+Fitting kernel for  FitSuite.
+
+C++ includes: FitSuiteImpl.h
+";
+
+%feature("docstring")  FitSuiteImpl::FitSuiteImpl "FitSuiteImpl::FitSuiteImpl(const std::function< void()> &notifyObservers)
+";
+
+%feature("docstring")  FitSuiteImpl::FitSuiteImpl "FitSuiteImpl::FitSuiteImpl(const FitSuiteImpl &)=delete
+";
+
+%feature("docstring")  FitSuiteImpl::~FitSuiteImpl "FitSuiteImpl::~FitSuiteImpl()
+";
+
+%feature("docstring")  FitSuiteImpl::clear "void FitSuiteImpl::clear()
+
+Resets most state variables, to get prepared for the next fit.
+
+Clears all data. 
+";
+
+%feature("docstring")  FitSuiteImpl::addSimulationAndRealData "void FitSuiteImpl::addSimulationAndRealData(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight)
+
+Adds pair of (simulation, real data) for consecutive simulation. 
+";
+
+%feature("docstring")  FitSuiteImpl::addFitParameter "FitParameterLinked * FitSuiteImpl::addFitParameter(const std::string &name, double value, const AttLimits &limits, double step=0.0)
+
+Adds fit parameter.
+
+Adds fit parameter, step is calculated from initial parameter value. 
+";
+
+%feature("docstring")  FitSuiteImpl::addFitStrategy "void FitSuiteImpl::addFitStrategy(const IFitStrategy &strategy)
+
+Adds fit strategy. 
+";
+
+%feature("docstring")  FitSuiteImpl::setMinimizer "void FitSuiteImpl::setMinimizer(IMinimizer *minimizer)
+
+Sets minimizer. 
+";
+
+%feature("docstring")  FitSuiteImpl::runFit "void FitSuiteImpl::runFit()
+
+Runs a fit, which may consist of several minimization rounds. 
+";
+
+%feature("docstring")  FitSuiteImpl::minimize "void FitSuiteImpl::minimize()
+
+Runs a single minimization round (called by FitSuiteStrategy) 
+";
+
+%feature("docstring")  FitSuiteImpl::fitObjects "FitSuiteObjects* FitSuiteImpl::fitObjects()
+
+Returns reference to the kit with data. 
+";
+
+%feature("docstring")  FitSuiteImpl::fitObjects "const FitSuiteObjects* FitSuiteImpl::fitObjects() const 
+";
+
+%feature("docstring")  FitSuiteImpl::fitParameters "FitParameterSet * FitSuiteImpl::fitParameters()
+
+Returns reference to fit parameters. 
+";
+
+%feature("docstring")  FitSuiteImpl::fitStrategies "FitSuiteStrategies* FitSuiteImpl::fitStrategies()
+
+Returns reference to fit parameters. 
+";
+
+%feature("docstring")  FitSuiteImpl::isLastIteration "bool FitSuiteImpl::isLastIteration() const
+
+Returns true if the last iteration is done (used by observers to print summary) 
+";
+
+%feature("docstring")  FitSuiteImpl::numberOfIterations "size_t FitSuiteImpl::numberOfIterations() const
+
+Returns current number of minimization function calls. 
+";
+
+%feature("docstring")  FitSuiteImpl::currentStrategyIndex "size_t FitSuiteImpl::currentStrategyIndex() const
+
+Returns the number of current strategy. 
+";
+
+%feature("docstring")  FitSuiteImpl::reportResults "std::string FitSuiteImpl::reportResults() const
+
+Reports results of minimization in the form of multi-line string. 
+";
+
+%feature("docstring")  FitSuiteImpl::getOptions "FitOptions& FitSuiteImpl::getOptions()
+
+Returns current fit options. 
+";
+
+%feature("docstring")  FitSuiteImpl::setOptions "void FitSuiteImpl::setOptions(const FitOptions &fit_options)
+
+Sets fit options. 
+";
+
+%feature("docstring")  FitSuiteImpl::notifyObservers "void FitSuiteImpl::notifyObservers()
+";
+
+%feature("docstring")  FitSuiteImpl::interruptFitting "void FitSuiteImpl::interruptFitting()
+";
+
+%feature("docstring")  FitSuiteImpl::resetInterrupt "void FitSuiteImpl::resetInterrupt()
+";
+
+%feature("docstring")  FitSuiteImpl::isInterrupted "bool FitSuiteImpl::isInterrupted() const 
+";
+
+%feature("docstring")  FitSuiteImpl::kernel "const FitKernel * FitSuiteImpl::kernel() const 
+";
+
+
+// File: classFitSuiteObjects.xml
+%feature("docstring") FitSuiteObjects "
+
+Holds vector of  FitObject's (simulation and real data) to fit
+
+C++ includes: FitSuiteObjects.h
+";
+
+%feature("docstring")  FitSuiteObjects::FitSuiteObjects "FitSuiteObjects::FitSuiteObjects()
+";
+
+%feature("docstring")  FitSuiteObjects::~FitSuiteObjects "FitSuiteObjects::~FitSuiteObjects()
+";
+
+%feature("docstring")  FitSuiteObjects::add "void FitSuiteObjects::add(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight=1.0)
+
+Adds to kit pair of (simulation, real data) for consecutive simulation. 
+";
+
+%feature("docstring")  FitSuiteObjects::getNumberOfFitObjects "size_t FitSuiteObjects::getNumberOfFitObjects() const
+
+Returns number of fit objects (simulation/real data pairs) 
+";
+
+%feature("docstring")  FitSuiteObjects::getSizeOfDataSet "size_t FitSuiteObjects::getSizeOfDataSet() const
+
+Returns total number of data points (number of all non-masked channels in all fit objects)
+
+Returns total number of data points. 
+";
+
+%feature("docstring")  FitSuiteObjects::setChiSquaredModule "void FitSuiteObjects::setChiSquaredModule(const IChiSquaredModule &chi2_module)
+
+Replaces default  ChiSquaredModule with new one. 
+";
+
+%feature("docstring")  FitSuiteObjects::getRealData "const OutputData< double > & FitSuiteObjects::getRealData(size_t i_item=0) const
+
+Returns real data from corresponding  FitObject
+
+Parameters:
+-----------
+
+i_item: 
+Index of  FitObject
+";
+
+%feature("docstring")  FitSuiteObjects::getSimulationData "const OutputData< double > & FitSuiteObjects::getSimulationData(size_t i_item=0) const
+
+Returns simulated data from corresponding  FitObject
+
+Parameters:
+-----------
+
+i_item: 
+Index of  FitObject
+";
+
+%feature("docstring")  FitSuiteObjects::getChiSquaredMap "const OutputData< double > & FitSuiteObjects::getChiSquaredMap(size_t i_item=0) const
+
+Returns new chi-squared map from corresponding  FitObject
+
+Parameters:
+-----------
+
+i_item: 
+Index of  FitObject
+";
+
+%feature("docstring")  FitSuiteObjects::runSimulations "void FitSuiteObjects::runSimulations()
+
+run all simulation defined in fit pairs
+
+loop through all defined simulations and run them 
+";
+
+%feature("docstring")  FitSuiteObjects::getChiSquaredValue "double FitSuiteObjects::getChiSquaredValue() const
+
+Returns chi2 calculated over whole dataset. 
+";
+
+%feature("docstring")  FitSuiteObjects::getResidualValue "double FitSuiteObjects::getResidualValue(size_t global_index)
+
+Returns residuals for single data element
+
+Parameters:
+-----------
+
+global_index: 
+index accross all element in  FitElement vector 
+";
+
+%feature("docstring")  FitSuiteObjects::addParametersToExternalPool "std::string FitSuiteObjects::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const
+
+Adds parameters from local pool to external pool and call recursion over direct children.
+
+Adds parameters from local pool to external pool. 
+";
+
+%feature("docstring")  FitSuiteObjects::setNfreeParameters "void FitSuiteObjects::setNfreeParameters(int nfree_parameters)
+";
+
+%feature("docstring")  FitSuiteObjects::clear "void FitSuiteObjects::clear()
+
+clear all data 
+";
+
+
+// File: classFitSuitePrintObserver.xml
+%feature("docstring") FitSuitePrintObserver "
+
+Prints fit progress at the end of each  FitSuite's iteration.
+
+C++ includes: FitSuitePrintObserver.h
+";
+
+%feature("docstring")  FitSuitePrintObserver::FitSuitePrintObserver "FitSuitePrintObserver::FitSuitePrintObserver(int print_every_nth=1)
+";
+
+%feature("docstring")  FitSuitePrintObserver::~FitSuitePrintObserver "virtual FitSuitePrintObserver::~FitSuitePrintObserver()
+";
+
+%feature("docstring")  FitSuitePrintObserver::update "void FitSuitePrintObserver::update(FitSuite *fit_suite)
+
+Here Onserver will do actuall job when he thinks that it is a right moment. 
+";
+
+
+// File: classFitSuiteStrategies.xml
+%feature("docstring") FitSuiteStrategies "
+
+Collection of strategies to fit.
+
+C++ includes: FitSuiteStrategies.h
+";
+
+%feature("docstring")  FitSuiteStrategies::FitSuiteStrategies "FitSuiteStrategies::FitSuiteStrategies()
+";
+
+%feature("docstring")  FitSuiteStrategies::~FitSuiteStrategies "FitSuiteStrategies::~FitSuiteStrategies()
+";
+
+%feature("docstring")  FitSuiteStrategies::FitSuiteStrategies "FitSuiteStrategies::FitSuiteStrategies(const FitSuiteStrategies &other)=delete
+";
+
+%feature("docstring")  FitSuiteStrategies::init "void FitSuiteStrategies::init(FitSuiteImpl *fit_suite)
+";
+
+%feature("docstring")  FitSuiteStrategies::addStrategy "void FitSuiteStrategies::addStrategy(const IFitStrategy &strategy)
+";
+
+%feature("docstring")  FitSuiteStrategies::minimize "void FitSuiteStrategies::minimize()
+";
+
+%feature("docstring")  FitSuiteStrategies::currentStrategyIndex "size_t FitSuiteStrategies::currentStrategyIndex() const 
+";
+
+%feature("docstring")  FitSuiteStrategies::size "size_t FitSuiteStrategies::size() const 
+";
+
+%feature("docstring")  FitSuiteStrategies::clear "void FitSuiteStrategies::clear()
+";
+
+%feature("docstring")  FitSuiteStrategies::currentStrategy "IFitStrategy * FitSuiteStrategies::currentStrategy()
+";
+
+
+// File: classFixedBinAxis.xml
+%feature("docstring") FixedBinAxis "
+
+Axis with fixed bin size.
+
+C++ includes: FixedBinAxis.h
+";
+
+%feature("docstring")  FixedBinAxis::FixedBinAxis "FixedBinAxis::FixedBinAxis(const std::string &name, size_t nbins, double start, double end)
+
+FixedBinAxis constructor.
+
+Parameters:
+-----------
+
+name: 
+Axis name
+
+nbins: 
+number of bins
+
+start: 
+low edge of first bin
+
+end: 
+upper edge of last bin 
+";
+
+%feature("docstring")  FixedBinAxis::~FixedBinAxis "virtual FixedBinAxis::~FixedBinAxis()
+";
+
+%feature("docstring")  FixedBinAxis::clone "FixedBinAxis * FixedBinAxis::clone() const
+
+clone function 
+";
+
+%feature("docstring")  FixedBinAxis::size "size_t FixedBinAxis::size() const
+
+retrieve the number of bins 
+";
+
+%feature("docstring")  FixedBinAxis::getBin "Bin1D FixedBinAxis::getBin(size_t index) const
+
+retrieve a 1d bin for the given index 
+";
+
+%feature("docstring")  FixedBinAxis::getMin "double FixedBinAxis::getMin() const
+
+Returns value of first point of axis. 
+";
+
+%feature("docstring")  FixedBinAxis::getMax "double FixedBinAxis::getMax() const
+
+Returns value of last point of axis. 
+";
+
+%feature("docstring")  FixedBinAxis::getBinCenter "double FixedBinAxis::getBinCenter(size_t index) const 
+";
+
+%feature("docstring")  FixedBinAxis::findClosestIndex "size_t FixedBinAxis::findClosestIndex(double value) const
+
+find bin index which is best match for given value 
+";
+
+%feature("docstring")  FixedBinAxis::getBinCenters "std::vector< double > FixedBinAxis::getBinCenters() const 
+";
+
+%feature("docstring")  FixedBinAxis::getBinBoundaries "std::vector< double > FixedBinAxis::getBinBoundaries() const 
+";
+
+%feature("docstring")  FixedBinAxis::createClippedAxis "FixedBinAxis * FixedBinAxis::createClippedAxis(double left, double right) const
+
+Creates a new clipped axis. 
+";
+
+
+// File: classExceptions_1_1FormatErrorException.xml
+%feature("docstring") Exceptions::FormatErrorException "";
+
+%feature("docstring")  Exceptions::FormatErrorException::FormatErrorException "Exceptions::FormatErrorException::FormatErrorException(const std::string &message)
+";
+
+
+// File: classFormFactorAnisoPyramid.xml
+%feature("docstring") FormFactorAnisoPyramid "
+
+A frustum (truncated pyramid) with rectangular base.
+
+C++ includes: FormFactorAnisoPyramid.h
+";
+
+%feature("docstring")  FormFactorAnisoPyramid::FormFactorAnisoPyramid "FormFactorAnisoPyramid::FormFactorAnisoPyramid(double length, double width, double height, double alpha)
+
+Parameters:
+-----------
+
+length: 
+of one side of the rectangular base
+
+width: 
+of other side of the rectangular base
+
+height: 
+of frustum
+
+alpha: 
+dihedral angle in radians between base and facet 
+";
+
+%feature("docstring")  FormFactorAnisoPyramid::clone "FormFactorAnisoPyramid* FormFactorAnisoPyramid::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorAnisoPyramid::accept "void FormFactorAnisoPyramid::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorAnisoPyramid::getLength "double FormFactorAnisoPyramid::getLength() const 
+";
+
+%feature("docstring")  FormFactorAnisoPyramid::getWidth "double FormFactorAnisoPyramid::getWidth() const 
+";
+
+%feature("docstring")  FormFactorAnisoPyramid::getHeight "double FormFactorAnisoPyramid::getHeight() const 
+";
+
+%feature("docstring")  FormFactorAnisoPyramid::getAlpha "double FormFactorAnisoPyramid::getAlpha() const 
+";
+
+
+// File: classFormFactorBox.xml
+%feature("docstring") FormFactorBox "
+
+A rectangular prism (parallelepiped).
+
+C++ includes: FormFactorBox.h
+";
+
+%feature("docstring")  FormFactorBox::FormFactorBox "FormFactorBox::FormFactorBox(double length, double width, double height)
+
+Parameters:
+-----------
+
+length: 
+of rectangular base
+
+width: 
+of rectangular base
+
+height: 
+of prism 
+";
+
+%feature("docstring")  FormFactorBox::clone "FormFactorBox* FormFactorBox::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorBox::accept "void FormFactorBox::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorBox::getLength "double FormFactorBox::getLength() const 
+";
+
+%feature("docstring")  FormFactorBox::getHeight "double FormFactorBox::getHeight() const 
+";
+
+%feature("docstring")  FormFactorBox::getWidth "double FormFactorBox::getWidth() const 
+";
+
+%feature("docstring")  FormFactorBox::getRadialExtension "double FormFactorBox::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorBox::evaluate_for_q "complex_t FormFactorBox::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorCone.xml
+%feature("docstring") FormFactorCone "
+
+A conical frustum (cone truncated parallel to the base) with circular base.
+
+C++ includes: FormFactorCone.h
+";
+
+%feature("docstring")  FormFactorCone::FormFactorCone "FormFactorCone::FormFactorCone(double radius, double height, double alpha)
+
+Parameters:
+-----------
+
+radius: 
+of circular base
+
+height: 
+of frustum
+
+alpha: 
+angle in radians between base and lateral surface 
+";
+
+%feature("docstring")  FormFactorCone::clone "FormFactorCone* FormFactorCone::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorCone::accept "void FormFactorCone::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorCone::getHeight "double FormFactorCone::getHeight() const 
+";
+
+%feature("docstring")  FormFactorCone::getAlpha "double FormFactorCone::getAlpha() const 
+";
+
+%feature("docstring")  FormFactorCone::getRadius "double FormFactorCone::getRadius() const 
+";
+
+%feature("docstring")  FormFactorCone::getRadialExtension "double FormFactorCone::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorCone::evaluate_for_q "complex_t FormFactorCone::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorCone6.xml
+%feature("docstring") FormFactorCone6 "
+
+A frustum (truncated pyramid) with regular hexagonal base.
+
+C++ includes: FormFactorCone6.h
+";
+
+%feature("docstring")  FormFactorCone6::FormFactorCone6 "FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)
+
+Parameters:
+-----------
+
+base_edge: 
+of hexagonal base
+
+height: 
+of frustum
+
+alpha: 
+dihedral angle in radians between base and facet 
+";
+
+%feature("docstring")  FormFactorCone6::clone "FormFactorCone6* FormFactorCone6::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorCone6::accept "void FormFactorCone6::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorCone6::getBaseEdge "double FormFactorCone6::getBaseEdge() const 
+";
+
+%feature("docstring")  FormFactorCone6::getHeight "double FormFactorCone6::getHeight() const 
+";
+
+%feature("docstring")  FormFactorCone6::getAlpha "double FormFactorCone6::getAlpha() const 
+";
+
+
+// File: classFormFactorCrystal.xml
+%feature("docstring") FormFactorCrystal "
+
+The formfactor of a  MesoCrystal.
+
+C++ includes: FormFactorCrystal.h
+";
+
+%feature("docstring")  FormFactorCrystal::FormFactorCrystal "FormFactorCrystal::FormFactorCrystal(const Lattice &lattice, const IFormFactor &basis_form_factor, const IFormFactor &meso_form_factor)
+";
+
+%feature("docstring")  FormFactorCrystal::~FormFactorCrystal "FormFactorCrystal::~FormFactorCrystal() overridefinal
+";
+
+%feature("docstring")  FormFactorCrystal::clone "FormFactorCrystal* FormFactorCrystal::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorCrystal::accept "void FormFactorCrystal::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorCrystal::getVolume "double FormFactorCrystal::getVolume() const overridefinal
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  FormFactorCrystal::getRadialExtension "double FormFactorCrystal::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorCrystal::evaluate "complex_t FormFactorCrystal::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  FormFactorCrystal::evaluatePol "Eigen::Matrix2cd FormFactorCrystal::evaluatePol(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+
+// File: classFormFactorCuboctahedron.xml
+%feature("docstring") FormFactorCuboctahedron "
+
+A truncated bifrustum with quadratic base.
+
+C++ includes: FormFactorCuboctahedron.h
+";
+
+%feature("docstring")  FormFactorCuboctahedron::FormFactorCuboctahedron "FormFactorCuboctahedron::FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha)
+
+Parameters:
+-----------
+
+length: 
+of one side of the square base
+
+height: 
+of bottom frustum
+
+height_ratio: 
+ratio of heights of top to bottom frustum
+
+alpha: 
+dihedral angle in radians between base and facet 
+";
+
+%feature("docstring")  FormFactorCuboctahedron::clone "FormFactorCuboctahedron* FormFactorCuboctahedron::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorCuboctahedron::accept "void FormFactorCuboctahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorCuboctahedron::getLength "double FormFactorCuboctahedron::getLength() const 
+";
+
+%feature("docstring")  FormFactorCuboctahedron::getHeight "double FormFactorCuboctahedron::getHeight() const 
+";
+
+%feature("docstring")  FormFactorCuboctahedron::getHeightRatio "double FormFactorCuboctahedron::getHeightRatio() const 
+";
+
+%feature("docstring")  FormFactorCuboctahedron::getAlpha "double FormFactorCuboctahedron::getAlpha() const 
+";
+
+
+// File: classFormFactorCylinder.xml
+%feature("docstring") FormFactorCylinder "
+
+A circular cylinder.
+
+C++ includes: FormFactorCylinder.h
+";
+
+%feature("docstring")  FormFactorCylinder::FormFactorCylinder "FormFactorCylinder::FormFactorCylinder(double radius, double height)
+";
+
+%feature("docstring")  FormFactorCylinder::clone "FormFactorCylinder* FormFactorCylinder::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorCylinder::accept "void FormFactorCylinder::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorCylinder::getHeight "double FormFactorCylinder::getHeight() const 
+";
+
+%feature("docstring")  FormFactorCylinder::getRadius "double FormFactorCylinder::getRadius() const 
+";
+
+%feature("docstring")  FormFactorCylinder::getRadialExtension "double FormFactorCylinder::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorCylinder::evaluate_for_q "complex_t FormFactorCylinder::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorDecoratorDebyeWaller.xml
+%feature("docstring") FormFactorDecoratorDebyeWaller "
+
+Debye-Waller factors in radial and z directions.
+
+C++ includes: FormFactorDecoratorDebyeWaller.h
+";
+
+%feature("docstring")  FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller "FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(const IFormFactor &form_factor, double dw_h_factor, double dw_r_factor)
+
+Anisotropic Debye-Waller factor. 
+";
+
+%feature("docstring")  FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller "FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(const IFormFactor &form_factor, double dw_factor)
+
+Isotropic Debye-Waller factor. 
+";
+
+%feature("docstring")  FormFactorDecoratorDebyeWaller::clone "FormFactorDecoratorDebyeWaller* FormFactorDecoratorDebyeWaller::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDecoratorDebyeWaller::accept "void FormFactorDecoratorDebyeWaller::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDecoratorDebyeWaller::evaluate "complex_t FormFactorDecoratorDebyeWaller::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  FormFactorDecoratorDebyeWaller::evaluatePol "Eigen::Matrix2cd FormFactorDecoratorDebyeWaller::evaluatePol(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+
+// File: classFormFactorDecoratorFactor.xml
+%feature("docstring") FormFactorDecoratorFactor "
+
+Decorates a formfactor with a constant factor. Base class of  FormFactorDecoratorMaterial.
+
+C++ includes: FormFactorDecoratorFactor.h
+";
+
+%feature("docstring")  FormFactorDecoratorFactor::FormFactorDecoratorFactor "FormFactorDecoratorFactor::FormFactorDecoratorFactor(const IFormFactor &form_factor, const complex_t factor)
+";
+
+%feature("docstring")  FormFactorDecoratorFactor::clone "FormFactorDecoratorFactor* FormFactorDecoratorFactor::clone() const override
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDecoratorFactor::accept "void FormFactorDecoratorFactor::accept(ISampleVisitor *visitor) const override
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDecoratorFactor::evaluate "complex_t FormFactorDecoratorFactor::evaluate(const WavevectorInfo &wavevectors) const override
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  FormFactorDecoratorFactor::evaluatePol "Eigen::Matrix2cd FormFactorDecoratorFactor::evaluatePol(const WavevectorInfo &wavevectors) const override
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+
+// File: classFormFactorDecoratorMaterial.xml
+%feature("docstring") FormFactorDecoratorMaterial "
+
+Decorates a scalar formfactor with the correct factor for the material's refractive index and that of its surrounding material.
+
+C++ includes: FormFactorDecoratorMaterial.h
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::FormFactorDecoratorMaterial "FormFactorDecoratorMaterial::FormFactorDecoratorMaterial(const IFormFactor &form_factor)
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::~FormFactorDecoratorMaterial "FormFactorDecoratorMaterial::~FormFactorDecoratorMaterial() overridefinal
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::clone "FormFactorDecoratorMaterial * FormFactorDecoratorMaterial::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::accept "void FormFactorDecoratorMaterial::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::setMaterial "void FormFactorDecoratorMaterial::setMaterial(const IMaterial &material)
+
+Sets the material of the scatterer. 
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::setAmbientMaterial "void FormFactorDecoratorMaterial::setAmbientMaterial(const IMaterial &material) override
+
+Sets the ambient material. 
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::getAmbientRefractiveIndex "complex_t FormFactorDecoratorMaterial::getAmbientRefractiveIndex() const 
+";
+
+%feature("docstring")  FormFactorDecoratorMaterial::evaluatePol "Eigen::Matrix2cd FormFactorDecoratorMaterial::evaluatePol(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+
+// File: classFormFactorDecoratorPositionFactor.xml
+%feature("docstring") FormFactorDecoratorPositionFactor "
+
+Decorates a formfactor with a position dependent phase factor.
+
+C++ includes: FormFactorDecoratorPositionFactor.h
+";
+
+%feature("docstring")  FormFactorDecoratorPositionFactor::FormFactorDecoratorPositionFactor "FormFactorDecoratorPositionFactor::FormFactorDecoratorPositionFactor(const IFormFactor &form_factor, const kvector_t &position)
+";
+
+%feature("docstring")  FormFactorDecoratorPositionFactor::clone "FormFactorDecoratorPositionFactor* FormFactorDecoratorPositionFactor::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDecoratorPositionFactor::accept "void FormFactorDecoratorPositionFactor::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDecoratorPositionFactor::evaluate "complex_t FormFactorDecoratorPositionFactor::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  FormFactorDecoratorPositionFactor::evaluatePol "Eigen::Matrix2cd FormFactorDecoratorPositionFactor::evaluatePol(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+
+// File: classFormFactorDecoratorRotation.xml
+%feature("docstring") FormFactorDecoratorRotation "
+
+Equips a formfactor with a rotation.
+
+C++ includes: FormFactorDecoratorRotation.h
+";
+
+%feature("docstring")  FormFactorDecoratorRotation::FormFactorDecoratorRotation "FormFactorDecoratorRotation::FormFactorDecoratorRotation(const IFormFactor &form_factor, const IRotation &rotation)
+
+Constructor, setting form factor and rotation. 
+";
+
+%feature("docstring")  FormFactorDecoratorRotation::clone "FormFactorDecoratorRotation * FormFactorDecoratorRotation::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDecoratorRotation::accept "void FormFactorDecoratorRotation::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDecoratorRotation::evaluate "complex_t FormFactorDecoratorRotation::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  FormFactorDecoratorRotation::evaluatePol "Eigen::Matrix2cd FormFactorDecoratorRotation::evaluatePol(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+
+// File: classFormFactorDodecahedron.xml
+%feature("docstring") FormFactorDodecahedron "
+
+A regular dodecahedron.
+
+C++ includes: FormFactorDodecahedron.h
+";
+
+%feature("docstring")  FormFactorDodecahedron::FormFactorDodecahedron "FormFactorDodecahedron::FormFactorDodecahedron(double edge)
+
+Constructs a regular dodecahedron.
+
+Parameters:
+-----------
+
+edge: 
+length 
+";
+
+%feature("docstring")  FormFactorDodecahedron::clone "FormFactorDodecahedron* FormFactorDodecahedron::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDodecahedron::accept "void FormFactorDodecahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDodecahedron::getEdge "double FormFactorDodecahedron::getEdge() const 
+";
+
+
+// File: classFormFactorDWBA.xml
+%feature("docstring") FormFactorDWBA "
+
+Evaluates the coherent sum of the four DWBA terms in a scalar  IFormFactor.
+
+C++ includes: FormFactorDWBA.h
+";
+
+%feature("docstring")  FormFactorDWBA::FormFactorDWBA "FormFactorDWBA::FormFactorDWBA(const IFormFactor &form_factor)
+";
+
+%feature("docstring")  FormFactorDWBA::~FormFactorDWBA "FormFactorDWBA::~FormFactorDWBA() override
+";
+
+%feature("docstring")  FormFactorDWBA::clone "FormFactorDWBA * FormFactorDWBA::clone() const override
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDWBA::accept "void FormFactorDWBA::accept(ISampleVisitor *visitor) const override
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDWBA::evaluate "complex_t FormFactorDWBA::evaluate(const WavevectorInfo &wavevectors) const override
+
+Calculates and returns a form factor calculation in DWBA. 
+";
+
+%feature("docstring")  FormFactorDWBA::getVolume "double FormFactorDWBA::getVolume() const override
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  FormFactorDWBA::getRadialExtension "double FormFactorDWBA::getRadialExtension() const override
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorDWBA::setSpecularInfo "void FormFactorDWBA::setSpecularInfo(const ILayerRTCoefficients *p_in_coeffs, const ILayerRTCoefficients *p_out_coeffs) override
+
+Sets reflection/transmission info for scalar DWBA simulation. 
+";
+
+
+// File: classFormFactorDWBAPol.xml
+%feature("docstring") FormFactorDWBAPol "
+
+Evaluates the coherent sum of the 16 matrix DWBA terms in a polarized  IFormFactor.
+
+C++ includes: FormFactorDWBAPol.h
+";
+
+%feature("docstring")  FormFactorDWBAPol::FormFactorDWBAPol "FormFactorDWBAPol::FormFactorDWBAPol(const IFormFactor &form_factor)
+";
+
+%feature("docstring")  FormFactorDWBAPol::~FormFactorDWBAPol "FormFactorDWBAPol::~FormFactorDWBAPol() override
+";
+
+%feature("docstring")  FormFactorDWBAPol::clone "FormFactorDWBAPol * FormFactorDWBAPol::clone() const override
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorDWBAPol::accept "void FormFactorDWBAPol::accept(ISampleVisitor *visitor) const override
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorDWBAPol::evaluate "complex_t FormFactorDWBAPol::evaluate(const WavevectorInfo &wavevectors) const override
+
+Throws not-implemented exception. 
+";
+
+%feature("docstring")  FormFactorDWBAPol::evaluatePol "Eigen::Matrix2cd FormFactorDWBAPol::evaluatePol(const WavevectorInfo &wavevectors) const override
+
+Calculates and returns a polarized form factor calculation in DWBA. 
+";
+
+%feature("docstring")  FormFactorDWBAPol::getVolume "double FormFactorDWBAPol::getVolume() const override
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  FormFactorDWBAPol::getRadialExtension "double FormFactorDWBAPol::getRadialExtension() const override
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorDWBAPol::setSpecularInfo "void FormFactorDWBAPol::setSpecularInfo(const ILayerRTCoefficients *p_in_coeffs, const ILayerRTCoefficients *p_out_coeffs) override
+
+Sets reflection/transmission info for scalar DWBA simulation. 
+";
+
+
+// File: classFormFactorEllipsoidalCylinder.xml
+%feature("docstring") FormFactorEllipsoidalCylinder "
+
+A cylinder with elliptical base.
+
+C++ includes: FormFactorEllipsoidalCylinder.h
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder "FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height)
+
+Parameters:
+-----------
+
+radius_x: 
+half length of one horizontal main axes
+
+radius_y: 
+half length of the other horizontal main axes
+
+height: 
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::clone "FormFactorEllipsoidalCylinder* FormFactorEllipsoidalCylinder::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::accept "void FormFactorEllipsoidalCylinder::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::getRadiusX "double FormFactorEllipsoidalCylinder::getRadiusX() const 
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::getRadiusY "double FormFactorEllipsoidalCylinder::getRadiusY() const 
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::getHeight "double FormFactorEllipsoidalCylinder::getHeight() const 
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::getRadialExtension "double FormFactorEllipsoidalCylinder::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorEllipsoidalCylinder::evaluate_for_q "complex_t FormFactorEllipsoidalCylinder::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorFullSphere.xml
+%feature("docstring") FormFactorFullSphere "
+
+A full sphere.
+
+C++ includes: FormFactorFullSphere.h
+";
+
+%feature("docstring")  FormFactorFullSphere::FormFactorFullSphere "FormFactorFullSphere::FormFactorFullSphere(double radius)
+";
+
+%feature("docstring")  FormFactorFullSphere::clone "FormFactorFullSphere* FormFactorFullSphere::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorFullSphere::accept "void FormFactorFullSphere::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorFullSphere::getRadius "double FormFactorFullSphere::getRadius() const 
+";
+
+%feature("docstring")  FormFactorFullSphere::getRadialExtension "double FormFactorFullSphere::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorFullSphere::evaluate_for_q "complex_t FormFactorFullSphere::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorFullSpheroid.xml
+%feature("docstring") FormFactorFullSpheroid "
+
+A full spheroid (an ellipsoid with two equal axes, hence with circular cross section)
+
+C++ includes: FormFactorFullSpheroid.h
+";
+
+%feature("docstring")  FormFactorFullSpheroid::FormFactorFullSpheroid "FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height)
+
+Parameters:
+-----------
+
+radius: 
+of the two equal axes
+
+height: 
+total height of the spheroid, i.e. twice the radius of the third axis 
+";
+
+%feature("docstring")  FormFactorFullSpheroid::clone "FormFactorFullSpheroid* FormFactorFullSpheroid::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorFullSpheroid::accept "void FormFactorFullSpheroid::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorFullSpheroid::getHeight "double FormFactorFullSpheroid::getHeight() const 
+";
+
+%feature("docstring")  FormFactorFullSpheroid::getRadius "double FormFactorFullSpheroid::getRadius() const 
+";
+
+%feature("docstring")  FormFactorFullSpheroid::getRadialExtension "double FormFactorFullSpheroid::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorFullSpheroid::evaluate_for_q "complex_t FormFactorFullSpheroid::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorGauss.xml
+%feature("docstring") FormFactorGauss "
+
+The formfactor of a gaussian.
+
+C++ includes: FormFactorGauss.h
+";
+
+%feature("docstring")  FormFactorGauss::FormFactorGauss "FormFactorGauss::FormFactorGauss(double length)
+";
+
+%feature("docstring")  FormFactorGauss::FormFactorGauss "FormFactorGauss::FormFactorGauss(double width, double height)
+";
+
+%feature("docstring")  FormFactorGauss::clone "FormFactorGauss* FormFactorGauss::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorGauss::accept "void FormFactorGauss::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorGauss::getWidth "double FormFactorGauss::getWidth() const 
+";
+
+%feature("docstring")  FormFactorGauss::getHeight "double FormFactorGauss::getHeight() const 
+";
+
+%feature("docstring")  FormFactorGauss::getRadialExtension "double FormFactorGauss::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorGauss::evaluate_for_q "complex_t FormFactorGauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorHemiEllipsoid.xml
+%feature("docstring") FormFactorHemiEllipsoid "
+
+An hemi ellipsoid, obtained by truncating a full ellipsoid in the middle plane spanned by two principal axes.
+
+C++ includes: FormFactorHemiEllipsoid.h
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::FormFactorHemiEllipsoid "FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)
+
+Parameters:
+-----------
+
+radius_x: 
+half length of one horizontal main axes
+
+radius_y: 
+half length of the other horizontal main axes
+
+height: 
+of the hemi ellipsoid 
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::~FormFactorHemiEllipsoid "virtual FormFactorHemiEllipsoid::~FormFactorHemiEllipsoid()
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::clone "FormFactorHemiEllipsoid* FormFactorHemiEllipsoid::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::accept "void FormFactorHemiEllipsoid::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::getHeight "double FormFactorHemiEllipsoid::getHeight() const 
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::getRadiusX "double FormFactorHemiEllipsoid::getRadiusX() const 
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::getRadiusY "double FormFactorHemiEllipsoid::getRadiusY() const 
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::getRadialExtension "double FormFactorHemiEllipsoid::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorHemiEllipsoid::evaluate_for_q "complex_t FormFactorHemiEllipsoid::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorIcosahedron.xml
+%feature("docstring") FormFactorIcosahedron "
+
+A regular icosahedron.
+
+C++ includes: FormFactorIcosahedron.h
+";
+
+%feature("docstring")  FormFactorIcosahedron::FormFactorIcosahedron "FormFactorIcosahedron::FormFactorIcosahedron(double edge)
+";
+
+%feature("docstring")  FormFactorIcosahedron::clone "FormFactorIcosahedron* FormFactorIcosahedron::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorIcosahedron::accept "void FormFactorIcosahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorIcosahedron::getEdge "double FormFactorIcosahedron::getEdge() const 
+";
+
+
+// File: classFormFactorLongBoxGauss.xml
+%feature("docstring") FormFactorLongBoxGauss "
+
+The formfactor for a long rectangular box.
+
+C++ includes: FormFactorLongBoxGauss.h
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::FormFactorLongBoxGauss "FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)
+
+Box constructor.
+
+Parameters:
+-----------
+
+length: 
+of Box's base
+
+width: 
+of Box's base
+
+height: 
+of Box 
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::clone "FormFactorLongBoxGauss* FormFactorLongBoxGauss::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::accept "void FormFactorLongBoxGauss::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::getLength "double FormFactorLongBoxGauss::getLength() const 
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::getHeight "double FormFactorLongBoxGauss::getHeight() const 
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::getWidth "double FormFactorLongBoxGauss::getWidth() const 
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::getRadialExtension "double FormFactorLongBoxGauss::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorLongBoxGauss::evaluate_for_q "complex_t FormFactorLongBoxGauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorLongBoxLorentz.xml
+%feature("docstring") FormFactorLongBoxLorentz "
+
+The formfactor for a long rectangular box.
+
+C++ includes: FormFactorLongBoxLorentz.h
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::FormFactorLongBoxLorentz "FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)
+
+Box constructor.
+
+Parameters:
+-----------
+
+length: 
+of Box's base
+
+width: 
+of Box's base
+
+height: 
+of Box 
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::clone "FormFactorLongBoxLorentz* FormFactorLongBoxLorentz::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::accept "void FormFactorLongBoxLorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::getLength "double FormFactorLongBoxLorentz::getLength() const 
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::getHeight "double FormFactorLongBoxLorentz::getHeight() const 
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::getWidth "double FormFactorLongBoxLorentz::getWidth() const 
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::getRadialExtension "double FormFactorLongBoxLorentz::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorLongBoxLorentz::evaluate_for_q "complex_t FormFactorLongBoxLorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorLongRipple1Gauss.xml
+%feature("docstring") FormFactorLongRipple1Gauss "
+
+The formfactor for a cosine ripple.
+
+C++ includes: FormFactorLongRipple1Gauss.h
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::FormFactorLongRipple1Gauss "FormFactorLongRipple1Gauss::FormFactorLongRipple1Gauss(double length, double width, double height)
+
+Ripple1 constructor.
+
+Parameters:
+-----------
+
+length: 
+of Ripple1
+
+width: 
+of cosine cross section
+
+height: 
+of cosine cross section 
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::clone "FormFactorLongRipple1Gauss* FormFactorLongRipple1Gauss::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::accept "void FormFactorLongRipple1Gauss::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::getHeight "double FormFactorLongRipple1Gauss::getHeight() const 
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::getWidth "double FormFactorLongRipple1Gauss::getWidth() const 
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::getLength "double FormFactorLongRipple1Gauss::getLength() const 
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::getRadialExtension "double FormFactorLongRipple1Gauss::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorLongRipple1Gauss::evaluate_for_q "complex_t FormFactorLongRipple1Gauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+Complex formfactor. 
+";
+
+
+// File: classFormFactorLongRipple1Lorentz.xml
+%feature("docstring") FormFactorLongRipple1Lorentz "
+
+The formfactor for a cosine ripple.
+
+C++ includes: FormFactorLongRipple1Lorentz.h
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::FormFactorLongRipple1Lorentz "FormFactorLongRipple1Lorentz::FormFactorLongRipple1Lorentz(double length, double width, double height)
+
+FormFactorLongRipple1Lorentz constructor.
+
+Parameters:
+-----------
+
+length: 
+of Ripple1
+
+width: 
+of cosine cross section
+
+height: 
+of cosine cross section 
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::clone "FormFactorLongRipple1Lorentz* FormFactorLongRipple1Lorentz::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::accept "void FormFactorLongRipple1Lorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::getRadialExtension "double FormFactorLongRipple1Lorentz::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::getHeight "double FormFactorLongRipple1Lorentz::getHeight() const 
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::getWidth "double FormFactorLongRipple1Lorentz::getWidth() const 
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::getLength "double FormFactorLongRipple1Lorentz::getLength() const 
+";
+
+%feature("docstring")  FormFactorLongRipple1Lorentz::evaluate_for_q "complex_t FormFactorLongRipple1Lorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+Complex formfactor. 
+";
+
+
+// File: classFormFactorLongRipple2Gauss.xml
+%feature("docstring") FormFactorLongRipple2Gauss "
+
+The formfactor for a triangular ripple.
+
+C++ includes: FormFactorLongRipple2Gauss.h
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::FormFactorLongRipple2Gauss "FormFactorLongRipple2Gauss::FormFactorLongRipple2Gauss(double length, double width, double height, double asymmetry)
+
+FormFactorLongRipple2Gauss constructor.
+
+Parameters:
+-----------
+
+length: 
+of Ripple2
+
+width: 
+of triangular cross section
+
+height: 
+of triangular cross section
+
+asymmetry: 
+length of triangular cross section 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::clone "FormFactorLongRipple2Gauss* FormFactorLongRipple2Gauss::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::accept "void FormFactorLongRipple2Gauss::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::getHeight "double FormFactorLongRipple2Gauss::getHeight() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::getWidth "double FormFactorLongRipple2Gauss::getWidth() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::getLength "double FormFactorLongRipple2Gauss::getLength() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::getAsymmetry "double FormFactorLongRipple2Gauss::getAsymmetry() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::getRadialExtension "double FormFactorLongRipple2Gauss::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorLongRipple2Gauss::evaluate_for_q "complex_t FormFactorLongRipple2Gauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+Complex formfactor. 
+";
+
+
+// File: classFormFactorLongRipple2Lorentz.xml
+%feature("docstring") FormFactorLongRipple2Lorentz "
+
+The formfactor for a triangular ripple.
+
+C++ includes: FormFactorLongRipple2Lorentz.h
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::FormFactorLongRipple2Lorentz "FormFactorLongRipple2Lorentz::FormFactorLongRipple2Lorentz(double length, double width, double height, double asymmetry)
+
+Parameters:
+-----------
+
+length: 
+of Ripple2
+
+width: 
+of triangular cross section
+
+height: 
+of triangular cross section
+
+asymmetry: 
+length of triangular cross section 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::clone "FormFactorLongRipple2Lorentz* FormFactorLongRipple2Lorentz::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::accept "void FormFactorLongRipple2Lorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::getHeight "double FormFactorLongRipple2Lorentz::getHeight() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::getWidth "double FormFactorLongRipple2Lorentz::getWidth() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::getLength "double FormFactorLongRipple2Lorentz::getLength() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::getAsymmetry "double FormFactorLongRipple2Lorentz::getAsymmetry() const 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::getRadialExtension "double FormFactorLongRipple2Lorentz::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorLongRipple2Lorentz::evaluate_for_q "complex_t FormFactorLongRipple2Lorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+Complex formfactor. 
+";
+
+
+// File: classFormFactorLorentz.xml
+%feature("docstring") FormFactorLorentz "
+
+The formfactor of a lorentzian.
+
+C++ includes: FormFactorLorentz.h
+";
+
+%feature("docstring")  FormFactorLorentz::FormFactorLorentz "FormFactorLorentz::FormFactorLorentz(double length)
+";
+
+%feature("docstring")  FormFactorLorentz::FormFactorLorentz "FormFactorLorentz::FormFactorLorentz(double width, double height)
+";
+
+%feature("docstring")  FormFactorLorentz::clone "FormFactorLorentz* FormFactorLorentz::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorLorentz::accept "void FormFactorLorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorLorentz::getWidth "double FormFactorLorentz::getWidth() const 
+";
+
+%feature("docstring")  FormFactorLorentz::getHeight "double FormFactorLorentz::getHeight() const 
+";
+
+%feature("docstring")  FormFactorLorentz::getRadialExtension "double FormFactorLorentz::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorLorentz::evaluate_for_q "complex_t FormFactorLorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorPolygonalPrism.xml
+%feature("docstring") FormFactorPolygonalPrism "
+
+A prism with a polygonal base, for form factor computation.
+
+C++ includes: FormFactorPolyhedron.h
+";
+
+%feature("docstring")  FormFactorPolygonalPrism::FormFactorPolygonalPrism "FormFactorPolygonalPrism::FormFactorPolygonalPrism(const double height)
+";
+
+%feature("docstring")  FormFactorPolygonalPrism::evaluate_for_q "complex_t FormFactorPolygonalPrism::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
+";
+
+%feature("docstring")  FormFactorPolygonalPrism::getVolume "double FormFactorPolygonalPrism::getVolume() const
+
+Returns the volume of this prism. 
+";
+
+%feature("docstring")  FormFactorPolygonalPrism::getHeight "double FormFactorPolygonalPrism::getHeight() const 
+";
+
+%feature("docstring")  FormFactorPolygonalPrism::getRadialExtension "double FormFactorPolygonalPrism::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+
+// File: classFormFactorPolygonalSurface.xml
+%feature("docstring") FormFactorPolygonalSurface "
+
+A polygonal surface, for testing form factor computations.
+
+C++ includes: FormFactorPolyhedron.h
+";
+
+%feature("docstring")  FormFactorPolygonalSurface::FormFactorPolygonalSurface "FormFactorPolygonalSurface::FormFactorPolygonalSurface()
+";
+
+%feature("docstring")  FormFactorPolygonalSurface::evaluate_for_q "complex_t FormFactorPolygonalSurface::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+%feature("docstring")  FormFactorPolygonalSurface::getVolume "double FormFactorPolygonalSurface::getVolume() const override
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  FormFactorPolygonalSurface::getRadialExtension "double FormFactorPolygonalSurface::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+
+// File: classFormFactorPolyhedron.xml
+%feature("docstring") FormFactorPolyhedron "
+
+A polyhedron, for form factor computation.
+
+C++ includes: FormFactorPolyhedron.h
+";
+
+%feature("docstring")  FormFactorPolyhedron::FormFactorPolyhedron "FormFactorPolyhedron::FormFactorPolyhedron()
+";
+
+%feature("docstring")  FormFactorPolyhedron::evaluate_for_q "complex_t FormFactorPolyhedron::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns the form factor F(q) of this polyhedron, respecting the offset z_origin. 
+";
+
+%feature("docstring")  FormFactorPolyhedron::evaluate_centered "complex_t FormFactorPolyhedron::evaluate_centered(const cvector_t q) const
+
+Returns the form factor F(q) of this polyhedron, with origin at z=0. 
+";
+
+%feature("docstring")  FormFactorPolyhedron::getVolume "double FormFactorPolyhedron::getVolume() const overridefinal
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  FormFactorPolyhedron::getRadialExtension "double FormFactorPolyhedron::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorPolyhedron::assert_platonic "void FormFactorPolyhedron::assert_platonic() const
+
+Assertions for Platonic solid. 
+";
+
+
+// File: classFormFactorPrism3.xml
+%feature("docstring") FormFactorPrism3 "
+
+A prism based on an equilateral triangle.
+
+C++ includes: FormFactorPrism3.h
+";
+
+%feature("docstring")  FormFactorPrism3::FormFactorPrism3 "FormFactorPrism3::FormFactorPrism3(const double base_edge, const double height)
+";
+
+%feature("docstring")  FormFactorPrism3::clone "FormFactorPrism3* FormFactorPrism3::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorPrism3::accept "void FormFactorPrism3::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorPrism3::getBaseEdge "double FormFactorPrism3::getBaseEdge() const 
+";
+
+
+// File: classFormFactorPrism6.xml
+%feature("docstring") FormFactorPrism6 "
+
+A prism based on a regular hexagonal.
+
+C++ includes: FormFactorPrism6.h
+";
+
+%feature("docstring")  FormFactorPrism6::FormFactorPrism6 "FormFactorPrism6::FormFactorPrism6(const double base_edge, const double height)
+";
+
+%feature("docstring")  FormFactorPrism6::clone "FormFactorPrism6* FormFactorPrism6::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorPrism6::accept "void FormFactorPrism6::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorPrism6::getBaseEdge "double FormFactorPrism6::getBaseEdge() const 
+";
+
+
+// File: classFormFactorPyramid.xml
+%feature("docstring") FormFactorPyramid "
+
+A frustum with a quadratic base.
+
+C++ includes: FormFactorPyramid.h
+";
+
+%feature("docstring")  FormFactorPyramid::FormFactorPyramid "FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)
+
+Parameters:
+-----------
+
+base_edge: 
+of one side of the square base
+
+height: 
+of the frustum
+
+alpha: 
+dihedral angle in radians between base and facet 
+";
+
+%feature("docstring")  FormFactorPyramid::clone "FormFactorPyramid* FormFactorPyramid::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorPyramid::accept "void FormFactorPyramid::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorPyramid::getHeight "double FormFactorPyramid::getHeight() const 
+";
+
+%feature("docstring")  FormFactorPyramid::getBaseEdge "double FormFactorPyramid::getBaseEdge() const 
+";
+
+%feature("docstring")  FormFactorPyramid::getAlpha "double FormFactorPyramid::getAlpha() const 
+";
+
+
+// File: classFormFactorRipple1.xml
+%feature("docstring") FormFactorRipple1 "
+
+The formfactor for a cosine ripple.
+
+C++ includes: FormFactorRipple1.h
+";
+
+%feature("docstring")  FormFactorRipple1::FormFactorRipple1 "FormFactorRipple1::FormFactorRipple1(double length, double width, double height)
+
+Ripple1 constructor.
+
+Parameters:
+-----------
+
+length: 
+of Ripple1
+
+width: 
+of cosine cross section
+
+height: 
+of cosine cross section 
+";
+
+%feature("docstring")  FormFactorRipple1::clone "FormFactorRipple1* FormFactorRipple1::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorRipple1::accept "void FormFactorRipple1::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorRipple1::getLength "double FormFactorRipple1::getLength() const 
+";
+
+%feature("docstring")  FormFactorRipple1::getHeight "double FormFactorRipple1::getHeight() const 
+";
+
+%feature("docstring")  FormFactorRipple1::getWidth "double FormFactorRipple1::getWidth() const 
+";
+
+%feature("docstring")  FormFactorRipple1::getRadialExtension "double FormFactorRipple1::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorRipple1::evaluate_for_q "complex_t FormFactorRipple1::evaluate_for_q(const cvector_t q) const overridefinal
+
+Complex formfactor. 
+";
+
+
+// File: classFormFactorRipple2.xml
+%feature("docstring") FormFactorRipple2 "
+
+The formfactor for a triangular ripple.
+
+C++ includes: FormFactorRipple2.h
+";
+
+%feature("docstring")  FormFactorRipple2::FormFactorRipple2 "FormFactorRipple2::FormFactorRipple2(double length, double width, double height, double asymmetry)
+
+Ripple2 constructor.
+
+Parameters:
+-----------
+
+length: 
+of Ripple2
+
+width: 
+of triangular cross section
+
+height: 
+of triangular cross section
+
+asymmetry: 
+length of triangular cross section 
+";
+
+%feature("docstring")  FormFactorRipple2::clone "FormFactorRipple2* FormFactorRipple2::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorRipple2::accept "void FormFactorRipple2::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorRipple2::getHeight "double FormFactorRipple2::getHeight() const 
+";
+
+%feature("docstring")  FormFactorRipple2::getWidth "double FormFactorRipple2::getWidth() const 
+";
+
+%feature("docstring")  FormFactorRipple2::getLength "double FormFactorRipple2::getLength() const 
+";
+
+%feature("docstring")  FormFactorRipple2::getAsymmetry "double FormFactorRipple2::getAsymmetry() const 
+";
+
+%feature("docstring")  FormFactorRipple2::getRadialExtension "double FormFactorRipple2::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorRipple2::evaluate_for_q "complex_t FormFactorRipple2::evaluate_for_q(const cvector_t q) const overridefinal
+
+Complex formfactor. 
+";
+
+
+// File: classFormFactorSphereGaussianRadius.xml
+%feature("docstring") FormFactorSphereGaussianRadius "
+
+A sphere with gaussian radius distribution.
+
+C++ includes: FormFactorSphereGaussianRadius.h
+";
+
+%feature("docstring")  FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius "FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)
+";
+
+%feature("docstring")  FormFactorSphereGaussianRadius::clone "FormFactorSphereGaussianRadius* FormFactorSphereGaussianRadius::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorSphereGaussianRadius::accept "void FormFactorSphereGaussianRadius::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorSphereGaussianRadius::getRadialExtension "double FormFactorSphereGaussianRadius::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorSphereGaussianRadius::evaluate_for_q "complex_t FormFactorSphereGaussianRadius::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorSphereLogNormalRadius.xml
+%feature("docstring") FormFactorSphereLogNormalRadius "
+
+A sphere with log normal radius distribution.
+
+C++ includes: FormFactorSphereLogNormalRadius.h
+";
+
+%feature("docstring")  FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius "FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples)
+";
+
+%feature("docstring")  FormFactorSphereLogNormalRadius::clone "FormFactorSphereLogNormalRadius* FormFactorSphereLogNormalRadius::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorSphereLogNormalRadius::accept "void FormFactorSphereLogNormalRadius::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorSphereLogNormalRadius::getRadialExtension "double FormFactorSphereLogNormalRadius::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorSphereLogNormalRadius::evaluate_for_q "complex_t FormFactorSphereLogNormalRadius::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorSphereUniformRadius.xml
+%feature("docstring") FormFactorSphereUniformRadius "
+
+Integrated full sphere form factor over a uniform distribution of radii.
+
+C++ includes: FormFactorSphereUniformRadius.h
+";
+
+%feature("docstring")  FormFactorSphereUniformRadius::FormFactorSphereUniformRadius "FormFactorSphereUniformRadius::FormFactorSphereUniformRadius(double mean, double full_width)
+";
+
+%feature("docstring")  FormFactorSphereUniformRadius::clone "FormFactorSphereUniformRadius* FormFactorSphereUniformRadius::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorSphereUniformRadius::accept "void FormFactorSphereUniformRadius::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorSphereUniformRadius::getRadialExtension "double FormFactorSphereUniformRadius::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorSphereUniformRadius::evaluate_for_q "complex_t FormFactorSphereUniformRadius::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorTetrahedron.xml
+%feature("docstring") FormFactorTetrahedron "
+
+A frustum with equilateral trigonal base.
+
+C++ includes: FormFactorTetrahedron.h
+";
+
+%feature("docstring")  FormFactorTetrahedron::FormFactorTetrahedron "FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)
+
+Parameters:
+-----------
+
+base_edge: 
+of a side of the base
+
+height: 
+of the frustum
+
+alpha: 
+dihedral angle in radians between base and facet 
+";
+
+%feature("docstring")  FormFactorTetrahedron::clone "FormFactorTetrahedron* FormFactorTetrahedron::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorTetrahedron::accept "void FormFactorTetrahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorTetrahedron::getBaseEdge "double FormFactorTetrahedron::getBaseEdge() const 
+";
+
+%feature("docstring")  FormFactorTetrahedron::getHeight "double FormFactorTetrahedron::getHeight() const 
+";
+
+%feature("docstring")  FormFactorTetrahedron::getAlpha "double FormFactorTetrahedron::getAlpha() const 
+";
+
+
+// File: classFormFactorTriangle.xml
+%feature("docstring") FormFactorTriangle "
+
+A planar equilateral triangle, for testing form factor computations.
+
+C++ includes: FormFactorTriangle.h
+";
+
+%feature("docstring")  FormFactorTriangle::FormFactorTriangle "FormFactorTriangle::FormFactorTriangle(const double base_edge)
+";
+
+%feature("docstring")  FormFactorTriangle::clone "FormFactorTriangle* FormFactorTriangle::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorTriangle::accept "void FormFactorTriangle::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorTriangle::getBaseEdge "double FormFactorTriangle::getBaseEdge() const 
+";
+
+
+// File: classFormFactorTrivial.xml
+%feature("docstring") FormFactorTrivial "
+
+A dot, with trivial formfactor F(q)=1.
+
+C++ includes: FormFactorTrivial.h
+";
+
+%feature("docstring")  FormFactorTrivial::FormFactorTrivial "FormFactorTrivial::FormFactorTrivial()
+";
+
+%feature("docstring")  FormFactorTrivial::clone "FormFactorTrivial* FormFactorTrivial::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorTrivial::accept "void FormFactorTrivial::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorTrivial::getRadialExtension "double FormFactorTrivial::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorTrivial::evaluate_for_q "complex_t FormFactorTrivial::evaluate_for_q(const cvector_t) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorTruncatedCube.xml
+%feature("docstring") FormFactorTruncatedCube "
+
+A cube, with tetrahedral truncation of all edges.
+
+C++ includes: FormFactorTruncatedCube.h
+";
+
+%feature("docstring")  FormFactorTruncatedCube::FormFactorTruncatedCube "FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)
+
+Parameters:
+-----------
+
+length: 
+of the full cube
+
+removed_length: 
+as removed from each edge of the cube 
+";
+
+%feature("docstring")  FormFactorTruncatedCube::clone "FormFactorTruncatedCube* FormFactorTruncatedCube::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorTruncatedCube::accept "void FormFactorTruncatedCube::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorTruncatedCube::getLength "double FormFactorTruncatedCube::getLength() const 
+";
+
+%feature("docstring")  FormFactorTruncatedCube::getRemovedLength "double FormFactorTruncatedCube::getRemovedLength() const 
+";
+
+
+// File: classFormFactorTruncatedSphere.xml
+%feature("docstring") FormFactorTruncatedSphere "
+
+A truncated Sphere.
+
+C++ includes: FormFactorTruncatedSphere.h
+";
+
+%feature("docstring")  FormFactorTruncatedSphere::FormFactorTruncatedSphere "FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height)
+";
+
+%feature("docstring")  FormFactorTruncatedSphere::clone "FormFactorTruncatedSphere* FormFactorTruncatedSphere::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorTruncatedSphere::accept "void FormFactorTruncatedSphere::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorTruncatedSphere::getHeight "double FormFactorTruncatedSphere::getHeight() const 
+";
+
+%feature("docstring")  FormFactorTruncatedSphere::getRadius "double FormFactorTruncatedSphere::getRadius() const 
+";
+
+%feature("docstring")  FormFactorTruncatedSphere::getRadialExtension "double FormFactorTruncatedSphere::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorTruncatedSphere::evaluate_for_q "complex_t FormFactorTruncatedSphere::evaluate_for_q(const cvector_t q) const overridefinal
+
+Complex formfactor. 
+";
+
+
+// File: classFormFactorTruncatedSpheroid.xml
+%feature("docstring") FormFactorTruncatedSpheroid "
+
+A truncated spheroid. An ellipsoid with two equal axis, truncated by a plane perpendicular to the third axis.
+
+C++ includes: FormFactorTruncatedSpheroid.h
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid "FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double radius, double height, double height_flattening)
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::clone "FormFactorTruncatedSpheroid* FormFactorTruncatedSpheroid::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::accept "void FormFactorTruncatedSpheroid::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::getRadius "double FormFactorTruncatedSpheroid::getRadius() const 
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::getHeight "double FormFactorTruncatedSpheroid::getHeight() const 
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::getHeightFlattening "double FormFactorTruncatedSpheroid::getHeightFlattening() const 
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::getRadialExtension "double FormFactorTruncatedSpheroid::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorTruncatedSpheroid::evaluate_for_q "complex_t FormFactorTruncatedSpheroid::evaluate_for_q(const cvector_t q) const overridefinal
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classFormFactorWeighted.xml
+%feature("docstring") FormFactorWeighted "
+
+Coherent sum of different scalar  IFormFactor's with different weights.
+
+Used by  ParticleComposition and  ParticleCoreShell. If same particles are at different positions, then consider FormFactorDecoratorMultiPositionFactor (restore from commit 0500a26de76).
+
+C++ includes: FormFactorWeighted.h
+";
+
+%feature("docstring")  FormFactorWeighted::FormFactorWeighted "FormFactorWeighted::FormFactorWeighted()
+";
+
+%feature("docstring")  FormFactorWeighted::~FormFactorWeighted "FormFactorWeighted::~FormFactorWeighted() overridefinal
+";
+
+%feature("docstring")  FormFactorWeighted::clone "FormFactorWeighted * FormFactorWeighted::clone() const overridefinal
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  FormFactorWeighted::accept "void FormFactorWeighted::accept(ISampleVisitor *visitor) const overridefinal
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  FormFactorWeighted::getRadialExtension "double FormFactorWeighted::getRadialExtension() const overridefinal
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  FormFactorWeighted::addFormFactor "void FormFactorWeighted::addFormFactor(const IFormFactor &form_factor, double weight=1.0)
+";
+
+%feature("docstring")  FormFactorWeighted::setAmbientMaterial "void FormFactorWeighted::setAmbientMaterial(const IMaterial &material) overridefinal
+
+Passes the refractive index of the ambient material in which this particle is embedded. 
+";
+
+%feature("docstring")  FormFactorWeighted::evaluate "complex_t FormFactorWeighted::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  FormFactorWeighted::evaluatePol "Eigen::Matrix2cd FormFactorWeighted::evaluatePol(const WavevectorInfo &wavevectors) const overridefinal
+
+Calculates and returns a polarized form factor calculation in DWBA. 
+";
+
+
+// File: classFormFactorWrapper.xml
+%feature("docstring") FormFactorWrapper "
+
+Information about particle form factor and abundance.
+
+C++ includes: FormFactorWrapper.h
+";
+
+%feature("docstring")  FormFactorWrapper::FormFactorWrapper "FormFactorWrapper::FormFactorWrapper(IFormFactor *ff, double abundance)
+";
+
+%feature("docstring")  FormFactorWrapper::~FormFactorWrapper "FormFactorWrapper::~FormFactorWrapper()
+";
+
+%feature("docstring")  FormFactorWrapper::clone "FormFactorWrapper * FormFactorWrapper::clone() const 
+";
+
+
+// File: classFTDecayFunction1DCauchy.xml
+%feature("docstring") FTDecayFunction1DCauchy "
+
+One-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-|x|/omega) in real space.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  FTDecayFunction1DCauchy::FTDecayFunction1DCauchy "FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double omega)
+";
+
+%feature("docstring")  FTDecayFunction1DCauchy::clone "virtual FTDecayFunction1DCauchy* FTDecayFunction1DCauchy::clone() const 
+";
+
+%feature("docstring")  FTDecayFunction1DCauchy::evaluate "double FTDecayFunction1DCauchy::evaluate(double q) const final
+";
+
+
+// File: classFTDecayFunction1DGauss.xml
+%feature("docstring") FTDecayFunction1DGauss "
+
+One-dimensional Gauss decay function in reciprocal space; corresponds to exp[-x^2/(2*omega^2)] in real space.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  FTDecayFunction1DGauss::FTDecayFunction1DGauss "FTDecayFunction1DGauss::FTDecayFunction1DGauss(double omega)
+";
+
+%feature("docstring")  FTDecayFunction1DGauss::clone "virtual FTDecayFunction1DGauss* FTDecayFunction1DGauss::clone() const 
+";
+
+%feature("docstring")  FTDecayFunction1DGauss::evaluate "double FTDecayFunction1DGauss::evaluate(double q) const final
+";
+
+
+// File: classFTDecayFunction1DTriangle.xml
+%feature("docstring") FTDecayFunction1DTriangle "
+
+One-dimensional triangle decay function in reciprocal space; corresponds to 1-|x|/omega if |x|<omega (and 0 otherwise) in real space.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  FTDecayFunction1DTriangle::FTDecayFunction1DTriangle "FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double omega)
+";
+
+%feature("docstring")  FTDecayFunction1DTriangle::clone "virtual FTDecayFunction1DTriangle* FTDecayFunction1DTriangle::clone() const 
+";
+
+%feature("docstring")  FTDecayFunction1DTriangle::evaluate "double FTDecayFunction1DTriangle::evaluate(double q) const final
+";
+
+
+// File: classFTDecayFunction1DVoigt.xml
+%feature("docstring") FTDecayFunction1DVoigt "
+
+One-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*Cauchy.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  FTDecayFunction1DVoigt::FTDecayFunction1DVoigt "FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double omega, double eta)
+";
+
+%feature("docstring")  FTDecayFunction1DVoigt::clone "virtual FTDecayFunction1DVoigt* FTDecayFunction1DVoigt::clone() const 
+";
+
+%feature("docstring")  FTDecayFunction1DVoigt::evaluate "double FTDecayFunction1DVoigt::evaluate(double q) const final
+";
+
+%feature("docstring")  FTDecayFunction1DVoigt::getEta "double FTDecayFunction1DVoigt::getEta() const 
+";
+
+
+// File: classFTDecayFunction2DCauchy.xml
+%feature("docstring") FTDecayFunction2DCauchy "
+
+Two-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-r) in real space, with  $r=\\\\sqrt{(\\\\frac{x}{\\\\omega_x})^2 + (\\\\frac{y}{\\\\omega_y})^2}$.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  FTDecayFunction2DCauchy::FTDecayFunction2DCauchy "FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDecayFunction2DCauchy::clone "virtual FTDecayFunction2DCauchy* FTDecayFunction2DCauchy::clone() const 
+";
+
+%feature("docstring")  FTDecayFunction2DCauchy::evaluate "double FTDecayFunction2DCauchy::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed decay function for q in X,Y coordinates 
+";
+
+
+// File: classFTDecayFunction2DGauss.xml
+%feature("docstring") FTDecayFunction2DGauss "
+
+Two-dimensional Gauss decay function in reciprocal space; corresponds to exp(-r^2/2) in real space, with  $r=\\\\sqrt{(\\\\frac{x}{\\\\omega_x})^2 + (\\\\frac{y}{\\\\omega_y})^2}$.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  FTDecayFunction2DGauss::FTDecayFunction2DGauss "FTDecayFunction2DGauss::FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDecayFunction2DGauss::clone "virtual FTDecayFunction2DGauss* FTDecayFunction2DGauss::clone() const 
+";
+
+%feature("docstring")  FTDecayFunction2DGauss::evaluate "double FTDecayFunction2DGauss::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed decay function for q in X,Y coordinates 
+";
+
+
+// File: classFTDecayFunction2DVoigt.xml
+%feature("docstring") FTDecayFunction2DVoigt "
+
+Two-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*Cauchy.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  FTDecayFunction2DVoigt::FTDecayFunction2DVoigt "FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDecayFunction2DVoigt::clone "virtual FTDecayFunction2DVoigt* FTDecayFunction2DVoigt::clone() const 
+";
+
+%feature("docstring")  FTDecayFunction2DVoigt::evaluate "double FTDecayFunction2DVoigt::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed decay function for q in X,Y coordinates 
+";
+
+%feature("docstring")  FTDecayFunction2DVoigt::getEta "virtual double FTDecayFunction2DVoigt::getEta() const 
+";
+
+
+// File: classFTDistribution1DCauchy.xml
+%feature("docstring") FTDistribution1DCauchy "
+
+Exponential  IFTDistribution1D exp(-|omega*x|); its Fourier transform evaluate(q) is a Cauchy-Lorentzian starting at evaluate(0)=1.
+
+C++ includes: FTDistributions1D.h
+";
+
+%feature("docstring")  FTDistribution1DCauchy::FTDistribution1DCauchy "FTDistribution1DCauchy::FTDistribution1DCauchy(double omega)
+";
+
+%feature("docstring")  FTDistribution1DCauchy::clone "FTDistribution1DCauchy* FTDistribution1DCauchy::clone() const final
+";
+
+%feature("docstring")  FTDistribution1DCauchy::evaluate "double FTDistribution1DCauchy::evaluate(double q) const final
+
+Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+";
+
+
+// File: classFTDistribution1DCosine.xml
+%feature("docstring") FTDistribution1DCosine "
+
+IFTDistribution1D consisting of one cosine wave [1+cos(pi*x/omega) if |x|<omega, and 0 otherwise]; its Fourier transform evaluate(q) starts at evaluate(0)=1.
+
+C++ includes: FTDistributions1D.h
+";
+
+%feature("docstring")  FTDistribution1DCosine::FTDistribution1DCosine "FTDistribution1DCosine::FTDistribution1DCosine(double omega)
+";
+
+%feature("docstring")  FTDistribution1DCosine::clone "FTDistribution1DCosine* FTDistribution1DCosine::clone() const final
+";
+
+%feature("docstring")  FTDistribution1DCosine::evaluate "double FTDistribution1DCosine::evaluate(double q) const final
+
+Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+";
+
+
+// File: classFTDistribution1DGate.xml
+%feature("docstring") FTDistribution1DGate "
+
+Square gate  IFTDistribution1D; its Fourier transform evaluate(q) is a sinc function starting at evaluate(0)=1.
+
+C++ includes: FTDistributions1D.h
+";
+
+%feature("docstring")  FTDistribution1DGate::FTDistribution1DGate "FTDistribution1DGate::FTDistribution1DGate(double omega)
+";
+
+%feature("docstring")  FTDistribution1DGate::clone "FTDistribution1DGate* FTDistribution1DGate::clone() const final
+";
+
+%feature("docstring")  FTDistribution1DGate::evaluate "double FTDistribution1DGate::evaluate(double q) const final
+
+Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+";
+
+
+// File: classFTDistribution1DGauss.xml
+%feature("docstring") FTDistribution1DGauss "
+
+Gaussian  IFTDistribution1D; its Fourier transform evaluate(q) is a Gaussian starting at evaluate(0)=1.
+
+C++ includes: FTDistributions1D.h
+";
+
+%feature("docstring")  FTDistribution1DGauss::FTDistribution1DGauss "FTDistribution1DGauss::FTDistribution1DGauss(double omega)
+";
+
+%feature("docstring")  FTDistribution1DGauss::clone "FTDistribution1DGauss* FTDistribution1DGauss::clone() const final
+";
+
+%feature("docstring")  FTDistribution1DGauss::evaluate "double FTDistribution1DGauss::evaluate(double q) const final
+
+Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+";
+
+
+// File: classFTDistribution1DTriangle.xml
+%feature("docstring") FTDistribution1DTriangle "
+
+Triangle  IFTDistribution1D [1-|x|/omega if |x|<omega, and 0 otherwise]; its Fourier transform evaluate(q) is a squared sinc function starting at evaluate(0)=1.
+
+C++ includes: FTDistributions1D.h
+";
+
+%feature("docstring")  FTDistribution1DTriangle::FTDistribution1DTriangle "FTDistribution1DTriangle::FTDistribution1DTriangle(double omega)
+";
+
+%feature("docstring")  FTDistribution1DTriangle::~FTDistribution1DTriangle "virtual FTDistribution1DTriangle::~FTDistribution1DTriangle()
+";
+
+%feature("docstring")  FTDistribution1DTriangle::clone "FTDistribution1DTriangle* FTDistribution1DTriangle::clone() const final
+";
+
+%feature("docstring")  FTDistribution1DTriangle::evaluate "double FTDistribution1DTriangle::evaluate(double q) const final
+
+Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+";
+
+
+// File: classFTDistribution1DVoigt.xml
+%feature("docstring") FTDistribution1DVoigt "
+
+IFTDistribution1D that provides a Fourier transform evaluate(q) in form of a pseudo-Voigt decay function eta*Gauss + (1-eta)*Cauchy, with both components starting at 1 for q=0.
+
+C++ includes: FTDistributions1D.h
+";
+
+%feature("docstring")  FTDistribution1DVoigt::FTDistribution1DVoigt "FTDistribution1DVoigt::FTDistribution1DVoigt(double omega, double eta)
+";
+
+%feature("docstring")  FTDistribution1DVoigt::clone "FTDistribution1DVoigt* FTDistribution1DVoigt::clone() const final
+";
+
+%feature("docstring")  FTDistribution1DVoigt::evaluate "double FTDistribution1DVoigt::evaluate(double q) const final
+
+Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+";
+
+%feature("docstring")  FTDistribution1DVoigt::getEta "double FTDistribution1DVoigt::getEta() const 
+";
+
+
+// File: classFTDistribution2DCauchy.xml
+%feature("docstring") FTDistribution2DCauchy "
+
+Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real space, with  $r=\\\\sqrt{(\\\\frac{x}{\\\\omega_x})^2 + (\\\\frac{y}{\\\\omega_y})^2}$.
+
+C++ includes: FTDistributions2D.h
+";
+
+%feature("docstring")  FTDistribution2DCauchy::FTDistribution2DCauchy "FTDistribution2DCauchy::FTDistribution2DCauchy(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDistribution2DCauchy::clone "FTDistribution2DCauchy* FTDistribution2DCauchy::clone() const final
+";
+
+%feature("docstring")  FTDistribution2DCauchy::evaluate "double FTDistribution2DCauchy::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+";
+
+
+// File: classFTDistribution2DCone.xml
+%feature("docstring") FTDistribution2DCone "
+
+Two-dimensional cone distribution in Fourier space; corresponds to 1-r if r<1 (and 0 otherwise) in real space with  $r=\\\\sqrt{(\\\\frac{x}{\\\\omega_x})^2 + (\\\\frac{y}{\\\\omega_y})^2}$.
+
+C++ includes: FTDistributions2D.h
+";
+
+%feature("docstring")  FTDistribution2DCone::FTDistribution2DCone "FTDistribution2DCone::FTDistribution2DCone(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDistribution2DCone::clone "FTDistribution2DCone* FTDistribution2DCone::clone() const final
+";
+
+%feature("docstring")  FTDistribution2DCone::evaluate "double FTDistribution2DCone::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+";
+
+
+// File: classFTDistribution2DGate.xml
+%feature("docstring") FTDistribution2DGate "
+
+Two-dimensional gate distribution in Fourier space; corresponds to normalized constant if r<1 (and 0 otherwise) in real space, with  $r=\\\\sqrt{(\\\\frac{x}{\\\\omega_x})^2 + (\\\\frac{y}{\\\\omega_y})^2}$.
+
+C++ includes: FTDistributions2D.h
+";
+
+%feature("docstring")  FTDistribution2DGate::FTDistribution2DGate "FTDistribution2DGate::FTDistribution2DGate(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDistribution2DGate::clone "FTDistribution2DGate* FTDistribution2DGate::clone() const final
+";
+
+%feature("docstring")  FTDistribution2DGate::evaluate "double FTDistribution2DGate::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+";
+
+
+// File: classFTDistribution2DGauss.xml
+%feature("docstring") FTDistribution2DGauss "
+
+Two-dimensional Gauss distribution in Fourier space; corresponds to normalized exp(-r^2/2) in real space with  $r=\\\\sqrt{(\\\\frac{x}{\\\\omega_x})^2 + (\\\\frac{y}{\\\\omega_y})^2}$.
+
+C++ includes: FTDistributions2D.h
+";
+
+%feature("docstring")  FTDistribution2DGauss::FTDistribution2DGauss "FTDistribution2DGauss::FTDistribution2DGauss(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDistribution2DGauss::clone "FTDistribution2DGauss* FTDistribution2DGauss::clone() const final
+";
+
+%feature("docstring")  FTDistribution2DGauss::evaluate "double FTDistribution2DGauss::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+";
+
+
+// File: classFTDistribution2DVoigt.xml
+%feature("docstring") FTDistribution2DVoigt "
+
+Two-dimensional Voigt distribution in Fourier space; corresponds to eta*Gauss + (1-eta)*Cauchy
+
+C++ includes: FTDistributions2D.h
+";
+
+%feature("docstring")  FTDistribution2DVoigt::FTDistribution2DVoigt "FTDistribution2DVoigt::FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y, double eta, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  FTDistribution2DVoigt::clone "FTDistribution2DVoigt* FTDistribution2DVoigt::clone() const final
+";
+
+%feature("docstring")  FTDistribution2DVoigt::evaluate "double FTDistribution2DVoigt::evaluate(double qx, double qy) const final
+
+evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+";
+
+%feature("docstring")  FTDistribution2DVoigt::getEta "double FTDistribution2DVoigt::getEta() const 
+";
+
+
+// File: classGISASSimulation.xml
+%feature("docstring") GISASSimulation "
+
+Main class to run the simulation.
+
+C++ includes: GISASSimulation.h
+";
+
+%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation()
+";
+
+%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(const MultiLayer &p_sample)
+";
+
+%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(std::shared_ptr< IMultiLayerBuilder > p_sample_builder)
+";
+
+%feature("docstring")  GISASSimulation::~GISASSimulation "GISASSimulation::~GISASSimulation() final
+";
+
+%feature("docstring")  GISASSimulation::clone "GISASSimulation* GISASSimulation::clone() const 
+";
+
+%feature("docstring")  GISASSimulation::prepareSimulation "void GISASSimulation::prepareSimulation() final
+
+Put into a clean state for running a simulation. 
+";
+
+%feature("docstring")  GISASSimulation::numberOfSimulationElements "int GISASSimulation::numberOfSimulationElements() const final
+
+Gets the number of elements this simulation needs to calculate. 
+";
+
+%feature("docstring")  GISASSimulation::getDetectorIntensity "OutputData< double > * GISASSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+Returns clone of the detector intensity map with detector resolution applied. 
+";
+
+%feature("docstring")  GISASSimulation::getIntensityData "Histogram2D * GISASSimulation::getIntensityData(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+Returns histogram representing intensity map in requested axes units. 
+";
+
+%feature("docstring")  GISASSimulation::setBeamParameters "void GISASSimulation::setBeamParameters(double wavelength, double alpha_i, double phi_i)
+
+Sets beam parameters from here (forwarded to  Instrument) 
+";
+
+%feature("docstring")  GISASSimulation::setDetector "void GISASSimulation::setDetector(const IDetector2D &detector)
+
+Sets the detector (axes can be overwritten later) 
+";
+
+%feature("docstring")  GISASSimulation::setDetectorParameters "void GISASSimulation::setDetectorParameters(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)
+
+Sets spherical detector parameters using angle ranges
+
+Parameters:
+-----------
+
+n_phi: 
+number of phi-axis bins
+
+phi_min: 
+low edge of first phi-bin
+
+phi_max: 
+upper edge of last phi-bin
+
+n_alpha: 
+number of alpha-axis bins
+
+alpha_min: 
+low edge of first alpha-bin
+
+alpha_max: 
+upper edge of last alpha-bin 
+";
+
+%feature("docstring")  GISASSimulation::removeMasks "void GISASSimulation::removeMasks()
+
+removes all masks from the detector 
+";
+
+%feature("docstring")  GISASSimulation::addMask "void GISASSimulation::addMask(const Geometry::IShape2D &shape, bool mask_value=true)
+
+Adds mask of given shape to the stack of detector masks. The mask value 'true' means that the channel will be excluded from the simulation. The mask which is added last has priority.
+
+Parameters:
+-----------
+
+shape: 
+The shape of mask (Rectangle, Polygon, Line, Ellipse)
+
+mask_value: 
+The value of mask 
+";
+
+%feature("docstring")  GISASSimulation::maskAll "void GISASSimulation::maskAll()
+
+Put the mask for all detector channels (i.e. exclude whole detector from the analysis) 
+";
+
+%feature("docstring")  GISASSimulation::addParametersToExternalPool "std::string GISASSimulation::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const final
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+%feature("docstring")  GISASSimulation::setRegionOfInterest "void GISASSimulation::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
+
+Sets rectangular region of interest with lower left and upper right corners defined. 
+";
+
+%feature("docstring")  GISASSimulation::resetRegionOfInterest "void GISASSimulation::resetRegionOfInterest()
+
+Resets region of interest making whole detector plane available for the simulation. 
+";
+
+
+// File: classHexParaCrystalBuilder.xml
+%feature("docstring") HexParaCrystalBuilder "
+
+Builds sample: cylinders with 2DDL structure factor (IsGISAXS example #4)
+
+C++ includes: ParaCrystalBuilder.h
+";
+
+%feature("docstring")  HexParaCrystalBuilder::HexParaCrystalBuilder "HexParaCrystalBuilder::HexParaCrystalBuilder()
+";
+
+%feature("docstring")  HexParaCrystalBuilder::buildSample "MultiLayer * HexParaCrystalBuilder::buildSample() const 
+";
+
+
+// File: classHistogram1D.xml
+%feature("docstring") Histogram1D "";
+
+%feature("docstring")  Histogram1D::Histogram1D "Histogram1D::Histogram1D(int nbinsx, double xlow, double xup)
+
+Constructor for fix bin size histograms.
+
+Parameters:
+-----------
+
+nbinsx: 
+number of bins
+
+xlow: 
+low edge of the first bin
+
+xup: 
+upper edge of the last bin 
+";
+
+%feature("docstring")  Histogram1D::Histogram1D "Histogram1D::Histogram1D(int nbinsx, const std::vector< double > &xbins)
+
+Constructor for variable bin size histograms.
+
+Parameters:
+-----------
+
+nbinsx: 
+number of bins
+
+xbins: 
+Array of size nbins+1 containing low-edges for each bin and upper edge of last bin. 
+";
+
+%feature("docstring")  Histogram1D::Histogram1D "Histogram1D::Histogram1D(const IAxis &axis)
+
+Constructor for 1D histogram with custom axis. 
+";
+
+%feature("docstring")  Histogram1D::Histogram1D "Histogram1D::Histogram1D(const OutputData< double > &data)
+
+Constructor for 1D histograms from basic  OutputData object. 
+";
+
+%feature("docstring")  Histogram1D::clone "Histogram1D * Histogram1D::clone() const
+
+Returns clone of other histogram. 
+";
+
+%feature("docstring")  Histogram1D::getRank "size_t Histogram1D::getRank() const
+
+Returns the number of histogram dimensions. 
+";
+
+%feature("docstring")  Histogram1D::fill "int Histogram1D::fill(double x, double weight=1.0)
+
+Increment bin with abscissa x with a weight. 
+";
+
+%feature("docstring")  Histogram1D::getBinCenters "std::vector< double > Histogram1D::getBinCenters() const
+
+returns vector of histogram bin centers 
+";
+
+%feature("docstring")  Histogram1D::getBinValues "std::vector< double > Histogram1D::getBinValues() const
+
+returns vector of bin content (the value accumulated by bins) 
+";
+
+%feature("docstring")  Histogram1D::getBinErrors "std::vector< double > Histogram1D::getBinErrors() const
+
+returns vector of bin errors 
+";
+
+%feature("docstring")  Histogram1D::crop "Histogram1D * Histogram1D::crop(double xmin, double xmax)
+
+Create new histogram by applying crop on axis. 
+";
+
+
+// File: classHistogram2D.xml
+%feature("docstring") Histogram2D "
+
+Two dimensional histogram.
+
+C++ includes: Histogram2D.h
+";
+
+%feature("docstring")  Histogram2D::Histogram2D "Histogram2D::Histogram2D(int nbinsx, double xlow, double xup, int nbinsy, double ylow, double yup)
+
+Constructor for fix bin size histograms.
+
+Parameters:
+-----------
+
+nbinsx: 
+number of bins on X-axis
+
+xlow: 
+low edge of the first bin of X-axis
+
+xup: 
+upper edge of the last bin of X-axis
+
+nbinsy: 
+number of bins on Y axis
+
+ylow: 
+low edge of the first bin of Y-axis
+
+yup: 
+upper edge of the last bin of Y-axis 
+";
+
+%feature("docstring")  Histogram2D::Histogram2D "Histogram2D::Histogram2D(int nbinsx, const std::vector< double > &xbins, int nbinsy, const std::vector< double > &ybins)
+
+Constructor for variable bin size histograms.
+
+Parameters:
+-----------
+
+nbinsx: 
+number of bins on X-axis
+
+xbins: 
+Array of size nbins+1 containing low-edges for each bin and upper edge of last bin.
+
+nbinsy: 
+number of bins on Y-axis
+
+ybins: 
+Array of size nbins+1 containing low-edges for each bin and upper edge of last bin. 
+";
+
+%feature("docstring")  Histogram2D::Histogram2D "Histogram2D::Histogram2D(const IAxis &axis_x, const IAxis &axis_y)
+
+Constructor for 2D histogram with custom axes. 
+";
+
+%feature("docstring")  Histogram2D::Histogram2D "Histogram2D::Histogram2D(const OutputData< double > &data)
+
+Constructor for 2D histograms from basic  OutputData object. 
+";
+
+%feature("docstring")  Histogram2D::clone "Histogram2D * Histogram2D::clone() const
+
+Returns clone of other histogram. 
+";
+
+%feature("docstring")  Histogram2D::getRank "size_t Histogram2D::getRank() const
+
+Returns the number of histogram dimensions. 
+";
+
+%feature("docstring")  Histogram2D::fill "int Histogram2D::fill(double x, double y, double weight=1.0)
+
+Increment bin with abscissa x and ordinate y with a weight. 
+";
+
+%feature("docstring")  Histogram2D::projectionX "Histogram1D * Histogram2D::projectionX()
+
+Project a 2D histogram into 1D histogram along X. The projection is made from all bins along y-axis. 
+";
+
+%feature("docstring")  Histogram2D::projectionX "Histogram1D * Histogram2D::projectionX(double yvalue)
+
+Project a 2D histogram into 1D histogram along X. The projection is made from the y-bin closest to given ordinate yvalue.
+
+Parameters:
+-----------
+
+yvalue: 
+the value on y-axis at which projection is taken 
+";
+
+%feature("docstring")  Histogram2D::projectionX "Histogram1D * Histogram2D::projectionX(double ylow, double yup)
+
+Project a 2D histogram into 1D histogram along X. The projection is made from all y-bins corresponding to ordinate between ylow and yup.
+
+Parameters:
+-----------
+
+ylow: 
+lower edje on y-axis
+
+yup: 
+upper edje on y-axis 
+";
+
+%feature("docstring")  Histogram2D::projectionY "Histogram1D * Histogram2D::projectionY()
+
+Project a 2D histogram into 1D histogram along Y. The projection is made from all bins along x-axis. 
+";
+
+%feature("docstring")  Histogram2D::projectionY "Histogram1D * Histogram2D::projectionY(double xvalue)
+
+Project a 2D histogram into 1D histogram along Y. The projection is made from the x-bin closest to given abscissa xvalue.
+
+Parameters:
+-----------
+
+xvalue: 
+the value on x-axis at which projection is taken 
+";
+
+%feature("docstring")  Histogram2D::projectionY "Histogram1D * Histogram2D::projectionY(double xlow, double xup)
+
+Project a 2D histogram into 1D histogram along Y. The projection is made from all x-bins corresponding to abscissa between xlow and xup.
+
+Parameters:
+-----------
+
+xlow: 
+lower edje on x-axis
+
+xup: 
+upper edje on x-axis 
+";
+
+%feature("docstring")  Histogram2D::crop "Histogram2D * Histogram2D::crop(double xmin, double ymin, double xmax, double ymax)
+
+Create new histogram by applying rectangular clip. 
+";
+
+
+// File: classHomogeneousMagneticMaterial.xml
+%feature("docstring") HomogeneousMagneticMaterial "
+
+A homogeneous material with magnetization.
+
+C++ includes: HomogeneousMagneticMaterial.h
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::HomogeneousMagneticMaterial "HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(const std::string &name, const complex_t refractive_index, const kvector_t magnetic_field)
+
+Constructs a material with  name,  refractive_index and  magnetic_field
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::HomogeneousMagneticMaterial "HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(const std::string &name, double refractive_index_delta, double refractive_index_beta, const kvector_t magnetic_field)
+
+Constructs a material with  name, refractive_index parameters and  magnetic_field
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::clone "HomogeneousMagneticMaterial * HomogeneousMagneticMaterial::clone() const
+
+Clone. 
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::getMagneticField "kvector_t HomogeneousMagneticMaterial::getMagneticField() const
+
+Get the magnetic field (in Tesla) 
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::setMagneticField "void HomogeneousMagneticMaterial::setMagneticField(const kvector_t magnetic_field)
+
+Set the magnetic field (in Tesla) 
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::isScalarMaterial "virtual bool HomogeneousMagneticMaterial::isScalarMaterial() const
+
+Indicates that the material is not scalar. This means that different polarization states will be diffracted differently 
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::getScatteringMatrix "Eigen::Matrix2cd HomogeneousMagneticMaterial::getScatteringMatrix(double k_mag2) const
+
+Get the scattering matrix (~potential V) from the material. This matrix appears in the full three-dimensional Schroedinger equation. 
+";
+
+%feature("docstring")  HomogeneousMagneticMaterial::createTransformedMaterial "const IMaterial * HomogeneousMagneticMaterial::createTransformedMaterial(const Transform3D &transform) const
+
+Create a new material that is transformed with respect to this one. 
+";
+
+
+// File: classHomogeneousMaterial.xml
+%feature("docstring") HomogeneousMaterial "
+
+An homogeneous material with a refractive index.
+
+C++ includes: HomogeneousMaterial.h
+";
+
+%feature("docstring")  HomogeneousMaterial::HomogeneousMaterial "HomogeneousMaterial::HomogeneousMaterial(const std::string &name, const complex_t refractive_index)
+
+Constructs a material with  name and  refractive_index. 
+";
+
+%feature("docstring")  HomogeneousMaterial::HomogeneousMaterial "HomogeneousMaterial::HomogeneousMaterial(const std::string &name, double refractive_index_delta, double refractive_index_beta)
+
+Constructs a material with  name and refractive_index parameters delta and beta (n = 1 - delta + i*beta). 
+";
+
+%feature("docstring")  HomogeneousMaterial::~HomogeneousMaterial "virtual HomogeneousMaterial::~HomogeneousMaterial()
+";
+
+%feature("docstring")  HomogeneousMaterial::clone "virtual HomogeneousMaterial* HomogeneousMaterial::clone() const 
+";
+
+%feature("docstring")  HomogeneousMaterial::getRefractiveIndex "virtual complex_t HomogeneousMaterial::getRefractiveIndex() const 
+";
+
+%feature("docstring")  HomogeneousMaterial::setRefractiveIndex "void HomogeneousMaterial::setRefractiveIndex(const complex_t refractive_index)
+";
+
+%feature("docstring")  HomogeneousMaterial::getScatteringMatrix "virtual Eigen::Matrix2cd HomogeneousMaterial::getScatteringMatrix(double) const
+
+Get the scattering matrix (~potential V) from the material. This matrix appears in the full three-dimensional Schroedinger equation. 
+";
+
+%feature("docstring")  HomogeneousMaterial::createTransformedMaterial "virtual const IMaterial* HomogeneousMaterial::createTransformedMaterial(const Transform3D &) const
+
+Create a new material that is transformed with respect to this one. 
+";
+
+
+// File: classGeometry_1_1HorizontalLine.xml
+%feature("docstring") Geometry::HorizontalLine "
+
+An infinite horizontal line.
+
+C++ includes: Line.h
+";
+
+%feature("docstring")  Geometry::HorizontalLine::HorizontalLine "Geometry::HorizontalLine::HorizontalLine(double y)
+
+Parameters:
+-----------
+
+y: 
+The value at which it crosses y-axes 
+";
+
+%feature("docstring")  Geometry::HorizontalLine::clone "HorizontalLine* Geometry::HorizontalLine::clone() const 
+";
+
+%feature("docstring")  Geometry::HorizontalLine::contains "bool Geometry::HorizontalLine::contains(double x, double y) const
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::HorizontalLine::contains "bool Geometry::HorizontalLine::contains(const Bin1D &binx, const Bin1D &biny) const
+
+Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+";
+
+%feature("docstring")  Geometry::HorizontalLine::getYpos "double Geometry::HorizontalLine::getYpos() const 
+";
+
+
+// File: classIAbstractParticle.xml
+%feature("docstring") IAbstractParticle "
+
+Interface for a generic particle.
+
+Inherited by  IParticle and  ParticleDistribution.
+
+C++ includes: IAbstractParticle.h
+";
+
+%feature("docstring")  IAbstractParticle::IAbstractParticle "IAbstractParticle::IAbstractParticle()
+";
+
+%feature("docstring")  IAbstractParticle::~IAbstractParticle "virtual IAbstractParticle::~IAbstractParticle()
+";
+
+%feature("docstring")  IAbstractParticle::clone "virtual IAbstractParticle* IAbstractParticle::clone() const =0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IAbstractParticle::cloneInvertB "virtual IAbstractParticle* IAbstractParticle::cloneInvertB() const =0
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  IAbstractParticle::accept "virtual void IAbstractParticle::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  IAbstractParticle::setAmbientMaterial "virtual void IAbstractParticle::setAmbientMaterial(const IMaterial &)=0
+
+Sets the refractive index of the ambient material (which influences its scattering power) 
+";
+
+%feature("docstring")  IAbstractParticle::getAbundance "double IAbstractParticle::getAbundance() const 
+";
+
+%feature("docstring")  IAbstractParticle::setAbundance "void IAbstractParticle::setAbundance(double abundance)
+";
+
+%feature("docstring")  IAbstractParticle::getAmbientMaterial "virtual const IMaterial* IAbstractParticle::getAmbientMaterial() const =0
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+
+// File: classIAxis.xml
+%feature("docstring") IAxis "
+
+Interface for one-dimensional axes.
+
+C++ includes: IAxis.h
+";
+
+%feature("docstring")  IAxis::IAxis "IAxis::IAxis(const std::string &name)
+
+constructors 
+";
+
+%feature("docstring")  IAxis::clone "virtual IAxis* IAxis::clone() const =0
+
+clone function 
+";
+
+%feature("docstring")  IAxis::createDoubleBinSize "IAxis * IAxis::createDoubleBinSize() const
+
+Creates a new axis with half the number of bins. 
+";
+
+%feature("docstring")  IAxis::~IAxis "virtual IAxis::~IAxis()
+
+destructor 
+";
+
+%feature("docstring")  IAxis::size "virtual size_t IAxis::size() const =0
+
+retrieve the number of bins 
+";
+
+%feature("docstring")  IAxis::getName "std::string IAxis::getName() const
+
+retrieve the label of the axis 
+";
+
+%feature("docstring")  IAxis::setName "void IAxis::setName(std::string name)
+
+Sets the axis label. 
+";
+
+%feature("docstring")  IAxis::getBin "virtual Bin1D IAxis::getBin(size_t index) const =0
+
+retrieve a 1d bin for the given index 
+";
+
+%feature("docstring")  IAxis::getMin "virtual double IAxis::getMin() const =0
+
+Returns value of first point of axis. 
+";
+
+%feature("docstring")  IAxis::getMax "virtual double IAxis::getMax() const =0
+
+Returns value of last point of axis. 
+";
+
+%feature("docstring")  IAxis::getBinCenter "virtual double IAxis::getBinCenter(size_t index) const =0
+";
+
+%feature("docstring")  IAxis::findClosestIndex "virtual size_t IAxis::findClosestIndex(double value) const =0
+
+find bin index which is best match for given value 
+";
+
+%feature("docstring")  IAxis::findIndex "size_t IAxis::findIndex(double value) const
+
+find index of bin that contains the given value returns  size() when value is not found 
+";
+
+%feature("docstring")  IAxis::getBinCenters "std::vector< double > IAxis::getBinCenters() const 
+";
+
+%feature("docstring")  IAxis::getBinBoundaries "std::vector< double > IAxis::getBinBoundaries() const 
+";
+
+%feature("docstring")  IAxis::createClippedAxis "IAxis * IAxis::createClippedAxis(double left, double right) const
+
+Creates a new clipped axis. 
+";
+
+%feature("docstring")  IAxis::contains "bool IAxis::contains(double value) const
+
+Returns true if axis contains given point. 
+";
+
+
+// File: classIChiSquaredModule.xml
+%feature("docstring") IChiSquaredModule "
+
+Interface for  ChiSquaredModule for chi2 calculations.
+
+Until BornAgain-1.1, there was another child, ChiSquaredFrequency.
+
+C++ includes: IChiSquaredModule.h
+";
+
+%feature("docstring")  IChiSquaredModule::IChiSquaredModule "IChiSquaredModule::IChiSquaredModule()
+";
+
+%feature("docstring")  IChiSquaredModule::~IChiSquaredModule "IChiSquaredModule::~IChiSquaredModule()
+";
+
+%feature("docstring")  IChiSquaredModule::clone "virtual IChiSquaredModule* IChiSquaredModule::clone() const =0
+
+clone method 
+";
+
+%feature("docstring")  IChiSquaredModule::getSquaredFunction "const ISquaredFunction* IChiSquaredModule::getSquaredFunction() const
+
+Returns squared function. 
+";
+
+%feature("docstring")  IChiSquaredModule::setChiSquaredFunction "void IChiSquaredModule::setChiSquaredFunction(ISquaredFunction *squared_function)
+
+Sets squared function // TODO: merge these two functions (SWIG warning 509) 
+";
+
+%feature("docstring")  IChiSquaredModule::setChiSquaredFunction "void IChiSquaredModule::setChiSquaredFunction(const ISquaredFunction &squared_function)
+";
+
+%feature("docstring")  IChiSquaredModule::getIntensityNormalizer "virtual const IIntensityNormalizer* IChiSquaredModule::getIntensityNormalizer() const
+
+Returns data normalizer. 
+";
+
+%feature("docstring")  IChiSquaredModule::getIntensityNormalizer "virtual IIntensityNormalizer* IChiSquaredModule::getIntensityNormalizer()
+
+Returns data normalizer, non-const version needed to set internals. 
+";
+
+%feature("docstring")  IChiSquaredModule::setIntensityNormalizer "void IChiSquaredModule::setIntensityNormalizer(const IIntensityNormalizer &data_normalizer)
+
+Sets data normalizer. 
+";
+
+%feature("docstring")  IChiSquaredModule::getIntensityFunction "virtual const IIntensityFunction* IChiSquaredModule::getIntensityFunction() const
+
+Returns data rescaler. 
+";
+
+%feature("docstring")  IChiSquaredModule::setIntensityFunction "void IChiSquaredModule::setIntensityFunction(const IIntensityFunction &intensity_function)
+
+Sets data rescaler. 
+";
+
+%feature("docstring")  IChiSquaredModule::processFitElements "virtual void IChiSquaredModule::processFitElements(std::vector< FitElement >::iterator, std::vector< FitElement >::iterator)
+";
+
+
+// File: classICloneable.xml
+%feature("docstring") ICloneable "
+
+Mix-in for objects that must not be copied, except by cloning.
+
+The base class  INoncopyable disables the copy constructor and the operator= in all its child classes. Child classes of  ICloneable should provide clone().
+
+C++ includes: ICloneable.h
+";
+
+%feature("docstring")  ICloneable::clone "virtual ICloneable* ICloneable::clone() const =0
+";
+
+%feature("docstring")  ICloneable::transferToCPP "virtual void ICloneable::transferToCPP()
+
+Used for Python overriding of clone. 
+";
+
+
+// File: classIClusteredParticles.xml
+%feature("docstring") IClusteredParticles "
+
+An ordered assembly of particles. Currently, the only child class is  Crystal.
+
+C++ includes: IClusteredParticles.h
+";
+
+%feature("docstring")  IClusteredParticles::IClusteredParticles "IClusteredParticles::IClusteredParticles()
+";
+
+%feature("docstring")  IClusteredParticles::clone "virtual IClusteredParticles* IClusteredParticles::clone() const =0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IClusteredParticles::cloneInvertB "virtual IClusteredParticles* IClusteredParticles::cloneInvertB() const =0
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  IClusteredParticles::accept "virtual void IClusteredParticles::accept(ISampleVisitor *visitor) const =0
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  IClusteredParticles::setAmbientMaterial "virtual void IClusteredParticles::setAmbientMaterial(const IMaterial &material)=0
+";
+
+%feature("docstring")  IClusteredParticles::getAmbientMaterial "virtual const IMaterial* IClusteredParticles::getAmbientMaterial() const =0
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  IClusteredParticles::createTotalFormFactor "virtual IFormFactor* IClusteredParticles::createTotalFormFactor(const IFormFactor &, const IRotation *, const kvector_t &) const =0
+
+Creates a total form factor for the mesocrystal with a specific shape and content The bulk content of the mesocrystal is encapsulated by the  IClusteredParticles object itself 
+";
+
+%feature("docstring")  IClusteredParticles::applyRotation "virtual void IClusteredParticles::applyRotation(const IRotation &)=delete
+
+Composes transformation with existing one. 
+";
+
+
+// File: classICompositeSample.xml
+%feature("docstring") ICompositeSample "
+
+Pure virtual base class for tree-like composite samples.
+
+Inherited by  IAbstractParticle, IClusteredParticle,  ILayout, ILayer, IMultiLayer.
+
+C++ includes: ICompositeSample.h
+";
+
+%feature("docstring")  ICompositeSample::ICompositeSample "ICompositeSample::ICompositeSample()
+";
+
+%feature("docstring")  ICompositeSample::~ICompositeSample "ICompositeSample::~ICompositeSample()
+";
+
+%feature("docstring")  ICompositeSample::clone "virtual ICompositeSample* ICompositeSample::clone() const =0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  ICompositeSample::accept "virtual void ICompositeSample::accept(ISampleVisitor *visitor) const =0
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  ICompositeSample::registerChild "void ICompositeSample::registerChild(ISample *sample)
+
+Registers child in the container. 
+";
+
+%feature("docstring")  ICompositeSample::deregisterChild "void ICompositeSample::deregisterChild(ISample *sample)
+
+Removes registered child from the container.
+
+remove registered child from the container 
+";
+
+%feature("docstring")  ICompositeSample::getChildren "std::vector< const ISample * > ICompositeSample::getChildren() const final
+
+Returns a vector of children (const). 
+";
+
+%feature("docstring")  ICompositeSample::size "size_t ICompositeSample::size() const final
+
+Returns number of children. 
+";
+
+%feature("docstring")  ICompositeSample::addParametersToExternalPool "std::string ICompositeSample::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+
+// File: classIDetector.xml
+%feature("docstring") IDetector "
+
+The detector interface.
+
+C++ includes: IDetector2D.h
+";
+
+
+// File: classIDetector2D.xml
+%feature("docstring") IDetector2D "";
+
+%feature("docstring")  IDetector2D::IDetector2D "IDetector2D::IDetector2D()
+";
+
+%feature("docstring")  IDetector2D::clone "virtual IDetector2D* IDetector2D::clone() const =0
+";
+
+%feature("docstring")  IDetector2D::~IDetector2D "IDetector2D::~IDetector2D()
+";
+
+%feature("docstring")  IDetector2D::init "virtual void IDetector2D::init(const Beam &)
+
+Inits detector with the beam settings. 
+";
+
+%feature("docstring")  IDetector2D::addAxis "void IDetector2D::addAxis(const IAxis &axis)
+";
+
+%feature("docstring")  IDetector2D::getAxis "const IAxis & IDetector2D::getAxis(size_t index) const 
+";
+
+%feature("docstring")  IDetector2D::getDimension "size_t IDetector2D::getDimension() const 
+";
+
+%feature("docstring")  IDetector2D::clear "void IDetector2D::clear()
+";
+
+%feature("docstring")  IDetector2D::setDetectorParameters "void IDetector2D::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+Sets detector parameters using angle ranges. 
+";
+
+%feature("docstring")  IDetector2D::setDetectorAxes "void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
+
+Sets detector parameters using axes. 
+";
+
+%feature("docstring")  IDetector2D::setDetectorResolution "void IDetector2D::setDetectorResolution(IDetectorResolution *p_detector_resolution)
+
+Sets the detector resolution. 
+";
+
+%feature("docstring")  IDetector2D::applyDetectorResolution "void IDetector2D::applyDetectorResolution(OutputData< double > *p_intensity_map) const
+
+Applies the detector resolution to the given intensity maps. 
+";
+
+%feature("docstring")  IDetector2D::getDetectorResolutionFunction "const IDetectorResolution * IDetector2D::getDetectorResolutionFunction() const 
+";
+
+%feature("docstring")  IDetector2D::setAnalyzerProperties "void IDetector2D::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)
+
+Sets the polarization analyzer characteristics of the detector. 
+";
+
+%feature("docstring")  IDetector2D::removeMasks "void IDetector2D::removeMasks()
+
+removes all masks from the detector 
+";
+
+%feature("docstring")  IDetector2D::addMask "void IDetector2D::addMask(const Geometry::IShape2D &shape, bool mask_value=true)
+
+Adds mask of given shape to the stack of detector masks. The mask value 'true' means that the channel will be excluded from the simulation. The mask which is added last has priority.
+
+Parameters:
+-----------
+
+shape: 
+The shape of mask (Rectangle, Polygon, Line, Ellipse)
+
+mask_value: 
+The value of mask 
+";
+
+%feature("docstring")  IDetector2D::maskAll "void IDetector2D::maskAll()
+
+Put the mask for all detector channels (i.e. exclude whole detector from the analysis) 
+";
+
+%feature("docstring")  IDetector2D::getDetectorMask "const DetectorMask * IDetector2D::getDetectorMask() const 
+";
+
+%feature("docstring")  IDetector2D::numberOfMaskedChannels "size_t IDetector2D::numberOfMaskedChannels() const 
+";
+
+%feature("docstring")  IDetector2D::isMasked "bool IDetector2D::isMasked(size_t index) const 
+";
+
+%feature("docstring")  IDetector2D::hasMasks "bool IDetector2D::hasMasks() const
+
+return true if has masks 
+";
+
+%feature("docstring")  IDetector2D::createSimulationElements "std::vector< SimulationElement > IDetector2D::createSimulationElements(const Beam &beam)
+
+Create a vector of  SimulationElement objects according to the detector and its mask. 
+";
+
+%feature("docstring")  IDetector2D::getSimulationElement "SimulationElement IDetector2D::getSimulationElement(size_t index, const Beam &beam) const
+
+Creates single simulation element. 
+";
+
+%feature("docstring")  IDetector2D::addParametersToExternalPool "std::string IDetector2D::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+%feature("docstring")  IDetector2D::createDetectorIntensity "OutputData< double > * IDetector2D::createDetectorIntensity(const std::vector< SimulationElement > &elements, const Beam &beam, IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+Returns new intensity map with detector resolution applied and axes in requested units. 
+";
+
+%feature("docstring")  IDetector2D::createDetectorMap "OutputData< double > * IDetector2D::createDetectorMap(const Beam &beam, EAxesUnits units) const
+
+Returns empty detector map in given axes units. 
+";
+
+%feature("docstring")  IDetector2D::initOutputData "void IDetector2D::initOutputData(OutputData< double > &data) const
+
+Inits axes of  OutputData to match the detector and sets values to zero. 
+";
+
+%feature("docstring")  IDetector2D::getValidAxesUnits "std::vector< IDetector2D::EAxesUnits > IDetector2D::getValidAxesUnits() const
+
+returns vector of valid axes units 
+";
+
+%feature("docstring")  IDetector2D::getDefaultAxesUnits "virtual EAxesUnits IDetector2D::getDefaultAxesUnits() const
+
+return default axes units 
+";
+
+%feature("docstring")  IDetector2D::regionOfInterest "const RegionOfInterest * IDetector2D::regionOfInterest() const
+
+Returns region of interest if exists. 
+";
+
+%feature("docstring")  IDetector2D::setRegionOfInterest "void IDetector2D::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
+
+Sets rectangular region of interest with lower left and upper right corners defined. 
+";
+
+%feature("docstring")  IDetector2D::resetRegionOfInterest "void IDetector2D::resetRegionOfInterest()
+
+Resets region of interest making whole detector plane available for the simulation. 
+";
+
+%feature("docstring")  IDetector2D::getTotalSize "size_t IDetector2D::getTotalSize() const
+
+Returns total number of pixels. 
+";
+
+%feature("docstring")  IDetector2D::getAxisBinIndex "size_t IDetector2D::getAxisBinIndex(size_t index, size_t selected_axis) const
+
+Calculate axis index for given global index. 
+";
+
+%feature("docstring")  IDetector2D::numberOfSimulationElements "size_t IDetector2D::numberOfSimulationElements() const
+
+Returns number of simulation elements. 
+";
+
+
+// File: classIDetectorResolution.xml
+%feature("docstring") IDetectorResolution "
+
+Interface for detector resolution algorithms.
+
+C++ includes: IDetectorResolution.h
+";
+
+%feature("docstring")  IDetectorResolution::~IDetectorResolution "virtual IDetectorResolution::~IDetectorResolution()
+";
+
+%feature("docstring")  IDetectorResolution::applyDetectorResolution "virtual void IDetectorResolution::applyDetectorResolution(OutputData< double > *p_intensity_map) const =0
+
+Apply the resolution function to the intensity data. 
+";
+
+%feature("docstring")  IDetectorResolution::applyDetectorResolutionPol "void IDetectorResolution::applyDetectorResolutionPol(OutputData< Eigen::Matrix2d > *p_matrix_intensity) const
+
+Applies the detector resolution to the matrix-valued intensity data. 
+";
+
+%feature("docstring")  IDetectorResolution::clone "virtual IDetectorResolution* IDetectorResolution::clone() const =0
+";
+
+
+// File: classIDistribution1D.xml
+%feature("docstring") IDistribution1D "
+
+Interface for 1 dimensional distributions.
+
+C++ includes: Distributions.h
+";
+
+%feature("docstring")  IDistribution1D::IDistribution1D "IDistribution1D::IDistribution1D()
+";
+
+%feature("docstring")  IDistribution1D::~IDistribution1D "virtual IDistribution1D::~IDistribution1D()
+";
+
+%feature("docstring")  IDistribution1D::clone "IDistribution1D * IDistribution1D::clone() const 
+";
+
+%feature("docstring")  IDistribution1D::probabilityDensity "virtual double IDistribution1D::probabilityDensity(double x) const =0
+
+get the probability density for value x 
+";
+
+%feature("docstring")  IDistribution1D::getMean "virtual double IDistribution1D::getMean() const =0
+
+get the mean of the distribution 
+";
+
+%feature("docstring")  IDistribution1D::generateSamples "std::vector< ParameterSample > IDistribution1D::generateSamples(size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits()) const
+
+generate list of sampled values with their weight xmin, xmax for sample generations are deduced from sigma_factor and possible limits 
+";
+
+%feature("docstring")  IDistribution1D::generateSamples "std::vector< ParameterSample > IDistribution1D::generateSamples(size_t nbr_samples, double xmin, double xmax) const
+
+generate list of sampled values with their weight within given xmin, xmax 
+";
+
+%feature("docstring")  IDistribution1D::generateValueList "virtual std::vector<double> IDistribution1D::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const =0
+
+generate list of sample values
+
+Parameters:
+-----------
+
+nbr_samples: 
+number of values to generate
+
+sigma_factor: 
+parameter to derive min,max range for sample values
+
+limits:
+
+vector of generated values 
+";
+
+%feature("docstring")  IDistribution1D::generateValues "std::vector< double > IDistribution1D::generateValues(size_t nbr_samples, double xmin, double xmax) const
+
+Interface.
+
+generate list of sample values
+
+Parameters:
+-----------
+
+nbr_samples: 
+number of values to generate
+
+xmin: 
+xmax: 
+start and end value of the generated samples
+
+vector of generated values 
+";
+
+%feature("docstring")  IDistribution1D::getMeanSample "ParameterSample IDistribution1D::getMeanSample() const
+
+generate a single sample containing the mean value and weight 1 
+";
+
+%feature("docstring")  IDistribution1D::isDelta "virtual bool IDistribution1D::isDelta() const =0
+
+signals that the distribution is in the limit case of a delta distribution 
+";
+
+
+// File: classIFactory.xml
+%feature("docstring") IFactory "
+
+Base class for all factories.
+
+C++ includes: IFactory.h
+";
+
+%feature("docstring")  IFactory::IFactory "IFactory< Key, AbstractProduct >::IFactory()
+";
+
+%feature("docstring")  IFactory::createItem "AbstractProduct* IFactory< Key, AbstractProduct >::createItem(const Key &item_key)
+
+Creates object by calling creation function corresponded to given identifier. 
+";
+
+%feature("docstring")  IFactory::registerItem "bool IFactory< Key, AbstractProduct >::registerItem(const Key &item_key, CreateItemCallback CreateFn, const std::string &itemDescription=\"\")
+
+Registers object's creation function and store object description. 
+";
+
+%feature("docstring")  IFactory::~IFactory "IFactory< Key, AbstractProduct >::~IFactory()
+";
+
+%feature("docstring")  IFactory::getNumberOfRegistered "size_t IFactory< Key, AbstractProduct >::getNumberOfRegistered() const
+
+Returns number of registered objects. 
+";
+
+%feature("docstring")  IFactory::begin "const_iterator IFactory< Key, AbstractProduct >::begin() const 
+";
+
+%feature("docstring")  IFactory::end "const_iterator IFactory< Key, AbstractProduct >::end() const 
+";
+
+
+// File: classIFitObserver.xml
+%feature("docstring") IFitObserver "
+
+Base class for all fit observers. Calls update method in following cases: first iteration, every n-th iteration, last iteration and when fit strategy has changed.
+
+C++ includes: IFitObserver.h
+";
+
+%feature("docstring")  IFitObserver::IFitObserver "IFitObserver::IFitObserver(int update_every_nth)
+";
+
+%feature("docstring")  IFitObserver::notify "void IFitObserver::notify(IObservable *subject)
+
+The method used by Ovservable when he wants to be observed by this. 
+";
+
+%feature("docstring")  IFitObserver::update "void IFitObserver::update(FitSuite *fit_suite)
+
+Here Onserver will do actuall job when he thinks that it is a right moment. 
+";
+
+
+// File: classIFitStrategy.xml
+%feature("docstring") IFitStrategy "
+
+Interface to concrete fit strategy.
+
+Concrete implementation should manipulate with fit parameters/data and then call minimizer.
+
+C++ includes: IFitStrategy.h
+";
+
+%feature("docstring")  IFitStrategy::IFitStrategy "IFitStrategy::IFitStrategy(const std::string &name)
+";
+
+%feature("docstring")  IFitStrategy::~IFitStrategy "virtual IFitStrategy::~IFitStrategy()
+";
+
+%feature("docstring")  IFitStrategy::clone "virtual IFitStrategy* IFitStrategy::clone() const =0
+";
+
+%feature("docstring")  IFitStrategy::init "void IFitStrategy::init(FitSuiteImpl *fit_suite)
+";
+
+%feature("docstring")  IFitStrategy::execute "virtual void IFitStrategy::execute()=0
+";
+
+
+// File: classIFitSuiteFunction.xml
+%feature("docstring") IFitSuiteFunction "
+
+Fitting functions interface to be used by Minimizer.
+
+C++ includes: FitSuiteFunctions.h
+";
+
+%feature("docstring")  IFitSuiteFunction::IFitSuiteFunction "IFitSuiteFunction::IFitSuiteFunction()
+";
+
+%feature("docstring")  IFitSuiteFunction::~IFitSuiteFunction "virtual IFitSuiteFunction::~IFitSuiteFunction()
+";
+
+%feature("docstring")  IFitSuiteFunction::init "virtual void IFitSuiteFunction::init(FitSuiteImpl *fit_suite)
+";
+
+%feature("docstring")  IFitSuiteFunction::getNCalls "virtual size_t IFitSuiteFunction::getNCalls() const 
+";
+
+
+// File: classIFormFactor.xml
+%feature("docstring") IFormFactor "
+
+Pure virtual base class for all form factors.
+
+The actual form factor is returned by the complex valued function  IFormFactor::evaluate, which depends on the incoming and outgoing wave vectors ki and kf. If it only depends on the scattering vector q=ki-kf, then it is a IBornFormFactor.
+
+Other children besides IBornFormFactor are  IFormFactorDecorator,  FormFactorWeighted,  FormFactorDWBA,  FormFactorDWBAPol and  FormFactorCrystal.
+
+C++ includes: IFormFactor.h
+";
+
+%feature("docstring")  IFormFactor::IFormFactor "IFormFactor::IFormFactor()
+";
+
+%feature("docstring")  IFormFactor::~IFormFactor "IFormFactor::~IFormFactor() override
+";
+
+%feature("docstring")  IFormFactor::clone "IFormFactor* IFormFactor::clone() const override=0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IFormFactor::accept "void IFormFactor::accept(ISampleVisitor *visitor) const override=0
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  IFormFactor::setAmbientMaterial "virtual void IFormFactor::setAmbientMaterial(const IMaterial &)
+
+Passes the refractive index of the ambient material in which this particle is embedded. 
+";
+
+%feature("docstring")  IFormFactor::evaluate "virtual complex_t IFormFactor::evaluate(const WavevectorInfo &wavevectors) const =0
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  IFormFactor::evaluatePol "Eigen::Matrix2cd IFormFactor::evaluatePol(const WavevectorInfo &wavevectors) const
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+%feature("docstring")  IFormFactor::getVolume "double IFormFactor::getVolume() const
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  IFormFactor::getRadialExtension "virtual double IFormFactor::getRadialExtension() const =0
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+%feature("docstring")  IFormFactor::setSpecularInfo "virtual void IFormFactor::setSpecularInfo(const ILayerRTCoefficients *, const ILayerRTCoefficients *)
+
+Sets reflection/transmission info. 
+";
+
+
+// File: classIFormFactorBorn.xml
+%feature("docstring") IFormFactorBorn "
+
+Pure virtual base class for Born form factors.
+
+In contrast to the generic  IFormFactor, a Born form factor does not depend on the incoming and outgoing wave vectors ki and kf, except through their difference, the scattering vector q=ki-kf.
+
+C++ includes: IFormFactorBorn.h
+";
+
+%feature("docstring")  IFormFactorBorn::IFormFactorBorn "IFormFactorBorn::IFormFactorBorn()
+";
+
+%feature("docstring")  IFormFactorBorn::~IFormFactorBorn "IFormFactorBorn::~IFormFactorBorn() override
+";
+
+%feature("docstring")  IFormFactorBorn::clone "IFormFactorBorn* IFormFactorBorn::clone() const override=0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IFormFactorBorn::evaluate "complex_t IFormFactorBorn::evaluate(const WavevectorInfo &wavevectors) const override
+
+Returns scattering amplitude for complex wavevectors ki, kf. 
+";
+
+%feature("docstring")  IFormFactorBorn::evaluatePol "Eigen::Matrix2cd IFormFactorBorn::evaluatePol(const WavevectorInfo &wavevectors) const override
+
+Returns scattering amplitude for matrix interactions. 
+";
+
+%feature("docstring")  IFormFactorBorn::evaluate_for_q "virtual complex_t IFormFactorBorn::evaluate_for_q(const cvector_t q) const =0
+
+Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+";
+
+
+// File: classIFormFactorDecorator.xml
+%feature("docstring") IFormFactorDecorator "
+
+Encapsulates another formfactor and adds extra functionality (a scalar factor, a Debye-Waller factor, a position-dependent phase factor, ...).
+
+This class is designed according to the Decorator Pattern. It inherits from  IFormFactor and has a member of type IFormFactor*.
+
+C++ includes: IFormFactorDecorator.h
+";
+
+%feature("docstring")  IFormFactorDecorator::IFormFactorDecorator "IFormFactorDecorator::IFormFactorDecorator(const IFormFactor &form_factor)
+";
+
+%feature("docstring")  IFormFactorDecorator::~IFormFactorDecorator "IFormFactorDecorator::~IFormFactorDecorator() override
+";
+
+%feature("docstring")  IFormFactorDecorator::clone "IFormFactorDecorator* IFormFactorDecorator::clone() const override=0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IFormFactorDecorator::accept "void IFormFactorDecorator::accept(ISampleVisitor *visitor) const override=0
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  IFormFactorDecorator::setAmbientMaterial "void IFormFactorDecorator::setAmbientMaterial(const IMaterial &material) override
+
+Passes the refractive index of the ambient material in which this particle is embedded. 
+";
+
+%feature("docstring")  IFormFactorDecorator::getVolume "double IFormFactorDecorator::getVolume() const override
+
+Returns the total volume of the particle of this form factor's shape. 
+";
+
+%feature("docstring")  IFormFactorDecorator::getRadialExtension "double IFormFactorDecorator::getRadialExtension() const override
+
+Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+";
+
+
+// File: classIFTDecayFunction1D.xml
+%feature("docstring") IFTDecayFunction1D "
+
+Interface for a one-dimensional decay function, with evaluate(q) returning the Fourier transform, normalized to  $\\\\int dq\\\\; {\\\\rm evaluate}(q) = 1$.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  IFTDecayFunction1D::IFTDecayFunction1D "IFTDecayFunction1D::IFTDecayFunction1D(double omega)
+";
+
+%feature("docstring")  IFTDecayFunction1D::clone "virtual IFTDecayFunction1D* IFTDecayFunction1D::clone() const =0
+";
+
+%feature("docstring")  IFTDecayFunction1D::evaluate "virtual double IFTDecayFunction1D::evaluate(double q) const =0
+";
+
+%feature("docstring")  IFTDecayFunction1D::setOmega "void IFTDecayFunction1D::setOmega(double omega)
+";
+
+%feature("docstring")  IFTDecayFunction1D::getOmega "double IFTDecayFunction1D::getOmega() const 
+";
+
+
+// File: classIFTDecayFunction2D.xml
+%feature("docstring") IFTDecayFunction2D "
+
+Interface for two-dimensional decay function in reciprocal space.
+
+C++ includes: FTDecayFunctions.h
+";
+
+%feature("docstring")  IFTDecayFunction2D::IFTDecayFunction2D "IFTDecayFunction2D::IFTDecayFunction2D(double decay_length_x, double decay_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  IFTDecayFunction2D::clone "virtual IFTDecayFunction2D* IFTDecayFunction2D::clone() const =0
+";
+
+%feature("docstring")  IFTDecayFunction2D::setGamma "void IFTDecayFunction2D::setGamma(double gamma)
+
+set angle between first lattice vector and X-axis of distribution (both in direct space) 
+";
+
+%feature("docstring")  IFTDecayFunction2D::getGamma "double IFTDecayFunction2D::getGamma() const
+
+get angle between first lattice vector and X-axis of distribution (both in direct space) 
+";
+
+%feature("docstring")  IFTDecayFunction2D::getDelta "double IFTDecayFunction2D::getDelta() const
+
+get angle between X- and Y-axis of distribution (in direct space) 
+";
+
+%feature("docstring")  IFTDecayFunction2D::getDecayLengthX "double IFTDecayFunction2D::getDecayLengthX() const
+
+get coherence length in X-direction 
+";
+
+%feature("docstring")  IFTDecayFunction2D::getDecayLengthY "double IFTDecayFunction2D::getDecayLengthY() const
+
+get coherence length in Y-direction 
+";
+
+%feature("docstring")  IFTDecayFunction2D::evaluate "virtual double IFTDecayFunction2D::evaluate(double qx, double qy) const =0
+
+evaluate Fourier transformed decay function for q in X,Y coordinates 
+";
+
+%feature("docstring")  IFTDecayFunction2D::transformToStarBasis "void IFTDecayFunction2D::transformToStarBasis(double qX, double qY, double alpha, double a, double b, double &qa, double &qb) const
+
+transform back to a*, b* basis: 
+";
+
+
+// File: classIFTDistribution1D.xml
+%feature("docstring") IFTDistribution1D "
+
+Interface for a one-dimensional distribution, with normalization adjusted so that the Fourier transform evaluate(q) is a decay function that starts at evaluate(0)=1.
+
+C++ includes: FTDistributions1D.h
+";
+
+%feature("docstring")  IFTDistribution1D::IFTDistribution1D "IFTDistribution1D::IFTDistribution1D(double omega)
+";
+
+%feature("docstring")  IFTDistribution1D::clone "virtual IFTDistribution1D* IFTDistribution1D::clone() const =0
+";
+
+%feature("docstring")  IFTDistribution1D::evaluate "virtual double IFTDistribution1D::evaluate(double q) const =0
+
+Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+";
+
+%feature("docstring")  IFTDistribution1D::setOmega "void IFTDistribution1D::setOmega(double omega)
+";
+
+%feature("docstring")  IFTDistribution1D::getOmega "double IFTDistribution1D::getOmega() const 
+";
+
+
+// File: classIFTDistribution2D.xml
+%feature("docstring") IFTDistribution2D "
+
+Interface for two-dimensional distributions in Fourier space.
+
+C++ includes: FTDistributions2D.h
+";
+
+%feature("docstring")  IFTDistribution2D::IFTDistribution2D "IFTDistribution2D::IFTDistribution2D(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+";
+
+%feature("docstring")  IFTDistribution2D::clone "virtual IFTDistribution2D* IFTDistribution2D::clone() const =0
+";
+
+%feature("docstring")  IFTDistribution2D::setGamma "void IFTDistribution2D::setGamma(double gamma)
+";
+
+%feature("docstring")  IFTDistribution2D::getGamma "double IFTDistribution2D::getGamma() const 
+";
+
+%feature("docstring")  IFTDistribution2D::getDelta "double IFTDistribution2D::getDelta() const 
+";
+
+%feature("docstring")  IFTDistribution2D::getCoherenceLengthX "double IFTDistribution2D::getCoherenceLengthX() const 
+";
+
+%feature("docstring")  IFTDistribution2D::getCoherenceLengthY "double IFTDistribution2D::getCoherenceLengthY() const 
+";
+
+%feature("docstring")  IFTDistribution2D::evaluate "virtual double IFTDistribution2D::evaluate(double qx, double qy) const =0
+
+evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+";
+
+
+// File: classIHistogram.xml
+%feature("docstring") IHistogram "
+
+Base class for 1D and 2D histograms holding values of double type.
+
+C++ includes: IHistogram.h
+";
+
+%feature("docstring")  IHistogram::IHistogram "IHistogram::IHistogram()
+";
+
+%feature("docstring")  IHistogram::IHistogram "IHistogram::IHistogram(const IHistogram &other)
+";
+
+%feature("docstring")  IHistogram::~IHistogram "virtual IHistogram::~IHistogram()
+";
+
+%feature("docstring")  IHistogram::IHistogram "IHistogram::IHistogram(const IAxis &axis_x)
+";
+
+%feature("docstring")  IHistogram::IHistogram "IHistogram::IHistogram(const IAxis &axis_x, const IAxis &axis_y)
+";
+
+%feature("docstring")  IHistogram::clone "virtual IHistogram* IHistogram::clone() const =0
+";
+
+%feature("docstring")  IHistogram::getRank "virtual size_t IHistogram::getRank() const =0
+
+Returns number of histogram dimensions. 
+";
+
+%feature("docstring")  IHistogram::getTotalNumberOfBins "size_t IHistogram::getTotalNumberOfBins() const
+
+Returns total number of histogram bins. For 2D histograms the result will be the product of bin numbers along X and Y axes. 
+";
+
+%feature("docstring")  IHistogram::getXaxis "const IAxis & IHistogram::getXaxis() const
+
+returns x-axis 
+";
+
+%feature("docstring")  IHistogram::getYaxis "const IAxis & IHistogram::getYaxis() const
+
+returns y-axis for 2D histograms 
+";
+
+%feature("docstring")  IHistogram::getXmin "double IHistogram::getXmin() const
+
+Returns x-axis min (lower edge of first bin). 
+";
+
+%feature("docstring")  IHistogram::getXmax "double IHistogram::getXmax() const
+
+Returns x-axis max (upper edge of last bin). 
+";
+
+%feature("docstring")  IHistogram::getNbinsX "size_t IHistogram::getNbinsX() const
+
+Returns number of bins on x-axis. 
+";
+
+%feature("docstring")  IHistogram::getYmin "double IHistogram::getYmin() const
+
+Returns y-axis min (lower edge of first bin) for 2D histograms. 
+";
+
+%feature("docstring")  IHistogram::getYmax "double IHistogram::getYmax() const
+
+Returns y-axis max (upper edge of last bin) for 2D histograms. 
+";
+
+%feature("docstring")  IHistogram::getNbinsY "size_t IHistogram::getNbinsY() const
+
+Returns number of bins on y-axis. 
+";
+
+%feature("docstring")  IHistogram::getGlobalBin "size_t IHistogram::getGlobalBin(size_t binx, size_t biny=0) const
+
+Returns global bin index for given axes indices. For 1D histogram the global bin index coinside with x-axis index.
+
+Parameters:
+-----------
+
+binx: 
+x-axis bin index
+
+biny: 
+y-axis bin index (for 2D histograms)
+
+The global bin index 
+";
+
+%feature("docstring")  IHistogram::findGlobalBin "size_t IHistogram::findGlobalBin(double x, double y) const
+
+Returns closest global bin index for given axes coordinates. For 1D.
+
+Parameters:
+-----------
+
+x: 
+Value on x-axis
+
+y: 
+Value on y-axis (for 2D histograms)
+
+Closest global bin index 
+";
+
+%feature("docstring")  IHistogram::getXaxisIndex "int IHistogram::getXaxisIndex(size_t i) const
+
+Returns x-axis bin index for given globalbin. For 1D histograms returned value conicide with globalbin value. 
+";
+
+%feature("docstring")  IHistogram::getYaxisIndex "int IHistogram::getYaxisIndex(size_t i) const
+
+Returns y-axis bin index for given globalbin (for 2D histograms). 
+";
+
+%feature("docstring")  IHistogram::getXaxisValue "double IHistogram::getXaxisValue(size_t i)
+
+Returns the value on x-axis corresponding to the global bin index.
+
+Parameters:
+-----------
+
+globalbin: 
+The global bin index
+
+The center of corresponding bin of the axis 
+";
+
+%feature("docstring")  IHistogram::getYaxisValue "double IHistogram::getYaxisValue(size_t i)
+
+Returns the value on y-axis corresponding to the 2D histogram global bin index.
+
+Parameters:
+-----------
+
+globalbin: 
+The global bin index
+
+The center of corresponding bin of the axis 
+";
+
+%feature("docstring")  IHistogram::getBinContent "double IHistogram::getBinContent(size_t i) const
+
+Returns content (accumulated value) of the bin with given index.
+
+Parameters:
+-----------
+
+globalbin: 
+The global bin index
+
+The value accumulated by the bin (integral) 
+";
+
+%feature("docstring")  IHistogram::getData "const OutputData<CumulativeValue>& IHistogram::getData() const 
+";
+
+%feature("docstring")  IHistogram::getData "OutputData<CumulativeValue>& IHistogram::getData()
+";
+
+%feature("docstring")  IHistogram::getBinContent "double IHistogram::getBinContent(size_t binx, size_t biny) const
+
+Returns content (accumulated value) of the 2D histogram bin with given indices.
+
+Parameters:
+-----------
+
+binx: 
+x-axis bin index
+
+biny: 
+y-axis bin index
+
+The value accumulated by the bin (integral) 
+";
+
+%feature("docstring")  IHistogram::setBinContent "void IHistogram::setBinContent(size_t i, double value)
+
+Sets content of the bin corresponding to the globalbin number. 
+";
+
+%feature("docstring")  IHistogram::addBinContent "void IHistogram::addBinContent(size_t i, double value)
+
+Add the value to the bin. 
+";
+
+%feature("docstring")  IHistogram::getBinError "double IHistogram::getBinError(size_t i) const
+
+Returns error of the bin with given index. 
+";
+
+%feature("docstring")  IHistogram::getBinError "double IHistogram::getBinError(size_t binx, size_t biny) const
+
+Returns error of the bin with given indices (for 2D histograms). 
+";
+
+%feature("docstring")  IHistogram::getBinAverage "double IHistogram::getBinAverage(size_t i) const
+
+Returns average value in the bin with given index. 
+";
+
+%feature("docstring")  IHistogram::getBinAverage "double IHistogram::getBinAverage(size_t binx, size_t biny) const
+
+Returns average value of the bin with given indices (for 2D histograms). 
+";
+
+%feature("docstring")  IHistogram::getBinNumberOfEntries "int IHistogram::getBinNumberOfEntries(size_t i) const
+
+Returns number of entries in the bin with given index. 
+";
+
+%feature("docstring")  IHistogram::getBinNumberOfEntries "int IHistogram::getBinNumberOfEntries(size_t binx, size_t biny) const
+
+Returns number of entries in the bin with given indices (for 2D histograms). 
+";
+
+%feature("docstring")  IHistogram::getMaximum "double IHistogram::getMaximum() const
+
+Returns histogram maximum value (maximum of  getBinContent() over all bins) 
+";
+
+%feature("docstring")  IHistogram::getMaximumBinIndex "size_t IHistogram::getMaximumBinIndex() const
+
+Returns globalbin index with maximum content. 
+";
+
+%feature("docstring")  IHistogram::getMinimum "double IHistogram::getMinimum() const
+
+Returns histogram minimum value (minimum of  getBinContent() over all bins) 
+";
+
+%feature("docstring")  IHistogram::getMinimumBinIndex "size_t IHistogram::getMinimumBinIndex() const
+
+Returns globalbin index with minimum content. 
+";
+
+%feature("docstring")  IHistogram::scale "void IHistogram::scale(double value)
+
+Multiply this histogram (every bin content value) by a constant. 
+";
+
+%feature("docstring")  IHistogram::integral "double IHistogram::integral() const
+
+Returns integral of bins content (computed as a sum of all bin content). 
+";
+
+%feature("docstring")  IHistogram::reset "void IHistogram::reset()
+
+Reset histogram content (axes remains) 
+";
+
+%feature("docstring")  IHistogram::createOutputData "OutputData< double > * IHistogram::createOutputData(DataType dataType=DataType::INTEGRAL) const
+
+creates new  OutputData with histogram's shape and values corresponding to DataType
+
+creates new  OutputData with histogram's shape and put there values corresponding to DataType 
+";
+
+%feature("docstring")  IHistogram::hasSameShape "bool IHistogram::hasSameShape(const IHistogram &other) const
+
+Returns true if objects a) have same dimensions b) bin boundaries of axes coincide. 
+";
+
+%feature("docstring")  IHistogram::hasSameDimensions "bool IHistogram::hasSameDimensions(const IHistogram &other) const
+
+Returns true if object have same rank and number of axes bins. 
+";
+
+%feature("docstring")  IHistogram::relativeDifferenceHistogram "IHistogram * IHistogram::relativeDifferenceHistogram(const IHistogram &rhs)
+
+returns histogram representing relative difference of two histograms. 
+";
+
+%feature("docstring")  IHistogram::save "void IHistogram::save(const std::string &filename)
+
+Saves histogram in file Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz) 
+";
+
+%feature("docstring")  IHistogram::load "void IHistogram::load(const std::string &filename)
+
+Loads histogram from file, the shape of array in file should match Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz) Only bin content will be loaded, histogram axes remain the same. 
+";
+
+
+// File: classIIntensityFunction.xml
+%feature("docstring") IIntensityFunction "
+
+Interface for applying arbitrary function to the measured intensity.
+
+C++ includes: IIntensityFunction.h
+";
+
+%feature("docstring")  IIntensityFunction::~IIntensityFunction "virtual IIntensityFunction::~IIntensityFunction()
+";
+
+%feature("docstring")  IIntensityFunction::clone "virtual IIntensityFunction* IIntensityFunction::clone() const =0
+";
+
+%feature("docstring")  IIntensityFunction::evaluate "virtual double IIntensityFunction::evaluate(double value) const =0
+";
+
+
+// File: classIIntensityNormalizer.xml
+%feature("docstring") IIntensityNormalizer "
+
+Interface to  OutputData normalizers.
+
+C++ includes: IIntensityNormalizer.h
+";
+
+%feature("docstring")  IIntensityNormalizer::~IIntensityNormalizer "virtual IIntensityNormalizer::~IIntensityNormalizer()
+";
+
+%feature("docstring")  IIntensityNormalizer::clone "virtual IIntensityNormalizer* IIntensityNormalizer::clone() const =0
+";
+
+%feature("docstring")  IIntensityNormalizer::createNormalizedData "virtual OutputData<double>* IIntensityNormalizer::createNormalizedData(const OutputData< double > &data) const =0
+";
+
+%feature("docstring")  IIntensityNormalizer::apply "virtual void IIntensityNormalizer::apply(OutputData< double > &data) const =0
+";
+
+%feature("docstring")  IIntensityNormalizer::setMaximumIntensity "virtual void IIntensityNormalizer::setMaximumIntensity(double)=0
+";
+
+
+// File: classIInterferenceFunction.xml
+%feature("docstring") IInterferenceFunction "
+
+Pure virtual base class of interference functions.
+
+C++ includes: IInterferenceFunction.h
+";
+
+%feature("docstring")  IInterferenceFunction::~IInterferenceFunction "virtual IInterferenceFunction::~IInterferenceFunction()
+";
+
+%feature("docstring")  IInterferenceFunction::clone "virtual IInterferenceFunction* IInterferenceFunction::clone() const =0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IInterferenceFunction::accept "virtual void IInterferenceFunction::accept(ISampleVisitor *visitor) const =0
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  IInterferenceFunction::evaluate "virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0
+
+Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+";
+
+%feature("docstring")  IInterferenceFunction::getKappa "virtual double IInterferenceFunction::getKappa() const
+
+Retrieves the size-distance coupling constant (default 0.0) 
+";
+
+%feature("docstring")  IInterferenceFunction::getParticleDensity "virtual double IInterferenceFunction::getParticleDensity() const
+
+If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value 
+";
+
+
+// File: classIInterferenceFunctionStrategy.xml
+%feature("docstring") IInterferenceFunctionStrategy "
+
+Pure virtual base class of all interference function strategy classes. Provides an 'evaluate' function that computes the total scattering intensity from a decorated layer, taking into account a specific inter-particle interference function. This function uses low-level functions precomputeParticleFormfactors, evaluateForList that are implemented differently in different inheriting classes. Multiple inheritance is used to support scalar and polarized scattering (through  IInterferenceFunc [...]
+
+Instantiation of child classes takes place in  LayerStrategyBuilder::createStrategy, which is called from  DecoratedLayerComputation::eval.
+
+C++ includes: IInterferenceFunctionStrategy.h
+";
+
+%feature("docstring")  IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy()
+";
+
+%feature("docstring")  IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const SimulationOptions &sim_params)
+";
+
+%feature("docstring")  IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy()
+";
+
+%feature("docstring")  IInterferenceFunctionStrategy::init "void IInterferenceFunctionStrategy::init(const SafePointerVector< FormFactorWrapper > &weighted_formfactors, const IInterferenceFunction &iff, const LayerSpecularInfo &specular_info)
+
+Initializes the object with form factors and interference functions. 
+";
+
+%feature("docstring")  IInterferenceFunctionStrategy::evaluate "double IInterferenceFunctionStrategy::evaluate(const SimulationElement &sim_element) const
+
+Calculates the intensity for scalar particles/interactions. 
+";
+
+
+// File: classIInterferenceFunctionStrategy1.xml
+%feature("docstring") IInterferenceFunctionStrategy1 "
+
+Pure virtual base class of all scalar interference function strategy classes. Provides the precomputation of particle form factors.
+
+C++ includes: IInterferenceFunctionStrategy.h
+";
+
+
+// File: classIInterferenceFunctionStrategy2.xml
+%feature("docstring") IInterferenceFunctionStrategy2 "
+
+Pure virtual base class of all polarized interference function strategy classes. Provides the precomputation of particle form factors.
+
+C++ includes: IInterferenceFunctionStrategy.h
+";
+
+
+// File: classILayerRTCoefficients.xml
+%feature("docstring") ILayerRTCoefficients "
+
+Interface to access reflection/transmission coefficients.
+
+C++ includes: ILayerRTCoefficients.h
+";
+
+%feature("docstring")  ILayerRTCoefficients::~ILayerRTCoefficients "virtual ILayerRTCoefficients::~ILayerRTCoefficients()
+";
+
+%feature("docstring")  ILayerRTCoefficients::clone "virtual ILayerRTCoefficients* ILayerRTCoefficients::clone() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T1plus "virtual Eigen::Vector2cd ILayerRTCoefficients::T1plus() const =0
+
+The following functions return the transmitted and reflected amplitudes for different incoming beam polarizations and eigenmodes 
+";
+
+%feature("docstring")  ILayerRTCoefficients::R1plus "virtual Eigen::Vector2cd ILayerRTCoefficients::R1plus() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T2plus "virtual Eigen::Vector2cd ILayerRTCoefficients::T2plus() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::R2plus "virtual Eigen::Vector2cd ILayerRTCoefficients::R2plus() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T1min "virtual Eigen::Vector2cd ILayerRTCoefficients::T1min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::R1min "virtual Eigen::Vector2cd ILayerRTCoefficients::R1min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::T2min "virtual Eigen::Vector2cd ILayerRTCoefficients::T2min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::R2min "virtual Eigen::Vector2cd ILayerRTCoefficients::R2min() const =0
+";
+
+%feature("docstring")  ILayerRTCoefficients::getKz "virtual Eigen::Vector2cd ILayerRTCoefficients::getKz() const =0
+
+Returns z-part of the two wavevector eigenmodes. 
+";
+
+%feature("docstring")  ILayerRTCoefficients::getScalarT "virtual complex_t ILayerRTCoefficients::getScalarT() const
+
+Scalar value getters; these throw errors by default as they should only be used when the derived object is really scalar 
+";
+
+%feature("docstring")  ILayerRTCoefficients::getScalarR "virtual complex_t ILayerRTCoefficients::getScalarR() const 
+";
+
+%feature("docstring")  ILayerRTCoefficients::getScalarKz "virtual complex_t ILayerRTCoefficients::getScalarKz() const 
+";
+
+
+// File: classILayout.xml
+%feature("docstring") ILayout "
+
+Interface to equip a sample component with various properties.
+
+C++ includes: ILayout.h
+";
+
+%feature("docstring")  ILayout::ILayout "ILayout::ILayout()
+";
+
+%feature("docstring")  ILayout::~ILayout "virtual ILayout::~ILayout()
+";
+
+%feature("docstring")  ILayout::clone "virtual ILayout* ILayout::clone() const =0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  ILayout::accept "virtual void ILayout::accept(ISampleVisitor *visitor) const =0
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  ILayout::cloneInvertB "virtual ILayout* ILayout::cloneInvertB() const =0
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  ILayout::getNumberOfParticles "virtual size_t ILayout::getNumberOfParticles() const =0
+
+Returns number of particles. 
+";
+
+%feature("docstring")  ILayout::getParticle "virtual const IAbstractParticle* ILayout::getParticle(size_t index) const =0
+
+Returns information about particle with index. 
+";
+
+%feature("docstring")  ILayout::getParticles "virtual SafePointerVector<const IParticle> ILayout::getParticles() const =0
+
+Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection 
+";
+
+%feature("docstring")  ILayout::getAbundanceOfParticle "virtual double ILayout::getAbundanceOfParticle(size_t index) const =0
+
+Get abundance fraction of particle with index. 
+";
+
+%feature("docstring")  ILayout::getTotalAbundance "double ILayout::getTotalAbundance() const
+
+Get total abundance of all particles. 
+";
+
+%feature("docstring")  ILayout::getInterferenceFunction "virtual const IInterferenceFunction* ILayout::getInterferenceFunction() const =0
+
+Returns interference function. 
+";
+
+%feature("docstring")  ILayout::cloneInterferenceFunction "virtual IInterferenceFunction* ILayout::cloneInterferenceFunction() const =0
+";
+
+%feature("docstring")  ILayout::getTotalParticleSurfaceDensity "virtual double ILayout::getTotalParticleSurfaceDensity() const =0
+
+Returns surface density of all particles. 
+";
+
+%feature("docstring")  ILayout::setTotalParticleSurfaceDensity "virtual void ILayout::setTotalParticleSurfaceDensity(double particle_density)=0
+
+Sets surface density of all particles. 
+";
+
+%feature("docstring")  ILayout::getApproximation "EInterferenceApproximation ILayout::getApproximation() const
+
+Gets the used approximation for particles and interference functions. 
+";
+
+%feature("docstring")  ILayout::setApproximation "void ILayout::setApproximation(EInterferenceApproximation approximation)
+
+Sets the used approximation for particles and interference functions. 
+";
+
+
+// File: classIMaterial.xml
+%feature("docstring") IMaterial "
+
+Interface to a named material.
+
+C++ includes: IMaterial.h
+";
+
+%feature("docstring")  IMaterial::IMaterial "IMaterial::IMaterial(const std::string &name)
+";
+
+%feature("docstring")  IMaterial::~IMaterial "virtual IMaterial::~IMaterial()
+";
+
+%feature("docstring")  IMaterial::clone "IMaterial * IMaterial::clone() const 
+";
+
+%feature("docstring")  IMaterial::isScalarMaterial "virtual bool IMaterial::isScalarMaterial() const
+
+Indicates whether the interaction with the material is scalar. This means that different polarization states will be diffracted equally 
+";
+
+%feature("docstring")  IMaterial::isMagneticMaterial "bool IMaterial::isMagneticMaterial() const 
+";
+
+%feature("docstring")  IMaterial::getRefractiveIndex "virtual complex_t IMaterial::getRefractiveIndex() const 
+";
+
+%feature("docstring")  IMaterial::getSpecularScatteringMatrix "Eigen::Matrix2cd IMaterial::getSpecularScatteringMatrix(const kvector_t k) const
+
+Get the effective scattering matrix from the refractive index and a given wavevector used for the specular calculation. This matrix appears in the one-dimensional Schroedinger equation in the z-direction 
+";
+
+%feature("docstring")  IMaterial::getScatteringMatrix "Eigen::Matrix2cd IMaterial::getScatteringMatrix(double k_mag2) const
+
+Get the scattering matrix (~potential V) from the material. This matrix appears in the full three-dimensional Schroedinger equation. 
+";
+
+%feature("docstring")  IMaterial::createTransformedMaterial "virtual const IMaterial* IMaterial::createTransformedMaterial(const Transform3D &transform) const =0
+
+Create a new material that is transformed with respect to this one. 
+";
+
+
+// File: classIMultiLayerBuilder.xml
+%feature("docstring") IMultiLayerBuilder "
+
+Interface to the class capable to build samples to simulate.
+
+C++ includes: IMultiLayerBuilder.h
+";
+
+%feature("docstring")  IMultiLayerBuilder::IMultiLayerBuilder "IMultiLayerBuilder::IMultiLayerBuilder()
+";
+
+%feature("docstring")  IMultiLayerBuilder::~IMultiLayerBuilder "virtual IMultiLayerBuilder::~IMultiLayerBuilder()
+";
+
+%feature("docstring")  IMultiLayerBuilder::buildSample "virtual MultiLayer* IMultiLayerBuilder::buildSample() const =0
+";
+
+%feature("docstring")  IMultiLayerBuilder::set_subtest "void IMultiLayerBuilder::set_subtest(const IParameterized *subtest_item)
+";
+
+%feature("docstring")  IMultiLayerBuilder::getFormFactor "const IFormFactor * IMultiLayerBuilder::getFormFactor() const 
+";
+
+%feature("docstring")  IMultiLayerBuilder::getFTDistribution2D "const IFTDistribution2D * IMultiLayerBuilder::getFTDistribution2D() const 
+";
+
+%feature("docstring")  IMultiLayerBuilder::isPythonBuilder "bool IMultiLayerBuilder::isPythonBuilder() const 
+";
+
+
+// File: classINamed.xml
+%feature("docstring") INamed "
+
+Interface for named objects.
+
+C++ includes: INamed.h
+";
+
+%feature("docstring")  INamed::INamed "INamed::INamed()
+";
+
+%feature("docstring")  INamed::INamed "INamed::INamed(const std::string &name)
+";
+
+%feature("docstring")  INamed::~INamed "virtual INamed::~INamed()
+";
+
+%feature("docstring")  INamed::getName "std::string INamed::getName() const 
+";
+
+
+// File: classGeometry_1_1InfinitePlane.xml
+%feature("docstring") Geometry::InfinitePlane "
+
+The infinite plane is used for masking everything once and forever.
+
+C++ includes: InfinitePlane.h
+";
+
+%feature("docstring")  Geometry::InfinitePlane::InfinitePlane "Geometry::InfinitePlane::InfinitePlane()
+";
+
+%feature("docstring")  Geometry::InfinitePlane::clone "InfinitePlane* Geometry::InfinitePlane::clone() const 
+";
+
+%feature("docstring")  Geometry::InfinitePlane::contains "bool Geometry::InfinitePlane::contains(double, double) const
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::InfinitePlane::contains "bool Geometry::InfinitePlane::contains(const Bin1D &, const Bin1D &) const
+
+Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+";
+
+
+// File: classInnerCounter.xml
+%feature("docstring") InnerCounter "
+
+Base class for threaded computation; keeps count of progress.
+
+C++ includes: InnerCounter.h
+";
+
+%feature("docstring")  InnerCounter::InnerCounter "InnerCounter::InnerCounter()
+";
+
+%feature("docstring")  InnerCounter::stepProgress "void InnerCounter::stepProgress(ProgressHandler *progress)
+
+Increments progress count; at regular intervals updates main progress handler. 
+";
+
+
+// File: classINoncopyable.xml
+%feature("docstring") INoncopyable "
+
+Mix-in for objects that must not be copied.
+
+This virtual base class disables the copy constructor and the operator= in all its child classes.
+
+C++ includes: INoncopyable.h
+";
+
+%feature("docstring")  INoncopyable::INoncopyable "INoncopyable::INoncopyable()
+";
+
+%feature("docstring")  INoncopyable::~INoncopyable "virtual INoncopyable::~INoncopyable()
+";
+
+%feature("docstring")  INoncopyable::INoncopyable "INoncopyable::INoncopyable(const INoncopyable &)=delete
+";
+
+
+// File: classInstrument.xml
+%feature("docstring") Instrument "
+
+Assembles beam, detector and their relative positions wrt the sample.
+
+C++ includes: Instrument.h
+";
+
+%feature("docstring")  Instrument::Instrument "Instrument::Instrument()
+";
+
+%feature("docstring")  Instrument::Instrument "Instrument::Instrument(const Instrument &other)
+";
+
+%feature("docstring")  Instrument::~Instrument "Instrument::~Instrument()
+";
+
+%feature("docstring")  Instrument::getBeam "Beam& Instrument::getBeam()
+";
+
+%feature("docstring")  Instrument::getBeam "const Beam& Instrument::getBeam() const 
+";
+
+%feature("docstring")  Instrument::setBeam "void Instrument::setBeam(const Beam &beam)
+";
+
+%feature("docstring")  Instrument::setBeamParameters "void Instrument::setBeamParameters(double wavelength, double alpha_i, double phi_i)
+
+Sets the beam wavelength and incoming angles. 
+";
+
+%feature("docstring")  Instrument::setBeamIntensity "void Instrument::setBeamIntensity(double intensity)
+
+Sets the beam's intensity. 
+";
+
+%feature("docstring")  Instrument::setBeamPolarization "void Instrument::setBeamPolarization(const kvector_t bloch_vector)
+
+Sets the beam's polarization according to the given Bloch vector. 
+";
+
+%feature("docstring")  Instrument::getBeamIntensity "double Instrument::getBeamIntensity() const
+
+Returns the beam's intensity. 
+";
+
+%feature("docstring")  Instrument::getDetector "const IDetector2D * Instrument::getDetector() const
+
+Returns the detector data. 
+";
+
+%feature("docstring")  Instrument::getDetector "IDetector2D * Instrument::getDetector()
+";
+
+%feature("docstring")  Instrument::getDetectorMask "const DetectorMask * Instrument::getDetectorMask() const 
+";
+
+%feature("docstring")  Instrument::getDetectorAxis "const IAxis & Instrument::getDetectorAxis(size_t index) const
+
+Returns a detector axis. 
+";
+
+%feature("docstring")  Instrument::getDetectorDimension "size_t Instrument::getDetectorDimension() const
+
+Returns the detector's dimension. 
+";
+
+%feature("docstring")  Instrument::setDetector "void Instrument::setDetector(const IDetector2D &detector)
+
+Sets the detector (axes can be overwritten later) 
+";
+
+%feature("docstring")  Instrument::setDetectorParameters "void Instrument::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+Sets detector parameters using angle ranges. 
+";
+
+%feature("docstring")  Instrument::setDetectorAxes "void Instrument::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
+
+Sets detector parameters using axes. 
+";
+
+%feature("docstring")  Instrument::setDetectorResolutionFunction "void Instrument::setDetectorResolutionFunction(IResolutionFunction2D *p_resolution_function)
+
+Sets detector resolution function. 
+";
+
+%feature("docstring")  Instrument::setDetectorResolutionFunction "void Instrument::setDetectorResolutionFunction(const IResolutionFunction2D &p_resolution_function)
+";
+
+%feature("docstring")  Instrument::setAnalyzerProperties "void Instrument::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)
+
+Sets the polarization analyzer characteristics of the detector. 
+";
+
+%feature("docstring")  Instrument::applyDetectorResolution "void Instrument::applyDetectorResolution(OutputData< double > *p_intensity_map) const
+
+apply the detector resolution to the given intensity map 
+";
+
+%feature("docstring")  Instrument::createDetectorIntensity "OutputData< double > * Instrument::createDetectorIntensity(const std::vector< SimulationElement > &elements, IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const
+
+Returns new intensity map with detector resolution applied and axes in requested units. 
+";
+
+%feature("docstring")  Instrument::createDetectorMap "OutputData< double > * Instrument::createDetectorMap(IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const
+
+Returns empty detector map in given axes units. 
+";
+
+%feature("docstring")  Instrument::createSimulationElements "std::vector< SimulationElement > Instrument::createSimulationElements()
+
+Create a vector of  SimulationElement objects according to the beam, detector and its mask. 
+";
+
+%feature("docstring")  Instrument::addParametersToExternalPool "std::string Instrument::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+%feature("docstring")  Instrument::initDetector "void Instrument::initDetector()
+
+init detector with beam settings 
+";
+
+
+// File: classIntegratorComplex.xml
+%feature("docstring") IntegratorComplex "
+
+Template class to integrate complex class member functions.
+
+Wraps an two integrators from the GNU Scientific Library. Since this class holds a persistent workspace, we need at least one instance per thread. Standard usage for integration inside a class T:
+Create a handle to an integrator: 'auto integrator = make_integrator_complex(this, mem_function)'
+
+Call: 'integrator.integrate(lmin, lmax)'
+
+C++ includes: IntegratorComplex.h
+";
+
+%feature("docstring")  IntegratorComplex::IntegratorComplex "IntegratorComplex< T >::IntegratorComplex(const T *p_object, complex_integrand< T > p_member_function)
+
+to integrate p_member_function, which must belong to p_object 
+";
+
+%feature("docstring")  IntegratorComplex::~IntegratorComplex "IntegratorComplex< T >::~IntegratorComplex()
+";
+
+%feature("docstring")  IntegratorComplex::integrate "complex_t IntegratorComplex< T >::integrate(double lmin, double lmax)
+
+perform the actual integration over the range [lmin, lmax] 
+";
+
+
+// File: classIntegratorMCMiser.xml
+%feature("docstring") IntegratorMCMiser "";
+
+%feature("docstring")  IntegratorMCMiser::IntegratorMCMiser "IntegratorMCMiser< T >::IntegratorMCMiser(const T *p_object, miser_integrand< T > p_member_function, size_t dim)
+
+to integrate p_member_function, which must belong to p_object 
+";
+
+%feature("docstring")  IntegratorMCMiser::~IntegratorMCMiser "IntegratorMCMiser< T >::~IntegratorMCMiser()
+";
+
+%feature("docstring")  IntegratorMCMiser::integrate "double IntegratorMCMiser< T >::integrate(double *min_array, double *max_array, void *params, size_t nbr_points)
+
+perform the actual integration over the ranges [min_array, max_array] 
+";
+
+
+// File: classIntegratorReal.xml
+%feature("docstring") IntegratorReal "
+
+Template class to integrate class member functions.
+
+Wraps an integrator from the GNU Scientific Library. Since this class holds a persistent workspace, we need at least one instance per thread. Standard usage for integration inside a class T:
+Create a handle to an integrator: 'auto integrator = make_integrator_real(this, mem_function)'
+
+Call: 'integrator.integrate(lmin, lmax)'
+
+C++ includes: IntegratorReal.h
+";
+
+%feature("docstring")  IntegratorReal::IntegratorReal "IntegratorReal< T >::IntegratorReal(const T *p_object, real_integrand< T > p_member_function)
+
+to integrate p_member_function, which must belong to p_object 
+";
+
+%feature("docstring")  IntegratorReal::~IntegratorReal "IntegratorReal< T >::~IntegratorReal()
+";
+
+%feature("docstring")  IntegratorReal::integrate "double IntegratorReal< T >::integrate(double lmin, double lmax)
+
+perform the actual integration over the range [lmin, lmax] 
+";
+
+
+// File: classIntensityDataFunctions.xml
+%feature("docstring") IntensityDataFunctions "
+
+Class holding collection of static methods to work with intensity data.
+
+C++ includes: IntensityDataFunctions.h
+";
+
+
+// File: classIntensityDataIOFactory.xml
+%feature("docstring") IntensityDataIOFactory "
+
+Provides users with possibility to read and write IntensityData from/to files in different format. Type of the file will be deduced from file name. *.txt - ASCII file with 2D array [nrow][ncol], layout as in numpy. *.int - BornAgain internal ASCII format. *.tif - 32-bits tiff file. If file name ends woth \"*.gz\" or \"*.bz2\" the file will be zipped on the fly using appropriate algorithm.
+
+Usage:
+
+C++ includes: IntensityDataIOFactory.h
+";
+
+
+// File: classIntensityFunctionLog.xml
+%feature("docstring") IntensityFunctionLog "
+
+Algorithm for applying log function to the measured intensity.
+
+C++ includes: IIntensityFunction.h
+";
+
+%feature("docstring")  IntensityFunctionLog::~IntensityFunctionLog "virtual IntensityFunctionLog::~IntensityFunctionLog()
+";
+
+%feature("docstring")  IntensityFunctionLog::clone "virtual IntensityFunctionLog* IntensityFunctionLog::clone() const 
+";
+
+%feature("docstring")  IntensityFunctionLog::evaluate "double IntensityFunctionLog::evaluate(double value) const 
+";
+
+
+// File: classIntensityFunctionSqrt.xml
+%feature("docstring") IntensityFunctionSqrt "
+
+Algorithm for applying sqrt function to the measured intensity.
+
+C++ includes: IIntensityFunction.h
+";
+
+%feature("docstring")  IntensityFunctionSqrt::~IntensityFunctionSqrt "virtual IntensityFunctionSqrt::~IntensityFunctionSqrt()
+";
+
+%feature("docstring")  IntensityFunctionSqrt::clone "virtual IntensityFunctionSqrt* IntensityFunctionSqrt::clone() const 
+";
+
+%feature("docstring")  IntensityFunctionSqrt::evaluate "double IntensityFunctionSqrt::evaluate(double value) const 
+";
+
+
+// File: classIntensityNormalizer.xml
+%feature("docstring") IntensityNormalizer "
+
+Standard  OutputData normalizer, with configurable max_intensity.
+
+C++ includes: IIntensityNormalizer.h
+";
+
+%feature("docstring")  IntensityNormalizer::IntensityNormalizer "IntensityNormalizer::IntensityNormalizer(double scale=1.0, double shift=0.0)
+";
+
+%feature("docstring")  IntensityNormalizer::~IntensityNormalizer "virtual IntensityNormalizer::~IntensityNormalizer()
+";
+
+%feature("docstring")  IntensityNormalizer::clone "IntensityNormalizer * IntensityNormalizer::clone() const 
+";
+
+%feature("docstring")  IntensityNormalizer::createNormalizedData "OutputData< double > * IntensityNormalizer::createNormalizedData(const OutputData< double > &data) const 
+";
+
+%feature("docstring")  IntensityNormalizer::apply "void IntensityNormalizer::apply(OutputData< double > &data) const final
+";
+
+%feature("docstring")  IntensityNormalizer::setMaximumIntensity "virtual void IntensityNormalizer::setMaximumIntensity(double max_intensity)
+";
+
+
+// File: classIntensityScaleAndShiftNormalizer.xml
+%feature("docstring") IntensityScaleAndShiftNormalizer "
+
+Simplified  OutputData normalizer, with max_intensity=1.
+
+C++ includes: IIntensityNormalizer.h
+";
+
+%feature("docstring")  IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer "IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)
+";
+
+%feature("docstring")  IntensityScaleAndShiftNormalizer::~IntensityScaleAndShiftNormalizer "IntensityScaleAndShiftNormalizer::~IntensityScaleAndShiftNormalizer() final
+";
+
+%feature("docstring")  IntensityScaleAndShiftNormalizer::setMaximumIntensity "void IntensityScaleAndShiftNormalizer::setMaximumIntensity(double) final
+";
+
+%feature("docstring")  IntensityScaleAndShiftNormalizer::clone "IntensityScaleAndShiftNormalizer* IntensityScaleAndShiftNormalizer::clone() const final
+";
+
+
+// File: classInterferenceFunction1DLattice.xml
+%feature("docstring") InterferenceFunction1DLattice "
+
+Interference function of 1D lattice.
+
+C++ includes: InterferenceFunction1DLattice.h
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::InterferenceFunction1DLattice "InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, double xi)
+
+Parameters:
+-----------
+
+length: 
+ Lattice length
+
+xi: 
+rotation of lattice with respect to x-axis 
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::~InterferenceFunction1DLattice "InterferenceFunction1DLattice::~InterferenceFunction1DLattice() final
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::clone "InterferenceFunction1DLattice * InterferenceFunction1DLattice::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::accept "void InterferenceFunction1DLattice::accept(ISampleVisitor *visitor) const final
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::setDecayFunction "void InterferenceFunction1DLattice::setDecayFunction(const IFTDecayFunction1D &pdf)
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::getLatticeParameters "Lattice1DParameters InterferenceFunction1DLattice::getLatticeParameters() const 
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::getDecayFunction "const IFTDecayFunction1D* InterferenceFunction1DLattice::getDecayFunction() const 
+";
+
+%feature("docstring")  InterferenceFunction1DLattice::evaluate "double InterferenceFunction1DLattice::evaluate(const kvector_t q) const final
+
+Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+";
+
+
+// File: classInterferenceFunction2DLattice.xml
+%feature("docstring") InterferenceFunction2DLattice "
+
+Interference function of 2D lattice.
+
+C++ includes: InterferenceFunction2DLattice.h
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::InterferenceFunction2DLattice "InterferenceFunction2DLattice::InterferenceFunction2DLattice(double length_1, double length_2, double angle, double xi=0.0)
+
+Parameters:
+-----------
+
+length_1: 
+ Lattice length 1
+
+length_2: 
+ Lattice length 2
+
+angle: 
+angle between lattice vectors
+
+xi: 
+rotation of lattice with respect to x-axis 
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::~InterferenceFunction2DLattice "InterferenceFunction2DLattice::~InterferenceFunction2DLattice() final
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::clone "InterferenceFunction2DLattice * InterferenceFunction2DLattice::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::accept "void InterferenceFunction2DLattice::accept(ISampleVisitor *visitor) const final
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::setDecayFunction "void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D &pdf)
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::getDecayFunction "const IFTDecayFunction2D* InterferenceFunction2DLattice::getDecayFunction() const 
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::evaluate "double InterferenceFunction2DLattice::evaluate(const kvector_t q) const final
+
+Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::getLatticeParameters "Lattice2DParameters InterferenceFunction2DLattice::getLatticeParameters() const 
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::addParametersToExternalPool "std::string InterferenceFunction2DLattice::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const final
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+%feature("docstring")  InterferenceFunction2DLattice::getParticleDensity "double InterferenceFunction2DLattice::getParticleDensity() const final
+
+Returns the particle density associated with this 2d lattice. 
+";
+
+
+// File: classInterferenceFunction2DParaCrystal.xml
+%feature("docstring") InterferenceFunction2DParaCrystal "
+
+Interference function of 2D paracrystal.
+
+C++ includes: InterferenceFunction2DParaCrystal.h
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal "InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha_lattice, double xi=0.0, double damping_length=0.0)
+
+Parameters:
+-----------
+
+length_1: 
+Length of first lattice basis vector.
+
+length_2: 
+Length of second lattice basis vector.
+
+alpha_lattice: 
+Angle between the lattice basis vectors.
+
+xi: 
+Angle between first basis vector and the x-axis of incoming beam.
+
+damping_length: 
+Damping length for removing delta function singularity at q=0. 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal "InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal() final
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::clone "InterferenceFunction2DParaCrystal * InterferenceFunction2DParaCrystal::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::accept "void InterferenceFunction2DParaCrystal::accept(ISampleVisitor *visitor) const final
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::to_str "std::string InterferenceFunction2DParaCrystal::to_str(int indent=0) const final
+
+Returns textual representation of this and its descendants. 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::setDomainSizes "void InterferenceFunction2DParaCrystal::setDomainSizes(double size_1, double size_2)
+
+Sets the sizes of coherence domains.
+
+Parameters:
+-----------
+
+size_1: 
+size in first lattice direction
+
+size_2: 
+size in second lattice direction 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::setProbabilityDistributions "void InterferenceFunction2DParaCrystal::setProbabilityDistributions(const IFTDistribution2D &pdf_1, const IFTDistribution2D &pdf_2)
+
+Sets the probability distributions (Fourier transformed) for the two lattice directions.
+
+Parameters:
+-----------
+
+pdf_1: 
+probability distribution in first lattice direction
+
+pdf_2: 
+probability distribution in second lattice direction 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::evaluate "double InterferenceFunction2DParaCrystal::evaluate(const kvector_t q) const final
+
+Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::getDomainSizes "std::vector< double > InterferenceFunction2DParaCrystal::getDomainSizes() const 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::getProbabilityDistributions "std::vector< const IFTDistribution2D * > InterferenceFunction2DParaCrystal::getProbabilityDistributions() const 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::setIntegrationOverXi "void InterferenceFunction2DParaCrystal::setIntegrationOverXi(bool integrate_xi)
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::getIntegrationOverXi "bool InterferenceFunction2DParaCrystal::getIntegrationOverXi() const 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::getDampingLength "double InterferenceFunction2DParaCrystal::getDampingLength() const 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::getLatticeParameters "Lattice2DParameters InterferenceFunction2DParaCrystal::getLatticeParameters() const 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::addParametersToExternalPool "std::string InterferenceFunction2DParaCrystal::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const final
+
+Adds parameters from local pool to external pool and recursively calls its direct children.
+
+Copies local parameters to external_pool, under name \"path/<name>copy_number/\". 
+";
+
+%feature("docstring")  InterferenceFunction2DParaCrystal::getParticleDensity "double InterferenceFunction2DParaCrystal::getParticleDensity() const final
+
+If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value 
+";
+
+
+// File: classInterferenceFunctionNone.xml
+%feature("docstring") InterferenceFunctionNone "
+
+Default interference function (i.e. absence of any interference).
+
+C++ includes: InterferenceFunctionNone.h
+";
+
+%feature("docstring")  InterferenceFunctionNone::InterferenceFunctionNone "InterferenceFunctionNone::InterferenceFunctionNone()
+";
+
+%feature("docstring")  InterferenceFunctionNone::clone "InterferenceFunctionNone* InterferenceFunctionNone::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  InterferenceFunctionNone::accept "void InterferenceFunctionNone::accept(ISampleVisitor *visitor) const final
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  InterferenceFunctionNone::evaluate "double InterferenceFunctionNone::evaluate(const kvector_t) const final
+
+Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+";
+
+
+// File: classInterferenceFunctionRadialParaCrystal.xml
+%feature("docstring") InterferenceFunctionRadialParaCrystal "
+
+Interference function of radial paracrystal.
+
+C++ includes: InterferenceFunctionRadialParaCrystal.h
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal "InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(double peak_distance, double damping_length=0.0)
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::clone "InterferenceFunctionRadialParaCrystal * InterferenceFunctionRadialParaCrystal::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::accept "void InterferenceFunctionRadialParaCrystal::accept(ISampleVisitor *visitor) const final
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::to_str "std::string InterferenceFunctionRadialParaCrystal::to_str(int indent=0) const final
+
+Returns textual representation of this and its descendants. 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::setKappa "void InterferenceFunctionRadialParaCrystal::setKappa(double kappa)
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::getKappa "double InterferenceFunctionRadialParaCrystal::getKappa() const final
+
+Retrieves the size-distance coupling constant (default 0.0) 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::setDomainSize "void InterferenceFunctionRadialParaCrystal::setDomainSize(double size)
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::getDomainSize "double InterferenceFunctionRadialParaCrystal::getDomainSize() const 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::evaluate "double InterferenceFunctionRadialParaCrystal::evaluate(const kvector_t q) const final
+
+Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::FTPDF "complex_t InterferenceFunctionRadialParaCrystal::FTPDF(double qpar) const 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::setProbabilityDistribution "void InterferenceFunctionRadialParaCrystal::setProbabilityDistribution(const IFTDistribution1D &pdf)
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::getProbabilityDistribution "const IFTDistribution1D* InterferenceFunctionRadialParaCrystal::getProbabilityDistribution() const 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::getPeakDistance "double InterferenceFunctionRadialParaCrystal::getPeakDistance() const 
+";
+
+%feature("docstring")  InterferenceFunctionRadialParaCrystal::getDampingLength "double InterferenceFunctionRadialParaCrystal::getDampingLength() const 
+";
+
+
+// File: classIObservable.xml
+%feature("docstring") IObservable "
+
+Observable interface from Observer pattern, for 1:n object dependencies.
+
+C++ includes: IObserver.h
+";
+
+%feature("docstring")  IObservable::~IObservable "virtual IObservable::~IObservable()
+";
+
+%feature("docstring")  IObservable::attachObserver "void IObservable::attachObserver(observer_t obj)
+
+attach observer to the list of observers 
+";
+
+%feature("docstring")  IObservable::notifyObservers "void IObservable::notifyObservers()
+
+notify observers about change in status 
+";
+
+
+// File: classIObserver.xml
+%feature("docstring") IObserver "
+
+Observer interface from Observer pattern, for 1:n object dependencies.
+
+C++ includes: IObserver.h
+";
+
+%feature("docstring")  IObserver::~IObserver "virtual IObserver::~IObserver()
+";
+
+%feature("docstring")  IObserver::notify "virtual void IObserver::notify(IObservable *subject)=0
+
+method which is used by observable subject to notify change in status 
+";
+
+
+// File: classIOutputDataReadStrategy.xml
+%feature("docstring") IOutputDataReadStrategy "
+
+Interface for reading strategy of  OutputData from file.
+
+C++ includes: OutputDataReadStrategy.h
+";
+
+%feature("docstring")  IOutputDataReadStrategy::~IOutputDataReadStrategy "virtual IOutputDataReadStrategy::~IOutputDataReadStrategy()
+";
+
+%feature("docstring")  IOutputDataReadStrategy::readOutputData "virtual OutputData<double>* IOutputDataReadStrategy::readOutputData(std::istream &input_stream)=0
+";
+
+
+// File: classIOutputDataWriteStrategy.xml
+%feature("docstring") IOutputDataWriteStrategy "
+
+Strategy interface to write OututData in file.
+
+C++ includes: OutputDataWriteStrategy.h
+";
+
+%feature("docstring")  IOutputDataWriteStrategy::IOutputDataWriteStrategy "IOutputDataWriteStrategy::IOutputDataWriteStrategy()
+";
+
+%feature("docstring")  IOutputDataWriteStrategy::~IOutputDataWriteStrategy "virtual IOutputDataWriteStrategy::~IOutputDataWriteStrategy()
+";
+
+%feature("docstring")  IOutputDataWriteStrategy::writeOutputData "virtual void IOutputDataWriteStrategy::writeOutputData(const OutputData< double > &data, std::ostream &output_stream)=0
+";
+
+
+// File: classIParameter.xml
+%feature("docstring") IParameter "
+
+Pure virtual base class for parameter wrapper classes  RealParameter, ComponentParameter. Holds a pointer to the wrapped parameter, a name, and a callback function to be called when the parameter is changed. This class is templated on the data type of the wrapped parameter.
+
+C++ includes: IParameter.h
+";
+
+%feature("docstring")  IParameter::IParameter "IParameter< T >::IParameter()=delete
+";
+
+%feature("docstring")  IParameter::IParameter "IParameter< T >::IParameter(const std::string &name, volatile T *data, const std::string &parent_name, const std::function< void()> &onChange)
+";
+
+%feature("docstring")  IParameter::clone "virtual IParameter* IParameter< T >::clone(const std::string &new_name=\"\") const =0
+";
+
+%feature("docstring")  IParameter::isNull "virtual bool IParameter< T >::isNull() const
+
+Returns true if wrapped parameter was not initialized with proper real value. 
+";
+
+%feature("docstring")  IParameter::getData "volatile T& IParameter< T >::getData() const 
+";
+
+%feature("docstring")  IParameter::setData "void IParameter< T >::setData(volatile T &data)
+";
+
+
+// File: classIParameterized.xml
+%feature("docstring") IParameterized "
+
+Manages a local parameter pool, and a tree of child pools.
+
+C++ includes: IParameterized.h
+";
+
+%feature("docstring")  IParameterized::IParameterized "IParameterized::IParameterized(const std::string &name=\"\")
+";
+
+%feature("docstring")  IParameterized::IParameterized "IParameterized::IParameterized(const IParameterized &other)
+";
+
+%feature("docstring")  IParameterized::~IParameterized "IParameterized::~IParameterized() override
+";
+
+%feature("docstring")  IParameterized::getParameterPool "ParameterPool* IParameterized::getParameterPool() const
+
+Returns pointer to the parameter pool. 
+";
+
+%feature("docstring")  IParameterized::createParameterTree "ParameterPool * IParameterized::createParameterTree()
+
+Creates new parameter pool, with all local parameters and those of its children. 
+";
+
+%feature("docstring")  IParameterized::printParameters "void IParameterized::printParameters()
+";
+
+%feature("docstring")  IParameterized::registerParameter "RealParameter & IParameterized::registerParameter(const std::string &name, double *parpointer)
+";
+
+%feature("docstring")  IParameterized::setParameterValue "void IParameterized::setParameterValue(const std::string &name, double value)
+";
+
+%feature("docstring")  IParameterized::getParameter "RealParameter * IParameterized::getParameter(const std::string &name) const
+
+Returns parameter with given 'name'. 
+";
+
+%feature("docstring")  IParameterized::addParametersToExternalPool "std::string IParameterized::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const
+
+Adds parameters from local pool to external pool and recursively calls its direct children.
+
+Copies local parameters to external_pool, under name \"path/<name>copy_number/\". 
+";
+
+
+// File: classIParticle.xml
+%feature("docstring") IParticle "
+
+Pure virtual base class for  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal. Provides position/rotation and form factor. Abundance is inherited from  IAbstractParticle.
+
+C++ includes: IParticle.h
+";
+
+%feature("docstring")  IParticle::~IParticle "virtual IParticle::~IParticle()
+";
+
+%feature("docstring")  IParticle::clone "virtual IParticle* IParticle::clone() const =0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IParticle::cloneInvertB "virtual IParticle* IParticle::cloneInvertB() const =0
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  IParticle::accept "virtual void IParticle::accept(ISampleVisitor *visitor) const
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  IParticle::createFormFactor "IFormFactor * IParticle::createFormFactor() const
+
+Create a form factor for this particle. 
+";
+
+%feature("docstring")  IParticle::createTransformedFormFactor "virtual IFormFactor* IParticle::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const =0
+
+Create a form factor for this particle with an extra transformation. 
+";
+
+%feature("docstring")  IParticle::getPosition "kvector_t IParticle::getPosition() const
+
+Returns particle position. 
+";
+
+%feature("docstring")  IParticle::setPosition "void IParticle::setPosition(kvector_t position)
+
+Sets particle position. 
+";
+
+%feature("docstring")  IParticle::setPosition "void IParticle::setPosition(double x, double y, double z)
+
+Sets particle position. 
+";
+
+%feature("docstring")  IParticle::getRotation "const IRotation * IParticle::getRotation() const
+
+Returns rotation object. 
+";
+
+%feature("docstring")  IParticle::setRotation "void IParticle::setRotation(const IRotation &rotation)
+
+Sets transformation. 
+";
+
+%feature("docstring")  IParticle::applyRotation "void IParticle::applyRotation(const IRotation &rotation)
+
+Applies transformation by composing it with the existing one. 
+";
+
+%feature("docstring")  IParticle::applyTranslation "void IParticle::applyTranslation(kvector_t displacement)
+
+Applies extra translation by adding it to the current one. 
+";
+
+
+// File: classIPixelMap.xml
+%feature("docstring") IPixelMap "
+
+Interface for a function that maps [0,1]x[0,1] to the kvectors in a pixel.
+
+C++ includes: IPixelMap.h
+";
+
+%feature("docstring")  IPixelMap::~IPixelMap "virtual IPixelMap::~IPixelMap()
+";
+
+%feature("docstring")  IPixelMap::clone "virtual IPixelMap* IPixelMap::clone() const =0
+";
+
+%feature("docstring")  IPixelMap::createZeroSizeMap "virtual IPixelMap* IPixelMap::createZeroSizeMap(double x, double y) const =0
+";
+
+%feature("docstring")  IPixelMap::getK "virtual kvector_t IPixelMap::getK(double x, double y, double wavelength) const =0
+";
+
+%feature("docstring")  IPixelMap::getIntegrationFactor "virtual double IPixelMap::getIntegrationFactor(double x, double y) const =0
+";
+
+%feature("docstring")  IPixelMap::getSolidAngle "virtual double IPixelMap::getSolidAngle() const =0
+";
+
+
+// File: classIResolutionFunction2D.xml
+%feature("docstring") IResolutionFunction2D "
+
+Interface providing two-dimensional resolution function.
+
+C++ includes: IResolutionFunction2D.h
+";
+
+%feature("docstring")  IResolutionFunction2D::~IResolutionFunction2D "virtual IResolutionFunction2D::~IResolutionFunction2D()
+";
+
+%feature("docstring")  IResolutionFunction2D::evaluateCDF "virtual double IResolutionFunction2D::evaluateCDF(double x, double y) const =0
+";
+
+%feature("docstring")  IResolutionFunction2D::clone "virtual IResolutionFunction2D* IResolutionFunction2D::clone() const =0
+";
+
+
+// File: classIRotation.xml
+%feature("docstring") IRotation "
+
+must be subclass of sample, because it can be registered as a child in  ICompositeSample
+
+An interface for classes representing a rotation.
+
+C++ includes: Rotations.h
+";
+
+%feature("docstring")  IRotation::~IRotation "virtual IRotation::~IRotation()
+";
+
+%feature("docstring")  IRotation::clone "virtual IRotation* IRotation::clone() const =0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  IRotation::cloneInvertB "IRotation* IRotation::cloneInvertB() const final
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  IRotation::createInverse "virtual IRotation* IRotation::createInverse() const =0
+
+Returns a new  IRotation object that is the current object's inverse. 
+";
+
+%feature("docstring")  IRotation::accept "void IRotation::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  IRotation::getTransform3D "virtual Transform3D IRotation::getTransform3D() const =0
+
+Returns transformation. 
+";
+
+%feature("docstring")  IRotation::isIdentity "bool IRotation::isIdentity() const
+
+Returns true if roation matrix is identity matrix (no rotations) 
+";
+
+
+// File: classIRoughness.xml
+%feature("docstring") IRoughness "
+
+Interface to equip an interface with a roughness.
+
+C++ includes: IRoughness.h
+";
+
+%feature("docstring")  IRoughness::IRoughness "IRoughness::IRoughness()
+";
+
+%feature("docstring")  IRoughness::~IRoughness "virtual IRoughness::~IRoughness()
+";
+
+%feature("docstring")  IRoughness::accept "virtual void IRoughness::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+
+// File: classISample.xml
+%feature("docstring") ISample "
+
+Pure virtual base class for sample components and properties related to scattering.
+
+Inherited by  ICompositeSample,  IFormFactor,  IInterferenceFunction,  IRoughness,  IRotation. So it is much more basic and abstract than the name \"ISample\" suggests.
+
+Since  ICompositeSample contains a vector of  ISample's, we provide here some machinery for iterating through a tree (getMaterial, containedMaterials, containedSubclasses, ..). The functions getChildren and size, completely trivial here, become meaningful through their overloads in  ICompositeSample.
+
+C++ includes: ISample.h
+";
+
+%feature("docstring")  ISample::clone "ISample* ISample::clone() const override=0
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  ISample::cloneInvertB "ISample * ISample::cloneInvertB() const
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  ISample::accept "virtual void ISample::accept(ISampleVisitor *p_visitor) const =0
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  ISample::to_str "std::string ISample::to_str(int indent=0) const
+
+Returns textual representation of this and its descendants. 
+";
+
+%feature("docstring")  ISample::getMaterial "virtual const IMaterial* ISample::getMaterial() const
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  ISample::getAmbientMaterial "virtual const IMaterial* ISample::getAmbientMaterial() const
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  ISample::containedMaterials "std::vector< const IMaterial * > ISample::containedMaterials() const
+
+Returns set of unique materials contained in this  ISample. 
+";
+
+%feature("docstring")  ISample::getChildren "virtual std::vector<const ISample*> ISample::getChildren() const
+
+Returns a vector of children. 
+";
+
+%feature("docstring")  ISample::size "virtual size_t ISample::size() const
+
+Returns number of children. 
+";
+
+%feature("docstring")  ISample::containedSubclass "std::vector< const T * > ISample::containedSubclass() const
+
+Returns vector of children of type T. 
+";
+
+
+// File: classISampleIteratorStrategy.xml
+%feature("docstring") ISampleIteratorStrategy "";
+
+%feature("docstring")  ISampleIteratorStrategy::~ISampleIteratorStrategy "virtual ISampleIteratorStrategy::~ISampleIteratorStrategy()
+";
+
+%feature("docstring")  ISampleIteratorStrategy::clone "virtual ISampleIteratorStrategy* ISampleIteratorStrategy::clone() const =0
+";
+
+%feature("docstring")  ISampleIteratorStrategy::first "virtual IteratorMemento ISampleIteratorStrategy::first(const ISample *p_root)=0
+";
+
+%feature("docstring")  ISampleIteratorStrategy::next "virtual void ISampleIteratorStrategy::next(IteratorMemento &iterator_stack) const =0
+";
+
+%feature("docstring")  ISampleIteratorStrategy::isDone "virtual bool ISampleIteratorStrategy::isDone(IteratorMemento &iterator_stack) const =0
+";
+
+
+// File: classISampleVisitor.xml
+%feature("docstring") ISampleVisitor "
+
+From visitor pattern to achieve double dispatch.
+
+Visitor interface to visit  ISample objects.
+
+C++ includes: ISampleVisitor.h
+";
+
+%feature("docstring")  ISampleVisitor::ISampleVisitor "ISampleVisitor::ISampleVisitor()
+";
+
+%feature("docstring")  ISampleVisitor::~ISampleVisitor "virtual ISampleVisitor::~ISampleVisitor()
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const ISample *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const ICompositeSample *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IClusteredParticles *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const Crystal *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const ILayout *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const ParticleLayout *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const Layer *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const LayerInterface *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const MultiLayer *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IAbstractParticle *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IParticle *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const Particle *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const ParticleDistribution *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const ParticleComposition *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const MesoCrystal *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const ParticleCoreShell *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IFormFactor *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IFormFactorBorn *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IFormFactorDecorator *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorAnisoPyramid *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorBox *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorCone *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorCone6 *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorCuboctahedron *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorCrystal *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorCylinder *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDodecahedron *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorEllipsoidalCylinder *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorFullSphere *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorFullSpheroid *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorGauss *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorHemiEllipsoid *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorIcosahedron *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorLongBoxGauss *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorLongBoxLorentz *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorLorentz *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorPrism3 *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorPrism6 *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorPyramid *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorRipple1 *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorRipple2 *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorSphereGaussianRadius *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorSphereLogNormalRadius *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorTetrahedron *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorTrivial *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorTruncatedCube *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorTruncatedSphere *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorTruncatedSpheroid *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDWBA *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDWBAPol *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorWeighted *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDecoratorDebyeWaller *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDecoratorFactor *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDecoratorMaterial *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDecoratorPositionFactor *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const FormFactorDecoratorRotation *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IInterferenceFunction *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const InterferenceFunction1DLattice *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const InterferenceFunctionRadialParaCrystal *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const InterferenceFunction2DLattice *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const InterferenceFunction2DParaCrystal *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const InterferenceFunctionNone *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IRoughness *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const LayerRoughness *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const IRotation *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const RotationX *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const RotationY *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const RotationZ *)
+";
+
+%feature("docstring")  ISampleVisitor::visit "void ISampleVisitor::visit(const RotationEuler *)
+";
+
+%feature("docstring")  ISampleVisitor::visitEnter "bool ISampleVisitor::visitEnter(const ICompositeSample *)
+";
+
+%feature("docstring")  ISampleVisitor::visitLeave "bool ISampleVisitor::visitLeave(const ICompositeSample *)
+";
+
+%feature("docstring")  ISampleVisitor::getLevel "int ISampleVisitor::getLevel() const
+
+return current level of the visitor in the composite hierarchy 
+";
+
+%feature("docstring")  ISampleVisitor::setLevel "void ISampleVisitor::setLevel(int level)
+
+set current level of the visitor in the composite hierarchy 
+";
+
+
+// File: classISelectionRule.xml
+%feature("docstring") ISelectionRule "
+
+Pure virtual base class for selection rules.
+
+C++ includes: ISelectionRule.h
+";
+
+%feature("docstring")  ISelectionRule::~ISelectionRule "virtual ISelectionRule::~ISelectionRule()
+";
+
+%feature("docstring")  ISelectionRule::clone "virtual ISelectionRule* ISelectionRule::clone() const =0
+";
+
+%feature("docstring")  ISelectionRule::coordinateSelected "virtual bool ISelectionRule::coordinateSelected(const ivector_t &coordinate) const =0
+";
+
+
+// File: classIsGISAXS08BBuilder.xml
+%feature("docstring") IsGISAXS08BBuilder "
+
+Builds sample: 2D paracrystal lattice with isotropic pdfs (IsGISAXS example #8)
+
+C++ includes: ParaCrystalBuilder.h
+";
+
+%feature("docstring")  IsGISAXS08BBuilder::IsGISAXS08BBuilder "IsGISAXS08BBuilder::IsGISAXS08BBuilder()
+";
+
+%feature("docstring")  IsGISAXS08BBuilder::buildSample "MultiLayer * IsGISAXS08BBuilder::buildSample() const 
+";
+
+
+// File: classIsGISAXSDetector.xml
+%feature("docstring") IsGISAXSDetector "
+
+A spherical detector used for validation with IsGISAXS results.
+
+C++ includes: IsGISAXSDetector.h
+";
+
+%feature("docstring")  IsGISAXSDetector::IsGISAXSDetector "IsGISAXSDetector::IsGISAXSDetector()
+";
+
+%feature("docstring")  IsGISAXSDetector::IsGISAXSDetector "IsGISAXSDetector::IsGISAXSDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)
+";
+
+%feature("docstring")  IsGISAXSDetector::IsGISAXSDetector "IsGISAXSDetector::IsGISAXSDetector(const IsGISAXSDetector &other)
+";
+
+%feature("docstring")  IsGISAXSDetector::clone "IsGISAXSDetector * IsGISAXSDetector::clone() const override
+";
+
+
+// File: classGeometry_1_1IShape2D.xml
+%feature("docstring") Geometry::IShape2D "
+
+Basic class for all shapes in 2D.
+
+C++ includes: IShape2D.h
+";
+
+%feature("docstring")  Geometry::IShape2D::IShape2D "Geometry::IShape2D::IShape2D(const std::string &name)
+";
+
+%feature("docstring")  Geometry::IShape2D::clone "virtual IShape2D* Geometry::IShape2D::clone() const =0
+";
+
+%feature("docstring")  Geometry::IShape2D::contains "virtual bool Geometry::IShape2D::contains(double x, double y) const =0
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::IShape2D::contains "virtual bool Geometry::IShape2D::contains(const Bin1D &binx, const Bin1D &biny) const =0
+
+Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+";
+
+
+// File: classIShareable.xml
+%feature("docstring") IShareable "
+
+Dummy interface used to construct INamedShared and IParameterizedShared.
+
+C++ includes: IShareable.h
+";
+
+
+// File: classISingleton.xml
+%feature("docstring") ISingleton "
+
+Base class for singletons.
+
+C++ includes: ISingleton.h
+";
+
+
+// File: classISpecularInfoMap.xml
+%feature("docstring") ISpecularInfoMap "
+
+Interface class providing access to the reflection and transmittion coefficients.
+
+C++ includes: ISpecularInfoMap.h
+";
+
+%feature("docstring")  ISpecularInfoMap::ISpecularInfoMap "ISpecularInfoMap::ISpecularInfoMap()
+";
+
+%feature("docstring")  ISpecularInfoMap::ISpecularInfoMap "ISpecularInfoMap::ISpecularInfoMap(const ISpecularInfoMap &other)=delete
+";
+
+%feature("docstring")  ISpecularInfoMap::~ISpecularInfoMap "virtual ISpecularInfoMap::~ISpecularInfoMap()
+";
+
+%feature("docstring")  ISpecularInfoMap::clone "virtual ISpecularInfoMap* ISpecularInfoMap::clone() const =0
+";
+
+%feature("docstring")  ISpecularInfoMap::getOutCoefficients "virtual const ILayerRTCoefficients* ISpecularInfoMap::getOutCoefficients(const SimulationElement &sim_element) const =0
+
+Retrieves the amplitude coefficients for the given angles. 
+";
+
+%feature("docstring")  ISpecularInfoMap::getInCoefficients "virtual const ILayerRTCoefficients* ISpecularInfoMap::getInCoefficients(const SimulationElement &sim_element) const =0
+
+Retrieves the amplitude coefficients for the given angles. 
+";
+
+
+// File: classISquaredFunction.xml
+%feature("docstring") ISquaredFunction "
+
+Interface providing measures for deviation between two values.
+
+Used By  ChiSquaredModule for chi2 calculations
+
+C++ includes: ISquaredFunction.h
+";
+
+%feature("docstring")  ISquaredFunction::ISquaredFunction "ISquaredFunction::ISquaredFunction()
+";
+
+%feature("docstring")  ISquaredFunction::~ISquaredFunction "virtual ISquaredFunction::~ISquaredFunction()
+";
+
+%feature("docstring")  ISquaredFunction::clone "virtual ISquaredFunction* ISquaredFunction::clone() const =0
+";
+
+%feature("docstring")  ISquaredFunction::calculateSquaredDifference "virtual double ISquaredFunction::calculateSquaredDifference(double real_value, double simulated_value) const =0
+";
+
+%feature("docstring")  ISquaredFunction::calculateSquaredError "virtual double ISquaredFunction::calculateSquaredError(double real_value, double simulated_value=0.0) const =0
+";
+
+
+// File: classIteratorMemento.xml
+%feature("docstring") IteratorMemento "
+
+Holds all iterator states encountered for  SampleTreeIterator.
+
+C++ includes: SampleTreeIterator.h
+";
+
+%feature("docstring")  IteratorMemento::IteratorMemento "IteratorMemento::IteratorMemento()
+";
+
+%feature("docstring")  IteratorMemento::~IteratorMemento "virtual IteratorMemento::~IteratorMemento()
+";
+
+%feature("docstring")  IteratorMemento::push_state "void IteratorMemento::push_state(const IteratorState &state)
+";
+
+%feature("docstring")  IteratorMemento::pop_state "void IteratorMemento::pop_state()
+";
+
+%feature("docstring")  IteratorMemento::get_state "IteratorState& IteratorMemento::get_state()
+";
+
+%feature("docstring")  IteratorMemento::empty "bool IteratorMemento::empty() const 
+";
+
+%feature("docstring")  IteratorMemento::reset "void IteratorMemento::reset()
+";
+
+%feature("docstring")  IteratorMemento::getCurrent "const ISample* IteratorMemento::getCurrent()
+";
+
+%feature("docstring")  IteratorMemento::next "void IteratorMemento::next()
+";
+
+%feature("docstring")  IteratorMemento::size "size_t IteratorMemento::size() const 
+";
+
+
+// File: classIteratorState.xml
+%feature("docstring") IteratorState "
+
+Holds state of iterator at single level for  SampleTreeIterator.
+
+C++ includes: SampleTreeIterator.h
+";
+
+%feature("docstring")  IteratorState::IteratorState "IteratorState::IteratorState(const ISample *single_element)
+";
+
+%feature("docstring")  IteratorState::IteratorState "IteratorState::IteratorState(std::vector< const ISample * > samples)
+";
+
+%feature("docstring")  IteratorState::~IteratorState "virtual IteratorState::~IteratorState()
+";
+
+%feature("docstring")  IteratorState::getCurrent "const ISample* IteratorState::getCurrent() const 
+";
+
+%feature("docstring")  IteratorState::isEnd "bool IteratorState::isEnd() const 
+";
+
+%feature("docstring")  IteratorState::next "void IteratorState::next()
+";
+
+
+// File: classLabelMap.xml
+%feature("docstring") LabelMap "";
+
+%feature("docstring")  LabelMap::LabelMap "LabelMap< Key >::LabelMap()
+";
+
+%feature("docstring")  LabelMap::~LabelMap "virtual LabelMap< Key >::~LabelMap()
+";
+
+%feature("docstring")  LabelMap::clear "void LabelMap< Key >::clear()
+";
+
+%feature("docstring")  LabelMap::begin "const_iterator LabelMap< Key >::begin() const 
+";
+
+%feature("docstring")  LabelMap::end "const_iterator LabelMap< Key >::end() const 
+";
+
+%feature("docstring")  LabelMap::begin "iterator LabelMap< Key >::begin()
+";
+
+%feature("docstring")  LabelMap::end "iterator LabelMap< Key >::end()
+";
+
+%feature("docstring")  LabelMap::size "size_t LabelMap< Key >::size()
+";
+
+%feature("docstring")  LabelMap::insert "void LabelMap< Key >::insert(const Key &key, const std::string &object)
+";
+
+%feature("docstring")  LabelMap::find "const iterator LabelMap< Key >::find(const Key &key) const 
+";
+
+%feature("docstring")  LabelMap::find "iterator LabelMap< Key >::find(const Key &key)
+";
+
+%feature("docstring")  LabelMap::erase "void LabelMap< Key >::erase(const Key &key)
+";
+
+%feature("docstring")  LabelMap::value "const std::string& LabelMap< Key >::value(const Key &key)
+";
+
+
+// File: classLargeCylindersInDWBABuilder.xml
+%feature("docstring") LargeCylindersInDWBABuilder "
+
+Builds sample with large cylinders for MC integration tests.
+
+C++ includes: CylindersBuilder.h
+";
+
+%feature("docstring")  LargeCylindersInDWBABuilder::LargeCylindersInDWBABuilder "LargeCylindersInDWBABuilder::LargeCylindersInDWBABuilder()
+";
+
+%feature("docstring")  LargeCylindersInDWBABuilder::buildSample "MultiLayer * LargeCylindersInDWBABuilder::buildSample() const 
+";
+
+
+// File: classLattice.xml
+%feature("docstring") Lattice "
+
+A lattice with three basis vectors.
+
+C++ includes: Lattice.h
+";
+
+%feature("docstring")  Lattice::Lattice "Lattice::Lattice()=delete
+";
+
+%feature("docstring")  Lattice::Lattice "Lattice::Lattice(const kvector_t a1, const kvector_t a2, const kvector_t a3)
+";
+
+%feature("docstring")  Lattice::Lattice "Lattice::Lattice(const Lattice &lattice)
+";
+
+%feature("docstring")  Lattice::~Lattice "Lattice::~Lattice()
+";
+
+%feature("docstring")  Lattice::createTransformedLattice "Lattice Lattice::createTransformedLattice(const Transform3D &transform) const
+
+Create transformed lattice. 
+";
+
+%feature("docstring")  Lattice::initialize "void Lattice::initialize() const
+
+Initializes cached data. 
+";
+
+%feature("docstring")  Lattice::getBasisVectorA "kvector_t Lattice::getBasisVectorA() const
+
+Returns basis vector a. 
+";
+
+%feature("docstring")  Lattice::getBasisVectorB "kvector_t Lattice::getBasisVectorB() const
+
+Returns basis vector b. 
+";
+
+%feature("docstring")  Lattice::getBasisVectorC "kvector_t Lattice::getBasisVectorC() const
+
+Returns basis vector c. 
+";
+
+%feature("docstring")  Lattice::getVolume "double Lattice::getVolume() const
+
+Returns the volume of the unit cell. 
+";
+
+%feature("docstring")  Lattice::getReciprocalLatticeBasis "void Lattice::getReciprocalLatticeBasis(kvector_t b1, kvector_t b2, kvector_t b3) const
+
+Returns the reciprocal basis vectors. 
+";
+
+%feature("docstring")  Lattice::getNearestLatticeVectorCoordinates "ivector_t Lattice::getNearestLatticeVectorCoordinates(const kvector_t vector_in) const
+
+Returns the nearest lattice point from a given vector. 
+";
+
+%feature("docstring")  Lattice::getNearestReciprocalLatticeVectorCoordinates "ivector_t Lattice::getNearestReciprocalLatticeVectorCoordinates(const kvector_t vector_in) const
+
+Returns the nearest reciprocal lattice point from a given vector. 
+";
+
+%feature("docstring")  Lattice::reciprocalLatticeVectorsWithinRadius "std::vector< kvector_t > Lattice::reciprocalLatticeVectorsWithinRadius(const kvector_t input_vector, double radius) const
+
+Computes a list of reciprocal lattice vectors within a specified distance of a given vector. 
+";
+
+%feature("docstring")  Lattice::setSelectionRule "void Lattice::setSelectionRule(const ISelectionRule &p_selection_rule)
+
+Sets a selection rule for the reciprocal vectors. 
+";
+
+
+// File: classLattice1DBuilder.xml
+%feature("docstring") Lattice1DBuilder "
+
+Builds sample: cylinders with 1DDL structure factor.
+
+C++ includes: LatticeBuilder.h
+";
+
+%feature("docstring")  Lattice1DBuilder::Lattice1DBuilder "Lattice1DBuilder::Lattice1DBuilder()
+";
+
+%feature("docstring")  Lattice1DBuilder::buildSample "MultiLayer * Lattice1DBuilder::buildSample() const 
+";
+
+
+// File: classLattice1DParameters.xml
+%feature("docstring") Lattice1DParameters "
+
+Basic parameters of a one-dimensional lattice.
+
+C++ includes: Lattice1DParameters.h
+";
+
+%feature("docstring")  Lattice1DParameters::Lattice1DParameters "Lattice1DParameters::Lattice1DParameters()
+";
+
+%feature("docstring")  Lattice1DParameters::Lattice1DParameters "Lattice1DParameters::Lattice1DParameters(double length, double xi)
+
+Parameters:
+-----------
+
+length: 
+ Lattice constant.
+
+xi: 
+TODO: seems unused; explain or remove 
+";
+
+
+// File: classLattice2DParameters.xml
+%feature("docstring") Lattice2DParameters "
+
+Additional parameters for 2D lattice.
+
+C++ includes: Lattice2DParameters.h
+";
+
+%feature("docstring")  Lattice2DParameters::Lattice2DParameters "Lattice2DParameters::Lattice2DParameters()
+";
+
+%feature("docstring")  Lattice2DParameters::getUnitCellArea "double Lattice2DParameters::getUnitCellArea() const 
+";
+
+
+// File: classLayer.xml
+%feature("docstring") Layer "
+
+A layer, with thickness (in nanometer) and material.
+
+C++ includes: Layer.h
+";
+
+%feature("docstring")  Layer::Layer "Layer::Layer()
+";
+
+%feature("docstring")  Layer::Layer "Layer::Layer(const IMaterial &material, double thickness=0)
+";
+
+%feature("docstring")  Layer::~Layer "Layer::~Layer() final
+";
+
+%feature("docstring")  Layer::clone "Layer* Layer::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  Layer::cloneInvertB "Layer * Layer::cloneInvertB() const final
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  Layer::accept "void Layer::accept(ISampleVisitor *visitor) const final
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  Layer::to_str "std::string Layer::to_str(int indent=0) const final
+
+Returns textual representation of this and its descendants. 
+";
+
+%feature("docstring")  Layer::setThickness "void Layer::setThickness(double thickness)
+
+Sets layer thickness in nanometers. 
+";
+
+%feature("docstring")  Layer::getThickness "double Layer::getThickness() const 
+";
+
+%feature("docstring")  Layer::setMaterial "void Layer::setMaterial(const IMaterial &material)
+
+Sets  material of the layer. 
+";
+
+%feature("docstring")  Layer::getMaterial "const IMaterial* Layer::getMaterial() const
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  Layer::getRefractiveIndex "complex_t Layer::getRefractiveIndex() const 
+";
+
+%feature("docstring")  Layer::getRefractiveIndex2 "complex_t Layer::getRefractiveIndex2() const
+
+squared refractive index 
+";
+
+%feature("docstring")  Layer::addLayout "void Layer::addLayout(const ILayout &decoration)
+";
+
+%feature("docstring")  Layer::getNumberOfLayouts "size_t Layer::getNumberOfLayouts() const 
+";
+
+%feature("docstring")  Layer::getLayout "const ILayout * Layer::getLayout(size_t i) const 
+";
+
+%feature("docstring")  Layer::hasComputation "bool Layer::hasComputation() const
+
+Returns true if decoration is present. 
+";
+
+%feature("docstring")  Layer::getTotalParticleSurfaceDensity "double Layer::getTotalParticleSurfaceDensity(size_t layout_index) const 
+";
+
+%feature("docstring")  Layer::getTotalAbundance "double Layer::getTotalAbundance() const 
+";
+
+%feature("docstring")  Layer::setNumberOfLayers "void Layer::setNumberOfLayers(size_t n_layers)
+";
+
+%feature("docstring")  Layer::getNumberOfLayers "size_t Layer::getNumberOfLayers() const 
+";
+
+
+// File: classLayerInterface.xml
+%feature("docstring") LayerInterface "
+
+Interface between two layers, possibly with roughness.
+
+C++ includes: LayerInterface.h
+";
+
+%feature("docstring")  LayerInterface::~LayerInterface "LayerInterface::~LayerInterface()
+";
+
+%feature("docstring")  LayerInterface::clone "LayerInterface * LayerInterface::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  LayerInterface::accept "virtual void LayerInterface::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  LayerInterface::setLayerTop "void LayerInterface::setLayerTop(const Layer *p_layer_top)
+
+Sets link to the layer above the interface. 
+";
+
+%feature("docstring")  LayerInterface::setLayerBottom "void LayerInterface::setLayerBottom(const Layer *p_layer_bottom)
+
+Sets link to the layer below the interface. 
+";
+
+%feature("docstring")  LayerInterface::setLayersTopBottom "void LayerInterface::setLayersTopBottom(const Layer *p_layer_top, const Layer *p_layer_bottom)
+
+Sets links to the layers above and below the interface. 
+";
+
+%feature("docstring")  LayerInterface::setRoughness "void LayerInterface::setRoughness(const LayerRoughness &roughness)
+
+Sets roughness of the interface. 
+";
+
+%feature("docstring")  LayerInterface::getRoughness "const LayerRoughness* LayerInterface::getRoughness() const
+
+Returns roughness of the interface. 
+";
+
+%feature("docstring")  LayerInterface::getLayerTop "const Layer* LayerInterface::getLayerTop() const
+
+Returns top layer. 
+";
+
+%feature("docstring")  LayerInterface::getLayerBottom "const Layer* LayerInterface::getLayerBottom() const
+
+Returns bottom layer. 
+";
+
+
+// File: classLayerRoughness.xml
+%feature("docstring") LayerRoughness "
+
+A Roughness of interface between two layers.
+
+Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 \"X-ray reflection and transmission by rough surfaces\"
+
+C++ includes: LayerRoughness.h
+";
+
+%feature("docstring")  LayerRoughness::LayerRoughness "LayerRoughness::LayerRoughness()
+";
+
+%feature("docstring")  LayerRoughness::LayerRoughness "LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength)
+";
+
+%feature("docstring")  LayerRoughness::clone "LayerRoughness* LayerRoughness::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  LayerRoughness::accept "virtual void LayerRoughness::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  LayerRoughness::getSpectralFun "double LayerRoughness::getSpectralFun(const kvector_t kvec) const
+
+Returns power spectral density of the surface roughness.
+
+Power spectral density of the surface roughness is a result of two-dimensional Fourier transform of the correlation function of the roughness profile.
+
+Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 \"X-ray reflection and transmission by rough surfaces\" 
+";
+
+%feature("docstring")  LayerRoughness::getCorrFun "double LayerRoughness::getCorrFun(const kvector_t k) const
+
+Correlation function of the roughness profile. 
+";
+
+%feature("docstring")  LayerRoughness::setSigma "void LayerRoughness::setSigma(double sigma)
+
+Sets rms of roughness. 
+";
+
+%feature("docstring")  LayerRoughness::getSigma "double LayerRoughness::getSigma() const
+
+Returns rms of roughness. 
+";
+
+%feature("docstring")  LayerRoughness::setHurstParameter "void LayerRoughness::setHurstParameter(double hurstParameter)
+
+Sets hurst parameter. It describes how jagged the surface is. 
+";
+
+%feature("docstring")  LayerRoughness::getHurstParameter "double LayerRoughness::getHurstParameter() const
+
+Returns hurst parameter. 
+";
+
+%feature("docstring")  LayerRoughness::setLatteralCorrLength "void LayerRoughness::setLatteralCorrLength(double latteralCorrLength)
+
+Sets lateral correlation length. 
+";
+
+%feature("docstring")  LayerRoughness::getLatteralCorrLength "double LayerRoughness::getLatteralCorrLength() const
+
+Returns latteral correlation length. 
+";
+
+
+// File: classLayerSpecularInfo.xml
+%feature("docstring") LayerSpecularInfo "
+
+Holds the amplitude information of the radiation wavefunction in a specific layer for different incoming (outgoing) angles of the beam in the top layer (these amplitudes correspond to the specular part of the neutron wavefunction).
+
+C++ includes: LayerSpecularInfo.h
+";
+
+%feature("docstring")  LayerSpecularInfo::LayerSpecularInfo "LayerSpecularInfo::LayerSpecularInfo()
+";
+
+%feature("docstring")  LayerSpecularInfo::~LayerSpecularInfo "LayerSpecularInfo::~LayerSpecularInfo() final
+";
+
+%feature("docstring")  LayerSpecularInfo::clone "LayerSpecularInfo * LayerSpecularInfo::clone() const final
+";
+
+%feature("docstring")  LayerSpecularInfo::addRTCoefficients "void LayerSpecularInfo::addRTCoefficients(ISpecularInfoMap *rt_coefficient_map)
+
+Adds the amplitude coefficients for the (time-reversed) outgoing wavevector with the given angles 
+";
+
+%feature("docstring")  LayerSpecularInfo::getOutCoefficients "const ILayerRTCoefficients * LayerSpecularInfo::getOutCoefficients(const SimulationElement &sim_element) const
+
+Retrieves the amplitude coefficients for a (time-reversed) outgoing wavevector. 
+";
+
+%feature("docstring")  LayerSpecularInfo::getInCoefficients "const ILayerRTCoefficients * LayerSpecularInfo::getInCoefficients(const SimulationElement &sim_element) const
+
+Retrieves the amplitude coefficients for an incoming wavevector. 
+";
+
+
+// File: classLayerStrategyBuilder.xml
+%feature("docstring") LayerStrategyBuilder "
+
+Methods to generate a simulation strategy for  DecoratedLayerComputation.
+
+C++ includes: LayerStrategyBuilder.h
+";
+
+%feature("docstring")  LayerStrategyBuilder::LayerStrategyBuilder "LayerStrategyBuilder::LayerStrategyBuilder(const Layer &decorated_layer, bool polarized, const SimulationOptions &sim_params, size_t layout_index, const LayerSpecularInfo *specular_info)
+";
+
+%feature("docstring")  LayerStrategyBuilder::~LayerStrategyBuilder "LayerStrategyBuilder::~LayerStrategyBuilder()
+";
+
+%feature("docstring")  LayerStrategyBuilder::createStrategy "IInterferenceFunctionStrategy * LayerStrategyBuilder::createStrategy() const
+
+Returns a new strategy object that is able to calculate the scattering for fixed k_f. 
+";
+
+
+// File: classLayersWithAbsorptionBuilder.xml
+%feature("docstring") LayersWithAbsorptionBuilder "
+
+The  LayersWithAbsorptionBuilder class generates a multilayer with 3 layers with absorption (refractive index has imaginary part).The middle layer is populated with particles. Requires IComponentService which generates form factors, used for bulk form factors testing.
+
+C++ includes: LayersWithAbsorptionBuilder.h
+";
+
+%feature("docstring")  LayersWithAbsorptionBuilder::LayersWithAbsorptionBuilder "LayersWithAbsorptionBuilder::LayersWithAbsorptionBuilder()
+";
+
+%feature("docstring")  LayersWithAbsorptionBuilder::~LayersWithAbsorptionBuilder "virtual LayersWithAbsorptionBuilder::~LayersWithAbsorptionBuilder()
+";
+
+%feature("docstring")  LayersWithAbsorptionBuilder::buildSample "MultiLayer * LayersWithAbsorptionBuilder::buildSample() const 
+";
+
+
+// File: classGeometry_1_1Line.xml
+%feature("docstring") Geometry::Line "
+
+A line segment.
+
+C++ includes: Line.h
+";
+
+%feature("docstring")  Geometry::Line::Line "Geometry::Line::Line(double x1, double y1, double x2, double y2)
+";
+
+%feature("docstring")  Geometry::Line::clone "Line* Geometry::Line::clone() const 
+";
+
+%feature("docstring")  Geometry::Line::contains "bool Geometry::Line::contains(double x, double y) const
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::Line::contains "bool Geometry::Line::contains(const Bin1D &binx, const Bin1D &biny) const
+
+Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+";
+
+
+// File: classLLData.xml
+%feature("docstring") LLData "
+
+Template class to store data of any type in multi-dimensional space (low-level)
+
+C++ includes: LLData.h
+";
+
+%feature("docstring")  LLData::LLData "LLData< T >::LLData(size_t rank, const int *dimensions)
+";
+
+%feature("docstring")  LLData::LLData "LLData< T >::LLData(const LLData< T > &right)
+";
+
+%feature("docstring")  LLData::~LLData "LLData< T >::~LLData()
+";
+
+%feature("docstring")  LLData::meanValues "LLData<double> LLData< T >::meanValues() const 
+";
+
+%feature("docstring")  LLData::atCoordinate "T & LLData< T >::atCoordinate(int *coordinate)
+";
+
+%feature("docstring")  LLData::atCoordinate "const T & LLData< T >::atCoordinate(int *coordinate) const 
+";
+
+%feature("docstring")  LLData::setAll "void LLData< T >::setAll(const T &value)
+";
+
+%feature("docstring")  LLData::scaleAll "void LLData< T >::scaleAll(const T &factor)
+";
+
+%feature("docstring")  LLData::getTotalSize "size_t LLData< T >::getTotalSize() const 
+";
+
+%feature("docstring")  LLData::getRank "size_t LLData< T >::getRank() const 
+";
+
+%feature("docstring")  LLData::getDimensions "const int* LLData< T >::getDimensions() const 
+";
+
+%feature("docstring")  LLData::getTotalSum "T LLData< T >::getTotalSum() const 
+";
+
+
+// File: classExceptions_1_1LogicErrorException.xml
+%feature("docstring") Exceptions::LogicErrorException "";
+
+%feature("docstring")  Exceptions::LogicErrorException::LogicErrorException "Exceptions::LogicErrorException::LogicErrorException(const std::string &message)
+";
+
+
+// File: classMagneticCylindersBuilder.xml
+%feature("docstring") MagneticCylindersBuilder "
+
+Builds sample: cylinders with magnetic material and non-zero magnetic field.
+
+C++ includes: MagneticParticlesBuilder.h
+";
+
+%feature("docstring")  MagneticCylindersBuilder::MagneticCylindersBuilder "MagneticCylindersBuilder::MagneticCylindersBuilder()
+";
+
+%feature("docstring")  MagneticCylindersBuilder::buildSample "MultiLayer * MagneticCylindersBuilder::buildSample() const 
+";
+
+
+// File: classMagneticParticleZeroFieldBuilder.xml
+%feature("docstring") MagneticParticleZeroFieldBuilder "
+
+Builds sample: cylinders with magnetic material and zero magnetic field.
+
+C++ includes: MagneticParticlesBuilder.h
+";
+
+%feature("docstring")  MagneticParticleZeroFieldBuilder::MagneticParticleZeroFieldBuilder "MagneticParticleZeroFieldBuilder::MagneticParticleZeroFieldBuilder()
+";
+
+%feature("docstring")  MagneticParticleZeroFieldBuilder::buildSample "MultiLayer * MagneticParticleZeroFieldBuilder::buildSample() const 
+";
+
+
+// File: classMainComputation.xml
+%feature("docstring") MainComputation "
+
+Performs a single-threaded DWBA computation with given sample and simulation parameters, for a given span of detector bins.
+
+Controlled by the multi-threading machinery in  Simulation::runSingleSimulation().
+
+C++ includes: MainComputation.h
+";
+
+%feature("docstring")  MainComputation::MainComputation "MainComputation::MainComputation(const MultiLayer *p_multi_layer, const SimulationOptions &options, ProgressHandler &progress, const std::vector< SimulationElement >::iterator &begin_it, const std::vector< SimulationElement >::iterator &end_it)
+";
+
+%feature("docstring")  MainComputation::~MainComputation "MainComputation::~MainComputation()
+";
+
+%feature("docstring")  MainComputation::run "void MainComputation::run()
+";
+
+%feature("docstring")  MainComputation::isCompleted "bool MainComputation::isCompleted() const 
+";
+
+%feature("docstring")  MainComputation::getRunMessage "std::string MainComputation::getRunMessage() const 
+";
+
+
+// File: classMatrixRTCoefficients.xml
+%feature("docstring") MatrixRTCoefficients "
+
+Specular reflection and transmission coefficients in a layer in case of 2x2 matrix interactions between the layers and the scattered particle.
+
+C++ includes: MatrixRTCoefficients.h
+";
+
+%feature("docstring")  MatrixRTCoefficients::MatrixRTCoefficients "MatrixRTCoefficients::MatrixRTCoefficients()
+";
+
+%feature("docstring")  MatrixRTCoefficients::~MatrixRTCoefficients "virtual MatrixRTCoefficients::~MatrixRTCoefficients()
+";
+
+%feature("docstring")  MatrixRTCoefficients::clone "MatrixRTCoefficients * MatrixRTCoefficients::clone() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::T1plus "Eigen::Vector2cd MatrixRTCoefficients::T1plus() const
+
+The following functions return the transmitted and reflected amplitudes for different incoming beam polarizations and eigenmodes 
+";
+
+%feature("docstring")  MatrixRTCoefficients::R1plus "Eigen::Vector2cd MatrixRTCoefficients::R1plus() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::T2plus "Eigen::Vector2cd MatrixRTCoefficients::T2plus() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::R2plus "Eigen::Vector2cd MatrixRTCoefficients::R2plus() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::T1min "Eigen::Vector2cd MatrixRTCoefficients::T1min() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::R1min "Eigen::Vector2cd MatrixRTCoefficients::R1min() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::T2min "Eigen::Vector2cd MatrixRTCoefficients::T2min() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::R2min "Eigen::Vector2cd MatrixRTCoefficients::R2min() const 
+";
+
+%feature("docstring")  MatrixRTCoefficients::getKz "Eigen::Vector2cd MatrixRTCoefficients::getKz() const
+
+Returns z-part of the two wavevector eigenmodes. 
+";
+
+
+// File: classMatrixSpecularInfoMap.xml
+%feature("docstring") MatrixSpecularInfoMap "
+
+Implementation of  ISpecularInfoMap for matrix valued reflection/transmission coefficients.
+
+C++ includes: MatrixSpecularInfoMap.h
+";
+
+%feature("docstring")  MatrixSpecularInfoMap::MatrixSpecularInfoMap "MatrixSpecularInfoMap::MatrixSpecularInfoMap(const MultiLayer *multilayer, int layer)
+";
+
+%feature("docstring")  MatrixSpecularInfoMap::~MatrixSpecularInfoMap "MatrixSpecularInfoMap::~MatrixSpecularInfoMap() final
+";
+
+%feature("docstring")  MatrixSpecularInfoMap::clone "MatrixSpecularInfoMap * MatrixSpecularInfoMap::clone() const final
+";
+
+%feature("docstring")  MatrixSpecularInfoMap::getOutCoefficients "const ILayerRTCoefficients * MatrixSpecularInfoMap::getOutCoefficients(const SimulationElement &sim_element) const final
+
+Retrieves the amplitude coefficients for the given angles. 
+";
+
+%feature("docstring")  MatrixSpecularInfoMap::getInCoefficients "const ILayerRTCoefficients * MatrixSpecularInfoMap::getInCoefficients(const SimulationElement &sim_element) const final
+
+Retrieves the amplitude coefficients for the given angles. 
+";
+
+
+// File: classMCMiserIntegrator.xml
+%feature("docstring") MCMiserIntegrator "
+
+Template class to use Monte Carlo MISER integration of class member functions.
+
+Wraps an integrator from GNU Scientific Library. Since this class holds a persistent workspace, we need at least one instance per thread. Standard usage for integration inside a class T:
+Create a handle to an integrator: 'auto integrator = make_integrator_miser(this, mem_function, dimension)'
+
+Call: 'integrator.integrate(lmin, lmax, data, nbr_points)'
+
+C++ includes: IntegratorMCMiser.h
+";
+
+
+// File: classMesoCrystal.xml
+%feature("docstring") MesoCrystal "
+
+A particle with an internal structure of smaller particles.
+
+C++ includes: MesoCrystal.h
+";
+
+%feature("docstring")  MesoCrystal::MesoCrystal "MesoCrystal::MesoCrystal(IClusteredParticles *p_particle_structure, IFormFactor *p_form_factor)
+";
+
+%feature("docstring")  MesoCrystal::MesoCrystal "MesoCrystal::MesoCrystal(const IClusteredParticles &particle_structure, IFormFactor &form_factor)
+";
+
+%feature("docstring")  MesoCrystal::~MesoCrystal "MesoCrystal::~MesoCrystal()
+";
+
+%feature("docstring")  MesoCrystal::clone "MesoCrystal * MesoCrystal::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  MesoCrystal::cloneInvertB "MesoCrystal * MesoCrystal::cloneInvertB() const
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  MesoCrystal::accept "void MesoCrystal::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  MesoCrystal::setAmbientMaterial "void MesoCrystal::setAmbientMaterial(const IMaterial &material)
+
+Sets the refractive index of the ambient material (which influences its scattering power) 
+";
+
+%feature("docstring")  MesoCrystal::getAmbientMaterial "const IMaterial * MesoCrystal::getAmbientMaterial() const
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  MesoCrystal::createTransformedFormFactor "IFormFactor * MesoCrystal::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+Create a form factor for this particle with an extra scattering factor. 
+";
+
+%feature("docstring")  MesoCrystal::getClusteredParticles "const IClusteredParticles* MesoCrystal::getClusteredParticles() const
+
+get the internal structure, which is in principle unbounded in space (e.g. an infinite crystal) 
+";
+
+
+// File: classMesoCrystalBuilder.xml
+%feature("docstring") MesoCrystalBuilder "
+
+Builds sample: mesocrystals of cylindrical shape composed by spherical nanoparticles.
+
+C++ includes: MesoCrystalBuilder.h
+";
+
+%feature("docstring")  MesoCrystalBuilder::MesoCrystalBuilder "MesoCrystalBuilder::MesoCrystalBuilder()
+";
+
+%feature("docstring")  MesoCrystalBuilder::~MesoCrystalBuilder "virtual MesoCrystalBuilder::~MesoCrystalBuilder()
+";
+
+%feature("docstring")  MesoCrystalBuilder::buildSample "MultiLayer * MesoCrystalBuilder::buildSample() const 
+";
+
+
+// File: classMultiLayer.xml
+%feature("docstring") MultiLayer "
+
+Our sample model: a stack of layers one below the other.Example of system of 4 layers (3 interfaces):
+
+ambience layer #0 z=getLayerBottomZ(0)=0.0 ------ interface #0 Fe, 20A layer #1 z=getLayerBottomZ(1)=-20.0 ------ interface #1 Cr, 40A layer #2 z=getLayerBottomZ(2)=-60.0 ------ interface #2 substrate layer #3 z=getLayerBottomZ(3)=-60.0
+
+C++ includes: MultiLayer.h
+";
+
+%feature("docstring")  MultiLayer::MultiLayer "MultiLayer::MultiLayer()
+";
+
+%feature("docstring")  MultiLayer::~MultiLayer "MultiLayer::~MultiLayer()
+";
+
+%feature("docstring")  MultiLayer::accept "virtual void MultiLayer::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  MultiLayer::to_str "std::string MultiLayer::to_str(int indent=0) const
+
+Returns textual representation of this and its descendants. 
+";
+
+%feature("docstring")  MultiLayer::getNumberOfLayers "size_t MultiLayer::getNumberOfLayers() const 
+";
+
+%feature("docstring")  MultiLayer::getNumberOfInterfaces "size_t MultiLayer::getNumberOfInterfaces() const 
+";
+
+%feature("docstring")  MultiLayer::addLayer "void MultiLayer::addLayer(const Layer &p_child)
+
+Adds object to multilayer, overrides from  ISample.
+
+Adds layer with default (zero) roughness. 
+";
+
+%feature("docstring")  MultiLayer::addLayerWithTopRoughness "void MultiLayer::addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness)
+
+Adds layer with top roughness. 
+";
+
+%feature("docstring")  MultiLayer::getLayer "const Layer* MultiLayer::getLayer(size_t i_layer) const
+
+Returns layer with given index. 
+";
+
+%feature("docstring")  MultiLayer::getLayerInterface "const LayerInterface* MultiLayer::getLayerInterface(size_t i_interface) const
+
+Returns layer with given index. 
+";
+
+%feature("docstring")  MultiLayer::getLayerBottomZ "double MultiLayer::getLayerBottomZ(size_t i_layer) const
+
+Returns z-coordinate of the layer's bottom. 
+";
+
+%feature("docstring")  MultiLayer::getLayerThickness "double MultiLayer::getLayerThickness(size_t i_layer) const
+
+Returns thickness of layer. 
+";
+
+%feature("docstring")  MultiLayer::getLayerTopInterface "const LayerInterface * MultiLayer::getLayerTopInterface(size_t i_layer) const
+
+Returns top interface of layer.
+
+Returns pointer to the top interface of the layer. nInterfaces = nLayers-1, first layer in multilayer doesn't have interface. 
+";
+
+%feature("docstring")  MultiLayer::getLayerBottomInterface "const LayerInterface * MultiLayer::getLayerBottomInterface(size_t i_layer) const
+
+Returns bottom interface of layer.
+
+Returns pointer to the bottom interface of the layer. 
+";
+
+%feature("docstring")  MultiLayer::clear "void MultiLayer::clear()
+
+Destructs allocated objects. 
+";
+
+%feature("docstring")  MultiLayer::clone "MultiLayer * MultiLayer::clone() const
+
+Returns alone of multilayer with clones of all layers and recreated interfaces between layers 
+";
+
+%feature("docstring")  MultiLayer::cloneInvertB "MultiLayer * MultiLayer::cloneInvertB() const
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  MultiLayer::setCrossCorrLength "void MultiLayer::setCrossCorrLength(double crossCorrLength)
+
+Sets cross correlation length of roughnesses between interfaces. 
+";
+
+%feature("docstring")  MultiLayer::getCrossCorrLength "double MultiLayer::getCrossCorrLength() const
+
+Returns cross correlation length of roughnesses between interfaces. 
+";
+
+%feature("docstring")  MultiLayer::getCrossCorrSpectralFun "double MultiLayer::getCrossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const
+
+! correlation function of roughnesses between the interfaces
+
+Fourier transform of the correlation function of roughnesses between the interfaces
+
+Fourier transform of the correlation function of roughnesses between the interfaces j,k - indexes of layers in multilayer whose bottom interfaces we are considering 
+";
+
+%feature("docstring")  MultiLayer::setLayerThickness "void MultiLayer::setLayerThickness(size_t i_layer, double thickness)
+
+Sets thickness of layer. 
+";
+
+%feature("docstring")  MultiLayer::getIndexOfLayer "int MultiLayer::getIndexOfLayer(const Layer *layer) const
+
+returns layer index 
+";
+
+%feature("docstring")  MultiLayer::requiresMatrixRTCoefficients "bool MultiLayer::requiresMatrixRTCoefficients() const
+
+returns true if contains magnetic materials and matrix calculations are required 
+";
+
+%feature("docstring")  MultiLayer::zToLayerIndex "size_t MultiLayer::zToLayerIndex(double z_value)
+
+returns layer index corresponding to given global z coordinate 
+";
+
+%feature("docstring")  MultiLayer::containsMagneticMaterial "bool MultiLayer::containsMagneticMaterial() const 
+";
+
+%feature("docstring")  MultiLayer::hasRoughness "bool MultiLayer::hasRoughness() const 
+";
+
+%feature("docstring")  MultiLayer::totalNofLayouts "size_t MultiLayer::totalNofLayouts() const 
+";
+
+
+// File: classMultiLayerWithRoughnessBuilder.xml
+%feature("docstring") MultiLayerWithRoughnessBuilder "
+
+Builds sample: layers with correlated roughness.
+
+C++ includes: MultiLayerWithRoughnessBuilder.h
+";
+
+%feature("docstring")  MultiLayerWithRoughnessBuilder::MultiLayerWithRoughnessBuilder "MultiLayerWithRoughnessBuilder::MultiLayerWithRoughnessBuilder()
+";
+
+%feature("docstring")  MultiLayerWithRoughnessBuilder::buildSample "MultiLayer * MultiLayerWithRoughnessBuilder::buildSample() const 
+";
+
+
+// File: classMultipleLayoutBuilder.xml
+%feature("docstring") MultipleLayoutBuilder "
+
+Builds sample: mixture of cylinders and prisms without interference using multiple particle layouts.
+
+C++ includes: MultipleLayoutBuilder.h
+";
+
+%feature("docstring")  MultipleLayoutBuilder::MultipleLayoutBuilder "MultipleLayoutBuilder::MultipleLayoutBuilder()
+";
+
+%feature("docstring")  MultipleLayoutBuilder::buildSample "MultiLayer * MultipleLayoutBuilder::buildSample() const 
+";
+
+
+// File: classExceptions_1_1NotImplementedException.xml
+%feature("docstring") Exceptions::NotImplementedException "";
+
+%feature("docstring")  Exceptions::NotImplementedException::NotImplementedException "Exceptions::NotImplementedException::NotImplementedException(const std::string &message)
+";
+
+
+// File: classExceptions_1_1NullPointerException.xml
+%feature("docstring") Exceptions::NullPointerException "";
+
+%feature("docstring")  Exceptions::NullPointerException::NullPointerException "Exceptions::NullPointerException::NullPointerException(const std::string &message)
+";
+
+
+// File: classOffSpecSimulation.xml
+%feature("docstring") OffSpecSimulation "
+
+Main class to run an off-specular simulation.
+
+C++ includes: OffSpecSimulation.h
+";
+
+%feature("docstring")  OffSpecSimulation::OffSpecSimulation "OffSpecSimulation::OffSpecSimulation()
+";
+
+%feature("docstring")  OffSpecSimulation::OffSpecSimulation "OffSpecSimulation::OffSpecSimulation(const MultiLayer &p_sample)
+";
+
+%feature("docstring")  OffSpecSimulation::OffSpecSimulation "OffSpecSimulation::OffSpecSimulation(std::shared_ptr< class IMultiLayerBuilder > p_sample_builder)
+";
+
+%feature("docstring")  OffSpecSimulation::~OffSpecSimulation "OffSpecSimulation::~OffSpecSimulation() final
+";
+
+%feature("docstring")  OffSpecSimulation::clone "OffSpecSimulation* OffSpecSimulation::clone() const 
+";
+
+%feature("docstring")  OffSpecSimulation::prepareSimulation "void OffSpecSimulation::prepareSimulation() final
+
+Put into a clean state for running a simulation. 
+";
+
+%feature("docstring")  OffSpecSimulation::numberOfSimulationElements "int OffSpecSimulation::numberOfSimulationElements() const final
+
+Gets the number of elements this simulation needs to calculate. 
+";
+
+%feature("docstring")  OffSpecSimulation::getDetectorIntensity "OutputData<double>* OffSpecSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+Returns clone of the detector intensity map. 
+";
+
+%feature("docstring")  OffSpecSimulation::getIntensityData "Histogram2D * OffSpecSimulation::getIntensityData() const
+
+Returns clone of the detector intensity map in the form of 2D histogram. 
+";
+
+%feature("docstring")  OffSpecSimulation::setBeamParameters "void OffSpecSimulation::setBeamParameters(double lambda, const IAxis &alpha_axis, double phi_i)
+
+Sets beam parameters from here (forwarded to  Instrument) 
+";
+
+%feature("docstring")  OffSpecSimulation::setDetectorParameters "void OffSpecSimulation::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+Sets detector parameters using angle ranges. 
+";
+
+%feature("docstring")  OffSpecSimulation::addParametersToExternalPool "std::string OffSpecSimulation::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const final
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+
+// File: classExceptions_1_1OutOfBoundsException.xml
+%feature("docstring") Exceptions::OutOfBoundsException "";
+
+%feature("docstring")  Exceptions::OutOfBoundsException::OutOfBoundsException "Exceptions::OutOfBoundsException::OutOfBoundsException(const std::string &message)
+";
+
+
+// File: classOutputData.xml
+%feature("docstring") OutputData "
+
+Template class to store data of any type in multi-dimensional space.Used with data type double to hold simulation results. Used with data type  CumulativeValue in  IHistogram classes. Used with data type bool to hold a detector mask (-> class  DetectorMask)
+
+C++ includes: OutputData.h
+";
+
+%feature("docstring")  OutputData::OutputData "OutputData< T >::OutputData()
+";
+
+%feature("docstring")  OutputData::OutputData "OutputData< T >::OutputData(const OutputData &)=delete
+";
+
+%feature("docstring")  OutputData::~OutputData "OutputData< T >::~OutputData()
+";
+
+%feature("docstring")  OutputData::clone "OutputData< T > * OutputData< T >::clone() const 
+";
+
+%feature("docstring")  OutputData::copyFrom "void OutputData< T >::copyFrom(const OutputData< T > &x)
+";
+
+%feature("docstring")  OutputData::copyShapeFrom "void OutputData< T >::copyShapeFrom(const OutputData< U > &other)
+";
+
+%feature("docstring")  OutputData::meanValues "OutputData< double > * OutputData< T >::meanValues() const 
+";
+
+%feature("docstring")  OutputData::addAxis "void OutputData< T >::addAxis(const IAxis &new_axis)
+";
+
+%feature("docstring")  OutputData::addAxis "void OutputData< T >::addAxis(const std::string &name, size_t size, double start, double end)
+";
+
+%feature("docstring")  OutputData::getAxis "const IAxis & OutputData< T >::getAxis(size_t serial_number) const
+
+returns axis with given serial number 
+";
+
+%feature("docstring")  OutputData::getAxis "const IAxis & OutputData< T >::getAxis(const std::string &axis_name) const
+
+returns axis with given name 
+";
+
+%feature("docstring")  OutputData::getRank "size_t OutputData< T >::getRank() const
+
+Returns number of dimensions. 
+";
+
+%feature("docstring")  OutputData::getAllocatedSize "size_t OutputData< T >::getAllocatedSize() const
+
+Returns total size of data buffer (product of bin number in every dimension). 
+";
+
+%feature("docstring")  OutputData::getAllSizes "std::vector< size_t > OutputData< T >::getAllSizes() const
+
+Returns all sizes of its axes. 
+";
+
+%feature("docstring")  OutputData::getRawDataVector "std::vector< T > OutputData< T >::getRawDataVector() const
+
+Returns copy of raw data vector. 
+";
+
+%feature("docstring")  OutputData::fillRawDataArray "void OutputData< T >::fillRawDataArray(T *destination) const
+
+fill raw array with data 
+";
+
+%feature("docstring")  OutputData::totalSum "T OutputData< T >::totalSum() const
+
+Returns sum of all values in the data structure. 
+";
+
+%feature("docstring")  OutputData::begin "OutputData< T >::iterator OutputData< T >::begin()
+
+Returns read/write iterator that points to the first element. 
+";
+
+%feature("docstring")  OutputData::begin "OutputData< T >::const_iterator OutputData< T >::begin() const
+
+Returns read-only iterator that points to the first element. 
+";
+
+%feature("docstring")  OutputData::end "iterator OutputData< T >::end()
+
+Returns read/write iterator that points to the one past last element. 
+";
+
+%feature("docstring")  OutputData::end "const_iterator OutputData< T >::end() const
+
+Returns read-only iterator that points to the one past last element. 
+";
+
+%feature("docstring")  OutputData::setVariability "void OutputData< T >::setVariability(double variability)
+";
+
+%feature("docstring")  OutputData::getVariability "double OutputData< T >::getVariability() const 
+";
+
+%feature("docstring")  OutputData::getAxesBinIndices "std::vector< int > OutputData< T >::getAxesBinIndices(size_t global_index) const
+
+Returns vector of axes indices for given global index
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+Vector of bin indices for all axes defined 
+";
+
+%feature("docstring")  OutputData::getAxisBinIndex "int OutputData< T >::getAxisBinIndex(size_t global_index, size_t i_selected_axis) const
+
+Returns axis bin index for given global index
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+i_selected_axis: 
+Serial number of selected axis.
+
+Corresponding bin index for selected axis 
+";
+
+%feature("docstring")  OutputData::getAxisBinIndex "int OutputData< T >::getAxisBinIndex(size_t global_index, const std::string &axis_name) const
+
+Returns axis bin index for given global index
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+axis_name: 
+The name of selected axis.
+
+Corresponding bin index for selected axis 
+";
+
+%feature("docstring")  OutputData::toGlobalIndex "size_t OutputData< T >::toGlobalIndex(const std::vector< int > &axes_indices) const
+
+Returns global index for specified indices of axes
+
+Parameters:
+-----------
+
+axes_indices: 
+Vector of axes indices for all specified axes in this dataset
+
+Corresponding global index 
+";
+
+%feature("docstring")  OutputData::findGlobalIndex "size_t OutputData< T >::findGlobalIndex(const std::vector< double > &coordinates) const
+
+Returns global index for specified axes values
+
+Parameters:
+-----------
+
+coordinates: 
+Vector of axes coordinates for all specified axes in this dataset
+
+Closest global index 
+";
+
+%feature("docstring")  OutputData::getAxisValue "double OutputData< T >::getAxisValue(size_t global_index, size_t i_selected_axis) const
+
+Returns the value of selected axis for given global_index.
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+i_selected_axis: 
+Serial number of selected axis.
+
+corresponding bin center of selected axis 
+";
+
+%feature("docstring")  OutputData::getAxisValue "double OutputData< T >::getAxisValue(size_t global_index, const std::string &axis_name) const
+
+Returns the value of selected axis for given global_index.
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+axis_name: 
+The name of selected axis.
+
+corresponding bin center of selected axis 
+";
+
+%feature("docstring")  OutputData::getAxesValues "std::vector< double > OutputData< T >::getAxesValues(size_t global_index) const
+
+Returns values on all defined axes for given globalbin number
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+Vector of corresponding bin centers 
+";
+
+%feature("docstring")  OutputData::getAxisBin "Bin1D OutputData< T >::getAxisBin(size_t global_index, size_t i_selected_axis) const
+
+Returns bin of selected axis for given global_index.
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+i_selected_axis: 
+Serial number of selected axis.
+
+Corresponding  Bin1D object 
+";
+
+%feature("docstring")  OutputData::getAxisBin "Bin1D OutputData< T >::getAxisBin(size_t global_index, const std::string &axis_name) const
+
+Returns bin of selected axis for given global_index.
+
+Parameters:
+-----------
+
+global_index: 
+The global index of this data structure.
+
+axis_name: 
+The name of selected axis.
+
+Corresponding  Bin1D object 
+";
+
+%feature("docstring")  OutputData::clear "void OutputData< T >::clear()
+
+Sets object into initial state (no dimensions, data) 
+";
+
+%feature("docstring")  OutputData::setAllTo "void OutputData< T >::setAllTo(const T &value)
+
+Sets content of output data to specific value. 
+";
+
+%feature("docstring")  OutputData::scaleAll "void OutputData< T >::scaleAll(const T &factor)
+
+multiply every item of this output data by value 
+";
+
+%feature("docstring")  OutputData::setAxisSizes "void OutputData< T >::setAxisSizes(size_t rank, int *n_dims)
+
+Adds 'rank' axes with indicated sizes. 
+";
+
+%feature("docstring")  OutputData::setRawDataVector "void OutputData< T >::setRawDataVector(const std::vector< T > &data_vector)
+
+Sets new values to raw data vector. 
+";
+
+%feature("docstring")  OutputData::setRawDataArray "void OutputData< T >::setRawDataArray(const T *source)
+
+Sets new values to raw data array. 
+";
+
+%feature("docstring")  OutputData::getValue "double OutputData< T >::getValue(size_t index) const
+
+Returns value or summed value, depending on T. 
+";
+
+%feature("docstring")  OutputData::hasSameDimensions "bool OutputData< T >::hasSameDimensions(const OutputData< U > &right) const
+
+Returns true if object have same dimensions and number of axes bins.
+
+Returns true if object have same dimensions. 
+";
+
+%feature("docstring")  OutputData::hasSameShape "bool OutputData< T >::hasSameShape(const OutputData< U > &right) const
+
+Returns true if objects a) have same dimensions b) bin boundaries of axes coincide.
+
+Returns true if object have same dimensions and shape of axis. 
+";
+
+%feature("docstring")  OutputData::isInitialized "bool OutputData< T >::isInitialized() const
+
+returns data as Python numpy array
+
+returns true if object is correctly initialized 
+";
+
+%feature("docstring")  OutputData::allocate "void OutputData< T >::allocate()
+
+memory allocation for current dimensions configuration 
+";
+
+
+// File: classOutputDataIterator.xml
+%feature("docstring") OutputDataIterator "
+
+Iterator for underlying  OutputData container.
+
+C++ includes: OutputDataIterator.h
+";
+
+%feature("docstring")  OutputDataIterator::OutputDataIterator "OutputDataIterator< TValue, TContainer >::OutputDataIterator()
+
+Empty constructor to comply with stl forward iterators. 
+";
+
+%feature("docstring")  OutputDataIterator::OutputDataIterator "OutputDataIterator< TValue, TContainer >::OutputDataIterator(TContainer *p_output_data, size_t start_at_index=0)
+
+constructor 
+";
+
+%feature("docstring")  OutputDataIterator::OutputDataIterator "OutputDataIterator< TValue, TContainer >::OutputDataIterator(const OutputDataIterator< TValue2, TContainer2 > &other)
+
+templated copy construction 
+";
+
+%feature("docstring")  OutputDataIterator::OutputDataIterator "OutputDataIterator< TValue, TContainer >::OutputDataIterator(const OutputDataIterator< TValue, TContainer > &other)
+
+non-templated copy construction 
+";
+
+%feature("docstring")  OutputDataIterator::~OutputDataIterator "OutputDataIterator< TValue, TContainer >::~OutputDataIterator()
+";
+
+%feature("docstring")  OutputDataIterator::getIndex "size_t OutputDataIterator< TValue, TContainer >::getIndex() const
+
+Returns current index. 
+";
+
+%feature("docstring")  OutputDataIterator::getContainer "TContainer* OutputDataIterator< TValue, TContainer >::getContainer() const
+
+Returns container pointer. 
+";
+
+%feature("docstring")  OutputDataIterator::swap "void OutputDataIterator< TValue, TContainer >::swap(OutputDataIterator< TValue, TContainer > &other)
+
+Swaps iterators. 
+";
+
+
+// File: classOutputDataReader.xml
+%feature("docstring") OutputDataReader "
+
+Reads  OutputData from file using different reading strategies.
+
+C++ includes: OutputDataReader.h
+";
+
+%feature("docstring")  OutputDataReader::OutputDataReader "OutputDataReader::OutputDataReader(const std::string &file_name)
+";
+
+%feature("docstring")  OutputDataReader::getOutputData "OutputData< double > * OutputDataReader::getOutputData()
+
+read output data from file (file name was set already from OutputDataIOFactory) 
+";
+
+%feature("docstring")  OutputDataReader::setStrategy "void OutputDataReader::setStrategy(IOutputDataReadStrategy *read_strategy)
+
+Sets concrete reading strategy. 
+";
+
+
+// File: classOutputDataReadFactory.xml
+%feature("docstring") OutputDataReadFactory "
+
+Creates reader appropariate for given type of files.
+
+C++ includes: OutputDataReadFactory.h
+";
+
+
+// File: classOutputDataReadINTStrategy.xml
+%feature("docstring") OutputDataReadINTStrategy "
+
+Strategy to read BornAgain native IntensityData from ASCII file.
+
+C++ includes: OutputDataReadStrategy.h
+";
+
+%feature("docstring")  OutputDataReadINTStrategy::readOutputData "OutputData< double > * OutputDataReadINTStrategy::readOutputData(std::istream &input_stream)
+";
+
+
+// File: classOutputDataReadNumpyTXTStrategy.xml
+%feature("docstring") OutputDataReadNumpyTXTStrategy "
+
+Strategy to read  OutputData from simple ASCII file with the layout as in numpy.savetxt.
+
+C++ includes: OutputDataReadStrategy.h
+";
+
+%feature("docstring")  OutputDataReadNumpyTXTStrategy::readOutputData "OutputData< double > * OutputDataReadNumpyTXTStrategy::readOutputData(std::istream &input_stream)
+";
+
+
+// File: classOutputDataWriteFactory.xml
+%feature("docstring") OutputDataWriteFactory "
+
+Creates writer appropariate for given type of files.
+
+C++ includes: OutputDataWriteFactory.h
+";
+
+
+// File: classOutputDataWriteINTStrategy.xml
+%feature("docstring") OutputDataWriteINTStrategy "
+
+Strategy to write  OutputData to special BornAgain ASCII format.
+
+C++ includes: OutputDataWriteStrategy.h
+";
+
+%feature("docstring")  OutputDataWriteINTStrategy::writeOutputData "void OutputDataWriteINTStrategy::writeOutputData(const OutputData< double > &data, std::ostream &output_stream)
+";
+
+
+// File: classOutputDataWriteNumpyTXTStrategy.xml
+%feature("docstring") OutputDataWriteNumpyTXTStrategy "
+
+Strategy to write  OutputData to simple ASCII file with the layout as in numpy.savetxt.
+
+C++ includes: OutputDataWriteStrategy.h
+";
+
+%feature("docstring")  OutputDataWriteNumpyTXTStrategy::writeOutputData "void OutputDataWriteNumpyTXTStrategy::writeOutputData(const OutputData< double > &data, std::ostream &output_stream)
+";
+
+
+// File: classOutputDataWriter.xml
+%feature("docstring") OutputDataWriter "
+
+Write  OutputData to file using different witing strategies.
+
+C++ includes: OutputDataWriter.h
+";
+
+%feature("docstring")  OutputDataWriter::OutputDataWriter "OutputDataWriter::OutputDataWriter(const std::string &file_name)
+";
+
+%feature("docstring")  OutputDataWriter::writeOutputData "void OutputDataWriter::writeOutputData(const OutputData< double > &data)
+
+write output data to file 
+";
+
+%feature("docstring")  OutputDataWriter::setStrategy "void OutputDataWriter::setStrategy(IOutputDataWriteStrategy *write_strategy)
+
+Sets concrete writing strategy. 
+";
+
+
+// File: classParameterDistribution.xml
+%feature("docstring") ParameterDistribution "";
+
+%feature("docstring")  ParameterDistribution::ParameterDistribution "ParameterDistribution::ParameterDistribution(const std::string &par_name, const IDistribution1D &distribution, size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits())
+";
+
+%feature("docstring")  ParameterDistribution::ParameterDistribution "ParameterDistribution::ParameterDistribution(const std::string &par_name, const IDistribution1D &distribution, size_t nbr_samples, double xmin, double xmax)
+";
+
+%feature("docstring")  ParameterDistribution::ParameterDistribution "ParameterDistribution::ParameterDistribution(const ParameterDistribution &other)
+";
+
+%feature("docstring")  ParameterDistribution::~ParameterDistribution "ParameterDistribution::~ParameterDistribution()
+";
+
+%feature("docstring")  ParameterDistribution::linkParameter "ParameterDistribution & ParameterDistribution::linkParameter(std::string par_name)
+";
+
+%feature("docstring")  ParameterDistribution::getMainParameterName "std::string ParameterDistribution::getMainParameterName() const
+
+get the main parameter's name 
+";
+
+%feature("docstring")  ParameterDistribution::getNbrSamples "size_t ParameterDistribution::getNbrSamples() const
+
+get number of samples for this distribution 
+";
+
+%feature("docstring")  ParameterDistribution::getSigmaFactor "double ParameterDistribution::getSigmaFactor() const
+
+get the sigma factor 
+";
+
+%feature("docstring")  ParameterDistribution::getDistribution "const IDistribution1D * ParameterDistribution::getDistribution() const 
+";
+
+%feature("docstring")  ParameterDistribution::generateSamples "std::vector< ParameterSample > ParameterDistribution::generateSamples() const
+
+generate list of sampled values with their weight 
+";
+
+%feature("docstring")  ParameterDistribution::getLinkedParameterNames "std::vector<std::string> ParameterDistribution::getLinkedParameterNames() const
+
+get list of linked parameter names 
+";
+
+%feature("docstring")  ParameterDistribution::getLimits "RealLimits ParameterDistribution::getLimits() const 
+";
+
+%feature("docstring")  ParameterDistribution::getMinValue "double ParameterDistribution::getMinValue() const 
+";
+
+%feature("docstring")  ParameterDistribution::getMaxValue "double ParameterDistribution::getMaxValue() const 
+";
+
+
+// File: classParameterPattern.xml
+%feature("docstring") ParameterPattern "
+
+Helper class for constructing parameter patterns.
+
+C++ includes: ParameterPattern.h
+";
+
+%feature("docstring")  ParameterPattern::ParameterPattern "ParameterPattern::ParameterPattern()
+";
+
+%feature("docstring")  ParameterPattern::ParameterPattern "ParameterPattern::ParameterPattern(std::string root_object)
+";
+
+%feature("docstring")  ParameterPattern::beginsWith "ParameterPattern & ParameterPattern::beginsWith(std::string start_type)
+";
+
+%feature("docstring")  ParameterPattern::add "ParameterPattern & ParameterPattern::add(std::string object_type)
+";
+
+%feature("docstring")  ParameterPattern::toStdString "std::string ParameterPattern::toStdString() const 
+";
+
+
+// File: classParameterPool.xml
+%feature("docstring") ParameterPool "
+
+Holds a map of pointers to parameters.Used in  IParameterized, which has a member ParameterPool* m_pool. So this is pimpl (pointer to implementation) idiom, with  ParameterPool providing the implementation of all the nontrivial functionality of  IParameterized.
+
+Parameter names must be unique since we use them as map keys.
+
+C++ includes: ParameterPool.h
+";
+
+%feature("docstring")  ParameterPool::ParameterPool "ParameterPool::ParameterPool(const std::string &name, const std::function< void()> &onChange)
+
+Constructs an empty parameter pool. 
+";
+
+%feature("docstring")  ParameterPool::ParameterPool "ParameterPool::ParameterPool(const ParameterPool &)=delete
+";
+
+%feature("docstring")  ParameterPool::~ParameterPool "ParameterPool::~ParameterPool()
+";
+
+%feature("docstring")  ParameterPool::clone "ParameterPool * ParameterPool::clone() const
+
+Returns a literal clone. 
+";
+
+%feature("docstring")  ParameterPool::cloneWithPrefix "ParameterPool * ParameterPool::cloneWithPrefix(const std::string &prefix) const
+
+Returns a clone with  prefix prepended to every parameter key. 
+";
+
+%feature("docstring")  ParameterPool::copyToExternalPool "void ParameterPool::copyToExternalPool(const std::string &prefix, ParameterPool *external_pool) const
+
+Copies parameters of given pool to  other pool, prepeding  prefix to the parameter names. 
+";
+
+%feature("docstring")  ParameterPool::clear "void ParameterPool::clear()
+
+Clears the parameter map. 
+";
+
+%feature("docstring")  ParameterPool::getName "std::string ParameterPool::getName() const 
+";
+
+%feature("docstring")  ParameterPool::size "size_t ParameterPool::size() const
+
+Returns number of parameters in the pool. 
+";
+
+%feature("docstring")  ParameterPool::addParameter "RealParameter & ParameterPool::addParameter(RealParameter *par)
+
+Adds parameter to the pool, and returns reference to the input pointer.
+
+Returning the input pointer allows us to concatenate function calls like pool->addParameter( new  RealParameter(...) ).setLimits(-1,+1).setFixed().setUnit(\"nm\") 
+";
+
+%feature("docstring")  ParameterPool::getParameter "RealParameter * ParameterPool::getParameter(const std::string &name)
+
+Returns parameter with given  name. 
+";
+
+%feature("docstring")  ParameterPool::getParameter "const RealParameter * ParameterPool::getParameter(const std::string &name) const
+
+Returns parameter with given  name. 
+";
+
+%feature("docstring")  ParameterPool::getParameters "const std::vector<RealParameter*> ParameterPool::getParameters() const
+
+Returns full vector of parameters. 
+";
+
+%feature("docstring")  ParameterPool::getMatchedParameters "std::vector< RealParameter * > ParameterPool::getMatchedParameters(const std::string &wildcards) const
+
+Returns vector of parameters that match the  pattern (wildcards '*' allowed). 
+";
+
+%feature("docstring")  ParameterPool::setParameterValue "void ParameterPool::setParameterValue(const std::string &name, double value)
+
+Sets parameter value. 
+";
+
+%feature("docstring")  ParameterPool::setMatchedParametersValue "int ParameterPool::setMatchedParametersValue(const std::string &wildcards, double value)
+
+Sets parameter value. 
+";
+
+%feature("docstring")  ParameterPool::getParameterNames "std::vector< std::string > ParameterPool::getParameterNames() const 
+";
+
+
+// File: classParameterSample.xml
+%feature("docstring") ParameterSample "
+
+Represents a sampled parameter value with its weight.
+
+C++ includes: ParameterSample.h
+";
+
+
+// File: classParticle.xml
+%feature("docstring") Particle "
+
+A particle with a form factor and refractive index.
+
+C++ includes: Particle.h
+";
+
+%feature("docstring")  Particle::Particle "Particle::Particle()
+";
+
+%feature("docstring")  Particle::Particle "Particle::Particle(const IMaterial &p_material)
+";
+
+%feature("docstring")  Particle::Particle "Particle::Particle(const IMaterial &p_material, const IFormFactor &form_factor)
+";
+
+%feature("docstring")  Particle::Particle "Particle::Particle(const IMaterial &p_material, const IFormFactor &form_factor, const IRotation &rotation)
+";
+
+%feature("docstring")  Particle::clone "Particle * Particle::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  Particle::cloneInvertB "Particle * Particle::cloneInvertB() const
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  Particle::accept "virtual void Particle::accept(ISampleVisitor *visitor) const
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  Particle::to_str "std::string Particle::to_str(int indent=0) const
+
+Returns textual representation of this and its descendants. 
+";
+
+%feature("docstring")  Particle::setAmbientMaterial "void Particle::setAmbientMaterial(const IMaterial &material) final
+
+Sets the refractive index of the ambient material (which influences its scattering power) 
+";
+
+%feature("docstring")  Particle::getAmbientMaterial "const IMaterial* Particle::getAmbientMaterial() const final
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  Particle::createTransformedFormFactor "IFormFactor * Particle::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+Create a form factor for this particle with an extra scattering factor. 
+";
+
+%feature("docstring")  Particle::setMaterial "void Particle::setMaterial(const IMaterial &material)
+";
+
+%feature("docstring")  Particle::getMaterial "const IMaterial* Particle::getMaterial() const
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  Particle::getRefractiveIndex "complex_t Particle::getRefractiveIndex() const 
+";
+
+%feature("docstring")  Particle::setFormFactor "void Particle::setFormFactor(const IFormFactor &form_factor)
+";
+
+%feature("docstring")  Particle::getFormFactor "const IFormFactor* Particle::getFormFactor() const 
+";
+
+
+// File: classParticleComposition.xml
+%feature("docstring") ParticleComposition "
+
+A composition of particles at fixed positions
+
+C++ includes: ParticleComposition.h
+";
+
+%feature("docstring")  ParticleComposition::ParticleComposition "ParticleComposition::ParticleComposition()
+";
+
+%feature("docstring")  ParticleComposition::ParticleComposition "ParticleComposition::ParticleComposition(const IParticle &particle)
+";
+
+%feature("docstring")  ParticleComposition::ParticleComposition "ParticleComposition::ParticleComposition(const IParticle &particle, kvector_t position)
+";
+
+%feature("docstring")  ParticleComposition::ParticleComposition "ParticleComposition::ParticleComposition(const IParticle &particle, std::vector< kvector_t > positions)
+";
+
+%feature("docstring")  ParticleComposition::~ParticleComposition "ParticleComposition::~ParticleComposition()
+";
+
+%feature("docstring")  ParticleComposition::clone "ParticleComposition * ParticleComposition::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  ParticleComposition::cloneInvertB "ParticleComposition * ParticleComposition::cloneInvertB() const
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  ParticleComposition::accept "virtual void ParticleComposition::accept(ISampleVisitor *visitor) const
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  ParticleComposition::addParticle "void ParticleComposition::addParticle(const IParticle &particle)
+";
+
+%feature("docstring")  ParticleComposition::addParticle "void ParticleComposition::addParticle(const IParticle &particle, kvector_t position)
+";
+
+%feature("docstring")  ParticleComposition::addParticles "void ParticleComposition::addParticles(const IParticle &particle, std::vector< kvector_t > positions)
+";
+
+%feature("docstring")  ParticleComposition::setAmbientMaterial "void ParticleComposition::setAmbientMaterial(const IMaterial &material)
+
+Sets the refractive index of the ambient material (which influences its scattering power) 
+";
+
+%feature("docstring")  ParticleComposition::getAmbientMaterial "const IMaterial * ParticleComposition::getAmbientMaterial() const
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  ParticleComposition::createTransformedFormFactor "IFormFactor * ParticleComposition::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+Create a form factor for this particle with an extra scattering factor. 
+";
+
+%feature("docstring")  ParticleComposition::getNbrParticles "size_t ParticleComposition::getNbrParticles() const
+
+Returns number of different particles. 
+";
+
+%feature("docstring")  ParticleComposition::getParticle "const IParticle * ParticleComposition::getParticle(size_t index) const
+
+Returns particle with given index. 
+";
+
+%feature("docstring")  ParticleComposition::getParticlePosition "kvector_t ParticleComposition::getParticlePosition(size_t index) const 
+";
+
+
+// File: classParticleCompositionBuilder.xml
+%feature("docstring") ParticleCompositionBuilder "
+
+Builds sample: two layers of spheres at hex lattice.
+
+C++ includes: ParticleCompositionBuilder.h
+";
+
+%feature("docstring")  ParticleCompositionBuilder::ParticleCompositionBuilder "ParticleCompositionBuilder::ParticleCompositionBuilder()
+";
+
+%feature("docstring")  ParticleCompositionBuilder::buildSample "MultiLayer * ParticleCompositionBuilder::buildSample() const 
+";
+
+
+// File: classParticleCoreShell.xml
+%feature("docstring") ParticleCoreShell "
+
+A particle with a core/shell geometry.
+
+C++ includes: ParticleCoreShell.h
+";
+
+%feature("docstring")  ParticleCoreShell::ParticleCoreShell "ParticleCoreShell::ParticleCoreShell(const Particle &shell, const Particle &core, kvector_t relative_core_position=kvector_t(0.0, 0.0, 0.0))
+";
+
+%feature("docstring")  ParticleCoreShell::~ParticleCoreShell "ParticleCoreShell::~ParticleCoreShell()
+";
+
+%feature("docstring")  ParticleCoreShell::clone "ParticleCoreShell * ParticleCoreShell::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  ParticleCoreShell::cloneInvertB "ParticleCoreShell * ParticleCoreShell::cloneInvertB() const
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  ParticleCoreShell::accept "virtual void ParticleCoreShell::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  ParticleCoreShell::setAmbientMaterial "void ParticleCoreShell::setAmbientMaterial(const IMaterial &material)
+
+Sets the refractive index of the ambient material (which influences its scattering power) 
+";
+
+%feature("docstring")  ParticleCoreShell::getAmbientMaterial "const IMaterial * ParticleCoreShell::getAmbientMaterial() const
+
+Returns nullptr, unless overwritten to return a specific material. 
+";
+
+%feature("docstring")  ParticleCoreShell::createTransformedFormFactor "IFormFactor * ParticleCoreShell::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+Create a form factor for this particle with an extra scattering factor. 
+";
+
+%feature("docstring")  ParticleCoreShell::getCoreParticle "const Particle* ParticleCoreShell::getCoreParticle() const
+
+Returns the core particle. 
+";
+
+%feature("docstring")  ParticleCoreShell::getShellParticle "const Particle* ParticleCoreShell::getShellParticle() const
+
+Returns the shell particle. 
+";
+
+
+// File: classParticleDistribution.xml
+%feature("docstring") ParticleDistribution "
+
+A particle type that is a parametric distribution of  IParticle's.
+
+C++ includes: ParticleDistribution.h
+";
+
+%feature("docstring")  ParticleDistribution::ParticleDistribution "ParticleDistribution::ParticleDistribution(const IParticle &prototype, const ParameterDistribution &par_distr)
+";
+
+%feature("docstring")  ParticleDistribution::clone "ParticleDistribution * ParticleDistribution::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  ParticleDistribution::cloneInvertB "ParticleDistribution * ParticleDistribution::cloneInvertB() const
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  ParticleDistribution::accept "void ParticleDistribution::accept(ISampleVisitor *visitor) const
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  ParticleDistribution::to_str "std::string ParticleDistribution::to_str(int indent=0) const
+
+Returns textual representation of* this and its descendants. 
+";
+
+%feature("docstring")  ParticleDistribution::setAmbientMaterial "void ParticleDistribution::setAmbientMaterial(const IMaterial &material)
+
+Sets the refractive index of the ambient material (which influences its scattering power) 
+";
+
+%feature("docstring")  ParticleDistribution::getAmbientMaterial "const IMaterial * ParticleDistribution::getAmbientMaterial() const
+
+Returns particle's material. 
+";
+
+%feature("docstring")  ParticleDistribution::generateParticles "void ParticleDistribution::generateParticles(std::vector< const IParticle * > &particle_vector) const
+
+Initializes list of new particles generated according to a distribution. 
+";
+
+%feature("docstring")  ParticleDistribution::getParameterDistribution "ParameterDistribution ParticleDistribution::getParameterDistribution() const
+
+Returns the distributed parameter data. 
+";
+
+%feature("docstring")  ParticleDistribution::createDistributedParameterPool "ParameterPool * ParticleDistribution::createDistributedParameterPool() const
+
+Returns the parameter pool that can be used for parameter distributions. 
+";
+
+%feature("docstring")  ParticleDistribution::getParticle "const IParticle * ParticleDistribution::getParticle() const
+
+Returns particle. 
+";
+
+
+// File: classParticleInTheAirBuilder.xml
+%feature("docstring") ParticleInTheAirBuilder "
+
+The  ParticleInTheAirBuilder class generates a multilayer with single air layer populated with particles of certain types. Requires IComponentService which generates form factors, used for bulk form factors testing.
+
+C++ includes: ParticleInTheAirBuilder.h
+";
+
+%feature("docstring")  ParticleInTheAirBuilder::ParticleInTheAirBuilder "ParticleInTheAirBuilder::ParticleInTheAirBuilder()
+";
+
+%feature("docstring")  ParticleInTheAirBuilder::~ParticleInTheAirBuilder "virtual ParticleInTheAirBuilder::~ParticleInTheAirBuilder()
+";
+
+%feature("docstring")  ParticleInTheAirBuilder::buildSample "MultiLayer * ParticleInTheAirBuilder::buildSample() const 
+";
+
+
+// File: classParticleLayout.xml
+%feature("docstring") ParticleLayout "
+
+Decorator class that adds particles to  ISample objects.
+
+C++ includes: ParticleLayout.h
+";
+
+%feature("docstring")  ParticleLayout::ParticleLayout "ParticleLayout::ParticleLayout()
+";
+
+%feature("docstring")  ParticleLayout::ParticleLayout "ParticleLayout::ParticleLayout(const IAbstractParticle &particle)
+";
+
+%feature("docstring")  ParticleLayout::ParticleLayout "ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance)
+";
+
+%feature("docstring")  ParticleLayout::~ParticleLayout "ParticleLayout::~ParticleLayout() final
+";
+
+%feature("docstring")  ParticleLayout::clone "ParticleLayout * ParticleLayout::clone() const final
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  ParticleLayout::cloneInvertB "ParticleLayout * ParticleLayout::cloneInvertB() const final
+
+Returns a clone with inverted magnetic fields. 
+";
+
+%feature("docstring")  ParticleLayout::accept "void ParticleLayout::accept(ISampleVisitor *visitor) const final
+
+calls the  ISampleVisitor's visit method 
+";
+
+%feature("docstring")  ParticleLayout::addParticle "void ParticleLayout::addParticle(const IAbstractParticle &particle)
+
+Adds generic particle to the layout. 
+";
+
+%feature("docstring")  ParticleLayout::addParticle "void ParticleLayout::addParticle(const IAbstractParticle &particle, double abundance)
+
+Adds generic particle to the layout with only abundance defined.
+
+Parameters:
+-----------
+
+particle: 
+to be added
+
+abundance: 
+ Particle abundance 
+";
+
+%feature("docstring")  ParticleLayout::addParticle "void ParticleLayout::addParticle(const IParticle &particle, double abundance, const kvector_t position)
+
+Adds particle to the layout with abundance and position defined.
+
+Parameters:
+-----------
+
+particle: 
+to be added
+
+abundance: 
+ Particle abundance
+
+position: 
+ Particle position 
+";
+
+%feature("docstring")  ParticleLayout::addParticle "void ParticleLayout::addParticle(const IParticle &particle, double abundance, const kvector_t position, const IRotation &rotation)
+
+Adds particle to the layout with abundance, position and the rotation defined.
+
+Parameters:
+-----------
+
+particle: 
+to be added
+
+abundance: 
+ Particle abundance
+
+position: 
+ Particle position
+
+rotation: 
+ Particle rotation 
+";
+
+%feature("docstring")  ParticleLayout::getNumberOfParticles "size_t ParticleLayout::getNumberOfParticles() const final
+
+Returns number of particles. 
+";
+
+%feature("docstring")  ParticleLayout::getParticle "const IAbstractParticle * ParticleLayout::getParticle(size_t index) const final
+
+Returns particle info. 
+";
+
+%feature("docstring")  ParticleLayout::getParticles "SafePointerVector< const IParticle > ParticleLayout::getParticles() const final
+
+Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection 
+";
+
+%feature("docstring")  ParticleLayout::getAbundanceOfParticle "double ParticleLayout::getAbundanceOfParticle(size_t index) const
+
+Returns the abundance fraction of particle at given index. 
+";
+
+%feature("docstring")  ParticleLayout::getInterferenceFunction "const IInterferenceFunction* ParticleLayout::getInterferenceFunction() const final
+
+Returns interference function. 
+";
+
+%feature("docstring")  ParticleLayout::cloneInterferenceFunction "IInterferenceFunction * ParticleLayout::cloneInterferenceFunction() const final
+
+Returns a clone, or an  InterferenceFunctionNone. 
+";
+
+%feature("docstring")  ParticleLayout::addInterferenceFunction "void ParticleLayout::addInterferenceFunction(const IInterferenceFunction &interference_function)
+
+Adds interference functions. 
+";
+
+%feature("docstring")  ParticleLayout::getTotalParticleSurfaceDensity "double ParticleLayout::getTotalParticleSurfaceDensity() const final
+
+Returns surface density of all particles. 
+";
+
+%feature("docstring")  ParticleLayout::setTotalParticleSurfaceDensity "void ParticleLayout::setTotalParticleSurfaceDensity(double particle_density) final
+
+Sets surface density of all particles. 
+";
+
+
+// File: classGeometry_1_1Polygon.xml
+%feature("docstring") Geometry::Polygon "
+
+A polygon in 2D space.Polygon defined by two arrays with x and y coordinates of points. Sizes of arrays should coincide. If polygon is unclosed (the last point doesn't repeat the first one), it will be closed automatically.
+
+C++ includes: Polygon.h
+";
+
+%feature("docstring")  Geometry::Polygon::Polygon "Geometry::Polygon::Polygon(const std::vector< double > &x, const std::vector< double > &y)
+
+Parameters:
+-----------
+
+x: 
+Vector of x-coordinates of polygon points.
+
+y: 
+Vector of y-coordinates of polygon points. 
+";
+
+%feature("docstring")  Geometry::Polygon::Polygon "Geometry::Polygon::Polygon(const std::vector< std::vector< double >> &points)
+
+Polygon defined by two dimensional array with (x,y) coordinates of polygon points. The size of second dimension should be 2. If polygon is unclosed (the last point doesn't repeat the first one), it will be closed automatically.
+
+Parameters:
+-----------
+
+points: 
+Two dimensional vector of (x,y) coordinates of polygon points. 
+";
+
+%feature("docstring")  Geometry::Polygon::Polygon "Geometry::Polygon::Polygon(const PolygonPrivate *d)
+";
+
+%feature("docstring")  Geometry::Polygon::~Polygon "Geometry::Polygon::~Polygon()
+";
+
+%feature("docstring")  Geometry::Polygon::clone "virtual Polygon* Geometry::Polygon::clone() const 
+";
+
+%feature("docstring")  Geometry::Polygon::contains "bool Geometry::Polygon::contains(double x, double y) const
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::Polygon::contains "bool Geometry::Polygon::contains(const Bin1D &binx, const Bin1D &biny) const
+
+Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+";
+
+%feature("docstring")  Geometry::Polygon::getArea "double Geometry::Polygon::getArea() const 
+";
+
+%feature("docstring")  Geometry::Polygon::getPoints "void Geometry::Polygon::getPoints(std::vector< double > &xpos, std::vector< double > &ypos) const 
+";
+
+
+// File: classPolygonalTopology.xml
+%feature("docstring") PolygonalTopology "
+
+For internal use in  PolyhedralFace.
+
+C++ includes: FormFactorPolyhedron.h
+";
+
+
+// File: classGeometry_1_1PolygonPrivate.xml
+%feature("docstring") Geometry::PolygonPrivate "
+
+The private data for polygons to hide boost dependency from the header. 
+";
+
+%feature("docstring")  Geometry::PolygonPrivate::init_from "void Geometry::PolygonPrivate::init_from(const std::vector< double > &x, const std::vector< double > &y)
+";
+
+%feature("docstring")  Geometry::PolygonPrivate::get_points "void Geometry::PolygonPrivate::get_points(std::vector< double > &xpos, std::vector< double > &ypos)
+";
+
+
+// File: classPolyhedralEdge.xml
+%feature("docstring") PolyhedralEdge "
+
+One edge of a polygon, for form factor computation.
+
+C++ includes: FormFactorPolyhedron.h
+";
+
+%feature("docstring")  PolyhedralEdge::PolyhedralEdge "PolyhedralEdge::PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig)
+";
+
+%feature("docstring")  PolyhedralEdge::E "kvector_t PolyhedralEdge::E() const 
+";
+
+%feature("docstring")  PolyhedralEdge::R "kvector_t PolyhedralEdge::R() const 
+";
+
+%feature("docstring")  PolyhedralEdge::qE "complex_t PolyhedralEdge::qE(cvector_t q) const 
+";
+
+%feature("docstring")  PolyhedralEdge::qR "complex_t PolyhedralEdge::qR(cvector_t q) const 
+";
+
+%feature("docstring")  PolyhedralEdge::contrib "complex_t PolyhedralEdge::contrib(int m, const cvector_t qpa, complex_t qrperp) const
+
+Returns sum_l=0^M/2 u^2l v^(M-2l) / (2l+1)!(M-2l)! - vperp^M/M! 
+";
+
+
+// File: classPolyhedralFace.xml
+%feature("docstring") PolyhedralFace "
+
+A polygon, for form factor computation.
+
+C++ includes: FormFactorPolyhedron.h
+";
+
+%feature("docstring")  PolyhedralFace::PolyhedralFace "PolyhedralFace::PolyhedralFace(const std::vector< kvector_t > &_V=std::vector< kvector_t >(), bool _sym_S2=false)
+
+Sets internal variables for given vertex chain.
+
+Parameters:
+-----------
+
+V: 
+oriented vertex list
+
+_sym_S2: 
+true if face has a perpedicular two-fold symmetry axis 
+";
+
+%feature("docstring")  PolyhedralFace::area "double PolyhedralFace::area() const 
+";
+
+%feature("docstring")  PolyhedralFace::center "kvector_t PolyhedralFace::center() const 
+";
+
+%feature("docstring")  PolyhedralFace::pyramidalVolume "double PolyhedralFace::pyramidalVolume() const 
+";
+
+%feature("docstring")  PolyhedralFace::radius3d "double PolyhedralFace::radius3d() const 
+";
+
+%feature("docstring")  PolyhedralFace::normalProjectionConj "complex_t PolyhedralFace::normalProjectionConj(cvector_t q) const
+
+Returns conj(q)*normal [ BasicVector3D::dot is antilinear in 'this' argument]. 
+";
+
+%feature("docstring")  PolyhedralFace::ff_n "complex_t PolyhedralFace::ff_n(int m, const cvector_t q) const
+
+Returns contribution qn*f_n [of order q^(n+1)] from this face to the polyhedral form factor. 
+";
+
+%feature("docstring")  PolyhedralFace::ff "complex_t PolyhedralFace::ff(const cvector_t q, const bool sym_Ci) const
+
+Returns the contribution ff(q) of this face to the polyhedral form factor. 
+";
+
+%feature("docstring")  PolyhedralFace::ff_2D "complex_t PolyhedralFace::ff_2D(const cvector_t qpa) const
+
+Returns the two-dimensional form factor of this face, for use in a prism. 
+";
+
+%feature("docstring")  PolyhedralFace::assert_Ci "void PolyhedralFace::assert_Ci(const PolyhedralFace &other) const
+
+Throws if deviation from inversion symmetry is detected. Does not check vertices. 
+";
+
+
+// File: classPolyhedralTopology.xml
+%feature("docstring") PolyhedralTopology "
+
+For internal use in  FormFactorPolyhedron.
+
+C++ includes: FormFactorPolyhedron.h
+";
+
+
+// File: classPrecomputed.xml
+%feature("docstring") Precomputed "
+
+This class contains precomputed constants.
+
+C++ includes: Precomputed.h
+";
+
+
+// File: classProgressHandler.xml
+%feature("docstring") ProgressHandler "
+
+Maintains information about progress of a computation. Owner is the computation, which periodically calls the thread-safe function incrementDone(..). An application (GUI or script) may subscribe(..) to be informed about progress. It is then periodically called back by inform(..). The return value of inform(..) can be used to request termination of the computation.
+
+C++ includes: ProgressHandler.h
+";
+
+%feature("docstring")  ProgressHandler::ProgressHandler "ProgressHandler::ProgressHandler()
+";
+
+%feature("docstring")  ProgressHandler::ProgressHandler "ProgressHandler::ProgressHandler(const ProgressHandler &other)
+";
+
+%feature("docstring")  ProgressHandler::subscribe "void ProgressHandler::subscribe(ProgressHandler::Callback_t callback)
+";
+
+%feature("docstring")  ProgressHandler::reset "void ProgressHandler::reset()
+";
+
+%feature("docstring")  ProgressHandler::setExpectedNTicks "void ProgressHandler::setExpectedNTicks(size_t n)
+";
+
+%feature("docstring")  ProgressHandler::incrementDone "void ProgressHandler::incrementDone(size_t ticks_done)
+
+Increments number of completed computation steps (ticks). Performs callback (method m_inform) to inform the subscriber about the state of the computation and to obtain as return value a flag that indicates whether to continue the computation. 
+";
+
+%feature("docstring")  ProgressHandler::alive "bool ProgressHandler::alive()
+";
+
+
+// File: classRadialParaCrystalBuilder.xml
+%feature("docstring") RadialParaCrystalBuilder "
+
+Builds sample: cylinders with 1DDL structure factor (IsGISAXS example #4)
+
+C++ includes: ParaCrystalBuilder.h
+";
+
+%feature("docstring")  RadialParaCrystalBuilder::RadialParaCrystalBuilder "RadialParaCrystalBuilder::RadialParaCrystalBuilder()
+";
+
+%feature("docstring")  RadialParaCrystalBuilder::buildSample "MultiLayer * RadialParaCrystalBuilder::buildSample() const 
+";
+
+
+// File: classRealParameter.xml
+%feature("docstring") RealParameter "
+
+Wraps a parameter of type double. In addition to name and on-change callback held by the parent class  IParameter, this class holds Limits, Attributes (currently only fixed or not), and a  Unit.
+
+C++ includes: RealParameter.h
+";
+
+%feature("docstring")  RealParameter::RealParameter "RealParameter::RealParameter(const std::string &name, volatile double *par, const std::string &parent_name, const std::function< void()> &onChange, const RealLimits &limits=RealLimits::limitless(), const Attributes &attr=Attributes::free())
+";
+
+%feature("docstring")  RealParameter::clone "RealParameter * RealParameter::clone(const std::string &new_name=\"\") const 
+";
+
+%feature("docstring")  RealParameter::setValue "void RealParameter::setValue(double value)
+
+Sets value of wrapped parameter and emit signal. 
+";
+
+%feature("docstring")  RealParameter::getValue "double RealParameter::getValue() const
+
+Returns value of wrapped parameter. 
+";
+
+%feature("docstring")  RealParameter::setLimits "RealParameter& RealParameter::setLimits(const RealLimits &limits)
+";
+
+%feature("docstring")  RealParameter::getLimits "RealLimits RealParameter::getLimits() const 
+";
+
+%feature("docstring")  RealParameter::setLimited "RealParameter & RealParameter::setLimited(double lower, double upper)
+";
+
+%feature("docstring")  RealParameter::setPositive "RealParameter & RealParameter::setPositive()
+";
+
+%feature("docstring")  RealParameter::setNonnegative "RealParameter & RealParameter::setNonnegative()
+";
+
+%feature("docstring")  RealParameter::setUnit "RealParameter& RealParameter::setUnit(const std::string &name)
+";
+
+%feature("docstring")  RealParameter::unit "std::string RealParameter::unit() const 
+";
+
+
+// File: classGeometry_1_1Rectangle.xml
+%feature("docstring") Geometry::Rectangle "
+
+The rectangle shape having its axis aligned to the (non-rotated) coordinate system.
+
+C++ includes: Rectangle.h
+";
+
+%feature("docstring")  Geometry::Rectangle::Rectangle "Geometry::Rectangle::Rectangle(double xlow, double ylow, double xup, double yup)
+
+Parameters:
+-----------
+
+xlow: 
+x-coordinate of lower left corner
+
+ylow: 
+y-coordinate of lower left corner
+
+xup: 
+x-coordinate of upper right corner
+
+yup: 
+y-coordinate of upper right corner 
+";
+
+%feature("docstring")  Geometry::Rectangle::clone "Rectangle* Geometry::Rectangle::clone() const 
+";
+
+%feature("docstring")  Geometry::Rectangle::contains "bool Geometry::Rectangle::contains(double x, double y) const
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::Rectangle::contains "bool Geometry::Rectangle::contains(const Bin1D &binx, const Bin1D &biny) const
+
+Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+";
+
+%feature("docstring")  Geometry::Rectangle::getArea "double Geometry::Rectangle::getArea() const 
+";
+
+%feature("docstring")  Geometry::Rectangle::getXlow "double Geometry::Rectangle::getXlow() const 
+";
+
+%feature("docstring")  Geometry::Rectangle::getYlow "double Geometry::Rectangle::getYlow() const 
+";
+
+%feature("docstring")  Geometry::Rectangle::getXup "double Geometry::Rectangle::getXup() const 
+";
+
+%feature("docstring")  Geometry::Rectangle::getYup "double Geometry::Rectangle::getYup() const 
+";
+
+
+// File: classRectangularDetector.xml
+%feature("docstring") RectangularDetector "
+
+A rectangular plane detector with axes and resolution function.
+
+C++ includes: RectangularDetector.h
+";
+
+%feature("docstring")  RectangularDetector::RectangularDetector "RectangularDetector::RectangularDetector(int nxbins, double width, int nybins, double height)
+
+Rectangular detector constructor
+
+Parameters:
+-----------
+
+nxbins: 
+Number of bins (pixels) in x-direction
+
+width: 
+Width of the detector in mm along x-direction
+
+nybins: 
+Number of bins (pixels) in y-direction
+
+height: 
+Height of the detector in mm along y-direction 
+";
+
+%feature("docstring")  RectangularDetector::RectangularDetector "RectangularDetector::RectangularDetector(const RectangularDetector &other)
+";
+
+%feature("docstring")  RectangularDetector::clone "RectangularDetector * RectangularDetector::clone() const override
+";
+
+%feature("docstring")  RectangularDetector::~RectangularDetector "RectangularDetector::~RectangularDetector()
+";
+
+%feature("docstring")  RectangularDetector::init "void RectangularDetector::init(const Beam &beam) override
+
+Inits detector with the beam settings. 
+";
+
+%feature("docstring")  RectangularDetector::setPosition "void RectangularDetector::setPosition(const kvector_t normal_to_detector, double u0, double v0, const kvector_t direction=kvector_t(0.0,-1.0, 0.0))
+";
+
+%feature("docstring")  RectangularDetector::setPerpendicularToSampleX "void RectangularDetector::setPerpendicularToSampleX(double distance, double u0, double v0)
+";
+
+%feature("docstring")  RectangularDetector::setPerpendicularToDirectBeam "void RectangularDetector::setPerpendicularToDirectBeam(double distance, double u0, double v0)
+";
+
+%feature("docstring")  RectangularDetector::setPerpendicularToReflectedBeam "void RectangularDetector::setPerpendicularToReflectedBeam(double distance, double u0=0.0, double v0=0.0)
+";
+
+%feature("docstring")  RectangularDetector::setDirectBeamPosition "void RectangularDetector::setDirectBeamPosition(double u0, double v0)
+";
+
+%feature("docstring")  RectangularDetector::addParametersToExternalPool "std::string RectangularDetector::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const override
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+%feature("docstring")  RectangularDetector::getWidth "double RectangularDetector::getWidth() const 
+";
+
+%feature("docstring")  RectangularDetector::getHeight "double RectangularDetector::getHeight() const 
+";
+
+%feature("docstring")  RectangularDetector::getNbinsX "size_t RectangularDetector::getNbinsX() const 
+";
+
+%feature("docstring")  RectangularDetector::getNbinsY "size_t RectangularDetector::getNbinsY() const 
+";
+
+%feature("docstring")  RectangularDetector::getNormalVector "kvector_t RectangularDetector::getNormalVector() const 
+";
+
+%feature("docstring")  RectangularDetector::getU0 "double RectangularDetector::getU0() const 
+";
+
+%feature("docstring")  RectangularDetector::getV0 "double RectangularDetector::getV0() const 
+";
+
+%feature("docstring")  RectangularDetector::getDirectionVector "kvector_t RectangularDetector::getDirectionVector() const 
+";
+
+%feature("docstring")  RectangularDetector::getDistance "double RectangularDetector::getDistance() const 
+";
+
+%feature("docstring")  RectangularDetector::getDirectBeamU0 "double RectangularDetector::getDirectBeamU0() const 
+";
+
+%feature("docstring")  RectangularDetector::getDirectBeamV0 "double RectangularDetector::getDirectBeamV0() const 
+";
+
+%feature("docstring")  RectangularDetector::getDetectorArrangment "RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrangment() const 
+";
+
+%feature("docstring")  RectangularDetector::getValidAxesUnits "std::vector< IDetector2D::EAxesUnits > RectangularDetector::getValidAxesUnits() const override
+
+returns vector of valid axes units 
+";
+
+%feature("docstring")  RectangularDetector::getDefaultAxesUnits "IDetector2D::EAxesUnits RectangularDetector::getDefaultAxesUnits() const override
+
+return default axes units 
+";
+
+
+// File: classRectParaCrystalBuilder.xml
+%feature("docstring") RectParaCrystalBuilder "
+
+Builds sample: 2D paracrystal lattice (IsGISAXS example #8)
+
+C++ includes: ParaCrystalBuilder.h
+";
+
+%feature("docstring")  RectParaCrystalBuilder::RectParaCrystalBuilder "RectParaCrystalBuilder::RectParaCrystalBuilder()
+";
+
+%feature("docstring")  RectParaCrystalBuilder::buildSample "MultiLayer * RectParaCrystalBuilder::buildSample() const 
+";
+
+
+// File: classRectPixelMap.xml
+%feature("docstring") RectPixelMap "";
+
+%feature("docstring")  RectPixelMap::RectPixelMap "RectPixelMap::RectPixelMap(kvector_t corner_pos, kvector_t width, kvector_t height)
+";
+
+%feature("docstring")  RectPixelMap::~RectPixelMap "virtual RectPixelMap::~RectPixelMap()
+";
+
+%feature("docstring")  RectPixelMap::clone "RectPixelMap * RectPixelMap::clone() const override
+";
+
+%feature("docstring")  RectPixelMap::createZeroSizeMap "RectPixelMap * RectPixelMap::createZeroSizeMap(double x, double y) const override
+";
+
+%feature("docstring")  RectPixelMap::getK "kvector_t RectPixelMap::getK(double x, double y, double wavelength) const override
+";
+
+%feature("docstring")  RectPixelMap::getIntegrationFactor "double RectPixelMap::getIntegrationFactor(double x, double y) const override
+";
+
+%feature("docstring")  RectPixelMap::getSolidAngle "double RectPixelMap::getSolidAngle() const override
+";
+
+
+// File: classRegionOfInterest.xml
+%feature("docstring") RegionOfInterest "
+
+Defines rectangular area for the detector which will be simulated/fitted.
+
+C++ includes: RegionOfInterest.h
+";
+
+%feature("docstring")  RegionOfInterest::RegionOfInterest "RegionOfInterest::RegionOfInterest(const IDetector2D &detector, double xlow, double ylow, double xup, double yup)
+";
+
+%feature("docstring")  RegionOfInterest::clone "RegionOfInterest * RegionOfInterest::clone() const 
+";
+
+%feature("docstring")  RegionOfInterest::~RegionOfInterest "RegionOfInterest::~RegionOfInterest()
+";
+
+%feature("docstring")  RegionOfInterest::getXlow "double RegionOfInterest::getXlow() const 
+";
+
+%feature("docstring")  RegionOfInterest::getYlow "double RegionOfInterest::getYlow() const 
+";
+
+%feature("docstring")  RegionOfInterest::getXup "double RegionOfInterest::getXup() const 
+";
+
+%feature("docstring")  RegionOfInterest::getYup "double RegionOfInterest::getYup() const 
+";
+
+%feature("docstring")  RegionOfInterest::detectorIndex "size_t RegionOfInterest::detectorIndex(size_t roiIndex) const
+
+Converts roi index to the detector index. 
+";
+
+%feature("docstring")  RegionOfInterest::roiIndex "size_t RegionOfInterest::roiIndex(size_t detectorIndex) const
+
+Converts global detector index to ROI index. 
+";
+
+%feature("docstring")  RegionOfInterest::roiSize "size_t RegionOfInterest::roiSize() const
+
+Number of detector bins in ROI area. 
+";
+
+%feature("docstring")  RegionOfInterest::detectorSize "size_t RegionOfInterest::detectorSize() const
+
+Number of detector bins. 
+";
+
+%feature("docstring")  RegionOfInterest::isInROI "bool RegionOfInterest::isInROI(size_t detectorIndex) const 
+";
+
+%feature("docstring")  RegionOfInterest::clipAxisToRoi "std::unique_ptr< IAxis > RegionOfInterest::clipAxisToRoi(size_t axis_index, const IAxis &axis) const 
+";
+
+
+// File: classResolutionFunction2DGaussian.xml
+%feature("docstring") ResolutionFunction2DGaussian "
+
+Simple gaussian two-dimensional resolution function.
+
+C++ includes: ResolutionFunction2DGaussian.h
+";
+
+%feature("docstring")  ResolutionFunction2DGaussian::ResolutionFunction2DGaussian "ResolutionFunction2DGaussian::ResolutionFunction2DGaussian(double sigma_x, double sigma_y)
+";
+
+%feature("docstring")  ResolutionFunction2DGaussian::evaluateCDF "double ResolutionFunction2DGaussian::evaluateCDF(double x, double y) const 
+";
+
+%feature("docstring")  ResolutionFunction2DGaussian::clone "ResolutionFunction2DGaussian* ResolutionFunction2DGaussian::clone() const 
+";
+
+%feature("docstring")  ResolutionFunction2DGaussian::getSigmaX "double ResolutionFunction2DGaussian::getSigmaX() const 
+";
+
+%feature("docstring")  ResolutionFunction2DGaussian::getSigmaY "double ResolutionFunction2DGaussian::getSigmaY() const 
+";
+
+
+// File: classRotatedPyramidsBuilder.xml
+%feature("docstring") RotatedPyramidsBuilder "
+
+Builds sample: Pyramids, rotated pyramids on top of substrate (IsGISAXS example #9)
+
+C++ includes: RotatedPyramidsBuilder.h
+";
+
+%feature("docstring")  RotatedPyramidsBuilder::RotatedPyramidsBuilder "RotatedPyramidsBuilder::RotatedPyramidsBuilder()
+";
+
+%feature("docstring")  RotatedPyramidsBuilder::buildSample "MultiLayer * RotatedPyramidsBuilder::buildSample() const 
+";
+
+
+// File: classRotatedSquareLatticeBuilder.xml
+%feature("docstring") RotatedSquareLatticeBuilder "
+
+Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
+
+C++ includes: TwoDimLatticeBuilder.h
+";
+
+%feature("docstring")  RotatedSquareLatticeBuilder::RotatedSquareLatticeBuilder "RotatedSquareLatticeBuilder::RotatedSquareLatticeBuilder()
+";
+
+%feature("docstring")  RotatedSquareLatticeBuilder::buildSample "MultiLayer * RotatedSquareLatticeBuilder::buildSample() const 
+";
+
+
+// File: classRotationEuler.xml
+%feature("docstring") RotationEuler "";
+
+%feature("docstring")  RotationEuler::RotationEuler "RotationEuler::RotationEuler(double alpha, double beta, double gamma)
+";
+
+%feature("docstring")  RotationEuler::clone "RotationEuler* RotationEuler::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  RotationEuler::createInverse "IRotation * RotationEuler::createInverse() const
+
+Returns a new  IRotation object that is the current object's inverse. 
+";
+
+%feature("docstring")  RotationEuler::accept "void RotationEuler::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  RotationEuler::getAlpha "double RotationEuler::getAlpha() const 
+";
+
+%feature("docstring")  RotationEuler::getBeta "double RotationEuler::getBeta() const 
+";
+
+%feature("docstring")  RotationEuler::getGamma "double RotationEuler::getGamma() const 
+";
+
+%feature("docstring")  RotationEuler::getTransform3D "Transform3D RotationEuler::getTransform3D() const
+
+Returns transformation. 
+";
+
+
+// File: classRotationX.xml
+%feature("docstring") RotationX "";
+
+%feature("docstring")  RotationX::RotationX "RotationX::RotationX(double angle)
+";
+
+%feature("docstring")  RotationX::clone "RotationX* RotationX::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  RotationX::createInverse "RotationX* RotationX::createInverse() const
+
+Returns a new  IRotation object that is the current object's inverse. 
+";
+
+%feature("docstring")  RotationX::accept "void RotationX::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  RotationX::getAngle "double RotationX::getAngle() const 
+";
+
+%feature("docstring")  RotationX::getTransform3D "Transform3D RotationX::getTransform3D() const
+
+Returns transformation. 
+";
+
+
+// File: classRotationY.xml
+%feature("docstring") RotationY "";
+
+%feature("docstring")  RotationY::RotationY "RotationY::RotationY(double angle)
+";
+
+%feature("docstring")  RotationY::clone "RotationY* RotationY::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  RotationY::createInverse "RotationY* RotationY::createInverse() const
+
+Returns a new  IRotation object that is the current object's inverse. 
+";
+
+%feature("docstring")  RotationY::accept "void RotationY::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  RotationY::getAngle "double RotationY::getAngle() const 
+";
+
+%feature("docstring")  RotationY::getTransform3D "Transform3D RotationY::getTransform3D() const
+
+Returns transformation. 
+";
+
+
+// File: classRotationZ.xml
+%feature("docstring") RotationZ "";
+
+%feature("docstring")  RotationZ::RotationZ "RotationZ::RotationZ(double angle=0.0)
+";
+
+%feature("docstring")  RotationZ::clone "RotationZ* RotationZ::clone() const
+
+Returns a clone of this  ISample object. 
+";
+
+%feature("docstring")  RotationZ::createInverse "RotationZ* RotationZ::createInverse() const
+
+Returns a new  IRotation object that is the current object's inverse. 
+";
+
+%feature("docstring")  RotationZ::accept "void RotationZ::accept(ISampleVisitor *visitor) const
+
+Calls the  ISampleVisitor's visit method. 
+";
+
+%feature("docstring")  RotationZ::getAngle "double RotationZ::getAngle() const 
+";
+
+%feature("docstring")  RotationZ::getTransform3D "Transform3D RotationZ::getTransform3D() const
+
+Returns transformation. 
+";
+
+
+// File: classRoughMultiLayerComputation.xml
+%feature("docstring") RoughMultiLayerComputation "
+
+Computes the diffuse reflection from the rough interfaces of a multilayer. Controlled by  MainComputation.
+
+C++ includes: RoughMultiLayerComputation.h
+";
+
+%feature("docstring")  RoughMultiLayerComputation::RoughMultiLayerComputation "RoughMultiLayerComputation::RoughMultiLayerComputation(const MultiLayer *p_multi_layer)
+";
+
+%feature("docstring")  RoughMultiLayerComputation::~RoughMultiLayerComputation "RoughMultiLayerComputation::~RoughMultiLayerComputation()
+";
+
+%feature("docstring")  RoughMultiLayerComputation::eval "void RoughMultiLayerComputation::eval(ProgressHandler *progress, const std::vector< SimulationElement >::iterator &begin_it, const std::vector< SimulationElement >::iterator &end_it)
+
+Calls evaluate on range of simulation elements; returns true if computation shall continue. 
+";
+
+%feature("docstring")  RoughMultiLayerComputation::setSpecularInfo "void RoughMultiLayerComputation::setSpecularInfo(size_t i_layer, const LayerSpecularInfo &specular_info)
+
+Sets magnetic reflection/transmission info for specific layer. 
+";
+
+%feature("docstring")  RoughMultiLayerComputation::evaluate "double RoughMultiLayerComputation::evaluate(const SimulationElement &sim_element)
+";
+
+
+// File: classExceptions_1_1RuntimeErrorException.xml
+%feature("docstring") Exceptions::RuntimeErrorException "";
+
+%feature("docstring")  Exceptions::RuntimeErrorException::RuntimeErrorException "Exceptions::RuntimeErrorException::RuntimeErrorException(const std::string &message)
+";
+
+
+// File: classSafePointerVector.xml
+%feature("docstring") SafePointerVector "
+
+The objects pointed to must support the  ICloneable interface.
+
+A vector of pointers, owned by *this, with methods to handle them safely.
+
+C++ includes: SafePointerVector.h
+";
+
+%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector()
+";
+
+%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector(const SafePointerVector &other)
+";
+
+%feature("docstring")  SafePointerVector::~SafePointerVector "virtual SafePointerVector< T >::~SafePointerVector()
+";
+
+%feature("docstring")  SafePointerVector::size "size_t SafePointerVector< T >::size() const 
+";
+
+%feature("docstring")  SafePointerVector::empty "bool SafePointerVector< T >::empty() const 
+";
+
+%feature("docstring")  SafePointerVector::push_back "void SafePointerVector< T >::push_back(T *pointer)
+";
+
+%feature("docstring")  SafePointerVector::begin "iterator SafePointerVector< T >::begin()
+";
+
+%feature("docstring")  SafePointerVector::begin "const_iterator SafePointerVector< T >::begin() const 
+";
+
+%feature("docstring")  SafePointerVector::end "iterator SafePointerVector< T >::end()
+";
+
+%feature("docstring")  SafePointerVector::end "const_iterator SafePointerVector< T >::end() const 
+";
+
+%feature("docstring")  SafePointerVector::deleteElement "bool SafePointerVector< T >::deleteElement(T *pointer)
+";
+
+%feature("docstring")  SafePointerVector::back "T* SafePointerVector< T >::back()
+";
+
+%feature("docstring")  SafePointerVector::back "const T* SafePointerVector< T >::back() const 
+";
+
+%feature("docstring")  SafePointerVector::clear "void SafePointerVector< T >::clear()
+";
+
+
+// File: classSampleBuilderFactory.xml
+%feature("docstring") SampleBuilderFactory "
+
+Factory to create standard pre-defined samples.
+
+C++ includes: SampleBuilderFactory.h
+";
+
+%feature("docstring")  SampleBuilderFactory::SampleBuilderFactory "SampleBuilderFactory::SampleBuilderFactory()
+";
+
+%feature("docstring")  SampleBuilderFactory::createSample "MultiLayer * SampleBuilderFactory::createSample(const std::string &name)
+
+Retrieves a SampleBuilder from the registry, does the build, and returns the result. 
+";
+
+
+// File: classSampleIteratorPostorderStrategy.xml
+%feature("docstring") SampleIteratorPostorderStrategy "";
+
+%feature("docstring")  SampleIteratorPostorderStrategy::SampleIteratorPostorderStrategy "SampleIteratorPostorderStrategy::SampleIteratorPostorderStrategy()
+";
+
+%feature("docstring")  SampleIteratorPostorderStrategy::clone "SampleIteratorPostorderStrategy * SampleIteratorPostorderStrategy::clone() const 
+";
+
+%feature("docstring")  SampleIteratorPostorderStrategy::~SampleIteratorPostorderStrategy "SampleIteratorPostorderStrategy::~SampleIteratorPostorderStrategy()
+";
+
+%feature("docstring")  SampleIteratorPostorderStrategy::first "IteratorMemento SampleIteratorPostorderStrategy::first(const ISample *p_root)
+";
+
+%feature("docstring")  SampleIteratorPostorderStrategy::next "void SampleIteratorPostorderStrategy::next(IteratorMemento &iterator_stack) const 
+";
+
+%feature("docstring")  SampleIteratorPostorderStrategy::isDone "bool SampleIteratorPostorderStrategy::isDone(IteratorMemento &iterator_stack) const 
+";
+
+
+// File: classSampleIteratorPreorderStrategy.xml
+%feature("docstring") SampleIteratorPreorderStrategy "";
+
+%feature("docstring")  SampleIteratorPreorderStrategy::SampleIteratorPreorderStrategy "SampleIteratorPreorderStrategy::SampleIteratorPreorderStrategy()
+";
+
+%feature("docstring")  SampleIteratorPreorderStrategy::clone "SampleIteratorPreorderStrategy * SampleIteratorPreorderStrategy::clone() const 
+";
+
+%feature("docstring")  SampleIteratorPreorderStrategy::~SampleIteratorPreorderStrategy "SampleIteratorPreorderStrategy::~SampleIteratorPreorderStrategy()
+";
+
+%feature("docstring")  SampleIteratorPreorderStrategy::first "IteratorMemento SampleIteratorPreorderStrategy::first(const ISample *p_root)
+";
+
+%feature("docstring")  SampleIteratorPreorderStrategy::next "void SampleIteratorPreorderStrategy::next(IteratorMemento &iterator_stack) const 
+";
+
+%feature("docstring")  SampleIteratorPreorderStrategy::isDone "bool SampleIteratorPreorderStrategy::isDone(IteratorMemento &iterator_stack) const 
+";
+
+
+// File: classSampleLabelHandler.xml
+%feature("docstring") SampleLabelHandler "
+
+The handler which construct labels for sample variables during python script generation.
+
+C++ includes: SampleLabelHandler.h
+";
+
+%feature("docstring")  SampleLabelHandler::SampleLabelHandler "SampleLabelHandler::SampleLabelHandler()
+";
+
+%feature("docstring")  SampleLabelHandler::getFormFactorMap "formfactors_t* SampleLabelHandler::getFormFactorMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getInterferenceFunctionMap "interferences_t* SampleLabelHandler::getInterferenceFunctionMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getLayerMap "layers_t* SampleLabelHandler::getLayerMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getParticleLayoutMap "layouts_t* SampleLabelHandler::getParticleLayoutMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getMaterialMap "materials_t* SampleLabelHandler::getMaterialMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getMultiLayerMap "multilayers_t* SampleLabelHandler::getMultiLayerMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getParticleCompositionMap "particlecompositions_t* SampleLabelHandler::getParticleCompositionMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getParticleDistributionsMap "particledistributions_t* SampleLabelHandler::getParticleDistributionsMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getParticleMap "particles_t* SampleLabelHandler::getParticleMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getParticleCoreShellMap "particlescoreshell_t* SampleLabelHandler::getParticleCoreShellMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getRotationsMap "rotations_t* SampleLabelHandler::getRotationsMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getLayerRoughnessMap "roughnesses_t* SampleLabelHandler::getLayerRoughnessMap()
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelParticle "std::string SampleLabelHandler::getLabelParticle(const IAbstractParticle *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelFormFactor "std::string SampleLabelHandler::getLabelFormFactor(const IFormFactor *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelInterferenceFunction "std::string SampleLabelHandler::getLabelInterferenceFunction(const IInterferenceFunction *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelLayout "std::string SampleLabelHandler::getLabelLayout(const ILayout *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelMaterial "std::string SampleLabelHandler::getLabelMaterial(const IMaterial *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelRotation "std::string SampleLabelHandler::getLabelRotation(const IRotation *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelLayer "std::string SampleLabelHandler::getLabelLayer(const Layer *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelRoughness "std::string SampleLabelHandler::getLabelRoughness(const LayerRoughness *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelMultiLayer "std::string SampleLabelHandler::getLabelMultiLayer(const MultiLayer *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelParticleComposition "std::string SampleLabelHandler::getLabelParticleComposition(const ParticleComposition *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelParticleCoreShell "std::string SampleLabelHandler::getLabelParticleCoreShell(const ParticleCoreShell *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::getLabelParticleDistribution "std::string SampleLabelHandler::getLabelParticleDistribution(const ParticleDistribution *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertMaterial "void SampleLabelHandler::insertMaterial(const IMaterial *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertFormFactor "void SampleLabelHandler::insertFormFactor(const IFormFactor *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertInterferenceFunction "void SampleLabelHandler::insertInterferenceFunction(const IInterferenceFunction *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertLayout "void SampleLabelHandler::insertLayout(const ILayout *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertRotation "void SampleLabelHandler::insertRotation(const IRotation *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertLayer "void SampleLabelHandler::insertLayer(const Layer *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertRoughness "void SampleLabelHandler::insertRoughness(const LayerRoughness *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertMultiLayer "void SampleLabelHandler::insertMultiLayer(const MultiLayer *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertParticle "void SampleLabelHandler::insertParticle(const Particle *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertParticleComposition "void SampleLabelHandler::insertParticleComposition(const ParticleComposition *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertParticleCoreShell "void SampleLabelHandler::insertParticleCoreShell(const ParticleCoreShell *sample)
+";
+
+%feature("docstring")  SampleLabelHandler::insertParticleDistribution "void SampleLabelHandler::insertParticleDistribution(const ParticleDistribution *sample)
+";
+
+
+// File: classSampleTreeIterator.xml
+%feature("docstring") SampleTreeIterator "
+
+Iterator through  ISample tree of objects inside  ISample object.
+
+Usage example: SampleTreeIterator<Strategy> it(&sample); it.first(); while( !it.is_done() ) {  ISample *p_sample = it.get_current(); it.next(); }
+
+C++ includes: SampleTreeIterator.h
+";
+
+%feature("docstring")  SampleTreeIterator::SampleTreeIterator "SampleTreeIterator< Strategy >::SampleTreeIterator(const ISample *root)
+";
+
+%feature("docstring")  SampleTreeIterator::~SampleTreeIterator "virtual SampleTreeIterator< Strategy >::~SampleTreeIterator()
+";
+
+%feature("docstring")  SampleTreeIterator::first "void SampleTreeIterator< Strategy >::first()
+";
+
+%feature("docstring")  SampleTreeIterator::next "void SampleTreeIterator< Strategy >::next()
+";
+
+%feature("docstring")  SampleTreeIterator::getCurrent "const ISample * SampleTreeIterator< Strategy >::getCurrent()
+";
+
+%feature("docstring")  SampleTreeIterator::isDone "bool SampleTreeIterator< Strategy >::isDone() const 
+";
+
+%feature("docstring")  SampleTreeIterator::getLevel "size_t SampleTreeIterator< Strategy >::getLevel() const 
+";
+
+
+// File: classScalarRTCoefficients.xml
+%feature("docstring") ScalarRTCoefficients "
+
+Specular reflection and transmission coefficients in a layer in case of scalar interactions between the layers and the scattered particle.
+
+C++ includes: ScalarRTCoefficients.h
+";
+
+%feature("docstring")  ScalarRTCoefficients::ScalarRTCoefficients "ScalarRTCoefficients::ScalarRTCoefficients()
+";
+
+%feature("docstring")  ScalarRTCoefficients::~ScalarRTCoefficients "virtual ScalarRTCoefficients::~ScalarRTCoefficients()
+";
+
+%feature("docstring")  ScalarRTCoefficients::clone "ScalarRTCoefficients * ScalarRTCoefficients::clone() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::T1plus "Eigen::Vector2cd ScalarRTCoefficients::T1plus() const
+
+The following functions return the transmitted and reflected amplitudes for different incoming beam polarizations and eigenmodes 
+";
+
+%feature("docstring")  ScalarRTCoefficients::R1plus "Eigen::Vector2cd ScalarRTCoefficients::R1plus() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::T2plus "Eigen::Vector2cd ScalarRTCoefficients::T2plus() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::R2plus "Eigen::Vector2cd ScalarRTCoefficients::R2plus() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::T1min "Eigen::Vector2cd ScalarRTCoefficients::T1min() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::R1min "Eigen::Vector2cd ScalarRTCoefficients::R1min() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::T2min "Eigen::Vector2cd ScalarRTCoefficients::T2min() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::R2min "Eigen::Vector2cd ScalarRTCoefficients::R2min() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::getKz "Eigen::Vector2cd ScalarRTCoefficients::getKz() const
+
+Returns z-part of the two wavevector eigenmodes. 
+";
+
+%feature("docstring")  ScalarRTCoefficients::getScalarT "complex_t ScalarRTCoefficients::getScalarT() const
+
+Scalar value getters; these throw errors by default as they should only be used when the derived object is really scalar 
+";
+
+%feature("docstring")  ScalarRTCoefficients::getScalarR "complex_t ScalarRTCoefficients::getScalarR() const 
+";
+
+%feature("docstring")  ScalarRTCoefficients::getScalarKz "virtual complex_t ScalarRTCoefficients::getScalarKz() const 
+";
+
+
+// File: classScalarSpecularInfoMap.xml
+%feature("docstring") ScalarSpecularInfoMap "
+
+Implementation of  ISpecularInfoMap for scalar valued reflection/transmission coefficients.
+
+C++ includes: ScalarSpecularInfoMap.h
+";
+
+%feature("docstring")  ScalarSpecularInfoMap::ScalarSpecularInfoMap "ScalarSpecularInfoMap::ScalarSpecularInfoMap(const MultiLayer *multilayer, int layer)
+";
+
+%feature("docstring")  ScalarSpecularInfoMap::~ScalarSpecularInfoMap "ScalarSpecularInfoMap::~ScalarSpecularInfoMap() final
+";
+
+%feature("docstring")  ScalarSpecularInfoMap::clone "ScalarSpecularInfoMap* ScalarSpecularInfoMap::clone() const final
+";
+
+%feature("docstring")  ScalarSpecularInfoMap::getOutCoefficients "const ILayerRTCoefficients * ScalarSpecularInfoMap::getOutCoefficients(const SimulationElement &sim_element) const final
+
+Retrieves the amplitude coefficients for the given angles. 
+";
+
+%feature("docstring")  ScalarSpecularInfoMap::getInCoefficients "const ILayerRTCoefficients * ScalarSpecularInfoMap::getInCoefficients(const SimulationElement &sim_element) const final
+
+Retrieves the amplitude coefficients for the given angles. 
+";
+
+
+// File: classExceptions_1_1SelfReferenceException.xml
+%feature("docstring") Exceptions::SelfReferenceException "";
+
+%feature("docstring")  Exceptions::SelfReferenceException::SelfReferenceException "Exceptions::SelfReferenceException::SelfReferenceException(const std::string &message)
+";
+
+
+// File: classSimpleSelectionRule.xml
+%feature("docstring") SimpleSelectionRule "
+
+Selection rule (v*q)modulus!=0, defined by vector v(a,b,c) and modulus.
+
+C++ includes: ISelectionRule.h
+";
+
+%feature("docstring")  SimpleSelectionRule::SimpleSelectionRule "SimpleSelectionRule::SimpleSelectionRule(int a, int b, int c, int modulus)
+";
+
+%feature("docstring")  SimpleSelectionRule::~SimpleSelectionRule "virtual SimpleSelectionRule::~SimpleSelectionRule()
+";
+
+%feature("docstring")  SimpleSelectionRule::clone "SimpleSelectionRule * SimpleSelectionRule::clone() const 
+";
+
+%feature("docstring")  SimpleSelectionRule::coordinateSelected "bool SimpleSelectionRule::coordinateSelected(const ivector_t &coordinate) const 
+";
+
+
+// File: classSimulation.xml
+%feature("docstring") Simulation "
+
+Pure virtual base class of OffSpecularSimulation and  GISASSimulation, holds common infrastructure to run a simulation.
+
+C++ includes: Simulation.h
+";
+
+%feature("docstring")  Simulation::Simulation "Simulation::Simulation()
+";
+
+%feature("docstring")  Simulation::Simulation "Simulation::Simulation(const MultiLayer &p_sample)
+";
+
+%feature("docstring")  Simulation::Simulation "Simulation::Simulation(std::shared_ptr< IMultiLayerBuilder > p_sample_builder)
+";
+
+%feature("docstring")  Simulation::~Simulation "Simulation::~Simulation()
+";
+
+%feature("docstring")  Simulation::clone "virtual Simulation* Simulation::clone() const =0
+";
+
+%feature("docstring")  Simulation::prepareSimulation "void Simulation::prepareSimulation()
+
+Put into a clean state for running a simulation. 
+";
+
+%feature("docstring")  Simulation::runSimulation "void Simulation::runSimulation()
+
+Run a simulation, possibly averaged over parameter distributions.
+
+Run simulation with possible averaging over parameter distributions. 
+";
+
+%feature("docstring")  Simulation::setInstrument "void Simulation::setInstrument(const Instrument &instrument)
+";
+
+%feature("docstring")  Simulation::getInstrument "const Instrument& Simulation::getInstrument() const 
+";
+
+%feature("docstring")  Simulation::getInstrument "Instrument& Simulation::getInstrument()
+";
+
+%feature("docstring")  Simulation::setBeamIntensity "void Simulation::setBeamIntensity(double intensity)
+";
+
+%feature("docstring")  Simulation::getBeamIntensity "double Simulation::getBeamIntensity() const 
+";
+
+%feature("docstring")  Simulation::setBeamPolarization "void Simulation::setBeamPolarization(const kvector_t bloch_vector)
+
+Sets the beam polarization according to the given Bloch vector. 
+";
+
+%feature("docstring")  Simulation::setDetectorResolutionFunction "void Simulation::setDetectorResolutionFunction(const IResolutionFunction2D &resolution_function)
+";
+
+%feature("docstring")  Simulation::removeDetectorResolutionFunction "void Simulation::removeDetectorResolutionFunction()
+";
+
+%feature("docstring")  Simulation::setAnalyzerProperties "void Simulation::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)
+
+Sets the polarization analyzer characteristics of the detector. 
+";
+
+%feature("docstring")  Simulation::setSample "void Simulation::setSample(const MultiLayer &sample)
+
+The  MultiLayer object will not be owned by the  Simulation object. 
+";
+
+%feature("docstring")  Simulation::getSample "MultiLayer* Simulation::getSample() const 
+";
+
+%feature("docstring")  Simulation::setSampleBuilder "void Simulation::setSampleBuilder(std::shared_ptr< IMultiLayerBuilder > sample_builder)
+";
+
+%feature("docstring")  Simulation::getSampleBuilder "std::shared_ptr<IMultiLayerBuilder> Simulation::getSampleBuilder() const 
+";
+
+%feature("docstring")  Simulation::numberOfSimulationElements "virtual int Simulation::numberOfSimulationElements() const =0
+";
+
+%feature("docstring")  Simulation::getDetectorIntensity "virtual OutputData<double>* Simulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const =0
+
+Clone simulated intensity map. 
+";
+
+%feature("docstring")  Simulation::addSimulationParametersToExternalPool "std::string Simulation::addSimulationParametersToExternalPool(const std::string &path, ParameterPool *external_pool) const
+
+Adds parameters defined in this class the to external pool. 
+";
+
+%feature("docstring")  Simulation::addParameterDistribution "void Simulation::addParameterDistribution(const std::string &param_name, const IDistribution1D &distribution, size_t nbr_samples, double sigma_factor=0.0, const RealLimits &limits=RealLimits())
+";
+
+%feature("docstring")  Simulation::addParameterDistribution "void Simulation::addParameterDistribution(const ParameterDistribution &par_distr)
+";
+
+%feature("docstring")  Simulation::getDistributionHandler "const DistributionHandler& Simulation::getDistributionHandler() const 
+";
+
+%feature("docstring")  Simulation::setOptions "void Simulation::setOptions(const SimulationOptions &options)
+";
+
+%feature("docstring")  Simulation::getOptions "const SimulationOptions& Simulation::getOptions() const 
+";
+
+%feature("docstring")  Simulation::getOptions "SimulationOptions& Simulation::getOptions()
+";
+
+%feature("docstring")  Simulation::subscribe "void Simulation::subscribe(ProgressHandler::Callback_t inform)
+";
+
+%feature("docstring")  Simulation::setTerminalProgressMonitor "void Simulation::setTerminalProgressMonitor()
+
+Initializes a progress monitor that prints to stdout. 
+";
+
+
+// File: classSimulationArea.xml
+%feature("docstring") SimulationArea "
+
+Holds iteration logic over active detector channels in the presence of masked areas and  RegionOfInterest defined.
+
+C++ includes: SimulationArea.h
+";
+
+%feature("docstring")  SimulationArea::SimulationArea "SimulationArea::SimulationArea(const IDetector2D *detector)
+";
+
+%feature("docstring")  SimulationArea::~SimulationArea "virtual SimulationArea::~SimulationArea()
+";
+
+%feature("docstring")  SimulationArea::begin "SimulationAreaIterator SimulationArea::begin()
+";
+
+%feature("docstring")  SimulationArea::end "SimulationAreaIterator SimulationArea::end()
+";
+
+%feature("docstring")  SimulationArea::isMasked "bool SimulationArea::isMasked(size_t index) const
+
+returns trus if given iterator index correspond to masked detector channel 
+";
+
+%feature("docstring")  SimulationArea::totalSize "size_t SimulationArea::totalSize() const 
+";
+
+%feature("docstring")  SimulationArea::roiIndex "size_t SimulationArea::roiIndex(size_t index) const
+
+Return index in ROI map from iterator index. 
+";
+
+%feature("docstring")  SimulationArea::detectorIndex "size_t SimulationArea::detectorIndex(size_t index) const
+
+Return detector index from iterator index. 
+";
+
+
+// File: classSimulationAreaIterator.xml
+%feature("docstring") SimulationAreaIterator "
+
+An iterator for  SimulationArea.
+
+C++ includes: SimulationAreaIterator.h
+";
+
+%feature("docstring")  SimulationAreaIterator::SimulationAreaIterator "SimulationAreaIterator::SimulationAreaIterator(const SimulationArea *area, size_t start_at_index)
+";
+
+%feature("docstring")  SimulationAreaIterator::index "size_t SimulationAreaIterator::index() const 
+";
+
+%feature("docstring")  SimulationAreaIterator::elementIndex "size_t SimulationAreaIterator::elementIndex() const 
+";
+
+%feature("docstring")  SimulationAreaIterator::roiIndex "int SimulationAreaIterator::roiIndex() const 
+";
+
+%feature("docstring")  SimulationAreaIterator::detectorIndex "int SimulationAreaIterator::detectorIndex() const 
+";
+
+
+// File: classSimulationElement.xml
+%feature("docstring") SimulationElement "
+
+Data stucture containing both input and output of a single detector cell.
+
+C++ includes: SimulationElement.h
+";
+
+%feature("docstring")  SimulationElement::SimulationElement "SimulationElement::SimulationElement(double wavelength, double alpha_i, double phi_i, std::unique_ptr< IPixelMap > pixelmap)
+";
+
+%feature("docstring")  SimulationElement::SimulationElement "SimulationElement::SimulationElement(const SimulationElement &other)
+";
+
+%feature("docstring")  SimulationElement::SimulationElement "SimulationElement::SimulationElement(const SimulationElement &other, double x, double y)
+
+Construct  SimulationElement from other element and restrict k_f to specific value in the original detector pixel 
+";
+
+%feature("docstring")  SimulationElement::SimulationElement "SimulationElement::SimulationElement(SimulationElement &&other) noexcept
+";
+
+%feature("docstring")  SimulationElement::~SimulationElement "SimulationElement::~SimulationElement()
+";
+
+%feature("docstring")  SimulationElement::setPolarization "void SimulationElement::setPolarization(const Eigen::Matrix2cd &polarization)
+
+Sets the polarization density matrix (in spin basis along z-axis) 
+";
+
+%feature("docstring")  SimulationElement::getPolarization "Eigen::Matrix2cd SimulationElement::getPolarization() const
+
+Gets the polarization density matrix (in spin basis along z-axis) 
+";
+
+%feature("docstring")  SimulationElement::setAnalyzerOperator "void SimulationElement::setAnalyzerOperator(const Eigen::Matrix2cd &polarization_operator)
+
+Sets the polarization analyzer operator (in spin basis along z-axis) 
+";
+
+%feature("docstring")  SimulationElement::getAnalyzerOperator "Eigen::Matrix2cd SimulationElement::getAnalyzerOperator() const
+
+Gets the polarization analyzer operator (in spin basis along z-axis) 
+";
+
+%feature("docstring")  SimulationElement::getWavelength "double SimulationElement::getWavelength() const 
+";
+
+%feature("docstring")  SimulationElement::getAlphaI "double SimulationElement::getAlphaI() const 
+";
+
+%feature("docstring")  SimulationElement::getPhiI "double SimulationElement::getPhiI() const 
+";
+
+%feature("docstring")  SimulationElement::getAlphaMean "double SimulationElement::getAlphaMean() const 
+";
+
+%feature("docstring")  SimulationElement::getPhiMean "double SimulationElement::getPhiMean() const 
+";
+
+%feature("docstring")  SimulationElement::setIntensity "void SimulationElement::setIntensity(double intensity)
+";
+
+%feature("docstring")  SimulationElement::addIntensity "void SimulationElement::addIntensity(double intensity)
+";
+
+%feature("docstring")  SimulationElement::getIntensity "double SimulationElement::getIntensity() const 
+";
+
+%feature("docstring")  SimulationElement::getKI "kvector_t SimulationElement::getKI() const 
+";
+
+%feature("docstring")  SimulationElement::getMeanKF "kvector_t SimulationElement::getMeanKF() const 
+";
+
+%feature("docstring")  SimulationElement::getMeanQ "kvector_t SimulationElement::getMeanQ() const 
+";
+
+%feature("docstring")  SimulationElement::getQ "kvector_t SimulationElement::getQ(double x, double y) const 
+";
+
+%feature("docstring")  SimulationElement::getK "kvector_t SimulationElement::getK(double x, double y) const 
+";
+
+%feature("docstring")  SimulationElement::getIntegrationFactor "double SimulationElement::getIntegrationFactor(double x, double y) const 
+";
+
+%feature("docstring")  SimulationElement::getSolidAngle "double SimulationElement::getSolidAngle() const 
+";
+
+%feature("docstring")  SimulationElement::getAlpha "double SimulationElement::getAlpha(double x, double y) const 
+";
+
+%feature("docstring")  SimulationElement::getPhi "double SimulationElement::getPhi(double x, double y) const 
+";
+
+%feature("docstring")  SimulationElement::containsSpecularWavevector "bool SimulationElement::containsSpecularWavevector() const
+
+check if element contains given wavevector 
+";
+
+%feature("docstring")  SimulationElement::setSpecular "void SimulationElement::setSpecular(bool contains_specular)
+
+indicate that this element contains the specular wavevector 
+";
+
+
+// File: classSimulationFactory.xml
+%feature("docstring") SimulationFactory "
+
+Registry to create standard pre-defined simulations. Used in functional tests, performance measurements, etc.
+
+C++ includes: SimulationFactory.h
+";
+
+%feature("docstring")  SimulationFactory::SimulationFactory "SimulationFactory::SimulationFactory()
+";
+
+
+// File: classSimulationOptions.xml
+%feature("docstring") SimulationOptions "
+
+Collect the different options for simulation  SimulationOptions.
+
+C++ includes: SimulationOptions.h
+";
+
+%feature("docstring")  SimulationOptions::SimulationOptions "SimulationOptions::SimulationOptions()
+";
+
+%feature("docstring")  SimulationOptions::isIntegrate "bool SimulationOptions::isIntegrate() const 
+";
+
+%feature("docstring")  SimulationOptions::getMcPoints "size_t SimulationOptions::getMcPoints() const 
+";
+
+%feature("docstring")  SimulationOptions::setMonteCarloIntegration "void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)
+
+Enables/disables MonetCarlo integration.
+
+Parameters:
+-----------
+
+flag: 
+If true, MonteCarlo integration will be used, otherwise analytical calculations
+
+mc_points: 
+Number of points for MonteCarlo integrator 
+";
+
+%feature("docstring")  SimulationOptions::setNumberOfThreads "void SimulationOptions::setNumberOfThreads(int nthreads)
+
+Sets number of threads to use during the simulation (0 - take the default value from the hardware) 
+";
+
+%feature("docstring")  SimulationOptions::getNumberOfThreads "int SimulationOptions::getNumberOfThreads() const 
+";
+
+%feature("docstring")  SimulationOptions::setNumberOfBatches "void SimulationOptions::setNumberOfBatches(int nbatches)
+
+Sets number of batches to split. 
+";
+
+%feature("docstring")  SimulationOptions::getNumberOfBatches "int SimulationOptions::getNumberOfBatches() const 
+";
+
+%feature("docstring")  SimulationOptions::getCurrentBatch "int SimulationOptions::getCurrentBatch() const 
+";
+
+%feature("docstring")  SimulationOptions::setThreadInfo "void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)
+
+Sets the batch and thread information to be used. 
+";
+
+%feature("docstring")  SimulationOptions::getHardwareConcurrency "int SimulationOptions::getHardwareConcurrency() const 
+";
+
+%feature("docstring")  SimulationOptions::getDefaultVariability "double SimulationOptions::getDefaultVariability() const 
+";
+
+%feature("docstring")  SimulationOptions::setIncludeSpecular "void SimulationOptions::setIncludeSpecular(bool include_specular)
+";
+
+%feature("docstring")  SimulationOptions::includeSpecular "bool SimulationOptions::includeSpecular() const 
+";
+
+
+// File: classSimulationRoiArea.xml
+%feature("docstring") SimulationRoiArea "
+
+Holds iteration logic over active detector channels in the presence of ROI. On the contrary to  SimulationArea class, iterates also over masked areas.
+
+C++ includes: SimulationArea.h
+";
+
+%feature("docstring")  SimulationRoiArea::SimulationRoiArea "SimulationRoiArea::SimulationRoiArea(const IDetector2D *detector)
+";
+
+%feature("docstring")  SimulationRoiArea::isMasked "bool SimulationRoiArea::isMasked(size_t) const
+
+returns trus if given iterator index correspond to masked detector channel 
+";
+
+
+// File: classSizeDistributionDAModelBuilder.xml
+%feature("docstring") SizeDistributionDAModelBuilder "
+
+Creates the sample demonstrating size distribution model in decoupling approximation. Equivalent of Examples/python/simulation/ex03_InterferenceFunctions/ApproximationDA.py
+
+C++ includes: SizeDistributionModelsBuilder.h
+";
+
+%feature("docstring")  SizeDistributionDAModelBuilder::SizeDistributionDAModelBuilder "SizeDistributionDAModelBuilder::SizeDistributionDAModelBuilder()
+";
+
+%feature("docstring")  SizeDistributionDAModelBuilder::buildSample "MultiLayer * SizeDistributionDAModelBuilder::buildSample() const 
+";
+
+
+// File: classSizeDistributionLMAModelBuilder.xml
+%feature("docstring") SizeDistributionLMAModelBuilder "
+
+Creates the sample demonstrating size distribution model in local monodisperse approximation. Equivalent of Examples/python/simulation/ex03_InterferenceFunctions/ApproximationLMA.py
+
+C++ includes: SizeDistributionModelsBuilder.h
+";
+
+%feature("docstring")  SizeDistributionLMAModelBuilder::SizeDistributionLMAModelBuilder "SizeDistributionLMAModelBuilder::SizeDistributionLMAModelBuilder()
+";
+
+%feature("docstring")  SizeDistributionLMAModelBuilder::buildSample "MultiLayer * SizeDistributionLMAModelBuilder::buildSample() const 
+";
+
+
+// File: classSizeDistributionSSCAModelBuilder.xml
+%feature("docstring") SizeDistributionSSCAModelBuilder "
+
+Creates the sample demonstrating size distribution model in size space coupling approximation. Equivalent of Examples/python/simulation/ex03_InterferenceFunctions/ApproximationSSCA.py
+
+C++ includes: SizeDistributionModelsBuilder.h
+";
+
+%feature("docstring")  SizeDistributionSSCAModelBuilder::SizeDistributionSSCAModelBuilder "SizeDistributionSSCAModelBuilder::SizeDistributionSSCAModelBuilder()
+";
+
+%feature("docstring")  SizeDistributionSSCAModelBuilder::buildSample "MultiLayer * SizeDistributionSSCAModelBuilder::buildSample() const 
+";
+
+
+// File: classSpecularComputation.xml
+%feature("docstring") SpecularComputation "
+
+Computes the specular scattering. Controlled by  MainComputation.
+
+C++ includes: SpecularComputation.h
+";
+
+%feature("docstring")  SpecularComputation::SpecularComputation "SpecularComputation::SpecularComputation(const MultiLayer *p_multi_layer)
+";
+
+%feature("docstring")  SpecularComputation::eval "void SpecularComputation::eval(ProgressHandler *progress, bool polarized, const std::vector< SimulationElement >::iterator &begin_it, const std::vector< SimulationElement >::iterator &end_it)
+";
+
+%feature("docstring")  SpecularComputation::setSpecularInfo "void SpecularComputation::setSpecularInfo(const LayerSpecularInfo &specular_info)
+";
+
+
+// File: classSpecularMagnetic.xml
+%feature("docstring") SpecularMagnetic "
+
+Implements the matrix formalism for the calculation of wave amplitudes of the coherent wave solution in a multilayer with magnetization.
+
+C++ includes: SpecularMagnetic.h
+";
+
+
+// File: classSpecularMatrix.xml
+%feature("docstring") SpecularMatrix "
+
+Implements method 'execute' to compute refraction angles and transmission/reflection coefficients for coherent wave propagation in a multilayer.
+
+C++ includes: SpecularMatrix.h
+";
+
+
+// File: classSpecularSimulation.xml
+%feature("docstring") SpecularSimulation "
+
+Main class to run a specular simulation.
+
+C++ includes: SpecularSimulation.h
+";
+
+%feature("docstring")  SpecularSimulation::SpecularSimulation "SpecularSimulation::SpecularSimulation()
+";
+
+%feature("docstring")  SpecularSimulation::SpecularSimulation "SpecularSimulation::SpecularSimulation(const ISample &sample)
+";
+
+%feature("docstring")  SpecularSimulation::SpecularSimulation "SpecularSimulation::SpecularSimulation(std::shared_ptr< IMultiLayerBuilder > sample_builder)
+";
+
+%feature("docstring")  SpecularSimulation::~SpecularSimulation "SpecularSimulation::~SpecularSimulation()
+";
+
+%feature("docstring")  SpecularSimulation::clone "SpecularSimulation * SpecularSimulation::clone() const 
+";
+
+%feature("docstring")  SpecularSimulation::runSimulation "void SpecularSimulation::runSimulation()
+
+Run a simulation with the current parameter settings. 
+";
+
+%feature("docstring")  SpecularSimulation::setSample "void SpecularSimulation::setSample(const ISample &sample)
+
+Sets the sample to be tested. 
+";
+
+%feature("docstring")  SpecularSimulation::getSample "ISample* SpecularSimulation::getSample() const
+
+Returns the sample. 
+";
+
+%feature("docstring")  SpecularSimulation::setSampleBuilder "void SpecularSimulation::setSampleBuilder(std::shared_ptr< IMultiLayerBuilder > sample_builder)
+
+Sets the sample builder. 
+";
+
+%feature("docstring")  SpecularSimulation::getSampleBuilder "std::shared_ptr<IMultiLayerBuilder> SpecularSimulation::getSampleBuilder() const
+
+return sample builder 
+";
+
+%feature("docstring")  SpecularSimulation::setBeamParameters "void SpecularSimulation::setBeamParameters(double lambda, const IAxis &alpha_axis)
+
+Sets beam parameters with alpha_i of the beam defined in the range. 
+";
+
+%feature("docstring")  SpecularSimulation::setBeamParameters "void SpecularSimulation::setBeamParameters(double lambda, int nbins, double alpha_i_min, double alpha_i_max)
+";
+
+%feature("docstring")  SpecularSimulation::setEvanescentWaveAxis "void SpecularSimulation::setEvanescentWaveAxis(const IAxis &z_axis)
+
+set axis for evanescent wave axis 
+";
+
+%feature("docstring")  SpecularSimulation::setEvanescentWaveAxis "void SpecularSimulation::setEvanescentWaveAxis(int nbins, double z_min, double z_max)
+";
+
+%feature("docstring")  SpecularSimulation::getAlphaAxis "const IAxis * SpecularSimulation::getAlphaAxis() const
+
+returns alpha_i axis 
+";
+
+%feature("docstring")  SpecularSimulation::getScalarR "std::vector< complex_t > SpecularSimulation::getScalarR(size_t i_layer) const
+
+returns vector of reflection coefficients for all alpha_i angles for given layer index 
+";
+
+%feature("docstring")  SpecularSimulation::getScalarT "std::vector< complex_t > SpecularSimulation::getScalarT(size_t i_layer) const
+
+returns vector of transmission coefficients for all alpha_i angles for given layer index 
+";
+
+%feature("docstring")  SpecularSimulation::getScalarKz "std::vector< complex_t > SpecularSimulation::getScalarKz(size_t i_layer) const
+
+returns vector of Kz coefficients for all alpha_i angles for given layer index 
+";
+
+%feature("docstring")  SpecularSimulation::getLayerRTCoefficients "SpecularSimulation::LayerRTCoefficients_t SpecularSimulation::getLayerRTCoefficients(size_t i_alpha, size_t i_layer) const 
+";
+
+%feature("docstring")  SpecularSimulation::prepareSimulation "void SpecularSimulation::prepareSimulation()
+
+Put into a clean state for running a simulation. 
+";
+
+
+// File: classSphericalDetector.xml
+%feature("docstring") SphericalDetector "
+
+A spherical detector with axes and resolution function.  SphericalDetector
+
+C++ includes: SphericalDetector.h
+";
+
+%feature("docstring")  SphericalDetector::SphericalDetector "SphericalDetector::SphericalDetector()
+";
+
+%feature("docstring")  SphericalDetector::SphericalDetector "SphericalDetector::SphericalDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)
+
+Spherical detector constructor using angle ranges
+
+Parameters:
+-----------
+
+n_phi: 
+number of phi-axis bins
+
+phi_min: 
+low edge of first phi-bin
+
+phi_max: 
+upper edge of last phi-bin
+
+n_alpha: 
+number of alpha-axis bins
+
+alpha_min: 
+low edge of first alpha-bin
+
+alpha_max: 
+upper edge of last alpha-bin 
+";
+
+%feature("docstring")  SphericalDetector::SphericalDetector "SphericalDetector::SphericalDetector(const SphericalDetector &other)
+";
+
+%feature("docstring")  SphericalDetector::clone "SphericalDetector * SphericalDetector::clone() const override
+";
+
+%feature("docstring")  SphericalDetector::~SphericalDetector "SphericalDetector::~SphericalDetector() override
+";
+
+%feature("docstring")  SphericalDetector::addParametersToExternalPool "std::string SphericalDetector::addParametersToExternalPool(const std::string &path, ParameterPool *external_pool, int copy_number=-1) const override
+
+Adds parameters from local pool to external pool and recursively calls its direct children. 
+";
+
+%feature("docstring")  SphericalDetector::getValidAxesUnits "std::vector< IDetector2D::EAxesUnits > SphericalDetector::getValidAxesUnits() const override
+
+returns vector of valid axes units 
+";
+
+%feature("docstring")  SphericalDetector::getDefaultAxesUnits "IDetector2D::EAxesUnits SphericalDetector::getDefaultAxesUnits() const override
+
+return default axes units 
+";
+
+
+// File: classSquaredFunctionDefault.xml
+%feature("docstring") SquaredFunctionDefault "
+
+Squared difference between two values.
+
+value = (a-b)*(a-b)/norm, where norm = max(b, 1.0) a - simulated values, b - real_values
+
+C++ includes: ISquaredFunction.h
+";
+
+%feature("docstring")  SquaredFunctionDefault::SquaredFunctionDefault "SquaredFunctionDefault::SquaredFunctionDefault()
+";
+
+%feature("docstring")  SquaredFunctionDefault::~SquaredFunctionDefault "virtual SquaredFunctionDefault::~SquaredFunctionDefault()
+";
+
+%feature("docstring")  SquaredFunctionDefault::clone "virtual SquaredFunctionDefault* SquaredFunctionDefault::clone() const 
+";
+
+%feature("docstring")  SquaredFunctionDefault::calculateSquaredDifference "virtual double SquaredFunctionDefault::calculateSquaredDifference(double real_value, double simulated_value) const 
+";
+
+%feature("docstring")  SquaredFunctionDefault::calculateSquaredError "virtual double SquaredFunctionDefault::calculateSquaredError(double real_value, double simulated_value=0) const 
+";
+
+
+// File: classSquaredFunctionGaussianError.xml
+%feature("docstring") SquaredFunctionGaussianError "
+
+Squared difference between two values with gaussian error.
+
+value = (a-b)*(a-b)/norm, where norm = sigma*sigma, sigma - is set by user
+
+C++ includes: ISquaredFunction.h
+";
+
+%feature("docstring")  SquaredFunctionGaussianError::SquaredFunctionGaussianError "SquaredFunctionGaussianError::SquaredFunctionGaussianError(double sigma=0.01)
+";
+
+%feature("docstring")  SquaredFunctionGaussianError::~SquaredFunctionGaussianError "virtual SquaredFunctionGaussianError::~SquaredFunctionGaussianError()
+";
+
+%feature("docstring")  SquaredFunctionGaussianError::clone "virtual SquaredFunctionGaussianError* SquaredFunctionGaussianError::clone() const 
+";
+
+%feature("docstring")  SquaredFunctionGaussianError::calculateSquaredDifference "virtual double SquaredFunctionGaussianError::calculateSquaredDifference(double real_value, double simulated_value) const 
+";
+
+%feature("docstring")  SquaredFunctionGaussianError::calculateSquaredError "virtual double SquaredFunctionGaussianError::calculateSquaredError(double, double) const 
+";
+
+
+// File: classSquaredFunctionMeanSquaredError.xml
+%feature("docstring") SquaredFunctionMeanSquaredError "
+
+Squared difference between two values normalized by mean squared error.
+
+value = (a-b)*(a-b)/norm, where norm = sqrt(sigma1*sigma1 + sigma2*sigma2), sigma1=max(a, 1.0), sigma2=max(b,1.0)
+
+C++ includes: ISquaredFunction.h
+";
+
+%feature("docstring")  SquaredFunctionMeanSquaredError::SquaredFunctionMeanSquaredError "SquaredFunctionMeanSquaredError::SquaredFunctionMeanSquaredError()
+";
+
+%feature("docstring")  SquaredFunctionMeanSquaredError::~SquaredFunctionMeanSquaredError "virtual SquaredFunctionMeanSquaredError::~SquaredFunctionMeanSquaredError()
+";
+
+%feature("docstring")  SquaredFunctionMeanSquaredError::clone "virtual SquaredFunctionMeanSquaredError* SquaredFunctionMeanSquaredError::clone() const 
+";
+
+%feature("docstring")  SquaredFunctionMeanSquaredError::calculateSquaredDifference "virtual double SquaredFunctionMeanSquaredError::calculateSquaredDifference(double real_value, double simulated_value) const 
+";
+
+%feature("docstring")  SquaredFunctionMeanSquaredError::calculateSquaredError "virtual double SquaredFunctionMeanSquaredError::calculateSquaredError(double real_value, double simulated_value) const 
+";
+
+
+// File: classSquaredFunctionSimError.xml
+%feature("docstring") SquaredFunctionSimError "
+
+Squared difference between two values.
+
+value = (a-b)*(a-b)/norm, where norm = max(a, 1.0) a - simulated values, b - real_values
+
+C++ includes: ISquaredFunction.h
+";
+
+%feature("docstring")  SquaredFunctionSimError::SquaredFunctionSimError "SquaredFunctionSimError::SquaredFunctionSimError()
+";
+
+%feature("docstring")  SquaredFunctionSimError::~SquaredFunctionSimError "virtual SquaredFunctionSimError::~SquaredFunctionSimError()
+";
+
+%feature("docstring")  SquaredFunctionSimError::clone "virtual SquaredFunctionSimError* SquaredFunctionSimError::clone() const 
+";
+
+%feature("docstring")  SquaredFunctionSimError::calculateSquaredDifference "virtual double SquaredFunctionSimError::calculateSquaredDifference(double real_value, double simulated_value) const 
+";
+
+%feature("docstring")  SquaredFunctionSimError::calculateSquaredError "virtual double SquaredFunctionSimError::calculateSquaredError(double, double simulated_value) const 
+";
+
+
+// File: classSquaredFunctionSystematicError.xml
+%feature("docstring") SquaredFunctionSystematicError "
+
+Squared difference between two values normalized by systematic error.
+
+value = (a-b)*(a-b)/norm, where norm = max(error, 1.0), error = b + (epsilon*b)**2
+
+C++ includes: ISquaredFunction.h
+";
+
+%feature("docstring")  SquaredFunctionSystematicError::SquaredFunctionSystematicError "SquaredFunctionSystematicError::SquaredFunctionSystematicError(double epsilon=0.08)
+";
+
+%feature("docstring")  SquaredFunctionSystematicError::~SquaredFunctionSystematicError "virtual SquaredFunctionSystematicError::~SquaredFunctionSystematicError()
+";
+
+%feature("docstring")  SquaredFunctionSystematicError::clone "virtual SquaredFunctionSystematicError* SquaredFunctionSystematicError::clone() const 
+";
+
+%feature("docstring")  SquaredFunctionSystematicError::calculateSquaredDifference "virtual double SquaredFunctionSystematicError::calculateSquaredDifference(double real_value, double simulated_value) const 
+";
+
+%feature("docstring")  SquaredFunctionSystematicError::calculateSquaredError "virtual double SquaredFunctionSystematicError::calculateSquaredError(double real_value, double) const 
+";
+
+
+// File: classSquareLatticeBuilder.xml
+%feature("docstring") SquareLatticeBuilder "
+
+Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
+
+C++ includes: TwoDimLatticeBuilder.h
+";
+
+%feature("docstring")  SquareLatticeBuilder::SquareLatticeBuilder "SquareLatticeBuilder::SquareLatticeBuilder()
+";
+
+%feature("docstring")  SquareLatticeBuilder::buildSample "MultiLayer * SquareLatticeBuilder::buildSample() const 
+";
+
+
+// File: classSSCApproximationStrategy.xml
+%feature("docstring") SSCApproximationStrategy "
+
+Virtual base class for  SSCApproximationStrategy1 and  SSCApproximationStrategy2, which compute the total scalar/polarized scattering from a decorated layer in size-spacing correlation approximation.
+
+C++ includes: SSCApproximationStrategy.h
+";
+
+%feature("docstring")  SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(double kappa)
+";
+
+
+// File: classSSCApproximationStrategy1.xml
+%feature("docstring") SSCApproximationStrategy1 "
+
+Strategy class to compute the total scalar scattering from a decorated layer in size-spacing correlation approximation.
+
+C++ includes: SSCApproximationStrategy.h
+";
+
+%feature("docstring")  SSCApproximationStrategy1::SSCApproximationStrategy1 "SSCApproximationStrategy1::SSCApproximationStrategy1(SimulationOptions sim_params, double kappa)
+";
+
+
+// File: classSSCApproximationStrategy2.xml
+%feature("docstring") SSCApproximationStrategy2 "
+
+Strategy class to compute the total polarized scattering from a decorated layer in size-spacing correlation approximation.
+
+C++ includes: SSCApproximationStrategy.h
+";
+
+%feature("docstring")  SSCApproximationStrategy2::SSCApproximationStrategy2 "SSCApproximationStrategy2::SSCApproximationStrategy2(SimulationOptions sim_params, double kappa)
+";
+
+
+// File: classStringUsageMap.xml
+%feature("docstring") StringUsageMap "
+
+Counts how often a string is used.
+
+C++ includes: StringUsageMap.h
+";
+
+%feature("docstring")  StringUsageMap::StringUsageMap "StringUsageMap::StringUsageMap()
+";
+
+%feature("docstring")  StringUsageMap::~StringUsageMap "StringUsageMap::~StringUsageMap()
+";
+
+%feature("docstring")  StringUsageMap::add "void StringUsageMap::add(const std::string &name)
+
+Adds string to the map, or increments usage counter. 
+";
+
+%feature("docstring")  StringUsageMap::begin "iterator_t StringUsageMap::begin()
+
+access to the map of strings 
+";
+
+%feature("docstring")  StringUsageMap::end "iterator_t StringUsageMap::end()
+";
+
+%feature("docstring")  StringUsageMap::get_current "std::string StringUsageMap::get_current() const
+
+Returns current string. 
+";
+
+
+// File: classUtils_1_1System.xml
+%feature("docstring") Utils::System "";
+
+
+// File: structThreadInfo.xml
+%feature("docstring") ThreadInfo "
+
+Information to run simulation with dedicated number of threads.
+
+C++ includes: ThreadInfo.h
+";
+
+%feature("docstring")  ThreadInfo::ThreadInfo "ThreadInfo::ThreadInfo()
+";
+
+
+// File: classTRange.xml
+%feature("docstring") TRange "
+
+An interval [lowerBound..upperBound[.
+
+C++ includes: TRange.h
+";
+
+%feature("docstring")  TRange::TRange "TRange< T >::TRange(T lowerBound, T upperBound)
+";
+
+%feature("docstring")  TRange::~TRange "virtual TRange< T >::~TRange()
+";
+
+%feature("docstring")  TRange::getLowerBound "T TRange< T >::getLowerBound() const 
+";
+
+%feature("docstring")  TRange::getUpperBound "T TRange< T >::getUpperBound() const 
+";
+
+%feature("docstring")  TRange::getDifference "T TRange< T >::getDifference() const 
+";
+
+%feature("docstring")  TRange::inRange "bool TRange< T >::inRange(T value) const 
+";
+
+
+// File: classTransform3D.xml
+%feature("docstring") Transform3D "
+
+Vector transformations in three dimensions.
+
+C++ includes: Transform3D.h
+";
+
+%feature("docstring")  Transform3D::Transform3D "Transform3D::Transform3D()
+
+Constructs unit transformation. 
+";
+
+%feature("docstring")  Transform3D::Transform3D "Transform3D::Transform3D(const Transform3D &other)
+
+Copy constructor. 
+";
+
+%feature("docstring")  Transform3D::~Transform3D "Transform3D::~Transform3D()
+
+Destructor. 
+";
+
+%feature("docstring")  Transform3D::clone "Transform3D * Transform3D::clone() const
+
+Clones the transformation. 
+";
+
+%feature("docstring")  Transform3D::calculateEulerAngles "void Transform3D::calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const
+
+Calculates the Euler angles corresponding to the rotation. 
+";
+
+%feature("docstring")  Transform3D::getInverse "Transform3D Transform3D::getInverse() const
+
+Returns the inverse transformation. 
+";
+
+%feature("docstring")  Transform3D::transformed "BasicVector3D< double > Transform3D::transformed(const BasicVector3D< double > &v) const
+
+Return transformed vector  v. 
+";
+
+%feature("docstring")  Transform3D::transformed "BasicVector3D< complex_t > Transform3D::transformed(const BasicVector3D< complex_t > &v) const
+
+Return transformed vector  v. 
+";
+
+%feature("docstring")  Transform3D::transformedInverse "BasicVector3D< double > Transform3D::transformedInverse(const BasicVector3D< double > &v) const
+
+Return transformed vector  v. 
+";
+
+%feature("docstring")  Transform3D::transformedInverse "BasicVector3D< complex_t > Transform3D::transformedInverse(const BasicVector3D< complex_t > &v) const
+
+Return transformed vector  v. 
+";
+
+%feature("docstring")  Transform3D::getRotationType "Transform3D::ERotationType Transform3D::getRotationType() const
+
+Retrieve the rotation type (general, around x, y or z-axis) 
+";
+
+%feature("docstring")  Transform3D::isIdentity "bool Transform3D::isIdentity() const
+
+Determine if the transformation is trivial (identity) 
+";
+
+%feature("docstring")  Transform3D::print "void Transform3D::print(std::ostream &ostr) const 
+";
+
+
+// File: classTransformBoxBuilder.xml
+%feature("docstring") TransformBoxBuilder "
+
+Rotated box in 3 layers system.
+
+C++ includes: TransformationsBuilder.h
+";
+
+%feature("docstring")  TransformBoxBuilder::TransformBoxBuilder "TransformBoxBuilder::TransformBoxBuilder()
+";
+
+%feature("docstring")  TransformBoxBuilder::buildSample "MultiLayer * TransformBoxBuilder::buildSample() const 
+";
+
+
+// File: classTriangularRippleBuilder.xml
+%feature("docstring") TriangularRippleBuilder "
+
+Builds sample: triangular ripple within the 1D-paracrystal model (from PRB 85, 235415, 2012)
+
+C++ includes: RipplesBuilder.h
+";
+
+%feature("docstring")  TriangularRippleBuilder::TriangularRippleBuilder "TriangularRippleBuilder::TriangularRippleBuilder()
+";
+
+%feature("docstring")  TriangularRippleBuilder::buildSample "MultiLayer * TriangularRippleBuilder::buildSample() const 
+";
+
+
+// File: classTSampledRange.xml
+%feature("docstring") TSampledRange "
+
+An interval [lowerBound..upperBound[, and a number of samples.
+
+C++ includes: TRange.h
+";
+
+%feature("docstring")  TSampledRange::TSampledRange "TSampledRange< T >::TSampledRange(size_t n_samples, T lowerBound, T upperBound)
+";
+
+%feature("docstring")  TSampledRange::getNSamples "size_t TSampledRange< T >::getNSamples() const 
+";
+
+
+// File: classTwoTypesCylindersDistributionBuilder.xml
+%feature("docstring") TwoTypesCylindersDistributionBuilder "
+
+Builds mixture of cylinder particles with different size distribution (IsGISAXS example #2)
+
+C++ includes: ParticleDistributionsBuilder.h
+";
+
+%feature("docstring")  TwoTypesCylindersDistributionBuilder::TwoTypesCylindersDistributionBuilder "TwoTypesCylindersDistributionBuilder::TwoTypesCylindersDistributionBuilder()
+";
+
+%feature("docstring")  TwoTypesCylindersDistributionBuilder::buildSample "MultiLayer * TwoTypesCylindersDistributionBuilder::buildSample() const 
+";
+
+
+// File: classUnit.xml
+%feature("docstring") Unit "
+
+A physical unit.
+
+C++ includes: Unit.h
+";
+
+%feature("docstring")  Unit::Unit "Unit::Unit(const std::string &name=\"\")
+";
+
+%feature("docstring")  Unit::setUnit "void Unit::setUnit(const std::string &name)
+";
+
+
+// File: classExceptions_1_1UnknownClassRegistrationException.xml
+%feature("docstring") Exceptions::UnknownClassRegistrationException "";
+
+%feature("docstring")  Exceptions::UnknownClassRegistrationException::UnknownClassRegistrationException "Exceptions::UnknownClassRegistrationException::UnknownClassRegistrationException(const std::string &message)
+";
+
+
+// File: classVariableBinAxis.xml
+%feature("docstring") VariableBinAxis "
+
+Axis with variable bin size.
+
+C++ includes: VariableBinAxis.h
+";
+
+%feature("docstring")  VariableBinAxis::VariableBinAxis "VariableBinAxis::VariableBinAxis(const std::string &name, size_t nbins, const std::vector< double > &bin_boundaries)
+
+VariableBinAxis constructor.
+
+Parameters:
+-----------
+
+name: 
+Axis name
+
+nbins: 
+number of bins
+
+bin_boundaries: 
+Array of size nbins+1 containing low-edges for each bin and upper edge of last bin. 
+";
+
+%feature("docstring")  VariableBinAxis::~VariableBinAxis "virtual VariableBinAxis::~VariableBinAxis()
+";
+
+%feature("docstring")  VariableBinAxis::clone "VariableBinAxis * VariableBinAxis::clone() const
+
+clone function 
+";
+
+%feature("docstring")  VariableBinAxis::size "size_t VariableBinAxis::size() const
+
+retrieve the number of bins 
+";
+
+%feature("docstring")  VariableBinAxis::getBin "Bin1D VariableBinAxis::getBin(size_t index) const
+
+retrieve a 1d bin for the given index 
+";
+
+%feature("docstring")  VariableBinAxis::getMin "double VariableBinAxis::getMin() const
+
+Returns value of first point of axis. 
+";
+
+%feature("docstring")  VariableBinAxis::getMax "double VariableBinAxis::getMax() const
+
+Returns value of last point of axis. 
+";
+
+%feature("docstring")  VariableBinAxis::getBinCenter "double VariableBinAxis::getBinCenter(size_t index) const 
+";
+
+%feature("docstring")  VariableBinAxis::findClosestIndex "size_t VariableBinAxis::findClosestIndex(double value) const
+
+find bin index which is best match for given value 
+";
+
+%feature("docstring")  VariableBinAxis::getBinCenters "std::vector< double > VariableBinAxis::getBinCenters() const 
+";
+
+%feature("docstring")  VariableBinAxis::getBinBoundaries "std::vector<double> VariableBinAxis::getBinBoundaries() const 
+";
+
+%feature("docstring")  VariableBinAxis::createClippedAxis "VariableBinAxis * VariableBinAxis::createClippedAxis(double left, double right) const
+
+Creates a new clipped axis. 
+";
+
+
+// File: classGeometry_1_1VerticalLine.xml
+%feature("docstring") Geometry::VerticalLine "
+
+An infinite vertical line.
+
+C++ includes: Line.h
+";
+
+%feature("docstring")  Geometry::VerticalLine::VerticalLine "Geometry::VerticalLine::VerticalLine(double x)
+
+Parameters:
+-----------
+
+x: 
+The value at which it crosses x-axes 
+";
+
+%feature("docstring")  Geometry::VerticalLine::clone "VerticalLine* Geometry::VerticalLine::clone() const 
+";
+
+%feature("docstring")  Geometry::VerticalLine::contains "bool Geometry::VerticalLine::contains(double x, double y) const
+
+Returns true if point with given coordinates is inside or on border of the shape. 
+";
+
+%feature("docstring")  Geometry::VerticalLine::contains "bool Geometry::VerticalLine::contains(const Bin1D &binx, const Bin1D &biny) const
+
+Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+";
+
+%feature("docstring")  Geometry::VerticalLine::getXpos "double Geometry::VerticalLine::getXpos() const 
+";
+
+
+// File: classWavevectorInfo.xml
+%feature("docstring") WavevectorInfo "
+
+Holds all wavevector information relevant for calculating form factors.
+
+C++ includes: WavevectorInfo.h
+";
+
+%feature("docstring")  WavevectorInfo::WavevectorInfo "WavevectorInfo::WavevectorInfo()
+";
+
+%feature("docstring")  WavevectorInfo::WavevectorInfo "WavevectorInfo::WavevectorInfo(cvector_t ki, cvector_t kf, double wavelength)
+";
+
+%feature("docstring")  WavevectorInfo::WavevectorInfo "WavevectorInfo::WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)
+";
+
+%feature("docstring")  WavevectorInfo::getKi "cvector_t WavevectorInfo::getKi() const 
+";
+
+%feature("docstring")  WavevectorInfo::getKf "cvector_t WavevectorInfo::getKf() const 
+";
+
+%feature("docstring")  WavevectorInfo::getQ "cvector_t WavevectorInfo::getQ() const 
+";
+
+%feature("docstring")  WavevectorInfo::getWavelength "double WavevectorInfo::getWavelength() const 
+";
+
+
+// File: classMathFunctions_1_1Convolve_1_1Workspace.xml
+
+
+// File: namespace_0D276.xml
+
+
+// File: namespace_0D306.xml
+
+
+// File: namespace_0D429.xml
+
+
+// File: namespace_0D57.xml
+
+
+// File: namespace_0D72.xml
+
+
+// File: namespaceboost_1_1geometry.xml
+
+
+// File: namespaceBornAgain.xml
+
+
+// File: namespaceDetectorFunctions.xml
+%feature("docstring")  DetectorFunctions::hasSameDimensions "bool DetectorFunctions::hasSameDimensions(const IDetector2D &detector, const OutputData< double > &data)
+
+Returns true if the data has same axes size (nx,ny) with the detector. 
+";
+
+%feature("docstring")  DetectorFunctions::axesToString "std::string DetectorFunctions::axesToString(const IDetector2D &detector)
+
+Returns string representation of axes dimension in the form \"(nx,ny)\". 
+";
+
+%feature("docstring")  DetectorFunctions::axesToString "std::string DetectorFunctions::axesToString(const OutputData< double > &data)
+
+Returns string representation of axes dimension in the form \"(nx,ny)\". 
+";
+
+%feature("docstring")  DetectorFunctions::createDataSet "std::unique_ptr< OutputData< double > > DetectorFunctions::createDataSet(const Instrument &instrument, const OutputData< double > &data, bool put_masked_areas_to_zero=true)
+
+Creates real data containing original user data clipped to the ROI area of the detector. If put_masked_areas_to_zero==true: resulting data will have 0.0 in all masked areas If put_masked_areas_to_zero==false: resulting data will be only cropped, masked areas will still contain intensities TODO: what users will like more (this appears on FitSuitePlotObserver)? 
+";
+
+
+// File: namespaceExceptions.xml
+%feature("docstring")  Exceptions::LogExceptionMessage "void Exceptions::LogExceptionMessage(const std::string &message)
+";
+
+
+// File: namespaceFileSystem.xml
+%feature("docstring")  FileSystem::GetFileExtension "std::string FileSystem::GetFileExtension(const std::string &name)
+
+Returns file extension. 
+";
+
+%feature("docstring")  FileSystem::CreateDirectory "bool FileSystem::CreateDirectory(const std::string &dir_name)
+
+creates directory in current directory 
+";
+
+%feature("docstring")  FileSystem::filesInDirectory "std::vector< std::string > FileSystem::filesInDirectory(const std::string &dir_name)
+
+Returns filenames of files in directory. 
+";
+
+%feature("docstring")  FileSystem::GetJoinPath "std::string FileSystem::GetJoinPath(const std::string &spath1, const std::string &spath2)
+
+join paths together 
+";
+
+%feature("docstring")  FileSystem::filename "std::string FileSystem::filename(const std::string &path)
+
+Returns path without directory part (\"Foo/Bar/Doz.int.gz\" -> \"Doz.int.gz\") 
+";
+
+%feature("docstring")  FileSystem::reglob "std::vector< std::string > FileSystem::reglob(const std::string &dir, const std::string &pattern)
+
+Returns file names that agree with a regex glob pattern. 
+";
+
+
+// File: namespaceGeometry.xml
+
+
+// File: namespaceIntensityDataFunctions.xml
+%feature("docstring")  IntensityDataFunctions::getRelativeDifference "BA_CORE_API_ double IntensityDataFunctions::getRelativeDifference(const OutputData< double > &dat, const OutputData< double > &ref)
+";
+
+%feature("docstring")  IntensityDataFunctions::getRelativeDifference "BA_CORE_API_ double IntensityDataFunctions::getRelativeDifference(const IHistogram &dat, const IHistogram &ref)
+";
+
+%feature("docstring")  IntensityDataFunctions::createRelativeDifferenceData "BA_CORE_API_ OutputData<double>* IntensityDataFunctions::createRelativeDifferenceData(const OutputData< double > &data, const OutputData< double > &reference)
+";
+
+%feature("docstring")  IntensityDataFunctions::createClippedDataSet "BA_CORE_API_ OutputData<double>* IntensityDataFunctions::createClippedDataSet(const OutputData< double > &origin, double x1, double y1, double x2, double y2)
+
+Returns new IntensityData objects which axes clipped to represent the specified rectangle 
+";
+
+%feature("docstring")  IntensityDataFunctions::applyDetectorResolution "BA_CORE_API_ OutputData<double>* IntensityDataFunctions::applyDetectorResolution(const OutputData< double > &origin, const IResolutionFunction2D &resolution_function)
+
+Applies detector resolution function and returns new IntensityData object. 
+";
+
+%feature("docstring")  IntensityDataFunctions::coordinateToBinf "BA_CORE_API_ double IntensityDataFunctions::coordinateToBinf(double coordinate, const IAxis &axis)
+
+Transforms coordinate on axis into the bin-fraction-coordinate. 
+";
+
+%feature("docstring")  IntensityDataFunctions::coordinateFromBinf "BA_CORE_API_ double IntensityDataFunctions::coordinateFromBinf(double value, const IAxis &axis)
+
+Transforms bin-fraction-coordinate into axis coordinate. 
+";
+
+%feature("docstring")  IntensityDataFunctions::coordinateToBinf "BA_CORE_API_ void IntensityDataFunctions::coordinateToBinf(double &x, double &y, const OutputData< double > &data)
+
+Transform x,y coordinate from  OutputData axes coordinates to bin-fraction-coordinates 
+";
+
+%feature("docstring")  IntensityDataFunctions::coordinateFromBinf "BA_CORE_API_ void IntensityDataFunctions::coordinateFromBinf(double &x, double &y, const OutputData< double > &data)
+
+Transform x,y coordinate from bin-fraction-coordinates to  OutputData's axes coordinates 
+";
+
+
+// File: namespaceMaterials.xml
+%feature("docstring")  Materials::createInvertedMaterial "IMaterial * Materials::createInvertedMaterial(const IMaterial *material)
+";
+
+
+// File: namespaceMathFunctions.xml
+%feature("docstring")  MathFunctions::Bessel_J0_PowSer "complex_t MathFunctions::Bessel_J0_PowSer(const complex_t z)
+
+Computes complex Bessel function J0(z), using power series and asymptotic expansion.
+
+Computes the complex Bessel function J0(z), using power series and asymptotic expansion.
+
+Forked from unoptimized code at http://www.crbond.com/math.htm, who refers to \"Computation of Special Functions\", Zhang and Jin, John Wiley and Sons, 1996. 
+";
+
+%feature("docstring")  MathFunctions::Bessel_J1_PowSer "complex_t MathFunctions::Bessel_J1_PowSer(const complex_t z)
+
+Computes complex Bessel function J0(z), using power series and asymptotic expansion.
+
+Computes the complex Bessel function J1(z), using power series and asymptotic expansion.
+
+Forked from same source as for Bessel_J0_PowSer 
+";
+
+%feature("docstring")  MathFunctions::StandardNormal "double MathFunctions::StandardNormal(double x)
+";
+
+%feature("docstring")  MathFunctions::Gaussian "double MathFunctions::Gaussian(double x, double average, double std_dev)
+";
+
+%feature("docstring")  MathFunctions::IntegratedGaussian "double MathFunctions::IntegratedGaussian(double x, double average, double std_dev)
+";
+
+%feature("docstring")  MathFunctions::cot "double MathFunctions::cot(double x)
+
+cotangent function:  $cot(x)\\\\equiv1/tan(x)$
+";
+
+%feature("docstring")  MathFunctions::Si "double MathFunctions::Si(double x)
+
+Sine integral function:  $Si(x)\\\\equiv\\\\int_0^x du \\\\sin(u)/u$. 
+";
+
+%feature("docstring")  MathFunctions::sinc "double MathFunctions::sinc(double x)
+
+sinc function:  $sinc(x)\\\\equiv\\\\sin(x)/x$
+";
+
+%feature("docstring")  MathFunctions::sinc "complex_t MathFunctions::sinc(const complex_t z)
+
+Complex sinc function:  $sinc(x)\\\\equiv\\\\sin(x)/x$. 
+";
+
+%feature("docstring")  MathFunctions::tanhc "complex_t MathFunctions::tanhc(const complex_t z)
+
+Complex tanhc function:  $tanhc(x)\\\\equiv\\\\tanh(x)/x$. 
+";
+
+%feature("docstring")  MathFunctions::Laue "complex_t MathFunctions::Laue(const complex_t z, size_t N)
+";
+
+%feature("docstring")  MathFunctions::Bessel_J0 "double MathFunctions::Bessel_J0(double x)
+
+Bessel function of the first kind and order 0. 
+";
+
+%feature("docstring")  MathFunctions::Bessel_J1 "double MathFunctions::Bessel_J1(double x)
+
+Bessel function of the first kind and order 1. 
+";
+
+%feature("docstring")  MathFunctions::Bessel_J1c "double MathFunctions::Bessel_J1c(double x)
+
+Bessel function Bessel_J1(x)/x. 
+";
+
+%feature("docstring")  MathFunctions::Bessel_J0 "complex_t MathFunctions::Bessel_J0(const complex_t z)
+
+Complex Bessel function of the first kind and order 0. 
+";
+
+%feature("docstring")  MathFunctions::Bessel_J1 "complex_t MathFunctions::Bessel_J1(const complex_t z)
+
+Complex Bessel function of the first kind and order 1. 
+";
+
+%feature("docstring")  MathFunctions::Bessel_J1c "complex_t MathFunctions::Bessel_J1c(const complex_t z)
+
+Complex Bessel function Bessel_J1(x)/x. 
+";
+
+%feature("docstring")  MathFunctions::FastFourierTransform "std::vector< complex_t > MathFunctions::FastFourierTransform(const std::vector< complex_t > &data, EFFTDirection tcase)
+
+simple (and unoptimized) wrapper function for the discrete fast Fourier transformation library (fftw3) 
+";
+
+%feature("docstring")  MathFunctions::FastFourierTransform "std::vector< complex_t > MathFunctions::FastFourierTransform(const std::vector< double > &data, EFFTDirection tcase)
+
+simple (and unoptimized) wrapper function for the discrete fast Fourier transformation library (fftw3); transforms real to complex 
+";
+
+%feature("docstring")  MathFunctions::ConvolveFFT "std::vector< complex_t > MathFunctions::ConvolveFFT(const std::vector< double > &signal, const std::vector< double > &resfunc)
+
+convolution of two real vectors of equal size 
+";
+
+%feature("docstring")  MathFunctions::GenerateUniformRandom "double MathFunctions::GenerateUniformRandom()
+";
+
+%feature("docstring")  MathFunctions::GenerateStandardNormalRandom "double MathFunctions::GenerateStandardNormalRandom()
+";
+
+%feature("docstring")  MathFunctions::GenerateNormalRandom "double MathFunctions::GenerateNormalRandom(double average, double std_dev)
+";
+
+
+// File: namespaceNumeric.xml
+%feature("docstring")  Numeric::areAlmostEqual "bool BA_CORE_API_ Numeric::areAlmostEqual(double a, double b, double tolerance)
+
+Returns true if two doubles agree within epsilon*tolerance. 
+";
+
+%feature("docstring")  Numeric::get_relative_difference "double BA_CORE_API_ Numeric::get_relative_difference(double a, double b)
+
+Returns the safe relative difference, which is |(a-b)/b| except in special cases. 
+";
+
+
+// File: namespaceOutputDataIOHelper.xml
+%feature("docstring")  OutputDataIOHelper::isCompressed "bool OutputDataIOHelper::isCompressed(const std::string &name)
+
+Returns true if name contains *.gz extension. 
+";
+
+%feature("docstring")  OutputDataIOHelper::isGZipped "bool OutputDataIOHelper::isGZipped(const std::string &name)
+
+Returns true if name contains *.gz extension.
+
+Does name contain *.gz extension? 
+";
+
+%feature("docstring")  OutputDataIOHelper::isBZipped "bool OutputDataIOHelper::isBZipped(const std::string &name)
+
+Returns true if name contains *.bz2 extension. 
+";
+
+%feature("docstring")  OutputDataIOHelper::GetFileMainExtension "std::string OutputDataIOHelper::GetFileMainExtension(const std::string &name)
+
+Returns file extension after stripping '.gz' if any.
+
+Returns file main extension (without .gz). 
+";
+
+%feature("docstring")  OutputDataIOHelper::isBinaryFile "bool OutputDataIOHelper::isBinaryFile(const std::string &file_name)
+
+returns true if file name corresponds to a binary file 
+";
+
+%feature("docstring")  OutputDataIOHelper::isIntFile "bool OutputDataIOHelper::isIntFile(const std::string &file_name)
+
+returns true if file name corresponds to BornAgain native format (compressed or not) 
+";
+
+%feature("docstring")  OutputDataIOHelper::isTxtFile "bool OutputDataIOHelper::isTxtFile(const std::string &file_name)
+
+returns true if file name corresponds to simple numpy-style ASCII file 
+";
+
+%feature("docstring")  OutputDataIOHelper::isTiffFile "bool OutputDataIOHelper::isTiffFile(const std::string &file_name)
+
+returns true if file name corresponds to tiff file (can be also compressed) 
+";
+
+%feature("docstring")  OutputDataIOHelper::isSimilarToFixedBinAxisType "bool OutputDataIOHelper::isSimilarToFixedBinAxisType(const std::string &line)
+
+Returns true if string representation of the axis contains one of  FixedBinAxis,  ConstKBinAxis or  CustomBinAxis to parse it later in similar way. 
+";
+
+%feature("docstring")  OutputDataIOHelper::isVariableBinAxisType "bool OutputDataIOHelper::isVariableBinAxisType(const std::string &line)
+";
+
+%feature("docstring")  OutputDataIOHelper::createAxis "IAxis * OutputDataIOHelper::createAxis(std::istream &input_stream)
+
+Creates axis of certain type from input stream. 
+";
+
+%feature("docstring")  OutputDataIOHelper::createFixedBinAxis "IAxis * OutputDataIOHelper::createFixedBinAxis(std::string line)
+
+Create one of  FixedBinAxis from string representation  FixedBinAxis(\"axis0\", 10, -1, 1)  ConstKBinAxis(\"axis0\", 10, -1, 1)  CustomBinAxis(\"axis0\", 10, -1, 1) 
+";
+
+%feature("docstring")  OutputDataIOHelper::createVariableBinAxis "IAxis * OutputDataIOHelper::createVariableBinAxis(std::string line)
+
+Create  VariableBinAxis from string representation  VariableBinAxis(\"axis0\", 4, [-1, -0.5, 0.5, 1, 2]) 
+";
+
+%feature("docstring")  OutputDataIOHelper::fillOutputData "void OutputDataIOHelper::fillOutputData(OutputData< double > *data, std::istream &input_stream)
+
+Fills output data raw buffer from input stream. 
+";
+
+%feature("docstring")  OutputDataIOHelper::parse_doubles "std::vector< double > OutputDataIOHelper::parse_doubles(const std::string &str)
+
+Parse double values from string to vector of double. 
+";
+
+%feature("docstring")  OutputDataIOHelper::readLineOfDoubles "void OutputDataIOHelper::readLineOfDoubles(std::vector< double > &buffer, std::istringstream &iss)
+";
+
+
+// File: namespacePythonFormatting.xml
+%feature("docstring")  PythonFormatting::representShape2D "BA_CORE_API_ std::string PythonFormatting::representShape2D(const std::string &indent, const Geometry::IShape2D *ishape, bool mask_value, std::function< std::string(double)> printValueFunc)
+
+Returns fixed Python code snippet that defines the function \"runSimulation\". 
+";
+
+%feature("docstring")  PythonFormatting::printBool "BA_CORE_API_ std::string PythonFormatting::printBool(double value)
+";
+
+%feature("docstring")  PythonFormatting::printDouble "BA_CORE_API_ std::string PythonFormatting::printDouble(double input)
+";
+
+%feature("docstring")  PythonFormatting::printNm "BA_CORE_API_ std::string PythonFormatting::printNm(double input)
+";
+
+%feature("docstring")  PythonFormatting::printScientificDouble "BA_CORE_API_ std::string PythonFormatting::printScientificDouble(double input)
+";
+
+%feature("docstring")  PythonFormatting::printDegrees "BA_CORE_API_ std::string PythonFormatting::printDegrees(double input)
+";
+
+%feature("docstring")  PythonFormatting::isSquare "BA_CORE_API_ bool PythonFormatting::isSquare(double length1, double length2, double angle)
+";
+
+%feature("docstring")  PythonFormatting::isHexagonal "BA_CORE_API_ bool PythonFormatting::isHexagonal(double length1, double length2, double angle)
+";
+
+%feature("docstring")  PythonFormatting::printKvector "BA_CORE_API_ std::string PythonFormatting::printKvector(const kvector_t value)
+";
+
+%feature("docstring")  PythonFormatting::isDefaultDirection "BA_CORE_API_ bool PythonFormatting::isDefaultDirection(const kvector_t direction)
+
+returns true if it is (0, -1, 0) vector 
+";
+
+%feature("docstring")  PythonFormatting::valueTimesUnit "BA_CORE_API_ std::string PythonFormatting::valueTimesUnit(const RealParameter *par)
+
+Returns parameter value, followed by its unit multiplicator (like \"* nm\"). 
+";
+
+%feature("docstring")  PythonFormatting::argumentList "BA_CORE_API_ std::string PythonFormatting::argumentList(const IParameterized *ip)
+
+Returns comma-separated list of parameter values, including unit multiplicator (like \"* nm\"). 
+";
+
+%feature("docstring")  PythonFormatting::simulationToPython "std::string PythonFormatting::simulationToPython(GISASSimulation *simulation)
+";
+
+
+// File: namespaceStandardSimulations.xml
+%feature("docstring")  StandardSimulations::PolarizedDWBAMagCylinders2 "GISASSimulation * StandardSimulations::PolarizedDWBAMagCylinders2()
+";
+
+%feature("docstring")  StandardSimulations::BasicGISAS "GISASSimulation * StandardSimulations::BasicGISAS()
+
+Basic GISAS simulation with the detector phi[0,2], theta[0,2]. 
+";
+
+%feature("docstring")  StandardSimulations::BasicGISAS00 "GISASSimulation * StandardSimulations::BasicGISAS00()
+
+Basic GISAS for polarization studies. 
+";
+
+%feature("docstring")  StandardSimulations::MiniGISAS "GISASSimulation * StandardSimulations::MiniGISAS()
+
+GISAS simulation with small detector and phi[-2,2], theta[0,2]. 
+";
+
+%feature("docstring")  StandardSimulations::MiniGISAS_v2 "GISASSimulation * StandardSimulations::MiniGISAS_v2()
+
+GISAS simulation with small detector and phi[-1,1], theta[0,1]. 
+";
+
+%feature("docstring")  StandardSimulations::MiniGISASBeamDivergence "GISASSimulation * StandardSimulations::MiniGISASBeamDivergence()
+
+GISAS simulation with beam divergence applied. 
+";
+
+%feature("docstring")  StandardSimulations::MiniGISASDetectorResolution "GISASSimulation * StandardSimulations::MiniGISASDetectorResolution()
+
+GISAS simulation with detector resolution. 
+";
+
+%feature("docstring")  StandardSimulations::GISASWithMasks "GISASSimulation * StandardSimulations::GISASWithMasks()
+
+GISAS simulation with multiple masks on the detector plane. 
+";
+
+%feature("docstring")  StandardSimulations::MaxiGISAS "GISASSimulation * StandardSimulations::MaxiGISAS()
+
+GISAS simulation with large detector to test performance. 
+";
+
+%feature("docstring")  StandardSimulations::MaxiGISAS00 "GISASSimulation * StandardSimulations::MaxiGISAS00()
+
+Basic GISAS for polarization studies. 
+";
+
+%feature("docstring")  StandardSimulations::IsGISAXSSimulation1 "GISASSimulation * StandardSimulations::IsGISAXSSimulation1()
+
+Typical IsGISAXS simulation with the detector phi[-1,1], theta[0,2]. 
+";
+
+%feature("docstring")  StandardSimulations::IsGISAXSSimulation2 "GISASSimulation * StandardSimulations::IsGISAXSSimulation2()
+
+Typical IsGISAXS simulation with the detector phi[0,2], theta[0,2]. 
+";
+
+%feature("docstring")  StandardSimulations::RectDetectorGeneric "GISASSimulation * StandardSimulations::RectDetectorGeneric()
+
+GISAS simulation with generic rectangular detector. 
+";
+
+%feature("docstring")  StandardSimulations::RectDetectorPerpToSample "GISASSimulation * StandardSimulations::RectDetectorPerpToSample()
+
+GISAS simulation with the rectangular detector perpendicular to the sample. 
+";
+
+%feature("docstring")  StandardSimulations::RectDetectorPerpToDirectBeam "GISASSimulation * StandardSimulations::RectDetectorPerpToDirectBeam()
+
+GISAS simulation with the rectangular detector perpendicular to the direct beam. 
+";
+
+%feature("docstring")  StandardSimulations::RectDetectorPerpToReflectedBeam "GISASSimulation * StandardSimulations::RectDetectorPerpToReflectedBeam()
+
+GISAS simulation with the rectangular detector perpendicular to the reflected beam. 
+";
+
+%feature("docstring")  StandardSimulations::RectDetectorPerpToReflectedBeamDpos "GISASSimulation * StandardSimulations::RectDetectorPerpToReflectedBeamDpos()
+
+GISAS simulation with the rectangular detector perpendicular to the reflected beam when the coordinates of direct beam are known. 
+";
+
+%feature("docstring")  StandardSimulations::MiniGISASMonteCarlo "GISASSimulation * StandardSimulations::MiniGISASMonteCarlo()
+
+GISAS simulation with Monte-Carlo integration switched ON. 
+";
+
+%feature("docstring")  StandardSimulations::SphericalDetWithRoi "GISASSimulation * StandardSimulations::SphericalDetWithRoi()
+
+GISAS simulation with spherical detector, region of interest and mask. 
+";
+
+%feature("docstring")  StandardSimulations::RectDetWithRoi "GISASSimulation * StandardSimulations::RectDetWithRoi()
+
+GISAS simulation with rectangular detector, region of interest and mask. 
+";
+
+
+// File: namespaceUnits.xml
+%feature("docstring")  Units::rad2deg "double Units::rad2deg(double angle)
+";
+
+%feature("docstring")  Units::deg2rad "double Units::deg2rad(double angle)
+";
+
+
+// File: namespaceUtils.xml
+%feature("docstring")  Utils::EnableFloatingPointExceptions "void Utils::EnableFloatingPointExceptions()
+
+enables exception throw in the case of NaN, Inf 
+";
+
+
+// File: FormFactorWrapper_8cpp.xml
+
+
+// File: FormFactorWrapper_8h.xml
+
+
+// File: FTDecayFunctions_8cpp.xml
+
+
+// File: FTDecayFunctions_8h.xml
+
+
+// File: FTDistributions1D_8cpp.xml
+
+
+// File: FTDistributions1D_8h.xml
+
+
+// File: FTDistributions2D_8cpp.xml
+
+
+// File: FTDistributions2D_8h.xml
+
+
+// File: IInterferenceFunction_8h.xml
+
+
+// File: ILayout_8h.xml
+
+
+// File: InterferenceFunction1DLattice_8cpp.xml
+
+
+// File: InterferenceFunction1DLattice_8h.xml
+
+
+// File: InterferenceFunction2DLattice_8cpp.xml
+
+
+// File: InterferenceFunction2DLattice_8h.xml
+
+
+// File: InterferenceFunction2DParaCrystal_8cpp.xml
+
+
+// File: InterferenceFunction2DParaCrystal_8h.xml
+
+
+// File: InterferenceFunctionNone_8cpp.xml
+
+
+// File: InterferenceFunctionNone_8h.xml
+
+
+// File: InterferenceFunctionRadialParaCrystal_8cpp.xml
+
+
+// File: InterferenceFunctionRadialParaCrystal_8h.xml
+
+
+// File: ParticleLayout_8cpp.xml
+
+
+// File: ParticleLayout_8h.xml
+
+
+// File: BornAgainNamespace_8h.xml
+
+
+// File: Complex_8h.xml
+%feature("docstring")  mul_I "complex_t mul_I(complex_t z)
+
+Returns product I*z, where I is the imaginary unit. 
+";
+
+%feature("docstring")  exp_I "complex_t exp_I(complex_t z)
+
+Returns exp(I*z), where I is the imaginary unit. 
+";
+
+
+// File: Exceptions_8cpp.xml
+
+
+// File: Exceptions_8h.xml
+
+
+// File: ICloneable_8h.xml
+
+
+// File: INamed_8h.xml
+
+
+// File: INoncopyable_8h.xml
+
+
+// File: IShareable_8h.xml
+
+
+// File: ISingleton_8h.xml
+
+
+// File: Macros_8h.xml
+
+
+// File: MathConstants_8h.xml
+
+
+// File: Bin_8cpp.xml
+%feature("docstring")  BinContains "bool BinContains(const Bin1D &bin, double value)
+
+Checks if value is contained in bin: value in [m_lower, m_upper) 
+";
+
+
+// File: Bin_8h.xml
+%feature("docstring")  BinContains "bool BinContains(const Bin1D &bin, double value)
+
+Checks if value is contained in bin: value in [m_lower, m_upper) 
+";
+
+
+// File: ConstKBinAxis_8cpp.xml
+
+
+// File: ConstKBinAxis_8h.xml
+
+
+// File: CustomBinAxis_8cpp.xml
+
+
+// File: CustomBinAxis_8h.xml
+
+
+// File: FixedBinAxis_8cpp.xml
+
+
+// File: FixedBinAxis_8h.xml
+
+
+// File: IAxis_8cpp.xml
+
+
+// File: IAxis_8h.xml
+%feature("docstring")  HaveSameNameAndShape "bool HaveSameNameAndShape(const IAxis &left, const IAxis &right)
+
+global helper function for comparison of axes 
+";
+
+
+// File: IPixelMap_8h.xml
+
+
+// File: SimulationElement_8cpp.xml
+%feature("docstring")  addElementsWithWeight "void addElementsWithWeight(std::vector< SimulationElement >::const_iterator first, std::vector< SimulationElement >::const_iterator last, std::vector< SimulationElement >::iterator result, double weight)
+
+Add element vector to element vector with weight. 
+";
+
+%feature("docstring")  setAllElementIntensities "void setAllElementIntensities(std::vector< SimulationElement >::iterator first, std::vector< SimulationElement >::iterator last, double intensity)
+
+Set all element intensities to given value. 
+";
+
+
+// File: SimulationElement_8h.xml
+%feature("docstring")  addElementsWithWeight "void addElementsWithWeight(std::vector< SimulationElement >::const_iterator first, std::vector< SimulationElement >::const_iterator last, std::vector< SimulationElement >::iterator result, double weight)
+
+Add element vector to element vector with weight. 
+";
+
+%feature("docstring")  setAllElementIntensities "void setAllElementIntensities(std::vector< SimulationElement >::iterator first, std::vector< SimulationElement >::iterator last, double intensity)
+
+Set all element intensities to given value. 
+";
+
+
+// File: VariableBinAxis_8cpp.xml
+
+
+// File: VariableBinAxis_8h.xml
+
+
+// File: ComputationOutcome_8h.xml
+
+
+// File: DecoratedLayerComputation_8cpp.xml
+
+
+// File: DecoratedLayerComputation_8h.xml
+
+
+// File: InnerCounter_8cpp.xml
+
+
+// File: InnerCounter_8h.xml
+
+
+// File: MainComputation_8cpp.xml
+
+
+// File: MainComputation_8h.xml
+
+
+// File: ProgressHandler_8cpp.xml
+
+
+// File: ProgressHandler_8h.xml
+
+
+// File: RoughMultiLayerComputation_8cpp.xml
+
+
+// File: RoughMultiLayerComputation_8h.xml
+
+
+// File: SpecularComputation_8cpp.xml
+
+
+// File: SpecularComputation_8h.xml
+
+
+// File: FormFactorDecoratorDebyeWaller_8cpp.xml
+
+
+// File: FormFactorDecoratorDebyeWaller_8h.xml
+
+
+// File: FormFactorDecoratorFactor_8cpp.xml
+
+
+// File: FormFactorDecoratorFactor_8h.xml
+
+
+// File: FormFactorDecoratorMaterial_8cpp.xml
+
+
+// File: FormFactorDecoratorMaterial_8h.xml
+
+
+// File: FormFactorDecoratorPositionFactor_8cpp.xml
+
+
+// File: FormFactorDecoratorPositionFactor_8h.xml
+
+
+// File: FormFactorDecoratorRotation_8cpp.xml
+
+
+// File: FormFactorDecoratorRotation_8h.xml
+
+
+// File: IFormFactorDecorator_8h.xml
+
+
+// File: ExportToPython_8cpp.xml
+
+
+// File: ExportToPython_8h.xml
+
+
+// File: PythonFormatting_8cpp.xml
+
+
+// File: PythonFormatting_8h.xml
+
+
+// File: SampleLabelHandler_8cpp.xml
+
+
+// File: SampleLabelHandler_8h.xml
+
+
+// File: AdjustMinimizerStrategy_8cpp.xml
+
+
+// File: AdjustMinimizerStrategy_8h.xml
+
+
+// File: FitObject_8cpp.xml
+
+
+// File: FitObject_8h.xml
+
+
+// File: FitParameterLinked_8cpp.xml
+
+
+// File: FitParameterLinked_8h.xml
+
+
+// File: FitStrategyAdjustParameters_8cpp.xml
+
+
+// File: FitStrategyAdjustParameters_8h.xml
+
+
+// File: FitSuite_8cpp.xml
+
+
+// File: FitSuite_8h.xml
+
+
+// File: FitSuiteFunctions_8cpp.xml
+
+
+// File: FitSuiteFunctions_8h.xml
+
+
+// File: FitSuiteImpl_8cpp.xml
+
+
+// File: FitSuiteImpl_8h.xml
+
+
+// File: FitSuiteObjects_8cpp.xml
+
+
+// File: FitSuiteObjects_8h.xml
+
+
+// File: FitSuitePrintObserver_8cpp.xml
+
+
+// File: FitSuitePrintObserver_8h.xml
+
+
+// File: FitSuiteStrategies_8cpp.xml
+
+
+// File: FitSuiteStrategies_8h.xml
+
+
+// File: IFitObserver_8cpp.xml
+
+
+// File: IFitObserver_8h.xml
+
+
+// File: IFitStrategy_8cpp.xml
+
+
+// File: IFitStrategy_8h.xml
+
+
+// File: IObserver_8cpp.xml
+
+
+// File: IObserver_8h.xml
+
+
+// File: FormFactorAnisoPyramid_8cpp.xml
+
+
+// File: FormFactorAnisoPyramid_8h.xml
+
+
+// File: FormFactorBox_8cpp.xml
+
+
+// File: FormFactorBox_8h.xml
+
+
+// File: FormFactorCone_8cpp.xml
+
+
+// File: FormFactorCone_8h.xml
+
+
+// File: FormFactorCone6_8cpp.xml
+
+
+// File: FormFactorCone6_8h.xml
+
+
+// File: FormFactorCuboctahedron_8cpp.xml
+
+
+// File: FormFactorCuboctahedron_8h.xml
+
+
+// File: FormFactorCylinder_8cpp.xml
+
+
+// File: FormFactorCylinder_8h.xml
+
+
+// File: FormFactorDodecahedron_8cpp.xml
+
+
+// File: FormFactorDodecahedron_8h.xml
+
+
+// File: FormFactorEllipsoidalCylinder_8cpp.xml
+
+
+// File: FormFactorEllipsoidalCylinder_8h.xml
+
+
+// File: FormFactorFullSphere_8cpp.xml
+
+
+// File: FormFactorFullSphere_8h.xml
+
+
+// File: FormFactorFullSpheroid_8cpp.xml
+
+
+// File: FormFactorFullSpheroid_8h.xml
+
+
+// File: FormFactorHemiEllipsoid_8cpp.xml
+
+
+// File: FormFactorHemiEllipsoid_8h.xml
+
+
+// File: FormFactorIcosahedron_8cpp.xml
+
+
+// File: FormFactorIcosahedron_8h.xml
+
+
+// File: FormFactorLongBoxGauss_8cpp.xml
+
+
+// File: FormFactorLongBoxGauss_8h.xml
+
+
+// File: FormFactorLongBoxLorentz_8cpp.xml
+
+
+// File: FormFactorLongBoxLorentz_8h.xml
+
+
+// File: FormFactorLongRipple1Gauss_8cpp.xml
+
+
+// File: FormFactorLongRipple1Gauss_8h.xml
+
+
+// File: FormFactorLongRipple1Lorentz_8cpp.xml
+
+
+// File: FormFactorLongRipple1Lorentz_8h.xml
+
+
+// File: FormFactorLongRipple2Gauss_8cpp.xml
+
+
+// File: FormFactorLongRipple2Gauss_8h.xml
+
+
+// File: FormFactorLongRipple2Lorentz_8cpp.xml
+
+
+// File: FormFactorLongRipple2Lorentz_8h.xml
+
+
+// File: FormFactorPolyhedron_8cpp.xml
+%feature("docstring")  I "static const complex_t I(0., 1.)
+
+The mathematics implemented here is described in full detail in a paper by Joachim Wuttke, entitled \"Form factor (Fourier shape transform) of polygon and polyhedron.\" 
+";
+
+%feature("docstring")  eps "static const double eps(2e-16)
+";
+
+
+// File: FormFactorPolyhedron_8h.xml
+
+
+// File: FormFactorPrism3_8cpp.xml
+
+
+// File: FormFactorPrism3_8h.xml
+
+
+// File: FormFactorPrism6_8cpp.xml
+
+
+// File: FormFactorPrism6_8h.xml
+
+
+// File: FormFactorPyramid_8cpp.xml
+
+
+// File: FormFactorPyramid_8h.xml
+
+
+// File: FormFactorRipple1_8cpp.xml
+%feature("docstring")  I "static complex_t I(0., 1.)
+";
+
+
+// File: FormFactorRipple1_8h.xml
+
+
+// File: FormFactorRipple2_8cpp.xml
+
+
+// File: FormFactorRipple2_8h.xml
+
+
+// File: FormFactorTetrahedron_8cpp.xml
+
+
+// File: FormFactorTetrahedron_8h.xml
+
+
+// File: FormFactorTriangle_8cpp.xml
+
+
+// File: FormFactorTriangle_8h.xml
+
+
+// File: FormFactorTrivial_8cpp.xml
+
+
+// File: FormFactorTrivial_8h.xml
+
+
+// File: FormFactorTruncatedCube_8cpp.xml
+
+
+// File: FormFactorTruncatedCube_8h.xml
+
+
+// File: FormFactorTruncatedSphere_8cpp.xml
+
+
+// File: FormFactorTruncatedSphere_8h.xml
+
+
+// File: FormFactorTruncatedSpheroid_8cpp.xml
+
+
+// File: FormFactorTruncatedSpheroid_8h.xml
+
+
+// File: FormFactors_8h.xml
+
+
+// File: HardParticles_8h.xml
+
+
+// File: InterferenceFunctions_8h.xml
+
+
+// File: SoftParticles_8h.xml
+
+
+// File: boost__streams_8h.xml
+
+
+// File: IntensityDataIOFactory_8cpp.xml
+
+
+// File: IntensityDataIOFactory_8h.xml
+
+
+// File: OutputDataIOHelper_8cpp.xml
+
+
+// File: OutputDataIOHelper_8h.xml
+
+
+// File: OutputDataReader_8cpp.xml
+
+
+// File: OutputDataReader_8h.xml
+
+
+// File: OutputDataReadFactory_8cpp.xml
+
+
+// File: OutputDataReadFactory_8h.xml
+
+
+// File: OutputDataReadStrategy_8cpp.xml
+
+
+// File: OutputDataReadStrategy_8h.xml
+
+
+// File: OutputDataWriteFactory_8cpp.xml
+
+
+// File: OutputDataWriteFactory_8h.xml
+
+
+// File: OutputDataWriter_8cpp.xml
+
+
+// File: OutputDataWriter_8h.xml
+
+
+// File: OutputDataWriteStrategy_8cpp.xml
+%feature("docstring")  IgnoreDenormalized "double IgnoreDenormalized(double value)
+";
+
+%feature("docstring")  WriteOutputDataDoubles "void WriteOutputDataDoubles(const OutputData< double > &data, std::ostream &output_stream, size_t n_columns)
+";
+
+
+// File: OutputDataWriteStrategy_8h.xml
+
+
+// File: TiffHandler_8cpp.xml
+
+
+// File: TiffHandler_8h.xml
+
+
+// File: Beam_8cpp.xml
+
+
+// File: Beam_8h.xml
+
+
+// File: ChiSquaredModule_8cpp.xml
+
+
+// File: ChiSquaredModule_8h.xml
+
+
+// File: ConvolutionDetectorResolution_8cpp.xml
+
+
+// File: ConvolutionDetectorResolution_8h.xml
+
+
+// File: Convolve_8cpp.xml
+
+
+// File: Convolve_8h.xml
+
+
+// File: CumulativeValue_8cpp.xml
+
+
+// File: CumulativeValue_8h.xml
+
+
+// File: DetectionProperties_8cpp.xml
+
+
+// File: DetectionProperties_8h.xml
+
+
+// File: DetectorFunctions_8cpp.xml
+
+
+// File: DetectorFunctions_8h.xml
+
+
+// File: DetectorMask_8cpp.xml
+
+
+// File: DetectorMask_8h.xml
+
+
+// File: FitElement_8cpp.xml
+
+
+// File: FitElement_8h.xml
+
+
+// File: Histogram1D_8cpp.xml
+
+
+// File: Histogram1D_8h.xml
+
+
+// File: Histogram2D_8cpp.xml
+
+
+// File: Histogram2D_8h.xml
+
+
+// File: IChiSquaredModule_8cpp.xml
+
+
+// File: IChiSquaredModule_8h.xml
+
+
+// File: IDetector2D_8cpp.xml
+
+
+// File: IDetector2D_8h.xml
+
+
+// File: IDetectorResolution_8h.xml
+
+
+// File: IHistogram_8cpp.xml
+
+
+// File: IHistogram_8h.xml
+
+
+// File: IIntensityFunction_8cpp.xml
+
+
+// File: IIntensityFunction_8h.xml
+
+
+// File: IIntensityNormalizer_8cpp.xml
+
+
+// File: IIntensityNormalizer_8h.xml
+
+
+// File: Instrument_8cpp.xml
+
+
+// File: Instrument_8h.xml
+
+
+// File: IntensityDataFunctions_8cpp.xml
+
+
+// File: IntensityDataFunctions_8h.xml
+
+
+// File: IResolutionFunction2D_8h.xml
+
+
+// File: IsGISAXSDetector_8cpp.xml
+
+
+// File: IsGISAXSDetector_8h.xml
+
+
+// File: ISquaredFunction_8h.xml
+
+
+// File: LLData_8cpp.xml
+
+
+// File: LLData_8h.xml
+%feature("docstring")  HaveSameDimensions "bool HaveSameDimensions(const LLData< T > &left, const LLData< T > &right)
+";
+
+
+// File: NumpyUtils_8cpp.xml
+
+
+// File: NumpyUtils_8h.xml
+
+
+// File: OutputData_8cpp.xml
+
+
+// File: OutputData_8h.xml
+
+
+// File: OutputDataIterator_8h.xml
+%feature("docstring")  swap "void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+make Swappable 
+";
+
+
+// File: RectangularDetector_8cpp.xml
+
+
+// File: RectangularDetector_8h.xml
+
+
+// File: RegionOfInterest_8cpp.xml
+
+
+// File: RegionOfInterest_8h.xml
+
+
+// File: ResolutionFunction2DGaussian_8cpp.xml
+
+
+// File: ResolutionFunction2DGaussian_8h.xml
+
+
+// File: SimulationArea_8cpp.xml
+
+
+// File: SimulationArea_8h.xml
+
+
+// File: SimulationAreaIterator_8cpp.xml
+
+
+// File: SimulationAreaIterator_8h.xml
+
+
+// File: SphericalDetector_8cpp.xml
+
+
+// File: SphericalDetector_8h.xml
+
+
+// File: ISelectionRule_8h.xml
+
+
+// File: Lattice_8cpp.xml
+
+
+// File: Lattice_8h.xml
+
+
+// File: Lattice1DParameters_8h.xml
+
+
+// File: Lattice2DParameters_8cpp.xml
+
+
+// File: Lattice2DParameters_8h.xml
+
+
+// File: Ellipse_8cpp.xml
+
+
+// File: Ellipse_8h.xml
+
+
+// File: InfinitePlane_8h.xml
+
+
+// File: IShape2D_8h.xml
+
+
+// File: Line_8cpp.xml
+
+
+// File: Line_8h.xml
+
+
+// File: Polygon_8cpp.xml
+
+
+// File: Polygon_8h.xml
+
+
+// File: Rectangle_8cpp.xml
+
+
+// File: Rectangle_8h.xml
+
+
+// File: HomogeneousMagneticMaterial_8cpp.xml
+
+
+// File: HomogeneousMagneticMaterial_8h.xml
+
+
+// File: HomogeneousMaterial_8h.xml
+
+
+// File: IMaterial_8cpp.xml
+
+
+// File: IMaterial_8h.xml
+
+
+// File: Materials_8cpp.xml
+
+
+// File: Materials_8h.xml
+
+
+// File: DecouplingApproximationStrategy_8cpp.xml
+
+
+// File: DecouplingApproximationStrategy_8h.xml
+
+
+// File: DWBADiffuseReflection_8cpp.xml
+
+
+// File: DWBADiffuseReflection_8h.xml
+
+
+// File: FormFactorDWBA_8cpp.xml
+
+
+// File: FormFactorDWBA_8h.xml
+
+
+// File: FormFactorDWBAPol_8cpp.xml
+
+
+// File: FormFactorDWBAPol_8h.xml
+
+
+// File: IInterferenceFunctionStrategy_8cpp.xml
+
+
+// File: IInterferenceFunctionStrategy_8h.xml
+
+
+// File: ILayerRTCoefficients_8h.xml
+
+
+// File: IMultiLayerBuilder_8cpp.xml
+
+
+// File: IMultiLayerBuilder_8h.xml
+
+
+// File: IRoughness_8h.xml
+
+
+// File: ISpecularInfoMap_8h.xml
+
+
+// File: Layer_8cpp.xml
+
+
+// File: Layer_8h.xml
+
+
+// File: LayerInterface_8cpp.xml
+
+
+// File: LayerInterface_8h.xml
+
+
+// File: LayerRoughness_8cpp.xml
+
+
+// File: LayerRoughness_8h.xml
+
+
+// File: LayerSpecularInfo_8cpp.xml
+
+
+// File: LayerSpecularInfo_8h.xml
+
+
+// File: LayerStrategyBuilder_8cpp.xml
+
+
+// File: LayerStrategyBuilder_8h.xml
+
+
+// File: MatrixRTCoefficients_8cpp.xml
+
+
+// File: MatrixRTCoefficients_8h.xml
+
+
+// File: MatrixSpecularInfoMap_8cpp.xml
+
+
+// File: MatrixSpecularInfoMap_8h.xml
+
+
+// File: MultiLayer_8cpp.xml
+
+
+// File: MultiLayer_8h.xml
+
+
+// File: ScalarRTCoefficients_8h.xml
+
+
+// File: ScalarSpecularInfoMap_8cpp.xml
+
+
+// File: ScalarSpecularInfoMap_8h.xml
+
+
+// File: SpecularMagnetic_8cpp.xml
+%feature("docstring")  I "static complex_t I(0., 1.)
+";
+
+
+// File: SpecularMagnetic_8h.xml
+
+
+// File: SpecularMatrix_8cpp.xml
+%feature("docstring")  setZeroBelow "void setZeroBelow(SpecularMatrix::MultiLayerCoeff_t &coeff, size_t current_layer)
+";
+
+%feature("docstring")  calculateUpFromLayer "bool calculateUpFromLayer(SpecularMatrix::MultiLayerCoeff_t &coeff, const MultiLayer &sample, const kvector_t k, size_t layer_index)
+";
+
+
+// File: SpecularMatrix_8h.xml
+
+
+// File: SSCApproximationStrategy_8cpp.xml
+
+
+// File: SSCApproximationStrategy_8h.xml
+
+
+// File: DistributionHandler_8cpp.xml
+
+
+// File: DistributionHandler_8h.xml
+
+
+// File: Distributions_8cpp.xml
+
+
+// File: Distributions_8h.xml
+
+
+// File: IParameter_8h.xml
+
+
+// File: IParameterized_8cpp.xml
+
+
+// File: IParameterized_8h.xml
+
+
+// File: ParameterDistribution_8cpp.xml
+
+
+// File: ParameterDistribution_8h.xml
+
+
+// File: ParameterPattern_8cpp.xml
+
+
+// File: ParameterPattern_8h.xml
+
+
+// File: ParameterPool_8cpp.xml
+
+
+// File: ParameterPool_8h.xml
+
+
+// File: ParameterSample_8h.xml
+
+
+// File: RealParameter_8cpp.xml
+
+
+// File: RealParameter_8h.xml
+
+
+// File: SimulationOptions_8cpp.xml
+
+
+// File: SimulationOptions_8h.xml
+
+
+// File: ThreadInfo_8h.xml
+
+
+// File: Unit_8cpp.xml
+
+
+// File: Unit_8h.xml
+
+
+// File: Units_8h.xml
+
+
+// File: Crystal_8cpp.xml
+
+
+// File: Crystal_8h.xml
+
+
+// File: FormFactorCrystal_8cpp.xml
+
+
+// File: FormFactorCrystal_8h.xml
+
+
+// File: FormFactorWeighted_8cpp.xml
+
+
+// File: FormFactorWeighted_8h.xml
+
+
+// File: IAbstractParticle_8h.xml
+
+
+// File: IClusteredParticles_8h.xml
+
+
+// File: IParticle_8cpp.xml
+
+
+// File: IParticle_8h.xml
+
+
+// File: MesoCrystal_8cpp.xml
+
+
+// File: MesoCrystal_8h.xml
+
+
+// File: Particle_8cpp.xml
+
+
+// File: Particle_8h.xml
+
+
+// File: ParticleComposition_8cpp.xml
+
+
+// File: ParticleComposition_8h.xml
+
+
+// File: ParticleCoreShell_8cpp.xml
+
+
+// File: ParticleCoreShell_8h.xml
+
+
+// File: ParticleDistribution_8cpp.xml
+
+
+// File: ParticleDistribution_8h.xml
+
+
+// File: TRange_8h.xml
+
+
+// File: ICompositeSample_8cpp.xml
+
+
+// File: ICompositeSample_8h.xml
+
+
+// File: IFormFactor_8cpp.xml
+
+
+// File: IFormFactor_8h.xml
+
+
+// File: IFormFactorBorn_8cpp.xml
+
+
+// File: IFormFactorBorn_8h.xml
+
+
+// File: ISample_8cpp.xml
+
+
+// File: ISample_8h.xml
+
+
+// File: ISampleIteratorStrategy_8cpp.xml
+
+
+// File: ISampleIteratorStrategy_8h.xml
+
+
+// File: ISampleVisitor_8cpp.xml
+%feature("docstring")  VisitSampleTreePreorder "void VisitSampleTreePreorder(const ISample &sample, ISampleVisitor &visitor)
+";
+
+%feature("docstring")  VisitSampleTreePostorder "void VisitSampleTreePostorder(const ISample &sample, ISampleVisitor &visitor)
+";
+
+
+// File: ISampleVisitor_8h.xml
+%feature("docstring")  VisitSampleTreePreorder "BA_CORE_API_ void VisitSampleTreePreorder(const ISample &sample, ISampleVisitor &visitor)
+";
+
+%feature("docstring")  VisitSampleTreePostorder "BA_CORE_API_ void VisitSampleTreePostorder(const ISample &sample, ISampleVisitor &visitor)
+";
+
+
+// File: Rotations_8cpp.xml
+%feature("docstring")  CreateProduct "IRotation* CreateProduct(const IRotation &left, const IRotation &right)
+
+Returns concatenated rotation (first right, then left). 
+";
+
+
+// File: Rotations_8h.xml
+%feature("docstring")  CreateProduct "BA_CORE_API_ IRotation* CreateProduct(const IRotation &left, const IRotation &right)
+
+Returns concatenated rotation (first right, then left). 
+";
+
+
+// File: SampleTreeIterator_8cpp.xml
+
+
+// File: SampleTreeIterator_8h.xml
+
+
+// File: StringUsageMap_8h.xml
+
+
+// File: GISASSimulation_8cpp.xml
+
+
+// File: GISASSimulation_8h.xml
+
+
+// File: OffSpecSimulation_8cpp.xml
+
+
+// File: OffSpecSimulation_8h.xml
+
+
+// File: Simulation_8cpp.xml
+
+
+// File: Simulation_8h.xml
+
+
+// File: SpecularSimulation_8cpp.xml
+
+
+// File: SpecularSimulation_8h.xml
+
+
+// File: FormFactorGauss_8cpp.xml
+
+
+// File: FormFactorGauss_8h.xml
+
+
+// File: FormFactorLorentz_8cpp.xml
+
+
+// File: FormFactorLorentz_8h.xml
+
+
+// File: FormFactorSphereGaussianRadius_8cpp.xml
+
+
+// File: FormFactorSphereGaussianRadius_8h.xml
+
+
+// File: FormFactorSphereLogNormalRadius_8cpp.xml
+
+
+// File: FormFactorSphereLogNormalRadius_8h.xml
+
+
+// File: FormFactorSphereUniformRadius_8cpp.xml
+
+
+// File: FormFactorSphereUniformRadius_8h.xml
+
+
+// File: BoxCompositionBuilder_8cpp.xml
+
+
+// File: BoxCompositionBuilder_8h.xml
+
+
+// File: CoreShellParticleBuilder_8cpp.xml
+
+
+// File: CoreShellParticleBuilder_8h.xml
+
+
+// File: CustomMorphologyBuilder_8cpp.xml
+
+
+// File: CustomMorphologyBuilder_8h.xml
+
+
+// File: CylindersAndPrismsBuilder_8cpp.xml
+
+
+// File: CylindersAndPrismsBuilder_8h.xml
+
+
+// File: CylindersBuilder_8cpp.xml
+
+
+// File: CylindersBuilder_8h.xml
+
+
+// File: IFactory_8h.xml
+%feature("docstring")  create_new "T* create_new()
+";
+
+
+// File: LatticeBuilder_8cpp.xml
+
+
+// File: LatticeBuilder_8h.xml
+
+
+// File: LayersWithAbsorptionBuilder_8cpp.xml
+
+
+// File: LayersWithAbsorptionBuilder_8h.xml
+
+
+// File: MagneticParticlesBuilder_8cpp.xml
+
+
+// File: MagneticParticlesBuilder_8h.xml
+
+
+// File: MesoCrystalBuilder_8cpp.xml
+
+
+// File: MesoCrystalBuilder_8h.xml
+
+
+// File: MultiLayerWithRoughnessBuilder_8cpp.xml
+
+
+// File: MultiLayerWithRoughnessBuilder_8h.xml
+
+
+// File: MultipleLayoutBuilder_8cpp.xml
+
+
+// File: MultipleLayoutBuilder_8h.xml
+
+
+// File: ParaCrystalBuilder_8cpp.xml
+
+
+// File: ParaCrystalBuilder_8h.xml
+
+
+// File: ParticleCompositionBuilder_8cpp.xml
+
+
+// File: ParticleCompositionBuilder_8h.xml
+
+
+// File: ParticleDistributionsBuilder_8cpp.xml
+
+
+// File: ParticleDistributionsBuilder_8h.xml
+
+
+// File: ParticleInTheAirBuilder_8cpp.xml
+
+
+// File: ParticleInTheAirBuilder_8h.xml
+
+
+// File: RipplesBuilder_8cpp.xml
+
+
+// File: RipplesBuilder_8h.xml
+
+
+// File: RotatedPyramidsBuilder_8cpp.xml
+
+
+// File: RotatedPyramidsBuilder_8h.xml
+
+
+// File: SampleBuilderFactory_8cpp.xml
+
+
+// File: SampleBuilderFactory_8h.xml
+
+
+// File: SimulationFactory_8cpp.xml
+
+
+// File: SimulationFactory_8h.xml
+
+
+// File: SizeDistributionModelsBuilder_8cpp.xml
+
+
+// File: SizeDistributionModelsBuilder_8h.xml
+
+
+// File: StandardSimulations_8cpp.xml
+
+
+// File: StandardSimulations_8h.xml
+
+
+// File: TransformationsBuilder_8cpp.xml
+
+
+// File: TransformationsBuilder_8h.xml
+
+
+// File: TwoDimLatticeBuilder_8cpp.xml
+
+
+// File: TwoDimLatticeBuilder_8h.xml
+
+
+// File: FileSystem_8cpp.xml
+
+
+// File: FileSystem_8h.xml
+
+
+// File: fp__exception__glibc__extension_8h.xml
+%feature("docstring")  fegetexcept "int fegetexcept(void)
+
+License: Public Domain 
+David N. Williams 
+";
+
+%feature("docstring")  feenableexcept "int feenableexcept(unsigned int excepts)
+";
+
+%feature("docstring")  fedisableexcept "int fedisableexcept(unsigned int excepts)
+";
+
+%feature("docstring")  fhdl "void fhdl(int sig, siginfo_t *sip, ucontext_t *scp)
+";
+
+
+// File: IntegratorComplex_8h.xml
+%feature("docstring")  make_integrator_complex "P_integrator_complex<T> make_integrator_complex(const T *object, complex_integrand< T > mem_function)
+";
+
+
+// File: IntegratorMCMiser_8h.xml
+%feature("docstring")  make_integrator_miser "P_integrator_miser<T> make_integrator_miser(const T *object, miser_integrand< T > mem_function, size_t dim)
+";
+
+
+// File: IntegratorReal_8h.xml
+%feature("docstring")  make_integrator_real "P_integrator_real<T> make_integrator_real(const T *object, real_integrand< T > mem_function)
+";
+
+
+// File: MathFunctions_8cpp.xml
+
+
+// File: MathFunctions_8h.xml
+
+
+// File: Numeric_8cpp.xml
+
+
+// File: Numeric_8h.xml
+
+
+// File: Precomputed_8cpp.xml
+
+
+// File: Precomputed_8h.xml
+
+
+// File: SafePointerVector_8h.xml
+
+
+// File: Utils_8cpp.xml
+
+
+// File: Utils_8h.xml
+
+
+// File: w32pragma_8h.xml
+
+
+// File: BasicVector3D_8cpp.xml
+%feature("docstring")  vecOfLambdaAlphaPhi "BasicVector3D<double> vecOfLambdaAlphaPhi(const double _lambda, const double _alpha, const double _phi)
+
+Creates a vector<double> as a wavevector with given wavelength and angles. Specifically needed for grazing-incidence scattering. 
+";
+
+
+// File: BasicVector3D_8h.xml
+%feature("docstring")  vecOfLambdaAlphaPhi "BA_CORE_API_ BasicVector3D<double> vecOfLambdaAlphaPhi(const double _lambda, const double _alpha, const double _phi)
+
+Creates a vector<double> as a wavevector with given wavelength and angles. Specifically needed for grazing-incidence scattering. 
+";
+
+
+// File: EigenCore_8h.xml
+
+
+// File: Transform3D_8cpp.xml
+
+
+// File: Transform3D_8h.xml
+
+
+// File: Vectors3D_8h.xml
+
+
+// File: WavevectorInfo_8h.xml
+
+
+// File: dir_52a2c863b7b3435f7dcd40f26828d521.xml
+
+
+// File: dir_41e08c09ca0aab46c4ada92f12a8c00b.xml
+
+
+// File: dir_4544cbc948815333bef1258cf6b298b8.xml
+
+
+// File: dir_d0c8f8fb9032c27878972645c4679f14.xml
+
+
+// File: dir_404b7d29693a4f046d60c2eccafd1df4.xml
+
+
+// File: dir_c83916cd1ff49c9e86c8a91c5655951d.xml
+
+
+// File: dir_59be1faf7048e95263c2fcba140abda1.xml
+
+
+// File: dir_e746abb3ff095e53619d5a61a48e781a.xml
+
+
+// File: dir_554fcc4911648c79d524724e80d45fa4.xml
+
+
+// File: dir_cc3c45a5d33be920aaf94cb9b9fbdb35.xml
+
+
+// File: dir_9a756f0b2738ef3b5663c172b32b6a4b.xml
+
+
+// File: dir_e8bc32d0cf85ef86a42504cd31af1370.xml
+
+
+// File: dir_8b890ad49a09d8f36525f5af93e5737c.xml
+
+
+// File: dir_9bdb7f774cce5b77ddd3ed60472b168c.xml
+
+
+// File: dir_74beab5553c7ad06e27a6baadceea9c3.xml
+
+
+// File: dir_bcc7f66c041cef9b775368068412e104.xml
+
+
+// File: dir_95667ae48b286f0957284f712e6e3af5.xml
+
+
+// File: dir_4251a3aefb390b6051267154c2f94d1e.xml
+
+
+// File: dir_529c0a19338d84aadf389c7b83eb56b1.xml
+
+
+// File: dir_051c0ff7ebc48614253af3001519ace0.xml
+
+
+// File: dir_f59c6b3c978505a5ca3672a364c1918e.xml
+
+
+// File: dir_871fae137308712382f6192f4445a900.xml
+
+
+// File: dir_44b1a8f39c14c02f6e3c2be419aa97b0.xml
+
+
+// File: dir_1a0696269c107461a4ce8ff1a48cd2f2.xml
+
+
+// File: dir_7f288243cf9c204a176dfbf45ea9d349.xml
+
diff --git a/auto/Wrap/doxygen_fit.i b/auto/Wrap/doxygen_fit.i
new file mode 100644
index 0000000..1805d70
--- /dev/null
+++ b/auto/Wrap/doxygen_fit.i
@@ -0,0 +1,1691 @@
+
+// File: index.xml
+
+// File: classAttLimits.xml
+%feature("docstring") AttLimits "
+
+The  AttLimits class defines limited/free attribute of fit parameter and provides coupling between them.
+
+C++ includes: AttLimits.h
+";
+
+%feature("docstring")  AttLimits::AttLimits "AttLimits::AttLimits()
+";
+
+%feature("docstring")  AttLimits::isFixed "bool AttLimits::isFixed() const 
+";
+
+%feature("docstring")  AttLimits::isLimited "bool AttLimits::isLimited() const 
+";
+
+%feature("docstring")  AttLimits::isUpperLimited "bool AttLimits::isUpperLimited() const 
+";
+
+%feature("docstring")  AttLimits::isLowerLimited "bool AttLimits::isLowerLimited() const 
+";
+
+%feature("docstring")  AttLimits::isLimitless "bool AttLimits::isLimitless() const 
+";
+
+%feature("docstring")  AttLimits::lowerLimit "double AttLimits::lowerLimit() const 
+";
+
+%feature("docstring")  AttLimits::upperLimit "double AttLimits::upperLimit() const 
+";
+
+%feature("docstring")  AttLimits::setFixed "void AttLimits::setFixed(bool isFixed)
+";
+
+%feature("docstring")  AttLimits::toString "std::string AttLimits::toString() const 
+";
+
+
+// File: classAttributes.xml
+%feature("docstring") Attributes "
+
+Attributes for a fit parameter. Currently, the only attribute is fixed/free.
+
+C++ includes: Attributes.h
+";
+
+%feature("docstring")  Attributes::Attributes "Attributes::Attributes()
+";
+
+%feature("docstring")  Attributes::setFixed "void Attributes::setFixed(bool is_fixed)
+";
+
+%feature("docstring")  Attributes::isFixed "bool Attributes::isFixed() const 
+";
+
+%feature("docstring")  Attributes::isFree "bool Attributes::isFree() const 
+";
+
+
+// File: classFitKernel.xml
+%feature("docstring") FitKernel "
+
+Main class to setup and run the minimization.
+
+C++ includes: FitKernel.h
+";
+
+%feature("docstring")  FitKernel::FitKernel "FitKernel::FitKernel()
+";
+
+%feature("docstring")  FitKernel::~FitKernel "FitKernel::~FitKernel()
+";
+
+%feature("docstring")  FitKernel::clear "void FitKernel::clear()
+";
+
+%feature("docstring")  FitKernel::setMinimizer "void FitKernel::setMinimizer(const std::string &minimizerName, const std::string &algorithmName=std::string())
+
+Sets minimizer with given name and algorithm type
+
+Parameters:
+-----------
+
+minimizerName: 
+The name of the minimizer
+
+algorithmName: 
+Optional name of the minimizer's algorithm 
+";
+
+%feature("docstring")  FitKernel::setMinimizer "void FitKernel::setMinimizer(IMinimizer *minimizer)
+";
+
+%feature("docstring")  FitKernel::minimizer "const IMinimizer * FitKernel::minimizer() const
+
+Returns minimizer. 
+";
+
+%feature("docstring")  FitKernel::addFitParameter "void FitKernel::addFitParameter(const std::string &name, double value, const AttLimits &limits, double step)
+
+Adds fit parameter. 
+";
+
+%feature("docstring")  FitKernel::setObjectiveFunction "void FitKernel::setObjectiveFunction(objective_function_t func)
+";
+
+%feature("docstring")  FitKernel::setGradientFunction "void FitKernel::setGradientFunction(gradient_function_t func, int ndatasize)
+";
+
+%feature("docstring")  FitKernel::minimize "void FitKernel::minimize()
+";
+
+%feature("docstring")  FitKernel::reportResults "std::string FitKernel::reportResults() const
+
+Reports results of minimization in the form of multi-line string. 
+";
+
+%feature("docstring")  FitKernel::fitParameters "FitParameterSet * FitKernel::fitParameters()
+";
+
+%feature("docstring")  FitKernel::fitParameters "const FitParameterSet * FitKernel::fitParameters() const 
+";
+
+%feature("docstring")  FitKernel::functionCalls "int FitKernel::functionCalls() const
+
+Number of objective function calls. 
+";
+
+
+// File: classFitKernelImpl.xml
+%feature("docstring") FitKernelImpl "
+
+The  FitKernel implementation.
+
+C++ includes: FitKernelImpl.h
+";
+
+%feature("docstring")  FitKernelImpl::FitKernelImpl "FitKernelImpl::FitKernelImpl()
+";
+
+%feature("docstring")  FitKernelImpl::~FitKernelImpl "FitKernelImpl::~FitKernelImpl()
+";
+
+%feature("docstring")  FitKernelImpl::clear "void FitKernelImpl::clear()
+";
+
+%feature("docstring")  FitKernelImpl::setMinimizer "void FitKernelImpl::setMinimizer(IMinimizer *minimizer)
+
+Sets minimizer. 
+";
+
+%feature("docstring")  FitKernelImpl::addFitParameter "void FitKernelImpl::addFitParameter(FitParameter *par)
+
+Adds fit parameter. 
+";
+
+%feature("docstring")  FitKernelImpl::setObjectiveFunction "void FitKernelImpl::setObjectiveFunction(objective_function_t func)
+";
+
+%feature("docstring")  FitKernelImpl::setGradientFunction "void FitKernelImpl::setGradientFunction(gradient_function_t func, int ndatasize)
+";
+
+%feature("docstring")  FitKernelImpl::minimize "void FitKernelImpl::minimize()
+";
+
+%feature("docstring")  FitKernelImpl::reportResults "std::string FitKernelImpl::reportResults() const
+
+Reports results of minimization in the form of multi-line string. 
+";
+
+%feature("docstring")  FitKernelImpl::fitParameters "FitParameterSet * FitKernelImpl::fitParameters()
+";
+
+%feature("docstring")  FitKernelImpl::minimizer "IMinimizer * FitKernelImpl::minimizer()
+";
+
+%feature("docstring")  FitKernelImpl::functionCalls "int FitKernelImpl::functionCalls() const
+
+Number of objective function calls. 
+";
+
+
+// File: classFitOptions.xml
+%feature("docstring") FitOptions "
+
+General fitting options.
+
+C++ includes: FitOptions.h
+";
+
+%feature("docstring")  FitOptions::FitOptions "FitOptions::FitOptions()
+";
+
+%feature("docstring")  FitOptions::~FitOptions "FitOptions::~FitOptions()
+";
+
+%feature("docstring")  FitOptions::derivEpsilon "double FitOptions::derivEpsilon() const 
+";
+
+%feature("docstring")  FitOptions::setDerivEpsilon "void FitOptions::setDerivEpsilon(double deriv_epsilon)
+";
+
+%feature("docstring")  FitOptions::stepFactor "double FitOptions::stepFactor() const 
+";
+
+%feature("docstring")  FitOptions::setStepFactor "void FitOptions::setStepFactor(double step_factor)
+";
+
+
+// File: classFitParameter.xml
+%feature("docstring") FitParameter "
+
+The  FitParameter represents fittable parameter with value, error, step, and limits.
+
+C++ includes: FitParameter.h
+";
+
+%feature("docstring")  FitParameter::FitParameter "FitParameter::FitParameter()
+";
+
+%feature("docstring")  FitParameter::FitParameter "FitParameter::FitParameter(const std::string &name, double value, const AttLimits &limits=AttLimits::limitless(), double step=0.0)
+";
+
+%feature("docstring")  FitParameter::~FitParameter "virtual FitParameter::~FitParameter()
+";
+
+%feature("docstring")  FitParameter::clone "FitParameter * FitParameter::clone() const 
+";
+
+%feature("docstring")  FitParameter::name "std::string FitParameter::name() const 
+";
+
+%feature("docstring")  FitParameter::startValue "double FitParameter::startValue() const 
+";
+
+%feature("docstring")  FitParameter::value "double FitParameter::value() const 
+";
+
+%feature("docstring")  FitParameter::setValue "void FitParameter::setValue(double value)
+";
+
+%feature("docstring")  FitParameter::step "double FitParameter::step() const 
+";
+
+%feature("docstring")  FitParameter::setStep "FitParameter & FitParameter::setStep(double value)
+";
+
+%feature("docstring")  FitParameter::error "double FitParameter::error() const 
+";
+
+%feature("docstring")  FitParameter::setError "void FitParameter::setError(double value)
+";
+
+%feature("docstring")  FitParameter::limits "const AttLimits & FitParameter::limits() const 
+";
+
+%feature("docstring")  FitParameter::limits "AttLimits & FitParameter::limits()
+";
+
+%feature("docstring")  FitParameter::setLimits "FitParameter & FitParameter::setLimits(const AttLimits &limits)
+";
+
+%feature("docstring")  FitParameter::setLowerLimited "FitParameter & FitParameter::setLowerLimited(double bound_value)
+";
+
+%feature("docstring")  FitParameter::setPositive "FitParameter & FitParameter::setPositive()
+";
+
+%feature("docstring")  FitParameter::setNonnegative "FitParameter & FitParameter::setNonnegative()
+";
+
+%feature("docstring")  FitParameter::setUpperLimited "FitParameter & FitParameter::setUpperLimited(double bound_value)
+";
+
+%feature("docstring")  FitParameter::setLimited "FitParameter & FitParameter::setLimited(double left_bound_value, double right_bound_value)
+";
+
+%feature("docstring")  FitParameter::setFixed "FitParameter & FitParameter::setFixed()
+";
+
+%feature("docstring")  FitParameter::toString "std::string FitParameter::toString() const 
+";
+
+
+// File: classFitParameterSet.xml
+%feature("docstring") FitParameterSet "
+
+The  FitParameterSet represents collection of fit parameters for the minimizer.
+
+C++ includes: FitParameterSet.h
+";
+
+%feature("docstring")  FitParameterSet::FitParameterSet "FitParameterSet::FitParameterSet()
+";
+
+%feature("docstring")  FitParameterSet::~FitParameterSet "FitParameterSet::~FitParameterSet()
+";
+
+%feature("docstring")  FitParameterSet::clear "void FitParameterSet::clear()
+
+container specific
+
+Clears all defined parameters. 
+";
+
+%feature("docstring")  FitParameterSet::size "size_t FitParameterSet::size() const
+
+Returns number of parameters. 
+";
+
+%feature("docstring")  FitParameterSet::begin "FitParameterSet::iterator FitParameterSet::begin()
+
+Container iterators. 
+";
+
+%feature("docstring")  FitParameterSet::begin "FitParameterSet::const_iterator FitParameterSet::begin() const 
+";
+
+%feature("docstring")  FitParameterSet::end "FitParameterSet::iterator FitParameterSet::end()
+";
+
+%feature("docstring")  FitParameterSet::end "FitParameterSet::const_iterator FitParameterSet::end() const 
+";
+
+%feature("docstring")  FitParameterSet::addFitParameter "void FitParameterSet::addFitParameter(FitParameter *par)
+
+adding fit parameters
+
+Adds fit parameter. 
+";
+
+%feature("docstring")  FitParameterSet::fitParameter "const FitParameter * FitParameterSet::fitParameter(const std::string &name) const
+
+accessing fit parameters
+
+Returns fit parameter by given name. 
+";
+
+%feature("docstring")  FitParameterSet::fitParameter "FitParameter * FitParameterSet::fitParameter(const std::string &name)
+";
+
+%feature("docstring")  FitParameterSet::values "std::vector< double > FitParameterSet::values() const
+
+fit parameter's values and errors
+
+Returns values of all defined parameters. 
+";
+
+%feature("docstring")  FitParameterSet::setValues "void FitParameterSet::setValues(const std::vector< double > &pars_values)
+
+Sets values for all defined parameters. 
+";
+
+%feature("docstring")  FitParameterSet::valuesDifferFrom "bool FitParameterSet::valuesDifferFrom(const std::vector< double > &par_values, double tolerance=2.0) const
+
+Returns true if parameters already have the given values. 
+";
+
+%feature("docstring")  FitParameterSet::errors "std::vector< double > FitParameterSet::errors() const
+
+Returns errors of all defined parameters. 
+";
+
+%feature("docstring")  FitParameterSet::setErrors "void FitParameterSet::setErrors(const std::vector< double > &pars_errors)
+
+Sets errors to all parameters. 
+";
+
+%feature("docstring")  FitParameterSet::freeFitParameterCount "size_t FitParameterSet::freeFitParameterCount() const
+
+Make parameters fixed and free.
+
+Returns number of free parameters. 
+";
+
+%feature("docstring")  FitParameterSet::fixAll "void FitParameterSet::fixAll()
+
+Fix all parameters. 
+";
+
+%feature("docstring")  FitParameterSet::releaseAll "void FitParameterSet::releaseAll()
+
+Release all parameters. 
+";
+
+%feature("docstring")  FitParameterSet::setFixed "void FitParameterSet::setFixed(const std::vector< std::string > &pars, bool is_fixed)
+
+Set fixed flag for parameters from the list. 
+";
+
+%feature("docstring")  FitParameterSet::parametersToString "std::string FitParameterSet::parametersToString() const
+
+Printing and reporting. 
+";
+
+%feature("docstring")  FitParameterSet::reportResults "std::string FitParameterSet::reportResults() const 
+";
+
+%feature("docstring")  FitParameterSet::correlationMatrix "corr_matrix_t FitParameterSet::correlationMatrix() const 
+";
+
+%feature("docstring")  FitParameterSet::setCorrelationMatrix "void FitParameterSet::setCorrelationMatrix(const corr_matrix_t &matrix)
+";
+
+%feature("docstring")  FitParameterSet::isExistingName "bool FitParameterSet::isExistingName(const std::string &name) const
+
+Returns true if parameter with such name exists. 
+";
+
+
+// File: classGeneticMinimizer.xml
+%feature("docstring") GeneticMinimizer "
+
+Wrapper for ROOT Genetic minimizer.
+
+C++ includes: GeneticMinimizer.h
+";
+
+%feature("docstring")  GeneticMinimizer::GeneticMinimizer "GeneticMinimizer::GeneticMinimizer()
+";
+
+%feature("docstring")  GeneticMinimizer::~GeneticMinimizer "GeneticMinimizer::~GeneticMinimizer()
+
+Sets tolerance on the function value at the minimum. Minimization will stop when the estimated vertical distance to the minimum (EDM) is less than 0.001*tolerance*ErrorDef. Here ErrorDef=1.0 for chi squared fit and ErrorDef=0.5 for negative log likelihood fit. Default value is 0.01. 
+";
+
+%feature("docstring")  GeneticMinimizer::setTolerance "void GeneticMinimizer::setTolerance(double value)
+";
+
+%feature("docstring")  GeneticMinimizer::tolerance "double GeneticMinimizer::tolerance() const 
+";
+
+%feature("docstring")  GeneticMinimizer::setPrintLevel "void GeneticMinimizer::setPrintLevel(int value)
+
+Sets minimizer internal print level. Default value is 0 (silent). 
+";
+
+%feature("docstring")  GeneticMinimizer::printLevel "int GeneticMinimizer::printLevel() const 
+";
+
+%feature("docstring")  GeneticMinimizer::setMaxIterations "void GeneticMinimizer::setMaxIterations(int value)
+
+Sets maximum number of iterations to try at each step. Default values is 3. 
+";
+
+%feature("docstring")  GeneticMinimizer::maxIterations "int GeneticMinimizer::maxIterations() const 
+";
+
+%feature("docstring")  GeneticMinimizer::setPopulationSize "void GeneticMinimizer::setPopulationSize(int value)
+
+Sets population size. Default value is 300. 
+";
+
+%feature("docstring")  GeneticMinimizer::populationSize "int GeneticMinimizer::populationSize() const 
+";
+
+%feature("docstring")  GeneticMinimizer::setRandomSeed "void GeneticMinimizer::setRandomSeed(int value)
+
+Sets random seed. Default value is 0. 
+";
+
+%feature("docstring")  GeneticMinimizer::randomSeed "int GeneticMinimizer::randomSeed() const 
+";
+
+%feature("docstring")  GeneticMinimizer::setParameter "void GeneticMinimizer::setParameter(size_t index, const FitParameter *par)
+
+Sets minimizer parameter. Overload is required to check that parameter is properly limited. 
+";
+
+%feature("docstring")  GeneticMinimizer::statusToString "std::string GeneticMinimizer::statusToString() const
+
+Returns string representation of current minimizer status. 
+";
+
+%feature("docstring")  GeneticMinimizer::statusMap "std::map< std::string, std::string > GeneticMinimizer::statusMap() const
+
+Returns map of string representing different minimizer statuses. 
+";
+
+
+// File: classGSLLevenbergMarquardtMinimizer.xml
+%feature("docstring") GSLLevenbergMarquardtMinimizer "
+
+Wrapper for GSL Levenberg-Marquardt minimizer. http://www.gnu.org/software/gsl/manual/html_node/Nonlinear-Least_002dSquares-Fitting.html.
+
+C++ includes: GSLLevenbergMarquardtMinimizer.h
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::GSLLevenbergMarquardtMinimizer "GSLLevenbergMarquardtMinimizer::GSLLevenbergMarquardtMinimizer()
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::~GSLLevenbergMarquardtMinimizer "GSLLevenbergMarquardtMinimizer::~GSLLevenbergMarquardtMinimizer()
+
+Sets tolerance on the function value at the minimum. Default value is 0.01. 
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::setTolerance "void GSLLevenbergMarquardtMinimizer::setTolerance(double value)
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::tolerance "double GSLLevenbergMarquardtMinimizer::tolerance() const 
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::setPrintLevel "void GSLLevenbergMarquardtMinimizer::setPrintLevel(int value)
+
+Sets minimizer internal print level. Default value is 0 (silent). 
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::printLevel "int GSLLevenbergMarquardtMinimizer::printLevel() const 
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::setMaxIterations "void GSLLevenbergMarquardtMinimizer::setMaxIterations(int value)
+
+Sets maximum number of iterations. This is an internal minimizer setting which has no direct relation to the number of objective function calls (e.g. numberOfIteraction=5 might correspond to ~100 objective function calls). 
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::maxIterations "int GSLLevenbergMarquardtMinimizer::maxIterations() const 
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::statusToString "std::string GSLLevenbergMarquardtMinimizer::statusToString() const
+
+Returns string representation of current minimizer status. 
+";
+
+%feature("docstring")  GSLLevenbergMarquardtMinimizer::statusMap "std::map< std::string, std::string > GSLLevenbergMarquardtMinimizer::statusMap() const
+
+Returns map of string representing different minimizer statuses. 
+";
+
+
+// File: classGSLMultiMinimizer.xml
+%feature("docstring") GSLMultiMinimizer "
+
+Wrapper for GSL multi minimizer (gradient descent based) family.
+
+C++ includes: GSLMultiMinimizer.h
+";
+
+%feature("docstring")  GSLMultiMinimizer::GSLMultiMinimizer "GSLMultiMinimizer::GSLMultiMinimizer(const std::string &algorithmName=AlgorithmNames::ConjugateFR)
+";
+
+%feature("docstring")  GSLMultiMinimizer::~GSLMultiMinimizer "GSLMultiMinimizer::~GSLMultiMinimizer()
+";
+
+%feature("docstring")  GSLMultiMinimizer::setPrintLevel "void GSLMultiMinimizer::setPrintLevel(int value)
+
+Sets minimizer internal print level. Default value is 0 (silent). 
+";
+
+%feature("docstring")  GSLMultiMinimizer::printLevel "int GSLMultiMinimizer::printLevel() const 
+";
+
+%feature("docstring")  GSLMultiMinimizer::setMaxIterations "void GSLMultiMinimizer::setMaxIterations(int value)
+
+Sets maximum number of iterations. This is an internal minimizer setting which has no direct relation to the number of objective function calls (e.g. numberOfIteraction=5 might correspond to ~100 objective function calls). 
+";
+
+%feature("docstring")  GSLMultiMinimizer::maxIterations "int GSLMultiMinimizer::maxIterations() const 
+";
+
+%feature("docstring")  GSLMultiMinimizer::statusToString "std::string GSLMultiMinimizer::statusToString() const
+
+Returns string representation of current minimizer status. 
+";
+
+
+// File: classIFitParameter.xml
+%feature("docstring") IFitParameter "
+
+The  IFitParameter is a base class for fit parameters.
+
+C++ includes: IFitParameter.h
+";
+
+%feature("docstring")  IFitParameter::IFitParameter "IFitParameter::IFitParameter()
+";
+
+%feature("docstring")  IFitParameter::~IFitParameter "virtual IFitParameter::~IFitParameter()
+";
+
+%feature("docstring")  IFitParameter::IFitParameter "IFitParameter::IFitParameter(const IFitParameter &)=delete
+";
+
+%feature("docstring")  IFitParameter::clone "virtual IFitParameter* IFitParameter::clone() const =0
+";
+
+
+// File: classIMinimizer.xml
+%feature("docstring") IMinimizer "
+
+Common interface for all kind minimizer's.
+
+C++ includes: IMinimizer.h
+";
+
+%feature("docstring")  IMinimizer::IMinimizer "IMinimizer::IMinimizer()
+";
+
+%feature("docstring")  IMinimizer::~IMinimizer "virtual IMinimizer::~IMinimizer()
+";
+
+%feature("docstring")  IMinimizer::IMinimizer "IMinimizer::IMinimizer(const IMinimizer &other)=delete
+";
+
+%feature("docstring")  IMinimizer::minimizerName "std::string IMinimizer::minimizerName() const
+
+return name of the minimizer 
+";
+
+%feature("docstring")  IMinimizer::algorithmName "std::string IMinimizer::algorithmName() const
+
+return name of the minimization algorithm 
+";
+
+%feature("docstring")  IMinimizer::minimize "void IMinimizer::minimize()
+
+run minimization 
+";
+
+%feature("docstring")  IMinimizer::clear "void IMinimizer::clear()
+
+clear resources (parameters) for consecutives minimizations 
+";
+
+%feature("docstring")  IMinimizer::setParameters "void IMinimizer::setParameters(const FitParameterSet &parameters)
+
+Sets internal minimizer parameters using external parameter list. 
+";
+
+%feature("docstring")  IMinimizer::setObjectiveFunction "virtual void IMinimizer::setObjectiveFunction(objective_function_t)
+";
+
+%feature("docstring")  IMinimizer::setGradientFunction "virtual void IMinimizer::setGradientFunction(gradient_function_t, int)
+";
+
+%feature("docstring")  IMinimizer::minValue "double IMinimizer::minValue() const
+
+Returns minimum function value. 
+";
+
+%feature("docstring")  IMinimizer::reportResults "std::string IMinimizer::reportResults() const
+
+Prints fit results. 
+";
+
+%feature("docstring")  IMinimizer::propagateResults "void IMinimizer::propagateResults(FitParameterSet &parameters)
+
+Propagates results of minimization to fit parameter set. 
+";
+
+%feature("docstring")  IMinimizer::setOptions "void IMinimizer::setOptions(const std::string &options)
+
+Sets option string to the minimizer. 
+";
+
+
+// File: classInfoItem.xml
+%feature("docstring") InfoItem "
+
+Simple item to hold the name and the description.
+
+C++ includes: MinimizerInfo.h
+";
+
+%feature("docstring")  InfoItem::InfoItem "InfoItem::InfoItem()
+";
+
+%feature("docstring")  InfoItem::InfoItem "InfoItem::InfoItem(const std::string &itemName, const std::string &itemDescription)
+";
+
+%feature("docstring")  InfoItem::name "std::string InfoItem::name() const 
+";
+
+%feature("docstring")  InfoItem::description "std::string InfoItem::description() const 
+";
+
+
+// File: classMSG_1_1Logger.xml
+%feature("docstring") MSG::Logger "
+
+Provides message service.
+
+C++ includes: Logger.h
+";
+
+%feature("docstring")  MSG::Logger::Logger "MSG::Logger::Logger(EMessageLevel level)
+";
+
+%feature("docstring")  MSG::Logger::~Logger "MSG::Logger::~Logger()
+";
+
+%feature("docstring")  MSG::Logger::NowTime "std::string MSG::Logger::NowTime()
+";
+
+%feature("docstring")  MSG::Logger::ToString "const std::string & MSG::Logger::ToString(EMessageLevel level)
+";
+
+
+// File: classMinimizerCatalogue.xml
+%feature("docstring") MinimizerCatalogue "
+
+The  MinimizerCatalogue class contains information over all minimizers available.
+
+C++ includes: MinimizerCatalogue.h
+";
+
+%feature("docstring")  MinimizerCatalogue::MinimizerCatalogue "MinimizerCatalogue::MinimizerCatalogue()
+";
+
+%feature("docstring")  MinimizerCatalogue::toString "std::string MinimizerCatalogue::toString() const
+
+Returns multiline string representing catalogue content. 
+";
+
+%feature("docstring")  MinimizerCatalogue::algorithmNames "std::vector< std::string > MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const
+
+Returns list of algorithms defined for the minimizer with a given name. 
+";
+
+%feature("docstring")  MinimizerCatalogue::algorithmDescriptions "std::vector< std::string > MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const
+
+Returns list of algorithm's descriptions for the minimizer with a given name . 
+";
+
+
+// File: classMinimizerFactory.xml
+%feature("docstring") MinimizerFactory "
+
+Factory to create minimizers.
+
+Minimizer | Algorithms
+
+Minuit2 | Migrad Simplex Combined Scan Fumili GSLMultiMin | SteepestDescent ConjugateFR ConjugatePR BFGS BFGS2 GSLLMA | Default GSLSimAn | Default Genetic | Default
+
+C++ includes: MinimizerFactory.h
+";
+
+
+// File: classMinimizerInfo.xml
+%feature("docstring") MinimizerInfo "
+
+The  MinimizerInfo class provides info about the minimizer, including list of defined minimization algorithms.
+
+C++ includes: MinimizerInfo.h
+";
+
+%feature("docstring")  MinimizerInfo::MinimizerInfo "MinimizerInfo::MinimizerInfo()
+";
+
+%feature("docstring")  MinimizerInfo::MinimizerInfo "MinimizerInfo::MinimizerInfo(const std::string &minimizerType, const std::string &minimizerDescription)
+";
+
+%feature("docstring")  MinimizerInfo::setAlgorithmName "void MinimizerInfo::setAlgorithmName(const std::string &algorithmName)
+
+Sets currently active algorithm. 
+";
+
+%feature("docstring")  MinimizerInfo::algorithmName "std::string MinimizerInfo::algorithmName() const 
+";
+
+%feature("docstring")  MinimizerInfo::algorithmNames "std::vector< std::string > MinimizerInfo::algorithmNames() const
+
+Return list of defined algorithm names. 
+";
+
+%feature("docstring")  MinimizerInfo::algorithmDescriptions "std::vector< std::string > MinimizerInfo::algorithmDescriptions() const
+
+Returns list of string with description of all available algorithms. 
+";
+
+
+// File: classMinimizerOptions.xml
+%feature("docstring") MinimizerOptions "
+
+The  MinimizerOptions class holds collection of internal minimizer settings.
+
+C++ includes: MinimizerOptions.h
+";
+
+%feature("docstring")  MinimizerOptions::toOptionString "std::string MinimizerOptions::toOptionString() const
+
+Returns string with all options (i.e. \"Strategy=1;Tolerance=0.01;\") 
+";
+
+%feature("docstring")  MinimizerOptions::setOptionString "void MinimizerOptions::setOptionString(const std::string &options)
+
+Set options from their string representation. 
+";
+
+
+// File: classMinimizerResultsHelper.xml
+%feature("docstring") MinimizerResultsHelper "
+
+The  MinimizerResultsHelper class contains all logic to generate reports with the result of minimization.
+
+C++ includes: MinimizerResultsHelper.h
+";
+
+%feature("docstring")  MinimizerResultsHelper::MinimizerResultsHelper "MinimizerResultsHelper::MinimizerResultsHelper()
+";
+
+%feature("docstring")  MinimizerResultsHelper::reportResults "std::string MinimizerResultsHelper::reportResults(const RootMinimizerAdapter *minimizer) const
+
+Reports results of minimization in the form of multi-line string. 
+";
+
+%feature("docstring")  MinimizerResultsHelper::reportResults "std::string MinimizerResultsHelper::reportResults(const FitParameterSet *parameters) const
+
+Reports fit parameters settings and final results. 
+";
+
+
+// File: classMinuit2Minimizer.xml
+%feature("docstring") Minuit2Minimizer "
+
+The  Minuit2Minimizer class is a wrapper for ROOT Minuit2 minimizer See Minuit2 user manual https://root.cern.ch/root/htmldoc/guides/minuit2/Minuit2.pdf.
+
+C++ includes: Minuit2Minimizer.h
+";
+
+%feature("docstring")  Minuit2Minimizer::Minuit2Minimizer "Minuit2Minimizer::Minuit2Minimizer(const std::string &algorithmName=AlgorithmNames::Migrad)
+";
+
+%feature("docstring")  Minuit2Minimizer::~Minuit2Minimizer "Minuit2Minimizer::~Minuit2Minimizer()
+";
+
+%feature("docstring")  Minuit2Minimizer::setStrategy "void Minuit2Minimizer::setStrategy(int value)
+
+Sets minimization strategy (0-low, 1-medium, 2-high minimization quality). At low quality number of function calls will be economized. Default value is 1. 
+";
+
+%feature("docstring")  Minuit2Minimizer::strategy "int Minuit2Minimizer::strategy() const 
+";
+
+%feature("docstring")  Minuit2Minimizer::setErrorDefinition "void Minuit2Minimizer::setErrorDefinition(double value)
+
+Sets error definition factor for parameter error calculation. If objective function (OF) is the usual chisquare function and if the user wants the usual one-standard-deviation errors, then the error definition should be 1.0. If OF is a negative-log-likelihood function, then 0.5. If OF is a chisquare, but the user wants two-standard-deviation errors, 4.0. Default value is 1.0. 
+";
+
+%feature("docstring")  Minuit2Minimizer::errorDefinition "double Minuit2Minimizer::errorDefinition() const
+
+Sets tolerance on the function value at the minimum. Minimization will stop when the estimated vertical distance to the minimum (EDM) is less than 0.001*tolerance*ErrorDef. Here ErrorDef=1.0 for chi squared fit and ErrorDef=0.5 for negative log likelihood fit. Default value is 0.01. 
+";
+
+%feature("docstring")  Minuit2Minimizer::setTolerance "void Minuit2Minimizer::setTolerance(double value)
+";
+
+%feature("docstring")  Minuit2Minimizer::tolerance "double Minuit2Minimizer::tolerance() const
+
+Sets relative floating point arithmetic precision. Should be adjusted when the user knows that objectiove function value is not calculated to the nominal machine accuracy. Typical values are between 10^-5 and 10^-14. Default value is -1.0 (minimizer specific will be used). 
+";
+
+%feature("docstring")  Minuit2Minimizer::setPrecision "void Minuit2Minimizer::setPrecision(double value)
+";
+
+%feature("docstring")  Minuit2Minimizer::precision "double Minuit2Minimizer::precision() const 
+";
+
+%feature("docstring")  Minuit2Minimizer::setPrintLevel "void Minuit2Minimizer::setPrintLevel(int value)
+
+Sets minimizer internal print level. Default value is 0 (silent). 
+";
+
+%feature("docstring")  Minuit2Minimizer::printLevel "int Minuit2Minimizer::printLevel() const 
+";
+
+%feature("docstring")  Minuit2Minimizer::setMaxFunctionCalls "void Minuit2Minimizer::setMaxFunctionCalls(int value)
+
+Sets maximum number of objective function calls. 
+";
+
+%feature("docstring")  Minuit2Minimizer::maxFunctionCalls "int Minuit2Minimizer::maxFunctionCalls() const 
+";
+
+%feature("docstring")  Minuit2Minimizer::statusToString "std::string Minuit2Minimizer::statusToString() const
+
+Returns string representation of current minimizer status. 
+";
+
+%feature("docstring")  Minuit2Minimizer::statusMap "std::map< std::string, std::string > Minuit2Minimizer::statusMap() const
+
+Returns map of string representing different minimizer statuses. 
+";
+
+
+// File: classMultiOption.xml
+%feature("docstring") MultiOption "
+
+The  MultiOption class is intended to store a single option for minimization algorithm. Int, double, string values are available. Relies on boost::variant, will be switched to std::variant in C++-17. (before was https://github.com/mapbox/variant.
+
+C++ includes: MultiOption.h
+";
+
+%feature("docstring")  MultiOption::MultiOption "MultiOption::MultiOption(const std::string &name=std::string())
+";
+
+%feature("docstring")  MultiOption::MultiOption "MultiOption::MultiOption(const std::string &name, const T &t, const std::string &descripion=std::string())
+";
+
+%feature("docstring")  MultiOption::name "std::string MultiOption::name() const 
+";
+
+%feature("docstring")  MultiOption::description "std::string MultiOption::description() const 
+";
+
+%feature("docstring")  MultiOption::setDescription "void MultiOption::setDescription(const std::string &description)
+";
+
+%feature("docstring")  MultiOption::value "MultiOption::variant_t & MultiOption::value()
+";
+
+%feature("docstring")  MultiOption::defaultValue "MultiOption::variant_t & MultiOption::defaultValue()
+";
+
+%feature("docstring")  MultiOption::get "T MultiOption::get() const
+
+Returns the option's value. 
+";
+
+%feature("docstring")  MultiOption::getDefault "T MultiOption::getDefault() const
+
+Returns the option's default value (i.e. used during construction) 
+";
+
+%feature("docstring")  MultiOption::setFromString "void MultiOption::setFromString(const std::string &value)
+
+Sets the value of option from string. TODO find more elegant way (without if/else and boost::lexical_cast 
+";
+
+
+// File: classObjectiveFunction.xml
+%feature("docstring") ObjectiveFunction "
+
+The  ObjectiveFunction class represents function to minimize.
+
+C++ includes: ObjectiveFunction.h
+";
+
+%feature("docstring")  ObjectiveFunction::ObjectiveFunction "ObjectiveFunction::ObjectiveFunction()
+";
+
+%feature("docstring")  ObjectiveFunction::setObjectiveFunction "void ObjectiveFunction::setObjectiveFunction(objective_function_t func)
+";
+
+%feature("docstring")  ObjectiveFunction::setGradientFunction "void ObjectiveFunction::setGradientFunction(gradient_function_t func, int ndatasize)
+";
+
+%feature("docstring")  ObjectiveFunction::evaluate "double ObjectiveFunction::evaluate(const std::vector< double > &pars)
+
+Evaluates the value of the function for given vector of function parameters using callback mechanism. 
+";
+
+%feature("docstring")  ObjectiveFunction::evaluate_gradient "double ObjectiveFunction::evaluate_gradient(const std::vector< double > &pars, int index, std::vector< double > &gradient)
+
+Evaluates residual and gradients of the function for given vector of function parameters and index of dataelement using callback mechanism. 
+";
+
+%feature("docstring")  ObjectiveFunction::functionCalls "int ObjectiveFunction::functionCalls() const 
+";
+
+%feature("docstring")  ObjectiveFunction::sizeOfData "int ObjectiveFunction::sizeOfData() const 
+";
+
+
+// File: classOptionContainer.xml
+%feature("docstring") OptionContainer "
+
+The  OptionContainer class stores multi option (int,double,string) in a container.
+
+C++ includes: OptionContainer.h
+";
+
+%feature("docstring")  OptionContainer::OptionContainer "OptionContainer::OptionContainer()
+";
+
+%feature("docstring")  OptionContainer::OptionContainer "OptionContainer::OptionContainer(const OptionContainer &other)
+
+Returns true if option with such name already exists. 
+";
+
+%feature("docstring")  OptionContainer::addOption "OptionContainer::option_t OptionContainer::addOption(const std::string &optionName, T value, const std::string &description=std::string())
+";
+
+%feature("docstring")  OptionContainer::option "OptionContainer::option_t OptionContainer::option(const std::string &optionName)
+";
+
+%feature("docstring")  OptionContainer::option "const OptionContainer::option_t OptionContainer::option(const std::string &optionName) const 
+";
+
+%feature("docstring")  OptionContainer::optionValue "T OptionContainer::optionValue(const std::string &optionName) const 
+";
+
+%feature("docstring")  OptionContainer::setOptionValue "void OptionContainer::setOptionValue(const std::string &optionName, T value)
+
+Sets the value of option. Option should hold same value type already. 
+";
+
+%feature("docstring")  OptionContainer::begin "iterator OptionContainer::begin()
+";
+
+%feature("docstring")  OptionContainer::begin "const_iterator OptionContainer::begin() const 
+";
+
+%feature("docstring")  OptionContainer::end "iterator OptionContainer::end()
+";
+
+%feature("docstring")  OptionContainer::end "const_iterator OptionContainer::end() const 
+";
+
+%feature("docstring")  OptionContainer::size "size_t OptionContainer::size() const 
+";
+
+
+// File: classRealLimits.xml
+%feature("docstring") RealLimits "
+
+Limits for a real fit parameter.
+
+C++ includes: RealLimits.h
+";
+
+%feature("docstring")  RealLimits::RealLimits "RealLimits::RealLimits()
+";
+
+%feature("docstring")  RealLimits::hasLowerLimit "bool RealLimits::hasLowerLimit() const
+
+if has lower limit 
+";
+
+%feature("docstring")  RealLimits::getLowerLimit "double RealLimits::getLowerLimit() const
+
+Returns lower limit. 
+";
+
+%feature("docstring")  RealLimits::setLowerLimit "void RealLimits::setLowerLimit(double value)
+
+Sets lower limit. 
+";
+
+%feature("docstring")  RealLimits::removeLowerLimit "void RealLimits::removeLowerLimit()
+
+remove lower limit 
+";
+
+%feature("docstring")  RealLimits::hasUpperLimit "bool RealLimits::hasUpperLimit() const
+
+if has upper limit 
+";
+
+%feature("docstring")  RealLimits::getUpperLimit "double RealLimits::getUpperLimit() const
+
+Returns upper limit. 
+";
+
+%feature("docstring")  RealLimits::setUpperLimit "void RealLimits::setUpperLimit(double value)
+
+Sets upper limit. 
+";
+
+%feature("docstring")  RealLimits::removeUpperLimit "void RealLimits::removeUpperLimit()
+
+remove upper limit 
+";
+
+%feature("docstring")  RealLimits::hasLowerAndUpperLimits "bool RealLimits::hasLowerAndUpperLimits() const
+
+if has lower and upper limit 
+";
+
+%feature("docstring")  RealLimits::setLimits "void RealLimits::setLimits(double xmin, double xmax)
+
+Sets lower and upper limits. 
+";
+
+%feature("docstring")  RealLimits::removeLimits "void RealLimits::removeLimits()
+
+remove limits 
+";
+
+%feature("docstring")  RealLimits::isInRange "bool RealLimits::isInRange(double value) const
+
+returns true if proposed value is in limits range 
+";
+
+
+// File: classRootGradientFunction.xml
+%feature("docstring") RootGradientFunction "
+
+Minimizer function with access to single data element residuals. Required by Fumili, Fumili2 and GSLMultiMin minimizers.
+
+C++ includes: RootMinimizerFunctions.h
+";
+
+%feature("docstring")  RootGradientFunction::RootGradientFunction "RootGradientFunction::RootGradientFunction(root_gradient_t fun_gradient, size_t npars, size_t ndatasize)
+";
+
+%feature("docstring")  RootGradientFunction::Type "Type_t RootGradientFunction::Type() const 
+";
+
+%feature("docstring")  RootGradientFunction::Clone "BA_ROOT::Math::IMultiGenFunction* RootGradientFunction::Clone() const 
+";
+
+%feature("docstring")  RootGradientFunction::DataElement "double RootGradientFunction::DataElement(const double *pars, unsigned int i_data, double *gradient=0) const
+
+evaluation of single data element residual 
+";
+
+
+// File: classRootMinimizerAdapter.xml
+%feature("docstring") RootMinimizerAdapter "
+
+The  RootMinimizerAdapter class adapts ROOT minimizer interface to our  IMinimizer.
+
+C++ includes: RootMinimizerAdapter.h
+";
+
+%feature("docstring")  RootMinimizerAdapter::~RootMinimizerAdapter "RootMinimizerAdapter::~RootMinimizerAdapter()
+";
+
+%feature("docstring")  RootMinimizerAdapter::minimize "void RootMinimizerAdapter::minimize() override
+
+run minimization 
+";
+
+%feature("docstring")  RootMinimizerAdapter::minimizerName "std::string RootMinimizerAdapter::minimizerName() const overridefinal
+
+Returns name of the minimizer. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::algorithmName "std::string RootMinimizerAdapter::algorithmName() const overridefinal
+
+Returns name of the minimization algorithm. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::setParameters "void RootMinimizerAdapter::setParameters(const FitParameterSet &parameters) overridefinal
+
+Sets internal minimizer parameters using external parameter list. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::setObjectiveFunction "void RootMinimizerAdapter::setObjectiveFunction(objective_function_t func) overridefinal
+";
+
+%feature("docstring")  RootMinimizerAdapter::setGradientFunction "void RootMinimizerAdapter::setGradientFunction(gradient_function_t func, int ndatasize) overridefinal
+";
+
+%feature("docstring")  RootMinimizerAdapter::minValue "double RootMinimizerAdapter::minValue() const overridefinal
+
+Returns minimum function value. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::reportResults "std::string RootMinimizerAdapter::reportResults() const overridefinal
+
+Prints fit results. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::options "MinimizerOptions& RootMinimizerAdapter::options()
+";
+
+%feature("docstring")  RootMinimizerAdapter::options "const MinimizerOptions& RootMinimizerAdapter::options() const 
+";
+
+%feature("docstring")  RootMinimizerAdapter::statusToString "std::string RootMinimizerAdapter::statusToString() const
+
+Returns string representation of current minimizer status. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::providesError "bool RootMinimizerAdapter::providesError() const
+
+Returns true if minimizer provides error and error matrix. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::statusMap "std::map< std::string, std::string > RootMinimizerAdapter::statusMap() const
+
+Returns map of string representing different minimizer statuses. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::propagateResults "void RootMinimizerAdapter::propagateResults(FitParameterSet &parameters) override
+
+Propagates results of minimization to fit parameter set. 
+";
+
+%feature("docstring")  RootMinimizerAdapter::setOptions "void RootMinimizerAdapter::setOptions(const std::string &optionString) overridefinal
+
+Sets option string to the minimizer. 
+";
+
+
+// File: classRootObjectiveFunction.xml
+%feature("docstring") RootObjectiveFunction "
+
+minimizer chi2 function
+
+C++ includes: RootMinimizerFunctions.h
+";
+
+%feature("docstring")  RootObjectiveFunction::RootObjectiveFunction "RootObjectiveFunction::RootObjectiveFunction(root_objective_t fcn, int ndims)
+";
+
+
+// File: classRootObjectiveFunctionAdapter.xml
+%feature("docstring") RootObjectiveFunctionAdapter "
+
+The  RootObjectiveFunctionAdapter class adapts our objective functions to ROOT.
+
+C++ includes: RootObjectiveFuncAdapter.h
+";
+
+%feature("docstring")  RootObjectiveFunctionAdapter::RootObjectiveFunctionAdapter "RootObjectiveFunctionAdapter::RootObjectiveFunctionAdapter()
+";
+
+%feature("docstring")  RootObjectiveFunctionAdapter::setObjectiveCallback "void RootObjectiveFunctionAdapter::setObjectiveCallback(objective_function_t func)
+
+Sets the function which will be used for finding objective function minimum value. 
+";
+
+%feature("docstring")  RootObjectiveFunctionAdapter::setGradientCallback "void RootObjectiveFunctionAdapter::setGradientCallback(gradient_function_t func, int ndatasize)
+
+Sets the function which will be used for gradient calculations. 
+";
+
+%feature("docstring")  RootObjectiveFunctionAdapter::setNumberOfParameters "void RootObjectiveFunctionAdapter::setNumberOfParameters(int nparameters)
+
+Sets number of fit parameters (needed to construct correct ROOT's functions). 
+";
+
+%feature("docstring")  RootObjectiveFunctionAdapter::rootChiSquaredFunction "const RootObjectiveFunction * RootObjectiveFunctionAdapter::rootChiSquaredFunction()
+
+Creates and returns objective function suitable for ROOT minimizers. 
+";
+
+%feature("docstring")  RootObjectiveFunctionAdapter::rootGradientFunction "const RootGradientFunction * RootObjectiveFunctionAdapter::rootGradientFunction()
+
+Creates and returns gradient function suitable for ROOT minimizers. 
+";
+
+
+// File: classSimAnMinimizer.xml
+%feature("docstring") SimAnMinimizer "
+
+Wrapper for ROOT GSL simmulated annealing minimizer.
+
+C++ includes: SimAnMinimizer.h
+";
+
+%feature("docstring")  SimAnMinimizer::SimAnMinimizer "SimAnMinimizer::SimAnMinimizer()
+";
+
+%feature("docstring")  SimAnMinimizer::~SimAnMinimizer "SimAnMinimizer::~SimAnMinimizer()
+";
+
+%feature("docstring")  SimAnMinimizer::setPrintLevel "void SimAnMinimizer::setPrintLevel(int value)
+
+Sets minimizer internal print level. Default value is 0 (silent). 
+";
+
+%feature("docstring")  SimAnMinimizer::printLevel "int SimAnMinimizer::printLevel() const 
+";
+
+%feature("docstring")  SimAnMinimizer::setMaxIterations "void SimAnMinimizer::setMaxIterations(int value)
+
+Sets maximum number of iterations to try at each step. Default values is 100. 
+";
+
+%feature("docstring")  SimAnMinimizer::maxIterations "int SimAnMinimizer::maxIterations() const 
+";
+
+%feature("docstring")  SimAnMinimizer::setIterationsAtEachTemp "void SimAnMinimizer::setIterationsAtEachTemp(int value)
+
+Sets number of iterations at each temperature. Default value is 10. 
+";
+
+%feature("docstring")  SimAnMinimizer::iterationsAtEachTemp "int SimAnMinimizer::iterationsAtEachTemp() const 
+";
+
+%feature("docstring")  SimAnMinimizer::setStepSize "void SimAnMinimizer::setStepSize(double value)
+
+Sets max step size used in random walk. Default value is 1.0. 
+";
+
+%feature("docstring")  SimAnMinimizer::stepSize "double SimAnMinimizer::stepSize() const 
+";
+
+%feature("docstring")  SimAnMinimizer::setBoltzmannK "void SimAnMinimizer::setBoltzmannK(double value)
+
+Sets Boltzmann distribution parameter: k. Default value 1.0. 
+";
+
+%feature("docstring")  SimAnMinimizer::boltzmannK "double SimAnMinimizer::boltzmannK() const 
+";
+
+%feature("docstring")  SimAnMinimizer::setBoltzmannInitialTemp "void SimAnMinimizer::setBoltzmannInitialTemp(double value)
+
+Sets Boltzmann distribution parameter: initial temperature. Default value 50.0. 
+";
+
+%feature("docstring")  SimAnMinimizer::boltzmannInitialTemp "double SimAnMinimizer::boltzmannInitialTemp() const 
+";
+
+%feature("docstring")  SimAnMinimizer::setBoltzmannMu "void SimAnMinimizer::setBoltzmannMu(double value)
+
+Sets Boltzmann distribution parameter: mu. Default value 1.05. 
+";
+
+%feature("docstring")  SimAnMinimizer::boltzmannMu "double SimAnMinimizer::boltzmannMu() const 
+";
+
+%feature("docstring")  SimAnMinimizer::setBoltzmannMinTemp "void SimAnMinimizer::setBoltzmannMinTemp(double value)
+
+Sets Boltzmann distribution parameter: minimal temperature. Default value 0.1. 
+";
+
+%feature("docstring")  SimAnMinimizer::boltzmannMinTemp "double SimAnMinimizer::boltzmannMinTemp() const 
+";
+
+%feature("docstring")  SimAnMinimizer::statusMap "std::map< std::string, std::string > SimAnMinimizer::statusMap() const
+
+Returns map of string representing different minimizer statuses. 
+";
+
+%feature("docstring")  SimAnMinimizer::isGradientBasedAgorithm "virtual bool SimAnMinimizer::isGradientBasedAgorithm()
+";
+
+
+// File: classTestMinimizer.xml
+%feature("docstring") TestMinimizer "
+
+Minimizer which calls minimization function once to test whole chain.
+
+C++ includes: TestMinimizer.h
+";
+
+%feature("docstring")  TestMinimizer::TestMinimizer "TestMinimizer::TestMinimizer()
+";
+
+%feature("docstring")  TestMinimizer::~TestMinimizer "TestMinimizer::~TestMinimizer()
+";
+
+%feature("docstring")  TestMinimizer::minimizerName "std::string TestMinimizer::minimizerName() const override
+
+return name of the minimizer 
+";
+
+%feature("docstring")  TestMinimizer::minimize "void TestMinimizer::minimize() override
+
+run minimization 
+";
+
+%feature("docstring")  TestMinimizer::setParameters "void TestMinimizer::setParameters(const FitParameterSet &parameters) override
+
+Sets internal minimizer parameters using external parameter list. 
+";
+
+%feature("docstring")  TestMinimizer::setObjectiveFunction "void TestMinimizer::setObjectiveFunction(objective_function_t func) override
+";
+
+%feature("docstring")  TestMinimizer::reportResults "std::string TestMinimizer::reportResults() const override
+
+Prints fit results. 
+";
+
+
+// File: classTimeInterval.xml
+%feature("docstring") TimeInterval "";
+
+%feature("docstring")  TimeInterval::TimeInterval "TimeInterval::TimeInterval()
+";
+
+%feature("docstring")  TimeInterval::~TimeInterval "TimeInterval::~TimeInterval()
+";
+
+%feature("docstring")  TimeInterval::start "void TimeInterval::start()
+";
+
+%feature("docstring")  TimeInterval::stop "void TimeInterval::stop()
+";
+
+%feature("docstring")  TimeInterval::runTime "double TimeInterval::runTime() const
+
+returns run time in sec.msec 
+";
+
+
+// File: classTimeIntervalImp.xml
+%feature("docstring") TimeIntervalImp "";
+
+%feature("docstring")  TimeIntervalImp::TimeIntervalImp "TimeIntervalImp::TimeIntervalImp()
+";
+
+
+// File: namespace_0D0.xml
+
+
+// File: namespace_0D15.xml
+
+
+// File: namespace_0D17.xml
+
+
+// File: namespace_0D39.xml
+
+
+// File: namespace_0D41.xml
+
+
+// File: namespace_0D45.xml
+
+
+// File: namespaceAlgorithmNames.xml
+
+
+// File: namespaceBA__ROOT.xml
+
+
+// File: namespaceBA__ROOT_1_1Math.xml
+
+
+// File: namespaceBA__ROOT_1_1Minuit2.xml
+
+
+// File: namespaceMinimizerNames.xml
+
+
+// File: namespaceMinimizerUtils.xml
+%feature("docstring")  MinimizerUtils::toString "std::string MinimizerUtils::toString(const std::vector< std::string > &v, const std::string &delim=\"\")
+";
+
+%feature("docstring")  MinimizerUtils::gslErrorDescriptionMap "std::map< int, std::string > MinimizerUtils::gslErrorDescriptionMap()
+
+Returns translation of GSL error code to string. 
+";
+
+%feature("docstring")  MinimizerUtils::gslErrorDescription "std::string MinimizerUtils::gslErrorDescription(int errorCode)
+";
+
+%feature("docstring")  MinimizerUtils::numbersDiffer "bool MinimizerUtils::numbersDiffer(double a, double b, double tol)
+";
+
+%feature("docstring")  MinimizerUtils::sectionString "std::string MinimizerUtils::sectionString(const std::string &sectionName=std::string(), int report_width=80)
+
+Returns horizontal line of 80 characters length with section name in it. 
+";
+
+
+// File: namespaceMSG.xml
+%feature("docstring")  MSG::SetLevel "BA_CORE_API_ void MSG::SetLevel(EMessageLevel level)
+";
+
+%feature("docstring")  MSG::SetLevel "BA_CORE_API_ void MSG::SetLevel(const std::string &levelname)
+";
+
+
+// File: namespaceOptionNames.xml
+
+
+// File: namespaceUtils.xml
+
+
+// File: namespaceUtils_1_1String.xml
+%feature("docstring")  Utils::String::matchesPattern "bool Utils::String::matchesPattern(const std::string &text, const std::string &wildcardPattern)
+
+Returns true if text matches pattern with wildcards '*' and '?'. 
+";
+
+%feature("docstring")  Utils::String::padRight "std::string Utils::String::padRight(const std::string &name, int length)
+
+Returns string right-padded with blanks. 
+";
+
+%feature("docstring")  Utils::String::split "std::vector< std::string > Utils::String::split(const std::string &text, const std::string &delimeter)
+
+Split string into vector of string using delimeter.
+
+Returns token vector obtained by splitting string at delimiters. 
+";
+
+%feature("docstring")  Utils::String::replaceItemsFromString "void Utils::String::replaceItemsFromString(std::string &text, const std::vector< std::string > &items, const std::string &replacement=std::string(\"\"))
+
+replace all occurences of items from string text with delimeter 
+";
+
+%feature("docstring")  Utils::String::join "std::string Utils::String::join(const std::vector< std::string > &joinable, const std::string &joint)
+
+Returns string obtain by joining vector elements. 
+";
+
+
+// File: FitKernel_8cpp.xml
+
+
+// File: FitKernel_8h.xml
+
+
+// File: FitKernelImpl_8cpp.xml
+
+
+// File: FitKernelImpl_8h.xml
+
+
+// File: FitOptions_8h.xml
+
+
+// File: IMinimizer_8cpp.xml
+
+
+// File: IMinimizer_8h.xml
+
+
+// File: KernelTypes_8h.xml
+
+
+// File: MinimizerCatalogue_8cpp.xml
+
+
+// File: MinimizerCatalogue_8h.xml
+
+
+// File: MinimizerConstants_8h.xml
+
+
+// File: MinimizerFactory_8cpp.xml
+
+
+// File: MinimizerFactory_8h.xml
+
+
+// File: MinimizerInfo_8cpp.xml
+
+
+// File: MinimizerInfo_8h.xml
+
+
+// File: MinimizerOptions_8cpp.xml
+
+
+// File: MinimizerOptions_8h.xml
+
+
+// File: MinimizerResultsHelper_8cpp.xml
+
+
+// File: MinimizerResultsHelper_8h.xml
+%feature("docstring")  to_string_with_precision "std::string to_string_with_precision(const T a_value, int precision=10, int width=0)
+";
+
+%feature("docstring")  to_string_scientific "std::string to_string_scientific(const T a_value, int n=10)
+";
+
+
+// File: MinimizerUtils_8cpp.xml
+
+
+// File: MinimizerUtils_8h.xml
+
+
+// File: MultiOption_8cpp.xml
+
+
+// File: MultiOption_8h.xml
+
+
+// File: ObjectiveFunction_8cpp.xml
+
+
+// File: ObjectiveFunction_8h.xml
+
+
+// File: OptionContainer_8cpp.xml
+
+
+// File: OptionContainer_8h.xml
+
+
+// File: TestMinimizer_8cpp.xml
+
+
+// File: TestMinimizer_8h.xml
+
+
+// File: AttLimits_8cpp.xml
+
+
+// File: AttLimits_8h.xml
+
+
+// File: Attributes_8h.xml
+
+
+// File: FitParameter_8cpp.xml
+
+
+// File: FitParameter_8h.xml
+
+
+// File: FitParameterSet_8cpp.xml
+
+
+// File: FitParameterSet_8h.xml
+
+
+// File: IFitParameter_8h.xml
+
+
+// File: RealLimits_8cpp.xml
+
+
+// File: RealLimits_8h.xml
+
+
+// File: GeneticMinimizer_8cpp.xml
+
+
+// File: GeneticMinimizer_8h.xml
+
+
+// File: GSLLevenbergMarquardtMinimizer_8cpp.xml
+
+
+// File: GSLLevenbergMarquardtMinimizer_8h.xml
+
+
+// File: GSLMultiMinimizer_8cpp.xml
+
+
+// File: GSLMultiMinimizer_8h.xml
+
+
+// File: Minuit2Minimizer_8cpp.xml
+
+
+// File: Minuit2Minimizer_8h.xml
+
+
+// File: RootMinimizerAdapter_8cpp.xml
+
+
+// File: RootMinimizerAdapter_8h.xml
+
+
+// File: RootMinimizerFunctions_8h.xml
+
+
+// File: RootObjectiveFuncAdapter_8cpp.xml
+
+
+// File: RootObjectiveFuncAdapter_8h.xml
+
+
+// File: SimAnMinimizer_8cpp.xml
+
+
+// File: SimAnMinimizer_8h.xml
+
+
+// File: Logger_8cpp.xml
+
+
+// File: Logger_8h.xml
+
+
+// File: StringUtils_8cpp.xml
+
+
+// File: StringUtils_8h.xml
+
+
+// File: TimeInterval_8cpp.xml
+
+
+// File: TimeInterval_8h.xml
+
+
+// File: dir_d0c8f8fb9032c27878972645c4679f14.xml
+
+
+// File: dir_befad91b6aded329d87ab1464acca32e.xml
+
+
+// File: dir_f9473c719213b1ce2ec7fbf8aef1535c.xml
+
+
+// File: dir_1acb97a05207425a4804447756e3d919.xml
+
+
+// File: dir_50776eae6dbf3f787dd8fd4106a9bdd2.xml
+
+
+// File: dir_111d40054bb7ae6116a9a4a5aab3a0b8.xml
+
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
new file mode 100644
index 0000000..3c82a29
--- /dev/null
+++ b/auto/Wrap/libBornAgainCore.py
@@ -0,0 +1,24639 @@
+# This file was automatically generated by SWIG (http://www.swig.org).
+# Version 3.0.8
+#
+# Do not make changes to this file unless you know what you are doing--modify
+# the SWIG interface file instead.
+
+
+
+
+
+from sys import version_info
+if version_info >= (2, 6, 0):
+    def swig_import_helper():
+        from os.path import dirname
+        import imp
+        fp = None
+        try:
+            fp, pathname, description = imp.find_module('_libBornAgainCore', [dirname(__file__)])
+        except ImportError:
+            import _libBornAgainCore
+            return _libBornAgainCore
+        if fp is not None:
+            try:
+                _mod = imp.load_module('_libBornAgainCore', fp, pathname, description)
+            finally:
+                fp.close()
+            return _mod
+    _libBornAgainCore = swig_import_helper()
+    del swig_import_helper
+else:
+    import _libBornAgainCore
+del version_info
+try:
+    _swig_property = property
+except NameError:
+    pass  # Python < 2.2 doesn't have 'property'.
+
+
+def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
+    if (name == "thisown"):
+        return self.this.own(value)
+    if (name == "this"):
+        if type(value).__name__ == 'SwigPyObject':
+            self.__dict__[name] = value
+            return
+    method = class_type.__swig_setmethods__.get(name, None)
+    if method:
+        return method(self, value)
+    if (not static):
+        if _newclass:
+            object.__setattr__(self, name, value)
+        else:
+            self.__dict__[name] = value
+    else:
+        raise AttributeError("You cannot add attributes to %s" % self)
+
+
+def _swig_setattr(self, class_type, name, value):
+    return _swig_setattr_nondynamic(self, class_type, name, value, 0)
+
+
+def _swig_getattr_nondynamic(self, class_type, name, static=1):
+    if (name == "thisown"):
+        return self.this.own()
+    method = class_type.__swig_getmethods__.get(name, None)
+    if method:
+        return method(self)
+    if (not static):
+        return object.__getattr__(self, name)
+    else:
+        raise AttributeError(name)
+
+def _swig_getattr(self, class_type, name):
+    return _swig_getattr_nondynamic(self, class_type, name, 0)
+
+
+def _swig_repr(self):
+    try:
+        strthis = "proxy of " + self.this.__repr__()
+    except Exception:
+        strthis = ""
+    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
+
+try:
+    _object = object
+    _newclass = 1
+except AttributeError:
+    class _object:
+        pass
+    _newclass = 0
+
+
+try:
+    import weakref
+    weakref_proxy = weakref.proxy
+except Exception:
+    weakref_proxy = lambda x: x
+
+
+class SwigPyIterator(_object):
+    """Proxy of C++ swig::SwigPyIterator class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SwigPyIterator, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SwigPyIterator, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_SwigPyIterator
+    __del__ = lambda self: None
+
+    def value(self):
+        """value(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainCore.SwigPyIterator_value(self)
+
+
+    def incr(self, n=1):
+        """
+        incr(SwigPyIterator self, size_t n=1) -> SwigPyIterator
+        incr(SwigPyIterator self) -> SwigPyIterator
+        """
+        return _libBornAgainCore.SwigPyIterator_incr(self, n)
+
+
+    def decr(self, n=1):
+        """
+        decr(SwigPyIterator self, size_t n=1) -> SwigPyIterator
+        decr(SwigPyIterator self) -> SwigPyIterator
+        """
+        return _libBornAgainCore.SwigPyIterator_decr(self, n)
+
+
+    def distance(self, x):
+        """distance(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t"""
+        return _libBornAgainCore.SwigPyIterator_distance(self, x)
+
+
+    def equal(self, x):
+        """equal(SwigPyIterator self, SwigPyIterator x) -> bool"""
+        return _libBornAgainCore.SwigPyIterator_equal(self, x)
+
+
+    def copy(self):
+        """copy(SwigPyIterator self) -> SwigPyIterator"""
+        return _libBornAgainCore.SwigPyIterator_copy(self)
+
+
+    def next(self):
+        """next(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainCore.SwigPyIterator_next(self)
+
+
+    def __next__(self):
+        """__next__(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainCore.SwigPyIterator___next__(self)
+
+
+    def previous(self):
+        """previous(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainCore.SwigPyIterator_previous(self)
+
+
+    def advance(self, n):
+        """advance(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainCore.SwigPyIterator_advance(self, n)
+
+
+    def __eq__(self, x):
+        """__eq__(SwigPyIterator self, SwigPyIterator x) -> bool"""
+        return _libBornAgainCore.SwigPyIterator___eq__(self, x)
+
+
+    def __ne__(self, x):
+        """__ne__(SwigPyIterator self, SwigPyIterator x) -> bool"""
+        return _libBornAgainCore.SwigPyIterator___ne__(self, x)
+
+
+    def __iadd__(self, n):
+        """__iadd__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainCore.SwigPyIterator___iadd__(self, n)
+
+
+    def __isub__(self, n):
+        """__isub__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainCore.SwigPyIterator___isub__(self, n)
+
+
+    def __add__(self, n):
+        """__add__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainCore.SwigPyIterator___add__(self, n)
+
+
+    def __sub__(self, *args):
+        """
+        __sub__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator
+        __sub__(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t
+        """
+        return _libBornAgainCore.SwigPyIterator___sub__(self, *args)
+
+    def __iter__(self):
+        return self
+SwigPyIterator_swigregister = _libBornAgainCore.SwigPyIterator_swigregister
+SwigPyIterator_swigregister(SwigPyIterator)
+
+
+_libBornAgainCore.SHARED_PTR_DISOWN_swigconstant(_libBornAgainCore)
+SHARED_PTR_DISOWN = _libBornAgainCore.SHARED_PTR_DISOWN
+class vdouble1d_t(_object):
+    """Proxy of C++ std::vector<(double)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vdouble1d_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vdouble1d_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vdouble1d_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vdouble1d_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vdouble1d_t self) -> bool"""
+        return _libBornAgainCore.vdouble1d_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vdouble1d_t self) -> bool"""
+        return _libBornAgainCore.vdouble1d_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vdouble1d_t self) -> std::vector< double >::size_type"""
+        return _libBornAgainCore.vdouble1d_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j) -> vdouble1d_t"""
+        return _libBornAgainCore.vdouble1d_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j)
+        __setslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j, vdouble1d_t v)
+        """
+        return _libBornAgainCore.vdouble1d_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j)"""
+        return _libBornAgainCore.vdouble1d_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vdouble1d_t self, std::vector< double >::difference_type i)
+        __delitem__(vdouble1d_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vdouble1d_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vdouble1d_t self, PySliceObject * slice) -> vdouble1d_t
+        __getitem__(vdouble1d_t self, std::vector< double >::difference_type i) -> std::vector< double >::value_type const &
+        """
+        return _libBornAgainCore.vdouble1d_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vdouble1d_t self, PySliceObject * slice, vdouble1d_t v)
+        __setitem__(vdouble1d_t self, PySliceObject * slice)
+        __setitem__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::value_type const & x)
+        """
+        return _libBornAgainCore.vdouble1d_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vdouble1d_t self) -> std::vector< double >::value_type"""
+        return _libBornAgainCore.vdouble1d_t_pop(self)
+
+
+    def append(self, x):
+        """append(vdouble1d_t self, std::vector< double >::value_type const & x)"""
+        return _libBornAgainCore.vdouble1d_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vdouble1d_t self) -> bool"""
+        return _libBornAgainCore.vdouble1d_t_empty(self)
+
+
+    def size(self):
+        """size(vdouble1d_t self) -> std::vector< double >::size_type"""
+        return _libBornAgainCore.vdouble1d_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vdouble1d_t self, vdouble1d_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vdouble1d_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vdouble1d_t self) -> std::vector< double >::iterator"""
+        return _libBornAgainCore.vdouble1d_t_begin(self)
+
+
+    def end(self):
+        """end(vdouble1d_t self) -> std::vector< double >::iterator"""
+        return _libBornAgainCore.vdouble1d_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vdouble1d_t self) -> std::vector< double >::reverse_iterator"""
+        return _libBornAgainCore.vdouble1d_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vdouble1d_t self) -> std::vector< double >::reverse_iterator"""
+        return _libBornAgainCore.vdouble1d_t_rend(self)
+
+
+    def clear(self):
+        """clear(vdouble1d_t self)"""
+        return _libBornAgainCore.vdouble1d_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vdouble1d_t self) -> std::vector< double >::allocator_type"""
+        return _libBornAgainCore.vdouble1d_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vdouble1d_t self)"""
+        return _libBornAgainCore.vdouble1d_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vdouble1d_t self, std::vector< double >::iterator pos) -> std::vector< double >::iterator
+        erase(vdouble1d_t self, std::vector< double >::iterator first, std::vector< double >::iterator last) -> std::vector< double >::iterator
+        """
+        return _libBornAgainCore.vdouble1d_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(double)> self) -> vdouble1d_t
+        __init__(std::vector<(double)> self, vdouble1d_t arg2) -> vdouble1d_t
+        __init__(std::vector<(double)> self, std::vector< double >::size_type size) -> vdouble1d_t
+        __init__(std::vector<(double)> self, std::vector< double >::size_type size, std::vector< double >::value_type const & value) -> vdouble1d_t
+        """
+        this = _libBornAgainCore.new_vdouble1d_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vdouble1d_t self, std::vector< double >::value_type const & x)"""
+        return _libBornAgainCore.vdouble1d_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vdouble1d_t self) -> std::vector< double >::value_type const &"""
+        return _libBornAgainCore.vdouble1d_t_front(self)
+
+
+    def back(self):
+        """back(vdouble1d_t self) -> std::vector< double >::value_type const &"""
+        return _libBornAgainCore.vdouble1d_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vdouble1d_t self, std::vector< double >::size_type n, std::vector< double >::value_type const & x)"""
+        return _libBornAgainCore.vdouble1d_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vdouble1d_t self, std::vector< double >::size_type new_size)
+        resize(vdouble1d_t self, std::vector< double >::size_type new_size, std::vector< double >::value_type const & x)
+        """
+        return _libBornAgainCore.vdouble1d_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vdouble1d_t self, std::vector< double >::iterator pos, std::vector< double >::value_type const & x) -> std::vector< double >::iterator
+        insert(vdouble1d_t self, std::vector< double >::iterator pos, std::vector< double >::size_type n, std::vector< double >::value_type const & x)
+        """
+        return _libBornAgainCore.vdouble1d_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vdouble1d_t self, std::vector< double >::size_type n)"""
+        return _libBornAgainCore.vdouble1d_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vdouble1d_t self) -> std::vector< double >::size_type"""
+        return _libBornAgainCore.vdouble1d_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vdouble1d_t
+    __del__ = lambda self: None
+vdouble1d_t_swigregister = _libBornAgainCore.vdouble1d_t_swigregister
+vdouble1d_t_swigregister(vdouble1d_t)
+
+class vdouble2d_t(_object):
+    """Proxy of C++ std::vector<(std::vector<(double)>)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vdouble2d_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vdouble2d_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vdouble2d_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vdouble2d_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vdouble2d_t self) -> bool"""
+        return _libBornAgainCore.vdouble2d_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vdouble2d_t self) -> bool"""
+        return _libBornAgainCore.vdouble2d_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"""
+        return _libBornAgainCore.vdouble2d_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j) -> vdouble2d_t"""
+        return _libBornAgainCore.vdouble2d_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)
+        __setslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j, vdouble2d_t v)
+        """
+        return _libBornAgainCore.vdouble2d_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)"""
+        return _libBornAgainCore.vdouble2d_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i)
+        __delitem__(vdouble2d_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vdouble2d_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vdouble2d_t self, PySliceObject * slice) -> vdouble2d_t
+        __getitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i) -> vdouble1d_t
+        """
+        return _libBornAgainCore.vdouble2d_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vdouble2d_t self, PySliceObject * slice, vdouble2d_t v)
+        __setitem__(vdouble2d_t self, PySliceObject * slice)
+        __setitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, vdouble1d_t x)
+        """
+        return _libBornAgainCore.vdouble2d_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vdouble2d_t self) -> vdouble1d_t"""
+        return _libBornAgainCore.vdouble2d_t_pop(self)
+
+
+    def append(self, x):
+        """append(vdouble2d_t self, vdouble1d_t x)"""
+        return _libBornAgainCore.vdouble2d_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vdouble2d_t self) -> bool"""
+        return _libBornAgainCore.vdouble2d_t_empty(self)
+
+
+    def size(self):
+        """size(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"""
+        return _libBornAgainCore.vdouble2d_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vdouble2d_t self, vdouble2d_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vdouble2d_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"""
+        return _libBornAgainCore.vdouble2d_t_begin(self)
+
+
+    def end(self):
+        """end(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"""
+        return _libBornAgainCore.vdouble2d_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"""
+        return _libBornAgainCore.vdouble2d_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"""
+        return _libBornAgainCore.vdouble2d_t_rend(self)
+
+
+    def clear(self):
+        """clear(vdouble2d_t self)"""
+        return _libBornAgainCore.vdouble2d_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vdouble2d_t self) -> std::vector< std::vector< double > >::allocator_type"""
+        return _libBornAgainCore.vdouble2d_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vdouble2d_t self)"""
+        return _libBornAgainCore.vdouble2d_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos) -> std::vector< std::vector< double > >::iterator
+        erase(vdouble2d_t self, std::vector< std::vector< double > >::iterator first, std::vector< std::vector< double > >::iterator last) -> std::vector< std::vector< double > >::iterator
+        """
+        return _libBornAgainCore.vdouble2d_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(std::vector<(double)>)> self) -> vdouble2d_t
+        __init__(std::vector<(std::vector<(double)>)> self, vdouble2d_t arg2) -> vdouble2d_t
+        __init__(std::vector<(std::vector<(double)>)> self, std::vector< std::vector< double > >::size_type size) -> vdouble2d_t
+        __init__(std::vector<(std::vector<(double)>)> self, std::vector< std::vector< double > >::size_type size, vdouble1d_t value) -> vdouble2d_t
+        """
+        this = _libBornAgainCore.new_vdouble2d_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vdouble2d_t self, vdouble1d_t x)"""
+        return _libBornAgainCore.vdouble2d_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vdouble2d_t self) -> vdouble1d_t"""
+        return _libBornAgainCore.vdouble2d_t_front(self)
+
+
+    def back(self):
+        """back(vdouble2d_t self) -> vdouble1d_t"""
+        return _libBornAgainCore.vdouble2d_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vdouble2d_t self, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)"""
+        return _libBornAgainCore.vdouble2d_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vdouble2d_t self, std::vector< std::vector< double > >::size_type new_size)
+        resize(vdouble2d_t self, std::vector< std::vector< double > >::size_type new_size, vdouble1d_t x)
+        """
+        return _libBornAgainCore.vdouble2d_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos, vdouble1d_t x) -> std::vector< std::vector< double > >::iterator
+        insert(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)
+        """
+        return _libBornAgainCore.vdouble2d_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vdouble2d_t self, std::vector< std::vector< double > >::size_type n)"""
+        return _libBornAgainCore.vdouble2d_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"""
+        return _libBornAgainCore.vdouble2d_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vdouble2d_t
+    __del__ = lambda self: None
+vdouble2d_t_swigregister = _libBornAgainCore.vdouble2d_t_swigregister
+vdouble2d_t_swigregister(vdouble2d_t)
+
+class vector_integer_t(_object):
+    """Proxy of C++ std::vector<(int)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_integer_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_integer_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_integer_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vector_integer_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_integer_t self) -> bool"""
+        return _libBornAgainCore.vector_integer_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_integer_t self) -> bool"""
+        return _libBornAgainCore.vector_integer_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_integer_t self) -> std::vector< int >::size_type"""
+        return _libBornAgainCore.vector_integer_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j) -> vector_integer_t"""
+        return _libBornAgainCore.vector_integer_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j)
+        __setslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j, vector_integer_t v)
+        """
+        return _libBornAgainCore.vector_integer_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j)"""
+        return _libBornAgainCore.vector_integer_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_integer_t self, std::vector< int >::difference_type i)
+        __delitem__(vector_integer_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vector_integer_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_integer_t self, PySliceObject * slice) -> vector_integer_t
+        __getitem__(vector_integer_t self, std::vector< int >::difference_type i) -> std::vector< int >::value_type const &
+        """
+        return _libBornAgainCore.vector_integer_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_integer_t self, PySliceObject * slice, vector_integer_t v)
+        __setitem__(vector_integer_t self, PySliceObject * slice)
+        __setitem__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_integer_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_integer_t self) -> std::vector< int >::value_type"""
+        return _libBornAgainCore.vector_integer_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_integer_t self, std::vector< int >::value_type const & x)"""
+        return _libBornAgainCore.vector_integer_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_integer_t self) -> bool"""
+        return _libBornAgainCore.vector_integer_t_empty(self)
+
+
+    def size(self):
+        """size(vector_integer_t self) -> std::vector< int >::size_type"""
+        return _libBornAgainCore.vector_integer_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vector_integer_t self, vector_integer_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vector_integer_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_integer_t self) -> std::vector< int >::iterator"""
+        return _libBornAgainCore.vector_integer_t_begin(self)
+
+
+    def end(self):
+        """end(vector_integer_t self) -> std::vector< int >::iterator"""
+        return _libBornAgainCore.vector_integer_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_integer_t self) -> std::vector< int >::reverse_iterator"""
+        return _libBornAgainCore.vector_integer_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_integer_t self) -> std::vector< int >::reverse_iterator"""
+        return _libBornAgainCore.vector_integer_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_integer_t self)"""
+        return _libBornAgainCore.vector_integer_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_integer_t self) -> std::vector< int >::allocator_type"""
+        return _libBornAgainCore.vector_integer_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_integer_t self)"""
+        return _libBornAgainCore.vector_integer_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_integer_t self, std::vector< int >::iterator pos) -> std::vector< int >::iterator
+        erase(vector_integer_t self, std::vector< int >::iterator first, std::vector< int >::iterator last) -> std::vector< int >::iterator
+        """
+        return _libBornAgainCore.vector_integer_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(int)> self) -> vector_integer_t
+        __init__(std::vector<(int)> self, vector_integer_t arg2) -> vector_integer_t
+        __init__(std::vector<(int)> self, std::vector< int >::size_type size) -> vector_integer_t
+        __init__(std::vector<(int)> self, std::vector< int >::size_type size, std::vector< int >::value_type const & value) -> vector_integer_t
+        """
+        this = _libBornAgainCore.new_vector_integer_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_integer_t self, std::vector< int >::value_type const & x)"""
+        return _libBornAgainCore.vector_integer_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_integer_t self) -> std::vector< int >::value_type const &"""
+        return _libBornAgainCore.vector_integer_t_front(self)
+
+
+    def back(self):
+        """back(vector_integer_t self) -> std::vector< int >::value_type const &"""
+        return _libBornAgainCore.vector_integer_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_integer_t self, std::vector< int >::size_type n, std::vector< int >::value_type const & x)"""
+        return _libBornAgainCore.vector_integer_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_integer_t self, std::vector< int >::size_type new_size)
+        resize(vector_integer_t self, std::vector< int >::size_type new_size, std::vector< int >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_integer_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_integer_t self, std::vector< int >::iterator pos, std::vector< int >::value_type const & x) -> std::vector< int >::iterator
+        insert(vector_integer_t self, std::vector< int >::iterator pos, std::vector< int >::size_type n, std::vector< int >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_integer_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_integer_t self, std::vector< int >::size_type n)"""
+        return _libBornAgainCore.vector_integer_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_integer_t self) -> std::vector< int >::size_type"""
+        return _libBornAgainCore.vector_integer_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vector_integer_t
+    __del__ = lambda self: None
+vector_integer_t_swigregister = _libBornAgainCore.vector_integer_t_swigregister
+vector_integer_t_swigregister(vector_integer_t)
+
+class vector_longinteger_t(_object):
+    """Proxy of C++ std::vector<(unsigned long)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_longinteger_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_longinteger_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_longinteger_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vector_longinteger_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_longinteger_t self) -> bool"""
+        return _libBornAgainCore.vector_longinteger_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_longinteger_t self) -> bool"""
+        return _libBornAgainCore.vector_longinteger_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"""
+        return _libBornAgainCore.vector_longinteger_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j) -> vector_longinteger_t"""
+        return _libBornAgainCore.vector_longinteger_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)
+        __setslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j, vector_longinteger_t v)
+        """
+        return _libBornAgainCore.vector_longinteger_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)"""
+        return _libBornAgainCore.vector_longinteger_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i)
+        __delitem__(vector_longinteger_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vector_longinteger_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_longinteger_t self, PySliceObject * slice) -> vector_longinteger_t
+        __getitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i) -> std::vector< unsigned long >::value_type const &
+        """
+        return _libBornAgainCore.vector_longinteger_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_longinteger_t self, PySliceObject * slice, vector_longinteger_t v)
+        __setitem__(vector_longinteger_t self, PySliceObject * slice)
+        __setitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_longinteger_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_longinteger_t self) -> std::vector< unsigned long >::value_type"""
+        return _libBornAgainCore.vector_longinteger_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"""
+        return _libBornAgainCore.vector_longinteger_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_longinteger_t self) -> bool"""
+        return _libBornAgainCore.vector_longinteger_t_empty(self)
+
+
+    def size(self):
+        """size(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"""
+        return _libBornAgainCore.vector_longinteger_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vector_longinteger_t self, vector_longinteger_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vector_longinteger_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"""
+        return _libBornAgainCore.vector_longinteger_t_begin(self)
+
+
+    def end(self):
+        """end(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"""
+        return _libBornAgainCore.vector_longinteger_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"""
+        return _libBornAgainCore.vector_longinteger_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"""
+        return _libBornAgainCore.vector_longinteger_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_longinteger_t self)"""
+        return _libBornAgainCore.vector_longinteger_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_longinteger_t self) -> std::vector< unsigned long >::allocator_type"""
+        return _libBornAgainCore.vector_longinteger_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_longinteger_t self)"""
+        return _libBornAgainCore.vector_longinteger_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_longinteger_t self, std::vector< unsigned long >::iterator pos) -> std::vector< unsigned long >::iterator
+        erase(vector_longinteger_t self, std::vector< unsigned long >::iterator first, std::vector< unsigned long >::iterator last) -> std::vector< unsigned long >::iterator
+        """
+        return _libBornAgainCore.vector_longinteger_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(unsigned long)> self) -> vector_longinteger_t
+        __init__(std::vector<(unsigned long)> self, vector_longinteger_t arg2) -> vector_longinteger_t
+        __init__(std::vector<(unsigned long)> self, std::vector< unsigned long >::size_type size) -> vector_longinteger_t
+        __init__(std::vector<(unsigned long)> self, std::vector< unsigned long >::size_type size, std::vector< unsigned long >::value_type const & value) -> vector_longinteger_t
+        """
+        this = _libBornAgainCore.new_vector_longinteger_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"""
+        return _libBornAgainCore.vector_longinteger_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"""
+        return _libBornAgainCore.vector_longinteger_t_front(self)
+
+
+    def back(self):
+        """back(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"""
+        return _libBornAgainCore.vector_longinteger_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_longinteger_t self, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)"""
+        return _libBornAgainCore.vector_longinteger_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_longinteger_t self, std::vector< unsigned long >::size_type new_size)
+        resize(vector_longinteger_t self, std::vector< unsigned long >::size_type new_size, std::vector< unsigned long >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_longinteger_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_longinteger_t self, std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::value_type const & x) -> std::vector< unsigned long >::iterator
+        insert(vector_longinteger_t self, std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_longinteger_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_longinteger_t self, std::vector< unsigned long >::size_type n)"""
+        return _libBornAgainCore.vector_longinteger_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"""
+        return _libBornAgainCore.vector_longinteger_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vector_longinteger_t
+    __del__ = lambda self: None
+vector_longinteger_t_swigregister = _libBornAgainCore.vector_longinteger_t_swigregister
+vector_longinteger_t_swigregister(vector_longinteger_t)
+
+class vector_complex_t(_object):
+    """Proxy of C++ std::vector<(std::complex<(double)>)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_complex_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_complex_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_complex_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vector_complex_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_complex_t self) -> bool"""
+        return _libBornAgainCore.vector_complex_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_complex_t self) -> bool"""
+        return _libBornAgainCore.vector_complex_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"""
+        return _libBornAgainCore.vector_complex_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j) -> vector_complex_t"""
+        return _libBornAgainCore.vector_complex_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)
+        __setslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j, vector_complex_t v)
+        """
+        return _libBornAgainCore.vector_complex_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)"""
+        return _libBornAgainCore.vector_complex_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i)
+        __delitem__(vector_complex_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vector_complex_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_complex_t self, PySliceObject * slice) -> vector_complex_t
+        __getitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i) -> std::vector< std::complex< double > >::value_type const &
+        """
+        return _libBornAgainCore.vector_complex_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_complex_t self, PySliceObject * slice, vector_complex_t v)
+        __setitem__(vector_complex_t self, PySliceObject * slice)
+        __setitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_complex_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_complex_t self) -> std::vector< std::complex< double > >::value_type"""
+        return _libBornAgainCore.vector_complex_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"""
+        return _libBornAgainCore.vector_complex_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_complex_t self) -> bool"""
+        return _libBornAgainCore.vector_complex_t_empty(self)
+
+
+    def size(self):
+        """size(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"""
+        return _libBornAgainCore.vector_complex_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vector_complex_t self, vector_complex_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vector_complex_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"""
+        return _libBornAgainCore.vector_complex_t_begin(self)
+
+
+    def end(self):
+        """end(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"""
+        return _libBornAgainCore.vector_complex_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"""
+        return _libBornAgainCore.vector_complex_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"""
+        return _libBornAgainCore.vector_complex_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_complex_t self)"""
+        return _libBornAgainCore.vector_complex_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_complex_t self) -> std::vector< std::complex< double > >::allocator_type"""
+        return _libBornAgainCore.vector_complex_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_complex_t self)"""
+        return _libBornAgainCore.vector_complex_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_complex_t self, std::vector< std::complex< double > >::iterator pos) -> std::vector< std::complex< double > >::iterator
+        erase(vector_complex_t self, std::vector< std::complex< double > >::iterator first, std::vector< std::complex< double > >::iterator last) -> std::vector< std::complex< double > >::iterator
+        """
+        return _libBornAgainCore.vector_complex_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(std::complex<(double)>)> self) -> vector_complex_t
+        __init__(std::vector<(std::complex<(double)>)> self, vector_complex_t arg2) -> vector_complex_t
+        __init__(std::vector<(std::complex<(double)>)> self, std::vector< std::complex< double > >::size_type size) -> vector_complex_t
+        __init__(std::vector<(std::complex<(double)>)> self, std::vector< std::complex< double > >::size_type size, std::vector< std::complex< double > >::value_type const & value) -> vector_complex_t
+        """
+        this = _libBornAgainCore.new_vector_complex_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"""
+        return _libBornAgainCore.vector_complex_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"""
+        return _libBornAgainCore.vector_complex_t_front(self)
+
+
+    def back(self):
+        """back(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"""
+        return _libBornAgainCore.vector_complex_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_complex_t self, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)"""
+        return _libBornAgainCore.vector_complex_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_complex_t self, std::vector< std::complex< double > >::size_type new_size)
+        resize(vector_complex_t self, std::vector< std::complex< double > >::size_type new_size, std::vector< std::complex< double > >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_complex_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_complex_t self, std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::value_type const & x) -> std::vector< std::complex< double > >::iterator
+        insert(vector_complex_t self, std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_complex_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_complex_t self, std::vector< std::complex< double > >::size_type n)"""
+        return _libBornAgainCore.vector_complex_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"""
+        return _libBornAgainCore.vector_complex_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vector_complex_t
+    __del__ = lambda self: None
+vector_complex_t_swigregister = _libBornAgainCore.vector_complex_t_swigregister
+vector_complex_t_swigregister(vector_complex_t)
+
+class vector_string_t(_object):
+    """Proxy of C++ std::vector<(std::string)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_string_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_string_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_string_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vector_string_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_string_t self) -> bool"""
+        return _libBornAgainCore.vector_string_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_string_t self) -> bool"""
+        return _libBornAgainCore.vector_string_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_string_t self) -> std::vector< std::string >::size_type"""
+        return _libBornAgainCore.vector_string_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j) -> vector_string_t"""
+        return _libBornAgainCore.vector_string_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)
+        __setslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j, vector_string_t v)
+        """
+        return _libBornAgainCore.vector_string_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)"""
+        return _libBornAgainCore.vector_string_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_string_t self, std::vector< std::string >::difference_type i)
+        __delitem__(vector_string_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vector_string_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_string_t self, PySliceObject * slice) -> vector_string_t
+        __getitem__(vector_string_t self, std::vector< std::string >::difference_type i) -> std::vector< std::string >::value_type const &
+        """
+        return _libBornAgainCore.vector_string_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_string_t self, PySliceObject * slice, vector_string_t v)
+        __setitem__(vector_string_t self, PySliceObject * slice)
+        __setitem__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_string_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_string_t self) -> std::vector< std::string >::value_type"""
+        return _libBornAgainCore.vector_string_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_string_t self, std::vector< std::string >::value_type const & x)"""
+        return _libBornAgainCore.vector_string_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_string_t self) -> bool"""
+        return _libBornAgainCore.vector_string_t_empty(self)
+
+
+    def size(self):
+        """size(vector_string_t self) -> std::vector< std::string >::size_type"""
+        return _libBornAgainCore.vector_string_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vector_string_t self, vector_string_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vector_string_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_string_t self) -> std::vector< std::string >::iterator"""
+        return _libBornAgainCore.vector_string_t_begin(self)
+
+
+    def end(self):
+        """end(vector_string_t self) -> std::vector< std::string >::iterator"""
+        return _libBornAgainCore.vector_string_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_string_t self) -> std::vector< std::string >::reverse_iterator"""
+        return _libBornAgainCore.vector_string_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_string_t self) -> std::vector< std::string >::reverse_iterator"""
+        return _libBornAgainCore.vector_string_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_string_t self)"""
+        return _libBornAgainCore.vector_string_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_string_t self) -> std::vector< std::string >::allocator_type"""
+        return _libBornAgainCore.vector_string_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_string_t self)"""
+        return _libBornAgainCore.vector_string_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_string_t self, std::vector< std::string >::iterator pos) -> std::vector< std::string >::iterator
+        erase(vector_string_t self, std::vector< std::string >::iterator first, std::vector< std::string >::iterator last) -> std::vector< std::string >::iterator
+        """
+        return _libBornAgainCore.vector_string_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(std::string)> self) -> vector_string_t
+        __init__(std::vector<(std::string)> self, vector_string_t arg2) -> vector_string_t
+        __init__(std::vector<(std::string)> self, std::vector< std::string >::size_type size) -> vector_string_t
+        __init__(std::vector<(std::string)> self, std::vector< std::string >::size_type size, std::vector< std::string >::value_type const & value) -> vector_string_t
+        """
+        this = _libBornAgainCore.new_vector_string_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_string_t self, std::vector< std::string >::value_type const & x)"""
+        return _libBornAgainCore.vector_string_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_string_t self) -> std::vector< std::string >::value_type const &"""
+        return _libBornAgainCore.vector_string_t_front(self)
+
+
+    def back(self):
+        """back(vector_string_t self) -> std::vector< std::string >::value_type const &"""
+        return _libBornAgainCore.vector_string_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_string_t self, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)"""
+        return _libBornAgainCore.vector_string_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_string_t self, std::vector< std::string >::size_type new_size)
+        resize(vector_string_t self, std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_string_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const & x) -> std::vector< std::string >::iterator
+        insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)
+        """
+        return _libBornAgainCore.vector_string_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_string_t self, std::vector< std::string >::size_type n)"""
+        return _libBornAgainCore.vector_string_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_string_t self) -> std::vector< std::string >::size_type"""
+        return _libBornAgainCore.vector_string_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vector_string_t
+    __del__ = lambda self: None
+vector_string_t_swigregister = _libBornAgainCore.vector_string_t_swigregister
+vector_string_t_swigregister(vector_string_t)
+
+import libBornAgainFit
+
+def GetMajorVersionNumber():
+    """GetMajorVersionNumber() -> int"""
+    return _libBornAgainCore.GetMajorVersionNumber()
+
+def GetMinorVersionNumber():
+    """GetMinorVersionNumber() -> int"""
+    return _libBornAgainCore.GetMinorVersionNumber()
+
+def GetPatchVersionNumber():
+    """GetPatchVersionNumber() -> int"""
+    return _libBornAgainCore.GetPatchVersionNumber()
+
+def GetName():
+    """GetName() -> std::string"""
+    return _libBornAgainCore.GetName()
+
+def GetVersionNumber():
+    """GetVersionNumber() -> std::string"""
+    return _libBornAgainCore.GetVersionNumber()
+
+def vecOfLambdaAlphaPhi(_lambda, _alpha, _phi):
+    """
+    vecOfLambdaAlphaPhi(double const _lambda, double const _alpha, double const _phi) -> kvector_t
+
+    BA_CORE_API_ BasicVector3D<double> vecOfLambdaAlphaPhi(const double _lambda, const double _alpha, const double _phi)
+
+    Creates a vector<double> as a wavevector with given wavelength and angles. Specifically needed for grazing-incidence scattering. 
+
+    """
+    return _libBornAgainCore.vecOfLambdaAlphaPhi(_lambda, _alpha, _phi)
+class INoncopyable(_object):
+    """
+
+
+    Mix-in for objects that must not be copied.
+
+    This virtual base class disables the copy constructor and the operator= in all its child classes.
+
+    C++ includes: INoncopyable.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, INoncopyable, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, INoncopyable, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(INoncopyable self) -> INoncopyable
+
+        INoncopyable::INoncopyable(const INoncopyable &)=delete
+
+        """
+        this = _libBornAgainCore.new_INoncopyable()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_INoncopyable
+    __del__ = lambda self: None
+INoncopyable_swigregister = _libBornAgainCore.INoncopyable_swigregister
+INoncopyable_swigregister(INoncopyable)
+cvar = _libBornAgainCore.cvar
+major_version_number = cvar.major_version_number
+minor_version_number = cvar.minor_version_number
+patch_version_number = cvar.patch_version_number
+PI2 = cvar.PI2
+
+class ICloneable(INoncopyable):
+    """
+
+
+    Mix-in for objects that must not be copied, except by cloning.
+
+    The base class  INoncopyable disables the copy constructor and the operator= in all its child classes. Child classes of  ICloneable should provide clone().
+
+    C++ includes: ICloneable.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [INoncopyable]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ICloneable, name, value)
+    __swig_getmethods__ = {}
+    for _s in [INoncopyable]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ICloneable, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(ICloneable self) -> ICloneable
+
+        virtual ICloneable* ICloneable::clone() const =0
+
+        """
+        return _libBornAgainCore.ICloneable_clone(self)
+
+
+    def transferToCPP(self):
+        """
+        transferToCPP(ICloneable self)
+
+        virtual void ICloneable::transferToCPP()
+
+        Used for Python overriding of clone. 
+
+        """
+        return self.__disown__()
+
+    __swig_destroy__ = _libBornAgainCore.delete_ICloneable
+    __del__ = lambda self: None
+ICloneable_swigregister = _libBornAgainCore.ICloneable_swigregister
+ICloneable_swigregister(ICloneable)
+
+class INamed(_object):
+    """
+
+
+    Interface for named objects.
+
+    C++ includes: INamed.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, INamed, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, INamed, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(INamed self) -> INamed
+        __init__(INamed self, std::string const & name) -> INamed
+
+        INamed::INamed(const std::string &name)
+
+        """
+        if self.__class__ == INamed:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_INamed(_self, *args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_INamed
+    __del__ = lambda self: None
+
+    def getName(self):
+        """
+        getName(INamed self) -> std::string
+
+        std::string INamed::getName() const 
+
+        """
+        return _libBornAgainCore.INamed_getName(self)
+
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_INamed(self)
+        return weakref_proxy(self)
+INamed_swigregister = _libBornAgainCore.INamed_swigregister
+INamed_swigregister(INamed)
+
+class IParameterized(INamed):
+    """
+
+
+    Manages a local parameter pool, and a tree of child pools.
+
+    C++ includes: IParameterized.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [INamed]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IParameterized, name, value)
+    __swig_getmethods__ = {}
+    for _s in [INamed]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IParameterized, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(IParameterized self, std::string const & name) -> IParameterized
+        __init__(IParameterized self) -> IParameterized
+        __init__(IParameterized self, IParameterized other) -> IParameterized
+
+        IParameterized::IParameterized(const IParameterized &other)
+
+        """
+        if self.__class__ == IParameterized:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_IParameterized(_self, *args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IParameterized
+    __del__ = lambda self: None
+
+    def getParameterPool(self):
+        """
+        getParameterPool(IParameterized self) -> ParameterPool
+
+        ParameterPool* IParameterized::getParameterPool() const
+
+        Returns pointer to the parameter pool. 
+
+        """
+        return _libBornAgainCore.IParameterized_getParameterPool(self)
+
+
+    def createParameterTree(self):
+        """
+        createParameterTree(IParameterized self) -> ParameterPool
+
+        ParameterPool * IParameterized::createParameterTree()
+
+        Creates new parameter pool, with all local parameters and those of its children. 
+
+        """
+        return _libBornAgainCore.IParameterized_createParameterTree(self)
+
+
+    def printParameters(self):
+        """
+        printParameters(IParameterized self)
+
+        void IParameterized::printParameters()
+
+        """
+        return _libBornAgainCore.IParameterized_printParameters(self)
+
+
+    def registerParameter(self, name, parpointer):
+        """
+        registerParameter(IParameterized self, std::string const & name, double * parpointer) -> RealParameter
+
+        RealParameter & IParameterized::registerParameter(const std::string &name, double *parpointer)
+
+        """
+        return _libBornAgainCore.IParameterized_registerParameter(self, name, parpointer)
+
+
+    def setParameterValue(self, name, value):
+        """
+        setParameterValue(IParameterized self, std::string const & name, double value)
+
+        void IParameterized::setParameterValue(const std::string &name, double value)
+
+        """
+        return _libBornAgainCore.IParameterized_setParameterValue(self, name, value)
+
+
+    def getParameter(self, name):
+        """
+        getParameter(IParameterized self, std::string const & name) -> RealParameter
+
+        RealParameter * IParameterized::getParameter(const std::string &name) const
+
+        Returns parameter with given 'name'. 
+
+        """
+        return _libBornAgainCore.IParameterized_getParameter(self, name)
+
+
+    def onChange(self):
+        """onChange(IParameterized self)"""
+        return _libBornAgainCore.IParameterized_onChange(self)
+
+
+    def _print(self, ostr):
+        """_print(IParameterized self, std::ostream & ostr)"""
+        return _libBornAgainCore.IParameterized__print(self, ostr)
+
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_IParameterized(self)
+        return weakref_proxy(self)
+IParameterized_swigregister = _libBornAgainCore.IParameterized_swigregister
+IParameterized_swigregister(IParameterized)
+
+class kvector_t(_object):
+    """
+
+
+    Three-dimensional vector template, for use with integer, double, or complex components.
+
+    C++ includes: BasicVector3D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, kvector_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, kvector_t, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(BasicVector3D<(double)> self) -> kvector_t
+        __init__(BasicVector3D<(double)> self, double const x1, double const y1, double const z1) -> kvector_t
+
+        BasicVector3D< T >::BasicVector3D(const T x1, const T y1, const T z1)
+
+        Constructor from cartesian components. 
+
+        """
+        this = _libBornAgainCore.new_kvector_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def x(self):
+        """
+        x(kvector_t self) -> double
+
+        T BasicVector3D< T >::x() const
+
+        Returns x-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.kvector_t_x(self)
+
+
+    def y(self):
+        """
+        y(kvector_t self) -> double
+
+        T BasicVector3D< T >::y() const
+
+        Returns y-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.kvector_t_y(self)
+
+
+    def z(self):
+        """
+        z(kvector_t self) -> double
+
+        T BasicVector3D< T >::z() const
+
+        Returns z-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.kvector_t_z(self)
+
+
+    def setX(self, a):
+        """
+        setX(kvector_t self, double const & a)
+
+        void BasicVector3D< T >::setX(const T &a)
+
+        Sets x-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.kvector_t_setX(self, a)
+
+
+    def setY(self, a):
+        """
+        setY(kvector_t self, double const & a)
+
+        void BasicVector3D< T >::setY(const T &a)
+
+        Sets y-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.kvector_t_setY(self, a)
+
+
+    def setZ(self, a):
+        """
+        setZ(kvector_t self, double const & a)
+
+        void BasicVector3D< T >::setZ(const T &a)
+
+        Sets z-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.kvector_t_setZ(self, a)
+
+
+    def setXYZ(self, x1, y1, z1):
+        """
+        setXYZ(kvector_t self, double const & x1, double const & y1, double const & z1)
+
+        void BasicVector3D< T >::setXYZ(const T &x1, const T &y1, const T &z1)
+
+        Sets components in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.kvector_t_setXYZ(self, x1, y1, z1)
+
+
+    def __iadd__(self, v):
+        """__iadd__(kvector_t self, kvector_t v) -> kvector_t"""
+        return _libBornAgainCore.kvector_t___iadd__(self, v)
+
+
+    def __isub__(self, v):
+        """__isub__(kvector_t self, kvector_t v) -> kvector_t"""
+        return _libBornAgainCore.kvector_t___isub__(self, v)
+
+
+    def conj(self):
+        """
+        conj(kvector_t self) -> kvector_t
+
+        BasicVector3D< complex_t > BasicVector3D< complex_t >::conj() const
+
+        Returns complex conjugate vector. 
+
+        """
+        return _libBornAgainCore.kvector_t_conj(self)
+
+
+    def mag2(self):
+        """
+        mag2(kvector_t self) -> double
+
+        double BasicVector3D< T >::mag2() const
+
+        Returns squared magnitude squared of the vector. 
+
+        """
+        return _libBornAgainCore.kvector_t_mag2(self)
+
+
+    def mag(self):
+        """
+        mag(kvector_t self) -> double
+
+        double BasicVector3D< T >::mag() const
+
+        Returns magnitude of the vector. 
+
+        """
+        return _libBornAgainCore.kvector_t_mag(self)
+
+
+    def magxy2(self):
+        """
+        magxy2(kvector_t self) -> double
+
+        double BasicVector3D< T >::magxy2() const
+
+        Returns squared distance from z axis. 
+
+        """
+        return _libBornAgainCore.kvector_t_magxy2(self)
+
+
+    def magxy(self):
+        """
+        magxy(kvector_t self) -> double
+
+        double BasicVector3D< T >::magxy() const
+
+        Returns distance from z axis. 
+
+        """
+        return _libBornAgainCore.kvector_t_magxy(self)
+
+
+    def phi(self):
+        """
+        phi(kvector_t self) -> double
+
+        double BasicVector3D< T >::phi() const
+
+        Returns azimuth angle. 
+
+        """
+        return _libBornAgainCore.kvector_t_phi(self)
+
+
+    def theta(self):
+        """
+        theta(kvector_t self) -> double
+
+        double BasicVector3D< T >::theta() const
+
+        Returns polar angle. 
+
+        """
+        return _libBornAgainCore.kvector_t_theta(self)
+
+
+    def cosTheta(self):
+        """
+        cosTheta(kvector_t self) -> double
+
+        double BasicVector3D< T >::cosTheta() const
+
+        Returns cosine of polar angle. 
+
+        """
+        return _libBornAgainCore.kvector_t_cosTheta(self)
+
+
+    def sin2Theta(self):
+        """
+        sin2Theta(kvector_t self) -> double
+
+        double BasicVector3D< T >::sin2Theta() const
+
+        Returns squared sine of polar angle. 
+
+        """
+        return _libBornAgainCore.kvector_t_sin2Theta(self)
+
+
+    def unit(self):
+        """
+        unit(kvector_t self) -> kvector_t
+
+        BasicVector3D< complex_t > BasicVector3D< complex_t >::unit() const
+
+        """
+        return _libBornAgainCore.kvector_t_unit(self)
+
+
+    def complex(self):
+        """
+        complex(kvector_t self) -> cvector_t
+
+        BasicVector3D<std::complex<double> > BasicVector3D< T >::complex() const
+
+        Returns this, trivially converted to complex type. 
+
+        """
+        return _libBornAgainCore.kvector_t_complex(self)
+
+
+    def real(self):
+        """
+        real(kvector_t self) -> kvector_t
+
+        BasicVector3D< double > BasicVector3D< complex_t >::real() const
+
+        Returns real parts. 
+
+        """
+        return _libBornAgainCore.kvector_t_real(self)
+
+
+    def angle(self, v):
+        """
+        angle(kvector_t self, kvector_t v) -> double
+
+        double BasicVector3D< T >::angle(const BasicVector3D< T > &v) const
+
+        Returns angle with respect to another vector. 
+
+        """
+        return _libBornAgainCore.kvector_t_angle(self, v)
+
+
+    def project(self, v):
+        """
+        project(kvector_t self, kvector_t v) -> kvector_t
+
+        BasicVector3D<T> BasicVector3D< T >::project(const BasicVector3D< T > &v) const
+
+        Returns projection of this onto other vector: (this*v)*v/|v|^2. 
+
+        """
+        return _libBornAgainCore.kvector_t_project(self, v)
+
+
+    def __add__(self, rhs):
+        """__add__(kvector_t self, kvector_t rhs) -> kvector_t"""
+        return _libBornAgainCore.kvector_t___add__(self, rhs)
+
+
+    def __mul__(self, c):
+        """__mul__(kvector_t self, double c) -> kvector_t"""
+        return _libBornAgainCore.kvector_t___mul__(self, c)
+
+
+    def __rmul__(self, c):
+        """__rmul__(kvector_t self, double c) -> kvector_t"""
+        return _libBornAgainCore.kvector_t___rmul__(self, c)
+
+
+    def __neg__(self):
+        """__neg__(kvector_t self) -> kvector_t"""
+        return _libBornAgainCore.kvector_t___neg__(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_kvector_t
+    __del__ = lambda self: None
+kvector_t_swigregister = _libBornAgainCore.kvector_t_swigregister
+kvector_t_swigregister(kvector_t)
+
+class vector_kvector_t(_object):
+    """Proxy of C++ std::vector<(BasicVector3D<(double)>)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_kvector_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_kvector_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_kvector_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vector_kvector_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_kvector_t self) -> bool"""
+        return _libBornAgainCore.vector_kvector_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_kvector_t self) -> bool"""
+        return _libBornAgainCore.vector_kvector_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::size_type"""
+        return _libBornAgainCore.vector_kvector_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j) -> vector_kvector_t"""
+        return _libBornAgainCore.vector_kvector_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j)
+        __setslice__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j, vector_kvector_t v)
+        """
+        return _libBornAgainCore.vector_kvector_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j)"""
+        return _libBornAgainCore.vector_kvector_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i)
+        __delitem__(vector_kvector_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vector_kvector_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_kvector_t self, PySliceObject * slice) -> vector_kvector_t
+        __getitem__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i) -> kvector_t
+        """
+        return _libBornAgainCore.vector_kvector_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_kvector_t self, PySliceObject * slice, vector_kvector_t v)
+        __setitem__(vector_kvector_t self, PySliceObject * slice)
+        __setitem__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, kvector_t x)
+        """
+        return _libBornAgainCore.vector_kvector_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_kvector_t self) -> kvector_t"""
+        return _libBornAgainCore.vector_kvector_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_kvector_t self, kvector_t x)"""
+        return _libBornAgainCore.vector_kvector_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_kvector_t self) -> bool"""
+        return _libBornAgainCore.vector_kvector_t_empty(self)
+
+
+    def size(self):
+        """size(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::size_type"""
+        return _libBornAgainCore.vector_kvector_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vector_kvector_t self, vector_kvector_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vector_kvector_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::iterator"""
+        return _libBornAgainCore.vector_kvector_t_begin(self)
+
+
+    def end(self):
+        """end(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::iterator"""
+        return _libBornAgainCore.vector_kvector_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::reverse_iterator"""
+        return _libBornAgainCore.vector_kvector_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::reverse_iterator"""
+        return _libBornAgainCore.vector_kvector_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_kvector_t self)"""
+        return _libBornAgainCore.vector_kvector_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::allocator_type"""
+        return _libBornAgainCore.vector_kvector_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_kvector_t self)"""
+        return _libBornAgainCore.vector_kvector_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_kvector_t self, std::vector< BasicVector3D< double > >::iterator pos) -> std::vector< BasicVector3D< double > >::iterator
+        erase(vector_kvector_t self, std::vector< BasicVector3D< double > >::iterator first, std::vector< BasicVector3D< double > >::iterator last) -> std::vector< BasicVector3D< double > >::iterator
+        """
+        return _libBornAgainCore.vector_kvector_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(BasicVector3D<(double)>)> self) -> vector_kvector_t
+        __init__(std::vector<(BasicVector3D<(double)>)> self, vector_kvector_t arg2) -> vector_kvector_t
+        __init__(std::vector<(BasicVector3D<(double)>)> self, std::vector< BasicVector3D< double > >::size_type size) -> vector_kvector_t
+        __init__(std::vector<(BasicVector3D<(double)>)> self, std::vector< BasicVector3D< double > >::size_type size, kvector_t value) -> vector_kvector_t
+        """
+        this = _libBornAgainCore.new_vector_kvector_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_kvector_t self, kvector_t x)"""
+        return _libBornAgainCore.vector_kvector_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_kvector_t self) -> kvector_t"""
+        return _libBornAgainCore.vector_kvector_t_front(self)
+
+
+    def back(self):
+        """back(vector_kvector_t self) -> kvector_t"""
+        return _libBornAgainCore.vector_kvector_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_kvector_t self, std::vector< BasicVector3D< double > >::size_type n, kvector_t x)"""
+        return _libBornAgainCore.vector_kvector_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_kvector_t self, std::vector< BasicVector3D< double > >::size_type new_size)
+        resize(vector_kvector_t self, std::vector< BasicVector3D< double > >::size_type new_size, kvector_t x)
+        """
+        return _libBornAgainCore.vector_kvector_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_kvector_t self, std::vector< BasicVector3D< double > >::iterator pos, kvector_t x) -> std::vector< BasicVector3D< double > >::iterator
+        insert(vector_kvector_t self, std::vector< BasicVector3D< double > >::iterator pos, std::vector< BasicVector3D< double > >::size_type n, kvector_t x)
+        """
+        return _libBornAgainCore.vector_kvector_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_kvector_t self, std::vector< BasicVector3D< double > >::size_type n)"""
+        return _libBornAgainCore.vector_kvector_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::size_type"""
+        return _libBornAgainCore.vector_kvector_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vector_kvector_t
+    __del__ = lambda self: None
+vector_kvector_t_swigregister = _libBornAgainCore.vector_kvector_t_swigregister
+vector_kvector_t_swigregister(vector_kvector_t)
+
+class cvector_t(_object):
+    """
+
+
+    Three-dimensional vector template, for use with integer, double, or complex components.
+
+    C++ includes: BasicVector3D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, cvector_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, cvector_t, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(BasicVector3D<(std::complex<(double)>)> self) -> cvector_t
+        __init__(BasicVector3D<(std::complex<(double)>)> self, std::complex< double > const x1, std::complex< double > const y1, std::complex< double > const z1) -> cvector_t
+
+        BasicVector3D< T >::BasicVector3D(const T x1, const T y1, const T z1)
+
+        Constructor from cartesian components. 
+
+        """
+        this = _libBornAgainCore.new_cvector_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def x(self):
+        """
+        x(cvector_t self) -> std::complex< double >
+
+        T BasicVector3D< T >::x() const
+
+        Returns x-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.cvector_t_x(self)
+
+
+    def y(self):
+        """
+        y(cvector_t self) -> std::complex< double >
+
+        T BasicVector3D< T >::y() const
+
+        Returns y-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.cvector_t_y(self)
+
+
+    def z(self):
+        """
+        z(cvector_t self) -> std::complex< double >
+
+        T BasicVector3D< T >::z() const
+
+        Returns z-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.cvector_t_z(self)
+
+
+    def setX(self, a):
+        """
+        setX(cvector_t self, std::complex< double > const & a)
+
+        void BasicVector3D< T >::setX(const T &a)
+
+        Sets x-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.cvector_t_setX(self, a)
+
+
+    def setY(self, a):
+        """
+        setY(cvector_t self, std::complex< double > const & a)
+
+        void BasicVector3D< T >::setY(const T &a)
+
+        Sets y-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.cvector_t_setY(self, a)
+
+
+    def setZ(self, a):
+        """
+        setZ(cvector_t self, std::complex< double > const & a)
+
+        void BasicVector3D< T >::setZ(const T &a)
+
+        Sets z-component in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.cvector_t_setZ(self, a)
+
+
+    def setXYZ(self, x1, y1, z1):
+        """
+        setXYZ(cvector_t self, std::complex< double > const & x1, std::complex< double > const & y1, std::complex< double > const & z1)
+
+        void BasicVector3D< T >::setXYZ(const T &x1, const T &y1, const T &z1)
+
+        Sets components in cartesian coordinate system. 
+
+        """
+        return _libBornAgainCore.cvector_t_setXYZ(self, x1, y1, z1)
+
+
+    def __iadd__(self, v):
+        """__iadd__(cvector_t self, cvector_t v) -> cvector_t"""
+        return _libBornAgainCore.cvector_t___iadd__(self, v)
+
+
+    def __isub__(self, v):
+        """__isub__(cvector_t self, cvector_t v) -> cvector_t"""
+        return _libBornAgainCore.cvector_t___isub__(self, v)
+
+
+    def conj(self):
+        """
+        conj(cvector_t self) -> cvector_t
+
+        BasicVector3D< complex_t > BasicVector3D< complex_t >::conj() const
+
+        Returns complex conjugate vector. 
+
+        """
+        return _libBornAgainCore.cvector_t_conj(self)
+
+
+    def mag2(self):
+        """
+        mag2(cvector_t self) -> double
+
+        double BasicVector3D< T >::mag2() const
+
+        Returns squared magnitude squared of the vector. 
+
+        """
+        return _libBornAgainCore.cvector_t_mag2(self)
+
+
+    def mag(self):
+        """
+        mag(cvector_t self) -> double
+
+        double BasicVector3D< T >::mag() const
+
+        Returns magnitude of the vector. 
+
+        """
+        return _libBornAgainCore.cvector_t_mag(self)
+
+
+    def magxy2(self):
+        """
+        magxy2(cvector_t self) -> double
+
+        double BasicVector3D< T >::magxy2() const
+
+        Returns squared distance from z axis. 
+
+        """
+        return _libBornAgainCore.cvector_t_magxy2(self)
+
+
+    def magxy(self):
+        """
+        magxy(cvector_t self) -> double
+
+        double BasicVector3D< T >::magxy() const
+
+        Returns distance from z axis. 
+
+        """
+        return _libBornAgainCore.cvector_t_magxy(self)
+
+
+    def unit(self):
+        """
+        unit(cvector_t self) -> cvector_t
+
+        BasicVector3D< complex_t > BasicVector3D< complex_t >::unit() const
+
+        """
+        return _libBornAgainCore.cvector_t_unit(self)
+
+
+    def real(self):
+        """
+        real(cvector_t self) -> kvector_t
+
+        BasicVector3D< double > BasicVector3D< complex_t >::real() const
+
+        Returns real parts. 
+
+        """
+        return _libBornAgainCore.cvector_t_real(self)
+
+
+    def project(self, v):
+        """
+        project(cvector_t self, cvector_t v) -> cvector_t
+
+        BasicVector3D<T> BasicVector3D< T >::project(const BasicVector3D< T > &v) const
+
+        Returns projection of this onto other vector: (this*v)*v/|v|^2. 
+
+        """
+        return _libBornAgainCore.cvector_t_project(self, v)
+
+    __swig_destroy__ = _libBornAgainCore.delete_cvector_t
+    __del__ = lambda self: None
+cvector_t_swigregister = _libBornAgainCore.cvector_t_swigregister
+cvector_t_swigregister(cvector_t)
+
+class vector_cvector_t(_object):
+    """Proxy of C++ std::vector<(BasicVector3D<(std::complex<(double)>)>)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_cvector_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_cvector_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_cvector_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vector_cvector_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_cvector_t self) -> bool"""
+        return _libBornAgainCore.vector_cvector_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_cvector_t self) -> bool"""
+        return _libBornAgainCore.vector_cvector_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::size_type"""
+        return _libBornAgainCore.vector_cvector_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j) -> vector_cvector_t"""
+        return _libBornAgainCore.vector_cvector_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j)
+        __setslice__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j, vector_cvector_t v)
+        """
+        return _libBornAgainCore.vector_cvector_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j)"""
+        return _libBornAgainCore.vector_cvector_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i)
+        __delitem__(vector_cvector_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vector_cvector_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_cvector_t self, PySliceObject * slice) -> vector_cvector_t
+        __getitem__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i) -> cvector_t
+        """
+        return _libBornAgainCore.vector_cvector_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_cvector_t self, PySliceObject * slice, vector_cvector_t v)
+        __setitem__(vector_cvector_t self, PySliceObject * slice)
+        __setitem__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, cvector_t x)
+        """
+        return _libBornAgainCore.vector_cvector_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_cvector_t self) -> cvector_t"""
+        return _libBornAgainCore.vector_cvector_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_cvector_t self, cvector_t x)"""
+        return _libBornAgainCore.vector_cvector_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_cvector_t self) -> bool"""
+        return _libBornAgainCore.vector_cvector_t_empty(self)
+
+
+    def size(self):
+        """size(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::size_type"""
+        return _libBornAgainCore.vector_cvector_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vector_cvector_t self, vector_cvector_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vector_cvector_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::iterator"""
+        return _libBornAgainCore.vector_cvector_t_begin(self)
+
+
+    def end(self):
+        """end(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::iterator"""
+        return _libBornAgainCore.vector_cvector_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator"""
+        return _libBornAgainCore.vector_cvector_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator"""
+        return _libBornAgainCore.vector_cvector_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_cvector_t self)"""
+        return _libBornAgainCore.vector_cvector_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::allocator_type"""
+        return _libBornAgainCore.vector_cvector_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_cvector_t self)"""
+        return _libBornAgainCore.vector_cvector_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::iterator pos) -> std::vector< BasicVector3D< std::complex< double > > >::iterator
+        erase(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::iterator first, std::vector< BasicVector3D< std::complex< double > > >::iterator last) -> std::vector< BasicVector3D< std::complex< double > > >::iterator
+        """
+        return _libBornAgainCore.vector_cvector_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(BasicVector3D<(std::complex<(double)>)>)> self) -> vector_cvector_t
+        __init__(std::vector<(BasicVector3D<(std::complex<(double)>)>)> self, vector_cvector_t arg2) -> vector_cvector_t
+        __init__(std::vector<(BasicVector3D<(std::complex<(double)>)>)> self, std::vector< BasicVector3D< std::complex< double > > >::size_type size) -> vector_cvector_t
+        __init__(std::vector<(BasicVector3D<(std::complex<(double)>)>)> self, std::vector< BasicVector3D< std::complex< double > > >::size_type size, cvector_t value) -> vector_cvector_t
+        """
+        this = _libBornAgainCore.new_vector_cvector_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_cvector_t self, cvector_t x)"""
+        return _libBornAgainCore.vector_cvector_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_cvector_t self) -> cvector_t"""
+        return _libBornAgainCore.vector_cvector_t_front(self)
+
+
+    def back(self):
+        """back(vector_cvector_t self) -> cvector_t"""
+        return _libBornAgainCore.vector_cvector_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::size_type n, cvector_t x)"""
+        return _libBornAgainCore.vector_cvector_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::size_type new_size)
+        resize(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::size_type new_size, cvector_t x)
+        """
+        return _libBornAgainCore.vector_cvector_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::iterator pos, cvector_t x) -> std::vector< BasicVector3D< std::complex< double > > >::iterator
+        insert(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::iterator pos, std::vector< BasicVector3D< std::complex< double > > >::size_type n, cvector_t x)
+        """
+        return _libBornAgainCore.vector_cvector_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::size_type n)"""
+        return _libBornAgainCore.vector_cvector_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::size_type"""
+        return _libBornAgainCore.vector_cvector_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vector_cvector_t
+    __del__ = lambda self: None
+vector_cvector_t_swigregister = _libBornAgainCore.vector_cvector_t_swigregister
+vector_cvector_t_swigregister(vector_cvector_t)
+
+
+def mul_I(z):
+    """
+    mul_I(complex_t z) -> complex_t
+
+    complex_t mul_I(complex_t z)
+
+    Returns product I*z, where I is the imaginary unit. 
+
+    """
+    return _libBornAgainCore.mul_I(z)
+
+def exp_I(z):
+    """
+    exp_I(complex_t z) -> complex_t
+
+    complex_t exp_I(complex_t z)
+
+    Returns exp(I*z), where I is the imaginary unit. 
+
+    """
+    return _libBornAgainCore.exp_I(z)
+
+def rad2deg(angle):
+    """
+    rad2deg(double angle) -> double
+
+    double Units::rad2deg(double angle)
+
+    """
+    return _libBornAgainCore.rad2deg(angle)
+
+def deg2rad(angle):
+    """
+    deg2rad(double angle) -> double
+
+    double Units::deg2rad(double angle)
+
+    """
+    return _libBornAgainCore.deg2rad(angle)
+class WavevectorInfo(_object):
+    """
+
+
+    Holds all wavevector information relevant for calculating form factors.
+
+    C++ includes: WavevectorInfo.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, WavevectorInfo, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, WavevectorInfo, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(WavevectorInfo self) -> WavevectorInfo
+        __init__(WavevectorInfo self, cvector_t ki, cvector_t kf, double wavelength) -> WavevectorInfo
+        __init__(WavevectorInfo self, kvector_t ki, kvector_t kf, double wavelength) -> WavevectorInfo
+
+        WavevectorInfo::WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)
+
+        """
+        this = _libBornAgainCore.new_WavevectorInfo(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def getKi(self):
+        """
+        getKi(WavevectorInfo self) -> cvector_t
+
+        cvector_t WavevectorInfo::getKi() const 
+
+        """
+        return _libBornAgainCore.WavevectorInfo_getKi(self)
+
+
+    def getKf(self):
+        """
+        getKf(WavevectorInfo self) -> cvector_t
+
+        cvector_t WavevectorInfo::getKf() const 
+
+        """
+        return _libBornAgainCore.WavevectorInfo_getKf(self)
+
+
+    def getQ(self):
+        """
+        getQ(WavevectorInfo self) -> cvector_t
+
+        cvector_t WavevectorInfo::getQ() const 
+
+        """
+        return _libBornAgainCore.WavevectorInfo_getQ(self)
+
+
+    def getWavelength(self):
+        """
+        getWavelength(WavevectorInfo self) -> double
+
+        double WavevectorInfo::getWavelength() const 
+
+        """
+        return _libBornAgainCore.WavevectorInfo_getWavelength(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_WavevectorInfo
+    __del__ = lambda self: None
+WavevectorInfo_swigregister = _libBornAgainCore.WavevectorInfo_swigregister
+WavevectorInfo_swigregister(WavevectorInfo)
+nanometer = cvar.nanometer
+angstrom = cvar.angstrom
+micrometer = cvar.micrometer
+millimeter = cvar.millimeter
+meter = cvar.meter
+nm = cvar.nm
+radian = cvar.radian
+milliradian = cvar.milliradian
+degree = cvar.degree
+steradian = cvar.steradian
+rad = cvar.rad
+mrad = cvar.mrad
+sr = cvar.sr
+deg = cvar.deg
+tesla = cvar.tesla
+gauss = cvar.gauss
+
+class Beam(IParameterized):
+    """
+
+
+    Ideal collimated beam defined by wavelength, direction and intensity.
+
+    C++ includes: Beam.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Beam, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Beam, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Beam self) -> Beam
+        __init__(Beam self, Beam other) -> Beam
+
+        Beam::Beam(const Beam &other)
+
+        """
+        this = _libBornAgainCore.new_Beam(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_Beam
+    __del__ = lambda self: None
+
+    def getCentralK(self):
+        """
+        getCentralK(Beam self) -> kvector_t
+
+        kvector_t Beam::getCentralK() const
+
+        Returns the wavevector. 
+
+        """
+        return _libBornAgainCore.Beam_getCentralK(self)
+
+
+    def setCentralK(self, wavelength, alpha_i, phi_i):
+        """
+        setCentralK(Beam self, double wavelength, double alpha_i, double phi_i)
+
+        void Beam::setCentralK(double wavelength, double alpha_i, double phi_i)
+
+        Sets the wavevector in terms of wavelength and incoming angles. 
+
+        """
+        return _libBornAgainCore.Beam_setCentralK(self, wavelength, alpha_i, phi_i)
+
+
+    def getIntensity(self):
+        """
+        getIntensity(Beam self) -> double
+
+        double Beam::getIntensity() const
+
+        Returns the beam intensity in neutrons/sec. 
+
+        """
+        return _libBornAgainCore.Beam_getIntensity(self)
+
+
+    def setIntensity(self, intensity):
+        """
+        setIntensity(Beam self, double intensity)
+
+        void Beam::setIntensity(double intensity)
+
+        Sets the beam intensity in neutrons/sec. 
+
+        """
+        return _libBornAgainCore.Beam_setIntensity(self, intensity)
+
+
+    def setPolarization(self, bloch_vector):
+        """
+        setPolarization(Beam self, kvector_t bloch_vector)
+
+        void Beam::setPolarization(const kvector_t bloch_vector)
+
+        Sets the polarization density matrix according to the given Bloch vector. 
+
+        """
+        return _libBornAgainCore.Beam_setPolarization(self, bloch_vector)
+
+
+    def getWavelength(self):
+        """
+        getWavelength(Beam self) -> double
+
+        double Beam::getWavelength() const 
+
+        """
+        return _libBornAgainCore.Beam_getWavelength(self)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(Beam self) -> double
+
+        double Beam::getAlpha() const 
+
+        """
+        return _libBornAgainCore.Beam_getAlpha(self)
+
+
+    def getPhi(self):
+        """
+        getPhi(Beam self) -> double
+
+        double Beam::getPhi() const 
+
+        """
+        return _libBornAgainCore.Beam_getPhi(self)
+
+Beam_swigregister = _libBornAgainCore.Beam_swigregister
+Beam_swigregister(Beam)
+
+class Bin1D(_object):
+    """Proxy of C++ Bin1D class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Bin1D, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, Bin1D, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Bin1D self) -> Bin1D
+        __init__(Bin1D self, double lower, double upper) -> Bin1D
+
+        Bin1D::Bin1D(double lower, double upper)
+
+        """
+        this = _libBornAgainCore.new_Bin1D(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_setmethods__["m_lower"] = _libBornAgainCore.Bin1D_m_lower_set
+    __swig_getmethods__["m_lower"] = _libBornAgainCore.Bin1D_m_lower_get
+    if _newclass:
+        m_lower = _swig_property(_libBornAgainCore.Bin1D_m_lower_get, _libBornAgainCore.Bin1D_m_lower_set)
+    __swig_setmethods__["m_upper"] = _libBornAgainCore.Bin1D_m_upper_set
+    __swig_getmethods__["m_upper"] = _libBornAgainCore.Bin1D_m_upper_get
+    if _newclass:
+        m_upper = _swig_property(_libBornAgainCore.Bin1D_m_upper_get, _libBornAgainCore.Bin1D_m_upper_set)
+
+    def getMidPoint(self):
+        """
+        getMidPoint(Bin1D self) -> double
+
+        double Bin1D::getMidPoint() const 
+
+        """
+        return _libBornAgainCore.Bin1D_getMidPoint(self)
+
+
+    def getBinSize(self):
+        """
+        getBinSize(Bin1D self) -> double
+
+        double Bin1D::getBinSize() const 
+
+        """
+        return _libBornAgainCore.Bin1D_getBinSize(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_Bin1D
+    __del__ = lambda self: None
+Bin1D_swigregister = _libBornAgainCore.Bin1D_swigregister
+Bin1D_swigregister(Bin1D)
+
+
+def BinContains(bin, value):
+    """
+    BinContains(Bin1D bin, double value) -> bool
+
+    bool BinContains(const Bin1D &bin, double value)
+
+    Checks if value is contained in bin: value in [m_lower, m_upper) 
+
+    """
+    return _libBornAgainCore.BinContains(bin, value)
+class Bin1DKVector(_object):
+    """
+
+
+    An one-dimensional range of kvector_t's.
+
+    C++ includes: Bin.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Bin1DKVector, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, Bin1DKVector, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Bin1DKVector self) -> Bin1DKVector
+        __init__(Bin1DKVector self, kvector_t lower, kvector_t upper) -> Bin1DKVector
+        __init__(Bin1DKVector self, double wavelength, Bin1D alpha_bin, Bin1D phi_bin) -> Bin1DKVector
+
+        Bin1DKVector::Bin1DKVector(double wavelength, const Bin1D &alpha_bin, const Bin1D &phi_bin)
+
+        creation on  Bin1DKVector from alpha and phi bins 
+
+        """
+        this = _libBornAgainCore.new_Bin1DKVector(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def getMidPoint(self):
+        """
+        getMidPoint(Bin1DKVector self) -> kvector_t
+
+        kvector_t Bin1DKVector::getMidPoint() const 
+
+        """
+        return _libBornAgainCore.Bin1DKVector_getMidPoint(self)
+
+
+    def getDelta(self):
+        """
+        getDelta(Bin1DKVector self) -> kvector_t
+
+        kvector_t Bin1DKVector::getDelta() const 
+
+        """
+        return _libBornAgainCore.Bin1DKVector_getDelta(self)
+
+    __swig_setmethods__["m_q_lower"] = _libBornAgainCore.Bin1DKVector_m_q_lower_set
+    __swig_getmethods__["m_q_lower"] = _libBornAgainCore.Bin1DKVector_m_q_lower_get
+    if _newclass:
+        m_q_lower = _swig_property(_libBornAgainCore.Bin1DKVector_m_q_lower_get, _libBornAgainCore.Bin1DKVector_m_q_lower_set)
+    __swig_setmethods__["m_q_upper"] = _libBornAgainCore.Bin1DKVector_m_q_upper_set
+    __swig_getmethods__["m_q_upper"] = _libBornAgainCore.Bin1DKVector_m_q_upper_get
+    if _newclass:
+        m_q_upper = _swig_property(_libBornAgainCore.Bin1DKVector_m_q_upper_get, _libBornAgainCore.Bin1DKVector_m_q_upper_set)
+    __swig_destroy__ = _libBornAgainCore.delete_Bin1DKVector
+    __del__ = lambda self: None
+Bin1DKVector_swigregister = _libBornAgainCore.Bin1DKVector_swigregister
+Bin1DKVector_swigregister(Bin1DKVector)
+
+class Bin1DCVector(_object):
+    """
+
+
+    An one-dimensional range of cvector_t's.
+
+    C++ includes: Bin.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Bin1DCVector, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, Bin1DCVector, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Bin1DCVector self) -> Bin1DCVector
+        __init__(Bin1DCVector self, cvector_t lower, cvector_t upper) -> Bin1DCVector
+        __init__(Bin1DCVector self, double wavelength, Bin1D alpha_bin, Bin1D phi_bin) -> Bin1DCVector
+
+        Bin1DCVector::Bin1DCVector(double wavelength, const Bin1D &alpha_bin, const Bin1D &phi_bin)
+
+        creation on  Bin1DCVector from alpha and phi bins 
+
+        """
+        this = _libBornAgainCore.new_Bin1DCVector(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def getMidPoint(self):
+        """
+        getMidPoint(Bin1DCVector self) -> cvector_t
+
+        cvector_t Bin1DCVector::getMidPoint() const 
+
+        """
+        return _libBornAgainCore.Bin1DCVector_getMidPoint(self)
+
+
+    def getDelta(self):
+        """
+        getDelta(Bin1DCVector self) -> cvector_t
+
+        cvector_t Bin1DCVector::getDelta() const 
+
+        """
+        return _libBornAgainCore.Bin1DCVector_getDelta(self)
+
+    __swig_setmethods__["m_q_lower"] = _libBornAgainCore.Bin1DCVector_m_q_lower_set
+    __swig_getmethods__["m_q_lower"] = _libBornAgainCore.Bin1DCVector_m_q_lower_get
+    if _newclass:
+        m_q_lower = _swig_property(_libBornAgainCore.Bin1DCVector_m_q_lower_get, _libBornAgainCore.Bin1DCVector_m_q_lower_set)
+    __swig_setmethods__["m_q_upper"] = _libBornAgainCore.Bin1DCVector_m_q_upper_set
+    __swig_getmethods__["m_q_upper"] = _libBornAgainCore.Bin1DCVector_m_q_upper_get
+    if _newclass:
+        m_q_upper = _swig_property(_libBornAgainCore.Bin1DCVector_m_q_upper_get, _libBornAgainCore.Bin1DCVector_m_q_upper_set)
+    __swig_destroy__ = _libBornAgainCore.delete_Bin1DCVector
+    __del__ = lambda self: None
+Bin1DCVector_swigregister = _libBornAgainCore.Bin1DCVector_swigregister
+Bin1DCVector_swigregister(Bin1DCVector)
+
+class IAxis(_object):
+    """
+
+
+    Interface for one-dimensional axes.
+
+    C++ includes: IAxis.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IAxis, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IAxis, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(IAxis self) -> IAxis
+
+        virtual IAxis* IAxis::clone() const =0
+
+        clone function 
+
+        """
+        return _libBornAgainCore.IAxis_clone(self)
+
+
+    def createDoubleBinSize(self):
+        """
+        createDoubleBinSize(IAxis self) -> IAxis
+
+        IAxis * IAxis::createDoubleBinSize() const
+
+        Creates a new axis with half the number of bins. 
+
+        """
+        return _libBornAgainCore.IAxis_createDoubleBinSize(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IAxis
+    __del__ = lambda self: None
+
+    def size(self):
+        """
+        size(IAxis self) -> size_t
+
+        virtual size_t IAxis::size() const =0
+
+        retrieve the number of bins 
+
+        """
+        return _libBornAgainCore.IAxis_size(self)
+
+
+    def getName(self):
+        """
+        getName(IAxis self) -> std::string
+
+        std::string IAxis::getName() const
+
+        retrieve the label of the axis 
+
+        """
+        return _libBornAgainCore.IAxis_getName(self)
+
+
+    def setName(self, name):
+        """
+        setName(IAxis self, std::string name)
+
+        void IAxis::setName(std::string name)
+
+        Sets the axis label. 
+
+        """
+        return _libBornAgainCore.IAxis_setName(self, name)
+
+
+    def getBin(self, index):
+        """
+        getBin(IAxis self, size_t index) -> Bin1D
+
+        virtual Bin1D IAxis::getBin(size_t index) const =0
+
+        retrieve a 1d bin for the given index 
+
+        """
+        return _libBornAgainCore.IAxis_getBin(self, index)
+
+
+    def getMin(self):
+        """
+        getMin(IAxis self) -> double
+
+        virtual double IAxis::getMin() const =0
+
+        Returns value of first point of axis. 
+
+        """
+        return _libBornAgainCore.IAxis_getMin(self)
+
+
+    def getMax(self):
+        """
+        getMax(IAxis self) -> double
+
+        virtual double IAxis::getMax() const =0
+
+        Returns value of last point of axis. 
+
+        """
+        return _libBornAgainCore.IAxis_getMax(self)
+
+
+    def getBinCenter(self, index):
+        """
+        getBinCenter(IAxis self, size_t index) -> double
+
+        virtual double IAxis::getBinCenter(size_t index) const =0
+
+        """
+        return _libBornAgainCore.IAxis_getBinCenter(self, index)
+
+
+    def findClosestIndex(self, value):
+        """
+        findClosestIndex(IAxis self, double value) -> size_t
+
+        virtual size_t IAxis::findClosestIndex(double value) const =0
+
+        find bin index which is best match for given value 
+
+        """
+        return _libBornAgainCore.IAxis_findClosestIndex(self, value)
+
+
+    def findIndex(self, value):
+        """
+        findIndex(IAxis self, double value) -> size_t
+
+        size_t IAxis::findIndex(double value) const
+
+        find index of bin that contains the given value returns  size() when value is not found 
+
+        """
+        return _libBornAgainCore.IAxis_findIndex(self, value)
+
+
+    def __eq__(self, right):
+        """__eq__(IAxis self, IAxis right) -> bool"""
+        return _libBornAgainCore.IAxis___eq__(self, right)
+
+
+    def __ne__(self, right):
+        """__ne__(IAxis self, IAxis right) -> bool"""
+        return _libBornAgainCore.IAxis___ne__(self, right)
+
+
+    def getBinCenters(self):
+        """
+        getBinCenters(IAxis self) -> vdouble1d_t
+
+        std::vector< double > IAxis::getBinCenters() const 
+
+        """
+        return _libBornAgainCore.IAxis_getBinCenters(self)
+
+
+    def getBinBoundaries(self):
+        """
+        getBinBoundaries(IAxis self) -> vdouble1d_t
+
+        std::vector< double > IAxis::getBinBoundaries() const 
+
+        """
+        return _libBornAgainCore.IAxis_getBinBoundaries(self)
+
+
+    def createClippedAxis(self, left, right):
+        """
+        createClippedAxis(IAxis self, double left, double right) -> IAxis
+
+        IAxis * IAxis::createClippedAxis(double left, double right) const
+
+        Creates a new clipped axis. 
+
+        """
+        return _libBornAgainCore.IAxis_createClippedAxis(self, left, right)
+
+
+    def contains(self, value):
+        """
+        contains(IAxis self, double value) -> bool
+
+        bool IAxis::contains(double value) const
+
+        Returns true if axis contains given point. 
+
+        """
+        return _libBornAgainCore.IAxis_contains(self, value)
+
+IAxis_swigregister = _libBornAgainCore.IAxis_swigregister
+IAxis_swigregister(IAxis)
+
+
+def HaveSameNameAndShape(left, right):
+    """
+    HaveSameNameAndShape(IAxis left, IAxis right) -> bool
+
+    bool HaveSameNameAndShape(const IAxis &left, const IAxis &right)
+
+    global helper function for comparison of axes 
+
+    """
+    return _libBornAgainCore.HaveSameNameAndShape(left, right)
+class VariableBinAxis(IAxis):
+    """
+
+
+    Axis with variable bin size.
+
+    C++ includes: VariableBinAxis.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IAxis]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, VariableBinAxis, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IAxis]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, VariableBinAxis, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, name, nbins, bin_boundaries):
+        """
+        __init__(VariableBinAxis self, std::string const & name, size_t nbins, vdouble1d_t bin_boundaries) -> VariableBinAxis
+
+        VariableBinAxis::VariableBinAxis(const std::string &name, size_t nbins, const std::vector< double > &bin_boundaries)
+
+        VariableBinAxis constructor.
+
+        Parameters:
+        -----------
+
+        name: 
+        Axis name
+
+        nbins: 
+        number of bins
+
+        bin_boundaries: 
+        Array of size nbins+1 containing low-edges for each bin and upper edge of last bin. 
+
+        """
+        this = _libBornAgainCore.new_VariableBinAxis(name, nbins, bin_boundaries)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_VariableBinAxis
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(VariableBinAxis self) -> VariableBinAxis
+
+        VariableBinAxis * VariableBinAxis::clone() const
+
+        clone function 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_clone(self)
+
+
+    def size(self):
+        """
+        size(VariableBinAxis self) -> size_t
+
+        size_t VariableBinAxis::size() const
+
+        retrieve the number of bins 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_size(self)
+
+
+    def getBin(self, index):
+        """
+        getBin(VariableBinAxis self, size_t index) -> Bin1D
+
+        Bin1D VariableBinAxis::getBin(size_t index) const
+
+        retrieve a 1d bin for the given index 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_getBin(self, index)
+
+
+    def getMin(self):
+        """
+        getMin(VariableBinAxis self) -> double
+
+        double VariableBinAxis::getMin() const
+
+        Returns value of first point of axis. 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_getMin(self)
+
+
+    def getMax(self):
+        """
+        getMax(VariableBinAxis self) -> double
+
+        double VariableBinAxis::getMax() const
+
+        Returns value of last point of axis. 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_getMax(self)
+
+
+    def getBinCenter(self, index):
+        """
+        getBinCenter(VariableBinAxis self, size_t index) -> double
+
+        double VariableBinAxis::getBinCenter(size_t index) const 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_getBinCenter(self, index)
+
+
+    def findClosestIndex(self, value):
+        """
+        findClosestIndex(VariableBinAxis self, double value) -> size_t
+
+        size_t VariableBinAxis::findClosestIndex(double value) const
+
+        find bin index which is best match for given value 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_findClosestIndex(self, value)
+
+
+    def getBinCenters(self):
+        """
+        getBinCenters(VariableBinAxis self) -> vdouble1d_t
+
+        std::vector< double > VariableBinAxis::getBinCenters() const 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_getBinCenters(self)
+
+
+    def getBinBoundaries(self):
+        """
+        getBinBoundaries(VariableBinAxis self) -> vdouble1d_t
+
+        std::vector<double> VariableBinAxis::getBinBoundaries() const 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_getBinBoundaries(self)
+
+
+    def createClippedAxis(self, left, right):
+        """
+        createClippedAxis(VariableBinAxis self, double left, double right) -> VariableBinAxis
+
+        VariableBinAxis * VariableBinAxis::createClippedAxis(double left, double right) const
+
+        Creates a new clipped axis. 
+
+        """
+        return _libBornAgainCore.VariableBinAxis_createClippedAxis(self, left, right)
+
+
+    def __getitem__(self, i):
+        """__getitem__(VariableBinAxis self, unsigned int i) -> double"""
+        return _libBornAgainCore.VariableBinAxis___getitem__(self, i)
+
+VariableBinAxis_swigregister = _libBornAgainCore.VariableBinAxis_swigregister
+VariableBinAxis_swigregister(VariableBinAxis)
+
+class ConstKBinAxis(VariableBinAxis):
+    """
+
+
+    Axis with fixed bin size in sin(angle) space.
+
+    C++ includes: ConstKBinAxis.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [VariableBinAxis]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ConstKBinAxis, name, value)
+    __swig_getmethods__ = {}
+    for _s in [VariableBinAxis]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ConstKBinAxis, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, name, nbins, start, end):
+        """
+        __init__(ConstKBinAxis self, std::string const & name, size_t nbins, double start, double end) -> ConstKBinAxis
+
+        ConstKBinAxis::ConstKBinAxis(const std::string &name, size_t nbins, double start, double end)
+
+        ConstKBinAxis constructor.
+
+        Parameters:
+        -----------
+
+        name: 
+        Axis name
+
+        nbins: 
+        number of bins
+
+        start: 
+        low edge of first bin
+
+        end: 
+        upper edge of last bin 
+
+        """
+        this = _libBornAgainCore.new_ConstKBinAxis(name, nbins, start, end)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ConstKBinAxis
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ConstKBinAxis self) -> ConstKBinAxis
+
+        ConstKBinAxis * ConstKBinAxis::clone() const
+
+        clone function 
+
+        """
+        return _libBornAgainCore.ConstKBinAxis_clone(self)
+
+
+    def createClippedAxis(self, left, right):
+        """
+        createClippedAxis(ConstKBinAxis self, double left, double right) -> ConstKBinAxis
+
+        ConstKBinAxis * ConstKBinAxis::createClippedAxis(double left, double right) const
+
+        Creates a new clipped axis. 
+
+        """
+        return _libBornAgainCore.ConstKBinAxis_createClippedAxis(self, left, right)
+
+ConstKBinAxis_swigregister = _libBornAgainCore.ConstKBinAxis_swigregister
+ConstKBinAxis_swigregister(ConstKBinAxis)
+
+class CustomBinAxis(VariableBinAxis):
+    """
+
+
+    Axis with fixed bin size in sin(angle) space used for numerical comparison with IsGisaxs. The main feature of the axis is that it produces zero bin sizes.
+
+    C++ includes: CustomBinAxis.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [VariableBinAxis]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, CustomBinAxis, name, value)
+    __swig_getmethods__ = {}
+    for _s in [VariableBinAxis]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, CustomBinAxis, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, name, nbins, start, end):
+        """
+        __init__(CustomBinAxis self, std::string const & name, size_t nbins, double start, double end) -> CustomBinAxis
+
+        CustomBinAxis::CustomBinAxis(const std::string &name, size_t nbins, double start, double end)
+
+        CustomBinAxis constructor.
+
+        Parameters:
+        -----------
+
+        name: 
+        Axis name
+
+        nbins: 
+        number of bins
+
+        start: 
+        center of first bin (IsGisaxs convention)
+
+        end: 
+        center of last bin (IsGisaxs convention) 
+
+        """
+        this = _libBornAgainCore.new_CustomBinAxis(name, nbins, start, end)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_CustomBinAxis
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(CustomBinAxis self) -> CustomBinAxis
+
+        CustomBinAxis * CustomBinAxis::clone() const
+
+        clone function 
+
+        """
+        return _libBornAgainCore.CustomBinAxis_clone(self)
+
+
+    def getBin(self, index):
+        """
+        getBin(CustomBinAxis self, size_t index) -> Bin1D
+
+        Bin1D CustomBinAxis::getBin(size_t index) const
+
+        retrieve a 1d bin for the given index 
+
+        """
+        return _libBornAgainCore.CustomBinAxis_getBin(self, index)
+
+
+    def getBinCenters(self):
+        """
+        getBinCenters(CustomBinAxis self) -> vdouble1d_t
+
+        std::vector< double > CustomBinAxis::getBinCenters() const 
+
+        """
+        return _libBornAgainCore.CustomBinAxis_getBinCenters(self)
+
+
+    def createClippedAxis(self, left, right):
+        """
+        createClippedAxis(CustomBinAxis self, double left, double right) -> CustomBinAxis
+
+        CustomBinAxis * CustomBinAxis::createClippedAxis(double left, double right) const
+
+        Creates a new clipped axis. 
+
+        """
+        return _libBornAgainCore.CustomBinAxis_createClippedAxis(self, left, right)
+
+CustomBinAxis_swigregister = _libBornAgainCore.CustomBinAxis_swigregister
+CustomBinAxis_swigregister(CustomBinAxis)
+
+class IShape2D(ICloneable, INamed):
+    """
+
+
+    Basic class for all shapes in 2D.
+
+    C++ includes: IShape2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICloneable, INamed]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IShape2D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICloneable, INamed]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IShape2D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(IShape2D self) -> IShape2D
+
+        virtual IShape2D* Geometry::IShape2D::clone() const =0
+
+        """
+        return _libBornAgainCore.IShape2D_clone(self)
+
+
+    def contains(self, *args):
+        """
+        contains(IShape2D self, double x, double y) -> bool
+        contains(IShape2D self, Bin1D binx, Bin1D biny) -> bool
+
+        virtual bool Geometry::IShape2D::contains(const Bin1D &binx, const Bin1D &biny) const =0
+
+        Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+
+        """
+        return _libBornAgainCore.IShape2D_contains(self, *args)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IShape2D
+    __del__ = lambda self: None
+IShape2D_swigregister = _libBornAgainCore.IShape2D_swigregister
+IShape2D_swigregister(IShape2D)
+
+class ISample(ICloneable, IParameterized):
+    """
+
+
+    Pure virtual base class for sample components and properties related to scattering.
+
+    Inherited by  ICompositeSample,  IFormFactor,  IInterferenceFunction,  IRoughness,  IRotation. So it is much more basic and abstract than the name "ISample" suggests.
+
+    Since  ICompositeSample contains a vector of  ISample's, we provide here some machinery for iterating through a tree (getMaterial, containedMaterials, containedSubclasses, ..). The functions getChildren and size, completely trivial here, become meaningful through their overloads in  ICompositeSample.
+
+    C++ includes: ISample.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ISample, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ISample, name)
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(ISample self) -> ISample
+
+        ISample* ISample::clone() const override=0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.ISample_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(ISample self) -> ISample
+
+        ISample * ISample::cloneInvertB() const
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.ISample_cloneInvertB(self)
+
+
+    def accept(self, p_visitor):
+        """
+        accept(ISample self, ISampleVisitor p_visitor)
+
+        virtual void ISample::accept(ISampleVisitor *p_visitor) const =0
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.ISample_accept(self, p_visitor)
+
+
+    def to_str(self, indent=0):
+        """
+        to_str(ISample self, int indent=0) -> std::string
+        to_str(ISample self) -> std::string
+
+        std::string ISample::to_str(int indent=0) const
+
+        Returns textual representation of this and its descendants. 
+
+        """
+        return _libBornAgainCore.ISample_to_str(self, indent)
+
+
+    def getMaterial(self):
+        """
+        getMaterial(ISample self) -> IMaterial
+
+        virtual const IMaterial* ISample::getMaterial() const
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.ISample_getMaterial(self)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(ISample self) -> IMaterial
+
+        virtual const IMaterial* ISample::getAmbientMaterial() const
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.ISample_getAmbientMaterial(self)
+
+
+    def containedMaterials(self):
+        """
+        containedMaterials(ISample self) -> std::vector< IMaterial const *,std::allocator< IMaterial const * > >
+
+        std::vector< const IMaterial * > ISample::containedMaterials() const
+
+        Returns set of unique materials contained in this  ISample. 
+
+        """
+        return _libBornAgainCore.ISample_containedMaterials(self)
+
+
+    def getChildren(self):
+        """
+        getChildren(ISample self) -> swig_dummy_type_const_isample_vector
+
+        virtual std::vector<const ISample*> ISample::getChildren() const
+
+        Returns a vector of children. 
+
+        """
+        return _libBornAgainCore.ISample_getChildren(self)
+
+
+    def size(self):
+        """
+        size(ISample self) -> size_t
+
+        virtual size_t ISample::size() const
+
+        Returns number of children. 
+
+        """
+        return _libBornAgainCore.ISample_size(self)
+
+
+    def __init__(self):
+        """
+        __init__(ISample self) -> ISample
+
+
+
+        Pure virtual base class for sample components and properties related to scattering.
+
+        Inherited by  ICompositeSample,  IFormFactor,  IInterferenceFunction,  IRoughness,  IRotation. So it is much more basic and abstract than the name "ISample" suggests.
+
+        Since  ICompositeSample contains a vector of  ISample's, we provide here some machinery for iterating through a tree (getMaterial, containedMaterials, containedSubclasses, ..). The functions getChildren and size, completely trivial here, become meaningful through their overloads in  ICompositeSample.
+
+        C++ includes: ISample.h
+
+        """
+        if self.__class__ == ISample:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_ISample(_self, )
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ISample
+    __del__ = lambda self: None
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_ISample(self)
+        return weakref_proxy(self)
+
+    def onChange(self):
+        """onChange(ISample self)"""
+        return _libBornAgainCore.ISample_onChange(self)
+
+
+    def _print(self, ostr):
+        """_print(ISample self, std::ostream & ostr)"""
+        return _libBornAgainCore.ISample__print(self, ostr)
+
+ISample_swigregister = _libBornAgainCore.ISample_swigregister
+ISample_swigregister(ISample)
+
+class swig_dummy_type_isample_vector(_object):
+    """Proxy of C++ std::vector<(p.ISample)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, swig_dummy_type_isample_vector, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, swig_dummy_type_isample_vector, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(swig_dummy_type_isample_vector self) -> SwigPyIterator"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(swig_dummy_type_isample_vector self) -> bool"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(swig_dummy_type_isample_vector self) -> bool"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector___bool__(self)
+
+
+    def __len__(self):
+        """__len__(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::size_type"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j) -> swig_dummy_type_isample_vector"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j)
+        __setslice__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j, swig_dummy_type_isample_vector v)
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j)"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i)
+        __delitem__(swig_dummy_type_isample_vector self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(swig_dummy_type_isample_vector self, PySliceObject * slice) -> swig_dummy_type_isample_vector
+        __getitem__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i) -> ISample
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(swig_dummy_type_isample_vector self, PySliceObject * slice, swig_dummy_type_isample_vector v)
+        __setitem__(swig_dummy_type_isample_vector self, PySliceObject * slice)
+        __setitem__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, ISample x)
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(swig_dummy_type_isample_vector self) -> ISample"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_pop(self)
+
+
+    def append(self, x):
+        """append(swig_dummy_type_isample_vector self, ISample x)"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_append(self, x)
+
+
+    def empty(self):
+        """empty(swig_dummy_type_isample_vector self) -> bool"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_empty(self)
+
+
+    def size(self):
+        """size(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::size_type"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(swig_dummy_type_isample_vector self, swig_dummy_type_isample_vector v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector_swap(self, v)
+
+
+    def begin(self):
+        """begin(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::iterator"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_begin(self)
+
+
+    def end(self):
+        """end(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::iterator"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_end(self)
+
+
+    def rbegin(self):
+        """rbegin(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::reverse_iterator"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_rbegin(self)
+
+
+    def rend(self):
+        """rend(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::reverse_iterator"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_rend(self)
+
+
+    def clear(self):
+        """clear(swig_dummy_type_isample_vector self)"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::allocator_type"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(swig_dummy_type_isample_vector self)"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(swig_dummy_type_isample_vector self, std::vector< ISample * >::iterator pos) -> std::vector< ISample * >::iterator
+        erase(swig_dummy_type_isample_vector self, std::vector< ISample * >::iterator first, std::vector< ISample * >::iterator last) -> std::vector< ISample * >::iterator
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(p.ISample)> self) -> swig_dummy_type_isample_vector
+        __init__(std::vector<(p.ISample)> self, swig_dummy_type_isample_vector arg2) -> swig_dummy_type_isample_vector
+        __init__(std::vector<(p.ISample)> self, std::vector< ISample * >::size_type size) -> swig_dummy_type_isample_vector
+        __init__(std::vector<(p.ISample)> self, std::vector< ISample * >::size_type size, ISample value) -> swig_dummy_type_isample_vector
+        """
+        this = _libBornAgainCore.new_swig_dummy_type_isample_vector(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(swig_dummy_type_isample_vector self, ISample x)"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_push_back(self, x)
+
+
+    def front(self):
+        """front(swig_dummy_type_isample_vector self) -> ISample"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_front(self)
+
+
+    def back(self):
+        """back(swig_dummy_type_isample_vector self) -> ISample"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_back(self)
+
+
+    def assign(self, n, x):
+        """assign(swig_dummy_type_isample_vector self, std::vector< ISample * >::size_type n, ISample x)"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(swig_dummy_type_isample_vector self, std::vector< ISample * >::size_type new_size)
+        resize(swig_dummy_type_isample_vector self, std::vector< ISample * >::size_type new_size, ISample x)
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(swig_dummy_type_isample_vector self, std::vector< ISample * >::iterator pos, ISample x) -> std::vector< ISample * >::iterator
+        insert(swig_dummy_type_isample_vector self, std::vector< ISample * >::iterator pos, std::vector< ISample * >::size_type n, ISample x)
+        """
+        return _libBornAgainCore.swig_dummy_type_isample_vector_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(swig_dummy_type_isample_vector self, std::vector< ISample * >::size_type n)"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::size_type"""
+        return _libBornAgainCore.swig_dummy_type_isample_vector_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_swig_dummy_type_isample_vector
+    __del__ = lambda self: None
+swig_dummy_type_isample_vector_swigregister = _libBornAgainCore.swig_dummy_type_isample_vector_swigregister
+swig_dummy_type_isample_vector_swigregister(swig_dummy_type_isample_vector)
+
+class swig_dummy_type_const_isample_vector(_object):
+    """Proxy of C++ std::vector<(p.q(const).ISample)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, swig_dummy_type_const_isample_vector, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, swig_dummy_type_const_isample_vector, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(swig_dummy_type_const_isample_vector self) -> SwigPyIterator"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(swig_dummy_type_const_isample_vector self) -> bool"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(swig_dummy_type_const_isample_vector self) -> bool"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___bool__(self)
+
+
+    def __len__(self):
+        """__len__(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::size_type"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j) -> swig_dummy_type_const_isample_vector"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j)
+        __setslice__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j, swig_dummy_type_const_isample_vector v)
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j)"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i)
+        __delitem__(swig_dummy_type_const_isample_vector self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(swig_dummy_type_const_isample_vector self, PySliceObject * slice) -> swig_dummy_type_const_isample_vector
+        __getitem__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i) -> ISample
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(swig_dummy_type_const_isample_vector self, PySliceObject * slice, swig_dummy_type_const_isample_vector v)
+        __setitem__(swig_dummy_type_const_isample_vector self, PySliceObject * slice)
+        __setitem__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, ISample x)
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(swig_dummy_type_const_isample_vector self) -> ISample"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_pop(self)
+
+
+    def append(self, x):
+        """append(swig_dummy_type_const_isample_vector self, ISample x)"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_append(self, x)
+
+
+    def empty(self):
+        """empty(swig_dummy_type_const_isample_vector self) -> bool"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_empty(self)
+
+
+    def size(self):
+        """size(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::size_type"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(swig_dummy_type_const_isample_vector self, swig_dummy_type_const_isample_vector v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_swap(self, v)
+
+
+    def begin(self):
+        """begin(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::iterator"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_begin(self)
+
+
+    def end(self):
+        """end(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::iterator"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_end(self)
+
+
+    def rbegin(self):
+        """rbegin(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::reverse_iterator"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_rbegin(self)
+
+
+    def rend(self):
+        """rend(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::reverse_iterator"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_rend(self)
+
+
+    def clear(self):
+        """clear(swig_dummy_type_const_isample_vector self)"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::allocator_type"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(swig_dummy_type_const_isample_vector self)"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::iterator pos) -> std::vector< ISample const * >::iterator
+        erase(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::iterator first, std::vector< ISample const * >::iterator last) -> std::vector< ISample const * >::iterator
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(p.q(const).ISample)> self) -> swig_dummy_type_const_isample_vector
+        __init__(std::vector<(p.q(const).ISample)> self, swig_dummy_type_const_isample_vector arg2) -> swig_dummy_type_const_isample_vector
+        __init__(std::vector<(p.q(const).ISample)> self, std::vector< ISample const * >::size_type size) -> swig_dummy_type_const_isample_vector
+        __init__(std::vector<(p.q(const).ISample)> self, std::vector< ISample const * >::size_type size, ISample value) -> swig_dummy_type_const_isample_vector
+        """
+        this = _libBornAgainCore.new_swig_dummy_type_const_isample_vector(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(swig_dummy_type_const_isample_vector self, ISample x)"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_push_back(self, x)
+
+
+    def front(self):
+        """front(swig_dummy_type_const_isample_vector self) -> ISample"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_front(self)
+
+
+    def back(self):
+        """back(swig_dummy_type_const_isample_vector self) -> ISample"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_back(self)
+
+
+    def assign(self, n, x):
+        """assign(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::size_type n, ISample x)"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::size_type new_size)
+        resize(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::size_type new_size, ISample x)
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::iterator pos, ISample x) -> std::vector< ISample const * >::iterator
+        insert(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::iterator pos, std::vector< ISample const * >::size_type n, ISample x)
+        """
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::size_type n)"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::size_type"""
+        return _libBornAgainCore.swig_dummy_type_const_isample_vector_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_swig_dummy_type_const_isample_vector
+    __del__ = lambda self: None
+swig_dummy_type_const_isample_vector_swigregister = _libBornAgainCore.swig_dummy_type_const_isample_vector_swigregister
+swig_dummy_type_const_isample_vector_swigregister(swig_dummy_type_const_isample_vector)
+
+class IChiSquaredModule(ICloneable):
+    """
+
+
+    Interface for  ChiSquaredModule for chi2 calculations.
+
+    Until BornAgain-1.1, there was another child, ChiSquaredFrequency.
+
+    C++ includes: IChiSquaredModule.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICloneable]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IChiSquaredModule, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICloneable]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IChiSquaredModule, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IChiSquaredModule
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IChiSquaredModule self) -> IChiSquaredModule
+
+        virtual IChiSquaredModule* IChiSquaredModule::clone() const =0
+
+        clone method 
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_clone(self)
+
+
+    def getSquaredFunction(self):
+        """
+        getSquaredFunction(IChiSquaredModule self) -> ISquaredFunction
+
+        const ISquaredFunction* IChiSquaredModule::getSquaredFunction() const
+
+        Returns squared function. 
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_getSquaredFunction(self)
+
+
+    def setChiSquaredFunction(self, *args):
+        """
+        setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)
+        setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)
+
+        void IChiSquaredModule::setChiSquaredFunction(const ISquaredFunction &squared_function)
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_setChiSquaredFunction(self, *args)
+
+
+    def getIntensityNormalizer(self, *args):
+        """
+        getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer
+        getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer
+
+        virtual IIntensityNormalizer* IChiSquaredModule::getIntensityNormalizer()
+
+        Returns data normalizer, non-const version needed to set internals. 
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_getIntensityNormalizer(self, *args)
+
+
+    def setIntensityNormalizer(self, data_normalizer):
+        """
+        setIntensityNormalizer(IChiSquaredModule self, IIntensityNormalizer data_normalizer)
+
+        void IChiSquaredModule::setIntensityNormalizer(const IIntensityNormalizer &data_normalizer)
+
+        Sets data normalizer. 
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_setIntensityNormalizer(self, data_normalizer)
+
+
+    def getIntensityFunction(self):
+        """
+        getIntensityFunction(IChiSquaredModule self) -> IIntensityFunction
+
+        virtual const IIntensityFunction* IChiSquaredModule::getIntensityFunction() const
+
+        Returns data rescaler. 
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_getIntensityFunction(self)
+
+
+    def setIntensityFunction(self, intensity_function):
+        """
+        setIntensityFunction(IChiSquaredModule self, IIntensityFunction intensity_function)
+
+        void IChiSquaredModule::setIntensityFunction(const IIntensityFunction &intensity_function)
+
+        Sets data rescaler. 
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_setIntensityFunction(self, intensity_function)
+
+
+    def processFitElements(self, arg2, arg3):
+        """
+        processFitElements(IChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator arg2, std::vector< FitElement,std::allocator< FitElement > >::iterator arg3)
+
+        virtual void IChiSquaredModule::processFitElements(std::vector< FitElement >::iterator, std::vector< FitElement >::iterator)
+
+        """
+        return _libBornAgainCore.IChiSquaredModule_processFitElements(self, arg2, arg3)
+
+IChiSquaredModule_swigregister = _libBornAgainCore.IChiSquaredModule_swigregister
+IChiSquaredModule_swigregister(IChiSquaredModule)
+
+class IObserver(_object):
+    """
+
+
+    Observer interface from Observer pattern, for 1:n object dependencies.
+
+    C++ includes: IObserver.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IObserver, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IObserver, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IObserver
+    __del__ = lambda self: None
+
+    def notify(self, subject):
+        """
+        notify(IObserver self, IObservable subject)
+
+        virtual void IObserver::notify(IObservable *subject)=0
+
+        method which is used by observable subject to notify change in status 
+
+        """
+        return _libBornAgainCore.IObserver_notify(self, subject)
+
+IObserver_swigregister = _libBornAgainCore.IObserver_swigregister
+IObserver_swigregister(IObserver)
+
+class IObservable(_object):
+    """
+
+
+    Observable interface from Observer pattern, for 1:n object dependencies.
+
+    C++ includes: IObserver.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IObservable, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IObservable, name)
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IObservable
+    __del__ = lambda self: None
+
+    def attachObserver(self, obj):
+        """
+        attachObserver(IObservable self, IObservable::observer_t obj)
+
+        void IObservable::attachObserver(observer_t obj)
+
+        attach observer to the list of observers 
+
+        """
+        return _libBornAgainCore.IObservable_attachObserver(self, obj)
+
+
+    def notifyObservers(self):
+        """
+        notifyObservers(IObservable self)
+
+        void IObservable::notifyObservers()
+
+        notify observers about change in status 
+
+        """
+        return _libBornAgainCore.IObservable_notifyObservers(self)
+
+
+    def __init__(self):
+        """
+        __init__(IObservable self) -> IObservable
+
+
+
+        Observable interface from Observer pattern, for 1:n object dependencies.
+
+        C++ includes: IObserver.h
+
+        """
+        if self.__class__ == IObservable:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_IObservable(_self, )
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_IObservable(self)
+        return weakref_proxy(self)
+IObservable_swigregister = _libBornAgainCore.IObservable_swigregister
+IObservable_swigregister(IObservable)
+
+class IFitObserver(IObserver):
+    """
+
+
+    Base class for all fit observers. Calls update method in following cases: first iteration, every n-th iteration, last iteration and when fit strategy has changed.
+
+    C++ includes: IFitObserver.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IObserver]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFitObserver, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IObserver]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFitObserver, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, update_every_nth):
+        """
+        __init__(IFitObserver self, int update_every_nth) -> IFitObserver
+
+        IFitObserver::IFitObserver(int update_every_nth)
+
+        """
+        if self.__class__ == IFitObserver:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_IFitObserver(_self, update_every_nth)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def notify(self, subject):
+        """
+        notify(IFitObserver self, IObservable subject)
+
+        void IFitObserver::notify(IObservable *subject)
+
+        The method used by Ovservable when he wants to be observed by this. 
+
+        """
+        return _libBornAgainCore.IFitObserver_notify(self, subject)
+
+
+    def update(self, fit_suite):
+        """
+        update(IFitObserver self, FitSuite fit_suite)
+
+        void IFitObserver::update(FitSuite *fit_suite)
+
+        Here Onserver will do actuall job when he thinks that it is a right moment. 
+
+        """
+        return _libBornAgainCore.IFitObserver_update(self, fit_suite)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IFitObserver
+    __del__ = lambda self: None
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_IFitObserver(self)
+        return weakref_proxy(self)
+IFitObserver_swigregister = _libBornAgainCore.IFitObserver_swigregister
+IFitObserver_swigregister(IFitObserver)
+
+class IFitStrategy(INamed):
+    """
+
+
+    Interface to concrete fit strategy.
+
+    Concrete implementation should manipulate with fit parameters/data and then call minimizer.
+
+    C++ includes: IFitStrategy.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [INamed]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFitStrategy, name, value)
+    __swig_getmethods__ = {}
+    for _s in [INamed]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFitStrategy, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IFitStrategy
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IFitStrategy self) -> IFitStrategy
+
+        virtual IFitStrategy* IFitStrategy::clone() const =0
+
+        """
+        return _libBornAgainCore.IFitStrategy_clone(self)
+
+
+    def init(self, fit_suite):
+        """
+        init(IFitStrategy self, FitSuiteImpl * fit_suite)
+
+        void IFitStrategy::init(FitSuiteImpl *fit_suite)
+
+        """
+        return _libBornAgainCore.IFitStrategy_init(self, fit_suite)
+
+
+    def execute(self):
+        """
+        execute(IFitStrategy self)
+
+        virtual void IFitStrategy::execute()=0
+
+        """
+        return _libBornAgainCore.IFitStrategy_execute(self)
+
+IFitStrategy_swigregister = _libBornAgainCore.IFitStrategy_swigregister
+IFitStrategy_swigregister(IFitStrategy)
+
+class FitStrategyDefault(IFitStrategy):
+    """
+
+
+    Default fit strategy just let  FitSuite to run it's minimization round.
+
+    C++ includes: IFitStrategy.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFitStrategy]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitStrategyDefault, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFitStrategy]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FitStrategyDefault, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(FitStrategyDefault self) -> FitStrategyDefault
+
+        FitStrategyDefault::FitStrategyDefault()
+
+        """
+        this = _libBornAgainCore.new_FitStrategyDefault()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FitStrategyDefault self) -> FitStrategyDefault
+
+        FitStrategyDefault * FitStrategyDefault::clone() const 
+
+        """
+        return _libBornAgainCore.FitStrategyDefault_clone(self)
+
+
+    def execute(self):
+        """
+        execute(FitStrategyDefault self)
+
+        void FitStrategyDefault::execute()
+
+        """
+        return _libBornAgainCore.FitStrategyDefault_execute(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FitStrategyDefault
+    __del__ = lambda self: None
+FitStrategyDefault_swigregister = _libBornAgainCore.FitStrategyDefault_swigregister
+FitStrategyDefault_swigregister(FitStrategyDefault)
+
+class IIntensityFunction(_object):
+    """
+
+
+    Interface for applying arbitrary function to the measured intensity.
+
+    C++ includes: IIntensityFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IIntensityFunction, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IIntensityFunction, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IIntensityFunction
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IIntensityFunction self) -> IIntensityFunction
+
+        virtual IIntensityFunction* IIntensityFunction::clone() const =0
+
+        """
+        return _libBornAgainCore.IIntensityFunction_clone(self)
+
+
+    def evaluate(self, value):
+        """
+        evaluate(IIntensityFunction self, double value) -> double
+
+        virtual double IIntensityFunction::evaluate(double value) const =0
+
+        """
+        return _libBornAgainCore.IIntensityFunction_evaluate(self, value)
+
+IIntensityFunction_swigregister = _libBornAgainCore.IIntensityFunction_swigregister
+IIntensityFunction_swigregister(IIntensityFunction)
+
+class IntensityFunctionLog(IIntensityFunction):
+    """
+
+
+    Algorithm for applying log function to the measured intensity.
+
+    C++ includes: IIntensityFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IIntensityFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityFunctionLog, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IIntensityFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityFunctionLog, name)
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IntensityFunctionLog
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IntensityFunctionLog self) -> IntensityFunctionLog
+
+        virtual IntensityFunctionLog* IntensityFunctionLog::clone() const 
+
+        """
+        return _libBornAgainCore.IntensityFunctionLog_clone(self)
+
+
+    def evaluate(self, value):
+        """
+        evaluate(IntensityFunctionLog self, double value) -> double
+
+        double IntensityFunctionLog::evaluate(double value) const 
+
+        """
+        return _libBornAgainCore.IntensityFunctionLog_evaluate(self, value)
+
+
+    def __init__(self):
+        """
+        __init__(IntensityFunctionLog self) -> IntensityFunctionLog
+
+
+
+        Algorithm for applying log function to the measured intensity.
+
+        C++ includes: IIntensityFunction.h
+
+        """
+        this = _libBornAgainCore.new_IntensityFunctionLog()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+IntensityFunctionLog_swigregister = _libBornAgainCore.IntensityFunctionLog_swigregister
+IntensityFunctionLog_swigregister(IntensityFunctionLog)
+
+class IntensityFunctionSqrt(IIntensityFunction):
+    """
+
+
+    Algorithm for applying sqrt function to the measured intensity.
+
+    C++ includes: IIntensityFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IIntensityFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityFunctionSqrt, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IIntensityFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityFunctionSqrt, name)
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IntensityFunctionSqrt
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IntensityFunctionSqrt self) -> IntensityFunctionSqrt
+
+        virtual IntensityFunctionSqrt* IntensityFunctionSqrt::clone() const 
+
+        """
+        return _libBornAgainCore.IntensityFunctionSqrt_clone(self)
+
+
+    def evaluate(self, value):
+        """
+        evaluate(IntensityFunctionSqrt self, double value) -> double
+
+        double IntensityFunctionSqrt::evaluate(double value) const 
+
+        """
+        return _libBornAgainCore.IntensityFunctionSqrt_evaluate(self, value)
+
+
+    def __init__(self):
+        """
+        __init__(IntensityFunctionSqrt self) -> IntensityFunctionSqrt
+
+
+
+        Algorithm for applying sqrt function to the measured intensity.
+
+        C++ includes: IIntensityFunction.h
+
+        """
+        this = _libBornAgainCore.new_IntensityFunctionSqrt()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+IntensityFunctionSqrt_swigregister = _libBornAgainCore.IntensityFunctionSqrt_swigregister
+IntensityFunctionSqrt_swigregister(IntensityFunctionSqrt)
+
+class IIntensityNormalizer(IParameterized):
+    """
+
+
+    Interface to  OutputData normalizers.
+
+    C++ includes: IIntensityNormalizer.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IIntensityNormalizer, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IIntensityNormalizer, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IIntensityNormalizer
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IIntensityNormalizer self) -> IIntensityNormalizer
+
+        virtual IIntensityNormalizer* IIntensityNormalizer::clone() const =0
+
+        """
+        return _libBornAgainCore.IIntensityNormalizer_clone(self)
+
+
+    def createNormalizedData(self, data):
+        """
+        createNormalizedData(IIntensityNormalizer self, IntensityData data) -> IntensityData
+
+        virtual OutputData<double>* IIntensityNormalizer::createNormalizedData(const OutputData< double > &data) const =0
+
+        """
+        return _libBornAgainCore.IIntensityNormalizer_createNormalizedData(self, data)
+
+
+    def apply(self, data):
+        """
+        apply(IIntensityNormalizer self, IntensityData data)
+
+        virtual void IIntensityNormalizer::apply(OutputData< double > &data) const =0
+
+        """
+        return _libBornAgainCore.IIntensityNormalizer_apply(self, data)
+
+
+    def setMaximumIntensity(self, arg2):
+        """
+        setMaximumIntensity(IIntensityNormalizer self, double arg2)
+
+        virtual void IIntensityNormalizer::setMaximumIntensity(double)=0
+
+        """
+        return _libBornAgainCore.IIntensityNormalizer_setMaximumIntensity(self, arg2)
+
+IIntensityNormalizer_swigregister = _libBornAgainCore.IIntensityNormalizer_swigregister
+IIntensityNormalizer_swigregister(IIntensityNormalizer)
+
+class IntensityNormalizer(IIntensityNormalizer):
+    """
+
+
+    Standard  OutputData normalizer, with configurable max_intensity.
+
+    C++ includes: IIntensityNormalizer.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IIntensityNormalizer]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityNormalizer, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IIntensityNormalizer]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityNormalizer, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, scale=1.0, shift=0.0):
+        """
+        __init__(IntensityNormalizer self, double scale=1.0, double shift=0.0) -> IntensityNormalizer
+        __init__(IntensityNormalizer self, double scale=1.0) -> IntensityNormalizer
+        __init__(IntensityNormalizer self) -> IntensityNormalizer
+
+        IntensityNormalizer::IntensityNormalizer(double scale=1.0, double shift=0.0)
+
+        """
+        this = _libBornAgainCore.new_IntensityNormalizer(scale, shift)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IntensityNormalizer
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IntensityNormalizer self) -> IntensityNormalizer
+
+        IntensityNormalizer * IntensityNormalizer::clone() const 
+
+        """
+        return _libBornAgainCore.IntensityNormalizer_clone(self)
+
+
+    def createNormalizedData(self, data):
+        """
+        createNormalizedData(IntensityNormalizer self, IntensityData data) -> IntensityData
+
+        OutputData< double > * IntensityNormalizer::createNormalizedData(const OutputData< double > &data) const 
+
+        """
+        return _libBornAgainCore.IntensityNormalizer_createNormalizedData(self, data)
+
+
+    def apply(self, data):
+        """
+        apply(IntensityNormalizer self, IntensityData data)
+
+        void IntensityNormalizer::apply(OutputData< double > &data) const final
+
+        """
+        return _libBornAgainCore.IntensityNormalizer_apply(self, data)
+
+
+    def setMaximumIntensity(self, max_intensity):
+        """
+        setMaximumIntensity(IntensityNormalizer self, double max_intensity)
+
+        virtual void IntensityNormalizer::setMaximumIntensity(double max_intensity)
+
+        """
+        return _libBornAgainCore.IntensityNormalizer_setMaximumIntensity(self, max_intensity)
+
+IntensityNormalizer_swigregister = _libBornAgainCore.IntensityNormalizer_swigregister
+IntensityNormalizer_swigregister(IntensityNormalizer)
+
+class IntensityScaleAndShiftNormalizer(IntensityNormalizer):
+    """
+
+
+    Simplified  OutputData normalizer, with max_intensity=1.
+
+    C++ includes: IIntensityNormalizer.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IntensityNormalizer]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityScaleAndShiftNormalizer, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IntensityNormalizer]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityScaleAndShiftNormalizer, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, scale=1.0, shift=0.0):
+        """
+        __init__(IntensityScaleAndShiftNormalizer self, double scale=1.0, double shift=0.0) -> IntensityScaleAndShiftNormalizer
+        __init__(IntensityScaleAndShiftNormalizer self, double scale=1.0) -> IntensityScaleAndShiftNormalizer
+        __init__(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer
+
+        IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)
+
+        """
+        this = _libBornAgainCore.new_IntensityScaleAndShiftNormalizer(scale, shift)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IntensityScaleAndShiftNormalizer
+    __del__ = lambda self: None
+
+    def setMaximumIntensity(self, arg2):
+        """
+        setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double arg2)
+
+        void IntensityScaleAndShiftNormalizer::setMaximumIntensity(double) final
+
+        """
+        return _libBornAgainCore.IntensityScaleAndShiftNormalizer_setMaximumIntensity(self, arg2)
+
+
+    def clone(self):
+        """
+        clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer
+
+        IntensityScaleAndShiftNormalizer* IntensityScaleAndShiftNormalizer::clone() const final
+
+        """
+        return _libBornAgainCore.IntensityScaleAndShiftNormalizer_clone(self)
+
+IntensityScaleAndShiftNormalizer_swigregister = _libBornAgainCore.IntensityScaleAndShiftNormalizer_swigregister
+IntensityScaleAndShiftNormalizer_swigregister(IntensityScaleAndShiftNormalizer)
+
+class ISquaredFunction(_object):
+    """
+
+
+    Interface providing measures for deviation between two values.
+
+    Used By  ChiSquaredModule for chi2 calculations
+
+    C++ includes: ISquaredFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ISquaredFunction, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, ISquaredFunction, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_ISquaredFunction
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ISquaredFunction self) -> ISquaredFunction
+
+        virtual ISquaredFunction* ISquaredFunction::clone() const =0
+
+        """
+        return _libBornAgainCore.ISquaredFunction_clone(self)
+
+
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """
+        calculateSquaredDifference(ISquaredFunction self, double real_value, double simulated_value) -> double
+
+        virtual double ISquaredFunction::calculateSquaredDifference(double real_value, double simulated_value) const =0
+
+        """
+        return _libBornAgainCore.ISquaredFunction_calculateSquaredDifference(self, real_value, simulated_value)
+
+
+    def calculateSquaredError(self, real_value, simulated_value=0.0):
+        """
+        calculateSquaredError(ISquaredFunction self, double real_value, double simulated_value=0.0) -> double
+        calculateSquaredError(ISquaredFunction self, double real_value) -> double
+
+        virtual double ISquaredFunction::calculateSquaredError(double real_value, double simulated_value=0.0) const =0
+
+        """
+        return _libBornAgainCore.ISquaredFunction_calculateSquaredError(self, real_value, simulated_value)
+
+ISquaredFunction_swigregister = _libBornAgainCore.ISquaredFunction_swigregister
+ISquaredFunction_swigregister(ISquaredFunction)
+
+class SquaredFunctionDefault(ISquaredFunction):
+    """
+
+
+    Squared difference between two values.
+
+    value = (a-b)*(a-b)/norm, where norm = max(b, 1.0) a - simulated values, b - real_values
+
+    C++ includes: ISquaredFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionDefault, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionDefault, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(SquaredFunctionDefault self) -> SquaredFunctionDefault
+
+        SquaredFunctionDefault::SquaredFunctionDefault()
+
+        """
+        this = _libBornAgainCore.new_SquaredFunctionDefault()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_SquaredFunctionDefault
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(SquaredFunctionDefault self) -> SquaredFunctionDefault
+
+        virtual SquaredFunctionDefault* SquaredFunctionDefault::clone() const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionDefault_clone(self)
+
+
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """
+        calculateSquaredDifference(SquaredFunctionDefault self, double real_value, double simulated_value) -> double
+
+        virtual double SquaredFunctionDefault::calculateSquaredDifference(double real_value, double simulated_value) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionDefault_calculateSquaredDifference(self, real_value, simulated_value)
+
+
+    def calculateSquaredError(self, real_value, simulated_value=0):
+        """
+        calculateSquaredError(SquaredFunctionDefault self, double real_value, double simulated_value=0) -> double
+        calculateSquaredError(SquaredFunctionDefault self, double real_value) -> double
+
+        virtual double SquaredFunctionDefault::calculateSquaredError(double real_value, double simulated_value=0) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionDefault_calculateSquaredError(self, real_value, simulated_value)
+
+SquaredFunctionDefault_swigregister = _libBornAgainCore.SquaredFunctionDefault_swigregister
+SquaredFunctionDefault_swigregister(SquaredFunctionDefault)
+
+class SquaredFunctionSimError(ISquaredFunction):
+    """
+
+
+    Squared difference between two values.
+
+    value = (a-b)*(a-b)/norm, where norm = max(a, 1.0) a - simulated values, b - real_values
+
+    C++ includes: ISquaredFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionSimError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionSimError, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_SquaredFunctionSimError
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(SquaredFunctionSimError self) -> SquaredFunctionSimError
+
+        virtual SquaredFunctionSimError* SquaredFunctionSimError::clone() const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionSimError_clone(self)
+
+
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """
+        calculateSquaredDifference(SquaredFunctionSimError self, double real_value, double simulated_value) -> double
+
+        virtual double SquaredFunctionSimError::calculateSquaredDifference(double real_value, double simulated_value) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionSimError_calculateSquaredDifference(self, real_value, simulated_value)
+
+
+    def calculateSquaredError(self, arg2, simulated_value):
+        """
+        calculateSquaredError(SquaredFunctionSimError self, double arg2, double simulated_value) -> double
+
+        virtual double SquaredFunctionSimError::calculateSquaredError(double, double simulated_value) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionSimError_calculateSquaredError(self, arg2, simulated_value)
+
+SquaredFunctionSimError_swigregister = _libBornAgainCore.SquaredFunctionSimError_swigregister
+SquaredFunctionSimError_swigregister(SquaredFunctionSimError)
+
+class SquaredFunctionMeanSquaredError(ISquaredFunction):
+    """
+
+
+    Squared difference between two values normalized by mean squared error.
+
+    value = (a-b)*(a-b)/norm, where norm = sqrt(sigma1*sigma1 + sigma2*sigma2), sigma1=max(a, 1.0), sigma2=max(b,1.0)
+
+    C++ includes: ISquaredFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionMeanSquaredError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionMeanSquaredError, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_SquaredFunctionMeanSquaredError
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(SquaredFunctionMeanSquaredError self) -> SquaredFunctionMeanSquaredError
+
+        virtual SquaredFunctionMeanSquaredError* SquaredFunctionMeanSquaredError::clone() const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionMeanSquaredError_clone(self)
+
+
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """
+        calculateSquaredDifference(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double
+
+        virtual double SquaredFunctionMeanSquaredError::calculateSquaredDifference(double real_value, double simulated_value) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionMeanSquaredError_calculateSquaredDifference(self, real_value, simulated_value)
+
+
+    def calculateSquaredError(self, real_value, simulated_value):
+        """
+        calculateSquaredError(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double
+
+        virtual double SquaredFunctionMeanSquaredError::calculateSquaredError(double real_value, double simulated_value) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionMeanSquaredError_calculateSquaredError(self, real_value, simulated_value)
+
+SquaredFunctionMeanSquaredError_swigregister = _libBornAgainCore.SquaredFunctionMeanSquaredError_swigregister
+SquaredFunctionMeanSquaredError_swigregister(SquaredFunctionMeanSquaredError)
+
+class SquaredFunctionSystematicError(ISquaredFunction):
+    """
+
+
+    Squared difference between two values normalized by systematic error.
+
+    value = (a-b)*(a-b)/norm, where norm = max(error, 1.0), error = b + (epsilon*b)**2
+
+    C++ includes: ISquaredFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionSystematicError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionSystematicError, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_SquaredFunctionSystematicError
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(SquaredFunctionSystematicError self) -> SquaredFunctionSystematicError
+
+        virtual SquaredFunctionSystematicError* SquaredFunctionSystematicError::clone() const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionSystematicError_clone(self)
+
+
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """
+        calculateSquaredDifference(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double
+
+        virtual double SquaredFunctionSystematicError::calculateSquaredDifference(double real_value, double simulated_value) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionSystematicError_calculateSquaredDifference(self, real_value, simulated_value)
+
+
+    def calculateSquaredError(self, real_value, arg3):
+        """
+        calculateSquaredError(SquaredFunctionSystematicError self, double real_value, double arg3) -> double
+
+        virtual double SquaredFunctionSystematicError::calculateSquaredError(double real_value, double) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionSystematicError_calculateSquaredError(self, real_value, arg3)
+
+SquaredFunctionSystematicError_swigregister = _libBornAgainCore.SquaredFunctionSystematicError_swigregister
+SquaredFunctionSystematicError_swigregister(SquaredFunctionSystematicError)
+
+class SquaredFunctionGaussianError(ISquaredFunction):
+    """
+
+
+    Squared difference between two values with gaussian error.
+
+    value = (a-b)*(a-b)/norm, where norm = sigma*sigma, sigma - is set by user
+
+    C++ includes: ISquaredFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SquaredFunctionGaussianError, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISquaredFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SquaredFunctionGaussianError, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_SquaredFunctionGaussianError
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(SquaredFunctionGaussianError self) -> SquaredFunctionGaussianError
+
+        virtual SquaredFunctionGaussianError* SquaredFunctionGaussianError::clone() const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionGaussianError_clone(self)
+
+
+    def calculateSquaredDifference(self, real_value, simulated_value):
+        """
+        calculateSquaredDifference(SquaredFunctionGaussianError self, double real_value, double simulated_value) -> double
+
+        virtual double SquaredFunctionGaussianError::calculateSquaredDifference(double real_value, double simulated_value) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionGaussianError_calculateSquaredDifference(self, real_value, simulated_value)
+
+
+    def calculateSquaredError(self, arg2, arg3):
+        """
+        calculateSquaredError(SquaredFunctionGaussianError self, double arg2, double arg3) -> double
+
+        virtual double SquaredFunctionGaussianError::calculateSquaredError(double, double) const 
+
+        """
+        return _libBornAgainCore.SquaredFunctionGaussianError_calculateSquaredError(self, arg2, arg3)
+
+SquaredFunctionGaussianError_swigregister = _libBornAgainCore.SquaredFunctionGaussianError_swigregister
+SquaredFunctionGaussianError_swigregister(SquaredFunctionGaussianError)
+
+class ChiSquaredModule(IChiSquaredModule):
+    """
+
+
+    Calculation of chi2 between two data sets.
+
+    C++ includes: ChiSquaredModule.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IChiSquaredModule]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ChiSquaredModule, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IChiSquaredModule]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ChiSquaredModule, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(ChiSquaredModule self) -> ChiSquaredModule
+        __init__(ChiSquaredModule self, ChiSquaredModule other) -> ChiSquaredModule
+
+        ChiSquaredModule::ChiSquaredModule(const ChiSquaredModule &other)
+
+        """
+        this = _libBornAgainCore.new_ChiSquaredModule(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ChiSquaredModule
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ChiSquaredModule self) -> ChiSquaredModule
+
+        virtual ChiSquaredModule* ChiSquaredModule::clone() const
+
+        clone method 
+
+        """
+        return _libBornAgainCore.ChiSquaredModule_clone(self)
+
+
+    def processFitElements(self, first, last):
+        """
+        processFitElements(ChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator first, std::vector< FitElement,std::allocator< FitElement > >::iterator last)
+
+        void ChiSquaredModule::processFitElements(std::vector< FitElement >::iterator first, std::vector< FitElement >::iterator last)
+
+        """
+        return _libBornAgainCore.ChiSquaredModule_processFitElements(self, first, last)
+
+ChiSquaredModule_swigregister = _libBornAgainCore.ChiSquaredModule_swigregister
+ChiSquaredModule_swigregister(ChiSquaredModule)
+
+class FitObject(IParameterized, INoncopyable):
+    """
+
+
+    Holds simulation description and real data to run the fit.
+
+    C++ includes: FitObject.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized, INoncopyable]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitObject, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized, INoncopyable]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FitObject, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, simulation, real_data, weight=1):
+        """
+        __init__(FitObject self, GISASSimulation simulation, IntensityData real_data, double weight=1) -> FitObject
+        __init__(FitObject self, GISASSimulation simulation, IntensityData real_data) -> FitObject
+
+        FitObject::FitObject(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight=1)
+
+        FitObject constructor
+
+        Parameters:
+        -----------
+
+        simulation: 
+        The simulation to run
+
+        real_data: 
+        The real data
+
+        weight: 
+        Weight of dataset in chi2 calculations
+
+        adjust_detector_to_data: 
+        Detector axes will be adjusted to real data axes, if true 
+
+        """
+        this = _libBornAgainCore.new_FitObject(simulation, real_data, weight)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FitObject
+    __del__ = lambda self: None
+
+    def realData(self):
+        """
+        realData(FitObject self) -> IntensityData
+
+        const OutputData< double > & FitObject::realData() const
+
+        Returns real (experimental) data. 
+
+        """
+        return _libBornAgainCore.FitObject_realData(self)
+
+
+    def simulationData(self):
+        """
+        simulationData(FitObject self) -> IntensityData
+
+        const OutputData< double > & FitObject::simulationData() const
+
+        Returns simulated data. 
+
+        """
+        return _libBornAgainCore.FitObject_simulationData(self)
+
+
+    def chiSquaredMap(self):
+        """
+        chiSquaredMap(FitObject self) -> IntensityData
+
+        const OutputData< double > & FitObject::chiSquaredMap() const
+
+        Returns chi2 map. 
+
+        """
+        return _libBornAgainCore.FitObject_chiSquaredMap(self)
+
+
+    def simulation(self):
+        """
+        simulation(FitObject self) -> GISASSimulation
+
+        const GISASSimulation & FitObject::simulation() const
+
+        Returns simulation. 
+
+        """
+        return _libBornAgainCore.FitObject_simulation(self)
+
+
+    def weight(self):
+        """
+        weight(FitObject self) -> double
+
+        double FitObject::weight() const
+
+        Returns weight of data set in chi2 calculations. 
+
+        """
+        return _libBornAgainCore.FitObject_weight(self)
+
+
+    def numberOfFitElements(self):
+        """
+        numberOfFitElements(FitObject self) -> size_t
+
+        size_t FitObject::numberOfFitElements() const
+
+        Returns the size of the data. It is equal to the number of non-masked detector channels which will participate in chi2 calculations. 
+
+        """
+        return _libBornAgainCore.FitObject_numberOfFitElements(self)
+
+
+    def prepareFitElements(self, fit_elements, weight, normalizer=None):
+        """
+        prepareFitElements(FitObject self, std::vector< FitElement,std::allocator< FitElement > > & fit_elements, double weight, IIntensityNormalizer normalizer=None)
+        prepareFitElements(FitObject self, std::vector< FitElement,std::allocator< FitElement > > & fit_elements, double weight)
+
+        void FitObject::prepareFitElements(std::vector< FitElement > &fit_elements, double weight, IIntensityNormalizer *normalizer=0)
+
+        Runs simulation and put results (the real and simulated intensities) into external vector. Masked channels will be excluded from the vector. 
+
+        """
+        return _libBornAgainCore.FitObject_prepareFitElements(self, fit_elements, weight, normalizer)
+
+
+    def transferToChi2Map(self, first, last):
+        """
+        transferToChi2Map(FitObject self, std::vector< FitElement,std::allocator< FitElement > >::const_iterator first, std::vector< FitElement,std::allocator< FitElement > >::const_iterator last)
+
+        void FitObject::transferToChi2Map(std::vector< FitElement >::const_iterator first, std::vector< FitElement >::const_iterator last) const
+
+        Updates ChiSquared map from external vector and returns const reference to it. Used from Python in FitSuiteDrawObserver. 
+
+        """
+        return _libBornAgainCore.FitObject_transferToChi2Map(self, first, last)
+
+FitObject_swigregister = _libBornAgainCore.FitObject_swigregister
+FitObject_swigregister(FitObject)
+
+class FitOptions(_object):
+    """Proxy of C++ FitOptions class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, FitOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """__init__(FitOptions self) -> FitOptions"""
+        this = _libBornAgainCore.new_FitOptions()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FitOptions
+    __del__ = lambda self: None
+
+    def derivEpsilon(self):
+        """derivEpsilon(FitOptions self) -> double"""
+        return _libBornAgainCore.FitOptions_derivEpsilon(self)
+
+
+    def setDerivEpsilon(self, deriv_epsilon):
+        """setDerivEpsilon(FitOptions self, double deriv_epsilon)"""
+        return _libBornAgainCore.FitOptions_setDerivEpsilon(self, deriv_epsilon)
+
+
+    def stepFactor(self):
+        """stepFactor(FitOptions self) -> double"""
+        return _libBornAgainCore.FitOptions_stepFactor(self)
+
+
+    def setStepFactor(self, step_factor):
+        """setStepFactor(FitOptions self, double step_factor)"""
+        return _libBornAgainCore.FitOptions_setStepFactor(self, step_factor)
+
+FitOptions_swigregister = _libBornAgainCore.FitOptions_swigregister
+FitOptions_swigregister(FitOptions)
+
+class FitParameterLinked(libBornAgainFit.FitParameter):
+    """
+
+
+    Fittable parameter, linked to other parameters from pools.
+
+    C++ includes: FitParameterLinked.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [libBornAgainFit.FitParameter]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitParameterLinked, name, value)
+    __swig_getmethods__ = {}
+    for _s in [libBornAgainFit.FitParameter]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FitParameterLinked, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FitParameterLinked self) -> FitParameterLinked
+        __init__(FitParameterLinked self, std::string const & name, double value, AttLimits lim, double step=0.0) -> FitParameterLinked
+        __init__(FitParameterLinked self, std::string const & name, double value, AttLimits lim) -> FitParameterLinked
+        __init__(FitParameterLinked self, std::string const & name, double value) -> FitParameterLinked
+
+        FitParameterLinked::FitParameterLinked(const std::string &name, double value, const AttLimits &lim=AttLimits::limitless(), double step=0.0)
+
+        """
+        this = _libBornAgainCore.new_FitParameterLinked(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FitParameterLinked
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(FitParameterLinked self) -> FitParameterLinked
+
+        FitParameterLinked * FitParameterLinked::clone() const 
+
+        """
+        return _libBornAgainCore.FitParameterLinked_clone(self)
+
+
+    def setValue(self, value):
+        """
+        setValue(FitParameterLinked self, double value)
+
+        void FitParameterLinked::setValue(double value) final
+
+        Sets given value for all bound parameters. 
+
+        """
+        return _libBornAgainCore.FitParameterLinked_setValue(self, value)
+
+
+    def addParameter(self, par):
+        """
+        addParameter(FitParameterLinked self, RealParameter par)
+
+        void FitParameterLinked::addParameter(RealParameter *par)
+
+        Adds real parameter to the collection. 
+
+        """
+        return _libBornAgainCore.FitParameterLinked_addParameter(self, par)
+
+
+    def addMatchedParametersFromPool(self, *args):
+        """
+        addMatchedParametersFromPool(FitParameterLinked self, ParameterPool pool, std::string const & wildcard)
+        addMatchedParametersFromPool(FitParameterLinked self, ParameterPool pool)
+
+        void FitParameterLinked::addMatchedParametersFromPool(const ParameterPool *pool, const std::string &wildcard=std::string())
+
+        Adds parameters from pool which match given wildcard. 
+
+        """
+        return _libBornAgainCore.FitParameterLinked_addMatchedParametersFromPool(self, *args)
+
+FitParameterLinked_swigregister = _libBornAgainCore.FitParameterLinked_swigregister
+FitParameterLinked_swigregister(FitParameterLinked)
+
+class FitSuite(IObservable):
+    """
+
+
+    User interface class that wraps all fit methods.
+
+    C++ includes: FitSuite.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IObservable]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitSuite, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IObservable]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FitSuite, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(FitSuite self) -> FitSuite
+
+        FitSuite::FitSuite(const FitSuite &)=delete
+
+        """
+        this = _libBornAgainCore.new_FitSuite()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FitSuite
+    __del__ = lambda self: None
+
+    def addSimulationAndRealData(self, *args):
+        """
+        addSimulationAndRealData(FitSuite self, GISASSimulation simulation, IntensityData real_data, double weight=1)
+        addSimulationAndRealData(FitSuite self, GISASSimulation simulation, IntensityData real_data)
+        addSimulationAndRealData(FitSuite self, GISASSimulation simulation, IHistogram real_data, double weight=1)
+        addSimulationAndRealData(FitSuite self, GISASSimulation simulation, IHistogram real_data)
+        addSimulationAndRealData(FitSuite self, GISASSimulation simulation, vdouble2d_t real_data, double weight=1)
+        addSimulationAndRealData(FitSuite self, GISASSimulation simulation, vdouble2d_t real_data)
+
+        void FitSuite::addSimulationAndRealData(const GISASSimulation &simulation, const IHistogram &real_data, double weight=1)
+
+        Assigns pair of (simulation, real data) for fitting. More than one pair can be added. 
+
+        """
+        return _libBornAgainCore.FitSuite_addSimulationAndRealData(self, *args)
+
+
+    def addFitParameter(self, *args):
+        """
+        addFitParameter(FitSuite self, std::string const & name, double value, AttLimits limits, double step=0.0) -> FitParameterLinked
+        addFitParameter(FitSuite self, std::string const & name, double value, AttLimits limits) -> FitParameterLinked
+        addFitParameter(FitSuite self, std::string const & name, double value) -> FitParameterLinked
+
+        FitParameterLinked * FitSuite::addFitParameter(const std::string &name, double value, const AttLimits &limits=AttLimits::limitless(), double step=0.0)
+
+        Adds fit parameter
+
+        Parameters:
+        -----------
+
+        name: 
+        The name of fit parameter
+
+        value: 
+        Parameter's starting value
+
+        limits: 
+        Limits attribute
+
+        step: 
+        Initial parameter's step (some minimizers don't use it) 
+
+        """
+        return _libBornAgainCore.FitSuite_addFitParameter(self, *args)
+
+
+    def setChiSquaredModule(self, chi2_module):
+        """
+        setChiSquaredModule(FitSuite self, IChiSquaredModule chi2_module)
+
+        void FitSuite::setChiSquaredModule(const IChiSquaredModule &chi2_module)
+
+        Replaces default  ChiSquaredModule with new one. 
+
+        """
+        return _libBornAgainCore.FitSuite_setChiSquaredModule(self, chi2_module)
+
+
+    def addFitStrategy(self, strategy):
+        """
+        addFitStrategy(FitSuite self, IFitStrategy strategy)
+
+        void FitSuite::addFitStrategy(const IFitStrategy &strategy)
+
+        Adds fit strategy. 
+
+        """
+        return _libBornAgainCore.FitSuite_addFitStrategy(self, strategy)
+
+
+    def setMinimizer(self, *args):
+        """
+        setMinimizer(FitSuite self, std::string const & minimizer_name, std::string const & algorithm_name, std::string const & minimizer_options)
+        setMinimizer(FitSuite self, std::string const & minimizer_name, std::string const & algorithm_name)
+        setMinimizer(FitSuite self, std::string const & minimizer_name)
+        setMinimizer(FitSuite self, IMinimizer * minimizer)
+
+        void FitSuite::setMinimizer(IMinimizer *minimizer)
+
+        Sets minimizer. 
+
+        """
+        return _libBornAgainCore.FitSuite_setMinimizer(self, *args)
+
+
+    def minimizer(self):
+        """
+        minimizer(FitSuite self) -> IMinimizer const *
+
+        const IMinimizer * FitSuite::minimizer() const
+
+        Returns minimizer. 
+
+        """
+        return _libBornAgainCore.FitSuite_minimizer(self)
+
+
+    def initPrint(self, print_every_nth):
+        """
+        initPrint(FitSuite self, int print_every_nth)
+
+        void FitSuite::initPrint(int print_every_nth)
+
+        Initializes printing to standard output during the fitting. Prints also the summary when completed.
+
+        Parameters:
+        -----------
+
+        print_every_nth: 
+        Print every n'th iteration 
+
+        """
+        return _libBornAgainCore.FitSuite_initPrint(self, print_every_nth)
+
+
+    def runFit(self):
+        """
+        runFit(FitSuite self)
+
+        void FitSuite::runFit()
+
+        main method to run the fitting 
+
+        """
+        return _libBornAgainCore.FitSuite_runFit(self)
+
+
+    def numberOfFitObjects(self):
+        """
+        numberOfFitObjects(FitSuite self) -> int
+
+        int FitSuite::numberOfFitObjects() const
+
+        Returns number of fit objects, where fit object stands for (real, simulated) pair. 
+
+        """
+        return _libBornAgainCore.FitSuite_numberOfFitObjects(self)
+
+
+    def getRealData(self, i_item=0):
+        """
+        getRealData(FitSuite self, size_t i_item=0) -> IHistogram
+        getRealData(FitSuite self) -> IHistogram
+
+        IHistogram * FitSuite::getRealData(size_t i_item=0) const
+
+        returns real data histogram
+
+        Parameters:
+        -----------
+
+        i_item: 
+        The index of fit object 
+
+        """
+        return _libBornAgainCore.FitSuite_getRealData(self, i_item)
+
+
+    def getSimulationData(self, i_item=0):
+        """
+        getSimulationData(FitSuite self, size_t i_item=0) -> IHistogram
+        getSimulationData(FitSuite self) -> IHistogram
+
+        IHistogram * FitSuite::getSimulationData(size_t i_item=0) const
+
+        returns simulated data histogram
+
+        Parameters:
+        -----------
+
+        i_item: 
+        The index of fit object 
+
+        """
+        return _libBornAgainCore.FitSuite_getSimulationData(self, i_item)
+
+
+    def getChiSquaredMap(self, i_item=0):
+        """
+        getChiSquaredMap(FitSuite self, size_t i_item=0) -> IHistogram
+        getChiSquaredMap(FitSuite self) -> IHistogram
+
+        IHistogram * FitSuite::getChiSquaredMap(size_t i_item=0) const
+
+        returns chi2 histogram calculated for (real, simulated) data pair
+
+        Parameters:
+        -----------
+
+        i_item: 
+        The index of fit object 
+
+        """
+        return _libBornAgainCore.FitSuite_getChiSquaredMap(self, i_item)
+
+
+    def fitObjects(self):
+        """
+        fitObjects(FitSuite self) -> FitSuiteObjects
+
+        FitSuiteObjects * FitSuite::fitObjects()
+
+        returns  FitObject (pair of simulation/real data) 
+
+        """
+        return _libBornAgainCore.FitSuite_fitObjects(self)
+
+
+    def fitParameters(self):
+        """
+        fitParameters(FitSuite self) -> FitParameterSet *
+
+        FitParameterSet * FitSuite::fitParameters()
+
+        Returns reference to fit parameters. 
+
+        """
+        return _libBornAgainCore.FitSuite_fitParameters(self)
+
+
+    def fitStrategies(self):
+        """
+        fitStrategies(FitSuite self) -> FitSuiteStrategies *
+
+        FitSuiteStrategies * FitSuite::fitStrategies()
+
+        Returns reference to fit parameters. 
+
+        """
+        return _libBornAgainCore.FitSuite_fitStrategies(self)
+
+
+    def isLastIteration(self):
+        """
+        isLastIteration(FitSuite self) -> bool
+
+        bool FitSuite::isLastIteration() const
+
+        if the last iteration is done (used by observers to print summary) 
+
+        """
+        return _libBornAgainCore.FitSuite_isLastIteration(self)
+
+
+    def numberOfIterations(self):
+        """
+        numberOfIterations(FitSuite self) -> size_t
+
+        size_t FitSuite::numberOfIterations() const
+
+        Returns current number of minimization function calls. 
+
+        """
+        return _libBornAgainCore.FitSuite_numberOfIterations(self)
+
+
+    def currentStrategyIndex(self):
+        """
+        currentStrategyIndex(FitSuite self) -> size_t
+
+        size_t FitSuite::currentStrategyIndex() const
+
+        Returns the number of current strategy. 
+
+        """
+        return _libBornAgainCore.FitSuite_currentStrategyIndex(self)
+
+
+    def printResults(self):
+        """
+        printResults(FitSuite self)
+
+        void FitSuite::printResults() const
+
+        Prints results of the minimization to the standard output. 
+
+        """
+        return _libBornAgainCore.FitSuite_printResults(self)
+
+
+    def reportResults(self):
+        """
+        reportResults(FitSuite self) -> std::string
+
+        std::string FitSuite::reportResults() const
+
+        Reports results of minimization in the form of multi-line string. 
+
+        """
+        return _libBornAgainCore.FitSuite_reportResults(self)
+
+
+    def getChi2(self):
+        """
+        getChi2(FitSuite self) -> double
+
+        double FitSuite::getChi2() const
+
+        Returns minimum chi squared value found. 
+
+        """
+        return _libBornAgainCore.FitSuite_getChi2(self)
+
+
+    def interruptFitting(self):
+        """
+        interruptFitting(FitSuite self)
+
+        void FitSuite::interruptFitting()
+
+        """
+        return _libBornAgainCore.FitSuite_interruptFitting(self)
+
+
+    def resetInterrupt(self):
+        """
+        resetInterrupt(FitSuite self)
+
+        void FitSuite::resetInterrupt()
+
+        """
+        return _libBornAgainCore.FitSuite_resetInterrupt(self)
+
+
+    def isInterrupted(self):
+        """
+        isInterrupted(FitSuite self) -> bool
+
+        bool FitSuite::isInterrupted()
+
+        """
+        return _libBornAgainCore.FitSuite_isInterrupted(self)
+
+
+    def getRealOutputData(self, i_item=0):
+        """
+        getRealOutputData(FitSuite self, size_t i_item=0) -> IntensityData
+        getRealOutputData(FitSuite self) -> IntensityData
+
+        const OutputData< double > * FitSuite::getRealOutputData(size_t i_item=0) const 
+
+        """
+        return _libBornAgainCore.FitSuite_getRealOutputData(self, i_item)
+
+
+    def getSimulationOutputData(self, i_item=0):
+        """
+        getSimulationOutputData(FitSuite self, size_t i_item=0) -> IntensityData
+        getSimulationOutputData(FitSuite self) -> IntensityData
+
+        const OutputData< double > * FitSuite::getSimulationOutputData(size_t i_item=0) const 
+
+        """
+        return _libBornAgainCore.FitSuite_getSimulationOutputData(self, i_item)
+
+
+    def getChiSquaredOutputData(self, i_item=0):
+        """
+        getChiSquaredOutputData(FitSuite self, size_t i_item=0) -> IntensityData
+        getChiSquaredOutputData(FitSuite self) -> IntensityData
+
+        const OutputData< double > * FitSuite::getChiSquaredOutputData(size_t i_item=0) const 
+
+        """
+        return _libBornAgainCore.FitSuite_getChiSquaredOutputData(self, i_item)
+
+FitSuite_swigregister = _libBornAgainCore.FitSuite_swigregister
+FitSuite_swigregister(FitSuite)
+
+class FitSuiteObjects(IParameterized, INoncopyable):
+    """
+
+
+    Holds vector of  FitObject's (simulation and real data) to fit
+
+    C++ includes: FitSuiteObjects.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized, INoncopyable]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitSuiteObjects, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized, INoncopyable]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FitSuiteObjects, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(FitSuiteObjects self) -> FitSuiteObjects
+
+        FitSuiteObjects::FitSuiteObjects()
+
+        """
+        this = _libBornAgainCore.new_FitSuiteObjects()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FitSuiteObjects
+    __del__ = lambda self: None
+
+    def add(self, simulation, real_data, weight=1.0):
+        """
+        add(FitSuiteObjects self, GISASSimulation simulation, IntensityData real_data, double weight=1.0)
+        add(FitSuiteObjects self, GISASSimulation simulation, IntensityData real_data)
+
+        void FitSuiteObjects::add(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight=1.0)
+
+        Adds to kit pair of (simulation, real data) for consecutive simulation. 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_add(self, simulation, real_data, weight)
+
+
+    def getNumberOfFitObjects(self):
+        """
+        getNumberOfFitObjects(FitSuiteObjects self) -> size_t
+
+        size_t FitSuiteObjects::getNumberOfFitObjects() const
+
+        Returns number of fit objects (simulation/real data pairs) 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_getNumberOfFitObjects(self)
+
+
+    def getSizeOfDataSet(self):
+        """
+        getSizeOfDataSet(FitSuiteObjects self) -> size_t
+
+        size_t FitSuiteObjects::getSizeOfDataSet() const
+
+        Returns total number of data points (number of all non-masked channels in all fit objects)
+
+        Returns total number of data points. 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_getSizeOfDataSet(self)
+
+
+    def setChiSquaredModule(self, chi2_module):
+        """
+        setChiSquaredModule(FitSuiteObjects self, IChiSquaredModule chi2_module)
+
+        void FitSuiteObjects::setChiSquaredModule(const IChiSquaredModule &chi2_module)
+
+        Replaces default  ChiSquaredModule with new one. 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_setChiSquaredModule(self, chi2_module)
+
+
+    def getRealData(self, i_item=0):
+        """
+        getRealData(FitSuiteObjects self, size_t i_item=0) -> IntensityData
+        getRealData(FitSuiteObjects self) -> IntensityData
+
+        const OutputData< double > & FitSuiteObjects::getRealData(size_t i_item=0) const
+
+        Returns real data from corresponding  FitObject
+
+        Parameters:
+        -----------
+
+        i_item: 
+        Index of  FitObject
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_getRealData(self, i_item)
+
+
+    def getSimulationData(self, i_item=0):
+        """
+        getSimulationData(FitSuiteObjects self, size_t i_item=0) -> IntensityData
+        getSimulationData(FitSuiteObjects self) -> IntensityData
+
+        const OutputData< double > & FitSuiteObjects::getSimulationData(size_t i_item=0) const
+
+        Returns simulated data from corresponding  FitObject
+
+        Parameters:
+        -----------
+
+        i_item: 
+        Index of  FitObject
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_getSimulationData(self, i_item)
+
+
+    def getChiSquaredMap(self, i_item=0):
+        """
+        getChiSquaredMap(FitSuiteObjects self, size_t i_item=0) -> IntensityData
+        getChiSquaredMap(FitSuiteObjects self) -> IntensityData
+
+        const OutputData< double > & FitSuiteObjects::getChiSquaredMap(size_t i_item=0) const
+
+        Returns new chi-squared map from corresponding  FitObject
+
+        Parameters:
+        -----------
+
+        i_item: 
+        Index of  FitObject
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_getChiSquaredMap(self, i_item)
+
+
+    def runSimulations(self):
+        """
+        runSimulations(FitSuiteObjects self)
+
+        void FitSuiteObjects::runSimulations()
+
+        run all simulation defined in fit pairs
+
+        loop through all defined simulations and run them 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_runSimulations(self)
+
+
+    def getChiSquaredValue(self):
+        """
+        getChiSquaredValue(FitSuiteObjects self) -> double
+
+        double FitSuiteObjects::getChiSquaredValue() const
+
+        Returns chi2 calculated over whole dataset. 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_getChiSquaredValue(self)
+
+
+    def getResidualValue(self, global_index):
+        """
+        getResidualValue(FitSuiteObjects self, size_t global_index) -> double
+
+        double FitSuiteObjects::getResidualValue(size_t global_index)
+
+        Returns residuals for single data element
+
+        Parameters:
+        -----------
+
+        global_index: 
+        index accross all element in  FitElement vector 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_getResidualValue(self, global_index)
+
+
+    def setNfreeParameters(self, nfree_parameters):
+        """
+        setNfreeParameters(FitSuiteObjects self, int nfree_parameters)
+
+        void FitSuiteObjects::setNfreeParameters(int nfree_parameters)
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_setNfreeParameters(self, nfree_parameters)
+
+
+    def clear(self):
+        """
+        clear(FitSuiteObjects self)
+
+        void FitSuiteObjects::clear()
+
+        clear all data 
+
+        """
+        return _libBornAgainCore.FitSuiteObjects_clear(self)
+
+FitSuiteObjects_swigregister = _libBornAgainCore.FitSuiteObjects_swigregister
+FitSuiteObjects_swigregister(FitSuiteObjects)
+
+
+def StandardNormal(x):
+    """
+    StandardNormal(double x) -> double
+
+    double MathFunctions::StandardNormal(double x)
+
+    """
+    return _libBornAgainCore.StandardNormal(x)
+
+def Gaussian(x, average, std_dev):
+    """
+    Gaussian(double x, double average, double std_dev) -> double
+
+    double MathFunctions::Gaussian(double x, double average, double std_dev)
+
+    """
+    return _libBornAgainCore.Gaussian(x, average, std_dev)
+
+def IntegratedGaussian(x, average, std_dev):
+    """
+    IntegratedGaussian(double x, double average, double std_dev) -> double
+
+    double MathFunctions::IntegratedGaussian(double x, double average, double std_dev)
+
+    """
+    return _libBornAgainCore.IntegratedGaussian(x, average, std_dev)
+
+def cot(x):
+    """
+    cot(double x) -> double
+
+    double MathFunctions::cot(double x)
+
+    cotangent function:  $cot(x)\\equiv1/tan(x)$
+
+    """
+    return _libBornAgainCore.cot(x)
+
+def Si(x):
+    """
+    Si(double x) -> double
+
+    double MathFunctions::Si(double x)
+
+    Sine integral function:  $Si(x)\\equiv\\int_0^x du \\sin(u)/u$. 
+
+    """
+    return _libBornAgainCore.Si(x)
+
+def sinc(*args):
+    """
+    sinc(double x) -> double
+    sinc(complex_t const z) -> complex_t
+
+    complex_t MathFunctions::sinc(const complex_t z)
+
+    Complex sinc function:  $sinc(x)\\equiv\\sin(x)/x$. 
+
+    """
+    return _libBornAgainCore.sinc(*args)
+
+def tanhc(z):
+    """
+    tanhc(complex_t const z) -> complex_t
+
+    complex_t MathFunctions::tanhc(const complex_t z)
+
+    Complex tanhc function:  $tanhc(x)\\equiv\\tanh(x)/x$. 
+
+    """
+    return _libBornAgainCore.tanhc(z)
+
+def Laue(z, N):
+    """
+    Laue(complex_t const z, size_t N) -> complex_t
+
+    complex_t MathFunctions::Laue(const complex_t z, size_t N)
+
+    """
+    return _libBornAgainCore.Laue(z, N)
+
+def Bessel_J0(*args):
+    """
+    Bessel_J0(double x) -> double
+    Bessel_J0(complex_t const z) -> complex_t
+
+    complex_t MathFunctions::Bessel_J0(const complex_t z)
+
+    Complex Bessel function of the first kind and order 0. 
+
+    """
+    return _libBornAgainCore.Bessel_J0(*args)
+
+def Bessel_J1(*args):
+    """
+    Bessel_J1(double x) -> double
+    Bessel_J1(complex_t const z) -> complex_t
+
+    complex_t MathFunctions::Bessel_J1(const complex_t z)
+
+    Complex Bessel function of the first kind and order 1. 
+
+    """
+    return _libBornAgainCore.Bessel_J1(*args)
+
+def Bessel_J1c(*args):
+    """
+    Bessel_J1c(double x) -> double
+    Bessel_J1c(complex_t const z) -> complex_t
+
+    complex_t MathFunctions::Bessel_J1c(const complex_t z)
+
+    Complex Bessel function Bessel_J1(x)/x. 
+
+    """
+    return _libBornAgainCore.Bessel_J1c(*args)
+
+_libBornAgainCore.FORWARD_FFT_swigconstant(_libBornAgainCore)
+FORWARD_FFT = _libBornAgainCore.FORWARD_FFT
+
+_libBornAgainCore.BACKWARD_FFT_swigconstant(_libBornAgainCore)
+BACKWARD_FFT = _libBornAgainCore.BACKWARD_FFT
+
+def FastFourierTransform(*args):
+    """
+    FastFourierTransform(vector_complex_t data, MathFunctions::EFFTDirection tcase) -> vector_complex_t
+    FastFourierTransform(vdouble1d_t data, MathFunctions::EFFTDirection tcase) -> vector_complex_t
+
+    std::vector< complex_t > MathFunctions::FastFourierTransform(const std::vector< double > &data, EFFTDirection tcase)
+
+    simple (and unoptimized) wrapper function for the discrete fast Fourier transformation library (fftw3); transforms real to complex 
+
+    """
+    return _libBornAgainCore.FastFourierTransform(*args)
+
+def ConvolveFFT(signal, resfunc):
+    """
+    ConvolveFFT(vdouble1d_t signal, vdouble1d_t resfunc) -> vector_complex_t
+
+    std::vector< complex_t > MathFunctions::ConvolveFFT(const std::vector< double > &signal, const std::vector< double > &resfunc)
+
+    convolution of two real vectors of equal size 
+
+    """
+    return _libBornAgainCore.ConvolveFFT(signal, resfunc)
+
+def GenerateUniformRandom():
+    """
+    GenerateUniformRandom() -> double
+
+    double MathFunctions::GenerateUniformRandom()
+
+    """
+    return _libBornAgainCore.GenerateUniformRandom()
+
+def GenerateStandardNormalRandom():
+    """
+    GenerateStandardNormalRandom() -> double
+
+    double MathFunctions::GenerateStandardNormalRandom()
+
+    """
+    return _libBornAgainCore.GenerateStandardNormalRandom()
+
+def GenerateNormalRandom(average, std_dev):
+    """
+    GenerateNormalRandom(double average, double std_dev) -> double
+
+    double MathFunctions::GenerateNormalRandom(double average, double std_dev)
+
+    """
+    return _libBornAgainCore.GenerateNormalRandom(average, std_dev)
+class AdjustMinimizerStrategy(IFitStrategy):
+    """
+
+
+    Strategy modifies mimimizer settings before running minimization round.
+
+    C++ includes: AdjustMinimizerStrategy.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFitStrategy]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, AdjustMinimizerStrategy, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFitStrategy]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, AdjustMinimizerStrategy, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(AdjustMinimizerStrategy self) -> AdjustMinimizerStrategy
+        __init__(AdjustMinimizerStrategy self, std::string const & minimizerName, std::string const & algorithmName, std::string const & optionString) -> AdjustMinimizerStrategy
+        __init__(AdjustMinimizerStrategy self, std::string const & minimizerName, std::string const & algorithmName) -> AdjustMinimizerStrategy
+        __init__(AdjustMinimizerStrategy self, std::string const & minimizerName) -> AdjustMinimizerStrategy
+
+        AdjustMinimizerStrategy::AdjustMinimizerStrategy(const std::string &minimizerName, const std::string &algorithmName=std::string(), const std::string &optionString=std::string())
+
+        """
+        this = _libBornAgainCore.new_AdjustMinimizerStrategy(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(AdjustMinimizerStrategy self) -> AdjustMinimizerStrategy
+
+        AdjustMinimizerStrategy * AdjustMinimizerStrategy::clone() const 
+
+        """
+        return _libBornAgainCore.AdjustMinimizerStrategy_clone(self)
+
+
+    def setMinimizer(self, *args):
+        """
+        setMinimizer(AdjustMinimizerStrategy self, std::string const & minimizerName, std::string const & algorithmName, std::string const & optionString)
+        setMinimizer(AdjustMinimizerStrategy self, std::string const & minimizerName, std::string const & algorithmName)
+        setMinimizer(AdjustMinimizerStrategy self, std::string const & minimizerName)
+
+        void AdjustMinimizerStrategy::setMinimizer(const std::string &minimizerName, const std::string &algorithmName=std::string(), const std::string &optionString=std::string())
+
+        """
+        return _libBornAgainCore.AdjustMinimizerStrategy_setMinimizer(self, *args)
+
+
+    def execute(self):
+        """
+        execute(AdjustMinimizerStrategy self)
+
+        void AdjustMinimizerStrategy::execute()
+
+        """
+        return _libBornAgainCore.AdjustMinimizerStrategy_execute(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_AdjustMinimizerStrategy
+    __del__ = lambda self: None
+AdjustMinimizerStrategy_swigregister = _libBornAgainCore.AdjustMinimizerStrategy_swigregister
+AdjustMinimizerStrategy_swigregister(AdjustMinimizerStrategy)
+
+class IMultiLayerBuilder(IParameterized):
+    """
+
+
+    Interface to the class capable to build samples to simulate.
+
+    C++ includes: IMultiLayerBuilder.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IMultiLayerBuilder, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IMultiLayerBuilder, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(IMultiLayerBuilder self) -> IMultiLayerBuilder
+
+        IMultiLayerBuilder::IMultiLayerBuilder()
+
+        """
+        if self.__class__ == IMultiLayerBuilder:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_IMultiLayerBuilder(_self, )
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IMultiLayerBuilder
+    __del__ = lambda self: None
+
+    def buildSample(self):
+        """
+        buildSample(IMultiLayerBuilder self) -> MultiLayer
+
+        virtual MultiLayer* IMultiLayerBuilder::buildSample() const =0
+
+        """
+        return _libBornAgainCore.IMultiLayerBuilder_buildSample(self)
+
+
+    def set_subtest(self, subtest_item):
+        """
+        set_subtest(IMultiLayerBuilder self, IParameterized subtest_item)
+
+        void IMultiLayerBuilder::set_subtest(const IParameterized *subtest_item)
+
+        """
+        return _libBornAgainCore.IMultiLayerBuilder_set_subtest(self, subtest_item)
+
+    __swig_setmethods__["m_subtest_item"] = _libBornAgainCore.IMultiLayerBuilder_m_subtest_item_set
+    __swig_getmethods__["m_subtest_item"] = _libBornAgainCore.IMultiLayerBuilder_m_subtest_item_get
+    if _newclass:
+        m_subtest_item = _swig_property(_libBornAgainCore.IMultiLayerBuilder_m_subtest_item_get, _libBornAgainCore.IMultiLayerBuilder_m_subtest_item_set)
+
+    def getFormFactor(self):
+        """
+        getFormFactor(IMultiLayerBuilder self) -> IFormFactor
+
+        const IFormFactor * IMultiLayerBuilder::getFormFactor() const 
+
+        """
+        return _libBornAgainCore.IMultiLayerBuilder_getFormFactor(self)
+
+
+    def getFTDistribution2D(self):
+        """
+        getFTDistribution2D(IMultiLayerBuilder self) -> IFTDistribution2D
+
+        const IFTDistribution2D * IMultiLayerBuilder::getFTDistribution2D() const 
+
+        """
+        return _libBornAgainCore.IMultiLayerBuilder_getFTDistribution2D(self)
+
+
+    def registerParameter(self, name, parpointer):
+        """registerParameter(IMultiLayerBuilder self, std::string const & name, int64_t parpointer) -> RealParameter"""
+        return _libBornAgainCore.IMultiLayerBuilder_registerParameter(self, name, parpointer)
+
+
+    def setParameterValue(self, name, value):
+        """setParameterValue(IMultiLayerBuilder self, std::string const & name, double value)"""
+        return _libBornAgainCore.IMultiLayerBuilder_setParameterValue(self, name, value)
+
+
+    def isPythonBuilder():
+        """
+        isPythonBuilder() -> bool
+
+        bool IMultiLayerBuilder::isPythonBuilder() const 
+
+        """
+        return _libBornAgainCore.IMultiLayerBuilder_isPythonBuilder()
+
+    if _newclass:
+        isPythonBuilder = staticmethod(isPythonBuilder)
+    __swig_getmethods__["isPythonBuilder"] = lambda x: isPythonBuilder
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_IMultiLayerBuilder(self)
+        return weakref_proxy(self)
+
+    def onChange(self):
+        """onChange(IMultiLayerBuilder self)"""
+        return _libBornAgainCore.IMultiLayerBuilder_onChange(self)
+
+
+    def _print(self, ostr):
+        """_print(IMultiLayerBuilder self, std::ostream & ostr)"""
+        return _libBornAgainCore.IMultiLayerBuilder__print(self, ostr)
+
+IMultiLayerBuilder_swigregister = _libBornAgainCore.IMultiLayerBuilder_swigregister
+IMultiLayerBuilder_swigregister(IMultiLayerBuilder)
+
+def IMultiLayerBuilder_isPythonBuilder():
+    """
+    IMultiLayerBuilder_isPythonBuilder() -> bool
+
+    bool IMultiLayerBuilder::isPythonBuilder() const 
+
+    """
+    return _libBornAgainCore.IMultiLayerBuilder_isPythonBuilder()
+
+class ISampleVisitor(_object):
+    """
+
+
+    From visitor pattern to achieve double dispatch.
+
+    Visitor interface to visit  ISample objects.
+
+    C++ includes: ISampleVisitor.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ISampleVisitor, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, ISampleVisitor, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(ISampleVisitor self) -> ISampleVisitor
+
+        ISampleVisitor::ISampleVisitor()
+
+        """
+        this = _libBornAgainCore.new_ISampleVisitor()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ISampleVisitor
+    __del__ = lambda self: None
+
+    def visit(self, *args):
+        """
+        visit(ISampleVisitor self, ISample arg2)
+        visit(ISampleVisitor self, ICompositeSample arg2)
+        visit(ISampleVisitor self, IClusteredParticles arg2)
+        visit(ISampleVisitor self, Crystal arg2)
+        visit(ISampleVisitor self, ILayout arg2)
+        visit(ISampleVisitor self, ParticleLayout arg2)
+        visit(ISampleVisitor self, Layer arg2)
+        visit(ISampleVisitor self, LayerInterface const * arg2)
+        visit(ISampleVisitor self, MultiLayer arg2)
+        visit(ISampleVisitor self, IAbstractParticle arg2)
+        visit(ISampleVisitor self, IParticle arg2)
+        visit(ISampleVisitor self, Particle arg2)
+        visit(ISampleVisitor self, ParticleDistribution arg2)
+        visit(ISampleVisitor self, ParticleComposition arg2)
+        visit(ISampleVisitor self, MesoCrystal arg2)
+        visit(ISampleVisitor self, ParticleCoreShell arg2)
+        visit(ISampleVisitor self, IFormFactor arg2)
+        visit(ISampleVisitor self, IFormFactorBorn arg2)
+        visit(ISampleVisitor self, IFormFactorDecorator arg2)
+        visit(ISampleVisitor self, FormFactorAnisoPyramid arg2)
+        visit(ISampleVisitor self, FormFactorBox arg2)
+        visit(ISampleVisitor self, FormFactorCone arg2)
+        visit(ISampleVisitor self, FormFactorCone6 arg2)
+        visit(ISampleVisitor self, FormFactorCuboctahedron arg2)
+        visit(ISampleVisitor self, FormFactorCrystal arg2)
+        visit(ISampleVisitor self, FormFactorCylinder arg2)
+        visit(ISampleVisitor self, FormFactorDodecahedron arg2)
+        visit(ISampleVisitor self, FormFactorEllipsoidalCylinder arg2)
+        visit(ISampleVisitor self, FormFactorFullSphere arg2)
+        visit(ISampleVisitor self, FormFactorFullSpheroid arg2)
+        visit(ISampleVisitor self, FormFactorGauss arg2)
+        visit(ISampleVisitor self, FormFactorHemiEllipsoid arg2)
+        visit(ISampleVisitor self, FormFactorIcosahedron arg2)
+        visit(ISampleVisitor self, FormFactorLongBoxGauss arg2)
+        visit(ISampleVisitor self, FormFactorLongBoxLorentz arg2)
+        visit(ISampleVisitor self, FormFactorLorentz arg2)
+        visit(ISampleVisitor self, FormFactorPrism3 arg2)
+        visit(ISampleVisitor self, FormFactorPrism6 arg2)
+        visit(ISampleVisitor self, FormFactorPyramid arg2)
+        visit(ISampleVisitor self, FormFactorRipple1 arg2)
+        visit(ISampleVisitor self, FormFactorRipple2 arg2)
+        visit(ISampleVisitor self, FormFactorSphereGaussianRadius arg2)
+        visit(ISampleVisitor self, FormFactorSphereLogNormalRadius arg2)
+        visit(ISampleVisitor self, FormFactorTetrahedron arg2)
+        visit(ISampleVisitor self, FormFactorTrivial arg2)
+        visit(ISampleVisitor self, FormFactorTruncatedCube arg2)
+        visit(ISampleVisitor self, FormFactorTruncatedSphere arg2)
+        visit(ISampleVisitor self, FormFactorTruncatedSpheroid arg2)
+        visit(ISampleVisitor self, FormFactorWeighted arg2)
+        visit(ISampleVisitor self, FormFactorDecoratorDebyeWaller arg2)
+        visit(ISampleVisitor self, FormFactorDecoratorFactor const * arg2)
+        visit(ISampleVisitor self, FormFactorDecoratorMaterial const * arg2)
+        visit(ISampleVisitor self, FormFactorDecoratorPositionFactor const * arg2)
+        visit(ISampleVisitor self, FormFactorDecoratorRotation const * arg2)
+        visit(ISampleVisitor self, IInterferenceFunction arg2)
+        visit(ISampleVisitor self, InterferenceFunction1DLattice arg2)
+        visit(ISampleVisitor self, InterferenceFunctionRadialParaCrystal arg2)
+        visit(ISampleVisitor self, InterferenceFunction2DLattice arg2)
+        visit(ISampleVisitor self, InterferenceFunction2DParaCrystal arg2)
+        visit(ISampleVisitor self, InterferenceFunctionNone arg2)
+        visit(ISampleVisitor self, IRoughness arg2)
+        visit(ISampleVisitor self, LayerRoughness arg2)
+        visit(ISampleVisitor self, IRotation arg2)
+        visit(ISampleVisitor self, RotationX arg2)
+        visit(ISampleVisitor self, RotationY arg2)
+        visit(ISampleVisitor self, RotationZ arg2)
+        visit(ISampleVisitor self, RotationEuler arg2)
+
+        void ISampleVisitor::visit(const RotationEuler *)
+
+        """
+        return _libBornAgainCore.ISampleVisitor_visit(self, *args)
+
+
+    def visitEnter(self, arg2):
+        """
+        visitEnter(ISampleVisitor self, ICompositeSample arg2) -> bool
+
+        bool ISampleVisitor::visitEnter(const ICompositeSample *)
+
+        """
+        return _libBornAgainCore.ISampleVisitor_visitEnter(self, arg2)
+
+
+    def visitLeave(self, arg2):
+        """
+        visitLeave(ISampleVisitor self, ICompositeSample arg2) -> bool
+
+        bool ISampleVisitor::visitLeave(const ICompositeSample *)
+
+        """
+        return _libBornAgainCore.ISampleVisitor_visitLeave(self, arg2)
+
+
+    def getLevel(self):
+        """
+        getLevel(ISampleVisitor self) -> int
+
+        int ISampleVisitor::getLevel() const
+
+        return current level of the visitor in the composite hierarchy 
+
+        """
+        return _libBornAgainCore.ISampleVisitor_getLevel(self)
+
+
+    def setLevel(self, level):
+        """
+        setLevel(ISampleVisitor self, int level)
+
+        void ISampleVisitor::setLevel(int level)
+
+        set current level of the visitor in the composite hierarchy 
+
+        """
+        return _libBornAgainCore.ISampleVisitor_setLevel(self, level)
+
+ISampleVisitor_swigregister = _libBornAgainCore.ISampleVisitor_swigregister
+ISampleVisitor_swigregister(ISampleVisitor)
+
+
+def VisitSampleTreePreorder(sample, visitor):
+    """
+    VisitSampleTreePreorder(ISample sample, ISampleVisitor visitor)
+
+    BA_CORE_API_ void VisitSampleTreePreorder(const ISample &sample, ISampleVisitor &visitor)
+
+    """
+    return _libBornAgainCore.VisitSampleTreePreorder(sample, visitor)
+
+def VisitSampleTreePostorder(sample, visitor):
+    """
+    VisitSampleTreePostorder(ISample sample, ISampleVisitor visitor)
+
+    BA_CORE_API_ void VisitSampleTreePostorder(const ISample &sample, ISampleVisitor &visitor)
+
+    """
+    return _libBornAgainCore.VisitSampleTreePostorder(sample, visitor)
+class ICompositeSample(ISample):
+    """
+
+
+    Pure virtual base class for tree-like composite samples.
+
+    Inherited by  IAbstractParticle, IClusteredParticle,  ILayout, ILayer, IMultiLayer.
+
+    C++ includes: ICompositeSample.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ICompositeSample, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ICompositeSample, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_ICompositeSample
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ICompositeSample self) -> ICompositeSample
+
+        virtual ICompositeSample* ICompositeSample::clone() const =0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.ICompositeSample_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(ICompositeSample self, ISampleVisitor visitor)
+
+        virtual void ICompositeSample::accept(ISampleVisitor *visitor) const =0
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.ICompositeSample_accept(self, visitor)
+
+
+    def registerChild(self, sample):
+        """
+        registerChild(ICompositeSample self, ISample sample)
+
+        void ICompositeSample::registerChild(ISample *sample)
+
+        Registers child in the container. 
+
+        """
+        return _libBornAgainCore.ICompositeSample_registerChild(self, sample)
+
+
+    def deregisterChild(self, sample):
+        """
+        deregisterChild(ICompositeSample self, ISample sample)
+
+        void ICompositeSample::deregisterChild(ISample *sample)
+
+        Removes registered child from the container.
+
+        remove registered child from the container 
+
+        """
+        return _libBornAgainCore.ICompositeSample_deregisterChild(self, sample)
+
+
+    def getChildren(self):
+        """
+        getChildren(ICompositeSample self) -> swig_dummy_type_const_isample_vector
+
+        std::vector< const ISample * > ICompositeSample::getChildren() const final
+
+        Returns a vector of children (const). 
+
+        """
+        return _libBornAgainCore.ICompositeSample_getChildren(self)
+
+
+    def size(self):
+        """
+        size(ICompositeSample self) -> size_t
+
+        size_t ICompositeSample::size() const final
+
+        Returns number of children. 
+
+        """
+        return _libBornAgainCore.ICompositeSample_size(self)
+
+ICompositeSample_swigregister = _libBornAgainCore.ICompositeSample_swigregister
+ICompositeSample_swigregister(ICompositeSample)
+
+class IClusteredParticles(ICompositeSample):
+    """
+
+
+    An ordered assembly of particles. Currently, the only child class is  Crystal.
+
+    C++ includes: IClusteredParticles.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IClusteredParticles, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IClusteredParticles, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(IClusteredParticles self) -> IClusteredParticles
+
+        virtual IClusteredParticles* IClusteredParticles::clone() const =0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IClusteredParticles_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(IClusteredParticles self) -> IClusteredParticles
+
+        virtual IClusteredParticles* IClusteredParticles::cloneInvertB() const =0
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.IClusteredParticles_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(IClusteredParticles self, ISampleVisitor visitor)
+
+        virtual void IClusteredParticles::accept(ISampleVisitor *visitor) const =0
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.IClusteredParticles_accept(self, visitor)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(IClusteredParticles self, IMaterial material)
+
+        virtual void IClusteredParticles::setAmbientMaterial(const IMaterial &material)=0
+
+        """
+        return _libBornAgainCore.IClusteredParticles_setAmbientMaterial(self, material)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(IClusteredParticles self) -> IMaterial
+
+        virtual const IMaterial* IClusteredParticles::getAmbientMaterial() const =0
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.IClusteredParticles_getAmbientMaterial(self)
+
+
+    def createTotalFormFactor(self, arg2, arg3, arg4):
+        """
+        createTotalFormFactor(IClusteredParticles self, IFormFactor arg2, IRotation arg3, kvector_t arg4) -> IFormFactor
+
+        virtual IFormFactor* IClusteredParticles::createTotalFormFactor(const IFormFactor &, const IRotation *, const kvector_t &) const =0
+
+        Creates a total form factor for the mesocrystal with a specific shape and content The bulk content of the mesocrystal is encapsulated by the  IClusteredParticles object itself 
+
+        """
+        return _libBornAgainCore.IClusteredParticles_createTotalFormFactor(self, arg2, arg3, arg4)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IClusteredParticles
+    __del__ = lambda self: None
+IClusteredParticles_swigregister = _libBornAgainCore.IClusteredParticles_swigregister
+IClusteredParticles_swigregister(IClusteredParticles)
+
+class Crystal(IClusteredParticles):
+    """
+
+
+    A crystal structure with a  ParticleComposition as a basis. Used in  MesoCrystal, where it is given an outer shape.
+
+    C++ includes: Crystal.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IClusteredParticles]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Crystal, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IClusteredParticles]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Crystal, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, lattice_basis, lattice):
+        """
+        __init__(Crystal self, ParticleComposition lattice_basis, Lattice lattice) -> Crystal
+
+        Crystal::Crystal(const ParticleComposition &lattice_basis, const Lattice &lattice)
+
+        """
+        this = _libBornAgainCore.new_Crystal(lattice_basis, lattice)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_Crystal
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(Crystal self) -> Crystal
+
+        Crystal * Crystal::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.Crystal_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(Crystal self) -> Crystal
+
+        Crystal * Crystal::cloneInvertB() const final
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.Crystal_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(Crystal self, ISampleVisitor visitor)
+
+        void Crystal::accept(ISampleVisitor *visitor) const final
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.Crystal_accept(self, visitor)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(Crystal self, IMaterial material)
+
+        void Crystal::setAmbientMaterial(const IMaterial &material) final
+
+        """
+        return _libBornAgainCore.Crystal_setAmbientMaterial(self, material)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(Crystal self) -> IMaterial
+
+        const IMaterial * Crystal::getAmbientMaterial() const final
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.Crystal_getAmbientMaterial(self)
+
+
+    def createTotalFormFactor(self, meso_crystal_form_factor, p_rotation, translation):
+        """
+        createTotalFormFactor(Crystal self, IFormFactor meso_crystal_form_factor, IRotation p_rotation, kvector_t translation) -> IFormFactor
+
+        IFormFactor * Crystal::createTotalFormFactor(const IFormFactor &meso_crystal_form_factor, const IRotation *p_rotation, const kvector_t &translation) const
+
+        Creates a total form factor for the mesocrystal with a specific shape and content The bulk content of the mesocrystal is encapsulated by the  IClusteredParticles object itself 
+
+        """
+        return _libBornAgainCore.Crystal_createTotalFormFactor(self, meso_crystal_form_factor, p_rotation, translation)
+
+
+    def getLatticeBasis(self):
+        """
+        getLatticeBasis(Crystal self) -> ParticleComposition
+
+        const ParticleComposition* Crystal::getLatticeBasis() const 
+
+        """
+        return _libBornAgainCore.Crystal_getLatticeBasis(self)
+
+
+    def setDWFactor(self, dw_factor):
+        """
+        setDWFactor(Crystal self, double dw_factor)
+
+        void Crystal::setDWFactor(double dw_factor)
+
+        """
+        return _libBornAgainCore.Crystal_setDWFactor(self, dw_factor)
+
+Crystal_swigregister = _libBornAgainCore.Crystal_swigregister
+Crystal_swigregister(Crystal)
+
+class IDistribution1D(IParameterized):
+    """
+
+
+    Interface for 1 dimensional distributions.
+
+    C++ includes: Distributions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IDistribution1D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IDistribution1D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IDistribution1D
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IDistribution1D self) -> IDistribution1D
+
+        IDistribution1D * IDistribution1D::clone() const 
+
+        """
+        return _libBornAgainCore.IDistribution1D_clone(self)
+
+
+    def probabilityDensity(self, x):
+        """
+        probabilityDensity(IDistribution1D self, double x) -> double
+
+        virtual double IDistribution1D::probabilityDensity(double x) const =0
+
+        get the probability density for value x 
+
+        """
+        return _libBornAgainCore.IDistribution1D_probabilityDensity(self, x)
+
+
+    def getMean(self):
+        """
+        getMean(IDistribution1D self) -> double
+
+        virtual double IDistribution1D::getMean() const =0
+
+        get the mean of the distribution 
+
+        """
+        return _libBornAgainCore.IDistribution1D_getMean(self)
+
+
+    def generateSamples(self, *args):
+        """
+        generateSamples(IDistribution1D self, size_t nbr_samples, double sigma_factor=0.0, RealLimits limits) -> std::vector< ParameterSample,std::allocator< ParameterSample > >
+        generateSamples(IDistribution1D self, size_t nbr_samples, double sigma_factor=0.0) -> std::vector< ParameterSample,std::allocator< ParameterSample > >
+        generateSamples(IDistribution1D self, size_t nbr_samples) -> std::vector< ParameterSample,std::allocator< ParameterSample > >
+        generateSamples(IDistribution1D self, size_t nbr_samples, double xmin, double xmax) -> std::vector< ParameterSample,std::allocator< ParameterSample > >
+
+        std::vector< ParameterSample > IDistribution1D::generateSamples(size_t nbr_samples, double xmin, double xmax) const
+
+        generate list of sampled values with their weight within given xmin, xmax 
+
+        """
+        return _libBornAgainCore.IDistribution1D_generateSamples(self, *args)
+
+
+    def generateValueList(self, *args):
+        """
+        generateValueList(IDistribution1D self, size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t
+        generateValueList(IDistribution1D self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t
+
+        virtual std::vector<double> IDistribution1D::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const =0
+
+        generate list of sample values
+
+        Parameters:
+        -----------
+
+        nbr_samples: 
+        number of values to generate
+
+        sigma_factor: 
+        parameter to derive min,max range for sample values
+
+        limits:
+
+        vector of generated values 
+
+        """
+        return _libBornAgainCore.IDistribution1D_generateValueList(self, *args)
+
+
+    def generateValues(self, nbr_samples, xmin, xmax):
+        """
+        generateValues(IDistribution1D self, size_t nbr_samples, double xmin, double xmax) -> vdouble1d_t
+
+        std::vector< double > IDistribution1D::generateValues(size_t nbr_samples, double xmin, double xmax) const
+
+        Interface.
+
+        generate list of sample values
+
+        Parameters:
+        -----------
+
+        nbr_samples: 
+        number of values to generate
+
+        xmin: 
+        xmax: 
+        start and end value of the generated samples
+
+        vector of generated values 
+
+        """
+        return _libBornAgainCore.IDistribution1D_generateValues(self, nbr_samples, xmin, xmax)
+
+
+    def getMeanSample(self):
+        """
+        getMeanSample(IDistribution1D self) -> ParameterSample
+
+        ParameterSample IDistribution1D::getMeanSample() const
+
+        generate a single sample containing the mean value and weight 1 
+
+        """
+        return _libBornAgainCore.IDistribution1D_getMeanSample(self)
+
+
+    def isDelta(self):
+        """
+        isDelta(IDistribution1D self) -> bool
+
+        virtual bool IDistribution1D::isDelta() const =0
+
+        signals that the distribution is in the limit case of a delta distribution 
+
+        """
+        return _libBornAgainCore.IDistribution1D_isDelta(self)
+
+IDistribution1D_swigregister = _libBornAgainCore.IDistribution1D_swigregister
+IDistribution1D_swigregister(IDistribution1D)
+
+class DistributionGate(IDistribution1D):
+    """
+
+
+    Uniform distribution function with half width hwhm.
+
+    C++ includes: Distributions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, DistributionGate, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, DistributionGate, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(DistributionGate self) -> DistributionGate
+        __init__(DistributionGate self, double min, double max) -> DistributionGate
+
+        DistributionGate::DistributionGate(double min, double max)
+
+        """
+        this = _libBornAgainCore.new_DistributionGate(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionGate
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(DistributionGate self) -> DistributionGate
+
+        virtual DistributionGate* DistributionGate::clone() const
+
+        clone method 
+
+        """
+        return _libBornAgainCore.DistributionGate_clone(self)
+
+
+    def probabilityDensity(self, x):
+        """
+        probabilityDensity(DistributionGate self, double x) -> double
+
+        double DistributionGate::probabilityDensity(double x) const
+
+        get the probability density for value x 
+
+        """
+        return _libBornAgainCore.DistributionGate_probabilityDensity(self, x)
+
+
+    def getMean(self):
+        """
+        getMean(DistributionGate self) -> double
+
+        virtual double DistributionGate::getMean() const
+
+        get the mean of the distribution 
+
+        """
+        return _libBornAgainCore.DistributionGate_getMean(self)
+
+
+    def getMin(self):
+        """
+        getMin(DistributionGate self) -> double
+
+        double DistributionGate::getMin() const
+
+        Returns the minimum value of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionGate_getMin(self)
+
+
+    def getMax(self):
+        """
+        getMax(DistributionGate self) -> double
+
+        double DistributionGate::getMax() const
+
+        Returns the maximum value of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionGate_getMax(self)
+
+
+    def generateValueList(self, *args):
+        """
+        generateValueList(DistributionGate self, size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t
+        generateValueList(DistributionGate self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t
+
+        std::vector< double > DistributionGate::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+        Returns list of sample values. 
+
+        """
+        return _libBornAgainCore.DistributionGate_generateValueList(self, *args)
+
+
+    def isDelta(self):
+        """
+        isDelta(DistributionGate self) -> bool
+
+        bool DistributionGate::isDelta() const
+
+        signals that the distribution is in the limit case of a delta distribution 
+
+        """
+        return _libBornAgainCore.DistributionGate_isDelta(self)
+
+DistributionGate_swigregister = _libBornAgainCore.DistributionGate_swigregister
+DistributionGate_swigregister(DistributionGate)
+
+class DistributionLorentz(IDistribution1D):
+    """
+
+
+    Lorentz distribution with half width hwhm.
+
+    C++ includes: Distributions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, DistributionLorentz, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, DistributionLorentz, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(DistributionLorentz self) -> DistributionLorentz
+        __init__(DistributionLorentz self, double mean, double hwhm) -> DistributionLorentz
+
+        DistributionLorentz::DistributionLorentz(double mean, double hwhm)
+
+        """
+        this = _libBornAgainCore.new_DistributionLorentz(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionLorentz
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(DistributionLorentz self) -> DistributionLorentz
+
+        virtual DistributionLorentz* DistributionLorentz::clone() const 
+
+        """
+        return _libBornAgainCore.DistributionLorentz_clone(self)
+
+
+    def probabilityDensity(self, x):
+        """
+        probabilityDensity(DistributionLorentz self, double x) -> double
+
+        double DistributionLorentz::probabilityDensity(double x) const
+
+        get the probability density for value x 
+
+        """
+        return _libBornAgainCore.DistributionLorentz_probabilityDensity(self, x)
+
+
+    def getMean(self):
+        """
+        getMean(DistributionLorentz self) -> double
+
+        virtual double DistributionLorentz::getMean() const
+
+        Returns the mean of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionLorentz_getMean(self)
+
+
+    def getHWHM(self):
+        """
+        getHWHM(DistributionLorentz self) -> double
+
+        double DistributionLorentz::getHWHM() const
+
+        Returns the half width at half maximum. 
+
+        """
+        return _libBornAgainCore.DistributionLorentz_getHWHM(self)
+
+
+    def generateValueList(self, *args):
+        """
+        generateValueList(DistributionLorentz self, size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t
+        generateValueList(DistributionLorentz self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t
+
+        std::vector< double > DistributionLorentz::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+        generate list of sample values 
+
+        """
+        return _libBornAgainCore.DistributionLorentz_generateValueList(self, *args)
+
+
+    def isDelta(self):
+        """
+        isDelta(DistributionLorentz self) -> bool
+
+        bool DistributionLorentz::isDelta() const
+
+        signals that the distribution is in the limit case of a delta distribution 
+
+        """
+        return _libBornAgainCore.DistributionLorentz_isDelta(self)
+
+DistributionLorentz_swigregister = _libBornAgainCore.DistributionLorentz_swigregister
+DistributionLorentz_swigregister(DistributionLorentz)
+
+class DistributionGaussian(IDistribution1D):
+    """
+
+
+    Gaussian distribution with standard deviation std_dev.
+
+    C++ includes: Distributions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, DistributionGaussian, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, DistributionGaussian, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(DistributionGaussian self) -> DistributionGaussian
+        __init__(DistributionGaussian self, double mean, double std_dev) -> DistributionGaussian
+
+        DistributionGaussian::DistributionGaussian(double mean, double std_dev)
+
+        """
+        this = _libBornAgainCore.new_DistributionGaussian(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionGaussian
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(DistributionGaussian self) -> DistributionGaussian
+
+        virtual DistributionGaussian* DistributionGaussian::clone() const
+
+        clone method 
+
+        """
+        return _libBornAgainCore.DistributionGaussian_clone(self)
+
+
+    def probabilityDensity(self, x):
+        """
+        probabilityDensity(DistributionGaussian self, double x) -> double
+
+        double DistributionGaussian::probabilityDensity(double x) const
+
+        get the probability density for value x 
+
+        """
+        return _libBornAgainCore.DistributionGaussian_probabilityDensity(self, x)
+
+
+    def getMean(self):
+        """
+        getMean(DistributionGaussian self) -> double
+
+        virtual double DistributionGaussian::getMean() const
+
+        Returns the mean of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionGaussian_getMean(self)
+
+
+    def getStdDev(self):
+        """
+        getStdDev(DistributionGaussian self) -> double
+
+        double DistributionGaussian::getStdDev() const
+
+        Returns the standard deviation. 
+
+        """
+        return _libBornAgainCore.DistributionGaussian_getStdDev(self)
+
+
+    def generateValueList(self, *args):
+        """
+        generateValueList(DistributionGaussian self, size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t
+        generateValueList(DistributionGaussian self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t
+
+        std::vector< double > DistributionGaussian::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+        generate list of sample values 
+
+        """
+        return _libBornAgainCore.DistributionGaussian_generateValueList(self, *args)
+
+
+    def isDelta(self):
+        """
+        isDelta(DistributionGaussian self) -> bool
+
+        bool DistributionGaussian::isDelta() const
+
+        signals that the distribution is in the limit case of a delta distribution 
+
+        """
+        return _libBornAgainCore.DistributionGaussian_isDelta(self)
+
+DistributionGaussian_swigregister = _libBornAgainCore.DistributionGaussian_swigregister
+DistributionGaussian_swigregister(DistributionGaussian)
+
+class DistributionLogNormal(IDistribution1D):
+    """
+
+
+    Log-normal distribution.
+
+    C++ includes: Distributions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, DistributionLogNormal, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, DistributionLogNormal, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(DistributionLogNormal self, double scale_param) -> DistributionLogNormal
+        __init__(DistributionLogNormal self, double median, double scale_param) -> DistributionLogNormal
+
+        DistributionLogNormal::DistributionLogNormal(double median, double scale_param)
+
+        """
+        this = _libBornAgainCore.new_DistributionLogNormal(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionLogNormal
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(DistributionLogNormal self) -> DistributionLogNormal
+
+        virtual DistributionLogNormal* DistributionLogNormal::clone() const
+
+        clone method 
+
+        """
+        return _libBornAgainCore.DistributionLogNormal_clone(self)
+
+
+    def probabilityDensity(self, x):
+        """
+        probabilityDensity(DistributionLogNormal self, double x) -> double
+
+        double DistributionLogNormal::probabilityDensity(double x) const
+
+        get the probability density for value x 
+
+        """
+        return _libBornAgainCore.DistributionLogNormal_probabilityDensity(self, x)
+
+
+    def getMean(self):
+        """
+        getMean(DistributionLogNormal self) -> double
+
+        double DistributionLogNormal::getMean() const
+
+        get the mean of the distribution 
+
+        """
+        return _libBornAgainCore.DistributionLogNormal_getMean(self)
+
+
+    def getMedian(self):
+        """
+        getMedian(DistributionLogNormal self) -> double
+
+        double DistributionLogNormal::getMedian() const
+
+        Returns the median of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionLogNormal_getMedian(self)
+
+
+    def getScalePar(self):
+        """
+        getScalePar(DistributionLogNormal self) -> double
+
+        double DistributionLogNormal::getScalePar() const
+
+        Returns the scale parameter of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionLogNormal_getScalePar(self)
+
+
+    def generateValueList(self, *args):
+        """
+        generateValueList(DistributionLogNormal self, size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t
+        generateValueList(DistributionLogNormal self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t
+
+        std::vector< double > DistributionLogNormal::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+        generate list of sample values 
+
+        """
+        return _libBornAgainCore.DistributionLogNormal_generateValueList(self, *args)
+
+
+    def isDelta(self):
+        """
+        isDelta(DistributionLogNormal self) -> bool
+
+        bool DistributionLogNormal::isDelta() const
+
+        signals that the distribution is in the limit case of a delta distribution 
+
+        """
+        return _libBornAgainCore.DistributionLogNormal_isDelta(self)
+
+DistributionLogNormal_swigregister = _libBornAgainCore.DistributionLogNormal_swigregister
+DistributionLogNormal_swigregister(DistributionLogNormal)
+
+class DistributionCosine(IDistribution1D):
+    """
+
+
+    Cosine distribution.
+
+    C++ includes: Distributions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, DistributionCosine, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, DistributionCosine, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(DistributionCosine self) -> DistributionCosine
+        __init__(DistributionCosine self, double mean, double sigma) -> DistributionCosine
+
+        DistributionCosine::DistributionCosine(double mean, double sigma)
+
+        """
+        this = _libBornAgainCore.new_DistributionCosine(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_DistributionCosine
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(DistributionCosine self) -> DistributionCosine
+
+        virtual DistributionCosine* DistributionCosine::clone() const
+
+        clone method 
+
+        """
+        return _libBornAgainCore.DistributionCosine_clone(self)
+
+
+    def probabilityDensity(self, x):
+        """
+        probabilityDensity(DistributionCosine self, double x) -> double
+
+        double DistributionCosine::probabilityDensity(double x) const
+
+        get the probability density for value x 
+
+        """
+        return _libBornAgainCore.DistributionCosine_probabilityDensity(self, x)
+
+
+    def getMean(self):
+        """
+        getMean(DistributionCosine self) -> double
+
+        virtual double DistributionCosine::getMean() const
+
+        Returns the mean of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionCosine_getMean(self)
+
+
+    def getSigma(self):
+        """
+        getSigma(DistributionCosine self) -> double
+
+        double DistributionCosine::getSigma() const
+
+        Returns the sigma parameter of the distribution. 
+
+        """
+        return _libBornAgainCore.DistributionCosine_getSigma(self)
+
+
+    def generateValueList(self, *args):
+        """
+        generateValueList(DistributionCosine self, size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t
+        generateValueList(DistributionCosine self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t
+
+        std::vector< double > DistributionCosine::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const
+
+        generate list of sample values 
+
+        """
+        return _libBornAgainCore.DistributionCosine_generateValueList(self, *args)
+
+
+    def isDelta(self):
+        """
+        isDelta(DistributionCosine self) -> bool
+
+        bool DistributionCosine::isDelta() const
+
+        signals that the distribution is in the limit case of a delta distribution 
+
+        """
+        return _libBornAgainCore.DistributionCosine_isDelta(self)
+
+DistributionCosine_swigregister = _libBornAgainCore.DistributionCosine_swigregister
+DistributionCosine_swigregister(DistributionCosine)
+
+class DetectorMask(_object):
+    """
+
+
+    Collection of detector masks.
+
+    C++ includes: DetectorMask.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, DetectorMask, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, DetectorMask, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(DetectorMask self) -> DetectorMask
+        __init__(DetectorMask self, DetectorMask other) -> DetectorMask
+
+        DetectorMask::DetectorMask(const DetectorMask &other)
+
+        """
+        this = _libBornAgainCore.new_DetectorMask(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def addMask(self, shape, mask_value):
+        """
+        addMask(DetectorMask self, IShape2D shape, bool mask_value)
+
+        void DetectorMask::addMask(const Geometry::IShape2D &shape, bool mask_value)
+
+        Add mask to the stack of detector masks. The value "true" means that the area will be excluded from the analysis.
+
+        Parameters:
+        -----------
+
+        shape: 
+        The shape of mask.
+
+        mask_value: 
+        The value of mask 
+
+        """
+        return _libBornAgainCore.DetectorMask_addMask(self, shape, mask_value)
+
+
+    def initMaskData(self, *args):
+        """
+        initMaskData(DetectorMask self, IDetector2D detector)
+        initMaskData(DetectorMask self, IntensityData data)
+
+        void DetectorMask::initMaskData(const OutputData< double > &data)
+
+        """
+        return _libBornAgainCore.DetectorMask_initMaskData(self, *args)
+
+
+    def isMasked(self, index):
+        """
+        isMasked(DetectorMask self, size_t index) -> bool
+
+        bool DetectorMask::isMasked(size_t index) const 
+
+        """
+        return _libBornAgainCore.DetectorMask_isMasked(self, index)
+
+
+    def getMaskData(self):
+        """
+        getMaskData(DetectorMask self) -> OutputData< bool > const *
+
+        const OutputData<bool>* DetectorMask::getMaskData() const 
+
+        """
+        return _libBornAgainCore.DetectorMask_getMaskData(self)
+
+
+    def createHistogram(self):
+        """
+        createHistogram(DetectorMask self) -> Histogram2D
+
+        Histogram2D * DetectorMask::createHistogram() const 
+
+        """
+        return _libBornAgainCore.DetectorMask_createHistogram(self)
+
+
+    def removeMasks(self):
+        """
+        removeMasks(DetectorMask self)
+
+        void DetectorMask::removeMasks()
+
+        remove all masks and return object to initial state 
+
+        """
+        return _libBornAgainCore.DetectorMask_removeMasks(self)
+
+
+    def hasMasks(self):
+        """
+        hasMasks(DetectorMask self) -> bool
+
+        bool DetectorMask::hasMasks() const
+
+        returns true if has masks 
+
+        """
+        return _libBornAgainCore.DetectorMask_hasMasks(self)
+
+
+    def numberOfMaskedChannels(self):
+        """
+        numberOfMaskedChannels(DetectorMask self) -> int
+
+        int DetectorMask::numberOfMaskedChannels() const 
+
+        """
+        return _libBornAgainCore.DetectorMask_numberOfMaskedChannels(self)
+
+
+    def numberOfMasks(self):
+        """
+        numberOfMasks(DetectorMask self) -> size_t
+
+        size_t DetectorMask::numberOfMasks() const 
+
+        """
+        return _libBornAgainCore.DetectorMask_numberOfMasks(self)
+
+
+    def getMaskShape(self, mask_index, mask_value):
+        """
+        getMaskShape(DetectorMask self, size_t mask_index, bool & mask_value) -> IShape2D
+
+        const Geometry::IShape2D * DetectorMask::getMaskShape(size_t mask_index, bool &mask_value) const 
+
+        """
+        return _libBornAgainCore.DetectorMask_getMaskShape(self, mask_index, mask_value)
+
+    __swig_destroy__ = _libBornAgainCore.delete_DetectorMask
+    __del__ = lambda self: None
+DetectorMask_swigregister = _libBornAgainCore.DetectorMask_swigregister
+DetectorMask_swigregister(DetectorMask)
+
+class Ellipse(IShape2D):
+    """
+
+
+    Ellipse shape.
+
+    C++ includes: Ellipse.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Ellipse, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Ellipse, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, xcenter, ycenter, xradius, yradius, theta=0.0):
+        """
+        __init__(Geometry::Ellipse self, double xcenter, double ycenter, double xradius, double yradius, double theta=0.0) -> Ellipse
+        __init__(Geometry::Ellipse self, double xcenter, double ycenter, double xradius, double yradius) -> Ellipse
+
+        Geometry::Ellipse::Ellipse(double xcenter, double ycenter, double xradius, double yradius, double theta=0.0)
+
+        Parameters:
+        -----------
+
+        xcenter: 
+        x-coordinate of  Ellipse's center
+
+        ycenter: 
+        y-coordinate of  Ellipse's center
+
+        xradius: 
+        Radius along x-axis
+
+        yradius: 
+        Radius along y-axis
+
+        theta: 
+        Angle of  Ellipse rotation in radians 
+
+        """
+        this = _libBornAgainCore.new_Ellipse(xcenter, ycenter, xradius, yradius, theta)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(Ellipse self) -> Ellipse
+
+        Ellipse* Geometry::Ellipse::clone() const 
+
+        """
+        return _libBornAgainCore.Ellipse_clone(self)
+
+
+    def contains(self, *args):
+        """
+        contains(Ellipse self, double x, double y) -> bool
+        contains(Ellipse self, Bin1D binx, Bin1D biny) -> bool
+
+        bool Geometry::Ellipse::contains(const Bin1D &binx, const Bin1D &biny) const
+
+        Returns true if area defined by two bins is inside or on border of ellipse; more precisely, if mid point of two bins satisfy this condition. 
+
+        """
+        return _libBornAgainCore.Ellipse_contains(self, *args)
+
+
+    def getCenterX(self):
+        """
+        getCenterX(Ellipse self) -> double
+
+        double Geometry::Ellipse::getCenterX() const 
+
+        """
+        return _libBornAgainCore.Ellipse_getCenterX(self)
+
+
+    def getCenterY(self):
+        """
+        getCenterY(Ellipse self) -> double
+
+        double Geometry::Ellipse::getCenterY() const 
+
+        """
+        return _libBornAgainCore.Ellipse_getCenterY(self)
+
+
+    def getRadiusX(self):
+        """
+        getRadiusX(Ellipse self) -> double
+
+        double Geometry::Ellipse::getRadiusX() const 
+
+        """
+        return _libBornAgainCore.Ellipse_getRadiusX(self)
+
+
+    def getRadiusY(self):
+        """
+        getRadiusY(Ellipse self) -> double
+
+        double Geometry::Ellipse::getRadiusY() const 
+
+        """
+        return _libBornAgainCore.Ellipse_getRadiusY(self)
+
+
+    def getTheta(self):
+        """
+        getTheta(Ellipse self) -> double
+
+        double Geometry::Ellipse::getTheta() const 
+
+        """
+        return _libBornAgainCore.Ellipse_getTheta(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_Ellipse
+    __del__ = lambda self: None
+Ellipse_swigregister = _libBornAgainCore.Ellipse_swigregister
+Ellipse_swigregister(Ellipse)
+
+class IFTDecayFunction1D(IParameterized):
+    """
+
+
+    Interface for a one-dimensional decay function, with evaluate(q) returning the Fourier transform, normalized to  $\\int dq\\; {\\rm evaluate}(q) = 1$.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFTDecayFunction1D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFTDecayFunction1D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(IFTDecayFunction1D self) -> IFTDecayFunction1D
+
+        virtual IFTDecayFunction1D* IFTDecayFunction1D::clone() const =0
+
+        """
+        return _libBornAgainCore.IFTDecayFunction1D_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(IFTDecayFunction1D self, double q) -> double
+
+        virtual double IFTDecayFunction1D::evaluate(double q) const =0
+
+        """
+        return _libBornAgainCore.IFTDecayFunction1D_evaluate(self, q)
+
+
+    def setOmega(self, omega):
+        """
+        setOmega(IFTDecayFunction1D self, double omega)
+
+        void IFTDecayFunction1D::setOmega(double omega)
+
+        """
+        return _libBornAgainCore.IFTDecayFunction1D_setOmega(self, omega)
+
+
+    def getOmega(self):
+        """
+        getOmega(IFTDecayFunction1D self) -> double
+
+        double IFTDecayFunction1D::getOmega() const 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction1D_getOmega(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IFTDecayFunction1D
+    __del__ = lambda self: None
+IFTDecayFunction1D_swigregister = _libBornAgainCore.IFTDecayFunction1D_swigregister
+IFTDecayFunction1D_swigregister(IFTDecayFunction1D)
+
+class FTDecayFunction1DCauchy(IFTDecayFunction1D):
+    """
+
+
+    One-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-|x|/omega) in real space.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDecayFunction1DCauchy, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDecayFunction1DCauchy, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDecayFunction1DCauchy self, double omega) -> FTDecayFunction1DCauchy
+
+        FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDecayFunction1DCauchy(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDecayFunction1DCauchy self) -> FTDecayFunction1DCauchy
+
+        virtual FTDecayFunction1DCauchy* FTDecayFunction1DCauchy::clone() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DCauchy_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDecayFunction1DCauchy self, double q) -> double
+
+        double FTDecayFunction1DCauchy::evaluate(double q) const final
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DCauchy_evaluate(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDecayFunction1DCauchy
+    __del__ = lambda self: None
+FTDecayFunction1DCauchy_swigregister = _libBornAgainCore.FTDecayFunction1DCauchy_swigregister
+FTDecayFunction1DCauchy_swigregister(FTDecayFunction1DCauchy)
+
+class FTDecayFunction1DGauss(IFTDecayFunction1D):
+    """
+
+
+    One-dimensional Gauss decay function in reciprocal space; corresponds to exp[-x^2/(2*omega^2)] in real space.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDecayFunction1DGauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDecayFunction1DGauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDecayFunction1DGauss self, double omega) -> FTDecayFunction1DGauss
+
+        FTDecayFunction1DGauss::FTDecayFunction1DGauss(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDecayFunction1DGauss(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDecayFunction1DGauss self) -> FTDecayFunction1DGauss
+
+        virtual FTDecayFunction1DGauss* FTDecayFunction1DGauss::clone() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DGauss_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDecayFunction1DGauss self, double q) -> double
+
+        double FTDecayFunction1DGauss::evaluate(double q) const final
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DGauss_evaluate(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDecayFunction1DGauss
+    __del__ = lambda self: None
+FTDecayFunction1DGauss_swigregister = _libBornAgainCore.FTDecayFunction1DGauss_swigregister
+FTDecayFunction1DGauss_swigregister(FTDecayFunction1DGauss)
+
+class FTDecayFunction1DTriangle(IFTDecayFunction1D):
+    """
+
+
+    One-dimensional triangle decay function in reciprocal space; corresponds to 1-|x|/omega if |x|<omega (and 0 otherwise) in real space.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDecayFunction1DTriangle, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDecayFunction1DTriangle, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDecayFunction1DTriangle self, double omega) -> FTDecayFunction1DTriangle
+
+        FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDecayFunction1DTriangle(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDecayFunction1DTriangle self) -> FTDecayFunction1DTriangle
+
+        virtual FTDecayFunction1DTriangle* FTDecayFunction1DTriangle::clone() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DTriangle_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDecayFunction1DTriangle self, double q) -> double
+
+        double FTDecayFunction1DTriangle::evaluate(double q) const final
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DTriangle_evaluate(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDecayFunction1DTriangle
+    __del__ = lambda self: None
+FTDecayFunction1DTriangle_swigregister = _libBornAgainCore.FTDecayFunction1DTriangle_swigregister
+FTDecayFunction1DTriangle_swigregister(FTDecayFunction1DTriangle)
+
+class FTDecayFunction1DVoigt(IFTDecayFunction1D):
+    """
+
+
+    One-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*Cauchy.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDecayFunction1DVoigt, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDecayFunction1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDecayFunction1DVoigt, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega, eta):
+        """
+        __init__(FTDecayFunction1DVoigt self, double omega, double eta) -> FTDecayFunction1DVoigt
+
+        FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double omega, double eta)
+
+        """
+        this = _libBornAgainCore.new_FTDecayFunction1DVoigt(omega, eta)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDecayFunction1DVoigt self) -> FTDecayFunction1DVoigt
+
+        virtual FTDecayFunction1DVoigt* FTDecayFunction1DVoigt::clone() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DVoigt_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDecayFunction1DVoigt self, double q) -> double
+
+        double FTDecayFunction1DVoigt::evaluate(double q) const final
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DVoigt_evaluate(self, q)
+
+
+    def getEta(self):
+        """
+        getEta(FTDecayFunction1DVoigt self) -> double
+
+        double FTDecayFunction1DVoigt::getEta() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction1DVoigt_getEta(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDecayFunction1DVoigt
+    __del__ = lambda self: None
+FTDecayFunction1DVoigt_swigregister = _libBornAgainCore.FTDecayFunction1DVoigt_swigregister
+FTDecayFunction1DVoigt_swigregister(FTDecayFunction1DVoigt)
+
+class IFTDecayFunction2D(IParameterized):
+    """
+
+
+    Interface for two-dimensional decay function in reciprocal space.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFTDecayFunction2D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFTDecayFunction2D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(IFTDecayFunction2D self) -> IFTDecayFunction2D
+
+        virtual IFTDecayFunction2D* IFTDecayFunction2D::clone() const =0
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_clone(self)
+
+
+    def setGamma(self, gamma):
+        """
+        setGamma(IFTDecayFunction2D self, double gamma)
+
+        void IFTDecayFunction2D::setGamma(double gamma)
+
+        set angle between first lattice vector and X-axis of distribution (both in direct space) 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_setGamma(self, gamma)
+
+
+    def getGamma(self):
+        """
+        getGamma(IFTDecayFunction2D self) -> double
+
+        double IFTDecayFunction2D::getGamma() const
+
+        get angle between first lattice vector and X-axis of distribution (both in direct space) 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_getGamma(self)
+
+
+    def getDelta(self):
+        """
+        getDelta(IFTDecayFunction2D self) -> double
+
+        double IFTDecayFunction2D::getDelta() const
+
+        get angle between X- and Y-axis of distribution (in direct space) 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_getDelta(self)
+
+
+    def getDecayLengthX(self):
+        """
+        getDecayLengthX(IFTDecayFunction2D self) -> double
+
+        double IFTDecayFunction2D::getDecayLengthX() const
+
+        get coherence length in X-direction 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_getDecayLengthX(self)
+
+
+    def getDecayLengthY(self):
+        """
+        getDecayLengthY(IFTDecayFunction2D self) -> double
+
+        double IFTDecayFunction2D::getDecayLengthY() const
+
+        get coherence length in Y-direction 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_getDecayLengthY(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(IFTDecayFunction2D self, double qx, double qy) -> double
+
+        virtual double IFTDecayFunction2D::evaluate(double qx, double qy) const =0
+
+        evaluate Fourier transformed decay function for q in X,Y coordinates 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_evaluate(self, qx, qy)
+
+
+    def transformToStarBasis(self, qX, qY, alpha, a, b, qa, qb):
+        """
+        transformToStarBasis(IFTDecayFunction2D self, double qX, double qY, double alpha, double a, double b, double & qa, double & qb)
+
+        void IFTDecayFunction2D::transformToStarBasis(double qX, double qY, double alpha, double a, double b, double &qa, double &qb) const
+
+        transform back to a*, b* basis: 
+
+        """
+        return _libBornAgainCore.IFTDecayFunction2D_transformToStarBasis(self, qX, qY, alpha, a, b, qa, qb)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IFTDecayFunction2D
+    __del__ = lambda self: None
+IFTDecayFunction2D_swigregister = _libBornAgainCore.IFTDecayFunction2D_swigregister
+IFTDecayFunction2D_swigregister(IFTDecayFunction2D)
+
+class FTDecayFunction2DCauchy(IFTDecayFunction2D):
+    """
+
+
+    Two-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-r) in real space, with  $r=\\sqrt{(\\frac{x}{\\omega_x})^2 + (\\frac{y}{\\omega_y})^2}$.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDecayFunction2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDecayFunction2DCauchy, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDecayFunction2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDecayFunction2DCauchy, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDecayFunction2DCauchy self, double decay_length_x, double decay_length_y, double gamma=0, double delta) -> FTDecayFunction2DCauchy
+        __init__(FTDecayFunction2DCauchy self, double decay_length_x, double decay_length_y, double gamma=0) -> FTDecayFunction2DCauchy
+        __init__(FTDecayFunction2DCauchy self, double decay_length_x, double decay_length_y) -> FTDecayFunction2DCauchy
+
+        FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDecayFunction2DCauchy(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDecayFunction2DCauchy self) -> FTDecayFunction2DCauchy
+
+        virtual FTDecayFunction2DCauchy* FTDecayFunction2DCauchy::clone() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction2DCauchy_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDecayFunction2DCauchy self, double qx, double qy) -> double
+
+        double FTDecayFunction2DCauchy::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed decay function for q in X,Y coordinates 
+
+        """
+        return _libBornAgainCore.FTDecayFunction2DCauchy_evaluate(self, qx, qy)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDecayFunction2DCauchy
+    __del__ = lambda self: None
+FTDecayFunction2DCauchy_swigregister = _libBornAgainCore.FTDecayFunction2DCauchy_swigregister
+FTDecayFunction2DCauchy_swigregister(FTDecayFunction2DCauchy)
+
+class FTDecayFunction2DGauss(IFTDecayFunction2D):
+    """
+
+
+    Two-dimensional Gauss decay function in reciprocal space; corresponds to exp(-r^2/2) in real space, with  $r=\\sqrt{(\\frac{x}{\\omega_x})^2 + (\\frac{y}{\\omega_y})^2}$.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDecayFunction2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDecayFunction2DGauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDecayFunction2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDecayFunction2DGauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDecayFunction2DGauss self, double decay_length_x, double decay_length_y, double gamma=0, double delta) -> FTDecayFunction2DGauss
+        __init__(FTDecayFunction2DGauss self, double decay_length_x, double decay_length_y, double gamma=0) -> FTDecayFunction2DGauss
+        __init__(FTDecayFunction2DGauss self, double decay_length_x, double decay_length_y) -> FTDecayFunction2DGauss
+
+        FTDecayFunction2DGauss::FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDecayFunction2DGauss(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDecayFunction2DGauss self) -> FTDecayFunction2DGauss
+
+        virtual FTDecayFunction2DGauss* FTDecayFunction2DGauss::clone() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction2DGauss_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDecayFunction2DGauss self, double qx, double qy) -> double
+
+        double FTDecayFunction2DGauss::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed decay function for q in X,Y coordinates 
+
+        """
+        return _libBornAgainCore.FTDecayFunction2DGauss_evaluate(self, qx, qy)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDecayFunction2DGauss
+    __del__ = lambda self: None
+FTDecayFunction2DGauss_swigregister = _libBornAgainCore.FTDecayFunction2DGauss_swigregister
+FTDecayFunction2DGauss_swigregister(FTDecayFunction2DGauss)
+
+class FTDecayFunction2DVoigt(IFTDecayFunction2D):
+    """
+
+
+    Two-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*Cauchy.
+
+    C++ includes: FTDecayFunctions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDecayFunction2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDecayFunction2DVoigt, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDecayFunction2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDecayFunction2DVoigt, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDecayFunction2DVoigt self, double decay_length_x, double decay_length_y, double eta, double gamma=0, double delta) -> FTDecayFunction2DVoigt
+        __init__(FTDecayFunction2DVoigt self, double decay_length_x, double decay_length_y, double eta, double gamma=0) -> FTDecayFunction2DVoigt
+        __init__(FTDecayFunction2DVoigt self, double decay_length_x, double decay_length_y, double eta) -> FTDecayFunction2DVoigt
+
+        FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDecayFunction2DVoigt(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDecayFunction2DVoigt self) -> FTDecayFunction2DVoigt
+
+        virtual FTDecayFunction2DVoigt* FTDecayFunction2DVoigt::clone() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction2DVoigt_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDecayFunction2DVoigt self, double qx, double qy) -> double
+
+        double FTDecayFunction2DVoigt::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed decay function for q in X,Y coordinates 
+
+        """
+        return _libBornAgainCore.FTDecayFunction2DVoigt_evaluate(self, qx, qy)
+
+
+    def getEta(self):
+        """
+        getEta(FTDecayFunction2DVoigt self) -> double
+
+        virtual double FTDecayFunction2DVoigt::getEta() const 
+
+        """
+        return _libBornAgainCore.FTDecayFunction2DVoigt_getEta(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDecayFunction2DVoigt
+    __del__ = lambda self: None
+FTDecayFunction2DVoigt_swigregister = _libBornAgainCore.FTDecayFunction2DVoigt_swigregister
+FTDecayFunction2DVoigt_swigregister(FTDecayFunction2DVoigt)
+
+class IFTDistribution1D(IParameterized):
+    """
+
+
+    Interface for a one-dimensional distribution, with normalization adjusted so that the Fourier transform evaluate(q) is a decay function that starts at evaluate(0)=1.
+
+    C++ includes: FTDistributions1D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFTDistribution1D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFTDistribution1D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(IFTDistribution1D self) -> IFTDistribution1D
+
+        virtual IFTDistribution1D* IFTDistribution1D::clone() const =0
+
+        """
+        return _libBornAgainCore.IFTDistribution1D_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(IFTDistribution1D self, double q) -> double
+
+        virtual double IFTDistribution1D::evaluate(double q) const =0
+
+        Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+
+        """
+        return _libBornAgainCore.IFTDistribution1D_evaluate(self, q)
+
+
+    def setOmega(self, omega):
+        """
+        setOmega(IFTDistribution1D self, double omega)
+
+        void IFTDistribution1D::setOmega(double omega)
+
+        """
+        return _libBornAgainCore.IFTDistribution1D_setOmega(self, omega)
+
+
+    def getOmega(self):
+        """
+        getOmega(IFTDistribution1D self) -> double
+
+        double IFTDistribution1D::getOmega() const 
+
+        """
+        return _libBornAgainCore.IFTDistribution1D_getOmega(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IFTDistribution1D
+    __del__ = lambda self: None
+IFTDistribution1D_swigregister = _libBornAgainCore.IFTDistribution1D_swigregister
+IFTDistribution1D_swigregister(IFTDistribution1D)
+
+class FTDistribution1DCauchy(IFTDistribution1D):
+    """
+
+
+    Exponential  IFTDistribution1D exp(-|omega*x|); its Fourier transform evaluate(q) is a Cauchy-Lorentzian starting at evaluate(0)=1.
+
+    C++ includes: FTDistributions1D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution1DCauchy, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution1DCauchy, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDistribution1DCauchy self, double omega) -> FTDistribution1DCauchy
+
+        FTDistribution1DCauchy::FTDistribution1DCauchy(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution1DCauchy(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution1DCauchy self) -> FTDistribution1DCauchy
+
+        FTDistribution1DCauchy* FTDistribution1DCauchy::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution1DCauchy_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDistribution1DCauchy self, double q) -> double
+
+        double FTDistribution1DCauchy::evaluate(double q) const final
+
+        Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+
+        """
+        return _libBornAgainCore.FTDistribution1DCauchy_evaluate(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution1DCauchy
+    __del__ = lambda self: None
+FTDistribution1DCauchy_swigregister = _libBornAgainCore.FTDistribution1DCauchy_swigregister
+FTDistribution1DCauchy_swigregister(FTDistribution1DCauchy)
+
+class FTDistribution1DGauss(IFTDistribution1D):
+    """
+
+
+    Gaussian  IFTDistribution1D; its Fourier transform evaluate(q) is a Gaussian starting at evaluate(0)=1.
+
+    C++ includes: FTDistributions1D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution1DGauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution1DGauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDistribution1DGauss self, double omega) -> FTDistribution1DGauss
+
+        FTDistribution1DGauss::FTDistribution1DGauss(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution1DGauss(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution1DGauss self) -> FTDistribution1DGauss
+
+        FTDistribution1DGauss* FTDistribution1DGauss::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution1DGauss_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDistribution1DGauss self, double q) -> double
+
+        double FTDistribution1DGauss::evaluate(double q) const final
+
+        Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+
+        """
+        return _libBornAgainCore.FTDistribution1DGauss_evaluate(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution1DGauss
+    __del__ = lambda self: None
+FTDistribution1DGauss_swigregister = _libBornAgainCore.FTDistribution1DGauss_swigregister
+FTDistribution1DGauss_swigregister(FTDistribution1DGauss)
+
+class FTDistribution1DGate(IFTDistribution1D):
+    """
+
+
+    Square gate  IFTDistribution1D; its Fourier transform evaluate(q) is a sinc function starting at evaluate(0)=1.
+
+    C++ includes: FTDistributions1D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution1DGate, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution1DGate, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDistribution1DGate self, double omega) -> FTDistribution1DGate
+
+        FTDistribution1DGate::FTDistribution1DGate(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution1DGate(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution1DGate self) -> FTDistribution1DGate
+
+        FTDistribution1DGate* FTDistribution1DGate::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution1DGate_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDistribution1DGate self, double q) -> double
+
+        double FTDistribution1DGate::evaluate(double q) const final
+
+        Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+
+        """
+        return _libBornAgainCore.FTDistribution1DGate_evaluate(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution1DGate
+    __del__ = lambda self: None
+FTDistribution1DGate_swigregister = _libBornAgainCore.FTDistribution1DGate_swigregister
+FTDistribution1DGate_swigregister(FTDistribution1DGate)
+
+class FTDistribution1DTriangle(IFTDistribution1D):
+    """
+
+
+    Triangle  IFTDistribution1D [1-|x|/omega if |x|<omega, and 0 otherwise]; its Fourier transform evaluate(q) is a squared sinc function starting at evaluate(0)=1.
+
+    C++ includes: FTDistributions1D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution1DTriangle, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution1DTriangle, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDistribution1DTriangle self, double omega) -> FTDistribution1DTriangle
+
+        FTDistribution1DTriangle::FTDistribution1DTriangle(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution1DTriangle(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution1DTriangle
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(FTDistribution1DTriangle self) -> FTDistribution1DTriangle
+
+        FTDistribution1DTriangle* FTDistribution1DTriangle::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution1DTriangle_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDistribution1DTriangle self, double q) -> double
+
+        double FTDistribution1DTriangle::evaluate(double q) const final
+
+        Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+
+        """
+        return _libBornAgainCore.FTDistribution1DTriangle_evaluate(self, q)
+
+FTDistribution1DTriangle_swigregister = _libBornAgainCore.FTDistribution1DTriangle_swigregister
+FTDistribution1DTriangle_swigregister(FTDistribution1DTriangle)
+
+class FTDistribution1DCosine(IFTDistribution1D):
+    """
+
+
+    IFTDistribution1D consisting of one cosine wave [1+cos(pi*x/omega) if |x|<omega, and 0 otherwise]; its Fourier transform evaluate(q) starts at evaluate(0)=1.
+
+    C++ includes: FTDistributions1D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution1DCosine, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution1DCosine, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega):
+        """
+        __init__(FTDistribution1DCosine self, double omega) -> FTDistribution1DCosine
+
+        FTDistribution1DCosine::FTDistribution1DCosine(double omega)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution1DCosine(omega)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution1DCosine self) -> FTDistribution1DCosine
+
+        FTDistribution1DCosine* FTDistribution1DCosine::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution1DCosine_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDistribution1DCosine self, double q) -> double
+
+        double FTDistribution1DCosine::evaluate(double q) const final
+
+        Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+
+        """
+        return _libBornAgainCore.FTDistribution1DCosine_evaluate(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution1DCosine
+    __del__ = lambda self: None
+FTDistribution1DCosine_swigregister = _libBornAgainCore.FTDistribution1DCosine_swigregister
+FTDistribution1DCosine_swigregister(FTDistribution1DCosine)
+
+class FTDistribution1DVoigt(IFTDistribution1D):
+    """
+
+
+    IFTDistribution1D that provides a Fourier transform evaluate(q) in form of a pseudo-Voigt decay function eta*Gauss + (1-eta)*Cauchy, with both components starting at 1 for q=0.
+
+    C++ includes: FTDistributions1D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution1DVoigt, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution1D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution1DVoigt, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, omega, eta):
+        """
+        __init__(FTDistribution1DVoigt self, double omega, double eta) -> FTDistribution1DVoigt
+
+        FTDistribution1DVoigt::FTDistribution1DVoigt(double omega, double eta)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution1DVoigt(omega, eta)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution1DVoigt self) -> FTDistribution1DVoigt
+
+        FTDistribution1DVoigt* FTDistribution1DVoigt::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution1DVoigt_clone(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(FTDistribution1DVoigt self, double q) -> double
+
+        double FTDistribution1DVoigt::evaluate(double q) const final
+
+        Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. 
+
+        """
+        return _libBornAgainCore.FTDistribution1DVoigt_evaluate(self, q)
+
+
+    def getEta(self):
+        """
+        getEta(FTDistribution1DVoigt self) -> double
+
+        double FTDistribution1DVoigt::getEta() const 
+
+        """
+        return _libBornAgainCore.FTDistribution1DVoigt_getEta(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution1DVoigt
+    __del__ = lambda self: None
+FTDistribution1DVoigt_swigregister = _libBornAgainCore.FTDistribution1DVoigt_swigregister
+FTDistribution1DVoigt_swigregister(FTDistribution1DVoigt)
+
+class IFTDistribution2D(IParameterized):
+    """
+
+
+    Interface for two-dimensional distributions in Fourier space.
+
+    C++ includes: FTDistributions2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFTDistribution2D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFTDistribution2D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self):
+        """
+        clone(IFTDistribution2D self) -> IFTDistribution2D
+
+        virtual IFTDistribution2D* IFTDistribution2D::clone() const =0
+
+        """
+        return _libBornAgainCore.IFTDistribution2D_clone(self)
+
+
+    def setGamma(self, gamma):
+        """
+        setGamma(IFTDistribution2D self, double gamma)
+
+        void IFTDistribution2D::setGamma(double gamma)
+
+        """
+        return _libBornAgainCore.IFTDistribution2D_setGamma(self, gamma)
+
+
+    def getGamma(self):
+        """
+        getGamma(IFTDistribution2D self) -> double
+
+        double IFTDistribution2D::getGamma() const 
+
+        """
+        return _libBornAgainCore.IFTDistribution2D_getGamma(self)
+
+
+    def getDelta(self):
+        """
+        getDelta(IFTDistribution2D self) -> double
+
+        double IFTDistribution2D::getDelta() const 
+
+        """
+        return _libBornAgainCore.IFTDistribution2D_getDelta(self)
+
+
+    def getCoherenceLengthX(self):
+        """
+        getCoherenceLengthX(IFTDistribution2D self) -> double
+
+        double IFTDistribution2D::getCoherenceLengthX() const 
+
+        """
+        return _libBornAgainCore.IFTDistribution2D_getCoherenceLengthX(self)
+
+
+    def getCoherenceLengthY(self):
+        """
+        getCoherenceLengthY(IFTDistribution2D self) -> double
+
+        double IFTDistribution2D::getCoherenceLengthY() const 
+
+        """
+        return _libBornAgainCore.IFTDistribution2D_getCoherenceLengthY(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(IFTDistribution2D self, double qx, double qy) -> double
+
+        virtual double IFTDistribution2D::evaluate(double qx, double qy) const =0
+
+        evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+
+        """
+        return _libBornAgainCore.IFTDistribution2D_evaluate(self, qx, qy)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IFTDistribution2D
+    __del__ = lambda self: None
+IFTDistribution2D_swigregister = _libBornAgainCore.IFTDistribution2D_swigregister
+IFTDistribution2D_swigregister(IFTDistribution2D)
+
+class FTDistribution2DCauchy(IFTDistribution2D):
+    """
+
+
+    Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real space, with  $r=\\sqrt{(\\frac{x}{\\omega_x})^2 + (\\frac{y}{\\omega_y})^2}$.
+
+    C++ includes: FTDistributions2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution2DCauchy, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution2DCauchy, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDistribution2DCauchy self, double coherence_length_x, double coherence_length_y, double gamma=0, double delta) -> FTDistribution2DCauchy
+        __init__(FTDistribution2DCauchy self, double coherence_length_x, double coherence_length_y, double gamma=0) -> FTDistribution2DCauchy
+        __init__(FTDistribution2DCauchy self, double coherence_length_x, double coherence_length_y) -> FTDistribution2DCauchy
+
+        FTDistribution2DCauchy::FTDistribution2DCauchy(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution2DCauchy(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution2DCauchy self) -> FTDistribution2DCauchy
+
+        FTDistribution2DCauchy* FTDistribution2DCauchy::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution2DCauchy_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDistribution2DCauchy self, double qx, double qy) -> double
+
+        double FTDistribution2DCauchy::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+
+        """
+        return _libBornAgainCore.FTDistribution2DCauchy_evaluate(self, qx, qy)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution2DCauchy
+    __del__ = lambda self: None
+FTDistribution2DCauchy_swigregister = _libBornAgainCore.FTDistribution2DCauchy_swigregister
+FTDistribution2DCauchy_swigregister(FTDistribution2DCauchy)
+
+class FTDistribution2DGauss(IFTDistribution2D):
+    """
+
+
+    Two-dimensional Gauss distribution in Fourier space; corresponds to normalized exp(-r^2/2) in real space with  $r=\\sqrt{(\\frac{x}{\\omega_x})^2 + (\\frac{y}{\\omega_y})^2}$.
+
+    C++ includes: FTDistributions2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution2DGauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution2DGauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDistribution2DGauss self, double coherence_length_x, double coherence_length_y, double gamma=0, double delta) -> FTDistribution2DGauss
+        __init__(FTDistribution2DGauss self, double coherence_length_x, double coherence_length_y, double gamma=0) -> FTDistribution2DGauss
+        __init__(FTDistribution2DGauss self, double coherence_length_x, double coherence_length_y) -> FTDistribution2DGauss
+
+        FTDistribution2DGauss::FTDistribution2DGauss(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution2DGauss(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution2DGauss self) -> FTDistribution2DGauss
+
+        FTDistribution2DGauss* FTDistribution2DGauss::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution2DGauss_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDistribution2DGauss self, double qx, double qy) -> double
+
+        double FTDistribution2DGauss::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+
+        """
+        return _libBornAgainCore.FTDistribution2DGauss_evaluate(self, qx, qy)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution2DGauss
+    __del__ = lambda self: None
+FTDistribution2DGauss_swigregister = _libBornAgainCore.FTDistribution2DGauss_swigregister
+FTDistribution2DGauss_swigregister(FTDistribution2DGauss)
+
+class FTDistribution2DGate(IFTDistribution2D):
+    """
+
+
+    Two-dimensional gate distribution in Fourier space; corresponds to normalized constant if r<1 (and 0 otherwise) in real space, with  $r=\\sqrt{(\\frac{x}{\\omega_x})^2 + (\\frac{y}{\\omega_y})^2}$.
+
+    C++ includes: FTDistributions2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution2DGate, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution2DGate, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDistribution2DGate self, double coherence_length_x, double coherence_length_y, double gamma=0, double delta) -> FTDistribution2DGate
+        __init__(FTDistribution2DGate self, double coherence_length_x, double coherence_length_y, double gamma=0) -> FTDistribution2DGate
+        __init__(FTDistribution2DGate self, double coherence_length_x, double coherence_length_y) -> FTDistribution2DGate
+
+        FTDistribution2DGate::FTDistribution2DGate(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution2DGate(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution2DGate self) -> FTDistribution2DGate
+
+        FTDistribution2DGate* FTDistribution2DGate::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution2DGate_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDistribution2DGate self, double qx, double qy) -> double
+
+        double FTDistribution2DGate::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+
+        """
+        return _libBornAgainCore.FTDistribution2DGate_evaluate(self, qx, qy)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution2DGate
+    __del__ = lambda self: None
+FTDistribution2DGate_swigregister = _libBornAgainCore.FTDistribution2DGate_swigregister
+FTDistribution2DGate_swigregister(FTDistribution2DGate)
+
+class FTDistribution2DCone(IFTDistribution2D):
+    """
+
+
+    Two-dimensional cone distribution in Fourier space; corresponds to 1-r if r<1 (and 0 otherwise) in real space with  $r=\\sqrt{(\\frac{x}{\\omega_x})^2 + (\\frac{y}{\\omega_y})^2}$.
+
+    C++ includes: FTDistributions2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution2DCone, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution2DCone, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDistribution2DCone self, double coherence_length_x, double coherence_length_y, double gamma=0, double delta) -> FTDistribution2DCone
+        __init__(FTDistribution2DCone self, double coherence_length_x, double coherence_length_y, double gamma=0) -> FTDistribution2DCone
+        __init__(FTDistribution2DCone self, double coherence_length_x, double coherence_length_y) -> FTDistribution2DCone
+
+        FTDistribution2DCone::FTDistribution2DCone(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution2DCone(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution2DCone self) -> FTDistribution2DCone
+
+        FTDistribution2DCone* FTDistribution2DCone::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution2DCone_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDistribution2DCone self, double qx, double qy) -> double
+
+        double FTDistribution2DCone::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+
+        """
+        return _libBornAgainCore.FTDistribution2DCone_evaluate(self, qx, qy)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution2DCone
+    __del__ = lambda self: None
+FTDistribution2DCone_swigregister = _libBornAgainCore.FTDistribution2DCone_swigregister
+FTDistribution2DCone_swigregister(FTDistribution2DCone)
+
+class FTDistribution2DVoigt(IFTDistribution2D):
+    """
+
+
+    Two-dimensional Voigt distribution in Fourier space; corresponds to eta*Gauss + (1-eta)*Cauchy
+
+    C++ includes: FTDistributions2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FTDistribution2DVoigt, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFTDistribution2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FTDistribution2DVoigt, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FTDistribution2DVoigt self, double coherence_length_x, double coherence_length_y, double eta, double gamma=0, double delta) -> FTDistribution2DVoigt
+        __init__(FTDistribution2DVoigt self, double coherence_length_x, double coherence_length_y, double eta, double gamma=0) -> FTDistribution2DVoigt
+        __init__(FTDistribution2DVoigt self, double coherence_length_x, double coherence_length_y, double eta) -> FTDistribution2DVoigt
+
+        FTDistribution2DVoigt::FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y, double eta, double gamma=0, double delta=M_PI_2)
+
+        """
+        this = _libBornAgainCore.new_FTDistribution2DVoigt(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FTDistribution2DVoigt self) -> FTDistribution2DVoigt
+
+        FTDistribution2DVoigt* FTDistribution2DVoigt::clone() const final
+
+        """
+        return _libBornAgainCore.FTDistribution2DVoigt_clone(self)
+
+
+    def evaluate(self, qx, qy):
+        """
+        evaluate(FTDistribution2DVoigt self, double qx, double qy) -> double
+
+        double FTDistribution2DVoigt::evaluate(double qx, double qy) const final
+
+        evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 
+
+        """
+        return _libBornAgainCore.FTDistribution2DVoigt_evaluate(self, qx, qy)
+
+
+    def getEta(self):
+        """
+        getEta(FTDistribution2DVoigt self) -> double
+
+        double FTDistribution2DVoigt::getEta() const 
+
+        """
+        return _libBornAgainCore.FTDistribution2DVoigt_getEta(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FTDistribution2DVoigt
+    __del__ = lambda self: None
+FTDistribution2DVoigt_swigregister = _libBornAgainCore.FTDistribution2DVoigt_swigregister
+FTDistribution2DVoigt_swigregister(FTDistribution2DVoigt)
+
+class FixedBinAxis(IAxis):
+    """
+
+
+    Axis with fixed bin size.
+
+    C++ includes: FixedBinAxis.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IAxis]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FixedBinAxis, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IAxis]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FixedBinAxis, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, name, nbins, start, end):
+        """
+        __init__(FixedBinAxis self, std::string const & name, size_t nbins, double start, double end) -> FixedBinAxis
+
+        FixedBinAxis::FixedBinAxis(const std::string &name, size_t nbins, double start, double end)
+
+        FixedBinAxis constructor.
+
+        Parameters:
+        -----------
+
+        name: 
+        Axis name
+
+        nbins: 
+        number of bins
+
+        start: 
+        low edge of first bin
+
+        end: 
+        upper edge of last bin 
+
+        """
+        this = _libBornAgainCore.new_FixedBinAxis(name, nbins, start, end)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FixedBinAxis
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(FixedBinAxis self) -> FixedBinAxis
+
+        FixedBinAxis * FixedBinAxis::clone() const
+
+        clone function 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_clone(self)
+
+
+    def size(self):
+        """
+        size(FixedBinAxis self) -> size_t
+
+        size_t FixedBinAxis::size() const
+
+        retrieve the number of bins 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_size(self)
+
+
+    def getBin(self, index):
+        """
+        getBin(FixedBinAxis self, size_t index) -> Bin1D
+
+        Bin1D FixedBinAxis::getBin(size_t index) const
+
+        retrieve a 1d bin for the given index 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_getBin(self, index)
+
+
+    def getMin(self):
+        """
+        getMin(FixedBinAxis self) -> double
+
+        double FixedBinAxis::getMin() const
+
+        Returns value of first point of axis. 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_getMin(self)
+
+
+    def getMax(self):
+        """
+        getMax(FixedBinAxis self) -> double
+
+        double FixedBinAxis::getMax() const
+
+        Returns value of last point of axis. 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_getMax(self)
+
+
+    def getBinCenter(self, index):
+        """
+        getBinCenter(FixedBinAxis self, size_t index) -> double
+
+        double FixedBinAxis::getBinCenter(size_t index) const 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_getBinCenter(self, index)
+
+
+    def findClosestIndex(self, value):
+        """
+        findClosestIndex(FixedBinAxis self, double value) -> size_t
+
+        size_t FixedBinAxis::findClosestIndex(double value) const
+
+        find bin index which is best match for given value 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_findClosestIndex(self, value)
+
+
+    def getBinCenters(self):
+        """
+        getBinCenters(FixedBinAxis self) -> vdouble1d_t
+
+        std::vector< double > FixedBinAxis::getBinCenters() const 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_getBinCenters(self)
+
+
+    def getBinBoundaries(self):
+        """
+        getBinBoundaries(FixedBinAxis self) -> vdouble1d_t
+
+        std::vector< double > FixedBinAxis::getBinBoundaries() const 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_getBinBoundaries(self)
+
+
+    def createClippedAxis(self, left, right):
+        """
+        createClippedAxis(FixedBinAxis self, double left, double right) -> FixedBinAxis
+
+        FixedBinAxis * FixedBinAxis::createClippedAxis(double left, double right) const
+
+        Creates a new clipped axis. 
+
+        """
+        return _libBornAgainCore.FixedBinAxis_createClippedAxis(self, left, right)
+
+
+    def __getitem__(self, i):
+        """__getitem__(FixedBinAxis self, unsigned int i) -> double"""
+        return _libBornAgainCore.FixedBinAxis___getitem__(self, i)
+
+FixedBinAxis_swigregister = _libBornAgainCore.FixedBinAxis_swigregister
+FixedBinAxis_swigregister(FixedBinAxis)
+
+class IFormFactor(ISample):
+    """
+
+
+    Pure virtual base class for all form factors.
+
+    The actual form factor is returned by the complex valued function  IFormFactor::evaluate, which depends on the incoming and outgoing wave vectors ki and kf. If it only depends on the scattering vector q=ki-kf, then it is a IBornFormFactor.
+
+    Other children besides IBornFormFactor are  IFormFactorDecorator,  FormFactorWeighted,  FormFactorDWBA,  FormFactorDWBAPol and  FormFactorCrystal.
+
+    C++ includes: IFormFactor.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFormFactor, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFormFactor, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(IFormFactor self) -> IFormFactor
+
+        IFormFactor::IFormFactor()
+
+        """
+        if self.__class__ == IFormFactor:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_IFormFactor(_self, )
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IFormFactor
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IFormFactor self) -> IFormFactor
+
+        IFormFactor* IFormFactor::clone() const override=0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IFormFactor_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(IFormFactor self, ISampleVisitor visitor)
+
+        void IFormFactor::accept(ISampleVisitor *visitor) const override=0
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.IFormFactor_accept(self, visitor)
+
+
+    def setAmbientMaterial(self, arg0):
+        """
+        setAmbientMaterial(IFormFactor self, IMaterial arg0)
+
+        virtual void IFormFactor::setAmbientMaterial(const IMaterial &)
+
+        Passes the refractive index of the ambient material in which this particle is embedded. 
+
+        """
+        return _libBornAgainCore.IFormFactor_setAmbientMaterial(self, arg0)
+
+
+    def evaluate(self, wavevectors):
+        """
+        evaluate(IFormFactor self, WavevectorInfo wavevectors) -> complex_t
+
+        virtual complex_t IFormFactor::evaluate(const WavevectorInfo &wavevectors) const =0
+
+        Returns scattering amplitude for complex wavevectors ki, kf. 
+
+        """
+        return _libBornAgainCore.IFormFactor_evaluate(self, wavevectors)
+
+
+    def getVolume(self):
+        """
+        getVolume(IFormFactor self) -> double
+
+        double IFormFactor::getVolume() const
+
+        Returns the total volume of the particle of this form factor's shape. 
+
+        """
+        return _libBornAgainCore.IFormFactor_getVolume(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(IFormFactor self) -> double
+
+        virtual double IFormFactor::getRadialExtension() const =0
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.IFormFactor_getRadialExtension(self)
+
+
+    def setSpecularInfo(self, arg0, arg1):
+        """
+        setSpecularInfo(IFormFactor self, ILayerRTCoefficients const * arg0, ILayerRTCoefficients const * arg1)
+
+        virtual void IFormFactor::setSpecularInfo(const ILayerRTCoefficients *, const ILayerRTCoefficients *)
+
+        Sets reflection/transmission info. 
+
+        """
+        return _libBornAgainCore.IFormFactor_setSpecularInfo(self, arg0, arg1)
+
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_IFormFactor(self)
+        return weakref_proxy(self)
+
+    def onChange(self):
+        """onChange(IFormFactor self)"""
+        return _libBornAgainCore.IFormFactor_onChange(self)
+
+
+    def _print(self, ostr):
+        """_print(IFormFactor self, std::ostream & ostr)"""
+        return _libBornAgainCore.IFormFactor__print(self, ostr)
+
+IFormFactor_swigregister = _libBornAgainCore.IFormFactor_swigregister
+IFormFactor_swigregister(IFormFactor)
+
+class vector_IFormFactorPtr_t(_object):
+    """Proxy of C++ std::vector<(p.IFormFactor)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_IFormFactorPtr_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_IFormFactorPtr_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_IFormFactorPtr_t self) -> SwigPyIterator"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_IFormFactorPtr_t self) -> bool"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_IFormFactorPtr_t self) -> bool"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::size_type"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j) -> vector_IFormFactorPtr_t"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j)
+        __setslice__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j, vector_IFormFactorPtr_t v)
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j)"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i)
+        __delitem__(vector_IFormFactorPtr_t self, PySliceObject * slice)
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_IFormFactorPtr_t self, PySliceObject * slice) -> vector_IFormFactorPtr_t
+        __getitem__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i) -> IFormFactor
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_IFormFactorPtr_t self, PySliceObject * slice, vector_IFormFactorPtr_t v)
+        __setitem__(vector_IFormFactorPtr_t self, PySliceObject * slice)
+        __setitem__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, IFormFactor x)
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_IFormFactorPtr_t self) -> IFormFactor"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_IFormFactorPtr_t self, IFormFactor x)"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_IFormFactorPtr_t self) -> bool"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_empty(self)
+
+
+    def size(self):
+        """size(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::size_type"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_size(self)
+
+
+    def swap(self, v):
+        """
+        swap(vector_IFormFactorPtr_t self, vector_IFormFactorPtr_t v)
+
+        void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)
+
+        make Swappable 
+
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::iterator"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_begin(self)
+
+
+    def end(self):
+        """end(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::iterator"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::reverse_iterator"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::reverse_iterator"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_IFormFactorPtr_t self)"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::allocator_type"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_IFormFactorPtr_t self)"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::iterator pos) -> std::vector< IFormFactor * >::iterator
+        erase(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::iterator first, std::vector< IFormFactor * >::iterator last) -> std::vector< IFormFactor * >::iterator
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(p.IFormFactor)> self) -> vector_IFormFactorPtr_t
+        __init__(std::vector<(p.IFormFactor)> self, vector_IFormFactorPtr_t arg2) -> vector_IFormFactorPtr_t
+        __init__(std::vector<(p.IFormFactor)> self, std::vector< IFormFactor * >::size_type size) -> vector_IFormFactorPtr_t
+        __init__(std::vector<(p.IFormFactor)> self, std::vector< IFormFactor * >::size_type size, IFormFactor value) -> vector_IFormFactorPtr_t
+        """
+        this = _libBornAgainCore.new_vector_IFormFactorPtr_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_IFormFactorPtr_t self, IFormFactor x)"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_IFormFactorPtr_t self) -> IFormFactor"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_front(self)
+
+
+    def back(self):
+        """back(vector_IFormFactorPtr_t self) -> IFormFactor"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::size_type n, IFormFactor x)"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::size_type new_size)
+        resize(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::size_type new_size, IFormFactor x)
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::iterator pos, IFormFactor x) -> std::vector< IFormFactor * >::iterator
+        insert(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::iterator pos, std::vector< IFormFactor * >::size_type n, IFormFactor x)
+        """
+        return _libBornAgainCore.vector_IFormFactorPtr_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::size_type n)"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::size_type"""
+        return _libBornAgainCore.vector_IFormFactorPtr_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_vector_IFormFactorPtr_t
+    __del__ = lambda self: None
+vector_IFormFactorPtr_t_swigregister = _libBornAgainCore.vector_IFormFactorPtr_t_swigregister
+vector_IFormFactorPtr_t_swigregister(vector_IFormFactorPtr_t)
+
+class IFormFactorBorn(IFormFactor):
+    """
+
+
+    Pure virtual base class for Born form factors.
+
+    In contrast to the generic  IFormFactor, a Born form factor does not depend on the incoming and outgoing wave vectors ki and kf, except through their difference, the scattering vector q=ki-kf.
+
+    C++ includes: IFormFactorBorn.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFormFactorBorn, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFormFactorBorn, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(IFormFactorBorn self) -> IFormFactorBorn
+
+        IFormFactorBorn::IFormFactorBorn()
+
+        """
+        if self.__class__ == IFormFactorBorn:
+            _self = None
+        else:
+            _self = self
+        this = _libBornAgainCore.new_IFormFactorBorn(_self, )
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IFormFactorBorn
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IFormFactorBorn self) -> IFormFactorBorn
+
+        IFormFactorBorn* IFormFactorBorn::clone() const override=0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IFormFactorBorn_clone(self)
+
+
+    def evaluate(self, wavevectors):
+        """
+        evaluate(IFormFactorBorn self, WavevectorInfo wavevectors) -> complex_t
+
+        complex_t IFormFactorBorn::evaluate(const WavevectorInfo &wavevectors) const override
+
+        Returns scattering amplitude for complex wavevectors ki, kf. 
+
+        """
+        return _libBornAgainCore.IFormFactorBorn_evaluate(self, wavevectors)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(IFormFactorBorn self, cvector_t q) -> complex_t
+
+        virtual complex_t IFormFactorBorn::evaluate_for_q(const cvector_t q) const =0
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.IFormFactorBorn_evaluate_for_q(self, q)
+
+    def __disown__(self):
+        self.this.disown()
+        _libBornAgainCore.disown_IFormFactorBorn(self)
+        return weakref_proxy(self)
+
+    def onChange(self):
+        """onChange(IFormFactorBorn self)"""
+        return _libBornAgainCore.IFormFactorBorn_onChange(self)
+
+
+    def _print(self, ostr):
+        """_print(IFormFactorBorn self, std::ostream & ostr)"""
+        return _libBornAgainCore.IFormFactorBorn__print(self, ostr)
+
+IFormFactorBorn_swigregister = _libBornAgainCore.IFormFactorBorn_swigregister
+IFormFactorBorn_swigregister(IFormFactorBorn)
+
+class IFormFactorDecorator(IFormFactor):
+    """
+
+
+    Encapsulates another formfactor and adds extra functionality (a scalar factor, a Debye-Waller factor, a position-dependent phase factor, ...).
+
+    This class is designed according to the Decorator Pattern. It inherits from  IFormFactor and has a member of type IFormFactor*.
+
+    C++ includes: IFormFactorDecorator.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFormFactorDecorator, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IFormFactorDecorator, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IFormFactorDecorator
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IFormFactorDecorator self) -> IFormFactorDecorator
+
+        IFormFactorDecorator* IFormFactorDecorator::clone() const override=0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IFormFactorDecorator_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(IFormFactorDecorator self, ISampleVisitor visitor)
+
+        void IFormFactorDecorator::accept(ISampleVisitor *visitor) const override=0
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.IFormFactorDecorator_accept(self, visitor)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(IFormFactorDecorator self, IMaterial material)
+
+        void IFormFactorDecorator::setAmbientMaterial(const IMaterial &material) override
+
+        Passes the refractive index of the ambient material in which this particle is embedded. 
+
+        """
+        return _libBornAgainCore.IFormFactorDecorator_setAmbientMaterial(self, material)
+
+
+    def getVolume(self):
+        """
+        getVolume(IFormFactorDecorator self) -> double
+
+        double IFormFactorDecorator::getVolume() const override
+
+        Returns the total volume of the particle of this form factor's shape. 
+
+        """
+        return _libBornAgainCore.IFormFactorDecorator_getVolume(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(IFormFactorDecorator self) -> double
+
+        double IFormFactorDecorator::getRadialExtension() const override
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.IFormFactorDecorator_getRadialExtension(self)
+
+IFormFactorDecorator_swigregister = _libBornAgainCore.IFormFactorDecorator_swigregister
+IFormFactorDecorator_swigregister(IFormFactorDecorator)
+
+class PolygonalTopology(_object):
+    """
+
+
+    For internal use in  PolyhedralFace.
+
+    C++ includes: FormFactorPolyhedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, PolygonalTopology, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, PolygonalTopology, name)
+    __repr__ = _swig_repr
+    __swig_setmethods__["vertexIndices"] = _libBornAgainCore.PolygonalTopology_vertexIndices_set
+    __swig_getmethods__["vertexIndices"] = _libBornAgainCore.PolygonalTopology_vertexIndices_get
+    if _newclass:
+        vertexIndices = _swig_property(_libBornAgainCore.PolygonalTopology_vertexIndices_get, _libBornAgainCore.PolygonalTopology_vertexIndices_set)
+    __swig_setmethods__["symmetry_S2"] = _libBornAgainCore.PolygonalTopology_symmetry_S2_set
+    __swig_getmethods__["symmetry_S2"] = _libBornAgainCore.PolygonalTopology_symmetry_S2_get
+    if _newclass:
+        symmetry_S2 = _swig_property(_libBornAgainCore.PolygonalTopology_symmetry_S2_get, _libBornAgainCore.PolygonalTopology_symmetry_S2_set)
+
+    def __init__(self):
+        """
+        __init__(PolygonalTopology self) -> PolygonalTopology
+
+
+
+        For internal use in  PolyhedralFace.
+
+        C++ includes: FormFactorPolyhedron.h
+
+        """
+        this = _libBornAgainCore.new_PolygonalTopology()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_PolygonalTopology
+    __del__ = lambda self: None
+PolygonalTopology_swigregister = _libBornAgainCore.PolygonalTopology_swigregister
+PolygonalTopology_swigregister(PolygonalTopology)
+
+class PolyhedralTopology(_object):
+    """
+
+
+    For internal use in  FormFactorPolyhedron.
+
+    C++ includes: FormFactorPolyhedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, PolyhedralTopology, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, PolyhedralTopology, name)
+    __repr__ = _swig_repr
+    __swig_setmethods__["faces"] = _libBornAgainCore.PolyhedralTopology_faces_set
+    __swig_getmethods__["faces"] = _libBornAgainCore.PolyhedralTopology_faces_get
+    if _newclass:
+        faces = _swig_property(_libBornAgainCore.PolyhedralTopology_faces_get, _libBornAgainCore.PolyhedralTopology_faces_set)
+    __swig_setmethods__["symmetry_Ci"] = _libBornAgainCore.PolyhedralTopology_symmetry_Ci_set
+    __swig_getmethods__["symmetry_Ci"] = _libBornAgainCore.PolyhedralTopology_symmetry_Ci_get
+    if _newclass:
+        symmetry_Ci = _swig_property(_libBornAgainCore.PolyhedralTopology_symmetry_Ci_get, _libBornAgainCore.PolyhedralTopology_symmetry_Ci_set)
+
+    def __init__(self):
+        """
+        __init__(PolyhedralTopology self) -> PolyhedralTopology
+
+
+
+        For internal use in  FormFactorPolyhedron.
+
+        C++ includes: FormFactorPolyhedron.h
+
+        """
+        this = _libBornAgainCore.new_PolyhedralTopology()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_PolyhedralTopology
+    __del__ = lambda self: None
+PolyhedralTopology_swigregister = _libBornAgainCore.PolyhedralTopology_swigregister
+PolyhedralTopology_swigregister(PolyhedralTopology)
+
+class PolyhedralEdge(_object):
+    """
+
+
+    One edge of a polygon, for form factor computation.
+
+    C++ includes: FormFactorPolyhedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, PolyhedralEdge, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, PolyhedralEdge, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, _Vlow, _Vhig):
+        """
+        __init__(PolyhedralEdge self, kvector_t _Vlow, kvector_t _Vhig) -> PolyhedralEdge
+
+        PolyhedralEdge::PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig)
+
+        """
+        this = _libBornAgainCore.new_PolyhedralEdge(_Vlow, _Vhig)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def E(self):
+        """
+        E(PolyhedralEdge self) -> kvector_t
+
+        kvector_t PolyhedralEdge::E() const 
+
+        """
+        return _libBornAgainCore.PolyhedralEdge_E(self)
+
+
+    def R(self):
+        """
+        R(PolyhedralEdge self) -> kvector_t
+
+        kvector_t PolyhedralEdge::R() const 
+
+        """
+        return _libBornAgainCore.PolyhedralEdge_R(self)
+
+
+    def qE(self, q):
+        """
+        qE(PolyhedralEdge self, cvector_t q) -> complex_t
+
+        complex_t PolyhedralEdge::qE(cvector_t q) const 
+
+        """
+        return _libBornAgainCore.PolyhedralEdge_qE(self, q)
+
+
+    def qR(self, q):
+        """
+        qR(PolyhedralEdge self, cvector_t q) -> complex_t
+
+        complex_t PolyhedralEdge::qR(cvector_t q) const 
+
+        """
+        return _libBornAgainCore.PolyhedralEdge_qR(self, q)
+
+
+    def contrib(self, m, qpa, qrperp):
+        """
+        contrib(PolyhedralEdge self, int m, cvector_t qpa, complex_t qrperp) -> complex_t
+
+        complex_t PolyhedralEdge::contrib(int m, const cvector_t qpa, complex_t qrperp) const
+
+        Returns sum_l=0^M/2 u^2l v^(M-2l) / (2l+1)!(M-2l)! - vperp^M/M! 
+
+        """
+        return _libBornAgainCore.PolyhedralEdge_contrib(self, m, qpa, qrperp)
+
+    __swig_destroy__ = _libBornAgainCore.delete_PolyhedralEdge
+    __del__ = lambda self: None
+PolyhedralEdge_swigregister = _libBornAgainCore.PolyhedralEdge_swigregister
+PolyhedralEdge_swigregister(PolyhedralEdge)
+
+class PolyhedralFace(_object):
+    """
+
+
+    A polygon, for form factor computation.
+
+    C++ includes: FormFactorPolyhedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, PolyhedralFace, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, PolyhedralFace, name)
+    __repr__ = _swig_repr
+
+    def diameter(V):
+        """diameter(vector_kvector_t V) -> double"""
+        return _libBornAgainCore.PolyhedralFace_diameter(V)
+
+    if _newclass:
+        diameter = staticmethod(diameter)
+    __swig_getmethods__["diameter"] = lambda x: diameter
+
+    def __init__(self, *args):
+        """
+        __init__(PolyhedralFace self, vector_kvector_t _V, bool _sym_S2=False) -> PolyhedralFace
+        __init__(PolyhedralFace self, vector_kvector_t _V) -> PolyhedralFace
+        __init__(PolyhedralFace self) -> PolyhedralFace
+
+        PolyhedralFace::PolyhedralFace(const std::vector< kvector_t > &_V=std::vector< kvector_t >(), bool _sym_S2=false)
+
+        Sets internal variables for given vertex chain.
+
+        Parameters:
+        -----------
+
+        V: 
+        oriented vertex list
+
+        _sym_S2: 
+        true if face has a perpedicular two-fold symmetry axis 
+
+        """
+        this = _libBornAgainCore.new_PolyhedralFace(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def area(self):
+        """
+        area(PolyhedralFace self) -> double
+
+        double PolyhedralFace::area() const 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_area(self)
+
+
+    def center(self):
+        """
+        center(PolyhedralFace self) -> kvector_t
+
+        kvector_t PolyhedralFace::center() const 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_center(self)
+
+
+    def pyramidalVolume(self):
+        """
+        pyramidalVolume(PolyhedralFace self) -> double
+
+        double PolyhedralFace::pyramidalVolume() const 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_pyramidalVolume(self)
+
+
+    def radius3d(self):
+        """
+        radius3d(PolyhedralFace self) -> double
+
+        double PolyhedralFace::radius3d() const 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_radius3d(self)
+
+
+    def normalProjectionConj(self, q):
+        """
+        normalProjectionConj(PolyhedralFace self, cvector_t q) -> complex_t
+
+        complex_t PolyhedralFace::normalProjectionConj(cvector_t q) const
+
+        Returns conj(q)*normal [ BasicVector3D::dot is antilinear in 'this' argument]. 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_normalProjectionConj(self, q)
+
+
+    def ff_n(self, m, q):
+        """
+        ff_n(PolyhedralFace self, int m, cvector_t q) -> complex_t
+
+        complex_t PolyhedralFace::ff_n(int m, const cvector_t q) const
+
+        Returns contribution qn*f_n [of order q^(n+1)] from this face to the polyhedral form factor. 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_ff_n(self, m, q)
+
+
+    def ff(self, q, sym_Ci):
+        """
+        ff(PolyhedralFace self, cvector_t q, bool const sym_Ci) -> complex_t
+
+        complex_t PolyhedralFace::ff(const cvector_t q, const bool sym_Ci) const
+
+        Returns the contribution ff(q) of this face to the polyhedral form factor. 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_ff(self, q, sym_Ci)
+
+
+    def ff_2D(self, qpa):
+        """
+        ff_2D(PolyhedralFace self, cvector_t qpa) -> complex_t
+
+        complex_t PolyhedralFace::ff_2D(const cvector_t qpa) const
+
+        Returns the two-dimensional form factor of this face, for use in a prism. 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_ff_2D(self, qpa)
+
+
+    def assert_Ci(self, other):
+        """
+        assert_Ci(PolyhedralFace self, PolyhedralFace other)
+
+        void PolyhedralFace::assert_Ci(const PolyhedralFace &other) const
+
+        Throws if deviation from inversion symmetry is detected. Does not check vertices. 
+
+        """
+        return _libBornAgainCore.PolyhedralFace_assert_Ci(self, other)
+
+    __swig_destroy__ = _libBornAgainCore.delete_PolyhedralFace
+    __del__ = lambda self: None
+PolyhedralFace_swigregister = _libBornAgainCore.PolyhedralFace_swigregister
+PolyhedralFace_swigregister(PolyhedralFace)
+
+def PolyhedralFace_diameter(V):
+    """PolyhedralFace_diameter(vector_kvector_t V) -> double"""
+    return _libBornAgainCore.PolyhedralFace_diameter(V)
+
+class FormFactorPolyhedron(IFormFactorBorn):
+    """
+
+
+    A polyhedron, for form factor computation.
+
+    C++ includes: FormFactorPolyhedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorPolyhedron, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorPolyhedron, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorPolyhedron self, cvector_t q) -> complex_t
+
+        complex_t FormFactorPolyhedron::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns the form factor F(q) of this polyhedron, respecting the offset z_origin. 
+
+        """
+        return _libBornAgainCore.FormFactorPolyhedron_evaluate_for_q(self, q)
+
+
+    def evaluate_centered(self, q):
+        """
+        evaluate_centered(FormFactorPolyhedron self, cvector_t q) -> complex_t
+
+        complex_t FormFactorPolyhedron::evaluate_centered(const cvector_t q) const
+
+        Returns the form factor F(q) of this polyhedron, with origin at z=0. 
+
+        """
+        return _libBornAgainCore.FormFactorPolyhedron_evaluate_centered(self, q)
+
+
+    def getVolume(self):
+        """
+        getVolume(FormFactorPolyhedron self) -> double
+
+        double FormFactorPolyhedron::getVolume() const overridefinal
+
+        Returns the total volume of the particle of this form factor's shape. 
+
+        """
+        return _libBornAgainCore.FormFactorPolyhedron_getVolume(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorPolyhedron self) -> double
+
+        double FormFactorPolyhedron::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorPolyhedron_getRadialExtension(self)
+
+
+    def assert_platonic(self):
+        """
+        assert_platonic(FormFactorPolyhedron self)
+
+        void FormFactorPolyhedron::assert_platonic() const
+
+        Assertions for Platonic solid. 
+
+        """
+        return _libBornAgainCore.FormFactorPolyhedron_assert_platonic(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPolyhedron
+    __del__ = lambda self: None
+FormFactorPolyhedron_swigregister = _libBornAgainCore.FormFactorPolyhedron_swigregister
+FormFactorPolyhedron_swigregister(FormFactorPolyhedron)
+
+class FormFactorPolygonalPrism(IFormFactorBorn):
+    """
+
+
+    A prism with a polygonal base, for form factor computation.
+
+    C++ includes: FormFactorPolyhedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorPolygonalPrism, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorPolygonalPrism, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorPolygonalPrism self, cvector_t q) -> complex_t
+
+        complex_t FormFactorPolygonalPrism::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns the form factor F(q) of this polyhedron, respecting the offset height/2. 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalPrism_evaluate_for_q(self, q)
+
+
+    def getVolume(self):
+        """
+        getVolume(FormFactorPolygonalPrism self) -> double
+
+        double FormFactorPolygonalPrism::getVolume() const
+
+        Returns the volume of this prism. 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalPrism_getVolume(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorPolygonalPrism self) -> double
+
+        double FormFactorPolygonalPrism::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalPrism_getHeight(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorPolygonalPrism self) -> double
+
+        double FormFactorPolygonalPrism::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalPrism_getRadialExtension(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPolygonalPrism
+    __del__ = lambda self: None
+FormFactorPolygonalPrism_swigregister = _libBornAgainCore.FormFactorPolygonalPrism_swigregister
+FormFactorPolygonalPrism_swigregister(FormFactorPolygonalPrism)
+
+class FormFactorPolygonalSurface(IFormFactorBorn):
+    """
+
+
+    A polygonal surface, for testing form factor computations.
+
+    C++ includes: FormFactorPolyhedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorPolygonalSurface, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorPolygonalSurface, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorPolygonalSurface self, cvector_t q) -> complex_t
+
+        complex_t FormFactorPolygonalSurface::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalSurface_evaluate_for_q(self, q)
+
+
+    def getVolume(self):
+        """
+        getVolume(FormFactorPolygonalSurface self) -> double
+
+        double FormFactorPolygonalSurface::getVolume() const override
+
+        Returns the total volume of the particle of this form factor's shape. 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalSurface_getVolume(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorPolygonalSurface self) -> double
+
+        double FormFactorPolygonalSurface::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorPolygonalSurface_getRadialExtension(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPolygonalSurface
+    __del__ = lambda self: None
+FormFactorPolygonalSurface_swigregister = _libBornAgainCore.FormFactorPolygonalSurface_swigregister
+FormFactorPolygonalSurface_swigregister(FormFactorPolygonalSurface)
+
+class FormFactorAnisoPyramid(FormFactorPolyhedron):
+    """
+
+
+    A frustum (truncated pyramid) with rectangular base.
+
+    C++ includes: FormFactorAnisoPyramid.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorAnisoPyramid, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorAnisoPyramid, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height, alpha):
+        """
+        __init__(FormFactorAnisoPyramid self, double length, double width, double height, double alpha) -> FormFactorAnisoPyramid
+
+        FormFactorAnisoPyramid::FormFactorAnisoPyramid(double length, double width, double height, double alpha)
+
+        Parameters:
+        -----------
+
+        length: 
+        of one side of the rectangular base
+
+        width: 
+        of other side of the rectangular base
+
+        height: 
+        of frustum
+
+        alpha: 
+        dihedral angle in radians between base and facet 
+
+        """
+        this = _libBornAgainCore.new_FormFactorAnisoPyramid(length, width, height, alpha)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorAnisoPyramid self) -> FormFactorAnisoPyramid
+
+        FormFactorAnisoPyramid* FormFactorAnisoPyramid::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorAnisoPyramid_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorAnisoPyramid self, ISampleVisitor visitor)
+
+        void FormFactorAnisoPyramid::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorAnisoPyramid_accept(self, visitor)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorAnisoPyramid self) -> double
+
+        double FormFactorAnisoPyramid::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorAnisoPyramid_getLength(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorAnisoPyramid self) -> double
+
+        double FormFactorAnisoPyramid::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorAnisoPyramid_getWidth(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorAnisoPyramid self) -> double
+
+        double FormFactorAnisoPyramid::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorAnisoPyramid_getHeight(self)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(FormFactorAnisoPyramid self) -> double
+
+        double FormFactorAnisoPyramid::getAlpha() const 
+
+        """
+        return _libBornAgainCore.FormFactorAnisoPyramid_getAlpha(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorAnisoPyramid
+    __del__ = lambda self: None
+FormFactorAnisoPyramid_swigregister = _libBornAgainCore.FormFactorAnisoPyramid_swigregister
+FormFactorAnisoPyramid_swigregister(FormFactorAnisoPyramid)
+
+class FormFactorBox(IFormFactorBorn):
+    """
+
+
+    A rectangular prism (parallelepiped).
+
+    C++ includes: FormFactorBox.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorBox, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorBox, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height):
+        """
+        __init__(FormFactorBox self, double length, double width, double height) -> FormFactorBox
+
+        FormFactorBox::FormFactorBox(double length, double width, double height)
+
+        Parameters:
+        -----------
+
+        length: 
+        of rectangular base
+
+        width: 
+        of rectangular base
+
+        height: 
+        of prism 
+
+        """
+        this = _libBornAgainCore.new_FormFactorBox(length, width, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorBox self) -> FormFactorBox
+
+        FormFactorBox* FormFactorBox::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorBox_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorBox self, ISampleVisitor visitor)
+
+        void FormFactorBox::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorBox_accept(self, visitor)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorBox self) -> double
+
+        double FormFactorBox::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorBox_getLength(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorBox self) -> double
+
+        double FormFactorBox::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorBox_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorBox self) -> double
+
+        double FormFactorBox::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorBox_getWidth(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorBox self) -> double
+
+        double FormFactorBox::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorBox_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorBox self, cvector_t q) -> complex_t
+
+        complex_t FormFactorBox::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorBox_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorBox
+    __del__ = lambda self: None
+FormFactorBox_swigregister = _libBornAgainCore.FormFactorBox_swigregister
+FormFactorBox_swigregister(FormFactorBox)
+
+class FormFactorCone(IFormFactorBorn):
+    """
+
+
+    A conical frustum (cone truncated parallel to the base) with circular base.
+
+    C++ includes: FormFactorCone.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorCone, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorCone, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius, height, alpha):
+        """
+        __init__(FormFactorCone self, double radius, double height, double alpha) -> FormFactorCone
+
+        FormFactorCone::FormFactorCone(double radius, double height, double alpha)
+
+        Parameters:
+        -----------
+
+        radius: 
+        of circular base
+
+        height: 
+        of frustum
+
+        alpha: 
+        angle in radians between base and lateral surface 
+
+        """
+        this = _libBornAgainCore.new_FormFactorCone(radius, height, alpha)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorCone self) -> FormFactorCone
+
+        FormFactorCone* FormFactorCone::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorCone_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorCone self, ISampleVisitor visitor)
+
+        void FormFactorCone::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorCone_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorCone self) -> double
+
+        double FormFactorCone::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorCone_getHeight(self)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(FormFactorCone self) -> double
+
+        double FormFactorCone::getAlpha() const 
+
+        """
+        return _libBornAgainCore.FormFactorCone_getAlpha(self)
+
+
+    def getRadius(self):
+        """
+        getRadius(FormFactorCone self) -> double
+
+        double FormFactorCone::getRadius() const 
+
+        """
+        return _libBornAgainCore.FormFactorCone_getRadius(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorCone self) -> double
+
+        double FormFactorCone::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorCone_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorCone self, cvector_t q) -> complex_t
+
+        complex_t FormFactorCone::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorCone_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorCone
+    __del__ = lambda self: None
+FormFactorCone_swigregister = _libBornAgainCore.FormFactorCone_swigregister
+FormFactorCone_swigregister(FormFactorCone)
+
+class FormFactorCone6(FormFactorPolyhedron):
+    """
+
+
+    A frustum (truncated pyramid) with regular hexagonal base.
+
+    C++ includes: FormFactorCone6.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorCone6, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorCone6, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, base_edge, height, alpha):
+        """
+        __init__(FormFactorCone6 self, double base_edge, double height, double alpha) -> FormFactorCone6
+
+        FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)
+
+        Parameters:
+        -----------
+
+        base_edge: 
+        of hexagonal base
+
+        height: 
+        of frustum
+
+        alpha: 
+        dihedral angle in radians between base and facet 
+
+        """
+        this = _libBornAgainCore.new_FormFactorCone6(base_edge, height, alpha)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorCone6 self) -> FormFactorCone6
+
+        FormFactorCone6* FormFactorCone6::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorCone6_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorCone6 self, ISampleVisitor visitor)
+
+        void FormFactorCone6::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorCone6_accept(self, visitor)
+
+
+    def getBaseEdge(self):
+        """
+        getBaseEdge(FormFactorCone6 self) -> double
+
+        double FormFactorCone6::getBaseEdge() const 
+
+        """
+        return _libBornAgainCore.FormFactorCone6_getBaseEdge(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorCone6 self) -> double
+
+        double FormFactorCone6::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorCone6_getHeight(self)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(FormFactorCone6 self) -> double
+
+        double FormFactorCone6::getAlpha() const 
+
+        """
+        return _libBornAgainCore.FormFactorCone6_getAlpha(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorCone6
+    __del__ = lambda self: None
+FormFactorCone6_swigregister = _libBornAgainCore.FormFactorCone6_swigregister
+FormFactorCone6_swigregister(FormFactorCone6)
+
+class FormFactorCrystal(IFormFactor):
+    """
+
+
+    The formfactor of a  MesoCrystal.
+
+    C++ includes: FormFactorCrystal.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorCrystal, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorCrystal, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, lattice, basis_form_factor, meso_form_factor):
+        """
+        __init__(FormFactorCrystal self, Lattice lattice, IFormFactor basis_form_factor, IFormFactor meso_form_factor) -> FormFactorCrystal
+
+        FormFactorCrystal::FormFactorCrystal(const Lattice &lattice, const IFormFactor &basis_form_factor, const IFormFactor &meso_form_factor)
+
+        """
+        this = _libBornAgainCore.new_FormFactorCrystal(lattice, basis_form_factor, meso_form_factor)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorCrystal
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(FormFactorCrystal self) -> FormFactorCrystal
+
+        FormFactorCrystal* FormFactorCrystal::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorCrystal_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorCrystal self, ISampleVisitor visitor)
+
+        void FormFactorCrystal::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorCrystal_accept(self, visitor)
+
+
+    def getVolume(self):
+        """
+        getVolume(FormFactorCrystal self) -> double
+
+        double FormFactorCrystal::getVolume() const overridefinal
+
+        Returns the total volume of the particle of this form factor's shape. 
+
+        """
+        return _libBornAgainCore.FormFactorCrystal_getVolume(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorCrystal self) -> double
+
+        double FormFactorCrystal::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorCrystal_getRadialExtension(self)
+
+
+    def evaluate(self, wavevectors):
+        """
+        evaluate(FormFactorCrystal self, WavevectorInfo wavevectors) -> complex_t
+
+        complex_t FormFactorCrystal::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+        Returns scattering amplitude for complex wavevectors ki, kf. 
+
+        """
+        return _libBornAgainCore.FormFactorCrystal_evaluate(self, wavevectors)
+
+FormFactorCrystal_swigregister = _libBornAgainCore.FormFactorCrystal_swigregister
+FormFactorCrystal_swigregister(FormFactorCrystal)
+
+class FormFactorCuboctahedron(FormFactorPolyhedron):
+    """
+
+
+    A truncated bifrustum with quadratic base.
+
+    C++ includes: FormFactorCuboctahedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorCuboctahedron, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorCuboctahedron, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, height, height_ratio, alpha):
+        """
+        __init__(FormFactorCuboctahedron self, double length, double height, double height_ratio, double alpha) -> FormFactorCuboctahedron
+
+        FormFactorCuboctahedron::FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha)
+
+        Parameters:
+        -----------
+
+        length: 
+        of one side of the square base
+
+        height: 
+        of bottom frustum
+
+        height_ratio: 
+        ratio of heights of top to bottom frustum
+
+        alpha: 
+        dihedral angle in radians between base and facet 
+
+        """
+        this = _libBornAgainCore.new_FormFactorCuboctahedron(length, height, height_ratio, alpha)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorCuboctahedron self) -> FormFactorCuboctahedron
+
+        FormFactorCuboctahedron* FormFactorCuboctahedron::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorCuboctahedron_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorCuboctahedron self, ISampleVisitor visitor)
+
+        void FormFactorCuboctahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorCuboctahedron_accept(self, visitor)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorCuboctahedron self) -> double
+
+        double FormFactorCuboctahedron::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorCuboctahedron_getLength(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorCuboctahedron self) -> double
+
+        double FormFactorCuboctahedron::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorCuboctahedron_getHeight(self)
+
+
+    def getHeightRatio(self):
+        """
+        getHeightRatio(FormFactorCuboctahedron self) -> double
+
+        double FormFactorCuboctahedron::getHeightRatio() const 
+
+        """
+        return _libBornAgainCore.FormFactorCuboctahedron_getHeightRatio(self)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(FormFactorCuboctahedron self) -> double
+
+        double FormFactorCuboctahedron::getAlpha() const 
+
+        """
+        return _libBornAgainCore.FormFactorCuboctahedron_getAlpha(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorCuboctahedron
+    __del__ = lambda self: None
+FormFactorCuboctahedron_swigregister = _libBornAgainCore.FormFactorCuboctahedron_swigregister
+FormFactorCuboctahedron_swigregister(FormFactorCuboctahedron)
+
+class FormFactorCylinder(IFormFactorBorn):
+    """
+
+
+    A circular cylinder.
+
+    C++ includes: FormFactorCylinder.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorCylinder, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorCylinder, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius, height):
+        """
+        __init__(FormFactorCylinder self, double radius, double height) -> FormFactorCylinder
+
+        FormFactorCylinder::FormFactorCylinder(double radius, double height)
+
+        """
+        this = _libBornAgainCore.new_FormFactorCylinder(radius, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorCylinder self) -> FormFactorCylinder
+
+        FormFactorCylinder* FormFactorCylinder::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorCylinder_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorCylinder self, ISampleVisitor visitor)
+
+        void FormFactorCylinder::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorCylinder_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorCylinder self) -> double
+
+        double FormFactorCylinder::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorCylinder_getHeight(self)
+
+
+    def getRadius(self):
+        """
+        getRadius(FormFactorCylinder self) -> double
+
+        double FormFactorCylinder::getRadius() const 
+
+        """
+        return _libBornAgainCore.FormFactorCylinder_getRadius(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorCylinder self) -> double
+
+        double FormFactorCylinder::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorCylinder_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorCylinder self, cvector_t q) -> complex_t
+
+        complex_t FormFactorCylinder::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorCylinder_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorCylinder
+    __del__ = lambda self: None
+FormFactorCylinder_swigregister = _libBornAgainCore.FormFactorCylinder_swigregister
+FormFactorCylinder_swigregister(FormFactorCylinder)
+
+class FormFactorDecoratorDebyeWaller(IFormFactorDecorator):
+    """
+
+
+    Debye-Waller factors in radial and z directions.
+
+    C++ includes: FormFactorDecoratorDebyeWaller.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorDecorator]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorDecoratorDebyeWaller, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorDecorator]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorDecoratorDebyeWaller, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FormFactorDecoratorDebyeWaller self, IFormFactor form_factor, double dw_h_factor, double dw_r_factor) -> FormFactorDecoratorDebyeWaller
+        __init__(FormFactorDecoratorDebyeWaller self, IFormFactor form_factor, double dw_factor) -> FormFactorDecoratorDebyeWaller
+
+        FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(const IFormFactor &form_factor, double dw_factor)
+
+        Isotropic Debye-Waller factor. 
+
+        """
+        this = _libBornAgainCore.new_FormFactorDecoratorDebyeWaller(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorDecoratorDebyeWaller self) -> FormFactorDecoratorDebyeWaller
+
+        FormFactorDecoratorDebyeWaller* FormFactorDecoratorDebyeWaller::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorDecoratorDebyeWaller_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorDecoratorDebyeWaller self, ISampleVisitor visitor)
+
+        void FormFactorDecoratorDebyeWaller::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorDecoratorDebyeWaller_accept(self, visitor)
+
+
+    def evaluate(self, wavevectors):
+        """
+        evaluate(FormFactorDecoratorDebyeWaller self, WavevectorInfo wavevectors) -> complex_t
+
+        complex_t FormFactorDecoratorDebyeWaller::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+        Returns scattering amplitude for complex wavevectors ki, kf. 
+
+        """
+        return _libBornAgainCore.FormFactorDecoratorDebyeWaller_evaluate(self, wavevectors)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorDecoratorDebyeWaller
+    __del__ = lambda self: None
+FormFactorDecoratorDebyeWaller_swigregister = _libBornAgainCore.FormFactorDecoratorDebyeWaller_swigregister
+FormFactorDecoratorDebyeWaller_swigregister(FormFactorDecoratorDebyeWaller)
+
+class FormFactorDodecahedron(FormFactorPolyhedron):
+    """
+
+
+    A regular dodecahedron.
+
+    C++ includes: FormFactorDodecahedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorDodecahedron, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorDodecahedron, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, edge):
+        """
+        __init__(FormFactorDodecahedron self, double edge) -> FormFactorDodecahedron
+
+        FormFactorDodecahedron::FormFactorDodecahedron(double edge)
+
+        Constructs a regular dodecahedron.
+
+        Parameters:
+        -----------
+
+        edge: 
+        length 
+
+        """
+        this = _libBornAgainCore.new_FormFactorDodecahedron(edge)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorDodecahedron self) -> FormFactorDodecahedron
+
+        FormFactorDodecahedron* FormFactorDodecahedron::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorDodecahedron_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorDodecahedron self, ISampleVisitor visitor)
+
+        void FormFactorDodecahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorDodecahedron_accept(self, visitor)
+
+
+    def getEdge(self):
+        """
+        getEdge(FormFactorDodecahedron self) -> double
+
+        double FormFactorDodecahedron::getEdge() const 
+
+        """
+        return _libBornAgainCore.FormFactorDodecahedron_getEdge(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorDodecahedron
+    __del__ = lambda self: None
+FormFactorDodecahedron_swigregister = _libBornAgainCore.FormFactorDodecahedron_swigregister
+FormFactorDodecahedron_swigregister(FormFactorDodecahedron)
+
+class FormFactorEllipsoidalCylinder(IFormFactorBorn):
+    """
+
+
+    A cylinder with elliptical base.
+
+    C++ includes: FormFactorEllipsoidalCylinder.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorEllipsoidalCylinder, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorEllipsoidalCylinder, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius_x, radius_y, height):
+        """
+        __init__(FormFactorEllipsoidalCylinder self, double radius_x, double radius_y, double height) -> FormFactorEllipsoidalCylinder
+
+        FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height)
+
+        Parameters:
+        -----------
+
+        radius_x: 
+        half length of one horizontal main axes
+
+        radius_y: 
+        half length of the other horizontal main axes
+
+        height: 
+
+        """
+        this = _libBornAgainCore.new_FormFactorEllipsoidalCylinder(radius_x, radius_y, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorEllipsoidalCylinder self) -> FormFactorEllipsoidalCylinder
+
+        FormFactorEllipsoidalCylinder* FormFactorEllipsoidalCylinder::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorEllipsoidalCylinder_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorEllipsoidalCylinder self, ISampleVisitor visitor)
+
+        void FormFactorEllipsoidalCylinder::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorEllipsoidalCylinder_accept(self, visitor)
+
+
+    def getRadiusX(self):
+        """
+        getRadiusX(FormFactorEllipsoidalCylinder self) -> double
+
+        double FormFactorEllipsoidalCylinder::getRadiusX() const 
+
+        """
+        return _libBornAgainCore.FormFactorEllipsoidalCylinder_getRadiusX(self)
+
+
+    def getRadiusY(self):
+        """
+        getRadiusY(FormFactorEllipsoidalCylinder self) -> double
+
+        double FormFactorEllipsoidalCylinder::getRadiusY() const 
+
+        """
+        return _libBornAgainCore.FormFactorEllipsoidalCylinder_getRadiusY(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorEllipsoidalCylinder self) -> double
+
+        double FormFactorEllipsoidalCylinder::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorEllipsoidalCylinder_getHeight(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorEllipsoidalCylinder self) -> double
+
+        double FormFactorEllipsoidalCylinder::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorEllipsoidalCylinder_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorEllipsoidalCylinder self, cvector_t q) -> complex_t
+
+        complex_t FormFactorEllipsoidalCylinder::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorEllipsoidalCylinder_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorEllipsoidalCylinder
+    __del__ = lambda self: None
+FormFactorEllipsoidalCylinder_swigregister = _libBornAgainCore.FormFactorEllipsoidalCylinder_swigregister
+FormFactorEllipsoidalCylinder_swigregister(FormFactorEllipsoidalCylinder)
+
+class FormFactorFullSphere(IFormFactorBorn):
+    """
+
+
+    A full sphere.
+
+    C++ includes: FormFactorFullSphere.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorFullSphere, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorFullSphere, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius):
+        """
+        __init__(FormFactorFullSphere self, double radius) -> FormFactorFullSphere
+
+        FormFactorFullSphere::FormFactorFullSphere(double radius)
+
+        """
+        this = _libBornAgainCore.new_FormFactorFullSphere(radius)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorFullSphere self) -> FormFactorFullSphere
+
+        FormFactorFullSphere* FormFactorFullSphere::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorFullSphere_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorFullSphere self, ISampleVisitor visitor)
+
+        void FormFactorFullSphere::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorFullSphere_accept(self, visitor)
+
+
+    def getRadius(self):
+        """
+        getRadius(FormFactorFullSphere self) -> double
+
+        double FormFactorFullSphere::getRadius() const 
+
+        """
+        return _libBornAgainCore.FormFactorFullSphere_getRadius(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorFullSphere self) -> double
+
+        double FormFactorFullSphere::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorFullSphere_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorFullSphere self, cvector_t q) -> complex_t
+
+        complex_t FormFactorFullSphere::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorFullSphere_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorFullSphere
+    __del__ = lambda self: None
+FormFactorFullSphere_swigregister = _libBornAgainCore.FormFactorFullSphere_swigregister
+FormFactorFullSphere_swigregister(FormFactorFullSphere)
+
+class FormFactorFullSpheroid(IFormFactorBorn):
+    """
+
+
+    A full spheroid (an ellipsoid with two equal axes, hence with circular cross section)
+
+    C++ includes: FormFactorFullSpheroid.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorFullSpheroid, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorFullSpheroid, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius, height):
+        """
+        __init__(FormFactorFullSpheroid self, double radius, double height) -> FormFactorFullSpheroid
+
+        FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height)
+
+        Parameters:
+        -----------
+
+        radius: 
+        of the two equal axes
+
+        height: 
+        total height of the spheroid, i.e. twice the radius of the third axis 
+
+        """
+        this = _libBornAgainCore.new_FormFactorFullSpheroid(radius, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorFullSpheroid self) -> FormFactorFullSpheroid
+
+        FormFactorFullSpheroid* FormFactorFullSpheroid::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorFullSpheroid_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorFullSpheroid self, ISampleVisitor visitor)
+
+        void FormFactorFullSpheroid::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorFullSpheroid_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorFullSpheroid self) -> double
+
+        double FormFactorFullSpheroid::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorFullSpheroid_getHeight(self)
+
+
+    def getRadius(self):
+        """
+        getRadius(FormFactorFullSpheroid self) -> double
+
+        double FormFactorFullSpheroid::getRadius() const 
+
+        """
+        return _libBornAgainCore.FormFactorFullSpheroid_getRadius(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorFullSpheroid self) -> double
+
+        double FormFactorFullSpheroid::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorFullSpheroid_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorFullSpheroid self, cvector_t q) -> complex_t
+
+        complex_t FormFactorFullSpheroid::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorFullSpheroid_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorFullSpheroid
+    __del__ = lambda self: None
+FormFactorFullSpheroid_swigregister = _libBornAgainCore.FormFactorFullSpheroid_swigregister
+FormFactorFullSpheroid_swigregister(FormFactorFullSpheroid)
+
+class FormFactorGauss(IFormFactorBorn):
+    """
+
+
+    The formfactor of a gaussian.
+
+    C++ includes: FormFactorGauss.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorGauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorGauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FormFactorGauss self, double length) -> FormFactorGauss
+        __init__(FormFactorGauss self, double width, double height) -> FormFactorGauss
+
+        FormFactorGauss::FormFactorGauss(double width, double height)
+
+        """
+        this = _libBornAgainCore.new_FormFactorGauss(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorGauss self) -> FormFactorGauss
+
+        FormFactorGauss* FormFactorGauss::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorGauss_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorGauss self, ISampleVisitor visitor)
+
+        void FormFactorGauss::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorGauss_accept(self, visitor)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorGauss self) -> double
+
+        double FormFactorGauss::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorGauss_getWidth(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorGauss self) -> double
+
+        double FormFactorGauss::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorGauss_getHeight(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorGauss self) -> double
+
+        double FormFactorGauss::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorGauss_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorGauss self, cvector_t q) -> complex_t
+
+        complex_t FormFactorGauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorGauss_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorGauss
+    __del__ = lambda self: None
+FormFactorGauss_swigregister = _libBornAgainCore.FormFactorGauss_swigregister
+FormFactorGauss_swigregister(FormFactorGauss)
+
+class FormFactorHemiEllipsoid(IFormFactorBorn):
+    """
+
+
+    An hemi ellipsoid, obtained by truncating a full ellipsoid in the middle plane spanned by two principal axes.
+
+    C++ includes: FormFactorHemiEllipsoid.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorHemiEllipsoid, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorHemiEllipsoid, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius_x, radius_y, height):
+        """
+        __init__(FormFactorHemiEllipsoid self, double radius_x, double radius_y, double height) -> FormFactorHemiEllipsoid
+
+        FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)
+
+        Parameters:
+        -----------
+
+        radius_x: 
+        half length of one horizontal main axes
+
+        radius_y: 
+        half length of the other horizontal main axes
+
+        height: 
+        of the hemi ellipsoid 
+
+        """
+        this = _libBornAgainCore.new_FormFactorHemiEllipsoid(radius_x, radius_y, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorHemiEllipsoid
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(FormFactorHemiEllipsoid self) -> FormFactorHemiEllipsoid
+
+        FormFactorHemiEllipsoid* FormFactorHemiEllipsoid::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorHemiEllipsoid_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorHemiEllipsoid self, ISampleVisitor visitor)
+
+        void FormFactorHemiEllipsoid::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorHemiEllipsoid_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorHemiEllipsoid self) -> double
+
+        double FormFactorHemiEllipsoid::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorHemiEllipsoid_getHeight(self)
+
+
+    def getRadiusX(self):
+        """
+        getRadiusX(FormFactorHemiEllipsoid self) -> double
+
+        double FormFactorHemiEllipsoid::getRadiusX() const 
+
+        """
+        return _libBornAgainCore.FormFactorHemiEllipsoid_getRadiusX(self)
+
+
+    def getRadiusY(self):
+        """
+        getRadiusY(FormFactorHemiEllipsoid self) -> double
+
+        double FormFactorHemiEllipsoid::getRadiusY() const 
+
+        """
+        return _libBornAgainCore.FormFactorHemiEllipsoid_getRadiusY(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorHemiEllipsoid self) -> double
+
+        double FormFactorHemiEllipsoid::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorHemiEllipsoid_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorHemiEllipsoid self, cvector_t q) -> complex_t
+
+        complex_t FormFactorHemiEllipsoid::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorHemiEllipsoid_evaluate_for_q(self, q)
+
+FormFactorHemiEllipsoid_swigregister = _libBornAgainCore.FormFactorHemiEllipsoid_swigregister
+FormFactorHemiEllipsoid_swigregister(FormFactorHemiEllipsoid)
+
+class FormFactorIcosahedron(FormFactorPolyhedron):
+    """
+
+
+    A regular icosahedron.
+
+    C++ includes: FormFactorIcosahedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorIcosahedron, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorIcosahedron, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, edge):
+        """
+        __init__(FormFactorIcosahedron self, double edge) -> FormFactorIcosahedron
+
+        FormFactorIcosahedron::FormFactorIcosahedron(double edge)
+
+        """
+        this = _libBornAgainCore.new_FormFactorIcosahedron(edge)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorIcosahedron self) -> FormFactorIcosahedron
+
+        FormFactorIcosahedron* FormFactorIcosahedron::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorIcosahedron_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorIcosahedron self, ISampleVisitor visitor)
+
+        void FormFactorIcosahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorIcosahedron_accept(self, visitor)
+
+
+    def getEdge(self):
+        """
+        getEdge(FormFactorIcosahedron self) -> double
+
+        double FormFactorIcosahedron::getEdge() const 
+
+        """
+        return _libBornAgainCore.FormFactorIcosahedron_getEdge(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorIcosahedron
+    __del__ = lambda self: None
+FormFactorIcosahedron_swigregister = _libBornAgainCore.FormFactorIcosahedron_swigregister
+FormFactorIcosahedron_swigregister(FormFactorIcosahedron)
+
+class FormFactorLongBoxGauss(IFormFactorBorn):
+    """
+
+
+    The formfactor for a long rectangular box.
+
+    C++ includes: FormFactorLongBoxGauss.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorLongBoxGauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorLongBoxGauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height):
+        """
+        __init__(FormFactorLongBoxGauss self, double length, double width, double height) -> FormFactorLongBoxGauss
+
+        FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)
+
+        Box constructor.
+
+        Parameters:
+        -----------
+
+        length: 
+        of Box's base
+
+        width: 
+        of Box's base
+
+        height: 
+        of Box 
+
+        """
+        this = _libBornAgainCore.new_FormFactorLongBoxGauss(length, width, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorLongBoxGauss self) -> FormFactorLongBoxGauss
+
+        FormFactorLongBoxGauss* FormFactorLongBoxGauss::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxGauss_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorLongBoxGauss self, ISampleVisitor visitor)
+
+        void FormFactorLongBoxGauss::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxGauss_accept(self, visitor)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorLongBoxGauss self) -> double
+
+        double FormFactorLongBoxGauss::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxGauss_getLength(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorLongBoxGauss self) -> double
+
+        double FormFactorLongBoxGauss::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxGauss_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorLongBoxGauss self) -> double
+
+        double FormFactorLongBoxGauss::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxGauss_getWidth(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorLongBoxGauss self) -> double
+
+        double FormFactorLongBoxGauss::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxGauss_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorLongBoxGauss self, cvector_t q) -> complex_t
+
+        complex_t FormFactorLongBoxGauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxGauss_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorLongBoxGauss
+    __del__ = lambda self: None
+FormFactorLongBoxGauss_swigregister = _libBornAgainCore.FormFactorLongBoxGauss_swigregister
+FormFactorLongBoxGauss_swigregister(FormFactorLongBoxGauss)
+
+class FormFactorLongBoxLorentz(IFormFactorBorn):
+    """
+
+
+    The formfactor for a long rectangular box.
+
+    C++ includes: FormFactorLongBoxLorentz.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorLongBoxLorentz, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorLongBoxLorentz, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height):
+        """
+        __init__(FormFactorLongBoxLorentz self, double length, double width, double height) -> FormFactorLongBoxLorentz
+
+        FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)
+
+        Box constructor.
+
+        Parameters:
+        -----------
+
+        length: 
+        of Box's base
+
+        width: 
+        of Box's base
+
+        height: 
+        of Box 
+
+        """
+        this = _libBornAgainCore.new_FormFactorLongBoxLorentz(length, width, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorLongBoxLorentz self) -> FormFactorLongBoxLorentz
+
+        FormFactorLongBoxLorentz* FormFactorLongBoxLorentz::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxLorentz_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorLongBoxLorentz self, ISampleVisitor visitor)
+
+        void FormFactorLongBoxLorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxLorentz_accept(self, visitor)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorLongBoxLorentz self) -> double
+
+        double FormFactorLongBoxLorentz::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxLorentz_getLength(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorLongBoxLorentz self) -> double
+
+        double FormFactorLongBoxLorentz::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxLorentz_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorLongBoxLorentz self) -> double
+
+        double FormFactorLongBoxLorentz::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxLorentz_getWidth(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorLongBoxLorentz self) -> double
+
+        double FormFactorLongBoxLorentz::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxLorentz_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorLongBoxLorentz self, cvector_t q) -> complex_t
+
+        complex_t FormFactorLongBoxLorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorLongBoxLorentz_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorLongBoxLorentz
+    __del__ = lambda self: None
+FormFactorLongBoxLorentz_swigregister = _libBornAgainCore.FormFactorLongBoxLorentz_swigregister
+FormFactorLongBoxLorentz_swigregister(FormFactorLongBoxLorentz)
+
+class FormFactorLongRipple1Gauss(IFormFactorBorn):
+    """
+
+
+    The formfactor for a cosine ripple.
+
+    C++ includes: FormFactorLongRipple1Gauss.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorLongRipple1Gauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorLongRipple1Gauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height):
+        """
+        __init__(FormFactorLongRipple1Gauss self, double length, double width, double height) -> FormFactorLongRipple1Gauss
+
+        FormFactorLongRipple1Gauss::FormFactorLongRipple1Gauss(double length, double width, double height)
+
+        Ripple1 constructor.
+
+        Parameters:
+        -----------
+
+        length: 
+        of Ripple1
+
+        width: 
+        of cosine cross section
+
+        height: 
+        of cosine cross section 
+
+        """
+        this = _libBornAgainCore.new_FormFactorLongRipple1Gauss(length, width, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorLongRipple1Gauss self) -> FormFactorLongRipple1Gauss
+
+        FormFactorLongRipple1Gauss* FormFactorLongRipple1Gauss::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Gauss_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorLongRipple1Gauss self, ISampleVisitor visitor)
+
+        void FormFactorLongRipple1Gauss::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Gauss_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorLongRipple1Gauss self) -> double
+
+        double FormFactorLongRipple1Gauss::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Gauss_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorLongRipple1Gauss self) -> double
+
+        double FormFactorLongRipple1Gauss::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Gauss_getWidth(self)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorLongRipple1Gauss self) -> double
+
+        double FormFactorLongRipple1Gauss::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Gauss_getLength(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorLongRipple1Gauss self) -> double
+
+        double FormFactorLongRipple1Gauss::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Gauss_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorLongRipple1Gauss self, cvector_t q) -> complex_t
+
+        complex_t FormFactorLongRipple1Gauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Complex formfactor. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Gauss_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorLongRipple1Gauss
+    __del__ = lambda self: None
+FormFactorLongRipple1Gauss_swigregister = _libBornAgainCore.FormFactorLongRipple1Gauss_swigregister
+FormFactorLongRipple1Gauss_swigregister(FormFactorLongRipple1Gauss)
+
+class FormFactorLongRipple1Lorentz(IFormFactorBorn):
+    """
+
+
+    The formfactor for a cosine ripple.
+
+    C++ includes: FormFactorLongRipple1Lorentz.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorLongRipple1Lorentz, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorLongRipple1Lorentz, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height):
+        """
+        __init__(FormFactorLongRipple1Lorentz self, double length, double width, double height) -> FormFactorLongRipple1Lorentz
+
+        FormFactorLongRipple1Lorentz::FormFactorLongRipple1Lorentz(double length, double width, double height)
+
+        FormFactorLongRipple1Lorentz constructor.
+
+        Parameters:
+        -----------
+
+        length: 
+        of Ripple1
+
+        width: 
+        of cosine cross section
+
+        height: 
+        of cosine cross section 
+
+        """
+        this = _libBornAgainCore.new_FormFactorLongRipple1Lorentz(length, width, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorLongRipple1Lorentz self) -> FormFactorLongRipple1Lorentz
+
+        FormFactorLongRipple1Lorentz* FormFactorLongRipple1Lorentz::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Lorentz_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorLongRipple1Lorentz self, ISampleVisitor visitor)
+
+        void FormFactorLongRipple1Lorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Lorentz_accept(self, visitor)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorLongRipple1Lorentz self) -> double
+
+        double FormFactorLongRipple1Lorentz::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Lorentz_getRadialExtension(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorLongRipple1Lorentz self) -> double
+
+        double FormFactorLongRipple1Lorentz::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Lorentz_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorLongRipple1Lorentz self) -> double
+
+        double FormFactorLongRipple1Lorentz::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Lorentz_getWidth(self)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorLongRipple1Lorentz self) -> double
+
+        double FormFactorLongRipple1Lorentz::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Lorentz_getLength(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorLongRipple1Lorentz self, cvector_t q) -> complex_t
+
+        complex_t FormFactorLongRipple1Lorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Complex formfactor. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple1Lorentz_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorLongRipple1Lorentz
+    __del__ = lambda self: None
+FormFactorLongRipple1Lorentz_swigregister = _libBornAgainCore.FormFactorLongRipple1Lorentz_swigregister
+FormFactorLongRipple1Lorentz_swigregister(FormFactorLongRipple1Lorentz)
+
+class FormFactorLongRipple2Gauss(IFormFactorBorn):
+    """
+
+
+    The formfactor for a triangular ripple.
+
+    C++ includes: FormFactorLongRipple2Gauss.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorLongRipple2Gauss, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorLongRipple2Gauss, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height, asymmetry):
+        """
+        __init__(FormFactorLongRipple2Gauss self, double length, double width, double height, double asymmetry) -> FormFactorLongRipple2Gauss
+
+        FormFactorLongRipple2Gauss::FormFactorLongRipple2Gauss(double length, double width, double height, double asymmetry)
+
+        FormFactorLongRipple2Gauss constructor.
+
+        Parameters:
+        -----------
+
+        length: 
+        of Ripple2
+
+        width: 
+        of triangular cross section
+
+        height: 
+        of triangular cross section
+
+        asymmetry: 
+        length of triangular cross section 
+
+        """
+        this = _libBornAgainCore.new_FormFactorLongRipple2Gauss(length, width, height, asymmetry)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorLongRipple2Gauss self) -> FormFactorLongRipple2Gauss
+
+        FormFactorLongRipple2Gauss* FormFactorLongRipple2Gauss::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorLongRipple2Gauss self, ISampleVisitor visitor)
+
+        void FormFactorLongRipple2Gauss::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorLongRipple2Gauss self) -> double
+
+        double FormFactorLongRipple2Gauss::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorLongRipple2Gauss self) -> double
+
+        double FormFactorLongRipple2Gauss::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_getWidth(self)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorLongRipple2Gauss self) -> double
+
+        double FormFactorLongRipple2Gauss::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_getLength(self)
+
+
+    def getAsymmetry(self):
+        """
+        getAsymmetry(FormFactorLongRipple2Gauss self) -> double
+
+        double FormFactorLongRipple2Gauss::getAsymmetry() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_getAsymmetry(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorLongRipple2Gauss self) -> double
+
+        double FormFactorLongRipple2Gauss::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorLongRipple2Gauss self, cvector_t q) -> complex_t
+
+        complex_t FormFactorLongRipple2Gauss::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Complex formfactor. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Gauss_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorLongRipple2Gauss
+    __del__ = lambda self: None
+FormFactorLongRipple2Gauss_swigregister = _libBornAgainCore.FormFactorLongRipple2Gauss_swigregister
+FormFactorLongRipple2Gauss_swigregister(FormFactorLongRipple2Gauss)
+
+class FormFactorLongRipple2Lorentz(IFormFactorBorn):
+    """
+
+
+    The formfactor for a triangular ripple.
+
+    C++ includes: FormFactorLongRipple2Lorentz.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorLongRipple2Lorentz, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorLongRipple2Lorentz, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height, asymmetry):
+        """
+        __init__(FormFactorLongRipple2Lorentz self, double length, double width, double height, double asymmetry) -> FormFactorLongRipple2Lorentz
+
+        FormFactorLongRipple2Lorentz::FormFactorLongRipple2Lorentz(double length, double width, double height, double asymmetry)
+
+        Parameters:
+        -----------
+
+        length: 
+        of Ripple2
+
+        width: 
+        of triangular cross section
+
+        height: 
+        of triangular cross section
+
+        asymmetry: 
+        length of triangular cross section 
+
+        """
+        this = _libBornAgainCore.new_FormFactorLongRipple2Lorentz(length, width, height, asymmetry)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorLongRipple2Lorentz self) -> FormFactorLongRipple2Lorentz
+
+        FormFactorLongRipple2Lorentz* FormFactorLongRipple2Lorentz::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorLongRipple2Lorentz self, ISampleVisitor visitor)
+
+        void FormFactorLongRipple2Lorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorLongRipple2Lorentz self) -> double
+
+        double FormFactorLongRipple2Lorentz::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorLongRipple2Lorentz self) -> double
+
+        double FormFactorLongRipple2Lorentz::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_getWidth(self)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorLongRipple2Lorentz self) -> double
+
+        double FormFactorLongRipple2Lorentz::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_getLength(self)
+
+
+    def getAsymmetry(self):
+        """
+        getAsymmetry(FormFactorLongRipple2Lorentz self) -> double
+
+        double FormFactorLongRipple2Lorentz::getAsymmetry() const 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_getAsymmetry(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorLongRipple2Lorentz self) -> double
+
+        double FormFactorLongRipple2Lorentz::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorLongRipple2Lorentz self, cvector_t q) -> complex_t
+
+        complex_t FormFactorLongRipple2Lorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Complex formfactor. 
+
+        """
+        return _libBornAgainCore.FormFactorLongRipple2Lorentz_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorLongRipple2Lorentz
+    __del__ = lambda self: None
+FormFactorLongRipple2Lorentz_swigregister = _libBornAgainCore.FormFactorLongRipple2Lorentz_swigregister
+FormFactorLongRipple2Lorentz_swigregister(FormFactorLongRipple2Lorentz)
+
+class FormFactorLorentz(IFormFactorBorn):
+    """
+
+
+    The formfactor of a lorentzian.
+
+    C++ includes: FormFactorLorentz.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorLorentz, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorLorentz, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FormFactorLorentz self, double length) -> FormFactorLorentz
+        __init__(FormFactorLorentz self, double width, double height) -> FormFactorLorentz
+
+        FormFactorLorentz::FormFactorLorentz(double width, double height)
+
+        """
+        this = _libBornAgainCore.new_FormFactorLorentz(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorLorentz self) -> FormFactorLorentz
+
+        FormFactorLorentz* FormFactorLorentz::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorLorentz_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorLorentz self, ISampleVisitor visitor)
+
+        void FormFactorLorentz::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorLorentz_accept(self, visitor)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorLorentz self) -> double
+
+        double FormFactorLorentz::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorLorentz_getWidth(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorLorentz self) -> double
+
+        double FormFactorLorentz::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorLorentz_getHeight(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorLorentz self) -> double
+
+        double FormFactorLorentz::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorLorentz_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorLorentz self, cvector_t q) -> complex_t
+
+        complex_t FormFactorLorentz::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorLorentz_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorLorentz
+    __del__ = lambda self: None
+FormFactorLorentz_swigregister = _libBornAgainCore.FormFactorLorentz_swigregister
+FormFactorLorentz_swigregister(FormFactorLorentz)
+
+class FormFactorPrism3(FormFactorPolygonalPrism):
+    """
+
+
+    A prism based on an equilateral triangle.
+
+    C++ includes: FormFactorPrism3.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolygonalPrism]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorPrism3, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolygonalPrism]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorPrism3, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, base_edge, height):
+        """
+        __init__(FormFactorPrism3 self, double const base_edge, double const height) -> FormFactorPrism3
+
+        FormFactorPrism3::FormFactorPrism3(const double base_edge, const double height)
+
+        """
+        this = _libBornAgainCore.new_FormFactorPrism3(base_edge, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorPrism3 self) -> FormFactorPrism3
+
+        FormFactorPrism3* FormFactorPrism3::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorPrism3_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorPrism3 self, ISampleVisitor visitor)
+
+        void FormFactorPrism3::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorPrism3_accept(self, visitor)
+
+
+    def getBaseEdge(self):
+        """
+        getBaseEdge(FormFactorPrism3 self) -> double
+
+        double FormFactorPrism3::getBaseEdge() const 
+
+        """
+        return _libBornAgainCore.FormFactorPrism3_getBaseEdge(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPrism3
+    __del__ = lambda self: None
+FormFactorPrism3_swigregister = _libBornAgainCore.FormFactorPrism3_swigregister
+FormFactorPrism3_swigregister(FormFactorPrism3)
+
+class FormFactorPrism6(FormFactorPolygonalPrism):
+    """
+
+
+    A prism based on a regular hexagonal.
+
+    C++ includes: FormFactorPrism6.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolygonalPrism]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorPrism6, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolygonalPrism]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorPrism6, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, base_edge, height):
+        """
+        __init__(FormFactorPrism6 self, double const base_edge, double const height) -> FormFactorPrism6
+
+        FormFactorPrism6::FormFactorPrism6(const double base_edge, const double height)
+
+        """
+        this = _libBornAgainCore.new_FormFactorPrism6(base_edge, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorPrism6 self) -> FormFactorPrism6
+
+        FormFactorPrism6* FormFactorPrism6::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorPrism6_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorPrism6 self, ISampleVisitor visitor)
+
+        void FormFactorPrism6::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorPrism6_accept(self, visitor)
+
+
+    def getBaseEdge(self):
+        """
+        getBaseEdge(FormFactorPrism6 self) -> double
+
+        double FormFactorPrism6::getBaseEdge() const 
+
+        """
+        return _libBornAgainCore.FormFactorPrism6_getBaseEdge(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPrism6
+    __del__ = lambda self: None
+FormFactorPrism6_swigregister = _libBornAgainCore.FormFactorPrism6_swigregister
+FormFactorPrism6_swigregister(FormFactorPrism6)
+
+class FormFactorPyramid(FormFactorPolyhedron):
+    """
+
+
+    A frustum with a quadratic base.
+
+    C++ includes: FormFactorPyramid.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorPyramid, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorPyramid, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, base_edge, height, alpha):
+        """
+        __init__(FormFactorPyramid self, double base_edge, double height, double alpha) -> FormFactorPyramid
+
+        FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)
+
+        Parameters:
+        -----------
+
+        base_edge: 
+        of one side of the square base
+
+        height: 
+        of the frustum
+
+        alpha: 
+        dihedral angle in radians between base and facet 
+
+        """
+        this = _libBornAgainCore.new_FormFactorPyramid(base_edge, height, alpha)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorPyramid self) -> FormFactorPyramid
+
+        FormFactorPyramid* FormFactorPyramid::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorPyramid_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorPyramid self, ISampleVisitor visitor)
+
+        void FormFactorPyramid::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorPyramid_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorPyramid self) -> double
+
+        double FormFactorPyramid::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorPyramid_getHeight(self)
+
+
+    def getBaseEdge(self):
+        """
+        getBaseEdge(FormFactorPyramid self) -> double
+
+        double FormFactorPyramid::getBaseEdge() const 
+
+        """
+        return _libBornAgainCore.FormFactorPyramid_getBaseEdge(self)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(FormFactorPyramid self) -> double
+
+        double FormFactorPyramid::getAlpha() const 
+
+        """
+        return _libBornAgainCore.FormFactorPyramid_getAlpha(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorPyramid
+    __del__ = lambda self: None
+FormFactorPyramid_swigregister = _libBornAgainCore.FormFactorPyramid_swigregister
+FormFactorPyramid_swigregister(FormFactorPyramid)
+
+class FormFactorRipple1(IFormFactorBorn):
+    """
+
+
+    The formfactor for a cosine ripple.
+
+    C++ includes: FormFactorRipple1.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorRipple1, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorRipple1, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height):
+        """
+        __init__(FormFactorRipple1 self, double length, double width, double height) -> FormFactorRipple1
+
+        FormFactorRipple1::FormFactorRipple1(double length, double width, double height)
+
+        Ripple1 constructor.
+
+        Parameters:
+        -----------
+
+        length: 
+        of Ripple1
+
+        width: 
+        of cosine cross section
+
+        height: 
+        of cosine cross section 
+
+        """
+        this = _libBornAgainCore.new_FormFactorRipple1(length, width, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorRipple1 self) -> FormFactorRipple1
+
+        FormFactorRipple1* FormFactorRipple1::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorRipple1_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorRipple1 self, ISampleVisitor visitor)
+
+        void FormFactorRipple1::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorRipple1_accept(self, visitor)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorRipple1 self) -> double
+
+        double FormFactorRipple1::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorRipple1_getLength(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorRipple1 self) -> double
+
+        double FormFactorRipple1::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorRipple1_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorRipple1 self) -> double
+
+        double FormFactorRipple1::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorRipple1_getWidth(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorRipple1 self) -> double
+
+        double FormFactorRipple1::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorRipple1_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorRipple1 self, cvector_t q) -> complex_t
+
+        complex_t FormFactorRipple1::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Complex formfactor. 
+
+        """
+        return _libBornAgainCore.FormFactorRipple1_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorRipple1
+    __del__ = lambda self: None
+FormFactorRipple1_swigregister = _libBornAgainCore.FormFactorRipple1_swigregister
+FormFactorRipple1_swigregister(FormFactorRipple1)
+
+class FormFactorRipple2(IFormFactorBorn):
+    """
+
+
+    The formfactor for a triangular ripple.
+
+    C++ includes: FormFactorRipple2.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorRipple2, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorRipple2, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, width, height, asymmetry):
+        """
+        __init__(FormFactorRipple2 self, double length, double width, double height, double asymmetry) -> FormFactorRipple2
+
+        FormFactorRipple2::FormFactorRipple2(double length, double width, double height, double asymmetry)
+
+        Ripple2 constructor.
+
+        Parameters:
+        -----------
+
+        length: 
+        of Ripple2
+
+        width: 
+        of triangular cross section
+
+        height: 
+        of triangular cross section
+
+        asymmetry: 
+        length of triangular cross section 
+
+        """
+        this = _libBornAgainCore.new_FormFactorRipple2(length, width, height, asymmetry)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorRipple2 self) -> FormFactorRipple2
+
+        FormFactorRipple2* FormFactorRipple2::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorRipple2 self, ISampleVisitor visitor)
+
+        void FormFactorRipple2::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorRipple2 self) -> double
+
+        double FormFactorRipple2::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_getHeight(self)
+
+
+    def getWidth(self):
+        """
+        getWidth(FormFactorRipple2 self) -> double
+
+        double FormFactorRipple2::getWidth() const 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_getWidth(self)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorRipple2 self) -> double
+
+        double FormFactorRipple2::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_getLength(self)
+
+
+    def getAsymmetry(self):
+        """
+        getAsymmetry(FormFactorRipple2 self) -> double
+
+        double FormFactorRipple2::getAsymmetry() const 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_getAsymmetry(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorRipple2 self) -> double
+
+        double FormFactorRipple2::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorRipple2 self, cvector_t q) -> complex_t
+
+        complex_t FormFactorRipple2::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Complex formfactor. 
+
+        """
+        return _libBornAgainCore.FormFactorRipple2_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorRipple2
+    __del__ = lambda self: None
+FormFactorRipple2_swigregister = _libBornAgainCore.FormFactorRipple2_swigregister
+FormFactorRipple2_swigregister(FormFactorRipple2)
+
+class FormFactorSphereGaussianRadius(IFormFactorBorn):
+    """
+
+
+    A sphere with gaussian radius distribution.
+
+    C++ includes: FormFactorSphereGaussianRadius.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorSphereGaussianRadius, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorSphereGaussianRadius, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, mean, sigma):
+        """
+        __init__(FormFactorSphereGaussianRadius self, double mean, double sigma) -> FormFactorSphereGaussianRadius
+
+        FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)
+
+        """
+        this = _libBornAgainCore.new_FormFactorSphereGaussianRadius(mean, sigma)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorSphereGaussianRadius self) -> FormFactorSphereGaussianRadius
+
+        FormFactorSphereGaussianRadius* FormFactorSphereGaussianRadius::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereGaussianRadius_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorSphereGaussianRadius self, ISampleVisitor visitor)
+
+        void FormFactorSphereGaussianRadius::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereGaussianRadius_accept(self, visitor)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorSphereGaussianRadius self) -> double
+
+        double FormFactorSphereGaussianRadius::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorSphereGaussianRadius_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorSphereGaussianRadius self, cvector_t q) -> complex_t
+
+        complex_t FormFactorSphereGaussianRadius::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereGaussianRadius_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorSphereGaussianRadius
+    __del__ = lambda self: None
+FormFactorSphereGaussianRadius_swigregister = _libBornAgainCore.FormFactorSphereGaussianRadius_swigregister
+FormFactorSphereGaussianRadius_swigregister(FormFactorSphereGaussianRadius)
+
+class FormFactorSphereLogNormalRadius(IFormFactorBorn):
+    """
+
+
+    A sphere with log normal radius distribution.
+
+    C++ includes: FormFactorSphereLogNormalRadius.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorSphereLogNormalRadius, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorSphereLogNormalRadius, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, mean, scale_param, n_samples):
+        """
+        __init__(FormFactorSphereLogNormalRadius self, double mean, double scale_param, size_t n_samples) -> FormFactorSphereLogNormalRadius
+
+        FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples)
+
+        """
+        this = _libBornAgainCore.new_FormFactorSphereLogNormalRadius(mean, scale_param, n_samples)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorSphereLogNormalRadius self) -> FormFactorSphereLogNormalRadius
+
+        FormFactorSphereLogNormalRadius* FormFactorSphereLogNormalRadius::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereLogNormalRadius_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorSphereLogNormalRadius self, ISampleVisitor visitor)
+
+        void FormFactorSphereLogNormalRadius::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereLogNormalRadius_accept(self, visitor)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorSphereLogNormalRadius self) -> double
+
+        double FormFactorSphereLogNormalRadius::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorSphereLogNormalRadius_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorSphereLogNormalRadius self, cvector_t q) -> complex_t
+
+        complex_t FormFactorSphereLogNormalRadius::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereLogNormalRadius_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorSphereLogNormalRadius
+    __del__ = lambda self: None
+FormFactorSphereLogNormalRadius_swigregister = _libBornAgainCore.FormFactorSphereLogNormalRadius_swigregister
+FormFactorSphereLogNormalRadius_swigregister(FormFactorSphereLogNormalRadius)
+
+class FormFactorSphereUniformRadius(IFormFactorBorn):
+    """
+
+
+    Integrated full sphere form factor over a uniform distribution of radii.
+
+    C++ includes: FormFactorSphereUniformRadius.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorSphereUniformRadius, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorSphereUniformRadius, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, mean, full_width):
+        """
+        __init__(FormFactorSphereUniformRadius self, double mean, double full_width) -> FormFactorSphereUniformRadius
+
+        FormFactorSphereUniformRadius::FormFactorSphereUniformRadius(double mean, double full_width)
+
+        """
+        this = _libBornAgainCore.new_FormFactorSphereUniformRadius(mean, full_width)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorSphereUniformRadius self) -> FormFactorSphereUniformRadius
+
+        FormFactorSphereUniformRadius* FormFactorSphereUniformRadius::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereUniformRadius_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorSphereUniformRadius self, ISampleVisitor visitor)
+
+        void FormFactorSphereUniformRadius::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereUniformRadius_accept(self, visitor)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorSphereUniformRadius self) -> double
+
+        double FormFactorSphereUniformRadius::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorSphereUniformRadius_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorSphereUniformRadius self, cvector_t q) -> complex_t
+
+        complex_t FormFactorSphereUniformRadius::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorSphereUniformRadius_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorSphereUniformRadius
+    __del__ = lambda self: None
+FormFactorSphereUniformRadius_swigregister = _libBornAgainCore.FormFactorSphereUniformRadius_swigregister
+FormFactorSphereUniformRadius_swigregister(FormFactorSphereUniformRadius)
+
+class FormFactorTetrahedron(FormFactorPolyhedron):
+    """
+
+
+    A frustum with equilateral trigonal base.
+
+    C++ includes: FormFactorTetrahedron.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorTetrahedron, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorTetrahedron, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, base_edge, height, alpha):
+        """
+        __init__(FormFactorTetrahedron self, double base_edge, double height, double alpha) -> FormFactorTetrahedron
+
+        FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)
+
+        Parameters:
+        -----------
+
+        base_edge: 
+        of a side of the base
+
+        height: 
+        of the frustum
+
+        alpha: 
+        dihedral angle in radians between base and facet 
+
+        """
+        this = _libBornAgainCore.new_FormFactorTetrahedron(base_edge, height, alpha)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorTetrahedron self) -> FormFactorTetrahedron
+
+        FormFactorTetrahedron* FormFactorTetrahedron::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorTetrahedron_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorTetrahedron self, ISampleVisitor visitor)
+
+        void FormFactorTetrahedron::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorTetrahedron_accept(self, visitor)
+
+
+    def getBaseEdge(self):
+        """
+        getBaseEdge(FormFactorTetrahedron self) -> double
+
+        double FormFactorTetrahedron::getBaseEdge() const 
+
+        """
+        return _libBornAgainCore.FormFactorTetrahedron_getBaseEdge(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorTetrahedron self) -> double
+
+        double FormFactorTetrahedron::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorTetrahedron_getHeight(self)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(FormFactorTetrahedron self) -> double
+
+        double FormFactorTetrahedron::getAlpha() const 
+
+        """
+        return _libBornAgainCore.FormFactorTetrahedron_getAlpha(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorTetrahedron
+    __del__ = lambda self: None
+FormFactorTetrahedron_swigregister = _libBornAgainCore.FormFactorTetrahedron_swigregister
+FormFactorTetrahedron_swigregister(FormFactorTetrahedron)
+
+class FormFactorTrivial(IFormFactorBorn):
+    """
+
+
+    A dot, with trivial formfactor F(q)=1.
+
+    C++ includes: FormFactorTrivial.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorTrivial, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorTrivial, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(FormFactorTrivial self) -> FormFactorTrivial
+
+        FormFactorTrivial::FormFactorTrivial()
+
+        """
+        this = _libBornAgainCore.new_FormFactorTrivial()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorTrivial self) -> FormFactorTrivial
+
+        FormFactorTrivial* FormFactorTrivial::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorTrivial_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorTrivial self, ISampleVisitor visitor)
+
+        void FormFactorTrivial::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorTrivial_accept(self, visitor)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorTrivial self) -> double
+
+        double FormFactorTrivial::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorTrivial_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, arg2):
+        """
+        evaluate_for_q(FormFactorTrivial self, cvector_t arg2) -> complex_t
+
+        complex_t FormFactorTrivial::evaluate_for_q(const cvector_t) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorTrivial_evaluate_for_q(self, arg2)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorTrivial
+    __del__ = lambda self: None
+FormFactorTrivial_swigregister = _libBornAgainCore.FormFactorTrivial_swigregister
+FormFactorTrivial_swigregister(FormFactorTrivial)
+
+class FormFactorTruncatedCube(FormFactorPolyhedron):
+    """
+
+
+    A cube, with tetrahedral truncation of all edges.
+
+    C++ includes: FormFactorTruncatedCube.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorTruncatedCube, name, value)
+    __swig_getmethods__ = {}
+    for _s in [FormFactorPolyhedron]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorTruncatedCube, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, removed_length):
+        """
+        __init__(FormFactorTruncatedCube self, double length, double removed_length) -> FormFactorTruncatedCube
+
+        FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)
+
+        Parameters:
+        -----------
+
+        length: 
+        of the full cube
+
+        removed_length: 
+        as removed from each edge of the cube 
+
+        """
+        this = _libBornAgainCore.new_FormFactorTruncatedCube(length, removed_length)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorTruncatedCube self) -> FormFactorTruncatedCube
+
+        FormFactorTruncatedCube* FormFactorTruncatedCube::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedCube_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorTruncatedCube self, ISampleVisitor visitor)
+
+        void FormFactorTruncatedCube::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedCube_accept(self, visitor)
+
+
+    def getLength(self):
+        """
+        getLength(FormFactorTruncatedCube self) -> double
+
+        double FormFactorTruncatedCube::getLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedCube_getLength(self)
+
+
+    def getRemovedLength(self):
+        """
+        getRemovedLength(FormFactorTruncatedCube self) -> double
+
+        double FormFactorTruncatedCube::getRemovedLength() const 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedCube_getRemovedLength(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorTruncatedCube
+    __del__ = lambda self: None
+FormFactorTruncatedCube_swigregister = _libBornAgainCore.FormFactorTruncatedCube_swigregister
+FormFactorTruncatedCube_swigregister(FormFactorTruncatedCube)
+
+class FormFactorTruncatedSphere(IFormFactorBorn):
+    """
+
+
+    A truncated Sphere.
+
+    C++ includes: FormFactorTruncatedSphere.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorTruncatedSphere, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorTruncatedSphere, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius, height):
+        """
+        __init__(FormFactorTruncatedSphere self, double radius, double height) -> FormFactorTruncatedSphere
+
+        FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height)
+
+        """
+        this = _libBornAgainCore.new_FormFactorTruncatedSphere(radius, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorTruncatedSphere self) -> FormFactorTruncatedSphere
+
+        FormFactorTruncatedSphere* FormFactorTruncatedSphere::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSphere_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorTruncatedSphere self, ISampleVisitor visitor)
+
+        void FormFactorTruncatedSphere::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSphere_accept(self, visitor)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorTruncatedSphere self) -> double
+
+        double FormFactorTruncatedSphere::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSphere_getHeight(self)
+
+
+    def getRadius(self):
+        """
+        getRadius(FormFactorTruncatedSphere self) -> double
+
+        double FormFactorTruncatedSphere::getRadius() const 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSphere_getRadius(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorTruncatedSphere self) -> double
+
+        double FormFactorTruncatedSphere::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSphere_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorTruncatedSphere self, cvector_t q) -> complex_t
+
+        complex_t FormFactorTruncatedSphere::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Complex formfactor. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSphere_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorTruncatedSphere
+    __del__ = lambda self: None
+FormFactorTruncatedSphere_swigregister = _libBornAgainCore.FormFactorTruncatedSphere_swigregister
+FormFactorTruncatedSphere_swigregister(FormFactorTruncatedSphere)
+
+class FormFactorTruncatedSpheroid(IFormFactorBorn):
+    """
+
+
+    A truncated spheroid. An ellipsoid with two equal axis, truncated by a plane perpendicular to the third axis.
+
+    C++ includes: FormFactorTruncatedSpheroid.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorTruncatedSpheroid, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactorBorn]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorTruncatedSpheroid, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, radius, height, height_flattening):
+        """
+        __init__(FormFactorTruncatedSpheroid self, double radius, double height, double height_flattening) -> FormFactorTruncatedSpheroid
+
+        FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double radius, double height, double height_flattening)
+
+        """
+        this = _libBornAgainCore.new_FormFactorTruncatedSpheroid(radius, height, height_flattening)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(FormFactorTruncatedSpheroid self) -> FormFactorTruncatedSpheroid
+
+        FormFactorTruncatedSpheroid* FormFactorTruncatedSpheroid::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSpheroid_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorTruncatedSpheroid self, ISampleVisitor visitor)
+
+        void FormFactorTruncatedSpheroid::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSpheroid_accept(self, visitor)
+
+
+    def getRadius(self):
+        """
+        getRadius(FormFactorTruncatedSpheroid self) -> double
+
+        double FormFactorTruncatedSpheroid::getRadius() const 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSpheroid_getRadius(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(FormFactorTruncatedSpheroid self) -> double
+
+        double FormFactorTruncatedSpheroid::getHeight() const 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSpheroid_getHeight(self)
+
+
+    def getHeightFlattening(self):
+        """
+        getHeightFlattening(FormFactorTruncatedSpheroid self) -> double
+
+        double FormFactorTruncatedSpheroid::getHeightFlattening() const 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSpheroid_getHeightFlattening(self)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorTruncatedSpheroid self) -> double
+
+        double FormFactorTruncatedSpheroid::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSpheroid_getRadialExtension(self)
+
+
+    def evaluate_for_q(self, q):
+        """
+        evaluate_for_q(FormFactorTruncatedSpheroid self, cvector_t q) -> complex_t
+
+        complex_t FormFactorTruncatedSpheroid::evaluate_for_q(const cvector_t q) const overridefinal
+
+        Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. 
+
+        """
+        return _libBornAgainCore.FormFactorTruncatedSpheroid_evaluate_for_q(self, q)
+
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorTruncatedSpheroid
+    __del__ = lambda self: None
+FormFactorTruncatedSpheroid_swigregister = _libBornAgainCore.FormFactorTruncatedSpheroid_swigregister
+FormFactorTruncatedSpheroid_swigregister(FormFactorTruncatedSpheroid)
+
+class FormFactorWeighted(IFormFactor):
+    """
+
+
+    Coherent sum of different scalar  IFormFactor's with different weights.
+
+    Used by  ParticleComposition and  ParticleCoreShell. If same particles are at different positions, then consider FormFactorDecoratorMultiPositionFactor (restore from commit 0500a26de76).
+
+    C++ includes: FormFactorWeighted.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FormFactorWeighted, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFormFactor]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FormFactorWeighted, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(FormFactorWeighted self) -> FormFactorWeighted
+
+        FormFactorWeighted::FormFactorWeighted()
+
+        """
+        this = _libBornAgainCore.new_FormFactorWeighted()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_FormFactorWeighted
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(FormFactorWeighted self) -> FormFactorWeighted
+
+        FormFactorWeighted * FormFactorWeighted::clone() const overridefinal
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.FormFactorWeighted_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(FormFactorWeighted self, ISampleVisitor visitor)
+
+        void FormFactorWeighted::accept(ISampleVisitor *visitor) const overridefinal
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.FormFactorWeighted_accept(self, visitor)
+
+
+    def getRadialExtension(self):
+        """
+        getRadialExtension(FormFactorWeighted self) -> double
+
+        double FormFactorWeighted::getRadialExtension() const overridefinal
+
+        Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations 
+
+        """
+        return _libBornAgainCore.FormFactorWeighted_getRadialExtension(self)
+
+
+    def addFormFactor(self, form_factor, weight=1.0):
+        """
+        addFormFactor(FormFactorWeighted self, IFormFactor form_factor, double weight=1.0)
+        addFormFactor(FormFactorWeighted self, IFormFactor form_factor)
+
+        void FormFactorWeighted::addFormFactor(const IFormFactor &form_factor, double weight=1.0)
+
+        """
+        return _libBornAgainCore.FormFactorWeighted_addFormFactor(self, form_factor, weight)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(FormFactorWeighted self, IMaterial material)
+
+        void FormFactorWeighted::setAmbientMaterial(const IMaterial &material) overridefinal
+
+        Passes the refractive index of the ambient material in which this particle is embedded. 
+
+        """
+        return _libBornAgainCore.FormFactorWeighted_setAmbientMaterial(self, material)
+
+
+    def evaluate(self, wavevectors):
+        """
+        evaluate(FormFactorWeighted self, WavevectorInfo wavevectors) -> complex_t
+
+        complex_t FormFactorWeighted::evaluate(const WavevectorInfo &wavevectors) const overridefinal
+
+        Returns scattering amplitude for complex wavevectors ki, kf. 
+
+        """
+        return _libBornAgainCore.FormFactorWeighted_evaluate(self, wavevectors)
+
+FormFactorWeighted_swigregister = _libBornAgainCore.FormFactorWeighted_swigregister
+FormFactorWeighted_swigregister(FormFactorWeighted)
+
+class Simulation(ICloneable, IParameterized):
+    """
+
+
+    Pure virtual base class of OffSpecularSimulation and  GISASSimulation, holds common infrastructure to run a simulation.
+
+    C++ includes: Simulation.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Simulation, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Simulation, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_Simulation
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(Simulation self) -> Simulation
+
+        virtual Simulation* Simulation::clone() const =0
+
+        """
+        return _libBornAgainCore.Simulation_clone(self)
+
+
+    def prepareSimulation(self):
+        """
+        prepareSimulation(Simulation self)
+
+        void Simulation::prepareSimulation()
+
+        Put into a clean state for running a simulation. 
+
+        """
+        return _libBornAgainCore.Simulation_prepareSimulation(self)
+
+
+    def runSimulation(self):
+        """
+        runSimulation(Simulation self)
+
+        void Simulation::runSimulation()
+
+        Run a simulation, possibly averaged over parameter distributions.
+
+        Run simulation with possible averaging over parameter distributions. 
+
+        """
+        return _libBornAgainCore.Simulation_runSimulation(self)
+
+
+    def setInstrument(self, instrument):
+        """
+        setInstrument(Simulation self, Instrument instrument)
+
+        void Simulation::setInstrument(const Instrument &instrument)
+
+        """
+        return _libBornAgainCore.Simulation_setInstrument(self, instrument)
+
+
+    def getInstrument(self, *args):
+        """
+        getInstrument(Simulation self) -> Instrument
+        getInstrument(Simulation self) -> Instrument
+
+        Instrument& Simulation::getInstrument()
+
+        """
+        return _libBornAgainCore.Simulation_getInstrument(self, *args)
+
+
+    def setBeamIntensity(self, intensity):
+        """
+        setBeamIntensity(Simulation self, double intensity)
+
+        void Simulation::setBeamIntensity(double intensity)
+
+        """
+        return _libBornAgainCore.Simulation_setBeamIntensity(self, intensity)
+
+
+    def getBeamIntensity(self):
+        """
+        getBeamIntensity(Simulation self) -> double
+
+        double Simulation::getBeamIntensity() const 
+
+        """
+        return _libBornAgainCore.Simulation_getBeamIntensity(self)
+
+
+    def setBeamPolarization(self, bloch_vector):
+        """
+        setBeamPolarization(Simulation self, kvector_t bloch_vector)
+
+        void Simulation::setBeamPolarization(const kvector_t bloch_vector)
+
+        Sets the beam polarization according to the given Bloch vector. 
+
+        """
+        return _libBornAgainCore.Simulation_setBeamPolarization(self, bloch_vector)
+
+
+    def setDetectorResolutionFunction(self, resolution_function):
+        """
+        setDetectorResolutionFunction(Simulation self, IResolutionFunction2D resolution_function)
+
+        void Simulation::setDetectorResolutionFunction(const IResolutionFunction2D &resolution_function)
+
+        """
+        return _libBornAgainCore.Simulation_setDetectorResolutionFunction(self, resolution_function)
+
+
+    def removeDetectorResolutionFunction(self):
+        """
+        removeDetectorResolutionFunction(Simulation self)
+
+        void Simulation::removeDetectorResolutionFunction()
+
+        """
+        return _libBornAgainCore.Simulation_removeDetectorResolutionFunction(self)
+
+
+    def setAnalyzerProperties(self, direction, efficiency, total_transmission):
+        """
+        setAnalyzerProperties(Simulation self, kvector_t direction, double efficiency, double total_transmission)
+
+        void Simulation::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)
+
+        Sets the polarization analyzer characteristics of the detector. 
+
+        """
+        return _libBornAgainCore.Simulation_setAnalyzerProperties(self, direction, efficiency, total_transmission)
+
+
+    def setSample(self, sample):
+        """
+        setSample(Simulation self, MultiLayer sample)
+
+        void Simulation::setSample(const MultiLayer &sample)
+
+        The  MultiLayer object will not be owned by the  Simulation object. 
+
+        """
+        return _libBornAgainCore.Simulation_setSample(self, sample)
+
+
+    def getSample(self):
+        """
+        getSample(Simulation self) -> MultiLayer
+
+        MultiLayer* Simulation::getSample() const 
+
+        """
+        return _libBornAgainCore.Simulation_getSample(self)
+
+
+    def setSampleBuilderCpp(self, sample_builder):
+        """
+        setSampleBuilderCpp(Simulation self, std::shared_ptr< IMultiLayerBuilder > const sample_builder)
+
+        void Simulation::setSampleBuilder(std::shared_ptr< IMultiLayerBuilder > sample_builder)
+
+        """
+        return _libBornAgainCore.Simulation_setSampleBuilderCpp(self, sample_builder)
+
+
+    def getSampleBuilder(self):
+        """
+        getSampleBuilder(Simulation self) -> std::shared_ptr< IMultiLayerBuilder >
+
+        std::shared_ptr<IMultiLayerBuilder> Simulation::getSampleBuilder() const 
+
+        """
+        return _libBornAgainCore.Simulation_getSampleBuilder(self)
+
+
+    def numberOfSimulationElements(self):
+        """
+        numberOfSimulationElements(Simulation self) -> int
+
+        virtual int Simulation::numberOfSimulationElements() const =0
+
+        """
+        return _libBornAgainCore.Simulation_numberOfSimulationElements(self)
+
+
+    def getDetectorIntensity(self, *args):
+        """
+        getDetectorIntensity(Simulation self, IDetector2D::EAxesUnits units_type) -> IntensityData
+        getDetectorIntensity(Simulation self) -> IntensityData
+
+        virtual OutputData<double>* Simulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const =0
+
+        Clone simulated intensity map. 
+
+        """
+        return _libBornAgainCore.Simulation_getDetectorIntensity(self, *args)
+
+
+    def addSimulationParametersToExternalPool(self, path, external_pool):
+        """
+        addSimulationParametersToExternalPool(Simulation self, std::string const & path, ParameterPool external_pool) -> std::string
+
+        std::string Simulation::addSimulationParametersToExternalPool(const std::string &path, ParameterPool *external_pool) const
+
+        Adds parameters defined in this class the to external pool. 
+
+        """
+        return _libBornAgainCore.Simulation_addSimulationParametersToExternalPool(self, path, external_pool)
+
+
+    def addParameterDistribution(self, *args):
+        """
+        addParameterDistribution(Simulation self, std::string const & param_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0, RealLimits limits)
+        addParameterDistribution(Simulation self, std::string const & param_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0)
+        addParameterDistribution(Simulation self, std::string const & param_name, IDistribution1D distribution, size_t nbr_samples)
+        addParameterDistribution(Simulation self, ParameterDistribution par_distr)
+
+        void Simulation::addParameterDistribution(const ParameterDistribution &par_distr)
+
+        """
+        return _libBornAgainCore.Simulation_addParameterDistribution(self, *args)
+
+
+    def getDistributionHandler(self):
+        """
+        getDistributionHandler(Simulation self) -> DistributionHandler const &
+
+        const DistributionHandler& Simulation::getDistributionHandler() const 
+
+        """
+        return _libBornAgainCore.Simulation_getDistributionHandler(self)
+
+
+    def setOptions(self, options):
+        """
+        setOptions(Simulation self, SimulationOptions options)
+
+        void Simulation::setOptions(const SimulationOptions &options)
+
+        """
+        return _libBornAgainCore.Simulation_setOptions(self, options)
+
+
+    def getOptions(self, *args):
+        """
+        getOptions(Simulation self) -> SimulationOptions
+        getOptions(Simulation self) -> SimulationOptions
+
+        SimulationOptions& Simulation::getOptions()
+
+        """
+        return _libBornAgainCore.Simulation_getOptions(self, *args)
+
+
+    def subscribe(self, inform):
+        """
+        subscribe(Simulation self, ProgressHandler::Callback_t inform)
+
+        void Simulation::subscribe(ProgressHandler::Callback_t inform)
+
+        """
+        return _libBornAgainCore.Simulation_subscribe(self, inform)
+
+
+    def setTerminalProgressMonitor(self):
+        """
+        setTerminalProgressMonitor(Simulation self)
+
+        void Simulation::setTerminalProgressMonitor()
+
+        Initializes a progress monitor that prints to stdout. 
+
+        """
+        return _libBornAgainCore.Simulation_setTerminalProgressMonitor(self)
+
+
+    def setSampleBuilder(self, ptr):
+        self.samplebuilder = ptr
+        self.setSampleBuilderCpp(ptr)
+
+Simulation_swigregister = _libBornAgainCore.Simulation_swigregister
+Simulation_swigregister(Simulation)
+
+class SimulationOptions(_object):
+    """
+
+
+    Collect the different options for simulation  SimulationOptions.
+
+    C++ includes: SimulationOptions.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SimulationOptions, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SimulationOptions, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(SimulationOptions self) -> SimulationOptions
+
+        SimulationOptions::SimulationOptions()
+
+        """
+        this = _libBornAgainCore.new_SimulationOptions()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def isIntegrate(self):
+        """
+        isIntegrate(SimulationOptions self) -> bool
+
+        bool SimulationOptions::isIntegrate() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_isIntegrate(self)
+
+
+    def getMcPoints(self):
+        """
+        getMcPoints(SimulationOptions self) -> size_t
+
+        size_t SimulationOptions::getMcPoints() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_getMcPoints(self)
+
+
+    def setMonteCarloIntegration(self, flag=True, mc_points=50):
+        """
+        setMonteCarloIntegration(SimulationOptions self, bool flag=True, size_t mc_points=50)
+        setMonteCarloIntegration(SimulationOptions self, bool flag=True)
+        setMonteCarloIntegration(SimulationOptions self)
+
+        void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)
+
+        Enables/disables MonetCarlo integration.
+
+        Parameters:
+        -----------
+
+        flag: 
+        If true, MonteCarlo integration will be used, otherwise analytical calculations
+
+        mc_points: 
+        Number of points for MonteCarlo integrator 
+
+        """
+        return _libBornAgainCore.SimulationOptions_setMonteCarloIntegration(self, flag, mc_points)
+
+
+    def setNumberOfThreads(self, nthreads):
+        """
+        setNumberOfThreads(SimulationOptions self, int nthreads)
+
+        void SimulationOptions::setNumberOfThreads(int nthreads)
+
+        Sets number of threads to use during the simulation (0 - take the default value from the hardware) 
+
+        """
+        return _libBornAgainCore.SimulationOptions_setNumberOfThreads(self, nthreads)
+
+
+    def getNumberOfThreads(self):
+        """
+        getNumberOfThreads(SimulationOptions self) -> int
+
+        int SimulationOptions::getNumberOfThreads() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_getNumberOfThreads(self)
+
+
+    def setNumberOfBatches(self, nbatches):
+        """
+        setNumberOfBatches(SimulationOptions self, int nbatches)
+
+        void SimulationOptions::setNumberOfBatches(int nbatches)
+
+        Sets number of batches to split. 
+
+        """
+        return _libBornAgainCore.SimulationOptions_setNumberOfBatches(self, nbatches)
+
+
+    def getNumberOfBatches(self):
+        """
+        getNumberOfBatches(SimulationOptions self) -> int
+
+        int SimulationOptions::getNumberOfBatches() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_getNumberOfBatches(self)
+
+
+    def getCurrentBatch(self):
+        """
+        getCurrentBatch(SimulationOptions self) -> int
+
+        int SimulationOptions::getCurrentBatch() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_getCurrentBatch(self)
+
+
+    def setThreadInfo(self, thread_info):
+        """
+        setThreadInfo(SimulationOptions self, ThreadInfo thread_info)
+
+        void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)
+
+        Sets the batch and thread information to be used. 
+
+        """
+        return _libBornAgainCore.SimulationOptions_setThreadInfo(self, thread_info)
+
+
+    def getHardwareConcurrency(self):
+        """
+        getHardwareConcurrency(SimulationOptions self) -> int
+
+        int SimulationOptions::getHardwareConcurrency() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_getHardwareConcurrency(self)
+
+
+    def getDefaultVariability(self):
+        """
+        getDefaultVariability(SimulationOptions self) -> double
+
+        double SimulationOptions::getDefaultVariability() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_getDefaultVariability(self)
+
+
+    def setIncludeSpecular(self, include_specular):
+        """
+        setIncludeSpecular(SimulationOptions self, bool include_specular)
+
+        void SimulationOptions::setIncludeSpecular(bool include_specular)
+
+        """
+        return _libBornAgainCore.SimulationOptions_setIncludeSpecular(self, include_specular)
+
+
+    def includeSpecular(self):
+        """
+        includeSpecular(SimulationOptions self) -> bool
+
+        bool SimulationOptions::includeSpecular() const 
+
+        """
+        return _libBornAgainCore.SimulationOptions_includeSpecular(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_SimulationOptions
+    __del__ = lambda self: None
+SimulationOptions_swigregister = _libBornAgainCore.SimulationOptions_swigregister
+SimulationOptions_swigregister(SimulationOptions)
+
+class GISASSimulation(Simulation):
+    """
+
+
+    Main class to run the simulation.
+
+    C++ includes: GISASSimulation.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [Simulation]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, GISASSimulation, name, value)
+    __swig_getmethods__ = {}
+    for _s in [Simulation]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, GISASSimulation, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(GISASSimulation self) -> GISASSimulation
+        __init__(GISASSimulation self, MultiLayer p_sample) -> GISASSimulation
+        __init__(GISASSimulation self, std::shared_ptr< IMultiLayerBuilder > const p_sample_builder) -> GISASSimulation
+
+        GISASSimulation::GISASSimulation(std::shared_ptr< IMultiLayerBuilder > p_sample_builder)
+
+        """
+        this = _libBornAgainCore.new_GISASSimulation(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_GISASSimulation
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(GISASSimulation self) -> GISASSimulation
+
+        GISASSimulation* GISASSimulation::clone() const 
+
+        """
+        return _libBornAgainCore.GISASSimulation_clone(self)
+
+
+    def prepareSimulation(self):
+        """
+        prepareSimulation(GISASSimulation self)
+
+        void GISASSimulation::prepareSimulation() final
+
+        Put into a clean state for running a simulation. 
+
+        """
+        return _libBornAgainCore.GISASSimulation_prepareSimulation(self)
+
+
+    def numberOfSimulationElements(self):
+        """
+        numberOfSimulationElements(GISASSimulation self) -> int
+
+        int GISASSimulation::numberOfSimulationElements() const final
+
+        Gets the number of elements this simulation needs to calculate. 
+
+        """
+        return _libBornAgainCore.GISASSimulation_numberOfSimulationElements(self)
+
+
+    def getDetectorIntensity(self, *args):
+        """
+        getDetectorIntensity(GISASSimulation self, IDetector2D::EAxesUnits units_type) -> IntensityData
+        getDetectorIntensity(GISASSimulation self) -> IntensityData
+
+        OutputData< double > * GISASSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+        Returns clone of the detector intensity map with detector resolution applied. 
+
+        """
+        return _libBornAgainCore.GISASSimulation_getDetectorIntensity(self, *args)
+
+
+    def getIntensityData(self, *args):
+        """
+        getIntensityData(GISASSimulation self, IDetector2D::EAxesUnits units_type) -> Histogram2D
+        getIntensityData(GISASSimulation self) -> Histogram2D
+
+        Histogram2D * GISASSimulation::getIntensityData(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+        Returns histogram representing intensity map in requested axes units. 
+
+        """
+        return _libBornAgainCore.GISASSimulation_getIntensityData(self, *args)
+
+
+    def setBeamParameters(self, wavelength, alpha_i, phi_i):
+        """
+        setBeamParameters(GISASSimulation self, double wavelength, double alpha_i, double phi_i)
+
+        void GISASSimulation::setBeamParameters(double wavelength, double alpha_i, double phi_i)
+
+        Sets beam parameters from here (forwarded to  Instrument) 
+
+        """
+        return _libBornAgainCore.GISASSimulation_setBeamParameters(self, wavelength, alpha_i, phi_i)
+
+
+    def setDetector(self, detector):
+        """
+        setDetector(GISASSimulation self, IDetector2D detector)
+
+        void GISASSimulation::setDetector(const IDetector2D &detector)
+
+        Sets the detector (axes can be overwritten later) 
+
+        """
+        return _libBornAgainCore.GISASSimulation_setDetector(self, detector)
+
+
+    def setDetectorParameters(self, n_phi, phi_min, phi_max, n_alpha, alpha_min, alpha_max):
+        """
+        setDetectorParameters(GISASSimulation self, size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)
+
+        void GISASSimulation::setDetectorParameters(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)
+
+        Sets spherical detector parameters using angle ranges
+
+        Parameters:
+        -----------
+
+        n_phi: 
+        number of phi-axis bins
+
+        phi_min: 
+        low edge of first phi-bin
+
+        phi_max: 
+        upper edge of last phi-bin
+
+        n_alpha: 
+        number of alpha-axis bins
+
+        alpha_min: 
+        low edge of first alpha-bin
+
+        alpha_max: 
+        upper edge of last alpha-bin 
+
+        """
+        return _libBornAgainCore.GISASSimulation_setDetectorParameters(self, n_phi, phi_min, phi_max, n_alpha, alpha_min, alpha_max)
+
+
+    def removeMasks(self):
+        """
+        removeMasks(GISASSimulation self)
+
+        void GISASSimulation::removeMasks()
+
+        removes all masks from the detector 
+
+        """
+        return _libBornAgainCore.GISASSimulation_removeMasks(self)
+
+
+    def addMask(self, shape, mask_value=True):
+        """
+        addMask(GISASSimulation self, IShape2D shape, bool mask_value=True)
+        addMask(GISASSimulation self, IShape2D shape)
+
+        void GISASSimulation::addMask(const Geometry::IShape2D &shape, bool mask_value=true)
+
+        Adds mask of given shape to the stack of detector masks. The mask value 'true' means that the channel will be excluded from the simulation. The mask which is added last has priority.
+
+        Parameters:
+        -----------
+
+        shape: 
+        The shape of mask (Rectangle, Polygon, Line, Ellipse)
+
+        mask_value: 
+        The value of mask 
+
+        """
+        return _libBornAgainCore.GISASSimulation_addMask(self, shape, mask_value)
+
+
+    def maskAll(self):
+        """
+        maskAll(GISASSimulation self)
+
+        void GISASSimulation::maskAll()
+
+        Put the mask for all detector channels (i.e. exclude whole detector from the analysis) 
+
+        """
+        return _libBornAgainCore.GISASSimulation_maskAll(self)
+
+
+    def setRegionOfInterest(self, xlow, ylow, xup, yup):
+        """
+        setRegionOfInterest(GISASSimulation self, double xlow, double ylow, double xup, double yup)
+
+        void GISASSimulation::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
+
+        Sets rectangular region of interest with lower left and upper right corners defined. 
+
+        """
+        return _libBornAgainCore.GISASSimulation_setRegionOfInterest(self, xlow, ylow, xup, yup)
+
+
+    def resetRegionOfInterest(self):
+        """
+        resetRegionOfInterest(GISASSimulation self)
+
+        void GISASSimulation::resetRegionOfInterest()
+
+        Resets region of interest making whole detector plane available for the simulation. 
+
+        """
+        return _libBornAgainCore.GISASSimulation_resetRegionOfInterest(self)
+
+GISASSimulation_swigregister = _libBornAgainCore.GISASSimulation_swigregister
+GISASSimulation_swigregister(GISASSimulation)
+
+class IHistogram(_object):
+    """
+
+
+    Base class for 1D and 2D histograms holding values of double type.
+
+    C++ includes: IHistogram.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IHistogram, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IHistogram, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    INTEGRAL = _libBornAgainCore.IHistogram_INTEGRAL
+    AVERAGE = _libBornAgainCore.IHistogram_AVERAGE
+    STANDARD_ERROR = _libBornAgainCore.IHistogram_STANDARD_ERROR
+    NENTRIES = _libBornAgainCore.IHistogram_NENTRIES
+    __swig_destroy__ = _libBornAgainCore.delete_IHistogram
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IHistogram self) -> IHistogram
+
+        virtual IHistogram* IHistogram::clone() const =0
+
+        """
+        return _libBornAgainCore.IHistogram_clone(self)
+
+
+    def getRank(self):
+        """
+        getRank(IHistogram self) -> size_t
+
+        virtual size_t IHistogram::getRank() const =0
+
+        Returns number of histogram dimensions. 
+
+        """
+        return _libBornAgainCore.IHistogram_getRank(self)
+
+
+    def getTotalNumberOfBins(self):
+        """
+        getTotalNumberOfBins(IHistogram self) -> size_t
+
+        size_t IHistogram::getTotalNumberOfBins() const
+
+        Returns total number of histogram bins. For 2D histograms the result will be the product of bin numbers along X and Y axes. 
+
+        """
+        return _libBornAgainCore.IHistogram_getTotalNumberOfBins(self)
+
+
+    def getXaxis(self):
+        """
+        getXaxis(IHistogram self) -> IAxis
+
+        const IAxis & IHistogram::getXaxis() const
+
+        returns x-axis 
+
+        """
+        return _libBornAgainCore.IHistogram_getXaxis(self)
+
+
+    def getYaxis(self):
+        """
+        getYaxis(IHistogram self) -> IAxis
+
+        const IAxis & IHistogram::getYaxis() const
+
+        returns y-axis for 2D histograms 
+
+        """
+        return _libBornAgainCore.IHistogram_getYaxis(self)
+
+
+    def getXmin(self):
+        """
+        getXmin(IHistogram self) -> double
+
+        double IHistogram::getXmin() const
+
+        Returns x-axis min (lower edge of first bin). 
+
+        """
+        return _libBornAgainCore.IHistogram_getXmin(self)
+
+
+    def getXmax(self):
+        """
+        getXmax(IHistogram self) -> double
+
+        double IHistogram::getXmax() const
+
+        Returns x-axis max (upper edge of last bin). 
+
+        """
+        return _libBornAgainCore.IHistogram_getXmax(self)
+
+
+    def getNbinsX(self):
+        """
+        getNbinsX(IHistogram self) -> size_t
+
+        size_t IHistogram::getNbinsX() const
+
+        Returns number of bins on x-axis. 
+
+        """
+        return _libBornAgainCore.IHistogram_getNbinsX(self)
+
+
+    def getYmin(self):
+        """
+        getYmin(IHistogram self) -> double
+
+        double IHistogram::getYmin() const
+
+        Returns y-axis min (lower edge of first bin) for 2D histograms. 
+
+        """
+        return _libBornAgainCore.IHistogram_getYmin(self)
+
+
+    def getYmax(self):
+        """
+        getYmax(IHistogram self) -> double
+
+        double IHistogram::getYmax() const
+
+        Returns y-axis max (upper edge of last bin) for 2D histograms. 
+
+        """
+        return _libBornAgainCore.IHistogram_getYmax(self)
+
+
+    def getNbinsY(self):
+        """
+        getNbinsY(IHistogram self) -> size_t
+
+        size_t IHistogram::getNbinsY() const
+
+        Returns number of bins on y-axis. 
+
+        """
+        return _libBornAgainCore.IHistogram_getNbinsY(self)
+
+
+    def getGlobalBin(self, binx, biny=0):
+        """
+        getGlobalBin(IHistogram self, size_t binx, size_t biny=0) -> size_t
+        getGlobalBin(IHistogram self, size_t binx) -> size_t
+
+        size_t IHistogram::getGlobalBin(size_t binx, size_t biny=0) const
+
+        Returns global bin index for given axes indices. For 1D histogram the global bin index coinside with x-axis index.
+
+        Parameters:
+        -----------
+
+        binx: 
+        x-axis bin index
+
+        biny: 
+        y-axis bin index (for 2D histograms)
+
+        The global bin index 
+
+        """
+        return _libBornAgainCore.IHistogram_getGlobalBin(self, binx, biny)
+
+
+    def findGlobalBin(self, x, y):
+        """
+        findGlobalBin(IHistogram self, double x, double y) -> size_t
+
+        size_t IHistogram::findGlobalBin(double x, double y) const
+
+        Returns closest global bin index for given axes coordinates. For 1D.
+
+        Parameters:
+        -----------
+
+        x: 
+        Value on x-axis
+
+        y: 
+        Value on y-axis (for 2D histograms)
+
+        Closest global bin index 
+
+        """
+        return _libBornAgainCore.IHistogram_findGlobalBin(self, x, y)
+
+
+    def getXaxisIndex(self, i):
+        """
+        getXaxisIndex(IHistogram self, size_t i) -> int
+
+        int IHistogram::getXaxisIndex(size_t i) const
+
+        Returns x-axis bin index for given globalbin. For 1D histograms returned value conicide with globalbin value. 
+
+        """
+        return _libBornAgainCore.IHistogram_getXaxisIndex(self, i)
+
+
+    def getYaxisIndex(self, i):
+        """
+        getYaxisIndex(IHistogram self, size_t i) -> int
+
+        int IHistogram::getYaxisIndex(size_t i) const
+
+        Returns y-axis bin index for given globalbin (for 2D histograms). 
+
+        """
+        return _libBornAgainCore.IHistogram_getYaxisIndex(self, i)
+
+
+    def getXaxisValue(self, i):
+        """
+        getXaxisValue(IHistogram self, size_t i) -> double
+
+        double IHistogram::getXaxisValue(size_t i)
+
+        Returns the value on x-axis corresponding to the global bin index.
+
+        Parameters:
+        -----------
+
+        globalbin: 
+        The global bin index
+
+        The center of corresponding bin of the axis 
+
+        """
+        return _libBornAgainCore.IHistogram_getXaxisValue(self, i)
+
+
+    def getYaxisValue(self, i):
+        """
+        getYaxisValue(IHistogram self, size_t i) -> double
+
+        double IHistogram::getYaxisValue(size_t i)
+
+        Returns the value on y-axis corresponding to the 2D histogram global bin index.
+
+        Parameters:
+        -----------
+
+        globalbin: 
+        The global bin index
+
+        The center of corresponding bin of the axis 
+
+        """
+        return _libBornAgainCore.IHistogram_getYaxisValue(self, i)
+
+
+    def getData(self, *args):
+        """
+        getData(IHistogram self) -> OutputData< CumulativeValue > const
+        getData(IHistogram self) -> OutputData< CumulativeValue > &
+
+        OutputData<CumulativeValue>& IHistogram::getData()
+
+        """
+        return _libBornAgainCore.IHistogram_getData(self, *args)
+
+
+    def getBinContent(self, *args):
+        """
+        getBinContent(IHistogram self, size_t i) -> double
+        getBinContent(IHistogram self, size_t binx, size_t biny) -> double
+
+        double IHistogram::getBinContent(size_t binx, size_t biny) const
+
+        Returns content (accumulated value) of the 2D histogram bin with given indices.
+
+        Parameters:
+        -----------
+
+        binx: 
+        x-axis bin index
+
+        biny: 
+        y-axis bin index
+
+        The value accumulated by the bin (integral) 
+
+        """
+        return _libBornAgainCore.IHistogram_getBinContent(self, *args)
+
+
+    def setBinContent(self, i, value):
+        """
+        setBinContent(IHistogram self, size_t i, double value)
+
+        void IHistogram::setBinContent(size_t i, double value)
+
+        Sets content of the bin corresponding to the globalbin number. 
+
+        """
+        return _libBornAgainCore.IHistogram_setBinContent(self, i, value)
+
+
+    def addBinContent(self, i, value):
+        """
+        addBinContent(IHistogram self, size_t i, double value)
+
+        void IHistogram::addBinContent(size_t i, double value)
+
+        Add the value to the bin. 
+
+        """
+        return _libBornAgainCore.IHistogram_addBinContent(self, i, value)
+
+
+    def getBinError(self, *args):
+        """
+        getBinError(IHistogram self, size_t i) -> double
+        getBinError(IHistogram self, size_t binx, size_t biny) -> double
+
+        double IHistogram::getBinError(size_t binx, size_t biny) const
+
+        Returns error of the bin with given indices (for 2D histograms). 
+
+        """
+        return _libBornAgainCore.IHistogram_getBinError(self, *args)
+
+
+    def getBinAverage(self, *args):
+        """
+        getBinAverage(IHistogram self, size_t i) -> double
+        getBinAverage(IHistogram self, size_t binx, size_t biny) -> double
+
+        double IHistogram::getBinAverage(size_t binx, size_t biny) const
+
+        Returns average value of the bin with given indices (for 2D histograms). 
+
+        """
+        return _libBornAgainCore.IHistogram_getBinAverage(self, *args)
+
+
+    def getBinNumberOfEntries(self, *args):
+        """
+        getBinNumberOfEntries(IHistogram self, size_t i) -> int
+        getBinNumberOfEntries(IHistogram self, size_t binx, size_t biny) -> int
+
+        int IHistogram::getBinNumberOfEntries(size_t binx, size_t biny) const
+
+        Returns number of entries in the bin with given indices (for 2D histograms). 
+
+        """
+        return _libBornAgainCore.IHistogram_getBinNumberOfEntries(self, *args)
+
+
+    def getMaximum(self):
+        """
+        getMaximum(IHistogram self) -> double
+
+        double IHistogram::getMaximum() const
+
+        Returns histogram maximum value (maximum of  getBinContent() over all bins) 
+
+        """
+        return _libBornAgainCore.IHistogram_getMaximum(self)
+
+
+    def getMaximumBinIndex(self):
+        """
+        getMaximumBinIndex(IHistogram self) -> size_t
+
+        size_t IHistogram::getMaximumBinIndex() const
+
+        Returns globalbin index with maximum content. 
+
+        """
+        return _libBornAgainCore.IHistogram_getMaximumBinIndex(self)
+
+
+    def getMinimum(self):
+        """
+        getMinimum(IHistogram self) -> double
+
+        double IHistogram::getMinimum() const
+
+        Returns histogram minimum value (minimum of  getBinContent() over all bins) 
+
+        """
+        return _libBornAgainCore.IHistogram_getMinimum(self)
+
+
+    def getMinimumBinIndex(self):
+        """
+        getMinimumBinIndex(IHistogram self) -> size_t
+
+        size_t IHistogram::getMinimumBinIndex() const
+
+        Returns globalbin index with minimum content. 
+
+        """
+        return _libBornAgainCore.IHistogram_getMinimumBinIndex(self)
+
+
+    def scale(self, value):
+        """
+        scale(IHistogram self, double value)
+
+        void IHistogram::scale(double value)
+
+        Multiply this histogram (every bin content value) by a constant. 
+
+        """
+        return _libBornAgainCore.IHistogram_scale(self, value)
+
+
+    def integral(self):
+        """
+        integral(IHistogram self) -> double
+
+        double IHistogram::integral() const
+
+        Returns integral of bins content (computed as a sum of all bin content). 
+
+        """
+        return _libBornAgainCore.IHistogram_integral(self)
+
+
+    def getArray(self, *args):
+        """
+        getArray(IHistogram self, IHistogram::DataType dataType) -> PyObject
+        getArray(IHistogram self) -> PyObject *
+        """
+        return _libBornAgainCore.IHistogram_getArray(self, *args)
+
+
+    def reset(self):
+        """
+        reset(IHistogram self)
+
+        void IHistogram::reset()
+
+        Reset histogram content (axes remains) 
+
+        """
+        return _libBornAgainCore.IHistogram_reset(self)
+
+
+    def createHistogram(source):
+        """createHistogram(IntensityData source) -> IHistogram"""
+        return _libBornAgainCore.IHistogram_createHistogram(source)
+
+    if _newclass:
+        createHistogram = staticmethod(createHistogram)
+    __swig_getmethods__["createHistogram"] = lambda x: createHistogram
+
+    def createFrom(*args):
+        """
+        createFrom(std::string const & filename) -> IHistogram
+        createFrom(vdouble2d_t data) -> IHistogram
+        """
+        return _libBornAgainCore.IHistogram_createFrom(*args)
+
+    if _newclass:
+        createFrom = staticmethod(createFrom)
+    __swig_getmethods__["createFrom"] = lambda x: createFrom
+
+    def createOutputData(self, *args):
+        """
+        createOutputData(IHistogram self, IHistogram::DataType dataType) -> IntensityData
+        createOutputData(IHistogram self) -> IntensityData
+
+        OutputData< double > * IHistogram::createOutputData(DataType dataType=DataType::INTEGRAL) const
+
+        creates new  OutputData with histogram's shape and values corresponding to DataType
+
+        creates new  OutputData with histogram's shape and put there values corresponding to DataType 
+
+        """
+        return _libBornAgainCore.IHistogram_createOutputData(self, *args)
+
+
+    def hasSameShape(self, other):
+        """
+        hasSameShape(IHistogram self, IHistogram other) -> bool
+
+        bool IHistogram::hasSameShape(const IHistogram &other) const
+
+        Returns true if objects a) have same dimensions b) bin boundaries of axes coincide. 
+
+        """
+        return _libBornAgainCore.IHistogram_hasSameShape(self, other)
+
+
+    def hasSameDimensions(self, other):
+        """
+        hasSameDimensions(IHistogram self, IHistogram other) -> bool
+
+        bool IHistogram::hasSameDimensions(const IHistogram &other) const
+
+        Returns true if object have same rank and number of axes bins. 
+
+        """
+        return _libBornAgainCore.IHistogram_hasSameDimensions(self, other)
+
+
+    def __iadd__(self, right):
+        """__iadd__(IHistogram self, IHistogram right) -> IHistogram"""
+        return _libBornAgainCore.IHistogram___iadd__(self, right)
+
+
+    def relativeDifferenceHistogram(self, rhs):
+        """
+        relativeDifferenceHistogram(IHistogram self, IHistogram rhs) -> IHistogram
+
+        IHistogram * IHistogram::relativeDifferenceHistogram(const IHistogram &rhs)
+
+        returns histogram representing relative difference of two histograms. 
+
+        """
+        return _libBornAgainCore.IHistogram_relativeDifferenceHistogram(self, rhs)
+
+
+    def save(self, filename):
+        """
+        save(IHistogram self, std::string const & filename)
+
+        void IHistogram::save(const std::string &filename)
+
+        Saves histogram in file Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz) 
+
+        """
+        return _libBornAgainCore.IHistogram_save(self, filename)
+
+
+    def load(self, filename):
+        """
+        load(IHistogram self, std::string const & filename)
+
+        void IHistogram::load(const std::string &filename)
+
+        Loads histogram from file, the shape of array in file should match Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz) Only bin content will be loaded, histogram axes remain the same. 
+
+        """
+        return _libBornAgainCore.IHistogram_load(self, filename)
+
+IHistogram_swigregister = _libBornAgainCore.IHistogram_swigregister
+IHistogram_swigregister(IHistogram)
+
+def IHistogram_createHistogram(source):
+    """IHistogram_createHistogram(IntensityData source) -> IHistogram"""
+    return _libBornAgainCore.IHistogram_createHistogram(source)
+
+def IHistogram_createFrom(*args):
+    """
+    createFrom(std::string const & filename) -> IHistogram
+    IHistogram_createFrom(vdouble2d_t data) -> IHistogram
+    """
+    return _libBornAgainCore.IHistogram_createFrom(*args)
+
+class Histogram1D(IHistogram):
+    """Proxy of C++ Histogram1D class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IHistogram]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Histogram1D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IHistogram]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Histogram1D, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Histogram1D self, int nbinsx, double xlow, double xup) -> Histogram1D
+        __init__(Histogram1D self, int nbinsx, vdouble1d_t xbins) -> Histogram1D
+        __init__(Histogram1D self, IAxis axis) -> Histogram1D
+        __init__(Histogram1D self, IntensityData data) -> Histogram1D
+
+        Histogram1D::Histogram1D(const OutputData< double > &data)
+
+        Constructor for 1D histograms from basic  OutputData object. 
+
+        """
+        this = _libBornAgainCore.new_Histogram1D(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(Histogram1D self) -> Histogram1D
+
+        Histogram1D * Histogram1D::clone() const
+
+        Returns clone of other histogram. 
+
+        """
+        return _libBornAgainCore.Histogram1D_clone(self)
+
+
+    def getRank(self):
+        """
+        getRank(Histogram1D self) -> size_t
+
+        size_t Histogram1D::getRank() const
+
+        Returns the number of histogram dimensions. 
+
+        """
+        return _libBornAgainCore.Histogram1D_getRank(self)
+
+
+    def fill(self, x, weight=1.0):
+        """
+        fill(Histogram1D self, double x, double weight=1.0) -> int
+        fill(Histogram1D self, double x) -> int
+
+        int Histogram1D::fill(double x, double weight=1.0)
+
+        Increment bin with abscissa x with a weight. 
+
+        """
+        return _libBornAgainCore.Histogram1D_fill(self, x, weight)
+
+
+    def getBinCenters(self):
+        """
+        getBinCenters(Histogram1D self) -> vdouble1d_t
+
+        std::vector< double > Histogram1D::getBinCenters() const
+
+        returns vector of histogram bin centers 
+
+        """
+        return self.getBinCentersNumpy()
+
+
+    def getBinValues(self):
+        """
+        getBinValues(Histogram1D self) -> vdouble1d_t
+
+        std::vector< double > Histogram1D::getBinValues() const
+
+        returns vector of bin content (the value accumulated by bins) 
+
+        """
+        return self.getBinValuesNumpy()
+
+
+    def getBinErrors(self):
+        """
+        getBinErrors(Histogram1D self) -> vdouble1d_t
+
+        std::vector< double > Histogram1D::getBinErrors() const
+
+        returns vector of bin errors 
+
+        """
+        return self.getBinErrorsNumpy()
+
+
+    def getBinCentersNumpy(self):
+        """getBinCentersNumpy(Histogram1D self) -> PyObject *"""
+        return _libBornAgainCore.Histogram1D_getBinCentersNumpy(self)
+
+
+    def getBinValuesNumpy(self):
+        """getBinValuesNumpy(Histogram1D self) -> PyObject *"""
+        return _libBornAgainCore.Histogram1D_getBinValuesNumpy(self)
+
+
+    def getBinErrorsNumpy(self):
+        """getBinErrorsNumpy(Histogram1D self) -> PyObject *"""
+        return _libBornAgainCore.Histogram1D_getBinErrorsNumpy(self)
+
+
+    def crop(self, xmin, xmax):
+        """
+        crop(Histogram1D self, double xmin, double xmax) -> Histogram1D
+
+        Histogram1D * Histogram1D::crop(double xmin, double xmax)
+
+        Create new histogram by applying crop on axis. 
+
+        """
+        return _libBornAgainCore.Histogram1D_crop(self, xmin, xmax)
+
+
+    def dynamicCast(pHistogram):
+        """dynamicCast(IHistogram pHistogram) -> Histogram1D"""
+        return _libBornAgainCore.Histogram1D_dynamicCast(pHistogram)
+
+    if _newclass:
+        dynamicCast = staticmethod(dynamicCast)
+    __swig_getmethods__["dynamicCast"] = lambda x: dynamicCast
+    __swig_destroy__ = _libBornAgainCore.delete_Histogram1D
+    __del__ = lambda self: None
+Histogram1D_swigregister = _libBornAgainCore.Histogram1D_swigregister
+Histogram1D_swigregister(Histogram1D)
+
+def Histogram1D_dynamicCast(pHistogram):
+    """Histogram1D_dynamicCast(IHistogram pHistogram) -> Histogram1D"""
+    return _libBornAgainCore.Histogram1D_dynamicCast(pHistogram)
+
+class Histogram2D(IHistogram):
+    """
+
+
+    Two dimensional histogram.
+
+    C++ includes: Histogram2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IHistogram]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Histogram2D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IHistogram]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Histogram2D, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Histogram2D self, int nbinsx, double xlow, double xup, int nbinsy, double ylow, double yup) -> Histogram2D
+        __init__(Histogram2D self, int nbinsx, vdouble1d_t xbins, int nbinsy, vdouble1d_t ybins) -> Histogram2D
+        __init__(Histogram2D self, IAxis axis_x, IAxis axis_y) -> Histogram2D
+        __init__(Histogram2D self, IntensityData data) -> Histogram2D
+        __init__(Histogram2D self, vdouble2d_t data) -> Histogram2D
+
+        Histogram2D::Histogram2D(const OutputData< double > &data)
+
+        Constructor for 2D histograms from basic  OutputData object. 
+
+        """
+        this = _libBornAgainCore.new_Histogram2D(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(Histogram2D self) -> Histogram2D
+
+        Histogram2D * Histogram2D::clone() const
+
+        Returns clone of other histogram. 
+
+        """
+        return _libBornAgainCore.Histogram2D_clone(self)
+
+
+    def getRank(self):
+        """
+        getRank(Histogram2D self) -> size_t
+
+        size_t Histogram2D::getRank() const
+
+        Returns the number of histogram dimensions. 
+
+        """
+        return _libBornAgainCore.Histogram2D_getRank(self)
+
+
+    def fill(self, x, y, weight=1.0):
+        """
+        fill(Histogram2D self, double x, double y, double weight=1.0) -> int
+        fill(Histogram2D self, double x, double y) -> int
+
+        int Histogram2D::fill(double x, double y, double weight=1.0)
+
+        Increment bin with abscissa x and ordinate y with a weight. 
+
+        """
+        return _libBornAgainCore.Histogram2D_fill(self, x, y, weight)
+
+
+    def projectionX(self, *args):
+        """
+        projectionX(Histogram2D self) -> Histogram1D
+        projectionX(Histogram2D self, double yvalue) -> Histogram1D
+        projectionX(Histogram2D self, double ylow, double yup) -> Histogram1D
+
+        Histogram1D * Histogram2D::projectionX(double ylow, double yup)
+
+        Project a 2D histogram into 1D histogram along X. The projection is made from all y-bins corresponding to ordinate between ylow and yup.
+
+        Parameters:
+        -----------
+
+        ylow: 
+        lower edje on y-axis
+
+        yup: 
+        upper edje on y-axis 
+
+        """
+        return _libBornAgainCore.Histogram2D_projectionX(self, *args)
+
+
+    def projectionY(self, *args):
+        """
+        projectionY(Histogram2D self) -> Histogram1D
+        projectionY(Histogram2D self, double xvalue) -> Histogram1D
+        projectionY(Histogram2D self, double xlow, double xup) -> Histogram1D
+
+        Histogram1D * Histogram2D::projectionY(double xlow, double xup)
+
+        Project a 2D histogram into 1D histogram along Y. The projection is made from all x-bins corresponding to abscissa between xlow and xup.
+
+        Parameters:
+        -----------
+
+        xlow: 
+        lower edje on x-axis
+
+        xup: 
+        upper edje on x-axis 
+
+        """
+        return _libBornAgainCore.Histogram2D_projectionY(self, *args)
+
+
+    def crop(self, xmin, ymin, xmax, ymax):
+        """
+        crop(Histogram2D self, double xmin, double ymin, double xmax, double ymax) -> Histogram2D
+
+        Histogram2D * Histogram2D::crop(double xmin, double ymin, double xmax, double ymax)
+
+        Create new histogram by applying rectangular clip. 
+
+        """
+        return _libBornAgainCore.Histogram2D_crop(self, xmin, ymin, xmax, ymax)
+
+
+    def setContent(self, data):
+        """setContent(Histogram2D self, vdouble2d_t data)"""
+        return _libBornAgainCore.Histogram2D_setContent(self, data)
+
+
+    def addContent(self, data):
+        """addContent(Histogram2D self, vdouble2d_t data)"""
+        return _libBornAgainCore.Histogram2D_addContent(self, data)
+
+
+    def dynamicCast(pHistogram):
+        """dynamicCast(IHistogram pHistogram) -> Histogram2D"""
+        return _libBornAgainCore.Histogram2D_dynamicCast(pHistogram)
+
+    if _newclass:
+        dynamicCast = staticmethod(dynamicCast)
+    __swig_getmethods__["dynamicCast"] = lambda x: dynamicCast
+    __swig_destroy__ = _libBornAgainCore.delete_Histogram2D
+    __del__ = lambda self: None
+Histogram2D_swigregister = _libBornAgainCore.Histogram2D_swigregister
+Histogram2D_swigregister(Histogram2D)
+
+def Histogram2D_dynamicCast(pHistogram):
+    """Histogram2D_dynamicCast(IHistogram pHistogram) -> Histogram2D"""
+    return _libBornAgainCore.Histogram2D_dynamicCast(pHistogram)
+
+class IMaterial(INamed):
+    """
+
+
+    Interface to a named material.
+
+    C++ includes: IMaterial.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [INamed]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IMaterial, name, value)
+    __swig_getmethods__ = {}
+    for _s in [INamed]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IMaterial, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IMaterial
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IMaterial self) -> IMaterial
+
+        IMaterial * IMaterial::clone() const 
+
+        """
+        return _libBornAgainCore.IMaterial_clone(self)
+
+
+    def isScalarMaterial(self):
+        """
+        isScalarMaterial(IMaterial self) -> bool
+
+        virtual bool IMaterial::isScalarMaterial() const
+
+        Indicates whether the interaction with the material is scalar. This means that different polarization states will be diffracted equally 
+
+        """
+        return _libBornAgainCore.IMaterial_isScalarMaterial(self)
+
+
+    def isMagneticMaterial(self):
+        """
+        isMagneticMaterial(IMaterial self) -> bool
+
+        bool IMaterial::isMagneticMaterial() const 
+
+        """
+        return _libBornAgainCore.IMaterial_isMagneticMaterial(self)
+
+
+    def getRefractiveIndex(self):
+        """
+        getRefractiveIndex(IMaterial self) -> complex_t
+
+        virtual complex_t IMaterial::getRefractiveIndex() const 
+
+        """
+        return _libBornAgainCore.IMaterial_getRefractiveIndex(self)
+
+
+    def createTransformedMaterial(self, transform):
+        """
+        createTransformedMaterial(IMaterial self, Transform3D const & transform) -> IMaterial
+
+        virtual const IMaterial* IMaterial::createTransformedMaterial(const Transform3D &transform) const =0
+
+        Create a new material that is transformed with respect to this one. 
+
+        """
+        return _libBornAgainCore.IMaterial_createTransformedMaterial(self, transform)
+
+
+    def __eq__(self, other):
+        """__eq__(IMaterial self, IMaterial other) -> bool"""
+        return _libBornAgainCore.IMaterial___eq__(self, other)
+
+IMaterial_swigregister = _libBornAgainCore.IMaterial_swigregister
+IMaterial_swigregister(IMaterial)
+
+class HomogeneousMaterial(IMaterial):
+    """
+
+
+    An homogeneous material with a refractive index.
+
+    C++ includes: HomogeneousMaterial.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IMaterial]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, HomogeneousMaterial, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IMaterial]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, HomogeneousMaterial, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(HomogeneousMaterial self, std::string const & name, complex_t const refractive_index) -> HomogeneousMaterial
+        __init__(HomogeneousMaterial self, std::string const & name, double refractive_index_delta, double refractive_index_beta) -> HomogeneousMaterial
+
+        HomogeneousMaterial::HomogeneousMaterial(const std::string &name, double refractive_index_delta, double refractive_index_beta)
+
+        Constructs a material with  name and refractive_index parameters delta and beta (n = 1 - delta + i*beta). 
+
+        """
+        this = _libBornAgainCore.new_HomogeneousMaterial(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_HomogeneousMaterial
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(HomogeneousMaterial self) -> HomogeneousMaterial
+
+        virtual HomogeneousMaterial* HomogeneousMaterial::clone() const 
+
+        """
+        return _libBornAgainCore.HomogeneousMaterial_clone(self)
+
+
+    def getRefractiveIndex(self):
+        """
+        getRefractiveIndex(HomogeneousMaterial self) -> complex_t
+
+        virtual complex_t HomogeneousMaterial::getRefractiveIndex() const 
+
+        """
+        return _libBornAgainCore.HomogeneousMaterial_getRefractiveIndex(self)
+
+
+    def setRefractiveIndex(self, refractive_index):
+        """
+        setRefractiveIndex(HomogeneousMaterial self, complex_t const refractive_index)
+
+        void HomogeneousMaterial::setRefractiveIndex(const complex_t refractive_index)
+
+        """
+        return _libBornAgainCore.HomogeneousMaterial_setRefractiveIndex(self, refractive_index)
+
+
+    def createTransformedMaterial(self, arg2):
+        """
+        createTransformedMaterial(HomogeneousMaterial self, Transform3D const & arg2) -> IMaterial
+
+        virtual const IMaterial* HomogeneousMaterial::createTransformedMaterial(const Transform3D &) const
+
+        Create a new material that is transformed with respect to this one. 
+
+        """
+        return _libBornAgainCore.HomogeneousMaterial_createTransformedMaterial(self, arg2)
+
+HomogeneousMaterial_swigregister = _libBornAgainCore.HomogeneousMaterial_swigregister
+HomogeneousMaterial_swigregister(HomogeneousMaterial)
+
+class HomogeneousMagneticMaterial(HomogeneousMaterial):
+    """
+
+
+    A homogeneous material with magnetization.
+
+    C++ includes: HomogeneousMagneticMaterial.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [HomogeneousMaterial]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, HomogeneousMagneticMaterial, name, value)
+    __swig_getmethods__ = {}
+    for _s in [HomogeneousMaterial]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, HomogeneousMagneticMaterial, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(HomogeneousMagneticMaterial self, std::string const & name, complex_t const refractive_index, kvector_t magnetic_field) -> HomogeneousMagneticMaterial
+        __init__(HomogeneousMagneticMaterial self, std::string const & name, double refractive_index_delta, double refractive_index_beta, kvector_t magnetic_field) -> HomogeneousMagneticMaterial
+
+        HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(const std::string &name, double refractive_index_delta, double refractive_index_beta, const kvector_t magnetic_field)
+
+        Constructs a material with  name, refractive_index parameters and  magnetic_field
+
+        """
+        this = _libBornAgainCore.new_HomogeneousMagneticMaterial(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(HomogeneousMagneticMaterial self) -> HomogeneousMagneticMaterial
+
+        HomogeneousMagneticMaterial * HomogeneousMagneticMaterial::clone() const
+
+        Clone. 
+
+        """
+        return _libBornAgainCore.HomogeneousMagneticMaterial_clone(self)
+
+
+    def getMagneticField(self):
+        """
+        getMagneticField(HomogeneousMagneticMaterial self) -> kvector_t
+
+        kvector_t HomogeneousMagneticMaterial::getMagneticField() const
+
+        Get the magnetic field (in Tesla) 
+
+        """
+        return _libBornAgainCore.HomogeneousMagneticMaterial_getMagneticField(self)
+
+
+    def setMagneticField(self, magnetic_field):
+        """
+        setMagneticField(HomogeneousMagneticMaterial self, kvector_t magnetic_field)
+
+        void HomogeneousMagneticMaterial::setMagneticField(const kvector_t magnetic_field)
+
+        Set the magnetic field (in Tesla) 
+
+        """
+        return _libBornAgainCore.HomogeneousMagneticMaterial_setMagneticField(self, magnetic_field)
+
+
+    def isScalarMaterial(self):
+        """
+        isScalarMaterial(HomogeneousMagneticMaterial self) -> bool
+
+        virtual bool HomogeneousMagneticMaterial::isScalarMaterial() const
+
+        Indicates that the material is not scalar. This means that different polarization states will be diffracted differently 
+
+        """
+        return _libBornAgainCore.HomogeneousMagneticMaterial_isScalarMaterial(self)
+
+
+    def createTransformedMaterial(self, transform):
+        """
+        createTransformedMaterial(HomogeneousMagneticMaterial self, Transform3D const & transform) -> IMaterial
+
+        const IMaterial * HomogeneousMagneticMaterial::createTransformedMaterial(const Transform3D &transform) const
+
+        Create a new material that is transformed with respect to this one. 
+
+        """
+        return _libBornAgainCore.HomogeneousMagneticMaterial_createTransformedMaterial(self, transform)
+
+    __swig_destroy__ = _libBornAgainCore.delete_HomogeneousMagneticMaterial
+    __del__ = lambda self: None
+HomogeneousMagneticMaterial_swigregister = _libBornAgainCore.HomogeneousMagneticMaterial_swigregister
+HomogeneousMagneticMaterial_swigregister(HomogeneousMagneticMaterial)
+
+class IDetector2D(ICloneable, IParameterized):
+    """Proxy of C++ IDetector2D class."""
+
+    __swig_setmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IDetector2D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IDetector2D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    DEFAULT = _libBornAgainCore.IDetector2D_DEFAULT
+    NBINS = _libBornAgainCore.IDetector2D_NBINS
+    RADIANS = _libBornAgainCore.IDetector2D_RADIANS
+    DEGREES = _libBornAgainCore.IDetector2D_DEGREES
+    MM = _libBornAgainCore.IDetector2D_MM
+    QYQZ = _libBornAgainCore.IDetector2D_QYQZ
+
+    def clone(self):
+        """
+        clone(IDetector2D self) -> IDetector2D
+
+        virtual IDetector2D* IDetector2D::clone() const =0
+
+        """
+        return _libBornAgainCore.IDetector2D_clone(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IDetector2D
+    __del__ = lambda self: None
+
+    def init(self, arg2):
+        """
+        init(IDetector2D self, Beam arg2)
+
+        virtual void IDetector2D::init(const Beam &)
+
+        Inits detector with the beam settings. 
+
+        """
+        return _libBornAgainCore.IDetector2D_init(self, arg2)
+
+
+    def addAxis(self, axis):
+        """
+        addAxis(IDetector2D self, IAxis axis)
+
+        void IDetector2D::addAxis(const IAxis &axis)
+
+        """
+        return _libBornAgainCore.IDetector2D_addAxis(self, axis)
+
+
+    def getAxis(self, index):
+        """
+        getAxis(IDetector2D self, size_t index) -> IAxis
+
+        const IAxis & IDetector2D::getAxis(size_t index) const 
+
+        """
+        return _libBornAgainCore.IDetector2D_getAxis(self, index)
+
+
+    def getDimension(self):
+        """
+        getDimension(IDetector2D self) -> size_t
+
+        size_t IDetector2D::getDimension() const 
+
+        """
+        return _libBornAgainCore.IDetector2D_getDimension(self)
+
+
+    def clear(self):
+        """
+        clear(IDetector2D self)
+
+        void IDetector2D::clear()
+
+        """
+        return _libBornAgainCore.IDetector2D_clear(self)
+
+
+    def setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max):
+        """
+        setDetectorParameters(IDetector2D self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+        void IDetector2D::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+        Sets detector parameters using angle ranges. 
+
+        """
+        return _libBornAgainCore.IDetector2D_setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max)
+
+
+    def setDetectorAxes(self, axis0, axis1):
+        """
+        setDetectorAxes(IDetector2D self, IAxis axis0, IAxis axis1)
+
+        void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
+
+        Sets detector parameters using axes. 
+
+        """
+        return _libBornAgainCore.IDetector2D_setDetectorAxes(self, axis0, axis1)
+
+
+    def setDetectorResolution(self, p_detector_resolution):
+        """
+        setDetectorResolution(IDetector2D self, IDetectorResolution p_detector_resolution)
+
+        void IDetector2D::setDetectorResolution(IDetectorResolution *p_detector_resolution)
+
+        Sets the detector resolution. 
+
+        """
+        return _libBornAgainCore.IDetector2D_setDetectorResolution(self, p_detector_resolution)
+
+
+    def applyDetectorResolution(self, p_intensity_map):
+        """
+        applyDetectorResolution(IDetector2D self, IntensityData p_intensity_map)
+
+        void IDetector2D::applyDetectorResolution(OutputData< double > *p_intensity_map) const
+
+        Applies the detector resolution to the given intensity maps. 
+
+        """
+        return _libBornAgainCore.IDetector2D_applyDetectorResolution(self, p_intensity_map)
+
+
+    def getDetectorResolutionFunction(self):
+        """
+        getDetectorResolutionFunction(IDetector2D self) -> IDetectorResolution
+
+        const IDetectorResolution * IDetector2D::getDetectorResolutionFunction() const 
+
+        """
+        return _libBornAgainCore.IDetector2D_getDetectorResolutionFunction(self)
+
+
+    def setAnalyzerProperties(self, direction, efficiency, total_transmission):
+        """
+        setAnalyzerProperties(IDetector2D self, kvector_t direction, double efficiency, double total_transmission)
+
+        void IDetector2D::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)
+
+        Sets the polarization analyzer characteristics of the detector. 
+
+        """
+        return _libBornAgainCore.IDetector2D_setAnalyzerProperties(self, direction, efficiency, total_transmission)
+
+
+    def removeMasks(self):
+        """
+        removeMasks(IDetector2D self)
+
+        void IDetector2D::removeMasks()
+
+        removes all masks from the detector 
+
+        """
+        return _libBornAgainCore.IDetector2D_removeMasks(self)
+
+
+    def addMask(self, shape, mask_value=True):
+        """
+        addMask(IDetector2D self, IShape2D shape, bool mask_value=True)
+        addMask(IDetector2D self, IShape2D shape)
+
+        void IDetector2D::addMask(const Geometry::IShape2D &shape, bool mask_value=true)
+
+        Adds mask of given shape to the stack of detector masks. The mask value 'true' means that the channel will be excluded from the simulation. The mask which is added last has priority.
+
+        Parameters:
+        -----------
+
+        shape: 
+        The shape of mask (Rectangle, Polygon, Line, Ellipse)
+
+        mask_value: 
+        The value of mask 
+
+        """
+        return _libBornAgainCore.IDetector2D_addMask(self, shape, mask_value)
+
+
+    def maskAll(self):
+        """
+        maskAll(IDetector2D self)
+
+        void IDetector2D::maskAll()
+
+        Put the mask for all detector channels (i.e. exclude whole detector from the analysis) 
+
+        """
+        return _libBornAgainCore.IDetector2D_maskAll(self)
+
+
+    def getDetectorMask(self):
+        """
+        getDetectorMask(IDetector2D self) -> DetectorMask
+
+        const DetectorMask * IDetector2D::getDetectorMask() const 
+
+        """
+        return _libBornAgainCore.IDetector2D_getDetectorMask(self)
+
+
+    def numberOfMaskedChannels(self):
+        """
+        numberOfMaskedChannels(IDetector2D self) -> size_t
+
+        size_t IDetector2D::numberOfMaskedChannels() const 
+
+        """
+        return _libBornAgainCore.IDetector2D_numberOfMaskedChannels(self)
+
+
+    def isMasked(self, index):
+        """
+        isMasked(IDetector2D self, size_t index) -> bool
+
+        bool IDetector2D::isMasked(size_t index) const 
+
+        """
+        return _libBornAgainCore.IDetector2D_isMasked(self, index)
+
+
+    def hasMasks(self):
+        """
+        hasMasks(IDetector2D self) -> bool
+
+        bool IDetector2D::hasMasks() const
+
+        return true if has masks 
+
+        """
+        return _libBornAgainCore.IDetector2D_hasMasks(self)
+
+
+    def createDetectorIntensity(self, *args):
+        """
+        createDetectorIntensity(IDetector2D self, std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements, Beam beam, IDetector2D::EAxesUnits units_type) -> IntensityData
+        createDetectorIntensity(IDetector2D self, std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements, Beam beam) -> IntensityData
+
+        OutputData< double > * IDetector2D::createDetectorIntensity(const std::vector< SimulationElement > &elements, const Beam &beam, IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+        Returns new intensity map with detector resolution applied and axes in requested units. 
+
+        """
+        return _libBornAgainCore.IDetector2D_createDetectorIntensity(self, *args)
+
+
+    def createDetectorMap(self, beam, units):
+        """
+        createDetectorMap(IDetector2D self, Beam beam, IDetector2D::EAxesUnits units) -> IntensityData
+
+        OutputData< double > * IDetector2D::createDetectorMap(const Beam &beam, EAxesUnits units) const
+
+        Returns empty detector map in given axes units. 
+
+        """
+        return _libBornAgainCore.IDetector2D_createDetectorMap(self, beam, units)
+
+
+    def initOutputData(self, data):
+        """
+        initOutputData(IDetector2D self, IntensityData data)
+
+        void IDetector2D::initOutputData(OutputData< double > &data) const
+
+        Inits axes of  OutputData to match the detector and sets values to zero. 
+
+        """
+        return _libBornAgainCore.IDetector2D_initOutputData(self, data)
+
+
+    def getValidAxesUnits(self):
+        """
+        getValidAxesUnits(IDetector2D self) -> std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >
+
+        std::vector< IDetector2D::EAxesUnits > IDetector2D::getValidAxesUnits() const
+
+        returns vector of valid axes units 
+
+        """
+        return _libBornAgainCore.IDetector2D_getValidAxesUnits(self)
+
+
+    def getDefaultAxesUnits(self):
+        """
+        getDefaultAxesUnits(IDetector2D self) -> IDetector2D::EAxesUnits
+
+        virtual EAxesUnits IDetector2D::getDefaultAxesUnits() const
+
+        return default axes units 
+
+        """
+        return _libBornAgainCore.IDetector2D_getDefaultAxesUnits(self)
+
+
+    def regionOfInterest(self):
+        """
+        regionOfInterest(IDetector2D self) -> RegionOfInterest const *
+
+        const RegionOfInterest * IDetector2D::regionOfInterest() const
+
+        Returns region of interest if exists. 
+
+        """
+        return _libBornAgainCore.IDetector2D_regionOfInterest(self)
+
+
+    def setRegionOfInterest(self, xlow, ylow, xup, yup):
+        """
+        setRegionOfInterest(IDetector2D self, double xlow, double ylow, double xup, double yup)
+
+        void IDetector2D::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
+
+        Sets rectangular region of interest with lower left and upper right corners defined. 
+
+        """
+        return _libBornAgainCore.IDetector2D_setRegionOfInterest(self, xlow, ylow, xup, yup)
+
+
+    def resetRegionOfInterest(self):
+        """
+        resetRegionOfInterest(IDetector2D self)
+
+        void IDetector2D::resetRegionOfInterest()
+
+        Resets region of interest making whole detector plane available for the simulation. 
+
+        """
+        return _libBornAgainCore.IDetector2D_resetRegionOfInterest(self)
+
+
+    def getTotalSize(self):
+        """
+        getTotalSize(IDetector2D self) -> size_t
+
+        size_t IDetector2D::getTotalSize() const
+
+        Returns total number of pixels. 
+
+        """
+        return _libBornAgainCore.IDetector2D_getTotalSize(self)
+
+
+    def getAxisBinIndex(self, index, selected_axis):
+        """
+        getAxisBinIndex(IDetector2D self, size_t index, size_t selected_axis) -> size_t
+
+        size_t IDetector2D::getAxisBinIndex(size_t index, size_t selected_axis) const
+
+        Calculate axis index for given global index. 
+
+        """
+        return _libBornAgainCore.IDetector2D_getAxisBinIndex(self, index, selected_axis)
+
+
+    def numberOfSimulationElements(self):
+        """
+        numberOfSimulationElements(IDetector2D self) -> size_t
+
+        size_t IDetector2D::numberOfSimulationElements() const
+
+        Returns number of simulation elements. 
+
+        """
+        return _libBornAgainCore.IDetector2D_numberOfSimulationElements(self)
+
+IDetector2D_swigregister = _libBornAgainCore.IDetector2D_swigregister
+IDetector2D_swigregister(IDetector2D)
+
+class IDetectorResolution(ICloneable, IParameterized):
+    """
+
+
+    Interface for detector resolution algorithms.
+
+    C++ includes: IDetectorResolution.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IDetectorResolution, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IDetectorResolution, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IDetectorResolution
+    __del__ = lambda self: None
+
+    def applyDetectorResolution(self, p_intensity_map):
+        """
+        applyDetectorResolution(IDetectorResolution self, IntensityData p_intensity_map)
+
+        virtual void IDetectorResolution::applyDetectorResolution(OutputData< double > *p_intensity_map) const =0
+
+        Apply the resolution function to the intensity data. 
+
+        """
+        return _libBornAgainCore.IDetectorResolution_applyDetectorResolution(self, p_intensity_map)
+
+
+    def clone(self):
+        """
+        clone(IDetectorResolution self) -> IDetectorResolution
+
+        virtual IDetectorResolution* IDetectorResolution::clone() const =0
+
+        """
+        return _libBornAgainCore.IDetectorResolution_clone(self)
+
+IDetectorResolution_swigregister = _libBornAgainCore.IDetectorResolution_swigregister
+IDetectorResolution_swigregister(IDetectorResolution)
+
+class IInterferenceFunction(ISample):
+    """
+
+
+    Pure virtual base class of interference functions.
+
+    C++ includes: IInterferenceFunction.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IInterferenceFunction, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IInterferenceFunction, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IInterferenceFunction
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IInterferenceFunction self) -> IInterferenceFunction
+
+        virtual IInterferenceFunction* IInterferenceFunction::clone() const =0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(IInterferenceFunction self, ISampleVisitor visitor)
+
+        virtual void IInterferenceFunction::accept(ISampleVisitor *visitor) const =0
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_accept(self, visitor)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(IInterferenceFunction self, kvector_t q) -> double
+
+        virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0
+
+        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_evaluate(self, q)
+
+
+    def getKappa(self):
+        """
+        getKappa(IInterferenceFunction self) -> double
+
+        virtual double IInterferenceFunction::getKappa() const
+
+        Retrieves the size-distance coupling constant (default 0.0) 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_getKappa(self)
+
+
+    def getParticleDensity(self):
+        """
+        getParticleDensity(IInterferenceFunction self) -> double
+
+        virtual double IInterferenceFunction::getParticleDensity() const
+
+        If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value 
+
+        """
+        return _libBornAgainCore.IInterferenceFunction_getParticleDensity(self)
+
+IInterferenceFunction_swigregister = _libBornAgainCore.IInterferenceFunction_swigregister
+IInterferenceFunction_swigregister(IInterferenceFunction)
+
+class ILayout(ICompositeSample):
+    """
+
+
+    Interface to equip a sample component with various properties.
+
+    C++ includes: ILayout.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ILayout, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ILayout, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    DA = _libBornAgainCore.ILayout_DA
+    SSCA = _libBornAgainCore.ILayout_SSCA
+    __swig_destroy__ = _libBornAgainCore.delete_ILayout
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ILayout self) -> ILayout
+
+        virtual ILayout* ILayout::clone() const =0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.ILayout_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(ILayout self, ISampleVisitor visitor)
+
+        virtual void ILayout::accept(ISampleVisitor *visitor) const =0
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.ILayout_accept(self, visitor)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(ILayout self) -> ILayout
+
+        virtual ILayout* ILayout::cloneInvertB() const =0
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.ILayout_cloneInvertB(self)
+
+
+    def getNumberOfParticles(self):
+        """
+        getNumberOfParticles(ILayout self) -> size_t
+
+        virtual size_t ILayout::getNumberOfParticles() const =0
+
+        Returns number of particles. 
+
+        """
+        return _libBornAgainCore.ILayout_getNumberOfParticles(self)
+
+
+    def getParticle(self, index):
+        """
+        getParticle(ILayout self, size_t index) -> IAbstractParticle
+
+        virtual const IAbstractParticle* ILayout::getParticle(size_t index) const =0
+
+        Returns information about particle with index. 
+
+        """
+        return _libBornAgainCore.ILayout_getParticle(self, index)
+
+
+    def getParticles(self):
+        """
+        getParticles(ILayout self) -> SafePointerVector< IParticle const >
+
+        virtual SafePointerVector<const IParticle> ILayout::getParticles() const =0
+
+        Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection 
+
+        """
+        return _libBornAgainCore.ILayout_getParticles(self)
+
+
+    def getAbundanceOfParticle(self, index):
+        """
+        getAbundanceOfParticle(ILayout self, size_t index) -> double
+
+        virtual double ILayout::getAbundanceOfParticle(size_t index) const =0
+
+        Get abundance fraction of particle with index. 
+
+        """
+        return _libBornAgainCore.ILayout_getAbundanceOfParticle(self, index)
+
+
+    def getTotalAbundance(self):
+        """
+        getTotalAbundance(ILayout self) -> double
+
+        double ILayout::getTotalAbundance() const
+
+        Get total abundance of all particles. 
+
+        """
+        return _libBornAgainCore.ILayout_getTotalAbundance(self)
+
+
+    def getInterferenceFunction(self):
+        """
+        getInterferenceFunction(ILayout self) -> IInterferenceFunction
+
+        virtual const IInterferenceFunction* ILayout::getInterferenceFunction() const =0
+
+        Returns interference function. 
+
+        """
+        return _libBornAgainCore.ILayout_getInterferenceFunction(self)
+
+
+    def cloneInterferenceFunction(self):
+        """
+        cloneInterferenceFunction(ILayout self) -> IInterferenceFunction
+
+        virtual IInterferenceFunction* ILayout::cloneInterferenceFunction() const =0
+
+        """
+        return _libBornAgainCore.ILayout_cloneInterferenceFunction(self)
+
+
+    def getTotalParticleSurfaceDensity(self):
+        """
+        getTotalParticleSurfaceDensity(ILayout self) -> double
+
+        virtual double ILayout::getTotalParticleSurfaceDensity() const =0
+
+        Returns surface density of all particles. 
+
+        """
+        return _libBornAgainCore.ILayout_getTotalParticleSurfaceDensity(self)
+
+
+    def setTotalParticleSurfaceDensity(self, particle_density):
+        """
+        setTotalParticleSurfaceDensity(ILayout self, double particle_density)
+
+        virtual void ILayout::setTotalParticleSurfaceDensity(double particle_density)=0
+
+        Sets surface density of all particles. 
+
+        """
+        return _libBornAgainCore.ILayout_setTotalParticleSurfaceDensity(self, particle_density)
+
+
+    def getApproximation(self):
+        """
+        getApproximation(ILayout self) -> ILayout::EInterferenceApproximation
+
+        EInterferenceApproximation ILayout::getApproximation() const
+
+        Gets the used approximation for particles and interference functions. 
+
+        """
+        return _libBornAgainCore.ILayout_getApproximation(self)
+
+
+    def setApproximation(self, approximation):
+        """
+        setApproximation(ILayout self, ILayout::EInterferenceApproximation approximation)
+
+        void ILayout::setApproximation(EInterferenceApproximation approximation)
+
+        Sets the used approximation for particles and interference functions. 
+
+        """
+        return _libBornAgainCore.ILayout_setApproximation(self, approximation)
+
+ILayout_swigregister = _libBornAgainCore.ILayout_swigregister
+ILayout_swigregister(ILayout)
+
+class IAbstractParticle(ICompositeSample):
+    """
+
+
+    Interface for a generic particle.
+
+    Inherited by  IParticle and  ParticleDistribution.
+
+    C++ includes: IAbstractParticle.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IAbstractParticle, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IAbstractParticle, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IAbstractParticle
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IAbstractParticle self) -> IAbstractParticle
+
+        virtual IAbstractParticle* IAbstractParticle::clone() const =0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IAbstractParticle_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(IAbstractParticle self) -> IAbstractParticle
+
+        virtual IAbstractParticle* IAbstractParticle::cloneInvertB() const =0
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.IAbstractParticle_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(IAbstractParticle self, ISampleVisitor visitor)
+
+        virtual void IAbstractParticle::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.IAbstractParticle_accept(self, visitor)
+
+
+    def setAmbientMaterial(self, arg2):
+        """
+        setAmbientMaterial(IAbstractParticle self, IMaterial arg2)
+
+        virtual void IAbstractParticle::setAmbientMaterial(const IMaterial &)=0
+
+        Sets the refractive index of the ambient material (which influences its scattering power) 
+
+        """
+        return _libBornAgainCore.IAbstractParticle_setAmbientMaterial(self, arg2)
+
+
+    def getAbundance(self):
+        """
+        getAbundance(IAbstractParticle self) -> double
+
+        double IAbstractParticle::getAbundance() const 
+
+        """
+        return _libBornAgainCore.IAbstractParticle_getAbundance(self)
+
+
+    def setAbundance(self, abundance):
+        """
+        setAbundance(IAbstractParticle self, double abundance)
+
+        void IAbstractParticle::setAbundance(double abundance)
+
+        """
+        return _libBornAgainCore.IAbstractParticle_setAbundance(self, abundance)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(IAbstractParticle self) -> IMaterial
+
+        virtual const IMaterial* IAbstractParticle::getAmbientMaterial() const =0
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.IAbstractParticle_getAmbientMaterial(self)
+
+IAbstractParticle_swigregister = _libBornAgainCore.IAbstractParticle_swigregister
+IAbstractParticle_swigregister(IAbstractParticle)
+
+class IParameterReal(INamed, INoncopyable):
+    """
+
+
+    Pure virtual base class for parameter wrapper classes  RealParameter, ComponentParameter. Holds a pointer to the wrapped parameter, a name, and a callback function to be called when the parameter is changed. This class is templated on the data type of the wrapped parameter.
+
+    C++ includes: IParameter.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [INamed, INoncopyable]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IParameterReal, name, value)
+    __swig_getmethods__ = {}
+    for _s in [INamed, INoncopyable]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IParameterReal, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def clone(self, *args):
+        """
+        clone(IParameterReal self, std::string const & new_name) -> IParameterReal
+        clone(IParameterReal self) -> IParameterReal
+
+        virtual IParameter* IParameter< T >::clone(const std::string &new_name="") const =0
+
+        """
+        return _libBornAgainCore.IParameterReal_clone(self, *args)
+
+
+    def isNull(self):
+        """
+        isNull(IParameterReal self) -> bool
+
+        virtual bool IParameter< T >::isNull() const
+
+        Returns true if wrapped parameter was not initialized with proper real value. 
+
+        """
+        return _libBornAgainCore.IParameterReal_isNull(self)
+
+
+    def getData(self):
+        """
+        getData(IParameterReal self) -> double volatile &
+
+        volatile T& IParameter< T >::getData() const 
+
+        """
+        return _libBornAgainCore.IParameterReal_getData(self)
+
+
+    def setData(self, data):
+        """
+        setData(IParameterReal self, double volatile & data)
+
+        void IParameter< T >::setData(volatile T &data)
+
+        """
+        return _libBornAgainCore.IParameterReal_setData(self, data)
+
+
+    def __eq__(self, other):
+        """__eq__(IParameterReal self, IParameterReal other) -> bool"""
+        return _libBornAgainCore.IParameterReal___eq__(self, other)
+
+
+    def __ne__(self, other):
+        """__ne__(IParameterReal self, IParameterReal other) -> bool"""
+        return _libBornAgainCore.IParameterReal___ne__(self, other)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IParameterReal
+    __del__ = lambda self: None
+IParameterReal_swigregister = _libBornAgainCore.IParameterReal_swigregister
+IParameterReal_swigregister(IParameterReal)
+
+class IParticle(IAbstractParticle):
+    """
+
+
+    Pure virtual base class for  Particle,  ParticleComposition,  ParticleCoreShell,  MesoCrystal. Provides position/rotation and form factor. Abundance is inherited from  IAbstractParticle.
+
+    C++ includes: IParticle.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IAbstractParticle]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IParticle, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IAbstractParticle]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IParticle, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IParticle
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IParticle self) -> IParticle
+
+        virtual IParticle* IParticle::clone() const =0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IParticle_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(IParticle self) -> IParticle
+
+        virtual IParticle* IParticle::cloneInvertB() const =0
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.IParticle_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(IParticle self, ISampleVisitor visitor)
+
+        virtual void IParticle::accept(ISampleVisitor *visitor) const
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.IParticle_accept(self, visitor)
+
+
+    def createFormFactor(self):
+        """
+        createFormFactor(IParticle self) -> IFormFactor
+
+        IFormFactor * IParticle::createFormFactor() const
+
+        Create a form factor for this particle. 
+
+        """
+        return _libBornAgainCore.IParticle_createFormFactor(self)
+
+
+    def createTransformedFormFactor(self, p_rotation, translation):
+        """
+        createTransformedFormFactor(IParticle self, IRotation p_rotation, kvector_t translation) -> IFormFactor
+
+        virtual IFormFactor* IParticle::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const =0
+
+        Create a form factor for this particle with an extra transformation. 
+
+        """
+        return _libBornAgainCore.IParticle_createTransformedFormFactor(self, p_rotation, translation)
+
+
+    def getPosition(self):
+        """
+        getPosition(IParticle self) -> kvector_t
+
+        kvector_t IParticle::getPosition() const
+
+        Returns particle position. 
+
+        """
+        return _libBornAgainCore.IParticle_getPosition(self)
+
+
+    def setPosition(self, *args):
+        """
+        setPosition(IParticle self, kvector_t position)
+        setPosition(IParticle self, double x, double y, double z)
+
+        void IParticle::setPosition(double x, double y, double z)
+
+        Sets particle position. 
+
+        """
+        return _libBornAgainCore.IParticle_setPosition(self, *args)
+
+
+    def getRotation(self):
+        """
+        getRotation(IParticle self) -> IRotation
+
+        const IRotation * IParticle::getRotation() const
+
+        Returns rotation object. 
+
+        """
+        return _libBornAgainCore.IParticle_getRotation(self)
+
+
+    def setRotation(self, rotation):
+        """
+        setRotation(IParticle self, IRotation rotation)
+
+        void IParticle::setRotation(const IRotation &rotation)
+
+        Sets transformation. 
+
+        """
+        return _libBornAgainCore.IParticle_setRotation(self, rotation)
+
+
+    def applyRotation(self, rotation):
+        """
+        applyRotation(IParticle self, IRotation rotation)
+
+        void IParticle::applyRotation(const IRotation &rotation)
+
+        Applies transformation by composing it with the existing one. 
+
+        """
+        return _libBornAgainCore.IParticle_applyRotation(self, rotation)
+
+
+    def applyTranslation(self, displacement):
+        """
+        applyTranslation(IParticle self, kvector_t displacement)
+
+        void IParticle::applyTranslation(kvector_t displacement)
+
+        Applies extra translation by adding it to the current one. 
+
+        """
+        return _libBornAgainCore.IParticle_applyTranslation(self, displacement)
+
+IParticle_swigregister = _libBornAgainCore.IParticle_swigregister
+IParticle_swigregister(IParticle)
+
+class IResolutionFunction2D(IParameterized):
+    """
+
+
+    Interface providing two-dimensional resolution function.
+
+    C++ includes: IResolutionFunction2D.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IResolutionFunction2D, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IResolutionFunction2D, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IResolutionFunction2D
+    __del__ = lambda self: None
+
+    def evaluateCDF(self, x, y):
+        """
+        evaluateCDF(IResolutionFunction2D self, double x, double y) -> double
+
+        virtual double IResolutionFunction2D::evaluateCDF(double x, double y) const =0
+
+        """
+        return _libBornAgainCore.IResolutionFunction2D_evaluateCDF(self, x, y)
+
+
+    def clone(self):
+        """
+        clone(IResolutionFunction2D self) -> IResolutionFunction2D
+
+        virtual IResolutionFunction2D* IResolutionFunction2D::clone() const =0
+
+        """
+        return _libBornAgainCore.IResolutionFunction2D_clone(self)
+
+IResolutionFunction2D_swigregister = _libBornAgainCore.IResolutionFunction2D_swigregister
+IResolutionFunction2D_swigregister(IResolutionFunction2D)
+
+class IRotation(ISample):
+    """
+
+
+    must be subclass of sample, because it can be registered as a child in  ICompositeSample
+
+    An interface for classes representing a rotation.
+
+    C++ includes: Rotations.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IRotation, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IRotation, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+
+    def createRotation(transform):
+        """createRotation(Transform3D const & transform) -> IRotation"""
+        return _libBornAgainCore.IRotation_createRotation(transform)
+
+    if _newclass:
+        createRotation = staticmethod(createRotation)
+    __swig_getmethods__["createRotation"] = lambda x: createRotation
+    __swig_destroy__ = _libBornAgainCore.delete_IRotation
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IRotation self) -> IRotation
+
+        virtual IRotation* IRotation::clone() const =0
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.IRotation_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(IRotation self) -> IRotation
+
+        IRotation* IRotation::cloneInvertB() const final
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.IRotation_cloneInvertB(self)
+
+
+    def createInverse(self):
+        """
+        createInverse(IRotation self) -> IRotation
+
+        virtual IRotation* IRotation::createInverse() const =0
+
+        Returns a new  IRotation object that is the current object's inverse. 
+
+        """
+        return _libBornAgainCore.IRotation_createInverse(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(IRotation self, ISampleVisitor visitor)
+
+        void IRotation::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.IRotation_accept(self, visitor)
+
+
+    def getTransform3D(self):
+        """
+        getTransform3D(IRotation self) -> Transform3D
+
+        virtual Transform3D IRotation::getTransform3D() const =0
+
+        Returns transformation. 
+
+        """
+        return _libBornAgainCore.IRotation_getTransform3D(self)
+
+
+    def isIdentity(self):
+        """
+        isIdentity(IRotation self) -> bool
+
+        bool IRotation::isIdentity() const
+
+        Returns true if roation matrix is identity matrix (no rotations) 
+
+        """
+        return _libBornAgainCore.IRotation_isIdentity(self)
+
+IRotation_swigregister = _libBornAgainCore.IRotation_swigregister
+IRotation_swigregister(IRotation)
+
+def IRotation_createRotation(transform):
+    """IRotation_createRotation(Transform3D const & transform) -> IRotation"""
+    return _libBornAgainCore.IRotation_createRotation(transform)
+
+
+def CreateProduct(left, right):
+    """
+    CreateProduct(IRotation left, IRotation right) -> IRotation
+
+    BA_CORE_API_ IRotation* CreateProduct(const IRotation &left, const IRotation &right)
+
+    Returns concatenated rotation (first right, then left). 
+
+    """
+    return _libBornAgainCore.CreateProduct(left, right)
+class RotationX(IRotation):
+    """Proxy of C++ RotationX class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IRotation]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, RotationX, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IRotation]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, RotationX, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, angle):
+        """
+        __init__(RotationX self, double angle) -> RotationX
+
+        RotationX::RotationX(double angle)
+
+        """
+        this = _libBornAgainCore.new_RotationX(angle)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(RotationX self) -> RotationX
+
+        RotationX* RotationX::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.RotationX_clone(self)
+
+
+    def createInverse(self):
+        """
+        createInverse(RotationX self) -> RotationX
+
+        RotationX* RotationX::createInverse() const
+
+        Returns a new  IRotation object that is the current object's inverse. 
+
+        """
+        return _libBornAgainCore.RotationX_createInverse(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(RotationX self, ISampleVisitor visitor)
+
+        void RotationX::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.RotationX_accept(self, visitor)
+
+
+    def getAngle(self):
+        """
+        getAngle(RotationX self) -> double
+
+        double RotationX::getAngle() const 
+
+        """
+        return _libBornAgainCore.RotationX_getAngle(self)
+
+
+    def getTransform3D(self):
+        """
+        getTransform3D(RotationX self) -> Transform3D
+
+        Transform3D RotationX::getTransform3D() const
+
+        Returns transformation. 
+
+        """
+        return _libBornAgainCore.RotationX_getTransform3D(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_RotationX
+    __del__ = lambda self: None
+RotationX_swigregister = _libBornAgainCore.RotationX_swigregister
+RotationX_swigregister(RotationX)
+
+class RotationY(IRotation):
+    """Proxy of C++ RotationY class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IRotation]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, RotationY, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IRotation]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, RotationY, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, angle):
+        """
+        __init__(RotationY self, double angle) -> RotationY
+
+        RotationY::RotationY(double angle)
+
+        """
+        this = _libBornAgainCore.new_RotationY(angle)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(RotationY self) -> RotationY
+
+        RotationY* RotationY::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.RotationY_clone(self)
+
+
+    def createInverse(self):
+        """
+        createInverse(RotationY self) -> RotationY
+
+        RotationY* RotationY::createInverse() const
+
+        Returns a new  IRotation object that is the current object's inverse. 
+
+        """
+        return _libBornAgainCore.RotationY_createInverse(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(RotationY self, ISampleVisitor visitor)
+
+        void RotationY::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.RotationY_accept(self, visitor)
+
+
+    def getAngle(self):
+        """
+        getAngle(RotationY self) -> double
+
+        double RotationY::getAngle() const 
+
+        """
+        return _libBornAgainCore.RotationY_getAngle(self)
+
+
+    def getTransform3D(self):
+        """
+        getTransform3D(RotationY self) -> Transform3D
+
+        Transform3D RotationY::getTransform3D() const
+
+        Returns transformation. 
+
+        """
+        return _libBornAgainCore.RotationY_getTransform3D(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_RotationY
+    __del__ = lambda self: None
+RotationY_swigregister = _libBornAgainCore.RotationY_swigregister
+RotationY_swigregister(RotationY)
+
+class RotationZ(IRotation):
+    """Proxy of C++ RotationZ class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IRotation]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, RotationZ, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IRotation]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, RotationZ, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, angle=0.0):
+        """
+        __init__(RotationZ self, double angle=0.0) -> RotationZ
+        __init__(RotationZ self) -> RotationZ
+
+        RotationZ::RotationZ(double angle=0.0)
+
+        """
+        this = _libBornAgainCore.new_RotationZ(angle)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(RotationZ self) -> RotationZ
+
+        RotationZ* RotationZ::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.RotationZ_clone(self)
+
+
+    def createInverse(self):
+        """
+        createInverse(RotationZ self) -> RotationZ
+
+        RotationZ* RotationZ::createInverse() const
+
+        Returns a new  IRotation object that is the current object's inverse. 
+
+        """
+        return _libBornAgainCore.RotationZ_createInverse(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(RotationZ self, ISampleVisitor visitor)
+
+        void RotationZ::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.RotationZ_accept(self, visitor)
+
+
+    def getAngle(self):
+        """
+        getAngle(RotationZ self) -> double
+
+        double RotationZ::getAngle() const 
+
+        """
+        return _libBornAgainCore.RotationZ_getAngle(self)
+
+
+    def getTransform3D(self):
+        """
+        getTransform3D(RotationZ self) -> Transform3D
+
+        Transform3D RotationZ::getTransform3D() const
+
+        Returns transformation. 
+
+        """
+        return _libBornAgainCore.RotationZ_getTransform3D(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_RotationZ
+    __del__ = lambda self: None
+RotationZ_swigregister = _libBornAgainCore.RotationZ_swigregister
+RotationZ_swigregister(RotationZ)
+
+class RotationEuler(IRotation):
+    """Proxy of C++ RotationEuler class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IRotation]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, RotationEuler, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IRotation]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, RotationEuler, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, alpha, beta, gamma):
+        """
+        __init__(RotationEuler self, double alpha, double beta, double gamma) -> RotationEuler
+
+        RotationEuler::RotationEuler(double alpha, double beta, double gamma)
+
+        """
+        this = _libBornAgainCore.new_RotationEuler(alpha, beta, gamma)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(RotationEuler self) -> RotationEuler
+
+        RotationEuler* RotationEuler::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.RotationEuler_clone(self)
+
+
+    def createInverse(self):
+        """
+        createInverse(RotationEuler self) -> IRotation
+
+        IRotation * RotationEuler::createInverse() const
+
+        Returns a new  IRotation object that is the current object's inverse. 
+
+        """
+        return _libBornAgainCore.RotationEuler_createInverse(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(RotationEuler self, ISampleVisitor visitor)
+
+        void RotationEuler::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.RotationEuler_accept(self, visitor)
+
+
+    def getAlpha(self):
+        """
+        getAlpha(RotationEuler self) -> double
+
+        double RotationEuler::getAlpha() const 
+
+        """
+        return _libBornAgainCore.RotationEuler_getAlpha(self)
+
+
+    def getBeta(self):
+        """
+        getBeta(RotationEuler self) -> double
+
+        double RotationEuler::getBeta() const 
+
+        """
+        return _libBornAgainCore.RotationEuler_getBeta(self)
+
+
+    def getGamma(self):
+        """
+        getGamma(RotationEuler self) -> double
+
+        double RotationEuler::getGamma() const 
+
+        """
+        return _libBornAgainCore.RotationEuler_getGamma(self)
+
+
+    def getTransform3D(self):
+        """
+        getTransform3D(RotationEuler self) -> Transform3D
+
+        Transform3D RotationEuler::getTransform3D() const
+
+        Returns transformation. 
+
+        """
+        return _libBornAgainCore.RotationEuler_getTransform3D(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_RotationEuler
+    __del__ = lambda self: None
+RotationEuler_swigregister = _libBornAgainCore.RotationEuler_swigregister
+RotationEuler_swigregister(RotationEuler)
+
+class ISelectionRule(_object):
+    """
+
+
+    Pure virtual base class for selection rules.
+
+    C++ includes: ISelectionRule.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ISelectionRule, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, ISelectionRule, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_ISelectionRule
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ISelectionRule self) -> ISelectionRule
+
+        virtual ISelectionRule* ISelectionRule::clone() const =0
+
+        """
+        return _libBornAgainCore.ISelectionRule_clone(self)
+
+
+    def coordinateSelected(self, coordinate):
+        """
+        coordinateSelected(ISelectionRule self, ivector_t const & coordinate) -> bool
+
+        virtual bool ISelectionRule::coordinateSelected(const ivector_t &coordinate) const =0
+
+        """
+        return _libBornAgainCore.ISelectionRule_coordinateSelected(self, coordinate)
+
+ISelectionRule_swigregister = _libBornAgainCore.ISelectionRule_swigregister
+ISelectionRule_swigregister(ISelectionRule)
+
+class SimpleSelectionRule(ISelectionRule):
+    """
+
+
+    Selection rule (v*q)modulus!=0, defined by vector v(a,b,c) and modulus.
+
+    C++ includes: ISelectionRule.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISelectionRule]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SimpleSelectionRule, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISelectionRule]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SimpleSelectionRule, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, a, b, c, modulus):
+        """
+        __init__(SimpleSelectionRule self, int a, int b, int c, int modulus) -> SimpleSelectionRule
+
+        SimpleSelectionRule::SimpleSelectionRule(int a, int b, int c, int modulus)
+
+        """
+        this = _libBornAgainCore.new_SimpleSelectionRule(a, b, c, modulus)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_SimpleSelectionRule
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(SimpleSelectionRule self) -> SimpleSelectionRule
+
+        SimpleSelectionRule * SimpleSelectionRule::clone() const 
+
+        """
+        return _libBornAgainCore.SimpleSelectionRule_clone(self)
+
+
+    def coordinateSelected(self, coordinate):
+        """
+        coordinateSelected(SimpleSelectionRule self, ivector_t const & coordinate) -> bool
+
+        bool SimpleSelectionRule::coordinateSelected(const ivector_t &coordinate) const 
+
+        """
+        return _libBornAgainCore.SimpleSelectionRule_coordinateSelected(self, coordinate)
+
+SimpleSelectionRule_swigregister = _libBornAgainCore.SimpleSelectionRule_swigregister
+SimpleSelectionRule_swigregister(SimpleSelectionRule)
+
+class Instrument(IParameterized):
+    """
+
+
+    Assembles beam, detector and their relative positions wrt the sample.
+
+    C++ includes: Instrument.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Instrument, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Instrument, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Instrument self) -> Instrument
+        __init__(Instrument self, Instrument other) -> Instrument
+
+        Instrument::Instrument(const Instrument &other)
+
+        """
+        this = _libBornAgainCore.new_Instrument(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_Instrument
+    __del__ = lambda self: None
+
+    def getBeam(self, *args):
+        """
+        getBeam(Instrument self) -> Beam
+        getBeam(Instrument self) -> Beam
+
+        const Beam& Instrument::getBeam() const 
+
+        """
+        return _libBornAgainCore.Instrument_getBeam(self, *args)
+
+
+    def setBeam(self, beam):
+        """
+        setBeam(Instrument self, Beam beam)
+
+        void Instrument::setBeam(const Beam &beam)
+
+        """
+        return _libBornAgainCore.Instrument_setBeam(self, beam)
+
+
+    def setBeamParameters(self, wavelength, alpha_i, phi_i):
+        """
+        setBeamParameters(Instrument self, double wavelength, double alpha_i, double phi_i)
+
+        void Instrument::setBeamParameters(double wavelength, double alpha_i, double phi_i)
+
+        Sets the beam wavelength and incoming angles. 
+
+        """
+        return _libBornAgainCore.Instrument_setBeamParameters(self, wavelength, alpha_i, phi_i)
+
+
+    def setBeamIntensity(self, intensity):
+        """
+        setBeamIntensity(Instrument self, double intensity)
+
+        void Instrument::setBeamIntensity(double intensity)
+
+        Sets the beam's intensity. 
+
+        """
+        return _libBornAgainCore.Instrument_setBeamIntensity(self, intensity)
+
+
+    def setBeamPolarization(self, bloch_vector):
+        """
+        setBeamPolarization(Instrument self, kvector_t bloch_vector)
+
+        void Instrument::setBeamPolarization(const kvector_t bloch_vector)
+
+        Sets the beam's polarization according to the given Bloch vector. 
+
+        """
+        return _libBornAgainCore.Instrument_setBeamPolarization(self, bloch_vector)
+
+
+    def getBeamIntensity(self):
+        """
+        getBeamIntensity(Instrument self) -> double
+
+        double Instrument::getBeamIntensity() const
+
+        Returns the beam's intensity. 
+
+        """
+        return _libBornAgainCore.Instrument_getBeamIntensity(self)
+
+
+    def getDetector(self, *args):
+        """
+        getDetector(Instrument self) -> IDetector2D
+        getDetector(Instrument self) -> IDetector2D
+
+        IDetector2D * Instrument::getDetector()
+
+        """
+        return _libBornAgainCore.Instrument_getDetector(self, *args)
+
+
+    def getDetectorMask(self):
+        """
+        getDetectorMask(Instrument self) -> DetectorMask
+
+        const DetectorMask * Instrument::getDetectorMask() const 
+
+        """
+        return _libBornAgainCore.Instrument_getDetectorMask(self)
+
+
+    def getDetectorAxis(self, index):
+        """
+        getDetectorAxis(Instrument self, size_t index) -> IAxis
+
+        const IAxis & Instrument::getDetectorAxis(size_t index) const
+
+        Returns a detector axis. 
+
+        """
+        return _libBornAgainCore.Instrument_getDetectorAxis(self, index)
+
+
+    def getDetectorDimension(self):
+        """
+        getDetectorDimension(Instrument self) -> size_t
+
+        size_t Instrument::getDetectorDimension() const
+
+        Returns the detector's dimension. 
+
+        """
+        return _libBornAgainCore.Instrument_getDetectorDimension(self)
+
+
+    def setDetector(self, detector):
+        """
+        setDetector(Instrument self, IDetector2D detector)
+
+        void Instrument::setDetector(const IDetector2D &detector)
+
+        Sets the detector (axes can be overwritten later) 
+
+        """
+        return _libBornAgainCore.Instrument_setDetector(self, detector)
+
+
+    def setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max):
+        """
+        setDetectorParameters(Instrument self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+        void Instrument::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+        Sets detector parameters using angle ranges. 
+
+        """
+        return _libBornAgainCore.Instrument_setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max)
+
+
+    def setDetectorAxes(self, axis0, axis1):
+        """
+        setDetectorAxes(Instrument self, IAxis axis0, IAxis axis1)
+
+        void Instrument::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
+
+        Sets detector parameters using axes. 
+
+        """
+        return _libBornAgainCore.Instrument_setDetectorAxes(self, axis0, axis1)
+
+
+    def setDetectorResolutionFunction(self, p_resolution_function):
+        """
+        setDetectorResolutionFunction(Instrument self, IResolutionFunction2D p_resolution_function)
+
+        void Instrument::setDetectorResolutionFunction(const IResolutionFunction2D &p_resolution_function)
+
+        """
+        return _libBornAgainCore.Instrument_setDetectorResolutionFunction(self, p_resolution_function)
+
+
+    def setAnalyzerProperties(self, direction, efficiency, total_transmission):
+        """
+        setAnalyzerProperties(Instrument self, kvector_t direction, double efficiency, double total_transmission)
+
+        void Instrument::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)
+
+        Sets the polarization analyzer characteristics of the detector. 
+
+        """
+        return _libBornAgainCore.Instrument_setAnalyzerProperties(self, direction, efficiency, total_transmission)
+
+
+    def applyDetectorResolution(self, p_intensity_map):
+        """
+        applyDetectorResolution(Instrument self, IntensityData p_intensity_map)
+
+        void Instrument::applyDetectorResolution(OutputData< double > *p_intensity_map) const
+
+        apply the detector resolution to the given intensity map 
+
+        """
+        return _libBornAgainCore.Instrument_applyDetectorResolution(self, p_intensity_map)
+
+
+    def createDetectorIntensity(self, *args):
+        """
+        createDetectorIntensity(Instrument self, std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements, IDetector2D::EAxesUnits units) -> IntensityData
+        createDetectorIntensity(Instrument self, std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements) -> IntensityData
+
+        OutputData< double > * Instrument::createDetectorIntensity(const std::vector< SimulationElement > &elements, IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const
+
+        Returns new intensity map with detector resolution applied and axes in requested units. 
+
+        """
+        return _libBornAgainCore.Instrument_createDetectorIntensity(self, *args)
+
+
+    def createDetectorMap(self, *args):
+        """
+        createDetectorMap(Instrument self, IDetector2D::EAxesUnits units) -> IntensityData
+        createDetectorMap(Instrument self) -> IntensityData
+
+        OutputData< double > * Instrument::createDetectorMap(IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const
+
+        Returns empty detector map in given axes units. 
+
+        """
+        return _libBornAgainCore.Instrument_createDetectorMap(self, *args)
+
+
+    def initDetector(self):
+        """
+        initDetector(Instrument self)
+
+        void Instrument::initDetector()
+
+        init detector with beam settings 
+
+        """
+        return _libBornAgainCore.Instrument_initDetector(self)
+
+Instrument_swigregister = _libBornAgainCore.Instrument_swigregister
+Instrument_swigregister(Instrument)
+
+
+def getRelativeDifference(*args):
+    """
+    getRelativeDifference(IntensityData dat, IntensityData ref) -> double
+    getRelativeDifference(IHistogram dat, IHistogram ref) -> double
+
+    BA_CORE_API_ double IntensityDataFunctions::getRelativeDifference(const IHistogram &dat, const IHistogram &ref)
+
+    """
+    return _libBornAgainCore.getRelativeDifference(*args)
+
+def createRelativeDifferenceData(data, reference):
+    """
+    createRelativeDifferenceData(IntensityData data, IntensityData reference) -> IntensityData
+
+    BA_CORE_API_ OutputData<double>* IntensityDataFunctions::createRelativeDifferenceData(const OutputData< double > &data, const OutputData< double > &reference)
+
+    """
+    return _libBornAgainCore.createRelativeDifferenceData(data, reference)
+
+def createClippedDataSet(origin, x1, y1, x2, y2):
+    """
+    createClippedDataSet(IntensityData origin, double x1, double y1, double x2, double y2) -> IntensityData
+
+    BA_CORE_API_ OutputData<double>* IntensityDataFunctions::createClippedDataSet(const OutputData< double > &origin, double x1, double y1, double x2, double y2)
+
+    Returns new IntensityData objects which axes clipped to represent the specified rectangle 
+
+    """
+    return _libBornAgainCore.createClippedDataSet(origin, x1, y1, x2, y2)
+
+def applyDetectorResolution(origin, resolution_function):
+    """
+    applyDetectorResolution(IntensityData origin, IResolutionFunction2D resolution_function) -> IntensityData
+
+    BA_CORE_API_ OutputData<double>* IntensityDataFunctions::applyDetectorResolution(const OutputData< double > &origin, const IResolutionFunction2D &resolution_function)
+
+    Applies detector resolution function and returns new IntensityData object. 
+
+    """
+    return _libBornAgainCore.applyDetectorResolution(origin, resolution_function)
+
+def coordinateToBinf(*args):
+    """
+    coordinateToBinf(double coordinate, IAxis axis) -> double
+    coordinateToBinf(double & x, double & y, IntensityData data)
+
+    BA_CORE_API_ void IntensityDataFunctions::coordinateToBinf(double &x, double &y, const OutputData< double > &data)
+
+    Transform x,y coordinate from  OutputData axes coordinates to bin-fraction-coordinates 
+
+    """
+    return _libBornAgainCore.coordinateToBinf(*args)
+
+def coordinateFromBinf(*args):
+    """
+    coordinateFromBinf(double value, IAxis axis) -> double
+    coordinateFromBinf(double & x, double & y, IntensityData data)
+
+    BA_CORE_API_ void IntensityDataFunctions::coordinateFromBinf(double &x, double &y, const OutputData< double > &data)
+
+    Transform x,y coordinate from bin-fraction-coordinates to  OutputData's axes coordinates 
+
+    """
+    return _libBornAgainCore.coordinateFromBinf(*args)
+class IntensityDataIOFactory(_object):
+    """
+
+
+    Provides users with possibility to read and write IntensityData from/to files in different format. Type of the file will be deduced from file name. *.txt - ASCII file with 2D array [nrow][ncol], layout as in numpy. *.int - BornAgain internal ASCII format. *.tif - 32-bits tiff file. If file name ends woth "*.gz" or "*.bz2" the file will be zipped on the fly using appropriate algorithm.
+
+    Usage:
+
+    C++ includes: IntensityDataIOFactory.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityDataIOFactory, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityDataIOFactory, name)
+    __repr__ = _swig_repr
+
+    def readOutputData(file_name):
+        """readOutputData(std::string const & file_name) -> IntensityData"""
+        return _libBornAgainCore.IntensityDataIOFactory_readOutputData(file_name)
+
+    if _newclass:
+        readOutputData = staticmethod(readOutputData)
+    __swig_getmethods__["readOutputData"] = lambda x: readOutputData
+
+    def readIntensityData(file_name):
+        """readIntensityData(std::string const & file_name) -> IHistogram"""
+        return _libBornAgainCore.IntensityDataIOFactory_readIntensityData(file_name)
+
+    if _newclass:
+        readIntensityData = staticmethod(readIntensityData)
+    __swig_getmethods__["readIntensityData"] = lambda x: readIntensityData
+
+    def writeOutputData(data, file_name):
+        """writeOutputData(IntensityData data, std::string const & file_name)"""
+        return _libBornAgainCore.IntensityDataIOFactory_writeOutputData(data, file_name)
+
+    if _newclass:
+        writeOutputData = staticmethod(writeOutputData)
+    __swig_getmethods__["writeOutputData"] = lambda x: writeOutputData
+
+    def writeIntensityData(histogram, file_name):
+        """writeIntensityData(IHistogram histogram, std::string const & file_name)"""
+        return _libBornAgainCore.IntensityDataIOFactory_writeIntensityData(histogram, file_name)
+
+    if _newclass:
+        writeIntensityData = staticmethod(writeIntensityData)
+    __swig_getmethods__["writeIntensityData"] = lambda x: writeIntensityData
+
+    def __init__(self):
+        """
+        __init__(IntensityDataIOFactory self) -> IntensityDataIOFactory
+
+
+
+        Provides users with possibility to read and write IntensityData from/to files in different format. Type of the file will be deduced from file name. *.txt - ASCII file with 2D array [nrow][ncol], layout as in numpy. *.int - BornAgain internal ASCII format. *.tif - 32-bits tiff file. If file name ends woth "*.gz" or "*.bz2" the file will be zipped on the fly using appropriate algorithm.
+
+        Usage:
+
+        C++ includes: IntensityDataIOFactory.h
+
+        """
+        this = _libBornAgainCore.new_IntensityDataIOFactory()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IntensityDataIOFactory
+    __del__ = lambda self: None
+IntensityDataIOFactory_swigregister = _libBornAgainCore.IntensityDataIOFactory_swigregister
+IntensityDataIOFactory_swigregister(IntensityDataIOFactory)
+
+def IntensityDataIOFactory_readOutputData(file_name):
+    """IntensityDataIOFactory_readOutputData(std::string const & file_name) -> IntensityData"""
+    return _libBornAgainCore.IntensityDataIOFactory_readOutputData(file_name)
+
+def IntensityDataIOFactory_readIntensityData(file_name):
+    """IntensityDataIOFactory_readIntensityData(std::string const & file_name) -> IHistogram"""
+    return _libBornAgainCore.IntensityDataIOFactory_readIntensityData(file_name)
+
+def IntensityDataIOFactory_writeOutputData(data, file_name):
+    """IntensityDataIOFactory_writeOutputData(IntensityData data, std::string const & file_name)"""
+    return _libBornAgainCore.IntensityDataIOFactory_writeOutputData(data, file_name)
+
+def IntensityDataIOFactory_writeIntensityData(histogram, file_name):
+    """IntensityDataIOFactory_writeIntensityData(IHistogram histogram, std::string const & file_name)"""
+    return _libBornAgainCore.IntensityDataIOFactory_writeIntensityData(histogram, file_name)
+
+class InterferenceFunction1DLattice(IInterferenceFunction):
+    """
+
+
+    Interference function of 1D lattice.
+
+    C++ includes: InterferenceFunction1DLattice.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, InterferenceFunction1DLattice, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, InterferenceFunction1DLattice, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length, xi):
+        """
+        __init__(InterferenceFunction1DLattice self, double length, double xi) -> InterferenceFunction1DLattice
+
+        InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, double xi)
+
+        Parameters:
+        -----------
+
+        length: 
+         Lattice length
+
+        xi: 
+        rotation of lattice with respect to x-axis 
+
+        """
+        this = _libBornAgainCore.new_InterferenceFunction1DLattice(length, xi)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_InterferenceFunction1DLattice
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(InterferenceFunction1DLattice self) -> InterferenceFunction1DLattice
+
+        InterferenceFunction1DLattice * InterferenceFunction1DLattice::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction1DLattice_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(InterferenceFunction1DLattice self, ISampleVisitor visitor)
+
+        void InterferenceFunction1DLattice::accept(ISampleVisitor *visitor) const final
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction1DLattice_accept(self, visitor)
+
+
+    def setDecayFunction(self, pdf):
+        """
+        setDecayFunction(InterferenceFunction1DLattice self, IFTDecayFunction1D pdf)
+
+        void InterferenceFunction1DLattice::setDecayFunction(const IFTDecayFunction1D &pdf)
+
+        """
+        return _libBornAgainCore.InterferenceFunction1DLattice_setDecayFunction(self, pdf)
+
+
+    def getLatticeParameters(self):
+        """
+        getLatticeParameters(InterferenceFunction1DLattice self) -> Lattice1DParameters
+
+        Lattice1DParameters InterferenceFunction1DLattice::getLatticeParameters() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction1DLattice_getLatticeParameters(self)
+
+
+    def getDecayFunction(self):
+        """
+        getDecayFunction(InterferenceFunction1DLattice self) -> IFTDecayFunction1D
+
+        const IFTDecayFunction1D* InterferenceFunction1DLattice::getDecayFunction() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction1DLattice_getDecayFunction(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(InterferenceFunction1DLattice self, kvector_t q) -> double
+
+        double InterferenceFunction1DLattice::evaluate(const kvector_t q) const final
+
+        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+
+        """
+        return _libBornAgainCore.InterferenceFunction1DLattice_evaluate(self, q)
+
+InterferenceFunction1DLattice_swigregister = _libBornAgainCore.InterferenceFunction1DLattice_swigregister
+InterferenceFunction1DLattice_swigregister(InterferenceFunction1DLattice)
+
+class InterferenceFunctionRadialParaCrystal(IInterferenceFunction):
+    """
+
+
+    Interference function of radial paracrystal.
+
+    C++ includes: InterferenceFunctionRadialParaCrystal.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, InterferenceFunctionRadialParaCrystal, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, InterferenceFunctionRadialParaCrystal, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, peak_distance, damping_length=0.0):
+        """
+        __init__(InterferenceFunctionRadialParaCrystal self, double peak_distance, double damping_length=0.0) -> InterferenceFunctionRadialParaCrystal
+        __init__(InterferenceFunctionRadialParaCrystal self, double peak_distance) -> InterferenceFunctionRadialParaCrystal
+
+        InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(double peak_distance, double damping_length=0.0)
+
+        """
+        this = _libBornAgainCore.new_InterferenceFunctionRadialParaCrystal(peak_distance, damping_length)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(InterferenceFunctionRadialParaCrystal self) -> InterferenceFunctionRadialParaCrystal
+
+        InterferenceFunctionRadialParaCrystal * InterferenceFunctionRadialParaCrystal::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(InterferenceFunctionRadialParaCrystal self, ISampleVisitor visitor)
+
+        void InterferenceFunctionRadialParaCrystal::accept(ISampleVisitor *visitor) const final
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_accept(self, visitor)
+
+
+    def to_str(self, indent=0):
+        """
+        to_str(InterferenceFunctionRadialParaCrystal self, int indent=0) -> std::string
+        to_str(InterferenceFunctionRadialParaCrystal self) -> std::string
+
+        std::string InterferenceFunctionRadialParaCrystal::to_str(int indent=0) const final
+
+        Returns textual representation of this and its descendants. 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_to_str(self, indent)
+
+
+    def setKappa(self, kappa):
+        """
+        setKappa(InterferenceFunctionRadialParaCrystal self, double kappa)
+
+        void InterferenceFunctionRadialParaCrystal::setKappa(double kappa)
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_setKappa(self, kappa)
+
+
+    def getKappa(self):
+        """
+        getKappa(InterferenceFunctionRadialParaCrystal self) -> double
+
+        double InterferenceFunctionRadialParaCrystal::getKappa() const final
+
+        Retrieves the size-distance coupling constant (default 0.0) 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_getKappa(self)
+
+
+    def setDomainSize(self, size):
+        """
+        setDomainSize(InterferenceFunctionRadialParaCrystal self, double size)
+
+        void InterferenceFunctionRadialParaCrystal::setDomainSize(double size)
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_setDomainSize(self, size)
+
+
+    def getDomainSize(self):
+        """
+        getDomainSize(InterferenceFunctionRadialParaCrystal self) -> double
+
+        double InterferenceFunctionRadialParaCrystal::getDomainSize() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_getDomainSize(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(InterferenceFunctionRadialParaCrystal self, kvector_t q) -> double
+
+        double InterferenceFunctionRadialParaCrystal::evaluate(const kvector_t q) const final
+
+        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_evaluate(self, q)
+
+
+    def FTPDF(self, qpar):
+        """
+        FTPDF(InterferenceFunctionRadialParaCrystal self, double qpar) -> complex_t
+
+        complex_t InterferenceFunctionRadialParaCrystal::FTPDF(double qpar) const 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_FTPDF(self, qpar)
+
+
+    def setProbabilityDistribution(self, pdf):
+        """
+        setProbabilityDistribution(InterferenceFunctionRadialParaCrystal self, IFTDistribution1D pdf)
+
+        void InterferenceFunctionRadialParaCrystal::setProbabilityDistribution(const IFTDistribution1D &pdf)
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_setProbabilityDistribution(self, pdf)
+
+
+    def getProbabilityDistribution(self):
+        """
+        getProbabilityDistribution(InterferenceFunctionRadialParaCrystal self) -> IFTDistribution1D
+
+        const IFTDistribution1D* InterferenceFunctionRadialParaCrystal::getProbabilityDistribution() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_getProbabilityDistribution(self)
+
+
+    def getPeakDistance(self):
+        """
+        getPeakDistance(InterferenceFunctionRadialParaCrystal self) -> double
+
+        double InterferenceFunctionRadialParaCrystal::getPeakDistance() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_getPeakDistance(self)
+
+
+    def getDampingLength(self):
+        """
+        getDampingLength(InterferenceFunctionRadialParaCrystal self) -> double
+
+        double InterferenceFunctionRadialParaCrystal::getDampingLength() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionRadialParaCrystal_getDampingLength(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_InterferenceFunctionRadialParaCrystal
+    __del__ = lambda self: None
+InterferenceFunctionRadialParaCrystal_swigregister = _libBornAgainCore.InterferenceFunctionRadialParaCrystal_swigregister
+InterferenceFunctionRadialParaCrystal_swigregister(InterferenceFunctionRadialParaCrystal)
+
+class InterferenceFunction2DLattice(IInterferenceFunction):
+    """
+
+
+    Interference function of 2D lattice.
+
+    C++ includes: InterferenceFunction2DLattice.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, InterferenceFunction2DLattice, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, InterferenceFunction2DLattice, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length_1, length_2, angle, xi=0.0):
+        """
+        __init__(InterferenceFunction2DLattice self, double length_1, double length_2, double angle, double xi=0.0) -> InterferenceFunction2DLattice
+        __init__(InterferenceFunction2DLattice self, double length_1, double length_2, double angle) -> InterferenceFunction2DLattice
+
+        InterferenceFunction2DLattice::InterferenceFunction2DLattice(double length_1, double length_2, double angle, double xi=0.0)
+
+        Parameters:
+        -----------
+
+        length_1: 
+         Lattice length 1
+
+        length_2: 
+         Lattice length 2
+
+        angle: 
+        angle between lattice vectors
+
+        xi: 
+        rotation of lattice with respect to x-axis 
+
+        """
+        this = _libBornAgainCore.new_InterferenceFunction2DLattice(length_1, length_2, angle, xi)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_InterferenceFunction2DLattice
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(InterferenceFunction2DLattice self) -> InterferenceFunction2DLattice
+
+        InterferenceFunction2DLattice * InterferenceFunction2DLattice::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(InterferenceFunction2DLattice self, ISampleVisitor visitor)
+
+        void InterferenceFunction2DLattice::accept(ISampleVisitor *visitor) const final
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_accept(self, visitor)
+
+
+    def createSquare(lattice_length, xi=0.0):
+        """
+        createSquare(double lattice_length, double xi=0.0) -> InterferenceFunction2DLattice
+        createSquare(double lattice_length) -> InterferenceFunction2DLattice
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_createSquare(lattice_length, xi)
+
+    if _newclass:
+        createSquare = staticmethod(createSquare)
+    __swig_getmethods__["createSquare"] = lambda x: createSquare
+
+    def createHexagonal(lattice_length, xi=0.0):
+        """
+        createHexagonal(double lattice_length, double xi=0.0) -> InterferenceFunction2DLattice
+        createHexagonal(double lattice_length) -> InterferenceFunction2DLattice
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_createHexagonal(lattice_length, xi)
+
+    if _newclass:
+        createHexagonal = staticmethod(createHexagonal)
+    __swig_getmethods__["createHexagonal"] = lambda x: createHexagonal
+
+    def setDecayFunction(self, pdf):
+        """
+        setDecayFunction(InterferenceFunction2DLattice self, IFTDecayFunction2D pdf)
+
+        void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D &pdf)
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_setDecayFunction(self, pdf)
+
+
+    def getDecayFunction(self):
+        """
+        getDecayFunction(InterferenceFunction2DLattice self) -> IFTDecayFunction2D
+
+        const IFTDecayFunction2D* InterferenceFunction2DLattice::getDecayFunction() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_getDecayFunction(self)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(InterferenceFunction2DLattice self, kvector_t q) -> double
+
+        double InterferenceFunction2DLattice::evaluate(const kvector_t q) const final
+
+        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_evaluate(self, q)
+
+
+    def getLatticeParameters(self):
+        """
+        getLatticeParameters(InterferenceFunction2DLattice self) -> Lattice2DParameters
+
+        Lattice2DParameters InterferenceFunction2DLattice::getLatticeParameters() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_getLatticeParameters(self)
+
+
+    def getParticleDensity(self):
+        """
+        getParticleDensity(InterferenceFunction2DLattice self) -> double
+
+        double InterferenceFunction2DLattice::getParticleDensity() const final
+
+        Returns the particle density associated with this 2d lattice. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DLattice_getParticleDensity(self)
+
+InterferenceFunction2DLattice_swigregister = _libBornAgainCore.InterferenceFunction2DLattice_swigregister
+InterferenceFunction2DLattice_swigregister(InterferenceFunction2DLattice)
+
+def InterferenceFunction2DLattice_createSquare(lattice_length, xi=0.0):
+    """
+    createSquare(double lattice_length, double xi=0.0) -> InterferenceFunction2DLattice
+    InterferenceFunction2DLattice_createSquare(double lattice_length) -> InterferenceFunction2DLattice
+    """
+    return _libBornAgainCore.InterferenceFunction2DLattice_createSquare(lattice_length, xi)
+
+def InterferenceFunction2DLattice_createHexagonal(lattice_length, xi=0.0):
+    """
+    createHexagonal(double lattice_length, double xi=0.0) -> InterferenceFunction2DLattice
+    InterferenceFunction2DLattice_createHexagonal(double lattice_length) -> InterferenceFunction2DLattice
+    """
+    return _libBornAgainCore.InterferenceFunction2DLattice_createHexagonal(lattice_length, xi)
+
+class InterferenceFunction2DParaCrystal(IInterferenceFunction):
+    """
+
+
+    Interference function of 2D paracrystal.
+
+    C++ includes: InterferenceFunction2DParaCrystal.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, InterferenceFunction2DParaCrystal, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, InterferenceFunction2DParaCrystal, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, length_1, length_2, alpha_lattice, xi=0.0, damping_length=0.0):
+        """
+        __init__(InterferenceFunction2DParaCrystal self, double length_1, double length_2, double alpha_lattice, double xi=0.0, double damping_length=0.0) -> InterferenceFunction2DParaCrystal
+        __init__(InterferenceFunction2DParaCrystal self, double length_1, double length_2, double alpha_lattice, double xi=0.0) -> InterferenceFunction2DParaCrystal
+        __init__(InterferenceFunction2DParaCrystal self, double length_1, double length_2, double alpha_lattice) -> InterferenceFunction2DParaCrystal
+
+        InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha_lattice, double xi=0.0, double damping_length=0.0)
+
+        Parameters:
+        -----------
+
+        length_1: 
+        Length of first lattice basis vector.
+
+        length_2: 
+        Length of second lattice basis vector.
+
+        alpha_lattice: 
+        Angle between the lattice basis vectors.
+
+        xi: 
+        Angle between first basis vector and the x-axis of incoming beam.
+
+        damping_length: 
+        Damping length for removing delta function singularity at q=0. 
+
+        """
+        this = _libBornAgainCore.new_InterferenceFunction2DParaCrystal(length_1, length_2, alpha_lattice, xi, damping_length)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_InterferenceFunction2DParaCrystal
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(InterferenceFunction2DParaCrystal self) -> InterferenceFunction2DParaCrystal
+
+        InterferenceFunction2DParaCrystal * InterferenceFunction2DParaCrystal::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(InterferenceFunction2DParaCrystal self, ISampleVisitor visitor)
+
+        void InterferenceFunction2DParaCrystal::accept(ISampleVisitor *visitor) const final
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_accept(self, visitor)
+
+
+    def to_str(self, indent=0):
+        """
+        to_str(InterferenceFunction2DParaCrystal self, int indent=0) -> std::string
+        to_str(InterferenceFunction2DParaCrystal self) -> std::string
+
+        std::string InterferenceFunction2DParaCrystal::to_str(int indent=0) const final
+
+        Returns textual representation of this and its descendants. 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_to_str(self, indent)
+
+
+    def createSquare(peak_distance, damping_length=0.0, domain_size_1=0.0, domain_size_2=0.0):
+        """
+        createSquare(double peak_distance, double damping_length=0.0, double domain_size_1=0.0, double domain_size_2=0.0) -> InterferenceFunction2DParaCrystal
+        createSquare(double peak_distance, double damping_length=0.0, double domain_size_1=0.0) -> InterferenceFunction2DParaCrystal
+        createSquare(double peak_distance, double damping_length=0.0) -> InterferenceFunction2DParaCrystal
+        createSquare(double peak_distance) -> InterferenceFunction2DParaCrystal
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_createSquare(peak_distance, damping_length, domain_size_1, domain_size_2)
+
+    if _newclass:
+        createSquare = staticmethod(createSquare)
+    __swig_getmethods__["createSquare"] = lambda x: createSquare
+
+    def createHexagonal(peak_distance, damping_length=0.0, domain_size_1=0.0, domain_size_2=0.0):
+        """
+        createHexagonal(double peak_distance, double damping_length=0.0, double domain_size_1=0.0, double domain_size_2=0.0) -> InterferenceFunction2DParaCrystal
+        createHexagonal(double peak_distance, double damping_length=0.0, double domain_size_1=0.0) -> InterferenceFunction2DParaCrystal
+        createHexagonal(double peak_distance, double damping_length=0.0) -> InterferenceFunction2DParaCrystal
+        createHexagonal(double peak_distance) -> InterferenceFunction2DParaCrystal
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_createHexagonal(peak_distance, damping_length, domain_size_1, domain_size_2)
+
+    if _newclass:
+        createHexagonal = staticmethod(createHexagonal)
+    __swig_getmethods__["createHexagonal"] = lambda x: createHexagonal
+
+    def setDomainSizes(self, size_1, size_2):
+        """
+        setDomainSizes(InterferenceFunction2DParaCrystal self, double size_1, double size_2)
+
+        void InterferenceFunction2DParaCrystal::setDomainSizes(double size_1, double size_2)
+
+        Sets the sizes of coherence domains.
+
+        Parameters:
+        -----------
+
+        size_1: 
+        size in first lattice direction
+
+        size_2: 
+        size in second lattice direction 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_setDomainSizes(self, size_1, size_2)
+
+
+    def setProbabilityDistributions(self, pdf_1, pdf_2):
+        """
+        setProbabilityDistributions(InterferenceFunction2DParaCrystal self, IFTDistribution2D pdf_1, IFTDistribution2D pdf_2)
+
+        void InterferenceFunction2DParaCrystal::setProbabilityDistributions(const IFTDistribution2D &pdf_1, const IFTDistribution2D &pdf_2)
+
+        Sets the probability distributions (Fourier transformed) for the two lattice directions.
+
+        Parameters:
+        -----------
+
+        pdf_1: 
+        probability distribution in first lattice direction
+
+        pdf_2: 
+        probability distribution in second lattice direction 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_setProbabilityDistributions(self, pdf_1, pdf_2)
+
+
+    def evaluate(self, q):
+        """
+        evaluate(InterferenceFunction2DParaCrystal self, kvector_t q) -> double
+
+        double InterferenceFunction2DParaCrystal::evaluate(const kvector_t q) const final
+
+        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_evaluate(self, q)
+
+
+    def getDomainSizes(self):
+        """
+        getDomainSizes(InterferenceFunction2DParaCrystal self) -> vdouble1d_t
+
+        std::vector< double > InterferenceFunction2DParaCrystal::getDomainSizes() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_getDomainSizes(self)
+
+
+    def getProbabilityDistributions(self):
+        """
+        getProbabilityDistributions(InterferenceFunction2DParaCrystal self) -> std::vector< IFTDistribution2D const *,std::allocator< IFTDistribution2D const * > >
+
+        std::vector< const IFTDistribution2D * > InterferenceFunction2DParaCrystal::getProbabilityDistributions() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_getProbabilityDistributions(self)
+
+
+    def setIntegrationOverXi(self, integrate_xi):
+        """
+        setIntegrationOverXi(InterferenceFunction2DParaCrystal self, bool integrate_xi)
+
+        void InterferenceFunction2DParaCrystal::setIntegrationOverXi(bool integrate_xi)
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_setIntegrationOverXi(self, integrate_xi)
+
+
+    def getIntegrationOverXi(self):
+        """
+        getIntegrationOverXi(InterferenceFunction2DParaCrystal self) -> bool
+
+        bool InterferenceFunction2DParaCrystal::getIntegrationOverXi() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_getIntegrationOverXi(self)
+
+
+    def getDampingLength(self):
+        """
+        getDampingLength(InterferenceFunction2DParaCrystal self) -> double
+
+        double InterferenceFunction2DParaCrystal::getDampingLength() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_getDampingLength(self)
+
+
+    def getLatticeParameters(self):
+        """
+        getLatticeParameters(InterferenceFunction2DParaCrystal self) -> Lattice2DParameters
+
+        Lattice2DParameters InterferenceFunction2DParaCrystal::getLatticeParameters() const 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_getLatticeParameters(self)
+
+
+    def getParticleDensity(self):
+        """
+        getParticleDensity(InterferenceFunction2DParaCrystal self) -> double
+
+        double InterferenceFunction2DParaCrystal::getParticleDensity() const final
+
+        If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value 
+
+        """
+        return _libBornAgainCore.InterferenceFunction2DParaCrystal_getParticleDensity(self)
+
+InterferenceFunction2DParaCrystal_swigregister = _libBornAgainCore.InterferenceFunction2DParaCrystal_swigregister
+InterferenceFunction2DParaCrystal_swigregister(InterferenceFunction2DParaCrystal)
+
+def InterferenceFunction2DParaCrystal_createSquare(peak_distance, damping_length=0.0, domain_size_1=0.0, domain_size_2=0.0):
+    """
+    createSquare(double peak_distance, double damping_length=0.0, double domain_size_1=0.0, double domain_size_2=0.0) -> InterferenceFunction2DParaCrystal
+    createSquare(double peak_distance, double damping_length=0.0, double domain_size_1=0.0) -> InterferenceFunction2DParaCrystal
+    createSquare(double peak_distance, double damping_length=0.0) -> InterferenceFunction2DParaCrystal
+    InterferenceFunction2DParaCrystal_createSquare(double peak_distance) -> InterferenceFunction2DParaCrystal
+    """
+    return _libBornAgainCore.InterferenceFunction2DParaCrystal_createSquare(peak_distance, damping_length, domain_size_1, domain_size_2)
+
+def InterferenceFunction2DParaCrystal_createHexagonal(peak_distance, damping_length=0.0, domain_size_1=0.0, domain_size_2=0.0):
+    """
+    createHexagonal(double peak_distance, double damping_length=0.0, double domain_size_1=0.0, double domain_size_2=0.0) -> InterferenceFunction2DParaCrystal
+    createHexagonal(double peak_distance, double damping_length=0.0, double domain_size_1=0.0) -> InterferenceFunction2DParaCrystal
+    createHexagonal(double peak_distance, double damping_length=0.0) -> InterferenceFunction2DParaCrystal
+    InterferenceFunction2DParaCrystal_createHexagonal(double peak_distance) -> InterferenceFunction2DParaCrystal
+    """
+    return _libBornAgainCore.InterferenceFunction2DParaCrystal_createHexagonal(peak_distance, damping_length, domain_size_1, domain_size_2)
+
+class InterferenceFunctionNone(IInterferenceFunction):
+    """
+
+
+    Default interference function (i.e. absence of any interference).
+
+    C++ includes: InterferenceFunctionNone.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, InterferenceFunctionNone, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IInterferenceFunction]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, InterferenceFunctionNone, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(InterferenceFunctionNone self) -> InterferenceFunctionNone
+
+        InterferenceFunctionNone::InterferenceFunctionNone()
+
+        """
+        this = _libBornAgainCore.new_InterferenceFunctionNone()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(InterferenceFunctionNone self) -> InterferenceFunctionNone
+
+        InterferenceFunctionNone* InterferenceFunctionNone::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionNone_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(InterferenceFunctionNone self, ISampleVisitor visitor)
+
+        void InterferenceFunctionNone::accept(ISampleVisitor *visitor) const final
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionNone_accept(self, visitor)
+
+
+    def evaluate(self, arg2):
+        """
+        evaluate(InterferenceFunctionNone self, kvector_t arg2) -> double
+
+        double InterferenceFunctionNone::evaluate(const kvector_t) const final
+
+        Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) 
+
+        """
+        return _libBornAgainCore.InterferenceFunctionNone_evaluate(self, arg2)
+
+    __swig_destroy__ = _libBornAgainCore.delete_InterferenceFunctionNone
+    __del__ = lambda self: None
+InterferenceFunctionNone_swigregister = _libBornAgainCore.InterferenceFunctionNone_swigregister
+InterferenceFunctionNone_swigregister(InterferenceFunctionNone)
+
+class IPixelMap(_object):
+    """
+
+
+    Interface for a function that maps [0,1]x[0,1] to the kvectors in a pixel.
+
+    C++ includes: IPixelMap.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IPixelMap, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IPixelMap, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IPixelMap
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IPixelMap self) -> IPixelMap
+
+        virtual IPixelMap* IPixelMap::clone() const =0
+
+        """
+        return _libBornAgainCore.IPixelMap_clone(self)
+
+
+    def createZeroSizeMap(self, x, y):
+        """
+        createZeroSizeMap(IPixelMap self, double x, double y) -> IPixelMap
+
+        virtual IPixelMap* IPixelMap::createZeroSizeMap(double x, double y) const =0
+
+        """
+        return _libBornAgainCore.IPixelMap_createZeroSizeMap(self, x, y)
+
+
+    def getK(self, x, y, wavelength):
+        """
+        getK(IPixelMap self, double x, double y, double wavelength) -> kvector_t
+
+        virtual kvector_t IPixelMap::getK(double x, double y, double wavelength) const =0
+
+        """
+        return _libBornAgainCore.IPixelMap_getK(self, x, y, wavelength)
+
+
+    def getIntegrationFactor(self, x, y):
+        """
+        getIntegrationFactor(IPixelMap self, double x, double y) -> double
+
+        virtual double IPixelMap::getIntegrationFactor(double x, double y) const =0
+
+        """
+        return _libBornAgainCore.IPixelMap_getIntegrationFactor(self, x, y)
+
+
+    def getSolidAngle(self):
+        """
+        getSolidAngle(IPixelMap self) -> double
+
+        virtual double IPixelMap::getSolidAngle() const =0
+
+        """
+        return _libBornAgainCore.IPixelMap_getSolidAngle(self)
+
+IPixelMap_swigregister = _libBornAgainCore.IPixelMap_swigregister
+IPixelMap_swigregister(IPixelMap)
+
+class SphericalDetector(IDetector2D):
+    """
+
+
+    A spherical detector with axes and resolution function.  SphericalDetector
+
+    C++ includes: SphericalDetector.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IDetector2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SphericalDetector, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IDetector2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SphericalDetector, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(SphericalDetector self) -> SphericalDetector
+        __init__(SphericalDetector self, size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max) -> SphericalDetector
+        __init__(SphericalDetector self, SphericalDetector other) -> SphericalDetector
+
+        SphericalDetector::SphericalDetector(const SphericalDetector &other)
+
+        """
+        this = _libBornAgainCore.new_SphericalDetector(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(SphericalDetector self) -> SphericalDetector
+
+        SphericalDetector * SphericalDetector::clone() const override
+
+        """
+        return _libBornAgainCore.SphericalDetector_clone(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_SphericalDetector
+    __del__ = lambda self: None
+
+    def getValidAxesUnits(self):
+        """
+        getValidAxesUnits(SphericalDetector self) -> std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >
+
+        std::vector< IDetector2D::EAxesUnits > SphericalDetector::getValidAxesUnits() const override
+
+        returns vector of valid axes units 
+
+        """
+        return _libBornAgainCore.SphericalDetector_getValidAxesUnits(self)
+
+
+    def getDefaultAxesUnits(self):
+        """
+        getDefaultAxesUnits(SphericalDetector self) -> IDetector2D::EAxesUnits
+
+        IDetector2D::EAxesUnits SphericalDetector::getDefaultAxesUnits() const override
+
+        return default axes units 
+
+        """
+        return _libBornAgainCore.SphericalDetector_getDefaultAxesUnits(self)
+
+SphericalDetector_swigregister = _libBornAgainCore.SphericalDetector_swigregister
+SphericalDetector_swigregister(SphericalDetector)
+
+class AngularPixelMap(IPixelMap):
+    """Proxy of C++ AngularPixelMap class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IPixelMap]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, AngularPixelMap, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IPixelMap]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, AngularPixelMap, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, alpha_bin, phi_bin):
+        """
+        __init__(AngularPixelMap self, Bin1D alpha_bin, Bin1D phi_bin) -> AngularPixelMap
+
+        AngularPixelMap::AngularPixelMap(Bin1D alpha_bin, Bin1D phi_bin)
+
+        """
+        this = _libBornAgainCore.new_AngularPixelMap(alpha_bin, phi_bin)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_AngularPixelMap
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(AngularPixelMap self) -> AngularPixelMap
+
+        AngularPixelMap * AngularPixelMap::clone() const override
+
+        """
+        return _libBornAgainCore.AngularPixelMap_clone(self)
+
+
+    def createZeroSizeMap(self, x, y):
+        """
+        createZeroSizeMap(AngularPixelMap self, double x, double y) -> AngularPixelMap
+
+        AngularPixelMap * AngularPixelMap::createZeroSizeMap(double x, double y) const override
+
+        """
+        return _libBornAgainCore.AngularPixelMap_createZeroSizeMap(self, x, y)
+
+
+    def getK(self, x, y, wavelength):
+        """
+        getK(AngularPixelMap self, double x, double y, double wavelength) -> kvector_t
+
+        kvector_t AngularPixelMap::getK(double x, double y, double wavelength) const override
+
+        """
+        return _libBornAgainCore.AngularPixelMap_getK(self, x, y, wavelength)
+
+
+    def getIntegrationFactor(self, x, y):
+        """
+        getIntegrationFactor(AngularPixelMap self, double x, double y) -> double
+
+        double AngularPixelMap::getIntegrationFactor(double x, double y) const override
+
+        """
+        return _libBornAgainCore.AngularPixelMap_getIntegrationFactor(self, x, y)
+
+
+    def getSolidAngle(self):
+        """
+        getSolidAngle(AngularPixelMap self) -> double
+
+        double AngularPixelMap::getSolidAngle() const override
+
+        """
+        return _libBornAgainCore.AngularPixelMap_getSolidAngle(self)
+
+AngularPixelMap_swigregister = _libBornAgainCore.AngularPixelMap_swigregister
+AngularPixelMap_swigregister(AngularPixelMap)
+
+class IsGISAXSDetector(SphericalDetector):
+    """
+
+
+    A spherical detector used for validation with IsGISAXS results.
+
+    C++ includes: IsGISAXSDetector.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [SphericalDetector]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IsGISAXSDetector, name, value)
+    __swig_getmethods__ = {}
+    for _s in [SphericalDetector]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IsGISAXSDetector, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(IsGISAXSDetector self) -> IsGISAXSDetector
+        __init__(IsGISAXSDetector self, size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max) -> IsGISAXSDetector
+        __init__(IsGISAXSDetector self, IsGISAXSDetector other) -> IsGISAXSDetector
+
+        IsGISAXSDetector::IsGISAXSDetector(const IsGISAXSDetector &other)
+
+        """
+        this = _libBornAgainCore.new_IsGISAXSDetector(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(IsGISAXSDetector self) -> IsGISAXSDetector
+
+        IsGISAXSDetector * IsGISAXSDetector::clone() const override
+
+        """
+        return _libBornAgainCore.IsGISAXSDetector_clone(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_IsGISAXSDetector
+    __del__ = lambda self: None
+IsGISAXSDetector_swigregister = _libBornAgainCore.IsGISAXSDetector_swigregister
+IsGISAXSDetector_swigregister(IsGISAXSDetector)
+
+class Lattice(_object):
+    """
+
+
+    A lattice with three basis vectors.
+
+    C++ includes: Lattice.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Lattice, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, Lattice, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Lattice self, kvector_t a1, kvector_t a2, kvector_t a3) -> Lattice
+        __init__(Lattice self, Lattice lattice) -> Lattice
+
+        Lattice::Lattice(const Lattice &lattice)
+
+        """
+        this = _libBornAgainCore.new_Lattice(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_Lattice
+    __del__ = lambda self: None
+
+    def createTransformedLattice(self, transform):
+        """
+        createTransformedLattice(Lattice self, Transform3D const & transform) -> Lattice
+
+        Lattice Lattice::createTransformedLattice(const Transform3D &transform) const
+
+        Create transformed lattice. 
+
+        """
+        return _libBornAgainCore.Lattice_createTransformedLattice(self, transform)
+
+
+    def initialize(self):
+        """
+        initialize(Lattice self)
+
+        void Lattice::initialize() const
+
+        Initializes cached data. 
+
+        """
+        return _libBornAgainCore.Lattice_initialize(self)
+
+
+    def getBasisVectorA(self):
+        """
+        getBasisVectorA(Lattice self) -> kvector_t
+
+        kvector_t Lattice::getBasisVectorA() const
+
+        Returns basis vector a. 
+
+        """
+        return _libBornAgainCore.Lattice_getBasisVectorA(self)
+
+
+    def getBasisVectorB(self):
+        """
+        getBasisVectorB(Lattice self) -> kvector_t
+
+        kvector_t Lattice::getBasisVectorB() const
+
+        Returns basis vector b. 
+
+        """
+        return _libBornAgainCore.Lattice_getBasisVectorB(self)
+
+
+    def getBasisVectorC(self):
+        """
+        getBasisVectorC(Lattice self) -> kvector_t
+
+        kvector_t Lattice::getBasisVectorC() const
+
+        Returns basis vector c. 
+
+        """
+        return _libBornAgainCore.Lattice_getBasisVectorC(self)
+
+
+    def getVolume(self):
+        """
+        getVolume(Lattice self) -> double
+
+        double Lattice::getVolume() const
+
+        Returns the volume of the unit cell. 
+
+        """
+        return _libBornAgainCore.Lattice_getVolume(self)
+
+
+    def getReciprocalLatticeBasis(self, b1, b2, b3):
+        """
+        getReciprocalLatticeBasis(Lattice self, kvector_t b1, kvector_t b2, kvector_t b3)
+
+        void Lattice::getReciprocalLatticeBasis(kvector_t b1, kvector_t b2, kvector_t b3) const
+
+        Returns the reciprocal basis vectors. 
+
+        """
+        return _libBornAgainCore.Lattice_getReciprocalLatticeBasis(self, b1, b2, b3)
+
+
+    def getNearestLatticeVectorCoordinates(self, vector_in):
+        """
+        getNearestLatticeVectorCoordinates(Lattice self, kvector_t vector_in) -> ivector_t
+
+        ivector_t Lattice::getNearestLatticeVectorCoordinates(const kvector_t vector_in) const
+
+        Returns the nearest lattice point from a given vector. 
+
+        """
+        return _libBornAgainCore.Lattice_getNearestLatticeVectorCoordinates(self, vector_in)
+
+
+    def getNearestReciprocalLatticeVectorCoordinates(self, vector_in):
+        """
+        getNearestReciprocalLatticeVectorCoordinates(Lattice self, kvector_t vector_in) -> ivector_t
+
+        ivector_t Lattice::getNearestReciprocalLatticeVectorCoordinates(const kvector_t vector_in) const
+
+        Returns the nearest reciprocal lattice point from a given vector. 
+
+        """
+        return _libBornAgainCore.Lattice_getNearestReciprocalLatticeVectorCoordinates(self, vector_in)
+
+
+    def reciprocalLatticeVectorsWithinRadius(self, input_vector, radius):
+        """
+        reciprocalLatticeVectorsWithinRadius(Lattice self, kvector_t input_vector, double radius) -> vector_kvector_t
+
+        std::vector< kvector_t > Lattice::reciprocalLatticeVectorsWithinRadius(const kvector_t input_vector, double radius) const
+
+        Computes a list of reciprocal lattice vectors within a specified distance of a given vector. 
+
+        """
+        return _libBornAgainCore.Lattice_reciprocalLatticeVectorsWithinRadius(self, input_vector, radius)
+
+
+    def setSelectionRule(self, p_selection_rule):
+        """
+        setSelectionRule(Lattice self, ISelectionRule p_selection_rule)
+
+        void Lattice::setSelectionRule(const ISelectionRule &p_selection_rule)
+
+        Sets a selection rule for the reciprocal vectors. 
+
+        """
+        return _libBornAgainCore.Lattice_setSelectionRule(self, p_selection_rule)
+
+
+    def createFCCLattice(a):
+        """createFCCLattice(double a) -> Lattice"""
+        return _libBornAgainCore.Lattice_createFCCLattice(a)
+
+    if _newclass:
+        createFCCLattice = staticmethod(createFCCLattice)
+    __swig_getmethods__["createFCCLattice"] = lambda x: createFCCLattice
+
+    def createTrigonalLattice(a, c):
+        """createTrigonalLattice(double a, double c) -> Lattice"""
+        return _libBornAgainCore.Lattice_createTrigonalLattice(a, c)
+
+    if _newclass:
+        createTrigonalLattice = staticmethod(createTrigonalLattice)
+    __swig_getmethods__["createTrigonalLattice"] = lambda x: createTrigonalLattice
+Lattice_swigregister = _libBornAgainCore.Lattice_swigregister
+Lattice_swigregister(Lattice)
+
+def Lattice_createFCCLattice(a):
+    """Lattice_createFCCLattice(double a) -> Lattice"""
+    return _libBornAgainCore.Lattice_createFCCLattice(a)
+
+def Lattice_createTrigonalLattice(a, c):
+    """Lattice_createTrigonalLattice(double a, double c) -> Lattice"""
+    return _libBornAgainCore.Lattice_createTrigonalLattice(a, c)
+
+class Lattice1DParameters(_object):
+    """
+
+
+    Basic parameters of a one-dimensional lattice.
+
+    C++ includes: Lattice1DParameters.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Lattice1DParameters, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, Lattice1DParameters, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Lattice1DParameters self) -> Lattice1DParameters
+        __init__(Lattice1DParameters self, double length, double xi) -> Lattice1DParameters
+
+        Lattice1DParameters::Lattice1DParameters(double length, double xi)
+
+        Parameters:
+        -----------
+
+        length: 
+         Lattice constant.
+
+        xi: 
+        TODO: seems unused; explain or remove 
+
+        """
+        this = _libBornAgainCore.new_Lattice1DParameters(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_setmethods__["m_length"] = _libBornAgainCore.Lattice1DParameters_m_length_set
+    __swig_getmethods__["m_length"] = _libBornAgainCore.Lattice1DParameters_m_length_get
+    if _newclass:
+        m_length = _swig_property(_libBornAgainCore.Lattice1DParameters_m_length_get, _libBornAgainCore.Lattice1DParameters_m_length_set)
+    __swig_setmethods__["m_xi"] = _libBornAgainCore.Lattice1DParameters_m_xi_set
+    __swig_getmethods__["m_xi"] = _libBornAgainCore.Lattice1DParameters_m_xi_get
+    if _newclass:
+        m_xi = _swig_property(_libBornAgainCore.Lattice1DParameters_m_xi_get, _libBornAgainCore.Lattice1DParameters_m_xi_set)
+    __swig_destroy__ = _libBornAgainCore.delete_Lattice1DParameters
+    __del__ = lambda self: None
+Lattice1DParameters_swigregister = _libBornAgainCore.Lattice1DParameters_swigregister
+Lattice1DParameters_swigregister(Lattice1DParameters)
+
+class Lattice2DParameters(_object):
+    """
+
+
+    Additional parameters for 2D lattice.
+
+    C++ includes: Lattice2DParameters.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Lattice2DParameters, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, Lattice2DParameters, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(Lattice2DParameters self) -> Lattice2DParameters
+
+        Lattice2DParameters::Lattice2DParameters()
+
+        """
+        this = _libBornAgainCore.new_Lattice2DParameters()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def getUnitCellArea(self):
+        """
+        getUnitCellArea(Lattice2DParameters self) -> double
+
+        double Lattice2DParameters::getUnitCellArea() const 
+
+        """
+        return _libBornAgainCore.Lattice2DParameters_getUnitCellArea(self)
+
+    __swig_setmethods__["m_length_1"] = _libBornAgainCore.Lattice2DParameters_m_length_1_set
+    __swig_getmethods__["m_length_1"] = _libBornAgainCore.Lattice2DParameters_m_length_1_get
+    if _newclass:
+        m_length_1 = _swig_property(_libBornAgainCore.Lattice2DParameters_m_length_1_get, _libBornAgainCore.Lattice2DParameters_m_length_1_set)
+    __swig_setmethods__["m_length_2"] = _libBornAgainCore.Lattice2DParameters_m_length_2_set
+    __swig_getmethods__["m_length_2"] = _libBornAgainCore.Lattice2DParameters_m_length_2_get
+    if _newclass:
+        m_length_2 = _swig_property(_libBornAgainCore.Lattice2DParameters_m_length_2_get, _libBornAgainCore.Lattice2DParameters_m_length_2_set)
+    __swig_setmethods__["m_angle"] = _libBornAgainCore.Lattice2DParameters_m_angle_set
+    __swig_getmethods__["m_angle"] = _libBornAgainCore.Lattice2DParameters_m_angle_get
+    if _newclass:
+        m_angle = _swig_property(_libBornAgainCore.Lattice2DParameters_m_angle_get, _libBornAgainCore.Lattice2DParameters_m_angle_set)
+    __swig_setmethods__["m_xi"] = _libBornAgainCore.Lattice2DParameters_m_xi_set
+    __swig_getmethods__["m_xi"] = _libBornAgainCore.Lattice2DParameters_m_xi_get
+    if _newclass:
+        m_xi = _swig_property(_libBornAgainCore.Lattice2DParameters_m_xi_get, _libBornAgainCore.Lattice2DParameters_m_xi_set)
+    __swig_destroy__ = _libBornAgainCore.delete_Lattice2DParameters
+    __del__ = lambda self: None
+Lattice2DParameters_swigregister = _libBornAgainCore.Lattice2DParameters_swigregister
+Lattice2DParameters_swigregister(Lattice2DParameters)
+
+class Layer(ICompositeSample):
+    """
+
+
+    A layer, with thickness (in nanometer) and material.
+
+    C++ includes: Layer.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Layer, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Layer, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Layer self) -> Layer
+        __init__(Layer self, IMaterial material, double thickness=0) -> Layer
+        __init__(Layer self, IMaterial material) -> Layer
+
+        Layer::Layer(const IMaterial &material, double thickness=0)
+
+        """
+        this = _libBornAgainCore.new_Layer(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_Layer
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(Layer self) -> Layer
+
+        Layer* Layer::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.Layer_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(Layer self) -> Layer
+
+        Layer * Layer::cloneInvertB() const final
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.Layer_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(Layer self, ISampleVisitor visitor)
+
+        void Layer::accept(ISampleVisitor *visitor) const final
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.Layer_accept(self, visitor)
+
+
+    def to_str(self, indent=0):
+        """
+        to_str(Layer self, int indent=0) -> std::string
+        to_str(Layer self) -> std::string
+
+        std::string Layer::to_str(int indent=0) const final
+
+        Returns textual representation of this and its descendants. 
+
+        """
+        return _libBornAgainCore.Layer_to_str(self, indent)
+
+
+    def setThickness(self, thickness):
+        """
+        setThickness(Layer self, double thickness)
+
+        void Layer::setThickness(double thickness)
+
+        Sets layer thickness in nanometers. 
+
+        """
+        return _libBornAgainCore.Layer_setThickness(self, thickness)
+
+
+    def getThickness(self):
+        """
+        getThickness(Layer self) -> double
+
+        double Layer::getThickness() const 
+
+        """
+        return _libBornAgainCore.Layer_getThickness(self)
+
+
+    def setMaterial(self, material):
+        """
+        setMaterial(Layer self, IMaterial material)
+
+        void Layer::setMaterial(const IMaterial &material)
+
+        Sets  material of the layer. 
+
+        """
+        return _libBornAgainCore.Layer_setMaterial(self, material)
+
+
+    def getMaterial(self):
+        """
+        getMaterial(Layer self) -> IMaterial
+
+        const IMaterial* Layer::getMaterial() const
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.Layer_getMaterial(self)
+
+
+    def getRefractiveIndex(self):
+        """
+        getRefractiveIndex(Layer self) -> complex_t
+
+        complex_t Layer::getRefractiveIndex() const 
+
+        """
+        return _libBornAgainCore.Layer_getRefractiveIndex(self)
+
+
+    def getRefractiveIndex2(self):
+        """
+        getRefractiveIndex2(Layer self) -> complex_t
+
+        complex_t Layer::getRefractiveIndex2() const
+
+        squared refractive index 
+
+        """
+        return _libBornAgainCore.Layer_getRefractiveIndex2(self)
+
+
+    def addLayout(self, decoration):
+        """
+        addLayout(Layer self, ILayout decoration)
+
+        void Layer::addLayout(const ILayout &decoration)
+
+        """
+        return _libBornAgainCore.Layer_addLayout(self, decoration)
+
+
+    def getNumberOfLayouts(self):
+        """
+        getNumberOfLayouts(Layer self) -> size_t
+
+        size_t Layer::getNumberOfLayouts() const 
+
+        """
+        return _libBornAgainCore.Layer_getNumberOfLayouts(self)
+
+
+    def getLayout(self, i):
+        """
+        getLayout(Layer self, size_t i) -> ILayout
+
+        const ILayout * Layer::getLayout(size_t i) const 
+
+        """
+        return _libBornAgainCore.Layer_getLayout(self, i)
+
+
+    def hasComputation(self):
+        """
+        hasComputation(Layer self) -> bool
+
+        bool Layer::hasComputation() const
+
+        Returns true if decoration is present. 
+
+        """
+        return _libBornAgainCore.Layer_hasComputation(self)
+
+
+    def getTotalParticleSurfaceDensity(self, layout_index):
+        """
+        getTotalParticleSurfaceDensity(Layer self, size_t layout_index) -> double
+
+        double Layer::getTotalParticleSurfaceDensity(size_t layout_index) const 
+
+        """
+        return _libBornAgainCore.Layer_getTotalParticleSurfaceDensity(self, layout_index)
+
+
+    def getTotalAbundance(self):
+        """
+        getTotalAbundance(Layer self) -> double
+
+        double Layer::getTotalAbundance() const 
+
+        """
+        return _libBornAgainCore.Layer_getTotalAbundance(self)
+
+
+    def setNumberOfLayers(self, n_layers):
+        """
+        setNumberOfLayers(Layer self, size_t n_layers)
+
+        void Layer::setNumberOfLayers(size_t n_layers)
+
+        """
+        return _libBornAgainCore.Layer_setNumberOfLayers(self, n_layers)
+
+
+    def getNumberOfLayers(self):
+        """
+        getNumberOfLayers(Layer self) -> size_t
+
+        size_t Layer::getNumberOfLayers() const 
+
+        """
+        return _libBornAgainCore.Layer_getNumberOfLayers(self)
+
+Layer_swigregister = _libBornAgainCore.Layer_swigregister
+Layer_swigregister(Layer)
+
+class IRoughness(ISample):
+    """
+
+
+    Interface to equip an interface with a roughness.
+
+    C++ includes: IRoughness.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ISample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IRoughness, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ISample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, IRoughness, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainCore.delete_IRoughness
+    __del__ = lambda self: None
+
+    def accept(self, visitor):
+        """
+        accept(IRoughness self, ISampleVisitor visitor)
+
+        virtual void IRoughness::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.IRoughness_accept(self, visitor)
+
+IRoughness_swigregister = _libBornAgainCore.IRoughness_swigregister
+IRoughness_swigregister(IRoughness)
+
+class LayerRoughness(IRoughness):
+    """
+
+
+    A Roughness of interface between two layers.
+
+    Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 "X-ray reflection and transmission by rough surfaces"
+
+    C++ includes: LayerRoughness.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IRoughness]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, LayerRoughness, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IRoughness]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, LayerRoughness, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(LayerRoughness self) -> LayerRoughness
+        __init__(LayerRoughness self, double sigma, double hurstParameter, double latteralCorrLength) -> LayerRoughness
+
+        LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength)
+
+        """
+        this = _libBornAgainCore.new_LayerRoughness(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(LayerRoughness self) -> LayerRoughness
+
+        LayerRoughness* LayerRoughness::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_clone(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(LayerRoughness self, ISampleVisitor visitor)
+
+        virtual void LayerRoughness::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_accept(self, visitor)
+
+
+    def getSpectralFun(self, kvec):
+        """
+        getSpectralFun(LayerRoughness self, kvector_t kvec) -> double
+
+        double LayerRoughness::getSpectralFun(const kvector_t kvec) const
+
+        Returns power spectral density of the surface roughness.
+
+        Power spectral density of the surface roughness is a result of two-dimensional Fourier transform of the correlation function of the roughness profile.
+
+        Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 "X-ray reflection and transmission by rough surfaces" 
+
+        """
+        return _libBornAgainCore.LayerRoughness_getSpectralFun(self, kvec)
+
+
+    def getCorrFun(self, k):
+        """
+        getCorrFun(LayerRoughness self, kvector_t k) -> double
+
+        double LayerRoughness::getCorrFun(const kvector_t k) const
+
+        Correlation function of the roughness profile. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_getCorrFun(self, k)
+
+
+    def setSigma(self, sigma):
+        """
+        setSigma(LayerRoughness self, double sigma)
+
+        void LayerRoughness::setSigma(double sigma)
+
+        Sets rms of roughness. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_setSigma(self, sigma)
+
+
+    def getSigma(self):
+        """
+        getSigma(LayerRoughness self) -> double
+
+        double LayerRoughness::getSigma() const
+
+        Returns rms of roughness. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_getSigma(self)
+
+
+    def setHurstParameter(self, hurstParameter):
+        """
+        setHurstParameter(LayerRoughness self, double hurstParameter)
+
+        void LayerRoughness::setHurstParameter(double hurstParameter)
+
+        Sets hurst parameter. It describes how jagged the surface is. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_setHurstParameter(self, hurstParameter)
+
+
+    def getHurstParameter(self):
+        """
+        getHurstParameter(LayerRoughness self) -> double
+
+        double LayerRoughness::getHurstParameter() const
+
+        Returns hurst parameter. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_getHurstParameter(self)
+
+
+    def setLatteralCorrLength(self, latteralCorrLength):
+        """
+        setLatteralCorrLength(LayerRoughness self, double latteralCorrLength)
+
+        void LayerRoughness::setLatteralCorrLength(double latteralCorrLength)
+
+        Sets lateral correlation length. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_setLatteralCorrLength(self, latteralCorrLength)
+
+
+    def getLatteralCorrLength(self):
+        """
+        getLatteralCorrLength(LayerRoughness self) -> double
+
+        double LayerRoughness::getLatteralCorrLength() const
+
+        Returns latteral correlation length. 
+
+        """
+        return _libBornAgainCore.LayerRoughness_getLatteralCorrLength(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_LayerRoughness
+    __del__ = lambda self: None
+LayerRoughness_swigregister = _libBornAgainCore.LayerRoughness_swigregister
+LayerRoughness_swigregister(LayerRoughness)
+
+class Line(IShape2D):
+    """
+
+
+    A line segment.
+
+    C++ includes: Line.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Line, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Line, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, x1, y1, x2, y2):
+        """
+        __init__(Geometry::Line self, double x1, double y1, double x2, double y2) -> Line
+
+        Geometry::Line::Line(double x1, double y1, double x2, double y2)
+
+        """
+        this = _libBornAgainCore.new_Line(x1, y1, x2, y2)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(Line self) -> Line
+
+        Line* Geometry::Line::clone() const 
+
+        """
+        return _libBornAgainCore.Line_clone(self)
+
+
+    def contains(self, *args):
+        """
+        contains(Line self, double x, double y) -> bool
+        contains(Line self, Bin1D binx, Bin1D biny) -> bool
+
+        bool Geometry::Line::contains(const Bin1D &binx, const Bin1D &biny) const
+
+        Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+
+        """
+        return _libBornAgainCore.Line_contains(self, *args)
+
+    __swig_destroy__ = _libBornAgainCore.delete_Line
+    __del__ = lambda self: None
+Line_swigregister = _libBornAgainCore.Line_swigregister
+Line_swigregister(Line)
+
+class VerticalLine(IShape2D):
+    """
+
+
+    An infinite vertical line.
+
+    C++ includes: Line.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, VerticalLine, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, VerticalLine, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, x):
+        """
+        __init__(Geometry::VerticalLine self, double x) -> VerticalLine
+
+        Geometry::VerticalLine::VerticalLine(double x)
+
+        Parameters:
+        -----------
+
+        x: 
+        The value at which it crosses x-axes 
+
+        """
+        this = _libBornAgainCore.new_VerticalLine(x)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(VerticalLine self) -> VerticalLine
+
+        VerticalLine* Geometry::VerticalLine::clone() const 
+
+        """
+        return _libBornAgainCore.VerticalLine_clone(self)
+
+
+    def contains(self, *args):
+        """
+        contains(VerticalLine self, double x, double y) -> bool
+        contains(VerticalLine self, Bin1D binx, Bin1D biny) -> bool
+
+        bool Geometry::VerticalLine::contains(const Bin1D &binx, const Bin1D &biny) const
+
+        Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+
+        """
+        return _libBornAgainCore.VerticalLine_contains(self, *args)
+
+
+    def getXpos(self):
+        """
+        getXpos(VerticalLine self) -> double
+
+        double Geometry::VerticalLine::getXpos() const 
+
+        """
+        return _libBornAgainCore.VerticalLine_getXpos(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_VerticalLine
+    __del__ = lambda self: None
+VerticalLine_swigregister = _libBornAgainCore.VerticalLine_swigregister
+VerticalLine_swigregister(VerticalLine)
+
+class HorizontalLine(IShape2D):
+    """
+
+
+    An infinite horizontal line.
+
+    C++ includes: Line.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, HorizontalLine, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, HorizontalLine, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, y):
+        """
+        __init__(Geometry::HorizontalLine self, double y) -> HorizontalLine
+
+        Geometry::HorizontalLine::HorizontalLine(double y)
+
+        Parameters:
+        -----------
+
+        y: 
+        The value at which it crosses y-axes 
+
+        """
+        this = _libBornAgainCore.new_HorizontalLine(y)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(HorizontalLine self) -> HorizontalLine
+
+        HorizontalLine* Geometry::HorizontalLine::clone() const 
+
+        """
+        return _libBornAgainCore.HorizontalLine_clone(self)
+
+
+    def contains(self, *args):
+        """
+        contains(HorizontalLine self, double x, double y) -> bool
+        contains(HorizontalLine self, Bin1D binx, Bin1D biny) -> bool
+
+        bool Geometry::HorizontalLine::contains(const Bin1D &binx, const Bin1D &biny) const
+
+        Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+
+        """
+        return _libBornAgainCore.HorizontalLine_contains(self, *args)
+
+
+    def getYpos(self):
+        """
+        getYpos(HorizontalLine self) -> double
+
+        double Geometry::HorizontalLine::getYpos() const 
+
+        """
+        return _libBornAgainCore.HorizontalLine_getYpos(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_HorizontalLine
+    __del__ = lambda self: None
+HorizontalLine_swigregister = _libBornAgainCore.HorizontalLine_swigregister
+HorizontalLine_swigregister(HorizontalLine)
+
+class MesoCrystal(IParticle):
+    """
+
+
+    A particle with an internal structure of smaller particles.
+
+    C++ includes: MesoCrystal.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParticle]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, MesoCrystal, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParticle]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, MesoCrystal, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, particle_structure, form_factor):
+        """
+        __init__(MesoCrystal self, IClusteredParticles particle_structure, IFormFactor form_factor) -> MesoCrystal
+
+        MesoCrystal::MesoCrystal(const IClusteredParticles &particle_structure, IFormFactor &form_factor)
+
+        """
+        this = _libBornAgainCore.new_MesoCrystal(particle_structure, form_factor)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_MesoCrystal
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(MesoCrystal self) -> MesoCrystal
+
+        MesoCrystal * MesoCrystal::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.MesoCrystal_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(MesoCrystal self) -> MesoCrystal
+
+        MesoCrystal * MesoCrystal::cloneInvertB() const
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.MesoCrystal_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(MesoCrystal self, ISampleVisitor visitor)
+
+        void MesoCrystal::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.MesoCrystal_accept(self, visitor)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(MesoCrystal self, IMaterial material)
+
+        void MesoCrystal::setAmbientMaterial(const IMaterial &material)
+
+        Sets the refractive index of the ambient material (which influences its scattering power) 
+
+        """
+        return _libBornAgainCore.MesoCrystal_setAmbientMaterial(self, material)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(MesoCrystal self) -> IMaterial
+
+        const IMaterial * MesoCrystal::getAmbientMaterial() const
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.MesoCrystal_getAmbientMaterial(self)
+
+
+    def createTransformedFormFactor(self, p_rotation, translation):
+        """
+        createTransformedFormFactor(MesoCrystal self, IRotation p_rotation, kvector_t translation) -> IFormFactor
+
+        IFormFactor * MesoCrystal::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+        Create a form factor for this particle with an extra scattering factor. 
+
+        """
+        return _libBornAgainCore.MesoCrystal_createTransformedFormFactor(self, p_rotation, translation)
+
+
+    def getClusteredParticles(self):
+        """
+        getClusteredParticles(MesoCrystal self) -> IClusteredParticles
+
+        const IClusteredParticles* MesoCrystal::getClusteredParticles() const
+
+        get the internal structure, which is in principle unbounded in space (e.g. an infinite crystal) 
+
+        """
+        return _libBornAgainCore.MesoCrystal_getClusteredParticles(self)
+
+MesoCrystal_swigregister = _libBornAgainCore.MesoCrystal_swigregister
+MesoCrystal_swigregister(MesoCrystal)
+
+
+_libBornAgainCore.VERBOSE_swigconstant(_libBornAgainCore)
+VERBOSE = _libBornAgainCore.VERBOSE
+
+_libBornAgainCore.DEBUG2_swigconstant(_libBornAgainCore)
+DEBUG2 = _libBornAgainCore.DEBUG2
+
+_libBornAgainCore.DEBUG_swigconstant(_libBornAgainCore)
+DEBUG = _libBornAgainCore.DEBUG
+
+_libBornAgainCore.INFO_swigconstant(_libBornAgainCore)
+INFO = _libBornAgainCore.INFO
+
+_libBornAgainCore.WARNING_swigconstant(_libBornAgainCore)
+WARNING = _libBornAgainCore.WARNING
+
+_libBornAgainCore.ERROR_swigconstant(_libBornAgainCore)
+ERROR = _libBornAgainCore.ERROR
+
+_libBornAgainCore.FATAL_swigconstant(_libBornAgainCore)
+FATAL = _libBornAgainCore.FATAL
+class Logger(_object):
+    """Proxy of C++ MSG::Logger class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Logger, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, Logger, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, level):
+        """__init__(MSG::Logger self, MSG::EMessageLevel level) -> Logger"""
+        this = _libBornAgainCore.new_Logger(level)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_Logger
+    __del__ = lambda self: None
+
+    def NowTime(self):
+        """NowTime(Logger self) -> std::string"""
+        return _libBornAgainCore.Logger_NowTime(self)
+
+
+    def ToString(self, level):
+        """ToString(Logger self, MSG::EMessageLevel level) -> std::string const &"""
+        return _libBornAgainCore.Logger_ToString(self, level)
+
+
+    def SetLevel(*args):
+        """
+        SetLevel(MSG::EMessageLevel level)
+        SetLevel(std::string const & levelname)
+        """
+        return _libBornAgainCore.Logger_SetLevel(*args)
+
+    if _newclass:
+        SetLevel = staticmethod(SetLevel)
+    __swig_getmethods__["SetLevel"] = lambda x: SetLevel
+
+    def GetLevel():
+        """GetLevel() -> MSG::EMessageLevel"""
+        return _libBornAgainCore.Logger_GetLevel()
+
+    if _newclass:
+        GetLevel = staticmethod(GetLevel)
+    __swig_getmethods__["GetLevel"] = lambda x: GetLevel
+Logger_swigregister = _libBornAgainCore.Logger_swigregister
+Logger_swigregister(Logger)
+
+def Logger_SetLevel(*args):
+    """
+    SetLevel(MSG::EMessageLevel level)
+    Logger_SetLevel(std::string const & levelname)
+    """
+    return _libBornAgainCore.Logger_SetLevel(*args)
+
+def Logger_GetLevel():
+    """Logger_GetLevel() -> MSG::EMessageLevel"""
+    return _libBornAgainCore.Logger_GetLevel()
+
+
+def SetLevel(*args):
+    """
+    SetLevel(MSG::EMessageLevel level)
+    SetLevel(std::string const & levelname)
+    """
+    return _libBornAgainCore.SetLevel(*args)
+class MultiLayer(ICompositeSample):
+    """
+
+
+    Our sample model: a stack of layers one below the other.Example of system of 4 layers (3 interfaces):
+
+    ambience layer #0 z=getLayerBottomZ(0)=0.0 ------ interface #0 Fe, 20A layer #1 z=getLayerBottomZ(1)=-20.0 ------ interface #1 Cr, 40A layer #2 z=getLayerBottomZ(2)=-60.0 ------ interface #2 substrate layer #3 z=getLayerBottomZ(3)=-60.0
+
+    C++ includes: MultiLayer.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, MultiLayer, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICompositeSample]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, MultiLayer, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(MultiLayer self) -> MultiLayer
+
+        MultiLayer::MultiLayer()
+
+        """
+        this = _libBornAgainCore.new_MultiLayer()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_MultiLayer
+    __del__ = lambda self: None
+
+    def accept(self, visitor):
+        """
+        accept(MultiLayer self, ISampleVisitor visitor)
+
+        virtual void MultiLayer::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.MultiLayer_accept(self, visitor)
+
+
+    def to_str(self, indent=0):
+        """
+        to_str(MultiLayer self, int indent=0) -> std::string
+        to_str(MultiLayer self) -> std::string
+
+        std::string MultiLayer::to_str(int indent=0) const
+
+        Returns textual representation of this and its descendants. 
+
+        """
+        return _libBornAgainCore.MultiLayer_to_str(self, indent)
+
+
+    def getNumberOfLayers(self):
+        """
+        getNumberOfLayers(MultiLayer self) -> size_t
+
+        size_t MultiLayer::getNumberOfLayers() const 
+
+        """
+        return _libBornAgainCore.MultiLayer_getNumberOfLayers(self)
+
+
+    def getNumberOfInterfaces(self):
+        """
+        getNumberOfInterfaces(MultiLayer self) -> size_t
+
+        size_t MultiLayer::getNumberOfInterfaces() const 
+
+        """
+        return _libBornAgainCore.MultiLayer_getNumberOfInterfaces(self)
+
+
+    def addLayer(self, p_child):
+        """
+        addLayer(MultiLayer self, Layer p_child)
+
+        void MultiLayer::addLayer(const Layer &p_child)
+
+        Adds object to multilayer, overrides from  ISample.
+
+        Adds layer with default (zero) roughness. 
+
+        """
+        return _libBornAgainCore.MultiLayer_addLayer(self, p_child)
+
+
+    def addLayerWithTopRoughness(self, layer, roughness):
+        """
+        addLayerWithTopRoughness(MultiLayer self, Layer layer, LayerRoughness roughness)
+
+        void MultiLayer::addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness)
+
+        Adds layer with top roughness. 
+
+        """
+        return _libBornAgainCore.MultiLayer_addLayerWithTopRoughness(self, layer, roughness)
+
+
+    def getLayer(self, i_layer):
+        """
+        getLayer(MultiLayer self, size_t i_layer) -> Layer
+
+        const Layer* MultiLayer::getLayer(size_t i_layer) const
+
+        Returns layer with given index. 
+
+        """
+        return _libBornAgainCore.MultiLayer_getLayer(self, i_layer)
+
+
+    def getLayerInterface(self, i_interface):
+        """
+        getLayerInterface(MultiLayer self, size_t i_interface) -> LayerInterface const *
+
+        const LayerInterface* MultiLayer::getLayerInterface(size_t i_interface) const
+
+        Returns layer with given index. 
+
+        """
+        return _libBornAgainCore.MultiLayer_getLayerInterface(self, i_interface)
+
+
+    def getLayerBottomZ(self, i_layer):
+        """
+        getLayerBottomZ(MultiLayer self, size_t i_layer) -> double
+
+        double MultiLayer::getLayerBottomZ(size_t i_layer) const
+
+        Returns z-coordinate of the layer's bottom. 
+
+        """
+        return _libBornAgainCore.MultiLayer_getLayerBottomZ(self, i_layer)
+
+
+    def getLayerThickness(self, i_layer):
+        """
+        getLayerThickness(MultiLayer self, size_t i_layer) -> double
+
+        double MultiLayer::getLayerThickness(size_t i_layer) const
+
+        Returns thickness of layer. 
+
+        """
+        return _libBornAgainCore.MultiLayer_getLayerThickness(self, i_layer)
+
+
+    def getLayerTopInterface(self, i_layer):
+        """
+        getLayerTopInterface(MultiLayer self, size_t i_layer) -> LayerInterface const *
+
+        const LayerInterface * MultiLayer::getLayerTopInterface(size_t i_layer) const
+
+        Returns top interface of layer.
+
+        Returns pointer to the top interface of the layer. nInterfaces = nLayers-1, first layer in multilayer doesn't have interface. 
+
+        """
+        return _libBornAgainCore.MultiLayer_getLayerTopInterface(self, i_layer)
+
+
+    def getLayerBottomInterface(self, i_layer):
+        """
+        getLayerBottomInterface(MultiLayer self, size_t i_layer) -> LayerInterface const *
+
+        const LayerInterface * MultiLayer::getLayerBottomInterface(size_t i_layer) const
+
+        Returns bottom interface of layer.
+
+        Returns pointer to the bottom interface of the layer. 
+
+        """
+        return _libBornAgainCore.MultiLayer_getLayerBottomInterface(self, i_layer)
+
+
+    def clear(self):
+        """
+        clear(MultiLayer self)
+
+        void MultiLayer::clear()
+
+        Destructs allocated objects. 
+
+        """
+        return _libBornAgainCore.MultiLayer_clear(self)
+
+
+    def clone(self):
+        """
+        clone(MultiLayer self) -> MultiLayer
+
+        MultiLayer * MultiLayer::clone() const
+
+        Returns alone of multilayer with clones of all layers and recreated interfaces between layers 
+
+        """
+        return _libBornAgainCore.MultiLayer_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(MultiLayer self) -> MultiLayer
+
+        MultiLayer * MultiLayer::cloneInvertB() const
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.MultiLayer_cloneInvertB(self)
+
+
+    def setCrossCorrLength(self, crossCorrLength):
+        """
+        setCrossCorrLength(MultiLayer self, double crossCorrLength)
+
+        void MultiLayer::setCrossCorrLength(double crossCorrLength)
+
+        Sets cross correlation length of roughnesses between interfaces. 
+
+        """
+        return _libBornAgainCore.MultiLayer_setCrossCorrLength(self, crossCorrLength)
+
+
+    def getCrossCorrLength(self):
+        """
+        getCrossCorrLength(MultiLayer self) -> double
+
+        double MultiLayer::getCrossCorrLength() const
+
+        Returns cross correlation length of roughnesses between interfaces. 
+
+        """
+        return _libBornAgainCore.MultiLayer_getCrossCorrLength(self)
+
+
+    def getCrossCorrSpectralFun(self, kvec, j, k):
+        """
+        getCrossCorrSpectralFun(MultiLayer self, kvector_t kvec, size_t j, size_t k) -> double
+
+        double MultiLayer::getCrossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const
+
+        ! correlation function of roughnesses between the interfaces
+
+        Fourier transform of the correlation function of roughnesses between the interfaces
+
+        Fourier transform of the correlation function of roughnesses between the interfaces j,k - indexes of layers in multilayer whose bottom interfaces we are considering 
+
+        """
+        return _libBornAgainCore.MultiLayer_getCrossCorrSpectralFun(self, kvec, j, k)
+
+
+    def setLayerThickness(self, i_layer, thickness):
+        """
+        setLayerThickness(MultiLayer self, size_t i_layer, double thickness)
+
+        void MultiLayer::setLayerThickness(size_t i_layer, double thickness)
+
+        Sets thickness of layer. 
+
+        """
+        return _libBornAgainCore.MultiLayer_setLayerThickness(self, i_layer, thickness)
+
+
+    def getIndexOfLayer(self, layer):
+        """
+        getIndexOfLayer(MultiLayer self, Layer layer) -> int
+
+        int MultiLayer::getIndexOfLayer(const Layer *layer) const
+
+        returns layer index 
+
+        """
+        return _libBornAgainCore.MultiLayer_getIndexOfLayer(self, layer)
+
+
+    def requiresMatrixRTCoefficients(self):
+        """
+        requiresMatrixRTCoefficients(MultiLayer self) -> bool
+
+        bool MultiLayer::requiresMatrixRTCoefficients() const
+
+        returns true if contains magnetic materials and matrix calculations are required 
+
+        """
+        return _libBornAgainCore.MultiLayer_requiresMatrixRTCoefficients(self)
+
+
+    def zToLayerIndex(self, z_value):
+        """
+        zToLayerIndex(MultiLayer self, double z_value) -> size_t
+
+        size_t MultiLayer::zToLayerIndex(double z_value)
+
+        returns layer index corresponding to given global z coordinate 
+
+        """
+        return _libBornAgainCore.MultiLayer_zToLayerIndex(self, z_value)
+
+
+    def containsMagneticMaterial(self):
+        """
+        containsMagneticMaterial(MultiLayer self) -> bool
+
+        bool MultiLayer::containsMagneticMaterial() const 
+
+        """
+        return _libBornAgainCore.MultiLayer_containsMagneticMaterial(self)
+
+
+    def hasRoughness(self):
+        """
+        hasRoughness(MultiLayer self) -> bool
+
+        bool MultiLayer::hasRoughness() const 
+
+        """
+        return _libBornAgainCore.MultiLayer_hasRoughness(self)
+
+
+    def totalNofLayouts(self):
+        """
+        totalNofLayouts(MultiLayer self) -> size_t
+
+        size_t MultiLayer::totalNofLayouts() const 
+
+        """
+        return _libBornAgainCore.MultiLayer_totalNofLayouts(self)
+
+MultiLayer_swigregister = _libBornAgainCore.MultiLayer_swigregister
+MultiLayer_swigregister(MultiLayer)
+
+class OffSpecSimulation(Simulation):
+    """
+
+
+    Main class to run an off-specular simulation.
+
+    C++ includes: OffSpecSimulation.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [Simulation]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, OffSpecSimulation, name, value)
+    __swig_getmethods__ = {}
+    for _s in [Simulation]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, OffSpecSimulation, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(OffSpecSimulation self) -> OffSpecSimulation
+        __init__(OffSpecSimulation self, MultiLayer p_sample) -> OffSpecSimulation
+        __init__(OffSpecSimulation self, std::shared_ptr< IMultiLayerBuilder > const p_sample_builder) -> OffSpecSimulation
+
+        OffSpecSimulation::OffSpecSimulation(std::shared_ptr< class IMultiLayerBuilder > p_sample_builder)
+
+        """
+        this = _libBornAgainCore.new_OffSpecSimulation(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_OffSpecSimulation
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(OffSpecSimulation self) -> OffSpecSimulation
+
+        OffSpecSimulation* OffSpecSimulation::clone() const 
+
+        """
+        return _libBornAgainCore.OffSpecSimulation_clone(self)
+
+
+    def prepareSimulation(self):
+        """
+        prepareSimulation(OffSpecSimulation self)
+
+        void OffSpecSimulation::prepareSimulation() final
+
+        Put into a clean state for running a simulation. 
+
+        """
+        return _libBornAgainCore.OffSpecSimulation_prepareSimulation(self)
+
+
+    def numberOfSimulationElements(self):
+        """
+        numberOfSimulationElements(OffSpecSimulation self) -> int
+
+        int OffSpecSimulation::numberOfSimulationElements() const final
+
+        Gets the number of elements this simulation needs to calculate. 
+
+        """
+        return _libBornAgainCore.OffSpecSimulation_numberOfSimulationElements(self)
+
+
+    def getDetectorIntensity(self, *args):
+        """
+        getDetectorIntensity(OffSpecSimulation self, IDetector2D::EAxesUnits units_type) -> IntensityData
+        getDetectorIntensity(OffSpecSimulation self) -> IntensityData
+
+        OutputData<double>* OffSpecSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const
+
+        Returns clone of the detector intensity map. 
+
+        """
+        return _libBornAgainCore.OffSpecSimulation_getDetectorIntensity(self, *args)
+
+
+    def getIntensityData(self):
+        """
+        getIntensityData(OffSpecSimulation self) -> Histogram2D
+
+        Histogram2D * OffSpecSimulation::getIntensityData() const
+
+        Returns clone of the detector intensity map in the form of 2D histogram. 
+
+        """
+        return _libBornAgainCore.OffSpecSimulation_getIntensityData(self)
+
+
+    def setBeamParameters(self, arg2, alpha_axis, phi_i):
+        """
+        setBeamParameters(OffSpecSimulation self, double arg2, IAxis alpha_axis, double phi_i)
+
+        void OffSpecSimulation::setBeamParameters(double lambda, const IAxis &alpha_axis, double phi_i)
+
+        Sets beam parameters from here (forwarded to  Instrument) 
+
+        """
+        return _libBornAgainCore.OffSpecSimulation_setBeamParameters(self, arg2, alpha_axis, phi_i)
+
+
+    def setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max):
+        """
+        setDetectorParameters(OffSpecSimulation self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+        void OffSpecSimulation::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
+
+        Sets detector parameters using angle ranges. 
+
+        """
+        return _libBornAgainCore.OffSpecSimulation_setDetectorParameters(self, n_x, x_min, x_max, n_y, y_min, y_max)
+
+OffSpecSimulation_swigregister = _libBornAgainCore.OffSpecSimulation_swigregister
+OffSpecSimulation_swigregister(OffSpecSimulation)
+
+class IntensityData(_object):
+    """
+
+
+    Template class to store data of any type in multi-dimensional space.Used with data type double to hold simulation results. Used with data type  CumulativeValue in  IHistogram classes. Used with data type bool to hold a detector mask (-> class  DetectorMask)
+
+    C++ includes: OutputData.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IntensityData, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IntensityData, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(OutputData<(double)> self) -> IntensityData
+
+        OutputData< T >::OutputData(const OutputData &)=delete
+
+        """
+        this = _libBornAgainCore.new_IntensityData()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_IntensityData
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IntensityData self) -> IntensityData
+
+        OutputData< T > * OutputData< T >::clone() const 
+
+        """
+        return _libBornAgainCore.IntensityData_clone(self)
+
+
+    def copyFrom(self, x):
+        """
+        copyFrom(IntensityData self, IntensityData x)
+
+        void OutputData< T >::copyFrom(const OutputData< T > &x)
+
+        """
+        return _libBornAgainCore.IntensityData_copyFrom(self, x)
+
+
+    def meanValues(self):
+        """
+        meanValues(IntensityData self) -> IntensityData
+
+        OutputData< double > * OutputData< T >::meanValues() const 
+
+        """
+        return _libBornAgainCore.IntensityData_meanValues(self)
+
+
+    def addAxis(self, *args):
+        """
+        addAxis(IntensityData self, IAxis new_axis)
+        addAxis(IntensityData self, std::string const & name, size_t size, double start, double end)
+
+        void OutputData< T >::addAxis(const std::string &name, size_t size, double start, double end)
+
+        """
+        return _libBornAgainCore.IntensityData_addAxis(self, *args)
+
+
+    def getAxis(self, *args):
+        """
+        getAxis(IntensityData self, size_t serial_number) -> IAxis
+        getAxis(IntensityData self, std::string const & axis_name) -> IAxis
+
+        const IAxis & OutputData< T >::getAxis(const std::string &axis_name) const
+
+        returns axis with given name 
+
+        """
+        return _libBornAgainCore.IntensityData_getAxis(self, *args)
+
+
+    def getRank(self):
+        """
+        getRank(IntensityData self) -> size_t
+
+        size_t OutputData< T >::getRank() const
+
+        Returns number of dimensions. 
+
+        """
+        return _libBornAgainCore.IntensityData_getRank(self)
+
+
+    def getAllocatedSize(self):
+        """
+        getAllocatedSize(IntensityData self) -> size_t
+
+        size_t OutputData< T >::getAllocatedSize() const
+
+        Returns total size of data buffer (product of bin number in every dimension). 
+
+        """
+        return _libBornAgainCore.IntensityData_getAllocatedSize(self)
+
+
+    def getAllSizes(self):
+        """
+        getAllSizes(IntensityData self) -> std::vector< size_t,std::allocator< size_t > >
+
+        std::vector< size_t > OutputData< T >::getAllSizes() const
+
+        Returns all sizes of its axes. 
+
+        """
+        return _libBornAgainCore.IntensityData_getAllSizes(self)
+
+
+    def getRawDataVector(self):
+        """
+        getRawDataVector(IntensityData self) -> vdouble1d_t
+
+        std::vector< T > OutputData< T >::getRawDataVector() const
+
+        Returns copy of raw data vector. 
+
+        """
+        return _libBornAgainCore.IntensityData_getRawDataVector(self)
+
+
+    def fillRawDataArray(self, destination):
+        """
+        fillRawDataArray(IntensityData self, double * destination)
+
+        void OutputData< T >::fillRawDataArray(T *destination) const
+
+        fill raw array with data 
+
+        """
+        return _libBornAgainCore.IntensityData_fillRawDataArray(self, destination)
+
+
+    def totalSum(self):
+        """
+        totalSum(IntensityData self) -> double
+
+        T OutputData< T >::totalSum() const
+
+        Returns sum of all values in the data structure. 
+
+        """
+        return _libBornAgainCore.IntensityData_totalSum(self)
+
+
+    def begin(self, *args):
+        """
+        begin(IntensityData self) -> OutputData< double >::iterator
+        begin(IntensityData self) -> OutputData< double >::const_iterator
+
+        OutputData< T >::const_iterator OutputData< T >::begin() const
+
+        Returns read-only iterator that points to the first element. 
+
+        """
+        return _libBornAgainCore.IntensityData_begin(self, *args)
+
+
+    def end(self, *args):
+        """
+        end(IntensityData self) -> OutputData< double >::iterator
+        end(IntensityData self) -> OutputData< double >::const_iterator
+
+        const_iterator OutputData< T >::end() const
+
+        Returns read-only iterator that points to the one past last element. 
+
+        """
+        return _libBornAgainCore.IntensityData_end(self, *args)
+
+
+    def setVariability(self, variability):
+        """
+        setVariability(IntensityData self, double variability)
+
+        void OutputData< T >::setVariability(double variability)
+
+        """
+        return _libBornAgainCore.IntensityData_setVariability(self, variability)
+
+
+    def getVariability(self):
+        """
+        getVariability(IntensityData self) -> double
+
+        double OutputData< T >::getVariability() const 
+
+        """
+        return _libBornAgainCore.IntensityData_getVariability(self)
+
+
+    def getAxesBinIndices(self, global_index):
+        """
+        getAxesBinIndices(IntensityData self, size_t global_index) -> vector_integer_t
+
+        std::vector< int > OutputData< T >::getAxesBinIndices(size_t global_index) const
+
+        Returns vector of axes indices for given global index
+
+        Parameters:
+        -----------
+
+        global_index: 
+        The global index of this data structure.
+
+        Vector of bin indices for all axes defined 
+
+        """
+        return _libBornAgainCore.IntensityData_getAxesBinIndices(self, global_index)
+
+
+    def getAxisBinIndex(self, *args):
+        """
+        getAxisBinIndex(IntensityData self, size_t global_index, size_t i_selected_axis) -> int
+        getAxisBinIndex(IntensityData self, size_t global_index, std::string const & axis_name) -> int
+
+        int OutputData< T >::getAxisBinIndex(size_t global_index, const std::string &axis_name) const
+
+        Returns axis bin index for given global index
+
+        Parameters:
+        -----------
+
+        global_index: 
+        The global index of this data structure.
+
+        axis_name: 
+        The name of selected axis.
+
+        Corresponding bin index for selected axis 
+
+        """
+        return _libBornAgainCore.IntensityData_getAxisBinIndex(self, *args)
+
+
+    def toGlobalIndex(self, axes_indices):
+        """
+        toGlobalIndex(IntensityData self, vector_integer_t axes_indices) -> size_t
+
+        size_t OutputData< T >::toGlobalIndex(const std::vector< int > &axes_indices) const
+
+        Returns global index for specified indices of axes
+
+        Parameters:
+        -----------
+
+        axes_indices: 
+        Vector of axes indices for all specified axes in this dataset
+
+        Corresponding global index 
+
+        """
+        return _libBornAgainCore.IntensityData_toGlobalIndex(self, axes_indices)
+
+
+    def findGlobalIndex(self, coordinates):
+        """
+        findGlobalIndex(IntensityData self, vdouble1d_t coordinates) -> size_t
+
+        size_t OutputData< T >::findGlobalIndex(const std::vector< double > &coordinates) const
+
+        Returns global index for specified axes values
+
+        Parameters:
+        -----------
+
+        coordinates: 
+        Vector of axes coordinates for all specified axes in this dataset
+
+        Closest global index 
+
+        """
+        return _libBornAgainCore.IntensityData_findGlobalIndex(self, coordinates)
+
+
+    def getAxisValue(self, *args):
+        """
+        getAxisValue(IntensityData self, size_t global_index, size_t i_selected_axis) -> double
+        getAxisValue(IntensityData self, size_t global_index, std::string const & axis_name) -> double
+
+        double OutputData< T >::getAxisValue(size_t global_index, const std::string &axis_name) const
+
+        Returns the value of selected axis for given global_index.
+
+        Parameters:
+        -----------
+
+        global_index: 
+        The global index of this data structure.
+
+        axis_name: 
+        The name of selected axis.
+
+        corresponding bin center of selected axis 
+
+        """
+        return _libBornAgainCore.IntensityData_getAxisValue(self, *args)
+
+
+    def getAxesValues(self, global_index):
+        """
+        getAxesValues(IntensityData self, size_t global_index) -> vdouble1d_t
+
+        std::vector< double > OutputData< T >::getAxesValues(size_t global_index) const
+
+        Returns values on all defined axes for given globalbin number
+
+        Parameters:
+        -----------
+
+        global_index: 
+        The global index of this data structure.
+
+        Vector of corresponding bin centers 
+
+        """
+        return _libBornAgainCore.IntensityData_getAxesValues(self, global_index)
+
+
+    def getAxisBin(self, *args):
+        """
+        getAxisBin(IntensityData self, size_t global_index, size_t i_selected_axis) -> Bin1D
+        getAxisBin(IntensityData self, size_t global_index, std::string const & axis_name) -> Bin1D
+
+        Bin1D OutputData< T >::getAxisBin(size_t global_index, const std::string &axis_name) const
+
+        Returns bin of selected axis for given global_index.
+
+        Parameters:
+        -----------
+
+        global_index: 
+        The global index of this data structure.
+
+        axis_name: 
+        The name of selected axis.
+
+        Corresponding  Bin1D object 
+
+        """
+        return _libBornAgainCore.IntensityData_getAxisBin(self, *args)
+
+
+    def clear(self):
+        """
+        clear(IntensityData self)
+
+        void OutputData< T >::clear()
+
+        Sets object into initial state (no dimensions, data) 
+
+        """
+        return _libBornAgainCore.IntensityData_clear(self)
+
+
+    def setAllTo(self, value):
+        """
+        setAllTo(IntensityData self, double const & value)
+
+        void OutputData< T >::setAllTo(const T &value)
+
+        Sets content of output data to specific value. 
+
+        """
+        return _libBornAgainCore.IntensityData_setAllTo(self, value)
+
+
+    def scaleAll(self, factor):
+        """
+        scaleAll(IntensityData self, double const & factor)
+
+        void OutputData< T >::scaleAll(const T &factor)
+
+        multiply every item of this output data by value 
+
+        """
+        return _libBornAgainCore.IntensityData_scaleAll(self, factor)
+
+
+    def setAxisSizes(self, rank, n_dims):
+        """
+        setAxisSizes(IntensityData self, size_t rank, int * n_dims)
+
+        void OutputData< T >::setAxisSizes(size_t rank, int *n_dims)
+
+        Adds 'rank' axes with indicated sizes. 
+
+        """
+        return _libBornAgainCore.IntensityData_setAxisSizes(self, rank, n_dims)
+
+
+    def setRawDataVector(self, data_vector):
+        """
+        setRawDataVector(IntensityData self, vdouble1d_t data_vector)
+
+        void OutputData< T >::setRawDataVector(const std::vector< T > &data_vector)
+
+        Sets new values to raw data vector. 
+
+        """
+        return _libBornAgainCore.IntensityData_setRawDataVector(self, data_vector)
+
+
+    def setRawDataArray(self, source):
+        """
+        setRawDataArray(IntensityData self, double const * source)
+
+        void OutputData< T >::setRawDataArray(const T *source)
+
+        Sets new values to raw data array. 
+
+        """
+        return _libBornAgainCore.IntensityData_setRawDataArray(self, source)
+
+
+    def __iadd__(self, right):
+        """__iadd__(IntensityData self, IntensityData right) -> IntensityData"""
+        return _libBornAgainCore.IntensityData___iadd__(self, right)
+
+
+    def __isub__(self, right):
+        """__isub__(IntensityData self, IntensityData right) -> IntensityData"""
+        return _libBornAgainCore.IntensityData___isub__(self, right)
+
+
+    def __idiv__(self, right):
+        """__idiv__(IntensityData self, IntensityData right) -> IntensityData"""
+        return _libBornAgainCore.IntensityData___idiv__(self, right)
+
+
+    def __imul__(self, right):
+        """__imul__(IntensityData self, IntensityData right) -> IntensityData"""
+        return _libBornAgainCore.IntensityData___imul__(self, right)
+
+
+    def getValue(self, index):
+        """
+        getValue(IntensityData self, size_t index) -> double
+
+        double OutputData< T >::getValue(size_t index) const
+
+        Returns value or summed value, depending on T. 
+
+        """
+        return _libBornAgainCore.IntensityData_getValue(self, index)
+
+
+    def getArray(self):
+        """getArray(IntensityData self) -> PyObject *"""
+        return _libBornAgainCore.IntensityData_getArray(self)
+
+
+    def isInitialized(self):
+        """
+        isInitialized(IntensityData self) -> bool
+
+        bool OutputData< T >::isInitialized() const
+
+        returns data as Python numpy array
+
+        returns true if object is correctly initialized 
+
+        """
+        return _libBornAgainCore.IntensityData_isInitialized(self)
+
+
+    def allocate(self):
+        """
+        allocate(IntensityData self)
+
+        void OutputData< T >::allocate()
+
+        memory allocation for current dimensions configuration 
+
+        """
+        return _libBornAgainCore.IntensityData_allocate(self)
+
+
+    def __getitem__(self, i):
+        """__getitem__(IntensityData self, unsigned int i) -> double"""
+        return _libBornAgainCore.IntensityData___getitem__(self, i)
+
+
+    def __setitem__(self, i, value):
+        """__setitem__(IntensityData self, unsigned int i, double value) -> double"""
+        return _libBornAgainCore.IntensityData___setitem__(self, i, value)
+
+IntensityData_swigregister = _libBornAgainCore.IntensityData_swigregister
+IntensityData_swigregister(IntensityData)
+
+class ParameterDistribution(IParameterized):
+    """Proxy of C++ ParameterDistribution class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ParameterDistribution, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ParameterDistribution, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(ParameterDistribution self, std::string const & par_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0, RealLimits limits) -> ParameterDistribution
+        __init__(ParameterDistribution self, std::string const & par_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0) -> ParameterDistribution
+        __init__(ParameterDistribution self, std::string const & par_name, IDistribution1D distribution, size_t nbr_samples) -> ParameterDistribution
+        __init__(ParameterDistribution self, std::string const & par_name, IDistribution1D distribution, size_t nbr_samples, double xmin, double xmax) -> ParameterDistribution
+        __init__(ParameterDistribution self, ParameterDistribution other) -> ParameterDistribution
+
+        ParameterDistribution::ParameterDistribution(const ParameterDistribution &other)
+
+        """
+        this = _libBornAgainCore.new_ParameterDistribution(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ParameterDistribution
+    __del__ = lambda self: None
+
+    def linkParameter(self, par_name):
+        """
+        linkParameter(ParameterDistribution self, std::string par_name) -> ParameterDistribution
+
+        ParameterDistribution & ParameterDistribution::linkParameter(std::string par_name)
+
+        """
+        return _libBornAgainCore.ParameterDistribution_linkParameter(self, par_name)
+
+
+    def getMainParameterName(self):
+        """
+        getMainParameterName(ParameterDistribution self) -> std::string
+
+        std::string ParameterDistribution::getMainParameterName() const
+
+        get the main parameter's name 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getMainParameterName(self)
+
+
+    def getNbrSamples(self):
+        """
+        getNbrSamples(ParameterDistribution self) -> size_t
+
+        size_t ParameterDistribution::getNbrSamples() const
+
+        get number of samples for this distribution 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getNbrSamples(self)
+
+
+    def getSigmaFactor(self):
+        """
+        getSigmaFactor(ParameterDistribution self) -> double
+
+        double ParameterDistribution::getSigmaFactor() const
+
+        get the sigma factor 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getSigmaFactor(self)
+
+
+    def getDistribution(self):
+        """
+        getDistribution(ParameterDistribution self) -> IDistribution1D
+
+        const IDistribution1D * ParameterDistribution::getDistribution() const 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getDistribution(self)
+
+
+    def generateSamples(self):
+        """
+        generateSamples(ParameterDistribution self) -> std::vector< ParameterSample,std::allocator< ParameterSample > >
+
+        std::vector< ParameterSample > ParameterDistribution::generateSamples() const
+
+        generate list of sampled values with their weight 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_generateSamples(self)
+
+
+    def getLinkedParameterNames(self):
+        """
+        getLinkedParameterNames(ParameterDistribution self) -> vector_string_t
+
+        std::vector<std::string> ParameterDistribution::getLinkedParameterNames() const
+
+        get list of linked parameter names 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getLinkedParameterNames(self)
+
+
+    def getLimits(self):
+        """
+        getLimits(ParameterDistribution self) -> RealLimits
+
+        RealLimits ParameterDistribution::getLimits() const 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getLimits(self)
+
+
+    def getMinValue(self):
+        """
+        getMinValue(ParameterDistribution self) -> double
+
+        double ParameterDistribution::getMinValue() const 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getMinValue(self)
+
+
+    def getMaxValue(self):
+        """
+        getMaxValue(ParameterDistribution self) -> double
+
+        double ParameterDistribution::getMaxValue() const 
+
+        """
+        return _libBornAgainCore.ParameterDistribution_getMaxValue(self)
+
+ParameterDistribution_swigregister = _libBornAgainCore.ParameterDistribution_swigregister
+ParameterDistribution_swigregister(ParameterDistribution)
+
+class ParameterPool(_object):
+    """
+
+
+    Holds a map of pointers to parameters.Used in  IParameterized, which has a member ParameterPool* m_pool. So this is pimpl (pointer to implementation) idiom, with  ParameterPool providing the implementation of all the nontrivial functionality of  IParameterized.
+
+    Parameter names must be unique since we use them as map keys.
+
+    C++ includes: ParameterPool.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ParameterPool, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, ParameterPool, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, name, onChange):
+        """
+        __init__(ParameterPool self, std::string const & name, std::function< void () > const & onChange) -> ParameterPool
+
+        ParameterPool::ParameterPool(const ParameterPool &)=delete
+
+        """
+        this = _libBornAgainCore.new_ParameterPool(name, onChange)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ParameterPool
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ParameterPool self) -> ParameterPool
+
+        ParameterPool * ParameterPool::clone() const
+
+        Returns a literal clone. 
+
+        """
+        return _libBornAgainCore.ParameterPool_clone(self)
+
+
+    def cloneWithPrefix(self, prefix):
+        """
+        cloneWithPrefix(ParameterPool self, std::string const & prefix) -> ParameterPool
+
+        ParameterPool * ParameterPool::cloneWithPrefix(const std::string &prefix) const
+
+        Returns a clone with  prefix prepended to every parameter key. 
+
+        """
+        return _libBornAgainCore.ParameterPool_cloneWithPrefix(self, prefix)
+
+
+    def copyToExternalPool(self, prefix, external_pool):
+        """
+        copyToExternalPool(ParameterPool self, std::string const & prefix, ParameterPool external_pool)
+
+        void ParameterPool::copyToExternalPool(const std::string &prefix, ParameterPool *external_pool) const
+
+        Copies parameters of given pool to  other pool, prepeding  prefix to the parameter names. 
+
+        """
+        return _libBornAgainCore.ParameterPool_copyToExternalPool(self, prefix, external_pool)
+
+
+    def clear(self):
+        """
+        clear(ParameterPool self)
+
+        void ParameterPool::clear()
+
+        Clears the parameter map. 
+
+        """
+        return _libBornAgainCore.ParameterPool_clear(self)
+
+
+    def getName(self):
+        """
+        getName(ParameterPool self) -> std::string
+
+        std::string ParameterPool::getName() const 
+
+        """
+        return _libBornAgainCore.ParameterPool_getName(self)
+
+
+    def size(self):
+        """
+        size(ParameterPool self) -> size_t
+
+        size_t ParameterPool::size() const
+
+        Returns number of parameters in the pool. 
+
+        """
+        return _libBornAgainCore.ParameterPool_size(self)
+
+
+    def addParameter(self, par):
+        """
+        addParameter(ParameterPool self, RealParameter par) -> RealParameter
+
+        RealParameter & ParameterPool::addParameter(RealParameter *par)
+
+        Adds parameter to the pool, and returns reference to the input pointer.
+
+        Returning the input pointer allows us to concatenate function calls like pool->addParameter( new  RealParameter(...) ).setLimits(-1,+1).setFixed().setUnit("nm") 
+
+        """
+        return _libBornAgainCore.ParameterPool_addParameter(self, par)
+
+
+    def getParameter(self, *args):
+        """
+        getParameter(ParameterPool self, std::string const & name) -> RealParameter
+        getParameter(ParameterPool self, std::string const & name) -> RealParameter
+
+        const RealParameter * ParameterPool::getParameter(const std::string &name) const
+
+        Returns parameter with given  name. 
+
+        """
+        return _libBornAgainCore.ParameterPool_getParameter(self, *args)
+
+
+    def getParameters(self):
+        """
+        getParameters(ParameterPool self) -> std::vector< RealParameter *,std::allocator< RealParameter * > > const
+
+        const std::vector<RealParameter*> ParameterPool::getParameters() const
+
+        Returns full vector of parameters. 
+
+        """
+        return _libBornAgainCore.ParameterPool_getParameters(self)
+
+
+    def getMatchedParameters(self, wildcards):
+        """
+        getMatchedParameters(ParameterPool self, std::string const & wildcards) -> std::vector< RealParameter *,std::allocator< RealParameter * > >
+
+        std::vector< RealParameter * > ParameterPool::getMatchedParameters(const std::string &wildcards) const
+
+        Returns vector of parameters that match the  pattern (wildcards '*' allowed). 
+
+        """
+        return _libBornAgainCore.ParameterPool_getMatchedParameters(self, wildcards)
+
+
+    def setParameterValue(self, name, value):
+        """
+        setParameterValue(ParameterPool self, std::string const & name, double value)
+
+        void ParameterPool::setParameterValue(const std::string &name, double value)
+
+        Sets parameter value. 
+
+        """
+        return _libBornAgainCore.ParameterPool_setParameterValue(self, name, value)
+
+
+    def setMatchedParametersValue(self, wildcards, value):
+        """
+        setMatchedParametersValue(ParameterPool self, std::string const & wildcards, double value) -> int
+
+        int ParameterPool::setMatchedParametersValue(const std::string &wildcards, double value)
+
+        Sets parameter value. 
+
+        """
+        return _libBornAgainCore.ParameterPool_setMatchedParametersValue(self, wildcards, value)
+
+
+    def getParameterNames(self):
+        """
+        getParameterNames(ParameterPool self) -> vector_string_t
+
+        std::vector< std::string > ParameterPool::getParameterNames() const 
+
+        """
+        return _libBornAgainCore.ParameterPool_getParameterNames(self)
+
+ParameterPool_swigregister = _libBornAgainCore.ParameterPool_swigregister
+ParameterPool_swigregister(ParameterPool)
+
+class Particle(IParticle):
+    """
+
+
+    A particle with a form factor and refractive index.
+
+    C++ includes: Particle.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParticle]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Particle, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParticle]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Particle, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Particle self) -> Particle
+        __init__(Particle self, IMaterial p_material) -> Particle
+        __init__(Particle self, IMaterial p_material, IFormFactor form_factor) -> Particle
+        __init__(Particle self, IMaterial p_material, IFormFactor form_factor, IRotation rotation) -> Particle
+
+        Particle::Particle(const IMaterial &p_material, const IFormFactor &form_factor, const IRotation &rotation)
+
+        """
+        this = _libBornAgainCore.new_Particle(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(Particle self) -> Particle
+
+        Particle * Particle::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.Particle_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(Particle self) -> Particle
+
+        Particle * Particle::cloneInvertB() const
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.Particle_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(Particle self, ISampleVisitor visitor)
+
+        virtual void Particle::accept(ISampleVisitor *visitor) const
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.Particle_accept(self, visitor)
+
+
+    def to_str(self, indent=0):
+        """
+        to_str(Particle self, int indent=0) -> std::string
+        to_str(Particle self) -> std::string
+
+        std::string Particle::to_str(int indent=0) const
+
+        Returns textual representation of this and its descendants. 
+
+        """
+        return _libBornAgainCore.Particle_to_str(self, indent)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(Particle self, IMaterial material)
+
+        void Particle::setAmbientMaterial(const IMaterial &material) final
+
+        Sets the refractive index of the ambient material (which influences its scattering power) 
+
+        """
+        return _libBornAgainCore.Particle_setAmbientMaterial(self, material)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(Particle self) -> IMaterial
+
+        const IMaterial* Particle::getAmbientMaterial() const final
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.Particle_getAmbientMaterial(self)
+
+
+    def createTransformedFormFactor(self, p_rotation, translation):
+        """
+        createTransformedFormFactor(Particle self, IRotation p_rotation, kvector_t translation) -> IFormFactor
+
+        IFormFactor * Particle::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+        Create a form factor for this particle with an extra scattering factor. 
+
+        """
+        return _libBornAgainCore.Particle_createTransformedFormFactor(self, p_rotation, translation)
+
+
+    def setMaterial(self, material):
+        """
+        setMaterial(Particle self, IMaterial material)
+
+        void Particle::setMaterial(const IMaterial &material)
+
+        """
+        return _libBornAgainCore.Particle_setMaterial(self, material)
+
+
+    def getMaterial(self):
+        """
+        getMaterial(Particle self) -> IMaterial
+
+        const IMaterial* Particle::getMaterial() const
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.Particle_getMaterial(self)
+
+
+    def getRefractiveIndex(self):
+        """
+        getRefractiveIndex(Particle self) -> complex_t
+
+        complex_t Particle::getRefractiveIndex() const 
+
+        """
+        return _libBornAgainCore.Particle_getRefractiveIndex(self)
+
+
+    def setFormFactor(self, form_factor):
+        """
+        setFormFactor(Particle self, IFormFactor form_factor)
+
+        void Particle::setFormFactor(const IFormFactor &form_factor)
+
+        """
+        return _libBornAgainCore.Particle_setFormFactor(self, form_factor)
+
+
+    def getFormFactor(self):
+        """
+        getFormFactor(Particle self) -> IFormFactor
+
+        const IFormFactor* Particle::getFormFactor() const 
+
+        """
+        return _libBornAgainCore.Particle_getFormFactor(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_Particle
+    __del__ = lambda self: None
+Particle_swigregister = _libBornAgainCore.Particle_swigregister
+Particle_swigregister(Particle)
+
+class ParticleComposition(IParticle):
+    """
+
+
+    A composition of particles at fixed positions
+
+    C++ includes: ParticleComposition.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParticle]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ParticleComposition, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParticle]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ParticleComposition, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(ParticleComposition self) -> ParticleComposition
+        __init__(ParticleComposition self, IParticle particle) -> ParticleComposition
+        __init__(ParticleComposition self, IParticle particle, kvector_t position) -> ParticleComposition
+        __init__(ParticleComposition self, IParticle particle, vector_kvector_t positions) -> ParticleComposition
+
+        ParticleComposition::ParticleComposition(const IParticle &particle, std::vector< kvector_t > positions)
+
+        """
+        this = _libBornAgainCore.new_ParticleComposition(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ParticleComposition
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ParticleComposition self) -> ParticleComposition
+
+        ParticleComposition * ParticleComposition::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.ParticleComposition_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(ParticleComposition self) -> ParticleComposition
+
+        ParticleComposition * ParticleComposition::cloneInvertB() const
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.ParticleComposition_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(ParticleComposition self, ISampleVisitor visitor)
+
+        virtual void ParticleComposition::accept(ISampleVisitor *visitor) const
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.ParticleComposition_accept(self, visitor)
+
+
+    def addParticle(self, *args):
+        """
+        addParticle(ParticleComposition self, IParticle particle)
+        addParticle(ParticleComposition self, IParticle particle, kvector_t position)
+
+        void ParticleComposition::addParticle(const IParticle &particle, kvector_t position)
+
+        """
+        return _libBornAgainCore.ParticleComposition_addParticle(self, *args)
+
+
+    def addParticles(self, particle, positions):
+        """
+        addParticles(ParticleComposition self, IParticle particle, vector_kvector_t positions)
+
+        void ParticleComposition::addParticles(const IParticle &particle, std::vector< kvector_t > positions)
+
+        """
+        return _libBornAgainCore.ParticleComposition_addParticles(self, particle, positions)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(ParticleComposition self, IMaterial material)
+
+        void ParticleComposition::setAmbientMaterial(const IMaterial &material)
+
+        Sets the refractive index of the ambient material (which influences its scattering power) 
+
+        """
+        return _libBornAgainCore.ParticleComposition_setAmbientMaterial(self, material)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(ParticleComposition self) -> IMaterial
+
+        const IMaterial * ParticleComposition::getAmbientMaterial() const
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.ParticleComposition_getAmbientMaterial(self)
+
+
+    def createTransformedFormFactor(self, p_rotation, translation):
+        """
+        createTransformedFormFactor(ParticleComposition self, IRotation p_rotation, kvector_t translation) -> IFormFactor
+
+        IFormFactor * ParticleComposition::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+        Create a form factor for this particle with an extra scattering factor. 
+
+        """
+        return _libBornAgainCore.ParticleComposition_createTransformedFormFactor(self, p_rotation, translation)
+
+
+    def getNbrParticles(self):
+        """
+        getNbrParticles(ParticleComposition self) -> size_t
+
+        size_t ParticleComposition::getNbrParticles() const
+
+        Returns number of different particles. 
+
+        """
+        return _libBornAgainCore.ParticleComposition_getNbrParticles(self)
+
+
+    def getParticle(self, index):
+        """
+        getParticle(ParticleComposition self, size_t index) -> IParticle
+
+        const IParticle * ParticleComposition::getParticle(size_t index) const
+
+        Returns particle with given index. 
+
+        """
+        return _libBornAgainCore.ParticleComposition_getParticle(self, index)
+
+
+    def getParticlePosition(self, index):
+        """
+        getParticlePosition(ParticleComposition self, size_t index) -> kvector_t
+
+        kvector_t ParticleComposition::getParticlePosition(size_t index) const 
+
+        """
+        return _libBornAgainCore.ParticleComposition_getParticlePosition(self, index)
+
+ParticleComposition_swigregister = _libBornAgainCore.ParticleComposition_swigregister
+ParticleComposition_swigregister(ParticleComposition)
+
+class ParticleCoreShell(IParticle):
+    """
+
+
+    A particle with a core/shell geometry.
+
+    C++ includes: ParticleCoreShell.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParticle]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ParticleCoreShell, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParticle]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ParticleCoreShell, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(ParticleCoreShell self, Particle shell, Particle core, kvector_t relative_core_position) -> ParticleCoreShell
+        __init__(ParticleCoreShell self, Particle shell, Particle core) -> ParticleCoreShell
+
+        ParticleCoreShell::ParticleCoreShell(const Particle &shell, const Particle &core, kvector_t relative_core_position=kvector_t(0.0, 0.0, 0.0))
+
+        """
+        this = _libBornAgainCore.new_ParticleCoreShell(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ParticleCoreShell
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ParticleCoreShell self) -> ParticleCoreShell
+
+        ParticleCoreShell * ParticleCoreShell::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(ParticleCoreShell self) -> ParticleCoreShell
+
+        ParticleCoreShell * ParticleCoreShell::cloneInvertB() const
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(ParticleCoreShell self, ISampleVisitor visitor)
+
+        virtual void ParticleCoreShell::accept(ISampleVisitor *visitor) const
+
+        Calls the  ISampleVisitor's visit method. 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_accept(self, visitor)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(ParticleCoreShell self, IMaterial material)
+
+        void ParticleCoreShell::setAmbientMaterial(const IMaterial &material)
+
+        Sets the refractive index of the ambient material (which influences its scattering power) 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_setAmbientMaterial(self, material)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(ParticleCoreShell self) -> IMaterial
+
+        const IMaterial * ParticleCoreShell::getAmbientMaterial() const
+
+        Returns nullptr, unless overwritten to return a specific material. 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_getAmbientMaterial(self)
+
+
+    def createTransformedFormFactor(self, p_rotation, translation):
+        """
+        createTransformedFormFactor(ParticleCoreShell self, IRotation p_rotation, kvector_t translation) -> IFormFactor
+
+        IFormFactor * ParticleCoreShell::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const
+
+        Create a form factor for this particle with an extra scattering factor. 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_createTransformedFormFactor(self, p_rotation, translation)
+
+
+    def getCoreParticle(self):
+        """
+        getCoreParticle(ParticleCoreShell self) -> Particle
+
+        const Particle* ParticleCoreShell::getCoreParticle() const
+
+        Returns the core particle. 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_getCoreParticle(self)
+
+
+    def getShellParticle(self):
+        """
+        getShellParticle(ParticleCoreShell self) -> Particle
+
+        const Particle* ParticleCoreShell::getShellParticle() const
+
+        Returns the shell particle. 
+
+        """
+        return _libBornAgainCore.ParticleCoreShell_getShellParticle(self)
+
+ParticleCoreShell_swigregister = _libBornAgainCore.ParticleCoreShell_swigregister
+ParticleCoreShell_swigregister(ParticleCoreShell)
+
+class ParticleDistribution(IAbstractParticle):
+    """
+
+
+    A particle type that is a parametric distribution of  IParticle's.
+
+    C++ includes: ParticleDistribution.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IAbstractParticle]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ParticleDistribution, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IAbstractParticle]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ParticleDistribution, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, prototype, par_distr):
+        """
+        __init__(ParticleDistribution self, IParticle prototype, ParameterDistribution par_distr) -> ParticleDistribution
+
+        ParticleDistribution::ParticleDistribution(const IParticle &prototype, const ParameterDistribution &par_distr)
+
+        """
+        this = _libBornAgainCore.new_ParticleDistribution(prototype, par_distr)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(ParticleDistribution self) -> ParticleDistribution
+
+        ParticleDistribution * ParticleDistribution::clone() const
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(ParticleDistribution self) -> ParticleDistribution
+
+        ParticleDistribution * ParticleDistribution::cloneInvertB() const
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(ParticleDistribution self, ISampleVisitor visitor)
+
+        void ParticleDistribution::accept(ISampleVisitor *visitor) const
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_accept(self, visitor)
+
+
+    def to_str(self, indent=0):
+        """
+        to_str(ParticleDistribution self, int indent=0) -> std::string
+        to_str(ParticleDistribution self) -> std::string
+
+        std::string ParticleDistribution::to_str(int indent=0) const
+
+        Returns textual representation of* this and its descendants. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_to_str(self, indent)
+
+
+    def setAmbientMaterial(self, material):
+        """
+        setAmbientMaterial(ParticleDistribution self, IMaterial material)
+
+        void ParticleDistribution::setAmbientMaterial(const IMaterial &material)
+
+        Sets the refractive index of the ambient material (which influences its scattering power) 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_setAmbientMaterial(self, material)
+
+
+    def getAmbientMaterial(self):
+        """
+        getAmbientMaterial(ParticleDistribution self) -> IMaterial
+
+        const IMaterial * ParticleDistribution::getAmbientMaterial() const
+
+        Returns particle's material. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_getAmbientMaterial(self)
+
+
+    def generateParticles(self, particle_vector):
+        """
+        generateParticles(ParticleDistribution self, std::vector< IParticle const *,std::allocator< IParticle const * > > & particle_vector)
+
+        void ParticleDistribution::generateParticles(std::vector< const IParticle * > &particle_vector) const
+
+        Initializes list of new particles generated according to a distribution. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_generateParticles(self, particle_vector)
+
+
+    def getParameterDistribution(self):
+        """
+        getParameterDistribution(ParticleDistribution self) -> ParameterDistribution
+
+        ParameterDistribution ParticleDistribution::getParameterDistribution() const
+
+        Returns the distributed parameter data. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_getParameterDistribution(self)
+
+
+    def createDistributedParameterPool(self):
+        """
+        createDistributedParameterPool(ParticleDistribution self) -> ParameterPool
+
+        ParameterPool * ParticleDistribution::createDistributedParameterPool() const
+
+        Returns the parameter pool that can be used for parameter distributions. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_createDistributedParameterPool(self)
+
+
+    def getParticle(self):
+        """
+        getParticle(ParticleDistribution self) -> IParticle
+
+        const IParticle * ParticleDistribution::getParticle() const
+
+        Returns particle. 
+
+        """
+        return _libBornAgainCore.ParticleDistribution_getParticle(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_ParticleDistribution
+    __del__ = lambda self: None
+ParticleDistribution_swigregister = _libBornAgainCore.ParticleDistribution_swigregister
+ParticleDistribution_swigregister(ParticleDistribution)
+
+class ParticleLayout(ILayout):
+    """
+
+
+    Decorator class that adds particles to  ISample objects.
+
+    C++ includes: ParticleLayout.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ILayout]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ParticleLayout, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ILayout]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ParticleLayout, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(ParticleLayout self) -> ParticleLayout
+        __init__(ParticleLayout self, IAbstractParticle particle) -> ParticleLayout
+        __init__(ParticleLayout self, IAbstractParticle particle, double abundance) -> ParticleLayout
+
+        ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance)
+
+        """
+        this = _libBornAgainCore.new_ParticleLayout(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_ParticleLayout
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(ParticleLayout self) -> ParticleLayout
+
+        ParticleLayout * ParticleLayout::clone() const final
+
+        Returns a clone of this  ISample object. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_clone(self)
+
+
+    def cloneInvertB(self):
+        """
+        cloneInvertB(ParticleLayout self) -> ParticleLayout
+
+        ParticleLayout * ParticleLayout::cloneInvertB() const final
+
+        Returns a clone with inverted magnetic fields. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_cloneInvertB(self)
+
+
+    def accept(self, visitor):
+        """
+        accept(ParticleLayout self, ISampleVisitor visitor)
+
+        void ParticleLayout::accept(ISampleVisitor *visitor) const final
+
+        calls the  ISampleVisitor's visit method 
+
+        """
+        return _libBornAgainCore.ParticleLayout_accept(self, visitor)
+
+
+    def addParticle(self, *args):
+        """
+        addParticle(ParticleLayout self, IAbstractParticle particle)
+        addParticle(ParticleLayout self, IAbstractParticle particle, double abundance)
+        addParticle(ParticleLayout self, IParticle particle, double abundance, kvector_t position)
+        addParticle(ParticleLayout self, IParticle particle, double abundance, kvector_t position, IRotation rotation)
+
+        void ParticleLayout::addParticle(const IParticle &particle, double abundance, const kvector_t position, const IRotation &rotation)
+
+        Adds particle to the layout with abundance, position and the rotation defined.
+
+        Parameters:
+        -----------
+
+        particle: 
+        to be added
+
+        abundance: 
+         Particle abundance
+
+        position: 
+         Particle position
+
+        rotation: 
+         Particle rotation 
+
+        """
+        return _libBornAgainCore.ParticleLayout_addParticle(self, *args)
+
+
+    def getNumberOfParticles(self):
+        """
+        getNumberOfParticles(ParticleLayout self) -> size_t
+
+        size_t ParticleLayout::getNumberOfParticles() const final
+
+        Returns number of particles. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_getNumberOfParticles(self)
+
+
+    def getParticle(self, index):
+        """
+        getParticle(ParticleLayout self, size_t index) -> IAbstractParticle
+
+        const IAbstractParticle * ParticleLayout::getParticle(size_t index) const final
+
+        Returns particle info. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_getParticle(self, index)
+
+
+    def getParticles(self):
+        """
+        getParticles(ParticleLayout self) -> SafePointerVector< IParticle const >
+
+        SafePointerVector< const IParticle > ParticleLayout::getParticles() const final
+
+        Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection 
+
+        """
+        return _libBornAgainCore.ParticleLayout_getParticles(self)
+
+
+    def getAbundanceOfParticle(self, index):
+        """
+        getAbundanceOfParticle(ParticleLayout self, size_t index) -> double
+
+        double ParticleLayout::getAbundanceOfParticle(size_t index) const
+
+        Returns the abundance fraction of particle at given index. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_getAbundanceOfParticle(self, index)
+
+
+    def getInterferenceFunction(self):
+        """
+        getInterferenceFunction(ParticleLayout self) -> IInterferenceFunction
+
+        const IInterferenceFunction* ParticleLayout::getInterferenceFunction() const final
+
+        Returns interference function. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_getInterferenceFunction(self)
+
+
+    def cloneInterferenceFunction(self):
+        """
+        cloneInterferenceFunction(ParticleLayout self) -> IInterferenceFunction
+
+        IInterferenceFunction * ParticleLayout::cloneInterferenceFunction() const final
+
+        Returns a clone, or an  InterferenceFunctionNone. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_cloneInterferenceFunction(self)
+
+
+    def addInterferenceFunction(self, interference_function):
+        """
+        addInterferenceFunction(ParticleLayout self, IInterferenceFunction interference_function)
+
+        void ParticleLayout::addInterferenceFunction(const IInterferenceFunction &interference_function)
+
+        Adds interference functions. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_addInterferenceFunction(self, interference_function)
+
+
+    def getTotalParticleSurfaceDensity(self):
+        """
+        getTotalParticleSurfaceDensity(ParticleLayout self) -> double
+
+        double ParticleLayout::getTotalParticleSurfaceDensity() const final
+
+        Returns surface density of all particles. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_getTotalParticleSurfaceDensity(self)
+
+
+    def setTotalParticleSurfaceDensity(self, particle_density):
+        """
+        setTotalParticleSurfaceDensity(ParticleLayout self, double particle_density)
+
+        void ParticleLayout::setTotalParticleSurfaceDensity(double particle_density) final
+
+        Sets surface density of all particles. 
+
+        """
+        return _libBornAgainCore.ParticleLayout_setTotalParticleSurfaceDensity(self, particle_density)
+
+ParticleLayout_swigregister = _libBornAgainCore.ParticleLayout_swigregister
+ParticleLayout_swigregister(ParticleLayout)
+
+class Polygon(IShape2D):
+    """
+
+
+    A polygon in 2D space.Polygon defined by two arrays with x and y coordinates of points. Sizes of arrays should coincide. If polygon is unclosed (the last point doesn't repeat the first one), it will be closed automatically.
+
+    C++ includes: Polygon.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Polygon, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Polygon, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(Geometry::Polygon self, vdouble1d_t x, vdouble1d_t y) -> Polygon
+        __init__(Geometry::Polygon self, vdouble2d_t points) -> Polygon
+        __init__(Geometry::Polygon self, Geometry::PolygonPrivate const * d) -> Polygon
+
+        Geometry::Polygon::Polygon(const PolygonPrivate *d)
+
+        """
+        this = _libBornAgainCore.new_Polygon(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_Polygon
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(Polygon self) -> Polygon
+
+        virtual Polygon* Geometry::Polygon::clone() const 
+
+        """
+        return _libBornAgainCore.Polygon_clone(self)
+
+
+    def contains(self, *args):
+        """
+        contains(Polygon self, double x, double y) -> bool
+        contains(Polygon self, Bin1D binx, Bin1D biny) -> bool
+
+        bool Geometry::Polygon::contains(const Bin1D &binx, const Bin1D &biny) const
+
+        Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+
+        """
+        return _libBornAgainCore.Polygon_contains(self, *args)
+
+
+    def getArea(self):
+        """
+        getArea(Polygon self) -> double
+
+        double Geometry::Polygon::getArea() const 
+
+        """
+        return _libBornAgainCore.Polygon_getArea(self)
+
+
+    def getPoints(self, xpos, ypos):
+        """
+        getPoints(Polygon self, vdouble1d_t xpos, vdouble1d_t ypos)
+
+        void Geometry::Polygon::getPoints(std::vector< double > &xpos, std::vector< double > &ypos) const 
+
+        """
+        return _libBornAgainCore.Polygon_getPoints(self, xpos, ypos)
+
+Polygon_swigregister = _libBornAgainCore.Polygon_swigregister
+Polygon_swigregister(Polygon)
+
+class RealParameter(IParameterReal):
+    """
+
+
+    Wraps a parameter of type double. In addition to name and on-change callback held by the parent class  IParameter, this class holds Limits, Attributes (currently only fixed or not), and a  Unit.
+
+    C++ includes: RealParameter.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IParameterReal]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, RealParameter, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IParameterReal]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, RealParameter, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(RealParameter self, std::string const & name, double volatile * par, std::string const & parent_name, std::function< void () > const & onChange, RealLimits limits, Attributes attr) -> RealParameter
+        __init__(RealParameter self, std::string const & name, double volatile * par, std::string const & parent_name, std::function< void () > const & onChange, RealLimits limits) -> RealParameter
+        __init__(RealParameter self, std::string const & name, double volatile * par, std::string const & parent_name, std::function< void () > const & onChange) -> RealParameter
+
+        RealParameter::RealParameter(const std::string &name, volatile double *par, const std::string &parent_name, const std::function< void()> &onChange, const RealLimits &limits=RealLimits::limitless(), const Attributes &attr=Attributes::free())
+
+        """
+        this = _libBornAgainCore.new_RealParameter(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self, *args):
+        """
+        clone(RealParameter self, std::string const & new_name) -> RealParameter
+        clone(RealParameter self) -> RealParameter
+
+        RealParameter * RealParameter::clone(const std::string &new_name="") const 
+
+        """
+        return _libBornAgainCore.RealParameter_clone(self, *args)
+
+
+    def setValue(self, value):
+        """
+        setValue(RealParameter self, double value)
+
+        void RealParameter::setValue(double value)
+
+        Sets value of wrapped parameter and emit signal. 
+
+        """
+        return _libBornAgainCore.RealParameter_setValue(self, value)
+
+
+    def getValue(self):
+        """
+        getValue(RealParameter self) -> double
+
+        double RealParameter::getValue() const
+
+        Returns value of wrapped parameter. 
+
+        """
+        return _libBornAgainCore.RealParameter_getValue(self)
+
+
+    def setLimits(self, limits):
+        """
+        setLimits(RealParameter self, RealLimits limits) -> RealParameter
+
+        RealParameter& RealParameter::setLimits(const RealLimits &limits)
+
+        """
+        return _libBornAgainCore.RealParameter_setLimits(self, limits)
+
+
+    def getLimits(self):
+        """
+        getLimits(RealParameter self) -> RealLimits
+
+        RealLimits RealParameter::getLimits() const 
+
+        """
+        return _libBornAgainCore.RealParameter_getLimits(self)
+
+
+    def setLimited(self, lower, upper):
+        """
+        setLimited(RealParameter self, double lower, double upper) -> RealParameter
+
+        RealParameter & RealParameter::setLimited(double lower, double upper)
+
+        """
+        return _libBornAgainCore.RealParameter_setLimited(self, lower, upper)
+
+
+    def setPositive(self):
+        """
+        setPositive(RealParameter self) -> RealParameter
+
+        RealParameter & RealParameter::setPositive()
+
+        """
+        return _libBornAgainCore.RealParameter_setPositive(self)
+
+
+    def setNonnegative(self):
+        """
+        setNonnegative(RealParameter self) -> RealParameter
+
+        RealParameter & RealParameter::setNonnegative()
+
+        """
+        return _libBornAgainCore.RealParameter_setNonnegative(self)
+
+
+    def __eq__(self, other):
+        """__eq__(RealParameter self, RealParameter other) -> bool"""
+        return _libBornAgainCore.RealParameter___eq__(self, other)
+
+
+    def setUnit(self, name):
+        """
+        setUnit(RealParameter self, std::string const & name) -> RealParameter
+
+        RealParameter& RealParameter::setUnit(const std::string &name)
+
+        """
+        return _libBornAgainCore.RealParameter_setUnit(self, name)
+
+
+    def unit(self):
+        """
+        unit(RealParameter self) -> std::string
+
+        std::string RealParameter::unit() const 
+
+        """
+        return _libBornAgainCore.RealParameter_unit(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_RealParameter
+    __del__ = lambda self: None
+RealParameter_swigregister = _libBornAgainCore.RealParameter_swigregister
+RealParameter_swigregister(RealParameter)
+
+class Rectangle(IShape2D):
+    """
+
+
+    The rectangle shape having its axis aligned to the (non-rotated) coordinate system.
+
+    C++ includes: Rectangle.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, Rectangle, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IShape2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, Rectangle, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, xlow, ylow, xup, yup):
+        """
+        __init__(Geometry::Rectangle self, double xlow, double ylow, double xup, double yup) -> Rectangle
+
+        Geometry::Rectangle::Rectangle(double xlow, double ylow, double xup, double yup)
+
+        Parameters:
+        -----------
+
+        xlow: 
+        x-coordinate of lower left corner
+
+        ylow: 
+        y-coordinate of lower left corner
+
+        xup: 
+        x-coordinate of upper right corner
+
+        yup: 
+        y-coordinate of upper right corner 
+
+        """
+        this = _libBornAgainCore.new_Rectangle(xlow, ylow, xup, yup)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(Rectangle self) -> Rectangle
+
+        Rectangle* Geometry::Rectangle::clone() const 
+
+        """
+        return _libBornAgainCore.Rectangle_clone(self)
+
+
+    def contains(self, *args):
+        """
+        contains(Rectangle self, double x, double y) -> bool
+        contains(Rectangle self, Bin1D binx, Bin1D biny) -> bool
+
+        bool Geometry::Rectangle::contains(const Bin1D &binx, const Bin1D &biny) const
+
+        Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). 
+
+        """
+        return _libBornAgainCore.Rectangle_contains(self, *args)
+
+
+    def getArea(self):
+        """
+        getArea(Rectangle self) -> double
+
+        double Geometry::Rectangle::getArea() const 
+
+        """
+        return _libBornAgainCore.Rectangle_getArea(self)
+
+
+    def getXlow(self):
+        """
+        getXlow(Rectangle self) -> double
+
+        double Geometry::Rectangle::getXlow() const 
+
+        """
+        return _libBornAgainCore.Rectangle_getXlow(self)
+
+
+    def getYlow(self):
+        """
+        getYlow(Rectangle self) -> double
+
+        double Geometry::Rectangle::getYlow() const 
+
+        """
+        return _libBornAgainCore.Rectangle_getYlow(self)
+
+
+    def getXup(self):
+        """
+        getXup(Rectangle self) -> double
+
+        double Geometry::Rectangle::getXup() const 
+
+        """
+        return _libBornAgainCore.Rectangle_getXup(self)
+
+
+    def getYup(self):
+        """
+        getYup(Rectangle self) -> double
+
+        double Geometry::Rectangle::getYup() const 
+
+        """
+        return _libBornAgainCore.Rectangle_getYup(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_Rectangle
+    __del__ = lambda self: None
+Rectangle_swigregister = _libBornAgainCore.Rectangle_swigregister
+Rectangle_swigregister(Rectangle)
+
+class RectangularDetector(IDetector2D):
+    """
+
+
+    A rectangular plane detector with axes and resolution function.
+
+    C++ includes: RectangularDetector.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IDetector2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, RectangularDetector, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IDetector2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, RectangularDetector, name)
+    __repr__ = _swig_repr
+    GENERIC = _libBornAgainCore.RectangularDetector_GENERIC
+    PERPENDICULAR_TO_SAMPLE = _libBornAgainCore.RectangularDetector_PERPENDICULAR_TO_SAMPLE
+    PERPENDICULAR_TO_DIRECT_BEAM = _libBornAgainCore.RectangularDetector_PERPENDICULAR_TO_DIRECT_BEAM
+    PERPENDICULAR_TO_REFLECTED_BEAM = _libBornAgainCore.RectangularDetector_PERPENDICULAR_TO_REFLECTED_BEAM
+    PERPENDICULAR_TO_REFLECTED_BEAM_DPOS = _libBornAgainCore.RectangularDetector_PERPENDICULAR_TO_REFLECTED_BEAM_DPOS
+
+    def __init__(self, *args):
+        """
+        __init__(RectangularDetector self, int nxbins, double width, int nybins, double height) -> RectangularDetector
+        __init__(RectangularDetector self, RectangularDetector other) -> RectangularDetector
+
+        RectangularDetector::RectangularDetector(const RectangularDetector &other)
+
+        """
+        this = _libBornAgainCore.new_RectangularDetector(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def clone(self):
+        """
+        clone(RectangularDetector self) -> RectangularDetector
+
+        RectangularDetector * RectangularDetector::clone() const override
+
+        """
+        return _libBornAgainCore.RectangularDetector_clone(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_RectangularDetector
+    __del__ = lambda self: None
+
+    def init(self, beam):
+        """
+        init(RectangularDetector self, Beam beam)
+
+        void RectangularDetector::init(const Beam &beam) override
+
+        Inits detector with the beam settings. 
+
+        """
+        return _libBornAgainCore.RectangularDetector_init(self, beam)
+
+
+    def setPosition(self, *args):
+        """
+        setPosition(RectangularDetector self, kvector_t normal_to_detector, double u0, double v0, kvector_t direction)
+        setPosition(RectangularDetector self, kvector_t normal_to_detector, double u0, double v0)
+
+        void RectangularDetector::setPosition(const kvector_t normal_to_detector, double u0, double v0, const kvector_t direction=kvector_t(0.0,-1.0, 0.0))
+
+        """
+        return _libBornAgainCore.RectangularDetector_setPosition(self, *args)
+
+
+    def setPerpendicularToSampleX(self, distance, u0, v0):
+        """
+        setPerpendicularToSampleX(RectangularDetector self, double distance, double u0, double v0)
+
+        void RectangularDetector::setPerpendicularToSampleX(double distance, double u0, double v0)
+
+        """
+        return _libBornAgainCore.RectangularDetector_setPerpendicularToSampleX(self, distance, u0, v0)
+
+
+    def setPerpendicularToDirectBeam(self, distance, u0, v0):
+        """
+        setPerpendicularToDirectBeam(RectangularDetector self, double distance, double u0, double v0)
+
+        void RectangularDetector::setPerpendicularToDirectBeam(double distance, double u0, double v0)
+
+        """
+        return _libBornAgainCore.RectangularDetector_setPerpendicularToDirectBeam(self, distance, u0, v0)
+
+
+    def setPerpendicularToReflectedBeam(self, distance, u0=0.0, v0=0.0):
+        """
+        setPerpendicularToReflectedBeam(RectangularDetector self, double distance, double u0=0.0, double v0=0.0)
+        setPerpendicularToReflectedBeam(RectangularDetector self, double distance, double u0=0.0)
+        setPerpendicularToReflectedBeam(RectangularDetector self, double distance)
+
+        void RectangularDetector::setPerpendicularToReflectedBeam(double distance, double u0=0.0, double v0=0.0)
+
+        """
+        return _libBornAgainCore.RectangularDetector_setPerpendicularToReflectedBeam(self, distance, u0, v0)
+
+
+    def setDirectBeamPosition(self, u0, v0):
+        """
+        setDirectBeamPosition(RectangularDetector self, double u0, double v0)
+
+        void RectangularDetector::setDirectBeamPosition(double u0, double v0)
+
+        """
+        return _libBornAgainCore.RectangularDetector_setDirectBeamPosition(self, u0, v0)
+
+
+    def getWidth(self):
+        """
+        getWidth(RectangularDetector self) -> double
+
+        double RectangularDetector::getWidth() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getWidth(self)
+
+
+    def getHeight(self):
+        """
+        getHeight(RectangularDetector self) -> double
+
+        double RectangularDetector::getHeight() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getHeight(self)
+
+
+    def getNbinsX(self):
+        """
+        getNbinsX(RectangularDetector self) -> size_t
+
+        size_t RectangularDetector::getNbinsX() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getNbinsX(self)
+
+
+    def getNbinsY(self):
+        """
+        getNbinsY(RectangularDetector self) -> size_t
+
+        size_t RectangularDetector::getNbinsY() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getNbinsY(self)
+
+
+    def getNormalVector(self):
+        """
+        getNormalVector(RectangularDetector self) -> kvector_t
+
+        kvector_t RectangularDetector::getNormalVector() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getNormalVector(self)
+
+
+    def getU0(self):
+        """
+        getU0(RectangularDetector self) -> double
+
+        double RectangularDetector::getU0() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getU0(self)
+
+
+    def getV0(self):
+        """
+        getV0(RectangularDetector self) -> double
+
+        double RectangularDetector::getV0() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getV0(self)
+
+
+    def getDirectionVector(self):
+        """
+        getDirectionVector(RectangularDetector self) -> kvector_t
+
+        kvector_t RectangularDetector::getDirectionVector() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getDirectionVector(self)
+
+
+    def getDistance(self):
+        """
+        getDistance(RectangularDetector self) -> double
+
+        double RectangularDetector::getDistance() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getDistance(self)
+
+
+    def getDirectBeamU0(self):
+        """
+        getDirectBeamU0(RectangularDetector self) -> double
+
+        double RectangularDetector::getDirectBeamU0() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getDirectBeamU0(self)
+
+
+    def getDirectBeamV0(self):
+        """
+        getDirectBeamV0(RectangularDetector self) -> double
+
+        double RectangularDetector::getDirectBeamV0() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getDirectBeamV0(self)
+
+
+    def getDetectorArrangment(self):
+        """
+        getDetectorArrangment(RectangularDetector self) -> RectangularDetector::EDetectorArrangement
+
+        RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrangment() const 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getDetectorArrangment(self)
+
+
+    def getValidAxesUnits(self):
+        """
+        getValidAxesUnits(RectangularDetector self) -> std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >
+
+        std::vector< IDetector2D::EAxesUnits > RectangularDetector::getValidAxesUnits() const override
+
+        returns vector of valid axes units 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getValidAxesUnits(self)
+
+
+    def getDefaultAxesUnits(self):
+        """
+        getDefaultAxesUnits(RectangularDetector self) -> IDetector2D::EAxesUnits
+
+        IDetector2D::EAxesUnits RectangularDetector::getDefaultAxesUnits() const override
+
+        return default axes units 
+
+        """
+        return _libBornAgainCore.RectangularDetector_getDefaultAxesUnits(self)
+
+RectangularDetector_swigregister = _libBornAgainCore.RectangularDetector_swigregister
+RectangularDetector_swigregister(RectangularDetector)
+
+class RectPixelMap(IPixelMap):
+    """Proxy of C++ RectPixelMap class."""
+
+    __swig_setmethods__ = {}
+    for _s in [IPixelMap]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, RectPixelMap, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IPixelMap]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, RectPixelMap, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, corner_pos, width, height):
+        """
+        __init__(RectPixelMap self, kvector_t corner_pos, kvector_t width, kvector_t height) -> RectPixelMap
+
+        RectPixelMap::RectPixelMap(kvector_t corner_pos, kvector_t width, kvector_t height)
+
+        """
+        this = _libBornAgainCore.new_RectPixelMap(corner_pos, width, height)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_RectPixelMap
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(RectPixelMap self) -> RectPixelMap
+
+        RectPixelMap * RectPixelMap::clone() const override
+
+        """
+        return _libBornAgainCore.RectPixelMap_clone(self)
+
+
+    def createZeroSizeMap(self, x, y):
+        """
+        createZeroSizeMap(RectPixelMap self, double x, double y) -> RectPixelMap
+
+        RectPixelMap * RectPixelMap::createZeroSizeMap(double x, double y) const override
+
+        """
+        return _libBornAgainCore.RectPixelMap_createZeroSizeMap(self, x, y)
+
+
+    def getK(self, x, y, wavelength):
+        """
+        getK(RectPixelMap self, double x, double y, double wavelength) -> kvector_t
+
+        kvector_t RectPixelMap::getK(double x, double y, double wavelength) const override
+
+        """
+        return _libBornAgainCore.RectPixelMap_getK(self, x, y, wavelength)
+
+
+    def getIntegrationFactor(self, x, y):
+        """
+        getIntegrationFactor(RectPixelMap self, double x, double y) -> double
+
+        double RectPixelMap::getIntegrationFactor(double x, double y) const override
+
+        """
+        return _libBornAgainCore.RectPixelMap_getIntegrationFactor(self, x, y)
+
+
+    def getSolidAngle(self):
+        """
+        getSolidAngle(RectPixelMap self) -> double
+
+        double RectPixelMap::getSolidAngle() const override
+
+        """
+        return _libBornAgainCore.RectPixelMap_getSolidAngle(self)
+
+RectPixelMap_swigregister = _libBornAgainCore.RectPixelMap_swigregister
+RectPixelMap_swigregister(RectPixelMap)
+
+class ResolutionFunction2DGaussian(IResolutionFunction2D):
+    """
+
+
+    Simple gaussian two-dimensional resolution function.
+
+    C++ includes: ResolutionFunction2DGaussian.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IResolutionFunction2D]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ResolutionFunction2DGaussian, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IResolutionFunction2D]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, ResolutionFunction2DGaussian, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, sigma_x, sigma_y):
+        """
+        __init__(ResolutionFunction2DGaussian self, double sigma_x, double sigma_y) -> ResolutionFunction2DGaussian
+
+        ResolutionFunction2DGaussian::ResolutionFunction2DGaussian(double sigma_x, double sigma_y)
+
+        """
+        this = _libBornAgainCore.new_ResolutionFunction2DGaussian(sigma_x, sigma_y)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def evaluateCDF(self, x, y):
+        """
+        evaluateCDF(ResolutionFunction2DGaussian self, double x, double y) -> double
+
+        double ResolutionFunction2DGaussian::evaluateCDF(double x, double y) const 
+
+        """
+        return _libBornAgainCore.ResolutionFunction2DGaussian_evaluateCDF(self, x, y)
+
+
+    def clone(self):
+        """
+        clone(ResolutionFunction2DGaussian self) -> ResolutionFunction2DGaussian
+
+        ResolutionFunction2DGaussian* ResolutionFunction2DGaussian::clone() const 
+
+        """
+        return _libBornAgainCore.ResolutionFunction2DGaussian_clone(self)
+
+
+    def getSigmaX(self):
+        """
+        getSigmaX(ResolutionFunction2DGaussian self) -> double
+
+        double ResolutionFunction2DGaussian::getSigmaX() const 
+
+        """
+        return _libBornAgainCore.ResolutionFunction2DGaussian_getSigmaX(self)
+
+
+    def getSigmaY(self):
+        """
+        getSigmaY(ResolutionFunction2DGaussian self) -> double
+
+        double ResolutionFunction2DGaussian::getSigmaY() const 
+
+        """
+        return _libBornAgainCore.ResolutionFunction2DGaussian_getSigmaY(self)
+
+    __swig_destroy__ = _libBornAgainCore.delete_ResolutionFunction2DGaussian
+    __del__ = lambda self: None
+ResolutionFunction2DGaussian_swigregister = _libBornAgainCore.ResolutionFunction2DGaussian_swigregister
+ResolutionFunction2DGaussian_swigregister(ResolutionFunction2DGaussian)
+
+class SpecularSimulation(ICloneable, IParameterized):
+    """
+
+
+    Main class to run a specular simulation.
+
+    C++ includes: SpecularSimulation.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SpecularSimulation, name, value)
+    __swig_getmethods__ = {}
+    for _s in [ICloneable, IParameterized]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SpecularSimulation, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(SpecularSimulation self) -> SpecularSimulation
+        __init__(SpecularSimulation self, ISample sample) -> SpecularSimulation
+        __init__(SpecularSimulation self, std::shared_ptr< IMultiLayerBuilder > const sample_builder) -> SpecularSimulation
+
+        SpecularSimulation::SpecularSimulation(std::shared_ptr< IMultiLayerBuilder > sample_builder)
+
+        """
+        this = _libBornAgainCore.new_SpecularSimulation(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_SpecularSimulation
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(SpecularSimulation self) -> SpecularSimulation
+
+        SpecularSimulation * SpecularSimulation::clone() const 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_clone(self)
+
+
+    def runSimulation(self):
+        """
+        runSimulation(SpecularSimulation self)
+
+        void SpecularSimulation::runSimulation()
+
+        Run a simulation with the current parameter settings. 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_runSimulation(self)
+
+
+    def setSample(self, sample):
+        """
+        setSample(SpecularSimulation self, ISample sample)
+
+        void SpecularSimulation::setSample(const ISample &sample)
+
+        Sets the sample to be tested. 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_setSample(self, sample)
+
+
+    def getSample(self):
+        """
+        getSample(SpecularSimulation self) -> ISample
+
+        ISample* SpecularSimulation::getSample() const
+
+        Returns the sample. 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_getSample(self)
+
+
+    def setSampleBuilderCpp(self, sample_builder):
+        """
+        setSampleBuilderCpp(SpecularSimulation self, std::shared_ptr< IMultiLayerBuilder > sample_builder)
+
+        void SpecularSimulation::setSampleBuilder(std::shared_ptr< IMultiLayerBuilder > sample_builder)
+
+        Sets the sample builder. 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_setSampleBuilderCpp(self, sample_builder)
+
+
+    def getSampleBuilder(self):
+        """
+        getSampleBuilder(SpecularSimulation self) -> std::shared_ptr< IMultiLayerBuilder >
+
+        std::shared_ptr<IMultiLayerBuilder> SpecularSimulation::getSampleBuilder() const
+
+        return sample builder 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_getSampleBuilder(self)
+
+
+    def setBeamParameters(self, *args):
+        """
+        setBeamParameters(SpecularSimulation self, double arg2, IAxis alpha_axis)
+        setBeamParameters(SpecularSimulation self, double arg2, int nbins, double alpha_i_min, double alpha_i_max)
+
+        void SpecularSimulation::setBeamParameters(double lambda, int nbins, double alpha_i_min, double alpha_i_max)
+
+        """
+        return _libBornAgainCore.SpecularSimulation_setBeamParameters(self, *args)
+
+
+    def setEvanescentWaveAxis(self, *args):
+        """
+        setEvanescentWaveAxis(SpecularSimulation self, IAxis z_axis)
+        setEvanescentWaveAxis(SpecularSimulation self, int nbins, double z_min, double z_max)
+
+        void SpecularSimulation::setEvanescentWaveAxis(int nbins, double z_min, double z_max)
+
+        """
+        return _libBornAgainCore.SpecularSimulation_setEvanescentWaveAxis(self, *args)
+
+
+    def getAlphaAxis(self):
+        """
+        getAlphaAxis(SpecularSimulation self) -> IAxis
+
+        const IAxis * SpecularSimulation::getAlphaAxis() const
+
+        returns alpha_i axis 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_getAlphaAxis(self)
+
+
+    def getScalarR(self, i_layer):
+        """
+        getScalarR(SpecularSimulation self, size_t i_layer) -> vector_complex_t
+
+        std::vector< complex_t > SpecularSimulation::getScalarR(size_t i_layer) const
+
+        returns vector of reflection coefficients for all alpha_i angles for given layer index 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_getScalarR(self, i_layer)
+
+
+    def getScalarT(self, i_layer):
+        """
+        getScalarT(SpecularSimulation self, size_t i_layer) -> vector_complex_t
+
+        std::vector< complex_t > SpecularSimulation::getScalarT(size_t i_layer) const
+
+        returns vector of transmission coefficients for all alpha_i angles for given layer index 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_getScalarT(self, i_layer)
+
+
+    def getScalarKz(self, i_layer):
+        """
+        getScalarKz(SpecularSimulation self, size_t i_layer) -> vector_complex_t
+
+        std::vector< complex_t > SpecularSimulation::getScalarKz(size_t i_layer) const
+
+        returns vector of Kz coefficients for all alpha_i angles for given layer index 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_getScalarKz(self, i_layer)
+
+
+    def getLayerRTCoefficients(self, i_alpha, i_layer):
+        """
+        getLayerRTCoefficients(SpecularSimulation self, size_t i_alpha, size_t i_layer) -> SpecularSimulation::LayerRTCoefficients_t
+
+        SpecularSimulation::LayerRTCoefficients_t SpecularSimulation::getLayerRTCoefficients(size_t i_alpha, size_t i_layer) const 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_getLayerRTCoefficients(self, i_alpha, i_layer)
+
+
+    def prepareSimulation(self):
+        """
+        prepareSimulation(SpecularSimulation self)
+
+        void SpecularSimulation::prepareSimulation()
+
+        Put into a clean state for running a simulation. 
+
+        """
+        return _libBornAgainCore.SpecularSimulation_prepareSimulation(self)
+
+
+    def setSampleBuilder(self, ptr):
+        self.samplebuilder = ptr
+        self.setSampleBuilderCpp(ptr)
+
+SpecularSimulation_swigregister = _libBornAgainCore.SpecularSimulation_swigregister
+SpecularSimulation_swigregister(SpecularSimulation)
+
+class ThreadInfo(_object):
+    """
+
+
+    Information to run simulation with dedicated number of threads.
+
+    C++ includes: ThreadInfo.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, ThreadInfo, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, ThreadInfo, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(ThreadInfo self) -> ThreadInfo
+
+        ThreadInfo::ThreadInfo()
+
+        """
+        this = _libBornAgainCore.new_ThreadInfo()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_setmethods__["n_threads"] = _libBornAgainCore.ThreadInfo_n_threads_set
+    __swig_getmethods__["n_threads"] = _libBornAgainCore.ThreadInfo_n_threads_get
+    if _newclass:
+        n_threads = _swig_property(_libBornAgainCore.ThreadInfo_n_threads_get, _libBornAgainCore.ThreadInfo_n_threads_set)
+    __swig_setmethods__["current_thread"] = _libBornAgainCore.ThreadInfo_current_thread_set
+    __swig_getmethods__["current_thread"] = _libBornAgainCore.ThreadInfo_current_thread_get
+    if _newclass:
+        current_thread = _swig_property(_libBornAgainCore.ThreadInfo_current_thread_get, _libBornAgainCore.ThreadInfo_current_thread_set)
+    __swig_setmethods__["n_batches"] = _libBornAgainCore.ThreadInfo_n_batches_set
+    __swig_getmethods__["n_batches"] = _libBornAgainCore.ThreadInfo_n_batches_get
+    if _newclass:
+        n_batches = _swig_property(_libBornAgainCore.ThreadInfo_n_batches_get, _libBornAgainCore.ThreadInfo_n_batches_set)
+    __swig_setmethods__["current_batch"] = _libBornAgainCore.ThreadInfo_current_batch_set
+    __swig_getmethods__["current_batch"] = _libBornAgainCore.ThreadInfo_current_batch_get
+    if _newclass:
+        current_batch = _swig_property(_libBornAgainCore.ThreadInfo_current_batch_get, _libBornAgainCore.ThreadInfo_current_batch_set)
+    __swig_destroy__ = _libBornAgainCore.delete_ThreadInfo
+    __del__ = lambda self: None
+ThreadInfo_swigregister = _libBornAgainCore.ThreadInfo_swigregister
+ThreadInfo_swigregister(ThreadInfo)
+
+class SampleBuilderFactoryTemp(_object):
+    """
+
+
+    Base class for all factories.
+
+    C++ includes: IFactory.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SampleBuilderFactoryTemp, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SampleBuilderFactoryTemp, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(IFactory<(std::string,IMultiLayerBuilder)> self) -> SampleBuilderFactoryTemp
+
+        IFactory< Key, AbstractProduct >::IFactory()
+
+        """
+        this = _libBornAgainCore.new_SampleBuilderFactoryTemp()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def createItem(self, item_key):
+        """
+        createItem(SampleBuilderFactoryTemp self, std::string const & item_key) -> IMultiLayerBuilder
+
+        AbstractProduct* IFactory< Key, AbstractProduct >::createItem(const Key &item_key)
+
+        Creates object by calling creation function corresponded to given identifier. 
+
+        """
+        return _libBornAgainCore.SampleBuilderFactoryTemp_createItem(self, item_key)
+
+
+    def registerItem(self, *args):
+        """
+        registerItem(SampleBuilderFactoryTemp self, std::string const & item_key, IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback CreateFn, std::string const & itemDescription) -> bool
+        registerItem(SampleBuilderFactoryTemp self, std::string const & item_key, IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback CreateFn) -> bool
+
+        bool IFactory< Key, AbstractProduct >::registerItem(const Key &item_key, CreateItemCallback CreateFn, const std::string &itemDescription="")
+
+        Registers object's creation function and store object description. 
+
+        """
+        return _libBornAgainCore.SampleBuilderFactoryTemp_registerItem(self, *args)
+
+    __swig_destroy__ = _libBornAgainCore.delete_SampleBuilderFactoryTemp
+    __del__ = lambda self: None
+
+    def getNumberOfRegistered(self):
+        """
+        getNumberOfRegistered(SampleBuilderFactoryTemp self) -> size_t
+
+        size_t IFactory< Key, AbstractProduct >::getNumberOfRegistered() const
+
+        Returns number of registered objects. 
+
+        """
+        return _libBornAgainCore.SampleBuilderFactoryTemp_getNumberOfRegistered(self)
+
+
+    def begin(self):
+        """
+        begin(SampleBuilderFactoryTemp self) -> IFactory< std::string,IMultiLayerBuilder >::const_iterator
+
+        const_iterator IFactory< Key, AbstractProduct >::begin() const 
+
+        """
+        return _libBornAgainCore.SampleBuilderFactoryTemp_begin(self)
+
+
+    def end(self):
+        """
+        end(SampleBuilderFactoryTemp self) -> IFactory< std::string,IMultiLayerBuilder >::const_iterator
+
+        const_iterator IFactory< Key, AbstractProduct >::end() const 
+
+        """
+        return _libBornAgainCore.SampleBuilderFactoryTemp_end(self)
+
+SampleBuilderFactoryTemp_swigregister = _libBornAgainCore.SampleBuilderFactoryTemp_swigregister
+SampleBuilderFactoryTemp_swigregister(SampleBuilderFactoryTemp)
+
+class SampleBuilderFactory(SampleBuilderFactoryTemp):
+    """
+
+
+    Factory to create standard pre-defined samples.
+
+    C++ includes: SampleBuilderFactory.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [SampleBuilderFactoryTemp]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SampleBuilderFactory, name, value)
+    __swig_getmethods__ = {}
+    for _s in [SampleBuilderFactoryTemp]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SampleBuilderFactory, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(SampleBuilderFactory self) -> SampleBuilderFactory
+
+        SampleBuilderFactory::SampleBuilderFactory()
+
+        """
+        this = _libBornAgainCore.new_SampleBuilderFactory()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def createSample(self, name):
+        """
+        createSample(SampleBuilderFactory self, std::string const & name) -> MultiLayer
+
+        MultiLayer * SampleBuilderFactory::createSample(const std::string &name)
+
+        Retrieves a SampleBuilder from the registry, does the build, and returns the result. 
+
+        """
+        return _libBornAgainCore.SampleBuilderFactory_createSample(self, name)
+
+    __swig_destroy__ = _libBornAgainCore.delete_SampleBuilderFactory
+    __del__ = lambda self: None
+SampleBuilderFactory_swigregister = _libBornAgainCore.SampleBuilderFactory_swigregister
+SampleBuilderFactory_swigregister(SampleBuilderFactory)
+
+class SimulationFactoryTemp(_object):
+    """
+
+
+    Base class for all factories.
+
+    C++ includes: IFactory.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SimulationFactoryTemp, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SimulationFactoryTemp, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(IFactory<(std::string,GISASSimulation)> self) -> SimulationFactoryTemp
+
+        IFactory< Key, AbstractProduct >::IFactory()
+
+        """
+        this = _libBornAgainCore.new_SimulationFactoryTemp()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def createItem(self, item_key):
+        """
+        createItem(SimulationFactoryTemp self, std::string const & item_key) -> GISASSimulation
+
+        AbstractProduct* IFactory< Key, AbstractProduct >::createItem(const Key &item_key)
+
+        Creates object by calling creation function corresponded to given identifier. 
+
+        """
+        return _libBornAgainCore.SimulationFactoryTemp_createItem(self, item_key)
+
+
+    def registerItem(self, *args):
+        """
+        registerItem(SimulationFactoryTemp self, std::string const & item_key, IFactory< std::string,GISASSimulation >::CreateItemCallback CreateFn, std::string const & itemDescription) -> bool
+        registerItem(SimulationFactoryTemp self, std::string const & item_key, IFactory< std::string,GISASSimulation >::CreateItemCallback CreateFn) -> bool
+
+        bool IFactory< Key, AbstractProduct >::registerItem(const Key &item_key, CreateItemCallback CreateFn, const std::string &itemDescription="")
+
+        Registers object's creation function and store object description. 
+
+        """
+        return _libBornAgainCore.SimulationFactoryTemp_registerItem(self, *args)
+
+    __swig_destroy__ = _libBornAgainCore.delete_SimulationFactoryTemp
+    __del__ = lambda self: None
+
+    def getNumberOfRegistered(self):
+        """
+        getNumberOfRegistered(SimulationFactoryTemp self) -> size_t
+
+        size_t IFactory< Key, AbstractProduct >::getNumberOfRegistered() const
+
+        Returns number of registered objects. 
+
+        """
+        return _libBornAgainCore.SimulationFactoryTemp_getNumberOfRegistered(self)
+
+
+    def begin(self):
+        """
+        begin(SimulationFactoryTemp self) -> IFactory< std::string,GISASSimulation >::const_iterator
+
+        const_iterator IFactory< Key, AbstractProduct >::begin() const 
+
+        """
+        return _libBornAgainCore.SimulationFactoryTemp_begin(self)
+
+
+    def end(self):
+        """
+        end(SimulationFactoryTemp self) -> IFactory< std::string,GISASSimulation >::const_iterator
+
+        const_iterator IFactory< Key, AbstractProduct >::end() const 
+
+        """
+        return _libBornAgainCore.SimulationFactoryTemp_end(self)
+
+SimulationFactoryTemp_swigregister = _libBornAgainCore.SimulationFactoryTemp_swigregister
+SimulationFactoryTemp_swigregister(SimulationFactoryTemp)
+
+class SimulationFactory(SimulationFactoryTemp):
+    """
+
+
+    Registry to create standard pre-defined simulations. Used in functional tests, performance measurements, etc.
+
+    C++ includes: SimulationFactory.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [SimulationFactoryTemp]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SimulationFactory, name, value)
+    __swig_getmethods__ = {}
+    for _s in [SimulationFactoryTemp]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, SimulationFactory, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(SimulationFactory self) -> SimulationFactory
+
+        SimulationFactory::SimulationFactory()
+
+        """
+        this = _libBornAgainCore.new_SimulationFactory()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainCore.delete_SimulationFactory
+    __del__ = lambda self: None
+SimulationFactory_swigregister = _libBornAgainCore.SimulationFactory_swigregister
+SimulationFactory_swigregister(SimulationFactory)
+
+# This file is compatible with both classic and new-style classes.
+
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
new file mode 100644
index 0000000..c64521a
--- /dev/null
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -0,0 +1,117124 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 3.0.8
+ *
+ * This file is not intended to be easily readable and contains a number of
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+
+#ifndef SWIGPYTHON
+#define SWIGPYTHON
+#endif
+
+#define SWIG_DIRECTORS
+#define SWIG_PYTHON_DIRECTOR_NO_VTABLE
+
+
+#ifdef __cplusplus
+/* SwigValueWrapper is described in swig.swg */
+template<typename T> class SwigValueWrapper {
+  struct SwigMovePointer {
+    T *ptr;
+    SwigMovePointer(T *p) : ptr(p) { }
+    ~SwigMovePointer() { delete ptr; }
+    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+  } pointer;
+  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
+  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
+public:
+  SwigValueWrapper() : pointer(0) { }
+  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
+  operator T&() const { return *pointer.ptr; }
+  T *operator&() { return pointer.ptr; }
+};
+
+template <typename T> T SwigValueInit() {
+  return T();
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__))
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__))
+# else
+#   define SWIGUNUSED
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#  ifndef GCC_HASCLASSVISIBILITY
+#    define GCC_HASCLASSVISIBILITY
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used.  So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
+
+
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+   or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+  creating a static or dynamic library from the SWIG runtime code.
+  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+
+  But only do this if strictly necessary, ie, if you have problems
+  with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/*  Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN        0x1
+#define SWIG_CAST_NEW_MEMORY       0x2
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN           0x1
+
+
+/*
+   Flags/methods for returning states.
+
+   The SWIG conversion methods, as ConvertPtr, return an integer
+   that tells if the conversion was successful or not. And if not,
+   an error code can be returned (see swigerrors.swg for the codes).
+
+   Use the following macros/flags to set or process the returning
+   states.
+
+   In old versions of SWIG, code such as the following was usually written:
+
+     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+       // success code
+     } else {
+       //fail code
+     }
+
+   Now you can be more explicit:
+
+    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+    } else {
+      // fail code
+    }
+
+   which is the same really, but now you can also do
+
+    Type *ptr;
+    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+      if (SWIG_IsNewObj(res) {
+        ...
+	delete *ptr;
+      } else {
+        ...
+      }
+    } else {
+      // fail code
+    }
+
+   I.e., now SWIG_ConvertPtr can return new objects and you can
+   identify the case and take care of the deallocation. Of course that
+   also requires SWIG_ConvertPtr to return new result values, such as
+
+      int SWIG_ConvertPtr(obj, ptr,...) {
+        if (<obj is ok>) {
+          if (<need new object>) {
+            *ptr = <ptr to new allocated object>;
+            return SWIG_NEWOBJ;
+          } else {
+            *ptr = <ptr to old object>;
+            return SWIG_OLDOBJ;
+          }
+        } else {
+          return SWIG_BADOBJ;
+        }
+      }
+
+   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+   SWIG errors code.
+
+   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+   allows to return the 'cast rank', for example, if you have this
+
+       int food(double)
+       int fooi(int);
+
+   and you call
+
+      food(1)   // cast rank '1'  (1 -> 1.0)
+      fooi(1)   // cast rank '0'
+
+   just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK                    (0)
+#define SWIG_ERROR                 (-1)
+#define SWIG_IsOK(r)               (r >= 0)
+#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT         (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
+/* The TmpMask is for in/out typemaps that use temporal objects */
+#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ                (SWIG_ERROR)
+#define SWIG_OLDOBJ                (SWIG_OK)
+#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del mask methods */
+#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+#  ifndef SWIG_TypeRank
+#    define SWIG_TypeRank             unsigned long
+#  endif
+#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
+#    define SWIG_MAXCASTRANK          (2)
+#  endif
+#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
+#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
+  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+}
+#else /* no cast-rank mode */
+#  define SWIG_AddCast(r) (r)
+#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+  const char             *name;			/* mangled name of this type */
+  const char             *str;			/* human readable name of this type */
+  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
+  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
+  void                   *clientdata;		/* language specific type data */
+  int                    owndata;		/* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
+  swig_converter_func     converter;		/* function to cast the void pointers */
+  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
+  struct swig_cast_info  *prev;			/* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
+  size_t                 size;		        /* Number of types in this module */
+  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
+  swig_type_info         **type_initial;	/* Array of initially generated type structures */
+  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
+  void                    *clientdata;		/* Language specific module data */
+} swig_module_info;
+
+/*
+  Compare two type names skipping the space characters, therefore
+  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
+
+  Return 0 when the two name types are equivalent, as in
+  strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+		  const char *f2, const char *l2) {
+  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+    while ((*f1 == ' ') && (f1 != l1)) ++f1;
+    while ((*f2 == ' ') && (f2 != l2)) ++f2;
+    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+  }
+  return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCmp(const char *nb, const char *tb) {
+  int equiv = 1;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (equiv != 0 && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = SWIG_TypeNameComp(nb, ne, tb, te);
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
+}
+
+/*
+  Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (strcmp(iter->type->name, c) == 0) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (iter->type == from) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/*
+   Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/*
+  Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/*
+  Return the pretty name associated with this type,
+  that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+  /* The "str" field contains the equivalent pretty names of the
+     type, separated by vertical-bar characters.  We choose
+     to print the last name, as it is often (?) the most
+     specific. */
+  if (!type) return NULL;
+  if (type->str != NULL) {
+    const char *last_name = type->str;
+    const char *s;
+    for (s = type->str; *s; s++)
+      if (*s == '|') last_name = s+1;
+    return last_name;
+  }
+  else
+    return type->name;
+}
+
+/*
+   Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_cast_info *cast = ti->cast;
+  /* if (ti->clientdata == clientdata) return; */
+  ti->clientdata = clientdata;
+
+  while (cast) {
+    if (!cast->converter) {
+      swig_type_info *tc = cast->type;
+      if (!tc->clientdata) {
+	SWIG_TypeClientData(tc, clientdata);
+      }
+    }
+    cast = cast->next;
+  }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+  SWIG_TypeClientData(ti, clientdata);
+  ti->owndata = 1;
+}
+
+/*
+  Search for a swig_type_info structure only by mangled name
+  Search is a O(log #types)
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+                            swig_module_info *end,
+		            const char *name) {
+  swig_module_info *iter = start;
+  do {
+    if (iter->size) {
+      size_t l = 0;
+      size_t r = iter->size - 1;
+      do {
+	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
+	size_t i = (l + r) >> 1;
+	const char *iname = iter->types[i]->name;
+	if (iname) {
+	  int compare = strcmp(name, iname);
+	  if (compare == 0) {
+	    return iter->types[i];
+	  } else if (compare < 0) {
+	    if (i) {
+	      r = i - 1;
+	    } else {
+	      break;
+	    }
+	  } else if (compare > 0) {
+	    l = i + 1;
+	  }
+	} else {
+	  break; /* should never happen */
+	}
+      } while (l <= r);
+    }
+    iter = iter->next;
+  } while (iter != end);
+  return 0;
+}
+
+/*
+  Search for a swig_type_info structure for either a mangled name or a human readable name.
+  It first searches the mangled names of the types, which is a O(log #types)
+  If a type is not found it then searches the human readable names, which is O(#types).
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start,
+                     swig_module_info *end,
+		     const char *name) {
+  /* STEP 1: Search the name field using binary search */
+  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+  if (ret) {
+    return ret;
+  } else {
+    /* STEP 2: If the type hasn't been found, do a complete search
+       of the str field (the human readable name) */
+    swig_module_info *iter = start;
+    do {
+      size_t i = 0;
+      for (; i < iter->size; ++i) {
+	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+	  return iter->types[i];
+      }
+      iter = iter->next;
+    } while (iter != end);
+  }
+
+  /* neither found a match */
+  return 0;
+}
+
+/*
+   Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+  static const char hex[17] = "0123456789abcdef";
+  const unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu =  u + sz;
+  for (; u != eu; ++u) {
+    unsigned char uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/*
+   Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+  unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu = u + sz;
+  for (; u != eu; ++u) {
+    char d = *(c++);
+    unsigned char uu;
+    if ((d >= '0') && (d <= '9'))
+      uu = ((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = ((d - ('a'-10)) << 4);
+    else
+      return (char *) 0;
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (d - ('a'-10));
+    else
+      return (char *) 0;
+    *u = uu;
+  }
+  return c;
+}
+
+/*
+   Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+  char *r = buff;
+  if ((2*sizeof(void *) + 2) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,&ptr,sizeof(void *));
+  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+  strcpy(r,name);
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      *ptr = (void *) 0;
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+  char *r = buff;
+  size_t lname = (name ? strlen(name) : 0);
+  if ((2*sz + 2 + lname) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  if (lname) {
+    strncpy(r,name,lname+1);
+  } else {
+    *r = 0;
+  }
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      memset(ptr,0,sz);
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/*  Errors in SWIG */
+#define  SWIG_UnknownError    	   -1
+#define  SWIG_IOError        	   -2
+#define  SWIG_RuntimeError   	   -3
+#define  SWIG_IndexError     	   -4
+#define  SWIG_TypeError      	   -5
+#define  SWIG_DivisionByZero 	   -6
+#define  SWIG_OverflowError  	   -7
+#define  SWIG_SyntaxError    	   -8
+#define  SWIG_ValueError     	   -9
+#define  SWIG_SystemError    	   -10
+#define  SWIG_AttributeError 	   -11
+#define  SWIG_MemoryError    	   -12
+#define  SWIG_NullReferenceError   -13
+
+
+
+/* Compatibility macros for Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+
+#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type)
+#define PyInt_Check(x) PyLong_Check(x)
+#define PyInt_AsLong(x) PyLong_AsLong(x)
+#define PyInt_FromLong(x) PyLong_FromLong(x)
+#define PyInt_FromSize_t(x) PyLong_FromSize_t(x)
+#define PyString_Check(name) PyBytes_Check(name)
+#define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)
+#define PyString_AsString(str) PyBytes_AsString(str)
+#define PyString_Size(str) PyBytes_Size(str)	
+#define PyString_InternFromString(key) PyUnicode_InternFromString(key)
+#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE
+#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x)
+#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x)
+
+#endif
+
+#ifndef Py_TYPE
+#  define Py_TYPE(op) ((op)->ob_type)
+#endif
+
+/* SWIG APIs for compatibility of both Python 2 & 3 */
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_FromFormat PyUnicode_FromFormat
+#else
+#  define SWIG_Python_str_FromFormat PyString_FromFormat
+#endif
+
+
+/* Warning: This function will allocate a new string in Python 3,
+ * so please call SWIG_Python_str_DelForPy3(x) to free the space.
+ */
+SWIGINTERN char*
+SWIG_Python_str_AsChar(PyObject *str)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  char *cstr;
+  char *newstr;
+  Py_ssize_t len;
+  str = PyUnicode_AsUTF8String(str);
+  PyBytes_AsStringAndSize(str, &cstr, &len);
+  newstr = (char *) malloc(len+1);
+  memcpy(newstr, cstr, len+1);
+  Py_XDECREF(str);
+  return newstr;
+#else
+  return PyString_AsString(str);
+#endif
+}
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_DelForPy3(x) free( (void*) (x) )
+#else
+#  define SWIG_Python_str_DelForPy3(x) 
+#endif
+
+
+SWIGINTERN PyObject*
+SWIG_Python_str_FromChar(const char *c)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  return PyUnicode_FromString(c); 
+#else
+  return PyString_FromString(c);
+#endif
+}
+
+/* Add PyOS_snprintf for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM)
+#  define PyOS_snprintf _snprintf
+# else
+#  define PyOS_snprintf snprintf
+# endif
+#endif
+
+/* A crude PyString_FromFormat implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+
+#ifndef SWIG_PYBUFFER_SIZE
+# define SWIG_PYBUFFER_SIZE 1024
+#endif
+
+static PyObject *
+PyString_FromFormat(const char *fmt, ...) {
+  va_list ap;
+  char buf[SWIG_PYBUFFER_SIZE * 2];
+  int res;
+  va_start(ap, fmt);
+  res = vsnprintf(buf, sizeof(buf), fmt, ap);
+  va_end(ap);
+  return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf);
+}
+#endif
+
+/* Add PyObject_Del for old Pythons */
+#if PY_VERSION_HEX < 0x01060000
+# define PyObject_Del(op) PyMem_DEL((op))
+#endif
+#ifndef PyObject_DEL
+# define PyObject_DEL PyObject_Del
+#endif
+
+/* A crude PyExc_StopIteration exception for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# ifndef PyExc_StopIteration
+#  define PyExc_StopIteration PyExc_RuntimeError
+# endif
+# ifndef PyObject_GenericGetAttr
+#  define PyObject_GenericGetAttr 0
+# endif
+#endif
+
+/* Py_NotImplemented is defined in 2.1 and up. */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef Py_NotImplemented
+#  define Py_NotImplemented PyExc_RuntimeError
+# endif
+#endif
+
+/* A crude PyString_AsStringAndSize implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef PyString_AsStringAndSize
+#  define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;}
+# endif
+#endif
+
+/* PySequence_Size for old Pythons */
+#if PY_VERSION_HEX < 0x02000000
+# ifndef PySequence_Size
+#  define PySequence_Size PySequence_Length
+# endif
+#endif
+
+/* PyBool_FromLong for old Pythons */
+#if PY_VERSION_HEX < 0x02030000
+static
+PyObject *PyBool_FromLong(long ok)
+{
+  PyObject *result = ok ? Py_True : Py_False;
+  Py_INCREF(result);
+  return result;
+}
+#endif
+
+/* Py_ssize_t for old Pythons */
+/* This code is as recommended by: */
+/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */
+#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
+typedef int Py_ssize_t;
+# define PY_SSIZE_T_MAX INT_MAX
+# define PY_SSIZE_T_MIN INT_MIN
+typedef inquiry lenfunc;
+typedef intargfunc ssizeargfunc;
+typedef intintargfunc ssizessizeargfunc;
+typedef intobjargproc ssizeobjargproc;
+typedef intintobjargproc ssizessizeobjargproc;
+typedef getreadbufferproc readbufferproc;
+typedef getwritebufferproc writebufferproc;
+typedef getsegcountproc segcountproc;
+typedef getcharbufferproc charbufferproc;
+static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc))
+{
+  long result = 0;
+  PyObject *i = PyNumber_Int(x);
+  if (i) {
+    result = PyInt_AsLong(i);
+    Py_DECREF(i);
+  }
+  return result;
+}
+#endif
+
+#if PY_VERSION_HEX < 0x02050000
+#define PyInt_FromSize_t(x) PyInt_FromLong((long)x)
+#endif
+
+#if PY_VERSION_HEX < 0x02040000
+#define Py_VISIT(op)				\
+  do { 						\
+    if (op) {					\
+      int vret = visit((op), arg);		\
+      if (vret)					\
+        return vret;				\
+    }						\
+  } while (0)
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef struct {
+  PyTypeObject type;
+  PyNumberMethods as_number;
+  PyMappingMethods as_mapping;
+  PySequenceMethods as_sequence;
+  PyBufferProcs as_buffer;
+  PyObject *name, *slots;
+} PyHeapTypeObject;
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef destructor freefunc;
+#endif
+
+#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \
+     (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \
+     (PY_MAJOR_VERSION > 3))
+# define SWIGPY_USE_CAPSULE
+# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME)
+#endif
+
+#if PY_VERSION_HEX < 0x03020000
+#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
+#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#endif
+
+/* -----------------------------------------------------------------------------
+ * error manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIME PyObject*
+SWIG_Python_ErrorType(int code) {
+  PyObject* type = 0;
+  switch(code) {
+  case SWIG_MemoryError:
+    type = PyExc_MemoryError;
+    break;
+  case SWIG_IOError:
+    type = PyExc_IOError;
+    break;
+  case SWIG_RuntimeError:
+    type = PyExc_RuntimeError;
+    break;
+  case SWIG_IndexError:
+    type = PyExc_IndexError;
+    break;
+  case SWIG_TypeError:
+    type = PyExc_TypeError;
+    break;
+  case SWIG_DivisionByZero:
+    type = PyExc_ZeroDivisionError;
+    break;
+  case SWIG_OverflowError:
+    type = PyExc_OverflowError;
+    break;
+  case SWIG_SyntaxError:
+    type = PyExc_SyntaxError;
+    break;
+  case SWIG_ValueError:
+    type = PyExc_ValueError;
+    break;
+  case SWIG_SystemError:
+    type = PyExc_SystemError;
+    break;
+  case SWIG_AttributeError:
+    type = PyExc_AttributeError;
+    break;
+  default:
+    type = PyExc_RuntimeError;
+  }
+  return type;
+}
+
+
+SWIGRUNTIME void
+SWIG_Python_AddErrorMsg(const char* mesg)
+{
+  PyObject *type = 0;
+  PyObject *value = 0;
+  PyObject *traceback = 0;
+
+  if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback);
+  if (value) {
+    char *tmp;
+    PyObject *old_str = PyObject_Str(value);
+    PyErr_Clear();
+    Py_XINCREF(type);
+
+    PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(old_str);
+    Py_DECREF(value);
+  } else {
+    PyErr_SetString(PyExc_RuntimeError, mesg);
+  }
+}
+
+#if defined(SWIG_PYTHON_NO_THREADS)
+#  if defined(SWIG_PYTHON_THREADS)
+#    undef SWIG_PYTHON_THREADS
+#  endif
+#endif
+#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
+#  if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
+#    if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */
+#      define SWIG_PYTHON_USE_GIL
+#    endif
+#  endif
+#  if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
+#    ifndef SWIG_PYTHON_INITIALIZE_THREADS
+#     define SWIG_PYTHON_INITIALIZE_THREADS  PyEval_InitThreads() 
+#    endif
+#    ifdef __cplusplus /* C++ code */
+       class SWIG_Python_Thread_Block {
+         bool status;
+         PyGILState_STATE state;
+       public:
+         void end() { if (status) { PyGILState_Release(state); status = false;} }
+         SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
+         ~SWIG_Python_Thread_Block() { end(); }
+       };
+       class SWIG_Python_Thread_Allow {
+         bool status;
+         PyThreadState *save;
+       public:
+         void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
+         SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
+         ~SWIG_Python_Thread_Allow() { end(); }
+       };
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   SWIG_Python_Thread_Block _swig_thread_block
+#      define SWIG_PYTHON_THREAD_END_BLOCK     _swig_thread_block.end()
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   SWIG_Python_Thread_Allow _swig_thread_allow
+#      define SWIG_PYTHON_THREAD_END_ALLOW     _swig_thread_allow.end()
+#    else /* C code */
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
+#      define SWIG_PYTHON_THREAD_END_BLOCK     PyGILState_Release(_swig_thread_block)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   PyThreadState *_swig_thread_allow = PyEval_SaveThread()
+#      define SWIG_PYTHON_THREAD_END_ALLOW     PyEval_RestoreThread(_swig_thread_allow)
+#    endif
+#  else /* Old thread way, not implemented, user must provide it */
+#    if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
+#      define SWIG_PYTHON_INITIALIZE_THREADS
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
+#      define SWIG_PYTHON_THREAD_END_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
+#      define SWIG_PYTHON_THREAD_END_ALLOW
+#    endif
+#  endif
+#else /* No thread support */
+#  define SWIG_PYTHON_INITIALIZE_THREADS
+#  define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#  define SWIG_PYTHON_THREAD_END_BLOCK
+#  define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#  define SWIG_PYTHON_THREAD_END_ALLOW
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Python API portion that goes into the runtime
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Constant declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Constant Types */
+#define SWIG_PY_POINTER 4
+#define SWIG_PY_BINARY  5
+
+/* Constant information structure */
+typedef struct swig_const_info {
+  int type;
+  char *name;
+  long lvalue;
+  double dvalue;
+  void   *pvalue;
+  swig_type_info **ptype;
+} swig_const_info;
+
+
+/* -----------------------------------------------------------------------------
+ * Wrapper of PyInstanceMethod_New() used in Python 3
+ * It is exported to the generated module, used for -fastproxy
+ * ----------------------------------------------------------------------------- */
+#if PY_VERSION_HEX >= 0x03000000
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func)
+{
+  return PyInstanceMethod_New(func);
+}
+#else
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func))
+{
+  return NULL;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * pyrun.swg
+ *
+ * This file contains the runtime support for Python modules
+ * and includes code for managing global variables and pointer
+ * type checking.
+ *
+ * ----------------------------------------------------------------------------- */
+
+/* Common SWIG API */
+
+/* for raw pointers */
+#define SWIG_Python_ConvertPtr(obj, pptr, type, flags)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
+#define SWIG_ConvertPtr(obj, pptr, type, flags)         SWIG_Python_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
+
+#ifdef SWIGPYTHON_BUILTIN
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(self, ptr, type, flags)
+#else
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+#endif
+
+#define SWIG_InternalNewPointerObj(ptr, type, flags)	SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+
+#define SWIG_CheckImplicit(ty)                          SWIG_Python_CheckImplicit(ty) 
+#define SWIG_AcquirePtr(ptr, src)                       SWIG_Python_AcquirePtr(ptr, src)
+#define swig_owntype                                    int
+
+/* for raw packed data */
+#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewPackedObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+/* for class or struct pointers */
+#define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
+
+/* for C or C++ function pointers */
+#define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
+#define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_Python_NewPointerObj(NULL, ptr, type, 0)
+
+/* for C++ member pointers, ie, member methods */
+#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewMemberObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+
+/* Runtime API */
+
+#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule(clientdata)
+#define SWIG_SetModule(clientdata, pointer)             SWIG_Python_SetModule(pointer)
+#define SWIG_NewClientData(obj)                         SwigPyClientData_New(obj)
+
+#define SWIG_SetErrorObj                                SWIG_Python_SetErrorObj                            
+#define SWIG_SetErrorMsg                        	SWIG_Python_SetErrorMsg				   
+#define SWIG_ErrorType(code)                    	SWIG_Python_ErrorType(code)                        
+#define SWIG_Error(code, msg)            		SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) 
+#define SWIG_fail                        		goto fail					   
+
+
+/* Runtime API implementation */
+
+/* Error manipulation */
+
+SWIGINTERN void 
+SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK; 
+  PyErr_SetObject(errtype, obj);
+  Py_DECREF(obj);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+SWIGINTERN void 
+SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+  PyErr_SetString(errtype, msg);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+#define SWIG_Python_Raise(obj, type, desc)  SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)
+
+/* Set a constant value */
+
+#if defined(SWIGPYTHON_BUILTIN)
+
+SWIGINTERN void
+SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) {
+  PyObject *s = PyString_InternFromString(key);
+  PyList_Append(seq, s);
+  Py_DECREF(s);
+}
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) {   
+#if PY_VERSION_HEX < 0x02030000
+  PyDict_SetItemString(d, (char *)name, obj);
+#else
+  PyDict_SetItemString(d, name, obj);
+#endif
+  Py_DECREF(obj);
+  if (public_interface)
+    SwigPyBuiltin_AddPublicSymbol(public_interface, name);
+}
+
+#else
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {   
+#if PY_VERSION_HEX < 0x02030000
+  PyDict_SetItemString(d, (char *)name, obj);
+#else
+  PyDict_SetItemString(d, name, obj);
+#endif
+  Py_DECREF(obj);                            
+}
+
+#endif
+
+/* Append a value to the result obj */
+
+SWIGINTERN PyObject*
+SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
+#if !defined(SWIG_PYTHON_OUTPUT_TUPLE)
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyList_Check(result)) {
+      PyObject *o2 = result;
+      result = PyList_New(1);
+      PyList_SetItem(result, 0, o2);
+    }
+    PyList_Append(result,obj);
+    Py_DECREF(obj);
+  }
+  return result;
+#else
+  PyObject*   o2;
+  PyObject*   o3;
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyTuple_Check(result)) {
+      o2 = result;
+      result = PyTuple_New(1);
+      PyTuple_SET_ITEM(result, 0, o2);
+    }
+    o3 = PyTuple_New(1);
+    PyTuple_SET_ITEM(o3, 0, obj);
+    o2 = result;
+    result = PySequence_Concat(o2, o3);
+    Py_DECREF(o2);
+    Py_DECREF(o3);
+  }
+  return result;
+#endif
+}
+
+/* Unpack the argument tuple */
+
+SWIGINTERN Py_ssize_t
+SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
+{
+  if (!args) {
+    if (!min && !max) {
+      return 1;
+    } else {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", 
+		   name, (min == max ? "" : "at least "), (int)min);
+      return 0;
+    }
+  }  
+  if (!PyTuple_Check(args)) {
+    if (min <= 1 && max >= 1) {
+      Py_ssize_t i;
+      objs[0] = args;
+      for (i = 1; i < max; ++i) {
+	objs[i] = 0;
+      }
+      return 2;
+    }
+    PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
+    return 0;
+  } else {
+    Py_ssize_t l = PyTuple_GET_SIZE(args);
+    if (l < min) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at least "), (int)min, (int)l);
+      return 0;
+    } else if (l > max) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at most "), (int)max, (int)l);
+      return 0;
+    } else {
+      Py_ssize_t i;
+      for (i = 0; i < l; ++i) {
+	objs[i] = PyTuple_GET_ITEM(args, i);
+      }
+      for (; l < max; ++l) {
+	objs[l] = 0;
+      }
+      return i + 1;
+    }    
+  }
+}
+
+/* A functor is a function object with one single object argument */
+#if PY_VERSION_HEX >= 0x02020000
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunctionObjArgs(functor, obj, NULL);
+#else
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunction(functor, "O", obj);
+#endif
+
+/*
+  Helper for static pointer initialization for both C and C++ code, for example
+  static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
+*/
+#ifdef __cplusplus
+#define SWIG_STATIC_POINTER(var)  var
+#else
+#define SWIG_STATIC_POINTER(var)  var = 0; if (!var) var
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Pointer declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_NOSHADOW       (SWIG_POINTER_OWN      << 1)
+#define SWIG_POINTER_NEW            (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)
+
+#define SWIG_POINTER_IMPLICIT_CONV  (SWIG_POINTER_DISOWN   << 1)
+
+#define SWIG_BUILTIN_TP_INIT	    (SWIG_POINTER_OWN << 2)
+#define SWIG_BUILTIN_INIT	    (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*  How to access Py_None */
+#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#  ifndef SWIG_PYTHON_NO_BUILD_NONE
+#    ifndef SWIG_PYTHON_BUILD_NONE
+#      define SWIG_PYTHON_BUILD_NONE
+#    endif
+#  endif
+#endif
+
+#ifdef SWIG_PYTHON_BUILD_NONE
+#  ifdef Py_None
+#   undef Py_None
+#   define Py_None SWIG_Py_None()
+#  endif
+SWIGRUNTIMEINLINE PyObject * 
+_SWIG_Py_None(void)
+{
+  PyObject *none = Py_BuildValue((char*)"");
+  Py_DECREF(none);
+  return none;
+}
+SWIGRUNTIME PyObject * 
+SWIG_Py_None(void)
+{
+  static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None();
+  return none;
+}
+#endif
+
+/* The python void return value */
+
+SWIGRUNTIMEINLINE PyObject * 
+SWIG_Py_Void(void)
+{
+  PyObject *none = Py_None;
+  Py_INCREF(none);
+  return none;
+}
+
+/* SwigPyClientData */
+
+typedef struct {
+  PyObject *klass;
+  PyObject *newraw;
+  PyObject *newargs;
+  PyObject *destroy;
+  int delargs;
+  int implicitconv;
+  PyTypeObject *pytype;
+} SwigPyClientData;
+
+SWIGRUNTIMEINLINE int 
+SWIG_Python_CheckImplicit(swig_type_info *ty)
+{
+  SwigPyClientData *data = (SwigPyClientData *)ty->clientdata;
+  return data ? data->implicitconv : 0;
+}
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_ExceptionType(swig_type_info *desc) {
+  SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0;
+  PyObject *klass = data ? data->klass : 0;
+  return (klass ? klass : PyExc_RuntimeError);
+}
+
+
+SWIGRUNTIME SwigPyClientData * 
+SwigPyClientData_New(PyObject* obj)
+{
+  if (!obj) {
+    return 0;
+  } else {
+    SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData));
+    /* the klass element */
+    data->klass = obj;
+    Py_INCREF(data->klass);
+    /* the newraw method and newargs arguments used to create a new raw instance */
+    if (PyClass_Check(obj)) {
+      data->newraw = 0;
+      data->newargs = obj;
+      Py_INCREF(obj);
+    } else {
+#if (PY_VERSION_HEX < 0x02020000)
+      data->newraw = 0;
+#else
+      data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__");
+#endif
+      if (data->newraw) {
+	Py_INCREF(data->newraw);
+	data->newargs = PyTuple_New(1);
+	PyTuple_SetItem(data->newargs, 0, obj);
+      } else {
+	data->newargs = obj;
+      }
+      Py_INCREF(data->newargs);
+    }
+    /* the destroy method, aka as the C++ delete method */
+    data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__");
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      data->destroy = 0;
+    }
+    if (data->destroy) {
+      int flags;
+      Py_INCREF(data->destroy);
+      flags = PyCFunction_GET_FLAGS(data->destroy);
+#ifdef METH_O
+      data->delargs = !(flags & (METH_O));
+#else
+      data->delargs = 0;
+#endif
+    } else {
+      data->delargs = 0;
+    }
+    data->implicitconv = 0;
+    data->pytype = 0;
+    return data;
+  }
+}
+
+SWIGRUNTIME void 
+SwigPyClientData_Del(SwigPyClientData *data) {
+  Py_XDECREF(data->newraw);
+  Py_XDECREF(data->newargs);
+  Py_XDECREF(data->destroy);
+}
+
+/* =============== SwigPyObject =====================*/
+
+typedef struct {
+  PyObject_HEAD
+  void *ptr;
+  swig_type_info *ty;
+  int own;
+  PyObject *next;
+#ifdef SWIGPYTHON_BUILTIN
+  PyObject *dict;
+#endif
+} SwigPyObject;
+
+
+#ifdef SWIGPYTHON_BUILTIN
+
+SWIGRUNTIME PyObject *
+SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+
+  if (!sobj->dict)
+    sobj->dict = PyDict_New();
+
+  Py_INCREF(sobj->dict);
+  return sobj->dict;
+}
+
+#endif
+
+SWIGRUNTIME PyObject *
+SwigPyObject_long(SwigPyObject *v)
+{
+  return PyLong_FromVoidPtr(v->ptr);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_format(const char* fmt, SwigPyObject *v)
+{
+  PyObject *res = NULL;
+  PyObject *args = PyTuple_New(1);
+  if (args) {
+    if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) {
+      PyObject *ofmt = SWIG_Python_str_FromChar(fmt);
+      if (ofmt) {
+#if PY_VERSION_HEX >= 0x03000000
+	res = PyUnicode_Format(ofmt,args);
+#else
+	res = PyString_Format(ofmt,args);
+#endif
+	Py_DECREF(ofmt);
+      }
+      Py_DECREF(args);
+    }
+  }
+  return res;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_oct(SwigPyObject *v)
+{
+  return SwigPyObject_format("%o",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_hex(SwigPyObject *v)
+{
+  return SwigPyObject_format("%x",v);
+}
+
+SWIGRUNTIME PyObject *
+#ifdef METH_NOARGS
+SwigPyObject_repr(SwigPyObject *v)
+#else
+SwigPyObject_repr(SwigPyObject *v, PyObject *args)
+#endif
+{
+  const char *name = SWIG_TypePrettyName(v->ty);
+  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", (name ? name : "unknown"), (void *)v);
+  if (v->next) {
+# ifdef METH_NOARGS
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
+# else
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args);
+# endif
+# if PY_VERSION_HEX >= 0x03000000
+    PyObject *joined = PyUnicode_Concat(repr, nrep);
+    Py_DecRef(repr);
+    Py_DecRef(nrep);
+    repr = joined;
+# else
+    PyString_ConcatAndDel(&repr,nrep);
+# endif
+  }
+  return repr;  
+}
+
+SWIGRUNTIME int
+SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
+{
+  void *i = v->ptr;
+  void *j = w->ptr;
+  return (i < j) ? -1 : ((i > j) ? 1 : 0);
+}
+
+/* Added for Python 3.x, would it also be useful for Python 2.x? */
+SWIGRUNTIME PyObject*
+SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op)
+{
+  PyObject* res;
+  if( op != Py_EQ && op != Py_NE ) {
+    Py_INCREF(Py_NotImplemented);
+    return Py_NotImplemented;
+  }
+  res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0);
+  return res;  
+}
+
+
+SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void);
+
+#ifdef SWIGPYTHON_BUILTIN
+static swig_type_info *SwigPyObject_stype = 0;
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+    SwigPyClientData *cd;
+    assert(SwigPyObject_stype);
+    cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+    assert(cd);
+    assert(cd->pytype);
+    return cd->pytype;
+}
+#else
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce();
+  return type;
+}
+#endif
+
+SWIGRUNTIMEINLINE int
+SwigPyObject_Check(PyObject *op) {
+#ifdef SWIGPYTHON_BUILTIN
+  PyTypeObject *target_tp = SwigPyObject_type();
+  if (PyType_IsSubtype(op->ob_type, target_tp))
+    return 1;
+  return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0);
+#else
+  return (Py_TYPE(op) == SwigPyObject_type())
+    || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0);
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own);
+
+SWIGRUNTIME void
+SwigPyObject_dealloc(PyObject *v)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  PyObject *next = sobj->next;
+  if (sobj->own == SWIG_POINTER_OWN) {
+    swig_type_info *ty = sobj->ty;
+    SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+    PyObject *destroy = data ? data->destroy : 0;
+    if (destroy) {
+      /* destroy is always a VARARGS method */
+      PyObject *res;
+
+      /* PyObject_CallFunction() has the potential to silently drop
+         the active active exception.  In cases of unnamed temporary
+         variable or where we just finished iterating over a generator
+         StopIteration will be active right now, and this needs to
+         remain true upon return from SwigPyObject_dealloc.  So save
+         and restore. */
+      
+      PyObject *val = NULL, *type = NULL, *tb = NULL;
+      PyErr_Fetch(&val, &type, &tb);
+
+      if (data->delargs) {
+        /* we need to create a temporary object to carry the destroy operation */
+        PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
+        res = SWIG_Python_CallFunctor(destroy, tmp);
+        Py_DECREF(tmp);
+      } else {
+        PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
+        PyObject *mself = PyCFunction_GET_SELF(destroy);
+        res = ((*meth)(mself, v));
+      }
+      if (!res)
+        PyErr_WriteUnraisable(destroy);
+
+      PyErr_Restore(val, type, tb);
+
+      Py_XDECREF(res);
+    } 
+#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
+    else {
+      const char *name = SWIG_TypePrettyName(ty);
+      printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown"));
+    }
+#endif
+  } 
+  Py_XDECREF(next);
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyObject* 
+SwigPyObject_append(PyObject* v, PyObject* next)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+#ifndef METH_O
+  PyObject *tmp = 0;
+  if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL;
+  next = tmp;
+#endif
+  if (!SwigPyObject_Check(next)) {
+    PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject");
+    return NULL;
+  }
+  sobj->next = next;
+  Py_INCREF(next);
+  return SWIG_Py_Void();
+}
+
+SWIGRUNTIME PyObject* 
+#ifdef METH_NOARGS
+SwigPyObject_next(PyObject* v)
+#else
+SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  if (sobj->next) {    
+    Py_INCREF(sobj->next);
+    return sobj->next;
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_disown(PyObject *v)
+#else
+SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = 0;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_acquire(PyObject *v)
+#else
+SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = SWIG_POINTER_OWN;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_own(PyObject *v, PyObject *args)
+{
+  PyObject *val = 0;
+#if (PY_VERSION_HEX < 0x02020000)
+  if (!PyArg_ParseTuple(args,(char *)"|O:own",&val))
+#elif (PY_VERSION_HEX < 0x02050000)
+  if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) 
+#else
+  if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) 
+#endif
+    {
+      return NULL;
+    } 
+  else
+    {
+      SwigPyObject *sobj = (SwigPyObject *)v;
+      PyObject *obj = PyBool_FromLong(sobj->own);
+      if (val) {
+#ifdef METH_NOARGS
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v);
+	} else {
+	  SwigPyObject_disown(v);
+	}
+#else
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v,args);
+	} else {
+	  SwigPyObject_disown(v,args);
+	}
+#endif
+      } 
+      return obj;
+    }
+}
+
+#ifdef METH_O
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_NOARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS,  (char *)"acquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_O,       (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_NOARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_NOARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#else
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_VARARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS,  (char *)"acquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS,  (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_VARARGS,  (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_VARARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,   METH_VARARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#endif
+
+#if PY_VERSION_HEX < 0x02020000
+SWIGINTERN PyObject *
+SwigPyObject_getattr(SwigPyObject *sobj,char *name)
+{
+  return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name);
+}
+#endif
+
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_TypeOnce(void) {
+  static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
+
+  static PyNumberMethods SwigPyObject_as_number = {
+    (binaryfunc)0, /*nb_add*/
+    (binaryfunc)0, /*nb_subtract*/
+    (binaryfunc)0, /*nb_multiply*/
+    /* nb_divide removed in Python 3 */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc)0, /*nb_divide*/
+#endif
+    (binaryfunc)0, /*nb_remainder*/
+    (binaryfunc)0, /*nb_divmod*/
+    (ternaryfunc)0,/*nb_power*/
+    (unaryfunc)0,  /*nb_negative*/
+    (unaryfunc)0,  /*nb_positive*/
+    (unaryfunc)0,  /*nb_absolute*/
+    (inquiry)0,    /*nb_nonzero*/
+    0,		   /*nb_invert*/
+    0,		   /*nb_lshift*/
+    0,		   /*nb_rshift*/
+    0,		   /*nb_and*/
+    0,		   /*nb_xor*/
+    0,		   /*nb_or*/
+#if PY_VERSION_HEX < 0x03000000
+    0,   /*nb_coerce*/
+#endif
+    (unaryfunc)SwigPyObject_long, /*nb_int*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_long, /*nb_long*/
+#else
+    0, /*nb_reserved*/
+#endif
+    (unaryfunc)0,                 /*nb_float*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_oct,  /*nb_oct*/
+    (unaryfunc)SwigPyObject_hex,  /*nb_hex*/
+#endif
+#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */
+#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
+#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
+#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */
+#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */
+    0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */
+#endif
+  };
+
+  static PyTypeObject swigpyobject_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyObject",               /* tp_name */
+      sizeof(SwigPyObject),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyObject_dealloc,     /* tp_dealloc */
+      0,				    /* tp_print */
+#if PY_VERSION_HEX < 0x02020000
+      (getattrfunc)SwigPyObject_getattr,    /* tp_getattr */
+#else
+      (getattrfunc)0,                       /* tp_getattr */
+#endif
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+#else
+      (cmpfunc)SwigPyObject_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyObject_repr,          /* tp_repr */
+      &SwigPyObject_as_number,              /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      0,				    /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigobject_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      swigobject_methods,                   /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
+#endif
+#ifdef COUNT_ALLOCS
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+      0,                                    /* tp_prev */
+#endif
+      0                                     /* tp_next */
+#endif
+    };
+    swigpyobject_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpyobject_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpyobject_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpyobject_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own)
+{
+  SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type());
+  if (sobj) {
+    sobj->ptr  = ptr;
+    sobj->ty   = ty;
+    sobj->own  = own;
+    sobj->next = 0;
+  }
+  return (PyObject *)sobj;
+}
+
+/* -----------------------------------------------------------------------------
+ * Implements a simple Swig Packed type, and use it instead of string
+ * ----------------------------------------------------------------------------- */
+
+typedef struct {
+  PyObject_HEAD
+  void *pack;
+  swig_type_info *ty;
+  size_t size;
+} SwigPyPacked;
+
+SWIGRUNTIME int
+SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags))
+{
+  char result[SWIG_BUFFER_SIZE];
+  fputs("<Swig Packed ", fp); 
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    fputs("at ", fp); 
+    fputs(result, fp); 
+  }
+  fputs(v->ty->name,fp); 
+  fputs(">", fp);
+  return 0; 
+}
+  
+SWIGRUNTIME PyObject *
+SwigPyPacked_repr(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name);
+  }  
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_str(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
+    return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromChar(v->ty->name);
+  }  
+}
+
+SWIGRUNTIME int
+SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w)
+{
+  size_t i = v->size;
+  size_t j = w->size;
+  int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
+  return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size);
+}
+
+SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void);
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce();
+  return type;
+}
+
+SWIGRUNTIMEINLINE int
+SwigPyPacked_Check(PyObject *op) {
+  return ((op)->ob_type == SwigPyPacked_TypeOnce()) 
+    || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0);
+}
+
+SWIGRUNTIME void
+SwigPyPacked_dealloc(PyObject *v)
+{
+  if (SwigPyPacked_Check(v)) {
+    SwigPyPacked *sobj = (SwigPyPacked *) v;
+    free(sobj->pack);
+  }
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_TypeOnce(void) {
+  static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
+  static PyTypeObject swigpypacked_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX>=0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyPacked",               /* tp_name */
+      sizeof(SwigPyPacked),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyPacked_dealloc,     /* tp_dealloc */
+      (printfunc)SwigPyPacked_print,        /* tp_print */
+      (getattrfunc)0,                       /* tp_getattr */
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX>=0x03000000
+      0, /* tp_reserved in 3.0.1 */
+#else
+      (cmpfunc)SwigPyPacked_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyPacked_repr,          /* tp_repr */
+      0,                                    /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      (reprfunc)SwigPyPacked_str,           /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigpacked_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      0,                                    /* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      0,                                    /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
+#endif
+#ifdef COUNT_ALLOCS
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+      0,                                    /* tp_prev */
+#endif
+      0                                     /* tp_next */
+#endif
+    };
+    swigpypacked_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpypacked_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpypacked_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpypacked_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty)
+{
+  SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type());
+  if (sobj) {
+    void *pack = malloc(size);
+    if (pack) {
+      memcpy(pack, ptr, size);
+      sobj->pack = pack;
+      sobj->ty   = ty;
+      sobj->size = size;
+    } else {
+      PyObject_DEL((PyObject *) sobj);
+      sobj = 0;
+    }
+  }
+  return (PyObject *) sobj;
+}
+
+SWIGRUNTIME swig_type_info *
+SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
+{
+  if (SwigPyPacked_Check(obj)) {
+    SwigPyPacked *sobj = (SwigPyPacked *)obj;
+    if (sobj->size != size) return 0;
+    memcpy(ptr, sobj->pack, size);
+    return sobj->ty;
+  } else {
+    return 0;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * pointers/data manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIMEINLINE PyObject *
+_SWIG_This(void)
+{
+    return SWIG_Python_str_FromChar("this");
+}
+
+static PyObject *swig_this = NULL;
+
+SWIGRUNTIME PyObject *
+SWIG_This(void)
+{
+  if (swig_this == NULL)
+    swig_this = _SWIG_This();
+  return swig_this;
+}
+
+/* #define SWIG_PYTHON_SLOW_GETSET_THIS */
+
+/* TODO: I don't know how to implement the fast getset in Python 3 right now */
+#if PY_VERSION_HEX>=0x03000000
+#define SWIG_PYTHON_SLOW_GETSET_THIS 
+#endif
+
+SWIGRUNTIME SwigPyObject *
+SWIG_Python_GetSwigThis(PyObject *pyobj) 
+{
+  PyObject *obj;
+
+  if (SwigPyObject_Check(pyobj))
+    return (SwigPyObject *) pyobj;
+
+#ifdef SWIGPYTHON_BUILTIN
+  (void)obj;
+# ifdef PyWeakref_CheckProxy
+  if (PyWeakref_CheckProxy(pyobj)) {
+    pyobj = PyWeakref_GET_OBJECT(pyobj);
+    if (pyobj && SwigPyObject_Check(pyobj))
+      return (SwigPyObject*) pyobj;
+  }
+# endif
+  return NULL;
+#else
+
+  obj = 0;
+
+#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000))
+  if (PyInstance_Check(pyobj)) {
+    obj = _PyInstance_Lookup(pyobj, SWIG_This());      
+  } else {
+    PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
+    if (dictptr != NULL) {
+      PyObject *dict = *dictptr;
+      obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
+    } else {
+#ifdef PyWeakref_CheckProxy
+      if (PyWeakref_CheckProxy(pyobj)) {
+	PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
+	return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
+      }
+#endif
+      obj = PyObject_GetAttr(pyobj,SWIG_This());
+      if (obj) {
+	Py_DECREF(obj);
+      } else {
+	if (PyErr_Occurred()) PyErr_Clear();
+	return 0;
+      }
+    }
+  }
+#else
+  obj = PyObject_GetAttr(pyobj,SWIG_This());
+  if (obj) {
+    Py_DECREF(obj);
+  } else {
+    if (PyErr_Occurred()) PyErr_Clear();
+    return 0;
+  }
+#endif
+  if (obj && !SwigPyObject_Check(obj)) {
+    /* a PyObject is called 'this', try to get the 'real this'
+       SwigPyObject from it */ 
+    return SWIG_Python_GetSwigThis(obj);
+  }
+  return (SwigPyObject *)obj;
+#endif
+}
+
+/* Acquire a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_AcquirePtr(PyObject *obj, int own) {
+  if (own == SWIG_POINTER_OWN) {
+    SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
+    if (sobj) {
+      int oldown = sobj->own;
+      sobj->own = own;
+      return oldown;
+    }
+  }
+  return 0;
+}
+
+/* Convert a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
+  int res;
+  SwigPyObject *sobj;
+  int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
+
+  if (!obj)
+    return SWIG_ERROR;
+  if (obj == Py_None && !implicit_conv) {
+    if (ptr)
+      *ptr = 0;
+    return SWIG_OK;
+  }
+
+  res = SWIG_ERROR;
+
+  sobj = SWIG_Python_GetSwigThis(obj);
+  if (own)
+    *own = 0;
+  while (sobj) {
+    void *vptr = sobj->ptr;
+    if (ty) {
+      swig_type_info *to = sobj->ty;
+      if (to == ty) {
+        /* no type cast needed */
+        if (ptr) *ptr = vptr;
+        break;
+      } else {
+        swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+        if (!tc) {
+          sobj = (SwigPyObject *)sobj->next;
+        } else {
+          if (ptr) {
+            int newmemory = 0;
+            *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+            if (newmemory == SWIG_CAST_NEW_MEMORY) {
+              assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+              if (own)
+                *own = *own | SWIG_CAST_NEW_MEMORY;
+            }
+          }
+          break;
+        }
+      }
+    } else {
+      if (ptr) *ptr = vptr;
+      break;
+    }
+  }
+  if (sobj) {
+    if (own)
+      *own = *own | sobj->own;
+    if (flags & SWIG_POINTER_DISOWN) {
+      sobj->own = 0;
+    }
+    res = SWIG_OK;
+  } else {
+    if (implicit_conv) {
+      SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+      if (data && !data->implicitconv) {
+        PyObject *klass = data->klass;
+        if (klass) {
+          PyObject *impconv;
+          data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
+          impconv = SWIG_Python_CallFunctor(klass, obj);
+          data->implicitconv = 0;
+          if (PyErr_Occurred()) {
+            PyErr_Clear();
+            impconv = 0;
+          }
+          if (impconv) {
+            SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv);
+            if (iobj) {
+              void *vptr;
+              res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
+              if (SWIG_IsOK(res)) {
+                if (ptr) {
+                  *ptr = vptr;
+                  /* transfer the ownership to 'ptr' */
+                  iobj->own = 0;
+                  res = SWIG_AddCast(res);
+                  res = SWIG_AddNewMask(res);
+                } else {
+                  res = SWIG_AddCast(res);		    
+                }
+              }
+            }
+            Py_DECREF(impconv);
+          }
+        }
+      }
+    }
+    if (!SWIG_IsOK(res) && obj == Py_None) {
+      if (ptr)
+        *ptr = 0;
+      if (PyErr_Occurred())
+        PyErr_Clear();
+      res = SWIG_OK;
+    }
+  }
+  return res;
+}
+
+/* Convert a function ptr value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
+  if (!PyCFunction_Check(obj)) {
+    return SWIG_ConvertPtr(obj, ptr, ty, 0);
+  } else {
+    void *vptr = 0;
+    
+    /* here we get the method pointer for callbacks */
+    const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
+    const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
+    if (desc)
+      desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
+    if (!desc) 
+      return SWIG_ERROR;
+    if (ty) {
+      swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
+      if (tc) {
+        int newmemory = 0;
+        *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+        assert(!newmemory); /* newmemory handling not yet implemented */
+      } else {
+        return SWIG_ERROR;
+      }
+    } else {
+      *ptr = vptr;
+    }
+    return SWIG_OK;
+  }
+}
+
+/* Convert a packed value value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
+  swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz);
+  if (!to) return SWIG_ERROR;
+  if (ty) {
+    if (to != ty) {
+      /* check type cast? */
+      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+      if (!tc) return SWIG_ERROR;
+    }
+  }
+  return SWIG_OK;
+}  
+
+/* -----------------------------------------------------------------------------
+ * Create a new pointer object
+ * ----------------------------------------------------------------------------- */
+
+/*
+  Create a new instance object, without calling __init__, and set the
+  'this' attribute.
+*/
+
+SWIGRUNTIME PyObject* 
+SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
+{
+#if (PY_VERSION_HEX >= 0x02020000)
+  PyObject *inst = 0;
+  PyObject *newraw = data->newraw;
+  if (newraw) {
+    inst = PyObject_Call(newraw, data->newargs, NULL);
+    if (inst) {
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+      PyObject **dictptr = _PyObject_GetDictPtr(inst);
+      if (dictptr != NULL) {
+	PyObject *dict = *dictptr;
+	if (dict == NULL) {
+	  dict = PyDict_New();
+	  *dictptr = dict;
+	  PyDict_SetItem(dict, SWIG_This(), swig_this);
+	}
+      }
+#else
+      PyObject *key = SWIG_This();
+      PyObject_SetAttr(inst, key, swig_this);
+#endif
+    }
+  } else {
+#if PY_VERSION_HEX >= 0x03000000
+    inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
+    if (inst) {
+      PyObject_SetAttr(inst, SWIG_This(), swig_this);
+      Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
+    }
+#else
+    PyObject *dict = PyDict_New();
+    if (dict) {
+      PyDict_SetItem(dict, SWIG_This(), swig_this);
+      inst = PyInstance_NewRaw(data->newargs, dict);
+      Py_DECREF(dict);
+    }
+#endif
+  }
+  return inst;
+#else
+#if (PY_VERSION_HEX >= 0x02010000)
+  PyObject *inst = 0;
+  PyObject *dict = PyDict_New();
+  if (dict) {
+    PyDict_SetItem(dict, SWIG_This(), swig_this);
+    inst = PyInstance_NewRaw(data->newargs, dict);
+    Py_DECREF(dict);
+  }
+  return (PyObject *) inst;
+#else
+  PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
+  if (inst == NULL) {
+    return NULL;
+  }
+  inst->in_class = (PyClassObject *)data->newargs;
+  Py_INCREF(inst->in_class);
+  inst->in_dict = PyDict_New();
+  if (inst->in_dict == NULL) {
+    Py_DECREF(inst);
+    return NULL;
+  }
+#ifdef Py_TPFLAGS_HAVE_WEAKREFS
+  inst->in_weakreflist = NULL;
+#endif
+#ifdef Py_TPFLAGS_GC
+  PyObject_GC_Init(inst);
+#endif
+  PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this);
+  return (PyObject *) inst;
+#endif
+#endif
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
+{
+ PyObject *dict;
+#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+ PyObject **dictptr = _PyObject_GetDictPtr(inst);
+ if (dictptr != NULL) {
+   dict = *dictptr;
+   if (dict == NULL) {
+     dict = PyDict_New();
+     *dictptr = dict;
+   }
+   PyDict_SetItem(dict, SWIG_This(), swig_this);
+   return;
+ }
+#endif
+ dict = PyObject_GetAttrString(inst, (char*)"__dict__");
+ PyDict_SetItem(dict, SWIG_This(), swig_this);
+ Py_DECREF(dict);
+} 
+
+
+SWIGINTERN PyObject *
+SWIG_Python_InitShadowInstance(PyObject *args) {
+  PyObject *obj[2];
+  if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) {
+    return NULL;
+  } else {
+    SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
+    if (sthis) {
+      SwigPyObject_append((PyObject*) sthis, obj[1]);
+    } else {
+      SWIG_Python_SetSwigThis(obj[0], obj[1]);
+    }
+    return SWIG_Py_Void();
+  }
+}
+
+/* Create a new pointer object */
+
+SWIGRUNTIME PyObject *
+SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) {
+  SwigPyClientData *clientdata;
+  PyObject * robj;
+  int own;
+
+  if (!ptr)
+    return SWIG_Py_Void();
+
+  clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0;
+  own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
+  if (clientdata && clientdata->pytype) {
+    SwigPyObject *newobj;
+    if (flags & SWIG_BUILTIN_TP_INIT) {
+      newobj = (SwigPyObject*) self;
+      if (newobj->ptr) {
+        PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0);
+        while (newobj->next)
+	  newobj = (SwigPyObject *) newobj->next;
+        newobj->next = next_self;
+        newobj = (SwigPyObject *)next_self;
+#ifdef SWIGPYTHON_BUILTIN
+        newobj->dict = 0;
+#endif
+      }
+    } else {
+      newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+#ifdef SWIGPYTHON_BUILTIN
+      newobj->dict = 0;
+#endif
+    }
+    if (newobj) {
+      newobj->ptr = ptr;
+      newobj->ty = type;
+      newobj->own = own;
+      newobj->next = 0;
+      return (PyObject*) newobj;
+    }
+    return SWIG_Py_Void();
+  }
+
+  assert(!(flags & SWIG_BUILTIN_TP_INIT));
+
+  robj = SwigPyObject_New(ptr, type, own);
+  if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
+    PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
+    Py_DECREF(robj);
+    robj = inst;
+  }
+  return robj;
+}
+
+/* Create a new packed object */
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
+  return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
+}
+
+/* -----------------------------------------------------------------------------*
+ *  Get type list 
+ * -----------------------------------------------------------------------------*/
+
+#ifdef SWIG_LINK_RUNTIME
+void *SWIG_ReturnGlobalTypeList(void *);
+#endif
+
+SWIGRUNTIME swig_module_info *
+SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
+  static void *type_pointer = (void *)0;
+  /* first check if module already created */
+  if (!type_pointer) {
+#ifdef SWIG_LINK_RUNTIME
+    type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
+#else
+# ifdef SWIGPY_USE_CAPSULE
+    type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0);
+# else
+    type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
+				    (char*)"type_pointer" SWIG_TYPE_TABLE_NAME);
+# endif
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      type_pointer = (void *)0;
+    }
+#endif
+  }
+  return (swig_module_info *) type_pointer;
+}
+
+#if PY_MAJOR_VERSION < 2
+/* PyModule_AddObject function was introduced in Python 2.0.  The following function
+   is copied out of Python/modsupport.c in python version 2.3.4 */
+SWIGINTERN int
+PyModule_AddObject(PyObject *m, char *name, PyObject *o)
+{
+  PyObject *dict;
+  if (!PyModule_Check(m)) {
+    PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg");
+    return SWIG_ERROR;
+  }
+  if (!o) {
+    PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value");
+    return SWIG_ERROR;
+  }
+  
+  dict = PyModule_GetDict(m);
+  if (dict == NULL) {
+    /* Internal error -- modules must have a dict! */
+    PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
+		 PyModule_GetName(m));
+    return SWIG_ERROR;
+  }
+  if (PyDict_SetItemString(dict, name, o))
+    return SWIG_ERROR;
+  Py_DECREF(o);
+  return SWIG_OK;
+}
+#endif
+
+SWIGRUNTIME void
+#ifdef SWIGPY_USE_CAPSULE
+SWIG_Python_DestroyModule(PyObject *obj)
+#else
+SWIG_Python_DestroyModule(void *vptr)
+#endif
+{
+#ifdef SWIGPY_USE_CAPSULE
+  swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME);
+#else
+  swig_module_info *swig_module = (swig_module_info *) vptr;
+#endif
+  swig_type_info **types = swig_module->types;
+  size_t i;
+  for (i =0; i < swig_module->size; ++i) {
+    swig_type_info *ty = types[i];
+    if (ty->owndata) {
+      SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
+      if (data) SwigPyClientData_Del(data);
+    }
+  }
+  Py_DECREF(SWIG_This());
+  swig_this = NULL;
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetModule(swig_module_info *swig_module) {
+#if PY_VERSION_HEX >= 0x03000000
+ /* Add a dummy module object into sys.modules */
+  PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION);
+#else
+  static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+  PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table);
+#endif
+#ifdef SWIGPY_USE_CAPSULE
+  PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#else
+  PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#endif
+}
+
+/* The python cached type query */
+SWIGRUNTIME PyObject *
+SWIG_Python_TypeCache(void) {
+  static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New();
+  return cache;
+}
+
+SWIGRUNTIME swig_type_info *
+SWIG_Python_TypeQuery(const char *type)
+{
+  PyObject *cache = SWIG_Python_TypeCache();
+  PyObject *key = SWIG_Python_str_FromChar(type); 
+  PyObject *obj = PyDict_GetItem(cache, key);
+  swig_type_info *descriptor;
+  if (obj) {
+#ifdef SWIGPY_USE_CAPSULE
+    descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL);
+#else
+    descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj);
+#endif
+  } else {
+    swig_module_info *swig_module = SWIG_GetModule(0);
+    descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
+    if (descriptor) {
+#ifdef SWIGPY_USE_CAPSULE
+      obj = PyCapsule_New((void*) descriptor, NULL, NULL);
+#else
+      obj = PyCObject_FromVoidPtr(descriptor, NULL);
+#endif
+      PyDict_SetItem(cache, key, obj);
+      Py_DECREF(obj);
+    }
+  }
+  Py_DECREF(key);
+  return descriptor;
+}
+
+/* 
+   For backward compatibility only
+*/
+#define SWIG_POINTER_EXCEPTION  0
+#define SWIG_arg_fail(arg)      SWIG_Python_ArgFail(arg)
+#define SWIG_MustGetPtr(p, type, argnum, flags)  SWIG_Python_MustGetPtr(p, type, argnum, flags)
+
+SWIGRUNTIME int
+SWIG_Python_AddErrMesg(const char* mesg, int infront)
+{  
+  if (PyErr_Occurred()) {
+    PyObject *type = 0;
+    PyObject *value = 0;
+    PyObject *traceback = 0;
+    PyErr_Fetch(&type, &value, &traceback);
+    if (value) {
+      char *tmp;
+      PyObject *old_str = PyObject_Str(value);
+      Py_XINCREF(type);
+      PyErr_Clear();
+      if (infront) {
+	PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str));
+      } else {
+	PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+      }
+      SWIG_Python_str_DelForPy3(tmp);
+      Py_DECREF(old_str);
+    }
+    return 1;
+  } else {
+    return 0;
+  }
+}
+  
+SWIGRUNTIME int
+SWIG_Python_ArgFail(int argnum)
+{
+  if (PyErr_Occurred()) {
+    /* add information about failing argument */
+    char mesg[256];
+    PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
+    return SWIG_Python_AddErrMesg(mesg, 1);
+  } else {
+    return 0;
+  }
+}
+
+SWIGRUNTIMEINLINE const char *
+SwigPyObject_GetDesc(PyObject *self)
+{
+  SwigPyObject *v = (SwigPyObject *)self;
+  swig_type_info *ty = v ? v->ty : 0;
+  return ty ? ty->str : "";
+}
+
+SWIGRUNTIME void
+SWIG_Python_TypeError(const char *type, PyObject *obj)
+{
+  if (type) {
+#if defined(SWIG_COBJECT_TYPES)
+    if (obj && SwigPyObject_Check(obj)) {
+      const char *otype = (const char *) SwigPyObject_GetDesc(obj);
+      if (otype) {
+	PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received",
+		     type, otype);
+	return;
+      }
+    } else 
+#endif      
+    {
+      const char *otype = (obj ? obj->ob_type->tp_name : 0); 
+      if (otype) {
+	PyObject *str = PyObject_Str(obj);
+	const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0;
+	if (cstr) {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
+		       type, otype, cstr);
+          SWIG_Python_str_DelForPy3(cstr);
+	} else {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
+		       type, otype);
+	}
+	Py_XDECREF(str);
+	return;
+      }
+    }   
+    PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
+  } else {
+    PyErr_Format(PyExc_TypeError, "unexpected type is received");
+  }
+}
+
+
+/* Convert a pointer value, signal an exception on a type mismatch */
+SWIGRUNTIME void *
+SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) {
+  void *result;
+  if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
+    PyErr_Clear();
+#if SWIG_POINTER_EXCEPTION
+    if (flags) {
+      SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj);
+      SWIG_Python_ArgFail(argnum);
+    }
+#endif
+  }
+  return result;
+}
+
+#ifdef SWIGPYTHON_BUILTIN
+SWIGRUNTIME int
+SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
+  PyTypeObject *tp = obj->ob_type;
+  PyObject *descr;
+  PyObject *encoded_name;
+  descrsetfunc f;
+  int res = -1;
+
+# ifdef Py_USING_UNICODE
+  if (PyString_Check(name)) {
+    name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL);
+    if (!name)
+      return -1;
+  } else if (!PyUnicode_Check(name))
+# else
+  if (!PyString_Check(name))
+# endif
+  {
+    PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name);
+    return -1;
+  } else {
+    Py_INCREF(name);
+  }
+
+  if (!tp->tp_dict) {
+    if (PyType_Ready(tp) < 0)
+      goto done;
+  }
+
+  descr = _PyType_Lookup(tp, name);
+  f = NULL;
+  if (descr != NULL)
+    f = descr->ob_type->tp_descr_set;
+  if (!f) {
+    if (PyString_Check(name)) {
+      encoded_name = name;
+      Py_INCREF(name);
+    } else {
+      encoded_name = PyUnicode_AsUTF8String(name);
+    }
+    PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name));
+    Py_DECREF(encoded_name);
+  } else {
+    res = f(descr, obj, value);
+  }
+  
+  done:
+  Py_DECREF(name);
+  return res;
+}
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
+
+
+
+  #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) 
+
+/* -----------------------------------------------------------------------------
+ * director_common.swg
+ *
+ * This file contains support for director classes which is common between
+ * languages.
+ * ----------------------------------------------------------------------------- */
+
+/*
+  Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the
+  'Swig' namespace. This could be useful for multi-modules projects.
+*/
+#ifdef SWIG_DIRECTOR_STATIC
+/* Force anonymous (static) namespace */
+#define Swig
+#endif
+/* -----------------------------------------------------------------------------
+ * director.swg
+ *
+ * This file contains support for director classes so that Python proxy
+ * methods can be called from C++.
+ * ----------------------------------------------------------------------------- */
+
+#ifndef SWIG_DIRECTOR_PYTHON_HEADER_
+#define SWIG_DIRECTOR_PYTHON_HEADER_
+
+#include <string>
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <map>
+
+
+/*
+  Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual
+  table', and avoid multiple GetAttr calls to retrieve the python
+  methods.
+*/
+
+#ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE
+#ifndef SWIG_PYTHON_DIRECTOR_VTABLE
+#define SWIG_PYTHON_DIRECTOR_VTABLE
+#endif
+#endif
+
+
+
+/*
+  Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the
+  Undefined Exception Handler provided by swig.
+*/
+#ifndef SWIG_DIRECTOR_NO_UEH
+#ifndef SWIG_DIRECTOR_UEH
+#define SWIG_DIRECTOR_UEH
+#endif
+#endif
+
+
+/*
+  Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the
+  native C++ RTTI and dynamic_cast<>. But be aware that directors
+  could stop working when using this option.
+*/
+#ifdef SWIG_DIRECTOR_NORTTI
+/*
+   When we don't use the native C++ RTTI, we implement a minimal one
+   only for Directors.
+*/
+# ifndef SWIG_DIRECTOR_RTDIR
+# define SWIG_DIRECTOR_RTDIR
+
+namespace Swig {
+  class Director;
+  SWIGINTERN std::map<void *, Director *>& get_rtdir_map() {
+    static std::map<void *, Director *> rtdir_map;
+    return rtdir_map;
+  }
+
+  SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) {
+    get_rtdir_map()[vptr] = rtdir;
+  }
+
+  SWIGINTERNINLINE Director *get_rtdir(void *vptr) {
+    std::map<void *, Director *>::const_iterator pos = get_rtdir_map().find(vptr);
+    Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0;
+    return rtdir;
+  }
+}
+# endif /* SWIG_DIRECTOR_RTDIR */
+
+# define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast<void *>(ARG))
+# define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast<void *>(ARG1), ARG2)
+
+#else
+
+# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast<Swig::Director *>(ARG)
+# define SWIG_DIRECTOR_RGTR(ARG1, ARG2)
+
+#endif /* SWIG_DIRECTOR_NORTTI */
+
+extern "C" {
+  struct swig_type_info;
+}
+
+namespace Swig {
+
+  /* memory handler */
+  struct GCItem {
+    virtual ~GCItem() {}
+
+    virtual int get_own() const {
+      return 0;
+    }
+  };
+
+  struct GCItem_var {
+    GCItem_var(GCItem *item = 0) : _item(item) {
+    }
+
+    GCItem_var& operator=(GCItem *item) {
+      GCItem *tmp = _item;
+      _item = item;
+      delete tmp;
+      return *this;
+    }
+
+    ~GCItem_var() {
+      delete _item;
+    }
+
+    GCItem * operator->() const {
+      return _item;
+    }
+
+  private:
+    GCItem *_item;
+  };
+
+  struct GCItem_Object : GCItem {
+    GCItem_Object(int own) : _own(own) {
+    }
+
+    virtual ~GCItem_Object() {
+    }
+
+    int get_own() const {
+      return _own;
+    }
+
+  private:
+    int _own;
+  };
+
+  template <typename Type>
+  struct GCItem_T : GCItem {
+    GCItem_T(Type *ptr) : _ptr(ptr) {
+    }
+
+    virtual ~GCItem_T() {
+      delete _ptr;
+    }
+
+  private:
+    Type *_ptr;
+  };
+
+  template <typename Type>
+  struct GCArray_T : GCItem {
+    GCArray_T(Type *ptr) : _ptr(ptr) {
+    }
+
+    virtual ~GCArray_T() {
+      delete[] _ptr;
+    }
+
+  private:
+    Type *_ptr;
+  };
+
+  /* base class for director exceptions */
+  class DirectorException : public std::exception {
+  protected:
+    std::string swig_msg;
+  public:
+    DirectorException(PyObject *error, const char *hdr ="", const char *msg ="") : swig_msg(hdr) {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (msg[0]) {
+        swig_msg += " ";
+        swig_msg += msg;
+      }
+      if (!PyErr_Occurred()) {
+        PyErr_SetString(error, what());
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+
+    virtual ~DirectorException() throw() {
+    }
+
+    /* Deprecated, use what() instead */
+    const char *getMessage() const {
+      return what();
+    }
+
+    const char *what() const throw() {
+      return swig_msg.c_str();
+    }
+
+    static void raise(PyObject *error, const char *msg) {
+      throw DirectorException(error, msg);
+    }
+
+    static void raise(const char *msg) {
+      raise(PyExc_RuntimeError, msg);
+    }
+  };
+
+  /* unknown exception handler  */
+  class UnknownExceptionHandler {
+#ifdef SWIG_DIRECTOR_UEH
+    static void handler() {
+      try {
+        throw;
+      } catch (DirectorException& e) {
+        std::cerr << "SWIG Director exception caught:" << std::endl
+                  << e.what() << std::endl;
+      } catch (std::exception& e) {
+        std::cerr << "std::exception caught: "<< e.what() << std::endl;
+      } catch (...) {
+        std::cerr << "Unknown exception caught." << std::endl;
+      }
+
+      std::cerr << std::endl
+                << "Python interpreter traceback:" << std::endl;
+      PyErr_Print();
+      std::cerr << std::endl;
+
+      std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl
+                << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl
+                << std::endl
+                << "Exception is being re-thrown, program will likely abort/terminate." << std::endl;
+      throw;
+    }
+
+  public:
+
+    std::unexpected_handler old;
+    UnknownExceptionHandler(std::unexpected_handler nh = handler) {
+      old = std::set_unexpected(nh);
+    }
+
+    ~UnknownExceptionHandler() {
+      std::set_unexpected(old);
+    }
+#endif
+  };
+
+  /* type mismatch in the return value from a python method call */
+  class DirectorTypeMismatchException : public DirectorException {
+  public:
+    DirectorTypeMismatchException(PyObject *error, const char *msg="")
+      : DirectorException(error, "SWIG director type mismatch", msg) {
+    }
+
+    DirectorTypeMismatchException(const char *msg="")
+      : DirectorException(PyExc_TypeError, "SWIG director type mismatch", msg) {
+    }
+
+    static void raise(PyObject *error, const char *msg) {
+      throw DirectorTypeMismatchException(error, msg);
+    }
+
+    static void raise(const char *msg) {
+      throw DirectorTypeMismatchException(msg);
+    }
+  };
+
+  /* any python exception that occurs during a director method call */
+  class DirectorMethodException : public DirectorException {
+  public:
+    DirectorMethodException(const char *msg = "")
+      : DirectorException(PyExc_RuntimeError, "SWIG director method error.", msg) {
+    }
+
+    static void raise(const char *msg) {
+      throw DirectorMethodException(msg);
+    }
+  };
+
+  /* attempt to call a pure virtual method via a director method */
+  class DirectorPureVirtualException : public DirectorException {
+  public:
+    DirectorPureVirtualException(const char *msg = "")
+      : DirectorException(PyExc_RuntimeError, "SWIG director pure virtual method called", msg) {
+    }
+
+    static void raise(const char *msg) {
+      throw DirectorPureVirtualException(msg);
+    }
+  };
+
+
+#if defined(SWIG_PYTHON_THREADS)
+/*  __THREAD__ is the old macro to activate some thread support */
+# if !defined(__THREAD__)
+#   define __THREAD__ 1
+# endif
+#endif
+
+#ifdef __THREAD__
+# include "pythread.h"
+  class Guard {
+    PyThread_type_lock &mutex_;
+
+  public:
+    Guard(PyThread_type_lock & mutex) : mutex_(mutex) {
+      PyThread_acquire_lock(mutex_, WAIT_LOCK);
+    }
+
+    ~Guard() {
+      PyThread_release_lock(mutex_);
+    }
+  };
+# define SWIG_GUARD(mutex) Guard _guard(mutex)
+#else
+# define SWIG_GUARD(mutex)
+#endif
+
+  /* director base class */
+  class Director {
+  private:
+    /* pointer to the wrapped python object */
+    PyObject *swig_self;
+    /* flag indicating whether the object is owned by python or c++ */
+    mutable bool swig_disown_flag;
+
+    /* decrement the reference count of the wrapped python object */
+    void swig_decref() const {
+      if (swig_disown_flag) {
+        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+        Py_DECREF(swig_self);
+        SWIG_PYTHON_THREAD_END_BLOCK;
+      }
+    }
+
+  public:
+    /* wrap a python object. */
+    Director(PyObject *self) : swig_self(self), swig_disown_flag(false) {
+    }
+
+    /* discard our reference at destruction */
+    virtual ~Director() {
+      swig_decref();
+    }
+
+    /* return a pointer to the wrapped python object */
+    PyObject *swig_get_self() const {
+      return swig_self;
+    }
+
+    /* acquire ownership of the wrapped python object (the sense of "disown" is from python) */
+    void swig_disown() const {
+      if (!swig_disown_flag) {
+        swig_disown_flag=true;
+        swig_incref();
+      }
+    }
+
+    /* increase the reference count of the wrapped python object */
+    void swig_incref() const {
+      if (swig_disown_flag) {
+        Py_INCREF(swig_self);
+      }
+    }
+
+    /* methods to implement pseudo protected director members */
+    virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const {
+      return true;
+    }
+
+    virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const {
+    }
+
+  /* ownership management */
+  private:
+    typedef std::map<void *, GCItem_var> swig_ownership_map;
+    mutable swig_ownership_map swig_owner;
+#ifdef __THREAD__
+    static PyThread_type_lock swig_mutex_own;
+#endif
+
+  public:
+    template <typename Type>
+    void swig_acquire_ownership_array(Type *vptr) const {
+      if (vptr) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_owner[vptr] = new GCArray_T<Type>(vptr);
+      }
+    }
+
+    template <typename Type>
+    void swig_acquire_ownership(Type *vptr) const {
+      if (vptr) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_owner[vptr] = new GCItem_T<Type>(vptr);
+      }
+    }
+
+    void swig_acquire_ownership_obj(void *vptr, int own) const {
+      if (vptr && own) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_owner[vptr] = new GCItem_Object(own);
+      }
+    }
+
+    int swig_release_ownership(void *vptr) const {
+      int own = 0;
+      if (vptr) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_ownership_map::iterator iter = swig_owner.find(vptr);
+        if (iter != swig_owner.end()) {
+          own = iter->second->get_own();
+          swig_owner.erase(iter);
+        }
+      }
+      return own;
+    }
+
+    template <typename Type>
+    static PyObject *swig_pyobj_disown(PyObject *pyobj, PyObject *SWIGUNUSEDPARM(args)) {
+      SwigPyObject *sobj = (SwigPyObject *)pyobj;
+      sobj->own = 0;
+      Director *d = SWIG_DIRECTOR_CAST(reinterpret_cast<Type *>(sobj->ptr));
+      if (d)
+        d->swig_disown();
+      return PyWeakref_NewProxy(pyobj, NULL);
+    }
+  };
+
+#ifdef __THREAD__
+  PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock();
+#endif
+}
+
+#endif
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p_AdjustMinimizerStrategy swig_types[0]
+#define SWIGTYPE_p_AngularPixelMap swig_types[1]
+#define SWIGTYPE_p_AttLimits swig_types[2]
+#define SWIGTYPE_p_Attributes swig_types[3]
+#define SWIGTYPE_p_BasicVector3DT_double_t swig_types[4]
+#define SWIGTYPE_p_BasicVector3DT_int_t swig_types[5]
+#define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[6]
+#define SWIGTYPE_p_Beam swig_types[7]
+#define SWIGTYPE_p_Bin1D swig_types[8]
+#define SWIGTYPE_p_Bin1DCVector swig_types[9]
+#define SWIGTYPE_p_Bin1DKVector swig_types[10]
+#define SWIGTYPE_p_CallbackMap_t swig_types[11]
+#define SWIGTYPE_p_ChiSquaredModule swig_types[12]
+#define SWIGTYPE_p_ConstKBinAxis swig_types[13]
+#define SWIGTYPE_p_CreateItemCallback swig_types[14]
+#define SWIGTYPE_p_Crystal swig_types[15]
+#define SWIGTYPE_p_CustomBinAxis swig_types[16]
+#define SWIGTYPE_p_DescriptionMap_t swig_types[17]
+#define SWIGTYPE_p_DetectorMask swig_types[18]
+#define SWIGTYPE_p_DistributionCosine swig_types[19]
+#define SWIGTYPE_p_DistributionGate swig_types[20]
+#define SWIGTYPE_p_DistributionGaussian swig_types[21]
+#define SWIGTYPE_p_DistributionHandler swig_types[22]
+#define SWIGTYPE_p_DistributionLogNormal swig_types[23]
+#define SWIGTYPE_p_DistributionLorentz swig_types[24]
+#define SWIGTYPE_p_FTDecayFunction1DCauchy swig_types[25]
+#define SWIGTYPE_p_FTDecayFunction1DGauss swig_types[26]
+#define SWIGTYPE_p_FTDecayFunction1DTriangle swig_types[27]
+#define SWIGTYPE_p_FTDecayFunction1DVoigt swig_types[28]
+#define SWIGTYPE_p_FTDecayFunction2DCauchy swig_types[29]
+#define SWIGTYPE_p_FTDecayFunction2DGauss swig_types[30]
+#define SWIGTYPE_p_FTDecayFunction2DVoigt swig_types[31]
+#define SWIGTYPE_p_FTDistribution1DCauchy swig_types[32]
+#define SWIGTYPE_p_FTDistribution1DCosine swig_types[33]
+#define SWIGTYPE_p_FTDistribution1DGate swig_types[34]
+#define SWIGTYPE_p_FTDistribution1DGauss swig_types[35]
+#define SWIGTYPE_p_FTDistribution1DTriangle swig_types[36]
+#define SWIGTYPE_p_FTDistribution1DVoigt swig_types[37]
+#define SWIGTYPE_p_FTDistribution2DCauchy swig_types[38]
+#define SWIGTYPE_p_FTDistribution2DCone swig_types[39]
+#define SWIGTYPE_p_FTDistribution2DGate swig_types[40]
+#define SWIGTYPE_p_FTDistribution2DGauss swig_types[41]
+#define SWIGTYPE_p_FTDistribution2DVoigt swig_types[42]
+#define SWIGTYPE_p_FitObject swig_types[43]
+#define SWIGTYPE_p_FitObjects_t swig_types[44]
+#define SWIGTYPE_p_FitOptions swig_types[45]
+#define SWIGTYPE_p_FitParameter swig_types[46]
+#define SWIGTYPE_p_FitParameterLinked swig_types[47]
+#define SWIGTYPE_p_FitParameterSet swig_types[48]
+#define SWIGTYPE_p_FitStrategyDefault swig_types[49]
+#define SWIGTYPE_p_FitSuite swig_types[50]
+#define SWIGTYPE_p_FitSuiteImpl swig_types[51]
+#define SWIGTYPE_p_FitSuiteObjects swig_types[52]
+#define SWIGTYPE_p_FitSuiteStrategies swig_types[53]
+#define SWIGTYPE_p_FixedBinAxis swig_types[54]
+#define SWIGTYPE_p_FormFactorAnisoPyramid swig_types[55]
+#define SWIGTYPE_p_FormFactorBox swig_types[56]
+#define SWIGTYPE_p_FormFactorCone swig_types[57]
+#define SWIGTYPE_p_FormFactorCone6 swig_types[58]
+#define SWIGTYPE_p_FormFactorCrystal swig_types[59]
+#define SWIGTYPE_p_FormFactorCuboctahedron swig_types[60]
+#define SWIGTYPE_p_FormFactorCylinder swig_types[61]
+#define SWIGTYPE_p_FormFactorDecoratorDebyeWaller swig_types[62]
+#define SWIGTYPE_p_FormFactorDecoratorFactor swig_types[63]
+#define SWIGTYPE_p_FormFactorDecoratorMaterial swig_types[64]
+#define SWIGTYPE_p_FormFactorDecoratorPositionFactor swig_types[65]
+#define SWIGTYPE_p_FormFactorDecoratorRotation swig_types[66]
+#define SWIGTYPE_p_FormFactorDodecahedron swig_types[67]
+#define SWIGTYPE_p_FormFactorEllipsoidalCylinder swig_types[68]
+#define SWIGTYPE_p_FormFactorFullSphere swig_types[69]
+#define SWIGTYPE_p_FormFactorFullSpheroid swig_types[70]
+#define SWIGTYPE_p_FormFactorGauss swig_types[71]
+#define SWIGTYPE_p_FormFactorHemiEllipsoid swig_types[72]
+#define SWIGTYPE_p_FormFactorIcosahedron swig_types[73]
+#define SWIGTYPE_p_FormFactorLongBoxGauss swig_types[74]
+#define SWIGTYPE_p_FormFactorLongBoxLorentz swig_types[75]
+#define SWIGTYPE_p_FormFactorLongRipple1Gauss swig_types[76]
+#define SWIGTYPE_p_FormFactorLongRipple1Lorentz swig_types[77]
+#define SWIGTYPE_p_FormFactorLongRipple2Gauss swig_types[78]
+#define SWIGTYPE_p_FormFactorLongRipple2Lorentz swig_types[79]
+#define SWIGTYPE_p_FormFactorLorentz swig_types[80]
+#define SWIGTYPE_p_FormFactorPolygonalPrism swig_types[81]
+#define SWIGTYPE_p_FormFactorPolygonalSurface swig_types[82]
+#define SWIGTYPE_p_FormFactorPolyhedron swig_types[83]
+#define SWIGTYPE_p_FormFactorPrism3 swig_types[84]
+#define SWIGTYPE_p_FormFactorPrism6 swig_types[85]
+#define SWIGTYPE_p_FormFactorPyramid swig_types[86]
+#define SWIGTYPE_p_FormFactorRipple1 swig_types[87]
+#define SWIGTYPE_p_FormFactorRipple2 swig_types[88]
+#define SWIGTYPE_p_FormFactorSphereGaussianRadius swig_types[89]
+#define SWIGTYPE_p_FormFactorSphereLogNormalRadius swig_types[90]
+#define SWIGTYPE_p_FormFactorSphereUniformRadius swig_types[91]
+#define SWIGTYPE_p_FormFactorTetrahedron swig_types[92]
+#define SWIGTYPE_p_FormFactorTrivial swig_types[93]
+#define SWIGTYPE_p_FormFactorTruncatedCube swig_types[94]
+#define SWIGTYPE_p_FormFactorTruncatedSphere swig_types[95]
+#define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[96]
+#define SWIGTYPE_p_FormFactorWeighted swig_types[97]
+#define SWIGTYPE_p_GISASSimulation swig_types[98]
+#define SWIGTYPE_p_Geometry__Ellipse swig_types[99]
+#define SWIGTYPE_p_Geometry__HorizontalLine swig_types[100]
+#define SWIGTYPE_p_Geometry__IShape2D swig_types[101]
+#define SWIGTYPE_p_Geometry__Line swig_types[102]
+#define SWIGTYPE_p_Geometry__Polygon swig_types[103]
+#define SWIGTYPE_p_Geometry__PolygonPrivate swig_types[104]
+#define SWIGTYPE_p_Geometry__Rectangle swig_types[105]
+#define SWIGTYPE_p_Geometry__VerticalLine swig_types[106]
+#define SWIGTYPE_p_Histogram1D swig_types[107]
+#define SWIGTYPE_p_Histogram2D swig_types[108]
+#define SWIGTYPE_p_HomogeneousMagneticMaterial swig_types[109]
+#define SWIGTYPE_p_HomogeneousMaterial swig_types[110]
+#define SWIGTYPE_p_IAbstractParticle swig_types[111]
+#define SWIGTYPE_p_IAxis swig_types[112]
+#define SWIGTYPE_p_IChiSquaredModule swig_types[113]
+#define SWIGTYPE_p_ICloneable swig_types[114]
+#define SWIGTYPE_p_IClusteredParticles swig_types[115]
+#define SWIGTYPE_p_ICompositeSample swig_types[116]
+#define SWIGTYPE_p_IDetector2D swig_types[117]
+#define SWIGTYPE_p_IDetectorResolution swig_types[118]
+#define SWIGTYPE_p_IDistribution1D swig_types[119]
+#define SWIGTYPE_p_IFTDecayFunction1D swig_types[120]
+#define SWIGTYPE_p_IFTDecayFunction2D swig_types[121]
+#define SWIGTYPE_p_IFTDistribution1D swig_types[122]
+#define SWIGTYPE_p_IFTDistribution2D swig_types[123]
+#define SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t swig_types[124]
+#define SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t swig_types[125]
+#define SWIGTYPE_p_IFitObserver swig_types[126]
+#define SWIGTYPE_p_IFitParameter swig_types[127]
+#define SWIGTYPE_p_IFitStrategy swig_types[128]
+#define SWIGTYPE_p_IFormFactor swig_types[129]
+#define SWIGTYPE_p_IFormFactorBorn swig_types[130]
+#define SWIGTYPE_p_IFormFactorDecorator swig_types[131]
+#define SWIGTYPE_p_IHistogram swig_types[132]
+#define SWIGTYPE_p_IIntensityFunction swig_types[133]
+#define SWIGTYPE_p_IIntensityNormalizer swig_types[134]
+#define SWIGTYPE_p_IInterferenceFunction swig_types[135]
+#define SWIGTYPE_p_ILayerRTCoefficients swig_types[136]
+#define SWIGTYPE_p_ILayout swig_types[137]
+#define SWIGTYPE_p_IMaterial swig_types[138]
+#define SWIGTYPE_p_IMinimizer swig_types[139]
+#define SWIGTYPE_p_IMultiLayerBuilder swig_types[140]
+#define SWIGTYPE_p_INamed swig_types[141]
+#define SWIGTYPE_p_INoncopyable swig_types[142]
+#define SWIGTYPE_p_IObservable swig_types[143]
+#define SWIGTYPE_p_IObserver swig_types[144]
+#define SWIGTYPE_p_IParameterT_double_t swig_types[145]
+#define SWIGTYPE_p_IParameterized swig_types[146]
+#define SWIGTYPE_p_IParticle swig_types[147]
+#define SWIGTYPE_p_IPixelMap swig_types[148]
+#define SWIGTYPE_p_IResolutionFunction2D swig_types[149]
+#define SWIGTYPE_p_IRotation swig_types[150]
+#define SWIGTYPE_p_IRoughness swig_types[151]
+#define SWIGTYPE_p_ISample swig_types[152]
+#define SWIGTYPE_p_ISampleVisitor swig_types[153]
+#define SWIGTYPE_p_ISelectionRule swig_types[154]
+#define SWIGTYPE_p_ISquaredFunction swig_types[155]
+#define SWIGTYPE_p_Instrument swig_types[156]
+#define SWIGTYPE_p_IntensityDataIOFactory swig_types[157]
+#define SWIGTYPE_p_IntensityFunctionLog swig_types[158]
+#define SWIGTYPE_p_IntensityFunctionSqrt swig_types[159]
+#define SWIGTYPE_p_IntensityNormalizer swig_types[160]
+#define SWIGTYPE_p_IntensityScaleAndShiftNormalizer swig_types[161]
+#define SWIGTYPE_p_InterferenceFunction1DLattice swig_types[162]
+#define SWIGTYPE_p_InterferenceFunction2DLattice swig_types[163]
+#define SWIGTYPE_p_InterferenceFunction2DParaCrystal swig_types[164]
+#define SWIGTYPE_p_InterferenceFunctionNone swig_types[165]
+#define SWIGTYPE_p_InterferenceFunctionRadialParaCrystal swig_types[166]
+#define SWIGTYPE_p_IsGISAXSDetector swig_types[167]
+#define SWIGTYPE_p_Lattice swig_types[168]
+#define SWIGTYPE_p_Lattice1DParameters swig_types[169]
+#define SWIGTYPE_p_Lattice2DParameters swig_types[170]
+#define SWIGTYPE_p_Layer swig_types[171]
+#define SWIGTYPE_p_LayerInterface swig_types[172]
+#define SWIGTYPE_p_LayerRTCoefficients_t swig_types[173]
+#define SWIGTYPE_p_LayerRoughness swig_types[174]
+#define SWIGTYPE_p_MSG__Logger swig_types[175]
+#define SWIGTYPE_p_MesoCrystal swig_types[176]
+#define SWIGTYPE_p_MultiLayer swig_types[177]
+#define SWIGTYPE_p_MultiLayerRTCoefficients_t swig_types[178]
+#define SWIGTYPE_p_OffSpecSimulation swig_types[179]
+#define SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t swig_types[180]
+#define SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t swig_types[181]
+#define SWIGTYPE_p_OutputDataT_CumulativeValue_t swig_types[182]
+#define SWIGTYPE_p_OutputDataT_bool_t swig_types[183]
+#define SWIGTYPE_p_OutputDataT_double_t swig_types[184]
+#define SWIGTYPE_p_ParameterDistribution swig_types[185]
+#define SWIGTYPE_p_ParameterPool swig_types[186]
+#define SWIGTYPE_p_ParameterSample swig_types[187]
+#define SWIGTYPE_p_Particle swig_types[188]
+#define SWIGTYPE_p_ParticleComposition swig_types[189]
+#define SWIGTYPE_p_ParticleCoreShell swig_types[190]
+#define SWIGTYPE_p_ParticleDistribution swig_types[191]
+#define SWIGTYPE_p_ParticleLayout swig_types[192]
+#define SWIGTYPE_p_PolygonalTopology swig_types[193]
+#define SWIGTYPE_p_PolyhedralEdge swig_types[194]
+#define SWIGTYPE_p_PolyhedralFace swig_types[195]
+#define SWIGTYPE_p_PolyhedralTopology swig_types[196]
+#define SWIGTYPE_p_ProgressHandler__Callback_t swig_types[197]
+#define SWIGTYPE_p_RealLimits swig_types[198]
+#define SWIGTYPE_p_RealParameter swig_types[199]
+#define SWIGTYPE_p_RectPixelMap swig_types[200]
+#define SWIGTYPE_p_RectangularDetector swig_types[201]
+#define SWIGTYPE_p_RegionOfInterest swig_types[202]
+#define SWIGTYPE_p_ResolutionFunction2DGaussian swig_types[203]
+#define SWIGTYPE_p_RotationEuler swig_types[204]
+#define SWIGTYPE_p_RotationX swig_types[205]
+#define SWIGTYPE_p_RotationY swig_types[206]
+#define SWIGTYPE_p_RotationZ swig_types[207]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_const_t swig_types[208]
+#define SWIGTYPE_p_SampleBuilderFactory swig_types[209]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[210]
+#define SWIGTYPE_p_Simulation swig_types[211]
+#define SWIGTYPE_p_SimulationFactory swig_types[212]
+#define SWIGTYPE_p_SimulationOptions swig_types[213]
+#define SWIGTYPE_p_SpecularSimulation swig_types[214]
+#define SWIGTYPE_p_SphericalDetector swig_types[215]
+#define SWIGTYPE_p_SquaredFunctionDefault swig_types[216]
+#define SWIGTYPE_p_SquaredFunctionGaussianError swig_types[217]
+#define SWIGTYPE_p_SquaredFunctionMeanSquaredError swig_types[218]
+#define SWIGTYPE_p_SquaredFunctionSimError swig_types[219]
+#define SWIGTYPE_p_SquaredFunctionSystematicError swig_types[220]
+#define SWIGTYPE_p_ThreadInfo swig_types[221]
+#define SWIGTYPE_p_Transform3D swig_types[222]
+#define SWIGTYPE_p_VariableBinAxis swig_types[223]
+#define SWIGTYPE_p_WavevectorInfo swig_types[224]
+#define SWIGTYPE_p__object swig_types[225]
+#define SWIGTYPE_p_allocator_type swig_types[226]
+#define SWIGTYPE_p_bool swig_types[227]
+#define SWIGTYPE_p_char swig_types[228]
+#define SWIGTYPE_p_const_iterator swig_types[229]
+#define SWIGTYPE_p_const_reference swig_types[230]
+#define SWIGTYPE_p_difference_type swig_types[231]
+#define SWIGTYPE_p_double swig_types[232]
+#define SWIGTYPE_p_int swig_types[233]
+#define SWIGTYPE_p_iterator swig_types[234]
+#define SWIGTYPE_p_long_long swig_types[235]
+#define SWIGTYPE_p_observer_t swig_types[236]
+#define SWIGTYPE_p_observerlist_t swig_types[237]
+#define SWIGTYPE_p_p__object swig_types[238]
+#define SWIGTYPE_p_reference swig_types[239]
+#define SWIGTYPE_p_short swig_types[240]
+#define SWIGTYPE_p_signed_char swig_types[241]
+#define SWIGTYPE_p_size_type swig_types[242]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t swig_types[243]
+#define SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t swig_types[244]
+#define SWIGTYPE_p_std__allocatorT_IFormFactor_p_t swig_types[245]
+#define SWIGTYPE_p_std__allocatorT_ISample_const_p_t swig_types[246]
+#define SWIGTYPE_p_std__allocatorT_ISample_p_t swig_types[247]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[248]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[249]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[250]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[251]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[252]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[253]
+#define SWIGTYPE_p_std__complexT_double_t swig_types[254]
+#define SWIGTYPE_p_std__functionT_GISASSimulation_pfF_t swig_types[255]
+#define SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t swig_types[256]
+#define SWIGTYPE_p_std__functionT_void_fF_t swig_types[257]
+#define SWIGTYPE_p_std__invalid_argument swig_types[258]
+#define SWIGTYPE_p_std__mapT_std__string_std__string_t__const_iterator swig_types[259]
+#define SWIGTYPE_p_std__ostream swig_types[260]
+#define SWIGTYPE_p_std__shared_ptrT_IFitObserver_t swig_types[261]
+#define SWIGTYPE_p_std__shared_ptrT_ILayerRTCoefficients_const_t swig_types[262]
+#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[263]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[264]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t swig_types[265]
+#define SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t swig_types[266]
+#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t swig_types[267]
+#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator swig_types[268]
+#define SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator swig_types[269]
+#define SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t swig_types[270]
+#define SWIGTYPE_p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t swig_types[271]
+#define SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t swig_types[272]
+#define SWIGTYPE_p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t swig_types[273]
+#define SWIGTYPE_p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t swig_types[274]
+#define SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t swig_types[275]
+#define SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t swig_types[276]
+#define SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t swig_types[277]
+#define SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t swig_types[278]
+#define SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t swig_types[279]
+#define SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t swig_types[280]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[281]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[282]
+#define SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t swig_types[283]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[284]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[285]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[286]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[287]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[288]
+#define SWIGTYPE_p_unsigned_char swig_types[289]
+#define SWIGTYPE_p_unsigned_int swig_types[290]
+#define SWIGTYPE_p_unsigned_long_long swig_types[291]
+#define SWIGTYPE_p_unsigned_short swig_types[292]
+#define SWIGTYPE_p_value_type swig_types[293]
+static swig_type_info *swig_types[295];
+static swig_module_info swig_module = {swig_types, 294, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+#if (PY_VERSION_HEX <= 0x02000000)
+# if !defined(SWIG_PYTHON_CLASSIC)
+#  error "This python version requires swig to be run with the '-classic' option"
+# endif
+#endif
+
+/*-----------------------------------------------
+              @(target):= _libBornAgainCore.so
+  ------------------------------------------------*/
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_init    PyInit__libBornAgainCore
+
+#else
+#  define SWIG_init    init_libBornAgainCore
+
+#endif
+#define SWIG_name    "_libBornAgainCore"
+
+#define SWIGVERSION 0x030008 
+#define SWIG_VERSION SWIGVERSION
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 
+
+
+#include <stdexcept>
+
+
+namespace swig {
+  class SwigPtr_PyObject {
+  protected:
+    PyObject *_obj;
+
+  public:
+    SwigPtr_PyObject() :_obj(0)
+    {
+    }
+
+    SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XINCREF(_obj);      
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+    
+    SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
+    {
+      if (initial_ref) {
+        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+        Py_XINCREF(_obj);
+        SWIG_PYTHON_THREAD_END_BLOCK;
+      }
+    }
+    
+    SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) 
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XINCREF(item._obj);
+      Py_XDECREF(_obj);
+      _obj = item._obj;
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return *this;      
+    }
+    
+    ~SwigPtr_PyObject() 
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XDECREF(_obj);
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+    
+    operator PyObject *() const
+    {
+      return _obj;
+    }
+
+    PyObject *operator->() const
+    {
+      return _obj;
+    }
+  };
+}
+
+
+namespace swig {
+  struct SwigVar_PyObject : SwigPtr_PyObject {
+    SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { }
+    
+    SwigVar_PyObject & operator = (PyObject* obj)
+    {
+      Py_XDECREF(_obj);
+      _obj = obj;
+      return *this;      
+    }
+  };
+}
+
+
+#include <stdint.h>		// Use the C99 official header
+
+
+#include <complex> 
+
+
+#include <string>
+
+
+#include <iostream>
+
+#if PY_VERSION_HEX >= 0x03020000
+# define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj))
+#else
+# define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj))
+#endif
+
+
+#include <stdexcept>
+
+
+#if defined(__GNUC__)
+#  if __GNUC__ == 2 && __GNUC_MINOR <= 96
+#     define SWIG_STD_NOMODERN_STL
+#  endif
+#endif
+
+
+#include <stddef.h>
+
+
+namespace swig {
+  struct stop_iteration {
+  };
+
+  struct SwigPyIterator {
+  private:
+    SwigPtr_PyObject _seq;
+
+  protected:
+    SwigPyIterator(PyObject *seq) : _seq(seq)
+    {
+    }
+      
+  public:
+    virtual ~SwigPyIterator() {}
+
+    // Access iterator method, required by Python
+    virtual PyObject *value() const = 0;
+
+    // Forward iterator method, required by Python
+    virtual SwigPyIterator *incr(size_t n = 1) = 0;
+    
+    // Backward iterator method, very common in C++, but not required in Python
+    virtual SwigPyIterator *decr(size_t /*n*/ = 1)
+    {
+      throw stop_iteration();
+    }
+
+    // Random access iterator methods, but not required in Python
+    virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const
+    {
+      throw std::invalid_argument("operation not supported");
+    }
+
+    virtual bool equal (const SwigPyIterator &/*x*/) const
+    {
+      throw std::invalid_argument("operation not supported");
+    }
+    
+    // C++ common/needed methods
+    virtual SwigPyIterator *copy() const = 0;
+
+    PyObject *next()     
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads       
+      PyObject *obj = value();
+      incr();       
+      SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads
+      return obj;     
+    }
+
+    /* Make an alias for Python 3.x */
+    PyObject *__next__()
+    {
+      return next();
+    }
+
+    PyObject *previous()
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads       
+      decr();
+      PyObject *obj = value();
+      SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads       
+      return obj;
+    }
+
+    SwigPyIterator *advance(ptrdiff_t n)
+    {
+      return  (n > 0) ?  incr(n) : decr(-n);
+    }
+      
+    bool operator == (const SwigPyIterator& x)  const
+    {
+      return equal(x);
+    }
+      
+    bool operator != (const SwigPyIterator& x) const
+    {
+      return ! operator==(x);
+    }
+      
+    SwigPyIterator& operator += (ptrdiff_t n)
+    {
+      return *advance(n);
+    }
+
+    SwigPyIterator& operator -= (ptrdiff_t n)
+    {
+      return *advance(-n);
+    }
+      
+    SwigPyIterator* operator + (ptrdiff_t n) const
+    {
+      return copy()->advance(n);
+    }
+
+    SwigPyIterator* operator - (ptrdiff_t n) const
+    {
+      return copy()->advance(-n);
+    }
+      
+    ptrdiff_t operator - (const SwigPyIterator& x) const
+    {
+      return x.distance(*this);
+    }
+      
+    static swig_type_info* descriptor() {
+      static int init = 0;
+      static swig_type_info* desc = 0;
+      if (!init) {
+	desc = SWIG_TypeQuery("swig::SwigPyIterator *");
+	init = 1;
+      }	
+      return desc;
+    }    
+  };
+
+#if defined(SWIGPYTHON_BUILTIN)
+  inline PyObject* make_output_iterator_builtin (PyObject *pyself)
+  {
+    Py_INCREF(pyself);
+    return pyself;
+  }
+#endif
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_double (PyObject *obj, double *val)
+{
+  int res = SWIG_TypeError;
+  if (PyFloat_Check(obj)) {
+    if (val) *val = PyFloat_AsDouble(obj);
+    return SWIG_OK;
+#if PY_VERSION_HEX < 0x03000000
+  } else if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+#endif
+  } else if (PyLong_Check(obj)) {
+    double v = PyLong_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    double d = PyFloat_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = d;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      long v = PyLong_AsLong(obj);
+      if (!PyErr_Occurred()) {
+	if (val) *val = v;
+	return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
+      } else {
+	PyErr_Clear();
+      }
+    }
+  }
+#endif
+  return res;
+}
+
+
+#include <float.h>
+
+
+#include <math.h>
+
+
+SWIGINTERNINLINE int
+SWIG_CanCastAsInteger(double *d, double min, double max) {
+  double x = *d;
+  if ((min <= x && x <= max)) {
+   double fx = floor(x);
+   double cx = ceil(x);
+   double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
+   if ((errno == EDOM) || (errno == ERANGE)) {
+     errno = 0;
+   } else {
+     double summ, reps, diff;
+     if (rd < x) {
+       diff = x - rd;
+     } else if (rd > x) {
+       diff = rd - x;
+     } else {
+       return 1;
+     }
+     summ = rd + x;
+     reps = diff/summ;
+     if (reps < 8*DBL_EPSILON) {
+       *d = rd;
+       return 1;
+     }
+   }
+  }
+  return 0;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) 
+{
+#if PY_VERSION_HEX < 0x03000000
+  if (PyInt_Check(obj)) {
+    long v = PyInt_AsLong(obj);
+    if (v >= 0) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      return SWIG_OverflowError;
+    }
+  } else
+#endif
+  if (PyLong_Check(obj)) {
+    unsigned long v = PyLong_AsUnsignedLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      return SWIG_OverflowError;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    unsigned long v = PyLong_AsUnsignedLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
+	if (val) *val = (unsigned long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_size_t (PyObject * obj, size_t *val)
+{
+  unsigned long v;
+  int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
+  if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+  return res;
+}
+
+
+  #define SWIG_From_long   PyLong_FromLong 
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_ptrdiff_t  (ptrdiff_t value)
+{    
+  return SWIG_From_long  (static_cast< long >(value));
+}
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_bool  (bool value)
+{
+  return PyBool_FromLong(value ? 1 : 0);
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_long (PyObject *obj, long* val)
+{
+#if PY_VERSION_HEX < 0x03000000
+  if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+  } else
+#endif
+  if (PyLong_Check(obj)) {
+    long v = PyLong_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      return SWIG_OverflowError;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    long v = PyInt_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
+	if (val) *val = (long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_ptrdiff_t (PyObject * obj, ptrdiff_t *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, val ? &v : 0);
+  if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+  return res;
+}
+
+
+#include <algorithm>
+
+
+#include <vector>
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_int  (int value)
+{
+  return PyInt_FromLong((long) value);
+}
+
+
+namespace swig {
+  template <class Type>
+  struct noconst_traits {
+    typedef Type noconst_type;
+  };
+
+  template <class Type>
+  struct noconst_traits<const Type> {
+    typedef Type noconst_type;
+  };
+
+  /*
+    type categories
+  */
+  struct pointer_category { };
+  struct value_category { };
+
+  /*
+    General traits that provides type_name and type_info
+  */
+  template <class Type> struct traits { };
+
+  template <class Type>
+  inline const char* type_name() {
+    return traits<typename noconst_traits<Type >::noconst_type >::type_name();
+  }
+
+  template <class Type>
+  struct traits_info {
+    static swig_type_info *type_query(std::string name) {
+      name += " *";
+      return SWIG_TypeQuery(name.c_str());
+    }
+    static swig_type_info *type_info() {
+      static swig_type_info *info = type_query(type_name<Type>());
+      return info;
+    }
+  };
+
+  template <class Type>
+  inline swig_type_info *type_info() {
+    return traits_info<Type>::type_info();
+  }
+
+  /*
+    Partial specialization for pointers
+  */
+  template <class Type> struct traits <Type *> {
+    typedef pointer_category category;
+    static std::string make_ptr_name(const char* name) {
+      std::string ptrname = name;
+      ptrname += " *";
+      return ptrname;
+    }
+    static const char* type_name() {
+      static std::string name = make_ptr_name(swig::type_name<Type>());
+      return name.c_str();
+    }
+  };
+
+  template <class Type, class Category>
+  struct traits_as { };
+
+  template <class Type, class Category>
+  struct traits_check { };
+
+}
+
+
+namespace swig {  
+  /*
+    Traits that provides the from method
+  */
+  template <class Type> struct traits_from_ptr {
+    static PyObject *from(Type *val, int owner = 0) {
+      return SWIG_InternalNewPointerObj(val, type_info<Type>(), owner);
+    }
+  };
+
+  template <class Type> struct traits_from {
+    static PyObject *from(const Type& val) {
+      return traits_from_ptr<Type>::from(new Type(val), 1);
+    }
+  };
+
+  template <class Type> struct traits_from<Type *> {
+    static PyObject *from(Type* val) {
+      return traits_from_ptr<Type>::from(val, 0);
+    }
+  };
+
+  template <class Type> struct traits_from<const Type *> {
+    static PyObject *from(const Type* val) {
+      return traits_from_ptr<Type>::from(const_cast<Type*>(val), 0);
+    }
+  };
+
+
+  template <class Type>
+  inline PyObject *from(const Type& val) {
+    return traits_from<Type>::from(val);
+  }
+
+  template <class Type>
+  inline PyObject *from_ptr(Type* val, int owner) {
+    return traits_from_ptr<Type>::from(val, owner);
+  }
+
+  /*
+    Traits that provides the asval/as/check method
+  */
+  template <class Type>
+  struct traits_asptr {   
+    static int asptr(PyObject *obj, Type **val) {
+      Type *p;
+      int res = SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0);
+      if (SWIG_IsOK(res)) {
+	if (val) *val = p;
+      }
+      return res;
+    }
+  }; 
+
+  template <class Type>
+  inline int asptr(PyObject *obj, Type **vptr) {
+    return traits_asptr<Type>::asptr(obj, vptr);
+  }
+
+  template <class Type> 
+  struct traits_asval {
+    static int asval(PyObject *obj, Type *val) {
+      if (val) {
+	Type *p = 0;
+	int res = traits_asptr<Type>::asptr(obj, &p);
+	if (!SWIG_IsOK(res)) return res;	
+	if (p) {
+	  typedef typename noconst_traits<Type>::noconst_type noconst_type;
+	  *(const_cast<noconst_type*>(val)) = *p;
+	  if (SWIG_IsNewObj(res)){
+	    delete p;
+	    res = SWIG_DelNewMask(res);
+	  }
+	  return res;
+	} else {
+	  return SWIG_ERROR;
+	}
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+
+  template <class Type> struct traits_asval<Type*> {
+    static int asval(PyObject *obj, Type **val) {
+      if (val) {
+        typedef typename noconst_traits<Type>::noconst_type noconst_type;
+        noconst_type *p = 0;
+        int res = traits_asptr<noconst_type>::asptr(obj,  &p);
+        if (SWIG_IsOK(res)) {
+          *(const_cast<noconst_type**>(val)) = p;
+	}
+	return res;
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+  
+  template <class Type>
+  inline int asval(PyObject *obj, Type *val) {
+    return traits_asval<Type>::asval(obj, val);
+  }
+
+  template <class Type> 
+  struct traits_as<Type, value_category> {
+    static Type as(PyObject *obj, bool throw_error) {
+      Type v;
+      int res = asval(obj, &v);
+      if (!obj || !SWIG_IsOK(res)) {
+	if (!PyErr_Occurred()) {
+	  ::SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	if (throw_error) throw std::invalid_argument("bad type");
+      }
+      return v;
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type, pointer_category> {
+    static Type as(PyObject *obj, bool throw_error) {
+      Type *v = 0;      
+      int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+      if (SWIG_IsOK(res) && v) {
+	if (SWIG_IsNewObj(res)) {
+	  Type r(*v);
+	  delete v;
+	  return r;
+	} else {
+	  return *v;
+	}
+      } else {
+	// Uninitialized return value, no Type() constructor required.
+	static Type *v_def = (Type*) malloc(sizeof(Type));
+	if (!PyErr_Occurred()) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	if (throw_error) throw std::invalid_argument("bad type");
+	memset(v_def,0,sizeof(Type));
+	return *v_def;
+      }
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type*, pointer_category> {
+    static Type* as(PyObject *obj, bool throw_error) {
+      Type *v = 0;      
+      int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+      if (SWIG_IsOK(res)) {
+	return v;
+      } else {
+	if (!PyErr_Occurred()) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	if (throw_error) throw std::invalid_argument("bad type");
+	return 0;
+      }
+    }
+  };
+    
+  template <class Type>
+  inline Type as(PyObject *obj, bool te = false) {
+    return traits_as<Type, typename traits<Type>::category>::as(obj, te);
+  }
+
+  template <class Type> 
+  struct traits_check<Type, value_category> {
+    static bool check(PyObject *obj) {
+      int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR;
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type> 
+  struct traits_check<Type, pointer_category> {
+    static bool check(PyObject *obj) {
+      int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR;
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type>
+  inline bool check(PyObject *obj) {
+    return traits_check<Type, typename traits<Type>::category>::check(obj);
+  }
+}
+
+
+#include <functional>
+
+namespace std {
+  template <>
+  struct less <PyObject *>: public binary_function<PyObject *, PyObject *, bool>
+  {
+    bool
+    operator()(PyObject * v, PyObject *w) const
+    { 
+      bool res;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false;
+      /* This may fall into a case of inconsistent
+               eg. ObjA > ObjX > ObjB
+               but ObjA < ObjB
+      */
+      if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) )
+      {
+        /* Objects can't be compared, this mostly occurred in Python 3.0 */
+        /* Compare their ptr directly for a workaround */
+        res = (v < w);
+        PyErr_Clear();
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return res;
+    }
+  };
+
+  template <>
+  struct less <swig::SwigPtr_PyObject>: public binary_function<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject, bool>
+  {
+    bool
+    operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const
+    {
+      return std::less<PyObject *>()(v, w);
+    }
+  };
+
+  template <>
+  struct less <swig::SwigVar_PyObject>: public binary_function<swig::SwigVar_PyObject, swig::SwigVar_PyObject, bool>
+  {
+    bool
+    operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const
+    {
+      return std::less<PyObject *>()(v, w);
+    }
+  };
+
+}
+
+namespace swig {
+  template <> struct traits<PyObject *> {
+    typedef value_category category;
+    static const char* type_name() { return "PyObject *"; }
+  };  
+
+  template <>  struct traits_asval<PyObject * > {   
+    typedef PyObject * value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      if (val) *val = obj;
+      return SWIG_OK;
+    }
+  };
+
+  template <> 
+  struct traits_check<PyObject *, value_category> {
+    static bool check(PyObject *) {
+      return true;
+    }
+  };
+
+  template <>  struct traits_from<PyObject *> {
+    typedef PyObject * value_type;
+    static PyObject *from(const value_type& val) {
+      Py_XINCREF(val);
+      return val;
+    }
+  };
+  
+}
+
+namespace swig {
+  template <class Difference>
+  inline size_t
+  check_index(Difference i, size_t size, bool insert = false) {
+    if ( i < 0 ) {
+      if ((size_t) (-i) <= size)
+	return (size_t) (i + size);
+    } else if ( (size_t) i < size ) {
+      return (size_t) i;
+    } else if (insert && ((size_t) i == size)) {
+      return size;
+    }
+    throw std::out_of_range("index out of range");
+  }
+
+  template <class Difference>
+  void
+  slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) {
+    if (step == 0) {
+      throw std::invalid_argument("slice step cannot be zero");
+    } else if (step > 0) {
+      // Required range: 0 <= i < size, 0 <= j < size
+      if (i < 0) {
+        ii = 0;
+      } else if (i < (Difference)size) {
+        ii = i;
+      } else if (insert && (i >= (Difference)size)) {
+        ii = (Difference)size;
+      }
+      if ( j < 0 ) {
+        jj = 0;
+      } else {
+        jj = (j < (Difference)size) ? j : (Difference)size;
+      }
+    } else {
+      // Required range: -1 <= i < size-1, -1 <= j < size-1
+      if (i < -1) {
+        ii = -1;
+      } else if (i < (Difference) size) {
+        ii = i;
+      } else if (i >= (Difference)(size-1)) {
+        ii = (Difference)(size-1);
+      }
+      if (j < -1) {
+        jj = -1;
+      } else {
+        jj = (j < (Difference)size ) ? j : (Difference)(size-1);
+      }
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::iterator
+  getpos(Sequence* self, Difference i)  {
+    typename Sequence::iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::const_iterator
+  cgetpos(const Sequence* self, Difference i)  {
+    typename Sequence::const_iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence>
+  inline void
+  erase(Sequence* seq, const typename Sequence::iterator& position) {
+    seq->erase(position);
+  }
+
+  template <class Sequence, class Difference>
+  inline Sequence*
+  getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj);
+
+    if (step > 0) {
+      typename Sequence::const_iterator sb = self->begin();
+      typename Sequence::const_iterator se = self->begin();
+      std::advance(sb,ii);
+      std::advance(se,jj);
+      if (step == 1) {
+        return new Sequence(sb, se);
+      } else {
+        Sequence *sequence = new Sequence();
+        typename Sequence::const_iterator it = sb;
+        while (it!=se) {
+          sequence->push_back(*it);
+          for (Py_ssize_t c=0; c<step && it!=se; ++c)
+            it++;
+        }
+        return sequence;
+      } 
+    } else {
+      Sequence *sequence = new Sequence();
+      if (ii > jj) {
+        typename Sequence::const_reverse_iterator sb = self->rbegin();
+        typename Sequence::const_reverse_iterator se = self->rbegin();
+        std::advance(sb,size-ii-1);
+        std::advance(se,size-jj-1);
+        typename Sequence::const_reverse_iterator it = sb;
+        while (it!=se) {
+          sequence->push_back(*it);
+          for (Py_ssize_t c=0; c<-step && it!=se; ++c)
+            it++;
+        }
+      }
+      return sequence;
+    }
+  }
+
+  template <class Sequence, class Difference, class InputSeq>
+  inline void
+  setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj, true);
+    if (step > 0) {
+      if (jj < ii)
+        jj = ii;
+      if (step == 1) {
+        size_t ssize = jj - ii;
+        if (ssize <= is.size()) {
+          // expanding/staying the same size
+          typename Sequence::iterator sb = self->begin();
+          typename InputSeq::const_iterator isit = is.begin();
+          std::advance(sb,ii);
+          std::advance(isit, jj - ii);
+          self->insert(std::copy(is.begin(), isit, sb), isit, is.end());
+        } else {
+          // shrinking
+          typename Sequence::iterator sb = self->begin();
+          typename Sequence::iterator se = self->begin();
+          std::advance(sb,ii);
+          std::advance(se,jj);
+          self->erase(sb,se);
+          sb = self->begin();
+          std::advance(sb,ii);
+          self->insert(sb, is.begin(), is.end());
+        }
+      } else {
+        size_t replacecount = (jj - ii + step - 1) / step;
+        if (is.size() != replacecount) {
+          char msg[1024];
+          sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
+          throw std::invalid_argument(msg);
+        }
+        typename Sequence::const_iterator isit = is.begin();
+        typename Sequence::iterator it = self->begin();
+        std::advance(it,ii);
+        for (size_t rc=0; rc<replacecount; ++rc) {
+          *it++ = *isit++;
+          for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
+            it++;
+        }
+      }
+    } else {
+      if (jj > ii)
+        jj = ii;
+      size_t replacecount = (ii - jj - step - 1) / -step;
+      if (is.size() != replacecount) {
+        char msg[1024];
+        sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
+        throw std::invalid_argument(msg);
+      }
+      typename Sequence::const_iterator isit = is.begin();
+      typename Sequence::reverse_iterator it = self->rbegin();
+      std::advance(it,size-ii-1);
+      for (size_t rc=0; rc<replacecount; ++rc) {
+        *it++ = *isit++;
+        for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+          it++;
+      }
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline void
+  delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj, true);
+    if (step > 0) {
+      if (jj > ii) {
+        typename Sequence::iterator sb = self->begin();
+        std::advance(sb,ii);
+        if (step == 1) {
+          typename Sequence::iterator se = self->begin();
+          std::advance(se,jj);
+          self->erase(sb,se);
+        } else {
+          typename Sequence::iterator it = sb;
+          size_t delcount = (jj - ii + step - 1) / step;
+          while (delcount) {
+            it = self->erase(it);
+            for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
+              it++;
+            delcount--;
+          }
+        }
+      }
+    } else {
+      if (ii > jj) {
+        typename Sequence::reverse_iterator sb = self->rbegin();
+        std::advance(sb,size-ii-1);
+        typename Sequence::reverse_iterator it = sb;
+        size_t delcount = (ii - jj - step - 1) / -step;
+        while (delcount) {
+          it = typename Sequence::reverse_iterator(self->erase((++it).base()));
+          for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+            it++;
+          delcount--;
+        }
+      }
+    }
+  }
+}
+
+
+#if defined(__SUNPRO_CC) && defined(_RWSTD_VER)
+#  if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL)
+#    define SWIG_STD_NOITERATOR_TRAITS_STL
+#  endif
+#endif
+
+#if !defined(SWIG_STD_NOITERATOR_TRAITS_STL)
+#include <iterator>
+#else
+namespace std {
+  template <class Iterator>
+  struct iterator_traits {
+    typedef ptrdiff_t difference_type;
+    typedef typename Iterator::value_type value_type;
+  };
+
+  template <class Iterator, class Category,class T, class Reference, class Pointer, class Distance>
+  struct iterator_traits<__reverse_bi_iterator<Iterator,Category,T,Reference,Pointer,Distance> > {
+    typedef Distance difference_type;
+    typedef T value_type;
+  };
+
+  template <class T>
+  struct iterator_traits<T*> {
+    typedef T value_type;
+    typedef ptrdiff_t difference_type;
+  };
+
+  template<typename _InputIterator>
+  inline typename iterator_traits<_InputIterator>::difference_type
+  distance(_InputIterator __first, _InputIterator __last)
+  {
+    typename iterator_traits<_InputIterator>::difference_type __n = 0;
+    while (__first != __last) {
+      ++__first; ++__n;
+    }
+    return __n;
+  }
+}
+#endif
+
+
+namespace swig {
+  template<typename OutIterator>
+  class SwigPyIterator_T :  public SwigPyIterator
+  {
+  public:
+    typedef OutIterator out_iterator;
+    typedef typename std::iterator_traits<out_iterator>::value_type value_type;    
+    typedef SwigPyIterator_T<out_iterator> self_type;
+
+    SwigPyIterator_T(out_iterator curr, PyObject *seq)
+      : SwigPyIterator(seq), current(curr)
+    {
+    }
+
+    const out_iterator& get_current() const
+    {
+      return current;
+    }
+
+    
+    bool equal (const SwigPyIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return (current == iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }
+    
+    ptrdiff_t distance(const SwigPyIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return std::distance(current, iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }    
+    
+  protected:
+    out_iterator current;
+  };
+  
+  template <class ValueType>
+  struct from_oper 
+  {
+    typedef const ValueType& argument_type;
+    typedef PyObject *result_type;
+    result_type operator()(argument_type v) const
+    {
+      return swig::from(v);
+    }
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyIteratorOpen_T :  public SwigPyIterator_T<OutIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;
+    typedef SwigPyIteratorOpen_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq)
+      : SwigPyIterator_T<OutIterator>(curr, seq)
+    {
+    }
+    
+    PyObject *value() const {
+      return from(static_cast<const value_type&>(*(base::current)));
+    }
+    
+    SwigPyIterator *copy() const
+    {
+      return new self_type(*this);
+    }
+
+    SwigPyIterator *incr(size_t n = 1)
+    {
+      while (n--) {
+	++base::current;
+      }
+      return this;
+    }
+
+    SwigPyIterator *decr(size_t n = 1)
+    {
+      while (n--) {
+	--base::current;
+      }
+      return this;
+    }
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyIteratorClosed_T :  public SwigPyIterator_T<OutIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;    
+    typedef SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq)
+      : SwigPyIterator_T<OutIterator>(curr, seq), begin(first), end(last)
+    {
+    }
+    
+    PyObject *value() const {
+      if (base::current == end) {
+	throw stop_iteration();
+      } else {
+	return from(static_cast<const value_type&>(*(base::current)));
+      }
+    }
+    
+    SwigPyIterator *copy() const
+    {
+      return new self_type(*this);
+    }
+
+    SwigPyIterator *incr(size_t n = 1)
+    {
+      while (n--) {
+	if (base::current == end) {
+	  throw stop_iteration();
+	} else {
+	  ++base::current;
+	}
+      }
+      return this;
+    }
+
+    SwigPyIterator *decr(size_t n = 1)
+    {
+      while (n--) {
+	if (base::current == begin) {
+	  throw stop_iteration();
+	} else {
+	  --base::current;
+	}
+      }
+      return this;
+    }
+
+  private:
+    out_iterator begin;
+    out_iterator end;
+  };
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0)
+  {
+    return new SwigPyIteratorClosed_T<OutIter>(current, begin, end, seq);
+  }
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_iterator(const OutIter& current, PyObject *seq = 0)
+  {
+    return new SwigPyIteratorOpen_T<OutIter>(current, seq);
+  }
+
+}
+
+
+namespace swig
+{
+  template <class T>
+  struct SwigPySequence_Ref
+  {
+    SwigPySequence_Ref(PyObject* seq, Py_ssize_t index)
+      : _seq(seq), _index(index)
+    {
+    }
+    
+    operator T () const
+    {
+      swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index);
+      try {
+	return swig::as<T>(item, true);
+      } catch (std::exception& e) {
+	char msg[1024];
+	sprintf(msg, "in sequence element %d ", (int)_index);
+	if (!PyErr_Occurred()) {
+	  ::SWIG_Error(SWIG_TypeError,  swig::type_name<T>());
+	}
+	SWIG_Python_AddErrorMsg(msg);
+	SWIG_Python_AddErrorMsg(e.what());
+	throw;
+      }
+    }
+
+    SwigPySequence_Ref& operator=(const T& v)
+    {
+      PySequence_SetItem(_seq, _index, swig::from<T>(v));
+      return *this;
+    }
+
+  private:
+    PyObject* _seq;
+    Py_ssize_t _index;
+  };
+
+  template <class T>
+  struct SwigPySequence_ArrowProxy
+  {
+    SwigPySequence_ArrowProxy(const T& x): m_value(x) {}
+    const T* operator->() const { return &m_value; }
+    operator const T*() const { return &m_value; }
+    T m_value;
+  };
+
+  template <class T, class Reference >
+  struct SwigPySequence_InputIterator
+  {
+    typedef SwigPySequence_InputIterator<T, Reference > self;
+
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Reference reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef Py_ssize_t difference_type;
+
+    SwigPySequence_InputIterator()
+    {
+    }
+
+    SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index)
+      : _seq(seq), _index(index)
+    {
+    }
+
+    reference operator*() const
+    {
+      return reference(_seq, _index);
+    }
+
+    SwigPySequence_ArrowProxy<T>
+    operator->() const {
+      return SwigPySequence_ArrowProxy<T>(operator*());
+    }
+
+    bool operator==(const self& ri) const
+    {
+      return (_index == ri._index) && (_seq == ri._seq);
+    }
+
+    bool operator!=(const self& ri) const
+    {
+      return !(operator==(ri));
+    }
+
+    self& operator ++ ()
+    {
+      ++_index;
+      return *this;
+    }
+
+    self& operator -- ()
+    {
+      --_index;
+      return *this;
+    }
+
+    self& operator += (difference_type n)
+    {
+      _index += n;
+      return *this;
+    }
+
+    self operator +(difference_type n) const
+    {
+      return self(_seq, _index + n);
+    }
+
+    self& operator -= (difference_type n)
+    {
+      _index -= n;
+      return *this;
+    }
+
+    self operator -(difference_type n) const
+    {
+      return self(_seq, _index - n);
+    }
+
+    difference_type operator - (const self& ri) const
+    {
+      return _index - ri._index;
+    }
+
+    bool operator < (const self& ri) const
+    {
+      return _index < ri._index;
+    }
+
+    reference
+    operator[](difference_type n) const
+    {
+      return reference(_seq, _index + n);
+    }
+
+  private:
+    PyObject* _seq;
+    difference_type _index;
+  };
+
+  // STL container wrapper around a Python sequence
+  template <class T>
+  struct SwigPySequence_Cont
+  {
+    typedef SwigPySequence_Ref<T> reference;
+    typedef const SwigPySequence_Ref<T> const_reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef Py_ssize_t difference_type;
+    typedef size_t size_type;
+    typedef const pointer const_pointer;
+    typedef SwigPySequence_InputIterator<T, reference> iterator;
+    typedef SwigPySequence_InputIterator<T, const_reference> const_iterator;
+
+    SwigPySequence_Cont(PyObject* seq) : _seq(0)
+    {
+      if (!PySequence_Check(seq)) {
+	throw std::invalid_argument("a sequence is expected");
+      }
+      _seq = seq;
+      Py_INCREF(_seq);
+    }
+
+    ~SwigPySequence_Cont()
+    {
+      Py_XDECREF(_seq);
+    }
+
+    size_type size() const
+    {
+      return static_cast<size_type>(PySequence_Size(_seq));
+    }
+
+    bool empty() const
+    {
+      return size() == 0;
+    }
+
+    iterator begin()
+    {
+      return iterator(_seq, 0);
+    }
+
+    const_iterator begin() const
+    {
+      return const_iterator(_seq, 0);
+    }
+
+    iterator end()
+    {
+      return iterator(_seq, size());
+    }
+
+    const_iterator end() const
+    {
+      return const_iterator(_seq, size());
+    }
+
+    reference operator[](difference_type n)
+    {
+      return reference(_seq, n);
+    }
+
+    const_reference operator[](difference_type n)  const
+    {
+      return const_reference(_seq, n);
+    }
+
+    bool check(bool set_err = true) const
+    {
+      Py_ssize_t s = size();
+      for (Py_ssize_t i = 0; i < s; ++i) {
+	swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i);
+	if (!swig::check<value_type>(item)) {
+	  if (set_err) {
+	    char msg[1024];
+	    sprintf(msg, "in sequence element %d", (int)i);
+	    SWIG_Error(SWIG_RuntimeError, msg);
+	  }
+	  return false;
+	}
+      }
+      return true;
+    }
+
+  private:
+    PyObject* _seq;
+  };
+
+}
+
+
+  #define SWIG_From_double   PyFloat_FromDouble 
+
+
+namespace swig {
+  template <> struct traits< double > {
+    typedef value_category category;
+    static const char* type_name() { return"double"; }
+  };
+  template <>  struct traits_asval< double > {
+    typedef double value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_double (obj, val);
+    }
+  };
+  template <>  struct traits_from< double > {
+    typedef double value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_double  (val);
+    }
+  };
+}
+
+
+namespace swig {
+  template <class SwigPySeq, class Seq>
+  inline void
+  assign(const SwigPySeq& swigpyseq, Seq* seq) {
+    // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented
+    typedef typename SwigPySeq::value_type value_type;
+    typename SwigPySeq::const_iterator it = swigpyseq.begin();
+    for (;it != swigpyseq.end(); ++it) {
+      seq->insert(seq->end(),(value_type)(*it));
+    }
+  }
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_asptr_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+
+    static int asptr(PyObject *obj, sequence **seq) {
+      if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) {
+	sequence *p;
+	if (::SWIG_ConvertPtr(obj,(void**)&p,
+			      swig::type_info<sequence>(),0) == SWIG_OK) {
+	  if (seq) *seq = p;
+	  return SWIG_OLDOBJ;
+	}
+      } else if (PySequence_Check(obj)) {
+	try {
+	  SwigPySequence_Cont<value_type> swigpyseq(obj);
+	  if (seq) {
+	    sequence *pseq = new sequence();
+	    assign(swigpyseq, pseq);
+	    *seq = pseq;
+	    return SWIG_NEWOBJ;
+	  } else {
+	    return swigpyseq.check() ? SWIG_OK : SWIG_ERROR;
+	  }
+	} catch (std::exception& e) {
+	  if (seq) {
+	    if (!PyErr_Occurred()) {
+	      PyErr_SetString(PyExc_TypeError, e.what());
+	    }
+	  }
+	  return SWIG_ERROR;
+	}
+      }
+      return SWIG_ERROR;
+    }
+  };
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_from_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+    typedef typename Seq::size_type size_type;
+    typedef typename sequence::const_iterator const_iterator;
+
+    static PyObject *from(const sequence& seq) {
+#ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS
+      swig_type_info *desc = swig::type_info<sequence>();
+      if (desc && desc->clientdata) {
+	return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN);
+      }
+#endif
+      size_type size = seq.size();
+      if (size <= (size_type)INT_MAX) {
+	PyObject *obj = PyTuple_New((Py_ssize_t)size);
+	Py_ssize_t i = 0;
+	for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) {
+	  PyTuple_SetItem(obj,i,swig::from<value_type>(*it));
+	}
+	return obj;
+      } else {
+	PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python");
+	return NULL;
+      }
+    }
+  };
+}
+
+
+  namespace swig {
+    template <class T>
+    struct traits_asptr<std::vector<T> >  {
+      static int asptr(PyObject *obj, std::vector<T> **vec) {
+	return traits_asptr_stdseq<std::vector<T> >::asptr(obj, vec);
+      }
+    };
+    
+    template <class T>
+    struct traits_from<std::vector<T> > {
+      static PyObject *from(const std::vector<T>& vec) {
+	return traits_from_stdseq<std::vector<T> >::from(vec);
+      }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< double, std::allocator< double > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "double" "," "std::allocator< double >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_double_Sg__iterator(std::vector< double > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_double_Sg____nonzero__(std::vector< double > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_double_Sg____bool__(std::vector< double > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< double >::size_type std_vector_Sl_double_Sg____len__(std::vector< double > const *self){
+      return self->size();
+    }
+
+SWIGINTERNINLINE PyObject* 
+SWIG_From_unsigned_SS_long  (unsigned long value)
+{
+  return (value > LONG_MAX) ?
+    PyLong_FromUnsignedLong(value) : PyLong_FromLong(static_cast< long >(value)); 
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_size_t  (size_t value)
+{    
+  return SWIG_From_unsigned_SS_long  (static_cast< unsigned long >(value));
+}
+
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< double,std::allocator< double > >());
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_1(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j,std::vector< double,std::allocator< double > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getitem____SWIG_0(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_0(std::vector< double > *self,PySliceObject *slice,std::vector< double,std::allocator< double > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_1(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_1(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< double >::value_type const &std_vector_Sl_double_Sg____getitem____SWIG_1(std::vector< double > const *self,std::vector< double >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_2(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< double >::value_type std_vector_Sl_double_Sg__pop(std::vector< double > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< double,std::allocator< double > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_double_Sg__append(std::vector< double > *self,std::vector< double >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_1(std::vector< double > *self,std::vector< double >::iterator first,std::vector< double >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__insert__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_double_Sg__insert__SWIG_1(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::size_type n,std::vector< double >::value_type const &x){ self->insert(pos, n, x); }
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::vector< double,std::allocator< double > >, std::allocator< std::vector< double,std::allocator< double > > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::vector< double,std::allocator< double > >" "," "std::allocator< std::vector< double,std::allocator< double > > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(std::vector< std::vector< double > > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__(std::vector< std::vector< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__(std::vector< std::vector< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::vector< double > >::size_type std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__(std::vector< std::vector< double > > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >());
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::vector< double > > *self,PySliceObject *slice,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::vector< double > >::value_type const &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::vector< double > >::value_type std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(std::vector< std::vector< double > > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator first,std::vector< std::vector< double > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::size_type n,std::vector< std::vector< double > >::value_type const &x){ self->insert(pos, n, x); }
+
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+SWIGINTERN int
+SWIG_AsVal_int (PyObject * obj, int *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v < INT_MIN || v > INT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< int >(v);
+    }
+  }  
+  return res;
+}
+
+
+namespace swig {
+  template <> struct traits< int > {
+    typedef value_category category;
+    static const char* type_name() { return"int"; }
+  };
+  template <>  struct traits_asval< int > {
+    typedef int value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_int (obj, val);
+    }
+  };
+  template <>  struct traits_from< int > {
+    typedef int value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_int  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< int, std::allocator< int > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "int" "," "std::allocator< int >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_int_Sg__iterator(std::vector< int > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_int_Sg____nonzero__(std::vector< int > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_int_Sg____bool__(std::vector< int > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< int >::size_type std_vector_Sl_int_Sg____len__(std::vector< int > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< int,std::allocator< int > >());
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_1(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j,std::vector< int,std::allocator< int > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getitem____SWIG_0(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_0(std::vector< int > *self,PySliceObject *slice,std::vector< int,std::allocator< int > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_1(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_1(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< int >::value_type const &std_vector_Sl_int_Sg____getitem____SWIG_1(std::vector< int > const *self,std::vector< int >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_2(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< int >::value_type std_vector_Sl_int_Sg__pop(std::vector< int > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< int,std::allocator< int > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_int_Sg__append(std::vector< int > *self,std::vector< int >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_1(std::vector< int > *self,std::vector< int >::iterator first,std::vector< int >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__insert__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_int_Sg__insert__SWIG_1(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::size_type n,std::vector< int >::value_type const &x){ self->insert(pos, n, x); }
+
+namespace swig {
+  template <> struct traits< unsigned long > {
+    typedef value_category category;
+    static const char* type_name() { return"unsigned long"; }
+  };
+  template <>  struct traits_asval< unsigned long > {
+    typedef unsigned long value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_unsigned_SS_long (obj, val);
+    }
+  };
+  template <>  struct traits_from< unsigned long > {
+    typedef unsigned long value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_unsigned_SS_long  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< unsigned long, std::allocator< unsigned long > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "unsigned long" "," "std::allocator< unsigned long >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_unsigned_SS_long_Sg__iterator(std::vector< unsigned long > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_unsigned_SS_long_Sg____nonzero__(std::vector< unsigned long > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_unsigned_SS_long_Sg____bool__(std::vector< unsigned long > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< unsigned long >::size_type std_vector_Sl_unsigned_SS_long_Sg____len__(std::vector< unsigned long > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< unsigned long,std::allocator< unsigned long > > *std_vector_Sl_unsigned_SS_long_Sg____getslice__(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< unsigned long,std::allocator< unsigned long > >());
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_1(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j,std::vector< unsigned long,std::allocator< unsigned long > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____delslice__(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< unsigned long,std::allocator< unsigned long > > *std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_0(std::vector< unsigned long > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_0(std::vector< unsigned long > *self,PySliceObject *slice,std::vector< unsigned long,std::allocator< unsigned long > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_1(std::vector< unsigned long > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_1(std::vector< unsigned long > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< unsigned long >::value_type const &std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_1(std::vector< unsigned long > const *self,std::vector< unsigned long >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_2(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< unsigned long >::value_type std_vector_Sl_unsigned_SS_long_Sg__pop(std::vector< unsigned long > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< unsigned long,std::allocator< unsigned long > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg__append(std::vector< unsigned long > *self,std::vector< unsigned long >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< unsigned long >::iterator std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< unsigned long >::iterator std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_1(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator first,std::vector< unsigned long >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< unsigned long >::iterator std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator pos,std::vector< unsigned long >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_1(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator pos,std::vector< unsigned long >::size_type n,std::vector< unsigned long >::value_type const &x){ self->insert(pos, n, x); }
+
+SWIGINTERN int
+SWIG_AsVal_std_complex_Sl_double_Sg_  (PyObject *o, std::complex<double>* val)
+{
+  if (PyComplex_Check(o)) {
+    if (val) *val = std::complex<double>(PyComplex_RealAsDouble(o), PyComplex_ImagAsDouble(o));
+    return SWIG_OK;
+  } else {
+    double d;    
+    int res = SWIG_AddCast(SWIG_AsVal_double (o, &d));
+    if (SWIG_IsOK(res)) {
+      if (val) *val = std::complex<double>(d, 0.0);
+      return res;
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE PyObject*
+SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/share/swig3.0/typemaps/swigmacros.swg,104,%ifcplusplus@*/
+
+const std::complex<double>&
+
+
+
+/*@SWIG@*/ c)
+{
+  return PyComplex_FromDoubles(std::real(c), std::imag(c));
+}
+
+
+namespace swig {
+  template <> struct traits< std::complex<double> > {
+    typedef value_category category;
+    static const char* type_name() { return"std::complex<double>"; }
+  };
+  template <>  struct traits_asval< std::complex<double> > {
+    typedef std::complex<double> value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_std_complex_Sl_double_Sg_ (obj, val);
+    }
+  };
+  template <>  struct traits_from< std::complex<double> > {
+    typedef std::complex<double> value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_std_complex_Sl_double_Sg_  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::complex< double >, std::allocator< std::complex< double > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::complex< double >" "," "std::allocator< std::complex< double > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_complex_Sl_double_Sg__Sg__iterator(std::vector< std::complex< double > > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_complex_Sl_double_Sg__Sg____nonzero__(std::vector< std::complex< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_complex_Sl_double_Sg__Sg____bool__(std::vector< std::complex< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::complex< double > >::size_type std_vector_Sl_std_complex_Sl_double_Sg__Sg____len__(std::vector< std::complex< double > > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::complex< double >,std::allocator< std::complex< double > > > *std_vector_Sl_std_complex_Sl_double_Sg__Sg____getslice__(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::complex< double >,std::allocator< std::complex< double > > >());
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_1(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____delslice__(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::complex< double >,std::allocator< std::complex< double > > > *std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::complex< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::complex< double > > *self,PySliceObject *slice,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::complex< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_1(std::vector< std::complex< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::complex< double > >::value_type const &std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::complex< double > > const *self,std::vector< std::complex< double > >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_2(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::complex< double > >::value_type std_vector_Sl_std_complex_Sl_double_Sg__Sg__pop(std::vector< std::complex< double > > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg__append(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::complex< double > >::iterator std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::complex< double > >::iterator std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator first,std::vector< std::complex< double > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::complex< double > >::iterator std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator pos,std::vector< std::complex< double > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator pos,std::vector< std::complex< double > >::size_type n,std::vector< std::complex< double > >::value_type const &x){ self->insert(pos, n, x); }
+
+SWIGINTERN swig_type_info*
+SWIG_pchar_descriptor(void)
+{
+  static int init = 0;
+  static swig_type_info* info = 0;
+  if (!init) {
+    info = SWIG_TypeQuery("_p_char");
+    init = 1;
+  }
+  return info;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+{
+#if PY_VERSION_HEX>=0x03000000
+  if (PyUnicode_Check(obj))
+#else  
+  if (PyString_Check(obj))
+#endif
+  {
+    char *cstr; Py_ssize_t len;
+#if PY_VERSION_HEX>=0x03000000
+    if (!alloc && cptr) {
+        /* We can't allow converting without allocation, since the internal
+           representation of string in Python 3 is UCS-2/UCS-4 but we require
+           a UTF-8 representation.
+           TODO(bhy) More detailed explanation */
+        return SWIG_RuntimeError;
+    }
+    obj = PyUnicode_AsUTF8String(obj);
+    PyBytes_AsStringAndSize(obj, &cstr, &len);
+    if(alloc) *alloc = SWIG_NEWOBJ;
+#else
+    PyString_AsStringAndSize(obj, &cstr, &len);
+#endif
+    if (cptr) {
+      if (alloc) {
+	/* 
+	   In python the user should not be able to modify the inner
+	   string representation. To warranty that, if you define
+	   SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
+	   buffer is always returned.
+
+	   The default behavior is just to return the pointer value,
+	   so, be careful.
+	*/ 
+#if defined(SWIG_PYTHON_SAFE_CSTRINGS)
+	if (*alloc != SWIG_OLDOBJ) 
+#else
+	if (*alloc == SWIG_NEWOBJ) 
+#endif
+	{
+	  *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+	  *alloc = SWIG_NEWOBJ;
+	} else {
+	  *cptr = cstr;
+	  *alloc = SWIG_OLDOBJ;
+	}
+      } else {
+	#if PY_VERSION_HEX>=0x03000000
+	assert(0); /* Should never reach here in Python 3 */
+	#endif
+	*cptr = SWIG_Python_str_AsChar(obj);
+      }
+    }
+    if (psize) *psize = len + 1;
+#if PY_VERSION_HEX>=0x03000000
+    Py_XDECREF(obj);
+#endif
+    return SWIG_OK;
+  } else {
+#if defined(SWIG_PYTHON_2_UNICODE)
+#if PY_VERSION_HEX<0x03000000
+    if (PyUnicode_Check(obj)) {
+      char *cstr; Py_ssize_t len;
+      if (!alloc && cptr) {
+        return SWIG_RuntimeError;
+      }
+      obj = PyUnicode_AsUTF8String(obj);
+      if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
+        if (cptr) {
+          if (alloc) *alloc = SWIG_NEWOBJ;
+          *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+        }
+        if (psize) *psize = len + 1;
+
+        Py_XDECREF(obj);
+        return SWIG_OK;
+      } else {
+        Py_XDECREF(obj);
+      }
+    }
+#endif
+#endif
+
+    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+    if (pchar_descriptor) {
+      void* vptr = 0;
+      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
+	if (cptr) *cptr = (char *) vptr;
+	if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
+	if (alloc) *alloc = SWIG_OLDOBJ;
+	return SWIG_OK;
+      }
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERN int
+SWIG_AsPtr_std_string (PyObject * obj, std::string **val) 
+{
+  char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ;
+  if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) {
+    if (buf) {
+      if (val) *val = new std::string(buf, size - 1);
+      if (alloc == SWIG_NEWOBJ) delete[] buf;
+      return SWIG_NEWOBJ;
+    } else {
+      if (val) *val = 0;
+      return SWIG_OLDOBJ;
+    }
+  } else {
+    static int init = 0;
+    static swig_type_info* descriptor = 0;
+    if (!init) {
+      descriptor = SWIG_TypeQuery("std::string" " *");
+      init = 1;
+    }
+    if (descriptor) {
+      std::string *vptr;
+      int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0);
+      if (SWIG_IsOK(res) && val) *val = vptr;
+      return res;
+    }
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_std_string (PyObject * obj, std::string *val)
+{
+  std::string* v = (std::string *) 0;
+  int res = SWIG_AsPtr_std_string (obj, &v);
+  if (!SWIG_IsOK(res)) return res;
+  if (v) {
+    if (val) *val = *v;
+    if (SWIG_IsNewObj(res)) {
+      delete v;
+      res = SWIG_DelNewMask(res);
+    }
+    return res;
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+{
+  if (carray) {
+    if (size > INT_MAX) {
+      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+      return pchar_descriptor ? 
+	SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
+    } else {
+#if PY_VERSION_HEX >= 0x03000000
+#if PY_VERSION_HEX >= 0x03010000
+      return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape");
+#else
+      return PyUnicode_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#endif
+#else
+      return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#endif
+    }
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_std_string  (const std::string& s)
+{
+  return SWIG_FromCharPtrAndSize(s.data(), s.size());
+}
+
+
+namespace swig {
+  template <> struct traits< std::string > {
+    typedef value_category category;
+    static const char* type_name() { return"std::string"; }
+  };
+  template <>  struct traits_asval< std::string > {
+    typedef std::string value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_std_string (obj, val);
+    }
+  };
+  template <>  struct traits_from< std::string > {
+    typedef std::string value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_std_string  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::string, std::allocator< std::string > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::string" "," "std::allocator< std::string >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_string_Sg__iterator(std::vector< std::string > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_string_Sg____nonzero__(std::vector< std::string > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_string_Sg____bool__(std::vector< std::string > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::string >::size_type std_vector_Sl_std_string_Sg____len__(std::vector< std::string > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::string,std::allocator< std::string > >());
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_1(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j,std::vector< std::string,std::allocator< std::string > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getitem____SWIG_0(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_0(std::vector< std::string > *self,PySliceObject *slice,std::vector< std::string,std::allocator< std::string > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_1(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_1(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::string >::value_type const &std_vector_Sl_std_string_Sg____getitem____SWIG_1(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_2(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::string >::value_type std_vector_Sl_std_string_Sg__pop(std::vector< std::string > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::string,std::allocator< std::string > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg__append(std::vector< std::string > *self,std::vector< std::string >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator first,std::vector< std::string >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__insert__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::size_type n,std::vector< std::string >::value_type const &x){ self->insert(pos, n, x); }
+
+#define SWIG_FILE_WITH_INIT
+#define PY_ARRAY_UNIQUE_SYMBOL BORNAGAIN_PYTHONAPI_ARRAY
+
+
+#ifndef SWIG_FILE_WITH_INIT
+#define NO_IMPORT_ARRAY
+#endif
+#include "stdio.h"
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#include <numpy/arrayobject.h>
+
+
+#include "BAVersion.h"
+#include "BasicVector3D.h"
+#include "Beam.h"
+#include "Bin.h"
+#include "ChiSquaredModule.h"
+#include "Complex.h"
+#include "ConstKBinAxis.h"
+#include "Crystal.h"
+#include "CustomBinAxis.h"
+#include "DetectorMask.h"
+#include "Distributions.h"
+#include "Distributions.h"
+#include "Ellipse.h"
+#include "FTDecayFunctions.h"
+#include "FTDecayFunctions.h"
+#include "FTDistributions1D.h"
+#include "FTDistributions2D.h"
+#include "FitObject.h"
+#include "FitOptions.h"
+#include "FitParameterLinked.h"
+#include "FitSuite.h"
+#include "FitSuiteImpl.h"
+#include "FitSuiteObjects.h"
+#include "FitParameterSet.h"
+#include "FixedBinAxis.h"
+#include "FormFactorAnisoPyramid.h"
+#include "FormFactorBox.h"
+#include "FormFactorCone.h"
+#include "FormFactorCone6.h"
+#include "FormFactorCrystal.h"
+#include "FormFactorCuboctahedron.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorDecoratorDebyeWaller.h"
+#include "FormFactorDodecahedron.h"
+#include "FormFactorEllipsoidalCylinder.h"
+#include "FormFactorFullSphere.h"
+#include "FormFactorFullSpheroid.h"
+#include "FormFactorGauss.h"
+#include "FormFactorHemiEllipsoid.h"
+#include "FormFactorIcosahedron.h"
+#include "FormFactorLongBoxGauss.h"
+#include "FormFactorLongBoxLorentz.h"
+#include "FormFactorLongRipple1Gauss.h"
+#include "FormFactorLongRipple1Lorentz.h"
+#include "FormFactorLongRipple2Gauss.h"
+#include "FormFactorLongRipple2Lorentz.h"
+#include "FormFactorLorentz.h"
+#include "FormFactorPolyhedron.h"
+#include "FormFactorPolyhedron.h"
+#include "FormFactorPrism3.h"
+#include "FormFactorPrism6.h"
+#include "FormFactorPyramid.h"
+#include "FormFactorRipple1.h"
+#include "FormFactorRipple2.h"
+#include "FormFactorSphereGaussianRadius.h"
+#include "FormFactorSphereLogNormalRadius.h"
+#include "FormFactorSphereUniformRadius.h"
+#include "FormFactorTetrahedron.h"
+#include "FormFactorTrivial.h"
+#include "FormFactorTruncatedCube.h"
+#include "FormFactorTruncatedSphere.h"
+#include "FormFactorTruncatedSpheroid.h"
+#include "FormFactorWeighted.h"
+#include "GISASSimulation.h"
+#include "Histogram1D.h"
+#include "Histogram2D.h"
+#include "HomogeneousMagneticMaterial.h"
+#include "HomogeneousMaterial.h"
+#include "IAbstractParticle.h"
+#include "ICloneable.h"
+#include "IClusteredParticles.h"
+#include "ICompositeSample.h"
+#include "IDetector2D.h"
+#include "IDetectorResolution.h"
+#include "IFitObserver.h"
+#include "IFitStrategy.h"
+#include "IFormFactorDecorator.h"
+#include "IHistogram.h"
+#include "IIntensityFunction.h"
+#include "IInterferenceFunction.h"
+#include "ILayout.h"
+#include "IMaterial.h"
+#include "INamed.h"
+#include "INoncopyable.h"
+#include "IObserver.h"
+#include "IParameterized.h"
+#include "IParticle.h"
+#include "IResolutionFunction2D.h"
+#include "ISample.h"
+#include "IMultiLayerBuilder.h"
+#include "ISampleVisitor.h"
+#include "ISelectionRule.h"
+#include "IShape2D.h"
+#include "ISingleton.h"
+#include "Instrument.h"
+#include "IntensityDataFunctions.h"
+#include "IntensityDataIOFactory.h"
+#include "InterferenceFunction1DLattice.h"
+#include "InterferenceFunction1DLattice.h"
+#include "InterferenceFunction2DLattice.h"
+#include "InterferenceFunction2DLattice.h"
+#include "InterferenceFunction2DParaCrystal.h"
+#include "InterferenceFunction2DParaCrystal.h"
+#include "InterferenceFunctionNone.h"
+#include "InterferenceFunctionNone.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "InterferenceFunctionRadialParaCrystal.h"
+#include "IsGISAXSDetector.h"
+#include "Lattice.h"
+#include "Lattice1DParameters.h"
+#include "Lattice2DParameters.h"
+#include "Layer.h"
+#include "LayerInterface.h"
+#include "LayerRoughness.h"
+#include "Line.h"
+#include "Logger.h"
+#include "MathFunctions.h"
+#include "MesoCrystal.h"
+#include "MultiLayer.h"
+#include "OffSpecSimulation.h"
+#include "OutputData.h"
+#include "ParameterDistribution.h"
+#include "ParameterPool.h"
+#include "Particle.h"
+#include "ParticleComposition.h"
+#include "ParticleCoreShell.h"
+#include "ParticleDistribution.h"
+#include "ParticleLayout.h"
+#include "Polygon.h"
+#include "RealParameter.h"
+#include "Rectangle.h"
+#include "RectangularDetector.h"
+#include "ResolutionFunction2DGaussian.h"
+#include "Rotations.h"
+#include "Rotations.h"
+#include "SampleBuilderFactory.h"
+#include "Simulation.h"
+#include "SimulationFactory.h"
+#include "SimulationOptions.h"
+#include "SpecularSimulation.h"
+#include "SphericalDetector.h"
+#include "ThreadInfo.h"
+#include "Units.h"
+#include "VariableBinAxis.h"
+#include "Vectors3D.h"
+#include "WavevectorInfo.h"
+#include "IChiSquaredModule.h"
+#include "IIntensityFunction.h"
+#include "IIntensityNormalizer.h"
+#include "ISquaredFunction.h"
+#include "MathFunctions.h"
+#include "AdjustMinimizerStrategy.h"
+
+SWIGINTERN BasicVector3D< double > BasicVector3D_Sl_double_Sg____add__(BasicVector3D< double > const *self,BasicVector3D< double > const &rhs){
+        return *(self) + rhs; }
+SWIGINTERN BasicVector3D< double > BasicVector3D_Sl_double_Sg____mul__(BasicVector3D< double > const *self,double c){
+        return c * *(self); }
+SWIGINTERN BasicVector3D< double > BasicVector3D_Sl_double_Sg____rmul__(BasicVector3D< double > const *self,double c){
+        return *(self) * c; }
+SWIGINTERN BasicVector3D< double > BasicVector3D_Sl_double_Sg____neg__(BasicVector3D< double > const *self){
+        return - *(self); }
+
+  namespace swig {
+    template <>  struct traits< BasicVector3D< double > > {
+      typedef pointer_category category;
+      static const char* type_name() { return"BasicVector3D< double >"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< BasicVector3D< double >, std::allocator< BasicVector3D< double > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "BasicVector3D< double >" "," "std::allocator< BasicVector3D< double > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__iterator(std::vector< BasicVector3D< double > > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____nonzero__(std::vector< BasicVector3D< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____bool__(std::vector< BasicVector3D< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< BasicVector3D< double > >::size_type std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____len__(std::vector< BasicVector3D< double > > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____getslice__(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::difference_type i,std::vector< BasicVector3D< double > >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setslice____SWIG_0(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::difference_type i,std::vector< BasicVector3D< double > >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >());
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setslice____SWIG_1(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::difference_type i,std::vector< BasicVector3D< double > >::difference_type j,std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____delslice__(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::difference_type i,std::vector< BasicVector3D< double > >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____delitem____SWIG_0(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< BasicVector3D< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type id = i;
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< BasicVector3D< double > > *self,PySliceObject *slice,std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type id = i;
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< BasicVector3D< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type id = i;
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____delitem____SWIG_1(std::vector< BasicVector3D< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type id = i;
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< BasicVector3D< double > >::value_type const &std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< BasicVector3D< double > > const *self,std::vector< BasicVector3D< double > >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setitem____SWIG_2(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::difference_type i,std::vector< BasicVector3D< double > >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< BasicVector3D< double > >::value_type std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__pop(std::vector< BasicVector3D< double > > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__append(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< BasicVector3D< double > >::iterator std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< BasicVector3D< double > >::iterator std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::iterator first,std::vector< BasicVector3D< double > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< BasicVector3D< double > >::iterator std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::iterator pos,std::vector< BasicVector3D< double > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< BasicVector3D< double > > *self,std::vector< BasicVector3D< double > >::iterator pos,std::vector< BasicVector3D< double > >::size_type n,std::vector< BasicVector3D< double > >::value_type const &x){ self->insert(pos, n, x); }
+
+  namespace swig {
+    template <>  struct traits< BasicVector3D< std::complex< double > > > {
+      typedef pointer_category category;
+      static const char* type_name() { return"BasicVector3D< std::complex< double > >"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< BasicVector3D< std::complex< double > >, std::allocator< BasicVector3D< std::complex< double > > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "BasicVector3D< std::complex< double > >" "," "std::allocator< BasicVector3D< std::complex< double > > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__iterator(std::vector< BasicVector3D< std::complex< double > > > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____nonzero__(std::vector< BasicVector3D< std::complex< double > > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____bool__(std::vector< BasicVector3D< std::complex< double > > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > > >::size_type std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____len__(std::vector< BasicVector3D< std::complex< double > > > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____getslice__(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::difference_type i,std::vector< BasicVector3D< std::complex< double > > >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setslice____SWIG_0(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::difference_type i,std::vector< BasicVector3D< std::complex< double > > >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >());
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setslice____SWIG_1(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::difference_type i,std::vector< BasicVector3D< std::complex< double > > >::difference_type j,std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____delslice__(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::difference_type i,std::vector< BasicVector3D< std::complex< double > > >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____delitem____SWIG_0(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____getitem____SWIG_0(std::vector< BasicVector3D< std::complex< double > > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type id = i;
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setitem____SWIG_0(std::vector< BasicVector3D< std::complex< double > > > *self,PySliceObject *slice,std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type id = i;
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setitem____SWIG_1(std::vector< BasicVector3D< std::complex< double > > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type id = i;
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____delitem____SWIG_1(std::vector< BasicVector3D< std::complex< double > > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type id = i;
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > > >::value_type const &std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____getitem____SWIG_1(std::vector< BasicVector3D< std::complex< double > > > const *self,std::vector< BasicVector3D< std::complex< double > > >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setitem____SWIG_2(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::difference_type i,std::vector< BasicVector3D< std::complex< double > > >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > > >::value_type std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__pop(std::vector< BasicVector3D< std::complex< double > > > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__append(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > > >::iterator std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__erase__SWIG_0(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > > >::iterator std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__erase__SWIG_1(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::iterator first,std::vector< BasicVector3D< std::complex< double > > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< BasicVector3D< std::complex< double > > >::iterator std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__insert__SWIG_0(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::iterator pos,std::vector< BasicVector3D< std::complex< double > > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__insert__SWIG_1(std::vector< BasicVector3D< std::complex< double > > > *self,std::vector< BasicVector3D< std::complex< double > > >::iterator pos,std::vector< BasicVector3D< std::complex< double > > >::size_type n,std::vector< BasicVector3D< std::complex< double > > >::value_type const &x){ self->insert(pos, n, x); }
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val)
+{
+  unsigned long v;
+  int res = SWIG_AsVal_unsigned_SS_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v > UINT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< unsigned int >(v);
+    }
+  }  
+  return res;
+}
+
+SWIGINTERN double VariableBinAxis___getitem__(VariableBinAxis *self,unsigned int i){ return (*(self))[i]; }
+
+  namespace swig {
+    template <>  struct traits< ISample > {
+      typedef pointer_category category;
+      static const char* type_name() { return"ISample"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< ISample*, std::allocator< ISample * > > > {
+	  typedef value_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "ISample" " *," "std::allocator< ISample * >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_ISample_Sm__Sg__iterator(std::vector< ISample * > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_ISample_Sm__Sg____nonzero__(std::vector< ISample * > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_ISample_Sm__Sg____bool__(std::vector< ISample * > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< ISample * >::size_type std_vector_Sl_ISample_Sm__Sg____len__(std::vector< ISample * > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< ISample *,std::allocator< ISample * > > *std_vector_Sl_ISample_Sm__Sg____getslice__(std::vector< ISample * > *self,std::vector< ISample * >::difference_type i,std::vector< ISample * >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____setslice____SWIG_0(std::vector< ISample * > *self,std::vector< ISample * >::difference_type i,std::vector< ISample * >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< ISample*,std::allocator< ISample * > >());
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____setslice____SWIG_1(std::vector< ISample * > *self,std::vector< ISample * >::difference_type i,std::vector< ISample * >::difference_type j,std::vector< ISample *,std::allocator< ISample * > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____delslice__(std::vector< ISample * > *self,std::vector< ISample * >::difference_type i,std::vector< ISample * >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____delitem____SWIG_0(std::vector< ISample * > *self,std::vector< ISample * >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< ISample *,std::allocator< ISample * > > *std_vector_Sl_ISample_Sm__Sg____getitem____SWIG_0(std::vector< ISample * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type id = i;
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____setitem____SWIG_0(std::vector< ISample * > *self,PySliceObject *slice,std::vector< ISample *,std::allocator< ISample * > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type id = i;
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____setitem____SWIG_1(std::vector< ISample * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type id = i;
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____delitem____SWIG_1(std::vector< ISample * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type id = i;
+      std::vector< ISample*,std::allocator< ISample * > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< ISample * >::value_type std_vector_Sl_ISample_Sm__Sg____getitem____SWIG_1(std::vector< ISample * > *self,std::vector< ISample * >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg____setitem____SWIG_2(std::vector< ISample * > *self,std::vector< ISample * >::difference_type i,std::vector< ISample * >::value_type x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< ISample * >::value_type std_vector_Sl_ISample_Sm__Sg__pop(std::vector< ISample * > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< ISample*,std::allocator< ISample * > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg__append(std::vector< ISample * > *self,std::vector< ISample * >::value_type x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< ISample * >::iterator std_vector_Sl_ISample_Sm__Sg__erase__SWIG_0(std::vector< ISample * > *self,std::vector< ISample * >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< ISample * >::iterator std_vector_Sl_ISample_Sm__Sg__erase__SWIG_1(std::vector< ISample * > *self,std::vector< ISample * >::iterator first,std::vector< ISample * >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< ISample * >::iterator std_vector_Sl_ISample_Sm__Sg__insert__SWIG_0(std::vector< ISample * > *self,std::vector< ISample * >::iterator pos,std::vector< ISample * >::value_type x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_ISample_Sm__Sg__insert__SWIG_1(std::vector< ISample * > *self,std::vector< ISample * >::iterator pos,std::vector< ISample * >::size_type n,std::vector< ISample * >::value_type x){ self->insert(pos, n, x); }
+
+      namespace swig {
+	template <>  struct traits<std::vector< ISample const*, std::allocator< ISample const * > > > {
+	  typedef value_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "ISample" " const*," "std::allocator< ISample const * >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_ISample_SS_const_Sm__Sg__iterator(std::vector< ISample const * > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_ISample_SS_const_Sm__Sg____nonzero__(std::vector< ISample const * > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_ISample_SS_const_Sm__Sg____bool__(std::vector< ISample const * > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< ISample const * >::size_type std_vector_Sl_ISample_SS_const_Sm__Sg____len__(std::vector< ISample const * > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< ISample const *,std::allocator< ISample const * > > *std_vector_Sl_ISample_SS_const_Sm__Sg____getslice__(std::vector< ISample const * > *self,std::vector< ISample const * >::difference_type i,std::vector< ISample const * >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____setslice____SWIG_0(std::vector< ISample const * > *self,std::vector< ISample const * >::difference_type i,std::vector< ISample const * >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< ISample const*,std::allocator< ISample const * > >());
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____setslice____SWIG_1(std::vector< ISample const * > *self,std::vector< ISample const * >::difference_type i,std::vector< ISample const * >::difference_type j,std::vector< ISample const *,std::allocator< ISample const * > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____delslice__(std::vector< ISample const * > *self,std::vector< ISample const * >::difference_type i,std::vector< ISample const * >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____delitem____SWIG_0(std::vector< ISample const * > *self,std::vector< ISample const * >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< ISample const *,std::allocator< ISample const * > > *std_vector_Sl_ISample_SS_const_Sm__Sg____getitem____SWIG_0(std::vector< ISample const * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type id = i;
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____setitem____SWIG_0(std::vector< ISample const * > *self,PySliceObject *slice,std::vector< ISample const *,std::allocator< ISample const * > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type id = i;
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____setitem____SWIG_1(std::vector< ISample const * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type id = i;
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____delitem____SWIG_1(std::vector< ISample const * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type id = i;
+      std::vector< ISample const*,std::allocator< ISample const * > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< ISample const * >::value_type std_vector_Sl_ISample_SS_const_Sm__Sg____getitem____SWIG_1(std::vector< ISample const * > *self,std::vector< ISample const * >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg____setitem____SWIG_2(std::vector< ISample const * > *self,std::vector< ISample const * >::difference_type i,std::vector< ISample const * >::value_type x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< ISample const * >::value_type std_vector_Sl_ISample_SS_const_Sm__Sg__pop(std::vector< ISample const * > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< ISample const*,std::allocator< ISample const * > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg__append(std::vector< ISample const * > *self,std::vector< ISample const * >::value_type x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< ISample const * >::iterator std_vector_Sl_ISample_SS_const_Sm__Sg__erase__SWIG_0(std::vector< ISample const * > *self,std::vector< ISample const * >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< ISample const * >::iterator std_vector_Sl_ISample_SS_const_Sm__Sg__erase__SWIG_1(std::vector< ISample const * > *self,std::vector< ISample const * >::iterator first,std::vector< ISample const * >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< ISample const * >::iterator std_vector_Sl_ISample_SS_const_Sm__Sg__insert__SWIG_0(std::vector< ISample const * > *self,std::vector< ISample const * >::iterator pos,std::vector< ISample const * >::value_type x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_ISample_SS_const_Sm__Sg__insert__SWIG_1(std::vector< ISample const * > *self,std::vector< ISample const * >::iterator pos,std::vector< ISample const * >::size_type n,std::vector< ISample const * >::value_type x){ self->insert(pos, n, x); }
+
+struct SWIG_null_deleter {
+  void operator() (void const *) const {
+  }
+};
+#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter()
+#define SWIG_NO_NULL_DELETER_1
+#define SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW
+#define SWIG_NO_NULL_DELETER_SWIG_POINTER_OWN
+
+
+#define SWIG_NO_NULL_DELETER_SWIG_BUILTIN_INIT
+
+
+SWIGINTERN int
+SWIG_AsVal_long_SS_long (PyObject *obj, long long *val)
+{
+  int res = SWIG_TypeError;
+  if (PyLong_Check(obj)) {
+    long long v = PyLong_AsLongLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      res = SWIG_OverflowError;
+    }
+  } else {
+    long v;
+    res = SWIG_AsVal_long (obj,&v);
+    if (SWIG_IsOK(res)) {
+      if (val) *val = v;
+      return res;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    const double mant_max = 1LL << DBL_MANT_DIG;
+    const double mant_min = -mant_max;
+    double d;
+    res = SWIG_AsVal_double (obj,&d);
+    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) {
+      if (val) *val = (long long)(d);
+      return SWIG_AddCast(res);
+    }
+    res = SWIG_TypeError;
+  }
+#endif
+  return res;
+}
+
+SWIGINTERN RealParameter *IMultiLayerBuilder_registerParameter(IMultiLayerBuilder *self,std::string const &name,int64_t parpointer){
+        return &((*(self)).registerParameter(name, (double*)parpointer)); }
+SWIGINTERN void IMultiLayerBuilder_setParameterValue(IMultiLayerBuilder *self,std::string const &name,double value){
+        dynamic_cast<IParameterized*>(self)->setParameterValue(name, value); }
+SWIGINTERN bool IMultiLayerBuilder_isPythonBuilder(){
+        return true; }
+
+SWIGINTERN int
+SWIG_AsVal_bool (PyObject *obj, bool *val)
+{
+  int r;
+  if (!PyBool_Check(obj))
+    return SWIG_ERROR;
+  r = PyObject_IsTrue(obj);
+  if (r == -1)
+    return SWIG_ERROR;
+  if (val) *val = r ? true : false;
+  return SWIG_OK;
+}
+
+SWIGINTERN double FixedBinAxis___getitem__(FixedBinAxis *self,unsigned int i){ return (*(self))[i]; }
+
+  namespace swig {
+    template <>  struct traits< IFormFactor > {
+      typedef pointer_category category;
+      static const char* type_name() { return"IFormFactor"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< IFormFactor*, std::allocator< IFormFactor * > > > {
+	  typedef value_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "IFormFactor" " *," "std::allocator< IFormFactor * >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_IFormFactor_Sm__Sg__iterator(std::vector< IFormFactor * > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_IFormFactor_Sm__Sg____nonzero__(std::vector< IFormFactor * > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_IFormFactor_Sm__Sg____bool__(std::vector< IFormFactor * > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< IFormFactor * >::size_type std_vector_Sl_IFormFactor_Sm__Sg____len__(std::vector< IFormFactor * > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< IFormFactor *,std::allocator< IFormFactor * > > *std_vector_Sl_IFormFactor_Sm__Sg____getslice__(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::difference_type i,std::vector< IFormFactor * >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____setslice____SWIG_0(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::difference_type i,std::vector< IFormFactor * >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< IFormFactor*,std::allocator< IFormFactor * > >());
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____setslice____SWIG_1(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::difference_type i,std::vector< IFormFactor * >::difference_type j,std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____delslice__(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::difference_type i,std::vector< IFormFactor * >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____delitem____SWIG_0(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< IFormFactor *,std::allocator< IFormFactor * > > *std_vector_Sl_IFormFactor_Sm__Sg____getitem____SWIG_0(std::vector< IFormFactor * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type id = i;
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____setitem____SWIG_0(std::vector< IFormFactor * > *self,PySliceObject *slice,std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type id = i;
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____setitem____SWIG_1(std::vector< IFormFactor * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type id = i;
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____delitem____SWIG_1(std::vector< IFormFactor * > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type id = i;
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< IFormFactor * >::value_type std_vector_Sl_IFormFactor_Sm__Sg____getitem____SWIG_1(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg____setitem____SWIG_2(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::difference_type i,std::vector< IFormFactor * >::value_type x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< IFormFactor * >::value_type std_vector_Sl_IFormFactor_Sm__Sg__pop(std::vector< IFormFactor * > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< IFormFactor*,std::allocator< IFormFactor * > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg__append(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::value_type x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< IFormFactor * >::iterator std_vector_Sl_IFormFactor_Sm__Sg__erase__SWIG_0(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< IFormFactor * >::iterator std_vector_Sl_IFormFactor_Sm__Sg__erase__SWIG_1(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::iterator first,std::vector< IFormFactor * >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< IFormFactor * >::iterator std_vector_Sl_IFormFactor_Sm__Sg__insert__SWIG_0(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::iterator pos,std::vector< IFormFactor * >::value_type x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_IFormFactor_Sm__Sg__insert__SWIG_1(std::vector< IFormFactor * > *self,std::vector< IFormFactor * >::iterator pos,std::vector< IFormFactor * >::size_type n,std::vector< IFormFactor * >::value_type x){ self->insert(pos, n, x); }
+SWIGINTERN Histogram1D *Histogram1D_dynamicCast(IHistogram *pHistogram){
+        return dynamic_cast<Histogram1D*>(pHistogram); }
+SWIGINTERN Histogram2D *Histogram2D_dynamicCast(IHistogram *pHistogram){
+        return dynamic_cast<Histogram2D*>(pHistogram); }
+SWIGINTERN double OutputData_Sl_double_Sg____getitem__(OutputData< double > *self,unsigned int i){ return (*(self))[i]; }
+SWIGINTERN double OutputData_Sl_double_Sg____setitem__(OutputData< double > *self,unsigned int i,double value){
+        (*(self))[i] = value;
+        return (*(self))[i];
+    }
+
+
+/* ---------------------------------------------------
+ * C++ director class methods
+ * --------------------------------------------------- */
+
+#include "libBornAgainCore_wrap.h"
+
+SwigDirector_INamed::SwigDirector_INamed(PyObject *self): INamed(), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((INamed *)this, this); 
+}
+
+
+
+
+SwigDirector_INamed::SwigDirector_INamed(PyObject *self, std::string const &name): INamed(name), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((INamed *)this, this); 
+}
+
+
+
+
+SwigDirector_INamed::~SwigDirector_INamed() {
+}
+
+SwigDirector_IParameterized::SwigDirector_IParameterized(PyObject *self, std::string const &name): IParameterized(name), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((IParameterized *)this, this); 
+}
+
+
+
+
+SwigDirector_IParameterized::SwigDirector_IParameterized(PyObject *self, IParameterized const &other): IParameterized(other), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((IParameterized *)this, this); 
+}
+
+
+
+
+SwigDirector_IParameterized::~SwigDirector_IParameterized() {
+}
+
+std::string SwigDirector_IParameterized::addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number) const {
+  return IParameterized::addParametersToExternalPool(path,external_pool,copy_number);
+}
+
+
+void SwigDirector_IParameterized::onChange() {
+  swig_set_inner("onChange", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IParameterized.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 0;
+  const char * const swig_method_name = "onChange";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "onChange", NULL);
+#endif
+  swig_set_inner("onChange", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IParameterized.onChange'");
+    }
+  }
+}
+
+
+void SwigDirector_IParameterized::print(std::ostream &ostr) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&ostr), SWIGTYPE_p_std__ostream,  0 );
+  swig_set_inner("print", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IParameterized.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 1;
+  const char * const swig_method_name = "_print";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"_print", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  swig_set_inner("print", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IParameterized._print'");
+    }
+  }
+}
+
+
+SwigDirector_ISample::SwigDirector_ISample(PyObject *self): ISample(), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((ISample *)this, this); 
+}
+
+
+
+
+SwigDirector_ISample::~SwigDirector_ISample() {
+}
+
+ISample *SwigDirector_ISample::clone() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  ISample *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 0;
+  const char * const swig_method_name = "clone";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "clone", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.clone'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_ISample,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""ISample *""'");
+  }
+  c_result = reinterpret_cast< ISample * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (ISample *) c_result;
+}
+
+
+void SwigDirector_ISample::transferToCPP() {
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 1;
+  const char * const swig_method_name = "transferToCPP";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "transferToCPP", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.transferToCPP'");
+    }
+  }
+}
+
+
+std::string SwigDirector_ISample::addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number) const {
+  return IParameterized::addParametersToExternalPool(path,external_pool,copy_number);
+}
+
+
+void SwigDirector_ISample::onChange() {
+  swig_set_inner("onChange", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 2;
+  const char * const swig_method_name = "onChange";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "onChange", NULL);
+#endif
+  swig_set_inner("onChange", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.onChange'");
+    }
+  }
+}
+
+
+void SwigDirector_ISample::print(std::ostream &ostr) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&ostr), SWIGTYPE_p_std__ostream,  0 );
+  swig_set_inner("print", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 3;
+  const char * const swig_method_name = "_print";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"_print", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  swig_set_inner("print", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample._print'");
+    }
+  }
+}
+
+
+ISample *SwigDirector_ISample::cloneInvertB() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  ISample *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 4;
+  const char * const swig_method_name = "cloneInvertB";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "cloneInvertB", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.cloneInvertB'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_ISample,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""ISample *""'");
+  }
+  c_result = reinterpret_cast< ISample * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (ISample *) c_result;
+}
+
+
+void SwigDirector_ISample::accept(ISampleVisitor *p_visitor) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(p_visitor), SWIGTYPE_p_ISampleVisitor,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 5;
+  const char * const swig_method_name = "accept";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"accept", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.accept'");
+    }
+  }
+}
+
+
+std::string SwigDirector_ISample::to_str(int indent) const {
+  std::string c_result;
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_From_int(static_cast< int >(indent));
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 6;
+  const char * const swig_method_name = "to_str";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"to_str", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.to_str'");
+    }
+  }
+  std::string *swig_optr = 0;
+  int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr);
+  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'");
+  }
+  c_result = *swig_optr;
+  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
+  return (std::string) c_result;
+}
+
+
+IMaterial const *SwigDirector_ISample::getMaterial() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IMaterial *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 8;
+  const char * const swig_method_name = "getMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getMaterial", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.getMaterial'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IMaterial,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IMaterial const *""'");
+  }
+  c_result = reinterpret_cast< IMaterial * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IMaterial const *) c_result;
+}
+
+
+IMaterial const *SwigDirector_ISample::getAmbientMaterial() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IMaterial *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 9;
+  const char * const swig_method_name = "getAmbientMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getAmbientMaterial", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.getAmbientMaterial'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IMaterial,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IMaterial const *""'");
+  }
+  c_result = reinterpret_cast< IMaterial * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IMaterial const *) c_result;
+}
+
+
+std::vector< ISample const *,std::allocator< ISample const * > > SwigDirector_ISample::getChildren() const {
+  void *swig_argp ;
+  int swig_res = 0 ;
+  
+  std::vector< ISample const *,std::allocator< ISample const * > > c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 10;
+  const char * const swig_method_name = "getChildren";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getChildren", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.getChildren'");
+    }
+  }
+  swig_res = SWIG_ConvertPtr(result,&swig_argp,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t,  0  | 0);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""std::vector< ISample const *,std::allocator< ISample const * > >""'");
+  }
+  c_result = *(reinterpret_cast< std::vector< ISample const *,std::allocator< ISample const * > > * >(swig_argp));
+  if (SWIG_IsNewObj(swig_res)) delete reinterpret_cast< std::vector< ISample const *,std::allocator< ISample const * > > * >(swig_argp);
+  return (std::vector< ISample const *,std::allocator< ISample const * > >) c_result;
+}
+
+
+size_t SwigDirector_ISample::size() const {
+  size_t c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call ISample.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 11;
+  const char * const swig_method_name = "size";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "size", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'ISample.size'");
+    }
+  }
+  size_t swig_val;
+  int swig_res = SWIG_AsVal_size_t(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""size_t""'");
+  }
+  c_result = static_cast< size_t >(swig_val);
+  return (size_t) c_result;
+}
+
+
+SwigDirector_IObservable::SwigDirector_IObservable(PyObject *self): IObservable(), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((IObservable *)this, this); 
+}
+
+
+
+
+SwigDirector_IObservable::~SwigDirector_IObservable() {
+}
+
+void SwigDirector_IObservable::attachObserver(IObservable::observer_t obj) {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&obj), SWIGTYPE_p_std__shared_ptrT_IObserver_t,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IObservable.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 0;
+  const char * const swig_method_name = "attachObserver";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"attachObserver", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IObservable.attachObserver'");
+    }
+  }
+}
+
+
+void SwigDirector_IObservable::notifyObservers() {
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IObservable.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 1;
+  const char * const swig_method_name = "notifyObservers";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "notifyObservers", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IObservable.notifyObservers'");
+    }
+  }
+}
+
+
+SwigDirector_IFitObserver::SwigDirector_IFitObserver(PyObject *self, int update_every_nth): IFitObserver(update_every_nth), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((IFitObserver *)this, this); 
+}
+
+
+
+
+SwigDirector_IFitObserver::~SwigDirector_IFitObserver() {
+}
+
+void SwigDirector_IFitObserver::notify(IObservable *subject) {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(subject), SWIGTYPE_p_IObservable,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFitObserver.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 0;
+  const char * const swig_method_name = "notify";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"notify", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFitObserver.notify'");
+    }
+  }
+}
+
+
+void SwigDirector_IFitObserver::update(FitSuite *fit_suite) {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(fit_suite), SWIGTYPE_p_FitSuite,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFitObserver.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 1;
+  const char * const swig_method_name = "update";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"update", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFitObserver.update'");
+    }
+  }
+}
+
+
+SwigDirector_IMultiLayerBuilder::SwigDirector_IMultiLayerBuilder(PyObject *self): IMultiLayerBuilder(), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((IMultiLayerBuilder *)this, this); 
+}
+
+
+
+
+SwigDirector_IMultiLayerBuilder::~SwigDirector_IMultiLayerBuilder() {
+}
+
+std::string SwigDirector_IMultiLayerBuilder::addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number) const {
+  return IParameterized::addParametersToExternalPool(path,external_pool,copy_number);
+}
+
+
+void SwigDirector_IMultiLayerBuilder::onChange() {
+  swig_set_inner("onChange", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IMultiLayerBuilder.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 0;
+  const char * const swig_method_name = "onChange";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "onChange", NULL);
+#endif
+  swig_set_inner("onChange", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IMultiLayerBuilder.onChange'");
+    }
+  }
+}
+
+
+void SwigDirector_IMultiLayerBuilder::print(std::ostream &ostr) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&ostr), SWIGTYPE_p_std__ostream,  0 );
+  swig_set_inner("print", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IMultiLayerBuilder.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 1;
+  const char * const swig_method_name = "_print";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"_print", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  swig_set_inner("print", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IMultiLayerBuilder._print'");
+    }
+  }
+}
+
+
+MultiLayer *SwigDirector_IMultiLayerBuilder::buildSample() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  MultiLayer *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IMultiLayerBuilder.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 2;
+  const char * const swig_method_name = "buildSample";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "buildSample", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IMultiLayerBuilder.buildSample'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_MultiLayer,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""MultiLayer *""'");
+  }
+  c_result = reinterpret_cast< MultiLayer * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (MultiLayer *) c_result;
+}
+
+
+SwigDirector_IFormFactor::SwigDirector_IFormFactor(PyObject *self): IFormFactor(), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((IFormFactor *)this, this); 
+}
+
+
+
+
+SwigDirector_IFormFactor::~SwigDirector_IFormFactor() {
+}
+
+IFormFactor *SwigDirector_IFormFactor::clone() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IFormFactor *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 0;
+  const char * const swig_method_name = "clone";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "clone", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.clone'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IFormFactor,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IFormFactor *""'");
+  }
+  c_result = reinterpret_cast< IFormFactor * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IFormFactor *) c_result;
+}
+
+
+void SwigDirector_IFormFactor::transferToCPP() {
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 1;
+  const char * const swig_method_name = "transferToCPP";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "transferToCPP", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.transferToCPP'");
+    }
+  }
+}
+
+
+std::string SwigDirector_IFormFactor::addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number) const {
+  return IParameterized::addParametersToExternalPool(path,external_pool,copy_number);
+}
+
+
+void SwigDirector_IFormFactor::onChange() {
+  swig_set_inner("onChange", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 2;
+  const char * const swig_method_name = "onChange";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "onChange", NULL);
+#endif
+  swig_set_inner("onChange", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.onChange'");
+    }
+  }
+}
+
+
+void SwigDirector_IFormFactor::print(std::ostream &ostr) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&ostr), SWIGTYPE_p_std__ostream,  0 );
+  swig_set_inner("print", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 3;
+  const char * const swig_method_name = "_print";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"_print", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  swig_set_inner("print", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor._print'");
+    }
+  }
+}
+
+
+ISample *SwigDirector_IFormFactor::cloneInvertB() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  ISample *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 4;
+  const char * const swig_method_name = "cloneInvertB";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "cloneInvertB", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.cloneInvertB'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_ISample,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""ISample *""'");
+  }
+  c_result = reinterpret_cast< ISample * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (ISample *) c_result;
+}
+
+
+void SwigDirector_IFormFactor::accept(ISampleVisitor *visitor) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(visitor), SWIGTYPE_p_ISampleVisitor,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 5;
+  const char * const swig_method_name = "accept";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"accept", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.accept'");
+    }
+  }
+}
+
+
+std::string SwigDirector_IFormFactor::to_str(int indent) const {
+  std::string c_result;
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_From_int(static_cast< int >(indent));
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 6;
+  const char * const swig_method_name = "to_str";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"to_str", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.to_str'");
+    }
+  }
+  std::string *swig_optr = 0;
+  int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr);
+  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'");
+  }
+  c_result = *swig_optr;
+  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
+  return (std::string) c_result;
+}
+
+
+IMaterial const *SwigDirector_IFormFactor::getMaterial() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IMaterial *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 8;
+  const char * const swig_method_name = "getMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getMaterial", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.getMaterial'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IMaterial,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IMaterial const *""'");
+  }
+  c_result = reinterpret_cast< IMaterial * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IMaterial const *) c_result;
+}
+
+
+IMaterial const *SwigDirector_IFormFactor::getAmbientMaterial() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IMaterial *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 9;
+  const char * const swig_method_name = "getAmbientMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getAmbientMaterial", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.getAmbientMaterial'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IMaterial,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IMaterial const *""'");
+  }
+  c_result = reinterpret_cast< IMaterial * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IMaterial const *) c_result;
+}
+
+
+std::vector< ISample const *,std::allocator< ISample const * > > SwigDirector_IFormFactor::getChildren() const {
+  std::vector< ISample const *,std::allocator< ISample const * > > c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 10;
+  const char * const swig_method_name = "getChildren";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getChildren", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.getChildren'");
+    }
+  }
+  std::vector< ISample const*,std::allocator< ISample const * > > *swig_optr = 0;
+  int swig_ores = swig::asptr(result, &swig_optr);
+  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::vector< ISample const *,std::allocator< ISample const * > >""'");
+  }
+  c_result = *swig_optr;
+  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
+  return (std::vector< ISample const *,std::allocator< ISample const * > >) c_result;
+}
+
+
+size_t SwigDirector_IFormFactor::size() const {
+  size_t c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 11;
+  const char * const swig_method_name = "size";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "size", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.size'");
+    }
+  }
+  size_t swig_val;
+  int swig_res = SWIG_AsVal_size_t(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""size_t""'");
+  }
+  c_result = static_cast< size_t >(swig_val);
+  return (size_t) c_result;
+}
+
+
+void SwigDirector_IFormFactor::setAmbientMaterial(IMaterial const &arg0) {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&arg0), SWIGTYPE_p_IMaterial,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 12;
+  const char * const swig_method_name = "setAmbientMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"setAmbientMaterial", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.setAmbientMaterial'");
+    }
+  }
+}
+
+
+complex_t SwigDirector_IFormFactor::evaluate(WavevectorInfo const &wavevectors) const {
+  complex_t c_result;
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&wavevectors), SWIGTYPE_p_WavevectorInfo,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 13;
+  const char * const swig_method_name = "evaluate";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"evaluate", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.evaluate'");
+    }
+  }
+  std::complex<double> swig_val;
+  int swig_res = SWIG_AsVal_std_complex_Sl_double_Sg_(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""complex_t""'");
+  }
+  c_result = static_cast< complex_t >(swig_val);
+  return (complex_t) c_result;
+}
+
+
+double SwigDirector_IFormFactor::getVolume() const {
+  double c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 14;
+  const char * const swig_method_name = "getVolume";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getVolume", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.getVolume'");
+    }
+  }
+  double swig_val;
+  int swig_res = SWIG_AsVal_double(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""double""'");
+  }
+  c_result = static_cast< double >(swig_val);
+  return (double) c_result;
+}
+
+
+double SwigDirector_IFormFactor::getRadialExtension() const {
+  double c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 15;
+  const char * const swig_method_name = "getRadialExtension";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getRadialExtension", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.getRadialExtension'");
+    }
+  }
+  double swig_val;
+  int swig_res = SWIG_AsVal_double(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""double""'");
+  }
+  c_result = static_cast< double >(swig_val);
+  return (double) c_result;
+}
+
+
+void SwigDirector_IFormFactor::setSpecularInfo(ILayerRTCoefficients const *arg0, ILayerRTCoefficients const *arg1) {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(arg0), SWIGTYPE_p_ILayerRTCoefficients,  0 );
+  swig::SwigVar_PyObject obj1;
+  obj1 = SWIG_NewPointerObj(SWIG_as_voidptr(arg1), SWIGTYPE_p_ILayerRTCoefficients,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactor.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 16;
+  const char * const swig_method_name = "setSpecularInfo";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(OO)" ,(PyObject *)obj0,(PyObject *)obj1);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"setSpecularInfo", (char *)"(OO)" ,(PyObject *)obj0,(PyObject *)obj1);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactor.setSpecularInfo'");
+    }
+  }
+}
+
+
+SwigDirector_IFormFactorBorn::SwigDirector_IFormFactorBorn(PyObject *self): IFormFactorBorn(), Swig::Director(self) {
+  SWIG_DIRECTOR_RGTR((IFormFactorBorn *)this, this); 
+}
+
+
+
+
+SwigDirector_IFormFactorBorn::~SwigDirector_IFormFactorBorn() {
+}
+
+IFormFactorBorn *SwigDirector_IFormFactorBorn::clone() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IFormFactorBorn *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 0;
+  const char * const swig_method_name = "clone";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "clone", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.clone'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IFormFactorBorn,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IFormFactorBorn *""'");
+  }
+  c_result = reinterpret_cast< IFormFactorBorn * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IFormFactorBorn *) c_result;
+}
+
+
+void SwigDirector_IFormFactorBorn::transferToCPP() {
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 1;
+  const char * const swig_method_name = "transferToCPP";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "transferToCPP", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.transferToCPP'");
+    }
+  }
+}
+
+
+std::string SwigDirector_IFormFactorBorn::addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number) const {
+  return IParameterized::addParametersToExternalPool(path,external_pool,copy_number);
+}
+
+
+void SwigDirector_IFormFactorBorn::onChange() {
+  swig_set_inner("onChange", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 2;
+  const char * const swig_method_name = "onChange";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "onChange", NULL);
+#endif
+  swig_set_inner("onChange", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.onChange'");
+    }
+  }
+}
+
+
+void SwigDirector_IFormFactorBorn::print(std::ostream &ostr) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&ostr), SWIGTYPE_p_std__ostream,  0 );
+  swig_set_inner("print", true);
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 3;
+  const char * const swig_method_name = "_print";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"_print", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  swig_set_inner("print", false);
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn._print'");
+    }
+  }
+}
+
+
+ISample *SwigDirector_IFormFactorBorn::cloneInvertB() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  ISample *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 4;
+  const char * const swig_method_name = "cloneInvertB";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "cloneInvertB", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.cloneInvertB'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_ISample,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""ISample *""'");
+  }
+  c_result = reinterpret_cast< ISample * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (ISample *) c_result;
+}
+
+
+void SwigDirector_IFormFactorBorn::accept(ISampleVisitor *visitor) const {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(visitor), SWIGTYPE_p_ISampleVisitor,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 5;
+  const char * const swig_method_name = "accept";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"accept", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.accept'");
+    }
+  }
+}
+
+
+std::string SwigDirector_IFormFactorBorn::to_str(int indent) const {
+  std::string c_result;
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_From_int(static_cast< int >(indent));
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 6;
+  const char * const swig_method_name = "to_str";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"to_str", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.to_str'");
+    }
+  }
+  std::string *swig_optr = 0;
+  int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr);
+  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'");
+  }
+  c_result = *swig_optr;
+  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
+  return (std::string) c_result;
+}
+
+
+IMaterial const *SwigDirector_IFormFactorBorn::getMaterial() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IMaterial *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 8;
+  const char * const swig_method_name = "getMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getMaterial", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.getMaterial'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IMaterial,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IMaterial const *""'");
+  }
+  c_result = reinterpret_cast< IMaterial * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IMaterial const *) c_result;
+}
+
+
+IMaterial const *SwigDirector_IFormFactorBorn::getAmbientMaterial() const {
+  void *swig_argp ;
+  int swig_res ;
+  swig_owntype own ;
+  
+  IMaterial *c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 9;
+  const char * const swig_method_name = "getAmbientMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getAmbientMaterial", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.getAmbientMaterial'");
+    }
+  }
+  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IMaterial,  0  | SWIG_POINTER_DISOWN, &own);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IMaterial const *""'");
+  }
+  c_result = reinterpret_cast< IMaterial * >(swig_argp);
+  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
+  return (IMaterial const *) c_result;
+}
+
+
+std::vector< ISample const *,std::allocator< ISample const * > > SwigDirector_IFormFactorBorn::getChildren() const {
+  std::vector< ISample const *,std::allocator< ISample const * > > c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 10;
+  const char * const swig_method_name = "getChildren";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getChildren", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.getChildren'");
+    }
+  }
+  std::vector< ISample const*,std::allocator< ISample const * > > *swig_optr = 0;
+  int swig_ores = swig::asptr(result, &swig_optr);
+  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::vector< ISample const *,std::allocator< ISample const * > >""'");
+  }
+  c_result = *swig_optr;
+  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
+  return (std::vector< ISample const *,std::allocator< ISample const * > >) c_result;
+}
+
+
+size_t SwigDirector_IFormFactorBorn::size() const {
+  size_t c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 11;
+  const char * const swig_method_name = "size";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "size", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.size'");
+    }
+  }
+  size_t swig_val;
+  int swig_res = SWIG_AsVal_size_t(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""size_t""'");
+  }
+  c_result = static_cast< size_t >(swig_val);
+  return (size_t) c_result;
+}
+
+
+void SwigDirector_IFormFactorBorn::setAmbientMaterial(IMaterial const &arg0) {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&arg0), SWIGTYPE_p_IMaterial,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 12;
+  const char * const swig_method_name = "setAmbientMaterial";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"setAmbientMaterial", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.setAmbientMaterial'");
+    }
+  }
+}
+
+
+complex_t SwigDirector_IFormFactorBorn::evaluate(WavevectorInfo const &wavevectors) const {
+  complex_t c_result;
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&wavevectors), SWIGTYPE_p_WavevectorInfo,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 13;
+  const char * const swig_method_name = "evaluate";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"evaluate", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.evaluate'");
+    }
+  }
+  std::complex<double> swig_val;
+  int swig_res = SWIG_AsVal_std_complex_Sl_double_Sg_(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""complex_t""'");
+  }
+  c_result = static_cast< complex_t >(swig_val);
+  return (complex_t) c_result;
+}
+
+
+double SwigDirector_IFormFactorBorn::getVolume() const {
+  double c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 14;
+  const char * const swig_method_name = "getVolume";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getVolume", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.getVolume'");
+    }
+  }
+  double swig_val;
+  int swig_res = SWIG_AsVal_double(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""double""'");
+  }
+  c_result = static_cast< double >(swig_val);
+  return (double) c_result;
+}
+
+
+double SwigDirector_IFormFactorBorn::getRadialExtension() const {
+  double c_result;
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 15;
+  const char * const swig_method_name = "getRadialExtension";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "getRadialExtension", NULL);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.getRadialExtension'");
+    }
+  }
+  double swig_val;
+  int swig_res = SWIG_AsVal_double(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""double""'");
+  }
+  c_result = static_cast< double >(swig_val);
+  return (double) c_result;
+}
+
+
+void SwigDirector_IFormFactorBorn::setSpecularInfo(ILayerRTCoefficients const *arg0, ILayerRTCoefficients const *arg1) {
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(arg0), SWIGTYPE_p_ILayerRTCoefficients,  0 );
+  swig::SwigVar_PyObject obj1;
+  obj1 = SWIG_NewPointerObj(SWIG_as_voidptr(arg1), SWIGTYPE_p_ILayerRTCoefficients,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 16;
+  const char * const swig_method_name = "setSpecularInfo";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(OO)" ,(PyObject *)obj0,(PyObject *)obj1);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"setSpecularInfo", (char *)"(OO)" ,(PyObject *)obj0,(PyObject *)obj1);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.setSpecularInfo'");
+    }
+  }
+}
+
+
+complex_t SwigDirector_IFormFactorBorn::evaluate_for_q(cvector_t const q) const {
+  complex_t c_result;
+  swig::SwigVar_PyObject obj0;
+  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&q), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0 );
+  if (!swig_get_self()) {
+    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IFormFactorBorn.__init__.");
+  }
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+  const size_t swig_method_index = 17;
+  const char * const swig_method_name = "evaluate_for_q";
+  PyObject* method = swig_get_method(swig_method_index, swig_method_name);
+  swig::SwigVar_PyObject result = PyObject_CallFunction(method, (char *)"(O)" ,(PyObject *)obj0);
+#else
+  swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *)"evaluate_for_q", (char *)"(O)" ,(PyObject *)obj0);
+#endif
+  if (!result) {
+    PyObject *error = PyErr_Occurred();
+    if (error) {
+      Swig::DirectorMethodException::raise("Error detected when calling 'IFormFactorBorn.evaluate_for_q'");
+    }
+  }
+  std::complex<double> swig_val;
+  int swig_res = SWIG_AsVal_std_complex_Sl_double_Sg_(result, &swig_val);
+  if (!SWIG_IsOK(swig_res)) {
+    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""complex_t""'");
+  }
+  c_result = static_cast< complex_t >(swig_val);
+  return (complex_t) c_result;
+}
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SwigPyIterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SwigPyIterator" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_value",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_value" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)((swig::SwigPyIterator const *)arg1)->value();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_incr",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_incr" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->incr(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_incr",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->incr();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SwigPyIterator_incr__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator_incr__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SwigPyIterator_incr'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    swig::SwigPyIterator::incr(size_t)\n"
+    "    swig::SwigPyIterator::incr()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_decr",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_decr" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->decr(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_decr",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->decr();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SwigPyIterator_decr__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator_decr__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SwigPyIterator_decr'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    swig::SwigPyIterator::decr(size_t)\n"
+    "    swig::SwigPyIterator::decr()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ptrdiff_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_distance",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_distance" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  try {
+    result = ((swig::SwigPyIterator const *)arg1)->distance((swig::SwigPyIterator const &)*arg2);
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail;
+  }
+  
+  resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_equal",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_equal" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  try {
+    result = (bool)((swig::SwigPyIterator const *)arg1)->equal((swig::SwigPyIterator const &)*arg2);
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail;
+  }
+  
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_copy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_copy" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->copy();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_next",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_next" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->next();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator___next__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___next__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->__next__();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_previous",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_previous" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->previous();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_advance",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_advance" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_advance" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->advance(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___eq__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___eq__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = (bool)((swig::SwigPyIterator const *)arg1)->operator ==((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___ne__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___ne__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = (bool)((swig::SwigPyIterator const *)arg1)->operator !=((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___iadd__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___iadd__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___iadd__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *) &(arg1)->operator +=(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___isub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___isub__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___isub__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *) &(arg1)->operator -=(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___add__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___add__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___add__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator +(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___sub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator -(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ptrdiff_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___sub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = ((swig::SwigPyIterator const *)arg1)->operator -((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_swig__SwigPyIterator, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_SwigPyIterator___sub____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator___sub____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *SwigPyIterator_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_swig__SwigPyIterator, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *SHARED_PTR_DISOWN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "SHARED_PTR_DISOWN",SWIG_From_int(static_cast< int >(0)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_iterator" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_double_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___nonzero__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)std_vector_Sl_double_Sg____nonzero__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___bool__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)std_vector_Sl_double_Sg____bool__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___len__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = std_vector_Sl_double_Sg____len__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___getslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___getslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___getslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    std_vector_Sl_double_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  std::vector< double,std::allocator< double > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble1d_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vdouble1d_t___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble1d_t___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_double_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vdouble1d_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type)\n"
+    "    std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___delslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___delslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___delslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    std_vector_Sl_double_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___delitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  try {
+    std_vector_Sl_double_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___getitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble1d_t___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble1d_t___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_double_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__delitem__(std::vector< double >::difference_type)\n"
+    "    std::vector< double >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___getitem__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___getitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  try {
+    result = (std::vector< double >::value_type *) &std_vector_Sl_double_Sg____getitem____SWIG_1((std::vector< double > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__getitem__(PySliceObject *)\n"
+    "    std::vector< double >::__getitem__(std::vector< double >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___setitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___setitem__" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_2(arg1,arg2,(double const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble1d_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__setitem__(PySliceObject *,std::vector< double,std::allocator< double > > const &)\n"
+    "    std::vector< double >::__setitem__(PySliceObject *)\n"
+    "    std::vector< double >::__setitem__(std::vector< double >::difference_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_pop" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  try {
+    result = (std::vector< double >::value_type)std_vector_Sl_double_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_append" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_append" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_double_Sg__append(arg1,(double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vdouble1d_t")) SWIG_fail;
+  result = (std::vector< double > *)new std::vector< double >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble1d_t",&obj0)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< double > *)new std::vector< double >((std::vector< double > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_empty" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)((std::vector< double > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_size" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_swap" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble1d_t_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble1d_t_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_begin" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_end" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_rbegin" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_rend" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_clear" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_get_allocator" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< double >::allocator_type(static_cast< const std::vector< double >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble1d_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  result = (std::vector< double > *)new std::vector< double >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_pop_back" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vdouble1d_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vdouble1d_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::erase(std::vector< double >::iterator)\n"
+    "    std::vector< double >::erase(std::vector< double >::iterator,std::vector< double >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double >::size_type arg1 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vdouble1d_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vdouble1d_t" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< double > *)new std::vector< double >(arg1,(std::vector< double >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vdouble1d_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vdouble1d_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vdouble1d_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vdouble1d_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vdouble1d_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::vector()\n"
+    "    std::vector< double >::vector(std::vector< double > const &)\n"
+    "    std::vector< double >::vector(std::vector< double >::size_type)\n"
+    "    std::vector< double >::vector(std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_push_back" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_push_back" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< double >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_front" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->front();
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_back" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->back();
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_assign" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_assign" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_assign" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< double >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_resize" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< double >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::resize(std::vector< double >::size_type)\n"
+    "    std::vector< double >::resize(std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_insert" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_double_Sg__insert__SWIG_0(arg1,arg2,(double const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::size_type arg3 ;
+  std::vector< double >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< double >::value_type temp4 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble1d_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_insert" "', argument " "3"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::size_type >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vdouble1d_t_insert" "', argument " "4"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< double >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_double_Sg__insert__SWIG_1(arg1,arg2,arg3,(double const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vdouble1d_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::value_type const &)\n"
+    "    std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_reserve" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_reserve" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_capacity" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vdouble1d_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vdouble1d_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vdouble1d_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_iterator" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___nonzero__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___bool__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___len__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___getslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___getslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___getslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble2d_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vdouble2d_t___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble2d_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vdouble2d_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type)\n"
+    "    std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___delslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___delslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___delslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___delitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__delitem__(std::vector< std::vector< double > >::difference_type)\n"
+    "    std::vector< std::vector< double > >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___getitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  try {
+    result = (std::vector< std::vector< double > >::value_type *) &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::vector< double > > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::vector< double > >::__getitem__(std::vector< std::vector< double > >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___setitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__setitem__(PySliceObject *,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n"
+    "    std::vector< std::vector< double > >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::vector< double > >::__setitem__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_pop" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  try {
+    result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_append" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble2d_t_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vdouble2d_t")) SWIG_fail;
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double,std::allocator< double > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble2d_t",&obj0)) SWIG_fail;
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >((std::vector< std::vector< double,std::allocator< double > > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_empty" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)((std::vector< std::vector< double > > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_size" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_swap" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble2d_t_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > > > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_begin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_end" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_rbegin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_rend" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_clear" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< std::vector< double,std::allocator< double > > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_get_allocator" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::vector< double > >::allocator_type(static_cast< const std::vector< std::vector< double > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble2d_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_pop_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vdouble2d_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vdouble2d_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator)\n"
+    "    std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > >::size_type arg1 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vdouble2d_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_vdouble2d_t" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vdouble2d_t" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1,(std::vector< std::vector< double > >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vdouble2d_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vdouble2d_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vdouble2d_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_vdouble2d_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vdouble2d_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::vector()\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double,std::allocator< double > > > const &)\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type)\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_push_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble2d_t_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->push_back((std::vector< std::vector< double > >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_front" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->front();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->back();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_assign" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_assign" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type)\n"
+    "    std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::size_type arg3 ;
+  std::vector< std::vector< double > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble2d_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::size_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vdouble2d_t_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vdouble2d_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::value_type const &)\n"
+    "    std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_reserve" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_reserve" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_capacity" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vdouble2d_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vdouble2d_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vdouble2d_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_iterator" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_int_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___nonzero__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)std_vector_Sl_int_Sg____nonzero__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___bool__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)std_vector_Sl_int_Sg____bool__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___len__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = std_vector_Sl_int_Sg____len__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___getslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___getslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___getslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    std_vector_Sl_int_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  std::vector< int,std::allocator< int > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_integer_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_integer_t___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_integer_t___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_int_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< int,std::allocator< int > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< int,std::allocator< int > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_integer_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type)\n"
+    "    std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type,std::vector< int,std::allocator< int > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___delslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___delslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___delslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    std_vector_Sl_int_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___delitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  try {
+    std_vector_Sl_int_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___getitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< int,std::allocator< int > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_integer_t___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_integer_t___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< int,std::allocator< int > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_int_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__delitem__(std::vector< int >::difference_type)\n"
+    "    std::vector< int >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___getitem__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___getitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  try {
+    result = (std::vector< int >::value_type *) &std_vector_Sl_int_Sg____getitem____SWIG_1((std::vector< int > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__getitem__(PySliceObject *)\n"
+    "    std::vector< int >::__getitem__(std::vector< int >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___setitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___setitem__" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_2(arg1,arg2,(int const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< int,std::allocator< int > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_integer_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__setitem__(PySliceObject *,std::vector< int,std::allocator< int > > const &)\n"
+    "    std::vector< int >::__setitem__(PySliceObject *)\n"
+    "    std::vector< int >::__setitem__(std::vector< int >::difference_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_pop" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  try {
+    result = (std::vector< int >::value_type)std_vector_Sl_int_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_append" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_append" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_int_Sg__append(arg1,(int const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_integer_t")) SWIG_fail;
+  result = (std::vector< int > *)new std::vector< int >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_integer_t",&obj0)) SWIG_fail;
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< int > *)new std::vector< int >((std::vector< int > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_empty" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)((std::vector< int > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_size" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_swap" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_integer_t_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_integer_t_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< int > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_begin" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_end" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_rbegin" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_rend" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_clear" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< int > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_get_allocator" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< int >::allocator_type(static_cast< const std::vector< int >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_int_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_integer_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  result = (std::vector< int > *)new std::vector< int >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_pop_back" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_integer_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_integer_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::erase(std::vector< int >::iterator)\n"
+    "    std::vector< int >::erase(std::vector< int >::iterator,std::vector< int >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int >::size_type arg1 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_integer_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vector_integer_t" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< int > *)new std::vector< int >(arg1,(std::vector< int >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_integer_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_integer_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_integer_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vector_integer_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_integer_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::vector()\n"
+    "    std::vector< int >::vector(std::vector< int > const &)\n"
+    "    std::vector< int >::vector(std::vector< int >::size_type)\n"
+    "    std::vector< int >::vector(std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_push_back" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_push_back" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< int >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_front" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->front();
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_back" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->back();
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_assign" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_assign" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_assign" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< int >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_resize" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< int >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::resize(std::vector< int >::size_type)\n"
+    "    std::vector< int >::resize(std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_insert" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_int_Sg__insert__SWIG_0(arg1,arg2,(int const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::size_type arg3 ;
+  std::vector< int >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< int >::value_type temp4 ;
+  int val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_integer_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_insert" "', argument " "3"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::size_type >(val3);
+  ecode4 = SWIG_AsVal_int(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vector_integer_t_insert" "', argument " "4"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< int >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_int_Sg__insert__SWIG_1(arg1,arg2,arg3,(int const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_int(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vector_integer_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::value_type const &)\n"
+    "    std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_reserve" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_reserve" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_capacity" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_integer_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_integer_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_integer_t" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_integer_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_iterator" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_unsigned_SS_long_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___nonzero__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (bool)std_vector_Sl_unsigned_SS_long_Sg____nonzero__((std::vector< unsigned long > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___bool__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (bool)std_vector_Sl_unsigned_SS_long_Sg____bool__((std::vector< unsigned long > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___len__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = std_vector_Sl_unsigned_SS_long_Sg____len__((std::vector< unsigned long > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___getslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___getslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___getslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  try {
+    result = (std::vector< unsigned long,std::allocator< unsigned long > > *)std_vector_Sl_unsigned_SS_long_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___setslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___setslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_longinteger_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___setslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___setslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  {
+    std::vector< unsigned long,std::allocator< unsigned long > > *ptr = (std::vector< unsigned long,std::allocator< unsigned long > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_longinteger_t___setslice__" "', argument " "4"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_longinteger_t___setslice__" "', argument " "4"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< unsigned long,std::allocator< unsigned long > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_longinteger_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__setslice__(std::vector< unsigned long >::difference_type,std::vector< unsigned long >::difference_type)\n"
+    "    std::vector< unsigned long >::__setslice__(std::vector< unsigned long >::difference_type,std::vector< unsigned long >::difference_type,std::vector< unsigned long,std::allocator< unsigned long > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___delslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___delslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___delslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___delitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___delitem__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___getitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< unsigned long,std::allocator< unsigned long > > *)std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< unsigned long,std::allocator< unsigned long > > *ptr = (std::vector< unsigned long,std::allocator< unsigned long > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_longinteger_t___setitem__" "', argument " "3"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_longinteger_t___setitem__" "', argument " "3"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< unsigned long,std::allocator< unsigned long > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___delitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__delitem__(std::vector< unsigned long >::difference_type)\n"
+    "    std::vector< unsigned long >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___getitem__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___getitem__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  try {
+    result = (std::vector< unsigned long >::value_type *) &std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_1((std::vector< unsigned long > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__getitem__(PySliceObject *)\n"
+    "    std::vector< unsigned long >::__getitem__(std::vector< unsigned long >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___setitem__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___setitem__" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_2(arg1,arg2,(unsigned long const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_longinteger_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_unsigned_SS_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__setitem__(PySliceObject *,std::vector< unsigned long,std::allocator< unsigned long > > const &)\n"
+    "    std::vector< unsigned long >::__setitem__(PySliceObject *)\n"
+    "    std::vector< unsigned long >::__setitem__(std::vector< unsigned long >::difference_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_pop" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  try {
+    result = (std::vector< unsigned long >::value_type)std_vector_Sl_unsigned_SS_long_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< unsigned long >::value_type temp2 ;
+  unsigned long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_append" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_append" "', argument " "2"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< unsigned long >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_unsigned_SS_long_Sg__append(arg1,(unsigned long const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_longinteger_t")) SWIG_fail;
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_longinteger_t",&obj0)) SWIG_fail;
+  {
+    std::vector< unsigned long,std::allocator< unsigned long > > *ptr = (std::vector< unsigned long,std::allocator< unsigned long > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >((std::vector< unsigned long > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_empty" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (bool)((std::vector< unsigned long > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_size" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = ((std::vector< unsigned long > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_swap" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_longinteger_t_swap" "', argument " "2"" of type '" "std::vector< unsigned long > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_longinteger_t_swap" "', argument " "2"" of type '" "std::vector< unsigned long > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< unsigned long > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_begin" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_end" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_rbegin" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_rend" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_clear" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< unsigned long > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_get_allocator" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = ((std::vector< unsigned long > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< unsigned long >::allocator_type(static_cast< const std::vector< unsigned long >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_unsigned_long_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_longinteger_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< unsigned long >::size_type >(val1);
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_pop_back" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_resize" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_resize" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_erase" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  std::vector< unsigned long >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_erase" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "3"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "3"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_longinteger_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_longinteger_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::erase(std::vector< unsigned long >::iterator)\n"
+    "    std::vector< unsigned long >::erase(std::vector< unsigned long >::iterator,std::vector< unsigned long >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long >::size_type arg1 ;
+  std::vector< unsigned long >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< unsigned long >::value_type temp2 ;
+  unsigned long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_longinteger_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< unsigned long >::size_type >(val1);
+  ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vector_longinteger_t" "', argument " "2"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< unsigned long >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >(arg1,(std::vector< unsigned long >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_longinteger_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_longinteger_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_longinteger_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_unsigned_SS_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vector_longinteger_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_longinteger_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::vector()\n"
+    "    std::vector< unsigned long >::vector(std::vector< unsigned long > const &)\n"
+    "    std::vector< unsigned long >::vector(std::vector< unsigned long >::size_type)\n"
+    "    std::vector< unsigned long >::vector(std::vector< unsigned long >::size_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< unsigned long >::value_type temp2 ;
+  unsigned long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_push_back" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_push_back" "', argument " "2"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< unsigned long >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< unsigned long >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_front" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (std::vector< unsigned long >::value_type *) &((std::vector< unsigned long > const *)arg1)->front();
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_back" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (std::vector< unsigned long >::value_type *) &((std::vector< unsigned long > const *)arg1)->back();
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_assign" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_assign" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_assign" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< unsigned long >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_resize" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_resize" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_resize" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< unsigned long >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_unsigned_SS_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::resize(std::vector< unsigned long >::size_type)\n"
+    "    std::vector< unsigned long >::resize(std::vector< unsigned long >::size_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_insert" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_insert" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_0(arg1,arg2,(unsigned long const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  std::vector< unsigned long >::size_type arg3 ;
+  std::vector< unsigned long >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< unsigned long >::value_type temp4 ;
+  unsigned long val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_longinteger_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_insert" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_insert" "', argument " "3"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::size_type >(val3);
+  ecode4 = SWIG_AsVal_unsigned_SS_long(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vector_longinteger_t_insert" "', argument " "4"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< unsigned long >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_1(arg1,arg2,arg3,(unsigned long const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_unsigned_SS_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_unsigned_SS_long(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vector_longinteger_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::insert(std::vector< unsigned long >::iterator,std::vector< unsigned long >::value_type const &)\n"
+    "    std::vector< unsigned long >::insert(std::vector< unsigned long >::iterator,std::vector< unsigned long >::size_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_reserve" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_reserve" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_capacity" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = ((std::vector< unsigned long > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_longinteger_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_longinteger_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_longinteger_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_iterator" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_complex_Sl_double_Sg__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___nonzero__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_complex_Sl_double_Sg__Sg____nonzero__((std::vector< std::complex< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___bool__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_complex_Sl_double_Sg__Sg____bool__((std::vector< std::complex< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___len__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg____len__((std::vector< std::complex< double > > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___getslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___getslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___getslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  try {
+    result = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)std_vector_Sl_std_complex_Sl_double_Sg__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___setslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___setslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_complex_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___setslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___setslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  {
+    std::vector< std::complex< double >,std::allocator< std::complex< double > > > *ptr = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_complex_t___setslice__" "', argument " "4"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_complex_t___setslice__" "', argument " "4"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_complex_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__setslice__(std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double > >::difference_type)\n"
+    "    std::vector< std::complex< double > >::__setslice__(std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___delslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___delslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___delslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___delitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___delitem__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___getitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< std::complex< double >,std::allocator< std::complex< double > > > *ptr = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_complex_t___setitem__" "', argument " "3"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_complex_t___setitem__" "', argument " "3"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___delitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__delitem__(std::vector< std::complex< double > >::difference_type)\n"
+    "    std::vector< std::complex< double > >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___getitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___getitem__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  try {
+    result = (std::vector< std::complex< double > >::value_type *) &std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::complex< double > > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::complex< double > >::__getitem__(std::vector< std::complex< double > >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___setitem__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___setitem__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_2(arg1,arg2,(std::complex< double > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_complex_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__setitem__(PySliceObject *,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)\n"
+    "    std::vector< std::complex< double > >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::complex< double > >::__setitem__(std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_pop" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  try {
+    result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::complex< double > >::value_type temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_append" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_append" "', argument " "2"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< std::complex< double > >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_std_complex_Sl_double_Sg__Sg__append(arg1,(std::complex< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_complex_t")) SWIG_fail;
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_complex_t",&obj0)) SWIG_fail;
+  {
+    std::vector< std::complex< double >,std::allocator< std::complex< double > > > *ptr = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >((std::vector< std::complex< double > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_empty" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (bool)((std::vector< std::complex< double > > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_size" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = ((std::vector< std::complex< double > > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_swap" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_complex_t_swap" "', argument " "2"" of type '" "std::vector< std::complex< double > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_complex_t_swap" "', argument " "2"" of type '" "std::vector< std::complex< double > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::complex< double > > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_begin" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_end" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_rbegin" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_rend" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_clear" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< std::complex< double > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_get_allocator" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = ((std::vector< std::complex< double > > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::complex< double > >::allocator_type(static_cast< const std::vector< std::complex< double > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_complex_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::complex< double > >::size_type >(val1);
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_pop_back" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_resize" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_resize" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_erase" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  std::vector< std::complex< double > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_erase" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "3"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "3"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_complex_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_complex_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::erase(std::vector< std::complex< double > >::iterator)\n"
+    "    std::vector< std::complex< double > >::erase(std::vector< std::complex< double > >::iterator,std::vector< std::complex< double > >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > >::size_type arg1 ;
+  std::vector< std::complex< double > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< std::complex< double > >::value_type temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_complex_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::complex< double > >::size_type >(val1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vector_complex_t" "', argument " "2"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< std::complex< double > >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >(arg1,(std::vector< std::complex< double > >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_complex_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_complex_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_complex_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vector_complex_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_complex_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::vector()\n"
+    "    std::vector< std::complex< double > >::vector(std::vector< std::complex< double > > const &)\n"
+    "    std::vector< std::complex< double > >::vector(std::vector< std::complex< double > >::size_type)\n"
+    "    std::vector< std::complex< double > >::vector(std::vector< std::complex< double > >::size_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::complex< double > >::value_type temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_push_back" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_push_back" "', argument " "2"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< std::complex< double > >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< std::complex< double > >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_front" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (std::vector< std::complex< double > >::value_type *) &((std::vector< std::complex< double > > const *)arg1)->front();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_back" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (std::vector< std::complex< double > >::value_type *) &((std::vector< std::complex< double > > const *)arg1)->back();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_assign" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_assign" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_assign" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< std::complex< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_resize" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_resize" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_resize" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< std::complex< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::resize(std::vector< std::complex< double > >::size_type)\n"
+    "    std::vector< std::complex< double > >::resize(std::vector< std::complex< double > >::size_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_insert" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_insert" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_0(arg1,arg2,(std::complex< double > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  std::vector< std::complex< double > >::size_type arg3 ;
+  std::vector< std::complex< double > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< std::complex< double > >::value_type temp4 ;
+  std::complex< double > val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_complex_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_insert" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_insert" "', argument " "3"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::size_type >(val3);
+  ecode4 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vector_complex_t_insert" "', argument " "4"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< std::complex< double > >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_1(arg1,arg2,arg3,(std::complex< double > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vector_complex_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::insert(std::vector< std::complex< double > >::iterator,std::vector< std::complex< double > >::value_type const &)\n"
+    "    std::vector< std::complex< double > >::insert(std::vector< std::complex< double > >::iterator,std::vector< std::complex< double > >::size_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_reserve" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_reserve" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_capacity" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = ((std::vector< std::complex< double > > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_complex_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_complex_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_complex_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_string_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_iterator" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_string_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___nonzero__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)std_vector_Sl_std_string_Sg____nonzero__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___bool__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)std_vector_Sl_std_string_Sg____bool__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___len__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = std_vector_Sl_std_string_Sg____len__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___getslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___getslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___getslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_string_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  std::vector< std::string,std::allocator< std::string > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_string_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_string_t___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::string,std::allocator< std::string > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_string_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::string,std::allocator< std::string > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_string_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type)\n"
+    "    std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type,std::vector< std::string,std::allocator< std::string > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___delslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___delslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___delslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_string_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___delitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_string_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___getitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::string,std::allocator< std::string > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::string,std::allocator< std::string > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__delitem__(std::vector< std::string >::difference_type)\n"
+    "    std::vector< std::string >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___getitem__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___getitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  try {
+    result = (std::vector< std::string >::value_type *) &std_vector_Sl_std_string_Sg____getitem____SWIG_1((std::vector< std::string > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::string >::__getitem__(std::vector< std::string >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___setitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_2(arg1,arg2,(std::string const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::string,std::allocator< std::string > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__setitem__(PySliceObject *,std::vector< std::string,std::allocator< std::string > > const &)\n"
+    "    std::vector< std::string >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::string >::__setitem__(std::vector< std::string >::difference_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_pop" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  try {
+    result = std_vector_Sl_std_string_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_append" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_string_t_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  std_vector_Sl_std_string_Sg__append(arg1,(std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_string_t")) SWIG_fail;
+  result = (std::vector< std::string > *)new std::vector< std::string >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_string_t",&obj0)) SWIG_fail;
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >((std::vector< std::string > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_empty" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)((std::vector< std::string > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_size" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_swap" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_string_t_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::string > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_begin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_end" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_rbegin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_rend" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_clear" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< std::string > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_get_allocator" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::string >::allocator_type(static_cast< const std::vector< std::string >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__string_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_string_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_pop_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_string_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_string_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::erase(std::vector< std::string >::iterator)\n"
+    "    std::vector< std::string >::erase(std::vector< std::string >::iterator,std::vector< std::string >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string >::size_type arg1 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_string_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_vector_string_t" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_string_t" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1,(std::vector< std::string >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_string_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_string_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_string_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_vector_string_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_string_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::vector()\n"
+    "    std::vector< std::string >::vector(std::vector< std::string > const &)\n"
+    "    std::vector< std::string >::vector(std::vector< std::string >::size_type)\n"
+    "    std::vector< std::string >::vector(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_push_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_string_t_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->push_back((std::vector< std::string >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_front" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->front();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_back" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->back();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_assign" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_assign" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_string_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::resize(std::vector< std::string >::size_type)\n"
+    "    std::vector< std::string >::resize(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_string_Sg__insert__SWIG_0(arg1,arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::size_type arg3 ;
+  std::vector< std::string >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_string_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t_insert" "', argument " "3"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::size_type >(val3);
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_string_t_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_string_Sg__insert__SWIG_1(arg1,arg2,arg3,(std::string const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_string_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::value_type const &)\n"
+    "    std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_reserve" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_reserve" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_capacity" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_string_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_string_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_string_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN int Swig_var_major_version_number_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable major_version_number is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_major_version_number_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_int(static_cast< int >(BornAgain::major_version_number));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_minor_version_number_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable minor_version_number is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_minor_version_number_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_int(static_cast< int >(BornAgain::minor_version_number));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_patch_version_number_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable patch_version_number is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_patch_version_number_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_int(static_cast< int >(BornAgain::patch_version_number));
+  return pyobj;
+}
+
+
+SWIGINTERN PyObject *_wrap_GetMajorVersionNumber(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":GetMajorVersionNumber")) SWIG_fail;
+  result = (int)BornAgain::GetMajorVersionNumber();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GetMinorVersionNumber(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":GetMinorVersionNumber")) SWIG_fail;
+  result = (int)BornAgain::GetMinorVersionNumber();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GetPatchVersionNumber(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":GetPatchVersionNumber")) SWIG_fail;
+  result = (int)BornAgain::GetPatchVersionNumber();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":GetName")) SWIG_fail;
+  result = BornAgain::GetName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GetVersionNumber(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":GetVersionNumber")) SWIG_fail;
+  result = BornAgain::GetVersionNumber();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int Swig_var_PI2_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable PI2 is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_PI2_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(PI2));
+  return pyobj;
+}
+
+
+SWIGINTERN PyObject *_wrap_vecOfLambdaAlphaPhi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vecOfLambdaAlphaPhi",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "vecOfLambdaAlphaPhi" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vecOfLambdaAlphaPhi" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vecOfLambdaAlphaPhi" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = vecOfLambdaAlphaPhi(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_INoncopyable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  INoncopyable *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_INoncopyable")) SWIG_fail;
+  result = (INoncopyable *)new INoncopyable();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_INoncopyable, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_INoncopyable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  INoncopyable *arg1 = (INoncopyable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_INoncopyable",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_INoncopyable, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_INoncopyable" "', argument " "1"" of type '" "INoncopyable *""'"); 
+  }
+  arg1 = reinterpret_cast< INoncopyable * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *INoncopyable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_INoncopyable, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_ICloneable_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICloneable *arg1 = (ICloneable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ICloneable *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ICloneable_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICloneable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICloneable_clone" "', argument " "1"" of type '" "ICloneable const *""'"); 
+  }
+  arg1 = reinterpret_cast< ICloneable * >(argp1);
+  result = (ICloneable *)((ICloneable const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ICloneable, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ICloneable_transferToCPP(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICloneable *arg1 = (ICloneable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ICloneable_transferToCPP",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICloneable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICloneable_transferToCPP" "', argument " "1"" of type '" "ICloneable *""'"); 
+  }
+  arg1 = reinterpret_cast< ICloneable * >(argp1);
+  (arg1)->transferToCPP();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ICloneable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICloneable *arg1 = (ICloneable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ICloneable",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICloneable, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ICloneable" "', argument " "1"" of type '" "ICloneable *""'"); 
+  }
+  arg1 = reinterpret_cast< ICloneable * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ICloneable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ICloneable, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_INamed__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyObject * obj0 = 0 ;
+  INamed *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_INamed",&obj0)) SWIG_fail;
+  arg1 = obj0;
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (INamed *)new SwigDirector_INamed(arg1); 
+  } else {
+    result = (INamed *)new INamed(); 
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_INamed, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_INamed__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  std::string *arg2 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  INamed *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_INamed",&obj0,&obj1)) SWIG_fail;
+  arg1 = obj0;
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_INamed" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_INamed" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (INamed *)new SwigDirector_INamed(arg1,(std::string const &)*arg2); 
+  } else {
+    result = (INamed *)new INamed((std::string const &)*arg2); 
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_INamed, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_INamed(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      return _wrap_new_INamed__SWIG_0(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_INamed__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_INamed'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    INamed::INamed()\n"
+    "    INamed::INamed(PyObject *,std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_INamed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  INamed *arg1 = (INamed *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_INamed",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_INamed, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_INamed" "', argument " "1"" of type '" "INamed *""'"); 
+  }
+  arg1 = reinterpret_cast< INamed * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_INamed_getName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  INamed *arg1 = (INamed *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:INamed_getName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_INamed, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INamed_getName" "', argument " "1"" of type '" "INamed const *""'"); 
+  }
+  arg1 = reinterpret_cast< INamed * >(argp1);
+  result = ((INamed const *)arg1)->getName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_INamed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  INamed *arg1 = (INamed *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_INamed",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_INamed, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_INamed" "', argument " "1"" of type '" "INamed *""'"); 
+  }
+  arg1 = reinterpret_cast< INamed * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *INamed_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_INamed, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IParameterized__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  std::string *arg2 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IParameterized *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IParameterized",&obj0,&obj1)) SWIG_fail;
+  arg1 = obj0;
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IParameterized" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IParameterized" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IParameterized *)new SwigDirector_IParameterized(arg1,(std::string const &)*arg2); 
+  } else {
+    result = (IParameterized *)new IParameterized((std::string const &)*arg2); 
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParameterized, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IParameterized__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyObject * obj0 = 0 ;
+  IParameterized *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IParameterized",&obj0)) SWIG_fail;
+  arg1 = obj0;
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IParameterized *)new SwigDirector_IParameterized(arg1); 
+  } else {
+    result = (IParameterized *)new IParameterized(); 
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParameterized, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IParameterized__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  IParameterized *arg2 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IParameterized *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IParameterized",&obj0,&obj1)) SWIG_fail;
+  arg1 = obj0;
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParameterized,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IParameterized" "', argument " "2"" of type '" "IParameterized const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IParameterized" "', argument " "2"" of type '" "IParameterized const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParameterized * >(argp2);
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IParameterized *)new SwigDirector_IParameterized(arg1,(IParameterized const &)*arg2); 
+  } else {
+    result = (IParameterized *)new IParameterized((IParameterized const &)*arg2); 
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParameterized, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IParameterized(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      return _wrap_new_IParameterized__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParameterized, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_IParameterized__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    _v = (argv[0] != 0);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_IParameterized__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IParameterized'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IParameterized::IParameterized(std::string const &)\n"
+    "    IParameterized::IParameterized()\n"
+    "    IParameterized::IParameterized(PyObject *,IParameterized const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IParameterized(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IParameterized",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IParameterized" "', argument " "1"" of type '" "IParameterized *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized_getParameterPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParameterPool *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParameterized_getParameterPool",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized_getParameterPool" "', argument " "1"" of type '" "IParameterized const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  result = (ParameterPool *)((IParameterized const *)arg1)->getParameterPool();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized_createParameterTree(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParameterPool *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParameterized_createParameterTree",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized_createParameterTree" "', argument " "1"" of type '" "IParameterized *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  result = (ParameterPool *)(arg1)->createParameterTree();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized_printParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParameterized_printParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized_printParameters" "', argument " "1"" of type '" "IParameterized *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  (arg1)->printParameters();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized_registerParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  std::string *arg2 = 0 ;
+  double *arg3 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IParameterized_registerParameter",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized_registerParameter" "', argument " "1"" of type '" "IParameterized *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterized_registerParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterized_registerParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IParameterized_registerParameter" "', argument " "3"" of type '" "double *""'"); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  result = (RealParameter *) &(arg1)->registerParameter((std::string const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized_setParameterValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IParameterized_setParameterValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized_setParameterValue" "', argument " "1"" of type '" "IParameterized *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterized_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterized_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IParameterized_setParameterValue" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setParameterValue((std::string const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized_getParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParameterized_getParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized_getParameter" "', argument " "1"" of type '" "IParameterized const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterized_getParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterized_getParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (RealParameter *)((IParameterized const *)arg1)->getParameter((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized_onChange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IParameterized *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParameterized_onChange",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized_onChange" "', argument " "1"" of type '" "IParameterized *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("onChange"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member onChange");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IParameterized *>(arg1);
+    if (upcall) {
+      (darg)->onChangeSwigPublic();
+    } else {
+      (darg)->onChange();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterized__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  std::ostream *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IParameterized *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParameterized__print",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterized__print" "', argument " "1"" of type '" "IParameterized const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__ostream,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterized__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterized__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  arg2 = reinterpret_cast< std::ostream * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("print"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member print");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IParameterized *>(arg1);
+    if (upcall) {
+      ((SwigDirector_IParameterized const *)darg)->printSwigPublic(*arg2);
+    } else {
+      ((SwigDirector_IParameterized const *)darg)->print(*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_IParameterized(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameterized *arg1 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_IParameterized",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IParameterized" "', argument " "1"" of type '" "IParameterized *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameterized * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IParameterized_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IParameterized, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_kvector_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_kvector_t")) SWIG_fail;
+  result = (BasicVector3D< double > *)new BasicVector3D< double >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_kvector_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  BasicVector3D< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_kvector_t",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_kvector_t" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_kvector_t" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_kvector_t" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (BasicVector3D< double > *)new BasicVector3D< double >(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_kvector_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_kvector_t__SWIG_0(self, args);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_kvector_t__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_kvector_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    BasicVector3D< double >::BasicVector3D()\n"
+    "    BasicVector3D< double >::BasicVector3D(double const,double const,double const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_x(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_x",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_x" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->x();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_y(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_y",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_y" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->y();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_z(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_z",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_z" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->z();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_setX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  double *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t_setX",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_setX" "', argument " "1"" of type '" "BasicVector3D< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "kvector_t_setX" "', argument " "2"" of type '" "double""'");
+  } 
+  temp2 = static_cast< double >(val2);
+  arg2 = &temp2;
+  (arg1)->setX((double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_setY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  double *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t_setY",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_setY" "', argument " "1"" of type '" "BasicVector3D< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "kvector_t_setY" "', argument " "2"" of type '" "double""'");
+  } 
+  temp2 = static_cast< double >(val2);
+  arg2 = &temp2;
+  (arg1)->setY((double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_setZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  double *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t_setZ",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_setZ" "', argument " "1"" of type '" "BasicVector3D< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "kvector_t_setZ" "', argument " "2"" of type '" "double""'");
+  } 
+  temp2 = static_cast< double >(val2);
+  arg2 = &temp2;
+  (arg1)->setZ((double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_setXYZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  double *arg2 = 0 ;
+  double *arg3 = 0 ;
+  double *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double temp4 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:kvector_t_setXYZ",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_setXYZ" "', argument " "1"" of type '" "BasicVector3D< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "kvector_t_setXYZ" "', argument " "2"" of type '" "double""'");
+  } 
+  temp2 = static_cast< double >(val2);
+  arg2 = &temp2;
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "kvector_t_setXYZ" "', argument " "3"" of type '" "double""'");
+  } 
+  temp3 = static_cast< double >(val3);
+  arg3 = &temp3;
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "kvector_t_setXYZ" "', argument " "4"" of type '" "double""'");
+  } 
+  temp4 = static_cast< double >(val4);
+  arg4 = &temp4;
+  (arg1)->setXYZ((double const &)*arg2,(double const &)*arg3,(double const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  BasicVector3D< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t___iadd__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t___iadd__" "', argument " "1"" of type '" "BasicVector3D< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "kvector_t___iadd__" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "kvector_t___iadd__" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< double > * >(argp2);
+  result = (BasicVector3D< double > *) &(arg1)->operator +=((BasicVector3D< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  BasicVector3D< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t___isub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t___isub__" "', argument " "1"" of type '" "BasicVector3D< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "kvector_t___isub__" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "kvector_t___isub__" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< double > * >(argp2);
+  result = (BasicVector3D< double > *) &(arg1)->operator -=((BasicVector3D< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_conj(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_conj",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_conj" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = ((BasicVector3D< double > const *)arg1)->conj();
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_mag2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_mag2",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_mag2" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->mag2();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_mag(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_mag",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_mag" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->mag();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_magxy2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_magxy2",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_magxy2" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->magxy2();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_magxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_magxy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_magxy" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->magxy();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_phi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_phi",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_phi" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->phi();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_theta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_theta" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->theta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_cosTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_cosTheta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_cosTheta" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->cosTheta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_sin2Theta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_sin2Theta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_sin2Theta" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = (double)((BasicVector3D< double > const *)arg1)->sin2Theta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_unit",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_unit" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = ((BasicVector3D< double > const *)arg1)->unit();
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_complex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< std::complex< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_complex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_complex" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = ((BasicVector3D< double > const *)arg1)->complex();
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< std::complex< double > >(static_cast< const BasicVector3D< std::complex< double > >& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_real(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t_real",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_real" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = ((BasicVector3D< double > const *)arg1)->real();
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_angle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  BasicVector3D< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t_angle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_angle" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "kvector_t_angle" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "kvector_t_angle" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< double > * >(argp2);
+  result = (double)((BasicVector3D< double > const *)arg1)->angle((BasicVector3D< double > const &)*arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t_project(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  BasicVector3D< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t_project",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t_project" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "kvector_t_project" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "kvector_t_project" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< double > * >(argp2);
+  result = ((BasicVector3D< double > const *)arg1)->project((BasicVector3D< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  BasicVector3D< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t___add__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t___add__" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "kvector_t___add__" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "kvector_t___add__" "', argument " "2"" of type '" "BasicVector3D< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< double > * >(argp2);
+  result = BasicVector3D_Sl_double_Sg____add__((BasicVector3D< double > const *)arg1,(BasicVector3D< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t___mul__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t___mul__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t___mul__" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "kvector_t___mul__" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = BasicVector3D_Sl_double_Sg____mul__((BasicVector3D< double > const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t___rmul__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:kvector_t___rmul__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t___rmul__" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "kvector_t___rmul__" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = BasicVector3D_Sl_double_Sg____rmul__((BasicVector3D< double > const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_kvector_t___neg__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:kvector_t___neg__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "kvector_t___neg__" "', argument " "1"" of type '" "BasicVector3D< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  result = BasicVector3D_Sl_double_Sg____neg__((BasicVector3D< double > const *)arg1);
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_kvector_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< double > *arg1 = (BasicVector3D< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_kvector_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_kvector_t" "', argument " "1"" of type '" "BasicVector3D< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< double > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *kvector_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_BasicVector3DT_double_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_iterator" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___nonzero__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (bool)std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____nonzero__((std::vector< BasicVector3D< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___bool__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (bool)std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____bool__((std::vector< BasicVector3D< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___len__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____len__((std::vector< BasicVector3D< double > > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::difference_type arg2 ;
+  std::vector< BasicVector3D< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___getslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t___getslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_kvector_t___getslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val3);
+  try {
+    result = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::difference_type arg2 ;
+  std::vector< BasicVector3D< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___setslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t___setslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_kvector_t___setslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::difference_type arg2 ;
+  std::vector< BasicVector3D< double > >::difference_type arg3 ;
+  std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_kvector_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___setslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t___setslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_kvector_t___setslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val3);
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_kvector_t___setslice__" "', argument " "4"" of type '" "std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t___setslice__" "', argument " "4"" of type '" "std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_kvector_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_kvector_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_kvector_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::__setslice__(std::vector< BasicVector3D< double > >::difference_type,std::vector< BasicVector3D< double > >::difference_type)\n"
+    "    std::vector< BasicVector3D< double > >::__setslice__(std::vector< BasicVector3D< double > >::difference_type,std::vector< BasicVector3D< double > >::difference_type,std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::difference_type arg2 ;
+  std::vector< BasicVector3D< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___delslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t___delslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_kvector_t___delslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___delitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t___delitem__" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val2);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___getitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___setitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_kvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___setitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___delitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_kvector_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_kvector_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_kvector_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::__delitem__(std::vector< BasicVector3D< double > >::difference_type)\n"
+    "    std::vector< BasicVector3D< double > >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___getitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t___getitem__" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val2);
+  try {
+    result = (std::vector< BasicVector3D< double > >::value_type *) &std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< BasicVector3D< double > > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_kvector_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_kvector_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_kvector_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::__getitem__(PySliceObject *)\n"
+    "    std::vector< BasicVector3D< double > >::__getitem__(std::vector< BasicVector3D< double > >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::difference_type arg2 ;
+  std::vector< BasicVector3D< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t___setitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t___setitem__" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::difference_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_kvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp3);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg____setitem____SWIG_2(arg1,arg2,(BasicVector3D< double > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_kvector_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_kvector_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_kvector_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_kvector_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::__setitem__(PySliceObject *,std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &)\n"
+    "    std::vector< BasicVector3D< double > >::__setitem__(PySliceObject *)\n"
+    "    std::vector< BasicVector3D< double > >::__setitem__(std::vector< BasicVector3D< double > >::difference_type,std::vector< BasicVector3D< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_pop" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  try {
+    result = std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj((new std::vector< BasicVector3D< double > >::value_type(static_cast< const std::vector< BasicVector3D< double > >::value_type& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_append" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_kvector_t_append" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t_append" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp2);
+  std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__append(arg1,(BasicVector3D< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_kvector_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_kvector_t")) SWIG_fail;
+  result = (std::vector< BasicVector3D< double > > *)new std::vector< BasicVector3D< double > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_kvector_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_kvector_t",&obj0)) SWIG_fail;
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_kvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_kvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< BasicVector3D< double > > *)new std::vector< BasicVector3D< double > >((std::vector< BasicVector3D< double > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_empty" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (bool)((std::vector< BasicVector3D< double > > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_size" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = ((std::vector< BasicVector3D< double > > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_swap" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_kvector_t_swap" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t_swap" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_begin" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_end" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_rbegin" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_rend" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_clear" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< BasicVector3D< double > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_get_allocator" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = ((std::vector< BasicVector3D< double > > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< BasicVector3D< double > >::allocator_type(static_cast< const std::vector< BasicVector3D< double > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_BasicVector3DT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_kvector_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_kvector_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_kvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< BasicVector3D< double > >::size_type >(val1);
+  result = (std::vector< BasicVector3D< double > > *)new std::vector< BasicVector3D< double > >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_pop_back" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_resize" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t_resize" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_erase" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::iterator arg2 ;
+  std::vector< BasicVector3D< double > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< BasicVector3D< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_erase" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_erase" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_erase" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_kvector_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_kvector_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_kvector_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::erase(std::vector< BasicVector3D< double > >::iterator)\n"
+    "    std::vector< BasicVector3D< double > >::erase(std::vector< BasicVector3D< double > >::iterator,std::vector< BasicVector3D< double > >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_kvector_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > >::size_type arg1 ;
+  std::vector< BasicVector3D< double > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_kvector_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_kvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< BasicVector3D< double > >::size_type >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_vector_kvector_t" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_kvector_t" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp2);
+  result = (std::vector< BasicVector3D< double > > *)new std::vector< BasicVector3D< double > >(arg1,(std::vector< BasicVector3D< double > >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_kvector_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_kvector_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_kvector_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_kvector_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_vector_kvector_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_kvector_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::vector()\n"
+    "    std::vector< BasicVector3D< double > >::vector(std::vector< BasicVector3D< double > > const &)\n"
+    "    std::vector< BasicVector3D< double > >::vector(std::vector< BasicVector3D< double > >::size_type)\n"
+    "    std::vector< BasicVector3D< double > >::vector(std::vector< BasicVector3D< double > >::size_type,std::vector< BasicVector3D< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_push_back" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_kvector_t_push_back" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t_push_back" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp2);
+  (arg1)->push_back((std::vector< BasicVector3D< double > >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_front" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (std::vector< BasicVector3D< double > >::value_type *) &((std::vector< BasicVector3D< double > > const *)arg1)->front();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_back" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = (std::vector< BasicVector3D< double > >::value_type *) &((std::vector< BasicVector3D< double > > const *)arg1)->back();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::size_type arg2 ;
+  std::vector< BasicVector3D< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_assign" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t_assign" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_kvector_t_assign" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t_assign" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp3);
+  (arg1)->assign(arg2,(std::vector< BasicVector3D< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::size_type arg2 ;
+  std::vector< BasicVector3D< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_resize" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t_resize" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_kvector_t_resize" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t_resize" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp3);
+  (arg1)->resize(arg2,(std::vector< BasicVector3D< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_kvector_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_kvector_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_kvector_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::resize(std::vector< BasicVector3D< double > >::size_type)\n"
+    "    std::vector< BasicVector3D< double > >::resize(std::vector< BasicVector3D< double > >::size_type,std::vector< BasicVector3D< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::iterator arg2 ;
+  std::vector< BasicVector3D< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< BasicVector3D< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_kvector_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_insert" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_kvector_t_insert" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t_insert" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp3);
+  result = std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__insert__SWIG_0(arg1,arg2,(BasicVector3D< double > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::iterator arg2 ;
+  std::vector< BasicVector3D< double > >::size_type arg3 ;
+  std::vector< BasicVector3D< double > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_kvector_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_insert" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_kvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_kvector_t_insert" "', argument " "3"" of type '" "std::vector< BasicVector3D< double > >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< double > >::size_type >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_kvector_t_insert" "', argument " "4"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_kvector_t_insert" "', argument " "4"" of type '" "std::vector< BasicVector3D< double > >::value_type const &""'"); 
+  }
+  arg4 = reinterpret_cast< std::vector< BasicVector3D< double > >::value_type * >(argp4);
+  std_vector_Sl_BasicVector3D_Sl_double_Sg__Sg__insert__SWIG_1(arg1,arg2,arg3,(BasicVector3D< double > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_kvector_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_kvector_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_kvector_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< double > >::insert(std::vector< BasicVector3D< double > >::iterator,std::vector< BasicVector3D< double > >::value_type const &)\n"
+    "    std::vector< BasicVector3D< double > >::insert(std::vector< BasicVector3D< double > >::iterator,std::vector< BasicVector3D< double > >::size_type,std::vector< BasicVector3D< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  std::vector< BasicVector3D< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_kvector_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_reserve" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_kvector_t_reserve" "', argument " "2"" of type '" "std::vector< BasicVector3D< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< double > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_kvector_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_kvector_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_kvector_t_capacity" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  result = ((std::vector< BasicVector3D< double > > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_kvector_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< double > > *arg1 = (std::vector< BasicVector3D< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_kvector_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_kvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< double > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_kvector_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_cvector_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_cvector_t")) SWIG_fail;
+  result = (BasicVector3D< std::complex< double > > *)new BasicVector3D< std::complex< double > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_cvector_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::complex< double > arg1 ;
+  std::complex< double > arg2 ;
+  std::complex< double > arg3 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  BasicVector3D< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_cvector_t",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_cvector_t" "', argument " "1"" of type '" "std::complex< double >""'");
+  } 
+  arg1 = static_cast< std::complex< double > >(val1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_cvector_t" "', argument " "2"" of type '" "std::complex< double >""'");
+  } 
+  arg2 = static_cast< std::complex< double > >(val2);
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_cvector_t" "', argument " "3"" of type '" "std::complex< double >""'");
+  } 
+  arg3 = static_cast< std::complex< double > >(val3);
+  result = (BasicVector3D< std::complex< double > > *)new BasicVector3D< std::complex< double > >(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_cvector_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_cvector_t__SWIG_0(self, args);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_cvector_t__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_cvector_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    BasicVector3D< std::complex< double > >::BasicVector3D()\n"
+    "    BasicVector3D< std::complex< double > >::BasicVector3D(std::complex< double > const,std::complex< double > const,std::complex< double > const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_x(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::complex< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_x",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_x" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = ((BasicVector3D< std::complex< double > > const *)arg1)->x();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_y(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::complex< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_y",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_y" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = ((BasicVector3D< std::complex< double > > const *)arg1)->y();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_z(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::complex< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_z",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_z" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = ((BasicVector3D< std::complex< double > > const *)arg1)->z();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_setX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  std::complex< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::complex< double > temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:cvector_t_setX",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_setX" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "cvector_t_setX" "', argument " "2"" of type '" "std::complex< double >""'");
+  } 
+  temp2 = static_cast< std::complex< double > >(val2);
+  arg2 = &temp2;
+  (arg1)->setX((std::complex< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_setY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  std::complex< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::complex< double > temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:cvector_t_setY",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_setY" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "cvector_t_setY" "', argument " "2"" of type '" "std::complex< double >""'");
+  } 
+  temp2 = static_cast< std::complex< double > >(val2);
+  arg2 = &temp2;
+  (arg1)->setY((std::complex< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_setZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  std::complex< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::complex< double > temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:cvector_t_setZ",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_setZ" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "cvector_t_setZ" "', argument " "2"" of type '" "std::complex< double >""'");
+  } 
+  temp2 = static_cast< std::complex< double > >(val2);
+  arg2 = &temp2;
+  (arg1)->setZ((std::complex< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_setXYZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  std::complex< double > *arg2 = 0 ;
+  std::complex< double > *arg3 = 0 ;
+  std::complex< double > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::complex< double > temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  std::complex< double > temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  std::complex< double > temp4 ;
+  std::complex< double > val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:cvector_t_setXYZ",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_setXYZ" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "cvector_t_setXYZ" "', argument " "2"" of type '" "std::complex< double >""'");
+  } 
+  temp2 = static_cast< std::complex< double > >(val2);
+  arg2 = &temp2;
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "cvector_t_setXYZ" "', argument " "3"" of type '" "std::complex< double >""'");
+  } 
+  temp3 = static_cast< std::complex< double > >(val3);
+  arg3 = &temp3;
+  ecode4 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "cvector_t_setXYZ" "', argument " "4"" of type '" "std::complex< double >""'");
+  } 
+  temp4 = static_cast< std::complex< double > >(val4);
+  arg4 = &temp4;
+  (arg1)->setXYZ((std::complex< double > const &)*arg2,(std::complex< double > const &)*arg3,(std::complex< double > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  BasicVector3D< std::complex< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:cvector_t___iadd__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t___iadd__" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "cvector_t___iadd__" "', argument " "2"" of type '" "BasicVector3D< std::complex< double > > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "cvector_t___iadd__" "', argument " "2"" of type '" "BasicVector3D< std::complex< double > > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp2);
+  result = (BasicVector3D< std::complex< double > > *) &(arg1)->operator +=((BasicVector3D< std::complex< double > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  BasicVector3D< std::complex< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:cvector_t___isub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t___isub__" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "cvector_t___isub__" "', argument " "2"" of type '" "BasicVector3D< std::complex< double > > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "cvector_t___isub__" "', argument " "2"" of type '" "BasicVector3D< std::complex< double > > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp2);
+  result = (BasicVector3D< std::complex< double > > *) &(arg1)->operator -=((BasicVector3D< std::complex< double > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_conj(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< std::complex< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_conj",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_conj" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = ((BasicVector3D< std::complex< double > > const *)arg1)->conj();
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< std::complex< double > >(static_cast< const BasicVector3D< std::complex< double > >& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_mag2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_mag2",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_mag2" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = (double)((BasicVector3D< std::complex< double > > const *)arg1)->mag2();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_mag(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_mag",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_mag" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = (double)((BasicVector3D< std::complex< double > > const *)arg1)->mag();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_magxy2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_magxy2",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_magxy2" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = (double)((BasicVector3D< std::complex< double > > const *)arg1)->magxy2();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_magxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_magxy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_magxy" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = (double)((BasicVector3D< std::complex< double > > const *)arg1)->magxy();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< std::complex< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_unit",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_unit" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = ((BasicVector3D< std::complex< double > > const *)arg1)->unit();
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< std::complex< double > >(static_cast< const BasicVector3D< std::complex< double > >& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_real(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  BasicVector3D< double > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cvector_t_real",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_real" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  result = ((BasicVector3D< std::complex< double > > const *)arg1)->real();
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< double >(static_cast< const BasicVector3D< double >& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cvector_t_project(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  BasicVector3D< std::complex< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  BasicVector3D< std::complex< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:cvector_t_project",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cvector_t_project" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "cvector_t_project" "', argument " "2"" of type '" "BasicVector3D< std::complex< double > > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "cvector_t_project" "', argument " "2"" of type '" "BasicVector3D< std::complex< double > > const &""'"); 
+  }
+  arg2 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp2);
+  result = ((BasicVector3D< std::complex< double > > const *)arg1)->project((BasicVector3D< std::complex< double > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj((new BasicVector3D< std::complex< double > >(static_cast< const BasicVector3D< std::complex< double > >& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_cvector_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  BasicVector3D< std::complex< double > > *arg1 = (BasicVector3D< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_cvector_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_cvector_t" "', argument " "1"" of type '" "BasicVector3D< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< BasicVector3D< std::complex< double > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *cvector_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_iterator" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___nonzero__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (bool)std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____nonzero__((std::vector< BasicVector3D< std::complex< double > > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___bool__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (bool)std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____bool__((std::vector< BasicVector3D< std::complex< double > > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___len__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____len__((std::vector< BasicVector3D< std::complex< double > > > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___getslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t___getslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_cvector_t___getslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val3);
+  try {
+    result = (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *)std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___setslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t___setslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_cvector_t___setslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val3);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg3 ;
+  std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_cvector_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___setslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t___setslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_cvector_t___setslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val3);
+  {
+    std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *ptr = (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_cvector_t___setslice__" "', argument " "4"" of type '" "std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t___setslice__" "', argument " "4"" of type '" "std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_cvector_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_cvector_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_cvector_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__setslice__(std::vector< BasicVector3D< std::complex< double > > >::difference_type,std::vector< BasicVector3D< std::complex< double > > >::difference_type)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__setslice__(std::vector< BasicVector3D< std::complex< double > > >::difference_type,std::vector< BasicVector3D< std::complex< double > > >::difference_type,std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___delslice__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t___delslice__" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_cvector_t___delslice__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val3);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___delitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t___delitem__" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val2);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___getitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *)std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___setitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *ptr = (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_cvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___setitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___delitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_cvector_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_cvector_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_cvector_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__delitem__(std::vector< BasicVector3D< std::complex< double > > >::difference_type)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___getitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t___getitem__" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val2);
+  try {
+    result = (std::vector< BasicVector3D< std::complex< double > > >::value_type *) &std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____getitem____SWIG_1((std::vector< BasicVector3D< std::complex< double > > > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_cvector_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_cvector_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_cvector_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__getitem__(PySliceObject *)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__getitem__(std::vector< BasicVector3D< std::complex< double > > >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::difference_type arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t___setitem__" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t___setitem__" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::difference_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_cvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t___setitem__" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp3);
+  try {
+    std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg____setitem____SWIG_2(arg1,arg2,(BasicVector3D< std::complex< double > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_cvector_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_cvector_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_cvector_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_cvector_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__setitem__(PySliceObject *,std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > const &)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__setitem__(PySliceObject *)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::__setitem__(std::vector< BasicVector3D< std::complex< double > > >::difference_type,std::vector< BasicVector3D< std::complex< double > > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_pop" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  try {
+    result = std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj((new std::vector< BasicVector3D< std::complex< double > > >::value_type(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::value_type& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_append" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_cvector_t_append" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t_append" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp2);
+  std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__append(arg1,(BasicVector3D< std::complex< double > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_cvector_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_cvector_t")) SWIG_fail;
+  result = (std::vector< BasicVector3D< std::complex< double > > > *)new std::vector< BasicVector3D< std::complex< double > > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_cvector_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_cvector_t",&obj0)) SWIG_fail;
+  {
+    std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *ptr = (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_cvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_cvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< BasicVector3D< std::complex< double > > > *)new std::vector< BasicVector3D< std::complex< double > > >((std::vector< BasicVector3D< std::complex< double > > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_empty" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (bool)((std::vector< BasicVector3D< std::complex< double > > > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_size" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = ((std::vector< BasicVector3D< std::complex< double > > > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_swap" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_cvector_t_swap" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t_swap" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_begin" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_end" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_rbegin" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_rend" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_clear" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< BasicVector3D< std::complex< double > > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_get_allocator" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = ((std::vector< BasicVector3D< std::complex< double > > > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< BasicVector3D< std::complex< double > > >::allocator_type(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_cvector_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_cvector_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_cvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::size_type >(val1);
+  result = (std::vector< BasicVector3D< std::complex< double > > > *)new std::vector< BasicVector3D< std::complex< double > > >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_pop_back" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_resize" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t_resize" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_erase" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_erase" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_erase" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_erase" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_erase" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_cvector_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_cvector_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_cvector_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::erase(std::vector< BasicVector3D< std::complex< double > > >::iterator)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::erase(std::vector< BasicVector3D< std::complex< double > > >::iterator,std::vector< BasicVector3D< std::complex< double > > >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_cvector_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type arg1 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_cvector_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_cvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::size_type >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_vector_cvector_t" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_cvector_t" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp2);
+  result = (std::vector< BasicVector3D< std::complex< double > > > *)new std::vector< BasicVector3D< std::complex< double > > >(arg1,(std::vector< BasicVector3D< std::complex< double > > >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_cvector_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_cvector_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_cvector_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_cvector_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_vector_cvector_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_cvector_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::vector()\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::vector(std::vector< BasicVector3D< std::complex< double > > > const &)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::vector(std::vector< BasicVector3D< std::complex< double > > >::size_type)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::vector(std::vector< BasicVector3D< std::complex< double > > >::size_type,std::vector< BasicVector3D< std::complex< double > > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_push_back" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_cvector_t_push_back" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t_push_back" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp2);
+  (arg1)->push_back((std::vector< BasicVector3D< std::complex< double > > >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_front" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (std::vector< BasicVector3D< std::complex< double > > >::value_type *) &((std::vector< BasicVector3D< std::complex< double > > > const *)arg1)->front();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_back" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = (std::vector< BasicVector3D< std::complex< double > > >::value_type *) &((std::vector< BasicVector3D< std::complex< double > > > const *)arg1)->back();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_assign" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t_assign" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_cvector_t_assign" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t_assign" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp3);
+  (arg1)->assign(arg2,(std::vector< BasicVector3D< std::complex< double > > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_resize" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t_resize" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_cvector_t_resize" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t_resize" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp3);
+  (arg1)->resize(arg2,(std::vector< BasicVector3D< std::complex< double > > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_cvector_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_cvector_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_cvector_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::resize(std::vector< BasicVector3D< std::complex< double > > >::size_type)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::resize(std::vector< BasicVector3D< std::complex< double > > >::size_type,std::vector< BasicVector3D< std::complex< double > > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_cvector_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_insert" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_cvector_t_insert" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t_insert" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp3);
+  result = std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__insert__SWIG_0(arg1,arg2,(BasicVector3D< std::complex< double > > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< BasicVector3D< std::complex< double > > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::iterator arg2 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type arg3 ;
+  std::vector< BasicVector3D< std::complex< double > > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_cvector_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_insert" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_cvector_t_insert" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_cvector_t_insert" "', argument " "3"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::size_type >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_cvector_t_insert" "', argument " "4"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_cvector_t_insert" "', argument " "4"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::value_type const &""'"); 
+  }
+  arg4 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > >::value_type * >(argp4);
+  std_vector_Sl_BasicVector3D_Sl_std_complex_Sl_double_Sg__Sg__Sg__insert__SWIG_1(arg1,arg2,arg3,(BasicVector3D< std::complex< double > > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_cvector_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< BasicVector3D< std::complex< double > > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_cvector_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_cvector_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::insert(std::vector< BasicVector3D< std::complex< double > > >::iterator,std::vector< BasicVector3D< std::complex< double > > >::value_type const &)\n"
+    "    std::vector< BasicVector3D< std::complex< double > > >::insert(std::vector< BasicVector3D< std::complex< double > > >::iterator,std::vector< BasicVector3D< std::complex< double > > >::size_type,std::vector< BasicVector3D< std::complex< double > > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_cvector_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_reserve" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_cvector_t_reserve" "', argument " "2"" of type '" "std::vector< BasicVector3D< std::complex< double > > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< BasicVector3D< std::complex< double > > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_cvector_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< BasicVector3D< std::complex< double > > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_cvector_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_cvector_t_capacity" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  result = ((std::vector< BasicVector3D< std::complex< double > > > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_cvector_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< BasicVector3D< std::complex< double > > > *arg1 = (std::vector< BasicVector3D< std::complex< double > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_cvector_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_cvector_t" "', argument " "1"" of type '" "std::vector< BasicVector3D< std::complex< double > > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< BasicVector3D< std::complex< double > > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_cvector_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_mul_I(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:mul_I",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "mul_I" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  result = mul_I(arg1);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_exp_I(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:exp_I",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "exp_I" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  result = exp_I(arg1);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int Swig_var_nanometer_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable nanometer is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_nanometer_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::nanometer));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_angstrom_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable angstrom is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_angstrom_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::angstrom));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_micrometer_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable micrometer is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_micrometer_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::micrometer));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_millimeter_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable millimeter is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_millimeter_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::millimeter));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_meter_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable meter is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_meter_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::meter));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_nm_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable nm is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_nm_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::nm));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_radian_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable radian is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_radian_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::radian));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_milliradian_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable milliradian is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_milliradian_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::milliradian));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_degree_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable degree is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_degree_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::degree));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_steradian_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable steradian is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_steradian_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::steradian));
+  return pyobj;
+}
+
+
+SWIGINTERN PyObject *_wrap_rad2deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:rad2deg",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "rad2deg" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)Units::rad2deg(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_deg2rad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:deg2rad",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "deg2rad" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)Units::deg2rad(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int Swig_var_rad_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable rad is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_rad_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::rad));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_mrad_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable mrad is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_mrad_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::mrad));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_sr_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable sr is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_sr_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::sr));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_deg_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable deg is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_deg_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::deg));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_tesla_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable tesla is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_tesla_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::tesla));
+  return pyobj;
+}
+
+
+SWIGINTERN int Swig_var_gauss_set(PyObject *) {
+  SWIG_Error(SWIG_AttributeError,"Variable gauss is read-only.");
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_gauss_get(void) {
+  PyObject *pyobj = 0;
+  
+  pyobj = SWIG_From_double(static_cast< double >(Units::gauss));
+  return pyobj;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_WavevectorInfo__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  WavevectorInfo *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_WavevectorInfo")) SWIG_fail;
+  result = (WavevectorInfo *)new WavevectorInfo();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_WavevectorInfo, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_WavevectorInfo__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  cvector_t arg1 ;
+  cvector_t arg2 ;
+  double arg3 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  WavevectorInfo *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_WavevectorInfo",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_WavevectorInfo" "', argument " "1"" of type '" "cvector_t""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_WavevectorInfo" "', argument " "1"" of type '" "cvector_t""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_WavevectorInfo" "', argument " "2"" of type '" "cvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_WavevectorInfo" "', argument " "2"" of type '" "cvector_t""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_WavevectorInfo" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (WavevectorInfo *)new WavevectorInfo(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_WavevectorInfo, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_WavevectorInfo__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  kvector_t arg1 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  WavevectorInfo *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_WavevectorInfo",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_WavevectorInfo" "', argument " "1"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_WavevectorInfo" "', argument " "1"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_WavevectorInfo" "', argument " "2"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_WavevectorInfo" "', argument " "2"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_WavevectorInfo" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (WavevectorInfo *)new WavevectorInfo(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_WavevectorInfo, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_WavevectorInfo(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_WavevectorInfo__SWIG_0(self, args);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_WavevectorInfo__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_WavevectorInfo__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_WavevectorInfo'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    WavevectorInfo::WavevectorInfo()\n"
+    "    WavevectorInfo::WavevectorInfo(cvector_t,cvector_t,double)\n"
+    "    WavevectorInfo::WavevectorInfo(kvector_t,kvector_t,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_WavevectorInfo_getKi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  WavevectorInfo *arg1 = (WavevectorInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  cvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:WavevectorInfo_getKi",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_WavevectorInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WavevectorInfo_getKi" "', argument " "1"" of type '" "WavevectorInfo const *""'"); 
+  }
+  arg1 = reinterpret_cast< WavevectorInfo * >(argp1);
+  result = ((WavevectorInfo const *)arg1)->getKi();
+  resultobj = SWIG_NewPointerObj((new cvector_t(static_cast< const cvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_WavevectorInfo_getKf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  WavevectorInfo *arg1 = (WavevectorInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  cvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:WavevectorInfo_getKf",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_WavevectorInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WavevectorInfo_getKf" "', argument " "1"" of type '" "WavevectorInfo const *""'"); 
+  }
+  arg1 = reinterpret_cast< WavevectorInfo * >(argp1);
+  result = ((WavevectorInfo const *)arg1)->getKf();
+  resultobj = SWIG_NewPointerObj((new cvector_t(static_cast< const cvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_WavevectorInfo_getQ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  WavevectorInfo *arg1 = (WavevectorInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  cvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:WavevectorInfo_getQ",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_WavevectorInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WavevectorInfo_getQ" "', argument " "1"" of type '" "WavevectorInfo const *""'"); 
+  }
+  arg1 = reinterpret_cast< WavevectorInfo * >(argp1);
+  result = ((WavevectorInfo const *)arg1)->getQ();
+  resultobj = SWIG_NewPointerObj((new cvector_t(static_cast< const cvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_WavevectorInfo_getWavelength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  WavevectorInfo *arg1 = (WavevectorInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:WavevectorInfo_getWavelength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_WavevectorInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WavevectorInfo_getWavelength" "', argument " "1"" of type '" "WavevectorInfo const *""'"); 
+  }
+  arg1 = reinterpret_cast< WavevectorInfo * >(argp1);
+  result = (double)((WavevectorInfo const *)arg1)->getWavelength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_WavevectorInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  WavevectorInfo *arg1 = (WavevectorInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_WavevectorInfo",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_WavevectorInfo, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_WavevectorInfo" "', argument " "1"" of type '" "WavevectorInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< WavevectorInfo * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *WavevectorInfo_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_WavevectorInfo, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Beam__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Beam")) SWIG_fail;
+  result = (Beam *)new Beam();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Beam, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Beam__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Beam *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Beam",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Beam,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Beam" "', argument " "1"" of type '" "Beam const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Beam" "', argument " "1"" of type '" "Beam const &""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  result = (Beam *)new Beam((Beam const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Beam, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Beam(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Beam__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Beam, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Beam__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Beam'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Beam::Beam()\n"
+    "    Beam::Beam(Beam const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Beam(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Beam",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Beam" "', argument " "1"" of type '" "Beam *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_getCentralK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Beam_getCentralK",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_getCentralK" "', argument " "1"" of type '" "Beam const *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  result = ((Beam const *)arg1)->getCentralK();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_setCentralK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Beam_setCentralK",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_setCentralK" "', argument " "1"" of type '" "Beam *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Beam_setCentralK" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Beam_setCentralK" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Beam_setCentralK" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setCentralK(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_getIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Beam_getIntensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_getIntensity" "', argument " "1"" of type '" "Beam const *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  result = (double)((Beam const *)arg1)->getIntensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_setIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Beam_setIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_setIntensity" "', argument " "1"" of type '" "Beam *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Beam_setIntensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setIntensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_setPolarization(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Beam_setPolarization",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_setPolarization" "', argument " "1"" of type '" "Beam *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Beam_setPolarization" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Beam_setPolarization" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->setPolarization(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_getWavelength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Beam_getWavelength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_getWavelength" "', argument " "1"" of type '" "Beam const *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  result = (double)((Beam const *)arg1)->getWavelength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Beam_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_getAlpha" "', argument " "1"" of type '" "Beam const *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  result = (double)((Beam const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Beam_getPhi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Beam *arg1 = (Beam *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Beam_getPhi",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Beam, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Beam_getPhi" "', argument " "1"" of type '" "Beam const *""'"); 
+  }
+  arg1 = reinterpret_cast< Beam * >(argp1);
+  result = (double)((Beam const *)arg1)->getPhi();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Beam_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Beam, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Bin1D__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Bin1D")) SWIG_fail;
+  result = (Bin1D *)new Bin1D();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1D__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Bin1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Bin1D",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Bin1D" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Bin1D" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (Bin1D *)new Bin1D(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1D(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Bin1D__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_Bin1D__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Bin1D'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Bin1D::Bin1D()\n"
+    "    Bin1D::Bin1D(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1D_m_lower_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = (Bin1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Bin1D_m_lower_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1D_m_lower_set" "', argument " "1"" of type '" "Bin1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Bin1D_m_lower_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_lower = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1D_m_lower_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = (Bin1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1D_m_lower_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1D_m_lower_get" "', argument " "1"" of type '" "Bin1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  result = (double) ((arg1)->m_lower);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1D_m_upper_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = (Bin1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Bin1D_m_upper_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1D_m_upper_set" "', argument " "1"" of type '" "Bin1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Bin1D_m_upper_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_upper = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1D_m_upper_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = (Bin1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1D_m_upper_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1D_m_upper_get" "', argument " "1"" of type '" "Bin1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  result = (double) ((arg1)->m_upper);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1D_getMidPoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = (Bin1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1D_getMidPoint",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1D_getMidPoint" "', argument " "1"" of type '" "Bin1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  result = (double)((Bin1D const *)arg1)->getMidPoint();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1D_getBinSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = (Bin1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1D_getBinSize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1D_getBinSize" "', argument " "1"" of type '" "Bin1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  result = (double)((Bin1D const *)arg1)->getBinSize();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Bin1D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = (Bin1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Bin1D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Bin1D" "', argument " "1"" of type '" "Bin1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Bin1D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Bin1D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_BinContains(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D *arg1 = 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:BinContains",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BinContains" "', argument " "1"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BinContains" "', argument " "1"" of type '" "Bin1D const &""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "BinContains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (bool)BinContains((Bin1D const &)*arg1,arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1DKVector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Bin1DKVector")) SWIG_fail;
+  result = (Bin1DKVector *)new Bin1DKVector();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1DKVector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1DKVector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  kvector_t arg1 ;
+  kvector_t arg2 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Bin1DKVector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Bin1DKVector",&obj0,&obj1)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Bin1DKVector" "', argument " "1"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DKVector" "', argument " "1"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Bin1DKVector" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DKVector" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (Bin1DKVector *)new Bin1DKVector(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1DKVector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1DKVector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Bin1DKVector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_Bin1DKVector",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Bin1DKVector" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Bin1DKVector" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DKVector" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_Bin1DKVector" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DKVector" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (Bin1DKVector *)new Bin1DKVector(arg1,(Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1DKVector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1DKVector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Bin1DKVector__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_Bin1DKVector__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_Bin1DKVector__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Bin1DKVector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Bin1DKVector::Bin1DKVector()\n"
+    "    Bin1DKVector::Bin1DKVector(kvector_t const,kvector_t const)\n"
+    "    Bin1DKVector::Bin1DKVector(double,Bin1D const &,Bin1D const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DKVector_getMidPoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *arg1 = (Bin1DKVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DKVector_getMidPoint",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DKVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DKVector_getMidPoint" "', argument " "1"" of type '" "Bin1DKVector const *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DKVector * >(argp1);
+  result = ((Bin1DKVector const *)arg1)->getMidPoint();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DKVector_getDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *arg1 = (Bin1DKVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DKVector_getDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DKVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DKVector_getDelta" "', argument " "1"" of type '" "Bin1DKVector const *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DKVector * >(argp1);
+  result = ((Bin1DKVector const *)arg1)->getDelta();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DKVector_m_q_lower_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *arg1 = (Bin1DKVector *) 0 ;
+  kvector_t *arg2 = (kvector_t *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Bin1DKVector_m_q_lower_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DKVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DKVector_m_q_lower_set" "', argument " "1"" of type '" "Bin1DKVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DKVector * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Bin1DKVector_m_q_lower_set" "', argument " "2"" of type '" "kvector_t *""'"); 
+  }
+  arg2 = reinterpret_cast< kvector_t * >(argp2);
+  if (arg1) (arg1)->m_q_lower = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DKVector_m_q_lower_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *arg1 = (Bin1DKVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DKVector_m_q_lower_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DKVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DKVector_m_q_lower_get" "', argument " "1"" of type '" "Bin1DKVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DKVector * >(argp1);
+  result = (kvector_t *)& ((arg1)->m_q_lower);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DKVector_m_q_upper_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *arg1 = (Bin1DKVector *) 0 ;
+  kvector_t *arg2 = (kvector_t *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Bin1DKVector_m_q_upper_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DKVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DKVector_m_q_upper_set" "', argument " "1"" of type '" "Bin1DKVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DKVector * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Bin1DKVector_m_q_upper_set" "', argument " "2"" of type '" "kvector_t *""'"); 
+  }
+  arg2 = reinterpret_cast< kvector_t * >(argp2);
+  if (arg1) (arg1)->m_q_upper = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DKVector_m_q_upper_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *arg1 = (Bin1DKVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DKVector_m_q_upper_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DKVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DKVector_m_q_upper_get" "', argument " "1"" of type '" "Bin1DKVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DKVector * >(argp1);
+  result = (kvector_t *)& ((arg1)->m_q_upper);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Bin1DKVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DKVector *arg1 = (Bin1DKVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Bin1DKVector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DKVector, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Bin1DKVector" "', argument " "1"" of type '" "Bin1DKVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DKVector * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Bin1DKVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Bin1DKVector, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Bin1DCVector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Bin1DCVector")) SWIG_fail;
+  result = (Bin1DCVector *)new Bin1DCVector();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1DCVector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1DCVector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  cvector_t arg1 ;
+  cvector_t arg2 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Bin1DCVector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Bin1DCVector",&obj0,&obj1)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Bin1DCVector" "', argument " "1"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DCVector" "', argument " "1"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Bin1DCVector" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DCVector" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (Bin1DCVector *)new Bin1DCVector(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1DCVector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1DCVector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Bin1DCVector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_Bin1DCVector",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Bin1DCVector" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Bin1DCVector" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DCVector" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_Bin1DCVector" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Bin1DCVector" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (Bin1DCVector *)new Bin1DCVector(arg1,(Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Bin1DCVector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Bin1DCVector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Bin1DCVector__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_Bin1DCVector__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_Bin1DCVector__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Bin1DCVector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Bin1DCVector::Bin1DCVector()\n"
+    "    Bin1DCVector::Bin1DCVector(cvector_t const,cvector_t const)\n"
+    "    Bin1DCVector::Bin1DCVector(double,Bin1D const &,Bin1D const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DCVector_getMidPoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *arg1 = (Bin1DCVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  cvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DCVector_getMidPoint",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DCVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DCVector_getMidPoint" "', argument " "1"" of type '" "Bin1DCVector const *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DCVector * >(argp1);
+  result = ((Bin1DCVector const *)arg1)->getMidPoint();
+  resultobj = SWIG_NewPointerObj((new cvector_t(static_cast< const cvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DCVector_getDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *arg1 = (Bin1DCVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  cvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DCVector_getDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DCVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DCVector_getDelta" "', argument " "1"" of type '" "Bin1DCVector const *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DCVector * >(argp1);
+  result = ((Bin1DCVector const *)arg1)->getDelta();
+  resultobj = SWIG_NewPointerObj((new cvector_t(static_cast< const cvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DCVector_m_q_lower_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *arg1 = (Bin1DCVector *) 0 ;
+  cvector_t *arg2 = (cvector_t *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Bin1DCVector_m_q_lower_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DCVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DCVector_m_q_lower_set" "', argument " "1"" of type '" "Bin1DCVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DCVector * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Bin1DCVector_m_q_lower_set" "', argument " "2"" of type '" "cvector_t *""'"); 
+  }
+  arg2 = reinterpret_cast< cvector_t * >(argp2);
+  if (arg1) (arg1)->m_q_lower = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DCVector_m_q_lower_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *arg1 = (Bin1DCVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  cvector_t *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DCVector_m_q_lower_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DCVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DCVector_m_q_lower_get" "', argument " "1"" of type '" "Bin1DCVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DCVector * >(argp1);
+  result = (cvector_t *)& ((arg1)->m_q_lower);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DCVector_m_q_upper_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *arg1 = (Bin1DCVector *) 0 ;
+  cvector_t *arg2 = (cvector_t *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Bin1DCVector_m_q_upper_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DCVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DCVector_m_q_upper_set" "', argument " "1"" of type '" "Bin1DCVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DCVector * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Bin1DCVector_m_q_upper_set" "', argument " "2"" of type '" "cvector_t *""'"); 
+  }
+  arg2 = reinterpret_cast< cvector_t * >(argp2);
+  if (arg1) (arg1)->m_q_upper = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bin1DCVector_m_q_upper_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *arg1 = (Bin1DCVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  cvector_t *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bin1DCVector_m_q_upper_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DCVector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Bin1DCVector_m_q_upper_get" "', argument " "1"" of type '" "Bin1DCVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DCVector * >(argp1);
+  result = (cvector_t *)& ((arg1)->m_q_upper);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Bin1DCVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1DCVector *arg1 = (Bin1DCVector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Bin1DCVector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Bin1DCVector, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Bin1DCVector" "', argument " "1"" of type '" "Bin1DCVector *""'"); 
+  }
+  arg1 = reinterpret_cast< Bin1DCVector * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Bin1DCVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Bin1DCVector, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IAxis_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_clone" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = (IAxis *)((IAxis const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_createDoubleBinSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_createDoubleBinSize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_createDoubleBinSize" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = (IAxis *)((IAxis const *)arg1)->createDoubleBinSize();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IAxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IAxis" "', argument " "1"" of type '" "IAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_size" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = ((IAxis const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_getName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_getName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_getName" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = ((IAxis const *)arg1)->getName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_setName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  std::string arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis_setName",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_setName" "', argument " "1"" of type '" "IAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    int res = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "IAxis_setName" "', argument " "2"" of type '" "std::string""'"); 
+    }
+    arg2 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  (arg1)->setName(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_getBin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Bin1D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis_getBin",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_getBin" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_getBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((IAxis const *)arg1)->getBin(arg2);
+  resultobj = SWIG_NewPointerObj((new Bin1D(static_cast< const Bin1D& >(result))), SWIGTYPE_p_Bin1D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_getMin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_getMin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_getMin" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = (double)((IAxis const *)arg1)->getMin();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_getMax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_getMax",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_getMax" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = (double)((IAxis const *)arg1)->getMax();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_getBinCenter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis_getBinCenter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_getBinCenter" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_getBinCenter" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((IAxis const *)arg1)->getBinCenter(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_findClosestIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis_findClosestIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_findClosestIndex" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_findClosestIndex" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((IAxis const *)arg1)->findClosestIndex(arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_findIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis_findIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_findIndex" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_findIndex" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((IAxis const *)arg1)->findIndex(arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  IAxis *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis___eq__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis___eq__" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAxis___eq__" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IAxis___eq__" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  result = (bool)((IAxis const *)arg1)->operator ==((IAxis const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  IAxis *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis___ne__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis___ne__" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAxis___ne__" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IAxis___ne__" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  result = (bool)((IAxis const *)arg1)->operator !=((IAxis const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_getBinCenters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_getBinCenters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_getBinCenters" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = ((IAxis const *)arg1)->getBinCenters();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_getBinBoundaries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAxis_getBinBoundaries",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_getBinBoundaries" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = ((IAxis const *)arg1)->getBinBoundaries();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_createClippedAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IAxis_createClippedAxis",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_createClippedAxis" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_createClippedAxis" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IAxis_createClippedAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (IAxis *)((IAxis const *)arg1)->createClippedAxis(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAxis_contains(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = (IAxis *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAxis_contains",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAxis_contains" "', argument " "1"" of type '" "IAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAxis_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (bool)((IAxis const *)arg1)->contains(arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IAxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IAxis, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_HaveSameNameAndShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = 0 ;
+  IAxis *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:HaveSameNameAndShape",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HaveSameNameAndShape" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "HaveSameNameAndShape" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "HaveSameNameAndShape" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "HaveSameNameAndShape" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  result = (bool)HaveSameNameAndShape((IAxis const &)*arg1,(IAxis const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VariableBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  size_t arg2 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  VariableBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_VariableBinAxis",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VariableBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VariableBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_VariableBinAxis" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_VariableBinAxis" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VariableBinAxis" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = (VariableBinAxis *)new VariableBinAxis((std::string const &)*arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_VariableBinAxis, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_VariableBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_VariableBinAxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VariableBinAxis" "', argument " "1"" of type '" "VariableBinAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  VariableBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VariableBinAxis_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_clone" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  result = (VariableBinAxis *)((VariableBinAxis const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VariableBinAxis_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_size" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  result = ((VariableBinAxis const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_getBin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Bin1D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:VariableBinAxis_getBin",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_getBin" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VariableBinAxis_getBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((VariableBinAxis const *)arg1)->getBin(arg2);
+  resultobj = SWIG_NewPointerObj((new Bin1D(static_cast< const Bin1D& >(result))), SWIGTYPE_p_Bin1D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_getMin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VariableBinAxis_getMin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_getMin" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  result = (double)((VariableBinAxis const *)arg1)->getMin();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_getMax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VariableBinAxis_getMax",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_getMax" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  result = (double)((VariableBinAxis const *)arg1)->getMax();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_getBinCenter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:VariableBinAxis_getBinCenter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_getBinCenter" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VariableBinAxis_getBinCenter" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((VariableBinAxis const *)arg1)->getBinCenter(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_findClosestIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:VariableBinAxis_findClosestIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_findClosestIndex" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VariableBinAxis_findClosestIndex" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((VariableBinAxis const *)arg1)->findClosestIndex(arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_getBinCenters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VariableBinAxis_getBinCenters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_getBinCenters" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  result = ((VariableBinAxis const *)arg1)->getBinCenters();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_getBinBoundaries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VariableBinAxis_getBinBoundaries",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_getBinBoundaries" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  result = ((VariableBinAxis const *)arg1)->getBinBoundaries();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis_createClippedAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  VariableBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:VariableBinAxis_createClippedAxis",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis_createClippedAxis" "', argument " "1"" of type '" "VariableBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VariableBinAxis_createClippedAxis" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VariableBinAxis_createClippedAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (VariableBinAxis *)((VariableBinAxis const *)arg1)->createClippedAxis(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VariableBinAxis___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  VariableBinAxis *arg1 = (VariableBinAxis *) 0 ;
+  unsigned int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:VariableBinAxis___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_VariableBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VariableBinAxis___getitem__" "', argument " "1"" of type '" "VariableBinAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< VariableBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VariableBinAxis___getitem__" "', argument " "2"" of type '" "unsigned int""'");
+  } 
+  arg2 = static_cast< unsigned int >(val2);
+  result = (double)VariableBinAxis___getitem__(arg1,arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *VariableBinAxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_VariableBinAxis, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ConstKBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  int res1 = SWIG_OLDOBJ ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  ConstKBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_ConstKBinAxis",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ConstKBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ConstKBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_ConstKBinAxis" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_ConstKBinAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_ConstKBinAxis" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (ConstKBinAxis *)new ConstKBinAxis((std::string const &)*arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ConstKBinAxis, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ConstKBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ConstKBinAxis *arg1 = (ConstKBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ConstKBinAxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ConstKBinAxis, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ConstKBinAxis" "', argument " "1"" of type '" "ConstKBinAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< ConstKBinAxis * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ConstKBinAxis_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ConstKBinAxis *arg1 = (ConstKBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ConstKBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ConstKBinAxis_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ConstKBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ConstKBinAxis_clone" "', argument " "1"" of type '" "ConstKBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< ConstKBinAxis * >(argp1);
+  result = (ConstKBinAxis *)((ConstKBinAxis const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ConstKBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ConstKBinAxis_createClippedAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ConstKBinAxis *arg1 = (ConstKBinAxis *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  ConstKBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ConstKBinAxis_createClippedAxis",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ConstKBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ConstKBinAxis_createClippedAxis" "', argument " "1"" of type '" "ConstKBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< ConstKBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ConstKBinAxis_createClippedAxis" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ConstKBinAxis_createClippedAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (ConstKBinAxis *)((ConstKBinAxis const *)arg1)->createClippedAxis(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ConstKBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ConstKBinAxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ConstKBinAxis, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_CustomBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  int res1 = SWIG_OLDOBJ ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  CustomBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_CustomBinAxis",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_CustomBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_CustomBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_CustomBinAxis" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_CustomBinAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_CustomBinAxis" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (CustomBinAxis *)new CustomBinAxis((std::string const &)*arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CustomBinAxis, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_CustomBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CustomBinAxis *arg1 = (CustomBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_CustomBinAxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CustomBinAxis, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CustomBinAxis" "', argument " "1"" of type '" "CustomBinAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CustomBinAxis * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CustomBinAxis_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CustomBinAxis *arg1 = (CustomBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  CustomBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:CustomBinAxis_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CustomBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CustomBinAxis_clone" "', argument " "1"" of type '" "CustomBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< CustomBinAxis * >(argp1);
+  result = (CustomBinAxis *)((CustomBinAxis const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CustomBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CustomBinAxis_getBin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CustomBinAxis *arg1 = (CustomBinAxis *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Bin1D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:CustomBinAxis_getBin",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CustomBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CustomBinAxis_getBin" "', argument " "1"" of type '" "CustomBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< CustomBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CustomBinAxis_getBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((CustomBinAxis const *)arg1)->getBin(arg2);
+  resultobj = SWIG_NewPointerObj((new Bin1D(static_cast< const Bin1D& >(result))), SWIGTYPE_p_Bin1D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CustomBinAxis_getBinCenters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CustomBinAxis *arg1 = (CustomBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:CustomBinAxis_getBinCenters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CustomBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CustomBinAxis_getBinCenters" "', argument " "1"" of type '" "CustomBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< CustomBinAxis * >(argp1);
+  result = ((CustomBinAxis const *)arg1)->getBinCenters();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CustomBinAxis_createClippedAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CustomBinAxis *arg1 = (CustomBinAxis *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  CustomBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:CustomBinAxis_createClippedAxis",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CustomBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CustomBinAxis_createClippedAxis" "', argument " "1"" of type '" "CustomBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< CustomBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CustomBinAxis_createClippedAxis" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "CustomBinAxis_createClippedAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (CustomBinAxis *)((CustomBinAxis const *)arg1)->createClippedAxis(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CustomBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *CustomBinAxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_CustomBinAxis, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IShape2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::IShape2D *arg1 = (Geometry::IShape2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::IShape2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IShape2D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__IShape2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IShape2D_clone" "', argument " "1"" of type '" "Geometry::IShape2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::IShape2D * >(argp1);
+  result = (Geometry::IShape2D *)((Geometry::IShape2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__IShape2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IShape2D_contains__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::IShape2D *arg1 = (Geometry::IShape2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IShape2D_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__IShape2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IShape2D_contains" "', argument " "1"" of type '" "Geometry::IShape2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::IShape2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IShape2D_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IShape2D_contains" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((Geometry::IShape2D const *)arg1)->contains(arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IShape2D_contains__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::IShape2D *arg1 = (Geometry::IShape2D *) 0 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IShape2D_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__IShape2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IShape2D_contains" "', argument " "1"" of type '" "Geometry::IShape2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::IShape2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IShape2D_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IShape2D_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IShape2D_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IShape2D_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (bool)((Geometry::IShape2D const *)arg1)->contains((Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IShape2D_contains(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__IShape2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_IShape2D_contains__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__IShape2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IShape2D_contains__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IShape2D_contains'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::IShape2D::contains(double,double) const\n"
+    "    Geometry::IShape2D::contains(Bin1D const &,Bin1D const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IShape2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::IShape2D *arg1 = (Geometry::IShape2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IShape2D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__IShape2D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IShape2D" "', argument " "1"" of type '" "Geometry::IShape2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::IShape2D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IShape2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Geometry__IShape2D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_ISample_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  ISample *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_clone" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("ISample::clone");
+    } else {
+      result = (ISample *)((ISample const *)arg1)->clone();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  }
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  ISample *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_cloneInvertB" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = (ISample *)((ISample const *)arg1)->ISample::cloneInvertB();
+    } else {
+      result = (ISample *)((ISample const *)arg1)->cloneInvertB();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  }
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISample_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_accept" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISample_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("ISample::accept");
+    } else {
+      ((ISample const *)arg1)->accept(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_to_str__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISample_to_str",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_to_str" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISample_to_str" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = ((ISample const *)arg1)->ISample::to_str(arg2);
+    } else {
+      result = ((ISample const *)arg1)->to_str(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_to_str__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_to_str",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_to_str" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = ((ISample const *)arg1)->ISample::to_str();
+    } else {
+      result = ((ISample const *)arg1)->to_str();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_to_str(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISample, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_ISample_to_str__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISample, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ISample_to_str__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ISample_to_str'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ISample::to_str(int) const\n"
+    "    ISample::to_str() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_getMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_getMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_getMaterial" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = (IMaterial *)((ISample const *)arg1)->ISample::getMaterial();
+    } else {
+      result = (IMaterial *)((ISample const *)arg1)->getMaterial();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_getAmbientMaterial" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = (IMaterial *)((ISample const *)arg1)->ISample::getAmbientMaterial();
+    } else {
+      result = (IMaterial *)((ISample const *)arg1)->getAmbientMaterial();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_containedMaterials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< IMaterial const *,std::allocator< IMaterial const * > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_containedMaterials",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_containedMaterials" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  result = ((ISample const *)arg1)->containedMaterials();
+  resultobj = SWIG_NewPointerObj((new std::vector< IMaterial const *,std::allocator< IMaterial const * > >(static_cast< const std::vector< IMaterial const *,std::allocator< IMaterial const * > >& >(result))), SWIGTYPE_p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_getChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  std::vector< ISample const *,std::allocator< ISample const * > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_getChildren",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_getChildren" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = ((ISample const *)arg1)->ISample::getChildren();
+    } else {
+      result = ((ISample const *)arg1)->getChildren();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_NewPointerObj((new std::vector< ISample const *,std::allocator< ISample const * > >(static_cast< const std::vector< ISample const *,std::allocator< ISample const * > >& >(result))), SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_size" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = ((ISample const *)arg1)->ISample::size();
+    } else {
+      result = ((ISample const *)arg1)->size();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ISample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyObject * obj0 = 0 ;
+  ISample *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_ISample",&obj0)) SWIG_fail;
+  arg1 = obj0;
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (ISample *)new SwigDirector_ISample(arg1); 
+  } else {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
+    SWIG_fail;
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ISample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ISample",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ISample" "', argument " "1"" of type '" "ISample *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_ISample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_ISample",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_ISample" "', argument " "1"" of type '" "ISample *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample_onChange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_ISample *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISample_onChange",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample_onChange" "', argument " "1"" of type '" "ISample *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("onChange"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member onChange");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_ISample *>(arg1);
+    if (upcall) {
+      (darg)->onChangeSwigPublic();
+    } else {
+      (darg)->onChange();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISample__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = (ISample *) 0 ;
+  std::ostream *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_ISample *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISample__print",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISample__print" "', argument " "1"" of type '" "ISample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__ostream,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISample__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ISample__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  arg2 = reinterpret_cast< std::ostream * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("print"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member print");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_ISample *>(arg1);
+    if (upcall) {
+      ((SwigDirector_ISample const *)darg)->printSwigPublic(*arg2);
+    } else {
+      ((SwigDirector_ISample const *)darg)->print(*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ISample_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ISample, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_iterator" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_ISample_Sm__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___nonzero__" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (bool)std_vector_Sl_ISample_Sm__Sg____nonzero__((std::vector< ISample * > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___bool__" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (bool)std_vector_Sl_ISample_Sm__Sg____bool__((std::vector< ISample * > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___len__" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = std_vector_Sl_ISample_Sm__Sg____len__((std::vector< ISample * > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::difference_type arg2 ;
+  std::vector< ISample * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< ISample *,std::allocator< ISample * > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___getslice__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector___getslice__" "', argument " "2"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_isample_vector___getslice__" "', argument " "3"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample * >::difference_type >(val3);
+  try {
+    result = (std::vector< ISample *,std::allocator< ISample * > > *)std_vector_Sl_ISample_Sm__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::difference_type arg2 ;
+  std::vector< ISample * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "2"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "3"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample * >::difference_type >(val3);
+  try {
+    std_vector_Sl_ISample_Sm__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::difference_type arg2 ;
+  std::vector< ISample * >::difference_type arg3 ;
+  std::vector< ISample *,std::allocator< ISample * > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:swig_dummy_type_isample_vector___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "2"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "3"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample * >::difference_type >(val3);
+  {
+    std::vector< ISample*,std::allocator< ISample * > > *ptr = (std::vector< ISample*,std::allocator< ISample * > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "4"" of type '" "std::vector< ISample *,std::allocator< ISample * > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "swig_dummy_type_isample_vector___setslice__" "', argument " "4"" of type '" "std::vector< ISample *,std::allocator< ISample * > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_ISample_Sm__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< ISample *,std::allocator< ISample * > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_swig_dummy_type_isample_vector___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_swig_dummy_type_isample_vector___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_isample_vector___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::__setslice__(std::vector< ISample * >::difference_type,std::vector< ISample * >::difference_type)\n"
+    "    std::vector< ISample * >::__setslice__(std::vector< ISample * >::difference_type,std::vector< ISample * >::difference_type,std::vector< ISample *,std::allocator< ISample * > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::difference_type arg2 ;
+  std::vector< ISample * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___delslice__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector___delslice__" "', argument " "2"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_isample_vector___delslice__" "', argument " "3"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample * >::difference_type >(val3);
+  try {
+    std_vector_Sl_ISample_Sm__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___delitem__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector___delitem__" "', argument " "2"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::difference_type >(val2);
+  try {
+    std_vector_Sl_ISample_Sm__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample *,std::allocator< ISample * > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___getitem__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< ISample *,std::allocator< ISample * > > *)std_vector_Sl_ISample_Sm__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< ISample *,std::allocator< ISample * > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< ISample*,std::allocator< ISample * > > *ptr = (std::vector< ISample*,std::allocator< ISample * > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "3"" of type '" "std::vector< ISample *,std::allocator< ISample * > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "3"" of type '" "std::vector< ISample *,std::allocator< ISample * > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_ISample_Sm__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< ISample *,std::allocator< ISample * > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_ISample_Sm__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___delitem__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_ISample_Sm__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_isample_vector___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_isample_vector___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_isample_vector___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::__delitem__(std::vector< ISample * >::difference_type)\n"
+    "    std::vector< ISample * >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___getitem__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector___getitem__" "', argument " "2"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::difference_type >(val2);
+  try {
+    result = (std::vector< ISample * >::value_type)std_vector_Sl_ISample_Sm__Sg____getitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_isample_vector___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_isample_vector___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_isample_vector___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::__getitem__(PySliceObject *)\n"
+    "    std::vector< ISample * >::__getitem__(std::vector< ISample * >::difference_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::difference_type arg2 ;
+  std::vector< ISample * >::value_type arg3 = (std::vector< ISample * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "2"" of type '" "std::vector< ISample * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::difference_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_isample_vector___setitem__" "', argument " "3"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample * >::value_type >(argp3);
+  try {
+    std_vector_Sl_ISample_Sm__Sg____setitem____SWIG_2(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_isample_vector___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_isample_vector___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ISample, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_isample_vector___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_isample_vector___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::__setitem__(PySliceObject *,std::vector< ISample *,std::allocator< ISample * > > const &)\n"
+    "    std::vector< ISample * >::__setitem__(PySliceObject *)\n"
+    "    std::vector< ISample * >::__setitem__(std::vector< ISample * >::difference_type,std::vector< ISample * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_pop" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  try {
+    result = (std::vector< ISample * >::value_type)std_vector_Sl_ISample_Sm__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::value_type arg2 = (std::vector< ISample * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_append" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "swig_dummy_type_isample_vector_append" "', argument " "2"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample * >::value_type >(argp2);
+  std_vector_Sl_ISample_Sm__Sg__append(arg1,arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_isample_vector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_swig_dummy_type_isample_vector")) SWIG_fail;
+  result = (std::vector< ISample * > *)new std::vector< ISample * >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_isample_vector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_swig_dummy_type_isample_vector",&obj0)) SWIG_fail;
+  {
+    std::vector< ISample*,std::allocator< ISample * > > *ptr = (std::vector< ISample*,std::allocator< ISample * > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_swig_dummy_type_isample_vector" "', argument " "1"" of type '" "std::vector< ISample * > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_swig_dummy_type_isample_vector" "', argument " "1"" of type '" "std::vector< ISample * > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< ISample * > *)new std::vector< ISample * >((std::vector< ISample * > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_empty" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (bool)((std::vector< ISample * > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_size" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = ((std::vector< ISample * > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_swap" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "swig_dummy_type_isample_vector_swap" "', argument " "2"" of type '" "std::vector< ISample * > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "swig_dummy_type_isample_vector_swap" "', argument " "2"" of type '" "std::vector< ISample * > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample * > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_begin" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_end" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_rbegin" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample * >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_rend" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample * >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_clear" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< ISample * > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_get_allocator" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = ((std::vector< ISample * > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< ISample * >::allocator_type(static_cast< const std::vector< ISample * >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_ISample_p_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_isample_vector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_swig_dummy_type_isample_vector",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_swig_dummy_type_isample_vector" "', argument " "1"" of type '" "std::vector< ISample * >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< ISample * >::size_type >(val1);
+  result = (std::vector< ISample * > *)new std::vector< ISample * >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_pop_back" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_resize" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector_resize" "', argument " "2"" of type '" "std::vector< ISample * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_ISample_Sm__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::iterator arg2 ;
+  std::vector< ISample * >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< ISample * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "3"" of type '" "std::vector< ISample * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_erase" "', argument " "3"" of type '" "std::vector< ISample * >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_ISample_Sm__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_swig_dummy_type_isample_vector_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_swig_dummy_type_isample_vector_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_isample_vector_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::erase(std::vector< ISample * >::iterator)\n"
+    "    std::vector< ISample * >::erase(std::vector< ISample * >::iterator,std::vector< ISample * >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_isample_vector__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * >::size_type arg1 ;
+  std::vector< ISample * >::value_type arg2 = (std::vector< ISample * >::value_type) 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_swig_dummy_type_isample_vector",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_swig_dummy_type_isample_vector" "', argument " "1"" of type '" "std::vector< ISample * >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< ISample * >::size_type >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_swig_dummy_type_isample_vector" "', argument " "2"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample * >::value_type >(argp2);
+  result = (std::vector< ISample * > *)new std::vector< ISample * >(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_isample_vector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_swig_dummy_type_isample_vector__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_swig_dummy_type_isample_vector__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_swig_dummy_type_isample_vector__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISample, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_swig_dummy_type_isample_vector__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_swig_dummy_type_isample_vector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::vector()\n"
+    "    std::vector< ISample * >::vector(std::vector< ISample * > const &)\n"
+    "    std::vector< ISample * >::vector(std::vector< ISample * >::size_type)\n"
+    "    std::vector< ISample * >::vector(std::vector< ISample * >::size_type,std::vector< ISample * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::value_type arg2 = (std::vector< ISample * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_push_back" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "swig_dummy_type_isample_vector_push_back" "', argument " "2"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample * >::value_type >(argp2);
+  (arg1)->push_back(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_front" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (std::vector< ISample * >::value_type)((std::vector< ISample * > const *)arg1)->front();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_back" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = (std::vector< ISample * >::value_type)((std::vector< ISample * > const *)arg1)->back();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::size_type arg2 ;
+  std::vector< ISample * >::value_type arg3 = (std::vector< ISample * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_assign" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector_assign" "', argument " "2"" of type '" "std::vector< ISample * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_isample_vector_assign" "', argument " "3"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample * >::value_type >(argp3);
+  (arg1)->assign(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::size_type arg2 ;
+  std::vector< ISample * >::value_type arg3 = (std::vector< ISample * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_resize" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector_resize" "', argument " "2"" of type '" "std::vector< ISample * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_isample_vector_resize" "', argument " "3"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample * >::value_type >(argp3);
+  (arg1)->resize(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_isample_vector_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ISample, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_isample_vector_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_isample_vector_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::resize(std::vector< ISample * >::size_type)\n"
+    "    std::vector< ISample * >::resize(std::vector< ISample * >::size_type,std::vector< ISample * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::iterator arg2 ;
+  std::vector< ISample * >::value_type arg3 = (std::vector< ISample * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< ISample * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_isample_vector_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "3"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample * >::value_type >(argp3);
+  result = std_vector_Sl_ISample_Sm__Sg__insert__SWIG_0(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::iterator arg2 ;
+  std::vector< ISample * >::size_type arg3 ;
+  std::vector< ISample * >::value_type arg4 = (std::vector< ISample * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:swig_dummy_type_isample_vector_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample * >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "3"" of type '" "std::vector< ISample * >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample * >::size_type >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "swig_dummy_type_isample_vector_insert" "', argument " "4"" of type '" "std::vector< ISample * >::value_type""'"); 
+  }
+  arg4 = reinterpret_cast< std::vector< ISample * >::value_type >(argp4);
+  std_vector_Sl_ISample_Sm__Sg__insert__SWIG_1(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter) != 0));
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ISample, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_isample_vector_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample*,std::allocator< ISample * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample * >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          void *vptr = 0;
+          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_ISample, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_swig_dummy_type_isample_vector_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_isample_vector_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample * >::insert(std::vector< ISample * >::iterator,std::vector< ISample * >::value_type)\n"
+    "    std::vector< ISample * >::insert(std::vector< ISample * >::iterator,std::vector< ISample * >::size_type,std::vector< ISample * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  std::vector< ISample * >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_isample_vector_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_reserve" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_isample_vector_reserve" "', argument " "2"" of type '" "std::vector< ISample * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample * >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_isample_vector_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_isample_vector_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_isample_vector_capacity" "', argument " "1"" of type '" "std::vector< ISample * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  result = ((std::vector< ISample * > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_swig_dummy_type_isample_vector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample * > *arg1 = (std::vector< ISample * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_swig_dummy_type_isample_vector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_swig_dummy_type_isample_vector" "', argument " "1"" of type '" "std::vector< ISample * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample * > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *swig_dummy_type_isample_vector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_iterator" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_ISample_SS_const_Sm__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___nonzero__" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (bool)std_vector_Sl_ISample_SS_const_Sm__Sg____nonzero__((std::vector< ISample const * > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___bool__" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (bool)std_vector_Sl_ISample_SS_const_Sm__Sg____bool__((std::vector< ISample const * > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___len__" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = std_vector_Sl_ISample_SS_const_Sm__Sg____len__((std::vector< ISample const * > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::difference_type arg2 ;
+  std::vector< ISample const * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< ISample const *,std::allocator< ISample const * > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___getslice__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector___getslice__" "', argument " "2"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_const_isample_vector___getslice__" "', argument " "3"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample const * >::difference_type >(val3);
+  try {
+    result = (std::vector< ISample const *,std::allocator< ISample const * > > *)std_vector_Sl_ISample_SS_const_Sm__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::difference_type arg2 ;
+  std::vector< ISample const * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "2"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "3"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample const * >::difference_type >(val3);
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::difference_type arg2 ;
+  std::vector< ISample const * >::difference_type arg3 ;
+  std::vector< ISample const *,std::allocator< ISample const * > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:swig_dummy_type_const_isample_vector___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "2"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "3"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample const * >::difference_type >(val3);
+  {
+    std::vector< ISample const*,std::allocator< ISample const * > > *ptr = (std::vector< ISample const*,std::allocator< ISample const * > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "4"" of type '" "std::vector< ISample const *,std::allocator< ISample const * > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "swig_dummy_type_const_isample_vector___setslice__" "', argument " "4"" of type '" "std::vector< ISample const *,std::allocator< ISample const * > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< ISample const *,std::allocator< ISample const * > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_swig_dummy_type_const_isample_vector___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_swig_dummy_type_const_isample_vector___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_const_isample_vector___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::__setslice__(std::vector< ISample const * >::difference_type,std::vector< ISample const * >::difference_type)\n"
+    "    std::vector< ISample const * >::__setslice__(std::vector< ISample const * >::difference_type,std::vector< ISample const * >::difference_type,std::vector< ISample const *,std::allocator< ISample const * > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::difference_type arg2 ;
+  std::vector< ISample const * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___delslice__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector___delslice__" "', argument " "2"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_const_isample_vector___delslice__" "', argument " "3"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample const * >::difference_type >(val3);
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___delitem__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector___delitem__" "', argument " "2"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::difference_type >(val2);
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample const *,std::allocator< ISample const * > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___getitem__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< ISample const *,std::allocator< ISample const * > > *)std_vector_Sl_ISample_SS_const_Sm__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< ISample const *,std::allocator< ISample const * > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< ISample const*,std::allocator< ISample const * > > *ptr = (std::vector< ISample const*,std::allocator< ISample const * > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "3"" of type '" "std::vector< ISample const *,std::allocator< ISample const * > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "3"" of type '" "std::vector< ISample const *,std::allocator< ISample const * > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< ISample const *,std::allocator< ISample const * > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___delitem__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_const_isample_vector___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_const_isample_vector___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_const_isample_vector___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::__delitem__(std::vector< ISample const * >::difference_type)\n"
+    "    std::vector< ISample const * >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample const * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___getitem__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector___getitem__" "', argument " "2"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::difference_type >(val2);
+  try {
+    result = (std::vector< ISample const * >::value_type)std_vector_Sl_ISample_SS_const_Sm__Sg____getitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_const_isample_vector___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_const_isample_vector___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_const_isample_vector___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::__getitem__(PySliceObject *)\n"
+    "    std::vector< ISample const * >::__getitem__(std::vector< ISample const * >::difference_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::difference_type arg2 ;
+  std::vector< ISample const * >::value_type arg3 = (std::vector< ISample const * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "2"" of type '" "std::vector< ISample const * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::difference_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_const_isample_vector___setitem__" "', argument " "3"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp3);
+  try {
+    std_vector_Sl_ISample_SS_const_Sm__Sg____setitem____SWIG_2(arg1,arg2,(ISample const *)arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_const_isample_vector___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_const_isample_vector___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ISample, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_const_isample_vector___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_const_isample_vector___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::__setitem__(PySliceObject *,std::vector< ISample const *,std::allocator< ISample const * > > const &)\n"
+    "    std::vector< ISample const * >::__setitem__(PySliceObject *)\n"
+    "    std::vector< ISample const * >::__setitem__(std::vector< ISample const * >::difference_type,std::vector< ISample const * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_pop" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  try {
+    result = (std::vector< ISample const * >::value_type)std_vector_Sl_ISample_SS_const_Sm__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::value_type arg2 = (std::vector< ISample const * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_append" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "swig_dummy_type_const_isample_vector_append" "', argument " "2"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp2);
+  std_vector_Sl_ISample_SS_const_Sm__Sg__append(arg1,(ISample const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_const_isample_vector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_swig_dummy_type_const_isample_vector")) SWIG_fail;
+  result = (std::vector< ISample const * > *)new std::vector< ISample const * >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_const_isample_vector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_swig_dummy_type_const_isample_vector",&obj0)) SWIG_fail;
+  {
+    std::vector< ISample const*,std::allocator< ISample const * > > *ptr = (std::vector< ISample const*,std::allocator< ISample const * > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_swig_dummy_type_const_isample_vector" "', argument " "1"" of type '" "std::vector< ISample const * > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_swig_dummy_type_const_isample_vector" "', argument " "1"" of type '" "std::vector< ISample const * > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< ISample const * > *)new std::vector< ISample const * >((std::vector< ISample const * > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_empty" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (bool)((std::vector< ISample const * > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_size" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = ((std::vector< ISample const * > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_swap" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "swig_dummy_type_const_isample_vector_swap" "', argument " "2"" of type '" "std::vector< ISample const * > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "swig_dummy_type_const_isample_vector_swap" "', argument " "2"" of type '" "std::vector< ISample const * > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample const * > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_begin" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample const * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_end" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample const * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_rbegin" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample const * >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_rend" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample const * >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_clear" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< ISample const * > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_get_allocator" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = ((std::vector< ISample const * > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< ISample const * >::allocator_type(static_cast< const std::vector< ISample const * >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_ISample_const_p_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_const_isample_vector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_swig_dummy_type_const_isample_vector",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_swig_dummy_type_const_isample_vector" "', argument " "1"" of type '" "std::vector< ISample const * >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< ISample const * >::size_type >(val1);
+  result = (std::vector< ISample const * > *)new std::vector< ISample const * >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_pop_back" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_resize" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector_resize" "', argument " "2"" of type '" "std::vector< ISample const * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample const * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_ISample_SS_const_Sm__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample const * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::iterator arg2 ;
+  std::vector< ISample const * >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< ISample const * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "3"" of type '" "std::vector< ISample const * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_erase" "', argument " "3"" of type '" "std::vector< ISample const * >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_ISample_SS_const_Sm__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample const * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_swig_dummy_type_const_isample_vector_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_swig_dummy_type_const_isample_vector_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_const_isample_vector_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::erase(std::vector< ISample const * >::iterator)\n"
+    "    std::vector< ISample const * >::erase(std::vector< ISample const * >::iterator,std::vector< ISample const * >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_const_isample_vector__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * >::size_type arg1 ;
+  std::vector< ISample const * >::value_type arg2 = (std::vector< ISample const * >::value_type) 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< ISample const * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_swig_dummy_type_const_isample_vector",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_swig_dummy_type_const_isample_vector" "', argument " "1"" of type '" "std::vector< ISample const * >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< ISample const * >::size_type >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_swig_dummy_type_const_isample_vector" "', argument " "2"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp2);
+  result = (std::vector< ISample const * > *)new std::vector< ISample const * >(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_swig_dummy_type_const_isample_vector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_swig_dummy_type_const_isample_vector__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_swig_dummy_type_const_isample_vector__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_swig_dummy_type_const_isample_vector__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISample, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_swig_dummy_type_const_isample_vector__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_swig_dummy_type_const_isample_vector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::vector()\n"
+    "    std::vector< ISample const * >::vector(std::vector< ISample const * > const &)\n"
+    "    std::vector< ISample const * >::vector(std::vector< ISample const * >::size_type)\n"
+    "    std::vector< ISample const * >::vector(std::vector< ISample const * >::size_type,std::vector< ISample const * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::value_type arg2 = (std::vector< ISample const * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_push_back" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "swig_dummy_type_const_isample_vector_push_back" "', argument " "2"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp2);
+  (arg1)->push_back(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_front" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (std::vector< ISample const * >::value_type)((std::vector< ISample const * > const *)arg1)->front();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_back" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = (std::vector< ISample const * >::value_type)((std::vector< ISample const * > const *)arg1)->back();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::size_type arg2 ;
+  std::vector< ISample const * >::value_type arg3 = (std::vector< ISample const * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_assign" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector_assign" "', argument " "2"" of type '" "std::vector< ISample const * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_const_isample_vector_assign" "', argument " "3"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp3);
+  (arg1)->assign(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::size_type arg2 ;
+  std::vector< ISample const * >::value_type arg3 = (std::vector< ISample const * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_resize" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector_resize" "', argument " "2"" of type '" "std::vector< ISample const * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_const_isample_vector_resize" "', argument " "3"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp3);
+  (arg1)->resize(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_swig_dummy_type_const_isample_vector_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ISample, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_const_isample_vector_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_const_isample_vector_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::resize(std::vector< ISample const * >::size_type)\n"
+    "    std::vector< ISample const * >::resize(std::vector< ISample const * >::size_type,std::vector< ISample const * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::iterator arg2 ;
+  std::vector< ISample const * >::value_type arg3 = (std::vector< ISample const * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< ISample const * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:swig_dummy_type_const_isample_vector_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "3"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp3);
+  result = std_vector_Sl_ISample_SS_const_Sm__Sg__insert__SWIG_0(arg1,arg2,(ISample const *)arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< ISample const * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::iterator arg2 ;
+  std::vector< ISample const * >::size_type arg3 ;
+  std::vector< ISample const * >::value_type arg4 = (std::vector< ISample const * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:swig_dummy_type_const_isample_vector_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "2"" of type '" "std::vector< ISample const * >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "3"" of type '" "std::vector< ISample const * >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< ISample const * >::size_type >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "swig_dummy_type_const_isample_vector_insert" "', argument " "4"" of type '" "std::vector< ISample const * >::value_type""'"); 
+  }
+  arg4 = reinterpret_cast< std::vector< ISample const * >::value_type >(argp4);
+  std_vector_Sl_ISample_SS_const_Sm__Sg__insert__SWIG_1(arg1,arg2,arg3,(ISample const *)arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter) != 0));
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_ISample, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_swig_dummy_type_const_isample_vector_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< ISample const*,std::allocator< ISample const * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< ISample const * >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          void *vptr = 0;
+          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_ISample, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_swig_dummy_type_const_isample_vector_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'swig_dummy_type_const_isample_vector_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< ISample const * >::insert(std::vector< ISample const * >::iterator,std::vector< ISample const * >::value_type)\n"
+    "    std::vector< ISample const * >::insert(std::vector< ISample const * >::iterator,std::vector< ISample const * >::size_type,std::vector< ISample const * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  std::vector< ISample const * >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:swig_dummy_type_const_isample_vector_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_reserve" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "swig_dummy_type_const_isample_vector_reserve" "', argument " "2"" of type '" "std::vector< ISample const * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< ISample const * >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_swig_dummy_type_const_isample_vector_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:swig_dummy_type_const_isample_vector_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "swig_dummy_type_const_isample_vector_capacity" "', argument " "1"" of type '" "std::vector< ISample const * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  result = ((std::vector< ISample const * > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_swig_dummy_type_const_isample_vector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< ISample const * > *arg1 = (std::vector< ISample const * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_swig_dummy_type_const_isample_vector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_swig_dummy_type_const_isample_vector" "', argument " "1"" of type '" "std::vector< ISample const * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< ISample const * > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *swig_dummy_type_const_isample_vector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IChiSquaredModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IChiSquaredModule",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IChiSquaredModule" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IChiSquaredModule *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_clone" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IChiSquaredModule *)((IChiSquaredModule const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getSquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ISquaredFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getSquaredFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (ISquaredFunction *)((IChiSquaredModule const *)arg1)->getSquaredFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  ISquaredFunction *arg2 = (ISquaredFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setChiSquaredFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction *""'"); 
+  }
+  arg2 = reinterpret_cast< ISquaredFunction * >(argp2);
+  (arg1)->setChiSquaredFunction(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  ISquaredFunction *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setChiSquaredFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ISquaredFunction,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setChiSquaredFunction" "', argument " "2"" of type '" "ISquaredFunction const &""'"); 
+  }
+  arg2 = reinterpret_cast< ISquaredFunction * >(argp2);
+  (arg1)->setChiSquaredFunction((ISquaredFunction const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setChiSquaredFunction(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_ISquaredFunction, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IChiSquaredModule_setChiSquaredFunction__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IChiSquaredModule_setChiSquaredFunction'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IChiSquaredModule::setChiSquaredFunction(ISquaredFunction *)\n"
+    "    IChiSquaredModule::setChiSquaredFunction(ISquaredFunction const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IIntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IIntensityNormalizer *)((IChiSquaredModule const *)arg1)->getIntensityNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IIntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IIntensityNormalizer *)(arg1)->getIntensityNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityNormalizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IChiSquaredModule_getIntensityNormalizer__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IChiSquaredModule_getIntensityNormalizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IChiSquaredModule::getIntensityNormalizer() const\n"
+    "    IChiSquaredModule::getIntensityNormalizer()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setIntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IIntensityNormalizer *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setIntensityNormalizer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IIntensityNormalizer,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "2"" of type '" "IIntensityNormalizer const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setIntensityNormalizer" "', argument " "2"" of type '" "IIntensityNormalizer const &""'"); 
+  }
+  arg2 = reinterpret_cast< IIntensityNormalizer * >(argp2);
+  (arg1)->setIntensityNormalizer((IIntensityNormalizer const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_getIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IIntensityFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IChiSquaredModule_getIntensityFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_getIntensityFunction" "', argument " "1"" of type '" "IChiSquaredModule const *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  result = (IIntensityFunction *)((IChiSquaredModule const *)arg1)->getIntensityFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_setIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  IIntensityFunction *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IChiSquaredModule_setIntensityFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IIntensityFunction,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "2"" of type '" "IIntensityFunction const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_setIntensityFunction" "', argument " "2"" of type '" "IIntensityFunction const &""'"); 
+  }
+  arg2 = reinterpret_cast< IIntensityFunction * >(argp2);
+  (arg1)->setIntensityFunction((IIntensityFunction const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IChiSquaredModule_processFitElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IChiSquaredModule *arg1 = (IChiSquaredModule *) 0 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg2 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IChiSquaredModule_processFitElements",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IChiSquaredModule_processFitElements" "', argument " "1"" of type '" "IChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< IChiSquaredModule * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  (arg1)->processFitElements(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IChiSquaredModule_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IChiSquaredModule, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IObserver *arg1 = (IObserver *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IObserver > tempshared1 ;
+  std::shared_ptr< IObserver > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IObserver",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IObserver" "', argument " "1"" of type '" "IObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IObserver > * >(argp1);
+      arg1 = const_cast< IObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IObserver > * >(argp1);
+      arg1 = const_cast< IObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  (void)arg1; delete smartarg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IObserver_notify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IObserver *arg1 = (IObserver *) 0 ;
+  IObservable *arg2 = (IObservable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IObserver > tempshared1 ;
+  std::shared_ptr< IObserver > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IObserver_notify",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IObserver_notify" "', argument " "1"" of type '" "IObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IObserver > * >(argp1);
+      arg1 = const_cast< IObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IObserver > * >(argp1);
+      arg1 = const_cast< IObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IObservable, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IObserver_notify" "', argument " "2"" of type '" "IObservable *""'"); 
+  }
+  arg2 = reinterpret_cast< IObservable * >(argp2);
+  (arg1)->notify(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IObserver_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__shared_ptrT_IObserver_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IObservable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IObservable *arg1 = (IObservable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IObservable",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IObservable, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IObservable" "', argument " "1"" of type '" "IObservable *""'"); 
+  }
+  arg1 = reinterpret_cast< IObservable * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IObservable_attachObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IObservable *arg1 = (IObservable *) 0 ;
+  IObservable::observer_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IObservable_attachObserver",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IObservable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IObservable_attachObserver" "', argument " "1"" of type '" "IObservable *""'"); 
+  }
+  arg1 = reinterpret_cast< IObservable * >(argp1);
+  {
+    int newmem = 0;
+    res2 = SWIG_ConvertPtrAndOwn(obj1, &argp2, SWIGTYPE_p_std__shared_ptrT_IObserver_t,  0 , &newmem);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IObservable_attachObserver" "', argument " "2"" of type '" "IObservable::observer_t""'"); 
+    }
+    if (argp2) arg2 = *(reinterpret_cast< IObservable::observer_t * >(argp2));
+    if (newmem & SWIG_CAST_NEW_MEMORY) delete reinterpret_cast< IObservable::observer_t * >(argp2);
+  }
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IObservable::attachObserver(arg2);
+    } else {
+      (arg1)->attachObserver(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IObservable_notifyObservers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IObservable *arg1 = (IObservable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IObservable_notifyObservers",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IObservable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IObservable_notifyObservers" "', argument " "1"" of type '" "IObservable *""'"); 
+  }
+  arg1 = reinterpret_cast< IObservable * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IObservable::notifyObservers();
+    } else {
+      (arg1)->notifyObservers();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IObservable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyObject * obj0 = 0 ;
+  IObservable *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IObservable",&obj0)) SWIG_fail;
+  arg1 = obj0;
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IObservable *)new SwigDirector_IObservable(arg1); 
+  } else {
+    result = (IObservable *)new IObservable(); 
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IObservable, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_IObservable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IObservable *arg1 = (IObservable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_IObservable",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IObservable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IObservable" "', argument " "1"" of type '" "IObservable *""'"); 
+  }
+  arg1 = reinterpret_cast< IObservable * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IObservable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IObservable, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  int arg2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IFitObserver *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IFitObserver",&obj0,&obj1)) SWIG_fail;
+  arg1 = obj0;
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IFitObserver" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IFitObserver *)new SwigDirector_IFitObserver(arg1,arg2); 
+  } else {
+    result = (IFitObserver *)new IFitObserver(arg2); 
+  }
+  
+  {
+    std::shared_ptr<  IFitObserver > *smartresult = result ? new std::shared_ptr<  IFitObserver >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFitObserver_notify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
+  IObservable *arg2 = (IObservable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFitObserver_notify",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitObserver_notify" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IObservable, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitObserver_notify" "', argument " "2"" of type '" "IObservable *""'"); 
+  }
+  arg2 = reinterpret_cast< IObservable * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IFitObserver::notify(arg2);
+    } else {
+      (arg1)->notify(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFitObserver_update(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
+  FitSuite *arg2 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFitObserver_update",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitObserver_update" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitObserver_update" "', argument " "2"" of type '" "FitSuite *""'"); 
+  }
+  arg2 = reinterpret_cast< FitSuite * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IFitObserver::update(arg2);
+    } else {
+      (arg1)->update(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFitObserver",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFitObserver" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  (void)arg1; delete smartarg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_IFitObserver(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitObserver *arg1 = (IFitObserver *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IFitObserver > tempshared1 ;
+  std::shared_ptr< IFitObserver > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_IFitObserver",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IFitObserver" "', argument " "1"" of type '" "IFitObserver *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IFitObserver > * >(argp1);
+      arg1 = const_cast< IFitObserver * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFitObserver_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__shared_ptrT_IFitObserver_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IFitStrategy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFitStrategy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFitStrategy" "', argument " "1"" of type '" "IFitStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFitStrategy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFitStrategy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFitStrategy_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_clone" "', argument " "1"" of type '" "IFitStrategy const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  result = (IFitStrategy *)((IFitStrategy const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFitStrategy_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  FitSuiteImpl *arg2 = (FitSuiteImpl *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFitStrategy_init",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_init" "', argument " "1"" of type '" "IFitStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FitSuiteImpl, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFitStrategy_init" "', argument " "2"" of type '" "FitSuiteImpl *""'"); 
+  }
+  arg2 = reinterpret_cast< FitSuiteImpl * >(argp2);
+  (arg1)->init(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFitStrategy_execute(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitStrategy *arg1 = (IFitStrategy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFitStrategy_execute",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitStrategy_execute" "', argument " "1"" of type '" "IFitStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< IFitStrategy * >(argp1);
+  (arg1)->execute();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFitStrategy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFitStrategy, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitStrategyDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitStrategyDefault *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FitStrategyDefault")) SWIG_fail;
+  result = (FitStrategyDefault *)new FitStrategyDefault();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitStrategyDefault, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitStrategyDefault_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitStrategyDefault *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitStrategyDefault_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitStrategyDefault_clone" "', argument " "1"" of type '" "FitStrategyDefault const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
+  result = (FitStrategyDefault *)((FitStrategyDefault const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitStrategyDefault, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitStrategyDefault_execute(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitStrategyDefault_execute",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitStrategyDefault_execute" "', argument " "1"" of type '" "FitStrategyDefault *""'"); 
+  }
+  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
+  (arg1)->execute();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitStrategyDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitStrategyDefault *arg1 = (FitStrategyDefault *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitStrategyDefault",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitStrategyDefault, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitStrategyDefault" "', argument " "1"" of type '" "FitStrategyDefault *""'"); 
+  }
+  arg1 = reinterpret_cast< FitStrategyDefault * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FitStrategyDefault_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitStrategyDefault, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IIntensityFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IIntensityFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IIntensityFunction" "', argument " "1"" of type '" "IIntensityFunction *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IIntensityFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IIntensityFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IIntensityFunction_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityFunction_clone" "', argument " "1"" of type '" "IIntensityFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
+  result = (IIntensityFunction *)((IIntensityFunction const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IIntensityFunction_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityFunction *arg1 = (IIntensityFunction *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityFunction_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityFunction_evaluate" "', argument " "1"" of type '" "IIntensityFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityFunction * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IIntensityFunction_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((IIntensityFunction const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IIntensityFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IIntensityFunction, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IntensityFunctionLog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityFunctionLog",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityFunctionLog" "', argument " "1"" of type '" "IntensityFunctionLog *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityFunctionLog_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IntensityFunctionLog *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityFunctionLog_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionLog_clone" "', argument " "1"" of type '" "IntensityFunctionLog const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
+  result = (IntensityFunctionLog *)((IntensityFunctionLog const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityFunctionLog_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionLog *arg1 = (IntensityFunctionLog *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityFunctionLog_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionLog, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionLog_evaluate" "', argument " "1"" of type '" "IntensityFunctionLog const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityFunctionLog * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityFunctionLog_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((IntensityFunctionLog const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityFunctionLog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionLog *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityFunctionLog")) SWIG_fail;
+  result = (IntensityFunctionLog *)new IntensityFunctionLog();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionLog, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IntensityFunctionLog_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityFunctionLog, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IntensityFunctionSqrt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityFunctionSqrt",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityFunctionSqrt" "', argument " "1"" of type '" "IntensityFunctionSqrt *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityFunctionSqrt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IntensityFunctionSqrt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityFunctionSqrt_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionSqrt_clone" "', argument " "1"" of type '" "IntensityFunctionSqrt const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
+  result = (IntensityFunctionSqrt *)((IntensityFunctionSqrt const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityFunctionSqrt_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionSqrt *arg1 = (IntensityFunctionSqrt *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityFunctionSqrt_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityFunctionSqrt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityFunctionSqrt_evaluate" "', argument " "1"" of type '" "IntensityFunctionSqrt const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityFunctionSqrt * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityFunctionSqrt_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((IntensityFunctionSqrt const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityFunctionSqrt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityFunctionSqrt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityFunctionSqrt")) SWIG_fail;
+  result = (IntensityFunctionSqrt *)new IntensityFunctionSqrt();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityFunctionSqrt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IntensityFunctionSqrt_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityFunctionSqrt, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IIntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IIntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IIntensityNormalizer" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IIntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IIntensityNormalizer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_clone" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  result = (IIntensityNormalizer *)((IIntensityNormalizer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_createNormalizedData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *)((IIntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_apply",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_apply" "', argument " "1"" of type '" "IIntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IIntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((IIntensityNormalizer const *)arg1)->apply(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IIntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IIntensityNormalizer *arg1 = (IIntensityNormalizer *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IIntensityNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IIntensityNormalizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IIntensityNormalizer * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IIntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setMaximumIntensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IIntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IIntensityNormalizer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IntensityNormalizer",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityNormalizer" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (IntensityNormalizer *)new IntensityNormalizer(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IntensityNormalizer",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityNormalizer" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (IntensityNormalizer *)new IntensityNormalizer(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityNormalizer")) SWIG_fail;
+  result = (IntensityNormalizer *)new IntensityNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityNormalizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_IntensityNormalizer__SWIG_2(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_IntensityNormalizer__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_IntensityNormalizer__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IntensityNormalizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IntensityNormalizer::IntensityNormalizer(double,double)\n"
+    "    IntensityNormalizer::IntensityNormalizer(double)\n"
+    "    IntensityNormalizer::IntensityNormalizer()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IntensityNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityNormalizer" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IntensityNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityNormalizer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_clone" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  result = (IntensityNormalizer *)((IntensityNormalizer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_createNormalizedData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_createNormalizedData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_createNormalizedData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *)((IntensityNormalizer const *)arg1)->createNormalizedData((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_apply",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_apply" "', argument " "1"" of type '" "IntensityNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityNormalizer_apply" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((IntensityNormalizer const *)arg1)->apply(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityNormalizer *arg1 = (IntensityNormalizer *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityNormalizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityNormalizer * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setMaximumIntensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IntensityNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityNormalizer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_IntensityScaleAndShiftNormalizer",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IntensityScaleAndShiftNormalizer",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityScaleAndShiftNormalizer")) SWIG_fail;
+  result = (IntensityScaleAndShiftNormalizer *)new IntensityScaleAndShiftNormalizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityScaleAndShiftNormalizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_2(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_IntensityScaleAndShiftNormalizer__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IntensityScaleAndShiftNormalizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double,double)\n"
+    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double)\n"
+    "    IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IntensityScaleAndShiftNormalizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityScaleAndShiftNormalizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityScaleAndShiftNormalizer" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityScaleAndShiftNormalizer_setMaximumIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityScaleAndShiftNormalizer_setMaximumIntensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setMaximumIntensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityScaleAndShiftNormalizer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityScaleAndShiftNormalizer *arg1 = (IntensityScaleAndShiftNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IntensityScaleAndShiftNormalizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityScaleAndShiftNormalizer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityScaleAndShiftNormalizer_clone" "', argument " "1"" of type '" "IntensityScaleAndShiftNormalizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityScaleAndShiftNormalizer * >(argp1);
+  result = (IntensityScaleAndShiftNormalizer *)((IntensityScaleAndShiftNormalizer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityScaleAndShiftNormalizer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IntensityScaleAndShiftNormalizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityScaleAndShiftNormalizer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_ISquaredFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ISquaredFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ISquaredFunction" "', argument " "1"" of type '" "ISquaredFunction *""'"); 
+  }
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISquaredFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ISquaredFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISquaredFunction_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_clone" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  result = (ISquaredFunction *)((ISquaredFunction const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ISquaredFunction_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ISquaredFunction_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ISquaredFunction_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISquaredFunction *arg1 = (ISquaredFunction *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISquaredFunction_calculateSquaredError",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISquaredFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "1"" of type '" "ISquaredFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISquaredFunction * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISquaredFunction_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((ISquaredFunction const *)arg1)->calculateSquaredError(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISquaredFunction_calculateSquaredError(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ISquaredFunction_calculateSquaredError__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISquaredFunction, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_ISquaredFunction_calculateSquaredError__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ISquaredFunction_calculateSquaredError'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ISquaredFunction::calculateSquaredError(double,double) const\n"
+    "    ISquaredFunction::calculateSquaredError(double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *ISquaredFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ISquaredFunction, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SquaredFunctionDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionDefault *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SquaredFunctionDefault")) SWIG_fail;
+  result = (SquaredFunctionDefault *)new SquaredFunctionDefault();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionDefault, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionDefault(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionDefault",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionDefault" "', argument " "1"" of type '" "SquaredFunctionDefault *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SquaredFunctionDefault *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionDefault_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_clone" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  result = (SquaredFunctionDefault *)((SquaredFunctionDefault const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionDefault_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionDefault_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionDefault_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionDefault *arg1 = (SquaredFunctionDefault *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SquaredFunctionDefault_calculateSquaredError",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionDefault, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionDefault const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionDefault * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionDefault_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((SquaredFunctionDefault const *)arg1)->calculateSquaredError(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionDefault_calculateSquaredError(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SquaredFunctionDefault, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SquaredFunctionDefault, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_SquaredFunctionDefault_calculateSquaredError__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SquaredFunctionDefault_calculateSquaredError'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SquaredFunctionDefault::calculateSquaredError(double,double) const\n"
+    "    SquaredFunctionDefault::calculateSquaredError(double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *SquaredFunctionDefault_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionDefault, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionSimError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionSimError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionSimError" "', argument " "1"" of type '" "SquaredFunctionSimError *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SquaredFunctionSimError *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionSimError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_clone" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  result = (SquaredFunctionSimError *)((SquaredFunctionSimError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSimError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSimError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSimError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionSimError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSimError *arg1 = (SquaredFunctionSimError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSimError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSimError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionSimError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSimError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSimError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSimError const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SquaredFunctionSimError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionSimError, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionMeanSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionMeanSquaredError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionMeanSquaredError" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SquaredFunctionMeanSquaredError *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionMeanSquaredError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_clone" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  result = (SquaredFunctionMeanSquaredError *)((SquaredFunctionMeanSquaredError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionMeanSquaredError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionMeanSquaredError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionMeanSquaredError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionMeanSquaredError *arg1 = (SquaredFunctionMeanSquaredError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionMeanSquaredError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionMeanSquaredError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionMeanSquaredError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionMeanSquaredError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionMeanSquaredError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionMeanSquaredError const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SquaredFunctionMeanSquaredError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionMeanSquaredError, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionSystematicError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionSystematicError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionSystematicError" "', argument " "1"" of type '" "SquaredFunctionSystematicError *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SquaredFunctionSystematicError *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionSystematicError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_clone" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  result = (SquaredFunctionSystematicError *)((SquaredFunctionSystematicError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSystematicError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSystematicError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSystematicError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionSystematicError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionSystematicError *arg1 = (SquaredFunctionSystematicError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionSystematicError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionSystematicError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionSystematicError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionSystematicError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionSystematicError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionSystematicError const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SquaredFunctionSystematicError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionSystematicError, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_SquaredFunctionGaussianError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SquaredFunctionGaussianError",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquaredFunctionGaussianError" "', argument " "1"" of type '" "SquaredFunctionGaussianError *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SquaredFunctionGaussianError *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SquaredFunctionGaussianError_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_clone" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  result = (SquaredFunctionGaussianError *)((SquaredFunctionGaussianError const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredDifference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionGaussianError_calculateSquaredDifference",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionGaussianError_calculateSquaredDifference" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionGaussianError const *)arg1)->calculateSquaredDifference(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SquaredFunctionGaussianError_calculateSquaredError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SquaredFunctionGaussianError *arg1 = (SquaredFunctionGaussianError *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SquaredFunctionGaussianError_calculateSquaredError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SquaredFunctionGaussianError, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "1"" of type '" "SquaredFunctionGaussianError const *""'"); 
+  }
+  arg1 = reinterpret_cast< SquaredFunctionGaussianError * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SquaredFunctionGaussianError_calculateSquaredError" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((SquaredFunctionGaussianError const *)arg1)->calculateSquaredError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SquaredFunctionGaussianError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquaredFunctionGaussianError, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ChiSquaredModule__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ChiSquaredModule *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_ChiSquaredModule")) SWIG_fail;
+  result = (ChiSquaredModule *)new ChiSquaredModule();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ChiSquaredModule, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ChiSquaredModule__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ChiSquaredModule *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ChiSquaredModule *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_ChiSquaredModule",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_ChiSquaredModule,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ChiSquaredModule" "', argument " "1"" of type '" "ChiSquaredModule const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ChiSquaredModule" "', argument " "1"" of type '" "ChiSquaredModule const &""'"); 
+  }
+  arg1 = reinterpret_cast< ChiSquaredModule * >(argp1);
+  result = (ChiSquaredModule *)new ChiSquaredModule((ChiSquaredModule const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ChiSquaredModule, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ChiSquaredModule(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_ChiSquaredModule__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_ChiSquaredModule, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ChiSquaredModule__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_ChiSquaredModule'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ChiSquaredModule::ChiSquaredModule()\n"
+    "    ChiSquaredModule::ChiSquaredModule(ChiSquaredModule const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ChiSquaredModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ChiSquaredModule *arg1 = (ChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ChiSquaredModule",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ChiSquaredModule, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ChiSquaredModule" "', argument " "1"" of type '" "ChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< ChiSquaredModule * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ChiSquaredModule_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ChiSquaredModule *arg1 = (ChiSquaredModule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ChiSquaredModule *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ChiSquaredModule_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ChiSquaredModule_clone" "', argument " "1"" of type '" "ChiSquaredModule const *""'"); 
+  }
+  arg1 = reinterpret_cast< ChiSquaredModule * >(argp1);
+  result = (ChiSquaredModule *)((ChiSquaredModule const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ChiSquaredModule, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ChiSquaredModule_processFitElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ChiSquaredModule *arg1 = (ChiSquaredModule *) 0 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg2 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::iterator > arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ChiSquaredModule_processFitElements",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ChiSquaredModule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ChiSquaredModule_processFitElements" "', argument " "1"" of type '" "ChiSquaredModule *""'"); 
+  }
+  arg1 = reinterpret_cast< ChiSquaredModule * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ChiSquaredModule_processFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ChiSquaredModule_processFitElements" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::iterator * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  (arg1)->processFitElements(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ChiSquaredModule_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ChiSquaredModule, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitObject__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = 0 ;
+  OutputData< double > *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FitObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FitObject",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitObject" "', argument " "1"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitObject" "', argument " "1"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_FitObject" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitObject" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FitObject" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FitObject *)new FitObject((GISASSimulation const &)*arg1,(OutputData< double > const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitObject, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitObject__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FitObject",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitObject" "', argument " "1"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitObject" "', argument " "1"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_FitObject" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitObject" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (FitObject *)new FitObject((GISASSimulation const &)*arg1,(OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitObject, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitObject(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_FitObject__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FitObject__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FitObject'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitObject::FitObject(GISASSimulation const &,OutputData< double > const &,double)\n"
+    "    FitObject::FitObject(GISASSimulation const &,OutputData< double > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitObject(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitObject",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitObject" "', argument " "1"" of type '" "FitObject *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_realData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitObject_realData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_realData" "', argument " "1"" of type '" "FitObject const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  result = (OutputData< double > *) &((FitObject const *)arg1)->realData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_simulationData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitObject_simulationData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_simulationData" "', argument " "1"" of type '" "FitObject const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  result = (OutputData< double > *) &((FitObject const *)arg1)->simulationData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_chiSquaredMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitObject_chiSquaredMap",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_chiSquaredMap" "', argument " "1"" of type '" "FitObject const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  result = (OutputData< double > *) &((FitObject const *)arg1)->chiSquaredMap();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_simulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  GISASSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitObject_simulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_simulation" "', argument " "1"" of type '" "FitObject const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  result = (GISASSimulation *) &((FitObject const *)arg1)->simulation();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_weight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitObject_weight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_weight" "', argument " "1"" of type '" "FitObject const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  result = (double)((FitObject const *)arg1)->weight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_numberOfFitElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitObject_numberOfFitElements",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_numberOfFitElements" "', argument " "1"" of type '" "FitObject const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  result = ((FitObject const *)arg1)->numberOfFitElements();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_prepareFitElements__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  std::vector< FitElement,std::allocator< FitElement > > *arg2 = 0 ;
+  double arg3 ;
+  IIntensityNormalizer *arg4 = (IIntensityNormalizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:FitObject_prepareFitElements",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_prepareFitElements" "', argument " "1"" of type '" "FitObject *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitObject_prepareFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitObject_prepareFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > > * >(argp2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitObject_prepareFitElements" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_IIntensityNormalizer, 0 |  0 );
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "FitObject_prepareFitElements" "', argument " "4"" of type '" "IIntensityNormalizer *""'"); 
+  }
+  arg4 = reinterpret_cast< IIntensityNormalizer * >(argp4);
+  (arg1)->prepareFitElements(*arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_prepareFitElements__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  std::vector< FitElement,std::allocator< FitElement > > *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitObject_prepareFitElements",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_prepareFitElements" "', argument " "1"" of type '" "FitObject *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitObject_prepareFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitObject_prepareFitElements" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > > * >(argp2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitObject_prepareFitElements" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->prepareFitElements(*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_prepareFitElements(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObject, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_FitObject_prepareFitElements__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitObject, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          void *vptr = 0;
+          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_IIntensityNormalizer, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_FitObject_prepareFitElements__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitObject_prepareFitElements'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitObject::prepareFitElements(std::vector< FitElement,std::allocator< FitElement > > &,double,IIntensityNormalizer *)\n"
+    "    FitObject::prepareFitElements(std::vector< FitElement,std::allocator< FitElement > > &,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitObject_transferToChi2Map(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitObject *arg1 = (FitObject *) 0 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::const_iterator > arg2 ;
+  SwigValueWrapper< std::vector< FitElement,std::allocator< FitElement > >::const_iterator > arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitObject_transferToChi2Map",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitObject_transferToChi2Map" "', argument " "1"" of type '" "FitObject const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitObject * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitObject_transferToChi2Map" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::const_iterator""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitObject_transferToChi2Map" "', argument " "2"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::const_iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::const_iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::const_iterator * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitObject_transferToChi2Map" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::const_iterator""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitObject_transferToChi2Map" "', argument " "3"" of type '" "std::vector< FitElement,std::allocator< FitElement > >::const_iterator""'");
+    } else {
+      std::vector< FitElement,std::allocator< FitElement > >::const_iterator * temp = reinterpret_cast< std::vector< FitElement,std::allocator< FitElement > >::const_iterator * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  ((FitObject const *)arg1)->transferToChi2Map(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FitObject_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitObject, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitOptions *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FitOptions")) SWIG_fail;
+  result = (FitOptions *)new FitOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitOptions, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitOptions *arg1 = (FitOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitOptions",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitOptions, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitOptions" "', argument " "1"" of type '" "FitOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitOptions_derivEpsilon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitOptions *arg1 = (FitOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitOptions_derivEpsilon",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_derivEpsilon" "', argument " "1"" of type '" "FitOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  result = (double)((FitOptions const *)arg1)->derivEpsilon();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitOptions_setDerivEpsilon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitOptions *arg1 = (FitOptions *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitOptions_setDerivEpsilon",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_setDerivEpsilon" "', argument " "1"" of type '" "FitOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitOptions_setDerivEpsilon" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setDerivEpsilon(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitOptions_stepFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitOptions *arg1 = (FitOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitOptions_stepFactor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_stepFactor" "', argument " "1"" of type '" "FitOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  result = (double)((FitOptions const *)arg1)->stepFactor();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitOptions_setStepFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitOptions *arg1 = (FitOptions *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitOptions_setStepFactor",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitOptions_setStepFactor" "', argument " "1"" of type '" "FitOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< FitOptions * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitOptions_setStepFactor" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setStepFactor(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FitOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitOptions, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitParameterLinked__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FitParameterLinked")) SWIG_fail;
+  result = (FitParameterLinked *)new FitParameterLinked();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameterLinked__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  AttLimits *arg3 = 0 ;
+  double arg4 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FitParameterLinked",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitParameterLinked" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameterLinked" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FitParameterLinked" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_FitParameterLinked" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameterLinked" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  arg3 = reinterpret_cast< AttLimits * >(argp3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FitParameterLinked" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FitParameterLinked *)new FitParameterLinked((std::string const &)*arg1,arg2,(AttLimits const &)*arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameterLinked__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  AttLimits *arg3 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FitParameterLinked",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitParameterLinked" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameterLinked" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FitParameterLinked" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_FitParameterLinked" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameterLinked" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  arg3 = reinterpret_cast< AttLimits * >(argp3);
+  result = (FitParameterLinked *)new FitParameterLinked((std::string const &)*arg1,arg2,(AttLimits const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameterLinked__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FitParameterLinked",&obj0,&obj1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitParameterLinked" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameterLinked" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FitParameterLinked" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FitParameterLinked *)new FitParameterLinked((std::string const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameterLinked(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_FitParameterLinked__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FitParameterLinked__SWIG_3(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_AttLimits, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_FitParameterLinked__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_AttLimits, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FitParameterLinked__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FitParameterLinked'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameterLinked::FitParameterLinked()\n"
+    "    FitParameterLinked::FitParameterLinked(std::string const &,double,AttLimits const &,double)\n"
+    "    FitParameterLinked::FitParameterLinked(std::string const &,double,AttLimits const &)\n"
+    "    FitParameterLinked::FitParameterLinked(std::string const &,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitParameterLinked(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterLinked *arg1 = (FitParameterLinked *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitParameterLinked",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterLinked, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitParameterLinked" "', argument " "1"" of type '" "FitParameterLinked *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterLinked * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterLinked_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterLinked *arg1 = (FitParameterLinked *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterLinked_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterLinked_clone" "', argument " "1"" of type '" "FitParameterLinked const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterLinked * >(argp1);
+  result = (FitParameterLinked *)((FitParameterLinked const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterLinked_setValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterLinked *arg1 = (FitParameterLinked *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterLinked_setValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterLinked_setValue" "', argument " "1"" of type '" "FitParameterLinked *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterLinked * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameterLinked_setValue" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setValue(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterLinked_addParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterLinked *arg1 = (FitParameterLinked *) 0 ;
+  RealParameter *arg2 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterLinked_addParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterLinked_addParameter" "', argument " "1"" of type '" "FitParameterLinked *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterLinked * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterLinked_addParameter" "', argument " "2"" of type '" "RealParameter *""'"); 
+  }
+  arg2 = reinterpret_cast< RealParameter * >(argp2);
+  (arg1)->addParameter(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterLinked_addMatchedParametersFromPool__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterLinked *arg1 = (FitParameterLinked *) 0 ;
+  ParameterPool *arg2 = (ParameterPool *) 0 ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitParameterLinked_addMatchedParametersFromPool",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterLinked_addMatchedParametersFromPool" "', argument " "1"" of type '" "FitParameterLinked *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterLinked * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterLinked_addMatchedParametersFromPool" "', argument " "2"" of type '" "ParameterPool const *""'"); 
+  }
+  arg2 = reinterpret_cast< ParameterPool * >(argp2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitParameterLinked_addMatchedParametersFromPool" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterLinked_addMatchedParametersFromPool" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->addMatchedParametersFromPool((ParameterPool const *)arg2,(std::string const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterLinked_addMatchedParametersFromPool__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterLinked *arg1 = (FitParameterLinked *) 0 ;
+  ParameterPool *arg2 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterLinked_addMatchedParametersFromPool",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterLinked_addMatchedParametersFromPool" "', argument " "1"" of type '" "FitParameterLinked *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterLinked * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterLinked_addMatchedParametersFromPool" "', argument " "2"" of type '" "ParameterPool const *""'"); 
+  }
+  arg2 = reinterpret_cast< ParameterPool * >(argp2);
+  (arg1)->addMatchedParametersFromPool((ParameterPool const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterLinked_addMatchedParametersFromPool(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterLinked, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParameterPool, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FitParameterLinked_addMatchedParametersFromPool__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterLinked, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParameterPool, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_FitParameterLinked_addMatchedParametersFromPool__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitParameterLinked_addMatchedParametersFromPool'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameterLinked::addMatchedParametersFromPool(ParameterPool const *,std::string const &)\n"
+    "    FitParameterLinked::addMatchedParametersFromPool(ParameterPool const *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *FitParameterLinked_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitParameterLinked, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitSuite(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FitSuite")) SWIG_fail;
+  result = (FitSuite *)new FitSuite();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitSuite, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitSuite(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitSuite",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitSuite" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addSimulationAndRealData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  OutputData< double > *arg3 = 0 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:FitSuite_addSimulationAndRealData",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg3 = reinterpret_cast< OutputData< double > * >(argp3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->addSimulationAndRealData((GISASSimulation const &)*arg2,(OutputData< double > const &)*arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addSimulationAndRealData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  OutputData< double > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitSuite_addSimulationAndRealData",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg3 = reinterpret_cast< OutputData< double > * >(argp3);
+  (arg1)->addSimulationAndRealData((GISASSimulation const &)*arg2,(OutputData< double > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addSimulationAndRealData__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  IHistogram *arg3 = 0 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:FitSuite_addSimulationAndRealData",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "IHistogram const &""'"); 
+  }
+  arg3 = reinterpret_cast< IHistogram * >(argp3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->addSimulationAndRealData((GISASSimulation const &)*arg2,(IHistogram const &)*arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addSimulationAndRealData__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  IHistogram *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitSuite_addSimulationAndRealData",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "IHistogram const &""'"); 
+  }
+  arg3 = reinterpret_cast< IHistogram * >(argp3);
+  (arg1)->addSimulationAndRealData((GISASSimulation const &)*arg2,(IHistogram const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addSimulationAndRealData__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg3 = 0 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:FitSuite_addSimulationAndRealData",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->addSimulationAndRealData((GISASSimulation const &)*arg2,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addSimulationAndRealData__SWIG_5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitSuite_addSimulationAndRealData",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addSimulationAndRealData" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->addSimulationAndRealData((GISASSimulation const &)*arg2,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addSimulationAndRealData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_FitSuite_addSimulationAndRealData__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IHistogram, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_FitSuite_addSimulationAndRealData__SWIG_3(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_FitSuite_addSimulationAndRealData__SWIG_5(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_FitSuite_addSimulationAndRealData__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IHistogram, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_FitSuite_addSimulationAndRealData__SWIG_2(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_FitSuite_addSimulationAndRealData__SWIG_4(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_addSimulationAndRealData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::addSimulationAndRealData(GISASSimulation const &,OutputData< double > const &,double)\n"
+    "    FitSuite::addSimulationAndRealData(GISASSimulation const &,OutputData< double > const &)\n"
+    "    FitSuite::addSimulationAndRealData(GISASSimulation const &,IHistogram const &,double)\n"
+    "    FitSuite::addSimulationAndRealData(GISASSimulation const &,IHistogram const &)\n"
+    "    FitSuite::addSimulationAndRealData(GISASSimulation const &,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &,double)\n"
+    "    FitSuite::addSimulationAndRealData(GISASSimulation const &,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addFitParameter__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  AttLimits *arg4 = 0 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:FitSuite_addFitParameter",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addFitParameter" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addFitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addFitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitSuite_addFitParameter" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "FitSuite_addFitParameter" "', argument " "4"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addFitParameter" "', argument " "4"" of type '" "AttLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< AttLimits * >(argp4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "FitSuite_addFitParameter" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (FitParameterLinked *)(arg1)->addFitParameter((std::string const &)*arg2,arg3,(AttLimits const &)*arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addFitParameter__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  AttLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:FitSuite_addFitParameter",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addFitParameter" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addFitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addFitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitSuite_addFitParameter" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "FitSuite_addFitParameter" "', argument " "4"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addFitParameter" "', argument " "4"" of type '" "AttLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< AttLimits * >(argp4);
+  result = (FitParameterLinked *)(arg1)->addFitParameter((std::string const &)*arg2,arg3,(AttLimits const &)*arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addFitParameter__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FitParameterLinked *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitSuite_addFitParameter",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addFitParameter" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addFitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addFitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitSuite_addFitParameter" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FitParameterLinked *)(arg1)->addFitParameter((std::string const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterLinked, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addFitParameter(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_FitSuite_addFitParameter__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_AttLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_FitSuite_addFitParameter__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_AttLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_FitSuite_addFitParameter__SWIG_0(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_addFitParameter'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::addFitParameter(std::string const &,double,AttLimits const &,double)\n"
+    "    FitSuite::addFitParameter(std::string const &,double,AttLimits const &)\n"
+    "    FitSuite::addFitParameter(std::string const &,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_setMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  std::string *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:FitSuite_setMinimizer",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_setMinimizer" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "FitSuite_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3,(std::string const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_setMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitSuite_setMinimizer",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_setMinimizer" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuite_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_setMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_setMinimizer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_setMinimizer" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setMinimizer((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_setChiSquaredModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  IChiSquaredModule *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_setChiSquaredModule",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_setChiSquaredModule" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IChiSquaredModule,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_setChiSquaredModule" "', argument " "2"" of type '" "IChiSquaredModule const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_setChiSquaredModule" "', argument " "2"" of type '" "IChiSquaredModule const &""'"); 
+  }
+  arg2 = reinterpret_cast< IChiSquaredModule * >(argp2);
+  (arg1)->setChiSquaredModule((IChiSquaredModule const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_addFitStrategy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  IFitStrategy *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_addFitStrategy",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_addFitStrategy" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFitStrategy,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_addFitStrategy" "', argument " "2"" of type '" "IFitStrategy const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuite_addFitStrategy" "', argument " "2"" of type '" "IFitStrategy const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFitStrategy * >(argp2);
+  (arg1)->addFitStrategy((IFitStrategy const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_setMinimizer__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  IMinimizer *arg2 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_setMinimizer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_setMinimizer" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuite_setMinimizer" "', argument " "2"" of type '" "IMinimizer *""'"); 
+  }
+  arg2 = reinterpret_cast< IMinimizer * >(argp2);
+  (arg1)->setMinimizer(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_setMinimizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IMinimizer, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FitSuite_setMinimizer__SWIG_3(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FitSuite_setMinimizer__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_FitSuite_setMinimizer__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_FitSuite_setMinimizer__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_setMinimizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::setMinimizer(std::string const &,std::string const &,std::string const &)\n"
+    "    FitSuite::setMinimizer(std::string const &,std::string const &)\n"
+    "    FitSuite::setMinimizer(std::string const &)\n"
+    "    FitSuite::setMinimizer(IMinimizer *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_minimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMinimizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_minimizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_minimizer" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (IMinimizer *)((FitSuite const *)arg1)->minimizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_initPrint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_initPrint",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_initPrint" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuite_initPrint" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->initPrint(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_runFit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_runFit",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_runFit" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  (arg1)->runFit();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_numberOfFitObjects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_numberOfFitObjects",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_numberOfFitObjects" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (int)((FitSuite const *)arg1)->numberOfFitObjects();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getRealData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_getRealData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getRealData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuite_getRealData" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IHistogram *)((FitSuite const *)arg1)->getRealData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getRealData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_getRealData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getRealData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (IHistogram *)((FitSuite const *)arg1)->getRealData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getRealData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuite_getRealData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuite_getRealData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_getRealData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::getRealData(size_t) const\n"
+    "    FitSuite::getRealData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getSimulationData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_getSimulationData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getSimulationData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuite_getSimulationData" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IHistogram *)((FitSuite const *)arg1)->getSimulationData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getSimulationData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_getSimulationData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getSimulationData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (IHistogram *)((FitSuite const *)arg1)->getSimulationData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getSimulationData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuite_getSimulationData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuite_getSimulationData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_getSimulationData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::getSimulationData(size_t) const\n"
+    "    FitSuite::getSimulationData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getChiSquaredMap__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_getChiSquaredMap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getChiSquaredMap" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuite_getChiSquaredMap" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IHistogram *)((FitSuite const *)arg1)->getChiSquaredMap(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getChiSquaredMap__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_getChiSquaredMap",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getChiSquaredMap" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (IHistogram *)((FitSuite const *)arg1)->getChiSquaredMap();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getChiSquaredMap(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuite_getChiSquaredMap__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuite_getChiSquaredMap__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_getChiSquaredMap'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::getChiSquaredMap(size_t) const\n"
+    "    FitSuite::getChiSquaredMap() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_fitObjects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitSuiteObjects *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_fitObjects",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_fitObjects" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (FitSuiteObjects *)(arg1)->fitObjects();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_fitParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitParameterSet *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_fitParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_fitParameters" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (FitParameterSet *)(arg1)->fitParameters();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_fitStrategies(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitSuiteStrategies *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_fitStrategies",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_fitStrategies" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (FitSuiteStrategies *)(arg1)->fitStrategies();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitSuiteStrategies, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_isLastIteration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_isLastIteration",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_isLastIteration" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (bool)((FitSuite const *)arg1)->isLastIteration();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_numberOfIterations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_numberOfIterations",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_numberOfIterations" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = ((FitSuite const *)arg1)->numberOfIterations();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_currentStrategyIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_currentStrategyIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_currentStrategyIndex" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = ((FitSuite const *)arg1)->currentStrategyIndex();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_printResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_printResults",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_printResults" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ((FitSuite const *)arg1)->printResults();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_reportResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_reportResults",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_reportResults" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = ((FitSuite const *)arg1)->reportResults();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getChi2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_getChi2",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getChi2" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (double)((FitSuite const *)arg1)->getChi2();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_interruptFitting(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_interruptFitting",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_interruptFitting" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  (arg1)->interruptFitting();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_resetInterrupt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_resetInterrupt",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_resetInterrupt" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  (arg1)->resetInterrupt();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_isInterrupted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_isInterrupted",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_isInterrupted" "', argument " "1"" of type '" "FitSuite *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (bool)(arg1)->isInterrupted();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getRealOutputData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_getRealOutputData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getRealOutputData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuite_getRealOutputData" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (OutputData< double > *)((FitSuite const *)arg1)->getRealOutputData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getRealOutputData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_getRealOutputData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getRealOutputData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (OutputData< double > *)((FitSuite const *)arg1)->getRealOutputData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getRealOutputData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuite_getRealOutputData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuite_getRealOutputData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_getRealOutputData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::getRealOutputData(size_t) const\n"
+    "    FitSuite::getRealOutputData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getSimulationOutputData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_getSimulationOutputData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getSimulationOutputData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuite_getSimulationOutputData" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (OutputData< double > *)((FitSuite const *)arg1)->getSimulationOutputData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getSimulationOutputData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_getSimulationOutputData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getSimulationOutputData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (OutputData< double > *)((FitSuite const *)arg1)->getSimulationOutputData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getSimulationOutputData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuite_getSimulationOutputData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuite_getSimulationOutputData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_getSimulationOutputData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::getSimulationOutputData(size_t) const\n"
+    "    FitSuite::getSimulationOutputData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getChiSquaredOutputData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuite_getChiSquaredOutputData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getChiSquaredOutputData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuite_getChiSquaredOutputData" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (OutputData< double > *)((FitSuite const *)arg1)->getChiSquaredOutputData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getChiSquaredOutputData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuite *arg1 = (FitSuite *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuite_getChiSquaredOutputData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuite, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuite_getChiSquaredOutputData" "', argument " "1"" of type '" "FitSuite const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuite * >(argp1);
+  result = (OutputData< double > *)((FitSuite const *)arg1)->getChiSquaredOutputData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuite_getChiSquaredOutputData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuite_getChiSquaredOutputData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuite, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuite_getChiSquaredOutputData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuite_getChiSquaredOutputData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuite::getChiSquaredOutputData(size_t) const\n"
+    "    FitSuite::getChiSquaredOutputData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *FitSuite_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitSuite, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitSuiteObjects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FitSuiteObjects")) SWIG_fail;
+  result = (FitSuiteObjects *)new FitSuiteObjects();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitSuiteObjects, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitSuiteObjects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitSuiteObjects",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitSuiteObjects" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_add__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  OutputData< double > *arg3 = 0 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:FitSuiteObjects_add",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_add" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuiteObjects_add" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuiteObjects_add" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuiteObjects_add" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuiteObjects_add" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg3 = reinterpret_cast< OutputData< double > * >(argp3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "FitSuiteObjects_add" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->add((GISASSimulation const &)*arg2,(OutputData< double > const &)*arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_add__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  GISASSimulation *arg2 = 0 ;
+  OutputData< double > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitSuiteObjects_add",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_add" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_GISASSimulation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuiteObjects_add" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuiteObjects_add" "', argument " "2"" of type '" "GISASSimulation const &""'"); 
+  }
+  arg2 = reinterpret_cast< GISASSimulation * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "FitSuiteObjects_add" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuiteObjects_add" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg3 = reinterpret_cast< OutputData< double > * >(argp3);
+  (arg1)->add((GISASSimulation const &)*arg2,(OutputData< double > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_add(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_FitSuiteObjects_add__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_GISASSimulation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_FitSuiteObjects_add__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuiteObjects_add'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuiteObjects::add(GISASSimulation const &,OutputData< double > const &,double)\n"
+    "    FitSuiteObjects::add(GISASSimulation const &,OutputData< double > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getNumberOfFitObjects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_getNumberOfFitObjects",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getNumberOfFitObjects" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  result = ((FitSuiteObjects const *)arg1)->getNumberOfFitObjects();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getSizeOfDataSet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_getSizeOfDataSet",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getSizeOfDataSet" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  result = ((FitSuiteObjects const *)arg1)->getSizeOfDataSet();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_setChiSquaredModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  IChiSquaredModule *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuiteObjects_setChiSquaredModule",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_setChiSquaredModule" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IChiSquaredModule,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitSuiteObjects_setChiSquaredModule" "', argument " "2"" of type '" "IChiSquaredModule const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitSuiteObjects_setChiSquaredModule" "', argument " "2"" of type '" "IChiSquaredModule const &""'"); 
+  }
+  arg2 = reinterpret_cast< IChiSquaredModule * >(argp2);
+  (arg1)->setChiSquaredModule((IChiSquaredModule const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getRealData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuiteObjects_getRealData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getRealData" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuiteObjects_getRealData" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (OutputData< double > *) &((FitSuiteObjects const *)arg1)->getRealData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getRealData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_getRealData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getRealData" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  result = (OutputData< double > *) &((FitSuiteObjects const *)arg1)->getRealData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getRealData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuiteObjects_getRealData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuiteObjects_getRealData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuiteObjects_getRealData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuiteObjects::getRealData(size_t) const\n"
+    "    FitSuiteObjects::getRealData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getSimulationData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuiteObjects_getSimulationData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getSimulationData" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuiteObjects_getSimulationData" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (OutputData< double > *) &((FitSuiteObjects const *)arg1)->getSimulationData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getSimulationData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_getSimulationData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getSimulationData" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  result = (OutputData< double > *) &((FitSuiteObjects const *)arg1)->getSimulationData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getSimulationData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuiteObjects_getSimulationData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuiteObjects_getSimulationData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuiteObjects_getSimulationData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuiteObjects::getSimulationData(size_t) const\n"
+    "    FitSuiteObjects::getSimulationData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getChiSquaredMap__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuiteObjects_getChiSquaredMap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getChiSquaredMap" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuiteObjects_getChiSquaredMap" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (OutputData< double > *) &((FitSuiteObjects const *)arg1)->getChiSquaredMap(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getChiSquaredMap__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_getChiSquaredMap",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getChiSquaredMap" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  result = (OutputData< double > *) &((FitSuiteObjects const *)arg1)->getChiSquaredMap();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getChiSquaredMap(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitSuiteObjects_getChiSquaredMap__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitSuiteObjects, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitSuiteObjects_getChiSquaredMap__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitSuiteObjects_getChiSquaredMap'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitSuiteObjects::getChiSquaredMap(size_t) const\n"
+    "    FitSuiteObjects::getChiSquaredMap() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_runSimulations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_runSimulations",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_runSimulations" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  (arg1)->runSimulations();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getChiSquaredValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_getChiSquaredValue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getChiSquaredValue" "', argument " "1"" of type '" "FitSuiteObjects const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  result = (double)((FitSuiteObjects const *)arg1)->getChiSquaredValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_getResidualValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuiteObjects_getResidualValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_getResidualValue" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuiteObjects_getResidualValue" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)(arg1)->getResidualValue(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_setNfreeParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitSuiteObjects_setNfreeParameters",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_setNfreeParameters" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitSuiteObjects_setNfreeParameters" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setNfreeParameters(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitSuiteObjects_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitSuiteObjects *arg1 = (FitSuiteObjects *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitSuiteObjects_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitSuiteObjects, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitSuiteObjects_clear" "', argument " "1"" of type '" "FitSuiteObjects *""'"); 
+  }
+  arg1 = reinterpret_cast< FitSuiteObjects * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FitSuiteObjects_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitSuiteObjects, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_StandardNormal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:StandardNormal",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "StandardNormal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)MathFunctions::StandardNormal(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Gaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Gaussian",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Gaussian" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Gaussian" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Gaussian" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)MathFunctions::Gaussian(arg1,arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntegratedGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntegratedGaussian",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "IntegratedGaussian" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntegratedGaussian" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntegratedGaussian" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)MathFunctions::IntegratedGaussian(arg1,arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_cot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:cot",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "cot" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)MathFunctions::cot(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Si(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Si",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Si" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)MathFunctions::Si(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_sinc__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:sinc",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "sinc" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)MathFunctions::sinc(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_sinc__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:sinc",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "sinc" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  result = MathFunctions::sinc(arg1);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_sinc(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_sinc__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_sinc__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'sinc'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MathFunctions::sinc(double)\n"
+    "    MathFunctions::sinc(complex_t const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_tanhc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:tanhc",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "tanhc" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  result = MathFunctions::tanhc(arg1);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Laue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  size_t arg2 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Laue",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Laue" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Laue" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = MathFunctions::Laue(arg1,arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J0__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bessel_J0",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Bessel_J0" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)MathFunctions::Bessel_J0(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J1__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bessel_J1",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Bessel_J1" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)MathFunctions::Bessel_J1(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J1c__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bessel_J1c",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Bessel_J1c" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (double)MathFunctions::Bessel_J1c(arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J0__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bessel_J0",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Bessel_J0" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  result = MathFunctions::Bessel_J0(arg1);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J0(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_Bessel_J0__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_Bessel_J0__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Bessel_J0'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MathFunctions::Bessel_J0(double)\n"
+    "    MathFunctions::Bessel_J0(complex_t const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J1__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bessel_J1",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Bessel_J1" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  result = MathFunctions::Bessel_J1(arg1);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J1(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_Bessel_J1__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_Bessel_J1__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Bessel_J1'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MathFunctions::Bessel_J1(double)\n"
+    "    MathFunctions::Bessel_J1(complex_t const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J1c__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  complex_t arg1 ;
+  std::complex< double > val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Bessel_J1c",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Bessel_J1c" "', argument " "1"" of type '" "complex_t""'");
+  } 
+  arg1 = static_cast< complex_t >(val1);
+  result = MathFunctions::Bessel_J1c(arg1);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Bessel_J1c(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_Bessel_J1c__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_Bessel_J1c__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Bessel_J1c'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MathFunctions::Bessel_J1c(double)\n"
+    "    MathFunctions::Bessel_J1c(complex_t const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *FORWARD_FFT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "FORWARD_FFT",SWIG_From_int(static_cast< int >(MathFunctions::FORWARD_FFT)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *BACKWARD_FFT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "BACKWARD_FFT",SWIG_From_int(static_cast< int >(MathFunctions::BACKWARD_FFT)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *_wrap_FastFourierTransform__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< complex_t,std::allocator< complex_t > > *arg1 = 0 ;
+  MathFunctions::EFFTDirection arg2 ;
+  int res1 = SWIG_OLDOBJ ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< complex_t,std::allocator< complex_t > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FastFourierTransform",&obj0,&obj1)) SWIG_fail;
+  {
+    std::vector< std::complex< double >,std::allocator< std::complex< double > > > *ptr = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FastFourierTransform" "', argument " "1"" of type '" "std::vector< complex_t,std::allocator< complex_t > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FastFourierTransform" "', argument " "1"" of type '" "std::vector< complex_t,std::allocator< complex_t > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FastFourierTransform" "', argument " "2"" of type '" "MathFunctions::EFFTDirection""'");
+  } 
+  arg2 = static_cast< MathFunctions::EFFTDirection >(val2);
+  result = MathFunctions::FastFourierTransform((std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)*arg1,arg2);
+  resultobj = swig::from(static_cast< std::vector< std::complex< double >,std::allocator< std::complex< double > > > >(result));
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FastFourierTransform__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > *arg1 = 0 ;
+  MathFunctions::EFFTDirection arg2 ;
+  int res1 = SWIG_OLDOBJ ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< complex_t,std::allocator< complex_t > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FastFourierTransform",&obj0,&obj1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FastFourierTransform" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FastFourierTransform" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FastFourierTransform" "', argument " "2"" of type '" "MathFunctions::EFFTDirection""'");
+  } 
+  arg2 = static_cast< MathFunctions::EFFTDirection >(val2);
+  result = MathFunctions::FastFourierTransform((std::vector< double,std::allocator< double > > const &)*arg1,arg2);
+  resultobj = swig::from(static_cast< std::vector< std::complex< double >,std::allocator< std::complex< double > > > >(result));
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FastFourierTransform(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FastFourierTransform__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FastFourierTransform__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FastFourierTransform'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MathFunctions::FastFourierTransform(std::vector< complex_t,std::allocator< complex_t > > const &,MathFunctions::EFFTDirection)\n"
+    "    MathFunctions::FastFourierTransform(std::vector< double,std::allocator< double > > const &,MathFunctions::EFFTDirection)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ConvolveFFT(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > *arg1 = 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< complex_t,std::allocator< complex_t > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ConvolveFFT",&obj0,&obj1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ConvolveFFT" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ConvolveFFT" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ConvolveFFT" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ConvolveFFT" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = MathFunctions::ConvolveFFT((std::vector< double,std::allocator< double > > const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = swig::from(static_cast< std::vector< std::complex< double >,std::allocator< std::complex< double > > > >(result));
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GenerateUniformRandom(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":GenerateUniformRandom")) SWIG_fail;
+  result = (double)MathFunctions::GenerateUniformRandom();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GenerateStandardNormalRandom(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":GenerateStandardNormalRandom")) SWIG_fail;
+  result = (double)MathFunctions::GenerateStandardNormalRandom();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GenerateNormalRandom(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:GenerateNormalRandom",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "GenerateNormalRandom" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GenerateNormalRandom" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)MathFunctions::GenerateNormalRandom(arg1,arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AdjustMinimizerStrategy__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AdjustMinimizerStrategy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_AdjustMinimizerStrategy")) SWIG_fail;
+  result = (AdjustMinimizerStrategy *)new AdjustMinimizerStrategy();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AdjustMinimizerStrategy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AdjustMinimizerStrategy__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  int res2 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  AdjustMinimizerStrategy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_AdjustMinimizerStrategy",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AdjustMinimizerStrategy" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AdjustMinimizerStrategy" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_AdjustMinimizerStrategy" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AdjustMinimizerStrategy" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_AdjustMinimizerStrategy" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AdjustMinimizerStrategy" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = (AdjustMinimizerStrategy *)new AdjustMinimizerStrategy((std::string const &)*arg1,(std::string const &)*arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AdjustMinimizerStrategy, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AdjustMinimizerStrategy__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  std::string *arg2 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  AdjustMinimizerStrategy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_AdjustMinimizerStrategy",&obj0,&obj1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AdjustMinimizerStrategy" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AdjustMinimizerStrategy" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_AdjustMinimizerStrategy" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AdjustMinimizerStrategy" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (AdjustMinimizerStrategy *)new AdjustMinimizerStrategy((std::string const &)*arg1,(std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AdjustMinimizerStrategy, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AdjustMinimizerStrategy__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  AdjustMinimizerStrategy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_AdjustMinimizerStrategy",&obj0)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AdjustMinimizerStrategy" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AdjustMinimizerStrategy" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (AdjustMinimizerStrategy *)new AdjustMinimizerStrategy((std::string const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AdjustMinimizerStrategy, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AdjustMinimizerStrategy(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_AdjustMinimizerStrategy__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_AdjustMinimizerStrategy__SWIG_3(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_AdjustMinimizerStrategy__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_AdjustMinimizerStrategy__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_AdjustMinimizerStrategy'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    AdjustMinimizerStrategy::AdjustMinimizerStrategy()\n"
+    "    AdjustMinimizerStrategy::AdjustMinimizerStrategy(std::string const &,std::string const &,std::string const &)\n"
+    "    AdjustMinimizerStrategy::AdjustMinimizerStrategy(std::string const &,std::string const &)\n"
+    "    AdjustMinimizerStrategy::AdjustMinimizerStrategy(std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_AdjustMinimizerStrategy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AdjustMinimizerStrategy *arg1 = (AdjustMinimizerStrategy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  AdjustMinimizerStrategy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AdjustMinimizerStrategy_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AdjustMinimizerStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AdjustMinimizerStrategy_clone" "', argument " "1"" of type '" "AdjustMinimizerStrategy const *""'"); 
+  }
+  arg1 = reinterpret_cast< AdjustMinimizerStrategy * >(argp1);
+  result = (AdjustMinimizerStrategy *)((AdjustMinimizerStrategy const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AdjustMinimizerStrategy, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AdjustMinimizerStrategy_setMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AdjustMinimizerStrategy *arg1 = (AdjustMinimizerStrategy *) 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  std::string *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:AdjustMinimizerStrategy_setMinimizer",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AdjustMinimizerStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "1"" of type '" "AdjustMinimizerStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< AdjustMinimizerStrategy * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3,(std::string const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AdjustMinimizerStrategy_setMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AdjustMinimizerStrategy *arg1 = (AdjustMinimizerStrategy *) 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:AdjustMinimizerStrategy_setMinimizer",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AdjustMinimizerStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "1"" of type '" "AdjustMinimizerStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< AdjustMinimizerStrategy * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->setMinimizer((std::string const &)*arg2,(std::string const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AdjustMinimizerStrategy_setMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AdjustMinimizerStrategy *arg1 = (AdjustMinimizerStrategy *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:AdjustMinimizerStrategy_setMinimizer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AdjustMinimizerStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "1"" of type '" "AdjustMinimizerStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< AdjustMinimizerStrategy * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AdjustMinimizerStrategy_setMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setMinimizer((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AdjustMinimizerStrategy_setMinimizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AdjustMinimizerStrategy, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_AdjustMinimizerStrategy_setMinimizer__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AdjustMinimizerStrategy, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_AdjustMinimizerStrategy_setMinimizer__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AdjustMinimizerStrategy, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_AdjustMinimizerStrategy_setMinimizer__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AdjustMinimizerStrategy_setMinimizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    AdjustMinimizerStrategy::setMinimizer(std::string const &,std::string const &,std::string const &)\n"
+    "    AdjustMinimizerStrategy::setMinimizer(std::string const &,std::string const &)\n"
+    "    AdjustMinimizerStrategy::setMinimizer(std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_AdjustMinimizerStrategy_execute(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AdjustMinimizerStrategy *arg1 = (AdjustMinimizerStrategy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AdjustMinimizerStrategy_execute",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AdjustMinimizerStrategy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AdjustMinimizerStrategy_execute" "', argument " "1"" of type '" "AdjustMinimizerStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< AdjustMinimizerStrategy * >(argp1);
+  (arg1)->execute();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_AdjustMinimizerStrategy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AdjustMinimizerStrategy *arg1 = (AdjustMinimizerStrategy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_AdjustMinimizerStrategy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AdjustMinimizerStrategy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AdjustMinimizerStrategy" "', argument " "1"" of type '" "AdjustMinimizerStrategy *""'"); 
+  }
+  arg1 = reinterpret_cast< AdjustMinimizerStrategy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *AdjustMinimizerStrategy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_AdjustMinimizerStrategy, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IMultiLayerBuilder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyObject * obj0 = 0 ;
+  IMultiLayerBuilder *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IMultiLayerBuilder",&obj0)) SWIG_fail;
+  arg1 = obj0;
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IMultiLayerBuilder *)new SwigDirector_IMultiLayerBuilder(arg1); 
+  } else {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
+    SWIG_fail;
+  }
+  
+  {
+    std::shared_ptr<  IMultiLayerBuilder > *smartresult = result ? new std::shared_ptr<  IMultiLayerBuilder >(result SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW) : 0;
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, SWIG_POINTER_NEW | SWIG_POINTER_OWN);
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IMultiLayerBuilder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IMultiLayerBuilder",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IMultiLayerBuilder" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  (void)arg1; delete smartarg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_buildSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder const > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder const > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  MultiLayer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMultiLayerBuilder_buildSample",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_buildSample" "', argument " "1"" of type '" "IMultiLayerBuilder const *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IMultiLayerBuilder::buildSample");
+    } else {
+      result = (MultiLayer *)((IMultiLayerBuilder const *)arg1)->buildSample();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_set_subtest(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  IParameterized *arg2 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMultiLayerBuilder_set_subtest",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_set_subtest" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IParameterized, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMultiLayerBuilder_set_subtest" "', argument " "2"" of type '" "IParameterized const *""'"); 
+  }
+  arg2 = reinterpret_cast< IParameterized * >(argp2);
+  (arg1)->set_subtest((IParameterized const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_m_subtest_item_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  IParameterized *arg2 = (IParameterized *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMultiLayerBuilder_m_subtest_item_set",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_m_subtest_item_set" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IParameterized, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMultiLayerBuilder_m_subtest_item_set" "', argument " "2"" of type '" "IParameterized const *""'"); 
+  }
+  arg2 = reinterpret_cast< IParameterized * >(argp2);
+  if (arg1) (arg1)->m_subtest_item = (IParameterized const *)arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_m_subtest_item_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IParameterized *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMultiLayerBuilder_m_subtest_item_get",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_m_subtest_item_get" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  result = (IParameterized *) ((arg1)->m_subtest_item);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParameterized, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_getFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder const > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder const > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMultiLayerBuilder_getFormFactor",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_getFormFactor" "', argument " "1"" of type '" "IMultiLayerBuilder const *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  result = (IFormFactor *)((IMultiLayerBuilder const *)arg1)->getFormFactor();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_getFTDistribution2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder const > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder const > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDistribution2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMultiLayerBuilder_getFTDistribution2D",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_getFTDistribution2D" "', argument " "1"" of type '" "IMultiLayerBuilder const *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  result = (IFTDistribution2D *)((IMultiLayerBuilder const *)arg1)->getFTDistribution2D();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_registerParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  std::string *arg2 = 0 ;
+  int64_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  long long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IMultiLayerBuilder_registerParameter",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_registerParameter" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMultiLayerBuilder_registerParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMultiLayerBuilder_registerParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_long_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IMultiLayerBuilder_registerParameter" "', argument " "3"" of type '" "int64_t""'");
+  } 
+  arg3 = static_cast< int64_t >(val3);
+  result = (RealParameter *)IMultiLayerBuilder_registerParameter(arg1,(std::string const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_setParameterValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IMultiLayerBuilder_setParameterValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_setParameterValue" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMultiLayerBuilder_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMultiLayerBuilder_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IMultiLayerBuilder_setParameterValue" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  IMultiLayerBuilder_setParameterValue(arg1,(std::string const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_isPythonBuilder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":IMultiLayerBuilder_isPythonBuilder")) SWIG_fail;
+  result = (bool)IMultiLayerBuilder_isPythonBuilder();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_IMultiLayerBuilder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_IMultiLayerBuilder",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IMultiLayerBuilder" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder_onChange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder > *smartarg1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IMultiLayerBuilder *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMultiLayerBuilder_onChange",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder_onChange" "', argument " "1"" of type '" "IMultiLayerBuilder *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr<  IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("onChange"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member onChange");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IMultiLayerBuilder *>(arg1);
+    if (upcall) {
+      (darg)->onChangeSwigPublic();
+    } else {
+      (darg)->onChange();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMultiLayerBuilder__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMultiLayerBuilder *arg1 = (IMultiLayerBuilder *) 0 ;
+  std::ostream *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder const > tempshared1 ;
+  std::shared_ptr< IMultiLayerBuilder const > *smartarg1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IMultiLayerBuilder *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMultiLayerBuilder__print",&obj0,&obj1)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 |  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMultiLayerBuilder__print" "', argument " "1"" of type '" "IMultiLayerBuilder const *""'"); 
+    }
+    if (newmem & SWIG_CAST_NEW_MEMORY) {
+      tempshared1 = *reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      delete reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >(tempshared1.get());
+    } else {
+      smartarg1 = reinterpret_cast< std::shared_ptr< const IMultiLayerBuilder > * >(argp1);
+      arg1 = const_cast< IMultiLayerBuilder * >((smartarg1 ? smartarg1->get() : 0));
+    }
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__ostream,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMultiLayerBuilder__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMultiLayerBuilder__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  arg2 = reinterpret_cast< std::ostream * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("print"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member print");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IMultiLayerBuilder *>(arg1);
+    if (upcall) {
+      ((SwigDirector_IMultiLayerBuilder const *)darg)->printSwigPublic(*arg2);
+    } else {
+      ((SwigDirector_IMultiLayerBuilder const *)darg)->print(*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IMultiLayerBuilder_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ISampleVisitor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_ISampleVisitor")) SWIG_fail;
+  result = (ISampleVisitor *)new ISampleVisitor();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISampleVisitor, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ISampleVisitor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ISampleVisitor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ISampleVisitor" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ISample *arg2 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "ISample const *""'"); 
+  }
+  arg2 = reinterpret_cast< ISample * >(argp2);
+  (arg1)->visit((ISample const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ICompositeSample *arg2 = (ICompositeSample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "ICompositeSample const *""'"); 
+  }
+  arg2 = reinterpret_cast< ICompositeSample * >(argp2);
+  (arg1)->visit((ICompositeSample const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IClusteredParticles *arg2 = (IClusteredParticles *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IClusteredParticles const *""'"); 
+  }
+  arg2 = reinterpret_cast< IClusteredParticles * >(argp2);
+  (arg1)->visit((IClusteredParticles const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  Crystal *arg2 = (Crystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "Crystal const *""'"); 
+  }
+  arg2 = reinterpret_cast< Crystal * >(argp2);
+  (arg1)->visit((Crystal const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ILayout *arg2 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "ILayout const *""'"); 
+  }
+  arg2 = reinterpret_cast< ILayout * >(argp2);
+  (arg1)->visit((ILayout const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ParticleLayout *arg2 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg2 = reinterpret_cast< ParticleLayout * >(argp2);
+  (arg1)->visit((ParticleLayout const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  Layer *arg2 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "Layer const *""'"); 
+  }
+  arg2 = reinterpret_cast< Layer * >(argp2);
+  (arg1)->visit((Layer const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_7(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  LayerInterface *arg2 = (LayerInterface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_LayerInterface, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "LayerInterface const *""'"); 
+  }
+  arg2 = reinterpret_cast< LayerInterface * >(argp2);
+  (arg1)->visit((LayerInterface const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_8(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  MultiLayer *arg2 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "MultiLayer const *""'"); 
+  }
+  arg2 = reinterpret_cast< MultiLayer * >(argp2);
+  (arg1)->visit((MultiLayer const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_9(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IAbstractParticle *arg2 = (IAbstractParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IAbstractParticle const *""'"); 
+  }
+  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
+  (arg1)->visit((IAbstractParticle const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_10(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IParticle *arg2 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IParticle const *""'"); 
+  }
+  arg2 = reinterpret_cast< IParticle * >(argp2);
+  (arg1)->visit((IParticle const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_11(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  Particle *arg2 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "Particle const *""'"); 
+  }
+  arg2 = reinterpret_cast< Particle * >(argp2);
+  (arg1)->visit((Particle const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_12(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ParticleDistribution *arg2 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg2 = reinterpret_cast< ParticleDistribution * >(argp2);
+  (arg1)->visit((ParticleDistribution const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_13(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ParticleComposition *arg2 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg2 = reinterpret_cast< ParticleComposition * >(argp2);
+  (arg1)->visit((ParticleComposition const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_14(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  MesoCrystal *arg2 = (MesoCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "MesoCrystal const *""'"); 
+  }
+  arg2 = reinterpret_cast< MesoCrystal * >(argp2);
+  (arg1)->visit((MesoCrystal const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_15(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ParticleCoreShell *arg2 = (ParticleCoreShell *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg2 = reinterpret_cast< ParticleCoreShell * >(argp2);
+  (arg1)->visit((ParticleCoreShell const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_16(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IFormFactor *arg2 = (IFormFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IFormFactor const *""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  (arg1)->visit((IFormFactor const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_17(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IFormFactorBorn *arg2 = (IFormFactorBorn *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IFormFactorBorn const *""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactorBorn * >(argp2);
+  (arg1)->visit((IFormFactorBorn const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_18(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IFormFactorDecorator *arg2 = (IFormFactorDecorator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IFormFactorDecorator, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IFormFactorDecorator const *""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactorDecorator * >(argp2);
+  (arg1)->visit((IFormFactorDecorator const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_19(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorAnisoPyramid *arg2 = (FormFactorAnisoPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorAnisoPyramid const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorAnisoPyramid * >(argp2);
+  (arg1)->visit((FormFactorAnisoPyramid const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_20(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorBox *arg2 = (FormFactorBox *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorBox * >(argp2);
+  (arg1)->visit((FormFactorBox const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_21(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorCone *arg2 = (FormFactorCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorCone * >(argp2);
+  (arg1)->visit((FormFactorCone const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_22(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorCone6 *arg2 = (FormFactorCone6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorCone6, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorCone6 const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorCone6 * >(argp2);
+  (arg1)->visit((FormFactorCone6 const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_23(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorCuboctahedron *arg2 = (FormFactorCuboctahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorCuboctahedron const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorCuboctahedron * >(argp2);
+  (arg1)->visit((FormFactorCuboctahedron const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_24(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorCrystal *arg2 = (FormFactorCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorCrystal const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorCrystal * >(argp2);
+  (arg1)->visit((FormFactorCrystal const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_25(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorCylinder *arg2 = (FormFactorCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorCylinder const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorCylinder * >(argp2);
+  (arg1)->visit((FormFactorCylinder const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_26(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorDodecahedron *arg2 = (FormFactorDodecahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorDodecahedron, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorDodecahedron const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorDodecahedron * >(argp2);
+  (arg1)->visit((FormFactorDodecahedron const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_27(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorEllipsoidalCylinder *arg2 = (FormFactorEllipsoidalCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp2);
+  (arg1)->visit((FormFactorEllipsoidalCylinder const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_28(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorFullSphere *arg2 = (FormFactorFullSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorFullSphere, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorFullSphere const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorFullSphere * >(argp2);
+  (arg1)->visit((FormFactorFullSphere const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_29(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorFullSpheroid *arg2 = (FormFactorFullSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorFullSpheroid const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorFullSpheroid * >(argp2);
+  (arg1)->visit((FormFactorFullSpheroid const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_30(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorGauss *arg2 = (FormFactorGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorGauss const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorGauss * >(argp2);
+  (arg1)->visit((FormFactorGauss const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_31(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorHemiEllipsoid *arg2 = (FormFactorHemiEllipsoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp2);
+  (arg1)->visit((FormFactorHemiEllipsoid const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_32(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorIcosahedron *arg2 = (FormFactorIcosahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorIcosahedron, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorIcosahedron const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorIcosahedron * >(argp2);
+  (arg1)->visit((FormFactorIcosahedron const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_33(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorLongBoxGauss *arg2 = (FormFactorLongBoxGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorLongBoxGauss * >(argp2);
+  (arg1)->visit((FormFactorLongBoxGauss const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_34(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorLongBoxLorentz *arg2 = (FormFactorLongBoxLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp2);
+  (arg1)->visit((FormFactorLongBoxLorentz const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_35(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorLorentz *arg2 = (FormFactorLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorLorentz const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorLorentz * >(argp2);
+  (arg1)->visit((FormFactorLorentz const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_36(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorPrism3 *arg2 = (FormFactorPrism3 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorPrism3, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorPrism3 const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorPrism3 * >(argp2);
+  (arg1)->visit((FormFactorPrism3 const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_37(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorPrism6 *arg2 = (FormFactorPrism6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorPrism6, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorPrism6 const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorPrism6 * >(argp2);
+  (arg1)->visit((FormFactorPrism6 const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_38(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorPyramid *arg2 = (FormFactorPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorPyramid const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorPyramid * >(argp2);
+  (arg1)->visit((FormFactorPyramid const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_39(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorRipple1 *arg2 = (FormFactorRipple1 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorRipple1 * >(argp2);
+  (arg1)->visit((FormFactorRipple1 const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_40(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorRipple2 *arg2 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorRipple2 * >(argp2);
+  (arg1)->visit((FormFactorRipple2 const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_41(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorSphereGaussianRadius *arg2 = (FormFactorSphereGaussianRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorSphereGaussianRadius, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorSphereGaussianRadius const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorSphereGaussianRadius * >(argp2);
+  (arg1)->visit((FormFactorSphereGaussianRadius const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_42(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorSphereLogNormalRadius *arg2 = (FormFactorSphereLogNormalRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorSphereLogNormalRadius, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorSphereLogNormalRadius const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorSphereLogNormalRadius * >(argp2);
+  (arg1)->visit((FormFactorSphereLogNormalRadius const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_43(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorTetrahedron *arg2 = (FormFactorTetrahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorTetrahedron const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorTetrahedron * >(argp2);
+  (arg1)->visit((FormFactorTetrahedron const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_44(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorTrivial *arg2 = (FormFactorTrivial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorTrivial, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorTrivial const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorTrivial * >(argp2);
+  (arg1)->visit((FormFactorTrivial const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_45(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorTruncatedCube *arg2 = (FormFactorTruncatedCube *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorTruncatedCube, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorTruncatedCube const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorTruncatedCube * >(argp2);
+  (arg1)->visit((FormFactorTruncatedCube const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_46(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorTruncatedSphere *arg2 = (FormFactorTruncatedSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorTruncatedSphere const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorTruncatedSphere * >(argp2);
+  (arg1)->visit((FormFactorTruncatedSphere const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_47(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorTruncatedSpheroid *arg2 = (FormFactorTruncatedSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp2);
+  (arg1)->visit((FormFactorTruncatedSpheroid const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_48(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorWeighted *arg2 = (FormFactorWeighted *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorWeighted const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorWeighted * >(argp2);
+  (arg1)->visit((FormFactorWeighted const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_49(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorDecoratorDebyeWaller *arg2 = (FormFactorDecoratorDebyeWaller *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorDecoratorDebyeWaller, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorDecoratorDebyeWaller const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorDecoratorDebyeWaller * >(argp2);
+  (arg1)->visit((FormFactorDecoratorDebyeWaller const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_50(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorDecoratorFactor *arg2 = (FormFactorDecoratorFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorDecoratorFactor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorDecoratorFactor const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorDecoratorFactor * >(argp2);
+  (arg1)->visit((FormFactorDecoratorFactor const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_51(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorDecoratorMaterial *arg2 = (FormFactorDecoratorMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorDecoratorMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorDecoratorMaterial const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorDecoratorMaterial * >(argp2);
+  (arg1)->visit((FormFactorDecoratorMaterial const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_52(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorDecoratorPositionFactor *arg2 = (FormFactorDecoratorPositionFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorDecoratorPositionFactor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorDecoratorPositionFactor const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorDecoratorPositionFactor * >(argp2);
+  (arg1)->visit((FormFactorDecoratorPositionFactor const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_53(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  FormFactorDecoratorRotation *arg2 = (FormFactorDecoratorRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FormFactorDecoratorRotation, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "FormFactorDecoratorRotation const *""'"); 
+  }
+  arg2 = reinterpret_cast< FormFactorDecoratorRotation * >(argp2);
+  (arg1)->visit((FormFactorDecoratorRotation const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_54(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IInterferenceFunction *arg2 = (IInterferenceFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg2 = reinterpret_cast< IInterferenceFunction * >(argp2);
+  (arg1)->visit((IInterferenceFunction const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_55(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  InterferenceFunction1DLattice *arg2 = (InterferenceFunction1DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "InterferenceFunction1DLattice const *""'"); 
+  }
+  arg2 = reinterpret_cast< InterferenceFunction1DLattice * >(argp2);
+  (arg1)->visit((InterferenceFunction1DLattice const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_56(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  InterferenceFunctionRadialParaCrystal *arg2 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg2 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp2);
+  (arg1)->visit((InterferenceFunctionRadialParaCrystal const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_57(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  InterferenceFunction2DLattice *arg2 = (InterferenceFunction2DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "InterferenceFunction2DLattice const *""'"); 
+  }
+  arg2 = reinterpret_cast< InterferenceFunction2DLattice * >(argp2);
+  (arg1)->visit((InterferenceFunction2DLattice const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_58(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  InterferenceFunction2DParaCrystal *arg2 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg2 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp2);
+  (arg1)->visit((InterferenceFunction2DParaCrystal const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_59(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  InterferenceFunctionNone *arg2 = (InterferenceFunctionNone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_InterferenceFunctionNone, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "InterferenceFunctionNone const *""'"); 
+  }
+  arg2 = reinterpret_cast< InterferenceFunctionNone * >(argp2);
+  (arg1)->visit((InterferenceFunctionNone const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_60(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IRoughness *arg2 = (IRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IRoughness const *""'"); 
+  }
+  arg2 = reinterpret_cast< IRoughness * >(argp2);
+  (arg1)->visit((IRoughness const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_61(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  LayerRoughness *arg2 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg2 = reinterpret_cast< LayerRoughness * >(argp2);
+  (arg1)->visit((LayerRoughness const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_62(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  IRotation *arg2 = (IRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "IRotation const *""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  (arg1)->visit((IRotation const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_63(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  RotationX *arg2 = (RotationX *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_RotationX, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "RotationX const *""'"); 
+  }
+  arg2 = reinterpret_cast< RotationX * >(argp2);
+  (arg1)->visit((RotationX const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_64(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  RotationY *arg2 = (RotationY *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_RotationY, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "RotationY const *""'"); 
+  }
+  arg2 = reinterpret_cast< RotationY * >(argp2);
+  (arg1)->visit((RotationY const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_65(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  RotationZ *arg2 = (RotationZ *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_RotationZ, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "RotationZ const *""'"); 
+  }
+  arg2 = reinterpret_cast< RotationZ * >(argp2);
+  (arg1)->visit((RotationZ const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit__SWIG_66(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  RotationEuler *arg2 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visit" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visit" "', argument " "2"" of type '" "RotationEuler const *""'"); 
+  }
+  arg2 = reinterpret_cast< RotationEuler * >(argp2);
+  (arg1)->visit((RotationEuler const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visit(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Crystal, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_3(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IClusteredParticles, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleLayout, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_5(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ILayout, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_4(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Layer, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_6(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MultiLayer, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_8(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_Particle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_11(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_LayerInterface, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_7(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleComposition, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_13(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleDistribution, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_12(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_MesoCrystal, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_14(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ParticleCoreShell, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_15(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_10(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IAbstractParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_9(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ICompositeSample, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorAnisoPyramid, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_19(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorDecoratorDebyeWaller, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_49(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorBox, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_20(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorCone, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_21(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorCone6, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_22(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorCuboctahedron, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_23(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorCylinder, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_25(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorCrystal, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_24(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorDodecahedron, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_26(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_27(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorFullSphere, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_28(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorFullSpheroid, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_29(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorGauss, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_30(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorHemiEllipsoid, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_31(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorIcosahedron, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_32(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorLongBoxGauss, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_33(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorLongBoxLorentz, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_34(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorLorentz, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_35(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorPrism3, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_36(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorPrism6, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_37(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorPyramid, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_38(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorRipple1, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_39(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorRipple2, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_40(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorSphereGaussianRadius, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_41(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorSphereLogNormalRadius, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_42(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorTetrahedron, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_43(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorTrivial, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_44(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorTruncatedCube, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_45(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorTruncatedSphere, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_46(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorTruncatedSpheroid, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_47(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IFormFactorBorn, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_17(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorWeighted, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_48(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IFormFactorDecorator, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_18(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IFormFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_16(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction1DLattice, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_55(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorDecoratorFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_50(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorDecoratorMaterial, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_51(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorDecoratorPositionFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_52(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_FormFactorDecoratorRotation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_53(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_56(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction2DLattice, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_57(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_58(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterferenceFunctionNone, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_59(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IInterferenceFunction, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_54(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_LayerRoughness, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_61(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IRoughness, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_60(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationX, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_63(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationY, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_64(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationZ, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_65(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RotationEuler, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_66(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IRotation, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_62(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ISampleVisitor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_ISample, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ISampleVisitor_visit__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ISampleVisitor_visit'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ISampleVisitor::visit(ISample const *)\n"
+    "    ISampleVisitor::visit(ICompositeSample const *)\n"
+    "    ISampleVisitor::visit(IClusteredParticles const *)\n"
+    "    ISampleVisitor::visit(Crystal const *)\n"
+    "    ISampleVisitor::visit(ILayout const *)\n"
+    "    ISampleVisitor::visit(ParticleLayout const *)\n"
+    "    ISampleVisitor::visit(Layer const *)\n"
+    "    ISampleVisitor::visit(LayerInterface const *)\n"
+    "    ISampleVisitor::visit(MultiLayer const *)\n"
+    "    ISampleVisitor::visit(IAbstractParticle const *)\n"
+    "    ISampleVisitor::visit(IParticle const *)\n"
+    "    ISampleVisitor::visit(Particle const *)\n"
+    "    ISampleVisitor::visit(ParticleDistribution const *)\n"
+    "    ISampleVisitor::visit(ParticleComposition const *)\n"
+    "    ISampleVisitor::visit(MesoCrystal const *)\n"
+    "    ISampleVisitor::visit(ParticleCoreShell const *)\n"
+    "    ISampleVisitor::visit(IFormFactor const *)\n"
+    "    ISampleVisitor::visit(IFormFactorBorn const *)\n"
+    "    ISampleVisitor::visit(IFormFactorDecorator const *)\n"
+    "    ISampleVisitor::visit(FormFactorAnisoPyramid const *)\n"
+    "    ISampleVisitor::visit(FormFactorBox const *)\n"
+    "    ISampleVisitor::visit(FormFactorCone const *)\n"
+    "    ISampleVisitor::visit(FormFactorCone6 const *)\n"
+    "    ISampleVisitor::visit(FormFactorCuboctahedron const *)\n"
+    "    ISampleVisitor::visit(FormFactorCrystal const *)\n"
+    "    ISampleVisitor::visit(FormFactorCylinder const *)\n"
+    "    ISampleVisitor::visit(FormFactorDodecahedron const *)\n"
+    "    ISampleVisitor::visit(FormFactorEllipsoidalCylinder const *)\n"
+    "    ISampleVisitor::visit(FormFactorFullSphere const *)\n"
+    "    ISampleVisitor::visit(FormFactorFullSpheroid const *)\n"
+    "    ISampleVisitor::visit(FormFactorGauss const *)\n"
+    "    ISampleVisitor::visit(FormFactorHemiEllipsoid const *)\n"
+    "    ISampleVisitor::visit(FormFactorIcosahedron const *)\n"
+    "    ISampleVisitor::visit(FormFactorLongBoxGauss const *)\n"
+    "    ISampleVisitor::visit(FormFactorLongBoxLorentz const *)\n"
+    "    ISampleVisitor::visit(FormFactorLorentz const *)\n"
+    "    ISampleVisitor::visit(FormFactorPrism3 const *)\n"
+    "    ISampleVisitor::visit(FormFactorPrism6 const *)\n"
+    "    ISampleVisitor::visit(FormFactorPyramid const *)\n"
+    "    ISampleVisitor::visit(FormFactorRipple1 const *)\n"
+    "    ISampleVisitor::visit(FormFactorRipple2 const *)\n"
+    "    ISampleVisitor::visit(FormFactorSphereGaussianRadius const *)\n"
+    "    ISampleVisitor::visit(FormFactorSphereLogNormalRadius const *)\n"
+    "    ISampleVisitor::visit(FormFactorTetrahedron const *)\n"
+    "    ISampleVisitor::visit(FormFactorTrivial const *)\n"
+    "    ISampleVisitor::visit(FormFactorTruncatedCube const *)\n"
+    "    ISampleVisitor::visit(FormFactorTruncatedSphere const *)\n"
+    "    ISampleVisitor::visit(FormFactorTruncatedSpheroid const *)\n"
+    "    ISampleVisitor::visit(FormFactorWeighted const *)\n"
+    "    ISampleVisitor::visit(FormFactorDecoratorDebyeWaller const *)\n"
+    "    ISampleVisitor::visit(FormFactorDecoratorFactor const *)\n"
+    "    ISampleVisitor::visit(FormFactorDecoratorMaterial const *)\n"
+    "    ISampleVisitor::visit(FormFactorDecoratorPositionFactor const *)\n"
+    "    ISampleVisitor::visit(FormFactorDecoratorRotation const *)\n"
+    "    ISampleVisitor::visit(IInterferenceFunction const *)\n"
+    "    ISampleVisitor::visit(InterferenceFunction1DLattice const *)\n"
+    "    ISampleVisitor::visit(InterferenceFunctionRadialParaCrystal const *)\n"
+    "    ISampleVisitor::visit(InterferenceFunction2DLattice const *)\n"
+    "    ISampleVisitor::visit(InterferenceFunction2DParaCrystal const *)\n"
+    "    ISampleVisitor::visit(InterferenceFunctionNone const *)\n"
+    "    ISampleVisitor::visit(IRoughness const *)\n"
+    "    ISampleVisitor::visit(LayerRoughness const *)\n"
+    "    ISampleVisitor::visit(IRotation const *)\n"
+    "    ISampleVisitor::visit(RotationX const *)\n"
+    "    ISampleVisitor::visit(RotationY const *)\n"
+    "    ISampleVisitor::visit(RotationZ const *)\n"
+    "    ISampleVisitor::visit(RotationEuler const *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visitEnter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ICompositeSample *arg2 = (ICompositeSample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visitEnter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visitEnter" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visitEnter" "', argument " "2"" of type '" "ICompositeSample const *""'"); 
+  }
+  arg2 = reinterpret_cast< ICompositeSample * >(argp2);
+  result = (bool)(arg1)->visitEnter((ICompositeSample const *)arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_visitLeave(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  ICompositeSample *arg2 = (ICompositeSample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_visitLeave",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_visitLeave" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISampleVisitor_visitLeave" "', argument " "2"" of type '" "ICompositeSample const *""'"); 
+  }
+  arg2 = reinterpret_cast< ICompositeSample * >(argp2);
+  result = (bool)(arg1)->visitLeave((ICompositeSample const *)arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_getLevel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISampleVisitor_getLevel",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_getLevel" "', argument " "1"" of type '" "ISampleVisitor const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  result = (int)((ISampleVisitor const *)arg1)->getLevel();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISampleVisitor_setLevel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISampleVisitor *arg1 = (ISampleVisitor *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISampleVisitor_setLevel",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISampleVisitor_setLevel" "', argument " "1"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg1 = reinterpret_cast< ISampleVisitor * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ISampleVisitor_setLevel" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setLevel(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ISampleVisitor_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ISampleVisitor, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_VisitSampleTreePreorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = 0 ;
+  ISampleVisitor *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:VisitSampleTreePreorder",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_ISample,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VisitSampleTreePreorder" "', argument " "1"" of type '" "ISample const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitSampleTreePreorder" "', argument " "1"" of type '" "ISample const &""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ISampleVisitor,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VisitSampleTreePreorder" "', argument " "2"" of type '" "ISampleVisitor &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitSampleTreePreorder" "', argument " "2"" of type '" "ISampleVisitor &""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  VisitSampleTreePreorder((ISample const &)*arg1,*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VisitSampleTreePostorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = 0 ;
+  ISampleVisitor *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:VisitSampleTreePostorder",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_ISample,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VisitSampleTreePostorder" "', argument " "1"" of type '" "ISample const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitSampleTreePostorder" "', argument " "1"" of type '" "ISample const &""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ISampleVisitor,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VisitSampleTreePostorder" "', argument " "2"" of type '" "ISampleVisitor &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitSampleTreePostorder" "', argument " "2"" of type '" "ISampleVisitor &""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  VisitSampleTreePostorder((ISample const &)*arg1,*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ICompositeSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICompositeSample *arg1 = (ICompositeSample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ICompositeSample",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICompositeSample, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ICompositeSample" "', argument " "1"" of type '" "ICompositeSample *""'"); 
+  }
+  arg1 = reinterpret_cast< ICompositeSample * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ICompositeSample_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICompositeSample *arg1 = (ICompositeSample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ICompositeSample *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ICompositeSample_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICompositeSample_clone" "', argument " "1"" of type '" "ICompositeSample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ICompositeSample * >(argp1);
+  result = (ICompositeSample *)((ICompositeSample const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ICompositeSample_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICompositeSample *arg1 = (ICompositeSample *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ICompositeSample_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICompositeSample_accept" "', argument " "1"" of type '" "ICompositeSample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ICompositeSample * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ICompositeSample_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((ICompositeSample const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ICompositeSample_registerChild(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICompositeSample *arg1 = (ICompositeSample *) 0 ;
+  ISample *arg2 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ICompositeSample_registerChild",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICompositeSample_registerChild" "', argument " "1"" of type '" "ICompositeSample *""'"); 
+  }
+  arg1 = reinterpret_cast< ICompositeSample * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ICompositeSample_registerChild" "', argument " "2"" of type '" "ISample *""'"); 
+  }
+  arg2 = reinterpret_cast< ISample * >(argp2);
+  (arg1)->registerChild(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ICompositeSample_deregisterChild(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICompositeSample *arg1 = (ICompositeSample *) 0 ;
+  ISample *arg2 = (ISample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ICompositeSample_deregisterChild",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICompositeSample_deregisterChild" "', argument " "1"" of type '" "ICompositeSample *""'"); 
+  }
+  arg1 = reinterpret_cast< ICompositeSample * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISample, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ICompositeSample_deregisterChild" "', argument " "2"" of type '" "ISample *""'"); 
+  }
+  arg2 = reinterpret_cast< ISample * >(argp2);
+  (arg1)->deregisterChild(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ICompositeSample_getChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICompositeSample *arg1 = (ICompositeSample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< ISample const *,std::allocator< ISample const * > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ICompositeSample_getChildren",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICompositeSample_getChildren" "', argument " "1"" of type '" "ICompositeSample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ICompositeSample * >(argp1);
+  result = ((ICompositeSample const *)arg1)->getChildren();
+  resultobj = swig::from(static_cast< std::vector< ISample const*,std::allocator< ISample const * > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ICompositeSample_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ICompositeSample *arg1 = (ICompositeSample *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ICompositeSample_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ICompositeSample, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ICompositeSample_size" "', argument " "1"" of type '" "ICompositeSample const *""'"); 
+  }
+  arg1 = reinterpret_cast< ICompositeSample * >(argp1);
+  result = ((ICompositeSample const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ICompositeSample_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ICompositeSample, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IClusteredParticles_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = (IClusteredParticles *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IClusteredParticles *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IClusteredParticles_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IClusteredParticles_clone" "', argument " "1"" of type '" "IClusteredParticles const *""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  result = (IClusteredParticles *)((IClusteredParticles const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IClusteredParticles_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = (IClusteredParticles *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IClusteredParticles *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IClusteredParticles_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IClusteredParticles_cloneInvertB" "', argument " "1"" of type '" "IClusteredParticles const *""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  result = (IClusteredParticles *)((IClusteredParticles const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IClusteredParticles_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = (IClusteredParticles *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IClusteredParticles_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IClusteredParticles_accept" "', argument " "1"" of type '" "IClusteredParticles const *""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IClusteredParticles_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((IClusteredParticles const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IClusteredParticles_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = (IClusteredParticles *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IClusteredParticles_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IClusteredParticles_setAmbientMaterial" "', argument " "1"" of type '" "IClusteredParticles *""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IClusteredParticles_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IClusteredParticles_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IClusteredParticles_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = (IClusteredParticles *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IClusteredParticles_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IClusteredParticles_getAmbientMaterial" "', argument " "1"" of type '" "IClusteredParticles const *""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  result = (IMaterial *)((IClusteredParticles const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IClusteredParticles_createTotalFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = (IClusteredParticles *) 0 ;
+  IFormFactor *arg2 = 0 ;
+  IRotation *arg3 = (IRotation *) 0 ;
+  kvector_t *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IClusteredParticles_createTotalFormFactor",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IClusteredParticles_createTotalFormFactor" "', argument " "1"" of type '" "IClusteredParticles const *""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IClusteredParticles_createTotalFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IClusteredParticles_createTotalFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IClusteredParticles_createTotalFormFactor" "', argument " "3"" of type '" "IRotation const *""'"); 
+  }
+  arg3 = reinterpret_cast< IRotation * >(argp3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "IClusteredParticles_createTotalFormFactor" "', argument " "4"" of type '" "kvector_t const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IClusteredParticles_createTotalFormFactor" "', argument " "4"" of type '" "kvector_t const &""'"); 
+  }
+  arg4 = reinterpret_cast< kvector_t * >(argp4);
+  result = (IFormFactor *)((IClusteredParticles const *)arg1)->createTotalFormFactor((IFormFactor const &)*arg2,(IRotation const *)arg3,(kvector_t const &)*arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IClusteredParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = (IClusteredParticles *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IClusteredParticles",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IClusteredParticles, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IClusteredParticles" "', argument " "1"" of type '" "IClusteredParticles *""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IClusteredParticles_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IClusteredParticles, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Crystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = 0 ;
+  Lattice *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Crystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Crystal",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_ParticleComposition,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Crystal" "', argument " "1"" of type '" "ParticleComposition const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Crystal" "', argument " "1"" of type '" "ParticleComposition const &""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Lattice,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Crystal" "', argument " "2"" of type '" "Lattice const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Crystal" "', argument " "2"" of type '" "Lattice const &""'"); 
+  }
+  arg2 = reinterpret_cast< Lattice * >(argp2);
+  result = (Crystal *)new Crystal((ParticleComposition const &)*arg1,(Lattice const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Crystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Crystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Crystal",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Crystal" "', argument " "1"" of type '" "Crystal *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Crystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Crystal_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_clone" "', argument " "1"" of type '" "Crystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  result = (Crystal *)((Crystal const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Crystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Crystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Crystal_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_cloneInvertB" "', argument " "1"" of type '" "Crystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  result = (Crystal *)((Crystal const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Crystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Crystal_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_accept" "', argument " "1"" of type '" "Crystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Crystal_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((Crystal const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Crystal_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_setAmbientMaterial" "', argument " "1"" of type '" "Crystal *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Crystal_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Crystal_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Crystal_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_getAmbientMaterial" "', argument " "1"" of type '" "Crystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  result = (IMaterial *)((Crystal const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_createTotalFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  IFormFactor *arg2 = 0 ;
+  IRotation *arg3 = (IRotation *) 0 ;
+  kvector_t *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Crystal_createTotalFormFactor",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_createTotalFormFactor" "', argument " "1"" of type '" "Crystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Crystal_createTotalFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Crystal_createTotalFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Crystal_createTotalFormFactor" "', argument " "3"" of type '" "IRotation const *""'"); 
+  }
+  arg3 = reinterpret_cast< IRotation * >(argp3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "Crystal_createTotalFormFactor" "', argument " "4"" of type '" "kvector_t const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Crystal_createTotalFormFactor" "', argument " "4"" of type '" "kvector_t const &""'"); 
+  }
+  arg4 = reinterpret_cast< kvector_t * >(argp4);
+  result = (IFormFactor *)((Crystal const *)arg1)->createTotalFormFactor((IFormFactor const &)*arg2,(IRotation const *)arg3,(kvector_t const &)*arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_getLatticeBasis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleComposition *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Crystal_getLatticeBasis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_getLatticeBasis" "', argument " "1"" of type '" "Crystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  result = (ParticleComposition *)((Crystal const *)arg1)->getLatticeBasis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Crystal_setDWFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Crystal *arg1 = (Crystal *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Crystal_setDWFactor",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_setDWFactor" "', argument " "1"" of type '" "Crystal *""'"); 
+  }
+  arg1 = reinterpret_cast< Crystal * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Crystal_setDWFactor" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setDWFactor(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Crystal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Crystal, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IDistribution1D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IDistribution1D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IDistribution1D" "', argument " "1"" of type '" "IDistribution1D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDistribution1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDistribution1D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_clone" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  result = (IDistribution1D *)((IDistribution1D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_probabilityDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDistribution1D_probabilityDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_probabilityDensity" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_probabilityDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((IDistribution1D const *)arg1)->probabilityDensity(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_getMean(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDistribution1D_getMean",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_getMean" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  result = (double)((IDistribution1D const *)arg1)->getMean();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateSamples__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  RealLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  SwigValueWrapper< std::vector< ParameterSample,std::allocator< ParameterSample > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IDistribution1D_generateSamples",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_generateSamples" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_generateSamples" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDistribution1D_generateSamples" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "IDistribution1D_generateSamples" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDistribution1D_generateSamples" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< RealLimits * >(argp4);
+  result = ((IDistribution1D const *)arg1)->generateSamples(arg2,arg3,(RealLimits const &)*arg4);
+  resultobj = SWIG_NewPointerObj((new std::vector< ParameterSample,std::allocator< ParameterSample > >(static_cast< const std::vector< ParameterSample,std::allocator< ParameterSample > >& >(result))), SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateSamples__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  SwigValueWrapper< std::vector< ParameterSample,std::allocator< ParameterSample > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IDistribution1D_generateSamples",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_generateSamples" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_generateSamples" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDistribution1D_generateSamples" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((IDistribution1D const *)arg1)->generateSamples(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new std::vector< ParameterSample,std::allocator< ParameterSample > >(static_cast< const std::vector< ParameterSample,std::allocator< ParameterSample > >& >(result))), SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateSamples__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  SwigValueWrapper< std::vector< ParameterSample,std::allocator< ParameterSample > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDistribution1D_generateSamples",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_generateSamples" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_generateSamples" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((IDistribution1D const *)arg1)->generateSamples(arg2);
+  resultobj = SWIG_NewPointerObj((new std::vector< ParameterSample,std::allocator< ParameterSample > >(static_cast< const std::vector< ParameterSample,std::allocator< ParameterSample > >& >(result))), SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateSamples__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  SwigValueWrapper< std::vector< ParameterSample,std::allocator< ParameterSample > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IDistribution1D_generateSamples",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_generateSamples" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_generateSamples" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDistribution1D_generateSamples" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IDistribution1D_generateSamples" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = ((IDistribution1D const *)arg1)->generateSamples(arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj((new std::vector< ParameterSample,std::allocator< ParameterSample > >(static_cast< const std::vector< ParameterSample,std::allocator< ParameterSample > >& >(result))), SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateSamples(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDistribution1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IDistribution1D_generateSamples__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDistribution1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IDistribution1D_generateSamples__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDistribution1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_RealLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_IDistribution1D_generateSamples__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDistribution1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_IDistribution1D_generateSamples__SWIG_3(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IDistribution1D_generateSamples'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IDistribution1D::generateSamples(size_t,double,RealLimits const &) const\n"
+    "    IDistribution1D::generateSamples(size_t,double) const\n"
+    "    IDistribution1D::generateSamples(size_t) const\n"
+    "    IDistribution1D::generateSamples(size_t,double,double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateValueList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  RealLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IDistribution1D_generateValueList",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_generateValueList" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDistribution1D_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "IDistribution1D_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDistribution1D_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< RealLimits * >(argp4);
+  result = ((IDistribution1D const *)arg1)->generateValueList(arg2,arg3,(RealLimits const &)*arg4);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateValueList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IDistribution1D_generateValueList",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_generateValueList" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDistribution1D_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((IDistribution1D const *)arg1)->generateValueList(arg2,arg3);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateValueList(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDistribution1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IDistribution1D_generateValueList__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDistribution1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_RealLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_IDistribution1D_generateValueList__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IDistribution1D_generateValueList'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IDistribution1D::generateValueList(size_t,double,RealLimits const &) const\n"
+    "    IDistribution1D::generateValueList(size_t,double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_generateValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IDistribution1D_generateValues",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_generateValues" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDistribution1D_generateValues" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDistribution1D_generateValues" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IDistribution1D_generateValues" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = ((IDistribution1D const *)arg1)->generateValues(arg2,arg3,arg4);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_getMeanSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParameterSample result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDistribution1D_getMeanSample",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_getMeanSample" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  result = ((IDistribution1D const *)arg1)->getMeanSample();
+  resultobj = SWIG_NewPointerObj((new ParameterSample(static_cast< const ParameterSample& >(result))), SWIGTYPE_p_ParameterSample, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDistribution1D_isDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDistribution1D *arg1 = (IDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDistribution1D_isDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDistribution1D_isDelta" "', argument " "1"" of type '" "IDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDistribution1D * >(argp1);
+  result = (bool)((IDistribution1D const *)arg1)->isDelta();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IDistribution1D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IDistribution1D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_DistributionGate__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_DistributionGate")) SWIG_fail;
+  result = (DistributionGate *)new DistributionGate();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionGate, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionGate__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  DistributionGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_DistributionGate",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DistributionGate" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_DistributionGate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (DistributionGate *)new DistributionGate(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionGate, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionGate(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_DistributionGate__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_DistributionGate__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_DistributionGate'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionGate::DistributionGate()\n"
+    "    DistributionGate::DistributionGate(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DistributionGate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_DistributionGate",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionGate" "', argument " "1"" of type '" "DistributionGate *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DistributionGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGate_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_clone" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  result = (DistributionGate *)((DistributionGate const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionGate, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_probabilityDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DistributionGate_probabilityDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_probabilityDensity" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionGate_probabilityDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((DistributionGate const *)arg1)->probabilityDensity(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_getMean(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGate_getMean",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_getMean" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  result = (double)((DistributionGate const *)arg1)->getMean();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_getMin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGate_getMin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_getMin" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  result = (double)((DistributionGate const *)arg1)->getMin();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_getMax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGate_getMax",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_getMax" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  result = (double)((DistributionGate const *)arg1)->getMax();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_generateValueList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  RealLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:DistributionGate_generateValueList",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_generateValueList" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionGate_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionGate_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DistributionGate_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DistributionGate_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< RealLimits * >(argp4);
+  result = ((DistributionGate const *)arg1)->generateValueList(arg2,arg3,(RealLimits const &)*arg4);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_generateValueList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:DistributionGate_generateValueList",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_generateValueList" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionGate_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionGate_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((DistributionGate const *)arg1)->generateValueList(arg2,arg3);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_generateValueList(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionGate, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DistributionGate_generateValueList__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionGate, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_RealLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DistributionGate_generateValueList__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'DistributionGate_generateValueList'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionGate::generateValueList(size_t,double,RealLimits const &) const\n"
+    "    DistributionGate::generateValueList(size_t,double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGate_isDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGate *arg1 = (DistributionGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGate_isDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGate_isDelta" "', argument " "1"" of type '" "DistributionGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGate * >(argp1);
+  result = (bool)((DistributionGate const *)arg1)->isDelta();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DistributionGate_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_DistributionGate, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_DistributionLorentz__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_DistributionLorentz")) SWIG_fail;
+  result = (DistributionLorentz *)new DistributionLorentz();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionLorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionLorentz__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  DistributionLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_DistributionLorentz",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DistributionLorentz" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_DistributionLorentz" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (DistributionLorentz *)new DistributionLorentz(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionLorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionLorentz(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_DistributionLorentz__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_DistributionLorentz__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_DistributionLorentz'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionLorentz::DistributionLorentz()\n"
+    "    DistributionLorentz::DistributionLorentz(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DistributionLorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_DistributionLorentz",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionLorentz" "', argument " "1"" of type '" "DistributionLorentz *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DistributionLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLorentz_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLorentz_clone" "', argument " "1"" of type '" "DistributionLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  result = (DistributionLorentz *)((DistributionLorentz const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_probabilityDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DistributionLorentz_probabilityDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLorentz_probabilityDensity" "', argument " "1"" of type '" "DistributionLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionLorentz_probabilityDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((DistributionLorentz const *)arg1)->probabilityDensity(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_getMean(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLorentz_getMean",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLorentz_getMean" "', argument " "1"" of type '" "DistributionLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  result = (double)((DistributionLorentz const *)arg1)->getMean();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_getHWHM(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLorentz_getHWHM",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLorentz_getHWHM" "', argument " "1"" of type '" "DistributionLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  result = (double)((DistributionLorentz const *)arg1)->getHWHM();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_generateValueList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  RealLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:DistributionLorentz_generateValueList",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLorentz_generateValueList" "', argument " "1"" of type '" "DistributionLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionLorentz_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionLorentz_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DistributionLorentz_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DistributionLorentz_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< RealLimits * >(argp4);
+  result = ((DistributionLorentz const *)arg1)->generateValueList(arg2,arg3,(RealLimits const &)*arg4);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_generateValueList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:DistributionLorentz_generateValueList",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLorentz_generateValueList" "', argument " "1"" of type '" "DistributionLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionLorentz_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionLorentz_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((DistributionLorentz const *)arg1)->generateValueList(arg2,arg3);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_generateValueList(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionLorentz, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DistributionLorentz_generateValueList__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionLorentz, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_RealLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DistributionLorentz_generateValueList__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'DistributionLorentz_generateValueList'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionLorentz::generateValueList(size_t,double,RealLimits const &) const\n"
+    "    DistributionLorentz::generateValueList(size_t,double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLorentz_isDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLorentz *arg1 = (DistributionLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLorentz_isDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLorentz_isDelta" "', argument " "1"" of type '" "DistributionLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLorentz * >(argp1);
+  result = (bool)((DistributionLorentz const *)arg1)->isDelta();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DistributionLorentz_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_DistributionLorentz, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_DistributionGaussian__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_DistributionGaussian")) SWIG_fail;
+  result = (DistributionGaussian *)new DistributionGaussian();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionGaussian, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionGaussian__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  DistributionGaussian *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_DistributionGaussian",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DistributionGaussian" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_DistributionGaussian" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (DistributionGaussian *)new DistributionGaussian(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionGaussian, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionGaussian(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_DistributionGaussian__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_DistributionGaussian__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_DistributionGaussian'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionGaussian::DistributionGaussian()\n"
+    "    DistributionGaussian::DistributionGaussian(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DistributionGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_DistributionGaussian",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionGaussian" "', argument " "1"" of type '" "DistributionGaussian *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DistributionGaussian *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGaussian_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGaussian_clone" "', argument " "1"" of type '" "DistributionGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  result = (DistributionGaussian *)((DistributionGaussian const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_probabilityDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DistributionGaussian_probabilityDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGaussian_probabilityDensity" "', argument " "1"" of type '" "DistributionGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionGaussian_probabilityDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((DistributionGaussian const *)arg1)->probabilityDensity(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_getMean(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGaussian_getMean",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGaussian_getMean" "', argument " "1"" of type '" "DistributionGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  result = (double)((DistributionGaussian const *)arg1)->getMean();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_getStdDev(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGaussian_getStdDev",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGaussian_getStdDev" "', argument " "1"" of type '" "DistributionGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  result = (double)((DistributionGaussian const *)arg1)->getStdDev();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_generateValueList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  RealLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:DistributionGaussian_generateValueList",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGaussian_generateValueList" "', argument " "1"" of type '" "DistributionGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionGaussian_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionGaussian_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DistributionGaussian_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DistributionGaussian_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< RealLimits * >(argp4);
+  result = ((DistributionGaussian const *)arg1)->generateValueList(arg2,arg3,(RealLimits const &)*arg4);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_generateValueList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:DistributionGaussian_generateValueList",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGaussian_generateValueList" "', argument " "1"" of type '" "DistributionGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionGaussian_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionGaussian_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((DistributionGaussian const *)arg1)->generateValueList(arg2,arg3);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_generateValueList(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionGaussian, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DistributionGaussian_generateValueList__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionGaussian, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_RealLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DistributionGaussian_generateValueList__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'DistributionGaussian_generateValueList'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionGaussian::generateValueList(size_t,double,RealLimits const &) const\n"
+    "    DistributionGaussian::generateValueList(size_t,double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionGaussian_isDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionGaussian *arg1 = (DistributionGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionGaussian_isDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionGaussian_isDelta" "', argument " "1"" of type '" "DistributionGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionGaussian * >(argp1);
+  result = (bool)((DistributionGaussian const *)arg1)->isDelta();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DistributionGaussian_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_DistributionGaussian, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_DistributionLogNormal__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DistributionLogNormal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_DistributionLogNormal",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DistributionLogNormal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (DistributionLogNormal *)new DistributionLogNormal(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionLogNormal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionLogNormal__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  DistributionLogNormal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_DistributionLogNormal",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DistributionLogNormal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_DistributionLogNormal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (DistributionLogNormal *)new DistributionLogNormal(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionLogNormal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionLogNormal(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_DistributionLogNormal__SWIG_0(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_DistributionLogNormal__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_DistributionLogNormal'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionLogNormal::DistributionLogNormal(double)\n"
+    "    DistributionLogNormal::DistributionLogNormal(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DistributionLogNormal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_DistributionLogNormal",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionLogNormal" "', argument " "1"" of type '" "DistributionLogNormal *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DistributionLogNormal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLogNormal_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_clone" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  result = (DistributionLogNormal *)((DistributionLogNormal const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_probabilityDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DistributionLogNormal_probabilityDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_probabilityDensity" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionLogNormal_probabilityDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((DistributionLogNormal const *)arg1)->probabilityDensity(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_getMean(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLogNormal_getMean",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_getMean" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  result = (double)((DistributionLogNormal const *)arg1)->getMean();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_getMedian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLogNormal_getMedian",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_getMedian" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  result = (double)((DistributionLogNormal const *)arg1)->getMedian();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_getScalePar(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLogNormal_getScalePar",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_getScalePar" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  result = (double)((DistributionLogNormal const *)arg1)->getScalePar();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_generateValueList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  RealLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:DistributionLogNormal_generateValueList",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_generateValueList" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionLogNormal_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionLogNormal_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DistributionLogNormal_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DistributionLogNormal_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< RealLimits * >(argp4);
+  result = ((DistributionLogNormal const *)arg1)->generateValueList(arg2,arg3,(RealLimits const &)*arg4);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_generateValueList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:DistributionLogNormal_generateValueList",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_generateValueList" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionLogNormal_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionLogNormal_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((DistributionLogNormal const *)arg1)->generateValueList(arg2,arg3);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_generateValueList(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionLogNormal, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DistributionLogNormal_generateValueList__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionLogNormal, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_RealLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DistributionLogNormal_generateValueList__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'DistributionLogNormal_generateValueList'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionLogNormal::generateValueList(size_t,double,RealLimits const &) const\n"
+    "    DistributionLogNormal::generateValueList(size_t,double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionLogNormal_isDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionLogNormal *arg1 = (DistributionLogNormal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionLogNormal_isDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionLogNormal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionLogNormal_isDelta" "', argument " "1"" of type '" "DistributionLogNormal const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionLogNormal * >(argp1);
+  result = (bool)((DistributionLogNormal const *)arg1)->isDelta();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DistributionLogNormal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_DistributionLogNormal, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_DistributionCosine__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_DistributionCosine")) SWIG_fail;
+  result = (DistributionCosine *)new DistributionCosine();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionCosine, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionCosine__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  DistributionCosine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_DistributionCosine",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DistributionCosine" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_DistributionCosine" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (DistributionCosine *)new DistributionCosine(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionCosine, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DistributionCosine(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_DistributionCosine__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_DistributionCosine__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_DistributionCosine'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionCosine::DistributionCosine()\n"
+    "    DistributionCosine::DistributionCosine(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DistributionCosine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_DistributionCosine",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DistributionCosine" "', argument " "1"" of type '" "DistributionCosine *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DistributionCosine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionCosine_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionCosine_clone" "', argument " "1"" of type '" "DistributionCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  result = (DistributionCosine *)((DistributionCosine const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_probabilityDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DistributionCosine_probabilityDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionCosine_probabilityDensity" "', argument " "1"" of type '" "DistributionCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionCosine_probabilityDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((DistributionCosine const *)arg1)->probabilityDensity(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_getMean(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionCosine_getMean",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionCosine_getMean" "', argument " "1"" of type '" "DistributionCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  result = (double)((DistributionCosine const *)arg1)->getMean();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_getSigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionCosine_getSigma",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionCosine_getSigma" "', argument " "1"" of type '" "DistributionCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  result = (double)((DistributionCosine const *)arg1)->getSigma();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_generateValueList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  RealLimits *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:DistributionCosine_generateValueList",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionCosine_generateValueList" "', argument " "1"" of type '" "DistributionCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionCosine_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionCosine_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DistributionCosine_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DistributionCosine_generateValueList" "', argument " "4"" of type '" "RealLimits const &""'"); 
+  }
+  arg4 = reinterpret_cast< RealLimits * >(argp4);
+  result = ((DistributionCosine const *)arg1)->generateValueList(arg2,arg3,(RealLimits const &)*arg4);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_generateValueList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:DistributionCosine_generateValueList",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionCosine_generateValueList" "', argument " "1"" of type '" "DistributionCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DistributionCosine_generateValueList" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DistributionCosine_generateValueList" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((DistributionCosine const *)arg1)->generateValueList(arg2,arg3);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_generateValueList(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionCosine, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DistributionCosine_generateValueList__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DistributionCosine, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_RealLimits, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DistributionCosine_generateValueList__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'DistributionCosine_generateValueList'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DistributionCosine::generateValueList(size_t,double,RealLimits const &) const\n"
+    "    DistributionCosine::generateValueList(size_t,double) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DistributionCosine_isDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DistributionCosine *arg1 = (DistributionCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DistributionCosine_isDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DistributionCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DistributionCosine_isDelta" "', argument " "1"" of type '" "DistributionCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< DistributionCosine * >(argp1);
+  result = (bool)((DistributionCosine const *)arg1)->isDelta();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DistributionCosine_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_DistributionCosine, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_DetectorMask__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_DetectorMask")) SWIG_fail;
+  result = (DetectorMask *)new DetectorMask();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DetectorMask, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DetectorMask__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DetectorMask *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_DetectorMask",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_DetectorMask,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DetectorMask" "', argument " "1"" of type '" "DetectorMask const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DetectorMask" "', argument " "1"" of type '" "DetectorMask const &""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  result = (DetectorMask *)new DetectorMask((DetectorMask const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DetectorMask, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DetectorMask(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_DetectorMask__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_DetectorMask, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_DetectorMask__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_DetectorMask'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DetectorMask::DetectorMask()\n"
+    "    DetectorMask::DetectorMask(DetectorMask const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_addMask(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  Geometry::IShape2D *arg2 = 0 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  bool val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:DetectorMask_addMask",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_addMask" "', argument " "1"" of type '" "DetectorMask *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Geometry__IShape2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DetectorMask_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DetectorMask_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Geometry::IShape2D * >(argp2);
+  ecode3 = SWIG_AsVal_bool(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DetectorMask_addMask" "', argument " "3"" of type '" "bool""'");
+  } 
+  arg3 = static_cast< bool >(val3);
+  (arg1)->addMask((Geometry::IShape2D const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_initMaskData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  IDetector2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DetectorMask_initMaskData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_initMaskData" "', argument " "1"" of type '" "DetectorMask *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IDetector2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DetectorMask_initMaskData" "', argument " "2"" of type '" "IDetector2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DetectorMask_initMaskData" "', argument " "2"" of type '" "IDetector2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IDetector2D * >(argp2);
+  (arg1)->initMaskData((IDetector2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_initMaskData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DetectorMask_initMaskData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_initMaskData" "', argument " "1"" of type '" "DetectorMask *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DetectorMask_initMaskData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DetectorMask_initMaskData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  (arg1)->initMaskData((OutputData< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_initMaskData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DetectorMask, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IDetector2D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_DetectorMask_initMaskData__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_DetectorMask, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_DetectorMask_initMaskData__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'DetectorMask_initMaskData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    DetectorMask::initMaskData(IDetector2D const &)\n"
+    "    DetectorMask::initMaskData(OutputData< double > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_isMasked(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:DetectorMask_isMasked",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_isMasked" "', argument " "1"" of type '" "DetectorMask const *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DetectorMask_isMasked" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (bool)((DetectorMask const *)arg1)->isMasked(arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_getMaskData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< bool > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DetectorMask_getMaskData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_getMaskData" "', argument " "1"" of type '" "DetectorMask const *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  result = (OutputData< bool > *)((DetectorMask const *)arg1)->getMaskData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_bool_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_createHistogram(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DetectorMask_createHistogram",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_createHistogram" "', argument " "1"" of type '" "DetectorMask const *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  result = (Histogram2D *)((DetectorMask const *)arg1)->createHistogram();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_removeMasks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DetectorMask_removeMasks",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_removeMasks" "', argument " "1"" of type '" "DetectorMask *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  (arg1)->removeMasks();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_hasMasks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DetectorMask_hasMasks",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_hasMasks" "', argument " "1"" of type '" "DetectorMask const *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  result = (bool)((DetectorMask const *)arg1)->hasMasks();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_numberOfMaskedChannels(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DetectorMask_numberOfMaskedChannels",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_numberOfMaskedChannels" "', argument " "1"" of type '" "DetectorMask const *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  result = (int)((DetectorMask const *)arg1)->numberOfMaskedChannels();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_numberOfMasks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:DetectorMask_numberOfMasks",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_numberOfMasks" "', argument " "1"" of type '" "DetectorMask const *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  result = ((DetectorMask const *)arg1)->numberOfMasks();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DetectorMask_getMaskShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  size_t arg2 ;
+  bool *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Geometry::IShape2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:DetectorMask_getMaskShape",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DetectorMask_getMaskShape" "', argument " "1"" of type '" "DetectorMask const *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DetectorMask_getMaskShape" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_bool,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DetectorMask_getMaskShape" "', argument " "3"" of type '" "bool &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DetectorMask_getMaskShape" "', argument " "3"" of type '" "bool &""'"); 
+  }
+  arg3 = reinterpret_cast< bool * >(argp3);
+  result = (Geometry::IShape2D *)((DetectorMask const *)arg1)->getMaskShape(arg2,*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__IShape2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DetectorMask(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  DetectorMask *arg1 = (DetectorMask *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_DetectorMask",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_DetectorMask, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DetectorMask" "', argument " "1"" of type '" "DetectorMask *""'"); 
+  }
+  arg1 = reinterpret_cast< DetectorMask * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DetectorMask_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_DetectorMask, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Ellipse__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  Geometry::Ellipse *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:new_Ellipse",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Ellipse" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Ellipse" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Ellipse" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_Ellipse" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_Ellipse" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (Geometry::Ellipse *)new Geometry::Ellipse(arg1,arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Ellipse, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Ellipse__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  Geometry::Ellipse *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_Ellipse",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Ellipse" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Ellipse" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Ellipse" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_Ellipse" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (Geometry::Ellipse *)new Geometry::Ellipse(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Ellipse, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Ellipse(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_Ellipse__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_new_Ellipse__SWIG_0(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Ellipse'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::Ellipse::Ellipse(double,double,double,double,double)\n"
+    "    Geometry::Ellipse::Ellipse(double,double,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::Ellipse *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Ellipse_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_clone" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  result = (Geometry::Ellipse *)((Geometry::Ellipse const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_contains__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Ellipse_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_contains" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Ellipse_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Ellipse_contains" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((Geometry::Ellipse const *)arg1)->contains(arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_contains__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Ellipse_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_contains" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Ellipse_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Ellipse_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Ellipse_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Ellipse_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (bool)((Geometry::Ellipse const *)arg1)->contains((Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_contains(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Ellipse, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_Ellipse_contains__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Ellipse, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Ellipse_contains__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Ellipse_contains'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::Ellipse::contains(double,double) const\n"
+    "    Geometry::Ellipse::contains(Bin1D const &,Bin1D const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_getCenterX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Ellipse_getCenterX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_getCenterX" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  result = (double)((Geometry::Ellipse const *)arg1)->getCenterX();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_getCenterY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Ellipse_getCenterY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_getCenterY" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  result = (double)((Geometry::Ellipse const *)arg1)->getCenterY();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_getRadiusX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Ellipse_getRadiusX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_getRadiusX" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  result = (double)((Geometry::Ellipse const *)arg1)->getRadiusX();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_getRadiusY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Ellipse_getRadiusY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_getRadiusY" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  result = (double)((Geometry::Ellipse const *)arg1)->getRadiusY();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Ellipse_getTheta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Ellipse_getTheta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Ellipse_getTheta" "', argument " "1"" of type '" "Geometry::Ellipse const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  result = (double)((Geometry::Ellipse const *)arg1)->getTheta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Ellipse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Ellipse *arg1 = (Geometry::Ellipse *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Ellipse",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Ellipse, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Ellipse" "', argument " "1"" of type '" "Geometry::Ellipse *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Ellipse * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Ellipse_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Geometry__Ellipse, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction1D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction1D *arg1 = (IFTDecayFunction1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDecayFunction1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDecayFunction1D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction1D_clone" "', argument " "1"" of type '" "IFTDecayFunction1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction1D * >(argp1);
+  result = (IFTDecayFunction1D *)((IFTDecayFunction1D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDecayFunction1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction1D_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction1D *arg1 = (IFTDecayFunction1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFTDecayFunction1D_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction1D_evaluate" "', argument " "1"" of type '" "IFTDecayFunction1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDecayFunction1D_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((IFTDecayFunction1D const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction1D_setOmega(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction1D *arg1 = (IFTDecayFunction1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFTDecayFunction1D_setOmega",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction1D_setOmega" "', argument " "1"" of type '" "IFTDecayFunction1D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDecayFunction1D_setOmega" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setOmega(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction1D_getOmega(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction1D *arg1 = (IFTDecayFunction1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDecayFunction1D_getOmega",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction1D_getOmega" "', argument " "1"" of type '" "IFTDecayFunction1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction1D * >(argp1);
+  result = (double)((IFTDecayFunction1D const *)arg1)->getOmega();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IFTDecayFunction1D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction1D *arg1 = (IFTDecayFunction1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFTDecayFunction1D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction1D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFTDecayFunction1D" "', argument " "1"" of type '" "IFTDecayFunction1D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction1D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFTDecayFunction1D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFTDecayFunction1D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction1DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDecayFunction1DCauchy",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDecayFunction1DCauchy *)new FTDecayFunction1DCauchy(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DCauchy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DCauchy *arg1 = (FTDecayFunction1DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction1DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction1DCauchy_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DCauchy_clone" "', argument " "1"" of type '" "FTDecayFunction1DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DCauchy * >(argp1);
+  result = (FTDecayFunction1DCauchy *)((FTDecayFunction1DCauchy const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DCauchy, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DCauchy_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DCauchy *arg1 = (FTDecayFunction1DCauchy *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDecayFunction1DCauchy_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DCauchy_evaluate" "', argument " "1"" of type '" "FTDecayFunction1DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DCauchy * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDecayFunction1DCauchy_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDecayFunction1DCauchy const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDecayFunction1DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DCauchy *arg1 = (FTDecayFunction1DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDecayFunction1DCauchy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DCauchy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDecayFunction1DCauchy" "', argument " "1"" of type '" "FTDecayFunction1DCauchy *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DCauchy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDecayFunction1DCauchy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDecayFunction1DCauchy, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction1DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDecayFunction1DGauss",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDecayFunction1DGauss *)new FTDecayFunction1DGauss(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DGauss *arg1 = (FTDecayFunction1DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction1DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction1DGauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DGauss_clone" "', argument " "1"" of type '" "FTDecayFunction1DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DGauss * >(argp1);
+  result = (FTDecayFunction1DGauss *)((FTDecayFunction1DGauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DGauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DGauss_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DGauss *arg1 = (FTDecayFunction1DGauss *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDecayFunction1DGauss_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DGauss_evaluate" "', argument " "1"" of type '" "FTDecayFunction1DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DGauss * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDecayFunction1DGauss_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDecayFunction1DGauss const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDecayFunction1DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DGauss *arg1 = (FTDecayFunction1DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDecayFunction1DGauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DGauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDecayFunction1DGauss" "', argument " "1"" of type '" "FTDecayFunction1DGauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DGauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDecayFunction1DGauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDecayFunction1DGauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DTriangle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction1DTriangle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDecayFunction1DTriangle",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DTriangle" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDecayFunction1DTriangle *)new FTDecayFunction1DTriangle(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DTriangle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DTriangle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DTriangle *arg1 = (FTDecayFunction1DTriangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction1DTriangle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction1DTriangle_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DTriangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DTriangle_clone" "', argument " "1"" of type '" "FTDecayFunction1DTriangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DTriangle * >(argp1);
+  result = (FTDecayFunction1DTriangle *)((FTDecayFunction1DTriangle const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DTriangle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DTriangle_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DTriangle *arg1 = (FTDecayFunction1DTriangle *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDecayFunction1DTriangle_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DTriangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DTriangle_evaluate" "', argument " "1"" of type '" "FTDecayFunction1DTriangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DTriangle * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDecayFunction1DTriangle_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDecayFunction1DTriangle const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDecayFunction1DTriangle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DTriangle *arg1 = (FTDecayFunction1DTriangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDecayFunction1DTriangle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DTriangle, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDecayFunction1DTriangle" "', argument " "1"" of type '" "FTDecayFunction1DTriangle *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DTriangle * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDecayFunction1DTriangle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDecayFunction1DTriangle, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction1DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDecayFunction1DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDecayFunction1DVoigt",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction1DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction1DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDecayFunction1DVoigt *)new FTDecayFunction1DVoigt(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DVoigt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DVoigt *arg1 = (FTDecayFunction1DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction1DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction1DVoigt_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DVoigt_clone" "', argument " "1"" of type '" "FTDecayFunction1DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DVoigt * >(argp1);
+  result = (FTDecayFunction1DVoigt *)((FTDecayFunction1DVoigt const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction1DVoigt, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DVoigt_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DVoigt *arg1 = (FTDecayFunction1DVoigt *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDecayFunction1DVoigt_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DVoigt_evaluate" "', argument " "1"" of type '" "FTDecayFunction1DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DVoigt * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDecayFunction1DVoigt_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDecayFunction1DVoigt const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction1DVoigt_getEta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DVoigt *arg1 = (FTDecayFunction1DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction1DVoigt_getEta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction1DVoigt_getEta" "', argument " "1"" of type '" "FTDecayFunction1DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DVoigt * >(argp1);
+  result = (double)((FTDecayFunction1DVoigt const *)arg1)->getEta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDecayFunction1DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction1DVoigt *arg1 = (FTDecayFunction1DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDecayFunction1DVoigt",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction1DVoigt, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDecayFunction1DVoigt" "', argument " "1"" of type '" "FTDecayFunction1DVoigt *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction1DVoigt * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDecayFunction1DVoigt_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDecayFunction1DVoigt, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDecayFunction2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDecayFunction2D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_clone" "', argument " "1"" of type '" "IFTDecayFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  result = (IFTDecayFunction2D *)((IFTDecayFunction2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_setGamma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFTDecayFunction2D_setGamma",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_setGamma" "', argument " "1"" of type '" "IFTDecayFunction2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDecayFunction2D_setGamma" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setGamma(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_getGamma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDecayFunction2D_getGamma",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_getGamma" "', argument " "1"" of type '" "IFTDecayFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  result = (double)((IFTDecayFunction2D const *)arg1)->getGamma();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_getDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDecayFunction2D_getDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_getDelta" "', argument " "1"" of type '" "IFTDecayFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  result = (double)((IFTDecayFunction2D const *)arg1)->getDelta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_getDecayLengthX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDecayFunction2D_getDecayLengthX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_getDecayLengthX" "', argument " "1"" of type '" "IFTDecayFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  result = (double)((IFTDecayFunction2D const *)arg1)->getDecayLengthX();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_getDecayLengthY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDecayFunction2D_getDecayLengthY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_getDecayLengthY" "', argument " "1"" of type '" "IFTDecayFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  result = (double)((IFTDecayFunction2D const *)arg1)->getDecayLengthY();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IFTDecayFunction2D_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_evaluate" "', argument " "1"" of type '" "IFTDecayFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDecayFunction2D_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IFTDecayFunction2D_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((IFTDecayFunction2D const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDecayFunction2D_transformToStarBasis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  double arg6 ;
+  double *arg7 = 0 ;
+  double *arg8 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  void *argp7 = 0 ;
+  int res7 = 0 ;
+  void *argp8 = 0 ;
+  int res8 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  PyObject * obj6 = 0 ;
+  PyObject * obj7 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:IFTDecayFunction2D_transformToStarBasis",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "1"" of type '" "IFTDecayFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  res7 = SWIG_ConvertPtr(obj6, &argp7, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res7)) {
+    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "7"" of type '" "double &""'"); 
+  }
+  if (!argp7) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "7"" of type '" "double &""'"); 
+  }
+  arg7 = reinterpret_cast< double * >(argp7);
+  res8 = SWIG_ConvertPtr(obj7, &argp8, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res8)) {
+    SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "8"" of type '" "double &""'"); 
+  }
+  if (!argp8) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFTDecayFunction2D_transformToStarBasis" "', argument " "8"" of type '" "double &""'"); 
+  }
+  arg8 = reinterpret_cast< double * >(argp8);
+  ((IFTDecayFunction2D const *)arg1)->transformToStarBasis(arg2,arg3,arg4,arg5,arg6,*arg7,*arg8);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IFTDecayFunction2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDecayFunction2D *arg1 = (IFTDecayFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFTDecayFunction2D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDecayFunction2D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFTDecayFunction2D" "', argument " "1"" of type '" "IFTDecayFunction2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDecayFunction2D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFTDecayFunction2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFTDecayFunction2D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDecayFunction2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDecayFunction2DCauchy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDecayFunction2DCauchy *)new FTDecayFunction2DCauchy(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDecayFunction2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDecayFunction2DCauchy",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDecayFunction2DCauchy *)new FTDecayFunction2DCauchy(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDecayFunction2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDecayFunction2DCauchy",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DCauchy" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDecayFunction2DCauchy *)new FTDecayFunction2DCauchy(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DCauchy(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FTDecayFunction2DCauchy__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDecayFunction2DCauchy__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDecayFunction2DCauchy__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDecayFunction2DCauchy'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double,double,double,double)\n"
+    "    FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double,double,double)\n"
+    "    FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction2DCauchy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DCauchy *arg1 = (FTDecayFunction2DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction2DCauchy_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction2DCauchy_clone" "', argument " "1"" of type '" "FTDecayFunction2DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DCauchy * >(argp1);
+  result = (FTDecayFunction2DCauchy *)((FTDecayFunction2DCauchy const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DCauchy, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction2DCauchy_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DCauchy *arg1 = (FTDecayFunction2DCauchy *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDecayFunction2DCauchy_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction2DCauchy_evaluate" "', argument " "1"" of type '" "FTDecayFunction2DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DCauchy * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDecayFunction2DCauchy_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDecayFunction2DCauchy_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDecayFunction2DCauchy const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDecayFunction2DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DCauchy *arg1 = (FTDecayFunction2DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDecayFunction2DCauchy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DCauchy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDecayFunction2DCauchy" "', argument " "1"" of type '" "FTDecayFunction2DCauchy *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DCauchy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDecayFunction2DCauchy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDecayFunction2DCauchy, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDecayFunction2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDecayFunction2DGauss",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDecayFunction2DGauss" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDecayFunction2DGauss" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDecayFunction2DGauss *)new FTDecayFunction2DGauss(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDecayFunction2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDecayFunction2DGauss",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDecayFunction2DGauss" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDecayFunction2DGauss *)new FTDecayFunction2DGauss(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDecayFunction2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDecayFunction2DGauss",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDecayFunction2DGauss *)new FTDecayFunction2DGauss(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DGauss(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FTDecayFunction2DGauss__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDecayFunction2DGauss__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDecayFunction2DGauss__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDecayFunction2DGauss'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction2DGauss::FTDecayFunction2DGauss(double,double,double,double)\n"
+    "    FTDecayFunction2DGauss::FTDecayFunction2DGauss(double,double,double)\n"
+    "    FTDecayFunction2DGauss::FTDecayFunction2DGauss(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction2DGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DGauss *arg1 = (FTDecayFunction2DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction2DGauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction2DGauss_clone" "', argument " "1"" of type '" "FTDecayFunction2DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DGauss * >(argp1);
+  result = (FTDecayFunction2DGauss *)((FTDecayFunction2DGauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DGauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction2DGauss_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DGauss *arg1 = (FTDecayFunction2DGauss *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDecayFunction2DGauss_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction2DGauss_evaluate" "', argument " "1"" of type '" "FTDecayFunction2DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DGauss * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDecayFunction2DGauss_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDecayFunction2DGauss_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDecayFunction2DGauss const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDecayFunction2DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DGauss *arg1 = (FTDecayFunction2DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDecayFunction2DGauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DGauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDecayFunction2DGauss" "', argument " "1"" of type '" "FTDecayFunction2DGauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DGauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDecayFunction2DGauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDecayFunction2DGauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  FTDecayFunction2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:new_FTDecayFunction2DVoigt",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (FTDecayFunction2DVoigt *)new FTDecayFunction2DVoigt(arg1,arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDecayFunction2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDecayFunction2DVoigt",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDecayFunction2DVoigt *)new FTDecayFunction2DVoigt(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDecayFunction2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDecayFunction2DVoigt",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDecayFunction2DVoigt" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDecayFunction2DVoigt *)new FTDecayFunction2DVoigt(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDecayFunction2DVoigt(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDecayFunction2DVoigt__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDecayFunction2DVoigt__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_new_FTDecayFunction2DVoigt__SWIG_0(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDecayFunction2DVoigt'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double,double,double,double,double)\n"
+    "    FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double,double,double,double)\n"
+    "    FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction2DVoigt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DVoigt *arg1 = (FTDecayFunction2DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDecayFunction2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction2DVoigt_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction2DVoigt_clone" "', argument " "1"" of type '" "FTDecayFunction2DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DVoigt * >(argp1);
+  result = (FTDecayFunction2DVoigt *)((FTDecayFunction2DVoigt const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDecayFunction2DVoigt, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction2DVoigt_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DVoigt *arg1 = (FTDecayFunction2DVoigt *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDecayFunction2DVoigt_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction2DVoigt_evaluate" "', argument " "1"" of type '" "FTDecayFunction2DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DVoigt * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDecayFunction2DVoigt_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDecayFunction2DVoigt_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDecayFunction2DVoigt const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDecayFunction2DVoigt_getEta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DVoigt *arg1 = (FTDecayFunction2DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDecayFunction2DVoigt_getEta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDecayFunction2DVoigt_getEta" "', argument " "1"" of type '" "FTDecayFunction2DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DVoigt * >(argp1);
+  result = (double)((FTDecayFunction2DVoigt const *)arg1)->getEta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDecayFunction2DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDecayFunction2DVoigt *arg1 = (FTDecayFunction2DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDecayFunction2DVoigt",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDecayFunction2DVoigt, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDecayFunction2DVoigt" "', argument " "1"" of type '" "FTDecayFunction2DVoigt *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDecayFunction2DVoigt * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDecayFunction2DVoigt_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDecayFunction2DVoigt, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IFTDistribution1D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution1D *arg1 = (IFTDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDistribution1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDistribution1D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution1D_clone" "', argument " "1"" of type '" "IFTDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution1D * >(argp1);
+  result = (IFTDistribution1D *)((IFTDistribution1D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDistribution1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution1D_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution1D *arg1 = (IFTDistribution1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFTDistribution1D_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution1D_evaluate" "', argument " "1"" of type '" "IFTDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDistribution1D_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((IFTDistribution1D const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution1D_setOmega(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution1D *arg1 = (IFTDistribution1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFTDistribution1D_setOmega",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution1D_setOmega" "', argument " "1"" of type '" "IFTDistribution1D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDistribution1D_setOmega" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setOmega(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution1D_getOmega(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution1D *arg1 = (IFTDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDistribution1D_getOmega",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution1D_getOmega" "', argument " "1"" of type '" "IFTDistribution1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution1D * >(argp1);
+  result = (double)((IFTDistribution1D const *)arg1)->getOmega();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IFTDistribution1D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution1D *arg1 = (IFTDistribution1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFTDistribution1D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution1D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFTDistribution1D" "', argument " "1"" of type '" "IFTDistribution1D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution1D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFTDistribution1D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFTDistribution1D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution1DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDistribution1DCauchy",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution1DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDistribution1DCauchy *)new FTDistribution1DCauchy(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DCauchy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DCauchy *arg1 = (FTDistribution1DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution1DCauchy_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DCauchy_clone" "', argument " "1"" of type '" "FTDistribution1DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DCauchy * >(argp1);
+  result = (FTDistribution1DCauchy *)((FTDistribution1DCauchy const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DCauchy, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DCauchy_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DCauchy *arg1 = (FTDistribution1DCauchy *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDistribution1DCauchy_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DCauchy_evaluate" "', argument " "1"" of type '" "FTDistribution1DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DCauchy * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution1DCauchy_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDistribution1DCauchy const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution1DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DCauchy *arg1 = (FTDistribution1DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution1DCauchy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DCauchy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution1DCauchy" "', argument " "1"" of type '" "FTDistribution1DCauchy *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DCauchy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution1DCauchy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution1DCauchy, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution1DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDistribution1DGauss",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution1DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDistribution1DGauss *)new FTDistribution1DGauss(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DGauss *arg1 = (FTDistribution1DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution1DGauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DGauss_clone" "', argument " "1"" of type '" "FTDistribution1DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DGauss * >(argp1);
+  result = (FTDistribution1DGauss *)((FTDistribution1DGauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DGauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DGauss_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DGauss *arg1 = (FTDistribution1DGauss *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDistribution1DGauss_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DGauss_evaluate" "', argument " "1"" of type '" "FTDistribution1DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DGauss * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution1DGauss_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDistribution1DGauss const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution1DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DGauss *arg1 = (FTDistribution1DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution1DGauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DGauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution1DGauss" "', argument " "1"" of type '" "FTDistribution1DGauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DGauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution1DGauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution1DGauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution1DGate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDistribution1DGate",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution1DGate" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDistribution1DGate *)new FTDistribution1DGate(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DGate, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DGate_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DGate *arg1 = (FTDistribution1DGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution1DGate_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DGate_clone" "', argument " "1"" of type '" "FTDistribution1DGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DGate * >(argp1);
+  result = (FTDistribution1DGate *)((FTDistribution1DGate const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DGate, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DGate_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DGate *arg1 = (FTDistribution1DGate *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDistribution1DGate_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DGate_evaluate" "', argument " "1"" of type '" "FTDistribution1DGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DGate * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution1DGate_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDistribution1DGate const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution1DGate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DGate *arg1 = (FTDistribution1DGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution1DGate",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DGate, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution1DGate" "', argument " "1"" of type '" "FTDistribution1DGate *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DGate * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution1DGate_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution1DGate, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution1DTriangle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DTriangle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDistribution1DTriangle",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution1DTriangle" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDistribution1DTriangle *)new FTDistribution1DTriangle(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DTriangle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution1DTriangle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DTriangle *arg1 = (FTDistribution1DTriangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution1DTriangle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DTriangle, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution1DTriangle" "', argument " "1"" of type '" "FTDistribution1DTriangle *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DTriangle * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DTriangle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DTriangle *arg1 = (FTDistribution1DTriangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DTriangle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution1DTriangle_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DTriangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DTriangle_clone" "', argument " "1"" of type '" "FTDistribution1DTriangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DTriangle * >(argp1);
+  result = (FTDistribution1DTriangle *)((FTDistribution1DTriangle const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DTriangle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DTriangle_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DTriangle *arg1 = (FTDistribution1DTriangle *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDistribution1DTriangle_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DTriangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DTriangle_evaluate" "', argument " "1"" of type '" "FTDistribution1DTriangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DTriangle * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution1DTriangle_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDistribution1DTriangle const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution1DTriangle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution1DTriangle, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution1DCosine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DCosine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FTDistribution1DCosine",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution1DCosine" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FTDistribution1DCosine *)new FTDistribution1DCosine(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DCosine, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DCosine_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DCosine *arg1 = (FTDistribution1DCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DCosine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution1DCosine_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DCosine_clone" "', argument " "1"" of type '" "FTDistribution1DCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DCosine * >(argp1);
+  result = (FTDistribution1DCosine *)((FTDistribution1DCosine const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DCosine, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DCosine_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DCosine *arg1 = (FTDistribution1DCosine *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDistribution1DCosine_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DCosine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DCosine_evaluate" "', argument " "1"" of type '" "FTDistribution1DCosine const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DCosine * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution1DCosine_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDistribution1DCosine const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution1DCosine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DCosine *arg1 = (FTDistribution1DCosine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution1DCosine",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DCosine, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution1DCosine" "', argument " "1"" of type '" "FTDistribution1DCosine *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DCosine * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution1DCosine_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution1DCosine, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution1DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDistribution1DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDistribution1DVoigt",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution1DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution1DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDistribution1DVoigt *)new FTDistribution1DVoigt(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DVoigt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DVoigt *arg1 = (FTDistribution1DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution1DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution1DVoigt_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DVoigt_clone" "', argument " "1"" of type '" "FTDistribution1DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DVoigt * >(argp1);
+  result = (FTDistribution1DVoigt *)((FTDistribution1DVoigt const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution1DVoigt, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DVoigt_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DVoigt *arg1 = (FTDistribution1DVoigt *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FTDistribution1DVoigt_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DVoigt_evaluate" "', argument " "1"" of type '" "FTDistribution1DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DVoigt * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution1DVoigt_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (double)((FTDistribution1DVoigt const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution1DVoigt_getEta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DVoigt *arg1 = (FTDistribution1DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution1DVoigt_getEta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution1DVoigt_getEta" "', argument " "1"" of type '" "FTDistribution1DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DVoigt * >(argp1);
+  result = (double)((FTDistribution1DVoigt const *)arg1)->getEta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution1DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution1DVoigt *arg1 = (FTDistribution1DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution1DVoigt",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution1DVoigt, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution1DVoigt" "', argument " "1"" of type '" "FTDistribution1DVoigt *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution1DVoigt * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution1DVoigt_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution1DVoigt, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IFTDistribution2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDistribution2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDistribution2D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution2D_clone" "', argument " "1"" of type '" "IFTDistribution2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  result = (IFTDistribution2D *)((IFTDistribution2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution2D_setGamma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFTDistribution2D_setGamma",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution2D_setGamma" "', argument " "1"" of type '" "IFTDistribution2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDistribution2D_setGamma" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setGamma(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution2D_getGamma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDistribution2D_getGamma",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution2D_getGamma" "', argument " "1"" of type '" "IFTDistribution2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  result = (double)((IFTDistribution2D const *)arg1)->getGamma();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution2D_getDelta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDistribution2D_getDelta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution2D_getDelta" "', argument " "1"" of type '" "IFTDistribution2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  result = (double)((IFTDistribution2D const *)arg1)->getDelta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution2D_getCoherenceLengthX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDistribution2D_getCoherenceLengthX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution2D_getCoherenceLengthX" "', argument " "1"" of type '" "IFTDistribution2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  result = (double)((IFTDistribution2D const *)arg1)->getCoherenceLengthX();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution2D_getCoherenceLengthY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFTDistribution2D_getCoherenceLengthY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution2D_getCoherenceLengthY" "', argument " "1"" of type '" "IFTDistribution2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  result = (double)((IFTDistribution2D const *)arg1)->getCoherenceLengthY();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFTDistribution2D_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IFTDistribution2D_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFTDistribution2D_evaluate" "', argument " "1"" of type '" "IFTDistribution2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IFTDistribution2D_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IFTDistribution2D_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((IFTDistribution2D const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IFTDistribution2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFTDistribution2D *arg1 = (IFTDistribution2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFTDistribution2D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFTDistribution2D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFTDistribution2D" "', argument " "1"" of type '" "IFTDistribution2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IFTDistribution2D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFTDistribution2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFTDistribution2D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCauchy__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDistribution2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDistribution2DCauchy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DCauchy" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DCauchy" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDistribution2DCauchy" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDistribution2DCauchy *)new FTDistribution2DCauchy(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCauchy__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDistribution2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDistribution2DCauchy",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DCauchy" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DCauchy" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDistribution2DCauchy *)new FTDistribution2DCauchy(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCauchy__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDistribution2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDistribution2DCauchy",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DCauchy" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DCauchy" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDistribution2DCauchy *)new FTDistribution2DCauchy(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCauchy, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCauchy(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FTDistribution2DCauchy__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDistribution2DCauchy__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDistribution2DCauchy__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDistribution2DCauchy'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDistribution2DCauchy::FTDistribution2DCauchy(double,double,double,double)\n"
+    "    FTDistribution2DCauchy::FTDistribution2DCauchy(double,double,double)\n"
+    "    FTDistribution2DCauchy::FTDistribution2DCauchy(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DCauchy_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DCauchy *arg1 = (FTDistribution2DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution2DCauchy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution2DCauchy_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DCauchy_clone" "', argument " "1"" of type '" "FTDistribution2DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DCauchy * >(argp1);
+  result = (FTDistribution2DCauchy *)((FTDistribution2DCauchy const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCauchy, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DCauchy_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DCauchy *arg1 = (FTDistribution2DCauchy *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDistribution2DCauchy_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DCauchy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DCauchy_evaluate" "', argument " "1"" of type '" "FTDistribution2DCauchy const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DCauchy * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution2DCauchy_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDistribution2DCauchy_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDistribution2DCauchy const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution2DCauchy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DCauchy *arg1 = (FTDistribution2DCauchy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution2DCauchy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DCauchy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution2DCauchy" "', argument " "1"" of type '" "FTDistribution2DCauchy *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DCauchy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution2DCauchy_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution2DCauchy, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGauss__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDistribution2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDistribution2DGauss",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DGauss" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDistribution2DGauss" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDistribution2DGauss *)new FTDistribution2DGauss(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGauss__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDistribution2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDistribution2DGauss",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DGauss" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDistribution2DGauss *)new FTDistribution2DGauss(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGauss__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDistribution2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDistribution2DGauss",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDistribution2DGauss *)new FTDistribution2DGauss(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGauss(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FTDistribution2DGauss__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDistribution2DGauss__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDistribution2DGauss__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDistribution2DGauss'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDistribution2DGauss::FTDistribution2DGauss(double,double,double,double)\n"
+    "    FTDistribution2DGauss::FTDistribution2DGauss(double,double,double)\n"
+    "    FTDistribution2DGauss::FTDistribution2DGauss(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DGauss *arg1 = (FTDistribution2DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution2DGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution2DGauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DGauss_clone" "', argument " "1"" of type '" "FTDistribution2DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DGauss * >(argp1);
+  result = (FTDistribution2DGauss *)((FTDistribution2DGauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DGauss_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DGauss *arg1 = (FTDistribution2DGauss *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDistribution2DGauss_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DGauss_evaluate" "', argument " "1"" of type '" "FTDistribution2DGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DGauss * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution2DGauss_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDistribution2DGauss_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDistribution2DGauss const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution2DGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DGauss *arg1 = (FTDistribution2DGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution2DGauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DGauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution2DGauss" "', argument " "1"" of type '" "FTDistribution2DGauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DGauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution2DGauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution2DGauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGate__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDistribution2DGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDistribution2DGate",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DGate" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DGate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DGate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDistribution2DGate" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDistribution2DGate *)new FTDistribution2DGate(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGate, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGate__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDistribution2DGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDistribution2DGate",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DGate" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DGate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DGate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDistribution2DGate *)new FTDistribution2DGate(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGate, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGate__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDistribution2DGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDistribution2DGate",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DGate" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DGate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDistribution2DGate *)new FTDistribution2DGate(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGate, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DGate(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FTDistribution2DGate__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDistribution2DGate__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDistribution2DGate__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDistribution2DGate'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDistribution2DGate::FTDistribution2DGate(double,double,double,double)\n"
+    "    FTDistribution2DGate::FTDistribution2DGate(double,double,double)\n"
+    "    FTDistribution2DGate::FTDistribution2DGate(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DGate_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DGate *arg1 = (FTDistribution2DGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution2DGate *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution2DGate_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DGate_clone" "', argument " "1"" of type '" "FTDistribution2DGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DGate * >(argp1);
+  result = (FTDistribution2DGate *)((FTDistribution2DGate const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DGate, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DGate_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DGate *arg1 = (FTDistribution2DGate *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDistribution2DGate_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DGate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DGate_evaluate" "', argument " "1"" of type '" "FTDistribution2DGate const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DGate * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution2DGate_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDistribution2DGate_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDistribution2DGate const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution2DGate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DGate *arg1 = (FTDistribution2DGate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution2DGate",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DGate, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution2DGate" "', argument " "1"" of type '" "FTDistribution2DGate *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DGate * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution2DGate_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution2DGate, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCone__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDistribution2DCone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDistribution2DCone",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DCone" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DCone" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DCone" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDistribution2DCone" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDistribution2DCone *)new FTDistribution2DCone(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCone, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCone__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDistribution2DCone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDistribution2DCone",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DCone" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DCone" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DCone" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDistribution2DCone *)new FTDistribution2DCone(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCone, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCone__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FTDistribution2DCone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FTDistribution2DCone",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DCone" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DCone" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FTDistribution2DCone *)new FTDistribution2DCone(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCone, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DCone(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FTDistribution2DCone__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDistribution2DCone__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDistribution2DCone__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDistribution2DCone'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDistribution2DCone::FTDistribution2DCone(double,double,double,double)\n"
+    "    FTDistribution2DCone::FTDistribution2DCone(double,double,double)\n"
+    "    FTDistribution2DCone::FTDistribution2DCone(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DCone_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DCone *arg1 = (FTDistribution2DCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution2DCone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution2DCone_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DCone_clone" "', argument " "1"" of type '" "FTDistribution2DCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DCone * >(argp1);
+  result = (FTDistribution2DCone *)((FTDistribution2DCone const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DCone, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DCone_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DCone *arg1 = (FTDistribution2DCone *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDistribution2DCone_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DCone_evaluate" "', argument " "1"" of type '" "FTDistribution2DCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DCone * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution2DCone_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDistribution2DCone_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDistribution2DCone const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution2DCone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DCone *arg1 = (FTDistribution2DCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution2DCone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DCone, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution2DCone" "', argument " "1"" of type '" "FTDistribution2DCone *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DCone * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution2DCone_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution2DCone, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DVoigt__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  FTDistribution2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:new_FTDistribution2DVoigt",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DVoigt" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDistribution2DVoigt" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_FTDistribution2DVoigt" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (FTDistribution2DVoigt *)new FTDistribution2DVoigt(arg1,arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DVoigt__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FTDistribution2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FTDistribution2DVoigt",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DVoigt" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FTDistribution2DVoigt" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FTDistribution2DVoigt *)new FTDistribution2DVoigt(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DVoigt__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FTDistribution2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FTDistribution2DVoigt",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FTDistribution2DVoigt" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FTDistribution2DVoigt" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FTDistribution2DVoigt" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FTDistribution2DVoigt *)new FTDistribution2DVoigt(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DVoigt, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FTDistribution2DVoigt(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FTDistribution2DVoigt__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FTDistribution2DVoigt__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_new_FTDistribution2DVoigt__SWIG_0(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FTDistribution2DVoigt'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FTDistribution2DVoigt::FTDistribution2DVoigt(double,double,double,double,double)\n"
+    "    FTDistribution2DVoigt::FTDistribution2DVoigt(double,double,double,double)\n"
+    "    FTDistribution2DVoigt::FTDistribution2DVoigt(double,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DVoigt_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DVoigt *arg1 = (FTDistribution2DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FTDistribution2DVoigt *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution2DVoigt_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DVoigt_clone" "', argument " "1"" of type '" "FTDistribution2DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DVoigt * >(argp1);
+  result = (FTDistribution2DVoigt *)((FTDistribution2DVoigt const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FTDistribution2DVoigt, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DVoigt_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DVoigt *arg1 = (FTDistribution2DVoigt *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FTDistribution2DVoigt_evaluate",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DVoigt_evaluate" "', argument " "1"" of type '" "FTDistribution2DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DVoigt * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FTDistribution2DVoigt_evaluate" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FTDistribution2DVoigt_evaluate" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((FTDistribution2DVoigt const *)arg1)->evaluate(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FTDistribution2DVoigt_getEta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DVoigt *arg1 = (FTDistribution2DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FTDistribution2DVoigt_getEta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DVoigt, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FTDistribution2DVoigt_getEta" "', argument " "1"" of type '" "FTDistribution2DVoigt const *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DVoigt * >(argp1);
+  result = (double)((FTDistribution2DVoigt const *)arg1)->getEta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FTDistribution2DVoigt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FTDistribution2DVoigt *arg1 = (FTDistribution2DVoigt *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FTDistribution2DVoigt",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FTDistribution2DVoigt, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FTDistribution2DVoigt" "', argument " "1"" of type '" "FTDistribution2DVoigt *""'"); 
+  }
+  arg1 = reinterpret_cast< FTDistribution2DVoigt * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FTDistribution2DVoigt_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FTDistribution2DVoigt, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FixedBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  int res1 = SWIG_OLDOBJ ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FixedBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FixedBinAxis",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FixedBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FixedBinAxis" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FixedBinAxis" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FixedBinAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FixedBinAxis" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FixedBinAxis *)new FixedBinAxis((std::string const &)*arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FixedBinAxis, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FixedBinAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FixedBinAxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FixedBinAxis" "', argument " "1"" of type '" "FixedBinAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FixedBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FixedBinAxis_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_clone" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  result = (FixedBinAxis *)((FixedBinAxis const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FixedBinAxis_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_size" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  result = ((FixedBinAxis const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_getBin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Bin1D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FixedBinAxis_getBin",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_getBin" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FixedBinAxis_getBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((FixedBinAxis const *)arg1)->getBin(arg2);
+  resultobj = SWIG_NewPointerObj((new Bin1D(static_cast< const Bin1D& >(result))), SWIGTYPE_p_Bin1D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_getMin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FixedBinAxis_getMin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_getMin" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  result = (double)((FixedBinAxis const *)arg1)->getMin();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_getMax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FixedBinAxis_getMax",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_getMax" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  result = (double)((FixedBinAxis const *)arg1)->getMax();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_getBinCenter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FixedBinAxis_getBinCenter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_getBinCenter" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FixedBinAxis_getBinCenter" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((FixedBinAxis const *)arg1)->getBinCenter(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_findClosestIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FixedBinAxis_findClosestIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_findClosestIndex" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FixedBinAxis_findClosestIndex" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((FixedBinAxis const *)arg1)->findClosestIndex(arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_getBinCenters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FixedBinAxis_getBinCenters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_getBinCenters" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  result = ((FixedBinAxis const *)arg1)->getBinCenters();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_getBinBoundaries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FixedBinAxis_getBinBoundaries",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_getBinBoundaries" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  result = ((FixedBinAxis const *)arg1)->getBinBoundaries();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis_createClippedAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FixedBinAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FixedBinAxis_createClippedAxis",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis_createClippedAxis" "', argument " "1"" of type '" "FixedBinAxis const *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FixedBinAxis_createClippedAxis" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FixedBinAxis_createClippedAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FixedBinAxis *)((FixedBinAxis const *)arg1)->createClippedAxis(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FixedBinAxis___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FixedBinAxis *arg1 = (FixedBinAxis *) 0 ;
+  unsigned int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FixedBinAxis___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FixedBinAxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FixedBinAxis___getitem__" "', argument " "1"" of type '" "FixedBinAxis *""'"); 
+  }
+  arg1 = reinterpret_cast< FixedBinAxis * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FixedBinAxis___getitem__" "', argument " "2"" of type '" "unsigned int""'");
+  } 
+  arg2 = static_cast< unsigned int >(val2);
+  result = (double)FixedBinAxis___getitem__(arg1,arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FixedBinAxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FixedBinAxis, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyObject * obj0 = 0 ;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IFormFactor",&obj0)) SWIG_fail;
+  arg1 = obj0;
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IFormFactor *)new SwigDirector_IFormFactor(arg1); 
+  } else {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
+    SWIG_fail;
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFormFactor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFormFactor" "', argument " "1"" of type '" "IFormFactor *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactor_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_clone" "', argument " "1"" of type '" "IFormFactor const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IFormFactor::clone");
+    } else {
+      result = (IFormFactor *)((IFormFactor const *)arg1)->clone();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactor_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_accept" "', argument " "1"" of type '" "IFormFactor const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactor_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IFormFactor::accept");
+    } else {
+      ((IFormFactor const *)arg1)->accept(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactor_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_setAmbientMaterial" "', argument " "1"" of type '" "IFormFactor *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactor_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactor_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IFormFactor::setAmbientMaterial((IMaterial const &)*arg2);
+    } else {
+      (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  WavevectorInfo *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactor_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_evaluate" "', argument " "1"" of type '" "IFormFactor const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_WavevectorInfo,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactor_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactor_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  arg2 = reinterpret_cast< WavevectorInfo * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IFormFactor::evaluate");
+    } else {
+      result = ((IFormFactor const *)arg1)->evaluate((WavevectorInfo const &)*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactor_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_getVolume" "', argument " "1"" of type '" "IFormFactor const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = (double)((IFormFactor const *)arg1)->IFormFactor::getVolume();
+    } else {
+      result = (double)((IFormFactor const *)arg1)->getVolume();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactor_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_getRadialExtension" "', argument " "1"" of type '" "IFormFactor const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IFormFactor::getRadialExtension");
+    } else {
+      result = (double)((IFormFactor const *)arg1)->getRadialExtension();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_setSpecularInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  ILayerRTCoefficients *arg2 = (ILayerRTCoefficients *) 0 ;
+  ILayerRTCoefficients *arg3 = (ILayerRTCoefficients *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IFormFactor_setSpecularInfo",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_setSpecularInfo" "', argument " "1"" of type '" "IFormFactor *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ILayerRTCoefficients, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactor_setSpecularInfo" "', argument " "2"" of type '" "ILayerRTCoefficients const *""'"); 
+  }
+  arg2 = reinterpret_cast< ILayerRTCoefficients * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ILayerRTCoefficients, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IFormFactor_setSpecularInfo" "', argument " "3"" of type '" "ILayerRTCoefficients const *""'"); 
+  }
+  arg3 = reinterpret_cast< ILayerRTCoefficients * >(argp3);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      (arg1)->IFormFactor::setSpecularInfo((ILayerRTCoefficients const *)arg2,(ILayerRTCoefficients const *)arg3);
+    } else {
+      (arg1)->setSpecularInfo((ILayerRTCoefficients const *)arg2,(ILayerRTCoefficients const *)arg3);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_IFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_IFormFactor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IFormFactor" "', argument " "1"" of type '" "IFormFactor *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor_onChange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IFormFactor *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactor_onChange",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor_onChange" "', argument " "1"" of type '" "IFormFactor *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("onChange"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member onChange");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IFormFactor *>(arg1);
+    if (upcall) {
+      (darg)->onChangeSwigPublic();
+    } else {
+      (darg)->onChange();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactor__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = (IFormFactor *) 0 ;
+  std::ostream *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IFormFactor *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactor__print",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactor__print" "', argument " "1"" of type '" "IFormFactor const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__ostream,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactor__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactor__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  arg2 = reinterpret_cast< std::ostream * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("print"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member print");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IFormFactor *>(arg1);
+    if (upcall) {
+      ((SwigDirector_IFormFactor const *)darg)->printSwigPublic(*arg2);
+    } else {
+      ((SwigDirector_IFormFactor const *)darg)->print(*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFormFactor_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFormFactor, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_iterator" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_IFormFactor_Sm__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___nonzero__" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (bool)std_vector_Sl_IFormFactor_Sm__Sg____nonzero__((std::vector< IFormFactor * > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___bool__" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (bool)std_vector_Sl_IFormFactor_Sm__Sg____bool__((std::vector< IFormFactor * > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___len__" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = std_vector_Sl_IFormFactor_Sm__Sg____len__((std::vector< IFormFactor * > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::difference_type arg2 ;
+  std::vector< IFormFactor * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< IFormFactor *,std::allocator< IFormFactor * > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___getslice__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t___getslice__" "', argument " "2"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_IFormFactorPtr_t___getslice__" "', argument " "3"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< IFormFactor * >::difference_type >(val3);
+  try {
+    result = (std::vector< IFormFactor *,std::allocator< IFormFactor * > > *)std_vector_Sl_IFormFactor_Sm__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::difference_type arg2 ;
+  std::vector< IFormFactor * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "2"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "3"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< IFormFactor * >::difference_type >(val3);
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::difference_type arg2 ;
+  std::vector< IFormFactor * >::difference_type arg3 ;
+  std::vector< IFormFactor *,std::allocator< IFormFactor * > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_IFormFactorPtr_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "2"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "3"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< IFormFactor * >::difference_type >(val3);
+  {
+    std::vector< IFormFactor*,std::allocator< IFormFactor * > > *ptr = (std::vector< IFormFactor*,std::allocator< IFormFactor * > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "4"" of type '" "std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_IFormFactorPtr_t___setslice__" "', argument " "4"" of type '" "std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_IFormFactorPtr_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_IFormFactorPtr_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_IFormFactorPtr_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::__setslice__(std::vector< IFormFactor * >::difference_type,std::vector< IFormFactor * >::difference_type)\n"
+    "    std::vector< IFormFactor * >::__setslice__(std::vector< IFormFactor * >::difference_type,std::vector< IFormFactor * >::difference_type,std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::difference_type arg2 ;
+  std::vector< IFormFactor * >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___delslice__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t___delslice__" "', argument " "2"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_IFormFactorPtr_t___delslice__" "', argument " "3"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< IFormFactor * >::difference_type >(val3);
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___delitem__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t___delitem__" "', argument " "2"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::difference_type >(val2);
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< IFormFactor *,std::allocator< IFormFactor * > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___getitem__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< IFormFactor *,std::allocator< IFormFactor * > > *)std_vector_Sl_IFormFactor_Sm__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< IFormFactor *,std::allocator< IFormFactor * > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< IFormFactor*,std::allocator< IFormFactor * > > *ptr = (std::vector< IFormFactor*,std::allocator< IFormFactor * > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "3"" of type '" "std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "3"" of type '" "std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___delitem__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_IFormFactorPtr_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_IFormFactorPtr_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_IFormFactorPtr_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::__delitem__(std::vector< IFormFactor * >::difference_type)\n"
+    "    std::vector< IFormFactor * >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< IFormFactor * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___getitem__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t___getitem__" "', argument " "2"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::difference_type >(val2);
+  try {
+    result = (std::vector< IFormFactor * >::value_type)std_vector_Sl_IFormFactor_Sm__Sg____getitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_IFormFactorPtr_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_IFormFactorPtr_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_IFormFactorPtr_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::__getitem__(PySliceObject *)\n"
+    "    std::vector< IFormFactor * >::__getitem__(std::vector< IFormFactor * >::difference_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::difference_type arg2 ;
+  std::vector< IFormFactor * >::value_type arg3 = (std::vector< IFormFactor * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "2"" of type '" "std::vector< IFormFactor * >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::difference_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_IFormFactorPtr_t___setitem__" "', argument " "3"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp3);
+  try {
+    std_vector_Sl_IFormFactor_Sm__Sg____setitem____SWIG_2(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_IFormFactorPtr_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_IFormFactorPtr_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_IFormFactor, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_IFormFactorPtr_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_IFormFactorPtr_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::__setitem__(PySliceObject *,std::vector< IFormFactor *,std::allocator< IFormFactor * > > const &)\n"
+    "    std::vector< IFormFactor * >::__setitem__(PySliceObject *)\n"
+    "    std::vector< IFormFactor * >::__setitem__(std::vector< IFormFactor * >::difference_type,std::vector< IFormFactor * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_pop" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  try {
+    result = (std::vector< IFormFactor * >::value_type)std_vector_Sl_IFormFactor_Sm__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::value_type arg2 = (std::vector< IFormFactor * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_append" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_IFormFactorPtr_t_append" "', argument " "2"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp2);
+  std_vector_Sl_IFormFactor_Sm__Sg__append(arg1,arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_IFormFactorPtr_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_IFormFactorPtr_t")) SWIG_fail;
+  result = (std::vector< IFormFactor * > *)new std::vector< IFormFactor * >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_IFormFactorPtr_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_IFormFactorPtr_t",&obj0)) SWIG_fail;
+  {
+    std::vector< IFormFactor*,std::allocator< IFormFactor * > > *ptr = (std::vector< IFormFactor*,std::allocator< IFormFactor * > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_IFormFactorPtr_t" "', argument " "1"" of type '" "std::vector< IFormFactor * > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_IFormFactorPtr_t" "', argument " "1"" of type '" "std::vector< IFormFactor * > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< IFormFactor * > *)new std::vector< IFormFactor * >((std::vector< IFormFactor * > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_empty" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (bool)((std::vector< IFormFactor * > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_size" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = ((std::vector< IFormFactor * > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_swap" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_IFormFactorPtr_t_swap" "', argument " "2"" of type '" "std::vector< IFormFactor * > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_IFormFactorPtr_t_swap" "', argument " "2"" of type '" "std::vector< IFormFactor * > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< IFormFactor * > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_begin" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< IFormFactor * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_end" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< IFormFactor * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_rbegin" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< IFormFactor * >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_rend" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< IFormFactor * >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_clear" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< IFormFactor * > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_get_allocator" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = ((std::vector< IFormFactor * > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< IFormFactor * >::allocator_type(static_cast< const std::vector< IFormFactor * >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_IFormFactor_p_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_IFormFactorPtr_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_IFormFactorPtr_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_IFormFactorPtr_t" "', argument " "1"" of type '" "std::vector< IFormFactor * >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< IFormFactor * >::size_type >(val1);
+  result = (std::vector< IFormFactor * > *)new std::vector< IFormFactor * >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_pop_back" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_resize" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t_resize" "', argument " "2"" of type '" "std::vector< IFormFactor * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< IFormFactor * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_IFormFactor_Sm__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< IFormFactor * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::iterator arg2 ;
+  std::vector< IFormFactor * >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< IFormFactor * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "3"" of type '" "std::vector< IFormFactor * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_erase" "', argument " "3"" of type '" "std::vector< IFormFactor * >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_IFormFactor_Sm__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< IFormFactor * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_IFormFactorPtr_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_IFormFactorPtr_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_IFormFactorPtr_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::erase(std::vector< IFormFactor * >::iterator)\n"
+    "    std::vector< IFormFactor * >::erase(std::vector< IFormFactor * >::iterator,std::vector< IFormFactor * >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_IFormFactorPtr_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * >::size_type arg1 ;
+  std::vector< IFormFactor * >::value_type arg2 = (std::vector< IFormFactor * >::value_type) 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< IFormFactor * > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_IFormFactorPtr_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_IFormFactorPtr_t" "', argument " "1"" of type '" "std::vector< IFormFactor * >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< IFormFactor * >::size_type >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_vector_IFormFactorPtr_t" "', argument " "2"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp2);
+  result = (std::vector< IFormFactor * > *)new std::vector< IFormFactor * >(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_IFormFactorPtr_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_IFormFactorPtr_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_IFormFactorPtr_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_IFormFactorPtr_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IFormFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_vector_IFormFactorPtr_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_IFormFactorPtr_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::vector()\n"
+    "    std::vector< IFormFactor * >::vector(std::vector< IFormFactor * > const &)\n"
+    "    std::vector< IFormFactor * >::vector(std::vector< IFormFactor * >::size_type)\n"
+    "    std::vector< IFormFactor * >::vector(std::vector< IFormFactor * >::size_type,std::vector< IFormFactor * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::value_type arg2 = (std::vector< IFormFactor * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_push_back" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_IFormFactorPtr_t_push_back" "', argument " "2"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp2);
+  (arg1)->push_back(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_front" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (std::vector< IFormFactor * >::value_type)((std::vector< IFormFactor * > const *)arg1)->front();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_back" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = (std::vector< IFormFactor * >::value_type)((std::vector< IFormFactor * > const *)arg1)->back();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::size_type arg2 ;
+  std::vector< IFormFactor * >::value_type arg3 = (std::vector< IFormFactor * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_assign" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t_assign" "', argument " "2"" of type '" "std::vector< IFormFactor * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_IFormFactorPtr_t_assign" "', argument " "3"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp3);
+  (arg1)->assign(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::size_type arg2 ;
+  std::vector< IFormFactor * >::value_type arg3 = (std::vector< IFormFactor * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_resize" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t_resize" "', argument " "2"" of type '" "std::vector< IFormFactor * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_IFormFactorPtr_t_resize" "', argument " "3"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp3);
+  (arg1)->resize(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_IFormFactorPtr_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_IFormFactor, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_IFormFactorPtr_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_IFormFactorPtr_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::resize(std::vector< IFormFactor * >::size_type)\n"
+    "    std::vector< IFormFactor * >::resize(std::vector< IFormFactor * >::size_type,std::vector< IFormFactor * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::iterator arg2 ;
+  std::vector< IFormFactor * >::value_type arg3 = (std::vector< IFormFactor * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< IFormFactor * >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_IFormFactorPtr_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "3"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp3);
+  result = std_vector_Sl_IFormFactor_Sm__Sg__insert__SWIG_0(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< IFormFactor * >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::iterator arg2 ;
+  std::vector< IFormFactor * >::size_type arg3 ;
+  std::vector< IFormFactor * >::value_type arg4 = (std::vector< IFormFactor * >::value_type) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_IFormFactorPtr_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "2"" of type '" "std::vector< IFormFactor * >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "3"" of type '" "std::vector< IFormFactor * >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< IFormFactor * >::size_type >(val3);
+  res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_IFormFactor, 0 |  0 );
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_IFormFactorPtr_t_insert" "', argument " "4"" of type '" "std::vector< IFormFactor * >::value_type""'"); 
+  }
+  arg4 = reinterpret_cast< std::vector< IFormFactor * >::value_type >(argp4);
+  std_vector_Sl_IFormFactor_Sm__Sg__insert__SWIG_1(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter) != 0));
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_IFormFactor, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_IFormFactorPtr_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< IFormFactor*,std::allocator< IFormFactor * > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< IFormFactor * >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          void *vptr = 0;
+          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_IFormFactor, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_IFormFactorPtr_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_IFormFactorPtr_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< IFormFactor * >::insert(std::vector< IFormFactor * >::iterator,std::vector< IFormFactor * >::value_type)\n"
+    "    std::vector< IFormFactor * >::insert(std::vector< IFormFactor * >::iterator,std::vector< IFormFactor * >::size_type,std::vector< IFormFactor * >::value_type)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  std::vector< IFormFactor * >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_IFormFactorPtr_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_reserve" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_IFormFactorPtr_t_reserve" "', argument " "2"" of type '" "std::vector< IFormFactor * >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< IFormFactor * >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_IFormFactorPtr_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< IFormFactor * >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_IFormFactorPtr_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_IFormFactorPtr_t_capacity" "', argument " "1"" of type '" "std::vector< IFormFactor * > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  result = ((std::vector< IFormFactor * > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_IFormFactorPtr_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< IFormFactor * > *arg1 = (std::vector< IFormFactor * > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_IFormFactorPtr_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_IFormFactorPtr_t" "', argument " "1"" of type '" "std::vector< IFormFactor * > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< IFormFactor * > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_IFormFactorPtr_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IFormFactorBorn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PyObject *arg1 = (PyObject *) 0 ;
+  PyObject * obj0 = 0 ;
+  IFormFactorBorn *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IFormFactorBorn",&obj0)) SWIG_fail;
+  arg1 = obj0;
+  if ( arg1 != Py_None ) {
+    /* subclassed */
+    result = (IFormFactorBorn *)new SwigDirector_IFormFactorBorn(arg1); 
+  } else {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
+    SWIG_fail;
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactorBorn, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IFormFactorBorn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorBorn *arg1 = (IFormFactorBorn *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFormFactorBorn",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorBorn, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFormFactorBorn" "', argument " "1"" of type '" "IFormFactorBorn *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorBorn * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorBorn_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorBorn *arg1 = (IFormFactorBorn *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  IFormFactorBorn *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactorBorn_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorBorn_clone" "', argument " "1"" of type '" "IFormFactorBorn const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorBorn * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IFormFactorBorn::clone");
+    } else {
+      result = (IFormFactorBorn *)((IFormFactorBorn const *)arg1)->clone();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  }
+  if (director) {
+    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorBorn_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorBorn *arg1 = (IFormFactorBorn *) 0 ;
+  WavevectorInfo *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactorBorn_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorBorn_evaluate" "', argument " "1"" of type '" "IFormFactorBorn const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorBorn * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_WavevectorInfo,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorBorn_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorBorn_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  arg2 = reinterpret_cast< WavevectorInfo * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      result = ((IFormFactorBorn const *)arg1)->IFormFactorBorn::evaluate((WavevectorInfo const &)*arg2);
+    } else {
+      result = ((IFormFactorBorn const *)arg1)->evaluate((WavevectorInfo const &)*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorBorn_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorBorn *arg1 = (IFormFactorBorn *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactorBorn_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorBorn_evaluate_for_q" "', argument " "1"" of type '" "IFormFactorBorn const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorBorn * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorBorn_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorBorn_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  director = SWIG_DIRECTOR_CAST(arg1);
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    if (upcall) {
+      Swig::DirectorPureVirtualException::raise("IFormFactorBorn::evaluate_for_q");
+    } else {
+      result = ((IFormFactorBorn const *)arg1)->evaluate_for_q(arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_disown_IFormFactorBorn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorBorn *arg1 = (IFormFactorBorn *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:disown_IFormFactorBorn",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IFormFactorBorn" "', argument " "1"" of type '" "IFormFactorBorn *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorBorn * >(argp1);
+  {
+    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
+    if (director) director->swig_disown();
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorBorn_onChange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorBorn *arg1 = (IFormFactorBorn *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IFormFactorBorn *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactorBorn_onChange",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorBorn_onChange" "', argument " "1"" of type '" "IFormFactorBorn *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorBorn * >(argp1);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("onChange"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member onChange");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IFormFactorBorn *>(arg1);
+    if (upcall) {
+      (darg)->onChangeSwigPublic();
+    } else {
+      (darg)->onChange();
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorBorn__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorBorn *arg1 = (IFormFactorBorn *) 0 ;
+  std::ostream *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  bool upcall = false;
+  SwigDirector_IFormFactorBorn *darg = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactorBorn__print",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorBorn, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorBorn__print" "', argument " "1"" of type '" "IFormFactorBorn const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorBorn * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__ostream,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorBorn__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorBorn__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+  }
+  arg2 = reinterpret_cast< std::ostream * >(argp2);
+  director = SWIG_DIRECTOR_CAST(arg1);
+  if (!director || !(director->swig_get_inner("print"))) {
+    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member print");
+    SWIG_fail;
+  }
+  upcall = (director && (director->swig_get_self()==obj0));
+  try {
+    darg = dynamic_cast<SwigDirector_IFormFactorBorn *>(arg1);
+    if (upcall) {
+      ((SwigDirector_IFormFactorBorn const *)darg)->printSwigPublic(*arg2);
+    } else {
+      ((SwigDirector_IFormFactorBorn const *)darg)->print(*arg2);
+    }
+  } catch (Swig::DirectorException&) {
+    SWIG_fail;
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFormFactorBorn_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFormFactorBorn, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IFormFactorDecorator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorDecorator *arg1 = (IFormFactorDecorator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFormFactorDecorator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorDecorator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFormFactorDecorator" "', argument " "1"" of type '" "IFormFactorDecorator *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorDecorator * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorDecorator_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorDecorator *arg1 = (IFormFactorDecorator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFormFactorDecorator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactorDecorator_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorDecorator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorDecorator_clone" "', argument " "1"" of type '" "IFormFactorDecorator const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorDecorator * >(argp1);
+  result = (IFormFactorDecorator *)((IFormFactorDecorator const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactorDecorator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorDecorator_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorDecorator *arg1 = (IFormFactorDecorator *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactorDecorator_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorDecorator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorDecorator_accept" "', argument " "1"" of type '" "IFormFactorDecorator const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorDecorator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorDecorator_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((IFormFactorDecorator const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorDecorator_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorDecorator *arg1 = (IFormFactorDecorator *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IFormFactorDecorator_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorDecorator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorDecorator_setAmbientMaterial" "', argument " "1"" of type '" "IFormFactorDecorator *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorDecorator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IFormFactorDecorator_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IFormFactorDecorator_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorDecorator_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorDecorator *arg1 = (IFormFactorDecorator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactorDecorator_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorDecorator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorDecorator_getVolume" "', argument " "1"" of type '" "IFormFactorDecorator const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorDecorator * >(argp1);
+  result = (double)((IFormFactorDecorator const *)arg1)->getVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFormFactorDecorator_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactorDecorator *arg1 = (IFormFactorDecorator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFormFactorDecorator_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFormFactorDecorator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFormFactorDecorator_getRadialExtension" "', argument " "1"" of type '" "IFormFactorDecorator const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactorDecorator * >(argp1);
+  result = (double)((IFormFactorDecorator const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFormFactorDecorator_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFormFactorDecorator, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_PolygonalTopology_vertexIndices_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
+  std::vector< int,std::allocator< int > > *arg2 = (std::vector< int,std::allocator< int > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolygonalTopology_vertexIndices_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_vertexIndices_set" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolygonalTopology_vertexIndices_set" "', argument " "2"" of type '" "std::vector< int,std::allocator< int > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< int,std::allocator< int > > * >(argp2);
+  if (arg1) (arg1)->vertexIndices = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolygonalTopology_vertexIndices_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolygonalTopology_vertexIndices_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_vertexIndices_get" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)& ((arg1)->vertexIndices);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolygonalTopology_symmetry_S2_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolygonalTopology_symmetry_S2_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_symmetry_S2_set" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolygonalTopology_symmetry_S2_set" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->symmetry_S2 = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolygonalTopology_symmetry_S2_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolygonalTopology_symmetry_S2_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolygonalTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolygonalTopology_symmetry_S2_get" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
+  result = (bool) ((arg1)->symmetry_S2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_PolygonalTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolygonalTopology *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_PolygonalTopology")) SWIG_fail;
+  result = (PolygonalTopology *)new PolygonalTopology();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolygonalTopology, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_PolygonalTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolygonalTopology *arg1 = (PolygonalTopology *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_PolygonalTopology",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolygonalTopology, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolygonalTopology" "', argument " "1"" of type '" "PolygonalTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolygonalTopology * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *PolygonalTopology_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_PolygonalTopology, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_PolyhedralTopology_faces_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
+  std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *arg2 = (std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralTopology_faces_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_faces_set" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralTopology_faces_set" "', argument " "2"" of type '" "std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > * >(argp2);
+  if (arg1) (arg1)->faces = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralTopology_faces_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralTopology_faces_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_faces_get" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
+  result = (std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *)& ((arg1)->faces);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralTopology_symmetry_Ci_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralTopology_symmetry_Ci_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_symmetry_Ci_set" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolyhedralTopology_symmetry_Ci_set" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->symmetry_Ci = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralTopology_symmetry_Ci_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralTopology_symmetry_Ci_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralTopology, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralTopology_symmetry_Ci_get" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
+  result = (bool) ((arg1)->symmetry_Ci);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_PolyhedralTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralTopology *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_PolyhedralTopology")) SWIG_fail;
+  result = (PolyhedralTopology *)new PolyhedralTopology();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralTopology, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_PolyhedralTopology(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralTopology *arg1 = (PolyhedralTopology *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_PolyhedralTopology",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralTopology, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolyhedralTopology" "', argument " "1"" of type '" "PolyhedralTopology *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralTopology * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *PolyhedralTopology_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_PolyhedralTopology, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_PolyhedralEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  kvector_t arg1 ;
+  kvector_t arg2 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PolyhedralEdge *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_PolyhedralEdge",&obj0,&obj1)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_PolyhedralEdge" "', argument " "1"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralEdge" "', argument " "1"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_PolyhedralEdge" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralEdge" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (PolyhedralEdge *)new PolyhedralEdge(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralEdge, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralEdge_E(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralEdge_E",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_E" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
+  result = ((PolyhedralEdge const *)arg1)->E();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralEdge_R(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralEdge_R",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_R" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
+  result = ((PolyhedralEdge const *)arg1)->R();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralEdge_qE(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralEdge_qE",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_qE" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralEdge_qE" "', argument " "2"" of type '" "cvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralEdge_qE" "', argument " "2"" of type '" "cvector_t""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((PolyhedralEdge const *)arg1)->qE(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralEdge_qR(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralEdge_qR",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_qR" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralEdge_qR" "', argument " "2"" of type '" "cvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralEdge_qR" "', argument " "2"" of type '" "cvector_t""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((PolyhedralEdge const *)arg1)->qR(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralEdge_contrib(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
+  int arg2 ;
+  cvector_t arg3 ;
+  complex_t arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  std::complex< double > val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:PolyhedralEdge_contrib",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralEdge, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralEdge_contrib" "', argument " "1"" of type '" "PolyhedralEdge const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolyhedralEdge_contrib" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "PolyhedralEdge_contrib" "', argument " "3"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralEdge_contrib" "', argument " "3"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  ecode4 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "PolyhedralEdge_contrib" "', argument " "4"" of type '" "complex_t""'");
+  } 
+  arg4 = static_cast< complex_t >(val4);
+  result = ((PolyhedralEdge const *)arg1)->contrib(arg2,arg3,arg4);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_PolyhedralEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralEdge *arg1 = (PolyhedralEdge *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_PolyhedralEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralEdge, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolyhedralEdge" "', argument " "1"" of type '" "PolyhedralEdge *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralEdge * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *PolyhedralEdge_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_PolyhedralEdge, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_diameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< kvector_t,std::allocator< kvector_t > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralFace_diameter",&obj0)) SWIG_fail;
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_diameter" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_diameter" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (double)PolyhedralFace::diameter((std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > const &)*arg1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_PolyhedralFace__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< kvector_t,std::allocator< kvector_t > > *arg1 = 0 ;
+  bool arg2 ;
+  int res1 = SWIG_OLDOBJ ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PolyhedralFace *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_PolyhedralFace",&obj0,&obj1)) SWIG_fail;
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_PolyhedralFace" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  result = (PolyhedralFace *)new PolyhedralFace((std::vector< kvector_t,std::allocator< kvector_t > > const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralFace, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_PolyhedralFace__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< kvector_t,std::allocator< kvector_t > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PolyhedralFace *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_PolyhedralFace",&obj0)) SWIG_fail;
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_PolyhedralFace" "', argument " "1"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (PolyhedralFace *)new PolyhedralFace((std::vector< kvector_t,std::allocator< kvector_t > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralFace, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_PolyhedralFace__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_PolyhedralFace")) SWIG_fail;
+  result = (PolyhedralFace *)new PolyhedralFace();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_PolyhedralFace, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_PolyhedralFace(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_PolyhedralFace__SWIG_2(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_PolyhedralFace__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_bool(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_PolyhedralFace__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_PolyhedralFace'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    PolyhedralFace::PolyhedralFace(std::vector< kvector_t,std::allocator< kvector_t > > const &,bool)\n"
+    "    PolyhedralFace::PolyhedralFace(std::vector< kvector_t,std::allocator< kvector_t > > const &)\n"
+    "    PolyhedralFace::PolyhedralFace()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_area(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralFace_area",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_area" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  result = (double)((PolyhedralFace const *)arg1)->area();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_center(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralFace_center",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_center" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  result = ((PolyhedralFace const *)arg1)->center();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_pyramidalVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralFace_pyramidalVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_pyramidalVolume" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  result = (double)((PolyhedralFace const *)arg1)->pyramidalVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_radius3d(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:PolyhedralFace_radius3d",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_radius3d" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  result = (double)((PolyhedralFace const *)arg1)->radius3d();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_normalProjectionConj(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralFace_normalProjectionConj",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "2"" of type '" "cvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_normalProjectionConj" "', argument " "2"" of type '" "cvector_t""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((PolyhedralFace const *)arg1)->normalProjectionConj(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_ff_n(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  int arg2 ;
+  cvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:PolyhedralFace_ff_n",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_ff_n" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "PolyhedralFace_ff_n" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "PolyhedralFace_ff_n" "', argument " "3"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_ff_n" "', argument " "3"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = ((PolyhedralFace const *)arg1)->ff_n(arg2,arg3);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_ff(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  cvector_t arg2 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  bool val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:PolyhedralFace_ff",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_ff" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_ff" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_ff" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_bool(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "PolyhedralFace_ff" "', argument " "3"" of type '" "bool""'");
+  } 
+  arg3 = static_cast< bool >(val3);
+  result = ((PolyhedralFace const *)arg1)->ff(arg2,arg3);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_ff_2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralFace_ff_2D",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_ff_2D" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_ff_2D" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_ff_2D" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((PolyhedralFace const *)arg1)->ff_2D(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_PolyhedralFace_assert_Ci(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  PolyhedralFace *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:PolyhedralFace_assert_Ci",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "PolyhedralFace_assert_Ci" "', argument " "1"" of type '" "PolyhedralFace const *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_PolyhedralFace,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "PolyhedralFace_assert_Ci" "', argument " "2"" of type '" "PolyhedralFace const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "PolyhedralFace_assert_Ci" "', argument " "2"" of type '" "PolyhedralFace const &""'"); 
+  }
+  arg2 = reinterpret_cast< PolyhedralFace * >(argp2);
+  ((PolyhedralFace const *)arg1)->assert_Ci((PolyhedralFace const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_PolyhedralFace(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  PolyhedralFace *arg1 = (PolyhedralFace *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_PolyhedralFace",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_PolyhedralFace, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_PolyhedralFace" "', argument " "1"" of type '" "PolyhedralFace *""'"); 
+  }
+  arg1 = reinterpret_cast< PolyhedralFace * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *PolyhedralFace_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_PolyhedralFace, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPolyhedron_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_evaluate_for_q" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolyhedron_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolyhedron_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorPolyhedron const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_evaluate_centered(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPolyhedron_evaluate_centered",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_evaluate_centered" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolyhedron_evaluate_centered" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolyhedron_evaluate_centered" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorPolyhedron const *)arg1)->evaluate_centered(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolyhedron_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_getVolume" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  result = (double)((FormFactorPolyhedron const *)arg1)->getVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolyhedron_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_getRadialExtension" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  result = (double)((FormFactorPolyhedron const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolyhedron_assert_platonic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolyhedron_assert_platonic",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolyhedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolyhedron_assert_platonic" "', argument " "1"" of type '" "FormFactorPolyhedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  ((FormFactorPolyhedron const *)arg1)->assert_platonic();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorPolyhedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolyhedron *arg1 = (FormFactorPolyhedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorPolyhedron",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolyhedron, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPolyhedron" "', argument " "1"" of type '" "FormFactorPolyhedron *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolyhedron * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorPolyhedron_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPolyhedron, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPolygonalPrism_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_evaluate_for_q" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolygonalPrism_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolygonalPrism_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorPolygonalPrism const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolygonalPrism_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_getVolume" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
+  result = (double)((FormFactorPolygonalPrism const *)arg1)->getVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolygonalPrism_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_getHeight" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
+  result = (double)((FormFactorPolygonalPrism const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalPrism_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolygonalPrism_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalPrism_getRadialExtension" "', argument " "1"" of type '" "FormFactorPolygonalPrism const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
+  result = (double)((FormFactorPolygonalPrism const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorPolygonalPrism(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalPrism *arg1 = (FormFactorPolygonalPrism *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorPolygonalPrism",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalPrism, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPolygonalPrism" "', argument " "1"" of type '" "FormFactorPolygonalPrism *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalPrism * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorPolygonalPrism_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPolygonalPrism, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPolygonalSurface_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorPolygonalSurface_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorPolygonalSurface const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolygonalSurface_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_getVolume" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  result = (double)((FormFactorPolygonalSurface const *)arg1)->getVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPolygonalSurface_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPolygonalSurface_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPolygonalSurface_getRadialExtension" "', argument " "1"" of type '" "FormFactorPolygonalSurface const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  result = (double)((FormFactorPolygonalSurface const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorPolygonalSurface(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPolygonalSurface *arg1 = (FormFactorPolygonalSurface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorPolygonalSurface",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPolygonalSurface, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPolygonalSurface" "', argument " "1"" of type '" "FormFactorPolygonalSurface *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPolygonalSurface * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorPolygonalSurface_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPolygonalSurface, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorAnisoPyramid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FormFactorAnisoPyramid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FormFactorAnisoPyramid",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorAnisoPyramid" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorAnisoPyramid" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorAnisoPyramid" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FormFactorAnisoPyramid" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FormFactorAnisoPyramid *)new FormFactorAnisoPyramid(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorAnisoPyramid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorAnisoPyramid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorAnisoPyramid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorAnisoPyramid_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorAnisoPyramid_clone" "', argument " "1"" of type '" "FormFactorAnisoPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorAnisoPyramid * >(argp1);
+  result = (FormFactorAnisoPyramid *)((FormFactorAnisoPyramid const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorAnisoPyramid_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorAnisoPyramid_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorAnisoPyramid_accept" "', argument " "1"" of type '" "FormFactorAnisoPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorAnisoPyramid * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorAnisoPyramid_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorAnisoPyramid const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorAnisoPyramid_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorAnisoPyramid_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorAnisoPyramid_getLength" "', argument " "1"" of type '" "FormFactorAnisoPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorAnisoPyramid * >(argp1);
+  result = (double)((FormFactorAnisoPyramid const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorAnisoPyramid_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorAnisoPyramid_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorAnisoPyramid_getWidth" "', argument " "1"" of type '" "FormFactorAnisoPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorAnisoPyramid * >(argp1);
+  result = (double)((FormFactorAnisoPyramid const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorAnisoPyramid_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorAnisoPyramid_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorAnisoPyramid_getHeight" "', argument " "1"" of type '" "FormFactorAnisoPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorAnisoPyramid * >(argp1);
+  result = (double)((FormFactorAnisoPyramid const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorAnisoPyramid_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorAnisoPyramid_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorAnisoPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorAnisoPyramid_getAlpha" "', argument " "1"" of type '" "FormFactorAnisoPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorAnisoPyramid * >(argp1);
+  result = (double)((FormFactorAnisoPyramid const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorAnisoPyramid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorAnisoPyramid *arg1 = (FormFactorAnisoPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorAnisoPyramid",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorAnisoPyramid, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorAnisoPyramid" "', argument " "1"" of type '" "FormFactorAnisoPyramid *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorAnisoPyramid * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorAnisoPyramid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorAnisoPyramid, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorBox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorBox *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorBox",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorBox" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorBox" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorBox" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorBox *)new FormFactorBox(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorBox, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorBox_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorBox *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorBox_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_clone" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  result = (FormFactorBox *)((FormFactorBox const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorBox_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorBox_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_accept" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorBox_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorBox const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorBox_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorBox_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_getLength" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  result = (double)((FormFactorBox const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorBox_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorBox_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_getHeight" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  result = (double)((FormFactorBox const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorBox_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorBox_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_getWidth" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  result = (double)((FormFactorBox const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorBox_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorBox_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_getRadialExtension" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  result = (double)((FormFactorBox const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorBox_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorBox_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorBox_evaluate_for_q" "', argument " "1"" of type '" "FormFactorBox const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorBox_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorBox_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorBox const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorBox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorBox *arg1 = (FormFactorBox *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorBox",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorBox, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorBox" "', argument " "1"" of type '" "FormFactorBox *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorBox * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorBox_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorBox, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorCone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorCone",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCone" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorCone" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorCone" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorCone *)new FormFactorCone(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCone, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorCone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone_clone" "', argument " "1"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  result = (FormFactorCone *)((FormFactorCone const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCone_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone_accept" "', argument " "1"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCone_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorCone const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone_getHeight" "', argument " "1"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  result = (double)((FormFactorCone const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone_getAlpha" "', argument " "1"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  result = (double)((FormFactorCone const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone_getRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone_getRadius" "', argument " "1"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  result = (double)((FormFactorCone const *)arg1)->getRadius();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone_getRadialExtension" "', argument " "1"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  result = (double)((FormFactorCone const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCone_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone_evaluate_for_q" "', argument " "1"" of type '" "FormFactorCone const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCone_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorCone_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorCone const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorCone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone *arg1 = (FormFactorCone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorCone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorCone" "', argument " "1"" of type '" "FormFactorCone *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorCone_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorCone, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCone6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorCone6 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorCone6",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCone6" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorCone6" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorCone6" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorCone6 *)new FormFactorCone6(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCone6, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone6_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorCone6 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone6_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone6_clone" "', argument " "1"" of type '" "FormFactorCone6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone6 * >(argp1);
+  result = (FormFactorCone6 *)((FormFactorCone6 const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCone6, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone6_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCone6_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone6_accept" "', argument " "1"" of type '" "FormFactorCone6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone6 * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCone6_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorCone6 const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone6_getBaseEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone6_getBaseEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone6_getBaseEdge" "', argument " "1"" of type '" "FormFactorCone6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone6 * >(argp1);
+  result = (double)((FormFactorCone6 const *)arg1)->getBaseEdge();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone6_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone6_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone6_getHeight" "', argument " "1"" of type '" "FormFactorCone6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone6 * >(argp1);
+  result = (double)((FormFactorCone6 const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCone6_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCone6_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCone6_getAlpha" "', argument " "1"" of type '" "FormFactorCone6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone6 * >(argp1);
+  result = (double)((FormFactorCone6 const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorCone6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCone6 *arg1 = (FormFactorCone6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorCone6",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCone6, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorCone6" "', argument " "1"" of type '" "FormFactorCone6 *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCone6 * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorCone6_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorCone6, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = 0 ;
+  IFormFactor *arg2 = 0 ;
+  IFormFactor *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorCrystal",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Lattice,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FormFactorCrystal" "', argument " "1"" of type '" "Lattice const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FormFactorCrystal" "', argument " "1"" of type '" "Lattice const &""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_FormFactorCrystal" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FormFactorCrystal" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_FormFactorCrystal" "', argument " "3"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FormFactorCrystal" "', argument " "3"" of type '" "IFormFactor const &""'"); 
+  }
+  arg3 = reinterpret_cast< IFormFactor * >(argp3);
+  result = (FormFactorCrystal *)new FormFactorCrystal((Lattice const &)*arg1,(IFormFactor const &)*arg2,(IFormFactor const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCrystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCrystal *arg1 = (FormFactorCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorCrystal",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCrystal, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorCrystal" "', argument " "1"" of type '" "FormFactorCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCrystal * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCrystal_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCrystal *arg1 = (FormFactorCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCrystal_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCrystal_clone" "', argument " "1"" of type '" "FormFactorCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCrystal * >(argp1);
+  result = (FormFactorCrystal *)((FormFactorCrystal const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCrystal_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCrystal *arg1 = (FormFactorCrystal *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCrystal_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCrystal_accept" "', argument " "1"" of type '" "FormFactorCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCrystal_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorCrystal const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCrystal_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCrystal *arg1 = (FormFactorCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCrystal_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCrystal_getVolume" "', argument " "1"" of type '" "FormFactorCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCrystal * >(argp1);
+  result = (double)((FormFactorCrystal const *)arg1)->getVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCrystal_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCrystal *arg1 = (FormFactorCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCrystal_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCrystal_getRadialExtension" "', argument " "1"" of type '" "FormFactorCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCrystal * >(argp1);
+  result = (double)((FormFactorCrystal const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCrystal_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCrystal *arg1 = (FormFactorCrystal *) 0 ;
+  WavevectorInfo *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCrystal_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCrystal_evaluate" "', argument " "1"" of type '" "FormFactorCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_WavevectorInfo,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCrystal_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorCrystal_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  arg2 = reinterpret_cast< WavevectorInfo * >(argp2);
+  result = ((FormFactorCrystal const *)arg1)->evaluate((WavevectorInfo const &)*arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorCrystal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorCrystal, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCuboctahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FormFactorCuboctahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FormFactorCuboctahedron",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCuboctahedron" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorCuboctahedron" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorCuboctahedron" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FormFactorCuboctahedron" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FormFactorCuboctahedron *)new FormFactorCuboctahedron(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCuboctahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorCuboctahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_clone" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
+  result = (FormFactorCuboctahedron *)((FormFactorCuboctahedron const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCuboctahedron_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_accept" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCuboctahedron_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorCuboctahedron const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getLength" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
+  result = (double)((FormFactorCuboctahedron const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getHeight" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
+  result = (double)((FormFactorCuboctahedron const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getHeightRatio(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getHeightRatio",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getHeightRatio" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
+  result = (double)((FormFactorCuboctahedron const *)arg1)->getHeightRatio();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCuboctahedron_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCuboctahedron_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCuboctahedron_getAlpha" "', argument " "1"" of type '" "FormFactorCuboctahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
+  result = (double)((FormFactorCuboctahedron const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorCuboctahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCuboctahedron *arg1 = (FormFactorCuboctahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorCuboctahedron",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCuboctahedron, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorCuboctahedron" "', argument " "1"" of type '" "FormFactorCuboctahedron *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCuboctahedron * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorCuboctahedron_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorCuboctahedron, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorCylinder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorCylinder *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorCylinder",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorCylinder" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorCylinder" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorCylinder *)new FormFactorCylinder(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCylinder, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCylinder_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorCylinder *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCylinder_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCylinder_clone" "', argument " "1"" of type '" "FormFactorCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCylinder * >(argp1);
+  result = (FormFactorCylinder *)((FormFactorCylinder const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCylinder_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCylinder_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCylinder_accept" "', argument " "1"" of type '" "FormFactorCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCylinder * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCylinder_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorCylinder const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCylinder_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCylinder_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCylinder_getHeight" "', argument " "1"" of type '" "FormFactorCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCylinder * >(argp1);
+  result = (double)((FormFactorCylinder const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCylinder_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCylinder_getRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCylinder_getRadius" "', argument " "1"" of type '" "FormFactorCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCylinder * >(argp1);
+  result = (double)((FormFactorCylinder const *)arg1)->getRadius();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCylinder_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorCylinder_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCylinder_getRadialExtension" "', argument " "1"" of type '" "FormFactorCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCylinder * >(argp1);
+  result = (double)((FormFactorCylinder const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorCylinder_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorCylinder_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorCylinder_evaluate_for_q" "', argument " "1"" of type '" "FormFactorCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCylinder * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorCylinder_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorCylinder_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorCylinder const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorCylinder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorCylinder *arg1 = (FormFactorCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorCylinder",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorCylinder, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorCylinder" "', argument " "1"" of type '" "FormFactorCylinder *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorCylinder * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorCylinder_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorCylinder, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorDecoratorDebyeWaller__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorDecoratorDebyeWaller *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorDecoratorDebyeWaller",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FormFactorDecoratorDebyeWaller" "', argument " "1"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FormFactorDecoratorDebyeWaller" "', argument " "1"" of type '" "IFormFactor const &""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorDecoratorDebyeWaller" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorDecoratorDebyeWaller" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorDecoratorDebyeWaller *)new FormFactorDecoratorDebyeWaller((IFormFactor const &)*arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorDecoratorDebyeWaller, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorDecoratorDebyeWaller__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFormFactor *arg1 = 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorDecoratorDebyeWaller *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorDecoratorDebyeWaller",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FormFactorDecoratorDebyeWaller" "', argument " "1"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FormFactorDecoratorDebyeWaller" "', argument " "1"" of type '" "IFormFactor const &""'"); 
+  }
+  arg1 = reinterpret_cast< IFormFactor * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorDecoratorDebyeWaller" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorDecoratorDebyeWaller *)new FormFactorDecoratorDebyeWaller((IFormFactor const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorDecoratorDebyeWaller, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorDecoratorDebyeWaller(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IFormFactor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorDecoratorDebyeWaller__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IFormFactor, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_FormFactorDecoratorDebyeWaller__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FormFactorDecoratorDebyeWaller'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(IFormFactor const &,double,double)\n"
+    "    FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(IFormFactor const &,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorDecoratorDebyeWaller_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDecoratorDebyeWaller *arg1 = (FormFactorDecoratorDebyeWaller *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorDecoratorDebyeWaller *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorDecoratorDebyeWaller_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDecoratorDebyeWaller, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorDecoratorDebyeWaller_clone" "', argument " "1"" of type '" "FormFactorDecoratorDebyeWaller const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDecoratorDebyeWaller * >(argp1);
+  result = (FormFactorDecoratorDebyeWaller *)((FormFactorDecoratorDebyeWaller const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorDecoratorDebyeWaller, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorDecoratorDebyeWaller_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDecoratorDebyeWaller *arg1 = (FormFactorDecoratorDebyeWaller *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorDecoratorDebyeWaller_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDecoratorDebyeWaller, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorDecoratorDebyeWaller_accept" "', argument " "1"" of type '" "FormFactorDecoratorDebyeWaller const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDecoratorDebyeWaller * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorDecoratorDebyeWaller_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorDecoratorDebyeWaller const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorDecoratorDebyeWaller_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDecoratorDebyeWaller *arg1 = (FormFactorDecoratorDebyeWaller *) 0 ;
+  WavevectorInfo *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorDecoratorDebyeWaller_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDecoratorDebyeWaller, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorDecoratorDebyeWaller_evaluate" "', argument " "1"" of type '" "FormFactorDecoratorDebyeWaller const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDecoratorDebyeWaller * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_WavevectorInfo,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorDecoratorDebyeWaller_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorDecoratorDebyeWaller_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  arg2 = reinterpret_cast< WavevectorInfo * >(argp2);
+  result = ((FormFactorDecoratorDebyeWaller const *)arg1)->evaluate((WavevectorInfo const &)*arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorDecoratorDebyeWaller(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDecoratorDebyeWaller *arg1 = (FormFactorDecoratorDebyeWaller *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorDecoratorDebyeWaller",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDecoratorDebyeWaller, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorDecoratorDebyeWaller" "', argument " "1"" of type '" "FormFactorDecoratorDebyeWaller *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDecoratorDebyeWaller * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorDecoratorDebyeWaller_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorDecoratorDebyeWaller, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorDodecahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorDodecahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FormFactorDodecahedron",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorDodecahedron" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FormFactorDodecahedron *)new FormFactorDodecahedron(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorDodecahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorDodecahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDodecahedron *arg1 = (FormFactorDodecahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorDodecahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorDodecahedron_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDodecahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorDodecahedron_clone" "', argument " "1"" of type '" "FormFactorDodecahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDodecahedron * >(argp1);
+  result = (FormFactorDodecahedron *)((FormFactorDodecahedron const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorDodecahedron, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorDodecahedron_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDodecahedron *arg1 = (FormFactorDodecahedron *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorDodecahedron_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDodecahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorDodecahedron_accept" "', argument " "1"" of type '" "FormFactorDodecahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDodecahedron * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorDodecahedron_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorDodecahedron const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorDodecahedron_getEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDodecahedron *arg1 = (FormFactorDodecahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorDodecahedron_getEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDodecahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorDodecahedron_getEdge" "', argument " "1"" of type '" "FormFactorDodecahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDodecahedron * >(argp1);
+  result = (double)((FormFactorDodecahedron const *)arg1)->getEdge();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorDodecahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorDodecahedron *arg1 = (FormFactorDodecahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorDodecahedron",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorDodecahedron, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorDodecahedron" "', argument " "1"" of type '" "FormFactorDodecahedron *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorDodecahedron * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorDodecahedron_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorDodecahedron, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorEllipsoidalCylinder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorEllipsoidalCylinder *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorEllipsoidalCylinder",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorEllipsoidalCylinder" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorEllipsoidalCylinder" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorEllipsoidalCylinder" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorEllipsoidalCylinder *)new FormFactorEllipsoidalCylinder(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorEllipsoidalCylinder, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorEllipsoidalCylinder *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorEllipsoidalCylinder_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorEllipsoidalCylinder_clone" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  result = (FormFactorEllipsoidalCylinder *)((FormFactorEllipsoidalCylinder const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorEllipsoidalCylinder_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorEllipsoidalCylinder_accept" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorEllipsoidalCylinder_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorEllipsoidalCylinder const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_getRadiusX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorEllipsoidalCylinder_getRadiusX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorEllipsoidalCylinder_getRadiusX" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  result = (double)((FormFactorEllipsoidalCylinder const *)arg1)->getRadiusX();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_getRadiusY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorEllipsoidalCylinder_getRadiusY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorEllipsoidalCylinder_getRadiusY" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  result = (double)((FormFactorEllipsoidalCylinder const *)arg1)->getRadiusY();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorEllipsoidalCylinder_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorEllipsoidalCylinder_getHeight" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  result = (double)((FormFactorEllipsoidalCylinder const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorEllipsoidalCylinder_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorEllipsoidalCylinder_getRadialExtension" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  result = (double)((FormFactorEllipsoidalCylinder const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorEllipsoidalCylinder_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorEllipsoidalCylinder_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorEllipsoidalCylinder_evaluate_for_q" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorEllipsoidalCylinder_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorEllipsoidalCylinder_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorEllipsoidalCylinder const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorEllipsoidalCylinder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorEllipsoidalCylinder *arg1 = (FormFactorEllipsoidalCylinder *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorEllipsoidalCylinder",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorEllipsoidalCylinder, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorEllipsoidalCylinder" "', argument " "1"" of type '" "FormFactorEllipsoidalCylinder *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorEllipsoidalCylinder * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorEllipsoidalCylinder_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorEllipsoidalCylinder, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSphere(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorFullSphere *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FormFactorFullSphere",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorFullSphere" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FormFactorFullSphere *)new FormFactorFullSphere(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorFullSphere, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSphere_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSphere *arg1 = (FormFactorFullSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorFullSphere *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorFullSphere_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSphere_clone" "', argument " "1"" of type '" "FormFactorFullSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSphere * >(argp1);
+  result = (FormFactorFullSphere *)((FormFactorFullSphere const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorFullSphere, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSphere_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSphere *arg1 = (FormFactorFullSphere *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorFullSphere_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSphere_accept" "', argument " "1"" of type '" "FormFactorFullSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSphere * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorFullSphere_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorFullSphere const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSphere_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSphere *arg1 = (FormFactorFullSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorFullSphere_getRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSphere_getRadius" "', argument " "1"" of type '" "FormFactorFullSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSphere * >(argp1);
+  result = (double)((FormFactorFullSphere const *)arg1)->getRadius();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSphere_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSphere *arg1 = (FormFactorFullSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorFullSphere_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSphere_getRadialExtension" "', argument " "1"" of type '" "FormFactorFullSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSphere * >(argp1);
+  result = (double)((FormFactorFullSphere const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSphere_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSphere *arg1 = (FormFactorFullSphere *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorFullSphere_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSphere_evaluate_for_q" "', argument " "1"" of type '" "FormFactorFullSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSphere * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorFullSphere_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorFullSphere_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorFullSphere const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorFullSphere(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSphere *arg1 = (FormFactorFullSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorFullSphere",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSphere, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorFullSphere" "', argument " "1"" of type '" "FormFactorFullSphere *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSphere * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorFullSphere_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorFullSphere, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorFullSpheroid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorFullSpheroid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorFullSpheroid",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorFullSpheroid" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorFullSpheroid" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorFullSpheroid *)new FormFactorFullSpheroid(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorFullSpheroid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSpheroid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorFullSpheroid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorFullSpheroid_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSpheroid_clone" "', argument " "1"" of type '" "FormFactorFullSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSpheroid * >(argp1);
+  result = (FormFactorFullSpheroid *)((FormFactorFullSpheroid const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSpheroid_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorFullSpheroid_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSpheroid_accept" "', argument " "1"" of type '" "FormFactorFullSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSpheroid * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorFullSpheroid_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorFullSpheroid const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSpheroid_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorFullSpheroid_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSpheroid_getHeight" "', argument " "1"" of type '" "FormFactorFullSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSpheroid * >(argp1);
+  result = (double)((FormFactorFullSpheroid const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSpheroid_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorFullSpheroid_getRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSpheroid_getRadius" "', argument " "1"" of type '" "FormFactorFullSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSpheroid * >(argp1);
+  result = (double)((FormFactorFullSpheroid const *)arg1)->getRadius();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSpheroid_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorFullSpheroid_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSpheroid_getRadialExtension" "', argument " "1"" of type '" "FormFactorFullSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSpheroid * >(argp1);
+  result = (double)((FormFactorFullSpheroid const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorFullSpheroid_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorFullSpheroid_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorFullSpheroid_evaluate_for_q" "', argument " "1"" of type '" "FormFactorFullSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSpheroid * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorFullSpheroid_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorFullSpheroid_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorFullSpheroid const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorFullSpheroid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorFullSpheroid *arg1 = (FormFactorFullSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorFullSpheroid",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorFullSpheroid, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorFullSpheroid" "', argument " "1"" of type '" "FormFactorFullSpheroid *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorFullSpheroid * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorFullSpheroid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorFullSpheroid, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorGauss__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FormFactorGauss",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FormFactorGauss *)new FormFactorGauss(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorGauss__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorGauss",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorGauss *)new FormFactorGauss(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorGauss(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FormFactorGauss__SWIG_0(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorGauss__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FormFactorGauss'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorGauss::FormFactorGauss(double)\n"
+    "    FormFactorGauss::FormFactorGauss(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorGauss *arg1 = (FormFactorGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorGauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorGauss_clone" "', argument " "1"" of type '" "FormFactorGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorGauss * >(argp1);
+  result = (FormFactorGauss *)((FormFactorGauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorGauss_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorGauss *arg1 = (FormFactorGauss *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorGauss_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorGauss_accept" "', argument " "1"" of type '" "FormFactorGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorGauss * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorGauss_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorGauss const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorGauss_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorGauss *arg1 = (FormFactorGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorGauss_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorGauss_getWidth" "', argument " "1"" of type '" "FormFactorGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorGauss * >(argp1);
+  result = (double)((FormFactorGauss const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorGauss_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorGauss *arg1 = (FormFactorGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorGauss_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorGauss_getHeight" "', argument " "1"" of type '" "FormFactorGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorGauss * >(argp1);
+  result = (double)((FormFactorGauss const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorGauss_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorGauss *arg1 = (FormFactorGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorGauss_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorGauss_getRadialExtension" "', argument " "1"" of type '" "FormFactorGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorGauss * >(argp1);
+  result = (double)((FormFactorGauss const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorGauss_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorGauss *arg1 = (FormFactorGauss *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorGauss_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorGauss_evaluate_for_q" "', argument " "1"" of type '" "FormFactorGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorGauss * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorGauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorGauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorGauss const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorGauss *arg1 = (FormFactorGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorGauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorGauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorGauss" "', argument " "1"" of type '" "FormFactorGauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorGauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorGauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorGauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorHemiEllipsoid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorHemiEllipsoid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorHemiEllipsoid",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorHemiEllipsoid" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorHemiEllipsoid" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorHemiEllipsoid" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorHemiEllipsoid *)new FormFactorHemiEllipsoid(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorHemiEllipsoid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorHemiEllipsoid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorHemiEllipsoid",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorHemiEllipsoid" "', argument " "1"" of type '" "FormFactorHemiEllipsoid *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorHemiEllipsoid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorHemiEllipsoid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorHemiEllipsoid_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorHemiEllipsoid_clone" "', argument " "1"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  result = (FormFactorHemiEllipsoid *)((FormFactorHemiEllipsoid const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorHemiEllipsoid_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorHemiEllipsoid_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorHemiEllipsoid_accept" "', argument " "1"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorHemiEllipsoid_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorHemiEllipsoid const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorHemiEllipsoid_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorHemiEllipsoid_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorHemiEllipsoid_getHeight" "', argument " "1"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  result = (double)((FormFactorHemiEllipsoid const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorHemiEllipsoid_getRadiusX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorHemiEllipsoid_getRadiusX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorHemiEllipsoid_getRadiusX" "', argument " "1"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  result = (double)((FormFactorHemiEllipsoid const *)arg1)->getRadiusX();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorHemiEllipsoid_getRadiusY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorHemiEllipsoid_getRadiusY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorHemiEllipsoid_getRadiusY" "', argument " "1"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  result = (double)((FormFactorHemiEllipsoid const *)arg1)->getRadiusY();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorHemiEllipsoid_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorHemiEllipsoid_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorHemiEllipsoid_getRadialExtension" "', argument " "1"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  result = (double)((FormFactorHemiEllipsoid const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorHemiEllipsoid_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorHemiEllipsoid *arg1 = (FormFactorHemiEllipsoid *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorHemiEllipsoid_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorHemiEllipsoid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorHemiEllipsoid_evaluate_for_q" "', argument " "1"" of type '" "FormFactorHemiEllipsoid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorHemiEllipsoid * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorHemiEllipsoid_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorHemiEllipsoid_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorHemiEllipsoid const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorHemiEllipsoid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorHemiEllipsoid, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorIcosahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorIcosahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FormFactorIcosahedron",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorIcosahedron" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FormFactorIcosahedron *)new FormFactorIcosahedron(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorIcosahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorIcosahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorIcosahedron_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorIcosahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorIcosahedron_clone" "', argument " "1"" of type '" "FormFactorIcosahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorIcosahedron * >(argp1);
+  result = (FormFactorIcosahedron *)((FormFactorIcosahedron const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorIcosahedron, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorIcosahedron_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorIcosahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorIcosahedron_accept" "', argument " "1"" of type '" "FormFactorIcosahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorIcosahedron * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorIcosahedron_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorIcosahedron const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorIcosahedron_getEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorIcosahedron_getEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorIcosahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorIcosahedron_getEdge" "', argument " "1"" of type '" "FormFactorIcosahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorIcosahedron * >(argp1);
+  result = (double)((FormFactorIcosahedron const *)arg1)->getEdge();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorIcosahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorIcosahedron *arg1 = (FormFactorIcosahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorIcosahedron",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorIcosahedron, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorIcosahedron" "', argument " "1"" of type '" "FormFactorIcosahedron *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorIcosahedron * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorIcosahedron_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorIcosahedron, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorLongBoxGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorLongBoxGauss",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongBoxGauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorLongBoxGauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorLongBoxGauss" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorLongBoxGauss *)new FormFactorLongBoxGauss(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongBoxGauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLongBoxGauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxGauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxGauss_clone" "', argument " "1"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  result = (FormFactorLongBoxGauss *)((FormFactorLongBoxGauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongBoxGauss_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxGauss_accept" "', argument " "1"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongBoxGauss_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorLongBoxGauss const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxGauss_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxGauss_getLength" "', argument " "1"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  result = (double)((FormFactorLongBoxGauss const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxGauss_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxGauss_getHeight" "', argument " "1"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  result = (double)((FormFactorLongBoxGauss const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxGauss_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxGauss_getWidth" "', argument " "1"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  result = (double)((FormFactorLongBoxGauss const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxGauss_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxGauss_getRadialExtension" "', argument " "1"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  result = (double)((FormFactorLongBoxGauss const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxGauss_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongBoxGauss_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxGauss_evaluate_for_q" "', argument " "1"" of type '" "FormFactorLongBoxGauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongBoxGauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorLongBoxGauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorLongBoxGauss const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorLongBoxGauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxGauss *arg1 = (FormFactorLongBoxGauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorLongBoxGauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxGauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorLongBoxGauss" "', argument " "1"" of type '" "FormFactorLongBoxGauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxGauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorLongBoxGauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorLongBoxGauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongBoxLorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorLongBoxLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorLongBoxLorentz",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongBoxLorentz" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorLongBoxLorentz" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorLongBoxLorentz" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorLongBoxLorentz *)new FormFactorLongBoxLorentz(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongBoxLorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLongBoxLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxLorentz_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxLorentz_clone" "', argument " "1"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  result = (FormFactorLongBoxLorentz *)((FormFactorLongBoxLorentz const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongBoxLorentz_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxLorentz_accept" "', argument " "1"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongBoxLorentz_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorLongBoxLorentz const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxLorentz_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxLorentz_getLength" "', argument " "1"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  result = (double)((FormFactorLongBoxLorentz const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxLorentz_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxLorentz_getHeight" "', argument " "1"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  result = (double)((FormFactorLongBoxLorentz const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxLorentz_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxLorentz_getWidth" "', argument " "1"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  result = (double)((FormFactorLongBoxLorentz const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongBoxLorentz_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxLorentz_getRadialExtension" "', argument " "1"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  result = (double)((FormFactorLongBoxLorentz const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongBoxLorentz_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongBoxLorentz_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongBoxLorentz_evaluate_for_q" "', argument " "1"" of type '" "FormFactorLongBoxLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongBoxLorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorLongBoxLorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorLongBoxLorentz const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorLongBoxLorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongBoxLorentz *arg1 = (FormFactorLongBoxLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorLongBoxLorentz",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongBoxLorentz, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorLongBoxLorentz" "', argument " "1"" of type '" "FormFactorLongBoxLorentz *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongBoxLorentz * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorLongBoxLorentz_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorLongBoxLorentz, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongRipple1Gauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorLongRipple1Gauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorLongRipple1Gauss",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongRipple1Gauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorLongRipple1Gauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorLongRipple1Gauss" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorLongRipple1Gauss *)new FormFactorLongRipple1Gauss(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple1Gauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Gauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLongRipple1Gauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Gauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Gauss_clone" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  result = (FormFactorLongRipple1Gauss *)((FormFactorLongRipple1Gauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Gauss_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple1Gauss_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Gauss_accept" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple1Gauss_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorLongRipple1Gauss const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Gauss_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Gauss_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Gauss_getHeight" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple1Gauss const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Gauss_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Gauss_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Gauss_getWidth" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple1Gauss const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Gauss_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Gauss_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Gauss_getLength" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple1Gauss const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Gauss_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Gauss_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Gauss_getRadialExtension" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple1Gauss const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Gauss_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple1Gauss_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Gauss_evaluate_for_q" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple1Gauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorLongRipple1Gauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorLongRipple1Gauss const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorLongRipple1Gauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Gauss *arg1 = (FormFactorLongRipple1Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorLongRipple1Gauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Gauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorLongRipple1Gauss" "', argument " "1"" of type '" "FormFactorLongRipple1Gauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Gauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorLongRipple1Gauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorLongRipple1Gauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongRipple1Lorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorLongRipple1Lorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorLongRipple1Lorentz",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongRipple1Lorentz" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorLongRipple1Lorentz" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorLongRipple1Lorentz" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorLongRipple1Lorentz *)new FormFactorLongRipple1Lorentz(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple1Lorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Lorentz_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLongRipple1Lorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Lorentz_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Lorentz_clone" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  result = (FormFactorLongRipple1Lorentz *)((FormFactorLongRipple1Lorentz const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Lorentz_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple1Lorentz_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Lorentz_accept" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple1Lorentz_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorLongRipple1Lorentz const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Lorentz_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Lorentz_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Lorentz_getRadialExtension" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple1Lorentz const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Lorentz_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Lorentz_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Lorentz_getHeight" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple1Lorentz const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Lorentz_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Lorentz_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Lorentz_getWidth" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple1Lorentz const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Lorentz_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple1Lorentz_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Lorentz_getLength" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple1Lorentz const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple1Lorentz_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple1Lorentz_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple1Lorentz_evaluate_for_q" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple1Lorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorLongRipple1Lorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorLongRipple1Lorentz const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorLongRipple1Lorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple1Lorentz *arg1 = (FormFactorLongRipple1Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorLongRipple1Lorentz",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple1Lorentz, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorLongRipple1Lorentz" "', argument " "1"" of type '" "FormFactorLongRipple1Lorentz *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple1Lorentz * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorLongRipple1Lorentz_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorLongRipple1Lorentz, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongRipple2Gauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FormFactorLongRipple2Gauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FormFactorLongRipple2Gauss",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongRipple2Gauss" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorLongRipple2Gauss" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorLongRipple2Gauss" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FormFactorLongRipple2Gauss" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FormFactorLongRipple2Gauss *)new FormFactorLongRipple2Gauss(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple2Gauss, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLongRipple2Gauss *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Gauss_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_clone" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  result = (FormFactorLongRipple2Gauss *)((FormFactorLongRipple2Gauss const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple2Gauss_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_accept" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple2Gauss_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorLongRipple2Gauss const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Gauss_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_getHeight" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple2Gauss const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Gauss_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_getWidth" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple2Gauss const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Gauss_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_getLength" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple2Gauss const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_getAsymmetry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Gauss_getAsymmetry",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_getAsymmetry" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple2Gauss const *)arg1)->getAsymmetry();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Gauss_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_getRadialExtension" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  result = (double)((FormFactorLongRipple2Gauss const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Gauss_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple2Gauss_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Gauss_evaluate_for_q" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple2Gauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorLongRipple2Gauss_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorLongRipple2Gauss const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorLongRipple2Gauss(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Gauss *arg1 = (FormFactorLongRipple2Gauss *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorLongRipple2Gauss",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Gauss, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorLongRipple2Gauss" "', argument " "1"" of type '" "FormFactorLongRipple2Gauss *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Gauss * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorLongRipple2Gauss_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorLongRipple2Gauss, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLongRipple2Lorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FormFactorLongRipple2Lorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FormFactorLongRipple2Lorentz",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLongRipple2Lorentz" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorLongRipple2Lorentz" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorLongRipple2Lorentz" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FormFactorLongRipple2Lorentz" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FormFactorLongRipple2Lorentz *)new FormFactorLongRipple2Lorentz(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple2Lorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLongRipple2Lorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Lorentz_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_clone" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  result = (FormFactorLongRipple2Lorentz *)((FormFactorLongRipple2Lorentz const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple2Lorentz_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_accept" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple2Lorentz_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorLongRipple2Lorentz const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Lorentz_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_getHeight" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple2Lorentz const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Lorentz_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_getWidth" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple2Lorentz const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Lorentz_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_getLength" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple2Lorentz const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_getAsymmetry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Lorentz_getAsymmetry",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_getAsymmetry" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple2Lorentz const *)arg1)->getAsymmetry();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLongRipple2Lorentz_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_getRadialExtension" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  result = (double)((FormFactorLongRipple2Lorentz const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLongRipple2Lorentz_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLongRipple2Lorentz_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLongRipple2Lorentz_evaluate_for_q" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLongRipple2Lorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorLongRipple2Lorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorLongRipple2Lorentz const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorLongRipple2Lorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLongRipple2Lorentz *arg1 = (FormFactorLongRipple2Lorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorLongRipple2Lorentz",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLongRipple2Lorentz, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorLongRipple2Lorentz" "', argument " "1"" of type '" "FormFactorLongRipple2Lorentz *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLongRipple2Lorentz * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorLongRipple2Lorentz_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorLongRipple2Lorentz, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLorentz__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_FormFactorLorentz",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLorentz" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (FormFactorLorentz *)new FormFactorLorentz(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLorentz__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorLorentz",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorLorentz" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorLorentz" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorLorentz *)new FormFactorLorentz(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLorentz, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FormFactorLorentz(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_FormFactorLorentz__SWIG_0(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FormFactorLorentz__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FormFactorLorentz'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorLorentz::FormFactorLorentz(double)\n"
+    "    FormFactorLorentz::FormFactorLorentz(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLorentz_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLorentz *arg1 = (FormFactorLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorLorentz *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLorentz_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLorentz_clone" "', argument " "1"" of type '" "FormFactorLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLorentz * >(argp1);
+  result = (FormFactorLorentz *)((FormFactorLorentz const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLorentz_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLorentz *arg1 = (FormFactorLorentz *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLorentz_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLorentz_accept" "', argument " "1"" of type '" "FormFactorLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLorentz * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLorentz_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorLorentz const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLorentz_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLorentz *arg1 = (FormFactorLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLorentz_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLorentz_getWidth" "', argument " "1"" of type '" "FormFactorLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLorentz * >(argp1);
+  result = (double)((FormFactorLorentz const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLorentz_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLorentz *arg1 = (FormFactorLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLorentz_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLorentz_getHeight" "', argument " "1"" of type '" "FormFactorLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLorentz * >(argp1);
+  result = (double)((FormFactorLorentz const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLorentz_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLorentz *arg1 = (FormFactorLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorLorentz_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLorentz_getRadialExtension" "', argument " "1"" of type '" "FormFactorLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLorentz * >(argp1);
+  result = (double)((FormFactorLorentz const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorLorentz_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLorentz *arg1 = (FormFactorLorentz *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorLorentz_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLorentz, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorLorentz_evaluate_for_q" "', argument " "1"" of type '" "FormFactorLorentz const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLorentz * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorLorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorLorentz_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorLorentz const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorLorentz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorLorentz *arg1 = (FormFactorLorentz *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorLorentz",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorLorentz, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorLorentz" "', argument " "1"" of type '" "FormFactorLorentz *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorLorentz * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorLorentz_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorLorentz, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorPrism3 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorPrism3",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorPrism3" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorPrism3" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorPrism3 *)new FormFactorPrism3(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPrism3, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPrism3_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism3 *arg1 = (FormFactorPrism3 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorPrism3 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPrism3_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism3, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPrism3_clone" "', argument " "1"" of type '" "FormFactorPrism3 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism3 * >(argp1);
+  result = (FormFactorPrism3 *)((FormFactorPrism3 const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPrism3, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPrism3_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism3 *arg1 = (FormFactorPrism3 *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPrism3_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism3, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPrism3_accept" "', argument " "1"" of type '" "FormFactorPrism3 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism3 * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPrism3_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorPrism3 const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPrism3_getBaseEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism3 *arg1 = (FormFactorPrism3 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPrism3_getBaseEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism3, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPrism3_getBaseEdge" "', argument " "1"" of type '" "FormFactorPrism3 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism3 * >(argp1);
+  result = (double)((FormFactorPrism3 const *)arg1)->getBaseEdge();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorPrism3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism3 *arg1 = (FormFactorPrism3 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorPrism3",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism3, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPrism3" "', argument " "1"" of type '" "FormFactorPrism3 *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism3 * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorPrism3_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPrism3, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorPrism6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorPrism6 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorPrism6",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorPrism6" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorPrism6" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorPrism6 *)new FormFactorPrism6(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPrism6, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPrism6_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism6 *arg1 = (FormFactorPrism6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorPrism6 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPrism6_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPrism6_clone" "', argument " "1"" of type '" "FormFactorPrism6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism6 * >(argp1);
+  result = (FormFactorPrism6 *)((FormFactorPrism6 const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPrism6, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPrism6_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism6 *arg1 = (FormFactorPrism6 *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPrism6_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPrism6_accept" "', argument " "1"" of type '" "FormFactorPrism6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism6 * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPrism6_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorPrism6 const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPrism6_getBaseEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism6 *arg1 = (FormFactorPrism6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPrism6_getBaseEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism6, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPrism6_getBaseEdge" "', argument " "1"" of type '" "FormFactorPrism6 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism6 * >(argp1);
+  result = (double)((FormFactorPrism6 const *)arg1)->getBaseEdge();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorPrism6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPrism6 *arg1 = (FormFactorPrism6 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorPrism6",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPrism6, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPrism6" "', argument " "1"" of type '" "FormFactorPrism6 *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPrism6 * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorPrism6_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPrism6, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorPyramid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorPyramid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorPyramid",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorPyramid" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorPyramid" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorPyramid" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorPyramid *)new FormFactorPyramid(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPyramid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPyramid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorPyramid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPyramid_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPyramid_clone" "', argument " "1"" of type '" "FormFactorPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPyramid * >(argp1);
+  result = (FormFactorPyramid *)((FormFactorPyramid const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPyramid_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorPyramid_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPyramid_accept" "', argument " "1"" of type '" "FormFactorPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPyramid * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorPyramid_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorPyramid const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPyramid_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPyramid_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPyramid_getHeight" "', argument " "1"" of type '" "FormFactorPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPyramid * >(argp1);
+  result = (double)((FormFactorPyramid const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPyramid_getBaseEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPyramid_getBaseEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPyramid_getBaseEdge" "', argument " "1"" of type '" "FormFactorPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPyramid * >(argp1);
+  result = (double)((FormFactorPyramid const *)arg1)->getBaseEdge();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorPyramid_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorPyramid_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPyramid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorPyramid_getAlpha" "', argument " "1"" of type '" "FormFactorPyramid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPyramid * >(argp1);
+  result = (double)((FormFactorPyramid const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorPyramid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorPyramid *arg1 = (FormFactorPyramid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorPyramid",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorPyramid, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorPyramid" "', argument " "1"" of type '" "FormFactorPyramid *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorPyramid * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorPyramid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorPyramid, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorRipple1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorRipple1 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorRipple1",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorRipple1" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorRipple1" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorRipple1" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorRipple1 *)new FormFactorRipple1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorRipple1, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple1_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorRipple1 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple1_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple1_clone" "', argument " "1"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  result = (FormFactorRipple1 *)((FormFactorRipple1 const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple1_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorRipple1_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple1_accept" "', argument " "1"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorRipple1_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorRipple1 const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple1_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple1_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple1_getLength" "', argument " "1"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  result = (double)((FormFactorRipple1 const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple1_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple1_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple1_getHeight" "', argument " "1"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  result = (double)((FormFactorRipple1 const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple1_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple1_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple1_getWidth" "', argument " "1"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  result = (double)((FormFactorRipple1 const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple1_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple1_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple1_getRadialExtension" "', argument " "1"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  result = (double)((FormFactorRipple1 const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple1_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorRipple1_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple1_evaluate_for_q" "', argument " "1"" of type '" "FormFactorRipple1 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorRipple1_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorRipple1_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorRipple1 const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorRipple1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple1 *arg1 = (FormFactorRipple1 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorRipple1",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple1, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorRipple1" "', argument " "1"" of type '" "FormFactorRipple1 *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple1 * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorRipple1_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorRipple1, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorRipple2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FormFactorRipple2 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FormFactorRipple2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorRipple2" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorRipple2" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorRipple2" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FormFactorRipple2" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FormFactorRipple2 *)new FormFactorRipple2(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorRipple2, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorRipple2 *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple2_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_clone" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  result = (FormFactorRipple2 *)((FormFactorRipple2 const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorRipple2_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_accept" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorRipple2_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorRipple2 const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple2_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_getHeight" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  result = (double)((FormFactorRipple2 const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple2_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_getWidth" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  result = (double)((FormFactorRipple2 const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple2_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_getLength" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  result = (double)((FormFactorRipple2 const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_getAsymmetry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple2_getAsymmetry",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_getAsymmetry" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  result = (double)((FormFactorRipple2 const *)arg1)->getAsymmetry();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorRipple2_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_getRadialExtension" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  result = (double)((FormFactorRipple2 const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorRipple2_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorRipple2_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorRipple2_evaluate_for_q" "', argument " "1"" of type '" "FormFactorRipple2 const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorRipple2_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorRipple2_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorRipple2 const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorRipple2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorRipple2 *arg1 = (FormFactorRipple2 *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorRipple2",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorRipple2, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorRipple2" "', argument " "1"" of type '" "FormFactorRipple2 *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorRipple2 * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorRipple2_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorRipple2, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereGaussianRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorSphereGaussianRadius *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorSphereGaussianRadius",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorSphereGaussianRadius" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorSphereGaussianRadius" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorSphereGaussianRadius *)new FormFactorSphereGaussianRadius(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereGaussianRadius, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereGaussianRadius_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereGaussianRadius *arg1 = (FormFactorSphereGaussianRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorSphereGaussianRadius *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorSphereGaussianRadius_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereGaussianRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereGaussianRadius_clone" "', argument " "1"" of type '" "FormFactorSphereGaussianRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereGaussianRadius * >(argp1);
+  result = (FormFactorSphereGaussianRadius *)((FormFactorSphereGaussianRadius const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereGaussianRadius, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereGaussianRadius_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereGaussianRadius *arg1 = (FormFactorSphereGaussianRadius *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorSphereGaussianRadius_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereGaussianRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereGaussianRadius_accept" "', argument " "1"" of type '" "FormFactorSphereGaussianRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereGaussianRadius * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorSphereGaussianRadius_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorSphereGaussianRadius const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereGaussianRadius_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereGaussianRadius *arg1 = (FormFactorSphereGaussianRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorSphereGaussianRadius_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereGaussianRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereGaussianRadius_getRadialExtension" "', argument " "1"" of type '" "FormFactorSphereGaussianRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereGaussianRadius * >(argp1);
+  result = (double)((FormFactorSphereGaussianRadius const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereGaussianRadius_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereGaussianRadius *arg1 = (FormFactorSphereGaussianRadius *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorSphereGaussianRadius_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereGaussianRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereGaussianRadius_evaluate_for_q" "', argument " "1"" of type '" "FormFactorSphereGaussianRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereGaussianRadius * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorSphereGaussianRadius_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorSphereGaussianRadius_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorSphereGaussianRadius const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorSphereGaussianRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereGaussianRadius *arg1 = (FormFactorSphereGaussianRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorSphereGaussianRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereGaussianRadius, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorSphereGaussianRadius" "', argument " "1"" of type '" "FormFactorSphereGaussianRadius *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereGaussianRadius * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorSphereGaussianRadius_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorSphereGaussianRadius, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereLogNormalRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  size_t arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorSphereLogNormalRadius *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorSphereLogNormalRadius",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorSphereLogNormalRadius" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorSphereLogNormalRadius" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorSphereLogNormalRadius" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (FormFactorSphereLogNormalRadius *)new FormFactorSphereLogNormalRadius(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereLogNormalRadius, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereLogNormalRadius_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereLogNormalRadius *arg1 = (FormFactorSphereLogNormalRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorSphereLogNormalRadius *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorSphereLogNormalRadius_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereLogNormalRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereLogNormalRadius_clone" "', argument " "1"" of type '" "FormFactorSphereLogNormalRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereLogNormalRadius * >(argp1);
+  result = (FormFactorSphereLogNormalRadius *)((FormFactorSphereLogNormalRadius const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereLogNormalRadius, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereLogNormalRadius_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereLogNormalRadius *arg1 = (FormFactorSphereLogNormalRadius *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorSphereLogNormalRadius_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereLogNormalRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereLogNormalRadius_accept" "', argument " "1"" of type '" "FormFactorSphereLogNormalRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereLogNormalRadius * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorSphereLogNormalRadius_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorSphereLogNormalRadius const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereLogNormalRadius_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereLogNormalRadius *arg1 = (FormFactorSphereLogNormalRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorSphereLogNormalRadius_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereLogNormalRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereLogNormalRadius_getRadialExtension" "', argument " "1"" of type '" "FormFactorSphereLogNormalRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereLogNormalRadius * >(argp1);
+  result = (double)((FormFactorSphereLogNormalRadius const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereLogNormalRadius_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereLogNormalRadius *arg1 = (FormFactorSphereLogNormalRadius *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorSphereLogNormalRadius_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereLogNormalRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereLogNormalRadius_evaluate_for_q" "', argument " "1"" of type '" "FormFactorSphereLogNormalRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereLogNormalRadius * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorSphereLogNormalRadius_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorSphereLogNormalRadius_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorSphereLogNormalRadius const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorSphereLogNormalRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereLogNormalRadius *arg1 = (FormFactorSphereLogNormalRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorSphereLogNormalRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereLogNormalRadius, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorSphereLogNormalRadius" "', argument " "1"" of type '" "FormFactorSphereLogNormalRadius *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereLogNormalRadius * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorSphereLogNormalRadius_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorSphereLogNormalRadius, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorSphereUniformRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorSphereUniformRadius *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorSphereUniformRadius",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorSphereUniformRadius" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorSphereUniformRadius" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorSphereUniformRadius *)new FormFactorSphereUniformRadius(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereUniformRadius, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereUniformRadius_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereUniformRadius *arg1 = (FormFactorSphereUniformRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorSphereUniformRadius *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorSphereUniformRadius_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereUniformRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereUniformRadius_clone" "', argument " "1"" of type '" "FormFactorSphereUniformRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereUniformRadius * >(argp1);
+  result = (FormFactorSphereUniformRadius *)((FormFactorSphereUniformRadius const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorSphereUniformRadius, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereUniformRadius_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereUniformRadius *arg1 = (FormFactorSphereUniformRadius *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorSphereUniformRadius_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereUniformRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereUniformRadius_accept" "', argument " "1"" of type '" "FormFactorSphereUniformRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereUniformRadius * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorSphereUniformRadius_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorSphereUniformRadius const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereUniformRadius_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereUniformRadius *arg1 = (FormFactorSphereUniformRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorSphereUniformRadius_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereUniformRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereUniformRadius_getRadialExtension" "', argument " "1"" of type '" "FormFactorSphereUniformRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereUniformRadius * >(argp1);
+  result = (double)((FormFactorSphereUniformRadius const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorSphereUniformRadius_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereUniformRadius *arg1 = (FormFactorSphereUniformRadius *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorSphereUniformRadius_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereUniformRadius, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorSphereUniformRadius_evaluate_for_q" "', argument " "1"" of type '" "FormFactorSphereUniformRadius const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereUniformRadius * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorSphereUniformRadius_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorSphereUniformRadius_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorSphereUniformRadius const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorSphereUniformRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorSphereUniformRadius *arg1 = (FormFactorSphereUniformRadius *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorSphereUniformRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorSphereUniformRadius, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorSphereUniformRadius" "', argument " "1"" of type '" "FormFactorSphereUniformRadius *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorSphereUniformRadius * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorSphereUniformRadius_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorSphereUniformRadius, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTetrahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorTetrahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorTetrahedron",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTetrahedron" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorTetrahedron" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorTetrahedron" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorTetrahedron *)new FormFactorTetrahedron(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTetrahedron, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorTetrahedron *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_clone" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
+  result = (FormFactorTetrahedron *)((FormFactorTetrahedron const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTetrahedron_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_accept" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTetrahedron_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorTetrahedron const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getBaseEdge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getBaseEdge",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getBaseEdge" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
+  result = (double)((FormFactorTetrahedron const *)arg1)->getBaseEdge();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getHeight" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
+  result = (double)((FormFactorTetrahedron const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTetrahedron_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTetrahedron_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTetrahedron_getAlpha" "', argument " "1"" of type '" "FormFactorTetrahedron const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
+  result = (double)((FormFactorTetrahedron const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorTetrahedron(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTetrahedron *arg1 = (FormFactorTetrahedron *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorTetrahedron",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTetrahedron, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorTetrahedron" "', argument " "1"" of type '" "FormFactorTetrahedron *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTetrahedron * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorTetrahedron_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorTetrahedron, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTrivial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTrivial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FormFactorTrivial")) SWIG_fail;
+  result = (FormFactorTrivial *)new FormFactorTrivial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTrivial, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTrivial_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTrivial *arg1 = (FormFactorTrivial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorTrivial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTrivial_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTrivial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTrivial_clone" "', argument " "1"" of type '" "FormFactorTrivial const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTrivial * >(argp1);
+  result = (FormFactorTrivial *)((FormFactorTrivial const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTrivial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTrivial_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTrivial *arg1 = (FormFactorTrivial *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTrivial_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTrivial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTrivial_accept" "', argument " "1"" of type '" "FormFactorTrivial const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTrivial * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTrivial_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorTrivial const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTrivial_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTrivial *arg1 = (FormFactorTrivial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTrivial_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTrivial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTrivial_getRadialExtension" "', argument " "1"" of type '" "FormFactorTrivial const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTrivial * >(argp1);
+  result = (double)((FormFactorTrivial const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTrivial_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTrivial *arg1 = (FormFactorTrivial *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTrivial_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTrivial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTrivial_evaluate_for_q" "', argument " "1"" of type '" "FormFactorTrivial const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTrivial * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTrivial_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorTrivial_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorTrivial const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorTrivial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTrivial *arg1 = (FormFactorTrivial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorTrivial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTrivial, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorTrivial" "', argument " "1"" of type '" "FormFactorTrivial *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTrivial * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorTrivial_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorTrivial, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedCube(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorTruncatedCube *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorTruncatedCube",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTruncatedCube" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorTruncatedCube" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorTruncatedCube *)new FormFactorTruncatedCube(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedCube, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorTruncatedCube *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedCube_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedCube, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedCube_clone" "', argument " "1"" of type '" "FormFactorTruncatedCube const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedCube * >(argp1);
+  result = (FormFactorTruncatedCube *)((FormFactorTruncatedCube const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedCube, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTruncatedCube_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedCube, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedCube_accept" "', argument " "1"" of type '" "FormFactorTruncatedCube const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedCube * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTruncatedCube_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorTruncatedCube const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_getLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedCube_getLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedCube, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedCube_getLength" "', argument " "1"" of type '" "FormFactorTruncatedCube const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedCube * >(argp1);
+  result = (double)((FormFactorTruncatedCube const *)arg1)->getLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedCube_getRemovedLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedCube_getRemovedLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedCube, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedCube_getRemovedLength" "', argument " "1"" of type '" "FormFactorTruncatedCube const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedCube * >(argp1);
+  result = (double)((FormFactorTruncatedCube const *)arg1)->getRemovedLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorTruncatedCube(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedCube *arg1 = (FormFactorTruncatedCube *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorTruncatedCube",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedCube, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorTruncatedCube" "', argument " "1"" of type '" "FormFactorTruncatedCube *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedCube * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorTruncatedCube_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorTruncatedCube, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSphere(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FormFactorTruncatedSphere *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FormFactorTruncatedSphere",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTruncatedSphere" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorTruncatedSphere" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FormFactorTruncatedSphere *)new FormFactorTruncatedSphere(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedSphere, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSphere_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorTruncatedSphere *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSphere_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSphere_clone" "', argument " "1"" of type '" "FormFactorTruncatedSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSphere * >(argp1);
+  result = (FormFactorTruncatedSphere *)((FormFactorTruncatedSphere const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSphere_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTruncatedSphere_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSphere_accept" "', argument " "1"" of type '" "FormFactorTruncatedSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSphere * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTruncatedSphere_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorTruncatedSphere const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSphere_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSphere_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSphere_getHeight" "', argument " "1"" of type '" "FormFactorTruncatedSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSphere * >(argp1);
+  result = (double)((FormFactorTruncatedSphere const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSphere_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSphere_getRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSphere_getRadius" "', argument " "1"" of type '" "FormFactorTruncatedSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSphere * >(argp1);
+  result = (double)((FormFactorTruncatedSphere const *)arg1)->getRadius();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSphere_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSphere_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSphere_getRadialExtension" "', argument " "1"" of type '" "FormFactorTruncatedSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSphere * >(argp1);
+  result = (double)((FormFactorTruncatedSphere const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSphere_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTruncatedSphere_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSphere, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSphere_evaluate_for_q" "', argument " "1"" of type '" "FormFactorTruncatedSphere const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSphere * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTruncatedSphere_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorTruncatedSphere_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorTruncatedSphere const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorTruncatedSphere(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSphere *arg1 = (FormFactorTruncatedSphere *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorTruncatedSphere",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSphere, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorTruncatedSphere" "', argument " "1"" of type '" "FormFactorTruncatedSphere *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSphere * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorTruncatedSphere_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorTruncatedSphere, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorTruncatedSpheroid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FormFactorTruncatedSpheroid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FormFactorTruncatedSpheroid",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_FormFactorTruncatedSpheroid" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FormFactorTruncatedSpheroid" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_FormFactorTruncatedSpheroid" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FormFactorTruncatedSpheroid *)new FormFactorTruncatedSpheroid(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedSpheroid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorTruncatedSpheroid *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSpheroid_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSpheroid_clone" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  result = (FormFactorTruncatedSpheroid *)((FormFactorTruncatedSpheroid const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTruncatedSpheroid_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSpheroid_accept" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTruncatedSpheroid_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorTruncatedSpheroid const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_getRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSpheroid_getRadius",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSpheroid_getRadius" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  result = (double)((FormFactorTruncatedSpheroid const *)arg1)->getRadius();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSpheroid_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSpheroid_getHeight" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  result = (double)((FormFactorTruncatedSpheroid const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_getHeightFlattening(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSpheroid_getHeightFlattening",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSpheroid_getHeightFlattening" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  result = (double)((FormFactorTruncatedSpheroid const *)arg1)->getHeightFlattening();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorTruncatedSpheroid_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSpheroid_getRadialExtension" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  result = (double)((FormFactorTruncatedSpheroid const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorTruncatedSpheroid_evaluate_for_q(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  cvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorTruncatedSpheroid_evaluate_for_q",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorTruncatedSpheroid_evaluate_for_q" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorTruncatedSpheroid_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorTruncatedSpheroid_evaluate_for_q" "', argument " "2"" of type '" "cvector_t const""'");
+    } else {
+      cvector_t * temp = reinterpret_cast< cvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((FormFactorTruncatedSpheroid const *)arg1)->evaluate_for_q(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorTruncatedSpheroid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorTruncatedSpheroid *arg1 = (FormFactorTruncatedSpheroid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorTruncatedSpheroid",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorTruncatedSpheroid, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorTruncatedSpheroid" "', argument " "1"" of type '" "FormFactorTruncatedSpheroid *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorTruncatedSpheroid * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorTruncatedSpheroid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorTruncatedSpheroid, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FormFactorWeighted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FormFactorWeighted")) SWIG_fail;
+  result = (FormFactorWeighted *)new FormFactorWeighted();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorWeighted, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FormFactorWeighted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FormFactorWeighted",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FormFactorWeighted" "', argument " "1"" of type '" "FormFactorWeighted *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FormFactorWeighted *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorWeighted_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorWeighted_clone" "', argument " "1"" of type '" "FormFactorWeighted const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  result = (FormFactorWeighted *)((FormFactorWeighted const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorWeighted_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorWeighted_accept" "', argument " "1"" of type '" "FormFactorWeighted const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorWeighted_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((FormFactorWeighted const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_getRadialExtension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FormFactorWeighted_getRadialExtension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorWeighted_getRadialExtension" "', argument " "1"" of type '" "FormFactorWeighted const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  result = (double)((FormFactorWeighted const *)arg1)->getRadialExtension();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_addFormFactor__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  IFormFactor *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FormFactorWeighted_addFormFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorWeighted_addFormFactor" "', argument " "1"" of type '" "FormFactorWeighted *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorWeighted_addFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorWeighted_addFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FormFactorWeighted_addFormFactor" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->addFormFactor((IFormFactor const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_addFormFactor__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  IFormFactor *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorWeighted_addFormFactor",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorWeighted_addFormFactor" "', argument " "1"" of type '" "FormFactorWeighted *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorWeighted_addFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorWeighted_addFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  (arg1)->addFormFactor((IFormFactor const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_addFormFactor(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FormFactorWeighted, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IFormFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FormFactorWeighted_addFormFactor__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FormFactorWeighted, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IFormFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_FormFactorWeighted_addFormFactor__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FormFactorWeighted_addFormFactor'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FormFactorWeighted::addFormFactor(IFormFactor const &,double)\n"
+    "    FormFactorWeighted::addFormFactor(IFormFactor const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorWeighted_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorWeighted_setAmbientMaterial" "', argument " "1"" of type '" "FormFactorWeighted *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorWeighted_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorWeighted_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FormFactorWeighted_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FormFactorWeighted *arg1 = (FormFactorWeighted *) 0 ;
+  WavevectorInfo *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FormFactorWeighted_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FormFactorWeighted, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FormFactorWeighted_evaluate" "', argument " "1"" of type '" "FormFactorWeighted const *""'"); 
+  }
+  arg1 = reinterpret_cast< FormFactorWeighted * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_WavevectorInfo,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FormFactorWeighted_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FormFactorWeighted_evaluate" "', argument " "2"" of type '" "WavevectorInfo const &""'"); 
+  }
+  arg2 = reinterpret_cast< WavevectorInfo * >(argp2);
+  result = ((FormFactorWeighted const *)arg1)->evaluate((WavevectorInfo const &)*arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FormFactorWeighted_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FormFactorWeighted, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_Simulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Simulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Simulation" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Simulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_clone" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (Simulation *)((Simulation const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Simulation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_prepareSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_prepareSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_prepareSimulation" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  (arg1)->prepareSimulation();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_runSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_runSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_runSimulation" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  (arg1)->runSimulation();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setInstrument(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  Instrument *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_setInstrument",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setInstrument" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Instrument,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_setInstrument" "', argument " "2"" of type '" "Instrument const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_setInstrument" "', argument " "2"" of type '" "Instrument const &""'"); 
+  }
+  arg2 = reinterpret_cast< Instrument * >(argp2);
+  (arg1)->setInstrument((Instrument const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getInstrument__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Instrument *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getInstrument",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getInstrument" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (Instrument *) &((Simulation const *)arg1)->getInstrument();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Instrument, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getInstrument__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Instrument *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getInstrument",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getInstrument" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (Instrument *) &(arg1)->getInstrument();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Instrument, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getInstrument(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Simulation_getInstrument__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Simulation_getInstrument__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Simulation_getInstrument'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Simulation::getInstrument() const\n"
+    "    Simulation::getInstrument()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setBeamIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_setBeamIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setBeamIntensity" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Simulation_setBeamIntensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setBeamIntensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getBeamIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getBeamIntensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getBeamIntensity" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (double)((Simulation const *)arg1)->getBeamIntensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setBeamPolarization(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_setBeamPolarization",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setBeamPolarization" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_setBeamPolarization" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_setBeamPolarization" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->setBeamPolarization(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setDetectorResolutionFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  IResolutionFunction2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_setDetectorResolutionFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setDetectorResolutionFunction" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IResolutionFunction2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_setDetectorResolutionFunction" "', argument " "2"" of type '" "IResolutionFunction2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_setDetectorResolutionFunction" "', argument " "2"" of type '" "IResolutionFunction2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IResolutionFunction2D * >(argp2);
+  (arg1)->setDetectorResolutionFunction((IResolutionFunction2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_removeDetectorResolutionFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_removeDetectorResolutionFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_removeDetectorResolutionFunction" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  (arg1)->removeDetectorResolutionFunction();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setAnalyzerProperties(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Simulation_setAnalyzerProperties",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setAnalyzerProperties" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_setAnalyzerProperties" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_setAnalyzerProperties" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Simulation_setAnalyzerProperties" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Simulation_setAnalyzerProperties" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setAnalyzerProperties(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  MultiLayer *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_setSample",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setSample" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_MultiLayer,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_setSample" "', argument " "2"" of type '" "MultiLayer const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_setSample" "', argument " "2"" of type '" "MultiLayer const &""'"); 
+  }
+  arg2 = reinterpret_cast< MultiLayer * >(argp2);
+  (arg1)->setSample((MultiLayer const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  MultiLayer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getSample",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getSample" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (MultiLayer *)((Simulation const *)arg1)->getSample();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setSampleBuilderCpp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  std::shared_ptr< IMultiLayerBuilder > arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_setSampleBuilderCpp",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setSampleBuilderCpp" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    int newmem = 0;
+    res2 = SWIG_ConvertPtrAndOwn(obj1, &argp2, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t,  0 , &newmem);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_setSampleBuilderCpp" "', argument " "2"" of type '" "std::shared_ptr< IMultiLayerBuilder > const""'"); 
+    }
+    if (argp2) arg2 = *(reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp2));
+    if (newmem & SWIG_CAST_NEW_MEMORY) delete reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp2);
+  }
+  (arg1)->setSampleBuilder(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getSampleBuilder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getSampleBuilder",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getSampleBuilder" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = ((Simulation const *)arg1)->getSampleBuilder();
+  {
+    std::shared_ptr<  IMultiLayerBuilder > *smartresult = result ? new std::shared_ptr<  IMultiLayerBuilder >(result) : 0;
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, SWIG_POINTER_OWN);
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_numberOfSimulationElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_numberOfSimulationElements",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_numberOfSimulationElements" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (int)((Simulation const *)arg1)->numberOfSimulationElements();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getDetectorIntensity__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  IDetector2D::EAxesUnits arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_getDetectorIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getDetectorIntensity" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Simulation_getDetectorIntensity" "', argument " "2"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg2 = static_cast< IDetector2D::EAxesUnits >(val2);
+  result = (OutputData< double > *)((Simulation const *)arg1)->getDetectorIntensity(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getDetectorIntensity__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getDetectorIntensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getDetectorIntensity" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (OutputData< double > *)((Simulation const *)arg1)->getDetectorIntensity();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getDetectorIntensity(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Simulation_getDetectorIntensity__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Simulation_getDetectorIntensity__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Simulation_getDetectorIntensity'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Simulation::getDetectorIntensity(IDetector2D::EAxesUnits) const\n"
+    "    Simulation::getDetectorIntensity() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_addSimulationParametersToExternalPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  std::string *arg2 = 0 ;
+  ParameterPool *arg3 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Simulation_addSimulationParametersToExternalPool",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_addSimulationParametersToExternalPool" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_addSimulationParametersToExternalPool" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addSimulationParametersToExternalPool" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Simulation_addSimulationParametersToExternalPool" "', argument " "3"" of type '" "ParameterPool *""'"); 
+  }
+  arg3 = reinterpret_cast< ParameterPool * >(argp3);
+  result = ((Simulation const *)arg1)->addSimulationParametersToExternalPool((std::string const &)*arg2,arg3);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_addParameterDistribution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  std::string *arg2 = 0 ;
+  IDistribution1D *arg3 = 0 ;
+  size_t arg4 ;
+  double arg5 ;
+  RealLimits *arg6 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  void *argp6 = 0 ;
+  int res6 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:Simulation_addParameterDistribution",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_addParameterDistribution" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Simulation_addParameterDistribution" "', argument " "3"" of type '" "IDistribution1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "3"" of type '" "IDistribution1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< IDistribution1D * >(argp3);
+  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Simulation_addParameterDistribution" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "Simulation_addParameterDistribution" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  res6 = SWIG_ConvertPtr(obj5, &argp6, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res6)) {
+    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "Simulation_addParameterDistribution" "', argument " "6"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp6) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "6"" of type '" "RealLimits const &""'"); 
+  }
+  arg6 = reinterpret_cast< RealLimits * >(argp6);
+  (arg1)->addParameterDistribution((std::string const &)*arg2,(IDistribution1D const &)*arg3,arg4,arg5,(RealLimits const &)*arg6);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_addParameterDistribution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  std::string *arg2 = 0 ;
+  IDistribution1D *arg3 = 0 ;
+  size_t arg4 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:Simulation_addParameterDistribution",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_addParameterDistribution" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Simulation_addParameterDistribution" "', argument " "3"" of type '" "IDistribution1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "3"" of type '" "IDistribution1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< IDistribution1D * >(argp3);
+  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Simulation_addParameterDistribution" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "Simulation_addParameterDistribution" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  (arg1)->addParameterDistribution((std::string const &)*arg2,(IDistribution1D const &)*arg3,arg4,arg5);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_addParameterDistribution__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  std::string *arg2 = 0 ;
+  IDistribution1D *arg3 = 0 ;
+  size_t arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Simulation_addParameterDistribution",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_addParameterDistribution" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Simulation_addParameterDistribution" "', argument " "3"" of type '" "IDistribution1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "3"" of type '" "IDistribution1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< IDistribution1D * >(argp3);
+  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Simulation_addParameterDistribution" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  (arg1)->addParameterDistribution((std::string const &)*arg2,(IDistribution1D const &)*arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_addParameterDistribution__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  ParameterDistribution *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_addParameterDistribution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_addParameterDistribution" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ParameterDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "ParameterDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_addParameterDistribution" "', argument " "2"" of type '" "ParameterDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< ParameterDistribution * >(argp2);
+  (arg1)->addParameterDistribution((ParameterDistribution const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_addParameterDistribution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[7] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 6) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_ParameterDistribution, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_Simulation_addParameterDistribution__SWIG_3(self, args);
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IDistribution1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_size_t(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_Simulation_addParameterDistribution__SWIG_2(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IDistribution1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_size_t(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_Simulation_addParameterDistribution__SWIG_1(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  if (argc == 6) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IDistribution1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_size_t(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              int res = SWIG_ConvertPtr(argv[5], 0, SWIGTYPE_p_RealLimits, 0);
+              _v = SWIG_CheckState(res);
+              if (_v) {
+                return _wrap_Simulation_addParameterDistribution__SWIG_0(self, args);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Simulation_addParameterDistribution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Simulation::addParameterDistribution(std::string const &,IDistribution1D const &,size_t,double,RealLimits const &)\n"
+    "    Simulation::addParameterDistribution(std::string const &,IDistribution1D const &,size_t,double)\n"
+    "    Simulation::addParameterDistribution(std::string const &,IDistribution1D const &,size_t)\n"
+    "    Simulation::addParameterDistribution(ParameterDistribution const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getDistributionHandler(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DistributionHandler *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getDistributionHandler",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getDistributionHandler" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (DistributionHandler *) &((Simulation const *)arg1)->getDistributionHandler();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DistributionHandler, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  SimulationOptions *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_setOptions",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setOptions" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_SimulationOptions,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_setOptions" "', argument " "2"" of type '" "SimulationOptions const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_setOptions" "', argument " "2"" of type '" "SimulationOptions const &""'"); 
+  }
+  arg2 = reinterpret_cast< SimulationOptions * >(argp2);
+  (arg1)->setOptions((SimulationOptions const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getOptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SimulationOptions *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getOptions",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getOptions" "', argument " "1"" of type '" "Simulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (SimulationOptions *) &((Simulation const *)arg1)->getOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getOptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SimulationOptions *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_getOptions",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_getOptions" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  result = (SimulationOptions *) &(arg1)->getOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_getOptions(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Simulation_getOptions__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Simulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Simulation_getOptions__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Simulation_getOptions'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Simulation::getOptions() const\n"
+    "    Simulation::getOptions()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_subscribe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  ProgressHandler::Callback_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Simulation_subscribe",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_subscribe" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ProgressHandler__Callback_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Simulation_subscribe" "', argument " "2"" of type '" "ProgressHandler::Callback_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Simulation_subscribe" "', argument " "2"" of type '" "ProgressHandler::Callback_t""'");
+    } else {
+      ProgressHandler::Callback_t * temp = reinterpret_cast< ProgressHandler::Callback_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->subscribe(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Simulation_setTerminalProgressMonitor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Simulation *arg1 = (Simulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Simulation_setTerminalProgressMonitor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Simulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Simulation_setTerminalProgressMonitor" "', argument " "1"" of type '" "Simulation *""'"); 
+  }
+  arg1 = reinterpret_cast< Simulation * >(argp1);
+  (arg1)->setTerminalProgressMonitor();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Simulation_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Simulation, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SimulationOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SimulationOptions")) SWIG_fail;
+  result = (SimulationOptions *)new SimulationOptions();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimulationOptions, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_isIntegrate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_isIntegrate",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_isIntegrate" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (bool)((SimulationOptions const *)arg1)->isIntegrate();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getMcPoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_getMcPoints",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getMcPoints" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = ((SimulationOptions const *)arg1)->getMcPoints();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  bool arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SimulationOptions_setMonteCarloIntegration",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  (arg1)->setMonteCarloIntegration(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SimulationOptions_setMonteCarloIntegration",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  (arg1)->setMonteCarloIntegration(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_setMonteCarloIntegration",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setMonteCarloIntegration" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  (arg1)->setMonteCarloIntegration();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setMonteCarloIntegration(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_2(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_bool(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationOptions, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_bool(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_SimulationOptions_setMonteCarloIntegration__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SimulationOptions_setMonteCarloIntegration'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SimulationOptions::setMonteCarloIntegration(bool,size_t)\n"
+    "    SimulationOptions::setMonteCarloIntegration(bool)\n"
+    "    SimulationOptions::setMonteCarloIntegration()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setNumberOfThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SimulationOptions_setNumberOfThreads",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setNumberOfThreads" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setNumberOfThreads" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setNumberOfThreads(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getNumberOfThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_getNumberOfThreads",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getNumberOfThreads" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (int)((SimulationOptions const *)arg1)->getNumberOfThreads();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setNumberOfBatches(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SimulationOptions_setNumberOfBatches",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setNumberOfBatches" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setNumberOfBatches" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->setNumberOfBatches(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getNumberOfBatches(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_getNumberOfBatches",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getNumberOfBatches" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (int)((SimulationOptions const *)arg1)->getNumberOfBatches();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getCurrentBatch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_getCurrentBatch",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getCurrentBatch" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (int)((SimulationOptions const *)arg1)->getCurrentBatch();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setThreadInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  ThreadInfo *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SimulationOptions_setThreadInfo",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setThreadInfo" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ThreadInfo,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationOptions_setThreadInfo" "', argument " "2"" of type '" "ThreadInfo const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationOptions_setThreadInfo" "', argument " "2"" of type '" "ThreadInfo const &""'"); 
+  }
+  arg2 = reinterpret_cast< ThreadInfo * >(argp2);
+  (arg1)->setThreadInfo((ThreadInfo const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getHardwareConcurrency(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_getHardwareConcurrency",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getHardwareConcurrency" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (int)((SimulationOptions const *)arg1)->getHardwareConcurrency();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_getDefaultVariability(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_getDefaultVariability",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_getDefaultVariability" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (double)((SimulationOptions const *)arg1)->getDefaultVariability();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_setIncludeSpecular(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SimulationOptions_setIncludeSpecular",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_setIncludeSpecular" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SimulationOptions_setIncludeSpecular" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  (arg1)->setIncludeSpecular(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationOptions_includeSpecular(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationOptions_includeSpecular",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationOptions_includeSpecular" "', argument " "1"" of type '" "SimulationOptions const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  result = (bool)((SimulationOptions const *)arg1)->includeSpecular();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SimulationOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationOptions *arg1 = (SimulationOptions *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SimulationOptions",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationOptions, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SimulationOptions" "', argument " "1"" of type '" "SimulationOptions *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationOptions * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SimulationOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SimulationOptions, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_GISASSimulation__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_GISASSimulation")) SWIG_fail;
+  result = (GISASSimulation *)new GISASSimulation();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_GISASSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_GISASSimulation__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  GISASSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_GISASSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_MultiLayer,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_GISASSimulation" "', argument " "1"" of type '" "MultiLayer const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_GISASSimulation" "', argument " "1"" of type '" "MultiLayer const &""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (GISASSimulation *)new GISASSimulation((MultiLayer const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_GISASSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_GISASSimulation__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::shared_ptr< IMultiLayerBuilder > arg1 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  GISASSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_GISASSimulation",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t,  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_GISASSimulation" "', argument " "1"" of type '" "std::shared_ptr< IMultiLayerBuilder > const""'"); 
+    }
+    if (argp1) arg1 = *(reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp1));
+    if (newmem & SWIG_CAST_NEW_MEMORY) delete reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp1);
+  }
+  result = (GISASSimulation *)new GISASSimulation(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_GISASSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_GISASSimulation(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_GISASSimulation__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_MultiLayer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_GISASSimulation__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_GISASSimulation__SWIG_2(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_GISASSimulation'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    GISASSimulation::GISASSimulation()\n"
+    "    GISASSimulation::GISASSimulation(MultiLayer const &)\n"
+    "    GISASSimulation::GISASSimulation(std::shared_ptr< IMultiLayerBuilder > const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_GISASSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_GISASSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_GISASSimulation" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  GISASSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_clone" "', argument " "1"" of type '" "GISASSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  result = (GISASSimulation *)((GISASSimulation const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_prepareSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_prepareSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_prepareSimulation" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  (arg1)->prepareSimulation();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_numberOfSimulationElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_numberOfSimulationElements",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_numberOfSimulationElements" "', argument " "1"" of type '" "GISASSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  result = (int)((GISASSimulation const *)arg1)->numberOfSimulationElements();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_getDetectorIntensity__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  IDetector2D::EAxesUnits arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:GISASSimulation_getDetectorIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_getDetectorIntensity" "', argument " "1"" of type '" "GISASSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GISASSimulation_getDetectorIntensity" "', argument " "2"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg2 = static_cast< IDetector2D::EAxesUnits >(val2);
+  result = (OutputData< double > *)((GISASSimulation const *)arg1)->getDetectorIntensity(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_getDetectorIntensity__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_getDetectorIntensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_getDetectorIntensity" "', argument " "1"" of type '" "GISASSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  result = (OutputData< double > *)((GISASSimulation const *)arg1)->getDetectorIntensity();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_getDetectorIntensity(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_GISASSimulation_getDetectorIntensity__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_GISASSimulation_getDetectorIntensity__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'GISASSimulation_getDetectorIntensity'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    GISASSimulation::getDetectorIntensity(IDetector2D::EAxesUnits) const\n"
+    "    GISASSimulation::getDetectorIntensity() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_getIntensityData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  IDetector2D::EAxesUnits arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:GISASSimulation_getIntensityData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_getIntensityData" "', argument " "1"" of type '" "GISASSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GISASSimulation_getIntensityData" "', argument " "2"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg2 = static_cast< IDetector2D::EAxesUnits >(val2);
+  result = (Histogram2D *)((GISASSimulation const *)arg1)->getIntensityData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_getIntensityData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_getIntensityData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_getIntensityData" "', argument " "1"" of type '" "GISASSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  result = (Histogram2D *)((GISASSimulation const *)arg1)->getIntensityData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_getIntensityData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_GISASSimulation_getIntensityData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_GISASSimulation_getIntensityData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'GISASSimulation_getIntensityData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    GISASSimulation::getIntensityData(IDetector2D::EAxesUnits) const\n"
+    "    GISASSimulation::getIntensityData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_setBeamParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:GISASSimulation_setBeamParameters",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_setBeamParameters" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GISASSimulation_setBeamParameters" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "GISASSimulation_setBeamParameters" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "GISASSimulation_setBeamParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setBeamParameters(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_setDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  IDetector2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:GISASSimulation_setDetector",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_setDetector" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IDetector2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "GISASSimulation_setDetector" "', argument " "2"" of type '" "IDetector2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "GISASSimulation_setDetector" "', argument " "2"" of type '" "IDetector2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IDetector2D * >(argp2);
+  (arg1)->setDetector((IDetector2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_setDetectorParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  size_t arg5 ;
+  double arg6 ;
+  double arg7 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  size_t val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  double val7 ;
+  int ecode7 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  PyObject * obj6 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:GISASSimulation_setDetectorParameters",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_setDetectorParameters" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GISASSimulation_setDetectorParameters" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "GISASSimulation_setDetectorParameters" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "GISASSimulation_setDetectorParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_size_t(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "GISASSimulation_setDetectorParameters" "', argument " "5"" of type '" "size_t""'");
+  } 
+  arg5 = static_cast< size_t >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "GISASSimulation_setDetectorParameters" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  ecode7 = SWIG_AsVal_double(obj6, &val7);
+  if (!SWIG_IsOK(ecode7)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "GISASSimulation_setDetectorParameters" "', argument " "7"" of type '" "double""'");
+  } 
+  arg7 = static_cast< double >(val7);
+  (arg1)->setDetectorParameters(arg2,arg3,arg4,arg5,arg6,arg7);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_removeMasks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_removeMasks",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_removeMasks" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  (arg1)->removeMasks();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_addMask__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  Geometry::IShape2D *arg2 = 0 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  bool val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:GISASSimulation_addMask",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_addMask" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Geometry__IShape2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "GISASSimulation_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "GISASSimulation_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Geometry::IShape2D * >(argp2);
+  ecode3 = SWIG_AsVal_bool(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "GISASSimulation_addMask" "', argument " "3"" of type '" "bool""'");
+  } 
+  arg3 = static_cast< bool >(val3);
+  (arg1)->addMask((Geometry::IShape2D const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_addMask__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  Geometry::IShape2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:GISASSimulation_addMask",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_addMask" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Geometry__IShape2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "GISASSimulation_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "GISASSimulation_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Geometry::IShape2D * >(argp2);
+  (arg1)->addMask((Geometry::IShape2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_addMask(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Geometry__IShape2D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_GISASSimulation_addMask__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_GISASSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Geometry__IShape2D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_bool(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_GISASSimulation_addMask__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'GISASSimulation_addMask'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    GISASSimulation::addMask(Geometry::IShape2D const &,bool)\n"
+    "    GISASSimulation::addMask(Geometry::IShape2D const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_maskAll(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_maskAll",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_maskAll" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  (arg1)->maskAll();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_setRegionOfInterest(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:GISASSimulation_setRegionOfInterest",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_setRegionOfInterest" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GISASSimulation_setRegionOfInterest" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "GISASSimulation_setRegionOfInterest" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "GISASSimulation_setRegionOfInterest" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "GISASSimulation_setRegionOfInterest" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  (arg1)->setRegionOfInterest(arg2,arg3,arg4,arg5);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GISASSimulation_resetRegionOfInterest(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  GISASSimulation *arg1 = (GISASSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:GISASSimulation_resetRegionOfInterest",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GISASSimulation_resetRegionOfInterest" "', argument " "1"" of type '" "GISASSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< GISASSimulation * >(argp1);
+  (arg1)->resetRegionOfInterest();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *GISASSimulation_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_GISASSimulation, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IHistogram(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IHistogram",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IHistogram" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_clone" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (IHistogram *)((IHistogram const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getRank(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getRank",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getRank" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = ((IHistogram const *)arg1)->getRank();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getTotalNumberOfBins(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getTotalNumberOfBins",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getTotalNumberOfBins" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = ((IHistogram const *)arg1)->getTotalNumberOfBins();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getXaxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getXaxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getXaxis" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (IAxis *) &((IHistogram const *)arg1)->getXaxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getYaxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getYaxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getYaxis" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (IAxis *) &((IHistogram const *)arg1)->getYaxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getXmin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getXmin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getXmin" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (double)((IHistogram const *)arg1)->getXmin();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getXmax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getXmax",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getXmax" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (double)((IHistogram const *)arg1)->getXmax();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getNbinsX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getNbinsX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getNbinsX" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = ((IHistogram const *)arg1)->getNbinsX();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getYmin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getYmin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getYmin" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (double)((IHistogram const *)arg1)->getYmin();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getYmax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getYmax",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getYmax" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (double)((IHistogram const *)arg1)->getYmax();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getNbinsY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getNbinsY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getNbinsY" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = ((IHistogram const *)arg1)->getNbinsY();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getGlobalBin__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_getGlobalBin",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getGlobalBin" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getGlobalBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_getGlobalBin" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = ((IHistogram const *)arg1)->getGlobalBin(arg2,arg3);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getGlobalBin__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getGlobalBin",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getGlobalBin" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getGlobalBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((IHistogram const *)arg1)->getGlobalBin(arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getGlobalBin(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IHistogram_getGlobalBin__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IHistogram_getGlobalBin__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_getGlobalBin'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::getGlobalBin(size_t,size_t) const\n"
+    "    IHistogram::getGlobalBin(size_t) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_findGlobalBin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_findGlobalBin",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_findGlobalBin" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_findGlobalBin" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_findGlobalBin" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((IHistogram const *)arg1)->findGlobalBin(arg2,arg3);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getXaxisIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getXaxisIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getXaxisIndex" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getXaxisIndex" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (int)((IHistogram const *)arg1)->getXaxisIndex(arg2);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getYaxisIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getYaxisIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getYaxisIndex" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getYaxisIndex" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (int)((IHistogram const *)arg1)->getYaxisIndex(arg2);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getXaxisValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getXaxisValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getXaxisValue" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getXaxisValue" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)(arg1)->getXaxisValue(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getYaxisValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getYaxisValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getYaxisValue" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getYaxisValue" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)(arg1)->getYaxisValue(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinContent__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getBinContent",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinContent" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinContent" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((IHistogram const *)arg1)->getBinContent(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< CumulativeValue > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getData" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (OutputData< CumulativeValue > *) &((IHistogram const *)arg1)->getData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_CumulativeValue_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< CumulativeValue > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getData" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (OutputData< CumulativeValue > *) &(arg1)->getData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_CumulativeValue_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IHistogram_getData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IHistogram_getData__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_getData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::getData() const\n"
+    "    IHistogram::getData()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinContent__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_getBinContent",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinContent" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinContent" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_getBinContent" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (double)((IHistogram const *)arg1)->getBinContent(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinContent(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IHistogram_getBinContent__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IHistogram_getBinContent__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_getBinContent'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::getBinContent(size_t) const\n"
+    "    IHistogram::getBinContent(size_t,size_t) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_setBinContent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_setBinContent",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_setBinContent" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_setBinContent" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_setBinContent" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setBinContent(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_addBinContent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_addBinContent",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_addBinContent" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_addBinContent" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_addBinContent" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->addBinContent(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getBinError",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinError" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinError" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((IHistogram const *)arg1)->getBinError(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_getBinError",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinError" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinError" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_getBinError" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (double)((IHistogram const *)arg1)->getBinError(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinError(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IHistogram_getBinError__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IHistogram_getBinError__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_getBinError'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::getBinError(size_t) const\n"
+    "    IHistogram::getBinError(size_t,size_t) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinAverage__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getBinAverage",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinAverage" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinAverage" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((IHistogram const *)arg1)->getBinAverage(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinAverage__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_getBinAverage",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinAverage" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinAverage" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_getBinAverage" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (double)((IHistogram const *)arg1)->getBinAverage(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinAverage(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IHistogram_getBinAverage__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IHistogram_getBinAverage__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_getBinAverage'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::getBinAverage(size_t) const\n"
+    "    IHistogram::getBinAverage(size_t,size_t) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinNumberOfEntries__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getBinNumberOfEntries",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinNumberOfEntries" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinNumberOfEntries" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (int)((IHistogram const *)arg1)->getBinNumberOfEntries(arg2);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinNumberOfEntries__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IHistogram_getBinNumberOfEntries",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getBinNumberOfEntries" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getBinNumberOfEntries" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IHistogram_getBinNumberOfEntries" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (int)((IHistogram const *)arg1)->getBinNumberOfEntries(arg2,arg3);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getBinNumberOfEntries(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IHistogram_getBinNumberOfEntries__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IHistogram_getBinNumberOfEntries__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_getBinNumberOfEntries'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::getBinNumberOfEntries(size_t) const\n"
+    "    IHistogram::getBinNumberOfEntries(size_t,size_t) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getMaximum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getMaximum",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getMaximum" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (double)((IHistogram const *)arg1)->getMaximum();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getMaximumBinIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getMaximumBinIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getMaximumBinIndex" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = ((IHistogram const *)arg1)->getMaximumBinIndex();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getMinimum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getMinimum",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getMinimum" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (double)((IHistogram const *)arg1)->getMinimum();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getMinimumBinIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getMinimumBinIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getMinimumBinIndex" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = ((IHistogram const *)arg1)->getMinimumBinIndex();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_scale",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_scale" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_scale" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->scale(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_integral(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_integral",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_integral" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (double)((IHistogram const *)arg1)->integral();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getArray__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  IHistogram::DataType arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_getArray",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getArray" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_getArray" "', argument " "2"" of type '" "IHistogram::DataType""'");
+  } 
+  arg2 = static_cast< IHistogram::DataType >(val2);
+  result = (PyObject *)((IHistogram const *)arg1)->getArray(arg2);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getArray__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_getArray",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_getArray" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (PyObject *)((IHistogram const *)arg1)->getArray();
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_getArray(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IHistogram_getArray__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IHistogram_getArray__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_getArray'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::getArray(IHistogram::DataType) const\n"
+    "    IHistogram::getArray() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_reset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_reset",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_reset" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  (arg1)->reset();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_createHistogram(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_createHistogram",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_createHistogram" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_createHistogram" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (IHistogram *)IHistogram::createHistogram((OutputData< double > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_createFrom__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_createFrom",&obj0)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_createFrom" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_createFrom" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (IHistogram *)IHistogram::createFrom((std::string const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_createFrom__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_createFrom",&obj0)) SWIG_fail;
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_createFrom" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_createFrom" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (IHistogram *)IHistogram::createFrom((std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_createFrom(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IHistogram_createFrom__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IHistogram_createFrom__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_createFrom'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::createFrom(std::string const &)\n"
+    "    IHistogram::createFrom(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_createOutputData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  IHistogram::DataType arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_createOutputData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_createOutputData" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IHistogram_createOutputData" "', argument " "2"" of type '" "IHistogram::DataType""'");
+  } 
+  arg2 = static_cast< IHistogram::DataType >(val2);
+  result = (OutputData< double > *)((IHistogram const *)arg1)->createOutputData(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_createOutputData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IHistogram_createOutputData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_createOutputData" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (OutputData< double > *)((IHistogram const *)arg1)->createOutputData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_createOutputData(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IHistogram_createOutputData__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IHistogram_createOutputData__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IHistogram_createOutputData'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IHistogram::createOutputData(IHistogram::DataType) const\n"
+    "    IHistogram::createOutputData() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_hasSameShape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  IHistogram *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_hasSameShape",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_hasSameShape" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IHistogram_hasSameShape" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_hasSameShape" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  arg2 = reinterpret_cast< IHistogram * >(argp2);
+  result = (bool)((IHistogram const *)arg1)->hasSameShape((IHistogram const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_hasSameDimensions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  IHistogram *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_hasSameDimensions",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_hasSameDimensions" "', argument " "1"" of type '" "IHistogram const *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IHistogram_hasSameDimensions" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_hasSameDimensions" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  arg2 = reinterpret_cast< IHistogram * >(argp2);
+  result = (bool)((IHistogram const *)arg1)->hasSameDimensions((IHistogram const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  IHistogram *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram___iadd__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram___iadd__" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IHistogram___iadd__" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram___iadd__" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  arg2 = reinterpret_cast< IHistogram * >(argp2);
+  result = (IHistogram *) &(arg1)->operator +=((IHistogram const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_relativeDifferenceHistogram(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  IHistogram *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_relativeDifferenceHistogram",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_relativeDifferenceHistogram" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IHistogram_relativeDifferenceHistogram" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_relativeDifferenceHistogram" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  arg2 = reinterpret_cast< IHistogram * >(argp2);
+  result = (IHistogram *)(arg1)->relativeDifferenceHistogram((IHistogram const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_save(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_save",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_save" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IHistogram_save" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_save" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->save((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IHistogram_load(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IHistogram_load",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IHistogram_load" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IHistogram_load" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IHistogram_load" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->load((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IHistogram_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IHistogram, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Histogram1D__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  double arg2 ;
+  double arg3 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_Histogram1D",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Histogram1D" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Histogram1D" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Histogram1D" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (Histogram1D *)new Histogram1D(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram1D__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Histogram1D",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Histogram1D" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Histogram1D" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram1D" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (Histogram1D *)new Histogram1D(arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram1D__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Histogram1D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Histogram1D" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram1D" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  result = (Histogram1D *)new Histogram1D((IAxis const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram1D__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Histogram1D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Histogram1D" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram1D" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (Histogram1D *)new Histogram1D((OutputData< double > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram1D(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAxis, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Histogram1D__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Histogram1D__SWIG_3(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_Histogram1D__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_Histogram1D__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Histogram1D'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Histogram1D::Histogram1D(int,double,double)\n"
+    "    Histogram1D::Histogram1D(int,std::vector< double,std::allocator< double > > const &)\n"
+    "    Histogram1D::Histogram1D(IAxis const &)\n"
+    "    Histogram1D::Histogram1D(OutputData< double > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_clone" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = (Histogram1D *)((Histogram1D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_getRank(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_getRank",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_getRank" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = ((Histogram1D const *)arg1)->getRank();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_fill__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Histogram1D_fill",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_fill" "', argument " "1"" of type '" "Histogram1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram1D_fill" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Histogram1D_fill" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (int)(arg1)->fill(arg2,arg3);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_fill__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Histogram1D_fill",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_fill" "', argument " "1"" of type '" "Histogram1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram1D_fill" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (int)(arg1)->fill(arg2);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_fill(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Histogram1D_fill__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram1D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Histogram1D_fill__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Histogram1D_fill'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Histogram1D::fill(double,double)\n"
+    "    Histogram1D::fill(double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_getBinCenters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_getBinCenters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_getBinCenters" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = ((Histogram1D const *)arg1)->getBinCenters();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_getBinValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_getBinValues",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_getBinValues" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = ((Histogram1D const *)arg1)->getBinValues();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_getBinErrors(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_getBinErrors",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_getBinErrors" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = ((Histogram1D const *)arg1)->getBinErrors();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_getBinCentersNumpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_getBinCentersNumpy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_getBinCentersNumpy" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = (PyObject *)((Histogram1D const *)arg1)->getBinCentersNumpy();
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_getBinValuesNumpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_getBinValuesNumpy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_getBinValuesNumpy" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = (PyObject *)((Histogram1D const *)arg1)->getBinValuesNumpy();
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_getBinErrorsNumpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_getBinErrorsNumpy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_getBinErrorsNumpy" "', argument " "1"" of type '" "Histogram1D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  result = (PyObject *)((Histogram1D const *)arg1)->getBinErrorsNumpy();
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_crop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Histogram1D_crop",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_crop" "', argument " "1"" of type '" "Histogram1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram1D_crop" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Histogram1D_crop" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (Histogram1D *)(arg1)->crop(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram1D_dynamicCast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram1D_dynamicCast",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram1D_dynamicCast" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (Histogram1D *)Histogram1D_dynamicCast(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Histogram1D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram1D *arg1 = (Histogram1D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Histogram1D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram1D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Histogram1D" "', argument " "1"" of type '" "Histogram1D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram1D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Histogram1D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Histogram1D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Histogram2D__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  double arg2 ;
+  double arg3 ;
+  int arg4 ;
+  double arg5 ;
+  double arg6 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  int val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:new_Histogram2D",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Histogram2D" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Histogram2D" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Histogram2D" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_int(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_Histogram2D" "', argument " "4"" of type '" "int""'");
+  } 
+  arg4 = static_cast< int >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_Histogram2D" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "new_Histogram2D" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  result = (Histogram2D *)new Histogram2D(arg1,arg2,arg3,arg4,arg5,arg6);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram2D__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  int arg3 ;
+  std::vector< double,std::allocator< double > > *arg4 = 0 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  int val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_Histogram2D",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Histogram2D" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Histogram2D" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram2D" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Histogram2D" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_Histogram2D" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram2D" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  result = (Histogram2D *)new Histogram2D(arg1,(std::vector< double,std::allocator< double > > const &)*arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram2D__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAxis *arg1 = 0 ;
+  IAxis *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Histogram2D",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Histogram2D" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram2D" "', argument " "1"" of type '" "IAxis const &""'"); 
+  }
+  arg1 = reinterpret_cast< IAxis * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Histogram2D" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram2D" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  result = (Histogram2D *)new Histogram2D((IAxis const &)*arg1,(IAxis const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram2D__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Histogram2D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Histogram2D" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram2D" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (Histogram2D *)new Histogram2D((OutputData< double > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram2D__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Histogram2D",&obj0)) SWIG_fail;
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Histogram2D" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Histogram2D" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (Histogram2D *)new Histogram2D((std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Histogram2D(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[7] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 6) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Histogram2D__SWIG_3(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Histogram2D__SWIG_4(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAxis, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_Histogram2D__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_new_Histogram2D__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 6) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_int(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              {
+                int res = SWIG_AsVal_double(argv[5], NULL);
+                _v = SWIG_CheckState(res);
+              }
+              if (_v) {
+                return _wrap_new_Histogram2D__SWIG_0(self, args);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Histogram2D'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Histogram2D::Histogram2D(int,double,double,int,double,double)\n"
+    "    Histogram2D::Histogram2D(int,std::vector< double,std::allocator< double > > const &,int,std::vector< double,std::allocator< double > > const &)\n"
+    "    Histogram2D::Histogram2D(IAxis const &,IAxis const &)\n"
+    "    Histogram2D::Histogram2D(OutputData< double > const &)\n"
+    "    Histogram2D::Histogram2D(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram2D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_clone" "', argument " "1"" of type '" "Histogram2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  result = (Histogram2D *)((Histogram2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_getRank(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram2D_getRank",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_getRank" "', argument " "1"" of type '" "Histogram2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  result = ((Histogram2D const *)arg1)->getRank();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_fill__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Histogram2D_fill",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_fill" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram2D_fill" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Histogram2D_fill" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Histogram2D_fill" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (int)(arg1)->fill(arg2,arg3,arg4);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_fill__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Histogram2D_fill",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_fill" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram2D_fill" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Histogram2D_fill" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (int)(arg1)->fill(arg2,arg3);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_fill(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Histogram2D_fill__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_Histogram2D_fill__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Histogram2D_fill'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Histogram2D::fill(double,double,double)\n"
+    "    Histogram2D::fill(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionX__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram2D_projectionX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_projectionX" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  result = (Histogram1D *)(arg1)->projectionX();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionX__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Histogram2D_projectionX",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_projectionX" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram2D_projectionX" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (Histogram1D *)(arg1)->projectionX(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionX__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Histogram2D_projectionX",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_projectionX" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram2D_projectionX" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Histogram2D_projectionX" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (Histogram1D *)(arg1)->projectionX(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionX(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Histogram2D_projectionX__SWIG_0(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Histogram2D_projectionX__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Histogram2D_projectionX__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Histogram2D_projectionX'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Histogram2D::projectionX()\n"
+    "    Histogram2D::projectionX(double)\n"
+    "    Histogram2D::projectionX(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionY__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram2D_projectionY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_projectionY" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  result = (Histogram1D *)(arg1)->projectionY();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionY__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Histogram2D_projectionY",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_projectionY" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram2D_projectionY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (Histogram1D *)(arg1)->projectionY(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionY__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Histogram1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Histogram2D_projectionY",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_projectionY" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram2D_projectionY" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Histogram2D_projectionY" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (Histogram1D *)(arg1)->projectionY(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_projectionY(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Histogram2D_projectionY__SWIG_0(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Histogram2D_projectionY__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Histogram2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Histogram2D_projectionY__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Histogram2D_projectionY'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Histogram2D::projectionY()\n"
+    "    Histogram2D::projectionY(double)\n"
+    "    Histogram2D::projectionY(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_crop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:Histogram2D_crop",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_crop" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Histogram2D_crop" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Histogram2D_crop" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Histogram2D_crop" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "Histogram2D_crop" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (Histogram2D *)(arg1)->crop(arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_setContent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Histogram2D_setContent",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_setContent" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Histogram2D_setContent" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Histogram2D_setContent" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setContent((std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_addContent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Histogram2D_addContent",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_addContent" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Histogram2D_addContent" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Histogram2D_addContent" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->addContent((std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Histogram2D_dynamicCast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = (IHistogram *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Histogram2D_dynamicCast",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IHistogram, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Histogram2D_dynamicCast" "', argument " "1"" of type '" "IHistogram *""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  result = (Histogram2D *)Histogram2D_dynamicCast(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Histogram2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Histogram2D *arg1 = (Histogram2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Histogram2D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Histogram2D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Histogram2D" "', argument " "1"" of type '" "Histogram2D *""'"); 
+  }
+  arg1 = reinterpret_cast< Histogram2D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Histogram2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Histogram2D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = (IMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMaterial, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IMaterial" "', argument " "1"" of type '" "IMaterial *""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMaterial_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = (IMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMaterial_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMaterial_clone" "', argument " "1"" of type '" "IMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  result = (IMaterial *)((IMaterial const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMaterial_isScalarMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = (IMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMaterial_isScalarMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMaterial_isScalarMaterial" "', argument " "1"" of type '" "IMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  result = (bool)((IMaterial const *)arg1)->isScalarMaterial();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMaterial_isMagneticMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = (IMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMaterial_isMagneticMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMaterial_isMagneticMaterial" "', argument " "1"" of type '" "IMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  result = (bool)((IMaterial const *)arg1)->isMagneticMaterial();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMaterial_getRefractiveIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = (IMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMaterial_getRefractiveIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMaterial_getRefractiveIndex" "', argument " "1"" of type '" "IMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  result = ((IMaterial const *)arg1)->getRefractiveIndex();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMaterial_createTransformedMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = (IMaterial *) 0 ;
+  Transform3D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMaterial_createTransformedMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMaterial_createTransformedMaterial" "', argument " "1"" of type '" "IMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMaterial_createTransformedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMaterial_createTransformedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Transform3D * >(argp2);
+  result = (IMaterial *)((IMaterial const *)arg1)->createTransformedMaterial((Transform3D const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMaterial___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = (IMaterial *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMaterial___eq__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMaterial___eq__" "', argument " "1"" of type '" "IMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMaterial___eq__" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMaterial___eq__" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  result = (bool)((IMaterial const *)arg1)->operator ==((IMaterial const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IMaterial_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IMaterial, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_HomogeneousMaterial__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  complex_t arg2 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  HomogeneousMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_HomogeneousMaterial",&obj0,&obj1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_HomogeneousMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_HomogeneousMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_HomogeneousMaterial" "', argument " "2"" of type '" "complex_t""'");
+  } 
+  arg2 = static_cast< complex_t >(val2);
+  result = (HomogeneousMaterial *)new HomogeneousMaterial((std::string const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HomogeneousMaterial, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_HomogeneousMaterial__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  double arg3 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  HomogeneousMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_HomogeneousMaterial",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_HomogeneousMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_HomogeneousMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_HomogeneousMaterial" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_HomogeneousMaterial" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (HomogeneousMaterial *)new HomogeneousMaterial((std::string const &)*arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HomogeneousMaterial, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_HomogeneousMaterial(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_HomogeneousMaterial__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_HomogeneousMaterial__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_HomogeneousMaterial'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    HomogeneousMaterial::HomogeneousMaterial(std::string const &,complex_t const)\n"
+    "    HomogeneousMaterial::HomogeneousMaterial(std::string const &,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_HomogeneousMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMaterial *arg1 = (HomogeneousMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_HomogeneousMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMaterial, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_HomogeneousMaterial" "', argument " "1"" of type '" "HomogeneousMaterial *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMaterial * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMaterial_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMaterial *arg1 = (HomogeneousMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  HomogeneousMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:HomogeneousMaterial_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMaterial_clone" "', argument " "1"" of type '" "HomogeneousMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMaterial * >(argp1);
+  result = (HomogeneousMaterial *)((HomogeneousMaterial const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HomogeneousMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMaterial_getRefractiveIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMaterial *arg1 = (HomogeneousMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:HomogeneousMaterial_getRefractiveIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMaterial_getRefractiveIndex" "', argument " "1"" of type '" "HomogeneousMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMaterial * >(argp1);
+  result = ((HomogeneousMaterial const *)arg1)->getRefractiveIndex();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMaterial_setRefractiveIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMaterial *arg1 = (HomogeneousMaterial *) 0 ;
+  complex_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:HomogeneousMaterial_setRefractiveIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMaterial_setRefractiveIndex" "', argument " "1"" of type '" "HomogeneousMaterial *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMaterial * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "HomogeneousMaterial_setRefractiveIndex" "', argument " "2"" of type '" "complex_t""'");
+  } 
+  arg2 = static_cast< complex_t >(val2);
+  (arg1)->setRefractiveIndex(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMaterial_createTransformedMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMaterial *arg1 = (HomogeneousMaterial *) 0 ;
+  Transform3D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:HomogeneousMaterial_createTransformedMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMaterial_createTransformedMaterial" "', argument " "1"" of type '" "HomogeneousMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMaterial * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "HomogeneousMaterial_createTransformedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "HomogeneousMaterial_createTransformedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Transform3D * >(argp2);
+  result = (IMaterial *)((HomogeneousMaterial const *)arg1)->createTransformedMaterial((Transform3D const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *HomogeneousMaterial_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_HomogeneousMaterial, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_HomogeneousMagneticMaterial__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  complex_t arg2 ;
+  kvector_t arg3 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  HomogeneousMagneticMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_HomogeneousMagneticMaterial",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_HomogeneousMagneticMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_HomogeneousMagneticMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_HomogeneousMagneticMaterial" "', argument " "2"" of type '" "complex_t""'");
+  } 
+  arg2 = static_cast< complex_t >(val2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_HomogeneousMagneticMaterial" "', argument " "3"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_HomogeneousMagneticMaterial" "', argument " "3"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (HomogeneousMagneticMaterial *)new HomogeneousMagneticMaterial((std::string const &)*arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HomogeneousMagneticMaterial, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_HomogeneousMagneticMaterial__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  double arg3 ;
+  kvector_t arg4 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  HomogeneousMagneticMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_HomogeneousMagneticMaterial",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_HomogeneousMagneticMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_HomogeneousMagneticMaterial" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_HomogeneousMagneticMaterial" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_HomogeneousMagneticMaterial" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  {
+    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_HomogeneousMagneticMaterial" "', argument " "4"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp4) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_HomogeneousMagneticMaterial" "', argument " "4"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp4);
+      arg4 = *temp;
+      if (SWIG_IsNewObj(res4)) delete temp;
+    }
+  }
+  result = (HomogeneousMagneticMaterial *)new HomogeneousMagneticMaterial((std::string const &)*arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HomogeneousMagneticMaterial, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_HomogeneousMagneticMaterial(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_HomogeneousMagneticMaterial__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_new_HomogeneousMagneticMaterial__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_HomogeneousMagneticMaterial'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(std::string const &,complex_t const,kvector_t const)\n"
+    "    HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(std::string const &,double,double,kvector_t const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMagneticMaterial_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMagneticMaterial *arg1 = (HomogeneousMagneticMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  HomogeneousMagneticMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:HomogeneousMagneticMaterial_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMagneticMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMagneticMaterial_clone" "', argument " "1"" of type '" "HomogeneousMagneticMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMagneticMaterial * >(argp1);
+  result = (HomogeneousMagneticMaterial *)((HomogeneousMagneticMaterial const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HomogeneousMagneticMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMagneticMaterial_getMagneticField(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMagneticMaterial *arg1 = (HomogeneousMagneticMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:HomogeneousMagneticMaterial_getMagneticField",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMagneticMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMagneticMaterial_getMagneticField" "', argument " "1"" of type '" "HomogeneousMagneticMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMagneticMaterial * >(argp1);
+  result = ((HomogeneousMagneticMaterial const *)arg1)->getMagneticField();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMagneticMaterial_setMagneticField(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMagneticMaterial *arg1 = (HomogeneousMagneticMaterial *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:HomogeneousMagneticMaterial_setMagneticField",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMagneticMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMagneticMaterial_setMagneticField" "', argument " "1"" of type '" "HomogeneousMagneticMaterial *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMagneticMaterial * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "HomogeneousMagneticMaterial_setMagneticField" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "HomogeneousMagneticMaterial_setMagneticField" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->setMagneticField(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMagneticMaterial_isScalarMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMagneticMaterial *arg1 = (HomogeneousMagneticMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:HomogeneousMagneticMaterial_isScalarMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMagneticMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMagneticMaterial_isScalarMaterial" "', argument " "1"" of type '" "HomogeneousMagneticMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMagneticMaterial * >(argp1);
+  result = (bool)((HomogeneousMagneticMaterial const *)arg1)->isScalarMaterial();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HomogeneousMagneticMaterial_createTransformedMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMagneticMaterial *arg1 = (HomogeneousMagneticMaterial *) 0 ;
+  Transform3D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:HomogeneousMagneticMaterial_createTransformedMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMagneticMaterial, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HomogeneousMagneticMaterial_createTransformedMaterial" "', argument " "1"" of type '" "HomogeneousMagneticMaterial const *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMagneticMaterial * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "HomogeneousMagneticMaterial_createTransformedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "HomogeneousMagneticMaterial_createTransformedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Transform3D * >(argp2);
+  result = (IMaterial *)((HomogeneousMagneticMaterial const *)arg1)->createTransformedMaterial((Transform3D const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_HomogeneousMagneticMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  HomogeneousMagneticMaterial *arg1 = (HomogeneousMagneticMaterial *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_HomogeneousMagneticMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_HomogeneousMagneticMaterial, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_HomogeneousMagneticMaterial" "', argument " "1"" of type '" "HomogeneousMagneticMaterial *""'"); 
+  }
+  arg1 = reinterpret_cast< HomogeneousMagneticMaterial * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *HomogeneousMagneticMaterial_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_HomogeneousMagneticMaterial, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IDetector2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetector2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_clone" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = (IDetector2D *)((IDetector2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IDetector2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IDetector2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IDetector2D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IDetector2D" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  Beam *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_init",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_init" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Beam,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_init" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_init" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  arg2 = reinterpret_cast< Beam * >(argp2);
+  (arg1)->init((Beam const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_addAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  IAxis *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_addAxis",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_addAxis" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_addAxis" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_addAxis" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  (arg1)->addAxis((IAxis const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_getAxis",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getAxis" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDetector2D_getAxis" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IAxis *) &((IDetector2D const *)arg1)->getAxis(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getDimension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_getDimension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getDimension" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = ((IDetector2D const *)arg1)->getDimension();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_clear" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_setDetectorParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  size_t arg5 ;
+  double arg6 ;
+  double arg7 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  size_t val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  double val7 ;
+  int ecode7 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  PyObject * obj6 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:IDetector2D_setDetectorParameters",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_setDetectorParameters" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDetector2D_setDetectorParameters" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDetector2D_setDetectorParameters" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IDetector2D_setDetectorParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_size_t(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "IDetector2D_setDetectorParameters" "', argument " "5"" of type '" "size_t""'");
+  } 
+  arg5 = static_cast< size_t >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "IDetector2D_setDetectorParameters" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  ecode7 = SWIG_AsVal_double(obj6, &val7);
+  if (!SWIG_IsOK(ecode7)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "IDetector2D_setDetectorParameters" "', argument " "7"" of type '" "double""'");
+  } 
+  arg7 = static_cast< double >(val7);
+  (arg1)->setDetectorParameters(arg2,arg3,arg4,arg5,arg6,arg7);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_setDetectorAxes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  IAxis *arg2 = 0 ;
+  IAxis *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IDetector2D_setDetectorAxes",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_setDetectorAxes" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_setDetectorAxes" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_setDetectorAxes" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IDetector2D_setDetectorAxes" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_setDetectorAxes" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  arg3 = reinterpret_cast< IAxis * >(argp3);
+  (arg1)->setDetectorAxes((IAxis const &)*arg2,(IAxis const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_setDetectorResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  IDetectorResolution *arg2 = (IDetectorResolution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_setDetectorResolution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_setDetectorResolution" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IDetectorResolution, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_setDetectorResolution" "', argument " "2"" of type '" "IDetectorResolution *""'"); 
+  }
+  arg2 = reinterpret_cast< IDetectorResolution * >(argp2);
+  (arg1)->setDetectorResolution(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_applyDetectorResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  OutputData< double > *arg2 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_applyDetectorResolution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_applyDetectorResolution" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_applyDetectorResolution" "', argument " "2"" of type '" "OutputData< double > *""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((IDetector2D const *)arg1)->applyDetectorResolution(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getDetectorResolutionFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetectorResolution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_getDetectorResolutionFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getDetectorResolutionFunction" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = (IDetectorResolution *)((IDetector2D const *)arg1)->getDetectorResolutionFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IDetectorResolution, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_setAnalyzerProperties(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IDetector2D_setAnalyzerProperties",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_setAnalyzerProperties" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_setAnalyzerProperties" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_setAnalyzerProperties" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDetector2D_setAnalyzerProperties" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IDetector2D_setAnalyzerProperties" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setAnalyzerProperties(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_removeMasks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_removeMasks",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_removeMasks" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  (arg1)->removeMasks();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_addMask__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  Geometry::IShape2D *arg2 = 0 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  bool val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IDetector2D_addMask",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_addMask" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Geometry__IShape2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Geometry::IShape2D * >(argp2);
+  ecode3 = SWIG_AsVal_bool(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDetector2D_addMask" "', argument " "3"" of type '" "bool""'");
+  } 
+  arg3 = static_cast< bool >(val3);
+  (arg1)->addMask((Geometry::IShape2D const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_addMask__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  Geometry::IShape2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_addMask",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_addMask" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Geometry__IShape2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_addMask" "', argument " "2"" of type '" "Geometry::IShape2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Geometry::IShape2D * >(argp2);
+  (arg1)->addMask((Geometry::IShape2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_addMask(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDetector2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Geometry__IShape2D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IDetector2D_addMask__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDetector2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Geometry__IShape2D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_bool(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IDetector2D_addMask__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IDetector2D_addMask'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IDetector2D::addMask(Geometry::IShape2D const &,bool)\n"
+    "    IDetector2D::addMask(Geometry::IShape2D const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_maskAll(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_maskAll",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_maskAll" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  (arg1)->maskAll();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getDetectorMask(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DetectorMask *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_getDetectorMask",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getDetectorMask" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = (DetectorMask *)((IDetector2D const *)arg1)->getDetectorMask();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DetectorMask, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_numberOfMaskedChannels(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_numberOfMaskedChannels",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_numberOfMaskedChannels" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = ((IDetector2D const *)arg1)->numberOfMaskedChannels();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_isMasked(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_isMasked",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_isMasked" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDetector2D_isMasked" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (bool)((IDetector2D const *)arg1)->isMasked(arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_hasMasks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_hasMasks",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_hasMasks" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = (bool)((IDetector2D const *)arg1)->hasMasks();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_createDetectorIntensity__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  std::vector< SimulationElement,std::allocator< SimulationElement > > *arg2 = 0 ;
+  Beam *arg3 = 0 ;
+  IDetector2D::EAxesUnits arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  int val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IDetector2D_createDetectorIntensity",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_createDetectorIntensity" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< SimulationElement,std::allocator< SimulationElement > > * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Beam,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IDetector2D_createDetectorIntensity" "', argument " "3"" of type '" "Beam const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_createDetectorIntensity" "', argument " "3"" of type '" "Beam const &""'"); 
+  }
+  arg3 = reinterpret_cast< Beam * >(argp3);
+  ecode4 = SWIG_AsVal_int(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IDetector2D_createDetectorIntensity" "', argument " "4"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg4 = static_cast< IDetector2D::EAxesUnits >(val4);
+  result = (OutputData< double > *)((IDetector2D const *)arg1)->createDetectorIntensity((std::vector< SimulationElement,std::allocator< SimulationElement > > const &)*arg2,(Beam const &)*arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_createDetectorIntensity__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  std::vector< SimulationElement,std::allocator< SimulationElement > > *arg2 = 0 ;
+  Beam *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IDetector2D_createDetectorIntensity",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_createDetectorIntensity" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< SimulationElement,std::allocator< SimulationElement > > * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Beam,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IDetector2D_createDetectorIntensity" "', argument " "3"" of type '" "Beam const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_createDetectorIntensity" "', argument " "3"" of type '" "Beam const &""'"); 
+  }
+  arg3 = reinterpret_cast< Beam * >(argp3);
+  result = (OutputData< double > *)((IDetector2D const *)arg1)->createDetectorIntensity((std::vector< SimulationElement,std::allocator< SimulationElement > > const &)*arg2,(Beam const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_createDetectorIntensity(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDetector2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Beam, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_IDetector2D_createDetectorIntensity__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IDetector2D, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Beam, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_int(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_IDetector2D_createDetectorIntensity__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IDetector2D_createDetectorIntensity'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IDetector2D::createDetectorIntensity(std::vector< SimulationElement,std::allocator< SimulationElement > > const &,Beam const &,IDetector2D::EAxesUnits) const\n"
+    "    IDetector2D::createDetectorIntensity(std::vector< SimulationElement,std::allocator< SimulationElement > > const &,Beam const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_createDetectorMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  Beam *arg2 = 0 ;
+  IDetector2D::EAxesUnits arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IDetector2D_createDetectorMap",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_createDetectorMap" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Beam,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_createDetectorMap" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_createDetectorMap" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  arg2 = reinterpret_cast< Beam * >(argp2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDetector2D_createDetectorMap" "', argument " "3"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg3 = static_cast< IDetector2D::EAxesUnits >(val3);
+  result = (OutputData< double > *)((IDetector2D const *)arg1)->createDetectorMap((Beam const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_initOutputData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetector2D_initOutputData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_initOutputData" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetector2D_initOutputData" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IDetector2D_initOutputData" "', argument " "2"" of type '" "OutputData< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((IDetector2D const *)arg1)->initOutputData(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getValidAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< enum IDetector2D::EAxesUnits,std::allocator< enum IDetector2D::EAxesUnits > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_getValidAxesUnits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getValidAxesUnits" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = ((IDetector2D const *)arg1)->getValidAxesUnits();
+  resultobj = SWIG_NewPointerObj((new std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >(static_cast< const std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >& >(result))), SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getDefaultAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetector2D::EAxesUnits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_getDefaultAxesUnits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getDefaultAxesUnits" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = (IDetector2D::EAxesUnits)((IDetector2D const *)arg1)->getDefaultAxesUnits();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_regionOfInterest(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RegionOfInterest *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_regionOfInterest",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_regionOfInterest" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = (RegionOfInterest *)((IDetector2D const *)arg1)->regionOfInterest();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RegionOfInterest, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_setRegionOfInterest(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:IDetector2D_setRegionOfInterest",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_setRegionOfInterest" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDetector2D_setRegionOfInterest" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDetector2D_setRegionOfInterest" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IDetector2D_setRegionOfInterest" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "IDetector2D_setRegionOfInterest" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  (arg1)->setRegionOfInterest(arg2,arg3,arg4,arg5);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_resetRegionOfInterest(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_resetRegionOfInterest",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_resetRegionOfInterest" "', argument " "1"" of type '" "IDetector2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  (arg1)->resetRegionOfInterest();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getTotalSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_getTotalSize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getTotalSize" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = ((IDetector2D const *)arg1)->getTotalSize();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_getAxisBinIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IDetector2D_getAxisBinIndex",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_getAxisBinIndex" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IDetector2D_getAxisBinIndex" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IDetector2D_getAxisBinIndex" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = ((IDetector2D const *)arg1)->getAxisBinIndex(arg2,arg3);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetector2D_numberOfSimulationElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetector2D *arg1 = (IDetector2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetector2D_numberOfSimulationElements",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetector2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetector2D_numberOfSimulationElements" "', argument " "1"" of type '" "IDetector2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetector2D * >(argp1);
+  result = ((IDetector2D const *)arg1)->numberOfSimulationElements();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IDetector2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IDetector2D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IDetectorResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetectorResolution *arg1 = (IDetectorResolution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IDetectorResolution",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetectorResolution, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IDetectorResolution" "', argument " "1"" of type '" "IDetectorResolution *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetectorResolution * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetectorResolution_applyDetectorResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetectorResolution *arg1 = (IDetectorResolution *) 0 ;
+  OutputData< double > *arg2 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IDetectorResolution_applyDetectorResolution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetectorResolution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetectorResolution_applyDetectorResolution" "', argument " "1"" of type '" "IDetectorResolution const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetectorResolution * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IDetectorResolution_applyDetectorResolution" "', argument " "2"" of type '" "OutputData< double > *""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((IDetectorResolution const *)arg1)->applyDetectorResolution(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IDetectorResolution_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IDetectorResolution *arg1 = (IDetectorResolution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetectorResolution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IDetectorResolution_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IDetectorResolution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IDetectorResolution_clone" "', argument " "1"" of type '" "IDetectorResolution const *""'"); 
+  }
+  arg1 = reinterpret_cast< IDetectorResolution * >(argp1);
+  result = (IDetectorResolution *)((IDetectorResolution const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IDetectorResolution, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IDetectorResolution_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IDetectorResolution, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IInterferenceFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IInterferenceFunction" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IInterferenceFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IInterferenceFunction_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_clone" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  result = (IInterferenceFunction *)((IInterferenceFunction const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IInterferenceFunction_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_accept" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((IInterferenceFunction const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IInterferenceFunction_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_evaluate" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_getKappa(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IInterferenceFunction_getKappa",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_getKappa" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  result = (double)((IInterferenceFunction const *)arg1)->getKappa();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IInterferenceFunction_getParticleDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IInterferenceFunction_getParticleDensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_getParticleDensity" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
+  }
+  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
+  result = (double)((IInterferenceFunction const *)arg1)->getParticleDensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IInterferenceFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IInterferenceFunction, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_ILayout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ILayout",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ILayout" "', argument " "1"" of type '" "ILayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ILayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_clone" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = (ILayout *)((ILayout const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ILayout, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ILayout_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_accept" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ILayout_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((ILayout const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ILayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_cloneInvertB" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = (ILayout *)((ILayout const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ILayout, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getNumberOfParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_getNumberOfParticles",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getNumberOfParticles" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = ((ILayout const *)arg1)->getNumberOfParticles();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IAbstractParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ILayout_getParticle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getParticle" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ILayout_getParticle" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IAbstractParticle *)((ILayout const *)arg1)->getParticle(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< SafePointerVector< IParticle const > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_getParticles",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getParticles" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = ((ILayout const *)arg1)->getParticles();
+  resultobj = SWIG_NewPointerObj((new SafePointerVector< IParticle const >(static_cast< const SafePointerVector< IParticle const >& >(result))), SWIGTYPE_p_SafePointerVectorT_IParticle_const_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getAbundanceOfParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ILayout_getAbundanceOfParticle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getAbundanceOfParticle" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ILayout_getAbundanceOfParticle" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((ILayout const *)arg1)->getAbundanceOfParticle(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getTotalAbundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_getTotalAbundance",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getTotalAbundance" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = (double)((ILayout const *)arg1)->getTotalAbundance();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IInterferenceFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_getInterferenceFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getInterferenceFunction" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = (IInterferenceFunction *)((ILayout const *)arg1)->getInterferenceFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_cloneInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IInterferenceFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_cloneInterferenceFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_cloneInterferenceFunction" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = (IInterferenceFunction *)((ILayout const *)arg1)->cloneInterferenceFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getTotalParticleSurfaceDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_getTotalParticleSurfaceDensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getTotalParticleSurfaceDensity" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = (double)((ILayout const *)arg1)->getTotalParticleSurfaceDensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_setTotalParticleSurfaceDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ILayout_setTotalParticleSurfaceDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_setTotalParticleSurfaceDensity" "', argument " "1"" of type '" "ILayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ILayout_setTotalParticleSurfaceDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setTotalParticleSurfaceDensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_getApproximation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ILayout::EInterferenceApproximation result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ILayout_getApproximation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_getApproximation" "', argument " "1"" of type '" "ILayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  result = (ILayout::EInterferenceApproximation)((ILayout const *)arg1)->getApproximation();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ILayout_setApproximation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ILayout *arg1 = (ILayout *) 0 ;
+  ILayout::EInterferenceApproximation arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ILayout_setApproximation",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ILayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ILayout_setApproximation" "', argument " "1"" of type '" "ILayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ILayout * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ILayout_setApproximation" "', argument " "2"" of type '" "ILayout::EInterferenceApproximation""'");
+  } 
+  arg2 = static_cast< ILayout::EInterferenceApproximation >(val2);
+  (arg1)->setApproximation(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ILayout_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ILayout, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IAbstractParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IAbstractParticle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IAbstractParticle" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAbstractParticle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IAbstractParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_clone" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  result = (IAbstractParticle *)((IAbstractParticle const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAbstractParticle_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IAbstractParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_cloneInvertB" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  result = (IAbstractParticle *)((IAbstractParticle const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAbstractParticle_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAbstractParticle_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_accept" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAbstractParticle_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((IAbstractParticle const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAbstractParticle_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAbstractParticle_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_setAmbientMaterial" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IAbstractParticle_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IAbstractParticle_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAbstractParticle_getAbundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_getAbundance",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_getAbundance" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  result = (double)((IAbstractParticle const *)arg1)->getAbundance();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAbstractParticle_setAbundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IAbstractParticle_setAbundance",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_setAbundance" "', argument " "1"" of type '" "IAbstractParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IAbstractParticle_setAbundance" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setAbundance(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IAbstractParticle_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = (IAbstractParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IAbstractParticle_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IAbstractParticle_getAmbientMaterial" "', argument " "1"" of type '" "IAbstractParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  result = (IMaterial *)((IAbstractParticle const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IAbstractParticle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IAbstractParticle, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IParameterReal_clone__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IParameter< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParameterReal_clone",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterReal_clone" "', argument " "1"" of type '" "IParameter< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterReal_clone" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterReal_clone" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (IParameter< double > *)((IParameter< double > const *)arg1)->clone((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterReal_clone__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IParameter< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParameterReal_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterReal_clone" "', argument " "1"" of type '" "IParameter< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  result = (IParameter< double > *)((IParameter< double > const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterReal_clone(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IParameterT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IParameterReal_clone__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IParameterT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IParameterReal_clone__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IParameterReal_clone'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IParameter< double >::clone(std::string const &) const\n"
+    "    IParameter< double >::clone() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterReal_isNull(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParameterReal_isNull",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterReal_isNull" "', argument " "1"" of type '" "IParameter< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  result = (bool)((IParameter< double > const *)arg1)->isNull();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterReal_getData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParameterReal_getData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterReal_getData" "', argument " "1"" of type '" "IParameter< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  result = (double *) &((IParameter< double > const *)arg1)->getData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterReal_setData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  double *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParameterReal_setData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterReal_setData" "', argument " "1"" of type '" "IParameter< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterReal_setData" "', argument " "2"" of type '" "double volatile &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterReal_setData" "', argument " "2"" of type '" "double volatile &""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  (arg1)->setData((double volatile &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterReal___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  IParameter< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParameterReal___eq__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterReal___eq__" "', argument " "1"" of type '" "IParameter< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParameterT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterReal___eq__" "', argument " "2"" of type '" "IParameter< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterReal___eq__" "', argument " "2"" of type '" "IParameter< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParameter< double > * >(argp2);
+  result = (bool)((IParameter< double > const *)arg1)->operator ==((IParameter< double > const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParameterReal___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  IParameter< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParameterReal___ne__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParameterReal___ne__" "', argument " "1"" of type '" "IParameter< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParameterT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParameterReal___ne__" "', argument " "2"" of type '" "IParameter< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParameterReal___ne__" "', argument " "2"" of type '" "IParameter< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParameter< double > * >(argp2);
+  result = (bool)((IParameter< double > const *)arg1)->operator !=((IParameter< double > const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IParameterReal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParameter< double > *arg1 = (IParameter< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IParameterReal",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParameterT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IParameterReal" "', argument " "1"" of type '" "IParameter< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< IParameter< double > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IParameterReal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IParameterT_double_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IParticle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IParticle" "', argument " "1"" of type '" "IParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParticle_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_clone" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = (IParticle *)((IParticle const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParticle_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_cloneInvertB" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = (IParticle *)((IParticle const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParticle_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_accept" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParticle_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((IParticle const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_createFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParticle_createFormFactor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_createFormFactor" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = (IFormFactor *)((IParticle const *)arg1)->createFormFactor();
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_createTransformedFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  IRotation *arg2 = (IRotation *) 0 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Swig::Director *director = 0;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IParticle_createTransformedFormFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_createTransformedFormFactor" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParticle_createTransformedFormFactor" "', argument " "2"" of type '" "IRotation const *""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IParticle_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParticle_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (IFormFactor *)((IParticle const *)arg1)->createTransformedFormFactor((IRotation const *)arg2,arg3);
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_getPosition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParticle_getPosition",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_getPosition" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = ((IParticle const *)arg1)->getPosition();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_setPosition__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParticle_setPosition",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_setPosition" "', argument " "1"" of type '" "IParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParticle_setPosition" "', argument " "2"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParticle_setPosition" "', argument " "2"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->setPosition(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_setPosition__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IParticle_setPosition",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_setPosition" "', argument " "1"" of type '" "IParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IParticle_setPosition" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IParticle_setPosition" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IParticle_setPosition" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setPosition(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_setPosition(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IParticle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IParticle_setPosition__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IParticle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_IParticle_setPosition__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IParticle_setPosition'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IParticle::setPosition(kvector_t)\n"
+    "    IParticle::setPosition(double,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_getRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IRotation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IParticle_getRotation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_getRotation" "', argument " "1"" of type '" "IParticle const *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = (IRotation *)((IParticle const *)arg1)->getRotation();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_setRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  IRotation *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParticle_setRotation",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_setRotation" "', argument " "1"" of type '" "IParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IRotation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParticle_setRotation" "', argument " "2"" of type '" "IRotation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParticle_setRotation" "', argument " "2"" of type '" "IRotation const &""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  (arg1)->setRotation((IRotation const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_applyRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  IRotation *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParticle_applyRotation",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_applyRotation" "', argument " "1"" of type '" "IParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IRotation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParticle_applyRotation" "', argument " "2"" of type '" "IRotation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParticle_applyRotation" "', argument " "2"" of type '" "IRotation const &""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  (arg1)->applyRotation((IRotation const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IParticle_applyTranslation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = (IParticle *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IParticle_applyTranslation",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IParticle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IParticle_applyTranslation" "', argument " "1"" of type '" "IParticle *""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IParticle_applyTranslation" "', argument " "2"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IParticle_applyTranslation" "', argument " "2"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->applyTranslation(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IParticle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IParticle, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IResolutionFunction2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IResolutionFunction2D *arg1 = (IResolutionFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IResolutionFunction2D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IResolutionFunction2D, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IResolutionFunction2D" "', argument " "1"" of type '" "IResolutionFunction2D *""'"); 
+  }
+  arg1 = reinterpret_cast< IResolutionFunction2D * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IResolutionFunction2D_evaluateCDF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IResolutionFunction2D *arg1 = (IResolutionFunction2D *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IResolutionFunction2D_evaluateCDF",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IResolutionFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IResolutionFunction2D_evaluateCDF" "', argument " "1"" of type '" "IResolutionFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IResolutionFunction2D * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IResolutionFunction2D_evaluateCDF" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IResolutionFunction2D_evaluateCDF" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((IResolutionFunction2D const *)arg1)->evaluateCDF(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IResolutionFunction2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IResolutionFunction2D *arg1 = (IResolutionFunction2D *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IResolutionFunction2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IResolutionFunction2D_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IResolutionFunction2D, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IResolutionFunction2D_clone" "', argument " "1"" of type '" "IResolutionFunction2D const *""'"); 
+  }
+  arg1 = reinterpret_cast< IResolutionFunction2D * >(argp1);
+  result = (IResolutionFunction2D *)((IResolutionFunction2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IResolutionFunction2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IResolutionFunction2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IResolutionFunction2D, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IRotation_createRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Transform3D *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IRotation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IRotation_createRotation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Transform3D,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_createRotation" "', argument " "1"" of type '" "Transform3D const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IRotation_createRotation" "', argument " "1"" of type '" "Transform3D const &""'"); 
+  }
+  arg1 = reinterpret_cast< Transform3D * >(argp1);
+  result = (IRotation *)IRotation::createRotation((Transform3D const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = (IRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IRotation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRotation, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IRotation" "', argument " "1"" of type '" "IRotation *""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IRotation_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = (IRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IRotation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IRotation_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_clone" "', argument " "1"" of type '" "IRotation const *""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  result = (IRotation *)((IRotation const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IRotation_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = (IRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IRotation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IRotation_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_cloneInvertB" "', argument " "1"" of type '" "IRotation const *""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  result = (IRotation *)((IRotation const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IRotation_createInverse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = (IRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IRotation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IRotation_createInverse",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_createInverse" "', argument " "1"" of type '" "IRotation const *""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  result = (IRotation *)((IRotation const *)arg1)->createInverse();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IRotation_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = (IRotation *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IRotation_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_accept" "', argument " "1"" of type '" "IRotation const *""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IRotation_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((IRotation const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IRotation_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = (IRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Transform3D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IRotation_getTransform3D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_getTransform3D" "', argument " "1"" of type '" "IRotation const *""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  result = ((IRotation const *)arg1)->getTransform3D();
+  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IRotation_isIdentity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = (IRotation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IRotation_isIdentity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_isIdentity" "', argument " "1"" of type '" "IRotation const *""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  result = (bool)((IRotation const *)arg1)->isIdentity();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IRotation_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IRotation, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_CreateProduct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRotation *arg1 = 0 ;
+  IRotation *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IRotation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:CreateProduct",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IRotation,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CreateProduct" "', argument " "1"" of type '" "IRotation const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateProduct" "', argument " "1"" of type '" "IRotation const &""'"); 
+  }
+  arg1 = reinterpret_cast< IRotation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IRotation,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CreateProduct" "', argument " "2"" of type '" "IRotation const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CreateProduct" "', argument " "2"" of type '" "IRotation const &""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  result = (IRotation *)CreateProduct((IRotation const &)*arg1,(IRotation const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RotationX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationX *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_RotationX",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_RotationX" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (RotationX *)new RotationX(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationX, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationX_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationX *arg1 = (RotationX *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationX *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationX_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationX, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationX_clone" "', argument " "1"" of type '" "RotationX const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationX * >(argp1);
+  result = (RotationX *)((RotationX const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationX, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationX_createInverse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationX *arg1 = (RotationX *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationX *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationX_createInverse",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationX, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationX_createInverse" "', argument " "1"" of type '" "RotationX const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationX * >(argp1);
+  result = (RotationX *)((RotationX const *)arg1)->createInverse();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationX, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationX_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationX *arg1 = (RotationX *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RotationX_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationX, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationX_accept" "', argument " "1"" of type '" "RotationX const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationX * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotationX_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((RotationX const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationX_getAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationX *arg1 = (RotationX *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationX_getAngle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationX, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationX_getAngle" "', argument " "1"" of type '" "RotationX const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationX * >(argp1);
+  result = (double)((RotationX const *)arg1)->getAngle();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationX_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationX *arg1 = (RotationX *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Transform3D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationX_getTransform3D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationX, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationX_getTransform3D" "', argument " "1"" of type '" "RotationX const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationX * >(argp1);
+  result = ((RotationX const *)arg1)->getTransform3D();
+  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RotationX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationX *arg1 = (RotationX *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_RotationX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationX, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RotationX" "', argument " "1"" of type '" "RotationX *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationX * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RotationX_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RotationX, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_RotationY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationY *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_RotationY",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_RotationY" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (RotationY *)new RotationY(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationY, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationY_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationY *arg1 = (RotationY *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationY *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationY_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationY, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationY_clone" "', argument " "1"" of type '" "RotationY const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationY * >(argp1);
+  result = (RotationY *)((RotationY const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationY, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationY_createInverse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationY *arg1 = (RotationY *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationY *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationY_createInverse",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationY, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationY_createInverse" "', argument " "1"" of type '" "RotationY const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationY * >(argp1);
+  result = (RotationY *)((RotationY const *)arg1)->createInverse();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationY, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationY_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationY *arg1 = (RotationY *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RotationY_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationY, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationY_accept" "', argument " "1"" of type '" "RotationY const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationY * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotationY_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((RotationY const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationY_getAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationY *arg1 = (RotationY *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationY_getAngle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationY, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationY_getAngle" "', argument " "1"" of type '" "RotationY const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationY * >(argp1);
+  result = (double)((RotationY const *)arg1)->getAngle();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationY_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationY *arg1 = (RotationY *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Transform3D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationY_getTransform3D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationY, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationY_getTransform3D" "', argument " "1"" of type '" "RotationY const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationY * >(argp1);
+  result = ((RotationY const *)arg1)->getTransform3D();
+  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RotationY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationY *arg1 = (RotationY *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_RotationY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationY, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RotationY" "', argument " "1"" of type '" "RotationY *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationY * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RotationY_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RotationY, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_RotationZ__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationZ *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_RotationZ",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_RotationZ" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (RotationZ *)new RotationZ(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationZ, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RotationZ__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationZ *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_RotationZ")) SWIG_fail;
+  result = (RotationZ *)new RotationZ();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationZ, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RotationZ(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_RotationZ__SWIG_1(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_RotationZ__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_RotationZ'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    RotationZ::RotationZ(double)\n"
+    "    RotationZ::RotationZ()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationZ_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationZ *arg1 = (RotationZ *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationZ *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationZ_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationZ, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationZ_clone" "', argument " "1"" of type '" "RotationZ const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationZ * >(argp1);
+  result = (RotationZ *)((RotationZ const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationZ, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationZ_createInverse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationZ *arg1 = (RotationZ *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationZ *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationZ_createInverse",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationZ, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationZ_createInverse" "', argument " "1"" of type '" "RotationZ const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationZ * >(argp1);
+  result = (RotationZ *)((RotationZ const *)arg1)->createInverse();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationZ, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationZ_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationZ *arg1 = (RotationZ *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RotationZ_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationZ, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationZ_accept" "', argument " "1"" of type '" "RotationZ const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationZ * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotationZ_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((RotationZ const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationZ_getAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationZ *arg1 = (RotationZ *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationZ_getAngle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationZ, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationZ_getAngle" "', argument " "1"" of type '" "RotationZ const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationZ * >(argp1);
+  result = (double)((RotationZ const *)arg1)->getAngle();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationZ_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationZ *arg1 = (RotationZ *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Transform3D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationZ_getTransform3D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationZ, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationZ_getTransform3D" "', argument " "1"" of type '" "RotationZ const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationZ * >(argp1);
+  result = ((RotationZ const *)arg1)->getTransform3D();
+  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RotationZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationZ *arg1 = (RotationZ *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_RotationZ",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationZ, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RotationZ" "', argument " "1"" of type '" "RotationZ *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationZ * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RotationZ_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RotationZ, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_RotationEuler(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  RotationEuler *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_RotationEuler",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_RotationEuler" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_RotationEuler" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_RotationEuler" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (RotationEuler *)new RotationEuler(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationEuler, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationEuler_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RotationEuler *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationEuler_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_clone" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  result = (RotationEuler *)((RotationEuler const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotationEuler, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationEuler_createInverse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IRotation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationEuler_createInverse",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_createInverse" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  result = (IRotation *)((RotationEuler const *)arg1)->createInverse();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationEuler_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RotationEuler_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_accept" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotationEuler_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((RotationEuler const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationEuler_getAlpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationEuler_getAlpha",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_getAlpha" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  result = (double)((RotationEuler const *)arg1)->getAlpha();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationEuler_getBeta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationEuler_getBeta",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_getBeta" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  result = (double)((RotationEuler const *)arg1)->getBeta();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationEuler_getGamma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationEuler_getGamma",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_getGamma" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  result = (double)((RotationEuler const *)arg1)->getGamma();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RotationEuler_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Transform3D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RotationEuler_getTransform3D",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_getTransform3D" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  result = ((RotationEuler const *)arg1)->getTransform3D();
+  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RotationEuler(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RotationEuler *arg1 = (RotationEuler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_RotationEuler",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RotationEuler, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RotationEuler" "', argument " "1"" of type '" "RotationEuler *""'"); 
+  }
+  arg1 = reinterpret_cast< RotationEuler * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RotationEuler_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RotationEuler, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_ISelectionRule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISelectionRule *arg1 = (ISelectionRule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ISelectionRule",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISelectionRule, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ISelectionRule" "', argument " "1"" of type '" "ISelectionRule *""'"); 
+  }
+  arg1 = reinterpret_cast< ISelectionRule * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISelectionRule_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISelectionRule *arg1 = (ISelectionRule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ISelectionRule *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ISelectionRule_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISelectionRule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISelectionRule_clone" "', argument " "1"" of type '" "ISelectionRule const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISelectionRule * >(argp1);
+  result = (ISelectionRule *)((ISelectionRule const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISelectionRule, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ISelectionRule_coordinateSelected(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISelectionRule *arg1 = (ISelectionRule *) 0 ;
+  ivector_t *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ISelectionRule_coordinateSelected",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ISelectionRule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ISelectionRule_coordinateSelected" "', argument " "1"" of type '" "ISelectionRule const *""'"); 
+  }
+  arg1 = reinterpret_cast< ISelectionRule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_int_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ISelectionRule_coordinateSelected" "', argument " "2"" of type '" "ivector_t const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ISelectionRule_coordinateSelected" "', argument " "2"" of type '" "ivector_t const &""'"); 
+  }
+  arg2 = reinterpret_cast< ivector_t * >(argp2);
+  result = (bool)((ISelectionRule const *)arg1)->coordinateSelected((ivector_t const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ISelectionRule_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ISelectionRule, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SimpleSelectionRule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  int arg2 ;
+  int arg3 ;
+  int arg4 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  int val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  SimpleSelectionRule *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_SimpleSelectionRule",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SimpleSelectionRule" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SimpleSelectionRule" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_SimpleSelectionRule" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  ecode4 = SWIG_AsVal_int(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_SimpleSelectionRule" "', argument " "4"" of type '" "int""'");
+  } 
+  arg4 = static_cast< int >(val4);
+  result = (SimpleSelectionRule *)new SimpleSelectionRule(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimpleSelectionRule, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SimpleSelectionRule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimpleSelectionRule *arg1 = (SimpleSelectionRule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SimpleSelectionRule",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimpleSelectionRule, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SimpleSelectionRule" "', argument " "1"" of type '" "SimpleSelectionRule *""'"); 
+  }
+  arg1 = reinterpret_cast< SimpleSelectionRule * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimpleSelectionRule_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimpleSelectionRule *arg1 = (SimpleSelectionRule *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SimpleSelectionRule *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimpleSelectionRule_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimpleSelectionRule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimpleSelectionRule_clone" "', argument " "1"" of type '" "SimpleSelectionRule const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimpleSelectionRule * >(argp1);
+  result = (SimpleSelectionRule *)((SimpleSelectionRule const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimpleSelectionRule, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimpleSelectionRule_coordinateSelected(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimpleSelectionRule *arg1 = (SimpleSelectionRule *) 0 ;
+  ivector_t *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SimpleSelectionRule_coordinateSelected",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimpleSelectionRule, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimpleSelectionRule_coordinateSelected" "', argument " "1"" of type '" "SimpleSelectionRule const *""'"); 
+  }
+  arg1 = reinterpret_cast< SimpleSelectionRule * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_int_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimpleSelectionRule_coordinateSelected" "', argument " "2"" of type '" "ivector_t const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimpleSelectionRule_coordinateSelected" "', argument " "2"" of type '" "ivector_t const &""'"); 
+  }
+  arg2 = reinterpret_cast< ivector_t * >(argp2);
+  result = (bool)((SimpleSelectionRule const *)arg1)->coordinateSelected((ivector_t const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SimpleSelectionRule_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SimpleSelectionRule, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Instrument__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Instrument")) SWIG_fail;
+  result = (Instrument *)new Instrument();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Instrument, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Instrument__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Instrument *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Instrument",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Instrument,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Instrument" "', argument " "1"" of type '" "Instrument const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Instrument" "', argument " "1"" of type '" "Instrument const &""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (Instrument *)new Instrument((Instrument const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Instrument, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Instrument(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Instrument__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Instrument__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Instrument'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Instrument::Instrument()\n"
+    "    Instrument::Instrument(Instrument const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Instrument(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Instrument",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Instrument" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getBeam__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Beam *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_getBeam",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getBeam" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (Beam *) &(arg1)->getBeam();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Beam, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getBeam__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Beam *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_getBeam",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getBeam" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (Beam *) &((Instrument const *)arg1)->getBeam();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Beam, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getBeam(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Instrument_getBeam__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Instrument_getBeam__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Instrument_getBeam'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Instrument::getBeam()\n"
+    "    Instrument::getBeam() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setBeam(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  Beam *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_setBeam",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setBeam" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Beam,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_setBeam" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_setBeam" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  arg2 = reinterpret_cast< Beam * >(argp2);
+  (arg1)->setBeam((Beam const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setBeamParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Instrument_setBeamParameters",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setBeamParameters" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Instrument_setBeamParameters" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Instrument_setBeamParameters" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Instrument_setBeamParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setBeamParameters(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setBeamIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_setBeamIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setBeamIntensity" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Instrument_setBeamIntensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setBeamIntensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setBeamPolarization(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_setBeamPolarization",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setBeamPolarization" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_setBeamPolarization" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_setBeamPolarization" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->setBeamPolarization(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getBeamIntensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_getBeamIntensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getBeamIntensity" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (double)((Instrument const *)arg1)->getBeamIntensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetector2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_getDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getDetector" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (IDetector2D *)((Instrument const *)arg1)->getDetector();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IDetector2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getDetector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetector2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_getDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getDetector" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (IDetector2D *)(arg1)->getDetector();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IDetector2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getDetector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Instrument_getDetector__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Instrument_getDetector__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Instrument_getDetector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Instrument::getDetector() const\n"
+    "    Instrument::getDetector()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getDetectorMask(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  DetectorMask *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_getDetectorMask",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getDetectorMask" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (DetectorMask *)((Instrument const *)arg1)->getDetectorMask();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_DetectorMask, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getDetectorAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_getDetectorAxis",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getDetectorAxis" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Instrument_getDetectorAxis" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IAxis *) &((Instrument const *)arg1)->getDetectorAxis(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_getDetectorDimension(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_getDetectorDimension",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_getDetectorDimension" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = ((Instrument const *)arg1)->getDetectorDimension();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  IDetector2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_setDetector",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setDetector" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IDetector2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_setDetector" "', argument " "2"" of type '" "IDetector2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_setDetector" "', argument " "2"" of type '" "IDetector2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IDetector2D * >(argp2);
+  (arg1)->setDetector((IDetector2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setDetectorParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  size_t arg5 ;
+  double arg6 ;
+  double arg7 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  size_t val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  double val7 ;
+  int ecode7 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  PyObject * obj6 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:Instrument_setDetectorParameters",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setDetectorParameters" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Instrument_setDetectorParameters" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Instrument_setDetectorParameters" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Instrument_setDetectorParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_size_t(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "Instrument_setDetectorParameters" "', argument " "5"" of type '" "size_t""'");
+  } 
+  arg5 = static_cast< size_t >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "Instrument_setDetectorParameters" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  ecode7 = SWIG_AsVal_double(obj6, &val7);
+  if (!SWIG_IsOK(ecode7)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "Instrument_setDetectorParameters" "', argument " "7"" of type '" "double""'");
+  } 
+  arg7 = static_cast< double >(val7);
+  (arg1)->setDetectorParameters(arg2,arg3,arg4,arg5,arg6,arg7);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setDetectorAxes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  IAxis *arg2 = 0 ;
+  IAxis *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Instrument_setDetectorAxes",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setDetectorAxes" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_setDetectorAxes" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_setDetectorAxes" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Instrument_setDetectorAxes" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_setDetectorAxes" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  arg3 = reinterpret_cast< IAxis * >(argp3);
+  (arg1)->setDetectorAxes((IAxis const &)*arg2,(IAxis const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setDetectorResolutionFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  IResolutionFunction2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_setDetectorResolutionFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setDetectorResolutionFunction" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IResolutionFunction2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_setDetectorResolutionFunction" "', argument " "2"" of type '" "IResolutionFunction2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_setDetectorResolutionFunction" "', argument " "2"" of type '" "IResolutionFunction2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IResolutionFunction2D * >(argp2);
+  (arg1)->setDetectorResolutionFunction((IResolutionFunction2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_setAnalyzerProperties(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Instrument_setAnalyzerProperties",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_setAnalyzerProperties" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_setAnalyzerProperties" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_setAnalyzerProperties" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Instrument_setAnalyzerProperties" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "Instrument_setAnalyzerProperties" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setAnalyzerProperties(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_applyDetectorResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  OutputData< double > *arg2 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_applyDetectorResolution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_applyDetectorResolution" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_applyDetectorResolution" "', argument " "2"" of type '" "OutputData< double > *""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  ((Instrument const *)arg1)->applyDetectorResolution(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_createDetectorIntensity__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  std::vector< SimulationElement,std::allocator< SimulationElement > > *arg2 = 0 ;
+  IDetector2D::EAxesUnits arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Instrument_createDetectorIntensity",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_createDetectorIntensity" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< SimulationElement,std::allocator< SimulationElement > > * >(argp2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Instrument_createDetectorIntensity" "', argument " "3"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg3 = static_cast< IDetector2D::EAxesUnits >(val3);
+  result = (OutputData< double > *)((Instrument const *)arg1)->createDetectorIntensity((std::vector< SimulationElement,std::allocator< SimulationElement > > const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_createDetectorIntensity__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  std::vector< SimulationElement,std::allocator< SimulationElement > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_createDetectorIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_createDetectorIntensity" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Instrument_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Instrument_createDetectorIntensity" "', argument " "2"" of type '" "std::vector< SimulationElement,std::allocator< SimulationElement > > const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< SimulationElement,std::allocator< SimulationElement > > * >(argp2);
+  result = (OutputData< double > *)((Instrument const *)arg1)->createDetectorIntensity((std::vector< SimulationElement,std::allocator< SimulationElement > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_createDetectorIntensity(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_Instrument_createDetectorIntensity__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Instrument_createDetectorIntensity__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Instrument_createDetectorIntensity'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Instrument::createDetectorIntensity(std::vector< SimulationElement,std::allocator< SimulationElement > > const &,IDetector2D::EAxesUnits) const\n"
+    "    Instrument::createDetectorIntensity(std::vector< SimulationElement,std::allocator< SimulationElement > > const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_createDetectorMap__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  IDetector2D::EAxesUnits arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Instrument_createDetectorMap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_createDetectorMap" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Instrument_createDetectorMap" "', argument " "2"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg2 = static_cast< IDetector2D::EAxesUnits >(val2);
+  result = (OutputData< double > *)((Instrument const *)arg1)->createDetectorMap(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_createDetectorMap__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_createDetectorMap",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_createDetectorMap" "', argument " "1"" of type '" "Instrument const *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  result = (OutputData< double > *)((Instrument const *)arg1)->createDetectorMap();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_createDetectorMap(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Instrument_createDetectorMap__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Instrument, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Instrument_createDetectorMap__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Instrument_createDetectorMap'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Instrument::createDetectorMap(IDetector2D::EAxesUnits) const\n"
+    "    Instrument::createDetectorMap() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Instrument_initDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Instrument *arg1 = (Instrument *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Instrument_initDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Instrument, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Instrument_initDetector" "', argument " "1"" of type '" "Instrument *""'"); 
+  }
+  arg1 = reinterpret_cast< Instrument * >(argp1);
+  (arg1)->initDetector();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Instrument_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Instrument, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_getRelativeDifference__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:getRelativeDifference",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "getRelativeDifference" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "getRelativeDifference" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "getRelativeDifference" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "getRelativeDifference" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (double)IntensityDataFunctions::getRelativeDifference((OutputData< double > const &)*arg1,(OutputData< double > const &)*arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_getRelativeDifference__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = 0 ;
+  IHistogram *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:getRelativeDifference",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "getRelativeDifference" "', argument " "1"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "getRelativeDifference" "', argument " "1"" of type '" "IHistogram const &""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "getRelativeDifference" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "getRelativeDifference" "', argument " "2"" of type '" "IHistogram const &""'"); 
+  }
+  arg2 = reinterpret_cast< IHistogram * >(argp2);
+  result = (double)IntensityDataFunctions::getRelativeDifference((IHistogram const &)*arg1,(IHistogram const &)*arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_getRelativeDifference(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_getRelativeDifference__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IHistogram, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IHistogram, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_getRelativeDifference__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'getRelativeDifference'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IntensityDataFunctions::getRelativeDifference(OutputData< double > const &,OutputData< double > const &)\n"
+    "    IntensityDataFunctions::getRelativeDifference(IHistogram const &,IHistogram const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_createRelativeDifferenceData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:createRelativeDifferenceData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "createRelativeDifferenceData" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createRelativeDifferenceData" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "createRelativeDifferenceData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createRelativeDifferenceData" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *)IntensityDataFunctions::createRelativeDifferenceData((OutputData< double > const &)*arg1,(OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_createClippedDataSet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:createClippedDataSet",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "createClippedDataSet" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "createClippedDataSet" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "createClippedDataSet" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "createClippedDataSet" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "createClippedDataSet" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "createClippedDataSet" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (OutputData< double > *)IntensityDataFunctions::createClippedDataSet((OutputData< double > const &)*arg1,arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_applyDetectorResolution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  IResolutionFunction2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:applyDetectorResolution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "applyDetectorResolution" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "applyDetectorResolution" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IResolutionFunction2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "applyDetectorResolution" "', argument " "2"" of type '" "IResolutionFunction2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "applyDetectorResolution" "', argument " "2"" of type '" "IResolutionFunction2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IResolutionFunction2D * >(argp2);
+  result = (OutputData< double > *)IntensityDataFunctions::applyDetectorResolution((OutputData< double > const &)*arg1,(IResolutionFunction2D const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_coordinateToBinf__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  IAxis *arg2 = 0 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:coordinateToBinf",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "coordinateToBinf" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coordinateToBinf" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateToBinf" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  result = (double)IntensityDataFunctions::coordinateToBinf(arg1,(IAxis const &)*arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_coordinateFromBinf__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  IAxis *arg2 = 0 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:coordinateFromBinf",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "coordinateFromBinf" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coordinateFromBinf" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateFromBinf" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  result = (double)IntensityDataFunctions::coordinateFromBinf(arg1,(IAxis const &)*arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_coordinateToBinf__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double *arg1 = 0 ;
+  double *arg2 = 0 ;
+  OutputData< double > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:coordinateToBinf",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coordinateToBinf" "', argument " "1"" of type '" "double &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateToBinf" "', argument " "1"" of type '" "double &""'"); 
+  }
+  arg1 = reinterpret_cast< double * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coordinateToBinf" "', argument " "2"" of type '" "double &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateToBinf" "', argument " "2"" of type '" "double &""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "coordinateToBinf" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateToBinf" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg3 = reinterpret_cast< OutputData< double > * >(argp3);
+  IntensityDataFunctions::coordinateToBinf(*arg1,*arg2,(OutputData< double > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_coordinateToBinf(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_coordinateToBinf__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_double, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_double, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_coordinateToBinf__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'coordinateToBinf'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IntensityDataFunctions::coordinateToBinf(double,IAxis const &)\n"
+    "    IntensityDataFunctions::coordinateToBinf(double &,double &,OutputData< double > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_coordinateFromBinf__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double *arg1 = 0 ;
+  double *arg2 = 0 ;
+  OutputData< double > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:coordinateFromBinf",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coordinateFromBinf" "', argument " "1"" of type '" "double &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateFromBinf" "', argument " "1"" of type '" "double &""'"); 
+  }
+  arg1 = reinterpret_cast< double * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_double,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coordinateFromBinf" "', argument " "2"" of type '" "double &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateFromBinf" "', argument " "2"" of type '" "double &""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "coordinateFromBinf" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "coordinateFromBinf" "', argument " "3"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg3 = reinterpret_cast< OutputData< double > * >(argp3);
+  IntensityDataFunctions::coordinateFromBinf(*arg1,*arg2,(OutputData< double > const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_coordinateFromBinf(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_coordinateFromBinf__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_double, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_double, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_OutputDataT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_coordinateFromBinf__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'coordinateFromBinf'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IntensityDataFunctions::coordinateFromBinf(double,IAxis const &)\n"
+    "    IntensityDataFunctions::coordinateFromBinf(double &,double &,OutputData< double > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityDataIOFactory_readOutputData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityDataIOFactory_readOutputData",&obj0)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityDataIOFactory_readOutputData" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityDataIOFactory_readOutputData" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (OutputData< double > *)IntensityDataIOFactory::readOutputData((std::string const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityDataIOFactory_readIntensityData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  IHistogram *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityDataIOFactory_readIntensityData",&obj0)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityDataIOFactory_readIntensityData" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityDataIOFactory_readIntensityData" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (IHistogram *)IntensityDataIOFactory::readIntensityData((std::string const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IHistogram, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityDataIOFactory_writeOutputData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityDataIOFactory_writeOutputData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityDataIOFactory_writeOutputData" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityDataIOFactory_writeOutputData" "', argument " "1"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityDataIOFactory_writeOutputData" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityDataIOFactory_writeOutputData" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  IntensityDataIOFactory::writeOutputData((OutputData< double > const &)*arg1,(std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityDataIOFactory_writeIntensityData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IHistogram *arg1 = 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityDataIOFactory_writeIntensityData",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IHistogram,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityDataIOFactory_writeIntensityData" "', argument " "1"" of type '" "IHistogram const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityDataIOFactory_writeIntensityData" "', argument " "1"" of type '" "IHistogram const &""'"); 
+  }
+  arg1 = reinterpret_cast< IHistogram * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityDataIOFactory_writeIntensityData" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityDataIOFactory_writeIntensityData" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  IntensityDataIOFactory::writeIntensityData((IHistogram const &)*arg1,(std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntensityDataIOFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityDataIOFactory *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityDataIOFactory")) SWIG_fail;
+  result = (IntensityDataIOFactory *)new IntensityDataIOFactory();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IntensityDataIOFactory, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IntensityDataIOFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IntensityDataIOFactory *arg1 = (IntensityDataIOFactory *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityDataIOFactory",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IntensityDataIOFactory, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityDataIOFactory" "', argument " "1"" of type '" "IntensityDataIOFactory *""'"); 
+  }
+  arg1 = reinterpret_cast< IntensityDataIOFactory * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IntensityDataIOFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IntensityDataIOFactory, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction1DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  InterferenceFunction1DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_InterferenceFunction1DLattice",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction1DLattice" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction1DLattice" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (InterferenceFunction1DLattice *)new InterferenceFunction1DLattice(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction1DLattice, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_InterferenceFunction1DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction1DLattice *arg1 = (InterferenceFunction1DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_InterferenceFunction1DLattice",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction1DLattice, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_InterferenceFunction1DLattice" "', argument " "1"" of type '" "InterferenceFunction1DLattice *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction1DLattice * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction1DLattice_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction1DLattice *arg1 = (InterferenceFunction1DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunction1DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction1DLattice_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction1DLattice_clone" "', argument " "1"" of type '" "InterferenceFunction1DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction1DLattice * >(argp1);
+  result = (InterferenceFunction1DLattice *)((InterferenceFunction1DLattice const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction1DLattice_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction1DLattice *arg1 = (InterferenceFunction1DLattice *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction1DLattice_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction1DLattice_accept" "', argument " "1"" of type '" "InterferenceFunction1DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction1DLattice * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction1DLattice_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((InterferenceFunction1DLattice const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction1DLattice_setDecayFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction1DLattice *arg1 = (InterferenceFunction1DLattice *) 0 ;
+  IFTDecayFunction1D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction1DLattice_setDecayFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction1DLattice_setDecayFunction" "', argument " "1"" of type '" "InterferenceFunction1DLattice *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction1DLattice * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFTDecayFunction1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction1DLattice_setDecayFunction" "', argument " "2"" of type '" "IFTDecayFunction1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunction1DLattice_setDecayFunction" "', argument " "2"" of type '" "IFTDecayFunction1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFTDecayFunction1D * >(argp2);
+  (arg1)->setDecayFunction((IFTDecayFunction1D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction1DLattice_getLatticeParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction1DLattice *arg1 = (InterferenceFunction1DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Lattice1DParameters result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction1DLattice_getLatticeParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction1DLattice_getLatticeParameters" "', argument " "1"" of type '" "InterferenceFunction1DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction1DLattice * >(argp1);
+  result = ((InterferenceFunction1DLattice const *)arg1)->getLatticeParameters();
+  resultobj = SWIG_NewPointerObj((new Lattice1DParameters(static_cast< const Lattice1DParameters& >(result))), SWIGTYPE_p_Lattice1DParameters, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction1DLattice_getDecayFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction1DLattice *arg1 = (InterferenceFunction1DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDecayFunction1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction1DLattice_getDecayFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction1DLattice_getDecayFunction" "', argument " "1"" of type '" "InterferenceFunction1DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction1DLattice * >(argp1);
+  result = (IFTDecayFunction1D *)((InterferenceFunction1DLattice const *)arg1)->getDecayFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDecayFunction1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction1DLattice_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction1DLattice *arg1 = (InterferenceFunction1DLattice *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction1DLattice_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction1DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction1DLattice_evaluate" "', argument " "1"" of type '" "InterferenceFunction1DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction1DLattice * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction1DLattice_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunction1DLattice_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((InterferenceFunction1DLattice const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *InterferenceFunction1DLattice_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_InterferenceFunction1DLattice, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionRadialParaCrystal__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  InterferenceFunctionRadialParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_InterferenceFunctionRadialParaCrystal",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunctionRadialParaCrystal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunctionRadialParaCrystal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (InterferenceFunctionRadialParaCrystal *)new InterferenceFunctionRadialParaCrystal(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionRadialParaCrystal__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunctionRadialParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_InterferenceFunctionRadialParaCrystal",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunctionRadialParaCrystal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (InterferenceFunctionRadialParaCrystal *)new InterferenceFunctionRadialParaCrystal(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionRadialParaCrystal(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_InterferenceFunctionRadialParaCrystal__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_InterferenceFunctionRadialParaCrystal__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_InterferenceFunctionRadialParaCrystal'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(double,double)\n"
+    "    InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunctionRadialParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionRadialParaCrystal_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_clone" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  result = (InterferenceFunctionRadialParaCrystal *)((InterferenceFunctionRadialParaCrystal const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionRadialParaCrystal_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_accept" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunctionRadialParaCrystal_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((InterferenceFunctionRadialParaCrystal const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_to_str__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionRadialParaCrystal_to_str",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_to_str" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunctionRadialParaCrystal_to_str" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = ((InterferenceFunctionRadialParaCrystal const *)arg1)->to_str(arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_to_str__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionRadialParaCrystal_to_str",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_to_str" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  result = ((InterferenceFunctionRadialParaCrystal const *)arg1)->to_str();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_to_str(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_InterferenceFunctionRadialParaCrystal_to_str__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_InterferenceFunctionRadialParaCrystal_to_str__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InterferenceFunctionRadialParaCrystal_to_str'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunctionRadialParaCrystal::to_str(int) const\n"
+    "    InterferenceFunctionRadialParaCrystal::to_str() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_setKappa(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionRadialParaCrystal_setKappa",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_setKappa" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunctionRadialParaCrystal_setKappa" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setKappa(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_getKappa(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionRadialParaCrystal_getKappa",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_getKappa" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  result = (double)((InterferenceFunctionRadialParaCrystal const *)arg1)->getKappa();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_setDomainSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionRadialParaCrystal_setDomainSize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_setDomainSize" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunctionRadialParaCrystal_setDomainSize" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setDomainSize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_getDomainSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionRadialParaCrystal_getDomainSize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_getDomainSize" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  result = (double)((InterferenceFunctionRadialParaCrystal const *)arg1)->getDomainSize();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionRadialParaCrystal_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_evaluate" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunctionRadialParaCrystal_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunctionRadialParaCrystal_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((InterferenceFunctionRadialParaCrystal const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_FTPDF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionRadialParaCrystal_FTPDF",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_FTPDF" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunctionRadialParaCrystal_FTPDF" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = ((InterferenceFunctionRadialParaCrystal const *)arg1)->FTPDF(arg2);
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_setProbabilityDistribution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  IFTDistribution1D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionRadialParaCrystal_setProbabilityDistribution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_setProbabilityDistribution" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFTDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunctionRadialParaCrystal_setProbabilityDistribution" "', argument " "2"" of type '" "IFTDistribution1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunctionRadialParaCrystal_setProbabilityDistribution" "', argument " "2"" of type '" "IFTDistribution1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFTDistribution1D * >(argp2);
+  (arg1)->setProbabilityDistribution((IFTDistribution1D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_getProbabilityDistribution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDistribution1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionRadialParaCrystal_getProbabilityDistribution",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_getProbabilityDistribution" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  result = (IFTDistribution1D *)((InterferenceFunctionRadialParaCrystal const *)arg1)->getProbabilityDistribution();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDistribution1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_getPeakDistance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionRadialParaCrystal_getPeakDistance",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_getPeakDistance" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  result = (double)((InterferenceFunctionRadialParaCrystal const *)arg1)->getPeakDistance();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionRadialParaCrystal_getDampingLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionRadialParaCrystal_getDampingLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionRadialParaCrystal_getDampingLength" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  result = (double)((InterferenceFunctionRadialParaCrystal const *)arg1)->getDampingLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_InterferenceFunctionRadialParaCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionRadialParaCrystal *arg1 = (InterferenceFunctionRadialParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_InterferenceFunctionRadialParaCrystal",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_InterferenceFunctionRadialParaCrystal" "', argument " "1"" of type '" "InterferenceFunctionRadialParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionRadialParaCrystal * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *InterferenceFunctionRadialParaCrystal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_InterferenceFunctionRadialParaCrystal, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DLattice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  InterferenceFunction2DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_InterferenceFunction2DLattice",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction2DLattice" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction2DLattice" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunction2DLattice" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_InterferenceFunction2DLattice" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (InterferenceFunction2DLattice *)new InterferenceFunction2DLattice(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DLattice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  InterferenceFunction2DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_InterferenceFunction2DLattice",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction2DLattice" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction2DLattice" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunction2DLattice" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (InterferenceFunction2DLattice *)new InterferenceFunction2DLattice(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DLattice(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_InterferenceFunction2DLattice__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_InterferenceFunction2DLattice__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_InterferenceFunction2DLattice'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunction2DLattice::InterferenceFunction2DLattice(double,double,double,double)\n"
+    "    InterferenceFunction2DLattice::InterferenceFunction2DLattice(double,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_InterferenceFunction2DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_InterferenceFunction2DLattice",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_InterferenceFunction2DLattice" "', argument " "1"" of type '" "InterferenceFunction2DLattice *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunction2DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DLattice_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DLattice_clone" "', argument " "1"" of type '" "InterferenceFunction2DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  result = (InterferenceFunction2DLattice *)((InterferenceFunction2DLattice const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DLattice_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DLattice_accept" "', argument " "1"" of type '" "InterferenceFunction2DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction2DLattice_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((InterferenceFunction2DLattice const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createSquare__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  InterferenceFunction2DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DLattice_createSquare",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DLattice_createSquare" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DLattice_createSquare" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (InterferenceFunction2DLattice *)InterferenceFunction2DLattice::createSquare(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createSquare__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunction2DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DLattice_createSquare",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DLattice_createSquare" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (InterferenceFunction2DLattice *)InterferenceFunction2DLattice::createSquare(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createSquare(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_InterferenceFunction2DLattice_createSquare__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_InterferenceFunction2DLattice_createSquare__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InterferenceFunction2DLattice_createSquare'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunction2DLattice::createSquare(double,double)\n"
+    "    InterferenceFunction2DLattice::createSquare(double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createHexagonal__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  InterferenceFunction2DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DLattice_createHexagonal",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DLattice_createHexagonal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DLattice_createHexagonal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (InterferenceFunction2DLattice *)InterferenceFunction2DLattice::createHexagonal(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createHexagonal__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunction2DLattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DLattice_createHexagonal",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DLattice_createHexagonal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (InterferenceFunction2DLattice *)InterferenceFunction2DLattice::createHexagonal(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createHexagonal(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_InterferenceFunction2DLattice_createHexagonal__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_InterferenceFunction2DLattice_createHexagonal__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InterferenceFunction2DLattice_createHexagonal'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunction2DLattice::createHexagonal(double,double)\n"
+    "    InterferenceFunction2DLattice::createHexagonal(double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_setDecayFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  IFTDecayFunction2D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DLattice_setDecayFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DLattice_setDecayFunction" "', argument " "1"" of type '" "InterferenceFunction2DLattice *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFTDecayFunction2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction2DLattice_setDecayFunction" "', argument " "2"" of type '" "IFTDecayFunction2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunction2DLattice_setDecayFunction" "', argument " "2"" of type '" "IFTDecayFunction2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFTDecayFunction2D * >(argp2);
+  (arg1)->setDecayFunction((IFTDecayFunction2D const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_getDecayFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFTDecayFunction2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DLattice_getDecayFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DLattice_getDecayFunction" "', argument " "1"" of type '" "InterferenceFunction2DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  result = (IFTDecayFunction2D *)((InterferenceFunction2DLattice const *)arg1)->getDecayFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFTDecayFunction2D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DLattice_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DLattice_evaluate" "', argument " "1"" of type '" "InterferenceFunction2DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction2DLattice_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunction2DLattice_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((InterferenceFunction2DLattice const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_getLatticeParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Lattice2DParameters result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DLattice_getLatticeParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DLattice_getLatticeParameters" "', argument " "1"" of type '" "InterferenceFunction2DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  result = ((InterferenceFunction2DLattice const *)arg1)->getLatticeParameters();
+  resultobj = SWIG_NewPointerObj((new Lattice2DParameters(static_cast< const Lattice2DParameters& >(result))), SWIGTYPE_p_Lattice2DParameters, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_getParticleDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DLattice_getParticleDensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DLattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DLattice_getParticleDensity" "', argument " "1"" of type '" "InterferenceFunction2DLattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DLattice * >(argp1);
+  result = (double)((InterferenceFunction2DLattice const *)arg1)->getParticleDensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *InterferenceFunction2DLattice_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_InterferenceFunction2DLattice, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double arg5 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:new_InterferenceFunction2DParaCrystal",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (InterferenceFunction2DParaCrystal *)new InterferenceFunction2DParaCrystal(arg1,arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_InterferenceFunction2DParaCrystal",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (InterferenceFunction2DParaCrystal *)new InterferenceFunction2DParaCrystal(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_InterferenceFunction2DParaCrystal",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (InterferenceFunction2DParaCrystal *)new InterferenceFunction2DParaCrystal(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_InterferenceFunction2DParaCrystal__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_InterferenceFunction2DParaCrystal__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_new_InterferenceFunction2DParaCrystal__SWIG_0(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_InterferenceFunction2DParaCrystal'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double,double,double,double,double)\n"
+    "    InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double,double,double,double)\n"
+    "    InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_InterferenceFunction2DParaCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_InterferenceFunction2DParaCrystal",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_InterferenceFunction2DParaCrystal" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_clone" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = (InterferenceFunction2DParaCrystal *)((InterferenceFunction2DParaCrystal const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DParaCrystal_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_accept" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction2DParaCrystal_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((InterferenceFunction2DParaCrystal const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_to_str__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DParaCrystal_to_str",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_to_str" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_to_str" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = ((InterferenceFunction2DParaCrystal const *)arg1)->to_str(arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_to_str__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_to_str",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_to_str" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = ((InterferenceFunction2DParaCrystal const *)arg1)->to_str();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_to_str(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_InterferenceFunction2DParaCrystal_to_str__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_InterferenceFunction2DParaCrystal_to_str__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InterferenceFunction2DParaCrystal_to_str'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunction2DParaCrystal::to_str(int) const\n"
+    "    InterferenceFunction2DParaCrystal::to_str() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:InterferenceFunction2DParaCrystal_createSquare",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createSquare(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:InterferenceFunction2DParaCrystal_createSquare",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createSquare(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DParaCrystal_createSquare",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createSquare(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_createSquare",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createSquare" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createSquare(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createSquare(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_3(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_InterferenceFunction2DParaCrystal_createSquare__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InterferenceFunction2DParaCrystal_createSquare'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunction2DParaCrystal::createSquare(double,double,double,double)\n"
+    "    InterferenceFunction2DParaCrystal::createSquare(double,double,double)\n"
+    "    InterferenceFunction2DParaCrystal::createSquare(double,double)\n"
+    "    InterferenceFunction2DParaCrystal::createSquare(double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:InterferenceFunction2DParaCrystal_createHexagonal",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createHexagonal(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:InterferenceFunction2DParaCrystal_createHexagonal",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createHexagonal(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DParaCrystal_createHexagonal",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createHexagonal(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunction2DParaCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_createHexagonal",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DParaCrystal_createHexagonal" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (InterferenceFunction2DParaCrystal *)InterferenceFunction2DParaCrystal::createHexagonal(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_createHexagonal(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_3(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_InterferenceFunction2DParaCrystal_createHexagonal__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InterferenceFunction2DParaCrystal_createHexagonal'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    InterferenceFunction2DParaCrystal::createHexagonal(double,double,double,double)\n"
+    "    InterferenceFunction2DParaCrystal::createHexagonal(double,double,double)\n"
+    "    InterferenceFunction2DParaCrystal::createHexagonal(double,double)\n"
+    "    InterferenceFunction2DParaCrystal::createHexagonal(double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_setDomainSizes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:InterferenceFunction2DParaCrystal_setDomainSizes",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_setDomainSizes" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_setDomainSizes" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "InterferenceFunction2DParaCrystal_setDomainSizes" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setDomainSizes(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_setProbabilityDistributions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  IFTDistribution2D *arg2 = 0 ;
+  IFTDistribution2D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:InterferenceFunction2DParaCrystal_setProbabilityDistributions",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_setProbabilityDistributions" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFTDistribution2D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction2DParaCrystal_setProbabilityDistributions" "', argument " "2"" of type '" "IFTDistribution2D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunction2DParaCrystal_setProbabilityDistributions" "', argument " "2"" of type '" "IFTDistribution2D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFTDistribution2D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IFTDistribution2D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "InterferenceFunction2DParaCrystal_setProbabilityDistributions" "', argument " "3"" of type '" "IFTDistribution2D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunction2DParaCrystal_setProbabilityDistributions" "', argument " "3"" of type '" "IFTDistribution2D const &""'"); 
+  }
+  arg3 = reinterpret_cast< IFTDistribution2D * >(argp3);
+  (arg1)->setProbabilityDistributions((IFTDistribution2D const &)*arg2,(IFTDistribution2D const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DParaCrystal_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_evaluate" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunction2DParaCrystal_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunction2DParaCrystal_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((InterferenceFunction2DParaCrystal const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_getDomainSizes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_getDomainSizes",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_getDomainSizes" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = ((InterferenceFunction2DParaCrystal const *)arg1)->getDomainSizes();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_getProbabilityDistributions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< IFTDistribution2D const *,std::allocator< IFTDistribution2D const * > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_getProbabilityDistributions",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_getProbabilityDistributions" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = ((InterferenceFunction2DParaCrystal const *)arg1)->getProbabilityDistributions();
+  resultobj = SWIG_NewPointerObj((new std::vector< IFTDistribution2D const *,std::allocator< IFTDistribution2D const * > >(static_cast< const std::vector< IFTDistribution2D const *,std::allocator< IFTDistribution2D const * > >& >(result))), SWIGTYPE_p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_setIntegrationOverXi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunction2DParaCrystal_setIntegrationOverXi",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_setIntegrationOverXi" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DParaCrystal_setIntegrationOverXi" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  (arg1)->setIntegrationOverXi(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_getIntegrationOverXi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_getIntegrationOverXi",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_getIntegrationOverXi" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = (bool)((InterferenceFunction2DParaCrystal const *)arg1)->getIntegrationOverXi();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_getDampingLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_getDampingLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_getDampingLength" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = (double)((InterferenceFunction2DParaCrystal const *)arg1)->getDampingLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_getLatticeParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Lattice2DParameters result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_getLatticeParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_getLatticeParameters" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = ((InterferenceFunction2DParaCrystal const *)arg1)->getLatticeParameters();
+  resultobj = SWIG_NewPointerObj((new Lattice2DParameters(static_cast< const Lattice2DParameters& >(result))), SWIGTYPE_p_Lattice2DParameters, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunction2DParaCrystal_getParticleDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunction2DParaCrystal_getParticleDensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunction2DParaCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunction2DParaCrystal_getParticleDensity" "', argument " "1"" of type '" "InterferenceFunction2DParaCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunction2DParaCrystal * >(argp1);
+  result = (double)((InterferenceFunction2DParaCrystal const *)arg1)->getParticleDensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *InterferenceFunction2DParaCrystal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_InterferenceFunction2DParaCrystal, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionNone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionNone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_InterferenceFunctionNone")) SWIG_fail;
+  result = (InterferenceFunctionNone *)new InterferenceFunctionNone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunctionNone, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionNone_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionNone *arg1 = (InterferenceFunctionNone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  InterferenceFunctionNone *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:InterferenceFunctionNone_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionNone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionNone_clone" "', argument " "1"" of type '" "InterferenceFunctionNone const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionNone * >(argp1);
+  result = (InterferenceFunctionNone *)((InterferenceFunctionNone const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunctionNone, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionNone_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionNone *arg1 = (InterferenceFunctionNone *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionNone_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionNone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionNone_accept" "', argument " "1"" of type '" "InterferenceFunctionNone const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionNone * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunctionNone_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((InterferenceFunctionNone const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_InterferenceFunctionNone_evaluate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionNone *arg1 = (InterferenceFunctionNone *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:InterferenceFunctionNone_evaluate",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionNone, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterferenceFunctionNone_evaluate" "', argument " "1"" of type '" "InterferenceFunctionNone const *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionNone * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "InterferenceFunctionNone_evaluate" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "InterferenceFunctionNone_evaluate" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((InterferenceFunctionNone const *)arg1)->evaluate(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_InterferenceFunctionNone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  InterferenceFunctionNone *arg1 = (InterferenceFunctionNone *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_InterferenceFunctionNone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_InterferenceFunctionNone, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_InterferenceFunctionNone" "', argument " "1"" of type '" "InterferenceFunctionNone *""'"); 
+  }
+  arg1 = reinterpret_cast< InterferenceFunctionNone * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *InterferenceFunctionNone_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_InterferenceFunctionNone, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IPixelMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IPixelMap *arg1 = (IPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IPixelMap",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IPixelMap, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IPixelMap" "', argument " "1"" of type '" "IPixelMap *""'"); 
+  }
+  arg1 = reinterpret_cast< IPixelMap * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IPixelMap_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IPixelMap *arg1 = (IPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IPixelMap_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IPixelMap_clone" "', argument " "1"" of type '" "IPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< IPixelMap * >(argp1);
+  result = (IPixelMap *)((IPixelMap const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IPixelMap, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IPixelMap_createZeroSizeMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IPixelMap *arg1 = (IPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  IPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IPixelMap_createZeroSizeMap",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IPixelMap_createZeroSizeMap" "', argument " "1"" of type '" "IPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< IPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IPixelMap_createZeroSizeMap" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IPixelMap_createZeroSizeMap" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (IPixelMap *)((IPixelMap const *)arg1)->createZeroSizeMap(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IPixelMap, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IPixelMap_getK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IPixelMap *arg1 = (IPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:IPixelMap_getK",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IPixelMap_getK" "', argument " "1"" of type '" "IPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< IPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IPixelMap_getK" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IPixelMap_getK" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IPixelMap_getK" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = ((IPixelMap const *)arg1)->getK(arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IPixelMap_getIntegrationFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IPixelMap *arg1 = (IPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IPixelMap_getIntegrationFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IPixelMap_getIntegrationFactor" "', argument " "1"" of type '" "IPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< IPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IPixelMap_getIntegrationFactor" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IPixelMap_getIntegrationFactor" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((IPixelMap const *)arg1)->getIntegrationFactor(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IPixelMap_getSolidAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IPixelMap *arg1 = (IPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IPixelMap_getSolidAngle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IPixelMap_getSolidAngle" "', argument " "1"" of type '" "IPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< IPixelMap * >(argp1);
+  result = (double)((IPixelMap const *)arg1)->getSolidAngle();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IPixelMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IPixelMap, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SphericalDetector")) SWIG_fail;
+  result = (SphericalDetector *)new SphericalDetector();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  size_t arg1 ;
+  double arg2 ;
+  double arg3 ;
+  size_t arg4 ;
+  double arg5 ;
+  double arg6 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  SphericalDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:new_SphericalDetector",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "size_t""'");
+  } 
+  arg1 = static_cast< size_t >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SphericalDetector" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_SphericalDetector" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_SphericalDetector" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_SphericalDetector" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "new_SphericalDetector" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  result = (SphericalDetector *)new SphericalDetector(arg1,arg2,arg3,arg4,arg5,arg6);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SphericalDetector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SphericalDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_SphericalDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_SphericalDetector,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector const &""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  result = (SphericalDetector *)new SphericalDetector((SphericalDetector const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SphericalDetector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[7] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 6) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_SphericalDetector__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_SphericalDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_SphericalDetector__SWIG_2(self, args);
+    }
+  }
+  if (argc == 6) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_size_t(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              {
+                int res = SWIG_AsVal_double(argv[5], NULL);
+                _v = SWIG_CheckState(res);
+              }
+              if (_v) {
+                return _wrap_new_SphericalDetector__SWIG_1(self, args);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_SphericalDetector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SphericalDetector::SphericalDetector()\n"
+    "    SphericalDetector::SphericalDetector(size_t,double,double,size_t,double,double)\n"
+    "    SphericalDetector::SphericalDetector(SphericalDetector const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SphericalDetector_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SphericalDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SphericalDetector_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_clone" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  result = (SphericalDetector *)((SphericalDetector const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SphericalDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SphericalDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SphericalDetector, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SphericalDetector" "', argument " "1"" of type '" "SphericalDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SphericalDetector_getValidAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< enum IDetector2D::EAxesUnits,std::allocator< enum IDetector2D::EAxesUnits > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SphericalDetector_getValidAxesUnits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_getValidAxesUnits" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  result = ((SphericalDetector const *)arg1)->getValidAxesUnits();
+  resultobj = SWIG_NewPointerObj((new std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >(static_cast< const std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >& >(result))), SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SphericalDetector_getDefaultAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SphericalDetector *arg1 = (SphericalDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetector2D::EAxesUnits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SphericalDetector_getDefaultAxesUnits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SphericalDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SphericalDetector_getDefaultAxesUnits" "', argument " "1"" of type '" "SphericalDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< SphericalDetector * >(argp1);
+  result = (IDetector2D::EAxesUnits)((SphericalDetector const *)arg1)->getDefaultAxesUnits();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SphericalDetector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SphericalDetector, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_AngularPixelMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Bin1D arg1 ;
+  Bin1D arg2 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  AngularPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_AngularPixelMap",&obj0,&obj1)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Bin1D,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AngularPixelMap" "', argument " "1"" of type '" "Bin1D""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AngularPixelMap" "', argument " "1"" of type '" "Bin1D""'");
+    } else {
+      Bin1D * temp = reinterpret_cast< Bin1D * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_AngularPixelMap" "', argument " "2"" of type '" "Bin1D""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AngularPixelMap" "', argument " "2"" of type '" "Bin1D""'");
+    } else {
+      Bin1D * temp = reinterpret_cast< Bin1D * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (AngularPixelMap *)new AngularPixelMap(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularPixelMap, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_AngularPixelMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularPixelMap *arg1 = (AngularPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_AngularPixelMap",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AngularPixelMap, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AngularPixelMap" "', argument " "1"" of type '" "AngularPixelMap *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularPixelMap * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularPixelMap_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularPixelMap *arg1 = (AngularPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  AngularPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AngularPixelMap_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AngularPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularPixelMap_clone" "', argument " "1"" of type '" "AngularPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularPixelMap * >(argp1);
+  result = (AngularPixelMap *)((AngularPixelMap const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularPixelMap, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularPixelMap_createZeroSizeMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularPixelMap *arg1 = (AngularPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  AngularPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:AngularPixelMap_createZeroSizeMap",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AngularPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularPixelMap_createZeroSizeMap" "', argument " "1"" of type '" "AngularPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AngularPixelMap_createZeroSizeMap" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularPixelMap_createZeroSizeMap" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (AngularPixelMap *)((AngularPixelMap const *)arg1)->createZeroSizeMap(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AngularPixelMap, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularPixelMap_getK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularPixelMap *arg1 = (AngularPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:AngularPixelMap_getK",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AngularPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularPixelMap_getK" "', argument " "1"" of type '" "AngularPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AngularPixelMap_getK" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularPixelMap_getK" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "AngularPixelMap_getK" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = ((AngularPixelMap const *)arg1)->getK(arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularPixelMap_getIntegrationFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularPixelMap *arg1 = (AngularPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:AngularPixelMap_getIntegrationFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AngularPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularPixelMap_getIntegrationFactor" "', argument " "1"" of type '" "AngularPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AngularPixelMap_getIntegrationFactor" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AngularPixelMap_getIntegrationFactor" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((AngularPixelMap const *)arg1)->getIntegrationFactor(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AngularPixelMap_getSolidAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AngularPixelMap *arg1 = (AngularPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AngularPixelMap_getSolidAngle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AngularPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AngularPixelMap_getSolidAngle" "', argument " "1"" of type '" "AngularPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< AngularPixelMap * >(argp1);
+  result = (double)((AngularPixelMap const *)arg1)->getSolidAngle();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *AngularPixelMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_AngularPixelMap, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IsGISAXSDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IsGISAXSDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IsGISAXSDetector")) SWIG_fail;
+  result = (IsGISAXSDetector *)new IsGISAXSDetector();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IsGISAXSDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IsGISAXSDetector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  size_t arg1 ;
+  double arg2 ;
+  double arg3 ;
+  size_t arg4 ;
+  double arg5 ;
+  double arg6 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  IsGISAXSDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:new_IsGISAXSDetector",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IsGISAXSDetector" "', argument " "1"" of type '" "size_t""'");
+  } 
+  arg1 = static_cast< size_t >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IsGISAXSDetector" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_IsGISAXSDetector" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_IsGISAXSDetector" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_IsGISAXSDetector" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "new_IsGISAXSDetector" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  result = (IsGISAXSDetector *)new IsGISAXSDetector(arg1,arg2,arg3,arg4,arg5,arg6);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IsGISAXSDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IsGISAXSDetector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IsGISAXSDetector *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IsGISAXSDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_IsGISAXSDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IsGISAXSDetector,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_IsGISAXSDetector" "', argument " "1"" of type '" "IsGISAXSDetector const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IsGISAXSDetector" "', argument " "1"" of type '" "IsGISAXSDetector const &""'"); 
+  }
+  arg1 = reinterpret_cast< IsGISAXSDetector * >(argp1);
+  result = (IsGISAXSDetector *)new IsGISAXSDetector((IsGISAXSDetector const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IsGISAXSDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IsGISAXSDetector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[7] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 6) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_IsGISAXSDetector__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IsGISAXSDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_IsGISAXSDetector__SWIG_2(self, args);
+    }
+  }
+  if (argc == 6) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_size_t(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              {
+                int res = SWIG_AsVal_double(argv[5], NULL);
+                _v = SWIG_CheckState(res);
+              }
+              if (_v) {
+                return _wrap_new_IsGISAXSDetector__SWIG_1(self, args);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_IsGISAXSDetector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IsGISAXSDetector::IsGISAXSDetector()\n"
+    "    IsGISAXSDetector::IsGISAXSDetector(size_t,double,double,size_t,double,double)\n"
+    "    IsGISAXSDetector::IsGISAXSDetector(IsGISAXSDetector const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IsGISAXSDetector_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IsGISAXSDetector *arg1 = (IsGISAXSDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IsGISAXSDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IsGISAXSDetector_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IsGISAXSDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IsGISAXSDetector_clone" "', argument " "1"" of type '" "IsGISAXSDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< IsGISAXSDetector * >(argp1);
+  result = (IsGISAXSDetector *)((IsGISAXSDetector const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IsGISAXSDetector, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IsGISAXSDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IsGISAXSDetector *arg1 = (IsGISAXSDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IsGISAXSDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IsGISAXSDetector, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IsGISAXSDetector" "', argument " "1"" of type '" "IsGISAXSDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< IsGISAXSDetector * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IsGISAXSDetector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IsGISAXSDetector, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Lattice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  kvector_t arg1 ;
+  kvector_t arg2 ;
+  kvector_t arg3 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Lattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_Lattice",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Lattice" "', argument " "1"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Lattice" "', argument " "1"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Lattice" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Lattice" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_Lattice" "', argument " "3"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Lattice" "', argument " "3"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (Lattice *)new Lattice(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Lattice, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Lattice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Lattice *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Lattice",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Lattice,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Lattice" "', argument " "1"" of type '" "Lattice const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Lattice" "', argument " "1"" of type '" "Lattice const &""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  result = (Lattice *)new Lattice((Lattice const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Lattice, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Lattice(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Lattice, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Lattice__SWIG_1(self, args);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_Lattice__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Lattice'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Lattice::Lattice(kvector_t const,kvector_t const,kvector_t const)\n"
+    "    Lattice::Lattice(Lattice const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Lattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Lattice",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Lattice" "', argument " "1"" of type '" "Lattice *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_createTransformedLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  Transform3D *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  SwigValueWrapper< Lattice > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice_createTransformedLattice",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_createTransformedLattice" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice_createTransformedLattice" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_createTransformedLattice" "', argument " "2"" of type '" "Transform3D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Transform3D * >(argp2);
+  result = ((Lattice const *)arg1)->createTransformedLattice((Transform3D const &)*arg2);
+  resultobj = SWIG_NewPointerObj((new Lattice(static_cast< const Lattice& >(result))), SWIGTYPE_p_Lattice, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_initialize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice_initialize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_initialize" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  ((Lattice const *)arg1)->initialize();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_getBasisVectorA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice_getBasisVectorA",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_getBasisVectorA" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  result = ((Lattice const *)arg1)->getBasisVectorA();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_getBasisVectorB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice_getBasisVectorB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_getBasisVectorB" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  result = ((Lattice const *)arg1)->getBasisVectorB();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_getBasisVectorC(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice_getBasisVectorC",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_getBasisVectorC" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  result = ((Lattice const *)arg1)->getBasisVectorC();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_getVolume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice_getVolume",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_getVolume" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  result = (double)((Lattice const *)arg1)->getVolume();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_getReciprocalLatticeBasis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  kvector_t arg2 ;
+  kvector_t arg3 ;
+  kvector_t arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  void *argp4 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:Lattice_getReciprocalLatticeBasis",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_getReciprocalLatticeBasis" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice_getReciprocalLatticeBasis" "', argument " "2"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_getReciprocalLatticeBasis" "', argument " "2"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Lattice_getReciprocalLatticeBasis" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_getReciprocalLatticeBasis" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  {
+    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "Lattice_getReciprocalLatticeBasis" "', argument " "4"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp4) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_getReciprocalLatticeBasis" "', argument " "4"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp4);
+      arg4 = *temp;
+      if (SWIG_IsNewObj(res4)) delete temp;
+    }
+  }
+  ((Lattice const *)arg1)->getReciprocalLatticeBasis(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_getNearestLatticeVectorCoordinates(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  SwigValueWrapper< BasicVector3D< int > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice_getNearestLatticeVectorCoordinates",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_getNearestLatticeVectorCoordinates" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice_getNearestLatticeVectorCoordinates" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_getNearestLatticeVectorCoordinates" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((Lattice const *)arg1)->getNearestLatticeVectorCoordinates(arg2);
+  resultobj = SWIG_NewPointerObj((new ivector_t(static_cast< const ivector_t& >(result))), SWIGTYPE_p_BasicVector3DT_int_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_getNearestReciprocalLatticeVectorCoordinates(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  SwigValueWrapper< BasicVector3D< int > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice_getNearestReciprocalLatticeVectorCoordinates",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_getNearestReciprocalLatticeVectorCoordinates" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice_getNearestReciprocalLatticeVectorCoordinates" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_getNearestReciprocalLatticeVectorCoordinates" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = ((Lattice const *)arg1)->getNearestReciprocalLatticeVectorCoordinates(arg2);
+  resultobj = SWIG_NewPointerObj((new ivector_t(static_cast< const ivector_t& >(result))), SWIGTYPE_p_BasicVector3DT_int_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_reciprocalLatticeVectorsWithinRadius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< kvector_t,std::allocator< kvector_t > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Lattice_reciprocalLatticeVectorsWithinRadius",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_reciprocalLatticeVectorsWithinRadius" "', argument " "1"" of type '" "Lattice const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice_reciprocalLatticeVectorsWithinRadius" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_reciprocalLatticeVectorsWithinRadius" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Lattice_reciprocalLatticeVectorsWithinRadius" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = ((Lattice const *)arg1)->reciprocalLatticeVectorsWithinRadius(arg2,arg3);
+  resultobj = swig::from(static_cast< std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_setSelectionRule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice *arg1 = (Lattice *) 0 ;
+  ISelectionRule *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice_setSelectionRule",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice_setSelectionRule" "', argument " "1"" of type '" "Lattice *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ISelectionRule,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice_setSelectionRule" "', argument " "2"" of type '" "ISelectionRule const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice_setSelectionRule" "', argument " "2"" of type '" "ISelectionRule const &""'"); 
+  }
+  arg2 = reinterpret_cast< ISelectionRule * >(argp2);
+  (arg1)->setSelectionRule((ISelectionRule const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_createFCCLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< Lattice > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice_createFCCLattice",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Lattice_createFCCLattice" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = Lattice::createFCCLattice(arg1);
+  resultobj = SWIG_NewPointerObj((new Lattice(static_cast< const Lattice& >(result))), SWIGTYPE_p_Lattice, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice_createTrigonalLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  SwigValueWrapper< Lattice > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice_createTrigonalLattice",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Lattice_createTrigonalLattice" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Lattice_createTrigonalLattice" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = Lattice::createTrigonalLattice(arg1,arg2);
+  resultobj = SWIG_NewPointerObj((new Lattice(static_cast< const Lattice& >(result))), SWIGTYPE_p_Lattice, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Lattice_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Lattice, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Lattice1DParameters__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice1DParameters *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Lattice1DParameters")) SWIG_fail;
+  result = (Lattice1DParameters *)new Lattice1DParameters();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Lattice1DParameters, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Lattice1DParameters__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Lattice1DParameters *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Lattice1DParameters",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Lattice1DParameters" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Lattice1DParameters" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (Lattice1DParameters *)new Lattice1DParameters(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Lattice1DParameters, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Lattice1DParameters(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Lattice1DParameters__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_Lattice1DParameters__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Lattice1DParameters'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Lattice1DParameters::Lattice1DParameters()\n"
+    "    Lattice1DParameters::Lattice1DParameters(double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice1DParameters_m_length_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice1DParameters *arg1 = (Lattice1DParameters *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice1DParameters_m_length_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice1DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice1DParameters_m_length_set" "', argument " "1"" of type '" "Lattice1DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice1DParameters * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Lattice1DParameters_m_length_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_length = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice1DParameters_m_length_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice1DParameters *arg1 = (Lattice1DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice1DParameters_m_length_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice1DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice1DParameters_m_length_get" "', argument " "1"" of type '" "Lattice1DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice1DParameters * >(argp1);
+  result = (double) ((arg1)->m_length);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice1DParameters_m_xi_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice1DParameters *arg1 = (Lattice1DParameters *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice1DParameters_m_xi_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice1DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice1DParameters_m_xi_set" "', argument " "1"" of type '" "Lattice1DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice1DParameters * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Lattice1DParameters_m_xi_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_xi = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice1DParameters_m_xi_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice1DParameters *arg1 = (Lattice1DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice1DParameters_m_xi_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice1DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice1DParameters_m_xi_get" "', argument " "1"" of type '" "Lattice1DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice1DParameters * >(argp1);
+  result = (double) ((arg1)->m_xi);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Lattice1DParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice1DParameters *arg1 = (Lattice1DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Lattice1DParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice1DParameters, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Lattice1DParameters" "', argument " "1"" of type '" "Lattice1DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice1DParameters * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Lattice1DParameters_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Lattice1DParameters, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Lattice2DParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Lattice2DParameters")) SWIG_fail;
+  result = (Lattice2DParameters *)new Lattice2DParameters();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Lattice2DParameters, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_getUnitCellArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice2DParameters_getUnitCellArea",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_getUnitCellArea" "', argument " "1"" of type '" "Lattice2DParameters const *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  result = (double)((Lattice2DParameters const *)arg1)->getUnitCellArea();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_length_1_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice2DParameters_m_length_1_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_length_1_set" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Lattice2DParameters_m_length_1_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_length_1 = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_length_1_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice2DParameters_m_length_1_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_length_1_get" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  result = (double) ((arg1)->m_length_1);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_length_2_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice2DParameters_m_length_2_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_length_2_set" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Lattice2DParameters_m_length_2_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_length_2 = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_length_2_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice2DParameters_m_length_2_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_length_2_get" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  result = (double) ((arg1)->m_length_2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_angle_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice2DParameters_m_angle_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_angle_set" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Lattice2DParameters_m_angle_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_angle = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_angle_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice2DParameters_m_angle_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_angle_get" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  result = (double) ((arg1)->m_angle);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_xi_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Lattice2DParameters_m_xi_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_xi_set" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Lattice2DParameters_m_xi_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->m_xi = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Lattice2DParameters_m_xi_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Lattice2DParameters_m_xi_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice2DParameters_m_xi_get" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  result = (double) ((arg1)->m_xi);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Lattice2DParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Lattice2DParameters *arg1 = (Lattice2DParameters *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Lattice2DParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Lattice2DParameters, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Lattice2DParameters" "', argument " "1"" of type '" "Lattice2DParameters *""'"); 
+  }
+  arg1 = reinterpret_cast< Lattice2DParameters * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Lattice2DParameters_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Lattice2DParameters, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Layer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Layer")) SWIG_fail;
+  result = (Layer *)new Layer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Layer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Layer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Layer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Layer" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Layer" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Layer" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (Layer *)new Layer((IMaterial const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Layer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Layer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Layer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Layer" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Layer" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  result = (Layer *)new Layer((IMaterial const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Layer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Layer__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IMaterial, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Layer__SWIG_2(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IMaterial, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_Layer__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Layer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Layer::Layer()\n"
+    "    Layer::Layer(IMaterial const &,double)\n"
+    "    Layer::Layer(IMaterial const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Layer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Layer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Layer" "', argument " "1"" of type '" "Layer *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Layer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_clone" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = (Layer *)((Layer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Layer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_cloneInvertB" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = (Layer *)((Layer const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_accept" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Layer_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((Layer const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_to_str__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_to_str",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_to_str" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Layer_to_str" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = ((Layer const *)arg1)->to_str(arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_to_str__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_to_str",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_to_str" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = ((Layer const *)arg1)->to_str();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_to_str(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Layer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Layer_to_str__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Layer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Layer_to_str__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Layer_to_str'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Layer::to_str(int) const\n"
+    "    Layer::to_str() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_setThickness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_setThickness",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_setThickness" "', argument " "1"" of type '" "Layer *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Layer_setThickness" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setThickness(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getThickness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_getThickness",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getThickness" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = (double)((Layer const *)arg1)->getThickness();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_setMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_setMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_setMaterial" "', argument " "1"" of type '" "Layer *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Layer_setMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Layer_setMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_getMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getMaterial" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = (IMaterial *)((Layer const *)arg1)->getMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getRefractiveIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_getRefractiveIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getRefractiveIndex" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = ((Layer const *)arg1)->getRefractiveIndex();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getRefractiveIndex2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_getRefractiveIndex2",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getRefractiveIndex2" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = ((Layer const *)arg1)->getRefractiveIndex2();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_addLayout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  ILayout *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_addLayout",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_addLayout" "', argument " "1"" of type '" "Layer *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ILayout,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Layer_addLayout" "', argument " "2"" of type '" "ILayout const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Layer_addLayout" "', argument " "2"" of type '" "ILayout const &""'"); 
+  }
+  arg2 = reinterpret_cast< ILayout * >(argp2);
+  (arg1)->addLayout((ILayout const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getNumberOfLayouts(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_getNumberOfLayouts",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getNumberOfLayouts" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = ((Layer const *)arg1)->getNumberOfLayouts();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getLayout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ILayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_getLayout",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getLayout" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Layer_getLayout" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (ILayout *)((Layer const *)arg1)->getLayout(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ILayout, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_hasComputation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_hasComputation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_hasComputation" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = (bool)((Layer const *)arg1)->hasComputation();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getTotalParticleSurfaceDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_getTotalParticleSurfaceDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getTotalParticleSurfaceDensity" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Layer_getTotalParticleSurfaceDensity" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((Layer const *)arg1)->getTotalParticleSurfaceDensity(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getTotalAbundance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_getTotalAbundance",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getTotalAbundance" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = (double)((Layer const *)arg1)->getTotalAbundance();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_setNumberOfLayers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Layer_setNumberOfLayers",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_setNumberOfLayers" "', argument " "1"" of type '" "Layer *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Layer_setNumberOfLayers" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  (arg1)->setNumberOfLayers(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Layer_getNumberOfLayers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Layer *arg1 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Layer_getNumberOfLayers",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Layer_getNumberOfLayers" "', argument " "1"" of type '" "Layer const *""'"); 
+  }
+  arg1 = reinterpret_cast< Layer * >(argp1);
+  result = ((Layer const *)arg1)->getNumberOfLayers();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Layer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Layer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IRoughness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRoughness *arg1 = (IRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IRoughness",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRoughness, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IRoughness" "', argument " "1"" of type '" "IRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< IRoughness * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IRoughness_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IRoughness *arg1 = (IRoughness *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IRoughness_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRoughness_accept" "', argument " "1"" of type '" "IRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< IRoughness * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IRoughness_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((IRoughness const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IRoughness_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IRoughness, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_LayerRoughness")) SWIG_fail;
+  result = (LayerRoughness *)new LayerRoughness();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  LayerRoughness *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_LayerRoughness",&obj0,&obj1,&obj2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_LayerRoughness" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_LayerRoughness" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_LayerRoughness" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (LayerRoughness *)new LayerRoughness(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_LayerRoughness__SWIG_0(self, args);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_LayerRoughness__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_LayerRoughness'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    LayerRoughness::LayerRoughness()\n"
+    "    LayerRoughness::LayerRoughness(double,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  LayerRoughness *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:LayerRoughness_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_clone" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (LayerRoughness *)((LayerRoughness const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:LayerRoughness_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_accept" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((LayerRoughness const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getSpectralFun(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:LayerRoughness_getSpectralFun",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getSpectralFun" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_getSpectralFun" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LayerRoughness_getSpectralFun" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((LayerRoughness const *)arg1)->getSpectralFun(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getCorrFun(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:LayerRoughness_getCorrFun",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getCorrFun" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_getCorrFun" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LayerRoughness_getCorrFun" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (double)((LayerRoughness const *)arg1)->getCorrFun(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_setSigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:LayerRoughness_setSigma",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setSigma" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setSigma" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setSigma(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getSigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:LayerRoughness_getSigma",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getSigma" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (double)((LayerRoughness const *)arg1)->getSigma();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_setHurstParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:LayerRoughness_setHurstParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setHurstParameter" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setHurstParameter" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setHurstParameter(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getHurstParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:LayerRoughness_getHurstParameter",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getHurstParameter" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (double)((LayerRoughness const *)arg1)->getHurstParameter();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_setLatteralCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:LayerRoughness_setLatteralCorrLength",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setLatteralCorrLength" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "LayerRoughness_setLatteralCorrLength" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setLatteralCorrLength(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_LayerRoughness_getLatteralCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:LayerRoughness_getLatteralCorrLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_getLatteralCorrLength" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  result = (double)((LayerRoughness const *)arg1)->getLatteralCorrLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_LayerRoughness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  LayerRoughness *arg1 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_LayerRoughness",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_LayerRoughness, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_LayerRoughness" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+  }
+  arg1 = reinterpret_cast< LayerRoughness * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *LayerRoughness_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_LayerRoughness, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Line(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  Geometry::Line *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_Line",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Line" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Line" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Line" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_Line" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (Geometry::Line *)new Geometry::Line(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Line, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Line_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Line *arg1 = (Geometry::Line *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::Line *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Line_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Line, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Line_clone" "', argument " "1"" of type '" "Geometry::Line const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Line * >(argp1);
+  result = (Geometry::Line *)((Geometry::Line const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Line, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Line_contains__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Line *arg1 = (Geometry::Line *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Line_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Line, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Line_contains" "', argument " "1"" of type '" "Geometry::Line const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Line * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Line_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Line_contains" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((Geometry::Line const *)arg1)->contains(arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Line_contains__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Line *arg1 = (Geometry::Line *) 0 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Line_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Line, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Line_contains" "', argument " "1"" of type '" "Geometry::Line const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Line * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Line_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Line_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Line_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Line_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (bool)((Geometry::Line const *)arg1)->contains((Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Line_contains(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Line, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_Line_contains__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Line, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Line_contains__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Line_contains'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::Line::contains(double,double) const\n"
+    "    Geometry::Line::contains(Bin1D const &,Bin1D const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Line(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Line *arg1 = (Geometry::Line *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Line",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Line, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Line" "', argument " "1"" of type '" "Geometry::Line *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Line * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Line_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Geometry__Line, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_VerticalLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::VerticalLine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_VerticalLine",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_VerticalLine" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (Geometry::VerticalLine *)new Geometry::VerticalLine(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__VerticalLine, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VerticalLine_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::VerticalLine *arg1 = (Geometry::VerticalLine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::VerticalLine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VerticalLine_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__VerticalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VerticalLine_clone" "', argument " "1"" of type '" "Geometry::VerticalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::VerticalLine * >(argp1);
+  result = (Geometry::VerticalLine *)((Geometry::VerticalLine const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__VerticalLine, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VerticalLine_contains__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::VerticalLine *arg1 = (Geometry::VerticalLine *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:VerticalLine_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__VerticalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VerticalLine_contains" "', argument " "1"" of type '" "Geometry::VerticalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::VerticalLine * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VerticalLine_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VerticalLine_contains" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((Geometry::VerticalLine const *)arg1)->contains(arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VerticalLine_contains__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::VerticalLine *arg1 = (Geometry::VerticalLine *) 0 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:VerticalLine_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__VerticalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VerticalLine_contains" "', argument " "1"" of type '" "Geometry::VerticalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::VerticalLine * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VerticalLine_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VerticalLine_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VerticalLine_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VerticalLine_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (bool)((Geometry::VerticalLine const *)arg1)->contains((Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VerticalLine_contains(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__VerticalLine, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VerticalLine_contains__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__VerticalLine, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_VerticalLine_contains__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'VerticalLine_contains'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::VerticalLine::contains(double,double) const\n"
+    "    Geometry::VerticalLine::contains(Bin1D const &,Bin1D const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VerticalLine_getXpos(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::VerticalLine *arg1 = (Geometry::VerticalLine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:VerticalLine_getXpos",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__VerticalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VerticalLine_getXpos" "', argument " "1"" of type '" "Geometry::VerticalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::VerticalLine * >(argp1);
+  result = (double)((Geometry::VerticalLine const *)arg1)->getXpos();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_VerticalLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::VerticalLine *arg1 = (Geometry::VerticalLine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_VerticalLine",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__VerticalLine, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VerticalLine" "', argument " "1"" of type '" "Geometry::VerticalLine *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::VerticalLine * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *VerticalLine_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Geometry__VerticalLine, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_HorizontalLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::HorizontalLine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_HorizontalLine",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_HorizontalLine" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (Geometry::HorizontalLine *)new Geometry::HorizontalLine(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__HorizontalLine, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HorizontalLine_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::HorizontalLine *arg1 = (Geometry::HorizontalLine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::HorizontalLine *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:HorizontalLine_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__HorizontalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HorizontalLine_clone" "', argument " "1"" of type '" "Geometry::HorizontalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::HorizontalLine * >(argp1);
+  result = (Geometry::HorizontalLine *)((Geometry::HorizontalLine const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__HorizontalLine, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HorizontalLine_contains__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::HorizontalLine *arg1 = (Geometry::HorizontalLine *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:HorizontalLine_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__HorizontalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HorizontalLine_contains" "', argument " "1"" of type '" "Geometry::HorizontalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::HorizontalLine * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "HorizontalLine_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "HorizontalLine_contains" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((Geometry::HorizontalLine const *)arg1)->contains(arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HorizontalLine_contains__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::HorizontalLine *arg1 = (Geometry::HorizontalLine *) 0 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:HorizontalLine_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__HorizontalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HorizontalLine_contains" "', argument " "1"" of type '" "Geometry::HorizontalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::HorizontalLine * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "HorizontalLine_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "HorizontalLine_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "HorizontalLine_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "HorizontalLine_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (bool)((Geometry::HorizontalLine const *)arg1)->contains((Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_HorizontalLine_contains(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__HorizontalLine, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_HorizontalLine_contains__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__HorizontalLine, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_HorizontalLine_contains__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'HorizontalLine_contains'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::HorizontalLine::contains(double,double) const\n"
+    "    Geometry::HorizontalLine::contains(Bin1D const &,Bin1D const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_HorizontalLine_getYpos(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::HorizontalLine *arg1 = (Geometry::HorizontalLine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:HorizontalLine_getYpos",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__HorizontalLine, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HorizontalLine_getYpos" "', argument " "1"" of type '" "Geometry::HorizontalLine const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::HorizontalLine * >(argp1);
+  result = (double)((Geometry::HorizontalLine const *)arg1)->getYpos();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_HorizontalLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::HorizontalLine *arg1 = (Geometry::HorizontalLine *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_HorizontalLine",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__HorizontalLine, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_HorizontalLine" "', argument " "1"" of type '" "Geometry::HorizontalLine *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::HorizontalLine * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *HorizontalLine_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Geometry__HorizontalLine, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_MesoCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IClusteredParticles *arg1 = 0 ;
+  IFormFactor *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  MesoCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_MesoCrystal",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IClusteredParticles,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_MesoCrystal" "', argument " "1"" of type '" "IClusteredParticles const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_MesoCrystal" "', argument " "1"" of type '" "IClusteredParticles const &""'"); 
+  }
+  arg1 = reinterpret_cast< IClusteredParticles * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_MesoCrystal" "', argument " "2"" of type '" "IFormFactor &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_MesoCrystal" "', argument " "2"" of type '" "IFormFactor &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  result = (MesoCrystal *)new MesoCrystal((IClusteredParticles const &)*arg1,*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MesoCrystal, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_MesoCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_MesoCrystal",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MesoCrystal" "', argument " "1"" of type '" "MesoCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MesoCrystal_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  MesoCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MesoCrystal_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MesoCrystal_clone" "', argument " "1"" of type '" "MesoCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  result = (MesoCrystal *)((MesoCrystal const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MesoCrystal_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  MesoCrystal *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MesoCrystal_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MesoCrystal_cloneInvertB" "', argument " "1"" of type '" "MesoCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  result = (MesoCrystal *)((MesoCrystal const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MesoCrystal_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MesoCrystal_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MesoCrystal_accept" "', argument " "1"" of type '" "MesoCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MesoCrystal_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((MesoCrystal const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MesoCrystal_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MesoCrystal_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MesoCrystal_setAmbientMaterial" "', argument " "1"" of type '" "MesoCrystal *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MesoCrystal_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MesoCrystal_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MesoCrystal_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MesoCrystal_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MesoCrystal_getAmbientMaterial" "', argument " "1"" of type '" "MesoCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  result = (IMaterial *)((MesoCrystal const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MesoCrystal_createTransformedFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  IRotation *arg2 = (IRotation *) 0 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Swig::Director *director = 0;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MesoCrystal_createTransformedFormFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MesoCrystal_createTransformedFormFactor" "', argument " "1"" of type '" "MesoCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MesoCrystal_createTransformedFormFactor" "', argument " "2"" of type '" "IRotation const *""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MesoCrystal_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MesoCrystal_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (IFormFactor *)((MesoCrystal const *)arg1)->createTransformedFormFactor((IRotation const *)arg2,arg3);
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MesoCrystal_getClusteredParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MesoCrystal *arg1 = (MesoCrystal *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IClusteredParticles *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MesoCrystal_getClusteredParticles",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MesoCrystal, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MesoCrystal_getClusteredParticles" "', argument " "1"" of type '" "MesoCrystal const *""'"); 
+  }
+  arg1 = reinterpret_cast< MesoCrystal * >(argp1);
+  result = (IClusteredParticles *)((MesoCrystal const *)arg1)->getClusteredParticles();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IClusteredParticles, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MesoCrystal_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MesoCrystal, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *VERBOSE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "VERBOSE",SWIG_From_int(static_cast< int >(MSG::VERBOSE)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *DEBUG2_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "DEBUG2",SWIG_From_int(static_cast< int >(MSG::DEBUG2)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *DEBUG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "DEBUG",SWIG_From_int(static_cast< int >(MSG::DEBUG)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *INFO_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "INFO",SWIG_From_int(static_cast< int >(MSG::INFO)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *WARNING_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "WARNING",SWIG_From_int(static_cast< int >(MSG::WARNING)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *ERROR_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "ERROR",SWIG_From_int(static_cast< int >(MSG::ERROR)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *FATAL_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "FATAL",SWIG_From_int(static_cast< int >(MSG::FATAL)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Logger(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MSG::EMessageLevel arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  MSG::Logger *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Logger",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Logger" "', argument " "1"" of type '" "MSG::EMessageLevel""'");
+  } 
+  arg1 = static_cast< MSG::EMessageLevel >(val1);
+  result = (MSG::Logger *)new MSG::Logger(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MSG__Logger, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Logger(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MSG::Logger *arg1 = (MSG::Logger *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Logger",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MSG__Logger, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Logger" "', argument " "1"" of type '" "MSG::Logger *""'"); 
+  }
+  arg1 = reinterpret_cast< MSG::Logger * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Logger_NowTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MSG::Logger *arg1 = (MSG::Logger *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Logger_NowTime",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MSG__Logger, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Logger_NowTime" "', argument " "1"" of type '" "MSG::Logger *""'"); 
+  }
+  arg1 = reinterpret_cast< MSG::Logger * >(argp1);
+  result = (arg1)->NowTime();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Logger_ToString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MSG::Logger *arg1 = (MSG::Logger *) 0 ;
+  MSG::EMessageLevel arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Logger_ToString",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MSG__Logger, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Logger_ToString" "', argument " "1"" of type '" "MSG::Logger *""'"); 
+  }
+  arg1 = reinterpret_cast< MSG::Logger * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Logger_ToString" "', argument " "2"" of type '" "MSG::EMessageLevel""'");
+  } 
+  arg2 = static_cast< MSG::EMessageLevel >(val2);
+  result = (std::string *) &(arg1)->ToString(arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Logger_SetLevel__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MSG::EMessageLevel arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Logger_SetLevel",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Logger_SetLevel" "', argument " "1"" of type '" "MSG::EMessageLevel""'");
+  } 
+  arg1 = static_cast< MSG::EMessageLevel >(val1);
+  MSG::Logger::SetLevel(arg1);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Logger_SetLevel__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Logger_SetLevel",&obj0)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Logger_SetLevel" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Logger_SetLevel" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  MSG::Logger::SetLevel((std::string const &)*arg1);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Logger_SetLevel(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_Logger_SetLevel__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Logger_SetLevel__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Logger_SetLevel'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MSG::Logger::SetLevel(MSG::EMessageLevel)\n"
+    "    MSG::Logger::SetLevel(std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Logger_GetLevel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MSG::EMessageLevel result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":Logger_GetLevel")) SWIG_fail;
+  result = (MSG::EMessageLevel)MSG::Logger::GetLevel();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Logger_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MSG__Logger, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_SetLevel__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MSG::EMessageLevel arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SetLevel",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SetLevel" "', argument " "1"" of type '" "MSG::EMessageLevel""'");
+  } 
+  arg1 = static_cast< MSG::EMessageLevel >(val1);
+  MSG::SetLevel(arg1);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SetLevel__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SetLevel",&obj0)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SetLevel" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SetLevel" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  MSG::SetLevel((std::string const &)*arg1);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SetLevel(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_SetLevel__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SetLevel__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SetLevel'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MSG::SetLevel(MSG::EMessageLevel)\n"
+    "    MSG::SetLevel(std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_MultiLayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_MultiLayer")) SWIG_fail;
+  result = (MultiLayer *)new MultiLayer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_MultiLayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_MultiLayer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MultiLayer" "', argument " "1"" of type '" "MultiLayer *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_accept" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MultiLayer_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((MultiLayer const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_to_str__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_to_str",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_to_str" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_to_str" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = ((MultiLayer const *)arg1)->to_str(arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_to_str__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_to_str",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_to_str" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = ((MultiLayer const *)arg1)->to_str();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_to_str(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MultiLayer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_MultiLayer_to_str__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_MultiLayer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_MultiLayer_to_str__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MultiLayer_to_str'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MultiLayer::to_str(int) const\n"
+    "    MultiLayer::to_str() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getNumberOfLayers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_getNumberOfLayers",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getNumberOfLayers" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = ((MultiLayer const *)arg1)->getNumberOfLayers();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getNumberOfInterfaces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_getNumberOfInterfaces",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getNumberOfInterfaces" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = ((MultiLayer const *)arg1)->getNumberOfInterfaces();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_addLayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  Layer *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_addLayer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_addLayer" "', argument " "1"" of type '" "MultiLayer *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Layer,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MultiLayer_addLayer" "', argument " "2"" of type '" "Layer const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MultiLayer_addLayer" "', argument " "2"" of type '" "Layer const &""'"); 
+  }
+  arg2 = reinterpret_cast< Layer * >(argp2);
+  (arg1)->addLayer((Layer const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_addLayerWithTopRoughness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  Layer *arg2 = 0 ;
+  LayerRoughness *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MultiLayer_addLayerWithTopRoughness",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "1"" of type '" "MultiLayer *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Layer,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "2"" of type '" "Layer const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "2"" of type '" "Layer const &""'"); 
+  }
+  arg2 = reinterpret_cast< Layer * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_LayerRoughness,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "3"" of type '" "LayerRoughness const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "3"" of type '" "LayerRoughness const &""'"); 
+  }
+  arg3 = reinterpret_cast< LayerRoughness * >(argp3);
+  (arg1)->addLayerWithTopRoughness((Layer const &)*arg2,(LayerRoughness const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getLayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Layer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_getLayer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getLayer" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_getLayer" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (Layer *)((MultiLayer const *)arg1)->getLayer(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getLayerInterface(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  LayerInterface *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_getLayerInterface",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getLayerInterface" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_getLayerInterface" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (LayerInterface *)((MultiLayer const *)arg1)->getLayerInterface(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerInterface, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getLayerBottomZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_getLayerBottomZ",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getLayerBottomZ" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_getLayerBottomZ" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((MultiLayer const *)arg1)->getLayerBottomZ(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getLayerThickness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_getLayerThickness",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getLayerThickness" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_getLayerThickness" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((MultiLayer const *)arg1)->getLayerThickness(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getLayerTopInterface(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  LayerInterface *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_getLayerTopInterface",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getLayerTopInterface" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_getLayerTopInterface" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (LayerInterface *)((MultiLayer const *)arg1)->getLayerTopInterface(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerInterface, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getLayerBottomInterface(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  LayerInterface *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_getLayerBottomInterface",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getLayerBottomInterface" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_getLayerBottomInterface" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (LayerInterface *)((MultiLayer const *)arg1)->getLayerBottomInterface(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_LayerInterface, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_clear" "', argument " "1"" of type '" "MultiLayer *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  MultiLayer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_clone" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (MultiLayer *)((MultiLayer const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  MultiLayer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_cloneInvertB" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (MultiLayer *)((MultiLayer const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_setCrossCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_setCrossCorrLength",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_setCrossCorrLength" "', argument " "1"" of type '" "MultiLayer *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_setCrossCorrLength" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setCrossCorrLength(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getCrossCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_getCrossCorrLength",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getCrossCorrLength" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (double)((MultiLayer const *)arg1)->getCrossCorrLength();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getCrossCorrSpectralFun(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  kvector_t arg2 ;
+  size_t arg3 ;
+  size_t arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  size_t val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:MultiLayer_getCrossCorrSpectralFun",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getCrossCorrSpectralFun" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MultiLayer_getCrossCorrSpectralFun" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MultiLayer_getCrossCorrSpectralFun" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MultiLayer_getCrossCorrSpectralFun" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  ecode4 = SWIG_AsVal_size_t(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "MultiLayer_getCrossCorrSpectralFun" "', argument " "4"" of type '" "size_t""'");
+  } 
+  arg4 = static_cast< size_t >(val4);
+  result = (double)((MultiLayer const *)arg1)->getCrossCorrSpectralFun(arg2,arg3,arg4);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_setLayerThickness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MultiLayer_setLayerThickness",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_setLayerThickness" "', argument " "1"" of type '" "MultiLayer *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_setLayerThickness" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MultiLayer_setLayerThickness" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setLayerThickness(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_getIndexOfLayer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  Layer *arg2 = (Layer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_getIndexOfLayer",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_getIndexOfLayer" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_Layer, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MultiLayer_getIndexOfLayer" "', argument " "2"" of type '" "Layer const *""'"); 
+  }
+  arg2 = reinterpret_cast< Layer * >(argp2);
+  result = (int)((MultiLayer const *)arg1)->getIndexOfLayer((Layer const *)arg2);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_requiresMatrixRTCoefficients(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_requiresMatrixRTCoefficients",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_requiresMatrixRTCoefficients" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (bool)((MultiLayer const *)arg1)->requiresMatrixRTCoefficients();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_zToLayerIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_zToLayerIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_zToLayerIndex" "', argument " "1"" of type '" "MultiLayer *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_zToLayerIndex" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (arg1)->zToLayerIndex(arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_containsMagneticMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_containsMagneticMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_containsMagneticMaterial" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (bool)((MultiLayer const *)arg1)->containsMagneticMaterial();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_hasRoughness(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_hasRoughness",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_hasRoughness" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (bool)((MultiLayer const *)arg1)->hasRoughness();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MultiLayer_totalNofLayouts(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = (MultiLayer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_totalNofLayouts",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_totalNofLayouts" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = ((MultiLayer const *)arg1)->totalNofLayouts();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MultiLayer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MultiLayer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_OffSpecSimulation__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_OffSpecSimulation")) SWIG_fail;
+  result = (OffSpecSimulation *)new OffSpecSimulation();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OffSpecSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_OffSpecSimulation__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MultiLayer *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OffSpecSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_OffSpecSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_MultiLayer,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_OffSpecSimulation" "', argument " "1"" of type '" "MultiLayer const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_OffSpecSimulation" "', argument " "1"" of type '" "MultiLayer const &""'"); 
+  }
+  arg1 = reinterpret_cast< MultiLayer * >(argp1);
+  result = (OffSpecSimulation *)new OffSpecSimulation((MultiLayer const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OffSpecSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_OffSpecSimulation__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::shared_ptr< IMultiLayerBuilder > arg1 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OffSpecSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_OffSpecSimulation",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t,  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_OffSpecSimulation" "', argument " "1"" of type '" "std::shared_ptr< IMultiLayerBuilder > const""'"); 
+    }
+    if (argp1) arg1 = *(reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp1));
+    if (newmem & SWIG_CAST_NEW_MEMORY) delete reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp1);
+  }
+  result = (OffSpecSimulation *)new OffSpecSimulation(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OffSpecSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_OffSpecSimulation(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_OffSpecSimulation__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_MultiLayer, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_OffSpecSimulation__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_OffSpecSimulation__SWIG_2(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_OffSpecSimulation'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OffSpecSimulation::OffSpecSimulation()\n"
+    "    OffSpecSimulation::OffSpecSimulation(MultiLayer const &)\n"
+    "    OffSpecSimulation::OffSpecSimulation(std::shared_ptr< IMultiLayerBuilder > const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_OffSpecSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_OffSpecSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OffSpecSimulation" "', argument " "1"" of type '" "OffSpecSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OffSpecSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:OffSpecSimulation_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_clone" "', argument " "1"" of type '" "OffSpecSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  result = (OffSpecSimulation *)((OffSpecSimulation const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_prepareSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:OffSpecSimulation_prepareSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_prepareSimulation" "', argument " "1"" of type '" "OffSpecSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  (arg1)->prepareSimulation();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_numberOfSimulationElements(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:OffSpecSimulation_numberOfSimulationElements",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_numberOfSimulationElements" "', argument " "1"" of type '" "OffSpecSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  result = (int)((OffSpecSimulation const *)arg1)->numberOfSimulationElements();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_getDetectorIntensity__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  IDetector2D::EAxesUnits arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:OffSpecSimulation_getDetectorIntensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_getDetectorIntensity" "', argument " "1"" of type '" "OffSpecSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OffSpecSimulation_getDetectorIntensity" "', argument " "2"" of type '" "IDetector2D::EAxesUnits""'");
+  } 
+  arg2 = static_cast< IDetector2D::EAxesUnits >(val2);
+  result = (OutputData< double > *)((OffSpecSimulation const *)arg1)->getDetectorIntensity(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_getDetectorIntensity__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:OffSpecSimulation_getDetectorIntensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_getDetectorIntensity" "', argument " "1"" of type '" "OffSpecSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  result = (OutputData< double > *)((OffSpecSimulation const *)arg1)->getDetectorIntensity();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_getDetectorIntensity(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OffSpecSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_OffSpecSimulation_getDetectorIntensity__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OffSpecSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_OffSpecSimulation_getDetectorIntensity__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'OffSpecSimulation_getDetectorIntensity'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OffSpecSimulation::getDetectorIntensity(IDetector2D::EAxesUnits) const\n"
+    "    OffSpecSimulation::getDetectorIntensity() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_getIntensityData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Histogram2D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:OffSpecSimulation_getIntensityData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_getIntensityData" "', argument " "1"" of type '" "OffSpecSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  result = (Histogram2D *)((OffSpecSimulation const *)arg1)->getIntensityData();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Histogram2D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_setBeamParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  double arg2 ;
+  IAxis *arg3 = 0 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:OffSpecSimulation_setBeamParameters",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_setBeamParameters" "', argument " "1"" of type '" "OffSpecSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OffSpecSimulation_setBeamParameters" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OffSpecSimulation_setBeamParameters" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OffSpecSimulation_setBeamParameters" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  arg3 = reinterpret_cast< IAxis * >(argp3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "OffSpecSimulation_setBeamParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setBeamParameters(arg2,(IAxis const &)*arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_OffSpecSimulation_setDetectorParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OffSpecSimulation *arg1 = (OffSpecSimulation *) 0 ;
+  size_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  size_t arg5 ;
+  double arg6 ;
+  double arg7 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  size_t val5 ;
+  int ecode5 = 0 ;
+  double val6 ;
+  int ecode6 = 0 ;
+  double val7 ;
+  int ecode7 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  PyObject * obj6 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:OffSpecSimulation_setDetectorParameters",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OffSpecSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OffSpecSimulation_setDetectorParameters" "', argument " "1"" of type '" "OffSpecSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< OffSpecSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OffSpecSimulation_setDetectorParameters" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "OffSpecSimulation_setDetectorParameters" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "OffSpecSimulation_setDetectorParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_size_t(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OffSpecSimulation_setDetectorParameters" "', argument " "5"" of type '" "size_t""'");
+  } 
+  arg5 = static_cast< size_t >(val5);
+  ecode6 = SWIG_AsVal_double(obj5, &val6);
+  if (!SWIG_IsOK(ecode6)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "OffSpecSimulation_setDetectorParameters" "', argument " "6"" of type '" "double""'");
+  } 
+  arg6 = static_cast< double >(val6);
+  ecode7 = SWIG_AsVal_double(obj6, &val7);
+  if (!SWIG_IsOK(ecode7)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "OffSpecSimulation_setDetectorParameters" "', argument " "7"" of type '" "double""'");
+  } 
+  arg7 = static_cast< double >(val7);
+  (arg1)->setDetectorParameters(arg2,arg3,arg4,arg5,arg6,arg7);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *OffSpecSimulation_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_OffSpecSimulation, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IntensityData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IntensityData")) SWIG_fail;
+  result = (OutputData< double > *)new OutputData< double >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IntensityData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IntensityData",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntensityData" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_clone" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (OutputData< double > *)((OutputData< double > const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_copyFrom(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_copyFrom",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_copyFrom" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_copyFrom" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_copyFrom" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  (arg1)->copyFrom((OutputData< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_meanValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_meanValues",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_meanValues" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (OutputData< double > *)((OutputData< double > const *)arg1)->meanValues();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_addAxis__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  IAxis *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_addAxis",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_addAxis" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_addAxis" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_addAxis" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  (arg1)->addAxis((IAxis const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_addAxis__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  std::string *arg2 = 0 ;
+  size_t arg3 ;
+  double arg4 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:IntensityData_addAxis",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_addAxis" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_addAxis" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_addAxis" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntensityData_addAxis" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IntensityData_addAxis" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "IntensityData_addAxis" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  (arg1)->addAxis((std::string const &)*arg2,arg3,arg4,arg5);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_addAxis(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IntensityData_addAxis__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_IntensityData_addAxis__SWIG_1(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IntensityData_addAxis'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OutputData< double >::addAxis(IAxis const &)\n"
+    "    OutputData< double >::addAxis(std::string const &,size_t,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxis__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_getAxis",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxis" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxis" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IAxis *) &((OutputData< double > const *)arg1)->getAxis(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxis__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_getAxis",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxis" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_getAxis" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_getAxis" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (IAxis *) &((OutputData< double > const *)arg1)->getAxis((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxis(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IntensityData_getAxis__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_IntensityData_getAxis__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IntensityData_getAxis'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OutputData< double >::getAxis(size_t) const\n"
+    "    OutputData< double >::getAxis(std::string const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getRank(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_getRank",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getRank" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = ((OutputData< double > const *)arg1)->getRank();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAllocatedSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_getAllocatedSize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAllocatedSize" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = ((OutputData< double > const *)arg1)->getAllocatedSize();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAllSizes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< size_t,std::allocator< size_t > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_getAllSizes",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAllSizes" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = ((OutputData< double > const *)arg1)->getAllSizes();
+  resultobj = SWIG_NewPointerObj((new std::vector< size_t,std::allocator< size_t > >(static_cast< const std::vector< size_t,std::allocator< size_t > >& >(result))), SWIGTYPE_p_std__vectorT_size_t_std__allocatorT_size_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getRawDataVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_getRawDataVector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getRawDataVector" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = ((OutputData< double > const *)arg1)->getRawDataVector();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_fillRawDataArray(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_fillRawDataArray",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_fillRawDataArray" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_fillRawDataArray" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  ((OutputData< double > const *)arg1)->fillRawDataArray(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_totalSum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_totalSum",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_totalSum" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (double)((OutputData< double > const *)arg1)->totalSum();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_begin__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< OutputDataIterator< double,OutputData< double > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_begin" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj((new OutputData< double >::iterator(static_cast< const OutputData< double >::iterator& >(result))), SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_begin__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< OutputDataIterator< double const,OutputData< double > const > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_begin" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = ((OutputData< double > const *)arg1)->begin();
+  resultobj = SWIG_NewPointerObj((new OutputData< double >::const_iterator(static_cast< const OutputData< double >::const_iterator& >(result))), SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_begin(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IntensityData_begin__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IntensityData_begin__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IntensityData_begin'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OutputData< double >::begin()\n"
+    "    OutputData< double >::begin() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_end__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< OutputDataIterator< double,OutputData< double > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_end" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj((new OutputData< double >::iterator(static_cast< const OutputData< double >::iterator& >(result))), SWIGTYPE_p_OutputDataIteratorT_double_OutputDataT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_end__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< OutputDataIterator< double const,OutputData< double > const > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_end" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = ((OutputData< double > const *)arg1)->end();
+  resultobj = SWIG_NewPointerObj((new OutputData< double >::const_iterator(static_cast< const OutputData< double >::const_iterator& >(result))), SWIGTYPE_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_end(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IntensityData_end__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_IntensityData_end__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IntensityData_end'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OutputData< double >::end()\n"
+    "    OutputData< double >::end() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_setVariability(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_setVariability",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_setVariability" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_setVariability" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setVariability(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getVariability(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_getVariability",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getVariability" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (double)((OutputData< double > const *)arg1)->getVariability();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxesBinIndices(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int,std::allocator< int > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_getAxesBinIndices",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxesBinIndices" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxesBinIndices" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((OutputData< double > const *)arg1)->getAxesBinIndices(arg2);
+  resultobj = swig::from(static_cast< std::vector< int,std::allocator< int > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisBinIndex__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData_getAxisBinIndex",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxisBinIndex" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxisBinIndex" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntensityData_getAxisBinIndex" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (int)((OutputData< double > const *)arg1)->getAxisBinIndex(arg2,arg3);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisBinIndex__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData_getAxisBinIndex",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxisBinIndex" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxisBinIndex" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IntensityData_getAxisBinIndex" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_getAxisBinIndex" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = (int)((OutputData< double > const *)arg1)->getAxisBinIndex(arg2,(std::string const &)*arg3);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisBinIndex(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntensityData_getAxisBinIndex__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_IntensityData_getAxisBinIndex__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IntensityData_getAxisBinIndex'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OutputData< double >::getAxisBinIndex(size_t,size_t) const\n"
+    "    OutputData< double >::getAxisBinIndex(size_t,std::string const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_toGlobalIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  std::vector< int,std::allocator< int > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_toGlobalIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_toGlobalIndex" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_toGlobalIndex" "', argument " "2"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_toGlobalIndex" "', argument " "2"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = ((OutputData< double > const *)arg1)->toGlobalIndex((std::vector< int,std::allocator< int > > const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_findGlobalIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_findGlobalIndex",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_findGlobalIndex" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_findGlobalIndex" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_findGlobalIndex" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = ((OutputData< double > const *)arg1)->findGlobalIndex((std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData_getAxisValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxisValue" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxisValue" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntensityData_getAxisValue" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (double)((OutputData< double > const *)arg1)->getAxisValue(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData_getAxisValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxisValue" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxisValue" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IntensityData_getAxisValue" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_getAxisValue" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = (double)((OutputData< double > const *)arg1)->getAxisValue(arg2,(std::string const &)*arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisValue(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntensityData_getAxisValue__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_IntensityData_getAxisValue__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IntensityData_getAxisValue'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OutputData< double >::getAxisValue(size_t,size_t) const\n"
+    "    OutputData< double >::getAxisValue(size_t,std::string const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxesValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_getAxesValues",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxesValues" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxesValues" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((OutputData< double > const *)arg1)->getAxesValues(arg2);
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisBin__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Bin1D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData_getAxisBin",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxisBin" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxisBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntensityData_getAxisBin" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = ((OutputData< double > const *)arg1)->getAxisBin(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new Bin1D(static_cast< const Bin1D& >(result))), SWIGTYPE_p_Bin1D, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisBin__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  std::string *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Bin1D result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData_getAxisBin",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getAxisBin" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getAxisBin" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IntensityData_getAxisBin" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_getAxisBin" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = ((OutputData< double > const *)arg1)->getAxisBin(arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj((new Bin1D(static_cast< const Bin1D& >(result))), SWIGTYPE_p_Bin1D, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getAxisBin(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntensityData_getAxisBin__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OutputDataT_double_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_IntensityData_getAxisBin__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'IntensityData_getAxisBin'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    OutputData< double >::getAxisBin(size_t,size_t) const\n"
+    "    OutputData< double >::getAxisBin(size_t,std::string const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_clear" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_setAllTo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  double *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_setAllTo",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_setAllTo" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_setAllTo" "', argument " "2"" of type '" "double""'");
+  } 
+  temp2 = static_cast< double >(val2);
+  arg2 = &temp2;
+  (arg1)->setAllTo((double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_scaleAll(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  double *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_scaleAll",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_scaleAll" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_scaleAll" "', argument " "2"" of type '" "double""'");
+  } 
+  temp2 = static_cast< double >(val2);
+  arg2 = &temp2;
+  (arg1)->scaleAll((double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_setAxisSizes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  int *arg3 = (int *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData_setAxisSizes",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_setAxisSizes" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_setAxisSizes" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IntensityData_setAxisSizes" "', argument " "3"" of type '" "int *""'"); 
+  }
+  arg3 = reinterpret_cast< int * >(argp3);
+  (arg1)->setAxisSizes(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_setRawDataVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_setRawDataVector",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_setRawDataVector" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_setRawDataVector" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData_setRawDataVector" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setRawDataVector((std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_setRawDataArray(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_setRawDataArray",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_setRawDataArray" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData_setRawDataArray" "', argument " "2"" of type '" "double const *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  (arg1)->setRawDataArray((double const *)arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData___iadd__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData___iadd__" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData___iadd__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData___iadd__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *) &(arg1)->operator +=((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData___isub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData___isub__" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData___isub__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData___isub__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *) &(arg1)->operator -=((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData___idiv__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData___idiv__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData___idiv__" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData___idiv__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData___idiv__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *) &(arg1)->operator /=((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData___imul__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  OutputData< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  OutputData< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData___imul__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData___imul__" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OutputDataT_double_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntensityData___imul__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntensityData___imul__" "', argument " "2"" of type '" "OutputData< double > const &""'"); 
+  }
+  arg2 = reinterpret_cast< OutputData< double > * >(argp2);
+  result = (OutputData< double > *) &(arg1)->operator *=((OutputData< double > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData_getValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getValue" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData_getValue" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((OutputData< double > const *)arg1)->getValue(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_getArray(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_getArray",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_getArray" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (PyObject *)((OutputData< double > const *)arg1)->getArray();
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_isInitialized(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_isInitialized",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_isInitialized" "', argument " "1"" of type '" "OutputData< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  result = (bool)((OutputData< double > const *)arg1)->isInitialized();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData_allocate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IntensityData_allocate",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData_allocate" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  (arg1)->allocate();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  unsigned int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IntensityData___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData___getitem__" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData___getitem__" "', argument " "2"" of type '" "unsigned int""'");
+  } 
+  arg2 = static_cast< unsigned int >(val2);
+  result = (double)OutputData_Sl_double_Sg____getitem__(arg1,arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntensityData___setitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  OutputData< double > *arg1 = (OutputData< double > *) 0 ;
+  unsigned int arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IntensityData___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OutputDataT_double_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntensityData___setitem__" "', argument " "1"" of type '" "OutputData< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< OutputData< double > * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntensityData___setitem__" "', argument " "2"" of type '" "unsigned int""'");
+  } 
+  arg2 = static_cast< unsigned int >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntensityData___setitem__" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)OutputData_Sl_double_Sg____setitem__(arg1,arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IntensityData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_OutputDataT_double_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ParameterDistribution__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  IDistribution1D *arg2 = 0 ;
+  size_t arg3 ;
+  double arg4 ;
+  RealLimits *arg5 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  void *argp5 = 0 ;
+  int res5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  ParameterDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:new_ParameterDistribution",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IDistribution1D * >(argp2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_ParameterDistribution" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_ParameterDistribution" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res5)) {
+    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "new_ParameterDistribution" "', argument " "5"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp5) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "5"" of type '" "RealLimits const &""'"); 
+  }
+  arg5 = reinterpret_cast< RealLimits * >(argp5);
+  result = (ParameterDistribution *)new ParameterDistribution((std::string const &)*arg1,(IDistribution1D const &)*arg2,arg3,arg4,(RealLimits const &)*arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterDistribution, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParameterDistribution__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  IDistribution1D *arg2 = 0 ;
+  size_t arg3 ;
+  double arg4 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  ParameterDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_ParameterDistribution",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IDistribution1D * >(argp2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_ParameterDistribution" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_ParameterDistribution" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (ParameterDistribution *)new ParameterDistribution((std::string const &)*arg1,(IDistribution1D const &)*arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterDistribution, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParameterDistribution__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  IDistribution1D *arg2 = 0 ;
+  size_t arg3 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  ParameterDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_ParameterDistribution",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IDistribution1D * >(argp2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_ParameterDistribution" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = (ParameterDistribution *)new ParameterDistribution((std::string const &)*arg1,(IDistribution1D const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterDistribution, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParameterDistribution__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  IDistribution1D *arg2 = 0 ;
+  size_t arg3 ;
+  double arg4 ;
+  double arg5 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  ParameterDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:new_ParameterDistribution",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IDistribution1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "2"" of type '" "IDistribution1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< IDistribution1D * >(argp2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_ParameterDistribution" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_ParameterDistribution" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_ParameterDistribution" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  result = (ParameterDistribution *)new ParameterDistribution((std::string const &)*arg1,(IDistribution1D const &)*arg2,arg3,arg4,arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterDistribution, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParameterDistribution__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParameterDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_ParameterDistribution",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_ParameterDistribution,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "ParameterDistribution const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterDistribution" "', argument " "1"" of type '" "ParameterDistribution const &""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = (ParameterDistribution *)new ParameterDistribution((ParameterDistribution const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterDistribution, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParameterDistribution(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_ParameterDistribution, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ParameterDistribution__SWIG_4(self, args);
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IDistribution1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_ParameterDistribution__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IDistribution1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_ParameterDistribution__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IDistribution1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_RealLimits, 0);
+            _v = SWIG_CheckState(res);
+            if (_v) {
+              return _wrap_new_ParameterDistribution__SWIG_0(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IDistribution1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_new_ParameterDistribution__SWIG_3(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_ParameterDistribution'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParameterDistribution::ParameterDistribution(std::string const &,IDistribution1D const &,size_t,double,RealLimits const &)\n"
+    "    ParameterDistribution::ParameterDistribution(std::string const &,IDistribution1D const &,size_t,double)\n"
+    "    ParameterDistribution::ParameterDistribution(std::string const &,IDistribution1D const &,size_t)\n"
+    "    ParameterDistribution::ParameterDistribution(std::string const &,IDistribution1D const &,size_t,double,double)\n"
+    "    ParameterDistribution::ParameterDistribution(ParameterDistribution const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParameterDistribution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ParameterDistribution",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParameterDistribution" "', argument " "1"" of type '" "ParameterDistribution *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_linkParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  std::string arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParameterDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParameterDistribution_linkParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_linkParameter" "', argument " "1"" of type '" "ParameterDistribution *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    int res = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "ParameterDistribution_linkParameter" "', argument " "2"" of type '" "std::string""'"); 
+    }
+    arg2 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (ParameterDistribution *) &(arg1)->linkParameter(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getMainParameterName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getMainParameterName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getMainParameterName" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = ((ParameterDistribution const *)arg1)->getMainParameterName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getNbrSamples(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getNbrSamples",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getNbrSamples" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = ((ParameterDistribution const *)arg1)->getNbrSamples();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getSigmaFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getSigmaFactor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getSigmaFactor" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = (double)((ParameterDistribution const *)arg1)->getSigmaFactor();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getDistribution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDistribution1D *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getDistribution",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getDistribution" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = (IDistribution1D *)((ParameterDistribution const *)arg1)->getDistribution();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IDistribution1D, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_generateSamples(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< ParameterSample,std::allocator< ParameterSample > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_generateSamples",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_generateSamples" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = ((ParameterDistribution const *)arg1)->generateSamples();
+  resultobj = SWIG_NewPointerObj((new std::vector< ParameterSample,std::allocator< ParameterSample > >(static_cast< const std::vector< ParameterSample,std::allocator< ParameterSample > >& >(result))), SWIGTYPE_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getLinkedParameterNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getLinkedParameterNames",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getLinkedParameterNames" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = ((ParameterDistribution const *)arg1)->getLinkedParameterNames();
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getLimits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RealLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getLimits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getLimits" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = ((ParameterDistribution const *)arg1)->getLimits();
+  resultobj = SWIG_NewPointerObj((new RealLimits(static_cast< const RealLimits& >(result))), SWIGTYPE_p_RealLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getMinValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getMinValue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getMinValue" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = (double)((ParameterDistribution const *)arg1)->getMinValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterDistribution_getMaxValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterDistribution *arg1 = (ParameterDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterDistribution_getMaxValue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterDistribution_getMaxValue" "', argument " "1"" of type '" "ParameterDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterDistribution * >(argp1);
+  result = (double)((ParameterDistribution const *)arg1)->getMaxValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ParameterDistribution_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ParameterDistribution, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ParameterPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  std::function< void () > *arg2 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParameterPool *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_ParameterPool",&obj0,&obj1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParameterPool" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterPool" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__functionT_void_fF_t,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParameterPool" "', argument " "2"" of type '" "std::function< void () > const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParameterPool" "', argument " "2"" of type '" "std::function< void () > const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::function< void () > * >(argp2);
+  result = (ParameterPool *)new ParameterPool((std::string const &)*arg1,(std::function< void () > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParameterPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ParameterPool",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParameterPool" "', argument " "1"" of type '" "ParameterPool *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParameterPool *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterPool_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_clone" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  result = (ParameterPool *)((ParameterPool const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_cloneWithPrefix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParameterPool *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParameterPool_cloneWithPrefix",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_cloneWithPrefix" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_cloneWithPrefix" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParameterPool_cloneWithPrefix" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (ParameterPool *)((ParameterPool const *)arg1)->cloneWithPrefix((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_copyToExternalPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  std::string *arg2 = 0 ;
+  ParameterPool *arg3 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParameterPool_copyToExternalPool",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_copyToExternalPool" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_copyToExternalPool" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParameterPool_copyToExternalPool" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ParameterPool_copyToExternalPool" "', argument " "3"" of type '" "ParameterPool *""'"); 
+  }
+  arg3 = reinterpret_cast< ParameterPool * >(argp3);
+  ((ParameterPool const *)arg1)->copyToExternalPool((std::string const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterPool_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_clear" "', argument " "1"" of type '" "ParameterPool *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_getName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterPool_getName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_getName" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  result = ((ParameterPool const *)arg1)->getName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterPool_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_size" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  result = ((ParameterPool const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_addParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  RealParameter *arg2 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParameterPool_addParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_addParameter" "', argument " "1"" of type '" "ParameterPool *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_addParameter" "', argument " "2"" of type '" "RealParameter *""'"); 
+  }
+  arg2 = reinterpret_cast< RealParameter * >(argp2);
+  result = (RealParameter *) &(arg1)->addParameter(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_getParameter__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParameterPool_getParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_getParameter" "', argument " "1"" of type '" "ParameterPool *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_getParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParameterPool_getParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (RealParameter *)(arg1)->getParameter((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_getParameter__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParameterPool_getParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_getParameter" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_getParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParameterPool_getParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (RealParameter *)((ParameterPool const *)arg1)->getParameter((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_getParameter(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParameterPool, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ParameterPool_getParameter__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParameterPool, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ParameterPool_getParameter__SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ParameterPool_getParameter'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParameterPool::getParameter(std::string const &)\n"
+    "    ParameterPool::getParameter(std::string const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_getParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< RealParameter *,std::allocator< RealParameter * > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterPool_getParameters",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_getParameters" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  result = ((ParameterPool const *)arg1)->getParameters();
+  resultobj = SWIG_NewPointerObj((new std::vector< RealParameter *,std::allocator< RealParameter * > >(static_cast< const std::vector< RealParameter *,std::allocator< RealParameter * > >& >(result))), SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_getMatchedParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  SwigValueWrapper< std::vector< RealParameter *,std::allocator< RealParameter * > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParameterPool_getMatchedParameters",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_getMatchedParameters" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_getMatchedParameters" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParameterPool_getMatchedParameters" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = ((ParameterPool const *)arg1)->getMatchedParameters((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj((new std::vector< RealParameter *,std::allocator< RealParameter * > >(static_cast< const std::vector< RealParameter *,std::allocator< RealParameter * > >& >(result))), SWIGTYPE_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_setParameterValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParameterPool_setParameterValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_setParameterValue" "', argument " "1"" of type '" "ParameterPool *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParameterPool_setParameterValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParameterPool_setParameterValue" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setParameterValue((std::string const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_setMatchedParametersValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParameterPool_setMatchedParametersValue",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_setMatchedParametersValue" "', argument " "1"" of type '" "ParameterPool *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParameterPool_setMatchedParametersValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParameterPool_setMatchedParametersValue" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParameterPool_setMatchedParametersValue" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (int)(arg1)->setMatchedParametersValue((std::string const &)*arg2,arg3);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParameterPool_getParameterNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParameterPool *arg1 = (ParameterPool *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParameterPool_getParameterNames",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParameterPool, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParameterPool_getParameterNames" "', argument " "1"" of type '" "ParameterPool const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParameterPool * >(argp1);
+  result = ((ParameterPool const *)arg1)->getParameterNames();
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ParameterPool_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ParameterPool, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_Particle")) SWIG_fail;
+  result = (Particle *)new Particle();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Particle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Particle" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Particle" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  result = (Particle *)new Particle((IMaterial const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = 0 ;
+  IFormFactor *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Particle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Particle" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Particle" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Particle" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Particle" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  result = (Particle *)new Particle((IMaterial const &)*arg1,(IFormFactor const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Particle__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMaterial *arg1 = 0 ;
+  IFormFactor *arg2 = 0 ;
+  IRotation *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_Particle",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Particle" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Particle" "', argument " "1"" of type '" "IMaterial const &""'"); 
+  }
+  arg1 = reinterpret_cast< IMaterial * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Particle" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Particle" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IRotation,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_Particle" "', argument " "3"" of type '" "IRotation const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Particle" "', argument " "3"" of type '" "IRotation const &""'"); 
+  }
+  arg3 = reinterpret_cast< IRotation * >(argp3);
+  result = (Particle *)new Particle((IMaterial const &)*arg1,(IFormFactor const &)*arg2,(IRotation const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Particle(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_Particle__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IMaterial, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Particle__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IMaterial, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IFormFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_Particle__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IMaterial, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IFormFactor, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IRotation, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_Particle__SWIG_3(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Particle'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Particle::Particle()\n"
+    "    Particle::Particle(IMaterial const &)\n"
+    "    Particle::Particle(IMaterial const &,IFormFactor const &)\n"
+    "    Particle::Particle(IMaterial const &,IFormFactor const &,IRotation const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Particle_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_clone" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = (Particle *)((Particle const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Particle_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_cloneInvertB" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = (Particle *)((Particle const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Particle_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_accept" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Particle_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((Particle const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_to_str__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Particle_to_str",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_to_str" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Particle_to_str" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = ((Particle const *)arg1)->to_str(arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_to_str__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Particle_to_str",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_to_str" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = ((Particle const *)arg1)->to_str();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_to_str(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Particle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Particle_to_str__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Particle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Particle_to_str__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Particle_to_str'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Particle::to_str(int) const\n"
+    "    Particle::to_str() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Particle_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_setAmbientMaterial" "', argument " "1"" of type '" "Particle *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Particle_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Particle_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Particle_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_getAmbientMaterial" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = (IMaterial *)((Particle const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_createTransformedFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  IRotation *arg2 = (IRotation *) 0 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Swig::Director *director = 0;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Particle_createTransformedFormFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_createTransformedFormFactor" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Particle_createTransformedFormFactor" "', argument " "2"" of type '" "IRotation const *""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Particle_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Particle_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (IFormFactor *)((Particle const *)arg1)->createTransformedFormFactor((IRotation const *)arg2,arg3);
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_setMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Particle_setMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_setMaterial" "', argument " "1"" of type '" "Particle *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Particle_setMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Particle_setMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_getMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Particle_getMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_getMaterial" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = (IMaterial *)((Particle const *)arg1)->getMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_getRefractiveIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  complex_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Particle_getRefractiveIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_getRefractiveIndex" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = ((Particle const *)arg1)->getRefractiveIndex();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_setFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  IFormFactor *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:Particle_setFormFactor",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_setFormFactor" "', argument " "1"" of type '" "Particle *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IFormFactor,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Particle_setFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Particle_setFormFactor" "', argument " "2"" of type '" "IFormFactor const &""'"); 
+  }
+  arg2 = reinterpret_cast< IFormFactor * >(argp2);
+  (arg1)->setFormFactor((IFormFactor const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Particle_getFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Particle_getFormFactor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Particle_getFormFactor" "', argument " "1"" of type '" "Particle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  result = (IFormFactor *)((Particle const *)arg1)->getFormFactor();
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Particle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = (Particle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Particle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Particle, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Particle" "', argument " "1"" of type '" "Particle *""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Particle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Particle, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ParticleComposition__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_ParticleComposition")) SWIG_fail;
+  result = (ParticleComposition *)new ParticleComposition();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleComposition__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleComposition *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_ParticleComposition",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  result = (ParticleComposition *)new ParticleComposition((IParticle const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleComposition__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = 0 ;
+  kvector_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParticleComposition *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_ParticleComposition",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParticleComposition" "', argument " "2"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleComposition" "', argument " "2"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (ParticleComposition *)new ParticleComposition((IParticle const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleComposition__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = 0 ;
+  std::vector< kvector_t,std::allocator< kvector_t > > arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParticleComposition *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_ParticleComposition",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleComposition" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    int res = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "new_ParticleComposition" "', argument " "2"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > >""'"); 
+    }
+    arg2 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (ParticleComposition *)new ParticleComposition((IParticle const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleComposition(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_ParticleComposition__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IParticle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ParticleComposition__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IParticle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_ParticleComposition__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IParticle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_ParticleComposition__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_ParticleComposition'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParticleComposition::ParticleComposition()\n"
+    "    ParticleComposition::ParticleComposition(IParticle const &)\n"
+    "    ParticleComposition::ParticleComposition(IParticle const &,kvector_t)\n"
+    "    ParticleComposition::ParticleComposition(IParticle const &,std::vector< kvector_t,std::allocator< kvector_t > >)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParticleComposition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ParticleComposition",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParticleComposition" "', argument " "1"" of type '" "ParticleComposition *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleComposition *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleComposition_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_clone" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  result = (ParticleComposition *)((ParticleComposition const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleComposition *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleComposition_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_cloneInvertB" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  result = (ParticleComposition *)((ParticleComposition const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleComposition_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_accept" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleComposition_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((ParticleComposition const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_addParticle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  IParticle *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleComposition_addParticle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_addParticle" "', argument " "1"" of type '" "ParticleComposition *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleComposition_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleComposition_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParticle * >(argp2);
+  (arg1)->addParticle((IParticle const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_addParticle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  IParticle *arg2 = 0 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParticleComposition_addParticle",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_addParticle" "', argument " "1"" of type '" "ParticleComposition *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleComposition_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleComposition_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParticle * >(argp2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ParticleComposition_addParticle" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleComposition_addParticle" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  (arg1)->addParticle((IParticle const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_addParticle(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleComposition, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ParticleComposition_addParticle__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleComposition, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_ParticleComposition_addParticle__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ParticleComposition_addParticle'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParticleComposition::addParticle(IParticle const &)\n"
+    "    ParticleComposition::addParticle(IParticle const &,kvector_t)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_addParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  IParticle *arg2 = 0 ;
+  std::vector< kvector_t,std::allocator< kvector_t > > arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParticleComposition_addParticles",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_addParticles" "', argument " "1"" of type '" "ParticleComposition *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleComposition_addParticles" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleComposition_addParticles" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParticle * >(argp2);
+  {
+    std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *ptr = (std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *)0;
+    int res = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "ParticleComposition_addParticles" "', argument " "3"" of type '" "std::vector< kvector_t,std::allocator< kvector_t > >""'"); 
+    }
+    arg3 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  (arg1)->addParticles((IParticle const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleComposition_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_setAmbientMaterial" "', argument " "1"" of type '" "ParticleComposition *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleComposition_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleComposition_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleComposition_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_getAmbientMaterial" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  result = (IMaterial *)((ParticleComposition const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_createTransformedFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  IRotation *arg2 = (IRotation *) 0 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Swig::Director *director = 0;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParticleComposition_createTransformedFormFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_createTransformedFormFactor" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleComposition_createTransformedFormFactor" "', argument " "2"" of type '" "IRotation const *""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ParticleComposition_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleComposition_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (IFormFactor *)((ParticleComposition const *)arg1)->createTransformedFormFactor((IRotation const *)arg2,arg3);
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_getNbrParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleComposition_getNbrParticles",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_getNbrParticles" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  result = ((ParticleComposition const *)arg1)->getNbrParticles();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_getParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleComposition_getParticle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_getParticle" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParticleComposition_getParticle" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IParticle *)((ParticleComposition const *)arg1)->getParticle(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleComposition_getParticlePosition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleComposition *arg1 = (ParticleComposition *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleComposition_getParticlePosition",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleComposition, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleComposition_getParticlePosition" "', argument " "1"" of type '" "ParticleComposition const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleComposition * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParticleComposition_getParticlePosition" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((ParticleComposition const *)arg1)->getParticlePosition(arg2);
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ParticleComposition_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ParticleComposition, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ParticleCoreShell__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = 0 ;
+  Particle *arg2 = 0 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  ParticleCoreShell *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_ParticleCoreShell",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Particle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleCoreShell" "', argument " "1"" of type '" "Particle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleCoreShell" "', argument " "1"" of type '" "Particle const &""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Particle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParticleCoreShell" "', argument " "2"" of type '" "Particle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleCoreShell" "', argument " "2"" of type '" "Particle const &""'"); 
+  }
+  arg2 = reinterpret_cast< Particle * >(argp2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_ParticleCoreShell" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleCoreShell" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (ParticleCoreShell *)new ParticleCoreShell((Particle const &)*arg1,(Particle const &)*arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleCoreShell, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleCoreShell__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Particle *arg1 = 0 ;
+  Particle *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParticleCoreShell *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_ParticleCoreShell",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_Particle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleCoreShell" "', argument " "1"" of type '" "Particle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleCoreShell" "', argument " "1"" of type '" "Particle const &""'"); 
+  }
+  arg1 = reinterpret_cast< Particle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Particle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParticleCoreShell" "', argument " "2"" of type '" "Particle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleCoreShell" "', argument " "2"" of type '" "Particle const &""'"); 
+  }
+  arg2 = reinterpret_cast< Particle * >(argp2);
+  result = (ParticleCoreShell *)new ParticleCoreShell((Particle const &)*arg1,(Particle const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleCoreShell, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleCoreShell(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Particle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Particle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_ParticleCoreShell__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Particle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Particle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_ParticleCoreShell__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_ParticleCoreShell'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParticleCoreShell::ParticleCoreShell(Particle const &,Particle const &,kvector_t)\n"
+    "    ParticleCoreShell::ParticleCoreShell(Particle const &,Particle const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParticleCoreShell(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ParticleCoreShell",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParticleCoreShell" "', argument " "1"" of type '" "ParticleCoreShell *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleCoreShell *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleCoreShell_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_clone" "', argument " "1"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  result = (ParticleCoreShell *)((ParticleCoreShell const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleCoreShell *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleCoreShell_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_cloneInvertB" "', argument " "1"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  result = (ParticleCoreShell *)((ParticleCoreShell const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleCoreShell_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_accept" "', argument " "1"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleCoreShell_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((ParticleCoreShell const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleCoreShell_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_setAmbientMaterial" "', argument " "1"" of type '" "ParticleCoreShell *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleCoreShell_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleCoreShell_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleCoreShell_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_getAmbientMaterial" "', argument " "1"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  result = (IMaterial *)((ParticleCoreShell const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_createTransformedFormFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  IRotation *arg2 = (IRotation *) 0 ;
+  kvector_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  Swig::Director *director = 0;
+  IFormFactor *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParticleCoreShell_createTransformedFormFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_createTransformedFormFactor" "', argument " "1"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_IRotation, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleCoreShell_createTransformedFormFactor" "', argument " "2"" of type '" "IRotation const *""'"); 
+  }
+  arg2 = reinterpret_cast< IRotation * >(argp2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ParticleCoreShell_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleCoreShell_createTransformedFormFactor" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (IFormFactor *)((ParticleCoreShell const *)arg1)->createTransformedFormFactor((IRotation const *)arg2,arg3);
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFormFactor, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_getCoreParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleCoreShell_getCoreParticle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_getCoreParticle" "', argument " "1"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  result = (Particle *)((ParticleCoreShell const *)arg1)->getCoreParticle();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleCoreShell_getShellParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleCoreShell *arg1 = (ParticleCoreShell *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Particle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleCoreShell_getShellParticle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleCoreShell, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleCoreShell_getShellParticle" "', argument " "1"" of type '" "ParticleCoreShell const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleCoreShell * >(argp1);
+  result = (Particle *)((ParticleCoreShell const *)arg1)->getShellParticle();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Particle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ParticleCoreShell_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ParticleCoreShell, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ParticleDistribution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IParticle *arg1 = 0 ;
+  ParameterDistribution *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParticleDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_ParticleDistribution",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleDistribution" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleDistribution" "', argument " "1"" of type '" "IParticle const &""'"); 
+  }
+  arg1 = reinterpret_cast< IParticle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ParameterDistribution,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_ParticleDistribution" "', argument " "2"" of type '" "ParameterDistribution const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleDistribution" "', argument " "2"" of type '" "ParameterDistribution const &""'"); 
+  }
+  arg2 = reinterpret_cast< ParameterDistribution * >(argp2);
+  result = (ParticleDistribution *)new ParticleDistribution((IParticle const &)*arg1,(ParameterDistribution const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleDistribution, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleDistribution_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_clone" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  result = (ParticleDistribution *)((ParticleDistribution const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleDistribution *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleDistribution_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_cloneInvertB" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  result = (ParticleDistribution *)((ParticleDistribution const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleDistribution_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_accept" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleDistribution_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((ParticleDistribution const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_to_str__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleDistribution_to_str",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_to_str" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParticleDistribution_to_str" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = ((ParticleDistribution const *)arg1)->to_str(arg2);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_to_str__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleDistribution_to_str",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_to_str" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  result = ((ParticleDistribution const *)arg1)->to_str();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_to_str(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleDistribution, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_ParticleDistribution_to_str__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleDistribution, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ParticleDistribution_to_str__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ParticleDistribution_to_str'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParticleDistribution::to_str(int) const\n"
+    "    ParticleDistribution::to_str() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_setAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  IMaterial *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleDistribution_setAmbientMaterial",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_setAmbientMaterial" "', argument " "1"" of type '" "ParticleDistribution *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IMaterial,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleDistribution_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleDistribution_setAmbientMaterial" "', argument " "2"" of type '" "IMaterial const &""'"); 
+  }
+  arg2 = reinterpret_cast< IMaterial * >(argp2);
+  (arg1)->setAmbientMaterial((IMaterial const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_getAmbientMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IMaterial *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleDistribution_getAmbientMaterial",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_getAmbientMaterial" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  result = (IMaterial *)((ParticleDistribution const *)arg1)->getAmbientMaterial();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMaterial, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_generateParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  std::vector< IParticle const *,std::allocator< IParticle const * > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleDistribution_generateParticles",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_generateParticles" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleDistribution_generateParticles" "', argument " "2"" of type '" "std::vector< IParticle const *,std::allocator< IParticle const * > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleDistribution_generateParticles" "', argument " "2"" of type '" "std::vector< IParticle const *,std::allocator< IParticle const * > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< IParticle const *,std::allocator< IParticle const * > > * >(argp2);
+  ((ParticleDistribution const *)arg1)->generateParticles(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_getParameterDistribution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< ParameterDistribution > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleDistribution_getParameterDistribution",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_getParameterDistribution" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  result = ((ParticleDistribution const *)arg1)->getParameterDistribution();
+  resultobj = SWIG_NewPointerObj((new ParameterDistribution(static_cast< const ParameterDistribution& >(result))), SWIGTYPE_p_ParameterDistribution, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_createDistributedParameterPool(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParameterPool *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleDistribution_createDistributedParameterPool",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_createDistributedParameterPool" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  result = (ParameterPool *)((ParticleDistribution const *)arg1)->createDistributedParameterPool();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParameterPool, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleDistribution_getParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleDistribution_getParticle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleDistribution_getParticle" "', argument " "1"" of type '" "ParticleDistribution const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  result = (IParticle *)((ParticleDistribution const *)arg1)->getParticle();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParticleDistribution(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleDistribution *arg1 = (ParticleDistribution *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ParticleDistribution",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleDistribution, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParticleDistribution" "', argument " "1"" of type '" "ParticleDistribution *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleDistribution * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ParticleDistribution_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ParticleDistribution, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ParticleLayout__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_ParticleLayout")) SWIG_fail;
+  result = (ParticleLayout *)new ParticleLayout();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleLayout, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleLayout__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleLayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_ParticleLayout",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  result = (ParticleLayout *)new ParticleLayout((IAbstractParticle const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleLayout, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleLayout__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IAbstractParticle *arg1 = 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ParticleLayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_ParticleLayout",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ParticleLayout" "', argument " "1"" of type '" "IAbstractParticle const &""'"); 
+  }
+  arg1 = reinterpret_cast< IAbstractParticle * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_ParticleLayout" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (ParticleLayout *)new ParticleLayout((IAbstractParticle const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleLayout, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ParticleLayout(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_ParticleLayout__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAbstractParticle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ParticleLayout__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_IAbstractParticle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_ParticleLayout__SWIG_2(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_ParticleLayout'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParticleLayout::ParticleLayout()\n"
+    "    ParticleLayout::ParticleLayout(IAbstractParticle const &)\n"
+    "    ParticleLayout::ParticleLayout(IAbstractParticle const &,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ParticleLayout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ParticleLayout",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ParticleLayout" "', argument " "1"" of type '" "ParticleLayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleLayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleLayout_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_clone" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  result = (ParticleLayout *)((ParticleLayout const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ParticleLayout *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleLayout_cloneInvertB",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_cloneInvertB" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  result = (ParticleLayout *)((ParticleLayout const *)arg1)->cloneInvertB();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  ISampleVisitor *arg2 = (ISampleVisitor *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleLayout_accept",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_accept" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_ISampleVisitor, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_accept" "', argument " "2"" of type '" "ISampleVisitor *""'"); 
+  }
+  arg2 = reinterpret_cast< ISampleVisitor * >(argp2);
+  ((ParticleLayout const *)arg1)->accept(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  IAbstractParticle *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleLayout_addParticle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
+  (arg1)->addParticle((IAbstractParticle const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  IAbstractParticle *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ParticleLayout_addParticle",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAbstractParticle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IAbstractParticle const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAbstractParticle * >(argp2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParticleLayout_addParticle" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->addParticle((IAbstractParticle const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  IParticle *arg2 = 0 ;
+  double arg3 ;
+  kvector_t arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:ParticleLayout_addParticle",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParticle * >(argp2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParticleLayout_addParticle" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  {
+    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "ParticleLayout_addParticle" "', argument " "4"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp4) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "4"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp4);
+      arg4 = *temp;
+      if (SWIG_IsNewObj(res4)) delete temp;
+    }
+  }
+  (arg1)->addParticle((IParticle const &)*arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  IParticle *arg2 = 0 ;
+  double arg3 ;
+  kvector_t arg4 ;
+  IRotation *arg5 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  void *argp4 ;
+  int res4 = 0 ;
+  void *argp5 = 0 ;
+  int res5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:ParticleLayout_addParticle",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addParticle" "', argument " "1"" of type '" "ParticleLayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IParticle,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "2"" of type '" "IParticle const &""'"); 
+  }
+  arg2 = reinterpret_cast< IParticle * >(argp2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ParticleLayout_addParticle" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  {
+    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "ParticleLayout_addParticle" "', argument " "4"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp4) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "4"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp4);
+      arg4 = *temp;
+      if (SWIG_IsNewObj(res4)) delete temp;
+    }
+  }
+  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_IRotation,  0  | 0);
+  if (!SWIG_IsOK(res5)) {
+    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "ParticleLayout_addParticle" "', argument " "5"" of type '" "IRotation const &""'"); 
+  }
+  if (!argp5) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addParticle" "', argument " "5"" of type '" "IRotation const &""'"); 
+  }
+  arg5 = reinterpret_cast< IRotation * >(argp5);
+  (arg1)->addParticle((IParticle const &)*arg2,arg3,arg4,(IRotation const &)*arg5);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_addParticle(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAbstractParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ParticleLayout_addParticle__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAbstractParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_ParticleLayout_addParticle__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_ParticleLayout_addParticle__SWIG_2(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_ParticleLayout, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IParticle, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_IRotation, 0);
+            _v = SWIG_CheckState(res);
+            if (_v) {
+              return _wrap_ParticleLayout_addParticle__SWIG_3(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'ParticleLayout_addParticle'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    ParticleLayout::addParticle(IAbstractParticle const &)\n"
+    "    ParticleLayout::addParticle(IAbstractParticle const &,double)\n"
+    "    ParticleLayout::addParticle(IParticle const &,double,kvector_t const)\n"
+    "    ParticleLayout::addParticle(IParticle const &,double,kvector_t const,IRotation const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_getNumberOfParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleLayout_getNumberOfParticles",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_getNumberOfParticles" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  result = ((ParticleLayout const *)arg1)->getNumberOfParticles();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_getParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IAbstractParticle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleLayout_getParticle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_getParticle" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParticleLayout_getParticle" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (IAbstractParticle *)((ParticleLayout const *)arg1)->getParticle(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAbstractParticle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_getParticles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< SafePointerVector< IParticle const > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleLayout_getParticles",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_getParticles" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  result = ((ParticleLayout const *)arg1)->getParticles();
+  resultobj = SWIG_NewPointerObj((new SafePointerVector< IParticle const >(static_cast< const SafePointerVector< IParticle const >& >(result))), SWIGTYPE_p_SafePointerVectorT_IParticle_const_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_getAbundanceOfParticle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleLayout_getAbundanceOfParticle",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_getAbundanceOfParticle" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParticleLayout_getAbundanceOfParticle" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (double)((ParticleLayout const *)arg1)->getAbundanceOfParticle(arg2);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_getInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IInterferenceFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleLayout_getInterferenceFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_getInterferenceFunction" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  result = (IInterferenceFunction *)((ParticleLayout const *)arg1)->getInterferenceFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_cloneInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IInterferenceFunction *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleLayout_cloneInterferenceFunction",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_cloneInterferenceFunction" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  result = (IInterferenceFunction *)((ParticleLayout const *)arg1)->cloneInterferenceFunction();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_addInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  IInterferenceFunction *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleLayout_addInterferenceFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_addInterferenceFunction" "', argument " "1"" of type '" "ParticleLayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IInterferenceFunction,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ParticleLayout_addInterferenceFunction" "', argument " "2"" of type '" "IInterferenceFunction const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ParticleLayout_addInterferenceFunction" "', argument " "2"" of type '" "IInterferenceFunction const &""'"); 
+  }
+  arg2 = reinterpret_cast< IInterferenceFunction * >(argp2);
+  (arg1)->addInterferenceFunction((IInterferenceFunction const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_getTotalParticleSurfaceDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ParticleLayout_getTotalParticleSurfaceDensity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_getTotalParticleSurfaceDensity" "', argument " "1"" of type '" "ParticleLayout const *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  result = (double)((ParticleLayout const *)arg1)->getTotalParticleSurfaceDensity();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ParticleLayout_setTotalParticleSurfaceDensity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ParticleLayout *arg1 = (ParticleLayout *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ParticleLayout_setTotalParticleSurfaceDensity",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ParticleLayout, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ParticleLayout_setTotalParticleSurfaceDensity" "', argument " "1"" of type '" "ParticleLayout *""'"); 
+  }
+  arg1 = reinterpret_cast< ParticleLayout * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ParticleLayout_setTotalParticleSurfaceDensity" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setTotalParticleSurfaceDensity(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ParticleLayout_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ParticleLayout, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Polygon__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double,std::allocator< double > > *arg1 = 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Geometry::Polygon *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_Polygon",&obj0,&obj1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Polygon" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Polygon" "', argument " "1"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Polygon" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Polygon" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (Geometry::Polygon *)new Geometry::Polygon((std::vector< double,std::allocator< double > > const &)*arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Polygon, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Polygon__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  Geometry::Polygon *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Polygon",&obj0)) SWIG_fail;
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Polygon" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Polygon" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (Geometry::Polygon *)new Geometry::Polygon((std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Polygon, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Polygon__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::PolygonPrivate *arg1 = (Geometry::PolygonPrivate *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::Polygon *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_Polygon",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__PolygonPrivate, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Polygon" "', argument " "1"" of type '" "Geometry::PolygonPrivate const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::PolygonPrivate * >(argp1);
+  result = (Geometry::Polygon *)new Geometry::Polygon((Geometry::PolygonPrivate const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Polygon, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Polygon(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__PolygonPrivate, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Polygon__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_Polygon__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_Polygon__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_Polygon'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::Polygon::Polygon(std::vector< double,std::allocator< double > > const &,std::vector< double,std::allocator< double > > const &)\n"
+    "    Geometry::Polygon::Polygon(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n"
+    "    Geometry::Polygon::Polygon(Geometry::PolygonPrivate const *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Polygon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Polygon *arg1 = (Geometry::Polygon *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Polygon",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Polygon, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Polygon" "', argument " "1"" of type '" "Geometry::Polygon *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Polygon * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Polygon_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Polygon *arg1 = (Geometry::Polygon *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::Polygon *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Polygon_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Polygon, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Polygon_clone" "', argument " "1"" of type '" "Geometry::Polygon const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Polygon * >(argp1);
+  result = (Geometry::Polygon *)((Geometry::Polygon const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Polygon, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Polygon_contains__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Polygon *arg1 = (Geometry::Polygon *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Polygon_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Polygon, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Polygon_contains" "', argument " "1"" of type '" "Geometry::Polygon const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Polygon * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Polygon_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Polygon_contains" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((Geometry::Polygon const *)arg1)->contains(arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Polygon_contains__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Polygon *arg1 = (Geometry::Polygon *) 0 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Polygon_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Polygon, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Polygon_contains" "', argument " "1"" of type '" "Geometry::Polygon const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Polygon * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Polygon_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Polygon_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Polygon_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Polygon_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (bool)((Geometry::Polygon const *)arg1)->contains((Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Polygon_contains(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Polygon, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_Polygon_contains__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Polygon, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Polygon_contains__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Polygon_contains'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::Polygon::contains(double,double) const\n"
+    "    Geometry::Polygon::contains(Bin1D const &,Bin1D const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Polygon_getArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Polygon *arg1 = (Geometry::Polygon *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Polygon_getArea",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Polygon, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Polygon_getArea" "', argument " "1"" of type '" "Geometry::Polygon const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Polygon * >(argp1);
+  result = (double)((Geometry::Polygon const *)arg1)->getArea();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Polygon_getPoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Polygon *arg1 = (Geometry::Polygon *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Polygon_getPoints",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Polygon, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Polygon_getPoints" "', argument " "1"" of type '" "Geometry::Polygon const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Polygon * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Polygon_getPoints" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Polygon_getPoints" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Polygon_getPoints" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Polygon_getPoints" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp3);
+  ((Geometry::Polygon const *)arg1)->getPoints(*arg2,*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Polygon_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Geometry__Polygon, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_RealParameter__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double *arg2 = (double *) 0 ;
+  std::string *arg3 = 0 ;
+  std::function< void () > *arg4 = 0 ;
+  RealLimits *arg5 = 0 ;
+  Attributes *arg6 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  void *argp5 = 0 ;
+  int res5 = 0 ;
+  void *argp6 = 0 ;
+  int res6 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  PyObject * obj5 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:new_RealParameter",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RealParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_RealParameter" "', argument " "2"" of type '" "double volatile *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_RealParameter" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_std__functionT_void_fF_t,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_RealParameter" "', argument " "4"" of type '" "std::function< void () > const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "4"" of type '" "std::function< void () > const &""'"); 
+  }
+  arg4 = reinterpret_cast< std::function< void () > * >(argp4);
+  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res5)) {
+    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "new_RealParameter" "', argument " "5"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp5) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "5"" of type '" "RealLimits const &""'"); 
+  }
+  arg5 = reinterpret_cast< RealLimits * >(argp5);
+  res6 = SWIG_ConvertPtr(obj5, &argp6, SWIGTYPE_p_Attributes,  0  | 0);
+  if (!SWIG_IsOK(res6)) {
+    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "new_RealParameter" "', argument " "6"" of type '" "Attributes const &""'"); 
+  }
+  if (!argp6) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "6"" of type '" "Attributes const &""'"); 
+  }
+  arg6 = reinterpret_cast< Attributes * >(argp6);
+  result = (RealParameter *)new RealParameter((std::string const &)*arg1,(double volatile *)arg2,(std::string const &)*arg3,(std::function< void () > const &)*arg4,(RealLimits const &)*arg5,(Attributes const &)*arg6);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RealParameter__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double *arg2 = (double *) 0 ;
+  std::string *arg3 = 0 ;
+  std::function< void () > *arg4 = 0 ;
+  RealLimits *arg5 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  void *argp5 = 0 ;
+  int res5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:new_RealParameter",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RealParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_RealParameter" "', argument " "2"" of type '" "double volatile *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_RealParameter" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_std__functionT_void_fF_t,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_RealParameter" "', argument " "4"" of type '" "std::function< void () > const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "4"" of type '" "std::function< void () > const &""'"); 
+  }
+  arg4 = reinterpret_cast< std::function< void () > * >(argp4);
+  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res5)) {
+    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "new_RealParameter" "', argument " "5"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp5) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "5"" of type '" "RealLimits const &""'"); 
+  }
+  arg5 = reinterpret_cast< RealLimits * >(argp5);
+  result = (RealParameter *)new RealParameter((std::string const &)*arg1,(double volatile *)arg2,(std::string const &)*arg3,(std::function< void () > const &)*arg4,(RealLimits const &)*arg5);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RealParameter__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double *arg2 = (double *) 0 ;
+  std::string *arg3 = 0 ;
+  std::function< void () > *arg4 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_RealParameter",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RealParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_RealParameter" "', argument " "2"" of type '" "double volatile *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_RealParameter" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_std__functionT_void_fF_t,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_RealParameter" "', argument " "4"" of type '" "std::function< void () > const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RealParameter" "', argument " "4"" of type '" "std::function< void () > const &""'"); 
+  }
+  arg4 = reinterpret_cast< std::function< void () > * >(argp4);
+  result = (RealParameter *)new RealParameter((std::string const &)*arg1,(double volatile *)arg2,(std::string const &)*arg3,(std::function< void () > const &)*arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RealParameter(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[7] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 6) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 4) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_double, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_std__functionT_void_fF_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_new_RealParameter__SWIG_2(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_double, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_std__functionT_void_fF_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_RealLimits, 0);
+            _v = SWIG_CheckState(res);
+            if (_v) {
+              return _wrap_new_RealParameter__SWIG_1(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  if (argc == 6) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_double, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_std__functionT_void_fF_t, 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_RealLimits, 0);
+            _v = SWIG_CheckState(res);
+            if (_v) {
+              int res = SWIG_ConvertPtr(argv[5], 0, SWIGTYPE_p_Attributes, 0);
+              _v = SWIG_CheckState(res);
+              if (_v) {
+                return _wrap_new_RealParameter__SWIG_0(self, args);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_RealParameter'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    RealParameter::RealParameter(std::string const &,double volatile *,std::string const &,std::function< void () > const &,RealLimits const &,Attributes const &)\n"
+    "    RealParameter::RealParameter(std::string const &,double volatile *,std::string const &,std::function< void () > const &,RealLimits const &)\n"
+    "    RealParameter::RealParameter(std::string const &,double volatile *,std::string const &,std::function< void () > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_clone__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RealParameter_clone",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_clone" "', argument " "1"" of type '" "RealParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RealParameter_clone" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RealParameter_clone" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (RealParameter *)((RealParameter const *)arg1)->clone((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_clone__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RealParameter_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_clone" "', argument " "1"" of type '" "RealParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  result = (RealParameter *)((RealParameter const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_clone(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_RealParameter, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_RealParameter_clone__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_RealParameter, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_RealParameter_clone__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'RealParameter_clone'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    RealParameter::clone(std::string const &) const\n"
+    "    RealParameter::clone() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_setValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RealParameter_setValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_setValue" "', argument " "1"" of type '" "RealParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RealParameter_setValue" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setValue(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_getValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RealParameter_getValue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_getValue" "', argument " "1"" of type '" "RealParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  result = (double)((RealParameter const *)arg1)->getValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_setLimits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  RealLimits *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RealParameter_setLimits",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_setLimits" "', argument " "1"" of type '" "RealParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_RealLimits,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RealParameter_setLimits" "', argument " "2"" of type '" "RealLimits const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RealParameter_setLimits" "', argument " "2"" of type '" "RealLimits const &""'"); 
+  }
+  arg2 = reinterpret_cast< RealLimits * >(argp2);
+  result = (RealParameter *) &(arg1)->setLimits((RealLimits const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_getLimits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RealLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RealParameter_getLimits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_getLimits" "', argument " "1"" of type '" "RealParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  result = ((RealParameter const *)arg1)->getLimits();
+  resultobj = SWIG_NewPointerObj((new RealLimits(static_cast< const RealLimits& >(result))), SWIGTYPE_p_RealLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_setLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:RealParameter_setLimited",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_setLimited" "', argument " "1"" of type '" "RealParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RealParameter_setLimited" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RealParameter_setLimited" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (RealParameter *) &(arg1)->setLimited(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_setPositive(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RealParameter_setPositive",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_setPositive" "', argument " "1"" of type '" "RealParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  result = (RealParameter *) &(arg1)->setPositive();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_setNonnegative(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RealParameter_setNonnegative",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_setNonnegative" "', argument " "1"" of type '" "RealParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  result = (RealParameter *) &(arg1)->setNonnegative();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  RealParameter *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RealParameter___eq__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter___eq__" "', argument " "1"" of type '" "RealParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_RealParameter,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RealParameter___eq__" "', argument " "2"" of type '" "RealParameter const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RealParameter___eq__" "', argument " "2"" of type '" "RealParameter const &""'"); 
+  }
+  arg2 = reinterpret_cast< RealParameter * >(argp2);
+  result = (bool)((RealParameter const *)arg1)->operator ==((RealParameter const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_setUnit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  RealParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RealParameter_setUnit",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_setUnit" "', argument " "1"" of type '" "RealParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RealParameter_setUnit" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RealParameter_setUnit" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (RealParameter *) &(arg1)->setUnit((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RealParameter_unit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RealParameter_unit",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealParameter_unit" "', argument " "1"" of type '" "RealParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  result = ((RealParameter const *)arg1)->unit();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RealParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealParameter *arg1 = (RealParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_RealParameter",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RealParameter, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RealParameter" "', argument " "1"" of type '" "RealParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< RealParameter * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RealParameter_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RealParameter, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_Rectangle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  Geometry::Rectangle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_Rectangle",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_Rectangle" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Rectangle" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_Rectangle" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_Rectangle" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (Geometry::Rectangle *)new Geometry::Rectangle(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Rectangle, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Geometry::Rectangle *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Rectangle_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_clone" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  result = (Geometry::Rectangle *)((Geometry::Rectangle const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_contains__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Rectangle_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_contains" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Rectangle_contains" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "Rectangle_contains" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((Geometry::Rectangle const *)arg1)->contains(arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_contains__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  Bin1D *arg2 = 0 ;
+  Bin1D *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:Rectangle_contains",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_contains" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Rectangle_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Rectangle_contains" "', argument " "2"" of type '" "Bin1D const &""'"); 
+  }
+  arg2 = reinterpret_cast< Bin1D * >(argp2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_Bin1D,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Rectangle_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Rectangle_contains" "', argument " "3"" of type '" "Bin1D const &""'"); 
+  }
+  arg3 = reinterpret_cast< Bin1D * >(argp3);
+  result = (bool)((Geometry::Rectangle const *)arg1)->contains((Bin1D const &)*arg2,(Bin1D const &)*arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_contains(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Rectangle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_Bin1D, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_Bin1D, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_Rectangle_contains__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Geometry__Rectangle, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_Rectangle_contains__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Rectangle_contains'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    Geometry::Rectangle::contains(double,double) const\n"
+    "    Geometry::Rectangle::contains(Bin1D const &,Bin1D const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_getArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Rectangle_getArea",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_getArea" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  result = (double)((Geometry::Rectangle const *)arg1)->getArea();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_getXlow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Rectangle_getXlow",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_getXlow" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  result = (double)((Geometry::Rectangle const *)arg1)->getXlow();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_getYlow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Rectangle_getYlow",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_getYlow" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  result = (double)((Geometry::Rectangle const *)arg1)->getYlow();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_getXup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Rectangle_getXup",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_getXup" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  result = (double)((Geometry::Rectangle const *)arg1)->getXup();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Rectangle_getYup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:Rectangle_getYup",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Rectangle_getYup" "', argument " "1"" of type '" "Geometry::Rectangle const *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  result = (double)((Geometry::Rectangle const *)arg1)->getYup();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Rectangle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Geometry::Rectangle *arg1 = (Geometry::Rectangle *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_Rectangle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Geometry__Rectangle, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Rectangle" "', argument " "1"" of type '" "Geometry::Rectangle *""'"); 
+  }
+  arg1 = reinterpret_cast< Geometry::Rectangle * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Rectangle_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Geometry__Rectangle, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_RectangularDetector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  double arg2 ;
+  int arg3 ;
+  double arg4 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  RectangularDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_RectangularDetector",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_RectangularDetector" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_RectangularDetector" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_RectangularDetector" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_RectangularDetector" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (RectangularDetector *)new RectangularDetector(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RectangularDetector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RectangularDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_RectangularDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_RectangularDetector,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RectangularDetector" "', argument " "1"" of type '" "RectangularDetector const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectangularDetector" "', argument " "1"" of type '" "RectangularDetector const &""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (RectangularDetector *)new RectangularDetector((RectangularDetector const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularDetector, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_RectangularDetector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_RectangularDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_RectangularDetector__SWIG_1(self, args);
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_RectangularDetector__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_RectangularDetector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    RectangularDetector::RectangularDetector(int,double,int,double)\n"
+    "    RectangularDetector::RectangularDetector(RectangularDetector const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RectangularDetector *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_clone" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (RectangularDetector *)((RectangularDetector const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RectangularDetector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_RectangularDetector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RectangularDetector" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  Beam *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RectangularDetector_init",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_init" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_Beam,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RectangularDetector_init" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RectangularDetector_init" "', argument " "2"" of type '" "Beam const &""'"); 
+  }
+  arg2 = reinterpret_cast< Beam * >(argp2);
+  (arg1)->init((Beam const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPosition__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  kvector_t arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  void *argp5 ;
+  int res5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:RectangularDetector_setPosition",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setPosition" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RectangularDetector_setPosition" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RectangularDetector_setPosition" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularDetector_setPosition" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectangularDetector_setPosition" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  {
+    res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res5)) {
+      SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "RectangularDetector_setPosition" "', argument " "5"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp5) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RectangularDetector_setPosition" "', argument " "5"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp5);
+      arg5 = *temp;
+      if (SWIG_IsNewObj(res5)) delete temp;
+    }
+  }
+  (arg1)->setPosition(arg2,arg3,arg4,arg5);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPosition__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  kvector_t arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:RectangularDetector_setPosition",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setPosition" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RectangularDetector_setPosition" "', argument " "2"" of type '" "kvector_t const""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RectangularDetector_setPosition" "', argument " "2"" of type '" "kvector_t const""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularDetector_setPosition" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectangularDetector_setPosition" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setPosition(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPosition(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_RectangularDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_RectangularDetector_setPosition__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_RectangularDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_BasicVector3DT_double_t, 0);
+            _v = SWIG_CheckState(res);
+            if (_v) {
+              return _wrap_RectangularDetector_setPosition__SWIG_0(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'RectangularDetector_setPosition'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    RectangularDetector::setPosition(kvector_t const,double,double,kvector_t const)\n"
+    "    RectangularDetector::setPosition(kvector_t const,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPerpendicularToSampleX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:RectangularDetector_setPerpendicularToSampleX",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setPerpendicularToSampleX" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularDetector_setPerpendicularToSampleX" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularDetector_setPerpendicularToSampleX" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectangularDetector_setPerpendicularToSampleX" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setPerpendicularToSampleX(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPerpendicularToDirectBeam(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:RectangularDetector_setPerpendicularToDirectBeam",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setPerpendicularToDirectBeam" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularDetector_setPerpendicularToDirectBeam" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularDetector_setPerpendicularToDirectBeam" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectangularDetector_setPerpendicularToDirectBeam" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setPerpendicularToDirectBeam(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPerpendicularToReflectedBeam__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:RectangularDetector_setPerpendicularToReflectedBeam",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setPerpendicularToReflectedBeam(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPerpendicularToReflectedBeam__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:RectangularDetector_setPerpendicularToReflectedBeam",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setPerpendicularToReflectedBeam(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPerpendicularToReflectedBeam__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:RectangularDetector_setPerpendicularToReflectedBeam",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularDetector_setPerpendicularToReflectedBeam" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setPerpendicularToReflectedBeam(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setPerpendicularToReflectedBeam(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_RectangularDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_RectangularDetector_setPerpendicularToReflectedBeam__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_RectangularDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_RectangularDetector_setPerpendicularToReflectedBeam__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_RectangularDetector, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_RectangularDetector_setPerpendicularToReflectedBeam__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'RectangularDetector_setPerpendicularToReflectedBeam'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    RectangularDetector::setPerpendicularToReflectedBeam(double,double,double)\n"
+    "    RectangularDetector::setPerpendicularToReflectedBeam(double,double)\n"
+    "    RectangularDetector::setPerpendicularToReflectedBeam(double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_setDirectBeamPosition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:RectangularDetector_setDirectBeamPosition",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_setDirectBeamPosition" "', argument " "1"" of type '" "RectangularDetector *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectangularDetector_setDirectBeamPosition" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectangularDetector_setDirectBeamPosition" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->setDirectBeamPosition(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getWidth",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getWidth" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (double)((RectangularDetector const *)arg1)->getWidth();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getHeight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getHeight",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getHeight" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (double)((RectangularDetector const *)arg1)->getHeight();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getNbinsX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getNbinsX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getNbinsX" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = ((RectangularDetector const *)arg1)->getNbinsX();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getNbinsY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getNbinsY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getNbinsY" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = ((RectangularDetector const *)arg1)->getNbinsY();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getNormalVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getNormalVector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getNormalVector" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = ((RectangularDetector const *)arg1)->getNormalVector();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getU0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getU0",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getU0" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (double)((RectangularDetector const *)arg1)->getU0();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getV0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getV0",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getV0" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (double)((RectangularDetector const *)arg1)->getV0();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getDirectionVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getDirectionVector",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getDirectionVector" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = ((RectangularDetector const *)arg1)->getDirectionVector();
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getDistance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getDistance",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getDistance" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (double)((RectangularDetector const *)arg1)->getDistance();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getDirectBeamU0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getDirectBeamU0",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getDirectBeamU0" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (double)((RectangularDetector const *)arg1)->getDirectBeamU0();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getDirectBeamV0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getDirectBeamV0",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getDirectBeamV0" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (double)((RectangularDetector const *)arg1)->getDirectBeamV0();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getDetectorArrangment(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RectangularDetector::EDetectorArrangement result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getDetectorArrangment",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getDetectorArrangment" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (RectangularDetector::EDetectorArrangement)((RectangularDetector const *)arg1)->getDetectorArrangment();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getValidAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< enum IDetector2D::EAxesUnits,std::allocator< enum IDetector2D::EAxesUnits > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getValidAxesUnits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getValidAxesUnits" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = ((RectangularDetector const *)arg1)->getValidAxesUnits();
+  resultobj = SWIG_NewPointerObj((new std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >(static_cast< const std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >& >(result))), SWIGTYPE_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectangularDetector_getDefaultAxesUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectangularDetector *arg1 = (RectangularDetector *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IDetector2D::EAxesUnits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectangularDetector_getDefaultAxesUnits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectangularDetector, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectangularDetector_getDefaultAxesUnits" "', argument " "1"" of type '" "RectangularDetector const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectangularDetector * >(argp1);
+  result = (IDetector2D::EAxesUnits)((RectangularDetector const *)arg1)->getDefaultAxesUnits();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RectangularDetector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RectangularDetector, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_RectPixelMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  kvector_t arg1 ;
+  kvector_t arg2 ;
+  kvector_t arg3 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  RectPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_RectPixelMap",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_RectPixelMap" "', argument " "1"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp1) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectPixelMap" "', argument " "1"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp1);
+      arg1 = *temp;
+      if (SWIG_IsNewObj(res1)) delete temp;
+    }
+  }
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_RectPixelMap" "', argument " "2"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectPixelMap" "', argument " "2"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_RectPixelMap" "', argument " "3"" of type '" "kvector_t""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_RectPixelMap" "', argument " "3"" of type '" "kvector_t""'");
+    } else {
+      kvector_t * temp = reinterpret_cast< kvector_t * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (RectPixelMap *)new RectPixelMap(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectPixelMap, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_RectPixelMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectPixelMap *arg1 = (RectPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_RectPixelMap",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectPixelMap, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RectPixelMap" "', argument " "1"" of type '" "RectPixelMap *""'"); 
+  }
+  arg1 = reinterpret_cast< RectPixelMap * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectPixelMap_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectPixelMap *arg1 = (RectPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  RectPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectPixelMap_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectPixelMap_clone" "', argument " "1"" of type '" "RectPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectPixelMap * >(argp1);
+  result = (RectPixelMap *)((RectPixelMap const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectPixelMap, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectPixelMap_createZeroSizeMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectPixelMap *arg1 = (RectPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  RectPixelMap *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:RectPixelMap_createZeroSizeMap",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectPixelMap_createZeroSizeMap" "', argument " "1"" of type '" "RectPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectPixelMap_createZeroSizeMap" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectPixelMap_createZeroSizeMap" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (RectPixelMap *)((RectPixelMap const *)arg1)->createZeroSizeMap(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RectPixelMap, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectPixelMap_getK(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectPixelMap *arg1 = (RectPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  kvector_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:RectPixelMap_getK",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectPixelMap_getK" "', argument " "1"" of type '" "RectPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectPixelMap_getK" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectPixelMap_getK" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "RectPixelMap_getK" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = ((RectPixelMap const *)arg1)->getK(arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj((new kvector_t(static_cast< const kvector_t& >(result))), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectPixelMap_getIntegrationFactor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectPixelMap *arg1 = (RectPixelMap *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:RectPixelMap_getIntegrationFactor",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectPixelMap_getIntegrationFactor" "', argument " "1"" of type '" "RectPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectPixelMap * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RectPixelMap_getIntegrationFactor" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RectPixelMap_getIntegrationFactor" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((RectPixelMap const *)arg1)->getIntegrationFactor(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_RectPixelMap_getSolidAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RectPixelMap *arg1 = (RectPixelMap *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:RectPixelMap_getSolidAngle",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_RectPixelMap, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RectPixelMap_getSolidAngle" "', argument " "1"" of type '" "RectPixelMap const *""'"); 
+  }
+  arg1 = reinterpret_cast< RectPixelMap * >(argp1);
+  result = (double)((RectPixelMap const *)arg1)->getSolidAngle();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *RectPixelMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_RectPixelMap, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ResolutionFunction2DGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ResolutionFunction2DGaussian *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_ResolutionFunction2DGaussian",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_ResolutionFunction2DGaussian" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_ResolutionFunction2DGaussian" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (ResolutionFunction2DGaussian *)new ResolutionFunction2DGaussian(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ResolutionFunction2DGaussian, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ResolutionFunction2DGaussian_evaluateCDF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ResolutionFunction2DGaussian *arg1 = (ResolutionFunction2DGaussian *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:ResolutionFunction2DGaussian_evaluateCDF",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ResolutionFunction2DGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ResolutionFunction2DGaussian_evaluateCDF" "', argument " "1"" of type '" "ResolutionFunction2DGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< ResolutionFunction2DGaussian * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ResolutionFunction2DGaussian_evaluateCDF" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ResolutionFunction2DGaussian_evaluateCDF" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (double)((ResolutionFunction2DGaussian const *)arg1)->evaluateCDF(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ResolutionFunction2DGaussian_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ResolutionFunction2DGaussian *arg1 = (ResolutionFunction2DGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  ResolutionFunction2DGaussian *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ResolutionFunction2DGaussian_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ResolutionFunction2DGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ResolutionFunction2DGaussian_clone" "', argument " "1"" of type '" "ResolutionFunction2DGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< ResolutionFunction2DGaussian * >(argp1);
+  result = (ResolutionFunction2DGaussian *)((ResolutionFunction2DGaussian const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ResolutionFunction2DGaussian, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ResolutionFunction2DGaussian_getSigmaX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ResolutionFunction2DGaussian *arg1 = (ResolutionFunction2DGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ResolutionFunction2DGaussian_getSigmaX",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ResolutionFunction2DGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ResolutionFunction2DGaussian_getSigmaX" "', argument " "1"" of type '" "ResolutionFunction2DGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< ResolutionFunction2DGaussian * >(argp1);
+  result = (double)((ResolutionFunction2DGaussian const *)arg1)->getSigmaX();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ResolutionFunction2DGaussian_getSigmaY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ResolutionFunction2DGaussian *arg1 = (ResolutionFunction2DGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ResolutionFunction2DGaussian_getSigmaY",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ResolutionFunction2DGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ResolutionFunction2DGaussian_getSigmaY" "', argument " "1"" of type '" "ResolutionFunction2DGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< ResolutionFunction2DGaussian * >(argp1);
+  result = (double)((ResolutionFunction2DGaussian const *)arg1)->getSigmaY();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ResolutionFunction2DGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ResolutionFunction2DGaussian *arg1 = (ResolutionFunction2DGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ResolutionFunction2DGaussian",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ResolutionFunction2DGaussian, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ResolutionFunction2DGaussian" "', argument " "1"" of type '" "ResolutionFunction2DGaussian *""'"); 
+  }
+  arg1 = reinterpret_cast< ResolutionFunction2DGaussian * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ResolutionFunction2DGaussian_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ResolutionFunction2DGaussian, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SpecularSimulation__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SpecularSimulation")) SWIG_fail;
+  result = (SpecularSimulation *)new SpecularSimulation();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SpecularSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SpecularSimulation__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ISample *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SpecularSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_SpecularSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_ISample,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SpecularSimulation" "', argument " "1"" of type '" "ISample const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SpecularSimulation" "', argument " "1"" of type '" "ISample const &""'"); 
+  }
+  arg1 = reinterpret_cast< ISample * >(argp1);
+  result = (SpecularSimulation *)new SpecularSimulation((ISample const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SpecularSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SpecularSimulation__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::shared_ptr< IMultiLayerBuilder > arg1 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SpecularSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_SpecularSimulation",&obj0)) SWIG_fail;
+  {
+    int newmem = 0;
+    res1 = SWIG_ConvertPtrAndOwn(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t,  0 , &newmem);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SpecularSimulation" "', argument " "1"" of type '" "std::shared_ptr< IMultiLayerBuilder > const""'"); 
+    }
+    if (argp1) arg1 = *(reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp1));
+    if (newmem & SWIG_CAST_NEW_MEMORY) delete reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp1);
+  }
+  result = (SpecularSimulation *)new SpecularSimulation(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SpecularSimulation, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_SpecularSimulation(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_SpecularSimulation__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_ISample, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_SpecularSimulation__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_SpecularSimulation__SWIG_2(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_SpecularSimulation'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SpecularSimulation::SpecularSimulation()\n"
+    "    SpecularSimulation::SpecularSimulation(ISample const &)\n"
+    "    SpecularSimulation::SpecularSimulation(std::shared_ptr< IMultiLayerBuilder > const)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SpecularSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SpecularSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SpecularSimulation" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SpecularSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SpecularSimulation_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_clone" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  result = (SpecularSimulation *)((SpecularSimulation const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_runSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SpecularSimulation_runSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_runSimulation" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  (arg1)->runSimulation();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  ISample *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SpecularSimulation_setSample",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_setSample" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ISample,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SpecularSimulation_setSample" "', argument " "2"" of type '" "ISample const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SpecularSimulation_setSample" "', argument " "2"" of type '" "ISample const &""'"); 
+  }
+  arg2 = reinterpret_cast< ISample * >(argp2);
+  (arg1)->setSample((ISample const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_getSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  Swig::Director *director = 0;
+  ISample *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SpecularSimulation_getSample",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_getSample" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  result = (ISample *)((SpecularSimulation const *)arg1)->getSample();
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ISample, 0 |  0 );
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setSampleBuilderCpp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  std::shared_ptr< IMultiLayerBuilder > arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SpecularSimulation_setSampleBuilderCpp",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_setSampleBuilderCpp" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  {
+    int newmem = 0;
+    res2 = SWIG_ConvertPtrAndOwn(obj1, &argp2, SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t,  0 , &newmem);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SpecularSimulation_setSampleBuilderCpp" "', argument " "2"" of type '" "std::shared_ptr< IMultiLayerBuilder >""'"); 
+    }
+    if (argp2) arg2 = *(reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp2));
+    if (newmem & SWIG_CAST_NEW_MEMORY) delete reinterpret_cast< std::shared_ptr< IMultiLayerBuilder > * >(argp2);
+  }
+  (arg1)->setSampleBuilder(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_getSampleBuilder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::shared_ptr< IMultiLayerBuilder > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SpecularSimulation_getSampleBuilder",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_getSampleBuilder" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  result = ((SpecularSimulation const *)arg1)->getSampleBuilder();
+  {
+    std::shared_ptr<  IMultiLayerBuilder > *smartresult = result ? new std::shared_ptr<  IMultiLayerBuilder >(result) : 0;
+    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, SWIG_POINTER_OWN);
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setBeamParameters__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  double arg2 ;
+  IAxis *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SpecularSimulation_setBeamParameters",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SpecularSimulation_setBeamParameters" "', argument " "3"" of type '" "IAxis const &""'"); 
+  }
+  arg3 = reinterpret_cast< IAxis * >(argp3);
+  (arg1)->setBeamParameters(arg2,(IAxis const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setBeamParameters__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  double arg2 ;
+  int arg3 ;
+  double arg4 ;
+  double arg5 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  double val5 ;
+  int ecode5 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  PyObject * obj4 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SpecularSimulation_setBeamParameters",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  ecode5 = SWIG_AsVal_double(obj4, &val5);
+  if (!SWIG_IsOK(ecode5)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SpecularSimulation_setBeamParameters" "', argument " "5"" of type '" "double""'");
+  } 
+  arg5 = static_cast< double >(val5);
+  (arg1)->setBeamParameters(arg2,arg3,arg4,arg5);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setBeamParameters(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[6] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 5) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SpecularSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_IAxis, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_SpecularSimulation_setBeamParameters__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 5) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SpecularSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            {
+              int res = SWIG_AsVal_double(argv[4], NULL);
+              _v = SWIG_CheckState(res);
+            }
+            if (_v) {
+              return _wrap_SpecularSimulation_setBeamParameters__SWIG_1(self, args);
+            }
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SpecularSimulation_setBeamParameters'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SpecularSimulation::setBeamParameters(double,IAxis const &)\n"
+    "    SpecularSimulation::setBeamParameters(double,int,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setEvanescentWaveAxis__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  IAxis *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SpecularSimulation_setEvanescentWaveAxis",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_setEvanescentWaveAxis" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_IAxis,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SpecularSimulation_setEvanescentWaveAxis" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SpecularSimulation_setEvanescentWaveAxis" "', argument " "2"" of type '" "IAxis const &""'"); 
+  }
+  arg2 = reinterpret_cast< IAxis * >(argp2);
+  (arg1)->setEvanescentWaveAxis((IAxis const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setEvanescentWaveAxis__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  int arg2 ;
+  double arg3 ;
+  double arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:SpecularSimulation_setEvanescentWaveAxis",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_setEvanescentWaveAxis" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SpecularSimulation_setEvanescentWaveAxis" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SpecularSimulation_setEvanescentWaveAxis" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SpecularSimulation_setEvanescentWaveAxis" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  (arg1)->setEvanescentWaveAxis(arg2,arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_setEvanescentWaveAxis(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SpecularSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_IAxis, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_SpecularSimulation_setEvanescentWaveAxis__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SpecularSimulation, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_SpecularSimulation_setEvanescentWaveAxis__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SpecularSimulation_setEvanescentWaveAxis'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    SpecularSimulation::setEvanescentWaveAxis(IAxis const &)\n"
+    "    SpecularSimulation::setEvanescentWaveAxis(int,double,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_getAlphaAxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IAxis *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SpecularSimulation_getAlphaAxis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_getAlphaAxis" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  result = (IAxis *)((SpecularSimulation const *)arg1)->getAlphaAxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IAxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_getScalarR(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< complex_t,std::allocator< complex_t > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SpecularSimulation_getScalarR",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_getScalarR" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SpecularSimulation_getScalarR" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((SpecularSimulation const *)arg1)->getScalarR(arg2);
+  resultobj = swig::from(static_cast< std::vector< std::complex< double >,std::allocator< std::complex< double > > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_getScalarT(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< complex_t,std::allocator< complex_t > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SpecularSimulation_getScalarT",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_getScalarT" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SpecularSimulation_getScalarT" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((SpecularSimulation const *)arg1)->getScalarT(arg2);
+  resultobj = swig::from(static_cast< std::vector< std::complex< double >,std::allocator< std::complex< double > > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_getScalarKz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< complex_t,std::allocator< complex_t > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SpecularSimulation_getScalarKz",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_getScalarKz" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SpecularSimulation_getScalarKz" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((SpecularSimulation const *)arg1)->getScalarKz(arg2);
+  resultobj = swig::from(static_cast< std::vector< std::complex< double >,std::allocator< std::complex< double > > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_getLayerRTCoefficients(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  size_t arg2 ;
+  size_t arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  SwigValueWrapper< std::shared_ptr< ILayerRTCoefficients const > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SpecularSimulation_getLayerRTCoefficients",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_getLayerRTCoefficients" "', argument " "1"" of type '" "SpecularSimulation const *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SpecularSimulation_getLayerRTCoefficients" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SpecularSimulation_getLayerRTCoefficients" "', argument " "3"" of type '" "size_t""'");
+  } 
+  arg3 = static_cast< size_t >(val3);
+  result = ((SpecularSimulation const *)arg1)->getLayerRTCoefficients(arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new SpecularSimulation::LayerRTCoefficients_t(static_cast< const SpecularSimulation::LayerRTCoefficients_t& >(result))), SWIGTYPE_p_std__shared_ptrT_ILayerRTCoefficients_const_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SpecularSimulation_prepareSimulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SpecularSimulation *arg1 = (SpecularSimulation *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SpecularSimulation_prepareSimulation",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SpecularSimulation, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SpecularSimulation_prepareSimulation" "', argument " "1"" of type '" "SpecularSimulation *""'"); 
+  }
+  arg1 = reinterpret_cast< SpecularSimulation * >(argp1);
+  (arg1)->prepareSimulation();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SpecularSimulation_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SpecularSimulation, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_ThreadInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_ThreadInfo")) SWIG_fail;
+  result = (ThreadInfo *)new ThreadInfo();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ThreadInfo, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_n_threads_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ThreadInfo_n_threads_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_n_threads_set" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ThreadInfo_n_threads_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->n_threads = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_n_threads_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ThreadInfo_n_threads_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_n_threads_get" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  result = (int) ((arg1)->n_threads);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_current_thread_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ThreadInfo_current_thread_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_current_thread_set" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ThreadInfo_current_thread_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->current_thread = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_current_thread_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ThreadInfo_current_thread_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_current_thread_get" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  result = (int) ((arg1)->current_thread);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_n_batches_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ThreadInfo_n_batches_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_n_batches_set" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ThreadInfo_n_batches_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->n_batches = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_n_batches_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ThreadInfo_n_batches_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_n_batches_get" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  result = (int) ((arg1)->n_batches);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_current_batch_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:ThreadInfo_current_batch_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_current_batch_set" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ThreadInfo_current_batch_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->current_batch = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ThreadInfo_current_batch_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:ThreadInfo_current_batch_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ThreadInfo_current_batch_get" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  result = (int) ((arg1)->current_batch);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ThreadInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ThreadInfo *arg1 = (ThreadInfo *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_ThreadInfo",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ThreadInfo, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ThreadInfo" "', argument " "1"" of type '" "ThreadInfo *""'"); 
+  }
+  arg1 = reinterpret_cast< ThreadInfo * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ThreadInfo_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_ThreadInfo, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SampleBuilderFactoryTemp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SampleBuilderFactoryTemp")) SWIG_fail;
+  result = (IFactory< std::string,IMultiLayerBuilder > *)new IFactory< std::string,IMultiLayerBuilder >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactoryTemp_createItem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *arg1 = (IFactory< std::string,IMultiLayerBuilder > *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  Swig::Director *director = 0;
+  IMultiLayerBuilder *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SampleBuilderFactoryTemp_createItem",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SampleBuilderFactoryTemp_createItem" "', argument " "1"" of type '" "IFactory< std::string,IMultiLayerBuilder > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SampleBuilderFactoryTemp_createItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SampleBuilderFactoryTemp_createItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (IMultiLayerBuilder *)(arg1)->createItem((std::string const &)*arg2);
+  director = SWIG_DIRECTOR_CAST(result);
+  if (director) {
+    resultobj = director->swig_get_self();
+    Py_INCREF(resultobj);
+  } else {
+    {
+      std::shared_ptr<  IMultiLayerBuilder > *smartresult = result ? new std::shared_ptr<  IMultiLayerBuilder >(result SWIG_NO_NULL_DELETER_0) : 0;
+      resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(smartresult), SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t, 0 | SWIG_POINTER_OWN);
+    }
+  }
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactoryTemp_registerItem__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *arg1 = (IFactory< std::string,IMultiLayerBuilder > *) 0 ;
+  std::string *arg2 = 0 ;
+  SwigValueWrapper< std::function< IMultiLayerBuilder *() > > arg3 ;
+  std::string *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 ;
+  int res3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:SampleBuilderFactoryTemp_registerItem",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "1"" of type '" "IFactory< std::string,IMultiLayerBuilder > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback""'");
+    } else {
+      IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback * temp = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  result = (bool)(arg1)->registerItem((std::string const &)*arg2,arg3,(std::string const &)*arg4);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactoryTemp_registerItem__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *arg1 = (IFactory< std::string,IMultiLayerBuilder > *) 0 ;
+  std::string *arg2 = 0 ;
+  SwigValueWrapper< std::function< IMultiLayerBuilder *() > > arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SampleBuilderFactoryTemp_registerItem",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "1"" of type '" "IFactory< std::string,IMultiLayerBuilder > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SampleBuilderFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback""'");
+    } else {
+      IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback * temp = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (bool)(arg1)->registerItem((std::string const &)*arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactoryTemp_registerItem(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_SampleBuilderFactoryTemp_registerItem__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__functionT_IMultiLayerBuilder_pfF_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_SampleBuilderFactoryTemp_registerItem__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SampleBuilderFactoryTemp_registerItem'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IFactory< std::string,IMultiLayerBuilder >::registerItem(std::string const &,IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback,std::string const &)\n"
+    "    IFactory< std::string,IMultiLayerBuilder >::registerItem(std::string const &,IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SampleBuilderFactoryTemp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *arg1 = (IFactory< std::string,IMultiLayerBuilder > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SampleBuilderFactoryTemp",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SampleBuilderFactoryTemp" "', argument " "1"" of type '" "IFactory< std::string,IMultiLayerBuilder > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactoryTemp_getNumberOfRegistered(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *arg1 = (IFactory< std::string,IMultiLayerBuilder > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SampleBuilderFactoryTemp_getNumberOfRegistered",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SampleBuilderFactoryTemp_getNumberOfRegistered" "', argument " "1"" of type '" "IFactory< std::string,IMultiLayerBuilder > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder > * >(argp1);
+  result = ((IFactory< std::string,IMultiLayerBuilder > const *)arg1)->getNumberOfRegistered();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactoryTemp_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *arg1 = (IFactory< std::string,IMultiLayerBuilder > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::map< std::string,std::string >::const_iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SampleBuilderFactoryTemp_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SampleBuilderFactoryTemp_begin" "', argument " "1"" of type '" "IFactory< std::string,IMultiLayerBuilder > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder > * >(argp1);
+  result = ((IFactory< std::string,IMultiLayerBuilder > const *)arg1)->begin();
+  resultobj = SWIG_NewPointerObj((new IFactory< std::string,IMultiLayerBuilder >::const_iterator(static_cast< const IFactory< std::string,IMultiLayerBuilder >::const_iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_std__string_t__const_iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactoryTemp_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,IMultiLayerBuilder > *arg1 = (IFactory< std::string,IMultiLayerBuilder > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::map< std::string,std::string >::const_iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SampleBuilderFactoryTemp_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SampleBuilderFactoryTemp_end" "', argument " "1"" of type '" "IFactory< std::string,IMultiLayerBuilder > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,IMultiLayerBuilder > * >(argp1);
+  result = ((IFactory< std::string,IMultiLayerBuilder > const *)arg1)->end();
+  resultobj = SWIG_NewPointerObj((new IFactory< std::string,IMultiLayerBuilder >::const_iterator(static_cast< const IFactory< std::string,IMultiLayerBuilder >::const_iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_std__string_t__const_iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SampleBuilderFactoryTemp_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFactoryT_std__string_IMultiLayerBuilder_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SampleBuilderFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SampleBuilderFactory *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SampleBuilderFactory")) SWIG_fail;
+  result = (SampleBuilderFactory *)new SampleBuilderFactory();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SampleBuilderFactory, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SampleBuilderFactory_createSample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SampleBuilderFactory *arg1 = (SampleBuilderFactory *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  MultiLayer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SampleBuilderFactory_createSample",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SampleBuilderFactory, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SampleBuilderFactory_createSample" "', argument " "1"" of type '" "SampleBuilderFactory *""'"); 
+  }
+  arg1 = reinterpret_cast< SampleBuilderFactory * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SampleBuilderFactory_createSample" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SampleBuilderFactory_createSample" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (MultiLayer *)(arg1)->createSample((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SampleBuilderFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SampleBuilderFactory *arg1 = (SampleBuilderFactory *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SampleBuilderFactory",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SampleBuilderFactory, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SampleBuilderFactory" "', argument " "1"" of type '" "SampleBuilderFactory *""'"); 
+  }
+  arg1 = reinterpret_cast< SampleBuilderFactory * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SampleBuilderFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SampleBuilderFactory, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SimulationFactoryTemp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SimulationFactoryTemp")) SWIG_fail;
+  result = (IFactory< std::string,GISASSimulation > *)new IFactory< std::string,GISASSimulation >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationFactoryTemp_createItem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *arg1 = (IFactory< std::string,GISASSimulation > *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  GISASSimulation *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SimulationFactoryTemp_createItem",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationFactoryTemp_createItem" "', argument " "1"" of type '" "IFactory< std::string,GISASSimulation > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,GISASSimulation > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationFactoryTemp_createItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationFactoryTemp_createItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (GISASSimulation *)(arg1)->createItem((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_GISASSimulation, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationFactoryTemp_registerItem__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *arg1 = (IFactory< std::string,GISASSimulation > *) 0 ;
+  std::string *arg2 = 0 ;
+  SwigValueWrapper< std::function< GISASSimulation *() > > arg3 ;
+  std::string *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 ;
+  int res3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:SimulationFactoryTemp_registerItem",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationFactoryTemp_registerItem" "', argument " "1"" of type '" "IFactory< std::string,GISASSimulation > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,GISASSimulation > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__functionT_GISASSimulation_pfF_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SimulationFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,GISASSimulation >::CreateItemCallback""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,GISASSimulation >::CreateItemCallback""'");
+    } else {
+      IFactory< std::string,GISASSimulation >::CreateItemCallback * temp = reinterpret_cast< IFactory< std::string,GISASSimulation >::CreateItemCallback * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SimulationFactoryTemp_registerItem" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationFactoryTemp_registerItem" "', argument " "4"" of type '" "std::string const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  result = (bool)(arg1)->registerItem((std::string const &)*arg2,arg3,(std::string const &)*arg4);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationFactoryTemp_registerItem__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *arg1 = (IFactory< std::string,GISASSimulation > *) 0 ;
+  std::string *arg2 = 0 ;
+  SwigValueWrapper< std::function< GISASSimulation *() > > arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:SimulationFactoryTemp_registerItem",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationFactoryTemp_registerItem" "', argument " "1"" of type '" "IFactory< std::string,GISASSimulation > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,GISASSimulation > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SimulationFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationFactoryTemp_registerItem" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__functionT_GISASSimulation_pfF_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SimulationFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,GISASSimulation >::CreateItemCallback""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SimulationFactoryTemp_registerItem" "', argument " "3"" of type '" "IFactory< std::string,GISASSimulation >::CreateItemCallback""'");
+    } else {
+      IFactory< std::string,GISASSimulation >::CreateItemCallback * temp = reinterpret_cast< IFactory< std::string,GISASSimulation >::CreateItemCallback * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (bool)(arg1)->registerItem((std::string const &)*arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationFactoryTemp_registerItem(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__functionT_GISASSimulation_pfF_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_SimulationFactoryTemp_registerItem__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__functionT_GISASSimulation_pfF_t, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_SimulationFactoryTemp_registerItem__SWIG_0(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SimulationFactoryTemp_registerItem'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    IFactory< std::string,GISASSimulation >::registerItem(std::string const &,IFactory< std::string,GISASSimulation >::CreateItemCallback,std::string const &)\n"
+    "    IFactory< std::string,GISASSimulation >::registerItem(std::string const &,IFactory< std::string,GISASSimulation >::CreateItemCallback)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SimulationFactoryTemp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *arg1 = (IFactory< std::string,GISASSimulation > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SimulationFactoryTemp",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SimulationFactoryTemp" "', argument " "1"" of type '" "IFactory< std::string,GISASSimulation > *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,GISASSimulation > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationFactoryTemp_getNumberOfRegistered(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *arg1 = (IFactory< std::string,GISASSimulation > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationFactoryTemp_getNumberOfRegistered",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationFactoryTemp_getNumberOfRegistered" "', argument " "1"" of type '" "IFactory< std::string,GISASSimulation > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,GISASSimulation > * >(argp1);
+  result = ((IFactory< std::string,GISASSimulation > const *)arg1)->getNumberOfRegistered();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationFactoryTemp_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *arg1 = (IFactory< std::string,GISASSimulation > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::map< std::string,std::string >::const_iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationFactoryTemp_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationFactoryTemp_begin" "', argument " "1"" of type '" "IFactory< std::string,GISASSimulation > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,GISASSimulation > * >(argp1);
+  result = ((IFactory< std::string,GISASSimulation > const *)arg1)->begin();
+  resultobj = SWIG_NewPointerObj((new IFactory< std::string,GISASSimulation >::const_iterator(static_cast< const IFactory< std::string,GISASSimulation >::const_iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_std__string_t__const_iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SimulationFactoryTemp_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFactory< std::string,GISASSimulation > *arg1 = (IFactory< std::string,GISASSimulation > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::map< std::string,std::string >::const_iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SimulationFactoryTemp_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SimulationFactoryTemp_end" "', argument " "1"" of type '" "IFactory< std::string,GISASSimulation > const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFactory< std::string,GISASSimulation > * >(argp1);
+  result = ((IFactory< std::string,GISASSimulation > const *)arg1)->end();
+  resultobj = SWIG_NewPointerObj((new IFactory< std::string,GISASSimulation >::const_iterator(static_cast< const IFactory< std::string,GISASSimulation >::const_iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_std__string_t__const_iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SimulationFactoryTemp_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFactoryT_std__string_GISASSimulation_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_SimulationFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationFactory *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_SimulationFactory")) SWIG_fail;
+  result = (SimulationFactory *)new SimulationFactory();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimulationFactory, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_SimulationFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  SimulationFactory *arg1 = (SimulationFactory *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SimulationFactory",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_SimulationFactory, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SimulationFactory" "', argument " "1"" of type '" "SimulationFactory *""'"); 
+  }
+  arg1 = reinterpret_cast< SimulationFactory * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *SimulationFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_SimulationFactory, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+static PyMethodDef SwigMethods[] = {
+	 { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL},
+	 { (char *)"delete_SwigPyIterator", _wrap_delete_SwigPyIterator, METH_VARARGS, (char *)"delete_SwigPyIterator(SwigPyIterator self)"},
+	 { (char *)"SwigPyIterator_value", _wrap_SwigPyIterator_value, METH_VARARGS, (char *)"SwigPyIterator_value(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator_incr", _wrap_SwigPyIterator_incr, METH_VARARGS, (char *)"\n"
+		"incr(size_t n=1) -> SwigPyIterator\n"
+		"SwigPyIterator_incr(SwigPyIterator self) -> SwigPyIterator\n"
+		""},
+	 { (char *)"SwigPyIterator_decr", _wrap_SwigPyIterator_decr, METH_VARARGS, (char *)"\n"
+		"decr(size_t n=1) -> SwigPyIterator\n"
+		"SwigPyIterator_decr(SwigPyIterator self) -> SwigPyIterator\n"
+		""},
+	 { (char *)"SwigPyIterator_distance", _wrap_SwigPyIterator_distance, METH_VARARGS, (char *)"SwigPyIterator_distance(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t"},
+	 { (char *)"SwigPyIterator_equal", _wrap_SwigPyIterator_equal, METH_VARARGS, (char *)"SwigPyIterator_equal(SwigPyIterator self, SwigPyIterator x) -> bool"},
+	 { (char *)"SwigPyIterator_copy", _wrap_SwigPyIterator_copy, METH_VARARGS, (char *)"SwigPyIterator_copy(SwigPyIterator self) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator_next", _wrap_SwigPyIterator_next, METH_VARARGS, (char *)"SwigPyIterator_next(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator___next__", _wrap_SwigPyIterator___next__, METH_VARARGS, (char *)"SwigPyIterator___next__(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator_previous", _wrap_SwigPyIterator_previous, METH_VARARGS, (char *)"SwigPyIterator_previous(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator_advance", _wrap_SwigPyIterator_advance, METH_VARARGS, (char *)"SwigPyIterator_advance(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___eq__", _wrap_SwigPyIterator___eq__, METH_VARARGS, (char *)"SwigPyIterator___eq__(SwigPyIterator self, SwigPyIterator x) -> bool"},
+	 { (char *)"SwigPyIterator___ne__", _wrap_SwigPyIterator___ne__, METH_VARARGS, (char *)"SwigPyIterator___ne__(SwigPyIterator self, SwigPyIterator x) -> bool"},
+	 { (char *)"SwigPyIterator___iadd__", _wrap_SwigPyIterator___iadd__, METH_VARARGS, (char *)"SwigPyIterator___iadd__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___isub__", _wrap_SwigPyIterator___isub__, METH_VARARGS, (char *)"SwigPyIterator___isub__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___add__", _wrap_SwigPyIterator___add__, METH_VARARGS, (char *)"SwigPyIterator___add__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___sub__", _wrap_SwigPyIterator___sub__, METH_VARARGS, (char *)"\n"
+		"__sub__(ptrdiff_t n) -> SwigPyIterator\n"
+		"SwigPyIterator___sub__(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t\n"
+		""},
+	 { (char *)"SwigPyIterator_swigregister", SwigPyIterator_swigregister, METH_VARARGS, NULL},
+	 { (char *)"SHARED_PTR_DISOWN_swigconstant", SHARED_PTR_DISOWN_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"vdouble1d_t_iterator", _wrap_vdouble1d_t_iterator, METH_VARARGS, (char *)"vdouble1d_t_iterator(vdouble1d_t self) -> SwigPyIterator"},
+	 { (char *)"vdouble1d_t___nonzero__", _wrap_vdouble1d_t___nonzero__, METH_VARARGS, (char *)"vdouble1d_t___nonzero__(vdouble1d_t self) -> bool"},
+	 { (char *)"vdouble1d_t___bool__", _wrap_vdouble1d_t___bool__, METH_VARARGS, (char *)"vdouble1d_t___bool__(vdouble1d_t self) -> bool"},
+	 { (char *)"vdouble1d_t___len__", _wrap_vdouble1d_t___len__, METH_VARARGS, (char *)"vdouble1d_t___len__(vdouble1d_t self) -> std::vector< double >::size_type"},
+	 { (char *)"vdouble1d_t___getslice__", _wrap_vdouble1d_t___getslice__, METH_VARARGS, (char *)"vdouble1d_t___getslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j) -> vdouble1d_t"},
+	 { (char *)"vdouble1d_t___setslice__", _wrap_vdouble1d_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< double >::difference_type i, std::vector< double >::difference_type j)\n"
+		"vdouble1d_t___setslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j, vdouble1d_t v)\n"
+		""},
+	 { (char *)"vdouble1d_t___delslice__", _wrap_vdouble1d_t___delslice__, METH_VARARGS, (char *)"vdouble1d_t___delslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j)"},
+	 { (char *)"vdouble1d_t___delitem__", _wrap_vdouble1d_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< double >::difference_type i)\n"
+		"vdouble1d_t___delitem__(vdouble1d_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vdouble1d_t___getitem__", _wrap_vdouble1d_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vdouble1d_t\n"
+		"vdouble1d_t___getitem__(vdouble1d_t self, std::vector< double >::difference_type i) -> std::vector< double >::value_type const &\n"
+		""},
+	 { (char *)"vdouble1d_t___setitem__", _wrap_vdouble1d_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vdouble1d_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vdouble1d_t___setitem__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::value_type const & x)\n"
+		""},
+	 { (char *)"vdouble1d_t_pop", _wrap_vdouble1d_t_pop, METH_VARARGS, (char *)"vdouble1d_t_pop(vdouble1d_t self) -> std::vector< double >::value_type"},
+	 { (char *)"vdouble1d_t_append", _wrap_vdouble1d_t_append, METH_VARARGS, (char *)"vdouble1d_t_append(vdouble1d_t self, std::vector< double >::value_type const & x)"},
+	 { (char *)"vdouble1d_t_empty", _wrap_vdouble1d_t_empty, METH_VARARGS, (char *)"vdouble1d_t_empty(vdouble1d_t self) -> bool"},
+	 { (char *)"vdouble1d_t_size", _wrap_vdouble1d_t_size, METH_VARARGS, (char *)"vdouble1d_t_size(vdouble1d_t self) -> std::vector< double >::size_type"},
+	 { (char *)"vdouble1d_t_swap", _wrap_vdouble1d_t_swap, METH_VARARGS, (char *)"\n"
+		"vdouble1d_t_swap(vdouble1d_t self, vdouble1d_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vdouble1d_t_begin", _wrap_vdouble1d_t_begin, METH_VARARGS, (char *)"vdouble1d_t_begin(vdouble1d_t self) -> std::vector< double >::iterator"},
+	 { (char *)"vdouble1d_t_end", _wrap_vdouble1d_t_end, METH_VARARGS, (char *)"vdouble1d_t_end(vdouble1d_t self) -> std::vector< double >::iterator"},
+	 { (char *)"vdouble1d_t_rbegin", _wrap_vdouble1d_t_rbegin, METH_VARARGS, (char *)"vdouble1d_t_rbegin(vdouble1d_t self) -> std::vector< double >::reverse_iterator"},
+	 { (char *)"vdouble1d_t_rend", _wrap_vdouble1d_t_rend, METH_VARARGS, (char *)"vdouble1d_t_rend(vdouble1d_t self) -> std::vector< double >::reverse_iterator"},
+	 { (char *)"vdouble1d_t_clear", _wrap_vdouble1d_t_clear, METH_VARARGS, (char *)"vdouble1d_t_clear(vdouble1d_t self)"},
+	 { (char *)"vdouble1d_t_get_allocator", _wrap_vdouble1d_t_get_allocator, METH_VARARGS, (char *)"vdouble1d_t_get_allocator(vdouble1d_t self) -> std::vector< double >::allocator_type"},
+	 { (char *)"vdouble1d_t_pop_back", _wrap_vdouble1d_t_pop_back, METH_VARARGS, (char *)"vdouble1d_t_pop_back(vdouble1d_t self)"},
+	 { (char *)"vdouble1d_t_erase", _wrap_vdouble1d_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< double >::iterator pos) -> std::vector< double >::iterator\n"
+		"vdouble1d_t_erase(vdouble1d_t self, std::vector< double >::iterator first, std::vector< double >::iterator last) -> std::vector< double >::iterator\n"
+		""},
+	 { (char *)"new_vdouble1d_t", _wrap_new_vdouble1d_t, METH_VARARGS, (char *)"\n"
+		"vdouble1d_t()\n"
+		"vdouble1d_t(vdouble1d_t arg2)\n"
+		"vdouble1d_t(std::vector< double >::size_type size)\n"
+		"new_vdouble1d_t(std::vector< double >::size_type size, std::vector< double >::value_type const & value) -> vdouble1d_t\n"
+		""},
+	 { (char *)"vdouble1d_t_push_back", _wrap_vdouble1d_t_push_back, METH_VARARGS, (char *)"vdouble1d_t_push_back(vdouble1d_t self, std::vector< double >::value_type const & x)"},
+	 { (char *)"vdouble1d_t_front", _wrap_vdouble1d_t_front, METH_VARARGS, (char *)"vdouble1d_t_front(vdouble1d_t self) -> std::vector< double >::value_type const &"},
+	 { (char *)"vdouble1d_t_back", _wrap_vdouble1d_t_back, METH_VARARGS, (char *)"vdouble1d_t_back(vdouble1d_t self) -> std::vector< double >::value_type const &"},
+	 { (char *)"vdouble1d_t_assign", _wrap_vdouble1d_t_assign, METH_VARARGS, (char *)"vdouble1d_t_assign(vdouble1d_t self, std::vector< double >::size_type n, std::vector< double >::value_type const & x)"},
+	 { (char *)"vdouble1d_t_resize", _wrap_vdouble1d_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< double >::size_type new_size)\n"
+		"vdouble1d_t_resize(vdouble1d_t self, std::vector< double >::size_type new_size, std::vector< double >::value_type const & x)\n"
+		""},
+	 { (char *)"vdouble1d_t_insert", _wrap_vdouble1d_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< double >::iterator pos, std::vector< double >::value_type const & x) -> std::vector< double >::iterator\n"
+		"vdouble1d_t_insert(vdouble1d_t self, std::vector< double >::iterator pos, std::vector< double >::size_type n, std::vector< double >::value_type const & x)\n"
+		""},
+	 { (char *)"vdouble1d_t_reserve", _wrap_vdouble1d_t_reserve, METH_VARARGS, (char *)"vdouble1d_t_reserve(vdouble1d_t self, std::vector< double >::size_type n)"},
+	 { (char *)"vdouble1d_t_capacity", _wrap_vdouble1d_t_capacity, METH_VARARGS, (char *)"vdouble1d_t_capacity(vdouble1d_t self) -> std::vector< double >::size_type"},
+	 { (char *)"delete_vdouble1d_t", _wrap_delete_vdouble1d_t, METH_VARARGS, (char *)"delete_vdouble1d_t(vdouble1d_t self)"},
+	 { (char *)"vdouble1d_t_swigregister", vdouble1d_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vdouble2d_t_iterator", _wrap_vdouble2d_t_iterator, METH_VARARGS, (char *)"vdouble2d_t_iterator(vdouble2d_t self) -> SwigPyIterator"},
+	 { (char *)"vdouble2d_t___nonzero__", _wrap_vdouble2d_t___nonzero__, METH_VARARGS, (char *)"vdouble2d_t___nonzero__(vdouble2d_t self) -> bool"},
+	 { (char *)"vdouble2d_t___bool__", _wrap_vdouble2d_t___bool__, METH_VARARGS, (char *)"vdouble2d_t___bool__(vdouble2d_t self) -> bool"},
+	 { (char *)"vdouble2d_t___len__", _wrap_vdouble2d_t___len__, METH_VARARGS, (char *)"vdouble2d_t___len__(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"},
+	 { (char *)"vdouble2d_t___getslice__", _wrap_vdouble2d_t___getslice__, METH_VARARGS, (char *)"vdouble2d_t___getslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j) -> vdouble2d_t"},
+	 { (char *)"vdouble2d_t___setslice__", _wrap_vdouble2d_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)\n"
+		"vdouble2d_t___setslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j, vdouble2d_t v)\n"
+		""},
+	 { (char *)"vdouble2d_t___delslice__", _wrap_vdouble2d_t___delslice__, METH_VARARGS, (char *)"vdouble2d_t___delslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)"},
+	 { (char *)"vdouble2d_t___delitem__", _wrap_vdouble2d_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< std::vector< double > >::difference_type i)\n"
+		"vdouble2d_t___delitem__(vdouble2d_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vdouble2d_t___getitem__", _wrap_vdouble2d_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vdouble2d_t\n"
+		"vdouble2d_t___getitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i) -> vdouble1d_t\n"
+		""},
+	 { (char *)"vdouble2d_t___setitem__", _wrap_vdouble2d_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vdouble2d_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vdouble2d_t___setitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, vdouble1d_t x)\n"
+		""},
+	 { (char *)"vdouble2d_t_pop", _wrap_vdouble2d_t_pop, METH_VARARGS, (char *)"vdouble2d_t_pop(vdouble2d_t self) -> vdouble1d_t"},
+	 { (char *)"vdouble2d_t_append", _wrap_vdouble2d_t_append, METH_VARARGS, (char *)"vdouble2d_t_append(vdouble2d_t self, vdouble1d_t x)"},
+	 { (char *)"vdouble2d_t_empty", _wrap_vdouble2d_t_empty, METH_VARARGS, (char *)"vdouble2d_t_empty(vdouble2d_t self) -> bool"},
+	 { (char *)"vdouble2d_t_size", _wrap_vdouble2d_t_size, METH_VARARGS, (char *)"vdouble2d_t_size(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"},
+	 { (char *)"vdouble2d_t_swap", _wrap_vdouble2d_t_swap, METH_VARARGS, (char *)"\n"
+		"vdouble2d_t_swap(vdouble2d_t self, vdouble2d_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vdouble2d_t_begin", _wrap_vdouble2d_t_begin, METH_VARARGS, (char *)"vdouble2d_t_begin(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"},
+	 { (char *)"vdouble2d_t_end", _wrap_vdouble2d_t_end, METH_VARARGS, (char *)"vdouble2d_t_end(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"},
+	 { (char *)"vdouble2d_t_rbegin", _wrap_vdouble2d_t_rbegin, METH_VARARGS, (char *)"vdouble2d_t_rbegin(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"},
+	 { (char *)"vdouble2d_t_rend", _wrap_vdouble2d_t_rend, METH_VARARGS, (char *)"vdouble2d_t_rend(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"},
+	 { (char *)"vdouble2d_t_clear", _wrap_vdouble2d_t_clear, METH_VARARGS, (char *)"vdouble2d_t_clear(vdouble2d_t self)"},
+	 { (char *)"vdouble2d_t_get_allocator", _wrap_vdouble2d_t_get_allocator, METH_VARARGS, (char *)"vdouble2d_t_get_allocator(vdouble2d_t self) -> std::vector< std::vector< double > >::allocator_type"},
+	 { (char *)"vdouble2d_t_pop_back", _wrap_vdouble2d_t_pop_back, METH_VARARGS, (char *)"vdouble2d_t_pop_back(vdouble2d_t self)"},
+	 { (char *)"vdouble2d_t_erase", _wrap_vdouble2d_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< std::vector< double > >::iterator pos) -> std::vector< std::vector< double > >::iterator\n"
+		"vdouble2d_t_erase(vdouble2d_t self, std::vector< std::vector< double > >::iterator first, std::vector< std::vector< double > >::iterator last) -> std::vector< std::vector< double > >::iterator\n"
+		""},
+	 { (char *)"new_vdouble2d_t", _wrap_new_vdouble2d_t, METH_VARARGS, (char *)"\n"
+		"vdouble2d_t()\n"
+		"vdouble2d_t(vdouble2d_t arg2)\n"
+		"vdouble2d_t(std::vector< std::vector< double > >::size_type size)\n"
+		"new_vdouble2d_t(std::vector< std::vector< double > >::size_type size, vdouble1d_t value) -> vdouble2d_t\n"
+		""},
+	 { (char *)"vdouble2d_t_push_back", _wrap_vdouble2d_t_push_back, METH_VARARGS, (char *)"vdouble2d_t_push_back(vdouble2d_t self, vdouble1d_t x)"},
+	 { (char *)"vdouble2d_t_front", _wrap_vdouble2d_t_front, METH_VARARGS, (char *)"vdouble2d_t_front(vdouble2d_t self) -> vdouble1d_t"},
+	 { (char *)"vdouble2d_t_back", _wrap_vdouble2d_t_back, METH_VARARGS, (char *)"vdouble2d_t_back(vdouble2d_t self) -> vdouble1d_t"},
+	 { (char *)"vdouble2d_t_assign", _wrap_vdouble2d_t_assign, METH_VARARGS, (char *)"vdouble2d_t_assign(vdouble2d_t self, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)"},
+	 { (char *)"vdouble2d_t_resize", _wrap_vdouble2d_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< std::vector< double > >::size_type new_size)\n"
+		"vdouble2d_t_resize(vdouble2d_t self, std::vector< std::vector< double > >::size_type new_size, vdouble1d_t x)\n"
+		""},
+	 { (char *)"vdouble2d_t_insert", _wrap_vdouble2d_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< std::vector< double > >::iterator pos, vdouble1d_t x) -> std::vector< std::vector< double > >::iterator\n"
+		"vdouble2d_t_insert(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)\n"
+		""},
+	 { (char *)"vdouble2d_t_reserve", _wrap_vdouble2d_t_reserve, METH_VARARGS, (char *)"vdouble2d_t_reserve(vdouble2d_t self, std::vector< std::vector< double > >::size_type n)"},
+	 { (char *)"vdouble2d_t_capacity", _wrap_vdouble2d_t_capacity, METH_VARARGS, (char *)"vdouble2d_t_capacity(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"},
+	 { (char *)"delete_vdouble2d_t", _wrap_delete_vdouble2d_t, METH_VARARGS, (char *)"delete_vdouble2d_t(vdouble2d_t self)"},
+	 { (char *)"vdouble2d_t_swigregister", vdouble2d_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_integer_t_iterator", _wrap_vector_integer_t_iterator, METH_VARARGS, (char *)"vector_integer_t_iterator(vector_integer_t self) -> SwigPyIterator"},
+	 { (char *)"vector_integer_t___nonzero__", _wrap_vector_integer_t___nonzero__, METH_VARARGS, (char *)"vector_integer_t___nonzero__(vector_integer_t self) -> bool"},
+	 { (char *)"vector_integer_t___bool__", _wrap_vector_integer_t___bool__, METH_VARARGS, (char *)"vector_integer_t___bool__(vector_integer_t self) -> bool"},
+	 { (char *)"vector_integer_t___len__", _wrap_vector_integer_t___len__, METH_VARARGS, (char *)"vector_integer_t___len__(vector_integer_t self) -> std::vector< int >::size_type"},
+	 { (char *)"vector_integer_t___getslice__", _wrap_vector_integer_t___getslice__, METH_VARARGS, (char *)"vector_integer_t___getslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j) -> vector_integer_t"},
+	 { (char *)"vector_integer_t___setslice__", _wrap_vector_integer_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< int >::difference_type i, std::vector< int >::difference_type j)\n"
+		"vector_integer_t___setslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j, vector_integer_t v)\n"
+		""},
+	 { (char *)"vector_integer_t___delslice__", _wrap_vector_integer_t___delslice__, METH_VARARGS, (char *)"vector_integer_t___delslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j)"},
+	 { (char *)"vector_integer_t___delitem__", _wrap_vector_integer_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< int >::difference_type i)\n"
+		"vector_integer_t___delitem__(vector_integer_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_integer_t___getitem__", _wrap_vector_integer_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_integer_t\n"
+		"vector_integer_t___getitem__(vector_integer_t self, std::vector< int >::difference_type i) -> std::vector< int >::value_type const &\n"
+		""},
+	 { (char *)"vector_integer_t___setitem__", _wrap_vector_integer_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_integer_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_integer_t___setitem__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_integer_t_pop", _wrap_vector_integer_t_pop, METH_VARARGS, (char *)"vector_integer_t_pop(vector_integer_t self) -> std::vector< int >::value_type"},
+	 { (char *)"vector_integer_t_append", _wrap_vector_integer_t_append, METH_VARARGS, (char *)"vector_integer_t_append(vector_integer_t self, std::vector< int >::value_type const & x)"},
+	 { (char *)"vector_integer_t_empty", _wrap_vector_integer_t_empty, METH_VARARGS, (char *)"vector_integer_t_empty(vector_integer_t self) -> bool"},
+	 { (char *)"vector_integer_t_size", _wrap_vector_integer_t_size, METH_VARARGS, (char *)"vector_integer_t_size(vector_integer_t self) -> std::vector< int >::size_type"},
+	 { (char *)"vector_integer_t_swap", _wrap_vector_integer_t_swap, METH_VARARGS, (char *)"\n"
+		"vector_integer_t_swap(vector_integer_t self, vector_integer_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vector_integer_t_begin", _wrap_vector_integer_t_begin, METH_VARARGS, (char *)"vector_integer_t_begin(vector_integer_t self) -> std::vector< int >::iterator"},
+	 { (char *)"vector_integer_t_end", _wrap_vector_integer_t_end, METH_VARARGS, (char *)"vector_integer_t_end(vector_integer_t self) -> std::vector< int >::iterator"},
+	 { (char *)"vector_integer_t_rbegin", _wrap_vector_integer_t_rbegin, METH_VARARGS, (char *)"vector_integer_t_rbegin(vector_integer_t self) -> std::vector< int >::reverse_iterator"},
+	 { (char *)"vector_integer_t_rend", _wrap_vector_integer_t_rend, METH_VARARGS, (char *)"vector_integer_t_rend(vector_integer_t self) -> std::vector< int >::reverse_iterator"},
+	 { (char *)"vector_integer_t_clear", _wrap_vector_integer_t_clear, METH_VARARGS, (char *)"vector_integer_t_clear(vector_integer_t self)"},
+	 { (char *)"vector_integer_t_get_allocator", _wrap_vector_integer_t_get_allocator, METH_VARARGS, (char *)"vector_integer_t_get_allocator(vector_integer_t self) -> std::vector< int >::allocator_type"},
+	 { (char *)"vector_integer_t_pop_back", _wrap_vector_integer_t_pop_back, METH_VARARGS, (char *)"vector_integer_t_pop_back(vector_integer_t self)"},
+	 { (char *)"vector_integer_t_erase", _wrap_vector_integer_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< int >::iterator pos) -> std::vector< int >::iterator\n"
+		"vector_integer_t_erase(vector_integer_t self, std::vector< int >::iterator first, std::vector< int >::iterator last) -> std::vector< int >::iterator\n"
+		""},
+	 { (char *)"new_vector_integer_t", _wrap_new_vector_integer_t, METH_VARARGS, (char *)"\n"
+		"vector_integer_t()\n"
+		"vector_integer_t(vector_integer_t arg2)\n"
+		"vector_integer_t(std::vector< int >::size_type size)\n"
+		"new_vector_integer_t(std::vector< int >::size_type size, std::vector< int >::value_type const & value) -> vector_integer_t\n"
+		""},
+	 { (char *)"vector_integer_t_push_back", _wrap_vector_integer_t_push_back, METH_VARARGS, (char *)"vector_integer_t_push_back(vector_integer_t self, std::vector< int >::value_type const & x)"},
+	 { (char *)"vector_integer_t_front", _wrap_vector_integer_t_front, METH_VARARGS, (char *)"vector_integer_t_front(vector_integer_t self) -> std::vector< int >::value_type const &"},
+	 { (char *)"vector_integer_t_back", _wrap_vector_integer_t_back, METH_VARARGS, (char *)"vector_integer_t_back(vector_integer_t self) -> std::vector< int >::value_type const &"},
+	 { (char *)"vector_integer_t_assign", _wrap_vector_integer_t_assign, METH_VARARGS, (char *)"vector_integer_t_assign(vector_integer_t self, std::vector< int >::size_type n, std::vector< int >::value_type const & x)"},
+	 { (char *)"vector_integer_t_resize", _wrap_vector_integer_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< int >::size_type new_size)\n"
+		"vector_integer_t_resize(vector_integer_t self, std::vector< int >::size_type new_size, std::vector< int >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_integer_t_insert", _wrap_vector_integer_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< int >::iterator pos, std::vector< int >::value_type const & x) -> std::vector< int >::iterator\n"
+		"vector_integer_t_insert(vector_integer_t self, std::vector< int >::iterator pos, std::vector< int >::size_type n, std::vector< int >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_integer_t_reserve", _wrap_vector_integer_t_reserve, METH_VARARGS, (char *)"vector_integer_t_reserve(vector_integer_t self, std::vector< int >::size_type n)"},
+	 { (char *)"vector_integer_t_capacity", _wrap_vector_integer_t_capacity, METH_VARARGS, (char *)"vector_integer_t_capacity(vector_integer_t self) -> std::vector< int >::size_type"},
+	 { (char *)"delete_vector_integer_t", _wrap_delete_vector_integer_t, METH_VARARGS, (char *)"delete_vector_integer_t(vector_integer_t self)"},
+	 { (char *)"vector_integer_t_swigregister", vector_integer_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_longinteger_t_iterator", _wrap_vector_longinteger_t_iterator, METH_VARARGS, (char *)"vector_longinteger_t_iterator(vector_longinteger_t self) -> SwigPyIterator"},
+	 { (char *)"vector_longinteger_t___nonzero__", _wrap_vector_longinteger_t___nonzero__, METH_VARARGS, (char *)"vector_longinteger_t___nonzero__(vector_longinteger_t self) -> bool"},
+	 { (char *)"vector_longinteger_t___bool__", _wrap_vector_longinteger_t___bool__, METH_VARARGS, (char *)"vector_longinteger_t___bool__(vector_longinteger_t self) -> bool"},
+	 { (char *)"vector_longinteger_t___len__", _wrap_vector_longinteger_t___len__, METH_VARARGS, (char *)"vector_longinteger_t___len__(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"},
+	 { (char *)"vector_longinteger_t___getslice__", _wrap_vector_longinteger_t___getslice__, METH_VARARGS, (char *)"vector_longinteger_t___getslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j) -> vector_longinteger_t"},
+	 { (char *)"vector_longinteger_t___setslice__", _wrap_vector_longinteger_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)\n"
+		"vector_longinteger_t___setslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j, vector_longinteger_t v)\n"
+		""},
+	 { (char *)"vector_longinteger_t___delslice__", _wrap_vector_longinteger_t___delslice__, METH_VARARGS, (char *)"vector_longinteger_t___delslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)"},
+	 { (char *)"vector_longinteger_t___delitem__", _wrap_vector_longinteger_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< unsigned long >::difference_type i)\n"
+		"vector_longinteger_t___delitem__(vector_longinteger_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_longinteger_t___getitem__", _wrap_vector_longinteger_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_longinteger_t\n"
+		"vector_longinteger_t___getitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i) -> std::vector< unsigned long >::value_type const &\n"
+		""},
+	 { (char *)"vector_longinteger_t___setitem__", _wrap_vector_longinteger_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_longinteger_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_longinteger_t___setitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_longinteger_t_pop", _wrap_vector_longinteger_t_pop, METH_VARARGS, (char *)"vector_longinteger_t_pop(vector_longinteger_t self) -> std::vector< unsigned long >::value_type"},
+	 { (char *)"vector_longinteger_t_append", _wrap_vector_longinteger_t_append, METH_VARARGS, (char *)"vector_longinteger_t_append(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"},
+	 { (char *)"vector_longinteger_t_empty", _wrap_vector_longinteger_t_empty, METH_VARARGS, (char *)"vector_longinteger_t_empty(vector_longinteger_t self) -> bool"},
+	 { (char *)"vector_longinteger_t_size", _wrap_vector_longinteger_t_size, METH_VARARGS, (char *)"vector_longinteger_t_size(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"},
+	 { (char *)"vector_longinteger_t_swap", _wrap_vector_longinteger_t_swap, METH_VARARGS, (char *)"\n"
+		"vector_longinteger_t_swap(vector_longinteger_t self, vector_longinteger_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vector_longinteger_t_begin", _wrap_vector_longinteger_t_begin, METH_VARARGS, (char *)"vector_longinteger_t_begin(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"},
+	 { (char *)"vector_longinteger_t_end", _wrap_vector_longinteger_t_end, METH_VARARGS, (char *)"vector_longinteger_t_end(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"},
+	 { (char *)"vector_longinteger_t_rbegin", _wrap_vector_longinteger_t_rbegin, METH_VARARGS, (char *)"vector_longinteger_t_rbegin(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"},
+	 { (char *)"vector_longinteger_t_rend", _wrap_vector_longinteger_t_rend, METH_VARARGS, (char *)"vector_longinteger_t_rend(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"},
+	 { (char *)"vector_longinteger_t_clear", _wrap_vector_longinteger_t_clear, METH_VARARGS, (char *)"vector_longinteger_t_clear(vector_longinteger_t self)"},
+	 { (char *)"vector_longinteger_t_get_allocator", _wrap_vector_longinteger_t_get_allocator, METH_VARARGS, (char *)"vector_longinteger_t_get_allocator(vector_longinteger_t self) -> std::vector< unsigned long >::allocator_type"},
+	 { (char *)"vector_longinteger_t_pop_back", _wrap_vector_longinteger_t_pop_back, METH_VARARGS, (char *)"vector_longinteger_t_pop_back(vector_longinteger_t self)"},
+	 { (char *)"vector_longinteger_t_erase", _wrap_vector_longinteger_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< unsigned long >::iterator pos) -> std::vector< unsigned long >::iterator\n"
+		"vector_longinteger_t_erase(vector_longinteger_t self, std::vector< unsigned long >::iterator first, std::vector< unsigned long >::iterator last) -> std::vector< unsigned long >::iterator\n"
+		""},
+	 { (char *)"new_vector_longinteger_t", _wrap_new_vector_longinteger_t, METH_VARARGS, (char *)"\n"
+		"vector_longinteger_t()\n"
+		"vector_longinteger_t(vector_longinteger_t arg2)\n"
+		"vector_longinteger_t(std::vector< unsigned long >::size_type size)\n"
+		"new_vector_longinteger_t(std::vector< unsigned long >::size_type size, std::vector< unsigned long >::value_type const & value) -> vector_longinteger_t\n"
+		""},
+	 { (char *)"vector_longinteger_t_push_back", _wrap_vector_longinteger_t_push_back, METH_VARARGS, (char *)"vector_longinteger_t_push_back(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"},
+	 { (char *)"vector_longinteger_t_front", _wrap_vector_longinteger_t_front, METH_VARARGS, (char *)"vector_longinteger_t_front(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"},
+	 { (char *)"vector_longinteger_t_back", _wrap_vector_longinteger_t_back, METH_VARARGS, (char *)"vector_longinteger_t_back(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"},
+	 { (char *)"vector_longinteger_t_assign", _wrap_vector_longinteger_t_assign, METH_VARARGS, (char *)"vector_longinteger_t_assign(vector_longinteger_t self, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)"},
+	 { (char *)"vector_longinteger_t_resize", _wrap_vector_longinteger_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< unsigned long >::size_type new_size)\n"
+		"vector_longinteger_t_resize(vector_longinteger_t self, std::vector< unsigned long >::size_type new_size, std::vector< unsigned long >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_longinteger_t_insert", _wrap_vector_longinteger_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::value_type const & x) -> std::vector< unsigned long >::iterator\n"
+		"vector_longinteger_t_insert(vector_longinteger_t self, std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_longinteger_t_reserve", _wrap_vector_longinteger_t_reserve, METH_VARARGS, (char *)"vector_longinteger_t_reserve(vector_longinteger_t self, std::vector< unsigned long >::size_type n)"},
+	 { (char *)"vector_longinteger_t_capacity", _wrap_vector_longinteger_t_capacity, METH_VARARGS, (char *)"vector_longinteger_t_capacity(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"},
+	 { (char *)"delete_vector_longinteger_t", _wrap_delete_vector_longinteger_t, METH_VARARGS, (char *)"delete_vector_longinteger_t(vector_longinteger_t self)"},
+	 { (char *)"vector_longinteger_t_swigregister", vector_longinteger_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_complex_t_iterator", _wrap_vector_complex_t_iterator, METH_VARARGS, (char *)"vector_complex_t_iterator(vector_complex_t self) -> SwigPyIterator"},
+	 { (char *)"vector_complex_t___nonzero__", _wrap_vector_complex_t___nonzero__, METH_VARARGS, (char *)"vector_complex_t___nonzero__(vector_complex_t self) -> bool"},
+	 { (char *)"vector_complex_t___bool__", _wrap_vector_complex_t___bool__, METH_VARARGS, (char *)"vector_complex_t___bool__(vector_complex_t self) -> bool"},
+	 { (char *)"vector_complex_t___len__", _wrap_vector_complex_t___len__, METH_VARARGS, (char *)"vector_complex_t___len__(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"},
+	 { (char *)"vector_complex_t___getslice__", _wrap_vector_complex_t___getslice__, METH_VARARGS, (char *)"vector_complex_t___getslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j) -> vector_complex_t"},
+	 { (char *)"vector_complex_t___setslice__", _wrap_vector_complex_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)\n"
+		"vector_complex_t___setslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j, vector_complex_t v)\n"
+		""},
+	 { (char *)"vector_complex_t___delslice__", _wrap_vector_complex_t___delslice__, METH_VARARGS, (char *)"vector_complex_t___delslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)"},
+	 { (char *)"vector_complex_t___delitem__", _wrap_vector_complex_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< std::complex< double > >::difference_type i)\n"
+		"vector_complex_t___delitem__(vector_complex_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_complex_t___getitem__", _wrap_vector_complex_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_complex_t\n"
+		"vector_complex_t___getitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i) -> std::vector< std::complex< double > >::value_type const &\n"
+		""},
+	 { (char *)"vector_complex_t___setitem__", _wrap_vector_complex_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_complex_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_complex_t___setitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_complex_t_pop", _wrap_vector_complex_t_pop, METH_VARARGS, (char *)"vector_complex_t_pop(vector_complex_t self) -> std::vector< std::complex< double > >::value_type"},
+	 { (char *)"vector_complex_t_append", _wrap_vector_complex_t_append, METH_VARARGS, (char *)"vector_complex_t_append(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"},
+	 { (char *)"vector_complex_t_empty", _wrap_vector_complex_t_empty, METH_VARARGS, (char *)"vector_complex_t_empty(vector_complex_t self) -> bool"},
+	 { (char *)"vector_complex_t_size", _wrap_vector_complex_t_size, METH_VARARGS, (char *)"vector_complex_t_size(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"},
+	 { (char *)"vector_complex_t_swap", _wrap_vector_complex_t_swap, METH_VARARGS, (char *)"\n"
+		"vector_complex_t_swap(vector_complex_t self, vector_complex_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vector_complex_t_begin", _wrap_vector_complex_t_begin, METH_VARARGS, (char *)"vector_complex_t_begin(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"},
+	 { (char *)"vector_complex_t_end", _wrap_vector_complex_t_end, METH_VARARGS, (char *)"vector_complex_t_end(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"},
+	 { (char *)"vector_complex_t_rbegin", _wrap_vector_complex_t_rbegin, METH_VARARGS, (char *)"vector_complex_t_rbegin(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"},
+	 { (char *)"vector_complex_t_rend", _wrap_vector_complex_t_rend, METH_VARARGS, (char *)"vector_complex_t_rend(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"},
+	 { (char *)"vector_complex_t_clear", _wrap_vector_complex_t_clear, METH_VARARGS, (char *)"vector_complex_t_clear(vector_complex_t self)"},
+	 { (char *)"vector_complex_t_get_allocator", _wrap_vector_complex_t_get_allocator, METH_VARARGS, (char *)"vector_complex_t_get_allocator(vector_complex_t self) -> std::vector< std::complex< double > >::allocator_type"},
+	 { (char *)"vector_complex_t_pop_back", _wrap_vector_complex_t_pop_back, METH_VARARGS, (char *)"vector_complex_t_pop_back(vector_complex_t self)"},
+	 { (char *)"vector_complex_t_erase", _wrap_vector_complex_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< std::complex< double > >::iterator pos) -> std::vector< std::complex< double > >::iterator\n"
+		"vector_complex_t_erase(vector_complex_t self, std::vector< std::complex< double > >::iterator first, std::vector< std::complex< double > >::iterator last) -> std::vector< std::complex< double > >::iterator\n"
+		""},
+	 { (char *)"new_vector_complex_t", _wrap_new_vector_complex_t, METH_VARARGS, (char *)"\n"
+		"vector_complex_t()\n"
+		"vector_complex_t(vector_complex_t arg2)\n"
+		"vector_complex_t(std::vector< std::complex< double > >::size_type size)\n"
+		"new_vector_complex_t(std::vector< std::complex< double > >::size_type size, std::vector< std::complex< double > >::value_type const & value) -> vector_complex_t\n"
+		""},
+	 { (char *)"vector_complex_t_push_back", _wrap_vector_complex_t_push_back, METH_VARARGS, (char *)"vector_complex_t_push_back(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"},
+	 { (char *)"vector_complex_t_front", _wrap_vector_complex_t_front, METH_VARARGS, (char *)"vector_complex_t_front(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"},
+	 { (char *)"vector_complex_t_back", _wrap_vector_complex_t_back, METH_VARARGS, (char *)"vector_complex_t_back(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"},
+	 { (char *)"vector_complex_t_assign", _wrap_vector_complex_t_assign, METH_VARARGS, (char *)"vector_complex_t_assign(vector_complex_t self, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)"},
+	 { (char *)"vector_complex_t_resize", _wrap_vector_complex_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< std::complex< double > >::size_type new_size)\n"
+		"vector_complex_t_resize(vector_complex_t self, std::vector< std::complex< double > >::size_type new_size, std::vector< std::complex< double > >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_complex_t_insert", _wrap_vector_complex_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::value_type const & x) -> std::vector< std::complex< double > >::iterator\n"
+		"vector_complex_t_insert(vector_complex_t self, std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_complex_t_reserve", _wrap_vector_complex_t_reserve, METH_VARARGS, (char *)"vector_complex_t_reserve(vector_complex_t self, std::vector< std::complex< double > >::size_type n)"},
+	 { (char *)"vector_complex_t_capacity", _wrap_vector_complex_t_capacity, METH_VARARGS, (char *)"vector_complex_t_capacity(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"},
+	 { (char *)"delete_vector_complex_t", _wrap_delete_vector_complex_t, METH_VARARGS, (char *)"delete_vector_complex_t(vector_complex_t self)"},
+	 { (char *)"vector_complex_t_swigregister", vector_complex_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_string_t_iterator", _wrap_vector_string_t_iterator, METH_VARARGS, (char *)"vector_string_t_iterator(vector_string_t self) -> SwigPyIterator"},
+	 { (char *)"vector_string_t___nonzero__", _wrap_vector_string_t___nonzero__, METH_VARARGS, (char *)"vector_string_t___nonzero__(vector_string_t self) -> bool"},
+	 { (char *)"vector_string_t___bool__", _wrap_vector_string_t___bool__, METH_VARARGS, (char *)"vector_string_t___bool__(vector_string_t self) -> bool"},
+	 { (char *)"vector_string_t___len__", _wrap_vector_string_t___len__, METH_VARARGS, (char *)"vector_string_t___len__(vector_string_t self) -> std::vector< std::string >::size_type"},
+	 { (char *)"vector_string_t___getslice__", _wrap_vector_string_t___getslice__, METH_VARARGS, (char *)"vector_string_t___getslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j) -> vector_string_t"},
+	 { (char *)"vector_string_t___setslice__", _wrap_vector_string_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)\n"
+		"vector_string_t___setslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j, vector_string_t v)\n"
+		""},
+	 { (char *)"vector_string_t___delslice__", _wrap_vector_string_t___delslice__, METH_VARARGS, (char *)"vector_string_t___delslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)"},
+	 { (char *)"vector_string_t___delitem__", _wrap_vector_string_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< std::string >::difference_type i)\n"
+		"vector_string_t___delitem__(vector_string_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_string_t___getitem__", _wrap_vector_string_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_string_t\n"
+		"vector_string_t___getitem__(vector_string_t self, std::vector< std::string >::difference_type i) -> std::vector< std::string >::value_type const &\n"
+		""},
+	 { (char *)"vector_string_t___setitem__", _wrap_vector_string_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_string_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_string_t___setitem__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_pop", _wrap_vector_string_t_pop, METH_VARARGS, (char *)"vector_string_t_pop(vector_string_t self) -> std::vector< std::string >::value_type"},
+	 { (char *)"vector_string_t_append", _wrap_vector_string_t_append, METH_VARARGS, (char *)"vector_string_t_append(vector_string_t self, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_empty", _wrap_vector_string_t_empty, METH_VARARGS, (char *)"vector_string_t_empty(vector_string_t self) -> bool"},
+	 { (char *)"vector_string_t_size", _wrap_vector_string_t_size, METH_VARARGS, (char *)"vector_string_t_size(vector_string_t self) -> std::vector< std::string >::size_type"},
+	 { (char *)"vector_string_t_swap", _wrap_vector_string_t_swap, METH_VARARGS, (char *)"\n"
+		"vector_string_t_swap(vector_string_t self, vector_string_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vector_string_t_begin", _wrap_vector_string_t_begin, METH_VARARGS, (char *)"vector_string_t_begin(vector_string_t self) -> std::vector< std::string >::iterator"},
+	 { (char *)"vector_string_t_end", _wrap_vector_string_t_end, METH_VARARGS, (char *)"vector_string_t_end(vector_string_t self) -> std::vector< std::string >::iterator"},
+	 { (char *)"vector_string_t_rbegin", _wrap_vector_string_t_rbegin, METH_VARARGS, (char *)"vector_string_t_rbegin(vector_string_t self) -> std::vector< std::string >::reverse_iterator"},
+	 { (char *)"vector_string_t_rend", _wrap_vector_string_t_rend, METH_VARARGS, (char *)"vector_string_t_rend(vector_string_t self) -> std::vector< std::string >::reverse_iterator"},
+	 { (char *)"vector_string_t_clear", _wrap_vector_string_t_clear, METH_VARARGS, (char *)"vector_string_t_clear(vector_string_t self)"},
+	 { (char *)"vector_string_t_get_allocator", _wrap_vector_string_t_get_allocator, METH_VARARGS, (char *)"vector_string_t_get_allocator(vector_string_t self) -> std::vector< std::string >::allocator_type"},
+	 { (char *)"vector_string_t_pop_back", _wrap_vector_string_t_pop_back, METH_VARARGS, (char *)"vector_string_t_pop_back(vector_string_t self)"},
+	 { (char *)"vector_string_t_erase", _wrap_vector_string_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< std::string >::iterator pos) -> std::vector< std::string >::iterator\n"
+		"vector_string_t_erase(vector_string_t self, std::vector< std::string >::iterator first, std::vector< std::string >::iterator last) -> std::vector< std::string >::iterator\n"
+		""},
+	 { (char *)"new_vector_string_t", _wrap_new_vector_string_t, METH_VARARGS, (char *)"\n"
+		"vector_string_t()\n"
+		"vector_string_t(vector_string_t arg2)\n"
+		"vector_string_t(std::vector< std::string >::size_type size)\n"
+		"new_vector_string_t(std::vector< std::string >::size_type size, std::vector< std::string >::value_type const & value) -> vector_string_t\n"
+		""},
+	 { (char *)"vector_string_t_push_back", _wrap_vector_string_t_push_back, METH_VARARGS, (char *)"vector_string_t_push_back(vector_string_t self, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_front", _wrap_vector_string_t_front, METH_VARARGS, (char *)"vector_string_t_front(vector_string_t self) -> std::vector< std::string >::value_type const &"},
+	 { (char *)"vector_string_t_back", _wrap_vector_string_t_back, METH_VARARGS, (char *)"vector_string_t_back(vector_string_t self) -> std::vector< std::string >::value_type const &"},
+	 { (char *)"vector_string_t_assign", _wrap_vector_string_t_assign, METH_VARARGS, (char *)"vector_string_t_assign(vector_string_t self, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_resize", _wrap_vector_string_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< std::string >::size_type new_size)\n"
+		"vector_string_t_resize(vector_string_t self, std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_insert", _wrap_vector_string_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const & x) -> std::vector< std::string >::iterator\n"
+		"vector_string_t_insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_reserve", _wrap_vector_string_t_reserve, METH_VARARGS, (char *)"vector_string_t_reserve(vector_string_t self, std::vector< std::string >::size_type n)"},
+	 { (char *)"vector_string_t_capacity", _wrap_vector_string_t_capacity, METH_VARARGS, (char *)"vector_string_t_capacity(vector_string_t self) -> std::vector< std::string >::size_type"},
+	 { (char *)"delete_vector_string_t", _wrap_delete_vector_string_t, METH_VARARGS, (char *)"delete_vector_string_t(vector_string_t self)"},
+	 { (char *)"vector_string_t_swigregister", vector_string_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"GetMajorVersionNumber", _wrap_GetMajorVersionNumber, METH_VARARGS, (char *)"GetMajorVersionNumber() -> int"},
+	 { (char *)"GetMinorVersionNumber", _wrap_GetMinorVersionNumber, METH_VARARGS, (char *)"GetMinorVersionNumber() -> int"},
+	 { (char *)"GetPatchVersionNumber", _wrap_GetPatchVersionNumber, METH_VARARGS, (char *)"GetPatchVersionNumber() -> int"},
+	 { (char *)"GetName", _wrap_GetName, METH_VARARGS, (char *)"GetName() -> std::string"},
+	 { (char *)"GetVersionNumber", _wrap_GetVersionNumber, METH_VARARGS, (char *)"GetVersionNumber() -> std::string"},
+	 { (char *)"vecOfLambdaAlphaPhi", _wrap_vecOfLambdaAlphaPhi, METH_VARARGS, (char *)"\n"
+		"vecOfLambdaAlphaPhi(double const _lambda, double const _alpha, double const _phi) -> kvector_t\n"
+		"\n"
+		"BA_CORE_API_ BasicVector3D<double> vecOfLambdaAlphaPhi(const double _lambda, const double _alpha, const double _phi)\n"
+		"\n"
+		"Creates a vector<double> as a wavevector with given wavelength and angles. Specifically needed for grazing-incidence scattering. \n"
+		"\n"
+		""},
+	 { (char *)"new_INoncopyable", _wrap_new_INoncopyable, METH_VARARGS, (char *)"\n"
+		"new_INoncopyable() -> INoncopyable\n"
+		"\n"
+		"INoncopyable::INoncopyable(const INoncopyable &)=delete\n"
+		"\n"
+		""},
+	 { (char *)"delete_INoncopyable", _wrap_delete_INoncopyable, METH_VARARGS, (char *)"\n"
+		"delete_INoncopyable(INoncopyable self)\n"
+		"\n"
+		"virtual INoncopyable::~INoncopyable()\n"
+		"\n"
+		""},
+	 { (char *)"INoncopyable_swigregister", INoncopyable_swigregister, METH_VARARGS, NULL},
+	 { (char *)"ICloneable_clone", _wrap_ICloneable_clone, METH_VARARGS, (char *)"\n"
+		"ICloneable_clone(ICloneable self) -> ICloneable\n"
+		"\n"
+		"virtual ICloneable* ICloneable::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"ICloneable_transferToCPP", _wrap_ICloneable_transferToCPP, METH_VARARGS, (char *)"\n"
+		"ICloneable_transferToCPP(ICloneable self)\n"
+		"\n"
+		"virtual void ICloneable::transferToCPP()\n"
+		"\n"
+		"Used for Python overriding of clone. \n"
+		"\n"
+		""},
+	 { (char *)"delete_ICloneable", _wrap_delete_ICloneable, METH_VARARGS, (char *)"delete_ICloneable(ICloneable self)"},
+	 { (char *)"ICloneable_swigregister", ICloneable_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_INamed", _wrap_new_INamed, METH_VARARGS, (char *)"\n"
+		"INamed()\n"
+		"new_INamed(PyObject * arg2, std::string const & name) -> INamed\n"
+		"\n"
+		"INamed::INamed(const std::string &name)\n"
+		"\n"
+		""},
+	 { (char *)"delete_INamed", _wrap_delete_INamed, METH_VARARGS, (char *)"\n"
+		"delete_INamed(INamed self)\n"
+		"\n"
+		"virtual INamed::~INamed()\n"
+		"\n"
+		""},
+	 { (char *)"INamed_getName", _wrap_INamed_getName, METH_VARARGS, (char *)"\n"
+		"INamed_getName(INamed self) -> std::string\n"
+		"\n"
+		"std::string INamed::getName() const \n"
+		"\n"
+		""},
+	 { (char *)"disown_INamed", _wrap_disown_INamed, METH_VARARGS, NULL},
+	 { (char *)"INamed_swigregister", INamed_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IParameterized", _wrap_new_IParameterized, METH_VARARGS, (char *)"\n"
+		"IParameterized(std::string const & name)\n"
+		"IParameterized()\n"
+		"new_IParameterized(PyObject * arg2, IParameterized other) -> IParameterized\n"
+		"\n"
+		"IParameterized::IParameterized(const IParameterized &other)\n"
+		"\n"
+		""},
+	 { (char *)"delete_IParameterized", _wrap_delete_IParameterized, METH_VARARGS, (char *)"\n"
+		"delete_IParameterized(IParameterized self)\n"
+		"\n"
+		"IParameterized::~IParameterized() override\n"
+		"\n"
+		""},
+	 { (char *)"IParameterized_getParameterPool", _wrap_IParameterized_getParameterPool, METH_VARARGS, (char *)"\n"
+		"IParameterized_getParameterPool(IParameterized self) -> ParameterPool\n"
+		"\n"
+		"ParameterPool* IParameterized::getParameterPool() const\n"
+		"\n"
+		"Returns pointer to the parameter pool. \n"
+		"\n"
+		""},
+	 { (char *)"IParameterized_createParameterTree", _wrap_IParameterized_createParameterTree, METH_VARARGS, (char *)"\n"
+		"IParameterized_createParameterTree(IParameterized self) -> ParameterPool\n"
+		"\n"
+		"ParameterPool * IParameterized::createParameterTree()\n"
+		"\n"
+		"Creates new parameter pool, with all local parameters and those of its children. \n"
+		"\n"
+		""},
+	 { (char *)"IParameterized_printParameters", _wrap_IParameterized_printParameters, METH_VARARGS, (char *)"\n"
+		"IParameterized_printParameters(IParameterized self)\n"
+		"\n"
+		"void IParameterized::printParameters()\n"
+		"\n"
+		""},
+	 { (char *)"IParameterized_registerParameter", _wrap_IParameterized_registerParameter, METH_VARARGS, (char *)"\n"
+		"IParameterized_registerParameter(IParameterized self, std::string const & name, double * parpointer) -> RealParameter\n"
+		"\n"
+		"RealParameter & IParameterized::registerParameter(const std::string &name, double *parpointer)\n"
+		"\n"
+		""},
+	 { (char *)"IParameterized_setParameterValue", _wrap_IParameterized_setParameterValue, METH_VARARGS, (char *)"\n"
+		"IParameterized_setParameterValue(IParameterized self, std::string const & name, double value)\n"
+		"\n"
+		"void IParameterized::setParameterValue(const std::string &name, double value)\n"
+		"\n"
+		""},
+	 { (char *)"IParameterized_getParameter", _wrap_IParameterized_getParameter, METH_VARARGS, (char *)"\n"
+		"IParameterized_getParameter(IParameterized self, std::string const & name) -> RealParameter\n"
+		"\n"
+		"RealParameter * IParameterized::getParameter(const std::string &name) const\n"
+		"\n"
+		"Returns parameter with given 'name'. \n"
+		"\n"
+		""},
+	 { (char *)"IParameterized_onChange", _wrap_IParameterized_onChange, METH_VARARGS, (char *)"IParameterized_onChange(IParameterized self)"},
+	 { (char *)"IParameterized__print", _wrap_IParameterized__print, METH_VARARGS, (char *)"IParameterized__print(IParameterized self, std::ostream & ostr)"},
+	 { (char *)"disown_IParameterized", _wrap_disown_IParameterized, METH_VARARGS, NULL},
+	 { (char *)"IParameterized_swigregister", IParameterized_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_kvector_t", _wrap_new_kvector_t, METH_VARARGS, (char *)"\n"
+		"kvector_t()\n"
+		"new_kvector_t(double const x1, double const y1, double const z1) -> kvector_t\n"
+		"\n"
+		"BasicVector3D< T >::BasicVector3D(const T x1, const T y1, const T z1)\n"
+		"\n"
+		"Constructor from cartesian components. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_x", _wrap_kvector_t_x, METH_VARARGS, (char *)"\n"
+		"kvector_t_x(kvector_t self) -> double\n"
+		"\n"
+		"T BasicVector3D< T >::x() const\n"
+		"\n"
+		"Returns x-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_y", _wrap_kvector_t_y, METH_VARARGS, (char *)"\n"
+		"kvector_t_y(kvector_t self) -> double\n"
+		"\n"
+		"T BasicVector3D< T >::y() const\n"
+		"\n"
+		"Returns y-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_z", _wrap_kvector_t_z, METH_VARARGS, (char *)"\n"
+		"kvector_t_z(kvector_t self) -> double\n"
+		"\n"
+		"T BasicVector3D< T >::z() const\n"
+		"\n"
+		"Returns z-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_setX", _wrap_kvector_t_setX, METH_VARARGS, (char *)"\n"
+		"kvector_t_setX(kvector_t self, double const & a)\n"
+		"\n"
+		"void BasicVector3D< T >::setX(const T &a)\n"
+		"\n"
+		"Sets x-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_setY", _wrap_kvector_t_setY, METH_VARARGS, (char *)"\n"
+		"kvector_t_setY(kvector_t self, double const & a)\n"
+		"\n"
+		"void BasicVector3D< T >::setY(const T &a)\n"
+		"\n"
+		"Sets y-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_setZ", _wrap_kvector_t_setZ, METH_VARARGS, (char *)"\n"
+		"kvector_t_setZ(kvector_t self, double const & a)\n"
+		"\n"
+		"void BasicVector3D< T >::setZ(const T &a)\n"
+		"\n"
+		"Sets z-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_setXYZ", _wrap_kvector_t_setXYZ, METH_VARARGS, (char *)"\n"
+		"kvector_t_setXYZ(kvector_t self, double const & x1, double const & y1, double const & z1)\n"
+		"\n"
+		"void BasicVector3D< T >::setXYZ(const T &x1, const T &y1, const T &z1)\n"
+		"\n"
+		"Sets components in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t___iadd__", _wrap_kvector_t___iadd__, METH_VARARGS, (char *)"kvector_t___iadd__(kvector_t self, kvector_t v) -> kvector_t"},
+	 { (char *)"kvector_t___isub__", _wrap_kvector_t___isub__, METH_VARARGS, (char *)"kvector_t___isub__(kvector_t self, kvector_t v) -> kvector_t"},
+	 { (char *)"kvector_t_conj", _wrap_kvector_t_conj, METH_VARARGS, (char *)"\n"
+		"kvector_t_conj(kvector_t self) -> kvector_t\n"
+		"\n"
+		"BasicVector3D< complex_t > BasicVector3D< complex_t >::conj() const\n"
+		"\n"
+		"Returns complex conjugate vector. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_mag2", _wrap_kvector_t_mag2, METH_VARARGS, (char *)"\n"
+		"kvector_t_mag2(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::mag2() const\n"
+		"\n"
+		"Returns squared magnitude squared of the vector. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_mag", _wrap_kvector_t_mag, METH_VARARGS, (char *)"\n"
+		"kvector_t_mag(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::mag() const\n"
+		"\n"
+		"Returns magnitude of the vector. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_magxy2", _wrap_kvector_t_magxy2, METH_VARARGS, (char *)"\n"
+		"kvector_t_magxy2(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::magxy2() const\n"
+		"\n"
+		"Returns squared distance from z axis. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_magxy", _wrap_kvector_t_magxy, METH_VARARGS, (char *)"\n"
+		"kvector_t_magxy(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::magxy() const\n"
+		"\n"
+		"Returns distance from z axis. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_phi", _wrap_kvector_t_phi, METH_VARARGS, (char *)"\n"
+		"kvector_t_phi(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::phi() const\n"
+		"\n"
+		"Returns azimuth angle. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_theta", _wrap_kvector_t_theta, METH_VARARGS, (char *)"\n"
+		"kvector_t_theta(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::theta() const\n"
+		"\n"
+		"Returns polar angle. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_cosTheta", _wrap_kvector_t_cosTheta, METH_VARARGS, (char *)"\n"
+		"kvector_t_cosTheta(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::cosTheta() const\n"
+		"\n"
+		"Returns cosine of polar angle. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_sin2Theta", _wrap_kvector_t_sin2Theta, METH_VARARGS, (char *)"\n"
+		"kvector_t_sin2Theta(kvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::sin2Theta() const\n"
+		"\n"
+		"Returns squared sine of polar angle. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_unit", _wrap_kvector_t_unit, METH_VARARGS, (char *)"\n"
+		"kvector_t_unit(kvector_t self) -> kvector_t\n"
+		"\n"
+		"BasicVector3D< complex_t > BasicVector3D< complex_t >::unit() const\n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_complex", _wrap_kvector_t_complex, METH_VARARGS, (char *)"\n"
+		"kvector_t_complex(kvector_t self) -> cvector_t\n"
+		"\n"
+		"BasicVector3D<std::complex<double> > BasicVector3D< T >::complex() const\n"
+		"\n"
+		"Returns this, trivially converted to complex type. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_real", _wrap_kvector_t_real, METH_VARARGS, (char *)"\n"
+		"kvector_t_real(kvector_t self) -> kvector_t\n"
+		"\n"
+		"BasicVector3D< double > BasicVector3D< complex_t >::real() const\n"
+		"\n"
+		"Returns real parts. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_angle", _wrap_kvector_t_angle, METH_VARARGS, (char *)"\n"
+		"kvector_t_angle(kvector_t self, kvector_t v) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::angle(const BasicVector3D< T > &v) const\n"
+		"\n"
+		"Returns angle with respect to another vector. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t_project", _wrap_kvector_t_project, METH_VARARGS, (char *)"\n"
+		"kvector_t_project(kvector_t self, kvector_t v) -> kvector_t\n"
+		"\n"
+		"BasicVector3D<T> BasicVector3D< T >::project(const BasicVector3D< T > &v) const\n"
+		"\n"
+		"Returns projection of this onto other vector: (this*v)*v/|v|^2. \n"
+		"\n"
+		""},
+	 { (char *)"kvector_t___add__", _wrap_kvector_t___add__, METH_VARARGS, (char *)"kvector_t___add__(kvector_t self, kvector_t rhs) -> kvector_t"},
+	 { (char *)"kvector_t___mul__", _wrap_kvector_t___mul__, METH_VARARGS, (char *)"kvector_t___mul__(kvector_t self, double c) -> kvector_t"},
+	 { (char *)"kvector_t___rmul__", _wrap_kvector_t___rmul__, METH_VARARGS, (char *)"kvector_t___rmul__(kvector_t self, double c) -> kvector_t"},
+	 { (char *)"kvector_t___neg__", _wrap_kvector_t___neg__, METH_VARARGS, (char *)"kvector_t___neg__(kvector_t self) -> kvector_t"},
+	 { (char *)"delete_kvector_t", _wrap_delete_kvector_t, METH_VARARGS, (char *)"delete_kvector_t(kvector_t self)"},
+	 { (char *)"kvector_t_swigregister", kvector_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_kvector_t_iterator", _wrap_vector_kvector_t_iterator, METH_VARARGS, (char *)"vector_kvector_t_iterator(vector_kvector_t self) -> SwigPyIterator"},
+	 { (char *)"vector_kvector_t___nonzero__", _wrap_vector_kvector_t___nonzero__, METH_VARARGS, (char *)"vector_kvector_t___nonzero__(vector_kvector_t self) -> bool"},
+	 { (char *)"vector_kvector_t___bool__", _wrap_vector_kvector_t___bool__, METH_VARARGS, (char *)"vector_kvector_t___bool__(vector_kvector_t self) -> bool"},
+	 { (char *)"vector_kvector_t___len__", _wrap_vector_kvector_t___len__, METH_VARARGS, (char *)"vector_kvector_t___len__(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::size_type"},
+	 { (char *)"vector_kvector_t___getslice__", _wrap_vector_kvector_t___getslice__, METH_VARARGS, (char *)"vector_kvector_t___getslice__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j) -> vector_kvector_t"},
+	 { (char *)"vector_kvector_t___setslice__", _wrap_vector_kvector_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j)\n"
+		"vector_kvector_t___setslice__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j, vector_kvector_t v)\n"
+		""},
+	 { (char *)"vector_kvector_t___delslice__", _wrap_vector_kvector_t___delslice__, METH_VARARGS, (char *)"vector_kvector_t___delslice__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, std::vector< BasicVector3D< double > >::difference_type j)"},
+	 { (char *)"vector_kvector_t___delitem__", _wrap_vector_kvector_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< BasicVector3D< double > >::difference_type i)\n"
+		"vector_kvector_t___delitem__(vector_kvector_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_kvector_t___getitem__", _wrap_vector_kvector_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_kvector_t\n"
+		"vector_kvector_t___getitem__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i) -> kvector_t\n"
+		""},
+	 { (char *)"vector_kvector_t___setitem__", _wrap_vector_kvector_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_kvector_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_kvector_t___setitem__(vector_kvector_t self, std::vector< BasicVector3D< double > >::difference_type i, kvector_t x)\n"
+		""},
+	 { (char *)"vector_kvector_t_pop", _wrap_vector_kvector_t_pop, METH_VARARGS, (char *)"vector_kvector_t_pop(vector_kvector_t self) -> kvector_t"},
+	 { (char *)"vector_kvector_t_append", _wrap_vector_kvector_t_append, METH_VARARGS, (char *)"vector_kvector_t_append(vector_kvector_t self, kvector_t x)"},
+	 { (char *)"vector_kvector_t_empty", _wrap_vector_kvector_t_empty, METH_VARARGS, (char *)"vector_kvector_t_empty(vector_kvector_t self) -> bool"},
+	 { (char *)"vector_kvector_t_size", _wrap_vector_kvector_t_size, METH_VARARGS, (char *)"vector_kvector_t_size(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::size_type"},
+	 { (char *)"vector_kvector_t_swap", _wrap_vector_kvector_t_swap, METH_VARARGS, (char *)"\n"
+		"vector_kvector_t_swap(vector_kvector_t self, vector_kvector_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vector_kvector_t_begin", _wrap_vector_kvector_t_begin, METH_VARARGS, (char *)"vector_kvector_t_begin(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::iterator"},
+	 { (char *)"vector_kvector_t_end", _wrap_vector_kvector_t_end, METH_VARARGS, (char *)"vector_kvector_t_end(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::iterator"},
+	 { (char *)"vector_kvector_t_rbegin", _wrap_vector_kvector_t_rbegin, METH_VARARGS, (char *)"vector_kvector_t_rbegin(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::reverse_iterator"},
+	 { (char *)"vector_kvector_t_rend", _wrap_vector_kvector_t_rend, METH_VARARGS, (char *)"vector_kvector_t_rend(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::reverse_iterator"},
+	 { (char *)"vector_kvector_t_clear", _wrap_vector_kvector_t_clear, METH_VARARGS, (char *)"vector_kvector_t_clear(vector_kvector_t self)"},
+	 { (char *)"vector_kvector_t_get_allocator", _wrap_vector_kvector_t_get_allocator, METH_VARARGS, (char *)"vector_kvector_t_get_allocator(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::allocator_type"},
+	 { (char *)"vector_kvector_t_pop_back", _wrap_vector_kvector_t_pop_back, METH_VARARGS, (char *)"vector_kvector_t_pop_back(vector_kvector_t self)"},
+	 { (char *)"vector_kvector_t_erase", _wrap_vector_kvector_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< BasicVector3D< double > >::iterator pos) -> std::vector< BasicVector3D< double > >::iterator\n"
+		"vector_kvector_t_erase(vector_kvector_t self, std::vector< BasicVector3D< double > >::iterator first, std::vector< BasicVector3D< double > >::iterator last) -> std::vector< BasicVector3D< double > >::iterator\n"
+		""},
+	 { (char *)"new_vector_kvector_t", _wrap_new_vector_kvector_t, METH_VARARGS, (char *)"\n"
+		"vector_kvector_t()\n"
+		"vector_kvector_t(vector_kvector_t arg2)\n"
+		"vector_kvector_t(std::vector< BasicVector3D< double > >::size_type size)\n"
+		"new_vector_kvector_t(std::vector< BasicVector3D< double > >::size_type size, kvector_t value) -> vector_kvector_t\n"
+		""},
+	 { (char *)"vector_kvector_t_push_back", _wrap_vector_kvector_t_push_back, METH_VARARGS, (char *)"vector_kvector_t_push_back(vector_kvector_t self, kvector_t x)"},
+	 { (char *)"vector_kvector_t_front", _wrap_vector_kvector_t_front, METH_VARARGS, (char *)"vector_kvector_t_front(vector_kvector_t self) -> kvector_t"},
+	 { (char *)"vector_kvector_t_back", _wrap_vector_kvector_t_back, METH_VARARGS, (char *)"vector_kvector_t_back(vector_kvector_t self) -> kvector_t"},
+	 { (char *)"vector_kvector_t_assign", _wrap_vector_kvector_t_assign, METH_VARARGS, (char *)"vector_kvector_t_assign(vector_kvector_t self, std::vector< BasicVector3D< double > >::size_type n, kvector_t x)"},
+	 { (char *)"vector_kvector_t_resize", _wrap_vector_kvector_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< BasicVector3D< double > >::size_type new_size)\n"
+		"vector_kvector_t_resize(vector_kvector_t self, std::vector< BasicVector3D< double > >::size_type new_size, kvector_t x)\n"
+		""},
+	 { (char *)"vector_kvector_t_insert", _wrap_vector_kvector_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< BasicVector3D< double > >::iterator pos, kvector_t x) -> std::vector< BasicVector3D< double > >::iterator\n"
+		"vector_kvector_t_insert(vector_kvector_t self, std::vector< BasicVector3D< double > >::iterator pos, std::vector< BasicVector3D< double > >::size_type n, kvector_t x)\n"
+		""},
+	 { (char *)"vector_kvector_t_reserve", _wrap_vector_kvector_t_reserve, METH_VARARGS, (char *)"vector_kvector_t_reserve(vector_kvector_t self, std::vector< BasicVector3D< double > >::size_type n)"},
+	 { (char *)"vector_kvector_t_capacity", _wrap_vector_kvector_t_capacity, METH_VARARGS, (char *)"vector_kvector_t_capacity(vector_kvector_t self) -> std::vector< BasicVector3D< double > >::size_type"},
+	 { (char *)"delete_vector_kvector_t", _wrap_delete_vector_kvector_t, METH_VARARGS, (char *)"delete_vector_kvector_t(vector_kvector_t self)"},
+	 { (char *)"vector_kvector_t_swigregister", vector_kvector_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_cvector_t", _wrap_new_cvector_t, METH_VARARGS, (char *)"\n"
+		"cvector_t()\n"
+		"new_cvector_t(std::complex< double > const x1, std::complex< double > const y1, std::complex< double > const z1) -> cvector_t\n"
+		"\n"
+		"BasicVector3D< T >::BasicVector3D(const T x1, const T y1, const T z1)\n"
+		"\n"
+		"Constructor from cartesian components. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_x", _wrap_cvector_t_x, METH_VARARGS, (char *)"\n"
+		"cvector_t_x(cvector_t self) -> std::complex< double >\n"
+		"\n"
+		"T BasicVector3D< T >::x() const\n"
+		"\n"
+		"Returns x-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_y", _wrap_cvector_t_y, METH_VARARGS, (char *)"\n"
+		"cvector_t_y(cvector_t self) -> std::complex< double >\n"
+		"\n"
+		"T BasicVector3D< T >::y() const\n"
+		"\n"
+		"Returns y-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_z", _wrap_cvector_t_z, METH_VARARGS, (char *)"\n"
+		"cvector_t_z(cvector_t self) -> std::complex< double >\n"
+		"\n"
+		"T BasicVector3D< T >::z() const\n"
+		"\n"
+		"Returns z-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_setX", _wrap_cvector_t_setX, METH_VARARGS, (char *)"\n"
+		"cvector_t_setX(cvector_t self, std::complex< double > const & a)\n"
+		"\n"
+		"void BasicVector3D< T >::setX(const T &a)\n"
+		"\n"
+		"Sets x-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_setY", _wrap_cvector_t_setY, METH_VARARGS, (char *)"\n"
+		"cvector_t_setY(cvector_t self, std::complex< double > const & a)\n"
+		"\n"
+		"void BasicVector3D< T >::setY(const T &a)\n"
+		"\n"
+		"Sets y-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_setZ", _wrap_cvector_t_setZ, METH_VARARGS, (char *)"\n"
+		"cvector_t_setZ(cvector_t self, std::complex< double > const & a)\n"
+		"\n"
+		"void BasicVector3D< T >::setZ(const T &a)\n"
+		"\n"
+		"Sets z-component in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_setXYZ", _wrap_cvector_t_setXYZ, METH_VARARGS, (char *)"\n"
+		"cvector_t_setXYZ(cvector_t self, std::complex< double > const & x1, std::complex< double > const & y1, std::complex< double > const & z1)\n"
+		"\n"
+		"void BasicVector3D< T >::setXYZ(const T &x1, const T &y1, const T &z1)\n"
+		"\n"
+		"Sets components in cartesian coordinate system. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t___iadd__", _wrap_cvector_t___iadd__, METH_VARARGS, (char *)"cvector_t___iadd__(cvector_t self, cvector_t v) -> cvector_t"},
+	 { (char *)"cvector_t___isub__", _wrap_cvector_t___isub__, METH_VARARGS, (char *)"cvector_t___isub__(cvector_t self, cvector_t v) -> cvector_t"},
+	 { (char *)"cvector_t_conj", _wrap_cvector_t_conj, METH_VARARGS, (char *)"\n"
+		"cvector_t_conj(cvector_t self) -> cvector_t\n"
+		"\n"
+		"BasicVector3D< complex_t > BasicVector3D< complex_t >::conj() const\n"
+		"\n"
+		"Returns complex conjugate vector. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_mag2", _wrap_cvector_t_mag2, METH_VARARGS, (char *)"\n"
+		"cvector_t_mag2(cvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::mag2() const\n"
+		"\n"
+		"Returns squared magnitude squared of the vector. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_mag", _wrap_cvector_t_mag, METH_VARARGS, (char *)"\n"
+		"cvector_t_mag(cvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::mag() const\n"
+		"\n"
+		"Returns magnitude of the vector. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_magxy2", _wrap_cvector_t_magxy2, METH_VARARGS, (char *)"\n"
+		"cvector_t_magxy2(cvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::magxy2() const\n"
+		"\n"
+		"Returns squared distance from z axis. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_magxy", _wrap_cvector_t_magxy, METH_VARARGS, (char *)"\n"
+		"cvector_t_magxy(cvector_t self) -> double\n"
+		"\n"
+		"double BasicVector3D< T >::magxy() const\n"
+		"\n"
+		"Returns distance from z axis. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_unit", _wrap_cvector_t_unit, METH_VARARGS, (char *)"\n"
+		"cvector_t_unit(cvector_t self) -> cvector_t\n"
+		"\n"
+		"BasicVector3D< complex_t > BasicVector3D< complex_t >::unit() const\n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_real", _wrap_cvector_t_real, METH_VARARGS, (char *)"\n"
+		"cvector_t_real(cvector_t self) -> kvector_t\n"
+		"\n"
+		"BasicVector3D< double > BasicVector3D< complex_t >::real() const\n"
+		"\n"
+		"Returns real parts. \n"
+		"\n"
+		""},
+	 { (char *)"cvector_t_project", _wrap_cvector_t_project, METH_VARARGS, (char *)"\n"
+		"cvector_t_project(cvector_t self, cvector_t v) -> cvector_t\n"
+		"\n"
+		"BasicVector3D<T> BasicVector3D< T >::project(const BasicVector3D< T > &v) const\n"
+		"\n"
+		"Returns projection of this onto other vector: (this*v)*v/|v|^2. \n"
+		"\n"
+		""},
+	 { (char *)"delete_cvector_t", _wrap_delete_cvector_t, METH_VARARGS, (char *)"delete_cvector_t(cvector_t self)"},
+	 { (char *)"cvector_t_swigregister", cvector_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_cvector_t_iterator", _wrap_vector_cvector_t_iterator, METH_VARARGS, (char *)"vector_cvector_t_iterator(vector_cvector_t self) -> SwigPyIterator"},
+	 { (char *)"vector_cvector_t___nonzero__", _wrap_vector_cvector_t___nonzero__, METH_VARARGS, (char *)"vector_cvector_t___nonzero__(vector_cvector_t self) -> bool"},
+	 { (char *)"vector_cvector_t___bool__", _wrap_vector_cvector_t___bool__, METH_VARARGS, (char *)"vector_cvector_t___bool__(vector_cvector_t self) -> bool"},
+	 { (char *)"vector_cvector_t___len__", _wrap_vector_cvector_t___len__, METH_VARARGS, (char *)"vector_cvector_t___len__(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::size_type"},
+	 { (char *)"vector_cvector_t___getslice__", _wrap_vector_cvector_t___getslice__, METH_VARARGS, (char *)"vector_cvector_t___getslice__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j) -> vector_cvector_t"},
+	 { (char *)"vector_cvector_t___setslice__", _wrap_vector_cvector_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j)\n"
+		"vector_cvector_t___setslice__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j, vector_cvector_t v)\n"
+		""},
+	 { (char *)"vector_cvector_t___delslice__", _wrap_vector_cvector_t___delslice__, METH_VARARGS, (char *)"vector_cvector_t___delslice__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, std::vector< BasicVector3D< std::complex< double > > >::difference_type j)"},
+	 { (char *)"vector_cvector_t___delitem__", _wrap_vector_cvector_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< BasicVector3D< std::complex< double > > >::difference_type i)\n"
+		"vector_cvector_t___delitem__(vector_cvector_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_cvector_t___getitem__", _wrap_vector_cvector_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_cvector_t\n"
+		"vector_cvector_t___getitem__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i) -> cvector_t\n"
+		""},
+	 { (char *)"vector_cvector_t___setitem__", _wrap_vector_cvector_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_cvector_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_cvector_t___setitem__(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::difference_type i, cvector_t x)\n"
+		""},
+	 { (char *)"vector_cvector_t_pop", _wrap_vector_cvector_t_pop, METH_VARARGS, (char *)"vector_cvector_t_pop(vector_cvector_t self) -> cvector_t"},
+	 { (char *)"vector_cvector_t_append", _wrap_vector_cvector_t_append, METH_VARARGS, (char *)"vector_cvector_t_append(vector_cvector_t self, cvector_t x)"},
+	 { (char *)"vector_cvector_t_empty", _wrap_vector_cvector_t_empty, METH_VARARGS, (char *)"vector_cvector_t_empty(vector_cvector_t self) -> bool"},
+	 { (char *)"vector_cvector_t_size", _wrap_vector_cvector_t_size, METH_VARARGS, (char *)"vector_cvector_t_size(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::size_type"},
+	 { (char *)"vector_cvector_t_swap", _wrap_vector_cvector_t_swap, METH_VARARGS, (char *)"\n"
+		"vector_cvector_t_swap(vector_cvector_t self, vector_cvector_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vector_cvector_t_begin", _wrap_vector_cvector_t_begin, METH_VARARGS, (char *)"vector_cvector_t_begin(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::iterator"},
+	 { (char *)"vector_cvector_t_end", _wrap_vector_cvector_t_end, METH_VARARGS, (char *)"vector_cvector_t_end(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::iterator"},
+	 { (char *)"vector_cvector_t_rbegin", _wrap_vector_cvector_t_rbegin, METH_VARARGS, (char *)"vector_cvector_t_rbegin(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator"},
+	 { (char *)"vector_cvector_t_rend", _wrap_vector_cvector_t_rend, METH_VARARGS, (char *)"vector_cvector_t_rend(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::reverse_iterator"},
+	 { (char *)"vector_cvector_t_clear", _wrap_vector_cvector_t_clear, METH_VARARGS, (char *)"vector_cvector_t_clear(vector_cvector_t self)"},
+	 { (char *)"vector_cvector_t_get_allocator", _wrap_vector_cvector_t_get_allocator, METH_VARARGS, (char *)"vector_cvector_t_get_allocator(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::allocator_type"},
+	 { (char *)"vector_cvector_t_pop_back", _wrap_vector_cvector_t_pop_back, METH_VARARGS, (char *)"vector_cvector_t_pop_back(vector_cvector_t self)"},
+	 { (char *)"vector_cvector_t_erase", _wrap_vector_cvector_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< BasicVector3D< std::complex< double > > >::iterator pos) -> std::vector< BasicVector3D< std::complex< double > > >::iterator\n"
+		"vector_cvector_t_erase(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::iterator first, std::vector< BasicVector3D< std::complex< double > > >::iterator last) -> std::vector< BasicVector3D< std::complex< double > > >::iterator\n"
+		""},
+	 { (char *)"new_vector_cvector_t", _wrap_new_vector_cvector_t, METH_VARARGS, (char *)"\n"
+		"vector_cvector_t()\n"
+		"vector_cvector_t(vector_cvector_t arg2)\n"
+		"vector_cvector_t(std::vector< BasicVector3D< std::complex< double > > >::size_type size)\n"
+		"new_vector_cvector_t(std::vector< BasicVector3D< std::complex< double > > >::size_type size, cvector_t value) -> vector_cvector_t\n"
+		""},
+	 { (char *)"vector_cvector_t_push_back", _wrap_vector_cvector_t_push_back, METH_VARARGS, (char *)"vector_cvector_t_push_back(vector_cvector_t self, cvector_t x)"},
+	 { (char *)"vector_cvector_t_front", _wrap_vector_cvector_t_front, METH_VARARGS, (char *)"vector_cvector_t_front(vector_cvector_t self) -> cvector_t"},
+	 { (char *)"vector_cvector_t_back", _wrap_vector_cvector_t_back, METH_VARARGS, (char *)"vector_cvector_t_back(vector_cvector_t self) -> cvector_t"},
+	 { (char *)"vector_cvector_t_assign", _wrap_vector_cvector_t_assign, METH_VARARGS, (char *)"vector_cvector_t_assign(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::size_type n, cvector_t x)"},
+	 { (char *)"vector_cvector_t_resize", _wrap_vector_cvector_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< BasicVector3D< std::complex< double > > >::size_type new_size)\n"
+		"vector_cvector_t_resize(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::size_type new_size, cvector_t x)\n"
+		""},
+	 { (char *)"vector_cvector_t_insert", _wrap_vector_cvector_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< BasicVector3D< std::complex< double > > >::iterator pos, cvector_t x) -> std::vector< BasicVector3D< std::complex< double > > >::iterator\n"
+		"vector_cvector_t_insert(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::iterator pos, std::vector< BasicVector3D< std::complex< double > > >::size_type n, cvector_t x)\n"
+		""},
+	 { (char *)"vector_cvector_t_reserve", _wrap_vector_cvector_t_reserve, METH_VARARGS, (char *)"vector_cvector_t_reserve(vector_cvector_t self, std::vector< BasicVector3D< std::complex< double > > >::size_type n)"},
+	 { (char *)"vector_cvector_t_capacity", _wrap_vector_cvector_t_capacity, METH_VARARGS, (char *)"vector_cvector_t_capacity(vector_cvector_t self) -> std::vector< BasicVector3D< std::complex< double > > >::size_type"},
+	 { (char *)"delete_vector_cvector_t", _wrap_delete_vector_cvector_t, METH_VARARGS, (char *)"delete_vector_cvector_t(vector_cvector_t self)"},
+	 { (char *)"vector_cvector_t_swigregister", vector_cvector_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"mul_I", _wrap_mul_I, METH_VARARGS, (char *)"\n"
+		"mul_I(complex_t z) -> complex_t\n"
+		"\n"
+		"complex_t mul_I(complex_t z)\n"
+		"\n"
+		"Returns product I*z, where I is the imaginary unit. \n"
+		"\n"
+		""},
+	 { (char *)"exp_I", _wrap_exp_I, METH_VARARGS, (char *)"\n"
+		"exp_I(complex_t z) -> complex_t\n"
+		"\n"
+		"complex_t exp_I(complex_t z)\n"
+		"\n"
+		"Returns exp(I*z), where I is the imaginary unit. \n"
+		"\n"
+		""},
+	 { (char *)"rad2deg", _wrap_rad2deg, METH_VARARGS, (char *)"\n"
+		"rad2deg(double angle) -> double\n"
+		"\n"
+		"double Units::rad2deg(double angle)\n"
+		"\n"
+		""},
+	 { (char *)"deg2rad", _wrap_deg2rad, METH_VARARGS, (char *)"\n"
+		"deg2rad(double angle) -> double\n"
+		"\n"
+		"double Units::deg2rad(double angle)\n"
+		"\n"
+		""},
+	 { (char *)"new_WavevectorInfo", _wrap_new_WavevectorInfo, METH_VARARGS, (char *)"\n"
+		"WavevectorInfo()\n"
+		"WavevectorInfo(cvector_t ki, cvector_t kf, double wavelength)\n"
+		"new_WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength) -> WavevectorInfo\n"
+		"\n"
+		"WavevectorInfo::WavevectorInfo(kvector_t ki, kvector_t kf, double wavelength)\n"
+		"\n"
+		""},
+	 { (char *)"WavevectorInfo_getKi", _wrap_WavevectorInfo_getKi, METH_VARARGS, (char *)"\n"
+		"WavevectorInfo_getKi(WavevectorInfo self) -> cvector_t\n"
+		"\n"
+		"cvector_t WavevectorInfo::getKi() const \n"
+		"\n"
+		""},
+	 { (char *)"WavevectorInfo_getKf", _wrap_WavevectorInfo_getKf, METH_VARARGS, (char *)"\n"
+		"WavevectorInfo_getKf(WavevectorInfo self) -> cvector_t\n"
+		"\n"
+		"cvector_t WavevectorInfo::getKf() const \n"
+		"\n"
+		""},
+	 { (char *)"WavevectorInfo_getQ", _wrap_WavevectorInfo_getQ, METH_VARARGS, (char *)"\n"
+		"WavevectorInfo_getQ(WavevectorInfo self) -> cvector_t\n"
+		"\n"
+		"cvector_t WavevectorInfo::getQ() const \n"
+		"\n"
+		""},
+	 { (char *)"WavevectorInfo_getWavelength", _wrap_WavevectorInfo_getWavelength, METH_VARARGS, (char *)"\n"
+		"WavevectorInfo_getWavelength(WavevectorInfo self) -> double\n"
+		"\n"
+		"double WavevectorInfo::getWavelength() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_WavevectorInfo", _wrap_delete_WavevectorInfo, METH_VARARGS, (char *)"delete_WavevectorInfo(WavevectorInfo self)"},
+	 { (char *)"WavevectorInfo_swigregister", WavevectorInfo_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Beam", _wrap_new_Beam, METH_VARARGS, (char *)"\n"
+		"Beam()\n"
+		"new_Beam(Beam other) -> Beam\n"
+		"\n"
+		"Beam::Beam(const Beam &other)\n"
+		"\n"
+		""},
+	 { (char *)"delete_Beam", _wrap_delete_Beam, METH_VARARGS, (char *)"\n"
+		"delete_Beam(Beam self)\n"
+		"\n"
+		"virtual Beam::~Beam()\n"
+		"\n"
+		""},
+	 { (char *)"Beam_getCentralK", _wrap_Beam_getCentralK, METH_VARARGS, (char *)"\n"
+		"Beam_getCentralK(Beam self) -> kvector_t\n"
+		"\n"
+		"kvector_t Beam::getCentralK() const\n"
+		"\n"
+		"Returns the wavevector. \n"
+		"\n"
+		""},
+	 { (char *)"Beam_setCentralK", _wrap_Beam_setCentralK, METH_VARARGS, (char *)"\n"
+		"Beam_setCentralK(Beam self, double wavelength, double alpha_i, double phi_i)\n"
+		"\n"
+		"void Beam::setCentralK(double wavelength, double alpha_i, double phi_i)\n"
+		"\n"
+		"Sets the wavevector in terms of wavelength and incoming angles. \n"
+		"\n"
+		""},
+	 { (char *)"Beam_getIntensity", _wrap_Beam_getIntensity, METH_VARARGS, (char *)"\n"
+		"Beam_getIntensity(Beam self) -> double\n"
+		"\n"
+		"double Beam::getIntensity() const\n"
+		"\n"
+		"Returns the beam intensity in neutrons/sec. \n"
+		"\n"
+		""},
+	 { (char *)"Beam_setIntensity", _wrap_Beam_setIntensity, METH_VARARGS, (char *)"\n"
+		"Beam_setIntensity(Beam self, double intensity)\n"
+		"\n"
+		"void Beam::setIntensity(double intensity)\n"
+		"\n"
+		"Sets the beam intensity in neutrons/sec. \n"
+		"\n"
+		""},
+	 { (char *)"Beam_setPolarization", _wrap_Beam_setPolarization, METH_VARARGS, (char *)"\n"
+		"Beam_setPolarization(Beam self, kvector_t bloch_vector)\n"
+		"\n"
+		"void Beam::setPolarization(const kvector_t bloch_vector)\n"
+		"\n"
+		"Sets the polarization density matrix according to the given Bloch vector. \n"
+		"\n"
+		""},
+	 { (char *)"Beam_getWavelength", _wrap_Beam_getWavelength, METH_VARARGS, (char *)"\n"
+		"Beam_getWavelength(Beam self) -> double\n"
+		"\n"
+		"double Beam::getWavelength() const \n"
+		"\n"
+		""},
+	 { (char *)"Beam_getAlpha", _wrap_Beam_getAlpha, METH_VARARGS, (char *)"\n"
+		"Beam_getAlpha(Beam self) -> double\n"
+		"\n"
+		"double Beam::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"Beam_getPhi", _wrap_Beam_getPhi, METH_VARARGS, (char *)"\n"
+		"Beam_getPhi(Beam self) -> double\n"
+		"\n"
+		"double Beam::getPhi() const \n"
+		"\n"
+		""},
+	 { (char *)"Beam_swigregister", Beam_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Bin1D", _wrap_new_Bin1D, METH_VARARGS, (char *)"\n"
+		"Bin1D()\n"
+		"new_Bin1D(double lower, double upper) -> Bin1D\n"
+		"\n"
+		"Bin1D::Bin1D(double lower, double upper)\n"
+		"\n"
+		""},
+	 { (char *)"Bin1D_m_lower_set", _wrap_Bin1D_m_lower_set, METH_VARARGS, (char *)"Bin1D_m_lower_set(Bin1D self, double m_lower)"},
+	 { (char *)"Bin1D_m_lower_get", _wrap_Bin1D_m_lower_get, METH_VARARGS, (char *)"Bin1D_m_lower_get(Bin1D self) -> double"},
+	 { (char *)"Bin1D_m_upper_set", _wrap_Bin1D_m_upper_set, METH_VARARGS, (char *)"Bin1D_m_upper_set(Bin1D self, double m_upper)"},
+	 { (char *)"Bin1D_m_upper_get", _wrap_Bin1D_m_upper_get, METH_VARARGS, (char *)"Bin1D_m_upper_get(Bin1D self) -> double"},
+	 { (char *)"Bin1D_getMidPoint", _wrap_Bin1D_getMidPoint, METH_VARARGS, (char *)"\n"
+		"Bin1D_getMidPoint(Bin1D self) -> double\n"
+		"\n"
+		"double Bin1D::getMidPoint() const \n"
+		"\n"
+		""},
+	 { (char *)"Bin1D_getBinSize", _wrap_Bin1D_getBinSize, METH_VARARGS, (char *)"\n"
+		"Bin1D_getBinSize(Bin1D self) -> double\n"
+		"\n"
+		"double Bin1D::getBinSize() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_Bin1D", _wrap_delete_Bin1D, METH_VARARGS, (char *)"delete_Bin1D(Bin1D self)"},
+	 { (char *)"Bin1D_swigregister", Bin1D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"BinContains", _wrap_BinContains, METH_VARARGS, (char *)"\n"
+		"BinContains(Bin1D bin, double value) -> bool\n"
+		"\n"
+		"bool BinContains(const Bin1D &bin, double value)\n"
+		"\n"
+		"Checks if value is contained in bin: value in [m_lower, m_upper) \n"
+		"\n"
+		""},
+	 { (char *)"new_Bin1DKVector", _wrap_new_Bin1DKVector, METH_VARARGS, (char *)"\n"
+		"Bin1DKVector()\n"
+		"Bin1DKVector(kvector_t lower, kvector_t upper)\n"
+		"new_Bin1DKVector(double wavelength, Bin1D alpha_bin, Bin1D phi_bin) -> Bin1DKVector\n"
+		"\n"
+		"Bin1DKVector::Bin1DKVector(double wavelength, const Bin1D &alpha_bin, const Bin1D &phi_bin)\n"
+		"\n"
+		"creation on  Bin1DKVector from alpha and phi bins \n"
+		"\n"
+		""},
+	 { (char *)"Bin1DKVector_getMidPoint", _wrap_Bin1DKVector_getMidPoint, METH_VARARGS, (char *)"\n"
+		"Bin1DKVector_getMidPoint(Bin1DKVector self) -> kvector_t\n"
+		"\n"
+		"kvector_t Bin1DKVector::getMidPoint() const \n"
+		"\n"
+		""},
+	 { (char *)"Bin1DKVector_getDelta", _wrap_Bin1DKVector_getDelta, METH_VARARGS, (char *)"\n"
+		"Bin1DKVector_getDelta(Bin1DKVector self) -> kvector_t\n"
+		"\n"
+		"kvector_t Bin1DKVector::getDelta() const \n"
+		"\n"
+		""},
+	 { (char *)"Bin1DKVector_m_q_lower_set", _wrap_Bin1DKVector_m_q_lower_set, METH_VARARGS, (char *)"Bin1DKVector_m_q_lower_set(Bin1DKVector self, kvector_t m_q_lower)"},
+	 { (char *)"Bin1DKVector_m_q_lower_get", _wrap_Bin1DKVector_m_q_lower_get, METH_VARARGS, (char *)"Bin1DKVector_m_q_lower_get(Bin1DKVector self) -> kvector_t"},
+	 { (char *)"Bin1DKVector_m_q_upper_set", _wrap_Bin1DKVector_m_q_upper_set, METH_VARARGS, (char *)"Bin1DKVector_m_q_upper_set(Bin1DKVector self, kvector_t m_q_upper)"},
+	 { (char *)"Bin1DKVector_m_q_upper_get", _wrap_Bin1DKVector_m_q_upper_get, METH_VARARGS, (char *)"Bin1DKVector_m_q_upper_get(Bin1DKVector self) -> kvector_t"},
+	 { (char *)"delete_Bin1DKVector", _wrap_delete_Bin1DKVector, METH_VARARGS, (char *)"delete_Bin1DKVector(Bin1DKVector self)"},
+	 { (char *)"Bin1DKVector_swigregister", Bin1DKVector_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Bin1DCVector", _wrap_new_Bin1DCVector, METH_VARARGS, (char *)"\n"
+		"Bin1DCVector()\n"
+		"Bin1DCVector(cvector_t lower, cvector_t upper)\n"
+		"new_Bin1DCVector(double wavelength, Bin1D alpha_bin, Bin1D phi_bin) -> Bin1DCVector\n"
+		"\n"
+		"Bin1DCVector::Bin1DCVector(double wavelength, const Bin1D &alpha_bin, const Bin1D &phi_bin)\n"
+		"\n"
+		"creation on  Bin1DCVector from alpha and phi bins \n"
+		"\n"
+		""},
+	 { (char *)"Bin1DCVector_getMidPoint", _wrap_Bin1DCVector_getMidPoint, METH_VARARGS, (char *)"\n"
+		"Bin1DCVector_getMidPoint(Bin1DCVector self) -> cvector_t\n"
+		"\n"
+		"cvector_t Bin1DCVector::getMidPoint() const \n"
+		"\n"
+		""},
+	 { (char *)"Bin1DCVector_getDelta", _wrap_Bin1DCVector_getDelta, METH_VARARGS, (char *)"\n"
+		"Bin1DCVector_getDelta(Bin1DCVector self) -> cvector_t\n"
+		"\n"
+		"cvector_t Bin1DCVector::getDelta() const \n"
+		"\n"
+		""},
+	 { (char *)"Bin1DCVector_m_q_lower_set", _wrap_Bin1DCVector_m_q_lower_set, METH_VARARGS, (char *)"Bin1DCVector_m_q_lower_set(Bin1DCVector self, cvector_t m_q_lower)"},
+	 { (char *)"Bin1DCVector_m_q_lower_get", _wrap_Bin1DCVector_m_q_lower_get, METH_VARARGS, (char *)"Bin1DCVector_m_q_lower_get(Bin1DCVector self) -> cvector_t"},
+	 { (char *)"Bin1DCVector_m_q_upper_set", _wrap_Bin1DCVector_m_q_upper_set, METH_VARARGS, (char *)"Bin1DCVector_m_q_upper_set(Bin1DCVector self, cvector_t m_q_upper)"},
+	 { (char *)"Bin1DCVector_m_q_upper_get", _wrap_Bin1DCVector_m_q_upper_get, METH_VARARGS, (char *)"Bin1DCVector_m_q_upper_get(Bin1DCVector self) -> cvector_t"},
+	 { (char *)"delete_Bin1DCVector", _wrap_delete_Bin1DCVector, METH_VARARGS, (char *)"delete_Bin1DCVector(Bin1DCVector self)"},
+	 { (char *)"Bin1DCVector_swigregister", Bin1DCVector_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IAxis_clone", _wrap_IAxis_clone, METH_VARARGS, (char *)"\n"
+		"IAxis_clone(IAxis self) -> IAxis\n"
+		"\n"
+		"virtual IAxis* IAxis::clone() const =0\n"
+		"\n"
+		"clone function \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_createDoubleBinSize", _wrap_IAxis_createDoubleBinSize, METH_VARARGS, (char *)"\n"
+		"IAxis_createDoubleBinSize(IAxis self) -> IAxis\n"
+		"\n"
+		"IAxis * IAxis::createDoubleBinSize() const\n"
+		"\n"
+		"Creates a new axis with half the number of bins. \n"
+		"\n"
+		""},
+	 { (char *)"delete_IAxis", _wrap_delete_IAxis, METH_VARARGS, (char *)"\n"
+		"delete_IAxis(IAxis self)\n"
+		"\n"
+		"virtual IAxis::~IAxis()\n"
+		"\n"
+		"destructor \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_size", _wrap_IAxis_size, METH_VARARGS, (char *)"\n"
+		"IAxis_size(IAxis self) -> size_t\n"
+		"\n"
+		"virtual size_t IAxis::size() const =0\n"
+		"\n"
+		"retrieve the number of bins \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_getName", _wrap_IAxis_getName, METH_VARARGS, (char *)"\n"
+		"IAxis_getName(IAxis self) -> std::string\n"
+		"\n"
+		"std::string IAxis::getName() const\n"
+		"\n"
+		"retrieve the label of the axis \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_setName", _wrap_IAxis_setName, METH_VARARGS, (char *)"\n"
+		"IAxis_setName(IAxis self, std::string name)\n"
+		"\n"
+		"void IAxis::setName(std::string name)\n"
+		"\n"
+		"Sets the axis label. \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_getBin", _wrap_IAxis_getBin, METH_VARARGS, (char *)"\n"
+		"IAxis_getBin(IAxis self, size_t index) -> Bin1D\n"
+		"\n"
+		"virtual Bin1D IAxis::getBin(size_t index) const =0\n"
+		"\n"
+		"retrieve a 1d bin for the given index \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_getMin", _wrap_IAxis_getMin, METH_VARARGS, (char *)"\n"
+		"IAxis_getMin(IAxis self) -> double\n"
+		"\n"
+		"virtual double IAxis::getMin() const =0\n"
+		"\n"
+		"Returns value of first point of axis. \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_getMax", _wrap_IAxis_getMax, METH_VARARGS, (char *)"\n"
+		"IAxis_getMax(IAxis self) -> double\n"
+		"\n"
+		"virtual double IAxis::getMax() const =0\n"
+		"\n"
+		"Returns value of last point of axis. \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_getBinCenter", _wrap_IAxis_getBinCenter, METH_VARARGS, (char *)"\n"
+		"IAxis_getBinCenter(IAxis self, size_t index) -> double\n"
+		"\n"
+		"virtual double IAxis::getBinCenter(size_t index) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IAxis_findClosestIndex", _wrap_IAxis_findClosestIndex, METH_VARARGS, (char *)"\n"
+		"IAxis_findClosestIndex(IAxis self, double value) -> size_t\n"
+		"\n"
+		"virtual size_t IAxis::findClosestIndex(double value) const =0\n"
+		"\n"
+		"find bin index which is best match for given value \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_findIndex", _wrap_IAxis_findIndex, METH_VARARGS, (char *)"\n"
+		"IAxis_findIndex(IAxis self, double value) -> size_t\n"
+		"\n"
+		"size_t IAxis::findIndex(double value) const\n"
+		"\n"
+		"find index of bin that contains the given value returns  size() when value is not found \n"
+		"\n"
+		""},
+	 { (char *)"IAxis___eq__", _wrap_IAxis___eq__, METH_VARARGS, (char *)"IAxis___eq__(IAxis self, IAxis right) -> bool"},
+	 { (char *)"IAxis___ne__", _wrap_IAxis___ne__, METH_VARARGS, (char *)"IAxis___ne__(IAxis self, IAxis right) -> bool"},
+	 { (char *)"IAxis_getBinCenters", _wrap_IAxis_getBinCenters, METH_VARARGS, (char *)"\n"
+		"IAxis_getBinCenters(IAxis self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > IAxis::getBinCenters() const \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_getBinBoundaries", _wrap_IAxis_getBinBoundaries, METH_VARARGS, (char *)"\n"
+		"IAxis_getBinBoundaries(IAxis self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > IAxis::getBinBoundaries() const \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_createClippedAxis", _wrap_IAxis_createClippedAxis, METH_VARARGS, (char *)"\n"
+		"IAxis_createClippedAxis(IAxis self, double left, double right) -> IAxis\n"
+		"\n"
+		"IAxis * IAxis::createClippedAxis(double left, double right) const\n"
+		"\n"
+		"Creates a new clipped axis. \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_contains", _wrap_IAxis_contains, METH_VARARGS, (char *)"\n"
+		"IAxis_contains(IAxis self, double value) -> bool\n"
+		"\n"
+		"bool IAxis::contains(double value) const\n"
+		"\n"
+		"Returns true if axis contains given point. \n"
+		"\n"
+		""},
+	 { (char *)"IAxis_swigregister", IAxis_swigregister, METH_VARARGS, NULL},
+	 { (char *)"HaveSameNameAndShape", _wrap_HaveSameNameAndShape, METH_VARARGS, (char *)"\n"
+		"HaveSameNameAndShape(IAxis left, IAxis right) -> bool\n"
+		"\n"
+		"bool HaveSameNameAndShape(const IAxis &left, const IAxis &right)\n"
+		"\n"
+		"global helper function for comparison of axes \n"
+		"\n"
+		""},
+	 { (char *)"new_VariableBinAxis", _wrap_new_VariableBinAxis, METH_VARARGS, (char *)"\n"
+		"new_VariableBinAxis(std::string const & name, size_t nbins, vdouble1d_t bin_boundaries) -> VariableBinAxis\n"
+		"\n"
+		"VariableBinAxis::VariableBinAxis(const std::string &name, size_t nbins, const std::vector< double > &bin_boundaries)\n"
+		"\n"
+		"VariableBinAxis constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"name: \n"
+		"Axis name\n"
+		"\n"
+		"nbins: \n"
+		"number of bins\n"
+		"\n"
+		"bin_boundaries: \n"
+		"Array of size nbins+1 containing low-edges for each bin and upper edge of last bin. \n"
+		"\n"
+		""},
+	 { (char *)"delete_VariableBinAxis", _wrap_delete_VariableBinAxis, METH_VARARGS, (char *)"\n"
+		"delete_VariableBinAxis(VariableBinAxis self)\n"
+		"\n"
+		"virtual VariableBinAxis::~VariableBinAxis()\n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_clone", _wrap_VariableBinAxis_clone, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_clone(VariableBinAxis self) -> VariableBinAxis\n"
+		"\n"
+		"VariableBinAxis * VariableBinAxis::clone() const\n"
+		"\n"
+		"clone function \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_size", _wrap_VariableBinAxis_size, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_size(VariableBinAxis self) -> size_t\n"
+		"\n"
+		"size_t VariableBinAxis::size() const\n"
+		"\n"
+		"retrieve the number of bins \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_getBin", _wrap_VariableBinAxis_getBin, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_getBin(VariableBinAxis self, size_t index) -> Bin1D\n"
+		"\n"
+		"Bin1D VariableBinAxis::getBin(size_t index) const\n"
+		"\n"
+		"retrieve a 1d bin for the given index \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_getMin", _wrap_VariableBinAxis_getMin, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_getMin(VariableBinAxis self) -> double\n"
+		"\n"
+		"double VariableBinAxis::getMin() const\n"
+		"\n"
+		"Returns value of first point of axis. \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_getMax", _wrap_VariableBinAxis_getMax, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_getMax(VariableBinAxis self) -> double\n"
+		"\n"
+		"double VariableBinAxis::getMax() const\n"
+		"\n"
+		"Returns value of last point of axis. \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_getBinCenter", _wrap_VariableBinAxis_getBinCenter, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_getBinCenter(VariableBinAxis self, size_t index) -> double\n"
+		"\n"
+		"double VariableBinAxis::getBinCenter(size_t index) const \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_findClosestIndex", _wrap_VariableBinAxis_findClosestIndex, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_findClosestIndex(VariableBinAxis self, double value) -> size_t\n"
+		"\n"
+		"size_t VariableBinAxis::findClosestIndex(double value) const\n"
+		"\n"
+		"find bin index which is best match for given value \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_getBinCenters", _wrap_VariableBinAxis_getBinCenters, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_getBinCenters(VariableBinAxis self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > VariableBinAxis::getBinCenters() const \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_getBinBoundaries", _wrap_VariableBinAxis_getBinBoundaries, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_getBinBoundaries(VariableBinAxis self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector<double> VariableBinAxis::getBinBoundaries() const \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis_createClippedAxis", _wrap_VariableBinAxis_createClippedAxis, METH_VARARGS, (char *)"\n"
+		"VariableBinAxis_createClippedAxis(VariableBinAxis self, double left, double right) -> VariableBinAxis\n"
+		"\n"
+		"VariableBinAxis * VariableBinAxis::createClippedAxis(double left, double right) const\n"
+		"\n"
+		"Creates a new clipped axis. \n"
+		"\n"
+		""},
+	 { (char *)"VariableBinAxis___getitem__", _wrap_VariableBinAxis___getitem__, METH_VARARGS, (char *)"VariableBinAxis___getitem__(VariableBinAxis self, unsigned int i) -> double"},
+	 { (char *)"VariableBinAxis_swigregister", VariableBinAxis_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ConstKBinAxis", _wrap_new_ConstKBinAxis, METH_VARARGS, (char *)"\n"
+		"new_ConstKBinAxis(std::string const & name, size_t nbins, double start, double end) -> ConstKBinAxis\n"
+		"\n"
+		"ConstKBinAxis::ConstKBinAxis(const std::string &name, size_t nbins, double start, double end)\n"
+		"\n"
+		"ConstKBinAxis constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"name: \n"
+		"Axis name\n"
+		"\n"
+		"nbins: \n"
+		"number of bins\n"
+		"\n"
+		"start: \n"
+		"low edge of first bin\n"
+		"\n"
+		"end: \n"
+		"upper edge of last bin \n"
+		"\n"
+		""},
+	 { (char *)"delete_ConstKBinAxis", _wrap_delete_ConstKBinAxis, METH_VARARGS, (char *)"\n"
+		"delete_ConstKBinAxis(ConstKBinAxis self)\n"
+		"\n"
+		"virtual ConstKBinAxis::~ConstKBinAxis()\n"
+		"\n"
+		""},
+	 { (char *)"ConstKBinAxis_clone", _wrap_ConstKBinAxis_clone, METH_VARARGS, (char *)"\n"
+		"ConstKBinAxis_clone(ConstKBinAxis self) -> ConstKBinAxis\n"
+		"\n"
+		"ConstKBinAxis * ConstKBinAxis::clone() const\n"
+		"\n"
+		"clone function \n"
+		"\n"
+		""},
+	 { (char *)"ConstKBinAxis_createClippedAxis", _wrap_ConstKBinAxis_createClippedAxis, METH_VARARGS, (char *)"\n"
+		"ConstKBinAxis_createClippedAxis(ConstKBinAxis self, double left, double right) -> ConstKBinAxis\n"
+		"\n"
+		"ConstKBinAxis * ConstKBinAxis::createClippedAxis(double left, double right) const\n"
+		"\n"
+		"Creates a new clipped axis. \n"
+		"\n"
+		""},
+	 { (char *)"ConstKBinAxis_swigregister", ConstKBinAxis_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_CustomBinAxis", _wrap_new_CustomBinAxis, METH_VARARGS, (char *)"\n"
+		"new_CustomBinAxis(std::string const & name, size_t nbins, double start, double end) -> CustomBinAxis\n"
+		"\n"
+		"CustomBinAxis::CustomBinAxis(const std::string &name, size_t nbins, double start, double end)\n"
+		"\n"
+		"CustomBinAxis constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"name: \n"
+		"Axis name\n"
+		"\n"
+		"nbins: \n"
+		"number of bins\n"
+		"\n"
+		"start: \n"
+		"center of first bin (IsGisaxs convention)\n"
+		"\n"
+		"end: \n"
+		"center of last bin (IsGisaxs convention) \n"
+		"\n"
+		""},
+	 { (char *)"delete_CustomBinAxis", _wrap_delete_CustomBinAxis, METH_VARARGS, (char *)"\n"
+		"delete_CustomBinAxis(CustomBinAxis self)\n"
+		"\n"
+		"virtual CustomBinAxis::~CustomBinAxis()\n"
+		"\n"
+		""},
+	 { (char *)"CustomBinAxis_clone", _wrap_CustomBinAxis_clone, METH_VARARGS, (char *)"\n"
+		"CustomBinAxis_clone(CustomBinAxis self) -> CustomBinAxis\n"
+		"\n"
+		"CustomBinAxis * CustomBinAxis::clone() const\n"
+		"\n"
+		"clone function \n"
+		"\n"
+		""},
+	 { (char *)"CustomBinAxis_getBin", _wrap_CustomBinAxis_getBin, METH_VARARGS, (char *)"\n"
+		"CustomBinAxis_getBin(CustomBinAxis self, size_t index) -> Bin1D\n"
+		"\n"
+		"Bin1D CustomBinAxis::getBin(size_t index) const\n"
+		"\n"
+		"retrieve a 1d bin for the given index \n"
+		"\n"
+		""},
+	 { (char *)"CustomBinAxis_getBinCenters", _wrap_CustomBinAxis_getBinCenters, METH_VARARGS, (char *)"\n"
+		"CustomBinAxis_getBinCenters(CustomBinAxis self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > CustomBinAxis::getBinCenters() const \n"
+		"\n"
+		""},
+	 { (char *)"CustomBinAxis_createClippedAxis", _wrap_CustomBinAxis_createClippedAxis, METH_VARARGS, (char *)"\n"
+		"CustomBinAxis_createClippedAxis(CustomBinAxis self, double left, double right) -> CustomBinAxis\n"
+		"\n"
+		"CustomBinAxis * CustomBinAxis::createClippedAxis(double left, double right) const\n"
+		"\n"
+		"Creates a new clipped axis. \n"
+		"\n"
+		""},
+	 { (char *)"CustomBinAxis_swigregister", CustomBinAxis_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IShape2D_clone", _wrap_IShape2D_clone, METH_VARARGS, (char *)"\n"
+		"IShape2D_clone(IShape2D self) -> IShape2D\n"
+		"\n"
+		"virtual IShape2D* Geometry::IShape2D::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IShape2D_contains", _wrap_IShape2D_contains, METH_VARARGS, (char *)"\n"
+		"contains(double x, double y) -> bool\n"
+		"IShape2D_contains(IShape2D self, Bin1D binx, Bin1D biny) -> bool\n"
+		"\n"
+		"virtual bool Geometry::IShape2D::contains(const Bin1D &binx, const Bin1D &biny) const =0\n"
+		"\n"
+		"Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). \n"
+		"\n"
+		""},
+	 { (char *)"delete_IShape2D", _wrap_delete_IShape2D, METH_VARARGS, (char *)"delete_IShape2D(IShape2D self)"},
+	 { (char *)"IShape2D_swigregister", IShape2D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"ISample_clone", _wrap_ISample_clone, METH_VARARGS, (char *)"\n"
+		"ISample_clone(ISample self) -> ISample\n"
+		"\n"
+		"ISample* ISample::clone() const override=0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_cloneInvertB", _wrap_ISample_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"ISample_cloneInvertB(ISample self) -> ISample\n"
+		"\n"
+		"ISample * ISample::cloneInvertB() const\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_accept", _wrap_ISample_accept, METH_VARARGS, (char *)"\n"
+		"ISample_accept(ISample self, ISampleVisitor p_visitor)\n"
+		"\n"
+		"virtual void ISample::accept(ISampleVisitor *p_visitor) const =0\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_to_str", _wrap_ISample_to_str, METH_VARARGS, (char *)"\n"
+		"to_str(int indent=0) -> std::string\n"
+		"ISample_to_str(ISample self) -> std::string\n"
+		"\n"
+		"std::string ISample::to_str(int indent=0) const\n"
+		"\n"
+		"Returns textual representation of this and its descendants. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_getMaterial", _wrap_ISample_getMaterial, METH_VARARGS, (char *)"\n"
+		"ISample_getMaterial(ISample self) -> IMaterial\n"
+		"\n"
+		"virtual const IMaterial* ISample::getMaterial() const\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_getAmbientMaterial", _wrap_ISample_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"ISample_getAmbientMaterial(ISample self) -> IMaterial\n"
+		"\n"
+		"virtual const IMaterial* ISample::getAmbientMaterial() const\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_containedMaterials", _wrap_ISample_containedMaterials, METH_VARARGS, (char *)"\n"
+		"ISample_containedMaterials(ISample self) -> std::vector< IMaterial const *,std::allocator< IMaterial const * > >\n"
+		"\n"
+		"std::vector< const IMaterial * > ISample::containedMaterials() const\n"
+		"\n"
+		"Returns set of unique materials contained in this  ISample. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_getChildren", _wrap_ISample_getChildren, METH_VARARGS, (char *)"\n"
+		"ISample_getChildren(ISample self) -> swig_dummy_type_const_isample_vector\n"
+		"\n"
+		"virtual std::vector<const ISample*> ISample::getChildren() const\n"
+		"\n"
+		"Returns a vector of children. \n"
+		"\n"
+		""},
+	 { (char *)"ISample_size", _wrap_ISample_size, METH_VARARGS, (char *)"\n"
+		"ISample_size(ISample self) -> size_t\n"
+		"\n"
+		"virtual size_t ISample::size() const\n"
+		"\n"
+		"Returns number of children. \n"
+		"\n"
+		""},
+	 { (char *)"new_ISample", _wrap_new_ISample, METH_VARARGS, (char *)"\n"
+		"new_ISample(PyObject * arg2) -> ISample\n"
+		"\n"
+		"\n"
+		"\n"
+		"Pure virtual base class for sample components and properties related to scattering.\n"
+		"\n"
+		"Inherited by  ICompositeSample,  IFormFactor,  IInterferenceFunction,  IRoughness,  IRotation. So it is much more basic and abstract than the name \"ISample\" suggests.\n"
+		"\n"
+		"Since  ICompositeSample contains a vector of  ISample's, we provide here some machinery for iterating through a tree (getMaterial, containedMaterials, containedSubclasses, ..). The functions getChildren and size, completely trivial here, become meaningful through their overloads in  ICompositeSample.\n"
+		"\n"
+		"C++ includes: ISample.h\n"
+		"\n"
+		""},
+	 { (char *)"delete_ISample", _wrap_delete_ISample, METH_VARARGS, (char *)"delete_ISample(ISample self)"},
+	 { (char *)"disown_ISample", _wrap_disown_ISample, METH_VARARGS, NULL},
+	 { (char *)"ISample_onChange", _wrap_ISample_onChange, METH_VARARGS, (char *)"ISample_onChange(ISample self)"},
+	 { (char *)"ISample__print", _wrap_ISample__print, METH_VARARGS, (char *)"ISample__print(ISample self, std::ostream & ostr)"},
+	 { (char *)"ISample_swigregister", ISample_swigregister, METH_VARARGS, NULL},
+	 { (char *)"swig_dummy_type_isample_vector_iterator", _wrap_swig_dummy_type_isample_vector_iterator, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_iterator(swig_dummy_type_isample_vector self) -> SwigPyIterator"},
+	 { (char *)"swig_dummy_type_isample_vector___nonzero__", _wrap_swig_dummy_type_isample_vector___nonzero__, METH_VARARGS, (char *)"swig_dummy_type_isample_vector___nonzero__(swig_dummy_type_isample_vector self) -> bool"},
+	 { (char *)"swig_dummy_type_isample_vector___bool__", _wrap_swig_dummy_type_isample_vector___bool__, METH_VARARGS, (char *)"swig_dummy_type_isample_vector___bool__(swig_dummy_type_isample_vector self) -> bool"},
+	 { (char *)"swig_dummy_type_isample_vector___len__", _wrap_swig_dummy_type_isample_vector___len__, METH_VARARGS, (char *)"swig_dummy_type_isample_vector___len__(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::size_type"},
+	 { (char *)"swig_dummy_type_isample_vector___getslice__", _wrap_swig_dummy_type_isample_vector___getslice__, METH_VARARGS, (char *)"swig_dummy_type_isample_vector___getslice__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j) -> swig_dummy_type_isample_vector"},
+	 { (char *)"swig_dummy_type_isample_vector___setslice__", _wrap_swig_dummy_type_isample_vector___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j)\n"
+		"swig_dummy_type_isample_vector___setslice__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j, swig_dummy_type_isample_vector v)\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector___delslice__", _wrap_swig_dummy_type_isample_vector___delslice__, METH_VARARGS, (char *)"swig_dummy_type_isample_vector___delslice__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, std::vector< ISample * >::difference_type j)"},
+	 { (char *)"swig_dummy_type_isample_vector___delitem__", _wrap_swig_dummy_type_isample_vector___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< ISample * >::difference_type i)\n"
+		"swig_dummy_type_isample_vector___delitem__(swig_dummy_type_isample_vector self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector___getitem__", _wrap_swig_dummy_type_isample_vector___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> swig_dummy_type_isample_vector\n"
+		"swig_dummy_type_isample_vector___getitem__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i) -> ISample\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector___setitem__", _wrap_swig_dummy_type_isample_vector___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, swig_dummy_type_isample_vector v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"swig_dummy_type_isample_vector___setitem__(swig_dummy_type_isample_vector self, std::vector< ISample * >::difference_type i, ISample x)\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector_pop", _wrap_swig_dummy_type_isample_vector_pop, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_pop(swig_dummy_type_isample_vector self) -> ISample"},
+	 { (char *)"swig_dummy_type_isample_vector_append", _wrap_swig_dummy_type_isample_vector_append, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_append(swig_dummy_type_isample_vector self, ISample x)"},
+	 { (char *)"swig_dummy_type_isample_vector_empty", _wrap_swig_dummy_type_isample_vector_empty, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_empty(swig_dummy_type_isample_vector self) -> bool"},
+	 { (char *)"swig_dummy_type_isample_vector_size", _wrap_swig_dummy_type_isample_vector_size, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_size(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::size_type"},
+	 { (char *)"swig_dummy_type_isample_vector_swap", _wrap_swig_dummy_type_isample_vector_swap, METH_VARARGS, (char *)"\n"
+		"swig_dummy_type_isample_vector_swap(swig_dummy_type_isample_vector self, swig_dummy_type_isample_vector v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector_begin", _wrap_swig_dummy_type_isample_vector_begin, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_begin(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::iterator"},
+	 { (char *)"swig_dummy_type_isample_vector_end", _wrap_swig_dummy_type_isample_vector_end, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_end(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::iterator"},
+	 { (char *)"swig_dummy_type_isample_vector_rbegin", _wrap_swig_dummy_type_isample_vector_rbegin, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_rbegin(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::reverse_iterator"},
+	 { (char *)"swig_dummy_type_isample_vector_rend", _wrap_swig_dummy_type_isample_vector_rend, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_rend(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::reverse_iterator"},
+	 { (char *)"swig_dummy_type_isample_vector_clear", _wrap_swig_dummy_type_isample_vector_clear, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_clear(swig_dummy_type_isample_vector self)"},
+	 { (char *)"swig_dummy_type_isample_vector_get_allocator", _wrap_swig_dummy_type_isample_vector_get_allocator, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_get_allocator(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::allocator_type"},
+	 { (char *)"swig_dummy_type_isample_vector_pop_back", _wrap_swig_dummy_type_isample_vector_pop_back, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_pop_back(swig_dummy_type_isample_vector self)"},
+	 { (char *)"swig_dummy_type_isample_vector_erase", _wrap_swig_dummy_type_isample_vector_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< ISample * >::iterator pos) -> std::vector< ISample * >::iterator\n"
+		"swig_dummy_type_isample_vector_erase(swig_dummy_type_isample_vector self, std::vector< ISample * >::iterator first, std::vector< ISample * >::iterator last) -> std::vector< ISample * >::iterator\n"
+		""},
+	 { (char *)"new_swig_dummy_type_isample_vector", _wrap_new_swig_dummy_type_isample_vector, METH_VARARGS, (char *)"\n"
+		"swig_dummy_type_isample_vector()\n"
+		"swig_dummy_type_isample_vector(swig_dummy_type_isample_vector arg2)\n"
+		"swig_dummy_type_isample_vector(std::vector< ISample * >::size_type size)\n"
+		"new_swig_dummy_type_isample_vector(std::vector< ISample * >::size_type size, ISample value) -> swig_dummy_type_isample_vector\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector_push_back", _wrap_swig_dummy_type_isample_vector_push_back, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_push_back(swig_dummy_type_isample_vector self, ISample x)"},
+	 { (char *)"swig_dummy_type_isample_vector_front", _wrap_swig_dummy_type_isample_vector_front, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_front(swig_dummy_type_isample_vector self) -> ISample"},
+	 { (char *)"swig_dummy_type_isample_vector_back", _wrap_swig_dummy_type_isample_vector_back, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_back(swig_dummy_type_isample_vector self) -> ISample"},
+	 { (char *)"swig_dummy_type_isample_vector_assign", _wrap_swig_dummy_type_isample_vector_assign, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_assign(swig_dummy_type_isample_vector self, std::vector< ISample * >::size_type n, ISample x)"},
+	 { (char *)"swig_dummy_type_isample_vector_resize", _wrap_swig_dummy_type_isample_vector_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< ISample * >::size_type new_size)\n"
+		"swig_dummy_type_isample_vector_resize(swig_dummy_type_isample_vector self, std::vector< ISample * >::size_type new_size, ISample x)\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector_insert", _wrap_swig_dummy_type_isample_vector_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< ISample * >::iterator pos, ISample x) -> std::vector< ISample * >::iterator\n"
+		"swig_dummy_type_isample_vector_insert(swig_dummy_type_isample_vector self, std::vector< ISample * >::iterator pos, std::vector< ISample * >::size_type n, ISample x)\n"
+		""},
+	 { (char *)"swig_dummy_type_isample_vector_reserve", _wrap_swig_dummy_type_isample_vector_reserve, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_reserve(swig_dummy_type_isample_vector self, std::vector< ISample * >::size_type n)"},
+	 { (char *)"swig_dummy_type_isample_vector_capacity", _wrap_swig_dummy_type_isample_vector_capacity, METH_VARARGS, (char *)"swig_dummy_type_isample_vector_capacity(swig_dummy_type_isample_vector self) -> std::vector< ISample * >::size_type"},
+	 { (char *)"delete_swig_dummy_type_isample_vector", _wrap_delete_swig_dummy_type_isample_vector, METH_VARARGS, (char *)"delete_swig_dummy_type_isample_vector(swig_dummy_type_isample_vector self)"},
+	 { (char *)"swig_dummy_type_isample_vector_swigregister", swig_dummy_type_isample_vector_swigregister, METH_VARARGS, NULL},
+	 { (char *)"swig_dummy_type_const_isample_vector_iterator", _wrap_swig_dummy_type_const_isample_vector_iterator, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_iterator(swig_dummy_type_const_isample_vector self) -> SwigPyIterator"},
+	 { (char *)"swig_dummy_type_const_isample_vector___nonzero__", _wrap_swig_dummy_type_const_isample_vector___nonzero__, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector___nonzero__(swig_dummy_type_const_isample_vector self) -> bool"},
+	 { (char *)"swig_dummy_type_const_isample_vector___bool__", _wrap_swig_dummy_type_const_isample_vector___bool__, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector___bool__(swig_dummy_type_const_isample_vector self) -> bool"},
+	 { (char *)"swig_dummy_type_const_isample_vector___len__", _wrap_swig_dummy_type_const_isample_vector___len__, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector___len__(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::size_type"},
+	 { (char *)"swig_dummy_type_const_isample_vector___getslice__", _wrap_swig_dummy_type_const_isample_vector___getslice__, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector___getslice__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j) -> swig_dummy_type_const_isample_vector"},
+	 { (char *)"swig_dummy_type_const_isample_vector___setslice__", _wrap_swig_dummy_type_const_isample_vector___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j)\n"
+		"swig_dummy_type_const_isample_vector___setslice__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j, swig_dummy_type_const_isample_vector v)\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector___delslice__", _wrap_swig_dummy_type_const_isample_vector___delslice__, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector___delslice__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, std::vector< ISample const * >::difference_type j)"},
+	 { (char *)"swig_dummy_type_const_isample_vector___delitem__", _wrap_swig_dummy_type_const_isample_vector___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< ISample const * >::difference_type i)\n"
+		"swig_dummy_type_const_isample_vector___delitem__(swig_dummy_type_const_isample_vector self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector___getitem__", _wrap_swig_dummy_type_const_isample_vector___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> swig_dummy_type_const_isample_vector\n"
+		"swig_dummy_type_const_isample_vector___getitem__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i) -> ISample\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector___setitem__", _wrap_swig_dummy_type_const_isample_vector___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, swig_dummy_type_const_isample_vector v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"swig_dummy_type_const_isample_vector___setitem__(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::difference_type i, ISample x)\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector_pop", _wrap_swig_dummy_type_const_isample_vector_pop, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_pop(swig_dummy_type_const_isample_vector self) -> ISample"},
+	 { (char *)"swig_dummy_type_const_isample_vector_append", _wrap_swig_dummy_type_const_isample_vector_append, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_append(swig_dummy_type_const_isample_vector self, ISample x)"},
+	 { (char *)"swig_dummy_type_const_isample_vector_empty", _wrap_swig_dummy_type_const_isample_vector_empty, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_empty(swig_dummy_type_const_isample_vector self) -> bool"},
+	 { (char *)"swig_dummy_type_const_isample_vector_size", _wrap_swig_dummy_type_const_isample_vector_size, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_size(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::size_type"},
+	 { (char *)"swig_dummy_type_const_isample_vector_swap", _wrap_swig_dummy_type_const_isample_vector_swap, METH_VARARGS, (char *)"\n"
+		"swig_dummy_type_const_isample_vector_swap(swig_dummy_type_const_isample_vector self, swig_dummy_type_const_isample_vector v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector_begin", _wrap_swig_dummy_type_const_isample_vector_begin, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_begin(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::iterator"},
+	 { (char *)"swig_dummy_type_const_isample_vector_end", _wrap_swig_dummy_type_const_isample_vector_end, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_end(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::iterator"},
+	 { (char *)"swig_dummy_type_const_isample_vector_rbegin", _wrap_swig_dummy_type_const_isample_vector_rbegin, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_rbegin(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::reverse_iterator"},
+	 { (char *)"swig_dummy_type_const_isample_vector_rend", _wrap_swig_dummy_type_const_isample_vector_rend, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_rend(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::reverse_iterator"},
+	 { (char *)"swig_dummy_type_const_isample_vector_clear", _wrap_swig_dummy_type_const_isample_vector_clear, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_clear(swig_dummy_type_const_isample_vector self)"},
+	 { (char *)"swig_dummy_type_const_isample_vector_get_allocator", _wrap_swig_dummy_type_const_isample_vector_get_allocator, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_get_allocator(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::allocator_type"},
+	 { (char *)"swig_dummy_type_const_isample_vector_pop_back", _wrap_swig_dummy_type_const_isample_vector_pop_back, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_pop_back(swig_dummy_type_const_isample_vector self)"},
+	 { (char *)"swig_dummy_type_const_isample_vector_erase", _wrap_swig_dummy_type_const_isample_vector_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< ISample const * >::iterator pos) -> std::vector< ISample const * >::iterator\n"
+		"swig_dummy_type_const_isample_vector_erase(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::iterator first, std::vector< ISample const * >::iterator last) -> std::vector< ISample const * >::iterator\n"
+		""},
+	 { (char *)"new_swig_dummy_type_const_isample_vector", _wrap_new_swig_dummy_type_const_isample_vector, METH_VARARGS, (char *)"\n"
+		"swig_dummy_type_const_isample_vector()\n"
+		"swig_dummy_type_const_isample_vector(swig_dummy_type_const_isample_vector arg2)\n"
+		"swig_dummy_type_const_isample_vector(std::vector< ISample const * >::size_type size)\n"
+		"new_swig_dummy_type_const_isample_vector(std::vector< ISample const * >::size_type size, ISample value) -> swig_dummy_type_const_isample_vector\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector_push_back", _wrap_swig_dummy_type_const_isample_vector_push_back, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_push_back(swig_dummy_type_const_isample_vector self, ISample x)"},
+	 { (char *)"swig_dummy_type_const_isample_vector_front", _wrap_swig_dummy_type_const_isample_vector_front, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_front(swig_dummy_type_const_isample_vector self) -> ISample"},
+	 { (char *)"swig_dummy_type_const_isample_vector_back", _wrap_swig_dummy_type_const_isample_vector_back, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_back(swig_dummy_type_const_isample_vector self) -> ISample"},
+	 { (char *)"swig_dummy_type_const_isample_vector_assign", _wrap_swig_dummy_type_const_isample_vector_assign, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_assign(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::size_type n, ISample x)"},
+	 { (char *)"swig_dummy_type_const_isample_vector_resize", _wrap_swig_dummy_type_const_isample_vector_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< ISample const * >::size_type new_size)\n"
+		"swig_dummy_type_const_isample_vector_resize(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::size_type new_size, ISample x)\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector_insert", _wrap_swig_dummy_type_const_isample_vector_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< ISample const * >::iterator pos, ISample x) -> std::vector< ISample const * >::iterator\n"
+		"swig_dummy_type_const_isample_vector_insert(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::iterator pos, std::vector< ISample const * >::size_type n, ISample x)\n"
+		""},
+	 { (char *)"swig_dummy_type_const_isample_vector_reserve", _wrap_swig_dummy_type_const_isample_vector_reserve, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_reserve(swig_dummy_type_const_isample_vector self, std::vector< ISample const * >::size_type n)"},
+	 { (char *)"swig_dummy_type_const_isample_vector_capacity", _wrap_swig_dummy_type_const_isample_vector_capacity, METH_VARARGS, (char *)"swig_dummy_type_const_isample_vector_capacity(swig_dummy_type_const_isample_vector self) -> std::vector< ISample const * >::size_type"},
+	 { (char *)"delete_swig_dummy_type_const_isample_vector", _wrap_delete_swig_dummy_type_const_isample_vector, METH_VARARGS, (char *)"delete_swig_dummy_type_const_isample_vector(swig_dummy_type_const_isample_vector self)"},
+	 { (char *)"swig_dummy_type_const_isample_vector_swigregister", swig_dummy_type_const_isample_vector_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IChiSquaredModule", _wrap_delete_IChiSquaredModule, METH_VARARGS, (char *)"\n"
+		"delete_IChiSquaredModule(IChiSquaredModule self)\n"
+		"\n"
+		"IChiSquaredModule::~IChiSquaredModule()\n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_clone", _wrap_IChiSquaredModule_clone, METH_VARARGS, (char *)"\n"
+		"IChiSquaredModule_clone(IChiSquaredModule self) -> IChiSquaredModule\n"
+		"\n"
+		"virtual IChiSquaredModule* IChiSquaredModule::clone() const =0\n"
+		"\n"
+		"clone method \n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_getSquaredFunction", _wrap_IChiSquaredModule_getSquaredFunction, METH_VARARGS, (char *)"\n"
+		"IChiSquaredModule_getSquaredFunction(IChiSquaredModule self) -> ISquaredFunction\n"
+		"\n"
+		"const ISquaredFunction* IChiSquaredModule::getSquaredFunction() const\n"
+		"\n"
+		"Returns squared function. \n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_setChiSquaredFunction", _wrap_IChiSquaredModule_setChiSquaredFunction, METH_VARARGS, (char *)"\n"
+		"setChiSquaredFunction(ISquaredFunction squared_function)\n"
+		"IChiSquaredModule_setChiSquaredFunction(IChiSquaredModule self, ISquaredFunction squared_function)\n"
+		"\n"
+		"void IChiSquaredModule::setChiSquaredFunction(const ISquaredFunction &squared_function)\n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_getIntensityNormalizer", _wrap_IChiSquaredModule_getIntensityNormalizer, METH_VARARGS, (char *)"\n"
+		"getIntensityNormalizer() -> IIntensityNormalizer\n"
+		"IChiSquaredModule_getIntensityNormalizer(IChiSquaredModule self) -> IIntensityNormalizer\n"
+		"\n"
+		"virtual IIntensityNormalizer* IChiSquaredModule::getIntensityNormalizer()\n"
+		"\n"
+		"Returns data normalizer, non-const version needed to set internals. \n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_setIntensityNormalizer", _wrap_IChiSquaredModule_setIntensityNormalizer, METH_VARARGS, (char *)"\n"
+		"IChiSquaredModule_setIntensityNormalizer(IChiSquaredModule self, IIntensityNormalizer data_normalizer)\n"
+		"\n"
+		"void IChiSquaredModule::setIntensityNormalizer(const IIntensityNormalizer &data_normalizer)\n"
+		"\n"
+		"Sets data normalizer. \n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_getIntensityFunction", _wrap_IChiSquaredModule_getIntensityFunction, METH_VARARGS, (char *)"\n"
+		"IChiSquaredModule_getIntensityFunction(IChiSquaredModule self) -> IIntensityFunction\n"
+		"\n"
+		"virtual const IIntensityFunction* IChiSquaredModule::getIntensityFunction() const\n"
+		"\n"
+		"Returns data rescaler. \n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_setIntensityFunction", _wrap_IChiSquaredModule_setIntensityFunction, METH_VARARGS, (char *)"\n"
+		"IChiSquaredModule_setIntensityFunction(IChiSquaredModule self, IIntensityFunction intensity_function)\n"
+		"\n"
+		"void IChiSquaredModule::setIntensityFunction(const IIntensityFunction &intensity_function)\n"
+		"\n"
+		"Sets data rescaler. \n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_processFitElements", _wrap_IChiSquaredModule_processFitElements, METH_VARARGS, (char *)"\n"
+		"IChiSquaredModule_processFitElements(IChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator arg3, std::vector< FitElement,std::allocator< FitElement > >::iterator arg4)\n"
+		"\n"
+		"virtual void IChiSquaredModule::processFitElements(std::vector< FitElement >::iterator, std::vector< FitElement >::iterator)\n"
+		"\n"
+		""},
+	 { (char *)"IChiSquaredModule_swigregister", IChiSquaredModule_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IObserver", _wrap_delete_IObserver, METH_VARARGS, (char *)"\n"
+		"delete_IObserver(IObserver self)\n"
+		"\n"
+		"virtual IObserver::~IObserver()\n"
+		"\n"
+		""},
+	 { (char *)"IObserver_notify", _wrap_IObserver_notify, METH_VARARGS, (char *)"\n"
+		"IObserver_notify(IObserver self, IObservable subject)\n"
+		"\n"
+		"virtual void IObserver::notify(IObservable *subject)=0\n"
+		"\n"
+		"method which is used by observable subject to notify change in status \n"
+		"\n"
+		""},
+	 { (char *)"IObserver_swigregister", IObserver_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IObservable", _wrap_delete_IObservable, METH_VARARGS, (char *)"\n"
+		"delete_IObservable(IObservable self)\n"
+		"\n"
+		"virtual IObservable::~IObservable()\n"
+		"\n"
+		""},
+	 { (char *)"IObservable_attachObserver", _wrap_IObservable_attachObserver, METH_VARARGS, (char *)"\n"
+		"IObservable_attachObserver(IObservable self, IObservable::observer_t obj)\n"
+		"\n"
+		"void IObservable::attachObserver(observer_t obj)\n"
+		"\n"
+		"attach observer to the list of observers \n"
+		"\n"
+		""},
+	 { (char *)"IObservable_notifyObservers", _wrap_IObservable_notifyObservers, METH_VARARGS, (char *)"\n"
+		"IObservable_notifyObservers(IObservable self)\n"
+		"\n"
+		"void IObservable::notifyObservers()\n"
+		"\n"
+		"notify observers about change in status \n"
+		"\n"
+		""},
+	 { (char *)"new_IObservable", _wrap_new_IObservable, METH_VARARGS, (char *)"\n"
+		"new_IObservable(PyObject * arg2) -> IObservable\n"
+		"\n"
+		"\n"
+		"\n"
+		"Observable interface from Observer pattern, for 1:n object dependencies.\n"
+		"\n"
+		"C++ includes: IObserver.h\n"
+		"\n"
+		""},
+	 { (char *)"disown_IObservable", _wrap_disown_IObservable, METH_VARARGS, NULL},
+	 { (char *)"IObservable_swigregister", IObservable_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IFitObserver", _wrap_new_IFitObserver, METH_VARARGS, (char *)"\n"
+		"new_IFitObserver(PyObject * arg2, int update_every_nth) -> IFitObserver\n"
+		"\n"
+		"IFitObserver::IFitObserver(int update_every_nth)\n"
+		"\n"
+		""},
+	 { (char *)"IFitObserver_notify", _wrap_IFitObserver_notify, METH_VARARGS, (char *)"\n"
+		"IFitObserver_notify(IFitObserver self, IObservable subject)\n"
+		"\n"
+		"void IFitObserver::notify(IObservable *subject)\n"
+		"\n"
+		"The method used by Ovservable when he wants to be observed by this. \n"
+		"\n"
+		""},
+	 { (char *)"IFitObserver_update", _wrap_IFitObserver_update, METH_VARARGS, (char *)"\n"
+		"IFitObserver_update(IFitObserver self, FitSuite fit_suite)\n"
+		"\n"
+		"void IFitObserver::update(FitSuite *fit_suite)\n"
+		"\n"
+		"Here Onserver will do actuall job when he thinks that it is a right moment. \n"
+		"\n"
+		""},
+	 { (char *)"delete_IFitObserver", _wrap_delete_IFitObserver, METH_VARARGS, (char *)"delete_IFitObserver(IFitObserver self)"},
+	 { (char *)"disown_IFitObserver", _wrap_disown_IFitObserver, METH_VARARGS, NULL},
+	 { (char *)"IFitObserver_swigregister", IFitObserver_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IFitStrategy", _wrap_delete_IFitStrategy, METH_VARARGS, (char *)"\n"
+		"delete_IFitStrategy(IFitStrategy self)\n"
+		"\n"
+		"virtual IFitStrategy::~IFitStrategy()\n"
+		"\n"
+		""},
+	 { (char *)"IFitStrategy_clone", _wrap_IFitStrategy_clone, METH_VARARGS, (char *)"\n"
+		"IFitStrategy_clone(IFitStrategy self) -> IFitStrategy\n"
+		"\n"
+		"virtual IFitStrategy* IFitStrategy::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IFitStrategy_init", _wrap_IFitStrategy_init, METH_VARARGS, (char *)"\n"
+		"IFitStrategy_init(IFitStrategy self, FitSuiteImpl * fit_suite)\n"
+		"\n"
+		"void IFitStrategy::init(FitSuiteImpl *fit_suite)\n"
+		"\n"
+		""},
+	 { (char *)"IFitStrategy_execute", _wrap_IFitStrategy_execute, METH_VARARGS, (char *)"\n"
+		"IFitStrategy_execute(IFitStrategy self)\n"
+		"\n"
+		"virtual void IFitStrategy::execute()=0\n"
+		"\n"
+		""},
+	 { (char *)"IFitStrategy_swigregister", IFitStrategy_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitStrategyDefault", _wrap_new_FitStrategyDefault, METH_VARARGS, (char *)"\n"
+		"new_FitStrategyDefault() -> FitStrategyDefault\n"
+		"\n"
+		"FitStrategyDefault::FitStrategyDefault()\n"
+		"\n"
+		""},
+	 { (char *)"FitStrategyDefault_clone", _wrap_FitStrategyDefault_clone, METH_VARARGS, (char *)"\n"
+		"FitStrategyDefault_clone(FitStrategyDefault self) -> FitStrategyDefault\n"
+		"\n"
+		"FitStrategyDefault * FitStrategyDefault::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FitStrategyDefault_execute", _wrap_FitStrategyDefault_execute, METH_VARARGS, (char *)"\n"
+		"FitStrategyDefault_execute(FitStrategyDefault self)\n"
+		"\n"
+		"void FitStrategyDefault::execute()\n"
+		"\n"
+		""},
+	 { (char *)"delete_FitStrategyDefault", _wrap_delete_FitStrategyDefault, METH_VARARGS, (char *)"delete_FitStrategyDefault(FitStrategyDefault self)"},
+	 { (char *)"FitStrategyDefault_swigregister", FitStrategyDefault_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IIntensityFunction", _wrap_delete_IIntensityFunction, METH_VARARGS, (char *)"\n"
+		"delete_IIntensityFunction(IIntensityFunction self)\n"
+		"\n"
+		"virtual IIntensityFunction::~IIntensityFunction()\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityFunction_clone", _wrap_IIntensityFunction_clone, METH_VARARGS, (char *)"\n"
+		"IIntensityFunction_clone(IIntensityFunction self) -> IIntensityFunction\n"
+		"\n"
+		"virtual IIntensityFunction* IIntensityFunction::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityFunction_evaluate", _wrap_IIntensityFunction_evaluate, METH_VARARGS, (char *)"\n"
+		"IIntensityFunction_evaluate(IIntensityFunction self, double value) -> double\n"
+		"\n"
+		"virtual double IIntensityFunction::evaluate(double value) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityFunction_swigregister", IIntensityFunction_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IntensityFunctionLog", _wrap_delete_IntensityFunctionLog, METH_VARARGS, (char *)"\n"
+		"delete_IntensityFunctionLog(IntensityFunctionLog self)\n"
+		"\n"
+		"virtual IntensityFunctionLog::~IntensityFunctionLog()\n"
+		"\n"
+		""},
+	 { (char *)"IntensityFunctionLog_clone", _wrap_IntensityFunctionLog_clone, METH_VARARGS, (char *)"\n"
+		"IntensityFunctionLog_clone(IntensityFunctionLog self) -> IntensityFunctionLog\n"
+		"\n"
+		"virtual IntensityFunctionLog* IntensityFunctionLog::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"IntensityFunctionLog_evaluate", _wrap_IntensityFunctionLog_evaluate, METH_VARARGS, (char *)"\n"
+		"IntensityFunctionLog_evaluate(IntensityFunctionLog self, double value) -> double\n"
+		"\n"
+		"double IntensityFunctionLog::evaluate(double value) const \n"
+		"\n"
+		""},
+	 { (char *)"new_IntensityFunctionLog", _wrap_new_IntensityFunctionLog, METH_VARARGS, (char *)"\n"
+		"new_IntensityFunctionLog() -> IntensityFunctionLog\n"
+		"\n"
+		"\n"
+		"\n"
+		"Algorithm for applying log function to the measured intensity.\n"
+		"\n"
+		"C++ includes: IIntensityFunction.h\n"
+		"\n"
+		""},
+	 { (char *)"IntensityFunctionLog_swigregister", IntensityFunctionLog_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IntensityFunctionSqrt", _wrap_delete_IntensityFunctionSqrt, METH_VARARGS, (char *)"\n"
+		"delete_IntensityFunctionSqrt(IntensityFunctionSqrt self)\n"
+		"\n"
+		"virtual IntensityFunctionSqrt::~IntensityFunctionSqrt()\n"
+		"\n"
+		""},
+	 { (char *)"IntensityFunctionSqrt_clone", _wrap_IntensityFunctionSqrt_clone, METH_VARARGS, (char *)"\n"
+		"IntensityFunctionSqrt_clone(IntensityFunctionSqrt self) -> IntensityFunctionSqrt\n"
+		"\n"
+		"virtual IntensityFunctionSqrt* IntensityFunctionSqrt::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"IntensityFunctionSqrt_evaluate", _wrap_IntensityFunctionSqrt_evaluate, METH_VARARGS, (char *)"\n"
+		"IntensityFunctionSqrt_evaluate(IntensityFunctionSqrt self, double value) -> double\n"
+		"\n"
+		"double IntensityFunctionSqrt::evaluate(double value) const \n"
+		"\n"
+		""},
+	 { (char *)"new_IntensityFunctionSqrt", _wrap_new_IntensityFunctionSqrt, METH_VARARGS, (char *)"\n"
+		"new_IntensityFunctionSqrt() -> IntensityFunctionSqrt\n"
+		"\n"
+		"\n"
+		"\n"
+		"Algorithm for applying sqrt function to the measured intensity.\n"
+		"\n"
+		"C++ includes: IIntensityFunction.h\n"
+		"\n"
+		""},
+	 { (char *)"IntensityFunctionSqrt_swigregister", IntensityFunctionSqrt_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IIntensityNormalizer", _wrap_delete_IIntensityNormalizer, METH_VARARGS, (char *)"\n"
+		"delete_IIntensityNormalizer(IIntensityNormalizer self)\n"
+		"\n"
+		"virtual IIntensityNormalizer::~IIntensityNormalizer()\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityNormalizer_clone", _wrap_IIntensityNormalizer_clone, METH_VARARGS, (char *)"\n"
+		"IIntensityNormalizer_clone(IIntensityNormalizer self) -> IIntensityNormalizer\n"
+		"\n"
+		"virtual IIntensityNormalizer* IIntensityNormalizer::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityNormalizer_createNormalizedData", _wrap_IIntensityNormalizer_createNormalizedData, METH_VARARGS, (char *)"\n"
+		"IIntensityNormalizer_createNormalizedData(IIntensityNormalizer self, IntensityData data) -> IntensityData\n"
+		"\n"
+		"virtual OutputData<double>* IIntensityNormalizer::createNormalizedData(const OutputData< double > &data) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityNormalizer_apply", _wrap_IIntensityNormalizer_apply, METH_VARARGS, (char *)"\n"
+		"IIntensityNormalizer_apply(IIntensityNormalizer self, IntensityData data)\n"
+		"\n"
+		"virtual void IIntensityNormalizer::apply(OutputData< double > &data) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityNormalizer_setMaximumIntensity", _wrap_IIntensityNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"\n"
+		"IIntensityNormalizer_setMaximumIntensity(IIntensityNormalizer self, double arg3)\n"
+		"\n"
+		"virtual void IIntensityNormalizer::setMaximumIntensity(double)=0\n"
+		"\n"
+		""},
+	 { (char *)"IIntensityNormalizer_swigregister", IIntensityNormalizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IntensityNormalizer", _wrap_new_IntensityNormalizer, METH_VARARGS, (char *)"\n"
+		"IntensityNormalizer(double scale=1.0, double shift=0.0)\n"
+		"IntensityNormalizer(double scale=1.0)\n"
+		"new_IntensityNormalizer() -> IntensityNormalizer\n"
+		"\n"
+		"IntensityNormalizer::IntensityNormalizer(double scale=1.0, double shift=0.0)\n"
+		"\n"
+		""},
+	 { (char *)"delete_IntensityNormalizer", _wrap_delete_IntensityNormalizer, METH_VARARGS, (char *)"\n"
+		"delete_IntensityNormalizer(IntensityNormalizer self)\n"
+		"\n"
+		"virtual IntensityNormalizer::~IntensityNormalizer()\n"
+		"\n"
+		""},
+	 { (char *)"IntensityNormalizer_clone", _wrap_IntensityNormalizer_clone, METH_VARARGS, (char *)"\n"
+		"IntensityNormalizer_clone(IntensityNormalizer self) -> IntensityNormalizer\n"
+		"\n"
+		"IntensityNormalizer * IntensityNormalizer::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"IntensityNormalizer_createNormalizedData", _wrap_IntensityNormalizer_createNormalizedData, METH_VARARGS, (char *)"\n"
+		"IntensityNormalizer_createNormalizedData(IntensityNormalizer self, IntensityData data) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * IntensityNormalizer::createNormalizedData(const OutputData< double > &data) const \n"
+		"\n"
+		""},
+	 { (char *)"IntensityNormalizer_apply", _wrap_IntensityNormalizer_apply, METH_VARARGS, (char *)"\n"
+		"IntensityNormalizer_apply(IntensityNormalizer self, IntensityData data)\n"
+		"\n"
+		"void IntensityNormalizer::apply(OutputData< double > &data) const final\n"
+		"\n"
+		""},
+	 { (char *)"IntensityNormalizer_setMaximumIntensity", _wrap_IntensityNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"\n"
+		"IntensityNormalizer_setMaximumIntensity(IntensityNormalizer self, double max_intensity)\n"
+		"\n"
+		"virtual void IntensityNormalizer::setMaximumIntensity(double max_intensity)\n"
+		"\n"
+		""},
+	 { (char *)"IntensityNormalizer_swigregister", IntensityNormalizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IntensityScaleAndShiftNormalizer", _wrap_new_IntensityScaleAndShiftNormalizer, METH_VARARGS, (char *)"\n"
+		"IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)\n"
+		"IntensityScaleAndShiftNormalizer(double scale=1.0)\n"
+		"new_IntensityScaleAndShiftNormalizer() -> IntensityScaleAndShiftNormalizer\n"
+		"\n"
+		"IntensityScaleAndShiftNormalizer::IntensityScaleAndShiftNormalizer(double scale=1.0, double shift=0.0)\n"
+		"\n"
+		""},
+	 { (char *)"delete_IntensityScaleAndShiftNormalizer", _wrap_delete_IntensityScaleAndShiftNormalizer, METH_VARARGS, (char *)"\n"
+		"delete_IntensityScaleAndShiftNormalizer(IntensityScaleAndShiftNormalizer self)\n"
+		"\n"
+		"IntensityScaleAndShiftNormalizer::~IntensityScaleAndShiftNormalizer() final\n"
+		"\n"
+		""},
+	 { (char *)"IntensityScaleAndShiftNormalizer_setMaximumIntensity", _wrap_IntensityScaleAndShiftNormalizer_setMaximumIntensity, METH_VARARGS, (char *)"\n"
+		"IntensityScaleAndShiftNormalizer_setMaximumIntensity(IntensityScaleAndShiftNormalizer self, double arg3)\n"
+		"\n"
+		"void IntensityScaleAndShiftNormalizer::setMaximumIntensity(double) final\n"
+		"\n"
+		""},
+	 { (char *)"IntensityScaleAndShiftNormalizer_clone", _wrap_IntensityScaleAndShiftNormalizer_clone, METH_VARARGS, (char *)"\n"
+		"IntensityScaleAndShiftNormalizer_clone(IntensityScaleAndShiftNormalizer self) -> IntensityScaleAndShiftNormalizer\n"
+		"\n"
+		"IntensityScaleAndShiftNormalizer* IntensityScaleAndShiftNormalizer::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"IntensityScaleAndShiftNormalizer_swigregister", IntensityScaleAndShiftNormalizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_ISquaredFunction", _wrap_delete_ISquaredFunction, METH_VARARGS, (char *)"\n"
+		"delete_ISquaredFunction(ISquaredFunction self)\n"
+		"\n"
+		"virtual ISquaredFunction::~ISquaredFunction()\n"
+		"\n"
+		""},
+	 { (char *)"ISquaredFunction_clone", _wrap_ISquaredFunction_clone, METH_VARARGS, (char *)"\n"
+		"ISquaredFunction_clone(ISquaredFunction self) -> ISquaredFunction\n"
+		"\n"
+		"virtual ISquaredFunction* ISquaredFunction::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"ISquaredFunction_calculateSquaredDifference", _wrap_ISquaredFunction_calculateSquaredDifference, METH_VARARGS, (char *)"\n"
+		"ISquaredFunction_calculateSquaredDifference(ISquaredFunction self, double real_value, double simulated_value) -> double\n"
+		"\n"
+		"virtual double ISquaredFunction::calculateSquaredDifference(double real_value, double simulated_value) const =0\n"
+		"\n"
+		""},
+	 { (char *)"ISquaredFunction_calculateSquaredError", _wrap_ISquaredFunction_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"calculateSquaredError(double real_value, double simulated_value=0.0) -> double\n"
+		"ISquaredFunction_calculateSquaredError(ISquaredFunction self, double real_value) -> double\n"
+		"\n"
+		"virtual double ISquaredFunction::calculateSquaredError(double real_value, double simulated_value=0.0) const =0\n"
+		"\n"
+		""},
+	 { (char *)"ISquaredFunction_swigregister", ISquaredFunction_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SquaredFunctionDefault", _wrap_new_SquaredFunctionDefault, METH_VARARGS, (char *)"\n"
+		"new_SquaredFunctionDefault() -> SquaredFunctionDefault\n"
+		"\n"
+		"SquaredFunctionDefault::SquaredFunctionDefault()\n"
+		"\n"
+		""},
+	 { (char *)"delete_SquaredFunctionDefault", _wrap_delete_SquaredFunctionDefault, METH_VARARGS, (char *)"\n"
+		"delete_SquaredFunctionDefault(SquaredFunctionDefault self)\n"
+		"\n"
+		"virtual SquaredFunctionDefault::~SquaredFunctionDefault()\n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionDefault_clone", _wrap_SquaredFunctionDefault_clone, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionDefault_clone(SquaredFunctionDefault self) -> SquaredFunctionDefault\n"
+		"\n"
+		"virtual SquaredFunctionDefault* SquaredFunctionDefault::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionDefault_calculateSquaredDifference", _wrap_SquaredFunctionDefault_calculateSquaredDifference, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionDefault_calculateSquaredDifference(SquaredFunctionDefault self, double real_value, double simulated_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionDefault::calculateSquaredDifference(double real_value, double simulated_value) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionDefault_calculateSquaredError", _wrap_SquaredFunctionDefault_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"calculateSquaredError(double real_value, double simulated_value=0) -> double\n"
+		"SquaredFunctionDefault_calculateSquaredError(SquaredFunctionDefault self, double real_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionDefault::calculateSquaredError(double real_value, double simulated_value=0) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionDefault_swigregister", SquaredFunctionDefault_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionSimError", _wrap_delete_SquaredFunctionSimError, METH_VARARGS, (char *)"\n"
+		"delete_SquaredFunctionSimError(SquaredFunctionSimError self)\n"
+		"\n"
+		"virtual SquaredFunctionSimError::~SquaredFunctionSimError()\n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSimError_clone", _wrap_SquaredFunctionSimError_clone, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionSimError_clone(SquaredFunctionSimError self) -> SquaredFunctionSimError\n"
+		"\n"
+		"virtual SquaredFunctionSimError* SquaredFunctionSimError::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSimError_calculateSquaredDifference", _wrap_SquaredFunctionSimError_calculateSquaredDifference, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionSimError_calculateSquaredDifference(SquaredFunctionSimError self, double real_value, double simulated_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionSimError::calculateSquaredDifference(double real_value, double simulated_value) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSimError_calculateSquaredError", _wrap_SquaredFunctionSimError_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionSimError_calculateSquaredError(SquaredFunctionSimError self, double arg3, double simulated_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionSimError::calculateSquaredError(double, double simulated_value) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSimError_swigregister", SquaredFunctionSimError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionMeanSquaredError", _wrap_delete_SquaredFunctionMeanSquaredError, METH_VARARGS, (char *)"\n"
+		"delete_SquaredFunctionMeanSquaredError(SquaredFunctionMeanSquaredError self)\n"
+		"\n"
+		"virtual SquaredFunctionMeanSquaredError::~SquaredFunctionMeanSquaredError()\n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionMeanSquaredError_clone", _wrap_SquaredFunctionMeanSquaredError_clone, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionMeanSquaredError_clone(SquaredFunctionMeanSquaredError self) -> SquaredFunctionMeanSquaredError\n"
+		"\n"
+		"virtual SquaredFunctionMeanSquaredError* SquaredFunctionMeanSquaredError::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionMeanSquaredError_calculateSquaredDifference", _wrap_SquaredFunctionMeanSquaredError_calculateSquaredDifference, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionMeanSquaredError_calculateSquaredDifference(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionMeanSquaredError::calculateSquaredDifference(double real_value, double simulated_value) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionMeanSquaredError_calculateSquaredError", _wrap_SquaredFunctionMeanSquaredError_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionMeanSquaredError_calculateSquaredError(SquaredFunctionMeanSquaredError self, double real_value, double simulated_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionMeanSquaredError::calculateSquaredError(double real_value, double simulated_value) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionMeanSquaredError_swigregister", SquaredFunctionMeanSquaredError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionSystematicError", _wrap_delete_SquaredFunctionSystematicError, METH_VARARGS, (char *)"\n"
+		"delete_SquaredFunctionSystematicError(SquaredFunctionSystematicError self)\n"
+		"\n"
+		"virtual SquaredFunctionSystematicError::~SquaredFunctionSystematicError()\n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSystematicError_clone", _wrap_SquaredFunctionSystematicError_clone, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionSystematicError_clone(SquaredFunctionSystematicError self) -> SquaredFunctionSystematicError\n"
+		"\n"
+		"virtual SquaredFunctionSystematicError* SquaredFunctionSystematicError::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSystematicError_calculateSquaredDifference", _wrap_SquaredFunctionSystematicError_calculateSquaredDifference, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionSystematicError_calculateSquaredDifference(SquaredFunctionSystematicError self, double real_value, double simulated_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionSystematicError::calculateSquaredDifference(double real_value, double simulated_value) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSystematicError_calculateSquaredError", _wrap_SquaredFunctionSystematicError_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionSystematicError_calculateSquaredError(SquaredFunctionSystematicError self, double real_value, double arg4) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionSystematicError::calculateSquaredError(double real_value, double) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionSystematicError_swigregister", SquaredFunctionSystematicError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_SquaredFunctionGaussianError", _wrap_delete_SquaredFunctionGaussianError, METH_VARARGS, (char *)"\n"
+		"delete_SquaredFunctionGaussianError(SquaredFunctionGaussianError self)\n"
+		"\n"
+		"virtual SquaredFunctionGaussianError::~SquaredFunctionGaussianError()\n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionGaussianError_clone", _wrap_SquaredFunctionGaussianError_clone, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionGaussianError_clone(SquaredFunctionGaussianError self) -> SquaredFunctionGaussianError\n"
+		"\n"
+		"virtual SquaredFunctionGaussianError* SquaredFunctionGaussianError::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionGaussianError_calculateSquaredDifference", _wrap_SquaredFunctionGaussianError_calculateSquaredDifference, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionGaussianError_calculateSquaredDifference(SquaredFunctionGaussianError self, double real_value, double simulated_value) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionGaussianError::calculateSquaredDifference(double real_value, double simulated_value) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionGaussianError_calculateSquaredError", _wrap_SquaredFunctionGaussianError_calculateSquaredError, METH_VARARGS, (char *)"\n"
+		"SquaredFunctionGaussianError_calculateSquaredError(SquaredFunctionGaussianError self, double arg3, double arg4) -> double\n"
+		"\n"
+		"virtual double SquaredFunctionGaussianError::calculateSquaredError(double, double) const \n"
+		"\n"
+		""},
+	 { (char *)"SquaredFunctionGaussianError_swigregister", SquaredFunctionGaussianError_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ChiSquaredModule", _wrap_new_ChiSquaredModule, METH_VARARGS, (char *)"\n"
+		"ChiSquaredModule()\n"
+		"new_ChiSquaredModule(ChiSquaredModule other) -> ChiSquaredModule\n"
+		"\n"
+		"ChiSquaredModule::ChiSquaredModule(const ChiSquaredModule &other)\n"
+		"\n"
+		""},
+	 { (char *)"delete_ChiSquaredModule", _wrap_delete_ChiSquaredModule, METH_VARARGS, (char *)"\n"
+		"delete_ChiSquaredModule(ChiSquaredModule self)\n"
+		"\n"
+		"virtual ChiSquaredModule::~ChiSquaredModule()\n"
+		"\n"
+		""},
+	 { (char *)"ChiSquaredModule_clone", _wrap_ChiSquaredModule_clone, METH_VARARGS, (char *)"\n"
+		"ChiSquaredModule_clone(ChiSquaredModule self) -> ChiSquaredModule\n"
+		"\n"
+		"virtual ChiSquaredModule* ChiSquaredModule::clone() const\n"
+		"\n"
+		"clone method \n"
+		"\n"
+		""},
+	 { (char *)"ChiSquaredModule_processFitElements", _wrap_ChiSquaredModule_processFitElements, METH_VARARGS, (char *)"\n"
+		"ChiSquaredModule_processFitElements(ChiSquaredModule self, std::vector< FitElement,std::allocator< FitElement > >::iterator first, std::vector< FitElement,std::allocator< FitElement > >::iterator last)\n"
+		"\n"
+		"void ChiSquaredModule::processFitElements(std::vector< FitElement >::iterator first, std::vector< FitElement >::iterator last)\n"
+		"\n"
+		""},
+	 { (char *)"ChiSquaredModule_swigregister", ChiSquaredModule_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitObject", _wrap_new_FitObject, METH_VARARGS, (char *)"\n"
+		"FitObject(GISASSimulation simulation, IntensityData real_data, double weight=1)\n"
+		"new_FitObject(GISASSimulation simulation, IntensityData real_data) -> FitObject\n"
+		"\n"
+		"FitObject::FitObject(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight=1)\n"
+		"\n"
+		"FitObject constructor\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"simulation: \n"
+		"The simulation to run\n"
+		"\n"
+		"real_data: \n"
+		"The real data\n"
+		"\n"
+		"weight: \n"
+		"Weight of dataset in chi2 calculations\n"
+		"\n"
+		"adjust_detector_to_data: \n"
+		"Detector axes will be adjusted to real data axes, if true \n"
+		"\n"
+		""},
+	 { (char *)"delete_FitObject", _wrap_delete_FitObject, METH_VARARGS, (char *)"\n"
+		"delete_FitObject(FitObject self)\n"
+		"\n"
+		"FitObject::~FitObject()\n"
+		"\n"
+		""},
+	 { (char *)"FitObject_realData", _wrap_FitObject_realData, METH_VARARGS, (char *)"\n"
+		"FitObject_realData(FitObject self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > & FitObject::realData() const\n"
+		"\n"
+		"Returns real (experimental) data. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_simulationData", _wrap_FitObject_simulationData, METH_VARARGS, (char *)"\n"
+		"FitObject_simulationData(FitObject self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > & FitObject::simulationData() const\n"
+		"\n"
+		"Returns simulated data. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_chiSquaredMap", _wrap_FitObject_chiSquaredMap, METH_VARARGS, (char *)"\n"
+		"FitObject_chiSquaredMap(FitObject self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > & FitObject::chiSquaredMap() const\n"
+		"\n"
+		"Returns chi2 map. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_simulation", _wrap_FitObject_simulation, METH_VARARGS, (char *)"\n"
+		"FitObject_simulation(FitObject self) -> GISASSimulation\n"
+		"\n"
+		"const GISASSimulation & FitObject::simulation() const\n"
+		"\n"
+		"Returns simulation. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_weight", _wrap_FitObject_weight, METH_VARARGS, (char *)"\n"
+		"FitObject_weight(FitObject self) -> double\n"
+		"\n"
+		"double FitObject::weight() const\n"
+		"\n"
+		"Returns weight of data set in chi2 calculations. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_numberOfFitElements", _wrap_FitObject_numberOfFitElements, METH_VARARGS, (char *)"\n"
+		"FitObject_numberOfFitElements(FitObject self) -> size_t\n"
+		"\n"
+		"size_t FitObject::numberOfFitElements() const\n"
+		"\n"
+		"Returns the size of the data. It is equal to the number of non-masked detector channels which will participate in chi2 calculations. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_prepareFitElements", _wrap_FitObject_prepareFitElements, METH_VARARGS, (char *)"\n"
+		"prepareFitElements(std::vector< FitElement,std::allocator< FitElement > > & fit_elements, double weight, IIntensityNormalizer normalizer=None)\n"
+		"FitObject_prepareFitElements(FitObject self, std::vector< FitElement,std::allocator< FitElement > > & fit_elements, double weight)\n"
+		"\n"
+		"void FitObject::prepareFitElements(std::vector< FitElement > &fit_elements, double weight, IIntensityNormalizer *normalizer=0)\n"
+		"\n"
+		"Runs simulation and put results (the real and simulated intensities) into external vector. Masked channels will be excluded from the vector. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_transferToChi2Map", _wrap_FitObject_transferToChi2Map, METH_VARARGS, (char *)"\n"
+		"FitObject_transferToChi2Map(FitObject self, std::vector< FitElement,std::allocator< FitElement > >::const_iterator first, std::vector< FitElement,std::allocator< FitElement > >::const_iterator last)\n"
+		"\n"
+		"void FitObject::transferToChi2Map(std::vector< FitElement >::const_iterator first, std::vector< FitElement >::const_iterator last) const\n"
+		"\n"
+		"Updates ChiSquared map from external vector and returns const reference to it. Used from Python in FitSuiteDrawObserver. \n"
+		"\n"
+		""},
+	 { (char *)"FitObject_swigregister", FitObject_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitOptions", _wrap_new_FitOptions, METH_VARARGS, (char *)"new_FitOptions() -> FitOptions"},
+	 { (char *)"delete_FitOptions", _wrap_delete_FitOptions, METH_VARARGS, (char *)"delete_FitOptions(FitOptions self)"},
+	 { (char *)"FitOptions_derivEpsilon", _wrap_FitOptions_derivEpsilon, METH_VARARGS, (char *)"FitOptions_derivEpsilon(FitOptions self) -> double"},
+	 { (char *)"FitOptions_setDerivEpsilon", _wrap_FitOptions_setDerivEpsilon, METH_VARARGS, (char *)"FitOptions_setDerivEpsilon(FitOptions self, double deriv_epsilon)"},
+	 { (char *)"FitOptions_stepFactor", _wrap_FitOptions_stepFactor, METH_VARARGS, (char *)"FitOptions_stepFactor(FitOptions self) -> double"},
+	 { (char *)"FitOptions_setStepFactor", _wrap_FitOptions_setStepFactor, METH_VARARGS, (char *)"FitOptions_setStepFactor(FitOptions self, double step_factor)"},
+	 { (char *)"FitOptions_swigregister", FitOptions_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitParameterLinked", _wrap_new_FitParameterLinked, METH_VARARGS, (char *)"\n"
+		"FitParameterLinked()\n"
+		"FitParameterLinked(std::string const & name, double value, AttLimits lim, double step=0.0)\n"
+		"FitParameterLinked(std::string const & name, double value, AttLimits lim)\n"
+		"new_FitParameterLinked(std::string const & name, double value) -> FitParameterLinked\n"
+		"\n"
+		"FitParameterLinked::FitParameterLinked(const std::string &name, double value, const AttLimits &lim=AttLimits::limitless(), double step=0.0)\n"
+		"\n"
+		""},
+	 { (char *)"delete_FitParameterLinked", _wrap_delete_FitParameterLinked, METH_VARARGS, (char *)"\n"
+		"delete_FitParameterLinked(FitParameterLinked self)\n"
+		"\n"
+		"FitParameterLinked::~FitParameterLinked() final\n"
+		"\n"
+		""},
+	 { (char *)"FitParameterLinked_clone", _wrap_FitParameterLinked_clone, METH_VARARGS, (char *)"\n"
+		"FitParameterLinked_clone(FitParameterLinked self) -> FitParameterLinked\n"
+		"\n"
+		"FitParameterLinked * FitParameterLinked::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterLinked_setValue", _wrap_FitParameterLinked_setValue, METH_VARARGS, (char *)"\n"
+		"FitParameterLinked_setValue(FitParameterLinked self, double value)\n"
+		"\n"
+		"void FitParameterLinked::setValue(double value) final\n"
+		"\n"
+		"Sets given value for all bound parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterLinked_addParameter", _wrap_FitParameterLinked_addParameter, METH_VARARGS, (char *)"\n"
+		"FitParameterLinked_addParameter(FitParameterLinked self, RealParameter par)\n"
+		"\n"
+		"void FitParameterLinked::addParameter(RealParameter *par)\n"
+		"\n"
+		"Adds real parameter to the collection. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterLinked_addMatchedParametersFromPool", _wrap_FitParameterLinked_addMatchedParametersFromPool, METH_VARARGS, (char *)"\n"
+		"addMatchedParametersFromPool(ParameterPool pool, std::string const & wildcard)\n"
+		"FitParameterLinked_addMatchedParametersFromPool(FitParameterLinked self, ParameterPool pool)\n"
+		"\n"
+		"void FitParameterLinked::addMatchedParametersFromPool(const ParameterPool *pool, const std::string &wildcard=std::string())\n"
+		"\n"
+		"Adds parameters from pool which match given wildcard. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterLinked_swigregister", FitParameterLinked_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitSuite", _wrap_new_FitSuite, METH_VARARGS, (char *)"\n"
+		"new_FitSuite() -> FitSuite\n"
+		"\n"
+		"FitSuite::FitSuite(const FitSuite &)=delete\n"
+		"\n"
+		""},
+	 { (char *)"delete_FitSuite", _wrap_delete_FitSuite, METH_VARARGS, (char *)"\n"
+		"delete_FitSuite(FitSuite self)\n"
+		"\n"
+		"FitSuite::~FitSuite()\n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_addSimulationAndRealData", _wrap_FitSuite_addSimulationAndRealData, METH_VARARGS, (char *)"\n"
+		"addSimulationAndRealData(GISASSimulation simulation, IntensityData real_data, double weight=1)\n"
+		"addSimulationAndRealData(GISASSimulation simulation, IntensityData real_data)\n"
+		"addSimulationAndRealData(GISASSimulation simulation, IHistogram real_data, double weight=1)\n"
+		"addSimulationAndRealData(GISASSimulation simulation, IHistogram real_data)\n"
+		"addSimulationAndRealData(GISASSimulation simulation, vdouble2d_t real_data, double weight=1)\n"
+		"FitSuite_addSimulationAndRealData(FitSuite self, GISASSimulation simulation, vdouble2d_t real_data)\n"
+		"\n"
+		"void FitSuite::addSimulationAndRealData(const GISASSimulation &simulation, const IHistogram &real_data, double weight=1)\n"
+		"\n"
+		"Assigns pair of (simulation, real data) for fitting. More than one pair can be added. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_addFitParameter", _wrap_FitSuite_addFitParameter, METH_VARARGS, (char *)"\n"
+		"addFitParameter(std::string const & name, double value, AttLimits limits, double step=0.0) -> FitParameterLinked\n"
+		"addFitParameter(std::string const & name, double value, AttLimits limits) -> FitParameterLinked\n"
+		"FitSuite_addFitParameter(FitSuite self, std::string const & name, double value) -> FitParameterLinked\n"
+		"\n"
+		"FitParameterLinked * FitSuite::addFitParameter(const std::string &name, double value, const AttLimits &limits=AttLimits::limitless(), double step=0.0)\n"
+		"\n"
+		"Adds fit parameter\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"name: \n"
+		"The name of fit parameter\n"
+		"\n"
+		"value: \n"
+		"Parameter's starting value\n"
+		"\n"
+		"limits: \n"
+		"Limits attribute\n"
+		"\n"
+		"step: \n"
+		"Initial parameter's step (some minimizers don't use it) \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_setChiSquaredModule", _wrap_FitSuite_setChiSquaredModule, METH_VARARGS, (char *)"\n"
+		"FitSuite_setChiSquaredModule(FitSuite self, IChiSquaredModule chi2_module)\n"
+		"\n"
+		"void FitSuite::setChiSquaredModule(const IChiSquaredModule &chi2_module)\n"
+		"\n"
+		"Replaces default  ChiSquaredModule with new one. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_addFitStrategy", _wrap_FitSuite_addFitStrategy, METH_VARARGS, (char *)"\n"
+		"FitSuite_addFitStrategy(FitSuite self, IFitStrategy strategy)\n"
+		"\n"
+		"void FitSuite::addFitStrategy(const IFitStrategy &strategy)\n"
+		"\n"
+		"Adds fit strategy. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_setMinimizer", _wrap_FitSuite_setMinimizer, METH_VARARGS, (char *)"\n"
+		"setMinimizer(std::string const & minimizer_name, std::string const & algorithm_name, std::string const & minimizer_options)\n"
+		"setMinimizer(std::string const & minimizer_name, std::string const & algorithm_name)\n"
+		"setMinimizer(std::string const & minimizer_name)\n"
+		"FitSuite_setMinimizer(FitSuite self, IMinimizer * minimizer)\n"
+		"\n"
+		"void FitSuite::setMinimizer(IMinimizer *minimizer)\n"
+		"\n"
+		"Sets minimizer. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_minimizer", _wrap_FitSuite_minimizer, METH_VARARGS, (char *)"\n"
+		"FitSuite_minimizer(FitSuite self) -> IMinimizer const *\n"
+		"\n"
+		"const IMinimizer * FitSuite::minimizer() const\n"
+		"\n"
+		"Returns minimizer. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_initPrint", _wrap_FitSuite_initPrint, METH_VARARGS, (char *)"\n"
+		"FitSuite_initPrint(FitSuite self, int print_every_nth)\n"
+		"\n"
+		"void FitSuite::initPrint(int print_every_nth)\n"
+		"\n"
+		"Initializes printing to standard output during the fitting. Prints also the summary when completed.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"print_every_nth: \n"
+		"Print every n'th iteration \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_runFit", _wrap_FitSuite_runFit, METH_VARARGS, (char *)"\n"
+		"FitSuite_runFit(FitSuite self)\n"
+		"\n"
+		"void FitSuite::runFit()\n"
+		"\n"
+		"main method to run the fitting \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_numberOfFitObjects", _wrap_FitSuite_numberOfFitObjects, METH_VARARGS, (char *)"\n"
+		"FitSuite_numberOfFitObjects(FitSuite self) -> int\n"
+		"\n"
+		"int FitSuite::numberOfFitObjects() const\n"
+		"\n"
+		"Returns number of fit objects, where fit object stands for (real, simulated) pair. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_getRealData", _wrap_FitSuite_getRealData, METH_VARARGS, (char *)"\n"
+		"getRealData(size_t i_item=0) -> IHistogram\n"
+		"FitSuite_getRealData(FitSuite self) -> IHistogram\n"
+		"\n"
+		"IHistogram * FitSuite::getRealData(size_t i_item=0) const\n"
+		"\n"
+		"returns real data histogram\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"i_item: \n"
+		"The index of fit object \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_getSimulationData", _wrap_FitSuite_getSimulationData, METH_VARARGS, (char *)"\n"
+		"getSimulationData(size_t i_item=0) -> IHistogram\n"
+		"FitSuite_getSimulationData(FitSuite self) -> IHistogram\n"
+		"\n"
+		"IHistogram * FitSuite::getSimulationData(size_t i_item=0) const\n"
+		"\n"
+		"returns simulated data histogram\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"i_item: \n"
+		"The index of fit object \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_getChiSquaredMap", _wrap_FitSuite_getChiSquaredMap, METH_VARARGS, (char *)"\n"
+		"getChiSquaredMap(size_t i_item=0) -> IHistogram\n"
+		"FitSuite_getChiSquaredMap(FitSuite self) -> IHistogram\n"
+		"\n"
+		"IHistogram * FitSuite::getChiSquaredMap(size_t i_item=0) const\n"
+		"\n"
+		"returns chi2 histogram calculated for (real, simulated) data pair\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"i_item: \n"
+		"The index of fit object \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_fitObjects", _wrap_FitSuite_fitObjects, METH_VARARGS, (char *)"\n"
+		"FitSuite_fitObjects(FitSuite self) -> FitSuiteObjects\n"
+		"\n"
+		"FitSuiteObjects * FitSuite::fitObjects()\n"
+		"\n"
+		"returns  FitObject (pair of simulation/real data) \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_fitParameters", _wrap_FitSuite_fitParameters, METH_VARARGS, (char *)"\n"
+		"FitSuite_fitParameters(FitSuite self) -> FitParameterSet *\n"
+		"\n"
+		"FitParameterSet * FitSuite::fitParameters()\n"
+		"\n"
+		"Returns reference to fit parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_fitStrategies", _wrap_FitSuite_fitStrategies, METH_VARARGS, (char *)"\n"
+		"FitSuite_fitStrategies(FitSuite self) -> FitSuiteStrategies *\n"
+		"\n"
+		"FitSuiteStrategies * FitSuite::fitStrategies()\n"
+		"\n"
+		"Returns reference to fit parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_isLastIteration", _wrap_FitSuite_isLastIteration, METH_VARARGS, (char *)"\n"
+		"FitSuite_isLastIteration(FitSuite self) -> bool\n"
+		"\n"
+		"bool FitSuite::isLastIteration() const\n"
+		"\n"
+		"if the last iteration is done (used by observers to print summary) \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_numberOfIterations", _wrap_FitSuite_numberOfIterations, METH_VARARGS, (char *)"\n"
+		"FitSuite_numberOfIterations(FitSuite self) -> size_t\n"
+		"\n"
+		"size_t FitSuite::numberOfIterations() const\n"
+		"\n"
+		"Returns current number of minimization function calls. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_currentStrategyIndex", _wrap_FitSuite_currentStrategyIndex, METH_VARARGS, (char *)"\n"
+		"FitSuite_currentStrategyIndex(FitSuite self) -> size_t\n"
+		"\n"
+		"size_t FitSuite::currentStrategyIndex() const\n"
+		"\n"
+		"Returns the number of current strategy. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_printResults", _wrap_FitSuite_printResults, METH_VARARGS, (char *)"\n"
+		"FitSuite_printResults(FitSuite self)\n"
+		"\n"
+		"void FitSuite::printResults() const\n"
+		"\n"
+		"Prints results of the minimization to the standard output. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_reportResults", _wrap_FitSuite_reportResults, METH_VARARGS, (char *)"\n"
+		"FitSuite_reportResults(FitSuite self) -> std::string\n"
+		"\n"
+		"std::string FitSuite::reportResults() const\n"
+		"\n"
+		"Reports results of minimization in the form of multi-line string. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_getChi2", _wrap_FitSuite_getChi2, METH_VARARGS, (char *)"\n"
+		"FitSuite_getChi2(FitSuite self) -> double\n"
+		"\n"
+		"double FitSuite::getChi2() const\n"
+		"\n"
+		"Returns minimum chi squared value found. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_interruptFitting", _wrap_FitSuite_interruptFitting, METH_VARARGS, (char *)"\n"
+		"FitSuite_interruptFitting(FitSuite self)\n"
+		"\n"
+		"void FitSuite::interruptFitting()\n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_resetInterrupt", _wrap_FitSuite_resetInterrupt, METH_VARARGS, (char *)"\n"
+		"FitSuite_resetInterrupt(FitSuite self)\n"
+		"\n"
+		"void FitSuite::resetInterrupt()\n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_isInterrupted", _wrap_FitSuite_isInterrupted, METH_VARARGS, (char *)"\n"
+		"FitSuite_isInterrupted(FitSuite self) -> bool\n"
+		"\n"
+		"bool FitSuite::isInterrupted()\n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_getRealOutputData", _wrap_FitSuite_getRealOutputData, METH_VARARGS, (char *)"\n"
+		"getRealOutputData(size_t i_item=0) -> IntensityData\n"
+		"FitSuite_getRealOutputData(FitSuite self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > * FitSuite::getRealOutputData(size_t i_item=0) const \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_getSimulationOutputData", _wrap_FitSuite_getSimulationOutputData, METH_VARARGS, (char *)"\n"
+		"getSimulationOutputData(size_t i_item=0) -> IntensityData\n"
+		"FitSuite_getSimulationOutputData(FitSuite self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > * FitSuite::getSimulationOutputData(size_t i_item=0) const \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_getChiSquaredOutputData", _wrap_FitSuite_getChiSquaredOutputData, METH_VARARGS, (char *)"\n"
+		"getChiSquaredOutputData(size_t i_item=0) -> IntensityData\n"
+		"FitSuite_getChiSquaredOutputData(FitSuite self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > * FitSuite::getChiSquaredOutputData(size_t i_item=0) const \n"
+		"\n"
+		""},
+	 { (char *)"FitSuite_swigregister", FitSuite_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitSuiteObjects", _wrap_new_FitSuiteObjects, METH_VARARGS, (char *)"\n"
+		"new_FitSuiteObjects() -> FitSuiteObjects\n"
+		"\n"
+		"FitSuiteObjects::FitSuiteObjects()\n"
+		"\n"
+		""},
+	 { (char *)"delete_FitSuiteObjects", _wrap_delete_FitSuiteObjects, METH_VARARGS, (char *)"\n"
+		"delete_FitSuiteObjects(FitSuiteObjects self)\n"
+		"\n"
+		"FitSuiteObjects::~FitSuiteObjects()\n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_add", _wrap_FitSuiteObjects_add, METH_VARARGS, (char *)"\n"
+		"add(GISASSimulation simulation, IntensityData real_data, double weight=1.0)\n"
+		"FitSuiteObjects_add(FitSuiteObjects self, GISASSimulation simulation, IntensityData real_data)\n"
+		"\n"
+		"void FitSuiteObjects::add(const GISASSimulation &simulation, const OutputData< double > &real_data, double weight=1.0)\n"
+		"\n"
+		"Adds to kit pair of (simulation, real data) for consecutive simulation. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_getNumberOfFitObjects", _wrap_FitSuiteObjects_getNumberOfFitObjects, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_getNumberOfFitObjects(FitSuiteObjects self) -> size_t\n"
+		"\n"
+		"size_t FitSuiteObjects::getNumberOfFitObjects() const\n"
+		"\n"
+		"Returns number of fit objects (simulation/real data pairs) \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_getSizeOfDataSet", _wrap_FitSuiteObjects_getSizeOfDataSet, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_getSizeOfDataSet(FitSuiteObjects self) -> size_t\n"
+		"\n"
+		"size_t FitSuiteObjects::getSizeOfDataSet() const\n"
+		"\n"
+		"Returns total number of data points (number of all non-masked channels in all fit objects)\n"
+		"\n"
+		"Returns total number of data points. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_setChiSquaredModule", _wrap_FitSuiteObjects_setChiSquaredModule, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_setChiSquaredModule(FitSuiteObjects self, IChiSquaredModule chi2_module)\n"
+		"\n"
+		"void FitSuiteObjects::setChiSquaredModule(const IChiSquaredModule &chi2_module)\n"
+		"\n"
+		"Replaces default  ChiSquaredModule with new one. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_getRealData", _wrap_FitSuiteObjects_getRealData, METH_VARARGS, (char *)"\n"
+		"getRealData(size_t i_item=0) -> IntensityData\n"
+		"FitSuiteObjects_getRealData(FitSuiteObjects self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > & FitSuiteObjects::getRealData(size_t i_item=0) const\n"
+		"\n"
+		"Returns real data from corresponding  FitObject\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"i_item: \n"
+		"Index of  FitObject\n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_getSimulationData", _wrap_FitSuiteObjects_getSimulationData, METH_VARARGS, (char *)"\n"
+		"getSimulationData(size_t i_item=0) -> IntensityData\n"
+		"FitSuiteObjects_getSimulationData(FitSuiteObjects self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > & FitSuiteObjects::getSimulationData(size_t i_item=0) const\n"
+		"\n"
+		"Returns simulated data from corresponding  FitObject\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"i_item: \n"
+		"Index of  FitObject\n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_getChiSquaredMap", _wrap_FitSuiteObjects_getChiSquaredMap, METH_VARARGS, (char *)"\n"
+		"getChiSquaredMap(size_t i_item=0) -> IntensityData\n"
+		"FitSuiteObjects_getChiSquaredMap(FitSuiteObjects self) -> IntensityData\n"
+		"\n"
+		"const OutputData< double > & FitSuiteObjects::getChiSquaredMap(size_t i_item=0) const\n"
+		"\n"
+		"Returns new chi-squared map from corresponding  FitObject\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"i_item: \n"
+		"Index of  FitObject\n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_runSimulations", _wrap_FitSuiteObjects_runSimulations, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_runSimulations(FitSuiteObjects self)\n"
+		"\n"
+		"void FitSuiteObjects::runSimulations()\n"
+		"\n"
+		"run all simulation defined in fit pairs\n"
+		"\n"
+		"loop through all defined simulations and run them \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_getChiSquaredValue", _wrap_FitSuiteObjects_getChiSquaredValue, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_getChiSquaredValue(FitSuiteObjects self) -> double\n"
+		"\n"
+		"double FitSuiteObjects::getChiSquaredValue() const\n"
+		"\n"
+		"Returns chi2 calculated over whole dataset. \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_getResidualValue", _wrap_FitSuiteObjects_getResidualValue, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_getResidualValue(FitSuiteObjects self, size_t global_index) -> double\n"
+		"\n"
+		"double FitSuiteObjects::getResidualValue(size_t global_index)\n"
+		"\n"
+		"Returns residuals for single data element\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"global_index: \n"
+		"index accross all element in  FitElement vector \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_setNfreeParameters", _wrap_FitSuiteObjects_setNfreeParameters, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_setNfreeParameters(FitSuiteObjects self, int nfree_parameters)\n"
+		"\n"
+		"void FitSuiteObjects::setNfreeParameters(int nfree_parameters)\n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_clear", _wrap_FitSuiteObjects_clear, METH_VARARGS, (char *)"\n"
+		"FitSuiteObjects_clear(FitSuiteObjects self)\n"
+		"\n"
+		"void FitSuiteObjects::clear()\n"
+		"\n"
+		"clear all data \n"
+		"\n"
+		""},
+	 { (char *)"FitSuiteObjects_swigregister", FitSuiteObjects_swigregister, METH_VARARGS, NULL},
+	 { (char *)"StandardNormal", _wrap_StandardNormal, METH_VARARGS, (char *)"\n"
+		"StandardNormal(double x) -> double\n"
+		"\n"
+		"double MathFunctions::StandardNormal(double x)\n"
+		"\n"
+		""},
+	 { (char *)"Gaussian", _wrap_Gaussian, METH_VARARGS, (char *)"\n"
+		"Gaussian(double x, double average, double std_dev) -> double\n"
+		"\n"
+		"double MathFunctions::Gaussian(double x, double average, double std_dev)\n"
+		"\n"
+		""},
+	 { (char *)"IntegratedGaussian", _wrap_IntegratedGaussian, METH_VARARGS, (char *)"\n"
+		"IntegratedGaussian(double x, double average, double std_dev) -> double\n"
+		"\n"
+		"double MathFunctions::IntegratedGaussian(double x, double average, double std_dev)\n"
+		"\n"
+		""},
+	 { (char *)"cot", _wrap_cot, METH_VARARGS, (char *)"\n"
+		"cot(double x) -> double\n"
+		"\n"
+		"double MathFunctions::cot(double x)\n"
+		"\n"
+		"cotangent function:  $cot(x)\\\\equiv1/tan(x)$\n"
+		"\n"
+		""},
+	 { (char *)"Si", _wrap_Si, METH_VARARGS, (char *)"\n"
+		"Si(double x) -> double\n"
+		"\n"
+		"double MathFunctions::Si(double x)\n"
+		"\n"
+		"Sine integral function:  $Si(x)\\\\equiv\\\\int_0^x du \\\\sin(u)/u$. \n"
+		"\n"
+		""},
+	 { (char *)"sinc", _wrap_sinc, METH_VARARGS, (char *)"\n"
+		"sinc(double x) -> double\n"
+		"sinc(complex_t const z) -> complex_t\n"
+		"\n"
+		"complex_t MathFunctions::sinc(const complex_t z)\n"
+		"\n"
+		"Complex sinc function:  $sinc(x)\\\\equiv\\\\sin(x)/x$. \n"
+		"\n"
+		""},
+	 { (char *)"tanhc", _wrap_tanhc, METH_VARARGS, (char *)"\n"
+		"tanhc(complex_t const z) -> complex_t\n"
+		"\n"
+		"complex_t MathFunctions::tanhc(const complex_t z)\n"
+		"\n"
+		"Complex tanhc function:  $tanhc(x)\\\\equiv\\\\tanh(x)/x$. \n"
+		"\n"
+		""},
+	 { (char *)"Laue", _wrap_Laue, METH_VARARGS, (char *)"\n"
+		"Laue(complex_t const z, size_t N) -> complex_t\n"
+		"\n"
+		"complex_t MathFunctions::Laue(const complex_t z, size_t N)\n"
+		"\n"
+		""},
+	 { (char *)"Bessel_J0", _wrap_Bessel_J0, METH_VARARGS, (char *)"\n"
+		"Bessel_J0(double x) -> double\n"
+		"Bessel_J0(complex_t const z) -> complex_t\n"
+		"\n"
+		"complex_t MathFunctions::Bessel_J0(const complex_t z)\n"
+		"\n"
+		"Complex Bessel function of the first kind and order 0. \n"
+		"\n"
+		""},
+	 { (char *)"Bessel_J1", _wrap_Bessel_J1, METH_VARARGS, (char *)"\n"
+		"Bessel_J1(double x) -> double\n"
+		"Bessel_J1(complex_t const z) -> complex_t\n"
+		"\n"
+		"complex_t MathFunctions::Bessel_J1(const complex_t z)\n"
+		"\n"
+		"Complex Bessel function of the first kind and order 1. \n"
+		"\n"
+		""},
+	 { (char *)"Bessel_J1c", _wrap_Bessel_J1c, METH_VARARGS, (char *)"\n"
+		"Bessel_J1c(double x) -> double\n"
+		"Bessel_J1c(complex_t const z) -> complex_t\n"
+		"\n"
+		"complex_t MathFunctions::Bessel_J1c(const complex_t z)\n"
+		"\n"
+		"Complex Bessel function Bessel_J1(x)/x. \n"
+		"\n"
+		""},
+	 { (char *)"FORWARD_FFT_swigconstant", FORWARD_FFT_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"BACKWARD_FFT_swigconstant", BACKWARD_FFT_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"FastFourierTransform", _wrap_FastFourierTransform, METH_VARARGS, (char *)"\n"
+		"FastFourierTransform(vector_complex_t data, MathFunctions::EFFTDirection tcase) -> vector_complex_t\n"
+		"FastFourierTransform(vdouble1d_t data, MathFunctions::EFFTDirection tcase) -> vector_complex_t\n"
+		"\n"
+		"std::vector< complex_t > MathFunctions::FastFourierTransform(const std::vector< double > &data, EFFTDirection tcase)\n"
+		"\n"
+		"simple (and unoptimized) wrapper function for the discrete fast Fourier transformation library (fftw3); transforms real to complex \n"
+		"\n"
+		""},
+	 { (char *)"ConvolveFFT", _wrap_ConvolveFFT, METH_VARARGS, (char *)"\n"
+		"ConvolveFFT(vdouble1d_t signal, vdouble1d_t resfunc) -> vector_complex_t\n"
+		"\n"
+		"std::vector< complex_t > MathFunctions::ConvolveFFT(const std::vector< double > &signal, const std::vector< double > &resfunc)\n"
+		"\n"
+		"convolution of two real vectors of equal size \n"
+		"\n"
+		""},
+	 { (char *)"GenerateUniformRandom", _wrap_GenerateUniformRandom, METH_VARARGS, (char *)"\n"
+		"GenerateUniformRandom() -> double\n"
+		"\n"
+		"double MathFunctions::GenerateUniformRandom()\n"
+		"\n"
+		""},
+	 { (char *)"GenerateStandardNormalRandom", _wrap_GenerateStandardNormalRandom, METH_VARARGS, (char *)"\n"
+		"GenerateStandardNormalRandom() -> double\n"
+		"\n"
+		"double MathFunctions::GenerateStandardNormalRandom()\n"
+		"\n"
+		""},
+	 { (char *)"GenerateNormalRandom", _wrap_GenerateNormalRandom, METH_VARARGS, (char *)"\n"
+		"GenerateNormalRandom(double average, double std_dev) -> double\n"
+		"\n"
+		"double MathFunctions::GenerateNormalRandom(double average, double std_dev)\n"
+		"\n"
+		""},
+	 { (char *)"new_AdjustMinimizerStrategy", _wrap_new_AdjustMinimizerStrategy, METH_VARARGS, (char *)"\n"
+		"AdjustMinimizerStrategy()\n"
+		"AdjustMinimizerStrategy(std::string const & minimizerName, std::string const & algorithmName, std::string const & optionString)\n"
+		"AdjustMinimizerStrategy(std::string const & minimizerName, std::string const & algorithmName)\n"
+		"new_AdjustMinimizerStrategy(std::string const & minimizerName) -> AdjustMinimizerStrategy\n"
+		"\n"
+		"AdjustMinimizerStrategy::AdjustMinimizerStrategy(const std::string &minimizerName, const std::string &algorithmName=std::string(), const std::string &optionString=std::string())\n"
+		"\n"
+		""},
+	 { (char *)"AdjustMinimizerStrategy_clone", _wrap_AdjustMinimizerStrategy_clone, METH_VARARGS, (char *)"\n"
+		"AdjustMinimizerStrategy_clone(AdjustMinimizerStrategy self) -> AdjustMinimizerStrategy\n"
+		"\n"
+		"AdjustMinimizerStrategy * AdjustMinimizerStrategy::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"AdjustMinimizerStrategy_setMinimizer", _wrap_AdjustMinimizerStrategy_setMinimizer, METH_VARARGS, (char *)"\n"
+		"setMinimizer(std::string const & minimizerName, std::string const & algorithmName, std::string const & optionString)\n"
+		"setMinimizer(std::string const & minimizerName, std::string const & algorithmName)\n"
+		"AdjustMinimizerStrategy_setMinimizer(AdjustMinimizerStrategy self, std::string const & minimizerName)\n"
+		"\n"
+		"void AdjustMinimizerStrategy::setMinimizer(const std::string &minimizerName, const std::string &algorithmName=std::string(), const std::string &optionString=std::string())\n"
+		"\n"
+		""},
+	 { (char *)"AdjustMinimizerStrategy_execute", _wrap_AdjustMinimizerStrategy_execute, METH_VARARGS, (char *)"\n"
+		"AdjustMinimizerStrategy_execute(AdjustMinimizerStrategy self)\n"
+		"\n"
+		"void AdjustMinimizerStrategy::execute()\n"
+		"\n"
+		""},
+	 { (char *)"delete_AdjustMinimizerStrategy", _wrap_delete_AdjustMinimizerStrategy, METH_VARARGS, (char *)"delete_AdjustMinimizerStrategy(AdjustMinimizerStrategy self)"},
+	 { (char *)"AdjustMinimizerStrategy_swigregister", AdjustMinimizerStrategy_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IMultiLayerBuilder", _wrap_new_IMultiLayerBuilder, METH_VARARGS, (char *)"\n"
+		"new_IMultiLayerBuilder(PyObject * arg2) -> IMultiLayerBuilder\n"
+		"\n"
+		"IMultiLayerBuilder::IMultiLayerBuilder()\n"
+		"\n"
+		""},
+	 { (char *)"delete_IMultiLayerBuilder", _wrap_delete_IMultiLayerBuilder, METH_VARARGS, (char *)"\n"
+		"delete_IMultiLayerBuilder(IMultiLayerBuilder self)\n"
+		"\n"
+		"virtual IMultiLayerBuilder::~IMultiLayerBuilder()\n"
+		"\n"
+		""},
+	 { (char *)"IMultiLayerBuilder_buildSample", _wrap_IMultiLayerBuilder_buildSample, METH_VARARGS, (char *)"\n"
+		"IMultiLayerBuilder_buildSample(IMultiLayerBuilder self) -> MultiLayer\n"
+		"\n"
+		"virtual MultiLayer* IMultiLayerBuilder::buildSample() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IMultiLayerBuilder_set_subtest", _wrap_IMultiLayerBuilder_set_subtest, METH_VARARGS, (char *)"\n"
+		"IMultiLayerBuilder_set_subtest(IMultiLayerBuilder self, IParameterized subtest_item)\n"
+		"\n"
+		"void IMultiLayerBuilder::set_subtest(const IParameterized *subtest_item)\n"
+		"\n"
+		""},
+	 { (char *)"IMultiLayerBuilder_m_subtest_item_set", _wrap_IMultiLayerBuilder_m_subtest_item_set, METH_VARARGS, (char *)"IMultiLayerBuilder_m_subtest_item_set(IMultiLayerBuilder self, IParameterized m_subtest_item)"},
+	 { (char *)"IMultiLayerBuilder_m_subtest_item_get", _wrap_IMultiLayerBuilder_m_subtest_item_get, METH_VARARGS, (char *)"IMultiLayerBuilder_m_subtest_item_get(IMultiLayerBuilder self) -> IParameterized"},
+	 { (char *)"IMultiLayerBuilder_getFormFactor", _wrap_IMultiLayerBuilder_getFormFactor, METH_VARARGS, (char *)"\n"
+		"IMultiLayerBuilder_getFormFactor(IMultiLayerBuilder self) -> IFormFactor\n"
+		"\n"
+		"const IFormFactor * IMultiLayerBuilder::getFormFactor() const \n"
+		"\n"
+		""},
+	 { (char *)"IMultiLayerBuilder_getFTDistribution2D", _wrap_IMultiLayerBuilder_getFTDistribution2D, METH_VARARGS, (char *)"\n"
+		"IMultiLayerBuilder_getFTDistribution2D(IMultiLayerBuilder self) -> IFTDistribution2D\n"
+		"\n"
+		"const IFTDistribution2D * IMultiLayerBuilder::getFTDistribution2D() const \n"
+		"\n"
+		""},
+	 { (char *)"IMultiLayerBuilder_registerParameter", _wrap_IMultiLayerBuilder_registerParameter, METH_VARARGS, (char *)"IMultiLayerBuilder_registerParameter(IMultiLayerBuilder self, std::string const & name, int64_t parpointer) -> RealParameter"},
+	 { (char *)"IMultiLayerBuilder_setParameterValue", _wrap_IMultiLayerBuilder_setParameterValue, METH_VARARGS, (char *)"IMultiLayerBuilder_setParameterValue(IMultiLayerBuilder self, std::string const & name, double value)"},
+	 { (char *)"IMultiLayerBuilder_isPythonBuilder", _wrap_IMultiLayerBuilder_isPythonBuilder, METH_VARARGS, (char *)"\n"
+		"IMultiLayerBuilder_isPythonBuilder() -> bool\n"
+		"\n"
+		"bool IMultiLayerBuilder::isPythonBuilder() const \n"
+		"\n"
+		""},
+	 { (char *)"disown_IMultiLayerBuilder", _wrap_disown_IMultiLayerBuilder, METH_VARARGS, NULL},
+	 { (char *)"IMultiLayerBuilder_onChange", _wrap_IMultiLayerBuilder_onChange, METH_VARARGS, (char *)"IMultiLayerBuilder_onChange(IMultiLayerBuilder self)"},
+	 { (char *)"IMultiLayerBuilder__print", _wrap_IMultiLayerBuilder__print, METH_VARARGS, (char *)"IMultiLayerBuilder__print(IMultiLayerBuilder self, std::ostream & ostr)"},
+	 { (char *)"IMultiLayerBuilder_swigregister", IMultiLayerBuilder_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ISampleVisitor", _wrap_new_ISampleVisitor, METH_VARARGS, (char *)"\n"
+		"new_ISampleVisitor() -> ISampleVisitor\n"
+		"\n"
+		"ISampleVisitor::ISampleVisitor()\n"
+		"\n"
+		""},
+	 { (char *)"delete_ISampleVisitor", _wrap_delete_ISampleVisitor, METH_VARARGS, (char *)"\n"
+		"delete_ISampleVisitor(ISampleVisitor self)\n"
+		"\n"
+		"virtual ISampleVisitor::~ISampleVisitor()\n"
+		"\n"
+		""},
+	 { (char *)"ISampleVisitor_visit", _wrap_ISampleVisitor_visit, METH_VARARGS, (char *)"\n"
+		"visit(ISample arg2)\n"
+		"visit(ICompositeSample arg2)\n"
+		"visit(IClusteredParticles arg2)\n"
+		"visit(Crystal arg2)\n"
+		"visit(ILayout arg2)\n"
+		"visit(ParticleLayout arg2)\n"
+		"visit(Layer arg2)\n"
+		"visit(LayerInterface const * arg2)\n"
+		"visit(MultiLayer arg2)\n"
+		"visit(IAbstractParticle arg2)\n"
+		"visit(IParticle arg2)\n"
+		"visit(Particle arg2)\n"
+		"visit(ParticleDistribution arg2)\n"
+		"visit(ParticleComposition arg2)\n"
+		"visit(MesoCrystal arg2)\n"
+		"visit(ParticleCoreShell arg2)\n"
+		"visit(IFormFactor arg2)\n"
+		"visit(IFormFactorBorn arg2)\n"
+		"visit(IFormFactorDecorator arg2)\n"
+		"visit(FormFactorAnisoPyramid arg2)\n"
+		"visit(FormFactorBox arg2)\n"
+		"visit(FormFactorCone arg2)\n"
+		"visit(FormFactorCone6 arg2)\n"
+		"visit(FormFactorCuboctahedron arg2)\n"
+		"visit(FormFactorCrystal arg2)\n"
+		"visit(FormFactorCylinder arg2)\n"
+		"visit(FormFactorDodecahedron arg2)\n"
+		"visit(FormFactorEllipsoidalCylinder arg2)\n"
+		"visit(FormFactorFullSphere arg2)\n"
+		"visit(FormFactorFullSpheroid arg2)\n"
+		"visit(FormFactorGauss arg2)\n"
+		"visit(FormFactorHemiEllipsoid arg2)\n"
+		"visit(FormFactorIcosahedron arg2)\n"
+		"visit(FormFactorLongBoxGauss arg2)\n"
+		"visit(FormFactorLongBoxLorentz arg2)\n"
+		"visit(FormFactorLorentz arg2)\n"
+		"visit(FormFactorPrism3 arg2)\n"
+		"visit(FormFactorPrism6 arg2)\n"
+		"visit(FormFactorPyramid arg2)\n"
+		"visit(FormFactorRipple1 arg2)\n"
+		"visit(FormFactorRipple2 arg2)\n"
+		"visit(FormFactorSphereGaussianRadius arg2)\n"
+		"visit(FormFactorSphereLogNormalRadius arg2)\n"
+		"visit(FormFactorTetrahedron arg2)\n"
+		"visit(FormFactorTrivial arg2)\n"
+		"visit(FormFactorTruncatedCube arg2)\n"
+		"visit(FormFactorTruncatedSphere arg2)\n"
+		"visit(FormFactorTruncatedSpheroid arg2)\n"
+		"visit(FormFactorWeighted arg2)\n"
+		"visit(FormFactorDecoratorDebyeWaller arg2)\n"
+		"visit(FormFactorDecoratorFactor const * arg2)\n"
+		"visit(FormFactorDecoratorMaterial const * arg2)\n"
+		"visit(FormFactorDecoratorPositionFactor const * arg2)\n"
+		"visit(FormFactorDecoratorRotation const * arg2)\n"
+		"visit(IInterferenceFunction arg2)\n"
+		"visit(InterferenceFunction1DLattice arg2)\n"
+		"visit(InterferenceFunctionRadialParaCrystal arg2)\n"
+		"visit(InterferenceFunction2DLattice arg2)\n"
+		"visit(InterferenceFunction2DParaCrystal arg2)\n"
+		"visit(InterferenceFunctionNone arg2)\n"
+		"visit(IRoughness arg2)\n"
+		"visit(LayerRoughness arg2)\n"
+		"visit(IRotation arg2)\n"
+		"visit(RotationX arg2)\n"
+		"visit(RotationY arg2)\n"
+		"visit(RotationZ arg2)\n"
+		"ISampleVisitor_visit(ISampleVisitor self, RotationEuler arg3)\n"
+		"\n"
+		"void ISampleVisitor::visit(const RotationEuler *)\n"
+		"\n"
+		""},
+	 { (char *)"ISampleVisitor_visitEnter", _wrap_ISampleVisitor_visitEnter, METH_VARARGS, (char *)"\n"
+		"ISampleVisitor_visitEnter(ISampleVisitor self, ICompositeSample arg3) -> bool\n"
+		"\n"
+		"bool ISampleVisitor::visitEnter(const ICompositeSample *)\n"
+		"\n"
+		""},
+	 { (char *)"ISampleVisitor_visitLeave", _wrap_ISampleVisitor_visitLeave, METH_VARARGS, (char *)"\n"
+		"ISampleVisitor_visitLeave(ISampleVisitor self, ICompositeSample arg3) -> bool\n"
+		"\n"
+		"bool ISampleVisitor::visitLeave(const ICompositeSample *)\n"
+		"\n"
+		""},
+	 { (char *)"ISampleVisitor_getLevel", _wrap_ISampleVisitor_getLevel, METH_VARARGS, (char *)"\n"
+		"ISampleVisitor_getLevel(ISampleVisitor self) -> int\n"
+		"\n"
+		"int ISampleVisitor::getLevel() const\n"
+		"\n"
+		"return current level of the visitor in the composite hierarchy \n"
+		"\n"
+		""},
+	 { (char *)"ISampleVisitor_setLevel", _wrap_ISampleVisitor_setLevel, METH_VARARGS, (char *)"\n"
+		"ISampleVisitor_setLevel(ISampleVisitor self, int level)\n"
+		"\n"
+		"void ISampleVisitor::setLevel(int level)\n"
+		"\n"
+		"set current level of the visitor in the composite hierarchy \n"
+		"\n"
+		""},
+	 { (char *)"ISampleVisitor_swigregister", ISampleVisitor_swigregister, METH_VARARGS, NULL},
+	 { (char *)"VisitSampleTreePreorder", _wrap_VisitSampleTreePreorder, METH_VARARGS, (char *)"\n"
+		"VisitSampleTreePreorder(ISample sample, ISampleVisitor visitor)\n"
+		"\n"
+		"BA_CORE_API_ void VisitSampleTreePreorder(const ISample &sample, ISampleVisitor &visitor)\n"
+		"\n"
+		""},
+	 { (char *)"VisitSampleTreePostorder", _wrap_VisitSampleTreePostorder, METH_VARARGS, (char *)"\n"
+		"VisitSampleTreePostorder(ISample sample, ISampleVisitor visitor)\n"
+		"\n"
+		"BA_CORE_API_ void VisitSampleTreePostorder(const ISample &sample, ISampleVisitor &visitor)\n"
+		"\n"
+		""},
+	 { (char *)"delete_ICompositeSample", _wrap_delete_ICompositeSample, METH_VARARGS, (char *)"\n"
+		"delete_ICompositeSample(ICompositeSample self)\n"
+		"\n"
+		"ICompositeSample::~ICompositeSample()\n"
+		"\n"
+		""},
+	 { (char *)"ICompositeSample_clone", _wrap_ICompositeSample_clone, METH_VARARGS, (char *)"\n"
+		"ICompositeSample_clone(ICompositeSample self) -> ICompositeSample\n"
+		"\n"
+		"virtual ICompositeSample* ICompositeSample::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"ICompositeSample_accept", _wrap_ICompositeSample_accept, METH_VARARGS, (char *)"\n"
+		"ICompositeSample_accept(ICompositeSample self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void ICompositeSample::accept(ISampleVisitor *visitor) const =0\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"ICompositeSample_registerChild", _wrap_ICompositeSample_registerChild, METH_VARARGS, (char *)"\n"
+		"ICompositeSample_registerChild(ICompositeSample self, ISample sample)\n"
+		"\n"
+		"void ICompositeSample::registerChild(ISample *sample)\n"
+		"\n"
+		"Registers child in the container. \n"
+		"\n"
+		""},
+	 { (char *)"ICompositeSample_deregisterChild", _wrap_ICompositeSample_deregisterChild, METH_VARARGS, (char *)"\n"
+		"ICompositeSample_deregisterChild(ICompositeSample self, ISample sample)\n"
+		"\n"
+		"void ICompositeSample::deregisterChild(ISample *sample)\n"
+		"\n"
+		"Removes registered child from the container.\n"
+		"\n"
+		"remove registered child from the container \n"
+		"\n"
+		""},
+	 { (char *)"ICompositeSample_getChildren", _wrap_ICompositeSample_getChildren, METH_VARARGS, (char *)"\n"
+		"ICompositeSample_getChildren(ICompositeSample self) -> swig_dummy_type_const_isample_vector\n"
+		"\n"
+		"std::vector< const ISample * > ICompositeSample::getChildren() const final\n"
+		"\n"
+		"Returns a vector of children (const). \n"
+		"\n"
+		""},
+	 { (char *)"ICompositeSample_size", _wrap_ICompositeSample_size, METH_VARARGS, (char *)"\n"
+		"ICompositeSample_size(ICompositeSample self) -> size_t\n"
+		"\n"
+		"size_t ICompositeSample::size() const final\n"
+		"\n"
+		"Returns number of children. \n"
+		"\n"
+		""},
+	 { (char *)"ICompositeSample_swigregister", ICompositeSample_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IClusteredParticles_clone", _wrap_IClusteredParticles_clone, METH_VARARGS, (char *)"\n"
+		"IClusteredParticles_clone(IClusteredParticles self) -> IClusteredParticles\n"
+		"\n"
+		"virtual IClusteredParticles* IClusteredParticles::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IClusteredParticles_cloneInvertB", _wrap_IClusteredParticles_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"IClusteredParticles_cloneInvertB(IClusteredParticles self) -> IClusteredParticles\n"
+		"\n"
+		"virtual IClusteredParticles* IClusteredParticles::cloneInvertB() const =0\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"IClusteredParticles_accept", _wrap_IClusteredParticles_accept, METH_VARARGS, (char *)"\n"
+		"IClusteredParticles_accept(IClusteredParticles self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void IClusteredParticles::accept(ISampleVisitor *visitor) const =0\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"IClusteredParticles_setAmbientMaterial", _wrap_IClusteredParticles_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"IClusteredParticles_setAmbientMaterial(IClusteredParticles self, IMaterial material)\n"
+		"\n"
+		"virtual void IClusteredParticles::setAmbientMaterial(const IMaterial &material)=0\n"
+		"\n"
+		""},
+	 { (char *)"IClusteredParticles_getAmbientMaterial", _wrap_IClusteredParticles_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"IClusteredParticles_getAmbientMaterial(IClusteredParticles self) -> IMaterial\n"
+		"\n"
+		"virtual const IMaterial* IClusteredParticles::getAmbientMaterial() const =0\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"IClusteredParticles_createTotalFormFactor", _wrap_IClusteredParticles_createTotalFormFactor, METH_VARARGS, (char *)"\n"
+		"IClusteredParticles_createTotalFormFactor(IClusteredParticles self, IFormFactor arg3, IRotation arg4, kvector_t arg5) -> IFormFactor\n"
+		"\n"
+		"virtual IFormFactor* IClusteredParticles::createTotalFormFactor(const IFormFactor &, const IRotation *, const kvector_t &) const =0\n"
+		"\n"
+		"Creates a total form factor for the mesocrystal with a specific shape and content The bulk content of the mesocrystal is encapsulated by the  IClusteredParticles object itself \n"
+		"\n"
+		""},
+	 { (char *)"delete_IClusteredParticles", _wrap_delete_IClusteredParticles, METH_VARARGS, (char *)"delete_IClusteredParticles(IClusteredParticles self)"},
+	 { (char *)"IClusteredParticles_swigregister", IClusteredParticles_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Crystal", _wrap_new_Crystal, METH_VARARGS, (char *)"\n"
+		"new_Crystal(ParticleComposition lattice_basis, Lattice lattice) -> Crystal\n"
+		"\n"
+		"Crystal::Crystal(const ParticleComposition &lattice_basis, const Lattice &lattice)\n"
+		"\n"
+		""},
+	 { (char *)"delete_Crystal", _wrap_delete_Crystal, METH_VARARGS, (char *)"\n"
+		"delete_Crystal(Crystal self)\n"
+		"\n"
+		"Crystal::~Crystal()\n"
+		"\n"
+		""},
+	 { (char *)"Crystal_clone", _wrap_Crystal_clone, METH_VARARGS, (char *)"\n"
+		"Crystal_clone(Crystal self) -> Crystal\n"
+		"\n"
+		"Crystal * Crystal::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"Crystal_cloneInvertB", _wrap_Crystal_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"Crystal_cloneInvertB(Crystal self) -> Crystal\n"
+		"\n"
+		"Crystal * Crystal::cloneInvertB() const final\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"Crystal_accept", _wrap_Crystal_accept, METH_VARARGS, (char *)"\n"
+		"Crystal_accept(Crystal self, ISampleVisitor visitor)\n"
+		"\n"
+		"void Crystal::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"Crystal_setAmbientMaterial", _wrap_Crystal_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"Crystal_setAmbientMaterial(Crystal self, IMaterial material)\n"
+		"\n"
+		"void Crystal::setAmbientMaterial(const IMaterial &material) final\n"
+		"\n"
+		""},
+	 { (char *)"Crystal_getAmbientMaterial", _wrap_Crystal_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"Crystal_getAmbientMaterial(Crystal self) -> IMaterial\n"
+		"\n"
+		"const IMaterial * Crystal::getAmbientMaterial() const final\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"Crystal_createTotalFormFactor", _wrap_Crystal_createTotalFormFactor, METH_VARARGS, (char *)"\n"
+		"Crystal_createTotalFormFactor(Crystal self, IFormFactor meso_crystal_form_factor, IRotation p_rotation, kvector_t translation) -> IFormFactor\n"
+		"\n"
+		"IFormFactor * Crystal::createTotalFormFactor(const IFormFactor &meso_crystal_form_factor, const IRotation *p_rotation, const kvector_t &translation) const\n"
+		"\n"
+		"Creates a total form factor for the mesocrystal with a specific shape and content The bulk content of the mesocrystal is encapsulated by the  IClusteredParticles object itself \n"
+		"\n"
+		""},
+	 { (char *)"Crystal_getLatticeBasis", _wrap_Crystal_getLatticeBasis, METH_VARARGS, (char *)"\n"
+		"Crystal_getLatticeBasis(Crystal self) -> ParticleComposition\n"
+		"\n"
+		"const ParticleComposition* Crystal::getLatticeBasis() const \n"
+		"\n"
+		""},
+	 { (char *)"Crystal_setDWFactor", _wrap_Crystal_setDWFactor, METH_VARARGS, (char *)"\n"
+		"Crystal_setDWFactor(Crystal self, double dw_factor)\n"
+		"\n"
+		"void Crystal::setDWFactor(double dw_factor)\n"
+		"\n"
+		""},
+	 { (char *)"Crystal_swigregister", Crystal_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IDistribution1D", _wrap_delete_IDistribution1D, METH_VARARGS, (char *)"\n"
+		"delete_IDistribution1D(IDistribution1D self)\n"
+		"\n"
+		"virtual IDistribution1D::~IDistribution1D()\n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_clone", _wrap_IDistribution1D_clone, METH_VARARGS, (char *)"\n"
+		"IDistribution1D_clone(IDistribution1D self) -> IDistribution1D\n"
+		"\n"
+		"IDistribution1D * IDistribution1D::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_probabilityDensity", _wrap_IDistribution1D_probabilityDensity, METH_VARARGS, (char *)"\n"
+		"IDistribution1D_probabilityDensity(IDistribution1D self, double x) -> double\n"
+		"\n"
+		"virtual double IDistribution1D::probabilityDensity(double x) const =0\n"
+		"\n"
+		"get the probability density for value x \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_getMean", _wrap_IDistribution1D_getMean, METH_VARARGS, (char *)"\n"
+		"IDistribution1D_getMean(IDistribution1D self) -> double\n"
+		"\n"
+		"virtual double IDistribution1D::getMean() const =0\n"
+		"\n"
+		"get the mean of the distribution \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_generateSamples", _wrap_IDistribution1D_generateSamples, METH_VARARGS, (char *)"\n"
+		"generateSamples(size_t nbr_samples, double sigma_factor=0.0, RealLimits limits) -> std::vector< ParameterSample,std::allocator< ParameterSample > >\n"
+		"generateSamples(size_t nbr_samples, double sigma_factor=0.0) -> std::vector< ParameterSample,std::allocator< ParameterSample > >\n"
+		"generateSamples(size_t nbr_samples) -> std::vector< ParameterSample,std::allocator< ParameterSample > >\n"
+		"IDistribution1D_generateSamples(IDistribution1D self, size_t nbr_samples, double xmin, double xmax) -> std::vector< ParameterSample,std::allocator< ParameterSample > >\n"
+		"\n"
+		"std::vector< ParameterSample > IDistribution1D::generateSamples(size_t nbr_samples, double xmin, double xmax) const\n"
+		"\n"
+		"generate list of sampled values with their weight within given xmin, xmax \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_generateValueList", _wrap_IDistribution1D_generateValueList, METH_VARARGS, (char *)"\n"
+		"generateValueList(size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t\n"
+		"IDistribution1D_generateValueList(IDistribution1D self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t\n"
+		"\n"
+		"virtual std::vector<double> IDistribution1D::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const =0\n"
+		"\n"
+		"generate list of sample values\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"nbr_samples: \n"
+		"number of values to generate\n"
+		"\n"
+		"sigma_factor: \n"
+		"parameter to derive min,max range for sample values\n"
+		"\n"
+		"limits:\n"
+		"\n"
+		"vector of generated values \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_generateValues", _wrap_IDistribution1D_generateValues, METH_VARARGS, (char *)"\n"
+		"IDistribution1D_generateValues(IDistribution1D self, size_t nbr_samples, double xmin, double xmax) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > IDistribution1D::generateValues(size_t nbr_samples, double xmin, double xmax) const\n"
+		"\n"
+		"Interface.\n"
+		"\n"
+		"generate list of sample values\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"nbr_samples: \n"
+		"number of values to generate\n"
+		"\n"
+		"xmin: \n"
+		"xmax: \n"
+		"start and end value of the generated samples\n"
+		"\n"
+		"vector of generated values \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_getMeanSample", _wrap_IDistribution1D_getMeanSample, METH_VARARGS, (char *)"\n"
+		"IDistribution1D_getMeanSample(IDistribution1D self) -> ParameterSample\n"
+		"\n"
+		"ParameterSample IDistribution1D::getMeanSample() const\n"
+		"\n"
+		"generate a single sample containing the mean value and weight 1 \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_isDelta", _wrap_IDistribution1D_isDelta, METH_VARARGS, (char *)"\n"
+		"IDistribution1D_isDelta(IDistribution1D self) -> bool\n"
+		"\n"
+		"virtual bool IDistribution1D::isDelta() const =0\n"
+		"\n"
+		"signals that the distribution is in the limit case of a delta distribution \n"
+		"\n"
+		""},
+	 { (char *)"IDistribution1D_swigregister", IDistribution1D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_DistributionGate", _wrap_new_DistributionGate, METH_VARARGS, (char *)"\n"
+		"DistributionGate()\n"
+		"new_DistributionGate(double min, double max) -> DistributionGate\n"
+		"\n"
+		"DistributionGate::DistributionGate(double min, double max)\n"
+		"\n"
+		""},
+	 { (char *)"delete_DistributionGate", _wrap_delete_DistributionGate, METH_VARARGS, (char *)"\n"
+		"delete_DistributionGate(DistributionGate self)\n"
+		"\n"
+		"virtual DistributionGate::~DistributionGate()\n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_clone", _wrap_DistributionGate_clone, METH_VARARGS, (char *)"\n"
+		"DistributionGate_clone(DistributionGate self) -> DistributionGate\n"
+		"\n"
+		"virtual DistributionGate* DistributionGate::clone() const\n"
+		"\n"
+		"clone method \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_probabilityDensity", _wrap_DistributionGate_probabilityDensity, METH_VARARGS, (char *)"\n"
+		"DistributionGate_probabilityDensity(DistributionGate self, double x) -> double\n"
+		"\n"
+		"double DistributionGate::probabilityDensity(double x) const\n"
+		"\n"
+		"get the probability density for value x \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_getMean", _wrap_DistributionGate_getMean, METH_VARARGS, (char *)"\n"
+		"DistributionGate_getMean(DistributionGate self) -> double\n"
+		"\n"
+		"virtual double DistributionGate::getMean() const\n"
+		"\n"
+		"get the mean of the distribution \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_getMin", _wrap_DistributionGate_getMin, METH_VARARGS, (char *)"\n"
+		"DistributionGate_getMin(DistributionGate self) -> double\n"
+		"\n"
+		"double DistributionGate::getMin() const\n"
+		"\n"
+		"Returns the minimum value of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_getMax", _wrap_DistributionGate_getMax, METH_VARARGS, (char *)"\n"
+		"DistributionGate_getMax(DistributionGate self) -> double\n"
+		"\n"
+		"double DistributionGate::getMax() const\n"
+		"\n"
+		"Returns the maximum value of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_generateValueList", _wrap_DistributionGate_generateValueList, METH_VARARGS, (char *)"\n"
+		"generateValueList(size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t\n"
+		"DistributionGate_generateValueList(DistributionGate self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > DistributionGate::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const\n"
+		"\n"
+		"Returns list of sample values. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_isDelta", _wrap_DistributionGate_isDelta, METH_VARARGS, (char *)"\n"
+		"DistributionGate_isDelta(DistributionGate self) -> bool\n"
+		"\n"
+		"bool DistributionGate::isDelta() const\n"
+		"\n"
+		"signals that the distribution is in the limit case of a delta distribution \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGate_swigregister", DistributionGate_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_DistributionLorentz", _wrap_new_DistributionLorentz, METH_VARARGS, (char *)"\n"
+		"DistributionLorentz()\n"
+		"new_DistributionLorentz(double mean, double hwhm) -> DistributionLorentz\n"
+		"\n"
+		"DistributionLorentz::DistributionLorentz(double mean, double hwhm)\n"
+		"\n"
+		""},
+	 { (char *)"delete_DistributionLorentz", _wrap_delete_DistributionLorentz, METH_VARARGS, (char *)"\n"
+		"delete_DistributionLorentz(DistributionLorentz self)\n"
+		"\n"
+		"virtual DistributionLorentz::~DistributionLorentz()\n"
+		"\n"
+		""},
+	 { (char *)"DistributionLorentz_clone", _wrap_DistributionLorentz_clone, METH_VARARGS, (char *)"\n"
+		"DistributionLorentz_clone(DistributionLorentz self) -> DistributionLorentz\n"
+		"\n"
+		"virtual DistributionLorentz* DistributionLorentz::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLorentz_probabilityDensity", _wrap_DistributionLorentz_probabilityDensity, METH_VARARGS, (char *)"\n"
+		"DistributionLorentz_probabilityDensity(DistributionLorentz self, double x) -> double\n"
+		"\n"
+		"double DistributionLorentz::probabilityDensity(double x) const\n"
+		"\n"
+		"get the probability density for value x \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLorentz_getMean", _wrap_DistributionLorentz_getMean, METH_VARARGS, (char *)"\n"
+		"DistributionLorentz_getMean(DistributionLorentz self) -> double\n"
+		"\n"
+		"virtual double DistributionLorentz::getMean() const\n"
+		"\n"
+		"Returns the mean of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLorentz_getHWHM", _wrap_DistributionLorentz_getHWHM, METH_VARARGS, (char *)"\n"
+		"DistributionLorentz_getHWHM(DistributionLorentz self) -> double\n"
+		"\n"
+		"double DistributionLorentz::getHWHM() const\n"
+		"\n"
+		"Returns the half width at half maximum. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLorentz_generateValueList", _wrap_DistributionLorentz_generateValueList, METH_VARARGS, (char *)"\n"
+		"generateValueList(size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t\n"
+		"DistributionLorentz_generateValueList(DistributionLorentz self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > DistributionLorentz::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const\n"
+		"\n"
+		"generate list of sample values \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLorentz_isDelta", _wrap_DistributionLorentz_isDelta, METH_VARARGS, (char *)"\n"
+		"DistributionLorentz_isDelta(DistributionLorentz self) -> bool\n"
+		"\n"
+		"bool DistributionLorentz::isDelta() const\n"
+		"\n"
+		"signals that the distribution is in the limit case of a delta distribution \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLorentz_swigregister", DistributionLorentz_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_DistributionGaussian", _wrap_new_DistributionGaussian, METH_VARARGS, (char *)"\n"
+		"DistributionGaussian()\n"
+		"new_DistributionGaussian(double mean, double std_dev) -> DistributionGaussian\n"
+		"\n"
+		"DistributionGaussian::DistributionGaussian(double mean, double std_dev)\n"
+		"\n"
+		""},
+	 { (char *)"delete_DistributionGaussian", _wrap_delete_DistributionGaussian, METH_VARARGS, (char *)"\n"
+		"delete_DistributionGaussian(DistributionGaussian self)\n"
+		"\n"
+		"virtual DistributionGaussian::~DistributionGaussian()\n"
+		"\n"
+		""},
+	 { (char *)"DistributionGaussian_clone", _wrap_DistributionGaussian_clone, METH_VARARGS, (char *)"\n"
+		"DistributionGaussian_clone(DistributionGaussian self) -> DistributionGaussian\n"
+		"\n"
+		"virtual DistributionGaussian* DistributionGaussian::clone() const\n"
+		"\n"
+		"clone method \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGaussian_probabilityDensity", _wrap_DistributionGaussian_probabilityDensity, METH_VARARGS, (char *)"\n"
+		"DistributionGaussian_probabilityDensity(DistributionGaussian self, double x) -> double\n"
+		"\n"
+		"double DistributionGaussian::probabilityDensity(double x) const\n"
+		"\n"
+		"get the probability density for value x \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGaussian_getMean", _wrap_DistributionGaussian_getMean, METH_VARARGS, (char *)"\n"
+		"DistributionGaussian_getMean(DistributionGaussian self) -> double\n"
+		"\n"
+		"virtual double DistributionGaussian::getMean() const\n"
+		"\n"
+		"Returns the mean of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGaussian_getStdDev", _wrap_DistributionGaussian_getStdDev, METH_VARARGS, (char *)"\n"
+		"DistributionGaussian_getStdDev(DistributionGaussian self) -> double\n"
+		"\n"
+		"double DistributionGaussian::getStdDev() const\n"
+		"\n"
+		"Returns the standard deviation. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGaussian_generateValueList", _wrap_DistributionGaussian_generateValueList, METH_VARARGS, (char *)"\n"
+		"generateValueList(size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t\n"
+		"DistributionGaussian_generateValueList(DistributionGaussian self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > DistributionGaussian::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const\n"
+		"\n"
+		"generate list of sample values \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGaussian_isDelta", _wrap_DistributionGaussian_isDelta, METH_VARARGS, (char *)"\n"
+		"DistributionGaussian_isDelta(DistributionGaussian self) -> bool\n"
+		"\n"
+		"bool DistributionGaussian::isDelta() const\n"
+		"\n"
+		"signals that the distribution is in the limit case of a delta distribution \n"
+		"\n"
+		""},
+	 { (char *)"DistributionGaussian_swigregister", DistributionGaussian_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_DistributionLogNormal", _wrap_new_DistributionLogNormal, METH_VARARGS, (char *)"\n"
+		"DistributionLogNormal(double scale_param)\n"
+		"new_DistributionLogNormal(double median, double scale_param) -> DistributionLogNormal\n"
+		"\n"
+		"DistributionLogNormal::DistributionLogNormal(double median, double scale_param)\n"
+		"\n"
+		""},
+	 { (char *)"delete_DistributionLogNormal", _wrap_delete_DistributionLogNormal, METH_VARARGS, (char *)"\n"
+		"delete_DistributionLogNormal(DistributionLogNormal self)\n"
+		"\n"
+		"virtual DistributionLogNormal::~DistributionLogNormal()\n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_clone", _wrap_DistributionLogNormal_clone, METH_VARARGS, (char *)"\n"
+		"DistributionLogNormal_clone(DistributionLogNormal self) -> DistributionLogNormal\n"
+		"\n"
+		"virtual DistributionLogNormal* DistributionLogNormal::clone() const\n"
+		"\n"
+		"clone method \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_probabilityDensity", _wrap_DistributionLogNormal_probabilityDensity, METH_VARARGS, (char *)"\n"
+		"DistributionLogNormal_probabilityDensity(DistributionLogNormal self, double x) -> double\n"
+		"\n"
+		"double DistributionLogNormal::probabilityDensity(double x) const\n"
+		"\n"
+		"get the probability density for value x \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_getMean", _wrap_DistributionLogNormal_getMean, METH_VARARGS, (char *)"\n"
+		"DistributionLogNormal_getMean(DistributionLogNormal self) -> double\n"
+		"\n"
+		"double DistributionLogNormal::getMean() const\n"
+		"\n"
+		"get the mean of the distribution \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_getMedian", _wrap_DistributionLogNormal_getMedian, METH_VARARGS, (char *)"\n"
+		"DistributionLogNormal_getMedian(DistributionLogNormal self) -> double\n"
+		"\n"
+		"double DistributionLogNormal::getMedian() const\n"
+		"\n"
+		"Returns the median of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_getScalePar", _wrap_DistributionLogNormal_getScalePar, METH_VARARGS, (char *)"\n"
+		"DistributionLogNormal_getScalePar(DistributionLogNormal self) -> double\n"
+		"\n"
+		"double DistributionLogNormal::getScalePar() const\n"
+		"\n"
+		"Returns the scale parameter of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_generateValueList", _wrap_DistributionLogNormal_generateValueList, METH_VARARGS, (char *)"\n"
+		"generateValueList(size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t\n"
+		"DistributionLogNormal_generateValueList(DistributionLogNormal self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > DistributionLogNormal::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const\n"
+		"\n"
+		"generate list of sample values \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_isDelta", _wrap_DistributionLogNormal_isDelta, METH_VARARGS, (char *)"\n"
+		"DistributionLogNormal_isDelta(DistributionLogNormal self) -> bool\n"
+		"\n"
+		"bool DistributionLogNormal::isDelta() const\n"
+		"\n"
+		"signals that the distribution is in the limit case of a delta distribution \n"
+		"\n"
+		""},
+	 { (char *)"DistributionLogNormal_swigregister", DistributionLogNormal_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_DistributionCosine", _wrap_new_DistributionCosine, METH_VARARGS, (char *)"\n"
+		"DistributionCosine()\n"
+		"new_DistributionCosine(double mean, double sigma) -> DistributionCosine\n"
+		"\n"
+		"DistributionCosine::DistributionCosine(double mean, double sigma)\n"
+		"\n"
+		""},
+	 { (char *)"delete_DistributionCosine", _wrap_delete_DistributionCosine, METH_VARARGS, (char *)"\n"
+		"delete_DistributionCosine(DistributionCosine self)\n"
+		"\n"
+		"virtual DistributionCosine::~DistributionCosine()\n"
+		"\n"
+		""},
+	 { (char *)"DistributionCosine_clone", _wrap_DistributionCosine_clone, METH_VARARGS, (char *)"\n"
+		"DistributionCosine_clone(DistributionCosine self) -> DistributionCosine\n"
+		"\n"
+		"virtual DistributionCosine* DistributionCosine::clone() const\n"
+		"\n"
+		"clone method \n"
+		"\n"
+		""},
+	 { (char *)"DistributionCosine_probabilityDensity", _wrap_DistributionCosine_probabilityDensity, METH_VARARGS, (char *)"\n"
+		"DistributionCosine_probabilityDensity(DistributionCosine self, double x) -> double\n"
+		"\n"
+		"double DistributionCosine::probabilityDensity(double x) const\n"
+		"\n"
+		"get the probability density for value x \n"
+		"\n"
+		""},
+	 { (char *)"DistributionCosine_getMean", _wrap_DistributionCosine_getMean, METH_VARARGS, (char *)"\n"
+		"DistributionCosine_getMean(DistributionCosine self) -> double\n"
+		"\n"
+		"virtual double DistributionCosine::getMean() const\n"
+		"\n"
+		"Returns the mean of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionCosine_getSigma", _wrap_DistributionCosine_getSigma, METH_VARARGS, (char *)"\n"
+		"DistributionCosine_getSigma(DistributionCosine self) -> double\n"
+		"\n"
+		"double DistributionCosine::getSigma() const\n"
+		"\n"
+		"Returns the sigma parameter of the distribution. \n"
+		"\n"
+		""},
+	 { (char *)"DistributionCosine_generateValueList", _wrap_DistributionCosine_generateValueList, METH_VARARGS, (char *)"\n"
+		"generateValueList(size_t nbr_samples, double sigma_factor, RealLimits limits) -> vdouble1d_t\n"
+		"DistributionCosine_generateValueList(DistributionCosine self, size_t nbr_samples, double sigma_factor) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > DistributionCosine::generateValueList(size_t nbr_samples, double sigma_factor, const RealLimits &limits=RealLimits()) const\n"
+		"\n"
+		"generate list of sample values \n"
+		"\n"
+		""},
+	 { (char *)"DistributionCosine_isDelta", _wrap_DistributionCosine_isDelta, METH_VARARGS, (char *)"\n"
+		"DistributionCosine_isDelta(DistributionCosine self) -> bool\n"
+		"\n"
+		"bool DistributionCosine::isDelta() const\n"
+		"\n"
+		"signals that the distribution is in the limit case of a delta distribution \n"
+		"\n"
+		""},
+	 { (char *)"DistributionCosine_swigregister", DistributionCosine_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_DetectorMask", _wrap_new_DetectorMask, METH_VARARGS, (char *)"\n"
+		"DetectorMask()\n"
+		"new_DetectorMask(DetectorMask other) -> DetectorMask\n"
+		"\n"
+		"DetectorMask::DetectorMask(const DetectorMask &other)\n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_addMask", _wrap_DetectorMask_addMask, METH_VARARGS, (char *)"\n"
+		"DetectorMask_addMask(DetectorMask self, IShape2D shape, bool mask_value)\n"
+		"\n"
+		"void DetectorMask::addMask(const Geometry::IShape2D &shape, bool mask_value)\n"
+		"\n"
+		"Add mask to the stack of detector masks. The value \"true\" means that the area will be excluded from the analysis.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"shape: \n"
+		"The shape of mask.\n"
+		"\n"
+		"mask_value: \n"
+		"The value of mask \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_initMaskData", _wrap_DetectorMask_initMaskData, METH_VARARGS, (char *)"\n"
+		"initMaskData(IDetector2D detector)\n"
+		"DetectorMask_initMaskData(DetectorMask self, IntensityData data)\n"
+		"\n"
+		"void DetectorMask::initMaskData(const OutputData< double > &data)\n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_isMasked", _wrap_DetectorMask_isMasked, METH_VARARGS, (char *)"\n"
+		"DetectorMask_isMasked(DetectorMask self, size_t index) -> bool\n"
+		"\n"
+		"bool DetectorMask::isMasked(size_t index) const \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_getMaskData", _wrap_DetectorMask_getMaskData, METH_VARARGS, (char *)"\n"
+		"DetectorMask_getMaskData(DetectorMask self) -> OutputData< bool > const *\n"
+		"\n"
+		"const OutputData<bool>* DetectorMask::getMaskData() const \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_createHistogram", _wrap_DetectorMask_createHistogram, METH_VARARGS, (char *)"\n"
+		"DetectorMask_createHistogram(DetectorMask self) -> Histogram2D\n"
+		"\n"
+		"Histogram2D * DetectorMask::createHistogram() const \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_removeMasks", _wrap_DetectorMask_removeMasks, METH_VARARGS, (char *)"\n"
+		"DetectorMask_removeMasks(DetectorMask self)\n"
+		"\n"
+		"void DetectorMask::removeMasks()\n"
+		"\n"
+		"remove all masks and return object to initial state \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_hasMasks", _wrap_DetectorMask_hasMasks, METH_VARARGS, (char *)"\n"
+		"DetectorMask_hasMasks(DetectorMask self) -> bool\n"
+		"\n"
+		"bool DetectorMask::hasMasks() const\n"
+		"\n"
+		"returns true if has masks \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_numberOfMaskedChannels", _wrap_DetectorMask_numberOfMaskedChannels, METH_VARARGS, (char *)"\n"
+		"DetectorMask_numberOfMaskedChannels(DetectorMask self) -> int\n"
+		"\n"
+		"int DetectorMask::numberOfMaskedChannels() const \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_numberOfMasks", _wrap_DetectorMask_numberOfMasks, METH_VARARGS, (char *)"\n"
+		"DetectorMask_numberOfMasks(DetectorMask self) -> size_t\n"
+		"\n"
+		"size_t DetectorMask::numberOfMasks() const \n"
+		"\n"
+		""},
+	 { (char *)"DetectorMask_getMaskShape", _wrap_DetectorMask_getMaskShape, METH_VARARGS, (char *)"\n"
+		"DetectorMask_getMaskShape(DetectorMask self, size_t mask_index, bool & mask_value) -> IShape2D\n"
+		"\n"
+		"const Geometry::IShape2D * DetectorMask::getMaskShape(size_t mask_index, bool &mask_value) const \n"
+		"\n"
+		""},
+	 { (char *)"delete_DetectorMask", _wrap_delete_DetectorMask, METH_VARARGS, (char *)"delete_DetectorMask(DetectorMask self)"},
+	 { (char *)"DetectorMask_swigregister", DetectorMask_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Ellipse", _wrap_new_Ellipse, METH_VARARGS, (char *)"\n"
+		"Ellipse(double xcenter, double ycenter, double xradius, double yradius, double theta=0.0)\n"
+		"new_Ellipse(double xcenter, double ycenter, double xradius, double yradius) -> Ellipse\n"
+		"\n"
+		"Geometry::Ellipse::Ellipse(double xcenter, double ycenter, double xradius, double yradius, double theta=0.0)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"xcenter: \n"
+		"x-coordinate of  Ellipse's center\n"
+		"\n"
+		"ycenter: \n"
+		"y-coordinate of  Ellipse's center\n"
+		"\n"
+		"xradius: \n"
+		"Radius along x-axis\n"
+		"\n"
+		"yradius: \n"
+		"Radius along y-axis\n"
+		"\n"
+		"theta: \n"
+		"Angle of  Ellipse rotation in radians \n"
+		"\n"
+		""},
+	 { (char *)"Ellipse_clone", _wrap_Ellipse_clone, METH_VARARGS, (char *)"\n"
+		"Ellipse_clone(Ellipse self) -> Ellipse\n"
+		"\n"
+		"Ellipse* Geometry::Ellipse::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"Ellipse_contains", _wrap_Ellipse_contains, METH_VARARGS, (char *)"\n"
+		"contains(double x, double y) -> bool\n"
+		"Ellipse_contains(Ellipse self, Bin1D binx, Bin1D biny) -> bool\n"
+		"\n"
+		"bool Geometry::Ellipse::contains(const Bin1D &binx, const Bin1D &biny) const\n"
+		"\n"
+		"Returns true if area defined by two bins is inside or on border of ellipse; more precisely, if mid point of two bins satisfy this condition. \n"
+		"\n"
+		""},
+	 { (char *)"Ellipse_getCenterX", _wrap_Ellipse_getCenterX, METH_VARARGS, (char *)"\n"
+		"Ellipse_getCenterX(Ellipse self) -> double\n"
+		"\n"
+		"double Geometry::Ellipse::getCenterX() const \n"
+		"\n"
+		""},
+	 { (char *)"Ellipse_getCenterY", _wrap_Ellipse_getCenterY, METH_VARARGS, (char *)"\n"
+		"Ellipse_getCenterY(Ellipse self) -> double\n"
+		"\n"
+		"double Geometry::Ellipse::getCenterY() const \n"
+		"\n"
+		""},
+	 { (char *)"Ellipse_getRadiusX", _wrap_Ellipse_getRadiusX, METH_VARARGS, (char *)"\n"
+		"Ellipse_getRadiusX(Ellipse self) -> double\n"
+		"\n"
+		"double Geometry::Ellipse::getRadiusX() const \n"
+		"\n"
+		""},
+	 { (char *)"Ellipse_getRadiusY", _wrap_Ellipse_getRadiusY, METH_VARARGS, (char *)"\n"
+		"Ellipse_getRadiusY(Ellipse self) -> double\n"
+		"\n"
+		"double Geometry::Ellipse::getRadiusY() const \n"
+		"\n"
+		""},
+	 { (char *)"Ellipse_getTheta", _wrap_Ellipse_getTheta, METH_VARARGS, (char *)"\n"
+		"Ellipse_getTheta(Ellipse self) -> double\n"
+		"\n"
+		"double Geometry::Ellipse::getTheta() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_Ellipse", _wrap_delete_Ellipse, METH_VARARGS, (char *)"delete_Ellipse(Ellipse self)"},
+	 { (char *)"Ellipse_swigregister", Ellipse_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IFTDecayFunction1D_clone", _wrap_IFTDecayFunction1D_clone, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction1D_clone(IFTDecayFunction1D self) -> IFTDecayFunction1D\n"
+		"\n"
+		"virtual IFTDecayFunction1D* IFTDecayFunction1D::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction1D_evaluate", _wrap_IFTDecayFunction1D_evaluate, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction1D_evaluate(IFTDecayFunction1D self, double q) -> double\n"
+		"\n"
+		"virtual double IFTDecayFunction1D::evaluate(double q) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction1D_setOmega", _wrap_IFTDecayFunction1D_setOmega, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction1D_setOmega(IFTDecayFunction1D self, double omega)\n"
+		"\n"
+		"void IFTDecayFunction1D::setOmega(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction1D_getOmega", _wrap_IFTDecayFunction1D_getOmega, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction1D_getOmega(IFTDecayFunction1D self) -> double\n"
+		"\n"
+		"double IFTDecayFunction1D::getOmega() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_IFTDecayFunction1D", _wrap_delete_IFTDecayFunction1D, METH_VARARGS, (char *)"delete_IFTDecayFunction1D(IFTDecayFunction1D self)"},
+	 { (char *)"IFTDecayFunction1D_swigregister", IFTDecayFunction1D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDecayFunction1DCauchy", _wrap_new_FTDecayFunction1DCauchy, METH_VARARGS, (char *)"\n"
+		"new_FTDecayFunction1DCauchy(double omega) -> FTDecayFunction1DCauchy\n"
+		"\n"
+		"FTDecayFunction1DCauchy::FTDecayFunction1DCauchy(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DCauchy_clone", _wrap_FTDecayFunction1DCauchy_clone, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DCauchy_clone(FTDecayFunction1DCauchy self) -> FTDecayFunction1DCauchy\n"
+		"\n"
+		"virtual FTDecayFunction1DCauchy* FTDecayFunction1DCauchy::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DCauchy_evaluate", _wrap_FTDecayFunction1DCauchy_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DCauchy_evaluate(FTDecayFunction1DCauchy self, double q) -> double\n"
+		"\n"
+		"double FTDecayFunction1DCauchy::evaluate(double q) const final\n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDecayFunction1DCauchy", _wrap_delete_FTDecayFunction1DCauchy, METH_VARARGS, (char *)"delete_FTDecayFunction1DCauchy(FTDecayFunction1DCauchy self)"},
+	 { (char *)"FTDecayFunction1DCauchy_swigregister", FTDecayFunction1DCauchy_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDecayFunction1DGauss", _wrap_new_FTDecayFunction1DGauss, METH_VARARGS, (char *)"\n"
+		"new_FTDecayFunction1DGauss(double omega) -> FTDecayFunction1DGauss\n"
+		"\n"
+		"FTDecayFunction1DGauss::FTDecayFunction1DGauss(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DGauss_clone", _wrap_FTDecayFunction1DGauss_clone, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DGauss_clone(FTDecayFunction1DGauss self) -> FTDecayFunction1DGauss\n"
+		"\n"
+		"virtual FTDecayFunction1DGauss* FTDecayFunction1DGauss::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DGauss_evaluate", _wrap_FTDecayFunction1DGauss_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DGauss_evaluate(FTDecayFunction1DGauss self, double q) -> double\n"
+		"\n"
+		"double FTDecayFunction1DGauss::evaluate(double q) const final\n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDecayFunction1DGauss", _wrap_delete_FTDecayFunction1DGauss, METH_VARARGS, (char *)"delete_FTDecayFunction1DGauss(FTDecayFunction1DGauss self)"},
+	 { (char *)"FTDecayFunction1DGauss_swigregister", FTDecayFunction1DGauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDecayFunction1DTriangle", _wrap_new_FTDecayFunction1DTriangle, METH_VARARGS, (char *)"\n"
+		"new_FTDecayFunction1DTriangle(double omega) -> FTDecayFunction1DTriangle\n"
+		"\n"
+		"FTDecayFunction1DTriangle::FTDecayFunction1DTriangle(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DTriangle_clone", _wrap_FTDecayFunction1DTriangle_clone, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DTriangle_clone(FTDecayFunction1DTriangle self) -> FTDecayFunction1DTriangle\n"
+		"\n"
+		"virtual FTDecayFunction1DTriangle* FTDecayFunction1DTriangle::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DTriangle_evaluate", _wrap_FTDecayFunction1DTriangle_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DTriangle_evaluate(FTDecayFunction1DTriangle self, double q) -> double\n"
+		"\n"
+		"double FTDecayFunction1DTriangle::evaluate(double q) const final\n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDecayFunction1DTriangle", _wrap_delete_FTDecayFunction1DTriangle, METH_VARARGS, (char *)"delete_FTDecayFunction1DTriangle(FTDecayFunction1DTriangle self)"},
+	 { (char *)"FTDecayFunction1DTriangle_swigregister", FTDecayFunction1DTriangle_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDecayFunction1DVoigt", _wrap_new_FTDecayFunction1DVoigt, METH_VARARGS, (char *)"\n"
+		"new_FTDecayFunction1DVoigt(double omega, double eta) -> FTDecayFunction1DVoigt\n"
+		"\n"
+		"FTDecayFunction1DVoigt::FTDecayFunction1DVoigt(double omega, double eta)\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DVoigt_clone", _wrap_FTDecayFunction1DVoigt_clone, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DVoigt_clone(FTDecayFunction1DVoigt self) -> FTDecayFunction1DVoigt\n"
+		"\n"
+		"virtual FTDecayFunction1DVoigt* FTDecayFunction1DVoigt::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DVoigt_evaluate", _wrap_FTDecayFunction1DVoigt_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DVoigt_evaluate(FTDecayFunction1DVoigt self, double q) -> double\n"
+		"\n"
+		"double FTDecayFunction1DVoigt::evaluate(double q) const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction1DVoigt_getEta", _wrap_FTDecayFunction1DVoigt_getEta, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction1DVoigt_getEta(FTDecayFunction1DVoigt self) -> double\n"
+		"\n"
+		"double FTDecayFunction1DVoigt::getEta() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDecayFunction1DVoigt", _wrap_delete_FTDecayFunction1DVoigt, METH_VARARGS, (char *)"delete_FTDecayFunction1DVoigt(FTDecayFunction1DVoigt self)"},
+	 { (char *)"FTDecayFunction1DVoigt_swigregister", FTDecayFunction1DVoigt_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IFTDecayFunction2D_clone", _wrap_IFTDecayFunction2D_clone, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_clone(IFTDecayFunction2D self) -> IFTDecayFunction2D\n"
+		"\n"
+		"virtual IFTDecayFunction2D* IFTDecayFunction2D::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction2D_setGamma", _wrap_IFTDecayFunction2D_setGamma, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_setGamma(IFTDecayFunction2D self, double gamma)\n"
+		"\n"
+		"void IFTDecayFunction2D::setGamma(double gamma)\n"
+		"\n"
+		"set angle between first lattice vector and X-axis of distribution (both in direct space) \n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction2D_getGamma", _wrap_IFTDecayFunction2D_getGamma, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_getGamma(IFTDecayFunction2D self) -> double\n"
+		"\n"
+		"double IFTDecayFunction2D::getGamma() const\n"
+		"\n"
+		"get angle between first lattice vector and X-axis of distribution (both in direct space) \n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction2D_getDelta", _wrap_IFTDecayFunction2D_getDelta, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_getDelta(IFTDecayFunction2D self) -> double\n"
+		"\n"
+		"double IFTDecayFunction2D::getDelta() const\n"
+		"\n"
+		"get angle between X- and Y-axis of distribution (in direct space) \n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction2D_getDecayLengthX", _wrap_IFTDecayFunction2D_getDecayLengthX, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_getDecayLengthX(IFTDecayFunction2D self) -> double\n"
+		"\n"
+		"double IFTDecayFunction2D::getDecayLengthX() const\n"
+		"\n"
+		"get coherence length in X-direction \n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction2D_getDecayLengthY", _wrap_IFTDecayFunction2D_getDecayLengthY, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_getDecayLengthY(IFTDecayFunction2D self) -> double\n"
+		"\n"
+		"double IFTDecayFunction2D::getDecayLengthY() const\n"
+		"\n"
+		"get coherence length in Y-direction \n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction2D_evaluate", _wrap_IFTDecayFunction2D_evaluate, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_evaluate(IFTDecayFunction2D self, double qx, double qy) -> double\n"
+		"\n"
+		"virtual double IFTDecayFunction2D::evaluate(double qx, double qy) const =0\n"
+		"\n"
+		"evaluate Fourier transformed decay function for q in X,Y coordinates \n"
+		"\n"
+		""},
+	 { (char *)"IFTDecayFunction2D_transformToStarBasis", _wrap_IFTDecayFunction2D_transformToStarBasis, METH_VARARGS, (char *)"\n"
+		"IFTDecayFunction2D_transformToStarBasis(IFTDecayFunction2D self, double qX, double qY, double alpha, double a, double b, double & qa, double & qb)\n"
+		"\n"
+		"void IFTDecayFunction2D::transformToStarBasis(double qX, double qY, double alpha, double a, double b, double &qa, double &qb) const\n"
+		"\n"
+		"transform back to a*, b* basis: \n"
+		"\n"
+		""},
+	 { (char *)"delete_IFTDecayFunction2D", _wrap_delete_IFTDecayFunction2D, METH_VARARGS, (char *)"delete_IFTDecayFunction2D(IFTDecayFunction2D self)"},
+	 { (char *)"IFTDecayFunction2D_swigregister", IFTDecayFunction2D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDecayFunction2DCauchy", _wrap_new_FTDecayFunction2DCauchy, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma=0, double delta)\n"
+		"FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma=0)\n"
+		"new_FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y) -> FTDecayFunction2DCauchy\n"
+		"\n"
+		"FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(double decay_length_x, double decay_length_y, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction2DCauchy_clone", _wrap_FTDecayFunction2DCauchy_clone, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DCauchy_clone(FTDecayFunction2DCauchy self) -> FTDecayFunction2DCauchy\n"
+		"\n"
+		"virtual FTDecayFunction2DCauchy* FTDecayFunction2DCauchy::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction2DCauchy_evaluate", _wrap_FTDecayFunction2DCauchy_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DCauchy_evaluate(FTDecayFunction2DCauchy self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDecayFunction2DCauchy::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed decay function for q in X,Y coordinates \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDecayFunction2DCauchy", _wrap_delete_FTDecayFunction2DCauchy, METH_VARARGS, (char *)"delete_FTDecayFunction2DCauchy(FTDecayFunction2DCauchy self)"},
+	 { (char *)"FTDecayFunction2DCauchy_swigregister", FTDecayFunction2DCauchy_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDecayFunction2DGauss", _wrap_new_FTDecayFunction2DGauss, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma=0, double delta)\n"
+		"FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma=0)\n"
+		"new_FTDecayFunction2DGauss(double decay_length_x, double decay_length_y) -> FTDecayFunction2DGauss\n"
+		"\n"
+		"FTDecayFunction2DGauss::FTDecayFunction2DGauss(double decay_length_x, double decay_length_y, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction2DGauss_clone", _wrap_FTDecayFunction2DGauss_clone, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DGauss_clone(FTDecayFunction2DGauss self) -> FTDecayFunction2DGauss\n"
+		"\n"
+		"virtual FTDecayFunction2DGauss* FTDecayFunction2DGauss::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction2DGauss_evaluate", _wrap_FTDecayFunction2DGauss_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DGauss_evaluate(FTDecayFunction2DGauss self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDecayFunction2DGauss::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed decay function for q in X,Y coordinates \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDecayFunction2DGauss", _wrap_delete_FTDecayFunction2DGauss, METH_VARARGS, (char *)"delete_FTDecayFunction2DGauss(FTDecayFunction2DGauss self)"},
+	 { (char *)"FTDecayFunction2DGauss_swigregister", FTDecayFunction2DGauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDecayFunction2DVoigt", _wrap_new_FTDecayFunction2DVoigt, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta, double gamma=0, double delta)\n"
+		"FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta, double gamma=0)\n"
+		"new_FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta) -> FTDecayFunction2DVoigt\n"
+		"\n"
+		"FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(double decay_length_x, double decay_length_y, double eta, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction2DVoigt_clone", _wrap_FTDecayFunction2DVoigt_clone, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DVoigt_clone(FTDecayFunction2DVoigt self) -> FTDecayFunction2DVoigt\n"
+		"\n"
+		"virtual FTDecayFunction2DVoigt* FTDecayFunction2DVoigt::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction2DVoigt_evaluate", _wrap_FTDecayFunction2DVoigt_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DVoigt_evaluate(FTDecayFunction2DVoigt self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDecayFunction2DVoigt::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed decay function for q in X,Y coordinates \n"
+		"\n"
+		""},
+	 { (char *)"FTDecayFunction2DVoigt_getEta", _wrap_FTDecayFunction2DVoigt_getEta, METH_VARARGS, (char *)"\n"
+		"FTDecayFunction2DVoigt_getEta(FTDecayFunction2DVoigt self) -> double\n"
+		"\n"
+		"virtual double FTDecayFunction2DVoigt::getEta() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDecayFunction2DVoigt", _wrap_delete_FTDecayFunction2DVoigt, METH_VARARGS, (char *)"delete_FTDecayFunction2DVoigt(FTDecayFunction2DVoigt self)"},
+	 { (char *)"FTDecayFunction2DVoigt_swigregister", FTDecayFunction2DVoigt_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IFTDistribution1D_clone", _wrap_IFTDistribution1D_clone, METH_VARARGS, (char *)"\n"
+		"IFTDistribution1D_clone(IFTDistribution1D self) -> IFTDistribution1D\n"
+		"\n"
+		"virtual IFTDistribution1D* IFTDistribution1D::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution1D_evaluate", _wrap_IFTDistribution1D_evaluate, METH_VARARGS, (char *)"\n"
+		"IFTDistribution1D_evaluate(IFTDistribution1D self, double q) -> double\n"
+		"\n"
+		"virtual double IFTDistribution1D::evaluate(double q) const =0\n"
+		"\n"
+		"Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. \n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution1D_setOmega", _wrap_IFTDistribution1D_setOmega, METH_VARARGS, (char *)"\n"
+		"IFTDistribution1D_setOmega(IFTDistribution1D self, double omega)\n"
+		"\n"
+		"void IFTDistribution1D::setOmega(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution1D_getOmega", _wrap_IFTDistribution1D_getOmega, METH_VARARGS, (char *)"\n"
+		"IFTDistribution1D_getOmega(IFTDistribution1D self) -> double\n"
+		"\n"
+		"double IFTDistribution1D::getOmega() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_IFTDistribution1D", _wrap_delete_IFTDistribution1D, METH_VARARGS, (char *)"delete_IFTDistribution1D(IFTDistribution1D self)"},
+	 { (char *)"IFTDistribution1D_swigregister", IFTDistribution1D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution1DCauchy", _wrap_new_FTDistribution1DCauchy, METH_VARARGS, (char *)"\n"
+		"new_FTDistribution1DCauchy(double omega) -> FTDistribution1DCauchy\n"
+		"\n"
+		"FTDistribution1DCauchy::FTDistribution1DCauchy(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DCauchy_clone", _wrap_FTDistribution1DCauchy_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DCauchy_clone(FTDistribution1DCauchy self) -> FTDistribution1DCauchy\n"
+		"\n"
+		"FTDistribution1DCauchy* FTDistribution1DCauchy::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DCauchy_evaluate", _wrap_FTDistribution1DCauchy_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DCauchy_evaluate(FTDistribution1DCauchy self, double q) -> double\n"
+		"\n"
+		"double FTDistribution1DCauchy::evaluate(double q) const final\n"
+		"\n"
+		"Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution1DCauchy", _wrap_delete_FTDistribution1DCauchy, METH_VARARGS, (char *)"delete_FTDistribution1DCauchy(FTDistribution1DCauchy self)"},
+	 { (char *)"FTDistribution1DCauchy_swigregister", FTDistribution1DCauchy_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution1DGauss", _wrap_new_FTDistribution1DGauss, METH_VARARGS, (char *)"\n"
+		"new_FTDistribution1DGauss(double omega) -> FTDistribution1DGauss\n"
+		"\n"
+		"FTDistribution1DGauss::FTDistribution1DGauss(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DGauss_clone", _wrap_FTDistribution1DGauss_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DGauss_clone(FTDistribution1DGauss self) -> FTDistribution1DGauss\n"
+		"\n"
+		"FTDistribution1DGauss* FTDistribution1DGauss::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DGauss_evaluate", _wrap_FTDistribution1DGauss_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DGauss_evaluate(FTDistribution1DGauss self, double q) -> double\n"
+		"\n"
+		"double FTDistribution1DGauss::evaluate(double q) const final\n"
+		"\n"
+		"Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution1DGauss", _wrap_delete_FTDistribution1DGauss, METH_VARARGS, (char *)"delete_FTDistribution1DGauss(FTDistribution1DGauss self)"},
+	 { (char *)"FTDistribution1DGauss_swigregister", FTDistribution1DGauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution1DGate", _wrap_new_FTDistribution1DGate, METH_VARARGS, (char *)"\n"
+		"new_FTDistribution1DGate(double omega) -> FTDistribution1DGate\n"
+		"\n"
+		"FTDistribution1DGate::FTDistribution1DGate(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DGate_clone", _wrap_FTDistribution1DGate_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DGate_clone(FTDistribution1DGate self) -> FTDistribution1DGate\n"
+		"\n"
+		"FTDistribution1DGate* FTDistribution1DGate::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DGate_evaluate", _wrap_FTDistribution1DGate_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DGate_evaluate(FTDistribution1DGate self, double q) -> double\n"
+		"\n"
+		"double FTDistribution1DGate::evaluate(double q) const final\n"
+		"\n"
+		"Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution1DGate", _wrap_delete_FTDistribution1DGate, METH_VARARGS, (char *)"delete_FTDistribution1DGate(FTDistribution1DGate self)"},
+	 { (char *)"FTDistribution1DGate_swigregister", FTDistribution1DGate_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution1DTriangle", _wrap_new_FTDistribution1DTriangle, METH_VARARGS, (char *)"\n"
+		"new_FTDistribution1DTriangle(double omega) -> FTDistribution1DTriangle\n"
+		"\n"
+		"FTDistribution1DTriangle::FTDistribution1DTriangle(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution1DTriangle", _wrap_delete_FTDistribution1DTriangle, METH_VARARGS, (char *)"\n"
+		"delete_FTDistribution1DTriangle(FTDistribution1DTriangle self)\n"
+		"\n"
+		"virtual FTDistribution1DTriangle::~FTDistribution1DTriangle()\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DTriangle_clone", _wrap_FTDistribution1DTriangle_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DTriangle_clone(FTDistribution1DTriangle self) -> FTDistribution1DTriangle\n"
+		"\n"
+		"FTDistribution1DTriangle* FTDistribution1DTriangle::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DTriangle_evaluate", _wrap_FTDistribution1DTriangle_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DTriangle_evaluate(FTDistribution1DTriangle self, double q) -> double\n"
+		"\n"
+		"double FTDistribution1DTriangle::evaluate(double q) const final\n"
+		"\n"
+		"Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. \n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DTriangle_swigregister", FTDistribution1DTriangle_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution1DCosine", _wrap_new_FTDistribution1DCosine, METH_VARARGS, (char *)"\n"
+		"new_FTDistribution1DCosine(double omega) -> FTDistribution1DCosine\n"
+		"\n"
+		"FTDistribution1DCosine::FTDistribution1DCosine(double omega)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DCosine_clone", _wrap_FTDistribution1DCosine_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DCosine_clone(FTDistribution1DCosine self) -> FTDistribution1DCosine\n"
+		"\n"
+		"FTDistribution1DCosine* FTDistribution1DCosine::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DCosine_evaluate", _wrap_FTDistribution1DCosine_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DCosine_evaluate(FTDistribution1DCosine self, double q) -> double\n"
+		"\n"
+		"double FTDistribution1DCosine::evaluate(double q) const final\n"
+		"\n"
+		"Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution1DCosine", _wrap_delete_FTDistribution1DCosine, METH_VARARGS, (char *)"delete_FTDistribution1DCosine(FTDistribution1DCosine self)"},
+	 { (char *)"FTDistribution1DCosine_swigregister", FTDistribution1DCosine_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution1DVoigt", _wrap_new_FTDistribution1DVoigt, METH_VARARGS, (char *)"\n"
+		"new_FTDistribution1DVoigt(double omega, double eta) -> FTDistribution1DVoigt\n"
+		"\n"
+		"FTDistribution1DVoigt::FTDistribution1DVoigt(double omega, double eta)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DVoigt_clone", _wrap_FTDistribution1DVoigt_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DVoigt_clone(FTDistribution1DVoigt self) -> FTDistribution1DVoigt\n"
+		"\n"
+		"FTDistribution1DVoigt* FTDistribution1DVoigt::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DVoigt_evaluate", _wrap_FTDistribution1DVoigt_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DVoigt_evaluate(FTDistribution1DVoigt self, double q) -> double\n"
+		"\n"
+		"double FTDistribution1DVoigt::evaluate(double q) const final\n"
+		"\n"
+		"Returns Fourier transform of this distribution; is a decay function starting at evaluate(0)=1. \n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution1DVoigt_getEta", _wrap_FTDistribution1DVoigt_getEta, METH_VARARGS, (char *)"\n"
+		"FTDistribution1DVoigt_getEta(FTDistribution1DVoigt self) -> double\n"
+		"\n"
+		"double FTDistribution1DVoigt::getEta() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution1DVoigt", _wrap_delete_FTDistribution1DVoigt, METH_VARARGS, (char *)"delete_FTDistribution1DVoigt(FTDistribution1DVoigt self)"},
+	 { (char *)"FTDistribution1DVoigt_swigregister", FTDistribution1DVoigt_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IFTDistribution2D_clone", _wrap_IFTDistribution2D_clone, METH_VARARGS, (char *)"\n"
+		"IFTDistribution2D_clone(IFTDistribution2D self) -> IFTDistribution2D\n"
+		"\n"
+		"virtual IFTDistribution2D* IFTDistribution2D::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution2D_setGamma", _wrap_IFTDistribution2D_setGamma, METH_VARARGS, (char *)"\n"
+		"IFTDistribution2D_setGamma(IFTDistribution2D self, double gamma)\n"
+		"\n"
+		"void IFTDistribution2D::setGamma(double gamma)\n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution2D_getGamma", _wrap_IFTDistribution2D_getGamma, METH_VARARGS, (char *)"\n"
+		"IFTDistribution2D_getGamma(IFTDistribution2D self) -> double\n"
+		"\n"
+		"double IFTDistribution2D::getGamma() const \n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution2D_getDelta", _wrap_IFTDistribution2D_getDelta, METH_VARARGS, (char *)"\n"
+		"IFTDistribution2D_getDelta(IFTDistribution2D self) -> double\n"
+		"\n"
+		"double IFTDistribution2D::getDelta() const \n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution2D_getCoherenceLengthX", _wrap_IFTDistribution2D_getCoherenceLengthX, METH_VARARGS, (char *)"\n"
+		"IFTDistribution2D_getCoherenceLengthX(IFTDistribution2D self) -> double\n"
+		"\n"
+		"double IFTDistribution2D::getCoherenceLengthX() const \n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution2D_getCoherenceLengthY", _wrap_IFTDistribution2D_getCoherenceLengthY, METH_VARARGS, (char *)"\n"
+		"IFTDistribution2D_getCoherenceLengthY(IFTDistribution2D self) -> double\n"
+		"\n"
+		"double IFTDistribution2D::getCoherenceLengthY() const \n"
+		"\n"
+		""},
+	 { (char *)"IFTDistribution2D_evaluate", _wrap_IFTDistribution2D_evaluate, METH_VARARGS, (char *)"\n"
+		"IFTDistribution2D_evaluate(IFTDistribution2D self, double qx, double qy) -> double\n"
+		"\n"
+		"virtual double IFTDistribution2D::evaluate(double qx, double qy) const =0\n"
+		"\n"
+		"evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 \n"
+		"\n"
+		""},
+	 { (char *)"delete_IFTDistribution2D", _wrap_delete_IFTDistribution2D, METH_VARARGS, (char *)"delete_IFTDistribution2D(IFTDistribution2D self)"},
+	 { (char *)"IFTDistribution2D_swigregister", IFTDistribution2D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution2DCauchy", _wrap_new_FTDistribution2DCauchy, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DCauchy(double coherence_length_x, double coherence_length_y, double gamma=0, double delta)\n"
+		"FTDistribution2DCauchy(double coherence_length_x, double coherence_length_y, double gamma=0)\n"
+		"new_FTDistribution2DCauchy(double coherence_length_x, double coherence_length_y) -> FTDistribution2DCauchy\n"
+		"\n"
+		"FTDistribution2DCauchy::FTDistribution2DCauchy(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DCauchy_clone", _wrap_FTDistribution2DCauchy_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DCauchy_clone(FTDistribution2DCauchy self) -> FTDistribution2DCauchy\n"
+		"\n"
+		"FTDistribution2DCauchy* FTDistribution2DCauchy::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DCauchy_evaluate", _wrap_FTDistribution2DCauchy_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DCauchy_evaluate(FTDistribution2DCauchy self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDistribution2DCauchy::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution2DCauchy", _wrap_delete_FTDistribution2DCauchy, METH_VARARGS, (char *)"delete_FTDistribution2DCauchy(FTDistribution2DCauchy self)"},
+	 { (char *)"FTDistribution2DCauchy_swigregister", FTDistribution2DCauchy_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution2DGauss", _wrap_new_FTDistribution2DGauss, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DGauss(double coherence_length_x, double coherence_length_y, double gamma=0, double delta)\n"
+		"FTDistribution2DGauss(double coherence_length_x, double coherence_length_y, double gamma=0)\n"
+		"new_FTDistribution2DGauss(double coherence_length_x, double coherence_length_y) -> FTDistribution2DGauss\n"
+		"\n"
+		"FTDistribution2DGauss::FTDistribution2DGauss(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DGauss_clone", _wrap_FTDistribution2DGauss_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DGauss_clone(FTDistribution2DGauss self) -> FTDistribution2DGauss\n"
+		"\n"
+		"FTDistribution2DGauss* FTDistribution2DGauss::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DGauss_evaluate", _wrap_FTDistribution2DGauss_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DGauss_evaluate(FTDistribution2DGauss self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDistribution2DGauss::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution2DGauss", _wrap_delete_FTDistribution2DGauss, METH_VARARGS, (char *)"delete_FTDistribution2DGauss(FTDistribution2DGauss self)"},
+	 { (char *)"FTDistribution2DGauss_swigregister", FTDistribution2DGauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution2DGate", _wrap_new_FTDistribution2DGate, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DGate(double coherence_length_x, double coherence_length_y, double gamma=0, double delta)\n"
+		"FTDistribution2DGate(double coherence_length_x, double coherence_length_y, double gamma=0)\n"
+		"new_FTDistribution2DGate(double coherence_length_x, double coherence_length_y) -> FTDistribution2DGate\n"
+		"\n"
+		"FTDistribution2DGate::FTDistribution2DGate(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DGate_clone", _wrap_FTDistribution2DGate_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DGate_clone(FTDistribution2DGate self) -> FTDistribution2DGate\n"
+		"\n"
+		"FTDistribution2DGate* FTDistribution2DGate::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DGate_evaluate", _wrap_FTDistribution2DGate_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DGate_evaluate(FTDistribution2DGate self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDistribution2DGate::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution2DGate", _wrap_delete_FTDistribution2DGate, METH_VARARGS, (char *)"delete_FTDistribution2DGate(FTDistribution2DGate self)"},
+	 { (char *)"FTDistribution2DGate_swigregister", FTDistribution2DGate_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution2DCone", _wrap_new_FTDistribution2DCone, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DCone(double coherence_length_x, double coherence_length_y, double gamma=0, double delta)\n"
+		"FTDistribution2DCone(double coherence_length_x, double coherence_length_y, double gamma=0)\n"
+		"new_FTDistribution2DCone(double coherence_length_x, double coherence_length_y) -> FTDistribution2DCone\n"
+		"\n"
+		"FTDistribution2DCone::FTDistribution2DCone(double coherence_length_x, double coherence_length_y, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DCone_clone", _wrap_FTDistribution2DCone_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DCone_clone(FTDistribution2DCone self) -> FTDistribution2DCone\n"
+		"\n"
+		"FTDistribution2DCone* FTDistribution2DCone::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DCone_evaluate", _wrap_FTDistribution2DCone_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DCone_evaluate(FTDistribution2DCone self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDistribution2DCone::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution2DCone", _wrap_delete_FTDistribution2DCone, METH_VARARGS, (char *)"delete_FTDistribution2DCone(FTDistribution2DCone self)"},
+	 { (char *)"FTDistribution2DCone_swigregister", FTDistribution2DCone_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FTDistribution2DVoigt", _wrap_new_FTDistribution2DVoigt, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y, double eta, double gamma=0, double delta)\n"
+		"FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y, double eta, double gamma=0)\n"
+		"new_FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y, double eta) -> FTDistribution2DVoigt\n"
+		"\n"
+		"FTDistribution2DVoigt::FTDistribution2DVoigt(double coherence_length_x, double coherence_length_y, double eta, double gamma=0, double delta=M_PI_2)\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DVoigt_clone", _wrap_FTDistribution2DVoigt_clone, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DVoigt_clone(FTDistribution2DVoigt self) -> FTDistribution2DVoigt\n"
+		"\n"
+		"FTDistribution2DVoigt* FTDistribution2DVoigt::clone() const final\n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DVoigt_evaluate", _wrap_FTDistribution2DVoigt_evaluate, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DVoigt_evaluate(FTDistribution2DVoigt self, double qx, double qy) -> double\n"
+		"\n"
+		"double FTDistribution2DVoigt::evaluate(double qx, double qy) const final\n"
+		"\n"
+		"evaluate Fourier transformed distribution for q in X,Y coordinates the original distribution (in real space) is assumed to be normalized: total integral is equal to 1 \n"
+		"\n"
+		""},
+	 { (char *)"FTDistribution2DVoigt_getEta", _wrap_FTDistribution2DVoigt_getEta, METH_VARARGS, (char *)"\n"
+		"FTDistribution2DVoigt_getEta(FTDistribution2DVoigt self) -> double\n"
+		"\n"
+		"double FTDistribution2DVoigt::getEta() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FTDistribution2DVoigt", _wrap_delete_FTDistribution2DVoigt, METH_VARARGS, (char *)"delete_FTDistribution2DVoigt(FTDistribution2DVoigt self)"},
+	 { (char *)"FTDistribution2DVoigt_swigregister", FTDistribution2DVoigt_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FixedBinAxis", _wrap_new_FixedBinAxis, METH_VARARGS, (char *)"\n"
+		"new_FixedBinAxis(std::string const & name, size_t nbins, double start, double end) -> FixedBinAxis\n"
+		"\n"
+		"FixedBinAxis::FixedBinAxis(const std::string &name, size_t nbins, double start, double end)\n"
+		"\n"
+		"FixedBinAxis constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"name: \n"
+		"Axis name\n"
+		"\n"
+		"nbins: \n"
+		"number of bins\n"
+		"\n"
+		"start: \n"
+		"low edge of first bin\n"
+		"\n"
+		"end: \n"
+		"upper edge of last bin \n"
+		"\n"
+		""},
+	 { (char *)"delete_FixedBinAxis", _wrap_delete_FixedBinAxis, METH_VARARGS, (char *)"\n"
+		"delete_FixedBinAxis(FixedBinAxis self)\n"
+		"\n"
+		"virtual FixedBinAxis::~FixedBinAxis()\n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_clone", _wrap_FixedBinAxis_clone, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_clone(FixedBinAxis self) -> FixedBinAxis\n"
+		"\n"
+		"FixedBinAxis * FixedBinAxis::clone() const\n"
+		"\n"
+		"clone function \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_size", _wrap_FixedBinAxis_size, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_size(FixedBinAxis self) -> size_t\n"
+		"\n"
+		"size_t FixedBinAxis::size() const\n"
+		"\n"
+		"retrieve the number of bins \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_getBin", _wrap_FixedBinAxis_getBin, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_getBin(FixedBinAxis self, size_t index) -> Bin1D\n"
+		"\n"
+		"Bin1D FixedBinAxis::getBin(size_t index) const\n"
+		"\n"
+		"retrieve a 1d bin for the given index \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_getMin", _wrap_FixedBinAxis_getMin, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_getMin(FixedBinAxis self) -> double\n"
+		"\n"
+		"double FixedBinAxis::getMin() const\n"
+		"\n"
+		"Returns value of first point of axis. \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_getMax", _wrap_FixedBinAxis_getMax, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_getMax(FixedBinAxis self) -> double\n"
+		"\n"
+		"double FixedBinAxis::getMax() const\n"
+		"\n"
+		"Returns value of last point of axis. \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_getBinCenter", _wrap_FixedBinAxis_getBinCenter, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_getBinCenter(FixedBinAxis self, size_t index) -> double\n"
+		"\n"
+		"double FixedBinAxis::getBinCenter(size_t index) const \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_findClosestIndex", _wrap_FixedBinAxis_findClosestIndex, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_findClosestIndex(FixedBinAxis self, double value) -> size_t\n"
+		"\n"
+		"size_t FixedBinAxis::findClosestIndex(double value) const\n"
+		"\n"
+		"find bin index which is best match for given value \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_getBinCenters", _wrap_FixedBinAxis_getBinCenters, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_getBinCenters(FixedBinAxis self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > FixedBinAxis::getBinCenters() const \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_getBinBoundaries", _wrap_FixedBinAxis_getBinBoundaries, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_getBinBoundaries(FixedBinAxis self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > FixedBinAxis::getBinBoundaries() const \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis_createClippedAxis", _wrap_FixedBinAxis_createClippedAxis, METH_VARARGS, (char *)"\n"
+		"FixedBinAxis_createClippedAxis(FixedBinAxis self, double left, double right) -> FixedBinAxis\n"
+		"\n"
+		"FixedBinAxis * FixedBinAxis::createClippedAxis(double left, double right) const\n"
+		"\n"
+		"Creates a new clipped axis. \n"
+		"\n"
+		""},
+	 { (char *)"FixedBinAxis___getitem__", _wrap_FixedBinAxis___getitem__, METH_VARARGS, (char *)"FixedBinAxis___getitem__(FixedBinAxis self, unsigned int i) -> double"},
+	 { (char *)"FixedBinAxis_swigregister", FixedBinAxis_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IFormFactor", _wrap_new_IFormFactor, METH_VARARGS, (char *)"\n"
+		"new_IFormFactor(PyObject * arg2) -> IFormFactor\n"
+		"\n"
+		"IFormFactor::IFormFactor()\n"
+		"\n"
+		""},
+	 { (char *)"delete_IFormFactor", _wrap_delete_IFormFactor, METH_VARARGS, (char *)"\n"
+		"delete_IFormFactor(IFormFactor self)\n"
+		"\n"
+		"IFormFactor::~IFormFactor() override\n"
+		"\n"
+		""},
+	 { (char *)"IFormFactor_clone", _wrap_IFormFactor_clone, METH_VARARGS, (char *)"\n"
+		"IFormFactor_clone(IFormFactor self) -> IFormFactor\n"
+		"\n"
+		"IFormFactor* IFormFactor::clone() const override=0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactor_accept", _wrap_IFormFactor_accept, METH_VARARGS, (char *)"\n"
+		"IFormFactor_accept(IFormFactor self, ISampleVisitor visitor)\n"
+		"\n"
+		"void IFormFactor::accept(ISampleVisitor *visitor) const override=0\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactor_setAmbientMaterial", _wrap_IFormFactor_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"IFormFactor_setAmbientMaterial(IFormFactor self, IMaterial arg0)\n"
+		"\n"
+		"virtual void IFormFactor::setAmbientMaterial(const IMaterial &)\n"
+		"\n"
+		"Passes the refractive index of the ambient material in which this particle is embedded. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactor_evaluate", _wrap_IFormFactor_evaluate, METH_VARARGS, (char *)"\n"
+		"IFormFactor_evaluate(IFormFactor self, WavevectorInfo wavevectors) -> complex_t\n"
+		"\n"
+		"virtual complex_t IFormFactor::evaluate(const WavevectorInfo &wavevectors) const =0\n"
+		"\n"
+		"Returns scattering amplitude for complex wavevectors ki, kf. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactor_getVolume", _wrap_IFormFactor_getVolume, METH_VARARGS, (char *)"\n"
+		"IFormFactor_getVolume(IFormFactor self) -> double\n"
+		"\n"
+		"double IFormFactor::getVolume() const\n"
+		"\n"
+		"Returns the total volume of the particle of this form factor's shape. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactor_getRadialExtension", _wrap_IFormFactor_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"IFormFactor_getRadialExtension(IFormFactor self) -> double\n"
+		"\n"
+		"virtual double IFormFactor::getRadialExtension() const =0\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactor_setSpecularInfo", _wrap_IFormFactor_setSpecularInfo, METH_VARARGS, (char *)"\n"
+		"IFormFactor_setSpecularInfo(IFormFactor self, ILayerRTCoefficients const * arg0, ILayerRTCoefficients const * arg1)\n"
+		"\n"
+		"virtual void IFormFactor::setSpecularInfo(const ILayerRTCoefficients *, const ILayerRTCoefficients *)\n"
+		"\n"
+		"Sets reflection/transmission info. \n"
+		"\n"
+		""},
+	 { (char *)"disown_IFormFactor", _wrap_disown_IFormFactor, METH_VARARGS, NULL},
+	 { (char *)"IFormFactor_onChange", _wrap_IFormFactor_onChange, METH_VARARGS, (char *)"IFormFactor_onChange(IFormFactor self)"},
+	 { (char *)"IFormFactor__print", _wrap_IFormFactor__print, METH_VARARGS, (char *)"IFormFactor__print(IFormFactor self, std::ostream & ostr)"},
+	 { (char *)"IFormFactor_swigregister", IFormFactor_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_IFormFactorPtr_t_iterator", _wrap_vector_IFormFactorPtr_t_iterator, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_iterator(vector_IFormFactorPtr_t self) -> SwigPyIterator"},
+	 { (char *)"vector_IFormFactorPtr_t___nonzero__", _wrap_vector_IFormFactorPtr_t___nonzero__, METH_VARARGS, (char *)"vector_IFormFactorPtr_t___nonzero__(vector_IFormFactorPtr_t self) -> bool"},
+	 { (char *)"vector_IFormFactorPtr_t___bool__", _wrap_vector_IFormFactorPtr_t___bool__, METH_VARARGS, (char *)"vector_IFormFactorPtr_t___bool__(vector_IFormFactorPtr_t self) -> bool"},
+	 { (char *)"vector_IFormFactorPtr_t___len__", _wrap_vector_IFormFactorPtr_t___len__, METH_VARARGS, (char *)"vector_IFormFactorPtr_t___len__(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::size_type"},
+	 { (char *)"vector_IFormFactorPtr_t___getslice__", _wrap_vector_IFormFactorPtr_t___getslice__, METH_VARARGS, (char *)"vector_IFormFactorPtr_t___getslice__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j) -> vector_IFormFactorPtr_t"},
+	 { (char *)"vector_IFormFactorPtr_t___setslice__", _wrap_vector_IFormFactorPtr_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j)\n"
+		"vector_IFormFactorPtr_t___setslice__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j, vector_IFormFactorPtr_t v)\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t___delslice__", _wrap_vector_IFormFactorPtr_t___delslice__, METH_VARARGS, (char *)"vector_IFormFactorPtr_t___delslice__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, std::vector< IFormFactor * >::difference_type j)"},
+	 { (char *)"vector_IFormFactorPtr_t___delitem__", _wrap_vector_IFormFactorPtr_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< IFormFactor * >::difference_type i)\n"
+		"vector_IFormFactorPtr_t___delitem__(vector_IFormFactorPtr_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t___getitem__", _wrap_vector_IFormFactorPtr_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_IFormFactorPtr_t\n"
+		"vector_IFormFactorPtr_t___getitem__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i) -> IFormFactor\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t___setitem__", _wrap_vector_IFormFactorPtr_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_IFormFactorPtr_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_IFormFactorPtr_t___setitem__(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::difference_type i, IFormFactor x)\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t_pop", _wrap_vector_IFormFactorPtr_t_pop, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_pop(vector_IFormFactorPtr_t self) -> IFormFactor"},
+	 { (char *)"vector_IFormFactorPtr_t_append", _wrap_vector_IFormFactorPtr_t_append, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_append(vector_IFormFactorPtr_t self, IFormFactor x)"},
+	 { (char *)"vector_IFormFactorPtr_t_empty", _wrap_vector_IFormFactorPtr_t_empty, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_empty(vector_IFormFactorPtr_t self) -> bool"},
+	 { (char *)"vector_IFormFactorPtr_t_size", _wrap_vector_IFormFactorPtr_t_size, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_size(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::size_type"},
+	 { (char *)"vector_IFormFactorPtr_t_swap", _wrap_vector_IFormFactorPtr_t_swap, METH_VARARGS, (char *)"\n"
+		"vector_IFormFactorPtr_t_swap(vector_IFormFactorPtr_t self, vector_IFormFactorPtr_t v)\n"
+		"\n"
+		"void swap(OutputDataIterator< TValue, TContainer > &left, OutputDataIterator< TValue, TContainer > &right)\n"
+		"\n"
+		"make Swappable \n"
+		"\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t_begin", _wrap_vector_IFormFactorPtr_t_begin, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_begin(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::iterator"},
+	 { (char *)"vector_IFormFactorPtr_t_end", _wrap_vector_IFormFactorPtr_t_end, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_end(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::iterator"},
+	 { (char *)"vector_IFormFactorPtr_t_rbegin", _wrap_vector_IFormFactorPtr_t_rbegin, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_rbegin(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::reverse_iterator"},
+	 { (char *)"vector_IFormFactorPtr_t_rend", _wrap_vector_IFormFactorPtr_t_rend, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_rend(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::reverse_iterator"},
+	 { (char *)"vector_IFormFactorPtr_t_clear", _wrap_vector_IFormFactorPtr_t_clear, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_clear(vector_IFormFactorPtr_t self)"},
+	 { (char *)"vector_IFormFactorPtr_t_get_allocator", _wrap_vector_IFormFactorPtr_t_get_allocator, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_get_allocator(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::allocator_type"},
+	 { (char *)"vector_IFormFactorPtr_t_pop_back", _wrap_vector_IFormFactorPtr_t_pop_back, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_pop_back(vector_IFormFactorPtr_t self)"},
+	 { (char *)"vector_IFormFactorPtr_t_erase", _wrap_vector_IFormFactorPtr_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< IFormFactor * >::iterator pos) -> std::vector< IFormFactor * >::iterator\n"
+		"vector_IFormFactorPtr_t_erase(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::iterator first, std::vector< IFormFactor * >::iterator last) -> std::vector< IFormFactor * >::iterator\n"
+		""},
+	 { (char *)"new_vector_IFormFactorPtr_t", _wrap_new_vector_IFormFactorPtr_t, METH_VARARGS, (char *)"\n"
+		"vector_IFormFactorPtr_t()\n"
+		"vector_IFormFactorPtr_t(vector_IFormFactorPtr_t arg2)\n"
+		"vector_IFormFactorPtr_t(std::vector< IFormFactor * >::size_type size)\n"
+		"new_vector_IFormFactorPtr_t(std::vector< IFormFactor * >::size_type size, IFormFactor value) -> vector_IFormFactorPtr_t\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t_push_back", _wrap_vector_IFormFactorPtr_t_push_back, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_push_back(vector_IFormFactorPtr_t self, IFormFactor x)"},
+	 { (char *)"vector_IFormFactorPtr_t_front", _wrap_vector_IFormFactorPtr_t_front, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_front(vector_IFormFactorPtr_t self) -> IFormFactor"},
+	 { (char *)"vector_IFormFactorPtr_t_back", _wrap_vector_IFormFactorPtr_t_back, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_back(vector_IFormFactorPtr_t self) -> IFormFactor"},
+	 { (char *)"vector_IFormFactorPtr_t_assign", _wrap_vector_IFormFactorPtr_t_assign, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_assign(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::size_type n, IFormFactor x)"},
+	 { (char *)"vector_IFormFactorPtr_t_resize", _wrap_vector_IFormFactorPtr_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< IFormFactor * >::size_type new_size)\n"
+		"vector_IFormFactorPtr_t_resize(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::size_type new_size, IFormFactor x)\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t_insert", _wrap_vector_IFormFactorPtr_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< IFormFactor * >::iterator pos, IFormFactor x) -> std::vector< IFormFactor * >::iterator\n"
+		"vector_IFormFactorPtr_t_insert(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::iterator pos, std::vector< IFormFactor * >::size_type n, IFormFactor x)\n"
+		""},
+	 { (char *)"vector_IFormFactorPtr_t_reserve", _wrap_vector_IFormFactorPtr_t_reserve, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_reserve(vector_IFormFactorPtr_t self, std::vector< IFormFactor * >::size_type n)"},
+	 { (char *)"vector_IFormFactorPtr_t_capacity", _wrap_vector_IFormFactorPtr_t_capacity, METH_VARARGS, (char *)"vector_IFormFactorPtr_t_capacity(vector_IFormFactorPtr_t self) -> std::vector< IFormFactor * >::size_type"},
+	 { (char *)"delete_vector_IFormFactorPtr_t", _wrap_delete_vector_IFormFactorPtr_t, METH_VARARGS, (char *)"delete_vector_IFormFactorPtr_t(vector_IFormFactorPtr_t self)"},
+	 { (char *)"vector_IFormFactorPtr_t_swigregister", vector_IFormFactorPtr_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IFormFactorBorn", _wrap_new_IFormFactorBorn, METH_VARARGS, (char *)"\n"
+		"new_IFormFactorBorn(PyObject * arg2) -> IFormFactorBorn\n"
+		"\n"
+		"IFormFactorBorn::IFormFactorBorn()\n"
+		"\n"
+		""},
+	 { (char *)"delete_IFormFactorBorn", _wrap_delete_IFormFactorBorn, METH_VARARGS, (char *)"\n"
+		"delete_IFormFactorBorn(IFormFactorBorn self)\n"
+		"\n"
+		"IFormFactorBorn::~IFormFactorBorn() override\n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorBorn_clone", _wrap_IFormFactorBorn_clone, METH_VARARGS, (char *)"\n"
+		"IFormFactorBorn_clone(IFormFactorBorn self) -> IFormFactorBorn\n"
+		"\n"
+		"IFormFactorBorn* IFormFactorBorn::clone() const override=0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorBorn_evaluate", _wrap_IFormFactorBorn_evaluate, METH_VARARGS, (char *)"\n"
+		"IFormFactorBorn_evaluate(IFormFactorBorn self, WavevectorInfo wavevectors) -> complex_t\n"
+		"\n"
+		"complex_t IFormFactorBorn::evaluate(const WavevectorInfo &wavevectors) const override\n"
+		"\n"
+		"Returns scattering amplitude for complex wavevectors ki, kf. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorBorn_evaluate_for_q", _wrap_IFormFactorBorn_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"IFormFactorBorn_evaluate_for_q(IFormFactorBorn self, cvector_t q) -> complex_t\n"
+		"\n"
+		"virtual complex_t IFormFactorBorn::evaluate_for_q(const cvector_t q) const =0\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"disown_IFormFactorBorn", _wrap_disown_IFormFactorBorn, METH_VARARGS, NULL},
+	 { (char *)"IFormFactorBorn_onChange", _wrap_IFormFactorBorn_onChange, METH_VARARGS, (char *)"IFormFactorBorn_onChange(IFormFactorBorn self)"},
+	 { (char *)"IFormFactorBorn__print", _wrap_IFormFactorBorn__print, METH_VARARGS, (char *)"IFormFactorBorn__print(IFormFactorBorn self, std::ostream & ostr)"},
+	 { (char *)"IFormFactorBorn_swigregister", IFormFactorBorn_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IFormFactorDecorator", _wrap_delete_IFormFactorDecorator, METH_VARARGS, (char *)"\n"
+		"delete_IFormFactorDecorator(IFormFactorDecorator self)\n"
+		"\n"
+		"IFormFactorDecorator::~IFormFactorDecorator() override\n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorDecorator_clone", _wrap_IFormFactorDecorator_clone, METH_VARARGS, (char *)"\n"
+		"IFormFactorDecorator_clone(IFormFactorDecorator self) -> IFormFactorDecorator\n"
+		"\n"
+		"IFormFactorDecorator* IFormFactorDecorator::clone() const override=0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorDecorator_accept", _wrap_IFormFactorDecorator_accept, METH_VARARGS, (char *)"\n"
+		"IFormFactorDecorator_accept(IFormFactorDecorator self, ISampleVisitor visitor)\n"
+		"\n"
+		"void IFormFactorDecorator::accept(ISampleVisitor *visitor) const override=0\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorDecorator_setAmbientMaterial", _wrap_IFormFactorDecorator_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"IFormFactorDecorator_setAmbientMaterial(IFormFactorDecorator self, IMaterial material)\n"
+		"\n"
+		"void IFormFactorDecorator::setAmbientMaterial(const IMaterial &material) override\n"
+		"\n"
+		"Passes the refractive index of the ambient material in which this particle is embedded. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorDecorator_getVolume", _wrap_IFormFactorDecorator_getVolume, METH_VARARGS, (char *)"\n"
+		"IFormFactorDecorator_getVolume(IFormFactorDecorator self) -> double\n"
+		"\n"
+		"double IFormFactorDecorator::getVolume() const override\n"
+		"\n"
+		"Returns the total volume of the particle of this form factor's shape. \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorDecorator_getRadialExtension", _wrap_IFormFactorDecorator_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"IFormFactorDecorator_getRadialExtension(IFormFactorDecorator self) -> double\n"
+		"\n"
+		"double IFormFactorDecorator::getRadialExtension() const override\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"IFormFactorDecorator_swigregister", IFormFactorDecorator_swigregister, METH_VARARGS, NULL},
+	 { (char *)"PolygonalTopology_vertexIndices_set", _wrap_PolygonalTopology_vertexIndices_set, METH_VARARGS, (char *)"PolygonalTopology_vertexIndices_set(PolygonalTopology self, vector_integer_t vertexIndices)"},
+	 { (char *)"PolygonalTopology_vertexIndices_get", _wrap_PolygonalTopology_vertexIndices_get, METH_VARARGS, (char *)"PolygonalTopology_vertexIndices_get(PolygonalTopology self) -> vector_integer_t"},
+	 { (char *)"PolygonalTopology_symmetry_S2_set", _wrap_PolygonalTopology_symmetry_S2_set, METH_VARARGS, (char *)"PolygonalTopology_symmetry_S2_set(PolygonalTopology self, bool symmetry_S2)"},
+	 { (char *)"PolygonalTopology_symmetry_S2_get", _wrap_PolygonalTopology_symmetry_S2_get, METH_VARARGS, (char *)"PolygonalTopology_symmetry_S2_get(PolygonalTopology self) -> bool"},
+	 { (char *)"new_PolygonalTopology", _wrap_new_PolygonalTopology, METH_VARARGS, (char *)"\n"
+		"new_PolygonalTopology() -> PolygonalTopology\n"
+		"\n"
+		"\n"
+		"\n"
+		"For internal use in  PolyhedralFace.\n"
+		"\n"
+		"C++ includes: FormFactorPolyhedron.h\n"
+		"\n"
+		""},
+	 { (char *)"delete_PolygonalTopology", _wrap_delete_PolygonalTopology, METH_VARARGS, (char *)"delete_PolygonalTopology(PolygonalTopology self)"},
+	 { (char *)"PolygonalTopology_swigregister", PolygonalTopology_swigregister, METH_VARARGS, NULL},
+	 { (char *)"PolyhedralTopology_faces_set", _wrap_PolyhedralTopology_faces_set, METH_VARARGS, (char *)"PolyhedralTopology_faces_set(PolyhedralTopology self, std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > * faces)"},
+	 { (char *)"PolyhedralTopology_faces_get", _wrap_PolyhedralTopology_faces_get, METH_VARARGS, (char *)"PolyhedralTopology_faces_get(PolyhedralTopology self) -> std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *"},
+	 { (char *)"PolyhedralTopology_symmetry_Ci_set", _wrap_PolyhedralTopology_symmetry_Ci_set, METH_VARARGS, (char *)"PolyhedralTopology_symmetry_Ci_set(PolyhedralTopology self, bool symmetry_Ci)"},
+	 { (char *)"PolyhedralTopology_symmetry_Ci_get", _wrap_PolyhedralTopology_symmetry_Ci_get, METH_VARARGS, (char *)"PolyhedralTopology_symmetry_Ci_get(PolyhedralTopology self) -> bool"},
+	 { (char *)"new_PolyhedralTopology", _wrap_new_PolyhedralTopology, METH_VARARGS, (char *)"\n"
+		"new_PolyhedralTopology() -> PolyhedralTopology\n"
+		"\n"
+		"\n"
+		"\n"
+		"For internal use in  FormFactorPolyhedron.\n"
+		"\n"
+		"C++ includes: FormFactorPolyhedron.h\n"
+		"\n"
+		""},
+	 { (char *)"delete_PolyhedralTopology", _wrap_delete_PolyhedralTopology, METH_VARARGS, (char *)"delete_PolyhedralTopology(PolyhedralTopology self)"},
+	 { (char *)"PolyhedralTopology_swigregister", PolyhedralTopology_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_PolyhedralEdge", _wrap_new_PolyhedralEdge, METH_VARARGS, (char *)"\n"
+		"new_PolyhedralEdge(kvector_t _Vlow, kvector_t _Vhig) -> PolyhedralEdge\n"
+		"\n"
+		"PolyhedralEdge::PolyhedralEdge(const kvector_t _Vlow, const kvector_t _Vhig)\n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralEdge_E", _wrap_PolyhedralEdge_E, METH_VARARGS, (char *)"\n"
+		"PolyhedralEdge_E(PolyhedralEdge self) -> kvector_t\n"
+		"\n"
+		"kvector_t PolyhedralEdge::E() const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralEdge_R", _wrap_PolyhedralEdge_R, METH_VARARGS, (char *)"\n"
+		"PolyhedralEdge_R(PolyhedralEdge self) -> kvector_t\n"
+		"\n"
+		"kvector_t PolyhedralEdge::R() const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralEdge_qE", _wrap_PolyhedralEdge_qE, METH_VARARGS, (char *)"\n"
+		"PolyhedralEdge_qE(PolyhedralEdge self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t PolyhedralEdge::qE(cvector_t q) const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralEdge_qR", _wrap_PolyhedralEdge_qR, METH_VARARGS, (char *)"\n"
+		"PolyhedralEdge_qR(PolyhedralEdge self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t PolyhedralEdge::qR(cvector_t q) const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralEdge_contrib", _wrap_PolyhedralEdge_contrib, METH_VARARGS, (char *)"\n"
+		"PolyhedralEdge_contrib(PolyhedralEdge self, int m, cvector_t qpa, complex_t qrperp) -> complex_t\n"
+		"\n"
+		"complex_t PolyhedralEdge::contrib(int m, const cvector_t qpa, complex_t qrperp) const\n"
+		"\n"
+		"Returns sum_l=0^M/2 u^2l v^(M-2l) / (2l+1)!(M-2l)! - vperp^M/M! \n"
+		"\n"
+		""},
+	 { (char *)"delete_PolyhedralEdge", _wrap_delete_PolyhedralEdge, METH_VARARGS, (char *)"delete_PolyhedralEdge(PolyhedralEdge self)"},
+	 { (char *)"PolyhedralEdge_swigregister", PolyhedralEdge_swigregister, METH_VARARGS, NULL},
+	 { (char *)"PolyhedralFace_diameter", _wrap_PolyhedralFace_diameter, METH_VARARGS, (char *)"PolyhedralFace_diameter(vector_kvector_t V) -> double"},
+	 { (char *)"new_PolyhedralFace", _wrap_new_PolyhedralFace, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace(vector_kvector_t _V, bool _sym_S2=False)\n"
+		"PolyhedralFace(vector_kvector_t _V)\n"
+		"new_PolyhedralFace() -> PolyhedralFace\n"
+		"\n"
+		"PolyhedralFace::PolyhedralFace(const std::vector< kvector_t > &_V=std::vector< kvector_t >(), bool _sym_S2=false)\n"
+		"\n"
+		"Sets internal variables for given vertex chain.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"V: \n"
+		"oriented vertex list\n"
+		"\n"
+		"_sym_S2: \n"
+		"true if face has a perpedicular two-fold symmetry axis \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_area", _wrap_PolyhedralFace_area, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_area(PolyhedralFace self) -> double\n"
+		"\n"
+		"double PolyhedralFace::area() const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_center", _wrap_PolyhedralFace_center, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_center(PolyhedralFace self) -> kvector_t\n"
+		"\n"
+		"kvector_t PolyhedralFace::center() const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_pyramidalVolume", _wrap_PolyhedralFace_pyramidalVolume, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_pyramidalVolume(PolyhedralFace self) -> double\n"
+		"\n"
+		"double PolyhedralFace::pyramidalVolume() const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_radius3d", _wrap_PolyhedralFace_radius3d, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_radius3d(PolyhedralFace self) -> double\n"
+		"\n"
+		"double PolyhedralFace::radius3d() const \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_normalProjectionConj", _wrap_PolyhedralFace_normalProjectionConj, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_normalProjectionConj(PolyhedralFace self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t PolyhedralFace::normalProjectionConj(cvector_t q) const\n"
+		"\n"
+		"Returns conj(q)*normal [ BasicVector3D::dot is antilinear in 'this' argument]. \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_ff_n", _wrap_PolyhedralFace_ff_n, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_ff_n(PolyhedralFace self, int m, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t PolyhedralFace::ff_n(int m, const cvector_t q) const\n"
+		"\n"
+		"Returns contribution qn*f_n [of order q^(n+1)] from this face to the polyhedral form factor. \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_ff", _wrap_PolyhedralFace_ff, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_ff(PolyhedralFace self, cvector_t q, bool const sym_Ci) -> complex_t\n"
+		"\n"
+		"complex_t PolyhedralFace::ff(const cvector_t q, const bool sym_Ci) const\n"
+		"\n"
+		"Returns the contribution ff(q) of this face to the polyhedral form factor. \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_ff_2D", _wrap_PolyhedralFace_ff_2D, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_ff_2D(PolyhedralFace self, cvector_t qpa) -> complex_t\n"
+		"\n"
+		"complex_t PolyhedralFace::ff_2D(const cvector_t qpa) const\n"
+		"\n"
+		"Returns the two-dimensional form factor of this face, for use in a prism. \n"
+		"\n"
+		""},
+	 { (char *)"PolyhedralFace_assert_Ci", _wrap_PolyhedralFace_assert_Ci, METH_VARARGS, (char *)"\n"
+		"PolyhedralFace_assert_Ci(PolyhedralFace self, PolyhedralFace other)\n"
+		"\n"
+		"void PolyhedralFace::assert_Ci(const PolyhedralFace &other) const\n"
+		"\n"
+		"Throws if deviation from inversion symmetry is detected. Does not check vertices. \n"
+		"\n"
+		""},
+	 { (char *)"delete_PolyhedralFace", _wrap_delete_PolyhedralFace, METH_VARARGS, (char *)"delete_PolyhedralFace(PolyhedralFace self)"},
+	 { (char *)"PolyhedralFace_swigregister", PolyhedralFace_swigregister, METH_VARARGS, NULL},
+	 { (char *)"FormFactorPolyhedron_evaluate_for_q", _wrap_FormFactorPolyhedron_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorPolyhedron_evaluate_for_q(FormFactorPolyhedron self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorPolyhedron::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns the form factor F(q) of this polyhedron, respecting the offset z_origin. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolyhedron_evaluate_centered", _wrap_FormFactorPolyhedron_evaluate_centered, METH_VARARGS, (char *)"\n"
+		"FormFactorPolyhedron_evaluate_centered(FormFactorPolyhedron self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorPolyhedron::evaluate_centered(const cvector_t q) const\n"
+		"\n"
+		"Returns the form factor F(q) of this polyhedron, with origin at z=0. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolyhedron_getVolume", _wrap_FormFactorPolyhedron_getVolume, METH_VARARGS, (char *)"\n"
+		"FormFactorPolyhedron_getVolume(FormFactorPolyhedron self) -> double\n"
+		"\n"
+		"double FormFactorPolyhedron::getVolume() const overridefinal\n"
+		"\n"
+		"Returns the total volume of the particle of this form factor's shape. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolyhedron_getRadialExtension", _wrap_FormFactorPolyhedron_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorPolyhedron_getRadialExtension(FormFactorPolyhedron self) -> double\n"
+		"\n"
+		"double FormFactorPolyhedron::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolyhedron_assert_platonic", _wrap_FormFactorPolyhedron_assert_platonic, METH_VARARGS, (char *)"\n"
+		"FormFactorPolyhedron_assert_platonic(FormFactorPolyhedron self)\n"
+		"\n"
+		"void FormFactorPolyhedron::assert_platonic() const\n"
+		"\n"
+		"Assertions for Platonic solid. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorPolyhedron", _wrap_delete_FormFactorPolyhedron, METH_VARARGS, (char *)"delete_FormFactorPolyhedron(FormFactorPolyhedron self)"},
+	 { (char *)"FormFactorPolyhedron_swigregister", FormFactorPolyhedron_swigregister, METH_VARARGS, NULL},
+	 { (char *)"FormFactorPolygonalPrism_evaluate_for_q", _wrap_FormFactorPolygonalPrism_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalPrism_evaluate_for_q(FormFactorPolygonalPrism self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorPolygonalPrism::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns the form factor F(q) of this polyhedron, respecting the offset height/2. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolygonalPrism_getVolume", _wrap_FormFactorPolygonalPrism_getVolume, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalPrism_getVolume(FormFactorPolygonalPrism self) -> double\n"
+		"\n"
+		"double FormFactorPolygonalPrism::getVolume() const\n"
+		"\n"
+		"Returns the volume of this prism. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolygonalPrism_getHeight", _wrap_FormFactorPolygonalPrism_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalPrism_getHeight(FormFactorPolygonalPrism self) -> double\n"
+		"\n"
+		"double FormFactorPolygonalPrism::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolygonalPrism_getRadialExtension", _wrap_FormFactorPolygonalPrism_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalPrism_getRadialExtension(FormFactorPolygonalPrism self) -> double\n"
+		"\n"
+		"double FormFactorPolygonalPrism::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorPolygonalPrism", _wrap_delete_FormFactorPolygonalPrism, METH_VARARGS, (char *)"delete_FormFactorPolygonalPrism(FormFactorPolygonalPrism self)"},
+	 { (char *)"FormFactorPolygonalPrism_swigregister", FormFactorPolygonalPrism_swigregister, METH_VARARGS, NULL},
+	 { (char *)"FormFactorPolygonalSurface_evaluate_for_q", _wrap_FormFactorPolygonalSurface_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalSurface_evaluate_for_q(FormFactorPolygonalSurface self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorPolygonalSurface::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolygonalSurface_getVolume", _wrap_FormFactorPolygonalSurface_getVolume, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalSurface_getVolume(FormFactorPolygonalSurface self) -> double\n"
+		"\n"
+		"double FormFactorPolygonalSurface::getVolume() const override\n"
+		"\n"
+		"Returns the total volume of the particle of this form factor's shape. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPolygonalSurface_getRadialExtension", _wrap_FormFactorPolygonalSurface_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorPolygonalSurface_getRadialExtension(FormFactorPolygonalSurface self) -> double\n"
+		"\n"
+		"double FormFactorPolygonalSurface::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorPolygonalSurface", _wrap_delete_FormFactorPolygonalSurface, METH_VARARGS, (char *)"delete_FormFactorPolygonalSurface(FormFactorPolygonalSurface self)"},
+	 { (char *)"FormFactorPolygonalSurface_swigregister", FormFactorPolygonalSurface_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorAnisoPyramid", _wrap_new_FormFactorAnisoPyramid, METH_VARARGS, (char *)"\n"
+		"new_FormFactorAnisoPyramid(double length, double width, double height, double alpha) -> FormFactorAnisoPyramid\n"
+		"\n"
+		"FormFactorAnisoPyramid::FormFactorAnisoPyramid(double length, double width, double height, double alpha)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of one side of the rectangular base\n"
+		"\n"
+		"width: \n"
+		"of other side of the rectangular base\n"
+		"\n"
+		"height: \n"
+		"of frustum\n"
+		"\n"
+		"alpha: \n"
+		"dihedral angle in radians between base and facet \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorAnisoPyramid_clone", _wrap_FormFactorAnisoPyramid_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorAnisoPyramid_clone(FormFactorAnisoPyramid self) -> FormFactorAnisoPyramid\n"
+		"\n"
+		"FormFactorAnisoPyramid* FormFactorAnisoPyramid::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorAnisoPyramid_accept", _wrap_FormFactorAnisoPyramid_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorAnisoPyramid_accept(FormFactorAnisoPyramid self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorAnisoPyramid::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorAnisoPyramid_getLength", _wrap_FormFactorAnisoPyramid_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorAnisoPyramid_getLength(FormFactorAnisoPyramid self) -> double\n"
+		"\n"
+		"double FormFactorAnisoPyramid::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorAnisoPyramid_getWidth", _wrap_FormFactorAnisoPyramid_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorAnisoPyramid_getWidth(FormFactorAnisoPyramid self) -> double\n"
+		"\n"
+		"double FormFactorAnisoPyramid::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorAnisoPyramid_getHeight", _wrap_FormFactorAnisoPyramid_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorAnisoPyramid_getHeight(FormFactorAnisoPyramid self) -> double\n"
+		"\n"
+		"double FormFactorAnisoPyramid::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorAnisoPyramid_getAlpha", _wrap_FormFactorAnisoPyramid_getAlpha, METH_VARARGS, (char *)"\n"
+		"FormFactorAnisoPyramid_getAlpha(FormFactorAnisoPyramid self) -> double\n"
+		"\n"
+		"double FormFactorAnisoPyramid::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorAnisoPyramid", _wrap_delete_FormFactorAnisoPyramid, METH_VARARGS, (char *)"delete_FormFactorAnisoPyramid(FormFactorAnisoPyramid self)"},
+	 { (char *)"FormFactorAnisoPyramid_swigregister", FormFactorAnisoPyramid_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorBox", _wrap_new_FormFactorBox, METH_VARARGS, (char *)"\n"
+		"new_FormFactorBox(double length, double width, double height) -> FormFactorBox\n"
+		"\n"
+		"FormFactorBox::FormFactorBox(double length, double width, double height)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of rectangular base\n"
+		"\n"
+		"width: \n"
+		"of rectangular base\n"
+		"\n"
+		"height: \n"
+		"of prism \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorBox_clone", _wrap_FormFactorBox_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorBox_clone(FormFactorBox self) -> FormFactorBox\n"
+		"\n"
+		"FormFactorBox* FormFactorBox::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorBox_accept", _wrap_FormFactorBox_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorBox_accept(FormFactorBox self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorBox::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorBox_getLength", _wrap_FormFactorBox_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorBox_getLength(FormFactorBox self) -> double\n"
+		"\n"
+		"double FormFactorBox::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorBox_getHeight", _wrap_FormFactorBox_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorBox_getHeight(FormFactorBox self) -> double\n"
+		"\n"
+		"double FormFactorBox::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorBox_getWidth", _wrap_FormFactorBox_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorBox_getWidth(FormFactorBox self) -> double\n"
+		"\n"
+		"double FormFactorBox::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorBox_getRadialExtension", _wrap_FormFactorBox_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorBox_getRadialExtension(FormFactorBox self) -> double\n"
+		"\n"
+		"double FormFactorBox::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorBox_evaluate_for_q", _wrap_FormFactorBox_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorBox_evaluate_for_q(FormFactorBox self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorBox::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorBox", _wrap_delete_FormFactorBox, METH_VARARGS, (char *)"delete_FormFactorBox(FormFactorBox self)"},
+	 { (char *)"FormFactorBox_swigregister", FormFactorBox_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorCone", _wrap_new_FormFactorCone, METH_VARARGS, (char *)"\n"
+		"new_FormFactorCone(double radius, double height, double alpha) -> FormFactorCone\n"
+		"\n"
+		"FormFactorCone::FormFactorCone(double radius, double height, double alpha)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"radius: \n"
+		"of circular base\n"
+		"\n"
+		"height: \n"
+		"of frustum\n"
+		"\n"
+		"alpha: \n"
+		"angle in radians between base and lateral surface \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone_clone", _wrap_FormFactorCone_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorCone_clone(FormFactorCone self) -> FormFactorCone\n"
+		"\n"
+		"FormFactorCone* FormFactorCone::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone_accept", _wrap_FormFactorCone_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorCone_accept(FormFactorCone self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorCone::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone_getHeight", _wrap_FormFactorCone_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorCone_getHeight(FormFactorCone self) -> double\n"
+		"\n"
+		"double FormFactorCone::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone_getAlpha", _wrap_FormFactorCone_getAlpha, METH_VARARGS, (char *)"\n"
+		"FormFactorCone_getAlpha(FormFactorCone self) -> double\n"
+		"\n"
+		"double FormFactorCone::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone_getRadius", _wrap_FormFactorCone_getRadius, METH_VARARGS, (char *)"\n"
+		"FormFactorCone_getRadius(FormFactorCone self) -> double\n"
+		"\n"
+		"double FormFactorCone::getRadius() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone_getRadialExtension", _wrap_FormFactorCone_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorCone_getRadialExtension(FormFactorCone self) -> double\n"
+		"\n"
+		"double FormFactorCone::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone_evaluate_for_q", _wrap_FormFactorCone_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorCone_evaluate_for_q(FormFactorCone self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorCone::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorCone", _wrap_delete_FormFactorCone, METH_VARARGS, (char *)"delete_FormFactorCone(FormFactorCone self)"},
+	 { (char *)"FormFactorCone_swigregister", FormFactorCone_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorCone6", _wrap_new_FormFactorCone6, METH_VARARGS, (char *)"\n"
+		"new_FormFactorCone6(double base_edge, double height, double alpha) -> FormFactorCone6\n"
+		"\n"
+		"FormFactorCone6::FormFactorCone6(double base_edge, double height, double alpha)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"base_edge: \n"
+		"of hexagonal base\n"
+		"\n"
+		"height: \n"
+		"of frustum\n"
+		"\n"
+		"alpha: \n"
+		"dihedral angle in radians between base and facet \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone6_clone", _wrap_FormFactorCone6_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorCone6_clone(FormFactorCone6 self) -> FormFactorCone6\n"
+		"\n"
+		"FormFactorCone6* FormFactorCone6::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone6_accept", _wrap_FormFactorCone6_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorCone6_accept(FormFactorCone6 self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorCone6::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone6_getBaseEdge", _wrap_FormFactorCone6_getBaseEdge, METH_VARARGS, (char *)"\n"
+		"FormFactorCone6_getBaseEdge(FormFactorCone6 self) -> double\n"
+		"\n"
+		"double FormFactorCone6::getBaseEdge() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone6_getHeight", _wrap_FormFactorCone6_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorCone6_getHeight(FormFactorCone6 self) -> double\n"
+		"\n"
+		"double FormFactorCone6::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCone6_getAlpha", _wrap_FormFactorCone6_getAlpha, METH_VARARGS, (char *)"\n"
+		"FormFactorCone6_getAlpha(FormFactorCone6 self) -> double\n"
+		"\n"
+		"double FormFactorCone6::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorCone6", _wrap_delete_FormFactorCone6, METH_VARARGS, (char *)"delete_FormFactorCone6(FormFactorCone6 self)"},
+	 { (char *)"FormFactorCone6_swigregister", FormFactorCone6_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorCrystal", _wrap_new_FormFactorCrystal, METH_VARARGS, (char *)"\n"
+		"new_FormFactorCrystal(Lattice lattice, IFormFactor basis_form_factor, IFormFactor meso_form_factor) -> FormFactorCrystal\n"
+		"\n"
+		"FormFactorCrystal::FormFactorCrystal(const Lattice &lattice, const IFormFactor &basis_form_factor, const IFormFactor &meso_form_factor)\n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorCrystal", _wrap_delete_FormFactorCrystal, METH_VARARGS, (char *)"\n"
+		"delete_FormFactorCrystal(FormFactorCrystal self)\n"
+		"\n"
+		"FormFactorCrystal::~FormFactorCrystal() overridefinal\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCrystal_clone", _wrap_FormFactorCrystal_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorCrystal_clone(FormFactorCrystal self) -> FormFactorCrystal\n"
+		"\n"
+		"FormFactorCrystal* FormFactorCrystal::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCrystal_accept", _wrap_FormFactorCrystal_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorCrystal_accept(FormFactorCrystal self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorCrystal::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCrystal_getVolume", _wrap_FormFactorCrystal_getVolume, METH_VARARGS, (char *)"\n"
+		"FormFactorCrystal_getVolume(FormFactorCrystal self) -> double\n"
+		"\n"
+		"double FormFactorCrystal::getVolume() const overridefinal\n"
+		"\n"
+		"Returns the total volume of the particle of this form factor's shape. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCrystal_getRadialExtension", _wrap_FormFactorCrystal_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorCrystal_getRadialExtension(FormFactorCrystal self) -> double\n"
+		"\n"
+		"double FormFactorCrystal::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCrystal_evaluate", _wrap_FormFactorCrystal_evaluate, METH_VARARGS, (char *)"\n"
+		"FormFactorCrystal_evaluate(FormFactorCrystal self, WavevectorInfo wavevectors) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorCrystal::evaluate(const WavevectorInfo &wavevectors) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex wavevectors ki, kf. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCrystal_swigregister", FormFactorCrystal_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorCuboctahedron", _wrap_new_FormFactorCuboctahedron, METH_VARARGS, (char *)"\n"
+		"new_FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha) -> FormFactorCuboctahedron\n"
+		"\n"
+		"FormFactorCuboctahedron::FormFactorCuboctahedron(double length, double height, double height_ratio, double alpha)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of one side of the square base\n"
+		"\n"
+		"height: \n"
+		"of bottom frustum\n"
+		"\n"
+		"height_ratio: \n"
+		"ratio of heights of top to bottom frustum\n"
+		"\n"
+		"alpha: \n"
+		"dihedral angle in radians between base and facet \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCuboctahedron_clone", _wrap_FormFactorCuboctahedron_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorCuboctahedron_clone(FormFactorCuboctahedron self) -> FormFactorCuboctahedron\n"
+		"\n"
+		"FormFactorCuboctahedron* FormFactorCuboctahedron::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCuboctahedron_accept", _wrap_FormFactorCuboctahedron_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorCuboctahedron_accept(FormFactorCuboctahedron self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorCuboctahedron::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCuboctahedron_getLength", _wrap_FormFactorCuboctahedron_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorCuboctahedron_getLength(FormFactorCuboctahedron self) -> double\n"
+		"\n"
+		"double FormFactorCuboctahedron::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCuboctahedron_getHeight", _wrap_FormFactorCuboctahedron_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorCuboctahedron_getHeight(FormFactorCuboctahedron self) -> double\n"
+		"\n"
+		"double FormFactorCuboctahedron::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCuboctahedron_getHeightRatio", _wrap_FormFactorCuboctahedron_getHeightRatio, METH_VARARGS, (char *)"\n"
+		"FormFactorCuboctahedron_getHeightRatio(FormFactorCuboctahedron self) -> double\n"
+		"\n"
+		"double FormFactorCuboctahedron::getHeightRatio() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCuboctahedron_getAlpha", _wrap_FormFactorCuboctahedron_getAlpha, METH_VARARGS, (char *)"\n"
+		"FormFactorCuboctahedron_getAlpha(FormFactorCuboctahedron self) -> double\n"
+		"\n"
+		"double FormFactorCuboctahedron::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorCuboctahedron", _wrap_delete_FormFactorCuboctahedron, METH_VARARGS, (char *)"delete_FormFactorCuboctahedron(FormFactorCuboctahedron self)"},
+	 { (char *)"FormFactorCuboctahedron_swigregister", FormFactorCuboctahedron_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorCylinder", _wrap_new_FormFactorCylinder, METH_VARARGS, (char *)"\n"
+		"new_FormFactorCylinder(double radius, double height) -> FormFactorCylinder\n"
+		"\n"
+		"FormFactorCylinder::FormFactorCylinder(double radius, double height)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCylinder_clone", _wrap_FormFactorCylinder_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorCylinder_clone(FormFactorCylinder self) -> FormFactorCylinder\n"
+		"\n"
+		"FormFactorCylinder* FormFactorCylinder::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCylinder_accept", _wrap_FormFactorCylinder_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorCylinder_accept(FormFactorCylinder self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorCylinder::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCylinder_getHeight", _wrap_FormFactorCylinder_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorCylinder_getHeight(FormFactorCylinder self) -> double\n"
+		"\n"
+		"double FormFactorCylinder::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCylinder_getRadius", _wrap_FormFactorCylinder_getRadius, METH_VARARGS, (char *)"\n"
+		"FormFactorCylinder_getRadius(FormFactorCylinder self) -> double\n"
+		"\n"
+		"double FormFactorCylinder::getRadius() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCylinder_getRadialExtension", _wrap_FormFactorCylinder_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorCylinder_getRadialExtension(FormFactorCylinder self) -> double\n"
+		"\n"
+		"double FormFactorCylinder::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorCylinder_evaluate_for_q", _wrap_FormFactorCylinder_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorCylinder_evaluate_for_q(FormFactorCylinder self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorCylinder::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorCylinder", _wrap_delete_FormFactorCylinder, METH_VARARGS, (char *)"delete_FormFactorCylinder(FormFactorCylinder self)"},
+	 { (char *)"FormFactorCylinder_swigregister", FormFactorCylinder_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorDecoratorDebyeWaller", _wrap_new_FormFactorDecoratorDebyeWaller, METH_VARARGS, (char *)"\n"
+		"FormFactorDecoratorDebyeWaller(IFormFactor form_factor, double dw_h_factor, double dw_r_factor)\n"
+		"new_FormFactorDecoratorDebyeWaller(IFormFactor form_factor, double dw_factor) -> FormFactorDecoratorDebyeWaller\n"
+		"\n"
+		"FormFactorDecoratorDebyeWaller::FormFactorDecoratorDebyeWaller(const IFormFactor &form_factor, double dw_factor)\n"
+		"\n"
+		"Isotropic Debye-Waller factor. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorDecoratorDebyeWaller_clone", _wrap_FormFactorDecoratorDebyeWaller_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorDecoratorDebyeWaller_clone(FormFactorDecoratorDebyeWaller self) -> FormFactorDecoratorDebyeWaller\n"
+		"\n"
+		"FormFactorDecoratorDebyeWaller* FormFactorDecoratorDebyeWaller::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorDecoratorDebyeWaller_accept", _wrap_FormFactorDecoratorDebyeWaller_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorDecoratorDebyeWaller_accept(FormFactorDecoratorDebyeWaller self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorDecoratorDebyeWaller::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorDecoratorDebyeWaller_evaluate", _wrap_FormFactorDecoratorDebyeWaller_evaluate, METH_VARARGS, (char *)"\n"
+		"FormFactorDecoratorDebyeWaller_evaluate(FormFactorDecoratorDebyeWaller self, WavevectorInfo wavevectors) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorDecoratorDebyeWaller::evaluate(const WavevectorInfo &wavevectors) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex wavevectors ki, kf. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorDecoratorDebyeWaller", _wrap_delete_FormFactorDecoratorDebyeWaller, METH_VARARGS, (char *)"delete_FormFactorDecoratorDebyeWaller(FormFactorDecoratorDebyeWaller self)"},
+	 { (char *)"FormFactorDecoratorDebyeWaller_swigregister", FormFactorDecoratorDebyeWaller_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorDodecahedron", _wrap_new_FormFactorDodecahedron, METH_VARARGS, (char *)"\n"
+		"new_FormFactorDodecahedron(double edge) -> FormFactorDodecahedron\n"
+		"\n"
+		"FormFactorDodecahedron::FormFactorDodecahedron(double edge)\n"
+		"\n"
+		"Constructs a regular dodecahedron.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"edge: \n"
+		"length \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorDodecahedron_clone", _wrap_FormFactorDodecahedron_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorDodecahedron_clone(FormFactorDodecahedron self) -> FormFactorDodecahedron\n"
+		"\n"
+		"FormFactorDodecahedron* FormFactorDodecahedron::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorDodecahedron_accept", _wrap_FormFactorDodecahedron_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorDodecahedron_accept(FormFactorDodecahedron self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorDodecahedron::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorDodecahedron_getEdge", _wrap_FormFactorDodecahedron_getEdge, METH_VARARGS, (char *)"\n"
+		"FormFactorDodecahedron_getEdge(FormFactorDodecahedron self) -> double\n"
+		"\n"
+		"double FormFactorDodecahedron::getEdge() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorDodecahedron", _wrap_delete_FormFactorDodecahedron, METH_VARARGS, (char *)"delete_FormFactorDodecahedron(FormFactorDodecahedron self)"},
+	 { (char *)"FormFactorDodecahedron_swigregister", FormFactorDodecahedron_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorEllipsoidalCylinder", _wrap_new_FormFactorEllipsoidalCylinder, METH_VARARGS, (char *)"\n"
+		"new_FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height) -> FormFactorEllipsoidalCylinder\n"
+		"\n"
+		"FormFactorEllipsoidalCylinder::FormFactorEllipsoidalCylinder(double radius_x, double radius_y, double height)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"radius_x: \n"
+		"half length of one horizontal main axes\n"
+		"\n"
+		"radius_y: \n"
+		"half length of the other horizontal main axes\n"
+		"\n"
+		"height: \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorEllipsoidalCylinder_clone", _wrap_FormFactorEllipsoidalCylinder_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorEllipsoidalCylinder_clone(FormFactorEllipsoidalCylinder self) -> FormFactorEllipsoidalCylinder\n"
+		"\n"
+		"FormFactorEllipsoidalCylinder* FormFactorEllipsoidalCylinder::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorEllipsoidalCylinder_accept", _wrap_FormFactorEllipsoidalCylinder_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorEllipsoidalCylinder_accept(FormFactorEllipsoidalCylinder self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorEllipsoidalCylinder::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorEllipsoidalCylinder_getRadiusX", _wrap_FormFactorEllipsoidalCylinder_getRadiusX, METH_VARARGS, (char *)"\n"
+		"FormFactorEllipsoidalCylinder_getRadiusX(FormFactorEllipsoidalCylinder self) -> double\n"
+		"\n"
+		"double FormFactorEllipsoidalCylinder::getRadiusX() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorEllipsoidalCylinder_getRadiusY", _wrap_FormFactorEllipsoidalCylinder_getRadiusY, METH_VARARGS, (char *)"\n"
+		"FormFactorEllipsoidalCylinder_getRadiusY(FormFactorEllipsoidalCylinder self) -> double\n"
+		"\n"
+		"double FormFactorEllipsoidalCylinder::getRadiusY() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorEllipsoidalCylinder_getHeight", _wrap_FormFactorEllipsoidalCylinder_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorEllipsoidalCylinder_getHeight(FormFactorEllipsoidalCylinder self) -> double\n"
+		"\n"
+		"double FormFactorEllipsoidalCylinder::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorEllipsoidalCylinder_getRadialExtension", _wrap_FormFactorEllipsoidalCylinder_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorEllipsoidalCylinder_getRadialExtension(FormFactorEllipsoidalCylinder self) -> double\n"
+		"\n"
+		"double FormFactorEllipsoidalCylinder::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorEllipsoidalCylinder_evaluate_for_q", _wrap_FormFactorEllipsoidalCylinder_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorEllipsoidalCylinder_evaluate_for_q(FormFactorEllipsoidalCylinder self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorEllipsoidalCylinder::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorEllipsoidalCylinder", _wrap_delete_FormFactorEllipsoidalCylinder, METH_VARARGS, (char *)"delete_FormFactorEllipsoidalCylinder(FormFactorEllipsoidalCylinder self)"},
+	 { (char *)"FormFactorEllipsoidalCylinder_swigregister", FormFactorEllipsoidalCylinder_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorFullSphere", _wrap_new_FormFactorFullSphere, METH_VARARGS, (char *)"\n"
+		"new_FormFactorFullSphere(double radius) -> FormFactorFullSphere\n"
+		"\n"
+		"FormFactorFullSphere::FormFactorFullSphere(double radius)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSphere_clone", _wrap_FormFactorFullSphere_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSphere_clone(FormFactorFullSphere self) -> FormFactorFullSphere\n"
+		"\n"
+		"FormFactorFullSphere* FormFactorFullSphere::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSphere_accept", _wrap_FormFactorFullSphere_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSphere_accept(FormFactorFullSphere self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorFullSphere::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSphere_getRadius", _wrap_FormFactorFullSphere_getRadius, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSphere_getRadius(FormFactorFullSphere self) -> double\n"
+		"\n"
+		"double FormFactorFullSphere::getRadius() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSphere_getRadialExtension", _wrap_FormFactorFullSphere_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSphere_getRadialExtension(FormFactorFullSphere self) -> double\n"
+		"\n"
+		"double FormFactorFullSphere::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSphere_evaluate_for_q", _wrap_FormFactorFullSphere_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSphere_evaluate_for_q(FormFactorFullSphere self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorFullSphere::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorFullSphere", _wrap_delete_FormFactorFullSphere, METH_VARARGS, (char *)"delete_FormFactorFullSphere(FormFactorFullSphere self)"},
+	 { (char *)"FormFactorFullSphere_swigregister", FormFactorFullSphere_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorFullSpheroid", _wrap_new_FormFactorFullSpheroid, METH_VARARGS, (char *)"\n"
+		"new_FormFactorFullSpheroid(double radius, double height) -> FormFactorFullSpheroid\n"
+		"\n"
+		"FormFactorFullSpheroid::FormFactorFullSpheroid(double radius, double height)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"radius: \n"
+		"of the two equal axes\n"
+		"\n"
+		"height: \n"
+		"total height of the spheroid, i.e. twice the radius of the third axis \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSpheroid_clone", _wrap_FormFactorFullSpheroid_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSpheroid_clone(FormFactorFullSpheroid self) -> FormFactorFullSpheroid\n"
+		"\n"
+		"FormFactorFullSpheroid* FormFactorFullSpheroid::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSpheroid_accept", _wrap_FormFactorFullSpheroid_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSpheroid_accept(FormFactorFullSpheroid self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorFullSpheroid::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSpheroid_getHeight", _wrap_FormFactorFullSpheroid_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSpheroid_getHeight(FormFactorFullSpheroid self) -> double\n"
+		"\n"
+		"double FormFactorFullSpheroid::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSpheroid_getRadius", _wrap_FormFactorFullSpheroid_getRadius, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSpheroid_getRadius(FormFactorFullSpheroid self) -> double\n"
+		"\n"
+		"double FormFactorFullSpheroid::getRadius() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSpheroid_getRadialExtension", _wrap_FormFactorFullSpheroid_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSpheroid_getRadialExtension(FormFactorFullSpheroid self) -> double\n"
+		"\n"
+		"double FormFactorFullSpheroid::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorFullSpheroid_evaluate_for_q", _wrap_FormFactorFullSpheroid_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorFullSpheroid_evaluate_for_q(FormFactorFullSpheroid self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorFullSpheroid::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorFullSpheroid", _wrap_delete_FormFactorFullSpheroid, METH_VARARGS, (char *)"delete_FormFactorFullSpheroid(FormFactorFullSpheroid self)"},
+	 { (char *)"FormFactorFullSpheroid_swigregister", FormFactorFullSpheroid_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorGauss", _wrap_new_FormFactorGauss, METH_VARARGS, (char *)"\n"
+		"FormFactorGauss(double length)\n"
+		"new_FormFactorGauss(double width, double height) -> FormFactorGauss\n"
+		"\n"
+		"FormFactorGauss::FormFactorGauss(double width, double height)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorGauss_clone", _wrap_FormFactorGauss_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorGauss_clone(FormFactorGauss self) -> FormFactorGauss\n"
+		"\n"
+		"FormFactorGauss* FormFactorGauss::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorGauss_accept", _wrap_FormFactorGauss_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorGauss_accept(FormFactorGauss self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorGauss::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorGauss_getWidth", _wrap_FormFactorGauss_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorGauss_getWidth(FormFactorGauss self) -> double\n"
+		"\n"
+		"double FormFactorGauss::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorGauss_getHeight", _wrap_FormFactorGauss_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorGauss_getHeight(FormFactorGauss self) -> double\n"
+		"\n"
+		"double FormFactorGauss::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorGauss_getRadialExtension", _wrap_FormFactorGauss_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorGauss_getRadialExtension(FormFactorGauss self) -> double\n"
+		"\n"
+		"double FormFactorGauss::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorGauss_evaluate_for_q", _wrap_FormFactorGauss_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorGauss_evaluate_for_q(FormFactorGauss self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorGauss::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorGauss", _wrap_delete_FormFactorGauss, METH_VARARGS, (char *)"delete_FormFactorGauss(FormFactorGauss self)"},
+	 { (char *)"FormFactorGauss_swigregister", FormFactorGauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorHemiEllipsoid", _wrap_new_FormFactorHemiEllipsoid, METH_VARARGS, (char *)"\n"
+		"new_FormFactorHemiEllipsoid(double radius_x, double radius_y, double height) -> FormFactorHemiEllipsoid\n"
+		"\n"
+		"FormFactorHemiEllipsoid::FormFactorHemiEllipsoid(double radius_x, double radius_y, double height)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"radius_x: \n"
+		"half length of one horizontal main axes\n"
+		"\n"
+		"radius_y: \n"
+		"half length of the other horizontal main axes\n"
+		"\n"
+		"height: \n"
+		"of the hemi ellipsoid \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorHemiEllipsoid", _wrap_delete_FormFactorHemiEllipsoid, METH_VARARGS, (char *)"\n"
+		"delete_FormFactorHemiEllipsoid(FormFactorHemiEllipsoid self)\n"
+		"\n"
+		"virtual FormFactorHemiEllipsoid::~FormFactorHemiEllipsoid()\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_clone", _wrap_FormFactorHemiEllipsoid_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorHemiEllipsoid_clone(FormFactorHemiEllipsoid self) -> FormFactorHemiEllipsoid\n"
+		"\n"
+		"FormFactorHemiEllipsoid* FormFactorHemiEllipsoid::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_accept", _wrap_FormFactorHemiEllipsoid_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorHemiEllipsoid_accept(FormFactorHemiEllipsoid self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorHemiEllipsoid::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_getHeight", _wrap_FormFactorHemiEllipsoid_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorHemiEllipsoid_getHeight(FormFactorHemiEllipsoid self) -> double\n"
+		"\n"
+		"double FormFactorHemiEllipsoid::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_getRadiusX", _wrap_FormFactorHemiEllipsoid_getRadiusX, METH_VARARGS, (char *)"\n"
+		"FormFactorHemiEllipsoid_getRadiusX(FormFactorHemiEllipsoid self) -> double\n"
+		"\n"
+		"double FormFactorHemiEllipsoid::getRadiusX() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_getRadiusY", _wrap_FormFactorHemiEllipsoid_getRadiusY, METH_VARARGS, (char *)"\n"
+		"FormFactorHemiEllipsoid_getRadiusY(FormFactorHemiEllipsoid self) -> double\n"
+		"\n"
+		"double FormFactorHemiEllipsoid::getRadiusY() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_getRadialExtension", _wrap_FormFactorHemiEllipsoid_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorHemiEllipsoid_getRadialExtension(FormFactorHemiEllipsoid self) -> double\n"
+		"\n"
+		"double FormFactorHemiEllipsoid::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_evaluate_for_q", _wrap_FormFactorHemiEllipsoid_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorHemiEllipsoid_evaluate_for_q(FormFactorHemiEllipsoid self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorHemiEllipsoid::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorHemiEllipsoid_swigregister", FormFactorHemiEllipsoid_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorIcosahedron", _wrap_new_FormFactorIcosahedron, METH_VARARGS, (char *)"\n"
+		"new_FormFactorIcosahedron(double edge) -> FormFactorIcosahedron\n"
+		"\n"
+		"FormFactorIcosahedron::FormFactorIcosahedron(double edge)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorIcosahedron_clone", _wrap_FormFactorIcosahedron_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorIcosahedron_clone(FormFactorIcosahedron self) -> FormFactorIcosahedron\n"
+		"\n"
+		"FormFactorIcosahedron* FormFactorIcosahedron::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorIcosahedron_accept", _wrap_FormFactorIcosahedron_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorIcosahedron_accept(FormFactorIcosahedron self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorIcosahedron::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorIcosahedron_getEdge", _wrap_FormFactorIcosahedron_getEdge, METH_VARARGS, (char *)"\n"
+		"FormFactorIcosahedron_getEdge(FormFactorIcosahedron self) -> double\n"
+		"\n"
+		"double FormFactorIcosahedron::getEdge() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorIcosahedron", _wrap_delete_FormFactorIcosahedron, METH_VARARGS, (char *)"delete_FormFactorIcosahedron(FormFactorIcosahedron self)"},
+	 { (char *)"FormFactorIcosahedron_swigregister", FormFactorIcosahedron_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorLongBoxGauss", _wrap_new_FormFactorLongBoxGauss, METH_VARARGS, (char *)"\n"
+		"new_FormFactorLongBoxGauss(double length, double width, double height) -> FormFactorLongBoxGauss\n"
+		"\n"
+		"FormFactorLongBoxGauss::FormFactorLongBoxGauss(double length, double width, double height)\n"
+		"\n"
+		"Box constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Box's base\n"
+		"\n"
+		"width: \n"
+		"of Box's base\n"
+		"\n"
+		"height: \n"
+		"of Box \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxGauss_clone", _wrap_FormFactorLongBoxGauss_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxGauss_clone(FormFactorLongBoxGauss self) -> FormFactorLongBoxGauss\n"
+		"\n"
+		"FormFactorLongBoxGauss* FormFactorLongBoxGauss::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxGauss_accept", _wrap_FormFactorLongBoxGauss_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxGauss_accept(FormFactorLongBoxGauss self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorLongBoxGauss::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxGauss_getLength", _wrap_FormFactorLongBoxGauss_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxGauss_getLength(FormFactorLongBoxGauss self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxGauss::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxGauss_getHeight", _wrap_FormFactorLongBoxGauss_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxGauss_getHeight(FormFactorLongBoxGauss self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxGauss::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxGauss_getWidth", _wrap_FormFactorLongBoxGauss_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxGauss_getWidth(FormFactorLongBoxGauss self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxGauss::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxGauss_getRadialExtension", _wrap_FormFactorLongBoxGauss_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxGauss_getRadialExtension(FormFactorLongBoxGauss self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxGauss::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxGauss_evaluate_for_q", _wrap_FormFactorLongBoxGauss_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxGauss_evaluate_for_q(FormFactorLongBoxGauss self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorLongBoxGauss::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorLongBoxGauss", _wrap_delete_FormFactorLongBoxGauss, METH_VARARGS, (char *)"delete_FormFactorLongBoxGauss(FormFactorLongBoxGauss self)"},
+	 { (char *)"FormFactorLongBoxGauss_swigregister", FormFactorLongBoxGauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorLongBoxLorentz", _wrap_new_FormFactorLongBoxLorentz, METH_VARARGS, (char *)"\n"
+		"new_FormFactorLongBoxLorentz(double length, double width, double height) -> FormFactorLongBoxLorentz\n"
+		"\n"
+		"FormFactorLongBoxLorentz::FormFactorLongBoxLorentz(double length, double width, double height)\n"
+		"\n"
+		"Box constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Box's base\n"
+		"\n"
+		"width: \n"
+		"of Box's base\n"
+		"\n"
+		"height: \n"
+		"of Box \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxLorentz_clone", _wrap_FormFactorLongBoxLorentz_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxLorentz_clone(FormFactorLongBoxLorentz self) -> FormFactorLongBoxLorentz\n"
+		"\n"
+		"FormFactorLongBoxLorentz* FormFactorLongBoxLorentz::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxLorentz_accept", _wrap_FormFactorLongBoxLorentz_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxLorentz_accept(FormFactorLongBoxLorentz self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorLongBoxLorentz::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxLorentz_getLength", _wrap_FormFactorLongBoxLorentz_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxLorentz_getLength(FormFactorLongBoxLorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxLorentz::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxLorentz_getHeight", _wrap_FormFactorLongBoxLorentz_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxLorentz_getHeight(FormFactorLongBoxLorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxLorentz::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxLorentz_getWidth", _wrap_FormFactorLongBoxLorentz_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxLorentz_getWidth(FormFactorLongBoxLorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxLorentz::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxLorentz_getRadialExtension", _wrap_FormFactorLongBoxLorentz_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxLorentz_getRadialExtension(FormFactorLongBoxLorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongBoxLorentz::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongBoxLorentz_evaluate_for_q", _wrap_FormFactorLongBoxLorentz_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorLongBoxLorentz_evaluate_for_q(FormFactorLongBoxLorentz self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorLongBoxLorentz::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorLongBoxLorentz", _wrap_delete_FormFactorLongBoxLorentz, METH_VARARGS, (char *)"delete_FormFactorLongBoxLorentz(FormFactorLongBoxLorentz self)"},
+	 { (char *)"FormFactorLongBoxLorentz_swigregister", FormFactorLongBoxLorentz_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorLongRipple1Gauss", _wrap_new_FormFactorLongRipple1Gauss, METH_VARARGS, (char *)"\n"
+		"new_FormFactorLongRipple1Gauss(double length, double width, double height) -> FormFactorLongRipple1Gauss\n"
+		"\n"
+		"FormFactorLongRipple1Gauss::FormFactorLongRipple1Gauss(double length, double width, double height)\n"
+		"\n"
+		"Ripple1 constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Ripple1\n"
+		"\n"
+		"width: \n"
+		"of cosine cross section\n"
+		"\n"
+		"height: \n"
+		"of cosine cross section \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Gauss_clone", _wrap_FormFactorLongRipple1Gauss_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Gauss_clone(FormFactorLongRipple1Gauss self) -> FormFactorLongRipple1Gauss\n"
+		"\n"
+		"FormFactorLongRipple1Gauss* FormFactorLongRipple1Gauss::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Gauss_accept", _wrap_FormFactorLongRipple1Gauss_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Gauss_accept(FormFactorLongRipple1Gauss self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorLongRipple1Gauss::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Gauss_getHeight", _wrap_FormFactorLongRipple1Gauss_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Gauss_getHeight(FormFactorLongRipple1Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Gauss::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Gauss_getWidth", _wrap_FormFactorLongRipple1Gauss_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Gauss_getWidth(FormFactorLongRipple1Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Gauss::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Gauss_getLength", _wrap_FormFactorLongRipple1Gauss_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Gauss_getLength(FormFactorLongRipple1Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Gauss::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Gauss_getRadialExtension", _wrap_FormFactorLongRipple1Gauss_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Gauss_getRadialExtension(FormFactorLongRipple1Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Gauss::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Gauss_evaluate_for_q", _wrap_FormFactorLongRipple1Gauss_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Gauss_evaluate_for_q(FormFactorLongRipple1Gauss self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorLongRipple1Gauss::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Complex formfactor. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorLongRipple1Gauss", _wrap_delete_FormFactorLongRipple1Gauss, METH_VARARGS, (char *)"delete_FormFactorLongRipple1Gauss(FormFactorLongRipple1Gauss self)"},
+	 { (char *)"FormFactorLongRipple1Gauss_swigregister", FormFactorLongRipple1Gauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorLongRipple1Lorentz", _wrap_new_FormFactorLongRipple1Lorentz, METH_VARARGS, (char *)"\n"
+		"new_FormFactorLongRipple1Lorentz(double length, double width, double height) -> FormFactorLongRipple1Lorentz\n"
+		"\n"
+		"FormFactorLongRipple1Lorentz::FormFactorLongRipple1Lorentz(double length, double width, double height)\n"
+		"\n"
+		"FormFactorLongRipple1Lorentz constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Ripple1\n"
+		"\n"
+		"width: \n"
+		"of cosine cross section\n"
+		"\n"
+		"height: \n"
+		"of cosine cross section \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Lorentz_clone", _wrap_FormFactorLongRipple1Lorentz_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Lorentz_clone(FormFactorLongRipple1Lorentz self) -> FormFactorLongRipple1Lorentz\n"
+		"\n"
+		"FormFactorLongRipple1Lorentz* FormFactorLongRipple1Lorentz::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Lorentz_accept", _wrap_FormFactorLongRipple1Lorentz_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Lorentz_accept(FormFactorLongRipple1Lorentz self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorLongRipple1Lorentz::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Lorentz_getRadialExtension", _wrap_FormFactorLongRipple1Lorentz_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Lorentz_getRadialExtension(FormFactorLongRipple1Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Lorentz::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Lorentz_getHeight", _wrap_FormFactorLongRipple1Lorentz_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Lorentz_getHeight(FormFactorLongRipple1Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Lorentz::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Lorentz_getWidth", _wrap_FormFactorLongRipple1Lorentz_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Lorentz_getWidth(FormFactorLongRipple1Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Lorentz::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Lorentz_getLength", _wrap_FormFactorLongRipple1Lorentz_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Lorentz_getLength(FormFactorLongRipple1Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple1Lorentz::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple1Lorentz_evaluate_for_q", _wrap_FormFactorLongRipple1Lorentz_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple1Lorentz_evaluate_for_q(FormFactorLongRipple1Lorentz self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorLongRipple1Lorentz::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Complex formfactor. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorLongRipple1Lorentz", _wrap_delete_FormFactorLongRipple1Lorentz, METH_VARARGS, (char *)"delete_FormFactorLongRipple1Lorentz(FormFactorLongRipple1Lorentz self)"},
+	 { (char *)"FormFactorLongRipple1Lorentz_swigregister", FormFactorLongRipple1Lorentz_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorLongRipple2Gauss", _wrap_new_FormFactorLongRipple2Gauss, METH_VARARGS, (char *)"\n"
+		"new_FormFactorLongRipple2Gauss(double length, double width, double height, double asymmetry) -> FormFactorLongRipple2Gauss\n"
+		"\n"
+		"FormFactorLongRipple2Gauss::FormFactorLongRipple2Gauss(double length, double width, double height, double asymmetry)\n"
+		"\n"
+		"FormFactorLongRipple2Gauss constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Ripple2\n"
+		"\n"
+		"width: \n"
+		"of triangular cross section\n"
+		"\n"
+		"height: \n"
+		"of triangular cross section\n"
+		"\n"
+		"asymmetry: \n"
+		"length of triangular cross section \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_clone", _wrap_FormFactorLongRipple2Gauss_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_clone(FormFactorLongRipple2Gauss self) -> FormFactorLongRipple2Gauss\n"
+		"\n"
+		"FormFactorLongRipple2Gauss* FormFactorLongRipple2Gauss::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_accept", _wrap_FormFactorLongRipple2Gauss_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_accept(FormFactorLongRipple2Gauss self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorLongRipple2Gauss::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_getHeight", _wrap_FormFactorLongRipple2Gauss_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_getHeight(FormFactorLongRipple2Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Gauss::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_getWidth", _wrap_FormFactorLongRipple2Gauss_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_getWidth(FormFactorLongRipple2Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Gauss::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_getLength", _wrap_FormFactorLongRipple2Gauss_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_getLength(FormFactorLongRipple2Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Gauss::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_getAsymmetry", _wrap_FormFactorLongRipple2Gauss_getAsymmetry, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_getAsymmetry(FormFactorLongRipple2Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Gauss::getAsymmetry() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_getRadialExtension", _wrap_FormFactorLongRipple2Gauss_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_getRadialExtension(FormFactorLongRipple2Gauss self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Gauss::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Gauss_evaluate_for_q", _wrap_FormFactorLongRipple2Gauss_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Gauss_evaluate_for_q(FormFactorLongRipple2Gauss self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorLongRipple2Gauss::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Complex formfactor. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorLongRipple2Gauss", _wrap_delete_FormFactorLongRipple2Gauss, METH_VARARGS, (char *)"delete_FormFactorLongRipple2Gauss(FormFactorLongRipple2Gauss self)"},
+	 { (char *)"FormFactorLongRipple2Gauss_swigregister", FormFactorLongRipple2Gauss_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorLongRipple2Lorentz", _wrap_new_FormFactorLongRipple2Lorentz, METH_VARARGS, (char *)"\n"
+		"new_FormFactorLongRipple2Lorentz(double length, double width, double height, double asymmetry) -> FormFactorLongRipple2Lorentz\n"
+		"\n"
+		"FormFactorLongRipple2Lorentz::FormFactorLongRipple2Lorentz(double length, double width, double height, double asymmetry)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Ripple2\n"
+		"\n"
+		"width: \n"
+		"of triangular cross section\n"
+		"\n"
+		"height: \n"
+		"of triangular cross section\n"
+		"\n"
+		"asymmetry: \n"
+		"length of triangular cross section \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_clone", _wrap_FormFactorLongRipple2Lorentz_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_clone(FormFactorLongRipple2Lorentz self) -> FormFactorLongRipple2Lorentz\n"
+		"\n"
+		"FormFactorLongRipple2Lorentz* FormFactorLongRipple2Lorentz::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_accept", _wrap_FormFactorLongRipple2Lorentz_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_accept(FormFactorLongRipple2Lorentz self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorLongRipple2Lorentz::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_getHeight", _wrap_FormFactorLongRipple2Lorentz_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_getHeight(FormFactorLongRipple2Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Lorentz::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_getWidth", _wrap_FormFactorLongRipple2Lorentz_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_getWidth(FormFactorLongRipple2Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Lorentz::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_getLength", _wrap_FormFactorLongRipple2Lorentz_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_getLength(FormFactorLongRipple2Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Lorentz::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_getAsymmetry", _wrap_FormFactorLongRipple2Lorentz_getAsymmetry, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_getAsymmetry(FormFactorLongRipple2Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Lorentz::getAsymmetry() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_getRadialExtension", _wrap_FormFactorLongRipple2Lorentz_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_getRadialExtension(FormFactorLongRipple2Lorentz self) -> double\n"
+		"\n"
+		"double FormFactorLongRipple2Lorentz::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLongRipple2Lorentz_evaluate_for_q", _wrap_FormFactorLongRipple2Lorentz_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorLongRipple2Lorentz_evaluate_for_q(FormFactorLongRipple2Lorentz self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorLongRipple2Lorentz::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Complex formfactor. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorLongRipple2Lorentz", _wrap_delete_FormFactorLongRipple2Lorentz, METH_VARARGS, (char *)"delete_FormFactorLongRipple2Lorentz(FormFactorLongRipple2Lorentz self)"},
+	 { (char *)"FormFactorLongRipple2Lorentz_swigregister", FormFactorLongRipple2Lorentz_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorLorentz", _wrap_new_FormFactorLorentz, METH_VARARGS, (char *)"\n"
+		"FormFactorLorentz(double length)\n"
+		"new_FormFactorLorentz(double width, double height) -> FormFactorLorentz\n"
+		"\n"
+		"FormFactorLorentz::FormFactorLorentz(double width, double height)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLorentz_clone", _wrap_FormFactorLorentz_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorLorentz_clone(FormFactorLorentz self) -> FormFactorLorentz\n"
+		"\n"
+		"FormFactorLorentz* FormFactorLorentz::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLorentz_accept", _wrap_FormFactorLorentz_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorLorentz_accept(FormFactorLorentz self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorLorentz::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLorentz_getWidth", _wrap_FormFactorLorentz_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorLorentz_getWidth(FormFactorLorentz self) -> double\n"
+		"\n"
+		"double FormFactorLorentz::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLorentz_getHeight", _wrap_FormFactorLorentz_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorLorentz_getHeight(FormFactorLorentz self) -> double\n"
+		"\n"
+		"double FormFactorLorentz::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLorentz_getRadialExtension", _wrap_FormFactorLorentz_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorLorentz_getRadialExtension(FormFactorLorentz self) -> double\n"
+		"\n"
+		"double FormFactorLorentz::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorLorentz_evaluate_for_q", _wrap_FormFactorLorentz_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorLorentz_evaluate_for_q(FormFactorLorentz self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorLorentz::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorLorentz", _wrap_delete_FormFactorLorentz, METH_VARARGS, (char *)"delete_FormFactorLorentz(FormFactorLorentz self)"},
+	 { (char *)"FormFactorLorentz_swigregister", FormFactorLorentz_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorPrism3", _wrap_new_FormFactorPrism3, METH_VARARGS, (char *)"\n"
+		"new_FormFactorPrism3(double const base_edge, double const height) -> FormFactorPrism3\n"
+		"\n"
+		"FormFactorPrism3::FormFactorPrism3(const double base_edge, const double height)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPrism3_clone", _wrap_FormFactorPrism3_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorPrism3_clone(FormFactorPrism3 self) -> FormFactorPrism3\n"
+		"\n"
+		"FormFactorPrism3* FormFactorPrism3::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPrism3_accept", _wrap_FormFactorPrism3_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorPrism3_accept(FormFactorPrism3 self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorPrism3::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPrism3_getBaseEdge", _wrap_FormFactorPrism3_getBaseEdge, METH_VARARGS, (char *)"\n"
+		"FormFactorPrism3_getBaseEdge(FormFactorPrism3 self) -> double\n"
+		"\n"
+		"double FormFactorPrism3::getBaseEdge() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorPrism3", _wrap_delete_FormFactorPrism3, METH_VARARGS, (char *)"delete_FormFactorPrism3(FormFactorPrism3 self)"},
+	 { (char *)"FormFactorPrism3_swigregister", FormFactorPrism3_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorPrism6", _wrap_new_FormFactorPrism6, METH_VARARGS, (char *)"\n"
+		"new_FormFactorPrism6(double const base_edge, double const height) -> FormFactorPrism6\n"
+		"\n"
+		"FormFactorPrism6::FormFactorPrism6(const double base_edge, const double height)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPrism6_clone", _wrap_FormFactorPrism6_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorPrism6_clone(FormFactorPrism6 self) -> FormFactorPrism6\n"
+		"\n"
+		"FormFactorPrism6* FormFactorPrism6::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPrism6_accept", _wrap_FormFactorPrism6_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorPrism6_accept(FormFactorPrism6 self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorPrism6::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPrism6_getBaseEdge", _wrap_FormFactorPrism6_getBaseEdge, METH_VARARGS, (char *)"\n"
+		"FormFactorPrism6_getBaseEdge(FormFactorPrism6 self) -> double\n"
+		"\n"
+		"double FormFactorPrism6::getBaseEdge() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorPrism6", _wrap_delete_FormFactorPrism6, METH_VARARGS, (char *)"delete_FormFactorPrism6(FormFactorPrism6 self)"},
+	 { (char *)"FormFactorPrism6_swigregister", FormFactorPrism6_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorPyramid", _wrap_new_FormFactorPyramid, METH_VARARGS, (char *)"\n"
+		"new_FormFactorPyramid(double base_edge, double height, double alpha) -> FormFactorPyramid\n"
+		"\n"
+		"FormFactorPyramid::FormFactorPyramid(double base_edge, double height, double alpha)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"base_edge: \n"
+		"of one side of the square base\n"
+		"\n"
+		"height: \n"
+		"of the frustum\n"
+		"\n"
+		"alpha: \n"
+		"dihedral angle in radians between base and facet \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPyramid_clone", _wrap_FormFactorPyramid_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorPyramid_clone(FormFactorPyramid self) -> FormFactorPyramid\n"
+		"\n"
+		"FormFactorPyramid* FormFactorPyramid::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPyramid_accept", _wrap_FormFactorPyramid_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorPyramid_accept(FormFactorPyramid self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorPyramid::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPyramid_getHeight", _wrap_FormFactorPyramid_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorPyramid_getHeight(FormFactorPyramid self) -> double\n"
+		"\n"
+		"double FormFactorPyramid::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPyramid_getBaseEdge", _wrap_FormFactorPyramid_getBaseEdge, METH_VARARGS, (char *)"\n"
+		"FormFactorPyramid_getBaseEdge(FormFactorPyramid self) -> double\n"
+		"\n"
+		"double FormFactorPyramid::getBaseEdge() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorPyramid_getAlpha", _wrap_FormFactorPyramid_getAlpha, METH_VARARGS, (char *)"\n"
+		"FormFactorPyramid_getAlpha(FormFactorPyramid self) -> double\n"
+		"\n"
+		"double FormFactorPyramid::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorPyramid", _wrap_delete_FormFactorPyramid, METH_VARARGS, (char *)"delete_FormFactorPyramid(FormFactorPyramid self)"},
+	 { (char *)"FormFactorPyramid_swigregister", FormFactorPyramid_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorRipple1", _wrap_new_FormFactorRipple1, METH_VARARGS, (char *)"\n"
+		"new_FormFactorRipple1(double length, double width, double height) -> FormFactorRipple1\n"
+		"\n"
+		"FormFactorRipple1::FormFactorRipple1(double length, double width, double height)\n"
+		"\n"
+		"Ripple1 constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Ripple1\n"
+		"\n"
+		"width: \n"
+		"of cosine cross section\n"
+		"\n"
+		"height: \n"
+		"of cosine cross section \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple1_clone", _wrap_FormFactorRipple1_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple1_clone(FormFactorRipple1 self) -> FormFactorRipple1\n"
+		"\n"
+		"FormFactorRipple1* FormFactorRipple1::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple1_accept", _wrap_FormFactorRipple1_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple1_accept(FormFactorRipple1 self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorRipple1::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple1_getLength", _wrap_FormFactorRipple1_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple1_getLength(FormFactorRipple1 self) -> double\n"
+		"\n"
+		"double FormFactorRipple1::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple1_getHeight", _wrap_FormFactorRipple1_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple1_getHeight(FormFactorRipple1 self) -> double\n"
+		"\n"
+		"double FormFactorRipple1::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple1_getWidth", _wrap_FormFactorRipple1_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple1_getWidth(FormFactorRipple1 self) -> double\n"
+		"\n"
+		"double FormFactorRipple1::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple1_getRadialExtension", _wrap_FormFactorRipple1_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple1_getRadialExtension(FormFactorRipple1 self) -> double\n"
+		"\n"
+		"double FormFactorRipple1::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple1_evaluate_for_q", _wrap_FormFactorRipple1_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple1_evaluate_for_q(FormFactorRipple1 self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorRipple1::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Complex formfactor. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorRipple1", _wrap_delete_FormFactorRipple1, METH_VARARGS, (char *)"delete_FormFactorRipple1(FormFactorRipple1 self)"},
+	 { (char *)"FormFactorRipple1_swigregister", FormFactorRipple1_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorRipple2", _wrap_new_FormFactorRipple2, METH_VARARGS, (char *)"\n"
+		"new_FormFactorRipple2(double length, double width, double height, double asymmetry) -> FormFactorRipple2\n"
+		"\n"
+		"FormFactorRipple2::FormFactorRipple2(double length, double width, double height, double asymmetry)\n"
+		"\n"
+		"Ripple2 constructor.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of Ripple2\n"
+		"\n"
+		"width: \n"
+		"of triangular cross section\n"
+		"\n"
+		"height: \n"
+		"of triangular cross section\n"
+		"\n"
+		"asymmetry: \n"
+		"length of triangular cross section \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_clone", _wrap_FormFactorRipple2_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_clone(FormFactorRipple2 self) -> FormFactorRipple2\n"
+		"\n"
+		"FormFactorRipple2* FormFactorRipple2::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_accept", _wrap_FormFactorRipple2_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_accept(FormFactorRipple2 self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorRipple2::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_getHeight", _wrap_FormFactorRipple2_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_getHeight(FormFactorRipple2 self) -> double\n"
+		"\n"
+		"double FormFactorRipple2::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_getWidth", _wrap_FormFactorRipple2_getWidth, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_getWidth(FormFactorRipple2 self) -> double\n"
+		"\n"
+		"double FormFactorRipple2::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_getLength", _wrap_FormFactorRipple2_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_getLength(FormFactorRipple2 self) -> double\n"
+		"\n"
+		"double FormFactorRipple2::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_getAsymmetry", _wrap_FormFactorRipple2_getAsymmetry, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_getAsymmetry(FormFactorRipple2 self) -> double\n"
+		"\n"
+		"double FormFactorRipple2::getAsymmetry() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_getRadialExtension", _wrap_FormFactorRipple2_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_getRadialExtension(FormFactorRipple2 self) -> double\n"
+		"\n"
+		"double FormFactorRipple2::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorRipple2_evaluate_for_q", _wrap_FormFactorRipple2_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorRipple2_evaluate_for_q(FormFactorRipple2 self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorRipple2::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Complex formfactor. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorRipple2", _wrap_delete_FormFactorRipple2, METH_VARARGS, (char *)"delete_FormFactorRipple2(FormFactorRipple2 self)"},
+	 { (char *)"FormFactorRipple2_swigregister", FormFactorRipple2_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorSphereGaussianRadius", _wrap_new_FormFactorSphereGaussianRadius, METH_VARARGS, (char *)"\n"
+		"new_FormFactorSphereGaussianRadius(double mean, double sigma) -> FormFactorSphereGaussianRadius\n"
+		"\n"
+		"FormFactorSphereGaussianRadius::FormFactorSphereGaussianRadius(double mean, double sigma)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereGaussianRadius_clone", _wrap_FormFactorSphereGaussianRadius_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereGaussianRadius_clone(FormFactorSphereGaussianRadius self) -> FormFactorSphereGaussianRadius\n"
+		"\n"
+		"FormFactorSphereGaussianRadius* FormFactorSphereGaussianRadius::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereGaussianRadius_accept", _wrap_FormFactorSphereGaussianRadius_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereGaussianRadius_accept(FormFactorSphereGaussianRadius self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorSphereGaussianRadius::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereGaussianRadius_getRadialExtension", _wrap_FormFactorSphereGaussianRadius_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereGaussianRadius_getRadialExtension(FormFactorSphereGaussianRadius self) -> double\n"
+		"\n"
+		"double FormFactorSphereGaussianRadius::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereGaussianRadius_evaluate_for_q", _wrap_FormFactorSphereGaussianRadius_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereGaussianRadius_evaluate_for_q(FormFactorSphereGaussianRadius self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorSphereGaussianRadius::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorSphereGaussianRadius", _wrap_delete_FormFactorSphereGaussianRadius, METH_VARARGS, (char *)"delete_FormFactorSphereGaussianRadius(FormFactorSphereGaussianRadius self)"},
+	 { (char *)"FormFactorSphereGaussianRadius_swigregister", FormFactorSphereGaussianRadius_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorSphereLogNormalRadius", _wrap_new_FormFactorSphereLogNormalRadius, METH_VARARGS, (char *)"\n"
+		"new_FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples) -> FormFactorSphereLogNormalRadius\n"
+		"\n"
+		"FormFactorSphereLogNormalRadius::FormFactorSphereLogNormalRadius(double mean, double scale_param, size_t n_samples)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereLogNormalRadius_clone", _wrap_FormFactorSphereLogNormalRadius_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereLogNormalRadius_clone(FormFactorSphereLogNormalRadius self) -> FormFactorSphereLogNormalRadius\n"
+		"\n"
+		"FormFactorSphereLogNormalRadius* FormFactorSphereLogNormalRadius::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereLogNormalRadius_accept", _wrap_FormFactorSphereLogNormalRadius_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereLogNormalRadius_accept(FormFactorSphereLogNormalRadius self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorSphereLogNormalRadius::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereLogNormalRadius_getRadialExtension", _wrap_FormFactorSphereLogNormalRadius_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereLogNormalRadius_getRadialExtension(FormFactorSphereLogNormalRadius self) -> double\n"
+		"\n"
+		"double FormFactorSphereLogNormalRadius::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereLogNormalRadius_evaluate_for_q", _wrap_FormFactorSphereLogNormalRadius_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereLogNormalRadius_evaluate_for_q(FormFactorSphereLogNormalRadius self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorSphereLogNormalRadius::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorSphereLogNormalRadius", _wrap_delete_FormFactorSphereLogNormalRadius, METH_VARARGS, (char *)"delete_FormFactorSphereLogNormalRadius(FormFactorSphereLogNormalRadius self)"},
+	 { (char *)"FormFactorSphereLogNormalRadius_swigregister", FormFactorSphereLogNormalRadius_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorSphereUniformRadius", _wrap_new_FormFactorSphereUniformRadius, METH_VARARGS, (char *)"\n"
+		"new_FormFactorSphereUniformRadius(double mean, double full_width) -> FormFactorSphereUniformRadius\n"
+		"\n"
+		"FormFactorSphereUniformRadius::FormFactorSphereUniformRadius(double mean, double full_width)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereUniformRadius_clone", _wrap_FormFactorSphereUniformRadius_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereUniformRadius_clone(FormFactorSphereUniformRadius self) -> FormFactorSphereUniformRadius\n"
+		"\n"
+		"FormFactorSphereUniformRadius* FormFactorSphereUniformRadius::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereUniformRadius_accept", _wrap_FormFactorSphereUniformRadius_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereUniformRadius_accept(FormFactorSphereUniformRadius self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorSphereUniformRadius::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereUniformRadius_getRadialExtension", _wrap_FormFactorSphereUniformRadius_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereUniformRadius_getRadialExtension(FormFactorSphereUniformRadius self) -> double\n"
+		"\n"
+		"double FormFactorSphereUniformRadius::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorSphereUniformRadius_evaluate_for_q", _wrap_FormFactorSphereUniformRadius_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorSphereUniformRadius_evaluate_for_q(FormFactorSphereUniformRadius self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorSphereUniformRadius::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorSphereUniformRadius", _wrap_delete_FormFactorSphereUniformRadius, METH_VARARGS, (char *)"delete_FormFactorSphereUniformRadius(FormFactorSphereUniformRadius self)"},
+	 { (char *)"FormFactorSphereUniformRadius_swigregister", FormFactorSphereUniformRadius_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorTetrahedron", _wrap_new_FormFactorTetrahedron, METH_VARARGS, (char *)"\n"
+		"new_FormFactorTetrahedron(double base_edge, double height, double alpha) -> FormFactorTetrahedron\n"
+		"\n"
+		"FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"base_edge: \n"
+		"of a side of the base\n"
+		"\n"
+		"height: \n"
+		"of the frustum\n"
+		"\n"
+		"alpha: \n"
+		"dihedral angle in radians between base and facet \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTetrahedron_clone", _wrap_FormFactorTetrahedron_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorTetrahedron_clone(FormFactorTetrahedron self) -> FormFactorTetrahedron\n"
+		"\n"
+		"FormFactorTetrahedron* FormFactorTetrahedron::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTetrahedron_accept", _wrap_FormFactorTetrahedron_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorTetrahedron_accept(FormFactorTetrahedron self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorTetrahedron::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTetrahedron_getBaseEdge", _wrap_FormFactorTetrahedron_getBaseEdge, METH_VARARGS, (char *)"\n"
+		"FormFactorTetrahedron_getBaseEdge(FormFactorTetrahedron self) -> double\n"
+		"\n"
+		"double FormFactorTetrahedron::getBaseEdge() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTetrahedron_getHeight", _wrap_FormFactorTetrahedron_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorTetrahedron_getHeight(FormFactorTetrahedron self) -> double\n"
+		"\n"
+		"double FormFactorTetrahedron::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTetrahedron_getAlpha", _wrap_FormFactorTetrahedron_getAlpha, METH_VARARGS, (char *)"\n"
+		"FormFactorTetrahedron_getAlpha(FormFactorTetrahedron self) -> double\n"
+		"\n"
+		"double FormFactorTetrahedron::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorTetrahedron", _wrap_delete_FormFactorTetrahedron, METH_VARARGS, (char *)"delete_FormFactorTetrahedron(FormFactorTetrahedron self)"},
+	 { (char *)"FormFactorTetrahedron_swigregister", FormFactorTetrahedron_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorTrivial", _wrap_new_FormFactorTrivial, METH_VARARGS, (char *)"\n"
+		"new_FormFactorTrivial() -> FormFactorTrivial\n"
+		"\n"
+		"FormFactorTrivial::FormFactorTrivial()\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTrivial_clone", _wrap_FormFactorTrivial_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorTrivial_clone(FormFactorTrivial self) -> FormFactorTrivial\n"
+		"\n"
+		"FormFactorTrivial* FormFactorTrivial::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTrivial_accept", _wrap_FormFactorTrivial_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorTrivial_accept(FormFactorTrivial self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorTrivial::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTrivial_getRadialExtension", _wrap_FormFactorTrivial_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorTrivial_getRadialExtension(FormFactorTrivial self) -> double\n"
+		"\n"
+		"double FormFactorTrivial::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTrivial_evaluate_for_q", _wrap_FormFactorTrivial_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorTrivial_evaluate_for_q(FormFactorTrivial self, cvector_t arg3) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorTrivial::evaluate_for_q(const cvector_t) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorTrivial", _wrap_delete_FormFactorTrivial, METH_VARARGS, (char *)"delete_FormFactorTrivial(FormFactorTrivial self)"},
+	 { (char *)"FormFactorTrivial_swigregister", FormFactorTrivial_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorTruncatedCube", _wrap_new_FormFactorTruncatedCube, METH_VARARGS, (char *)"\n"
+		"new_FormFactorTruncatedCube(double length, double removed_length) -> FormFactorTruncatedCube\n"
+		"\n"
+		"FormFactorTruncatedCube::FormFactorTruncatedCube(double length, double removed_length)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		"of the full cube\n"
+		"\n"
+		"removed_length: \n"
+		"as removed from each edge of the cube \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedCube_clone", _wrap_FormFactorTruncatedCube_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedCube_clone(FormFactorTruncatedCube self) -> FormFactorTruncatedCube\n"
+		"\n"
+		"FormFactorTruncatedCube* FormFactorTruncatedCube::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedCube_accept", _wrap_FormFactorTruncatedCube_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedCube_accept(FormFactorTruncatedCube self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorTruncatedCube::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedCube_getLength", _wrap_FormFactorTruncatedCube_getLength, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedCube_getLength(FormFactorTruncatedCube self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedCube::getLength() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedCube_getRemovedLength", _wrap_FormFactorTruncatedCube_getRemovedLength, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedCube_getRemovedLength(FormFactorTruncatedCube self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedCube::getRemovedLength() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorTruncatedCube", _wrap_delete_FormFactorTruncatedCube, METH_VARARGS, (char *)"delete_FormFactorTruncatedCube(FormFactorTruncatedCube self)"},
+	 { (char *)"FormFactorTruncatedCube_swigregister", FormFactorTruncatedCube_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorTruncatedSphere", _wrap_new_FormFactorTruncatedSphere, METH_VARARGS, (char *)"\n"
+		"new_FormFactorTruncatedSphere(double radius, double height) -> FormFactorTruncatedSphere\n"
+		"\n"
+		"FormFactorTruncatedSphere::FormFactorTruncatedSphere(double radius, double height)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSphere_clone", _wrap_FormFactorTruncatedSphere_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSphere_clone(FormFactorTruncatedSphere self) -> FormFactorTruncatedSphere\n"
+		"\n"
+		"FormFactorTruncatedSphere* FormFactorTruncatedSphere::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSphere_accept", _wrap_FormFactorTruncatedSphere_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSphere_accept(FormFactorTruncatedSphere self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorTruncatedSphere::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSphere_getHeight", _wrap_FormFactorTruncatedSphere_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSphere_getHeight(FormFactorTruncatedSphere self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedSphere::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSphere_getRadius", _wrap_FormFactorTruncatedSphere_getRadius, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSphere_getRadius(FormFactorTruncatedSphere self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedSphere::getRadius() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSphere_getRadialExtension", _wrap_FormFactorTruncatedSphere_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSphere_getRadialExtension(FormFactorTruncatedSphere self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedSphere::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSphere_evaluate_for_q", _wrap_FormFactorTruncatedSphere_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSphere_evaluate_for_q(FormFactorTruncatedSphere self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorTruncatedSphere::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Complex formfactor. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorTruncatedSphere", _wrap_delete_FormFactorTruncatedSphere, METH_VARARGS, (char *)"delete_FormFactorTruncatedSphere(FormFactorTruncatedSphere self)"},
+	 { (char *)"FormFactorTruncatedSphere_swigregister", FormFactorTruncatedSphere_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorTruncatedSpheroid", _wrap_new_FormFactorTruncatedSpheroid, METH_VARARGS, (char *)"\n"
+		"new_FormFactorTruncatedSpheroid(double radius, double height, double height_flattening) -> FormFactorTruncatedSpheroid\n"
+		"\n"
+		"FormFactorTruncatedSpheroid::FormFactorTruncatedSpheroid(double radius, double height, double height_flattening)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSpheroid_clone", _wrap_FormFactorTruncatedSpheroid_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSpheroid_clone(FormFactorTruncatedSpheroid self) -> FormFactorTruncatedSpheroid\n"
+		"\n"
+		"FormFactorTruncatedSpheroid* FormFactorTruncatedSpheroid::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSpheroid_accept", _wrap_FormFactorTruncatedSpheroid_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSpheroid_accept(FormFactorTruncatedSpheroid self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorTruncatedSpheroid::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSpheroid_getRadius", _wrap_FormFactorTruncatedSpheroid_getRadius, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSpheroid_getRadius(FormFactorTruncatedSpheroid self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedSpheroid::getRadius() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSpheroid_getHeight", _wrap_FormFactorTruncatedSpheroid_getHeight, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSpheroid_getHeight(FormFactorTruncatedSpheroid self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedSpheroid::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSpheroid_getHeightFlattening", _wrap_FormFactorTruncatedSpheroid_getHeightFlattening, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSpheroid_getHeightFlattening(FormFactorTruncatedSpheroid self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedSpheroid::getHeightFlattening() const \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSpheroid_getRadialExtension", _wrap_FormFactorTruncatedSpheroid_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSpheroid_getRadialExtension(FormFactorTruncatedSpheroid self) -> double\n"
+		"\n"
+		"double FormFactorTruncatedSpheroid::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorTruncatedSpheroid_evaluate_for_q", _wrap_FormFactorTruncatedSpheroid_evaluate_for_q, METH_VARARGS, (char *)"\n"
+		"FormFactorTruncatedSpheroid_evaluate_for_q(FormFactorTruncatedSpheroid self, cvector_t q) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorTruncatedSpheroid::evaluate_for_q(const cvector_t q) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex scattering wavevector q=k_i-k_f. This method is public only for convenience of plotting form factors in Python. \n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorTruncatedSpheroid", _wrap_delete_FormFactorTruncatedSpheroid, METH_VARARGS, (char *)"delete_FormFactorTruncatedSpheroid(FormFactorTruncatedSpheroid self)"},
+	 { (char *)"FormFactorTruncatedSpheroid_swigregister", FormFactorTruncatedSpheroid_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FormFactorWeighted", _wrap_new_FormFactorWeighted, METH_VARARGS, (char *)"\n"
+		"new_FormFactorWeighted() -> FormFactorWeighted\n"
+		"\n"
+		"FormFactorWeighted::FormFactorWeighted()\n"
+		"\n"
+		""},
+	 { (char *)"delete_FormFactorWeighted", _wrap_delete_FormFactorWeighted, METH_VARARGS, (char *)"\n"
+		"delete_FormFactorWeighted(FormFactorWeighted self)\n"
+		"\n"
+		"FormFactorWeighted::~FormFactorWeighted() overridefinal\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorWeighted_clone", _wrap_FormFactorWeighted_clone, METH_VARARGS, (char *)"\n"
+		"FormFactorWeighted_clone(FormFactorWeighted self) -> FormFactorWeighted\n"
+		"\n"
+		"FormFactorWeighted * FormFactorWeighted::clone() const overridefinal\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorWeighted_accept", _wrap_FormFactorWeighted_accept, METH_VARARGS, (char *)"\n"
+		"FormFactorWeighted_accept(FormFactorWeighted self, ISampleVisitor visitor)\n"
+		"\n"
+		"void FormFactorWeighted::accept(ISampleVisitor *visitor) const overridefinal\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorWeighted_getRadialExtension", _wrap_FormFactorWeighted_getRadialExtension, METH_VARARGS, (char *)"\n"
+		"FormFactorWeighted_getRadialExtension(FormFactorWeighted self) -> double\n"
+		"\n"
+		"double FormFactorWeighted::getRadialExtension() const overridefinal\n"
+		"\n"
+		"Returns the (approximate in some cases) radial size of the particle of this form factor's shape. This is used for SSCA calculations \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorWeighted_addFormFactor", _wrap_FormFactorWeighted_addFormFactor, METH_VARARGS, (char *)"\n"
+		"addFormFactor(IFormFactor form_factor, double weight=1.0)\n"
+		"FormFactorWeighted_addFormFactor(FormFactorWeighted self, IFormFactor form_factor)\n"
+		"\n"
+		"void FormFactorWeighted::addFormFactor(const IFormFactor &form_factor, double weight=1.0)\n"
+		"\n"
+		""},
+	 { (char *)"FormFactorWeighted_setAmbientMaterial", _wrap_FormFactorWeighted_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"FormFactorWeighted_setAmbientMaterial(FormFactorWeighted self, IMaterial material)\n"
+		"\n"
+		"void FormFactorWeighted::setAmbientMaterial(const IMaterial &material) overridefinal\n"
+		"\n"
+		"Passes the refractive index of the ambient material in which this particle is embedded. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorWeighted_evaluate", _wrap_FormFactorWeighted_evaluate, METH_VARARGS, (char *)"\n"
+		"FormFactorWeighted_evaluate(FormFactorWeighted self, WavevectorInfo wavevectors) -> complex_t\n"
+		"\n"
+		"complex_t FormFactorWeighted::evaluate(const WavevectorInfo &wavevectors) const overridefinal\n"
+		"\n"
+		"Returns scattering amplitude for complex wavevectors ki, kf. \n"
+		"\n"
+		""},
+	 { (char *)"FormFactorWeighted_swigregister", FormFactorWeighted_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_Simulation", _wrap_delete_Simulation, METH_VARARGS, (char *)"\n"
+		"delete_Simulation(Simulation self)\n"
+		"\n"
+		"Simulation::~Simulation()\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_clone", _wrap_Simulation_clone, METH_VARARGS, (char *)"\n"
+		"Simulation_clone(Simulation self) -> Simulation\n"
+		"\n"
+		"virtual Simulation* Simulation::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_prepareSimulation", _wrap_Simulation_prepareSimulation, METH_VARARGS, (char *)"\n"
+		"Simulation_prepareSimulation(Simulation self)\n"
+		"\n"
+		"void Simulation::prepareSimulation()\n"
+		"\n"
+		"Put into a clean state for running a simulation. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_runSimulation", _wrap_Simulation_runSimulation, METH_VARARGS, (char *)"\n"
+		"Simulation_runSimulation(Simulation self)\n"
+		"\n"
+		"void Simulation::runSimulation()\n"
+		"\n"
+		"Run a simulation, possibly averaged over parameter distributions.\n"
+		"\n"
+		"Run simulation with possible averaging over parameter distributions. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setInstrument", _wrap_Simulation_setInstrument, METH_VARARGS, (char *)"\n"
+		"Simulation_setInstrument(Simulation self, Instrument instrument)\n"
+		"\n"
+		"void Simulation::setInstrument(const Instrument &instrument)\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_getInstrument", _wrap_Simulation_getInstrument, METH_VARARGS, (char *)"\n"
+		"getInstrument() -> Instrument\n"
+		"Simulation_getInstrument(Simulation self) -> Instrument\n"
+		"\n"
+		"Instrument& Simulation::getInstrument()\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setBeamIntensity", _wrap_Simulation_setBeamIntensity, METH_VARARGS, (char *)"\n"
+		"Simulation_setBeamIntensity(Simulation self, double intensity)\n"
+		"\n"
+		"void Simulation::setBeamIntensity(double intensity)\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_getBeamIntensity", _wrap_Simulation_getBeamIntensity, METH_VARARGS, (char *)"\n"
+		"Simulation_getBeamIntensity(Simulation self) -> double\n"
+		"\n"
+		"double Simulation::getBeamIntensity() const \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setBeamPolarization", _wrap_Simulation_setBeamPolarization, METH_VARARGS, (char *)"\n"
+		"Simulation_setBeamPolarization(Simulation self, kvector_t bloch_vector)\n"
+		"\n"
+		"void Simulation::setBeamPolarization(const kvector_t bloch_vector)\n"
+		"\n"
+		"Sets the beam polarization according to the given Bloch vector. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setDetectorResolutionFunction", _wrap_Simulation_setDetectorResolutionFunction, METH_VARARGS, (char *)"\n"
+		"Simulation_setDetectorResolutionFunction(Simulation self, IResolutionFunction2D resolution_function)\n"
+		"\n"
+		"void Simulation::setDetectorResolutionFunction(const IResolutionFunction2D &resolution_function)\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_removeDetectorResolutionFunction", _wrap_Simulation_removeDetectorResolutionFunction, METH_VARARGS, (char *)"\n"
+		"Simulation_removeDetectorResolutionFunction(Simulation self)\n"
+		"\n"
+		"void Simulation::removeDetectorResolutionFunction()\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setAnalyzerProperties", _wrap_Simulation_setAnalyzerProperties, METH_VARARGS, (char *)"\n"
+		"Simulation_setAnalyzerProperties(Simulation self, kvector_t direction, double efficiency, double total_transmission)\n"
+		"\n"
+		"void Simulation::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)\n"
+		"\n"
+		"Sets the polarization analyzer characteristics of the detector. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setSample", _wrap_Simulation_setSample, METH_VARARGS, (char *)"\n"
+		"Simulation_setSample(Simulation self, MultiLayer sample)\n"
+		"\n"
+		"void Simulation::setSample(const MultiLayer &sample)\n"
+		"\n"
+		"The  MultiLayer object will not be owned by the  Simulation object. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_getSample", _wrap_Simulation_getSample, METH_VARARGS, (char *)"\n"
+		"Simulation_getSample(Simulation self) -> MultiLayer\n"
+		"\n"
+		"MultiLayer* Simulation::getSample() const \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setSampleBuilderCpp", _wrap_Simulation_setSampleBuilderCpp, METH_VARARGS, (char *)"\n"
+		"Simulation_setSampleBuilderCpp(Simulation self, std::shared_ptr< IMultiLayerBuilder > const sample_builder)\n"
+		"\n"
+		"void Simulation::setSampleBuilder(std::shared_ptr< IMultiLayerBuilder > sample_builder)\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_getSampleBuilder", _wrap_Simulation_getSampleBuilder, METH_VARARGS, (char *)"\n"
+		"Simulation_getSampleBuilder(Simulation self) -> std::shared_ptr< IMultiLayerBuilder >\n"
+		"\n"
+		"std::shared_ptr<IMultiLayerBuilder> Simulation::getSampleBuilder() const \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_numberOfSimulationElements", _wrap_Simulation_numberOfSimulationElements, METH_VARARGS, (char *)"\n"
+		"Simulation_numberOfSimulationElements(Simulation self) -> int\n"
+		"\n"
+		"virtual int Simulation::numberOfSimulationElements() const =0\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_getDetectorIntensity", _wrap_Simulation_getDetectorIntensity, METH_VARARGS, (char *)"\n"
+		"getDetectorIntensity(IDetector2D::EAxesUnits units_type) -> IntensityData\n"
+		"Simulation_getDetectorIntensity(Simulation self) -> IntensityData\n"
+		"\n"
+		"virtual OutputData<double>* Simulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const =0\n"
+		"\n"
+		"Clone simulated intensity map. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_addSimulationParametersToExternalPool", _wrap_Simulation_addSimulationParametersToExternalPool, METH_VARARGS, (char *)"\n"
+		"Simulation_addSimulationParametersToExternalPool(Simulation self, std::string const & path, ParameterPool external_pool) -> std::string\n"
+		"\n"
+		"std::string Simulation::addSimulationParametersToExternalPool(const std::string &path, ParameterPool *external_pool) const\n"
+		"\n"
+		"Adds parameters defined in this class the to external pool. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_addParameterDistribution", _wrap_Simulation_addParameterDistribution, METH_VARARGS, (char *)"\n"
+		"addParameterDistribution(std::string const & param_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0, RealLimits limits)\n"
+		"addParameterDistribution(std::string const & param_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0)\n"
+		"addParameterDistribution(std::string const & param_name, IDistribution1D distribution, size_t nbr_samples)\n"
+		"Simulation_addParameterDistribution(Simulation self, ParameterDistribution par_distr)\n"
+		"\n"
+		"void Simulation::addParameterDistribution(const ParameterDistribution &par_distr)\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_getDistributionHandler", _wrap_Simulation_getDistributionHandler, METH_VARARGS, (char *)"\n"
+		"Simulation_getDistributionHandler(Simulation self) -> DistributionHandler const &\n"
+		"\n"
+		"const DistributionHandler& Simulation::getDistributionHandler() const \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setOptions", _wrap_Simulation_setOptions, METH_VARARGS, (char *)"\n"
+		"Simulation_setOptions(Simulation self, SimulationOptions options)\n"
+		"\n"
+		"void Simulation::setOptions(const SimulationOptions &options)\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_getOptions", _wrap_Simulation_getOptions, METH_VARARGS, (char *)"\n"
+		"getOptions() -> SimulationOptions\n"
+		"Simulation_getOptions(Simulation self) -> SimulationOptions\n"
+		"\n"
+		"SimulationOptions& Simulation::getOptions()\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_subscribe", _wrap_Simulation_subscribe, METH_VARARGS, (char *)"\n"
+		"Simulation_subscribe(Simulation self, ProgressHandler::Callback_t inform)\n"
+		"\n"
+		"void Simulation::subscribe(ProgressHandler::Callback_t inform)\n"
+		"\n"
+		""},
+	 { (char *)"Simulation_setTerminalProgressMonitor", _wrap_Simulation_setTerminalProgressMonitor, METH_VARARGS, (char *)"\n"
+		"Simulation_setTerminalProgressMonitor(Simulation self)\n"
+		"\n"
+		"void Simulation::setTerminalProgressMonitor()\n"
+		"\n"
+		"Initializes a progress monitor that prints to stdout. \n"
+		"\n"
+		""},
+	 { (char *)"Simulation_swigregister", Simulation_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SimulationOptions", _wrap_new_SimulationOptions, METH_VARARGS, (char *)"\n"
+		"new_SimulationOptions() -> SimulationOptions\n"
+		"\n"
+		"SimulationOptions::SimulationOptions()\n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_isIntegrate", _wrap_SimulationOptions_isIntegrate, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_isIntegrate(SimulationOptions self) -> bool\n"
+		"\n"
+		"bool SimulationOptions::isIntegrate() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_getMcPoints", _wrap_SimulationOptions_getMcPoints, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_getMcPoints(SimulationOptions self) -> size_t\n"
+		"\n"
+		"size_t SimulationOptions::getMcPoints() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_setMonteCarloIntegration", _wrap_SimulationOptions_setMonteCarloIntegration, METH_VARARGS, (char *)"\n"
+		"setMonteCarloIntegration(bool flag=True, size_t mc_points=50)\n"
+		"setMonteCarloIntegration(bool flag=True)\n"
+		"SimulationOptions_setMonteCarloIntegration(SimulationOptions self)\n"
+		"\n"
+		"void SimulationOptions::setMonteCarloIntegration(bool flag=true, size_t mc_points=50)\n"
+		"\n"
+		"Enables/disables MonetCarlo integration.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"flag: \n"
+		"If true, MonteCarlo integration will be used, otherwise analytical calculations\n"
+		"\n"
+		"mc_points: \n"
+		"Number of points for MonteCarlo integrator \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_setNumberOfThreads", _wrap_SimulationOptions_setNumberOfThreads, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_setNumberOfThreads(SimulationOptions self, int nthreads)\n"
+		"\n"
+		"void SimulationOptions::setNumberOfThreads(int nthreads)\n"
+		"\n"
+		"Sets number of threads to use during the simulation (0 - take the default value from the hardware) \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_getNumberOfThreads", _wrap_SimulationOptions_getNumberOfThreads, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_getNumberOfThreads(SimulationOptions self) -> int\n"
+		"\n"
+		"int SimulationOptions::getNumberOfThreads() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_setNumberOfBatches", _wrap_SimulationOptions_setNumberOfBatches, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_setNumberOfBatches(SimulationOptions self, int nbatches)\n"
+		"\n"
+		"void SimulationOptions::setNumberOfBatches(int nbatches)\n"
+		"\n"
+		"Sets number of batches to split. \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_getNumberOfBatches", _wrap_SimulationOptions_getNumberOfBatches, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_getNumberOfBatches(SimulationOptions self) -> int\n"
+		"\n"
+		"int SimulationOptions::getNumberOfBatches() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_getCurrentBatch", _wrap_SimulationOptions_getCurrentBatch, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_getCurrentBatch(SimulationOptions self) -> int\n"
+		"\n"
+		"int SimulationOptions::getCurrentBatch() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_setThreadInfo", _wrap_SimulationOptions_setThreadInfo, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_setThreadInfo(SimulationOptions self, ThreadInfo thread_info)\n"
+		"\n"
+		"void SimulationOptions::setThreadInfo(const ThreadInfo &thread_info)\n"
+		"\n"
+		"Sets the batch and thread information to be used. \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_getHardwareConcurrency", _wrap_SimulationOptions_getHardwareConcurrency, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_getHardwareConcurrency(SimulationOptions self) -> int\n"
+		"\n"
+		"int SimulationOptions::getHardwareConcurrency() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_getDefaultVariability", _wrap_SimulationOptions_getDefaultVariability, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_getDefaultVariability(SimulationOptions self) -> double\n"
+		"\n"
+		"double SimulationOptions::getDefaultVariability() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_setIncludeSpecular", _wrap_SimulationOptions_setIncludeSpecular, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_setIncludeSpecular(SimulationOptions self, bool include_specular)\n"
+		"\n"
+		"void SimulationOptions::setIncludeSpecular(bool include_specular)\n"
+		"\n"
+		""},
+	 { (char *)"SimulationOptions_includeSpecular", _wrap_SimulationOptions_includeSpecular, METH_VARARGS, (char *)"\n"
+		"SimulationOptions_includeSpecular(SimulationOptions self) -> bool\n"
+		"\n"
+		"bool SimulationOptions::includeSpecular() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_SimulationOptions", _wrap_delete_SimulationOptions, METH_VARARGS, (char *)"delete_SimulationOptions(SimulationOptions self)"},
+	 { (char *)"SimulationOptions_swigregister", SimulationOptions_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_GISASSimulation", _wrap_new_GISASSimulation, METH_VARARGS, (char *)"\n"
+		"GISASSimulation()\n"
+		"GISASSimulation(MultiLayer p_sample)\n"
+		"new_GISASSimulation(std::shared_ptr< IMultiLayerBuilder > const p_sample_builder) -> GISASSimulation\n"
+		"\n"
+		"GISASSimulation::GISASSimulation(std::shared_ptr< IMultiLayerBuilder > p_sample_builder)\n"
+		"\n"
+		""},
+	 { (char *)"delete_GISASSimulation", _wrap_delete_GISASSimulation, METH_VARARGS, (char *)"\n"
+		"delete_GISASSimulation(GISASSimulation self)\n"
+		"\n"
+		"GISASSimulation::~GISASSimulation() final\n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_clone", _wrap_GISASSimulation_clone, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_clone(GISASSimulation self) -> GISASSimulation\n"
+		"\n"
+		"GISASSimulation* GISASSimulation::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_prepareSimulation", _wrap_GISASSimulation_prepareSimulation, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_prepareSimulation(GISASSimulation self)\n"
+		"\n"
+		"void GISASSimulation::prepareSimulation() final\n"
+		"\n"
+		"Put into a clean state for running a simulation. \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_numberOfSimulationElements", _wrap_GISASSimulation_numberOfSimulationElements, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_numberOfSimulationElements(GISASSimulation self) -> int\n"
+		"\n"
+		"int GISASSimulation::numberOfSimulationElements() const final\n"
+		"\n"
+		"Gets the number of elements this simulation needs to calculate. \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_getDetectorIntensity", _wrap_GISASSimulation_getDetectorIntensity, METH_VARARGS, (char *)"\n"
+		"getDetectorIntensity(IDetector2D::EAxesUnits units_type) -> IntensityData\n"
+		"GISASSimulation_getDetectorIntensity(GISASSimulation self) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * GISASSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const\n"
+		"\n"
+		"Returns clone of the detector intensity map with detector resolution applied. \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_getIntensityData", _wrap_GISASSimulation_getIntensityData, METH_VARARGS, (char *)"\n"
+		"getIntensityData(IDetector2D::EAxesUnits units_type) -> Histogram2D\n"
+		"GISASSimulation_getIntensityData(GISASSimulation self) -> Histogram2D\n"
+		"\n"
+		"Histogram2D * GISASSimulation::getIntensityData(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const\n"
+		"\n"
+		"Returns histogram representing intensity map in requested axes units. \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_setBeamParameters", _wrap_GISASSimulation_setBeamParameters, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_setBeamParameters(GISASSimulation self, double wavelength, double alpha_i, double phi_i)\n"
+		"\n"
+		"void GISASSimulation::setBeamParameters(double wavelength, double alpha_i, double phi_i)\n"
+		"\n"
+		"Sets beam parameters from here (forwarded to  Instrument) \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_setDetector", _wrap_GISASSimulation_setDetector, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_setDetector(GISASSimulation self, IDetector2D detector)\n"
+		"\n"
+		"void GISASSimulation::setDetector(const IDetector2D &detector)\n"
+		"\n"
+		"Sets the detector (axes can be overwritten later) \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_setDetectorParameters", _wrap_GISASSimulation_setDetectorParameters, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_setDetectorParameters(GISASSimulation self, size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
+		"\n"
+		"void GISASSimulation::setDetectorParameters(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
+		"\n"
+		"Sets spherical detector parameters using angle ranges\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"n_phi: \n"
+		"number of phi-axis bins\n"
+		"\n"
+		"phi_min: \n"
+		"low edge of first phi-bin\n"
+		"\n"
+		"phi_max: \n"
+		"upper edge of last phi-bin\n"
+		"\n"
+		"n_alpha: \n"
+		"number of alpha-axis bins\n"
+		"\n"
+		"alpha_min: \n"
+		"low edge of first alpha-bin\n"
+		"\n"
+		"alpha_max: \n"
+		"upper edge of last alpha-bin \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_removeMasks", _wrap_GISASSimulation_removeMasks, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_removeMasks(GISASSimulation self)\n"
+		"\n"
+		"void GISASSimulation::removeMasks()\n"
+		"\n"
+		"removes all masks from the detector \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_addMask", _wrap_GISASSimulation_addMask, METH_VARARGS, (char *)"\n"
+		"addMask(IShape2D shape, bool mask_value=True)\n"
+		"GISASSimulation_addMask(GISASSimulation self, IShape2D shape)\n"
+		"\n"
+		"void GISASSimulation::addMask(const Geometry::IShape2D &shape, bool mask_value=true)\n"
+		"\n"
+		"Adds mask of given shape to the stack of detector masks. The mask value 'true' means that the channel will be excluded from the simulation. The mask which is added last has priority.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"shape: \n"
+		"The shape of mask (Rectangle, Polygon, Line, Ellipse)\n"
+		"\n"
+		"mask_value: \n"
+		"The value of mask \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_maskAll", _wrap_GISASSimulation_maskAll, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_maskAll(GISASSimulation self)\n"
+		"\n"
+		"void GISASSimulation::maskAll()\n"
+		"\n"
+		"Put the mask for all detector channels (i.e. exclude whole detector from the analysis) \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_setRegionOfInterest", _wrap_GISASSimulation_setRegionOfInterest, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_setRegionOfInterest(GISASSimulation self, double xlow, double ylow, double xup, double yup)\n"
+		"\n"
+		"void GISASSimulation::setRegionOfInterest(double xlow, double ylow, double xup, double yup)\n"
+		"\n"
+		"Sets rectangular region of interest with lower left and upper right corners defined. \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_resetRegionOfInterest", _wrap_GISASSimulation_resetRegionOfInterest, METH_VARARGS, (char *)"\n"
+		"GISASSimulation_resetRegionOfInterest(GISASSimulation self)\n"
+		"\n"
+		"void GISASSimulation::resetRegionOfInterest()\n"
+		"\n"
+		"Resets region of interest making whole detector plane available for the simulation. \n"
+		"\n"
+		""},
+	 { (char *)"GISASSimulation_swigregister", GISASSimulation_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IHistogram", _wrap_delete_IHistogram, METH_VARARGS, (char *)"\n"
+		"delete_IHistogram(IHistogram self)\n"
+		"\n"
+		"virtual IHistogram::~IHistogram()\n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_clone", _wrap_IHistogram_clone, METH_VARARGS, (char *)"\n"
+		"IHistogram_clone(IHistogram self) -> IHistogram\n"
+		"\n"
+		"virtual IHistogram* IHistogram::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getRank", _wrap_IHistogram_getRank, METH_VARARGS, (char *)"\n"
+		"IHistogram_getRank(IHistogram self) -> size_t\n"
+		"\n"
+		"virtual size_t IHistogram::getRank() const =0\n"
+		"\n"
+		"Returns number of histogram dimensions. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getTotalNumberOfBins", _wrap_IHistogram_getTotalNumberOfBins, METH_VARARGS, (char *)"\n"
+		"IHistogram_getTotalNumberOfBins(IHistogram self) -> size_t\n"
+		"\n"
+		"size_t IHistogram::getTotalNumberOfBins() const\n"
+		"\n"
+		"Returns total number of histogram bins. For 2D histograms the result will be the product of bin numbers along X and Y axes. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getXaxis", _wrap_IHistogram_getXaxis, METH_VARARGS, (char *)"\n"
+		"IHistogram_getXaxis(IHistogram self) -> IAxis\n"
+		"\n"
+		"const IAxis & IHistogram::getXaxis() const\n"
+		"\n"
+		"returns x-axis \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getYaxis", _wrap_IHistogram_getYaxis, METH_VARARGS, (char *)"\n"
+		"IHistogram_getYaxis(IHistogram self) -> IAxis\n"
+		"\n"
+		"const IAxis & IHistogram::getYaxis() const\n"
+		"\n"
+		"returns y-axis for 2D histograms \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getXmin", _wrap_IHistogram_getXmin, METH_VARARGS, (char *)"\n"
+		"IHistogram_getXmin(IHistogram self) -> double\n"
+		"\n"
+		"double IHistogram::getXmin() const\n"
+		"\n"
+		"Returns x-axis min (lower edge of first bin). \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getXmax", _wrap_IHistogram_getXmax, METH_VARARGS, (char *)"\n"
+		"IHistogram_getXmax(IHistogram self) -> double\n"
+		"\n"
+		"double IHistogram::getXmax() const\n"
+		"\n"
+		"Returns x-axis max (upper edge of last bin). \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getNbinsX", _wrap_IHistogram_getNbinsX, METH_VARARGS, (char *)"\n"
+		"IHistogram_getNbinsX(IHistogram self) -> size_t\n"
+		"\n"
+		"size_t IHistogram::getNbinsX() const\n"
+		"\n"
+		"Returns number of bins on x-axis. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getYmin", _wrap_IHistogram_getYmin, METH_VARARGS, (char *)"\n"
+		"IHistogram_getYmin(IHistogram self) -> double\n"
+		"\n"
+		"double IHistogram::getYmin() const\n"
+		"\n"
+		"Returns y-axis min (lower edge of first bin) for 2D histograms. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getYmax", _wrap_IHistogram_getYmax, METH_VARARGS, (char *)"\n"
+		"IHistogram_getYmax(IHistogram self) -> double\n"
+		"\n"
+		"double IHistogram::getYmax() const\n"
+		"\n"
+		"Returns y-axis max (upper edge of last bin) for 2D histograms. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getNbinsY", _wrap_IHistogram_getNbinsY, METH_VARARGS, (char *)"\n"
+		"IHistogram_getNbinsY(IHistogram self) -> size_t\n"
+		"\n"
+		"size_t IHistogram::getNbinsY() const\n"
+		"\n"
+		"Returns number of bins on y-axis. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getGlobalBin", _wrap_IHistogram_getGlobalBin, METH_VARARGS, (char *)"\n"
+		"getGlobalBin(size_t binx, size_t biny=0) -> size_t\n"
+		"IHistogram_getGlobalBin(IHistogram self, size_t binx) -> size_t\n"
+		"\n"
+		"size_t IHistogram::getGlobalBin(size_t binx, size_t biny=0) const\n"
+		"\n"
+		"Returns global bin index for given axes indices. For 1D histogram the global bin index coinside with x-axis index.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"binx: \n"
+		"x-axis bin index\n"
+		"\n"
+		"biny: \n"
+		"y-axis bin index (for 2D histograms)\n"
+		"\n"
+		"The global bin index \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_findGlobalBin", _wrap_IHistogram_findGlobalBin, METH_VARARGS, (char *)"\n"
+		"IHistogram_findGlobalBin(IHistogram self, double x, double y) -> size_t\n"
+		"\n"
+		"size_t IHistogram::findGlobalBin(double x, double y) const\n"
+		"\n"
+		"Returns closest global bin index for given axes coordinates. For 1D.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"x: \n"
+		"Value on x-axis\n"
+		"\n"
+		"y: \n"
+		"Value on y-axis (for 2D histograms)\n"
+		"\n"
+		"Closest global bin index \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getXaxisIndex", _wrap_IHistogram_getXaxisIndex, METH_VARARGS, (char *)"\n"
+		"IHistogram_getXaxisIndex(IHistogram self, size_t i) -> int\n"
+		"\n"
+		"int IHistogram::getXaxisIndex(size_t i) const\n"
+		"\n"
+		"Returns x-axis bin index for given globalbin. For 1D histograms returned value conicide with globalbin value. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getYaxisIndex", _wrap_IHistogram_getYaxisIndex, METH_VARARGS, (char *)"\n"
+		"IHistogram_getYaxisIndex(IHistogram self, size_t i) -> int\n"
+		"\n"
+		"int IHistogram::getYaxisIndex(size_t i) const\n"
+		"\n"
+		"Returns y-axis bin index for given globalbin (for 2D histograms). \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getXaxisValue", _wrap_IHistogram_getXaxisValue, METH_VARARGS, (char *)"\n"
+		"IHistogram_getXaxisValue(IHistogram self, size_t i) -> double\n"
+		"\n"
+		"double IHistogram::getXaxisValue(size_t i)\n"
+		"\n"
+		"Returns the value on x-axis corresponding to the global bin index.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"globalbin: \n"
+		"The global bin index\n"
+		"\n"
+		"The center of corresponding bin of the axis \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getYaxisValue", _wrap_IHistogram_getYaxisValue, METH_VARARGS, (char *)"\n"
+		"IHistogram_getYaxisValue(IHistogram self, size_t i) -> double\n"
+		"\n"
+		"double IHistogram::getYaxisValue(size_t i)\n"
+		"\n"
+		"Returns the value on y-axis corresponding to the 2D histogram global bin index.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"globalbin: \n"
+		"The global bin index\n"
+		"\n"
+		"The center of corresponding bin of the axis \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getData", _wrap_IHistogram_getData, METH_VARARGS, (char *)"\n"
+		"getData() -> OutputData< CumulativeValue > const\n"
+		"IHistogram_getData(IHistogram self) -> OutputData< CumulativeValue > &\n"
+		"\n"
+		"OutputData<CumulativeValue>& IHistogram::getData()\n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getBinContent", _wrap_IHistogram_getBinContent, METH_VARARGS, (char *)"\n"
+		"getBinContent(size_t i) -> double\n"
+		"IHistogram_getBinContent(IHistogram self, size_t binx, size_t biny) -> double\n"
+		"\n"
+		"double IHistogram::getBinContent(size_t binx, size_t biny) const\n"
+		"\n"
+		"Returns content (accumulated value) of the 2D histogram bin with given indices.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"binx: \n"
+		"x-axis bin index\n"
+		"\n"
+		"biny: \n"
+		"y-axis bin index\n"
+		"\n"
+		"The value accumulated by the bin (integral) \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_setBinContent", _wrap_IHistogram_setBinContent, METH_VARARGS, (char *)"\n"
+		"IHistogram_setBinContent(IHistogram self, size_t i, double value)\n"
+		"\n"
+		"void IHistogram::setBinContent(size_t i, double value)\n"
+		"\n"
+		"Sets content of the bin corresponding to the globalbin number. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_addBinContent", _wrap_IHistogram_addBinContent, METH_VARARGS, (char *)"\n"
+		"IHistogram_addBinContent(IHistogram self, size_t i, double value)\n"
+		"\n"
+		"void IHistogram::addBinContent(size_t i, double value)\n"
+		"\n"
+		"Add the value to the bin. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getBinError", _wrap_IHistogram_getBinError, METH_VARARGS, (char *)"\n"
+		"getBinError(size_t i) -> double\n"
+		"IHistogram_getBinError(IHistogram self, size_t binx, size_t biny) -> double\n"
+		"\n"
+		"double IHistogram::getBinError(size_t binx, size_t biny) const\n"
+		"\n"
+		"Returns error of the bin with given indices (for 2D histograms). \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getBinAverage", _wrap_IHistogram_getBinAverage, METH_VARARGS, (char *)"\n"
+		"getBinAverage(size_t i) -> double\n"
+		"IHistogram_getBinAverage(IHistogram self, size_t binx, size_t biny) -> double\n"
+		"\n"
+		"double IHistogram::getBinAverage(size_t binx, size_t biny) const\n"
+		"\n"
+		"Returns average value of the bin with given indices (for 2D histograms). \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getBinNumberOfEntries", _wrap_IHistogram_getBinNumberOfEntries, METH_VARARGS, (char *)"\n"
+		"getBinNumberOfEntries(size_t i) -> int\n"
+		"IHistogram_getBinNumberOfEntries(IHistogram self, size_t binx, size_t biny) -> int\n"
+		"\n"
+		"int IHistogram::getBinNumberOfEntries(size_t binx, size_t biny) const\n"
+		"\n"
+		"Returns number of entries in the bin with given indices (for 2D histograms). \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getMaximum", _wrap_IHistogram_getMaximum, METH_VARARGS, (char *)"\n"
+		"IHistogram_getMaximum(IHistogram self) -> double\n"
+		"\n"
+		"double IHistogram::getMaximum() const\n"
+		"\n"
+		"Returns histogram maximum value (maximum of  getBinContent() over all bins) \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getMaximumBinIndex", _wrap_IHistogram_getMaximumBinIndex, METH_VARARGS, (char *)"\n"
+		"IHistogram_getMaximumBinIndex(IHistogram self) -> size_t\n"
+		"\n"
+		"size_t IHistogram::getMaximumBinIndex() const\n"
+		"\n"
+		"Returns globalbin index with maximum content. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getMinimum", _wrap_IHistogram_getMinimum, METH_VARARGS, (char *)"\n"
+		"IHistogram_getMinimum(IHistogram self) -> double\n"
+		"\n"
+		"double IHistogram::getMinimum() const\n"
+		"\n"
+		"Returns histogram minimum value (minimum of  getBinContent() over all bins) \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getMinimumBinIndex", _wrap_IHistogram_getMinimumBinIndex, METH_VARARGS, (char *)"\n"
+		"IHistogram_getMinimumBinIndex(IHistogram self) -> size_t\n"
+		"\n"
+		"size_t IHistogram::getMinimumBinIndex() const\n"
+		"\n"
+		"Returns globalbin index with minimum content. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_scale", _wrap_IHistogram_scale, METH_VARARGS, (char *)"\n"
+		"IHistogram_scale(IHistogram self, double value)\n"
+		"\n"
+		"void IHistogram::scale(double value)\n"
+		"\n"
+		"Multiply this histogram (every bin content value) by a constant. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_integral", _wrap_IHistogram_integral, METH_VARARGS, (char *)"\n"
+		"IHistogram_integral(IHistogram self) -> double\n"
+		"\n"
+		"double IHistogram::integral() const\n"
+		"\n"
+		"Returns integral of bins content (computed as a sum of all bin content). \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_getArray", _wrap_IHistogram_getArray, METH_VARARGS, (char *)"\n"
+		"getArray(IHistogram::DataType dataType) -> PyObject\n"
+		"IHistogram_getArray(IHistogram self) -> PyObject *\n"
+		""},
+	 { (char *)"IHistogram_reset", _wrap_IHistogram_reset, METH_VARARGS, (char *)"\n"
+		"IHistogram_reset(IHistogram self)\n"
+		"\n"
+		"void IHistogram::reset()\n"
+		"\n"
+		"Reset histogram content (axes remains) \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_createHistogram", _wrap_IHistogram_createHistogram, METH_VARARGS, (char *)"IHistogram_createHistogram(IntensityData source) -> IHistogram"},
+	 { (char *)"IHistogram_createFrom", _wrap_IHistogram_createFrom, METH_VARARGS, (char *)"\n"
+		"createFrom(std::string const & filename) -> IHistogram\n"
+		"IHistogram_createFrom(vdouble2d_t data) -> IHistogram\n"
+		""},
+	 { (char *)"IHistogram_createOutputData", _wrap_IHistogram_createOutputData, METH_VARARGS, (char *)"\n"
+		"createOutputData(IHistogram::DataType dataType) -> IntensityData\n"
+		"IHistogram_createOutputData(IHistogram self) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * IHistogram::createOutputData(DataType dataType=DataType::INTEGRAL) const\n"
+		"\n"
+		"creates new  OutputData with histogram's shape and values corresponding to DataType\n"
+		"\n"
+		"creates new  OutputData with histogram's shape and put there values corresponding to DataType \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_hasSameShape", _wrap_IHistogram_hasSameShape, METH_VARARGS, (char *)"\n"
+		"IHistogram_hasSameShape(IHistogram self, IHistogram other) -> bool\n"
+		"\n"
+		"bool IHistogram::hasSameShape(const IHistogram &other) const\n"
+		"\n"
+		"Returns true if objects a) have same dimensions b) bin boundaries of axes coincide. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_hasSameDimensions", _wrap_IHistogram_hasSameDimensions, METH_VARARGS, (char *)"\n"
+		"IHistogram_hasSameDimensions(IHistogram self, IHistogram other) -> bool\n"
+		"\n"
+		"bool IHistogram::hasSameDimensions(const IHistogram &other) const\n"
+		"\n"
+		"Returns true if object have same rank and number of axes bins. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram___iadd__", _wrap_IHistogram___iadd__, METH_VARARGS, (char *)"IHistogram___iadd__(IHistogram self, IHistogram right) -> IHistogram"},
+	 { (char *)"IHistogram_relativeDifferenceHistogram", _wrap_IHistogram_relativeDifferenceHistogram, METH_VARARGS, (char *)"\n"
+		"IHistogram_relativeDifferenceHistogram(IHistogram self, IHistogram rhs) -> IHistogram\n"
+		"\n"
+		"IHistogram * IHistogram::relativeDifferenceHistogram(const IHistogram &rhs)\n"
+		"\n"
+		"returns histogram representing relative difference of two histograms. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_save", _wrap_IHistogram_save, METH_VARARGS, (char *)"\n"
+		"IHistogram_save(IHistogram self, std::string const & filename)\n"
+		"\n"
+		"void IHistogram::save(const std::string &filename)\n"
+		"\n"
+		"Saves histogram in file Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz) \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_load", _wrap_IHistogram_load, METH_VARARGS, (char *)"\n"
+		"IHistogram_load(IHistogram self, std::string const & filename)\n"
+		"\n"
+		"void IHistogram::load(const std::string &filename)\n"
+		"\n"
+		"Loads histogram from file, the shape of array in file should match Following formats are available: *.txt, *.tif, *.int (*.txt.gz, *.tif.gz, *.int.gz) Only bin content will be loaded, histogram axes remain the same. \n"
+		"\n"
+		""},
+	 { (char *)"IHistogram_swigregister", IHistogram_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Histogram1D", _wrap_new_Histogram1D, METH_VARARGS, (char *)"\n"
+		"Histogram1D(int nbinsx, double xlow, double xup)\n"
+		"Histogram1D(int nbinsx, vdouble1d_t xbins)\n"
+		"Histogram1D(IAxis axis)\n"
+		"new_Histogram1D(IntensityData data) -> Histogram1D\n"
+		"\n"
+		"Histogram1D::Histogram1D(const OutputData< double > &data)\n"
+		"\n"
+		"Constructor for 1D histograms from basic  OutputData object. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_clone", _wrap_Histogram1D_clone, METH_VARARGS, (char *)"\n"
+		"Histogram1D_clone(Histogram1D self) -> Histogram1D\n"
+		"\n"
+		"Histogram1D * Histogram1D::clone() const\n"
+		"\n"
+		"Returns clone of other histogram. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_getRank", _wrap_Histogram1D_getRank, METH_VARARGS, (char *)"\n"
+		"Histogram1D_getRank(Histogram1D self) -> size_t\n"
+		"\n"
+		"size_t Histogram1D::getRank() const\n"
+		"\n"
+		"Returns the number of histogram dimensions. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_fill", _wrap_Histogram1D_fill, METH_VARARGS, (char *)"\n"
+		"fill(double x, double weight=1.0) -> int\n"
+		"Histogram1D_fill(Histogram1D self, double x) -> int\n"
+		"\n"
+		"int Histogram1D::fill(double x, double weight=1.0)\n"
+		"\n"
+		"Increment bin with abscissa x with a weight. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_getBinCenters", _wrap_Histogram1D_getBinCenters, METH_VARARGS, (char *)"\n"
+		"Histogram1D_getBinCenters(Histogram1D self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > Histogram1D::getBinCenters() const\n"
+		"\n"
+		"returns vector of histogram bin centers \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_getBinValues", _wrap_Histogram1D_getBinValues, METH_VARARGS, (char *)"\n"
+		"Histogram1D_getBinValues(Histogram1D self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > Histogram1D::getBinValues() const\n"
+		"\n"
+		"returns vector of bin content (the value accumulated by bins) \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_getBinErrors", _wrap_Histogram1D_getBinErrors, METH_VARARGS, (char *)"\n"
+		"Histogram1D_getBinErrors(Histogram1D self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > Histogram1D::getBinErrors() const\n"
+		"\n"
+		"returns vector of bin errors \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_getBinCentersNumpy", _wrap_Histogram1D_getBinCentersNumpy, METH_VARARGS, (char *)"Histogram1D_getBinCentersNumpy(Histogram1D self) -> PyObject *"},
+	 { (char *)"Histogram1D_getBinValuesNumpy", _wrap_Histogram1D_getBinValuesNumpy, METH_VARARGS, (char *)"Histogram1D_getBinValuesNumpy(Histogram1D self) -> PyObject *"},
+	 { (char *)"Histogram1D_getBinErrorsNumpy", _wrap_Histogram1D_getBinErrorsNumpy, METH_VARARGS, (char *)"Histogram1D_getBinErrorsNumpy(Histogram1D self) -> PyObject *"},
+	 { (char *)"Histogram1D_crop", _wrap_Histogram1D_crop, METH_VARARGS, (char *)"\n"
+		"Histogram1D_crop(Histogram1D self, double xmin, double xmax) -> Histogram1D\n"
+		"\n"
+		"Histogram1D * Histogram1D::crop(double xmin, double xmax)\n"
+		"\n"
+		"Create new histogram by applying crop on axis. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram1D_dynamicCast", _wrap_Histogram1D_dynamicCast, METH_VARARGS, (char *)"Histogram1D_dynamicCast(IHistogram pHistogram) -> Histogram1D"},
+	 { (char *)"delete_Histogram1D", _wrap_delete_Histogram1D, METH_VARARGS, (char *)"delete_Histogram1D(Histogram1D self)"},
+	 { (char *)"Histogram1D_swigregister", Histogram1D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Histogram2D", _wrap_new_Histogram2D, METH_VARARGS, (char *)"\n"
+		"Histogram2D(int nbinsx, double xlow, double xup, int nbinsy, double ylow, double yup)\n"
+		"Histogram2D(int nbinsx, vdouble1d_t xbins, int nbinsy, vdouble1d_t ybins)\n"
+		"Histogram2D(IAxis axis_x, IAxis axis_y)\n"
+		"Histogram2D(IntensityData data)\n"
+		"new_Histogram2D(vdouble2d_t data) -> Histogram2D\n"
+		"\n"
+		"Histogram2D::Histogram2D(const OutputData< double > &data)\n"
+		"\n"
+		"Constructor for 2D histograms from basic  OutputData object. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram2D_clone", _wrap_Histogram2D_clone, METH_VARARGS, (char *)"\n"
+		"Histogram2D_clone(Histogram2D self) -> Histogram2D\n"
+		"\n"
+		"Histogram2D * Histogram2D::clone() const\n"
+		"\n"
+		"Returns clone of other histogram. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram2D_getRank", _wrap_Histogram2D_getRank, METH_VARARGS, (char *)"\n"
+		"Histogram2D_getRank(Histogram2D self) -> size_t\n"
+		"\n"
+		"size_t Histogram2D::getRank() const\n"
+		"\n"
+		"Returns the number of histogram dimensions. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram2D_fill", _wrap_Histogram2D_fill, METH_VARARGS, (char *)"\n"
+		"fill(double x, double y, double weight=1.0) -> int\n"
+		"Histogram2D_fill(Histogram2D self, double x, double y) -> int\n"
+		"\n"
+		"int Histogram2D::fill(double x, double y, double weight=1.0)\n"
+		"\n"
+		"Increment bin with abscissa x and ordinate y with a weight. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram2D_projectionX", _wrap_Histogram2D_projectionX, METH_VARARGS, (char *)"\n"
+		"projectionX() -> Histogram1D\n"
+		"projectionX(double yvalue) -> Histogram1D\n"
+		"Histogram2D_projectionX(Histogram2D self, double ylow, double yup) -> Histogram1D\n"
+		"\n"
+		"Histogram1D * Histogram2D::projectionX(double ylow, double yup)\n"
+		"\n"
+		"Project a 2D histogram into 1D histogram along X. The projection is made from all y-bins corresponding to ordinate between ylow and yup.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"ylow: \n"
+		"lower edje on y-axis\n"
+		"\n"
+		"yup: \n"
+		"upper edje on y-axis \n"
+		"\n"
+		""},
+	 { (char *)"Histogram2D_projectionY", _wrap_Histogram2D_projectionY, METH_VARARGS, (char *)"\n"
+		"projectionY() -> Histogram1D\n"
+		"projectionY(double xvalue) -> Histogram1D\n"
+		"Histogram2D_projectionY(Histogram2D self, double xlow, double xup) -> Histogram1D\n"
+		"\n"
+		"Histogram1D * Histogram2D::projectionY(double xlow, double xup)\n"
+		"\n"
+		"Project a 2D histogram into 1D histogram along Y. The projection is made from all x-bins corresponding to abscissa between xlow and xup.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"xlow: \n"
+		"lower edje on x-axis\n"
+		"\n"
+		"xup: \n"
+		"upper edje on x-axis \n"
+		"\n"
+		""},
+	 { (char *)"Histogram2D_crop", _wrap_Histogram2D_crop, METH_VARARGS, (char *)"\n"
+		"Histogram2D_crop(Histogram2D self, double xmin, double ymin, double xmax, double ymax) -> Histogram2D\n"
+		"\n"
+		"Histogram2D * Histogram2D::crop(double xmin, double ymin, double xmax, double ymax)\n"
+		"\n"
+		"Create new histogram by applying rectangular clip. \n"
+		"\n"
+		""},
+	 { (char *)"Histogram2D_setContent", _wrap_Histogram2D_setContent, METH_VARARGS, (char *)"Histogram2D_setContent(Histogram2D self, vdouble2d_t data)"},
+	 { (char *)"Histogram2D_addContent", _wrap_Histogram2D_addContent, METH_VARARGS, (char *)"Histogram2D_addContent(Histogram2D self, vdouble2d_t data)"},
+	 { (char *)"Histogram2D_dynamicCast", _wrap_Histogram2D_dynamicCast, METH_VARARGS, (char *)"Histogram2D_dynamicCast(IHistogram pHistogram) -> Histogram2D"},
+	 { (char *)"delete_Histogram2D", _wrap_delete_Histogram2D, METH_VARARGS, (char *)"delete_Histogram2D(Histogram2D self)"},
+	 { (char *)"Histogram2D_swigregister", Histogram2D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IMaterial", _wrap_delete_IMaterial, METH_VARARGS, (char *)"\n"
+		"delete_IMaterial(IMaterial self)\n"
+		"\n"
+		"virtual IMaterial::~IMaterial()\n"
+		"\n"
+		""},
+	 { (char *)"IMaterial_clone", _wrap_IMaterial_clone, METH_VARARGS, (char *)"\n"
+		"IMaterial_clone(IMaterial self) -> IMaterial\n"
+		"\n"
+		"IMaterial * IMaterial::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"IMaterial_isScalarMaterial", _wrap_IMaterial_isScalarMaterial, METH_VARARGS, (char *)"\n"
+		"IMaterial_isScalarMaterial(IMaterial self) -> bool\n"
+		"\n"
+		"virtual bool IMaterial::isScalarMaterial() const\n"
+		"\n"
+		"Indicates whether the interaction with the material is scalar. This means that different polarization states will be diffracted equally \n"
+		"\n"
+		""},
+	 { (char *)"IMaterial_isMagneticMaterial", _wrap_IMaterial_isMagneticMaterial, METH_VARARGS, (char *)"\n"
+		"IMaterial_isMagneticMaterial(IMaterial self) -> bool\n"
+		"\n"
+		"bool IMaterial::isMagneticMaterial() const \n"
+		"\n"
+		""},
+	 { (char *)"IMaterial_getRefractiveIndex", _wrap_IMaterial_getRefractiveIndex, METH_VARARGS, (char *)"\n"
+		"IMaterial_getRefractiveIndex(IMaterial self) -> complex_t\n"
+		"\n"
+		"virtual complex_t IMaterial::getRefractiveIndex() const \n"
+		"\n"
+		""},
+	 { (char *)"IMaterial_createTransformedMaterial", _wrap_IMaterial_createTransformedMaterial, METH_VARARGS, (char *)"\n"
+		"IMaterial_createTransformedMaterial(IMaterial self, Transform3D const & transform) -> IMaterial\n"
+		"\n"
+		"virtual const IMaterial* IMaterial::createTransformedMaterial(const Transform3D &transform) const =0\n"
+		"\n"
+		"Create a new material that is transformed with respect to this one. \n"
+		"\n"
+		""},
+	 { (char *)"IMaterial___eq__", _wrap_IMaterial___eq__, METH_VARARGS, (char *)"IMaterial___eq__(IMaterial self, IMaterial other) -> bool"},
+	 { (char *)"IMaterial_swigregister", IMaterial_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_HomogeneousMaterial", _wrap_new_HomogeneousMaterial, METH_VARARGS, (char *)"\n"
+		"HomogeneousMaterial(std::string const & name, complex_t const refractive_index)\n"
+		"new_HomogeneousMaterial(std::string const & name, double refractive_index_delta, double refractive_index_beta) -> HomogeneousMaterial\n"
+		"\n"
+		"HomogeneousMaterial::HomogeneousMaterial(const std::string &name, double refractive_index_delta, double refractive_index_beta)\n"
+		"\n"
+		"Constructs a material with  name and refractive_index parameters delta and beta (n = 1 - delta + i*beta). \n"
+		"\n"
+		""},
+	 { (char *)"delete_HomogeneousMaterial", _wrap_delete_HomogeneousMaterial, METH_VARARGS, (char *)"\n"
+		"delete_HomogeneousMaterial(HomogeneousMaterial self)\n"
+		"\n"
+		"virtual HomogeneousMaterial::~HomogeneousMaterial()\n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMaterial_clone", _wrap_HomogeneousMaterial_clone, METH_VARARGS, (char *)"\n"
+		"HomogeneousMaterial_clone(HomogeneousMaterial self) -> HomogeneousMaterial\n"
+		"\n"
+		"virtual HomogeneousMaterial* HomogeneousMaterial::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMaterial_getRefractiveIndex", _wrap_HomogeneousMaterial_getRefractiveIndex, METH_VARARGS, (char *)"\n"
+		"HomogeneousMaterial_getRefractiveIndex(HomogeneousMaterial self) -> complex_t\n"
+		"\n"
+		"virtual complex_t HomogeneousMaterial::getRefractiveIndex() const \n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMaterial_setRefractiveIndex", _wrap_HomogeneousMaterial_setRefractiveIndex, METH_VARARGS, (char *)"\n"
+		"HomogeneousMaterial_setRefractiveIndex(HomogeneousMaterial self, complex_t const refractive_index)\n"
+		"\n"
+		"void HomogeneousMaterial::setRefractiveIndex(const complex_t refractive_index)\n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMaterial_createTransformedMaterial", _wrap_HomogeneousMaterial_createTransformedMaterial, METH_VARARGS, (char *)"\n"
+		"HomogeneousMaterial_createTransformedMaterial(HomogeneousMaterial self, Transform3D const & arg3) -> IMaterial\n"
+		"\n"
+		"virtual const IMaterial* HomogeneousMaterial::createTransformedMaterial(const Transform3D &) const\n"
+		"\n"
+		"Create a new material that is transformed with respect to this one. \n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMaterial_swigregister", HomogeneousMaterial_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_HomogeneousMagneticMaterial", _wrap_new_HomogeneousMagneticMaterial, METH_VARARGS, (char *)"\n"
+		"HomogeneousMagneticMaterial(std::string const & name, complex_t const refractive_index, kvector_t magnetic_field)\n"
+		"new_HomogeneousMagneticMaterial(std::string const & name, double refractive_index_delta, double refractive_index_beta, kvector_t magnetic_field) -> HomogeneousMagneticMaterial\n"
+		"\n"
+		"HomogeneousMagneticMaterial::HomogeneousMagneticMaterial(const std::string &name, double refractive_index_delta, double refractive_index_beta, const kvector_t magnetic_field)\n"
+		"\n"
+		"Constructs a material with  name, refractive_index parameters and  magnetic_field\n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMagneticMaterial_clone", _wrap_HomogeneousMagneticMaterial_clone, METH_VARARGS, (char *)"\n"
+		"HomogeneousMagneticMaterial_clone(HomogeneousMagneticMaterial self) -> HomogeneousMagneticMaterial\n"
+		"\n"
+		"HomogeneousMagneticMaterial * HomogeneousMagneticMaterial::clone() const\n"
+		"\n"
+		"Clone. \n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMagneticMaterial_getMagneticField", _wrap_HomogeneousMagneticMaterial_getMagneticField, METH_VARARGS, (char *)"\n"
+		"HomogeneousMagneticMaterial_getMagneticField(HomogeneousMagneticMaterial self) -> kvector_t\n"
+		"\n"
+		"kvector_t HomogeneousMagneticMaterial::getMagneticField() const\n"
+		"\n"
+		"Get the magnetic field (in Tesla) \n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMagneticMaterial_setMagneticField", _wrap_HomogeneousMagneticMaterial_setMagneticField, METH_VARARGS, (char *)"\n"
+		"HomogeneousMagneticMaterial_setMagneticField(HomogeneousMagneticMaterial self, kvector_t magnetic_field)\n"
+		"\n"
+		"void HomogeneousMagneticMaterial::setMagneticField(const kvector_t magnetic_field)\n"
+		"\n"
+		"Set the magnetic field (in Tesla) \n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMagneticMaterial_isScalarMaterial", _wrap_HomogeneousMagneticMaterial_isScalarMaterial, METH_VARARGS, (char *)"\n"
+		"HomogeneousMagneticMaterial_isScalarMaterial(HomogeneousMagneticMaterial self) -> bool\n"
+		"\n"
+		"virtual bool HomogeneousMagneticMaterial::isScalarMaterial() const\n"
+		"\n"
+		"Indicates that the material is not scalar. This means that different polarization states will be diffracted differently \n"
+		"\n"
+		""},
+	 { (char *)"HomogeneousMagneticMaterial_createTransformedMaterial", _wrap_HomogeneousMagneticMaterial_createTransformedMaterial, METH_VARARGS, (char *)"\n"
+		"HomogeneousMagneticMaterial_createTransformedMaterial(HomogeneousMagneticMaterial self, Transform3D const & transform) -> IMaterial\n"
+		"\n"
+		"const IMaterial * HomogeneousMagneticMaterial::createTransformedMaterial(const Transform3D &transform) const\n"
+		"\n"
+		"Create a new material that is transformed with respect to this one. \n"
+		"\n"
+		""},
+	 { (char *)"delete_HomogeneousMagneticMaterial", _wrap_delete_HomogeneousMagneticMaterial, METH_VARARGS, (char *)"delete_HomogeneousMagneticMaterial(HomogeneousMagneticMaterial self)"},
+	 { (char *)"HomogeneousMagneticMaterial_swigregister", HomogeneousMagneticMaterial_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IDetector2D_clone", _wrap_IDetector2D_clone, METH_VARARGS, (char *)"\n"
+		"IDetector2D_clone(IDetector2D self) -> IDetector2D\n"
+		"\n"
+		"virtual IDetector2D* IDetector2D::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"delete_IDetector2D", _wrap_delete_IDetector2D, METH_VARARGS, (char *)"\n"
+		"delete_IDetector2D(IDetector2D self)\n"
+		"\n"
+		"IDetector2D::~IDetector2D()\n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_init", _wrap_IDetector2D_init, METH_VARARGS, (char *)"\n"
+		"IDetector2D_init(IDetector2D self, Beam arg3)\n"
+		"\n"
+		"virtual void IDetector2D::init(const Beam &)\n"
+		"\n"
+		"Inits detector with the beam settings. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_addAxis", _wrap_IDetector2D_addAxis, METH_VARARGS, (char *)"\n"
+		"IDetector2D_addAxis(IDetector2D self, IAxis axis)\n"
+		"\n"
+		"void IDetector2D::addAxis(const IAxis &axis)\n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getAxis", _wrap_IDetector2D_getAxis, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getAxis(IDetector2D self, size_t index) -> IAxis\n"
+		"\n"
+		"const IAxis & IDetector2D::getAxis(size_t index) const \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getDimension", _wrap_IDetector2D_getDimension, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getDimension(IDetector2D self) -> size_t\n"
+		"\n"
+		"size_t IDetector2D::getDimension() const \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_clear", _wrap_IDetector2D_clear, METH_VARARGS, (char *)"\n"
+		"IDetector2D_clear(IDetector2D self)\n"
+		"\n"
+		"void IDetector2D::clear()\n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_setDetectorParameters", _wrap_IDetector2D_setDetectorParameters, METH_VARARGS, (char *)"\n"
+		"IDetector2D_setDetectorParameters(IDetector2D self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
+		"\n"
+		"void IDetector2D::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
+		"\n"
+		"Sets detector parameters using angle ranges. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_setDetectorAxes", _wrap_IDetector2D_setDetectorAxes, METH_VARARGS, (char *)"\n"
+		"IDetector2D_setDetectorAxes(IDetector2D self, IAxis axis0, IAxis axis1)\n"
+		"\n"
+		"void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)\n"
+		"\n"
+		"Sets detector parameters using axes. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_setDetectorResolution", _wrap_IDetector2D_setDetectorResolution, METH_VARARGS, (char *)"\n"
+		"IDetector2D_setDetectorResolution(IDetector2D self, IDetectorResolution p_detector_resolution)\n"
+		"\n"
+		"void IDetector2D::setDetectorResolution(IDetectorResolution *p_detector_resolution)\n"
+		"\n"
+		"Sets the detector resolution. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_applyDetectorResolution", _wrap_IDetector2D_applyDetectorResolution, METH_VARARGS, (char *)"\n"
+		"IDetector2D_applyDetectorResolution(IDetector2D self, IntensityData p_intensity_map)\n"
+		"\n"
+		"void IDetector2D::applyDetectorResolution(OutputData< double > *p_intensity_map) const\n"
+		"\n"
+		"Applies the detector resolution to the given intensity maps. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getDetectorResolutionFunction", _wrap_IDetector2D_getDetectorResolutionFunction, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getDetectorResolutionFunction(IDetector2D self) -> IDetectorResolution\n"
+		"\n"
+		"const IDetectorResolution * IDetector2D::getDetectorResolutionFunction() const \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_setAnalyzerProperties", _wrap_IDetector2D_setAnalyzerProperties, METH_VARARGS, (char *)"\n"
+		"IDetector2D_setAnalyzerProperties(IDetector2D self, kvector_t direction, double efficiency, double total_transmission)\n"
+		"\n"
+		"void IDetector2D::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)\n"
+		"\n"
+		"Sets the polarization analyzer characteristics of the detector. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_removeMasks", _wrap_IDetector2D_removeMasks, METH_VARARGS, (char *)"\n"
+		"IDetector2D_removeMasks(IDetector2D self)\n"
+		"\n"
+		"void IDetector2D::removeMasks()\n"
+		"\n"
+		"removes all masks from the detector \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_addMask", _wrap_IDetector2D_addMask, METH_VARARGS, (char *)"\n"
+		"addMask(IShape2D shape, bool mask_value=True)\n"
+		"IDetector2D_addMask(IDetector2D self, IShape2D shape)\n"
+		"\n"
+		"void IDetector2D::addMask(const Geometry::IShape2D &shape, bool mask_value=true)\n"
+		"\n"
+		"Adds mask of given shape to the stack of detector masks. The mask value 'true' means that the channel will be excluded from the simulation. The mask which is added last has priority.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"shape: \n"
+		"The shape of mask (Rectangle, Polygon, Line, Ellipse)\n"
+		"\n"
+		"mask_value: \n"
+		"The value of mask \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_maskAll", _wrap_IDetector2D_maskAll, METH_VARARGS, (char *)"\n"
+		"IDetector2D_maskAll(IDetector2D self)\n"
+		"\n"
+		"void IDetector2D::maskAll()\n"
+		"\n"
+		"Put the mask for all detector channels (i.e. exclude whole detector from the analysis) \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getDetectorMask", _wrap_IDetector2D_getDetectorMask, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getDetectorMask(IDetector2D self) -> DetectorMask\n"
+		"\n"
+		"const DetectorMask * IDetector2D::getDetectorMask() const \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_numberOfMaskedChannels", _wrap_IDetector2D_numberOfMaskedChannels, METH_VARARGS, (char *)"\n"
+		"IDetector2D_numberOfMaskedChannels(IDetector2D self) -> size_t\n"
+		"\n"
+		"size_t IDetector2D::numberOfMaskedChannels() const \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_isMasked", _wrap_IDetector2D_isMasked, METH_VARARGS, (char *)"\n"
+		"IDetector2D_isMasked(IDetector2D self, size_t index) -> bool\n"
+		"\n"
+		"bool IDetector2D::isMasked(size_t index) const \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_hasMasks", _wrap_IDetector2D_hasMasks, METH_VARARGS, (char *)"\n"
+		"IDetector2D_hasMasks(IDetector2D self) -> bool\n"
+		"\n"
+		"bool IDetector2D::hasMasks() const\n"
+		"\n"
+		"return true if has masks \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_createDetectorIntensity", _wrap_IDetector2D_createDetectorIntensity, METH_VARARGS, (char *)"\n"
+		"createDetectorIntensity(std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements, Beam beam, IDetector2D::EAxesUnits units_type) -> IntensityData\n"
+		"IDetector2D_createDetectorIntensity(IDetector2D self, std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements, Beam beam) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * IDetector2D::createDetectorIntensity(const std::vector< SimulationElement > &elements, const Beam &beam, IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const\n"
+		"\n"
+		"Returns new intensity map with detector resolution applied and axes in requested units. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_createDetectorMap", _wrap_IDetector2D_createDetectorMap, METH_VARARGS, (char *)"\n"
+		"IDetector2D_createDetectorMap(IDetector2D self, Beam beam, IDetector2D::EAxesUnits units) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * IDetector2D::createDetectorMap(const Beam &beam, EAxesUnits units) const\n"
+		"\n"
+		"Returns empty detector map in given axes units. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_initOutputData", _wrap_IDetector2D_initOutputData, METH_VARARGS, (char *)"\n"
+		"IDetector2D_initOutputData(IDetector2D self, IntensityData data)\n"
+		"\n"
+		"void IDetector2D::initOutputData(OutputData< double > &data) const\n"
+		"\n"
+		"Inits axes of  OutputData to match the detector and sets values to zero. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getValidAxesUnits", _wrap_IDetector2D_getValidAxesUnits, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getValidAxesUnits(IDetector2D self) -> std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >\n"
+		"\n"
+		"std::vector< IDetector2D::EAxesUnits > IDetector2D::getValidAxesUnits() const\n"
+		"\n"
+		"returns vector of valid axes units \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getDefaultAxesUnits", _wrap_IDetector2D_getDefaultAxesUnits, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getDefaultAxesUnits(IDetector2D self) -> IDetector2D::EAxesUnits\n"
+		"\n"
+		"virtual EAxesUnits IDetector2D::getDefaultAxesUnits() const\n"
+		"\n"
+		"return default axes units \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_regionOfInterest", _wrap_IDetector2D_regionOfInterest, METH_VARARGS, (char *)"\n"
+		"IDetector2D_regionOfInterest(IDetector2D self) -> RegionOfInterest const *\n"
+		"\n"
+		"const RegionOfInterest * IDetector2D::regionOfInterest() const\n"
+		"\n"
+		"Returns region of interest if exists. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_setRegionOfInterest", _wrap_IDetector2D_setRegionOfInterest, METH_VARARGS, (char *)"\n"
+		"IDetector2D_setRegionOfInterest(IDetector2D self, double xlow, double ylow, double xup, double yup)\n"
+		"\n"
+		"void IDetector2D::setRegionOfInterest(double xlow, double ylow, double xup, double yup)\n"
+		"\n"
+		"Sets rectangular region of interest with lower left and upper right corners defined. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_resetRegionOfInterest", _wrap_IDetector2D_resetRegionOfInterest, METH_VARARGS, (char *)"\n"
+		"IDetector2D_resetRegionOfInterest(IDetector2D self)\n"
+		"\n"
+		"void IDetector2D::resetRegionOfInterest()\n"
+		"\n"
+		"Resets region of interest making whole detector plane available for the simulation. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getTotalSize", _wrap_IDetector2D_getTotalSize, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getTotalSize(IDetector2D self) -> size_t\n"
+		"\n"
+		"size_t IDetector2D::getTotalSize() const\n"
+		"\n"
+		"Returns total number of pixels. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_getAxisBinIndex", _wrap_IDetector2D_getAxisBinIndex, METH_VARARGS, (char *)"\n"
+		"IDetector2D_getAxisBinIndex(IDetector2D self, size_t index, size_t selected_axis) -> size_t\n"
+		"\n"
+		"size_t IDetector2D::getAxisBinIndex(size_t index, size_t selected_axis) const\n"
+		"\n"
+		"Calculate axis index for given global index. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_numberOfSimulationElements", _wrap_IDetector2D_numberOfSimulationElements, METH_VARARGS, (char *)"\n"
+		"IDetector2D_numberOfSimulationElements(IDetector2D self) -> size_t\n"
+		"\n"
+		"size_t IDetector2D::numberOfSimulationElements() const\n"
+		"\n"
+		"Returns number of simulation elements. \n"
+		"\n"
+		""},
+	 { (char *)"IDetector2D_swigregister", IDetector2D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IDetectorResolution", _wrap_delete_IDetectorResolution, METH_VARARGS, (char *)"\n"
+		"delete_IDetectorResolution(IDetectorResolution self)\n"
+		"\n"
+		"virtual IDetectorResolution::~IDetectorResolution()\n"
+		"\n"
+		""},
+	 { (char *)"IDetectorResolution_applyDetectorResolution", _wrap_IDetectorResolution_applyDetectorResolution, METH_VARARGS, (char *)"\n"
+		"IDetectorResolution_applyDetectorResolution(IDetectorResolution self, IntensityData p_intensity_map)\n"
+		"\n"
+		"virtual void IDetectorResolution::applyDetectorResolution(OutputData< double > *p_intensity_map) const =0\n"
+		"\n"
+		"Apply the resolution function to the intensity data. \n"
+		"\n"
+		""},
+	 { (char *)"IDetectorResolution_clone", _wrap_IDetectorResolution_clone, METH_VARARGS, (char *)"\n"
+		"IDetectorResolution_clone(IDetectorResolution self) -> IDetectorResolution\n"
+		"\n"
+		"virtual IDetectorResolution* IDetectorResolution::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IDetectorResolution_swigregister", IDetectorResolution_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IInterferenceFunction", _wrap_delete_IInterferenceFunction, METH_VARARGS, (char *)"\n"
+		"delete_IInterferenceFunction(IInterferenceFunction self)\n"
+		"\n"
+		"virtual IInterferenceFunction::~IInterferenceFunction()\n"
+		"\n"
+		""},
+	 { (char *)"IInterferenceFunction_clone", _wrap_IInterferenceFunction_clone, METH_VARARGS, (char *)"\n"
+		"IInterferenceFunction_clone(IInterferenceFunction self) -> IInterferenceFunction\n"
+		"\n"
+		"virtual IInterferenceFunction* IInterferenceFunction::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IInterferenceFunction_accept", _wrap_IInterferenceFunction_accept, METH_VARARGS, (char *)"\n"
+		"IInterferenceFunction_accept(IInterferenceFunction self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void IInterferenceFunction::accept(ISampleVisitor *visitor) const =0\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"IInterferenceFunction_evaluate", _wrap_IInterferenceFunction_evaluate, METH_VARARGS, (char *)"\n"
+		"IInterferenceFunction_evaluate(IInterferenceFunction self, kvector_t q) -> double\n"
+		"\n"
+		"virtual double IInterferenceFunction::evaluate(const kvector_t q) const =0\n"
+		"\n"
+		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
+		"\n"
+		""},
+	 { (char *)"IInterferenceFunction_getKappa", _wrap_IInterferenceFunction_getKappa, METH_VARARGS, (char *)"\n"
+		"IInterferenceFunction_getKappa(IInterferenceFunction self) -> double\n"
+		"\n"
+		"virtual double IInterferenceFunction::getKappa() const\n"
+		"\n"
+		"Retrieves the size-distance coupling constant (default 0.0) \n"
+		"\n"
+		""},
+	 { (char *)"IInterferenceFunction_getParticleDensity", _wrap_IInterferenceFunction_getParticleDensity, METH_VARARGS, (char *)"\n"
+		"IInterferenceFunction_getParticleDensity(IInterferenceFunction self) -> double\n"
+		"\n"
+		"virtual double IInterferenceFunction::getParticleDensity() const\n"
+		"\n"
+		"If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value \n"
+		"\n"
+		""},
+	 { (char *)"IInterferenceFunction_swigregister", IInterferenceFunction_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_ILayout", _wrap_delete_ILayout, METH_VARARGS, (char *)"\n"
+		"delete_ILayout(ILayout self)\n"
+		"\n"
+		"virtual ILayout::~ILayout()\n"
+		"\n"
+		""},
+	 { (char *)"ILayout_clone", _wrap_ILayout_clone, METH_VARARGS, (char *)"\n"
+		"ILayout_clone(ILayout self) -> ILayout\n"
+		"\n"
+		"virtual ILayout* ILayout::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_accept", _wrap_ILayout_accept, METH_VARARGS, (char *)"\n"
+		"ILayout_accept(ILayout self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void ILayout::accept(ISampleVisitor *visitor) const =0\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_cloneInvertB", _wrap_ILayout_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"ILayout_cloneInvertB(ILayout self) -> ILayout\n"
+		"\n"
+		"virtual ILayout* ILayout::cloneInvertB() const =0\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getNumberOfParticles", _wrap_ILayout_getNumberOfParticles, METH_VARARGS, (char *)"\n"
+		"ILayout_getNumberOfParticles(ILayout self) -> size_t\n"
+		"\n"
+		"virtual size_t ILayout::getNumberOfParticles() const =0\n"
+		"\n"
+		"Returns number of particles. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getParticle", _wrap_ILayout_getParticle, METH_VARARGS, (char *)"\n"
+		"ILayout_getParticle(ILayout self, size_t index) -> IAbstractParticle\n"
+		"\n"
+		"virtual const IAbstractParticle* ILayout::getParticle(size_t index) const =0\n"
+		"\n"
+		"Returns information about particle with index. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getParticles", _wrap_ILayout_getParticles, METH_VARARGS, (char *)"\n"
+		"ILayout_getParticles(ILayout self) -> SafePointerVector< IParticle const >\n"
+		"\n"
+		"virtual SafePointerVector<const IParticle> ILayout::getParticles() const =0\n"
+		"\n"
+		"Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getAbundanceOfParticle", _wrap_ILayout_getAbundanceOfParticle, METH_VARARGS, (char *)"\n"
+		"ILayout_getAbundanceOfParticle(ILayout self, size_t index) -> double\n"
+		"\n"
+		"virtual double ILayout::getAbundanceOfParticle(size_t index) const =0\n"
+		"\n"
+		"Get abundance fraction of particle with index. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getTotalAbundance", _wrap_ILayout_getTotalAbundance, METH_VARARGS, (char *)"\n"
+		"ILayout_getTotalAbundance(ILayout self) -> double\n"
+		"\n"
+		"double ILayout::getTotalAbundance() const\n"
+		"\n"
+		"Get total abundance of all particles. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getInterferenceFunction", _wrap_ILayout_getInterferenceFunction, METH_VARARGS, (char *)"\n"
+		"ILayout_getInterferenceFunction(ILayout self) -> IInterferenceFunction\n"
+		"\n"
+		"virtual const IInterferenceFunction* ILayout::getInterferenceFunction() const =0\n"
+		"\n"
+		"Returns interference function. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_cloneInterferenceFunction", _wrap_ILayout_cloneInterferenceFunction, METH_VARARGS, (char *)"\n"
+		"ILayout_cloneInterferenceFunction(ILayout self) -> IInterferenceFunction\n"
+		"\n"
+		"virtual IInterferenceFunction* ILayout::cloneInterferenceFunction() const =0\n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getTotalParticleSurfaceDensity", _wrap_ILayout_getTotalParticleSurfaceDensity, METH_VARARGS, (char *)"\n"
+		"ILayout_getTotalParticleSurfaceDensity(ILayout self) -> double\n"
+		"\n"
+		"virtual double ILayout::getTotalParticleSurfaceDensity() const =0\n"
+		"\n"
+		"Returns surface density of all particles. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_setTotalParticleSurfaceDensity", _wrap_ILayout_setTotalParticleSurfaceDensity, METH_VARARGS, (char *)"\n"
+		"ILayout_setTotalParticleSurfaceDensity(ILayout self, double particle_density)\n"
+		"\n"
+		"virtual void ILayout::setTotalParticleSurfaceDensity(double particle_density)=0\n"
+		"\n"
+		"Sets surface density of all particles. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_getApproximation", _wrap_ILayout_getApproximation, METH_VARARGS, (char *)"\n"
+		"ILayout_getApproximation(ILayout self) -> ILayout::EInterferenceApproximation\n"
+		"\n"
+		"EInterferenceApproximation ILayout::getApproximation() const\n"
+		"\n"
+		"Gets the used approximation for particles and interference functions. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_setApproximation", _wrap_ILayout_setApproximation, METH_VARARGS, (char *)"\n"
+		"ILayout_setApproximation(ILayout self, ILayout::EInterferenceApproximation approximation)\n"
+		"\n"
+		"void ILayout::setApproximation(EInterferenceApproximation approximation)\n"
+		"\n"
+		"Sets the used approximation for particles and interference functions. \n"
+		"\n"
+		""},
+	 { (char *)"ILayout_swigregister", ILayout_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IAbstractParticle", _wrap_delete_IAbstractParticle, METH_VARARGS, (char *)"\n"
+		"delete_IAbstractParticle(IAbstractParticle self)\n"
+		"\n"
+		"virtual IAbstractParticle::~IAbstractParticle()\n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_clone", _wrap_IAbstractParticle_clone, METH_VARARGS, (char *)"\n"
+		"IAbstractParticle_clone(IAbstractParticle self) -> IAbstractParticle\n"
+		"\n"
+		"virtual IAbstractParticle* IAbstractParticle::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_cloneInvertB", _wrap_IAbstractParticle_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"IAbstractParticle_cloneInvertB(IAbstractParticle self) -> IAbstractParticle\n"
+		"\n"
+		"virtual IAbstractParticle* IAbstractParticle::cloneInvertB() const =0\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_accept", _wrap_IAbstractParticle_accept, METH_VARARGS, (char *)"\n"
+		"IAbstractParticle_accept(IAbstractParticle self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void IAbstractParticle::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_setAmbientMaterial", _wrap_IAbstractParticle_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"IAbstractParticle_setAmbientMaterial(IAbstractParticle self, IMaterial arg3)\n"
+		"\n"
+		"virtual void IAbstractParticle::setAmbientMaterial(const IMaterial &)=0\n"
+		"\n"
+		"Sets the refractive index of the ambient material (which influences its scattering power) \n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_getAbundance", _wrap_IAbstractParticle_getAbundance, METH_VARARGS, (char *)"\n"
+		"IAbstractParticle_getAbundance(IAbstractParticle self) -> double\n"
+		"\n"
+		"double IAbstractParticle::getAbundance() const \n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_setAbundance", _wrap_IAbstractParticle_setAbundance, METH_VARARGS, (char *)"\n"
+		"IAbstractParticle_setAbundance(IAbstractParticle self, double abundance)\n"
+		"\n"
+		"void IAbstractParticle::setAbundance(double abundance)\n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_getAmbientMaterial", _wrap_IAbstractParticle_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"IAbstractParticle_getAmbientMaterial(IAbstractParticle self) -> IMaterial\n"
+		"\n"
+		"virtual const IMaterial* IAbstractParticle::getAmbientMaterial() const =0\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"IAbstractParticle_swigregister", IAbstractParticle_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IParameterReal_clone", _wrap_IParameterReal_clone, METH_VARARGS, (char *)"\n"
+		"clone(std::string const & new_name) -> IParameterReal\n"
+		"IParameterReal_clone(IParameterReal self) -> IParameterReal\n"
+		"\n"
+		"virtual IParameter* IParameter< T >::clone(const std::string &new_name=\"\") const =0\n"
+		"\n"
+		""},
+	 { (char *)"IParameterReal_isNull", _wrap_IParameterReal_isNull, METH_VARARGS, (char *)"\n"
+		"IParameterReal_isNull(IParameterReal self) -> bool\n"
+		"\n"
+		"virtual bool IParameter< T >::isNull() const\n"
+		"\n"
+		"Returns true if wrapped parameter was not initialized with proper real value. \n"
+		"\n"
+		""},
+	 { (char *)"IParameterReal_getData", _wrap_IParameterReal_getData, METH_VARARGS, (char *)"\n"
+		"IParameterReal_getData(IParameterReal self) -> double volatile &\n"
+		"\n"
+		"volatile T& IParameter< T >::getData() const \n"
+		"\n"
+		""},
+	 { (char *)"IParameterReal_setData", _wrap_IParameterReal_setData, METH_VARARGS, (char *)"\n"
+		"IParameterReal_setData(IParameterReal self, double volatile & data)\n"
+		"\n"
+		"void IParameter< T >::setData(volatile T &data)\n"
+		"\n"
+		""},
+	 { (char *)"IParameterReal___eq__", _wrap_IParameterReal___eq__, METH_VARARGS, (char *)"IParameterReal___eq__(IParameterReal self, IParameterReal other) -> bool"},
+	 { (char *)"IParameterReal___ne__", _wrap_IParameterReal___ne__, METH_VARARGS, (char *)"IParameterReal___ne__(IParameterReal self, IParameterReal other) -> bool"},
+	 { (char *)"delete_IParameterReal", _wrap_delete_IParameterReal, METH_VARARGS, (char *)"delete_IParameterReal(IParameterReal self)"},
+	 { (char *)"IParameterReal_swigregister", IParameterReal_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IParticle", _wrap_delete_IParticle, METH_VARARGS, (char *)"\n"
+		"delete_IParticle(IParticle self)\n"
+		"\n"
+		"virtual IParticle::~IParticle()\n"
+		"\n"
+		""},
+	 { (char *)"IParticle_clone", _wrap_IParticle_clone, METH_VARARGS, (char *)"\n"
+		"IParticle_clone(IParticle self) -> IParticle\n"
+		"\n"
+		"virtual IParticle* IParticle::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_cloneInvertB", _wrap_IParticle_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"IParticle_cloneInvertB(IParticle self) -> IParticle\n"
+		"\n"
+		"virtual IParticle* IParticle::cloneInvertB() const =0\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_accept", _wrap_IParticle_accept, METH_VARARGS, (char *)"\n"
+		"IParticle_accept(IParticle self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void IParticle::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_createFormFactor", _wrap_IParticle_createFormFactor, METH_VARARGS, (char *)"\n"
+		"IParticle_createFormFactor(IParticle self) -> IFormFactor\n"
+		"\n"
+		"IFormFactor * IParticle::createFormFactor() const\n"
+		"\n"
+		"Create a form factor for this particle. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_createTransformedFormFactor", _wrap_IParticle_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
+		"IParticle_createTransformedFormFactor(IParticle self, IRotation p_rotation, kvector_t translation) -> IFormFactor\n"
+		"\n"
+		"virtual IFormFactor* IParticle::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const =0\n"
+		"\n"
+		"Create a form factor for this particle with an extra transformation. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_getPosition", _wrap_IParticle_getPosition, METH_VARARGS, (char *)"\n"
+		"IParticle_getPosition(IParticle self) -> kvector_t\n"
+		"\n"
+		"kvector_t IParticle::getPosition() const\n"
+		"\n"
+		"Returns particle position. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_setPosition", _wrap_IParticle_setPosition, METH_VARARGS, (char *)"\n"
+		"setPosition(kvector_t position)\n"
+		"IParticle_setPosition(IParticle self, double x, double y, double z)\n"
+		"\n"
+		"void IParticle::setPosition(double x, double y, double z)\n"
+		"\n"
+		"Sets particle position. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_getRotation", _wrap_IParticle_getRotation, METH_VARARGS, (char *)"\n"
+		"IParticle_getRotation(IParticle self) -> IRotation\n"
+		"\n"
+		"const IRotation * IParticle::getRotation() const\n"
+		"\n"
+		"Returns rotation object. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_setRotation", _wrap_IParticle_setRotation, METH_VARARGS, (char *)"\n"
+		"IParticle_setRotation(IParticle self, IRotation rotation)\n"
+		"\n"
+		"void IParticle::setRotation(const IRotation &rotation)\n"
+		"\n"
+		"Sets transformation. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_applyRotation", _wrap_IParticle_applyRotation, METH_VARARGS, (char *)"\n"
+		"IParticle_applyRotation(IParticle self, IRotation rotation)\n"
+		"\n"
+		"void IParticle::applyRotation(const IRotation &rotation)\n"
+		"\n"
+		"Applies transformation by composing it with the existing one. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_applyTranslation", _wrap_IParticle_applyTranslation, METH_VARARGS, (char *)"\n"
+		"IParticle_applyTranslation(IParticle self, kvector_t displacement)\n"
+		"\n"
+		"void IParticle::applyTranslation(kvector_t displacement)\n"
+		"\n"
+		"Applies extra translation by adding it to the current one. \n"
+		"\n"
+		""},
+	 { (char *)"IParticle_swigregister", IParticle_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IResolutionFunction2D", _wrap_delete_IResolutionFunction2D, METH_VARARGS, (char *)"\n"
+		"delete_IResolutionFunction2D(IResolutionFunction2D self)\n"
+		"\n"
+		"virtual IResolutionFunction2D::~IResolutionFunction2D()\n"
+		"\n"
+		""},
+	 { (char *)"IResolutionFunction2D_evaluateCDF", _wrap_IResolutionFunction2D_evaluateCDF, METH_VARARGS, (char *)"\n"
+		"IResolutionFunction2D_evaluateCDF(IResolutionFunction2D self, double x, double y) -> double\n"
+		"\n"
+		"virtual double IResolutionFunction2D::evaluateCDF(double x, double y) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IResolutionFunction2D_clone", _wrap_IResolutionFunction2D_clone, METH_VARARGS, (char *)"\n"
+		"IResolutionFunction2D_clone(IResolutionFunction2D self) -> IResolutionFunction2D\n"
+		"\n"
+		"virtual IResolutionFunction2D* IResolutionFunction2D::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IResolutionFunction2D_swigregister", IResolutionFunction2D_swigregister, METH_VARARGS, NULL},
+	 { (char *)"IRotation_createRotation", _wrap_IRotation_createRotation, METH_VARARGS, (char *)"IRotation_createRotation(Transform3D const & transform) -> IRotation"},
+	 { (char *)"delete_IRotation", _wrap_delete_IRotation, METH_VARARGS, (char *)"\n"
+		"delete_IRotation(IRotation self)\n"
+		"\n"
+		"virtual IRotation::~IRotation()\n"
+		"\n"
+		""},
+	 { (char *)"IRotation_clone", _wrap_IRotation_clone, METH_VARARGS, (char *)"\n"
+		"IRotation_clone(IRotation self) -> IRotation\n"
+		"\n"
+		"virtual IRotation* IRotation::clone() const =0\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"IRotation_cloneInvertB", _wrap_IRotation_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"IRotation_cloneInvertB(IRotation self) -> IRotation\n"
+		"\n"
+		"IRotation* IRotation::cloneInvertB() const final\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"IRotation_createInverse", _wrap_IRotation_createInverse, METH_VARARGS, (char *)"\n"
+		"IRotation_createInverse(IRotation self) -> IRotation\n"
+		"\n"
+		"virtual IRotation* IRotation::createInverse() const =0\n"
+		"\n"
+		"Returns a new  IRotation object that is the current object's inverse. \n"
+		"\n"
+		""},
+	 { (char *)"IRotation_accept", _wrap_IRotation_accept, METH_VARARGS, (char *)"\n"
+		"IRotation_accept(IRotation self, ISampleVisitor visitor)\n"
+		"\n"
+		"void IRotation::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"IRotation_getTransform3D", _wrap_IRotation_getTransform3D, METH_VARARGS, (char *)"\n"
+		"IRotation_getTransform3D(IRotation self) -> Transform3D\n"
+		"\n"
+		"virtual Transform3D IRotation::getTransform3D() const =0\n"
+		"\n"
+		"Returns transformation. \n"
+		"\n"
+		""},
+	 { (char *)"IRotation_isIdentity", _wrap_IRotation_isIdentity, METH_VARARGS, (char *)"\n"
+		"IRotation_isIdentity(IRotation self) -> bool\n"
+		"\n"
+		"bool IRotation::isIdentity() const\n"
+		"\n"
+		"Returns true if roation matrix is identity matrix (no rotations) \n"
+		"\n"
+		""},
+	 { (char *)"IRotation_swigregister", IRotation_swigregister, METH_VARARGS, NULL},
+	 { (char *)"CreateProduct", _wrap_CreateProduct, METH_VARARGS, (char *)"\n"
+		"CreateProduct(IRotation left, IRotation right) -> IRotation\n"
+		"\n"
+		"BA_CORE_API_ IRotation* CreateProduct(const IRotation &left, const IRotation &right)\n"
+		"\n"
+		"Returns concatenated rotation (first right, then left). \n"
+		"\n"
+		""},
+	 { (char *)"new_RotationX", _wrap_new_RotationX, METH_VARARGS, (char *)"\n"
+		"new_RotationX(double angle) -> RotationX\n"
+		"\n"
+		"RotationX::RotationX(double angle)\n"
+		"\n"
+		""},
+	 { (char *)"RotationX_clone", _wrap_RotationX_clone, METH_VARARGS, (char *)"\n"
+		"RotationX_clone(RotationX self) -> RotationX\n"
+		"\n"
+		"RotationX* RotationX::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"RotationX_createInverse", _wrap_RotationX_createInverse, METH_VARARGS, (char *)"\n"
+		"RotationX_createInverse(RotationX self) -> RotationX\n"
+		"\n"
+		"RotationX* RotationX::createInverse() const\n"
+		"\n"
+		"Returns a new  IRotation object that is the current object's inverse. \n"
+		"\n"
+		""},
+	 { (char *)"RotationX_accept", _wrap_RotationX_accept, METH_VARARGS, (char *)"\n"
+		"RotationX_accept(RotationX self, ISampleVisitor visitor)\n"
+		"\n"
+		"void RotationX::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"RotationX_getAngle", _wrap_RotationX_getAngle, METH_VARARGS, (char *)"\n"
+		"RotationX_getAngle(RotationX self) -> double\n"
+		"\n"
+		"double RotationX::getAngle() const \n"
+		"\n"
+		""},
+	 { (char *)"RotationX_getTransform3D", _wrap_RotationX_getTransform3D, METH_VARARGS, (char *)"\n"
+		"RotationX_getTransform3D(RotationX self) -> Transform3D\n"
+		"\n"
+		"Transform3D RotationX::getTransform3D() const\n"
+		"\n"
+		"Returns transformation. \n"
+		"\n"
+		""},
+	 { (char *)"delete_RotationX", _wrap_delete_RotationX, METH_VARARGS, (char *)"delete_RotationX(RotationX self)"},
+	 { (char *)"RotationX_swigregister", RotationX_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_RotationY", _wrap_new_RotationY, METH_VARARGS, (char *)"\n"
+		"new_RotationY(double angle) -> RotationY\n"
+		"\n"
+		"RotationY::RotationY(double angle)\n"
+		"\n"
+		""},
+	 { (char *)"RotationY_clone", _wrap_RotationY_clone, METH_VARARGS, (char *)"\n"
+		"RotationY_clone(RotationY self) -> RotationY\n"
+		"\n"
+		"RotationY* RotationY::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"RotationY_createInverse", _wrap_RotationY_createInverse, METH_VARARGS, (char *)"\n"
+		"RotationY_createInverse(RotationY self) -> RotationY\n"
+		"\n"
+		"RotationY* RotationY::createInverse() const\n"
+		"\n"
+		"Returns a new  IRotation object that is the current object's inverse. \n"
+		"\n"
+		""},
+	 { (char *)"RotationY_accept", _wrap_RotationY_accept, METH_VARARGS, (char *)"\n"
+		"RotationY_accept(RotationY self, ISampleVisitor visitor)\n"
+		"\n"
+		"void RotationY::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"RotationY_getAngle", _wrap_RotationY_getAngle, METH_VARARGS, (char *)"\n"
+		"RotationY_getAngle(RotationY self) -> double\n"
+		"\n"
+		"double RotationY::getAngle() const \n"
+		"\n"
+		""},
+	 { (char *)"RotationY_getTransform3D", _wrap_RotationY_getTransform3D, METH_VARARGS, (char *)"\n"
+		"RotationY_getTransform3D(RotationY self) -> Transform3D\n"
+		"\n"
+		"Transform3D RotationY::getTransform3D() const\n"
+		"\n"
+		"Returns transformation. \n"
+		"\n"
+		""},
+	 { (char *)"delete_RotationY", _wrap_delete_RotationY, METH_VARARGS, (char *)"delete_RotationY(RotationY self)"},
+	 { (char *)"RotationY_swigregister", RotationY_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_RotationZ", _wrap_new_RotationZ, METH_VARARGS, (char *)"\n"
+		"RotationZ(double angle=0.0)\n"
+		"new_RotationZ() -> RotationZ\n"
+		"\n"
+		"RotationZ::RotationZ(double angle=0.0)\n"
+		"\n"
+		""},
+	 { (char *)"RotationZ_clone", _wrap_RotationZ_clone, METH_VARARGS, (char *)"\n"
+		"RotationZ_clone(RotationZ self) -> RotationZ\n"
+		"\n"
+		"RotationZ* RotationZ::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"RotationZ_createInverse", _wrap_RotationZ_createInverse, METH_VARARGS, (char *)"\n"
+		"RotationZ_createInverse(RotationZ self) -> RotationZ\n"
+		"\n"
+		"RotationZ* RotationZ::createInverse() const\n"
+		"\n"
+		"Returns a new  IRotation object that is the current object's inverse. \n"
+		"\n"
+		""},
+	 { (char *)"RotationZ_accept", _wrap_RotationZ_accept, METH_VARARGS, (char *)"\n"
+		"RotationZ_accept(RotationZ self, ISampleVisitor visitor)\n"
+		"\n"
+		"void RotationZ::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"RotationZ_getAngle", _wrap_RotationZ_getAngle, METH_VARARGS, (char *)"\n"
+		"RotationZ_getAngle(RotationZ self) -> double\n"
+		"\n"
+		"double RotationZ::getAngle() const \n"
+		"\n"
+		""},
+	 { (char *)"RotationZ_getTransform3D", _wrap_RotationZ_getTransform3D, METH_VARARGS, (char *)"\n"
+		"RotationZ_getTransform3D(RotationZ self) -> Transform3D\n"
+		"\n"
+		"Transform3D RotationZ::getTransform3D() const\n"
+		"\n"
+		"Returns transformation. \n"
+		"\n"
+		""},
+	 { (char *)"delete_RotationZ", _wrap_delete_RotationZ, METH_VARARGS, (char *)"delete_RotationZ(RotationZ self)"},
+	 { (char *)"RotationZ_swigregister", RotationZ_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_RotationEuler", _wrap_new_RotationEuler, METH_VARARGS, (char *)"\n"
+		"new_RotationEuler(double alpha, double beta, double gamma) -> RotationEuler\n"
+		"\n"
+		"RotationEuler::RotationEuler(double alpha, double beta, double gamma)\n"
+		"\n"
+		""},
+	 { (char *)"RotationEuler_clone", _wrap_RotationEuler_clone, METH_VARARGS, (char *)"\n"
+		"RotationEuler_clone(RotationEuler self) -> RotationEuler\n"
+		"\n"
+		"RotationEuler* RotationEuler::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"RotationEuler_createInverse", _wrap_RotationEuler_createInverse, METH_VARARGS, (char *)"\n"
+		"RotationEuler_createInverse(RotationEuler self) -> IRotation\n"
+		"\n"
+		"IRotation * RotationEuler::createInverse() const\n"
+		"\n"
+		"Returns a new  IRotation object that is the current object's inverse. \n"
+		"\n"
+		""},
+	 { (char *)"RotationEuler_accept", _wrap_RotationEuler_accept, METH_VARARGS, (char *)"\n"
+		"RotationEuler_accept(RotationEuler self, ISampleVisitor visitor)\n"
+		"\n"
+		"void RotationEuler::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"RotationEuler_getAlpha", _wrap_RotationEuler_getAlpha, METH_VARARGS, (char *)"\n"
+		"RotationEuler_getAlpha(RotationEuler self) -> double\n"
+		"\n"
+		"double RotationEuler::getAlpha() const \n"
+		"\n"
+		""},
+	 { (char *)"RotationEuler_getBeta", _wrap_RotationEuler_getBeta, METH_VARARGS, (char *)"\n"
+		"RotationEuler_getBeta(RotationEuler self) -> double\n"
+		"\n"
+		"double RotationEuler::getBeta() const \n"
+		"\n"
+		""},
+	 { (char *)"RotationEuler_getGamma", _wrap_RotationEuler_getGamma, METH_VARARGS, (char *)"\n"
+		"RotationEuler_getGamma(RotationEuler self) -> double\n"
+		"\n"
+		"double RotationEuler::getGamma() const \n"
+		"\n"
+		""},
+	 { (char *)"RotationEuler_getTransform3D", _wrap_RotationEuler_getTransform3D, METH_VARARGS, (char *)"\n"
+		"RotationEuler_getTransform3D(RotationEuler self) -> Transform3D\n"
+		"\n"
+		"Transform3D RotationEuler::getTransform3D() const\n"
+		"\n"
+		"Returns transformation. \n"
+		"\n"
+		""},
+	 { (char *)"delete_RotationEuler", _wrap_delete_RotationEuler, METH_VARARGS, (char *)"delete_RotationEuler(RotationEuler self)"},
+	 { (char *)"RotationEuler_swigregister", RotationEuler_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_ISelectionRule", _wrap_delete_ISelectionRule, METH_VARARGS, (char *)"\n"
+		"delete_ISelectionRule(ISelectionRule self)\n"
+		"\n"
+		"virtual ISelectionRule::~ISelectionRule()\n"
+		"\n"
+		""},
+	 { (char *)"ISelectionRule_clone", _wrap_ISelectionRule_clone, METH_VARARGS, (char *)"\n"
+		"ISelectionRule_clone(ISelectionRule self) -> ISelectionRule\n"
+		"\n"
+		"virtual ISelectionRule* ISelectionRule::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"ISelectionRule_coordinateSelected", _wrap_ISelectionRule_coordinateSelected, METH_VARARGS, (char *)"\n"
+		"ISelectionRule_coordinateSelected(ISelectionRule self, ivector_t const & coordinate) -> bool\n"
+		"\n"
+		"virtual bool ISelectionRule::coordinateSelected(const ivector_t &coordinate) const =0\n"
+		"\n"
+		""},
+	 { (char *)"ISelectionRule_swigregister", ISelectionRule_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SimpleSelectionRule", _wrap_new_SimpleSelectionRule, METH_VARARGS, (char *)"\n"
+		"new_SimpleSelectionRule(int a, int b, int c, int modulus) -> SimpleSelectionRule\n"
+		"\n"
+		"SimpleSelectionRule::SimpleSelectionRule(int a, int b, int c, int modulus)\n"
+		"\n"
+		""},
+	 { (char *)"delete_SimpleSelectionRule", _wrap_delete_SimpleSelectionRule, METH_VARARGS, (char *)"\n"
+		"delete_SimpleSelectionRule(SimpleSelectionRule self)\n"
+		"\n"
+		"virtual SimpleSelectionRule::~SimpleSelectionRule()\n"
+		"\n"
+		""},
+	 { (char *)"SimpleSelectionRule_clone", _wrap_SimpleSelectionRule_clone, METH_VARARGS, (char *)"\n"
+		"SimpleSelectionRule_clone(SimpleSelectionRule self) -> SimpleSelectionRule\n"
+		"\n"
+		"SimpleSelectionRule * SimpleSelectionRule::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"SimpleSelectionRule_coordinateSelected", _wrap_SimpleSelectionRule_coordinateSelected, METH_VARARGS, (char *)"\n"
+		"SimpleSelectionRule_coordinateSelected(SimpleSelectionRule self, ivector_t const & coordinate) -> bool\n"
+		"\n"
+		"bool SimpleSelectionRule::coordinateSelected(const ivector_t &coordinate) const \n"
+		"\n"
+		""},
+	 { (char *)"SimpleSelectionRule_swigregister", SimpleSelectionRule_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Instrument", _wrap_new_Instrument, METH_VARARGS, (char *)"\n"
+		"Instrument()\n"
+		"new_Instrument(Instrument other) -> Instrument\n"
+		"\n"
+		"Instrument::Instrument(const Instrument &other)\n"
+		"\n"
+		""},
+	 { (char *)"delete_Instrument", _wrap_delete_Instrument, METH_VARARGS, (char *)"\n"
+		"delete_Instrument(Instrument self)\n"
+		"\n"
+		"Instrument::~Instrument()\n"
+		"\n"
+		""},
+	 { (char *)"Instrument_getBeam", _wrap_Instrument_getBeam, METH_VARARGS, (char *)"\n"
+		"getBeam() -> Beam\n"
+		"Instrument_getBeam(Instrument self) -> Beam\n"
+		"\n"
+		"const Beam& Instrument::getBeam() const \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setBeam", _wrap_Instrument_setBeam, METH_VARARGS, (char *)"\n"
+		"Instrument_setBeam(Instrument self, Beam beam)\n"
+		"\n"
+		"void Instrument::setBeam(const Beam &beam)\n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setBeamParameters", _wrap_Instrument_setBeamParameters, METH_VARARGS, (char *)"\n"
+		"Instrument_setBeamParameters(Instrument self, double wavelength, double alpha_i, double phi_i)\n"
+		"\n"
+		"void Instrument::setBeamParameters(double wavelength, double alpha_i, double phi_i)\n"
+		"\n"
+		"Sets the beam wavelength and incoming angles. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setBeamIntensity", _wrap_Instrument_setBeamIntensity, METH_VARARGS, (char *)"\n"
+		"Instrument_setBeamIntensity(Instrument self, double intensity)\n"
+		"\n"
+		"void Instrument::setBeamIntensity(double intensity)\n"
+		"\n"
+		"Sets the beam's intensity. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setBeamPolarization", _wrap_Instrument_setBeamPolarization, METH_VARARGS, (char *)"\n"
+		"Instrument_setBeamPolarization(Instrument self, kvector_t bloch_vector)\n"
+		"\n"
+		"void Instrument::setBeamPolarization(const kvector_t bloch_vector)\n"
+		"\n"
+		"Sets the beam's polarization according to the given Bloch vector. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_getBeamIntensity", _wrap_Instrument_getBeamIntensity, METH_VARARGS, (char *)"\n"
+		"Instrument_getBeamIntensity(Instrument self) -> double\n"
+		"\n"
+		"double Instrument::getBeamIntensity() const\n"
+		"\n"
+		"Returns the beam's intensity. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_getDetector", _wrap_Instrument_getDetector, METH_VARARGS, (char *)"\n"
+		"getDetector() -> IDetector2D\n"
+		"Instrument_getDetector(Instrument self) -> IDetector2D\n"
+		"\n"
+		"IDetector2D * Instrument::getDetector()\n"
+		"\n"
+		""},
+	 { (char *)"Instrument_getDetectorMask", _wrap_Instrument_getDetectorMask, METH_VARARGS, (char *)"\n"
+		"Instrument_getDetectorMask(Instrument self) -> DetectorMask\n"
+		"\n"
+		"const DetectorMask * Instrument::getDetectorMask() const \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_getDetectorAxis", _wrap_Instrument_getDetectorAxis, METH_VARARGS, (char *)"\n"
+		"Instrument_getDetectorAxis(Instrument self, size_t index) -> IAxis\n"
+		"\n"
+		"const IAxis & Instrument::getDetectorAxis(size_t index) const\n"
+		"\n"
+		"Returns a detector axis. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_getDetectorDimension", _wrap_Instrument_getDetectorDimension, METH_VARARGS, (char *)"\n"
+		"Instrument_getDetectorDimension(Instrument self) -> size_t\n"
+		"\n"
+		"size_t Instrument::getDetectorDimension() const\n"
+		"\n"
+		"Returns the detector's dimension. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setDetector", _wrap_Instrument_setDetector, METH_VARARGS, (char *)"\n"
+		"Instrument_setDetector(Instrument self, IDetector2D detector)\n"
+		"\n"
+		"void Instrument::setDetector(const IDetector2D &detector)\n"
+		"\n"
+		"Sets the detector (axes can be overwritten later) \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setDetectorParameters", _wrap_Instrument_setDetectorParameters, METH_VARARGS, (char *)"\n"
+		"Instrument_setDetectorParameters(Instrument self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
+		"\n"
+		"void Instrument::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
+		"\n"
+		"Sets detector parameters using angle ranges. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setDetectorAxes", _wrap_Instrument_setDetectorAxes, METH_VARARGS, (char *)"\n"
+		"Instrument_setDetectorAxes(Instrument self, IAxis axis0, IAxis axis1)\n"
+		"\n"
+		"void Instrument::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)\n"
+		"\n"
+		"Sets detector parameters using axes. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setDetectorResolutionFunction", _wrap_Instrument_setDetectorResolutionFunction, METH_VARARGS, (char *)"\n"
+		"Instrument_setDetectorResolutionFunction(Instrument self, IResolutionFunction2D p_resolution_function)\n"
+		"\n"
+		"void Instrument::setDetectorResolutionFunction(const IResolutionFunction2D &p_resolution_function)\n"
+		"\n"
+		""},
+	 { (char *)"Instrument_setAnalyzerProperties", _wrap_Instrument_setAnalyzerProperties, METH_VARARGS, (char *)"\n"
+		"Instrument_setAnalyzerProperties(Instrument self, kvector_t direction, double efficiency, double total_transmission)\n"
+		"\n"
+		"void Instrument::setAnalyzerProperties(const kvector_t direction, double efficiency, double total_transmission=1.0)\n"
+		"\n"
+		"Sets the polarization analyzer characteristics of the detector. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_applyDetectorResolution", _wrap_Instrument_applyDetectorResolution, METH_VARARGS, (char *)"\n"
+		"Instrument_applyDetectorResolution(Instrument self, IntensityData p_intensity_map)\n"
+		"\n"
+		"void Instrument::applyDetectorResolution(OutputData< double > *p_intensity_map) const\n"
+		"\n"
+		"apply the detector resolution to the given intensity map \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_createDetectorIntensity", _wrap_Instrument_createDetectorIntensity, METH_VARARGS, (char *)"\n"
+		"createDetectorIntensity(std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements, IDetector2D::EAxesUnits units) -> IntensityData\n"
+		"Instrument_createDetectorIntensity(Instrument self, std::vector< SimulationElement,std::allocator< SimulationElement > > const & elements) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * Instrument::createDetectorIntensity(const std::vector< SimulationElement > &elements, IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const\n"
+		"\n"
+		"Returns new intensity map with detector resolution applied and axes in requested units. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_createDetectorMap", _wrap_Instrument_createDetectorMap, METH_VARARGS, (char *)"\n"
+		"createDetectorMap(IDetector2D::EAxesUnits units) -> IntensityData\n"
+		"Instrument_createDetectorMap(Instrument self) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * Instrument::createDetectorMap(IDetector2D::EAxesUnits units=IDetector2D::DEFAULT) const\n"
+		"\n"
+		"Returns empty detector map in given axes units. \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_initDetector", _wrap_Instrument_initDetector, METH_VARARGS, (char *)"\n"
+		"Instrument_initDetector(Instrument self)\n"
+		"\n"
+		"void Instrument::initDetector()\n"
+		"\n"
+		"init detector with beam settings \n"
+		"\n"
+		""},
+	 { (char *)"Instrument_swigregister", Instrument_swigregister, METH_VARARGS, NULL},
+	 { (char *)"getRelativeDifference", _wrap_getRelativeDifference, METH_VARARGS, (char *)"\n"
+		"getRelativeDifference(IntensityData dat, IntensityData ref) -> double\n"
+		"getRelativeDifference(IHistogram dat, IHistogram ref) -> double\n"
+		"\n"
+		"BA_CORE_API_ double IntensityDataFunctions::getRelativeDifference(const IHistogram &dat, const IHistogram &ref)\n"
+		"\n"
+		""},
+	 { (char *)"createRelativeDifferenceData", _wrap_createRelativeDifferenceData, METH_VARARGS, (char *)"\n"
+		"createRelativeDifferenceData(IntensityData data, IntensityData reference) -> IntensityData\n"
+		"\n"
+		"BA_CORE_API_ OutputData<double>* IntensityDataFunctions::createRelativeDifferenceData(const OutputData< double > &data, const OutputData< double > &reference)\n"
+		"\n"
+		""},
+	 { (char *)"createClippedDataSet", _wrap_createClippedDataSet, METH_VARARGS, (char *)"\n"
+		"createClippedDataSet(IntensityData origin, double x1, double y1, double x2, double y2) -> IntensityData\n"
+		"\n"
+		"BA_CORE_API_ OutputData<double>* IntensityDataFunctions::createClippedDataSet(const OutputData< double > &origin, double x1, double y1, double x2, double y2)\n"
+		"\n"
+		"Returns new IntensityData objects which axes clipped to represent the specified rectangle \n"
+		"\n"
+		""},
+	 { (char *)"applyDetectorResolution", _wrap_applyDetectorResolution, METH_VARARGS, (char *)"\n"
+		"applyDetectorResolution(IntensityData origin, IResolutionFunction2D resolution_function) -> IntensityData\n"
+		"\n"
+		"BA_CORE_API_ OutputData<double>* IntensityDataFunctions::applyDetectorResolution(const OutputData< double > &origin, const IResolutionFunction2D &resolution_function)\n"
+		"\n"
+		"Applies detector resolution function and returns new IntensityData object. \n"
+		"\n"
+		""},
+	 { (char *)"coordinateToBinf", _wrap_coordinateToBinf, METH_VARARGS, (char *)"\n"
+		"coordinateToBinf(double coordinate, IAxis axis) -> double\n"
+		"coordinateToBinf(double & x, double & y, IntensityData data)\n"
+		"\n"
+		"BA_CORE_API_ void IntensityDataFunctions::coordinateToBinf(double &x, double &y, const OutputData< double > &data)\n"
+		"\n"
+		"Transform x,y coordinate from  OutputData axes coordinates to bin-fraction-coordinates \n"
+		"\n"
+		""},
+	 { (char *)"coordinateFromBinf", _wrap_coordinateFromBinf, METH_VARARGS, (char *)"\n"
+		"coordinateFromBinf(double value, IAxis axis) -> double\n"
+		"coordinateFromBinf(double & x, double & y, IntensityData data)\n"
+		"\n"
+		"BA_CORE_API_ void IntensityDataFunctions::coordinateFromBinf(double &x, double &y, const OutputData< double > &data)\n"
+		"\n"
+		"Transform x,y coordinate from bin-fraction-coordinates to  OutputData's axes coordinates \n"
+		"\n"
+		""},
+	 { (char *)"IntensityDataIOFactory_readOutputData", _wrap_IntensityDataIOFactory_readOutputData, METH_VARARGS, (char *)"IntensityDataIOFactory_readOutputData(std::string const & file_name) -> IntensityData"},
+	 { (char *)"IntensityDataIOFactory_readIntensityData", _wrap_IntensityDataIOFactory_readIntensityData, METH_VARARGS, (char *)"IntensityDataIOFactory_readIntensityData(std::string const & file_name) -> IHistogram"},
+	 { (char *)"IntensityDataIOFactory_writeOutputData", _wrap_IntensityDataIOFactory_writeOutputData, METH_VARARGS, (char *)"IntensityDataIOFactory_writeOutputData(IntensityData data, std::string const & file_name)"},
+	 { (char *)"IntensityDataIOFactory_writeIntensityData", _wrap_IntensityDataIOFactory_writeIntensityData, METH_VARARGS, (char *)"IntensityDataIOFactory_writeIntensityData(IHistogram histogram, std::string const & file_name)"},
+	 { (char *)"new_IntensityDataIOFactory", _wrap_new_IntensityDataIOFactory, METH_VARARGS, (char *)"\n"
+		"new_IntensityDataIOFactory() -> IntensityDataIOFactory\n"
+		"\n"
+		"\n"
+		"\n"
+		"Provides users with possibility to read and write IntensityData from/to files in different format. Type of the file will be deduced from file name. *.txt - ASCII file with 2D array [nrow][ncol], layout as in numpy. *.int - BornAgain internal ASCII format. *.tif - 32-bits tiff file. If file name ends woth \"*.gz\" or \"*.bz2\" the file will be zipped on the fly using appropriate algorithm.\n"
+		"\n"
+		"Usage:\n"
+		"\n"
+		"C++ includes: IntensityDataIOFactory.h\n"
+		"\n"
+		""},
+	 { (char *)"delete_IntensityDataIOFactory", _wrap_delete_IntensityDataIOFactory, METH_VARARGS, (char *)"delete_IntensityDataIOFactory(IntensityDataIOFactory self)"},
+	 { (char *)"IntensityDataIOFactory_swigregister", IntensityDataIOFactory_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_InterferenceFunction1DLattice", _wrap_new_InterferenceFunction1DLattice, METH_VARARGS, (char *)"\n"
+		"new_InterferenceFunction1DLattice(double length, double xi) -> InterferenceFunction1DLattice\n"
+		"\n"
+		"InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, double xi)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		" Lattice length\n"
+		"\n"
+		"xi: \n"
+		"rotation of lattice with respect to x-axis \n"
+		"\n"
+		""},
+	 { (char *)"delete_InterferenceFunction1DLattice", _wrap_delete_InterferenceFunction1DLattice, METH_VARARGS, (char *)"\n"
+		"delete_InterferenceFunction1DLattice(InterferenceFunction1DLattice self)\n"
+		"\n"
+		"InterferenceFunction1DLattice::~InterferenceFunction1DLattice() final\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction1DLattice_clone", _wrap_InterferenceFunction1DLattice_clone, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction1DLattice_clone(InterferenceFunction1DLattice self) -> InterferenceFunction1DLattice\n"
+		"\n"
+		"InterferenceFunction1DLattice * InterferenceFunction1DLattice::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction1DLattice_accept", _wrap_InterferenceFunction1DLattice_accept, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction1DLattice_accept(InterferenceFunction1DLattice self, ISampleVisitor visitor)\n"
+		"\n"
+		"void InterferenceFunction1DLattice::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction1DLattice_setDecayFunction", _wrap_InterferenceFunction1DLattice_setDecayFunction, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction1DLattice_setDecayFunction(InterferenceFunction1DLattice self, IFTDecayFunction1D pdf)\n"
+		"\n"
+		"void InterferenceFunction1DLattice::setDecayFunction(const IFTDecayFunction1D &pdf)\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction1DLattice_getLatticeParameters", _wrap_InterferenceFunction1DLattice_getLatticeParameters, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction1DLattice_getLatticeParameters(InterferenceFunction1DLattice self) -> Lattice1DParameters\n"
+		"\n"
+		"Lattice1DParameters InterferenceFunction1DLattice::getLatticeParameters() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction1DLattice_getDecayFunction", _wrap_InterferenceFunction1DLattice_getDecayFunction, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction1DLattice_getDecayFunction(InterferenceFunction1DLattice self) -> IFTDecayFunction1D\n"
+		"\n"
+		"const IFTDecayFunction1D* InterferenceFunction1DLattice::getDecayFunction() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction1DLattice_evaluate", _wrap_InterferenceFunction1DLattice_evaluate, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction1DLattice_evaluate(InterferenceFunction1DLattice self, kvector_t q) -> double\n"
+		"\n"
+		"double InterferenceFunction1DLattice::evaluate(const kvector_t q) const final\n"
+		"\n"
+		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction1DLattice_swigregister", InterferenceFunction1DLattice_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_InterferenceFunctionRadialParaCrystal", _wrap_new_InterferenceFunctionRadialParaCrystal, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal(double peak_distance, double damping_length=0.0)\n"
+		"new_InterferenceFunctionRadialParaCrystal(double peak_distance) -> InterferenceFunctionRadialParaCrystal\n"
+		"\n"
+		"InterferenceFunctionRadialParaCrystal::InterferenceFunctionRadialParaCrystal(double peak_distance, double damping_length=0.0)\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_clone", _wrap_InterferenceFunctionRadialParaCrystal_clone, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_clone(InterferenceFunctionRadialParaCrystal self) -> InterferenceFunctionRadialParaCrystal\n"
+		"\n"
+		"InterferenceFunctionRadialParaCrystal * InterferenceFunctionRadialParaCrystal::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_accept", _wrap_InterferenceFunctionRadialParaCrystal_accept, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_accept(InterferenceFunctionRadialParaCrystal self, ISampleVisitor visitor)\n"
+		"\n"
+		"void InterferenceFunctionRadialParaCrystal::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_to_str", _wrap_InterferenceFunctionRadialParaCrystal_to_str, METH_VARARGS, (char *)"\n"
+		"to_str(int indent=0) -> std::string\n"
+		"InterferenceFunctionRadialParaCrystal_to_str(InterferenceFunctionRadialParaCrystal self) -> std::string\n"
+		"\n"
+		"std::string InterferenceFunctionRadialParaCrystal::to_str(int indent=0) const final\n"
+		"\n"
+		"Returns textual representation of this and its descendants. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_setKappa", _wrap_InterferenceFunctionRadialParaCrystal_setKappa, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_setKappa(InterferenceFunctionRadialParaCrystal self, double kappa)\n"
+		"\n"
+		"void InterferenceFunctionRadialParaCrystal::setKappa(double kappa)\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_getKappa", _wrap_InterferenceFunctionRadialParaCrystal_getKappa, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_getKappa(InterferenceFunctionRadialParaCrystal self) -> double\n"
+		"\n"
+		"double InterferenceFunctionRadialParaCrystal::getKappa() const final\n"
+		"\n"
+		"Retrieves the size-distance coupling constant (default 0.0) \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_setDomainSize", _wrap_InterferenceFunctionRadialParaCrystal_setDomainSize, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_setDomainSize(InterferenceFunctionRadialParaCrystal self, double size)\n"
+		"\n"
+		"void InterferenceFunctionRadialParaCrystal::setDomainSize(double size)\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_getDomainSize", _wrap_InterferenceFunctionRadialParaCrystal_getDomainSize, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_getDomainSize(InterferenceFunctionRadialParaCrystal self) -> double\n"
+		"\n"
+		"double InterferenceFunctionRadialParaCrystal::getDomainSize() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_evaluate", _wrap_InterferenceFunctionRadialParaCrystal_evaluate, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_evaluate(InterferenceFunctionRadialParaCrystal self, kvector_t q) -> double\n"
+		"\n"
+		"double InterferenceFunctionRadialParaCrystal::evaluate(const kvector_t q) const final\n"
+		"\n"
+		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_FTPDF", _wrap_InterferenceFunctionRadialParaCrystal_FTPDF, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_FTPDF(InterferenceFunctionRadialParaCrystal self, double qpar) -> complex_t\n"
+		"\n"
+		"complex_t InterferenceFunctionRadialParaCrystal::FTPDF(double qpar) const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_setProbabilityDistribution", _wrap_InterferenceFunctionRadialParaCrystal_setProbabilityDistribution, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_setProbabilityDistribution(InterferenceFunctionRadialParaCrystal self, IFTDistribution1D pdf)\n"
+		"\n"
+		"void InterferenceFunctionRadialParaCrystal::setProbabilityDistribution(const IFTDistribution1D &pdf)\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_getProbabilityDistribution", _wrap_InterferenceFunctionRadialParaCrystal_getProbabilityDistribution, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_getProbabilityDistribution(InterferenceFunctionRadialParaCrystal self) -> IFTDistribution1D\n"
+		"\n"
+		"const IFTDistribution1D* InterferenceFunctionRadialParaCrystal::getProbabilityDistribution() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_getPeakDistance", _wrap_InterferenceFunctionRadialParaCrystal_getPeakDistance, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_getPeakDistance(InterferenceFunctionRadialParaCrystal self) -> double\n"
+		"\n"
+		"double InterferenceFunctionRadialParaCrystal::getPeakDistance() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_getDampingLength", _wrap_InterferenceFunctionRadialParaCrystal_getDampingLength, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionRadialParaCrystal_getDampingLength(InterferenceFunctionRadialParaCrystal self) -> double\n"
+		"\n"
+		"double InterferenceFunctionRadialParaCrystal::getDampingLength() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_InterferenceFunctionRadialParaCrystal", _wrap_delete_InterferenceFunctionRadialParaCrystal, METH_VARARGS, (char *)"delete_InterferenceFunctionRadialParaCrystal(InterferenceFunctionRadialParaCrystal self)"},
+	 { (char *)"InterferenceFunctionRadialParaCrystal_swigregister", InterferenceFunctionRadialParaCrystal_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_InterferenceFunction2DLattice", _wrap_new_InterferenceFunction2DLattice, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice(double length_1, double length_2, double angle, double xi=0.0)\n"
+		"new_InterferenceFunction2DLattice(double length_1, double length_2, double angle) -> InterferenceFunction2DLattice\n"
+		"\n"
+		"InterferenceFunction2DLattice::InterferenceFunction2DLattice(double length_1, double length_2, double angle, double xi=0.0)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length_1: \n"
+		" Lattice length 1\n"
+		"\n"
+		"length_2: \n"
+		" Lattice length 2\n"
+		"\n"
+		"angle: \n"
+		"angle between lattice vectors\n"
+		"\n"
+		"xi: \n"
+		"rotation of lattice with respect to x-axis \n"
+		"\n"
+		""},
+	 { (char *)"delete_InterferenceFunction2DLattice", _wrap_delete_InterferenceFunction2DLattice, METH_VARARGS, (char *)"\n"
+		"delete_InterferenceFunction2DLattice(InterferenceFunction2DLattice self)\n"
+		"\n"
+		"InterferenceFunction2DLattice::~InterferenceFunction2DLattice() final\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_clone", _wrap_InterferenceFunction2DLattice_clone, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice_clone(InterferenceFunction2DLattice self) -> InterferenceFunction2DLattice\n"
+		"\n"
+		"InterferenceFunction2DLattice * InterferenceFunction2DLattice::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_accept", _wrap_InterferenceFunction2DLattice_accept, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice_accept(InterferenceFunction2DLattice self, ISampleVisitor visitor)\n"
+		"\n"
+		"void InterferenceFunction2DLattice::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_createSquare", _wrap_InterferenceFunction2DLattice_createSquare, METH_VARARGS, (char *)"\n"
+		"createSquare(double lattice_length, double xi=0.0) -> InterferenceFunction2DLattice\n"
+		"InterferenceFunction2DLattice_createSquare(double lattice_length) -> InterferenceFunction2DLattice\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_createHexagonal", _wrap_InterferenceFunction2DLattice_createHexagonal, METH_VARARGS, (char *)"\n"
+		"createHexagonal(double lattice_length, double xi=0.0) -> InterferenceFunction2DLattice\n"
+		"InterferenceFunction2DLattice_createHexagonal(double lattice_length) -> InterferenceFunction2DLattice\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_setDecayFunction", _wrap_InterferenceFunction2DLattice_setDecayFunction, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice_setDecayFunction(InterferenceFunction2DLattice self, IFTDecayFunction2D pdf)\n"
+		"\n"
+		"void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D &pdf)\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_getDecayFunction", _wrap_InterferenceFunction2DLattice_getDecayFunction, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice_getDecayFunction(InterferenceFunction2DLattice self) -> IFTDecayFunction2D\n"
+		"\n"
+		"const IFTDecayFunction2D* InterferenceFunction2DLattice::getDecayFunction() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_evaluate", _wrap_InterferenceFunction2DLattice_evaluate, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice_evaluate(InterferenceFunction2DLattice self, kvector_t q) -> double\n"
+		"\n"
+		"double InterferenceFunction2DLattice::evaluate(const kvector_t q) const final\n"
+		"\n"
+		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_getLatticeParameters", _wrap_InterferenceFunction2DLattice_getLatticeParameters, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice_getLatticeParameters(InterferenceFunction2DLattice self) -> Lattice2DParameters\n"
+		"\n"
+		"Lattice2DParameters InterferenceFunction2DLattice::getLatticeParameters() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_getParticleDensity", _wrap_InterferenceFunction2DLattice_getParticleDensity, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DLattice_getParticleDensity(InterferenceFunction2DLattice self) -> double\n"
+		"\n"
+		"double InterferenceFunction2DLattice::getParticleDensity() const final\n"
+		"\n"
+		"Returns the particle density associated with this 2d lattice. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DLattice_swigregister", InterferenceFunction2DLattice_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_InterferenceFunction2DParaCrystal", _wrap_new_InterferenceFunction2DParaCrystal, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha_lattice, double xi=0.0, double damping_length=0.0)\n"
+		"InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha_lattice, double xi=0.0)\n"
+		"new_InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha_lattice) -> InterferenceFunction2DParaCrystal\n"
+		"\n"
+		"InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha_lattice, double xi=0.0, double damping_length=0.0)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length_1: \n"
+		"Length of first lattice basis vector.\n"
+		"\n"
+		"length_2: \n"
+		"Length of second lattice basis vector.\n"
+		"\n"
+		"alpha_lattice: \n"
+		"Angle between the lattice basis vectors.\n"
+		"\n"
+		"xi: \n"
+		"Angle between first basis vector and the x-axis of incoming beam.\n"
+		"\n"
+		"damping_length: \n"
+		"Damping length for removing delta function singularity at q=0. \n"
+		"\n"
+		""},
+	 { (char *)"delete_InterferenceFunction2DParaCrystal", _wrap_delete_InterferenceFunction2DParaCrystal, METH_VARARGS, (char *)"\n"
+		"delete_InterferenceFunction2DParaCrystal(InterferenceFunction2DParaCrystal self)\n"
+		"\n"
+		"InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal() final\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_clone", _wrap_InterferenceFunction2DParaCrystal_clone, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_clone(InterferenceFunction2DParaCrystal self) -> InterferenceFunction2DParaCrystal\n"
+		"\n"
+		"InterferenceFunction2DParaCrystal * InterferenceFunction2DParaCrystal::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_accept", _wrap_InterferenceFunction2DParaCrystal_accept, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_accept(InterferenceFunction2DParaCrystal self, ISampleVisitor visitor)\n"
+		"\n"
+		"void InterferenceFunction2DParaCrystal::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_to_str", _wrap_InterferenceFunction2DParaCrystal_to_str, METH_VARARGS, (char *)"\n"
+		"to_str(int indent=0) -> std::string\n"
+		"InterferenceFunction2DParaCrystal_to_str(InterferenceFunction2DParaCrystal self) -> std::string\n"
+		"\n"
+		"std::string InterferenceFunction2DParaCrystal::to_str(int indent=0) const final\n"
+		"\n"
+		"Returns textual representation of this and its descendants. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_createSquare", _wrap_InterferenceFunction2DParaCrystal_createSquare, METH_VARARGS, (char *)"\n"
+		"createSquare(double peak_distance, double damping_length=0.0, double domain_size_1=0.0, double domain_size_2=0.0) -> InterferenceFunction2DParaCrystal\n"
+		"createSquare(double peak_distance, double damping_length=0.0, double domain_size_1=0.0) -> InterferenceFunction2DParaCrystal\n"
+		"createSquare(double peak_distance, double damping_length=0.0) -> InterferenceFunction2DParaCrystal\n"
+		"InterferenceFunction2DParaCrystal_createSquare(double peak_distance) -> InterferenceFunction2DParaCrystal\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_createHexagonal", _wrap_InterferenceFunction2DParaCrystal_createHexagonal, METH_VARARGS, (char *)"\n"
+		"createHexagonal(double peak_distance, double damping_length=0.0, double domain_size_1=0.0, double domain_size_2=0.0) -> InterferenceFunction2DParaCrystal\n"
+		"createHexagonal(double peak_distance, double damping_length=0.0, double domain_size_1=0.0) -> InterferenceFunction2DParaCrystal\n"
+		"createHexagonal(double peak_distance, double damping_length=0.0) -> InterferenceFunction2DParaCrystal\n"
+		"InterferenceFunction2DParaCrystal_createHexagonal(double peak_distance) -> InterferenceFunction2DParaCrystal\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_setDomainSizes", _wrap_InterferenceFunction2DParaCrystal_setDomainSizes, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_setDomainSizes(InterferenceFunction2DParaCrystal self, double size_1, double size_2)\n"
+		"\n"
+		"void InterferenceFunction2DParaCrystal::setDomainSizes(double size_1, double size_2)\n"
+		"\n"
+		"Sets the sizes of coherence domains.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"size_1: \n"
+		"size in first lattice direction\n"
+		"\n"
+		"size_2: \n"
+		"size in second lattice direction \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_setProbabilityDistributions", _wrap_InterferenceFunction2DParaCrystal_setProbabilityDistributions, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_setProbabilityDistributions(InterferenceFunction2DParaCrystal self, IFTDistribution2D pdf_1, IFTDistribution2D pdf_2)\n"
+		"\n"
+		"void InterferenceFunction2DParaCrystal::setProbabilityDistributions(const IFTDistribution2D &pdf_1, const IFTDistribution2D &pdf_2)\n"
+		"\n"
+		"Sets the probability distributions (Fourier transformed) for the two lattice directions.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"pdf_1: \n"
+		"probability distribution in first lattice direction\n"
+		"\n"
+		"pdf_2: \n"
+		"probability distribution in second lattice direction \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_evaluate", _wrap_InterferenceFunction2DParaCrystal_evaluate, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_evaluate(InterferenceFunction2DParaCrystal self, kvector_t q) -> double\n"
+		"\n"
+		"double InterferenceFunction2DParaCrystal::evaluate(const kvector_t q) const final\n"
+		"\n"
+		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_getDomainSizes", _wrap_InterferenceFunction2DParaCrystal_getDomainSizes, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_getDomainSizes(InterferenceFunction2DParaCrystal self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > InterferenceFunction2DParaCrystal::getDomainSizes() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_getProbabilityDistributions", _wrap_InterferenceFunction2DParaCrystal_getProbabilityDistributions, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_getProbabilityDistributions(InterferenceFunction2DParaCrystal self) -> std::vector< IFTDistribution2D const *,std::allocator< IFTDistribution2D const * > >\n"
+		"\n"
+		"std::vector< const IFTDistribution2D * > InterferenceFunction2DParaCrystal::getProbabilityDistributions() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_setIntegrationOverXi", _wrap_InterferenceFunction2DParaCrystal_setIntegrationOverXi, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_setIntegrationOverXi(InterferenceFunction2DParaCrystal self, bool integrate_xi)\n"
+		"\n"
+		"void InterferenceFunction2DParaCrystal::setIntegrationOverXi(bool integrate_xi)\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_getIntegrationOverXi", _wrap_InterferenceFunction2DParaCrystal_getIntegrationOverXi, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_getIntegrationOverXi(InterferenceFunction2DParaCrystal self) -> bool\n"
+		"\n"
+		"bool InterferenceFunction2DParaCrystal::getIntegrationOverXi() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_getDampingLength", _wrap_InterferenceFunction2DParaCrystal_getDampingLength, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_getDampingLength(InterferenceFunction2DParaCrystal self) -> double\n"
+		"\n"
+		"double InterferenceFunction2DParaCrystal::getDampingLength() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_getLatticeParameters", _wrap_InterferenceFunction2DParaCrystal_getLatticeParameters, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_getLatticeParameters(InterferenceFunction2DParaCrystal self) -> Lattice2DParameters\n"
+		"\n"
+		"Lattice2DParameters InterferenceFunction2DParaCrystal::getLatticeParameters() const \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_getParticleDensity", _wrap_InterferenceFunction2DParaCrystal_getParticleDensity, METH_VARARGS, (char *)"\n"
+		"InterferenceFunction2DParaCrystal_getParticleDensity(InterferenceFunction2DParaCrystal self) -> double\n"
+		"\n"
+		"double InterferenceFunction2DParaCrystal::getParticleDensity() const final\n"
+		"\n"
+		"If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunction2DParaCrystal_swigregister", InterferenceFunction2DParaCrystal_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_InterferenceFunctionNone", _wrap_new_InterferenceFunctionNone, METH_VARARGS, (char *)"\n"
+		"new_InterferenceFunctionNone() -> InterferenceFunctionNone\n"
+		"\n"
+		"InterferenceFunctionNone::InterferenceFunctionNone()\n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionNone_clone", _wrap_InterferenceFunctionNone_clone, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionNone_clone(InterferenceFunctionNone self) -> InterferenceFunctionNone\n"
+		"\n"
+		"InterferenceFunctionNone* InterferenceFunctionNone::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionNone_accept", _wrap_InterferenceFunctionNone_accept, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionNone_accept(InterferenceFunctionNone self, ISampleVisitor visitor)\n"
+		"\n"
+		"void InterferenceFunctionNone::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"InterferenceFunctionNone_evaluate", _wrap_InterferenceFunctionNone_evaluate, METH_VARARGS, (char *)"\n"
+		"InterferenceFunctionNone_evaluate(InterferenceFunctionNone self, kvector_t arg3) -> double\n"
+		"\n"
+		"double InterferenceFunctionNone::evaluate(const kvector_t) const final\n"
+		"\n"
+		"Evaluates the interference function for a given wavevector transfer (only the real x and y components are relevant) \n"
+		"\n"
+		""},
+	 { (char *)"delete_InterferenceFunctionNone", _wrap_delete_InterferenceFunctionNone, METH_VARARGS, (char *)"delete_InterferenceFunctionNone(InterferenceFunctionNone self)"},
+	 { (char *)"InterferenceFunctionNone_swigregister", InterferenceFunctionNone_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IPixelMap", _wrap_delete_IPixelMap, METH_VARARGS, (char *)"\n"
+		"delete_IPixelMap(IPixelMap self)\n"
+		"\n"
+		"virtual IPixelMap::~IPixelMap()\n"
+		"\n"
+		""},
+	 { (char *)"IPixelMap_clone", _wrap_IPixelMap_clone, METH_VARARGS, (char *)"\n"
+		"IPixelMap_clone(IPixelMap self) -> IPixelMap\n"
+		"\n"
+		"virtual IPixelMap* IPixelMap::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IPixelMap_createZeroSizeMap", _wrap_IPixelMap_createZeroSizeMap, METH_VARARGS, (char *)"\n"
+		"IPixelMap_createZeroSizeMap(IPixelMap self, double x, double y) -> IPixelMap\n"
+		"\n"
+		"virtual IPixelMap* IPixelMap::createZeroSizeMap(double x, double y) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IPixelMap_getK", _wrap_IPixelMap_getK, METH_VARARGS, (char *)"\n"
+		"IPixelMap_getK(IPixelMap self, double x, double y, double wavelength) -> kvector_t\n"
+		"\n"
+		"virtual kvector_t IPixelMap::getK(double x, double y, double wavelength) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IPixelMap_getIntegrationFactor", _wrap_IPixelMap_getIntegrationFactor, METH_VARARGS, (char *)"\n"
+		"IPixelMap_getIntegrationFactor(IPixelMap self, double x, double y) -> double\n"
+		"\n"
+		"virtual double IPixelMap::getIntegrationFactor(double x, double y) const =0\n"
+		"\n"
+		""},
+	 { (char *)"IPixelMap_getSolidAngle", _wrap_IPixelMap_getSolidAngle, METH_VARARGS, (char *)"\n"
+		"IPixelMap_getSolidAngle(IPixelMap self) -> double\n"
+		"\n"
+		"virtual double IPixelMap::getSolidAngle() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IPixelMap_swigregister", IPixelMap_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SphericalDetector", _wrap_new_SphericalDetector, METH_VARARGS, (char *)"\n"
+		"SphericalDetector()\n"
+		"SphericalDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
+		"new_SphericalDetector(SphericalDetector other) -> SphericalDetector\n"
+		"\n"
+		"SphericalDetector::SphericalDetector(const SphericalDetector &other)\n"
+		"\n"
+		""},
+	 { (char *)"SphericalDetector_clone", _wrap_SphericalDetector_clone, METH_VARARGS, (char *)"\n"
+		"SphericalDetector_clone(SphericalDetector self) -> SphericalDetector\n"
+		"\n"
+		"SphericalDetector * SphericalDetector::clone() const override\n"
+		"\n"
+		""},
+	 { (char *)"delete_SphericalDetector", _wrap_delete_SphericalDetector, METH_VARARGS, (char *)"\n"
+		"delete_SphericalDetector(SphericalDetector self)\n"
+		"\n"
+		"SphericalDetector::~SphericalDetector() override\n"
+		"\n"
+		""},
+	 { (char *)"SphericalDetector_getValidAxesUnits", _wrap_SphericalDetector_getValidAxesUnits, METH_VARARGS, (char *)"\n"
+		"SphericalDetector_getValidAxesUnits(SphericalDetector self) -> std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >\n"
+		"\n"
+		"std::vector< IDetector2D::EAxesUnits > SphericalDetector::getValidAxesUnits() const override\n"
+		"\n"
+		"returns vector of valid axes units \n"
+		"\n"
+		""},
+	 { (char *)"SphericalDetector_getDefaultAxesUnits", _wrap_SphericalDetector_getDefaultAxesUnits, METH_VARARGS, (char *)"\n"
+		"SphericalDetector_getDefaultAxesUnits(SphericalDetector self) -> IDetector2D::EAxesUnits\n"
+		"\n"
+		"IDetector2D::EAxesUnits SphericalDetector::getDefaultAxesUnits() const override\n"
+		"\n"
+		"return default axes units \n"
+		"\n"
+		""},
+	 { (char *)"SphericalDetector_swigregister", SphericalDetector_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_AngularPixelMap", _wrap_new_AngularPixelMap, METH_VARARGS, (char *)"\n"
+		"new_AngularPixelMap(Bin1D alpha_bin, Bin1D phi_bin) -> AngularPixelMap\n"
+		"\n"
+		"AngularPixelMap::AngularPixelMap(Bin1D alpha_bin, Bin1D phi_bin)\n"
+		"\n"
+		""},
+	 { (char *)"delete_AngularPixelMap", _wrap_delete_AngularPixelMap, METH_VARARGS, (char *)"\n"
+		"delete_AngularPixelMap(AngularPixelMap self)\n"
+		"\n"
+		"virtual AngularPixelMap::~AngularPixelMap()\n"
+		"\n"
+		""},
+	 { (char *)"AngularPixelMap_clone", _wrap_AngularPixelMap_clone, METH_VARARGS, (char *)"\n"
+		"AngularPixelMap_clone(AngularPixelMap self) -> AngularPixelMap\n"
+		"\n"
+		"AngularPixelMap * AngularPixelMap::clone() const override\n"
+		"\n"
+		""},
+	 { (char *)"AngularPixelMap_createZeroSizeMap", _wrap_AngularPixelMap_createZeroSizeMap, METH_VARARGS, (char *)"\n"
+		"AngularPixelMap_createZeroSizeMap(AngularPixelMap self, double x, double y) -> AngularPixelMap\n"
+		"\n"
+		"AngularPixelMap * AngularPixelMap::createZeroSizeMap(double x, double y) const override\n"
+		"\n"
+		""},
+	 { (char *)"AngularPixelMap_getK", _wrap_AngularPixelMap_getK, METH_VARARGS, (char *)"\n"
+		"AngularPixelMap_getK(AngularPixelMap self, double x, double y, double wavelength) -> kvector_t\n"
+		"\n"
+		"kvector_t AngularPixelMap::getK(double x, double y, double wavelength) const override\n"
+		"\n"
+		""},
+	 { (char *)"AngularPixelMap_getIntegrationFactor", _wrap_AngularPixelMap_getIntegrationFactor, METH_VARARGS, (char *)"\n"
+		"AngularPixelMap_getIntegrationFactor(AngularPixelMap self, double x, double y) -> double\n"
+		"\n"
+		"double AngularPixelMap::getIntegrationFactor(double x, double y) const override\n"
+		"\n"
+		""},
+	 { (char *)"AngularPixelMap_getSolidAngle", _wrap_AngularPixelMap_getSolidAngle, METH_VARARGS, (char *)"\n"
+		"AngularPixelMap_getSolidAngle(AngularPixelMap self) -> double\n"
+		"\n"
+		"double AngularPixelMap::getSolidAngle() const override\n"
+		"\n"
+		""},
+	 { (char *)"AngularPixelMap_swigregister", AngularPixelMap_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IsGISAXSDetector", _wrap_new_IsGISAXSDetector, METH_VARARGS, (char *)"\n"
+		"IsGISAXSDetector()\n"
+		"IsGISAXSDetector(size_t n_phi, double phi_min, double phi_max, size_t n_alpha, double alpha_min, double alpha_max)\n"
+		"new_IsGISAXSDetector(IsGISAXSDetector other) -> IsGISAXSDetector\n"
+		"\n"
+		"IsGISAXSDetector::IsGISAXSDetector(const IsGISAXSDetector &other)\n"
+		"\n"
+		""},
+	 { (char *)"IsGISAXSDetector_clone", _wrap_IsGISAXSDetector_clone, METH_VARARGS, (char *)"\n"
+		"IsGISAXSDetector_clone(IsGISAXSDetector self) -> IsGISAXSDetector\n"
+		"\n"
+		"IsGISAXSDetector * IsGISAXSDetector::clone() const override\n"
+		"\n"
+		""},
+	 { (char *)"delete_IsGISAXSDetector", _wrap_delete_IsGISAXSDetector, METH_VARARGS, (char *)"delete_IsGISAXSDetector(IsGISAXSDetector self)"},
+	 { (char *)"IsGISAXSDetector_swigregister", IsGISAXSDetector_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Lattice", _wrap_new_Lattice, METH_VARARGS, (char *)"\n"
+		"Lattice(kvector_t a1, kvector_t a2, kvector_t a3)\n"
+		"new_Lattice(Lattice lattice) -> Lattice\n"
+		"\n"
+		"Lattice::Lattice(const Lattice &lattice)\n"
+		"\n"
+		""},
+	 { (char *)"delete_Lattice", _wrap_delete_Lattice, METH_VARARGS, (char *)"\n"
+		"delete_Lattice(Lattice self)\n"
+		"\n"
+		"Lattice::~Lattice()\n"
+		"\n"
+		""},
+	 { (char *)"Lattice_createTransformedLattice", _wrap_Lattice_createTransformedLattice, METH_VARARGS, (char *)"\n"
+		"Lattice_createTransformedLattice(Lattice self, Transform3D const & transform) -> Lattice\n"
+		"\n"
+		"Lattice Lattice::createTransformedLattice(const Transform3D &transform) const\n"
+		"\n"
+		"Create transformed lattice. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_initialize", _wrap_Lattice_initialize, METH_VARARGS, (char *)"\n"
+		"Lattice_initialize(Lattice self)\n"
+		"\n"
+		"void Lattice::initialize() const\n"
+		"\n"
+		"Initializes cached data. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_getBasisVectorA", _wrap_Lattice_getBasisVectorA, METH_VARARGS, (char *)"\n"
+		"Lattice_getBasisVectorA(Lattice self) -> kvector_t\n"
+		"\n"
+		"kvector_t Lattice::getBasisVectorA() const\n"
+		"\n"
+		"Returns basis vector a. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_getBasisVectorB", _wrap_Lattice_getBasisVectorB, METH_VARARGS, (char *)"\n"
+		"Lattice_getBasisVectorB(Lattice self) -> kvector_t\n"
+		"\n"
+		"kvector_t Lattice::getBasisVectorB() const\n"
+		"\n"
+		"Returns basis vector b. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_getBasisVectorC", _wrap_Lattice_getBasisVectorC, METH_VARARGS, (char *)"\n"
+		"Lattice_getBasisVectorC(Lattice self) -> kvector_t\n"
+		"\n"
+		"kvector_t Lattice::getBasisVectorC() const\n"
+		"\n"
+		"Returns basis vector c. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_getVolume", _wrap_Lattice_getVolume, METH_VARARGS, (char *)"\n"
+		"Lattice_getVolume(Lattice self) -> double\n"
+		"\n"
+		"double Lattice::getVolume() const\n"
+		"\n"
+		"Returns the volume of the unit cell. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_getReciprocalLatticeBasis", _wrap_Lattice_getReciprocalLatticeBasis, METH_VARARGS, (char *)"\n"
+		"Lattice_getReciprocalLatticeBasis(Lattice self, kvector_t b1, kvector_t b2, kvector_t b3)\n"
+		"\n"
+		"void Lattice::getReciprocalLatticeBasis(kvector_t b1, kvector_t b2, kvector_t b3) const\n"
+		"\n"
+		"Returns the reciprocal basis vectors. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_getNearestLatticeVectorCoordinates", _wrap_Lattice_getNearestLatticeVectorCoordinates, METH_VARARGS, (char *)"\n"
+		"Lattice_getNearestLatticeVectorCoordinates(Lattice self, kvector_t vector_in) -> ivector_t\n"
+		"\n"
+		"ivector_t Lattice::getNearestLatticeVectorCoordinates(const kvector_t vector_in) const\n"
+		"\n"
+		"Returns the nearest lattice point from a given vector. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_getNearestReciprocalLatticeVectorCoordinates", _wrap_Lattice_getNearestReciprocalLatticeVectorCoordinates, METH_VARARGS, (char *)"\n"
+		"Lattice_getNearestReciprocalLatticeVectorCoordinates(Lattice self, kvector_t vector_in) -> ivector_t\n"
+		"\n"
+		"ivector_t Lattice::getNearestReciprocalLatticeVectorCoordinates(const kvector_t vector_in) const\n"
+		"\n"
+		"Returns the nearest reciprocal lattice point from a given vector. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_reciprocalLatticeVectorsWithinRadius", _wrap_Lattice_reciprocalLatticeVectorsWithinRadius, METH_VARARGS, (char *)"\n"
+		"Lattice_reciprocalLatticeVectorsWithinRadius(Lattice self, kvector_t input_vector, double radius) -> vector_kvector_t\n"
+		"\n"
+		"std::vector< kvector_t > Lattice::reciprocalLatticeVectorsWithinRadius(const kvector_t input_vector, double radius) const\n"
+		"\n"
+		"Computes a list of reciprocal lattice vectors within a specified distance of a given vector. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_setSelectionRule", _wrap_Lattice_setSelectionRule, METH_VARARGS, (char *)"\n"
+		"Lattice_setSelectionRule(Lattice self, ISelectionRule p_selection_rule)\n"
+		"\n"
+		"void Lattice::setSelectionRule(const ISelectionRule &p_selection_rule)\n"
+		"\n"
+		"Sets a selection rule for the reciprocal vectors. \n"
+		"\n"
+		""},
+	 { (char *)"Lattice_createFCCLattice", _wrap_Lattice_createFCCLattice, METH_VARARGS, (char *)"Lattice_createFCCLattice(double a) -> Lattice"},
+	 { (char *)"Lattice_createTrigonalLattice", _wrap_Lattice_createTrigonalLattice, METH_VARARGS, (char *)"Lattice_createTrigonalLattice(double a, double c) -> Lattice"},
+	 { (char *)"Lattice_swigregister", Lattice_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Lattice1DParameters", _wrap_new_Lattice1DParameters, METH_VARARGS, (char *)"\n"
+		"Lattice1DParameters()\n"
+		"new_Lattice1DParameters(double length, double xi) -> Lattice1DParameters\n"
+		"\n"
+		"Lattice1DParameters::Lattice1DParameters(double length, double xi)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"length: \n"
+		" Lattice constant.\n"
+		"\n"
+		"xi: \n"
+		"TODO: seems unused; explain or remove \n"
+		"\n"
+		""},
+	 { (char *)"Lattice1DParameters_m_length_set", _wrap_Lattice1DParameters_m_length_set, METH_VARARGS, (char *)"Lattice1DParameters_m_length_set(Lattice1DParameters self, double m_length)"},
+	 { (char *)"Lattice1DParameters_m_length_get", _wrap_Lattice1DParameters_m_length_get, METH_VARARGS, (char *)"Lattice1DParameters_m_length_get(Lattice1DParameters self) -> double"},
+	 { (char *)"Lattice1DParameters_m_xi_set", _wrap_Lattice1DParameters_m_xi_set, METH_VARARGS, (char *)"Lattice1DParameters_m_xi_set(Lattice1DParameters self, double m_xi)"},
+	 { (char *)"Lattice1DParameters_m_xi_get", _wrap_Lattice1DParameters_m_xi_get, METH_VARARGS, (char *)"Lattice1DParameters_m_xi_get(Lattice1DParameters self) -> double"},
+	 { (char *)"delete_Lattice1DParameters", _wrap_delete_Lattice1DParameters, METH_VARARGS, (char *)"delete_Lattice1DParameters(Lattice1DParameters self)"},
+	 { (char *)"Lattice1DParameters_swigregister", Lattice1DParameters_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Lattice2DParameters", _wrap_new_Lattice2DParameters, METH_VARARGS, (char *)"\n"
+		"new_Lattice2DParameters() -> Lattice2DParameters\n"
+		"\n"
+		"Lattice2DParameters::Lattice2DParameters()\n"
+		"\n"
+		""},
+	 { (char *)"Lattice2DParameters_getUnitCellArea", _wrap_Lattice2DParameters_getUnitCellArea, METH_VARARGS, (char *)"\n"
+		"Lattice2DParameters_getUnitCellArea(Lattice2DParameters self) -> double\n"
+		"\n"
+		"double Lattice2DParameters::getUnitCellArea() const \n"
+		"\n"
+		""},
+	 { (char *)"Lattice2DParameters_m_length_1_set", _wrap_Lattice2DParameters_m_length_1_set, METH_VARARGS, (char *)"Lattice2DParameters_m_length_1_set(Lattice2DParameters self, double m_length_1)"},
+	 { (char *)"Lattice2DParameters_m_length_1_get", _wrap_Lattice2DParameters_m_length_1_get, METH_VARARGS, (char *)"Lattice2DParameters_m_length_1_get(Lattice2DParameters self) -> double"},
+	 { (char *)"Lattice2DParameters_m_length_2_set", _wrap_Lattice2DParameters_m_length_2_set, METH_VARARGS, (char *)"Lattice2DParameters_m_length_2_set(Lattice2DParameters self, double m_length_2)"},
+	 { (char *)"Lattice2DParameters_m_length_2_get", _wrap_Lattice2DParameters_m_length_2_get, METH_VARARGS, (char *)"Lattice2DParameters_m_length_2_get(Lattice2DParameters self) -> double"},
+	 { (char *)"Lattice2DParameters_m_angle_set", _wrap_Lattice2DParameters_m_angle_set, METH_VARARGS, (char *)"Lattice2DParameters_m_angle_set(Lattice2DParameters self, double m_angle)"},
+	 { (char *)"Lattice2DParameters_m_angle_get", _wrap_Lattice2DParameters_m_angle_get, METH_VARARGS, (char *)"Lattice2DParameters_m_angle_get(Lattice2DParameters self) -> double"},
+	 { (char *)"Lattice2DParameters_m_xi_set", _wrap_Lattice2DParameters_m_xi_set, METH_VARARGS, (char *)"Lattice2DParameters_m_xi_set(Lattice2DParameters self, double m_xi)"},
+	 { (char *)"Lattice2DParameters_m_xi_get", _wrap_Lattice2DParameters_m_xi_get, METH_VARARGS, (char *)"Lattice2DParameters_m_xi_get(Lattice2DParameters self) -> double"},
+	 { (char *)"delete_Lattice2DParameters", _wrap_delete_Lattice2DParameters, METH_VARARGS, (char *)"delete_Lattice2DParameters(Lattice2DParameters self)"},
+	 { (char *)"Lattice2DParameters_swigregister", Lattice2DParameters_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Layer", _wrap_new_Layer, METH_VARARGS, (char *)"\n"
+		"Layer()\n"
+		"Layer(IMaterial material, double thickness=0)\n"
+		"new_Layer(IMaterial material) -> Layer\n"
+		"\n"
+		"Layer::Layer(const IMaterial &material, double thickness=0)\n"
+		"\n"
+		""},
+	 { (char *)"delete_Layer", _wrap_delete_Layer, METH_VARARGS, (char *)"\n"
+		"delete_Layer(Layer self)\n"
+		"\n"
+		"Layer::~Layer() final\n"
+		"\n"
+		""},
+	 { (char *)"Layer_clone", _wrap_Layer_clone, METH_VARARGS, (char *)"\n"
+		"Layer_clone(Layer self) -> Layer\n"
+		"\n"
+		"Layer* Layer::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_cloneInvertB", _wrap_Layer_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"Layer_cloneInvertB(Layer self) -> Layer\n"
+		"\n"
+		"Layer * Layer::cloneInvertB() const final\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_accept", _wrap_Layer_accept, METH_VARARGS, (char *)"\n"
+		"Layer_accept(Layer self, ISampleVisitor visitor)\n"
+		"\n"
+		"void Layer::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_to_str", _wrap_Layer_to_str, METH_VARARGS, (char *)"\n"
+		"to_str(int indent=0) -> std::string\n"
+		"Layer_to_str(Layer self) -> std::string\n"
+		"\n"
+		"std::string Layer::to_str(int indent=0) const final\n"
+		"\n"
+		"Returns textual representation of this and its descendants. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_setThickness", _wrap_Layer_setThickness, METH_VARARGS, (char *)"\n"
+		"Layer_setThickness(Layer self, double thickness)\n"
+		"\n"
+		"void Layer::setThickness(double thickness)\n"
+		"\n"
+		"Sets layer thickness in nanometers. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_getThickness", _wrap_Layer_getThickness, METH_VARARGS, (char *)"\n"
+		"Layer_getThickness(Layer self) -> double\n"
+		"\n"
+		"double Layer::getThickness() const \n"
+		"\n"
+		""},
+	 { (char *)"Layer_setMaterial", _wrap_Layer_setMaterial, METH_VARARGS, (char *)"\n"
+		"Layer_setMaterial(Layer self, IMaterial material)\n"
+		"\n"
+		"void Layer::setMaterial(const IMaterial &material)\n"
+		"\n"
+		"Sets  material of the layer. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_getMaterial", _wrap_Layer_getMaterial, METH_VARARGS, (char *)"\n"
+		"Layer_getMaterial(Layer self) -> IMaterial\n"
+		"\n"
+		"const IMaterial* Layer::getMaterial() const\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_getRefractiveIndex", _wrap_Layer_getRefractiveIndex, METH_VARARGS, (char *)"\n"
+		"Layer_getRefractiveIndex(Layer self) -> complex_t\n"
+		"\n"
+		"complex_t Layer::getRefractiveIndex() const \n"
+		"\n"
+		""},
+	 { (char *)"Layer_getRefractiveIndex2", _wrap_Layer_getRefractiveIndex2, METH_VARARGS, (char *)"\n"
+		"Layer_getRefractiveIndex2(Layer self) -> complex_t\n"
+		"\n"
+		"complex_t Layer::getRefractiveIndex2() const\n"
+		"\n"
+		"squared refractive index \n"
+		"\n"
+		""},
+	 { (char *)"Layer_addLayout", _wrap_Layer_addLayout, METH_VARARGS, (char *)"\n"
+		"Layer_addLayout(Layer self, ILayout decoration)\n"
+		"\n"
+		"void Layer::addLayout(const ILayout &decoration)\n"
+		"\n"
+		""},
+	 { (char *)"Layer_getNumberOfLayouts", _wrap_Layer_getNumberOfLayouts, METH_VARARGS, (char *)"\n"
+		"Layer_getNumberOfLayouts(Layer self) -> size_t\n"
+		"\n"
+		"size_t Layer::getNumberOfLayouts() const \n"
+		"\n"
+		""},
+	 { (char *)"Layer_getLayout", _wrap_Layer_getLayout, METH_VARARGS, (char *)"\n"
+		"Layer_getLayout(Layer self, size_t i) -> ILayout\n"
+		"\n"
+		"const ILayout * Layer::getLayout(size_t i) const \n"
+		"\n"
+		""},
+	 { (char *)"Layer_hasComputation", _wrap_Layer_hasComputation, METH_VARARGS, (char *)"\n"
+		"Layer_hasComputation(Layer self) -> bool\n"
+		"\n"
+		"bool Layer::hasComputation() const\n"
+		"\n"
+		"Returns true if decoration is present. \n"
+		"\n"
+		""},
+	 { (char *)"Layer_getTotalParticleSurfaceDensity", _wrap_Layer_getTotalParticleSurfaceDensity, METH_VARARGS, (char *)"\n"
+		"Layer_getTotalParticleSurfaceDensity(Layer self, size_t layout_index) -> double\n"
+		"\n"
+		"double Layer::getTotalParticleSurfaceDensity(size_t layout_index) const \n"
+		"\n"
+		""},
+	 { (char *)"Layer_getTotalAbundance", _wrap_Layer_getTotalAbundance, METH_VARARGS, (char *)"\n"
+		"Layer_getTotalAbundance(Layer self) -> double\n"
+		"\n"
+		"double Layer::getTotalAbundance() const \n"
+		"\n"
+		""},
+	 { (char *)"Layer_setNumberOfLayers", _wrap_Layer_setNumberOfLayers, METH_VARARGS, (char *)"\n"
+		"Layer_setNumberOfLayers(Layer self, size_t n_layers)\n"
+		"\n"
+		"void Layer::setNumberOfLayers(size_t n_layers)\n"
+		"\n"
+		""},
+	 { (char *)"Layer_getNumberOfLayers", _wrap_Layer_getNumberOfLayers, METH_VARARGS, (char *)"\n"
+		"Layer_getNumberOfLayers(Layer self) -> size_t\n"
+		"\n"
+		"size_t Layer::getNumberOfLayers() const \n"
+		"\n"
+		""},
+	 { (char *)"Layer_swigregister", Layer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IRoughness", _wrap_delete_IRoughness, METH_VARARGS, (char *)"\n"
+		"delete_IRoughness(IRoughness self)\n"
+		"\n"
+		"virtual IRoughness::~IRoughness()\n"
+		"\n"
+		""},
+	 { (char *)"IRoughness_accept", _wrap_IRoughness_accept, METH_VARARGS, (char *)"\n"
+		"IRoughness_accept(IRoughness self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void IRoughness::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"IRoughness_swigregister", IRoughness_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_LayerRoughness", _wrap_new_LayerRoughness, METH_VARARGS, (char *)"\n"
+		"LayerRoughness()\n"
+		"new_LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength) -> LayerRoughness\n"
+		"\n"
+		"LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength)\n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_clone", _wrap_LayerRoughness_clone, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_clone(LayerRoughness self) -> LayerRoughness\n"
+		"\n"
+		"LayerRoughness* LayerRoughness::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_accept", _wrap_LayerRoughness_accept, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_accept(LayerRoughness self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void LayerRoughness::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_getSpectralFun", _wrap_LayerRoughness_getSpectralFun, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_getSpectralFun(LayerRoughness self, kvector_t kvec) -> double\n"
+		"\n"
+		"double LayerRoughness::getSpectralFun(const kvector_t kvec) const\n"
+		"\n"
+		"Returns power spectral density of the surface roughness.\n"
+		"\n"
+		"Power spectral density of the surface roughness is a result of two-dimensional Fourier transform of the correlation function of the roughness profile.\n"
+		"\n"
+		"Based on the article D.K.G. de Boer, Physical review B, Volume 51, Number 8, 15 February 1995 \"X-ray reflection and transmission by rough surfaces\" \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_getCorrFun", _wrap_LayerRoughness_getCorrFun, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_getCorrFun(LayerRoughness self, kvector_t k) -> double\n"
+		"\n"
+		"double LayerRoughness::getCorrFun(const kvector_t k) const\n"
+		"\n"
+		"Correlation function of the roughness profile. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_setSigma", _wrap_LayerRoughness_setSigma, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_setSigma(LayerRoughness self, double sigma)\n"
+		"\n"
+		"void LayerRoughness::setSigma(double sigma)\n"
+		"\n"
+		"Sets rms of roughness. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_getSigma", _wrap_LayerRoughness_getSigma, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_getSigma(LayerRoughness self) -> double\n"
+		"\n"
+		"double LayerRoughness::getSigma() const\n"
+		"\n"
+		"Returns rms of roughness. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_setHurstParameter", _wrap_LayerRoughness_setHurstParameter, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_setHurstParameter(LayerRoughness self, double hurstParameter)\n"
+		"\n"
+		"void LayerRoughness::setHurstParameter(double hurstParameter)\n"
+		"\n"
+		"Sets hurst parameter. It describes how jagged the surface is. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_getHurstParameter", _wrap_LayerRoughness_getHurstParameter, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_getHurstParameter(LayerRoughness self) -> double\n"
+		"\n"
+		"double LayerRoughness::getHurstParameter() const\n"
+		"\n"
+		"Returns hurst parameter. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_setLatteralCorrLength", _wrap_LayerRoughness_setLatteralCorrLength, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_setLatteralCorrLength(LayerRoughness self, double latteralCorrLength)\n"
+		"\n"
+		"void LayerRoughness::setLatteralCorrLength(double latteralCorrLength)\n"
+		"\n"
+		"Sets lateral correlation length. \n"
+		"\n"
+		""},
+	 { (char *)"LayerRoughness_getLatteralCorrLength", _wrap_LayerRoughness_getLatteralCorrLength, METH_VARARGS, (char *)"\n"
+		"LayerRoughness_getLatteralCorrLength(LayerRoughness self) -> double\n"
+		"\n"
+		"double LayerRoughness::getLatteralCorrLength() const\n"
+		"\n"
+		"Returns latteral correlation length. \n"
+		"\n"
+		""},
+	 { (char *)"delete_LayerRoughness", _wrap_delete_LayerRoughness, METH_VARARGS, (char *)"delete_LayerRoughness(LayerRoughness self)"},
+	 { (char *)"LayerRoughness_swigregister", LayerRoughness_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Line", _wrap_new_Line, METH_VARARGS, (char *)"\n"
+		"new_Line(double x1, double y1, double x2, double y2) -> Line\n"
+		"\n"
+		"Geometry::Line::Line(double x1, double y1, double x2, double y2)\n"
+		"\n"
+		""},
+	 { (char *)"Line_clone", _wrap_Line_clone, METH_VARARGS, (char *)"\n"
+		"Line_clone(Line self) -> Line\n"
+		"\n"
+		"Line* Geometry::Line::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"Line_contains", _wrap_Line_contains, METH_VARARGS, (char *)"\n"
+		"contains(double x, double y) -> bool\n"
+		"Line_contains(Line self, Bin1D binx, Bin1D biny) -> bool\n"
+		"\n"
+		"bool Geometry::Line::contains(const Bin1D &binx, const Bin1D &biny) const\n"
+		"\n"
+		"Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). \n"
+		"\n"
+		""},
+	 { (char *)"delete_Line", _wrap_delete_Line, METH_VARARGS, (char *)"delete_Line(Line self)"},
+	 { (char *)"Line_swigregister", Line_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_VerticalLine", _wrap_new_VerticalLine, METH_VARARGS, (char *)"\n"
+		"new_VerticalLine(double x) -> VerticalLine\n"
+		"\n"
+		"Geometry::VerticalLine::VerticalLine(double x)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"x: \n"
+		"The value at which it crosses x-axes \n"
+		"\n"
+		""},
+	 { (char *)"VerticalLine_clone", _wrap_VerticalLine_clone, METH_VARARGS, (char *)"\n"
+		"VerticalLine_clone(VerticalLine self) -> VerticalLine\n"
+		"\n"
+		"VerticalLine* Geometry::VerticalLine::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"VerticalLine_contains", _wrap_VerticalLine_contains, METH_VARARGS, (char *)"\n"
+		"contains(double x, double y) -> bool\n"
+		"VerticalLine_contains(VerticalLine self, Bin1D binx, Bin1D biny) -> bool\n"
+		"\n"
+		"bool Geometry::VerticalLine::contains(const Bin1D &binx, const Bin1D &biny) const\n"
+		"\n"
+		"Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). \n"
+		"\n"
+		""},
+	 { (char *)"VerticalLine_getXpos", _wrap_VerticalLine_getXpos, METH_VARARGS, (char *)"\n"
+		"VerticalLine_getXpos(VerticalLine self) -> double\n"
+		"\n"
+		"double Geometry::VerticalLine::getXpos() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_VerticalLine", _wrap_delete_VerticalLine, METH_VARARGS, (char *)"delete_VerticalLine(VerticalLine self)"},
+	 { (char *)"VerticalLine_swigregister", VerticalLine_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_HorizontalLine", _wrap_new_HorizontalLine, METH_VARARGS, (char *)"\n"
+		"new_HorizontalLine(double y) -> HorizontalLine\n"
+		"\n"
+		"Geometry::HorizontalLine::HorizontalLine(double y)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"y: \n"
+		"The value at which it crosses y-axes \n"
+		"\n"
+		""},
+	 { (char *)"HorizontalLine_clone", _wrap_HorizontalLine_clone, METH_VARARGS, (char *)"\n"
+		"HorizontalLine_clone(HorizontalLine self) -> HorizontalLine\n"
+		"\n"
+		"HorizontalLine* Geometry::HorizontalLine::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"HorizontalLine_contains", _wrap_HorizontalLine_contains, METH_VARARGS, (char *)"\n"
+		"contains(double x, double y) -> bool\n"
+		"HorizontalLine_contains(HorizontalLine self, Bin1D binx, Bin1D biny) -> bool\n"
+		"\n"
+		"bool Geometry::HorizontalLine::contains(const Bin1D &binx, const Bin1D &biny) const\n"
+		"\n"
+		"Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). \n"
+		"\n"
+		""},
+	 { (char *)"HorizontalLine_getYpos", _wrap_HorizontalLine_getYpos, METH_VARARGS, (char *)"\n"
+		"HorizontalLine_getYpos(HorizontalLine self) -> double\n"
+		"\n"
+		"double Geometry::HorizontalLine::getYpos() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_HorizontalLine", _wrap_delete_HorizontalLine, METH_VARARGS, (char *)"delete_HorizontalLine(HorizontalLine self)"},
+	 { (char *)"HorizontalLine_swigregister", HorizontalLine_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_MesoCrystal", _wrap_new_MesoCrystal, METH_VARARGS, (char *)"\n"
+		"new_MesoCrystal(IClusteredParticles particle_structure, IFormFactor form_factor) -> MesoCrystal\n"
+		"\n"
+		"MesoCrystal::MesoCrystal(const IClusteredParticles &particle_structure, IFormFactor &form_factor)\n"
+		"\n"
+		""},
+	 { (char *)"delete_MesoCrystal", _wrap_delete_MesoCrystal, METH_VARARGS, (char *)"\n"
+		"delete_MesoCrystal(MesoCrystal self)\n"
+		"\n"
+		"MesoCrystal::~MesoCrystal()\n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_clone", _wrap_MesoCrystal_clone, METH_VARARGS, (char *)"\n"
+		"MesoCrystal_clone(MesoCrystal self) -> MesoCrystal\n"
+		"\n"
+		"MesoCrystal * MesoCrystal::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_cloneInvertB", _wrap_MesoCrystal_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"MesoCrystal_cloneInvertB(MesoCrystal self) -> MesoCrystal\n"
+		"\n"
+		"MesoCrystal * MesoCrystal::cloneInvertB() const\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_accept", _wrap_MesoCrystal_accept, METH_VARARGS, (char *)"\n"
+		"MesoCrystal_accept(MesoCrystal self, ISampleVisitor visitor)\n"
+		"\n"
+		"void MesoCrystal::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_setAmbientMaterial", _wrap_MesoCrystal_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"MesoCrystal_setAmbientMaterial(MesoCrystal self, IMaterial material)\n"
+		"\n"
+		"void MesoCrystal::setAmbientMaterial(const IMaterial &material)\n"
+		"\n"
+		"Sets the refractive index of the ambient material (which influences its scattering power) \n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_getAmbientMaterial", _wrap_MesoCrystal_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"MesoCrystal_getAmbientMaterial(MesoCrystal self) -> IMaterial\n"
+		"\n"
+		"const IMaterial * MesoCrystal::getAmbientMaterial() const\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_createTransformedFormFactor", _wrap_MesoCrystal_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
+		"MesoCrystal_createTransformedFormFactor(MesoCrystal self, IRotation p_rotation, kvector_t translation) -> IFormFactor\n"
+		"\n"
+		"IFormFactor * MesoCrystal::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const\n"
+		"\n"
+		"Create a form factor for this particle with an extra scattering factor. \n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_getClusteredParticles", _wrap_MesoCrystal_getClusteredParticles, METH_VARARGS, (char *)"\n"
+		"MesoCrystal_getClusteredParticles(MesoCrystal self) -> IClusteredParticles\n"
+		"\n"
+		"const IClusteredParticles* MesoCrystal::getClusteredParticles() const\n"
+		"\n"
+		"get the internal structure, which is in principle unbounded in space (e.g. an infinite crystal) \n"
+		"\n"
+		""},
+	 { (char *)"MesoCrystal_swigregister", MesoCrystal_swigregister, METH_VARARGS, NULL},
+	 { (char *)"VERBOSE_swigconstant", VERBOSE_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"DEBUG2_swigconstant", DEBUG2_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"DEBUG_swigconstant", DEBUG_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"INFO_swigconstant", INFO_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"WARNING_swigconstant", WARNING_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"ERROR_swigconstant", ERROR_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"FATAL_swigconstant", FATAL_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"new_Logger", _wrap_new_Logger, METH_VARARGS, (char *)"new_Logger(MSG::EMessageLevel level) -> Logger"},
+	 { (char *)"delete_Logger", _wrap_delete_Logger, METH_VARARGS, (char *)"delete_Logger(Logger self)"},
+	 { (char *)"Logger_NowTime", _wrap_Logger_NowTime, METH_VARARGS, (char *)"Logger_NowTime(Logger self) -> std::string"},
+	 { (char *)"Logger_ToString", _wrap_Logger_ToString, METH_VARARGS, (char *)"Logger_ToString(Logger self, MSG::EMessageLevel level) -> std::string const &"},
+	 { (char *)"Logger_SetLevel", _wrap_Logger_SetLevel, METH_VARARGS, (char *)"\n"
+		"SetLevel(MSG::EMessageLevel level)\n"
+		"Logger_SetLevel(std::string const & levelname)\n"
+		""},
+	 { (char *)"Logger_GetLevel", _wrap_Logger_GetLevel, METH_VARARGS, (char *)"Logger_GetLevel() -> MSG::EMessageLevel"},
+	 { (char *)"Logger_swigregister", Logger_swigregister, METH_VARARGS, NULL},
+	 { (char *)"SetLevel", _wrap_SetLevel, METH_VARARGS, (char *)"\n"
+		"SetLevel(MSG::EMessageLevel level)\n"
+		"SetLevel(std::string const & levelname)\n"
+		""},
+	 { (char *)"new_MultiLayer", _wrap_new_MultiLayer, METH_VARARGS, (char *)"\n"
+		"new_MultiLayer() -> MultiLayer\n"
+		"\n"
+		"MultiLayer::MultiLayer()\n"
+		"\n"
+		""},
+	 { (char *)"delete_MultiLayer", _wrap_delete_MultiLayer, METH_VARARGS, (char *)"\n"
+		"delete_MultiLayer(MultiLayer self)\n"
+		"\n"
+		"MultiLayer::~MultiLayer()\n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_accept", _wrap_MultiLayer_accept, METH_VARARGS, (char *)"\n"
+		"MultiLayer_accept(MultiLayer self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void MultiLayer::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_to_str", _wrap_MultiLayer_to_str, METH_VARARGS, (char *)"\n"
+		"to_str(int indent=0) -> std::string\n"
+		"MultiLayer_to_str(MultiLayer self) -> std::string\n"
+		"\n"
+		"std::string MultiLayer::to_str(int indent=0) const\n"
+		"\n"
+		"Returns textual representation of this and its descendants. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getNumberOfLayers", _wrap_MultiLayer_getNumberOfLayers, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getNumberOfLayers(MultiLayer self) -> size_t\n"
+		"\n"
+		"size_t MultiLayer::getNumberOfLayers() const \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getNumberOfInterfaces", _wrap_MultiLayer_getNumberOfInterfaces, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getNumberOfInterfaces(MultiLayer self) -> size_t\n"
+		"\n"
+		"size_t MultiLayer::getNumberOfInterfaces() const \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_addLayer", _wrap_MultiLayer_addLayer, METH_VARARGS, (char *)"\n"
+		"MultiLayer_addLayer(MultiLayer self, Layer p_child)\n"
+		"\n"
+		"void MultiLayer::addLayer(const Layer &p_child)\n"
+		"\n"
+		"Adds object to multilayer, overrides from  ISample.\n"
+		"\n"
+		"Adds layer with default (zero) roughness. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_addLayerWithTopRoughness", _wrap_MultiLayer_addLayerWithTopRoughness, METH_VARARGS, (char *)"\n"
+		"MultiLayer_addLayerWithTopRoughness(MultiLayer self, Layer layer, LayerRoughness roughness)\n"
+		"\n"
+		"void MultiLayer::addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness)\n"
+		"\n"
+		"Adds layer with top roughness. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getLayer", _wrap_MultiLayer_getLayer, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getLayer(MultiLayer self, size_t i_layer) -> Layer\n"
+		"\n"
+		"const Layer* MultiLayer::getLayer(size_t i_layer) const\n"
+		"\n"
+		"Returns layer with given index. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getLayerInterface", _wrap_MultiLayer_getLayerInterface, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getLayerInterface(MultiLayer self, size_t i_interface) -> LayerInterface const *\n"
+		"\n"
+		"const LayerInterface* MultiLayer::getLayerInterface(size_t i_interface) const\n"
+		"\n"
+		"Returns layer with given index. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getLayerBottomZ", _wrap_MultiLayer_getLayerBottomZ, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getLayerBottomZ(MultiLayer self, size_t i_layer) -> double\n"
+		"\n"
+		"double MultiLayer::getLayerBottomZ(size_t i_layer) const\n"
+		"\n"
+		"Returns z-coordinate of the layer's bottom. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getLayerThickness", _wrap_MultiLayer_getLayerThickness, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getLayerThickness(MultiLayer self, size_t i_layer) -> double\n"
+		"\n"
+		"double MultiLayer::getLayerThickness(size_t i_layer) const\n"
+		"\n"
+		"Returns thickness of layer. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getLayerTopInterface", _wrap_MultiLayer_getLayerTopInterface, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getLayerTopInterface(MultiLayer self, size_t i_layer) -> LayerInterface const *\n"
+		"\n"
+		"const LayerInterface * MultiLayer::getLayerTopInterface(size_t i_layer) const\n"
+		"\n"
+		"Returns top interface of layer.\n"
+		"\n"
+		"Returns pointer to the top interface of the layer. nInterfaces = nLayers-1, first layer in multilayer doesn't have interface. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getLayerBottomInterface", _wrap_MultiLayer_getLayerBottomInterface, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getLayerBottomInterface(MultiLayer self, size_t i_layer) -> LayerInterface const *\n"
+		"\n"
+		"const LayerInterface * MultiLayer::getLayerBottomInterface(size_t i_layer) const\n"
+		"\n"
+		"Returns bottom interface of layer.\n"
+		"\n"
+		"Returns pointer to the bottom interface of the layer. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_clear", _wrap_MultiLayer_clear, METH_VARARGS, (char *)"\n"
+		"MultiLayer_clear(MultiLayer self)\n"
+		"\n"
+		"void MultiLayer::clear()\n"
+		"\n"
+		"Destructs allocated objects. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_clone", _wrap_MultiLayer_clone, METH_VARARGS, (char *)"\n"
+		"MultiLayer_clone(MultiLayer self) -> MultiLayer\n"
+		"\n"
+		"MultiLayer * MultiLayer::clone() const\n"
+		"\n"
+		"Returns alone of multilayer with clones of all layers and recreated interfaces between layers \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_cloneInvertB", _wrap_MultiLayer_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"MultiLayer_cloneInvertB(MultiLayer self) -> MultiLayer\n"
+		"\n"
+		"MultiLayer * MultiLayer::cloneInvertB() const\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_setCrossCorrLength", _wrap_MultiLayer_setCrossCorrLength, METH_VARARGS, (char *)"\n"
+		"MultiLayer_setCrossCorrLength(MultiLayer self, double crossCorrLength)\n"
+		"\n"
+		"void MultiLayer::setCrossCorrLength(double crossCorrLength)\n"
+		"\n"
+		"Sets cross correlation length of roughnesses between interfaces. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getCrossCorrLength", _wrap_MultiLayer_getCrossCorrLength, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getCrossCorrLength(MultiLayer self) -> double\n"
+		"\n"
+		"double MultiLayer::getCrossCorrLength() const\n"
+		"\n"
+		"Returns cross correlation length of roughnesses between interfaces. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getCrossCorrSpectralFun", _wrap_MultiLayer_getCrossCorrSpectralFun, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getCrossCorrSpectralFun(MultiLayer self, kvector_t kvec, size_t j, size_t k) -> double\n"
+		"\n"
+		"double MultiLayer::getCrossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const\n"
+		"\n"
+		"! correlation function of roughnesses between the interfaces\n"
+		"\n"
+		"Fourier transform of the correlation function of roughnesses between the interfaces\n"
+		"\n"
+		"Fourier transform of the correlation function of roughnesses between the interfaces j,k - indexes of layers in multilayer whose bottom interfaces we are considering \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_setLayerThickness", _wrap_MultiLayer_setLayerThickness, METH_VARARGS, (char *)"\n"
+		"MultiLayer_setLayerThickness(MultiLayer self, size_t i_layer, double thickness)\n"
+		"\n"
+		"void MultiLayer::setLayerThickness(size_t i_layer, double thickness)\n"
+		"\n"
+		"Sets thickness of layer. \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_getIndexOfLayer", _wrap_MultiLayer_getIndexOfLayer, METH_VARARGS, (char *)"\n"
+		"MultiLayer_getIndexOfLayer(MultiLayer self, Layer layer) -> int\n"
+		"\n"
+		"int MultiLayer::getIndexOfLayer(const Layer *layer) const\n"
+		"\n"
+		"returns layer index \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_requiresMatrixRTCoefficients", _wrap_MultiLayer_requiresMatrixRTCoefficients, METH_VARARGS, (char *)"\n"
+		"MultiLayer_requiresMatrixRTCoefficients(MultiLayer self) -> bool\n"
+		"\n"
+		"bool MultiLayer::requiresMatrixRTCoefficients() const\n"
+		"\n"
+		"returns true if contains magnetic materials and matrix calculations are required \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_zToLayerIndex", _wrap_MultiLayer_zToLayerIndex, METH_VARARGS, (char *)"\n"
+		"MultiLayer_zToLayerIndex(MultiLayer self, double z_value) -> size_t\n"
+		"\n"
+		"size_t MultiLayer::zToLayerIndex(double z_value)\n"
+		"\n"
+		"returns layer index corresponding to given global z coordinate \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_containsMagneticMaterial", _wrap_MultiLayer_containsMagneticMaterial, METH_VARARGS, (char *)"\n"
+		"MultiLayer_containsMagneticMaterial(MultiLayer self) -> bool\n"
+		"\n"
+		"bool MultiLayer::containsMagneticMaterial() const \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_hasRoughness", _wrap_MultiLayer_hasRoughness, METH_VARARGS, (char *)"\n"
+		"MultiLayer_hasRoughness(MultiLayer self) -> bool\n"
+		"\n"
+		"bool MultiLayer::hasRoughness() const \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_totalNofLayouts", _wrap_MultiLayer_totalNofLayouts, METH_VARARGS, (char *)"\n"
+		"MultiLayer_totalNofLayouts(MultiLayer self) -> size_t\n"
+		"\n"
+		"size_t MultiLayer::totalNofLayouts() const \n"
+		"\n"
+		""},
+	 { (char *)"MultiLayer_swigregister", MultiLayer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_OffSpecSimulation", _wrap_new_OffSpecSimulation, METH_VARARGS, (char *)"\n"
+		"OffSpecSimulation()\n"
+		"OffSpecSimulation(MultiLayer p_sample)\n"
+		"new_OffSpecSimulation(std::shared_ptr< IMultiLayerBuilder > const p_sample_builder) -> OffSpecSimulation\n"
+		"\n"
+		"OffSpecSimulation::OffSpecSimulation(std::shared_ptr< class IMultiLayerBuilder > p_sample_builder)\n"
+		"\n"
+		""},
+	 { (char *)"delete_OffSpecSimulation", _wrap_delete_OffSpecSimulation, METH_VARARGS, (char *)"\n"
+		"delete_OffSpecSimulation(OffSpecSimulation self)\n"
+		"\n"
+		"OffSpecSimulation::~OffSpecSimulation() final\n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_clone", _wrap_OffSpecSimulation_clone, METH_VARARGS, (char *)"\n"
+		"OffSpecSimulation_clone(OffSpecSimulation self) -> OffSpecSimulation\n"
+		"\n"
+		"OffSpecSimulation* OffSpecSimulation::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_prepareSimulation", _wrap_OffSpecSimulation_prepareSimulation, METH_VARARGS, (char *)"\n"
+		"OffSpecSimulation_prepareSimulation(OffSpecSimulation self)\n"
+		"\n"
+		"void OffSpecSimulation::prepareSimulation() final\n"
+		"\n"
+		"Put into a clean state for running a simulation. \n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_numberOfSimulationElements", _wrap_OffSpecSimulation_numberOfSimulationElements, METH_VARARGS, (char *)"\n"
+		"OffSpecSimulation_numberOfSimulationElements(OffSpecSimulation self) -> int\n"
+		"\n"
+		"int OffSpecSimulation::numberOfSimulationElements() const final\n"
+		"\n"
+		"Gets the number of elements this simulation needs to calculate. \n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_getDetectorIntensity", _wrap_OffSpecSimulation_getDetectorIntensity, METH_VARARGS, (char *)"\n"
+		"getDetectorIntensity(IDetector2D::EAxesUnits units_type) -> IntensityData\n"
+		"OffSpecSimulation_getDetectorIntensity(OffSpecSimulation self) -> IntensityData\n"
+		"\n"
+		"OutputData<double>* OffSpecSimulation::getDetectorIntensity(IDetector2D::EAxesUnits units_type=IDetector2D::DEFAULT) const\n"
+		"\n"
+		"Returns clone of the detector intensity map. \n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_getIntensityData", _wrap_OffSpecSimulation_getIntensityData, METH_VARARGS, (char *)"\n"
+		"OffSpecSimulation_getIntensityData(OffSpecSimulation self) -> Histogram2D\n"
+		"\n"
+		"Histogram2D * OffSpecSimulation::getIntensityData() const\n"
+		"\n"
+		"Returns clone of the detector intensity map in the form of 2D histogram. \n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_setBeamParameters", _wrap_OffSpecSimulation_setBeamParameters, METH_VARARGS, (char *)"\n"
+		"OffSpecSimulation_setBeamParameters(OffSpecSimulation self, double arg3, IAxis alpha_axis, double phi_i)\n"
+		"\n"
+		"void OffSpecSimulation::setBeamParameters(double lambda, const IAxis &alpha_axis, double phi_i)\n"
+		"\n"
+		"Sets beam parameters from here (forwarded to  Instrument) \n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_setDetectorParameters", _wrap_OffSpecSimulation_setDetectorParameters, METH_VARARGS, (char *)"\n"
+		"OffSpecSimulation_setDetectorParameters(OffSpecSimulation self, size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
+		"\n"
+		"void OffSpecSimulation::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)\n"
+		"\n"
+		"Sets detector parameters using angle ranges. \n"
+		"\n"
+		""},
+	 { (char *)"OffSpecSimulation_swigregister", OffSpecSimulation_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IntensityData", _wrap_new_IntensityData, METH_VARARGS, (char *)"\n"
+		"new_IntensityData() -> IntensityData\n"
+		"\n"
+		"OutputData< T >::OutputData(const OutputData &)=delete\n"
+		"\n"
+		""},
+	 { (char *)"delete_IntensityData", _wrap_delete_IntensityData, METH_VARARGS, (char *)"\n"
+		"delete_IntensityData(IntensityData self)\n"
+		"\n"
+		"OutputData< T >::~OutputData()\n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_clone", _wrap_IntensityData_clone, METH_VARARGS, (char *)"\n"
+		"IntensityData_clone(IntensityData self) -> IntensityData\n"
+		"\n"
+		"OutputData< T > * OutputData< T >::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_copyFrom", _wrap_IntensityData_copyFrom, METH_VARARGS, (char *)"\n"
+		"IntensityData_copyFrom(IntensityData self, IntensityData x)\n"
+		"\n"
+		"void OutputData< T >::copyFrom(const OutputData< T > &x)\n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_meanValues", _wrap_IntensityData_meanValues, METH_VARARGS, (char *)"\n"
+		"IntensityData_meanValues(IntensityData self) -> IntensityData\n"
+		"\n"
+		"OutputData< double > * OutputData< T >::meanValues() const \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_addAxis", _wrap_IntensityData_addAxis, METH_VARARGS, (char *)"\n"
+		"addAxis(IAxis new_axis)\n"
+		"IntensityData_addAxis(IntensityData self, std::string const & name, size_t size, double start, double end)\n"
+		"\n"
+		"void OutputData< T >::addAxis(const std::string &name, size_t size, double start, double end)\n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAxis", _wrap_IntensityData_getAxis, METH_VARARGS, (char *)"\n"
+		"getAxis(size_t serial_number) -> IAxis\n"
+		"IntensityData_getAxis(IntensityData self, std::string const & axis_name) -> IAxis\n"
+		"\n"
+		"const IAxis & OutputData< T >::getAxis(const std::string &axis_name) const\n"
+		"\n"
+		"returns axis with given name \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getRank", _wrap_IntensityData_getRank, METH_VARARGS, (char *)"\n"
+		"IntensityData_getRank(IntensityData self) -> size_t\n"
+		"\n"
+		"size_t OutputData< T >::getRank() const\n"
+		"\n"
+		"Returns number of dimensions. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAllocatedSize", _wrap_IntensityData_getAllocatedSize, METH_VARARGS, (char *)"\n"
+		"IntensityData_getAllocatedSize(IntensityData self) -> size_t\n"
+		"\n"
+		"size_t OutputData< T >::getAllocatedSize() const\n"
+		"\n"
+		"Returns total size of data buffer (product of bin number in every dimension). \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAllSizes", _wrap_IntensityData_getAllSizes, METH_VARARGS, (char *)"\n"
+		"IntensityData_getAllSizes(IntensityData self) -> std::vector< size_t,std::allocator< size_t > >\n"
+		"\n"
+		"std::vector< size_t > OutputData< T >::getAllSizes() const\n"
+		"\n"
+		"Returns all sizes of its axes. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getRawDataVector", _wrap_IntensityData_getRawDataVector, METH_VARARGS, (char *)"\n"
+		"IntensityData_getRawDataVector(IntensityData self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< T > OutputData< T >::getRawDataVector() const\n"
+		"\n"
+		"Returns copy of raw data vector. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_fillRawDataArray", _wrap_IntensityData_fillRawDataArray, METH_VARARGS, (char *)"\n"
+		"IntensityData_fillRawDataArray(IntensityData self, double * destination)\n"
+		"\n"
+		"void OutputData< T >::fillRawDataArray(T *destination) const\n"
+		"\n"
+		"fill raw array with data \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_totalSum", _wrap_IntensityData_totalSum, METH_VARARGS, (char *)"\n"
+		"IntensityData_totalSum(IntensityData self) -> double\n"
+		"\n"
+		"T OutputData< T >::totalSum() const\n"
+		"\n"
+		"Returns sum of all values in the data structure. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_begin", _wrap_IntensityData_begin, METH_VARARGS, (char *)"\n"
+		"begin() -> OutputData< double >::iterator\n"
+		"IntensityData_begin(IntensityData self) -> OutputData< double >::const_iterator\n"
+		"\n"
+		"OutputData< T >::const_iterator OutputData< T >::begin() const\n"
+		"\n"
+		"Returns read-only iterator that points to the first element. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_end", _wrap_IntensityData_end, METH_VARARGS, (char *)"\n"
+		"end() -> OutputData< double >::iterator\n"
+		"IntensityData_end(IntensityData self) -> OutputData< double >::const_iterator\n"
+		"\n"
+		"const_iterator OutputData< T >::end() const\n"
+		"\n"
+		"Returns read-only iterator that points to the one past last element. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_setVariability", _wrap_IntensityData_setVariability, METH_VARARGS, (char *)"\n"
+		"IntensityData_setVariability(IntensityData self, double variability)\n"
+		"\n"
+		"void OutputData< T >::setVariability(double variability)\n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getVariability", _wrap_IntensityData_getVariability, METH_VARARGS, (char *)"\n"
+		"IntensityData_getVariability(IntensityData self) -> double\n"
+		"\n"
+		"double OutputData< T >::getVariability() const \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAxesBinIndices", _wrap_IntensityData_getAxesBinIndices, METH_VARARGS, (char *)"\n"
+		"IntensityData_getAxesBinIndices(IntensityData self, size_t global_index) -> vector_integer_t\n"
+		"\n"
+		"std::vector< int > OutputData< T >::getAxesBinIndices(size_t global_index) const\n"
+		"\n"
+		"Returns vector of axes indices for given global index\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"global_index: \n"
+		"The global index of this data structure.\n"
+		"\n"
+		"Vector of bin indices for all axes defined \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAxisBinIndex", _wrap_IntensityData_getAxisBinIndex, METH_VARARGS, (char *)"\n"
+		"getAxisBinIndex(size_t global_index, size_t i_selected_axis) -> int\n"
+		"IntensityData_getAxisBinIndex(IntensityData self, size_t global_index, std::string const & axis_name) -> int\n"
+		"\n"
+		"int OutputData< T >::getAxisBinIndex(size_t global_index, const std::string &axis_name) const\n"
+		"\n"
+		"Returns axis bin index for given global index\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"global_index: \n"
+		"The global index of this data structure.\n"
+		"\n"
+		"axis_name: \n"
+		"The name of selected axis.\n"
+		"\n"
+		"Corresponding bin index for selected axis \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_toGlobalIndex", _wrap_IntensityData_toGlobalIndex, METH_VARARGS, (char *)"\n"
+		"IntensityData_toGlobalIndex(IntensityData self, vector_integer_t axes_indices) -> size_t\n"
+		"\n"
+		"size_t OutputData< T >::toGlobalIndex(const std::vector< int > &axes_indices) const\n"
+		"\n"
+		"Returns global index for specified indices of axes\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"axes_indices: \n"
+		"Vector of axes indices for all specified axes in this dataset\n"
+		"\n"
+		"Corresponding global index \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_findGlobalIndex", _wrap_IntensityData_findGlobalIndex, METH_VARARGS, (char *)"\n"
+		"IntensityData_findGlobalIndex(IntensityData self, vdouble1d_t coordinates) -> size_t\n"
+		"\n"
+		"size_t OutputData< T >::findGlobalIndex(const std::vector< double > &coordinates) const\n"
+		"\n"
+		"Returns global index for specified axes values\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"coordinates: \n"
+		"Vector of axes coordinates for all specified axes in this dataset\n"
+		"\n"
+		"Closest global index \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAxisValue", _wrap_IntensityData_getAxisValue, METH_VARARGS, (char *)"\n"
+		"getAxisValue(size_t global_index, size_t i_selected_axis) -> double\n"
+		"IntensityData_getAxisValue(IntensityData self, size_t global_index, std::string const & axis_name) -> double\n"
+		"\n"
+		"double OutputData< T >::getAxisValue(size_t global_index, const std::string &axis_name) const\n"
+		"\n"
+		"Returns the value of selected axis for given global_index.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"global_index: \n"
+		"The global index of this data structure.\n"
+		"\n"
+		"axis_name: \n"
+		"The name of selected axis.\n"
+		"\n"
+		"corresponding bin center of selected axis \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAxesValues", _wrap_IntensityData_getAxesValues, METH_VARARGS, (char *)"\n"
+		"IntensityData_getAxesValues(IntensityData self, size_t global_index) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > OutputData< T >::getAxesValues(size_t global_index) const\n"
+		"\n"
+		"Returns values on all defined axes for given globalbin number\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"global_index: \n"
+		"The global index of this data structure.\n"
+		"\n"
+		"Vector of corresponding bin centers \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getAxisBin", _wrap_IntensityData_getAxisBin, METH_VARARGS, (char *)"\n"
+		"getAxisBin(size_t global_index, size_t i_selected_axis) -> Bin1D\n"
+		"IntensityData_getAxisBin(IntensityData self, size_t global_index, std::string const & axis_name) -> Bin1D\n"
+		"\n"
+		"Bin1D OutputData< T >::getAxisBin(size_t global_index, const std::string &axis_name) const\n"
+		"\n"
+		"Returns bin of selected axis for given global_index.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"global_index: \n"
+		"The global index of this data structure.\n"
+		"\n"
+		"axis_name: \n"
+		"The name of selected axis.\n"
+		"\n"
+		"Corresponding  Bin1D object \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_clear", _wrap_IntensityData_clear, METH_VARARGS, (char *)"\n"
+		"IntensityData_clear(IntensityData self)\n"
+		"\n"
+		"void OutputData< T >::clear()\n"
+		"\n"
+		"Sets object into initial state (no dimensions, data) \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_setAllTo", _wrap_IntensityData_setAllTo, METH_VARARGS, (char *)"\n"
+		"IntensityData_setAllTo(IntensityData self, double const & value)\n"
+		"\n"
+		"void OutputData< T >::setAllTo(const T &value)\n"
+		"\n"
+		"Sets content of output data to specific value. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_scaleAll", _wrap_IntensityData_scaleAll, METH_VARARGS, (char *)"\n"
+		"IntensityData_scaleAll(IntensityData self, double const & factor)\n"
+		"\n"
+		"void OutputData< T >::scaleAll(const T &factor)\n"
+		"\n"
+		"multiply every item of this output data by value \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_setAxisSizes", _wrap_IntensityData_setAxisSizes, METH_VARARGS, (char *)"\n"
+		"IntensityData_setAxisSizes(IntensityData self, size_t rank, int * n_dims)\n"
+		"\n"
+		"void OutputData< T >::setAxisSizes(size_t rank, int *n_dims)\n"
+		"\n"
+		"Adds 'rank' axes with indicated sizes. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_setRawDataVector", _wrap_IntensityData_setRawDataVector, METH_VARARGS, (char *)"\n"
+		"IntensityData_setRawDataVector(IntensityData self, vdouble1d_t data_vector)\n"
+		"\n"
+		"void OutputData< T >::setRawDataVector(const std::vector< T > &data_vector)\n"
+		"\n"
+		"Sets new values to raw data vector. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_setRawDataArray", _wrap_IntensityData_setRawDataArray, METH_VARARGS, (char *)"\n"
+		"IntensityData_setRawDataArray(IntensityData self, double const * source)\n"
+		"\n"
+		"void OutputData< T >::setRawDataArray(const T *source)\n"
+		"\n"
+		"Sets new values to raw data array. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData___iadd__", _wrap_IntensityData___iadd__, METH_VARARGS, (char *)"IntensityData___iadd__(IntensityData self, IntensityData right) -> IntensityData"},
+	 { (char *)"IntensityData___isub__", _wrap_IntensityData___isub__, METH_VARARGS, (char *)"IntensityData___isub__(IntensityData self, IntensityData right) -> IntensityData"},
+	 { (char *)"IntensityData___idiv__", _wrap_IntensityData___idiv__, METH_VARARGS, (char *)"IntensityData___idiv__(IntensityData self, IntensityData right) -> IntensityData"},
+	 { (char *)"IntensityData___imul__", _wrap_IntensityData___imul__, METH_VARARGS, (char *)"IntensityData___imul__(IntensityData self, IntensityData right) -> IntensityData"},
+	 { (char *)"IntensityData_getValue", _wrap_IntensityData_getValue, METH_VARARGS, (char *)"\n"
+		"IntensityData_getValue(IntensityData self, size_t index) -> double\n"
+		"\n"
+		"double OutputData< T >::getValue(size_t index) const\n"
+		"\n"
+		"Returns value or summed value, depending on T. \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_getArray", _wrap_IntensityData_getArray, METH_VARARGS, (char *)"IntensityData_getArray(IntensityData self) -> PyObject *"},
+	 { (char *)"IntensityData_isInitialized", _wrap_IntensityData_isInitialized, METH_VARARGS, (char *)"\n"
+		"IntensityData_isInitialized(IntensityData self) -> bool\n"
+		"\n"
+		"bool OutputData< T >::isInitialized() const\n"
+		"\n"
+		"returns data as Python numpy array\n"
+		"\n"
+		"returns true if object is correctly initialized \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData_allocate", _wrap_IntensityData_allocate, METH_VARARGS, (char *)"\n"
+		"IntensityData_allocate(IntensityData self)\n"
+		"\n"
+		"void OutputData< T >::allocate()\n"
+		"\n"
+		"memory allocation for current dimensions configuration \n"
+		"\n"
+		""},
+	 { (char *)"IntensityData___getitem__", _wrap_IntensityData___getitem__, METH_VARARGS, (char *)"IntensityData___getitem__(IntensityData self, unsigned int i) -> double"},
+	 { (char *)"IntensityData___setitem__", _wrap_IntensityData___setitem__, METH_VARARGS, (char *)"IntensityData___setitem__(IntensityData self, unsigned int i, double value) -> double"},
+	 { (char *)"IntensityData_swigregister", IntensityData_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ParameterDistribution", _wrap_new_ParameterDistribution, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution(std::string const & par_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0, RealLimits limits)\n"
+		"ParameterDistribution(std::string const & par_name, IDistribution1D distribution, size_t nbr_samples, double sigma_factor=0.0)\n"
+		"ParameterDistribution(std::string const & par_name, IDistribution1D distribution, size_t nbr_samples)\n"
+		"ParameterDistribution(std::string const & par_name, IDistribution1D distribution, size_t nbr_samples, double xmin, double xmax)\n"
+		"new_ParameterDistribution(ParameterDistribution other) -> ParameterDistribution\n"
+		"\n"
+		"ParameterDistribution::ParameterDistribution(const ParameterDistribution &other)\n"
+		"\n"
+		""},
+	 { (char *)"delete_ParameterDistribution", _wrap_delete_ParameterDistribution, METH_VARARGS, (char *)"\n"
+		"delete_ParameterDistribution(ParameterDistribution self)\n"
+		"\n"
+		"ParameterDistribution::~ParameterDistribution()\n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_linkParameter", _wrap_ParameterDistribution_linkParameter, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_linkParameter(ParameterDistribution self, std::string par_name) -> ParameterDistribution\n"
+		"\n"
+		"ParameterDistribution & ParameterDistribution::linkParameter(std::string par_name)\n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getMainParameterName", _wrap_ParameterDistribution_getMainParameterName, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getMainParameterName(ParameterDistribution self) -> std::string\n"
+		"\n"
+		"std::string ParameterDistribution::getMainParameterName() const\n"
+		"\n"
+		"get the main parameter's name \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getNbrSamples", _wrap_ParameterDistribution_getNbrSamples, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getNbrSamples(ParameterDistribution self) -> size_t\n"
+		"\n"
+		"size_t ParameterDistribution::getNbrSamples() const\n"
+		"\n"
+		"get number of samples for this distribution \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getSigmaFactor", _wrap_ParameterDistribution_getSigmaFactor, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getSigmaFactor(ParameterDistribution self) -> double\n"
+		"\n"
+		"double ParameterDistribution::getSigmaFactor() const\n"
+		"\n"
+		"get the sigma factor \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getDistribution", _wrap_ParameterDistribution_getDistribution, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getDistribution(ParameterDistribution self) -> IDistribution1D\n"
+		"\n"
+		"const IDistribution1D * ParameterDistribution::getDistribution() const \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_generateSamples", _wrap_ParameterDistribution_generateSamples, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_generateSamples(ParameterDistribution self) -> std::vector< ParameterSample,std::allocator< ParameterSample > >\n"
+		"\n"
+		"std::vector< ParameterSample > ParameterDistribution::generateSamples() const\n"
+		"\n"
+		"generate list of sampled values with their weight \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getLinkedParameterNames", _wrap_ParameterDistribution_getLinkedParameterNames, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getLinkedParameterNames(ParameterDistribution self) -> vector_string_t\n"
+		"\n"
+		"std::vector<std::string> ParameterDistribution::getLinkedParameterNames() const\n"
+		"\n"
+		"get list of linked parameter names \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getLimits", _wrap_ParameterDistribution_getLimits, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getLimits(ParameterDistribution self) -> RealLimits\n"
+		"\n"
+		"RealLimits ParameterDistribution::getLimits() const \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getMinValue", _wrap_ParameterDistribution_getMinValue, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getMinValue(ParameterDistribution self) -> double\n"
+		"\n"
+		"double ParameterDistribution::getMinValue() const \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_getMaxValue", _wrap_ParameterDistribution_getMaxValue, METH_VARARGS, (char *)"\n"
+		"ParameterDistribution_getMaxValue(ParameterDistribution self) -> double\n"
+		"\n"
+		"double ParameterDistribution::getMaxValue() const \n"
+		"\n"
+		""},
+	 { (char *)"ParameterDistribution_swigregister", ParameterDistribution_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ParameterPool", _wrap_new_ParameterPool, METH_VARARGS, (char *)"\n"
+		"new_ParameterPool(std::string const & name, std::function< void () > const & onChange) -> ParameterPool\n"
+		"\n"
+		"ParameterPool::ParameterPool(const ParameterPool &)=delete\n"
+		"\n"
+		""},
+	 { (char *)"delete_ParameterPool", _wrap_delete_ParameterPool, METH_VARARGS, (char *)"\n"
+		"delete_ParameterPool(ParameterPool self)\n"
+		"\n"
+		"ParameterPool::~ParameterPool()\n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_clone", _wrap_ParameterPool_clone, METH_VARARGS, (char *)"\n"
+		"ParameterPool_clone(ParameterPool self) -> ParameterPool\n"
+		"\n"
+		"ParameterPool * ParameterPool::clone() const\n"
+		"\n"
+		"Returns a literal clone. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_cloneWithPrefix", _wrap_ParameterPool_cloneWithPrefix, METH_VARARGS, (char *)"\n"
+		"ParameterPool_cloneWithPrefix(ParameterPool self, std::string const & prefix) -> ParameterPool\n"
+		"\n"
+		"ParameterPool * ParameterPool::cloneWithPrefix(const std::string &prefix) const\n"
+		"\n"
+		"Returns a clone with  prefix prepended to every parameter key. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_copyToExternalPool", _wrap_ParameterPool_copyToExternalPool, METH_VARARGS, (char *)"\n"
+		"ParameterPool_copyToExternalPool(ParameterPool self, std::string const & prefix, ParameterPool external_pool)\n"
+		"\n"
+		"void ParameterPool::copyToExternalPool(const std::string &prefix, ParameterPool *external_pool) const\n"
+		"\n"
+		"Copies parameters of given pool to  other pool, prepeding  prefix to the parameter names. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_clear", _wrap_ParameterPool_clear, METH_VARARGS, (char *)"\n"
+		"ParameterPool_clear(ParameterPool self)\n"
+		"\n"
+		"void ParameterPool::clear()\n"
+		"\n"
+		"Clears the parameter map. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_getName", _wrap_ParameterPool_getName, METH_VARARGS, (char *)"\n"
+		"ParameterPool_getName(ParameterPool self) -> std::string\n"
+		"\n"
+		"std::string ParameterPool::getName() const \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_size", _wrap_ParameterPool_size, METH_VARARGS, (char *)"\n"
+		"ParameterPool_size(ParameterPool self) -> size_t\n"
+		"\n"
+		"size_t ParameterPool::size() const\n"
+		"\n"
+		"Returns number of parameters in the pool. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_addParameter", _wrap_ParameterPool_addParameter, METH_VARARGS, (char *)"\n"
+		"ParameterPool_addParameter(ParameterPool self, RealParameter par) -> RealParameter\n"
+		"\n"
+		"RealParameter & ParameterPool::addParameter(RealParameter *par)\n"
+		"\n"
+		"Adds parameter to the pool, and returns reference to the input pointer.\n"
+		"\n"
+		"Returning the input pointer allows us to concatenate function calls like pool->addParameter( new  RealParameter(...) ).setLimits(-1,+1).setFixed().setUnit(\"nm\") \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_getParameter", _wrap_ParameterPool_getParameter, METH_VARARGS, (char *)"\n"
+		"getParameter(std::string const & name) -> RealParameter\n"
+		"ParameterPool_getParameter(ParameterPool self, std::string const & name) -> RealParameter\n"
+		"\n"
+		"const RealParameter * ParameterPool::getParameter(const std::string &name) const\n"
+		"\n"
+		"Returns parameter with given  name. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_getParameters", _wrap_ParameterPool_getParameters, METH_VARARGS, (char *)"\n"
+		"ParameterPool_getParameters(ParameterPool self) -> std::vector< RealParameter *,std::allocator< RealParameter * > > const\n"
+		"\n"
+		"const std::vector<RealParameter*> ParameterPool::getParameters() const\n"
+		"\n"
+		"Returns full vector of parameters. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_getMatchedParameters", _wrap_ParameterPool_getMatchedParameters, METH_VARARGS, (char *)"\n"
+		"ParameterPool_getMatchedParameters(ParameterPool self, std::string const & wildcards) -> std::vector< RealParameter *,std::allocator< RealParameter * > >\n"
+		"\n"
+		"std::vector< RealParameter * > ParameterPool::getMatchedParameters(const std::string &wildcards) const\n"
+		"\n"
+		"Returns vector of parameters that match the  pattern (wildcards '*' allowed). \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_setParameterValue", _wrap_ParameterPool_setParameterValue, METH_VARARGS, (char *)"\n"
+		"ParameterPool_setParameterValue(ParameterPool self, std::string const & name, double value)\n"
+		"\n"
+		"void ParameterPool::setParameterValue(const std::string &name, double value)\n"
+		"\n"
+		"Sets parameter value. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_setMatchedParametersValue", _wrap_ParameterPool_setMatchedParametersValue, METH_VARARGS, (char *)"\n"
+		"ParameterPool_setMatchedParametersValue(ParameterPool self, std::string const & wildcards, double value) -> int\n"
+		"\n"
+		"int ParameterPool::setMatchedParametersValue(const std::string &wildcards, double value)\n"
+		"\n"
+		"Sets parameter value. \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_getParameterNames", _wrap_ParameterPool_getParameterNames, METH_VARARGS, (char *)"\n"
+		"ParameterPool_getParameterNames(ParameterPool self) -> vector_string_t\n"
+		"\n"
+		"std::vector< std::string > ParameterPool::getParameterNames() const \n"
+		"\n"
+		""},
+	 { (char *)"ParameterPool_swigregister", ParameterPool_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Particle", _wrap_new_Particle, METH_VARARGS, (char *)"\n"
+		"Particle()\n"
+		"Particle(IMaterial p_material)\n"
+		"Particle(IMaterial p_material, IFormFactor form_factor)\n"
+		"new_Particle(IMaterial p_material, IFormFactor form_factor, IRotation rotation) -> Particle\n"
+		"\n"
+		"Particle::Particle(const IMaterial &p_material, const IFormFactor &form_factor, const IRotation &rotation)\n"
+		"\n"
+		""},
+	 { (char *)"Particle_clone", _wrap_Particle_clone, METH_VARARGS, (char *)"\n"
+		"Particle_clone(Particle self) -> Particle\n"
+		"\n"
+		"Particle * Particle::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"Particle_cloneInvertB", _wrap_Particle_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"Particle_cloneInvertB(Particle self) -> Particle\n"
+		"\n"
+		"Particle * Particle::cloneInvertB() const\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"Particle_accept", _wrap_Particle_accept, METH_VARARGS, (char *)"\n"
+		"Particle_accept(Particle self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void Particle::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"Particle_to_str", _wrap_Particle_to_str, METH_VARARGS, (char *)"\n"
+		"to_str(int indent=0) -> std::string\n"
+		"Particle_to_str(Particle self) -> std::string\n"
+		"\n"
+		"std::string Particle::to_str(int indent=0) const\n"
+		"\n"
+		"Returns textual representation of this and its descendants. \n"
+		"\n"
+		""},
+	 { (char *)"Particle_setAmbientMaterial", _wrap_Particle_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"Particle_setAmbientMaterial(Particle self, IMaterial material)\n"
+		"\n"
+		"void Particle::setAmbientMaterial(const IMaterial &material) final\n"
+		"\n"
+		"Sets the refractive index of the ambient material (which influences its scattering power) \n"
+		"\n"
+		""},
+	 { (char *)"Particle_getAmbientMaterial", _wrap_Particle_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"Particle_getAmbientMaterial(Particle self) -> IMaterial\n"
+		"\n"
+		"const IMaterial* Particle::getAmbientMaterial() const final\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"Particle_createTransformedFormFactor", _wrap_Particle_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
+		"Particle_createTransformedFormFactor(Particle self, IRotation p_rotation, kvector_t translation) -> IFormFactor\n"
+		"\n"
+		"IFormFactor * Particle::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const\n"
+		"\n"
+		"Create a form factor for this particle with an extra scattering factor. \n"
+		"\n"
+		""},
+	 { (char *)"Particle_setMaterial", _wrap_Particle_setMaterial, METH_VARARGS, (char *)"\n"
+		"Particle_setMaterial(Particle self, IMaterial material)\n"
+		"\n"
+		"void Particle::setMaterial(const IMaterial &material)\n"
+		"\n"
+		""},
+	 { (char *)"Particle_getMaterial", _wrap_Particle_getMaterial, METH_VARARGS, (char *)"\n"
+		"Particle_getMaterial(Particle self) -> IMaterial\n"
+		"\n"
+		"const IMaterial* Particle::getMaterial() const\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"Particle_getRefractiveIndex", _wrap_Particle_getRefractiveIndex, METH_VARARGS, (char *)"\n"
+		"Particle_getRefractiveIndex(Particle self) -> complex_t\n"
+		"\n"
+		"complex_t Particle::getRefractiveIndex() const \n"
+		"\n"
+		""},
+	 { (char *)"Particle_setFormFactor", _wrap_Particle_setFormFactor, METH_VARARGS, (char *)"\n"
+		"Particle_setFormFactor(Particle self, IFormFactor form_factor)\n"
+		"\n"
+		"void Particle::setFormFactor(const IFormFactor &form_factor)\n"
+		"\n"
+		""},
+	 { (char *)"Particle_getFormFactor", _wrap_Particle_getFormFactor, METH_VARARGS, (char *)"\n"
+		"Particle_getFormFactor(Particle self) -> IFormFactor\n"
+		"\n"
+		"const IFormFactor* Particle::getFormFactor() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_Particle", _wrap_delete_Particle, METH_VARARGS, (char *)"delete_Particle(Particle self)"},
+	 { (char *)"Particle_swigregister", Particle_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ParticleComposition", _wrap_new_ParticleComposition, METH_VARARGS, (char *)"\n"
+		"ParticleComposition()\n"
+		"ParticleComposition(IParticle particle)\n"
+		"ParticleComposition(IParticle particle, kvector_t position)\n"
+		"new_ParticleComposition(IParticle particle, vector_kvector_t positions) -> ParticleComposition\n"
+		"\n"
+		"ParticleComposition::ParticleComposition(const IParticle &particle, std::vector< kvector_t > positions)\n"
+		"\n"
+		""},
+	 { (char *)"delete_ParticleComposition", _wrap_delete_ParticleComposition, METH_VARARGS, (char *)"\n"
+		"delete_ParticleComposition(ParticleComposition self)\n"
+		"\n"
+		"ParticleComposition::~ParticleComposition()\n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_clone", _wrap_ParticleComposition_clone, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_clone(ParticleComposition self) -> ParticleComposition\n"
+		"\n"
+		"ParticleComposition * ParticleComposition::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_cloneInvertB", _wrap_ParticleComposition_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_cloneInvertB(ParticleComposition self) -> ParticleComposition\n"
+		"\n"
+		"ParticleComposition * ParticleComposition::cloneInvertB() const\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_accept", _wrap_ParticleComposition_accept, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_accept(ParticleComposition self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void ParticleComposition::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_addParticle", _wrap_ParticleComposition_addParticle, METH_VARARGS, (char *)"\n"
+		"addParticle(IParticle particle)\n"
+		"ParticleComposition_addParticle(ParticleComposition self, IParticle particle, kvector_t position)\n"
+		"\n"
+		"void ParticleComposition::addParticle(const IParticle &particle, kvector_t position)\n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_addParticles", _wrap_ParticleComposition_addParticles, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_addParticles(ParticleComposition self, IParticle particle, vector_kvector_t positions)\n"
+		"\n"
+		"void ParticleComposition::addParticles(const IParticle &particle, std::vector< kvector_t > positions)\n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_setAmbientMaterial", _wrap_ParticleComposition_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_setAmbientMaterial(ParticleComposition self, IMaterial material)\n"
+		"\n"
+		"void ParticleComposition::setAmbientMaterial(const IMaterial &material)\n"
+		"\n"
+		"Sets the refractive index of the ambient material (which influences its scattering power) \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_getAmbientMaterial", _wrap_ParticleComposition_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_getAmbientMaterial(ParticleComposition self) -> IMaterial\n"
+		"\n"
+		"const IMaterial * ParticleComposition::getAmbientMaterial() const\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_createTransformedFormFactor", _wrap_ParticleComposition_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_createTransformedFormFactor(ParticleComposition self, IRotation p_rotation, kvector_t translation) -> IFormFactor\n"
+		"\n"
+		"IFormFactor * ParticleComposition::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const\n"
+		"\n"
+		"Create a form factor for this particle with an extra scattering factor. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_getNbrParticles", _wrap_ParticleComposition_getNbrParticles, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_getNbrParticles(ParticleComposition self) -> size_t\n"
+		"\n"
+		"size_t ParticleComposition::getNbrParticles() const\n"
+		"\n"
+		"Returns number of different particles. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_getParticle", _wrap_ParticleComposition_getParticle, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_getParticle(ParticleComposition self, size_t index) -> IParticle\n"
+		"\n"
+		"const IParticle * ParticleComposition::getParticle(size_t index) const\n"
+		"\n"
+		"Returns particle with given index. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_getParticlePosition", _wrap_ParticleComposition_getParticlePosition, METH_VARARGS, (char *)"\n"
+		"ParticleComposition_getParticlePosition(ParticleComposition self, size_t index) -> kvector_t\n"
+		"\n"
+		"kvector_t ParticleComposition::getParticlePosition(size_t index) const \n"
+		"\n"
+		""},
+	 { (char *)"ParticleComposition_swigregister", ParticleComposition_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ParticleCoreShell", _wrap_new_ParticleCoreShell, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell(Particle shell, Particle core, kvector_t relative_core_position)\n"
+		"new_ParticleCoreShell(Particle shell, Particle core) -> ParticleCoreShell\n"
+		"\n"
+		"ParticleCoreShell::ParticleCoreShell(const Particle &shell, const Particle &core, kvector_t relative_core_position=kvector_t(0.0, 0.0, 0.0))\n"
+		"\n"
+		""},
+	 { (char *)"delete_ParticleCoreShell", _wrap_delete_ParticleCoreShell, METH_VARARGS, (char *)"\n"
+		"delete_ParticleCoreShell(ParticleCoreShell self)\n"
+		"\n"
+		"ParticleCoreShell::~ParticleCoreShell()\n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_clone", _wrap_ParticleCoreShell_clone, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_clone(ParticleCoreShell self) -> ParticleCoreShell\n"
+		"\n"
+		"ParticleCoreShell * ParticleCoreShell::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_cloneInvertB", _wrap_ParticleCoreShell_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_cloneInvertB(ParticleCoreShell self) -> ParticleCoreShell\n"
+		"\n"
+		"ParticleCoreShell * ParticleCoreShell::cloneInvertB() const\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_accept", _wrap_ParticleCoreShell_accept, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_accept(ParticleCoreShell self, ISampleVisitor visitor)\n"
+		"\n"
+		"virtual void ParticleCoreShell::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"Calls the  ISampleVisitor's visit method. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_setAmbientMaterial", _wrap_ParticleCoreShell_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_setAmbientMaterial(ParticleCoreShell self, IMaterial material)\n"
+		"\n"
+		"void ParticleCoreShell::setAmbientMaterial(const IMaterial &material)\n"
+		"\n"
+		"Sets the refractive index of the ambient material (which influences its scattering power) \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_getAmbientMaterial", _wrap_ParticleCoreShell_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_getAmbientMaterial(ParticleCoreShell self) -> IMaterial\n"
+		"\n"
+		"const IMaterial * ParticleCoreShell::getAmbientMaterial() const\n"
+		"\n"
+		"Returns nullptr, unless overwritten to return a specific material. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_createTransformedFormFactor", _wrap_ParticleCoreShell_createTransformedFormFactor, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_createTransformedFormFactor(ParticleCoreShell self, IRotation p_rotation, kvector_t translation) -> IFormFactor\n"
+		"\n"
+		"IFormFactor * ParticleCoreShell::createTransformedFormFactor(const IRotation *p_rotation, kvector_t translation) const\n"
+		"\n"
+		"Create a form factor for this particle with an extra scattering factor. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_getCoreParticle", _wrap_ParticleCoreShell_getCoreParticle, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_getCoreParticle(ParticleCoreShell self) -> Particle\n"
+		"\n"
+		"const Particle* ParticleCoreShell::getCoreParticle() const\n"
+		"\n"
+		"Returns the core particle. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_getShellParticle", _wrap_ParticleCoreShell_getShellParticle, METH_VARARGS, (char *)"\n"
+		"ParticleCoreShell_getShellParticle(ParticleCoreShell self) -> Particle\n"
+		"\n"
+		"const Particle* ParticleCoreShell::getShellParticle() const\n"
+		"\n"
+		"Returns the shell particle. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleCoreShell_swigregister", ParticleCoreShell_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ParticleDistribution", _wrap_new_ParticleDistribution, METH_VARARGS, (char *)"\n"
+		"new_ParticleDistribution(IParticle prototype, ParameterDistribution par_distr) -> ParticleDistribution\n"
+		"\n"
+		"ParticleDistribution::ParticleDistribution(const IParticle &prototype, const ParameterDistribution &par_distr)\n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_clone", _wrap_ParticleDistribution_clone, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_clone(ParticleDistribution self) -> ParticleDistribution\n"
+		"\n"
+		"ParticleDistribution * ParticleDistribution::clone() const\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_cloneInvertB", _wrap_ParticleDistribution_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_cloneInvertB(ParticleDistribution self) -> ParticleDistribution\n"
+		"\n"
+		"ParticleDistribution * ParticleDistribution::cloneInvertB() const\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_accept", _wrap_ParticleDistribution_accept, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_accept(ParticleDistribution self, ISampleVisitor visitor)\n"
+		"\n"
+		"void ParticleDistribution::accept(ISampleVisitor *visitor) const\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_to_str", _wrap_ParticleDistribution_to_str, METH_VARARGS, (char *)"\n"
+		"to_str(int indent=0) -> std::string\n"
+		"ParticleDistribution_to_str(ParticleDistribution self) -> std::string\n"
+		"\n"
+		"std::string ParticleDistribution::to_str(int indent=0) const\n"
+		"\n"
+		"Returns textual representation of* this and its descendants. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_setAmbientMaterial", _wrap_ParticleDistribution_setAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_setAmbientMaterial(ParticleDistribution self, IMaterial material)\n"
+		"\n"
+		"void ParticleDistribution::setAmbientMaterial(const IMaterial &material)\n"
+		"\n"
+		"Sets the refractive index of the ambient material (which influences its scattering power) \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_getAmbientMaterial", _wrap_ParticleDistribution_getAmbientMaterial, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_getAmbientMaterial(ParticleDistribution self) -> IMaterial\n"
+		"\n"
+		"const IMaterial * ParticleDistribution::getAmbientMaterial() const\n"
+		"\n"
+		"Returns particle's material. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_generateParticles", _wrap_ParticleDistribution_generateParticles, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_generateParticles(ParticleDistribution self, std::vector< IParticle const *,std::allocator< IParticle const * > > & particle_vector)\n"
+		"\n"
+		"void ParticleDistribution::generateParticles(std::vector< const IParticle * > &particle_vector) const\n"
+		"\n"
+		"Initializes list of new particles generated according to a distribution. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_getParameterDistribution", _wrap_ParticleDistribution_getParameterDistribution, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_getParameterDistribution(ParticleDistribution self) -> ParameterDistribution\n"
+		"\n"
+		"ParameterDistribution ParticleDistribution::getParameterDistribution() const\n"
+		"\n"
+		"Returns the distributed parameter data. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_createDistributedParameterPool", _wrap_ParticleDistribution_createDistributedParameterPool, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_createDistributedParameterPool(ParticleDistribution self) -> ParameterPool\n"
+		"\n"
+		"ParameterPool * ParticleDistribution::createDistributedParameterPool() const\n"
+		"\n"
+		"Returns the parameter pool that can be used for parameter distributions. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleDistribution_getParticle", _wrap_ParticleDistribution_getParticle, METH_VARARGS, (char *)"\n"
+		"ParticleDistribution_getParticle(ParticleDistribution self) -> IParticle\n"
+		"\n"
+		"const IParticle * ParticleDistribution::getParticle() const\n"
+		"\n"
+		"Returns particle. \n"
+		"\n"
+		""},
+	 { (char *)"delete_ParticleDistribution", _wrap_delete_ParticleDistribution, METH_VARARGS, (char *)"delete_ParticleDistribution(ParticleDistribution self)"},
+	 { (char *)"ParticleDistribution_swigregister", ParticleDistribution_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ParticleLayout", _wrap_new_ParticleLayout, METH_VARARGS, (char *)"\n"
+		"ParticleLayout()\n"
+		"ParticleLayout(IAbstractParticle particle)\n"
+		"new_ParticleLayout(IAbstractParticle particle, double abundance) -> ParticleLayout\n"
+		"\n"
+		"ParticleLayout::ParticleLayout(const IAbstractParticle &particle, double abundance)\n"
+		"\n"
+		""},
+	 { (char *)"delete_ParticleLayout", _wrap_delete_ParticleLayout, METH_VARARGS, (char *)"\n"
+		"delete_ParticleLayout(ParticleLayout self)\n"
+		"\n"
+		"ParticleLayout::~ParticleLayout() final\n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_clone", _wrap_ParticleLayout_clone, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_clone(ParticleLayout self) -> ParticleLayout\n"
+		"\n"
+		"ParticleLayout * ParticleLayout::clone() const final\n"
+		"\n"
+		"Returns a clone of this  ISample object. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_cloneInvertB", _wrap_ParticleLayout_cloneInvertB, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_cloneInvertB(ParticleLayout self) -> ParticleLayout\n"
+		"\n"
+		"ParticleLayout * ParticleLayout::cloneInvertB() const final\n"
+		"\n"
+		"Returns a clone with inverted magnetic fields. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_accept", _wrap_ParticleLayout_accept, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_accept(ParticleLayout self, ISampleVisitor visitor)\n"
+		"\n"
+		"void ParticleLayout::accept(ISampleVisitor *visitor) const final\n"
+		"\n"
+		"calls the  ISampleVisitor's visit method \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_addParticle", _wrap_ParticleLayout_addParticle, METH_VARARGS, (char *)"\n"
+		"addParticle(IAbstractParticle particle)\n"
+		"addParticle(IAbstractParticle particle, double abundance)\n"
+		"addParticle(IParticle particle, double abundance, kvector_t position)\n"
+		"ParticleLayout_addParticle(ParticleLayout self, IParticle particle, double abundance, kvector_t position, IRotation rotation)\n"
+		"\n"
+		"void ParticleLayout::addParticle(const IParticle &particle, double abundance, const kvector_t position, const IRotation &rotation)\n"
+		"\n"
+		"Adds particle to the layout with abundance, position and the rotation defined.\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"particle: \n"
+		"to be added\n"
+		"\n"
+		"abundance: \n"
+		" Particle abundance\n"
+		"\n"
+		"position: \n"
+		" Particle position\n"
+		"\n"
+		"rotation: \n"
+		" Particle rotation \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_getNumberOfParticles", _wrap_ParticleLayout_getNumberOfParticles, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_getNumberOfParticles(ParticleLayout self) -> size_t\n"
+		"\n"
+		"size_t ParticleLayout::getNumberOfParticles() const final\n"
+		"\n"
+		"Returns number of particles. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_getParticle", _wrap_ParticleLayout_getParticle, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_getParticle(ParticleLayout self, size_t index) -> IAbstractParticle\n"
+		"\n"
+		"const IAbstractParticle * ParticleLayout::getParticle(size_t index) const final\n"
+		"\n"
+		"Returns particle info. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_getParticles", _wrap_ParticleLayout_getParticles, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_getParticles(ParticleLayout self) -> SafePointerVector< IParticle const >\n"
+		"\n"
+		"SafePointerVector< const IParticle > ParticleLayout::getParticles() const final\n"
+		"\n"
+		"Returns information on all particles (type and abundance) and generates new particles if an  IAbstractParticle denotes a collection \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_getAbundanceOfParticle", _wrap_ParticleLayout_getAbundanceOfParticle, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_getAbundanceOfParticle(ParticleLayout self, size_t index) -> double\n"
+		"\n"
+		"double ParticleLayout::getAbundanceOfParticle(size_t index) const\n"
+		"\n"
+		"Returns the abundance fraction of particle at given index. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_getInterferenceFunction", _wrap_ParticleLayout_getInterferenceFunction, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_getInterferenceFunction(ParticleLayout self) -> IInterferenceFunction\n"
+		"\n"
+		"const IInterferenceFunction* ParticleLayout::getInterferenceFunction() const final\n"
+		"\n"
+		"Returns interference function. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_cloneInterferenceFunction", _wrap_ParticleLayout_cloneInterferenceFunction, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_cloneInterferenceFunction(ParticleLayout self) -> IInterferenceFunction\n"
+		"\n"
+		"IInterferenceFunction * ParticleLayout::cloneInterferenceFunction() const final\n"
+		"\n"
+		"Returns a clone, or an  InterferenceFunctionNone. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_addInterferenceFunction", _wrap_ParticleLayout_addInterferenceFunction, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_addInterferenceFunction(ParticleLayout self, IInterferenceFunction interference_function)\n"
+		"\n"
+		"void ParticleLayout::addInterferenceFunction(const IInterferenceFunction &interference_function)\n"
+		"\n"
+		"Adds interference functions. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_getTotalParticleSurfaceDensity", _wrap_ParticleLayout_getTotalParticleSurfaceDensity, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_getTotalParticleSurfaceDensity(ParticleLayout self) -> double\n"
+		"\n"
+		"double ParticleLayout::getTotalParticleSurfaceDensity() const final\n"
+		"\n"
+		"Returns surface density of all particles. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_setTotalParticleSurfaceDensity", _wrap_ParticleLayout_setTotalParticleSurfaceDensity, METH_VARARGS, (char *)"\n"
+		"ParticleLayout_setTotalParticleSurfaceDensity(ParticleLayout self, double particle_density)\n"
+		"\n"
+		"void ParticleLayout::setTotalParticleSurfaceDensity(double particle_density) final\n"
+		"\n"
+		"Sets surface density of all particles. \n"
+		"\n"
+		""},
+	 { (char *)"ParticleLayout_swigregister", ParticleLayout_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Polygon", _wrap_new_Polygon, METH_VARARGS, (char *)"\n"
+		"Polygon(vdouble1d_t x, vdouble1d_t y)\n"
+		"Polygon(vdouble2d_t points)\n"
+		"new_Polygon(Geometry::PolygonPrivate const * d) -> Polygon\n"
+		"\n"
+		"Geometry::Polygon::Polygon(const PolygonPrivate *d)\n"
+		"\n"
+		""},
+	 { (char *)"delete_Polygon", _wrap_delete_Polygon, METH_VARARGS, (char *)"\n"
+		"delete_Polygon(Polygon self)\n"
+		"\n"
+		"Geometry::Polygon::~Polygon()\n"
+		"\n"
+		""},
+	 { (char *)"Polygon_clone", _wrap_Polygon_clone, METH_VARARGS, (char *)"\n"
+		"Polygon_clone(Polygon self) -> Polygon\n"
+		"\n"
+		"virtual Polygon* Geometry::Polygon::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"Polygon_contains", _wrap_Polygon_contains, METH_VARARGS, (char *)"\n"
+		"contains(double x, double y) -> bool\n"
+		"Polygon_contains(Polygon self, Bin1D binx, Bin1D biny) -> bool\n"
+		"\n"
+		"bool Geometry::Polygon::contains(const Bin1D &binx, const Bin1D &biny) const\n"
+		"\n"
+		"Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). \n"
+		"\n"
+		""},
+	 { (char *)"Polygon_getArea", _wrap_Polygon_getArea, METH_VARARGS, (char *)"\n"
+		"Polygon_getArea(Polygon self) -> double\n"
+		"\n"
+		"double Geometry::Polygon::getArea() const \n"
+		"\n"
+		""},
+	 { (char *)"Polygon_getPoints", _wrap_Polygon_getPoints, METH_VARARGS, (char *)"\n"
+		"Polygon_getPoints(Polygon self, vdouble1d_t xpos, vdouble1d_t ypos)\n"
+		"\n"
+		"void Geometry::Polygon::getPoints(std::vector< double > &xpos, std::vector< double > &ypos) const \n"
+		"\n"
+		""},
+	 { (char *)"Polygon_swigregister", Polygon_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_RealParameter", _wrap_new_RealParameter, METH_VARARGS, (char *)"\n"
+		"RealParameter(std::string const & name, double volatile * par, std::string const & parent_name, std::function< void () > const & onChange, RealLimits limits, Attributes attr)\n"
+		"RealParameter(std::string const & name, double volatile * par, std::string const & parent_name, std::function< void () > const & onChange, RealLimits limits)\n"
+		"new_RealParameter(std::string const & name, double volatile * par, std::string const & parent_name, std::function< void () > const & onChange) -> RealParameter\n"
+		"\n"
+		"RealParameter::RealParameter(const std::string &name, volatile double *par, const std::string &parent_name, const std::function< void()> &onChange, const RealLimits &limits=RealLimits::limitless(), const Attributes &attr=Attributes::free())\n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_clone", _wrap_RealParameter_clone, METH_VARARGS, (char *)"\n"
+		"clone(std::string const & new_name) -> RealParameter\n"
+		"RealParameter_clone(RealParameter self) -> RealParameter\n"
+		"\n"
+		"RealParameter * RealParameter::clone(const std::string &new_name=\"\") const \n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_setValue", _wrap_RealParameter_setValue, METH_VARARGS, (char *)"\n"
+		"RealParameter_setValue(RealParameter self, double value)\n"
+		"\n"
+		"void RealParameter::setValue(double value)\n"
+		"\n"
+		"Sets value of wrapped parameter and emit signal. \n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_getValue", _wrap_RealParameter_getValue, METH_VARARGS, (char *)"\n"
+		"RealParameter_getValue(RealParameter self) -> double\n"
+		"\n"
+		"double RealParameter::getValue() const\n"
+		"\n"
+		"Returns value of wrapped parameter. \n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_setLimits", _wrap_RealParameter_setLimits, METH_VARARGS, (char *)"\n"
+		"RealParameter_setLimits(RealParameter self, RealLimits limits) -> RealParameter\n"
+		"\n"
+		"RealParameter& RealParameter::setLimits(const RealLimits &limits)\n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_getLimits", _wrap_RealParameter_getLimits, METH_VARARGS, (char *)"\n"
+		"RealParameter_getLimits(RealParameter self) -> RealLimits\n"
+		"\n"
+		"RealLimits RealParameter::getLimits() const \n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_setLimited", _wrap_RealParameter_setLimited, METH_VARARGS, (char *)"\n"
+		"RealParameter_setLimited(RealParameter self, double lower, double upper) -> RealParameter\n"
+		"\n"
+		"RealParameter & RealParameter::setLimited(double lower, double upper)\n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_setPositive", _wrap_RealParameter_setPositive, METH_VARARGS, (char *)"\n"
+		"RealParameter_setPositive(RealParameter self) -> RealParameter\n"
+		"\n"
+		"RealParameter & RealParameter::setPositive()\n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_setNonnegative", _wrap_RealParameter_setNonnegative, METH_VARARGS, (char *)"\n"
+		"RealParameter_setNonnegative(RealParameter self) -> RealParameter\n"
+		"\n"
+		"RealParameter & RealParameter::setNonnegative()\n"
+		"\n"
+		""},
+	 { (char *)"RealParameter___eq__", _wrap_RealParameter___eq__, METH_VARARGS, (char *)"RealParameter___eq__(RealParameter self, RealParameter other) -> bool"},
+	 { (char *)"RealParameter_setUnit", _wrap_RealParameter_setUnit, METH_VARARGS, (char *)"\n"
+		"RealParameter_setUnit(RealParameter self, std::string const & name) -> RealParameter\n"
+		"\n"
+		"RealParameter& RealParameter::setUnit(const std::string &name)\n"
+		"\n"
+		""},
+	 { (char *)"RealParameter_unit", _wrap_RealParameter_unit, METH_VARARGS, (char *)"\n"
+		"RealParameter_unit(RealParameter self) -> std::string\n"
+		"\n"
+		"std::string RealParameter::unit() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_RealParameter", _wrap_delete_RealParameter, METH_VARARGS, (char *)"delete_RealParameter(RealParameter self)"},
+	 { (char *)"RealParameter_swigregister", RealParameter_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_Rectangle", _wrap_new_Rectangle, METH_VARARGS, (char *)"\n"
+		"new_Rectangle(double xlow, double ylow, double xup, double yup) -> Rectangle\n"
+		"\n"
+		"Geometry::Rectangle::Rectangle(double xlow, double ylow, double xup, double yup)\n"
+		"\n"
+		"Parameters:\n"
+		"-----------\n"
+		"\n"
+		"xlow: \n"
+		"x-coordinate of lower left corner\n"
+		"\n"
+		"ylow: \n"
+		"y-coordinate of lower left corner\n"
+		"\n"
+		"xup: \n"
+		"x-coordinate of upper right corner\n"
+		"\n"
+		"yup: \n"
+		"y-coordinate of upper right corner \n"
+		"\n"
+		""},
+	 { (char *)"Rectangle_clone", _wrap_Rectangle_clone, METH_VARARGS, (char *)"\n"
+		"Rectangle_clone(Rectangle self) -> Rectangle\n"
+		"\n"
+		"Rectangle* Geometry::Rectangle::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"Rectangle_contains", _wrap_Rectangle_contains, METH_VARARGS, (char *)"\n"
+		"contains(double x, double y) -> bool\n"
+		"Rectangle_contains(Rectangle self, Bin1D binx, Bin1D biny) -> bool\n"
+		"\n"
+		"bool Geometry::Rectangle::contains(const Bin1D &binx, const Bin1D &biny) const\n"
+		"\n"
+		"Returns true if area defined by two bins is inside or on border of polygon (more precisely, if mid point of two bins satisfy this condition). \n"
+		"\n"
+		""},
+	 { (char *)"Rectangle_getArea", _wrap_Rectangle_getArea, METH_VARARGS, (char *)"\n"
+		"Rectangle_getArea(Rectangle self) -> double\n"
+		"\n"
+		"double Geometry::Rectangle::getArea() const \n"
+		"\n"
+		""},
+	 { (char *)"Rectangle_getXlow", _wrap_Rectangle_getXlow, METH_VARARGS, (char *)"\n"
+		"Rectangle_getXlow(Rectangle self) -> double\n"
+		"\n"
+		"double Geometry::Rectangle::getXlow() const \n"
+		"\n"
+		""},
+	 { (char *)"Rectangle_getYlow", _wrap_Rectangle_getYlow, METH_VARARGS, (char *)"\n"
+		"Rectangle_getYlow(Rectangle self) -> double\n"
+		"\n"
+		"double Geometry::Rectangle::getYlow() const \n"
+		"\n"
+		""},
+	 { (char *)"Rectangle_getXup", _wrap_Rectangle_getXup, METH_VARARGS, (char *)"\n"
+		"Rectangle_getXup(Rectangle self) -> double\n"
+		"\n"
+		"double Geometry::Rectangle::getXup() const \n"
+		"\n"
+		""},
+	 { (char *)"Rectangle_getYup", _wrap_Rectangle_getYup, METH_VARARGS, (char *)"\n"
+		"Rectangle_getYup(Rectangle self) -> double\n"
+		"\n"
+		"double Geometry::Rectangle::getYup() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_Rectangle", _wrap_delete_Rectangle, METH_VARARGS, (char *)"delete_Rectangle(Rectangle self)"},
+	 { (char *)"Rectangle_swigregister", Rectangle_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_RectangularDetector", _wrap_new_RectangularDetector, METH_VARARGS, (char *)"\n"
+		"RectangularDetector(int nxbins, double width, int nybins, double height)\n"
+		"new_RectangularDetector(RectangularDetector other) -> RectangularDetector\n"
+		"\n"
+		"RectangularDetector::RectangularDetector(const RectangularDetector &other)\n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_clone", _wrap_RectangularDetector_clone, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_clone(RectangularDetector self) -> RectangularDetector\n"
+		"\n"
+		"RectangularDetector * RectangularDetector::clone() const override\n"
+		"\n"
+		""},
+	 { (char *)"delete_RectangularDetector", _wrap_delete_RectangularDetector, METH_VARARGS, (char *)"\n"
+		"delete_RectangularDetector(RectangularDetector self)\n"
+		"\n"
+		"RectangularDetector::~RectangularDetector()\n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_init", _wrap_RectangularDetector_init, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_init(RectangularDetector self, Beam beam)\n"
+		"\n"
+		"void RectangularDetector::init(const Beam &beam) override\n"
+		"\n"
+		"Inits detector with the beam settings. \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_setPosition", _wrap_RectangularDetector_setPosition, METH_VARARGS, (char *)"\n"
+		"setPosition(kvector_t normal_to_detector, double u0, double v0, kvector_t direction)\n"
+		"RectangularDetector_setPosition(RectangularDetector self, kvector_t normal_to_detector, double u0, double v0)\n"
+		"\n"
+		"void RectangularDetector::setPosition(const kvector_t normal_to_detector, double u0, double v0, const kvector_t direction=kvector_t(0.0,-1.0, 0.0))\n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_setPerpendicularToSampleX", _wrap_RectangularDetector_setPerpendicularToSampleX, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_setPerpendicularToSampleX(RectangularDetector self, double distance, double u0, double v0)\n"
+		"\n"
+		"void RectangularDetector::setPerpendicularToSampleX(double distance, double u0, double v0)\n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_setPerpendicularToDirectBeam", _wrap_RectangularDetector_setPerpendicularToDirectBeam, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_setPerpendicularToDirectBeam(RectangularDetector self, double distance, double u0, double v0)\n"
+		"\n"
+		"void RectangularDetector::setPerpendicularToDirectBeam(double distance, double u0, double v0)\n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_setPerpendicularToReflectedBeam", _wrap_RectangularDetector_setPerpendicularToReflectedBeam, METH_VARARGS, (char *)"\n"
+		"setPerpendicularToReflectedBeam(double distance, double u0=0.0, double v0=0.0)\n"
+		"setPerpendicularToReflectedBeam(double distance, double u0=0.0)\n"
+		"RectangularDetector_setPerpendicularToReflectedBeam(RectangularDetector self, double distance)\n"
+		"\n"
+		"void RectangularDetector::setPerpendicularToReflectedBeam(double distance, double u0=0.0, double v0=0.0)\n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_setDirectBeamPosition", _wrap_RectangularDetector_setDirectBeamPosition, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_setDirectBeamPosition(RectangularDetector self, double u0, double v0)\n"
+		"\n"
+		"void RectangularDetector::setDirectBeamPosition(double u0, double v0)\n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getWidth", _wrap_RectangularDetector_getWidth, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getWidth(RectangularDetector self) -> double\n"
+		"\n"
+		"double RectangularDetector::getWidth() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getHeight", _wrap_RectangularDetector_getHeight, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getHeight(RectangularDetector self) -> double\n"
+		"\n"
+		"double RectangularDetector::getHeight() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getNbinsX", _wrap_RectangularDetector_getNbinsX, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getNbinsX(RectangularDetector self) -> size_t\n"
+		"\n"
+		"size_t RectangularDetector::getNbinsX() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getNbinsY", _wrap_RectangularDetector_getNbinsY, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getNbinsY(RectangularDetector self) -> size_t\n"
+		"\n"
+		"size_t RectangularDetector::getNbinsY() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getNormalVector", _wrap_RectangularDetector_getNormalVector, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getNormalVector(RectangularDetector self) -> kvector_t\n"
+		"\n"
+		"kvector_t RectangularDetector::getNormalVector() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getU0", _wrap_RectangularDetector_getU0, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getU0(RectangularDetector self) -> double\n"
+		"\n"
+		"double RectangularDetector::getU0() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getV0", _wrap_RectangularDetector_getV0, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getV0(RectangularDetector self) -> double\n"
+		"\n"
+		"double RectangularDetector::getV0() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getDirectionVector", _wrap_RectangularDetector_getDirectionVector, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getDirectionVector(RectangularDetector self) -> kvector_t\n"
+		"\n"
+		"kvector_t RectangularDetector::getDirectionVector() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getDistance", _wrap_RectangularDetector_getDistance, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getDistance(RectangularDetector self) -> double\n"
+		"\n"
+		"double RectangularDetector::getDistance() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getDirectBeamU0", _wrap_RectangularDetector_getDirectBeamU0, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getDirectBeamU0(RectangularDetector self) -> double\n"
+		"\n"
+		"double RectangularDetector::getDirectBeamU0() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getDirectBeamV0", _wrap_RectangularDetector_getDirectBeamV0, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getDirectBeamV0(RectangularDetector self) -> double\n"
+		"\n"
+		"double RectangularDetector::getDirectBeamV0() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getDetectorArrangment", _wrap_RectangularDetector_getDetectorArrangment, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getDetectorArrangment(RectangularDetector self) -> RectangularDetector::EDetectorArrangement\n"
+		"\n"
+		"RectangularDetector::EDetectorArrangement RectangularDetector::getDetectorArrangment() const \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getValidAxesUnits", _wrap_RectangularDetector_getValidAxesUnits, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getValidAxesUnits(RectangularDetector self) -> std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > >\n"
+		"\n"
+		"std::vector< IDetector2D::EAxesUnits > RectangularDetector::getValidAxesUnits() const override\n"
+		"\n"
+		"returns vector of valid axes units \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_getDefaultAxesUnits", _wrap_RectangularDetector_getDefaultAxesUnits, METH_VARARGS, (char *)"\n"
+		"RectangularDetector_getDefaultAxesUnits(RectangularDetector self) -> IDetector2D::EAxesUnits\n"
+		"\n"
+		"IDetector2D::EAxesUnits RectangularDetector::getDefaultAxesUnits() const override\n"
+		"\n"
+		"return default axes units \n"
+		"\n"
+		""},
+	 { (char *)"RectangularDetector_swigregister", RectangularDetector_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_RectPixelMap", _wrap_new_RectPixelMap, METH_VARARGS, (char *)"\n"
+		"new_RectPixelMap(kvector_t corner_pos, kvector_t width, kvector_t height) -> RectPixelMap\n"
+		"\n"
+		"RectPixelMap::RectPixelMap(kvector_t corner_pos, kvector_t width, kvector_t height)\n"
+		"\n"
+		""},
+	 { (char *)"delete_RectPixelMap", _wrap_delete_RectPixelMap, METH_VARARGS, (char *)"\n"
+		"delete_RectPixelMap(RectPixelMap self)\n"
+		"\n"
+		"virtual RectPixelMap::~RectPixelMap()\n"
+		"\n"
+		""},
+	 { (char *)"RectPixelMap_clone", _wrap_RectPixelMap_clone, METH_VARARGS, (char *)"\n"
+		"RectPixelMap_clone(RectPixelMap self) -> RectPixelMap\n"
+		"\n"
+		"RectPixelMap * RectPixelMap::clone() const override\n"
+		"\n"
+		""},
+	 { (char *)"RectPixelMap_createZeroSizeMap", _wrap_RectPixelMap_createZeroSizeMap, METH_VARARGS, (char *)"\n"
+		"RectPixelMap_createZeroSizeMap(RectPixelMap self, double x, double y) -> RectPixelMap\n"
+		"\n"
+		"RectPixelMap * RectPixelMap::createZeroSizeMap(double x, double y) const override\n"
+		"\n"
+		""},
+	 { (char *)"RectPixelMap_getK", _wrap_RectPixelMap_getK, METH_VARARGS, (char *)"\n"
+		"RectPixelMap_getK(RectPixelMap self, double x, double y, double wavelength) -> kvector_t\n"
+		"\n"
+		"kvector_t RectPixelMap::getK(double x, double y, double wavelength) const override\n"
+		"\n"
+		""},
+	 { (char *)"RectPixelMap_getIntegrationFactor", _wrap_RectPixelMap_getIntegrationFactor, METH_VARARGS, (char *)"\n"
+		"RectPixelMap_getIntegrationFactor(RectPixelMap self, double x, double y) -> double\n"
+		"\n"
+		"double RectPixelMap::getIntegrationFactor(double x, double y) const override\n"
+		"\n"
+		""},
+	 { (char *)"RectPixelMap_getSolidAngle", _wrap_RectPixelMap_getSolidAngle, METH_VARARGS, (char *)"\n"
+		"RectPixelMap_getSolidAngle(RectPixelMap self) -> double\n"
+		"\n"
+		"double RectPixelMap::getSolidAngle() const override\n"
+		"\n"
+		""},
+	 { (char *)"RectPixelMap_swigregister", RectPixelMap_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ResolutionFunction2DGaussian", _wrap_new_ResolutionFunction2DGaussian, METH_VARARGS, (char *)"\n"
+		"new_ResolutionFunction2DGaussian(double sigma_x, double sigma_y) -> ResolutionFunction2DGaussian\n"
+		"\n"
+		"ResolutionFunction2DGaussian::ResolutionFunction2DGaussian(double sigma_x, double sigma_y)\n"
+		"\n"
+		""},
+	 { (char *)"ResolutionFunction2DGaussian_evaluateCDF", _wrap_ResolutionFunction2DGaussian_evaluateCDF, METH_VARARGS, (char *)"\n"
+		"ResolutionFunction2DGaussian_evaluateCDF(ResolutionFunction2DGaussian self, double x, double y) -> double\n"
+		"\n"
+		"double ResolutionFunction2DGaussian::evaluateCDF(double x, double y) const \n"
+		"\n"
+		""},
+	 { (char *)"ResolutionFunction2DGaussian_clone", _wrap_ResolutionFunction2DGaussian_clone, METH_VARARGS, (char *)"\n"
+		"ResolutionFunction2DGaussian_clone(ResolutionFunction2DGaussian self) -> ResolutionFunction2DGaussian\n"
+		"\n"
+		"ResolutionFunction2DGaussian* ResolutionFunction2DGaussian::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"ResolutionFunction2DGaussian_getSigmaX", _wrap_ResolutionFunction2DGaussian_getSigmaX, METH_VARARGS, (char *)"\n"
+		"ResolutionFunction2DGaussian_getSigmaX(ResolutionFunction2DGaussian self) -> double\n"
+		"\n"
+		"double ResolutionFunction2DGaussian::getSigmaX() const \n"
+		"\n"
+		""},
+	 { (char *)"ResolutionFunction2DGaussian_getSigmaY", _wrap_ResolutionFunction2DGaussian_getSigmaY, METH_VARARGS, (char *)"\n"
+		"ResolutionFunction2DGaussian_getSigmaY(ResolutionFunction2DGaussian self) -> double\n"
+		"\n"
+		"double ResolutionFunction2DGaussian::getSigmaY() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_ResolutionFunction2DGaussian", _wrap_delete_ResolutionFunction2DGaussian, METH_VARARGS, (char *)"delete_ResolutionFunction2DGaussian(ResolutionFunction2DGaussian self)"},
+	 { (char *)"ResolutionFunction2DGaussian_swigregister", ResolutionFunction2DGaussian_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SpecularSimulation", _wrap_new_SpecularSimulation, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation()\n"
+		"SpecularSimulation(ISample sample)\n"
+		"new_SpecularSimulation(std::shared_ptr< IMultiLayerBuilder > const sample_builder) -> SpecularSimulation\n"
+		"\n"
+		"SpecularSimulation::SpecularSimulation(std::shared_ptr< IMultiLayerBuilder > sample_builder)\n"
+		"\n"
+		""},
+	 { (char *)"delete_SpecularSimulation", _wrap_delete_SpecularSimulation, METH_VARARGS, (char *)"\n"
+		"delete_SpecularSimulation(SpecularSimulation self)\n"
+		"\n"
+		"SpecularSimulation::~SpecularSimulation()\n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_clone", _wrap_SpecularSimulation_clone, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_clone(SpecularSimulation self) -> SpecularSimulation\n"
+		"\n"
+		"SpecularSimulation * SpecularSimulation::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_runSimulation", _wrap_SpecularSimulation_runSimulation, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_runSimulation(SpecularSimulation self)\n"
+		"\n"
+		"void SpecularSimulation::runSimulation()\n"
+		"\n"
+		"Run a simulation with the current parameter settings. \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_setSample", _wrap_SpecularSimulation_setSample, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_setSample(SpecularSimulation self, ISample sample)\n"
+		"\n"
+		"void SpecularSimulation::setSample(const ISample &sample)\n"
+		"\n"
+		"Sets the sample to be tested. \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_getSample", _wrap_SpecularSimulation_getSample, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_getSample(SpecularSimulation self) -> ISample\n"
+		"\n"
+		"ISample* SpecularSimulation::getSample() const\n"
+		"\n"
+		"Returns the sample. \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_setSampleBuilderCpp", _wrap_SpecularSimulation_setSampleBuilderCpp, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_setSampleBuilderCpp(SpecularSimulation self, std::shared_ptr< IMultiLayerBuilder > sample_builder)\n"
+		"\n"
+		"void SpecularSimulation::setSampleBuilder(std::shared_ptr< IMultiLayerBuilder > sample_builder)\n"
+		"\n"
+		"Sets the sample builder. \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_getSampleBuilder", _wrap_SpecularSimulation_getSampleBuilder, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_getSampleBuilder(SpecularSimulation self) -> std::shared_ptr< IMultiLayerBuilder >\n"
+		"\n"
+		"std::shared_ptr<IMultiLayerBuilder> SpecularSimulation::getSampleBuilder() const\n"
+		"\n"
+		"return sample builder \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_setBeamParameters", _wrap_SpecularSimulation_setBeamParameters, METH_VARARGS, (char *)"\n"
+		"setBeamParameters(double arg2, IAxis alpha_axis)\n"
+		"SpecularSimulation_setBeamParameters(SpecularSimulation self, double arg3, int nbins, double alpha_i_min, double alpha_i_max)\n"
+		"\n"
+		"void SpecularSimulation::setBeamParameters(double lambda, int nbins, double alpha_i_min, double alpha_i_max)\n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_setEvanescentWaveAxis", _wrap_SpecularSimulation_setEvanescentWaveAxis, METH_VARARGS, (char *)"\n"
+		"setEvanescentWaveAxis(IAxis z_axis)\n"
+		"SpecularSimulation_setEvanescentWaveAxis(SpecularSimulation self, int nbins, double z_min, double z_max)\n"
+		"\n"
+		"void SpecularSimulation::setEvanescentWaveAxis(int nbins, double z_min, double z_max)\n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_getAlphaAxis", _wrap_SpecularSimulation_getAlphaAxis, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_getAlphaAxis(SpecularSimulation self) -> IAxis\n"
+		"\n"
+		"const IAxis * SpecularSimulation::getAlphaAxis() const\n"
+		"\n"
+		"returns alpha_i axis \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_getScalarR", _wrap_SpecularSimulation_getScalarR, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_getScalarR(SpecularSimulation self, size_t i_layer) -> vector_complex_t\n"
+		"\n"
+		"std::vector< complex_t > SpecularSimulation::getScalarR(size_t i_layer) const\n"
+		"\n"
+		"returns vector of reflection coefficients for all alpha_i angles for given layer index \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_getScalarT", _wrap_SpecularSimulation_getScalarT, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_getScalarT(SpecularSimulation self, size_t i_layer) -> vector_complex_t\n"
+		"\n"
+		"std::vector< complex_t > SpecularSimulation::getScalarT(size_t i_layer) const\n"
+		"\n"
+		"returns vector of transmission coefficients for all alpha_i angles for given layer index \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_getScalarKz", _wrap_SpecularSimulation_getScalarKz, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_getScalarKz(SpecularSimulation self, size_t i_layer) -> vector_complex_t\n"
+		"\n"
+		"std::vector< complex_t > SpecularSimulation::getScalarKz(size_t i_layer) const\n"
+		"\n"
+		"returns vector of Kz coefficients for all alpha_i angles for given layer index \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_getLayerRTCoefficients", _wrap_SpecularSimulation_getLayerRTCoefficients, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_getLayerRTCoefficients(SpecularSimulation self, size_t i_alpha, size_t i_layer) -> SpecularSimulation::LayerRTCoefficients_t\n"
+		"\n"
+		"SpecularSimulation::LayerRTCoefficients_t SpecularSimulation::getLayerRTCoefficients(size_t i_alpha, size_t i_layer) const \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_prepareSimulation", _wrap_SpecularSimulation_prepareSimulation, METH_VARARGS, (char *)"\n"
+		"SpecularSimulation_prepareSimulation(SpecularSimulation self)\n"
+		"\n"
+		"void SpecularSimulation::prepareSimulation()\n"
+		"\n"
+		"Put into a clean state for running a simulation. \n"
+		"\n"
+		""},
+	 { (char *)"SpecularSimulation_swigregister", SpecularSimulation_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_ThreadInfo", _wrap_new_ThreadInfo, METH_VARARGS, (char *)"\n"
+		"new_ThreadInfo() -> ThreadInfo\n"
+		"\n"
+		"ThreadInfo::ThreadInfo()\n"
+		"\n"
+		""},
+	 { (char *)"ThreadInfo_n_threads_set", _wrap_ThreadInfo_n_threads_set, METH_VARARGS, (char *)"ThreadInfo_n_threads_set(ThreadInfo self, int n_threads)"},
+	 { (char *)"ThreadInfo_n_threads_get", _wrap_ThreadInfo_n_threads_get, METH_VARARGS, (char *)"ThreadInfo_n_threads_get(ThreadInfo self) -> int"},
+	 { (char *)"ThreadInfo_current_thread_set", _wrap_ThreadInfo_current_thread_set, METH_VARARGS, (char *)"ThreadInfo_current_thread_set(ThreadInfo self, int current_thread)"},
+	 { (char *)"ThreadInfo_current_thread_get", _wrap_ThreadInfo_current_thread_get, METH_VARARGS, (char *)"ThreadInfo_current_thread_get(ThreadInfo self) -> int"},
+	 { (char *)"ThreadInfo_n_batches_set", _wrap_ThreadInfo_n_batches_set, METH_VARARGS, (char *)"ThreadInfo_n_batches_set(ThreadInfo self, int n_batches)"},
+	 { (char *)"ThreadInfo_n_batches_get", _wrap_ThreadInfo_n_batches_get, METH_VARARGS, (char *)"ThreadInfo_n_batches_get(ThreadInfo self) -> int"},
+	 { (char *)"ThreadInfo_current_batch_set", _wrap_ThreadInfo_current_batch_set, METH_VARARGS, (char *)"ThreadInfo_current_batch_set(ThreadInfo self, int current_batch)"},
+	 { (char *)"ThreadInfo_current_batch_get", _wrap_ThreadInfo_current_batch_get, METH_VARARGS, (char *)"ThreadInfo_current_batch_get(ThreadInfo self) -> int"},
+	 { (char *)"delete_ThreadInfo", _wrap_delete_ThreadInfo, METH_VARARGS, (char *)"delete_ThreadInfo(ThreadInfo self)"},
+	 { (char *)"ThreadInfo_swigregister", ThreadInfo_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SampleBuilderFactoryTemp", _wrap_new_SampleBuilderFactoryTemp, METH_VARARGS, (char *)"\n"
+		"new_SampleBuilderFactoryTemp() -> SampleBuilderFactoryTemp\n"
+		"\n"
+		"IFactory< Key, AbstractProduct >::IFactory()\n"
+		"\n"
+		""},
+	 { (char *)"SampleBuilderFactoryTemp_createItem", _wrap_SampleBuilderFactoryTemp_createItem, METH_VARARGS, (char *)"\n"
+		"SampleBuilderFactoryTemp_createItem(SampleBuilderFactoryTemp self, std::string const & item_key) -> IMultiLayerBuilder\n"
+		"\n"
+		"AbstractProduct* IFactory< Key, AbstractProduct >::createItem(const Key &item_key)\n"
+		"\n"
+		"Creates object by calling creation function corresponded to given identifier. \n"
+		"\n"
+		""},
+	 { (char *)"SampleBuilderFactoryTemp_registerItem", _wrap_SampleBuilderFactoryTemp_registerItem, METH_VARARGS, (char *)"\n"
+		"registerItem(std::string const & item_key, IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback CreateFn, std::string const & itemDescription) -> bool\n"
+		"SampleBuilderFactoryTemp_registerItem(SampleBuilderFactoryTemp self, std::string const & item_key, IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback CreateFn) -> bool\n"
+		"\n"
+		"bool IFactory< Key, AbstractProduct >::registerItem(const Key &item_key, CreateItemCallback CreateFn, const std::string &itemDescription=\"\")\n"
+		"\n"
+		"Registers object's creation function and store object description. \n"
+		"\n"
+		""},
+	 { (char *)"delete_SampleBuilderFactoryTemp", _wrap_delete_SampleBuilderFactoryTemp, METH_VARARGS, (char *)"\n"
+		"delete_SampleBuilderFactoryTemp(SampleBuilderFactoryTemp self)\n"
+		"\n"
+		"IFactory< Key, AbstractProduct >::~IFactory()\n"
+		"\n"
+		""},
+	 { (char *)"SampleBuilderFactoryTemp_getNumberOfRegistered", _wrap_SampleBuilderFactoryTemp_getNumberOfRegistered, METH_VARARGS, (char *)"\n"
+		"SampleBuilderFactoryTemp_getNumberOfRegistered(SampleBuilderFactoryTemp self) -> size_t\n"
+		"\n"
+		"size_t IFactory< Key, AbstractProduct >::getNumberOfRegistered() const\n"
+		"\n"
+		"Returns number of registered objects. \n"
+		"\n"
+		""},
+	 { (char *)"SampleBuilderFactoryTemp_begin", _wrap_SampleBuilderFactoryTemp_begin, METH_VARARGS, (char *)"\n"
+		"SampleBuilderFactoryTemp_begin(SampleBuilderFactoryTemp self) -> IFactory< std::string,IMultiLayerBuilder >::const_iterator\n"
+		"\n"
+		"const_iterator IFactory< Key, AbstractProduct >::begin() const \n"
+		"\n"
+		""},
+	 { (char *)"SampleBuilderFactoryTemp_end", _wrap_SampleBuilderFactoryTemp_end, METH_VARARGS, (char *)"\n"
+		"SampleBuilderFactoryTemp_end(SampleBuilderFactoryTemp self) -> IFactory< std::string,IMultiLayerBuilder >::const_iterator\n"
+		"\n"
+		"const_iterator IFactory< Key, AbstractProduct >::end() const \n"
+		"\n"
+		""},
+	 { (char *)"SampleBuilderFactoryTemp_swigregister", SampleBuilderFactoryTemp_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SampleBuilderFactory", _wrap_new_SampleBuilderFactory, METH_VARARGS, (char *)"\n"
+		"new_SampleBuilderFactory() -> SampleBuilderFactory\n"
+		"\n"
+		"SampleBuilderFactory::SampleBuilderFactory()\n"
+		"\n"
+		""},
+	 { (char *)"SampleBuilderFactory_createSample", _wrap_SampleBuilderFactory_createSample, METH_VARARGS, (char *)"\n"
+		"SampleBuilderFactory_createSample(SampleBuilderFactory self, std::string const & name) -> MultiLayer\n"
+		"\n"
+		"MultiLayer * SampleBuilderFactory::createSample(const std::string &name)\n"
+		"\n"
+		"Retrieves a SampleBuilder from the registry, does the build, and returns the result. \n"
+		"\n"
+		""},
+	 { (char *)"delete_SampleBuilderFactory", _wrap_delete_SampleBuilderFactory, METH_VARARGS, (char *)"delete_SampleBuilderFactory(SampleBuilderFactory self)"},
+	 { (char *)"SampleBuilderFactory_swigregister", SampleBuilderFactory_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SimulationFactoryTemp", _wrap_new_SimulationFactoryTemp, METH_VARARGS, (char *)"\n"
+		"new_SimulationFactoryTemp() -> SimulationFactoryTemp\n"
+		"\n"
+		"IFactory< Key, AbstractProduct >::IFactory()\n"
+		"\n"
+		""},
+	 { (char *)"SimulationFactoryTemp_createItem", _wrap_SimulationFactoryTemp_createItem, METH_VARARGS, (char *)"\n"
+		"SimulationFactoryTemp_createItem(SimulationFactoryTemp self, std::string const & item_key) -> GISASSimulation\n"
+		"\n"
+		"AbstractProduct* IFactory< Key, AbstractProduct >::createItem(const Key &item_key)\n"
+		"\n"
+		"Creates object by calling creation function corresponded to given identifier. \n"
+		"\n"
+		""},
+	 { (char *)"SimulationFactoryTemp_registerItem", _wrap_SimulationFactoryTemp_registerItem, METH_VARARGS, (char *)"\n"
+		"registerItem(std::string const & item_key, IFactory< std::string,GISASSimulation >::CreateItemCallback CreateFn, std::string const & itemDescription) -> bool\n"
+		"SimulationFactoryTemp_registerItem(SimulationFactoryTemp self, std::string const & item_key, IFactory< std::string,GISASSimulation >::CreateItemCallback CreateFn) -> bool\n"
+		"\n"
+		"bool IFactory< Key, AbstractProduct >::registerItem(const Key &item_key, CreateItemCallback CreateFn, const std::string &itemDescription=\"\")\n"
+		"\n"
+		"Registers object's creation function and store object description. \n"
+		"\n"
+		""},
+	 { (char *)"delete_SimulationFactoryTemp", _wrap_delete_SimulationFactoryTemp, METH_VARARGS, (char *)"\n"
+		"delete_SimulationFactoryTemp(SimulationFactoryTemp self)\n"
+		"\n"
+		"IFactory< Key, AbstractProduct >::~IFactory()\n"
+		"\n"
+		""},
+	 { (char *)"SimulationFactoryTemp_getNumberOfRegistered", _wrap_SimulationFactoryTemp_getNumberOfRegistered, METH_VARARGS, (char *)"\n"
+		"SimulationFactoryTemp_getNumberOfRegistered(SimulationFactoryTemp self) -> size_t\n"
+		"\n"
+		"size_t IFactory< Key, AbstractProduct >::getNumberOfRegistered() const\n"
+		"\n"
+		"Returns number of registered objects. \n"
+		"\n"
+		""},
+	 { (char *)"SimulationFactoryTemp_begin", _wrap_SimulationFactoryTemp_begin, METH_VARARGS, (char *)"\n"
+		"SimulationFactoryTemp_begin(SimulationFactoryTemp self) -> IFactory< std::string,GISASSimulation >::const_iterator\n"
+		"\n"
+		"const_iterator IFactory< Key, AbstractProduct >::begin() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationFactoryTemp_end", _wrap_SimulationFactoryTemp_end, METH_VARARGS, (char *)"\n"
+		"SimulationFactoryTemp_end(SimulationFactoryTemp self) -> IFactory< std::string,GISASSimulation >::const_iterator\n"
+		"\n"
+		"const_iterator IFactory< Key, AbstractProduct >::end() const \n"
+		"\n"
+		""},
+	 { (char *)"SimulationFactoryTemp_swigregister", SimulationFactoryTemp_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_SimulationFactory", _wrap_new_SimulationFactory, METH_VARARGS, (char *)"\n"
+		"new_SimulationFactory() -> SimulationFactory\n"
+		"\n"
+		"SimulationFactory::SimulationFactory()\n"
+		"\n"
+		""},
+	 { (char *)"delete_SimulationFactory", _wrap_delete_SimulationFactory, METH_VARARGS, (char *)"delete_SimulationFactory(SimulationFactory self)"},
+	 { (char *)"SimulationFactory_swigregister", SimulationFactory_swigregister, METH_VARARGS, NULL},
+	 { NULL, NULL, 0, NULL }
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static void *_p_IsGISAXSDetectorTo_p_SphericalDetector(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((SphericalDetector *)  ((IsGISAXSDetector *) x));
+}
+static void *_p_Geometry__PolygonTo_p_Geometry__IShape2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Geometry::IShape2D *)  ((Geometry::Polygon *) x));
+}
+static void *_p_Geometry__VerticalLineTo_p_Geometry__IShape2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Geometry::IShape2D *)  ((Geometry::VerticalLine *) x));
+}
+static void *_p_Geometry__EllipseTo_p_Geometry__IShape2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Geometry::IShape2D *)  ((Geometry::Ellipse *) x));
+}
+static void *_p_Geometry__HorizontalLineTo_p_Geometry__IShape2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Geometry::IShape2D *)  ((Geometry::HorizontalLine *) x));
+}
+static void *_p_Geometry__RectangleTo_p_Geometry__IShape2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Geometry::IShape2D *)  ((Geometry::Rectangle *) x));
+}
+static void *_p_Geometry__LineTo_p_Geometry__IShape2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Geometry::IShape2D *)  ((Geometry::Line *) x));
+}
+static void *_p_FitParameterLinkedTo_p_FitParameter(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FitParameter *)  ((FitParameterLinked *) x));
+}
+static void *_p_FitParameterTo_p_IFitParameter(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFitParameter *)  ((FitParameter *) x));
+}
+static void *_p_FitParameterLinkedTo_p_IFitParameter(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFitParameter *) (FitParameter *) ((FitParameterLinked *) x));
+}
+static void *_p_GISASSimulationTo_p_Simulation(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Simulation *)  ((GISASSimulation *) x));
+}
+static void *_p_OffSpecSimulationTo_p_Simulation(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Simulation *)  ((OffSpecSimulation *) x));
+}
+static void *_p_ConstKBinAxisTo_p_VariableBinAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((VariableBinAxis *)  ((ConstKBinAxis *) x));
+}
+static void *_p_CustomBinAxisTo_p_VariableBinAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((VariableBinAxis *)  ((CustomBinAxis *) x));
+}
+static void *_p_FormFactorPrism3To_p_FormFactorPolygonalPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolygonalPrism *)  ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorPrism6To_p_FormFactorPolygonalPrism(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolygonalPrism *)  ((FormFactorPrism6 *) x));
+}
+static void *_p_SimulationFactoryTo_p_IFactoryT_std__string_GISASSimulation_t(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFactory< std::string,GISASSimulation > *)  ((SimulationFactory *) x));
+}
+static void *_p_FormFactorPrism6To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+}
+static void *_p_FormFactorHemiEllipsoidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorHemiEllipsoid *) x));
+}
+static void *_p_FormFactorPolygonalPrismTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorPolygonalPrism *) x));
+}
+static void *_p_FormFactorFullSpheroidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorFullSpheroid *) x));
+}
+static void *_p_FormFactorTruncatedSpheroidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorTruncatedSpheroid *) x));
+}
+static void *_p_FormFactorLongBoxGaussTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorLongBoxGauss *) x));
+}
+static void *_p_FormFactorRipple1To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorRipple1 *) x));
+}
+static void *_p_FormFactorPolygonalSurfaceTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorPolygonalSurface *) x));
+}
+static void *_p_FormFactorRipple2To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorRipple2 *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
+static void *_p_FormFactorFullSphereTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorFullSphere *) x));
+}
+static void *_p_FormFactorTruncatedSphereTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorTruncatedSphere *) x));
+}
+static void *_p_FormFactorLongRipple1GaussTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorLongRipple1Gauss *) x));
+}
+static void *_p_FormFactorCylinderTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorCylinder *) x));
+}
+static void *_p_FormFactorEllipsoidalCylinderTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorEllipsoidalCylinder *) x));
+}
+static void *_p_FormFactorBoxTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorBox *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorPolyhedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorPolyhedron *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorConeTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorCone *) x));
+}
+static void *_p_FormFactorCone6To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+}
+static void *_p_FormFactorSphereLogNormalRadiusTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorSphereLogNormalRadius *) x));
+}
+static void *_p_FormFactorSphereGaussianRadiusTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorSphereGaussianRadius *) x));
+}
+static void *_p_FormFactorTrivialTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorTrivial *) x));
+}
+static void *_p_FormFactorLorentzTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorLorentz *) x));
+}
+static void *_p_FormFactorLongRipple2LorentzTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorLongRipple2Lorentz *) x));
+}
+static void *_p_FormFactorLongRipple1LorentzTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorLongRipple1Lorentz *) x));
+}
+static void *_p_FormFactorLongBoxLorentzTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorLongBoxLorentz *) x));
+}
+static void *_p_FormFactorSphereUniformRadiusTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorSphereUniformRadius *) x));
+}
+static void *_p_FormFactorPyramidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorPrism3To_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *) (FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorLongRipple2GaussTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorLongRipple2Gauss *) x));
+}
+static void *_p_FormFactorGaussTo_p_IFormFactorBorn(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorBorn *)  ((FormFactorGauss *) x));
+}
+static void *_p_VariableBinAxisTo_p_IAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAxis *)  ((VariableBinAxis *) x));
+}
+static void *_p_ConstKBinAxisTo_p_IAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAxis *) (VariableBinAxis *) ((ConstKBinAxis *) x));
+}
+static void *_p_CustomBinAxisTo_p_IAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAxis *) (VariableBinAxis *) ((CustomBinAxis *) x));
+}
+static void *_p_FixedBinAxisTo_p_IAxis(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAxis *)  ((FixedBinAxis *) x));
+}
+static void *_p_ParticleLayoutTo_p_ILayout(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ILayout *)  ((ParticleLayout *) x));
+}
+static void *_p_FormFactorDecoratorDebyeWallerTo_p_IFormFactorDecorator(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactorDecorator *)  ((FormFactorDecoratorDebyeWaller *) x));
+}
+static void *_p_IFitObserverTo_p_IObserver(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IObserver *)  ((IFitObserver *) x));
+}
+static void *_p_RotationYTo_p_IRotation(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IRotation *)  ((RotationY *) x));
+}
+static void *_p_RotationEulerTo_p_IRotation(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IRotation *)  ((RotationEuler *) x));
+}
+static void *_p_RotationZTo_p_IRotation(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IRotation *)  ((RotationZ *) x));
+}
+static void *_p_RotationXTo_p_IRotation(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IRotation *)  ((RotationX *) x));
+}
+static void *_p_AdjustMinimizerStrategyTo_p_IFitStrategy(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFitStrategy *)  ((AdjustMinimizerStrategy *) x));
+}
+static void *_p_FitStrategyDefaultTo_p_IFitStrategy(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFitStrategy *)  ((FitStrategyDefault *) x));
+}
+static void *_p_SimpleSelectionRuleTo_p_ISelectionRule(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISelectionRule *)  ((SimpleSelectionRule *) x));
+}
+static void *_p_std__shared_ptrT_IFitObserver_tTo_p_std__shared_ptrT_IObserver_t(void *x, int *newmemory) {
+    *newmemory = SWIG_CAST_NEW_MEMORY;
+    return (void *) new std::shared_ptr< IObserver >(*(std::shared_ptr< IFitObserver > *)x);
+}
+static void *_p_FormFactorBoxTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+}
+static void *_p_FormFactorSphereLogNormalRadiusTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereLogNormalRadius *) x));
+}
+static void *_p_FormFactorSphereGaussianRadiusTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereGaussianRadius *) x));
+}
+static void *_p_MultiLayerTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *) ((MultiLayer *) x));
+}
+static void *_p_ParticleDistributionTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
+}
+static void *_p_IParameterT_double_tTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *)  ((IParameter< double > *) x));
+}
+static void *_p_InterferenceFunctionNoneTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IInterferenceFunction *) ((InterferenceFunctionNone *) x));
+}
+static void *_p_IDetector2DTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *) ((IDetector2D *) x));
+}
+static void *_p_Geometry__PolygonTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Geometry::IShape2D *) ((Geometry::Polygon *) x));
+}
+static void *_p_Geometry__EllipseTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Geometry::IShape2D *) ((Geometry::Ellipse *) x));
+}
+static void *_p_ILayoutTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *) ((ILayout *) x));
+}
+static void *_p_FormFactorHemiEllipsoidTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
+}
+static void *_p_ParticleLayoutTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
+}
+static void *_p_ChiSquaredModuleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(IChiSquaredModule *) ((ChiSquaredModule *) x));
+}
+static void *_p_IChiSquaredModuleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *) ((IChiSquaredModule *) x));
+}
+static void *_p_Geometry__HorizontalLineTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Geometry::IShape2D *) ((Geometry::HorizontalLine *) x));
+}
+static void *_p_IsGISAXSDetectorTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(IDetector2D *)(SphericalDetector *) ((IsGISAXSDetector *) x));
+}
+static void *_p_SphericalDetectorTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(IDetector2D *) ((SphericalDetector *) x));
+}
+static void *_p_RectangularDetectorTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(IDetector2D *) ((RectangularDetector *) x));
+}
+static void *_p_FormFactorPrism3To_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+}
+static void *_p_FormFactorPolyhedronTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorPrism6To_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+}
+static void *_p_GISASSimulationTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Simulation *) ((GISASSimulation *) x));
+}
+static void *_p_SimulationTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *) ((Simulation *) x));
+}
+static void *_p_OffSpecSimulationTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Simulation *) ((OffSpecSimulation *) x));
+}
+static void *_p_SpecularSimulationTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *) ((SpecularSimulation *) x));
+}
+static void *_p_ParticleCoreShellTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+}
+static void *_p_FormFactorTruncatedSphereTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
+}
+static void *_p_FormFactorFullSphereTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
+}
+static void *_p_IFormFactorTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *) ((IFormFactor *) x));
+}
+static void *_p_ICompositeSampleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *) ((ICompositeSample *) x));
+}
+static void *_p_ISampleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *) ((ISample *) x));
+}
+static void *_p_FormFactorPolygonalSurfaceTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
+static void *_p_FormFactorLongBoxGaussTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
+}
+static void *_p_FormFactorPolygonalPrismTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
+}
+static void *_p_FitSuiteObjectsTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *)  ((FitSuiteObjects *) x));
+}
+static void *_p_IRotationTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *) ((IRotation *) x));
+}
+static void *_p_RotationXTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IRotation *) ((RotationX *) x));
+}
+static void *_p_FormFactorTruncatedSpheroidTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
+}
+static void *_p_FormFactorFullSpheroidTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
+}
+static void *_p_Geometry__IShape2DTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *) ((Geometry::IShape2D *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
+static void *_p_RotationYTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IRotation *) ((RotationY *) x));
+}
+static void *_p_RotationZTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IRotation *) ((RotationZ *) x));
+}
+static void *_p_Geometry__RectangleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Geometry::IShape2D *) ((Geometry::Rectangle *) x));
+}
+static void *_p_FormFactorLongRipple2GaussTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
+}
+static void *_p_FormFactorGaussTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorGauss *) x));
+}
+static void *_p_Geometry__VerticalLineTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Geometry::IShape2D *) ((Geometry::VerticalLine *) x));
+}
+static void *_p_IDetectorResolutionTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *) ((IDetectorResolution *) x));
+}
+static void *_p_IFormFactorBornTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *) ((IFormFactorBorn *) x));
+}
+static void *_p_IClusteredParticlesTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *) ((IClusteredParticles *) x));
+}
+static void *_p_IParticleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
+}
+static void *_p_IAbstractParticleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
+}
+static void *_p_ParticleTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
+}
+static void *_p_FormFactorTrivialTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTrivial *) x));
+}
+static void *_p_FormFactorConeTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCone *) x));
+}
+static void *_p_LayerTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *) ((Layer *) x));
+}
+static void *_p_FormFactorRipple1To_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
+}
+static void *_p_FormFactorPyramidTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorDecoratorDebyeWallerTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorDecorator *) ((FormFactorDecoratorDebyeWaller *) x));
+}
+static void *_p_FormFactorRipple2To_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple2 *) x));
+}
+static void *_p_FormFactorCylinderTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCylinder *) x));
+}
+static void *_p_FormFactorEllipsoidalCylinderTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
+}
+static void *_p_ParticleCompositionTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+}
+static void *_p_FormFactorSphereUniformRadiusTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
+}
+static void *_p_IInterferenceFunctionTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *) ((IInterferenceFunction *) x));
+}
+static void *_p_FitObjectTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *)  ((FitObject *) x));
+}
+static void *_p_FormFactorCone6To_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+}
+static void *_p_FormFactorLongRipple1GaussTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Gauss *) x));
+}
+static void *_p_IFormFactorDecoratorTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *) ((IFormFactorDecorator *) x));
+}
+static void *_p_Geometry__LineTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(Geometry::IShape2D *) ((Geometry::Line *) x));
+}
+static void *_p_IRoughnessTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *) ((IRoughness *) x));
+}
+static void *_p_LayerRoughnessTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IRoughness *) ((LayerRoughness *) x));
+}
+static void *_p_InterferenceFunction2DParaCrystalTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
+}
+static void *_p_InterferenceFunctionRadialParaCrystalTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IInterferenceFunction *) ((InterferenceFunctionRadialParaCrystal *) x));
+}
+static void *_p_CrystalTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(IClusteredParticles *) ((Crystal *) x));
+}
+static void *_p_FormFactorCrystalTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *) ((FormFactorCrystal *) x));
+}
+static void *_p_MesoCrystalTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+}
+static void *_p_FormFactorWeightedTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *) ((FormFactorWeighted *) x));
+}
+static void *_p_RealParameterTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (IParameter< double > *) ((RealParameter *) x));
+}
+static void *_p_FormFactorLorentzTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLorentz *) x));
+}
+static void *_p_FormFactorLongRipple2LorentzTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Lorentz *) x));
+}
+static void *_p_FormFactorLongRipple1LorentzTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Lorentz *) x));
+}
+static void *_p_FormFactorLongBoxLorentzTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxLorentz *) x));
+}
+static void *_p_InterferenceFunction2DLatticeTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IInterferenceFunction *) ((InterferenceFunction2DLattice *) x));
+}
+static void *_p_InterferenceFunction1DLatticeTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IInterferenceFunction *) ((InterferenceFunction1DLattice *) x));
+}
+static void *_p_ICloneableTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *)  ((ICloneable *) x));
+}
+static void *_p_RotationEulerTo_p_INoncopyable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INoncopyable *) (ICloneable *)(ISample *)(IRotation *) ((RotationEuler *) x));
+}
+static void *_p_ChiSquaredModuleTo_p_IChiSquaredModule(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IChiSquaredModule *)  ((ChiSquaredModule *) x));
+}
+static void *_p_Histogram2DTo_p_IHistogram(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IHistogram *)  ((Histogram2D *) x));
+}
+static void *_p_Histogram1DTo_p_IHistogram(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IHistogram *)  ((Histogram1D *) x));
+}
+static void *_p_FitSuiteTo_p_IObservable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IObservable *)  ((FitSuite *) x));
+}
+static void *_p_FormFactorBoxTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+}
+static void *_p_FormFactorSphereLogNormalRadiusTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereLogNormalRadius *) x));
+}
+static void *_p_FormFactorSphereGaussianRadiusTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereGaussianRadius *) x));
+}
+static void *_p_MultiLayerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((MultiLayer *) x));
+}
+static void *_p_ParticleDistributionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
+}
+static void *_p_InterferenceFunctionNoneTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionNone *) x));
+}
+static void *_p_IDetector2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((IDetector2D *) x));
+}
+static void *_p_Geometry__PolygonTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Geometry::IShape2D *) ((Geometry::Polygon *) x));
+}
+static void *_p_Geometry__EllipseTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Geometry::IShape2D *) ((Geometry::Ellipse *) x));
+}
+static void *_p_ILayoutTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((ILayout *) x));
+}
+static void *_p_FormFactorHemiEllipsoidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
+}
+static void *_p_ParticleLayoutTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
+}
+static void *_p_ChiSquaredModuleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (IChiSquaredModule *) ((ChiSquaredModule *) x));
+}
+static void *_p_IChiSquaredModuleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((IChiSquaredModule *) x));
+}
+static void *_p_Geometry__HorizontalLineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Geometry::IShape2D *) ((Geometry::HorizontalLine *) x));
+}
+static void *_p_IsGISAXSDetectorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (IDetector2D *)(SphericalDetector *) ((IsGISAXSDetector *) x));
+}
+static void *_p_SphericalDetectorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (IDetector2D *) ((SphericalDetector *) x));
+}
+static void *_p_RectangularDetectorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (IDetector2D *) ((RectangularDetector *) x));
+}
+static void *_p_FormFactorPrism3To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+}
+static void *_p_FormFactorPolyhedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorPrism6To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+}
+static void *_p_GISASSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Simulation *) ((GISASSimulation *) x));
+}
+static void *_p_SimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((Simulation *) x));
+}
+static void *_p_OffSpecSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Simulation *) ((OffSpecSimulation *) x));
+}
+static void *_p_SpecularSimulationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((SpecularSimulation *) x));
+}
+static void *_p_ParticleCoreShellTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+}
+static void *_p_FormFactorTruncatedSphereTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
+}
+static void *_p_FormFactorFullSphereTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
+}
+static void *_p_IFormFactorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *) ((IFormFactor *) x));
+}
+static void *_p_ICompositeSampleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *) ((ICompositeSample *) x));
+}
+static void *_p_ISampleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((ISample *) x));
+}
+static void *_p_FormFactorPolygonalSurfaceTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
+static void *_p_FormFactorLongBoxGaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
+}
+static void *_p_FormFactorPolygonalPrismTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
+}
+static void *_p_IRotationTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *) ((IRotation *) x));
+}
+static void *_p_RotationXTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IRotation *) ((RotationX *) x));
+}
+static void *_p_FormFactorTruncatedSpheroidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
+}
+static void *_p_FormFactorFullSpheroidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
+}
+static void *_p_Geometry__IShape2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((Geometry::IShape2D *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
+static void *_p_RotationYTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IRotation *) ((RotationY *) x));
+}
+static void *_p_RotationZTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IRotation *) ((RotationZ *) x));
+}
+static void *_p_Geometry__RectangleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Geometry::IShape2D *) ((Geometry::Rectangle *) x));
+}
+static void *_p_FormFactorGaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorGauss *) x));
+}
+static void *_p_FormFactorLongRipple2GaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
+}
+static void *_p_Geometry__VerticalLineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Geometry::IShape2D *) ((Geometry::VerticalLine *) x));
+}
+static void *_p_IDetectorResolutionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((IDetectorResolution *) x));
+}
+static void *_p_IFormFactorBornTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((IFormFactorBorn *) x));
+}
+static void *_p_IClusteredParticlesTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((IClusteredParticles *) x));
+}
+static void *_p_IParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
+}
+static void *_p_IAbstractParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
+}
+static void *_p_ParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
+}
+static void *_p_FormFactorTrivialTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTrivial *) x));
+}
+static void *_p_FormFactorConeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCone *) x));
+}
+static void *_p_LayerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *) ((Layer *) x));
+}
+static void *_p_FormFactorRipple1To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
+}
+static void *_p_FormFactorPyramidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorDecoratorDebyeWallerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorDecorator *) ((FormFactorDecoratorDebyeWaller *) x));
+}
+static void *_p_FormFactorRipple2To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple2 *) x));
+}
+static void *_p_FormFactorCylinderTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCylinder *) x));
+}
+static void *_p_FormFactorEllipsoidalCylinderTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
+}
+static void *_p_ParticleCompositionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+}
+static void *_p_FormFactorSphereUniformRadiusTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
+}
+static void *_p_IInterferenceFunctionTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *) ((IInterferenceFunction *) x));
+}
+static void *_p_FormFactorCone6To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+}
+static void *_p_FormFactorLongRipple1GaussTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Gauss *) x));
+}
+static void *_p_IFormFactorDecoratorTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((IFormFactorDecorator *) x));
+}
+static void *_p_Geometry__LineTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Geometry::IShape2D *) ((Geometry::Line *) x));
+}
+static void *_p_LayerRoughnessTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IRoughness *) ((LayerRoughness *) x));
+}
+static void *_p_IRoughnessTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *) ((IRoughness *) x));
+}
+static void *_p_InterferenceFunction2DParaCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
+}
+static void *_p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionRadialParaCrystal *) x));
+}
+static void *_p_CrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IClusteredParticles *) ((Crystal *) x));
+}
+static void *_p_FormFactorCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((FormFactorCrystal *) x));
+}
+static void *_p_MesoCrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+}
+static void *_p_FormFactorWeightedTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *) ((FormFactorWeighted *) x));
+}
+static void *_p_FormFactorLorentzTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLorentz *) x));
+}
+static void *_p_FormFactorLongRipple2LorentzTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Lorentz *) x));
+}
+static void *_p_FormFactorLongBoxLorentzTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxLorentz *) x));
+}
+static void *_p_FormFactorLongRipple1LorentzTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Lorentz *) x));
+}
+static void *_p_InterferenceFunction2DLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction2DLattice *) x));
+}
+static void *_p_InterferenceFunction1DLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction1DLattice *) x));
+}
+static void *_p_RotationEulerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (ISample *)(IRotation *) ((RotationEuler *) x));
+}
+static void *_p_HomogeneousMaterialTo_p_IMaterial(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IMaterial *)  ((HomogeneousMaterial *) x));
+}
+static void *_p_HomogeneousMagneticMaterialTo_p_IMaterial(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IMaterial *) (HomogeneousMaterial *) ((HomogeneousMagneticMaterial *) x));
+}
+static void *_p_HomogeneousMagneticMaterialTo_p_HomogeneousMaterial(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((HomogeneousMaterial *)  ((HomogeneousMagneticMaterial *) x));
+}
+static void *_p_AngularPixelMapTo_p_IPixelMap(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IPixelMap *)  ((AngularPixelMap *) x));
+}
+static void *_p_RectPixelMapTo_p_IPixelMap(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IPixelMap *)  ((RectPixelMap *) x));
+}
+static void *_p_FormFactorBoxTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+}
+static void *_p_FormFactorSphereGaussianRadiusTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereGaussianRadius *) x));
+}
+static void *_p_FormFactorSphereLogNormalRadiusTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereLogNormalRadius *) x));
+}
+static void *_p_MultiLayerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((MultiLayer *) x));
+}
+static void *_p_ParameterDistributionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((ParameterDistribution *) x));
+}
+static void *_p_ParticleDistributionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
+}
+static void *_p_IParameterT_double_tTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *)  ((IParameter< double > *) x));
+}
+static void *_p_FTDistribution1DGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DGauss *) x));
+}
+static void *_p_FTDecayFunction1DGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction1D *) ((FTDecayFunction1DGauss *) x));
+}
+static void *_p_IDetector2DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IDetector2D *) x));
+}
+static void *_p_InterferenceFunctionNoneTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IInterferenceFunction *) ((InterferenceFunctionNone *) x));
+}
+static void *_p_Geometry__PolygonTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (Geometry::IShape2D *) ((Geometry::Polygon *) x));
+}
+static void *_p_Geometry__EllipseTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (Geometry::IShape2D *) ((Geometry::Ellipse *) x));
+}
+static void *_p_FormFactorHemiEllipsoidTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
+}
+static void *_p_ILayoutTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((ILayout *) x));
+}
+static void *_p_ParticleLayoutTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
+}
+static void *_p_IntensityScaleAndShiftNormalizerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IIntensityNormalizer *)(IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
+}
+static void *_p_IntensityNormalizerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IIntensityNormalizer *) ((IntensityNormalizer *) x));
+}
+static void *_p_IIntensityNormalizerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IIntensityNormalizer *) x));
+}
+static void *_p_Geometry__HorizontalLineTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (Geometry::IShape2D *) ((Geometry::HorizontalLine *) x));
+}
+static void *_p_SphericalDetectorTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDetector2D *) ((SphericalDetector *) x));
+}
+static void *_p_IsGISAXSDetectorTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDetector2D *)(SphericalDetector *) ((IsGISAXSDetector *) x));
+}
+static void *_p_RectangularDetectorTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDetector2D *) ((RectangularDetector *) x));
+}
+static void *_p_FormFactorPrism3To_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorPolyhedronTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+}
+static void *_p_FormFactorPrism6To_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+}
+static void *_p_SimulationTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((Simulation *) x));
+}
+static void *_p_GISASSimulationTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(Simulation *) ((GISASSimulation *) x));
+}
+static void *_p_OffSpecSimulationTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(Simulation *) ((OffSpecSimulation *) x));
+}
+static void *_p_SpecularSimulationTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((SpecularSimulation *) x));
+}
+static void *_p_FTDistribution2DConeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution2D *) ((FTDistribution2DCone *) x));
+}
+static void *_p_ParticleCoreShellTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+}
+static void *_p_FormFactorFullSphereTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
+}
+static void *_p_FormFactorTruncatedSphereTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
+}
+static void *_p_IFormFactorTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *) ((IFormFactor *) x));
+}
+static void *_p_ICompositeSampleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *) ((ICompositeSample *) x));
+}
+static void *_p_ISampleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((ISample *) x));
+}
+static void *_p_FormFactorPolygonalSurfaceTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
+static void *_p_FormFactorLongBoxGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
+}
+static void *_p_FormFactorPolygonalPrismTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
+}
+static void *_p_FitSuiteObjectsTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((FitSuiteObjects *) x));
+}
+static void *_p_FTDistribution2DGateTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution2D *) ((FTDistribution2DGate *) x));
+}
+static void *_p_DistributionLogNormalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDistribution1D *) ((DistributionLogNormal *) x));
+}
+static void *_p_InstrumentTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((Instrument *) x));
+}
+static void *_p_FTDistribution1DVoigtTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DVoigt *) x));
+}
+static void *_p_FTDecayFunction1DVoigtTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction1D *) ((FTDecayFunction1DVoigt *) x));
+}
+static void *_p_IRotationTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *) ((IRotation *) x));
+}
+static void *_p_FormFactorFullSpheroidTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
+}
+static void *_p_FormFactorTruncatedSpheroidTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
+}
+static void *_p_RotationXTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IRotation *) ((RotationX *) x));
+}
+static void *_p_Geometry__IShape2DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *)  ((Geometry::IShape2D *) x));
+}
+static void *_p_FTDistribution2DGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution2D *) ((FTDistribution2DGauss *) x));
+}
+static void *_p_FTDecayFunction2DGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction2D *) ((FTDecayFunction2DGauss *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
+static void *_p_RotationYTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IRotation *) ((RotationY *) x));
+}
+static void *_p_FitStrategyDefaultTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IFitStrategy *) ((FitStrategyDefault *) x));
+}
+static void *_p_RotationZTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IRotation *) ((RotationZ *) x));
+}
+static void *_p_Geometry__RectangleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (Geometry::IShape2D *) ((Geometry::Rectangle *) x));
+}
+static void *_p_FormFactorLongRipple2GaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
+}
+static void *_p_FormFactorGaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorGauss *) x));
+}
+static void *_p_Geometry__VerticalLineTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (Geometry::IShape2D *) ((Geometry::VerticalLine *) x));
+}
+static void *_p_IFormFactorBornTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *) ((IFormFactorBorn *) x));
+}
+static void *_p_IDetectorResolutionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IDetectorResolution *) x));
+}
+static void *_p_IClusteredParticlesTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((IClusteredParticles *) x));
+}
+static void *_p_IMultiLayerBuilderTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IMultiLayerBuilder *) x));
+}
+static void *_p_IAbstractParticleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
+}
+static void *_p_IParticleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
+}
+static void *_p_ParticleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
+}
+static void *_p_DistributionGateTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDistribution1D *) ((DistributionGate *) x));
+}
+static void *_p_IDistribution1DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IDistribution1D *) x));
+}
+static void *_p_IFTDecayFunction1DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IFTDecayFunction1D *) x));
+}
+static void *_p_IFTDistribution1DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IFTDistribution1D *) x));
+}
+static void *_p_FormFactorTrivialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTrivial *) x));
+}
+static void *_p_FormFactorConeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCone *) x));
+}
+static void *_p_LayerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *) ((Layer *) x));
+}
+static void *_p_FormFactorRipple1To_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
+}
+static void *_p_IMaterialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *)  ((IMaterial *) x));
+}
+static void *_p_HomogeneousMaterialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IMaterial *) ((HomogeneousMaterial *) x));
+}
+static void *_p_HomogeneousMagneticMaterialTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IMaterial *)(HomogeneousMaterial *) ((HomogeneousMagneticMaterial *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorDecoratorDebyeWallerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorDecorator *) ((FormFactorDecoratorDebyeWaller *) x));
+}
+static void *_p_FormFactorPyramidTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+}
+static void *_p_FormFactorRipple2To_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple2 *) x));
+}
+static void *_p_FormFactorEllipsoidalCylinderTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
+}
+static void *_p_FormFactorCylinderTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCylinder *) x));
+}
+static void *_p_DistributionGaussianTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDistribution1D *) ((DistributionGaussian *) x));
+}
+static void *_p_ResolutionFunction2DGaussianTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IResolutionFunction2D *) ((ResolutionFunction2DGaussian *) x));
+}
+static void *_p_BeamTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((Beam *) x));
+}
+static void *_p_ParticleCompositionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+}
+static void *_p_FormFactorSphereUniformRadiusTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
+}
+static void *_p_FTDistribution1DCosineTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DCosine *) x));
+}
+static void *_p_DistributionCosineTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDistribution1D *) ((DistributionCosine *) x));
+}
+static void *_p_FTDistribution1DGateTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DGate *) x));
+}
+static void *_p_FTDistribution2DVoigtTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution2D *) ((FTDistribution2DVoigt *) x));
+}
+static void *_p_FTDecayFunction2DVoigtTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction2D *) ((FTDecayFunction2DVoigt *) x));
+}
+static void *_p_FTDistribution2DCauchyTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution2D *) ((FTDistribution2DCauchy *) x));
+}
+static void *_p_FTDecayFunction1DCauchyTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction1D *) ((FTDecayFunction1DCauchy *) x));
+}
+static void *_p_FTDecayFunction2DCauchyTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction2D *) ((FTDecayFunction2DCauchy *) x));
+}
+static void *_p_FTDistribution1DCauchyTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DCauchy *) x));
+}
+static void *_p_IInterferenceFunctionTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *) ((IInterferenceFunction *) x));
+}
+static void *_p_FitObjectTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((FitObject *) x));
+}
+static void *_p_FormFactorCone6To_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+}
+static void *_p_FormFactorLongRipple1GaussTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Gauss *) x));
+}
+static void *_p_AdjustMinimizerStrategyTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IFitStrategy *) ((AdjustMinimizerStrategy *) x));
+}
+static void *_p_IFitStrategyTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *)  ((IFitStrategy *) x));
+}
+static void *_p_IFormFactorDecoratorTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *) ((IFormFactorDecorator *) x));
+}
+static void *_p_IParameterizedTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *)  ((IParameterized *) x));
+}
+static void *_p_Geometry__LineTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (Geometry::IShape2D *) ((Geometry::Line *) x));
+}
+static void *_p_IRoughnessTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *) ((IRoughness *) x));
+}
+static void *_p_LayerRoughnessTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IRoughness *) ((LayerRoughness *) x));
+}
+static void *_p_FormFactorCrystalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *) ((FormFactorCrystal *) x));
+}
+static void *_p_CrystalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IClusteredParticles *) ((Crystal *) x));
+}
+static void *_p_InterferenceFunctionRadialParaCrystalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IInterferenceFunction *) ((InterferenceFunctionRadialParaCrystal *) x));
+}
+static void *_p_InterferenceFunction2DParaCrystalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
+}
+static void *_p_MesoCrystalTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+}
+static void *_p_IFTDistribution2DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IFTDistribution2D *) x));
+}
+static void *_p_IFTDecayFunction2DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IFTDecayFunction2D *) x));
+}
+static void *_p_IResolutionFunction2DTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *) ((IResolutionFunction2D *) x));
+}
+static void *_p_FormFactorWeightedTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *) ((FormFactorWeighted *) x));
+}
+static void *_p_RealParameterTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameter< double > *) ((RealParameter *) x));
+}
+static void *_p_FormFactorLorentzTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLorentz *) x));
+}
+static void *_p_FormFactorLongRipple2LorentzTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Lorentz *) x));
+}
+static void *_p_FormFactorLongRipple1LorentzTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Lorentz *) x));
+}
+static void *_p_FormFactorLongBoxLorentzTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxLorentz *) x));
+}
+static void *_p_DistributionLorentzTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IDistribution1D *) ((DistributionLorentz *) x));
+}
+static void *_p_InterferenceFunction1DLatticeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IInterferenceFunction *) ((InterferenceFunction1DLattice *) x));
+}
+static void *_p_InterferenceFunction2DLatticeTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IInterferenceFunction *) ((InterferenceFunction2DLattice *) x));
+}
+static void *_p_FTDistribution1DTriangleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDistribution1D *) ((FTDistribution1DTriangle *) x));
+}
+static void *_p_FTDecayFunction1DTriangleTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(IFTDecayFunction1D *) ((FTDecayFunction1DTriangle *) x));
+}
+static void *_p_RotationEulerTo_p_INamed(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INamed *) (IParameterized *)(ISample *)(IRotation *) ((RotationEuler *) x));
+}
+static void *_p_InterferenceFunction1DLatticeTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunction1DLattice *) x));
+}
+static void *_p_InterferenceFunction2DLatticeTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunction2DLattice *) x));
+}
+static void *_p_InterferenceFunctionNoneTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunctionNone *) x));
+}
+static void *_p_InterferenceFunctionRadialParaCrystalTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunctionRadialParaCrystal *) x));
+}
+static void *_p_InterferenceFunction2DParaCrystalTo_p_IInterferenceFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IInterferenceFunction *)  ((InterferenceFunction2DParaCrystal *) x));
+}
+static void *_p_SquaredFunctionGaussianErrorTo_p_ISquaredFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISquaredFunction *)  ((SquaredFunctionGaussianError *) x));
+}
+static void *_p_SquaredFunctionMeanSquaredErrorTo_p_ISquaredFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISquaredFunction *)  ((SquaredFunctionMeanSquaredError *) x));
+}
+static void *_p_SquaredFunctionDefaultTo_p_ISquaredFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISquaredFunction *)  ((SquaredFunctionDefault *) x));
+}
+static void *_p_SquaredFunctionSimErrorTo_p_ISquaredFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISquaredFunction *)  ((SquaredFunctionSimError *) x));
+}
+static void *_p_SquaredFunctionSystematicErrorTo_p_ISquaredFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISquaredFunction *)  ((SquaredFunctionSystematicError *) x));
+}
+static void *_p_IntensityFunctionSqrtTo_p_IIntensityFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IIntensityFunction *)  ((IntensityFunctionSqrt *) x));
+}
+static void *_p_IntensityFunctionLogTo_p_IIntensityFunction(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IIntensityFunction *)  ((IntensityFunctionLog *) x));
+}
+static void *_p_IntensityScaleAndShiftNormalizerTo_p_IntensityNormalizer(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IntensityNormalizer *)  ((IntensityScaleAndShiftNormalizer *) x));
+}
+static void *_p_IntensityNormalizerTo_p_IIntensityNormalizer(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IIntensityNormalizer *)  ((IntensityNormalizer *) x));
+}
+static void *_p_IntensityScaleAndShiftNormalizerTo_p_IIntensityNormalizer(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IIntensityNormalizer *) (IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
+}
+static void *_p_FormFactorBoxTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+}
+static void *_p_FormFactorSphereLogNormalRadiusTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereLogNormalRadius *) x));
+}
+static void *_p_FormFactorSphereGaussianRadiusTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereGaussianRadius *) x));
+}
+static void *_p_MultiLayerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((MultiLayer *) x));
+}
+static void *_p_ParameterDistributionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((ParameterDistribution *) x));
+}
+static void *_p_ParticleDistributionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
+}
+static void *_p_FTDecayFunction1DGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDecayFunction1D *) ((FTDecayFunction1DGauss *) x));
+}
+static void *_p_FTDistribution1DGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution1D *) ((FTDistribution1DGauss *) x));
+}
+static void *_p_IDetector2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IDetector2D *) x));
+}
+static void *_p_InterferenceFunctionNoneTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionNone *) x));
+}
+static void *_p_FormFactorHemiEllipsoidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
+}
+static void *_p_ILayoutTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((ILayout *) x));
+}
+static void *_p_ParticleLayoutTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
+}
+static void *_p_IntensityScaleAndShiftNormalizerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IIntensityNormalizer *)(IntensityNormalizer *) ((IntensityScaleAndShiftNormalizer *) x));
+}
+static void *_p_IntensityNormalizerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IIntensityNormalizer *) ((IntensityNormalizer *) x));
+}
+static void *_p_IIntensityNormalizerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IIntensityNormalizer *) x));
+}
+static void *_p_SphericalDetectorTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDetector2D *) ((SphericalDetector *) x));
+}
+static void *_p_IsGISAXSDetectorTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDetector2D *)(SphericalDetector *) ((IsGISAXSDetector *) x));
+}
+static void *_p_RectangularDetectorTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDetector2D *) ((RectangularDetector *) x));
+}
+static void *_p_FormFactorPrism3To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorPolyhedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+}
+static void *_p_FormFactorPrism6To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+}
+static void *_p_SimulationTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((Simulation *) x));
+}
+static void *_p_GISASSimulationTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (Simulation *) ((GISASSimulation *) x));
+}
+static void *_p_OffSpecSimulationTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (Simulation *) ((OffSpecSimulation *) x));
+}
+static void *_p_SpecularSimulationTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((SpecularSimulation *) x));
+}
+static void *_p_FTDistribution2DConeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution2D *) ((FTDistribution2DCone *) x));
+}
+static void *_p_ParticleCoreShellTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+}
+static void *_p_FormFactorFullSphereTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
+}
+static void *_p_FormFactorTruncatedSphereTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
+}
+static void *_p_IFormFactorTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *) ((IFormFactor *) x));
+}
+static void *_p_ICompositeSampleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *) ((ICompositeSample *) x));
+}
+static void *_p_ISampleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((ISample *) x));
+}
+static void *_p_FormFactorPolygonalSurfaceTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
+static void *_p_FormFactorLongBoxGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
+}
+static void *_p_FormFactorPolygonalPrismTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
+}
+static void *_p_FitSuiteObjectsTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((FitSuiteObjects *) x));
+}
+static void *_p_FTDistribution2DGateTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution2D *) ((FTDistribution2DGate *) x));
+}
+static void *_p_DistributionLogNormalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDistribution1D *) ((DistributionLogNormal *) x));
+}
+static void *_p_InstrumentTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((Instrument *) x));
+}
+static void *_p_FTDecayFunction1DVoigtTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDecayFunction1D *) ((FTDecayFunction1DVoigt *) x));
+}
+static void *_p_FTDistribution1DVoigtTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution1D *) ((FTDistribution1DVoigt *) x));
+}
+static void *_p_IRotationTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *) ((IRotation *) x));
+}
+static void *_p_FormFactorFullSpheroidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
+}
+static void *_p_FormFactorTruncatedSpheroidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
+}
+static void *_p_RotationXTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IRotation *) ((RotationX *) x));
+}
+static void *_p_FTDistribution2DGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution2D *) ((FTDistribution2DGauss *) x));
+}
+static void *_p_FTDecayFunction2DGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDecayFunction2D *) ((FTDecayFunction2DGauss *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
+static void *_p_RotationYTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IRotation *) ((RotationY *) x));
+}
+static void *_p_RotationZTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IRotation *) ((RotationZ *) x));
+}
+static void *_p_FormFactorLongRipple2GaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
+}
+static void *_p_FormFactorGaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorGauss *) x));
+}
+static void *_p_IFormFactorBornTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *) ((IFormFactorBorn *) x));
+}
+static void *_p_IDetectorResolutionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IDetectorResolution *) x));
+}
+static void *_p_IClusteredParticlesTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((IClusteredParticles *) x));
+}
+static void *_p_IMultiLayerBuilderTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IMultiLayerBuilder *) x));
+}
+static void *_p_IAbstractParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((IAbstractParticle *) x));
+}
+static void *_p_IParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
+}
+static void *_p_ParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
+}
+static void *_p_DistributionGateTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDistribution1D *) ((DistributionGate *) x));
+}
+static void *_p_IDistribution1DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IDistribution1D *) x));
+}
+static void *_p_IFTDecayFunction1DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IFTDecayFunction1D *) x));
+}
+static void *_p_IFTDistribution1DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IFTDistribution1D *) x));
+}
+static void *_p_FormFactorTrivialTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorTrivial *) x));
+}
+static void *_p_FormFactorConeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCone *) x));
+}
+static void *_p_LayerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *) ((Layer *) x));
+}
+static void *_p_FormFactorRipple1To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
+}
+static void *_p_FormFactorPyramidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorDecoratorDebyeWallerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorDecorator *) ((FormFactorDecoratorDebyeWaller *) x));
+}
+static void *_p_FormFactorRipple2To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple2 *) x));
+}
+static void *_p_FormFactorEllipsoidalCylinderTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
+}
+static void *_p_FormFactorCylinderTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorCylinder *) x));
+}
+static void *_p_DistributionGaussianTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDistribution1D *) ((DistributionGaussian *) x));
+}
+static void *_p_ResolutionFunction2DGaussianTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IResolutionFunction2D *) ((ResolutionFunction2DGaussian *) x));
+}
+static void *_p_BeamTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((Beam *) x));
+}
+static void *_p_ParticleCompositionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+}
+static void *_p_FormFactorSphereUniformRadiusTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
+}
+static void *_p_DistributionCosineTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDistribution1D *) ((DistributionCosine *) x));
+}
+static void *_p_FTDistribution1DCosineTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution1D *) ((FTDistribution1DCosine *) x));
+}
+static void *_p_FTDistribution1DGateTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution1D *) ((FTDistribution1DGate *) x));
+}
+static void *_p_FTDistribution2DVoigtTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution2D *) ((FTDistribution2DVoigt *) x));
+}
+static void *_p_FTDecayFunction2DVoigtTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDecayFunction2D *) ((FTDecayFunction2DVoigt *) x));
+}
+static void *_p_FTDistribution2DCauchyTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution2D *) ((FTDistribution2DCauchy *) x));
+}
+static void *_p_FTDecayFunction1DCauchyTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDecayFunction1D *) ((FTDecayFunction1DCauchy *) x));
+}
+static void *_p_FTDecayFunction2DCauchyTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDecayFunction2D *) ((FTDecayFunction2DCauchy *) x));
+}
+static void *_p_FTDistribution1DCauchyTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution1D *) ((FTDistribution1DCauchy *) x));
+}
+static void *_p_IInterferenceFunctionTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *) ((IInterferenceFunction *) x));
+}
+static void *_p_FitObjectTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((FitObject *) x));
+}
+static void *_p_FormFactorCone6To_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+}
+static void *_p_FormFactorLongRipple1GaussTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Gauss *) x));
+}
+static void *_p_IFormFactorDecoratorTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *) ((IFormFactorDecorator *) x));
+}
+static void *_p_IRoughnessTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *) ((IRoughness *) x));
+}
+static void *_p_LayerRoughnessTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IRoughness *) ((LayerRoughness *) x));
+}
+static void *_p_FormFactorCrystalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *) ((FormFactorCrystal *) x));
+}
+static void *_p_CrystalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IClusteredParticles *) ((Crystal *) x));
+}
+static void *_p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IInterferenceFunction *) ((InterferenceFunctionRadialParaCrystal *) x));
+}
+static void *_p_InterferenceFunction2DParaCrystalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
+}
+static void *_p_MesoCrystalTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+}
+static void *_p_IFTDecayFunction2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IFTDecayFunction2D *) x));
+}
+static void *_p_IFTDistribution2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IFTDistribution2D *) x));
+}
+static void *_p_IResolutionFunction2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *)  ((IResolutionFunction2D *) x));
+}
+static void *_p_FormFactorWeightedTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *) ((FormFactorWeighted *) x));
+}
+static void *_p_FormFactorLorentzTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLorentz *) x));
+}
+static void *_p_FormFactorLongRipple2LorentzTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Lorentz *) x));
+}
+static void *_p_FormFactorLongRipple1LorentzTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Lorentz *) x));
+}
+static void *_p_FormFactorLongBoxLorentzTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxLorentz *) x));
+}
+static void *_p_DistributionLorentzTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IDistribution1D *) ((DistributionLorentz *) x));
+}
+static void *_p_InterferenceFunction1DLatticeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction1DLattice *) x));
+}
+static void *_p_InterferenceFunction2DLatticeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IInterferenceFunction *) ((InterferenceFunction2DLattice *) x));
+}
+static void *_p_FTDecayFunction1DTriangleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDecayFunction1D *) ((FTDecayFunction1DTriangle *) x));
+}
+static void *_p_FTDistribution1DTriangleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (IFTDistribution1D *) ((FTDistribution1DTriangle *) x));
+}
+static void *_p_RotationEulerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (ISample *)(IRotation *) ((RotationEuler *) x));
+}
+static void *_p_FormFactorPrism6To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+}
+static void *_p_FormFactorHemiEllipsoidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
+}
+static void *_p_FormFactorPolygonalPrismTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
+}
+static void *_p_FormFactorFullSpheroidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
+}
+static void *_p_FormFactorTruncatedSpheroidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
+}
+static void *_p_FormFactorLongBoxGaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
+}
+static void *_p_FormFactorRipple1To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorRipple1 *) x));
+}
+static void *_p_FormFactorPolygonalSurfaceTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
+static void *_p_FormFactorCrystalTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *)  ((FormFactorCrystal *) x));
+}
+static void *_p_FormFactorRipple2To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorRipple2 *) x));
+}
+static void *_p_FormFactorFullSphereTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorFullSphere *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
+static void *_p_FormFactorTruncatedSphereTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
+}
+static void *_p_FormFactorLongRipple1GaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongRipple1Gauss *) x));
+}
+static void *_p_FormFactorEllipsoidalCylinderTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
+}
+static void *_p_FormFactorCylinderTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCylinder *) x));
+}
+static void *_p_FormFactorBoxTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorBox *) x));
+}
+static void *_p_IFormFactorDecoratorTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *)  ((IFormFactorDecorator *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorPolyhedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+}
+static void *_p_FormFactorConeTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorCone *) x));
+}
+static void *_p_FormFactorCone6To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+}
+static void *_p_FormFactorSphereLogNormalRadiusTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorSphereLogNormalRadius *) x));
+}
+static void *_p_FormFactorSphereGaussianRadiusTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorSphereGaussianRadius *) x));
+}
+static void *_p_IFormFactorBornTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *)  ((IFormFactorBorn *) x));
+}
+static void *_p_FormFactorDecoratorDebyeWallerTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorDecorator *) ((FormFactorDecoratorDebyeWaller *) x));
+}
+static void *_p_FormFactorTrivialTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorTrivial *) x));
+}
+static void *_p_FormFactorLorentzTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLorentz *) x));
+}
+static void *_p_FormFactorLongRipple2LorentzTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongRipple2Lorentz *) x));
+}
+static void *_p_FormFactorLongRipple1LorentzTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongRipple1Lorentz *) x));
+}
+static void *_p_FormFactorLongBoxLorentzTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongBoxLorentz *) x));
+}
+static void *_p_FormFactorWeightedTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *)  ((FormFactorWeighted *) x));
+}
+static void *_p_FormFactorPyramidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorPrism3To_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorSphereUniformRadiusTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
+}
+static void *_p_FormFactorLongRipple2GaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
+}
+static void *_p_FormFactorGaussTo_p_IFormFactor(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFormFactor *) (IFormFactorBorn *) ((FormFactorGauss *) x));
+}
+static void *_p_SampleBuilderFactoryTo_p_IFactoryT_std__string_IMultiLayerBuilder_t(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFactory< std::string,IMultiLayerBuilder > *)  ((SampleBuilderFactory *) x));
+}
+static void *_p_FormFactorPrism6To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism6 *) x));
+}
+static void *_p_FormFactorHemiEllipsoidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorHemiEllipsoid *) x));
+}
+static void *_p_FormFactorPolygonalPrismTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalPrism *) x));
+}
+static void *_p_IFormFactorTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *)  ((IFormFactor *) x));
+}
+static void *_p_FormFactorFullSpheroidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSpheroid *) x));
+}
+static void *_p_FormFactorTruncatedSpheroidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSpheroid *) x));
+}
+static void *_p_RotationXTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IRotation *) ((RotationX *) x));
+}
+static void *_p_RotationYTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IRotation *) ((RotationY *) x));
+}
+static void *_p_RotationZTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IRotation *) ((RotationZ *) x));
+}
+static void *_p_FormFactorLongBoxGaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxGauss *) x));
+}
+static void *_p_RotationEulerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IRotation *) ((RotationEuler *) x));
+}
+static void *_p_ParticleCoreShellTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+}
+static void *_p_LayerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *) ((Layer *) x));
+}
+static void *_p_FormFactorPolygonalSurfaceTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolygonalSurface *) x));
+}
+static void *_p_CrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(IClusteredParticles *) ((Crystal *) x));
+}
+static void *_p_FormFactorCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *) ((FormFactorCrystal *) x));
+}
+static void *_p_FormFactorRipple1To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple1 *) x));
+}
+static void *_p_InterferenceFunctionRadialParaCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunctionRadialParaCrystal *) x));
+}
+static void *_p_InterferenceFunction2DParaCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunction2DParaCrystal *) x));
+}
+static void *_p_MesoCrystalTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+}
+static void *_p_FormFactorRipple2To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorRipple2 *) x));
+}
+static void *_p_IRotationTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *)  ((IRotation *) x));
+}
+static void *_p_FormFactorFullSphereTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorFullSphere *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTruncatedCube *) x));
+}
+static void *_p_FormFactorTruncatedSphereTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorTruncatedSphere *) x));
+}
+static void *_p_FormFactorLongRipple1GaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Gauss *) x));
+}
+static void *_p_MultiLayerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *) ((MultiLayer *) x));
+}
+static void *_p_ParticleDistributionTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *) ((ParticleDistribution *) x));
+}
+static void *_p_IAbstractParticleTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *) ((IAbstractParticle *) x));
+}
+static void *_p_IParticleTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *) ((IParticle *) x));
+}
+static void *_p_ParticleTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((Particle *) x));
+}
+static void *_p_FormFactorEllipsoidalCylinderTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorEllipsoidalCylinder *) x));
+}
+static void *_p_FormFactorCylinderTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorCylinder *) x));
+}
+static void *_p_FormFactorBoxTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorBox *) x));
+}
+static void *_p_IFormFactorDecoratorTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *) ((IFormFactorDecorator *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorPolyhedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorPolyhedron *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorTetrahedron *) x));
+}
+static void *_p_InterferenceFunctionNoneTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunctionNone *) x));
+}
+static void *_p_FormFactorConeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorCone *) x));
+}
+static void *_p_FormFactorCone6To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorCone6 *) x));
+}
+static void *_p_ICompositeSampleTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *)  ((ICompositeSample *) x));
+}
+static void *_p_FormFactorSphereGaussianRadiusTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereGaussianRadius *) x));
+}
+static void *_p_FormFactorSphereLogNormalRadiusTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereLogNormalRadius *) x));
+}
+static void *_p_IFormFactorBornTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *) ((IFormFactorBorn *) x));
+}
+static void *_p_InterferenceFunction1DLatticeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunction1DLattice *) x));
+}
+static void *_p_InterferenceFunction2DLatticeTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IInterferenceFunction *) ((InterferenceFunction2DLattice *) x));
+}
+static void *_p_IClusteredParticlesTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *) ((IClusteredParticles *) x));
+}
+static void *_p_IRoughnessTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *)  ((IRoughness *) x));
+}
+static void *_p_LayerRoughnessTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IRoughness *) ((LayerRoughness *) x));
+}
+static void *_p_FormFactorDecoratorDebyeWallerTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorDecorator *) ((FormFactorDecoratorDebyeWaller *) x));
+}
+static void *_p_FormFactorTrivialTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorTrivial *) x));
+}
+static void *_p_FormFactorLorentzTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLorentz *) x));
+}
+static void *_p_FormFactorLongRipple2LorentzTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Lorentz *) x));
+}
+static void *_p_FormFactorLongRipple1LorentzTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple1Lorentz *) x));
+}
+static void *_p_FormFactorLongBoxLorentzTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongBoxLorentz *) x));
+}
+static void *_p_FormFactorWeightedTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *) ((FormFactorWeighted *) x));
+}
+static void *_p_ILayoutTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *) ((ILayout *) x));
+}
+static void *_p_ParticleLayoutTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(ILayout *) ((ParticleLayout *) x));
+}
+static void *_p_IInterferenceFunctionTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *)  ((IInterferenceFunction *) x));
+}
+static void *_p_FormFactorPyramidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorPyramid *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolyhedron *) ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorPrism3To_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *)(FormFactorPolygonalPrism *) ((FormFactorPrism3 *) x));
+}
+static void *_p_FormFactorSphereUniformRadiusTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorSphereUniformRadius *) x));
+}
+static void *_p_ParticleCompositionTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (ICompositeSample *)(IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+}
+static void *_p_FormFactorLongRipple2GaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorLongRipple2Gauss *) x));
+}
+static void *_p_FormFactorGaussTo_p_ISample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISample *) (IFormFactor *)(IFormFactorBorn *) ((FormFactorGauss *) x));
+}
+static void *_p_IClusteredParticlesTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *)  ((IClusteredParticles *) x));
+}
+static void *_p_ParticleCompositionTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((ParticleComposition *) x));
+}
+static void *_p_ParticleDistributionTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (IAbstractParticle *) ((ParticleDistribution *) x));
+}
+static void *_p_ILayoutTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *)  ((ILayout *) x));
+}
+static void *_p_ParticleLayoutTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (ILayout *) ((ParticleLayout *) x));
+}
+static void *_p_MultiLayerTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *)  ((MultiLayer *) x));
+}
+static void *_p_CrystalTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (IClusteredParticles *) ((Crystal *) x));
+}
+static void *_p_MesoCrystalTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((MesoCrystal *) x));
+}
+static void *_p_IAbstractParticleTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *)  ((IAbstractParticle *) x));
+}
+static void *_p_IParticleTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (IAbstractParticle *) ((IParticle *) x));
+}
+static void *_p_LayerTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *)  ((Layer *) x));
+}
+static void *_p_ParticleTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((Particle *) x));
+}
+static void *_p_ParticleCoreShellTo_p_ICompositeSample(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICompositeSample *) (IAbstractParticle *)(IParticle *) ((ParticleCoreShell *) x));
+}
+static void *_p_ParticleCompositionTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((ParticleComposition *) x));
+}
+static void *_p_MesoCrystalTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((MesoCrystal *) x));
+}
+static void *_p_ParticleTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((Particle *) x));
+}
+static void *_p_ParticleCoreShellTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParticle *)  ((ParticleCoreShell *) x));
+}
+static void *_p_ParticleCompositionTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAbstractParticle *) (IParticle *) ((ParticleComposition *) x));
+}
+static void *_p_ParticleDistributionTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAbstractParticle *)  ((ParticleDistribution *) x));
+}
+static void *_p_MesoCrystalTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAbstractParticle *) (IParticle *) ((MesoCrystal *) x));
+}
+static void *_p_IParticleTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAbstractParticle *)  ((IParticle *) x));
+}
+static void *_p_ParticleTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAbstractParticle *) (IParticle *) ((Particle *) x));
+}
+static void *_p_ParticleCoreShellTo_p_IAbstractParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IAbstractParticle *) (IParticle *) ((ParticleCoreShell *) x));
+}
+static void *_p_RealParameterTo_p_IParameterT_double_t(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameter< double > *)  ((RealParameter *) x));
+}
+static void *_p_LayerRoughnessTo_p_IRoughness(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IRoughness *)  ((LayerRoughness *) x));
+}
+static void *_p_SphericalDetectorTo_p_IDetector2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDetector2D *)  ((SphericalDetector *) x));
+}
+static void *_p_IsGISAXSDetectorTo_p_IDetector2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDetector2D *) (SphericalDetector *) ((IsGISAXSDetector *) x));
+}
+static void *_p_RectangularDetectorTo_p_IDetector2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDetector2D *)  ((RectangularDetector *) x));
+}
+static void *_p_FTDistribution1DCauchyTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DCauchy *) x));
+}
+static void *_p_FTDistribution1DCosineTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DCosine *) x));
+}
+static void *_p_FTDistribution1DGaussTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DGauss *) x));
+}
+static void *_p_FTDistribution1DGateTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DGate *) x));
+}
+static void *_p_FTDistribution1DTriangleTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DTriangle *) x));
+}
+static void *_p_FTDistribution1DVoigtTo_p_IFTDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution1D *)  ((FTDistribution1DVoigt *) x));
+}
+static void *_p_FTDecayFunction1DCauchyTo_p_IFTDecayFunction1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction1D *)  ((FTDecayFunction1DCauchy *) x));
+}
+static void *_p_FTDecayFunction1DGaussTo_p_IFTDecayFunction1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction1D *)  ((FTDecayFunction1DGauss *) x));
+}
+static void *_p_FTDecayFunction1DTriangleTo_p_IFTDecayFunction1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction1D *)  ((FTDecayFunction1DTriangle *) x));
+}
+static void *_p_FTDecayFunction1DVoigtTo_p_IFTDecayFunction1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction1D *)  ((FTDecayFunction1DVoigt *) x));
+}
+static void *_p_DistributionCosineTo_p_IDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDistribution1D *)  ((DistributionCosine *) x));
+}
+static void *_p_DistributionLorentzTo_p_IDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDistribution1D *)  ((DistributionLorentz *) x));
+}
+static void *_p_DistributionGaussianTo_p_IDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDistribution1D *)  ((DistributionGaussian *) x));
+}
+static void *_p_DistributionGateTo_p_IDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDistribution1D *)  ((DistributionGate *) x));
+}
+static void *_p_DistributionLogNormalTo_p_IDistribution1D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IDistribution1D *)  ((DistributionLogNormal *) x));
+}
+static void *_p_CrystalTo_p_IClusteredParticles(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IClusteredParticles *)  ((Crystal *) x));
+}
+static void *_p_FormFactorCuboctahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorCuboctahedron *) x));
+}
+static void *_p_FormFactorDodecahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorDodecahedron *) x));
+}
+static void *_p_FormFactorIcosahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorIcosahedron *) x));
+}
+static void *_p_FormFactorTetrahedronTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorTetrahedron *) x));
+}
+static void *_p_FormFactorCone6To_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorCone6 *) x));
+}
+static void *_p_FormFactorTruncatedCubeTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorTruncatedCube *) x));
+}
+static void *_p_FormFactorAnisoPyramidTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorAnisoPyramid *) x));
+}
+static void *_p_FormFactorPyramidTo_p_FormFactorPolyhedron(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((FormFactorPolyhedron *)  ((FormFactorPyramid *) x));
+}
+static void *_p_FTDistribution2DCauchyTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution2D *)  ((FTDistribution2DCauchy *) x));
+}
+static void *_p_FTDistribution2DGaussTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution2D *)  ((FTDistribution2DGauss *) x));
+}
+static void *_p_FTDistribution2DVoigtTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution2D *)  ((FTDistribution2DVoigt *) x));
+}
+static void *_p_FTDistribution2DGateTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution2D *)  ((FTDistribution2DGate *) x));
+}
+static void *_p_FTDistribution2DConeTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDistribution2D *)  ((FTDistribution2DCone *) x));
+}
+static void *_p_FTDecayFunction2DCauchyTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DCauchy *) x));
+}
+static void *_p_FTDecayFunction2DGaussTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DGauss *) x));
+}
+static void *_p_FTDecayFunction2DVoigtTo_p_IFTDecayFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFTDecayFunction2D *)  ((FTDecayFunction2DVoigt *) x));
+}
+static void *_p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IResolutionFunction2D *)  ((ResolutionFunction2DGaussian *) x));
+}
+static swig_type_info _swigt__p_AdjustMinimizerStrategy = {"_p_AdjustMinimizerStrategy", "AdjustMinimizerStrategy *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_AngularPixelMap = {"_p_AngularPixelMap", "AngularPixelMap *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_AttLimits = {"_p_AttLimits", "AttLimits *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Attributes = {"_p_Attributes", "Attributes *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_BasicVector3DT_double_t = {"_p_BasicVector3DT_double_t", "std::vector< BasicVector3D< double > >::value_type *|kvector_t *|BasicVector3D< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_BasicVector3DT_int_t = {"_p_BasicVector3DT_int_t", "ivector_t *|BasicVector3D< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_BasicVector3DT_std__complexT_double_t_t = {"_p_BasicVector3DT_std__complexT_double_t_t", "BasicVector3D< std::complex< double > > *|std::vector< BasicVector3D< std::complex< double > > >::value_type *|cvector_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Beam = {"_p_Beam", "Beam *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Bin1D = {"_p_Bin1D", "Bin1D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Bin1DCVector = {"_p_Bin1DCVector", "Bin1DCVector *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Bin1DKVector = {"_p_Bin1DKVector", "Bin1DKVector *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CallbackMap_t = {"_p_CallbackMap_t", "CallbackMap_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ChiSquaredModule = {"_p_ChiSquaredModule", "ChiSquaredModule *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ConstKBinAxis = {"_p_ConstKBinAxis", "ConstKBinAxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CreateItemCallback = {"_p_CreateItemCallback", "CreateItemCallback *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Crystal = {"_p_Crystal", "Crystal *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CustomBinAxis = {"_p_CustomBinAxis", "CustomBinAxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DescriptionMap_t = {"_p_DescriptionMap_t", "DescriptionMap_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DetectorMask = {"_p_DetectorMask", "DetectorMask *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DistributionCosine = {"_p_DistributionCosine", "DistributionCosine *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DistributionGate = {"_p_DistributionGate", "DistributionGate *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DistributionGaussian = {"_p_DistributionGaussian", "DistributionGaussian *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DistributionHandler = {"_p_DistributionHandler", "DistributionHandler *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DistributionLogNormal = {"_p_DistributionLogNormal", "DistributionLogNormal *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_DistributionLorentz = {"_p_DistributionLorentz", "DistributionLorentz *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDecayFunction1DCauchy = {"_p_FTDecayFunction1DCauchy", "FTDecayFunction1DCauchy *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDecayFunction1DGauss = {"_p_FTDecayFunction1DGauss", "FTDecayFunction1DGauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDecayFunction1DTriangle = {"_p_FTDecayFunction1DTriangle", "FTDecayFunction1DTriangle *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDecayFunction1DVoigt = {"_p_FTDecayFunction1DVoigt", "FTDecayFunction1DVoigt *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDecayFunction2DCauchy = {"_p_FTDecayFunction2DCauchy", "FTDecayFunction2DCauchy *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDecayFunction2DGauss = {"_p_FTDecayFunction2DGauss", "FTDecayFunction2DGauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDecayFunction2DVoigt = {"_p_FTDecayFunction2DVoigt", "FTDecayFunction2DVoigt *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution1DCauchy = {"_p_FTDistribution1DCauchy", "FTDistribution1DCauchy *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution1DCosine = {"_p_FTDistribution1DCosine", "FTDistribution1DCosine *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution1DGate = {"_p_FTDistribution1DGate", "FTDistribution1DGate *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution1DGauss = {"_p_FTDistribution1DGauss", "FTDistribution1DGauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution1DTriangle = {"_p_FTDistribution1DTriangle", "FTDistribution1DTriangle *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution1DVoigt = {"_p_FTDistribution1DVoigt", "FTDistribution1DVoigt *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution2DCauchy = {"_p_FTDistribution2DCauchy", "FTDistribution2DCauchy *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution2DCone = {"_p_FTDistribution2DCone", "FTDistribution2DCone *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution2DGate = {"_p_FTDistribution2DGate", "FTDistribution2DGate *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution2DGauss = {"_p_FTDistribution2DGauss", "FTDistribution2DGauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FTDistribution2DVoigt = {"_p_FTDistribution2DVoigt", "FTDistribution2DVoigt *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitObject = {"_p_FitObject", "FitObject *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitObjects_t = {"_p_FitObjects_t", "FitObjects_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitOptions = {"_p_FitOptions", "FitOptions *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitParameter = {"_p_FitParameter", "FitParameter *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitParameterLinked = {"_p_FitParameterLinked", "FitParameterLinked *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitParameterSet = {"_p_FitParameterSet", "FitParameterSet *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitStrategyDefault = {"_p_FitStrategyDefault", "FitStrategyDefault *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitSuite = {"_p_FitSuite", "FitSuite *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitSuiteImpl = {"_p_FitSuiteImpl", "FitSuiteImpl *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitSuiteObjects = {"_p_FitSuiteObjects", "FitSuiteObjects *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitSuiteStrategies = {"_p_FitSuiteStrategies", "FitSuiteStrategies *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FixedBinAxis = {"_p_FixedBinAxis", "FixedBinAxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorAnisoPyramid = {"_p_FormFactorAnisoPyramid", "FormFactorAnisoPyramid *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorBox = {"_p_FormFactorBox", "FormFactorBox *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorCone = {"_p_FormFactorCone", "FormFactorCone *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorCone6 = {"_p_FormFactorCone6", "FormFactorCone6 *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorCrystal = {"_p_FormFactorCrystal", "FormFactorCrystal *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorCuboctahedron = {"_p_FormFactorCuboctahedron", "FormFactorCuboctahedron *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorCylinder = {"_p_FormFactorCylinder", "FormFactorCylinder *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorDecoratorDebyeWaller = {"_p_FormFactorDecoratorDebyeWaller", "FormFactorDecoratorDebyeWaller *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorDecoratorFactor = {"_p_FormFactorDecoratorFactor", "FormFactorDecoratorFactor *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorDecoratorMaterial = {"_p_FormFactorDecoratorMaterial", "FormFactorDecoratorMaterial *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorDecoratorPositionFactor = {"_p_FormFactorDecoratorPositionFactor", "FormFactorDecoratorPositionFactor *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorDecoratorRotation = {"_p_FormFactorDecoratorRotation", "FormFactorDecoratorRotation *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorDodecahedron = {"_p_FormFactorDodecahedron", "FormFactorDodecahedron *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorEllipsoidalCylinder = {"_p_FormFactorEllipsoidalCylinder", "FormFactorEllipsoidalCylinder *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorFullSphere = {"_p_FormFactorFullSphere", "FormFactorFullSphere *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorFullSpheroid = {"_p_FormFactorFullSpheroid", "FormFactorFullSpheroid *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorGauss = {"_p_FormFactorGauss", "FormFactorGauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorHemiEllipsoid = {"_p_FormFactorHemiEllipsoid", "FormFactorHemiEllipsoid *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorIcosahedron = {"_p_FormFactorIcosahedron", "FormFactorIcosahedron *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorLongBoxGauss = {"_p_FormFactorLongBoxGauss", "FormFactorLongBoxGauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorLongBoxLorentz = {"_p_FormFactorLongBoxLorentz", "FormFactorLongBoxLorentz *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorLongRipple1Gauss = {"_p_FormFactorLongRipple1Gauss", "FormFactorLongRipple1Gauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorLongRipple1Lorentz = {"_p_FormFactorLongRipple1Lorentz", "FormFactorLongRipple1Lorentz *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorLongRipple2Gauss = {"_p_FormFactorLongRipple2Gauss", "FormFactorLongRipple2Gauss *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorLongRipple2Lorentz = {"_p_FormFactorLongRipple2Lorentz", "FormFactorLongRipple2Lorentz *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorLorentz = {"_p_FormFactorLorentz", "FormFactorLorentz *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorPolygonalPrism = {"_p_FormFactorPolygonalPrism", "FormFactorPolygonalPrism *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorPolygonalSurface = {"_p_FormFactorPolygonalSurface", "FormFactorPolygonalSurface *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorPolyhedron = {"_p_FormFactorPolyhedron", "FormFactorPolyhedron *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorPrism3 = {"_p_FormFactorPrism3", "FormFactorPrism3 *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorPrism6 = {"_p_FormFactorPrism6", "FormFactorPrism6 *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorPyramid = {"_p_FormFactorPyramid", "FormFactorPyramid *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorRipple1 = {"_p_FormFactorRipple1", "FormFactorRipple1 *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorRipple2 = {"_p_FormFactorRipple2", "FormFactorRipple2 *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorSphereGaussianRadius = {"_p_FormFactorSphereGaussianRadius", "FormFactorSphereGaussianRadius *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorSphereLogNormalRadius = {"_p_FormFactorSphereLogNormalRadius", "FormFactorSphereLogNormalRadius *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorSphereUniformRadius = {"_p_FormFactorSphereUniformRadius", "FormFactorSphereUniformRadius *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorTetrahedron = {"_p_FormFactorTetrahedron", "FormFactorTetrahedron *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorTrivial = {"_p_FormFactorTrivial", "FormFactorTrivial *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorTruncatedCube = {"_p_FormFactorTruncatedCube", "FormFactorTruncatedCube *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorTruncatedSphere = {"_p_FormFactorTruncatedSphere", "FormFactorTruncatedSphere *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorTruncatedSpheroid = {"_p_FormFactorTruncatedSpheroid", "FormFactorTruncatedSpheroid *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FormFactorWeighted = {"_p_FormFactorWeighted", "FormFactorWeighted *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_GISASSimulation = {"_p_GISASSimulation", "GISASSimulation *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__Ellipse = {"_p_Geometry__Ellipse", "Geometry::Ellipse *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__HorizontalLine = {"_p_Geometry__HorizontalLine", "Geometry::HorizontalLine *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__IShape2D = {"_p_Geometry__IShape2D", "Geometry::IShape2D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__Line = {"_p_Geometry__Line", "Geometry::Line *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__Polygon = {"_p_Geometry__Polygon", "Geometry::Polygon *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__PolygonPrivate = {"_p_Geometry__PolygonPrivate", "Geometry::PolygonPrivate *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__Rectangle = {"_p_Geometry__Rectangle", "Geometry::Rectangle *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Geometry__VerticalLine = {"_p_Geometry__VerticalLine", "Geometry::VerticalLine *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Histogram1D = {"_p_Histogram1D", "Histogram1D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Histogram2D = {"_p_Histogram2D", "Histogram2D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_HomogeneousMagneticMaterial = {"_p_HomogeneousMagneticMaterial", "HomogeneousMagneticMaterial *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_HomogeneousMaterial = {"_p_HomogeneousMaterial", "HomogeneousMaterial *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IAbstractParticle = {"_p_IAbstractParticle", "IAbstractParticle *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IAxis = {"_p_IAxis", "IAxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IChiSquaredModule = {"_p_IChiSquaredModule", "IChiSquaredModule *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IClusteredParticles = {"_p_IClusteredParticles", "IClusteredParticles *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ICompositeSample = {"_p_ICompositeSample", "ICompositeSample *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IDetector2D = {"_p_IDetector2D", "IDetector2D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IDetectorResolution = {"_p_IDetectorResolution", "IDetectorResolution *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IDistribution1D = {"_p_IDistribution1D", "IDistribution1D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFTDecayFunction1D = {"_p_IFTDecayFunction1D", "IFTDecayFunction1D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFTDecayFunction2D = {"_p_IFTDecayFunction2D", "IFTDecayFunction2D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFTDistribution1D = {"_p_IFTDistribution1D", "IFTDistribution1D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFTDistribution2D = {"_p_IFTDistribution2D", "IFTDistribution2D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFactoryT_std__string_GISASSimulation_t = {"_p_IFactoryT_std__string_GISASSimulation_t", "IFactory< std::string,GISASSimulation > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFactoryT_std__string_IMultiLayerBuilder_t = {"_p_IFactoryT_std__string_IMultiLayerBuilder_t", "IFactory< std::string,IMultiLayerBuilder > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFitObserver = {"_p_IFitObserver", "IFitObserver *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFitParameter = {"_p_IFitParameter", "IFitParameter *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFitStrategy = {"_p_IFitStrategy", "IFitStrategy *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFormFactor = {"_p_IFormFactor", "std::vector< IFormFactor * >::value_type|IFormFactor *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFormFactorBorn = {"_p_IFormFactorBorn", "IFormFactorBorn *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFormFactorDecorator = {"_p_IFormFactorDecorator", "IFormFactorDecorator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IHistogram = {"_p_IHistogram", "IHistogram *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IIntensityFunction = {"_p_IIntensityFunction", "IIntensityFunction *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IIntensityNormalizer = {"_p_IIntensityNormalizer", "IIntensityNormalizer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IInterferenceFunction = {"_p_IInterferenceFunction", "IInterferenceFunction *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ILayerRTCoefficients = {"_p_ILayerRTCoefficients", "ILayerRTCoefficients *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ILayout = {"_p_ILayout", "ILayout *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IMaterial = {"_p_IMaterial", "IMaterial *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IMinimizer = {"_p_IMinimizer", "IMinimizer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IMultiLayerBuilder = {"_p_IMultiLayerBuilder", "IMultiLayerBuilder *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_INamed = {"_p_INamed", "INamed *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_INoncopyable = {"_p_INoncopyable", "INoncopyable *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IObservable = {"_p_IObservable", "IObservable *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IObserver = {"_p_IObserver", "IObserver *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IParameterT_double_t = {"_p_IParameterT_double_t", "IParameter< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IParameterized = {"_p_IParameterized", "IParameterized *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IParticle = {"_p_IParticle", "IParticle *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IPixelMap = {"_p_IPixelMap", "IPixelMap *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IResolutionFunction2D = {"_p_IResolutionFunction2D", "IResolutionFunction2D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IRotation = {"_p_IRotation", "IRotation *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IRoughness = {"_p_IRoughness", "IRoughness *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ISample = {"_p_ISample", "ISample *|std::vector< ISample * >::value_type|std::vector< ISample const * >::value_type", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ISampleVisitor = {"_p_ISampleVisitor", "ISampleVisitor *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ISelectionRule = {"_p_ISelectionRule", "ISelectionRule *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ISquaredFunction = {"_p_ISquaredFunction", "ISquaredFunction *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Instrument = {"_p_Instrument", "Instrument *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IntensityDataIOFactory = {"_p_IntensityDataIOFactory", "IntensityDataIOFactory *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IntensityFunctionLog = {"_p_IntensityFunctionLog", "IntensityFunctionLog *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IntensityFunctionSqrt = {"_p_IntensityFunctionSqrt", "IntensityFunctionSqrt *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IntensityNormalizer = {"_p_IntensityNormalizer", "IntensityNormalizer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IntensityScaleAndShiftNormalizer = {"_p_IntensityScaleAndShiftNormalizer", "IntensityScaleAndShiftNormalizer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_InterferenceFunction1DLattice = {"_p_InterferenceFunction1DLattice", "InterferenceFunction1DLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_InterferenceFunction2DLattice = {"_p_InterferenceFunction2DLattice", "InterferenceFunction2DLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_InterferenceFunction2DParaCrystal = {"_p_InterferenceFunction2DParaCrystal", "InterferenceFunction2DParaCrystal *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_InterferenceFunctionNone = {"_p_InterferenceFunctionNone", "InterferenceFunctionNone *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_InterferenceFunctionRadialParaCrystal = {"_p_InterferenceFunctionRadialParaCrystal", "InterferenceFunctionRadialParaCrystal *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IsGISAXSDetector = {"_p_IsGISAXSDetector", "IsGISAXSDetector *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Lattice = {"_p_Lattice", "Lattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Lattice1DParameters = {"_p_Lattice1DParameters", "Lattice1DParameters *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Lattice2DParameters = {"_p_Lattice2DParameters", "Lattice2DParameters *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Layer = {"_p_Layer", "Layer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_LayerInterface = {"_p_LayerInterface", "LayerInterface *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_LayerRTCoefficients_t = {"_p_LayerRTCoefficients_t", "LayerRTCoefficients_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_LayerRoughness = {"_p_LayerRoughness", "LayerRoughness *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MSG__Logger = {"_p_MSG__Logger", "MSG::Logger *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MesoCrystal = {"_p_MesoCrystal", "MesoCrystal *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MultiLayer = {"_p_MultiLayer", "MultiLayer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MultiLayerRTCoefficients_t = {"_p_MultiLayerRTCoefficients_t", "MultiLayerRTCoefficients_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_OffSpecSimulation = {"_p_OffSpecSimulation", "OffSpecSimulation *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_OutputDataIteratorT_double_OutputDataT_double_t_t = {"_p_OutputDataIteratorT_double_OutputDataT_double_t_t", "OutputData< double >::iterator *|OutputDataIterator< double,OutputData< double > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t = {"_p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t", "OutputDataIterator< double const,OutputData< double > const > *|OutputData< double >::const_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_OutputDataT_CumulativeValue_t = {"_p_OutputDataT_CumulativeValue_t", "OutputData< CumulativeValue > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_OutputDataT_bool_t = {"_p_OutputDataT_bool_t", "OutputData< bool > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_OutputDataT_double_t = {"_p_OutputDataT_double_t", "OutputData< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParameterDistribution = {"_p_ParameterDistribution", "ParameterDistribution *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParameterPool = {"_p_ParameterPool", "ParameterPool *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParameterSample = {"_p_ParameterSample", "ParameterSample *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Particle = {"_p_Particle", "Particle *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParticleComposition = {"_p_ParticleComposition", "ParticleComposition *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParticleCoreShell = {"_p_ParticleCoreShell", "ParticleCoreShell *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParticleDistribution = {"_p_ParticleDistribution", "ParticleDistribution *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ParticleLayout = {"_p_ParticleLayout", "ParticleLayout *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_PolygonalTopology = {"_p_PolygonalTopology", "PolygonalTopology *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_PolyhedralEdge = {"_p_PolyhedralEdge", "PolyhedralEdge *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_PolyhedralFace = {"_p_PolyhedralFace", "PolyhedralFace *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_PolyhedralTopology = {"_p_PolyhedralTopology", "PolyhedralTopology *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ProgressHandler__Callback_t = {"_p_ProgressHandler__Callback_t", "ProgressHandler::Callback_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RealLimits = {"_p_RealLimits", "RealLimits *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RealParameter = {"_p_RealParameter", "RealParameter *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RectPixelMap = {"_p_RectPixelMap", "RectPixelMap *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RectangularDetector = {"_p_RectangularDetector", "RectangularDetector *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RegionOfInterest = {"_p_RegionOfInterest", "RegionOfInterest *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ResolutionFunction2DGaussian = {"_p_ResolutionFunction2DGaussian", "ResolutionFunction2DGaussian *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RotationEuler = {"_p_RotationEuler", "RotationEuler *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RotationX = {"_p_RotationX", "RotationX *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RotationY = {"_p_RotationY", "RotationY *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RotationZ = {"_p_RotationZ", "RotationZ *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SafePointerVectorT_IParticle_const_t = {"_p_SafePointerVectorT_IParticle_const_t", "SafePointerVector< IParticle const > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SampleBuilderFactory = {"_p_SampleBuilderFactory", "SampleBuilderFactory *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SimpleSelectionRule = {"_p_SimpleSelectionRule", "SimpleSelectionRule *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Simulation = {"_p_Simulation", "Simulation *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SimulationFactory = {"_p_SimulationFactory", "SimulationFactory *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SimulationOptions = {"_p_SimulationOptions", "SimulationOptions *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SpecularSimulation = {"_p_SpecularSimulation", "SpecularSimulation *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SphericalDetector = {"_p_SphericalDetector", "SphericalDetector *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SquaredFunctionDefault = {"_p_SquaredFunctionDefault", "SquaredFunctionDefault *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SquaredFunctionGaussianError = {"_p_SquaredFunctionGaussianError", "SquaredFunctionGaussianError *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SquaredFunctionMeanSquaredError = {"_p_SquaredFunctionMeanSquaredError", "SquaredFunctionMeanSquaredError *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SquaredFunctionSimError = {"_p_SquaredFunctionSimError", "SquaredFunctionSimError *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SquaredFunctionSystematicError = {"_p_SquaredFunctionSystematicError", "SquaredFunctionSystematicError *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ThreadInfo = {"_p_ThreadInfo", "ThreadInfo *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_Transform3D = {"_p_Transform3D", "Transform3D *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_VariableBinAxis = {"_p_VariableBinAxis", "VariableBinAxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_WavevectorInfo = {"_p_WavevectorInfo", "WavevectorInfo *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p__object = {"_p__object", "_object *|PyObject *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_bool = {"_p_bool", "bool *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_const_iterator = {"_p_const_iterator", "const_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_const_reference = {"_p_const_reference", "const_reference *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_int = {"_p_int", "intptr_t *|int *|int_least32_t *|int_fast32_t *|int32_t *|int_fast16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_iterator = {"_p_iterator", "iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_long_long = {"_p_long_long", "int_least64_t *|int_fast64_t *|int64_t *|long long *|intmax_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_observer_t = {"_p_observer_t", "observer_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_observerlist_t = {"_p_observerlist_t", "observerlist_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p__object = {"_p_p__object", "_object **|PyObject **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_reference = {"_p_reference", "reference *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_short = {"_p_short", "short *|int_least16_t *|int16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_signed_char = {"_p_signed_char", "signed char *|int_least8_t *|int_fast8_t *|int8_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_BasicVector3DT_double_t_t = {"_p_std__allocatorT_BasicVector3DT_double_t_t", "std::allocator< BasicVector3D< double > > *|std::vector< BasicVector3D< double > >::allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t = {"_p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t", "std::allocator< BasicVector3D< std::complex< double > > > *|std::vector< BasicVector3D< std::complex< double > > >::allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_IFormFactor_p_t = {"_p_std__allocatorT_IFormFactor_p_t", "std::vector< IFormFactor * >::allocator_type *|std::allocator< IFormFactor * > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_ISample_const_p_t = {"_p_std__allocatorT_ISample_const_p_t", "std::vector< ISample const * >::allocator_type *|std::allocator< ISample const * > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_ISample_p_t = {"_p_std__allocatorT_ISample_p_t", "std::vector< ISample * >::allocator_type *|std::allocator< ISample * > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_double_t = {"_p_std__allocatorT_double_t", "std::vector< double >::allocator_type *|std::allocator< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_int_t = {"_p_std__allocatorT_int_t", "std::vector< int >::allocator_type *|std::allocator< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__complexT_double_t_t = {"_p_std__allocatorT_std__complexT_double_t_t", "std::allocator< std::complex< double > > *|std::vector< std::complex< double > >::allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__allocatorT_std__string_t", "std::vector< std::string >::allocator_type *|std::allocator< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t = {"_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t", "std::vector< std::vector< double > >::allocator_type *|std::allocator< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_unsigned_long_t = {"_p_std__allocatorT_unsigned_long_t", "std::vector< unsigned long >::allocator_type *|std::allocator< unsigned long > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__complexT_double_t = {"_p_std__complexT_double_t", "complex_t *|std::complex< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__functionT_GISASSimulation_pfF_t = {"_p_std__functionT_GISASSimulation_pfF_t", "std::function< GISASSimulation *() > *|IFactory< std::string,GISASSimulation >::CreateItemCallback *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__functionT_IMultiLayerBuilder_pfF_t = {"_p_std__functionT_IMultiLayerBuilder_pfF_t", "std::function< IMultiLayerBuilder *() > *|IFactory< std::string,IMultiLayerBuilder >::CreateItemCallback *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__functionT_void_fF_t = {"_p_std__functionT_void_fF_t", "std::function< void () > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_std__string_std__string_t__const_iterator = {"_p_std__mapT_std__string_std__string_t__const_iterator", "IFactory< std::string,GISASSimulation >::const_iterator *|std::map< std::string,std::string >::const_iterator *|IFactory< std::string,IMultiLayerBuilder >::const_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__ostream = {"_p_std__ostream", "std::ostream *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_IFitObserver_t = {"_p_std__shared_ptrT_IFitObserver_t", "std::shared_ptr< IFitObserver > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_ILayerRTCoefficients_const_t = {"_p_std__shared_ptrT_ILayerRTCoefficients_const_t", "std::shared_ptr< ILayerRTCoefficients const > *|SpecularSimulation::LayerRTCoefficients_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_IMultiLayerBuilder_t = {"_p_std__shared_ptrT_IMultiLayerBuilder_t", "std::shared_ptr< IMultiLayerBuilder > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_IObserver_t = {"_p_std__shared_ptrT_IObserver_t", "std::shared_ptr< IObserver > *|IObservable::observer_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t = {"_p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t", "std::vector< BasicVector3D< double > > *|std::vector< BasicVector3D< double >,std::allocator< BasicVector3D< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t = {"_p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t", "std::vector< BasicVector3D< std::complex< double > > > *|std::vector< BasicVector3D< std::complex< double > >,std::allocator< BasicVector3D< std::complex< double > > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t = {"_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t", "std::vector< FitElement,std::allocator< FitElement > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator = {"_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator", "std::vector< FitElement,std::allocator< FitElement > >::const_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator = {"_p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator", "std::vector< FitElement,std::allocator< FitElement > >::iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t = {"_p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t", "std::vector< IDetector2D::EAxesUnits,std::allocator< IDetector2D::EAxesUnits > > *|std::vector< enum IDetector2D::EAxesUnits,std::allocator< enum IDetector2D::EAxesUnits > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t = {"_p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t", "std::vector< IFTDistribution2D const *,std::allocator< IFTDistribution2D const * > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t = {"_p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t", "std::vector< IFormFactor *,std::allocator< IFormFactor * > > *|std::vector< IFormFactor * > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t = {"_p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t", "std::vector< IMaterial const *,std::allocator< IMaterial const * > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t = {"_p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t", "std::vector< IParticle const *,std::allocator< IParticle const * > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t = {"_p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t", "std::vector< ISample const *,std::allocator< ISample const * > > *|std::vector< ISample const * > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t = {"_p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t", "std::vector< ISample *,std::allocator< ISample * > > *|std::vector< ISample * > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t = {"_p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t", "std::vector< ParameterSample,std::allocator< ParameterSample > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t = {"_p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t", "std::vector< PolygonalTopology,std::allocator< PolygonalTopology > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t = {"_p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t", "std::vector< RealParameter *,std::allocator< RealParameter * > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t = {"_p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t", "std::vector< SimulationElement,std::allocator< SimulationElement > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_size_t_std__allocatorT_size_t_t_t = {"_p_std__vectorT_size_t_std__allocatorT_size_t_t_t", "std::vector< size_t,std::allocator< size_t > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t = {"_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t", "std::vector< std::complex< double > > *|std::vector< std::complex< double >,std::allocator< std::complex< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t = {"_p_std__vectorT_std__string_std__allocatorT_std__string_t_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t = {"_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t", "std::vector< std::vector< double > > *|std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *|std::vector< std::vector< do [...]
+static swig_type_info _swigt__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t = {"_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t", "std::vector< unsigned long > *|std::vector< unsigned long,std::allocator< unsigned long > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_swig__SwigPyIterator = {"_p_swig__SwigPyIterator", "swig::SwigPyIterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "unsigned char *|uint_least8_t *|uint_fast8_t *|uint8_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_int = {"_p_unsigned_int", "uintptr_t *|uint_least32_t *|uint_fast32_t *|uint32_t *|unsigned int *|uint_fast16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_long_long = {"_p_unsigned_long_long", "uint_least64_t *|uint_fast64_t *|uint64_t *|unsigned long long *|uintmax_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned short *|uint_least16_t *|uint16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
+
+static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_AdjustMinimizerStrategy,
+  &_swigt__p_AngularPixelMap,
+  &_swigt__p_AttLimits,
+  &_swigt__p_Attributes,
+  &_swigt__p_BasicVector3DT_double_t,
+  &_swigt__p_BasicVector3DT_int_t,
+  &_swigt__p_BasicVector3DT_std__complexT_double_t_t,
+  &_swigt__p_Beam,
+  &_swigt__p_Bin1D,
+  &_swigt__p_Bin1DCVector,
+  &_swigt__p_Bin1DKVector,
+  &_swigt__p_CallbackMap_t,
+  &_swigt__p_ChiSquaredModule,
+  &_swigt__p_ConstKBinAxis,
+  &_swigt__p_CreateItemCallback,
+  &_swigt__p_Crystal,
+  &_swigt__p_CustomBinAxis,
+  &_swigt__p_DescriptionMap_t,
+  &_swigt__p_DetectorMask,
+  &_swigt__p_DistributionCosine,
+  &_swigt__p_DistributionGate,
+  &_swigt__p_DistributionGaussian,
+  &_swigt__p_DistributionHandler,
+  &_swigt__p_DistributionLogNormal,
+  &_swigt__p_DistributionLorentz,
+  &_swigt__p_FTDecayFunction1DCauchy,
+  &_swigt__p_FTDecayFunction1DGauss,
+  &_swigt__p_FTDecayFunction1DTriangle,
+  &_swigt__p_FTDecayFunction1DVoigt,
+  &_swigt__p_FTDecayFunction2DCauchy,
+  &_swigt__p_FTDecayFunction2DGauss,
+  &_swigt__p_FTDecayFunction2DVoigt,
+  &_swigt__p_FTDistribution1DCauchy,
+  &_swigt__p_FTDistribution1DCosine,
+  &_swigt__p_FTDistribution1DGate,
+  &_swigt__p_FTDistribution1DGauss,
+  &_swigt__p_FTDistribution1DTriangle,
+  &_swigt__p_FTDistribution1DVoigt,
+  &_swigt__p_FTDistribution2DCauchy,
+  &_swigt__p_FTDistribution2DCone,
+  &_swigt__p_FTDistribution2DGate,
+  &_swigt__p_FTDistribution2DGauss,
+  &_swigt__p_FTDistribution2DVoigt,
+  &_swigt__p_FitObject,
+  &_swigt__p_FitObjects_t,
+  &_swigt__p_FitOptions,
+  &_swigt__p_FitParameter,
+  &_swigt__p_FitParameterLinked,
+  &_swigt__p_FitParameterSet,
+  &_swigt__p_FitStrategyDefault,
+  &_swigt__p_FitSuite,
+  &_swigt__p_FitSuiteImpl,
+  &_swigt__p_FitSuiteObjects,
+  &_swigt__p_FitSuiteStrategies,
+  &_swigt__p_FixedBinAxis,
+  &_swigt__p_FormFactorAnisoPyramid,
+  &_swigt__p_FormFactorBox,
+  &_swigt__p_FormFactorCone,
+  &_swigt__p_FormFactorCone6,
+  &_swigt__p_FormFactorCrystal,
+  &_swigt__p_FormFactorCuboctahedron,
+  &_swigt__p_FormFactorCylinder,
+  &_swigt__p_FormFactorDecoratorDebyeWaller,
+  &_swigt__p_FormFactorDecoratorFactor,
+  &_swigt__p_FormFactorDecoratorMaterial,
+  &_swigt__p_FormFactorDecoratorPositionFactor,
+  &_swigt__p_FormFactorDecoratorRotation,
+  &_swigt__p_FormFactorDodecahedron,
+  &_swigt__p_FormFactorEllipsoidalCylinder,
+  &_swigt__p_FormFactorFullSphere,
+  &_swigt__p_FormFactorFullSpheroid,
+  &_swigt__p_FormFactorGauss,
+  &_swigt__p_FormFactorHemiEllipsoid,
+  &_swigt__p_FormFactorIcosahedron,
+  &_swigt__p_FormFactorLongBoxGauss,
+  &_swigt__p_FormFactorLongBoxLorentz,
+  &_swigt__p_FormFactorLongRipple1Gauss,
+  &_swigt__p_FormFactorLongRipple1Lorentz,
+  &_swigt__p_FormFactorLongRipple2Gauss,
+  &_swigt__p_FormFactorLongRipple2Lorentz,
+  &_swigt__p_FormFactorLorentz,
+  &_swigt__p_FormFactorPolygonalPrism,
+  &_swigt__p_FormFactorPolygonalSurface,
+  &_swigt__p_FormFactorPolyhedron,
+  &_swigt__p_FormFactorPrism3,
+  &_swigt__p_FormFactorPrism6,
+  &_swigt__p_FormFactorPyramid,
+  &_swigt__p_FormFactorRipple1,
+  &_swigt__p_FormFactorRipple2,
+  &_swigt__p_FormFactorSphereGaussianRadius,
+  &_swigt__p_FormFactorSphereLogNormalRadius,
+  &_swigt__p_FormFactorSphereUniformRadius,
+  &_swigt__p_FormFactorTetrahedron,
+  &_swigt__p_FormFactorTrivial,
+  &_swigt__p_FormFactorTruncatedCube,
+  &_swigt__p_FormFactorTruncatedSphere,
+  &_swigt__p_FormFactorTruncatedSpheroid,
+  &_swigt__p_FormFactorWeighted,
+  &_swigt__p_GISASSimulation,
+  &_swigt__p_Geometry__Ellipse,
+  &_swigt__p_Geometry__HorizontalLine,
+  &_swigt__p_Geometry__IShape2D,
+  &_swigt__p_Geometry__Line,
+  &_swigt__p_Geometry__Polygon,
+  &_swigt__p_Geometry__PolygonPrivate,
+  &_swigt__p_Geometry__Rectangle,
+  &_swigt__p_Geometry__VerticalLine,
+  &_swigt__p_Histogram1D,
+  &_swigt__p_Histogram2D,
+  &_swigt__p_HomogeneousMagneticMaterial,
+  &_swigt__p_HomogeneousMaterial,
+  &_swigt__p_IAbstractParticle,
+  &_swigt__p_IAxis,
+  &_swigt__p_IChiSquaredModule,
+  &_swigt__p_ICloneable,
+  &_swigt__p_IClusteredParticles,
+  &_swigt__p_ICompositeSample,
+  &_swigt__p_IDetector2D,
+  &_swigt__p_IDetectorResolution,
+  &_swigt__p_IDistribution1D,
+  &_swigt__p_IFTDecayFunction1D,
+  &_swigt__p_IFTDecayFunction2D,
+  &_swigt__p_IFTDistribution1D,
+  &_swigt__p_IFTDistribution2D,
+  &_swigt__p_IFactoryT_std__string_GISASSimulation_t,
+  &_swigt__p_IFactoryT_std__string_IMultiLayerBuilder_t,
+  &_swigt__p_IFitObserver,
+  &_swigt__p_IFitParameter,
+  &_swigt__p_IFitStrategy,
+  &_swigt__p_IFormFactor,
+  &_swigt__p_IFormFactorBorn,
+  &_swigt__p_IFormFactorDecorator,
+  &_swigt__p_IHistogram,
+  &_swigt__p_IIntensityFunction,
+  &_swigt__p_IIntensityNormalizer,
+  &_swigt__p_IInterferenceFunction,
+  &_swigt__p_ILayerRTCoefficients,
+  &_swigt__p_ILayout,
+  &_swigt__p_IMaterial,
+  &_swigt__p_IMinimizer,
+  &_swigt__p_IMultiLayerBuilder,
+  &_swigt__p_INamed,
+  &_swigt__p_INoncopyable,
+  &_swigt__p_IObservable,
+  &_swigt__p_IObserver,
+  &_swigt__p_IParameterT_double_t,
+  &_swigt__p_IParameterized,
+  &_swigt__p_IParticle,
+  &_swigt__p_IPixelMap,
+  &_swigt__p_IResolutionFunction2D,
+  &_swigt__p_IRotation,
+  &_swigt__p_IRoughness,
+  &_swigt__p_ISample,
+  &_swigt__p_ISampleVisitor,
+  &_swigt__p_ISelectionRule,
+  &_swigt__p_ISquaredFunction,
+  &_swigt__p_Instrument,
+  &_swigt__p_IntensityDataIOFactory,
+  &_swigt__p_IntensityFunctionLog,
+  &_swigt__p_IntensityFunctionSqrt,
+  &_swigt__p_IntensityNormalizer,
+  &_swigt__p_IntensityScaleAndShiftNormalizer,
+  &_swigt__p_InterferenceFunction1DLattice,
+  &_swigt__p_InterferenceFunction2DLattice,
+  &_swigt__p_InterferenceFunction2DParaCrystal,
+  &_swigt__p_InterferenceFunctionNone,
+  &_swigt__p_InterferenceFunctionRadialParaCrystal,
+  &_swigt__p_IsGISAXSDetector,
+  &_swigt__p_Lattice,
+  &_swigt__p_Lattice1DParameters,
+  &_swigt__p_Lattice2DParameters,
+  &_swigt__p_Layer,
+  &_swigt__p_LayerInterface,
+  &_swigt__p_LayerRTCoefficients_t,
+  &_swigt__p_LayerRoughness,
+  &_swigt__p_MSG__Logger,
+  &_swigt__p_MesoCrystal,
+  &_swigt__p_MultiLayer,
+  &_swigt__p_MultiLayerRTCoefficients_t,
+  &_swigt__p_OffSpecSimulation,
+  &_swigt__p_OutputDataIteratorT_double_OutputDataT_double_t_t,
+  &_swigt__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t,
+  &_swigt__p_OutputDataT_CumulativeValue_t,
+  &_swigt__p_OutputDataT_bool_t,
+  &_swigt__p_OutputDataT_double_t,
+  &_swigt__p_ParameterDistribution,
+  &_swigt__p_ParameterPool,
+  &_swigt__p_ParameterSample,
+  &_swigt__p_Particle,
+  &_swigt__p_ParticleComposition,
+  &_swigt__p_ParticleCoreShell,
+  &_swigt__p_ParticleDistribution,
+  &_swigt__p_ParticleLayout,
+  &_swigt__p_PolygonalTopology,
+  &_swigt__p_PolyhedralEdge,
+  &_swigt__p_PolyhedralFace,
+  &_swigt__p_PolyhedralTopology,
+  &_swigt__p_ProgressHandler__Callback_t,
+  &_swigt__p_RealLimits,
+  &_swigt__p_RealParameter,
+  &_swigt__p_RectPixelMap,
+  &_swigt__p_RectangularDetector,
+  &_swigt__p_RegionOfInterest,
+  &_swigt__p_ResolutionFunction2DGaussian,
+  &_swigt__p_RotationEuler,
+  &_swigt__p_RotationX,
+  &_swigt__p_RotationY,
+  &_swigt__p_RotationZ,
+  &_swigt__p_SafePointerVectorT_IParticle_const_t,
+  &_swigt__p_SampleBuilderFactory,
+  &_swigt__p_SimpleSelectionRule,
+  &_swigt__p_Simulation,
+  &_swigt__p_SimulationFactory,
+  &_swigt__p_SimulationOptions,
+  &_swigt__p_SpecularSimulation,
+  &_swigt__p_SphericalDetector,
+  &_swigt__p_SquaredFunctionDefault,
+  &_swigt__p_SquaredFunctionGaussianError,
+  &_swigt__p_SquaredFunctionMeanSquaredError,
+  &_swigt__p_SquaredFunctionSimError,
+  &_swigt__p_SquaredFunctionSystematicError,
+  &_swigt__p_ThreadInfo,
+  &_swigt__p_Transform3D,
+  &_swigt__p_VariableBinAxis,
+  &_swigt__p_WavevectorInfo,
+  &_swigt__p__object,
+  &_swigt__p_allocator_type,
+  &_swigt__p_bool,
+  &_swigt__p_char,
+  &_swigt__p_const_iterator,
+  &_swigt__p_const_reference,
+  &_swigt__p_difference_type,
+  &_swigt__p_double,
+  &_swigt__p_int,
+  &_swigt__p_iterator,
+  &_swigt__p_long_long,
+  &_swigt__p_observer_t,
+  &_swigt__p_observerlist_t,
+  &_swigt__p_p__object,
+  &_swigt__p_reference,
+  &_swigt__p_short,
+  &_swigt__p_signed_char,
+  &_swigt__p_size_type,
+  &_swigt__p_std__allocatorT_BasicVector3DT_double_t_t,
+  &_swigt__p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t,
+  &_swigt__p_std__allocatorT_IFormFactor_p_t,
+  &_swigt__p_std__allocatorT_ISample_const_p_t,
+  &_swigt__p_std__allocatorT_ISample_p_t,
+  &_swigt__p_std__allocatorT_double_t,
+  &_swigt__p_std__allocatorT_int_t,
+  &_swigt__p_std__allocatorT_std__complexT_double_t_t,
+  &_swigt__p_std__allocatorT_std__string_t,
+  &_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  &_swigt__p_std__allocatorT_unsigned_long_t,
+  &_swigt__p_std__complexT_double_t,
+  &_swigt__p_std__functionT_GISASSimulation_pfF_t,
+  &_swigt__p_std__functionT_IMultiLayerBuilder_pfF_t,
+  &_swigt__p_std__functionT_void_fF_t,
+  &_swigt__p_std__invalid_argument,
+  &_swigt__p_std__mapT_std__string_std__string_t__const_iterator,
+  &_swigt__p_std__ostream,
+  &_swigt__p_std__shared_ptrT_IFitObserver_t,
+  &_swigt__p_std__shared_ptrT_ILayerRTCoefficients_const_t,
+  &_swigt__p_std__shared_ptrT_IMultiLayerBuilder_t,
+  &_swigt__p_std__shared_ptrT_IObserver_t,
+  &_swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t,
+  &_swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t,
+  &_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t,
+  &_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator,
+  &_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,
+  &_swigt__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t,
+  &_swigt__p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t,
+  &_swigt__p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t,
+  &_swigt__p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t,
+  &_swigt__p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t,
+  &_swigt__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t,
+  &_swigt__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t,
+  &_swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
+  &_swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t,
+  &_swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t,
+  &_swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,
+  &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
+  &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
+  &_swigt__p_std__vectorT_size_t_std__allocatorT_size_t_t_t,
+  &_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
+  &_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  &_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  &_swigt__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t,
+  &_swigt__p_swig__SwigPyIterator,
+  &_swigt__p_unsigned_char,
+  &_swigt__p_unsigned_int,
+  &_swigt__p_unsigned_long_long,
+  &_swigt__p_unsigned_short,
+  &_swigt__p_value_type,
+};
+
+static swig_cast_info _swigc__p_AdjustMinimizerStrategy[] = {  {&_swigt__p_AdjustMinimizerStrategy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_AngularPixelMap[] = {  {&_swigt__p_AngularPixelMap, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_AttLimits[] = {  {&_swigt__p_AttLimits, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Attributes[] = {  {&_swigt__p_Attributes, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_BasicVector3DT_double_t[] = {  {&_swigt__p_BasicVector3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_BasicVector3DT_int_t[] = {  {&_swigt__p_BasicVector3DT_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_BasicVector3DT_std__complexT_double_t_t[] = {  {&_swigt__p_BasicVector3DT_std__complexT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Beam[] = {  {&_swigt__p_Beam, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Bin1D[] = {  {&_swigt__p_Bin1D, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Bin1DCVector[] = {  {&_swigt__p_Bin1DCVector, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Bin1DKVector[] = {  {&_swigt__p_Bin1DKVector, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CallbackMap_t[] = {  {&_swigt__p_CallbackMap_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ChiSquaredModule[] = {  {&_swigt__p_ChiSquaredModule, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ConstKBinAxis[] = {  {&_swigt__p_ConstKBinAxis, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CreateItemCallback[] = {  {&_swigt__p_CreateItemCallback, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Crystal[] = {  {&_swigt__p_Crystal, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CustomBinAxis[] = {  {&_swigt__p_CustomBinAxis, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DescriptionMap_t[] = {  {&_swigt__p_DescriptionMap_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DetectorMask[] = {  {&_swigt__p_DetectorMask, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DistributionCosine[] = {  {&_swigt__p_DistributionCosine, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DistributionGate[] = {  {&_swigt__p_DistributionGate, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DistributionGaussian[] = {  {&_swigt__p_DistributionGaussian, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DistributionHandler[] = {  {&_swigt__p_DistributionHandler, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DistributionLogNormal[] = {  {&_swigt__p_DistributionLogNormal, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_DistributionLorentz[] = {  {&_swigt__p_DistributionLorentz, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDecayFunction1DCauchy[] = {  {&_swigt__p_FTDecayFunction1DCauchy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDecayFunction1DGauss[] = {  {&_swigt__p_FTDecayFunction1DGauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDecayFunction1DTriangle[] = {  {&_swigt__p_FTDecayFunction1DTriangle, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDecayFunction1DVoigt[] = {  {&_swigt__p_FTDecayFunction1DVoigt, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDecayFunction2DCauchy[] = {  {&_swigt__p_FTDecayFunction2DCauchy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDecayFunction2DGauss[] = {  {&_swigt__p_FTDecayFunction2DGauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDecayFunction2DVoigt[] = {  {&_swigt__p_FTDecayFunction2DVoigt, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution1DCauchy[] = {  {&_swigt__p_FTDistribution1DCauchy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution1DCosine[] = {  {&_swigt__p_FTDistribution1DCosine, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution1DGate[] = {  {&_swigt__p_FTDistribution1DGate, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution1DGauss[] = {  {&_swigt__p_FTDistribution1DGauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution1DTriangle[] = {  {&_swigt__p_FTDistribution1DTriangle, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution1DVoigt[] = {  {&_swigt__p_FTDistribution1DVoigt, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution2DCauchy[] = {  {&_swigt__p_FTDistribution2DCauchy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution2DCone[] = {  {&_swigt__p_FTDistribution2DCone, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution2DGate[] = {  {&_swigt__p_FTDistribution2DGate, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution2DGauss[] = {  {&_swigt__p_FTDistribution2DGauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FTDistribution2DVoigt[] = {  {&_swigt__p_FTDistribution2DVoigt, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitObject[] = {  {&_swigt__p_FitObject, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitObjects_t[] = {  {&_swigt__p_FitObjects_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitOptions[] = {  {&_swigt__p_FitOptions, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitParameter[] = {  {&_swigt__p_FitParameter, 0, 0, 0},  {&_swigt__p_FitParameterLinked, _p_FitParameterLinkedTo_p_FitParameter, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitParameterLinked[] = {  {&_swigt__p_FitParameterLinked, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitParameterSet[] = {  {&_swigt__p_FitParameterSet, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitStrategyDefault[] = {  {&_swigt__p_FitStrategyDefault, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitSuite[] = {  {&_swigt__p_FitSuite, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitSuiteImpl[] = {  {&_swigt__p_FitSuiteImpl, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitSuiteObjects[] = {  {&_swigt__p_FitSuiteObjects, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitSuiteStrategies[] = {  {&_swigt__p_FitSuiteStrategies, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FixedBinAxis[] = {  {&_swigt__p_FixedBinAxis, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorAnisoPyramid[] = {  {&_swigt__p_FormFactorAnisoPyramid, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorBox[] = {  {&_swigt__p_FormFactorBox, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorCone[] = {  {&_swigt__p_FormFactorCone, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorCone6[] = {  {&_swigt__p_FormFactorCone6, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorCrystal[] = {  {&_swigt__p_FormFactorCrystal, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorCuboctahedron[] = {  {&_swigt__p_FormFactorCuboctahedron, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorCylinder[] = {  {&_swigt__p_FormFactorCylinder, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorDecoratorDebyeWaller[] = {  {&_swigt__p_FormFactorDecoratorDebyeWaller, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorDecoratorFactor[] = {  {&_swigt__p_FormFactorDecoratorFactor, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorDecoratorMaterial[] = {  {&_swigt__p_FormFactorDecoratorMaterial, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorDecoratorPositionFactor[] = {  {&_swigt__p_FormFactorDecoratorPositionFactor, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorDecoratorRotation[] = {  {&_swigt__p_FormFactorDecoratorRotation, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorDodecahedron[] = {  {&_swigt__p_FormFactorDodecahedron, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorEllipsoidalCylinder[] = {  {&_swigt__p_FormFactorEllipsoidalCylinder, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorFullSphere[] = {  {&_swigt__p_FormFactorFullSphere, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorFullSpheroid[] = {  {&_swigt__p_FormFactorFullSpheroid, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorGauss[] = {  {&_swigt__p_FormFactorGauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorHemiEllipsoid[] = {  {&_swigt__p_FormFactorHemiEllipsoid, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorIcosahedron[] = {  {&_swigt__p_FormFactorIcosahedron, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorLongBoxGauss[] = {  {&_swigt__p_FormFactorLongBoxGauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorLongBoxLorentz[] = {  {&_swigt__p_FormFactorLongBoxLorentz, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorLongRipple1Gauss[] = {  {&_swigt__p_FormFactorLongRipple1Gauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorLongRipple1Lorentz[] = {  {&_swigt__p_FormFactorLongRipple1Lorentz, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorLongRipple2Gauss[] = {  {&_swigt__p_FormFactorLongRipple2Gauss, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorLongRipple2Lorentz[] = {  {&_swigt__p_FormFactorLongRipple2Lorentz, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorLorentz[] = {  {&_swigt__p_FormFactorLorentz, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorPolygonalPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_FormFactorPolygonalPrism, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorPolygonalSurface[] = {  {&_swigt__p_FormFactorPolygonalSurface, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorPolyhedron[] = {  {&_swigt__p_FormFactorPolyhedron, 0, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_FormFactorPolyhedron, 0, 0},  {&_sw [...]
+static swig_cast_info _swigc__p_FormFactorPrism3[] = {  {&_swigt__p_FormFactorPrism3, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorPrism6[] = {  {&_swigt__p_FormFactorPrism6, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorPyramid[] = {  {&_swigt__p_FormFactorPyramid, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorRipple1[] = {  {&_swigt__p_FormFactorRipple1, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorRipple2[] = {  {&_swigt__p_FormFactorRipple2, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorSphereGaussianRadius[] = {  {&_swigt__p_FormFactorSphereGaussianRadius, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorSphereLogNormalRadius[] = {  {&_swigt__p_FormFactorSphereLogNormalRadius, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorSphereUniformRadius[] = {  {&_swigt__p_FormFactorSphereUniformRadius, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorTetrahedron[] = {  {&_swigt__p_FormFactorTetrahedron, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorTrivial[] = {  {&_swigt__p_FormFactorTrivial, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorTruncatedCube[] = {  {&_swigt__p_FormFactorTruncatedCube, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorTruncatedSphere[] = {  {&_swigt__p_FormFactorTruncatedSphere, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorTruncatedSpheroid[] = {  {&_swigt__p_FormFactorTruncatedSpheroid, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FormFactorWeighted[] = {  {&_swigt__p_FormFactorWeighted, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_GISASSimulation[] = {  {&_swigt__p_GISASSimulation, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Geometry__Ellipse[] = {  {&_swigt__p_Geometry__Ellipse, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Geometry__HorizontalLine[] = {  {&_swigt__p_Geometry__HorizontalLine, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Geometry__IShape2D[] = {  {&_swigt__p_Geometry__Polygon, _p_Geometry__PolygonTo_p_Geometry__IShape2D, 0, 0},  {&_swigt__p_Geometry__VerticalLine, _p_Geometry__VerticalLineTo_p_Geometry__IShape2D, 0, 0},  {&_swigt__p_Geometry__Line, _p_Geometry__LineTo_p_Geometry__IShape2D, 0, 0},  {&_swigt__p_Geometry__Ellipse, _p_Geometry__EllipseTo_p_Geometry__IShape2D, 0, 0},  {&_swigt__p_Geometry__HorizontalLine, _p_Geometry__HorizontalLineTo_p_Geometry__IShape2D, 0, 0 [...]
+static swig_cast_info _swigc__p_Geometry__Line[] = {  {&_swigt__p_Geometry__Line, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Geometry__Polygon[] = {  {&_swigt__p_Geometry__Polygon, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Geometry__PolygonPrivate[] = {  {&_swigt__p_Geometry__PolygonPrivate, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Geometry__Rectangle[] = {  {&_swigt__p_Geometry__Rectangle, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Geometry__VerticalLine[] = {  {&_swigt__p_Geometry__VerticalLine, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Histogram1D[] = {  {&_swigt__p_Histogram1D, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Histogram2D[] = {  {&_swigt__p_Histogram2D, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_HomogeneousMagneticMaterial[] = {  {&_swigt__p_HomogeneousMagneticMaterial, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_HomogeneousMaterial[] = {  {&_swigt__p_HomogeneousMaterial, 0, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_HomogeneousMaterial, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_IAbstractParticle, 0, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_Pa [...]
+static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},  {&_swigt__p_VariableBinAxis, _p_VariableBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_ConstKBinAxis, _p_ConstKBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_CustomBinAxis, _p_CustomBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_FixedBinAxis, _p_FixedBinAxisTo_p_IAxis, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IChiSquaredModule[] = {  {&_swigt__p_IChiSquaredModule, 0, 0, 0},  {&_swigt__p_ChiSquaredModule, _p_ChiSquaredModuleTo_p_IChiSquaredModule, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference [...]
+static swig_cast_info _swigc__p_IClusteredParticles[] = {  {&_swigt__p_IClusteredParticles, 0, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IClusteredParticles, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICompositeSample[] = {  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICompositeSample, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICompositeSample, 0, 0},  {&_swigt__p_ICompositeSa [...]
+static swig_cast_info _swigc__p_IDetector2D[] = {  {&_swigt__p_SphericalDetector, _p_SphericalDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_RectangularDetector, _p_RectangularDetectorTo_p_IDetector2D, 0, 0},  {&_swigt__p_IDetector2D, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IDetectorResolution[] = {  {&_swigt__p_IDetectorResolution, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IDistribution1D[] = {  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_IDistribution1D, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_IDistribution1D, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_IDistribution1D, 0, 0},  {&_swigt__p_IDistribution1D, 0, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_IDistribution1D, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p [...]
+static swig_cast_info _swigc__p_IFTDecayFunction1D[] = {  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_IFTDecayFunction1D, 0, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IFTDecayFunction1D, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFTDecayFunction2D[] = {  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_IFTDecayFunction2D, 0, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IFTDecayFunction2D, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFTDistribution1D[] = {  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IFTDistribution1D, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p [...]
+static swig_cast_info _swigc__p_IFTDistribution2D[] = {  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_IFTDistribution2D, 0, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IFTDistribution2D, 0, 0},  {&_swigt__p_FTDistribution2DC [...]
+static swig_cast_info _swigc__p_IFactoryT_std__string_GISASSimulation_t[] = {  {&_swigt__p_SimulationFactory, _p_SimulationFactoryTo_p_IFactoryT_std__string_GISASSimulation_t, 0, 0},  {&_swigt__p_IFactoryT_std__string_GISASSimulation_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFactoryT_std__string_IMultiLayerBuilder_t[] = {  {&_swigt__p_IFactoryT_std__string_IMultiLayerBuilder_t, 0, 0, 0},  {&_swigt__p_SampleBuilderFactory, _p_SampleBuilderFactoryTo_p_IFactoryT_std__string_IMultiLayerBuilder_t, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFitObserver[] = {  {&_swigt__p_IFitObserver, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFitParameter[] = {  {&_swigt__p_IFitParameter, 0, 0, 0},  {&_swigt__p_FitParameter, _p_FitParameterTo_p_IFitParameter, 0, 0},  {&_swigt__p_FitParameterLinked, _p_FitParameterLinkedTo_p_IFitParameter, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFitStrategy[] = {  {&_swigt__p_IFitStrategy, 0, 0, 0},  {&_swigt__p_AdjustMinimizerStrategy, _p_AdjustMinimizerStrategyTo_p_IFitStrategy, 0, 0},  {&_swigt__p_FitStrategyDefault, _p_FitStrategyDefaultTo_p_IFitStrategy, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFormFactor[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactor, 0, 0},  {&_swigt__p_IFormFactor, 0, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactor, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncated [...]
+static swig_cast_info _swigc__p_IFormFactorBorn[] = {  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IFormFactorBorn, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IFo [...]
+static swig_cast_info _swigc__p_IFormFactorDecorator[] = {  {&_swigt__p_IFormFactorDecorator, 0, 0, 0},  {&_swigt__p_FormFactorDecoratorDebyeWaller, _p_FormFactorDecoratorDebyeWallerTo_p_IFormFactorDecorator, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IHistogram[] = {  {&_swigt__p_IHistogram, 0, 0, 0},  {&_swigt__p_Histogram2D, _p_Histogram2DTo_p_IHistogram, 0, 0},  {&_swigt__p_Histogram1D, _p_Histogram1DTo_p_IHistogram, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IIntensityFunction[] = {  {&_swigt__p_IntensityFunctionSqrt, _p_IntensityFunctionSqrtTo_p_IIntensityFunction, 0, 0},  {&_swigt__p_IIntensityFunction, 0, 0, 0},  {&_swigt__p_IntensityFunctionLog, _p_IntensityFunctionLogTo_p_IIntensityFunction, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IIntensityNormalizer[] = {  {&_swigt__p_IIntensityNormalizer, 0, 0, 0},  {&_swigt__p_IntensityNormalizer, _p_IntensityNormalizerTo_p_IIntensityNormalizer, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_IIntensityNormalizer, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IInterferenceFunction[] = {  {&_swigt__p_IInterferenceFunction, 0, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_Interfer [...]
+static swig_cast_info _swigc__p_ILayerRTCoefficients[] = {  {&_swigt__p_ILayerRTCoefficients, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ILayout[] = {  {&_swigt__p_ILayout, 0, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ILayout, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IMaterial[] = {  {&_swigt__p_IMaterial, 0, 0, 0},  {&_swigt__p_HomogeneousMaterial, _p_HomogeneousMaterialTo_p_IMaterial, 0, 0},  {&_swigt__p_HomogeneousMagneticMaterial, _p_HomogeneousMagneticMaterialTo_p_IMaterial, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IMinimizer[] = {  {&_swigt__p_IMinimizer, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IMultiLayerBuilder[] = {  {&_swigt__p_IMultiLayerBuilder, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INamed[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INamed, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INamed, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INamed, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_INamed, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleD [...]
+static swig_cast_info _swigc__p_INoncopyable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INoncopyable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INoncopyable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INoncopyable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INoncopyable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INoncopyable, 0, 0},  {&_swigt__p_ [...]
+static swig_cast_info _swigc__p_IObservable[] = {  {&_swigt__p_IObservable, 0, 0, 0},  {&_swigt__p_FitSuite, _p_FitSuiteTo_p_IObservable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IObserver[] = {  {&_swigt__p_IObserver, 0, 0, 0},  {&_swigt__p_IFitObserver, _p_IFitObserverTo_p_IObserver, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IParameterT_double_t[] = {  {&_swigt__p_IParameterT_double_t, 0, 0, 0},  {&_swigt__p_RealParameter, _p_RealParameterTo_p_IParameterT_double_t, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0}, [...]
+static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParticle, 0, 0},  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IPixelMap[] = {  {&_swigt__p_IPixelMap, 0, 0, 0},  {&_swigt__p_AngularPixelMap, _p_AngularPixelMapTo_p_IPixelMap, 0, 0},  {&_swigt__p_RectPixelMap, _p_RectPixelMapTo_p_IPixelMap, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IResolutionFunction2D[] = {  {&_swigt__p_IResolutionFunction2D, 0, 0, 0},  {&_swigt__p_ResolutionFunction2DGaussian, _p_ResolutionFunction2DGaussianTo_p_IResolutionFunction2D, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IRotation[] = {  {&_swigt__p_RotationY, _p_RotationYTo_p_IRotation, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IRotation, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IRotation, 0, 0},  {&_swigt__p_IRotation, 0, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IRotation, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IRoughness[] = {  {&_swigt__p_IRoughness, 0, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IRoughness, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISample[] = {  {&_swigt__p_Layer, _p_LayerTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ISample, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorPolygonalPrism, _p_FormFactorPolygonalPrismTo_p_ISample, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ISample, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ISample, 0, 0},  {&_swigt_ [...]
+static swig_cast_info _swigc__p_ISampleVisitor[] = {  {&_swigt__p_ISampleVisitor, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISelectionRule[] = {  {&_swigt__p_ISelectionRule, 0, 0, 0},  {&_swigt__p_SimpleSelectionRule, _p_SimpleSelectionRuleTo_p_ISelectionRule, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISquaredFunction[] = {  {&_swigt__p_SquaredFunctionGaussianError, _p_SquaredFunctionGaussianErrorTo_p_ISquaredFunction, 0, 0},  {&_swigt__p_SquaredFunctionMeanSquaredError, _p_SquaredFunctionMeanSquaredErrorTo_p_ISquaredFunction, 0, 0},  {&_swigt__p_ISquaredFunction, 0, 0, 0},  {&_swigt__p_SquaredFunctionDefault, _p_SquaredFunctionDefaultTo_p_ISquaredFunction, 0, 0},  {&_swigt__p_SquaredFunctionSimError, _p_SquaredFunctionSimErrorTo_p_ISquaredFunction, 0,  [...]
+static swig_cast_info _swigc__p_Instrument[] = {  {&_swigt__p_Instrument, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IntensityDataIOFactory[] = {  {&_swigt__p_IntensityDataIOFactory, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IntensityFunctionLog[] = {  {&_swigt__p_IntensityFunctionLog, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IntensityFunctionSqrt[] = {  {&_swigt__p_IntensityFunctionSqrt, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IntensityNormalizer[] = {  {&_swigt__p_IntensityNormalizer, 0, 0, 0},  {&_swigt__p_IntensityScaleAndShiftNormalizer, _p_IntensityScaleAndShiftNormalizerTo_p_IntensityNormalizer, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IntensityScaleAndShiftNormalizer[] = {  {&_swigt__p_IntensityScaleAndShiftNormalizer, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_InterferenceFunction1DLattice[] = {  {&_swigt__p_InterferenceFunction1DLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_InterferenceFunction2DLattice[] = {  {&_swigt__p_InterferenceFunction2DLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_InterferenceFunction2DParaCrystal[] = {  {&_swigt__p_InterferenceFunction2DParaCrystal, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_InterferenceFunctionNone[] = {  {&_swigt__p_InterferenceFunctionNone, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_InterferenceFunctionRadialParaCrystal[] = {  {&_swigt__p_InterferenceFunctionRadialParaCrystal, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IsGISAXSDetector[] = {  {&_swigt__p_IsGISAXSDetector, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Lattice[] = {  {&_swigt__p_Lattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Lattice1DParameters[] = {  {&_swigt__p_Lattice1DParameters, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Lattice2DParameters[] = {  {&_swigt__p_Lattice2DParameters, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Layer[] = {  {&_swigt__p_Layer, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_LayerInterface[] = {  {&_swigt__p_LayerInterface, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_LayerRTCoefficients_t[] = {  {&_swigt__p_LayerRTCoefficients_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_LayerRoughness[] = {  {&_swigt__p_LayerRoughness, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MSG__Logger[] = {  {&_swigt__p_MSG__Logger, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MesoCrystal[] = {  {&_swigt__p_MesoCrystal, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MultiLayer[] = {  {&_swigt__p_MultiLayer, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MultiLayerRTCoefficients_t[] = {  {&_swigt__p_MultiLayerRTCoefficients_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_OffSpecSimulation[] = {  {&_swigt__p_OffSpecSimulation, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_OutputDataIteratorT_double_OutputDataT_double_t_t[] = {  {&_swigt__p_OutputDataIteratorT_double_OutputDataT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t[] = {  {&_swigt__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_OutputDataT_CumulativeValue_t[] = {  {&_swigt__p_OutputDataT_CumulativeValue_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_OutputDataT_bool_t[] = {  {&_swigt__p_OutputDataT_bool_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_OutputDataT_double_t[] = {  {&_swigt__p_OutputDataT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParameterDistribution[] = {  {&_swigt__p_ParameterDistribution, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParameterPool[] = {  {&_swigt__p_ParameterPool, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParameterSample[] = {  {&_swigt__p_ParameterSample, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Particle[] = {  {&_swigt__p_Particle, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParticleComposition[] = {  {&_swigt__p_ParticleComposition, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParticleCoreShell[] = {  {&_swigt__p_ParticleCoreShell, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParticleDistribution[] = {  {&_swigt__p_ParticleDistribution, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ParticleLayout[] = {  {&_swigt__p_ParticleLayout, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_PolygonalTopology[] = {  {&_swigt__p_PolygonalTopology, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_PolyhedralEdge[] = {  {&_swigt__p_PolyhedralEdge, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_PolyhedralFace[] = {  {&_swigt__p_PolyhedralFace, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_PolyhedralTopology[] = {  {&_swigt__p_PolyhedralTopology, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ProgressHandler__Callback_t[] = {  {&_swigt__p_ProgressHandler__Callback_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RealLimits[] = {  {&_swigt__p_RealLimits, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RealParameter[] = {  {&_swigt__p_RealParameter, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RectPixelMap[] = {  {&_swigt__p_RectPixelMap, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RectangularDetector[] = {  {&_swigt__p_RectangularDetector, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RegionOfInterest[] = {  {&_swigt__p_RegionOfInterest, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ResolutionFunction2DGaussian[] = {  {&_swigt__p_ResolutionFunction2DGaussian, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RotationEuler[] = {  {&_swigt__p_RotationEuler, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RotationX[] = {  {&_swigt__p_RotationX, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RotationY[] = {  {&_swigt__p_RotationY, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RotationZ[] = {  {&_swigt__p_RotationZ, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SafePointerVectorT_IParticle_const_t[] = {  {&_swigt__p_SafePointerVectorT_IParticle_const_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SampleBuilderFactory[] = {  {&_swigt__p_SampleBuilderFactory, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SimpleSelectionRule[] = {  {&_swigt__p_SimpleSelectionRule, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Simulation[] = {  {&_swigt__p_Simulation, 0, 0, 0},  {&_swigt__p_GISASSimulation, _p_GISASSimulationTo_p_Simulation, 0, 0},  {&_swigt__p_OffSpecSimulation, _p_OffSpecSimulationTo_p_Simulation, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SimulationFactory[] = {  {&_swigt__p_SimulationFactory, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SimulationOptions[] = {  {&_swigt__p_SimulationOptions, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SpecularSimulation[] = {  {&_swigt__p_SpecularSimulation, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SphericalDetector[] = {  {&_swigt__p_SphericalDetector, 0, 0, 0},  {&_swigt__p_IsGISAXSDetector, _p_IsGISAXSDetectorTo_p_SphericalDetector, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SquaredFunctionDefault[] = {  {&_swigt__p_SquaredFunctionDefault, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SquaredFunctionGaussianError[] = {  {&_swigt__p_SquaredFunctionGaussianError, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SquaredFunctionMeanSquaredError[] = {  {&_swigt__p_SquaredFunctionMeanSquaredError, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SquaredFunctionSimError[] = {  {&_swigt__p_SquaredFunctionSimError, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SquaredFunctionSystematicError[] = {  {&_swigt__p_SquaredFunctionSystematicError, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ThreadInfo[] = {  {&_swigt__p_ThreadInfo, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Transform3D[] = {  {&_swigt__p_Transform3D, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_VariableBinAxis[] = {  {&_swigt__p_VariableBinAxis, 0, 0, 0},  {&_swigt__p_ConstKBinAxis, _p_ConstKBinAxisTo_p_VariableBinAxis, 0, 0},  {&_swigt__p_CustomBinAxis, _p_CustomBinAxisTo_p_VariableBinAxis, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_WavevectorInfo[] = {  {&_swigt__p_WavevectorInfo, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__object[] = {  {&_swigt__p__object, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_bool[] = {  {&_swigt__p_bool, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_const_iterator[] = {  {&_swigt__p_const_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_const_reference[] = {  {&_swigt__p_const_reference, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_difference_type[] = {  {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_int[] = {  {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_iterator[] = {  {&_swigt__p_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_long_long[] = {  {&_swigt__p_long_long, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_observer_t[] = {  {&_swigt__p_observer_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_observerlist_t[] = {  {&_swigt__p_observerlist_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p__object[] = {  {&_swigt__p_p__object, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_reference[] = {  {&_swigt__p_reference, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_short[] = {  {&_swigt__p_short, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_signed_char[] = {  {&_swigt__p_signed_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_size_type[] = {  {&_swigt__p_size_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_BasicVector3DT_double_t_t[] = {  {&_swigt__p_std__allocatorT_BasicVector3DT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t[] = {  {&_swigt__p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_IFormFactor_p_t[] = {  {&_swigt__p_std__allocatorT_IFormFactor_p_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_ISample_const_p_t[] = {  {&_swigt__p_std__allocatorT_ISample_const_p_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_ISample_p_t[] = {  {&_swigt__p_std__allocatorT_ISample_p_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_double_t[] = {  {&_swigt__p_std__allocatorT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_int_t[] = {  {&_swigt__p_std__allocatorT_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__complexT_double_t_t[] = {  {&_swigt__p_std__allocatorT_std__complexT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = {  {&_swigt__p_std__allocatorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t[] = {  {&_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_unsigned_long_t[] = {  {&_swigt__p_std__allocatorT_unsigned_long_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__complexT_double_t[] = {  {&_swigt__p_std__complexT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__functionT_GISASSimulation_pfF_t[] = {  {&_swigt__p_std__functionT_GISASSimulation_pfF_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__functionT_IMultiLayerBuilder_pfF_t[] = {  {&_swigt__p_std__functionT_IMultiLayerBuilder_pfF_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__functionT_void_fF_t[] = {  {&_swigt__p_std__functionT_void_fF_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_std__string_std__string_t__const_iterator[] = {  {&_swigt__p_std__mapT_std__string_std__string_t__const_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__ostream[] = {  {&_swigt__p_std__ostream, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_IFitObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IFitObserver_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_ILayerRTCoefficients_const_t[] = {  {&_swigt__p_std__shared_ptrT_ILayerRTCoefficients_const_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_IMultiLayerBuilder_t[] = {  {&_swigt__p_std__shared_ptrT_IMultiLayerBuilder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_IObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IObserver_t, 0, 0, 0},  {&_swigt__p_std__shared_ptrT_IFitObserver_t, _p_std__shared_ptrT_IFitObserver_tTo_p_std__shared_ptrT_IObserver_t, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t[] = {  {&_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator[] = {  {&_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator[] = {  {&_swigt__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t[] = {  {&_swigt__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t[] = {  {&_swigt__p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t[] = {  {&_swigt__p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t[] = {  {&_swigt__p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t[] = {  {&_swigt__p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t[] = {  {&_swigt__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t[] = {  {&_swigt__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t[] = {  {&_swigt__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t[] = {  {&_swigt__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t[] = {  {&_swigt__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t[] = {  {&_swigt__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_size_t_std__allocatorT_size_t_t_t[] = {  {&_swigt__p_std__vectorT_size_t_std__allocatorT_size_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t[] = {  {&_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t[] = {  {&_swigt__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_swig__SwigPyIterator[] = {  {&_swigt__p_swig__SwigPyIterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_char[] = {  {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_int[] = {  {&_swigt__p_unsigned_int, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_long_long[] = {  {&_swigt__p_unsigned_long_long, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
+
+static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_AdjustMinimizerStrategy,
+  _swigc__p_AngularPixelMap,
+  _swigc__p_AttLimits,
+  _swigc__p_Attributes,
+  _swigc__p_BasicVector3DT_double_t,
+  _swigc__p_BasicVector3DT_int_t,
+  _swigc__p_BasicVector3DT_std__complexT_double_t_t,
+  _swigc__p_Beam,
+  _swigc__p_Bin1D,
+  _swigc__p_Bin1DCVector,
+  _swigc__p_Bin1DKVector,
+  _swigc__p_CallbackMap_t,
+  _swigc__p_ChiSquaredModule,
+  _swigc__p_ConstKBinAxis,
+  _swigc__p_CreateItemCallback,
+  _swigc__p_Crystal,
+  _swigc__p_CustomBinAxis,
+  _swigc__p_DescriptionMap_t,
+  _swigc__p_DetectorMask,
+  _swigc__p_DistributionCosine,
+  _swigc__p_DistributionGate,
+  _swigc__p_DistributionGaussian,
+  _swigc__p_DistributionHandler,
+  _swigc__p_DistributionLogNormal,
+  _swigc__p_DistributionLorentz,
+  _swigc__p_FTDecayFunction1DCauchy,
+  _swigc__p_FTDecayFunction1DGauss,
+  _swigc__p_FTDecayFunction1DTriangle,
+  _swigc__p_FTDecayFunction1DVoigt,
+  _swigc__p_FTDecayFunction2DCauchy,
+  _swigc__p_FTDecayFunction2DGauss,
+  _swigc__p_FTDecayFunction2DVoigt,
+  _swigc__p_FTDistribution1DCauchy,
+  _swigc__p_FTDistribution1DCosine,
+  _swigc__p_FTDistribution1DGate,
+  _swigc__p_FTDistribution1DGauss,
+  _swigc__p_FTDistribution1DTriangle,
+  _swigc__p_FTDistribution1DVoigt,
+  _swigc__p_FTDistribution2DCauchy,
+  _swigc__p_FTDistribution2DCone,
+  _swigc__p_FTDistribution2DGate,
+  _swigc__p_FTDistribution2DGauss,
+  _swigc__p_FTDistribution2DVoigt,
+  _swigc__p_FitObject,
+  _swigc__p_FitObjects_t,
+  _swigc__p_FitOptions,
+  _swigc__p_FitParameter,
+  _swigc__p_FitParameterLinked,
+  _swigc__p_FitParameterSet,
+  _swigc__p_FitStrategyDefault,
+  _swigc__p_FitSuite,
+  _swigc__p_FitSuiteImpl,
+  _swigc__p_FitSuiteObjects,
+  _swigc__p_FitSuiteStrategies,
+  _swigc__p_FixedBinAxis,
+  _swigc__p_FormFactorAnisoPyramid,
+  _swigc__p_FormFactorBox,
+  _swigc__p_FormFactorCone,
+  _swigc__p_FormFactorCone6,
+  _swigc__p_FormFactorCrystal,
+  _swigc__p_FormFactorCuboctahedron,
+  _swigc__p_FormFactorCylinder,
+  _swigc__p_FormFactorDecoratorDebyeWaller,
+  _swigc__p_FormFactorDecoratorFactor,
+  _swigc__p_FormFactorDecoratorMaterial,
+  _swigc__p_FormFactorDecoratorPositionFactor,
+  _swigc__p_FormFactorDecoratorRotation,
+  _swigc__p_FormFactorDodecahedron,
+  _swigc__p_FormFactorEllipsoidalCylinder,
+  _swigc__p_FormFactorFullSphere,
+  _swigc__p_FormFactorFullSpheroid,
+  _swigc__p_FormFactorGauss,
+  _swigc__p_FormFactorHemiEllipsoid,
+  _swigc__p_FormFactorIcosahedron,
+  _swigc__p_FormFactorLongBoxGauss,
+  _swigc__p_FormFactorLongBoxLorentz,
+  _swigc__p_FormFactorLongRipple1Gauss,
+  _swigc__p_FormFactorLongRipple1Lorentz,
+  _swigc__p_FormFactorLongRipple2Gauss,
+  _swigc__p_FormFactorLongRipple2Lorentz,
+  _swigc__p_FormFactorLorentz,
+  _swigc__p_FormFactorPolygonalPrism,
+  _swigc__p_FormFactorPolygonalSurface,
+  _swigc__p_FormFactorPolyhedron,
+  _swigc__p_FormFactorPrism3,
+  _swigc__p_FormFactorPrism6,
+  _swigc__p_FormFactorPyramid,
+  _swigc__p_FormFactorRipple1,
+  _swigc__p_FormFactorRipple2,
+  _swigc__p_FormFactorSphereGaussianRadius,
+  _swigc__p_FormFactorSphereLogNormalRadius,
+  _swigc__p_FormFactorSphereUniformRadius,
+  _swigc__p_FormFactorTetrahedron,
+  _swigc__p_FormFactorTrivial,
+  _swigc__p_FormFactorTruncatedCube,
+  _swigc__p_FormFactorTruncatedSphere,
+  _swigc__p_FormFactorTruncatedSpheroid,
+  _swigc__p_FormFactorWeighted,
+  _swigc__p_GISASSimulation,
+  _swigc__p_Geometry__Ellipse,
+  _swigc__p_Geometry__HorizontalLine,
+  _swigc__p_Geometry__IShape2D,
+  _swigc__p_Geometry__Line,
+  _swigc__p_Geometry__Polygon,
+  _swigc__p_Geometry__PolygonPrivate,
+  _swigc__p_Geometry__Rectangle,
+  _swigc__p_Geometry__VerticalLine,
+  _swigc__p_Histogram1D,
+  _swigc__p_Histogram2D,
+  _swigc__p_HomogeneousMagneticMaterial,
+  _swigc__p_HomogeneousMaterial,
+  _swigc__p_IAbstractParticle,
+  _swigc__p_IAxis,
+  _swigc__p_IChiSquaredModule,
+  _swigc__p_ICloneable,
+  _swigc__p_IClusteredParticles,
+  _swigc__p_ICompositeSample,
+  _swigc__p_IDetector2D,
+  _swigc__p_IDetectorResolution,
+  _swigc__p_IDistribution1D,
+  _swigc__p_IFTDecayFunction1D,
+  _swigc__p_IFTDecayFunction2D,
+  _swigc__p_IFTDistribution1D,
+  _swigc__p_IFTDistribution2D,
+  _swigc__p_IFactoryT_std__string_GISASSimulation_t,
+  _swigc__p_IFactoryT_std__string_IMultiLayerBuilder_t,
+  _swigc__p_IFitObserver,
+  _swigc__p_IFitParameter,
+  _swigc__p_IFitStrategy,
+  _swigc__p_IFormFactor,
+  _swigc__p_IFormFactorBorn,
+  _swigc__p_IFormFactorDecorator,
+  _swigc__p_IHistogram,
+  _swigc__p_IIntensityFunction,
+  _swigc__p_IIntensityNormalizer,
+  _swigc__p_IInterferenceFunction,
+  _swigc__p_ILayerRTCoefficients,
+  _swigc__p_ILayout,
+  _swigc__p_IMaterial,
+  _swigc__p_IMinimizer,
+  _swigc__p_IMultiLayerBuilder,
+  _swigc__p_INamed,
+  _swigc__p_INoncopyable,
+  _swigc__p_IObservable,
+  _swigc__p_IObserver,
+  _swigc__p_IParameterT_double_t,
+  _swigc__p_IParameterized,
+  _swigc__p_IParticle,
+  _swigc__p_IPixelMap,
+  _swigc__p_IResolutionFunction2D,
+  _swigc__p_IRotation,
+  _swigc__p_IRoughness,
+  _swigc__p_ISample,
+  _swigc__p_ISampleVisitor,
+  _swigc__p_ISelectionRule,
+  _swigc__p_ISquaredFunction,
+  _swigc__p_Instrument,
+  _swigc__p_IntensityDataIOFactory,
+  _swigc__p_IntensityFunctionLog,
+  _swigc__p_IntensityFunctionSqrt,
+  _swigc__p_IntensityNormalizer,
+  _swigc__p_IntensityScaleAndShiftNormalizer,
+  _swigc__p_InterferenceFunction1DLattice,
+  _swigc__p_InterferenceFunction2DLattice,
+  _swigc__p_InterferenceFunction2DParaCrystal,
+  _swigc__p_InterferenceFunctionNone,
+  _swigc__p_InterferenceFunctionRadialParaCrystal,
+  _swigc__p_IsGISAXSDetector,
+  _swigc__p_Lattice,
+  _swigc__p_Lattice1DParameters,
+  _swigc__p_Lattice2DParameters,
+  _swigc__p_Layer,
+  _swigc__p_LayerInterface,
+  _swigc__p_LayerRTCoefficients_t,
+  _swigc__p_LayerRoughness,
+  _swigc__p_MSG__Logger,
+  _swigc__p_MesoCrystal,
+  _swigc__p_MultiLayer,
+  _swigc__p_MultiLayerRTCoefficients_t,
+  _swigc__p_OffSpecSimulation,
+  _swigc__p_OutputDataIteratorT_double_OutputDataT_double_t_t,
+  _swigc__p_OutputDataIteratorT_double_const_OutputDataT_double_t_const_t,
+  _swigc__p_OutputDataT_CumulativeValue_t,
+  _swigc__p_OutputDataT_bool_t,
+  _swigc__p_OutputDataT_double_t,
+  _swigc__p_ParameterDistribution,
+  _swigc__p_ParameterPool,
+  _swigc__p_ParameterSample,
+  _swigc__p_Particle,
+  _swigc__p_ParticleComposition,
+  _swigc__p_ParticleCoreShell,
+  _swigc__p_ParticleDistribution,
+  _swigc__p_ParticleLayout,
+  _swigc__p_PolygonalTopology,
+  _swigc__p_PolyhedralEdge,
+  _swigc__p_PolyhedralFace,
+  _swigc__p_PolyhedralTopology,
+  _swigc__p_ProgressHandler__Callback_t,
+  _swigc__p_RealLimits,
+  _swigc__p_RealParameter,
+  _swigc__p_RectPixelMap,
+  _swigc__p_RectangularDetector,
+  _swigc__p_RegionOfInterest,
+  _swigc__p_ResolutionFunction2DGaussian,
+  _swigc__p_RotationEuler,
+  _swigc__p_RotationX,
+  _swigc__p_RotationY,
+  _swigc__p_RotationZ,
+  _swigc__p_SafePointerVectorT_IParticle_const_t,
+  _swigc__p_SampleBuilderFactory,
+  _swigc__p_SimpleSelectionRule,
+  _swigc__p_Simulation,
+  _swigc__p_SimulationFactory,
+  _swigc__p_SimulationOptions,
+  _swigc__p_SpecularSimulation,
+  _swigc__p_SphericalDetector,
+  _swigc__p_SquaredFunctionDefault,
+  _swigc__p_SquaredFunctionGaussianError,
+  _swigc__p_SquaredFunctionMeanSquaredError,
+  _swigc__p_SquaredFunctionSimError,
+  _swigc__p_SquaredFunctionSystematicError,
+  _swigc__p_ThreadInfo,
+  _swigc__p_Transform3D,
+  _swigc__p_VariableBinAxis,
+  _swigc__p_WavevectorInfo,
+  _swigc__p__object,
+  _swigc__p_allocator_type,
+  _swigc__p_bool,
+  _swigc__p_char,
+  _swigc__p_const_iterator,
+  _swigc__p_const_reference,
+  _swigc__p_difference_type,
+  _swigc__p_double,
+  _swigc__p_int,
+  _swigc__p_iterator,
+  _swigc__p_long_long,
+  _swigc__p_observer_t,
+  _swigc__p_observerlist_t,
+  _swigc__p_p__object,
+  _swigc__p_reference,
+  _swigc__p_short,
+  _swigc__p_signed_char,
+  _swigc__p_size_type,
+  _swigc__p_std__allocatorT_BasicVector3DT_double_t_t,
+  _swigc__p_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t,
+  _swigc__p_std__allocatorT_IFormFactor_p_t,
+  _swigc__p_std__allocatorT_ISample_const_p_t,
+  _swigc__p_std__allocatorT_ISample_p_t,
+  _swigc__p_std__allocatorT_double_t,
+  _swigc__p_std__allocatorT_int_t,
+  _swigc__p_std__allocatorT_std__complexT_double_t_t,
+  _swigc__p_std__allocatorT_std__string_t,
+  _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  _swigc__p_std__allocatorT_unsigned_long_t,
+  _swigc__p_std__complexT_double_t,
+  _swigc__p_std__functionT_GISASSimulation_pfF_t,
+  _swigc__p_std__functionT_IMultiLayerBuilder_pfF_t,
+  _swigc__p_std__functionT_void_fF_t,
+  _swigc__p_std__invalid_argument,
+  _swigc__p_std__mapT_std__string_std__string_t__const_iterator,
+  _swigc__p_std__ostream,
+  _swigc__p_std__shared_ptrT_IFitObserver_t,
+  _swigc__p_std__shared_ptrT_ILayerRTCoefficients_const_t,
+  _swigc__p_std__shared_ptrT_IMultiLayerBuilder_t,
+  _swigc__p_std__shared_ptrT_IObserver_t,
+  _swigc__p_std__vectorT_BasicVector3DT_double_t_std__allocatorT_BasicVector3DT_double_t_t_t,
+  _swigc__p_std__vectorT_BasicVector3DT_std__complexT_double_t_t_std__allocatorT_BasicVector3DT_std__complexT_double_t_t_t_t,
+  _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t,
+  _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__const_iterator,
+  _swigc__p_std__vectorT_FitElement_std__allocatorT_FitElement_t_t__iterator,
+  _swigc__p_std__vectorT_IDetector2D__EAxesUnits_std__allocatorT_IDetector2D__EAxesUnits_t_t,
+  _swigc__p_std__vectorT_IFTDistribution2D_const_p_std__allocatorT_IFTDistribution2D_const_p_t_t,
+  _swigc__p_std__vectorT_IFormFactor_p_std__allocatorT_IFormFactor_p_t_t,
+  _swigc__p_std__vectorT_IMaterial_const_p_std__allocatorT_IMaterial_const_p_t_t,
+  _swigc__p_std__vectorT_IParticle_const_p_std__allocatorT_IParticle_const_p_t_t,
+  _swigc__p_std__vectorT_ISample_const_p_std__allocatorT_ISample_const_p_t_t,
+  _swigc__p_std__vectorT_ISample_p_std__allocatorT_ISample_p_t_t,
+  _swigc__p_std__vectorT_ParameterSample_std__allocatorT_ParameterSample_t_t,
+  _swigc__p_std__vectorT_PolygonalTopology_std__allocatorT_PolygonalTopology_t_t,
+  _swigc__p_std__vectorT_RealParameter_p_std__allocatorT_RealParameter_p_t_t,
+  _swigc__p_std__vectorT_SimulationElement_std__allocatorT_SimulationElement_t_t,
+  _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
+  _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
+  _swigc__p_std__vectorT_size_t_std__allocatorT_size_t_t_t,
+  _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
+  _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  _swigc__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t,
+  _swigc__p_swig__SwigPyIterator,
+  _swigc__p_unsigned_char,
+  _swigc__p_unsigned_int,
+  _swigc__p_unsigned_long_long,
+  _swigc__p_unsigned_short,
+  _swigc__p_value_type,
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+static swig_const_info swig_const_table[] = {
+{0, 0, 0, 0.0, 0, 0}};
+
+#ifdef __cplusplus
+}
+#endif
+/* -----------------------------------------------------------------------------
+ * Type initialization:
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
+ * swig_cast_info structures and swig_cast_info structures store pointers back
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
+ * swig_module, and does all the lookup, filling in the swig_module.types
+ * array with the correct data and linking the correct swig_cast_info
+ * structures together.
+ *
+ * The generated swig_type_info structures are assigned statically to an initial
+ * array. We just loop through that array, and handle each type individually.
+ * First we lookup if this type has been already loaded, and if so, use the
+ * loaded structure instead of the generated one. Then we have to fill in the
+ * cast linked list. The cast data is initially stored in something like a
+ * two-dimensional array. Each row corresponds to a type (there are the same
+ * number of rows as there are in the swig_type_initial array). Each entry in
+ * a column is one of the swig_cast_info structures for that type.
+ * The cast_initial array is actually an array of arrays, because each row has
+ * a variable number of columns. So to actually build the cast linked list,
+ * we find the array of casts associated with the type, and loop through it
+ * adding the casts to the list. The one last trick we need to do is making
+ * sure the type pointer in the swig_cast_info struct is correct.
+ *
+ * First off, we lookup the cast->type name to see if it is already loaded.
+ * There are three cases to handle:
+ *  1) If the cast->type has already been loaded AND the type we are adding
+ *     casting info to has not been loaded (it is in this module), THEN we
+ *     replace the cast->type pointer with the type pointer that has already
+ *     been loaded.
+ *  2) If BOTH types (the one we are adding casting info to, and the
+ *     cast->type) are loaded, THEN the cast info has already been loaded by
+ *     the previous module so we just ignore it.
+ *  3) Finally, if cast->type has not already been loaded, then we add that
+ *     swig_cast_info to the linked list (because the cast->type) pointer will
+ *     be correct.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} /* c-mode */
+#endif
+#endif
+
+#if 0
+#define SWIGRUNTIME_DEBUG
+#endif
+
+
+SWIGRUNTIME void
+SWIG_InitializeModule(void *clientdata) {
+  size_t i;
+  swig_module_info *module_head, *iter;
+  int init;
+  
+  /* check to see if the circular list has been setup, if not, set it up */
+  if (swig_module.next==0) {
+    /* Initialize the swig_module */
+    swig_module.type_initial = swig_type_initial;
+    swig_module.cast_initial = swig_cast_initial;
+    swig_module.next = &swig_module;
+    init = 1;
+  } else {
+    init = 0;
+  }
+  
+  /* Try and load any already created modules */
+  module_head = SWIG_GetModule(clientdata);
+  if (!module_head) {
+    /* This is the first module loaded for this interpreter */
+    /* so set the swig module into the interpreter */
+    SWIG_SetModule(clientdata, &swig_module);
+  } else {
+    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
+    iter=module_head;
+    do {
+      if (iter==&swig_module) {
+        /* Our module is already in the list, so there's nothing more to do. */
+        return;
+      }
+      iter=iter->next;
+    } while (iter!= module_head);
+    
+    /* otherwise we must add our module into the list */
+    swig_module.next = module_head->next;
+    module_head->next = &swig_module;
+  }
+  
+  /* When multiple interpreters are used, a module could have already been initialized in
+       a different interpreter, but not yet have a pointer in this interpreter.
+       In this case, we do not want to continue adding types... everything should be
+       set up already */
+  if (init == 0) return;
+  
+  /* Now work on filling in swig_module.types */
+#ifdef SWIGRUNTIME_DEBUG
+  printf("SWIG_InitializeModule: size %d\n", swig_module.size);
+#endif
+  for (i = 0; i < swig_module.size; ++i) {
+    swig_type_info *type = 0;
+    swig_type_info *ret;
+    swig_cast_info *cast;
+    
+#ifdef SWIGRUNTIME_DEBUG
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+#endif
+    
+    /* if there is another module already loaded */
+    if (swig_module.next != &swig_module) {
+      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
+    }
+    if (type) {
+      /* Overwrite clientdata field */
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found type %s\n", type->name);
+#endif
+      if (swig_module.type_initial[i]->clientdata) {
+        type->clientdata = swig_module.type_initial[i]->clientdata;
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
+#endif
+      }
+    } else {
+      type = swig_module.type_initial[i];
+    }
+    
+    /* Insert casting types */
+    cast = swig_module.cast_initial[i];
+    while (cast->type) {
+      /* Don't need to add information already in the list */
+      ret = 0;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
+#endif
+      if (swig_module.next != &swig_module) {
+        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
+#ifdef SWIGRUNTIME_DEBUG
+        if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
+#endif
+      }
+      if (ret) {
+        if (type == swig_module.type_initial[i]) {
+#ifdef SWIGRUNTIME_DEBUG
+          printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
+#endif
+          cast->type = ret;
+          ret = 0;
+        } else {
+          /* Check for casting already in the list */
+          swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
+#ifdef SWIGRUNTIME_DEBUG
+          if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
+#endif
+          if (!ocast) ret = 0;
+        }
+      }
+      
+      if (!ret) {
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
+#endif
+        if (type->cast) {
+          type->cast->prev = cast;
+          cast->next = type->cast;
+        }
+        type->cast = cast;
+      }
+      cast++;
+    }
+    /* Set entry in modules->types array equal to the type */
+    swig_module.types[i] = type;
+  }
+  swig_module.types[i] = 0;
+  
+#ifdef SWIGRUNTIME_DEBUG
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+  for (i = 0; i < swig_module.size; ++i) {
+    int j = 0;
+    swig_cast_info *cast = swig_module.cast_initial[i];
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+    while (cast->type) {
+      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
+      cast++;
+      ++j;
+    }
+    printf("---- Total casts: %d\n",j);
+  }
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+#endif
+}
+
+/* This function will propagate the clientdata field of type to
+* any new swig_type_info structures that have been added into the list
+* of equivalent types.  It is like calling
+* SWIG_TypeClientData(type, clientdata) a second time.
+*/
+SWIGRUNTIME void
+SWIG_PropagateClientData(void) {
+  size_t i;
+  swig_cast_info *equiv;
+  static int init_run = 0;
+  
+  if (init_run) return;
+  init_run = 1;
+  
+  for (i = 0; i < swig_module.size; i++) {
+    if (swig_module.types[i]->clientdata) {
+      equiv = swig_module.types[i]->cast;
+      while (equiv) {
+        if (!equiv->converter) {
+          if (equiv->type && !equiv->type->clientdata)
+          SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
+        }
+        equiv = equiv->next;
+      }
+    }
+  }
+}
+
+#ifdef __cplusplus
+#if 0
+{
+  /* c-mode */
+#endif
+}
+#endif
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+  /* Python-specific SWIG API */
+#define SWIG_newvarlink()                             SWIG_Python_newvarlink()
+#define SWIG_addvarlink(p, name, get_attr, set_attr)  SWIG_Python_addvarlink(p, name, get_attr, set_attr)
+#define SWIG_InstallConstants(d, constants)           SWIG_Python_InstallConstants(d, constants)
+  
+  /* -----------------------------------------------------------------------------
+   * global variable support code.
+   * ----------------------------------------------------------------------------- */
+  
+  typedef struct swig_globalvar {
+    char       *name;                  /* Name of global variable */
+    PyObject *(*get_attr)(void);       /* Return the current value */
+    int       (*set_attr)(PyObject *); /* Set the value */
+    struct swig_globalvar *next;
+  } swig_globalvar;
+  
+  typedef struct swig_varlinkobject {
+    PyObject_HEAD
+    swig_globalvar *vars;
+  } swig_varlinkobject;
+  
+  SWIGINTERN PyObject *
+  swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) {
+#if PY_VERSION_HEX >= 0x03000000
+    return PyUnicode_InternFromString("<Swig global variables>");
+#else
+    return PyString_FromString("<Swig global variables>");
+#endif
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_str(swig_varlinkobject *v) {
+#if PY_VERSION_HEX >= 0x03000000
+    PyObject *str = PyUnicode_InternFromString("(");
+    PyObject *tail;
+    PyObject *joined;
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      tail = PyUnicode_FromString(var->name);
+      joined = PyUnicode_Concat(str, tail);
+      Py_DecRef(str);
+      Py_DecRef(tail);
+      str = joined;
+      if (var->next) {
+        tail = PyUnicode_InternFromString(", ");
+        joined = PyUnicode_Concat(str, tail);
+        Py_DecRef(str);
+        Py_DecRef(tail);
+        str = joined;
+      }
+    }
+    tail = PyUnicode_InternFromString(")");
+    joined = PyUnicode_Concat(str, tail);
+    Py_DecRef(str);
+    Py_DecRef(tail);
+    str = joined;
+#else
+    PyObject *str = PyString_FromString("(");
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      PyString_ConcatAndDel(&str,PyString_FromString(var->name));
+      if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
+    }
+    PyString_ConcatAndDel(&str,PyString_FromString(")"));
+#endif
+    return str;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) {
+    char *tmp;
+    PyObject *str = swig_varlink_str(v);
+    fprintf(fp,"Swig global variables ");
+    fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str));
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(str);
+    return 0;
+  }
+  
+  SWIGINTERN void
+  swig_varlink_dealloc(swig_varlinkobject *v) {
+    swig_globalvar *var = v->vars;
+    while (var) {
+      swig_globalvar *n = var->next;
+      free(var->name);
+      free(var);
+      var = n;
+    }
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_getattr(swig_varlinkobject *v, char *n) {
+    PyObject *res = NULL;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->get_attr)();
+        break;
+      }
+      var = var->next;
+    }
+    if (res == NULL && !PyErr_Occurred()) {
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+    }
+    return res;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
+    int res = 1;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->set_attr)(p);
+        break;
+      }
+      var = var->next;
+    }
+    if (res == 1 && !PyErr_Occurred()) {
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+    }
+    return res;
+  }
+  
+  SWIGINTERN PyTypeObject*
+  swig_varlink_type(void) {
+    static char varlink__doc__[] = "Swig var link object";
+    static PyTypeObject varlink_type;
+    static int type_init = 0;
+    if (!type_init) {
+      const PyTypeObject tmp = {
+        /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+        PyVarObject_HEAD_INIT(NULL, 0)
+#else
+        PyObject_HEAD_INIT(NULL)
+        0,                                  /* ob_size */
+#endif
+        (char *)"swigvarlink",              /* tp_name */
+        sizeof(swig_varlinkobject),         /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        (destructor) swig_varlink_dealloc,  /* tp_dealloc */
+        (printfunc) swig_varlink_print,     /* tp_print */
+        (getattrfunc) swig_varlink_getattr, /* tp_getattr */
+        (setattrfunc) swig_varlink_setattr, /* tp_setattr */
+        0,                                  /* tp_compare */
+        (reprfunc) swig_varlink_repr,       /* tp_repr */
+        0,                                  /* tp_as_number */
+        0,                                  /* tp_as_sequence */
+        0,                                  /* tp_as_mapping */
+        0,                                  /* tp_hash */
+        0,                                  /* tp_call */
+        (reprfunc) swig_varlink_str,        /* tp_str */
+        0,                                  /* tp_getattro */
+        0,                                  /* tp_setattro */
+        0,                                  /* tp_as_buffer */
+        0,                                  /* tp_flags */
+        varlink__doc__,                     /* tp_doc */
+        0,                                  /* tp_traverse */
+        0,                                  /* tp_clear */
+        0,                                  /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+        0,                                  /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+        0,                                  /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+        0,                                  /* tp_finalize */
+#endif
+#ifdef COUNT_ALLOCS
+        0,                                  /* tp_allocs */
+        0,                                  /* tp_frees */
+        0,                                  /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+        0,                                  /* tp_prev */
+#endif
+        0                                   /* tp_next */
+#endif
+      };
+      varlink_type = tmp;
+      type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+      varlink_type.ob_type = &PyType_Type;
+#else
+      if (PyType_Ready(&varlink_type) < 0)
+      return NULL;
+#endif
+    }
+    return &varlink_type;
+  }
+  
+  /* Create a variable linking object for use later */
+  SWIGINTERN PyObject *
+  SWIG_Python_newvarlink(void) {
+    swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type());
+    if (result) {
+      result->vars = 0;
+    }
+    return ((PyObject*) result);
+  }
+  
+  SWIGINTERN void 
+  SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
+    swig_varlinkobject *v = (swig_varlinkobject *) p;
+    swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
+    if (gv) {
+      size_t size = strlen(name)+1;
+      gv->name = (char *)malloc(size);
+      if (gv->name) {
+        strncpy(gv->name,name,size);
+        gv->get_attr = get_attr;
+        gv->set_attr = set_attr;
+        gv->next = v->vars;
+      }
+    }
+    v->vars = gv;
+  }
+  
+  SWIGINTERN PyObject *
+  SWIG_globals(void) {
+    static PyObject *_SWIG_globals = 0; 
+    if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink();  
+    return _SWIG_globals;
+  }
+  
+  /* -----------------------------------------------------------------------------
+   * constants/methods manipulation
+   * ----------------------------------------------------------------------------- */
+  
+  /* Install Constants */
+  SWIGINTERN void
+  SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
+    PyObject *obj = 0;
+    size_t i;
+    for (i = 0; constants[i].type; ++i) {
+      switch(constants[i].type) {
+      case SWIG_PY_POINTER:
+        obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
+        break;
+      case SWIG_PY_BINARY:
+        obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
+        break;
+      default:
+        obj = 0;
+        break;
+      }
+      if (obj) {
+        PyDict_SetItemString(d, constants[i].name, obj);
+        Py_DECREF(obj);
+      }
+    }
+  }
+  
+  /* -----------------------------------------------------------------------------*/
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  /* -----------------------------------------------------------------------------*/
+  
+  SWIGINTERN void
+  SWIG_Python_FixMethods(PyMethodDef *methods,
+    swig_const_info *const_table,
+    swig_type_info **types,
+    swig_type_info **types_initial) {
+    size_t i;
+    for (i = 0; methods[i].ml_name; ++i) {
+      const char *c = methods[i].ml_doc;
+      if (!c) continue;
+      c = strstr(c, "swig_ptr: ");
+      if (c) {
+        int j;
+        swig_const_info *ci = 0;
+        const char *name = c + 10;
+        for (j = 0; const_table[j].type; ++j) {
+          if (strncmp(const_table[j].name, name, 
+              strlen(const_table[j].name)) == 0) {
+            ci = &(const_table[j]);
+            break;
+          }
+        }
+        if (ci) {
+          void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0;
+          if (ptr) {
+            size_t shift = (ci->ptype) - types;
+            swig_type_info *ty = types_initial[shift];
+            size_t ldoc = (c - methods[i].ml_doc);
+            size_t lptr = strlen(ty->name)+2*sizeof(void*)+2;
+            char *ndoc = (char*)malloc(ldoc + lptr + 10);
+            if (ndoc) {
+              char *buff = ndoc;
+              strncpy(buff, methods[i].ml_doc, ldoc);
+              buff += ldoc;
+              strncpy(buff, "swig_ptr: ", 10);
+              buff += 10;
+              SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
+              methods[i].ml_doc = ndoc;
+            }
+          }
+        }
+      }
+    }
+  } 
+  
+#ifdef __cplusplus
+}
+#endif
+
+/* -----------------------------------------------------------------------------*
+ *  Partial Init method
+ * -----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+SWIGEXPORT 
+#if PY_VERSION_HEX >= 0x03000000
+PyObject*
+#else
+void
+#endif
+SWIG_init(void) {
+  PyObject *m, *d, *md;
+#if PY_VERSION_HEX >= 0x03000000
+  static struct PyModuleDef SWIG_module = {
+# if PY_VERSION_HEX >= 0x03020000
+    PyModuleDef_HEAD_INIT,
+# else
+    {
+      PyObject_HEAD_INIT(NULL)
+      NULL, /* m_init */
+      0,    /* m_index */
+      NULL, /* m_copy */
+    },
+# endif
+    (char *) SWIG_name,
+    NULL,
+    -1,
+    SwigMethods,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+  };
+#endif
+  
+#if defined(SWIGPYTHON_BUILTIN)
+  static SwigPyClientData SwigPyObject_clientdata = {
+    0, 0, 0, 0, 0, 0, 0
+  };
+  static PyGetSetDef this_getset_def = {
+    (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL
+  };
+  static SwigPyGetSet thisown_getset_closure = {
+    (PyCFunction) SwigPyObject_own,
+    (PyCFunction) SwigPyObject_own
+  };
+  static PyGetSetDef thisown_getset_def = {
+    (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
+  };
+  PyObject *metatype_args;
+  PyTypeObject *builtin_pytype;
+  int builtin_base_count;
+  swig_type_info *builtin_basetype;
+  PyObject *tuple;
+  PyGetSetDescrObject *static_getset;
+  PyTypeObject *metatype;
+  SwigPyClientData *cd;
+  PyObject *public_interface, *public_symbol;
+  PyObject *this_descr;
+  PyObject *thisown_descr;
+  PyObject *self = 0;
+  int i;
+  
+  (void)builtin_pytype;
+  (void)builtin_base_count;
+  (void)builtin_basetype;
+  (void)tuple;
+  (void)static_getset;
+  (void)self;
+  
+  /* metatype is used to implement static member variables. */
+  metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type);
+  assert(metatype_args);
+  metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL);
+  assert(metatype);
+  Py_DECREF(metatype_args);
+  metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro;
+  assert(PyType_Ready(metatype) >= 0);
+#endif
+  
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial);
+  
+#if PY_VERSION_HEX >= 0x03000000
+  m = PyModule_Create(&SWIG_module);
+#else
+  m = Py_InitModule((char *) SWIG_name, SwigMethods);
+#endif
+  
+  md = d = PyModule_GetDict(m);
+  (void)md;
+  
+  SWIG_InitializeModule(0);
+  
+#ifdef SWIGPYTHON_BUILTIN
+  SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject");
+  assert(SwigPyObject_stype);
+  cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+  if (!cd) {
+    SwigPyObject_stype->clientdata = &SwigPyObject_clientdata;
+    SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce();
+  } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) {
+    PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules.");
+# if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+# else
+    return;
+# endif
+  }
+  
+  /* All objects have a 'this' attribute */
+  this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def);
+  (void)this_descr;
+  
+  /* All objects have a 'thisown' attribute */
+  thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def);
+  (void)thisown_descr;
+  
+  public_interface = PyList_New(0);
+  public_symbol = 0;
+  (void)public_symbol;
+  
+  PyDict_SetItemString(md, "__all__", public_interface);
+  Py_DECREF(public_interface);
+  for (i = 0; SwigMethods[i].ml_name != NULL; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name);
+  for (i = 0; swig_const_table[i].name != 0; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name);
+#endif
+  
+  SWIG_InstallConstants(d,swig_const_table);
+  
+  
+  import_array();
+  
+  PyDict_SetItemString(md,(char*)"cvar", SWIG_globals());
+  SWIG_addvarlink(SWIG_globals(),(char*)"major_version_number",Swig_var_major_version_number_get, Swig_var_major_version_number_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"minor_version_number",Swig_var_minor_version_number_get, Swig_var_minor_version_number_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"patch_version_number",Swig_var_patch_version_number_get, Swig_var_patch_version_number_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"PI2",Swig_var_PI2_get, Swig_var_PI2_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"nanometer",Swig_var_nanometer_get, Swig_var_nanometer_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"angstrom",Swig_var_angstrom_get, Swig_var_angstrom_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"micrometer",Swig_var_micrometer_get, Swig_var_micrometer_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"millimeter",Swig_var_millimeter_get, Swig_var_millimeter_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"meter",Swig_var_meter_get, Swig_var_meter_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"nm",Swig_var_nm_get, Swig_var_nm_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"radian",Swig_var_radian_get, Swig_var_radian_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"milliradian",Swig_var_milliradian_get, Swig_var_milliradian_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"degree",Swig_var_degree_get, Swig_var_degree_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"steradian",Swig_var_steradian_get, Swig_var_steradian_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"rad",Swig_var_rad_get, Swig_var_rad_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"mrad",Swig_var_mrad_get, Swig_var_mrad_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"sr",Swig_var_sr_get, Swig_var_sr_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"deg",Swig_var_deg_get, Swig_var_deg_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"tesla",Swig_var_tesla_get, Swig_var_tesla_set);
+  SWIG_addvarlink(SWIG_globals(),(char*)"gauss",Swig_var_gauss_get, Swig_var_gauss_set);
+  SWIG_Python_SetConstant(d, "IHistogram_INTEGRAL",SWIG_From_int(static_cast< int >(IHistogram::INTEGRAL)));
+  SWIG_Python_SetConstant(d, "IHistogram_AVERAGE",SWIG_From_int(static_cast< int >(IHistogram::AVERAGE)));
+  SWIG_Python_SetConstant(d, "IHistogram_STANDARD_ERROR",SWIG_From_int(static_cast< int >(IHistogram::STANDARD_ERROR)));
+  SWIG_Python_SetConstant(d, "IHistogram_NENTRIES",SWIG_From_int(static_cast< int >(IHistogram::NENTRIES)));
+  SWIG_Python_SetConstant(d, "IDetector2D_DEFAULT",SWIG_From_int(static_cast< int >(IDetector2D::DEFAULT)));
+  SWIG_Python_SetConstant(d, "IDetector2D_NBINS",SWIG_From_int(static_cast< int >(IDetector2D::NBINS)));
+  SWIG_Python_SetConstant(d, "IDetector2D_RADIANS",SWIG_From_int(static_cast< int >(IDetector2D::RADIANS)));
+  SWIG_Python_SetConstant(d, "IDetector2D_DEGREES",SWIG_From_int(static_cast< int >(IDetector2D::DEGREES)));
+  SWIG_Python_SetConstant(d, "IDetector2D_MM",SWIG_From_int(static_cast< int >(IDetector2D::MM)));
+  SWIG_Python_SetConstant(d, "IDetector2D_QYQZ",SWIG_From_int(static_cast< int >(IDetector2D::QYQZ)));
+  SWIG_Python_SetConstant(d, "ILayout_DA",SWIG_From_int(static_cast< int >(ILayout::DA)));
+  SWIG_Python_SetConstant(d, "ILayout_SSCA",SWIG_From_int(static_cast< int >(ILayout::SSCA)));
+  SWIG_Python_SetConstant(d, "RectangularDetector_GENERIC",SWIG_From_int(static_cast< int >(RectangularDetector::GENERIC)));
+  SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_SAMPLE",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_SAMPLE)));
+  SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_DIRECT_BEAM",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_DIRECT_BEAM)));
+  SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_REFLECTED_BEAM",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM)));
+  SWIG_Python_SetConstant(d, "RectangularDetector_PERPENDICULAR_TO_REFLECTED_BEAM_DPOS",SWIG_From_int(static_cast< int >(RectangularDetector::PERPENDICULAR_TO_REFLECTED_BEAM_DPOS)));
+#if PY_VERSION_HEX >= 0x03000000
+  return m;
+#else
+  return;
+#endif
+}
+
diff --git a/auto/Wrap/libBornAgainCore_wrap.h b/auto/Wrap/libBornAgainCore_wrap.h
new file mode 100644
index 0000000..d24f1bc
--- /dev/null
+++ b/auto/Wrap/libBornAgainCore_wrap.h
@@ -0,0 +1,415 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 3.0.8
+ *
+ * This file is not intended to be easily readable and contains a number of
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+#ifndef SWIG_libBornAgainCore_WRAP_H_
+#define SWIG_libBornAgainCore_WRAP_H_
+
+#include <map>
+#include <string>
+
+
+class SwigDirector_INamed : public INamed, public Swig::Director {
+
+public:
+    SwigDirector_INamed(PyObject *self);
+    SwigDirector_INamed(PyObject *self, std::string const &name);
+    virtual ~SwigDirector_INamed();
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+};
+
+
+class SwigDirector_IParameterized : public IParameterized, public Swig::Director {
+
+public:
+    SwigDirector_IParameterized(PyObject *self, std::string const &name = "");
+    SwigDirector_IParameterized(PyObject *self, IParameterized const &other);
+    virtual ~SwigDirector_IParameterized();
+    virtual std::string addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number = -1) const;
+    virtual void onChange();
+    virtual void onChangeSwigPublic() {
+      IParameterized::onChange();
+    }
+    virtual void print(std::ostream &ostr) const;
+    virtual void printSwigPublic(std::ostream &ostr) const {
+      IParameterized::print(ostr);
+    }
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+/* VTable implementation */
+    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
+      PyObject *method = vtable[method_index];
+      if (!method) {
+        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
+        method = PyObject_GetAttr(swig_get_self(), name);
+        if (!method) {
+          std::string msg = "Method in class IParameterized doesn't exist, undefined ";
+          msg += method_name;
+          Swig::DirectorMethodException::raise(msg.c_str());
+        }
+        vtable[method_index] = method;
+      }
+      return method;
+    }
+private:
+    mutable swig::SwigVar_PyObject vtable[2];
+#endif
+
+};
+
+
+class SwigDirector_ISample : public ISample, public Swig::Director {
+
+public:
+    SwigDirector_ISample(PyObject *self);
+    virtual ~SwigDirector_ISample();
+    virtual ISample *clone() const;
+    virtual void transferToCPP();
+    virtual std::string addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number = -1) const;
+    virtual void onChange();
+    virtual void onChangeSwigPublic() {
+      IParameterized::onChange();
+    }
+    virtual void print(std::ostream &ostr) const;
+    virtual void printSwigPublic(std::ostream &ostr) const {
+      IParameterized::print(ostr);
+    }
+    virtual ISample *cloneInvertB() const;
+    virtual void accept(ISampleVisitor *p_visitor) const;
+    virtual std::string to_str(int indent = 0) const;
+    virtual IMaterial const *getMaterial() const;
+    virtual IMaterial const *getAmbientMaterial() const;
+    virtual std::vector< ISample const *,std::allocator< ISample const * > > getChildren() const;
+    virtual size_t size() const;
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+/* VTable implementation */
+    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
+      PyObject *method = vtable[method_index];
+      if (!method) {
+        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
+        method = PyObject_GetAttr(swig_get_self(), name);
+        if (!method) {
+          std::string msg = "Method in class ISample doesn't exist, undefined ";
+          msg += method_name;
+          Swig::DirectorMethodException::raise(msg.c_str());
+        }
+        vtable[method_index] = method;
+      }
+      return method;
+    }
+private:
+    mutable swig::SwigVar_PyObject vtable[12];
+#endif
+
+};
+
+
+class SwigDirector_IObservable : public IObservable, public Swig::Director {
+
+public:
+    SwigDirector_IObservable(PyObject *self);
+    virtual ~SwigDirector_IObservable();
+    virtual void attachObserver(IObservable::observer_t obj);
+    virtual void notifyObservers();
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+/* VTable implementation */
+    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
+      PyObject *method = vtable[method_index];
+      if (!method) {
+        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
+        method = PyObject_GetAttr(swig_get_self(), name);
+        if (!method) {
+          std::string msg = "Method in class IObservable doesn't exist, undefined ";
+          msg += method_name;
+          Swig::DirectorMethodException::raise(msg.c_str());
+        }
+        vtable[method_index] = method;
+      }
+      return method;
+    }
+private:
+    mutable swig::SwigVar_PyObject vtable[2];
+#endif
+
+};
+
+
+class SwigDirector_IFitObserver : public IFitObserver, public Swig::Director {
+
+public:
+    SwigDirector_IFitObserver(PyObject *self, int update_every_nth);
+    virtual ~SwigDirector_IFitObserver();
+    virtual void notify(IObservable *subject);
+    virtual void update(FitSuite *fit_suite);
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+/* VTable implementation */
+    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
+      PyObject *method = vtable[method_index];
+      if (!method) {
+        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
+        method = PyObject_GetAttr(swig_get_self(), name);
+        if (!method) {
+          std::string msg = "Method in class IFitObserver doesn't exist, undefined ";
+          msg += method_name;
+          Swig::DirectorMethodException::raise(msg.c_str());
+        }
+        vtable[method_index] = method;
+      }
+      return method;
+    }
+private:
+    mutable swig::SwigVar_PyObject vtable[2];
+#endif
+
+};
+
+
+class SwigDirector_IMultiLayerBuilder : public IMultiLayerBuilder, public Swig::Director {
+
+public:
+    SwigDirector_IMultiLayerBuilder(PyObject *self);
+    virtual ~SwigDirector_IMultiLayerBuilder();
+    virtual std::string addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number = -1) const;
+    virtual void onChange();
+    virtual void onChangeSwigPublic() {
+      IParameterized::onChange();
+    }
+    virtual void print(std::ostream &ostr) const;
+    virtual void printSwigPublic(std::ostream &ostr) const {
+      IParameterized::print(ostr);
+    }
+    virtual MultiLayer *buildSample() const;
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+/* VTable implementation */
+    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
+      PyObject *method = vtable[method_index];
+      if (!method) {
+        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
+        method = PyObject_GetAttr(swig_get_self(), name);
+        if (!method) {
+          std::string msg = "Method in class IMultiLayerBuilder doesn't exist, undefined ";
+          msg += method_name;
+          Swig::DirectorMethodException::raise(msg.c_str());
+        }
+        vtable[method_index] = method;
+      }
+      return method;
+    }
+private:
+    mutable swig::SwigVar_PyObject vtable[3];
+#endif
+
+};
+
+
+class SwigDirector_IFormFactor : public IFormFactor, public Swig::Director {
+
+public:
+    SwigDirector_IFormFactor(PyObject *self);
+    virtual ~SwigDirector_IFormFactor();
+    virtual IFormFactor *clone() const;
+    virtual void transferToCPP();
+    virtual std::string addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number = -1) const;
+    virtual void onChange();
+    virtual void onChangeSwigPublic() {
+      IParameterized::onChange();
+    }
+    virtual void print(std::ostream &ostr) const;
+    virtual void printSwigPublic(std::ostream &ostr) const {
+      IParameterized::print(ostr);
+    }
+    virtual ISample *cloneInvertB() const;
+    virtual void accept(ISampleVisitor *visitor) const;
+    virtual std::string to_str(int indent = 0) const;
+    virtual IMaterial const *getMaterial() const;
+    virtual IMaterial const *getAmbientMaterial() const;
+    virtual std::vector< ISample const *,std::allocator< ISample const * > > getChildren() const;
+    virtual size_t size() const;
+    virtual void setAmbientMaterial(IMaterial const &arg0);
+    virtual complex_t evaluate(WavevectorInfo const &wavevectors) const;
+    virtual double getVolume() const;
+    virtual double getRadialExtension() const;
+    virtual void setSpecularInfo(ILayerRTCoefficients const *arg0, ILayerRTCoefficients const *arg1);
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+/* VTable implementation */
+    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
+      PyObject *method = vtable[method_index];
+      if (!method) {
+        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
+        method = PyObject_GetAttr(swig_get_self(), name);
+        if (!method) {
+          std::string msg = "Method in class IFormFactor doesn't exist, undefined ";
+          msg += method_name;
+          Swig::DirectorMethodException::raise(msg.c_str());
+        }
+        vtable[method_index] = method;
+      }
+      return method;
+    }
+private:
+    mutable swig::SwigVar_PyObject vtable[17];
+#endif
+
+};
+
+
+class SwigDirector_IFormFactorBorn : public IFormFactorBorn, public Swig::Director {
+
+public:
+    SwigDirector_IFormFactorBorn(PyObject *self);
+    virtual ~SwigDirector_IFormFactorBorn();
+    virtual IFormFactorBorn *clone() const;
+    virtual void transferToCPP();
+    virtual std::string addParametersToExternalPool(std::string const &path, ParameterPool *external_pool, int copy_number = -1) const;
+    virtual void onChange();
+    virtual void onChangeSwigPublic() {
+      IParameterized::onChange();
+    }
+    virtual void print(std::ostream &ostr) const;
+    virtual void printSwigPublic(std::ostream &ostr) const {
+      IParameterized::print(ostr);
+    }
+    virtual ISample *cloneInvertB() const;
+    virtual void accept(ISampleVisitor *visitor) const;
+    virtual std::string to_str(int indent = 0) const;
+    virtual IMaterial const *getMaterial() const;
+    virtual IMaterial const *getAmbientMaterial() const;
+    virtual std::vector< ISample const *,std::allocator< ISample const * > > getChildren() const;
+    virtual size_t size() const;
+    virtual void setAmbientMaterial(IMaterial const &arg0);
+    virtual complex_t evaluate(WavevectorInfo const &wavevectors) const;
+    virtual double getVolume() const;
+    virtual double getRadialExtension() const;
+    virtual void setSpecularInfo(ILayerRTCoefficients const *arg0, ILayerRTCoefficients const *arg1);
+    virtual complex_t evaluate_for_q(cvector_t const q) const;
+
+/* Internal director utilities */
+public:
+    bool swig_get_inner(const char *swig_protected_method_name) const {
+      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
+      return (iv != swig_inner.end() ? iv->second : false);
+    }
+    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
+      swig_inner[swig_protected_method_name] = swig_val;
+    }
+private:
+    mutable std::map<std::string, bool> swig_inner;
+
+#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
+/* VTable implementation */
+    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
+      PyObject *method = vtable[method_index];
+      if (!method) {
+        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
+        method = PyObject_GetAttr(swig_get_self(), name);
+        if (!method) {
+          std::string msg = "Method in class IFormFactorBorn doesn't exist, undefined ";
+          msg += method_name;
+          Swig::DirectorMethodException::raise(msg.c_str());
+        }
+        vtable[method_index] = method;
+      }
+      return method;
+    }
+private:
+    mutable swig::SwigVar_PyObject vtable[18];
+#endif
+
+};
+
+
+#endif
diff --git a/auto/Wrap/libBornAgainFit.py b/auto/Wrap/libBornAgainFit.py
new file mode 100644
index 0000000..d612c25
--- /dev/null
+++ b/auto/Wrap/libBornAgainFit.py
@@ -0,0 +1,2548 @@
+# This file was automatically generated by SWIG (http://www.swig.org).
+# Version 3.0.8
+#
+# Do not make changes to this file unless you know what you are doing--modify
+# the SWIG interface file instead.
+
+
+
+
+
+from sys import version_info
+if version_info >= (2, 6, 0):
+    def swig_import_helper():
+        from os.path import dirname
+        import imp
+        fp = None
+        try:
+            fp, pathname, description = imp.find_module('_libBornAgainFit', [dirname(__file__)])
+        except ImportError:
+            import _libBornAgainFit
+            return _libBornAgainFit
+        if fp is not None:
+            try:
+                _mod = imp.load_module('_libBornAgainFit', fp, pathname, description)
+            finally:
+                fp.close()
+            return _mod
+    _libBornAgainFit = swig_import_helper()
+    del swig_import_helper
+else:
+    import _libBornAgainFit
+del version_info
+try:
+    _swig_property = property
+except NameError:
+    pass  # Python < 2.2 doesn't have 'property'.
+
+
+def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
+    if (name == "thisown"):
+        return self.this.own(value)
+    if (name == "this"):
+        if type(value).__name__ == 'SwigPyObject':
+            self.__dict__[name] = value
+            return
+    method = class_type.__swig_setmethods__.get(name, None)
+    if method:
+        return method(self, value)
+    if (not static):
+        if _newclass:
+            object.__setattr__(self, name, value)
+        else:
+            self.__dict__[name] = value
+    else:
+        raise AttributeError("You cannot add attributes to %s" % self)
+
+
+def _swig_setattr(self, class_type, name, value):
+    return _swig_setattr_nondynamic(self, class_type, name, value, 0)
+
+
+def _swig_getattr_nondynamic(self, class_type, name, static=1):
+    if (name == "thisown"):
+        return self.this.own()
+    method = class_type.__swig_getmethods__.get(name, None)
+    if method:
+        return method(self)
+    if (not static):
+        return object.__getattr__(self, name)
+    else:
+        raise AttributeError(name)
+
+def _swig_getattr(self, class_type, name):
+    return _swig_getattr_nondynamic(self, class_type, name, 0)
+
+
+def _swig_repr(self):
+    try:
+        strthis = "proxy of " + self.this.__repr__()
+    except Exception:
+        strthis = ""
+    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
+
+try:
+    _object = object
+    _newclass = 1
+except AttributeError:
+    class _object:
+        pass
+    _newclass = 0
+
+
+try:
+    import weakref
+    weakref_proxy = weakref.proxy
+except Exception:
+    weakref_proxy = lambda x: x
+
+
+class SwigPyIterator(_object):
+    """Proxy of C++ swig::SwigPyIterator class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, SwigPyIterator, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, SwigPyIterator, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_SwigPyIterator
+    __del__ = lambda self: None
+
+    def value(self):
+        """value(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainFit.SwigPyIterator_value(self)
+
+
+    def incr(self, n=1):
+        """
+        incr(SwigPyIterator self, size_t n=1) -> SwigPyIterator
+        incr(SwigPyIterator self) -> SwigPyIterator
+        """
+        return _libBornAgainFit.SwigPyIterator_incr(self, n)
+
+
+    def decr(self, n=1):
+        """
+        decr(SwigPyIterator self, size_t n=1) -> SwigPyIterator
+        decr(SwigPyIterator self) -> SwigPyIterator
+        """
+        return _libBornAgainFit.SwigPyIterator_decr(self, n)
+
+
+    def distance(self, x):
+        """distance(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t"""
+        return _libBornAgainFit.SwigPyIterator_distance(self, x)
+
+
+    def equal(self, x):
+        """equal(SwigPyIterator self, SwigPyIterator x) -> bool"""
+        return _libBornAgainFit.SwigPyIterator_equal(self, x)
+
+
+    def copy(self):
+        """copy(SwigPyIterator self) -> SwigPyIterator"""
+        return _libBornAgainFit.SwigPyIterator_copy(self)
+
+
+    def next(self):
+        """next(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainFit.SwigPyIterator_next(self)
+
+
+    def __next__(self):
+        """__next__(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainFit.SwigPyIterator___next__(self)
+
+
+    def previous(self):
+        """previous(SwigPyIterator self) -> PyObject *"""
+        return _libBornAgainFit.SwigPyIterator_previous(self)
+
+
+    def advance(self, n):
+        """advance(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainFit.SwigPyIterator_advance(self, n)
+
+
+    def __eq__(self, x):
+        """__eq__(SwigPyIterator self, SwigPyIterator x) -> bool"""
+        return _libBornAgainFit.SwigPyIterator___eq__(self, x)
+
+
+    def __ne__(self, x):
+        """__ne__(SwigPyIterator self, SwigPyIterator x) -> bool"""
+        return _libBornAgainFit.SwigPyIterator___ne__(self, x)
+
+
+    def __iadd__(self, n):
+        """__iadd__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainFit.SwigPyIterator___iadd__(self, n)
+
+
+    def __isub__(self, n):
+        """__isub__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainFit.SwigPyIterator___isub__(self, n)
+
+
+    def __add__(self, n):
+        """__add__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"""
+        return _libBornAgainFit.SwigPyIterator___add__(self, n)
+
+
+    def __sub__(self, *args):
+        """
+        __sub__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator
+        __sub__(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t
+        """
+        return _libBornAgainFit.SwigPyIterator___sub__(self, *args)
+
+    def __iter__(self):
+        return self
+SwigPyIterator_swigregister = _libBornAgainFit.SwigPyIterator_swigregister
+SwigPyIterator_swigregister(SwigPyIterator)
+
+
+_libBornAgainFit.SHARED_PTR_DISOWN_swigconstant(_libBornAgainFit)
+SHARED_PTR_DISOWN = _libBornAgainFit.SHARED_PTR_DISOWN
+class vdouble1d_t(_object):
+    """Proxy of C++ std::vector<(double)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vdouble1d_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vdouble1d_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vdouble1d_t self) -> SwigPyIterator"""
+        return _libBornAgainFit.vdouble1d_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vdouble1d_t self) -> bool"""
+        return _libBornAgainFit.vdouble1d_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vdouble1d_t self) -> bool"""
+        return _libBornAgainFit.vdouble1d_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vdouble1d_t self) -> std::vector< double >::size_type"""
+        return _libBornAgainFit.vdouble1d_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j) -> vdouble1d_t"""
+        return _libBornAgainFit.vdouble1d_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j)
+        __setslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j, vdouble1d_t v)
+        """
+        return _libBornAgainFit.vdouble1d_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j)"""
+        return _libBornAgainFit.vdouble1d_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vdouble1d_t self, std::vector< double >::difference_type i)
+        __delitem__(vdouble1d_t self, PySliceObject * slice)
+        """
+        return _libBornAgainFit.vdouble1d_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vdouble1d_t self, PySliceObject * slice) -> vdouble1d_t
+        __getitem__(vdouble1d_t self, std::vector< double >::difference_type i) -> std::vector< double >::value_type const &
+        """
+        return _libBornAgainFit.vdouble1d_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vdouble1d_t self, PySliceObject * slice, vdouble1d_t v)
+        __setitem__(vdouble1d_t self, PySliceObject * slice)
+        __setitem__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::value_type const & x)
+        """
+        return _libBornAgainFit.vdouble1d_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vdouble1d_t self) -> std::vector< double >::value_type"""
+        return _libBornAgainFit.vdouble1d_t_pop(self)
+
+
+    def append(self, x):
+        """append(vdouble1d_t self, std::vector< double >::value_type const & x)"""
+        return _libBornAgainFit.vdouble1d_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vdouble1d_t self) -> bool"""
+        return _libBornAgainFit.vdouble1d_t_empty(self)
+
+
+    def size(self):
+        """size(vdouble1d_t self) -> std::vector< double >::size_type"""
+        return _libBornAgainFit.vdouble1d_t_size(self)
+
+
+    def swap(self, v):
+        """swap(vdouble1d_t self, vdouble1d_t v)"""
+        return _libBornAgainFit.vdouble1d_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vdouble1d_t self) -> std::vector< double >::iterator"""
+        return _libBornAgainFit.vdouble1d_t_begin(self)
+
+
+    def end(self):
+        """end(vdouble1d_t self) -> std::vector< double >::iterator"""
+        return _libBornAgainFit.vdouble1d_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vdouble1d_t self) -> std::vector< double >::reverse_iterator"""
+        return _libBornAgainFit.vdouble1d_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vdouble1d_t self) -> std::vector< double >::reverse_iterator"""
+        return _libBornAgainFit.vdouble1d_t_rend(self)
+
+
+    def clear(self):
+        """clear(vdouble1d_t self)"""
+        return _libBornAgainFit.vdouble1d_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vdouble1d_t self) -> std::vector< double >::allocator_type"""
+        return _libBornAgainFit.vdouble1d_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vdouble1d_t self)"""
+        return _libBornAgainFit.vdouble1d_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vdouble1d_t self, std::vector< double >::iterator pos) -> std::vector< double >::iterator
+        erase(vdouble1d_t self, std::vector< double >::iterator first, std::vector< double >::iterator last) -> std::vector< double >::iterator
+        """
+        return _libBornAgainFit.vdouble1d_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(double)> self) -> vdouble1d_t
+        __init__(std::vector<(double)> self, vdouble1d_t arg2) -> vdouble1d_t
+        __init__(std::vector<(double)> self, std::vector< double >::size_type size) -> vdouble1d_t
+        __init__(std::vector<(double)> self, std::vector< double >::size_type size, std::vector< double >::value_type const & value) -> vdouble1d_t
+        """
+        this = _libBornAgainFit.new_vdouble1d_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vdouble1d_t self, std::vector< double >::value_type const & x)"""
+        return _libBornAgainFit.vdouble1d_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vdouble1d_t self) -> std::vector< double >::value_type const &"""
+        return _libBornAgainFit.vdouble1d_t_front(self)
+
+
+    def back(self):
+        """back(vdouble1d_t self) -> std::vector< double >::value_type const &"""
+        return _libBornAgainFit.vdouble1d_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vdouble1d_t self, std::vector< double >::size_type n, std::vector< double >::value_type const & x)"""
+        return _libBornAgainFit.vdouble1d_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vdouble1d_t self, std::vector< double >::size_type new_size)
+        resize(vdouble1d_t self, std::vector< double >::size_type new_size, std::vector< double >::value_type const & x)
+        """
+        return _libBornAgainFit.vdouble1d_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vdouble1d_t self, std::vector< double >::iterator pos, std::vector< double >::value_type const & x) -> std::vector< double >::iterator
+        insert(vdouble1d_t self, std::vector< double >::iterator pos, std::vector< double >::size_type n, std::vector< double >::value_type const & x)
+        """
+        return _libBornAgainFit.vdouble1d_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vdouble1d_t self, std::vector< double >::size_type n)"""
+        return _libBornAgainFit.vdouble1d_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vdouble1d_t self) -> std::vector< double >::size_type"""
+        return _libBornAgainFit.vdouble1d_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainFit.delete_vdouble1d_t
+    __del__ = lambda self: None
+vdouble1d_t_swigregister = _libBornAgainFit.vdouble1d_t_swigregister
+vdouble1d_t_swigregister(vdouble1d_t)
+
+class vdouble2d_t(_object):
+    """Proxy of C++ std::vector<(std::vector<(double)>)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vdouble2d_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vdouble2d_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vdouble2d_t self) -> SwigPyIterator"""
+        return _libBornAgainFit.vdouble2d_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vdouble2d_t self) -> bool"""
+        return _libBornAgainFit.vdouble2d_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vdouble2d_t self) -> bool"""
+        return _libBornAgainFit.vdouble2d_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"""
+        return _libBornAgainFit.vdouble2d_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j) -> vdouble2d_t"""
+        return _libBornAgainFit.vdouble2d_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)
+        __setslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j, vdouble2d_t v)
+        """
+        return _libBornAgainFit.vdouble2d_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)"""
+        return _libBornAgainFit.vdouble2d_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i)
+        __delitem__(vdouble2d_t self, PySliceObject * slice)
+        """
+        return _libBornAgainFit.vdouble2d_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vdouble2d_t self, PySliceObject * slice) -> vdouble2d_t
+        __getitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i) -> vdouble1d_t
+        """
+        return _libBornAgainFit.vdouble2d_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vdouble2d_t self, PySliceObject * slice, vdouble2d_t v)
+        __setitem__(vdouble2d_t self, PySliceObject * slice)
+        __setitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, vdouble1d_t x)
+        """
+        return _libBornAgainFit.vdouble2d_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vdouble2d_t self) -> vdouble1d_t"""
+        return _libBornAgainFit.vdouble2d_t_pop(self)
+
+
+    def append(self, x):
+        """append(vdouble2d_t self, vdouble1d_t x)"""
+        return _libBornAgainFit.vdouble2d_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vdouble2d_t self) -> bool"""
+        return _libBornAgainFit.vdouble2d_t_empty(self)
+
+
+    def size(self):
+        """size(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"""
+        return _libBornAgainFit.vdouble2d_t_size(self)
+
+
+    def swap(self, v):
+        """swap(vdouble2d_t self, vdouble2d_t v)"""
+        return _libBornAgainFit.vdouble2d_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"""
+        return _libBornAgainFit.vdouble2d_t_begin(self)
+
+
+    def end(self):
+        """end(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"""
+        return _libBornAgainFit.vdouble2d_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"""
+        return _libBornAgainFit.vdouble2d_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"""
+        return _libBornAgainFit.vdouble2d_t_rend(self)
+
+
+    def clear(self):
+        """clear(vdouble2d_t self)"""
+        return _libBornAgainFit.vdouble2d_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vdouble2d_t self) -> std::vector< std::vector< double > >::allocator_type"""
+        return _libBornAgainFit.vdouble2d_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vdouble2d_t self)"""
+        return _libBornAgainFit.vdouble2d_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos) -> std::vector< std::vector< double > >::iterator
+        erase(vdouble2d_t self, std::vector< std::vector< double > >::iterator first, std::vector< std::vector< double > >::iterator last) -> std::vector< std::vector< double > >::iterator
+        """
+        return _libBornAgainFit.vdouble2d_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(std::vector<(double)>)> self) -> vdouble2d_t
+        __init__(std::vector<(std::vector<(double)>)> self, vdouble2d_t arg2) -> vdouble2d_t
+        __init__(std::vector<(std::vector<(double)>)> self, std::vector< std::vector< double > >::size_type size) -> vdouble2d_t
+        __init__(std::vector<(std::vector<(double)>)> self, std::vector< std::vector< double > >::size_type size, vdouble1d_t value) -> vdouble2d_t
+        """
+        this = _libBornAgainFit.new_vdouble2d_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vdouble2d_t self, vdouble1d_t x)"""
+        return _libBornAgainFit.vdouble2d_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vdouble2d_t self) -> vdouble1d_t"""
+        return _libBornAgainFit.vdouble2d_t_front(self)
+
+
+    def back(self):
+        """back(vdouble2d_t self) -> vdouble1d_t"""
+        return _libBornAgainFit.vdouble2d_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vdouble2d_t self, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)"""
+        return _libBornAgainFit.vdouble2d_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vdouble2d_t self, std::vector< std::vector< double > >::size_type new_size)
+        resize(vdouble2d_t self, std::vector< std::vector< double > >::size_type new_size, vdouble1d_t x)
+        """
+        return _libBornAgainFit.vdouble2d_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos, vdouble1d_t x) -> std::vector< std::vector< double > >::iterator
+        insert(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)
+        """
+        return _libBornAgainFit.vdouble2d_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vdouble2d_t self, std::vector< std::vector< double > >::size_type n)"""
+        return _libBornAgainFit.vdouble2d_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"""
+        return _libBornAgainFit.vdouble2d_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainFit.delete_vdouble2d_t
+    __del__ = lambda self: None
+vdouble2d_t_swigregister = _libBornAgainFit.vdouble2d_t_swigregister
+vdouble2d_t_swigregister(vdouble2d_t)
+
+class vector_integer_t(_object):
+    """Proxy of C++ std::vector<(int)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_integer_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_integer_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_integer_t self) -> SwigPyIterator"""
+        return _libBornAgainFit.vector_integer_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_integer_t self) -> bool"""
+        return _libBornAgainFit.vector_integer_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_integer_t self) -> bool"""
+        return _libBornAgainFit.vector_integer_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_integer_t self) -> std::vector< int >::size_type"""
+        return _libBornAgainFit.vector_integer_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j) -> vector_integer_t"""
+        return _libBornAgainFit.vector_integer_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j)
+        __setslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j, vector_integer_t v)
+        """
+        return _libBornAgainFit.vector_integer_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j)"""
+        return _libBornAgainFit.vector_integer_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_integer_t self, std::vector< int >::difference_type i)
+        __delitem__(vector_integer_t self, PySliceObject * slice)
+        """
+        return _libBornAgainFit.vector_integer_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_integer_t self, PySliceObject * slice) -> vector_integer_t
+        __getitem__(vector_integer_t self, std::vector< int >::difference_type i) -> std::vector< int >::value_type const &
+        """
+        return _libBornAgainFit.vector_integer_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_integer_t self, PySliceObject * slice, vector_integer_t v)
+        __setitem__(vector_integer_t self, PySliceObject * slice)
+        __setitem__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_integer_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_integer_t self) -> std::vector< int >::value_type"""
+        return _libBornAgainFit.vector_integer_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_integer_t self, std::vector< int >::value_type const & x)"""
+        return _libBornAgainFit.vector_integer_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_integer_t self) -> bool"""
+        return _libBornAgainFit.vector_integer_t_empty(self)
+
+
+    def size(self):
+        """size(vector_integer_t self) -> std::vector< int >::size_type"""
+        return _libBornAgainFit.vector_integer_t_size(self)
+
+
+    def swap(self, v):
+        """swap(vector_integer_t self, vector_integer_t v)"""
+        return _libBornAgainFit.vector_integer_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_integer_t self) -> std::vector< int >::iterator"""
+        return _libBornAgainFit.vector_integer_t_begin(self)
+
+
+    def end(self):
+        """end(vector_integer_t self) -> std::vector< int >::iterator"""
+        return _libBornAgainFit.vector_integer_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_integer_t self) -> std::vector< int >::reverse_iterator"""
+        return _libBornAgainFit.vector_integer_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_integer_t self) -> std::vector< int >::reverse_iterator"""
+        return _libBornAgainFit.vector_integer_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_integer_t self)"""
+        return _libBornAgainFit.vector_integer_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_integer_t self) -> std::vector< int >::allocator_type"""
+        return _libBornAgainFit.vector_integer_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_integer_t self)"""
+        return _libBornAgainFit.vector_integer_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_integer_t self, std::vector< int >::iterator pos) -> std::vector< int >::iterator
+        erase(vector_integer_t self, std::vector< int >::iterator first, std::vector< int >::iterator last) -> std::vector< int >::iterator
+        """
+        return _libBornAgainFit.vector_integer_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(int)> self) -> vector_integer_t
+        __init__(std::vector<(int)> self, vector_integer_t arg2) -> vector_integer_t
+        __init__(std::vector<(int)> self, std::vector< int >::size_type size) -> vector_integer_t
+        __init__(std::vector<(int)> self, std::vector< int >::size_type size, std::vector< int >::value_type const & value) -> vector_integer_t
+        """
+        this = _libBornAgainFit.new_vector_integer_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_integer_t self, std::vector< int >::value_type const & x)"""
+        return _libBornAgainFit.vector_integer_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_integer_t self) -> std::vector< int >::value_type const &"""
+        return _libBornAgainFit.vector_integer_t_front(self)
+
+
+    def back(self):
+        """back(vector_integer_t self) -> std::vector< int >::value_type const &"""
+        return _libBornAgainFit.vector_integer_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_integer_t self, std::vector< int >::size_type n, std::vector< int >::value_type const & x)"""
+        return _libBornAgainFit.vector_integer_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_integer_t self, std::vector< int >::size_type new_size)
+        resize(vector_integer_t self, std::vector< int >::size_type new_size, std::vector< int >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_integer_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_integer_t self, std::vector< int >::iterator pos, std::vector< int >::value_type const & x) -> std::vector< int >::iterator
+        insert(vector_integer_t self, std::vector< int >::iterator pos, std::vector< int >::size_type n, std::vector< int >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_integer_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_integer_t self, std::vector< int >::size_type n)"""
+        return _libBornAgainFit.vector_integer_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_integer_t self) -> std::vector< int >::size_type"""
+        return _libBornAgainFit.vector_integer_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainFit.delete_vector_integer_t
+    __del__ = lambda self: None
+vector_integer_t_swigregister = _libBornAgainFit.vector_integer_t_swigregister
+vector_integer_t_swigregister(vector_integer_t)
+
+class vector_longinteger_t(_object):
+    """Proxy of C++ std::vector<(unsigned long)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_longinteger_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_longinteger_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_longinteger_t self) -> SwigPyIterator"""
+        return _libBornAgainFit.vector_longinteger_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_longinteger_t self) -> bool"""
+        return _libBornAgainFit.vector_longinteger_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_longinteger_t self) -> bool"""
+        return _libBornAgainFit.vector_longinteger_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"""
+        return _libBornAgainFit.vector_longinteger_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j) -> vector_longinteger_t"""
+        return _libBornAgainFit.vector_longinteger_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)
+        __setslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j, vector_longinteger_t v)
+        """
+        return _libBornAgainFit.vector_longinteger_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)"""
+        return _libBornAgainFit.vector_longinteger_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i)
+        __delitem__(vector_longinteger_t self, PySliceObject * slice)
+        """
+        return _libBornAgainFit.vector_longinteger_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_longinteger_t self, PySliceObject * slice) -> vector_longinteger_t
+        __getitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i) -> std::vector< unsigned long >::value_type const &
+        """
+        return _libBornAgainFit.vector_longinteger_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_longinteger_t self, PySliceObject * slice, vector_longinteger_t v)
+        __setitem__(vector_longinteger_t self, PySliceObject * slice)
+        __setitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_longinteger_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_longinteger_t self) -> std::vector< unsigned long >::value_type"""
+        return _libBornAgainFit.vector_longinteger_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"""
+        return _libBornAgainFit.vector_longinteger_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_longinteger_t self) -> bool"""
+        return _libBornAgainFit.vector_longinteger_t_empty(self)
+
+
+    def size(self):
+        """size(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"""
+        return _libBornAgainFit.vector_longinteger_t_size(self)
+
+
+    def swap(self, v):
+        """swap(vector_longinteger_t self, vector_longinteger_t v)"""
+        return _libBornAgainFit.vector_longinteger_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"""
+        return _libBornAgainFit.vector_longinteger_t_begin(self)
+
+
+    def end(self):
+        """end(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"""
+        return _libBornAgainFit.vector_longinteger_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"""
+        return _libBornAgainFit.vector_longinteger_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"""
+        return _libBornAgainFit.vector_longinteger_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_longinteger_t self)"""
+        return _libBornAgainFit.vector_longinteger_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_longinteger_t self) -> std::vector< unsigned long >::allocator_type"""
+        return _libBornAgainFit.vector_longinteger_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_longinteger_t self)"""
+        return _libBornAgainFit.vector_longinteger_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_longinteger_t self, std::vector< unsigned long >::iterator pos) -> std::vector< unsigned long >::iterator
+        erase(vector_longinteger_t self, std::vector< unsigned long >::iterator first, std::vector< unsigned long >::iterator last) -> std::vector< unsigned long >::iterator
+        """
+        return _libBornAgainFit.vector_longinteger_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(unsigned long)> self) -> vector_longinteger_t
+        __init__(std::vector<(unsigned long)> self, vector_longinteger_t arg2) -> vector_longinteger_t
+        __init__(std::vector<(unsigned long)> self, std::vector< unsigned long >::size_type size) -> vector_longinteger_t
+        __init__(std::vector<(unsigned long)> self, std::vector< unsigned long >::size_type size, std::vector< unsigned long >::value_type const & value) -> vector_longinteger_t
+        """
+        this = _libBornAgainFit.new_vector_longinteger_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"""
+        return _libBornAgainFit.vector_longinteger_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"""
+        return _libBornAgainFit.vector_longinteger_t_front(self)
+
+
+    def back(self):
+        """back(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"""
+        return _libBornAgainFit.vector_longinteger_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_longinteger_t self, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)"""
+        return _libBornAgainFit.vector_longinteger_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_longinteger_t self, std::vector< unsigned long >::size_type new_size)
+        resize(vector_longinteger_t self, std::vector< unsigned long >::size_type new_size, std::vector< unsigned long >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_longinteger_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_longinteger_t self, std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::value_type const & x) -> std::vector< unsigned long >::iterator
+        insert(vector_longinteger_t self, std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_longinteger_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_longinteger_t self, std::vector< unsigned long >::size_type n)"""
+        return _libBornAgainFit.vector_longinteger_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"""
+        return _libBornAgainFit.vector_longinteger_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainFit.delete_vector_longinteger_t
+    __del__ = lambda self: None
+vector_longinteger_t_swigregister = _libBornAgainFit.vector_longinteger_t_swigregister
+vector_longinteger_t_swigregister(vector_longinteger_t)
+
+class vector_complex_t(_object):
+    """Proxy of C++ std::vector<(std::complex<(double)>)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_complex_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_complex_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_complex_t self) -> SwigPyIterator"""
+        return _libBornAgainFit.vector_complex_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_complex_t self) -> bool"""
+        return _libBornAgainFit.vector_complex_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_complex_t self) -> bool"""
+        return _libBornAgainFit.vector_complex_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"""
+        return _libBornAgainFit.vector_complex_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j) -> vector_complex_t"""
+        return _libBornAgainFit.vector_complex_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)
+        __setslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j, vector_complex_t v)
+        """
+        return _libBornAgainFit.vector_complex_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)"""
+        return _libBornAgainFit.vector_complex_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i)
+        __delitem__(vector_complex_t self, PySliceObject * slice)
+        """
+        return _libBornAgainFit.vector_complex_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_complex_t self, PySliceObject * slice) -> vector_complex_t
+        __getitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i) -> std::vector< std::complex< double > >::value_type const &
+        """
+        return _libBornAgainFit.vector_complex_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_complex_t self, PySliceObject * slice, vector_complex_t v)
+        __setitem__(vector_complex_t self, PySliceObject * slice)
+        __setitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_complex_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_complex_t self) -> std::vector< std::complex< double > >::value_type"""
+        return _libBornAgainFit.vector_complex_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"""
+        return _libBornAgainFit.vector_complex_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_complex_t self) -> bool"""
+        return _libBornAgainFit.vector_complex_t_empty(self)
+
+
+    def size(self):
+        """size(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"""
+        return _libBornAgainFit.vector_complex_t_size(self)
+
+
+    def swap(self, v):
+        """swap(vector_complex_t self, vector_complex_t v)"""
+        return _libBornAgainFit.vector_complex_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"""
+        return _libBornAgainFit.vector_complex_t_begin(self)
+
+
+    def end(self):
+        """end(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"""
+        return _libBornAgainFit.vector_complex_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"""
+        return _libBornAgainFit.vector_complex_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"""
+        return _libBornAgainFit.vector_complex_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_complex_t self)"""
+        return _libBornAgainFit.vector_complex_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_complex_t self) -> std::vector< std::complex< double > >::allocator_type"""
+        return _libBornAgainFit.vector_complex_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_complex_t self)"""
+        return _libBornAgainFit.vector_complex_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_complex_t self, std::vector< std::complex< double > >::iterator pos) -> std::vector< std::complex< double > >::iterator
+        erase(vector_complex_t self, std::vector< std::complex< double > >::iterator first, std::vector< std::complex< double > >::iterator last) -> std::vector< std::complex< double > >::iterator
+        """
+        return _libBornAgainFit.vector_complex_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(std::complex<(double)>)> self) -> vector_complex_t
+        __init__(std::vector<(std::complex<(double)>)> self, vector_complex_t arg2) -> vector_complex_t
+        __init__(std::vector<(std::complex<(double)>)> self, std::vector< std::complex< double > >::size_type size) -> vector_complex_t
+        __init__(std::vector<(std::complex<(double)>)> self, std::vector< std::complex< double > >::size_type size, std::vector< std::complex< double > >::value_type const & value) -> vector_complex_t
+        """
+        this = _libBornAgainFit.new_vector_complex_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"""
+        return _libBornAgainFit.vector_complex_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"""
+        return _libBornAgainFit.vector_complex_t_front(self)
+
+
+    def back(self):
+        """back(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"""
+        return _libBornAgainFit.vector_complex_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_complex_t self, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)"""
+        return _libBornAgainFit.vector_complex_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_complex_t self, std::vector< std::complex< double > >::size_type new_size)
+        resize(vector_complex_t self, std::vector< std::complex< double > >::size_type new_size, std::vector< std::complex< double > >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_complex_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_complex_t self, std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::value_type const & x) -> std::vector< std::complex< double > >::iterator
+        insert(vector_complex_t self, std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_complex_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_complex_t self, std::vector< std::complex< double > >::size_type n)"""
+        return _libBornAgainFit.vector_complex_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"""
+        return _libBornAgainFit.vector_complex_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainFit.delete_vector_complex_t
+    __del__ = lambda self: None
+vector_complex_t_swigregister = _libBornAgainFit.vector_complex_t_swigregister
+vector_complex_t_swigregister(vector_complex_t)
+
+class vector_string_t(_object):
+    """Proxy of C++ std::vector<(std::string)> class."""
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, vector_string_t, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, vector_string_t, name)
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        """iterator(vector_string_t self) -> SwigPyIterator"""
+        return _libBornAgainFit.vector_string_t_iterator(self)
+
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        """__nonzero__(vector_string_t self) -> bool"""
+        return _libBornAgainFit.vector_string_t___nonzero__(self)
+
+
+    def __bool__(self):
+        """__bool__(vector_string_t self) -> bool"""
+        return _libBornAgainFit.vector_string_t___bool__(self)
+
+
+    def __len__(self):
+        """__len__(vector_string_t self) -> std::vector< std::string >::size_type"""
+        return _libBornAgainFit.vector_string_t___len__(self)
+
+
+    def __getslice__(self, i, j):
+        """__getslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j) -> vector_string_t"""
+        return _libBornAgainFit.vector_string_t___getslice__(self, i, j)
+
+
+    def __setslice__(self, *args):
+        """
+        __setslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)
+        __setslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j, vector_string_t v)
+        """
+        return _libBornAgainFit.vector_string_t___setslice__(self, *args)
+
+
+    def __delslice__(self, i, j):
+        """__delslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)"""
+        return _libBornAgainFit.vector_string_t___delslice__(self, i, j)
+
+
+    def __delitem__(self, *args):
+        """
+        __delitem__(vector_string_t self, std::vector< std::string >::difference_type i)
+        __delitem__(vector_string_t self, PySliceObject * slice)
+        """
+        return _libBornAgainFit.vector_string_t___delitem__(self, *args)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(vector_string_t self, PySliceObject * slice) -> vector_string_t
+        __getitem__(vector_string_t self, std::vector< std::string >::difference_type i) -> std::vector< std::string >::value_type const &
+        """
+        return _libBornAgainFit.vector_string_t___getitem__(self, *args)
+
+
+    def __setitem__(self, *args):
+        """
+        __setitem__(vector_string_t self, PySliceObject * slice, vector_string_t v)
+        __setitem__(vector_string_t self, PySliceObject * slice)
+        __setitem__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_string_t___setitem__(self, *args)
+
+
+    def pop(self):
+        """pop(vector_string_t self) -> std::vector< std::string >::value_type"""
+        return _libBornAgainFit.vector_string_t_pop(self)
+
+
+    def append(self, x):
+        """append(vector_string_t self, std::vector< std::string >::value_type const & x)"""
+        return _libBornAgainFit.vector_string_t_append(self, x)
+
+
+    def empty(self):
+        """empty(vector_string_t self) -> bool"""
+        return _libBornAgainFit.vector_string_t_empty(self)
+
+
+    def size(self):
+        """size(vector_string_t self) -> std::vector< std::string >::size_type"""
+        return _libBornAgainFit.vector_string_t_size(self)
+
+
+    def swap(self, v):
+        """swap(vector_string_t self, vector_string_t v)"""
+        return _libBornAgainFit.vector_string_t_swap(self, v)
+
+
+    def begin(self):
+        """begin(vector_string_t self) -> std::vector< std::string >::iterator"""
+        return _libBornAgainFit.vector_string_t_begin(self)
+
+
+    def end(self):
+        """end(vector_string_t self) -> std::vector< std::string >::iterator"""
+        return _libBornAgainFit.vector_string_t_end(self)
+
+
+    def rbegin(self):
+        """rbegin(vector_string_t self) -> std::vector< std::string >::reverse_iterator"""
+        return _libBornAgainFit.vector_string_t_rbegin(self)
+
+
+    def rend(self):
+        """rend(vector_string_t self) -> std::vector< std::string >::reverse_iterator"""
+        return _libBornAgainFit.vector_string_t_rend(self)
+
+
+    def clear(self):
+        """clear(vector_string_t self)"""
+        return _libBornAgainFit.vector_string_t_clear(self)
+
+
+    def get_allocator(self):
+        """get_allocator(vector_string_t self) -> std::vector< std::string >::allocator_type"""
+        return _libBornAgainFit.vector_string_t_get_allocator(self)
+
+
+    def pop_back(self):
+        """pop_back(vector_string_t self)"""
+        return _libBornAgainFit.vector_string_t_pop_back(self)
+
+
+    def erase(self, *args):
+        """
+        erase(vector_string_t self, std::vector< std::string >::iterator pos) -> std::vector< std::string >::iterator
+        erase(vector_string_t self, std::vector< std::string >::iterator first, std::vector< std::string >::iterator last) -> std::vector< std::string >::iterator
+        """
+        return _libBornAgainFit.vector_string_t_erase(self, *args)
+
+
+    def __init__(self, *args):
+        """
+        __init__(std::vector<(std::string)> self) -> vector_string_t
+        __init__(std::vector<(std::string)> self, vector_string_t arg2) -> vector_string_t
+        __init__(std::vector<(std::string)> self, std::vector< std::string >::size_type size) -> vector_string_t
+        __init__(std::vector<(std::string)> self, std::vector< std::string >::size_type size, std::vector< std::string >::value_type const & value) -> vector_string_t
+        """
+        this = _libBornAgainFit.new_vector_string_t(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def push_back(self, x):
+        """push_back(vector_string_t self, std::vector< std::string >::value_type const & x)"""
+        return _libBornAgainFit.vector_string_t_push_back(self, x)
+
+
+    def front(self):
+        """front(vector_string_t self) -> std::vector< std::string >::value_type const &"""
+        return _libBornAgainFit.vector_string_t_front(self)
+
+
+    def back(self):
+        """back(vector_string_t self) -> std::vector< std::string >::value_type const &"""
+        return _libBornAgainFit.vector_string_t_back(self)
+
+
+    def assign(self, n, x):
+        """assign(vector_string_t self, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)"""
+        return _libBornAgainFit.vector_string_t_assign(self, n, x)
+
+
+    def resize(self, *args):
+        """
+        resize(vector_string_t self, std::vector< std::string >::size_type new_size)
+        resize(vector_string_t self, std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_string_t_resize(self, *args)
+
+
+    def insert(self, *args):
+        """
+        insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const & x) -> std::vector< std::string >::iterator
+        insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)
+        """
+        return _libBornAgainFit.vector_string_t_insert(self, *args)
+
+
+    def reserve(self, n):
+        """reserve(vector_string_t self, std::vector< std::string >::size_type n)"""
+        return _libBornAgainFit.vector_string_t_reserve(self, n)
+
+
+    def capacity(self):
+        """capacity(vector_string_t self) -> std::vector< std::string >::size_type"""
+        return _libBornAgainFit.vector_string_t_capacity(self)
+
+    __swig_destroy__ = _libBornAgainFit.delete_vector_string_t
+    __del__ = lambda self: None
+vector_string_t_swigregister = _libBornAgainFit.vector_string_t_swigregister
+vector_string_t_swigregister(vector_string_t)
+
+class AttLimits(_object):
+    """
+
+
+    The  AttLimits class defines limited/free attribute of fit parameter and provides coupling between them.
+
+    C++ includes: AttLimits.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, AttLimits, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, AttLimits, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(AttLimits self) -> AttLimits
+
+        AttLimits::AttLimits()
+
+        """
+        this = _libBornAgainFit.new_AttLimits()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def limitless():
+        """limitless() -> AttLimits"""
+        return _libBornAgainFit.AttLimits_limitless()
+
+    if _newclass:
+        limitless = staticmethod(limitless)
+    __swig_getmethods__["limitless"] = lambda x: limitless
+
+    def lowerLimited(bound_value):
+        """lowerLimited(double bound_value) -> AttLimits"""
+        return _libBornAgainFit.AttLimits_lowerLimited(bound_value)
+
+    if _newclass:
+        lowerLimited = staticmethod(lowerLimited)
+    __swig_getmethods__["lowerLimited"] = lambda x: lowerLimited
+
+    def positive():
+        """positive() -> AttLimits"""
+        return _libBornAgainFit.AttLimits_positive()
+
+    if _newclass:
+        positive = staticmethod(positive)
+    __swig_getmethods__["positive"] = lambda x: positive
+
+    def nonnegative():
+        """nonnegative() -> AttLimits"""
+        return _libBornAgainFit.AttLimits_nonnegative()
+
+    if _newclass:
+        nonnegative = staticmethod(nonnegative)
+    __swig_getmethods__["nonnegative"] = lambda x: nonnegative
+
+    def upperLimited(bound_value):
+        """upperLimited(double bound_value) -> AttLimits"""
+        return _libBornAgainFit.AttLimits_upperLimited(bound_value)
+
+    if _newclass:
+        upperLimited = staticmethod(upperLimited)
+    __swig_getmethods__["upperLimited"] = lambda x: upperLimited
+
+    def limited(left_bound_value, right_bound_value):
+        """limited(double left_bound_value, double right_bound_value) -> AttLimits"""
+        return _libBornAgainFit.AttLimits_limited(left_bound_value, right_bound_value)
+
+    if _newclass:
+        limited = staticmethod(limited)
+    __swig_getmethods__["limited"] = lambda x: limited
+
+    def fixed():
+        """fixed() -> AttLimits"""
+        return _libBornAgainFit.AttLimits_fixed()
+
+    if _newclass:
+        fixed = staticmethod(fixed)
+    __swig_getmethods__["fixed"] = lambda x: fixed
+
+    def isFixed(self):
+        """
+        isFixed(AttLimits self) -> bool
+
+        bool AttLimits::isFixed() const 
+
+        """
+        return _libBornAgainFit.AttLimits_isFixed(self)
+
+
+    def isLimited(self):
+        """
+        isLimited(AttLimits self) -> bool
+
+        bool AttLimits::isLimited() const 
+
+        """
+        return _libBornAgainFit.AttLimits_isLimited(self)
+
+
+    def isUpperLimited(self):
+        """
+        isUpperLimited(AttLimits self) -> bool
+
+        bool AttLimits::isUpperLimited() const 
+
+        """
+        return _libBornAgainFit.AttLimits_isUpperLimited(self)
+
+
+    def isLowerLimited(self):
+        """
+        isLowerLimited(AttLimits self) -> bool
+
+        bool AttLimits::isLowerLimited() const 
+
+        """
+        return _libBornAgainFit.AttLimits_isLowerLimited(self)
+
+
+    def isLimitless(self):
+        """
+        isLimitless(AttLimits self) -> bool
+
+        bool AttLimits::isLimitless() const 
+
+        """
+        return _libBornAgainFit.AttLimits_isLimitless(self)
+
+
+    def lowerLimit(self):
+        """
+        lowerLimit(AttLimits self) -> double
+
+        double AttLimits::lowerLimit() const 
+
+        """
+        return _libBornAgainFit.AttLimits_lowerLimit(self)
+
+
+    def upperLimit(self):
+        """
+        upperLimit(AttLimits self) -> double
+
+        double AttLimits::upperLimit() const 
+
+        """
+        return _libBornAgainFit.AttLimits_upperLimit(self)
+
+
+    def setFixed(self, isFixed):
+        """
+        setFixed(AttLimits self, bool isFixed)
+
+        void AttLimits::setFixed(bool isFixed)
+
+        """
+        return _libBornAgainFit.AttLimits_setFixed(self, isFixed)
+
+
+    def __eq__(self, other):
+        """__eq__(AttLimits self, AttLimits other) -> bool"""
+        return _libBornAgainFit.AttLimits___eq__(self, other)
+
+
+    def __ne__(self, other):
+        """__ne__(AttLimits self, AttLimits other) -> bool"""
+        return _libBornAgainFit.AttLimits___ne__(self, other)
+
+
+    def toString(self):
+        """
+        toString(AttLimits self) -> std::string
+
+        std::string AttLimits::toString() const 
+
+        """
+        return _libBornAgainFit.AttLimits_toString(self)
+
+    __swig_destroy__ = _libBornAgainFit.delete_AttLimits
+    __del__ = lambda self: None
+AttLimits_swigregister = _libBornAgainFit.AttLimits_swigregister
+AttLimits_swigregister(AttLimits)
+
+def AttLimits_limitless():
+    """AttLimits_limitless() -> AttLimits"""
+    return _libBornAgainFit.AttLimits_limitless()
+
+def AttLimits_lowerLimited(bound_value):
+    """AttLimits_lowerLimited(double bound_value) -> AttLimits"""
+    return _libBornAgainFit.AttLimits_lowerLimited(bound_value)
+
+def AttLimits_positive():
+    """AttLimits_positive() -> AttLimits"""
+    return _libBornAgainFit.AttLimits_positive()
+
+def AttLimits_nonnegative():
+    """AttLimits_nonnegative() -> AttLimits"""
+    return _libBornAgainFit.AttLimits_nonnegative()
+
+def AttLimits_upperLimited(bound_value):
+    """AttLimits_upperLimited(double bound_value) -> AttLimits"""
+    return _libBornAgainFit.AttLimits_upperLimited(bound_value)
+
+def AttLimits_limited(left_bound_value, right_bound_value):
+    """AttLimits_limited(double left_bound_value, double right_bound_value) -> AttLimits"""
+    return _libBornAgainFit.AttLimits_limited(left_bound_value, right_bound_value)
+
+def AttLimits_fixed():
+    """AttLimits_fixed() -> AttLimits"""
+    return _libBornAgainFit.AttLimits_fixed()
+
+class IMinimizer(_object):
+    """
+
+
+    Common interface for all kind minimizer's.
+
+    C++ includes: IMinimizer.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IMinimizer, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IMinimizer, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(IMinimizer self) -> IMinimizer
+
+        IMinimizer::IMinimizer(const IMinimizer &other)=delete
+
+        """
+        this = _libBornAgainFit.new_IMinimizer()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_IMinimizer
+    __del__ = lambda self: None
+
+    def minimizerName(self):
+        """
+        minimizerName(IMinimizer self) -> std::string
+
+        std::string IMinimizer::minimizerName() const
+
+        return name of the minimizer 
+
+        """
+        return _libBornAgainFit.IMinimizer_minimizerName(self)
+
+
+    def algorithmName(self):
+        """
+        algorithmName(IMinimizer self) -> std::string
+
+        std::string IMinimizer::algorithmName() const
+
+        return name of the minimization algorithm 
+
+        """
+        return _libBornAgainFit.IMinimizer_algorithmName(self)
+
+
+    def minimize(self):
+        """
+        minimize(IMinimizer self)
+
+        void IMinimizer::minimize()
+
+        run minimization 
+
+        """
+        return _libBornAgainFit.IMinimizer_minimize(self)
+
+
+    def clear(self):
+        """
+        clear(IMinimizer self)
+
+        void IMinimizer::clear()
+
+        clear resources (parameters) for consecutives minimizations 
+
+        """
+        return _libBornAgainFit.IMinimizer_clear(self)
+
+
+    def setParameters(self, parameters):
+        """
+        setParameters(IMinimizer self, FitParameterSet parameters)
+
+        void IMinimizer::setParameters(const FitParameterSet &parameters)
+
+        Sets internal minimizer parameters using external parameter list. 
+
+        """
+        return _libBornAgainFit.IMinimizer_setParameters(self, parameters)
+
+
+    def setObjectiveFunction(self, arg2):
+        """
+        setObjectiveFunction(IMinimizer self, objective_function_t arg2)
+
+        virtual void IMinimizer::setObjectiveFunction(objective_function_t)
+
+        """
+        return _libBornAgainFit.IMinimizer_setObjectiveFunction(self, arg2)
+
+
+    def setGradientFunction(self, arg2, arg3):
+        """
+        setGradientFunction(IMinimizer self, gradient_function_t arg2, int arg3)
+
+        virtual void IMinimizer::setGradientFunction(gradient_function_t, int)
+
+        """
+        return _libBornAgainFit.IMinimizer_setGradientFunction(self, arg2, arg3)
+
+
+    def minValue(self):
+        """
+        minValue(IMinimizer self) -> double
+
+        double IMinimizer::minValue() const
+
+        Returns minimum function value. 
+
+        """
+        return _libBornAgainFit.IMinimizer_minValue(self)
+
+
+    def reportResults(self):
+        """
+        reportResults(IMinimizer self) -> std::string
+
+        std::string IMinimizer::reportResults() const
+
+        Prints fit results. 
+
+        """
+        return _libBornAgainFit.IMinimizer_reportResults(self)
+
+
+    def propagateResults(self, parameters):
+        """
+        propagateResults(IMinimizer self, FitParameterSet parameters)
+
+        void IMinimizer::propagateResults(FitParameterSet &parameters)
+
+        Propagates results of minimization to fit parameter set. 
+
+        """
+        return _libBornAgainFit.IMinimizer_propagateResults(self, parameters)
+
+
+    def setOptions(self, options):
+        """
+        setOptions(IMinimizer self, std::string const & options)
+
+        void IMinimizer::setOptions(const std::string &options)
+
+        Sets option string to the minimizer. 
+
+        """
+        return _libBornAgainFit.IMinimizer_setOptions(self, options)
+
+IMinimizer_swigregister = _libBornAgainFit.IMinimizer_swigregister
+IMinimizer_swigregister(IMinimizer)
+
+class IFitParameter(_object):
+    """
+
+
+    The  IFitParameter is a base class for fit parameters.
+
+    C++ includes: IFitParameter.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, IFitParameter, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, IFitParameter, name)
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _libBornAgainFit.delete_IFitParameter
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(IFitParameter self) -> IFitParameter
+
+        virtual IFitParameter* IFitParameter::clone() const =0
+
+        """
+        return _libBornAgainFit.IFitParameter_clone(self)
+
+IFitParameter_swigregister = _libBornAgainFit.IFitParameter_swigregister
+IFitParameter_swigregister(IFitParameter)
+
+class FitParameter(IFitParameter):
+    """
+
+
+    The  FitParameter represents fittable parameter with value, error, step, and limits.
+
+    C++ includes: FitParameter.h
+
+    """
+
+    __swig_setmethods__ = {}
+    for _s in [IFitParameter]:
+        __swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitParameter, name, value)
+    __swig_getmethods__ = {}
+    for _s in [IFitParameter]:
+        __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
+    __getattr__ = lambda self, name: _swig_getattr(self, FitParameter, name)
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        """
+        __init__(FitParameter self) -> FitParameter
+        __init__(FitParameter self, std::string const & name, double value, AttLimits limits, double step=0.0) -> FitParameter
+        __init__(FitParameter self, std::string const & name, double value, AttLimits limits) -> FitParameter
+        __init__(FitParameter self, std::string const & name, double value) -> FitParameter
+
+        FitParameter::FitParameter(const std::string &name, double value, const AttLimits &limits=AttLimits::limitless(), double step=0.0)
+
+        """
+        this = _libBornAgainFit.new_FitParameter(*args)
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_FitParameter
+    __del__ = lambda self: None
+
+    def clone(self):
+        """
+        clone(FitParameter self) -> FitParameter
+
+        FitParameter * FitParameter::clone() const 
+
+        """
+        return _libBornAgainFit.FitParameter_clone(self)
+
+
+    def name(self):
+        """
+        name(FitParameter self) -> std::string
+
+        std::string FitParameter::name() const 
+
+        """
+        return _libBornAgainFit.FitParameter_name(self)
+
+
+    def startValue(self):
+        """
+        startValue(FitParameter self) -> double
+
+        double FitParameter::startValue() const 
+
+        """
+        return _libBornAgainFit.FitParameter_startValue(self)
+
+
+    def value(self):
+        """
+        value(FitParameter self) -> double
+
+        double FitParameter::value() const 
+
+        """
+        return _libBornAgainFit.FitParameter_value(self)
+
+
+    def setValue(self, value):
+        """
+        setValue(FitParameter self, double value)
+
+        void FitParameter::setValue(double value)
+
+        """
+        return _libBornAgainFit.FitParameter_setValue(self, value)
+
+
+    def step(self):
+        """
+        step(FitParameter self) -> double
+
+        double FitParameter::step() const 
+
+        """
+        return _libBornAgainFit.FitParameter_step(self)
+
+
+    def setStep(self, value):
+        """
+        setStep(FitParameter self, double value) -> FitParameter
+
+        FitParameter & FitParameter::setStep(double value)
+
+        """
+        return _libBornAgainFit.FitParameter_setStep(self, value)
+
+
+    def error(self):
+        """
+        error(FitParameter self) -> double
+
+        double FitParameter::error() const 
+
+        """
+        return _libBornAgainFit.FitParameter_error(self)
+
+
+    def setError(self, value):
+        """
+        setError(FitParameter self, double value)
+
+        void FitParameter::setError(double value)
+
+        """
+        return _libBornAgainFit.FitParameter_setError(self, value)
+
+
+    def limits(self, *args):
+        """
+        limits(FitParameter self) -> AttLimits
+        limits(FitParameter self) -> AttLimits
+
+        AttLimits & FitParameter::limits()
+
+        """
+        return _libBornAgainFit.FitParameter_limits(self, *args)
+
+
+    def setLimits(self, limits):
+        """
+        setLimits(FitParameter self, AttLimits limits) -> FitParameter
+
+        FitParameter & FitParameter::setLimits(const AttLimits &limits)
+
+        """
+        return _libBornAgainFit.FitParameter_setLimits(self, limits)
+
+
+    def setLowerLimited(self, bound_value):
+        """
+        setLowerLimited(FitParameter self, double bound_value) -> FitParameter
+
+        FitParameter & FitParameter::setLowerLimited(double bound_value)
+
+        """
+        return _libBornAgainFit.FitParameter_setLowerLimited(self, bound_value)
+
+
+    def setPositive(self):
+        """
+        setPositive(FitParameter self) -> FitParameter
+
+        FitParameter & FitParameter::setPositive()
+
+        """
+        return _libBornAgainFit.FitParameter_setPositive(self)
+
+
+    def setNonnegative(self):
+        """
+        setNonnegative(FitParameter self) -> FitParameter
+
+        FitParameter & FitParameter::setNonnegative()
+
+        """
+        return _libBornAgainFit.FitParameter_setNonnegative(self)
+
+
+    def setUpperLimited(self, bound_value):
+        """
+        setUpperLimited(FitParameter self, double bound_value) -> FitParameter
+
+        FitParameter & FitParameter::setUpperLimited(double bound_value)
+
+        """
+        return _libBornAgainFit.FitParameter_setUpperLimited(self, bound_value)
+
+
+    def setLimited(self, left_bound_value, right_bound_value):
+        """
+        setLimited(FitParameter self, double left_bound_value, double right_bound_value) -> FitParameter
+
+        FitParameter & FitParameter::setLimited(double left_bound_value, double right_bound_value)
+
+        """
+        return _libBornAgainFit.FitParameter_setLimited(self, left_bound_value, right_bound_value)
+
+
+    def setFixed(self):
+        """
+        setFixed(FitParameter self) -> FitParameter
+
+        FitParameter & FitParameter::setFixed()
+
+        """
+        return _libBornAgainFit.FitParameter_setFixed(self)
+
+
+    def toString(self):
+        """
+        toString(FitParameter self) -> std::string
+
+        std::string FitParameter::toString() const 
+
+        """
+        return _libBornAgainFit.FitParameter_toString(self)
+
+FitParameter_swigregister = _libBornAgainFit.FitParameter_swigregister
+FitParameter_swigregister(FitParameter)
+
+class FitParameterSet(_object):
+    """
+
+
+    The  FitParameterSet represents collection of fit parameters for the minimizer.
+
+    C++ includes: FitParameterSet.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, FitParameterSet, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, FitParameterSet, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(FitParameterSet self) -> FitParameterSet
+
+        FitParameterSet::FitParameterSet()
+
+        """
+        this = _libBornAgainFit.new_FitParameterSet()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_FitParameterSet
+    __del__ = lambda self: None
+
+    def clear(self):
+        """
+        clear(FitParameterSet self)
+
+        void FitParameterSet::clear()
+
+        container specific
+
+        Clears all defined parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_clear(self)
+
+
+    def size(self):
+        """
+        size(FitParameterSet self) -> size_t
+
+        size_t FitParameterSet::size() const
+
+        Returns number of parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_size(self)
+
+
+    def begin(self, *args):
+        """
+        begin(FitParameterSet self) -> FitParameterSet::iterator
+        begin(FitParameterSet self) -> FitParameterSet::const_iterator
+
+        FitParameterSet::const_iterator FitParameterSet::begin() const 
+
+        """
+        return _libBornAgainFit.FitParameterSet_begin(self, *args)
+
+
+    def end(self, *args):
+        """
+        end(FitParameterSet self) -> FitParameterSet::iterator
+        end(FitParameterSet self) -> FitParameterSet::const_iterator
+
+        FitParameterSet::const_iterator FitParameterSet::end() const 
+
+        """
+        return _libBornAgainFit.FitParameterSet_end(self, *args)
+
+
+    def addFitParameter(self, par):
+        """
+        addFitParameter(FitParameterSet self, FitParameter par)
+
+        void FitParameterSet::addFitParameter(FitParameter *par)
+
+        adding fit parameters
+
+        Adds fit parameter. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_addFitParameter(self, par)
+
+
+    def fitParameter(self, *args):
+        """
+        fitParameter(FitParameterSet self, std::string const & name) -> FitParameter
+        fitParameter(FitParameterSet self, std::string const & name) -> FitParameter
+
+        FitParameter * FitParameterSet::fitParameter(const std::string &name)
+
+        """
+        return _libBornAgainFit.FitParameterSet_fitParameter(self, *args)
+
+
+    def values(self):
+        """
+        values(FitParameterSet self) -> vdouble1d_t
+
+        std::vector< double > FitParameterSet::values() const
+
+        fit parameter's values and errors
+
+        Returns values of all defined parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_values(self)
+
+
+    def setValues(self, pars_values):
+        """
+        setValues(FitParameterSet self, vdouble1d_t pars_values)
+
+        void FitParameterSet::setValues(const std::vector< double > &pars_values)
+
+        Sets values for all defined parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_setValues(self, pars_values)
+
+
+    def valuesDifferFrom(self, par_values, tolerance=2.0):
+        """
+        valuesDifferFrom(FitParameterSet self, vdouble1d_t par_values, double tolerance=2.0) -> bool
+        valuesDifferFrom(FitParameterSet self, vdouble1d_t par_values) -> bool
+
+        bool FitParameterSet::valuesDifferFrom(const std::vector< double > &par_values, double tolerance=2.0) const
+
+        Returns true if parameters already have the given values. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_valuesDifferFrom(self, par_values, tolerance)
+
+
+    def errors(self):
+        """
+        errors(FitParameterSet self) -> vdouble1d_t
+
+        std::vector< double > FitParameterSet::errors() const
+
+        Returns errors of all defined parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_errors(self)
+
+
+    def setErrors(self, pars_errors):
+        """
+        setErrors(FitParameterSet self, vdouble1d_t pars_errors)
+
+        void FitParameterSet::setErrors(const std::vector< double > &pars_errors)
+
+        Sets errors to all parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_setErrors(self, pars_errors)
+
+
+    def freeFitParameterCount(self):
+        """
+        freeFitParameterCount(FitParameterSet self) -> size_t
+
+        size_t FitParameterSet::freeFitParameterCount() const
+
+        Make parameters fixed and free.
+
+        Returns number of free parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_freeFitParameterCount(self)
+
+
+    def fixAll(self):
+        """
+        fixAll(FitParameterSet self)
+
+        void FitParameterSet::fixAll()
+
+        Fix all parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_fixAll(self)
+
+
+    def releaseAll(self):
+        """
+        releaseAll(FitParameterSet self)
+
+        void FitParameterSet::releaseAll()
+
+        Release all parameters. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_releaseAll(self)
+
+
+    def setFixed(self, pars, is_fixed):
+        """
+        setFixed(FitParameterSet self, vector_string_t pars, bool is_fixed)
+
+        void FitParameterSet::setFixed(const std::vector< std::string > &pars, bool is_fixed)
+
+        Set fixed flag for parameters from the list. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_setFixed(self, pars, is_fixed)
+
+
+    def parametersToString(self):
+        """
+        parametersToString(FitParameterSet self) -> std::string
+
+        std::string FitParameterSet::parametersToString() const
+
+        Printing and reporting. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_parametersToString(self)
+
+
+    def reportResults(self):
+        """
+        reportResults(FitParameterSet self) -> std::string
+
+        std::string FitParameterSet::reportResults() const 
+
+        """
+        return _libBornAgainFit.FitParameterSet_reportResults(self)
+
+
+    def correlationMatrix(self):
+        """
+        correlationMatrix(FitParameterSet self) -> vdouble2d_t
+
+        corr_matrix_t FitParameterSet::correlationMatrix() const 
+
+        """
+        return _libBornAgainFit.FitParameterSet_correlationMatrix(self)
+
+
+    def setCorrelationMatrix(self, matrix):
+        """
+        setCorrelationMatrix(FitParameterSet self, vdouble2d_t matrix)
+
+        void FitParameterSet::setCorrelationMatrix(const corr_matrix_t &matrix)
+
+        """
+        return _libBornAgainFit.FitParameterSet_setCorrelationMatrix(self, matrix)
+
+
+    def isExistingName(self, name):
+        """
+        isExistingName(FitParameterSet self, std::string const & name) -> bool
+
+        bool FitParameterSet::isExistingName(const std::string &name) const
+
+        Returns true if parameter with such name exists. 
+
+        """
+        return _libBornAgainFit.FitParameterSet_isExistingName(self, name)
+
+
+    def __getitem__(self, *args):
+        """
+        __getitem__(FitParameterSet self, std::string name) -> FitParameter
+        __getitem__(FitParameterSet self, size_t index) -> FitParameter
+        """
+        return _libBornAgainFit.FitParameterSet___getitem__(self, *args)
+
+
+    def __iter__(self):
+        return FitParameterSetIterator(self)
+
+FitParameterSet_swigregister = _libBornAgainFit.FitParameterSet_swigregister
+FitParameterSet_swigregister(FitParameterSet)
+
+class MinimizerCatalogue(_object):
+    """
+
+
+    The  MinimizerCatalogue class contains information over all minimizers available.
+
+    C++ includes: MinimizerCatalogue.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, MinimizerCatalogue, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, MinimizerCatalogue, name)
+    __repr__ = _swig_repr
+
+    def __init__(self):
+        """
+        __init__(MinimizerCatalogue self) -> MinimizerCatalogue
+
+        MinimizerCatalogue::MinimizerCatalogue()
+
+        """
+        this = _libBornAgainFit.new_MinimizerCatalogue()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+
+    def toString(self):
+        """
+        toString(MinimizerCatalogue self) -> std::string
+
+        std::string MinimizerCatalogue::toString() const
+
+        Returns multiline string representing catalogue content. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_toString(self)
+
+
+    def algorithmNames(self, minimizerName):
+        """
+        algorithmNames(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t
+
+        std::vector< std::string > MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const
+
+        Returns list of algorithms defined for the minimizer with a given name. 
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_algorithmNames(self, minimizerName)
+
+
+    def algorithmDescriptions(self, minimizerName):
+        """
+        algorithmDescriptions(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t
+
+        std::vector< std::string > MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const
+
+        Returns list of algorithm's descriptions for the minimizer with a given name . 
+
+        """
+        return _libBornAgainFit.MinimizerCatalogue_algorithmDescriptions(self, minimizerName)
+
+    __swig_destroy__ = _libBornAgainFit.delete_MinimizerCatalogue
+    __del__ = lambda self: None
+MinimizerCatalogue_swigregister = _libBornAgainFit.MinimizerCatalogue_swigregister
+MinimizerCatalogue_swigregister(MinimizerCatalogue)
+
+class MinimizerFactory(_object):
+    """
+
+
+    Factory to create minimizers.
+
+    Minimizer | Algorithms
+
+    Minuit2 | Migrad Simplex Combined Scan Fumili GSLMultiMin | SteepestDescent ConjugateFR ConjugatePR BFGS BFGS2 GSLLMA | Default GSLSimAn | Default Genetic | Default
+
+    C++ includes: MinimizerFactory.h
+
+    """
+
+    __swig_setmethods__ = {}
+    __setattr__ = lambda self, name, value: _swig_setattr(self, MinimizerFactory, name, value)
+    __swig_getmethods__ = {}
+    __getattr__ = lambda self, name: _swig_getattr(self, MinimizerFactory, name)
+    __repr__ = _swig_repr
+
+    def createMinimizer(*args):
+        """
+        createMinimizer(std::string const & minimizerName, std::string const & algorithmType, std::string const & optionString) -> IMinimizer
+        createMinimizer(std::string const & minimizerName, std::string const & algorithmType) -> IMinimizer
+        createMinimizer(std::string const & minimizerName) -> IMinimizer
+        """
+        return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
+
+    if _newclass:
+        createMinimizer = staticmethod(createMinimizer)
+    __swig_getmethods__["createMinimizer"] = lambda x: createMinimizer
+
+    def printCatalogue():
+        """printCatalogue()"""
+        return _libBornAgainFit.MinimizerFactory_printCatalogue()
+
+    if _newclass:
+        printCatalogue = staticmethod(printCatalogue)
+    __swig_getmethods__["printCatalogue"] = lambda x: printCatalogue
+
+    def catalogueToString():
+        """catalogueToString() -> std::string"""
+        return _libBornAgainFit.MinimizerFactory_catalogueToString()
+
+    if _newclass:
+        catalogueToString = staticmethod(catalogueToString)
+    __swig_getmethods__["catalogueToString"] = lambda x: catalogueToString
+
+    def catalogue():
+        """catalogue() -> MinimizerCatalogue"""
+        return _libBornAgainFit.MinimizerFactory_catalogue()
+
+    if _newclass:
+        catalogue = staticmethod(catalogue)
+    __swig_getmethods__["catalogue"] = lambda x: catalogue
+
+    def __init__(self):
+        """
+        __init__(MinimizerFactory self) -> MinimizerFactory
+
+
+
+        Factory to create minimizers.
+
+        Minimizer | Algorithms
+
+        Minuit2 | Migrad Simplex Combined Scan Fumili GSLMultiMin | SteepestDescent ConjugateFR ConjugatePR BFGS BFGS2 GSLLMA | Default GSLSimAn | Default Genetic | Default
+
+        C++ includes: MinimizerFactory.h
+
+        """
+        this = _libBornAgainFit.new_MinimizerFactory()
+        try:
+            self.this.append(this)
+        except Exception:
+            self.this = this
+    __swig_destroy__ = _libBornAgainFit.delete_MinimizerFactory
+    __del__ = lambda self: None
+MinimizerFactory_swigregister = _libBornAgainFit.MinimizerFactory_swigregister
+MinimizerFactory_swigregister(MinimizerFactory)
+
+def MinimizerFactory_createMinimizer(*args):
+    """
+    createMinimizer(std::string const & minimizerName, std::string const & algorithmType, std::string const & optionString) -> IMinimizer
+    createMinimizer(std::string const & minimizerName, std::string const & algorithmType) -> IMinimizer
+    MinimizerFactory_createMinimizer(std::string const & minimizerName) -> IMinimizer
+    """
+    return _libBornAgainFit.MinimizerFactory_createMinimizer(*args)
+
+def MinimizerFactory_printCatalogue():
+    """MinimizerFactory_printCatalogue()"""
+    return _libBornAgainFit.MinimizerFactory_printCatalogue()
+
+def MinimizerFactory_catalogueToString():
+    """MinimizerFactory_catalogueToString() -> std::string"""
+    return _libBornAgainFit.MinimizerFactory_catalogueToString()
+
+def MinimizerFactory_catalogue():
+    """MinimizerFactory_catalogue() -> MinimizerCatalogue"""
+    return _libBornAgainFit.MinimizerFactory_catalogue()
+
+
+class FitParameterSetIterator(object):
+
+    def __init__(self, fitParameters):
+        self.fitParameters = fitParameters
+        self.index = -1
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        self.index += 1
+        if self.index < self.fitParameters.size():
+            return self.fitParameters[self.index]
+        else:
+            raise StopIteration
+
+    def __next__(self):
+        return self.next()
+
+# This file is compatible with both classic and new-style classes.
+
diff --git a/auto/Wrap/libBornAgainFit_wrap.cpp b/auto/Wrap/libBornAgainFit_wrap.cpp
new file mode 100644
index 0000000..7a13fe3
--- /dev/null
+++ b/auto/Wrap/libBornAgainFit_wrap.cpp
@@ -0,0 +1,23487 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 3.0.8
+ *
+ * This file is not intended to be easily readable and contains a number of
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+
+#ifndef SWIGPYTHON
+#define SWIGPYTHON
+#endif
+
+#define SWIG_DIRECTORS
+#define SWIG_PYTHON_DIRECTOR_NO_VTABLE
+
+
+#ifdef __cplusplus
+/* SwigValueWrapper is described in swig.swg */
+template<typename T> class SwigValueWrapper {
+  struct SwigMovePointer {
+    T *ptr;
+    SwigMovePointer(T *p) : ptr(p) { }
+    ~SwigMovePointer() { delete ptr; }
+    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+  } pointer;
+  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
+  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
+public:
+  SwigValueWrapper() : pointer(0) { }
+  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
+  operator T&() const { return *pointer.ptr; }
+  T *operator&() { return pointer.ptr; }
+};
+
+template <typename T> T SwigValueInit() {
+  return T();
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__))
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__))
+# else
+#   define SWIGUNUSED
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#  ifndef GCC_HASCLASSVISIBILITY
+#    define GCC_HASCLASSVISIBILITY
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used.  So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
+
+
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG
+#else
+# include <Python.h>
+#endif
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+   or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+  creating a static or dynamic library from the SWIG runtime code.
+  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+
+  But only do this if strictly necessary, ie, if you have problems
+  with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/*  Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN        0x1
+#define SWIG_CAST_NEW_MEMORY       0x2
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN           0x1
+
+
+/*
+   Flags/methods for returning states.
+
+   The SWIG conversion methods, as ConvertPtr, return an integer
+   that tells if the conversion was successful or not. And if not,
+   an error code can be returned (see swigerrors.swg for the codes).
+
+   Use the following macros/flags to set or process the returning
+   states.
+
+   In old versions of SWIG, code such as the following was usually written:
+
+     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+       // success code
+     } else {
+       //fail code
+     }
+
+   Now you can be more explicit:
+
+    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+    } else {
+      // fail code
+    }
+
+   which is the same really, but now you can also do
+
+    Type *ptr;
+    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+      if (SWIG_IsNewObj(res) {
+        ...
+	delete *ptr;
+      } else {
+        ...
+      }
+    } else {
+      // fail code
+    }
+
+   I.e., now SWIG_ConvertPtr can return new objects and you can
+   identify the case and take care of the deallocation. Of course that
+   also requires SWIG_ConvertPtr to return new result values, such as
+
+      int SWIG_ConvertPtr(obj, ptr,...) {
+        if (<obj is ok>) {
+          if (<need new object>) {
+            *ptr = <ptr to new allocated object>;
+            return SWIG_NEWOBJ;
+          } else {
+            *ptr = <ptr to old object>;
+            return SWIG_OLDOBJ;
+          }
+        } else {
+          return SWIG_BADOBJ;
+        }
+      }
+
+   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+   SWIG errors code.
+
+   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+   allows to return the 'cast rank', for example, if you have this
+
+       int food(double)
+       int fooi(int);
+
+   and you call
+
+      food(1)   // cast rank '1'  (1 -> 1.0)
+      fooi(1)   // cast rank '0'
+
+   just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK                    (0)
+#define SWIG_ERROR                 (-1)
+#define SWIG_IsOK(r)               (r >= 0)
+#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT         (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
+/* The TmpMask is for in/out typemaps that use temporal objects */
+#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ                (SWIG_ERROR)
+#define SWIG_OLDOBJ                (SWIG_OK)
+#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del mask methods */
+#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+#  ifndef SWIG_TypeRank
+#    define SWIG_TypeRank             unsigned long
+#  endif
+#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
+#    define SWIG_MAXCASTRANK          (2)
+#  endif
+#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
+#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
+  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+}
+#else /* no cast-rank mode */
+#  define SWIG_AddCast(r) (r)
+#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+  const char             *name;			/* mangled name of this type */
+  const char             *str;			/* human readable name of this type */
+  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
+  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
+  void                   *clientdata;		/* language specific type data */
+  int                    owndata;		/* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
+  swig_converter_func     converter;		/* function to cast the void pointers */
+  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
+  struct swig_cast_info  *prev;			/* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
+  size_t                 size;		        /* Number of types in this module */
+  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
+  swig_type_info         **type_initial;	/* Array of initially generated type structures */
+  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
+  void                    *clientdata;		/* Language specific module data */
+} swig_module_info;
+
+/*
+  Compare two type names skipping the space characters, therefore
+  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
+
+  Return 0 when the two name types are equivalent, as in
+  strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+		  const char *f2, const char *l2) {
+  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+    while ((*f1 == ' ') && (f1 != l1)) ++f1;
+    while ((*f2 == ' ') && (f2 != l2)) ++f2;
+    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+  }
+  return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCmp(const char *nb, const char *tb) {
+  int equiv = 1;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (equiv != 0 && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = SWIG_TypeNameComp(nb, ne, tb, te);
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
+}
+
+/*
+  Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (strcmp(iter->type->name, c) == 0) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (iter->type == from) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/*
+   Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/*
+  Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/*
+  Return the pretty name associated with this type,
+  that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+  /* The "str" field contains the equivalent pretty names of the
+     type, separated by vertical-bar characters.  We choose
+     to print the last name, as it is often (?) the most
+     specific. */
+  if (!type) return NULL;
+  if (type->str != NULL) {
+    const char *last_name = type->str;
+    const char *s;
+    for (s = type->str; *s; s++)
+      if (*s == '|') last_name = s+1;
+    return last_name;
+  }
+  else
+    return type->name;
+}
+
+/*
+   Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_cast_info *cast = ti->cast;
+  /* if (ti->clientdata == clientdata) return; */
+  ti->clientdata = clientdata;
+
+  while (cast) {
+    if (!cast->converter) {
+      swig_type_info *tc = cast->type;
+      if (!tc->clientdata) {
+	SWIG_TypeClientData(tc, clientdata);
+      }
+    }
+    cast = cast->next;
+  }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+  SWIG_TypeClientData(ti, clientdata);
+  ti->owndata = 1;
+}
+
+/*
+  Search for a swig_type_info structure only by mangled name
+  Search is a O(log #types)
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+                            swig_module_info *end,
+		            const char *name) {
+  swig_module_info *iter = start;
+  do {
+    if (iter->size) {
+      size_t l = 0;
+      size_t r = iter->size - 1;
+      do {
+	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
+	size_t i = (l + r) >> 1;
+	const char *iname = iter->types[i]->name;
+	if (iname) {
+	  int compare = strcmp(name, iname);
+	  if (compare == 0) {
+	    return iter->types[i];
+	  } else if (compare < 0) {
+	    if (i) {
+	      r = i - 1;
+	    } else {
+	      break;
+	    }
+	  } else if (compare > 0) {
+	    l = i + 1;
+	  }
+	} else {
+	  break; /* should never happen */
+	}
+      } while (l <= r);
+    }
+    iter = iter->next;
+  } while (iter != end);
+  return 0;
+}
+
+/*
+  Search for a swig_type_info structure for either a mangled name or a human readable name.
+  It first searches the mangled names of the types, which is a O(log #types)
+  If a type is not found it then searches the human readable names, which is O(#types).
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start,
+                     swig_module_info *end,
+		     const char *name) {
+  /* STEP 1: Search the name field using binary search */
+  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+  if (ret) {
+    return ret;
+  } else {
+    /* STEP 2: If the type hasn't been found, do a complete search
+       of the str field (the human readable name) */
+    swig_module_info *iter = start;
+    do {
+      size_t i = 0;
+      for (; i < iter->size; ++i) {
+	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+	  return iter->types[i];
+      }
+      iter = iter->next;
+    } while (iter != end);
+  }
+
+  /* neither found a match */
+  return 0;
+}
+
+/*
+   Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+  static const char hex[17] = "0123456789abcdef";
+  const unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu =  u + sz;
+  for (; u != eu; ++u) {
+    unsigned char uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/*
+   Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+  unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu = u + sz;
+  for (; u != eu; ++u) {
+    char d = *(c++);
+    unsigned char uu;
+    if ((d >= '0') && (d <= '9'))
+      uu = ((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = ((d - ('a'-10)) << 4);
+    else
+      return (char *) 0;
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (d - ('a'-10));
+    else
+      return (char *) 0;
+    *u = uu;
+  }
+  return c;
+}
+
+/*
+   Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+  char *r = buff;
+  if ((2*sizeof(void *) + 2) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,&ptr,sizeof(void *));
+  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+  strcpy(r,name);
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      *ptr = (void *) 0;
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+  char *r = buff;
+  size_t lname = (name ? strlen(name) : 0);
+  if ((2*sz + 2 + lname) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  if (lname) {
+    strncpy(r,name,lname+1);
+  } else {
+    *r = 0;
+  }
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      memset(ptr,0,sz);
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/*  Errors in SWIG */
+#define  SWIG_UnknownError    	   -1
+#define  SWIG_IOError        	   -2
+#define  SWIG_RuntimeError   	   -3
+#define  SWIG_IndexError     	   -4
+#define  SWIG_TypeError      	   -5
+#define  SWIG_DivisionByZero 	   -6
+#define  SWIG_OverflowError  	   -7
+#define  SWIG_SyntaxError    	   -8
+#define  SWIG_ValueError     	   -9
+#define  SWIG_SystemError    	   -10
+#define  SWIG_AttributeError 	   -11
+#define  SWIG_MemoryError    	   -12
+#define  SWIG_NullReferenceError   -13
+
+
+
+/* Compatibility macros for Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+
+#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type)
+#define PyInt_Check(x) PyLong_Check(x)
+#define PyInt_AsLong(x) PyLong_AsLong(x)
+#define PyInt_FromLong(x) PyLong_FromLong(x)
+#define PyInt_FromSize_t(x) PyLong_FromSize_t(x)
+#define PyString_Check(name) PyBytes_Check(name)
+#define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)
+#define PyString_AsString(str) PyBytes_AsString(str)
+#define PyString_Size(str) PyBytes_Size(str)	
+#define PyString_InternFromString(key) PyUnicode_InternFromString(key)
+#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE
+#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x)
+#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x)
+
+#endif
+
+#ifndef Py_TYPE
+#  define Py_TYPE(op) ((op)->ob_type)
+#endif
+
+/* SWIG APIs for compatibility of both Python 2 & 3 */
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_FromFormat PyUnicode_FromFormat
+#else
+#  define SWIG_Python_str_FromFormat PyString_FromFormat
+#endif
+
+
+/* Warning: This function will allocate a new string in Python 3,
+ * so please call SWIG_Python_str_DelForPy3(x) to free the space.
+ */
+SWIGINTERN char*
+SWIG_Python_str_AsChar(PyObject *str)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  char *cstr;
+  char *newstr;
+  Py_ssize_t len;
+  str = PyUnicode_AsUTF8String(str);
+  PyBytes_AsStringAndSize(str, &cstr, &len);
+  newstr = (char *) malloc(len+1);
+  memcpy(newstr, cstr, len+1);
+  Py_XDECREF(str);
+  return newstr;
+#else
+  return PyString_AsString(str);
+#endif
+}
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_DelForPy3(x) free( (void*) (x) )
+#else
+#  define SWIG_Python_str_DelForPy3(x) 
+#endif
+
+
+SWIGINTERN PyObject*
+SWIG_Python_str_FromChar(const char *c)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  return PyUnicode_FromString(c); 
+#else
+  return PyString_FromString(c);
+#endif
+}
+
+/* Add PyOS_snprintf for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM)
+#  define PyOS_snprintf _snprintf
+# else
+#  define PyOS_snprintf snprintf
+# endif
+#endif
+
+/* A crude PyString_FromFormat implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+
+#ifndef SWIG_PYBUFFER_SIZE
+# define SWIG_PYBUFFER_SIZE 1024
+#endif
+
+static PyObject *
+PyString_FromFormat(const char *fmt, ...) {
+  va_list ap;
+  char buf[SWIG_PYBUFFER_SIZE * 2];
+  int res;
+  va_start(ap, fmt);
+  res = vsnprintf(buf, sizeof(buf), fmt, ap);
+  va_end(ap);
+  return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf);
+}
+#endif
+
+/* Add PyObject_Del for old Pythons */
+#if PY_VERSION_HEX < 0x01060000
+# define PyObject_Del(op) PyMem_DEL((op))
+#endif
+#ifndef PyObject_DEL
+# define PyObject_DEL PyObject_Del
+#endif
+
+/* A crude PyExc_StopIteration exception for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# ifndef PyExc_StopIteration
+#  define PyExc_StopIteration PyExc_RuntimeError
+# endif
+# ifndef PyObject_GenericGetAttr
+#  define PyObject_GenericGetAttr 0
+# endif
+#endif
+
+/* Py_NotImplemented is defined in 2.1 and up. */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef Py_NotImplemented
+#  define Py_NotImplemented PyExc_RuntimeError
+# endif
+#endif
+
+/* A crude PyString_AsStringAndSize implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef PyString_AsStringAndSize
+#  define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;}
+# endif
+#endif
+
+/* PySequence_Size for old Pythons */
+#if PY_VERSION_HEX < 0x02000000
+# ifndef PySequence_Size
+#  define PySequence_Size PySequence_Length
+# endif
+#endif
+
+/* PyBool_FromLong for old Pythons */
+#if PY_VERSION_HEX < 0x02030000
+static
+PyObject *PyBool_FromLong(long ok)
+{
+  PyObject *result = ok ? Py_True : Py_False;
+  Py_INCREF(result);
+  return result;
+}
+#endif
+
+/* Py_ssize_t for old Pythons */
+/* This code is as recommended by: */
+/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */
+#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
+typedef int Py_ssize_t;
+# define PY_SSIZE_T_MAX INT_MAX
+# define PY_SSIZE_T_MIN INT_MIN
+typedef inquiry lenfunc;
+typedef intargfunc ssizeargfunc;
+typedef intintargfunc ssizessizeargfunc;
+typedef intobjargproc ssizeobjargproc;
+typedef intintobjargproc ssizessizeobjargproc;
+typedef getreadbufferproc readbufferproc;
+typedef getwritebufferproc writebufferproc;
+typedef getsegcountproc segcountproc;
+typedef getcharbufferproc charbufferproc;
+static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc))
+{
+  long result = 0;
+  PyObject *i = PyNumber_Int(x);
+  if (i) {
+    result = PyInt_AsLong(i);
+    Py_DECREF(i);
+  }
+  return result;
+}
+#endif
+
+#if PY_VERSION_HEX < 0x02050000
+#define PyInt_FromSize_t(x) PyInt_FromLong((long)x)
+#endif
+
+#if PY_VERSION_HEX < 0x02040000
+#define Py_VISIT(op)				\
+  do { 						\
+    if (op) {					\
+      int vret = visit((op), arg);		\
+      if (vret)					\
+        return vret;				\
+    }						\
+  } while (0)
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef struct {
+  PyTypeObject type;
+  PyNumberMethods as_number;
+  PyMappingMethods as_mapping;
+  PySequenceMethods as_sequence;
+  PyBufferProcs as_buffer;
+  PyObject *name, *slots;
+} PyHeapTypeObject;
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef destructor freefunc;
+#endif
+
+#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \
+     (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \
+     (PY_MAJOR_VERSION > 3))
+# define SWIGPY_USE_CAPSULE
+# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME)
+#endif
+
+#if PY_VERSION_HEX < 0x03020000
+#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
+#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#endif
+
+/* -----------------------------------------------------------------------------
+ * error manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIME PyObject*
+SWIG_Python_ErrorType(int code) {
+  PyObject* type = 0;
+  switch(code) {
+  case SWIG_MemoryError:
+    type = PyExc_MemoryError;
+    break;
+  case SWIG_IOError:
+    type = PyExc_IOError;
+    break;
+  case SWIG_RuntimeError:
+    type = PyExc_RuntimeError;
+    break;
+  case SWIG_IndexError:
+    type = PyExc_IndexError;
+    break;
+  case SWIG_TypeError:
+    type = PyExc_TypeError;
+    break;
+  case SWIG_DivisionByZero:
+    type = PyExc_ZeroDivisionError;
+    break;
+  case SWIG_OverflowError:
+    type = PyExc_OverflowError;
+    break;
+  case SWIG_SyntaxError:
+    type = PyExc_SyntaxError;
+    break;
+  case SWIG_ValueError:
+    type = PyExc_ValueError;
+    break;
+  case SWIG_SystemError:
+    type = PyExc_SystemError;
+    break;
+  case SWIG_AttributeError:
+    type = PyExc_AttributeError;
+    break;
+  default:
+    type = PyExc_RuntimeError;
+  }
+  return type;
+}
+
+
+SWIGRUNTIME void
+SWIG_Python_AddErrorMsg(const char* mesg)
+{
+  PyObject *type = 0;
+  PyObject *value = 0;
+  PyObject *traceback = 0;
+
+  if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback);
+  if (value) {
+    char *tmp;
+    PyObject *old_str = PyObject_Str(value);
+    PyErr_Clear();
+    Py_XINCREF(type);
+
+    PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(old_str);
+    Py_DECREF(value);
+  } else {
+    PyErr_SetString(PyExc_RuntimeError, mesg);
+  }
+}
+
+#if defined(SWIG_PYTHON_NO_THREADS)
+#  if defined(SWIG_PYTHON_THREADS)
+#    undef SWIG_PYTHON_THREADS
+#  endif
+#endif
+#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
+#  if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
+#    if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */
+#      define SWIG_PYTHON_USE_GIL
+#    endif
+#  endif
+#  if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
+#    ifndef SWIG_PYTHON_INITIALIZE_THREADS
+#     define SWIG_PYTHON_INITIALIZE_THREADS  PyEval_InitThreads() 
+#    endif
+#    ifdef __cplusplus /* C++ code */
+       class SWIG_Python_Thread_Block {
+         bool status;
+         PyGILState_STATE state;
+       public:
+         void end() { if (status) { PyGILState_Release(state); status = false;} }
+         SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
+         ~SWIG_Python_Thread_Block() { end(); }
+       };
+       class SWIG_Python_Thread_Allow {
+         bool status;
+         PyThreadState *save;
+       public:
+         void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
+         SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
+         ~SWIG_Python_Thread_Allow() { end(); }
+       };
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   SWIG_Python_Thread_Block _swig_thread_block
+#      define SWIG_PYTHON_THREAD_END_BLOCK     _swig_thread_block.end()
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   SWIG_Python_Thread_Allow _swig_thread_allow
+#      define SWIG_PYTHON_THREAD_END_ALLOW     _swig_thread_allow.end()
+#    else /* C code */
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
+#      define SWIG_PYTHON_THREAD_END_BLOCK     PyGILState_Release(_swig_thread_block)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   PyThreadState *_swig_thread_allow = PyEval_SaveThread()
+#      define SWIG_PYTHON_THREAD_END_ALLOW     PyEval_RestoreThread(_swig_thread_allow)
+#    endif
+#  else /* Old thread way, not implemented, user must provide it */
+#    if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
+#      define SWIG_PYTHON_INITIALIZE_THREADS
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
+#      define SWIG_PYTHON_THREAD_END_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
+#      define SWIG_PYTHON_THREAD_END_ALLOW
+#    endif
+#  endif
+#else /* No thread support */
+#  define SWIG_PYTHON_INITIALIZE_THREADS
+#  define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#  define SWIG_PYTHON_THREAD_END_BLOCK
+#  define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#  define SWIG_PYTHON_THREAD_END_ALLOW
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Python API portion that goes into the runtime
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Constant declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Constant Types */
+#define SWIG_PY_POINTER 4
+#define SWIG_PY_BINARY  5
+
+/* Constant information structure */
+typedef struct swig_const_info {
+  int type;
+  char *name;
+  long lvalue;
+  double dvalue;
+  void   *pvalue;
+  swig_type_info **ptype;
+} swig_const_info;
+
+
+/* -----------------------------------------------------------------------------
+ * Wrapper of PyInstanceMethod_New() used in Python 3
+ * It is exported to the generated module, used for -fastproxy
+ * ----------------------------------------------------------------------------- */
+#if PY_VERSION_HEX >= 0x03000000
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func)
+{
+  return PyInstanceMethod_New(func);
+}
+#else
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func))
+{
+  return NULL;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * pyrun.swg
+ *
+ * This file contains the runtime support for Python modules
+ * and includes code for managing global variables and pointer
+ * type checking.
+ *
+ * ----------------------------------------------------------------------------- */
+
+/* Common SWIG API */
+
+/* for raw pointers */
+#define SWIG_Python_ConvertPtr(obj, pptr, type, flags)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
+#define SWIG_ConvertPtr(obj, pptr, type, flags)         SWIG_Python_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
+
+#ifdef SWIGPYTHON_BUILTIN
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(self, ptr, type, flags)
+#else
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+#endif
+
+#define SWIG_InternalNewPointerObj(ptr, type, flags)	SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+
+#define SWIG_CheckImplicit(ty)                          SWIG_Python_CheckImplicit(ty) 
+#define SWIG_AcquirePtr(ptr, src)                       SWIG_Python_AcquirePtr(ptr, src)
+#define swig_owntype                                    int
+
+/* for raw packed data */
+#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewPackedObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+/* for class or struct pointers */
+#define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
+
+/* for C or C++ function pointers */
+#define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
+#define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_Python_NewPointerObj(NULL, ptr, type, 0)
+
+/* for C++ member pointers, ie, member methods */
+#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewMemberObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+
+/* Runtime API */
+
+#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule(clientdata)
+#define SWIG_SetModule(clientdata, pointer)             SWIG_Python_SetModule(pointer)
+#define SWIG_NewClientData(obj)                         SwigPyClientData_New(obj)
+
+#define SWIG_SetErrorObj                                SWIG_Python_SetErrorObj                            
+#define SWIG_SetErrorMsg                        	SWIG_Python_SetErrorMsg				   
+#define SWIG_ErrorType(code)                    	SWIG_Python_ErrorType(code)                        
+#define SWIG_Error(code, msg)            		SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) 
+#define SWIG_fail                        		goto fail					   
+
+
+/* Runtime API implementation */
+
+/* Error manipulation */
+
+SWIGINTERN void 
+SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK; 
+  PyErr_SetObject(errtype, obj);
+  Py_DECREF(obj);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+SWIGINTERN void 
+SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+  PyErr_SetString(errtype, msg);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+#define SWIG_Python_Raise(obj, type, desc)  SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)
+
+/* Set a constant value */
+
+#if defined(SWIGPYTHON_BUILTIN)
+
+SWIGINTERN void
+SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) {
+  PyObject *s = PyString_InternFromString(key);
+  PyList_Append(seq, s);
+  Py_DECREF(s);
+}
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) {   
+#if PY_VERSION_HEX < 0x02030000
+  PyDict_SetItemString(d, (char *)name, obj);
+#else
+  PyDict_SetItemString(d, name, obj);
+#endif
+  Py_DECREF(obj);
+  if (public_interface)
+    SwigPyBuiltin_AddPublicSymbol(public_interface, name);
+}
+
+#else
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {   
+#if PY_VERSION_HEX < 0x02030000
+  PyDict_SetItemString(d, (char *)name, obj);
+#else
+  PyDict_SetItemString(d, name, obj);
+#endif
+  Py_DECREF(obj);                            
+}
+
+#endif
+
+/* Append a value to the result obj */
+
+SWIGINTERN PyObject*
+SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
+#if !defined(SWIG_PYTHON_OUTPUT_TUPLE)
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyList_Check(result)) {
+      PyObject *o2 = result;
+      result = PyList_New(1);
+      PyList_SetItem(result, 0, o2);
+    }
+    PyList_Append(result,obj);
+    Py_DECREF(obj);
+  }
+  return result;
+#else
+  PyObject*   o2;
+  PyObject*   o3;
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyTuple_Check(result)) {
+      o2 = result;
+      result = PyTuple_New(1);
+      PyTuple_SET_ITEM(result, 0, o2);
+    }
+    o3 = PyTuple_New(1);
+    PyTuple_SET_ITEM(o3, 0, obj);
+    o2 = result;
+    result = PySequence_Concat(o2, o3);
+    Py_DECREF(o2);
+    Py_DECREF(o3);
+  }
+  return result;
+#endif
+}
+
+/* Unpack the argument tuple */
+
+SWIGINTERN Py_ssize_t
+SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
+{
+  if (!args) {
+    if (!min && !max) {
+      return 1;
+    } else {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", 
+		   name, (min == max ? "" : "at least "), (int)min);
+      return 0;
+    }
+  }  
+  if (!PyTuple_Check(args)) {
+    if (min <= 1 && max >= 1) {
+      Py_ssize_t i;
+      objs[0] = args;
+      for (i = 1; i < max; ++i) {
+	objs[i] = 0;
+      }
+      return 2;
+    }
+    PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
+    return 0;
+  } else {
+    Py_ssize_t l = PyTuple_GET_SIZE(args);
+    if (l < min) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at least "), (int)min, (int)l);
+      return 0;
+    } else if (l > max) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at most "), (int)max, (int)l);
+      return 0;
+    } else {
+      Py_ssize_t i;
+      for (i = 0; i < l; ++i) {
+	objs[i] = PyTuple_GET_ITEM(args, i);
+      }
+      for (; l < max; ++l) {
+	objs[l] = 0;
+      }
+      return i + 1;
+    }    
+  }
+}
+
+/* A functor is a function object with one single object argument */
+#if PY_VERSION_HEX >= 0x02020000
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunctionObjArgs(functor, obj, NULL);
+#else
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunction(functor, "O", obj);
+#endif
+
+/*
+  Helper for static pointer initialization for both C and C++ code, for example
+  static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
+*/
+#ifdef __cplusplus
+#define SWIG_STATIC_POINTER(var)  var
+#else
+#define SWIG_STATIC_POINTER(var)  var = 0; if (!var) var
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Pointer declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_NOSHADOW       (SWIG_POINTER_OWN      << 1)
+#define SWIG_POINTER_NEW            (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)
+
+#define SWIG_POINTER_IMPLICIT_CONV  (SWIG_POINTER_DISOWN   << 1)
+
+#define SWIG_BUILTIN_TP_INIT	    (SWIG_POINTER_OWN << 2)
+#define SWIG_BUILTIN_INIT	    (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*  How to access Py_None */
+#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#  ifndef SWIG_PYTHON_NO_BUILD_NONE
+#    ifndef SWIG_PYTHON_BUILD_NONE
+#      define SWIG_PYTHON_BUILD_NONE
+#    endif
+#  endif
+#endif
+
+#ifdef SWIG_PYTHON_BUILD_NONE
+#  ifdef Py_None
+#   undef Py_None
+#   define Py_None SWIG_Py_None()
+#  endif
+SWIGRUNTIMEINLINE PyObject * 
+_SWIG_Py_None(void)
+{
+  PyObject *none = Py_BuildValue((char*)"");
+  Py_DECREF(none);
+  return none;
+}
+SWIGRUNTIME PyObject * 
+SWIG_Py_None(void)
+{
+  static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None();
+  return none;
+}
+#endif
+
+/* The python void return value */
+
+SWIGRUNTIMEINLINE PyObject * 
+SWIG_Py_Void(void)
+{
+  PyObject *none = Py_None;
+  Py_INCREF(none);
+  return none;
+}
+
+/* SwigPyClientData */
+
+typedef struct {
+  PyObject *klass;
+  PyObject *newraw;
+  PyObject *newargs;
+  PyObject *destroy;
+  int delargs;
+  int implicitconv;
+  PyTypeObject *pytype;
+} SwigPyClientData;
+
+SWIGRUNTIMEINLINE int 
+SWIG_Python_CheckImplicit(swig_type_info *ty)
+{
+  SwigPyClientData *data = (SwigPyClientData *)ty->clientdata;
+  return data ? data->implicitconv : 0;
+}
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_ExceptionType(swig_type_info *desc) {
+  SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0;
+  PyObject *klass = data ? data->klass : 0;
+  return (klass ? klass : PyExc_RuntimeError);
+}
+
+
+SWIGRUNTIME SwigPyClientData * 
+SwigPyClientData_New(PyObject* obj)
+{
+  if (!obj) {
+    return 0;
+  } else {
+    SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData));
+    /* the klass element */
+    data->klass = obj;
+    Py_INCREF(data->klass);
+    /* the newraw method and newargs arguments used to create a new raw instance */
+    if (PyClass_Check(obj)) {
+      data->newraw = 0;
+      data->newargs = obj;
+      Py_INCREF(obj);
+    } else {
+#if (PY_VERSION_HEX < 0x02020000)
+      data->newraw = 0;
+#else
+      data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__");
+#endif
+      if (data->newraw) {
+	Py_INCREF(data->newraw);
+	data->newargs = PyTuple_New(1);
+	PyTuple_SetItem(data->newargs, 0, obj);
+      } else {
+	data->newargs = obj;
+      }
+      Py_INCREF(data->newargs);
+    }
+    /* the destroy method, aka as the C++ delete method */
+    data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__");
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      data->destroy = 0;
+    }
+    if (data->destroy) {
+      int flags;
+      Py_INCREF(data->destroy);
+      flags = PyCFunction_GET_FLAGS(data->destroy);
+#ifdef METH_O
+      data->delargs = !(flags & (METH_O));
+#else
+      data->delargs = 0;
+#endif
+    } else {
+      data->delargs = 0;
+    }
+    data->implicitconv = 0;
+    data->pytype = 0;
+    return data;
+  }
+}
+
+SWIGRUNTIME void 
+SwigPyClientData_Del(SwigPyClientData *data) {
+  Py_XDECREF(data->newraw);
+  Py_XDECREF(data->newargs);
+  Py_XDECREF(data->destroy);
+}
+
+/* =============== SwigPyObject =====================*/
+
+typedef struct {
+  PyObject_HEAD
+  void *ptr;
+  swig_type_info *ty;
+  int own;
+  PyObject *next;
+#ifdef SWIGPYTHON_BUILTIN
+  PyObject *dict;
+#endif
+} SwigPyObject;
+
+
+#ifdef SWIGPYTHON_BUILTIN
+
+SWIGRUNTIME PyObject *
+SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+
+  if (!sobj->dict)
+    sobj->dict = PyDict_New();
+
+  Py_INCREF(sobj->dict);
+  return sobj->dict;
+}
+
+#endif
+
+SWIGRUNTIME PyObject *
+SwigPyObject_long(SwigPyObject *v)
+{
+  return PyLong_FromVoidPtr(v->ptr);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_format(const char* fmt, SwigPyObject *v)
+{
+  PyObject *res = NULL;
+  PyObject *args = PyTuple_New(1);
+  if (args) {
+    if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) {
+      PyObject *ofmt = SWIG_Python_str_FromChar(fmt);
+      if (ofmt) {
+#if PY_VERSION_HEX >= 0x03000000
+	res = PyUnicode_Format(ofmt,args);
+#else
+	res = PyString_Format(ofmt,args);
+#endif
+	Py_DECREF(ofmt);
+      }
+      Py_DECREF(args);
+    }
+  }
+  return res;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_oct(SwigPyObject *v)
+{
+  return SwigPyObject_format("%o",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_hex(SwigPyObject *v)
+{
+  return SwigPyObject_format("%x",v);
+}
+
+SWIGRUNTIME PyObject *
+#ifdef METH_NOARGS
+SwigPyObject_repr(SwigPyObject *v)
+#else
+SwigPyObject_repr(SwigPyObject *v, PyObject *args)
+#endif
+{
+  const char *name = SWIG_TypePrettyName(v->ty);
+  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", (name ? name : "unknown"), (void *)v);
+  if (v->next) {
+# ifdef METH_NOARGS
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
+# else
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args);
+# endif
+# if PY_VERSION_HEX >= 0x03000000
+    PyObject *joined = PyUnicode_Concat(repr, nrep);
+    Py_DecRef(repr);
+    Py_DecRef(nrep);
+    repr = joined;
+# else
+    PyString_ConcatAndDel(&repr,nrep);
+# endif
+  }
+  return repr;  
+}
+
+SWIGRUNTIME int
+SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
+{
+  void *i = v->ptr;
+  void *j = w->ptr;
+  return (i < j) ? -1 : ((i > j) ? 1 : 0);
+}
+
+/* Added for Python 3.x, would it also be useful for Python 2.x? */
+SWIGRUNTIME PyObject*
+SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op)
+{
+  PyObject* res;
+  if( op != Py_EQ && op != Py_NE ) {
+    Py_INCREF(Py_NotImplemented);
+    return Py_NotImplemented;
+  }
+  res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0);
+  return res;  
+}
+
+
+SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void);
+
+#ifdef SWIGPYTHON_BUILTIN
+static swig_type_info *SwigPyObject_stype = 0;
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+    SwigPyClientData *cd;
+    assert(SwigPyObject_stype);
+    cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+    assert(cd);
+    assert(cd->pytype);
+    return cd->pytype;
+}
+#else
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce();
+  return type;
+}
+#endif
+
+SWIGRUNTIMEINLINE int
+SwigPyObject_Check(PyObject *op) {
+#ifdef SWIGPYTHON_BUILTIN
+  PyTypeObject *target_tp = SwigPyObject_type();
+  if (PyType_IsSubtype(op->ob_type, target_tp))
+    return 1;
+  return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0);
+#else
+  return (Py_TYPE(op) == SwigPyObject_type())
+    || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0);
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own);
+
+SWIGRUNTIME void
+SwigPyObject_dealloc(PyObject *v)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  PyObject *next = sobj->next;
+  if (sobj->own == SWIG_POINTER_OWN) {
+    swig_type_info *ty = sobj->ty;
+    SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+    PyObject *destroy = data ? data->destroy : 0;
+    if (destroy) {
+      /* destroy is always a VARARGS method */
+      PyObject *res;
+
+      /* PyObject_CallFunction() has the potential to silently drop
+         the active active exception.  In cases of unnamed temporary
+         variable or where we just finished iterating over a generator
+         StopIteration will be active right now, and this needs to
+         remain true upon return from SwigPyObject_dealloc.  So save
+         and restore. */
+      
+      PyObject *val = NULL, *type = NULL, *tb = NULL;
+      PyErr_Fetch(&val, &type, &tb);
+
+      if (data->delargs) {
+        /* we need to create a temporary object to carry the destroy operation */
+        PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
+        res = SWIG_Python_CallFunctor(destroy, tmp);
+        Py_DECREF(tmp);
+      } else {
+        PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
+        PyObject *mself = PyCFunction_GET_SELF(destroy);
+        res = ((*meth)(mself, v));
+      }
+      if (!res)
+        PyErr_WriteUnraisable(destroy);
+
+      PyErr_Restore(val, type, tb);
+
+      Py_XDECREF(res);
+    } 
+#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
+    else {
+      const char *name = SWIG_TypePrettyName(ty);
+      printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown"));
+    }
+#endif
+  } 
+  Py_XDECREF(next);
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyObject* 
+SwigPyObject_append(PyObject* v, PyObject* next)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+#ifndef METH_O
+  PyObject *tmp = 0;
+  if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL;
+  next = tmp;
+#endif
+  if (!SwigPyObject_Check(next)) {
+    PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject");
+    return NULL;
+  }
+  sobj->next = next;
+  Py_INCREF(next);
+  return SWIG_Py_Void();
+}
+
+SWIGRUNTIME PyObject* 
+#ifdef METH_NOARGS
+SwigPyObject_next(PyObject* v)
+#else
+SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  if (sobj->next) {    
+    Py_INCREF(sobj->next);
+    return sobj->next;
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_disown(PyObject *v)
+#else
+SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = 0;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_acquire(PyObject *v)
+#else
+SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = SWIG_POINTER_OWN;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_own(PyObject *v, PyObject *args)
+{
+  PyObject *val = 0;
+#if (PY_VERSION_HEX < 0x02020000)
+  if (!PyArg_ParseTuple(args,(char *)"|O:own",&val))
+#elif (PY_VERSION_HEX < 0x02050000)
+  if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) 
+#else
+  if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) 
+#endif
+    {
+      return NULL;
+    } 
+  else
+    {
+      SwigPyObject *sobj = (SwigPyObject *)v;
+      PyObject *obj = PyBool_FromLong(sobj->own);
+      if (val) {
+#ifdef METH_NOARGS
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v);
+	} else {
+	  SwigPyObject_disown(v);
+	}
+#else
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v,args);
+	} else {
+	  SwigPyObject_disown(v,args);
+	}
+#endif
+      } 
+      return obj;
+    }
+}
+
+#ifdef METH_O
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_NOARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS,  (char *)"acquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_O,       (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_NOARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_NOARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#else
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_VARARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS,  (char *)"acquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS,  (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_VARARGS,  (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_VARARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,   METH_VARARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#endif
+
+#if PY_VERSION_HEX < 0x02020000
+SWIGINTERN PyObject *
+SwigPyObject_getattr(SwigPyObject *sobj,char *name)
+{
+  return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name);
+}
+#endif
+
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_TypeOnce(void) {
+  static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
+
+  static PyNumberMethods SwigPyObject_as_number = {
+    (binaryfunc)0, /*nb_add*/
+    (binaryfunc)0, /*nb_subtract*/
+    (binaryfunc)0, /*nb_multiply*/
+    /* nb_divide removed in Python 3 */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc)0, /*nb_divide*/
+#endif
+    (binaryfunc)0, /*nb_remainder*/
+    (binaryfunc)0, /*nb_divmod*/
+    (ternaryfunc)0,/*nb_power*/
+    (unaryfunc)0,  /*nb_negative*/
+    (unaryfunc)0,  /*nb_positive*/
+    (unaryfunc)0,  /*nb_absolute*/
+    (inquiry)0,    /*nb_nonzero*/
+    0,		   /*nb_invert*/
+    0,		   /*nb_lshift*/
+    0,		   /*nb_rshift*/
+    0,		   /*nb_and*/
+    0,		   /*nb_xor*/
+    0,		   /*nb_or*/
+#if PY_VERSION_HEX < 0x03000000
+    0,   /*nb_coerce*/
+#endif
+    (unaryfunc)SwigPyObject_long, /*nb_int*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_long, /*nb_long*/
+#else
+    0, /*nb_reserved*/
+#endif
+    (unaryfunc)0,                 /*nb_float*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_oct,  /*nb_oct*/
+    (unaryfunc)SwigPyObject_hex,  /*nb_hex*/
+#endif
+#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */
+#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
+#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
+#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */
+#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */
+    0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */
+#endif
+  };
+
+  static PyTypeObject swigpyobject_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyObject",               /* tp_name */
+      sizeof(SwigPyObject),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyObject_dealloc,     /* tp_dealloc */
+      0,				    /* tp_print */
+#if PY_VERSION_HEX < 0x02020000
+      (getattrfunc)SwigPyObject_getattr,    /* tp_getattr */
+#else
+      (getattrfunc)0,                       /* tp_getattr */
+#endif
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+#else
+      (cmpfunc)SwigPyObject_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyObject_repr,          /* tp_repr */
+      &SwigPyObject_as_number,              /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      0,				    /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigobject_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      swigobject_methods,                   /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
+#endif
+#ifdef COUNT_ALLOCS
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+      0,                                    /* tp_prev */
+#endif
+      0                                     /* tp_next */
+#endif
+    };
+    swigpyobject_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpyobject_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpyobject_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpyobject_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own)
+{
+  SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type());
+  if (sobj) {
+    sobj->ptr  = ptr;
+    sobj->ty   = ty;
+    sobj->own  = own;
+    sobj->next = 0;
+  }
+  return (PyObject *)sobj;
+}
+
+/* -----------------------------------------------------------------------------
+ * Implements a simple Swig Packed type, and use it instead of string
+ * ----------------------------------------------------------------------------- */
+
+typedef struct {
+  PyObject_HEAD
+  void *pack;
+  swig_type_info *ty;
+  size_t size;
+} SwigPyPacked;
+
+SWIGRUNTIME int
+SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags))
+{
+  char result[SWIG_BUFFER_SIZE];
+  fputs("<Swig Packed ", fp); 
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    fputs("at ", fp); 
+    fputs(result, fp); 
+  }
+  fputs(v->ty->name,fp); 
+  fputs(">", fp);
+  return 0; 
+}
+  
+SWIGRUNTIME PyObject *
+SwigPyPacked_repr(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name);
+  }  
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_str(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
+    return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromChar(v->ty->name);
+  }  
+}
+
+SWIGRUNTIME int
+SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w)
+{
+  size_t i = v->size;
+  size_t j = w->size;
+  int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
+  return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size);
+}
+
+SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void);
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce();
+  return type;
+}
+
+SWIGRUNTIMEINLINE int
+SwigPyPacked_Check(PyObject *op) {
+  return ((op)->ob_type == SwigPyPacked_TypeOnce()) 
+    || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0);
+}
+
+SWIGRUNTIME void
+SwigPyPacked_dealloc(PyObject *v)
+{
+  if (SwigPyPacked_Check(v)) {
+    SwigPyPacked *sobj = (SwigPyPacked *) v;
+    free(sobj->pack);
+  }
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_TypeOnce(void) {
+  static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
+  static PyTypeObject swigpypacked_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX>=0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyPacked",               /* tp_name */
+      sizeof(SwigPyPacked),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyPacked_dealloc,     /* tp_dealloc */
+      (printfunc)SwigPyPacked_print,        /* tp_print */
+      (getattrfunc)0,                       /* tp_getattr */
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX>=0x03000000
+      0, /* tp_reserved in 3.0.1 */
+#else
+      (cmpfunc)SwigPyPacked_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyPacked_repr,          /* tp_repr */
+      0,                                    /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      (reprfunc)SwigPyPacked_str,           /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigpacked_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      0,                                    /* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      0,                                    /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
+#endif
+#ifdef COUNT_ALLOCS
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+      0,                                    /* tp_prev */
+#endif
+      0                                     /* tp_next */
+#endif
+    };
+    swigpypacked_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpypacked_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpypacked_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpypacked_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty)
+{
+  SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type());
+  if (sobj) {
+    void *pack = malloc(size);
+    if (pack) {
+      memcpy(pack, ptr, size);
+      sobj->pack = pack;
+      sobj->ty   = ty;
+      sobj->size = size;
+    } else {
+      PyObject_DEL((PyObject *) sobj);
+      sobj = 0;
+    }
+  }
+  return (PyObject *) sobj;
+}
+
+SWIGRUNTIME swig_type_info *
+SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
+{
+  if (SwigPyPacked_Check(obj)) {
+    SwigPyPacked *sobj = (SwigPyPacked *)obj;
+    if (sobj->size != size) return 0;
+    memcpy(ptr, sobj->pack, size);
+    return sobj->ty;
+  } else {
+    return 0;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * pointers/data manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIMEINLINE PyObject *
+_SWIG_This(void)
+{
+    return SWIG_Python_str_FromChar("this");
+}
+
+static PyObject *swig_this = NULL;
+
+SWIGRUNTIME PyObject *
+SWIG_This(void)
+{
+  if (swig_this == NULL)
+    swig_this = _SWIG_This();
+  return swig_this;
+}
+
+/* #define SWIG_PYTHON_SLOW_GETSET_THIS */
+
+/* TODO: I don't know how to implement the fast getset in Python 3 right now */
+#if PY_VERSION_HEX>=0x03000000
+#define SWIG_PYTHON_SLOW_GETSET_THIS 
+#endif
+
+SWIGRUNTIME SwigPyObject *
+SWIG_Python_GetSwigThis(PyObject *pyobj) 
+{
+  PyObject *obj;
+
+  if (SwigPyObject_Check(pyobj))
+    return (SwigPyObject *) pyobj;
+
+#ifdef SWIGPYTHON_BUILTIN
+  (void)obj;
+# ifdef PyWeakref_CheckProxy
+  if (PyWeakref_CheckProxy(pyobj)) {
+    pyobj = PyWeakref_GET_OBJECT(pyobj);
+    if (pyobj && SwigPyObject_Check(pyobj))
+      return (SwigPyObject*) pyobj;
+  }
+# endif
+  return NULL;
+#else
+
+  obj = 0;
+
+#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000))
+  if (PyInstance_Check(pyobj)) {
+    obj = _PyInstance_Lookup(pyobj, SWIG_This());      
+  } else {
+    PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
+    if (dictptr != NULL) {
+      PyObject *dict = *dictptr;
+      obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
+    } else {
+#ifdef PyWeakref_CheckProxy
+      if (PyWeakref_CheckProxy(pyobj)) {
+	PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
+	return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
+      }
+#endif
+      obj = PyObject_GetAttr(pyobj,SWIG_This());
+      if (obj) {
+	Py_DECREF(obj);
+      } else {
+	if (PyErr_Occurred()) PyErr_Clear();
+	return 0;
+      }
+    }
+  }
+#else
+  obj = PyObject_GetAttr(pyobj,SWIG_This());
+  if (obj) {
+    Py_DECREF(obj);
+  } else {
+    if (PyErr_Occurred()) PyErr_Clear();
+    return 0;
+  }
+#endif
+  if (obj && !SwigPyObject_Check(obj)) {
+    /* a PyObject is called 'this', try to get the 'real this'
+       SwigPyObject from it */ 
+    return SWIG_Python_GetSwigThis(obj);
+  }
+  return (SwigPyObject *)obj;
+#endif
+}
+
+/* Acquire a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_AcquirePtr(PyObject *obj, int own) {
+  if (own == SWIG_POINTER_OWN) {
+    SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
+    if (sobj) {
+      int oldown = sobj->own;
+      sobj->own = own;
+      return oldown;
+    }
+  }
+  return 0;
+}
+
+/* Convert a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
+  int res;
+  SwigPyObject *sobj;
+  int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
+
+  if (!obj)
+    return SWIG_ERROR;
+  if (obj == Py_None && !implicit_conv) {
+    if (ptr)
+      *ptr = 0;
+    return SWIG_OK;
+  }
+
+  res = SWIG_ERROR;
+
+  sobj = SWIG_Python_GetSwigThis(obj);
+  if (own)
+    *own = 0;
+  while (sobj) {
+    void *vptr = sobj->ptr;
+    if (ty) {
+      swig_type_info *to = sobj->ty;
+      if (to == ty) {
+        /* no type cast needed */
+        if (ptr) *ptr = vptr;
+        break;
+      } else {
+        swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+        if (!tc) {
+          sobj = (SwigPyObject *)sobj->next;
+        } else {
+          if (ptr) {
+            int newmemory = 0;
+            *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+            if (newmemory == SWIG_CAST_NEW_MEMORY) {
+              assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+              if (own)
+                *own = *own | SWIG_CAST_NEW_MEMORY;
+            }
+          }
+          break;
+        }
+      }
+    } else {
+      if (ptr) *ptr = vptr;
+      break;
+    }
+  }
+  if (sobj) {
+    if (own)
+      *own = *own | sobj->own;
+    if (flags & SWIG_POINTER_DISOWN) {
+      sobj->own = 0;
+    }
+    res = SWIG_OK;
+  } else {
+    if (implicit_conv) {
+      SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+      if (data && !data->implicitconv) {
+        PyObject *klass = data->klass;
+        if (klass) {
+          PyObject *impconv;
+          data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
+          impconv = SWIG_Python_CallFunctor(klass, obj);
+          data->implicitconv = 0;
+          if (PyErr_Occurred()) {
+            PyErr_Clear();
+            impconv = 0;
+          }
+          if (impconv) {
+            SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv);
+            if (iobj) {
+              void *vptr;
+              res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
+              if (SWIG_IsOK(res)) {
+                if (ptr) {
+                  *ptr = vptr;
+                  /* transfer the ownership to 'ptr' */
+                  iobj->own = 0;
+                  res = SWIG_AddCast(res);
+                  res = SWIG_AddNewMask(res);
+                } else {
+                  res = SWIG_AddCast(res);		    
+                }
+              }
+            }
+            Py_DECREF(impconv);
+          }
+        }
+      }
+    }
+    if (!SWIG_IsOK(res) && obj == Py_None) {
+      if (ptr)
+        *ptr = 0;
+      if (PyErr_Occurred())
+        PyErr_Clear();
+      res = SWIG_OK;
+    }
+  }
+  return res;
+}
+
+/* Convert a function ptr value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
+  if (!PyCFunction_Check(obj)) {
+    return SWIG_ConvertPtr(obj, ptr, ty, 0);
+  } else {
+    void *vptr = 0;
+    
+    /* here we get the method pointer for callbacks */
+    const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
+    const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
+    if (desc)
+      desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
+    if (!desc) 
+      return SWIG_ERROR;
+    if (ty) {
+      swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
+      if (tc) {
+        int newmemory = 0;
+        *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+        assert(!newmemory); /* newmemory handling not yet implemented */
+      } else {
+        return SWIG_ERROR;
+      }
+    } else {
+      *ptr = vptr;
+    }
+    return SWIG_OK;
+  }
+}
+
+/* Convert a packed value value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
+  swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz);
+  if (!to) return SWIG_ERROR;
+  if (ty) {
+    if (to != ty) {
+      /* check type cast? */
+      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+      if (!tc) return SWIG_ERROR;
+    }
+  }
+  return SWIG_OK;
+}  
+
+/* -----------------------------------------------------------------------------
+ * Create a new pointer object
+ * ----------------------------------------------------------------------------- */
+
+/*
+  Create a new instance object, without calling __init__, and set the
+  'this' attribute.
+*/
+
+SWIGRUNTIME PyObject* 
+SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
+{
+#if (PY_VERSION_HEX >= 0x02020000)
+  PyObject *inst = 0;
+  PyObject *newraw = data->newraw;
+  if (newraw) {
+    inst = PyObject_Call(newraw, data->newargs, NULL);
+    if (inst) {
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+      PyObject **dictptr = _PyObject_GetDictPtr(inst);
+      if (dictptr != NULL) {
+	PyObject *dict = *dictptr;
+	if (dict == NULL) {
+	  dict = PyDict_New();
+	  *dictptr = dict;
+	  PyDict_SetItem(dict, SWIG_This(), swig_this);
+	}
+      }
+#else
+      PyObject *key = SWIG_This();
+      PyObject_SetAttr(inst, key, swig_this);
+#endif
+    }
+  } else {
+#if PY_VERSION_HEX >= 0x03000000
+    inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
+    if (inst) {
+      PyObject_SetAttr(inst, SWIG_This(), swig_this);
+      Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
+    }
+#else
+    PyObject *dict = PyDict_New();
+    if (dict) {
+      PyDict_SetItem(dict, SWIG_This(), swig_this);
+      inst = PyInstance_NewRaw(data->newargs, dict);
+      Py_DECREF(dict);
+    }
+#endif
+  }
+  return inst;
+#else
+#if (PY_VERSION_HEX >= 0x02010000)
+  PyObject *inst = 0;
+  PyObject *dict = PyDict_New();
+  if (dict) {
+    PyDict_SetItem(dict, SWIG_This(), swig_this);
+    inst = PyInstance_NewRaw(data->newargs, dict);
+    Py_DECREF(dict);
+  }
+  return (PyObject *) inst;
+#else
+  PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
+  if (inst == NULL) {
+    return NULL;
+  }
+  inst->in_class = (PyClassObject *)data->newargs;
+  Py_INCREF(inst->in_class);
+  inst->in_dict = PyDict_New();
+  if (inst->in_dict == NULL) {
+    Py_DECREF(inst);
+    return NULL;
+  }
+#ifdef Py_TPFLAGS_HAVE_WEAKREFS
+  inst->in_weakreflist = NULL;
+#endif
+#ifdef Py_TPFLAGS_GC
+  PyObject_GC_Init(inst);
+#endif
+  PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this);
+  return (PyObject *) inst;
+#endif
+#endif
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
+{
+ PyObject *dict;
+#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+ PyObject **dictptr = _PyObject_GetDictPtr(inst);
+ if (dictptr != NULL) {
+   dict = *dictptr;
+   if (dict == NULL) {
+     dict = PyDict_New();
+     *dictptr = dict;
+   }
+   PyDict_SetItem(dict, SWIG_This(), swig_this);
+   return;
+ }
+#endif
+ dict = PyObject_GetAttrString(inst, (char*)"__dict__");
+ PyDict_SetItem(dict, SWIG_This(), swig_this);
+ Py_DECREF(dict);
+} 
+
+
+SWIGINTERN PyObject *
+SWIG_Python_InitShadowInstance(PyObject *args) {
+  PyObject *obj[2];
+  if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) {
+    return NULL;
+  } else {
+    SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
+    if (sthis) {
+      SwigPyObject_append((PyObject*) sthis, obj[1]);
+    } else {
+      SWIG_Python_SetSwigThis(obj[0], obj[1]);
+    }
+    return SWIG_Py_Void();
+  }
+}
+
+/* Create a new pointer object */
+
+SWIGRUNTIME PyObject *
+SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) {
+  SwigPyClientData *clientdata;
+  PyObject * robj;
+  int own;
+
+  if (!ptr)
+    return SWIG_Py_Void();
+
+  clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0;
+  own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
+  if (clientdata && clientdata->pytype) {
+    SwigPyObject *newobj;
+    if (flags & SWIG_BUILTIN_TP_INIT) {
+      newobj = (SwigPyObject*) self;
+      if (newobj->ptr) {
+        PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0);
+        while (newobj->next)
+	  newobj = (SwigPyObject *) newobj->next;
+        newobj->next = next_self;
+        newobj = (SwigPyObject *)next_self;
+#ifdef SWIGPYTHON_BUILTIN
+        newobj->dict = 0;
+#endif
+      }
+    } else {
+      newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+#ifdef SWIGPYTHON_BUILTIN
+      newobj->dict = 0;
+#endif
+    }
+    if (newobj) {
+      newobj->ptr = ptr;
+      newobj->ty = type;
+      newobj->own = own;
+      newobj->next = 0;
+      return (PyObject*) newobj;
+    }
+    return SWIG_Py_Void();
+  }
+
+  assert(!(flags & SWIG_BUILTIN_TP_INIT));
+
+  robj = SwigPyObject_New(ptr, type, own);
+  if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
+    PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
+    Py_DECREF(robj);
+    robj = inst;
+  }
+  return robj;
+}
+
+/* Create a new packed object */
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
+  return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
+}
+
+/* -----------------------------------------------------------------------------*
+ *  Get type list 
+ * -----------------------------------------------------------------------------*/
+
+#ifdef SWIG_LINK_RUNTIME
+void *SWIG_ReturnGlobalTypeList(void *);
+#endif
+
+SWIGRUNTIME swig_module_info *
+SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
+  static void *type_pointer = (void *)0;
+  /* first check if module already created */
+  if (!type_pointer) {
+#ifdef SWIG_LINK_RUNTIME
+    type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
+#else
+# ifdef SWIGPY_USE_CAPSULE
+    type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0);
+# else
+    type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
+				    (char*)"type_pointer" SWIG_TYPE_TABLE_NAME);
+# endif
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      type_pointer = (void *)0;
+    }
+#endif
+  }
+  return (swig_module_info *) type_pointer;
+}
+
+#if PY_MAJOR_VERSION < 2
+/* PyModule_AddObject function was introduced in Python 2.0.  The following function
+   is copied out of Python/modsupport.c in python version 2.3.4 */
+SWIGINTERN int
+PyModule_AddObject(PyObject *m, char *name, PyObject *o)
+{
+  PyObject *dict;
+  if (!PyModule_Check(m)) {
+    PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg");
+    return SWIG_ERROR;
+  }
+  if (!o) {
+    PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value");
+    return SWIG_ERROR;
+  }
+  
+  dict = PyModule_GetDict(m);
+  if (dict == NULL) {
+    /* Internal error -- modules must have a dict! */
+    PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
+		 PyModule_GetName(m));
+    return SWIG_ERROR;
+  }
+  if (PyDict_SetItemString(dict, name, o))
+    return SWIG_ERROR;
+  Py_DECREF(o);
+  return SWIG_OK;
+}
+#endif
+
+SWIGRUNTIME void
+#ifdef SWIGPY_USE_CAPSULE
+SWIG_Python_DestroyModule(PyObject *obj)
+#else
+SWIG_Python_DestroyModule(void *vptr)
+#endif
+{
+#ifdef SWIGPY_USE_CAPSULE
+  swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME);
+#else
+  swig_module_info *swig_module = (swig_module_info *) vptr;
+#endif
+  swig_type_info **types = swig_module->types;
+  size_t i;
+  for (i =0; i < swig_module->size; ++i) {
+    swig_type_info *ty = types[i];
+    if (ty->owndata) {
+      SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
+      if (data) SwigPyClientData_Del(data);
+    }
+  }
+  Py_DECREF(SWIG_This());
+  swig_this = NULL;
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetModule(swig_module_info *swig_module) {
+#if PY_VERSION_HEX >= 0x03000000
+ /* Add a dummy module object into sys.modules */
+  PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION);
+#else
+  static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+  PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table);
+#endif
+#ifdef SWIGPY_USE_CAPSULE
+  PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#else
+  PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#endif
+}
+
+/* The python cached type query */
+SWIGRUNTIME PyObject *
+SWIG_Python_TypeCache(void) {
+  static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New();
+  return cache;
+}
+
+SWIGRUNTIME swig_type_info *
+SWIG_Python_TypeQuery(const char *type)
+{
+  PyObject *cache = SWIG_Python_TypeCache();
+  PyObject *key = SWIG_Python_str_FromChar(type); 
+  PyObject *obj = PyDict_GetItem(cache, key);
+  swig_type_info *descriptor;
+  if (obj) {
+#ifdef SWIGPY_USE_CAPSULE
+    descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL);
+#else
+    descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj);
+#endif
+  } else {
+    swig_module_info *swig_module = SWIG_GetModule(0);
+    descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
+    if (descriptor) {
+#ifdef SWIGPY_USE_CAPSULE
+      obj = PyCapsule_New((void*) descriptor, NULL, NULL);
+#else
+      obj = PyCObject_FromVoidPtr(descriptor, NULL);
+#endif
+      PyDict_SetItem(cache, key, obj);
+      Py_DECREF(obj);
+    }
+  }
+  Py_DECREF(key);
+  return descriptor;
+}
+
+/* 
+   For backward compatibility only
+*/
+#define SWIG_POINTER_EXCEPTION  0
+#define SWIG_arg_fail(arg)      SWIG_Python_ArgFail(arg)
+#define SWIG_MustGetPtr(p, type, argnum, flags)  SWIG_Python_MustGetPtr(p, type, argnum, flags)
+
+SWIGRUNTIME int
+SWIG_Python_AddErrMesg(const char* mesg, int infront)
+{  
+  if (PyErr_Occurred()) {
+    PyObject *type = 0;
+    PyObject *value = 0;
+    PyObject *traceback = 0;
+    PyErr_Fetch(&type, &value, &traceback);
+    if (value) {
+      char *tmp;
+      PyObject *old_str = PyObject_Str(value);
+      Py_XINCREF(type);
+      PyErr_Clear();
+      if (infront) {
+	PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str));
+      } else {
+	PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+      }
+      SWIG_Python_str_DelForPy3(tmp);
+      Py_DECREF(old_str);
+    }
+    return 1;
+  } else {
+    return 0;
+  }
+}
+  
+SWIGRUNTIME int
+SWIG_Python_ArgFail(int argnum)
+{
+  if (PyErr_Occurred()) {
+    /* add information about failing argument */
+    char mesg[256];
+    PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
+    return SWIG_Python_AddErrMesg(mesg, 1);
+  } else {
+    return 0;
+  }
+}
+
+SWIGRUNTIMEINLINE const char *
+SwigPyObject_GetDesc(PyObject *self)
+{
+  SwigPyObject *v = (SwigPyObject *)self;
+  swig_type_info *ty = v ? v->ty : 0;
+  return ty ? ty->str : "";
+}
+
+SWIGRUNTIME void
+SWIG_Python_TypeError(const char *type, PyObject *obj)
+{
+  if (type) {
+#if defined(SWIG_COBJECT_TYPES)
+    if (obj && SwigPyObject_Check(obj)) {
+      const char *otype = (const char *) SwigPyObject_GetDesc(obj);
+      if (otype) {
+	PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received",
+		     type, otype);
+	return;
+      }
+    } else 
+#endif      
+    {
+      const char *otype = (obj ? obj->ob_type->tp_name : 0); 
+      if (otype) {
+	PyObject *str = PyObject_Str(obj);
+	const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0;
+	if (cstr) {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
+		       type, otype, cstr);
+          SWIG_Python_str_DelForPy3(cstr);
+	} else {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
+		       type, otype);
+	}
+	Py_XDECREF(str);
+	return;
+      }
+    }   
+    PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
+  } else {
+    PyErr_Format(PyExc_TypeError, "unexpected type is received");
+  }
+}
+
+
+/* Convert a pointer value, signal an exception on a type mismatch */
+SWIGRUNTIME void *
+SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) {
+  void *result;
+  if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
+    PyErr_Clear();
+#if SWIG_POINTER_EXCEPTION
+    if (flags) {
+      SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj);
+      SWIG_Python_ArgFail(argnum);
+    }
+#endif
+  }
+  return result;
+}
+
+#ifdef SWIGPYTHON_BUILTIN
+SWIGRUNTIME int
+SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
+  PyTypeObject *tp = obj->ob_type;
+  PyObject *descr;
+  PyObject *encoded_name;
+  descrsetfunc f;
+  int res = -1;
+
+# ifdef Py_USING_UNICODE
+  if (PyString_Check(name)) {
+    name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL);
+    if (!name)
+      return -1;
+  } else if (!PyUnicode_Check(name))
+# else
+  if (!PyString_Check(name))
+# endif
+  {
+    PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name);
+    return -1;
+  } else {
+    Py_INCREF(name);
+  }
+
+  if (!tp->tp_dict) {
+    if (PyType_Ready(tp) < 0)
+      goto done;
+  }
+
+  descr = _PyType_Lookup(tp, name);
+  f = NULL;
+  if (descr != NULL)
+    f = descr->ob_type->tp_descr_set;
+  if (!f) {
+    if (PyString_Check(name)) {
+      encoded_name = name;
+      Py_INCREF(name);
+    } else {
+      encoded_name = PyUnicode_AsUTF8String(name);
+    }
+    PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name));
+    Py_DECREF(encoded_name);
+  } else {
+    res = f(descr, obj, value);
+  }
+  
+  done:
+  Py_DECREF(name);
+  return res;
+}
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
+
+
+
+  #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) 
+
+/* -----------------------------------------------------------------------------
+ * director_common.swg
+ *
+ * This file contains support for director classes which is common between
+ * languages.
+ * ----------------------------------------------------------------------------- */
+
+/*
+  Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the
+  'Swig' namespace. This could be useful for multi-modules projects.
+*/
+#ifdef SWIG_DIRECTOR_STATIC
+/* Force anonymous (static) namespace */
+#define Swig
+#endif
+/* -----------------------------------------------------------------------------
+ * director.swg
+ *
+ * This file contains support for director classes so that Python proxy
+ * methods can be called from C++.
+ * ----------------------------------------------------------------------------- */
+
+#ifndef SWIG_DIRECTOR_PYTHON_HEADER_
+#define SWIG_DIRECTOR_PYTHON_HEADER_
+
+#include <string>
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <map>
+
+
+/*
+  Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual
+  table', and avoid multiple GetAttr calls to retrieve the python
+  methods.
+*/
+
+#ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE
+#ifndef SWIG_PYTHON_DIRECTOR_VTABLE
+#define SWIG_PYTHON_DIRECTOR_VTABLE
+#endif
+#endif
+
+
+
+/*
+  Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the
+  Undefined Exception Handler provided by swig.
+*/
+#ifndef SWIG_DIRECTOR_NO_UEH
+#ifndef SWIG_DIRECTOR_UEH
+#define SWIG_DIRECTOR_UEH
+#endif
+#endif
+
+
+/*
+  Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the
+  native C++ RTTI and dynamic_cast<>. But be aware that directors
+  could stop working when using this option.
+*/
+#ifdef SWIG_DIRECTOR_NORTTI
+/*
+   When we don't use the native C++ RTTI, we implement a minimal one
+   only for Directors.
+*/
+# ifndef SWIG_DIRECTOR_RTDIR
+# define SWIG_DIRECTOR_RTDIR
+
+namespace Swig {
+  class Director;
+  SWIGINTERN std::map<void *, Director *>& get_rtdir_map() {
+    static std::map<void *, Director *> rtdir_map;
+    return rtdir_map;
+  }
+
+  SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) {
+    get_rtdir_map()[vptr] = rtdir;
+  }
+
+  SWIGINTERNINLINE Director *get_rtdir(void *vptr) {
+    std::map<void *, Director *>::const_iterator pos = get_rtdir_map().find(vptr);
+    Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0;
+    return rtdir;
+  }
+}
+# endif /* SWIG_DIRECTOR_RTDIR */
+
+# define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast<void *>(ARG))
+# define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast<void *>(ARG1), ARG2)
+
+#else
+
+# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast<Swig::Director *>(ARG)
+# define SWIG_DIRECTOR_RGTR(ARG1, ARG2)
+
+#endif /* SWIG_DIRECTOR_NORTTI */
+
+extern "C" {
+  struct swig_type_info;
+}
+
+namespace Swig {
+
+  /* memory handler */
+  struct GCItem {
+    virtual ~GCItem() {}
+
+    virtual int get_own() const {
+      return 0;
+    }
+  };
+
+  struct GCItem_var {
+    GCItem_var(GCItem *item = 0) : _item(item) {
+    }
+
+    GCItem_var& operator=(GCItem *item) {
+      GCItem *tmp = _item;
+      _item = item;
+      delete tmp;
+      return *this;
+    }
+
+    ~GCItem_var() {
+      delete _item;
+    }
+
+    GCItem * operator->() const {
+      return _item;
+    }
+
+  private:
+    GCItem *_item;
+  };
+
+  struct GCItem_Object : GCItem {
+    GCItem_Object(int own) : _own(own) {
+    }
+
+    virtual ~GCItem_Object() {
+    }
+
+    int get_own() const {
+      return _own;
+    }
+
+  private:
+    int _own;
+  };
+
+  template <typename Type>
+  struct GCItem_T : GCItem {
+    GCItem_T(Type *ptr) : _ptr(ptr) {
+    }
+
+    virtual ~GCItem_T() {
+      delete _ptr;
+    }
+
+  private:
+    Type *_ptr;
+  };
+
+  template <typename Type>
+  struct GCArray_T : GCItem {
+    GCArray_T(Type *ptr) : _ptr(ptr) {
+    }
+
+    virtual ~GCArray_T() {
+      delete[] _ptr;
+    }
+
+  private:
+    Type *_ptr;
+  };
+
+  /* base class for director exceptions */
+  class DirectorException : public std::exception {
+  protected:
+    std::string swig_msg;
+  public:
+    DirectorException(PyObject *error, const char *hdr ="", const char *msg ="") : swig_msg(hdr) {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (msg[0]) {
+        swig_msg += " ";
+        swig_msg += msg;
+      }
+      if (!PyErr_Occurred()) {
+        PyErr_SetString(error, what());
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+
+    virtual ~DirectorException() throw() {
+    }
+
+    /* Deprecated, use what() instead */
+    const char *getMessage() const {
+      return what();
+    }
+
+    const char *what() const throw() {
+      return swig_msg.c_str();
+    }
+
+    static void raise(PyObject *error, const char *msg) {
+      throw DirectorException(error, msg);
+    }
+
+    static void raise(const char *msg) {
+      raise(PyExc_RuntimeError, msg);
+    }
+  };
+
+  /* unknown exception handler  */
+  class UnknownExceptionHandler {
+#ifdef SWIG_DIRECTOR_UEH
+    static void handler() {
+      try {
+        throw;
+      } catch (DirectorException& e) {
+        std::cerr << "SWIG Director exception caught:" << std::endl
+                  << e.what() << std::endl;
+      } catch (std::exception& e) {
+        std::cerr << "std::exception caught: "<< e.what() << std::endl;
+      } catch (...) {
+        std::cerr << "Unknown exception caught." << std::endl;
+      }
+
+      std::cerr << std::endl
+                << "Python interpreter traceback:" << std::endl;
+      PyErr_Print();
+      std::cerr << std::endl;
+
+      std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl
+                << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl
+                << std::endl
+                << "Exception is being re-thrown, program will likely abort/terminate." << std::endl;
+      throw;
+    }
+
+  public:
+
+    std::unexpected_handler old;
+    UnknownExceptionHandler(std::unexpected_handler nh = handler) {
+      old = std::set_unexpected(nh);
+    }
+
+    ~UnknownExceptionHandler() {
+      std::set_unexpected(old);
+    }
+#endif
+  };
+
+  /* type mismatch in the return value from a python method call */
+  class DirectorTypeMismatchException : public DirectorException {
+  public:
+    DirectorTypeMismatchException(PyObject *error, const char *msg="")
+      : DirectorException(error, "SWIG director type mismatch", msg) {
+    }
+
+    DirectorTypeMismatchException(const char *msg="")
+      : DirectorException(PyExc_TypeError, "SWIG director type mismatch", msg) {
+    }
+
+    static void raise(PyObject *error, const char *msg) {
+      throw DirectorTypeMismatchException(error, msg);
+    }
+
+    static void raise(const char *msg) {
+      throw DirectorTypeMismatchException(msg);
+    }
+  };
+
+  /* any python exception that occurs during a director method call */
+  class DirectorMethodException : public DirectorException {
+  public:
+    DirectorMethodException(const char *msg = "")
+      : DirectorException(PyExc_RuntimeError, "SWIG director method error.", msg) {
+    }
+
+    static void raise(const char *msg) {
+      throw DirectorMethodException(msg);
+    }
+  };
+
+  /* attempt to call a pure virtual method via a director method */
+  class DirectorPureVirtualException : public DirectorException {
+  public:
+    DirectorPureVirtualException(const char *msg = "")
+      : DirectorException(PyExc_RuntimeError, "SWIG director pure virtual method called", msg) {
+    }
+
+    static void raise(const char *msg) {
+      throw DirectorPureVirtualException(msg);
+    }
+  };
+
+
+#if defined(SWIG_PYTHON_THREADS)
+/*  __THREAD__ is the old macro to activate some thread support */
+# if !defined(__THREAD__)
+#   define __THREAD__ 1
+# endif
+#endif
+
+#ifdef __THREAD__
+# include "pythread.h"
+  class Guard {
+    PyThread_type_lock &mutex_;
+
+  public:
+    Guard(PyThread_type_lock & mutex) : mutex_(mutex) {
+      PyThread_acquire_lock(mutex_, WAIT_LOCK);
+    }
+
+    ~Guard() {
+      PyThread_release_lock(mutex_);
+    }
+  };
+# define SWIG_GUARD(mutex) Guard _guard(mutex)
+#else
+# define SWIG_GUARD(mutex)
+#endif
+
+  /* director base class */
+  class Director {
+  private:
+    /* pointer to the wrapped python object */
+    PyObject *swig_self;
+    /* flag indicating whether the object is owned by python or c++ */
+    mutable bool swig_disown_flag;
+
+    /* decrement the reference count of the wrapped python object */
+    void swig_decref() const {
+      if (swig_disown_flag) {
+        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+        Py_DECREF(swig_self);
+        SWIG_PYTHON_THREAD_END_BLOCK;
+      }
+    }
+
+  public:
+    /* wrap a python object. */
+    Director(PyObject *self) : swig_self(self), swig_disown_flag(false) {
+    }
+
+    /* discard our reference at destruction */
+    virtual ~Director() {
+      swig_decref();
+    }
+
+    /* return a pointer to the wrapped python object */
+    PyObject *swig_get_self() const {
+      return swig_self;
+    }
+
+    /* acquire ownership of the wrapped python object (the sense of "disown" is from python) */
+    void swig_disown() const {
+      if (!swig_disown_flag) {
+        swig_disown_flag=true;
+        swig_incref();
+      }
+    }
+
+    /* increase the reference count of the wrapped python object */
+    void swig_incref() const {
+      if (swig_disown_flag) {
+        Py_INCREF(swig_self);
+      }
+    }
+
+    /* methods to implement pseudo protected director members */
+    virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const {
+      return true;
+    }
+
+    virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const {
+    }
+
+  /* ownership management */
+  private:
+    typedef std::map<void *, GCItem_var> swig_ownership_map;
+    mutable swig_ownership_map swig_owner;
+#ifdef __THREAD__
+    static PyThread_type_lock swig_mutex_own;
+#endif
+
+  public:
+    template <typename Type>
+    void swig_acquire_ownership_array(Type *vptr) const {
+      if (vptr) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_owner[vptr] = new GCArray_T<Type>(vptr);
+      }
+    }
+
+    template <typename Type>
+    void swig_acquire_ownership(Type *vptr) const {
+      if (vptr) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_owner[vptr] = new GCItem_T<Type>(vptr);
+      }
+    }
+
+    void swig_acquire_ownership_obj(void *vptr, int own) const {
+      if (vptr && own) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_owner[vptr] = new GCItem_Object(own);
+      }
+    }
+
+    int swig_release_ownership(void *vptr) const {
+      int own = 0;
+      if (vptr) {
+        SWIG_GUARD(swig_mutex_own);
+        swig_ownership_map::iterator iter = swig_owner.find(vptr);
+        if (iter != swig_owner.end()) {
+          own = iter->second->get_own();
+          swig_owner.erase(iter);
+        }
+      }
+      return own;
+    }
+
+    template <typename Type>
+    static PyObject *swig_pyobj_disown(PyObject *pyobj, PyObject *SWIGUNUSEDPARM(args)) {
+      SwigPyObject *sobj = (SwigPyObject *)pyobj;
+      sobj->own = 0;
+      Director *d = SWIG_DIRECTOR_CAST(reinterpret_cast<Type *>(sobj->ptr));
+      if (d)
+        d->swig_disown();
+      return PyWeakref_NewProxy(pyobj, NULL);
+    }
+  };
+
+#ifdef __THREAD__
+  PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock();
+#endif
+}
+
+#endif
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p_AttLimits swig_types[0]
+#define SWIGTYPE_p_FitParameter swig_types[1]
+#define SWIGTYPE_p_FitParameterSet swig_types[2]
+#define SWIGTYPE_p_IFitParameter swig_types[3]
+#define SWIGTYPE_p_IMinimizer swig_types[4]
+#define SWIGTYPE_p_MinimizerCatalogue swig_types[5]
+#define SWIGTYPE_p_MinimizerFactory swig_types[6]
+#define SWIGTYPE_p_allocator_type swig_types[7]
+#define SWIGTYPE_p_char swig_types[8]
+#define SWIGTYPE_p_const_iterator swig_types[9]
+#define SWIGTYPE_p_container_t swig_types[10]
+#define SWIGTYPE_p_corr_matrix_t swig_types[11]
+#define SWIGTYPE_p_difference_type swig_types[12]
+#define SWIGTYPE_p_gradient_function_t swig_types[13]
+#define SWIGTYPE_p_int swig_types[14]
+#define SWIGTYPE_p_iterator swig_types[15]
+#define SWIGTYPE_p_long_long swig_types[16]
+#define SWIGTYPE_p_objective_function_t swig_types[17]
+#define SWIGTYPE_p_p_PyObject swig_types[18]
+#define SWIGTYPE_p_short swig_types[19]
+#define SWIGTYPE_p_signed_char swig_types[20]
+#define SWIGTYPE_p_size_type swig_types[21]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[22]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[23]
+#define SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t swig_types[24]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[25]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[26]
+#define SWIGTYPE_p_std__allocatorT_unsigned_long_t swig_types[27]
+#define SWIGTYPE_p_std__invalid_argument swig_types[28]
+#define SWIGTYPE_p_std__shared_ptrT_IFitObserver_t swig_types[29]
+#define SWIGTYPE_p_std__shared_ptrT_IMultiLayerBuilder_t swig_types[30]
+#define SWIGTYPE_p_std__shared_ptrT_IObserver_t swig_types[31]
+#define SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator swig_types[32]
+#define SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator swig_types[33]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[34]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[35]
+#define SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t swig_types[36]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[37]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[38]
+#define SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t swig_types[39]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[40]
+#define SWIGTYPE_p_unsigned_char swig_types[41]
+#define SWIGTYPE_p_unsigned_int swig_types[42]
+#define SWIGTYPE_p_unsigned_long_long swig_types[43]
+#define SWIGTYPE_p_unsigned_short swig_types[44]
+#define SWIGTYPE_p_value_type swig_types[45]
+static swig_type_info *swig_types[47];
+static swig_module_info swig_module = {swig_types, 46, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+#if (PY_VERSION_HEX <= 0x02000000)
+# if !defined(SWIG_PYTHON_CLASSIC)
+#  error "This python version requires swig to be run with the '-classic' option"
+# endif
+#endif
+
+/*-----------------------------------------------
+              @(target):= _libBornAgainFit.so
+  ------------------------------------------------*/
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_init    PyInit__libBornAgainFit
+
+#else
+#  define SWIG_init    init_libBornAgainFit
+
+#endif
+#define SWIG_name    "_libBornAgainFit"
+
+#define SWIGVERSION 0x030008 
+#define SWIG_VERSION SWIGVERSION
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 
+
+
+#include <stdexcept>
+
+
+namespace swig {
+  class SwigPtr_PyObject {
+  protected:
+    PyObject *_obj;
+
+  public:
+    SwigPtr_PyObject() :_obj(0)
+    {
+    }
+
+    SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XINCREF(_obj);      
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+    
+    SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
+    {
+      if (initial_ref) {
+        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+        Py_XINCREF(_obj);
+        SWIG_PYTHON_THREAD_END_BLOCK;
+      }
+    }
+    
+    SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) 
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XINCREF(item._obj);
+      Py_XDECREF(_obj);
+      _obj = item._obj;
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return *this;      
+    }
+    
+    ~SwigPtr_PyObject() 
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XDECREF(_obj);
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+    
+    operator PyObject *() const
+    {
+      return _obj;
+    }
+
+    PyObject *operator->() const
+    {
+      return _obj;
+    }
+  };
+}
+
+
+namespace swig {
+  struct SwigVar_PyObject : SwigPtr_PyObject {
+    SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { }
+    
+    SwigVar_PyObject & operator = (PyObject* obj)
+    {
+      Py_XDECREF(_obj);
+      _obj = obj;
+      return *this;      
+    }
+  };
+}
+
+
+#include <stdint.h>		// Use the C99 official header
+
+
+#include <complex> 
+
+
+#include <string>
+
+
+#include <iostream>
+
+#if PY_VERSION_HEX >= 0x03020000
+# define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj))
+#else
+# define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj))
+#endif
+
+
+#include <stdexcept>
+
+
+#if defined(__GNUC__)
+#  if __GNUC__ == 2 && __GNUC_MINOR <= 96
+#     define SWIG_STD_NOMODERN_STL
+#  endif
+#endif
+
+
+#include <stddef.h>
+
+
+namespace swig {
+  struct stop_iteration {
+  };
+
+  struct SwigPyIterator {
+  private:
+    SwigPtr_PyObject _seq;
+
+  protected:
+    SwigPyIterator(PyObject *seq) : _seq(seq)
+    {
+    }
+      
+  public:
+    virtual ~SwigPyIterator() {}
+
+    // Access iterator method, required by Python
+    virtual PyObject *value() const = 0;
+
+    // Forward iterator method, required by Python
+    virtual SwigPyIterator *incr(size_t n = 1) = 0;
+    
+    // Backward iterator method, very common in C++, but not required in Python
+    virtual SwigPyIterator *decr(size_t /*n*/ = 1)
+    {
+      throw stop_iteration();
+    }
+
+    // Random access iterator methods, but not required in Python
+    virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const
+    {
+      throw std::invalid_argument("operation not supported");
+    }
+
+    virtual bool equal (const SwigPyIterator &/*x*/) const
+    {
+      throw std::invalid_argument("operation not supported");
+    }
+    
+    // C++ common/needed methods
+    virtual SwigPyIterator *copy() const = 0;
+
+    PyObject *next()     
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads       
+      PyObject *obj = value();
+      incr();       
+      SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads
+      return obj;     
+    }
+
+    /* Make an alias for Python 3.x */
+    PyObject *__next__()
+    {
+      return next();
+    }
+
+    PyObject *previous()
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads       
+      decr();
+      PyObject *obj = value();
+      SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads       
+      return obj;
+    }
+
+    SwigPyIterator *advance(ptrdiff_t n)
+    {
+      return  (n > 0) ?  incr(n) : decr(-n);
+    }
+      
+    bool operator == (const SwigPyIterator& x)  const
+    {
+      return equal(x);
+    }
+      
+    bool operator != (const SwigPyIterator& x) const
+    {
+      return ! operator==(x);
+    }
+      
+    SwigPyIterator& operator += (ptrdiff_t n)
+    {
+      return *advance(n);
+    }
+
+    SwigPyIterator& operator -= (ptrdiff_t n)
+    {
+      return *advance(-n);
+    }
+      
+    SwigPyIterator* operator + (ptrdiff_t n) const
+    {
+      return copy()->advance(n);
+    }
+
+    SwigPyIterator* operator - (ptrdiff_t n) const
+    {
+      return copy()->advance(-n);
+    }
+      
+    ptrdiff_t operator - (const SwigPyIterator& x) const
+    {
+      return x.distance(*this);
+    }
+      
+    static swig_type_info* descriptor() {
+      static int init = 0;
+      static swig_type_info* desc = 0;
+      if (!init) {
+	desc = SWIG_TypeQuery("swig::SwigPyIterator *");
+	init = 1;
+      }	
+      return desc;
+    }    
+  };
+
+#if defined(SWIGPYTHON_BUILTIN)
+  inline PyObject* make_output_iterator_builtin (PyObject *pyself)
+  {
+    Py_INCREF(pyself);
+    return pyself;
+  }
+#endif
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_double (PyObject *obj, double *val)
+{
+  int res = SWIG_TypeError;
+  if (PyFloat_Check(obj)) {
+    if (val) *val = PyFloat_AsDouble(obj);
+    return SWIG_OK;
+#if PY_VERSION_HEX < 0x03000000
+  } else if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+#endif
+  } else if (PyLong_Check(obj)) {
+    double v = PyLong_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    double d = PyFloat_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = d;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      long v = PyLong_AsLong(obj);
+      if (!PyErr_Occurred()) {
+	if (val) *val = v;
+	return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
+      } else {
+	PyErr_Clear();
+      }
+    }
+  }
+#endif
+  return res;
+}
+
+
+#include <float.h>
+
+
+#include <math.h>
+
+
+SWIGINTERNINLINE int
+SWIG_CanCastAsInteger(double *d, double min, double max) {
+  double x = *d;
+  if ((min <= x && x <= max)) {
+   double fx = floor(x);
+   double cx = ceil(x);
+   double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
+   if ((errno == EDOM) || (errno == ERANGE)) {
+     errno = 0;
+   } else {
+     double summ, reps, diff;
+     if (rd < x) {
+       diff = x - rd;
+     } else if (rd > x) {
+       diff = rd - x;
+     } else {
+       return 1;
+     }
+     summ = rd + x;
+     reps = diff/summ;
+     if (reps < 8*DBL_EPSILON) {
+       *d = rd;
+       return 1;
+     }
+   }
+  }
+  return 0;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) 
+{
+#if PY_VERSION_HEX < 0x03000000
+  if (PyInt_Check(obj)) {
+    long v = PyInt_AsLong(obj);
+    if (v >= 0) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      return SWIG_OverflowError;
+    }
+  } else
+#endif
+  if (PyLong_Check(obj)) {
+    unsigned long v = PyLong_AsUnsignedLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      return SWIG_OverflowError;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    unsigned long v = PyLong_AsUnsignedLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
+	if (val) *val = (unsigned long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_size_t (PyObject * obj, size_t *val)
+{
+  unsigned long v;
+  int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
+  if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+  return res;
+}
+
+
+  #define SWIG_From_long   PyLong_FromLong 
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_ptrdiff_t  (ptrdiff_t value)
+{    
+  return SWIG_From_long  (static_cast< long >(value));
+}
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_bool  (bool value)
+{
+  return PyBool_FromLong(value ? 1 : 0);
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_long (PyObject *obj, long* val)
+{
+#if PY_VERSION_HEX < 0x03000000
+  if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+  } else
+#endif
+  if (PyLong_Check(obj)) {
+    long v = PyLong_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      return SWIG_OverflowError;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    long v = PyInt_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
+	if (val) *val = (long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_ptrdiff_t (PyObject * obj, ptrdiff_t *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, val ? &v : 0);
+  if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+  return res;
+}
+
+
+#include <algorithm>
+
+
+#include <vector>
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_int  (int value)
+{
+  return PyInt_FromLong((long) value);
+}
+
+
+namespace swig {
+  template <class Type>
+  struct noconst_traits {
+    typedef Type noconst_type;
+  };
+
+  template <class Type>
+  struct noconst_traits<const Type> {
+    typedef Type noconst_type;
+  };
+
+  /*
+    type categories
+  */
+  struct pointer_category { };
+  struct value_category { };
+
+  /*
+    General traits that provides type_name and type_info
+  */
+  template <class Type> struct traits { };
+
+  template <class Type>
+  inline const char* type_name() {
+    return traits<typename noconst_traits<Type >::noconst_type >::type_name();
+  }
+
+  template <class Type>
+  struct traits_info {
+    static swig_type_info *type_query(std::string name) {
+      name += " *";
+      return SWIG_TypeQuery(name.c_str());
+    }
+    static swig_type_info *type_info() {
+      static swig_type_info *info = type_query(type_name<Type>());
+      return info;
+    }
+  };
+
+  template <class Type>
+  inline swig_type_info *type_info() {
+    return traits_info<Type>::type_info();
+  }
+
+  /*
+    Partial specialization for pointers
+  */
+  template <class Type> struct traits <Type *> {
+    typedef pointer_category category;
+    static std::string make_ptr_name(const char* name) {
+      std::string ptrname = name;
+      ptrname += " *";
+      return ptrname;
+    }
+    static const char* type_name() {
+      static std::string name = make_ptr_name(swig::type_name<Type>());
+      return name.c_str();
+    }
+  };
+
+  template <class Type, class Category>
+  struct traits_as { };
+
+  template <class Type, class Category>
+  struct traits_check { };
+
+}
+
+
+namespace swig {  
+  /*
+    Traits that provides the from method
+  */
+  template <class Type> struct traits_from_ptr {
+    static PyObject *from(Type *val, int owner = 0) {
+      return SWIG_InternalNewPointerObj(val, type_info<Type>(), owner);
+    }
+  };
+
+  template <class Type> struct traits_from {
+    static PyObject *from(const Type& val) {
+      return traits_from_ptr<Type>::from(new Type(val), 1);
+    }
+  };
+
+  template <class Type> struct traits_from<Type *> {
+    static PyObject *from(Type* val) {
+      return traits_from_ptr<Type>::from(val, 0);
+    }
+  };
+
+  template <class Type> struct traits_from<const Type *> {
+    static PyObject *from(const Type* val) {
+      return traits_from_ptr<Type>::from(const_cast<Type*>(val), 0);
+    }
+  };
+
+
+  template <class Type>
+  inline PyObject *from(const Type& val) {
+    return traits_from<Type>::from(val);
+  }
+
+  template <class Type>
+  inline PyObject *from_ptr(Type* val, int owner) {
+    return traits_from_ptr<Type>::from(val, owner);
+  }
+
+  /*
+    Traits that provides the asval/as/check method
+  */
+  template <class Type>
+  struct traits_asptr {   
+    static int asptr(PyObject *obj, Type **val) {
+      Type *p;
+      int res = SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0);
+      if (SWIG_IsOK(res)) {
+	if (val) *val = p;
+      }
+      return res;
+    }
+  }; 
+
+  template <class Type>
+  inline int asptr(PyObject *obj, Type **vptr) {
+    return traits_asptr<Type>::asptr(obj, vptr);
+  }
+
+  template <class Type> 
+  struct traits_asval {
+    static int asval(PyObject *obj, Type *val) {
+      if (val) {
+	Type *p = 0;
+	int res = traits_asptr<Type>::asptr(obj, &p);
+	if (!SWIG_IsOK(res)) return res;	
+	if (p) {
+	  typedef typename noconst_traits<Type>::noconst_type noconst_type;
+	  *(const_cast<noconst_type*>(val)) = *p;
+	  if (SWIG_IsNewObj(res)){
+	    delete p;
+	    res = SWIG_DelNewMask(res);
+	  }
+	  return res;
+	} else {
+	  return SWIG_ERROR;
+	}
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+
+  template <class Type> struct traits_asval<Type*> {
+    static int asval(PyObject *obj, Type **val) {
+      if (val) {
+        typedef typename noconst_traits<Type>::noconst_type noconst_type;
+        noconst_type *p = 0;
+        int res = traits_asptr<noconst_type>::asptr(obj,  &p);
+        if (SWIG_IsOK(res)) {
+          *(const_cast<noconst_type**>(val)) = p;
+	}
+	return res;
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+  
+  template <class Type>
+  inline int asval(PyObject *obj, Type *val) {
+    return traits_asval<Type>::asval(obj, val);
+  }
+
+  template <class Type> 
+  struct traits_as<Type, value_category> {
+    static Type as(PyObject *obj, bool throw_error) {
+      Type v;
+      int res = asval(obj, &v);
+      if (!obj || !SWIG_IsOK(res)) {
+	if (!PyErr_Occurred()) {
+	  ::SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	if (throw_error) throw std::invalid_argument("bad type");
+      }
+      return v;
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type, pointer_category> {
+    static Type as(PyObject *obj, bool throw_error) {
+      Type *v = 0;      
+      int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+      if (SWIG_IsOK(res) && v) {
+	if (SWIG_IsNewObj(res)) {
+	  Type r(*v);
+	  delete v;
+	  return r;
+	} else {
+	  return *v;
+	}
+      } else {
+	// Uninitialized return value, no Type() constructor required.
+	static Type *v_def = (Type*) malloc(sizeof(Type));
+	if (!PyErr_Occurred()) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	if (throw_error) throw std::invalid_argument("bad type");
+	memset(v_def,0,sizeof(Type));
+	return *v_def;
+      }
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type*, pointer_category> {
+    static Type* as(PyObject *obj, bool throw_error) {
+      Type *v = 0;      
+      int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+      if (SWIG_IsOK(res)) {
+	return v;
+      } else {
+	if (!PyErr_Occurred()) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	if (throw_error) throw std::invalid_argument("bad type");
+	return 0;
+      }
+    }
+  };
+    
+  template <class Type>
+  inline Type as(PyObject *obj, bool te = false) {
+    return traits_as<Type, typename traits<Type>::category>::as(obj, te);
+  }
+
+  template <class Type> 
+  struct traits_check<Type, value_category> {
+    static bool check(PyObject *obj) {
+      int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR;
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type> 
+  struct traits_check<Type, pointer_category> {
+    static bool check(PyObject *obj) {
+      int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR;
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type>
+  inline bool check(PyObject *obj) {
+    return traits_check<Type, typename traits<Type>::category>::check(obj);
+  }
+}
+
+
+#include <functional>
+
+namespace std {
+  template <>
+  struct less <PyObject *>: public binary_function<PyObject *, PyObject *, bool>
+  {
+    bool
+    operator()(PyObject * v, PyObject *w) const
+    { 
+      bool res;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false;
+      /* This may fall into a case of inconsistent
+               eg. ObjA > ObjX > ObjB
+               but ObjA < ObjB
+      */
+      if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) )
+      {
+        /* Objects can't be compared, this mostly occurred in Python 3.0 */
+        /* Compare their ptr directly for a workaround */
+        res = (v < w);
+        PyErr_Clear();
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return res;
+    }
+  };
+
+  template <>
+  struct less <swig::SwigPtr_PyObject>: public binary_function<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject, bool>
+  {
+    bool
+    operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const
+    {
+      return std::less<PyObject *>()(v, w);
+    }
+  };
+
+  template <>
+  struct less <swig::SwigVar_PyObject>: public binary_function<swig::SwigVar_PyObject, swig::SwigVar_PyObject, bool>
+  {
+    bool
+    operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const
+    {
+      return std::less<PyObject *>()(v, w);
+    }
+  };
+
+}
+
+namespace swig {
+  template <> struct traits<PyObject *> {
+    typedef value_category category;
+    static const char* type_name() { return "PyObject *"; }
+  };  
+
+  template <>  struct traits_asval<PyObject * > {   
+    typedef PyObject * value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      if (val) *val = obj;
+      return SWIG_OK;
+    }
+  };
+
+  template <> 
+  struct traits_check<PyObject *, value_category> {
+    static bool check(PyObject *) {
+      return true;
+    }
+  };
+
+  template <>  struct traits_from<PyObject *> {
+    typedef PyObject * value_type;
+    static PyObject *from(const value_type& val) {
+      Py_XINCREF(val);
+      return val;
+    }
+  };
+  
+}
+
+namespace swig {
+  template <class Difference>
+  inline size_t
+  check_index(Difference i, size_t size, bool insert = false) {
+    if ( i < 0 ) {
+      if ((size_t) (-i) <= size)
+	return (size_t) (i + size);
+    } else if ( (size_t) i < size ) {
+      return (size_t) i;
+    } else if (insert && ((size_t) i == size)) {
+      return size;
+    }
+    throw std::out_of_range("index out of range");
+  }
+
+  template <class Difference>
+  void
+  slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) {
+    if (step == 0) {
+      throw std::invalid_argument("slice step cannot be zero");
+    } else if (step > 0) {
+      // Required range: 0 <= i < size, 0 <= j < size
+      if (i < 0) {
+        ii = 0;
+      } else if (i < (Difference)size) {
+        ii = i;
+      } else if (insert && (i >= (Difference)size)) {
+        ii = (Difference)size;
+      }
+      if ( j < 0 ) {
+        jj = 0;
+      } else {
+        jj = (j < (Difference)size) ? j : (Difference)size;
+      }
+    } else {
+      // Required range: -1 <= i < size-1, -1 <= j < size-1
+      if (i < -1) {
+        ii = -1;
+      } else if (i < (Difference) size) {
+        ii = i;
+      } else if (i >= (Difference)(size-1)) {
+        ii = (Difference)(size-1);
+      }
+      if (j < -1) {
+        jj = -1;
+      } else {
+        jj = (j < (Difference)size ) ? j : (Difference)(size-1);
+      }
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::iterator
+  getpos(Sequence* self, Difference i)  {
+    typename Sequence::iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::const_iterator
+  cgetpos(const Sequence* self, Difference i)  {
+    typename Sequence::const_iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence>
+  inline void
+  erase(Sequence* seq, const typename Sequence::iterator& position) {
+    seq->erase(position);
+  }
+
+  template <class Sequence, class Difference>
+  inline Sequence*
+  getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj);
+
+    if (step > 0) {
+      typename Sequence::const_iterator sb = self->begin();
+      typename Sequence::const_iterator se = self->begin();
+      std::advance(sb,ii);
+      std::advance(se,jj);
+      if (step == 1) {
+        return new Sequence(sb, se);
+      } else {
+        Sequence *sequence = new Sequence();
+        typename Sequence::const_iterator it = sb;
+        while (it!=se) {
+          sequence->push_back(*it);
+          for (Py_ssize_t c=0; c<step && it!=se; ++c)
+            it++;
+        }
+        return sequence;
+      } 
+    } else {
+      Sequence *sequence = new Sequence();
+      if (ii > jj) {
+        typename Sequence::const_reverse_iterator sb = self->rbegin();
+        typename Sequence::const_reverse_iterator se = self->rbegin();
+        std::advance(sb,size-ii-1);
+        std::advance(se,size-jj-1);
+        typename Sequence::const_reverse_iterator it = sb;
+        while (it!=se) {
+          sequence->push_back(*it);
+          for (Py_ssize_t c=0; c<-step && it!=se; ++c)
+            it++;
+        }
+      }
+      return sequence;
+    }
+  }
+
+  template <class Sequence, class Difference, class InputSeq>
+  inline void
+  setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj, true);
+    if (step > 0) {
+      if (jj < ii)
+        jj = ii;
+      if (step == 1) {
+        size_t ssize = jj - ii;
+        if (ssize <= is.size()) {
+          // expanding/staying the same size
+          typename Sequence::iterator sb = self->begin();
+          typename InputSeq::const_iterator isit = is.begin();
+          std::advance(sb,ii);
+          std::advance(isit, jj - ii);
+          self->insert(std::copy(is.begin(), isit, sb), isit, is.end());
+        } else {
+          // shrinking
+          typename Sequence::iterator sb = self->begin();
+          typename Sequence::iterator se = self->begin();
+          std::advance(sb,ii);
+          std::advance(se,jj);
+          self->erase(sb,se);
+          sb = self->begin();
+          std::advance(sb,ii);
+          self->insert(sb, is.begin(), is.end());
+        }
+      } else {
+        size_t replacecount = (jj - ii + step - 1) / step;
+        if (is.size() != replacecount) {
+          char msg[1024];
+          sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
+          throw std::invalid_argument(msg);
+        }
+        typename Sequence::const_iterator isit = is.begin();
+        typename Sequence::iterator it = self->begin();
+        std::advance(it,ii);
+        for (size_t rc=0; rc<replacecount; ++rc) {
+          *it++ = *isit++;
+          for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
+            it++;
+        }
+      }
+    } else {
+      if (jj > ii)
+        jj = ii;
+      size_t replacecount = (ii - jj - step - 1) / -step;
+      if (is.size() != replacecount) {
+        char msg[1024];
+        sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
+        throw std::invalid_argument(msg);
+      }
+      typename Sequence::const_iterator isit = is.begin();
+      typename Sequence::reverse_iterator it = self->rbegin();
+      std::advance(it,size-ii-1);
+      for (size_t rc=0; rc<replacecount; ++rc) {
+        *it++ = *isit++;
+        for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+          it++;
+      }
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline void
+  delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj, true);
+    if (step > 0) {
+      if (jj > ii) {
+        typename Sequence::iterator sb = self->begin();
+        std::advance(sb,ii);
+        if (step == 1) {
+          typename Sequence::iterator se = self->begin();
+          std::advance(se,jj);
+          self->erase(sb,se);
+        } else {
+          typename Sequence::iterator it = sb;
+          size_t delcount = (jj - ii + step - 1) / step;
+          while (delcount) {
+            it = self->erase(it);
+            for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
+              it++;
+            delcount--;
+          }
+        }
+      }
+    } else {
+      if (ii > jj) {
+        typename Sequence::reverse_iterator sb = self->rbegin();
+        std::advance(sb,size-ii-1);
+        typename Sequence::reverse_iterator it = sb;
+        size_t delcount = (ii - jj - step - 1) / -step;
+        while (delcount) {
+          it = typename Sequence::reverse_iterator(self->erase((++it).base()));
+          for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+            it++;
+          delcount--;
+        }
+      }
+    }
+  }
+}
+
+
+#if defined(__SUNPRO_CC) && defined(_RWSTD_VER)
+#  if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL)
+#    define SWIG_STD_NOITERATOR_TRAITS_STL
+#  endif
+#endif
+
+#if !defined(SWIG_STD_NOITERATOR_TRAITS_STL)
+#include <iterator>
+#else
+namespace std {
+  template <class Iterator>
+  struct iterator_traits {
+    typedef ptrdiff_t difference_type;
+    typedef typename Iterator::value_type value_type;
+  };
+
+  template <class Iterator, class Category,class T, class Reference, class Pointer, class Distance>
+  struct iterator_traits<__reverse_bi_iterator<Iterator,Category,T,Reference,Pointer,Distance> > {
+    typedef Distance difference_type;
+    typedef T value_type;
+  };
+
+  template <class T>
+  struct iterator_traits<T*> {
+    typedef T value_type;
+    typedef ptrdiff_t difference_type;
+  };
+
+  template<typename _InputIterator>
+  inline typename iterator_traits<_InputIterator>::difference_type
+  distance(_InputIterator __first, _InputIterator __last)
+  {
+    typename iterator_traits<_InputIterator>::difference_type __n = 0;
+    while (__first != __last) {
+      ++__first; ++__n;
+    }
+    return __n;
+  }
+}
+#endif
+
+
+namespace swig {
+  template<typename OutIterator>
+  class SwigPyIterator_T :  public SwigPyIterator
+  {
+  public:
+    typedef OutIterator out_iterator;
+    typedef typename std::iterator_traits<out_iterator>::value_type value_type;    
+    typedef SwigPyIterator_T<out_iterator> self_type;
+
+    SwigPyIterator_T(out_iterator curr, PyObject *seq)
+      : SwigPyIterator(seq), current(curr)
+    {
+    }
+
+    const out_iterator& get_current() const
+    {
+      return current;
+    }
+
+    
+    bool equal (const SwigPyIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return (current == iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }
+    
+    ptrdiff_t distance(const SwigPyIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return std::distance(current, iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }    
+    
+  protected:
+    out_iterator current;
+  };
+  
+  template <class ValueType>
+  struct from_oper 
+  {
+    typedef const ValueType& argument_type;
+    typedef PyObject *result_type;
+    result_type operator()(argument_type v) const
+    {
+      return swig::from(v);
+    }
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyIteratorOpen_T :  public SwigPyIterator_T<OutIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;
+    typedef SwigPyIteratorOpen_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq)
+      : SwigPyIterator_T<OutIterator>(curr, seq)
+    {
+    }
+    
+    PyObject *value() const {
+      return from(static_cast<const value_type&>(*(base::current)));
+    }
+    
+    SwigPyIterator *copy() const
+    {
+      return new self_type(*this);
+    }
+
+    SwigPyIterator *incr(size_t n = 1)
+    {
+      while (n--) {
+	++base::current;
+      }
+      return this;
+    }
+
+    SwigPyIterator *decr(size_t n = 1)
+    {
+      while (n--) {
+	--base::current;
+      }
+      return this;
+    }
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyIteratorClosed_T :  public SwigPyIterator_T<OutIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;    
+    typedef SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq)
+      : SwigPyIterator_T<OutIterator>(curr, seq), begin(first), end(last)
+    {
+    }
+    
+    PyObject *value() const {
+      if (base::current == end) {
+	throw stop_iteration();
+      } else {
+	return from(static_cast<const value_type&>(*(base::current)));
+      }
+    }
+    
+    SwigPyIterator *copy() const
+    {
+      return new self_type(*this);
+    }
+
+    SwigPyIterator *incr(size_t n = 1)
+    {
+      while (n--) {
+	if (base::current == end) {
+	  throw stop_iteration();
+	} else {
+	  ++base::current;
+	}
+      }
+      return this;
+    }
+
+    SwigPyIterator *decr(size_t n = 1)
+    {
+      while (n--) {
+	if (base::current == begin) {
+	  throw stop_iteration();
+	} else {
+	  --base::current;
+	}
+      }
+      return this;
+    }
+
+  private:
+    out_iterator begin;
+    out_iterator end;
+  };
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0)
+  {
+    return new SwigPyIteratorClosed_T<OutIter>(current, begin, end, seq);
+  }
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_iterator(const OutIter& current, PyObject *seq = 0)
+  {
+    return new SwigPyIteratorOpen_T<OutIter>(current, seq);
+  }
+
+}
+
+
+namespace swig
+{
+  template <class T>
+  struct SwigPySequence_Ref
+  {
+    SwigPySequence_Ref(PyObject* seq, Py_ssize_t index)
+      : _seq(seq), _index(index)
+    {
+    }
+    
+    operator T () const
+    {
+      swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index);
+      try {
+	return swig::as<T>(item, true);
+      } catch (std::exception& e) {
+	char msg[1024];
+	sprintf(msg, "in sequence element %d ", (int)_index);
+	if (!PyErr_Occurred()) {
+	  ::SWIG_Error(SWIG_TypeError,  swig::type_name<T>());
+	}
+	SWIG_Python_AddErrorMsg(msg);
+	SWIG_Python_AddErrorMsg(e.what());
+	throw;
+      }
+    }
+
+    SwigPySequence_Ref& operator=(const T& v)
+    {
+      PySequence_SetItem(_seq, _index, swig::from<T>(v));
+      return *this;
+    }
+
+  private:
+    PyObject* _seq;
+    Py_ssize_t _index;
+  };
+
+  template <class T>
+  struct SwigPySequence_ArrowProxy
+  {
+    SwigPySequence_ArrowProxy(const T& x): m_value(x) {}
+    const T* operator->() const { return &m_value; }
+    operator const T*() const { return &m_value; }
+    T m_value;
+  };
+
+  template <class T, class Reference >
+  struct SwigPySequence_InputIterator
+  {
+    typedef SwigPySequence_InputIterator<T, Reference > self;
+
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Reference reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef Py_ssize_t difference_type;
+
+    SwigPySequence_InputIterator()
+    {
+    }
+
+    SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index)
+      : _seq(seq), _index(index)
+    {
+    }
+
+    reference operator*() const
+    {
+      return reference(_seq, _index);
+    }
+
+    SwigPySequence_ArrowProxy<T>
+    operator->() const {
+      return SwigPySequence_ArrowProxy<T>(operator*());
+    }
+
+    bool operator==(const self& ri) const
+    {
+      return (_index == ri._index) && (_seq == ri._seq);
+    }
+
+    bool operator!=(const self& ri) const
+    {
+      return !(operator==(ri));
+    }
+
+    self& operator ++ ()
+    {
+      ++_index;
+      return *this;
+    }
+
+    self& operator -- ()
+    {
+      --_index;
+      return *this;
+    }
+
+    self& operator += (difference_type n)
+    {
+      _index += n;
+      return *this;
+    }
+
+    self operator +(difference_type n) const
+    {
+      return self(_seq, _index + n);
+    }
+
+    self& operator -= (difference_type n)
+    {
+      _index -= n;
+      return *this;
+    }
+
+    self operator -(difference_type n) const
+    {
+      return self(_seq, _index - n);
+    }
+
+    difference_type operator - (const self& ri) const
+    {
+      return _index - ri._index;
+    }
+
+    bool operator < (const self& ri) const
+    {
+      return _index < ri._index;
+    }
+
+    reference
+    operator[](difference_type n) const
+    {
+      return reference(_seq, _index + n);
+    }
+
+  private:
+    PyObject* _seq;
+    difference_type _index;
+  };
+
+  // STL container wrapper around a Python sequence
+  template <class T>
+  struct SwigPySequence_Cont
+  {
+    typedef SwigPySequence_Ref<T> reference;
+    typedef const SwigPySequence_Ref<T> const_reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef Py_ssize_t difference_type;
+    typedef size_t size_type;
+    typedef const pointer const_pointer;
+    typedef SwigPySequence_InputIterator<T, reference> iterator;
+    typedef SwigPySequence_InputIterator<T, const_reference> const_iterator;
+
+    SwigPySequence_Cont(PyObject* seq) : _seq(0)
+    {
+      if (!PySequence_Check(seq)) {
+	throw std::invalid_argument("a sequence is expected");
+      }
+      _seq = seq;
+      Py_INCREF(_seq);
+    }
+
+    ~SwigPySequence_Cont()
+    {
+      Py_XDECREF(_seq);
+    }
+
+    size_type size() const
+    {
+      return static_cast<size_type>(PySequence_Size(_seq));
+    }
+
+    bool empty() const
+    {
+      return size() == 0;
+    }
+
+    iterator begin()
+    {
+      return iterator(_seq, 0);
+    }
+
+    const_iterator begin() const
+    {
+      return const_iterator(_seq, 0);
+    }
+
+    iterator end()
+    {
+      return iterator(_seq, size());
+    }
+
+    const_iterator end() const
+    {
+      return const_iterator(_seq, size());
+    }
+
+    reference operator[](difference_type n)
+    {
+      return reference(_seq, n);
+    }
+
+    const_reference operator[](difference_type n)  const
+    {
+      return const_reference(_seq, n);
+    }
+
+    bool check(bool set_err = true) const
+    {
+      Py_ssize_t s = size();
+      for (Py_ssize_t i = 0; i < s; ++i) {
+	swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i);
+	if (!swig::check<value_type>(item)) {
+	  if (set_err) {
+	    char msg[1024];
+	    sprintf(msg, "in sequence element %d", (int)i);
+	    SWIG_Error(SWIG_RuntimeError, msg);
+	  }
+	  return false;
+	}
+      }
+      return true;
+    }
+
+  private:
+    PyObject* _seq;
+  };
+
+}
+
+
+  #define SWIG_From_double   PyFloat_FromDouble 
+
+
+namespace swig {
+  template <> struct traits< double > {
+    typedef value_category category;
+    static const char* type_name() { return"double"; }
+  };
+  template <>  struct traits_asval< double > {
+    typedef double value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_double (obj, val);
+    }
+  };
+  template <>  struct traits_from< double > {
+    typedef double value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_double  (val);
+    }
+  };
+}
+
+
+namespace swig {
+  template <class SwigPySeq, class Seq>
+  inline void
+  assign(const SwigPySeq& swigpyseq, Seq* seq) {
+    // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented
+    typedef typename SwigPySeq::value_type value_type;
+    typename SwigPySeq::const_iterator it = swigpyseq.begin();
+    for (;it != swigpyseq.end(); ++it) {
+      seq->insert(seq->end(),(value_type)(*it));
+    }
+  }
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_asptr_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+
+    static int asptr(PyObject *obj, sequence **seq) {
+      if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) {
+	sequence *p;
+	if (::SWIG_ConvertPtr(obj,(void**)&p,
+			      swig::type_info<sequence>(),0) == SWIG_OK) {
+	  if (seq) *seq = p;
+	  return SWIG_OLDOBJ;
+	}
+      } else if (PySequence_Check(obj)) {
+	try {
+	  SwigPySequence_Cont<value_type> swigpyseq(obj);
+	  if (seq) {
+	    sequence *pseq = new sequence();
+	    assign(swigpyseq, pseq);
+	    *seq = pseq;
+	    return SWIG_NEWOBJ;
+	  } else {
+	    return swigpyseq.check() ? SWIG_OK : SWIG_ERROR;
+	  }
+	} catch (std::exception& e) {
+	  if (seq) {
+	    if (!PyErr_Occurred()) {
+	      PyErr_SetString(PyExc_TypeError, e.what());
+	    }
+	  }
+	  return SWIG_ERROR;
+	}
+      }
+      return SWIG_ERROR;
+    }
+  };
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_from_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+    typedef typename Seq::size_type size_type;
+    typedef typename sequence::const_iterator const_iterator;
+
+    static PyObject *from(const sequence& seq) {
+#ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS
+      swig_type_info *desc = swig::type_info<sequence>();
+      if (desc && desc->clientdata) {
+	return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN);
+      }
+#endif
+      size_type size = seq.size();
+      if (size <= (size_type)INT_MAX) {
+	PyObject *obj = PyTuple_New((Py_ssize_t)size);
+	Py_ssize_t i = 0;
+	for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) {
+	  PyTuple_SetItem(obj,i,swig::from<value_type>(*it));
+	}
+	return obj;
+      } else {
+	PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python");
+	return NULL;
+      }
+    }
+  };
+}
+
+
+  namespace swig {
+    template <class T>
+    struct traits_asptr<std::vector<T> >  {
+      static int asptr(PyObject *obj, std::vector<T> **vec) {
+	return traits_asptr_stdseq<std::vector<T> >::asptr(obj, vec);
+      }
+    };
+    
+    template <class T>
+    struct traits_from<std::vector<T> > {
+      static PyObject *from(const std::vector<T>& vec) {
+	return traits_from_stdseq<std::vector<T> >::from(vec);
+      }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< double, std::allocator< double > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "double" "," "std::allocator< double >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_double_Sg__iterator(std::vector< double > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_double_Sg____nonzero__(std::vector< double > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_double_Sg____bool__(std::vector< double > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< double >::size_type std_vector_Sl_double_Sg____len__(std::vector< double > const *self){
+      return self->size();
+    }
+
+SWIGINTERNINLINE PyObject* 
+SWIG_From_unsigned_SS_long  (unsigned long value)
+{
+  return (value > LONG_MAX) ?
+    PyLong_FromUnsignedLong(value) : PyLong_FromLong(static_cast< long >(value)); 
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_size_t  (size_t value)
+{    
+  return SWIG_From_unsigned_SS_long  (static_cast< unsigned long >(value));
+}
+
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< double,std::allocator< double > >());
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_1(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j,std::vector< double,std::allocator< double > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getitem____SWIG_0(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_0(std::vector< double > *self,PySliceObject *slice,std::vector< double,std::allocator< double > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_1(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_1(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< double >::value_type const &std_vector_Sl_double_Sg____getitem____SWIG_1(std::vector< double > const *self,std::vector< double >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_2(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< double >::value_type std_vector_Sl_double_Sg__pop(std::vector< double > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< double,std::allocator< double > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_double_Sg__append(std::vector< double > *self,std::vector< double >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_1(std::vector< double > *self,std::vector< double >::iterator first,std::vector< double >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__insert__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_double_Sg__insert__SWIG_1(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::size_type n,std::vector< double >::value_type const &x){ self->insert(pos, n, x); }
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::vector< double,std::allocator< double > >, std::allocator< std::vector< double,std::allocator< double > > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::vector< double,std::allocator< double > >" "," "std::allocator< std::vector< double,std::allocator< double > > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(std::vector< std::vector< double > > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__(std::vector< std::vector< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__(std::vector< std::vector< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::vector< double > >::size_type std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__(std::vector< std::vector< double > > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >());
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::vector< double > > *self,PySliceObject *slice,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::vector< double > >::value_type const &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::vector< double > >::value_type std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(std::vector< std::vector< double > > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator first,std::vector< std::vector< double > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::size_type n,std::vector< std::vector< double > >::value_type const &x){ self->insert(pos, n, x); }
+
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+SWIGINTERN int
+SWIG_AsVal_int (PyObject * obj, int *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v < INT_MIN || v > INT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< int >(v);
+    }
+  }  
+  return res;
+}
+
+
+namespace swig {
+  template <> struct traits< int > {
+    typedef value_category category;
+    static const char* type_name() { return"int"; }
+  };
+  template <>  struct traits_asval< int > {
+    typedef int value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_int (obj, val);
+    }
+  };
+  template <>  struct traits_from< int > {
+    typedef int value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_int  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< int, std::allocator< int > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "int" "," "std::allocator< int >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_int_Sg__iterator(std::vector< int > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_int_Sg____nonzero__(std::vector< int > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_int_Sg____bool__(std::vector< int > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< int >::size_type std_vector_Sl_int_Sg____len__(std::vector< int > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< int,std::allocator< int > >());
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_1(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j,std::vector< int,std::allocator< int > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getitem____SWIG_0(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_0(std::vector< int > *self,PySliceObject *slice,std::vector< int,std::allocator< int > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_1(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_1(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< int >::value_type const &std_vector_Sl_int_Sg____getitem____SWIG_1(std::vector< int > const *self,std::vector< int >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_2(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< int >::value_type std_vector_Sl_int_Sg__pop(std::vector< int > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< int,std::allocator< int > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_int_Sg__append(std::vector< int > *self,std::vector< int >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_1(std::vector< int > *self,std::vector< int >::iterator first,std::vector< int >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__insert__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_int_Sg__insert__SWIG_1(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::size_type n,std::vector< int >::value_type const &x){ self->insert(pos, n, x); }
+
+namespace swig {
+  template <> struct traits< unsigned long > {
+    typedef value_category category;
+    static const char* type_name() { return"unsigned long"; }
+  };
+  template <>  struct traits_asval< unsigned long > {
+    typedef unsigned long value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_unsigned_SS_long (obj, val);
+    }
+  };
+  template <>  struct traits_from< unsigned long > {
+    typedef unsigned long value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_unsigned_SS_long  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< unsigned long, std::allocator< unsigned long > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "unsigned long" "," "std::allocator< unsigned long >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_unsigned_SS_long_Sg__iterator(std::vector< unsigned long > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_unsigned_SS_long_Sg____nonzero__(std::vector< unsigned long > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_unsigned_SS_long_Sg____bool__(std::vector< unsigned long > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< unsigned long >::size_type std_vector_Sl_unsigned_SS_long_Sg____len__(std::vector< unsigned long > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< unsigned long,std::allocator< unsigned long > > *std_vector_Sl_unsigned_SS_long_Sg____getslice__(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< unsigned long,std::allocator< unsigned long > >());
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_1(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j,std::vector< unsigned long,std::allocator< unsigned long > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____delslice__(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< unsigned long,std::allocator< unsigned long > > *std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_0(std::vector< unsigned long > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_0(std::vector< unsigned long > *self,PySliceObject *slice,std::vector< unsigned long,std::allocator< unsigned long > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_1(std::vector< unsigned long > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_1(std::vector< unsigned long > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type id = i;
+      std::vector< unsigned long,std::allocator< unsigned long > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< unsigned long >::value_type const &std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_1(std::vector< unsigned long > const *self,std::vector< unsigned long >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_2(std::vector< unsigned long > *self,std::vector< unsigned long >::difference_type i,std::vector< unsigned long >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< unsigned long >::value_type std_vector_Sl_unsigned_SS_long_Sg__pop(std::vector< unsigned long > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< unsigned long,std::allocator< unsigned long > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg__append(std::vector< unsigned long > *self,std::vector< unsigned long >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< unsigned long >::iterator std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< unsigned long >::iterator std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_1(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator first,std::vector< unsigned long >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< unsigned long >::iterator std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_0(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator pos,std::vector< unsigned long >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_1(std::vector< unsigned long > *self,std::vector< unsigned long >::iterator pos,std::vector< unsigned long >::size_type n,std::vector< unsigned long >::value_type const &x){ self->insert(pos, n, x); }
+
+SWIGINTERN int
+SWIG_AsVal_std_complex_Sl_double_Sg_  (PyObject *o, std::complex<double>* val)
+{
+  if (PyComplex_Check(o)) {
+    if (val) *val = std::complex<double>(PyComplex_RealAsDouble(o), PyComplex_ImagAsDouble(o));
+    return SWIG_OK;
+  } else {
+    double d;    
+    int res = SWIG_AddCast(SWIG_AsVal_double (o, &d));
+    if (SWIG_IsOK(res)) {
+      if (val) *val = std::complex<double>(d, 0.0);
+      return res;
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE PyObject*
+SWIG_From_std_complex_Sl_double_Sg_  (/*@SWIG:/usr/share/swig3.0/typemaps/swigmacros.swg,104,%ifcplusplus@*/
+
+const std::complex<double>&
+
+
+
+/*@SWIG@*/ c)
+{
+  return PyComplex_FromDoubles(std::real(c), std::imag(c));
+}
+
+
+namespace swig {
+  template <> struct traits< std::complex<double> > {
+    typedef value_category category;
+    static const char* type_name() { return"std::complex<double>"; }
+  };
+  template <>  struct traits_asval< std::complex<double> > {
+    typedef std::complex<double> value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_std_complex_Sl_double_Sg_ (obj, val);
+    }
+  };
+  template <>  struct traits_from< std::complex<double> > {
+    typedef std::complex<double> value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_std_complex_Sl_double_Sg_  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::complex< double >, std::allocator< std::complex< double > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::complex< double >" "," "std::allocator< std::complex< double > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_complex_Sl_double_Sg__Sg__iterator(std::vector< std::complex< double > > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_complex_Sl_double_Sg__Sg____nonzero__(std::vector< std::complex< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_complex_Sl_double_Sg__Sg____bool__(std::vector< std::complex< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::complex< double > >::size_type std_vector_Sl_std_complex_Sl_double_Sg__Sg____len__(std::vector< std::complex< double > > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::complex< double >,std::allocator< std::complex< double > > > *std_vector_Sl_std_complex_Sl_double_Sg__Sg____getslice__(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::complex< double >,std::allocator< std::complex< double > > >());
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_1(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____delslice__(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::complex< double >,std::allocator< std::complex< double > > > *std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::complex< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::complex< double > > *self,PySliceObject *slice,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::complex< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_1(std::vector< std::complex< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type id = i;
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::complex< double > >::value_type const &std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::complex< double > > const *self,std::vector< std::complex< double > >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_2(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::difference_type i,std::vector< std::complex< double > >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::complex< double > >::value_type std_vector_Sl_std_complex_Sl_double_Sg__Sg__pop(std::vector< std::complex< double > > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::complex< double >,std::allocator< std::complex< double > > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg__append(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::complex< double > >::iterator std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::complex< double > >::iterator std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator first,std::vector< std::complex< double > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::complex< double > >::iterator std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator pos,std::vector< std::complex< double > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::complex< double > > *self,std::vector< std::complex< double > >::iterator pos,std::vector< std::complex< double > >::size_type n,std::vector< std::complex< double > >::value_type const &x){ self->insert(pos, n, x); }
+
+SWIGINTERN swig_type_info*
+SWIG_pchar_descriptor(void)
+{
+  static int init = 0;
+  static swig_type_info* info = 0;
+  if (!init) {
+    info = SWIG_TypeQuery("_p_char");
+    init = 1;
+  }
+  return info;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+{
+#if PY_VERSION_HEX>=0x03000000
+  if (PyUnicode_Check(obj))
+#else  
+  if (PyString_Check(obj))
+#endif
+  {
+    char *cstr; Py_ssize_t len;
+#if PY_VERSION_HEX>=0x03000000
+    if (!alloc && cptr) {
+        /* We can't allow converting without allocation, since the internal
+           representation of string in Python 3 is UCS-2/UCS-4 but we require
+           a UTF-8 representation.
+           TODO(bhy) More detailed explanation */
+        return SWIG_RuntimeError;
+    }
+    obj = PyUnicode_AsUTF8String(obj);
+    PyBytes_AsStringAndSize(obj, &cstr, &len);
+    if(alloc) *alloc = SWIG_NEWOBJ;
+#else
+    PyString_AsStringAndSize(obj, &cstr, &len);
+#endif
+    if (cptr) {
+      if (alloc) {
+	/* 
+	   In python the user should not be able to modify the inner
+	   string representation. To warranty that, if you define
+	   SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
+	   buffer is always returned.
+
+	   The default behavior is just to return the pointer value,
+	   so, be careful.
+	*/ 
+#if defined(SWIG_PYTHON_SAFE_CSTRINGS)
+	if (*alloc != SWIG_OLDOBJ) 
+#else
+	if (*alloc == SWIG_NEWOBJ) 
+#endif
+	{
+	  *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+	  *alloc = SWIG_NEWOBJ;
+	} else {
+	  *cptr = cstr;
+	  *alloc = SWIG_OLDOBJ;
+	}
+      } else {
+	#if PY_VERSION_HEX>=0x03000000
+	assert(0); /* Should never reach here in Python 3 */
+	#endif
+	*cptr = SWIG_Python_str_AsChar(obj);
+      }
+    }
+    if (psize) *psize = len + 1;
+#if PY_VERSION_HEX>=0x03000000
+    Py_XDECREF(obj);
+#endif
+    return SWIG_OK;
+  } else {
+#if defined(SWIG_PYTHON_2_UNICODE)
+#if PY_VERSION_HEX<0x03000000
+    if (PyUnicode_Check(obj)) {
+      char *cstr; Py_ssize_t len;
+      if (!alloc && cptr) {
+        return SWIG_RuntimeError;
+      }
+      obj = PyUnicode_AsUTF8String(obj);
+      if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
+        if (cptr) {
+          if (alloc) *alloc = SWIG_NEWOBJ;
+          *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+        }
+        if (psize) *psize = len + 1;
+
+        Py_XDECREF(obj);
+        return SWIG_OK;
+      } else {
+        Py_XDECREF(obj);
+      }
+    }
+#endif
+#endif
+
+    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+    if (pchar_descriptor) {
+      void* vptr = 0;
+      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
+	if (cptr) *cptr = (char *) vptr;
+	if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
+	if (alloc) *alloc = SWIG_OLDOBJ;
+	return SWIG_OK;
+      }
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERN int
+SWIG_AsPtr_std_string (PyObject * obj, std::string **val) 
+{
+  char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ;
+  if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) {
+    if (buf) {
+      if (val) *val = new std::string(buf, size - 1);
+      if (alloc == SWIG_NEWOBJ) delete[] buf;
+      return SWIG_NEWOBJ;
+    } else {
+      if (val) *val = 0;
+      return SWIG_OLDOBJ;
+    }
+  } else {
+    static int init = 0;
+    static swig_type_info* descriptor = 0;
+    if (!init) {
+      descriptor = SWIG_TypeQuery("std::string" " *");
+      init = 1;
+    }
+    if (descriptor) {
+      std::string *vptr;
+      int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0);
+      if (SWIG_IsOK(res) && val) *val = vptr;
+      return res;
+    }
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_std_string (PyObject * obj, std::string *val)
+{
+  std::string* v = (std::string *) 0;
+  int res = SWIG_AsPtr_std_string (obj, &v);
+  if (!SWIG_IsOK(res)) return res;
+  if (v) {
+    if (val) *val = *v;
+    if (SWIG_IsNewObj(res)) {
+      delete v;
+      res = SWIG_DelNewMask(res);
+    }
+    return res;
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+{
+  if (carray) {
+    if (size > INT_MAX) {
+      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+      return pchar_descriptor ? 
+	SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
+    } else {
+#if PY_VERSION_HEX >= 0x03000000
+#if PY_VERSION_HEX >= 0x03010000
+      return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape");
+#else
+      return PyUnicode_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#endif
+#else
+      return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#endif
+    }
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_std_string  (const std::string& s)
+{
+  return SWIG_FromCharPtrAndSize(s.data(), s.size());
+}
+
+
+namespace swig {
+  template <> struct traits< std::string > {
+    typedef value_category category;
+    static const char* type_name() { return"std::string"; }
+  };
+  template <>  struct traits_asval< std::string > {
+    typedef std::string value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_std_string (obj, val);
+    }
+  };
+  template <>  struct traits_from< std::string > {
+    typedef std::string value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_std_string  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::string, std::allocator< std::string > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::string" "," "std::allocator< std::string >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_string_Sg__iterator(std::vector< std::string > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_string_Sg____nonzero__(std::vector< std::string > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_string_Sg____bool__(std::vector< std::string > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::string >::size_type std_vector_Sl_std_string_Sg____len__(std::vector< std::string > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::string,std::allocator< std::string > >());
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_1(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j,std::vector< std::string,std::allocator< std::string > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getitem____SWIG_0(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_0(std::vector< std::string > *self,PySliceObject *slice,std::vector< std::string,std::allocator< std::string > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_1(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_1(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::string >::value_type const &std_vector_Sl_std_string_Sg____getitem____SWIG_1(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_2(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::string >::value_type std_vector_Sl_std_string_Sg__pop(std::vector< std::string > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::string,std::allocator< std::string > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg__append(std::vector< std::string > *self,std::vector< std::string >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator first,std::vector< std::string >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__insert__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::size_type n,std::vector< std::string >::value_type const &x){ self->insert(pos, n, x); }
+
+#define SWIG_FILE_WITH_INIT
+#define PY_ARRAY_UNIQUE_SYMBOL BORNAGAIN_PYTHONAPI_ARRAY
+
+
+#ifndef SWIG_FILE_WITH_INIT
+#define NO_IMPORT_ARRAY
+#endif
+#include "stdio.h"
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#include <numpy/arrayobject.h>
+
+
+#include "AttLimits.h"
+#include "IFitParameter.h"
+#include "FitParameter.h"
+#include "FitParameterSet.h"
+#include "IMinimizer.h"
+#include "MinimizerCatalogue.h"
+#include "MinimizerFactory.h"
+
+
+SWIGINTERN int
+SWIG_AsVal_bool (PyObject *obj, bool *val)
+{
+  int r;
+  if (!PyBool_Check(obj))
+    return SWIG_ERROR;
+  r = PyObject_IsTrue(obj);
+  if (r == -1)
+    return SWIG_ERROR;
+  if (val) *val = r ? true : false;
+  return SWIG_OK;
+}
+
+SWIGINTERN FitParameter const *FitParameterSet___getitem____SWIG_0(FitParameterSet const *self,std::string name){
+        return (*(self))[name];
+    }
+SWIGINTERN FitParameter const *FitParameterSet___getitem____SWIG_1(FitParameterSet const *self,size_t index){
+        return (*(self))[index];
+    }
+
+
+/* ---------------------------------------------------
+ * C++ director class methods
+ * --------------------------------------------------- */
+
+#include "libBornAgainFit_wrap.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_SwigPyIterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SwigPyIterator" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_value",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_value" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)((swig::SwigPyIterator const *)arg1)->value();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_incr",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_incr" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->incr(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_incr",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->incr();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SwigPyIterator_incr__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator_incr__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SwigPyIterator_incr'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    swig::SwigPyIterator::incr(size_t)\n"
+    "    swig::SwigPyIterator::incr()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_decr",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_decr" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->decr(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_decr",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->decr();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SwigPyIterator_decr__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator_decr__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'SwigPyIterator_decr'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    swig::SwigPyIterator::decr(size_t)\n"
+    "    swig::SwigPyIterator::decr()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ptrdiff_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_distance",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_distance" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  try {
+    result = ((swig::SwigPyIterator const *)arg1)->distance((swig::SwigPyIterator const &)*arg2);
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail;
+  }
+  
+  resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_equal",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_equal" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  try {
+    result = (bool)((swig::SwigPyIterator const *)arg1)->equal((swig::SwigPyIterator const &)*arg2);
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail;
+  }
+  
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_copy",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_copy" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->copy();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_next",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_next" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->next();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator___next__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___next__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->__next__();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:SwigPyIterator_previous",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_previous" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->previous();
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator_advance",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_advance" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_advance" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->advance(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___eq__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___eq__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = (bool)((swig::SwigPyIterator const *)arg1)->operator ==((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___ne__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___ne__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = (bool)((swig::SwigPyIterator const *)arg1)->operator !=((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___iadd__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___iadd__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___iadd__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *) &(arg1)->operator +=(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___isub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___isub__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___isub__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *) &(arg1)->operator -=(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___add__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___add__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___add__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator +(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___sub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator -(arg2);
+  }
+  catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  ptrdiff_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:SwigPyIterator___sub__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = ((swig::SwigPyIterator const *)arg1)->operator -((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_swig__SwigPyIterator, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_SwigPyIterator___sub____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator___sub____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *SwigPyIterator_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_swig__SwigPyIterator, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *SHARED_PTR_DISOWN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *module;
+  PyObject *d;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
+  d = PyModule_GetDict(module);
+  if (!d) return NULL;
+  SWIG_Python_SetConstant(d, "SHARED_PTR_DISOWN",SWIG_From_int(static_cast< int >(0)));
+  return SWIG_Py_Void();
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_iterator" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_double_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___nonzero__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)std_vector_Sl_double_Sg____nonzero__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___bool__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)std_vector_Sl_double_Sg____bool__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___len__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = std_vector_Sl_double_Sg____len__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___getslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___getslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___getslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    std_vector_Sl_double_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  std::vector< double,std::allocator< double > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble1d_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vdouble1d_t___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble1d_t___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_double_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vdouble1d_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type)\n"
+    "    std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___delslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___delslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___delslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    std_vector_Sl_double_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___delitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  try {
+    std_vector_Sl_double_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___getitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble1d_t___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble1d_t___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_double_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__delitem__(std::vector< double >::difference_type)\n"
+    "    std::vector< double >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___getitem__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___getitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  try {
+    result = (std::vector< double >::value_type *) &std_vector_Sl_double_Sg____getitem____SWIG_1((std::vector< double > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__getitem__(PySliceObject *)\n"
+    "    std::vector< double >::__getitem__(std::vector< double >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t___setitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t___setitem__" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_2(arg1,arg2,(double const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble1d_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__setitem__(PySliceObject *,std::vector< double,std::allocator< double > > const &)\n"
+    "    std::vector< double >::__setitem__(PySliceObject *)\n"
+    "    std::vector< double >::__setitem__(std::vector< double >::difference_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_pop" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  try {
+    result = (std::vector< double >::value_type)std_vector_Sl_double_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_append" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_append" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_double_Sg__append(arg1,(double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vdouble1d_t")) SWIG_fail;
+  result = (std::vector< double > *)new std::vector< double >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble1d_t",&obj0)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< double > *)new std::vector< double >((std::vector< double > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_empty" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)((std::vector< double > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_size" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_swap" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble1d_t_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble1d_t_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_begin" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_end" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_rbegin" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_rend" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_clear" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_get_allocator" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< double >::allocator_type(static_cast< const std::vector< double >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble1d_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  result = (std::vector< double > *)new std::vector< double >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_pop_back" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vdouble1d_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vdouble1d_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::erase(std::vector< double >::iterator)\n"
+    "    std::vector< double >::erase(std::vector< double >::iterator,std::vector< double >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double >::size_type arg1 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vdouble1d_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vdouble1d_t" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< double > *)new std::vector< double >(arg1,(std::vector< double >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble1d_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vdouble1d_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vdouble1d_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vdouble1d_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vdouble1d_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vdouble1d_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::vector()\n"
+    "    std::vector< double >::vector(std::vector< double > const &)\n"
+    "    std::vector< double >::vector(std::vector< double >::size_type)\n"
+    "    std::vector< double >::vector(std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_push_back" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_push_back" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< double >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_front" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->front();
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_back" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->back();
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_assign" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_assign" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_assign" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< double >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_resize" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< double >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble1d_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::resize(std::vector< double >::size_type)\n"
+    "    std::vector< double >::resize(std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble1d_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_insert" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_double_Sg__insert__SWIG_0(arg1,arg2,(double const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::size_type arg3 ;
+  std::vector< double >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< double >::value_type temp4 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble1d_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble1d_t_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble1d_t_insert" "', argument " "3"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::size_type >(val3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vdouble1d_t_insert" "', argument " "4"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< double >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_double_Sg__insert__SWIG_1(arg1,arg2,arg3,(double const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble1d_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vdouble1d_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble1d_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::value_type const &)\n"
+    "    std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble1d_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_reserve" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble1d_t_reserve" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble1d_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble1d_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble1d_t_capacity" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vdouble1d_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vdouble1d_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vdouble1d_t" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vdouble1d_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_iterator" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___nonzero__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___bool__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___len__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___getslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___getslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___getslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble2d_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vdouble2d_t___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vdouble2d_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vdouble2d_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type)\n"
+    "    std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___delslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___delslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t___delslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___delitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__delitem__(std::vector< std::vector< double > >::difference_type)\n"
+    "    std::vector< std::vector< double > >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___getitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  try {
+    result = (std::vector< std::vector< double > >::value_type *) &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::vector< double > > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::vector< double > >::__getitem__(std::vector< std::vector< double > >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t___setitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__setitem__(PySliceObject *,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n"
+    "    std::vector< std::vector< double > >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::vector< double > >::__setitem__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_pop" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  try {
+    result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_append" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble2d_t_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vdouble2d_t")) SWIG_fail;
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double,std::allocator< double > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble2d_t",&obj0)) SWIG_fail;
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >((std::vector< std::vector< double,std::allocator< double > > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_empty" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)((std::vector< std::vector< double > > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_size" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_swap" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble2d_t_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > > > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_begin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_end" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_rbegin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_rend" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_clear" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< std::vector< double,std::allocator< double > > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_get_allocator" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::vector< double > >::allocator_type(static_cast< const std::vector< std::vector< double > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vdouble2d_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_pop_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vdouble2d_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vdouble2d_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator)\n"
+    "    std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > >::size_type arg1 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vdouble2d_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_vdouble2d_t" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vdouble2d_t" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1,(std::vector< std::vector< double > >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vdouble2d_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vdouble2d_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vdouble2d_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vdouble2d_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_vdouble2d_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vdouble2d_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::vector()\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double,std::allocator< double > > > const &)\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type)\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_push_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vdouble2d_t_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->push_back((std::vector< std::vector< double > >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_front" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->front();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->back();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_assign" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_assign" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vdouble2d_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type)\n"
+    "    std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vdouble2d_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vdouble2d_t_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::size_type arg3 ;
+  std::vector< std::vector< double > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vdouble2d_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vdouble2d_t_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vdouble2d_t_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::size_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vdouble2d_t_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vdouble2d_t_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vdouble2d_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vdouble2d_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vdouble2d_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::value_type const &)\n"
+    "    std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vdouble2d_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_reserve" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vdouble2d_t_reserve" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vdouble2d_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vdouble2d_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vdouble2d_t_capacity" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vdouble2d_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vdouble2d_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vdouble2d_t" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vdouble2d_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_iterator" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_int_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___nonzero__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)std_vector_Sl_int_Sg____nonzero__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___bool__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)std_vector_Sl_int_Sg____bool__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___len__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = std_vector_Sl_int_Sg____len__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___getslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___getslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___getslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    std_vector_Sl_int_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  std::vector< int,std::allocator< int > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_integer_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_integer_t___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_integer_t___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_int_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< int,std::allocator< int > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< int,std::allocator< int > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_integer_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type)\n"
+    "    std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type,std::vector< int,std::allocator< int > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___delslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___delslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___delslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    std_vector_Sl_int_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___delitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  try {
+    std_vector_Sl_int_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___getitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< int,std::allocator< int > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_integer_t___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_integer_t___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< int,std::allocator< int > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_int_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__delitem__(std::vector< int >::difference_type)\n"
+    "    std::vector< int >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___getitem__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___getitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  try {
+    result = (std::vector< int >::value_type *) &std_vector_Sl_int_Sg____getitem____SWIG_1((std::vector< int > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__getitem__(PySliceObject *)\n"
+    "    std::vector< int >::__getitem__(std::vector< int >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t___setitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t___setitem__" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_2(arg1,arg2,(int const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< int,std::allocator< int > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_integer_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__setitem__(PySliceObject *,std::vector< int,std::allocator< int > > const &)\n"
+    "    std::vector< int >::__setitem__(PySliceObject *)\n"
+    "    std::vector< int >::__setitem__(std::vector< int >::difference_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_pop" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  try {
+    result = (std::vector< int >::value_type)std_vector_Sl_int_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_append" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_append" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_int_Sg__append(arg1,(int const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_integer_t")) SWIG_fail;
+  result = (std::vector< int > *)new std::vector< int >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_integer_t",&obj0)) SWIG_fail;
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< int > *)new std::vector< int >((std::vector< int > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_empty" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)((std::vector< int > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_size" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_swap" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_integer_t_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_integer_t_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< int > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_begin" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_end" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_rbegin" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_rend" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_clear" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< int > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_get_allocator" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< int >::allocator_type(static_cast< const std::vector< int >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_int_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_integer_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  result = (std::vector< int > *)new std::vector< int >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_pop_back" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_integer_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_integer_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::erase(std::vector< int >::iterator)\n"
+    "    std::vector< int >::erase(std::vector< int >::iterator,std::vector< int >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int >::size_type arg1 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_integer_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_integer_t" "', argument " "1"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vector_integer_t" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< int > *)new std::vector< int >(arg1,(std::vector< int >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_integer_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_integer_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_integer_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_integer_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vector_integer_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_integer_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::vector()\n"
+    "    std::vector< int >::vector(std::vector< int > const &)\n"
+    "    std::vector< int >::vector(std::vector< int >::size_type)\n"
+    "    std::vector< int >::vector(std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_push_back" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_push_back" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< int >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_front" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->front();
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_back" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->back();
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_assign" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_assign" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_assign" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< int >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_resize" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< int >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_integer_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::resize(std::vector< int >::size_type)\n"
+    "    std::vector< int >::resize(std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_integer_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_insert" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_int_Sg__insert__SWIG_0(arg1,arg2,(int const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::size_type arg3 ;
+  std::vector< int >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< int >::value_type temp4 ;
+  int val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_integer_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_integer_t_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_integer_t_insert" "', argument " "3"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::size_type >(val3);
+  ecode4 = SWIG_AsVal_int(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vector_integer_t_insert" "', argument " "4"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< int >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_int_Sg__insert__SWIG_1(arg1,arg2,arg3,(int const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_integer_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_int(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vector_integer_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_integer_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::value_type const &)\n"
+    "    std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_integer_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_reserve" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_integer_t_reserve" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_integer_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< int >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_integer_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_integer_t_capacity" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_integer_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_integer_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_integer_t" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_integer_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_iterator" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_unsigned_SS_long_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___nonzero__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (bool)std_vector_Sl_unsigned_SS_long_Sg____nonzero__((std::vector< unsigned long > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___bool__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (bool)std_vector_Sl_unsigned_SS_long_Sg____bool__((std::vector< unsigned long > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___len__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = std_vector_Sl_unsigned_SS_long_Sg____len__((std::vector< unsigned long > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___getslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___getslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___getslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  try {
+    result = (std::vector< unsigned long,std::allocator< unsigned long > > *)std_vector_Sl_unsigned_SS_long_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___setslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___setslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_longinteger_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___setslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___setslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  {
+    std::vector< unsigned long,std::allocator< unsigned long > > *ptr = (std::vector< unsigned long,std::allocator< unsigned long > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_longinteger_t___setslice__" "', argument " "4"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_longinteger_t___setslice__" "', argument " "4"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< unsigned long,std::allocator< unsigned long > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_longinteger_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__setslice__(std::vector< unsigned long >::difference_type,std::vector< unsigned long >::difference_type)\n"
+    "    std::vector< unsigned long >::__setslice__(std::vector< unsigned long >::difference_type,std::vector< unsigned long >::difference_type,std::vector< unsigned long,std::allocator< unsigned long > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___delslice__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___delslice__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___delslice__" "', argument " "3"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::difference_type >(val3);
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___delitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___delitem__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___getitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< unsigned long,std::allocator< unsigned long > > *)std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< unsigned long,std::allocator< unsigned long > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< unsigned long,std::allocator< unsigned long > > *ptr = (std::vector< unsigned long,std::allocator< unsigned long > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_longinteger_t___setitem__" "', argument " "3"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_longinteger_t___setitem__" "', argument " "3"" of type '" "std::vector< unsigned long,std::allocator< unsigned long > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< unsigned long,std::allocator< unsigned long > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___delitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__delitem__(std::vector< unsigned long >::difference_type)\n"
+    "    std::vector< unsigned long >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___getitem__" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___getitem__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  try {
+    result = (std::vector< unsigned long >::value_type *) &std_vector_Sl_unsigned_SS_long_Sg____getitem____SWIG_1((std::vector< unsigned long > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__getitem__(PySliceObject *)\n"
+    "    std::vector< unsigned long >::__getitem__(std::vector< unsigned long >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::difference_type arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t___setitem__" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t___setitem__" "', argument " "2"" of type '" "std::vector< unsigned long >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t___setitem__" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_unsigned_SS_long_Sg____setitem____SWIG_2(arg1,arg2,(unsigned long const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_longinteger_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_unsigned_SS_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::__setitem__(PySliceObject *,std::vector< unsigned long,std::allocator< unsigned long > > const &)\n"
+    "    std::vector< unsigned long >::__setitem__(PySliceObject *)\n"
+    "    std::vector< unsigned long >::__setitem__(std::vector< unsigned long >::difference_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_pop" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  try {
+    result = (std::vector< unsigned long >::value_type)std_vector_Sl_unsigned_SS_long_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< unsigned long >::value_type temp2 ;
+  unsigned long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_append" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_append" "', argument " "2"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< unsigned long >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_unsigned_SS_long_Sg__append(arg1,(unsigned long const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_longinteger_t")) SWIG_fail;
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_longinteger_t",&obj0)) SWIG_fail;
+  {
+    std::vector< unsigned long,std::allocator< unsigned long > > *ptr = (std::vector< unsigned long,std::allocator< unsigned long > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >((std::vector< unsigned long > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_empty" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (bool)((std::vector< unsigned long > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_size" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = ((std::vector< unsigned long > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_swap" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_longinteger_t_swap" "', argument " "2"" of type '" "std::vector< unsigned long > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_longinteger_t_swap" "', argument " "2"" of type '" "std::vector< unsigned long > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< unsigned long > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_begin" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_end" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_rbegin" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_rend" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_clear" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< unsigned long > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_get_allocator" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = ((std::vector< unsigned long > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< unsigned long >::allocator_type(static_cast< const std::vector< unsigned long >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_unsigned_long_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_longinteger_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< unsigned long >::size_type >(val1);
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_pop_back" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_resize" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_resize" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_erase" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  std::vector< unsigned long >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_erase" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "3"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_erase" "', argument " "3"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_unsigned_SS_long_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_longinteger_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_longinteger_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::erase(std::vector< unsigned long >::iterator)\n"
+    "    std::vector< unsigned long >::erase(std::vector< unsigned long >::iterator,std::vector< unsigned long >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long >::size_type arg1 ;
+  std::vector< unsigned long >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< unsigned long >::value_type temp2 ;
+  unsigned long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< unsigned long > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_longinteger_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< unsigned long >::size_type >(val1);
+  ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vector_longinteger_t" "', argument " "2"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< unsigned long >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< unsigned long > *)new std::vector< unsigned long >(arg1,(std::vector< unsigned long >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_longinteger_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_longinteger_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_longinteger_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_longinteger_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_unsigned_SS_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vector_longinteger_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_longinteger_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::vector()\n"
+    "    std::vector< unsigned long >::vector(std::vector< unsigned long > const &)\n"
+    "    std::vector< unsigned long >::vector(std::vector< unsigned long >::size_type)\n"
+    "    std::vector< unsigned long >::vector(std::vector< unsigned long >::size_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< unsigned long >::value_type temp2 ;
+  unsigned long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_push_back" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_push_back" "', argument " "2"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< unsigned long >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< unsigned long >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_front" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (std::vector< unsigned long >::value_type *) &((std::vector< unsigned long > const *)arg1)->front();
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_back" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = (std::vector< unsigned long >::value_type *) &((std::vector< unsigned long > const *)arg1)->back();
+  resultobj = SWIG_From_unsigned_SS_long(static_cast< unsigned long >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_assign" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_assign" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_assign" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< unsigned long >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_resize" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_resize" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_resize" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< unsigned long >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_longinteger_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_unsigned_SS_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::resize(std::vector< unsigned long >::size_type)\n"
+    "    std::vector< unsigned long >::resize(std::vector< unsigned long >::size_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  std::vector< unsigned long >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< unsigned long >::value_type temp3 ;
+  unsigned long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< unsigned long >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_longinteger_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_insert" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_unsigned_SS_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_insert" "', argument " "3"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< unsigned long >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_0(arg1,arg2,(unsigned long const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< unsigned long >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::iterator arg2 ;
+  std::vector< unsigned long >::size_type arg3 ;
+  std::vector< unsigned long >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< unsigned long >::value_type temp4 ;
+  unsigned long val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_longinteger_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_insert" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_longinteger_t_insert" "', argument " "2"" of type '" "std::vector< unsigned long >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_longinteger_t_insert" "', argument " "3"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< unsigned long >::size_type >(val3);
+  ecode4 = SWIG_AsVal_unsigned_SS_long(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vector_longinteger_t_insert" "', argument " "4"" of type '" "std::vector< unsigned long >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< unsigned long >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_unsigned_SS_long_Sg__insert__SWIG_1(arg1,arg2,arg3,(unsigned long const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_unsigned_SS_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_longinteger_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< unsigned long,std::allocator< unsigned long > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< unsigned long >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_unsigned_SS_long(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vector_longinteger_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_longinteger_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< unsigned long >::insert(std::vector< unsigned long >::iterator,std::vector< unsigned long >::value_type const &)\n"
+    "    std::vector< unsigned long >::insert(std::vector< unsigned long >::iterator,std::vector< unsigned long >::size_type,std::vector< unsigned long >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  std::vector< unsigned long >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_longinteger_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_reserve" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_longinteger_t_reserve" "', argument " "2"" of type '" "std::vector< unsigned long >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< unsigned long >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_longinteger_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< unsigned long >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_longinteger_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_longinteger_t_capacity" "', argument " "1"" of type '" "std::vector< unsigned long > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  result = ((std::vector< unsigned long > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_longinteger_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< unsigned long > *arg1 = (std::vector< unsigned long > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_longinteger_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_longinteger_t" "', argument " "1"" of type '" "std::vector< unsigned long > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< unsigned long > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_longinteger_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_iterator" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_complex_Sl_double_Sg__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___nonzero__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_complex_Sl_double_Sg__Sg____nonzero__((std::vector< std::complex< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___bool__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_complex_Sl_double_Sg__Sg____bool__((std::vector< std::complex< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___len__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg____len__((std::vector< std::complex< double > > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___getslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___getslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___getslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  try {
+    result = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)std_vector_Sl_std_complex_Sl_double_Sg__Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___setslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___setslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_complex_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___setslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___setslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  {
+    std::vector< std::complex< double >,std::allocator< std::complex< double > > > *ptr = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_complex_t___setslice__" "', argument " "4"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_complex_t___setslice__" "', argument " "4"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_complex_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__setslice__(std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double > >::difference_type)\n"
+    "    std::vector< std::complex< double > >::__setslice__(std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___delslice__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___delslice__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___delslice__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___delitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___delitem__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___getitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::complex< double >,std::allocator< std::complex< double > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< std::complex< double >,std::allocator< std::complex< double > > > *ptr = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_complex_t___setitem__" "', argument " "3"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_complex_t___setitem__" "', argument " "3"" of type '" "std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___delitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__delitem__(std::vector< std::complex< double > >::difference_type)\n"
+    "    std::vector< std::complex< double > >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___getitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___getitem__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  try {
+    result = (std::vector< std::complex< double > >::value_type *) &std_vector_Sl_std_complex_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::complex< double > > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::complex< double > >::__getitem__(std::vector< std::complex< double > >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::difference_type arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t___setitem__" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t___setitem__" "', argument " "2"" of type '" "std::vector< std::complex< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t___setitem__" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_std_complex_Sl_double_Sg__Sg____setitem____SWIG_2(arg1,arg2,(std::complex< double > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_complex_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::__setitem__(PySliceObject *,std::vector< std::complex< double >,std::allocator< std::complex< double > > > const &)\n"
+    "    std::vector< std::complex< double > >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::complex< double > >::__setitem__(std::vector< std::complex< double > >::difference_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_pop" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  try {
+    result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::complex< double > >::value_type temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_append" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_append" "', argument " "2"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< std::complex< double > >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_std_complex_Sl_double_Sg__Sg__append(arg1,(std::complex< double > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_complex_t")) SWIG_fail;
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_complex_t",&obj0)) SWIG_fail;
+  {
+    std::vector< std::complex< double >,std::allocator< std::complex< double > > > *ptr = (std::vector< std::complex< double >,std::allocator< std::complex< double > > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >((std::vector< std::complex< double > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_empty" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (bool)((std::vector< std::complex< double > > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_size" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = ((std::vector< std::complex< double > > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_swap" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_complex_t_swap" "', argument " "2"" of type '" "std::vector< std::complex< double > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_complex_t_swap" "', argument " "2"" of type '" "std::vector< std::complex< double > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::complex< double > > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_begin" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_end" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_rbegin" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_rend" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_clear" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< std::complex< double > > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_get_allocator" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = ((std::vector< std::complex< double > > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::complex< double > >::allocator_type(static_cast< const std::vector< std::complex< double > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__complexT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_complex_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::complex< double > >::size_type >(val1);
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_pop_back" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_resize" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_resize" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_erase" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  std::vector< std::complex< double > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_erase" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "3"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_erase" "', argument " "3"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_complex_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_complex_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::erase(std::vector< std::complex< double > >::iterator)\n"
+    "    std::vector< std::complex< double > >::erase(std::vector< std::complex< double > >::iterator,std::vector< std::complex< double > >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > >::size_type arg1 ;
+  std::vector< std::complex< double > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< std::complex< double > >::value_type temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::complex< double > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_complex_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::complex< double > >::size_type >(val1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_vector_complex_t" "', argument " "2"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< std::complex< double > >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< std::complex< double > > *)new std::vector< std::complex< double > >(arg1,(std::vector< std::complex< double > >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_complex_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_complex_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_complex_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_complex_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_vector_complex_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_complex_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::vector()\n"
+    "    std::vector< std::complex< double > >::vector(std::vector< std::complex< double > > const &)\n"
+    "    std::vector< std::complex< double > >::vector(std::vector< std::complex< double > >::size_type)\n"
+    "    std::vector< std::complex< double > >::vector(std::vector< std::complex< double > >::size_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::complex< double > >::value_type temp2 ;
+  std::complex< double > val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_push_back" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_push_back" "', argument " "2"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< std::complex< double > >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< std::complex< double > >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_front" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (std::vector< std::complex< double > >::value_type *) &((std::vector< std::complex< double > > const *)arg1)->front();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_back" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = (std::vector< std::complex< double > >::value_type *) &((std::vector< std::complex< double > > const *)arg1)->back();
+  resultobj = SWIG_From_std_complex_Sl_double_Sg_(static_cast< std::complex<double> >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_assign" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_assign" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_assign" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< std::complex< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_resize" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_resize" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_resize" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< std::complex< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_complex_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::resize(std::vector< std::complex< double > >::size_type)\n"
+    "    std::vector< std::complex< double > >::resize(std::vector< std::complex< double > >::size_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  std::vector< std::complex< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< std::complex< double > >::value_type temp3 ;
+  std::complex< double > val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::complex< double > >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_complex_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_insert" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_insert" "', argument " "3"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< std::complex< double > >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_0(arg1,arg2,(std::complex< double > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::complex< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::iterator arg2 ;
+  std::vector< std::complex< double > >::size_type arg3 ;
+  std::vector< std::complex< double > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< std::complex< double > >::value_type temp4 ;
+  std::complex< double > val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_complex_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_insert" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_complex_t_insert" "', argument " "2"" of type '" "std::vector< std::complex< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_complex_t_insert" "', argument " "3"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::complex< double > >::size_type >(val3);
+  ecode4 = SWIG_AsVal_std_complex_Sl_double_Sg_(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "vector_complex_t_insert" "', argument " "4"" of type '" "std::vector< std::complex< double > >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< std::complex< double > >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_std_complex_Sl_double_Sg__Sg__insert__SWIG_1(arg1,arg2,arg3,(std::complex< double > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_complex_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::complex< double >,std::allocator< std::complex< double > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::complex< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_std_complex_Sl_double_Sg_(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_vector_complex_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_complex_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::complex< double > >::insert(std::vector< std::complex< double > >::iterator,std::vector< std::complex< double > >::value_type const &)\n"
+    "    std::vector< std::complex< double > >::insert(std::vector< std::complex< double > >::iterator,std::vector< std::complex< double > >::size_type,std::vector< std::complex< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  std::vector< std::complex< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_complex_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_reserve" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_complex_t_reserve" "', argument " "2"" of type '" "std::vector< std::complex< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::complex< double > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_complex_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::complex< double > >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_complex_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_complex_t_capacity" "', argument " "1"" of type '" "std::vector< std::complex< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  result = ((std::vector< std::complex< double > > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_complex_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::complex< double > > *arg1 = (std::vector< std::complex< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_complex_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_complex_t" "', argument " "1"" of type '" "std::vector< std::complex< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::complex< double > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_complex_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_vector_string_t_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &obj0;
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_iterator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_iterator" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_string_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t___nonzero__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___nonzero__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)std_vector_Sl_std_string_Sg____nonzero__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t___bool__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___bool__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)std_vector_Sl_std_string_Sg____bool__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t___len__",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___len__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = std_vector_Sl_std_string_Sg____len__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___getslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___getslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___getslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___getslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___setslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_string_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  std::vector< std::string,std::allocator< std::string > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_string_t___setslice__",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res4 = swig::asptr(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_string_t___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::string,std::allocator< std::string > > const &)*arg4);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_vector_string_t___setslice____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::string,std::allocator< std::string > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_string_t___setslice____SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type)\n"
+    "    std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type,std::vector< std::string,std::allocator< std::string > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___delslice__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___delslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___delslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t___delslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_string_Sg____delslice__(arg1,arg2,arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___delitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_string_Sg____delitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___getitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getitem____SWIG_0(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::string,std::allocator< std::string > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res3 = swig::asptr(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::string,std::allocator< std::string > > const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___setitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___delitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(obj1)) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) obj1;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____delitem____SWIG_1(arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___delitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___delitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__delitem__(std::vector< std::string >::difference_type)\n"
+    "    std::vector< std::string >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___getitem__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___getitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  try {
+    result = (std::vector< std::string >::value_type *) &std_vector_Sl_std_string_Sg____getitem____SWIG_1((std::vector< std::string > const *)arg1,arg2);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::string >::__getitem__(std::vector< std::string >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t___setitem__",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t___setitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_2(arg1,arg2,(std::string const &)*arg3);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_vector_string_t___setitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::string,std::allocator< std::string > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t___setitem____SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t___setitem____SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__setitem__(PySliceObject *,std::vector< std::string,std::allocator< std::string > > const &)\n"
+    "    std::vector< std::string >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::string >::__setitem__(std::vector< std::string >::difference_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::value_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_pop",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_pop" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  try {
+    result = std_vector_Sl_std_string_Sg__pop(arg1);
+  }
+  catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_append",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_append" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_string_t_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  std_vector_Sl_std_string_Sg__append(arg1,(std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_vector_string_t")) SWIG_fail;
+  result = (std::vector< std::string > *)new std::vector< std::string >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_string_t",&obj0)) SWIG_fail;
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res1 = swig::asptr(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >((std::vector< std::string > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_empty",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_empty" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)((std::vector< std::string > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_size" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_swap",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_swap" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_string_t_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::string > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_begin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_end" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_rbegin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_rbegin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::reverse_iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_rend",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_rend" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_clear" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::allocator< std::string > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_get_allocator",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_get_allocator" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::string >::allocator_type(static_cast< const std::vector< std::string >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__string_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new_vector_string_t",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_pop_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_pop_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_resize",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_erase",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_erase",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(obj2, SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_vector_string_t_erase__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_vector_string_t_erase__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::erase(std::vector< std::string >::iterator)\n"
+    "    std::vector< std::string >::erase(std::vector< std::string >::iterator,std::vector< std::string >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string >::size_type arg1 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_vector_string_t",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_vector_string_t" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_vector_string_t" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1,(std::vector< std::string >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_vector_string_t(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_vector_string_t__SWIG_0(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_vector_string_t__SWIG_2(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_vector_string_t__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_vector_string_t__SWIG_3(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_vector_string_t'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::vector()\n"
+    "    std::vector< std::string >::vector(std::vector< std::string > const &)\n"
+    "    std::vector< std::string >::vector(std::vector< std::string >::size_type)\n"
+    "    std::vector< std::string >::vector(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_push_back",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_push_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "vector_string_t_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->push_back((std::vector< std::string >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_front",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_front" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->front();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_back",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_back" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->back();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_assign",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_assign" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_assign" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_resize",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_vector_string_t_resize__SWIG_0(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t_resize__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::resize(std::vector< std::string >::size_type)\n"
+    "    std::vector< std::string >::resize(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  std::vector< std::string >::iterator result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:vector_string_t_insert",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "vector_string_t_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_string_Sg__insert__SWIG_0(arg1,arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::size_type arg3 ;
+  std::vector< std::string >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:vector_string_t_insert",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "vector_string_t_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "vector_string_t_insert" "', argument " "3"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::size_type >(val3);
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(obj3, &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "vector_string_t_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "vector_string_t_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_string_Sg__insert__SWIG_1(arg1,arg2,arg3,(std::string const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_vector_string_t_insert__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_vector_string_t_insert__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'vector_string_t_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::value_type const &)\n"
+    "    std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:vector_string_t_reserve",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_reserve" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "vector_string_t_reserve" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_vector_string_t_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< std::string >::size_type result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:vector_string_t_capacity",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_string_t_capacity" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_vector_string_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_vector_string_t",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_vector_string_t" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *vector_string_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_AttLimits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_AttLimits")) SWIG_fail;
+  result = (AttLimits *)new AttLimits();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AttLimits, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_limitless(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":AttLimits_limitless")) SWIG_fail;
+  result = AttLimits::limitless();
+  resultobj = SWIG_NewPointerObj((new AttLimits(static_cast< const AttLimits& >(result))), SWIGTYPE_p_AttLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_lowerLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  AttLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_lowerLimited",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "AttLimits_lowerLimited" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = AttLimits::lowerLimited(arg1);
+  resultobj = SWIG_NewPointerObj((new AttLimits(static_cast< const AttLimits& >(result))), SWIGTYPE_p_AttLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_positive(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":AttLimits_positive")) SWIG_fail;
+  result = AttLimits::positive();
+  resultobj = SWIG_NewPointerObj((new AttLimits(static_cast< const AttLimits& >(result))), SWIGTYPE_p_AttLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_nonnegative(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":AttLimits_nonnegative")) SWIG_fail;
+  result = AttLimits::nonnegative();
+  resultobj = SWIG_NewPointerObj((new AttLimits(static_cast< const AttLimits& >(result))), SWIGTYPE_p_AttLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_upperLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj0 = 0 ;
+  AttLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_upperLimited",&obj0)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "AttLimits_upperLimited" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = AttLimits::upperLimited(arg1);
+  resultobj = SWIG_NewPointerObj((new AttLimits(static_cast< const AttLimits& >(result))), SWIGTYPE_p_AttLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_limited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double arg2 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  AttLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:AttLimits_limited",&obj0,&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj0, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "AttLimits_limited" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AttLimits_limited" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = AttLimits::limited(arg1,arg2);
+  resultobj = SWIG_NewPointerObj((new AttLimits(static_cast< const AttLimits& >(result))), SWIGTYPE_p_AttLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_fixed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":AttLimits_fixed")) SWIG_fail;
+  result = AttLimits::fixed();
+  resultobj = SWIG_NewPointerObj((new AttLimits(static_cast< const AttLimits& >(result))), SWIGTYPE_p_AttLimits, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_isFixed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_isFixed",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_isFixed" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = (bool)((AttLimits const *)arg1)->isFixed();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_isLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_isLimited",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_isLimited" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = (bool)((AttLimits const *)arg1)->isLimited();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_isUpperLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_isUpperLimited",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_isUpperLimited" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = (bool)((AttLimits const *)arg1)->isUpperLimited();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_isLowerLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_isLowerLimited",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_isLowerLimited" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = (bool)((AttLimits const *)arg1)->isLowerLimited();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_isLimitless(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_isLimitless",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_isLimitless" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = (bool)((AttLimits const *)arg1)->isLimitless();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_lowerLimit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_lowerLimit",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_lowerLimit" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = (double)((AttLimits const *)arg1)->lowerLimit();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_upperLimit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_upperLimit",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_upperLimit" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = (double)((AttLimits const *)arg1)->upperLimit();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_setFixed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:AttLimits_setFixed",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_setFixed" "', argument " "1"" of type '" "AttLimits *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  ecode2 = SWIG_AsVal_bool(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AttLimits_setFixed" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  (arg1)->setFixed(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  AttLimits *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:AttLimits___eq__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits___eq__" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AttLimits___eq__" "', argument " "2"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AttLimits___eq__" "', argument " "2"" of type '" "AttLimits const &""'"); 
+  }
+  arg2 = reinterpret_cast< AttLimits * >(argp2);
+  result = (bool)((AttLimits const *)arg1)->operator ==((AttLimits const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  AttLimits *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:AttLimits___ne__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits___ne__" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AttLimits___ne__" "', argument " "2"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AttLimits___ne__" "', argument " "2"" of type '" "AttLimits const &""'"); 
+  }
+  arg2 = reinterpret_cast< AttLimits * >(argp2);
+  result = (bool)((AttLimits const *)arg1)->operator !=((AttLimits const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AttLimits_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:AttLimits_toString",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AttLimits_toString" "', argument " "1"" of type '" "AttLimits const *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  result = ((AttLimits const *)arg1)->toString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_AttLimits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AttLimits *arg1 = (AttLimits *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_AttLimits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AttLimits, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AttLimits" "', argument " "1"" of type '" "AttLimits *""'"); 
+  }
+  arg1 = reinterpret_cast< AttLimits * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *AttLimits_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_AttLimits, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_IMinimizer")) SWIG_fail;
+  result = (IMinimizer *)new IMinimizer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IMinimizer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IMinimizer",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IMinimizer" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_minimizerName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_minimizerName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimizerName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->minimizerName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_algorithmName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_algorithmName",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_algorithmName" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->algorithmName();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_minimize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_minimize",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minimize" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  (arg1)->minimize();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_clear" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_setParameters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  FitParameterSet *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setParameters",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setParameters" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_FitParameterSet,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setParameters" "', argument " "2"" of type '" "FitParameterSet const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setParameters" "', argument " "2"" of type '" "FitParameterSet const &""'"); 
+  }
+  arg2 = reinterpret_cast< FitParameterSet * >(argp2);
+  (arg1)->setParameters((FitParameterSet const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_setObjectiveFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  objective_function_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setObjectiveFunction",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setObjectiveFunction" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_objective_function_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setObjectiveFunction" "', argument " "2"" of type '" "objective_function_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setObjectiveFunction" "', argument " "2"" of type '" "objective_function_t""'");
+    } else {
+      objective_function_t * temp = reinterpret_cast< objective_function_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  (arg1)->setObjectiveFunction(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_setGradientFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  gradient_function_t arg2 ;
+  int arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:IMinimizer_setGradientFunction",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setGradientFunction" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_gradient_function_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setGradientFunction" "', argument " "2"" of type '" "gradient_function_t""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setGradientFunction" "', argument " "2"" of type '" "gradient_function_t""'");
+    } else {
+      gradient_function_t * temp = reinterpret_cast< gradient_function_t * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IMinimizer_setGradientFunction" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  (arg1)->setGradientFunction(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_minValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_minValue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_minValue" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = (double)((IMinimizer const *)arg1)->minValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_reportResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IMinimizer_reportResults",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_reportResults" "', argument " "1"" of type '" "IMinimizer const *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  result = ((IMinimizer const *)arg1)->reportResults();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_propagateResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  FitParameterSet *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_propagateResults",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_propagateResults" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_FitParameterSet,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_propagateResults" "', argument " "2"" of type '" "FitParameterSet &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_propagateResults" "', argument " "2"" of type '" "FitParameterSet &""'"); 
+  }
+  arg2 = reinterpret_cast< FitParameterSet * >(argp2);
+  (arg1)->propagateResults(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IMinimizer_setOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IMinimizer *arg1 = (IMinimizer *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:IMinimizer_setOptions",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IMinimizer_setOptions" "', argument " "1"" of type '" "IMinimizer *""'"); 
+  }
+  arg1 = reinterpret_cast< IMinimizer * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IMinimizer_setOptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setOptions((std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IMinimizer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IMinimizer, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_delete_IFitParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitParameter *arg1 = (IFitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_IFitParameter",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitParameter, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IFitParameter" "', argument " "1"" of type '" "IFitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< IFitParameter * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IFitParameter_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  IFitParameter *arg1 = (IFitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  IFitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:IFitParameter_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_IFitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IFitParameter_clone" "', argument " "1"" of type '" "IFitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< IFitParameter * >(argp1);
+  result = (IFitParameter *)((IFitParameter const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IFitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IFitParameter_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_IFitParameter, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitParameter__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FitParameter")) SWIG_fail;
+  result = (FitParameter *)new FitParameter();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameter__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  AttLimits *arg3 = 0 ;
+  double arg4 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOOO:new_FitParameter",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FitParameter" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_FitParameter" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameter" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  arg3 = reinterpret_cast< AttLimits * >(argp3);
+  ecode4 = SWIG_AsVal_double(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_FitParameter" "', argument " "4"" of type '" "double""'");
+  } 
+  arg4 = static_cast< double >(val4);
+  result = (FitParameter *)new FitParameter((std::string const &)*arg1,arg2,(AttLimits const &)*arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameter__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  AttLimits *arg3 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_FitParameter",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FitParameter" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_FitParameter" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameter" "', argument " "3"" of type '" "AttLimits const &""'"); 
+  }
+  arg3 = reinterpret_cast< AttLimits * >(argp3);
+  result = (FitParameter *)new FitParameter((std::string const &)*arg1,arg2,(AttLimits const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameter__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  double arg2 ;
+  int res1 = SWIG_OLDOBJ ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_FitParameter",&obj0,&obj1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_FitParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_FitParameter" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_FitParameter" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FitParameter *)new FitParameter((std::string const &)*arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_FitParameter(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 4) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new_FitParameter__SWIG_0(self, args);
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_FitParameter__SWIG_3(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_AttLimits, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_FitParameter__SWIG_2(self, args);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_AttLimits, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_new_FitParameter__SWIG_1(self, args);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_FitParameter'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameter::FitParameter()\n"
+    "    FitParameter::FitParameter(std::string const &,double,AttLimits const &,double)\n"
+    "    FitParameter::FitParameter(std::string const &,double,AttLimits const &)\n"
+    "    FitParameter::FitParameter(std::string const &,double)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitParameter",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitParameter" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_clone",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_clone" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (FitParameter *)((FitParameter const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_name",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_name" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = ((FitParameter const *)arg1)->name();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_startValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_startValue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_startValue" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (double)((FitParameter const *)arg1)->startValue();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_value",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_value" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (double)((FitParameter const *)arg1)->value();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameter_setValue",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setValue" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameter_setValue" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setValue(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_step(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_step",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_step" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (double)((FitParameter const *)arg1)->step();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setStep(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameter_setStep",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setStep" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameter_setStep" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FitParameter *) &(arg1)->setStep(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_error(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_error",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_error" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (double)((FitParameter const *)arg1)->error();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameter_setError",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setError" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameter_setError" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  (arg1)->setError(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_limits__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  AttLimits *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_limits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_limits" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (AttLimits *) &((FitParameter const *)arg1)->limits();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AttLimits, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_limits__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  AttLimits *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_limits",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_limits" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (AttLimits *) &(arg1)->limits();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AttLimits, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_limits(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameter, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitParameter_limits__SWIG_1(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameter, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitParameter_limits__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitParameter_limits'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameter::limits() const\n"
+    "    FitParameter::limits()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setLimits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  AttLimits *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameter_setLimits",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setLimits" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_AttLimits,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameter_setLimits" "', argument " "2"" of type '" "AttLimits const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameter_setLimits" "', argument " "2"" of type '" "AttLimits const &""'"); 
+  }
+  arg2 = reinterpret_cast< AttLimits * >(argp2);
+  result = (FitParameter *) &(arg1)->setLimits((AttLimits const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setLowerLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameter_setLowerLimited",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setLowerLimited" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameter_setLowerLimited" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FitParameter *) &(arg1)->setLowerLimited(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setPositive(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_setPositive",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setPositive" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (FitParameter *) &(arg1)->setPositive();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setNonnegative(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_setNonnegative",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setNonnegative" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (FitParameter *) &(arg1)->setNonnegative();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setUpperLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameter_setUpperLimited",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setUpperLimited" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameter_setUpperLimited" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (FitParameter *) &(arg1)->setUpperLimited(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setLimited(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  double arg2 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitParameter_setLimited",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setLimited" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameter_setLimited" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitParameter_setLimited" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (FitParameter *) &(arg1)->setLimited(arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_setFixed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_setFixed",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_setFixed" "', argument " "1"" of type '" "FitParameter *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = (FitParameter *) &(arg1)->setFixed();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameter_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameter *arg1 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameter_toString",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameter_toString" "', argument " "1"" of type '" "FitParameter const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameter * >(argp1);
+  result = ((FitParameter const *)arg1)->toString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *FitParameter_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitParameter, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_FitParameterSet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_FitParameterSet")) SWIG_fail;
+  result = (FitParameterSet *)new FitParameterSet();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameterSet, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_FitParameterSet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_FitParameterSet",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_FitParameterSet" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_clear",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_clear" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_size",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_size" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_begin__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< FitParameter *,std::allocator< FitParameter * > >::iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_begin" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj((new FitParameterSet::iterator(static_cast< const FitParameterSet::iterator& >(result))), SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_begin__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< FitParameter *,std::allocator< FitParameter * > >::const_iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_begin",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_begin" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->begin();
+  resultobj = SWIG_NewPointerObj((new FitParameterSet::const_iterator(static_cast< const FitParameterSet::const_iterator& >(result))), SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_begin(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitParameterSet_begin__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitParameterSet_begin__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitParameterSet_begin'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameterSet::begin()\n"
+    "    FitParameterSet::begin() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_end__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< FitParameter *,std::allocator< FitParameter * > >::iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_end" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj((new FitParameterSet::iterator(static_cast< const FitParameterSet::iterator& >(result))), SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_end__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  SwigValueWrapper< std::vector< FitParameter *,std::allocator< FitParameter * > >::const_iterator > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_end",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_end" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->end();
+  resultobj = SWIG_NewPointerObj((new FitParameterSet::const_iterator(static_cast< const FitParameterSet::const_iterator& >(result))), SWIGTYPE_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_end(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitParameterSet_end__SWIG_0(self, args);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_FitParameterSet_end__SWIG_1(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitParameterSet_end'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameterSet::end()\n"
+    "    FitParameterSet::end() const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_addFitParameter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  FitParameter *arg2 = (FitParameter *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_addFitParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_addFitParameter" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_addFitParameter" "', argument " "2"" of type '" "FitParameter *""'"); 
+  }
+  arg2 = reinterpret_cast< FitParameter * >(argp2);
+  (arg1)->addFitParameter(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_fitParameter__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_fitParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_fitParameter" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_fitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_fitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (FitParameter *)((FitParameterSet const *)arg1)->fitParameter((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_fitParameter__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_fitParameter",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_fitParameter" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_fitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_fitParameter" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (FitParameter *)(arg1)->fitParameter((std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_fitParameter(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FitParameterSet_fitParameter__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FitParameterSet_fitParameter__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitParameterSet_fitParameter'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameterSet::fitParameter(std::string const &) const\n"
+    "    FitParameterSet::fitParameter(std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_values(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_values",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_values" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->values();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_setValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_setValues",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_setValues" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_setValues" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_setValues" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setValues((std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_valuesDifferFrom__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitParameterSet_valuesDifferFrom",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_valuesDifferFrom" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_valuesDifferFrom" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_valuesDifferFrom" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitParameterSet_valuesDifferFrom" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  result = (bool)((FitParameterSet const *)arg1)->valuesDifferFrom((std::vector< double,std::allocator< double > > const &)*arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_valuesDifferFrom__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_valuesDifferFrom",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_valuesDifferFrom" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_valuesDifferFrom" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_valuesDifferFrom" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (bool)((FitParameterSet const *)arg1)->valuesDifferFrom((std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_valuesDifferFrom(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FitParameterSet_valuesDifferFrom__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_FitParameterSet_valuesDifferFrom__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitParameterSet_valuesDifferFrom'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameterSet::valuesDifferFrom(std::vector< double,std::allocator< double > > const &,double) const\n"
+    "    FitParameterSet::valuesDifferFrom(std::vector< double,std::allocator< double > > const &) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_errors(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::vector< double,std::allocator< double > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_errors",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_errors" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->errors();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_setErrors(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_setErrors",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_setErrors" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_setErrors" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_setErrors" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setErrors((std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_freeFitParameterCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_freeFitParameterCount",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_freeFitParameterCount" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->freeFitParameterCount();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_fixAll(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_fixAll",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_fixAll" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  (arg1)->fixAll();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_releaseAll(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_releaseAll",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_releaseAll" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  (arg1)->releaseAll();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_setFixed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::vector< std::string,std::allocator< std::string > > *arg2 = 0 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  bool val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:FitParameterSet_setFixed",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_setFixed" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_setFixed" "', argument " "2"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_setFixed" "', argument " "2"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_bool(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "FitParameterSet_setFixed" "', argument " "3"" of type '" "bool""'");
+  } 
+  arg3 = static_cast< bool >(val3);
+  (arg1)->setFixed((std::vector< std::string,std::allocator< std::string > > const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_parametersToString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_parametersToString",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_parametersToString" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->parametersToString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_reportResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_reportResults",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_reportResults" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->reportResults();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_correlationMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  FitParameterSet::corr_matrix_t result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:FitParameterSet_correlationMatrix",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_correlationMatrix" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  result = ((FitParameterSet const *)arg1)->correlationMatrix();
+  resultobj = swig::from(static_cast< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_setCorrelationMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  FitParameterSet::corr_matrix_t *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_setCorrelationMatrix",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_setCorrelationMatrix" "', argument " "1"" of type '" "FitParameterSet *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res2 = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_setCorrelationMatrix" "', argument " "2"" of type '" "FitParameterSet::corr_matrix_t const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_setCorrelationMatrix" "', argument " "2"" of type '" "FitParameterSet::corr_matrix_t const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->setCorrelationMatrix((FitParameterSet::corr_matrix_t const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet_isExistingName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet_isExistingName",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet_isExistingName" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "FitParameterSet_isExistingName" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "FitParameterSet_isExistingName" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (bool)((FitParameterSet const *)arg1)->isExistingName((std::string const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  std::string arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet___getitem__" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    int res = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "FitParameterSet___getitem__" "', argument " "2"" of type '" "std::string""'"); 
+    }
+    arg2 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (FitParameter *)FitParameterSet___getitem____SWIG_0((FitParameterSet const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  FitParameterSet *arg1 = (FitParameterSet *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  FitParameter *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:FitParameterSet___getitem__",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FitParameterSet, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "FitParameterSet___getitem__" "', argument " "1"" of type '" "FitParameterSet const *""'"); 
+  }
+  arg1 = reinterpret_cast< FitParameterSet * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "FitParameterSet___getitem__" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (FitParameter *)FitParameterSet___getitem____SWIG_1((FitParameterSet const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FitParameter, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_FitParameterSet___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_FitParameterSet___getitem____SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_FitParameterSet, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_FitParameterSet___getitem____SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'FitParameterSet___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    FitParameterSet::__getitem__(std::string) const\n"
+    "    FitParameterSet::__getitem__(size_t) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *FitParameterSet_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_FitParameterSet, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_MinimizerCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_MinimizerCatalogue")) SWIG_fail;
+  result = (MinimizerCatalogue *)new MinimizerCatalogue();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalogue, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_toString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerCatalogue_toString",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_toString" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  result = ((MinimizerCatalogue const *)arg1)->toString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_algorithmNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerCatalogue_algorithmNames",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_algorithmNames" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = ((MinimizerCatalogue const *)arg1)->algorithmNames((std::string const &)*arg2);
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerCatalogue_algorithmDescriptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerCatalogue_algorithmDescriptions",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "1"" of type '" "MinimizerCatalogue const *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerCatalogue_algorithmDescriptions" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = ((MinimizerCatalogue const *)arg1)->algorithmDescriptions((std::string const &)*arg2);
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_MinimizerCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *arg1 = (MinimizerCatalogue *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_MinimizerCatalogue",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerCatalogue, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerCatalogue" "', argument " "1"" of type '" "MinimizerCatalogue *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerCatalogue * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MinimizerCatalogue_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerCatalogue, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  std::string *arg2 = 0 ;
+  std::string *arg3 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  int res2 = SWIG_OLDOBJ ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  IMinimizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:MinimizerFactory_createMinimizer",&obj0,&obj1,&obj2)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(obj2, &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "3"" of type '" "std::string const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  std::string *arg2 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
+  IMinimizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:MinimizerFactory_createMinimizer",&obj0,&obj1)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(obj1, &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1,(std::string const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  PyObject * obj0 = 0 ;
+  IMinimizer *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:MinimizerFactory_createMinimizer",&obj0)) SWIG_fail;
+  {
+    std::string *ptr = (std::string *)0;
+    res1 = SWIG_AsPtr_std_string(obj0, &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MinimizerFactory_createMinimizer" "', argument " "1"" of type '" "std::string const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (IMinimizer *)MinimizerFactory::createMinimizer((std::string const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IMinimizer, 0 |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_createMinimizer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  Py_ssize_t ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_MinimizerFactory_createMinimizer__SWIG_2(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_MinimizerFactory_createMinimizer__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_MinimizerFactory_createMinimizer__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'MinimizerFactory_createMinimizer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &,std::string const &)\n"
+    "    MinimizerFactory::createMinimizer(std::string const &,std::string const &)\n"
+    "    MinimizerFactory::createMinimizer(std::string const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_printCatalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  
+  if (!PyArg_ParseTuple(args,(char *)":MinimizerFactory_printCatalogue")) SWIG_fail;
+  MinimizerFactory::printCatalogue();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogueToString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::string result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":MinimizerFactory_catalogueToString")) SWIG_fail;
+  result = MinimizerFactory::catalogueToString();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_MinimizerFactory_catalogue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerCatalogue *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":MinimizerFactory_catalogue")) SWIG_fail;
+  result = (MinimizerCatalogue *) &MinimizerFactory::catalogue();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerCatalogue, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerFactory *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_MinimizerFactory")) SWIG_fail;
+  result = (MinimizerFactory *)new MinimizerFactory();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_MinimizerFactory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  MinimizerFactory *arg1 = (MinimizerFactory *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_MinimizerFactory",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MinimizerFactory, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MinimizerFactory" "', argument " "1"" of type '" "MinimizerFactory *""'"); 
+  }
+  arg1 = reinterpret_cast< MinimizerFactory * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *MinimizerFactory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_MinimizerFactory, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+static PyMethodDef SwigMethods[] = {
+	 { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL},
+	 { (char *)"delete_SwigPyIterator", _wrap_delete_SwigPyIterator, METH_VARARGS, (char *)"delete_SwigPyIterator(SwigPyIterator self)"},
+	 { (char *)"SwigPyIterator_value", _wrap_SwigPyIterator_value, METH_VARARGS, (char *)"SwigPyIterator_value(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator_incr", _wrap_SwigPyIterator_incr, METH_VARARGS, (char *)"\n"
+		"incr(size_t n=1) -> SwigPyIterator\n"
+		"SwigPyIterator_incr(SwigPyIterator self) -> SwigPyIterator\n"
+		""},
+	 { (char *)"SwigPyIterator_decr", _wrap_SwigPyIterator_decr, METH_VARARGS, (char *)"\n"
+		"decr(size_t n=1) -> SwigPyIterator\n"
+		"SwigPyIterator_decr(SwigPyIterator self) -> SwigPyIterator\n"
+		""},
+	 { (char *)"SwigPyIterator_distance", _wrap_SwigPyIterator_distance, METH_VARARGS, (char *)"SwigPyIterator_distance(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t"},
+	 { (char *)"SwigPyIterator_equal", _wrap_SwigPyIterator_equal, METH_VARARGS, (char *)"SwigPyIterator_equal(SwigPyIterator self, SwigPyIterator x) -> bool"},
+	 { (char *)"SwigPyIterator_copy", _wrap_SwigPyIterator_copy, METH_VARARGS, (char *)"SwigPyIterator_copy(SwigPyIterator self) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator_next", _wrap_SwigPyIterator_next, METH_VARARGS, (char *)"SwigPyIterator_next(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator___next__", _wrap_SwigPyIterator___next__, METH_VARARGS, (char *)"SwigPyIterator___next__(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator_previous", _wrap_SwigPyIterator_previous, METH_VARARGS, (char *)"SwigPyIterator_previous(SwigPyIterator self) -> PyObject *"},
+	 { (char *)"SwigPyIterator_advance", _wrap_SwigPyIterator_advance, METH_VARARGS, (char *)"SwigPyIterator_advance(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___eq__", _wrap_SwigPyIterator___eq__, METH_VARARGS, (char *)"SwigPyIterator___eq__(SwigPyIterator self, SwigPyIterator x) -> bool"},
+	 { (char *)"SwigPyIterator___ne__", _wrap_SwigPyIterator___ne__, METH_VARARGS, (char *)"SwigPyIterator___ne__(SwigPyIterator self, SwigPyIterator x) -> bool"},
+	 { (char *)"SwigPyIterator___iadd__", _wrap_SwigPyIterator___iadd__, METH_VARARGS, (char *)"SwigPyIterator___iadd__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___isub__", _wrap_SwigPyIterator___isub__, METH_VARARGS, (char *)"SwigPyIterator___isub__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___add__", _wrap_SwigPyIterator___add__, METH_VARARGS, (char *)"SwigPyIterator___add__(SwigPyIterator self, ptrdiff_t n) -> SwigPyIterator"},
+	 { (char *)"SwigPyIterator___sub__", _wrap_SwigPyIterator___sub__, METH_VARARGS, (char *)"\n"
+		"__sub__(ptrdiff_t n) -> SwigPyIterator\n"
+		"SwigPyIterator___sub__(SwigPyIterator self, SwigPyIterator x) -> ptrdiff_t\n"
+		""},
+	 { (char *)"SwigPyIterator_swigregister", SwigPyIterator_swigregister, METH_VARARGS, NULL},
+	 { (char *)"SHARED_PTR_DISOWN_swigconstant", SHARED_PTR_DISOWN_swigconstant, METH_VARARGS, NULL},
+	 { (char *)"vdouble1d_t_iterator", _wrap_vdouble1d_t_iterator, METH_VARARGS, (char *)"vdouble1d_t_iterator(vdouble1d_t self) -> SwigPyIterator"},
+	 { (char *)"vdouble1d_t___nonzero__", _wrap_vdouble1d_t___nonzero__, METH_VARARGS, (char *)"vdouble1d_t___nonzero__(vdouble1d_t self) -> bool"},
+	 { (char *)"vdouble1d_t___bool__", _wrap_vdouble1d_t___bool__, METH_VARARGS, (char *)"vdouble1d_t___bool__(vdouble1d_t self) -> bool"},
+	 { (char *)"vdouble1d_t___len__", _wrap_vdouble1d_t___len__, METH_VARARGS, (char *)"vdouble1d_t___len__(vdouble1d_t self) -> std::vector< double >::size_type"},
+	 { (char *)"vdouble1d_t___getslice__", _wrap_vdouble1d_t___getslice__, METH_VARARGS, (char *)"vdouble1d_t___getslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j) -> vdouble1d_t"},
+	 { (char *)"vdouble1d_t___setslice__", _wrap_vdouble1d_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< double >::difference_type i, std::vector< double >::difference_type j)\n"
+		"vdouble1d_t___setslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j, vdouble1d_t v)\n"
+		""},
+	 { (char *)"vdouble1d_t___delslice__", _wrap_vdouble1d_t___delslice__, METH_VARARGS, (char *)"vdouble1d_t___delslice__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::difference_type j)"},
+	 { (char *)"vdouble1d_t___delitem__", _wrap_vdouble1d_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< double >::difference_type i)\n"
+		"vdouble1d_t___delitem__(vdouble1d_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vdouble1d_t___getitem__", _wrap_vdouble1d_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vdouble1d_t\n"
+		"vdouble1d_t___getitem__(vdouble1d_t self, std::vector< double >::difference_type i) -> std::vector< double >::value_type const &\n"
+		""},
+	 { (char *)"vdouble1d_t___setitem__", _wrap_vdouble1d_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vdouble1d_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vdouble1d_t___setitem__(vdouble1d_t self, std::vector< double >::difference_type i, std::vector< double >::value_type const & x)\n"
+		""},
+	 { (char *)"vdouble1d_t_pop", _wrap_vdouble1d_t_pop, METH_VARARGS, (char *)"vdouble1d_t_pop(vdouble1d_t self) -> std::vector< double >::value_type"},
+	 { (char *)"vdouble1d_t_append", _wrap_vdouble1d_t_append, METH_VARARGS, (char *)"vdouble1d_t_append(vdouble1d_t self, std::vector< double >::value_type const & x)"},
+	 { (char *)"vdouble1d_t_empty", _wrap_vdouble1d_t_empty, METH_VARARGS, (char *)"vdouble1d_t_empty(vdouble1d_t self) -> bool"},
+	 { (char *)"vdouble1d_t_size", _wrap_vdouble1d_t_size, METH_VARARGS, (char *)"vdouble1d_t_size(vdouble1d_t self) -> std::vector< double >::size_type"},
+	 { (char *)"vdouble1d_t_swap", _wrap_vdouble1d_t_swap, METH_VARARGS, (char *)"vdouble1d_t_swap(vdouble1d_t self, vdouble1d_t v)"},
+	 { (char *)"vdouble1d_t_begin", _wrap_vdouble1d_t_begin, METH_VARARGS, (char *)"vdouble1d_t_begin(vdouble1d_t self) -> std::vector< double >::iterator"},
+	 { (char *)"vdouble1d_t_end", _wrap_vdouble1d_t_end, METH_VARARGS, (char *)"vdouble1d_t_end(vdouble1d_t self) -> std::vector< double >::iterator"},
+	 { (char *)"vdouble1d_t_rbegin", _wrap_vdouble1d_t_rbegin, METH_VARARGS, (char *)"vdouble1d_t_rbegin(vdouble1d_t self) -> std::vector< double >::reverse_iterator"},
+	 { (char *)"vdouble1d_t_rend", _wrap_vdouble1d_t_rend, METH_VARARGS, (char *)"vdouble1d_t_rend(vdouble1d_t self) -> std::vector< double >::reverse_iterator"},
+	 { (char *)"vdouble1d_t_clear", _wrap_vdouble1d_t_clear, METH_VARARGS, (char *)"vdouble1d_t_clear(vdouble1d_t self)"},
+	 { (char *)"vdouble1d_t_get_allocator", _wrap_vdouble1d_t_get_allocator, METH_VARARGS, (char *)"vdouble1d_t_get_allocator(vdouble1d_t self) -> std::vector< double >::allocator_type"},
+	 { (char *)"vdouble1d_t_pop_back", _wrap_vdouble1d_t_pop_back, METH_VARARGS, (char *)"vdouble1d_t_pop_back(vdouble1d_t self)"},
+	 { (char *)"vdouble1d_t_erase", _wrap_vdouble1d_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< double >::iterator pos) -> std::vector< double >::iterator\n"
+		"vdouble1d_t_erase(vdouble1d_t self, std::vector< double >::iterator first, std::vector< double >::iterator last) -> std::vector< double >::iterator\n"
+		""},
+	 { (char *)"new_vdouble1d_t", _wrap_new_vdouble1d_t, METH_VARARGS, (char *)"\n"
+		"vdouble1d_t()\n"
+		"vdouble1d_t(vdouble1d_t arg2)\n"
+		"vdouble1d_t(std::vector< double >::size_type size)\n"
+		"new_vdouble1d_t(std::vector< double >::size_type size, std::vector< double >::value_type const & value) -> vdouble1d_t\n"
+		""},
+	 { (char *)"vdouble1d_t_push_back", _wrap_vdouble1d_t_push_back, METH_VARARGS, (char *)"vdouble1d_t_push_back(vdouble1d_t self, std::vector< double >::value_type const & x)"},
+	 { (char *)"vdouble1d_t_front", _wrap_vdouble1d_t_front, METH_VARARGS, (char *)"vdouble1d_t_front(vdouble1d_t self) -> std::vector< double >::value_type const &"},
+	 { (char *)"vdouble1d_t_back", _wrap_vdouble1d_t_back, METH_VARARGS, (char *)"vdouble1d_t_back(vdouble1d_t self) -> std::vector< double >::value_type const &"},
+	 { (char *)"vdouble1d_t_assign", _wrap_vdouble1d_t_assign, METH_VARARGS, (char *)"vdouble1d_t_assign(vdouble1d_t self, std::vector< double >::size_type n, std::vector< double >::value_type const & x)"},
+	 { (char *)"vdouble1d_t_resize", _wrap_vdouble1d_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< double >::size_type new_size)\n"
+		"vdouble1d_t_resize(vdouble1d_t self, std::vector< double >::size_type new_size, std::vector< double >::value_type const & x)\n"
+		""},
+	 { (char *)"vdouble1d_t_insert", _wrap_vdouble1d_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< double >::iterator pos, std::vector< double >::value_type const & x) -> std::vector< double >::iterator\n"
+		"vdouble1d_t_insert(vdouble1d_t self, std::vector< double >::iterator pos, std::vector< double >::size_type n, std::vector< double >::value_type const & x)\n"
+		""},
+	 { (char *)"vdouble1d_t_reserve", _wrap_vdouble1d_t_reserve, METH_VARARGS, (char *)"vdouble1d_t_reserve(vdouble1d_t self, std::vector< double >::size_type n)"},
+	 { (char *)"vdouble1d_t_capacity", _wrap_vdouble1d_t_capacity, METH_VARARGS, (char *)"vdouble1d_t_capacity(vdouble1d_t self) -> std::vector< double >::size_type"},
+	 { (char *)"delete_vdouble1d_t", _wrap_delete_vdouble1d_t, METH_VARARGS, (char *)"delete_vdouble1d_t(vdouble1d_t self)"},
+	 { (char *)"vdouble1d_t_swigregister", vdouble1d_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vdouble2d_t_iterator", _wrap_vdouble2d_t_iterator, METH_VARARGS, (char *)"vdouble2d_t_iterator(vdouble2d_t self) -> SwigPyIterator"},
+	 { (char *)"vdouble2d_t___nonzero__", _wrap_vdouble2d_t___nonzero__, METH_VARARGS, (char *)"vdouble2d_t___nonzero__(vdouble2d_t self) -> bool"},
+	 { (char *)"vdouble2d_t___bool__", _wrap_vdouble2d_t___bool__, METH_VARARGS, (char *)"vdouble2d_t___bool__(vdouble2d_t self) -> bool"},
+	 { (char *)"vdouble2d_t___len__", _wrap_vdouble2d_t___len__, METH_VARARGS, (char *)"vdouble2d_t___len__(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"},
+	 { (char *)"vdouble2d_t___getslice__", _wrap_vdouble2d_t___getslice__, METH_VARARGS, (char *)"vdouble2d_t___getslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j) -> vdouble2d_t"},
+	 { (char *)"vdouble2d_t___setslice__", _wrap_vdouble2d_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)\n"
+		"vdouble2d_t___setslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j, vdouble2d_t v)\n"
+		""},
+	 { (char *)"vdouble2d_t___delslice__", _wrap_vdouble2d_t___delslice__, METH_VARARGS, (char *)"vdouble2d_t___delslice__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type j)"},
+	 { (char *)"vdouble2d_t___delitem__", _wrap_vdouble2d_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< std::vector< double > >::difference_type i)\n"
+		"vdouble2d_t___delitem__(vdouble2d_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vdouble2d_t___getitem__", _wrap_vdouble2d_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vdouble2d_t\n"
+		"vdouble2d_t___getitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i) -> vdouble1d_t\n"
+		""},
+	 { (char *)"vdouble2d_t___setitem__", _wrap_vdouble2d_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vdouble2d_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vdouble2d_t___setitem__(vdouble2d_t self, std::vector< std::vector< double > >::difference_type i, vdouble1d_t x)\n"
+		""},
+	 { (char *)"vdouble2d_t_pop", _wrap_vdouble2d_t_pop, METH_VARARGS, (char *)"vdouble2d_t_pop(vdouble2d_t self) -> vdouble1d_t"},
+	 { (char *)"vdouble2d_t_append", _wrap_vdouble2d_t_append, METH_VARARGS, (char *)"vdouble2d_t_append(vdouble2d_t self, vdouble1d_t x)"},
+	 { (char *)"vdouble2d_t_empty", _wrap_vdouble2d_t_empty, METH_VARARGS, (char *)"vdouble2d_t_empty(vdouble2d_t self) -> bool"},
+	 { (char *)"vdouble2d_t_size", _wrap_vdouble2d_t_size, METH_VARARGS, (char *)"vdouble2d_t_size(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"},
+	 { (char *)"vdouble2d_t_swap", _wrap_vdouble2d_t_swap, METH_VARARGS, (char *)"vdouble2d_t_swap(vdouble2d_t self, vdouble2d_t v)"},
+	 { (char *)"vdouble2d_t_begin", _wrap_vdouble2d_t_begin, METH_VARARGS, (char *)"vdouble2d_t_begin(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"},
+	 { (char *)"vdouble2d_t_end", _wrap_vdouble2d_t_end, METH_VARARGS, (char *)"vdouble2d_t_end(vdouble2d_t self) -> std::vector< std::vector< double > >::iterator"},
+	 { (char *)"vdouble2d_t_rbegin", _wrap_vdouble2d_t_rbegin, METH_VARARGS, (char *)"vdouble2d_t_rbegin(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"},
+	 { (char *)"vdouble2d_t_rend", _wrap_vdouble2d_t_rend, METH_VARARGS, (char *)"vdouble2d_t_rend(vdouble2d_t self) -> std::vector< std::vector< double > >::reverse_iterator"},
+	 { (char *)"vdouble2d_t_clear", _wrap_vdouble2d_t_clear, METH_VARARGS, (char *)"vdouble2d_t_clear(vdouble2d_t self)"},
+	 { (char *)"vdouble2d_t_get_allocator", _wrap_vdouble2d_t_get_allocator, METH_VARARGS, (char *)"vdouble2d_t_get_allocator(vdouble2d_t self) -> std::vector< std::vector< double > >::allocator_type"},
+	 { (char *)"vdouble2d_t_pop_back", _wrap_vdouble2d_t_pop_back, METH_VARARGS, (char *)"vdouble2d_t_pop_back(vdouble2d_t self)"},
+	 { (char *)"vdouble2d_t_erase", _wrap_vdouble2d_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< std::vector< double > >::iterator pos) -> std::vector< std::vector< double > >::iterator\n"
+		"vdouble2d_t_erase(vdouble2d_t self, std::vector< std::vector< double > >::iterator first, std::vector< std::vector< double > >::iterator last) -> std::vector< std::vector< double > >::iterator\n"
+		""},
+	 { (char *)"new_vdouble2d_t", _wrap_new_vdouble2d_t, METH_VARARGS, (char *)"\n"
+		"vdouble2d_t()\n"
+		"vdouble2d_t(vdouble2d_t arg2)\n"
+		"vdouble2d_t(std::vector< std::vector< double > >::size_type size)\n"
+		"new_vdouble2d_t(std::vector< std::vector< double > >::size_type size, vdouble1d_t value) -> vdouble2d_t\n"
+		""},
+	 { (char *)"vdouble2d_t_push_back", _wrap_vdouble2d_t_push_back, METH_VARARGS, (char *)"vdouble2d_t_push_back(vdouble2d_t self, vdouble1d_t x)"},
+	 { (char *)"vdouble2d_t_front", _wrap_vdouble2d_t_front, METH_VARARGS, (char *)"vdouble2d_t_front(vdouble2d_t self) -> vdouble1d_t"},
+	 { (char *)"vdouble2d_t_back", _wrap_vdouble2d_t_back, METH_VARARGS, (char *)"vdouble2d_t_back(vdouble2d_t self) -> vdouble1d_t"},
+	 { (char *)"vdouble2d_t_assign", _wrap_vdouble2d_t_assign, METH_VARARGS, (char *)"vdouble2d_t_assign(vdouble2d_t self, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)"},
+	 { (char *)"vdouble2d_t_resize", _wrap_vdouble2d_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< std::vector< double > >::size_type new_size)\n"
+		"vdouble2d_t_resize(vdouble2d_t self, std::vector< std::vector< double > >::size_type new_size, vdouble1d_t x)\n"
+		""},
+	 { (char *)"vdouble2d_t_insert", _wrap_vdouble2d_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< std::vector< double > >::iterator pos, vdouble1d_t x) -> std::vector< std::vector< double > >::iterator\n"
+		"vdouble2d_t_insert(vdouble2d_t self, std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::size_type n, vdouble1d_t x)\n"
+		""},
+	 { (char *)"vdouble2d_t_reserve", _wrap_vdouble2d_t_reserve, METH_VARARGS, (char *)"vdouble2d_t_reserve(vdouble2d_t self, std::vector< std::vector< double > >::size_type n)"},
+	 { (char *)"vdouble2d_t_capacity", _wrap_vdouble2d_t_capacity, METH_VARARGS, (char *)"vdouble2d_t_capacity(vdouble2d_t self) -> std::vector< std::vector< double > >::size_type"},
+	 { (char *)"delete_vdouble2d_t", _wrap_delete_vdouble2d_t, METH_VARARGS, (char *)"delete_vdouble2d_t(vdouble2d_t self)"},
+	 { (char *)"vdouble2d_t_swigregister", vdouble2d_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_integer_t_iterator", _wrap_vector_integer_t_iterator, METH_VARARGS, (char *)"vector_integer_t_iterator(vector_integer_t self) -> SwigPyIterator"},
+	 { (char *)"vector_integer_t___nonzero__", _wrap_vector_integer_t___nonzero__, METH_VARARGS, (char *)"vector_integer_t___nonzero__(vector_integer_t self) -> bool"},
+	 { (char *)"vector_integer_t___bool__", _wrap_vector_integer_t___bool__, METH_VARARGS, (char *)"vector_integer_t___bool__(vector_integer_t self) -> bool"},
+	 { (char *)"vector_integer_t___len__", _wrap_vector_integer_t___len__, METH_VARARGS, (char *)"vector_integer_t___len__(vector_integer_t self) -> std::vector< int >::size_type"},
+	 { (char *)"vector_integer_t___getslice__", _wrap_vector_integer_t___getslice__, METH_VARARGS, (char *)"vector_integer_t___getslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j) -> vector_integer_t"},
+	 { (char *)"vector_integer_t___setslice__", _wrap_vector_integer_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< int >::difference_type i, std::vector< int >::difference_type j)\n"
+		"vector_integer_t___setslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j, vector_integer_t v)\n"
+		""},
+	 { (char *)"vector_integer_t___delslice__", _wrap_vector_integer_t___delslice__, METH_VARARGS, (char *)"vector_integer_t___delslice__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::difference_type j)"},
+	 { (char *)"vector_integer_t___delitem__", _wrap_vector_integer_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< int >::difference_type i)\n"
+		"vector_integer_t___delitem__(vector_integer_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_integer_t___getitem__", _wrap_vector_integer_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_integer_t\n"
+		"vector_integer_t___getitem__(vector_integer_t self, std::vector< int >::difference_type i) -> std::vector< int >::value_type const &\n"
+		""},
+	 { (char *)"vector_integer_t___setitem__", _wrap_vector_integer_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_integer_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_integer_t___setitem__(vector_integer_t self, std::vector< int >::difference_type i, std::vector< int >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_integer_t_pop", _wrap_vector_integer_t_pop, METH_VARARGS, (char *)"vector_integer_t_pop(vector_integer_t self) -> std::vector< int >::value_type"},
+	 { (char *)"vector_integer_t_append", _wrap_vector_integer_t_append, METH_VARARGS, (char *)"vector_integer_t_append(vector_integer_t self, std::vector< int >::value_type const & x)"},
+	 { (char *)"vector_integer_t_empty", _wrap_vector_integer_t_empty, METH_VARARGS, (char *)"vector_integer_t_empty(vector_integer_t self) -> bool"},
+	 { (char *)"vector_integer_t_size", _wrap_vector_integer_t_size, METH_VARARGS, (char *)"vector_integer_t_size(vector_integer_t self) -> std::vector< int >::size_type"},
+	 { (char *)"vector_integer_t_swap", _wrap_vector_integer_t_swap, METH_VARARGS, (char *)"vector_integer_t_swap(vector_integer_t self, vector_integer_t v)"},
+	 { (char *)"vector_integer_t_begin", _wrap_vector_integer_t_begin, METH_VARARGS, (char *)"vector_integer_t_begin(vector_integer_t self) -> std::vector< int >::iterator"},
+	 { (char *)"vector_integer_t_end", _wrap_vector_integer_t_end, METH_VARARGS, (char *)"vector_integer_t_end(vector_integer_t self) -> std::vector< int >::iterator"},
+	 { (char *)"vector_integer_t_rbegin", _wrap_vector_integer_t_rbegin, METH_VARARGS, (char *)"vector_integer_t_rbegin(vector_integer_t self) -> std::vector< int >::reverse_iterator"},
+	 { (char *)"vector_integer_t_rend", _wrap_vector_integer_t_rend, METH_VARARGS, (char *)"vector_integer_t_rend(vector_integer_t self) -> std::vector< int >::reverse_iterator"},
+	 { (char *)"vector_integer_t_clear", _wrap_vector_integer_t_clear, METH_VARARGS, (char *)"vector_integer_t_clear(vector_integer_t self)"},
+	 { (char *)"vector_integer_t_get_allocator", _wrap_vector_integer_t_get_allocator, METH_VARARGS, (char *)"vector_integer_t_get_allocator(vector_integer_t self) -> std::vector< int >::allocator_type"},
+	 { (char *)"vector_integer_t_pop_back", _wrap_vector_integer_t_pop_back, METH_VARARGS, (char *)"vector_integer_t_pop_back(vector_integer_t self)"},
+	 { (char *)"vector_integer_t_erase", _wrap_vector_integer_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< int >::iterator pos) -> std::vector< int >::iterator\n"
+		"vector_integer_t_erase(vector_integer_t self, std::vector< int >::iterator first, std::vector< int >::iterator last) -> std::vector< int >::iterator\n"
+		""},
+	 { (char *)"new_vector_integer_t", _wrap_new_vector_integer_t, METH_VARARGS, (char *)"\n"
+		"vector_integer_t()\n"
+		"vector_integer_t(vector_integer_t arg2)\n"
+		"vector_integer_t(std::vector< int >::size_type size)\n"
+		"new_vector_integer_t(std::vector< int >::size_type size, std::vector< int >::value_type const & value) -> vector_integer_t\n"
+		""},
+	 { (char *)"vector_integer_t_push_back", _wrap_vector_integer_t_push_back, METH_VARARGS, (char *)"vector_integer_t_push_back(vector_integer_t self, std::vector< int >::value_type const & x)"},
+	 { (char *)"vector_integer_t_front", _wrap_vector_integer_t_front, METH_VARARGS, (char *)"vector_integer_t_front(vector_integer_t self) -> std::vector< int >::value_type const &"},
+	 { (char *)"vector_integer_t_back", _wrap_vector_integer_t_back, METH_VARARGS, (char *)"vector_integer_t_back(vector_integer_t self) -> std::vector< int >::value_type const &"},
+	 { (char *)"vector_integer_t_assign", _wrap_vector_integer_t_assign, METH_VARARGS, (char *)"vector_integer_t_assign(vector_integer_t self, std::vector< int >::size_type n, std::vector< int >::value_type const & x)"},
+	 { (char *)"vector_integer_t_resize", _wrap_vector_integer_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< int >::size_type new_size)\n"
+		"vector_integer_t_resize(vector_integer_t self, std::vector< int >::size_type new_size, std::vector< int >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_integer_t_insert", _wrap_vector_integer_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< int >::iterator pos, std::vector< int >::value_type const & x) -> std::vector< int >::iterator\n"
+		"vector_integer_t_insert(vector_integer_t self, std::vector< int >::iterator pos, std::vector< int >::size_type n, std::vector< int >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_integer_t_reserve", _wrap_vector_integer_t_reserve, METH_VARARGS, (char *)"vector_integer_t_reserve(vector_integer_t self, std::vector< int >::size_type n)"},
+	 { (char *)"vector_integer_t_capacity", _wrap_vector_integer_t_capacity, METH_VARARGS, (char *)"vector_integer_t_capacity(vector_integer_t self) -> std::vector< int >::size_type"},
+	 { (char *)"delete_vector_integer_t", _wrap_delete_vector_integer_t, METH_VARARGS, (char *)"delete_vector_integer_t(vector_integer_t self)"},
+	 { (char *)"vector_integer_t_swigregister", vector_integer_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_longinteger_t_iterator", _wrap_vector_longinteger_t_iterator, METH_VARARGS, (char *)"vector_longinteger_t_iterator(vector_longinteger_t self) -> SwigPyIterator"},
+	 { (char *)"vector_longinteger_t___nonzero__", _wrap_vector_longinteger_t___nonzero__, METH_VARARGS, (char *)"vector_longinteger_t___nonzero__(vector_longinteger_t self) -> bool"},
+	 { (char *)"vector_longinteger_t___bool__", _wrap_vector_longinteger_t___bool__, METH_VARARGS, (char *)"vector_longinteger_t___bool__(vector_longinteger_t self) -> bool"},
+	 { (char *)"vector_longinteger_t___len__", _wrap_vector_longinteger_t___len__, METH_VARARGS, (char *)"vector_longinteger_t___len__(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"},
+	 { (char *)"vector_longinteger_t___getslice__", _wrap_vector_longinteger_t___getslice__, METH_VARARGS, (char *)"vector_longinteger_t___getslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j) -> vector_longinteger_t"},
+	 { (char *)"vector_longinteger_t___setslice__", _wrap_vector_longinteger_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)\n"
+		"vector_longinteger_t___setslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j, vector_longinteger_t v)\n"
+		""},
+	 { (char *)"vector_longinteger_t___delslice__", _wrap_vector_longinteger_t___delslice__, METH_VARARGS, (char *)"vector_longinteger_t___delslice__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::difference_type j)"},
+	 { (char *)"vector_longinteger_t___delitem__", _wrap_vector_longinteger_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< unsigned long >::difference_type i)\n"
+		"vector_longinteger_t___delitem__(vector_longinteger_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_longinteger_t___getitem__", _wrap_vector_longinteger_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_longinteger_t\n"
+		"vector_longinteger_t___getitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i) -> std::vector< unsigned long >::value_type const &\n"
+		""},
+	 { (char *)"vector_longinteger_t___setitem__", _wrap_vector_longinteger_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_longinteger_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_longinteger_t___setitem__(vector_longinteger_t self, std::vector< unsigned long >::difference_type i, std::vector< unsigned long >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_longinteger_t_pop", _wrap_vector_longinteger_t_pop, METH_VARARGS, (char *)"vector_longinteger_t_pop(vector_longinteger_t self) -> std::vector< unsigned long >::value_type"},
+	 { (char *)"vector_longinteger_t_append", _wrap_vector_longinteger_t_append, METH_VARARGS, (char *)"vector_longinteger_t_append(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"},
+	 { (char *)"vector_longinteger_t_empty", _wrap_vector_longinteger_t_empty, METH_VARARGS, (char *)"vector_longinteger_t_empty(vector_longinteger_t self) -> bool"},
+	 { (char *)"vector_longinteger_t_size", _wrap_vector_longinteger_t_size, METH_VARARGS, (char *)"vector_longinteger_t_size(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"},
+	 { (char *)"vector_longinteger_t_swap", _wrap_vector_longinteger_t_swap, METH_VARARGS, (char *)"vector_longinteger_t_swap(vector_longinteger_t self, vector_longinteger_t v)"},
+	 { (char *)"vector_longinteger_t_begin", _wrap_vector_longinteger_t_begin, METH_VARARGS, (char *)"vector_longinteger_t_begin(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"},
+	 { (char *)"vector_longinteger_t_end", _wrap_vector_longinteger_t_end, METH_VARARGS, (char *)"vector_longinteger_t_end(vector_longinteger_t self) -> std::vector< unsigned long >::iterator"},
+	 { (char *)"vector_longinteger_t_rbegin", _wrap_vector_longinteger_t_rbegin, METH_VARARGS, (char *)"vector_longinteger_t_rbegin(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"},
+	 { (char *)"vector_longinteger_t_rend", _wrap_vector_longinteger_t_rend, METH_VARARGS, (char *)"vector_longinteger_t_rend(vector_longinteger_t self) -> std::vector< unsigned long >::reverse_iterator"},
+	 { (char *)"vector_longinteger_t_clear", _wrap_vector_longinteger_t_clear, METH_VARARGS, (char *)"vector_longinteger_t_clear(vector_longinteger_t self)"},
+	 { (char *)"vector_longinteger_t_get_allocator", _wrap_vector_longinteger_t_get_allocator, METH_VARARGS, (char *)"vector_longinteger_t_get_allocator(vector_longinteger_t self) -> std::vector< unsigned long >::allocator_type"},
+	 { (char *)"vector_longinteger_t_pop_back", _wrap_vector_longinteger_t_pop_back, METH_VARARGS, (char *)"vector_longinteger_t_pop_back(vector_longinteger_t self)"},
+	 { (char *)"vector_longinteger_t_erase", _wrap_vector_longinteger_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< unsigned long >::iterator pos) -> std::vector< unsigned long >::iterator\n"
+		"vector_longinteger_t_erase(vector_longinteger_t self, std::vector< unsigned long >::iterator first, std::vector< unsigned long >::iterator last) -> std::vector< unsigned long >::iterator\n"
+		""},
+	 { (char *)"new_vector_longinteger_t", _wrap_new_vector_longinteger_t, METH_VARARGS, (char *)"\n"
+		"vector_longinteger_t()\n"
+		"vector_longinteger_t(vector_longinteger_t arg2)\n"
+		"vector_longinteger_t(std::vector< unsigned long >::size_type size)\n"
+		"new_vector_longinteger_t(std::vector< unsigned long >::size_type size, std::vector< unsigned long >::value_type const & value) -> vector_longinteger_t\n"
+		""},
+	 { (char *)"vector_longinteger_t_push_back", _wrap_vector_longinteger_t_push_back, METH_VARARGS, (char *)"vector_longinteger_t_push_back(vector_longinteger_t self, std::vector< unsigned long >::value_type const & x)"},
+	 { (char *)"vector_longinteger_t_front", _wrap_vector_longinteger_t_front, METH_VARARGS, (char *)"vector_longinteger_t_front(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"},
+	 { (char *)"vector_longinteger_t_back", _wrap_vector_longinteger_t_back, METH_VARARGS, (char *)"vector_longinteger_t_back(vector_longinteger_t self) -> std::vector< unsigned long >::value_type const &"},
+	 { (char *)"vector_longinteger_t_assign", _wrap_vector_longinteger_t_assign, METH_VARARGS, (char *)"vector_longinteger_t_assign(vector_longinteger_t self, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)"},
+	 { (char *)"vector_longinteger_t_resize", _wrap_vector_longinteger_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< unsigned long >::size_type new_size)\n"
+		"vector_longinteger_t_resize(vector_longinteger_t self, std::vector< unsigned long >::size_type new_size, std::vector< unsigned long >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_longinteger_t_insert", _wrap_vector_longinteger_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::value_type const & x) -> std::vector< unsigned long >::iterator\n"
+		"vector_longinteger_t_insert(vector_longinteger_t self, std::vector< unsigned long >::iterator pos, std::vector< unsigned long >::size_type n, std::vector< unsigned long >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_longinteger_t_reserve", _wrap_vector_longinteger_t_reserve, METH_VARARGS, (char *)"vector_longinteger_t_reserve(vector_longinteger_t self, std::vector< unsigned long >::size_type n)"},
+	 { (char *)"vector_longinteger_t_capacity", _wrap_vector_longinteger_t_capacity, METH_VARARGS, (char *)"vector_longinteger_t_capacity(vector_longinteger_t self) -> std::vector< unsigned long >::size_type"},
+	 { (char *)"delete_vector_longinteger_t", _wrap_delete_vector_longinteger_t, METH_VARARGS, (char *)"delete_vector_longinteger_t(vector_longinteger_t self)"},
+	 { (char *)"vector_longinteger_t_swigregister", vector_longinteger_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_complex_t_iterator", _wrap_vector_complex_t_iterator, METH_VARARGS, (char *)"vector_complex_t_iterator(vector_complex_t self) -> SwigPyIterator"},
+	 { (char *)"vector_complex_t___nonzero__", _wrap_vector_complex_t___nonzero__, METH_VARARGS, (char *)"vector_complex_t___nonzero__(vector_complex_t self) -> bool"},
+	 { (char *)"vector_complex_t___bool__", _wrap_vector_complex_t___bool__, METH_VARARGS, (char *)"vector_complex_t___bool__(vector_complex_t self) -> bool"},
+	 { (char *)"vector_complex_t___len__", _wrap_vector_complex_t___len__, METH_VARARGS, (char *)"vector_complex_t___len__(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"},
+	 { (char *)"vector_complex_t___getslice__", _wrap_vector_complex_t___getslice__, METH_VARARGS, (char *)"vector_complex_t___getslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j) -> vector_complex_t"},
+	 { (char *)"vector_complex_t___setslice__", _wrap_vector_complex_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)\n"
+		"vector_complex_t___setslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j, vector_complex_t v)\n"
+		""},
+	 { (char *)"vector_complex_t___delslice__", _wrap_vector_complex_t___delslice__, METH_VARARGS, (char *)"vector_complex_t___delslice__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::difference_type j)"},
+	 { (char *)"vector_complex_t___delitem__", _wrap_vector_complex_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< std::complex< double > >::difference_type i)\n"
+		"vector_complex_t___delitem__(vector_complex_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_complex_t___getitem__", _wrap_vector_complex_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_complex_t\n"
+		"vector_complex_t___getitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i) -> std::vector< std::complex< double > >::value_type const &\n"
+		""},
+	 { (char *)"vector_complex_t___setitem__", _wrap_vector_complex_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_complex_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_complex_t___setitem__(vector_complex_t self, std::vector< std::complex< double > >::difference_type i, std::vector< std::complex< double > >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_complex_t_pop", _wrap_vector_complex_t_pop, METH_VARARGS, (char *)"vector_complex_t_pop(vector_complex_t self) -> std::vector< std::complex< double > >::value_type"},
+	 { (char *)"vector_complex_t_append", _wrap_vector_complex_t_append, METH_VARARGS, (char *)"vector_complex_t_append(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"},
+	 { (char *)"vector_complex_t_empty", _wrap_vector_complex_t_empty, METH_VARARGS, (char *)"vector_complex_t_empty(vector_complex_t self) -> bool"},
+	 { (char *)"vector_complex_t_size", _wrap_vector_complex_t_size, METH_VARARGS, (char *)"vector_complex_t_size(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"},
+	 { (char *)"vector_complex_t_swap", _wrap_vector_complex_t_swap, METH_VARARGS, (char *)"vector_complex_t_swap(vector_complex_t self, vector_complex_t v)"},
+	 { (char *)"vector_complex_t_begin", _wrap_vector_complex_t_begin, METH_VARARGS, (char *)"vector_complex_t_begin(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"},
+	 { (char *)"vector_complex_t_end", _wrap_vector_complex_t_end, METH_VARARGS, (char *)"vector_complex_t_end(vector_complex_t self) -> std::vector< std::complex< double > >::iterator"},
+	 { (char *)"vector_complex_t_rbegin", _wrap_vector_complex_t_rbegin, METH_VARARGS, (char *)"vector_complex_t_rbegin(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"},
+	 { (char *)"vector_complex_t_rend", _wrap_vector_complex_t_rend, METH_VARARGS, (char *)"vector_complex_t_rend(vector_complex_t self) -> std::vector< std::complex< double > >::reverse_iterator"},
+	 { (char *)"vector_complex_t_clear", _wrap_vector_complex_t_clear, METH_VARARGS, (char *)"vector_complex_t_clear(vector_complex_t self)"},
+	 { (char *)"vector_complex_t_get_allocator", _wrap_vector_complex_t_get_allocator, METH_VARARGS, (char *)"vector_complex_t_get_allocator(vector_complex_t self) -> std::vector< std::complex< double > >::allocator_type"},
+	 { (char *)"vector_complex_t_pop_back", _wrap_vector_complex_t_pop_back, METH_VARARGS, (char *)"vector_complex_t_pop_back(vector_complex_t self)"},
+	 { (char *)"vector_complex_t_erase", _wrap_vector_complex_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< std::complex< double > >::iterator pos) -> std::vector< std::complex< double > >::iterator\n"
+		"vector_complex_t_erase(vector_complex_t self, std::vector< std::complex< double > >::iterator first, std::vector< std::complex< double > >::iterator last) -> std::vector< std::complex< double > >::iterator\n"
+		""},
+	 { (char *)"new_vector_complex_t", _wrap_new_vector_complex_t, METH_VARARGS, (char *)"\n"
+		"vector_complex_t()\n"
+		"vector_complex_t(vector_complex_t arg2)\n"
+		"vector_complex_t(std::vector< std::complex< double > >::size_type size)\n"
+		"new_vector_complex_t(std::vector< std::complex< double > >::size_type size, std::vector< std::complex< double > >::value_type const & value) -> vector_complex_t\n"
+		""},
+	 { (char *)"vector_complex_t_push_back", _wrap_vector_complex_t_push_back, METH_VARARGS, (char *)"vector_complex_t_push_back(vector_complex_t self, std::vector< std::complex< double > >::value_type const & x)"},
+	 { (char *)"vector_complex_t_front", _wrap_vector_complex_t_front, METH_VARARGS, (char *)"vector_complex_t_front(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"},
+	 { (char *)"vector_complex_t_back", _wrap_vector_complex_t_back, METH_VARARGS, (char *)"vector_complex_t_back(vector_complex_t self) -> std::vector< std::complex< double > >::value_type const &"},
+	 { (char *)"vector_complex_t_assign", _wrap_vector_complex_t_assign, METH_VARARGS, (char *)"vector_complex_t_assign(vector_complex_t self, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)"},
+	 { (char *)"vector_complex_t_resize", _wrap_vector_complex_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< std::complex< double > >::size_type new_size)\n"
+		"vector_complex_t_resize(vector_complex_t self, std::vector< std::complex< double > >::size_type new_size, std::vector< std::complex< double > >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_complex_t_insert", _wrap_vector_complex_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::value_type const & x) -> std::vector< std::complex< double > >::iterator\n"
+		"vector_complex_t_insert(vector_complex_t self, std::vector< std::complex< double > >::iterator pos, std::vector< std::complex< double > >::size_type n, std::vector< std::complex< double > >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_complex_t_reserve", _wrap_vector_complex_t_reserve, METH_VARARGS, (char *)"vector_complex_t_reserve(vector_complex_t self, std::vector< std::complex< double > >::size_type n)"},
+	 { (char *)"vector_complex_t_capacity", _wrap_vector_complex_t_capacity, METH_VARARGS, (char *)"vector_complex_t_capacity(vector_complex_t self) -> std::vector< std::complex< double > >::size_type"},
+	 { (char *)"delete_vector_complex_t", _wrap_delete_vector_complex_t, METH_VARARGS, (char *)"delete_vector_complex_t(vector_complex_t self)"},
+	 { (char *)"vector_complex_t_swigregister", vector_complex_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"vector_string_t_iterator", _wrap_vector_string_t_iterator, METH_VARARGS, (char *)"vector_string_t_iterator(vector_string_t self) -> SwigPyIterator"},
+	 { (char *)"vector_string_t___nonzero__", _wrap_vector_string_t___nonzero__, METH_VARARGS, (char *)"vector_string_t___nonzero__(vector_string_t self) -> bool"},
+	 { (char *)"vector_string_t___bool__", _wrap_vector_string_t___bool__, METH_VARARGS, (char *)"vector_string_t___bool__(vector_string_t self) -> bool"},
+	 { (char *)"vector_string_t___len__", _wrap_vector_string_t___len__, METH_VARARGS, (char *)"vector_string_t___len__(vector_string_t self) -> std::vector< std::string >::size_type"},
+	 { (char *)"vector_string_t___getslice__", _wrap_vector_string_t___getslice__, METH_VARARGS, (char *)"vector_string_t___getslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j) -> vector_string_t"},
+	 { (char *)"vector_string_t___setslice__", _wrap_vector_string_t___setslice__, METH_VARARGS, (char *)"\n"
+		"__setslice__(std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)\n"
+		"vector_string_t___setslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j, vector_string_t v)\n"
+		""},
+	 { (char *)"vector_string_t___delslice__", _wrap_vector_string_t___delslice__, METH_VARARGS, (char *)"vector_string_t___delslice__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type j)"},
+	 { (char *)"vector_string_t___delitem__", _wrap_vector_string_t___delitem__, METH_VARARGS, (char *)"\n"
+		"__delitem__(std::vector< std::string >::difference_type i)\n"
+		"vector_string_t___delitem__(vector_string_t self, PySliceObject * slice)\n"
+		""},
+	 { (char *)"vector_string_t___getitem__", _wrap_vector_string_t___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(PySliceObject * slice) -> vector_string_t\n"
+		"vector_string_t___getitem__(vector_string_t self, std::vector< std::string >::difference_type i) -> std::vector< std::string >::value_type const &\n"
+		""},
+	 { (char *)"vector_string_t___setitem__", _wrap_vector_string_t___setitem__, METH_VARARGS, (char *)"\n"
+		"__setitem__(PySliceObject * slice, vector_string_t v)\n"
+		"__setitem__(PySliceObject * slice)\n"
+		"vector_string_t___setitem__(vector_string_t self, std::vector< std::string >::difference_type i, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_pop", _wrap_vector_string_t_pop, METH_VARARGS, (char *)"vector_string_t_pop(vector_string_t self) -> std::vector< std::string >::value_type"},
+	 { (char *)"vector_string_t_append", _wrap_vector_string_t_append, METH_VARARGS, (char *)"vector_string_t_append(vector_string_t self, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_empty", _wrap_vector_string_t_empty, METH_VARARGS, (char *)"vector_string_t_empty(vector_string_t self) -> bool"},
+	 { (char *)"vector_string_t_size", _wrap_vector_string_t_size, METH_VARARGS, (char *)"vector_string_t_size(vector_string_t self) -> std::vector< std::string >::size_type"},
+	 { (char *)"vector_string_t_swap", _wrap_vector_string_t_swap, METH_VARARGS, (char *)"vector_string_t_swap(vector_string_t self, vector_string_t v)"},
+	 { (char *)"vector_string_t_begin", _wrap_vector_string_t_begin, METH_VARARGS, (char *)"vector_string_t_begin(vector_string_t self) -> std::vector< std::string >::iterator"},
+	 { (char *)"vector_string_t_end", _wrap_vector_string_t_end, METH_VARARGS, (char *)"vector_string_t_end(vector_string_t self) -> std::vector< std::string >::iterator"},
+	 { (char *)"vector_string_t_rbegin", _wrap_vector_string_t_rbegin, METH_VARARGS, (char *)"vector_string_t_rbegin(vector_string_t self) -> std::vector< std::string >::reverse_iterator"},
+	 { (char *)"vector_string_t_rend", _wrap_vector_string_t_rend, METH_VARARGS, (char *)"vector_string_t_rend(vector_string_t self) -> std::vector< std::string >::reverse_iterator"},
+	 { (char *)"vector_string_t_clear", _wrap_vector_string_t_clear, METH_VARARGS, (char *)"vector_string_t_clear(vector_string_t self)"},
+	 { (char *)"vector_string_t_get_allocator", _wrap_vector_string_t_get_allocator, METH_VARARGS, (char *)"vector_string_t_get_allocator(vector_string_t self) -> std::vector< std::string >::allocator_type"},
+	 { (char *)"vector_string_t_pop_back", _wrap_vector_string_t_pop_back, METH_VARARGS, (char *)"vector_string_t_pop_back(vector_string_t self)"},
+	 { (char *)"vector_string_t_erase", _wrap_vector_string_t_erase, METH_VARARGS, (char *)"\n"
+		"erase(std::vector< std::string >::iterator pos) -> std::vector< std::string >::iterator\n"
+		"vector_string_t_erase(vector_string_t self, std::vector< std::string >::iterator first, std::vector< std::string >::iterator last) -> std::vector< std::string >::iterator\n"
+		""},
+	 { (char *)"new_vector_string_t", _wrap_new_vector_string_t, METH_VARARGS, (char *)"\n"
+		"vector_string_t()\n"
+		"vector_string_t(vector_string_t arg2)\n"
+		"vector_string_t(std::vector< std::string >::size_type size)\n"
+		"new_vector_string_t(std::vector< std::string >::size_type size, std::vector< std::string >::value_type const & value) -> vector_string_t\n"
+		""},
+	 { (char *)"vector_string_t_push_back", _wrap_vector_string_t_push_back, METH_VARARGS, (char *)"vector_string_t_push_back(vector_string_t self, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_front", _wrap_vector_string_t_front, METH_VARARGS, (char *)"vector_string_t_front(vector_string_t self) -> std::vector< std::string >::value_type const &"},
+	 { (char *)"vector_string_t_back", _wrap_vector_string_t_back, METH_VARARGS, (char *)"vector_string_t_back(vector_string_t self) -> std::vector< std::string >::value_type const &"},
+	 { (char *)"vector_string_t_assign", _wrap_vector_string_t_assign, METH_VARARGS, (char *)"vector_string_t_assign(vector_string_t self, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)"},
+	 { (char *)"vector_string_t_resize", _wrap_vector_string_t_resize, METH_VARARGS, (char *)"\n"
+		"resize(std::vector< std::string >::size_type new_size)\n"
+		"vector_string_t_resize(vector_string_t self, std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_insert", _wrap_vector_string_t_insert, METH_VARARGS, (char *)"\n"
+		"insert(std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const & x) -> std::vector< std::string >::iterator\n"
+		"vector_string_t_insert(vector_string_t self, std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const & x)\n"
+		""},
+	 { (char *)"vector_string_t_reserve", _wrap_vector_string_t_reserve, METH_VARARGS, (char *)"vector_string_t_reserve(vector_string_t self, std::vector< std::string >::size_type n)"},
+	 { (char *)"vector_string_t_capacity", _wrap_vector_string_t_capacity, METH_VARARGS, (char *)"vector_string_t_capacity(vector_string_t self) -> std::vector< std::string >::size_type"},
+	 { (char *)"delete_vector_string_t", _wrap_delete_vector_string_t, METH_VARARGS, (char *)"delete_vector_string_t(vector_string_t self)"},
+	 { (char *)"vector_string_t_swigregister", vector_string_t_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_AttLimits", _wrap_new_AttLimits, METH_VARARGS, (char *)"\n"
+		"new_AttLimits() -> AttLimits\n"
+		"\n"
+		"AttLimits::AttLimits()\n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_limitless", _wrap_AttLimits_limitless, METH_VARARGS, (char *)"AttLimits_limitless() -> AttLimits"},
+	 { (char *)"AttLimits_lowerLimited", _wrap_AttLimits_lowerLimited, METH_VARARGS, (char *)"AttLimits_lowerLimited(double bound_value) -> AttLimits"},
+	 { (char *)"AttLimits_positive", _wrap_AttLimits_positive, METH_VARARGS, (char *)"AttLimits_positive() -> AttLimits"},
+	 { (char *)"AttLimits_nonnegative", _wrap_AttLimits_nonnegative, METH_VARARGS, (char *)"AttLimits_nonnegative() -> AttLimits"},
+	 { (char *)"AttLimits_upperLimited", _wrap_AttLimits_upperLimited, METH_VARARGS, (char *)"AttLimits_upperLimited(double bound_value) -> AttLimits"},
+	 { (char *)"AttLimits_limited", _wrap_AttLimits_limited, METH_VARARGS, (char *)"AttLimits_limited(double left_bound_value, double right_bound_value) -> AttLimits"},
+	 { (char *)"AttLimits_fixed", _wrap_AttLimits_fixed, METH_VARARGS, (char *)"AttLimits_fixed() -> AttLimits"},
+	 { (char *)"AttLimits_isFixed", _wrap_AttLimits_isFixed, METH_VARARGS, (char *)"\n"
+		"AttLimits_isFixed(AttLimits self) -> bool\n"
+		"\n"
+		"bool AttLimits::isFixed() const \n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_isLimited", _wrap_AttLimits_isLimited, METH_VARARGS, (char *)"\n"
+		"AttLimits_isLimited(AttLimits self) -> bool\n"
+		"\n"
+		"bool AttLimits::isLimited() const \n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_isUpperLimited", _wrap_AttLimits_isUpperLimited, METH_VARARGS, (char *)"\n"
+		"AttLimits_isUpperLimited(AttLimits self) -> bool\n"
+		"\n"
+		"bool AttLimits::isUpperLimited() const \n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_isLowerLimited", _wrap_AttLimits_isLowerLimited, METH_VARARGS, (char *)"\n"
+		"AttLimits_isLowerLimited(AttLimits self) -> bool\n"
+		"\n"
+		"bool AttLimits::isLowerLimited() const \n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_isLimitless", _wrap_AttLimits_isLimitless, METH_VARARGS, (char *)"\n"
+		"AttLimits_isLimitless(AttLimits self) -> bool\n"
+		"\n"
+		"bool AttLimits::isLimitless() const \n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_lowerLimit", _wrap_AttLimits_lowerLimit, METH_VARARGS, (char *)"\n"
+		"AttLimits_lowerLimit(AttLimits self) -> double\n"
+		"\n"
+		"double AttLimits::lowerLimit() const \n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_upperLimit", _wrap_AttLimits_upperLimit, METH_VARARGS, (char *)"\n"
+		"AttLimits_upperLimit(AttLimits self) -> double\n"
+		"\n"
+		"double AttLimits::upperLimit() const \n"
+		"\n"
+		""},
+	 { (char *)"AttLimits_setFixed", _wrap_AttLimits_setFixed, METH_VARARGS, (char *)"\n"
+		"AttLimits_setFixed(AttLimits self, bool isFixed)\n"
+		"\n"
+		"void AttLimits::setFixed(bool isFixed)\n"
+		"\n"
+		""},
+	 { (char *)"AttLimits___eq__", _wrap_AttLimits___eq__, METH_VARARGS, (char *)"AttLimits___eq__(AttLimits self, AttLimits other) -> bool"},
+	 { (char *)"AttLimits___ne__", _wrap_AttLimits___ne__, METH_VARARGS, (char *)"AttLimits___ne__(AttLimits self, AttLimits other) -> bool"},
+	 { (char *)"AttLimits_toString", _wrap_AttLimits_toString, METH_VARARGS, (char *)"\n"
+		"AttLimits_toString(AttLimits self) -> std::string\n"
+		"\n"
+		"std::string AttLimits::toString() const \n"
+		"\n"
+		""},
+	 { (char *)"delete_AttLimits", _wrap_delete_AttLimits, METH_VARARGS, (char *)"delete_AttLimits(AttLimits self)"},
+	 { (char *)"AttLimits_swigregister", AttLimits_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_IMinimizer", _wrap_new_IMinimizer, METH_VARARGS, (char *)"\n"
+		"new_IMinimizer() -> IMinimizer\n"
+		"\n"
+		"IMinimizer::IMinimizer(const IMinimizer &other)=delete\n"
+		"\n"
+		""},
+	 { (char *)"delete_IMinimizer", _wrap_delete_IMinimizer, METH_VARARGS, (char *)"\n"
+		"delete_IMinimizer(IMinimizer self)\n"
+		"\n"
+		"virtual IMinimizer::~IMinimizer()\n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_minimizerName", _wrap_IMinimizer_minimizerName, METH_VARARGS, (char *)"\n"
+		"IMinimizer_minimizerName(IMinimizer self) -> std::string\n"
+		"\n"
+		"std::string IMinimizer::minimizerName() const\n"
+		"\n"
+		"return name of the minimizer \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_algorithmName", _wrap_IMinimizer_algorithmName, METH_VARARGS, (char *)"\n"
+		"IMinimizer_algorithmName(IMinimizer self) -> std::string\n"
+		"\n"
+		"std::string IMinimizer::algorithmName() const\n"
+		"\n"
+		"return name of the minimization algorithm \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_minimize", _wrap_IMinimizer_minimize, METH_VARARGS, (char *)"\n"
+		"IMinimizer_minimize(IMinimizer self)\n"
+		"\n"
+		"void IMinimizer::minimize()\n"
+		"\n"
+		"run minimization \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_clear", _wrap_IMinimizer_clear, METH_VARARGS, (char *)"\n"
+		"IMinimizer_clear(IMinimizer self)\n"
+		"\n"
+		"void IMinimizer::clear()\n"
+		"\n"
+		"clear resources (parameters) for consecutives minimizations \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_setParameters", _wrap_IMinimizer_setParameters, METH_VARARGS, (char *)"\n"
+		"IMinimizer_setParameters(IMinimizer self, FitParameterSet parameters)\n"
+		"\n"
+		"void IMinimizer::setParameters(const FitParameterSet &parameters)\n"
+		"\n"
+		"Sets internal minimizer parameters using external parameter list. \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_setObjectiveFunction", _wrap_IMinimizer_setObjectiveFunction, METH_VARARGS, (char *)"\n"
+		"IMinimizer_setObjectiveFunction(IMinimizer self, objective_function_t arg3)\n"
+		"\n"
+		"virtual void IMinimizer::setObjectiveFunction(objective_function_t)\n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_setGradientFunction", _wrap_IMinimizer_setGradientFunction, METH_VARARGS, (char *)"\n"
+		"IMinimizer_setGradientFunction(IMinimizer self, gradient_function_t arg3, int arg4)\n"
+		"\n"
+		"virtual void IMinimizer::setGradientFunction(gradient_function_t, int)\n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_minValue", _wrap_IMinimizer_minValue, METH_VARARGS, (char *)"\n"
+		"IMinimizer_minValue(IMinimizer self) -> double\n"
+		"\n"
+		"double IMinimizer::minValue() const\n"
+		"\n"
+		"Returns minimum function value. \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_reportResults", _wrap_IMinimizer_reportResults, METH_VARARGS, (char *)"\n"
+		"IMinimizer_reportResults(IMinimizer self) -> std::string\n"
+		"\n"
+		"std::string IMinimizer::reportResults() const\n"
+		"\n"
+		"Prints fit results. \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_propagateResults", _wrap_IMinimizer_propagateResults, METH_VARARGS, (char *)"\n"
+		"IMinimizer_propagateResults(IMinimizer self, FitParameterSet parameters)\n"
+		"\n"
+		"void IMinimizer::propagateResults(FitParameterSet &parameters)\n"
+		"\n"
+		"Propagates results of minimization to fit parameter set. \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_setOptions", _wrap_IMinimizer_setOptions, METH_VARARGS, (char *)"\n"
+		"IMinimizer_setOptions(IMinimizer self, std::string const & options)\n"
+		"\n"
+		"void IMinimizer::setOptions(const std::string &options)\n"
+		"\n"
+		"Sets option string to the minimizer. \n"
+		"\n"
+		""},
+	 { (char *)"IMinimizer_swigregister", IMinimizer_swigregister, METH_VARARGS, NULL},
+	 { (char *)"delete_IFitParameter", _wrap_delete_IFitParameter, METH_VARARGS, (char *)"\n"
+		"delete_IFitParameter(IFitParameter self)\n"
+		"\n"
+		"virtual IFitParameter::~IFitParameter()\n"
+		"\n"
+		""},
+	 { (char *)"IFitParameter_clone", _wrap_IFitParameter_clone, METH_VARARGS, (char *)"\n"
+		"IFitParameter_clone(IFitParameter self) -> IFitParameter\n"
+		"\n"
+		"virtual IFitParameter* IFitParameter::clone() const =0\n"
+		"\n"
+		""},
+	 { (char *)"IFitParameter_swigregister", IFitParameter_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitParameter", _wrap_new_FitParameter, METH_VARARGS, (char *)"\n"
+		"FitParameter()\n"
+		"FitParameter(std::string const & name, double value, AttLimits limits, double step=0.0)\n"
+		"FitParameter(std::string const & name, double value, AttLimits limits)\n"
+		"new_FitParameter(std::string const & name, double value) -> FitParameter\n"
+		"\n"
+		"FitParameter::FitParameter(const std::string &name, double value, const AttLimits &limits=AttLimits::limitless(), double step=0.0)\n"
+		"\n"
+		""},
+	 { (char *)"delete_FitParameter", _wrap_delete_FitParameter, METH_VARARGS, (char *)"\n"
+		"delete_FitParameter(FitParameter self)\n"
+		"\n"
+		"virtual FitParameter::~FitParameter()\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_clone", _wrap_FitParameter_clone, METH_VARARGS, (char *)"\n"
+		"FitParameter_clone(FitParameter self) -> FitParameter\n"
+		"\n"
+		"FitParameter * FitParameter::clone() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_name", _wrap_FitParameter_name, METH_VARARGS, (char *)"\n"
+		"FitParameter_name(FitParameter self) -> std::string\n"
+		"\n"
+		"std::string FitParameter::name() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_startValue", _wrap_FitParameter_startValue, METH_VARARGS, (char *)"\n"
+		"FitParameter_startValue(FitParameter self) -> double\n"
+		"\n"
+		"double FitParameter::startValue() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_value", _wrap_FitParameter_value, METH_VARARGS, (char *)"\n"
+		"FitParameter_value(FitParameter self) -> double\n"
+		"\n"
+		"double FitParameter::value() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setValue", _wrap_FitParameter_setValue, METH_VARARGS, (char *)"\n"
+		"FitParameter_setValue(FitParameter self, double value)\n"
+		"\n"
+		"void FitParameter::setValue(double value)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_step", _wrap_FitParameter_step, METH_VARARGS, (char *)"\n"
+		"FitParameter_step(FitParameter self) -> double\n"
+		"\n"
+		"double FitParameter::step() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setStep", _wrap_FitParameter_setStep, METH_VARARGS, (char *)"\n"
+		"FitParameter_setStep(FitParameter self, double value) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setStep(double value)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_error", _wrap_FitParameter_error, METH_VARARGS, (char *)"\n"
+		"FitParameter_error(FitParameter self) -> double\n"
+		"\n"
+		"double FitParameter::error() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setError", _wrap_FitParameter_setError, METH_VARARGS, (char *)"\n"
+		"FitParameter_setError(FitParameter self, double value)\n"
+		"\n"
+		"void FitParameter::setError(double value)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_limits", _wrap_FitParameter_limits, METH_VARARGS, (char *)"\n"
+		"limits() -> AttLimits\n"
+		"FitParameter_limits(FitParameter self) -> AttLimits\n"
+		"\n"
+		"AttLimits & FitParameter::limits()\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setLimits", _wrap_FitParameter_setLimits, METH_VARARGS, (char *)"\n"
+		"FitParameter_setLimits(FitParameter self, AttLimits limits) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setLimits(const AttLimits &limits)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setLowerLimited", _wrap_FitParameter_setLowerLimited, METH_VARARGS, (char *)"\n"
+		"FitParameter_setLowerLimited(FitParameter self, double bound_value) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setLowerLimited(double bound_value)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setPositive", _wrap_FitParameter_setPositive, METH_VARARGS, (char *)"\n"
+		"FitParameter_setPositive(FitParameter self) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setPositive()\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setNonnegative", _wrap_FitParameter_setNonnegative, METH_VARARGS, (char *)"\n"
+		"FitParameter_setNonnegative(FitParameter self) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setNonnegative()\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setUpperLimited", _wrap_FitParameter_setUpperLimited, METH_VARARGS, (char *)"\n"
+		"FitParameter_setUpperLimited(FitParameter self, double bound_value) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setUpperLimited(double bound_value)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setLimited", _wrap_FitParameter_setLimited, METH_VARARGS, (char *)"\n"
+		"FitParameter_setLimited(FitParameter self, double left_bound_value, double right_bound_value) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setLimited(double left_bound_value, double right_bound_value)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_setFixed", _wrap_FitParameter_setFixed, METH_VARARGS, (char *)"\n"
+		"FitParameter_setFixed(FitParameter self) -> FitParameter\n"
+		"\n"
+		"FitParameter & FitParameter::setFixed()\n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_toString", _wrap_FitParameter_toString, METH_VARARGS, (char *)"\n"
+		"FitParameter_toString(FitParameter self) -> std::string\n"
+		"\n"
+		"std::string FitParameter::toString() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameter_swigregister", FitParameter_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_FitParameterSet", _wrap_new_FitParameterSet, METH_VARARGS, (char *)"\n"
+		"new_FitParameterSet() -> FitParameterSet\n"
+		"\n"
+		"FitParameterSet::FitParameterSet()\n"
+		"\n"
+		""},
+	 { (char *)"delete_FitParameterSet", _wrap_delete_FitParameterSet, METH_VARARGS, (char *)"\n"
+		"delete_FitParameterSet(FitParameterSet self)\n"
+		"\n"
+		"FitParameterSet::~FitParameterSet()\n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_clear", _wrap_FitParameterSet_clear, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_clear(FitParameterSet self)\n"
+		"\n"
+		"void FitParameterSet::clear()\n"
+		"\n"
+		"container specific\n"
+		"\n"
+		"Clears all defined parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_size", _wrap_FitParameterSet_size, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_size(FitParameterSet self) -> size_t\n"
+		"\n"
+		"size_t FitParameterSet::size() const\n"
+		"\n"
+		"Returns number of parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_begin", _wrap_FitParameterSet_begin, METH_VARARGS, (char *)"\n"
+		"begin() -> FitParameterSet::iterator\n"
+		"FitParameterSet_begin(FitParameterSet self) -> FitParameterSet::const_iterator\n"
+		"\n"
+		"FitParameterSet::const_iterator FitParameterSet::begin() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_end", _wrap_FitParameterSet_end, METH_VARARGS, (char *)"\n"
+		"end() -> FitParameterSet::iterator\n"
+		"FitParameterSet_end(FitParameterSet self) -> FitParameterSet::const_iterator\n"
+		"\n"
+		"FitParameterSet::const_iterator FitParameterSet::end() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_addFitParameter", _wrap_FitParameterSet_addFitParameter, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_addFitParameter(FitParameterSet self, FitParameter par)\n"
+		"\n"
+		"void FitParameterSet::addFitParameter(FitParameter *par)\n"
+		"\n"
+		"adding fit parameters\n"
+		"\n"
+		"Adds fit parameter. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_fitParameter", _wrap_FitParameterSet_fitParameter, METH_VARARGS, (char *)"\n"
+		"fitParameter(std::string const & name) -> FitParameter\n"
+		"FitParameterSet_fitParameter(FitParameterSet self, std::string const & name) -> FitParameter\n"
+		"\n"
+		"FitParameter * FitParameterSet::fitParameter(const std::string &name)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_values", _wrap_FitParameterSet_values, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_values(FitParameterSet self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > FitParameterSet::values() const\n"
+		"\n"
+		"fit parameter's values and errors\n"
+		"\n"
+		"Returns values of all defined parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_setValues", _wrap_FitParameterSet_setValues, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_setValues(FitParameterSet self, vdouble1d_t pars_values)\n"
+		"\n"
+		"void FitParameterSet::setValues(const std::vector< double > &pars_values)\n"
+		"\n"
+		"Sets values for all defined parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_valuesDifferFrom", _wrap_FitParameterSet_valuesDifferFrom, METH_VARARGS, (char *)"\n"
+		"valuesDifferFrom(vdouble1d_t par_values, double tolerance=2.0) -> bool\n"
+		"FitParameterSet_valuesDifferFrom(FitParameterSet self, vdouble1d_t par_values) -> bool\n"
+		"\n"
+		"bool FitParameterSet::valuesDifferFrom(const std::vector< double > &par_values, double tolerance=2.0) const\n"
+		"\n"
+		"Returns true if parameters already have the given values. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_errors", _wrap_FitParameterSet_errors, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_errors(FitParameterSet self) -> vdouble1d_t\n"
+		"\n"
+		"std::vector< double > FitParameterSet::errors() const\n"
+		"\n"
+		"Returns errors of all defined parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_setErrors", _wrap_FitParameterSet_setErrors, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_setErrors(FitParameterSet self, vdouble1d_t pars_errors)\n"
+		"\n"
+		"void FitParameterSet::setErrors(const std::vector< double > &pars_errors)\n"
+		"\n"
+		"Sets errors to all parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_freeFitParameterCount", _wrap_FitParameterSet_freeFitParameterCount, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_freeFitParameterCount(FitParameterSet self) -> size_t\n"
+		"\n"
+		"size_t FitParameterSet::freeFitParameterCount() const\n"
+		"\n"
+		"Make parameters fixed and free.\n"
+		"\n"
+		"Returns number of free parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_fixAll", _wrap_FitParameterSet_fixAll, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_fixAll(FitParameterSet self)\n"
+		"\n"
+		"void FitParameterSet::fixAll()\n"
+		"\n"
+		"Fix all parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_releaseAll", _wrap_FitParameterSet_releaseAll, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_releaseAll(FitParameterSet self)\n"
+		"\n"
+		"void FitParameterSet::releaseAll()\n"
+		"\n"
+		"Release all parameters. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_setFixed", _wrap_FitParameterSet_setFixed, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_setFixed(FitParameterSet self, vector_string_t pars, bool is_fixed)\n"
+		"\n"
+		"void FitParameterSet::setFixed(const std::vector< std::string > &pars, bool is_fixed)\n"
+		"\n"
+		"Set fixed flag for parameters from the list. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_parametersToString", _wrap_FitParameterSet_parametersToString, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_parametersToString(FitParameterSet self) -> std::string\n"
+		"\n"
+		"std::string FitParameterSet::parametersToString() const\n"
+		"\n"
+		"Printing and reporting. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_reportResults", _wrap_FitParameterSet_reportResults, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_reportResults(FitParameterSet self) -> std::string\n"
+		"\n"
+		"std::string FitParameterSet::reportResults() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_correlationMatrix", _wrap_FitParameterSet_correlationMatrix, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_correlationMatrix(FitParameterSet self) -> vdouble2d_t\n"
+		"\n"
+		"corr_matrix_t FitParameterSet::correlationMatrix() const \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_setCorrelationMatrix", _wrap_FitParameterSet_setCorrelationMatrix, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_setCorrelationMatrix(FitParameterSet self, vdouble2d_t matrix)\n"
+		"\n"
+		"void FitParameterSet::setCorrelationMatrix(const corr_matrix_t &matrix)\n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet_isExistingName", _wrap_FitParameterSet_isExistingName, METH_VARARGS, (char *)"\n"
+		"FitParameterSet_isExistingName(FitParameterSet self, std::string const & name) -> bool\n"
+		"\n"
+		"bool FitParameterSet::isExistingName(const std::string &name) const\n"
+		"\n"
+		"Returns true if parameter with such name exists. \n"
+		"\n"
+		""},
+	 { (char *)"FitParameterSet___getitem__", _wrap_FitParameterSet___getitem__, METH_VARARGS, (char *)"\n"
+		"__getitem__(std::string name) -> FitParameter\n"
+		"FitParameterSet___getitem__(FitParameterSet self, size_t index) -> FitParameter\n"
+		""},
+	 { (char *)"FitParameterSet_swigregister", FitParameterSet_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_MinimizerCatalogue", _wrap_new_MinimizerCatalogue, METH_VARARGS, (char *)"\n"
+		"new_MinimizerCatalogue() -> MinimizerCatalogue\n"
+		"\n"
+		"MinimizerCatalogue::MinimizerCatalogue()\n"
+		"\n"
+		""},
+	 { (char *)"MinimizerCatalogue_toString", _wrap_MinimizerCatalogue_toString, METH_VARARGS, (char *)"\n"
+		"MinimizerCatalogue_toString(MinimizerCatalogue self) -> std::string\n"
+		"\n"
+		"std::string MinimizerCatalogue::toString() const\n"
+		"\n"
+		"Returns multiline string representing catalogue content. \n"
+		"\n"
+		""},
+	 { (char *)"MinimizerCatalogue_algorithmNames", _wrap_MinimizerCatalogue_algorithmNames, METH_VARARGS, (char *)"\n"
+		"MinimizerCatalogue_algorithmNames(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t\n"
+		"\n"
+		"std::vector< std::string > MinimizerCatalogue::algorithmNames(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns list of algorithms defined for the minimizer with a given name. \n"
+		"\n"
+		""},
+	 { (char *)"MinimizerCatalogue_algorithmDescriptions", _wrap_MinimizerCatalogue_algorithmDescriptions, METH_VARARGS, (char *)"\n"
+		"MinimizerCatalogue_algorithmDescriptions(MinimizerCatalogue self, std::string const & minimizerName) -> vector_string_t\n"
+		"\n"
+		"std::vector< std::string > MinimizerCatalogue::algorithmDescriptions(const std::string &minimizerName) const\n"
+		"\n"
+		"Returns list of algorithm's descriptions for the minimizer with a given name . \n"
+		"\n"
+		""},
+	 { (char *)"delete_MinimizerCatalogue", _wrap_delete_MinimizerCatalogue, METH_VARARGS, (char *)"delete_MinimizerCatalogue(MinimizerCatalogue self)"},
+	 { (char *)"MinimizerCatalogue_swigregister", MinimizerCatalogue_swigregister, METH_VARARGS, NULL},
+	 { (char *)"MinimizerFactory_createMinimizer", _wrap_MinimizerFactory_createMinimizer, METH_VARARGS, (char *)"\n"
+		"createMinimizer(std::string const & minimizerName, std::string const & algorithmType, std::string const & optionString) -> IMinimizer\n"
+		"createMinimizer(std::string const & minimizerName, std::string const & algorithmType) -> IMinimizer\n"
+		"MinimizerFactory_createMinimizer(std::string const & minimizerName) -> IMinimizer\n"
+		""},
+	 { (char *)"MinimizerFactory_printCatalogue", _wrap_MinimizerFactory_printCatalogue, METH_VARARGS, (char *)"MinimizerFactory_printCatalogue()"},
+	 { (char *)"MinimizerFactory_catalogueToString", _wrap_MinimizerFactory_catalogueToString, METH_VARARGS, (char *)"MinimizerFactory_catalogueToString() -> std::string"},
+	 { (char *)"MinimizerFactory_catalogue", _wrap_MinimizerFactory_catalogue, METH_VARARGS, (char *)"MinimizerFactory_catalogue() -> MinimizerCatalogue"},
+	 { (char *)"new_MinimizerFactory", _wrap_new_MinimizerFactory, METH_VARARGS, (char *)"\n"
+		"new_MinimizerFactory() -> MinimizerFactory\n"
+		"\n"
+		"\n"
+		"\n"
+		"Factory to create minimizers.\n"
+		"\n"
+		"Minimizer | Algorithms\n"
+		"\n"
+		"Minuit2 | Migrad Simplex Combined Scan Fumili GSLMultiMin | SteepestDescent ConjugateFR ConjugatePR BFGS BFGS2 GSLLMA | Default GSLSimAn | Default Genetic | Default\n"
+		"\n"
+		"C++ includes: MinimizerFactory.h\n"
+		"\n"
+		""},
+	 { (char *)"delete_MinimizerFactory", _wrap_delete_MinimizerFactory, METH_VARARGS, (char *)"delete_MinimizerFactory(MinimizerFactory self)"},
+	 { (char *)"MinimizerFactory_swigregister", MinimizerFactory_swigregister, METH_VARARGS, NULL},
+	 { NULL, NULL, 0, NULL }
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static void *_p_FitParameterTo_p_IFitParameter(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IFitParameter *)  ((FitParameter *) x));
+}
+static swig_type_info _swigt__p_AttLimits = {"_p_AttLimits", "AttLimits *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitParameter = {"_p_FitParameter", "FitParameter *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_FitParameterSet = {"_p_FitParameterSet", "FitParameterSet *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IFitParameter = {"_p_IFitParameter", "IFitParameter *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_IMinimizer = {"_p_IMinimizer", "IMinimizer *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MinimizerCatalogue = {"_p_MinimizerCatalogue", "MinimizerCatalogue *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_MinimizerFactory = {"_p_MinimizerFactory", "MinimizerFactory *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_const_iterator = {"_p_const_iterator", "const_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_container_t = {"_p_container_t", "container_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_corr_matrix_t = {"_p_corr_matrix_t", "corr_matrix_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_gradient_function_t = {"_p_gradient_function_t", "gradient_function_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_int = {"_p_int", "intptr_t *|int *|int_least32_t *|int_fast32_t *|int32_t *|int_fast16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_iterator = {"_p_iterator", "iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_long_long = {"_p_long_long", "int_least64_t *|int_fast64_t *|int64_t *|long long *|intmax_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_objective_function_t = {"_p_objective_function_t", "objective_function_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_PyObject = {"_p_p_PyObject", "PyObject **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_short = {"_p_short", "short *|int_least16_t *|int16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_signed_char = {"_p_signed_char", "signed char *|int_least8_t *|int_fast8_t *|int8_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_double_t = {"_p_std__allocatorT_double_t", "std::vector< double >::allocator_type *|std::allocator< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_int_t = {"_p_std__allocatorT_int_t", "std::vector< int >::allocator_type *|std::allocator< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__complexT_double_t_t = {"_p_std__allocatorT_std__complexT_double_t_t", "std::allocator< std::complex< double > > *|std::vector< std::complex< double > >::allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__allocatorT_std__string_t", "std::vector< std::string >::allocator_type *|std::allocator< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t = {"_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t", "std::vector< std::vector< double > >::allocator_type *|std::allocator< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_unsigned_long_t = {"_p_std__allocatorT_unsigned_long_t", "std::vector< unsigned long >::allocator_type *|std::allocator< unsigned long > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_IFitObserver_t = {"_p_std__shared_ptrT_IFitObserver_t", "std::shared_ptr< IFitObserver > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_IMultiLayerBuilder_t = {"_p_std__shared_ptrT_IMultiLayerBuilder_t", "std::shared_ptr< IMultiLayerBuilder > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__shared_ptrT_IObserver_t = {"_p_std__shared_ptrT_IObserver_t", "std::shared_ptr< IObserver > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator = {"_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator", "FitParameterSet::const_iterator *|std::vector< FitParameter *,std::allocator< FitParameter * > >::const_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator = {"_p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator", "FitParameterSet::iterator *|std::vector< FitParameter *,std::allocator< FitParameter * > >::iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t = {"_p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t", "std::vector< std::complex< double > > *|std::vector< std::complex< double >,std::allocator< std::complex< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t = {"_p_std__vectorT_std__string_std__allocatorT_std__string_t_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t = {"_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t", "std::vector< std::vector< double > > *|std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *|std::vector< std::vector< do [...]
+static swig_type_info _swigt__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t = {"_p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t", "std::vector< unsigned long > *|std::vector< unsigned long,std::allocator< unsigned long > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_swig__SwigPyIterator = {"_p_swig__SwigPyIterator", "swig::SwigPyIterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "unsigned char *|uint_least8_t *|uint_fast8_t *|uint8_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_int = {"_p_unsigned_int", "uintptr_t *|uint_least32_t *|uint_fast32_t *|uint32_t *|unsigned int *|uint_fast16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_long_long = {"_p_unsigned_long_long", "uint_least64_t *|uint_fast64_t *|uint64_t *|unsigned long long *|uintmax_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned short *|uint_least16_t *|uint16_t *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
+
+static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_AttLimits,
+  &_swigt__p_FitParameter,
+  &_swigt__p_FitParameterSet,
+  &_swigt__p_IFitParameter,
+  &_swigt__p_IMinimizer,
+  &_swigt__p_MinimizerCatalogue,
+  &_swigt__p_MinimizerFactory,
+  &_swigt__p_allocator_type,
+  &_swigt__p_char,
+  &_swigt__p_const_iterator,
+  &_swigt__p_container_t,
+  &_swigt__p_corr_matrix_t,
+  &_swigt__p_difference_type,
+  &_swigt__p_gradient_function_t,
+  &_swigt__p_int,
+  &_swigt__p_iterator,
+  &_swigt__p_long_long,
+  &_swigt__p_objective_function_t,
+  &_swigt__p_p_PyObject,
+  &_swigt__p_short,
+  &_swigt__p_signed_char,
+  &_swigt__p_size_type,
+  &_swigt__p_std__allocatorT_double_t,
+  &_swigt__p_std__allocatorT_int_t,
+  &_swigt__p_std__allocatorT_std__complexT_double_t_t,
+  &_swigt__p_std__allocatorT_std__string_t,
+  &_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  &_swigt__p_std__allocatorT_unsigned_long_t,
+  &_swigt__p_std__invalid_argument,
+  &_swigt__p_std__shared_ptrT_IFitObserver_t,
+  &_swigt__p_std__shared_ptrT_IMultiLayerBuilder_t,
+  &_swigt__p_std__shared_ptrT_IObserver_t,
+  &_swigt__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator,
+  &_swigt__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator,
+  &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
+  &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
+  &_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
+  &_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  &_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  &_swigt__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t,
+  &_swigt__p_swig__SwigPyIterator,
+  &_swigt__p_unsigned_char,
+  &_swigt__p_unsigned_int,
+  &_swigt__p_unsigned_long_long,
+  &_swigt__p_unsigned_short,
+  &_swigt__p_value_type,
+};
+
+static swig_cast_info _swigc__p_AttLimits[] = {  {&_swigt__p_AttLimits, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitParameter[] = {  {&_swigt__p_FitParameter, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_FitParameterSet[] = {  {&_swigt__p_FitParameterSet, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IFitParameter[] = {  {&_swigt__p_IFitParameter, 0, 0, 0},  {&_swigt__p_FitParameter, _p_FitParameterTo_p_IFitParameter, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IMinimizer[] = {  {&_swigt__p_IMinimizer, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MinimizerCatalogue[] = {  {&_swigt__p_MinimizerCatalogue, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_MinimizerFactory[] = {  {&_swigt__p_MinimizerFactory, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_const_iterator[] = {  {&_swigt__p_const_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_container_t[] = {  {&_swigt__p_container_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_corr_matrix_t[] = {  {&_swigt__p_corr_matrix_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_difference_type[] = {  {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_gradient_function_t[] = {  {&_swigt__p_gradient_function_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_int[] = {  {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_iterator[] = {  {&_swigt__p_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_long_long[] = {  {&_swigt__p_long_long, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_objective_function_t[] = {  {&_swigt__p_objective_function_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_PyObject[] = {  {&_swigt__p_p_PyObject, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_short[] = {  {&_swigt__p_short, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_signed_char[] = {  {&_swigt__p_signed_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_size_type[] = {  {&_swigt__p_size_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_double_t[] = {  {&_swigt__p_std__allocatorT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_int_t[] = {  {&_swigt__p_std__allocatorT_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__complexT_double_t_t[] = {  {&_swigt__p_std__allocatorT_std__complexT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = {  {&_swigt__p_std__allocatorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t[] = {  {&_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_unsigned_long_t[] = {  {&_swigt__p_std__allocatorT_unsigned_long_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_IFitObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IFitObserver_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_IMultiLayerBuilder_t[] = {  {&_swigt__p_std__shared_ptrT_IMultiLayerBuilder_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__shared_ptrT_IObserver_t[] = {  {&_swigt__p_std__shared_ptrT_IObserver_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator[] = {  {&_swigt__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator[] = {  {&_swigt__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t[] = {  {&_swigt__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t[] = {  {&_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t[] = {  {&_swigt__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_swig__SwigPyIterator[] = {  {&_swigt__p_swig__SwigPyIterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_char[] = {  {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_int[] = {  {&_swigt__p_unsigned_int, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_long_long[] = {  {&_swigt__p_unsigned_long_long, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
+
+static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_AttLimits,
+  _swigc__p_FitParameter,
+  _swigc__p_FitParameterSet,
+  _swigc__p_IFitParameter,
+  _swigc__p_IMinimizer,
+  _swigc__p_MinimizerCatalogue,
+  _swigc__p_MinimizerFactory,
+  _swigc__p_allocator_type,
+  _swigc__p_char,
+  _swigc__p_const_iterator,
+  _swigc__p_container_t,
+  _swigc__p_corr_matrix_t,
+  _swigc__p_difference_type,
+  _swigc__p_gradient_function_t,
+  _swigc__p_int,
+  _swigc__p_iterator,
+  _swigc__p_long_long,
+  _swigc__p_objective_function_t,
+  _swigc__p_p_PyObject,
+  _swigc__p_short,
+  _swigc__p_signed_char,
+  _swigc__p_size_type,
+  _swigc__p_std__allocatorT_double_t,
+  _swigc__p_std__allocatorT_int_t,
+  _swigc__p_std__allocatorT_std__complexT_double_t_t,
+  _swigc__p_std__allocatorT_std__string_t,
+  _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  _swigc__p_std__allocatorT_unsigned_long_t,
+  _swigc__p_std__invalid_argument,
+  _swigc__p_std__shared_ptrT_IFitObserver_t,
+  _swigc__p_std__shared_ptrT_IMultiLayerBuilder_t,
+  _swigc__p_std__shared_ptrT_IObserver_t,
+  _swigc__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__const_iterator,
+  _swigc__p_std__vectorT_FitParameter_p_std__allocatorT_FitParameter_p_t_t__iterator,
+  _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
+  _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
+  _swigc__p_std__vectorT_std__complexT_double_t_std__allocatorT_std__complexT_double_t_t_t,
+  _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  _swigc__p_std__vectorT_unsigned_long_std__allocatorT_unsigned_long_t_t,
+  _swigc__p_swig__SwigPyIterator,
+  _swigc__p_unsigned_char,
+  _swigc__p_unsigned_int,
+  _swigc__p_unsigned_long_long,
+  _swigc__p_unsigned_short,
+  _swigc__p_value_type,
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+static swig_const_info swig_const_table[] = {
+{0, 0, 0, 0.0, 0, 0}};
+
+#ifdef __cplusplus
+}
+#endif
+/* -----------------------------------------------------------------------------
+ * Type initialization:
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
+ * swig_cast_info structures and swig_cast_info structures store pointers back
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
+ * swig_module, and does all the lookup, filling in the swig_module.types
+ * array with the correct data and linking the correct swig_cast_info
+ * structures together.
+ *
+ * The generated swig_type_info structures are assigned statically to an initial
+ * array. We just loop through that array, and handle each type individually.
+ * First we lookup if this type has been already loaded, and if so, use the
+ * loaded structure instead of the generated one. Then we have to fill in the
+ * cast linked list. The cast data is initially stored in something like a
+ * two-dimensional array. Each row corresponds to a type (there are the same
+ * number of rows as there are in the swig_type_initial array). Each entry in
+ * a column is one of the swig_cast_info structures for that type.
+ * The cast_initial array is actually an array of arrays, because each row has
+ * a variable number of columns. So to actually build the cast linked list,
+ * we find the array of casts associated with the type, and loop through it
+ * adding the casts to the list. The one last trick we need to do is making
+ * sure the type pointer in the swig_cast_info struct is correct.
+ *
+ * First off, we lookup the cast->type name to see if it is already loaded.
+ * There are three cases to handle:
+ *  1) If the cast->type has already been loaded AND the type we are adding
+ *     casting info to has not been loaded (it is in this module), THEN we
+ *     replace the cast->type pointer with the type pointer that has already
+ *     been loaded.
+ *  2) If BOTH types (the one we are adding casting info to, and the
+ *     cast->type) are loaded, THEN the cast info has already been loaded by
+ *     the previous module so we just ignore it.
+ *  3) Finally, if cast->type has not already been loaded, then we add that
+ *     swig_cast_info to the linked list (because the cast->type) pointer will
+ *     be correct.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} /* c-mode */
+#endif
+#endif
+
+#if 0
+#define SWIGRUNTIME_DEBUG
+#endif
+
+
+SWIGRUNTIME void
+SWIG_InitializeModule(void *clientdata) {
+  size_t i;
+  swig_module_info *module_head, *iter;
+  int init;
+  
+  /* check to see if the circular list has been setup, if not, set it up */
+  if (swig_module.next==0) {
+    /* Initialize the swig_module */
+    swig_module.type_initial = swig_type_initial;
+    swig_module.cast_initial = swig_cast_initial;
+    swig_module.next = &swig_module;
+    init = 1;
+  } else {
+    init = 0;
+  }
+  
+  /* Try and load any already created modules */
+  module_head = SWIG_GetModule(clientdata);
+  if (!module_head) {
+    /* This is the first module loaded for this interpreter */
+    /* so set the swig module into the interpreter */
+    SWIG_SetModule(clientdata, &swig_module);
+  } else {
+    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
+    iter=module_head;
+    do {
+      if (iter==&swig_module) {
+        /* Our module is already in the list, so there's nothing more to do. */
+        return;
+      }
+      iter=iter->next;
+    } while (iter!= module_head);
+    
+    /* otherwise we must add our module into the list */
+    swig_module.next = module_head->next;
+    module_head->next = &swig_module;
+  }
+  
+  /* When multiple interpreters are used, a module could have already been initialized in
+       a different interpreter, but not yet have a pointer in this interpreter.
+       In this case, we do not want to continue adding types... everything should be
+       set up already */
+  if (init == 0) return;
+  
+  /* Now work on filling in swig_module.types */
+#ifdef SWIGRUNTIME_DEBUG
+  printf("SWIG_InitializeModule: size %d\n", swig_module.size);
+#endif
+  for (i = 0; i < swig_module.size; ++i) {
+    swig_type_info *type = 0;
+    swig_type_info *ret;
+    swig_cast_info *cast;
+    
+#ifdef SWIGRUNTIME_DEBUG
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+#endif
+    
+    /* if there is another module already loaded */
+    if (swig_module.next != &swig_module) {
+      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
+    }
+    if (type) {
+      /* Overwrite clientdata field */
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found type %s\n", type->name);
+#endif
+      if (swig_module.type_initial[i]->clientdata) {
+        type->clientdata = swig_module.type_initial[i]->clientdata;
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
+#endif
+      }
+    } else {
+      type = swig_module.type_initial[i];
+    }
+    
+    /* Insert casting types */
+    cast = swig_module.cast_initial[i];
+    while (cast->type) {
+      /* Don't need to add information already in the list */
+      ret = 0;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
+#endif
+      if (swig_module.next != &swig_module) {
+        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
+#ifdef SWIGRUNTIME_DEBUG
+        if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
+#endif
+      }
+      if (ret) {
+        if (type == swig_module.type_initial[i]) {
+#ifdef SWIGRUNTIME_DEBUG
+          printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
+#endif
+          cast->type = ret;
+          ret = 0;
+        } else {
+          /* Check for casting already in the list */
+          swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
+#ifdef SWIGRUNTIME_DEBUG
+          if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
+#endif
+          if (!ocast) ret = 0;
+        }
+      }
+      
+      if (!ret) {
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
+#endif
+        if (type->cast) {
+          type->cast->prev = cast;
+          cast->next = type->cast;
+        }
+        type->cast = cast;
+      }
+      cast++;
+    }
+    /* Set entry in modules->types array equal to the type */
+    swig_module.types[i] = type;
+  }
+  swig_module.types[i] = 0;
+  
+#ifdef SWIGRUNTIME_DEBUG
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+  for (i = 0; i < swig_module.size; ++i) {
+    int j = 0;
+    swig_cast_info *cast = swig_module.cast_initial[i];
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+    while (cast->type) {
+      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
+      cast++;
+      ++j;
+    }
+    printf("---- Total casts: %d\n",j);
+  }
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+#endif
+}
+
+/* This function will propagate the clientdata field of type to
+* any new swig_type_info structures that have been added into the list
+* of equivalent types.  It is like calling
+* SWIG_TypeClientData(type, clientdata) a second time.
+*/
+SWIGRUNTIME void
+SWIG_PropagateClientData(void) {
+  size_t i;
+  swig_cast_info *equiv;
+  static int init_run = 0;
+  
+  if (init_run) return;
+  init_run = 1;
+  
+  for (i = 0; i < swig_module.size; i++) {
+    if (swig_module.types[i]->clientdata) {
+      equiv = swig_module.types[i]->cast;
+      while (equiv) {
+        if (!equiv->converter) {
+          if (equiv->type && !equiv->type->clientdata)
+          SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
+        }
+        equiv = equiv->next;
+      }
+    }
+  }
+}
+
+#ifdef __cplusplus
+#if 0
+{
+  /* c-mode */
+#endif
+}
+#endif
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+  /* Python-specific SWIG API */
+#define SWIG_newvarlink()                             SWIG_Python_newvarlink()
+#define SWIG_addvarlink(p, name, get_attr, set_attr)  SWIG_Python_addvarlink(p, name, get_attr, set_attr)
+#define SWIG_InstallConstants(d, constants)           SWIG_Python_InstallConstants(d, constants)
+  
+  /* -----------------------------------------------------------------------------
+   * global variable support code.
+   * ----------------------------------------------------------------------------- */
+  
+  typedef struct swig_globalvar {
+    char       *name;                  /* Name of global variable */
+    PyObject *(*get_attr)(void);       /* Return the current value */
+    int       (*set_attr)(PyObject *); /* Set the value */
+    struct swig_globalvar *next;
+  } swig_globalvar;
+  
+  typedef struct swig_varlinkobject {
+    PyObject_HEAD
+    swig_globalvar *vars;
+  } swig_varlinkobject;
+  
+  SWIGINTERN PyObject *
+  swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) {
+#if PY_VERSION_HEX >= 0x03000000
+    return PyUnicode_InternFromString("<Swig global variables>");
+#else
+    return PyString_FromString("<Swig global variables>");
+#endif
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_str(swig_varlinkobject *v) {
+#if PY_VERSION_HEX >= 0x03000000
+    PyObject *str = PyUnicode_InternFromString("(");
+    PyObject *tail;
+    PyObject *joined;
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      tail = PyUnicode_FromString(var->name);
+      joined = PyUnicode_Concat(str, tail);
+      Py_DecRef(str);
+      Py_DecRef(tail);
+      str = joined;
+      if (var->next) {
+        tail = PyUnicode_InternFromString(", ");
+        joined = PyUnicode_Concat(str, tail);
+        Py_DecRef(str);
+        Py_DecRef(tail);
+        str = joined;
+      }
+    }
+    tail = PyUnicode_InternFromString(")");
+    joined = PyUnicode_Concat(str, tail);
+    Py_DecRef(str);
+    Py_DecRef(tail);
+    str = joined;
+#else
+    PyObject *str = PyString_FromString("(");
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      PyString_ConcatAndDel(&str,PyString_FromString(var->name));
+      if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
+    }
+    PyString_ConcatAndDel(&str,PyString_FromString(")"));
+#endif
+    return str;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) {
+    char *tmp;
+    PyObject *str = swig_varlink_str(v);
+    fprintf(fp,"Swig global variables ");
+    fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str));
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(str);
+    return 0;
+  }
+  
+  SWIGINTERN void
+  swig_varlink_dealloc(swig_varlinkobject *v) {
+    swig_globalvar *var = v->vars;
+    while (var) {
+      swig_globalvar *n = var->next;
+      free(var->name);
+      free(var);
+      var = n;
+    }
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_getattr(swig_varlinkobject *v, char *n) {
+    PyObject *res = NULL;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->get_attr)();
+        break;
+      }
+      var = var->next;
+    }
+    if (res == NULL && !PyErr_Occurred()) {
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+    }
+    return res;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
+    int res = 1;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->set_attr)(p);
+        break;
+      }
+      var = var->next;
+    }
+    if (res == 1 && !PyErr_Occurred()) {
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+    }
+    return res;
+  }
+  
+  SWIGINTERN PyTypeObject*
+  swig_varlink_type(void) {
+    static char varlink__doc__[] = "Swig var link object";
+    static PyTypeObject varlink_type;
+    static int type_init = 0;
+    if (!type_init) {
+      const PyTypeObject tmp = {
+        /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+        PyVarObject_HEAD_INIT(NULL, 0)
+#else
+        PyObject_HEAD_INIT(NULL)
+        0,                                  /* ob_size */
+#endif
+        (char *)"swigvarlink",              /* tp_name */
+        sizeof(swig_varlinkobject),         /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        (destructor) swig_varlink_dealloc,  /* tp_dealloc */
+        (printfunc) swig_varlink_print,     /* tp_print */
+        (getattrfunc) swig_varlink_getattr, /* tp_getattr */
+        (setattrfunc) swig_varlink_setattr, /* tp_setattr */
+        0,                                  /* tp_compare */
+        (reprfunc) swig_varlink_repr,       /* tp_repr */
+        0,                                  /* tp_as_number */
+        0,                                  /* tp_as_sequence */
+        0,                                  /* tp_as_mapping */
+        0,                                  /* tp_hash */
+        0,                                  /* tp_call */
+        (reprfunc) swig_varlink_str,        /* tp_str */
+        0,                                  /* tp_getattro */
+        0,                                  /* tp_setattro */
+        0,                                  /* tp_as_buffer */
+        0,                                  /* tp_flags */
+        varlink__doc__,                     /* tp_doc */
+        0,                                  /* tp_traverse */
+        0,                                  /* tp_clear */
+        0,                                  /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+        0,                                  /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+        0,                                  /* tp_version_tag */
+#endif
+#if PY_VERSION_HEX >= 0x03040000
+        0,                                  /* tp_finalize */
+#endif
+#ifdef COUNT_ALLOCS
+        0,                                  /* tp_allocs */
+        0,                                  /* tp_frees */
+        0,                                  /* tp_maxalloc */
+#if PY_VERSION_HEX >= 0x02050000
+        0,                                  /* tp_prev */
+#endif
+        0                                   /* tp_next */
+#endif
+      };
+      varlink_type = tmp;
+      type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+      varlink_type.ob_type = &PyType_Type;
+#else
+      if (PyType_Ready(&varlink_type) < 0)
+      return NULL;
+#endif
+    }
+    return &varlink_type;
+  }
+  
+  /* Create a variable linking object for use later */
+  SWIGINTERN PyObject *
+  SWIG_Python_newvarlink(void) {
+    swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type());
+    if (result) {
+      result->vars = 0;
+    }
+    return ((PyObject*) result);
+  }
+  
+  SWIGINTERN void 
+  SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
+    swig_varlinkobject *v = (swig_varlinkobject *) p;
+    swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
+    if (gv) {
+      size_t size = strlen(name)+1;
+      gv->name = (char *)malloc(size);
+      if (gv->name) {
+        strncpy(gv->name,name,size);
+        gv->get_attr = get_attr;
+        gv->set_attr = set_attr;
+        gv->next = v->vars;
+      }
+    }
+    v->vars = gv;
+  }
+  
+  SWIGINTERN PyObject *
+  SWIG_globals(void) {
+    static PyObject *_SWIG_globals = 0; 
+    if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink();  
+    return _SWIG_globals;
+  }
+  
+  /* -----------------------------------------------------------------------------
+   * constants/methods manipulation
+   * ----------------------------------------------------------------------------- */
+  
+  /* Install Constants */
+  SWIGINTERN void
+  SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
+    PyObject *obj = 0;
+    size_t i;
+    for (i = 0; constants[i].type; ++i) {
+      switch(constants[i].type) {
+      case SWIG_PY_POINTER:
+        obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
+        break;
+      case SWIG_PY_BINARY:
+        obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
+        break;
+      default:
+        obj = 0;
+        break;
+      }
+      if (obj) {
+        PyDict_SetItemString(d, constants[i].name, obj);
+        Py_DECREF(obj);
+      }
+    }
+  }
+  
+  /* -----------------------------------------------------------------------------*/
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  /* -----------------------------------------------------------------------------*/
+  
+  SWIGINTERN void
+  SWIG_Python_FixMethods(PyMethodDef *methods,
+    swig_const_info *const_table,
+    swig_type_info **types,
+    swig_type_info **types_initial) {
+    size_t i;
+    for (i = 0; methods[i].ml_name; ++i) {
+      const char *c = methods[i].ml_doc;
+      if (!c) continue;
+      c = strstr(c, "swig_ptr: ");
+      if (c) {
+        int j;
+        swig_const_info *ci = 0;
+        const char *name = c + 10;
+        for (j = 0; const_table[j].type; ++j) {
+          if (strncmp(const_table[j].name, name, 
+              strlen(const_table[j].name)) == 0) {
+            ci = &(const_table[j]);
+            break;
+          }
+        }
+        if (ci) {
+          void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0;
+          if (ptr) {
+            size_t shift = (ci->ptype) - types;
+            swig_type_info *ty = types_initial[shift];
+            size_t ldoc = (c - methods[i].ml_doc);
+            size_t lptr = strlen(ty->name)+2*sizeof(void*)+2;
+            char *ndoc = (char*)malloc(ldoc + lptr + 10);
+            if (ndoc) {
+              char *buff = ndoc;
+              strncpy(buff, methods[i].ml_doc, ldoc);
+              buff += ldoc;
+              strncpy(buff, "swig_ptr: ", 10);
+              buff += 10;
+              SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
+              methods[i].ml_doc = ndoc;
+            }
+          }
+        }
+      }
+    }
+  } 
+  
+#ifdef __cplusplus
+}
+#endif
+
+/* -----------------------------------------------------------------------------*
+ *  Partial Init method
+ * -----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+SWIGEXPORT 
+#if PY_VERSION_HEX >= 0x03000000
+PyObject*
+#else
+void
+#endif
+SWIG_init(void) {
+  PyObject *m, *d, *md;
+#if PY_VERSION_HEX >= 0x03000000
+  static struct PyModuleDef SWIG_module = {
+# if PY_VERSION_HEX >= 0x03020000
+    PyModuleDef_HEAD_INIT,
+# else
+    {
+      PyObject_HEAD_INIT(NULL)
+      NULL, /* m_init */
+      0,    /* m_index */
+      NULL, /* m_copy */
+    },
+# endif
+    (char *) SWIG_name,
+    NULL,
+    -1,
+    SwigMethods,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+  };
+#endif
+  
+#if defined(SWIGPYTHON_BUILTIN)
+  static SwigPyClientData SwigPyObject_clientdata = {
+    0, 0, 0, 0, 0, 0, 0
+  };
+  static PyGetSetDef this_getset_def = {
+    (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL
+  };
+  static SwigPyGetSet thisown_getset_closure = {
+    (PyCFunction) SwigPyObject_own,
+    (PyCFunction) SwigPyObject_own
+  };
+  static PyGetSetDef thisown_getset_def = {
+    (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
+  };
+  PyObject *metatype_args;
+  PyTypeObject *builtin_pytype;
+  int builtin_base_count;
+  swig_type_info *builtin_basetype;
+  PyObject *tuple;
+  PyGetSetDescrObject *static_getset;
+  PyTypeObject *metatype;
+  SwigPyClientData *cd;
+  PyObject *public_interface, *public_symbol;
+  PyObject *this_descr;
+  PyObject *thisown_descr;
+  PyObject *self = 0;
+  int i;
+  
+  (void)builtin_pytype;
+  (void)builtin_base_count;
+  (void)builtin_basetype;
+  (void)tuple;
+  (void)static_getset;
+  (void)self;
+  
+  /* metatype is used to implement static member variables. */
+  metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type);
+  assert(metatype_args);
+  metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL);
+  assert(metatype);
+  Py_DECREF(metatype_args);
+  metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro;
+  assert(PyType_Ready(metatype) >= 0);
+#endif
+  
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial);
+  
+#if PY_VERSION_HEX >= 0x03000000
+  m = PyModule_Create(&SWIG_module);
+#else
+  m = Py_InitModule((char *) SWIG_name, SwigMethods);
+#endif
+  
+  md = d = PyModule_GetDict(m);
+  (void)md;
+  
+  SWIG_InitializeModule(0);
+  
+#ifdef SWIGPYTHON_BUILTIN
+  SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject");
+  assert(SwigPyObject_stype);
+  cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+  if (!cd) {
+    SwigPyObject_stype->clientdata = &SwigPyObject_clientdata;
+    SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce();
+  } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) {
+    PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules.");
+# if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+# else
+    return;
+# endif
+  }
+  
+  /* All objects have a 'this' attribute */
+  this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def);
+  (void)this_descr;
+  
+  /* All objects have a 'thisown' attribute */
+  thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def);
+  (void)thisown_descr;
+  
+  public_interface = PyList_New(0);
+  public_symbol = 0;
+  (void)public_symbol;
+  
+  PyDict_SetItemString(md, "__all__", public_interface);
+  Py_DECREF(public_interface);
+  for (i = 0; SwigMethods[i].ml_name != NULL; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name);
+  for (i = 0; swig_const_table[i].name != 0; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name);
+#endif
+  
+  SWIG_InstallConstants(d,swig_const_table);
+  
+  
+  import_array();
+  
+#if PY_VERSION_HEX >= 0x03000000
+  return m;
+#else
+  return;
+#endif
+}
+
diff --git a/auto/Wrap/libBornAgainFit_wrap.h b/auto/Wrap/libBornAgainFit_wrap.h
new file mode 100644
index 0000000..1aa4403
--- /dev/null
+++ b/auto/Wrap/libBornAgainFit_wrap.h
@@ -0,0 +1,18 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 3.0.8
+ *
+ * This file is not intended to be easily readable and contains a number of
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+#ifndef SWIG_libBornAgainFit_WRAP_H_
+#define SWIG_libBornAgainFit_WRAP_H_
+
+#include <map>
+#include <string>
+
+
+#endif
diff --git a/cmake/bornagain/CMakeLists.txt b/cmake/bornagain/CMakeLists.txt
new file mode 100644
index 0000000..f3bfbda
--- /dev/null
+++ b/cmake/bornagain/CMakeLists.txt
@@ -0,0 +1,23 @@
+# this script is a trick to print the message at the end of installation
+
+
+if(APPLE)
+    set(ld_library_variable DYLD_LIBRARY_PATH)
+else()
+    set(ld_library_variable LD_LIBRARY_PATH)
+endif()
+
+if(NOT WIN32 AND NOT BORNAGAIN_APPLE_BUNDLE)
+set(after_install_text "
+Installation done. Please read below.
+-------------------------------------------------------------------------------
+To use BornAgain, add the directory ${CMAKE_INSTALL_PREFIX}/${destination_lib}
+to your ${ld_library_variable} and PYTHONPATH.
+You can do it by running the command 'source ${CMAKE_INSTALL_PREFIX}/${destination_bin}/thisbornagain.sh'
+Just add this command into your .bashrc or .bash_profile file.
+-------------------------------------------------------------------------------
+")
+
+install(CODE "MESSAGE(\"${after_install_text}\")")
+
+endif()
diff --git a/cmake/bornagain/modules/BornAgainCPack.cmake b/cmake/bornagain/modules/BornAgainCPack.cmake
new file mode 100644
index 0000000..17493b9
--- /dev/null
+++ b/cmake/bornagain/modules/BornAgainCPack.cmake
@@ -0,0 +1,83 @@
+# BornAgain packaging
+
+include(InstallRequiredSystemLibraries)
+
+set(BORNAGAIN_VERSION "${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR}.${BornAgain_VERSION_PATCH}")
+
+set(CPACK_PACKAGE_NAME "BornAgain")
+set(CPACK_PACKAGE_DESCRIPTION "BornAgain: simulate and fit scattering at grazing incidence.")
+set(CPACK_PACKAGE_VENDOR "Forschungszentrum Juelich GmbH. Scientific Computing Group at MLZ Garching.")
+set(CPACK_PACKAGE_VERSION ${BORNAGAIN_VERSION})
+set(CPACK_PACKAGE_VERSION_MAJOR ${BornAgain_VERSION_MAJOR})
+set(CPACK_PACKAGE_VERSION_MINOR ${BornAgain_VERSION_MINOR})
+set(CPACK_PACKAGE_VERSION_PATCH ${BornAgain_VERSION_PATCH})
+
+configure_file(COPYING LICENSE.txt COPYONLY)
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_BINARY_DIR}/LICENSE.txt")
+
+# binary package setup
+set(CPACK_PACKAGE_RELOCATABLE True)
+
+if(CMAKE_BUILD_TYPE STREQUAL Release)
+    set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${BORNAGAIN_VERSION}-${BORNAGAIN_ARCHITECTURE}")
+else()
+    set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${BORNAGAIN_VERSION}-${BORNAGAIN_ARCHITECTURE}-${CMAKE_BUILD_TYPE}")
+endif()
+
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}-${BORNAGAIN_VERSION}")
+
+
+if(WIN32)
+    include(CPackWindows)
+elseif(APPLE)
+    include(CPackApple)
+elseif(UNIX AND BUILD_DEBIAN) # one can build debian package only on UNIX system
+    include(CPackDebian)
+else()
+  set(CPACK_GENERATOR "STGZ;TGZ")
+endif()
+
+
+# Generating the source package
+set(CPACK_SOURCE_GENERATOR "TGZ")
+set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
+
+# Specify which files do not include into the source package generated by make package_source
+set(CPACK_SOURCE_IGNORE_FILES
+    ${CPACK_SOURCE_IGNORE_FILES} # first take the default parameters
+    "/Doc/UserManual/"
+    "/dev-tools/edit-scripts/"
+    "/dev-tools/packaging/"
+    "/dev-tools/tmp-examples/"
+    "/dev-tools/tmp-unsorted/"
+    "/XCode_BornAgain.xcodeproj/"
+    "~$"
+    "/.git/"
+    "/\\\\.git/"
+    "/\\\\\\\\.git/"  # more screeneng symbols is neccesary because of double file processing by cmake and cpack
+    "\\\\\\\\.swp$"
+    "\\\\.swp$"
+    "/.metadata/"
+    "/.settings/"
+    "\\\\.cproject"
+    "\\\\.project"
+    "/\\\\.idea/"
+    "\\\\.lssrc"
+    "\\\\.gitignore"
+    "\\\\.DS_Store"
+    "\\\\.obj"
+    "CMakeLists.txt.user"
+    "/bin/release.sh.in" # user will not need it
+    "/cmake/modules/UseLATEX.cmake" # user will not need it
+    "/dev-tools/git-utils/cl_lines_of_code.py"
+    "/dev-tools/git-utils/qqq.png" # remove this line when unneeded
+    ".pro$"
+    ".pro.user$"
+    ".pri$"
+)
+    
+
+include(CPack)
+
+set(CPACK_COMPONENTS_ALL Libraries Headers Examples)
+
diff --git a/cmake/bornagain/modules/BornAgainConfiguration.cmake b/cmake/bornagain/modules/BornAgainConfiguration.cmake
new file mode 100644
index 0000000..4a98391
--- /dev/null
+++ b/cmake/bornagain/modules/BornAgainConfiguration.cmake
@@ -0,0 +1,157 @@
+###############################################################################
+# BornAgain project configuration
+###############################################################################
+
+# -----------------------------------------------------------------------------
+# Common policies
+# -----------------------------------------------------------------------------
+
+# --- from GUI section
+
+#if(POLICY CMP0020)
+#    cmake_policy(SET CMP0020 NEW)
+#endif()
+
+#if(POLICY CMP0043)
+#    cmake_policy(SET CMP0043 NEW)
+#endif()
+
+#if(POLICY CMP0028)
+#    cmake_policy(SET CMP0028 NEW)
+#endif()
+
+# -----------------------------------------------------------------------------
+# Common definitions
+# -----------------------------------------------------------------------------
+
+# suppress qDebug() output for release build
+if(CMAKE_BUILD_TYPE STREQUAL Release)
+    add_definitions(-DQT_NO_DEBUG_OUTPUT)
+endif()
+
+# -----------------------------------------------------------------------------
+# source directory paths
+# -----------------------------------------------------------------------------
+
+set(REFERENCE_DIR ${CMAKE_SOURCE_DIR}/Tests/ReferenceData)
+set(PY_EXAMPLES_DIR ${CMAKE_SOURCE_DIR}/Examples/python)
+
+# -----------------------------------------------------------------------------
+# cmake runtime output configuration
+# -----------------------------------------------------------------------------
+
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+set(BUILD_VAR_DIR ${CMAKE_BINARY_DIR}/var)
+set(BUILD_INC_DIR ${CMAKE_BINARY_DIR}/inc)
+set(BUILD_SRC_DIR ${CMAKE_BINARY_DIR}/src)
+configure_file("${TEMPLATE_DIR}/auto_README.in" "${CMAKE_SOURCE_DIR}/auto/README" @ONLY)
+
+file(MAKE_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+file(MAKE_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/bornagain)
+file(MAKE_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/exec)
+file(MAKE_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+file(MAKE_DIRECTORY ${BUILD_VAR_DIR})
+file(MAKE_DIRECTORY ${BUILD_INC_DIR})
+file(MAKE_DIRECTORY ${BUILD_SRC_DIR})
+
+# -----------------------------------------------------------------------------
+# file extensions
+# -----------------------------------------------------------------------------
+
+if(WIN32)
+    set(libprefix _lib)
+    set(libsuffix .dll)
+elseif(APPLE)
+    set(libprefix _lib)
+    set(libsuffix .so)
+else()
+    set(libprefix _lib)
+    set(libsuffix .so)
+endif()
+
+# -----------------------------------------------------------------------------
+# destinations
+# -----------------------------------------------------------------------------
+
+if(WIN32)
+    set(destination_bin bin)
+    set(destination_lib bin)
+    set(destination_gui bin)
+    set(destination_include include)
+    set(destination_examples Examples)
+    set(destination_images Images)
+    set(destination_libexec ${destination_bin})
+else()
+    set(destination_suffix BornAgain-${BornAgain_VERSION_MAJOR}.${BornAgain_VERSION_MINOR})
+    if(APPLE AND BORNAGAIN_APPLE_BUNDLE)
+        set(destination_bundle BornAgain.app)
+        set(destination_prefix ${destination_bundle}/Contents/)
+        set(destination_libexec ${destination_prefix}libexec/${destination_suffix})
+    else()
+        if(APPLE)
+            set(QTDIR $ENV{QTDIR})
+            message(STATUS "QTDIR is ${QTDIR}")
+            set(CMAKE_INSTALL_RPATH ${QTDIR}/lib)
+        endif()
+        set(destination_prefix "")
+        set(destination_libexec ${destination_prefix}lib/${destination_suffix})
+    endif()
+    set(destination_bin ${destination_prefix}bin)
+    set(destination_gui ${destination_libexec})
+    set(destination_lib ${destination_prefix}lib/${destination_suffix})
+    set(destination_include ${destination_prefix}include/${destination_suffix})
+    set(destination_share ${destination_prefix}share/${destination_suffix}/)
+    set(destination_examples ${destination_share}Examples)
+    set(destination_images ${destination_share}Images)
+endif()
+
+message(STATUS "Destination directories: bin->${destination_bin}, lib->${destination_lib}, gui&libexec->${destination_libexec}, include->${destination_include}, share->${destination_share}")
+
+# -----------------------------------------------------------------------------
+# configure files
+# -----------------------------------------------------------------------------
+
+if(BORNAGAIN_RELEASE)
+    # configure Doxyfile
+    configure_file(${CMAKE_SOURCE_DIR}/Doc/Doxygen/Doxyfile.in
+        ${CMAKE_SOURCE_DIR}/Doc/Doxygen/Doxyfile @ONLY)
+endif()
+
+configure_file(${TEMPLATE_DIR}/CTestCustom.cmake.in ${CMAKE_BINARY_DIR}/CTestCustom.cmake)
+
+configure_file(${TEMPLATE_DIR}/BAVersion.h.in  ${BUILD_INC_DIR}/BAVersion.h @ONLY)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${BUILD_INC_DIR}")
+
+configure_file(${CMAKE_SOURCE_DIR}/Examples/python/utils/plot_intensity_data.py
+    ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/view1.py @ONLY)
+configure_file(${CMAKE_SOURCE_DIR}/Examples/python/utils/plot_intensity_data_diff.py
+    ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/view2.py @ONLY)
+
+# -----------------------------------------------------------------------------
+# configure BornAgain launch scripts
+# -----------------------------------------------------------------------------
+
+set(this_bindir $BORNAGAINSYS/bin)
+set(this_libdir $BORNAGAINSYS/lib/${destination_suffix})
+configure_file(${TEMPLATE_DIR}/thisbornagain.sh.in
+    ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.sh @ONLY)
+configure_file(${TEMPLATE_DIR}/thisbornagain.csh.in
+    ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/thisbornagain.csh @ONLY)
+
+# -----------------------------------------------------------------------------
+# configure postinst and prerm for the debian package
+# -----------------------------------------------------------------------------
+
+if(BUILD_DEBIAN)
+    set(CMAKE_INSTALL_PREFIX "/usr")
+    execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c
+        "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix=None)"
+        OUTPUT_VARIABLE PYTHON_SITE_PACKAGES
+        OUTPUT_STRIP_TRAILING_WHITESPACE )
+    configure_file(${TEMPLATE_DIR}/postinst.in ${BUILD_VAR_DIR}/postinst @ONLY)
+    configure_file(${TEMPLATE_DIR}/prerm.in ${BUILD_VAR_DIR}/prerm @ONLY)
+    set(CMAKE_INSTALL_RPATH \$ORIGIN/../../lib/${destination_suffix})
+endif(BUILD_DEBIAN)
diff --git a/cmake/bornagain/modules/CPackApple.cmake b/cmake/bornagain/modules/CPackApple.cmake
new file mode 100644
index 0000000..3bdedd2
--- /dev/null
+++ b/cmake/bornagain/modules/CPackApple.cmake
@@ -0,0 +1,7 @@
+# BornAgain Mac packaging 
+
+set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${BORNAGAIN_VERSION}-${BORNAGAIN_ARCHITECTURE}-10.9+")
+set(CPACK_BINARY_DRAGNDROP ON)
+set(CPACK_GENERATOR "DragNDrop")
+
+
diff --git a/cmake/bornagain/modules/CPackDebian.cmake b/cmake/bornagain/modules/CPackDebian.cmake
new file mode 100644
index 0000000..6b94d28
--- /dev/null
+++ b/cmake/bornagain/modules/CPackDebian.cmake
@@ -0,0 +1,47 @@
+# BornAgain debian packaging
+set(CPACK_GENERATOR "DEB")
+
+# parameters to build a debian package
+set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Marina Ganeva <m.ganeva at fz-juelich.de>")
+
+# Architecture: (mandatory)
+IF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
+    # There is no such thing as i686 architecture on debian, you should use i386 instead
+    # $ dpkg --print-architecture
+    FIND_PROGRAM(DPKG_CMD dpkg)
+    IF(NOT DPKG_CMD)
+        MESSAGE(STATUS "Can not find dpkg in your path, default to i386.")
+        SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
+    ENDIF(NOT DPKG_CMD)
+    EXECUTE_PROCESS(COMMAND "${DPKG_CMD}" --print-architecture
+        OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+ENDIF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
+
+
+set(CPACK_DEBIAN_PACKAGE_NAME "${CPACK_PACKAGE_NAME}")
+set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
+set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
+set(CPACK_STRIP_FILES "TRUE")
+set(CPACK_DEBIAN_PACKAGE_DEPENDS "libgsl0ldbl(>=1.15), libboost-date-time${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}, libboost-chrono${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}, libboost-python${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}, libboost-program-options${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}, libboost-iostreams${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_S [...]
+set(CPACK_DEBIAN_PACKAGE_DESCRIPTION    "${CPACK_PACKAGE_DESCRIPTION}")
+set(CPACK_DEBIAN_PACKAGE_VERSION ${BornAgain_VERSION_PATCH})
+set(CPACK_PACKAGE_FILE_NAME "${CPACK_DEBIAN_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}-${CPACK_DEBIAN_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
+set(CPACK_DEBIAN_PACKAGE_CONFLICTS "${CPACK_DEBIAN_PACKAGE_NAME}(<=${BORNAGAIN_VERSION})")
+
+# set postinstall and preremove scripts for the debian package
+set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${BUILD_VAR_DIR}/postinst;${BUILD_VAR_DIR}/prerm;")
+
+# write copyrite file
+file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/copyright" INPUT "${CMAKE_SOURCE_DIR}/COPYING")
+
+install(FILES "${CMAKE_BINARY_DIR}/copyright"
+        DESTINATION "share/${destination_suffix}")
+
+
+# write changelog file
+execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/CHANGELOG" "${CMAKE_BINARY_DIR}/changelog")
+# execute_process(COMMAND gzip -9 "${CMAKE_BINARY_DIR}/changelog" OUTPUT_FILE "${CMAKE_BINARY_DIR}/changelog.gz")
+execute_process(COMMAND gzip -9 "${CMAKE_BINARY_DIR}/changelog")
+install(FILES "${CMAKE_BINARY_DIR}/changelog.gz" DESTINATION "share/${destination_suffix}")
diff --git a/cmake/bornagain/modules/CPackWindows.cmake b/cmake/bornagain/modules/CPackWindows.cmake
new file mode 100644
index 0000000..5809bfb
--- /dev/null
+++ b/cmake/bornagain/modules/CPackWindows.cmake
@@ -0,0 +1,52 @@
+# BornAgain Windows packaging 
+
+set(CPACK_GENERATOR "NSIS")  
+
+#set(CPACK_NSIS_MODIFY_PATH ON)
+set( CPACK_NSIS_INSTALL_ROOT "C:")
+set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
+
+set( CPACK_NSIS_MENU_LINKS "bin\\\\BornAgain.exe" "BornAgain")
+
+
+set( CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/GUI\\\\coregui\\\\images\\\\BornAgain.ico" )
+set( CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/GUI\\\\coregui\\\\images\\\\BornAgain.ico" )
+set( CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/GUI\\\\coregui\\\\images\\\\BornAgain.ico" )
+
+set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
+  Push \\\"PATH\\\" 
+  Push \\\"P\\\" 
+  Push \\\"HKCU\\\" 
+  Push \\\"$INSTDIR\\\\bin\\\" 
+  Call EnvVarUpdate
+  Pop  \\\$0
+
+  Push \\\"PYTHONPATH\\\" 
+  Push \\\"P\\\" 
+  Push \\\"HKLM\\\" 
+  Push \\\"$INSTDIR\\\\bin\\\" 
+  Call EnvVarUpdate
+  Pop  \\\$0
+
+  CreateShortCut \\\"$DESKTOP\\\\BornAgain.lnk\\\" \\\"$INSTDIR\\\\bin\\\\BornAgain.exe\\\"
+")
+        
+set (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
+  Push \\\"PATH\\\"
+  Push \\\"R\\\"
+  Push \\\"HKCU\\\"
+  Push \\\"$INSTDIR\\\\bin\\\"
+  Call un.EnvVarUpdate
+  Pop  \\\$0
+
+  Push \\\"PYTHONPATH\\\"
+  Push \\\"R\\\"
+  Push \\\"HKLM\\\"
+  Push \\\"$INSTDIR\\\\bin\\\"
+  Call un.EnvVarUpdate
+  Pop  \\\$0
+
+  Delete \\\"$DESKTOP\\\\BornAgain.lnk\\\"
+
+")
+
diff --git a/cmake/bornagain/modules/CheckCode.cmake b/cmake/bornagain/modules/CheckCode.cmake
new file mode 100644
index 0000000..762a9c1
--- /dev/null
+++ b/cmake/bornagain/modules/CheckCode.cmake
@@ -0,0 +1,12 @@
+set(SRC_LEN_LIM 100) # maximum line length of code written by MLZ-SCG
+
+if(NOT MSVC)
+
+file(GLOB_RECURSE SRC1 "Core/*.cpp")
+file(GLOB_RECURSE SRC2 "Core/*.h")
+
+add_test(NAME "CodeLineLength"
+    COMMAND  ${PYTHON_EXECUTABLE}
+    ${CMAKE_SOURCE_DIR}/dev-tools/analyze/count-line-length.py ${SRC_LEN_LIM}
+    ${SRC1} ${SRC2})
+endif()
diff --git a/cmake/bornagain/modules/CheckCompiler.cmake b/cmake/bornagain/modules/CheckCompiler.cmake
new file mode 100644
index 0000000..0ffd428
--- /dev/null
+++ b/cmake/bornagain/modules/CheckCompiler.cmake
@@ -0,0 +1,84 @@
+#---------------------------------------------------------------------------------------------------
+#  CheckCompiler.cmake
+#---------------------------------------------------------------------------------------------------
+
+#----Test if clang setup works----------------------------------------------------------------------
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+    execute_process(COMMAND ${CMAKE_C_COMPILER} -v
+        OUTPUT_VARIABLE _clang_version_info
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    string(REGEX REPLACE "^.*[ ]([0-9]+)\\.[0-9].*$" "\\1" CLANG_MAJOR "${_clang_version_info}")
+    string(REGEX REPLACE "^.*[ ][0-9]+\\.([0-9]).*$" "\\1" CLANG_MINOR "${_clang_version_info}")
+else()
+    set(CLANG_MAJOR 0)
+    set(CLANG_MINOR 0)
+endif()
+
+#---Obtain the major and minor version of the GNU compiler------------------------------------------
+if (CMAKE_COMPILER_IS_GNUCXX)
+    execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
+        OUTPUT_VARIABLE _gcc_version_info
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    string(REGEX REPLACE "^([0-9]+).*$"                   "\\1" GCC_MAJOR ${_gcc_version_info})
+    string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*$"          "\\1" GCC_MINOR ${_gcc_version_info})
+    string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" GCC_PATCH ${_gcc_version_info})
+
+    if(GCC_PATCH MATCHES "\\.+")
+        set(GCC_PATCH "")
+    endif()
+    if(GCC_MINOR MATCHES "\\.+")
+        set(GCC_MINOR "")
+    endif()
+    if(GCC_MAJOR MATCHES "\\.+")
+        set(GCC_MAJOR "")
+    endif()
+    message(STATUS "Found GCC. Major version ${GCC_MAJOR}, minor version ${GCC_MINOR}")
+    set(COMPILER_VERSION gcc${GCC_MAJOR}${GCC_MINOR}${GCC_PATCH})
+else()
+    set(GCC_MAJOR 0)
+    set(GCC_MINOR 0)
+endif()
+
+#---Set a default build type for single-configuration CMake generators if no build type is set------
+if(NOT CMAKE_BUILD_TYPE)
+    #  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "" FORCE)
+    set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
+endif()
+message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
+
+#---Need to locate thead libraries and options to set properly some compilation flags---------------
+find_package(Threads)
+
+#---Setup details depending on the major platform type----------------------------------------------
+if(CMAKE_SYSTEM_NAME MATCHES Linux)
+    include(SetUpLinux)
+elseif(APPLE)
+    include(SetUpMacOS)
+elseif(WIN32)
+    include(SetUpWindows)
+endif()
+
+#---Setup details depending on the compiler type----------------------------------------------------
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
+        "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+else()
+    message(FATAL_ERROR "No known c++ compiler found")
+endif()
+
+#---Print the final compiler flags------------------------------------------------------------------
+message(STATUS "BornAgain Platform: ${BORNAGAIN_PLATFORM}")
+message(STATUS "BornAgain Architecture: ${BORNAGAIN_ARCHITECTURE}")
+message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
+
+set(all_cxx_flags ${CMAKE_CXX_FLAGS})
+if(CMAKE_BUILD_TYPE STREQUAL "Release")
+    set(all_cxx_flags "${all_cxx_flags} ${CMAKE_CXX_FLAGS_RELEASE}")
+elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
+    set(all_cxx_flags "${all_cxx_flags} ${CMAKE_CXX_FLAGS_DEBUG}")
+elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
+    set(all_cxx_flags "${all_cxx_flags} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
+endif()
+
+message(STATUS "Compiler Flags: ${all_cxx_flags}")
diff --git a/cmake/bornagain/modules/FixAppleBundle.cmake.in b/cmake/bornagain/modules/FixAppleBundle.cmake.in
new file mode 100644
index 0000000..c4fbfb4
--- /dev/null
+++ b/cmake/bornagain/modules/FixAppleBundle.cmake.in
@@ -0,0 +1,6 @@
+###############################################################################
+# Runs Python script to fix dependencies in Apple bundle
+###############################################################################
+
+set(bundle ${CMAKE_INSTALL_PREFIX}/BornAgain.app )
+execute_process(COMMAND @PYTHON_EXECUTABLE@ @CMAKE_SOURCE_DIR@/cmake/bornagain/scripts/fix_apple_bundle.py ${bundle})
diff --git a/cmake/bornagain/modules/GeneratePythonDocs.cmake b/cmake/bornagain/modules/GeneratePythonDocs.cmake
new file mode 100644
index 0000000..85497ae
--- /dev/null
+++ b/cmake/bornagain/modules/GeneratePythonDocs.cmake
@@ -0,0 +1,21 @@
+# Autogenerate a .i file from doxygen comments, provided -DBORNAGAIN_GENERATE_PYTHON_DOCS=ON.
+
+function(GeneratePythonDocs PD_TARGET SWIG_DIR)
+    if(BORNAGAIN_GENERATE_PYTHON_DOCS)
+
+        configure_file(${SWIG_DIR}/DoxyfileSwig.in ${TMP_DIR}/Doxyfile @ONLY)
+
+        add_custom_command(
+            OUTPUT ${TMP_DIR}/xml/index.xml
+            COMMAND ${DOXYGEN_EXECUTABLE} ${TMP_DIR}/Doxyfile
+            DEPENDS ${include_files}
+            )
+        add_custom_command(
+            OUTPUT ${PD_TARGET}
+            COMMAND ${PYTHON_EXECUTABLE} ${SWIG_DIR}/doxy2swig.py
+            ${TMP_DIR}/xml/index.xml ${PD_TARGET}
+            DEPENDS ${TMP_DIR}/xml/index.xml
+            )
+
+    endif(BORNAGAIN_GENERATE_PYTHON_DOCS)
+endfunction()
diff --git a/cmake/bornagain/modules/NSIS.InstallOptions.ini.in b/cmake/bornagain/modules/NSIS.InstallOptions.ini.in
new file mode 100644
index 0000000..0cf03ff
--- /dev/null
+++ b/cmake/bornagain/modules/NSIS.InstallOptions.ini.in
@@ -0,0 +1,46 @@
+[Settings]
+NumFields=5
+
+[Field 1]
+Type=label
+Text=By default @CPACK_PACKAGE_INSTALL_DIRECTORY@ adds its directory to the system PATH.
+Left=0
+Right=-1
+Top=0
+Bottom=20
+
+[Field 2]
+Type=radiobutton
+Text=Do not add @CPACK_PACKAGE_NAME@ to the system PATH
+Left=0
+Right=-1
+Top=30
+Bottom=40
+State=0
+
+[Field 3]
+Type=radiobutton
+Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for all users
+Left=0
+Right=-1
+Top=40
+Bottom=50
+State=1
+
+[Field 4]
+Type=radiobutton
+Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for current user
+Left=0
+Right=-1
+Top=50
+Bottom=60
+State=0
+
+[Field 5]
+Type=CheckBox
+Text=Create @CPACK_PACKAGE_NAME@ Desktop Icon
+Left=0
+Right=-1
+Top=80
+Bottom=90
+State=0
diff --git a/cmake/bornagain/modules/NSIS.template.in b/cmake/bornagain/modules/NSIS.template.in
new file mode 100644
index 0000000..5034d49
--- /dev/null
+++ b/cmake/bornagain/modules/NSIS.template.in
@@ -0,0 +1,1230 @@
+; CPack install script designed for a nmake build
+
+;--------------------------------
+; You must define these values
+
+  !define VERSION "@CPACK_PACKAGE_VERSION@"
+  !define PATCH  "@CPACK_PACKAGE_VERSION_PATCH@"
+  !define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"
+
+;--------------------------------
+;Variables
+
+  Var MUI_TEMP
+  Var STARTMENU_FOLDER
+  Var SV_ALLUSERS
+  Var START_MENU
+  Var DO_NOT_ADD_TO_PATH
+  Var ADD_TO_PATH_ALL_USERS
+  Var ADD_TO_PATH_CURRENT_USER
+  Var INSTALL_DESKTOP
+  Var IS_DEFAULT_INSTALLDIR
+;--------------------------------
+;Include Modern UI
+
+  !include "MUI.nsh"
+
+  ;Default installation folder
+  InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
+
+;--------------------------------
+;General
+
+  ;Name and file
+  Name "@CPACK_NSIS_PACKAGE_NAME@"
+  OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
+
+  ;Set compression
+  SetCompressor @CPACK_NSIS_COMPRESSOR@
+
+  ;Require administrator access
+  RequestExecutionLevel admin
+
+ at CPACK_NSIS_DEFINES@
+
+  !include Sections.nsh
+
+;--- Component support macros: ---
+; The code for the add/remove functionality is from:
+;   http://nsis.sourceforge.net/Add/Remove_Functionality
+; It has been modified slightly and extended to provide
+; inter-component dependencies.
+Var AR_SecFlags
+Var AR_RegFlags
+ at CPACK_NSIS_SECTION_SELECTED_VARS@
+
+; Loads the "selected" flag for the section named SecName into the
+; variable VarName.
+!macro LoadSectionSelectedIntoVar SecName VarName
+ SectionGetFlags ${${SecName}} $${VarName}
+ IntOp $${VarName} $${VarName} & ${SF_SELECTED}  ;Turn off all other bits
+!macroend
+
+; Loads the value of a variable... can we get around this?
+!macro LoadVar VarName
+  IntOp $R0 0 + $${VarName}
+!macroend
+
+; Sets the value of a variable
+!macro StoreVar VarName IntValue
+  IntOp $${VarName} 0 + ${IntValue}
+!macroend
+
+!macro InitSection SecName
+  ;  This macro reads component installed flag from the registry and
+  ;changes checked state of the section on the components page.
+  ;Input: section index constant name specified in Section command.
+
+  ClearErrors
+  ;Reading component status from registry
+  ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed"
+  IfErrors "default_${SecName}"
+    ;Status will stay default if registry value not found
+    ;(component was never installed)
+  IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits
+  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading default section flags
+  IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE  ;Turn lowest (enabled) bit off
+  IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags      ;Change lowest bit
+
+  ; Note whether this component was installed before
+  !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags
+  IntOp $R0 $AR_RegFlags & $AR_RegFlags
+
+  ;Writing modified flags
+  SectionSetFlags ${${SecName}} $AR_SecFlags
+
+ "default_${SecName}:"
+ !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
+!macroend
+
+!macro FinishSection SecName
+  ;  This macro reads section flag set by user and removes the section
+  ;if it is not selected.
+  ;Then it writes component installed flag to registry
+  ;Input: section index constant name specified in Section command.
+
+  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading section flags
+  ;Checking lowest bit:
+  IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}
+  IntCmp $AR_SecFlags 1 "leave_${SecName}"
+    ;Section is not selected:
+    ;Calling Section uninstall macro and writing zero installed flag
+    !insertmacro "Remove_${${SecName}}"
+    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
+  "Installed" 0
+    Goto "exit_${SecName}"
+
+ "leave_${SecName}:"
+    ;Section is selected:
+    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
+  "Installed" 1
+
+ "exit_${SecName}:"
+!macroend
+
+!macro RemoveSection_CPack SecName
+  ;  This macro is used to call section's Remove_... macro
+  ;from the uninstaller.
+  ;Input: section index constant name specified in Section command.
+
+  !insertmacro "Remove_${${SecName}}"
+!macroend
+
+; Determine whether the selection of SecName changed
+!macro MaybeSelectionChanged SecName
+  !insertmacro LoadVar ${SecName}_selected
+  SectionGetFlags ${${SecName}} $R1
+  IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits
+
+  ; See if the status has changed:
+  IntCmp $R0 $R1 "${SecName}_unchanged"
+  !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
+
+  IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected"
+  !insertmacro "Deselect_required_by_${SecName}"
+  goto "${SecName}_unchanged"
+
+  "${SecName}_was_selected:"
+  !insertmacro "Select_${SecName}_depends"
+
+  "${SecName}_unchanged:"
+!macroend
+;--- End of Add/Remove macros ---
+
+;--------------------------------
+;Interface Settings
+
+  !define MUI_HEADERIMAGE
+  !define MUI_ABORTWARNING
+
+;--------------------------------
+; path functions
+
+!verbose 3
+!include "WinMessages.NSH"
+!verbose 4
+
+;----------------------------------------
+; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"
+;----------------------------------------
+!verbose 3
+!include "WinMessages.NSH"
+!verbose 4
+;====================================================
+; get_NT_environment
+;     Returns: the selected environment
+;     Output : head of the stack
+;====================================================
+!macro select_NT_profile UN
+Function ${UN}select_NT_profile
+   StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single
+      DetailPrint "Selected environment for all users"
+      Push "all"
+      Return
+   environment_single:
+      DetailPrint "Selected environment for current user only."
+      Push "current"
+      Return
+FunctionEnd
+!macroend
+!insertmacro select_NT_profile ""
+!insertmacro select_NT_profile "un."
+;----------------------------------------------------
+!define NT_current_env 'HKCU "Environment"'
+!define NT_all_env     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+
+!ifndef WriteEnvStr_RegKey
+  !ifdef ALL_USERS
+    !define WriteEnvStr_RegKey \
+       'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+  !else
+    !define WriteEnvStr_RegKey 'HKCU "Environment"'
+  !endif
+!endif
+
+; AddToPath - Adds the given dir to the search path.
+;        Input - head of the stack
+;        Note - Win9x systems requires reboot
+
+Function AddToPath
+  Exch $0
+  Push $1
+  Push $2
+  Push $3
+
+  # don't add if the path doesn't exist
+  IfFileExists "$0\*.*" "" AddToPath_done
+
+  ReadEnvStr $1 PATH
+  ; if the path is too long for a NSIS variable NSIS will return a 0
+  ; length string.  If we find that, then warn and skip any path
+  ; modification as it will trash the existing path.
+  StrLen $2 $1
+  IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done
+    CheckPathLength_ShowPathWarning:
+    Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!"
+    Goto AddToPath_done
+  CheckPathLength_Done:
+  Push "$1;"
+  Push "$0;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+  Push "$1;"
+  Push "$0\;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+  GetFullPathName /SHORT $3 $0
+  Push "$1;"
+  Push "$3;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+  Push "$1;"
+  Push "$3\;"
+  Call StrStr
+  Pop $2
+  StrCmp $2 "" "" AddToPath_done
+
+  Call IsNT
+  Pop $1
+  StrCmp $1 1 AddToPath_NT
+    ; Not on NT
+    StrCpy $1 $WINDIR 2
+    FileOpen $1 "$1\autoexec.bat" a
+    FileSeek $1 -1 END
+    FileReadByte $1 $2
+    IntCmp $2 26 0 +2 +2 # DOS EOF
+      FileSeek $1 -1 END # write over EOF
+    FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
+    FileClose $1
+    SetRebootFlag true
+    Goto AddToPath_done
+
+  AddToPath_NT:
+    StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey
+      ReadRegStr $1 ${NT_current_env} "PATH"
+      Goto DoTrim
+    ReadAllKey:
+      ReadRegStr $1 ${NT_all_env} "PATH"
+    DoTrim:
+    StrCmp $1 "" AddToPath_NTdoIt
+      Push $1
+      Call Trim
+      Pop $1
+      StrCpy $0 "$1;$0"
+    AddToPath_NTdoIt:
+      StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey
+        WriteRegExpandStr ${NT_current_env} "PATH" $0
+        Goto DoSend
+      WriteAllKey:
+        WriteRegExpandStr ${NT_all_env} "PATH" $0
+      DoSend:
+      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+  AddToPath_done:
+    Pop $3
+    Pop $2
+    Pop $1
+    Pop $0
+FunctionEnd
+
+
+; RemoveFromPath - Remove a given dir from the path
+;     Input: head of the stack
+
+Function un.RemoveFromPath
+  Exch $0
+  Push $1
+  Push $2
+  Push $3
+  Push $4
+  Push $5
+  Push $6
+
+  IntFmt $6 "%c" 26 # DOS EOF
+
+  Call un.IsNT
+  Pop $1
+  StrCmp $1 1 unRemoveFromPath_NT
+    ; Not on NT
+    StrCpy $1 $WINDIR 2
+    FileOpen $1 "$1\autoexec.bat" r
+    GetTempFileName $4
+    FileOpen $2 $4 w
+    GetFullPathName /SHORT $0 $0
+    StrCpy $0 "SET PATH=%PATH%;$0"
+    Goto unRemoveFromPath_dosLoop
+
+    unRemoveFromPath_dosLoop:
+      FileRead $1 $3
+      StrCpy $5 $3 1 -1 # read last char
+      StrCmp $5 $6 0 +2 # if DOS EOF
+        StrCpy $3 $3 -1 # remove DOS EOF so we can compare
+      StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine
+      StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine
+      StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine
+      StrCmp $3 "" unRemoveFromPath_dosLoopEnd
+      FileWrite $2 $3
+      Goto unRemoveFromPath_dosLoop
+      unRemoveFromPath_dosLoopRemoveLine:
+        SetRebootFlag true
+        Goto unRemoveFromPath_dosLoop
+
+    unRemoveFromPath_dosLoopEnd:
+      FileClose $2
+      FileClose $1
+      StrCpy $1 $WINDIR 2
+      Delete "$1\autoexec.bat"
+      CopyFiles /SILENT $4 "$1\autoexec.bat"
+      Delete $4
+      Goto unRemoveFromPath_done
+
+  unRemoveFromPath_NT:
+    StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey
+      ReadRegStr $1 ${NT_current_env} "PATH"
+      Goto unDoTrim
+    unReadAllKey:
+      ReadRegStr $1 ${NT_all_env} "PATH"
+    unDoTrim:
+    StrCpy $5 $1 1 -1 # copy last char
+    StrCmp $5 ";" +2 # if last char != ;
+      StrCpy $1 "$1;" # append ;
+    Push $1
+    Push "$0;"
+    Call un.StrStr ; Find `$0;` in $1
+    Pop $2 ; pos of our dir
+    StrCmp $2 "" unRemoveFromPath_done
+      ; else, it is in path
+      # $0 - path to add
+      # $1 - path var
+      StrLen $3 "$0;"
+      StrLen $4 $2
+      StrCpy $5 $1 -$4 # $5 is now the part before the path to remove
+      StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove
+      StrCpy $3 $5$6
+
+      StrCpy $5 $3 1 -1 # copy last char
+      StrCmp $5 ";" 0 +2 # if last char == ;
+        StrCpy $3 $3 -1 # remove last char
+
+      StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey
+        WriteRegExpandStr ${NT_current_env} "PATH" $3
+        Goto unDoSend
+      unWriteAllKey:
+        WriteRegExpandStr ${NT_all_env} "PATH" $3
+      unDoSend:
+      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+
+  unRemoveFromPath_done:
+    Pop $6
+    Pop $5
+    Pop $4
+    Pop $3
+    Pop $2
+    Pop $1
+    Pop $0
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Uninstall sutff
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+###########################################
+#            Utility Functions            #
+###########################################
+
+;====================================================
+; IsNT - Returns 1 if the current system is NT, 0
+;        otherwise.
+;     Output: head of the stack
+;====================================================
+; IsNT
+; no input
+; output, top of the stack = 1 if NT or 0 if not
+;
+; Usage:
+;   Call IsNT
+;   Pop $R0
+;  ($R0 at this point is 1 or 0)
+
+!macro IsNT un
+Function ${un}IsNT
+  Push $0
+  ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
+  StrCmp $0 "" 0 IsNT_yes
+  ; we are not NT.
+  Pop $0
+  Push 0
+  Return
+
+  IsNT_yes:
+    ; NT!!!
+    Pop $0
+    Push 1
+FunctionEnd
+!macroend
+!insertmacro IsNT ""
+!insertmacro IsNT "un."
+
+Function Trim ; Added by Pelaca
+	Exch $R1
+	Push $R2
+Loop:
+	StrCpy $R2 "$R1" 1 -1
+	StrCmp "$R2" " " RTrim
+	StrCmp "$R2" "$\n" RTrim
+	StrCmp "$R2" "$\r" RTrim
+	StrCmp "$R2" ";" RTrim
+	GoTo Done
+RTrim:
+	StrCpy $R1 "$R1" -1
+	Goto Loop
+Done:
+	Pop $R2
+	Exch $R1
+FunctionEnd
+
+Function ConditionalAddToRegisty
+  Pop $0
+  Pop $1
+  StrCmp "$0" "" ConditionalAddToRegisty_EmptyString
+    WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \
+    "$1" "$0"
+    ;MessageBox MB_OK "Set Registry: '$1' to '$0'"
+    DetailPrint "Set install registry entry: '$1' to '$0'"
+  ConditionalAddToRegisty_EmptyString:
+FunctionEnd
+
+;--------------------------------
+
+!ifdef CPACK_USES_DOWNLOAD
+Function DownloadFile
+    IfFileExists $INSTDIR\* +2
+    CreateDirectory $INSTDIR
+    Pop $0
+
+    ; Skip if already downloaded
+    IfFileExists $INSTDIR\$0 0 +2
+    Return
+
+    StrCpy $1 "@CPACK_DOWNLOAD_SITE@"
+
+  try_again:
+    NSISdl::download "$1/$0" "$INSTDIR\$0"
+
+    Pop $1
+    StrCmp $1 "success" success
+    StrCmp $1 "Cancelled" cancel
+    MessageBox MB_OK "Download failed: $1"
+  cancel:
+    Return
+  success:
+FunctionEnd
+!endif
+
+;--------------------------------
+; Installation types
+ at CPACK_NSIS_INSTALLATION_TYPES@
+
+;--------------------------------
+; Component sections
+ at CPACK_NSIS_COMPONENT_SECTIONS@
+
+;--------------------------------
+; Define some macro setting for the gui
+ at CPACK_NSIS_INSTALLER_MUI_ICON_CODE@
+ at CPACK_NSIS_INSTALLER_ICON_CODE@
+ at CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@
+ at CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@
+
+;--------------------------------
+;Pages
+  !insertmacro MUI_PAGE_WELCOME
+
+  !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"
+  Page custom InstallOptionsPage
+  !insertmacro MUI_PAGE_DIRECTORY
+
+  ;Start Menu Folder Page Configuration
+  !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
+  !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+  !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
+  !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
+
+  @CPACK_NSIS_PAGE_COMPONENTS@
+
+  !insertmacro MUI_PAGE_INSTFILES
+  !insertmacro MUI_PAGE_FINISH
+
+  !insertmacro MUI_UNPAGE_CONFIRM
+  !insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+
+  !insertmacro MUI_LANGUAGE "English" ;first language is the default language
+  !insertmacro MUI_LANGUAGE "Albanian"
+  !insertmacro MUI_LANGUAGE "Arabic"
+  !insertmacro MUI_LANGUAGE "Basque"
+  !insertmacro MUI_LANGUAGE "Belarusian"
+  !insertmacro MUI_LANGUAGE "Bosnian"
+  !insertmacro MUI_LANGUAGE "Breton"
+  !insertmacro MUI_LANGUAGE "Bulgarian"
+  !insertmacro MUI_LANGUAGE "Croatian"
+  !insertmacro MUI_LANGUAGE "Czech"
+  !insertmacro MUI_LANGUAGE "Danish"
+  !insertmacro MUI_LANGUAGE "Dutch"
+  !insertmacro MUI_LANGUAGE "Estonian"
+  !insertmacro MUI_LANGUAGE "Farsi"
+  !insertmacro MUI_LANGUAGE "Finnish"
+  !insertmacro MUI_LANGUAGE "French"
+  !insertmacro MUI_LANGUAGE "German"
+  !insertmacro MUI_LANGUAGE "Greek"
+  !insertmacro MUI_LANGUAGE "Hebrew"
+  !insertmacro MUI_LANGUAGE "Hungarian"
+  !insertmacro MUI_LANGUAGE "Icelandic"
+  !insertmacro MUI_LANGUAGE "Indonesian"
+  !insertmacro MUI_LANGUAGE "Irish"
+  !insertmacro MUI_LANGUAGE "Italian"
+  !insertmacro MUI_LANGUAGE "Japanese"
+  !insertmacro MUI_LANGUAGE "Korean"
+  !insertmacro MUI_LANGUAGE "Kurdish"
+  !insertmacro MUI_LANGUAGE "Latvian"
+  !insertmacro MUI_LANGUAGE "Lithuanian"
+  !insertmacro MUI_LANGUAGE "Luxembourgish"
+  !insertmacro MUI_LANGUAGE "Macedonian"
+  !insertmacro MUI_LANGUAGE "Malay"
+  !insertmacro MUI_LANGUAGE "Mongolian"
+  !insertmacro MUI_LANGUAGE "Norwegian"
+  !insertmacro MUI_LANGUAGE "Polish"
+  !insertmacro MUI_LANGUAGE "Portuguese"
+  !insertmacro MUI_LANGUAGE "PortugueseBR"
+  !insertmacro MUI_LANGUAGE "Romanian"
+  !insertmacro MUI_LANGUAGE "Russian"
+  !insertmacro MUI_LANGUAGE "Serbian"
+  !insertmacro MUI_LANGUAGE "SerbianLatin"
+  !insertmacro MUI_LANGUAGE "SimpChinese"
+  !insertmacro MUI_LANGUAGE "Slovak"
+  !insertmacro MUI_LANGUAGE "Slovenian"
+  !insertmacro MUI_LANGUAGE "Spanish"
+  !insertmacro MUI_LANGUAGE "Swedish"
+  !insertmacro MUI_LANGUAGE "Thai"
+  !insertmacro MUI_LANGUAGE "TradChinese"
+  !insertmacro MUI_LANGUAGE "Turkish"
+  !insertmacro MUI_LANGUAGE "Ukrainian"
+  !insertmacro MUI_LANGUAGE "Welsh"
+
+
+;--------------------------------
+;Reserve Files
+
+  ;These files should be inserted before other files in the data block
+  ;Keep these lines before any File command
+  ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA)
+
+  ReserveFile "NSIS.InstallOptions.ini"
+  !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+
+;--------------------------------
+;Installer Sections
+
+Section "-Core installation"
+  ;Use the entire tree produced by the INSTALL target.  Keep the
+  ;list of directories here in sync with the RMDir commands below.
+  SetOutPath "$INSTDIR"
+  @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@
+  @CPACK_NSIS_FULL_INSTALL@
+
+  ;Store installation folder
+  WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR
+
+  ;Create uninstaller
+  WriteUninstaller "$INSTDIR\Uninstall.exe"
+  Push "DisplayName"
+  Push "@CPACK_NSIS_DISPLAY_NAME@"
+  Call ConditionalAddToRegisty
+  Push "DisplayVersion"
+  Push "@CPACK_PACKAGE_VERSION@"
+  Call ConditionalAddToRegisty
+  Push "Publisher"
+  Push "@CPACK_PACKAGE_VENDOR@"
+  Call ConditionalAddToRegisty
+  Push "UninstallString"
+  Push "$INSTDIR\Uninstall.exe"
+  Call ConditionalAddToRegisty
+  Push "NoRepair"
+  Push "1"
+  Call ConditionalAddToRegisty
+
+  !ifdef CPACK_NSIS_ADD_REMOVE
+  ;Create add/remove functionality
+  Push "ModifyPath"
+  Push "$INSTDIR\AddRemove.exe"
+  Call ConditionalAddToRegisty
+  !else
+  Push "NoModify"
+  Push "1"
+  Call ConditionalAddToRegisty
+  !endif
+
+  ; Optional registration
+  Push "DisplayIcon"
+  Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"
+  Call ConditionalAddToRegisty
+  Push "HelpLink"
+  Push "@CPACK_NSIS_HELP_LINK@"
+  Call ConditionalAddToRegisty
+  Push "URLInfoAbout"
+  Push "@CPACK_NSIS_URL_INFO_ABOUT@"
+  Call ConditionalAddToRegisty
+  Push "Contact"
+  Push "@CPACK_NSIS_CONTACT@"
+  Call ConditionalAddToRegisty
+  !insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State"
+  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+
+  ;Create shortcuts
+  CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
+ at CPACK_NSIS_CREATE_ICONS@
+ at CPACK_NSIS_CREATE_ICONS_EXTRA@
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+
+  ;Read a value from an InstallOptions INI file
+  !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State"
+  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State"
+  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State"
+
+  ; Write special uninstall registry entries
+  Push "StartMenu"
+  Push "$STARTMENU_FOLDER"
+  Call ConditionalAddToRegisty
+  Push "DoNotAddToPath"
+  Push "$DO_NOT_ADD_TO_PATH"
+  Call ConditionalAddToRegisty
+  Push "AddToPathAllUsers"
+  Push "$ADD_TO_PATH_ALL_USERS"
+  Call ConditionalAddToRegisty
+  Push "AddToPathCurrentUser"
+  Push "$ADD_TO_PATH_CURRENT_USER"
+  Call ConditionalAddToRegisty
+  Push "InstallToDesktop"
+  Push "$INSTALL_DESKTOP"
+  Call ConditionalAddToRegisty
+
+  !insertmacro MUI_STARTMENU_WRITE_END
+
+ at CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
+
+SectionEnd
+
+Section "-Add to path"
+  Push $INSTDIR\bin
+  StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath
+  StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0
+    Call AddToPath
+  doNotAddToPath:
+SectionEnd
+
+;--------------------------------
+; Create custom pages
+Function InstallOptionsPage
+  !insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@"
+  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini"
+
+FunctionEnd
+
+;--------------------------------
+; determine admin versus local install
+Function un.onInit
+
+  ClearErrors
+  UserInfo::GetName
+  IfErrors noLM
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+  StrCmp $1 "Admin" 0 +3
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Admin group'
+    Goto done
+  StrCmp $1 "Power" 0 +3
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Power Users group'
+    Goto done
+
+  noLM:
+    ;Get installation folder from registry if available
+
+  done:
+
+FunctionEnd
+
+;--- Add/Remove callback functions: ---
+!macro SectionList MacroName
+  ;This macro used to perform operation on multiple sections.
+  ;List all of your components in following manner here.
+ at CPACK_NSIS_COMPONENT_SECTION_LIST@
+!macroend
+
+Section -FinishComponents
+  ;Removes unselected components and writes component status to registry
+  !insertmacro SectionList "FinishSection"
+
+!ifdef CPACK_NSIS_ADD_REMOVE
+  ; Get the name of the installer executable
+  System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
+  StrCpy $R3 $R0
+
+  ; Strip off the last 13 characters, to see if we have AddRemove.exe
+  StrLen $R1 $R0
+  IntOp $R1 $R0 - 13
+  StrCpy $R2 $R0 13 $R1
+  StrCmp $R2 "AddRemove.exe" addremove_installed
+
+  ; We're not running AddRemove.exe, so install it
+  CopyFiles $R3 $INSTDIR\AddRemove.exe
+
+  addremove_installed:
+!endif
+SectionEnd
+;--- End of Add/Remove callback functions ---
+
+;--------------------------------
+; Component dependencies
+Function .onSelChange
+  !insertmacro SectionList MaybeSelectionChanged
+FunctionEnd
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+  ReadRegStr $START_MENU SHCTX \
+   "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu"
+  ;MessageBox MB_OK "Start menu is in: $START_MENU"
+  ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath"
+  ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers"
+  ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser"
+  ;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS"
+  ReadRegStr $INSTALL_DESKTOP SHCTX \
+    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop"
+  ;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP "
+
+ at CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@
+
+  ;Remove files we installed.
+  ;Keep the list of directories here in sync with the File commands above.
+ at CPACK_NSIS_DELETE_FILES@
+ at CPACK_NSIS_DELETE_DIRECTORIES@
+
+!ifdef CPACK_NSIS_ADD_REMOVE
+  ;Remove the add/remove program
+  Delete "$INSTDIR\AddRemove.exe"
+!endif
+
+  ;Remove the uninstaller itself.
+  Delete "$INSTDIR\Uninstall.exe"
+  DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+
+  ;Remove the installation directory if it is empty.
+  RMDir "$INSTDIR"
+
+  ; Remove the registry entries.
+  DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+
+  ; Removes all optional components
+  !insertmacro SectionList "RemoveSection_CPack"
+
+  !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
+
+  Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
+ at CPACK_NSIS_DELETE_ICONS@
+ at CPACK_NSIS_DELETE_ICONS_EXTRA@
+
+  ;Delete empty start menu parent diretories
+  StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
+
+  startMenuDeleteLoop:
+    ClearErrors
+    RMDir $MUI_TEMP
+    GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
+
+    IfErrors startMenuDeleteLoopDone
+
+    StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop
+  startMenuDeleteLoopDone:
+
+  ; If the user changed the shortcut, then untinstall may not work. This should
+  ; try to fix it.
+  StrCpy $MUI_TEMP "$START_MENU"
+  Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
+ at CPACK_NSIS_DELETE_ICONS_EXTRA@
+
+  ;Delete empty start menu parent diretories
+  StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
+
+  secondStartMenuDeleteLoop:
+    ClearErrors
+    RMDir $MUI_TEMP
+    GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
+
+    IfErrors secondStartMenuDeleteLoopDone
+
+    StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop
+  secondStartMenuDeleteLoopDone:
+
+  DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
+
+  Push $INSTDIR\bin
+  StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0
+    Call un.RemoveFromPath
+  doNotRemoveFromPath:
+SectionEnd
+
+;--------------------------------
+; determine admin versus local install
+; Is install for "AllUsers" or "JustMe"?
+; Default to "JustMe" - set to "AllUsers" if admin or on Win9x
+; This function is used for the very first "custom page" of the installer.
+; This custom page does not show up visibly, but it executes prior to the
+; first visible page and sets up $INSTDIR properly...
+; Choose different default installation folder based on SV_ALLUSERS...
+; "Program Files" for AllUsers, "My Documents" for JustMe...
+
+Function .onInit
+  StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst
+
+  ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString"
+  StrCmp $0 "" inst
+
+  MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
+  "@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \
+  IDYES uninst IDNO inst
+  Abort
+
+;Run the uninstaller
+uninst:
+  ClearErrors
+  StrLen $2 "\Uninstall.exe"
+  StrCpy $3 $0 -$2 # remove "\Uninstall.exe" from UninstallString to get path
+  ExecWait '$0 _?=$3' ;Do not copy the uninstaller to a temp file
+
+  IfErrors uninst_failed inst
+uninst_failed:
+  MessageBox MB_OK|MB_ICONSTOP "Uninstall failed."
+  Abort
+
+
+inst:
+  ; Reads components status for registry
+  !insertmacro SectionList "InitSection"
+
+  ; check to see if /D has been used to change
+  ; the install directory by comparing it to the
+  ; install directory that is expected to be the
+  ; default
+  StrCpy $IS_DEFAULT_INSTALLDIR 0
+  StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2
+    StrCpy $IS_DEFAULT_INSTALLDIR 1
+
+  StrCpy $SV_ALLUSERS "JustMe"
+  ; if default install dir then change the default
+  ; if it is installed for JustMe
+  StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
+    StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
+
+  ClearErrors
+  UserInfo::GetName
+  IfErrors noLM
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+  StrCmp $1 "Admin" 0 +4
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Admin group'
+    StrCpy $SV_ALLUSERS "AllUsers"
+    Goto done
+  StrCmp $1 "Power" 0 +4
+    SetShellVarContext all
+    ;MessageBox MB_OK 'User "$0" is in the Power Users group'
+    StrCpy $SV_ALLUSERS "AllUsers"
+    Goto done
+
+  noLM:
+    StrCpy $SV_ALLUSERS "AllUsers"
+    ;Get installation folder from registry if available
+
+  done:
+  StrCmp $SV_ALLUSERS "AllUsers" 0 +3
+    StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
+      StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
+
+  StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage
+    !insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini"
+
+  noOptionsPage:
+FunctionEnd
+
+!ifndef ENVVARUPDATE_FUNCTION
+!define ENVVARUPDATE_FUNCTION
+!verbose push
+!verbose 3
+!include "LogicLib.nsh"
+!include "WinMessages.NSH"
+!include "StrFunc.nsh"
+ 
+; ---- Fix for conflict if StrFunc.nsh is already includes in main file -----------------------
+!macro _IncludeStrFunction StrFuncName
+  !ifndef ${StrFuncName}_INCLUDED
+    ${${StrFuncName}}
+  !endif
+  !ifndef Un${StrFuncName}_INCLUDED
+    ${Un${StrFuncName}}
+  !endif
+  !define un.${StrFuncName} "${Un${StrFuncName}}"
+!macroend
+ 
+!insertmacro _IncludeStrFunction StrTok
+!insertmacro _IncludeStrFunction StrStr
+!insertmacro _IncludeStrFunction StrRep
+ 
+; ---------------------------------- Macro Definitions ----------------------------------------
+!macro _EnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString
+  Push "${EnvVarName}"
+  Push "${Action}"
+  Push "${RegLoc}"
+  Push "${PathString}"
+    Call EnvVarUpdate
+  Pop "${ResultVar}"
+!macroend
+!define EnvVarUpdate '!insertmacro "_EnvVarUpdateConstructor"'
+ 
+!macro _unEnvVarUpdateConstructor ResultVar EnvVarName Action Regloc PathString
+  Push "${EnvVarName}"
+  Push "${Action}"
+  Push "${RegLoc}"
+  Push "${PathString}"
+    Call un.EnvVarUpdate
+  Pop "${ResultVar}"
+!macroend
+!define un.EnvVarUpdate '!insertmacro "_unEnvVarUpdateConstructor"'
+; ---------------------------------- Macro Definitions end-------------------------------------
+ 
+;----------------------------------- EnvVarUpdate start----------------------------------------
+!define hklm_all_users     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
+!define hkcu_current_user  'HKCU "Environment"'
+ 
+!macro EnvVarUpdate UN
+ 
+Function ${UN}EnvVarUpdate
+ 
+  Push $0
+  Exch 4
+  Exch $1
+  Exch 3
+  Exch $2
+  Exch 2
+  Exch $3
+  Exch
+  Exch $4
+  Push $5
+  Push $6
+  Push $7
+  Push $8
+  Push $9
+  Push $R0
+ 
+  /* After this point:
+  -------------------------
+     $0 = ResultVar     (returned)
+     $1 = EnvVarName    (input)
+     $2 = Action        (input)
+     $3 = RegLoc        (input)
+     $4 = PathString    (input)
+     $5 = Orig EnvVar   (read from registry)
+     $6 = Len of $0     (temp)
+     $7 = tempstr1      (temp)
+     $8 = Entry counter (temp)
+     $9 = tempstr2      (temp)
+     $R0 = tempChar     (temp)  */
+ 
+  ; Step 1:  Read contents of EnvVarName from RegLoc
+  ;
+  ; Check for empty EnvVarName
+  ${If} $1 == ""
+    SetErrors
+    DetailPrint "ERROR: EnvVarName is blank"
+    Goto EnvVarUpdate_Restore_Vars
+  ${EndIf}
+ 
+  ; Check for valid Action
+  ${If}    $2 != "A"
+  ${AndIf} $2 != "P"
+  ${AndIf} $2 != "R"
+    SetErrors
+    DetailPrint "ERROR: Invalid Action - must be A, P, or R"
+    Goto EnvVarUpdate_Restore_Vars
+  ${EndIf}
+ 
+  ${If} $3 == HKLM
+    ReadRegStr $5 ${hklm_all_users} $1     ; Get EnvVarName from all users into $5
+  ${ElseIf} $3 == HKCU
+    ReadRegStr $5 ${hkcu_current_user} $1  ; Read EnvVarName from current user into $5
+  ${Else}
+    SetErrors
+    DetailPrint 'ERROR: Action is [$3] but must be "HKLM" or HKCU"'
+    Goto EnvVarUpdate_Restore_Vars
+  ${EndIf}
+ 
+  ; Check for empty PathString
+  ${If} $4 == ""
+    SetErrors
+    DetailPrint "ERROR: PathString is blank"
+    Goto EnvVarUpdate_Restore_Vars
+  ${EndIf}
+ 
+  ; Make sure we've got some work to do
+  ${If} $5 == ""
+  ${AndIf} $2 == "R"
+    SetErrors
+    DetailPrint "$1 is empty - Nothing to remove"
+    Goto EnvVarUpdate_Restore_Vars
+  ${EndIf}
+ 
+  ; Step 2: Scrub EnvVar
+  ;
+  StrCpy $0 $5                             ; Copy the contents to $0
+  ; Remove spaces around semicolons (NOTE: spaces before the 1st entry or
+  ; after the last one are not removed here but instead in Step 3)
+  ${If} $0 != ""                           ; If EnvVar is not empty ...
+    ${Do}
+      ${${UN}StrStr} $7 $0 " ;"
+      ${If} $7 == ""
+        ${ExitDo}
+      ${EndIf}
+      ${${UN}StrRep} $0  $0 " ;" ";"         ; Remove '<space>;'
+    ${Loop}
+    ${Do}
+      ${${UN}StrStr} $7 $0 "; "
+      ${If} $7 == ""
+        ${ExitDo}
+      ${EndIf}
+      ${${UN}StrRep} $0  $0 "; " ";"         ; Remove ';<space>'
+    ${Loop}
+    ${Do}
+      ${${UN}StrStr} $7 $0 ";;" 
+      ${If} $7 == ""
+        ${ExitDo}
+      ${EndIf}
+      ${${UN}StrRep} $0  $0 ";;" ";"
+    ${Loop}
+ 
+    ; Remove a leading or trailing semicolon from EnvVar
+    StrCpy  $7  $0 1 0
+    ${If} $7 == ";"
+      StrCpy $0  $0 "" 1                   ; Change ';<EnvVar>' to '<EnvVar>'
+    ${EndIf}
+    StrLen $6 $0
+    IntOp $6 $6 - 1
+    StrCpy $7  $0 1 $6
+    ${If} $7 == ";"
+     StrCpy $0  $0 $6                      ; Change ';<EnvVar>' to '<EnvVar>'
+    ${EndIf}
+    ; DetailPrint "Scrubbed $1: [$0]"      ; Uncomment to debug
+  ${EndIf}
+ 
+  /* Step 3. Remove all instances of the target path/string (even if "A" or "P")
+     $6 = bool flag (1 = found and removed PathString)
+     $7 = a string (e.g. path) delimited by semicolon(s)
+     $8 = entry counter starting at 0
+     $9 = copy of $0
+     $R0 = tempChar      */
+ 
+  ${If} $5 != ""                           ; If EnvVar is not empty ...
+    StrCpy $9 $0
+    StrCpy $0 ""
+    StrCpy $8 0
+    StrCpy $6 0
+ 
+    ${Do}
+      ${${UN}StrTok} $7 $9 ";" $8 "0"      ; $7 = next entry, $8 = entry counter
+ 
+      ${If} $7 == ""                       ; If we've run out of entries,
+        ${ExitDo}                          ;    were done
+      ${EndIf}                             ;
+ 
+      ; Remove leading and trailing spaces from this entry (critical step for Action=Remove)
+      ${Do}
+        StrCpy $R0  $7 1
+        ${If} $R0 != " "
+          ${ExitDo}
+        ${EndIf}
+        StrCpy $7   $7 "" 1                ;  Remove leading space
+      ${Loop}
+      ${Do}
+        StrCpy $R0  $7 1 -1
+        ${If} $R0 != " "
+          ${ExitDo}
+        ${EndIf}
+        StrCpy $7   $7 -1                  ;  Remove trailing space
+      ${Loop}
+      ${If} $7 == $4                       ; If string matches, remove it by not appending it
+        StrCpy $6 1                        ; Set 'found' flag
+      ${ElseIf} $7 != $4                   ; If string does NOT match
+      ${AndIf}  $0 == ""                   ;    and the 1st string being added to $0,
+        StrCpy $0 $7                       ;    copy it to $0 without a prepended semicolon
+      ${ElseIf} $7 != $4                   ; If string does NOT match
+      ${AndIf}  $0 != ""                   ;    and this is NOT the 1st string to be added to $0,
+        StrCpy $0 $0;$7                    ;    append path to $0 with a prepended semicolon
+      ${EndIf}                             ;
+ 
+      IntOp $8 $8 + 1                      ; Bump counter
+    ${Loop}                                ; Check for duplicates until we run out of paths
+  ${EndIf}
+ 
+  ; Step 4:  Perform the requested Action
+  ;
+  ${If} $2 != "R"                          ; If Append or Prepend
+    ${If} $6 == 1                          ; And if we found the target
+      DetailPrint "Target is already present in $1. It will be removed and"
+    ${EndIf}
+    ${If} $0 == ""                         ; If EnvVar is (now) empty
+      StrCpy $0 $4                         ;   just copy PathString to EnvVar
+      ${If} $6 == 0                        ; If found flag is either 0
+      ${OrIf} $6 == ""                     ; or blank (if EnvVarName is empty)
+        DetailPrint "$1 was empty and has been updated with the target"
+      ${EndIf}
+    ${ElseIf} $2 == "A"                    ;  If Append (and EnvVar is not empty),
+      StrCpy $0 $0;$4                      ;     append PathString
+      ${If} $6 == 1
+        DetailPrint "appended to $1"
+      ${Else}
+        DetailPrint "Target was appended to $1"
+      ${EndIf}
+    ${Else}                                ;  If Prepend (and EnvVar is not empty),
+      StrCpy $0 $4;$0                      ;     prepend PathString
+      ${If} $6 == 1
+        DetailPrint "prepended to $1"
+      ${Else}
+        DetailPrint "Target was prepended to $1"
+      ${EndIf}
+    ${EndIf}
+  ${Else}                                  ; If Action = Remove
+    ${If} $6 == 1                          ;   and we found the target
+      DetailPrint "Target was found and removed from $1"
+    ${Else}
+      DetailPrint "Target was NOT found in $1 (nothing to remove)"
+    ${EndIf}
+    ${If} $0 == ""
+      DetailPrint "$1 is now empty"
+    ${EndIf}
+  ${EndIf}
+ 
+  ; Step 5:  Update the registry at RegLoc with the updated EnvVar and announce the change
+  ;
+  ClearErrors
+  ${If} $3  == HKLM
+    WriteRegExpandStr ${hklm_all_users} $1 $0     ; Write it in all users section
+  ${ElseIf} $3 == HKCU
+    WriteRegExpandStr ${hkcu_current_user} $1 $0  ; Write it to current user section
+  ${EndIf}
+ 
+  IfErrors 0 +4
+    MessageBox MB_OK|MB_ICONEXCLAMATION "Could not write updated $1 to $3"
+    DetailPrint "Could not write updated $1 to $3"
+    Goto EnvVarUpdate_Restore_Vars
+ 
+  ; "Export" our change
+  SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
+ 
+  EnvVarUpdate_Restore_Vars:
+  ;
+  ; Restore the user's variables and return ResultVar
+  Pop $R0
+  Pop $9
+  Pop $8
+  Pop $7
+  Pop $6
+  Pop $5
+  Pop $4
+  Pop $3
+  Pop $2
+  Pop $1
+  Push $0  ; Push my $0 (ResultVar)
+  Exch
+  Pop $0   ; Restore his $0
+ 
+FunctionEnd
+ 
+!macroend   ; EnvVarUpdate UN
+!insertmacro EnvVarUpdate ""
+!insertmacro EnvVarUpdate "un."
+;----------------------------------- EnvVarUpdate end----------------------------------------
+ 
+!verbose pop
+!endif
diff --git a/cmake/bornagain/modules/PyExamplesLineLength.cmake b/cmake/bornagain/modules/PyExamplesLineLength.cmake
new file mode 100644
index 0000000..dd69a1d
--- /dev/null
+++ b/cmake/bornagain/modules/PyExamplesLineLength.cmake
@@ -0,0 +1,14 @@
+set(WEB_LEN_LIM 85) # maximum line length of code for display in Drupal web pages
+
+# Check whether the line length of all python examples remains below WEB_LEN_LIM
+
+if(NOT MSVC)
+
+file(GLOB PY_EXAMPLES "${PY_EXAMPLES_DIR}/*/ex*/*.py")
+
+add_test(NAME "PyExamplesLineLength"
+    COMMAND ${PYTHON_EXECUTABLE}
+    ${CMAKE_SOURCE_DIR}/dev-tools/analyze/count-line-length.py ${WEB_LEN_LIM}
+    ${PY_EXAMPLES})
+
+endif()
diff --git a/cmake/bornagain/modules/SearchInstalledSoftware.cmake b/cmake/bornagain/modules/SearchInstalledSoftware.cmake
new file mode 100644
index 0000000..6d156e2
--- /dev/null
+++ b/cmake/bornagain/modules/SearchInstalledSoftware.cmake
@@ -0,0 +1,79 @@
+# Search for installed software required by BornAgain
+
+# === obligatory packages ===
+
+find_package(Threads REQUIRED)
+
+# --- math packages ---
+find_package(Eigen3 REQUIRED)
+find_package(FFTW REQUIRED)
+find_package(GSL REQUIRED) # revert this when issue 1404 is resolved
+find_package(YamlCpp05 REQUIRED)
+
+# --- Boost ---
+set(Boost_NO_BOOST_CMAKE ON) # prevent shortcut
+set(Boost_USE_STATIC_LIBS OFF)
+set(Boost_USE_MULTITHREADED ON)
+set(Boost_USE_STATIC_RUNTIME OFF)
+add_definitions(-DBOOST_ALL_DYN_LINK) # line is needed for MSVC
+#add_definitions(-DBOOST_LIB_DIAGNOSTIC) # shows during compilation auto-linked libraries
+set(boost_libraries_required date_time chrono program_options iostreams system filesystem regex)
+if(WIN32)
+    set(boost_libraries_required ${boost_libraries_required} zlib bzip2)
+endif()
+
+find_package(Boost 1.48.0 COMPONENTS ${boost_libraries_required} REQUIRED)
+message(STATUS "Found Boost includes at ${Boost_INCLUDE_DIRS}, libraries at ${Boost_LIBRARY_DIRS}")
+
+# === optional packages ===
+
+# --- multithreading ---
+if(BORNAGAIN_OPENMPI)
+    message(STATUS "Configuring with OpenMPI support")
+    find_package(MPI REQUIRED)
+endif()
+
+# --- Tiff ---
+if(BORNAGAIN_TIFF_SUPPORT)
+    message(STATUS "Looking for libtiff (use -DBORNAGAIN_TIFF_SUPPORT=OFF to disable)")
+    find_package(TIFF 4.0.2 REQUIRED)
+endif()
+
+# --- Python ---
+if (BORNAGAIN_GENERATE_BINDINGS AND BORNAGAIN_GENERATE_PYTHON_DOCS)
+    find_package(Doxygen REQUIRED)
+endif()
+
+if (BORNAGAIN_USE_PYTHON3)
+    set(Python_ADDITIONAL_VERSIONS 3.5 3.4 3.3)
+else()
+    set(Python_ADDITIONAL_VERSIONS 2.7)
+endif()
+
+if(BORNAGAIN_PYTHON OR BORNAGAIN_GUI)
+    find_package(PythonInterp REQUIRED)
+    message(STATUS "Found Python interpreter version ${PYTHON_VERSION_STRING} at ${PYTHON_EXECUTABLE}")
+    find_package(PythonLibs REQUIRED)
+    if(NOT PYTHONLIBS_FOUND)
+        message(FATAL_ERROR "No Python library has been found")
+    endif()
+    message(STATUS "Found Python libraries version ${PYTHONLIBS_VERSION_STRING} at ${PYTHON_LIBRARIES}; includes at ${PYTHON_INCLUDE_DIRS}")
+    find_package(Numpy REQUIRED)
+    find_package(PyYaml REQUIRED)
+endif()
+
+# --- Swig ---
+if(BORNAGAIN_PYTHON AND BORNAGAIN_GENERATE_BINDINGS)
+    find_package(SWIG 3.0 REQUIRED)
+    include(${SWIG_USE_FILE})
+    message(STATUS "Found SWIG version ${SWIG_VERSION} at ${SWIG_EXECUTABLE} with flags '${SWIG_FLAGS}'; CMake definitions in ${SWIG_USE_FILE}")
+endif()
+
+# --- man page generation ---
+if(BORNAGAIN_MANPAGE)
+    find_program(POD2MAN pod2man)
+    if(NOT POD2MAN)
+        message(FATAL_ERROR "FATAL: cannot satisfy BORNAGAIN_MANPAGE: pod2man not found")
+    endif()
+    message(STATUS "Found pod2man: ${POD2MAN}")
+endif()
diff --git a/cmake/bornagain/modules/SearchQt.cmake b/cmake/bornagain/modules/SearchQt.cmake
new file mode 100644
index 0000000..4bf9b95
--- /dev/null
+++ b/cmake/bornagain/modules/SearchQt.cmake
@@ -0,0 +1,17 @@
+find_package(Qt5Widgets REQUIRED)
+find_package(Qt5Core REQUIRED)
+find_package(Qt5Gui REQUIRED)
+find_package(Qt5Designer REQUIRED)
+find_package(Qt5PrintSupport REQUIRED)
+find_package(Qt5Network REQUIRED)
+
+if(${Qt5Widgets_FOUND})
+    message(STATUS "  Found Qt5 version ${Qt5Widgets_VERSION_STRING}")
+    get_target_property(Qt5Widgets_location Qt5::Widgets LOCATION_Release)
+    message(STATUS "  ${Qt5Widgets_LIBRARIES} ${Qt5Widgets_location}")
+    get_target_property(Qt5Core_location Qt5::Core LOCATION_Release)
+    message(STATUS "  ${Qt5Core_LIBRARIES} ${Qt5Core_location}")
+    get_target_property(Qt5Gui_location Qt5::Gui LOCATION_Release)
+    message(STATUS "  ${Qt5Gui_LIBRARIES} ${Qt5Gui_location}")
+    message(STATUS "  Includes: ${Qt5Widgets_INCLUDE_DIRS}")
+endif()
diff --git a/cmake/bornagain/modules/SetUpLinux.cmake b/cmake/bornagain/modules/SetUpLinux.cmake
new file mode 100644
index 0000000..c5d4c33
--- /dev/null
+++ b/cmake/bornagain/modules/SetUpLinux.cmake
@@ -0,0 +1,25 @@
+set(BORNAGAIN_ARCHITECTURE linux)
+set(BORNAGAIN_PLATFORM linux)
+
+execute_process(COMMAND uname -m OUTPUT_VARIABLE SYSCTL_OUTPUT)
+if(${SYSCTL_OUTPUT} MATCHES x86_64)
+    message(STATUS "Found a 64bit system")
+    set(BIT_ENVIRONMENT "-m64")
+    set(BORNAGAIN_ARCHITECTURE linuxx8664)
+else()
+    message(STATUS "Found a 32bit system")
+    set(BIT_ENVIRONMENT "-m32")
+    add_definitions(-DEIGEN_DONT_ALIGN_STATICALLY=1)
+endif()
+
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+set(CMAKE_CXX_FLAGS_RELEASE        "-O3")
+set(CMAKE_CXX_FLAGS_DEBUG          "-g")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO   "-O2 -g")
+set(CMAKE_C_FLAGS_RELEASE          "-O3")
+set(CMAKE_C_FLAGS_DEBUG            "-g")
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SOURCE_DIR}/Wrap")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe ${BIT_ENVIRONMENT} -Wall -W -Woverloaded-virtual -fPIC")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe ${BIT_ENVIRONMENT} -Wall -W -fPIC")
+set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined")
diff --git a/cmake/bornagain/modules/SetUpMacOS.cmake b/cmake/bornagain/modules/SetUpMacOS.cmake
new file mode 100644
index 0000000..a6bad50
--- /dev/null
+++ b/cmake/bornagain/modules/SetUpMacOS.cmake
@@ -0,0 +1,113 @@
+set(BORNAGAIN_ARCHITECTURE macosx)
+set(BORNAGAIN_PLATFORM macosx)
+
+#---------------------------------------------------------------------------------------------------------
+
+if (CMAKE_SYSTEM_NAME MATCHES Darwin)
+  EXECUTE_PROCESS(COMMAND sw_vers "-productVersion"
+                  COMMAND cut -d . -f 1-2
+                  OUTPUT_VARIABLE MACOSX_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+  MESSAGE(STATUS "Found a Mac OS X System ${MACOSX_VERSION}")
+  EXECUTE_PROCESS(COMMAND sw_vers "-productVersion"
+                  COMMAND cut -d . -f 2
+                  OUTPUT_VARIABLE MACOSX_MINOR OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+  if(${MACOSX_MINOR} GREATER 4)
+    #TODO: check haveconfig and rpath -> set rpath true
+    #TODO: check Thread, define link command
+    #TODO: more stuff check configure script
+    execute_process(COMMAND /usr/sbin/sysctl machdep.cpu.extfeatures OUTPUT_VARIABLE SYSCTL_OUTPUT)
+    if(${SYSCTL_OUTPUT} MATCHES 64)
+       MESSAGE(STATUS "Found a 64bit system")
+       set(BORNAGAIN_ARCHITECTURE macosx64)
+       SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
+       SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS} -m64")
+       SET(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -m64")
+       SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
+       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64")
+       SET(CMAKE_FORTRAN_FLAGS "${CMAKE_FORTRAN_FLAGS} -m64")
+    else(${SYSCTL_OUTPUT} MATCHES 64)
+       MESSAGE(STATUS "Found a 32bit system")
+       SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
+       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
+       SET(CMAKE_FORTRAN_FLAGS "${CMAKE_FORTRAN_FLAGS} -m32")
+    endif(${SYSCTL_OUTPUT} MATCHES 64)
+  endif()
+
+  if (CMAKE_COMPILER_IS_GNUCXX)
+     message(STATUS "Found GNU compiler collection")
+     execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -W -Wall -Woverloaded-virtual -fsigned-char -fno-common")
+     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -W -Wall -fsigned-char -fno-common")
+     SET(CMAKE_Fortran_FLAGS "${CMAKE_FORTRAN_FLAGS} -std=legacy")
+     SET(CINT_CXX_DEFINITIONS "-DG__REGEXP -DG__UNIX -DG__SHAREDLIB -DG__ROOT -DG__REDIRECTIO -DG__OSFDLL -DG__STD_EXCEPTION")
+     SET(CINT_C_DEFINITIONS "-DG__REGEXP -DG__UNIX -DG__SHAREDLIB -DG__ROOT -DG__REDIRECTIO -DG__OSFDLL -DG__STD_EXCEPTION")
+
+     SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS} -flat_namespace -single_module -undefined dynamic_lookup")
+     SET(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -flat_namespace -single_module -undefined dynamic_lookup")
+
+     set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -bind_at_load -m64")
+     set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -bind_at_load -m64")
+
+     # Select flags.
+     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+     set(CMAKE_CXX_FLAGS_RELEASE        "-O2")
+     set(CMAKE_CXX_FLAGS_DEBUG          "-g -O2 -fno-reorder-blocks -fno-inline")
+     set(CMAKE_CXX_FLAGS_DEBUGFULL      "-g3 -fno-inline")
+     set(CMAKE_CXX_FLAGS_PROFILE        "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+     set(CMAKE_C_FLAGS_RELWITHDEBINFO   "-O2 -g")
+     set(CMAKE_C_FLAGS_RELEASE          "-O2")
+     set(CMAKE_C_FLAGS_DEBUG            "-g -O2 -fno-reorder-blocks -fno-inline")
+     set(CMAKE_C_FLAGS_DEBUGFULL        "-g3 -fno-inline")
+     set(CMAKE_C_FLAGS_PROFILE          "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+
+     #settings for cint
+     set(CPPPREP "${CMAKE_CXX_COMPILER} -E -C")
+     set(CXXOUT "-o ")
+     set(EXEEXT "")
+     set(SOEXT "so")
+
+  elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
+
+     message(STATUS "Found LLVM compiler collection")
+     execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -W -Wall -Woverloaded-virtual -fsigned-char -fno-common")
+     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -W -Wall -fsigned-char -fno-common")
+#     SET(CMAKE_Fortran_FLAGS "${CMAKE_FORTRAN_FLAGS} -std=legacy")
+#     SET(CINT_CXX_DEFINITIONS "-DG__REGEXP -DG__UNIX -DG__SHAREDLIB -DG__ROOT -DG__REDIRECTIO -DG__OSFDLL -DG__STD_EXCEPTION")
+#     SET(CINT_C_DEFINITIONS "-DG__REGEXP -DG__UNIX -DG__SHAREDLIB -DG__ROOT -DG__REDIRECTIO -DG__OSFDLL -DG__STD_EXCEPTION")
+
+     SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS} -flat_namespace -single_module -undefined dynamic_lookup")
+     SET(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -flat_namespace -single_module -undefined dynamic_lookup")
+
+     set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -bind_at_load -m64")
+     set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -bind_at_load -m64")
+
+     # Select flags.
+     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+     set(CMAKE_CXX_FLAGS_RELEASE        "-O2")
+     set(CMAKE_CXX_FLAGS_DEBUG          "-g -O2 -fno-inline")
+     set(CMAKE_CXX_FLAGS_DEBUGFULL      "-g3 -fno-inline")
+     set(CMAKE_CXX_FLAGS_PROFILE        "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+     set(CMAKE_C_FLAGS_RELWITHDEBINFO   "-O2 -g")
+     set(CMAKE_C_FLAGS_RELEASE          "-O2")
+     set(CMAKE_C_FLAGS_DEBUG            "-g -O2 -fno-inline")
+     set(CMAKE_C_FLAGS_DEBUGFULL        "-g3 -fno-inline")
+     set(CMAKE_C_FLAGS_PROFILE          "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+
+     #settings for cint
+     set(CPPPREP "${CMAKE_CXX_COMPILER} -E -C")
+     set(CXXOUT "-o ")
+     set(EXEEXT "")
+     set(SOEXT "so")
+  else()
+    MESSAGE(FATAL_ERROR "There is no setup for this compiler up to now. Don't know waht to do. Stop cmake at this point.")
+  endif()
+
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SOURCE_DIR}/Wrap")
+
+else (CMAKE_SYSTEM_NAME MATCHES Darwin)
+  MESSAGE(FATAL_ERROR "There is no setup for this this Apple system up to now. Don't know waht to do. Stop cmake at this point.")
+endif (CMAKE_SYSTEM_NAME MATCHES Darwin)
diff --git a/cmake/bornagain/modules/SetUpWindows.cmake b/cmake/bornagain/modules/SetUpWindows.cmake
new file mode 100644
index 0000000..5588935
--- /dev/null
+++ b/cmake/bornagain/modules/SetUpWindows.cmake
@@ -0,0 +1,13 @@
+if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
+  set(BORNAGAIN_ARCHITECTURE win64)
+  set(BORNAGAIN_PLATFORM win64)
+else()
+    set(BORNAGAIN_ARCHITECTURE win32)
+    set(BORNAGAIN_PLATFORM win32)
+endif()
+
+add_definitions(-DEIGEN_DONT_ALIGN_STATICALLY=1)
+message(STATUS "Disabling static align for Eigen")
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP -nologo /EHsc /D_USE_MATH_DEFINES -I${CMAKE_SOURCE_DIR}/Core/Tools -I${CMAKE_SOURCE_DIR}/Wrap -FIw32pragma.h")
+set(CMAKE_SHARED_LINKER_FLAGS "/NODEFAULTLIB:libcmtd.lib")
diff --git a/cmake/bornagain/modules/SetupCoverage.cmake b/cmake/bornagain/modules/SetupCoverage.cmake
new file mode 100644
index 0000000..9842182
--- /dev/null
+++ b/cmake/bornagain/modules/SetupCoverage.cmake
@@ -0,0 +1,19 @@
+# SetupCoverage.cmake
+#
+# description: sets up code coverage custom target
+#
+# copyright: 2016 Scientific Computing Group, Forschungszentrum Juelich GmbH
+#
+# license: see LICENSE
+
+set(coverage_ignore_dirs "'/usr/*'")
+list(APPEND coverage_ignore_dirs "'*/auto/*'")
+list(APPEND coverage_ignore_dirs "'*/Tests/*'")
+list(APPEND coverage_ignore_dirs "'*/ThirdParty/*'")
+list(APPEND coverage_ignore_dirs "'*/build/*'")
+list(APPEND coverage_ignore_dirs "'*/GUI/externals/*'")
+
+set(html_dir ${CMAKE_CURRENT_BINARY_DIR}/coverage)
+file(MAKE_DIRECTORY ${html_dir})
+
+add_coverage_target(coverage "${coverage_ignore_dirs}" ${html_dir})
diff --git a/cmake/bornagain/scripts/BAVersion.h.in b/cmake/bornagain/scripts/BAVersion.h.in
new file mode 100644
index 0000000..b1e945b
--- /dev/null
+++ b/cmake/bornagain/scripts/BAVersion.h.in
@@ -0,0 +1,45 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Samples/inc/BAVersion.h
+//! @brief     Defines functions for access to the package version number.
+//!
+//! @homepage  http://bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef BAVERSION_H
+#define BAVERSION_H
+
+#include <string>
+#include <sstream>
+
+namespace BornAgain {
+    const int major_version_number = @BornAgain_VERSION_MAJOR@;
+    const int minor_version_number = @BornAgain_VERSION_MINOR@;
+    const int patch_version_number = @BornAgain_VERSION_PATCH@;
+
+    inline int GetMajorVersionNumber() { return major_version_number; }
+    inline int GetMinorVersionNumber() { return minor_version_number; }
+    inline int GetPatchVersionNumber() { return patch_version_number; }
+    inline std::string GetName() { return std::string("BornAgain"); }
+
+    inline std::string GetVersionNumber()
+    {
+        std::ostringstream ostr;
+        ostr << major_version_number
+             << "."
+             << minor_version_number
+             << "."
+             << patch_version_number ;
+
+        return ostr.str();
+    }
+}
+
+#endif // BAVERSION_H
diff --git a/cmake/bornagain/scripts/CTestCustom.cmake.in b/cmake/bornagain/scripts/CTestCustom.cmake.in
new file mode 100644
index 0000000..4a47a0f
--- /dev/null
+++ b/cmake/bornagain/scripts/CTestCustom.cmake.in
@@ -0,0 +1,2 @@
+set(CTEST_CUSTOM_POST_TEST "echo For details, see the log files in Testing/Temporary/
+More info at http://bornagainproject.org/documentation/troubleshooting#ctest")
diff --git a/cmake/bornagain/scripts/FindBornAgain.cmake.in b/cmake/bornagain/scripts/FindBornAgain.cmake.in
new file mode 100644
index 0000000..5a7db1a
--- /dev/null
+++ b/cmake/bornagain/scripts/FindBornAgain.cmake.in
@@ -0,0 +1,44 @@
+# Finds BornAgain instalation
+# It defines:
+# BORNAGAIN_INCLUDE_DIR  PATH to the include directory
+# BORNAGAIN_LIBRARIES    BornAgain libraries
+
+set(BORNAGAINSYS $ENV{BORNAGAINSYS})
+
+if(BORNAGAINSYS)
+    set(BORNAGAIN_LIBRARY_DIR ${BORNAGAINSYS}/lib/BornAgain- at BornAgain_VERSION_MAJOR@. at BornAgain_VERSION_MINOR@)
+    set(BORNAGAIN_INCLUDE_DIR ${BORNAGAINSYS}/include/BornAgain- at BornAgain_VERSION_MAJOR@. at BornAgain_VERSION_MINOR@)
+endif()
+
+find_library (BORNAGAIN_CORE BornAgainCore
+    PATHS ${BORNAGAIN_LIBRARY_DIR}
+    HINTS ${BORNAGAIN_LIBRARY_DIR}
+)
+
+find_library (BORNAGAIN_FIT BornAgainFit
+    PATHS ${BORNAGAIN_LIBRARY_DIR}
+    HINTS ${BORNAGAIN_LIBRARY_DIR}
+)
+set(BORNAGAIN_LIBRARIES ${BORNAGAIN_CORE} ${BORNAGAIN_FIT})
+
+find_path(BORNAGAIN_INCLUDE_DIR BAVersion.h
+    PATHS /usr/include /usr/local/include /opt/local/include ${BORNAGAIN_INCLUDE_DIR}
+    PATH_SUFFIXES BornAgain
+    HINTS ${BORNAGAIN_INCLUDE_DIR}
+)
+
+# 32-bits systems require special Eigen options
+execute_process(COMMAND uname -m OUTPUT_VARIABLE SYSCTL_OUTPUT)
+if(NOT ${SYSCTL_OUTPUT} MATCHES x86_64)
+    add_definitions(-DEIGEN_DONT_ALIGN_STATICALLY=1)
+endif()
+
+message(STATUS "BORNAGAIN_LIBRARIES   ${BORNAGAIN_LIBRARIES}")
+message(STATUS "BORNAGAIN_INCLUDE_DIR ${BORNAGAIN_INCLUDE_DIR}")
+mark_as_advanced(BORNAGAIN_LIBRARIES BORNAGAIN_INCLUDE_DIR)
+
+if(NOT BORNAGAIN_LIBRARIES OR NOT BORNAGAIN_INCLUDE_DIR)
+   if(BornAgain_FIND_REQUIRED)
+       message( FATAL_ERROR "FindBornAgain: can't find BornAgain header or library" )
+   endif()
+endif()
diff --git a/cmake/bornagain/scripts/GoogletestFooter.cpp b/cmake/bornagain/scripts/GoogletestFooter.cpp
new file mode 100644
index 0000000..e7e1e96
--- /dev/null
+++ b/cmake/bornagain/scripts/GoogletestFooter.cpp
@@ -0,0 +1,27 @@
+/* From GoogletestFooter.cpp: */
+
+struct ErrorStreamRedirect {
+    ErrorStreamRedirect( std::streambuf * new_buffer )
+        : old( std::cerr.rdbuf( new_buffer ) )
+    { }
+
+    ~ErrorStreamRedirect( ) {
+        std::cerr.rdbuf( old );
+    }
+
+private:
+    std::streambuf * old;
+};
+
+int main(int argc, char** argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    // redirect std::cerr stream
+    std::stringstream oss;
+    ErrorStreamRedirect redirecter( oss.rdbuf() );
+    (void)redirecter;
+
+    // run all google tests
+    return RUN_ALL_TESTS();
+}
diff --git a/cmake/bornagain/scripts/GoogletestHeader.cpp b/cmake/bornagain/scripts/GoogletestHeader.cpp
new file mode 100644
index 0000000..bd1977c
--- /dev/null
+++ b/cmake/bornagain/scripts/GoogletestHeader.cpp
@@ -0,0 +1,8 @@
+/* From GoogletestHeader.cpp: */
+
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+/* Autogenerated includes (rerun cmake to update): */
diff --git a/cmake/bornagain/scripts/MacOSXBundleInfo.plist.in b/cmake/bornagain/scripts/MacOSXBundleInfo.plist.in
new file mode 100644
index 0000000..5a91270
--- /dev/null
+++ b/cmake/bornagain/scripts/MacOSXBundleInfo.plist.in
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>BornAgain</string>
+	<key>CFBundleGetInfoString</key>
+	<string></string>
+	<key>CFBundleIconFile</key>
+        <string>@MACOSX_BUNDLE_ICON_FILE@</string>
+	<key>CFBundleIdentifier</key>
+        <string>@MACOSX_BUNDLE_IDENTIFIER@</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleLongVersionString</key>
+        <string>@BornAgain_VERSION_MAJOR at .@BornAgain_VERSION_MINOR at .@BornAgain_VERSION_PATCH@</string>
+	<key>CFBundleName</key>
+	<string></string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+        <string>@BornAgain_VERSION_MAJOR at .@BornAgain_VERSION_MINOR at .@BornAgain_VERSION_PATCH@</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+        <key>@BornAgain_VERSION_MAJOR at .@BornAgain_VERSION_MINOR at .@BornAgain_VERSION_PATCH@</key>
+	<string></string>
+	<key>CSResourcesFileMapped</key>
+	<true/>
+	<key>LSRequiresCarbon</key>
+	<true/>
+        <key>Forschungszentrum Jülich GmbH 2014</key>
+	<string></string>
+</dict>
+</plist>
diff --git a/cmake/bornagain/scripts/auto_README.in b/cmake/bornagain/scripts/auto_README.in
new file mode 100644
index 0000000..cd664e1
--- /dev/null
+++ b/cmake/bornagain/scripts/auto_README.in
@@ -0,0 +1,20 @@
+This directory, auto, contains files that are automatically
+generated by tools other than CMake, Make, and the compiler.
+
+They are distributed as part of the source archive. A user
+who just wants to compile BornAgain should consider the
+contents of this directory as part of the source, period.
+
+A developer, on the other hand, will sooner or later need
+to regenerate some or all sources contained in this directory.
+For this, use the command top-level cmake command with option
+-DAUTOGENERATE=ON, or with more specific options like
+-DBORNAGAIN_GENERATE_BINDINGS=ON.
+
+Contents of this directory:
+
+Doc/man:
+  Unix man page in troff format, generated by pod2man.
+
+Wrap:
+  Python wrapper, generated by Doxygen and Swig.
diff --git a/cmake/bornagain/scripts/fix_apple_bundle.py b/cmake/bornagain/scripts/fix_apple_bundle.py
new file mode 100644
index 0000000..219f633
--- /dev/null
+++ b/cmake/bornagain/scripts/fix_apple_bundle.py
@@ -0,0 +1,421 @@
+"""
+Script to fix all dependencies in OS X bundle. Runs automatically when -DBORNAGAIN_APPLE_BUNDLE
+"""
+import os
+import sys
+import platform
+import shutil
+import subprocess
+import glob
+from distutils import sysconfig
+
+BUNDLE_DIR = ""
+
+# -----------------------------------------------------------------------------
+# Locations
+# -----------------------------------------------------------------------------
+
+
+def set_bundle_dir(bundle_dir):
+    global BUNDLE_DIR
+    BUNDLE_DIR = bundle_dir
+
+
+def bundle_dir():
+    global BUNDLE_DIR
+    return BUNDLE_DIR
+
+
+def bundle_frameworks_path():
+    return os.path.join(bundle_dir(), "Contents", "Frameworks")
+
+
+def bundle_plugins_path():
+    return os.path.join(bundle_dir(), "Contents", "PlugIns")
+
+
+def bundle_main_executables():
+    return [os.path.join(bundle_dir(), "Contents", "MacOS", "BornAgain")]
+
+
+def bundle_python_library():
+    return os.path.join("Python.framework", "Versions", "2.7", "Python")
+
+
+def qtlibs_path():
+    return os.path.join(os.environ['QTDIR'], "lib")
+
+
+def qtplugins_path():
+    return os.path.join(os.environ['QTDIR'], "plugins")
+
+
+def bundle_libraries():
+    return glob.glob(os.path.join(bundle_dir(), "Contents", "lib", "BornAgain-*", "*"))
+
+
+def bundle_plugins():
+    return glob.glob(os.path.join(bundle_plugins_path(), "*", "*"))
+
+
+def bornagain_binaries():
+    return bundle_main_executables() + bundle_libraries() + bundle_plugins()
+
+
+def get_list_of_files(dirname):
+    """
+    returns recursive list of files in given directory and its subdirectories
+    """
+    result = []
+    for root, directories, filenames in os.walk(dirname):
+        for filename in filenames:
+            result.append(os.path.join(root,filename))
+    return result
+
+
+# -----------------------------------------------------------------------------
+# Utils
+# -----------------------------------------------------------------------------
+
+
+def make_dir(dirname):
+    if not os.path.exists(dirname):
+        os.makedirs(dirname)
+
+
+def copy_file_to_dir(file_name, dest_dir):
+    """
+    Copies file to the destination directory. If destination doesn't exists, it will be created.
+    """
+    make_dir(dest_dir)
+    dest_file = os.path.join(dest_dir, os.path.basename(file_name))
+    shutil.copyfile(file_name, dest_file)
+    return dest_file
+
+
+def copy_file_to_file(source, destination):
+    """
+    Copies file to another. If destination directory doesn't exists, it will be created.
+    """
+    make_dir(os.path.dirname(destination))
+    shutil.copyfile(source, destination)
+
+
+def otool(filename):
+    """
+    Parses dependencies of given binary file
+    """
+    p = subprocess.Popen(['otool', '-XL', filename], stdout=subprocess.PIPE)
+    # return iter(p.stdout.readline, b'')
+    for line in iter(p.stdout.readline, b''):
+        str = line.strip().split()[0]
+        yield str
+
+
+def setId(filename, newId):
+    """
+    Sets new id for binary file
+    """
+    p = subprocess.Popen(['install_name_tool', '-id', newId, filename], stdout=subprocess.PIPE)
+    p.communicate()
+    return
+
+
+def fixDependency(filename, old, new):
+    """
+    Replaces old dependency with new one for given binary file
+    """
+    print "    fixDependency(filename, old, new)", filename, old, new
+    p = subprocess.Popen(['install_name_tool', '-change', old, new, filename], stdout=subprocess.PIPE)
+    p.communicate()
+    return
+
+
+def is_system_dependency(dependency):
+    """
+    Returns True if this is system file dependency
+    """
+    non_dependency_patterns = ['/usr/lib', '/System']
+    for pat in non_dependency_patterns:
+        if dependency.startswith(pat):
+            return True
+    return False
+
+
+def is_rpath_dependency(dependency):
+    """
+    Returns True if this is rpath like dependency
+    """
+    non_dependency_patterns = ['@']
+    for pat in non_dependency_patterns:
+        if dependency.startswith(pat):
+            return True
+    return False
+
+
+def is_python_framework_dependency(dependency):
+    """
+    Returns True if this dependency is python library
+    """
+    if not "boost" in dependency.lower():
+        if "python" in dependency.lower():
+            return True
+    return False
+
+
+def is_qt_framework_dependency(dependency):
+    """
+    Returns True if this dependency is Qt related
+    """
+    if "Qt" in dependency:
+        return True
+    return False
+
+
+def is_to_bundle_dependency(dependency):
+    """
+    Returns True if this dependency should be moved to the bundle.
+    Qt libraries and Python framework are special case and will be treated separately.
+    """
+
+    if is_system_dependency(dependency):
+        return False
+
+    if "libBornAgain" in dependency:
+        # our own libraries are already in place and have right libId's
+        return False
+
+    return True
+
+
+def get_dependency_libId(dependency):
+    """
+    Returns libId of this dependency
+    """
+    libname = os.path.basename(dependency)
+
+    if is_python_framework_dependency(dependency):
+        return "@rpath/" + bundle_python_library()
+
+    if is_qt_framework_dependency(dependency):
+        return "@rpath/" + libname +".framework/Versions/5/"+libname
+
+    # all other libraries
+    return "@rpath/" + libname
+
+
+def get_dependency_orig_location(dependency):
+    """
+    Returns dependency original location. In most cases it is just "dependency" itself (i.e. path to file).
+    If dependency contains @rpath, then we are trying to guess where original files might be
+    """
+
+    if os.path.exists(dependency):
+        return dependency
+
+    result = None
+
+    if is_python_framework_dependency(dependency):
+        result = get_python_library_location()
+
+    elif is_qt_framework_dependency(dependency):
+        libname = os.path.basename(dependency)
+        libpath = os.path.join(libname+".framework", "Versions", "5")
+        result = os.path.join(qtlibs_path(), libpath, libname)
+
+    return result
+
+
+def get_dependency_dest_location(dependency):
+    """
+    Return new location of the dependency in the bundle
+    """
+    libname = os.path.basename(dependency)
+
+    if is_python_framework_dependency(dependency):
+        return os.path.join(bundle_frameworks_path(), bundle_python_library())
+
+    if is_qt_framework_dependency(dependency):
+        libpath = os.path.join(libname+".framework", "Versions", "5")
+        return os.path.join(bundle_frameworks_path(), libpath, libname)
+
+    return os.path.join(bundle_frameworks_path(), libname)
+
+
+def get_special_dependency_id(dependency):
+    """
+    Returns libId if this dependency requires special attention (i.e. Python framework)
+    """
+    if is_python_framework_dependency(dependency):
+        return "@rpath/" + bundle_python_library()
+
+    if is_qt_framework_dependency(dependency) and not "@rpath" in dependency:
+        libname = os.path.basename(dependency)
+        return "@rpath/" + libname +".framework/Versions/5/"+libname
+    return None
+
+
+def get_python_library_location():
+    """
+    Returns location of Python library. The library is deduced from interpreter itself
+    """
+    for dependency in otool(sys.executable):
+        print dependency
+        if os.path.exists(dependency) and "Python.framework" in dependency:
+            return dependency
+
+    # At this point it looks that interpreter depends from libPython via @loader_path
+    # Let's try to find library directly
+
+    prefix = sys.prefix
+    suffix = sysconfig.get_config_var('LDVERSION') or sysconfig.get_config_var('VERSION')
+    result = sys.prefix+"/lib/libpython"+suffix+".dylib"
+    if os.path.exists(result):
+        return result
+
+    return None
+
+
+# -----------------------------------------------------------------------------
+# Actions
+# -----------------------------------------------------------------------------
+
+
+def copy_python_framework():
+    """
+    Copies Python library to the bundle. The name of the library will be deduced from the interpreter itself.
+    """
+    print "--> Copying Python framework"
+    python_lib = get_python_library_location()
+    destfile = os.path.join(bundle_frameworks_path(), bundle_python_library())
+    make_dir(os.path.dirname(destfile))
+    print "    From '{0}'\n    To '{1}'".format(python_lib, destfile)
+    if not os.path.exists(destfile):
+        shutil.copyfile(python_lib, destfile)
+        libId = "@rpath/" + bundle_python_library()
+        setId(destfile, libId)
+
+
+def copy_qt_libraries():
+    print "--> Copying Qt libraries"
+    libs = ['QtCore', 'QtDBus', 'QtDesigner', 'QtGui', 'QtPrintSupport', 'QtWidgets', 'QtXml', 'QtSvg', 'QtNetwork']
+    print "   ",
+    for libname in libs:
+        print libname,
+        libpath = os.path.join(libname+".framework", "Versions", "5")
+        srcfile = os.path.join(qtlibs_path(), libpath, libname)
+        if os.path.exists(srcfile):
+            dstdir = os.path.join(bundle_frameworks_path(), libpath)
+            copy_file_to_dir(srcfile, dstdir)
+
+
+def copy_qt_plugins():
+    print "--> Copying Qt plugins"
+    plugins = ['platforms/libqcocoa.dylib', 'iconengines/libqsvgicon.dylib']
+    print "   ",
+    for name in plugins:
+        print name,
+        srcfile = os.path.join(qtplugins_path(), name)
+        dstdir = os.path.join(bundle_plugins_path(), os.path.dirname(name))
+        dstfile = copy_file_to_dir(srcfile, dstdir)
+        setId(dstfile, os.path.basename(dstfile))
+
+
+def process_dependency(dependency):
+    """
+    Copies external dependency library into Frameworks directory (if it is not already there)
+    and sets corresponding library Id for it. Returns library Id and new location to the user.
+    """
+
+    libId = get_dependency_libId(dependency)
+    origLocation  = get_dependency_orig_location(dependency)
+    destLocation = get_dependency_dest_location(dependency)
+
+    print "     ------"
+    if libId == dependency:
+        print "     selfDependency"
+        return None, None
+
+    if origLocation == None:
+        print "     origLocation >", origLocation
+        return libId, None
+
+    print "     origLocation >", origLocation
+    print "     destLocation >", destLocation
+    print "            libId >", libId
+
+    if os.path.exists(destLocation):
+        return libId, None
+    print "       copying to >", destLocation
+    copy_file_to_file(origLocation, destLocation)
+    setId(destLocation, libId)
+    return libId, destLocation
+
+
+def walk_through_dependencies(file_name):
+    print "============================"
+    print "walk_through ", file_name
+    for dependency in otool(file_name):
+        print "---> ", file_name, dependency
+        if is_to_bundle_dependency(dependency):
+            libId, new_location = process_dependency(dependency)
+            print "to Bundle", libId, new_location
+            if libId:
+                fixDependency(file_name, dependency, libId)
+                if new_location:
+                    walk_through_dependencies(new_location)
+
+
+def copy_dependencies():
+    print "--> Copying third party dependencies"
+    for binfile in iter(bornagain_binaries()):
+        walk_through_dependencies(binfile)
+
+
+def validate_dependencies():
+    """
+    Analyse whole bundle for missed dependencies
+    """
+    binaries = bornagain_binaries()
+    libraries = get_list_of_files(bundle_frameworks_path())
+    file_list = binaries+libraries
+    files_with_missed_dependencies = []
+    for file_name in file_list:
+        for dependency in otool(file_name):
+            if is_system_dependency(dependency) or is_rpath_dependency(dependency):
+                continue
+            if os.path.basename(file_name) in dependency:
+                # self dependency (libId)
+                continue
+            files_with_missed_dependencies.append(file_name)
+            break
+
+    if len(files_with_missed_dependencies):
+        print "Error! Still unresolved dependencies."
+        print files_with_missed_dependencies
+        raise Exception("Unresolved dependencies!")
+
+
+def fix_apple_bundle():
+    print '-'*80
+    print "Fixing OS X bundle at '{0}'".format(bundle_dir())
+    print '-'*80
+    # # copy_python_framework()
+    # FIXME provide automatic recognition of Qt dependency type (@rpath or hard coded)
+    # copy_qt_libraries() # this line should be uncommented for macport based builds
+    copy_qt_plugins()
+    copy_dependencies()
+    validate_dependencies()
+    print "Done!"
+
+
+if __name__ == '__main__':
+    if not platform.system() == 'Darwin':
+        exit("This script is intended for MacOs systems. Exiting...")
+
+    if len(sys.argv) != 2:
+        exit("Please specify bundle location")
+
+    set_bundle_dir(sys.argv[1])
+
+    fix_apple_bundle()
diff --git a/cmake/bornagain/scripts/postinst.in b/cmake/bornagain/scripts/postinst.in
new file mode 100644
index 0000000..cbe051e
--- /dev/null
+++ b/cmake/bornagain/scripts/postinst.in
@@ -0,0 +1,11 @@
+#!/bin/sh
+# postinst script for the BornAgain library
+# creates symbolic links for the library files in the PYTHONPATH
+
+set -e
+
+# creating link to BornAgain gui in bin directory
+ln -sf @CMAKE_INSTALL_PREFIX@/libexec/@destination_suffix@/BornAgain @CMAKE_INSTALL_PREFIX@/bin/bornagain
+
+# creating links for python
+ln -sf @CMAKE_INSTALL_PREFIX@/lib/@destination_suffix@/* @PYTHON_SITE_PACKAGES@/
diff --git a/cmake/bornagain/scripts/prerm.in b/cmake/bornagain/scripts/prerm.in
new file mode 100644
index 0000000..bf4cb63
--- /dev/null
+++ b/cmake/bornagain/scripts/prerm.in
@@ -0,0 +1,11 @@
+#!/bin/sh
+# prerm script for the BornAgain library
+# removes created symbolic links
+
+
+rm -f @PYTHON_SITE_PACKAGES@/bornagain
+rm -f @PYTHON_SITE_PACKAGES@/*BornAgain*
+
+rm -f @CMAKE_INSTALL_PREFIX@/bin/bornagain
+
+rm -rf @CMAKE_INSTALL_PREFIX@/lib/@destination_suffix@
diff --git a/cmake/bornagain/scripts/qt.conf b/cmake/bornagain/scripts/qt.conf
new file mode 100644
index 0000000..5f80cb7
--- /dev/null
+++ b/cmake/bornagain/scripts/qt.conf
@@ -0,0 +1,4 @@
+
+[Paths]
+Plugins = PlugIns
+  
\ No newline at end of file
diff --git a/cmake/bornagain/scripts/thisbornagain.csh.in b/cmake/bornagain/scripts/thisbornagain.csh.in
new file mode 100644
index 0000000..37a3240
--- /dev/null
+++ b/cmake/bornagain/scripts/thisbornagain.csh.in
@@ -0,0 +1,141 @@
+# thisbornagain.csh is generated by cmake from thisbornagain.csh.in
+
+# Purpose:
+#    set environment variables like LD_LIBRARY_PATH and PYTHONPATH
+#    to include the directory the current BornAgain is installed in
+
+# Usage:
+#    source <path>/thisbornagain.sh  # under sh, bash, ...
+#    source <path>/thisbornagain.csh # under csh
+
+# History:
+#    adapted from a CERN Root script by Fons Rademakers, 18/8/2006
+#    by the BornAgain team at JCNS/MLZ 2013-
+
+if ($?BORNAGAINSYS) then
+   set old_bornagain="$BORNAGAINSYS"
+endif
+
+# $_ should be source .../thisbornagain.csh
+set ARGS=($_)
+if ("$ARGS" != "") then
+   set thisbornagain="`dirname ${ARGS[2]}`"
+else
+   # But $_ might not be set if the script is source non-interactively.
+   # In [t]csh the sourced file is inserted 'in place' inside the
+   # outer script, so we need an external source of information
+   # either via the current directory or an extra parameter.
+   if ( -e thisbornagain.csh ) then
+      set thisbornagain=${PWD}
+   else if ( -e bin/thisbornagain.csh ) then
+      set thisbornagain=${PWD}/bin
+   else if ( "$1" != "" ) then
+      if ( -e ${1}/bin/thisbornagain.csh ) then
+         set thisbornagain=${1}/bin
+      else if ( -e ${1}/thisbornagain.csh ) then
+         set thisbornagain=${1}
+      else
+         echo "thisbornagain.csh: ${1} does not contain a BornAgain installation"
+      endif
+   else
+      echo 'Error: The call to "source where_bornagain_is/bin/thisbornagain.csh" can not determine the location of the BornAgain installation'
+      echo "because it was embedded another script (this is an issue specific to csh)."
+      echo "Use either:"
+      echo "   cd where_bornagain_is; source bin/thisbornagain.csh"
+      echo "or"
+      echo "   source where_bornagain_is/bin/thisbornagain.csh where_bornagain_is"
+   endif
+endif
+
+if ($?thisbornagain) then
+
+setenv BORNAGAINSYS "`(cd ${thisbornagain}/..;pwd)`"
+
+if ($?old_bornagain) then
+   setenv PATH `echo $PATH | sed -e "s;:$old_bornagain/bin:;:;g" \
+                                 -e "s;:$old_bornagain/bin;;g"   \
+                                 -e "s;$old_bornagain/bin:;;g"   \
+                                 -e "s;$old_bornagain/bin;;g"`
+   if ($?LD_LIBRARY_PATH) then
+      setenv LD_LIBRARY_PATH `echo $LD_LIBRARY_PATH | \
+                             sed -e "s;:$old_bornagain/lib:;:;g" \
+                                 -e "s;:$old_bornagain/lib;;g"   \
+                                 -e "s;$old_bornagain/lib:;;g"   \
+                                 -e "s;$old_bornagain/lib;;g"`
+   endif
+   if ($?DYLD_LIBRARY_PATH) then
+      setenv DYLD_LIBRARY_PATH `echo $DYLD_LIBRARY_PATH | \
+                             sed -e "s;:$old_bornagain/lib:;:;g" \
+                                 -e "s;:$old_bornagain/lib;;g"   \
+                                 -e "s;$old_bornagain/lib:;;g"   \
+                                 -e "s;$old_bornagain/lib;;g"`
+   endif
+   if ($?SHLIB_PATH) then
+      setenv SHLIB_PATH `echo $SHLIB_PATH | \
+                             sed -e "s;:$old_bornagain/lib:;:;g" \
+                                 -e "s;:$old_bornagain/lib;;g"   \
+                                 -e "s;$old_bornagain/lib:;;g"   \
+                                 -e "s;$old_bornagain/lib;;g"`
+   endif
+   if ($?LIBPATH) then
+      setenv LIBPATH `echo $LIBPATH | \
+                             sed -e "s;:$old_bornagain/lib:;:;g" \
+                                 -e "s;:$old_bornagain/lib;;g"   \
+                                 -e "s;$old_bornagain/lib:;;g"   \
+                                 -e "s;$old_bornagain/lib;;g"`
+   endif
+   if ($?PYTHONPATH) then
+      setenv PYTHONPATH `echo $PYTHONPATH | \
+                             sed -e "s;:$old_bornagain/lib:;:;g" \
+                                 -e "s;:$old_bornagain/lib;;g"   \
+                                 -e "s;$old_bornagain/lib:;;g"   \
+                                 -e "s;$old_bornagain/lib;;g"`
+   endif
+#   if ($?MANPATH) then
+#      setenv MANPATH `echo $MANPATH | \
+#                             sed -e "s;:$old_bornagain/man:;:;g" \
+#                                 -e "s;:$old_bornagain/man;;g"   \
+#                                 -e "s;$old_bornagain/man:;;g"   \
+#                                 -e "s;$old_bornagain/man;;g"`
+#   endif
+endif
+
+
+
+set path = (@this_bindir@ $path)
+
+if ($?LD_LIBRARY_PATH) then
+   setenv LD_LIBRARY_PATH @this_libdir@:$LD_LIBRARY_PATH      # Linux, ELF HP-UX
+else
+   setenv LD_LIBRARY_PATH @this_libdir@
+endif
+
+if ($?DYLD_LIBRARY_PATH) then
+   setenv DYLD_LIBRARY_PATH @this_libdir@:$DYLD_LIBRARY_PATH  # Mac OS X
+else
+   setenv DYLD_LIBRARY_PATH @this_libdir@
+endif
+
+if ($?SHLIB_PATH) then
+   setenv SHLIB_PATH @this_libdir@:$SHLIB_PATH                # legacy HP-UX
+else
+   setenv SHLIB_PATH @this_libdir@
+endif
+
+if ($?LIBPATH) then
+   setenv LIBPATH @this_libdir@:$LIBPATH                      # AIX
+else
+   setenv LIBPATH @this_libdir@
+endif
+
+if ($?PYTHONPATH) then
+   setenv PYTHONPATH @this_libdir@:$PYTHONPATH
+else
+   setenv PYTHONPATH @this_libdir@
+endif
+
+
+endif # if ("$thisbornagain" != "")
+
+set thisbornagain=
+set old_bornagain=
diff --git a/cmake/bornagain/scripts/thisbornagain.sh.in b/cmake/bornagain/scripts/thisbornagain.sh.in
new file mode 100644
index 0000000..452726a
--- /dev/null
+++ b/cmake/bornagain/scripts/thisbornagain.sh.in
@@ -0,0 +1,114 @@
+# thisbornagain.sh is generated by cmake from thisbornagain.sh.in
+
+# Purpose:
+#    set environment variables like LD_LIBRARY_PATH and PYTHONPATH
+#    to include the directory the current BornAgain is installed in
+
+# Usage:
+#    source <path>/thisbornagain.sh  # under sh, bash, ...
+#    source <path>/thisbornagain.csh # under csh
+
+# History:
+#    adapted from a CERN Root script by Fons Rademakers, 18/8/2006
+#    by the BornAgain team at JCNS/MLZ 2013-
+
+drop_from_path()
+{
+   # Assert that we got enough arguments
+   if test $# -ne 2 ; then
+      echo "drop_from_path: needs 2 arguments"
+      return 1
+   fi
+
+   p=$1
+   drop=$2
+
+   newpath=`echo $p | sed -e "s;:${drop}:;:;g" \
+                          -e "s;:${drop};;g"   \
+                          -e "s;${drop}:;;g"   \
+                          -e "s;${drop};;g"`
+}
+
+if [ -n "${BORNAGAINSYS}" ] ; then
+   old_bornagainsys=${BORNAGAINSYS}
+fi
+
+if [ "x${BASH_ARGV[0]}" = "x" ]; then
+    if [ ! -f bin/thisbornagain.sh ]; then
+        echo ERROR: must "cd where/BornAgain/is" before calling ". bin/thisbornagain.sh" for this version of bash!
+        BORNAGAINSYS=; export BORNAGAINSYS
+        return 1
+    fi
+    BORNAGAINSYS="$PWD"; export BORNAGAINSYS
+else
+    # get param to "."
+    thisbornagain=$(dirname ${BASH_ARGV[0]})
+    BORNAGAINSYS=$(cd ${thisbornagain}/..;pwd); export BORNAGAINSYS
+fi
+
+if [ -n "${old_bornagainsys}" ] ; then
+   if [ -n "${PATH}" ]; then
+      drop_from_path $PATH ${old_bornagainsys}/bin
+      PATH=$newpath
+   fi
+   if [ -n "${LD_LIBRARY_PATH}" ]; then
+      drop_from_path $LD_LIBRARY_PATH ${old_bornagainsys}/lib
+      LD_LIBRARY_PATH=$newpath
+   fi
+   if [ -n "${DYLD_LIBRARY_PATH}" ]; then
+      drop_from_path $DYLD_LIBRARY_PATH ${old_bornagainsys}/lib
+      DYLD_LIBRARY_PATH=$newpath
+   fi
+   if [ -n "${SHLIB_PATH}" ]; then
+      drop_from_path $SHLIB_PATH ${old_bornagainsys}/lib
+      SHLIB_PATH=$newpath
+   fi
+   if [ -n "${LIBPATH}" ]; then
+      drop_from_path $LIBPATH ${old_bornagainsys}/lib
+      LIBPATH=$newpath
+   fi
+   if [ -n "${PYTHONPATH}" ]; then
+      drop_from_path $PYTHONPATH ${old_bornagainsys}/lib
+      PYTHONPATH=$newpath
+   fi
+fi
+
+
+if [ -z "${PATH}" ]; then
+   PATH=@this_bindir@; export PATH
+else
+   PATH=@this_bindir@:$PATH; export PATH
+fi
+
+if [ -z "${LD_LIBRARY_PATH}" ]; then
+   LD_LIBRARY_PATH=@this_libdir@; export LD_LIBRARY_PATH       # Linux, ELF HP-UX
+else
+   LD_LIBRARY_PATH=@this_libdir@:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
+fi
+
+if [ -z "${DYLD_LIBRARY_PATH}" ]; then
+   DYLD_LIBRARY_PATH=@this_libdir@; export DYLD_LIBRARY_PATH   # Mac OS X
+else
+   DYLD_LIBRARY_PATH=@this_libdir@:$DYLD_LIBRARY_PATH; export DYLD_LIBRARY_PATH
+fi
+
+if [ -z "${SHLIB_PATH}" ]; then
+   SHLIB_PATH=@this_libdir@; export SHLIB_PATH                 # legacy HP-UX
+else
+   SHLIB_PATH=@this_libdir@:$SHLIB_PATH; export SHLIB_PATH
+fi
+
+if [ -z "${LIBPATH}" ]; then
+   LIBPATH=@this_libdir@; export LIBPATH                       # AIX
+else
+   LIBPATH=@this_libdir@:$LIBPATH; export LIBPATH
+fi
+
+if [ -z "${PYTHONPATH}" ]; then
+   PYTHONPATH=@this_libdir@; export PYTHONPATH
+else
+   PYTHONPATH=@this_libdir@:$PYTHONPATH; export PYTHONPATH
+fi
+
+unset old_bornagainsys
+unset thisbornagain
diff --git a/cmake/generic/modules/AddGTest.cmake b/cmake/generic/modules/AddGTest.cmake
new file mode 100644
index 0000000..ae2cd11
--- /dev/null
+++ b/cmake/generic/modules/AddGTest.cmake
@@ -0,0 +1,36 @@
+#################################################################################
+#
+#  BornAgain: simulate and fit scattering at grazing incidence
+#
+#  @file      cmake/bornagain/modules/AddGTest.cmake
+#  @brief     Implements macro ADD_GTEST(..)
+#
+#  @homepage  http://www.bornagainproject.org
+#  @license   GNU General Public License v3 or higher (see COPYING)
+#  @copyright Forschungszentrum Jülich GmbH 2016
+#  @authors   Scientific Computing Group at MLZ Garching
+#  @authors   J. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+#
+##################################################################################
+
+#  @brief Build test target from ${subdir}/main.cpp.
+
+#  stage=0: test run at compile time
+#  stage=1: test run upon "ctest"="make check"
+
+MACRO(ADD_GTEST project subdir libs stage)
+    set(TEST_NAME ${project}UnitTest${subdir})
+    set(EXE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_NAME})
+    file(GLOB include_files ${subdir}/*.h)
+    add_executable(${TEST_NAME} ${subdir}/main.cpp ${include_files})
+    target_link_libraries(${TEST_NAME} gtest ${libs})
+    if    (${stage} EQUAL 0)
+        # Execute test just after compilation
+        add_custom_target(${TEST_NAME}_run ALL DEPENDS ${TEST_NAME} COMMAND ${EXE})
+    elseif(${stage} EQUAL 1)
+        # Put test under control of CTest
+        add_test(${TEST_NAME} ${EXE})
+    else()
+        message(FATAL_ERROR "invalid parameter stage=${stage} in ADD_GTEST")
+    endif()
+ENDMACRO()
diff --git a/cmake/generic/modules/CheckCoverage.cmake b/cmake/generic/modules/CheckCoverage.cmake
new file mode 100644
index 0000000..921bfab
--- /dev/null
+++ b/cmake/generic/modules/CheckCoverage.cmake
@@ -0,0 +1,87 @@
+# CheckCoverage.cmake
+#
+# description: add custom target 'coverage' which generates a code coverage report
+#
+# usage: from build directory
+#
+#        cmake .. -DCMAKE_BUILD_TYPE=Debug
+#        ctest   (or make check)
+#        cmake --build . --config Debug --target coverage
+#
+# author: Jonathan Fisher
+#         j.fisher at fz-juelich.de, jonathan.m.fisher at gmail.com
+#
+# copyright: 2016 Scientific Computing Group, Forschungszentrum Juelich GmbH
+#
+# license: see LICENSE
+
+find_program(GCOV_COMMAND gcov)
+find_program(LCOV_COMMAND lcov)
+find_program(GENHTML_COMMAND genhtml)
+
+if(GCOV_COMMAND)
+    set(CMAKE_GCOV_FOUND TRUE)
+else()
+    message(ERROR "could not locate gcov executable, cannot add code coverage custom target!")
+endif()
+
+if(LCOV_COMMAND)
+    set(CMAKE_LCOV_FOUND TRUE)
+else()
+    message(ERROR "could not locate lcov executable, cannot add code coverage custom target!")
+endif()
+
+if(GENHTML_COMMAND)
+    set(CMAKE_GENHTML_FOUND TRUE)
+else()
+    message(ERROR "could not locate genhtml executable, cannot add code coverage custom target!")
+endif()
+
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -coverage")
+else()
+    message(ERROR "C compiler is not GNU; don't know how to set code coverage flags!")
+endif()
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -coverage")
+else()
+    message(ERROR "CXX compiler is not GNU; don't know how to set code coverage flags!")
+endif()
+
+# function to add a coverage target
+# it will scan the working directory for coverage info, ignoring the directories in ignore_directories
+function(add_coverage_target targetname ignore_directories html_dir)
+
+    if (NOT CMAKE_GCOV_FOUND)
+        message(FATAL_ERROR "gcov not found! aborting")
+    endif()
+
+    if (NOT CMAKE_LCOV_FOUND)
+        message(FATAL_ERROR "lcov not found! aborting")
+    endif()
+
+    if (NOT CMAKE_GENHTML_FOUND)
+        message(FATAL_ERROR "genhtml not found! aborting")
+    endif()
+
+    set(lcov_output "${CMAKE_CURRENT_BINARY_DIR}/${targetname}.info")
+
+    add_custom_target(${targetname}
+        COMMAND ${LCOV_COMMAND} --directory ${CMAKE_CURRENT_BINARY_DIR} --capture --output-file ${lcov_output})
+
+    add_custom_target(${targetname}_reset
+        COMMAND ${LCOV_COMMAND} --directory ${CMAKE_CURRENT_BINARY_DIR} --zerocounters)
+
+    foreach(dirname ${ignore_directories})
+        message(STATUS "ignoring dirname = ${dirname} in code coverage")
+        add_custom_command(TARGET ${targetname}
+            COMMAND ${LCOV_COMMAND} --remove ${lcov_output} ${dirname} --output-file ${lcov_output}.clean
+            COMMAND ${CMAKE_COMMAND} -E rename ${lcov_output}.clean ${lcov_output})
+    endforeach()
+
+    add_custom_command(TARGET ${targetname} POST_BUILD
+        COMMAND ${GENHTML_COMMAND} ${lcov_output} --output-directory ${html_dir}
+        COMMENT "open index.html in your webbrowser to see the code coverage report.")
+
+endfunction()
diff --git a/cmake/generic/modules/DebugOptimization.cmake b/cmake/generic/modules/DebugOptimization.cmake
new file mode 100644
index 0000000..13e72df
--- /dev/null
+++ b/cmake/generic/modules/DebugOptimization.cmake
@@ -0,0 +1,30 @@
+# DebugOptimization.cmake
+#
+# description: add debug optimization (gcc only)custom target 'coverage' which generates a code coverage report
+#
+# usage: from build directory
+#
+#        cmake .. -DCMAKE_BUILD_TYPE=Debug
+#        ctest   (or make check)
+#        cmake --build . --config Debug --target coverage
+#
+# author: Jonathan Fisher
+#         j.fisher at fz-juelich.de, jonathan.m.fisher at gmail.com
+#
+# copyright: 2016 scientific computing group, Forshungszentrum Juelich GmbH
+#
+# license: see LICENSE
+#
+
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Og")
+else()
+  message(WARNING "C compiler is not GNU; debug optimization has no effect")
+endif()
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og")
+else()
+  message(WARNING "C compiler is not GNU; debug optimization has no effect")
+endif()
+
diff --git a/cmake/generic/modules/FindBoost.cmake b/cmake/generic/modules/FindBoost.cmake
new file mode 100644
index 0000000..856c626
--- /dev/null
+++ b/cmake/generic/modules/FindBoost.cmake
@@ -0,0 +1,1825 @@
+# from CMake-3.6, patched for use with Boost >= 1.62 (see "patched")
+
+#.rst:
+# FindBoost
+# ---------
+#
+# Find Boost include dirs and libraries
+#
+# Use this module by invoking find_package with the form::
+#
+#   find_package(Boost
+#     [version] [EXACT]      # Minimum or EXACT version e.g. 1.36.0
+#     [REQUIRED]             # Fail with error if Boost is not found
+#     [COMPONENTS <libs>...] # Boost libraries by their canonical name
+#     )                      # e.g. "date_time" for "libboost_date_time"
+#
+# This module finds headers and requested component libraries OR a CMake
+# package configuration file provided by a "Boost CMake" build.  For the
+# latter case skip to the "Boost CMake" section below.  For the former
+# case results are reported in variables::
+#
+#   Boost_FOUND            - True if headers and requested libraries were found
+#   Boost_INCLUDE_DIRS     - Boost include directories
+#   Boost_LIBRARY_DIRS     - Link directories for Boost libraries
+#   Boost_LIBRARIES        - Boost component libraries to be linked
+#   Boost_<C>_FOUND        - True if component <C> was found (<C> is upper-case)
+#   Boost_<C>_LIBRARY      - Libraries to link for component <C> (may include
+#                            target_link_libraries debug/optimized keywords)
+#   Boost_VERSION          - BOOST_VERSION value from boost/version.hpp
+#   Boost_LIB_VERSION      - Version string appended to library filenames
+#   Boost_MAJOR_VERSION    - Boost major version number (X in X.y.z)
+#   Boost_MINOR_VERSION    - Boost minor version number (Y in x.Y.z)
+#   Boost_SUBMINOR_VERSION - Boost subminor version number (Z in x.y.Z)
+#   Boost_LIB_DIAGNOSTIC_DEFINITIONS (Windows)
+#                          - Pass to add_definitions() to have diagnostic
+#                            information about Boost's automatic linking
+#                            displayed during compilation
+#
+# This module reads hints about search locations from variables::
+#
+#   BOOST_ROOT             - Preferred installation prefix
+#    (or BOOSTROOT)
+#   BOOST_INCLUDEDIR       - Preferred include directory e.g. <prefix>/include
+#   BOOST_LIBRARYDIR       - Preferred library directory e.g. <prefix>/lib
+#   Boost_NO_SYSTEM_PATHS  - Set to ON to disable searching in locations not
+#                            specified by these hint variables. Default is OFF.
+#   Boost_ADDITIONAL_VERSIONS
+#                          - List of Boost versions not known to this module
+#                            (Boost install locations may contain the version)
+#
+# and saves search results persistently in CMake cache entries::
+#
+#   Boost_INCLUDE_DIR         - Directory containing Boost headers
+#   Boost_LIBRARY_DIR_RELEASE - Directory containing release Boost libraries
+#   Boost_LIBRARY_DIR_DEBUG   - Directory containing debug Boost libraries
+#   Boost_<C>_LIBRARY_DEBUG   - Component <C> library debug variant
+#   Boost_<C>_LIBRARY_RELEASE - Component <C> library release variant
+#
+# The following :prop_tgt:`IMPORTED` targets are also defined::
+#
+#   Boost::boost                  - Target for header-only dependencies
+#                                   (Boost include directory)
+#   Boost::<C>                    - Target for specific component dependency
+#                                   (shared or static library); <C> is lower-
+#                                   case
+#   Boost::diagnostic_definitions - interface target to enable diagnostic
+#                                   information about Boost's automatic linking
+#                                   during compilation (adds BOOST_LIB_DIAGNOSTIC)
+#   Boost::disable_autolinking    - interface target to disable automatic
+#                                   linking with MSVC (adds BOOST_ALL_NO_LIB)
+#   Boost::dynamic_linking        - interface target to enable dynamic linking
+#                                   linking with MSVC (adds BOOST_ALL_DYN_LINK)
+#
+# Implicit dependencies such as Boost::filesystem requiring
+# Boost::system will be automatically detected and satisfied, even
+# if system is not specified when using find_package and if
+# Boost::system is not added to target_link_libraries.  If using
+# Boost::thread, then Thread::Thread will also be added automatically.
+#
+# It is important to note that the imported targets behave differently
+# than variables created by this module: multiple calls to
+# find_package(Boost) in the same directory or sub-directories with
+# different options (e.g. static or shared) will not override the
+# values of the targets created by the first call.
+#
+# Users may set these hints or results as cache entries.  Projects
+# should not read these entries directly but instead use the above
+# result variables.  Note that some hint names start in upper-case
+# "BOOST".  One may specify these as environment variables if they are
+# not specified as CMake variables or cache entries.
+#
+# This module first searches for the Boost header files using the above
+# hint variables (excluding BOOST_LIBRARYDIR) and saves the result in
+# Boost_INCLUDE_DIR.  Then it searches for requested component libraries
+# using the above hints (excluding BOOST_INCLUDEDIR and
+# Boost_ADDITIONAL_VERSIONS), "lib" directories near Boost_INCLUDE_DIR,
+# and the library name configuration settings below.  It saves the
+# library directories in Boost_LIBRARY_DIR_DEBUG and
+# Boost_LIBRARY_DIR_RELEASE and individual library
+# locations in Boost_<C>_LIBRARY_DEBUG and Boost_<C>_LIBRARY_RELEASE.
+# When one changes settings used by previous searches in the same build
+# tree (excluding environment variables) this module discards previous
+# search results affected by the changes and searches again.
+#
+# Boost libraries come in many variants encoded in their file name.
+# Users or projects may tell this module which variant to find by
+# setting variables::
+#
+#   Boost_USE_MULTITHREADED  - Set to OFF to use the non-multithreaded
+#                              libraries ('mt' tag).  Default is ON.
+#   Boost_USE_STATIC_LIBS    - Set to ON to force the use of the static
+#                              libraries.  Default is OFF.
+#   Boost_USE_STATIC_RUNTIME - Set to ON or OFF to specify whether to use
+#                              libraries linked statically to the C++ runtime
+#                              ('s' tag).  Default is platform dependent.
+#   Boost_USE_DEBUG_RUNTIME  - Set to ON or OFF to specify whether to use
+#                              libraries linked to the MS debug C++ runtime
+#                              ('g' tag).  Default is ON.
+#   Boost_USE_DEBUG_PYTHON   - Set to ON to use libraries compiled with a
+#                              debug Python build ('y' tag). Default is OFF.
+#   Boost_USE_STLPORT        - Set to ON to use libraries compiled with
+#                              STLPort ('p' tag).  Default is OFF.
+#   Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS
+#                            - Set to ON to use libraries compiled with
+#                              STLPort deprecated "native iostreams"
+#                              ('n' tag).  Default is OFF.
+#   Boost_COMPILER           - Set to the compiler-specific library suffix
+#                              (e.g. "-gcc43").  Default is auto-computed
+#                              for the C++ compiler in use.
+#   Boost_THREADAPI          - Suffix for "thread" component library name,
+#                              such as "pthread" or "win32".  Names with
+#                              and without this suffix will both be tried.
+#   Boost_NAMESPACE          - Alternate namespace used to build boost with
+#                              e.g. if set to "myboost", will search for
+#                              myboost_thread instead of boost_thread.
+#
+# Other variables one may set to control this module are::
+#
+#   Boost_DEBUG              - Set to ON to enable debug output from FindBoost.
+#                              Please enable this before filing any bug report.
+#   Boost_DETAILED_FAILURE_MSG
+#                            - Set to ON to add detailed information to the
+#                              failure message even when the REQUIRED option
+#                              is not given to the find_package call.
+#   Boost_REALPATH           - Set to ON to resolve symlinks for discovered
+#                              libraries to assist with packaging.  For example,
+#                              the "system" component library may be resolved to
+#                              "/usr/lib/libboost_system.so.1.42.0" instead of
+#                              "/usr/lib/libboost_system.so".  This does not
+#                              affect linking and should not be enabled unless
+#                              the user needs this information.
+#   Boost_LIBRARY_DIR        - Default value for Boost_LIBRARY_DIR_RELEASE and
+#                              Boost_LIBRARY_DIR_DEBUG.
+#
+# On Visual Studio and Borland compilers Boost headers request automatic
+# linking to corresponding libraries.  This requires matching libraries
+# to be linked explicitly or available in the link library search path.
+# In this case setting Boost_USE_STATIC_LIBS to OFF may not achieve
+# dynamic linking.  Boost automatic linking typically requests static
+# libraries with a few exceptions (such as Boost.Python).  Use::
+#
+#   add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS})
+#
+# to ask Boost to report information about automatic linking requests.
+#
+# Example to find Boost headers only::
+#
+#   find_package(Boost 1.36.0)
+#   if(Boost_FOUND)
+#     include_directories(${Boost_INCLUDE_DIRS})
+#     add_executable(foo foo.cc)
+#   endif()
+#
+# Example to find Boost libraries and use imported targets::
+#
+#   find_package(Boost 1.56 REQUIRED COMPONENTS
+#                date_time filesystem iostreams)
+#   add_executable(foo foo.cc)
+#   target_link_libraries(foo Boost::date_time Boost::filesystem
+#                             Boost::iostreams)
+#
+# Example to find Boost headers and some *static* libraries::
+#
+#   set(Boost_USE_STATIC_LIBS        ON) # only find static libs
+#   set(Boost_USE_MULTITHREADED      ON)
+#   set(Boost_USE_STATIC_RUNTIME    OFF)
+#   find_package(Boost 1.36.0 COMPONENTS date_time filesystem system ...)
+#   if(Boost_FOUND)
+#     include_directories(${Boost_INCLUDE_DIRS})
+#     add_executable(foo foo.cc)
+#     target_link_libraries(foo ${Boost_LIBRARIES})
+#   endif()
+#
+# Boost CMake
+# ^^^^^^^^^^^
+#
+# If Boost was built using the boost-cmake project it provides a package
+# configuration file for use with find_package's Config mode.  This
+# module looks for the package configuration file called
+# BoostConfig.cmake or boost-config.cmake and stores the result in cache
+# entry "Boost_DIR".  If found, the package configuration file is loaded
+# and this module returns with no further action.  See documentation of
+# the Boost CMake package configuration for details on what it provides.
+#
+# Set Boost_NO_BOOST_CMAKE to ON to disable the search for boost-cmake.
+
+#=============================================================================
+# Copyright 2006-2012 Kitware, Inc.
+# Copyright 2006-2008 Andreas Schneider <mail at cynapses.org>
+# Copyright 2007      Wengo
+# Copyright 2007      Mike Jackson
+# Copyright 2008      Andreas Pakulat <apaku at gmx.de>
+# Copyright 2008-2012 Philip Lowman <philip at yhbt.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+
+#-------------------------------------------------------------------------------
+# Before we go searching, check whether boost-cmake is available, unless the
+# user specifically asked NOT to search for boost-cmake.
+#
+# If Boost_DIR is set, this behaves as any find_package call would. If not,
+# it looks at BOOST_ROOT and BOOSTROOT to find Boost.
+#
+if (NOT Boost_NO_BOOST_CMAKE)
+  # If Boost_DIR is not set, look for BOOSTROOT and BOOST_ROOT as alternatives,
+  # since these are more conventional for Boost.
+  if ("$ENV{Boost_DIR}" STREQUAL "")
+    if (NOT "$ENV{BOOST_ROOT}" STREQUAL "")
+      set(ENV{Boost_DIR} $ENV{BOOST_ROOT})
+    elseif (NOT "$ENV{BOOSTROOT}" STREQUAL "")
+      set(ENV{Boost_DIR} $ENV{BOOSTROOT})
+    endif()
+  endif()
+
+  # Do the same find_package call but look specifically for the CMake version.
+  # Note that args are passed in the Boost_FIND_xxxxx variables, so there is no
+  # need to delegate them to this find_package call.
+  find_package(Boost QUIET NO_MODULE)
+  mark_as_advanced(Boost_DIR)
+
+  # If we found boost-cmake, then we're done.  Print out what we found.
+  # Otherwise let the rest of the module try to find it.
+  if (Boost_FOUND)
+    message("Boost ${Boost_FIND_VERSION} found.")
+    if (Boost_FIND_COMPONENTS)
+      message("Found Boost components:")
+      message("   ${Boost_FIND_COMPONENTS}")
+    endif()
+    return()
+  endif()
+endif()
+
+
+#-------------------------------------------------------------------------------
+#  FindBoost functions & macros
+#
+
+############################################
+#
+# Check the existence of the libraries.
+#
+############################################
+# This macro was taken directly from the FindQt4.cmake file that is included
+# with the CMake distribution. This is NOT my work. All work was done by the
+# original authors of the FindQt4.cmake file. Only minor modifications were
+# made to remove references to Qt and make this file more generally applicable
+# And ELSE/ENDIF pairs were removed for readability.
+#########################################################################
+
+macro(_Boost_ADJUST_LIB_VARS basename)
+  if(Boost_INCLUDE_DIR )
+    if(Boost_${basename}_LIBRARY_DEBUG AND Boost_${basename}_LIBRARY_RELEASE)
+      # if the generator supports configuration types then set
+      # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value
+      if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
+        set(Boost_${basename}_LIBRARY optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG})
+      else()
+        # if there are no configuration types and CMAKE_BUILD_TYPE has no value
+        # then just use the release libraries
+        set(Boost_${basename}_LIBRARY ${Boost_${basename}_LIBRARY_RELEASE} )
+      endif()
+      # FIXME: This probably should be set for both cases
+      set(Boost_${basename}_LIBRARIES optimized ${Boost_${basename}_LIBRARY_RELEASE} debug ${Boost_${basename}_LIBRARY_DEBUG})
+    endif()
+
+    # if only the release version was found, set the debug variable also to the release version
+    if(Boost_${basename}_LIBRARY_RELEASE AND NOT Boost_${basename}_LIBRARY_DEBUG)
+      set(Boost_${basename}_LIBRARY_DEBUG ${Boost_${basename}_LIBRARY_RELEASE})
+      set(Boost_${basename}_LIBRARY       ${Boost_${basename}_LIBRARY_RELEASE})
+      set(Boost_${basename}_LIBRARIES     ${Boost_${basename}_LIBRARY_RELEASE})
+    endif()
+
+    # if only the debug version was found, set the release variable also to the debug version
+    if(Boost_${basename}_LIBRARY_DEBUG AND NOT Boost_${basename}_LIBRARY_RELEASE)
+      set(Boost_${basename}_LIBRARY_RELEASE ${Boost_${basename}_LIBRARY_DEBUG})
+      set(Boost_${basename}_LIBRARY         ${Boost_${basename}_LIBRARY_DEBUG})
+      set(Boost_${basename}_LIBRARIES       ${Boost_${basename}_LIBRARY_DEBUG})
+    endif()
+
+    # If the debug & release library ends up being the same, omit the keywords
+    if(${Boost_${basename}_LIBRARY_RELEASE} STREQUAL ${Boost_${basename}_LIBRARY_DEBUG})
+      set(Boost_${basename}_LIBRARY   ${Boost_${basename}_LIBRARY_RELEASE} )
+      set(Boost_${basename}_LIBRARIES ${Boost_${basename}_LIBRARY_RELEASE} )
+    endif()
+
+    if(Boost_${basename}_LIBRARY AND Boost_${basename}_HEADER)
+      set(Boost_${basename}_FOUND ON)
+    endif()
+
+  endif()
+  # Make variables changeable to the advanced user
+  mark_as_advanced(
+      Boost_${basename}_LIBRARY_RELEASE
+      Boost_${basename}_LIBRARY_DEBUG
+  )
+endmacro()
+
+# Detect changes in used variables.
+# Compares the current variable value with the last one.
+# In short form:
+# v != v_LAST                      -> CHANGED = 1
+# v is defined, v_LAST not         -> CHANGED = 1
+# v is not defined, but v_LAST is  -> CHANGED = 1
+# otherwise                        -> CHANGED = 0
+# CHANGED is returned in variable named ${changed_var}
+macro(_Boost_CHANGE_DETECT changed_var)
+  set(${changed_var} 0)
+  foreach(v ${ARGN})
+    if(DEFINED _Boost_COMPONENTS_SEARCHED)
+      if(${v})
+        if(_${v}_LAST)
+          string(COMPARE NOTEQUAL "${${v}}" "${_${v}_LAST}" _${v}_CHANGED)
+        else()
+          set(_${v}_CHANGED 1)
+        endif()
+      elseif(_${v}_LAST)
+        set(_${v}_CHANGED 1)
+      endif()
+      if(_${v}_CHANGED)
+        set(${changed_var} 1)
+      endif()
+    else()
+      set(_${v}_CHANGED 0)
+    endif()
+  endforeach()
+endmacro()
+
+#
+# Find the given library (var).
+# Use 'build_type' to support different lib paths for RELEASE or DEBUG builds
+#
+macro(_Boost_FIND_LIBRARY var build_type)
+
+  find_library(${var} ${ARGN})
+
+  if(${var})
+    # If this is the first library found then save Boost_LIBRARY_DIR_[RELEASE,DEBUG].
+    if(NOT Boost_LIBRARY_DIR_${build_type})
+      get_filename_component(_dir "${${var}}" PATH)
+      set(Boost_LIBRARY_DIR_${build_type} "${_dir}" CACHE PATH "Boost library directory ${build_type}" FORCE)
+    endif()
+  elseif(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT)
+    # Try component-specific hints but do not save Boost_LIBRARY_DIR_[RELEASE,DEBUG].
+    find_library(${var} HINTS ${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT} ${ARGN})
+  endif()
+
+  # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is known then search only there.
+  if(Boost_LIBRARY_DIR_${build_type})
+    set(_boost_LIBRARY_SEARCH_DIRS_${build_type} ${Boost_LIBRARY_DIR_${build_type}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
+    if(Boost_DEBUG)
+      message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+        " Boost_LIBRARY_DIR_${build_type} = ${Boost_LIBRARY_DIR_${build_type}}"
+        " _boost_LIBRARY_SEARCH_DIRS_${build_type} = ${_boost_LIBRARY_SEARCH_DIRS_${build_type}}")
+    endif()
+  endif()
+endmacro()
+
+#-------------------------------------------------------------------------------
+
+#
+# Runs compiler with "-dumpversion" and parses major/minor
+# version with a regex.
+#
+function(_Boost_COMPILER_DUMPVERSION _OUTPUT_VERSION)
+
+  exec_program(${CMAKE_CXX_COMPILER}
+    ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
+    OUTPUT_VARIABLE _boost_COMPILER_VERSION
+  )
+  string(REGEX REPLACE "([0-9])\\.([0-9])(\\.[0-9])?" "\\1\\2"
+    _boost_COMPILER_VERSION ${_boost_COMPILER_VERSION})
+
+  set(${_OUTPUT_VERSION} ${_boost_COMPILER_VERSION} PARENT_SCOPE)
+endfunction()
+
+#
+# Take a list of libraries with "thread" in it
+# and prepend duplicates with "thread_${Boost_THREADAPI}"
+# at the front of the list
+#
+function(_Boost_PREPEND_LIST_WITH_THREADAPI _output)
+  set(_orig_libnames ${ARGN})
+  string(REPLACE "thread" "thread_${Boost_THREADAPI}" _threadapi_libnames "${_orig_libnames}")
+  set(${_output} ${_threadapi_libnames} ${_orig_libnames} PARENT_SCOPE)
+endfunction()
+
+#
+# If a library is found, replace its cache entry with its REALPATH
+#
+function(_Boost_SWAP_WITH_REALPATH _library _docstring)
+  if(${_library})
+    get_filename_component(_boost_filepathreal ${${_library}} REALPATH)
+    unset(${_library} CACHE)
+    set(${_library} ${_boost_filepathreal} CACHE FILEPATH "${_docstring}")
+  endif()
+endfunction()
+
+function(_Boost_CHECK_SPELLING _var)
+  if(${_var})
+    string(TOUPPER ${_var} _var_UC)
+    message(FATAL_ERROR "ERROR: ${_var} is not the correct spelling.  The proper spelling is ${_var_UC}.")
+  endif()
+endfunction()
+
+# Guesses Boost's compiler prefix used in built library names
+# Returns the guess by setting the variable pointed to by _ret
+function(_Boost_GUESS_COMPILER_PREFIX _ret)
+  if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel"
+      OR CMAKE_CXX_COMPILER MATCHES "icl"
+      OR CMAKE_CXX_COMPILER MATCHES "icpc")
+    if(WIN32)
+      set (_boost_COMPILER "-iw")
+    else()
+      set (_boost_COMPILER "-il")
+    endif()
+  elseif (GHSMULTI)
+    set(_boost_COMPILER "-ghs")
+  elseif (MSVC14)
+    set(_boost_COMPILER "-vc140")
+  elseif (MSVC12)
+    set(_boost_COMPILER "-vc120")
+  elseif (MSVC11)
+    set(_boost_COMPILER "-vc110")
+  elseif (MSVC10)
+    set(_boost_COMPILER "-vc100")
+  elseif (MSVC90)
+    set(_boost_COMPILER "-vc90")
+  elseif (MSVC80)
+    set(_boost_COMPILER "-vc80")
+  elseif (MSVC71)
+    set(_boost_COMPILER "-vc71")
+  elseif (MSVC70) # Good luck!
+    set(_boost_COMPILER "-vc7") # yes, this is correct
+  elseif (MSVC60) # Good luck!
+    set(_boost_COMPILER "-vc6") # yes, this is correct
+  elseif (BORLAND)
+    set(_boost_COMPILER "-bcb")
+  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
+    set(_boost_COMPILER "-sw")
+  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "XL")
+    set(_boost_COMPILER "-xlc")
+  elseif (MINGW)
+    if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34)
+        set(_boost_COMPILER "-mgw") # no GCC version encoding prior to 1.34
+    else()
+      _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION)
+      set(_boost_COMPILER "-mgw${_boost_COMPILER_VERSION}")
+    endif()
+  elseif (UNIX)
+    if (CMAKE_COMPILER_IS_GNUCXX)
+      if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34)
+        set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34
+      else()
+        _Boost_COMPILER_DUMPVERSION(_boost_COMPILER_VERSION)
+        # Determine which version of GCC we have.
+        if(APPLE)
+          if(Boost_MINOR_VERSION)
+            if(${Boost_MINOR_VERSION} GREATER 35)
+              # In Boost 1.36.0 and newer, the mangled compiler name used
+              # on Mac OS X/Darwin is "xgcc".
+              set(_boost_COMPILER "-xgcc${_boost_COMPILER_VERSION}")
+            else()
+              # In Boost <= 1.35.0, there is no mangled compiler name for
+              # the Mac OS X/Darwin version of GCC.
+              set(_boost_COMPILER "")
+            endif()
+          else()
+            # We don't know the Boost version, so assume it's
+            # pre-1.36.0.
+            set(_boost_COMPILER "")
+          endif()
+        else()
+          set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}")
+        endif()
+      endif()
+    endif ()
+  else()
+    # TODO at least Boost_DEBUG here?
+    set(_boost_COMPILER "")
+  endif()
+  set(${_ret} ${_boost_COMPILER} PARENT_SCOPE)
+endfunction()
+
+#
+# Get component dependencies.  Requires the dependencies to have been
+# defined for the Boost release version.
+#
+# component - the component to check
+# _ret - list of library dependencies
+#
+function(_Boost_COMPONENT_DEPENDENCIES component _ret)
+  # Note: to add a new Boost release, run
+  #
+  #   % cmake -DBOOST_DIR=/path/to/boost/source -P Utilities/Scripts/BoostScanDeps.cmake
+  #
+  # The output may be added in a new block below.  If it's the same as
+  # the previous release, simply update the version range of the block
+  # for the previous release.  Also check if any new components have
+  # been added, and add any new components to
+  # _Boost_COMPONENT_HEADERS.
+  #
+  # This information was originally generated by running
+  # BoostScanDeps.cmake against every boost release to date supported
+  # by FindBoost:
+  #
+  #   % for version in /path/to/boost/sources/*
+  #     do
+  #       cmake -DBOOST_DIR=$version -P Utilities/Scripts/BoostScanDeps.cmake
+  #     done
+  #
+  # The output was then updated by search and replace with these regexes:
+  #
+  # - Strip message(STATUS) prefix dashes
+  #   s;^-- ;;
+  # - Indent
+  #   s;^set(;    set(;;
+  # - Add conditionals
+  #   s;Scanning /path/to/boost/sources/boost_\(.*\)_\(.*\)_\(.*);  elseif(NOT Boost_VERSION VERSION_LESS \10\20\3 AND Boost_VERSION VERSION_LESS xxxx);
+  #
+  # This results in the logic seen below, but will require the xxxx
+  # replacing with the following Boost release version (or the next
+  # minor version to be released, e.g. 1.59 was the latest at the time
+  # of writing, making 1.60 the next, so 106000 is the needed version
+  # number).  Identical consecutive releases were then merged together
+  # by updating the end range of the first block and removing the
+  # following redundant blocks.
+  #
+  # Running the script against all historical releases should be
+  # required only if the BoostScanDeps.cmake script logic is changed.
+  # The addition of a new release should only require it to be run
+  # against the new release.
+  set(_Boost_IMPORTED_TARGETS TRUE)
+  if(NOT Boost_VERSION VERSION_LESS 103300 AND Boost_VERSION VERSION_LESS 103500)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex thread)
+    set(_Boost_REGEX_DEPENDENCIES thread)
+    set(_Boost_WAVE_DEPENDENCIES filesystem thread)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 103500 AND Boost_VERSION VERSION_LESS 103600)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system thread)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 103600 AND Boost_VERSION VERSION_LESS 103800)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system thread)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 103800 AND Boost_VERSION VERSION_LESS 104300)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES date_time)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 104300 AND Boost_VERSION VERSION_LESS 104400)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES date_time)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system thread date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 104400 AND Boost_VERSION VERSION_LESS 104500)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random serialization)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES date_time)
+    set(_Boost_WAVE_DEPENDENCIES serialization filesystem system thread date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 104500 AND Boost_VERSION VERSION_LESS 104700)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES date_time)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 104700 AND Boost_VERSION VERSION_LESS 104800)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES date_time)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 104800 AND Boost_VERSION VERSION_LESS 105000)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES date_time)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 105000 AND Boost_VERSION VERSION_LESS 105300)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 105300 AND Boost_VERSION VERSION_LESS 105400)
+    set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 105400 AND Boost_VERSION VERSION_LESS 105500)
+    set(_Boost_ATOMIC_DEPENDENCIES thread chrono system date_time)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 105500 AND Boost_VERSION VERSION_LESS 105600)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_COROUTINE_DEPENDENCIES context system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l regex random)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 105600 AND Boost_VERSION VERSION_LESS 105900)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_COROUTINE_DEPENDENCIES context system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_RANDOM_DEPENDENCIES system)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 105900 AND Boost_VERSION VERSION_LESS 106000)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_COROUTINE_DEPENDENCIES context system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_LOG_DEPENDENCIES log_setup date_time system filesystem thread regex chrono atomic)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_RANDOM_DEPENDENCIES system)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 106000 AND Boost_VERSION VERSION_LESS 106100)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_COROUTINE_DEPENDENCIES context system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_RANDOM_DEPENDENCIES system)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic)
+    set(_Boost_TIMER_DEPENDENCIES chrono system)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  elseif(NOT Boost_VERSION VERSION_LESS 106100) # patched AND Boost_VERSION VERSION_LESS 106200)
+    set(_Boost_CHRONO_DEPENDENCIES system)
+    set(_Boost_CONTEXT_DEPENDENCIES thread chrono system date_time)
+    set(_Boost_COROUTINE_DEPENDENCIES context system)
+    set(_Boost_FILESYSTEM_DEPENDENCIES system)
+    set(_Boost_IOSTREAMS_DEPENDENCIES regex)
+    set(_Boost_LOG_DEPENDENCIES date_time log_setup system filesystem thread regex chrono atomic)
+    set(_Boost_MATH_DEPENDENCIES math_c99 math_c99f math_c99l math_tr1 math_tr1f math_tr1l atomic)
+    set(_Boost_MPI_DEPENDENCIES serialization)
+    set(_Boost_MPI_PYTHON_DEPENDENCIES python mpi serialization)
+    set(_Boost_RANDOM_DEPENDENCIES system)
+    set(_Boost_THREAD_DEPENDENCIES chrono system date_time atomic)
+    set(_Boost_WAVE_DEPENDENCIES filesystem system serialization thread chrono date_time atomic)
+    set(_Boost_WSERIALIZATION_DEPENDENCIES serialization)
+  else()
+    message(WARNING "Imported targets not available for Boost version ${Boost_VERSION}")
+    set(_Boost_IMPORTED_TARGETS FALSE)
+  endif()
+
+  string(TOUPPER ${component} uppercomponent)
+  set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE)
+  set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE)
+
+  string(REGEX REPLACE ";" " " _boost_DEPS_STRING "${_Boost_${uppercomponent}_DEPENDENCIES}")
+  if (NOT _boost_DEPS_STRING)
+    set(_boost_DEPS_STRING "(none)")
+  endif()
+  # message(STATUS "Dependencies for Boost::${component}: ${_boost_DEPS_STRING}")
+endfunction()
+
+#
+# Get component headers.  This is the primary header (or headers) for
+# a given component, and is used to check that the headers are present
+# as well as the library itself as an extra sanity check of the build
+# environment.
+#
+# component - the component to check
+# _hdrs
+#
+function(_Boost_COMPONENT_HEADERS component _hdrs)
+  # Note: new boost components will require adding here.  The header
+  # must be present in all versions of Boost providing a library.
+  set(_Boost_ATOMIC_HEADERS              "boost/atomic.hpp")
+  set(_Boost_CHRONO_HEADERS              "boost/chrono.hpp")
+  set(_Boost_CONTAINER_HEADERS           "boost/container/container_fwd.hpp")
+  set(_Boost_CONTEXT_HEADERS             "boost/context/all.hpp")
+  set(_Boost_COROUTINE_HEADERS           "boost/coroutine/all.hpp")
+  set(_Boost_EXCEPTION_HEADERS           "boost/exception/exception.hpp")
+  set(_Boost_DATE_TIME_HEADERS           "boost/date_time/date.hpp")
+  set(_Boost_FILESYSTEM_HEADERS          "boost/filesystem/path.hpp")
+  set(_Boost_GRAPH_HEADERS               "boost/graph/adjacency_list.hpp")
+  set(_Boost_GRAPH_PARALLEL_HEADERS      "boost/graph/adjacency_list.hpp")
+  set(_Boost_IOSTREAMS_HEADERS           "boost/iostreams/stream.hpp")
+  set(_Boost_LOCALE_HEADERS              "boost/locale.hpp")
+  set(_Boost_LOG_HEADERS                 "boost/log/core.hpp")
+  set(_Boost_LOG_SETUP_HEADERS           "boost/log/detail/setup_config.hpp")
+  set(_Boost_MATH_HEADERS                "boost/math_fwd.hpp")
+  set(_Boost_MATH_C99_HEADERS            "boost/math/tr1.hpp")
+  set(_Boost_MATH_C99F_HEADERS           "boost/math/tr1.hpp")
+  set(_Boost_MATH_C99L_HEADERS           "boost/math/tr1.hpp")
+  set(_Boost_MATH_TR1_HEADERS            "boost/math/tr1.hpp")
+  set(_Boost_MATH_TR1F_HEADERS           "boost/math/tr1.hpp")
+  set(_Boost_MATH_TR1L_HEADERS           "boost/math/tr1.hpp")
+  set(_Boost_MPI_HEADERS                 "boost/mpi.hpp")
+  set(_Boost_MPI_PYTHON_HEADERS          "boost/mpi/python/config.hpp")
+  set(_Boost_PRG_EXEC_MONITOR_HEADERS    "boost/test/prg_exec_monitor.hpp")
+  set(_Boost_PROGRAM_OPTIONS_HEADERS     "boost/program_options.hpp")
+  set(_Boost_PYTHON_HEADERS              "boost/python.hpp")
+  set(_Boost_RANDOM_HEADERS              "boost/random.hpp")
+  set(_Boost_REGEX_HEADERS               "boost/regex.hpp")
+  set(_Boost_SERIALIZATION_HEADERS       "boost/serialization/serialization.hpp")
+  set(_Boost_SIGNALS_HEADERS             "boost/signals.hpp")
+  set(_Boost_SYSTEM_HEADERS              "boost/system/config.hpp")
+  set(_Boost_TEST_EXEC_MONITOR_HEADERS   "boost/test/test_exec_monitor.hpp")
+  set(_Boost_THREAD_HEADERS              "boost/thread.hpp")
+  set(_Boost_TIMER_HEADERS               "boost/timer.hpp")
+  set(_Boost_TYPE_ERASURE_HEADERS        "boost/type_erasure/config.hpp")
+  set(_Boost_UNIT_TEST_FRAMEWORK_HEADERS "boost/test/framework.hpp")
+  set(_Boost_WAVE_HEADERS                "boost/wave.hpp")
+  set(_Boost_WSERIALIZATION_HEADERS      "boost/archive/text_wiarchive.hpp")
+
+  string(TOUPPER ${component} uppercomponent)
+  set(${_hdrs} ${_Boost_${uppercomponent}_HEADERS} PARENT_SCOPE)
+
+  string(REGEX REPLACE ";" " " _boost_HDRS_STRING "${_Boost_${uppercomponent}_HEADERS}")
+  if (NOT _boost_HDRS_STRING)
+    set(_boost_HDRS_STRING "(none)")
+  endif()
+  # message(STATUS "Headers for Boost::${component}: ${_boost_HDRS_STRING}")
+endfunction()
+
+#
+# Determine if any missing dependencies require adding to the component list.
+#
+# Sets _Boost_${COMPONENT}_DEPENDENCIES for each required component,
+# plus _Boost_IMPORTED_TARGETS (TRUE if imported targets should be
+# defined; FALSE if dependency information is unavailable).
+#
+# componentvar - the component list variable name
+# extravar - the indirect dependency list variable name
+#
+#
+function(_Boost_MISSING_DEPENDENCIES componentvar extravar)
+  # _boost_unprocessed_components - list of components requiring processing
+  # _boost_processed_components - components already processed (or currently being processed)
+  # _boost_new_components - new components discovered for future processing
+  #
+  list(APPEND _boost_unprocessed_components ${${componentvar}})
+
+  while(_boost_unprocessed_components)
+    list(APPEND _boost_processed_components ${_boost_unprocessed_components})
+    foreach(component ${_boost_unprocessed_components})
+      string(TOUPPER ${component} uppercomponent)
+  set(${_ret} ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE)
+      _Boost_COMPONENT_DEPENDENCIES("${component}" _Boost_${uppercomponent}_DEPENDENCIES)
+      set(_Boost_${uppercomponent}_DEPENDENCIES ${_Boost_${uppercomponent}_DEPENDENCIES} PARENT_SCOPE)
+      set(_Boost_IMPORTED_TARGETS ${_Boost_IMPORTED_TARGETS} PARENT_SCOPE)
+      foreach(componentdep ${_Boost_${uppercomponent}_DEPENDENCIES})
+        list(FIND _boost_processed_components "${componentdep}" _boost_component_found)
+        list(FIND _boost_new_components "${componentdep}" _boost_component_new)
+        if (_boost_component_found EQUAL -1 AND _boost_component_new EQUAL -1)
+          list(APPEND _boost_new_components ${componentdep})
+        endif()
+      endforeach()
+    endforeach()
+    set(_boost_unprocessed_components ${_boost_new_components})
+    unset(_boost_new_components)
+  endwhile()
+  set(_boost_extra_components ${_boost_processed_components})
+  if(_boost_extra_components AND ${componentvar})
+    list(REMOVE_ITEM _boost_extra_components ${${componentvar}})
+  endif()
+  set(${componentvar} ${_boost_processed_components} PARENT_SCOPE)
+  set(${extravar} ${_boost_extra_components} PARENT_SCOPE)
+endfunction()
+
+function(_Boost_consider_adding_pthreads _outvar)
+  # On Unix platforms (excluding cygwin) add pthreads to Boost_LIBRARIES
+  # if the user is searching for the boost-thread component.
+  if(UNIX AND NOT CYGWIN)
+    list(FIND Boost_FIND_COMPONENTS thread _using_boost_thread)
+    if(_using_boost_thread GREATER -1)
+      find_library(BOOST_THREAD_LIBRARY NAMES pthread
+                   DOC "The threading library used by boost-thread"
+      )
+      if(BOOST_THREAD_LIBRARY)
+        set(${_outvar} ${ARGN} ${BOOST_THREAD_LIBRARY} PARENT_SCOPE)
+      endif()
+    endif()
+  endif()
+endfunction()
+
+#
+# End functions/macros
+#
+#-------------------------------------------------------------------------------
+
+#-------------------------------------------------------------------------------
+# main.
+#-------------------------------------------------------------------------------
+
+
+# If the user sets Boost_LIBRARY_DIR, use it as the default for both
+# configurations.
+if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR)
+  set(Boost_LIBRARY_DIR_RELEASE "${Boost_LIBRARY_DIR}")
+endif()
+if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR)
+  set(Boost_LIBRARY_DIR_DEBUG   "${Boost_LIBRARY_DIR}")
+endif()
+
+if(NOT DEFINED Boost_USE_MULTITHREADED)
+    set(Boost_USE_MULTITHREADED TRUE)
+endif()
+if(NOT DEFINED Boost_USE_DEBUG_RUNTIME)
+  set(Boost_USE_DEBUG_RUNTIME TRUE)
+endif()
+
+# Check the version of Boost against the requested version.
+if(Boost_FIND_VERSION AND NOT Boost_FIND_VERSION_MINOR)
+  message(SEND_ERROR "When requesting a specific version of Boost, you must provide at least the major and minor version numbers, e.g., 1.34")
+endif()
+
+if(Boost_FIND_VERSION_EXACT)
+  # The version may appear in a directory with or without the patch
+  # level, even when the patch level is non-zero.
+  set(_boost_TEST_VERSIONS
+    "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}.${Boost_FIND_VERSION_PATCH}"
+    "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}")
+else()
+  # The user has not requested an exact version.  Among known
+  # versions, find those that are acceptable to the user request.
+  #
+  # Note: When adding a new Boost release, also update the dependency
+  # information in _Boost_COMPONENT_DEPENDENCIES and
+  # _Boost_COMPONENT_HEADERS.  See the instructions at the top of
+  # _Boost_COMPONENT_DEPENDENCIES.
+  set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS}
+    "1.61.0" "1.61" "1.60.0" "1.60"
+    "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55"
+    "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51"
+    "1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1"
+    "1.46.0" "1.46" "1.45.0" "1.45" "1.44.0" "1.44" "1.43.0" "1.43" "1.42.0" "1.42"
+    "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37"
+    "1.36.1" "1.36.0" "1.36" "1.35.1" "1.35.0" "1.35" "1.34.1" "1.34.0"
+    "1.34" "1.33.1" "1.33.0" "1.33")
+
+  set(_boost_TEST_VERSIONS)
+  if(Boost_FIND_VERSION)
+    set(_Boost_FIND_VERSION_SHORT "${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}")
+    # Select acceptable versions.
+    foreach(version ${_Boost_KNOWN_VERSIONS})
+      if(NOT "${version}" VERSION_LESS "${Boost_FIND_VERSION}")
+        # This version is high enough.
+        list(APPEND _boost_TEST_VERSIONS "${version}")
+      elseif("${version}.99" VERSION_EQUAL "${_Boost_FIND_VERSION_SHORT}.99")
+        # This version is a short-form for the requested version with
+        # the patch level dropped.
+        list(APPEND _boost_TEST_VERSIONS "${version}")
+      endif()
+    endforeach()
+  else()
+    # Any version is acceptable.
+    set(_boost_TEST_VERSIONS "${_Boost_KNOWN_VERSIONS}")
+  endif()
+endif()
+
+# The reason that we failed to find Boost. This will be set to a
+# user-friendly message when we fail to find some necessary piece of
+# Boost.
+set(Boost_ERROR_REASON)
+
+if(Boost_DEBUG)
+  # Output some of their choices
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "Boost_USE_MULTITHREADED = ${Boost_USE_MULTITHREADED}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "Boost_USE_STATIC_LIBS = ${Boost_USE_STATIC_LIBS}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "Boost_USE_STATIC_RUNTIME = ${Boost_USE_STATIC_RUNTIME}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "Boost_ADDITIONAL_VERSIONS = ${Boost_ADDITIONAL_VERSIONS}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "Boost_NO_SYSTEM_PATHS = ${Boost_NO_SYSTEM_PATHS}")
+endif()
+
+# Supply Boost_LIB_DIAGNOSTIC_DEFINITIONS as a convenience target. It
+# will only contain any interface definitions on WIN32, but is created
+# on all platforms to keep end user code free from platform dependent
+# code.  Also provide convenience targets to disable autolinking and
+# enable dynamic linking.
+if(NOT TARGET Boost::diagnostic_definitions)
+  add_library(Boost::diagnostic_definitions INTERFACE IMPORTED)
+  add_library(Boost::disable_autolinking INTERFACE IMPORTED)
+  add_library(Boost::dynamic_linking INTERFACE IMPORTED)
+endif()
+if(WIN32)
+  # In windows, automatic linking is performed, so you do not have
+  # to specify the libraries.  If you are linking to a dynamic
+  # runtime, then you can choose to link to either a static or a
+  # dynamic Boost library, the default is to do a static link.  You
+  # can alter this for a specific library "whatever" by defining
+  # BOOST_WHATEVER_DYN_LINK to force Boost library "whatever" to be
+  # linked dynamically.  Alternatively you can force all Boost
+  # libraries to dynamic link by defining BOOST_ALL_DYN_LINK.
+
+  # This feature can be disabled for Boost library "whatever" by
+  # defining BOOST_WHATEVER_NO_LIB, or for all of Boost by defining
+  # BOOST_ALL_NO_LIB.
+
+  # If you want to observe which libraries are being linked against
+  # then defining BOOST_LIB_DIAGNOSTIC will cause the auto-linking
+  # code to emit a #pragma message each time a library is selected
+  # for linking.
+  set(Boost_LIB_DIAGNOSTIC_DEFINITIONS "-DBOOST_LIB_DIAGNOSTIC")
+  set_target_properties(Boost::diagnostic_definitions PROPERTIES
+    INTERFACE_COMPILE_DEFINITIONS "BOOST_LIB_DIAGNOSTIC")
+  set_target_properties(Boost::disable_autolinking PROPERTIES
+    INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_NO_LIB")
+  set_target_properties(Boost::dynamic_linking PROPERTIES
+    INTERFACE_COMPILE_DEFINITIONS "BOOST_ALL_DYN_LINK")
+endif()
+
+_Boost_CHECK_SPELLING(Boost_ROOT)
+_Boost_CHECK_SPELLING(Boost_LIBRARYDIR)
+_Boost_CHECK_SPELLING(Boost_INCLUDEDIR)
+
+# Collect environment variable inputs as hints.  Do not consider changes.
+foreach(v BOOSTROOT BOOST_ROOT BOOST_INCLUDEDIR BOOST_LIBRARYDIR)
+  set(_env $ENV{${v}})
+  if(_env)
+    file(TO_CMAKE_PATH "${_env}" _ENV_${v})
+  else()
+    set(_ENV_${v} "")
+  endif()
+endforeach()
+if(NOT _ENV_BOOST_ROOT AND _ENV_BOOSTROOT)
+  set(_ENV_BOOST_ROOT "${_ENV_BOOSTROOT}")
+endif()
+
+# Collect inputs and cached results.  Detect changes since the last run.
+if(NOT BOOST_ROOT AND BOOSTROOT)
+  set(BOOST_ROOT "${BOOSTROOT}")
+endif()
+set(_Boost_VARS_DIR
+  BOOST_ROOT
+  Boost_NO_SYSTEM_PATHS
+  )
+
+if(Boost_DEBUG)
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "Declared as CMake or Environmental Variables:")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "  BOOST_ROOT = ${BOOST_ROOT}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "  BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "  BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                 "_boost_TEST_VERSIONS = ${_boost_TEST_VERSIONS}")
+endif()
+
+# ------------------------------------------------------------------------
+#  Search for Boost include DIR
+# ------------------------------------------------------------------------
+
+set(_Boost_VARS_INC BOOST_INCLUDEDIR Boost_INCLUDE_DIR Boost_ADDITIONAL_VERSIONS)
+_Boost_CHANGE_DETECT(_Boost_CHANGE_INCDIR ${_Boost_VARS_DIR} ${_Boost_VARS_INC})
+# Clear Boost_INCLUDE_DIR if it did not change but other input affecting the
+# location did.  We will find a new one based on the new inputs.
+if(_Boost_CHANGE_INCDIR AND NOT _Boost_INCLUDE_DIR_CHANGED)
+  unset(Boost_INCLUDE_DIR CACHE)
+endif()
+
+if(NOT Boost_INCLUDE_DIR)
+  set(_boost_INCLUDE_SEARCH_DIRS "")
+  if(BOOST_INCLUDEDIR)
+    list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_INCLUDEDIR})
+  elseif(_ENV_BOOST_INCLUDEDIR)
+    list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_INCLUDEDIR})
+  endif()
+
+  if( BOOST_ROOT )
+    list(APPEND _boost_INCLUDE_SEARCH_DIRS ${BOOST_ROOT}/include ${BOOST_ROOT})
+  elseif( _ENV_BOOST_ROOT )
+    list(APPEND _boost_INCLUDE_SEARCH_DIRS ${_ENV_BOOST_ROOT}/include ${_ENV_BOOST_ROOT})
+  endif()
+
+  if( Boost_NO_SYSTEM_PATHS)
+    list(APPEND _boost_INCLUDE_SEARCH_DIRS NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH)
+  else()
+    list(APPEND _boost_INCLUDE_SEARCH_DIRS PATHS
+      C:/boost/include
+      C:/boost
+      /sw/local/include
+      )
+  endif()
+
+  # Try to find Boost by stepping backwards through the Boost versions
+  # we know about.
+  # Build a list of path suffixes for each version.
+  set(_boost_PATH_SUFFIXES)
+  foreach(_boost_VER ${_boost_TEST_VERSIONS})
+    # Add in a path suffix, based on the required version, ideally
+    # we could read this from version.hpp, but for that to work we'd
+    # need to know the include dir already
+    set(_boost_BOOSTIFIED_VERSION)
+
+    # Transform 1.35 => 1_35 and 1.36.0 => 1_36_0
+    if(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+)")
+        set(_boost_BOOSTIFIED_VERSION
+          "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}_${CMAKE_MATCH_3}")
+    elseif(_boost_VER MATCHES "([0-9]+)\\.([0-9]+)")
+        set(_boost_BOOSTIFIED_VERSION
+          "${CMAKE_MATCH_1}_${CMAKE_MATCH_2}")
+    endif()
+
+    list(APPEND _boost_PATH_SUFFIXES
+      "boost-${_boost_BOOSTIFIED_VERSION}"
+      "boost_${_boost_BOOSTIFIED_VERSION}"
+      "boost/boost-${_boost_BOOSTIFIED_VERSION}"
+      "boost/boost_${_boost_BOOSTIFIED_VERSION}"
+      )
+
+  endforeach()
+
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "Include debugging info:")
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "  _boost_INCLUDE_SEARCH_DIRS = ${_boost_INCLUDE_SEARCH_DIRS}")
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "  _boost_PATH_SUFFIXES = ${_boost_PATH_SUFFIXES}")
+  endif()
+
+  # Look for a standard boost header file.
+  find_path(Boost_INCLUDE_DIR
+    NAMES         boost/config.hpp
+    HINTS         ${_boost_INCLUDE_SEARCH_DIRS}
+    PATH_SUFFIXES ${_boost_PATH_SUFFIXES}
+    )
+endif()
+
+# ------------------------------------------------------------------------
+#  Extract version information from version.hpp
+# ------------------------------------------------------------------------
+
+# Set Boost_FOUND based only on header location and version.
+# It will be updated below for component libraries.
+if(Boost_INCLUDE_DIR)
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "location of version.hpp: ${Boost_INCLUDE_DIR}/boost/version.hpp")
+  endif()
+
+  # Extract Boost_VERSION and Boost_LIB_VERSION from version.hpp
+  set(Boost_VERSION 0)
+  set(Boost_LIB_VERSION "")
+  file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")
+  set(_Boost_VERSION_REGEX "([0-9]+)")
+  set(_Boost_LIB_VERSION_REGEX "\"([0-9_]+)\"")
+  foreach(v VERSION LIB_VERSION)
+    if("${_boost_VERSION_HPP_CONTENTS}" MATCHES "#define BOOST_${v} ${_Boost_${v}_REGEX}")
+      set(Boost_${v} "${CMAKE_MATCH_1}")
+    endif()
+  endforeach()
+  unset(_boost_VERSION_HPP_CONTENTS)
+
+  math(EXPR Boost_MAJOR_VERSION "${Boost_VERSION} / 100000")
+  math(EXPR Boost_MINOR_VERSION "${Boost_VERSION} / 100 % 1000")
+  math(EXPR Boost_SUBMINOR_VERSION "${Boost_VERSION} % 100")
+
+  set(Boost_ERROR_REASON
+    "${Boost_ERROR_REASON}Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}\nBoost include path: ${Boost_INCLUDE_DIR}")
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "version.hpp reveals boost "
+                   "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}")
+  endif()
+
+  if(Boost_FIND_VERSION)
+    # Set Boost_FOUND based on requested version.
+    set(_Boost_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}")
+    if("${_Boost_VERSION}" VERSION_LESS "${Boost_FIND_VERSION}")
+      set(Boost_FOUND 0)
+      set(_Boost_VERSION_AGE "old")
+    elseif(Boost_FIND_VERSION_EXACT AND
+        NOT "${_Boost_VERSION}" VERSION_EQUAL "${Boost_FIND_VERSION}")
+      set(Boost_FOUND 0)
+      set(_Boost_VERSION_AGE "new")
+    else()
+      set(Boost_FOUND 1)
+    endif()
+    if(NOT Boost_FOUND)
+      # State that we found a version of Boost that is too new or too old.
+      set(Boost_ERROR_REASON
+        "${Boost_ERROR_REASON}\nDetected version of Boost is too ${_Boost_VERSION_AGE}. Requested version was ${Boost_FIND_VERSION_MAJOR}.${Boost_FIND_VERSION_MINOR}")
+      if (Boost_FIND_VERSION_PATCH)
+        set(Boost_ERROR_REASON
+          "${Boost_ERROR_REASON}.${Boost_FIND_VERSION_PATCH}")
+      endif ()
+      if (NOT Boost_FIND_VERSION_EXACT)
+        set(Boost_ERROR_REASON "${Boost_ERROR_REASON} (or newer)")
+      endif ()
+      set(Boost_ERROR_REASON "${Boost_ERROR_REASON}.")
+    endif ()
+  else()
+    # Caller will accept any Boost version.
+    set(Boost_FOUND 1)
+  endif()
+else()
+  set(Boost_FOUND 0)
+  set(Boost_ERROR_REASON
+    "${Boost_ERROR_REASON}Unable to find the Boost header files. Please set BOOST_ROOT to the root directory containing Boost or BOOST_INCLUDEDIR to the directory containing Boost's headers.")
+endif()
+
+# ------------------------------------------------------------------------
+#  Prefix initialization
+# ------------------------------------------------------------------------
+
+set(Boost_LIB_PREFIX "")
+if ( (GHSMULTI AND Boost_USE_STATIC_LIBS) OR
+    (WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN) )
+  set(Boost_LIB_PREFIX "lib")
+endif()
+
+if ( NOT Boost_NAMESPACE )
+  set(Boost_NAMESPACE "boost")
+endif()
+
+# ------------------------------------------------------------------------
+#  Suffix initialization and compiler suffix detection.
+# ------------------------------------------------------------------------
+
+set(_Boost_VARS_NAME
+  Boost_NAMESPACE
+  Boost_COMPILER
+  Boost_THREADAPI
+  Boost_USE_DEBUG_PYTHON
+  Boost_USE_MULTITHREADED
+  Boost_USE_STATIC_LIBS
+  Boost_USE_STATIC_RUNTIME
+  Boost_USE_STLPORT
+  Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS
+  )
+_Boost_CHANGE_DETECT(_Boost_CHANGE_LIBNAME ${_Boost_VARS_NAME})
+
+# Setting some more suffixes for the library
+if (Boost_COMPILER)
+  set(_boost_COMPILER ${Boost_COMPILER})
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "using user-specified Boost_COMPILER = ${_boost_COMPILER}")
+  endif()
+else()
+  # Attempt to guess the compiler suffix
+  # NOTE: this is not perfect yet, if you experience any issues
+  # please report them and use the Boost_COMPILER variable
+  # to work around the problems.
+  _Boost_GUESS_COMPILER_PREFIX(_boost_COMPILER)
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+      "guessed _boost_COMPILER = ${_boost_COMPILER}")
+  endif()
+endif()
+
+set (_boost_MULTITHREADED "-mt")
+if( NOT Boost_USE_MULTITHREADED )
+  set (_boost_MULTITHREADED "")
+endif()
+if(Boost_DEBUG)
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+    "_boost_MULTITHREADED = ${_boost_MULTITHREADED}")
+endif()
+
+#======================
+# Systematically build up the Boost ABI tag
+# http://boost.org/doc/libs/1_41_0/more/getting_started/windows.html#library-naming
+set( _boost_RELEASE_ABI_TAG "-")
+set( _boost_DEBUG_ABI_TAG   "-")
+# Key       Use this library when:
+#  s        linking statically to the C++ standard library and
+#           compiler runtime support libraries.
+if(Boost_USE_STATIC_RUNTIME)
+  set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}s")
+  set( _boost_DEBUG_ABI_TAG   "${_boost_DEBUG_ABI_TAG}s")
+endif()
+#  g        using debug versions of the standard and runtime
+#           support libraries
+if(WIN32 AND Boost_USE_DEBUG_RUNTIME)
+  if(MSVC OR "${CMAKE_CXX_COMPILER}" MATCHES "icl"
+          OR "${CMAKE_CXX_COMPILER}" MATCHES "icpc")
+    set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}g")
+  endif()
+endif()
+#  y        using special debug build of python
+if(Boost_USE_DEBUG_PYTHON)
+  set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}y")
+endif()
+#  d        using a debug version of your code
+set(_boost_DEBUG_ABI_TAG "${_boost_DEBUG_ABI_TAG}d")
+#  p        using the STLport standard library rather than the
+#           default one supplied with your compiler
+if(Boost_USE_STLPORT)
+  set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}p")
+  set( _boost_DEBUG_ABI_TAG   "${_boost_DEBUG_ABI_TAG}p")
+endif()
+#  n        using the STLport deprecated "native iostreams" feature
+if(Boost_USE_STLPORT_DEPRECATED_NATIVE_IOSTREAMS)
+  set( _boost_RELEASE_ABI_TAG "${_boost_RELEASE_ABI_TAG}n")
+  set( _boost_DEBUG_ABI_TAG   "${_boost_DEBUG_ABI_TAG}n")
+endif()
+
+if(Boost_DEBUG)
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+    "_boost_RELEASE_ABI_TAG = ${_boost_RELEASE_ABI_TAG}")
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+    "_boost_DEBUG_ABI_TAG = ${_boost_DEBUG_ABI_TAG}")
+endif()
+
+# ------------------------------------------------------------------------
+#  Begin finding boost libraries
+# ------------------------------------------------------------------------
+
+set(_Boost_VARS_LIB "")
+foreach(c DEBUG RELEASE)
+  set(_Boost_VARS_LIB_${c} BOOST_LIBRARYDIR Boost_LIBRARY_DIR_${c})
+  list(APPEND _Boost_VARS_LIB ${_Boost_VARS_LIB_${c}})
+  _Boost_CHANGE_DETECT(_Boost_CHANGE_LIBDIR_${c} ${_Boost_VARS_DIR} ${_Boost_VARS_LIB_${c}} Boost_INCLUDE_DIR)
+  # Clear Boost_LIBRARY_DIR_${c} if it did not change but other input affecting the
+  # location did.  We will find a new one based on the new inputs.
+  if(_Boost_CHANGE_LIBDIR_${c} AND NOT _Boost_LIBRARY_DIR_${c}_CHANGED)
+    unset(Boost_LIBRARY_DIR_${c} CACHE)
+  endif()
+
+  # If Boost_LIBRARY_DIR_[RELEASE,DEBUG] is set, prefer its value.
+  if(Boost_LIBRARY_DIR_${c})
+    set(_boost_LIBRARY_SEARCH_DIRS_${c} ${Boost_LIBRARY_DIR_${c}} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
+  else()
+    set(_boost_LIBRARY_SEARCH_DIRS_${c} "")
+    if(BOOST_LIBRARYDIR)
+      list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_LIBRARYDIR})
+    elseif(_ENV_BOOST_LIBRARYDIR)
+      list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_LIBRARYDIR})
+    endif()
+
+    if(BOOST_ROOT)
+      list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${BOOST_ROOT}/lib ${BOOST_ROOT}/stage/lib)
+    elseif(_ENV_BOOST_ROOT)
+      list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} ${_ENV_BOOST_ROOT}/lib ${_ENV_BOOST_ROOT}/stage/lib)
+    endif()
+
+    list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c}
+      ${Boost_INCLUDE_DIR}/lib
+      ${Boost_INCLUDE_DIR}/../lib
+      ${Boost_INCLUDE_DIR}/stage/lib
+      )
+    if( Boost_NO_SYSTEM_PATHS )
+      list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} NO_CMAKE_SYSTEM_PATH NO_SYSTEM_ENVIRONMENT_PATH)
+    else()
+      list(APPEND _boost_LIBRARY_SEARCH_DIRS_${c} PATHS
+        C:/boost/lib
+        C:/boost
+        /sw/local/lib
+        )
+    endif()
+  endif()
+endforeach()
+
+if(Boost_DEBUG)
+  message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+    "_boost_LIBRARY_SEARCH_DIRS_RELEASE = ${_boost_LIBRARY_SEARCH_DIRS_RELEASE}"
+    "_boost_LIBRARY_SEARCH_DIRS_DEBUG   = ${_boost_LIBRARY_SEARCH_DIRS_DEBUG}")
+endif()
+
+# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
+if( Boost_USE_STATIC_LIBS )
+  set( _boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+  if(WIN32)
+    set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
+  else()
+    set(CMAKE_FIND_LIBRARY_SUFFIXES .a )
+  endif()
+endif()
+
+# We want to use the tag inline below without risking double dashes
+if(_boost_RELEASE_ABI_TAG)
+  if(${_boost_RELEASE_ABI_TAG} STREQUAL "-")
+    set(_boost_RELEASE_ABI_TAG "")
+  endif()
+endif()
+if(_boost_DEBUG_ABI_TAG)
+  if(${_boost_DEBUG_ABI_TAG} STREQUAL "-")
+    set(_boost_DEBUG_ABI_TAG "")
+  endif()
+endif()
+
+# The previous behavior of FindBoost when Boost_USE_STATIC_LIBS was enabled
+# on WIN32 was to:
+#  1. Search for static libs compiled against a SHARED C++ standard runtime library (use if found)
+#  2. Search for static libs compiled against a STATIC C++ standard runtime library (use if found)
+# We maintain this behavior since changing it could break people's builds.
+# To disable the ambiguous behavior, the user need only
+# set Boost_USE_STATIC_RUNTIME either ON or OFF.
+set(_boost_STATIC_RUNTIME_WORKAROUND false)
+if(WIN32 AND Boost_USE_STATIC_LIBS)
+  if(NOT DEFINED Boost_USE_STATIC_RUNTIME)
+    set(_boost_STATIC_RUNTIME_WORKAROUND true)
+  endif()
+endif()
+
+# On versions < 1.35, remove the System library from the considered list
+# since it wasn't added until 1.35.
+if(Boost_VERSION AND Boost_FIND_COMPONENTS)
+   if(Boost_VERSION LESS 103500)
+     list(REMOVE_ITEM Boost_FIND_COMPONENTS system)
+   endif()
+endif()
+
+# Additional components may be required via component dependencies.
+# Add any missing components to the list.
+_Boost_MISSING_DEPENDENCIES(Boost_FIND_COMPONENTS _Boost_EXTRA_FIND_COMPONENTS)
+
+# If thread is required, get the thread libs as a dependency
+list(FIND Boost_FIND_COMPONENTS thread _Boost_THREAD_DEPENDENCY_LIBS)
+if(NOT _Boost_THREAD_DEPENDENCY_LIBS EQUAL -1)
+  include(CMakeFindDependencyMacro)
+  find_dependency(Threads)
+endif()
+
+# If the user changed any of our control inputs flush previous results.
+if(_Boost_CHANGE_LIBDIR OR _Boost_CHANGE_LIBNAME)
+  foreach(COMPONENT ${_Boost_COMPONENTS_SEARCHED})
+    string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+    foreach(c DEBUG RELEASE)
+      set(_var Boost_${UPPERCOMPONENT}_LIBRARY_${c})
+      unset(${_var} CACHE)
+      set(${_var} "${_var}-NOTFOUND")
+    endforeach()
+  endforeach()
+  set(_Boost_COMPONENTS_SEARCHED "")
+endif()
+
+foreach(COMPONENT ${Boost_FIND_COMPONENTS})
+  string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+
+  set( _boost_docstring_release "Boost ${COMPONENT} library (release)")
+  set( _boost_docstring_debug   "Boost ${COMPONENT} library (debug)")
+
+  # Compute component-specific hints.
+  set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "")
+  if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR
+     ${COMPONENT} STREQUAL "graph_parallel")
+    foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES})
+      if(IS_ABSOLUTE "${lib}")
+        get_filename_component(libdir "${lib}" PATH)
+        string(REPLACE "\\" "/" libdir "${libdir}")
+        list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir})
+      endif()
+    endforeach()
+  endif()
+
+  # Consolidate and report component-specific hints.
+  if(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT)
+    list(REMOVE_DUPLICATES _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT)
+    if(Boost_DEBUG)
+      message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+        "Component-specific library search paths for ${COMPONENT}: "
+        "${_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT}")
+    endif()
+  endif()
+
+  #
+  # Find headers
+  #
+  _Boost_COMPONENT_HEADERS("${COMPONENT}" Boost_${UPPERCOMPONENT}_HEADER_NAME)
+  # Look for a standard boost header file.
+  if(Boost_${UPPERCOMPONENT}_HEADER_NAME)
+    if(EXISTS "${Boost_INCLUDE_DIR}/${Boost_${UPPERCOMPONENT}_HEADER_NAME}")
+      set(Boost_${UPPERCOMPONENT}_HEADER ON)
+    else()
+      set(Boost_${UPPERCOMPONENT}_HEADER OFF)
+    endif()
+  else()
+    set(Boost_${UPPERCOMPONENT}_HEADER ON)
+    message(WARNING "No header defined for ${COMPONENT}; skipping header check")
+  endif()
+
+  #
+  # Find RELEASE libraries
+  #
+  set(_boost_RELEASE_NAMES
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}-${Boost_LIB_VERSION}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_ABI_TAG}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT} )
+  if(_boost_STATIC_RUNTIME_WORKAROUND)
+    set(_boost_RELEASE_STATIC_ABI_TAG "-s${_boost_RELEASE_ABI_TAG}")
+    list(APPEND _boost_RELEASE_NAMES
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION}
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG}-${Boost_LIB_VERSION}
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_RELEASE_STATIC_ABI_TAG} )
+  endif()
+  if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread")
+     _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_RELEASE_NAMES ${_boost_RELEASE_NAMES})
+  endif()
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "Searching for ${UPPERCOMPONENT}_LIBRARY_RELEASE: ${_boost_RELEASE_NAMES}")
+  endif()
+
+  # if Boost_LIBRARY_DIR_RELEASE is not defined,
+  # but Boost_LIBRARY_DIR_DEBUG is, look there first for RELEASE libs
+  if(NOT Boost_LIBRARY_DIR_RELEASE AND Boost_LIBRARY_DIR_DEBUG)
+    list(INSERT _boost_LIBRARY_SEARCH_DIRS_RELEASE 0 ${Boost_LIBRARY_DIR_DEBUG})
+  endif()
+
+  # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing.
+  string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_RELEASE}")
+
+  _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE RELEASE
+    NAMES ${_boost_RELEASE_NAMES}
+    HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp}
+    NAMES_PER_DIR
+    DOC "${_boost_docstring_release}"
+    )
+
+  #
+  # Find DEBUG libraries
+  #
+  set(_boost_DEBUG_NAMES
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}
+    ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT} )
+  if(_boost_STATIC_RUNTIME_WORKAROUND)
+    set(_boost_DEBUG_STATIC_ABI_TAG "-s${_boost_DEBUG_ABI_TAG}")
+    list(APPEND _boost_DEBUG_NAMES
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION}
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_COMPILER}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG}-${Boost_LIB_VERSION}
+      ${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${COMPONENT}${_boost_MULTITHREADED}${_boost_DEBUG_STATIC_ABI_TAG} )
+  endif()
+  if(Boost_THREADAPI AND ${COMPONENT} STREQUAL "thread")
+     _Boost_PREPEND_LIST_WITH_THREADAPI(_boost_DEBUG_NAMES ${_boost_DEBUG_NAMES})
+  endif()
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
+                   "Searching for ${UPPERCOMPONENT}_LIBRARY_DEBUG: ${_boost_DEBUG_NAMES}")
+  endif()
+
+  # if Boost_LIBRARY_DIR_DEBUG is not defined,
+  # but Boost_LIBRARY_DIR_RELEASE is, look there first for DEBUG libs
+  if(NOT Boost_LIBRARY_DIR_DEBUG AND Boost_LIBRARY_DIR_RELEASE)
+    list(INSERT _boost_LIBRARY_SEARCH_DIRS_DEBUG 0 ${Boost_LIBRARY_DIR_RELEASE})
+  endif()
+
+  # Avoid passing backslashes to _Boost_FIND_LIBRARY due to macro re-parsing.
+  string(REPLACE "\\" "/" _boost_LIBRARY_SEARCH_DIRS_tmp "${_boost_LIBRARY_SEARCH_DIRS_DEBUG}")
+
+  _Boost_FIND_LIBRARY(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG DEBUG
+    NAMES ${_boost_DEBUG_NAMES}
+    HINTS ${_boost_LIBRARY_SEARCH_DIRS_tmp}
+    NAMES_PER_DIR
+    DOC "${_boost_docstring_debug}"
+    )
+
+  if(Boost_REALPATH)
+    _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE "${_boost_docstring_release}")
+    _Boost_SWAP_WITH_REALPATH(Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG   "${_boost_docstring_debug}"  )
+  endif()
+
+  _Boost_ADJUST_LIB_VARS(${UPPERCOMPONENT})
+
+endforeach()
+
+# Restore the original find library ordering
+if( Boost_USE_STATIC_LIBS )
+  set(CMAKE_FIND_LIBRARY_SUFFIXES ${_boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
+endif()
+
+# ------------------------------------------------------------------------
+#  End finding boost libraries
+# ------------------------------------------------------------------------
+
+set(Boost_INCLUDE_DIRS ${Boost_INCLUDE_DIR})
+set(Boost_LIBRARY_DIRS)
+if(Boost_LIBRARY_DIR_RELEASE)
+  list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_RELEASE})
+endif()
+if(Boost_LIBRARY_DIR_DEBUG)
+  list(APPEND Boost_LIBRARY_DIRS ${Boost_LIBRARY_DIR_DEBUG})
+endif()
+if(Boost_LIBRARY_DIRS)
+  list(REMOVE_DUPLICATES Boost_LIBRARY_DIRS)
+endif()
+
+# The above setting of Boost_FOUND was based only on the header files.
+# Update it for the requested component libraries.
+if(Boost_FOUND)
+  # The headers were found.  Check for requested component libs.
+  set(_boost_CHECKED_COMPONENT FALSE)
+  set(_Boost_MISSING_COMPONENTS "")
+  foreach(COMPONENT ${Boost_FIND_COMPONENTS})
+    string(TOUPPER ${COMPONENT} COMPONENT)
+    set(_boost_CHECKED_COMPONENT TRUE)
+    if(NOT Boost_${COMPONENT}_FOUND)
+      string(TOLOWER ${COMPONENT} COMPONENT)
+      list(APPEND _Boost_MISSING_COMPONENTS ${COMPONENT})
+    endif()
+  endforeach()
+  if(_Boost_MISSING_COMPONENTS AND _Boost_EXTRA_FIND_COMPONENTS)
+    # Optional indirect dependencies are not counted as missing.
+    list(REMOVE_ITEM _Boost_MISSING_COMPONENTS ${_Boost_EXTRA_FIND_COMPONENTS})
+  endif()
+
+  if(Boost_DEBUG)
+    message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] Boost_FOUND = ${Boost_FOUND}")
+  endif()
+
+  if (_Boost_MISSING_COMPONENTS)
+    set(Boost_FOUND 0)
+    # We were unable to find some libraries, so generate a sensible
+    # error message that lists the libraries we were unable to find.
+    set(Boost_ERROR_REASON
+      "${Boost_ERROR_REASON}\nCould not find the following")
+    if(Boost_USE_STATIC_LIBS)
+      set(Boost_ERROR_REASON "${Boost_ERROR_REASON} static")
+    endif()
+    set(Boost_ERROR_REASON
+      "${Boost_ERROR_REASON} Boost libraries:\n")
+    foreach(COMPONENT ${_Boost_MISSING_COMPONENTS})
+      set(Boost_ERROR_REASON
+        "${Boost_ERROR_REASON}        ${Boost_NAMESPACE}_${COMPONENT}\n")
+    endforeach()
+
+    list(LENGTH Boost_FIND_COMPONENTS Boost_NUM_COMPONENTS_WANTED)
+    list(LENGTH _Boost_MISSING_COMPONENTS Boost_NUM_MISSING_COMPONENTS)
+    if (${Boost_NUM_COMPONENTS_WANTED} EQUAL ${Boost_NUM_MISSING_COMPONENTS})
+      set(Boost_ERROR_REASON
+        "${Boost_ERROR_REASON}No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.")
+    else ()
+      set(Boost_ERROR_REASON
+        "${Boost_ERROR_REASON}Some (but not all) of the required Boost libraries were found. You may need to install these additional Boost libraries. Alternatively, set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.")
+    endif ()
+  endif ()
+
+  if( NOT Boost_LIBRARY_DIRS AND NOT _boost_CHECKED_COMPONENT )
+    # Compatibility Code for backwards compatibility with CMake
+    # 2.4's FindBoost module.
+
+    # Look for the boost library path.
+    # Note that the user may not have installed any libraries
+    # so it is quite possible the Boost_LIBRARY_DIRS may not exist.
+    set(_boost_LIB_DIR ${Boost_INCLUDE_DIR})
+
+    if("${_boost_LIB_DIR}" MATCHES "boost-[0-9]+")
+      get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH)
+    endif()
+
+    if("${_boost_LIB_DIR}" MATCHES "/include$")
+      # Strip off the trailing "/include" in the path.
+      get_filename_component(_boost_LIB_DIR ${_boost_LIB_DIR} PATH)
+    endif()
+
+    if(EXISTS "${_boost_LIB_DIR}/lib")
+      set(_boost_LIB_DIR ${_boost_LIB_DIR}/lib)
+    else()
+      if(EXISTS "${_boost_LIB_DIR}/stage/lib")
+        set(_boost_LIB_DIR ${_boost_LIB_DIR}/stage/lib)
+      else()
+        set(_boost_LIB_DIR "")
+      endif()
+    endif()
+
+    if(_boost_LIB_DIR AND EXISTS "${_boost_LIB_DIR}")
+      set(Boost_LIBRARY_DIRS ${_boost_LIB_DIR})
+    endif()
+
+  endif()
+else()
+  # Boost headers were not found so no components were found.
+  foreach(COMPONENT ${Boost_FIND_COMPONENTS})
+    string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+    set(Boost_${UPPERCOMPONENT}_FOUND 0)
+  endforeach()
+endif()
+
+# ------------------------------------------------------------------------
+#  Add imported targets
+# ------------------------------------------------------------------------
+
+if(Boost_FOUND)
+  # For header-only libraries
+  if(NOT TARGET Boost::boost)
+    add_library(Boost::boost INTERFACE IMPORTED)
+    if(Boost_INCLUDE_DIRS)
+      set_target_properties(Boost::boost PROPERTIES
+        INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}")
+    endif()
+  endif()
+
+  foreach(COMPONENT ${Boost_FIND_COMPONENTS})
+    if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT})
+      string(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+      if(Boost_${UPPERCOMPONENT}_FOUND)
+        if(Boost_USE_STATIC_LIBS)
+          add_library(Boost::${COMPONENT} STATIC IMPORTED)
+        else()
+          # Even if Boost_USE_STATIC_LIBS is OFF, we might have static
+          # libraries as a result.
+          add_library(Boost::${COMPONENT} UNKNOWN IMPORTED)
+        endif()
+        if(Boost_INCLUDE_DIRS)
+          set_target_properties(Boost::${COMPONENT} PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}")
+        endif()
+        if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY}")
+          set_target_properties(Boost::${COMPONENT} PROPERTIES
+            IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
+            IMPORTED_LOCATION "${Boost_${UPPERCOMPONENT}_LIBRARY}")
+        endif()
+        if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}")
+          set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY
+            IMPORTED_CONFIGURATIONS DEBUG)
+          set_target_properties(Boost::${COMPONENT} PROPERTIES
+            IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
+            IMPORTED_LOCATION_DEBUG "${Boost_${UPPERCOMPONENT}_LIBRARY_DEBUG}")
+        endif()
+        if(EXISTS "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}")
+          set_property(TARGET Boost::${COMPONENT} APPEND PROPERTY
+            IMPORTED_CONFIGURATIONS RELEASE)
+          set_target_properties(Boost::${COMPONENT} PROPERTIES
+            IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
+            IMPORTED_LOCATION_RELEASE "${Boost_${UPPERCOMPONENT}_LIBRARY_RELEASE}")
+        endif()
+        if(_Boost_${UPPERCOMPONENT}_DEPENDENCIES)
+          unset(_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES)
+          foreach(dep ${_Boost_${UPPERCOMPONENT}_DEPENDENCIES})
+            list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Boost::${dep})
+          endforeach()
+          if(COMPONENT STREQUAL "thread")
+            list(APPEND _Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES Threads::Threads)
+          endif()
+          set_target_properties(Boost::${COMPONENT} PROPERTIES
+            INTERFACE_LINK_LIBRARIES "${_Boost_${UPPERCOMPONENT}_TARGET_DEPENDENCIES}")
+        endif()
+      endif()
+    endif()
+  endforeach()
+endif()
+
+# ------------------------------------------------------------------------
+#  Notification to end user about what was found
+# ------------------------------------------------------------------------
+
+set(Boost_LIBRARIES "")
+if(Boost_FOUND)
+  if(NOT Boost_FIND_QUIETLY)
+    message(STATUS "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}")
+    if(Boost_FIND_COMPONENTS)
+      message(STATUS "Found the following Boost libraries:")
+    endif()
+  endif()
+  foreach( COMPONENT  ${Boost_FIND_COMPONENTS} )
+    string( TOUPPER ${COMPONENT} UPPERCOMPONENT )
+    if( Boost_${UPPERCOMPONENT}_FOUND )
+      if(NOT Boost_FIND_QUIETLY)
+        message (STATUS "  ${COMPONENT}")
+      endif()
+      list(APPEND Boost_LIBRARIES ${Boost_${UPPERCOMPONENT}_LIBRARY})
+    endif()
+  endforeach()
+
+  # Add pthread library on UNIX if thread component was found
+  _Boost_consider_adding_pthreads(Boost_LIBRARIES ${Boost_LIBRARIES})
+else()
+  if(Boost_FIND_REQUIRED)
+    message(SEND_ERROR "Unable to find the requested Boost libraries.\n${Boost_ERROR_REASON}")
+  else()
+    if(NOT Boost_FIND_QUIETLY)
+      # we opt not to automatically output Boost_ERROR_REASON here as
+      # it could be quite lengthy and somewhat imposing in its requests
+      # Since Boost is not always a required dependency we'll leave this
+      # up to the end-user.
+      if(Boost_DEBUG OR Boost_DETAILED_FAILURE_MSG)
+        message(STATUS "Could NOT find Boost\n${Boost_ERROR_REASON}")
+      else()
+        message(STATUS "Could NOT find Boost")
+      endif()
+    endif()
+  endif()
+endif()
+
+# Configure display of cache entries in GUI.
+foreach(v BOOSTROOT BOOST_ROOT ${_Boost_VARS_INC} ${_Boost_VARS_LIB})
+  get_property(_type CACHE ${v} PROPERTY TYPE)
+  if(_type)
+    set_property(CACHE ${v} PROPERTY ADVANCED 1)
+    if("x${_type}" STREQUAL "xUNINITIALIZED")
+      if("x${v}" STREQUAL "xBoost_ADDITIONAL_VERSIONS")
+        set_property(CACHE ${v} PROPERTY TYPE STRING)
+      else()
+        set_property(CACHE ${v} PROPERTY TYPE PATH)
+      endif()
+    endif()
+  endif()
+endforeach()
+
+# Record last used values of input variables so we can
+# detect on the next run if the user changed them.
+foreach(v
+    ${_Boost_VARS_INC} ${_Boost_VARS_LIB}
+    ${_Boost_VARS_DIR} ${_Boost_VARS_NAME}
+    )
+  if(DEFINED ${v})
+    set(_${v}_LAST "${${v}}" CACHE INTERNAL "Last used ${v} value.")
+  else()
+    unset(_${v}_LAST CACHE)
+  endif()
+endforeach()
+
+# Maintain a persistent list of components requested anywhere since
+# the last flush.
+set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}")
+list(APPEND _Boost_COMPONENTS_SEARCHED ${Boost_FIND_COMPONENTS})
+list(REMOVE_DUPLICATES _Boost_COMPONENTS_SEARCHED)
+list(SORT _Boost_COMPONENTS_SEARCHED)
+set(_Boost_COMPONENTS_SEARCHED "${_Boost_COMPONENTS_SEARCHED}"
+  CACHE INTERNAL "Components requested for this build tree.")
diff --git a/cmake/generic/modules/FindEigen3.cmake b/cmake/generic/modules/FindEigen3.cmake
new file mode 100644
index 0000000..9c546a0
--- /dev/null
+++ b/cmake/generic/modules/FindEigen3.cmake
@@ -0,0 +1,81 @@
+# - Try to find Eigen3 lib
+#
+# This module supports requiring a minimum version, e.g. you can do
+#   find_package(Eigen3 3.1.2)
+# to require version 3.1.2 or newer of Eigen3.
+#
+# Once done this will define
+#
+#  EIGEN3_FOUND - system has eigen lib with correct version
+#  EIGEN3_INCLUDE_DIR - the eigen include directory
+#  EIGEN3_VERSION - eigen version
+
+# Copyright (c) 2006, 2007 Montel Laurent, <montel at kde.org>
+# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael at free.fr>
+# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
+
+if(NOT Eigen3_FIND_VERSION)
+  if(NOT Eigen3_FIND_VERSION_MAJOR)
+    set(Eigen3_FIND_VERSION_MAJOR 2)
+  endif(NOT Eigen3_FIND_VERSION_MAJOR)
+  if(NOT Eigen3_FIND_VERSION_MINOR)
+    set(Eigen3_FIND_VERSION_MINOR 91)
+  endif(NOT Eigen3_FIND_VERSION_MINOR)
+  if(NOT Eigen3_FIND_VERSION_PATCH)
+    set(Eigen3_FIND_VERSION_PATCH 0)
+  endif(NOT Eigen3_FIND_VERSION_PATCH)
+
+  set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
+endif(NOT Eigen3_FIND_VERSION)
+
+macro(_eigen3_check_version)
+  file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
+
+  string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
+  set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
+
+  set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
+  if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK FALSE)
+  else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK TRUE)
+  endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+
+  if(NOT EIGEN3_VERSION_OK)
+
+    message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
+                   "but at least version ${Eigen3_FIND_VERSION} is required")
+  endif(NOT EIGEN3_VERSION_OK)
+endmacro(_eigen3_check_version)
+
+if (EIGEN3_INCLUDE_DIR)
+
+  # in cache already
+  _eigen3_check_version()
+  set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
+
+else (EIGEN3_INCLUDE_DIR)
+
+  find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
+      PATHS
+      ${CMAKE_INSTALL_PREFIX}/include
+      ${KDE4_INCLUDE_DIR}
+      PATH_SUFFIXES eigen3 eigen
+    )
+
+  if(EIGEN3_INCLUDE_DIR)
+    _eigen3_check_version()
+  endif(EIGEN3_INCLUDE_DIR)
+
+  include(FindPackageHandleStandardArgs)
+  find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
+
+  mark_as_advanced(EIGEN3_INCLUDE_DIR)
+
+endif(EIGEN3_INCLUDE_DIR)
+
diff --git a/cmake/generic/modules/FindFFTW.cmake b/cmake/generic/modules/FindFFTW.cmake
new file mode 100644
index 0000000..70e0de7
--- /dev/null
+++ b/cmake/generic/modules/FindFFTW.cmake
@@ -0,0 +1,68 @@
+# Find the FFTW includes and library.
+# 
+# This module defines
+# FFTW_INCLUDE_DIR, where to locate fftw3.h file
+# FFTW_LIBRARIES, the libraries to link against to use fftw3
+# FFTW_FOUND.  If false, you cannot build anything that requires fftw3.
+# FFTW_LIBRARY, where to find the libfftw3 library.
+
+set(FFTW_FOUND 0)
+if(FFTW_LIBRARY AND FFTW_INCLUDE_DIR)
+  set(FFTW_FIND_QUIETLY TRUE)
+endif()
+
+if(NOT WIN32)
+    find_path(FFTW_INCLUDE_DIR fftw3.h
+        $ENV{FFTW_DIR}/include
+        $ENV{FFTW3} $ENV{FFTW3}/include $ENV{FFTW3}/api
+        /usr/local/include
+        /usr/include
+        /opt/fftw3/include
+        /opt/local/include
+        DOC "Specify the directory containing fftw3.h"
+    )
+
+    find_library(FFTW_LIBRARY NAMES fftw3 fftw3-3 PATHS
+        $ENV{FFTW_DIR}/lib
+        $ENV{FFTW3} $ENV{FFTW3}/lib $ENV{FFTW3}/.libs
+        /usr/local/lib
+        /usr/lib 
+        /opt/fftw3/lib
+        HINTS /opt/local/lib
+        DOC "Specify the fttw3 library here."
+    )
+else()
+    find_path(FFTW_INCLUDE_DIR fftw3.h
+        $ENV{FFTW_DIR}/include
+        "C:/opt/local/include"
+    )
+#    message("XXX ${FFTW_INCLUDE_DIR}")
+
+    find_library(FFTW_LIBRARY NAMES libfftw3-3 PATHS
+        $ENV{FFTW_DIR}/lib
+        $ENV{FFTW3} $ENV{FFTW3}/lib $ENV{FFTW3}/.libs
+        "C:/opt/local/lib"
+    )
+#    message("XXX ${FFTW_LIBRARY}")
+    
+endif()
+
+if(FFTW_INCLUDE_DIR AND FFTW_LIBRARY)
+  set(FFTW_FOUND 1 )
+  if(NOT FFTW_FIND_QUIETLY)
+     message(STATUS "Found fftw3 includes at ${FFTW_INCLUDE_DIR}")
+     message(STATUS "Found fftw3 library at ${FFTW_LIBRARY}")
+  endif()
+endif()
+
+
+if( NOT FFTW_FOUND )
+    if( FFTW_FIND_REQUIRED )
+        message( FATAL_ERROR "FindFFTW: can't find fftw3 header or library" )
+    endif()
+endif()
+
+
+set(FFTW_LIBRARIES ${FFTW_LIBRARY})
+
+mark_as_advanced(FFTW_FOUND FFTW_LIBRARY FFTW_INCLUDE_DIR)
diff --git a/cmake/generic/modules/FindGSL.cmake b/cmake/generic/modules/FindGSL.cmake
new file mode 100644
index 0000000..1528e3b
--- /dev/null
+++ b/cmake/generic/modules/FindGSL.cmake
@@ -0,0 +1,239 @@
+#.rst:
+# FindGSL
+# --------
+#
+# Find the native GSL includes and libraries.
+#
+# The GNU Scientific Library (GSL) is a numerical library for C and C++
+# programmers. It is free software under the GNU General Public
+# License.
+#
+# Imported Targets
+# ^^^^^^^^^^^^^^^^
+#
+# If GSL is found, this module defines the following :prop_tgt:`IMPORTED`
+# targets::
+#
+#  GSL::gsl      - The main GSL library.
+#  GSL::gslcblas - The CBLAS support library used by GSL.
+#
+# Result Variables
+# ^^^^^^^^^^^^^^^^
+#
+# This module will set the following variables in your project::
+#
+#  GSL_FOUND          - True if GSL found on the local system
+#  GSL_INCLUDE_DIRS   - Location of GSL header files.
+#  GSL_LIBRARIES      - The GSL libraries.
+#  GSL_VERSION        - The version of the discovered GSL install.
+#
+# Hints
+# ^^^^^
+#
+# Set ``GSL_ROOT_DIR`` to a directory that contains a GSL installation.
+#
+# This script expects to find libraries at ``$GSL_ROOT_DIR/lib`` and the GSL
+# headers at ``$GSL_ROOT_DIR/include/gsl``.  The library directory may
+# optionally provide Release and Debug folders.  For Unix-like systems, this
+# script will use ``$GSL_ROOT_DIR/bin/gsl-config`` (if found) to aid in the
+# discovery GSL.
+#
+# Cache Variables
+# ^^^^^^^^^^^^^^^
+#
+# This module may set the following variables depending on platform and type
+# of GSL installation discovered.  These variables may optionally be set to
+# help this module find the correct files::
+#
+#  GSL_CLBAS_LIBRARY       - Location of the GSL CBLAS library.
+#  GSL_CBLAS_LIBRARY_DEBUG - Location of the debug GSL CBLAS library (if any).
+#  GSL_CONFIG_EXECUTABLE   - Location of the ``gsl-config`` script (if any).
+#  GSL_LIBRARY             - Location of the GSL library.
+#  GSL_LIBRARY_DEBUG       - Location of the debug GSL library (if any).
+#
+
+#=============================================================================
+# Copyright 2014 Kelly Thompson <kgt at lanl.gov>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+# Include these modules to handle the QUIETLY and REQUIRED arguments.
+#include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) # original
+include(FindPackageHandleStandardArgs) # patched JWu 4/16
+
+#=============================================================================
+# If the user has provided ``GSL_ROOT_DIR``, use it!  Choose items found
+# at this location over system locations.
+if( EXISTS "$ENV{GSL_ROOT_DIR}" )
+  file( TO_CMAKE_PATH "$ENV{GSL_ROOT_DIR}" GSL_ROOT_DIR )
+  set( GSL_ROOT_DIR "${GSL_ROOT_DIR}" CACHE PATH "Prefix for GSL installation." )
+endif()
+if( NOT EXISTS "${GSL_ROOT_DIR}" )
+  set( GSL_USE_PKGCONFIG ON )
+endif()
+
+#=============================================================================
+# As a first try, use the PkgConfig module.  This will work on many
+# *NIX systems.  See :module:`findpkgconfig`
+# This will return ``GSL_INCLUDEDIR`` and ``GSL_LIBDIR`` used below.
+if( GSL_USE_PKGCONFIG )
+  find_package(PkgConfig)
+  pkg_check_modules( GSL QUIET gsl )
+
+  if( EXISTS "${GSL_INCLUDEDIR}" )
+    get_filename_component( GSL_ROOT_DIR "${GSL_INCLUDEDIR}" DIRECTORY CACHE)
+  endif()
+endif()
+
+#=============================================================================
+# Set GSL_INCLUDE_DIRS and GSL_LIBRARIES. If we skipped the PkgConfig step, try
+# to find the libraries at $GSL_ROOT_DIR (if provided) or in standard system
+# locations.  These find_library and find_path calls will prefer custom
+# locations over standard locations (HINTS).  If the requested file is not found
+# at the HINTS location, standard system locations will be still be searched
+# (/usr/lib64 (Redhat), lib/i386-linux-gnu (Debian)).
+
+find_path( GSL_INCLUDE_DIR
+  NAMES gsl/gsl_sf.h
+  HINTS ${GSL_ROOT_DIR}/include ${GSL_INCLUDEDIR}
+)
+find_library( GSL_LIBRARY
+  NAMES gsl
+  HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
+  PATH_SUFFIXES Release Debug
+)
+find_library( GSL_CBLAS_LIBRARY
+  NAMES gslcblas cblas
+  HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
+  PATH_SUFFIXES Release Debug
+)
+# Do we also have debug versions?
+find_library( GSL_LIBRARY_DEBUG
+  NAMES gsl
+  HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
+  PATH_SUFFIXES Debug
+)
+find_library( GSL_CBLAS_LIBRARY_DEBUG
+  NAMES gslcblas cblas
+  HINTS ${GSL_ROOT_DIR}/lib ${GSL_LIBDIR}
+  PATH_SUFFIXES Debug
+)
+set( GSL_INCLUDE_DIRS ${GSL_INCLUDE_DIR} )
+set( GSL_LIBRARIES ${GSL_LIBRARY} ${GSL_CBLAS_LIBRARY} )
+
+# If we didn't use PkgConfig, try to find the version via gsl-config or by
+# reading gsl_version.h.
+if( NOT GSL_VERSION )
+  # 1. If gsl-config exists, query for the version.
+  find_program( GSL_CONFIG_EXECUTABLE
+    NAMES gsl-config
+    HINTS "${GSL_ROOT_DIR}/bin"
+    )
+  if( EXISTS "${GSL_CONFIG_EXECUTABLE}" )
+    execute_process(
+      COMMAND "${GSL_CONFIG_EXECUTABLE}" --version
+      OUTPUT_VARIABLE GSL_VERSION
+      OUTPUT_STRIP_TRAILING_WHITESPACE )
+  endif()
+
+  # 2. If gsl-config is not available, try looking in gsl/gsl_version.h
+  if( NOT GSL_VERSION AND EXISTS "${GSL_INCLUDE_DIRS}/gsl/gsl_version.h" )
+    file( STRINGS "${GSL_INCLUDE_DIRS}/gsl/gsl_version.h" gsl_version_h_contents REGEX "define GSL_VERSION" )
+    string( REGEX REPLACE ".*([0-9].[0-9][0-9]).*" "\\1" GSL_VERSION ${gsl_version_h_contents} )
+  endif()
+
+  # might also try scraping the directory name for a regex match "gsl-X.X"
+endif()
+
+#=============================================================================
+# handle the QUIETLY and REQUIRED arguments and set GSL_FOUND to TRUE if all
+# listed variables are TRUE
+find_package_handle_standard_args( GSL
+  FOUND_VAR
+    GSL_FOUND
+  REQUIRED_VARS
+    GSL_INCLUDE_DIR
+    GSL_LIBRARY
+    GSL_CBLAS_LIBRARY
+  VERSION_VAR
+    GSL_VERSION
+    )
+
+mark_as_advanced( GSL_ROOT_DIR GSL_VERSION GSL_LIBRARY GSL_INCLUDE_DIR
+  GSL_CBLAS_LIBRARY GSL_LIBRARY_DEBUG GSL_CBLAS_LIBRARY_DEBUG
+  GSL_USE_PKGCONFIG GSL_CONFIG )
+
+#=============================================================================
+# Register imported libraries:
+# 1. If we can find a Windows .dll file (or if we can find both Debug and
+#    Release libraries), we will set appropriate target properties for these.
+# 2. However, for most systems, we will only register the import location and
+#    include directory.
+
+# Look for dlls, or Release and Debug libraries.
+if(WIN32)
+  string( REPLACE ".lib" ".dll" GSL_LIBRARY_DLL       "${GSL_LIBRARY}" )
+  string( REPLACE ".lib" ".dll" GSL_CBLAS_LIBRARY_DLL "${GSL_CBLAS_LIBRARY}" )
+  string( REPLACE ".lib" ".dll" GSL_LIBRARY_DEBUG_DLL "${GSL_LIBRARY_DEBUG}" )
+  string( REPLACE ".lib" ".dll" GSL_CBLAS_LIBRARY_DEBUG_DLL "${GSL_CBLAS_LIBRARY_DEBUG}" )
+endif()
+
+if( GSL_FOUND AND NOT TARGET GSL::gsl )
+  if( EXISTS "${GSL_LIBRARY_DLL}" AND EXISTS "${GSL_CBLAS_LIBRARY_DLL}")
+
+    # Windows systems with dll libraries.
+    add_library( GSL::gsl      SHARED IMPORTED )
+    add_library( GSL::gslcblas SHARED IMPORTED )
+
+    # Windows with dlls, but only Release libraries.
+    set_target_properties( GSL::gslcblas PROPERTIES
+      IMPORTED_LOCATION_RELEASE         "${GSL_CBLAS_LIBRARY_DLL}"
+      IMPORTED_IMPLIB                   "${GSL_CBLAS_LIBRARY}"
+      INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
+      IMPORTED_CONFIGURATIONS           Release
+      IMPORTED_LINK_INTERFACE_LANGUAGES "C" )
+    set_target_properties( GSL::gsl PROPERTIES
+      IMPORTED_LOCATION_RELEASE         "${GSL_LIBRARY_DLL}"
+      IMPORTED_IMPLIB                   "${GSL_LIBRARY}"
+      INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
+      IMPORTED_CONFIGURATIONS           Release
+      IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+      INTERFACE_LINK_LIBRARIES          GSL::gslcblas )
+
+    # If we have both Debug and Release libraries
+    if( EXISTS "${GSL_LIBRARY_DEBUG_DLL}" AND EXISTS "${GSL_CBLAS_LIBRARY_DEBUG_DLL}")
+      set_property( TARGET GSL::gslcblas APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
+      set_target_properties( GSL::gslcblas PROPERTIES
+        IMPORTED_LOCATION_DEBUG           "${GSL_CBLAS_LIBRARY_DEBUG_DLL}"
+        IMPORTED_IMPLIB_DEBUG             "${GSL_CBLAS_LIBRARY_DEBUG}" )
+      set_property( TARGET GSL::gsl APPEND PROPERTY IMPORTED_CONFIGURATIONS Debug )
+      set_target_properties( GSL::gsl PROPERTIES
+        IMPORTED_LOCATION_DEBUG           "${GSL_LIBRARY_DEBUG_DLL}"
+        IMPORTED_IMPLIB_DEBUG             "${GSL_LIBRARY_DEBUG}" )
+    endif()
+
+  else()
+
+    # For all other environments (ones without dll libraries), create
+    # the imported library targets.
+    add_library( GSL::gsl      UNKNOWN IMPORTED )
+    add_library( GSL::gslcblas UNKNOWN IMPORTED )
+    set_target_properties( GSL::gslcblas PROPERTIES
+      IMPORTED_LOCATION                 "${GSL_CBLAS_LIBRARY}"
+      INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
+      IMPORTED_LINK_INTERFACE_LANGUAGES "C" )
+    set_target_properties( GSL::gsl PROPERTIES
+      IMPORTED_LOCATION                 "${GSL_LIBRARY}"
+      INTERFACE_INCLUDE_DIRECTORIES     "${GSL_INCLUDE_DIRS}"
+      IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+      INTERFACE_LINK_LIBRARIES          GSL::gslcblas )
+  endif()
+endif()
diff --git a/cmake/generic/modules/FindNumpy.cmake b/cmake/generic/modules/FindNumpy.cmake
new file mode 100644
index 0000000..ba06672
--- /dev/null
+++ b/cmake/generic/modules/FindNumpy.cmake
@@ -0,0 +1,48 @@
+# Find the native numpy includes
+# This module defines
+#  NUMPY_INCLUDE_DIR, where to find numpy/arrayobject.h, etc.
+#  NUMPY_FOUND, If false, do not try to use numpy headers.
+
+if (NUMPY_INCLUDE_DIR)
+  # in cache already
+  set (Numpy_FIND_QUIETLY TRUE)
+endif (NUMPY_INCLUDE_DIR)
+
+if(NOT Numpy_FIND_QUIETLY)
+    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.get_include())"
+        OUTPUT_VARIABLE NUMPY_INCLUDE_DIR
+        RESULT_VARIABLE NUMPY_NOT_FOUND
+        OUTPUT_STRIP_TRAILING_WHITESPACE)
+endif()
+
+if (NUMPY_INCLUDE_DIR MATCHES "Traceback")
+    # Did not successfully include numpy
+    message(ERROR "Unexpected NUMPY_INCLUDE_DIR='${NUMPY_INCLUDE_DIR}'.")
+    set(NUMPY_FOUND FALSE)
+else()
+    # successful
+    message(STATUS "Found NUMPY_INCLUDE_DIR='${NUMPY_INCLUDE_DIR}'.")
+    if(NOT EXISTS ${NUMPY_INCLUDE_DIR}/numpy/arrayobject.h)
+        message(STATUS "Can't find numpy/arrayobject.h, please install python-numpy-devel package")
+    else()
+        set (NUMPY_FOUND TRUE)
+        set (NUMPY_INCLUDE_DIR ${NUMPY_INCLUDE_DIR} CACHE STRING "Numpy include path")
+        execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.__version__)"
+            OUTPUT_VARIABLE numpy_version_number
+            RESULT_VARIABLE numpy_return_value
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+    endif()
+endif()
+
+if (NUMPY_FOUND)
+    if (NOT Numpy_FIND_QUIETLY)
+        message (STATUS "Numpy headers found at ${NUMPY_INCLUDE_DIR}, version ${numpy_version_number}.")
+    endif()
+else()
+    if (Numpy_FIND_REQUIRED)
+        message (FATAL_ERROR "Numpy headers missing, please install python-numpy-devel package")
+    endif()
+endif()
+
+
+MARK_AS_ADVANCED (NUMPY_INCLUDE_DIR)
diff --git a/cmake/generic/modules/FindPyYaml.cmake b/cmake/generic/modules/FindPyYaml.cmake
new file mode 100644
index 0000000..abb4597
--- /dev/null
+++ b/cmake/generic/modules/FindPyYaml.cmake
@@ -0,0 +1,19 @@
+# Find the python-yaml module.
+# This module defines PYYAML_FOUND.
+
+execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import yaml; print(yaml.__version__)"
+  OUTPUT_VARIABLE pyyaml_version_number
+  ERROR_VARIABLE  pyyaml_err_msg
+  RESULT_VARIABLE PYYAML_NOT_FOUND
+  OUTPUT_STRIP_TRAILING_WHITESPACE
+  ERROR_STRIP_TRAILING_WHITESPACE)
+
+if (PYYAML_NOT_FOUND)
+    message(FATAL_ERROR "python-yaml not found (ret='${PYYAML_NOT_FOUND}', "
+        "out='${pyyaml_version_number}', "
+        "err='${pyyaml_err_msg}')")
+    set(PYYAML_FOUND FALSE)
+else()
+    message (STATUS "Found python module yaml, version ${pyyaml_version_number}.")
+    set(PYYAML_FOUND TRUE)
+endif()
diff --git a/cmake/generic/modules/FindPythonLibsNew.cmake b/cmake/generic/modules/FindPythonLibsNew.cmake
new file mode 100644
index 0000000..c9e4614
--- /dev/null
+++ b/cmake/generic/modules/FindPythonLibsNew.cmake
@@ -0,0 +1,233 @@
+# - Find python libraries
+# This module finds the libraries corresponding to the Python interpeter
+# FindPythonInterp provides.
+# This code sets the following variables:
+#
+#  PYTHONLIBS_FOUND           - have the Python libs been found
+#  PYTHON_PREFIX              - path to the Python installation
+#  PYTHON_LIBRARIES           - path to the python library
+#  PYTHON_INCLUDE_DIRS        - path to where Python.h is found
+#  PYTHON_SITE_PACKAGES       - path to installation site-packages
+#  PYTHON_IS_DEBUG            - whether the Python interpreter is a debug build
+#
+#  PYTHON_INCLUDE_PATH        - path to where Python.h is found (deprecated)
+#
+# A function PYTHON_ADD_MODULE(<name> src1 src2 ... srcN) is defined
+# to build modules for python.
+#
+# Thanks to talljimbo for the patch adding the 'LDVERSION' config
+# variable usage.
+
+#=============================================================================
+# Copyright 2001-2009 Kitware, Inc.
+# Copyright 2012 Continuum Analytics, Inc.
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the names of Kitware, Inc., the Insight Software Consortium,
+# nor the names of their contributors may be used to endorse or promote
+# products derived from this software without specific prior written
+# permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+# Use the Python interpreter to find the libs.
+#if(PythonLibsNew_FIND_REQUIRED)
+#    find_package(PythonInterp REQUIRED)
+#else()
+#    find_package(PythonInterp)
+#endif()
+
+if(NOT PYTHONINTERP_FOUND)
+    set(PYTHONLIBS_FOUND FALSE)
+    return()
+endif()
+
+# According to http://stackoverflow.com/questions/646518/python-how-to-detect-debug-interpreter
+# testing whether sys has the gettotalrefcount function is a reliable, cross-platform
+# way to detect a CPython debug interpreter.
+#
+# The library suffix is from the config var LDVERSION sometimes, otherwise
+# VERSION. VERSION will typically be like "2.7" on unix, and "27" on windows.
+execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c"
+    "from distutils import sysconfig as s;import sys;import struct;
+print('.'.join(str(v) for v in sys.version_info));
+print(sys.prefix);
+print(s.get_python_inc(plat_specific=True));
+print(s.get_python_lib(plat_specific=True));
+print(s.get_config_var('SO'));
+print(hasattr(sys, 'gettotalrefcount')+0);
+print(struct.calcsize('@P'));
+print(s.get_config_var('LDVERSION') or s.get_config_var('VERSION'));
+"
+    RESULT_VARIABLE _PYTHON_SUCCESS
+    OUTPUT_VARIABLE _PYTHON_VALUES
+    ERROR_VARIABLE _PYTHON_ERROR_VALUE
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if(NOT _PYTHON_SUCCESS MATCHES 0)
+    if(PythonLibsNew_FIND_REQUIRED)
+        message(FATAL_ERROR
+            "Python config failure:\n${_PYTHON_ERROR_VALUE}")
+    endif()
+    set(PYTHONLIBS_FOUND FALSE)
+    return()
+endif()
+
+# Convert the process output into a list
+string(REGEX REPLACE ";" "\\\\;" _PYTHON_VALUES ${_PYTHON_VALUES})
+string(REGEX REPLACE "\n" ";" _PYTHON_VALUES ${_PYTHON_VALUES})
+list(GET _PYTHON_VALUES 0 _PYTHON_VERSION_LIST)
+list(GET _PYTHON_VALUES 1 PYTHON_PREFIX)
+list(GET _PYTHON_VALUES 2 PYTHON_INCLUDE_DIR)
+list(GET _PYTHON_VALUES 3 PYTHON_SITE_PACKAGES)
+list(GET _PYTHON_VALUES 4 PYTHON_MODULE_EXTENSION)
+list(GET _PYTHON_VALUES 5 PYTHON_IS_DEBUG)
+list(GET _PYTHON_VALUES 6 PYTHON_SIZEOF_VOID_P)
+list(GET _PYTHON_VALUES 7 PYTHON_LIBRARY_SUFFIX)
+
+# Make sure the Python has the same pointer-size as the chosen compiler
+# Skip the check on OS X, it doesn't consistently have CMAKE_SIZEOF_VOID_P defined
+if((NOT APPLE) AND (NOT "${PYTHON_SIZEOF_VOID_P}" STREQUAL "${CMAKE_SIZEOF_VOID_P}"))
+    if(PythonLibsNew_FIND_REQUIRED)
+        math(EXPR _PYTHON_BITS "${PYTHON_SIZEOF_VOID_P} * 8")
+        math(EXPR _CMAKE_BITS "${CMAKE_SIZEOF_VOID_P} * 8")
+        message(FATAL_ERROR
+            "Python config failure: Python is ${_PYTHON_BITS}-bit, "
+            "chosen compiler is  ${_CMAKE_BITS}-bit")
+    endif()
+    set(PYTHONLIBS_FOUND FALSE)
+    return()
+endif()
+
+# The built-in FindPython didn't always give the version numbers
+string(REGEX REPLACE "\\." ";" _PYTHON_VERSION_LIST ${_PYTHON_VERSION_LIST})
+list(GET _PYTHON_VERSION_LIST 0 PYTHON_VERSION_MAJOR)
+list(GET _PYTHON_VERSION_LIST 1 PYTHON_VERSION_MINOR)
+list(GET _PYTHON_VERSION_LIST 2 PYTHON_VERSION_PATCH)
+
+# Make sure all directory separators are '/'
+string(REGEX REPLACE "\\\\" "/" PYTHON_PREFIX ${PYTHON_PREFIX})
+string(REGEX REPLACE "\\\\" "/" PYTHON_INCLUDE_DIR ${PYTHON_INCLUDE_DIR})
+string(REGEX REPLACE "\\\\" "/" PYTHON_SITE_PACKAGES ${PYTHON_SITE_PACKAGES})
+
+# TODO: All the nuances of CPython debug builds have not been dealt with/tested.
+if(PYTHON_IS_DEBUG)
+    set(PYTHON_MODULE_EXTENSION "_d${PYTHON_MODULE_EXTENSION}")
+endif()
+
+if(CMAKE_HOST_WIN32)
+    set(PYTHON_LIBRARY
+        "${PYTHON_PREFIX}/libs/Python${PYTHON_LIBRARY_SUFFIX}.lib")
+elseif(APPLE)
+     # Seems to require "-undefined dynamic_lookup" instead of linking
+     # against the .dylib, otherwise it crashes. This flag is added
+     # below
+    #set(PYTHON_LIBRARY "")
+    set(PYTHON_LIBRARY
+        "${PYTHON_PREFIX}/lib/libpython${PYTHON_LIBRARY_SUFFIX}.dylib")
+else()
+    if(${PYTHON_SIZEOF_VOID_P} MATCHES 8)
+        set(_PYTHON_LIBS_SEARCH "${PYTHON_PREFIX}/lib64" "${PYTHON_PREFIX}/lib")
+    else()
+        set(_PYTHON_LIBS_SEARCH "${PYTHON_PREFIX}/lib")
+    endif()
+    message(STATUS "Searching for Python libs in ${_PYTHON_LIBS_SEARCH}")
+    # Probably this needs to be more involved. It would be nice if the config
+    # information the python interpreter itself gave us were more complete.
+    find_library(PYTHON_LIBRARY
+        NAMES "python${PYTHON_LIBRARY_SUFFIX}"
+        PATHS ${_PYTHON_LIBS_SEARCH}
+        NO_DEFAULT_PATH)
+    message(STATUS "Found Python lib ${PYTHON_LIBRARY}")
+endif()
+
+# For backward compatibility, set PYTHON_INCLUDE_PATH, but make it internal.
+SET(PYTHON_INCLUDE_PATH "${PYTHON_INCLUDE_DIR}" CACHE INTERNAL
+          "Path to where Python.h is found (deprecated)")
+
+MARK_AS_ADVANCED(
+  PYTHON_LIBRARY
+  PYTHON_INCLUDE_DIR
+)
+
+# We use PYTHON_INCLUDE_DIR, PYTHON_LIBRARY and PYTHON_DEBUG_LIBRARY for the
+# cache entries because they are meant to specify the location of a single
+# library. We now set the variables listed by the documentation for this
+# module.
+SET(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
+SET(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
+SET(PYTHON_DEBUG_LIBRARIES "${PYTHON_DEBUG_LIBRARY}")
+
+
+# Don't know how to get to this directory, just doing something simple :P
+#INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+#FIND_PACKAGE_HANDLE_STANDARD_ARGS(PythonLibs DEFAULT_MSG PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
+#find_package_message(PYTHON
+#    "Found PythonLibs xxx: ${PYTHON_LIBRARY}"
+#    "${PYTHON_EXECUTABLE}${PYTHON_VERSION}")
+
+
+#PYTHON_ADD_MODULE(<name> src1 src2 ... srcN) is used to build modules for python.
+FUNCTION(PYTHON_ADD_MODULE _NAME )
+  GET_PROPERTY(_TARGET_SUPPORTS_SHARED_LIBS
+    GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
+  OPTION(PYTHON_ENABLE_MODULE_${_NAME} "Add module ${_NAME}" TRUE)
+  OPTION(PYTHON_MODULE_${_NAME}_BUILD_SHARED
+    "Add module ${_NAME} shared" ${_TARGET_SUPPORTS_SHARED_LIBS})
+
+  # Mark these options as advanced
+  MARK_AS_ADVANCED(PYTHON_ENABLE_MODULE_${_NAME}
+    PYTHON_MODULE_${_NAME}_BUILD_SHARED)
+
+  IF(PYTHON_ENABLE_MODULE_${_NAME})
+    IF(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
+      SET(PY_MODULE_TYPE MODULE)
+    ELSE(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
+      SET(PY_MODULE_TYPE STATIC)
+      SET_PROPERTY(GLOBAL  APPEND  PROPERTY  PY_STATIC_MODULES_LIST ${_NAME})
+    ENDIF(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
+
+    SET_PROPERTY(GLOBAL  APPEND  PROPERTY  PY_MODULES_LIST ${_NAME})
+    ADD_LIBRARY(${_NAME} ${PY_MODULE_TYPE} ${ARGN})
+    IF(APPLE)
+      # On OS X, linking against the Python libraries causes
+      # segfaults, so do this dynamic lookup instead.
+      SET_TARGET_PROPERTIES(${_NAME} PROPERTIES LINK_FLAGS
+                          "-undefined dynamic_lookup")
+    ELSE()
+      TARGET_LINK_LIBRARIES(${_NAME} ${PYTHON_LIBRARIES})
+    ENDIF()
+    IF(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
+      SET_TARGET_PROPERTIES(${_NAME} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}")
+      SET_TARGET_PROPERTIES(${_NAME} PROPERTIES SUFFIX "${PYTHON_MODULE_EXTENSION}")
+    ELSE()
+    ENDIF()
+
+  ENDIF(PYTHON_ENABLE_MODULE_${_NAME})
+ENDFUNCTION(PYTHON_ADD_MODULE)
+
diff --git a/cmake/generic/modules/FindTIFF.cmake b/cmake/generic/modules/FindTIFF.cmake
new file mode 100644
index 0000000..15e3d8a
--- /dev/null
+++ b/cmake/generic/modules/FindTIFF.cmake
@@ -0,0 +1,75 @@
+#.rst:
+# FindTIFF
+# --------
+#
+# Find TIFF and TIFF/C++libraries
+#
+# This module defines
+#
+# ::
+#
+#   TIFF_INCLUDE_DIR, where to find tiff.h, etc.
+#   TIFF_LIBRARIES, libraries to link against to use TIFF.
+#   TIFF_FOUND, If false, do not try to use TIFF.
+#
+# also defined, but not for general use are
+#
+# ::
+#
+#   TIFF_LIBRARY, where to find the TIFF library.
+
+# This is a heavily patched version of the CMake module FindTIFF.cmake
+# Copyright 2002-2009 Kitware, Inc.
+# Copyright 2013- BornAgain team
+# Distributed under the OSI-approved BSD License
+
+if(WIN32)
+    find_path(TIFF_INCLUDE_DIR tiff.h PATHS ${CMAKE_INCLUDE_PATH}/libtiff NO_SYSTEM_ENVIRONMENT_PATH)
+else()
+    find_path(TIFF_INCLUDE_DIR tiff.h)
+endif()
+
+set(TIFF_NAMES ${TIFF_NAMES} libtiff tiff libtiff3 tiff3)
+find_library(TIFF_LIBRARY NAMES ${TIFF_NAMES})
+
+if(TIFF_INCLUDE_DIR AND EXISTS "${TIFF_INCLUDE_DIR}/tiffvers.h")
+    file(STRINGS "${TIFF_INCLUDE_DIR}/tiffvers.h" tiff_version_str
+         REGEX "^#define[\t ]+TIFFLIB_VERSION_STR[\t ]+\"LIBTIFF, Version .*")
+
+    string(REGEX REPLACE "^#define[\t ]+TIFFLIB_VERSION_STR[\t ]+\"LIBTIFF, Version +([^ \\n]*).*"
+           "\\1" TIFF_VERSION_STRING "${tiff_version_str}")
+    unset(tiff_version_str)
+endif()
+
+# handle the QUIETLY and REQUIRED arguments and set TIFF_FOUND to TRUE if
+# all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(TIFF
+                                  REQUIRED_VARS TIFF_LIBRARY TIFF_INCLUDE_DIR
+                                  VERSION_VAR TIFF_VERSION_STRING)
+
+if(TIFF_FOUND)
+    set( TIFF_LIBRARIES ${TIFF_LIBRARY} )
+endif()
+
+if(TIFF_FOUND)
+    message(STATUS "Found TIFF version ${TIFF_VERSION_STRING}, includes at ${TIFF_INCLUDE_DIR}, libraries at ${TIFF_LIBRARIES}")
+
+    if(NOT WIN32)
+        # looking for C++ version of library libtiffxx.so
+        list(LENGTH TIFF_LIBRARIES len)
+        if(len EQUAL 1)
+            get_filename_component(tiff_library_name ${TIFF_LIBRARIES} NAME_WE )
+            get_filename_component(tiff_path ${TIFF_LIBRARIES} DIRECTORY )
+            get_filename_component(tiff_ext ${TIFF_LIBRARIES} EXT )
+            set(cpp_tiff_library "${tiff_path}/${tiff_library_name}xx${tiff_ext}")
+            if(NOT EXISTS ${cpp_tiff_library})
+                message(FATAL_ERROR "Could NOT find TIFF/C++ library ${cpp_tiff_library}.")
+            endif()
+            message(STATUS "Found TIFF C++ library ${cpp_tiff_library}")
+            set(TIFF_LIBRARIES ${TIFF_LIBRARIES};${cpp_tiff_library})
+        endif()
+    endif()
+endif()
+
+mark_as_advanced(TIFF_INCLUDE_DIR TIFF_LIBRARY)
diff --git a/cmake/generic/modules/FindYamlCpp05.cmake b/cmake/generic/modules/FindYamlCpp05.cmake
new file mode 100644
index 0000000..d1ed437
--- /dev/null
+++ b/cmake/generic/modules/FindYamlCpp05.cmake
@@ -0,0 +1,100 @@
+# Find libyaml-cpp with API version 0.5
+#
+# Usage:
+#   find_package(YamlCpp05 [REQUIRED] [QUIET])
+#
+# Sets the following variables:
+#   - YAMLCPP_FOUND          .. true if library is found
+#   - YAMLCPP_LIBRARIES      .. full path to library
+#   - YAMLCPP_INCLUDE_DIR    .. full path to include directory
+#
+# Honors the following optional variables:
+#   - YAMLCPP_INCLUDE_LOC    .. include directory path, to be searched before defaults
+#   - YAMLCPP_LIBRARY_LOC    .. the library's directory path, to be searched before defaults
+#   - YAMLCPP_STATIC_LIBRARY .. if true, find the static library version
+#
+# Copyright 2015 Joachim Wuttke, Forschungszentrum Jülich.
+# Redistribution permitted.
+
+include(CheckIncludeFileCXX)
+include(CheckCXXSourceRuns)
+
+# find the yaml-cpp include directory
+if(WIN32)
+    find_path(YAMLCPP_INCLUDE_DIR_TMP yaml.h PATHS ${CMAKE_INCLUDE_PATH}/yaml-cpp NO_SYSTEM_ENVIRONMENT_PATH)
+else()
+    find_path(YAMLCPP_INCLUDE_DIR_TMP yaml.h
+        PATH_SUFFIXES include yaml-cpp/include yaml-cpp
+        PATHS
+        ${YAMLCPP_INCLUDE_LOC}
+        ~/Library/Frameworks/
+        /Library/Frameworks/
+        /usr/local/
+        /usr/
+        /sw/ # Fink
+        /opt/local/ # DarwinPorts
+        /opt/csw/ # Blastwave
+        /opt/
+        )
+endif()
+get_filename_component(YAMLCPP_INCLUDE_DIR ${YAMLCPP_INCLUDE_DIR_TMP} DIRECTORY)
+message(STATUS "yaml-cpp include dir: ${YAMLCPP_INCLUDE_DIR}")
+
+if(WIN32)
+    set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
+else()
+    set(CMAKE_REQUIRED_INCLUDES ${YAMLCPP_INCLUDE_DIR})
+endif()
+set(CMAKE_REQUIRED_QUIET True)
+
+# first look for outdated yaml-cpp0.3 include files
+unset(YAMLCPP_FOUND_03 CACHE)
+CHECK_INCLUDE_FILE_CXX("yaml-cpp/aliasmanager.h" YAMLCPP_FOUND_03)
+if(${YAMLCPP_FOUND_03})
+    message(WARNING "Found include file for libyaml-cpp0.3. Most probably this precludes libyaml-cpp0.5 from being properly installed")
+endif()
+
+# now look for needed yaml-cpp0.5 include files
+unset(YAMLCPP_FOUND_05 CACHE)
+CHECK_INCLUDE_FILE_CXX("yaml-cpp/node/detail/iterator_fwd.h" YAMLCPP_FOUND_05)
+if(${YAMLCPP_FOUND_05})
+else()
+    message(FATAL_ERROR "Include file for libyaml-cpp0.5 not found")
+endif()
+
+# attempt to find static library first if this is set
+if(YAMLCPP_STATIC_LIBRARY)
+    set(YAMLCPP_STATIC libyaml-cpp.a)
+endif()
+
+# find the yaml-cpp library
+if(WIN32)
+    find_library(YAMLCPP_LIBRARY NAMES yaml-cpp)
+else()
+    find_library(YAMLCPP_LIBRARY
+        NAMES ${YAMLCPP_STATIC} yaml-cpp
+        PATH_SUFFIXES lib64 lib
+        PATHS
+        ${YAMLCPP_LIBRARY_LOC}
+        ~/Library/Frameworks
+        /Library/Frameworks
+        /usr/local
+        /usr
+        /sw
+        /opt/local
+        /opt/csw
+        /opt
+        )
+endif()
+
+# try to compile, link, and run a test program
+unset(YAMLCPP_RUNS CACHE)
+set(CMAKE_REQUIRED_LIBRARIES ${YAMLCPP_LIBRARY})
+check_cxx_source_runs("#include \"yaml-cpp/yaml.h\"\n#include <assert.h>\nint main() {\n    YAML::Node node = YAML::Load(\"[1, 2, 3]\");\n    assert(node.IsSequence());\n}" YAMLCPP_RUNS)
+if(${YAMLCPP_RUNS})
+else()
+    message(FATAL_ERROR "Test of libyaml-cpp0.5 failed")
+endif()
+
+message(STATUS "Found FindYamlCpp05: ${YAMLCPP_LIBRARY}")
+mark_as_advanced(YAMLCPP_INCLUDE_DIR YAMLCPP_LIBRARY)
diff --git a/cmake/generic/modules/GetFilenameComponent.cmake b/cmake/generic/modules/GetFilenameComponent.cmake
new file mode 100644
index 0000000..24275e7
--- /dev/null
+++ b/cmake/generic/modules/GetFilenameComponent.cmake
@@ -0,0 +1,17 @@
+# Reimplementation of native CMake command,
+# for correct handling of leading dot,
+# https://cmake.org/pipermail/cmake-developers/2011-June/013526.html
+function (get_filename_component)
+    _get_filename_component (${ARGN})
+    list (GET ARGN 0 VAR)
+    list (GET ARGN 2 CMD)
+    if (${CMD} STREQUAL "EXT")
+        string (REGEX MATCHALL "\\.[^.]*" PARTS "${${VAR}}")
+        list (LENGTH PARTS LEN)
+        if (LEN GREATER 1)
+            math (EXPR LEN "${LEN} - 1")
+            list (GET PARTS ${LEN} ${VAR})
+        endif ()
+    endif ()
+    set (${VAR} "${${VAR}}" PARENT_SCOPE)
+endfunction ()
diff --git a/cmake/generic/modules/GlobDirectories.cmake b/cmake/generic/modules/GlobDirectories.cmake
new file mode 100644
index 0000000..cdf3381
--- /dev/null
+++ b/cmake/generic/modules/GlobDirectories.cmake
@@ -0,0 +1,10 @@
+MACRO(GLOB_DIRECTORIES result)
+    FILE(GLOB children RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *)
+    SET(dirlist "")
+    FOREACH(child ${children})
+        IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${child})
+            LIST(APPEND dirlist ${child})
+        ENDIF()
+    ENDFOREACH()
+    SET(${result} ${dirlist})
+ENDMACRO()
diff --git a/cmake/generic/modules/PreventInSourceBuilds.cmake b/cmake/generic/modules/PreventInSourceBuilds.cmake
new file mode 100644
index 0000000..48ff010
--- /dev/null
+++ b/cmake/generic/modules/PreventInSourceBuilds.cmake
@@ -0,0 +1,20 @@
+# - Prevent in-source builds.
+
+function(prevent_in_source_builds)
+  # make sure the user doesn't play dirty with symlinks
+  get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH)
+  get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH)
+
+  # disallow in-source builds
+  if("${srcdir}" STREQUAL "${bindir}")
+    message(FATAL_ERROR "\
+
+CMake must not to be run in the source directory. \
+Rather create a dedicated build directory and run CMake there. \
+To clean up after this aborted in-place compilation:
+  rm -r CMakeCache.txt CMakeFiles
+")
+  endif()
+endfunction()
+
+prevent_in_source_builds()
diff --git a/cmake/generic/modules/UseLATEX.cmake b/cmake/generic/modules/UseLATEX.cmake
new file mode 100644
index 0000000..8905a8b
--- /dev/null
+++ b/cmake/generic/modules/UseLATEX.cmake
@@ -0,0 +1,1393 @@
+# File: UseLATEX.cmake
+# CMAKE commands to actually use the LaTeX compiler
+# Version: 1.10.5
+# Author: Kenneth Moreland <kmorel at sandia.gov>
+#
+# Copyright 2004 Sandia Corporation.
+# Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
+# license for use of this work by or on behalf of the
+# U.S. Government. Redistribution and use in source and binary forms, with
+# or without modification, are permitted provided that this Notice and any
+# statement of authorship are reproduced on all copies.
+#
+# The following function is defined:
+#
+# ADD_LATEX_DOCUMENT(<tex_file>
+#                    [BIBFILES <bib_files>]
+#                    [INPUTS <input_tex_files>]
+#                    [IMAGE_DIRS] <image_directories>
+#                    [IMAGES] <image_files>
+#                    [CONFIGURE] <tex_files>
+#                    [DEPENDS] <tex_files>
+#                    [MULTIBIB_NEWCITES] <suffix_list>
+#                    [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]
+#                    [DEFAULT_PDF] [DEFAULT_SAFEPDF] [DEFAULT_PS] [NO_DEFAULT]
+#                    [MANGLE_TARGET_NAMES])
+#       Adds targets that compile <tex_file>.  The latex output is placed
+#       in LATEX_OUTPUT_PATH or CMAKE_CURRENT_BINARY_DIR if the former is
+#       not set.  The latex program is picky about where files are located,
+#       so all input files are copied from the source directory to the
+#       output directory.  This includes the target tex file, any tex file
+#       listed with the INPUTS option, the bibliography files listed with
+#       the BIBFILES option, and any .cls, .bst, and .clo files found in
+#       the current source directory.  Images found in the IMAGE_DIRS
+#       directories or listed by IMAGES are also copied to the output
+#       directory and coverted to an appropriate format if necessary.  Any
+#       tex files also listed with the CONFIGURE option are also processed
+#       with the CMake CONFIGURE_FILE command (with the @ONLY flag).  Any
+#       file listed in CONFIGURE but not the target tex file or listed with
+#       INPUTS has no effect. DEPENDS can be used to specify generated files
+#       that are needed to compile the latex target.
+#
+#       The following targets are made:
+#               dvi: Makes <name>.dvi
+#               pdf: Makes <name>.pdf using pdflatex.
+#               safepdf: Makes <name>.pdf using ps2pdf.  If using the default
+#                       program arguments, this will ensure all fonts are
+#                       embedded and no lossy compression has been performed
+#                       on images.
+#               ps: Makes <name>.ps
+#               html: Makes <name>.html
+#               auxclean: Deletes <name>.aux and other auxiliary files.
+#                       This is sometimes necessary if a LaTeX error occurs
+#                       and writes a bad aux file.  Unlike the regular clean
+#                       target, it does not delete other input files, such as
+#                       converted images, to save time on the rebuild.
+#
+#       The dvi target is added to the ALL.  That is, it will be the target
+#       built by default.  If the DEFAULT_PDF argument is given, then the
+#       pdf target will be the default instead of dvi.  Likewise,
+#       DEFAULT_SAFEPDF sets the default target to safepdf.  If NO_DEFAULT
+#       is specified, then no target will be added to ALL, which is
+#       convenient when including LaTeX documentation with something else.
+#
+#       If the argument MANGLE_TARGET_NAMES is given, then each of the
+#       target names above will be mangled with the <tex_file> name.  This
+#       is to make the targets unique if ADD_LATEX_DOCUMENT is called for
+#       multiple documents.  If the argument USE_INDEX is given, then
+#       commands to build an index are made.  If the argument USE_GLOSSARY
+#       is given, then commands to build a glossary are made.  If the
+#       argument MULTIBIB_NEWCITES is given, then additional bibtex calls
+#       are added to the build to support the extra auxiliary files created
+#       with the \newcite command in the multibib package.
+#
+# History:
+#
+# 1.10.5 Fix for Window's convert check (thanks to Martin Baute).
+#
+# 1.10.4 Copy font files to binary directory for packages that come with
+#       their own fonts.
+#
+# 1.10.3 Check for Windows version of convert being used instead of
+#       ImageMagick's version (thanks to Martin Baute).
+#
+# 1.10.2 Use htlatex as a fallback when latex2html is not available (thanks
+#       to Tomasz Grzegurzko).
+#
+# 1.10.1 Make convert program mandatory only if actually used (thanks to
+#       Julien Schueller).
+#
+# 1.10.0 Added NO_DEFAULT and DEFAULT_PS options.
+#       Fixed issue with cleaning files for LaTeX documents originating in
+#       a subdirectory.
+#
+# 1.9.6 Fixed problem with LATEX_SMALL_IMAGES.
+#       Strengthened check to make sure the output directory does not contain
+#       the source files.
+#
+# 1.9.5 Add support for image types not directly supported by either latex
+#       or pdflatex.  (Thanks to Jorge Gerardo Pena Pastor for SVG support.)
+#
+# 1.9.4 Fix issues with filenames containing multiple periods.
+#
+# 1.9.3 Hide some variables that are now cached but should not show up in
+#       the ccmake list of variables.
+#
+# 1.9.2 Changed MACRO declarations to FUNCTION declarations.  The better
+#       FUNCTION scoping will hopefully avoid some common but subtle bugs.
+#       This implicitly increases the minimum CMake version to 4.6 (although
+#       I honestly only test it with the latest 4.8 version).
+#
+#       Since we are updating the minimum CMake version, I'm going to start
+#       using the builtin LIST commands that are now available.
+#
+#       Favor using pdftops from the Poppler package to convert from pdf to
+#       eps.  It does a much better job than ImageMagick or ghostscript.
+#
+# 1.9.1 Fixed typo that caused the LATEX_SMALL_IMAGES option to fail to
+#       activate.
+#
+# 1.9.0 Add support for the multibib package (thanks to Antonio LaTorre).
+#
+# 1.8.2 Fix corner case when an argument name was also a variable containing
+#       the text of an argument.  In this case, the CMake IF was matching
+#       the argument text with the contents of the variable with the same
+#       argument name.
+#
+# 1.8.1 Fix problem where ps2pdf was not getting the appropriate arguments.
+#
+# 1.8.0 Add support for synctex.
+#
+# 1.7.7 Support calling xindy when making glossaries.
+#
+#       Improved make clean support.
+#
+# 1.7.6 Add support for the nomencl package (thanks to Myles English).
+#
+# 1.7.5 Fix issue with bibfiles being copied two different ways, which causes
+#       Problems with dependencies (thanks to Edwin van Leeuwen).
+#
+# 1.7.4 Added the DEFAULT_SAFEPDF option (thanks to Raymond Wan).
+#
+#       Added warnings when image directories are not found (and were
+#       probably not given relative to the source directory).
+#
+# 1.7.3 Fix some issues with interactions between makeglossaries and bibtex
+#       (thanks to Mark de Wever).
+#
+# 1.7.2 Use ps2pdf to convert eps to pdf to get around the problem with
+#       ImageMagick dropping the bounding box (thanks to Lukasz Lis).
+#
+# 1.7.1 Fixed some dependency issues.
+#
+# 1.7.0 Added DEPENDS options (thanks to Theodore Papadopoulo).
+#
+# 1.6.1 Ported the makeglossaries command to CMake and embedded the port
+#       into UseLATEX.cmake.
+#
+# 1.6.0 Allow the use of the makeglossaries command.  Thanks to Oystein
+#       S. Haaland for the patch.
+#
+# 1.5.0 Allow any type of file in the INPUTS lists, not just tex file
+#       (suggested by Eric Noulard).  As a consequence, the ability to
+#       specify tex files without the .tex extension is removed.  The removed
+#       function is of dubious value anyway.
+#
+#       When copying input files, skip over any file that exists in the
+#       binary directory but does not exist in the source directory with the
+#       assumption that these files were added by some other mechanism.  I
+#       find this useful when creating large documents with multiple
+#       chapters that I want to build separately (for speed) as I work on
+#       them.  I use the same boilerplate as the starting point for all
+#       and just copy it with different configurations.  This was what the
+#       separate ADD_LATEX_DOCUMENT method was supposed to originally be for.
+#       Since its external use is pretty much deprecated, I removed that
+#       documentation.
+#
+# 1.4.1 Copy .sty files along with the other class and package files.
+#
+# 1.4.0 Added a MANGLE_TARGET_NAMES option that will mangle the target names.
+#
+#       Fixed problem with copying bib files that became apparent with
+#       CMake 2.4.
+#
+# 1.3.0 Added a LATEX_OUTPUT_PATH variable that allows you or the user to
+#       specify where the built latex documents to go.  This is especially
+#       handy if you want to do in-source builds.
+#
+#       Removed the ADD_LATEX_IMAGES macro and absorbed the functionality
+#       into ADD_LATEX_DOCUMENT.  The old interface was always kind of
+#       clunky anyway since you had to specify the image directory in both
+#       places.  It also made supporting LATEX_OUTPUT_PATH problematic.
+#
+#       Added support for jpeg files.
+#
+# 1.2.0 Changed the configuration options yet again.  Removed the NO_CONFIGURE
+#       Replaced it with a CONFIGURE option that lists input files for which
+#       configure should be run.
+#
+#       The pdf target no longer depends on the dvi target.  This allows you
+#       to build latex documents that require pdflatex.  Also added an option
+#       to make the pdf target the default one.
+#
+# 1.1.1 Added the NO_CONFIGURE option.  The @ character can be used when
+#       specifying table column separators.  If two or more are used, then
+#       will incorrectly substitute them.
+#
+# 1.1.0 Added ability include multiple bib files.  Added ability to do copy
+#       sub-tex files for multipart tex files.
+#
+# 1.0.0 If both ps and pdf type images exist, just copy the one that
+#       matches the current render mode.  Replaced a bunch of STRING
+#       commands with GET_FILENAME_COMPONENT commands that were made to do
+#       the desired function.
+#
+# 0.4.0 First version posted to CMake Wiki.
+#
+
+#############################################################################
+# Find the location of myself while originally executing.  If you do this
+# inside of a macro, it will recode where the macro was invoked.
+#############################################################################
+SET(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE}
+  CACHE INTERNAL "Location of UseLATEX.cmake file." FORCE
+  )
+
+#############################################################################
+# Generic helper functions
+#############################################################################
+
+FUNCTION(LATEX_LIST_CONTAINS var value)
+  SET(input_list ${ARGN})
+  LIST(FIND input_list "${value}" index)
+  IF (index GREATER -1)
+    SET(${var} TRUE PARENT_SCOPE)
+  ELSE (index GREATER -1)
+    SET(${var} PARENT_SCOPE)
+  ENDIF (index GREATER -1)
+ENDFUNCTION(LATEX_LIST_CONTAINS)
+
+# Parse function arguments.  Variables containing the results are placed
+# in the global scope for historical reasons.
+FUNCTION(LATEX_PARSE_ARGUMENTS prefix arg_names option_names)
+  SET(DEFAULT_ARGS)
+  FOREACH(arg_name ${arg_names})
+    SET(${prefix}_${arg_name} CACHE INTERNAL "${prefix} argument" FORCE)
+  ENDFOREACH(arg_name)
+  FOREACH(option ${option_names})
+    SET(${prefix}_${option} CACHE INTERNAL "${prefix} option" FORCE)
+  ENDFOREACH(option)
+
+  SET(current_arg_name DEFAULT_ARGS)
+  SET(current_arg_list)
+  FOREACH(arg ${ARGN})
+    LATEX_LIST_CONTAINS(is_arg_name ${arg} ${arg_names})
+    LATEX_LIST_CONTAINS(is_option ${arg} ${option_names})
+    IF (is_arg_name)
+      SET(${prefix}_${current_arg_name} ${current_arg_list}
+        CACHE INTERNAL "${prefix} argument" FORCE)
+      SET(current_arg_name ${arg})
+      SET(current_arg_list)
+    ELSEIF (is_option)
+      SET(${prefix}_${arg} TRUE CACHE INTERNAL "${prefix} option" FORCE)
+    ELSE (is_arg_name)
+      SET(current_arg_list ${current_arg_list} ${arg})
+    ENDIF (is_arg_name)
+  ENDFOREACH(arg)
+  SET(${prefix}_${current_arg_name} ${current_arg_list}
+    CACHE INTERNAL "${prefix} argument" FORCE)
+ENDFUNCTION(LATEX_PARSE_ARGUMENTS)
+
+# Match the contents of a file to a regular expression.
+FUNCTION(LATEX_FILE_MATCH variable filename regexp default)
+  # The FILE STRINGS command would be a bit better, but I'm not totally sure
+  # the match will always be to a whole line, and I don't want to break things.
+  FILE(READ ${filename} file_contents)
+  STRING(REGEX MATCHALL "${regexp}"
+    match_result ${file_contents}
+    )
+  IF (match_result)
+    SET(${variable} "${match_result}" PARENT_SCOPE)
+  ELSE (match_result)
+    SET(${variable} "${default}" PARENT_SCOPE)
+  ENDIF (match_result)
+ENDFUNCTION(LATEX_FILE_MATCH)
+
+# A version of GET_FILENAME_COMPONENT that treats extensions after the last
+# period rather than the first.  To the best of my knowledge, all filenames
+# typically used by LaTeX, including image files, have small extensions
+# after the last dot.
+FUNCTION(LATEX_GET_FILENAME_COMPONENT varname filename type)
+  SET(result)
+  IF ("${type}" STREQUAL "NAME_WE")
+    GET_FILENAME_COMPONENT(name ${filename} NAME)
+    STRING(REGEX REPLACE "\\.[^.]*\$" "" result "${name}")
+  ELSEIF ("${type}" STREQUAL "EXT")
+    GET_FILENAME_COMPONENT(name ${filename} NAME)
+    STRING(REGEX MATCH "\\.[^.]*\$" result "${name}")
+  ELSE ("${type}" STREQUAL "NAME_WE")
+    GET_FILENAME_COMPONENT(result ${filename} ${type})
+  ENDIF ("${type}" STREQUAL "NAME_WE")
+  SET(${varname} "${result}" PARENT_SCOPE)
+ENDFUNCTION(LATEX_GET_FILENAME_COMPONENT)
+
+#############################################################################
+# Functions that perform processing during a LaTeX build.
+#############################################################################
+FUNCTION(LATEX_MAKEGLOSSARIES)
+  # This is really a bare bones port of the makeglossaries perl script into
+  # CMake scripting.
+  MESSAGE("**************************** In makeglossaries")
+  IF (NOT LATEX_TARGET)
+    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
+  ENDIF (NOT LATEX_TARGET)
+
+  SET(aux_file ${LATEX_TARGET}.aux)
+
+  IF (NOT EXISTS ${aux_file})
+    MESSAGE(SEND_ERROR "${aux_file} does not exist.  Run latex on your target file.")
+  ENDIF (NOT EXISTS ${aux_file})
+
+  LATEX_FILE_MATCH(newglossary_lines ${aux_file}
+    "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+    "@newglossary{main}{glg}{gls}{glo}"
+    )
+
+  LATEX_FILE_MATCH(istfile_line ${aux_file}
+    "@istfilename[ \t]*{([^}]*)}"
+    "@istfilename{${LATEX_TARGET}.ist}"
+    )
+  STRING(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1"
+    istfile ${istfile_line}
+    )
+
+  STRING(REGEX MATCH ".*\\.xdy" use_xindy "${istfile}")
+  IF (use_xindy)
+    MESSAGE("*************** Using xindy")
+    IF (NOT XINDY_COMPILER)
+      MESSAGE(SEND_ERROR "Need to define XINDY_COMPILER")
+    ENDIF (NOT XINDY_COMPILER)
+  ELSE (use_xindy)
+    MESSAGE("*************** Using makeindex")
+    IF (NOT MAKEINDEX_COMPILER)
+      MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
+    ENDIF (NOT MAKEINDEX_COMPILER)
+  ENDIF (use_xindy)
+
+  FOREACH(newglossary ${newglossary_lines})
+    STRING(REGEX REPLACE
+      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+      "\\1" glossary_name ${newglossary}
+      )
+    STRING(REGEX REPLACE
+      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+      "${LATEX_TARGET}.\\2" glossary_log ${newglossary}
+      )
+    STRING(REGEX REPLACE
+      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+      "${LATEX_TARGET}.\\3" glossary_out ${newglossary}
+      )
+    STRING(REGEX REPLACE
+      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
+      "${LATEX_TARGET}.\\4" glossary_in ${newglossary}
+      )
+
+    IF (use_xindy)
+      LATEX_FILE_MATCH(xdylanguage_line ${aux_file}
+        "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}"
+        "@xdylanguage{${glossary_name}}{english}"
+        )
+      STRING(REGEX REPLACE
+        "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}"
+        "\\1"
+        language
+        ${xdylanguage_line}
+        )
+      # What crazy person makes a LaTeX index generater that uses different
+      # identifiers for language than babel (or at least does not support
+      # the old ones)?
+      IF (${language} STREQUAL "frenchb")
+        SET(language "french")
+      ELSEIF (${language} MATCHES "^n?germanb?$")
+        SET(language "german")
+      ELSEIF (${language} STREQUAL "magyar")
+        SET(language "hungarian")
+      ELSEIF (${language} STREQUAL "lsorbian")
+        SET(language "lower-sorbian")
+      ELSEIF (${language} STREQUAL "norsk")
+        SET(language "norwegian")
+      ELSEIF (${language} STREQUAL "portuges")
+        SET(language "portuguese")
+      ELSEIF (${language} STREQUAL "russianb")
+        SET(language "russian")
+      ELSEIF (${language} STREQUAL "slovene")
+        SET(language "slovenian")
+      ELSEIF (${language} STREQUAL "ukraineb")
+        SET(language "ukrainian")
+      ELSEIF (${language} STREQUAL "usorbian")
+        SET(language "upper-sorbian")
+      ENDIF (${language} STREQUAL "frenchb")
+      IF (language)
+        SET(language_flags "-L ${language}")
+      ELSE (language)
+        SET(language_flags "")
+      ENDIF (language)
+
+      LATEX_FILE_MATCH(codepage_line ${aux_file}
+        "@gls at codepage[ \t]*{${glossary_name}}{([^}]*)}"
+        "@gls at codepage{${glossary_name}}{utf}"
+        )
+      STRING(REGEX REPLACE
+        "@gls at codepage[ \t]*{${glossary_name}}{([^}]*)}"
+        "\\1"
+        codepage
+        ${codepage_line}
+        )
+      IF (codepage)
+        SET(codepage_flags "-C ${codepage}")
+      ELSE (codepage)
+        # Ideally, we would check that the language is compatible with the
+        # default codepage, but I'm hoping that distributions will be smart
+        # enough to specify their own codepage.  I know, it's asking a lot.
+        SET(codepage_flags "")
+      ENDIF (codepage)
+
+      MESSAGE("${XINDY_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} ${language_flags} ${codepage_flags} -I xindy -M ${glossary_name} -t ${glossary_log} -o ${glossary_out} ${glossary_in}"
+        )
+      EXEC_PROGRAM(${XINDY_COMPILER}
+        ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
+          ${language_flags}
+          ${codepage_flags}
+          -I xindy
+          -M ${glossary_name}
+          -t ${glossary_log}
+          -o ${glossary_out}
+          ${glossary_in}
+        OUTPUT_VARIABLE xindy_output
+        )
+      MESSAGE("${xindy_output}")
+
+      # So, it is possible (perhaps common?) for aux files to specify a
+      # language and codepage that are incompatible with each other.  Check
+      # for that condition, and if it happens run again with the default
+      # codepage.
+      IF ("${xindy_output}" MATCHES "^Cannot locate xindy module for language (.+) in codepage (.+)\\.$")
+        MESSAGE("*************** Retrying xindy with default codepage.")
+        EXEC_PROGRAM(${XINDY_COMPILER}
+          ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
+            ${language_flags}
+            -I xindy
+            -M ${glossary_name}
+            -t ${glossary_log}
+            -o ${glossary_out}
+            ${glossary_in}
+          )
+      ENDIF ("${xindy_output}" MATCHES "^Cannot locate xindy module for language (.+) in codepage (.+)\\.$")
+
+    ELSE (use_xindy)
+      MESSAGE("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}")
+      EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
+        -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}
+        )
+    ENDIF (use_xindy)
+
+  ENDFOREACH(newglossary)
+ENDFUNCTION(LATEX_MAKEGLOSSARIES)
+
+FUNCTION(LATEX_MAKENOMENCLATURE)
+  MESSAGE("**************************** In makenomenclature")
+  IF (NOT LATEX_TARGET)
+    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
+  ENDIF (NOT LATEX_TARGET)
+
+  IF (NOT MAKEINDEX_COMPILER)
+    MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
+  ENDIF (NOT MAKEINDEX_COMPILER)
+
+  SET(nomencl_out ${LATEX_TARGET}.nls)
+  SET(nomencl_in ${LATEX_TARGET}.nlo)
+
+  EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKENOMENCLATURE_COMPILER_FLAGS}
+    ${nomencl_in} -s "nomencl.ist" -o ${nomencl_out}
+    )
+ENDFUNCTION(LATEX_MAKENOMENCLATURE)
+
+FUNCTION(LATEX_CORRECT_SYNCTEX)
+  MESSAGE("**************************** In correct SyncTeX")
+  IF (NOT LATEX_TARGET)
+    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
+  ENDIF (NOT LATEX_TARGET)
+
+  IF (NOT GZIP)
+    MESSAGE(SEND_ERROR "Need to define GZIP")
+  ENDIF (NOT GZIP)
+
+  IF (NOT LATEX_SOURCE_DIRECTORY)
+    MESSAGE(SEND_ERROR "Need to define LATEX_SOURCE_DIRECTORY")
+  ENDIF (NOT LATEX_SOURCE_DIRECTORY)
+
+  IF (NOT LATEX_BINARY_DIRECTORY)
+    MESSAGE(SEND_ERROR "Need to define LATEX_BINARY_DIRECTORY")
+  ENDIF (NOT LATEX_BINARY_DIRECTORY)
+
+  SET(synctex_file ${LATEX_BINARY_DIRECTORY}/${LATEX_TARGET}.synctex)
+  SET(synctex_file_gz ${synctex_file}.gz)
+
+  IF (EXISTS ${synctex_file_gz})
+
+    MESSAGE("Making backup of synctex file.")
+    CONFIGURE_FILE(${synctex_file_gz} ${synctex_file}.bak.gz COPYONLY)
+
+    MESSAGE("Uncompressing synctex file.")
+    EXEC_PROGRAM(${GZIP}
+      ARGS --decompress ${synctex_file_gz}
+      )
+
+    MESSAGE("Reading synctex file.")
+    FILE(READ ${synctex_file} synctex_data)
+
+    MESSAGE("Replacing relative with absolute paths.")
+    STRING(REGEX REPLACE
+      "(Input:[0-9]+:)([^/\n][^\n]*)"
+      "\\1${LATEX_SOURCE_DIRECTORY}/\\2"
+      synctex_data
+      "${synctex_data}"
+      )
+
+    MESSAGE("Writing synctex file.")
+    FILE(WRITE ${synctex_file} "${synctex_data}")
+
+    MESSAGE("Compressing synctex file.")
+    EXEC_PROGRAM(${GZIP}
+      ARGS ${synctex_file}
+      )
+
+  ELSE (EXISTS ${synctex_file_gz})
+
+    MESSAGE(SEND_ERROR "File ${synctex_file_gz} not found.  Perhaps synctex is not supported by your LaTeX compiler.")
+
+  ENDIF (EXISTS ${synctex_file_gz})
+
+ENDFUNCTION(LATEX_CORRECT_SYNCTEX)
+
+#############################################################################
+# Helper functions for establishing LaTeX build.
+#############################################################################
+
+FUNCTION(LATEX_NEEDIT VAR NAME)
+  IF (NOT ${VAR})
+    MESSAGE(SEND_ERROR "I need the ${NAME} command.")
+  ENDIF(NOT ${VAR})
+ENDFUNCTION(LATEX_NEEDIT)
+
+FUNCTION(LATEX_WANTIT VAR NAME)
+  IF (NOT ${VAR})
+    MESSAGE(STATUS "I could not find the ${NAME} command.")
+  ENDIF(NOT ${VAR})
+ENDFUNCTION(LATEX_WANTIT)
+
+FUNCTION(LATEX_SETUP_VARIABLES)
+  SET(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}"
+    CACHE PATH "If non empty, specifies the location to place LaTeX output."
+    )
+
+  FIND_PACKAGE(LATEX)
+
+  FIND_PROGRAM(XINDY_COMPILER
+    NAME xindy
+    PATHS ${MIKTEX_BINARY_PATH} /usr/bin
+    )
+
+  FIND_PACKAGE(UnixCommands)
+
+  FIND_PROGRAM(PDFTOPS_CONVERTER
+    NAMES pdftops
+    DOC "The pdf to ps converter program from the Poppler package."
+    )
+
+  MARK_AS_ADVANCED(CLEAR
+    LATEX_COMPILER
+    PDFLATEX_COMPILER
+    BIBTEX_COMPILER
+    MAKEINDEX_COMPILER
+    XINDY_COMPILER
+    DVIPS_CONVERTER
+    PS2PDF_CONVERTER
+    PDFTOPS_CONVERTER
+    LATEX2HTML_CONVERTER
+    )
+
+  LATEX_NEEDIT(LATEX_COMPILER latex)
+  LATEX_WANTIT(PDFLATEX_COMPILER pdflatex)
+  LATEX_NEEDIT(BIBTEX_COMPILER bibtex)
+  LATEX_NEEDIT(MAKEINDEX_COMPILER makeindex)
+  LATEX_WANTIT(DVIPS_CONVERTER dvips)
+  LATEX_WANTIT(PS2PDF_CONVERTER ps2pdf)
+  LATEX_WANTIT(PDFTOPS_CONVERTER pdftops)
+  # MiKTeX calls latex2html htlatex
+  IF (NOT ${LATEX2HTML_CONVERTER})
+    FIND_PROGRAM(HTLATEX_CONVERTER
+      NAMES htlatex
+      PATHS ${MIKTEX_BINARY_PATH}
+            /usr/bin
+    )
+    IF (HTLATEX_CONVERTER)
+      SET(USING_HTLATEX TRUE CACHE INTERNAL "True when using MiKTeX htlatex instead of latex2html" FORCE)
+      SET(LATEX2HTML_CONVERTER ${HTLATEX_CONVERTER}
+        CACHE FILEPATH "htlatex taking the place of latex2html" FORCE)
+    ELSE (HTLATEX_CONVERTER)
+      SET(USING_HTLATEX FALSE CACHE INTERNAL "True when using MiKTeX htlatex instead of latex2html" FORCE)
+    ENDIF (HTLATEX_CONVERTER)
+  ENDIF (NOT ${LATEX2HTML_CONVERTER})
+  LATEX_WANTIT(LATEX2HTML_CONVERTER latex2html)
+
+  SET(LATEX_COMPILER_FLAGS "-interaction=nonstopmode"
+    CACHE STRING "Flags passed to latex.")
+  SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS}
+    CACHE STRING "Flags passed to pdflatex.")
+  SET(LATEX_SYNCTEX_FLAGS "-synctex=1"
+    CACHE STRING "latex/pdflatex flags used to create synctex file.")
+  SET(BIBTEX_COMPILER_FLAGS ""
+    CACHE STRING "Flags passed to bibtex.")
+  SET(MAKEINDEX_COMPILER_FLAGS ""
+    CACHE STRING "Flags passed to makeindex.")
+  SET(MAKEGLOSSARIES_COMPILER_FLAGS ""
+    CACHE STRING "Flags passed to makeglossaries.")
+  SET(MAKENOMENCLATURE_COMPILER_FLAGS ""
+    CACHE STRING "Flags passed to makenomenclature.")
+  SET(DVIPS_CONVERTER_FLAGS "-Ppdf -G0 -t letter"
+    CACHE STRING "Flags passed to dvips.")
+  SET(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode"
+    CACHE STRING "Flags passed to ps2pdf.")
+  SET(PDFTOPS_CONVERTER_FLAGS -r 600
+    CACHE STRING "Flags passed to pdftops.")
+  SET(LATEX2HTML_CONVERTER_FLAGS ""
+    CACHE STRING "Flags passed to latex2html.")
+  MARK_AS_ADVANCED(
+    LATEX_COMPILER_FLAGS
+    PDFLATEX_COMPILER_FLAGS
+    LATEX_SYNCTEX_FLAGS
+    BIBTEX_COMPILER_FLAGS
+    MAKEINDEX_COMPILER_FLAGS
+    MAKEGLOSSARIES_COMPILER_FLAGS
+    MAKENOMENCLATURE_COMPILER_FLAGS
+    DVIPS_CONVERTER_FLAGS
+    PS2PDF_CONVERTER_FLAGS
+    PDFTOPS_CONVERTER_FLAGS
+    LATEX2HTML_CONVERTER_FLAGS
+    )
+  SEPARATE_ARGUMENTS(LATEX_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(PDFLATEX_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(LATEX_SYNCTEX_FLAGS)
+  SEPARATE_ARGUMENTS(BIBTEX_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(MAKEINDEX_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(MAKEGLOSSARIES_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(MAKENOMENCLATURE_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(DVIPS_CONVERTER_FLAGS)
+  SEPARATE_ARGUMENTS(PS2PDF_CONVERTER_FLAGS)
+  SEPARATE_ARGUMENTS(PDFTOPS_CONVERTER_FLAGS)
+  SEPARATE_ARGUMENTS(LATEX2HTML_CONVERTER_FLAGS)
+
+  FIND_PROGRAM(IMAGEMAGICK_CONVERT convert
+    DOC "The convert program that comes with ImageMagick (available at http://www.imagemagick.org)."
+    )
+
+  OPTION(LATEX_USE_SYNCTEX
+    "If on, have LaTeX generate a synctex file, which WYSIWYG editors can use to correlate output files like dvi and pdf with the lines of LaTeX source that generates them.  In addition to adding the LATEX_SYNCTEX_FLAGS to the command line, this option also adds build commands that \"corrects\" the resulting synctex file to point to the original LaTeX files rather than those generated by UseLATEX.cmake."
+    OFF
+    )
+
+  OPTION(LATEX_SMALL_IMAGES
+    "If on, the raster images will be converted to 1/6 the original size.  This is because papers usually require 600 dpi images whereas most monitors only require at most 96 dpi.  Thus, smaller images make smaller files for web distributation and can make it faster to read dvi files."
+    OFF)
+  IF (LATEX_SMALL_IMAGES)
+    SET(LATEX_RASTER_SCALE 16 PARENT_SCOPE)
+    SET(LATEX_OPPOSITE_RASTER_SCALE 100 PARENT_SCOPE)
+  ELSE (LATEX_SMALL_IMAGES)
+    SET(LATEX_RASTER_SCALE 100 PARENT_SCOPE)
+    SET(LATEX_OPPOSITE_RASTER_SCALE 16 PARENT_SCOPE)
+  ENDIF (LATEX_SMALL_IMAGES)
+
+  # Just holds extensions for known image types.  They should all be lower case.
+  # For historical reasons, these are all declared in the global scope.
+  SET(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps CACHE INTERNAL "")
+  SET(LATEX_DVI_RASTER_IMAGE_EXTENSIONS CACHE INTERNAL "")
+  SET(LATEX_DVI_IMAGE_EXTENSIONS
+    ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS}
+    ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}
+    CACHE INTERNAL ""
+    )
+
+  SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf CACHE INTERNAL "")
+  SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg CACHE INTERNAL "")
+  SET(LATEX_PDF_IMAGE_EXTENSIONS
+    ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS}
+    ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}
+    CACHE INTERNAL ""
+    )
+
+  SET(LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS .svg CACHE INTERNAL "")
+  SET(LATEX_OTHER_RASTER_IMAGE_EXTENSIONS .tif .tiff .gif CACHE INTERNAL "")
+  SET(LATEX_OTHER_IMAGE_EXTENSIONS
+    ${LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS}
+    ${LATEX_OTHER_RASTER_IMAGE_EXTENSIONS}
+    CACHE INTERNAL ""
+    )
+
+  SET(LATEX_VECTOR_IMAGE_EXTENSIONS
+    ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS}
+    ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS}
+    ${LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS}
+    CACHE INTERNAL ""
+    )
+  SET(LATEX_RASTER_IMAGE_EXTENSIONS
+    ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}
+    ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}
+    ${LATEX_OTHER_RASTER_IMAGE_EXTENSIONS}
+    CACHE INTERNAL ""
+    )
+  SET(LATEX_IMAGE_EXTENSIONS
+    ${LATEX_DVI_IMAGE_EXTENSIONS}
+    ${LATEX_PDF_IMAGE_EXTENSIONS}
+    ${LATEX_OTHER_IMAGE_EXTENSIONS}
+    CACHE INTERNAL ""
+    )
+ENDFUNCTION(LATEX_SETUP_VARIABLES)
+
+FUNCTION(LATEX_GET_OUTPUT_PATH var)
+  SET(latex_output_path)
+  IF (LATEX_OUTPUT_PATH)
+    GET_FILENAME_COMPONENT(
+      LATEX_OUTPUT_PATH_FULL "${LATEX_OUTPUT_PATH}" ABSOLUTE
+      )
+    IF ("${LATEX_OUTPUT_PATH_FULL}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+      MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.")
+    ELSE ("${LATEX_OUTPUT_PATH_FULL}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+      SET(latex_output_path "${LATEX_OUTPUT_PATH_FULL}")
+    ENDIF ("${LATEX_OUTPUT_PATH_FULL}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+  ELSE (LATEX_OUTPUT_PATH)
+    IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+      MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.")
+    ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+      SET(latex_output_path "${CMAKE_CURRENT_BINARY_DIR}")
+    ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+  ENDIF (LATEX_OUTPUT_PATH)
+  SET(${var} ${latex_output_path} PARENT_SCOPE)
+ENDFUNCTION(LATEX_GET_OUTPUT_PATH)
+
+FUNCTION(LATEX_ADD_CONVERT_COMMAND
+    output_path
+    input_path
+    output_extension
+    input_extension
+    flags
+    )
+  SET (require_imagemagick_convert TRUE)
+  SET (convert_flags "")
+  IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
+    # ImageMagick has broken eps to pdf conversion
+    # use ps2pdf instead
+    IF (PS2PDF_CONVERTER)
+      SET (require_imagemagick_convert FALSE)
+      SET (converter ${PS2PDF_CONVERTER})
+      SET (convert_flags -dEPSCrop ${PS2PDF_CONVERTER_FLAGS})
+    ELSE (PS2PDF_CONVERTER)
+      MESSAGE(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.")
+    ENDIF (PS2PDF_CONVERTER)
+  ELSEIF (${input_extension} STREQUAL ".pdf" AND ${output_extension} STREQUAL ".eps")
+    # ImageMagick can also be sketchy on pdf to eps conversion.  Not good with
+    # color spaces and tends to unnecessarily rasterize.
+    # use pdftops instead
+    IF (PDFTOPS_CONVERTER)
+      SET (require_imagemagick_convert FALSE)
+      SET(converter ${PDFTOPS_CONVERTER})
+      SET(convert_flags -eps ${PDFTOPS_CONVERTER_FLAGS})
+    ELSE (PDFTOPS_CONVERTER)
+      MESSAGE(STATUS "Consider getting pdftops from Poppler to convert PDF images to EPS images.")
+      SET (convert_flags ${flags})
+    ENDIF (PDFTOPS_CONVERTER)
+  ELSE (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
+    SET (convert_flags ${flags})
+  ENDIF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
+
+  IF (require_imagemagick_convert)
+    IF (IMAGEMAGICK_CONVERT)
+      STRING(TOLOWER ${IMAGEMAGICK_CONVERT} IMAGEMAGICK_CONVERT_LOWERCASE)
+      IF (${IMAGEMAGICK_CONVERT_LOWERCASE} MATCHES "system32[/\\\\]convert\\.exe")
+        MESSAGE(SEND_ERROR "IMAGEMAGICK_CONVERT set to Window's convert.exe for changing file systems rather than ImageMagick's convert for changing image formats.  Please make sure ImageMagick is installed (available at http://www.imagemagick.org) and its convert program is used for IMAGEMAGICK_CONVERT.  (It is helpful if ImageMagick's path is before the Windows system paths.)")
+      ELSE (${IMAGEMAGICK_CONVERT_LOWERCASE} MATCHES "system32[/\\\\]convert\\.exe")
+        SET (converter ${IMAGEMAGICK_CONVERT})
+      ENDIF (${IMAGEMAGICK_CONVERT_LOWERCASE} MATCHES "system32[/\\\\]convert\\.exe")
+    ELSE (IMAGEMAGICK_CONVERT)
+      MESSAGE(SEND_ERROR "Could not find convert program. Please download ImageMagick from http://www.imagemagick.org and install.")
+    ENDIF (IMAGEMAGICK_CONVERT)
+  ENDIF (require_imagemagick_convert)
+
+  ADD_CUSTOM_COMMAND(OUTPUT ${output_path}
+    COMMAND ${converter}
+      ARGS ${convert_flags} ${input_path} ${output_path}
+    DEPENDS ${input_path}
+    )
+ENDFUNCTION(LATEX_ADD_CONVERT_COMMAND)
+
+# Makes custom commands to convert a file to a particular type.
+FUNCTION(LATEX_CONVERT_IMAGE
+    output_files_var
+    input_file
+    output_extension
+    convert_flags
+    output_extensions
+    other_files
+    )
+  SET(output_file_list)
+  SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR})
+  LATEX_GET_OUTPUT_PATH(output_dir)
+
+  LATEX_GET_FILENAME_COMPONENT(extension "${input_file}" EXT)
+
+  # Check input filename for potential problems with LaTeX.
+  LATEX_GET_FILENAME_COMPONENT(name "${input_file}" NAME_WE)
+  IF (name MATCHES ".*\\..*")
+    STRING(REPLACE "." "-" suggested_name "${name}")
+    SET(suggested_name "${suggested_name}${extension}")
+    MESSAGE(WARNING "Some LaTeX distributions have problems with image file names with multiple extensions.  Consider changing ${name}${extension} to something like ${suggested_name}.")
+  ENDIF (name MATCHES ".*\\..*")
+
+  STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file
+    "${input_file}")
+
+  LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions})
+  IF (is_type)
+    IF (convert_flags)
+      LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file}
+        ${input_dir}/${input_file} ${output_extension} ${extension}
+        "${convert_flags}")
+      SET(output_file_list ${output_file_list} ${output_dir}/${output_file})
+    ELSE (convert_flags)
+      # As a shortcut, we can just copy the file.
+      ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file}
+        COMMAND ${CMAKE_COMMAND}
+        ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file}
+        DEPENDS ${input_dir}/${input_file}
+        )
+      SET(output_file_list ${output_file_list} ${output_dir}/${input_file})
+    ENDIF (convert_flags)
+  ELSE (is_type)
+    SET(do_convert TRUE)
+    # Check to see if there is another input file of the appropriate type.
+    FOREACH(valid_extension ${output_extensions})
+      STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file
+        "${input_file}")
+      LATEX_LIST_CONTAINS(has_native_file "${try_file}" ${other_files})
+      IF (has_native_file)
+        SET(do_convert FALSE)
+      ENDIF (has_native_file)
+    ENDFOREACH(valid_extension)
+
+    # If we still need to convert, do it.
+    IF (do_convert)
+      LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file}
+        ${input_dir}/${input_file} ${output_extension} ${extension}
+        "${convert_flags}")
+      SET(output_file_list ${output_file_list} ${output_dir}/${output_file})
+    ENDIF (do_convert)
+  ENDIF (is_type)
+
+  SET(${output_files_var} ${output_file_list} PARENT_SCOPE)
+ENDFUNCTION(LATEX_CONVERT_IMAGE)
+
+# Adds custom commands to process the given files for dvi and pdf builds.
+# Adds the output files to the given variables (does not replace).
+FUNCTION(LATEX_PROCESS_IMAGES dvi_outputs_var pdf_outputs_var)
+  LATEX_GET_OUTPUT_PATH(output_dir)
+  SET(dvi_outputs)
+  SET(pdf_outputs)
+  FOREACH(file ${ARGN})
+    IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+      LATEX_GET_FILENAME_COMPONENT(extension "${file}" EXT)
+      SET(convert_flags)
+
+      # Check to see if we need to downsample the image.
+      LATEX_LIST_CONTAINS(is_raster "${extension}"
+        ${LATEX_RASTER_IMAGE_EXTENSIONS})
+      IF (LATEX_SMALL_IMAGES)
+        IF (is_raster)
+          SET(convert_flags -resize ${LATEX_RASTER_SCALE}%)
+        ENDIF (is_raster)
+      ENDIF (LATEX_SMALL_IMAGES)
+
+      # Make sure the output directory exists.
+      LATEX_GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH)
+      MAKE_DIRECTORY("${path}")
+
+      # Do conversions for dvi.
+      LATEX_CONVERT_IMAGE(output_files "${file}" .eps "${convert_flags}"
+        "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}")
+      SET(dvi_outputs ${dvi_outputs} ${output_files})
+
+      # Do conversions for pdf.
+      IF (is_raster)
+        LATEX_CONVERT_IMAGE(output_files "${file}" .png "${convert_flags}"
+          "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}")
+        SET(pdf_outputs ${pdf_outputs} ${output_files})
+      ELSE (is_raster)
+        LATEX_CONVERT_IMAGE(output_files "${file}" .pdf "${convert_flags}"
+          "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}")
+        SET(pdf_outputs ${pdf_outputs} ${output_files})
+      ENDIF (is_raster)
+    ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+      MESSAGE(WARNING "Could not find file ${CMAKE_CURRENT_SOURCE_DIR}/${file}.  Are you sure you gave relative paths to IMAGES?")
+    ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+  ENDFOREACH(file)
+
+  SET(${dvi_outputs_var} ${dvi_outputs} PARENT_SCOPE)
+  SET(${pdf_outputs_var} ${pdf_outputs} PARENT_SCOPE)
+ENDFUNCTION(LATEX_PROCESS_IMAGES)
+
+FUNCTION(ADD_LATEX_IMAGES)
+  MESSAGE(SEND_ERROR "The ADD_LATEX_IMAGES function is deprecated.  Image directories are specified with LATEX_ADD_DOCUMENT.")
+ENDFUNCTION(ADD_LATEX_IMAGES)
+
+FUNCTION(LATEX_COPY_GLOBBED_FILES pattern dest)
+  FILE(GLOB file_list ${pattern})
+  FOREACH(in_file ${file_list})
+    LATEX_GET_FILENAME_COMPONENT(out_file ${in_file} NAME)
+    CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY)
+  ENDFOREACH(in_file)
+ENDFUNCTION(LATEX_COPY_GLOBBED_FILES)
+
+FUNCTION(LATEX_COPY_INPUT_FILE file)
+  LATEX_GET_OUTPUT_PATH(output_dir)
+
+  IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
+    LATEX_GET_FILENAME_COMPONENT(path ${file} PATH)
+    FILE(MAKE_DIRECTORY ${output_dir}/${path})
+
+    LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE})
+    IF (use_config)
+      CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file}
+        ${output_dir}/${file}
+        @ONLY
+        )
+      ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file}
+        COMMAND ${CMAKE_COMMAND}
+        ARGS ${CMAKE_BINARY_DIR}
+        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
+        )
+    ELSE (use_config)
+      ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file}
+        COMMAND ${CMAKE_COMMAND}
+        ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file}
+        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
+        )
+    ENDIF (use_config)
+  ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
+    IF (EXISTS ${output_dir}/${file})
+      # Special case: output exists but input does not.  Assume that it was
+      # created elsewhere and skip the input file copy.
+    ELSE (EXISTS ${output_dir}/${file})
+      MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}")
+    ENDIF (EXISTS ${output_dir}/${file})
+  ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
+ENDFUNCTION(LATEX_COPY_INPUT_FILE)
+
+#############################################################################
+# Commands provided by the UseLATEX.cmake "package"
+#############################################################################
+
+FUNCTION(LATEX_USAGE command message)
+  MESSAGE(SEND_ERROR
+    "${message}\nUsage: ${command}(<tex_file>\n           [BIBFILES <bib_file> <bib_file> ...]\n           [INPUTS <tex_file> <tex_file> ...]\n           [IMAGE_DIRS <directory1> <directory2> ...]\n           [IMAGES <image_file1> <image_file2>\n           [CONFIGURE <tex_file> <tex_file> ...]\n           [DEPENDS <tex_file> <tex_file> ...]\n           [MULTIBIB_NEWCITES] <suffix_list>\n           [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]\n           [DEFAULT_PDF] [DEFAULT_SAFEPDF] [DEFAU [...]
+    )
+ENDFUNCTION(LATEX_USAGE command message)
+
+# Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the
+# variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and
+# LATEX_INPUTS.
+FUNCTION(PARSE_ADD_LATEX_ARGUMENTS command)
+  LATEX_PARSE_ARGUMENTS(
+    LATEX
+    "BIBFILES;MULTIBIB_NEWCITES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS"
+    "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;USE_NOMENCL;DEFAULT_PDF;DEFAULT_SAFEPDF;DEFAULT_PS;NO_DEFAULT;MANGLE_TARGET_NAMES"
+    ${ARGN}
+    )
+
+  # The first argument is the target latex file.
+  IF (LATEX_DEFAULT_ARGS)
+    LIST(GET LATEX_DEFAULT_ARGS 0 latex_main_input)
+    LIST(REMOVE_AT LATEX_DEFAULT_ARGS 0)
+    LATEX_GET_FILENAME_COMPONENT(latex_target ${latex_main_input} NAME_WE)
+    SET(LATEX_MAIN_INPUT ${latex_main_input} CACHE INTERNAL "" FORCE)
+    SET(LATEX_TARGET ${latex_target} CACHE INTERNAL "" FORCE)
+  ELSE (LATEX_DEFAULT_ARGS)
+    LATEX_USAGE(${command} "No tex file target given to ${command}.")
+  ENDIF (LATEX_DEFAULT_ARGS)
+
+  IF (LATEX_DEFAULT_ARGS)
+    LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}")
+  ENDIF (LATEX_DEFAULT_ARGS)
+
+  # Backward compatibility between 1.6.0 and 1.6.1.
+  IF (LATEX_USE_GLOSSARIES)
+    SET(LATEX_USE_GLOSSARY TRUE CACHE INTERNAL "" FORCE)
+  ENDIF (LATEX_USE_GLOSSARIES)
+ENDFUNCTION(PARSE_ADD_LATEX_ARGUMENTS)
+
+FUNCTION(ADD_LATEX_TARGETS_INTERNAL)
+  IF (LATEX_USE_SYNCTEX)
+    SET(synctex_flags ${LATEX_SYNCTEX_FLAGS})
+  ELSE (LATEX_USE_SYNCTEX)
+    SET(synctex_flags)
+  ENDIF (LATEX_USE_SYNCTEX)
+
+  # The commands to run LaTeX.  They are repeated multiple times.
+  SET(latex_build_command
+    ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${synctex_flags} ${LATEX_MAIN_INPUT}
+    )
+  SET(pdflatex_build_command
+    ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${synctex_flags} ${LATEX_MAIN_INPUT}
+    )
+
+  # Set up target names.
+  IF (LATEX_MANGLE_TARGET_NAMES)
+    SET(dvi_target      ${LATEX_TARGET}_dvi)
+    SET(pdf_target      ${LATEX_TARGET}_pdf)
+    SET(ps_target       ${LATEX_TARGET}_ps)
+    SET(safepdf_target  ${LATEX_TARGET}_safepdf)
+    SET(html_target     ${LATEX_TARGET}_html)
+    SET(auxclean_target ${LATEX_TARGET}_auxclean)
+  ELSE (LATEX_MANGLE_TARGET_NAMES)
+    SET(dvi_target      dvi)
+    SET(pdf_target      pdf)
+    SET(ps_target       ps)
+    SET(safepdf_target  safepdf)
+    SET(html_target     html)
+    SET(auxclean_target auxclean)
+  ENDIF (LATEX_MANGLE_TARGET_NAMES)
+
+  # Probably not all of these will be generated, but they could be.
+  # Note that the aux file is added later.
+  SET(auxiliary_clean_files
+    ${output_dir}/${LATEX_TARGET}.aux
+    ${output_dir}/${LATEX_TARGET}.bbl
+    ${output_dir}/${LATEX_TARGET}.blg
+    ${output_dir}/${LATEX_TARGET}-blx.bib
+    ${output_dir}/${LATEX_TARGET}.glg
+    ${output_dir}/${LATEX_TARGET}.glo
+    ${output_dir}/${LATEX_TARGET}.gls
+    ${output_dir}/${LATEX_TARGET}.idx
+    ${output_dir}/${LATEX_TARGET}.ilg
+    ${output_dir}/${LATEX_TARGET}.ind
+    ${output_dir}/${LATEX_TARGET}.ist
+    ${output_dir}/${LATEX_TARGET}.log
+    ${output_dir}/${LATEX_TARGET}.out
+    ${output_dir}/${LATEX_TARGET}.toc
+    ${output_dir}/${LATEX_TARGET}.lof
+    ${output_dir}/${LATEX_TARGET}.xdy
+    ${output_dir}/${LATEX_TARGET}.synctex.gz
+    ${output_dir}/${LATEX_TARGET}.synctex.bak.gz
+    ${output_dir}/${LATEX_TARGET}.dvi
+    ${output_dir}/${LATEX_TARGET}.ps
+    ${output_dir}/${LATEX_TARGET}.pdf
+    )
+
+  SET(image_list ${LATEX_IMAGES})
+
+  # For each directory in LATEX_IMAGE_DIRS, glob all the image files and
+  # place them in LATEX_IMAGES.
+  FOREACH(dir ${LATEX_IMAGE_DIRS})
+    IF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
+      MESSAGE(WARNING "Image directory ${CMAKE_CURRENT_SOURCE_DIR}/${dir} does not exist.  Are you sure you gave relative directories to IMAGE_DIRS?")
+    ENDIF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
+    FOREACH(extension ${LATEX_IMAGE_EXTENSIONS})
+      FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension})
+      FOREACH(file ${files})
+        LATEX_GET_FILENAME_COMPONENT(filename ${file} NAME)
+        SET(image_list ${image_list} ${dir}/${filename})
+      ENDFOREACH(file)
+    ENDFOREACH(extension)
+  ENDFOREACH(dir)
+
+  LATEX_PROCESS_IMAGES(dvi_images pdf_images ${image_list})
+
+  SET(make_dvi_command
+    ${CMAKE_COMMAND} -E chdir ${output_dir}
+    ${latex_build_command})
+  SET(make_pdf_command
+    ${CMAKE_COMMAND} -E chdir ${output_dir}
+    ${pdflatex_build_command}
+    )
+
+  SET(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images})
+  SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images})
+  FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS})
+    SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${input})
+    SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input})
+    IF (${input} MATCHES "\\.tex$")
+      # Dependent .tex files might have their own .aux files created.  Make
+      # sure these get cleaned as well.  This might replicate the cleaning
+      # of the main .aux file, which is OK.
+      STRING(REGEX REPLACE "\\.tex$" "" input_we ${input})
+      SET(auxiliary_clean_files ${auxiliary_clean_files}
+        ${output_dir}/${input_we}.aux
+        ${output_dir}/${input}.aux
+        )
+    ENDIF (${input} MATCHES "\\.tex$")
+  ENDFOREACH(input)
+
+  IF (LATEX_USE_GLOSSARY)
+    FOREACH(dummy 0 1)   # Repeat these commands twice.
+      SET(make_dvi_command ${make_dvi_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${CMAKE_COMMAND}
+        -D LATEX_BUILD_COMMAND=makeglossaries
+        -D LATEX_TARGET=${LATEX_TARGET}
+        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D XINDY_COMPILER=${XINDY_COMPILER}
+        -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
+        -P ${LATEX_USE_LATEX_LOCATION}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${latex_build_command}
+        )
+      SET(make_pdf_command ${make_pdf_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${CMAKE_COMMAND}
+        -D LATEX_BUILD_COMMAND=makeglossaries
+        -D LATEX_TARGET=${LATEX_TARGET}
+        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D XINDY_COMPILER=${XINDY_COMPILER}
+        -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
+        -P ${LATEX_USE_LATEX_LOCATION}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${pdflatex_build_command}
+        )
+    ENDFOREACH(dummy)
+  ENDIF (LATEX_USE_GLOSSARY)
+
+  IF (LATEX_USE_NOMENCL)
+    FOREACH(dummy 0 1)   # Repeat these commands twice.
+      SET(make_dvi_command ${make_dvi_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${CMAKE_COMMAND}
+        -D LATEX_BUILD_COMMAND=makenomenclature
+        -D LATEX_TARGET=${LATEX_TARGET}
+        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D MAKENOMENCLATURE_COMPILER_FLAGS=${MAKENOMENCLATURE_COMPILER_FLAGS}
+        -P ${LATEX_USE_LATEX_LOCATION}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${latex_build_command}
+        )
+      SET(make_pdf_command ${make_pdf_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${CMAKE_COMMAND}
+        -D LATEX_BUILD_COMMAND=makenomenclature
+        -D LATEX_TARGET=${LATEX_TARGET}
+        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D MAKENOMENCLATURE_COMPILER_FLAGS=${MAKENOMENCLATURE_COMPILER_FLAGS}
+        -P ${LATEX_USE_LATEX_LOCATION}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${pdflatex_build_command}
+        )
+    ENDFOREACH(dummy)
+  ENDIF (LATEX_USE_NOMENCL)
+
+  IF (LATEX_BIBFILES)
+    IF (LATEX_MULTIBIB_NEWCITES)
+      FOREACH (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES})
+        LATEX_GET_FILENAME_COMPONENT(multibib_target ${multibib_auxfile} NAME_WE)
+        SET(make_dvi_command ${make_dvi_command}
+          COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+          ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${multibib_target})
+        SET(make_pdf_command ${make_pdf_command}
+          COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+          ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${multibib_target})
+        SET(auxiliary_clean_files ${auxiliary_clean_files}
+          ${output_dir}/${multibib_target}.aux)
+      ENDFOREACH (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES})
+    ELSE (LATEX_MULTIBIB_NEWCITES)
+      SET(make_dvi_command ${make_dvi_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET})
+      SET(make_pdf_command ${make_pdf_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET})
+    ENDIF (LATEX_MULTIBIB_NEWCITES)
+
+    FOREACH (bibfile ${LATEX_BIBFILES})
+      SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${bibfile})
+      SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile})
+    ENDFOREACH (bibfile ${LATEX_BIBFILES})
+  ELSE (LATEX_BIBFILES)
+    IF (LATEX_MULTIBIB_NEWCITES)
+      MESSAGE(WARNING "MULTIBIB_NEWCITES has no effect without BIBFILES option.")
+    ENDIF (LATEX_MULTIBIB_NEWCITES)
+  ENDIF (LATEX_BIBFILES)
+
+  IF (LATEX_USE_INDEX)
+    SET(make_dvi_command ${make_dvi_command}
+      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+      ${latex_build_command}
+      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+      ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx)
+    SET(make_pdf_command ${make_pdf_command}
+      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+      ${pdflatex_build_command}
+      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+      ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx)
+  ENDIF (LATEX_USE_INDEX)
+
+  SET(make_dvi_command ${make_dvi_command}
+    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+    ${latex_build_command}
+    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+    ${latex_build_command})
+  SET(make_pdf_command ${make_pdf_command}
+    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+    ${pdflatex_build_command}
+    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+    ${pdflatex_build_command})
+
+  IF (LATEX_USE_SYNCTEX)
+    IF (NOT GZIP)
+      MESSAGE(SEND_ERROR "UseLATEX.cmake: USE_SYNTEX option requires gzip program.  Set GZIP variable.")
+    ENDIF (NOT GZIP)
+    SET(make_dvi_command ${make_dvi_command}
+      COMMAND ${CMAKE_COMMAND}
+      -D LATEX_BUILD_COMMAND=correct_synctex
+      -D LATEX_TARGET=${LATEX_TARGET}
+      -D GZIP=${GZIP}
+      -D "LATEX_SOURCE_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR}"
+      -D "LATEX_BINARY_DIRECTORY=${output_dir}"
+      -P ${LATEX_USE_LATEX_LOCATION}
+      )
+    SET(make_pdf_command ${make_pdf_command}
+      COMMAND ${CMAKE_COMMAND}
+      -D LATEX_BUILD_COMMAND=correct_synctex
+      -D LATEX_TARGET=${LATEX_TARGET}
+      -D GZIP=${GZIP}
+      -D "LATEX_SOURCE_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR}"
+      -D "LATEX_BINARY_DIRECTORY=${output_dir}"
+      -P ${LATEX_USE_LATEX_LOCATION}
+      )
+  ENDIF (LATEX_USE_SYNCTEX)
+
+  # Add commands and targets for building dvi outputs.
+  ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi
+    COMMAND ${make_dvi_command}
+    DEPENDS ${make_dvi_depends}
+    )
+  IF (LATEX_NO_DEFAULT OR LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF OR DEFAULT_PS)
+    ADD_CUSTOM_TARGET(${dvi_target}
+      DEPENDS ${output_dir}/${LATEX_TARGET}.dvi)
+  ELSE (LATEX_NO_DEFAULT OR LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF OR DEFAULT_PS)
+    ADD_CUSTOM_TARGET(${dvi_target} ALL
+      DEPENDS ${output_dir}/${LATEX_TARGET}.dvi)
+  ENDIF (LATEX_NO_DEFAULT OR LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF OR DEFAULT_PS)
+
+  # Add commands and targets for building pdf outputs (with pdflatex).
+  IF (PDFLATEX_COMPILER)
+    ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf
+      COMMAND ${make_pdf_command}
+      DEPENDS ${make_pdf_depends}
+      )
+    IF (LATEX_DEFAULT_PDF)
+      ADD_CUSTOM_TARGET(${pdf_target} ALL
+        DEPENDS ${output_dir}/${LATEX_TARGET}.pdf)
+    ELSE (LATEX_DEFAULT_PDF)
+      ADD_CUSTOM_TARGET(${pdf_target}
+        DEPENDS ${output_dir}/${LATEX_TARGET}.pdf)
+    ENDIF (LATEX_DEFAULT_PDF)
+  ENDIF (PDFLATEX_COMPILER)
+
+  IF (DVIPS_CONVERTER)
+    ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.ps
+      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_FLAGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi
+      DEPENDS ${output_dir}/${LATEX_TARGET}.dvi)
+    IF (LATEX_DEFAULT_PS)
+      ADD_CUSTOM_TARGET(${ps_target} ALL
+        DEPENDS ${output_dir}/${LATEX_TARGET}.ps)
+    ELSE (LATEX_DEFAULT_PS)
+      ADD_CUSTOM_TARGET(${ps_target}
+        DEPENDS ${output_dir}/${LATEX_TARGET}.ps)
+    ENDIF (LATEX_DEFAULT_PS)
+    IF (PS2PDF_CONVERTER)
+      # Since both the pdf and safepdf targets have the same output, we
+      # cannot properly do the dependencies for both.  When selecting safepdf,
+      # simply force a recompile every time.
+      IF (LATEX_DEFAULT_SAFEPDF)
+        ADD_CUSTOM_TARGET(${safepdf_target} ALL
+          ${CMAKE_COMMAND} -E chdir ${output_dir}
+          ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf
+          )
+      ELSE (LATEX_DEFAULT_SAFEPDF)
+        ADD_CUSTOM_TARGET(${safepdf_target}
+          ${CMAKE_COMMAND} -E chdir ${output_dir}
+          ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf
+          )
+      ENDIF (LATEX_DEFAULT_SAFEPDF)
+      ADD_DEPENDENCIES(${safepdf_target} ${ps_target})
+    ENDIF (PS2PDF_CONVERTER)
+  ENDIF (DVIPS_CONVERTER)
+
+  IF (LATEX2HTML_CONVERTER)
+    IF (USING_HTLATEX)
+      # htlatex places the output in a different location
+      SET (HTML_OUTPUT "${output_dir}/${LATEX_TARGET}.html")
+    ELSE (USING_HTLATEX)
+      SET (HTML_OUTPUT "${output_dir}/${LATEX_TARGET}/${LATEX_TARGET}.html")
+    ENDIF (USING_HTLATEX)
+    ADD_CUSTOM_COMMAND(OUTPUT ${HTML_OUTPUT}
+      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${LATEX2HTML_CONVERTER} ${LATEX2HTML_CONVERTER_FLAGS} ${LATEX_MAIN_INPUT}
+      DEPENDS ${output_dir}/${LATEX_TARGET}.tex
+      )
+    ADD_CUSTOM_TARGET(${html_target}
+      DEPENDS ${HTML_OUTPUT}
+      )
+    ADD_DEPENDENCIES(${html_target} ${dvi_target})
+  ENDIF (LATEX2HTML_CONVERTER)
+
+  SET_DIRECTORY_PROPERTIES(.
+    ADDITIONAL_MAKE_CLEAN_FILES "${auxiliary_clean_files}"
+    )
+
+  ADD_CUSTOM_TARGET(${auxclean_target}
+    COMMENT "Cleaning auxiliary LaTeX files."
+    COMMAND ${CMAKE_COMMAND} -E remove ${auxiliary_clean_files}
+    )
+ENDFUNCTION(ADD_LATEX_TARGETS_INTERNAL)
+
+FUNCTION(ADD_LATEX_TARGETS)
+  LATEX_GET_OUTPUT_PATH(output_dir)
+  PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV})
+
+  ADD_LATEX_TARGETS_INTERNAL()
+ENDFUNCTION(ADD_LATEX_TARGETS)
+
+FUNCTION(ADD_LATEX_DOCUMENT)
+  LATEX_GET_OUTPUT_PATH(output_dir)
+  IF (output_dir)
+    PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV})
+
+    LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT})
+
+    FOREACH (bib_file ${LATEX_BIBFILES})
+      LATEX_COPY_INPUT_FILE(${bib_file})
+    ENDFOREACH (bib_file)
+
+    FOREACH (input ${LATEX_INPUTS})
+      LATEX_COPY_INPUT_FILE(${input})
+    ENDFOREACH(input)
+
+    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir})
+    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir})
+    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir})
+    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir})
+    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.ist ${output_dir})
+    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.fd  ${output_dir})
+
+    ADD_LATEX_TARGETS_INTERNAL()
+  ENDIF (output_dir)
+ENDFUNCTION(ADD_LATEX_DOCUMENT)
+
+#############################################################################
+# Actually do stuff
+#############################################################################
+
+IF (LATEX_BUILD_COMMAND)
+  SET(command_handled)
+
+  IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries)
+    LATEX_MAKEGLOSSARIES()
+    SET(command_handled TRUE)
+  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries)
+
+  IF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature)
+    LATEX_MAKENOMENCLATURE()
+    SET(command_handled TRUE)
+  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature)
+
+  IF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex)
+    LATEX_CORRECT_SYNCTEX()
+    SET(command_handled TRUE)
+  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex)
+
+  IF (NOT command_handled)
+    MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}")
+  ENDIF (NOT command_handled)
+
+ELSE (LATEX_BUILD_COMMAND)
+  # Must be part of the actual configure (included from CMakeLists.txt).
+  LATEX_SETUP_VARIABLES()
+ENDIF (LATEX_BUILD_COMMAND)
diff --git a/dev-tools/README b/dev-tools/README
new file mode 100644
index 0000000..661dc5b
--- /dev/null
+++ b/dev-tools/README
@@ -0,0 +1,9 @@
+Collection of various tools for internal use during development.
+
+Directory content:
+ad-hoc          - developers' sandboxes
+git-utils       - number of lines of code
+log             - results of performance tests
+math            - code used to derive or/and to test math code
+profiling       - scripts to run code profiling using valgrind/gperftool
+user-api        - collection of tools to generate User API description
diff --git a/dev-tools/ad-hoc/JWu/bornplot2.py b/dev-tools/ad-hoc/JWu/bornplot2.py
new file mode 100644
index 0000000..070aabf
--- /dev/null
+++ b/dev-tools/ad-hoc/JWu/bornplot2.py
@@ -0,0 +1,167 @@
+"""
+Utilities to plot form factors of particles in Born approximation
+"""
+import numpy
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+import bornagain as ba
+from bornagain import nanometer, degree, angstrom, deg2rad
+
+
+class BinRange:
+    def __init__(self, vmin, vmax, n):
+        self.vmin = vmin
+        self.vmax = vmax
+        self.n = n
+
+    def origin_index(self):
+        return int((0.-self.vmin)/(self.vmax-self.vmin)*self.n)
+
+    def range(self):
+        return self.vmax - self.vmin
+
+
+class DetPars:
+    def __init__(self, bins_per_dimension, y_min, y_max, z_min, z_max):
+        self.y = BinRange(y_min, y_max, bins_per_dimension)
+        self.z = BinRange(z_min, z_max, bins_per_dimension)
+
+    def rectangle(self):
+        return self.y.vmin, self.y.vmax, self.z.vmin, self.z.vmax
+
+
+class Result:
+    def __init__(self, idx, data, title=""):
+        self.idx = idx
+        self.data = data
+        self.title = title
+
+
+def make_plot(results, detPars, name, nrow=1):
+    """Make a plot consisting of one detector image for each Result in results,
+    plus one common color scale.
+
+    :param results: List of simulation results
+    :param detPars: Detector limits
+    :param name: Filename for plot during save
+    :param nrow: Number of rows for different plots
+    """
+    mpl.rcParams['image.interpolation'] = 'none'
+    n = len(results)
+    ncol = 1+(n-1)//nrow
+    # Parameters as fraction of subfig size.
+    yskip = 0.2  # +ncol*0.02
+    bottomskip = yskip
+    topskip = yskip/2
+    xskip = 0.21
+    leftskip = xskip
+    rightskip = 0.28+ncol*0.03
+    xtot = ncol*1.0 + (ncol-1)*xskip + leftskip + rightskip
+    ytot = nrow*1.0 + (nrow-1)*yskip + bottomskip + topskip
+    # We need parameters as fraction of total fig size.
+    xskip /= xtot
+    leftskip /= xtot
+    rightskip /= xtot
+    yskip /= ytot
+    bottomskip /= ytot
+    topskip /= ytot
+    # Set total figure dimensions.
+    ftot = 5
+    fontsize = 18+36.0/(ncol+2)
+    # Create the figure 'fig' and its subplots axes ('tmp'->'axes').
+    fig, tmp = plt.subplots(nrow, ncol, figsize=(ftot*xtot, ftot*ytot))
+    if n > 1:
+        axes = tmp.flat
+    else:
+        axes = [tmp]
+    # Always the same color scale, to facilitate comparisons between figures.
+    norm = mpl.colors.LogNorm(1e-10, 1)
+    # Plot the subfigures.
+    for res in results:
+        ax = axes[res.idx]
+        im = ax.imshow(res.data,
+                       norm=norm,
+                       extent=detPars.rectangle(),
+                       aspect=1)
+        ax.set_xlabel(r'$k_y/k_x$', fontsize=fontsize)
+        if res.idx % ncol == 0:
+            ax.set_ylabel(r'$k_z/k_x$', fontsize=fontsize)
+        if res.title != "":
+            ax.set_title(res.title, fontsize=fontsize)
+        ax.tick_params(axis='both', which='major', labelsize=fontsize*21/24)
+    # Adjust whitespace around and between subfigures.
+    plt.subplots_adjust(wspace=xskip, hspace=yskip,
+                        left=leftskip, right=1-rightskip,
+                        bottom=bottomskip, top=1-topskip)
+    # Plot the color scale.
+    cbar_ax = fig.add_axes([1-rightskip+0.4*xskip, bottomskip,
+                            0.25*xskip, 1-bottomskip-topskip])
+    cb = fig.colorbar(im, cax=cbar_ax)
+    cb.set_label(r'$\left|F(q)\right|^2/V^{\,2}$', fontsize=fontsize)
+    # Output to file or display.
+    plt.savefig(name+".pdf", format="pdf", bbox_inches='tight')
+    plt.show()
+
+
+def get_sample(ff, trafo):
+    """Build and return a sample consisting of uncorrelated particles with given
+    form factor and transformation operator
+
+    :param ff: Form factor
+    :param trafo: Optional rotation
+    """
+    # defining materials
+    m_ambience = ba.HomogeneousMaterial("Air", 0.0, 0.0)
+    m_particle = ba.HomogeneousMaterial("Particle", 1e-5, 0)
+
+    # collection of particles
+    particle = ba.Particle(m_particle, ff)
+    particle_layout = ba.ParticleLayout()
+    if trafo is not None:
+        particle.setRotation(trafo)
+        particle_layout.addParticle(particle)
+    else:
+        particle_layout.addParticle(particle)
+
+    air_layer = ba.Layer(m_ambience)
+    air_layer.addLayout(particle_layout)
+
+    multi_layer = ba.MultiLayer()
+    multi_layer.addLayer(air_layer)
+    return multi_layer
+
+
+def get_simulation(detPars, ff, trafo=None):
+    """Create and return GISAXS simulation
+
+    :param detPars: Detector limits
+    :param sample
+    """
+    simulation = ba.GISASSimulation()
+    detector = ba.RectangularDetector(detPars.y.n, detPars.y.range(), detPars.z.n, detPars.z.range())
+    detector.setPerpendicularToSampleX(1., -detPars.y.vmin, -detPars.z.vmin)
+    simulation.setDetector(detector)
+    simulation.setBeamParameters(1.0*nanometer, 0, 0)
+    sample = get_sample(ff, trafo)
+    simulation.setSample(sample)
+    return simulation
+
+
+def run_sim(simulation, detPars):
+    """Run simulation and return plottable results
+    """
+    simulation.runSimulation()
+    data = simulation.getIntensityData().getArray()
+    nor = data[detPars.z.n - detPars.z.origin_index() - 1, detPars.y.origin_index()]
+    data /= nor
+    return data + 1e-80  # for log scale
+
+
+def run_simulation(detPars, ff, trafo=None):
+    """Create simulation, run it, and return plottable results
+
+    :param detPars: Detector limits
+    :param ff: Form factor
+    :param trafo: Optional rotation
+    """
+    return run_sim( get_simulation(detPars, tt, trafo), detPars )
diff --git a/dev-tools/ad-hoc/JWu/par_changed.py b/dev-tools/ad-hoc/JWu/par_changed.py
new file mode 100644
index 0000000..8287eef
--- /dev/null
+++ b/dev-tools/ad-hoc/JWu/par_changed.py
@@ -0,0 +1,35 @@
+"""
+Plot form factors.
+"""
+import bornagain as ba
+from   bornagain import nanometer, degree
+import bornplot2 as bp
+import math
+import inspect
+
+det = bp.DetPars( 400, -.25, .25, -.25, .25 )
+n    = 3
+results = []
+edge = 30
+
+title = 'E=30'
+trafo = ba.RotationY(26.5651*degree)
+ff = ba.FormFactorTruncatedCube(edge*nanometer,2*nanometer)
+sim = bp.get_simulation(det,ff,trafo)
+
+data = bp.run_sim( sim, det )
+results.append( bp.Result(0, data, title) )
+
+pool = ff.getParameterPool()
+print( pool.getParameterNames() )
+print( ff.getLength() )
+print( ff.getVolume() )
+pool.setParameterValue('Length', 10 )
+print( ff.getLength() )
+print( ff.getVolume() )
+
+title = 'E=10'
+data = bp.run_sim( sim, det )
+results.append( bp.Result(1, data, title) )
+
+bp.make_plot( results, det, "tmp" )
diff --git a/dev-tools/ad-hoc/JWu/partial_history.txt b/dev-tools/ad-hoc/JWu/partial_history.txt
new file mode 100644
index 0000000..7db891c
--- /dev/null
+++ b/dev-tools/ad-hoc/JWu/partial_history.txt
@@ -0,0 +1,44 @@
+# Release 1.2.0
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-06-30 15:16:12 | jcnsopc126 | linuxx8664gcc | 0  | 20.120   | 1.686        | 1.156        | 1.947        | 0.974        | 2.814        | 1.177        | 2.055        | 3.835        | 1.831        | 2.644        |
+| 2015-06-30 15:16:37 | jcnsopc126 | linuxx8664gcc | 0  | 20.044   | 1.678        | 1.176        | 2.018        | 0.979        | 2.829        | 1.202        | 2.069        | 3.835        | 1.823        | 2.436        |
+| 2015-06-30 15:17:36 | jcnsopc126 | linuxx8664gcc | 0  | 20.347   | 1.699        | 1.319        | 2.010        | 1.003        | 2.822        | 1.197        | 2.031        | 3.861        | 1.890        | 2.515        |
+| 2015-06-30 15:19:12 | jcnsopc126 | linuxx8664gcc | 0  | 19.853   | 1.684        | 1.156        | 1.951        | 0.979        | 2.815        | 1.187        | 2.026        | 3.798        | 1.832        | 2.426        |
+
+# Release 1.3.0
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-07-31 14:38:50 | jcnsopc63  | linuxx8664gcc | 0  | 15.590   | 1.537        | 0.977        | 1.673        | 0.855        | 2.524        | 0.996        | 1.874        | 1.505        | 1.581        | 2.068        |
+
+# after some development, why it is slower now not clear (there was minor OutputData refactoring
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-09-23 14:54:52 | jcnsopc126 | linuxx8664gcc | 0  | 17.658   | 1.692        | 1.148        | 1.602        | 0.983        | 2.793        | 1.174        | 2.163        | 1.742        | 1.868        | 2.495        |
+
+# after masking
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-09-28 17:19:17 | jcnsopc126 | linuxx8664gcc | 0  | 21.595   | 2.108        | 1.412        | 1.888        | 1.275        | 3.615        | 1.496        | 2.478        | 2.139        | 2.340        | 2.845 |
+
+# working on mask performance
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-09-29 11:41:26 | jcnsopc126 | linuxx8664gcc | 0  | 18.188   | 1.793        | 1.172        | 1.647        | 1.012        | 2.945        | 1.290        | 2.197        | 1.798        | 1.849        | 2.486 |
+| 2015-09-29 11:46:58 | jcnsopc126 | linuxx8664gcc | 0  | 17.975   | 1.852        | 1.165        | 1.586        | 0.977        | 2.834        | 1.183        | 2.136        | 1.860        | 1.879        | 2.502 |
+
+# after RectangularDetector refactoring
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-10-21 10:42:06 | jcnsopc126 | linuxx8664gcc | 0  | 19.284   | 1.781        | 1.333        | 1.785        | 1.133        | 3.145        | 1.404        | 2.156        | 1.847        | 1.884        | 2.818        |
+| 2015-10-21 10:42:30 | jcnsopc126 | linuxx8664gcc | 0  | 19.756   | 1.737        | 1.336        | 1.842        | 1.200        | 3.262        | 1.397        | 2.116        | 1.912        | 2.013        | 2.942|
+
+# PreRelease state. Seems that much worser. Simulation normalize?
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-10-28 17:04:26 | jcnsopc126 | linuxx8664gcc | 0  | 25.693   | 2.573        | 1.693        | 2.410        | 1.472        | 4.134        | 1.748        | 2.856        | 2.376        | 2.715        | 3.716|
+
+# PreRelease. Moved checkPolarizationPresent() out of the loop.
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-10-29 09:17:30 | jcnsopc126 | linuxx8664gcc | 0  | 20.586   | 2.386        | 1.166        | 1.773        | 0.890        | 3.449        | 1.195        | 2.570        | 1.687        | 2.452        | 3.020        |
+
+# PreRelease. If I try to backup mP_specular_info->getInCoefficients(alpha_i, 0.0, wavelength)); in InterferenceFunctionStrategy
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-10-29 09:41:25 | jcnsopc126 | linuxx8664gcc | 0  | 19.921   | 2.416        | 0.984        | 1.654        | 0.778        | 3.333        | 1.027        | 2.923        | 1.505        | 2.359        | 2.942        |
+
+# PreRelease-1.5.0
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2016-02-11 14:10:57 | jcnsopc126 | linuxx8664gcc | 0  | 18.247   | 1.981        | 0.920        | 1.418        | 0.696        | 2.578        | 0.950        | 3.899        | 1.381        | 2.008        | 2.417        |
diff --git a/dev-tools/ad-hoc/JWu/perf-log-old2yaml.py b/dev-tools/ad-hoc/JWu/perf-log-old2yaml.py
new file mode 100755
index 0000000..892ce94
--- /dev/null
+++ b/dev-tools/ad-hoc/JWu/perf-log-old2yaml.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python3
+
+'''
+To be used only once: convert performance log from legacy format to YAML
+'''
+
+import datetime, re, sys, pytz, yaml
+from collections import OrderedDict
+from pytz import timezone
+
+################################################################################
+# Improved YAML dumper, to write dicts and lists in nice form
+################################################################################
+
+class FlowSeq( list ): pass
+
+# The improved YAML dumper
+
+def improved_dump(data, stream=None, Dumper=yaml.Dumper, **kwds):
+    class ImprovedDumper(Dumper):
+        pass
+    def odict_representer(dumper, data):
+        return dumper.represent_mapping(
+            yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
+            data.items())
+    def flowseq_representer(dumper, data):
+        return dumper.represent_sequence(
+            yaml.resolver.BaseResolver.DEFAULT_SEQUENCE_TAG,
+            data,
+            flow_style=True )
+    ImprovedDumper.add_representer(OrderedDict, odict_representer)
+    ImprovedDumper.add_representer(FlowSeq, flowseq_representer)
+    return yaml.dump(data, stream, ImprovedDumper,
+                     allow_unicode=True, encoding='utf-8',
+                     default_flow_style=False, indent=4, width=70, **kwds)
+
+# Just for documentation, not used here: the corresponding loader.
+
+def improved_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict):
+    class ImprovedLoader(Loader):
+        pass
+    def construct_mapping(loader, node):
+        loader.flatten_mapping(node)
+        return object_pairs_hook(loader.construct_pairs(node))
+    ImprovedLoader.add_constructor(
+        yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
+        construct_mapping)
+    return yaml.load(stream, ImprovedLoader)
+
+################################################################################
+# Time conversion
+################################################################################
+
+garching = timezone('Europe/Berlin')
+def nice_datetime( dt ):
+    rounded = dt - datetime.timedelta(microseconds=dt.microsecond)
+    return garching.localize(rounded).isoformat()
+
+################################################################################
+# Standarized blocks
+################################################################################
+
+def coder(value, offset_coder, offset, precision):
+    ret = OrderedDict()
+    ret['value'] = value
+    ret['offset_coder'] = offset_coder
+    ret['offset'] = offset
+    ret['precision'] = precision
+    return ret
+
+def scan(j):
+    ret = OrderedDict()
+    ret['scan_parameters'] = OrderedDict()
+    ret['scan_parameters']['omgs'] = 0.1*j
+    ret['time'] = 2.02
+    ret['monitor'] = random.randint(10000, 40000)
+    ret['image'] = "img%04i" % j
+    return ret
+
+################################################################################
+# Main
+################################################################################
+
+o = []
+
+fni = 'partial_history.txt'
+fno = 'performance_log2.yaml'
+fd = open( fni, 'r' )
+ti = fd.read()
+fd.close()
+
+aa = re.split( r'\n\s*?\n', ti )
+for a in aa: # block
+    bb = re.split( r'\n', a.rstrip() )
+    m = re.match( r'#\s*(.*)', bb[0] )
+    if not m:
+        raise "block header not found"
+    comment = m.group(1)
+    # print("### "+comment[0:20]+" --> %i" %( len(bb)-2 ) )
+    header = re.split( r'\s*\|\s*', bb[1] )[1:-1]
+    if header[0]!="date":
+        raise "unexpected block header"
+    nentry = len(header)
+    outcome = []
+    for b in bb[2:]:
+        c = re.split( r'\s*\|\s*', b )[1:-1]
+        # print("'"+b+"'")
+        if len(c)!=len(header):
+            raise "wrong number of records"
+        result = OrderedDict()
+        for i in range(len(header)):
+            out = c[i]
+            if header[i]=="tr":
+                out = int(out)
+            elif i>3:
+                out = float(out)
+            result[header[i]] = out
+        outcome.append( result )
+    entry = OrderedDict()
+    entry['version'] = comment
+    entry['outcome'] = outcome
+    o.append( entry )
+
+yaml_str = improved_dump( o )
+fd = open( fno, 'wb' )
+fd.write( yaml_str )
+fd.close()
diff --git a/dev-tools/analyze/cl_lines_of_code.py b/dev-tools/analyze/cl_lines_of_code.py
new file mode 100755
index 0000000..4425030
--- /dev/null
+++ b/dev-tools/analyze/cl_lines_of_code.py
@@ -0,0 +1,344 @@
+#!/usr/bin/env python
+
+# calculate number of lines of code in BornAgain project as a function of time
+#
+# should be executed either from parent directory
+# "python Macros/GitUtils/git_loc_history.py"
+# or from local one
+# "python git_loc_history ../.."
+#
+# based on 'git-loc' from from https://github.com/ITikhonov/git-loc
+#
+# ROOT graphics added
+# see http://root.cern.ch/drupal/content/how-use-use-python-pyroot-interpreter
+# MG: I've modified this file to run it from command line in release.sh script
+
+import datetime, optparse, os, re, sys, time
+
+# ------------------------------------------------------------------------------
+# categorize files
+# ------------------------------------------------------------------------------
+
+descr=[
+    "non-source",
+    "auto",
+    "conf",
+    "core",
+    "futest",
+    "utest",
+    "GUI",
+    "examples",
+    "third-party",
+    "other C++",
+    "other Py",
+    "undef",
+]
+
+def filetype(x):
+    if  re.search( r'(dev-tools|build|qbuild|html)/', x ):
+        file_type = 0 # skip
+    elif( re.search( r'doxygen_\w+\.i', x ) or
+          re.search( r'lib\w+\.py', x ) or
+          re.search( r'lib\w+_wrap\.', x ) or
+          re.search( r'bornagain\.1$', x ) or
+          re.match( r'(Core|Fit)/PythonAPI', x ) ):
+        file_type = 1 # auto-generated
+    elif re.search( r'\w+\.(in|txt|cmake)$', x ):
+        file_type = 2 # configuration scripts
+    elif fileCpp(x) and dirCore(x):
+        file_type = 3 # core C++ code
+    elif (fileCpp(x) or filePython(x)) and dirFuncTest(x):
+        file_type = 4 # functional tests
+    elif fileCpp(x) and dirUnitTests(x):
+        file_type = 5 # unit tests
+    elif dirGUI(x):
+        file_type = 6 # GUI
+    elif re.match( r'Examples/', x ):
+        file_type = 7 # Examples
+    elif dirThirdParty(x):
+        file_type = 8 # other third-party code
+    elif fileCpp(x):
+        file_type = 9 # other C++ code
+    elif filePython(x):
+        file_type = 10 # other Py code
+    else:
+        file_type = 11 # unknown type
+    return file_type
+
+def filePython(x):
+    if ".py" in x and not ".pypp." in x: return True
+    return False
+
+def fileCpp(x):
+    if ".h" in x or ".cpp" in x: return True
+    return False
+
+def dirCore(x):
+    if "Core/Algorithms" in x: return True
+    if "Core/FormFactors" in x: return True
+    if "Core/Geometry" in x: return True
+    if "Core/InputOutput" in x: return True
+    if "Core/Samples" in x: return True
+    if "Core/StandardSamples" in x: return True
+    if "Core/Tools" in x: return True
+    if "Fit/Factory" in x: return True
+    if "Fit/FitKernel" in x: return True
+    if "Fit/StandardFits" in x: return True
+    # abolished directories:
+    if "GISASFW" in x: return True
+    if "Core/Fitting" in x: return True
+    if "Core/inc" in x: return True
+    if "Core/src" in x: return True
+    return False
+
+def dirFuncTest(x):
+    if "App/" in x: return True
+    if "Tests/FunctionalTests/TestCore" in x: return True
+    if "Tests/FunctionalTests/TestFit" in x: return True
+    if "Tests/FunctionalTests/TestPyCore" in x: return True
+    if "Tests/FunctionalTests/TestPyFit" in x: return True
+    return False
+
+def dirGUI(x):
+    if "GUI/coregui" in x  and not "widgetbox" in x and not "qttools" in x: return True
+    if "GUI/main" in x: return True
+    # abolished directories:
+    if "AppGUI/coregui" in x: return True
+    if "BASuite" in x: return True
+    return False
+
+def dirThirdParty(x):
+    if "ThirdParty" in x: return True
+    if "ROOT" in x: return True
+    if "GUI/externals" in x: return True
+    return False
+
+def dirSkip(x):
+    # abolished directories:
+    if "pub/core" in x: return True
+    return False
+
+def dirUnitTests(x):
+    if "Tests/UnitTests/TestCore/" in x: return True
+    if "Tests/UnitTests/TestFit/" in x: return True
+    # abolished directories:
+    if "UnitTests/" in x: return True
+    return False
+
+# ------------------------------------------------------------------------------
+#
+# ------------------------------------------------------------------------------
+
+def append_to_history():
+    if adds is None:
+        return
+    history.append((d,list(locs_type),adds,dels,hsh,who,cmt))
+
+def save_history_as_table(fname):
+    f = open(fname, 'w')
+    for entry in history:
+        d = entry[0]
+        tim = 2012 +  (d - datetime.datetime(2012,1,1)).total_seconds()/366.0/24/3600
+        f.write( "%9.4f" % ( tim ) )
+        for i in entry[1]:
+            f.write( " %6i" % ( i ) )
+        f.write( " # %s %s\n" % (entry[4], entry[6][0:28] ) )
+    f.close()
+    print( "Table with one line per commit written to "+fname )
+
+# ------------------------------------------------------------------------------
+# MAIN
+# ------------------------------------------------------------------------------
+usage = "usage: %prog [options]"
+parser = optparse.OptionParser(usage)
+parser.add_option('-o', '--output-filename', type="string", action="store", dest="outfname", help="Output plot file name.", default="lines_of_code.png")
+parser.add_option('-i', '--input-dir', type="string", action="store", dest="gitdir", help="Path to the .git folder.", default=".")
+(options, args) = parser.parse_args()
+
+fc=0
+locs_type=[0 for cat in descr]
+
+adds = None
+dels = None
+cmt = None
+hsh = None
+prev_time = datetime.datetime(2000,1,1)
+
+history=[]
+
+prevfolder = os.getcwd()
+os.chdir(options.gitdir)
+
+pos = -1
+for x in os.popen('git log develop --reverse --pretty=format:"A: %ae%nD: %ct%nS: %s%nH: %h%n" --numstat'):
+    x = x.rstrip(' \t\r\n')
+    if pos==-1 or pos==4:
+        m = re.match(r'A: (.+)@', x )
+        if m:
+            who = m.group(1)
+            if pos!=-1:
+                append_to_history()
+            pos = 0
+            adds=0
+            dels=0
+            continue
+
+    if pos==0:
+        m = re.match(r'D: (.+)$', x )
+        if m is None:
+            raise RuntimeError("D not found")
+        pos = 1
+        raw = m.group(1)
+        d = datetime.datetime.fromtimestamp(float(raw))
+        sys.stdout.write( str(d) )
+        sys.stdout.write( '\r' )
+        sys.stdout.flush()
+        # if( d.year!=2012 ): break # TEMPORARY, to accelerate development
+    elif pos==1:
+        m = re.match(r'S: (.+)$', x )
+        if m is None:
+            raise "S not found"
+        pos = 2
+        cmt = m.group(1)
+    elif pos==2:
+        m = re.match(r'H: (.+)$', x )
+        if m is None:
+            raise RuntimeError("H not found")
+        pos = 3
+        hsh = m.group(1)
+    elif pos==3:
+        if x!="":
+            raise RuntimeError("empty line not found")
+        pos = 4
+    else:
+        pos = 5
+        if x=="":
+            pos = 4
+            continue
+        m = re.match(r'-\s+-\s+(.+)$', x )
+        if m:
+            continue
+        m = re.match(r'(\d+)\s+(\d+)\s+(.+)$', x )
+        if m is None:
+            raise RuntimeError( "Unexpected record '"+x+"'" )
+        lines_inserted = int(m.group(1))
+        lines_deleted = int(m.group(2))
+        fnam = m.group(3)
+        ftyp = filetype(fnam)
+        locs_type[ftyp] += lines_inserted - lines_deleted
+append_to_history() # once more upon leaving the loop
+
+save_history_as_table("lines_of_code.tab")
+
+# clear progress line
+sys.stdout.write( '\r' )
+sys.stdout.flush()
+
+os.chdir(prevfolder)
+
+# --------------------------------------------------------
+# making ROOT plot - number of lines of code .vs. time
+# --------------------------------------------------------
+from ROOT import *
+
+# beginning of coding (first commit) to set beginning of time x-scale
+c=history[0]
+td_first=TDatime(c[0].year, c[0].month, c[0].day, c[0].hour, c[0].minute, c[0].second)
+c=history[-1]
+td_last=TDatime(c[0].year, c[0].month, c[0].day, c[0].hour, c[0].minute, c[0].second)
+time_offset = int(td_first.Convert()) - 7*24.*3600 # one week before first commit
+
+ntimebins = 4*int((td_last.Convert() - time_offset)/3600./24)
+
+#print "ntimebins", ntimebins
+hist_ncommits = TH1D("ncommits", "ncommits", ntimebins, td_first.Convert() - time_offset, td_last.Convert() - time_offset)
+
+# ---------------------------------
+# creating histograms
+# ---------------------------------
+selected_hist = [0,1,2,5,6]
+
+a_histograms = []
+hstack = THStack("hstack","Number of Lines of Code")
+hstack.SetTitle("");
+
+a_colors=[kAzure+1, kOrange, kRed, kGreen, kYellow-7, kAzure, kGray+1]
+legend = TLegend(0.15,0.65,0.49,0.84)
+legend.SetBorderSize(1);
+#legend.SetFillStyle(1);
+for i in range(0, len(selected_hist) ):
+    i_hist = selected_hist[i]
+    #hist = TH1D(descr[i_hist],descr[i_hist],len(xtmp)-1,xtmp)
+    hist = TH1D(descr[i_hist],descr[i_hist], ntimebins, td_first.Convert() - time_offset, td_last.Convert() - time_offset )
+
+    hist.GetXaxis().SetTimeDisplay(1)
+    hist.GetXaxis().SetTimeFormat("%d/%m")
+    hist.GetYaxis().SetLabelSize(0.030)
+    hist.GetXaxis().SetLabelSize(0.035)
+    hist.GetXaxis().SetNdivisions(512)
+    hist.GetXaxis().SetTimeOffset(time_offset)
+    hist.SetLineColor(a_colors[i_hist])
+    hist.SetFillColor(a_colors[i_hist])
+    a_histograms.append(hist)
+
+# adding histograms to legend in right order
+for i_hist in range(len(a_histograms)-1,-1,-1):
+    legend.AddEntry(a_histograms[i_hist],a_histograms[i_hist].GetTitle(),"f")
+
+# filling histograms
+for c in history:
+    td=TDatime(c[0].year, c[0].month, c[0].day, c[0].hour, c[0].minute, c[0].second)
+    xx = td.Convert() - time_offset
+    hist_ncommits.Fill(xx)
+    for i in range(0, len(selected_hist) ):
+        i_hist = selected_hist[i]
+        yy = c[2][i_hist]
+        a_histograms[i].Fill(xx,yy)
+
+# normalizing bin content on number of entries per bin
+for i_bin in range(1,hist_ncommits.GetNbinsX()+1):
+    nentries = hist_ncommits.GetBinContent(i_bin)
+    for h in a_histograms:
+        current_bin_content = h.GetBinContent(i_bin)
+        if nentries != 0: current_bin_content /= nentries
+        h.SetBinContent(i_bin, current_bin_content)
+
+# filling empty bins with values from previous day
+for h in a_histograms:
+    prev_content = 0
+    for i_bin in range(1,h.GetNbinsX()+1):
+        if h.GetBinContent(i_bin) == 0:
+            h.SetBinContent(i_bin, prev_content)
+        prev_content = h.GetBinContent(i_bin)
+
+#preparing canvas
+c1 = TCanvas( 'gisasfw_loc', 'Number of lines of code in BornAgain project', 800, 800)
+c1.cd()
+gPad.SetGrid()
+gPad.SetBottomMargin(0.10)
+gPad.SetLeftMargin(0.10)
+gPad.SetTopMargin(0.10)
+gPad.SetRightMargin(0.10)
+
+# drawing
+for h in a_histograms:
+    hstack.Add(h,"][")
+hstack.Draw()
+hstack.GetXaxis().SetTimeDisplay(1)
+#hstack.GetXaxis().SetTimeFormat("%d/%m")
+hstack.GetXaxis().SetTimeFormat("#splitline{%d/%m}{%Y}")
+hstack.GetXaxis().SetLabelSize(0.03)
+hstack.GetYaxis().SetLabelSize(0.035)
+hstack.GetXaxis().SetLabelOffset(0.02)
+hstack.GetXaxis().SetNdivisions(512)
+hstack.GetXaxis().SetTimeOffset(time_offset)
+
+legend.Draw()
+c1.Modified()
+c1.Modified()
+c1.Update()
+gPad.RedrawAxis()
+gPad.RedrawAxis("G")
+
+c1.Print(options.outfname)
+print( "Plot saved in "+options.outfname )
diff --git a/dev-tools/analyze/count-line-length.py b/dev-tools/analyze/count-line-length.py
new file mode 100755
index 0000000..3a1dde5
--- /dev/null
+++ b/dev-tools/analyze/count-line-length.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+
+import glob, sys
+from io import open
+
+fworst = ""
+lworst = 0
+totlin = 0
+totbad = 0
+nftot = 0
+nfbad = 0
+
+if len(sys.argv)<3:
+    print( "Usage: count-line-length <max_mum_chars_per_line> <files>" )
+    sys.exit(-1)
+
+limit = int(sys.argv[1])
+flist = sys.argv[2:]
+for fn in flist:
+    # read in
+    fd = open( fn, 'r', encoding="utf-8" )
+    txt = fd.read().split( '\n' )
+    fd.close
+
+    n = len(txt)
+    maxlen = 0
+    maxwhere = -1
+    nbadlin = 0
+    for i in range(n):
+        l = len(txt[i])
+        if l>maxlen:
+            maxlen = l
+            maxwhere = i
+        if l>limit:
+            nbadlin += 1
+
+    if nbadlin>0:
+        print( "%s: %i/%i lines too long, line %i longest with %i chars" %
+               (fn, nbadlin, n, maxwhere, maxlen) )
+
+        totbad += nbadlin
+        nfbad += 1
+    totlin += n
+    nftot += 1
+    if maxlen>lworst:
+        lworst = maxlen
+        fworst = fn
+
+if nfbad>0:
+    print( "total: %i/%i lines too long, in %i/%i files, longest in %s with %i chars" %
+           (totbad, totlin, nfbad, nftot, fworst, lworst) )
+    sys.exit(1)
+sys.exit(0)
diff --git a/dev-tools/analyze/lines_of_code.png b/dev-tools/analyze/lines_of_code.png
new file mode 100644
index 0000000..89a47a0
Binary files /dev/null and b/dev-tools/analyze/lines_of_code.png differ
diff --git a/dev-tools/analyze/lines_of_code.py b/dev-tools/analyze/lines_of_code.py
new file mode 100644
index 0000000..21a921e
--- /dev/null
+++ b/dev-tools/analyze/lines_of_code.py
@@ -0,0 +1,354 @@
+# calculate number of lines of code in BornAgain project as a function of time
+
+# object-oriented rewrite of cl_lines_of_code
+# JWu apr2016: don't use this, it's outdated by latest refactoring of cl_lines_of_code
+
+from __future__ import print_function
+import os
+import re
+from datetime import datetime
+from email.utils import parsedate
+from enum import Enum
+from ROOT import *
+
+
+time_offset = 0
+
+class FileTypes:
+    CORE, FTEST, UTEST, PYCODE, MACROS, GUI, PYAPI, THIRD, UNDEF, TOTAL = range(10)
+    descr=["Core", "Functional Tests", "Unit Tests", "*.py", "macros", "GUI", "PythonAPI", "Third", "Undef"]
+
+
+def filePython(x):
+    if ".py" in x and not ".pypp." in x: return True
+    return False
+
+
+def fileCpp(x):
+    if ".h" in x or ".cpp" in x: return True
+    return False
+
+
+def dirCore(x):
+    if "/Core/Algorithms" in x: return True
+    if "/Core/FormFactors" in x: return True
+    if "/Core/Samples" in x: return True
+    if "/Core/StandardSamples" in x: return True
+    if "/Core/Tools" in x: return True
+    if "/Core/Fitting" in x: return True
+    if "/Core/inc" in x: return True
+    if "/Core/src" in x: return True
+    if "/Core/InputOutput" in x: return True
+    if "/Core/Geometry" in x: return True
+    if "/Fit/Factory" in x: return True
+    if "/Fit/FitKernel" in x: return True
+    if "/Fit/StandardFits" in x: return True
+    if "/Core/Geometry" in x: return True
+    return False
+
+
+def dirPyAPI(x):
+    if "/Core/PythonAPI" in x: return True
+    if "/Fit/PythonAPI" in x: return True
+    return False
+
+
+def dirFuncTest(x):
+    # if "/App/" in x: return True
+    if "/Tests/Functional" in x: return True
+    if "/Tests/PerformanceTests" in x: return True
+    if "/Tests/FunctionalTests/TestCore" in x: return True
+    if "/Tests/FunctionalTests/TestFit" in x: return True
+    if "/Tests/FunctionalTests/TestPyCore" in x: return True
+    if "/Tests/FunctionalTests/TestPyFit" in x: return True
+    if "/Core/TestMachinery" in x: return True
+    return False
+
+
+def dirGUI(x):
+    if "/GUI/coregui" in x  and not "widgetbox" in x and not "qttools" in x: return True
+    if "/GUI/main" in x: return True
+    if "/AppGUI/coregui" in x: return True
+    if "/BASuite" in x: return True
+    return False
+
+
+def dirThirdParty(x):
+    if "/ThirdParty" in x: return True
+    return False
+
+
+def dirSkip(x):
+    if "/pub/core" in x: return True
+    return False
+
+
+def dirUnitTests(x):
+    if "/UnitTests/" in x: return True
+    if "/Tests/UnitTests/TestCore/" in x: return True
+    if "/Tests/UnitTests/TestFit/" in x: return True
+    if "/Tests/UnitTests/" in x: return True
+    return False
+
+
+def filetype(x):
+    """
+    Returns type of file
+    """
+    result = FileTypes.UNDEF
+
+    if dirSkip(x):
+        return result
+
+    if fileCpp(x) and dirCore(x):
+        result = FileTypes.CORE
+
+    elif (fileCpp(x) or filePython(x)) and dirFuncTest(x):
+        result = FileTypes.FTEST
+
+    elif dirUnitTests(x):
+        result = FileTypes.UTEST
+
+    elif dirGUI(x):
+        result = FileTypes.GUI
+
+    elif dirPyAPI(x):
+        result = FileTypes.PYAPI
+
+    elif dirThirdParty(x):
+        result = FileTypes.THIRD
+
+    return result
+
+
+class Commit:
+    def __init__(self):
+        self.date = datetime.today()
+        self.adds = 0
+        self.dels = 0
+        self.locs_for_type = []
+        for i in range(FileTypes.TOTAL):
+            self.locs_for_type.append(0)
+        self.hsh = None
+        self.who = None
+        self.cmt = None
+
+    def increment_loc(self, file_type):
+        self.locs_for_type[file_type] += 1
+        self.adds += 1
+
+    def decrement_loc(self, file_type):
+        self.locs_for_type[file_type] -= 1
+        self.dels += 1
+
+
+class HistoryCollector:
+    def __init__(self):
+        self.history = Commit()
+        self.data = []
+        self.locs = 0
+        self.fc = 0
+        self.file_type_ppp = FileTypes.UNDEF
+        self.file_type_mmm = FileTypes.UNDEF
+
+    def pop(self):
+        if not self.history.adds:
+            return
+        pstr="%s %8u %5s %5s %7s %s \t%s"%(self.history.date, self.locs,'+'+str(self.history.adds),'-'+str(self.history.dels), self.history.hsh, self.history.who, self.history.cmt.strip())
+        print(self.history.locs_for_type[0], pstr)
+        self.data.append(self.history)
+        tmp = list(self.history.locs_for_type)
+        self.history = Commit()
+        self.history.locs_for_type = tmp
+
+    def run(self):
+        nnn = 0
+        for x in os.popen('git log develop --reverse -p'):
+            nnn += 1
+            if x.startswith('commit'):
+                self.pop()
+                self.history.hsh = x[7:14]
+
+            if x.startswith('Author'):
+                self.history.who = x.replace("Author: ", '').replace('\n', '')
+                self.history.who = re.sub(">.*", "", self.history.who)
+                self.history.who = re.sub(".*<", "", self.history.who)
+
+            if x.startswith('Date'):
+                self.fc = 1
+                self.history.date = datetime(*parsedate(x[5:])[:7])
+                #t=datetime.mktime(parsedate(x[5:]))
+
+            if self.fc == 2:
+                self.history.cmt = x[:-1]
+                self.fc = 0
+
+            if self.fc == 1:
+                if len(x) == 1:
+                    self.fc = 2
+
+            if x.startswith('+++'):
+                self.file_type_ppp = filetype(x)
+
+            if x.startswith('---'):
+                self.file_type_mmm = filetype(x)
+
+            if x.startswith('+') and not x.startswith('+++'):
+                self.history.increment_loc(self.file_type_ppp)
+                if self.file_type_ppp <FileTypes.PYAPI:
+                    self.locs += 1
+
+            if x.startswith('-') and not x.startswith('---'):
+                self.history.decrement_loc(self.file_type_mmm)
+                if self.file_type_mmm <FileTypes.PYAPI:
+                    self.locs -= 1
+
+            # if nnn>1000000:
+            #     break
+
+        self.pop()
+
+
+def create_time_histogram(history, title, fileType):
+    global time_offset
+    c = history[0]
+    td_first = TDatime(c.date.year, c.date.month, c.date.day, c.date.hour, c.date.minute, c.date.second)
+    c = history[-1]
+    td_last = TDatime(c.date.year, c.date.month, c.date.day, c.date.hour, c.date.minute, c.date.second)
+
+    time_offset = int(td_first.Convert()) - 7*24*3600  # one week before first commit
+    xmin = 0
+    xmax = int(td_last.Convert()) - time_offset
+
+    ntimebins = (xmax - xmin)/3600  # one timebin per day
+    # print("CORE {1} FTEST {2} UTEST {3} GUI {4} PYAPI {5}".format(c.locs_for_type[]))
+
+    print("{0}:{1}".format(title, c.locs_for_type[fileType]))
+
+    result = TH1D(title, title, ntimebins, xmin, xmax)
+    result.GetXaxis().SetTimeDisplay(1)
+    result.GetXaxis().SetTimeFormat("#splitline{%d/%m}{%Y}")
+    result.GetYaxis().SetLabelSize(0.02)
+    result.GetXaxis().SetLabelSize(0.02)
+    # result.GetXaxis().SetNdivisions(512)
+    result.GetXaxis().SetTimeOffset(time_offset)
+
+    refhist = TH1D(title+"_ref", title+"_ref", ntimebins, xmin, xmax)
+
+    # filling histogram
+    for c in history:
+        td = TDatime(c.date.year, c.date.month, c.date.day, c.date.hour, c.date.minute, c.date.second)
+        xx = td.Convert() - time_offset
+        result.Fill(xx, c.locs_for_type[fileType])
+        refhist.Fill(xx)
+
+    # normalizing bin content on number of entries per bin
+    for i_bin in range(1, result.GetNbinsX()+1):
+        nentries = refhist.GetBinContent(i_bin)
+        bin_content = float(result.GetBinContent(i_bin))
+        if bin_content<0:
+            print(i_bin, nentries, bin_content)
+        if nentries != 0:
+            bin_content /= nentries
+            result.SetBinContent(i_bin, bin_content)
+
+    # filling empty bins with values from previous day
+    prev_content = 0
+    for i_bin in range(1, result.GetNbinsX()+1):
+            if result.GetBinContent(i_bin) == 0:
+                result.SetBinContent(i_bin, prev_content)
+            prev_content = result.GetBinContent(i_bin)
+
+    return result
+
+
+def hold_root_graphics():
+    """
+    Holds ROOT graphics while listening to ctr-C event
+    """
+    Interrupt = False
+    while not Interrupt:
+        Interrupt = gSystem.ProcessEvents()
+        gSystem.Sleep(10)
+
+
+def plot_loc_number(history):
+    global time_offset
+
+    selected_hist = [FileTypes.CORE, FileTypes.FTEST, FileTypes.UTEST, FileTypes.GUI, FileTypes.PYAPI]
+    a_colors = [kAzure+1, kOrange, kRed, kGreen, kYellow-7, kAzure, kGray+1]
+
+    a_histograms = []
+    hstack = THStack("hstack","Number of Lines of Code")
+    hstack.SetTitle("")
+
+    legend = TLegend(0.14, 0.65, 0.4, 0.84)
+    legend.SetBorderSize(1)
+    for i in range(0, len(selected_hist)):
+        i_hist = selected_hist[i]
+        hist = create_time_histogram(history, FileTypes.descr[selected_hist[i]], i_hist)
+        hist.SetLineColor(a_colors[i_hist])
+        hist.SetFillColor(a_colors[i_hist])
+        a_histograms.append(hist)
+
+
+    # adding histograms to legend in right order
+    for i_hist in range(len(a_histograms)-1, -1, -1):
+        legend.AddEntry(a_histograms[i_hist], a_histograms[i_hist].GetTitle(), "f")
+
+
+    #preparing canvas
+    c1 = TCanvas( 'gisasfw_loc', 'Number of lines of code in BornAgain project', 1024, 768)
+    c1.cd()
+    gPad.SetGrid()
+    gPad.SetBottomMargin(0.10)
+    gPad.SetLeftMargin(0.10)
+    gPad.SetTopMargin(0.10)
+    gPad.SetRightMargin(0.10)
+    # a_histograms[0].Draw("HIST")
+
+    # drawing
+    for h in a_histograms:
+        hstack.Add(h,"][")
+    hstack.Draw("HIST")
+    hstack.GetXaxis().SetTimeDisplay(1)
+    #hstack.GetXaxis().SetTimeFormat("%d/%m")
+    hstack.GetXaxis().SetTimeFormat("#splitline{%b}{%Y}")
+    hstack.GetXaxis().SetLabelSize(0.025)
+    hstack.GetYaxis().SetLabelSize(0.025)
+    hstack.GetXaxis().SetLabelOffset(0.02)
+    hstack.GetXaxis().SetNdivisions(522)
+    hstack.GetXaxis().SetTimeOffset(time_offset)
+    hstack.SetMaximum(190e+03)
+
+    #
+    legend.Draw()
+    c1.Modified()
+    c1.Update()
+    gPad.RedrawAxis()
+    gPad.RedrawAxis("G")
+
+    c1.Print("lines_of_code.png")
+    hold_root_graphics()
+
+
+def process_loc_number(targetfolder = "../.."):
+    print("Hello World")
+
+    prevfolder = os.getcwd()
+    os.chdir(targetfolder)
+
+    collector = HistoryCollector()
+    collector.run()
+
+    os.chdir(prevfolder)
+
+    plot_loc_number(collector.data)
+
+
+
+
+
+if __name__ == '__main__':
+    process_loc_number()
+
diff --git a/dev-tools/check-examples/check_examples.py b/dev-tools/check-examples/check_examples.py
new file mode 100644
index 0000000..1d380a2
--- /dev/null
+++ b/dev-tools/check-examples/check_examples.py
@@ -0,0 +1,159 @@
+"""
+Check users examples from Examples/python/simulation directory. The script walks through
+the directory tree, imports examples one by one and tries to produce a scattering image.
+
+Usage: python check_examples.py <path_to_examples_directory>
+
+If no path is given, then current working dir will be used
+"""
+import sys
+import os
+import matplotlib
+matplotlib.use('Agg')
+import pylab
+import shutil
+import glob
+import subprocess
+
+
+def run_command(cmd):
+    returncode = os.system(cmd)
+    if returncode:
+        exit("Error while running command '"+cmd+"'")
+
+
+def FilesAreDifferent(file1, file2):
+    '''Returns True if files are different or absent.'''
+
+    if not os.path.exists(file1) or not os.path.exists(file2):
+        return True
+    proc = subprocess.Popen(["diff "+file1+" "+file2], stdout=subprocess.PIPE, shell=True)
+    (out, err) = proc.communicate()
+    if len(out) or err!=None:
+        return True
+    return False
+
+
+def get_figure(filename):
+    """
+    Returns pylab figure of appropriate size
+    """
+    if "AllFormFactorsAvailable" in filename:
+        xsize = 1024
+        ysize = 768
+    else:
+        xsize = 640
+        ysize = 480
+
+    dpi = 72.
+    xinch = xsize / dpi
+    yinch = ysize / dpi
+    return pylab.figure(figsize=(xinch, yinch))
+
+
+def generate_example_plot(dirname, filename):
+    """
+    Tries to run python example and produce a *.png image
+    """
+    print "Analysing {:40s}".format(filename),
+
+    fig = get_figure(filename)
+    try:
+        d = dict(locals(), **globals())
+        execfile(os.path.join(dirname, filename), d, d)
+        plot_file_name = os.path.splitext(filename)[0] + ".png"
+        pylab.savefig(plot_file_name)
+        pylab.close(fig)
+
+        status = "OK"
+
+        kb = os.path.getsize(plot_file_name)/1000.
+        if kb < 4.0:
+            status = "EMPTY?"
+    except:
+        status = "FAILED"
+
+    print status
+    return os.path.join(dirname, filename), status, ""
+
+
+def validate_examples(examples_dir):
+    """
+    Walks through directory tree and checks every python example found
+    """
+    history = []
+    for subdir, dirs, files in os.walk(examples_dir):
+        for file in files:
+            if os.path.splitext(file)[1] == ".py":
+                # results = generate_example_plot(subdir, file)
+                # history.append(results)
+                name, status, webstatus = generate_example_plot(subdir, file)
+                history.append([name, status, webstatus])
+    return history
+
+
+def create_directories():
+    """
+    Creates working directory where all *.png images will be generated
+    """
+    tempdir = "temp"
+    if os.path.exists(tempdir):
+        shutil.rmtree(tempdir)
+    os.makedirs(tempdir)
+    return tempdir
+
+
+def validate_drupal(history):
+    """
+    Validate examples in drupal directory
+    """
+    cmd = "scp -r apps at apps.jcns.fz-juelich.de:/www/apps/drupal/sites/default/files/python_examples/scripts ."
+    run_command(cmd)
+    drupal_scripts = glob.glob(os.path.join("scripts", "*.py"))
+    for h in history:
+        example_name = os.path.basename(h[0])
+        for s in drupal_scripts:
+            script_name = os.path.basename(s)
+            if  script_name == example_name:
+                if FilesAreDifferent(h[0], s):
+                    h[2] = "[website differs]"
+                else:
+                    h[2] = "[website OK]"
+
+
+def print_summary(rootdir, history):
+    """
+    prints summary over all python examples on the screen
+    """
+    print "-"*80
+    print "Python examples summary"
+    print "Directory: {0}".format(rootdir)
+    print "-"*80
+    history.sort()
+    for h in history:
+        filename = h[0]
+        shortname = filename.split(rootdir)[1]
+        print "{:65s} {:10s} {:10s}".format(shortname, h[1], h[2])
+
+
+if __name__ == '__main__':
+
+    examples_dir = "./"
+
+    if len(sys.argv) == 2:
+        examples_dir = sys.argv[1]
+
+    examples_dir = os.path.abspath(examples_dir)
+    print "Analysing examples in '{0}' directory.".format(examples_dir)
+
+    tempdir = create_directories()
+    os.chdir(tempdir)
+
+    history = validate_examples(examples_dir)
+
+
+    validate_drupal(history)
+
+    print_summary(examples_dir, history)
+
+    # check_example("/home/pospelov/development/BornAgain/source/Examples/python/simulation/ex01_BasicParticles", "CylindersAndPrisms.py")
\ No newline at end of file
diff --git a/dev-tools/code-tools/print-includes.py b/dev-tools/code-tools/print-includes.py
new file mode 100755
index 0000000..9dfa6c9
--- /dev/null
+++ b/dev-tools/code-tools/print-includes.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+# Print names of included files.
+# Report only includes of form "..", not <..>.
+
+import glob, re, sys
+
+def inspect( fn ):
+    # print( "File " + fn )
+
+    # read in
+    fd = open( fn, 'r' )
+    a = fd.read().split('\n')
+    fd.close
+
+    for line in a:
+        m = re.search( r'#include\s+\"(.*)\"', line, re.M )
+        if m:
+            result.append( m.group(1) )
+
+## Main
+
+result = []
+flist = sys.argv[1:]
+for fn in flist:
+    inspect( fn )
+
+# remove duplicates and sort (how much more elegant would this be in Ruby...)
+tmp = set(result)
+result = list(tmp)
+result.sort()
+
+for fname in result:
+    print( fname )
diff --git a/dev-tools/code-tools/update-gtestlist.py b/dev-tools/code-tools/update-gtestlist.py
new file mode 100755
index 0000000..68e0e10
--- /dev/null
+++ b/dev-tools/code-tools/update-gtestlist.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+
+"""
+Renews file testlist.h in given unit test subdirectory.
+This file just includes all other files from that directory.
+"""
+
+import fnmatch, glob, os, re, sys
+
+def find(pattern, path):
+    result = []
+    for root, dirs, files in os.walk(path):
+        for name in files:
+            if fnmatch.fnmatch(name, pattern):
+                result.append( name )
+    return result
+
+if( len(sys.argv)<=1 ):
+    print( "Usage: %s <directories>" % sys.argv[0] )
+    sys.exit(0)
+
+filelist = []
+for dir in sys.argv[1:]:
+    filelist = find( '*.h', dir )
+    fd = open( dir+"/testlist.h", "w" )
+    fd.write( "// To renew this file, run %s <directory>\n\n" % sys.argv[0] )
+    for fname in filelist:
+        if fname=="testlist.h":
+            continue
+        fd.write( '#include "%s"\n' % fname )
+    fd.close()
diff --git a/dev-tools/deploy/mavericks-dev/Vagrantfile b/dev-tools/deploy/mavericks-dev/Vagrantfile
new file mode 100644
index 0000000..4cfc0f3
--- /dev/null
+++ b/dev-tools/deploy/mavericks-dev/Vagrantfile
@@ -0,0 +1,31 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+# All Vagrant configuration is done below. The "2" in Vagrant.configure
+# configures the configuration version (we support older styles for
+# backwards compatibility). Please don't change it unless you know what
+# you're doing.
+Vagrant.configure(2) do |config|
+  config.vm.box = "mavericks-dev"
+
+# Use NFS for the shared folder
+  config.vm.synced_folder '.', '/vagrant', disabled: true
+  #config.vm.network "private_network", ip: "10.11.12.13"
+  #config.vm.synced_folder ".", "/vagrant", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp,noatime']
+
+  # Provider-specific configuration so you can fine-tune various
+  config.vm.provider "virtualbox" do |vb|
+    # Don't boot with headless mode
+    #   vb.gui = true
+
+    # Use VBoxManage to customize the VM. For example to change memory:
+    vb.customize ["modifyvm", :id, "--memory", "8192"]
+    vb.customize ["modifyvm", :id, "--cpuidset", "1","000206a7","02100800","1fbae3bf","bfebfbff"]
+    # use ICH9 for the chipset
+    vb.customize ["modifyvm", :id, "--chipset", "piix3"]
+    vb.cpus = 4
+  end
+
+  config.vm.provision :shell, path: "build_bornagain.sh", privileged: false
+
+end
diff --git a/dev-tools/deploy/mavericks-dev/build_bornagain.sh b/dev-tools/deploy/mavericks-dev/build_bornagain.sh
new file mode 100644
index 0000000..0c45471
--- /dev/null
+++ b/dev-tools/deploy/mavericks-dev/build_bornagain.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+
+
+export QTDIR=/usr/local/opt/qt5
+export PATH=/usr/local/bin:$QTDIR/bin/:$PATH
+export WORKDIR=/Users/vagrant/build
+rm -r -f $WORKDIR; mkdir -p $WORKDIR; cd $WORKDIR;
+
+#git clone -b develop https://github.com/scgmlz/BornAgain.git
+#git clone -b release-1.7.0 https://github.com/waltervh/BornAgain.git
+git clone -b DmgInstaller https://github.com/gpospelov/BornAgain.git
+
+mkdir BornAgain-build
+cd BornAgain-build
+export ANACONDA=/Users/vagrant/anaconda2
+cmake -DCMAKE_C_COMPILER=/usr/local/opt/llvm36/bin/clang-3.6 -DCMAKE_CXX_COMPILER=/usr/local/opt/llvm36/bin/clang++-3.6  -DPYTHON_LIBRARY=$ANACONDA/lib/libpython2.7.dylib -DPYTHON_EXECUTABLE=$ANACONDA/bin/python2.7 -DBORNAGAIN_APPLE_BUNDLE=ON -DCMAKE_PREFIX_PATH=/usr/local ../BornAgain
+make -j4
+cpack -V
+
+echo 'Copying dmg installer back to build server'
+echo 'scp /Users/vagrant/build/BornAgain-build/*.dmg scg at scgmini:./deployment/results/.'
+scp /Users/vagrant/build/BornAgain-build/*.dmg scg at scgmini:./deployment/results/.
diff --git a/dev-tools/deploy/ubuntu-dev/Vagrantfile b/dev-tools/deploy/ubuntu-dev/Vagrantfile
new file mode 100644
index 0000000..4e91490
--- /dev/null
+++ b/dev-tools/deploy/ubuntu-dev/Vagrantfile
@@ -0,0 +1,74 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+# All Vagrant configuration is done below. The "2" in Vagrant.configure
+# configures the configuration version (we support older styles for
+# backwards compatibility). Please don't change it unless you know what
+# you're doing.
+Vagrant.configure(2) do |config|
+  # The most common configuration options are documented and commented below.
+  # For a complete reference, please see the online documentation at
+  # https://docs.vagrantup.com.
+
+  # Every Vagrant development environment requires a box. You can search for
+  # boxes at https://atlas.hashicorp.com/search.
+  config.vm.box = "ubuntu/trusty64"
+
+  # Disable automatic box update checking. If you disable this, then
+  # boxes will only be checked for updates when the user runs
+  # `vagrant box outdated`. This is not recommended.
+  # config.vm.box_check_update = false
+
+  # Create a forwarded port mapping which allows access to a specific port
+  # within the machine from a port on the host machine. In the example below,
+  # accessing "localhost:8080" will access port 80 on the guest machine.
+  # config.vm.network "forwarded_port", guest: 80, host: 8080
+
+  # Create a private network, which allows host-only access to the machine
+  # using a specific IP.
+  # config.vm.network "private_network", ip: "192.168.33.10"
+
+  # Create a public network, which generally matched to bridged network.
+  # Bridged networks make the machine appear as another physical device on
+  # your network.
+  # config.vm.network "public_network"
+
+  # Share an additional folder to the guest VM. The first argument is
+  # the path on the host to the actual folder. The second argument is
+  # the path on the guest to mount the folder. And the optional third
+  # argument is a set of non-required options.
+  # config.vm.synced_folder "../data", "/vagrant_data"
+
+  # Provider-specific configuration so you can fine-tune various
+  # backing providers for Vagrant. These expose provider-specific options.
+  # Example for VirtualBox:
+  #
+  config.vm.provider "virtualbox" do |vb|
+    # Display the VirtualBox GUI when booting the machine
+    # vb.gui = true
+  
+    # Customize the amount of memory on the VM:
+    vb.cpus = 2
+    vb.memory = 4096
+  end
+  #
+  # View the documentation for the provider you are using for more
+  # information on available options.
+
+  # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
+  # such as FTP and Heroku are also available. See the documentation at
+  # https://docs.vagrantup.com/v2/push/atlas.html for more information.
+  # config.push.define "atlas" do |push|
+  #   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
+  # end
+
+  # Enable provisioning with a shell script. Additional provisioners such as
+  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
+  # documentation for more information about their specific syntax and use.
+  # config.vm.provision "shell", inline: <<-SHELL
+  #   sudo apt-get update
+  #   sudo apt-get install -y apache2
+  # SHELL
+  config.vm.provision :shell, path: "ubuntu_provision.sh"
+  config.vm.provision :shell, path: "build_bornagain.sh"
+end
diff --git a/dev-tools/deploy/ubuntu-dev/build_bornagain.sh b/dev-tools/deploy/ubuntu-dev/build_bornagain.sh
new file mode 100644
index 0000000..5e51801
--- /dev/null
+++ b/dev-tools/deploy/ubuntu-dev/build_bornagain.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+git clone git://apps.jcns.fz-juelich.de/BornAgain.git
+mkdir BornAgain-build
+cd BornAgain-build
+cmake ../BornAgain
+make -j4
+
diff --git a/dev-tools/deploy/ubuntu-dev/ubuntu_provision.sh b/dev-tools/deploy/ubuntu-dev/ubuntu_provision.sh
new file mode 100644
index 0000000..a3a0ec4
--- /dev/null
+++ b/dev-tools/deploy/ubuntu-dev/ubuntu_provision.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+apt-get update
+apt-get install -f -y build-essential git cmake libgsl0-dev libboost-all-dev libfftw3-dev python-dev python-numpy python-matplotlib
+apt-get install -f -y qt5-default libqt5designercomponents5 qttools5-dev qtscript5-dev
diff --git a/dev-tools/edit/ed-files-vanilla.py b/dev-tools/edit/ed-files-vanilla.py
new file mode 100755
index 0000000..a5c71af
--- /dev/null
+++ b/dev-tools/edit/ed-files-vanilla.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+
+# Automatic editing of collection of source files.
+# Does not provide backup files:
+# to be safe, work on fresh git commit, and use 'git stash' to revert.
+
+import glob, re
+from string import Template
+
+def edit( fn ):
+    print( "File " + fn )
+
+    # read in
+    fd = open( fn, 'r' )
+    ti = fd.read()
+    fd.close
+    a = ti.split( '\n' )
+    tf = ""
+
+    # CHANGE THIS ACCORDING TO YOUR NEEDS
+    p = re.compile( "@homepage  http://apps\.jcns\.fz-juelich\.de/BornAgain" )
+    for l in a:
+        tf += p.sub( '@homepage  http://bornagainproject.org', l, 1 ) + "\n"
+    
+    # save result
+    fd = open( fn, 'w' )
+    fd.write( tf.rstrip() )
+    fd.close
+
+## Main
+
+fc  = glob.glob( '*/*.h' )
+fc += glob.glob( '*/*.cpp' )
+
+for fn in fc:
+    edit( fn )
diff --git a/dev-tools/edit/update-filename.py b/dev-tools/edit/update-filename.py
new file mode 100755
index 0000000..4c32c7b
--- /dev/null
+++ b/dev-tools/edit/update-filename.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+
+# Automatically rewrite the Doxygen parameter @file in the headers of all given files
+
+# Does not provide backup files:
+# to be safe, work on fresh git commit, and use 'git stash' to revert.
+
+import glob, re, sys
+
+def doit( fn ):
+    global nchanged, nempty
+    fn = re.sub( r'^\./', '', fn )
+    if re.search( r'dev-tools\/', fn ):
+        return
+    if re.search( r'build\/', fn ):
+        return
+    if re.search( r'auto\/', fn ):
+        return
+    # print( "File " + fn )
+
+    # read in
+    fd = open( fn, 'r' )
+    ti = fd.read()
+    fd.close
+
+    if not re.search(  r'(//! @file)', ti ):
+        print( "no '@file' in " + fn )
+        nempty += 1
+        return
+
+    tf = re.sub( r'(//! @file).*', r'\1      '+fn, ti, re.M )
+
+    if ti==tf:
+        return
+
+    nchanged += 1
+    fd = open( fn, 'w' )
+    fd.write( tf )
+    fd.close
+
+# main
+
+if len(sys.argv)<=1:
+    print("Usage: %s <source_files>" % sys.argv[0])
+    sys.exit()
+
+nempty   = 0
+ncorrupt = 0
+nchanged = 0
+
+files = sys.argv[1:]
+nfiles = len(files)
+
+for i in range(nfiles):
+    fn = files[i]
+    # print( "SOIN - file %i/%i: %s" % ( i+1, len(files), fn ) )
+    doit( fn )
+
+print( "Summary:" )
+print( "  number of files: %i" % nfiles )
+print( "  w/o '@file':     %i" % nempty )
+# print( "  nonstandard:     %i" % ncorrupt )
+print( "  found in form:   %i" % (nfiles - nempty - ncorrupt - nchanged) )
+print( "  changed:         %i" % nchanged )
diff --git a/dev-tools/edit/update-minimizers.py b/dev-tools/edit/update-minimizers.py
new file mode 100644
index 0000000..34692da
--- /dev/null
+++ b/dev-tools/edit/update-minimizers.py
@@ -0,0 +1,72 @@
+"""
+The script compares BornAgain/ThirdParty/RootMinimizers with original ROOT installation to propagate code modifications
+from ROOT to our source tree.
+"""
+import os
+import filecmp
+
+ROOT_SOURCE = "/home/pospelov/software/root/root_v6.06.02.source"
+BORNAGAIN_SOURCE = "/home/pospelov/development/BornAgain/BornAgain/ThirdParty/RootMinimizers"
+
+
+
+
+def find_files(rootdir):
+    """
+    Yield recursive list of files in given rootdir
+    """
+    for subdir, dirs, files in os.walk(rootdir):
+        for filename in files:
+            #yield os.sep.join([subdir, filename])
+            yield subdir, filename
+
+
+def get_source_files(rootdir):
+    """
+    Return list of *.cxx *.cpp *.h files in given rootdir
+    """
+    extensions = [".h", ".cpp", ".cxx"]
+    result = []
+    for subdir, filename in find_files(rootdir):
+            name, ext = os.path.splitext(filename)
+            if ext in extensions:
+                result.append(os.sep.join([subdir, filename]))
+    return result
+
+
+#def find_files_with_same_name(rootdir, name_to_find):
+#    """
+#    Returns recursive list of files in rootdir with given name
+#    """
+#    result = []
+#    for file in find_files(rootdir):
+#        if os.path.basename(file) == name_to_find:
+#            result.append(file)
+#    return result
+
+
+def find_files_with_same_name(filename_list, name_to_find):
+    result = []
+    for filename in filename_list:
+        if os.path.basename(filename) == name_to_find:
+            result.append(filename)
+    return result
+
+
+def build_difference_map():
+    ba_files = get_source_files(BORNAGAIN_SOURCE)
+    root_files = get_source_files(ROOT_SOURCE)
+
+    for ba_file in ba_files:
+        found_files = find_files_with_same_name(root_files, os.path.basename(ba_file))
+        if len(found_files) == 1:
+            if filecmp.cmp(ba_file, found_files[0]) == False:
+                cmd = "cp " + found_files[0] + " " + os.path.dirname(ba_file)
+                print ba_file, found_files[0]
+                #os.system(cmd)
+        else:
+            print ba_file, len(found_files), found_files
+
+
+if __name__ == '__main__':
+    build_difference_map()
diff --git a/dev-tools/edit/update-sourcecode-header.py b/dev-tools/edit/update-sourcecode-header.py
new file mode 100644
index 0000000..9c248a2
--- /dev/null
+++ b/dev-tools/edit/update-sourcecode-header.py
@@ -0,0 +1,141 @@
+# Patches header in all source files
+#
+# Usage: cd <BornAgain_source>; python dev-tools/code-tools/update_sourcecode_header.py
+
+import os
+import sys
+import glob
+
+directories = [
+    # "Core/Algorithms",
+    # "Core/FormFactors",
+    # "Core/Geometry",
+    # "Core/Samples",
+    # "Core/StandardSamples",
+    # "Core/Tools",
+    # "Fit/FitKernel",
+    "GUI/coregui",
+    "GUI/main",
+    #"App"
+]
+
+#
+header_top = [
+    u"// ************************************************************************** //",
+    u"//                                                                              ",
+    u"//  BornAgain: simulate and fit scattering at grazing incidence                 ",
+    u"//                                                                              "
+    ]
+header_center = [
+    u"//! @file      dev-tools/edit/update-sourcecode-header.py
+    u"//! @brief     Defines class Beam                                               "
+    ]
+header_bottom = [
+    u"//!                                                                             ",
+    u"//! @homepage  http://www.bornagainproject.org                                  ",
+    u"//! @license   GNU General Public License v3 or higher (see COPYING)            ",
+    u"//! @copyright Forschungszentrum J\u00fclich GmbH 2016                          ",
+    u"//! @authors   Scientific Computing Group at MLZ Garching                       ",
+    u"//! @authors   C\u00E9line Durniak, Marina Ganeva, David Li, Gennady Pospelov   ",
+    u"//! @authors   Walter Van Herck, Joachim Wuttke                                 ",
+    u"//                                                                              ",
+    u"// ************************************************************************** //"
+    ]
+
+
+def get_files_to_update(path):
+    """
+    Returns list of source code files to update in given directory including subdirectories
+    """
+    result = []
+    for (dirpath, dirnames, filenames) in os.walk(path):
+        for filename in filenames:
+            file_ext = os.path.splitext(filename)[1]
+            if file_ext == ".h" or file_ext == ".cpp":
+                result.append(os.sep.join([dirpath, filename]))
+            else:
+                print "{:65s} {:10s}".format(os.sep.join([dirpath, filename]), "non standard")
+    return sorted(result)
+
+
+def get_current_header(file_content):
+    """
+    Returns current header of file
+    """
+    result = []
+    for line in file_content:
+        if line.startswith("//"):
+            result.append(line)
+        else:
+            break
+
+    return result
+
+
+def get_new_header(current_header):
+    """
+    Return list of lines representing new header. List is empty if old header is non-standard one
+    """
+    if len(current_header) < 14 or len(current_header) > 15:
+        return []
+
+    file_part = []
+    brief_part = []
+    for i in range(0, len(current_header)):
+        if "@file" in current_header[i]:
+            file_part.append(current_header[i])
+        elif "@brief" in current_header[i]:
+            brief_part.append(current_header[i])
+            if len(current_header[i+1]) > 3:
+                brief_part.append(current_header[i+1])
+
+    if len(file_part) == 0 or len(brief_part) == 0:
+        return []
+
+    result = header_top + file_part + brief_part + header_bottom
+    return result
+
+
+def update_header_in_file(filename):
+    """
+    Updates, if necessary, the header in given file
+    """
+    fin = open(filename, 'r')
+    lines = [line.decode('utf8').rstrip('\n') for line in fin]
+    fin.close()
+
+    current_header = get_current_header(lines)
+    new_header = get_new_header(current_header)
+
+    if len(new_header) == 0:
+        print "{:65s} {:10s}".format(filename, "non standard")
+        return
+
+    fout = open(filename, 'w')
+    new_content = new_header + lines[len(current_header):]
+    for line in new_content:
+        fout.write(line.encode('utf8').rstrip() + "\n")
+    fout.close()
+
+    print "{:65s} {:10s}".format(filename, "OK")
+
+
+
+def update_directory(dirname):
+    """
+    Updates all files recursively in given directory
+    """
+    if not os.path.isdir(dirname):
+        exit("No such directory " + dirname)
+
+    list_of_files = get_files_to_update(dirname)
+
+    for filename in list_of_files:
+        update_header_in_file(filename)
+
+    # update_header_in_file("./GUI/coregui/mainwindow/aboutapplicationdialog.cpp")
+
+if __name__ == '__main__':
+
+    for dirname in directories:
+        update_directory(dirname)
diff --git a/dev-tools/log/perf_history.txt b/dev-tools/log/perf_history.txt
new file mode 100644
index 0000000..d9b7320
--- /dev/null
+++ b/dev-tools/log/perf_history.txt
@@ -0,0 +1,562 @@
+# date and time     | hostname   | system information      | FresnelCoeff Pyramid RotatedPyramid MesoCrystal Matrix Method
+
+2012-07-24 18:21:18 | jcnsopc73  | macosx64, 2800 MHz      | 82987.5 | 4.14079 | 3.89105 | 0.23391 |
+2012-07-24 18:22:36 | jcnsopc73  | macosx64, 2800 MHz      | 82987.5 | 4.14938 | 3.91389 | 0.23391 |
+2012-07-24 18:31:44 | iff1610    | linuxx8664gcc, 2399 MHz | 45248.9 | 3.10559 | 2.90698 | 0.17730 |
+2012-07-25 10:32:15 | jcnsopc73  | macosx64, 2800 MHz      | 84033.6 | 4.0404  | 3.87597 | 0.23640 |
+2012-07-25 12:53:59 | jcnsopc73  | macosx64, 2800 MHz      | 81300.8 | 3.99202 | 3.82409 | 0.22321 |
+2012-07-25 13:07:19 | jcnsopc73  | macosx64, 2800 MHz      | 80000   | 4.08163 | 3.89105 | 0.23446 |
+2012-07-25 13:08:31 | jcnsopc73  | macosx64, 2800 MHz      | 83333.3 | 4.06504 | 3.861   | 0.22883 |
+2012-07-25 13:10:06 | jcnsopc73  | macosx64, 2800 MHz      | 84033.6 | 4.05679 | 3.89105 | 0.22857 |
+
+# switched off debug
+2012-07-25 13:18:04 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 12.987  | 12.8205 | 0.70922 |
+2012-07-25 13:19:11 | jcnsopc73  | macosx64, 2800 MHz      | 256410  | 12.9032 | 12.4224 | 0.70175 |
+
+# kvector_t -> BasicVector3D < double> : improvement ~10%
+2012-07-25 15:39:19 | jcnsopc73  | macosx64, 2800 MHz      | 229885  | 11.2994 | 11.4286 | 0.60606 |
+2012-07-25 15:40:44 | jcnsopc73  | macosx64, 2800 MHz      | 240964  | 11.1732 | 11.5607 | 0.625   |
+2012-07-25 15:53:31 | jcnsopc73  | macosx64, 2800 MHz      | 238095  | 11.8343 | 11.6279 | 0.60060 |
+
+# debug is switched on again, and it is the same as before migration in kvector
+2012-07-25 15:57:02 | jcnsopc73  | macosx64, 2800 MHz      | 80645.2 | 3.92927 | 3.89105 | 0.21254 |
+2012-07-25 15:58:36 | jcnsopc73  | macosx64, 2800 MHz      | 80971.7 | 3.96825 | 3.80228 | 0.21276 |
+2012-07-30 16:19:13 | jcnsopc73  | macosx64, 2800 MHz      | 77519.4 | 3.75235 | 3.80952 | 0.18433 |
+2012-07-30 16:19:46 | jcnsopc73  | macosx64, 2800 MHz      | 81967.2 | 3.8835  | 3.83142 | 0.19175 |
+
+# multiple changes to get parameters from MesoCrystal, LayerDecorator etc into parameter pool
+# switching off debug, it looks like MesoCrystal is now slower (0.45Hz vs 0.70 Hz), origin is not understood
+2012-07-31 11:39:09 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 13.1579 | 13.0719 | 0.45351 |
+2012-07-31 11:39:23 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 12.9032 | 13.0719 | 0.45351 |
+2012-07-31 11:40:12 | jcnsopc73  | macosx64, 2800 MHz      | 270270  | 13.0719 | 12.9032 | 0.45351 |
+
+# debug is on again
+2012-08-03 09:21:48 | jcnsopc73  | macosx64, 2800 MHz      | 77519.4 | 4.04858 | 3.89864 | 0.17574 |
+2012-08-08 11:41:47 | jcnsopc73  | macosx64, 2800 MHz      | 81967.2 | 4.04858 | 3.89105 | 0.26246 |
+2012-08-08 17:27:53 | jcnsopc73  | macosx64, 2800 MHz      | 83333.3 | 4.07332 | 3.89864 | 0.26143 |
+
+# after implementation of complex cvector_t
+2012-08-14 17:29:28 | jcnsopc73  | macosx64, 2800 MHz      | 83682   | 4.09836 | 3.95257 | 0.26738 |
+2012-08-17 15:45:43 | jcnsopc73  | macosx64, 2800 MHz      | 78125   | 4.08163 | 3.79507 | 0.25906 |
+2012-08-20 11:23:34 | jcnsopc73  | macosx64, 2800 MHz      | 84033.6 | 4.09836 | 4.00802 | 0.26455 |
+
+# debug is off, current state of the art
+2012-08-20 11:36:58 | jcnsopc73  | macosx64, 2800 MHz      | 270270  | 13.0719 | 12.9032 | 0.93023 |
+
+# StochasticParameter<double> inside of Sphere and Pyramid formfactors i.e. the performance is > two times worse
+2012-08-20 11:46:07 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 5.49451 | 5.44959 | 0.43478 |
+2012-08-20 11:46:25 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 5.50964 | 5.49451 | 0.44052 |
+
+# removing StochasticParameter<double> from Sphiere, Pyramid ff again
+# debug is off, current state of the art
+2012-08-20 13:16:30 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 13.1579 | 13.0719 | 0.93896 |
+
+# after Walter's refactoring
+# (debug=on)
+2012-09-13 10:43:41 | jcnsopc73  | macosx64, 2800 MHz      | 80971.7 | 4.58716 | 3.83877 | 0.05608 |
+# (debug=off)
+2012-09-13 17:19:44 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 15.1515 | 14.5985 | 0.29585 |
+
+# kvector, cvector to const_reference
+# (debug=off)
+2012-09-14 10:06:30 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 14.4928 | 14.7059 | 0.32733 |
+2012-09-14 10:07:00 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 15.0376 | 14.9254 | 0.32362 |
+# (debug=on)
+2012-09-14 10:11:13 | jcnsopc73  | macosx64, 2800 MHz      | 75188   | 4.61894 | 4.17537 | 0.07581 |
+2012-09-14 10:12:34 | jcnsopc73  | macosx64, 2800 MHz      | 73529.4 | 4.68384 | 4.0568  | 0.07654 |
+
+# adding virtual to BasicVector3D, Coordinates 3D
+# (debug=off)
+2012-09-14 16:59:24 | jcnsopc73  | macosx64, 2800 MHz      | 256410  | 14.7059 | 14.4928 | 0.32258 |
+2012-09-14 16:59:53 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 15.0376 | 14.8148 | 0.32154 |
+# (debug=on)
+2012-09-14 16:54:36 | jcnsopc73  | macosx64, 2800 MHz      | 82987.5 | 4.73934 | 4.17537 | 0.07604 |
+2012-09-14 16:56:09 | jcnsopc73  | macosx64, 2800 MHz      | 82304.5 | 4.70588 | 4.11523 | 0.07567 |
+
+# After Walter's "small adaptation fcdfe12e35a18531031796a61050b22c77bb5a0b Crystal.cpp, FormFactorCrystal.cpp
+#  (debug=off)
+2012-09-18 14:06:25 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 15.1515 | 14.7059 | 4.34783 |
+2012-09-18 14:06:31 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 15.1515 | 15.0376 | 4.34783 |
+# (debug=on)
+2012-09-18 13:51:36 | jcnsopc73  | macosx64, 2800 MHz      | 78431.4 | 4.42478 | 4.158   | 0.90909 |
+2012-09-18 13:54:59 | jcnsopc73  | macosx64, 2800 MHz      | 80321.3 | 4.70588 | 4.04858 | 0.90497 |
+
+2012-09-20 17:29:44 | jcnsopc73  | macosx64, 2800 MHz      | 82644.6 | 4.77327 | 4.29185 | 0.06997 |
+
+# state of the art (coherence, incoherence), threads=-1
+# debug=off
+2012-09-25 14:55:19 | surfer-30- | macosx64, 2800 MHz      | 263158  | 15.0376 | 14.7059 | 0.33444 |
+
+# playing with compilere keys
+# debug=off -ffast-math
+2012-09-25 16:50:37 | surfer-30- | macosx64, 2800 MHz      | 270270  | 18.3486 | 18.1818 | 0.36231 |
+# debug=off -ffast-math -o3 -msse3
+2012-09-25 16:54:40 | surfer-30- | macosx64, 2800 MHz      | 270270  | 18.5185 | 18.3486 | 0.36363 |
+# debug=off -ffast-math -o3 (that's out choice)
+2012-09-25 16:57:30 | surfer-30- | macosx64, 2800 MHz      | 256410  | 18.3486 | 18.018  | 0.36496 |
+# debug=off -o3
+2012-09-25 17:00:26 | surfer-30- | macosx64, 2800 MHz      | 270270  | 15.1515 | 14.7059 | 0.33898 |
+
+# current status of the art (debug=off);
+2012-09-26 12:07:01 | jcnsops73  | macosx64, 2800 MHz      | 273973  | 18.6916 | 18.3486 | 0.36429 |
+
+# Fast complex sin and cos in FullSphere ff (
+2012-09-27 10:40:50 | jcnsopc73  | macosx64, 2800 MHz      | 270270  | 18.018  | 18.1818 | 0.47281 |
+2012-09-27 10:41:25 | jcnsopc73  | macosx64, 2800 MHz      | 256410  | 17.6991 | 16.6667 | 0.42105 |
+2012-09-27 10:41:41 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 18.018  | 17.8571 | 0.46511 |
+
+# normal std sin and cos
+2012-09-27 10:42:17 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 17.094  | 17.2414 | 0.33613 |
+2012-09-27 10:42:29 | jcnsopc73  | macosx64, 2800 MHz      | 256410  | 17.5439 | 17.5439 | 0.34305 |
+
+# simultaneous calculation of sin and cos
+2012-09-27 10:59:06 | jcnsopc73  | macosx64, 2800 MHz      | 277778  | 18.1818 | 17.5439 | 0.48309 |
+2012-09-27 10:59:25 | jcnsopc73  | macosx64, 2800 MHz      | 277778  | 18.6916 | 18.3486 | 0.48661 |
+
+# Fast complex sin and cos which use std::sin
+2012-09-27 11:07:29 | jcnsopc73  | macosx64, 2800 MHz      | 273973  | 18.1818 | 18.018  | 0.4914  |
+2012-09-27 11:07:52 | jcnsopc73  | macosx64, 2800 MHz      | 273973  | 18.5185 | 18.1818 | 0.49019 |
+
+# current status of the art (not possible to trace what was changed)
+2012-10-08 17:36:40 | jcnsopc73  | macosx64, 2800 MHz      | 270270  | 13.986  | 13.8889 | 4.7619  |
+2012-10-08 17:37:28 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 13.986  | 13.986  | 4.7619  |
+2012-10-09 14:00:42 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 14.1844 | 13.986  | 4.7619  |
+
+# start rearanging ISample (Iparametrized)
+2012-10-10 15:38:43 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 14.1844 | 13.986  | 4.65116 |
+2012-10-10 15:39:04 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 14.0845 | 13.6986 | 4.65116 |
+
+# new insert in the map at MultiLayerDWBASimulation
+2012-10-10 17:56:51 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 13.6054 | 13.1579 | 5.12821 |
+2012-10-10 17:57:22 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 13.5135 | 13.5135 | 5       |
+# getRgetT
+2012-10-10 18:04:45 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 14.1844 | 13.8889 | 5.26316 |
+2012-10-10 18:05:12 | jcnsopc73  | macosx64, 2800 MHz      | 253165  | 13.986  | 13.4228 | 5.12821 |
+2012-10-11 14:59:48 | jcnsopc73  | macosx64, 2800 MHz      | 270270  | 14.9254 | 14.5985 | 5.26316 |
+
+# after refactoring to DoubleToPairOfComplexMap
+2012-10-12 16:22:18 | jcnsopc73  | macosx64, 2800 MHz      | 256410  | 14.1844 | 13.8889 | 5.26316 |
+
+# current status of the art
+2012-10-12 16:47:45 | jcnsopc73  | macosx64, 2800 MHz      | 253165  | 13.7931 | 13.5135 | 5       |
+
+# change frsenl coeff definition
+2012-10-15 14:33:42 | jcnsopc73  | macosx64, 2800 MHz      | 270270  | 14.7059 | 14.3885 | 5.40541 |
+2012-10-17 17:41:34 | jcnsopc73  | macosx64, 2800 MHz      | 263158  | 14.3885 | 14.1844 | 5.26316 |
+
+# current status of the art
+2012-10-19 15:35:44 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 13.4228 | 13.245  | 5.26316 |
+
+# current status of the art
+2012-11-19 16:17:56 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 15.2672 | 15.0376 | 5.26316 |
+2012-11-19 16:22:25 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 14.9254 | 14.5985 | 5.26316 |
+
+# current status of the art
+2012-11-29 11:09:34 | jcnsopc73  | macosx64, 2800 MHz      | 266667  | 14.7059 | 14.2857 | 5.26316 |
+
+2012-11-29 11:14:27 | jcnsopc73  | macosx64, 2800 MHz      | 253165  | 14.3885 | 14.2857 | 5.40541 |
+
+# fast-math is off; few performance changes in OutputData and BasicVector3D
+2012-12-13 10:06:39 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 19.802  | 19.2308 | 5.26316 |
+
+# lots of refactoring in OutputData axis
+2012-12-13 14:15:58 | jcnsopc73  | macosx64, 2800 MHz      | 253165  | 20      | 19.0476 | 5.55556 |
+2012-12-13 14:16:03 | jcnsopc73  | macosx64, 2800 MHz      | 259740  | 20.202  | 19.6078 | 5.55556 |
+
+# tons of minor changes followint static code analysis
+2013-01-10 13:48:20 | jcnsopc73  | macosx64, 2800 MHz      | 289855  | 22.4719 | 22.4719 | 5.26316 |
+2013-01-10 13:48:42 | jcnsopc73  | macosx64, 2800 MHz      | 285714  | 22.9885 | 22.2222 | 5.40541 |
+2013-01-14 14:03:24 | jcnsopc73  | macosx64, 2800 MHz      | 78740.2 | 2.23214 | 1.78891 | 0.38095 |
+2013-01-14 14:12:19 | jcnsopc73  | macosx64, 2800 MHz      | 90497.7 | 4.33839 | 3.71058 | 0.77519 |
+2013-01-14 14:17:29 | jcnsopc73  | macosx64, 2800 MHz      | 281690  | 21.0526 | 20.6186 | 5.12821 |
+2013-01-14 14:17:39 | jcnsopc73  | macosx64, 2800 MHz      | 281690  | 21.0526 | 21.0526 | 5.12821 |
+
+# status of the art, -O3 (compilation time = 2min 46 sec)
+2013-01-23 17:35:45 | jcnsopc73  | macosx64, 2800 MHz      | 273973  | 22.2222 | 21.7391 | 5.26316 |
+2013-01-23 17:35:51 | jcnsopc73  | macosx64, 2800 MHz      | 273973  | 22.2222 | 21.978  | 5.40541 |
+
+# status of the art, clang -O2 (compilation time = 2min 21 sec)
+2013-01-23 17:40:29 | jcnsopc73  | macosx64, 2800 MHz      | 281690  | 21.978  | 21.978  | 5.40541 |
+2013-01-23 17:40:36 | jcnsopc73  | macosx64, 2800 MHz      | 281690  | 21.978  | 21.978  | 5.40541 |
+
+# status of the art, clang -O2 (user time 2.25, cpu time 2.16)
+2013-01-31 15:54:17 | jcnsopc73  | macosx64, 2800 MHz      | 289855  | 24.3902 | 24.0964 | 6.06061 |
+2013-01-31 15:57:45 | jcnsopc73  | macosx64, 2800 MHz      | 289855  | 24.0964 | 24.0964 | 5.88235 |
+# clang -O2,g (user 2.55, cpu 2.43)
+2013-01-31 16:02:03 | jcnsopc73  | macosx64, 2800 MHz      | 281690  | 24.3902 | 24.0964 | 5.88235 |
+
+# Release-0.4 clang -O2
+2013-02-01 16:48:02 | jcnsopc73  | macosx64, 2800 MHz      | 281690  | 24.3902 | 23.5294 | 5.88235 |
+
+# Release-0.6 clang -O2
+2013-03-20 15:51:38 | jcnsopc73  | macosx64, 2800 MHz      | 281690  | 24.6914 | 24.3902 | 5.88235 |
+# after implementing logging system, it is slower, but it must be fluctuations
+# (and ./App --mesocrystal2 gives  25.57 (4 threads), 51.53 (1 thread))
+2013-03-20 16:50:02 | jcnsopc73  | macosx64, 2800 MHz      | 270270  | 22.9885 | 22.2222 | 5.71429 |
+
+# after changes in BasicVector3D from Joachim
+# (and ./App --mesocrystal2 gives  24.77 (4 threads), 54.66 (1 thread))
+2013-03-21 10:19:28 | jcnsopc73  | macosx64, 2800 MHz      | 285714  | 24.0964 | 22.9885 | 5.71429 |
+
+# after changes in BasicVector3D (no virtual destructor)
+# (and ./App --mesocrystal2 gives  23.74 (4 threads), 51.54 (1 thread))
+2013-03-22 17:05:17 | jcnsopc73  | macosx64, 2800 MHz      | 298507  | 24.0964 | 24.6914 | 6.25    |
+2013-03-22 17:05:32 | jcnsopc73  | macosx64, 2800 MHz      | 294118  | 24.3902 | 25      | 6.25    |
+
+2013-03-22 16:25:07 | o2         | linuxx8664gcc, 1600 MHz | 259740  | 11.6279 | 11.4943 | 3.50877 |
+2013-03-22 16:29:12 | o2         | linuxx8664gcc, 1600 MHz | 266667  | 10.8108 | 10.582  | 3.33333 |
+2013-03-22 16:29:45 | o2         | linuxx8664gcc, 3101 MHz | 263158  | 11.6279 | 11.4286 | 3.50877 |
+2013-03-22 16:31:37 | o2         | linuxx8664gcc, 1600 MHz | 263158  | 11.5607 | 11.1111 | 3.38983 |
+2013-03-22 16:31:46 | o2         | linuxx8664gcc, 3101 MHz | 263158  | 11.5607 | 11.3636 | 3.50877 |
+2013-03-22 16:31:57 | o2         | linuxx8664gcc, 1600 MHz | 263158  | 10.8696 | 10.6952 | 3.38983 |
+2013-03-23 13:01:20 | h4         | linuxx8664gcc, 2832 MHz | 183486  | 8.69565 | 8.54701 | 2.66667 |
+2013-03-23 14:04:18 | l1         | linux, 1000 MHz         | 68493.1 | 3.38409 | 3.31675 | 0.97561 |
+2013-03-25 18:03:03 | l1         | linux, 1833 MHz         | 68493.1 | 3.44828 | 3.37838 | 0.97561 |
+2013-03-25 18:07:45 | l1         | linux, 1000 MHz         | 70922   | 3.4904  | 3.41297 | 0.97561 |
+2013-03-26 08:04:42 | l1         | linux, 1000 MHz         | 68728.5 | 3.30579 | 3.24675 | 0.94786 |
+2013-03-26 08:06:02 | l1         | linux, 1000 MHz         | 70922   | 3.44234 | 3.33333 | 0.98522 |
+2013-03-26 08:06:23 | l1         | linux, 1000 MHz         | 68728.5 | 3.3389  | 3.37838 | 0.97087 |
+2013-03-26 12:07:57 | l1         | linux, 1000 MHz         | 68728.5 | 3.30579 | 3.22581 | 0.90497 |
+2013-03-26 12:09:16 | l1         | linux, 1000 MHz         | 69204.1 | 3.43643 | 3.35008 | 0.97087 |
+2013-03-27 09:05:23 | l1         | linux, 1000 MHz         | 68965.5 | 3.32779 | 3.35008 | 0.96153 |
+2013-03-27 09:06:51 | l1         | linux, 1833 MHz         | 68965.5 | 3.33333 | 3.34448 | 0.97087 |
+2013-03-27 15:36:29 | l1         | linux, 1000 MHz         | 68728.5 | 3.32226 | 3.25203 | 0.96153 |
+2013-03-27 15:36:48 | l1         | linux, 1000 MHz         | 69204.1 | 3.30579 | 3.23102 | 0.95238 |
+2013-03-27 18:46:58 | l1         | linux, 1000 MHz         | 68728.5 | 3.44234 | 3.36134 | 0.98039 |
+2013-03-27 18:47:19 | l1         | linux, 1000 MHz         | 69444.4 | 3.08642 | 3.04414 | 0.94339 |
+2013-03-27 19:17:16 | l1         | linux, 1000 MHz         | 69204.1 | 3.34448 | 3.367   | 0.97561 |
+2013-03-27 19:17:34 | l1         | linux, 1000 MHz         | 68965.5 | 3.44234 | 3.35008 | 0.98522 |
+2013-03-27 19:38:25 | l1         | linux, 1000 MHz         | 71174.4 | 3.33333 | 3.28947 | 0.81632 |
+2013-03-27 19:38:59 | l1         | linux, 1000 MHz         | 68965.5 | 3.46021 | 3.24675 | 0.97561 |
+2013-03-27 19:39:18 | l1         | linux, 1000 MHz         | 69204.1 | 3.44828 | 3.25203 | 0.98039 |
+2013-03-30 11:52:24 | h4         | linuxx8664gcc, 2832 MHz | 56497.2 | 2.53165 | 2.3753  | 0.52356 |
+2013-03-30 11:59:21 | h4         | linuxx8664gcc, 2832 MHz | 186916  | 8.3682  | 8.26446 | 2.5974  |
+2013-03-30 12:00:05 | h4         | linuxx8664gcc, 2832 MHz | 188679  | 8.3682  | 8.29875 | 2.5974  |
+2013-03-30 12:00:53 | h4         | linuxx8664gcc, 2832 MHz | 186916  | 8.29875 | 8.23045 | 2.5974  |
+
+# after multiple chnages (i.e. shared_ptr in transformation)
+# (and ./App --mesocrystal2 gives  24.69 (4 threads), 50.38 (1 thread))
+2013-04-04 11:39:49 | jcnsopc73  | macosx64, 2800 MHz      | 294118  | 22.4719 | 22.4719 | 6.06061 |
+2013-04-04 11:40:34 | jcnsopc73  | macosx64, 2800 MHz      | 294118  | 22.9885 | 21.7391 | 6.06061 |
+
+# release 0.7 (Workshop Release)
+# (and ./App --mesocrystal2 gives  23.25 (4 threads), 50.85 (1 thread))
+2013-04-08 20:48:26 | jcnsops73  | macosx64, 2800 MHz      | 294118  | 21.978  | 22.7273 | 6.25    |
+2013-04-08 20:48:32 | jcnsops73  | macosx64, 2800 MHz      | 289855  | 22.2222 | 22.7273 | 6.06061 |
+
+# added performance method for matrix calculation of layer wave amplitudes
+2013-05-07 16:05:21 | jcnsopc74  | macosx64, 2800 MHz      | 294118      | 11.976      | 11.976      | 3.63636     | 1.05263e+06 |
+2013-05-07 16:44:53 | jcnsopc74  | macosx64, 2800 MHz      | 298507      | 11.9048     | 11.8343     | 3.63636     | 1.05263e+06 |
+2013-07-12 13:13:46 | jcnsopc74  | macosx64, 2800 MHz      | 298507      | 23.5294     | 17.2414     | 5.71429     | 800000      |
+2013-07-17 17:19:14 | jcnsopc74  | macosx64, 2800 MHz      | 298507      | 23.8095     | 23.5294     | 6.06061     | 800000      |
+
+# before removal of LayerDecorator
+# (and ./App --mesocrystal2 gives  29.69 (4 threads), 51.13 (1 thread))
+2013-07-25 13:03:17 | jcnsopc73  | macosx64, 2800 MHz      | 281690      | 22.4719     | 22.2222     | 5.88235     | 666667      |
+2013-07-25 13:03:41 | jcnsopc73  | macosx64, 2800 MHz      | 281690      | 22.4719     | 22.2222     | 6.06061     | 689655      |
+
+# New Gennady's PC
+# (and ./App --mesocrystal2 gives  22.3 (8 threads), 129 sec (1 thread)) <--!! When it's one thread, cpu-freq is always 1.6GHz
+2013-07-25 13:11:27 | jcnsopc126 | linuxx8664gcc, 1600 MHz | 160000      | 4.37637     | 4.36681     | 1.37931     | 357143      |
+2013-07-25 13:12:38 | jcnsopc126 | linuxx8664gcc, 1600 MHz | 158730      | 4.37637     | 4.36681     | 1.37931     | 357143      |
+
+# after removal of LayerDecorator
+# (and ./App --mesocrystal2 gives  23.3 (8 threads), 126.8 sec (1 thread))
+2013-07-25 13:51:26 | jcnsopc126 | linuxx8664gcc, 1600 MHz | 173913      | 4.78469     | 4.75059     | 1.50376     | 392157      |
+2013-07-25 13:51:54 | jcnsopc126 | linuxx8664gcc, 1600 MHz | 173913      | 4.75059     | 4.73934     | 1.49254     | 400000      |
+
+# after IMaterial in Particle.h
+2013-07-26 17:36:49 | jcnsopc126 | linuxx8664gcc, 1600 MHz | 175439      | 4.81928     | 4.81928     | 1.51515     | 392157      |
+
+# release 0.8.2
+2013-07-30 14:41:27 | jcnsopc126 | linuxx8664gcc, 1600 MHz | 173913      | 4.6729      | 4.71698     | 1.50376     | 384615      |
+
+# release 0.9
+2013-08-23 17:06:15 | jcnsopc74  | macosx64, 2800 MHz      | 90909.1     | 4.77327     | 4.41501     | 0.947867    | 31348       |
+2013-08-28 17:56:35 | jcnsopc74  | macosx64, 2800 MHz      | 307692      | 23.2558     | 23.5294     | 6.06061     | 909091      |
+
+# relese 0.9.1
+2013-09-27 13:43:28 | jcnsopc73  | macosx64, 2800 MHz      |             | 21.2766     | 21.7391     | 1.44928     | 833333 |
+
+# Release 0.9.2
+2013-11-15 12:57:20 | jcnsopc73  | macosx64, 2800 MHz      | 18.6916     | 18.6916     | 1.25        | 714286      |
+
+# before removing "alpha_f", "phi_f"
+2013-11-25 15:17:52 | jcnsopc73  | macosx64, 2800 MHz      | 21.5054     | 21.2766     | 1.44928     | 800000      |
+2013-11-25 15:18:11 | jcnsopc73  | macosx64, 2800 MHz      | 21.0526     | 21.2766     | 1.44928     | 800000      |
+
+# after removing "alpha_f", "phi_f"
+2013-11-25 15:42:38 | jcnsopc73  | macosx64, 2800 MHz      | 21.978      | 22.9885     | 1.47059     | 740741      |
+2013-11-25 15:42:46 | jcnsopc73  | macosx64, 2800 MHz      | 22.2222     | 22.7273     | 1.41844     | 800000      |
+
+# after getting rid of shared_ptr in ITransformation3D
+2013-11-26 17:20:01 | jcnsopc73  | macosx64, 2800 MHz      | 23.8095     | 23.8095     | 1.48148     | 800000      |
+2013-11-26 17:20:51 | jcnsopc73  | macosx64, 2800 MHz      | 23.5294     | 23.5294     | 1.48148     | 769231      |
+
+# switch mesocrystal test to the one from SimulationFactory
+2013-12-09 17:51:20 | jcnsopc73  | macosx64, 2800 MHz      | 23.5294     | 23.2558     | 0.0356125   | 800000      |
+
+# PreRelease-0.9.3
+2013-12-19 16:11:26 | jcnsopc73  | macosx64, 2800 MHz      | 21.7391     | 21.2766     | 0.0319387   | 769231      |
+# Release 0.9.3
+2013-12-20 10:28:13 | jcnsopc73  | macosx64, 2800 MHz      | 21.0526     | 20.8333     | 0.0310078   | 666667      |
+
+# ------------------------------------------------------------------------------------------------------------------
+# switching to another performance test
+# ------------------------------------------------------------------------------------------------------------------
+
+# repeating old performance measurements --performance1
+# Gennady's OpenSuse
+# nthreads=8
+2014-01-13 16:30:06 | jcnsopc126 | linuxx8664gcc, 3502 MHz | 8.03213     | 8.19672     | 0.0166389   | 1e+06       |
+# Gennady's Maverick
+# nthreads=0
+2014-01-13 16:46:39 | jcnsopc73  | macosx64, 2800 MHz      | 7.7821      | 7.75194     | 0.0174368   | 740741      |
+# nthreads=1
+2014-01-13 16:53:12 | jcnsopc73  | macosx64, 2800 MHz      | 14.1844     | 14.1844     | 0.0289268   | 740741      |
+
+
+# new performance --performance2
+
+# Gennady's OpenSuse
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-01-13 16:30:20 | jcnsopc126 | linuxx8664gcc | 0  | 30.329   | 2.295        | 1.813        | 1.116        | 0.675        | 5.810        | 8.452        | 0.509        | 7.759        | 1.900        |
+# Gennady's Maverick
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-01-13 16:47:59 | jcnsopc73  | macosx64      | 0  | 60.978   | 5.024        | 1.488        | 1.735        | 0.976        | 11.958       | 17.915       | 0.647        | 18.293       | 2.942        |
+| 2014-01-13 16:50:24 | jcnsopc73  | macosx64      | 1  | 103.614  | 11.405       | 3.240        | 3.539        | 1.832        | 26.159       | 33.044       | 0.681        | 17.896       | 5.817        |
+
+
+# before trying complex bessel
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-01-16 18:05:52 | jcnsopc126 | linuxx8664gcc | 0  | 29.667   | 2.267        | 1.768        | 1.117        | 0.689        | 5.780        | 8.095        | 0.528        | 7.710        | 1.713        |
+# after switching to complex bessel (real bessel uses complex bessel)
+| 2014-01-16 18:21:50 | jcnsopc126 | linuxx8664gcc | 0  | 34.609   | 3.554        | 2.106        | 1.166        | 0.731        | 8.322        | 8.105        | 0.514        | 8.109        | 2.003        |
+
+
+2014-01-17 15:05:30 | herck-mint | linuxx8664gcc, 2500 MHz | 7.0922      | 7.32601     | 0.0148832   | 800000      |
+2014-01-17 15:14:07 | herck-mint | linuxx8664gcc, 800 MHz  | 10.3093     | 10.4167     | 0.0243724   | 571429      |
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-01-17 15:08:42 | herck-mint | linuxx8664gcc | 0  | 37.103   | 3.028        | 2.904        | 1.750        | 1.205        | 7.853        | 8.709        | 0.640        | 9.046        | 1.966        |
+| 2014-01-17 15:15:13 | herck-mint | linuxx8664gcc | 1  | 130.688  | 14.257       | 12.513       | 4.837        | 2.590        | 35.392       | 41.255       | 0.866        | 11.968       | 7.009        |
+# Release 0.9.4
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-02-07 14:11:35 | jcnsopc126 | linuxx8664gcc | 0  | 27.734   | 2.114        | 1.774        | 1.126        | 0.637        | 5.403        | 6.819        | 0.568        | 7.749        | 1.545        |
+
+# before implementing progress callback
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-03-19 10:28:21 | jcnsopc126 | linuxx8664gcc | 0  | 27.606   | 2.042        | 1.772        | 1.129        | 0.683        | 5.311        | 6.840        | 0.518        | 7.757        | 1.554        |
+
+# after implementing quick and dirty calback with mutex lock
+| 2014-03-19 17:21:59 | jcnsopc126 | linuxx8664gcc | 0  | 27.394   | 2.038        | 1.776        | 1.128        | 0.668        | 5.205        | 6.787        | 0.501        | 7.711        | 1.581        |
+
+# before removing MaterialManager
+| 2014-03-25 15:08:26 | jcnsopc126 | linuxx8664gcc | 0  | 27.546   | 2.061        | 1.786        | 1.117        | 0.661        | 5.217        | 6.858        | 0.553        | 7.722        | 1.572        |
+
+# after changing Layer, Particle to own materials and removing MaterialManager
+| 2014-03-26 15:09:45 | jcnsopc126 | linuxx8664gcc | 0  | 27.577   | 2.091        | 1.761        | 1.120        | 0.629        | 5.203        | 6.902        | 0.506        | 7.813        | 1.553        |
+
+# Release 0.9.5
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-04-11 13:27:09 | jcnsopc126 | linuxx8664gcc | 0  | 27.248   | 1.053        | 1.865        | 1.100        | 0.634        | 5.280        | 7.113        | 0.512        | 8.194        | 1.496        |
+
+# Release 0.9.5
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-04-11 13:27:09 | jcnsopc126 | linuxx8664gcc | 0  | 27.248   | 1.053        | 1.865        | 1.100        | 0.634        | 5.280        | 7.113        | 0.512        | 8.194        | 1.496        |
+
+# Release 0.9.6
+| 2014-07-24 10:43:37 | jcnsopc126 | linuxx8664gcc | 0  | 26.393   | 1.050        | 1.708        | 1.074        | 0.633        | 5.276        | 6.748        | 0.503        | 7.888        | 1.513        |
+
+# Our current development
+| 2014-07-24 15:11:58 | jcnsopc126 | linuxx8664gcc | 0  | 37.823   | 1.373        | 1.981        | 1.323        | 0.788        | 6.665        | 15.652       | 0.529        | 7.804        | 1.708        |
+
+# Release 0.9.7
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | magcyl2      |
+| 2014-07-31 14:39:11 | jcnsopc126 | linuxx8664gcc | 0  | 37.497   | 1.324        | 2.007        | 1.381        | 0.764        | 6.631        | 15.395       | 0.489        | 7.759        | 1.747        |
+
+
+# playing with axes
+#old axes
+| 2014-08-04 17:23:06 | jcnsopc126 | linuxx8664gcc | 0  | 36.830   | 1.304        | 1.971        | 1.316        | 0.780        | 6.454        | 15.023       | 0.483        | 7.772        | 1.727        |
+# new axes
+| 2014-08-04 17:20:21 | jcnsopc126 | linuxx8664gcc | 0  | 36.301   | 1.281        | 1.983        | 1.316        | 0.777        | 6.341        | 14.672       | 0.493        | 7.744        | 1.693        |
+| 2014-08-04 17:21:30 | jcnsopc126 | linuxx8664gcc | 0  | 36.422   | 1.275        | 1.962        | 1.326        | 0.779        | 6.321        | 14.805       | 0.494        | 7.734        | 1.725        |
+
+# mesocrystal test is changed, new axes
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2014-08-08 12:59:08 | jcnsopc126 | linuxx8664gcc | 0  | 27.425   | 1.385        | 2.177        | 1.491        | 0.850        | 7.095        | 4.193        | 0.494        | 7.839        | 1.900        |
+| 2014-08-08 13:00:40 | jcnsopc126 | linuxx8664gcc | 0  | 26.856   | 1.333        | 2.174        | 1.467        | 0.833        | 6.910        | 4.074        | 0.494        | 7.756        | 1.815        |
+
+# before profiling
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2014-08-13 14:26:00 | jcnsopc126 | linuxx8664gcc | 0  | 26.218   | 1.321        | 2.063        | 1.386        | 0.834        | 6.561        | 3.807        | 0.487        | 7.879        | 1.880        |
+
+# Release 0.9.8
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2014-08-28 13:15:59 | jcnsopc126 | linuxx8664gcc | 0  | 26.373   | 1.316        | 2.104        | 1.420        | 0.800        | 6.685        | 3.848        | 0.487        | 7.860        | 1.852        |
+
+# Before Walter's refactoring of SpecularInfo
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2014-09-18 11:40:26 | jcnsopc126 | linuxx8664gcc | 0  | 24.029   | 1.272        | 2.001        | 1.235        | 0.665        | 6.023        | 2.747        | 0.495        | 7.842        | 1.751        |
+| 2014-09-18 11:41:47 | jcnsopc126 | linuxx8664gcc | 0  | 23.950   | 1.159        | 1.904        | 1.261        | 0.664        | 6.029        | 2.806        | 0.506        | 7.861        | 1.760        |
+
+# After Walter's refactoring
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2014-09-18 12:16:34 | jcnsopc126 | linuxx8664gcc | 0  | 21.466   | 0.993        | 1.883        | 1.255        | 0.659        | 5.132        | 1.609        | 0.494        | 7.765        | 1.674        |
+| 2014-09-18 12:16:59 | jcnsopc126 | linuxx8664gcc | 0  | 21.574   | 1.022        | 1.895        | 1.232        | 0.673        | 5.180        | 1.611        | 0.490        | 7.792        | 1.679        |
+
+# Release 0.9.9
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2014-10-29 11:23:54 | jcnsopc63  | linuxx8664gcc | 0  | 18.662   | 0.277        | 2.183        | 1.502        | 0.589        | 2.106        | 1.687        | 0.495        | 8.053        | 1.770        |
+
+# Release 1.0.0
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2015-01-30 11:00:40 | jcnsopc126 | linuxx8664gcc | 0  | 18.049   | 0.388        | 1.972        | 1.348        | 0.422        | 2.152        | 1.709        | 0.527        | 7.945        | 1.586
+
+# Release 1.0.0
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2015-01-30 11:26:18 | jcnsopc126 | linuxx8664gcc | 0  | 18.951   | 0.360        | 2.433        | 1.451        | 0.416        | 2.214        | 1.808        | 0.530        | 8.132        | 1.607        |
+
+# After introducing zero pointer for roughness
+| 2015-03-10 14:23:51 | jcnsopc126 | linuxx8664gcc | 0  | 15.987   | 0.352        | 1.709        | 1.059        | 0.468        | 2.192        | 0.264        | 0.522        | 7.944        | 1.478        |
+| 2015-03-10 14:24:10 | jcnsopc126 | linuxx8664gcc | 0  | 16.347   | 0.358        | 1.727        | 1.061        | 0.477        | 2.419        | 0.278        | 0.576        | 7.953        | 1.498        |
+
+# After removal polarized intensity map initialization
+| 2015-03-10 17:00:39 | jcnsopc126 | linuxx8664gcc | 0  | 15.958   | 0.362        | 1.696        | 1.007        | 0.409        | 2.212        | 0.279        | 0.522        | 7.856        | 1.615        |
+| 2015-03-10 17:00:58 | jcnsopc126 | linuxx8664gcc | 0  | 15.996   | 0.358        | 1.667        | 1.009        | 0.412        | 2.253        | 0.274        | 0.525        | 7.881        | 1.617
+# Release 1.1.0
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2015-04-21 17:02:18 | jcnsopc63  | linuxx8664gcc | 0  | 16.467   | 0.316        | 1.843        | 1.164        | 0.545        | 2.182        | 0.395        | 0.495        | 8.030        | 1.496        |
+
+# Pre Release 1.2.0 (changes of RT from Walter)
+| 2015-06-08 14:39:32 | jcnsopc126 | linuxx8664gcc | 0  | 18.465   | 0.369        | 2.089        | 1.308        | 0.558        | 2.643        | 0.400        | 0.550        | 8.918        | 1.630
+| 2015-06-08 14:41:16 | jcnsopc126 | linuxx8664gcc | 0  | 18.463   | 0.399        | 2.080        | 1.311        | 0.532        | 2.614        | 0.422        | 0.585        | 8.895        | 1.624        |
+
+
+# Release 1.2.0
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2015-06-10 15:25:16 | jcnsopc63  | linuxx8664gcc | 0  | 17.656   | 0.341        | 2.135        | 1.329        | 0.579        | 2.641        | 0.166        | 0.522        | 8.396        | 1.547        |
+
+# After Walter's refactoring for transformations, before I clean-up old standard samples
+
+| date                | hostname   | sysinfo       | tr | total    | isgisaxs02   | isgisaxs06a  | isgisaxs09b  | isgisaxs11   | isgisaxs15   | mesocrystal0 | specmatrix   | specmagnetic | polmagcylind |
+| 2015-06-29 17:01:05 | jcnsopc126 | linuxx8664gcc | 0  | 18.910   | 0.313        | 2.267        | 1.476        | 0.767        | 2.600        | 0.200        | 0.627        | 8.805        | 1.856        |
+| 2015-06-29 17:01:28 | jcnsopc126 | linuxx8664gcc | 0  | 19.158   | 0.326        | 2.485        | 1.482        | 0.758        | 2.625        | 0.199        | 0.638        | 8.796        | 1.850
+
+# New performance test
+
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-06-30 15:16:12 | jcnsopc126 | linuxx8664gcc | 0  | 20.120   | 1.686        | 1.156        | 1.947        | 0.974        | 2.814        | 1.177        | 2.055        | 3.835        | 1.831        | 2.644        |
+| 2015-06-30 15:16:37 | jcnsopc126 | linuxx8664gcc | 0  | 20.044   | 1.678        | 1.176        | 2.018        | 0.979        | 2.829        | 1.202        | 2.069        | 3.835        | 1.823        | 2.436        |
+| 2015-06-30 15:17:36 | jcnsopc126 | linuxx8664gcc | 0  | 20.347   | 1.699        | 1.319        | 2.010        | 1.003        | 2.822        | 1.197        | 2.031        | 3.861        | 1.890        | 2.515        |
+| 2015-06-30 15:19:12 | jcnsopc126 | linuxx8664gcc | 0  | 19.853   | 1.684        | 1.156        | 1.951        | 0.979        | 2.815        | 1.187        | 2.026        | 3.798        | 1.832        | 2.426        |
+
+# Release 1.3.0
+
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-07-31 14:38:50 | jcnsopc63  | linuxx8664gcc | 0  | 15.590   | 1.537        | 0.977        | 1.673        | 0.855        | 2.524        | 0.996        | 1.874        | 1.505        | 1.581        | 2.068        |
+
+# after some development, why it is slower now not clear (there was minor OutputData refactoring
+
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-09-23 14:54:52 | jcnsopc126 | linuxx8664gcc | 0  | 17.658   | 1.692        | 1.148        | 1.602        | 0.983        | 2.793        | 1.174        | 2.163        | 1.742        | 1.868        | 2.495        |
+
+# after masking
+
+| 2015-09-28 17:19:17 | jcnsopc126 | linuxx8664gcc | 0  | 21.595   | 2.108        | 1.412        | 1.888        | 1.275        | 3.615        | 1.496        | 2.478        | 2.139        | 2.340        | 2.845
+
+# working on mask performance
+| 2015-09-29 11:41:26 | jcnsopc126 | linuxx8664gcc | 0  | 18.188   | 1.793        | 1.172        | 1.647        | 1.012        | 2.945        | 1.290        | 2.197        | 1.798        | 1.849        | 2.486
+| 2015-09-29 11:46:58 | jcnsopc126 | linuxx8664gcc | 0  | 17.975   | 1.852        | 1.165        | 1.586        | 0.977        | 2.834        | 1.183        | 2.136        | 1.860        | 1.879        | 2.502
+
+# after RectangularDetector refactoring
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-10-21 10:42:06 | jcnsopc126 | linuxx8664gcc | 0  | 19.284   | 1.781        | 1.333        | 1.785        | 1.133        | 3.145        | 1.404        | 2.156        | 1.847        | 1.884        | 2.818        |
+| 2015-10-21 10:42:30 | jcnsopc126 | linuxx8664gcc | 0  | 19.756   | 1.737        | 1.336        | 1.842        | 1.200        | 3.262        | 1.397        | 2.116        | 1.912        | 2.013        | 2.942
+
+# PreRelease state. Seems that much worser. Simulation normalize?
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-10-28 17:04:26 | jcnsopc126 | linuxx8664gcc | 0  | 25.693   | 2.573        | 1.693        | 2.410        | 1.472        | 4.134        | 1.748        | 2.856        | 2.376        | 2.715        | 3.716
+
+# PreRelease. Moved checkPolarizationPresent() out of the loop.
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2015-10-29 09:17:30 | jcnsopc126 | linuxx8664gcc | 0  | 20.586   | 2.386        | 1.166        | 1.773        | 0.890        | 3.449        | 1.195        | 2.570        | 1.687        | 2.452        | 3.020        |
+
+# PreRelease. If I try to backup mP_specular_info->getInCoefficients(alpha_i, 0.0, wavelength)); in InterferenceFunctionStrategy
+| 2015-10-29 09:41:25 | jcnsopc126 | linuxx8664gcc | 0  | 19.921   | 2.416        | 0.984        | 1.654        | 0.778        | 3.333        | 1.027        | 2.923        | 1.505        | 2.359        | 2.942        |
+
+# PreRelease-1.5.0
+| date                | hostname   | sysinfo       | tr | total    | MultiLayer   | CylindersInD | RotatedPyram | CoreShell    | SquareLattic | RadialParaCr | HexParaCryst | SSCA         | Mesocrystal  | PolMagCyl    |
+| 2016-02-11 14:10:57 | jcnsopc126 | linuxx8664gcc | 0  | 18.247   | 1.981        | 0.920        | 1.418        | 0.696        | 2.578        | 0.950        | 3.899        | 1.381        | 2.008        | 2.417        |
+
+| date                | hostname  | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-05-25 12:50:59 | jcnsopc22 | Linux x86_64 | 2.7    | 126.2680  | 19.0747    | 2.9620     | 0.7566          | 3.5780          | 0.5746    | 2.2319        | 0.7519            | 2.6683         | 1.0811 | 1.7840      | 1.8264    | 0.8599    |
+
+
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-12 14:58:56 | scgsun   | Linux x86_64 | 2.7    | 121.8000  | 18.9031    | 2.8314     | 0.6853          | 3.3220          | 0.5178    | 2.2989        | 0.7084            | 3.1807         | 1.0054 | 1.7599      | 1.7037    | 0.8896    |
+| 2016-10-12 15:00:12 | scgsun   | Linux x86_64 | 2.7    | 121.7560  | 19.1301    | 2.9637     | 0.6960          | 3.3558          | 0.5273    | 2.3114        | 0.7187            | 3.1900         | 1.0233 | 1.7531      | 1.7332    | 0.8575    |
+
+# removed extra call of updateIntensityMap()
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-12 15:08:03 | scgsun   | Linux x86_64 | 2.7    | 122.8240  | 21.1832    | 3.8394     | 0.7716          | 3.4871          | 0.6384    | 2.5385        | 0.8021            | 3.3587         | 1.1122 | 1.8113      | 1.8655    | 0.9583    |
+| 2016-10-12 15:15:12 | scgsun   | Linux x86_64 | 2.7    | 121.6320  | 18.9844    | 2.8292     | 0.6947          | 3.3337          | 0.5314    | 2.3015        | 0.7091            | 3.2037         | 1.0140 | 1.7533      | 1.7217    | 0.8920    |
+
+
+# after the switch to std::move in SimulationElement
+| 2016-10-14 08:51:54 | scgsun   | Linux x86_64 | 2.7    | 122.8880  | 19.3683    | 2.8577     | 0.7296          | 3.3728          | 0.5629    | 2.3569        | 0.7555            | 3.3065         | 1.0475 | 1.7642      | 1.7467    | 0.8680    |
+
+# after switch to SimulationAreaIterator
+| 2016-10-17 11:28:02 | scgsun   | Linux x86_64 | 2.7    | 122.3960  | 19.9584    | 3.0328     | 0.7849          | 3.4156          | 0.5976    | 2.3843        | 0.7670            | 3.4331         | 1.0687 | 1.7839      | 1.8056    | 0.8850    |
+
+# before starting experimenting with move
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-19 16:24:06 | scgsun   | Linux x86_64 | 2.7    | 121.9280  | 20.5678    | 3.2099     | 0.8127          | 3.5007          | 0.6635    | 2.5303        | 0.8397            | 3.2550         | 1.1002 | 1.8465      | 1.9096    | 0.8998    |
+| 2016-10-19 16:26:39 | scgsun   | Linux x86_64 | 2.7    | 122.0600  | 20.1381    | 2.8649     | 0.8167          | 3.5113          | 0.6651    | 2.5195        | 0.8412            | 3.2485         | 1.0922 | 1.8063      | 1.8740    | 0.8984    |
+
+# switch to std::move in push_back(SimulationElement) and move constructor
+
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-19 17:39:20 | scgsun   | Linux x86_64 | 2.7    | 122.0200  | 19.8183    | 3.0563     | 0.7435          | 3.4176          | 0.5715    | 2.4363        | 0.7578            | 3.2653         | 1.0309 | 1.8148      | 1.8095    | 0.9147    |
+| 2016-10-19 17:39:43 | scgsun   | Linux x86_64 | 2.7    | 121.4320  | 19.3674    | 2.8519     | 0.7252          | 3.4087          | 0.5557    | 2.4153        | 0.7385            | 3.2286         | 1.0009 | 1.7881      | 1.7605    | 0.8939    |
+
+# IDetector::getIntensityData refactoring
+
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-21 10:59:30 | scgsun   | Linux x86_64 | 2.7    | 121.0680  | 18.9790    | 2.8173     | 0.7080          | 3.3343          | 0.5471    | 2.3242        | 0.7298            | 3.1912         | 0.9791 | 1.7649      | 1.7282    | 0.8548    |
+| 2016-10-21 10:59:54 | scgsun   | Linux x86_64 | 2.7    | 121.1520  | 19.0818    | 2.7965     | 0.7001          | 3.3864          | 0.5668    | 2.3523        | 0.7130            | 3.1896         | 0.9822 | 1.7599      | 1.7774    | 0.8578    |
+
+# after OutputData iterator and Masks cleanup
+
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-24 12:47:54 | scgsun   | Linux x86_64 | 2.7    | 121.6880  | 19.1974    | 2.8407     | 0.7347          | 3.3421          | 0.5651    | 2.3444        | 0.7357            | 3.2363         | 0.9956 | 1.7685      | 1.7709    | 0.8634    |
+| 2016-10-24 12:48:34 | scgsun   | Linux x86_64 | 2.7    | 122.7240  | 19.2525    | 2.8169     | 0.7120          | 3.4839          | 0.5526    | 2.3417        | 0.7331            | 3.2394         | 1.0024 | 1.7585      | 1.7631    | 0.8490    |
+
+# after removal of GISASSimulation::updateIntensityMap
+
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-24 13:27:17 | scgsun   | Linux x86_64 | 2.7    | 120.7920  | 19.2657    | 2.8666     | 0.6583          | 3.3504          | 0.4888    | 2.3131        | 0.6682            | 3.2659         | 1.1200 | 1.9051      | 1.7457    | 0.8838    |
+
+
+# after switch to SimulationAreaIterator based on ROI
+
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-10-25 17:19:59 | scgsun   | Linux x86_64 | 2.7    | 121.3720  | 18.5189    | 2.8794     | 0.5891          | 3.2295          | 0.4259    | 2.2341        | 0.5990            | 3.4064         | 0.8513 | 1.7682      | 1.6408    | 0.8952    |
+| 2016-10-25 17:20:43 | scgsun   | Linux x86_64 | 2.7    | 120.4280  | 18.1926    | 2.8557     | 0.5722          | 3.2113          | 0.4582    | 2.2046        | 0.5936            | 3.2125         | 0.8494 | 1.7489      | 1.6168    | 0.8694    |
+
+# just before Release 1.7
+
+| date                | hostname | sysinfo      | python | total cpu | total wall | MultiLayer | CylindersInDWBA | RotatedPyramids | CoreShell | SquareLattice | RadialParaCrystal | HexParaCrystal | SSCA   | Mesocrystal | PolMagCyl | Custom FF |
+| 2016-11-11 14:01:06 | scgsun   | Linux x86_64 | 2.7    | 120.5640  | 18.1298    | 2.8138     | 0.5744          | 3.1869          | 0.4087    | 2.2109        | 0.5960            | 3.2414         | 0.8705 | 1.7517      | 1.6192    | 0.8565    |
+| 2016-11-11 14:01:41 | scgsun   | Linux x86_64 | 2.7    | 120.7520  | 18.1567    | 2.8182     | 0.5756          | 3.2338          | 0.4107    | 2.1995        | 0.5951            | 3.2290         | 0.8655 | 1.7562      | 1.6096    | 0.8635    |
+
diff --git a/dev-tools/math/fftest/Makefile b/dev-tools/math/fftest/Makefile
new file mode 100644
index 0000000..16b5785
--- /dev/null
+++ b/dev-tools/math/fftest/Makefile
@@ -0,0 +1,15 @@
+CC = g++ -ggdb -O3 -std=c++11 -Wall -I/G/ba/Core/FormFactors/ -I/G/ba/Core/Geometry -I/G/ba/Core/Tools -I/G/ba/Core/Samples -I/usr/include/eigen3
+
+# LIBS=           -lm -lgslcblas -lgsl -lyaml-cpp
+
+BIND = ./
+
+all: $(BIND)runff
+
+# source from BornAgain overwrites -lBornAgainCore, cf http://stackoverflow.com/questions/36667429
+SRC = runff.cpp /G/ba/Core/FormFactors/FormFactorPolyhedron.cpp
+
+DIAG = -D POLYHEDRAL_DIAGNOSTIC=ON
+
+$(BIND)runff: $(SRC)
+	$(CC) $(DIAG) -L../../../build/lib/ -l:_libBornAgainCore.so -o $(BIND)runff $(SRC)
diff --git a/dev-tools/math/fftest/ff_diff.py b/dev-tools/math/fftest/ff_diff.py
new file mode 100755
index 0000000..72bd9d4
--- /dev/null
+++ b/dev-tools/math/fftest/ff_diff.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python3
+
+import re, sys
+from math import sqrt
+
+def read_file( fn ):
+    fd = open( fn, 'r' )
+    ti = fd.read().rstrip()
+    fd.close
+    ti = re.sub( r'^\s*#.*\n', '', ti, re.M )
+    return ti.split("\n")
+
+## Main
+
+maxdiff = 0
+fpair = sys.argv[1:3]
+tpair = [ read_file( fn ) for fn in fpair ]
+if len(tpair[0])!=len(tpair[1]):
+    raise Exception( "tables differ in size" )
+for i in range(len(tpair[0])):
+    dpair = [ re.split(r'\s+', t[i]) for t in tpair]
+    if len(dpair[0])!=len(dpair[1]):
+        raise Exception( "lines %i differ in size" % i )
+    for j in range(5):
+        if dpair[0][j]!=dpair[1][j]:
+            raise Exception( "lines %i differ in parameter %i" % (i,j) )
+    xypair = [ [ float(d[8]), float(d[9]) ] for d in dpair ]
+    out_of_range = False
+    for x,y in xypair:
+        if abs(x)>1e166 or abs(y)>1e166:
+            out_of_range = True
+            break
+    if out_of_range:
+        print( tpair[0][i] )
+        print( tpair[1][i] )
+        print( "result too large" )
+        continue
+    apair = [ sqrt(x**2+y**2) for x,y in xypair ]
+    aval = (apair[0] + apair[1])/2
+    diff = max( abs(xypair[0][0]-xypair[1][0]), abs(xypair[0][1]-xypair[1][1]) ) / aval
+    maxdiff = max( maxdiff, diff )
+    if diff>3.e-12:
+        print( " ".join(dpair[0]+dpair[1][8:]+["%g" % diff]) )
+print( "# maxdiff = %g" % maxdiff )
diff --git a/dev-tools/math/fftest/limit-run b/dev-tools/math/fftest/limit-run
new file mode 100644
index 0000000..ce9f0cc
--- /dev/null
+++ b/dev-tools/math/fftest/limit-run
@@ -0,0 +1,26 @@
+# no q expansion, hence sum over faces, then no expansion in qpa
+runff 2 7 4 1e-99  1e-99 0 > x0
+
+# no q expansion, hence sum over faces, then expand in qpa
+runff 2 7 4 1e-99  1e99   2 > a1
+runff 2 7 4 1e-99  1e99   4 > a2
+runff 2 7 4 1e-99  1e99   6 > a3
+runff 2 7 4 1e-99  1e99   8 > a4
+runff 2 7 4 1e-99  1e99  10 > a5
+runff 2 7 4 1e-99  1e99  12 > a6
+runff 2 7 4 1e-99  1e99  14 > a7
+runff 2 7 4 1e-99  1e99  16 > a8
+runff 2 7 4 1e-99  1e99  18 > a9
+runff 2 7 4 1e-99  1e99  20 > as
+
+# q expansion (no need for qpa expansion)
+runff 2 7 4 1e99   1e-99  2 > h1
+runff 2 7 4 1e99   1e-99  4 > h2
+runff 2 7 4 1e99   1e-99  6 > h3
+runff 2 7 4 1e99   1e-99  8 > h4
+runff 2 7 4 1e99   1e-99 10 > h5
+runff 2 7 4 1e99   1e-99 12 > h6
+runff 2 7 4 1e99   1e-99 14 > h7
+runff 2 7 4 1e99   1e-99 16 > h8
+runff 2 7 4 1e99   1e-99 18 > h9
+runff 2 7 4 1e99   1e-99 20 > hs
diff --git a/dev-tools/math/fftest/polyh_test.cpp b/dev-tools/math/fftest/polyh_test.cpp
new file mode 100644
index 0000000..d74cfc1
--- /dev/null
+++ b/dev-tools/math/fftest/polyh_test.cpp
@@ -0,0 +1,255 @@
+// Form factor computation: test program
+// JWu 2016
+
+// Reference:
+//   Joachim Wuttke
+//   "Form factor (Fourier shape transform) of polygon and polyhedron."
+
+// To use these tests, FormFactorPolyhedron.cpp must be compiled
+// with flag -D POLYHEDRAL_DIAGNOSTIC=ON
+
+#include <cassert>
+#include <iostream>
+#include <iomanip>
+#include <complex>
+#include <vector>
+
+#include "ParticleShapes.h"
+
+using std::cout;
+using std::cerr;
+
+static complex_t I(0.,1.);
+static double eps(2e-16);
+
+Diagnosis diagnosis;
+
+int nshape = 11;
+
+//! Returns a polyhedron, according to given code
+
+IFormFactorBorn* make_polyhedron( int ishape )
+{
+    if       ( ishape==0 ) {
+        return new FormFactorDodecahedron(3.);
+    } else if( ishape==1 ) {
+        return new FormFactorIcosahedron(15.);
+    } else if( ishape==2 ) { // true tetrahedron
+        double alpha = 72 * Units::degree;
+        return new FormFactorTetrahedron(1., tan(alpha)/2/sqrt(3), alpha);
+    } else if( ishape==3 ) { // tetrahedral frustum
+        double alpha = 72 * Units::degree;
+        return new FormFactorTetrahedron(1., 0.5*tan(alpha)/2/sqrt(3), alpha);
+    } else if( ishape==4 ) {
+        double alpha = 72 * Units::degree;
+        return new FormFactorCone6(10., 10., alpha);
+    } else if( ishape==5 ) {
+        double alpha = 72 * Units::degree;
+        return new FormFactorPyramid(10., 10., alpha);
+    } else if( ishape==6 ) {
+        return new FormFactorPrism3(1., 10.);
+    } else if( ishape==7 ) {
+        return new FormFactorPrism3(10., 1.);
+    } else if( ishape==8 ) {
+        return new FormFactorPrism6(1., 1.);
+    } else if( ishape==9 ) {
+        return new FormFactorTruncatedCube(4., 1.);
+    } else if( ishape==10 ) {
+        double alpha = 72 * Units::degree;
+        return new FormFactorCuboctahedron(1., 1., .8, alpha);
+    } else
+        throw "Shape not implemented";
+}
+
+//! Bisect between two q's to find possible discontinuities
+
+void bisect(
+    const IFormFactorBorn* polyh, const int ishape, const double q0mag,
+    const cvector_t qi, const complex_t ri, const Diagnosis di,
+    const cvector_t qf, const complex_t rf, const Diagnosis df,
+    double& maxrelstep )
+{
+    assert( di!=df );
+    if( (qi-qf).mag()<4*eps*q0mag ) {
+        // narrowed down to minimal step, now check for continuity
+        double aval = (std::abs(ri) + std::abs(rf))/2;
+        double relstep = std::abs(ri-rf)/aval;
+        maxrelstep = std::max( maxrelstep, relstep );
+        if( relstep>1e-9 ){
+            cerr<<"ishape="<<ishape<<": step "<<std::setprecision(8)<<relstep<<" @ "<<std::setprecision(16)<<aval<<" for "<<di<<"->"<<df<<" at q between "<< std::setprecision(16)<<qi<<" and "<<qf<<"\n";
+        }
+        return;
+    }
+    cvector_t q2 = (qi + qf)/2.;
+    complex_t r2 = polyh->evaluate_for_q(q2);
+    Diagnosis d2 = diagnosis;
+    if( d2!=di )
+        bisect( polyh, ishape, q0mag, qi, ri, di, q2, r2, d2, maxrelstep );
+    if( d2!=df )
+        bisect( polyh, ishape, q0mag, q2, r2, d2, qf, rf, df, maxrelstep );
+}
+
+//! Computes form factor or runs bisection, and prints result according to outfilter.
+
+void run(
+    const IFormFactorBorn* polyh,
+    const double step, const int ishape, const cvector_t q, const cvector_t qlast,
+    const int outfilter, double& maxrelstep )
+{
+    complex_t ret;
+    static complex_t last_ret = 0;
+    static Diagnosis last_diag;
+    Diagnosis diag = diagnosis;
+    ret = polyh->evaluate_for_q(q);
+
+    if( outfilter==6 ) {
+        if( qlast!=cvector_t() && diag!=last_diag )
+            bisect( polyh, ishape, q.mag(), q, ret, diag, qlast, last_ret, last_diag, maxrelstep );
+        last_ret = ret;
+        last_diag = diag;
+        return;
+        throw "define POLYHEDRAL_DIAGNOSTIC to run continuity test";
+    }
+    if( outfilter==9 )
+        return;
+    cout << std::setprecision(16) << step << " " << ishape << " " << std::setprecision(12) <<
+        q[0].real() << " " << q[0].imag() << " " <<
+        q[1].real() << " " << q[1].imag() << " " <<
+        q[2].real() << " " << q[2].imag() << " " << std::setprecision(12);
+    if     ( outfilter==0 )
+        cout << ret;
+    else if( outfilter==1 )
+        cout << ret.real();
+    else if( outfilter==2 )
+        cout << ret.imag();
+    else if( outfilter==7 || outfilter==8 )
+        cout << ret.real() << " " << ret.imag();
+    else
+        throw "invalid outfilter";
+#ifdef POLYHEDRAL_DIAGNOSTIC
+    cout << " " << diagnosis.nExpandedFaces << " " << diagnosis.maxOrder << "\n";
+#endif
+}
+
+void test_loop( int outfilter )
+{
+    double totmaxrelstep = 0;
+    static int n_qdir = 10;
+    int nsteps;
+    if( outfilter==7 )
+        nsteps = 201;
+    else if( outfilter==8 )
+        nsteps = 17;
+    else
+        nsteps = 3001;
+    if( !(nsteps&1) )
+        throw "nsteps must be odd";
+    std::vector<double> steps(nsteps);
+    steps[0] = 0;
+    steps[nsteps-1] = 1;
+    int n2 = (nsteps-1)/2;
+    steps[n2] = .5;
+    for( int i=1; i<n2; ++i ){
+        steps[i] = pow(.5, (i-1)/((double)(n2-1))) * pow(1e-12, (n2-i)/((double)(n2-1)));
+        steps[nsteps-1-i] = 1-steps[i];
+    }
+    double steps_short[3] = { 0., 1e-12, 1e-6 };
+    cvector_t qdirs[n_qdir+1] = {
+        { 1., 0., 0. },
+        { 0., 1.+.01*I, 0. },
+        { .001*I, 1., 1. },
+        { 1.+.01*I, 1.-.01*I, 0. },
+        { 0., 0., 1. },
+        { 1., 1., 1. },
+        { 1., 0., 1. },
+        { 1., 2., 0. },
+        { 0., 2., 3. },
+        { 1., 2.71813+0.1*I, 3.14158-0.2*I, },
+        { -200.+I, 30000.-I, 1. } };
+    for( int ishape=0; ishape<nshape; ++ishape ){
+        double maxrelstep = 0;
+        IFormFactorBorn* polyh( make_polyhedron( ishape ) );
+        // For different directions ...
+        for( int idx_qdir=0; idx_qdir<n_qdir; ++idx_qdir ){
+            for( int irot=0; irot<3; ++irot ){
+                double rot = steps_short[irot];
+                cvector_t uq = ((1-rot)*qdirs[idx_qdir] + rot*qdirs[idx_qdir+1]).unit();
+                // ... sweep |q|
+                cvector_t qlast;
+                for( int idx_qmag=0; idx_qmag<nsteps; ++idx_qmag ) {
+                    double qmag = pow(10.,-12+15.*idx_qmag/(nsteps-1));
+                    cvector_t q = qmag * uq;
+                    run( polyh, qmag, ishape, q, qlast, outfilter, maxrelstep );
+                    qlast = q;
+                }
+            }
+        }
+        // For different |q| ...
+        for( int idx_qmag=0; idx_qmag<7; ++idx_qmag ) {
+            double qmag = pow(10.,-12+14.*idx_qmag/(7-1));
+            // ... sweep direction
+            for( int idx_qdir=0; idx_qdir<n_qdir; ++idx_qdir ){
+                cvector_t qlast;
+                for( int irot=0; irot<nsteps; ++irot ){
+                    double rot = steps[irot];
+                    cvector_t uq = ((1-rot)*qdirs[idx_qdir] + rot*qdirs[idx_qdir+1]).unit();
+                    cvector_t q = qmag * uq;
+                    run( polyh, rot, ishape, q, qlast, outfilter, maxrelstep );
+                    qlast = q;
+                }
+            }
+        }
+        if( outfilter==6 )
+            cout << "shape " << ishape << " => max rel step = " << maxrelstep << "\n";
+        totmaxrelstep = std::max( maxrelstep, totmaxrelstep );
+    }
+    if( outfilter==6 )
+        cout << "grand total max rel step = " << totmaxrelstep << "\n";
+}
+
+void help_and_exit()
+{
+    cerr << "Usage: fftest inmode outfilter [shape qxr qxi qyr qyi qzr qzi q]\n";
+    cerr << "inmode: q from 0 stdin, 1 cmdline, 2 loop\n";
+    cerr << "outfilter: return 0 all, 1 real, 2 imag, 6 cont_test, 7 plot_tab, 8 ref_tab, 9 nil\n";
+    cerr << "shape: 0 dodeka, 1 icosa\n";
+    exit(0);
+}
+
+int main (int argc, char *argv[])
+{
+    try {
+        if( argc< 3 )
+            help_and_exit();
+        int inmode = atoi( argv[1] );
+        int outfilter = atoi( argv[2] );
+        if( inmode==2 ) {
+            if( argc!=3 )
+                help_and_exit();
+            test_loop( outfilter );
+            exit(0);
+        }
+        if( argc!=11 )
+            help_and_exit();
+        int ishape = atoi( argv[3] );
+        IFormFactorBorn* polyh( make_polyhedron( ishape ) );
+        cvector_t uq( complex_t(atof(argv[4]),atof(argv[5])),
+                      complex_t(atof(argv[6]),atof(argv[7])),
+                      complex_t(atof(argv[8]),atof(argv[9])) );
+        double qmag;
+        double dummy;
+        if( inmode==1 ) {
+            qmag = atof(argv[10]);
+            run( polyh, 1., ishape, qmag*uq, cvector_t(), outfilter, dummy );
+        } else if( inmode==0 ) {
+            int nop;
+            std::cin >> nop;
+            while( std::cin >> qmag )
+                run( polyh, 1., ishape, qmag*uq, cvector_t(), outfilter, dummy );
+        } else
+            throw "invalid inmode";
+    } catch( const char* ex ) {
+        cerr << "F(q) failed: " << ex << "\n";
+        exit(0);
+    }
+}
diff --git a/dev-tools/math/fftest/runff.cpp b/dev-tools/math/fftest/runff.cpp
new file mode 100644
index 0000000..8ed5afa
--- /dev/null
+++ b/dev-tools/math/fftest/runff.cpp
@@ -0,0 +1,403 @@
+// Form factor computation: test program
+// JWu 2016
+
+// Reference:
+//   Joachim Wuttke
+//   "Form factor (Fourier shape transform) of polygon and polyhedron."
+
+// To use these tests, FormFactorPolyhedron.cpp must be compiled
+// with flag -D POLYHEDRAL_DIAGNOSTIC=ON
+
+#include <cassert>
+#include <iostream>
+#include <iomanip>
+#include <complex>
+#include <vector>
+
+#include "ParticleShapes.h"
+#include "FormFactorTriangle.h"
+
+using std::cout;
+using std::cerr;
+using std::vector;
+
+static complex_t I(0.,1.);
+static double eps(2e-16);
+
+Diagnosis diagnosis;
+
+int nshape = 13;
+
+extern int n_limit;
+extern double q_limit_series;
+extern double qpa_limit_series;
+
+//! Returns a pointer to a particle, according to given code
+
+IFormFactorBorn* make_particle( int ishape )
+{
+    if       ( ishape==1 ) {
+        return new FormFactorDodecahedron(3.);
+    } else if( ishape==2 ) {
+        return new FormFactorIcosahedron(15.);
+    } else if( ishape==3 ) { // true tetrahedron
+        double alpha = 72 * Units::degree;
+        return new FormFactorTetrahedron(1., tan(alpha)/2/sqrt(3), alpha);
+    } else if( ishape==4 ) { // tetrahedral frustum
+        double alpha = 72 * Units::degree;
+        return new FormFactorTetrahedron(1., 0.5*tan(alpha)/2/sqrt(3), alpha);
+    } else if( ishape==5 ) { // tetrahedral frustum, flat one
+        double alpha = 80 * Units::degree;
+        return new FormFactorTetrahedron(1., 0.1*tan(alpha)/2/sqrt(3), alpha);
+    } else if( ishape==6 ) { // tetrahedral frustum as in BasicTest
+        return new FormFactorTetrahedron(16., 4., .8);
+    } else if( ishape==7 ) {
+        double alpha = 72 * Units::degree;
+        return new FormFactorCone6(10., 10., alpha);
+    } else if( ishape==8 ) {
+        return new FormFactorPyramid(1.5, .24, 1.);
+    } else if( ishape==9 ) {
+        return new FormFactorAnisoPyramid(2, .4, .24, 1.);
+    } else if( ishape==10) {
+        return new FormFactorPrism3(1.2, 1.);
+    } else if( ishape==11) {
+        return new FormFactorPrism6(1., 1.);
+    } else if( ishape==12) {
+        return new FormFactorTruncatedCube(4., 1.);
+    } else if( ishape==13 ) {
+        double alpha = 73 * Units::degree;
+        return new FormFactorCuboctahedron(1., 1., .8, alpha);
+    } else if( ishape==90 ) {
+        return new FormFactorTriangle(1.);
+    } else
+        throw "Shape not implemented";
+}
+
+//! Print q in a form that can be easily pasted to the command line for further investigation
+
+std::string nice_q( cvector_t q )
+{
+    std::ostringstream ret;
+    double qmax = 0;
+    ret << std::setprecision(16);
+    for( int i=0; i<3; ++i )
+        qmax = std::max( qmax, q[i].real() );
+    for( int i=0; i<3; ++i )
+        ret << q[i].real()/qmax << " " << q[i].imag()/qmax << " ";
+    ret << qmax;
+    return ret.str();
+}
+
+//! Bisect between two q's to find possible discontinuities
+
+void bisect(
+    const IFormFactorBorn* polyh, const int ishape, const double q0mag,
+    const cvector_t qi, const complex_t ri, const Diagnosis di,
+    const cvector_t qf, const complex_t rf, const Diagnosis df,
+    double& maxrelstep )
+{
+    assert( di!=df );
+    if( (qi-qf).mag()<4*eps*q0mag ) {
+        // narrowed down to minimal step, now check for continuity
+        double aval = (std::abs(ri) + std::abs(rf))/2;
+        double step = std::abs(ri-rf);
+        double relstep = step/aval;
+        if( relstep>maxrelstep){
+            cout<<"ishape="<<ishape<<": relstep "<<std::setprecision(8)<<relstep<<"="<<step<<"/"<<std::setprecision(16)<<aval<<" for "<<di<<"->"<<df<<" at q between "<<nice_q(qi)<<" and "<<nice_q(qf)<<"\n";
+            maxrelstep = relstep;
+        }
+        return;
+    }
+    cvector_t q2 = (qi + qf)/2.;
+    complex_t r2 = polyh->evaluate_for_q(q2);
+    Diagnosis d2 = diagnosis;
+    if( d2!=di )
+        bisect( polyh, ishape, q0mag, qi, ri, di, q2, r2, d2, maxrelstep );
+    if( d2!=df )
+        bisect( polyh, ishape, q0mag, q2, r2, d2, qf, rf, df, maxrelstep );
+}
+
+//! Computes form factor, and prints result according to outfilter.
+
+void run( const IFormFactorBorn* polyh, int ishape, cvector_t q, int outfilter )
+{
+    complex_t ret = polyh->evaluate_for_q(q);
+    cout<<std::scientific<<std::setprecision(16)<<std::setfill('0');
+    if     ( outfilter==0 )
+        cout<<q.mag()<<" "<<std::abs(ret)<<" "<<ret.real()<<" "<<ret.imag()<<" "<<
+            diagnosis.nExpandedFaces<<std::noshowpos<<" "<<diagnosis.maxOrder;
+    else if( outfilter==1 )
+        cout<<ret.real();
+    else if( outfilter==2 )
+        cout<<ret.imag();
+    cout<<"\n";
+}
+
+//! Compute a form factor with modified control parameter settings
+
+complex_t ff_modified( cvector_t q, const IFormFactorBorn* polyh, bool expand_qpa, bool expand_q )
+{
+    PolyhedralFace::setLimits( expand_qpa ? 1e99 : 1e-99, 80 );
+    FormFactorPolyhedron::setLimits( expand_q ? 1e99 : 1e-99, 80 );
+    return polyh->evaluate_for_q( q );
+}
+
+void test_matching( int ishape, const vector<vector<cvector_t>>& scans )
+{
+    cout<<ishape<<"\n";
+    cerr<<"shape "<<ishape<<" ...\n";
+    IFormFactorBorn* polyh( make_particle( ishape ) );
+    int n_mag = 25;
+    double mag_i = 1e-3;
+    double mag_f = 1e1;
+    for( int i=1; i<n_mag; ++i ) {
+        double mag = mag_i*pow(mag_f/mag_i,i/(n_mag-1.));
+        double res = 0;
+        for( const vector<cvector_t>& q_scan: scans ) {
+            assert( q_scan.size()== 1 );
+            cvector_t uq = q_scan[0];
+            const cvector_t q = mag * uq;
+            complex_t ff[2];
+
+            ff[0] = ff_modified( q, polyh, false, false );
+            ff[1] = ff_modified( q, polyh, true, false );
+
+            double dev = std::abs(ff[0]-ff[1])*2/(std::abs(ff[0])+std::abs(ff[1]));
+            res = std::max(res, dev );
+            if( 0 && dev>.1 )
+                cerr<<ishape<<" "<<mag<<" "<<std::setprecision(16)<<
+                    dev<<" "<<ff[0]<<" "<<ff[1]<<" @ "<<q<<"\n";
+        }
+        cout<<" "<<mag*polyh->getRadius()<<" "<<std::setprecision(8)<<res<<"\n";
+    }
+    cout<<"\n";
+}
+
+double test_continuity( int ishape, const vector<vector<cvector_t>>& scans )
+{
+    IFormFactorBorn* polyh( make_particle( ishape ) );
+    double maxrelstep = 0;
+    for( size_t j=0; j<scans.size(); ++j ) {
+        if( !(j%100) )
+            fprintf( stderr, "%2i: %8li/%li\r", ishape, j, scans.size() );
+        const vector<cvector_t>& q_scan = scans[j];
+        for( size_t i=1; i<q_scan.size(); ++i ) {
+            complex_t last_ret = polyh->evaluate_for_q(q_scan[i-1]);
+            Diagnosis last_diag = diagnosis;
+            complex_t ret = polyh->evaluate_for_q(q_scan[i]);
+            Diagnosis diag = diagnosis;
+            if( diag!=last_diag )
+                bisect( polyh, ishape, q_scan[i].mag(),
+                        q_scan[i-1], last_ret, last_diag,
+                        q_scan[i], ret, diag,
+                        maxrelstep );
+        }
+    }
+    fprintf( stderr, "\n" );
+    cout<<"shape "<<ishape<<" => max rel step = "<<maxrelstep<<"\n";
+    return maxrelstep;
+}
+
+void loop_one_shape( int ishape, const vector<vector<cvector_t>>& scans )
+{
+    IFormFactorBorn* polyh( make_particle( ishape ) );
+    for( size_t j=0; j<scans.size(); ++j ) {
+        if( !(j%100) )
+            fprintf( stderr, "%2i: %8li/%li\r", ishape, j, scans.size() );
+        const vector<cvector_t>& q_scan = scans[j];
+        for( const cvector_t q: q_scan ) {
+            complex_t ret = polyh->evaluate_for_q(q);
+            cout <<
+                ishape<<" " <<
+                std::setprecision(16) <<
+                q[0].real()<<" "<<q[0].imag()<<" " <<
+                q[1].real()<<" "<<q[1].imag()<<" " <<
+                q[2].real()<<" "<<q[2].imag()<<" " <<
+                std::setprecision(17) <<
+                q.mag()<<" " <<
+                ret.real()<<" "<<ret.imag()<<" "<<std::abs(ret)<<" " <<
+                diagnosis.nExpandedFaces<<" "<<diagnosis.maxOrder<<"\n";
+        }
+    }
+}
+
+vector<vector<cvector_t>> create_scans( int mode )
+{
+    static int n_dir = 7;
+    cvector_t dir[n_dir] = {
+        { 1., 0., 0. },
+        { 0., 1., 0. },
+        { 0., 0., 1. },
+
+        { 0., 1., 1. },
+        { 1., 0., 1. },
+        { 1., 1., 0. },
+
+        { 1., 1., 1. }
+    };
+
+    static int n_absdir = 8; // absorption component
+    cvector_t absdir[n_absdir] = {
+        { 0., 0., 0. },
+        { 1e-15*I, 0., 0. },
+        { 0., 1e-10*I, 0. },
+        { 0., 0., 1e-5*I },
+        { .1*I, 0., 0. },
+        { 0., .1*I, 0. },
+        { 0., 0., .1*I },
+        { .1*I, .1*I, .1*I }
+    };
+
+    vector<double> mag;
+    if ( mode==0 ) {
+        mag.resize(1);
+        mag[0] = 1;
+    } else if ( mode==1 ) {
+        mag = vector<double>( { 0, 1e-12, 1e-10, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3,
+                    .01, .06, .2, .5, 1, 2, 5, 10, 20, 50, 100 } );
+    } else if (mode==2 ) {
+        mag.resize(1001);
+        mag[0] = 0.;
+        for( size_t i=1; i<mag.size(); ++i )
+            mag[i] = 1e-10*pow(1e13,(i-1.)/(mag.size()-2));
+    }
+
+    static const int n_difmag = 17;
+    static double difmag[n_difmag] =
+        { 0., 3e-16, 1e-15, 3e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-9, 1e-7,
+          1e-5, 1e-3, .01, .03, .1, .2, .3 };
+
+    vector<vector<cvector_t>> scans;
+    for( int i=0; i<n_dir; ++i ) {
+        for( int j=0; j<n_dir; ++j ) {
+            if( i==j )
+                continue;
+            for( int k=0; k<n_difmag; ++k ) {
+                for( int l=0; l<n_absdir; ++l ) {
+                    cvector_t uq = ( dir[i].unit() + difmag[k]*dir[j] + absdir[l] ).unit();
+                    vector<cvector_t> scan;
+                    for( size_t m=0; m<mag.size(); ++m )
+                        scan.push_back( mag[m] * uq );
+                    scans.push_back( scan );
+                }
+            }
+        }
+    }
+    return scans;
+}
+
+void help_and_exit()
+{
+    cerr<<"fftest limits inmode debmsg outfilter shape qxr qxi qyr qyi qzr qzi [q]\n";
+    cerr<<"  limits:    \"def\" | qlim qpalim nlim\n";
+    cerr<<"  inmode:    get q from 0:stdin | 1:cmdline | 2:loop\n";
+    cerr<<"  debmsg:    0..6 (only if inmode=1)\n";
+    cerr<<"  outfilter: return 0:all | 1:real | 2:imag\n";
+    cerr<<"fftest limits loop shape\n";
+    cerr<<"  limits:    \"def\" | qlim qpalim nlim\n";
+    cerr<<"  loop:      3[cont_test] | 4[matching_test] | 5[for_plot]\n";
+    cerr<<"  shape:     0[all] | 1..[specific]\n";
+    exit(0);
+}
+
+#define NEXTARG if( (++arg)-argv >= argc ) help_and_exit()
+#define MULTIARG(n) if( (arg+=n)-argv >= argc ) help_and_exit()
+
+int main (int argc, const char *argv[])
+{
+    try {
+        diagnosis.debmsg = 0;
+        diagnosis.request_convergence = false;
+        const char** arg = argv;
+        NEXTARG;
+        if ( !strncmp( *arg, "def", 3 ) ) {
+            // do nothing
+        } else {
+            double q_limit = atof( *arg );
+            NEXTARG;
+            double qpa_limit = atof( *arg );
+            NEXTARG;
+            int n_limit = atoi( *arg );
+            FormFactorPolyhedron::setLimits( q_limit, n_limit );
+            PolyhedralFace::setLimits( qpa_limit, n_limit );
+        }
+        NEXTARG;
+        int inmode = atoi( *arg );
+        if( inmode==1 ) {
+            NEXTARG;
+            diagnosis.debmsg = atoi( *arg );
+        }
+        if( inmode<=2 ) {
+            NEXTARG;
+            int outfilter = atoi( *arg );
+            NEXTARG;
+            int ishape = atoi( *arg );
+            IFormFactorBorn* P( make_particle( ishape ) );
+            MULTIARG(6);
+            cvector_t uq(
+                complex_t( atof(*(arg-5)), atof(*(arg-4)) ),
+                complex_t( atof(*(arg-3)), atof(*(arg-2)) ),
+                complex_t( atof(*(arg-1)), atof(*(arg-0)) ) );
+            double mag;
+            if( inmode==0 ) {
+                // for use through Frida
+                int nop;
+                std::cin >> nop;
+                while( std::cin >> mag )
+                    run( P, ishape, mag*uq, outfilter );
+            } else if( inmode==1 ) {
+                NEXTARG;
+                mag = atof( *arg );
+                run( P, ishape, mag*uq, outfilter );
+            } else if( inmode==2 ) {
+                int n_mag = 2001;
+                double mag_i = 1e-20;
+                double mag_f = 1e4;
+                for( int i=1; i<n_mag; ++i ) {
+                    //mag = 180.*i/(n_mag-1);
+                    mag = mag_i*pow(mag_f/mag_i,i/(n_mag-1.));
+                    run( P, ishape, mag*uq, outfilter );
+                }
+            }
+            exit(0);
+        }
+        // it's some loop
+        NEXTARG;
+        int ishapepar = atoi( *arg );
+
+        if( inmode==3 ) { // continuity test
+            diagnosis.request_convergence = true;
+            vector<vector<cvector_t>> scans = create_scans( 1 );
+            double totmaxrelstep = 0;
+            if( ishapepar==0 ) {
+                for( int ishape=1; ishape<=nshape; ++ishape )
+                    totmaxrelstep = std::max( totmaxrelstep, test_continuity( ishape, scans ) );
+                cout<<"grand total max rel step = "<<totmaxrelstep<<"\n";
+            } else {
+                test_continuity( ishapepar, scans );
+            }
+            exit (0);
+        }
+        if( inmode==4 ) { // compare computation methods
+            vector<vector<cvector_t>> scans = create_scans( 0 );
+            if( ishapepar==0 ) {
+                for( int ishape=1; ishape<=nshape; ++ishape )
+                    test_matching( ishape, scans );
+            } else
+                test_matching( ishapepar, scans );
+            exit (0);
+        }
+        // it's a straight loop over q
+        vector<vector<cvector_t>> scans = create_scans( 2 );
+        if( ishapepar==0 ) {
+            for( int ishape=1; ishape<=nshape; ++ishape )
+                loop_one_shape( ishape, scans );
+        } else
+            loop_one_shape( ishapepar, scans );
+        exit(0);
+
+    } catch( const char* ex ) {
+        cerr<<"F(q) failed: "<<ex<<"\n";
+        exit(0);
+    }
+}
diff --git a/dev-tools/math/fftest/triangle_runs b/dev-tools/math/fftest/triangle_runs
new file mode 100644
index 0000000..d20bbe0
--- /dev/null
+++ b/dev-tools/math/fftest/triangle_runs
@@ -0,0 +1,5 @@
+runff 1e-99 1e-99  0 2 0 90 0 0 1 0 0 0 > y0
+runff 1e-99 1e+99 48 2 0 90 0 0 1 0 0 0 > yg
+runff 1e-99 1e+99 32 2 0 90 0 0 1 0 0 0 > yf
+runff 1e-99 1e+99 16 2 0 90 0 0 1 0 0 0 > ye
+runff 1e-99 1e+99  4 2 0 90 0 0 1 0 0 0 > yb
diff --git a/dev-tools/math/polyhedron/setup_dodecahedron.py b/dev-tools/math/polyhedron/setup_dodecahedron.py
new file mode 100755
index 0000000..ff5b271
--- /dev/null
+++ b/dev-tools/math/polyhedron/setup_dodecahedron.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+
+# setup_dodecahedron.py:
+# Compute vertex coordinates of a regular dodecahedron.
+# Auxiliary program, used during implementation of dodecahedron form factor in BornAgain.
+# Joachim Wuttke, Forschungszentrum Jülich, 2016
+
+from math import sqrt,sin,cos,pi
+
+def distance(s,t):
+    return sqrt((s[0]-t[0])**2+(s[1]-t[1])**2+(s[2]-t[2])**2)
+
+q=sqrt(5)
+# v=pi/5
+# vv=2*v
+c=(1+q)/4 # cos(v)
+s=sqrt((5-q)/8) # sin(v)
+cc=(q-1)/4 # cos(vv)
+ss=sqrt((5+q)/8) # sin(vv)
+
+def plane_rotate(k):
+    t=p[k]
+    ci = cc
+    si = ss
+    x = ci*t[0]-si*t[1]
+    y = si*t[0]+ci*t[1]
+    p[k+1] = [x, y,t[2]]
+    p[k+4] = [x,-y,t[2]]
+    ci = -c
+    si = s
+    x = ci*t[0]-si*t[1]
+    y = si*t[0]+ci*t[1]
+    p[k+2] = [x, y,t[2]]
+    p[k+3] = [x,-y,t[2]]
+
+
+# a=pow((7*q-15)/5, 1/3.) # edge for V=1
+a=1.
+
+rb=a/(2*s)
+rd=a*c/s
+R2a=(9+3*q)/8
+b=a*sqrt(R2a-1/(4*s**2))
+d=a*sqrt(R2a-(c/s)**2)
+
+h=rb*c
+vol = 12 * 5 * h*a*b/6
+print("a=%g, R/a=%g, rb/a=%g, rd/a=%g, b/a=%g, d/a=%g" % (a, sqrt(R2a), rb/a, rd/a, b/a, d/a))
+print("h=%g volume=%20.16g" % (h, vol) )
+
+p=[None for i in range(20)]
+p[ 0] = [+rb,0.,-b]
+p[ 5] = [+rd,0.,-d]
+p[10] = [-rd,0.,+d]
+p[15] = [-rb,0.,+b]
+for m in range(4):
+    plane_rotate(m*5)
+
+for i in range(len(p)):
+    print("        {%20.16g*a,%20.16g*a,%20.16g*a}," % (p[i][0], p[i][1], p[i][2]))
+
+for i in range(20):
+    print("p%2i(%20.16g,%20.16g,%20.16g) at R=%20.16g" %
+          (i, p[i][0], p[i][1], p[i][2], distance(p[i],[0,0,0])))
+
+distcoll = {}
+for i in range(20):
+    for j in range(i+1,20):
+        dist = distance(p[i],p[j])
+        print("p%2i(%9.4g,%9.4g,%9.4g) - p%2i(%9.4g,%9.4g,%9.4g) = %20.17g" %
+              (i, p[i][0], p[i][1], p[i][2], j, p[j][0], p[j][1], p[j][2], dist))
+        dist=round(dist*1e14)/10**14
+        if not dist in distcoll:
+            distcoll[dist] = 1
+        else:
+            distcoll[dist] += 1
+
+for dist in sorted(distcoll.keys()):
+    print( "%2i times %20.16g" % (distcoll[dist],dist) )
diff --git a/dev-tools/math/polyhedron/setup_icosahedron.py b/dev-tools/math/polyhedron/setup_icosahedron.py
new file mode 100755
index 0000000..77c5522
--- /dev/null
+++ b/dev-tools/math/polyhedron/setup_icosahedron.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+
+# setup_icosahedron.py:
+# Compute vertex coordinates of a regular icosahedron.
+# Auxiliary program, used during implementation of icosahedron form factor in BornAgain.
+# Joachim Wuttke, Forschungszentrum Jülich, 2016
+
+from math import sqrt,sin,cos,pi
+
+def distance(s,t):
+    return sqrt((s[0]-t[0])**2+(s[1]-t[1])**2+(s[2]-t[2])**2)
+
+c=sqrt(3)/2
+q=sqrt(5)
+ss=c
+cc=.5
+
+# a=pow(3*(3-q)/5, 1/3.) # edge for V=1
+a=1.
+
+R2=(5+q)/8*a**2
+rb=a/sqrt(3)
+b=a*sqrt((7+3*q)/24) # sqrt(R2-rb**2)
+rd2=a**2*(3+q)/6 # (4*R2-a**2)/2/(1+cc)
+rd=sqrt(rd2)
+d=a*sqrt((3-q)/24) #sqrt(R2-rd2)
+
+h=rb+sqrt(rb**2-(0.5*a)**2)
+vol = 20 * h*a*b/6
+print("a=%g, R=%g, rb=%g, rd=%g, b=%g, d=%g" % (a, sqrt(R2), rb, rd, b, d))
+print("check P14=%g" % (sqrt( (rd*cc-rb)**2 + (rd*ss)**2 + (d-b)**2 )))
+print("h=%g volume=%20.16g" % (h, vol) )
+
+p=[None for i in range(12)]
+p[ 0] = [ rb,          0,            -b]
+p[ 1] = [-rb*cos(pi/3),+rb*sin(pi/3),-b]
+p[ 2] = [-rb*cos(pi/3),-rb*sin(pi/3),-b]
+p[ 3] = [-rd,          0,            -d]
+p[ 4] = [ rd*cos(pi/3),+rd*sin(pi/3),-d]
+p[ 5] = [ rd*cos(pi/3),-rd*sin(pi/3),-d]
+p[ 6] = [ rd,          0,            +d]
+p[ 7] = [-rd*cos(pi/3),+rd*sin(pi/3),+d]
+p[ 8] = [-rd*cos(pi/3),-rd*sin(pi/3),+d]
+p[ 9] = [-rb,          0,            +b]
+p[10] = [ rb*cos(pi/3),+rb*sin(pi/3),+b]
+p[11] = [ rb*cos(pi/3),-rb*sin(pi/3),+b]
+
+for i in range(len(p)):
+    print("        {%20.16g*a,%20.16g*a,%20.16g*a}," % (p[i][0], p[i][1], p[i][2]))
+
+for i in range(len(p)):
+    print("p%2i(%20.16g,%20.16g,%20.16g) at R=%20.16g" %
+          (i, p[i][0], p[i][1], p[i][2], distance(p[i],[0,0,0])))
+
+distcoll = {}
+for i in range(len(p)):
+    for j in range(i+1,len(p)):
+        dist = distance(p[i],p[j])
+        print("p%2i-%2i = %20.17g" % (i, j, dist))
+        dist=round(dist*1e15)/10**15
+        if not dist in distcoll:
+            distcoll[dist] = 1
+        else:
+            distcoll[dist] += 1
+
+for dist in sorted(distcoll.keys()):
+    print( "%2i times %20.16g" % (distcoll[dist],dist) )
diff --git a/dev-tools/openmpi/batest/CMakeLists.txt b/dev-tools/openmpi/batest/CMakeLists.txt
new file mode 100644
index 0000000..eb8a4d3
--- /dev/null
+++ b/dev-tools/openmpi/batest/CMakeLists.txt
@@ -0,0 +1,44 @@
+project(batest)
+
+add_executable(batest batest.cpp)
+
+# path to the cmake modules
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/modules)
+
+# Find libraries
+message(STATUS "Configuring with OpenMPI support")
+find_package(MPI REQUIRED)
+
+
+# --- Eigen3 ---
+#find_package(Eigen3 3.1.0 REQUIRED)
+set(EIGEN3_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/../../../ThirdParty/eigen3)
+
+
+# --- BOOST ---
+set(boost_libraries_required date_time chrono program_options iostreams system filesystem regex thread)
+find_package(Boost 1.48.0 COMPONENTS ${boost_libraries_required} REQUIRED)
+message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
+message(STATUS "Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}")
+message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}")
+
+# --- BornAgain ---
+find_package(BornAgain REQUIRED)
+
+#-----ROOT------------
+find_package(ROOT REQUIRED)
+
+include_directories(
+    ${Boost_INCLUDE_DIRS}
+    ${EIGEN3_INCLUDE_DIR}
+    ${ROOT_INCLUDE_DIR}
+    ${BORNAGAIN_INCLUDE_DIR}
+    ${MPI_INCLUDE_PATH}
+)
+
+target_link_libraries(batest
+    ${Boost_LIBRARIES}
+    ${BORNAGAIN_LIBRARIES}
+    ${ROOT_LIBRARIES}
+    ${MPI_LIBRARIES}
+)
diff --git a/dev-tools/openmpi/batest/batest.cpp b/dev-tools/openmpi/batest/batest.cpp
new file mode 100644
index 0000000..90f3bbe
--- /dev/null
+++ b/dev-tools/openmpi/batest/batest.cpp
@@ -0,0 +1,38 @@
+#include <iostream>
+#include "SimulationFactory.h"
+#include "OutputDataFunctions.h"
+#include <mpi.h>
+
+int main(int argc, char **argv)
+{
+    MPI_Init(&argc, &argv);
+
+
+    std::cout << "Hello World" << std::endl;
+
+    SimulationFactory sim_registry;
+    GISASSimulation *simulation = sim_registry.createSimulation("isgisaxs01");
+
+    simulation->runOMPISimulation();
+
+
+    // check
+    int world_size(0), world_rank(0);
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
+    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
+
+    if(world_rank ==0) {
+        OutputData<double> *result = simulation->getOutputData()->clone();
+
+        simulation->runSimulation();
+        OutputData<double> *reference = simulation->getOutputData()->clone();
+
+        double diff = OutputDataFunctions::GetDifference(*result,*reference);
+        std::cout << " Difference:" << diff << std::endl;
+    }
+
+
+    MPI_Finalize();
+
+    return 0;
+}
diff --git a/dev-tools/openmpi/batest/modules/FindBornAgain.cmake b/dev-tools/openmpi/batest/modules/FindBornAgain.cmake
new file mode 100644
index 0000000..f761cbd
--- /dev/null
+++ b/dev-tools/openmpi/batest/modules/FindBornAgain.cmake
@@ -0,0 +1,44 @@
+# Finds BornAgain instalation
+# It defines:
+# BORNAGAIN_INCLUDE_DIR  PATH to the include directory
+# BORNAGAIN_LIBRARIES    BornAgain libraries
+
+set(BORNAGAINSYS $ENV{BORNAGAINSYS})
+
+if(BORNAGAINSYS)
+    set(BORNAGAIN_LIBRARY_DIR ${BORNAGAINSYS}/lib)
+    set(BORNAGAIN_INCLUDE_DIR ${BORNAGAINSYS}/include/BornAgain)
+endif()
+
+find_library (BORNAGAIN_CORE BornAgainCore
+    PATHS ${BORNAGAIN_LIBRARY_DIR}
+    HINTS ${BORNAGAIN_LIBRARY_DIR}
+)
+
+find_library (BORNAGAIN_FIT BornAgainFit
+    PATHS ${BORNAGAIN_LIBRARY_DIR}
+    HINTS ${BORNAGAIN_LIBRARY_DIR}
+)
+set(BORNAGAIN_LIBRARIES ${BORNAGAIN_CORE} ${BORNAGAIN_FIT})
+
+find_path(BORNAGAIN_INCLUDE_DIR BAVersion.h
+    PATHS /usr/include /usr/local/include /opt/local/include ${BORNAGAIN_INCLUDE_DIR}
+    PATH_SUFFIXES BornAgain
+    HINTS ${BORNAGAIN_INCLUDE_DIR}
+)
+
+# 32-bits systems require special Eigen options
+execute_process(COMMAND uname -m OUTPUT_VARIABLE SYSCTL_OUTPUT)
+if(NOT ${SYSCTL_OUTPUT} MATCHES x86_64)
+    add_definitions(-DEIGEN_DONT_ALIGN_STATICALLY=1)
+endif()
+
+message(STATUS "BORNAGAIN_LIBRARIES   ${BORNAGAIN_LIBRARIES}")
+message(STATUS "BORNAGAIN_INCLUDE_DIR ${BORNAGAIN_INCLUDE_DIR}")
+mark_as_advanced(BORNAGAIN_LIBRARIES BORNAGAIN_INCLUDE_DIR)
+
+if(NOT BORNAGAIN_LIBRARIES OR NOT BORNAGAIN_INCLUDE_DIR)
+   if(BornAgain_FIND_REQUIRED)
+       message( FATAL_ERROR "FindBornAgain: can't find BornAgain header or library" )
+   endif()
+endif()
diff --git a/dev-tools/openmpi/batest/modules/FindEigen3.cmake b/dev-tools/openmpi/batest/modules/FindEigen3.cmake
new file mode 100644
index 0000000..9c546a0
--- /dev/null
+++ b/dev-tools/openmpi/batest/modules/FindEigen3.cmake
@@ -0,0 +1,81 @@
+# - Try to find Eigen3 lib
+#
+# This module supports requiring a minimum version, e.g. you can do
+#   find_package(Eigen3 3.1.2)
+# to require version 3.1.2 or newer of Eigen3.
+#
+# Once done this will define
+#
+#  EIGEN3_FOUND - system has eigen lib with correct version
+#  EIGEN3_INCLUDE_DIR - the eigen include directory
+#  EIGEN3_VERSION - eigen version
+
+# Copyright (c) 2006, 2007 Montel Laurent, <montel at kde.org>
+# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael at free.fr>
+# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
+
+if(NOT Eigen3_FIND_VERSION)
+  if(NOT Eigen3_FIND_VERSION_MAJOR)
+    set(Eigen3_FIND_VERSION_MAJOR 2)
+  endif(NOT Eigen3_FIND_VERSION_MAJOR)
+  if(NOT Eigen3_FIND_VERSION_MINOR)
+    set(Eigen3_FIND_VERSION_MINOR 91)
+  endif(NOT Eigen3_FIND_VERSION_MINOR)
+  if(NOT Eigen3_FIND_VERSION_PATCH)
+    set(Eigen3_FIND_VERSION_PATCH 0)
+  endif(NOT Eigen3_FIND_VERSION_PATCH)
+
+  set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
+endif(NOT Eigen3_FIND_VERSION)
+
+macro(_eigen3_check_version)
+  file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
+
+  string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
+  set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
+  string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
+  set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
+
+  set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
+  if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK FALSE)
+  else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+    set(EIGEN3_VERSION_OK TRUE)
+  endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
+
+  if(NOT EIGEN3_VERSION_OK)
+
+    message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
+                   "but at least version ${Eigen3_FIND_VERSION} is required")
+  endif(NOT EIGEN3_VERSION_OK)
+endmacro(_eigen3_check_version)
+
+if (EIGEN3_INCLUDE_DIR)
+
+  # in cache already
+  _eigen3_check_version()
+  set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
+
+else (EIGEN3_INCLUDE_DIR)
+
+  find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
+      PATHS
+      ${CMAKE_INSTALL_PREFIX}/include
+      ${KDE4_INCLUDE_DIR}
+      PATH_SUFFIXES eigen3 eigen
+    )
+
+  if(EIGEN3_INCLUDE_DIR)
+    _eigen3_check_version()
+  endif(EIGEN3_INCLUDE_DIR)
+
+  include(FindPackageHandleStandardArgs)
+  find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
+
+  mark_as_advanced(EIGEN3_INCLUDE_DIR)
+
+endif(EIGEN3_INCLUDE_DIR)
+
diff --git a/dev-tools/openmpi/batest/modules/FindROOT.cmake b/dev-tools/openmpi/batest/modules/FindROOT.cmake
new file mode 100644
index 0000000..415b3c7
--- /dev/null
+++ b/dev-tools/openmpi/batest/modules/FindROOT.cmake
@@ -0,0 +1,170 @@
+# - Finds ROOT instalation
+# This module sets up ROOT information 
+# It defines:
+# ROOT_FOUND          If the ROOT is found
+# ROOT_INCLUDE_DIR    PATH to the include directory
+# ROOT_LIBRARIES      Most common libraries
+# ROOT_LIBRARY_DIR    PATH to the library directory 
+
+
+find_program(ROOT_CONFIG_EXECUTABLE root-config
+  PATHS $ENV{ROOTSYS}/bin)
+
+if(NOT ROOT_CONFIG_EXECUTABLE)
+    set(ROOT_FOUND FALSE)
+else()
+    set(ROOT_FOUND TRUE)
+
+    if(WIN32)
+        STRING(REGEX REPLACE "\\\\" "/" ROOTSYS $ENV{ROOTSYS} ) # Convert C:\root\ to C:/root/
+        set(ROOT_INCLUDE_DIR ${ROOTSYS}/include)
+        set(ROOT_LIBRARY_DIR ${ROOTSYS}/lib)
+        #set(ROOT_LIBRARIES -LIBPATH:${ROOT_LIBRARY_DIR} libGpad.lib libHist.lib libGraf.lib libGraf3d.lib libTree.lib libRint.lib libPostscript.lib libMatrix.lib libPhysics.lib libMathCore.lib libRIO.lib libNet.lib libThread.lib libCore.lib libCint.lib)
+        set(ROOT_LIBRARIES -LIBPATH:${ROOT_LIBRARY_DIR} libGui.lib libGpad.lib libHist.lib libGraf.lib libGraf3d.lib libTree.lib libRint.lib libPostscript.lib libMatrix.lib libMathCore.lib libRIO.lib libNet.lib libThread.lib libCore.lib libCint.lib)
+    else()
+
+        execute_process(
+            COMMAND ${ROOT_CONFIG_EXECUTABLE} --prefix 
+            OUTPUT_VARIABLE ROOTSYS 
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+        execute_process(
+            COMMAND ${ROOT_CONFIG_EXECUTABLE} --version 
+            OUTPUT_VARIABLE ROOT_VERSION
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+        execute_process(
+            COMMAND ${ROOT_CONFIG_EXECUTABLE} --incdir
+            OUTPUT_VARIABLE ROOT_INCLUDE_DIR
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+        execute_process(
+            COMMAND ${ROOT_CONFIG_EXECUTABLE} --glibs
+            OUTPUT_VARIABLE ROOT_LIBRARIES
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+        set(ROOT_LIBRARY_DIR ${ROOTSYS}/lib)
+
+        # Make variables changeble to the advanced user
+        mark_as_advanced(ROOT_CONFIG_EXECUTABLE)
+
+        if(NOT ROOT_FIND_QUIETLY)
+            message(STATUS "Found ROOT ${ROOT_VERSION} in ${ROOTSYS}")
+        endif()
+    endif()
+endif()
+
+
+#include(CMakeMacroParseArguments)
+find_program(ROOTCINT_EXECUTABLE rootcint PATHS $ENV{ROOTSYS}/bin)
+find_program(GENREFLEX_EXECUTABLE genreflex PATHS $ENV{ROOTSYS}/bin)
+find_package(GCCXML)
+
+#----------------------------------------------------------------------------
+# function ROOT_GENERATE_DICTIONARY( dictionary   
+#                                    header1 header2 ... 
+#                                    LINKDEF linkdef1 ... 
+#                                    OPTIONS opt1...)
+function(ROOT_GENERATE_DICTIONARY dictionary)
+  CMAKE_PARSE_ARGUMENTS(ARG "" "" "LINKDEF;OPTIONS" "" ${ARGN})
+  #---Get the list of header files-------------------------
+  set(headerfiles)
+  foreach(fp ${ARG_UNPARSED_ARGUMENTS})
+    file(GLOB files ${fp})
+    if(files)
+      foreach(f ${files})
+        if(NOT f MATCHES LinkDef)
+          set(headerfiles ${headerfiles} ${f})
+        endif()
+      endforeach()
+    else()
+      set(headerfiles ${headerfiles} ${fp})
+    endif()
+  endforeach()
+  #---Get the list of include directories------------------
+  get_directory_property(incdirs INCLUDE_DIRECTORIES)
+  set(includedirs) 
+  foreach( d ${incdirs})    
+   if(NOT ${d} STREQUAL "/usr/include")
+   set(includedirs ${includedirs} -I${d})
+   endif()
+  endforeach()
+  #---Get LinkDef.h file------------------------------------
+  set(linkdefs)
+  foreach( f ${ARG_LINKDEF})
+    if( IS_ABSOLUTE ${f})
+      set(linkdefs ${linkdefs} ${f})
+    else() 
+      if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/inc/${f})
+        set(linkdefs ${linkdefs} ${CMAKE_CURRENT_SOURCE_DIR}/inc/${f})
+      else()
+        set(linkdefs ${linkdefs} ${CMAKE_CURRENT_SOURCE_DIR}/${f})
+      endif()
+    endif()
+  endforeach()
+  #---call rootcint------------------------------------------
+  add_custom_command(OUTPUT ${dictionary}.cxx ${dictionary}.h
+                     COMMAND ${ROOTCINT_EXECUTABLE} -cint -f  ${dictionary}.cxx 
+                                          -c ${ARG_OPTIONS} ${includedirs} ${headerfiles} ${linkdefs} 
+                     DEPENDS ${headerfiles} ${linkdefs})
+endfunction()
+
+#----------------------------------------------------------------------------
+# function REFLEX_GENERATE_DICTIONARY(dictionary   
+#                                     header1 header2 ... 
+#                                     SELECTION selectionfile ... 
+#                                     OPTIONS opt1...)
+function(REFLEX_GENERATE_DICTIONARY dictionary)  
+  CMAKE_PARSE_ARGUMENTS(ARG "" "" "SELECTION;OPTIONS" "" ${ARGN})
+  #---Get the list of header files-------------------------
+  set(headerfiles)
+  foreach(fp ${ARG_UNPARSED_ARGUMENTS})
+    file(GLOB files ${fp})
+    if(files)
+      foreach(f ${files})
+        set(headerfiles ${headerfiles} ${f})
+      endforeach()
+    else()
+      set(headerfiles ${headerfiles} ${fp})
+    endif()
+  endforeach()
+  #---Get Selection file------------------------------------
+  if(IS_ABSOLUTE ${ARG_SELECTION})
+    set(selectionfile ${ARG_SELECTION})
+  else() 
+    set(selectionfile ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_SELECTION})
+  endif()
+  #---Get the list of include directories------------------
+  get_directory_property(incdirs INCLUDE_DIRECTORIES)
+  set(includedirs) 
+  foreach( d ${incdirs})    
+    set(includedirs ${includedirs} -I${d})
+  endforeach()
+  #---Get preprocessor definitions--------------------------
+  get_directory_property(defs COMPILE_DEFINITIONS)
+  foreach( d ${defs})    
+   set(definitions ${definitions} -D${d})
+  endforeach()
+  #---Nanes and others---------------------------------------
+  set(gensrcdict ${dictionary}.cpp)
+  if(MSVC)
+    set(gccxmlopts "--gccxmlopt=\"--gccxml-compiler cl\"")
+  else()
+    #set(gccxmlopts "--gccxmlopt=\'--gccxml-cxxflags -m64 \'")
+    set(gccxmlopts)
+  endif()  
+  #set(rootmapname ${dictionary}Dict.rootmap)
+  #set(rootmapopts --rootmap=${rootmapname} --rootmap-lib=${libprefix}${dictionary}Dict)
+  #---Check GCCXML and get path-----------------------------
+  if(GCCXML)
+    get_filename_component(gccxmlpath ${GCCXML} PATH)
+  else()
+    message(WARNING "GCCXML not found. Install and setup your environment to find 'gccxml' executable")
+  endif()
+  #---Actual command----------------------------------------
+  add_custom_command(OUTPUT ${gensrcdict} ${rootmapname}     
+                     COMMAND ${GENREFLEX_EXECUTABLE} ${headerfiles} -o ${gensrcdict} ${gccxmlopts} ${rootmapopts} --select=${selectionfile}
+                             --gccxmlpath=${gccxmlpath} ${ARG_OPTIONS} ${includedirs} ${definitions}
+                     DEPENDS ${headerfiles} ${selectionfile})
+endfunction()
+  
diff --git a/dev-tools/openmpi/helloworld/CMakeLists.txt b/dev-tools/openmpi/helloworld/CMakeLists.txt
new file mode 100644
index 0000000..9101d55
--- /dev/null
+++ b/dev-tools/openmpi/helloworld/CMakeLists.txt
@@ -0,0 +1,20 @@
+# CC=mpicc CXX=mpicxx cmake ../
+
+
+project(helloworld)
+
+#SET(CMAKE_C_COMPILER mpicc)
+#SET(CMAKE_CXX_COMPILER mpicxx)
+
+add_executable(helloworld helloworld.cpp)
+
+# Require MPI for this project:
+find_package(MPI REQUIRED)
+
+#set(CMAKE_CXX_COMPILE_FLAGS ${CMAKE_CXX_COMPILE_FLAGS} ${MPI_COMPILE_FLAGS})
+#set(CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS} ${MPI_LINK_FLAGS})
+include_directories(${MPI_INCLUDE_PATH})
+
+target_link_libraries(helloworld ${MPI_LIBRARIES})
+
+
diff --git a/dev-tools/openmpi/helloworld/helloworld.cpp b/dev-tools/openmpi/helloworld/helloworld.cpp
new file mode 100644
index 0000000..04fd588
--- /dev/null
+++ b/dev-tools/openmpi/helloworld/helloworld.cpp
@@ -0,0 +1,28 @@
+#include <mpi.h>
+ 
+int main(int argc, char** argv) {
+  // Initialize the MPI environment
+  MPI_Init(&argc, &argv);
+ 
+  // Get the number of processes
+  int world_size;
+  MPI_Comm_size(MPI_COMM_WORLD, &world_size);
+ 
+  // Get the rank of the process
+  int world_rank;
+  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
+ 
+  // Get the name of the processor
+  char processor_name[MPI_MAX_PROCESSOR_NAME];
+  int name_len;
+  MPI_Get_processor_name(processor_name, &name_len);
+ 
+  // Print off a hello world message
+  printf("Hello world from processor %s, rank %d"
+         " out of %d processors\n",
+         processor_name, world_rank, world_size);
+ 
+  // Finalize the MPI environment.
+  MPI_Finalize();
+}
+
diff --git a/dev-tools/openmpi/pytests/001_150_P109_cut_phitheta.txt.gz b/dev-tools/openmpi/pytests/001_150_P109_cut_phitheta.txt.gz
new file mode 100644
index 0000000..4678ad5
Binary files /dev/null and b/dev-tools/openmpi/pytests/001_150_P109_cut_phitheta.txt.gz differ
diff --git a/dev-tools/openmpi/pytests/job1.cmd b/dev-tools/openmpi/pytests/job1.cmd
new file mode 100644
index 0000000..1299a74
--- /dev/null
+++ b/dev-tools/openmpi/pytests/job1.cmd
@@ -0,0 +1,30 @@
+#!/bin/bash
+#
+#@ job_type = parallel
+#@ class = micro
+#@ node = 16
+#@ tasks_per_node = 4
+#@ island_count=1
+#@ wall_clock_limit = 1:00:00
+#@ job_name = mytest
+#@ network.MPI = sn_all,not_shared,us
+#@ initialdir = $(home)/jobs
+#@ output = job$(jobid).out
+#@ error = job$(jobid).err
+#@ notification=always
+#@ notify_user=guennadi.pospelov at gmail.com
+##@ energy_policy_tag = BornAgainEnergyTag
+##@ minimize_time_to_solution = yes
+#@ queue
+. /etc/profile
+. /etc/profile.d/modules.sh
+export MP_SINGLE_THREAD=no
+export OMP_NUM_THREADS=4
+export MP_TASK_AFFINITY=core:$OMP_NUM_THREADS
+module load python/2.7_anaconda
+module load fftw/mpi/3.3
+module load gsl
+export LD_LIBRARY_PATH=/home/hpc/pr87me/di29sok/software/boost_1_55_0.gcc47/lib:/home/hpc/pr87me/di29sok/development/BornAgain/installed/lib:$LD_LIBRARY_PATH
+export PYTHONPATH=/home/hpc/pr87me/di29sok/development/BornAgain/installed/lib:$PYTHONPATH
+poe python round1_sim3_ompi.py
+
diff --git a/dev-tools/openmpi/pytests/ompi_isgisaxs01.py b/dev-tools/openmpi/pytests/ompi_isgisaxs01.py
new file mode 100644
index 0000000..fcc9962
--- /dev/null
+++ b/dev-tools/openmpi/pytests/ompi_isgisaxs01.py
@@ -0,0 +1,106 @@
+# Mixture of cylinders and prisms without interference (IsGISAXS example ex-1)
+
+from mpi4py import MPI # this line has to be first
+import numpy
+import matplotlib
+import pylab
+from libBornAgainCore import *
+
+comm = MPI.COMM_WORLD
+world_size = comm.Get_size()
+world_rank = comm.Get_rank()
+
+
+def get_sample():
+    """
+    Build and return the sample representing cylinders and pyramids on top of
+    substrate without interference.
+    """
+    # defining materials
+    m_air = HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
+    cylinder = Particle(m_particle, cylinder_ff)
+    prism_ff = FormFactorPrism3(10*nanometer, 5*nanometer)
+    prism = Particle(m_particle, prism_ff)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder, 0.0, 0.5)
+    particle_layout.addParticle(prism, 0.0, 0.5)
+    interference = InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(m_substrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = GISASSimulation()
+    detector = IsGISAXSDetector()
+    detector.setDetectorParameters(100, -1.0*degree, 1.0*degree, 100, 0.0*degree, 2.0*degree)
+    simulation.setDetector(detector)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    sample = get_sample()
+    simulation.setSample(sample)
+
+    return simulation
+
+
+def run_simulation():
+    """
+    Run simulation and plot results
+    """
+    simulation = get_simulation()
+
+    if(world_size == 1):
+        print "Not an OpenMPI environment, run with 'mpirun -np 12 python ompi_sim_example.py'"
+        exit(0)
+
+    if(world_rank != 0):
+        SetMessageLevel("DEBUG")
+        thread_info = ThreadInfo()
+        thread_info.n_batches = world_size - 1
+        thread_info.current_batch = world_rank - 1
+        print " xxx preparing to run ", thread_info.n_batches, thread_info.current_batch
+        simulation.setThreadInfo(thread_info)
+        simulation.runSimulation()
+        print "preparing to send"
+        comm.Send(simulation.getIntensityData().getArray())
+
+    if(world_rank == 0):
+        #simulation.runSimulation()
+        sumresult = simulation.getIntensityData().getArray()
+        print sumresult
+        sumresult = numpy.zeros(sumresult.shape)
+        print sumresult
+
+        print "preparing to receive"
+        for i_proc in range(1, world_size):
+            print "  ... receiving",i_proc
+            result = numpy.zeros(sumresult.shape)
+            comm.Recv(result, i_proc)
+            sumresult += result
+        print sumresult
+
+    if(world_rank == 0):
+        print sumresult
+        #pylab.imshow(sumresult + 1, norm=matplotlib.colors.LogNorm(), extent=[-1.0, 1.0, 0, 2.0])
+        #pylab.show()
+
+
+if __name__ == '__main__':
+    run_simulation()
+
+
+
diff --git a/dev-tools/openmpi/pytests/ompi_isgisaxs01_cpp.py b/dev-tools/openmpi/pytests/ompi_isgisaxs01_cpp.py
new file mode 100644
index 0000000..f937f56
--- /dev/null
+++ b/dev-tools/openmpi/pytests/ompi_isgisaxs01_cpp.py
@@ -0,0 +1,85 @@
+# Mixture of cylinders and prisms without interference (IsGISAXS example ex-1)
+
+from mpi4py import MPI # this line has to be first
+import numpy
+import matplotlib
+import pylab
+from libBornAgainCore import *
+
+comm = MPI.COMM_WORLD
+world_size = comm.Get_size()
+world_rank = comm.Get_rank()
+
+
+def get_sample():
+    """
+    Build and return the sample representing cylinders and pyramids on top of
+    substrate without interference.
+    """
+    # defining materials
+    m_air = HomogeneousMaterial("Air", 0.0, 0.0)
+    m_substrate = HomogeneousMaterial("Substrate", 6e-6, 2e-8)
+    m_particle = HomogeneousMaterial("Particle", 6e-4, 2e-8)
+
+    # collection of particles
+    cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
+    cylinder = Particle(m_particle, cylinder_ff)
+    prism_ff = FormFactorPrism3(10*nanometer, 5*nanometer)
+    prism = Particle(m_particle, prism_ff)
+    particle_layout = ParticleLayout()
+    particle_layout.addParticle(cylinder, 0.0, 0.5)
+    particle_layout.addParticle(prism, 0.0, 0.5)
+    interference = InterferenceFunctionNone()
+    particle_layout.addInterferenceFunction(interference)
+
+    # air layer with particles and substrate form multi layer
+    air_layer = Layer(m_air)
+    air_layer.addLayout(particle_layout)
+    substrate_layer = Layer(m_substrate, 0)
+    multi_layer = MultiLayer()
+    multi_layer.addLayer(air_layer)
+    multi_layer.addLayer(substrate_layer)
+    return multi_layer
+
+
+def get_simulation():
+    """
+    Create and return GISAXS simulation with beam and detector defined
+    """
+    simulation = GISASSimulation()
+    detector = IsGISAXSDetector()
+    detector.setDetectorParameters(100, -1.0*degree, 1.0*degree, 100, 0.0*degree, 2.0*degree)
+    simulation.setDetector(detector)
+    simulation.setBeamParameters(1.0*angstrom, 0.2*degree, 0.0*degree)
+    sample = get_sample()
+    simulation.setSample(sample)
+
+    return simulation
+
+
+def run_simulation():
+    """
+    Run simulation and plot results
+    """
+    simulation = get_simulation()
+
+    if(world_size == 1):
+        print "Not an OpenMPI environment, run with 'mpirun -np 12 python ompi_sim_example.py'"
+        exit(0)
+
+    SetMessageLevel("DEBUG")
+
+    simulation.runOMPISimulation()
+
+    if(world_rank == 0):
+        sumresult = simulation.getIntensityData().getArray()
+        print sumresult
+        #pylab.imshow(sumresult + 1, norm=matplotlib.colors.LogNorm(), extent=[-1.0, 1.0, 0, 2.0])
+        #pylab.show()
+
+
+if __name__ == '__main__':
+    run_simulation()
+
+
+
diff --git a/dev-tools/openmpi/pytests/ompi_meso.py b/dev-tools/openmpi/pytests/ompi_meso.py
new file mode 100644
index 0000000..79e7761
--- /dev/null
+++ b/dev-tools/openmpi/pytests/ompi_meso.py
@@ -0,0 +1,230 @@
+from mpi4py import MPI # this line has to be first
+import numpy
+import matplotlib
+matplotlib.use('Agg')
+import pylab
+from math import degrees
+import math
+from time import time
+import ctypes
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+comm = MPI.COMM_WORLD
+world_size = comm.Get_size()
+world_rank = comm.Get_rank()
+
+class MesoSampleBuilder(IMultiLayerBuilder):
+    """
+    Meso crystal sample builder
+    """
+    def __init__(self):
+        IMultiLayerBuilder.__init__(self)
+        self.sample = None
+        # parameters describing the sample
+
+        self.m_lattice_length_a = ctypes.c_double(1.246708e+01*nanometer)
+        self.m_lattice_length_c = ctypes.c_double(1.338787e+01*nanometer)
+        self.m_nanoparticle_radius = ctypes.c_double(4.848528e+00*nanometer)
+        self.m_sigma_nanoparticle_radius = ctypes.c_double(3.6720e-01*nanometer)
+        #self.m_meso_height = ctypes.c_double(1.1221e+02*nanometer)
+        self.m_meso_height = ctypes.c_double(1000.*nanometer)
+        self.m_meso_radius = ctypes.c_double(9.4567e+02*nanometer)
+        self.m_sigma_meso_height = ctypes.c_double(5.0*nanometer)
+        self.m_sigma_meso_radius = ctypes.c_double(5.0*nanometer)
+        self.m_sigma_lattice_length_a = ctypes.c_double(1.1601e+00*nanometer)
+        self.m_surface_filling_ratio = ctypes.c_double(1.7286e-01)
+        self.m_roughness = ctypes.c_double(10.0*nanometer)
+        self.m_scale_param = math.sqrt(math.log((self.m_sigma_nanoparticle_radius.value/self.m_nanoparticle_radius.value)**2+1.0))
+
+        # register parameters
+        self.registerParameter("meso_radius", ctypes.addressof(self.m_meso_radius))
+        self.registerParameter("surface_filling_ratio", ctypes.addressof(self.m_surface_filling_ratio))
+        self.registerParameter("meso_height", ctypes.addressof(self.m_meso_height))
+        self.registerParameter("sigma_meso_height", ctypes.addressof(self.m_sigma_meso_height))
+        self.registerParameter("sigma_meso_radius", ctypes.addressof(self.m_sigma_meso_radius))
+        self.registerParameter("lattice_length_a", ctypes.addressof(self.m_lattice_length_a))
+        self.registerParameter("lattice_length_c", ctypes.addressof(self.m_lattice_length_c))
+        self.registerParameter("nanoparticle_radius", ctypes.addressof(self.m_nanoparticle_radius))
+        self.registerParameter("sigma_nanoparticle_radius", ctypes.addressof(self.m_sigma_nanoparticle_radius))
+        self.registerParameter("sigma_lattice_length_a", ctypes.addressof(self.m_sigma_lattice_length_a))
+        self.registerParameter("roughness", ctypes.addressof(self.m_roughness))
+
+    def CreateMeso(self, a, c, material, radius, sigma_radius, meso_form_factor):
+        lattice = self.CreateLattice(a, c)
+        bas_a = lattice.getBasisVectorA()
+        bas_b = lattice.getBasisVectorB()
+        bas_c = lattice.getBasisVectorC()
+        particle = Particle(material, FormFactorSphereGaussianRadius(radius, sigma_radius))
+        #particle = Particle(material, FormFactorSphereLogNormalRadius(radius, self.m_scale_param, 10))
+        position_0 = kvector_t(0.0, 0.0, 0.0)
+        position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c)
+        position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c)
+        pos_vector = [position_0, position_1, position_2]
+        basis = ParticleComposition()
+        basis.addParticles(particle, pos_vector)
+        npc = Crystal(basis, lattice)
+        dw_factor = self.m_sigma_lattice_length_a.value*self.m_sigma_lattice_length_a.value/6.0
+        npc.setDWFactor(dw_factor)
+        result = MesoCrystal(npc, meso_form_factor)
+        return result
+
+    def CreateLattice(self, a, c):
+        result = Lattice.createTrigonalLattice(a, c*2.3)
+        result.setSelectionRule(SimpleSelectionRule(-1, 1, 1, 3))
+        return result
+
+    # constructs the sample for current values of parameters
+    def buildSample(self):
+        # create materials
+        surface_density = self.m_surface_filling_ratio.value/numpy.pi/self.m_meso_radius.value/self.m_meso_radius.value
+        n_particle = complex(1.0-2.84e-5, 4.7e-7)
+        avg_n_squared_meso = 0.7886*n_particle**2 + 0.2114
+        n_avg = numpy.sqrt(self.m_surface_filling_ratio.value*avg_n_squared_meso + 1.0 - self.m_surface_filling_ratio.value)
+        n_particle_adapted = numpy.sqrt(n_avg**2 + n_particle**2 - 1.0)
+        particle_material = HomogeneousMaterial("nanoparticle", n_particle_adapted)
+
+        ff_cyl = FormFactorCylinder(self.m_meso_radius.value, self.m_meso_height.value)
+        ff_meso = FormFactorDecoratorDebyeWaller(ff_cyl, self.m_sigma_meso_height.value**2/2.0,
+                                             self.m_sigma_meso_radius.value**2/2.0)
+
+        # Create multilayer
+        multi_layer = MultiLayer()
+
+        air_material = HomogeneousMaterial("Air", 0.0, 0.0)
+        substrate_material = HomogeneousMaterial("Substrate", 7.57e-6, 1.73e-7)
+        average_layer_material = HomogeneousMaterial("AverageLayer", n_avg)
+        air_layer = Layer()
+        air_layer.setMaterial(air_material)
+        avg_layer = Layer()
+        avg_layer.setMaterial(average_layer_material)
+        avg_layer.setThickness(self.m_meso_height.value)
+        substrate_layer = Layer()
+        substrate_layer.setMaterial(substrate_material)
+        particle_decoration = ParticleLayout()
+
+        max_phi_rotation_steps = 180
+        max_tilt_rotation_steps = 1
+
+        phi_step = 2.0*numpy.pi/3.0/max_phi_rotation_steps
+        phi_start = 0.0
+        #zeta_step = 0.5*degree
+        #zeta_start = -zeta_step*(max_tilt_rotation_steps/2)
+        for i in range(0, max_phi_rotation_steps):
+            for j in range(0, max_tilt_rotation_steps):
+                #trafo_y = Transform3D.createRotateY(zeta_start + j*zeta_step)
+                trafo_z = Transform3D.createRotateZ(phi_start + i*phi_step)
+                #trafo = trafo_z*trafo_y
+                trafo = trafo_z
+                particle_decoration.addParticle(
+                    self.CreateMeso(self.m_lattice_length_a.value, self.m_lattice_length_c.value,
+                            particle_material, self.m_nanoparticle_radius.value,
+                            self.m_sigma_nanoparticle_radius.value, ff_meso), trafo,
+                            self.m_meso_height.value)
+
+        particle_decoration.setTotalParticleSurfaceDensity(surface_density)
+
+        avg_layer.addLayout(particle_decoration)
+
+        roughness = LayerRoughness(self.m_roughness.value, 0.3, 500.0 * nanometer)
+
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(avg_layer)
+        multi_layer.addLayerWithTopRoughness(substrate_layer, roughness)
+        self.sample = multi_layer
+        return self.sample
+
+
+def get_real_data():
+    return OutputDataIOFactory.readIntensityData("001_150_P109_cut_phitheta.txt.gz")
+
+
+def get_simulation():
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setBeamParameters(1.77*angstrom, 0.4*degree, 0.0*degree)
+    simulation.setBeamIntensity(4.942287e+12)
+
+    #sim_params = SimulationParameters()
+    #sim_params.m_mc_integration = True
+    #sim_params.m_mc_points = 20
+    #simulation.setSimulationParameters(sim_params)
+
+    #simulation.setDetectorResolutionFunction(ResolutionFunction2DGaussian(0.00025, 0.00025))
+
+    #wavelength_distr = DistributionLogNormal(1.77*angstrom, 0.01)
+    #wavelength_distr = DistributionGaussian(1.77*angstrom, 0.02*angstrom)
+    #alpha_distr = DistributionGaussian(-0.4*degree, 0.02*degree)
+    #phi_distr = DistributionGaussian(0.0*degree, 0.02*degree)
+    #simulation.addParameterDistribution("*/Beam/wavelength", wavelength_distr, 5)
+    #simulation.addParameterDistribution("*/Beam/alpha", alpha_distr, 5)
+    #simulation.addParameterDistribution("*/Beam/phi", phi_distr, 5)
+
+    sample_builder = MesoSampleBuilder()
+    simulation.setSampleBuilder(sample_builder)
+    real_data = get_real_data()
+    simulation.setDetectorParameters(real_data)
+
+    return simulation
+
+
+def run_simulation():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+    SetMessageLevel("DEBUG")
+
+    if(world_size == 1):
+        print "Not an OpenMPI environment, run with 'mpirun -np 12 python ompi_sim_example.py'"
+        print "For now continue without OpenMPI..."
+        simulation.runSimulation()
+        simulation.normalize()
+        sumresult = simulation.getIntensityData().getArray()
+
+    else:
+        if(world_rank != 0):
+            thread_info = ThreadInfo()
+            thread_info.n_batches = world_size - 1
+            thread_info.current_batch = world_rank - 1
+            print " xxx preparing to run ", thread_info.n_batches, thread_info.current_batch
+            simulation.setThreadInfo(thread_info)
+            simulation.runSimulation()
+            simulation.normalize()
+
+            comm.Send(simulation.getIntensityData().getArray())
+
+        if(world_rank == 0):
+            sumresult = simulation.getIntensityData().getArray()
+            sumresult = numpy.zeros(sumresult.shape)
+
+            print "preparing to receive"
+            for i_proc in range(1, world_size):
+                print "  ... receiving",i_proc
+                result = numpy.zeros(sumresult.shape)
+                comm.Recv(result, i_proc)
+                sumresult += result
+            print sumresult
+
+
+    if(world_rank == 0):
+        simulation.normalize()
+        result = simulation.getIntensityData()
+        print result.getArray()
+        axis_phi = result.getAxis(0)
+        axis_alpha = result.getAxis(1)
+        im = pylab.imshow(result.getArray()+1, norm=matplotlib.colors.LogNorm(),
+                 extent=[axis_phi.getMin(), axis_phi.getMax(), axis_alpha.getMin(), axis_alpha.getMax()])
+        pylab.colorbar(im)
+        pylab.xlabel(r'$\phi_f$', fontsize=20)
+        pylab.ylabel(r'$\alpha_f$', fontsize=20)
+        pylab.show()
+        pylab.savefig("result.png")
+        OutputDataIOFactory.writeIntensityData(result, 'result.txt')
+
+
+
+
+if __name__ == '__main__':
+    run_simulation()
+
diff --git a/dev-tools/openmpi/pytests/ompi_meso_cpp.py b/dev-tools/openmpi/pytests/ompi_meso_cpp.py
new file mode 100644
index 0000000..cd64176
--- /dev/null
+++ b/dev-tools/openmpi/pytests/ompi_meso_cpp.py
@@ -0,0 +1,208 @@
+from mpi4py import MPI # this line has to be first
+import numpy
+import matplotlib
+matplotlib.use('Agg')
+import pylab
+from math import degrees
+import math
+from time import time
+import ctypes
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+comm = MPI.COMM_WORLD
+world_size = comm.Get_size()
+world_rank = comm.Get_rank()
+
+class MesoSampleBuilder(IMultiLayerBuilder):
+    """
+    Meso crystal sample builder
+    """
+    def __init__(self):
+        IMultiLayerBuilder.__init__(self)
+        self.sample = None
+        # parameters describing the sample
+
+        self.m_lattice_length_a = ctypes.c_double(1.246708e+01*nanometer)
+        self.m_lattice_length_c = ctypes.c_double(1.338787e+01*nanometer)
+        self.m_nanoparticle_radius = ctypes.c_double(4.848528e+00*nanometer)
+        self.m_sigma_nanoparticle_radius = ctypes.c_double(3.6720e-01*nanometer)
+        self.m_meso_height = ctypes.c_double(1.1221e+02*nanometer)
+        self.m_meso_radius = ctypes.c_double(9.4567e+02*nanometer)
+        self.m_sigma_meso_height = ctypes.c_double(5.0*nanometer)
+        self.m_sigma_meso_radius = ctypes.c_double(5.0*nanometer)
+        self.m_sigma_lattice_length_a = ctypes.c_double(1.1601e+00*nanometer)
+        self.m_surface_filling_ratio = ctypes.c_double(1.7286e-01)
+        self.m_roughness = ctypes.c_double(10.0*nanometer)
+        self.m_scale_param = math.sqrt(math.log((self.m_sigma_nanoparticle_radius.value/self.m_nanoparticle_radius.value)**2+1.0))
+
+        # register parameters
+        self.registerParameter("meso_radius", ctypes.addressof(self.m_meso_radius))
+        self.registerParameter("surface_filling_ratio", ctypes.addressof(self.m_surface_filling_ratio))
+        self.registerParameter("meso_height", ctypes.addressof(self.m_meso_height))
+        self.registerParameter("sigma_meso_height", ctypes.addressof(self.m_sigma_meso_height))
+        self.registerParameter("sigma_meso_radius", ctypes.addressof(self.m_sigma_meso_radius))
+        self.registerParameter("lattice_length_a", ctypes.addressof(self.m_lattice_length_a))
+        self.registerParameter("lattice_length_c", ctypes.addressof(self.m_lattice_length_c))
+        self.registerParameter("nanoparticle_radius", ctypes.addressof(self.m_nanoparticle_radius))
+        self.registerParameter("sigma_nanoparticle_radius", ctypes.addressof(self.m_sigma_nanoparticle_radius))
+        self.registerParameter("sigma_lattice_length_a", ctypes.addressof(self.m_sigma_lattice_length_a))
+        self.registerParameter("roughness", ctypes.addressof(self.m_roughness))
+
+    def CreateMeso(self, a, c, material, radius, sigma_radius, meso_form_factor):
+        lattice = self.CreateLattice(a, c)
+        bas_a = lattice.getBasisVectorA()
+        bas_b = lattice.getBasisVectorB()
+        bas_c = lattice.getBasisVectorC()
+        #particle = Particle(material, FormFactorSphereGaussianRadius(radius, sigma_radius))
+        particle = Particle(material, FormFactorSphereLogNormalRadius(radius, self.m_scale_param, 10))
+        position_0 = kvector_t(0.0, 0.0, 0.0)
+        position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c)
+        position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c)
+        pos_vector = [position_0, position_1, position_2]
+        basis = ParticleComposition()
+        basis.addParticles(particle, pos_vector)
+        npc = Crystal(basis, lattice)
+        dw_factor = self.m_sigma_lattice_length_a.value*self.m_sigma_lattice_length_a.value/6.0
+        npc.setDWFactor(dw_factor)
+        result = MesoCrystal(npc, meso_form_factor)
+        return result
+
+    def CreateLattice(self, a, c):
+        result = Lattice.createTrigonalLattice(a, c*2.3)
+        result.setSelectionRule(SimpleSelectionRule(-1, 1, 1, 3))
+        return result
+
+    # constructs the sample for current values of parameters
+    def buildSample(self):
+        # create materials
+        surface_density = self.m_surface_filling_ratio.value/numpy.pi/self.m_meso_radius.value/self.m_meso_radius.value
+        n_particle = complex(1.0-2.84e-5, 4.7e-7)
+        avg_n_squared_meso = 0.7886*n_particle**2 + 0.2114
+        n_avg = numpy.sqrt(self.m_surface_filling_ratio.value*avg_n_squared_meso + 1.0 - self.m_surface_filling_ratio.value)
+        n_particle_adapted = numpy.sqrt(n_avg**2 + n_particle**2 - 1.0)
+        particle_material = HomogeneousMaterial("nanoparticle", n_particle_adapted)
+
+        ff_cyl = FormFactorCylinder(self.m_meso_radius.value, self.m_meso_height.value)
+        ff_meso = FormFactorDecoratorDebyeWaller(ff_cyl, self.m_sigma_meso_height.value**2/2.0,
+                                             self.m_sigma_meso_radius.value**2/2.0)
+
+        # Create multilayer
+        multi_layer = MultiLayer()
+
+        air_material = HomogeneousMaterial("Air", 0.0, 0.0)
+        substrate_material = HomogeneousMaterial("Substrate", 7.57e-6, 1.73e-7)
+        average_layer_material = HomogeneousMaterial("AverageLayer", n_avg)
+        air_layer = Layer()
+        air_layer.setMaterial(air_material)
+        avg_layer = Layer()
+        avg_layer.setMaterial(average_layer_material)
+        avg_layer.setThickness(self.m_meso_height.value)
+        substrate_layer = Layer()
+        substrate_layer.setMaterial(substrate_material)
+        particle_decoration = ParticleLayout()
+
+        max_phi_rotation_steps = 180
+        max_tilt_rotation_steps = 1
+
+        phi_step = 2.0*numpy.pi/3.0/max_phi_rotation_steps
+        phi_start = 0.0
+        #zeta_step = 0.5*degree
+        #zeta_start = -zeta_step*(max_tilt_rotation_steps/2)
+        for i in range(0, max_phi_rotation_steps):
+            for j in range(0, max_tilt_rotation_steps):
+                #trafo_y = Transform3D.createRotateY(zeta_start + j*zeta_step)
+                trafo_z = Transform3D.createRotateZ(phi_start + i*phi_step)
+                #trafo = trafo_z*trafo_y
+                trafo = trafo_z
+                particle_decoration.addParticle(
+                    self.CreateMeso(self.m_lattice_length_a.value, self.m_lattice_length_c.value,
+                            particle_material, self.m_nanoparticle_radius.value,
+                            self.m_sigma_nanoparticle_radius.value, ff_meso), trafo,
+                            self.m_meso_height.value)
+
+        particle_decoration.setTotalParticleSurfaceDensity(surface_density)
+
+        avg_layer.addLayout(particle_decoration)
+
+        roughness = LayerRoughness(self.m_roughness.value, 0.3, 500.0 * nanometer)
+
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(avg_layer)
+        multi_layer.addLayerWithTopRoughness(substrate_layer, roughness)
+        self.sample = multi_layer
+        return self.sample
+
+
+def get_real_data():
+    return OutputDataIOFactory.readIntensityData("001_150_P109_cut_phitheta.txt.gz")
+
+
+def get_simulation():
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setBeamParameters(1.77*angstrom, 0.4*degree, 0.0*degree)
+    simulation.setBeamIntensity(4.942287e+12)
+
+    #sim_params = SimulationParameters()
+    #sim_params.m_mc_integration = True
+    #sim_params.m_mc_points = 20
+    #simulation.setSimulationParameters(sim_params)
+
+    #simulation.setDetectorResolutionFunction(ResolutionFunction2DGaussian(0.00025, 0.00025))
+
+    #wavelength_distr = DistributionLogNormal(1.77*angstrom, 0.01)
+    #wavelength_distr = DistributionGaussian(1.77*angstrom, 0.02*angstrom)
+    #alpha_distr = DistributionGaussian(-0.4*degree, 0.02*degree)
+    #phi_distr = DistributionGaussian(0.0*degree, 0.02*degree)
+    #simulation.addParameterDistribution("*/Beam/wavelength", wavelength_distr, 5)
+    #simulation.addParameterDistribution("*/Beam/alpha", alpha_distr, 5)
+    #simulation.addParameterDistribution("*/Beam/phi", phi_distr, 5)
+
+    sample_builder = MesoSampleBuilder()
+    simulation.setSampleBuilder(sample_builder)
+    real_data = get_real_data()
+    simulation.setDetectorParameters(real_data)
+
+    return simulation
+
+
+def run_simulation():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+
+
+    #if(world_size == 1):
+    #    print "Not an OpenMPI environment, run with 'mpirun -np 12 python ompi_sim_example.py'"
+    #    exit(0)
+
+    SetMessageLevel("DEBUG")
+
+    thread_info = ThreadInfo()
+    thread_info.n_threads = 4
+    simulation.setThreadInfo(thread_info)
+    simulation.runOMPISimulation()
+
+    if(world_rank == 0):
+        simulation.normalize()
+        result = simulation.getIntensityData()
+        print result.getArray()
+        axis_phi = result.getAxis(0)
+        axis_alpha = result.getAxis(1)
+        im = pylab.imshow(result.getArray()+1, norm=matplotlib.colors.LogNorm(),
+                 extent=[axis_phi.getMin(), axis_phi.getMax(), axis_alpha.getMin(), axis_alpha.getMax()])
+        pylab.colorbar(im)
+        pylab.xlabel(r'$\phi_f$', fontsize=20)
+        pylab.ylabel(r'$\alpha_f$', fontsize=20)
+        pylab.show()
+        pylab.savefig("result.png")
+        OutputDataIOFactory.writeIntensityData(result, 'result.txt')
+
+
+
+
+if __name__ == '__main__':
+    run_simulation()
+
diff --git a/dev-tools/openmpi/pytests/result.png b/dev-tools/openmpi/pytests/result.png
new file mode 100644
index 0000000..aea7640
Binary files /dev/null and b/dev-tools/openmpi/pytests/result.png differ
diff --git a/dev-tools/openmpi/pytests/result.txt b/dev-tools/openmpi/pytests/result.txt
new file mode 100644
index 0000000..acbf803
--- /dev/null
+++ b/dev-tools/openmpi/pytests/result.txt
@@ -0,0 +1,182 @@
+# 2D scattering data
+# shape 175 245
+# 0-axis [phi]
+1.5023432874e-02    1.5207065280e-02    1.5390696660e-02    1.5574327002e-02    1.5757956294e-02    1.5941584523e-02    1.6125211677e-02    1.6308837743e-02    1.6492462709e-02    1.6676086563e-02    1.6859709293e-02    1.7043330885e-02    1.7226951328e-02    1.7410570609e-02    1.7594188716e-02    1.7777805637e-02    1.7961421359e-02    1.8145035869e-02    1.8328649156e-02    1.8512261207e-02    1.8695872009e-02    1.8879481551e-02    1.9063089820e-02    1.9246696803e-02    1.9430302488 [...]
+# 1-axis [theta]
+1.0879025216e-04    2.9245847082e-04    4.7612629293e-04    6.5979370610e-04    8.4346069795e-04    1.0271272561e-03    1.2107933681e-03    1.3944590216e-03    1.5781242043e-03    1.7617889036e-03    1.9454531073e-03    2.1291168029e-03    2.3127799781e-03    2.4964426205e-03    2.6801047176e-03    2.8637662572e-03    3.0474272267e-03    3.2310876139e-03    3.4147474063e-03    3.5984065915e-03    3.7820651572e-03    3.9657230909e-03    4.1493803804e-03    4.3330370131e-03    4.5166929767 [...]
+# data
+5.1389841486e+08    3.6987520441e+09    9.7370254199e+09    1.8523046911e+10    2.9913239602e+10    4.3737913458e+10    5.9822068125e+10    7.8022745852e+10    9.8299192182e+10    1.2085366868e+11    1.4644046911e+11    1.7713095073e+11    2.1855701792e+11    2.8840010425e+11    4.6395064041e+11    6.2527534033e+11    6.0276935407e+11    5.3031608980e+11    5.5154392730e+11    6.4661305837e+11    6.2501196892e+11    5.5760018983e+11    5.6752894374e+11    5.6460080560e+11    5.7991637615 [...]
+5.1404457843e+08    3.7050591198e+09    9.7808525230e+09    1.8686430995e+10    3.0359081453e+10    4.4748921936e+10    6.1855055502e+10    8.1790262149e+10    1.0490202837e+11    1.3201439760e+11    1.6495622582e+11    2.0786225908e+11    2.7096524260e+11    3.8480997406e+11    6.7725756441e+11    7.5147160064e+11    6.3011961400e+11    4.9572256729e+11    5.1832379454e+11    6.3067161338e+11    6.0438362951e+11    5.3517410122e+11    5.5249900377e+11    5.4617868352e+11    5.7491384775 [...]
+5.3117835344e+08    3.8349376155e+09    1.0156741010e+10    1.9501373544e+10    3.1902349343e+10    4.7453801971e+10    6.6366510330e+10    8.9067977060e+10    1.1638930117e+11    1.4993782442e+11    1.9290926184e+11    2.5208307736e+11    3.4362124510e+11    5.1470577394e+11    9.5882912529e+11    9.2812843927e+11    6.8118287112e+11    4.6645576169e+11    4.9079695983e+11    6.2669350866e+11    5.9351555375e+11    5.1921765695e+11    5.4536990481e+11    5.3408349776e+11    5.7943309705 [...]
+4.9231585598e+08    3.5558366929e+09    9.4251698659e+09    1.8119034315e+10    2.9691397457e+10    4.4263677443e+10    6.2081325775e+10    8.3614908713e+10    1.0974885118e+11    1.4215777425e+11    1.8412650641e+11    2.4256440284e+11    3.3385603510e+11    5.0568330662e+11    9.5306739293e+11    9.0550783091e+11    6.5128021454e+11    4.3456548452e+11    4.5929649943e+11    5.9471995215e+11    5.6338454900e+11    4.9451648249e+11    5.2356201850e+11    5.1322520010e+11    5.6261811224 [...]
+6.4996932720e+08    4.7106061856e+09    1.2569105969e+10    2.4405566783e+10    4.0539362867e+10    6.1498744114e+10    8.8142939096e+10    1.2187990583e+11    1.6507219654e+11    2.2184475816e+11    2.9984188382e+11    4.1453457535e+11    6.0170567356e+11    9.6384880821e+11    1.9136762828e+12    1.5664486907e+12    9.1147407235e+11    4.2786474024e+11    4.5792441547e+11    6.7780533841e+11    6.1818943237e+11    5.1587582126e+11    5.6908160775e+11    5.3865635737e+11    6.3859195330 [...]
+1.1340387323e+09    8.2471263758e+09    2.2150862424e+10    4.3432269197e+10    7.3083935101e+10    1.1267260995e+11    1.6463474043e+11    2.3280303650e+11    3.2338704344e+11    4.4692307994e+11    6.2251156915e+11    8.8819597390e+11    1.3310148019e+12    2.1984984934e+12    4.4800451891e+12    3.3610899334e+12    1.6508516902e+12    4.6051115296e+11    5.0398264996e+11    9.4900652007e+11    8.1140782509e+11    6.1137187728e+11    7.2425672882e+11    6.3890652295e+11    8.6670481160 [...]
+1.4855386945e+09    1.0818395493e+10    2.9134376644e+10    5.7349346133e+10    9.7001074320e+10    1.5050005367e+11    2.2156917825e+11    3.1602717165e+11    4.4324751951e+11    6.1905958246e+11    8.7205259948e+11    1.2590153470e+12    1.9096365861e+12    3.1923257789e+12    6.5784261759e+12    4.8526413641e+12    2.2764584479e+12    4.8866954824e+11    5.4511489161e+11    1.1951901326e+12    9.9219295208e+11    7.0434176053e+11    8.7885108716e+11    7.4319570817e+11    1.1082445214 [...]
+5.8806900050e+09    4.2944681103e+10    1.1626315917e+11    2.3063096872e+11    3.9404332547e+11    6.1895203963e+11    9.2446793772e+11    1.3402858100e+12    1.9139945760e+12    2.7256147568e+12    3.9191884298e+12    5.7801478443e+12    8.9593102079e+12    1.5303877030e+13    3.2190433367e+13    2.3313360527e+13    1.0227035505e+13    1.0873024574e+12    1.3048561113e+12    4.5411927594e+12    3.5157693281e+12    2.0769185724e+12    3.0253539551e+12    2.2442501291e+12    4.3685546681 [...]
+9.0501519360e+09    6.6030371873e+10    1.7845034742e+11    3.5306692589e+11    6.0111136347e+11    9.3999735878e+11    1.3963137894e+12    2.0111544321e+12    2.8500382365e+12    4.0226270377e+12    5.7255537757e+12    8.3472746506e+12    1.2771491834e+13    2.1501860406e+13    4.4505451049e+13    3.1579898665e+13    1.3508150193e+13    1.3050412993e+12    1.5546712734e+12    5.5414156213e+12    4.1680246558e+12    2.3736849017e+12    3.4061526684e+12    2.4461912732e+12    4.6792937688 [...]
+7.9962581562e+08    5.8205268359e+09    1.5661058240e+10    3.0788588645e+10    5.1991237136e+10    8.0510326354e+10    1.1827266190e+11    1.6830458072e+11    2.3550330234e+11    3.2817128101e+11    4.6135124225e+11    6.6499648552e+11    1.0076327408e+12    1.6841825730e+12    3.4747537538e+12    2.6338633971e+12    1.3116957361e+12    3.7314955982e+11    4.1517949063e+11    7.9111836442e+11    6.8729215969e+11    5.3366634651e+11    6.4226265982e+11    5.7670941425e+11    7.9257969531 [...]
+6.5897848704e+08    4.7934992477e+09    1.2880852955e+10    2.5273597314e+10    4.2566937699e+10    6.5698930262e+10    9.6126170090e+10    1.3613688968e+11    1.8943412385e+11    2.6229554095e+11    3.6609414594e+11    5.2347308743e+11    7.8622682699e+11    1.3016587389e+12    2.6590091029e+12    2.0300449649e+12    1.0408178530e+12    3.4303431279e+11    3.7971187747e+11    6.6577268435e+11    5.8972282748e+11    4.7841886335e+11    5.5902330383e+11    5.1671596971e+11    6.6581734835 [...]
+4.7070013045e+08    3.4201757226e+09    9.1711690443e+09    1.7938696975e+10    3.0088261562e+10    4.6199749919e+10    6.7179492711e+10    9.4460002887e+10    1.3037206963e+11    1.7888493806e+11    2.4721527364e+11    3.4976931403e+11    5.1956122186e+11    8.5060200593e+11    1.7195325231e+12    1.3554951144e+12    7.4890189261e+11    3.1440248355e+11    3.4627429644e+11    5.4416014692e+11    4.9849506383e+11    4.2916773396e+11    4.8636641578e+11    4.6667396481e+11    5.6228887822 [...]
+2.7894819653e+08    2.0222719378e+09    5.3990444285e+09    1.0492100463e+10    1.7446661512e+10    2.6500179082e+10    3.8034717854e+10    5.2670416310e+10    7.1439761371e+10    9.6134578250e+10    1.3006096412e+11    1.7989062582e+11    2.6102897257e+11    4.1757929853e+11    8.2752159756e+11    7.2434141757e+11    4.8079053033e+11    2.9023604943e+11    3.1818319610e+11    4.3886370782e+11    4.2129126938e+11    3.8903648971e+11    4.2754866245e+11    4.2759626129e+11    4.8156399744 [...]
+2.1140089937e+08    1.5305176970e+09    4.0755510140e+09    7.8893143126e+09    1.3049883702e+10    1.9689586162e+10    2.8028348734e+10    3.8433238835e+10    5.1529567097e+10    6.8422261469e+10    9.1177867915e+10    1.2400753855e+11    1.7669994839e+11    2.7741724699e+11    5.4062128179e+11    5.2095657729e+11    3.9409817624e+11    2.8198031414e+11    3.0900554063e+11    4.0539045411e+11    3.9718261327e+11    3.7760009251e+11    4.1064944495e+11    4.1729928382e+11    4.5827766751 [...]
+1.9693029970e+08    1.4255312832e+09    3.7948249325e+09    7.3424010858e+09    1.2137044557e+10    1.8295600033e+10    2.6012581706e+10    3.5613020281e+10    4.7651054478e+10    6.3106355495e+10    8.3811801670e+10    1.1350320303e+11    1.6086660142e+11    2.5089521641e+11    4.8528577018e+11    4.7993199093e+11    3.7619153038e+11    2.8092494890e+11    3.0804071355e+11    3.9880455473e+11    3.9289723233e+11    3.7713878332e+11    4.0881387736e+11    4.1745268931e+11    4.5418829562 [...]
+1.7234470232e+08    1.2466082464e+09    3.3135925539e+09    6.3968663819e+09    1.0541520424e+10    1.5826985855e+10    2.2389549708e+10    3.0462475440e+10    4.0451008315e+10    5.3081705441e+10    6.9727825209e+10    9.3208486700e+10    1.3011060714e+11    1.9945611352e+11    3.7911344757e+11    4.0542742468e+11    3.4608782086e+11    2.8094646610e+11    3.0798712541e+11    3.8962690951e+11    3.8738130837e+11    3.7683131776e+11    4.0635062227e+11    4.1780089146e+11    4.4896766392 [...]
+1.4629605528e+08    1.0569123796e+09    2.8027543672e+09    5.3914005139e+09    8.8411604988e+09    1.3189605861e+10    1.8508544476e+10    2.4930752199e+10    3.2699880207e+10    4.2270010922e+10    5.4522790745e+10    7.1301524150e+10    9.6966104548e+10    1.4421835227e+11    2.6578846095e+11    3.2810680007e+11    3.1654545067e+11    2.8287674580e+11    3.0987214741e+11    3.8264228039e+11    3.8411308530e+11    3.7841845863e+11    4.0595252444e+11    4.2009627305e+11    4.4631495408 [...]
+1.3496970217e+08    9.7439054656e+08    2.5803255220e+09    4.9530042270e+09    8.0984243029e+09    1.2034890568e+10    1.6804482163e+10    2.2493508927e+10    2.9270698685e+10    3.7463394775e+10    4.7723904474e+10    6.1439117609e+10    8.1925549447e+10    1.1892064418e+11    2.1337230361e+11    2.9448341228e+11    3.0640845696e+11    2.8795291549e+11    3.1516948375e+11    3.8420442653e+11    3.8747212745e+11    3.8401309250e+11    4.1065825651e+11    4.2619201864e+11    4.4987174538 [...]
+1.3265298001e+08    9.5736384391e+08    2.5336720472e+09    4.8588463661e+09    7.9339745026e+09    1.1769737898e+10    1.6396519487e+10    2.1882407856e+10    2.8366773717e+10    3.6127252172e+10    4.5725983508e+10    5.8370002495e+10    7.6963466561e+10    1.1007135839e+11    1.9399617430e+11    2.8483521871e+11    3.0729925821e+11    2.9540678754e+11    3.2297570148e+11    3.9096765722e+11    3.9496343942e+11    3.9225651721e+11    4.1849463600e+11    4.3471990288e+11    4.5696446768 [...]
+1.3046282895e+08    9.4110566911e+08    2.4883068313e+09    4.7649941087e+09    7.7651859106e+09    1.1488823648e+10    1.5950221750e+10    2.1193023894e+10    2.7318181636e+10    3.4539669448e+10    4.3306197241e+10    5.4601555663e+10    7.0823245936e+10    9.9104569770e+10    1.7011070444e+11    2.7324566615e+11    3.0851324036e+11    3.0431844313e+11    3.3222926616e+11    3.9906639174e+11    4.0382247927e+11    4.0170391857e+11    4.2745276058e+11    4.4435601545e+11    4.6515822827 [...]
+1.2874014026e+08    9.2812009838e+08    2.4510838048e+09    4.6852563050e+09    7.6161128521e+09    1.1230785140e+10    1.5524680396e+10    2.0513211952e+10    2.6253615503e+10    3.2888455694e+10    4.0740778661e+10    5.0549416203e+10    6.4159751498e+10    8.7152497852e+10    1.4411261842e+11    2.6132595296e+11    3.1064221886e+11    3.1459931475e+11    3.4285273553e+11    4.0862895893e+11    4.1410391022e+11    4.1233178850e+11    4.3757041375e+11    4.5508515797e+11    4.7456372071 [...]
+1.3052181869e+08    9.4053084470e+08    2.4816170130e+09    4.7370554216e+09    7.6854612140e+09    1.1303926660e+10    1.5573447601e+10    2.0488499436e+10    2.6074802189e+10    3.2424728196e+10    3.9774849236e+10    4.8698040642e+10    6.0669772893e+10    8.0239394216e+10    1.2800459992e+11    2.5707780885e+11    3.1678125865e+11    3.2633742595e+11    3.5496406525e+11    4.2051786801e+11    4.2634021262e+11    4.2432830352e+11    4.4914387533e+11    4.6702544876e+11    4.8547128353 [...]
+1.3549337558e+08    9.7604419736e+08    2.5737108671e+09    4.9081385331e+09    7.9523677879e+09    1.1675585488e+10    1.6047853673e+10    2.1048411887e+10    2.6681029834e+10    3.3004573240e+10    4.0199979006e+10    4.8736659875e+10    5.9864753180e+10    7.7515037800e+10    1.1994681780e+11    2.5902602793e+11    3.2617929549e+11    3.3934349870e+11    3.6835525328e+11    4.3428786130e+11    4.4015760752e+11    4.3743455774e+11    4.6184411402e+11    4.7990683984e+11    4.9743650832 [...]
+1.4189019240e+08    1.0218247221e+09    2.6928801360e+09    5.1308684970e+09    8.3030072960e+09    1.2170340851e+10    1.6691871143e+10    2.1831763592e+10    2.7572617500e+10    3.3941848463e+10    4.1069549685e+10    4.9332651837e+10    5.9783327192e+10    7.5816300260e+10    1.1369988581e+11    2.6290134345e+11    3.3704278321e+11    3.5336243985e+11    3.8275029880e+11    4.4926923346e+11    4.5506679817e+11    4.5136004922e+11    4.7533625528e+11    4.9348801033e+11    5.1014381759 [...]
+1.4926414219e+08    1.0746303736e+09    2.8305047471e+09    5.3886014142e+09    8.7099586432e+09    1.2747071734e+10    1.7447485285e+10    2.2760034584e+10    2.8646253872e+10    3.5103030514e+10    4.2212346180e+10    5.0265648935e+10    6.0135615626e+10    7.4738113505e+10    1.0860076733e+11    2.6825994466e+11    3.4914371303e+11    3.6825509107e+11    3.9801348139e+11    4.6533720443e+11    4.7095927974e+11    4.6600683242e+11    4.8955697488e+11    5.0769988530e+11    5.2360760776 [...]
+1.5800152218e+08    1.1372795338e+09    2.9941976268e+09    5.6963905035e+09    9.1988146211e+09    1.3445684428e+10    1.8373702672e+10    2.3917602337e+10    3.0020240999e+10    3.6652588995e+10    4.3857669682e+10    5.1860837797e+10    6.1401437804e+10    7.5051070616e+10    1.0614746968e+11    2.7597733346e+11    3.6271824456e+11    3.8391144954e+11    4.1403289774e+11    4.8242625842e+11    4.8773634649e+11    4.8126404606e+11    5.0439097677e+11    5.2241764429e+11    5.3767404073 [...]
+1.6805192386e+08    1.2094027938e+09    3.1829585674e+09    6.0522249415e+09    9.7660659296e+09    1.4260497153e+10    1.9461653628e+10    2.5290831735e+10    3.1673613935e+10    3.8557890787e+10    4.5953519853e+10    5.4032238993e+10    6.3430038703e+10    7.6462095306e+10    1.0563205376e+11    2.8537517648e+11    3.7734944263e+11    4.0017647925e+11    4.3064001097e+11    5.0021921215e+11    5.0511719231e+11    4.9692593334e+11    5.1957973390e+11    5.3742089398e+11    5.5198797179 [...]
+1.7900253852e+08    1.2880033948e+09    3.3887586806e+09    6.4404425996e+09    1.0385539231e+10    1.5151509972e+10    2.0653520023e+10    2.6799019995e+10    3.3495990515e+10    4.0669089633e+10    4.8295434471e+10    5.6494902772e+10    6.5805451678e+10    7.8303732143e+10    1.0573786049e+11    2.9547373306e+11    3.9255153640e+11    4.1689702318e+11    4.4767488601e+11    5.1845129274e+11    5.2288195175e+11    5.1283143992e+11    5.3494948818e+11    5.5256101656e+11    5.6636809488 [...]
+1.9065752029e+08    1.3716747127e+09    3.6079136098e+09    6.8540857088e+09    1.1046125818e+10    1.6102760513e+10    2.1928040617e+10    2.8415547184e+10    3.5455883855e+10    4.2951380484e+10    5.0848534009e+10    5.9220492968e+10    6.8520530100e+10    8.0626190166e+10    1.0669671999e+11    3.0643495790e+11    4.0834508042e+11    4.3396338431e+11    4.6503226415e+11    5.3708528172e+11    5.4098402283e+11    5.2891817191e+11    5.5047872041e+11    5.6779848316e+11    5.8086847427 [...]
+2.0303101216e+08    1.4605342298e+09    3.8408140587e+09    7.2941375753e+09    1.1749962024e+10    1.7118460485e+10    2.3292959166e+10    3.0153944401e+10    3.7576148146e+10    4.5442409015e+10    5.3674280833e+10    6.2310189771e+10    7.1747143672e+10    8.3746946836e+10    1.0921932920e+11    3.1870379692e+11    4.2484795018e+11    4.5127402569e+11    4.8261449557e+11    5.5608940982e+11    5.5937062788e+11    5.4511772258e+11    5.6612397511e+11    5.8307355781e+11    5.9548588200 [...]
+2.1601692941e+08    1.5538137345e+09    4.0854130542e+09    7.7566296794e+09    1.2490463047e+10    1.8188618311e+10    2.4733915772e+10    3.1994219522e+10    3.9829341872e+10    4.8104512792e+10    5.6720142210e+10    6.5688059164e+10    7.5368500721e+10    8.7464585814e+10    1.1286942882e+11    3.3186097719e+11    4.4179250956e+11    4.6869950918e+11    5.0028863729e+11    5.7525226737e+11    5.7784544138e+11    5.6128510424e+11    5.8171412354e+11    5.9823615064e+11    6.1001444724 [...]
+2.2935922074e+08    1.6496516071e+09    4.3367126091e+09    8.2317668002e+09    1.3251151694e+10    1.9287829439e+10    2.6213760456e+10    3.3883740398e+10    4.2142099914e+10    5.0835737642e+10    5.9842940453e+10    6.9147489493e+10    7.9070291855e+10    9.1249882864e+10    1.1654205608e+11    3.4503237528e+11    4.5872499987e+11    4.8610186639e+11    5.1790758606e+11    5.9430099469e+11    5.9617613531e+11    5.7725532721e+11    5.9705193708e+11    6.1312136672e+11    6.2420953186 [...]
+2.4288588504e+08    1.7468050980e+09    4.5914164900e+09    8.7132063741e+09    1.4021622924e+10    2.0400563730e+10    2.7710688287e+10    3.5793118922e+10    4.4475839724e+10    5.3586188012e+10    6.2978320429e+10    7.2604361160e+10    8.2738294860e+10    9.4933475043e+10    1.1992762784e+11    3.5794472041e+11    4.7546392389e+11    5.0336971073e+11    5.3535654859e+11    6.1309555200e+11    6.1423935876e+11    5.9292501602e+11    6.1203846818e+11    6.2763610237e+11    6.3797884176 [...]
+2.5660424298e+08    1.8453416876e+09    4.8497792031e+09    9.2016596136e+09    1.4803545400e+10    2.1530296576e+10    2.9231347888e+10    3.7734320575e+10    4.6851238493e+10    5.6390545338e+10    6.6183742572e+10    7.6154470943e+10    8.6537338386e+10    9.8822478390e+10    1.2371652299e+11    3.7104781050e+11    4.9213833511e+11    5.2042094066e+11    5.5255452517e+11    6.3162766077e+11    6.3201523019e+11    6.0824586503e+11    6.2666044711e+11    6.4174792918e+11    6.5134919865 [...]
+2.7051172197e+08    1.9452535719e+09    5.1118357587e+09    9.6973567057e+09    1.5597663942e+10    2.2678855853e+10    3.0779583065e+10    3.9714681437e+10    4.9281379218e+10    5.9271313745e+10    6.9497135967e+10    7.9861709184e+10    9.0578128440e+10    1.0312448176e+11    1.2838066855e+11    3.8462127660e+11    5.0881303072e+11    5.3716862624e+11    5.6942217827e+11    6.4985794480e+11    6.4943829178e+11    6.2315807071e+11    6.4086724507e+11    6.5539886805e+11    6.6430358942 [...]
+2.8447054679e+08    2.0455432920e+09    5.3749299782e+09    1.0195154793e+10    1.6395466444e+10    2.3833381753e+10    3.2337043369e+10    4.1708925562e+10    5.1732166809e+10    6.2182771790e+10    7.2856682435e+10    8.3640260627e+10    9.4734877335e+10    1.0763429439e+11    1.3349962598e+11    3.9830027572e+11    5.2526286788e+11    5.5351207355e+11    5.8585093065e+11    6.6762511943e+11    6.6637588428e+11    6.3755426280e+11    6.5454577001e+11    6.6848858620e+11    6.7670836022 [...]
+2.9826622924e+08    2.1446533953e+09    5.6348908234e+09    1.0686909924e+10    1.7183323479e+10    2.4972999449e+10    3.3873455424e+10    4.3674606843e+10    5.4145151595e+10    6.5044854920e+10    7.6151819344e+10    8.7333625519e+10    9.8774666402e+10    1.1196931480e+11    1.3829647598e+11    4.1147481679e+11    5.4117480345e+11    5.6934600076e+11    6.0173331687e+11    6.8474237413e+11    6.8266213976e+11    6.5131974902e+11    6.6756117978e+11    6.8090374728e+11    6.8841056672 [...]
+3.1178911692e+08    2.2417924067e+09    5.8896230064e+09    1.1168601668e+10    1.7954663701e+10    2.6087944945e+10    3.5375182129e+10    4.5593449938e+10    5.6496499700e+10    6.7826934857e+10    7.9343264588e+10    9.0890688077e+10    1.0262823141e+11    1.1602662887e+11    1.4258275144e+11    4.2396218651e+11    5.5641953198e+11    5.8458465136e+11    6.1698344929e+11    7.0110223805e+11    6.9819640550e+11    6.6437579652e+11    6.7983289583e+11    6.9257037358e+11    6.9933239073 [...]
+3.2503223968e+08    2.3369186746e+09    6.1390610478e+09    1.1640235533e+10    1.8709792707e+10    2.7179252670e+10    3.6844706938e+10    4.7470537882e+10    5.8795701329e+10    7.0545774669e+10    8.2459757487e+10    9.4360410036e+10    1.0638092412e+11    1.1996650174e+11    1.4671902831e+11    4.3597630516e+11    5.7103848608e+11    5.9916160915e+11    6.3153602888e+11    7.1667000464e+11    7.1293904033e+11    6.7667620961e+11    6.9132957054e+11    7.0344992581e+11    7.0946303099 [...]
+3.3799463419e+08    2.4300339342e+09    6.3832544700e+09    1.2102038071e+10    1.9449378066e+10    2.8248495772e+10    3.8285266131e+10    4.9311960310e+10    6.1053549580e+10    7.3219781200e+10    8.5532062871e+10    9.7794173709e+10    1.1012083252e+11    1.2395123287e+11    1.5106297482e+11    4.4772978018e+11    5.8507374863e+11    6.1301614482e+11    6.4532973219e+11    7.3141753340e+11    7.2685811136e+11    6.8817796626e+11    7.0202737630e+11    7.1351049291e+11    7.1879252884 [...]
+3.5061205678e+08    2.5206765412e+09    6.6209918266e+09    1.2551715885e+10    2.0169741220e+10    2.9290344343e+10    3.9689656407e+10    5.1108468037e+10    6.3258634373e+10    7.5835307405e+10    8.8544256868e+10    1.0117372258e+11    1.1382706573e+11    1.2795654940e+11    1.5558274785e+11    4.5915922749e+11    5.9845586557e+11    6.2608269619e+11    6.5829918595e+11    7.4527240777e+11    7.3988465049e+11    6.9882454722e+11    7.1187141274e+11    7.2270035867e+11    7.2727085819 [...]
+3.6276615492e+08    2.6079890184e+09    6.8499865124e+09    1.2984832795e+10    2.0863521060e+10    3.0293644729e+10    4.1041911775e+10    5.2838010983e+10    6.5381107470e+10    7.8352275384e+10    9.1442205704e+10    1.0442426337e+11    1.1739122292e+11    1.3180913001e+11    1.5993692607e+11    4.6998392481e+11    6.1102915549e+11    6.3829340425e+11    6.7037672196e+11    7.5812947006e+11    7.5192416877e+11    7.0855048757e+11    7.2078639514e+11    7.3095519512e+11    7.3482073692 [...]
+3.7436091721e+08    2.6912769033e+09    7.0683925593e+09    1.3397824722e+10    2.1524842097e+10    3.1249568324e+10    4.2329523699e+10    5.4483525154e+10    6.7398227832e+10    8.0740639757e+10    9.4186032021e+10    1.0749166535e+11    1.2073599146e+11    1.3538652144e+11    1.6388132951e+11    4.7999511289e+11    6.2266616130e+11    6.4958965638e+11    6.8150061144e+11    7.6990340390e+11    7.6290443206e+11    7.1729869208e+11    7.2871594823e+11    7.3822567723e+11    7.4137854769 [...]
+3.8534462099e+08    2.7701687218e+09    7.2752361837e+09    1.3788851349e+10    2.2150760021e+10    3.2153864803e+10    4.3546778373e+10    5.6037730371e+10    6.9301106938e+10    8.2989961160e+10    9.6763892506e+10    1.1036291765e+11    1.2384783047e+11    1.3867591481e+11    1.6740779433e+11    4.8915773735e+11    6.3332323375e+11    6.5992310593e+11    6.9162426081e+11    7.8054603428e+11    7.7277602774e+11    7.2503088332e+11    7.3562366627e+11    7.4447742207e+11    7.4691518431 [...]
+3.9570441925e+08    2.8445763833e+09    7.4703081638e+09    1.4157581388e+10    2.2740891815e+10    3.3006274637e+10    4.4693866240e+10    5.7501815993e+10    7.1092811222e+10    8.5106568160e+10    9.9187712929e+10    1.1305969619e+11    1.2676602939e+11    1.4175299129e+11    1.7069007183e+11    4.9756992656e+11    6.4301389300e+11    6.6925540874e+11    7.0071064977e+11    7.9003367369e+11    7.8151501818e+11    7.3172285677e+11    7.4149247071e+11    7.4969105006e+11    7.5142572207 [...]
+4.0542515751e+08    2.9143943931e+09    7.6533493281e+09    1.4503576340e+10    2.3294653473e+10    3.3806189099e+10    4.5770399182e+10    5.8876034007e+10    7.2774930295e+10    8.7094528102e+10    1.0146585912e+11    1.1559783704e+11    1.2952015069e+11    1.4467566210e+11    1.7386155130e+11    5.0530288651e+11    6.5174373866e+11    6.7755298944e+11    7.0872723598e+11    7.9834533478e+11    7.8909913164e+11    7.3735306091e+11    7.4630760899e+11    7.5385037880e+11    7.5490416010 [...]
+4.1446512407e+08    2.9793226784e+09    7.8235704650e+09    1.4825336957e+10    2.3809628368e+10    3.4550083135e+10    4.6771569967e+10    6.0154142358e+10    7.4339632898e+10    8.8944250963e+10    1.0358677022e+11    1.1796344912e+11    1.3209311717e+11    1.4742134247e+11    1.7688527126e+11    5.1230941583e+11    6.5947253408e+11    6.8478356654e+11    7.1564268501e+11    8.0544651152e+11    7.9549448856e+11    7.4189635397e+11    7.5004604202e+11    7.5693478564e+11    7.5732986838 [...]
+4.2277148055e+08    3.0389794502e+09    7.9799587844e+09    1.5120913796e+10    2.4282616252e+10    3.5233174139e+10    4.7690648797e+10    6.1327035600e+10    7.5774899066e+10    9.0640049768e+10    1.0552992626e+11    1.2012908328e+11    1.3444649193e+11    1.4993046294e+11    1.7964547281e+11    5.1848913231e+11    6.6613976642e+11    6.9091866736e+11    7.2142824534e+11    8.1129874306e+11    8.0066772869e+11    7.4532928797e+11    7.5268517990e+11    7.5892642551e+11    7.5867885275 [...]
+4.3029276223e+08    3.0929923687e+09    8.1215241068e+09    1.5388393799e+10    2.4710460643e+10    3.5850714217e+10    4.8520901181e+10    6.2385516743e+10    7.7068453967e+10    9.2165708956e+10    1.0727384694e+11    1.2206579149e+11    1.3653946788e+11    1.5214013963e+11    1.8202451619e+11    5.2374686960e+11    6.7169248134e+11    6.9593426181e+11    7.2606119278e+11    8.1586464277e+11    8.0459041436e+11    7.4763537174e+11    7.5420430784e+11    7.5980895374e+11    7.5893597236 [...]
+4.3700707925e+08    3.1412046613e+09    8.2478577468e+09    1.5627011275e+10    2.5091951601e+10    3.6400986233e+10    4.9260071486e+10    6.3326800820e+10    7.8217044139e+10    9.3517634413e+10    1.0881481502e+11    1.2377007397e+11    1.3836931486e+11    1.5404919134e+11    1.8402314001e+11    5.2807086118e+11    6.7611388287e+11    6.9981549219e+11    7.2952664891e+11    8.1913211776e+11    8.0725174652e+11    7.4880622853e+11    7.5460013705e+11    7.5958058037e+11    7.5809790136 [...]
+4.4290339523e+08    3.1835384134e+09    8.3587624703e+09    1.5836414195e+10    2.5426573410e+10    3.6883340442e+10    4.9907460158e+10    6.4150300378e+10    7.9220469998e+10    9.4696465446e+10    1.1015502494e+11    1.2524697053e+11    1.3994625511e+11    1.5567851929e+11    1.8568982888e+11    5.3148678882e+11    6.7940907504e+11    7.0255351938e+11    7.3181740159e+11    8.2110303142e+11    8.0864808531e+11    7.4883998341e+11    7.5387628686e+11    7.5824463955e+11    7.5617021434 [...]
+4.4797447566e+08    3.2199427018e+09    8.4541101573e+09    1.6016376274e+10    2.5714000299e+10    3.7297378805e+10    5.0462664736e+10    6.4855735009e+10    8.0078787641e+10    9.5702950601e+10    1.1129660066e+11    1.2650101758e+11    1.4127961657e+11    1.5704788958e+11    1.8707546039e+11    5.3402886456e+11    6.8158879860e+11    7.0414378865e+11    7.3293092090e+11    8.2177488042e+11    8.0878370534e+11    7.4774351293e+11    7.5203872588e+11    7.5580769852e+11    7.5316980104 [...]
+4.5221153122e+08    3.2503549680e+09    8.5337397541e+09    1.6166601780e+10    2.5953778793e+10    3.7642485526e+10    5.0924927714e+10    6.5442260173e+10    8.0791166940e+10    9.6536441247e+10    1.1223925723e+11    1.2753277789e+11    1.4237143107e+11    1.5816212582e+11    1.8819014157e+11    5.3570090818e+11    6.8265424984e+11    7.0458659386e+11    7.3286853800e+11    8.2115518922e+11    8.0766277144e+11    7.4552245095e+11    7.4909775889e+11    7.5228106277e+11    7.4910618865 [...]
+4.5560181048e+08    3.2746831357e+09    8.5974073117e+09    1.6286622024e+10    2.6145141360e+10    3.7917517027e+10    5.1292645631e+10    6.5907715577e+10    8.1354768725e+10    9.7193249686e+10    1.1297822691e+11    1.2833592267e+11    1.4321291708e+11    1.5900786503e+11    1.8900883164e+11    5.3648694827e+11    6.8260057737e+11    7.0388585607e+11    7.3163508993e+11    8.1924658327e+11    8.0529321820e+11    7.4218724624e+11    7.4506450134e+11    7.4767737852e+11    7.4399323872 [...]
+4.5813226513e+08    3.2928325722e+09    8.6448599817e+09    1.6375945022e+10    2.6287268407e+10    3.8121225178e+10    5.1564020659e+10    6.6249599350e+10    8.1766176908e+10    9.7668765593e+10    1.1350719348e+11    1.2890157303e+11    1.4379091613e+11    1.5956345239e+11    1.8948705519e+11    5.3635827583e+11    6.8142268035e+11    7.0204946709e+11    7.2924042346e+11    8.1605948318e+11    8.0168307608e+11    7.3775122123e+11    7.3995218103e+11    7.4201344603e+11    7.3784506200 [...]
+4.5979830966e+08    3.3047699841e+09    8.6760086174e+09    1.6434396769e+10    2.6379868855e+10    3.8253164437e+10    5.1738407182e+10    6.6467007006e+10    8.2024147690e+10    9.7961204324e+10    1.1382370563e+11    1.2922628865e+11    1.4410038264e+11    1.5982061100e+11    1.8960967593e+11    5.3531213235e+11    6.7912762106e+11    6.9909048200e+11    7.2569897057e+11    8.1160769097e+11    7.9685034436e+11    7.3223343749e+11    7.3378041571e+11    7.3530960645e+11    7.3068390823 [...]
+4.6060414558e+08    3.3105258097e+09    8.6909343675e+09    1.6462134601e+10    2.6423203427e+10    3.8313728808e+10    5.1816366470e+10    6.6560707178e+10    8.2129706297e+10    9.8071994920e+10    1.1392962257e+11    1.2931248596e+11    1.4414448114e+11    1.5978385609e+11    1.8938247697e+11    5.3336072054e+11    6.7573140425e+11    6.9502691261e+11    7.2102982878e+11    8.0591535121e+11    7.9081851801e+11    7.2565708492e+11    7.2657447129e+11    7.2759294886e+11    7.2253513722 [...]
+4.6055861872e+08    3.3101640242e+09    8.6898072481e+09    1.6459486667e+10    2.6417812844e+10    3.8303730324e+10    5.1799048176e+10    6.6532266692e+10    8.2084939658e+10    9.8003861810e+10    1.1382855270e+11    1.2916505269e+11    1.4393018226e+11    1.5946415923e+11    1.8882799699e+11    5.3053228881e+11    6.7126134658e+11    6.8988096662e+11    7.1525788616e+11    7.9901175145e+11    7.8361569165e+11    7.1805031272e+11    7.1836376797e+11    7.1889206697e+11    7.1343181365 [...]
+4.5967263964e+08    3.3037632359e+09    8.6728346106e+09    1.6426848625e+10    2.6364338779e+10    3.8224112460e+10    5.1687751941e+10    6.6383395679e+10    8.1892025769e+10    9.7759517628e+10    1.1352383299e+11    1.2878809410e+11    1.4346264211e+11    1.5886843852e+11    1.8795760534e+11    5.2684901531e+11    6.6574300779e+11    6.8367851627e+11    7.0841042808e+11    7.9092842396e+11    7.7527451992e+11    7.0944426448e+11    7.0918033675e+11    7.0923994101e+11    7.0340744417 [...]
+4.5796418611e+08    3.2914532027e+09    8.6403599223e+09    1.6364879345e+10    2.6263857596e+10    3.8076473035e+10    5.1484705756e+10    6.6117070668e+10    8.1554828835e+10    9.7343891639e+10    1.1302171115e+11    1.2818958869e+11    1.4275234948e+11    1.5801154752e+11    1.8679668140e+11    5.2234483481e+11    6.5920923557e+11    6.7644988233e+11    7.0051936267e+11    7.8170266660e+11    7.6583324755e+11    6.9987440037e+11    6.9906196562e+11    6.9867405957e+11    6.9250138574 [...]
+4.5544301808e+08    3.2733034766e+09    8.5925626872e+09    1.6273909761e+10    2.6116879785e+10    3.7861511314e+10    5.1190780785e+10    6.5734283114e+10    8.1074354817e+10    9.6757821324e+10    1.1232254481e+11    1.2736886693e+11    1.4179656896e+11    1.5688625100e+11    1.8532603182e+11    5.1702458783e+11    6.5168425525e+11    6.6822712585e+11    6.9161887649e+11    7.7137221798e+11    7.5532739045e+11    6.8937641189e+11    6.8804395263e+11    6.8723158756e+11    6.8074899363 [...]
+4.5213554418e+08    3.2495044764e+09    8.5299459488e+09    1.6154901908e+10    2.5924970190e+10    3.7581536644e+10    5.0809172147e+10    6.5239257117e+10    8.0456013491e+10    9.6008083909e+10    1.1143471726e+11    1.2633628178e+11    1.4060827013e+11    1.5550966392e+11    1.8357183542e+11    5.1092603902e+11    6.4320629029e+11    6.5904745235e+11    6.8174748798e+11    7.5998279186e+11    7.4380274785e+11    6.7799310562e+11    6.7617028864e+11    6.7495857105e+11    6.6819524204 [...]
+4.4805205777e+08    3.2201292501e+09    8.4526966480e+09    1.6008195749e+10    2.5688642471e+10    3.7237230960e+10    5.0340688761e+10    6.4632838259e+10    7.9700525571e+10    9.5095008277e+10    1.1035772642e+11    1.2508974391e+11    1.3918234636e+11    1.5387037731e+11    1.8150621972e+11    5.0405263072e+11    6.3380218099e+11    6.4894861231e+11    6.7094448144e+11    7.4757420507e+11    7.3130125479e+11    6.6576374763e+11    6.6348008969e+11    6.6189373600e+11    6.5487796612 [...]
+4.4322990280e+08    3.1854470077e+09    8.3615256735e+09    1.5835149885e+10    2.5410104325e+10    3.6831847790e+10    4.9789823581e+10    6.3920953586e+10    7.8815457141e+10    9.4028034108e+10    1.0910319019e+11    1.2364352680e+11    1.3753663806e+11    1.5199206803e+11    1.7916706437e+11    4.9645334189e+11    6.2352023177e+11    6.3797383793e+11    6.5925550235e+11    7.3420278607e+11    7.1787409514e+11    6.5273888826e+11    6.5002246910e+11    6.4809130664e+11    6.4084911738 [...]
+4.3768141026e+08    3.1455456275e+09    8.2566598901e+09    1.5636182957e+10    2.5090003093e+10    3.6366278640e+10    4.9157699894e+10    6.3104910033e+10    7.7802203949e+10    9.2808486951e+10    1.0767210966e+11    1.2199788226e+11    1.3566987110e+11    1.4987016289e+11    1.7654071028e+11    4.8814629660e+11    6.1239627009e+11    6.2616675401e+11    6.4672521323e+11    7.1991304778e+11    7.0357095729e+11    6.3895986043e+11    6.3584279010e+11    6.3358963506e+11    6.2615042018 [...]
+4.3145129043e+08    3.1007472847e+09    8.1389493289e+09    1.5412917371e+10    2.4730970350e+10    3.5844392254e+10    4.8449643204e+10    6.2191703968e+10    7.6669649624e+10    9.1447374178e+10    1.0607791233e+11    1.2016911376e+11    1.3360211184e+11    1.4753078733e+11    1.7366824639e+11    4.7918515072e+11    6.0048430280e+11    6.1357551190e+11    6.3340450053e+11    7.0476723117e+11    6.8844771952e+11    6.2448226318e+11    6.2099388696e+11    6.1844684052e+11    6.1083808762 [...]
+4.2455794787e+08    3.0511838861e+09    8.0087383949e+09    1.5166000190e+10    2.4334033350e+10    3.5267657541e+10    4.7667606497e+10    6.1183793604e+10    7.5420756388e+10    8.9948139166e+10    1.0432448246e+11    1.1816150003e+11    1.3133801043e+11    1.4497904820e+11    1.7055595583e+11    4.6960518017e+11    5.8783094707e+11    6.0024885197e+11    6.1934383300e+11    6.8881701510e+11    6.7256026793e+11    6.0935323075e+11    6.0552703404e+11    6.0270759812e+11    5.9496148703 [...]
+4.1704427358e+08    2.9971639737e+09    7.8668384436e+09    1.4896972087e+10    2.3901673200e+10    3.4639687014e+10    4.6816499708e+10    6.0087522477e+10    7.4063403859e+10    8.8320258621e+10    1.0242291214e+11    1.1598772385e+11    1.2889179358e+11    1.4223078535e+11    1.6722281221e+11    4.5944750181e+11    5.7448681059e+11    5.8623796997e+11    6.0459666543e+11    6.7212604011e+11    6.5596697099e+11    5.9363073485e+11    5.8949627144e+11    5.8643250189e+11    5.7857748262 [...]
+4.0895402738e+08    2.9390025968e+09    7.7140792881e+09    1.4607412790e+10    2.3436443178e+10    3.3964216944e+10    4.5901435584e+10    5.8909556994e+10    7.2605971938e+10    8.6573984370e+10    1.0038549153e+11    1.1366233290e+11    1.2628065236e+11    1.3930677158e+11    1.6369662072e+11    4.4875955432e+11    5.6050603474e+11    5.7159622386e+11    5.8921818741e+11    6.5476005677e+11    6.3872757107e+11    5.7737122811e+11    5.7295691803e+11    5.6968131715e+11    5.6173944709 [...]
+4.0032500601e+08    2.8769718544e+09    7.5511774924e+09    1.4298685966e+10    2.2940545907e+10    3.3244466642e+10    4.4926810053e+10    5.7655607319e+10    7.1055597054e+10    8.4717945379e+10    9.8222347874e+10    1.1119684264e+11    1.2351712219e+11    1.3621945023e+11    1.5998583415e+11    4.3757583918e+11    5.4593739393e+11    5.5637784285e+11    5.7326431778e+11    6.3679524304e+11    6.2090399644e+11    5.6064410807e+11    5.5596836806e+11    5.5254511091e+11    5.4451420338 [...]
+3.9126513309e+08    2.8118491426e+09    7.3801825432e+09    1.3974697999e+10    2.2420303452e+10    3.2489697571e+10    4.3905302269e+10    5.6342190735e+10    6.9432980289e+10    8.2777278574e+10    9.5963176250e+10    1.0862544039e+11    1.2063950040e+11    1.3301017558e+11    1.5613171804e+11    4.2594129624e+11    5.3083450770e+11    5.4063903756e+11    5.5679331192e+11    6.1831524814e+11    6.0255528827e+11    5.4351546261e+11    5.3858468517e+11    5.3509115154e+11    5.2695104804 [...]
+3.8203426134e+08    2.7455169406e+09    7.2061121440e+09    1.3645170866e+10    2.1891799603e+10    3.1724136990e+10    4.2871229558e+10    5.5015874164e+10    6.7799368230e+10    8.0830681031e+10    9.3707321543e+10    1.0607184252e+11    1.1780020631e+11    1.2986479485e+11    1.5235414977e+11    4.1396704540e+11    5.1526913560e+11    5.2444973500e+11    5.3987585662e+11    5.9961268557e+11    5.8376271339e+11    5.2622821511e+11    5.2091700709e+11    5.1782767777e+11    5.0923156552 [...]
+3.7547293230e+08    2.6985245670e+09    7.0835926388e+09    1.3415519733e+10    2.1528489482e+10    3.1207275713e+10    4.2189077650e+10    5.4166296949e+10    6.6791165953e+10    7.9684652203e+10    9.2456652875e+10    1.0476054188e+11    1.1647472743e+11    1.2853368036e+11    1.5064472265e+11    4.0229523833e+11    4.9945764615e+11    5.0798666847e+11    5.2269343061e+11    5.8269494014e+11    5.6470000473e+11    5.1030405316e+11    5.0340226986e+11    5.0407932077e+11    4.9226357309 [...]
+4.4819235146e+08    3.2247323855e+09    8.4830784914e+09    1.6117995568e+10    2.5978995174e+10    3.7871656648e+10    5.1559573455e+10    6.6767246893e+10    8.3184723543e+10    1.0047604050e+11    1.1829731141e+11    1.3634328519e+11    1.5449696961e+11    1.7349833850e+11    2.0105119537e+11    4.0596007730e+11    4.8735739147e+11    4.9423616704e+11    5.0820683114e+11    6.1337810795e+11    5.4805857749e+11    5.2907485906e+11    4.9460869303e+11    5.6531335039e+11    4.9424342191 [...]
+3.5075988900e+08    2.5207272715e+09    6.6159346962e+09    1.2527125585e+10    2.0096902670e+10    2.9120875930e+10    3.9349350649e+10    5.0489888987e+10    6.2211598908e+10    7.4153431339e+10    8.5943091372e+10    9.7248309041e+10    1.0794790483e+11    1.1891588593e+11    1.3930428345e+11    3.7573578958e+11    4.6617677524e+11    4.7359685067e+11    4.8688460944e+11    5.4030885081e+11    5.2519585897e+11    4.7201179883e+11    4.6624211418e+11    4.6308548523e+11    4.5445571680 [...]
+3.3899345433e+08    2.4361197938e+09    6.3936258910e+09    1.2105478623e+10    1.9418900104e+10    2.8135467124e+10    3.8012728843e+10    4.8766664733e+10    6.0075807684e+10    7.1589236755e+10    8.2944826308e+10    9.3818781671e+10    1.0409103428e+11    1.1460358126e+11    1.3420243551e+11    3.6230437486e+11    4.4918287798e+11    4.5605960399e+11    4.6865430997e+11    5.1941937562e+11    5.0514073532e+11    4.5312783286e+11    4.4759094818e+11    4.4352954089e+11    4.3570339710 [...]
+3.2753258681e+08    2.3537436883e+09    6.1773543959e+09    1.1695782019e+10    1.8761209919e+10    2.7181643541e+10    3.6722465210e+10    4.7108798680e+10    5.8029479762e+10    6.9144760670e+10    8.0103911591e+10    9.0593013125e+10    1.0049454172e+11    1.1061894698e+11    1.2949280892e+11    3.4883870106e+11    4.3203209396e+11    4.3837205492e+11    4.5028727670e+11    4.9886282125e+11    4.8497386305e+11    4.3455040868e+11    4.2898731371e+11    4.2485643514e+11    4.1718265171 [...]
+3.1583501101e+08    2.2696676568e+09    5.9566274889e+09    1.1277668314e+10    1.8090062463e+10    2.6208417440e+10    3.5406175184e+10    4.5417896828e+10    5.5943106969e+10    6.6653762686e+10    7.7211324487e+10    8.7313094019e+10    9.6846826404e+10    1.0659863376e+11    1.2480282946e+11    3.3530783572e+11    4.1477550809e+11    4.2056368919e+11    4.3181618727e+11    4.7817985987e+11    4.6473930371e+11    4.1591785157e+11    4.1039005617e+11    4.0612132240e+11    3.9870845957 [...]
+3.0397580278e+08    2.1844308125e+09    5.7328574143e+09    1.0853800893e+10    1.7409697697e+10    2.5221845855e+10    3.4071836491e+10    4.3703736650e+10    5.3827765178e+10    6.4127441292e+10    7.4275936680e+10    8.3980489921e+10    9.3130666651e+10    1.0247735499e+11    1.1991545791e+11    3.2155289582e+11    3.9737183668e+11    4.0268163624e+11    4.1328497361e+11    4.5748541978e+11    4.4446111708e+11    3.9733699493e+11    3.9182151608e+11    3.8754613226e+11    3.8030113577 [...]
+2.9199864352e+08    2.0983502295e+09    5.5068930756e+09    1.0425837897e+10    1.6722896547e+10    2.4226210637e+10    3.2725723059e+10    4.1975272512e+10    5.1696126130e+10    6.1583856994e+10    7.1324083437e+10    8.0635216647e+10    8.9411101169e+10    9.8373797930e+10    1.1510227532e+11    3.0782190453e+11    3.7996888561e+11    3.8479244037e+11    3.9476501030e+11    4.3683658010e+11    4.2424049979e+11    3.7884900752e+11    3.7337692558e+11    3.6911390368e+11    3.6206858657 [...]
+2.7992088433e+08    2.0115488370e+09    5.2790480540e+09    9.9943468305e+09    1.6030510859e+10    2.3222633369e+10    3.1369152372e+10    4.0233867046e+10    4.9549345852e+10    5.9023570042e+10    6.8355140291e+10    7.7274552765e+10    8.5681782842e+10    9.4274938653e+10    1.1033575571e+11    2.9413282490e+11    3.6261037745e+11    3.6694796955e+11    3.7630947810e+11    4.1627488426e+11    4.0413127977e+11    3.6049197098e+11    3.5509957812e+11    3.5084456487e+11    3.4404525853 [...]
+2.6772583917e+08    1.9238984960e+09    5.0489432065e+09    9.5584828046e+09    1.5330892668e+10    2.2208139035e+10    2.9997018492e+10    3.8471054166e+10    4.7373703704e+10    5.6424601263e+10    6.5333905027e+10    7.3841255539e+10    8.1845878980e+10    9.0002083275e+10    1.0521493331e+11    2.8022003224e+11    3.4521210857e+11    3.4918268447e+11    3.5794940134e+11    3.9582248361e+11    3.8413341926e+11    3.4229928942e+11    3.3697474179e+11    3.3279587504e+11    3.2618585254 [...]
+2.5559784736e+08    1.8367414112e+09    4.8201919718e+09    9.1253555918e+09    1.4636061640e+10    2.1201367706e+10    2.8636753410e+10    3.6725953178e+10    4.5224063388e+10    5.3863612768e+10    6.2368472608e+10    7.0491619275e+10    7.8140944033e+10    8.5953430776e+10    1.0056291476e+11    2.6670929620e+11    3.2808087408e+11    3.3158447867e+11    3.3978162962e+11    3.7563306133e+11    3.6441138742e+11    3.2437403734e+11    3.1917464902e+11    3.1504947894e+11    3.0871679332 [...]
+2.4350909805e+08    1.7498695280e+09    4.5922057440e+09    8.6937250994e+09    1.3943740810e+10    2.0198447484e+10    2.7282076104e+10    3.4988675380e+10    4.3085142839e+10    5.1317155984e+10    5.9422753400e+10    6.7169121523e+10    7.4474776644e+10    8.1964877383e+10    9.6025349591e+10    2.5337328026e+11    3.1114915437e+11    3.1418596691e+11    3.2183663694e+11    3.5570973252e+11    3.4496522012e+11    3.0673204948e+11    3.0168186892e+11    2.9761882938e+11    2.9158645176 [...]
+2.3136547029e+08    1.6625910985e+09    4.3630892820e+09    8.2597677253e+09    1.3247258556e+10    1.9188641958e+10    2.5916522702e+10    3.3234689153e+10    4.0920936002e+10    4.8732592649e+10    5.6419202520e+10    6.3756932177e+10    7.0663081192e+10    7.7717672886e+10    9.0926477830e+10    2.3975731742e+11    2.9424778724e+11    2.9700553937e+11    3.0412549151e+11    3.3602181845e+11    3.2576175549e+11    2.8937133055e+11    2.8444259558e+11    2.8051286305e+11    2.7469117236 [...]
+2.1948214269e+08    1.5772033996e+09    4.1390394734e+09    7.8357110802e+09    1.2567361344e+10    1.8204261463e+10    2.4587867919e+10    3.1532463984e+10    3.8827968590e+10    4.6245447809e+10    5.3549729958e+10    6.0533488633e+10    6.7130022048e+10    7.3923173288e+10    8.6736281293e+10    2.2694403055e+11    2.7788370242e+11    2.8015493458e+11    2.8677793341e+11    3.1681522547e+11    3.0704144542e+11    2.7244962954e+11    2.6772379414e+11    2.6387241376e+11    2.5840811944 [...]
+2.0774730550e+08    1.4928863262e+09    3.9178178070e+09    7.4170629419e+09    1.1896262826e+10    1.7232872063e+10    2.3277206700e+10    2.9854085632e+10    3.6765657340e+10    4.3796956749e+10    5.0728590764e+10    5.7370825174e+10    6.3675594737e+10    7.0238379245e+10    8.2733685894e+10    2.1444630679e+11    2.6187055192e+11    2.6364659433e+11    2.6979781305e+11    2.9804117236e+11    2.8876081600e+11    2.5595128322e+11    2.5145811384e+11    2.4768526011e+11    2.4261388916 [...]
+1.9595386754e+08    1.4081238433e+09    3.6953011179e+09    6.9955910923e+09    1.1219784387e+10    1.6251996736e+10    2.1950634430e+10    2.8149904943e+10    3.4662418397e+10    4.1284304559e+10    4.7806920407e+10    5.4048373066e+10    5.9957351195e+10    6.6079604780e+10    7.7700212225e+10    2.0141719434e+11    2.4586681927e+11    2.4746784944e+11    2.5316179771e+11    2.7958510813e+11    2.7080338639e+11    2.3982145348e+11    2.3549744577e+11    2.3190295344e+11    2.2707064281 [...]
+1.8466801384e+08    1.3270421418e+09    3.4826162669e+09    6.5932392957e+09    1.0575127536e+10    1.5319503731e+10    2.0693572173e+10    2.6542062007e+10    3.2689905982e+10    3.8947521752e+10    4.5122843478e+10    5.1053479474e+10    5.6711622677e+10    6.2669520855e+10    7.4128958041e+10    1.8964363393e+11    2.3066959284e+11    2.3176596343e+11    2.3704013528e+11    2.6180234566e+11    2.5351096369e+11    2.2427419462e+11    2.2021392484e+11    2.1671874998e+11    2.1229150508 [...]
+1.7375436080e+08    1.2486521502e+09    3.2770837728e+09    6.2046886420e+09    9.9532014499e+09    1.4421119267e+10    1.9484736592e+10    2.4999810205e+10    3.0804480123e+10    3.6725040138e+10    4.2589003360e+10    4.8259628958e+10    5.3746946331e+10    5.9690993121e+10    7.1378967049e+10    1.7870870421e+11    2.1612971278e+11    2.1655322030e+11    2.2144158192e+11    2.4466633716e+11    2.3686165263e+11    2.0930948694e+11    2.0557971210e+11    2.0213776473e+11    1.9823431429 [...]
+1.6285296023e+08    1.1703301553e+09    3.0716261432e+09    5.8159764911e+09    9.3303299640e+09    1.3520018149e+10    1.8269805316e+10    2.3445593929e+10    2.8897436733e+10    3.4465495855e+10    3.9993489984e+10    4.5363998488e+10    5.0611021349e+10    5.6404217057e+10    6.7971149633e+10    1.6762291081e+11    2.0185864569e+11    2.0180810659e+11    2.0633580500e+11    2.2806515543e+11    2.2075675746e+11    1.9488421807e+11    1.9149339836e+11    1.8813359286e+11    1.8477323106 [...]
+1.5307532723e+08    1.1001746344e+09    2.8880718493e+09    5.4701204836e+09    8.7793668677e+09    1.2729371987e+10    1.7215537759e+10    2.2117318025e+10    2.7302185349e+10    3.2633493163e+10    3.7988026332e+10    4.3301193489e+10    4.8707497474e+10    5.5123640089e+10    6.8586938911e+10    1.5967787240e+11    1.8928390331e+11    1.8775804403e+11    1.9198904243e+11    2.1258657005e+11    2.0574692555e+11    1.8133116198e+11    1.7854287311e+11    1.7499592605e+11    1.7269813109 [...]
+1.4414435498e+08    1.0361522197e+09    2.7208660285e+09    5.1559577710e+09    8.2809239109e+09    1.2018130611e+10    1.6274540733e+10    2.0944651043e+10    2.5915823756e+10    3.1078865902e+10    3.6351451520e+10    4.1737533232e+10    4.7508266802e+10    5.4930536005e+10    7.1264773912e+10    1.5345128311e+11    1.7778482752e+11    1.7433779591e+11    1.7831085316e+11    1.9795996244e+11    1.9156308981e+11    1.6848959384e+11    1.6638612867e+11    1.6256540355e+11    1.6146232241 [...]
+1.3528315457e+08    9.7262134533e+08    2.5549004905e+09    4.8440033435e+09    7.7857243492e+09    1.1311047122e+10    1.5338287203e+10    1.9776781630e+10    2.4533633203e+10    2.9527101929e+10    3.4716105738e+10    4.0174365182e+10    4.6313312551e+10    5.4762073031e+10    7.4064307916e+10    1.4777507873e+11    1.6696126869e+11    1.6152803959e+11    1.6528916298e+11    1.8416418446e+11    1.7823076172e+11    1.5641170420e+11    1.5515741565e+11    1.5094891994e+11    1.5143546190 [...]
+1.3225824761e+08    9.5164973374e+08    2.5038371208e+09    4.7590482870e+09    7.6762538974e+09    1.1205725876e+10    1.5293430914e+10    1.9888735809e+10    2.4958631278e+10    3.0515982395e+10    3.6681256632e+10    4.3835392888e+10    5.3069846419e+10    6.7904446154e+10    1.0425474091e+11    1.6199317591e+11    1.6522253036e+11    1.5054265157e+11    1.5439917769e+11    1.7472865417e+11    1.6911589935e+11    1.4712808031e+11    1.4866942085e+11    1.4199574428e+11    1.4809760391 [...]
+1.4084557804e+08    1.0152368933e+09    2.6804457455e+09    5.1220555964e+09    8.3238525872e+09    1.2273388648e+10    1.6971643952e+10    2.2450118875e+10    2.8802526742e+10    3.6247745758e+10    4.5266851035e+10    5.6940118213e+10    7.3929073149e+10    1.0416115565e+11    1.8090920250e+11    2.0885410148e+11    1.7775653583e+11    1.4208329423e+11    1.4642411089e+11    1.7134505219e+11    1.6566309505e+11    1.4140821943e+11    1.4815227243e+11    1.3620627383e+11    1.5259461982 [...]
+1.5281885709e+08    1.1032204119e+09    2.9214065527e+09    5.6078244864e+09    9.1703725561e+09    1.3632964957e+10    1.9050469034e+10    2.5535210549e+10    3.3306212284e+10    4.2787040597e+10    5.4818619252e+10    7.1181613009e+10    9.6114123095e+10    1.4197599776e+11    2.5948684792e+11    2.5669297579e+11    1.9084063244e+11    1.3423060297e+11    1.3904191486e+11    1.6847101611e+11    1.6271573916e+11    1.3626048640e+11    1.4820404769e+11    1.3114056248e+11    1.5820977808 [...]
+3.3608307184e+08    2.4440255015e+09    6.5640056938e+09    1.2869645677e+10    2.1655388341e+10    3.3387477201e+10    4.8793088524e+10    6.9018757170e+10    9.5924800523e+10    1.3266990408e+11    1.8498019415e+11    2.6425605738e+11    3.9656721613e+11    6.5604305566e+11    1.3395199040e+12    1.0325320896e+12    5.2829989533e+11    1.7413459725e+11    1.9130093254e+11    3.1251617584e+11    3.0357751045e+11    2.2012573526e+11    3.1999753581e+11    2.1146298161e+11    4.2367238091 [...]
+1.5545942191e+08    1.1244929876e+09    2.9891484773e+09    5.7711812513e+09    9.5125671177e+09    1.4287826929e+10    2.0225546914e+10    2.7546595719e+10    3.6635129938e+10    4.8179630863e+10    6.3479357253e+10    8.5195535538e+10    1.1952977394e+11    1.8432986081e+11    3.5186310269e+11    3.1019429902e+11    2.0099982125e+11    1.1811912440e+11    1.2352750874e+11    1.5834277093e+11    1.5274277890e+11    1.2418801361e+11    1.4273724186e+11    1.1917491619e+11    1.5849870870 [...]
+9.3260330317e+07    6.7182192653e+08    1.7716274342e+09    3.3792014281e+09    5.4776387544e+09    8.0497570837e+09    1.1083566404e+10    1.4581937726e+10    1.8580529174e+10    2.3183408025e+10    2.8640662702e+10    3.5539535361e+10    4.5362473962e+10    6.2587925979e+10    1.0628256847e+11    1.3217468549e+11    1.1858181974e+11    9.8660156212e+10    1.0181478521e+11    1.1854757211e+11    1.1506282808e+11    9.9122166289e+10    1.0365477177e+11    9.6499272098e+10    1.0757103369 [...]
+7.8188125998e+07    5.6260127466e+08    1.4802695582e+09    2.8136673687e+09    4.5386706786e+09    6.6261039771e+09    9.0444045152e+09    1.1764307056e+10    1.4767508500e+10    1.8063896633e+10    2.1729211561e+10    2.5998303660e+10    3.1539541912e+10    4.0501079617e+10    6.2554770990e+10    9.5667451784e+10    9.7107855122e+10    8.8312339256e+10    9.0911428849e+10    1.0346681400e+11    1.0052411695e+11    8.7943832475e+10    8.9569480551e+10    8.5980665423e+10    9.0561261018 [...]
+6.8981475006e+07    4.9612568635e+08    1.3041738799e+09    2.4754351136e+09    3.9850406570e+09    5.8018822227e+09    7.8902155833e+09    1.0212464604e+10    1.2734394396e+10    1.5435405762e+10    1.8331121295e+10    2.1529647053e+10    2.5398482060e+10    3.1209279298e+10    4.5029908909e+10    7.8207192875e+10    8.4385489521e+10    7.9823153436e+10    8.2152308370e+10    9.2630207982e+10    9.0078077495e+10    7.9495871065e+10    8.0018873463e+10    7.8050174918e+10    7.9877324728 [...]
+6.0271955353e+07    4.3327518050e+08    1.1378686751e+09    2.1565730171e+09    3.4644451352e+09    5.0295666742e+09    6.8138646460e+09    8.7745285139e+09    1.0866608883e+10    1.3048206601e+10    1.5291941235e+10    1.7613937200e+10    2.0161435807e+10    2.3561312892e+10    3.1224653157e+10    6.4176346916e+10    7.3788401283e+10    7.2278585477e+10    7.4450394794e+10    8.3483948714e+10    8.1366605643e+10    7.2408988403e+10    7.2519138096e+10    7.1560337955e+10    7.2266282582 [...]
+5.4112455122e+07    3.8896411581e+08    1.0213302122e+09    1.9352026567e+09    3.1076817850e+09    4.5093562796e+09    6.1049379542e+09    7.8543533080e+09    9.7147428972e+09    1.1644453031e+10    1.3611901920e+10    1.5618093409e+10    1.7765153914e+10    2.0531851872e+10    2.6651457755e+10    5.7024013352e+10    6.6596298208e+10    6.5827187388e+10    6.7941632808e+10    7.6238270598e+10    7.4468322707e+10    6.6649308047e+10    6.6845353482e+10    6.6314548510e+10    6.6872260760 [...]
+4.8341291255e+07    3.4743067373e+08    9.1201367983e+08    1.7273054435e+09    2.7720720453e+09    4.0188805051e+09    5.4345091528e+09    6.9806470360e+09    8.6151626311e+09    1.0294650115e+10    1.1980136681e+10    1.3651789390e+10    1.5354536684e+10    1.7386573199e+10    2.1682264796e+10    4.9997311985e+10    5.9912093942e+10    6.0061816836e+10    6.2135859851e+10    6.9729829121e+10    6.8291789827e+10    6.1569635144e+10    6.1804396720e+10    6.1745892829e+10    6.2058130327 [...]
+4.3296026880e+07    3.1114328293e+08    8.1661873766e+08    1.5462198155e+09    2.4805103806e+09    3.5942964693e+09    4.8569101378e+09    6.2326850208e+09    7.6818177578e+09    9.1620983041e+09    1.0632832956e+10    1.2065113759e+10    1.3474308526e+10    1.5058065315e+10    1.8279554914e+10    4.4522313509e+10    5.4368886306e+10    5.5071102577e+10    5.7144691979e+10    6.4242587913e+10    6.3115583725e+10    5.7339465698e+10    5.7733234414e+10    5.8017634977e+10    5.8346906304 [...]
+3.9100211747e+07    2.8099784251e+08    7.3753792655e+08    1.3965953206e+09    2.2407223837e+09    3.2473124387e+09    4.3888646464e+09    5.6334289532e+09    6.9454132320e+09    8.2872044616e+09    9.6228394621e+09    1.0927594140e+10    1.2218238094e+10    1.3681133169e+10    1.6670919631e+10    4.0719372229e+10    4.9996991807e+10    5.0850759643e+10    5.2959901391e+10    5.9756550890e+10    5.8910195087e+10    5.3930556245e+10    5.4574104162e+10    5.5089054470e+10    5.5618862389 [...]
+3.5428639202e+07    2.5462685344e+08    6.6840011576e+08    1.2659064542e+09    2.0315643270e+09    2.9452213442e+09    3.9824303459e+09    5.1149167345e+09    6.3114291035e+09    7.5394450258e+09    8.7690118769e+09    9.9826913524e+09    1.1206629445e+10    1.2640262697e+10    1.5635764309e+10    3.7751161083e+10    4.6442354885e+10    4.7344970357e+10    4.9517432695e+10    5.6136914979e+10    5.5553959381e+10    5.1269416891e+10    5.2208365737e+10    5.2900336922e+10    5.3738331134 [...]
+3.2107292761e+07    2.3075394146e+08    6.0572095678e+08    1.1471574397e+09    1.8408961873e+09    2.6685933882e+09    3.6079554354e+09    4.6331204779e+09    5.7153504580e+09    6.8244203932e+09    7.9317579139e+09    9.0186266415e+09    1.0101892662e+10    1.1342885776e+10    1.3894764486e+10    3.4655905945e+10    4.3257540488e+10    4.4476932628e+10    4.6720539262e+10    5.3153318916e+10    5.2813937416e+10    4.9202237240e+10    5.0341820518e+10    5.1292645054e+10    5.2235909071 [...]
+2.9315829095e+07    2.1069499633e+08    5.5308305007e+08    1.0475131271e+09    1.6810877427e+09    2.4371020675e+09    3.2952430744e+09    4.2319229853e+09    5.2208825942e+09    6.2344013692e+09    7.2460368104e+09    8.2377858987e+09    9.2227284305e+09    1.0341328872e+10    1.2624494304e+10    3.2291877807e+10    4.0821031923e+10    4.2290793334e+10    4.4627969335e+10    5.0973871436e+10    5.0857380402e+10    4.7828127990e+10    4.9186067242e+10    5.0363876633e+10    5.1456090835 [...]
+2.7101576542e+07    1.9479621236e+08    5.1142651696e+08    9.6884646021e+08    1.5553558878e+09    2.2558302963e+09    3.0519319710e+09    3.9224653042e+09    4.8440205848e+09    5.7922616787e+09    6.7448231843e+09    7.6888223289e+09    8.6443836728e+09    9.7634363089e+09    1.2091292327e+10    3.0840714040e+10    3.9202373432e+10    4.0782936974e+10    4.3237854989e+10    4.9615456645e+10    4.9699601764e+10    4.7149424659e+10    4.8761851390e+10    5.0113661453e+10    5.1437901914 [...]
+2.5259052998e+07    1.8155710964e+08    4.7668965150e+08    9.0310203706e+08    1.4499426245e+09    2.1031796345e+09    2.8457898766e+09    3.6580741521e+09    4.5182259904e+09    5.4034672187e+09    6.2926055790e+09    7.1726871554e+09    8.0599292967e+09    9.0883403005e+09    1.1208110875e+10    2.9506654195e+10    3.8037689334e+10    3.9885373887e+10    4.2468550327e+10    4.8900906736e+10    4.9166789262e+10    4.7051224994e+10    4.8864871360e+10    5.0429178499e+10    5.1878922379 [...]
+2.3877175304e+07    1.7162913593e+08    4.5064692668e+08    8.5383083896e+08    1.3709825811e+09    1.9889124250e+09    2.6916106907e+09    3.4605318458e+09    4.2751035794e+09    5.1137405347e+09    5.9561293003e+09    6.7891915403e+09    7.6259499455e+09    8.5861077425e+09    1.0546682936e+10    2.8694993008e+10    3.7495406291e+10    3.9605840611e+10    4.2333655000e+10    4.8891986540e+10    4.9319409827e+10    4.7563258651e+10    4.9573883502e+10    5.1337791174e+10    5.2912543112 [...]
+2.2919369234e+07    1.6474590254e+08    4.3258072347e+08    8.1961949349e+08    1.3160830285e+09    1.9093112055e+09    2.5839106441e+09    3.3219952953e+09    4.1036125922e+09    4.9075889373e+09    5.7134425818e+09    6.5064205149e+09    7.2936379099e+09    8.1743750457e+09    9.9353738886e+09    2.8267708125e+10    3.7499965176e+10    3.9914847926e+10    4.2800354761e+10    4.9537336097e+10    5.0106473240e+10    4.8645397586e+10    5.0832919532e+10    5.2798786363e+10    5.4464925080 [...]
+2.2486862217e+07    1.6164813058e+08    4.2450393063e+08    8.0448223137e+08    1.2921478476e+09    1.8753024652e+09    2.5391420179e+09    3.2665128371e+09    4.0383641689e+09    4.8346422407e+09    5.6363028894e+09    6.4305832465e+09    7.2278061446e+09    8.1341445951e+09    9.9617192789e+09    2.8633489950e+10    3.8216415086e+10    4.0816270651e+10    4.3877727260e+10    5.0891109372e+10    5.1579559380e+10    5.0320182367e+10    5.2708265899e+10    5.4831004769e+10    5.6647259267 [...]
+2.2432171394e+07    1.6126068078e+08    4.2351555051e+08    8.0269262688e+08    1.2894566044e+09    1.8717403416e+09    2.5348996262e+09    3.2619625038e+09    4.0340660448e+09    4.8313151540e+09    5.6347143297e+09    6.4312379436e+09    7.2300638363e+09    8.1334035404e+09    9.9423662068e+09    2.9289541574e+10    3.9408755579e+10    4.2255130591e+10    4.5502440404e+10    5.2832309416e+10    5.3621166184e+10    5.2506403434e+10    5.5068825873e+10    5.7355842997e+10    5.9277582289 [...]
+2.2782097201e+07    1.6378102061e+08    4.3015911465e+08    8.1535432131e+08    1.3099501215e+09    1.9017756307e+09    2.5760600162e+09    3.3156785714e+09    4.1015795971e+09    4.9136207710e+09    5.7324470040e+09    6.5444314490e+09    7.3575758251e+09    8.2714571586e+09    1.0087923006e+10    3.0372090126e+10    4.1120194926e+10    4.4215215277e+10    4.7659357551e+10    5.5359785285e+10    5.6229509273e+10    5.5193050079e+10    5.7919019070e+10    6.0360497316e+10    6.2375859072 [...]
+2.3530296028e+07    1.6916468680e+08    4.4432375437e+08    8.4227460436e+08    1.3533586125e+09    1.9650957000e+09    2.6623440097e+09    3.4275522785e+09    4.2411947379e+09    5.0826177810e+09    5.9319405146e+09    6.7750584522e+09    7.6197871175e+09    8.5672274712e+09    1.0442774721e+10    3.1897538057e+10    4.3340716613e+10    4.6671594792e+10    5.0322929113e+10    5.8448571393e+10    5.9379655872e+10    5.8354814963e+10    6.1237084902e+10    6.3818869058e+10    6.5924279142 [...]
+2.4671316666e+07    1.7737378347e+08    4.6591666129e+08    8.8329726187e+08    1.4194759770e+09    2.0614901036e+09    2.7936279360e+09    3.5977033200e+09    4.4535274178e+09    5.3398244051e+09    6.2362800652e+09    7.1289236223e+09    8.0274499243e+09    9.0416267790e+09    1.1054682814e+10    3.3883249919e+10    4.6059439136e+10    4.9598178732e+10    5.3466231570e+10    6.2072051160e+10    6.3045104938e+10    6.1964858244e+10    6.4999147977e+10    6.7703201092e+10    6.9901339700 [...]
+2.6158200411e+07    1.8806771995e+08    4.9402769420e+08    9.3665123191e+08    1.5053519497e+09    2.1864674818e+09    2.9634479236e+09    3.8171520908e+09    4.7263549036e+09    5.6687294396e+09    6.6230396554e+09    7.5748941511e+09    8.5352535853e+09    9.6220545507e+09    1.1779956129e+10    3.6210367348e+10    4.9205869404e+10    5.2959500742e+10    5.7051288592e+10    6.6177991890e+10    6.7174875145e+10    6.5981436314e+10    6.9153955255e+10    7.1972114075e+10    7.4246655399 [...]
+2.7959958648e+07    2.0102258458e+08    5.2806289393e+08    1.0011933696e+09    1.6091104478e+09    2.3372258915e+09    3.1678658277e+09    4.0805823658e+09    5.0526837657e+09    6.0602577070e+09    7.0804545605e+09    8.0974869665e+09    9.1219804624e+09    1.0276675788e+10    1.2559561978e+10    3.8820045058e+10    5.2735245021e+10    5.6723039580e+10    6.1043860440e+10    7.0724772452e+10    7.1728265782e+10    7.0368880930e+10    7.3662717390e+10    7.6590056976e+10    7.8918911169 [...]
+3.0077268434e+07    2.1624547591e+08    5.6805246858e+08    1.0770149640e+09    1.7309757160e+09    2.5142443472e+09    3.4078101869e+09    4.3896733030e+09    5.4354061394e+09    6.5192344583e+09    7.6164480889e+09    8.7097413615e+09    9.8097013946e+09    1.1045813125e+10    1.3482005574e+10    4.1756911221e+10    5.6646862817e+10    6.0861822208e+10    6.5416652484e+10    7.5688311969e+10    7.6681196087e+10    7.5101258590e+10    7.8505408782e+10    8.1530160700e+10    8.3903531789 [...]
+3.2488228055e+07    2.3357890499e+08    6.1358259144e+08    1.1633310437e+09    1.8696852897e+09    2.7156875232e+09    3.6807900178e+09    4.7412100443e+09    5.8705303142e+09    7.0408525871e+09    8.2253694663e+09    9.4051316169e+09    1.0590942934e+10    1.1920783645e+10    1.4536058795e+10    4.4994982968e+10    6.0909259417e+10    6.5343963489e+10    7.0136622312e+10    8.1031585412e+10    8.1997320049e+10    8.0145240221e+10    8.3648691670e+10    8.6759020024e+10    8.9167640180 [...]
+3.5167976128e+07    2.5284379729e+08    6.6418113790e+08    1.2592413823e+09    2.0237806040e+09    2.9394132640e+09    3.9838583214e+09    5.1313197888e+09    6.3531290373e+09    7.6189771625e+09    8.8996617810e+09    1.0174319937e+10    1.1453861798e+10    1.2885392326e+10    1.5694479303e+10    4.8496068707e+10    6.5485015632e+10    7.0136316641e+10    7.5169148353e+10    8.6714483321e+10    8.7637308241e+10    8.5465476987e+10    8.9055639988e+10    9.2241303416e+10    9.4672655095 [...]
+3.8087777235e+07    2.7383299525e+08    7.1930102924e+08    1.3637002030e+09    2.1915614621e+09    3.1829135902e+09    4.3135458620e+09    5.5554128725e+09    6.8773159995e+09    8.2462092268e+09    9.6301104663e+09    1.1005778982e+10    1.2383633403e+10    1.3919111408e+10    1.6922626027e+10    5.2217429077e+10    7.0335043265e+10    7.5205189402e+10    8.0479163400e+10    9.2696568834e+10    9.3561671482e+10    9.1026756613e+10    9.4690035230e+10    9.7942092625e+10    1.0038236933 [...]
+4.1232265017e+07    2.9643676606e+08    7.7865787028e+08    1.4761796269e+09    2.3722051787e+09    3.4450442234e+09    4.6683933475e+09    6.0117669902e+09    7.4412213876e+09    8.9207405425e+09    1.0415327453e+10    1.1899166531e+10    1.3382162794e+10    1.5028815127e+10    1.8240740453e+10    5.6153984125e+10    7.5435835624e+10    8.0518851756e+10    8.6034042654e+10    9.8943127671e+10    9.9736290517e+10    9.6796824752e+10    1.0052117030e+11    1.0382897635e+11    1.0626732862 [...]
+4.4581006577e+07    3.2050851748e+08    8.4186820163e+08    1.5959573826e+09    2.5645617282e+09    3.7241560418e+09    5.0462040695e+09    6.4976186536e+09    8.0415337458e+09    9.6387817283e+09    1.1251189694e+10    1.2850291583e+10    1.4445688966e+10    1.6212259802e+10    1.9651143505e+10    6.0288362292e+10    8.0758785331e+10    8.6044793157e+10    9.1800271773e+10    1.0541766442e+11    1.0612537674e+11    1.0274264417e+11    1.0651695651e+11    1.0986903082e+11    1.1229678286 [...]
+4.8109340814e+07    3.4587080530e+08    9.0846516986e+08    1.7221461558e+09    2.7671999778e+09    4.0181600941e+09    5.4441275013e+09    7.0092617830e+09    8.6736042998e+09    1.0394653170e+10    1.2130879044e+10    1.3851026208e+10    1.5564412659e+10    1.7457001670e+10    2.1134946971e+10    6.4587883063e+10    8.6268487192e+10    9.1749498619e+10    9.7743123632e+10    1.1208075522e+11    1.1269039658e+11    1.0882953750e+11    1.1264203641e+11    1.1602786318e+11    1.1843494798 [...]
+5.1792113723e+07    3.7234266086e+08    9.7797276775e+08    1.8538416043e+09    2.9786622392e+09    4.3249306261e+09    5.8592668043e+09    7.5429374130e+09    9.3327317518e+09    1.1182636447e+10    1.3047577571e+10    1.4893326897e+10    1.6728812106e+10    1.8751334795e+10    2.2675408340e+10    6.9021880799e+10    9.1930742044e+10    9.7599801148e+10    1.0382833039e+11    1.1889393705e+11    1.1939381153e+11    1.1502367858e+11    1.1886257901e+11    1.2227206278e+11    1.2464865178 [...]
+5.5606776316e+07    3.9976208155e+08    1.0499660350e+09    1.9902397639e+09    3.1976603057e+09    4.6426041038e+09    6.2891095621e+09    8.0954320026e+09    1.0014973109e+10    1.1998059445e+10    1.3995916905e+10    1.5971203596e+10    1.7932389402e+10    2.0088412430e+10    2.4265257144e+10    7.3566163786e+10    9.7714076709e+10    1.0356311067e+11    1.1002225317e+11    1.2581995104e+11    1.2619928791e+11    1.2129200669e+11    1.2514588329e+11    1.2856899623e+11    1.3090575793 [...]
+5.9530530241e+07    4.2796521398e+08    1.1240148479e+09    2.1305259860e+09    3.4228867408e+09    4.9692849436e+09    6.7310923059e+09    8.6634521546e+09    1.0716263867e+10    1.2836065554e+10    1.4970248048e+10    1.7078225439e+10    1.9167933869e+10    2.1460140361e+10    2.5894635537e+10    7.8194821280e+10    1.0358657967e+11    1.0960707722e+11    1.1629155902e+11    1.3282158151e+11    1.3307042406e+11    1.2760174285e+11    1.3145912952e+11    1.3488623537e+11    1.3717385776 [...]
+6.3540757128e+07    4.5678953235e+08    1.1996927459e+09    2.2738930927e+09    3.6530473356e+09    5.3030992470e+09    7.1826855849e+09    9.2437569959e+09    1.1432617701e+10    1.3691916164e+10    1.5965098713e+10    1.8208237040e+10    2.0428678795e+10    2.2859191231e+10    2.7555214426e+10    8.2883363393e+10    1.0951720818e+11    1.1569994509e+11    1.2260350075e+11    1.3986260859e+11    1.3997192317e+11    1.3392091326e+11    1.3777079869e+11    1.4119240183e+11    1.4342208832 [...]
+6.7613386966e+07    4.8606188811e+08    1.2765443996e+09    2.4194763342e+09    3.8867488833e+09    5.6420165132e+09    7.6411243845e+09    9.8327618291e+09    1.2159556525e+10    1.4560170396e+10    1.6973993293e+10    1.9353610912e+10    2.1705604014e+10    2.4274481210e+10    2.9231135635e+10    8.7602379719e+10    1.1547327730e+11    1.2181016472e+11    1.2892559386e+11    1.4690648061e+11    1.4686819432e+11    1.4021778491e+11    1.4404890894e+11    1.4745631208e+11    1.4961893230 [...]
+7.1727603832e+07    5.1563285860e+08    1.3541785178e+09    2.5665374242e+09    4.1228129631e+09    5.9843411199e+09    8.1041394006e+09    1.0427593063e+10    1.2893604279e+10    1.5436794440e+10    1.7992439752e+10    2.0509592294e+10    2.2994048203e+10    2.5702181700e+10    3.0921297303e+10    9.2333371996e+10    1.2142724520e+11    1.2790762813e+11    1.3522693921e+11    1.5391956822e+11    1.5372662318e+11    1.4646265573e+11    1.5026489875e+11    1.5364890289e+11    1.5573738868 [...]
+7.5860571125e+07    5.4533820160e+08    1.4321633660e+09    2.7142569283e+09    4.3599205075e+09    6.3281528052e+09    8.5691195882e+09    1.1024872000e+10    1.3630549632e+10    1.6316687042e+10    1.9014388531e+10    2.1669092353e+10    2.4285684999e+10    2.7132151736e+10    3.2611279764e+10    9.7048541242e+10    1.2734798571e+11    1.3396227386e+11    1.4147661257e+11    1.6086722121e+11    1.6051330759e+11    1.5262541694e+11    1.5638839526e+11    1.5974075861e+11    1.6174726721 [...]
+7.9991767318e+07    5.7503052370e+08    1.5101125287e+09    2.8619044590e+09    4.5969026966e+09    6.6717637003e+09    9.0337947356e+09    1.1621703844e+10    1.4366856215e+10    1.7195684542e+10    2.0035099193e+10    2.2826894278e+10    2.5574993932e+10    2.8558861679e+10    3.4295989584e+10    1.0172733866e+11    1.3320808916e+11    1.3994550467e+11    1.4764525373e+11    1.6771714746e+11    1.6719704311e+11    1.5867790615e+11    1.6239208682e+11    1.6570444721e+11    1.6762236626 [...]
+8.4099747757e+07    6.0455564078e+08    1.5876209562e+09    3.0087119576e+09    4.8325248389e+09    7.0133797335e+09    9.4957315828e+09    1.2214950841e+10    1.5098631582e+10    1.8069103001e+10    2.1049069997e+10    2.3976646260e+10    2.6854692039e+10    2.9973812629e+10    3.5964275452e+10    1.0634543136e+11    1.3897914771e+11    1.4582920485e+11    1.5370402463e+11    1.7443732346e+11    1.7374651132e+11    1.6459237287e+11    1.6824811536e+11    1.7151299405e+11    1.7333537678 [...]
+8.8164886713e+07    6.3377257314e+08    1.6643189430e+09    3.1539803139e+09    5.0656674716e+09    7.3513829419e+09    9.9527514658e+09    1.2801830670e+10    1.5822469876e+10    1.8932920082e+10    2.2051701394e+10    2.5113251601e+10    2.8119320561e+10    3.1371400996e+10    3.7610597791e+10    1.1088317078e+11    1.4463551479e+11    1.5158685276e+11    1.5962576823e+11    1.8099786564e+11    1.8013300291e+11    1.7034302694e+11    1.7393170335e+11    1.7714141021e+11    1.7886287608 [...]
+9.2168013685e+07    6.6254358911e+08    1.7398451875e+09    3.2970259764e+09    5.2952352905e+09    7.6841888018e+09    1.0402718094e+10    1.3379610804e+10    1.6535018623e+10    1.9783164157e+10    2.3038432118e+10    2.6231623268e+10    2.9363373475e+10    3.2745864500e+10    3.9229027512e+10    1.1532118185e+11    1.5015234287e+11    1.5719277158e+11    1.6538423715e+11    1.8737001106e+11    1.8632843393e+11    1.7590494155e+11    1.7941824358e+11    1.8256561018e+11    1.8418119383 [...]
+9.6090013257e+07    6.9073127106e+08    1.8138387871e+09    3.4371648913e+09    5.5201293030e+09    8.0102016866e+09    1.0843469584e+10    1.3945506536e+10    1.7232828336e+10    2.0615693840e+10    2.4004410513e+10    2.7326179628e+10    3.0580479417e+10    3.4089797140e+10    4.0809845716e+10    1.1963809002e+11    1.5550469086e+11    1.6262250582e+11    1.7095439443e+11    1.9352595053e+11    1.9230603264e+11    1.8125440901e+11    1.8468451324e+11    1.8776277595e+11    1.8926796399 [...]
+9.9912887194e+07    7.1820626975e+08    1.8859602226e+09    3.5737541082e+09    5.7393178685e+09    8.3279263945e+09    1.1272984980e+10    1.4496924377e+10    1.7912702892e+10    2.1426697315e+10    2.4945216932e+10    2.8391914344e+10    3.1765072243e+10    3.5397067258e+10    4.2345869000e+10    1.2381505758e+11    1.6066956929e+11    1.6785286206e+11    1.7631256953e+11    1.9943965133e+11    1.9804053311e+11    1.8636914958e+11    1.8970859889e+11    1.9271153716e+11    1.9410215229 [...]
+1.0362013664e+08    7.4485007940e+08    1.9558987878e+09    3.7062062711e+09    5.9518608979e+09    8.6360050518e+09    1.1689437363e+10    1.5031533633e+10    1.8571793377e+10    2.2212816883e+10    2.5857021927e+10    2.9424603871e+10    3.2912664644e+10    3.6663128460e+10    4.3832790179e+10    1.2783597855e+11    1.6562591977e+11    1.7286205409e+11    1.8143653002e+11    2.0508688210e+11    2.0350847092e+11    1.9122842362e+11    1.9447024610e+11    1.9739210576e+11    1.9866446466 [...]
+1.0719452373e+08    7.7053870866e+08    2.0233284740e+09    3.8339023838e+09    6.1567614623e+09    8.9329853710e+09    1.2090850270e+10    1.5546773850e+10    1.9206902844e+10    2.2970172624e+10    2.6735212097e+10    3.0418821906e+10    3.4016847364e+10    3.7880110946e+10    4.5259292895e+10    1.3168077744e+11    1.7035209478e+11    1.7762969947e+11    1.8630554612e+11    2.1044441979e+11    2.0868770384e+11    1.9581294442e+11    1.9895084097e+11    2.0178609861e+11    2.0293743221 [...]
+1.1062221696e+08    7.9517290363e+08    2.0879895334e+09    3.9563528424e+09    6.3532391701e+09    9.2177465737e+09    1.2475727498e+10    1.6040756741e+10    1.9815758374e+10    2.3696143544e+10    2.7576897181e+10    3.1371554610e+10    3.5074748789e+10    3.9045836924e+10    4.6625335694e+10    1.3533787185e+11    1.7483076990e+11    1.8213690576e+11    1.9090040883e+11    2.1549168299e+11    2.1355824031e+11    2.0010508777e+11    2.0313328785e+11    2.0587689071e+11    2.0690491946 [...]
+1.1388785458e+08    8.1864216989e+08    2.1495914572e+09    4.0730060998e+09    6.5404058479e+09    9.4889951053e+09    1.2842309279e+10    1.6511203976e+10    2.0395518524e+10    2.4387286695e+10    2.8377993035e+10    3.2278019117e+10    3.6080762738e+10    4.0153515244e+10    4.7921414993e+10    1.3879024472e+11    1.7904347379e+11    1.8636616042e+11    1.9520335669e+11    2.2020901611e+11    2.1810128546e+11    2.0408861704e+11    2.0700184205e+11    2.0964922688e+11    2.1055217475 [...]
+1.1697961781e+08    8.4086171885e+08    2.2079124682e+09    4.1834444617e+09    6.7175964968e+09    9.7457774527e+09    1.3189325528e+10    1.6956517573e+10    2.0944267550e+10    2.5041407157e+10    2.9136105444e+10    3.3135764037e+10    3.7032644038e+10    4.1201662864e+10    4.9148323898e+10    1.4202861690e+11    1.8297580084e+11    1.9030155816e+11    1.9919829557e+11    2.2457931988e+11    2.2230021174e+11    2.0774905091e+11    2.1054248277e+11    2.1308962198e+11    2.1386611834 [...]
+1.1988466607e+08    8.6173919187e+08    2.2627097446e+09    4.2872069214e+09    6.8840687178e+09    9.9870122329e+09    1.3515304676e+10    1.7374791170e+10    2.1459625434e+10    2.5655615165e+10    2.9847793573e+10    3.3940733084e+10    3.7925579288e+10    4.2184307201e+10    5.0297293298e+10    1.4503801145e+11    1.8661205058e+11    1.9392867279e+11    2.0287066073e+11    2.2858631896e+11    2.2613963899e+11    2.1107332243e+11    2.1374272227e+11    2.1618597360e+11    2.1683524780 [...]
+1.2259150535e+08    8.8119199946e+08    2.3137665869e+09    4.3838833750e+09    7.0391651336e+09    1.0211748103e+10    1.3818963737e+10    1.7764383484e+10    2.1939579268e+10    2.6227529186e+10    3.0510330745e+10    3.4689905731e+10    3.8756348384e+10    4.3098205951e+10    5.1365406758e+10    1.4780882323e+11    1.8993994614e+11    1.9723474617e+11    2.0620762592e+11    2.3221648642e+11    2.2960660333e+11    2.1405030503e+11    2.1659202481e+11    2.1892823194e+11    2.1945007818 [...]
+1.2509059417e+08    8.9915153405e+08    2.3609027220e+09    4.4731318410e+09    7.1823355400e+09    1.0419184388e+10    1.4099213920e+10    1.8123884159e+10    2.2382366167e+10    2.6755000818e+10    3.1121137775e+10    3.5380189272e+10    3.9521156667e+10    4.3938333950e+10    5.2344331747e+10    1.5032755603e+11    1.9294616405e+11    2.0020847933e+11    2.0919783085e+11    2.3545655078e+11    2.3268888395e+11    2.1666996895e+11    2.1908094294e+11    2.2130719009e+11    2.2170199483 [...]
+1.2737531287e+08    9.1557061009e+08    2.4039963214e+09    4.5547276266e+09    7.3132332981e+09    1.0608846642e+10    1.4355465811e+10    1.8452628365e+10    2.2787324809e+10    2.7237512568e+10    3.1680084882e+10    3.6012280779e+10    4.0222396412e+10    4.4710836609e+10    5.3250669125e+10    1.5260068203e+11    1.9562737883e+11    2.0284050096e+11    2.1183202498e+11    2.3829912025e+11    2.3537853371e+11    2.1892514567e+11    2.2120273745e+11    2.2331692680e+11    2.2358538958 [...]
+1.2943564568e+08    9.3037695925e+08    2.4428561988e+09    4.6283042579e+09    7.4312602222e+09    1.0779847554e+10    1.4586482619e+10    1.8748962746e+10    2.3152304300e+10    2.7672307225e+10    3.2183643334e+10    3.6581593579e+10    4.0853845463e+10    4.5406424163e+10    5.4067091165e+10    1.5461060147e+11    1.9797087128e+11    2.0512260039e+11    2.1410204463e+11    2.4073392560e+11    2.3766652606e+11    2.2080894658e+11    2.2295108532e+11    2.2495141137e+11    2.2509476542 [...]
+1.3126434874e+08    9.4351837664e+08    2.4773445683e+09    4.6935985475e+09    7.5359887596e+09    1.0931556777e+10    1.4791392321e+10    1.9011732112e+10    2.3475817820e+10    2.8057502170e+10    3.2629436574e+10    3.7085083276e+10    4.1411431652e+10    4.6019083655e+10    5.4782404758e+10    1.5634474528e+11    1.9996693015e+11    2.0704823704e+11    2.1600144201e+11    2.4275293880e+11    2.3954592155e+11    2.2231621479e+11    2.2432142449e+11    2.2620634280e+11    2.2622632485 [...]
+1.3291987126e+08    9.5542243462e+08    2.5086227331e+09    4.7529247814e+09    7.6313958144e+09    1.1070262939e+10    1.4979656324e+10    1.9254757788e+10    2.3777751542e+10    2.8421617003e+10    3.3058730593e+10    3.7583920284e+10    4.1990306151e+10    4.6711608647e+10    5.5738640555e+10    1.5804178697e+11    2.0171163405e+11    2.0861647657e+11    2.1753046252e+11    2.4439004596e+11    2.4103493705e+11    2.2345421866e+11    2.2531994630e+11    2.2709159079e+11    2.2698873630 [...]
+1.3433271473e+08    9.6558121733e+08    2.5353135938e+09    4.8035452664e+09    7.7127905042e+09    1.1188571614e+10    1.5140183873e+10    1.9461882752e+10    2.4034907127e+10    2.8731418616e+10    3.3423429574e+10    3.8006680937e+10    4.2478955674e+10    4.7292073805e+10    5.6528996911e+10    1.5940651754e+11    2.0307773239e+11    2.0981920503e+11    2.1867990388e+11    2.4559226396e+11    2.4210131690e+11    2.2420749982e+11    2.2593361529e+11    2.2758975531e+11    2.2736706310 [...]
+1.3575034144e+08    9.7581049355e+08    2.5623776322e+09    4.8554306875e+09    7.7975020460e+09    1.1314273769e+10    1.5315495210e+10    1.9696442787e+10    2.4340452101e+10    2.9123872624e+10    3.3927210533e+10    3.8664454815e+10    4.3377246813e+10    4.8646170315e+10    5.9085944472e+10    1.6186529388e+11    2.0468478139e+11    2.1067983246e+11    2.1948124468e+11    2.4663173712e+11    2.4291148926e+11    2.2465695340e+11    2.2623496968e+11    2.2780541226e+11    2.2745662706 [...]
+1.3658867023e+08    9.8183082101e+08    2.5781562352e+09    4.8852405268e+09    7.8451716506e+09    1.1383040868e+10    1.5407851418e+10    1.9813962955e+10    2.4483596408e+10    2.9291737358e+10    3.4117174100e+10    3.8871584778e+10    4.3593072785e+10    4.8855409952e+10    5.9258083209e+10    1.6237311108e+11    2.0521707016e+11    2.1114539631e+11    2.1986598397e+11    2.4694222599e+11    2.4312163425e+11    2.2463849412e+11    2.2607931766e+11    2.2753088759e+11    2.2707052331 [...]
+1.3689142275e+08    9.8396386787e+08    2.5835325431e+09    4.8947623929e+09    7.8589332893e+09    1.1399949011e+10    1.5425102587e+10    1.9826266054e+10    2.4481922297e+10    2.9261130244e+10    3.4032529313e+10    3.8688457753e+10    4.3224137219e+10    4.8093833544e+10    5.7426527036e+10    1.6121232152e+11    2.0479826078e+11    2.1122215764e+11    2.1984228488e+11    2.4657938607e+11    2.4276678276e+11    2.2417079478e+11    2.2548395094e+11    2.2678968850e+11    2.2623061253 [...]
+1.3717286406e+08    9.8597610965e+08    2.5887602832e+09    4.9045028773e+09    7.8741983154e+09    1.1421351322e+10    1.5452715647e+10    1.9859437652e+10    2.4519004217e+10    2.9299044290e+10    3.4065983307e+10    3.8708315043e+10    4.3213361916e+10    4.8014541465e+10    5.7161749204e+10    1.6099788871e+11    2.0455809136e+11    2.1095807899e+11    2.1947206824e+11    2.4603163332e+11    2.4214562713e+11    2.2339994486e+11    2.2457927958e+11    2.2576684943e+11    2.2510488859 [...]
+1.3721929104e+08    9.8630038587e+08    2.5895627451e+09    4.9058788881e+09    7.8760780898e+09    1.1423425049e+10    1.5454333819e+10    1.9859468807e+10    2.4515615754e+10    2.9289333758e+10    3.4045289673e+10    3.8668753295e+10    4.3140118555e+10    4.7873850534e+10    5.6844133516e+10    1.6053682506e+11    2.0398066801e+11    2.1033637638e+11    2.1873253950e+11    2.4507660140e+11    2.4112452911e+11    2.2226453967e+11    2.2331174185e+11    2.2438283087e+11    2.2362212000 [...]
+1.3707518592e+08    9.8526123087e+08    2.5868169466e+09    4.9006254689e+09    7.8675262623e+09    1.1410788356e+10    1.5436815945e+10    1.9836236431e+10    2.4485749945e+10    2.9251742224e+10    3.3998538050e+10    3.8610701345e+10    4.3066983471e+10    4.7777014495e+10    5.6691292069e+10    1.5998444784e+11    2.0313352612e+11    2.0936498674e+11    2.1763269759e+11    2.4374428910e+11    2.3972387837e+11    2.2077783369e+11    2.2169398951e+11    2.2265229559e+11    2.2179621358 [...]
+1.3669093168e+08    9.8249641723e+08    2.5795428471e+09    4.8868005132e+09    7.8452298237e+09    1.1378248939e+10    1.5392430965e+10    1.9778579201e+10    2.4413555822e+10    2.9163856951e+10    3.3893787396e+10    3.8487567611e+10    4.2922698363e+10    4.7604250374e+10    5.6456135144e+10    1.5917279542e+11    2.0195261968e+11    2.0804812400e+11    2.1617670097e+11    2.4201812167e+11    2.3793809841e+11    2.1894205152e+11    2.1972975192e+11    2.2057760238e+11    2.1963091854 [...]
+1.3606799037e+08    9.7801616808e+08    2.5677658031e+09    4.8644476749e+09    7.8092488141e+09    1.1325873858e+10    1.5321232857e+10    1.9686502257e+10    2.4298930313e+10    2.9025369628e+10    3.3730362210e+10    3.8298022746e+10    4.2704715914e+10    4.7350452392e+10    5.6126621781e+10    1.5809759872e+11    2.0044139359e+11    2.0639376883e+11    2.1437305559e+11    2.3990645197e+11    2.3577630463e+11    2.1676658206e+11    2.1742887496e+11    2.1816874148e+11    2.1713653471 [...]
+1.3521497882e+08    9.7188278416e+08    2.5516512773e+09    4.8338859736e+09    7.7601080343e+09    1.1254449236e+10    1.5224330409e+10    1.9561508454e+10    2.4143859323e+10    2.8838869776e+10    3.3511635830e+10    3.8046526406e+10    4.2419168774e+10    4.7024832541e+10    5.5719781611e+10    1.5677542974e+11    1.9861257305e+11    2.0441141164e+11    2.1223187525e+11    2.3742186796e+11    2.3325055284e+11    2.1426272565e+11    2.1480294685e+11    2.1543764756e+11    2.1432512892 [...]
+1.3413388023e+08    9.6411016685e+08    2.5312339390e+09    4.7951757161e+09    7.6978920799e+09    1.1164073630e+10    1.5101813139e+10    1.9403637241e+10    2.3948264697e+10    2.8604052889e+10    3.3236899245e+10    3.7731656276e+10    4.2063325741e+10    4.6621961960e+10    5.5223057589e+10    1.5520360985e+11    1.9647204854e+11    2.0211140481e+11    2.0976410186e+11    2.3457577480e+11    2.3037283374e+11    2.1144233799e+11    2.1186423376e+11    2.1239683475e+11    2.1120943324 [...]
+1.3283126142e+08    9.5474550906e+08    2.5066376528e+09    4.7485514356e+09    7.6229771832e+09    1.1055292112e+10    1.4954417273e+10    1.9213832501e+10    2.3713307577e+10    2.8322298777e+10    3.2907742348e+10    3.7355190756e+10    4.1639113752e+10    4.6143844367e+10    5.4638439090e+10    1.5338979328e+11    1.9403046582e+11    1.9950530270e+11    2.0698193572e+11    2.3138181826e+11    2.2715683804e+11    2.0831851561e+11    2.0862615837e+11    2.0905992964e+11    2.0780326117 [...]
+1.3131478893e+08    9.4384393621e+08    2.4780072562e+09    4.6942878264e+09    7.5358050241e+09    1.0928746595e+10    1.4783013519e+10    1.8993216900e+10    2.3440379793e+10    2.7995279399e+10    3.2526122321e+10    3.6919373543e+10    4.1149067251e+10    4.5593342251e+10    5.3969405729e+10    1.5134328931e+11    1.9129982033e+11    1.9660569086e+11    2.0389862400e+11    2.2785495517e+11    2.2361746010e+11    2.0490539500e+11    2.0510312986e+11    2.0544159986e+11    2.0412138818 [...]
+1.2959218513e+08    9.3146094089e+08    2.4454883758e+09    4.6326605766e+09    7.4368177817e+09    1.0785077658e+10    1.4588467278e+10    1.8742900729e+10    2.3130849519e+10    2.7624626304e+10    3.2093932273e+10    3.6426352047e+10    4.0595582767e+10    4.4973128920e+10    5.3219218022e+10    1.4907409855e+11    1.8829313708e+11    1.9342610248e+11    2.0052839173e+11    2.2401136213e+11    2.1977074630e+11    2.0121806958e+11    2.0131050623e+11    2.0155745790e+11    2.0017953346 [...]
+1.2767179216e+08    9.1765644258e+08    2.4092381157e+09    4.5639666832e+09    7.3264908273e+09    1.0624971942e+10    1.4371702349e+10    1.8464062255e+10    2.2786156388e+10    2.7212034562e+10    3.1613100333e+10    3.5878242073e+10    3.9980880932e+10    4.4285370687e+10    5.2389669047e+10    1.4659156319e+11    1.8502367254e+11    1.8998091640e+11    1.9688631100e+11    2.1986787903e+11    2.1563347278e+11    1.9727235064e+11    1.9726435164e+11    1.9742377479e+11    1.9599404262 [...]
+1.2556341325e+08    9.0250093568e+08    2.3694417222e+09    4.4885575659e+09    7.2053894230e+09    1.0449251436e+10    1.4133834644e+10    1.8158142134e+10    2.2408089930e+10    2.6759660442e+10    3.1086163103e+10    3.5277975929e+10    3.9308325133e+10    4.3533984605e+10    5.1485854411e+10    1.4390773932e+11    1.8150629762e+11    1.8628533773e+11    1.9298829780e+11    2.1544250785e+11    2.1122340624e+11    1.9308484450e+11    1.9298149558e+11    1.9305756646e+11    1.9158196318 [...]
+1.2327695793e+08    8.8606565852e+08    2.3262862932e+09    4.4067878636e+09    7.0740833775e+09    1.0258743582e+10    1.3875985570e+10    1.7826585226e+10    2.1998440826e+10    2.6269656279e+10    3.0515646363e+10    3.4628467802e+10    3.8581257767e+10    4.2722885666e+10    5.0512994900e+10    1.4103540308e+11    1.7775672941e+11    1.8235529365e+11    1.8885100800e+11    2.1075413742e+11    2.0655917043e+11    1.8867285709e+11    1.8847944861e+11    1.8847650867e+11    1.8696102764 [...]
+1.2082279131e+08    8.6842508989e+08    2.2799672548e+09    4.3190274557e+09    6.9331657088e+09    1.0054306911e+10    1.3599313735e+10    1.7470875428e+10    2.1559032489e+10    2.5744186424e+10    2.9904041746e+10    3.3932504793e+10    3.7802706511e+10    4.1855257261e+10    4.9474404504e+10    1.3798625230e+11    1.7379061632e+11    1.7820732661e+11    1.8449170680e+11    2.0582208458e+11    2.0165987616e+11    1.8405420753e+11    1.8377619052e+11    1.8369875665e+11    1.8214936998 [...]
+1.1821161546e+08    8.4965610949e+08    2.2306862275e+09    4.2256576323e+09    6.7832470129e+09    9.8368239750e+09    1.3305007540e+10    1.7092530209e+10    2.1091721790e+10    2.5185441740e+10    2.9253848883e+10    3.3192842960e+10    3.6975589016e+10    4.0934000596e+10    4.8372640322e+10    1.3477176366e+11    1.6962386733e+11    1.7385852808e+11    1.7992820955e+11    2.0066611382e+11    1.9654512240e+11    1.7924714899e+11    1.7889013541e+11    1.7874281786e+11    1.7716549848 [...]
+1.1545516924e+08    8.2984313862e+08    2.1786650983e+09    4.1270994597e+09    6.6250049247e+09    9.6072809360e+09    1.2994407347e+10    1.6693283084e+10    2.0598667949e+10    2.4596035183e+10    2.8568163042e+10    3.2413102498e+10    3.6104145075e+10    3.9964256439e+10    4.7214966320e+10    1.3140716496e+11    1.6527432039e+11    1.6932653130e+11    1.7517888937e+11    1.9530713086e+11    1.9123538131e+11    1.7427053723e+11    1.7384024295e+11    1.7362781138e+11    1.7202847574 [...]
+1.1256514387e+08    8.0907018377e+08    2.1241242870e+09    4.0237701014e+09    6.4591082210e+09    9.3666458932e+09    1.2668819405e+10    1.6274806567e+10    2.0081925366e+10    2.3978403846e+10    2.7849787300e+10    3.1596414165e+10    3.5191766302e+10    3.8949569572e+10    4.6005005019e+10    1.2790524209e+11    1.6075903098e+11    1.6462933104e+11    1.7026246314e+11    1.8976599533e+11    1.8575122580e+11    1.6914342052e+11    1.6864565968e+11    1.6837299012e+11    1.6675746158 [...]
+1.0955367043e+08    7.8742442860e+08    2.0672926364e+09    3.9161029159e+09    6.2862522142e+09    9.1159264817e+09    1.2329605327e+10    1.5838847687e+10    1.9543645684e+10    2.3335109531e+10    2.7101683529e+10    3.0746112112e+10    3.4242111700e+10    3.7893860343e+10    4.4747006449e+10    1.2427942219e+11    1.5609553334e+11    1.5978525747e+11    1.6519797574e+11    1.8406405344e+11    1.8011361316e+11    1.6388516753e+11    1.6332579284e+11    1.6299795467e+11    1.6137185623 [...]
diff --git a/dev-tools/openmpi/pytests/round1_sim3_ompi.py b/dev-tools/openmpi/pytests/round1_sim3_ompi.py
new file mode 100644
index 0000000..9d5c7b1
--- /dev/null
+++ b/dev-tools/openmpi/pytests/round1_sim3_ompi.py
@@ -0,0 +1,230 @@
+from mpi4py import MPI # this line has to be first
+import numpy
+import matplotlib
+matplotlib.use('Agg')
+import pylab
+from math import degrees
+import math
+from time import time
+import ctypes
+from libBornAgainCore import *
+from libBornAgainFit import *
+
+comm = MPI.COMM_WORLD
+world_size = comm.Get_size()
+world_rank = comm.Get_rank()
+
+a_nphi = 175
+a_phimin = 1.5023432874e-02
+a_phimax = 4.6949376788e-02
+a_nalpha = 245
+a_alphamin = 1.0879025216e-04
+a_alphamax = 4.4882507209e-02
+
+
+class MesoSampleBuilder(IMultiLayerBuilder):
+    """
+    Meso crystal sample builder
+    """
+    def __init__(self):
+        IMultiLayerBuilder.__init__(self)
+        self.sample = None
+        # parameters describing the sample
+
+        #self.m_lattice_length_a = ctypes.c_double(1.246708e+01*nanometer)
+        #self.m_lattice_length_c = ctypes.c_double(1.338787e+01*nanometer)
+        #self.m_nanoparticle_radius = ctypes.c_double(4.848528e+00*nanometer)
+        self.m_lattice_length_a = ctypes.c_double(12.51*nanometer)
+        self.m_lattice_length_c = ctypes.c_double(30.75*nanometer)
+        self.m_nanoparticle_radius = ctypes.c_double(4.95*nanometer)
+        self.m_sigma_nanoparticle_radius = ctypes.c_double(3.6720e-01*nanometer)
+        #self.m_meso_height = ctypes.c_double(1.1221e+02*nanometer)
+        self.m_meso_height = ctypes.c_double(500.0*nanometer)
+        self.m_meso_radius = ctypes.c_double(9.4567e+02*nanometer)
+        self.m_sigma_meso_height = ctypes.c_double(5.0*nanometer)
+        self.m_sigma_meso_radius = ctypes.c_double(5.0*nanometer)
+        self.m_sigma_lattice_length_a = ctypes.c_double(1.1601e+00*nanometer)
+        self.m_surface_filling_ratio = ctypes.c_double(1.7286e-01)
+        self.m_roughness = ctypes.c_double(10.0*nanometer)
+        self.m_scale_param = math.sqrt(math.log((self.m_sigma_nanoparticle_radius.value/self.m_nanoparticle_radius.value)**2+1.0))
+
+        # register parameters
+        self.registerParameter("meso_radius", ctypes.addressof(self.m_meso_radius))
+        self.registerParameter("surface_filling_ratio", ctypes.addressof(self.m_surface_filling_ratio))
+        self.registerParameter("meso_height", ctypes.addressof(self.m_meso_height))
+        self.registerParameter("sigma_meso_height", ctypes.addressof(self.m_sigma_meso_height))
+        self.registerParameter("sigma_meso_radius", ctypes.addressof(self.m_sigma_meso_radius))
+        self.registerParameter("lattice_length_a", ctypes.addressof(self.m_lattice_length_a))
+        self.registerParameter("lattice_length_c", ctypes.addressof(self.m_lattice_length_c))
+        self.registerParameter("nanoparticle_radius", ctypes.addressof(self.m_nanoparticle_radius))
+        self.registerParameter("sigma_nanoparticle_radius", ctypes.addressof(self.m_sigma_nanoparticle_radius))
+        self.registerParameter("sigma_lattice_length_a", ctypes.addressof(self.m_sigma_lattice_length_a))
+        self.registerParameter("roughness", ctypes.addressof(self.m_roughness))
+
+    def CreateMeso(self, a, c, material, radius, sigma_radius, meso_form_factor):
+        lattice = self.CreateLattice(a, c)
+        bas_a = lattice.getBasisVectorA()
+        bas_b = lattice.getBasisVectorB()
+        bas_c = lattice.getBasisVectorC()
+        #particle = Particle(material, FormFactorSphereGaussianRadius(radius, sigma_radius))
+        particle = Particle(material, FormFactorSphereLogNormalRadius(radius, self.m_scale_param, 10))
+        position_0 = kvector_t(0.0, 0.0, 0.0)
+        position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c)
+        position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c)
+        pos_vector = [position_0, position_1, position_2]
+        basis = ParticleComposition()
+        basis.addParticles(particle, pos_vector)
+        npc = Crystal(basis, lattice)
+        dw_factor = self.m_sigma_lattice_length_a.value*self.m_sigma_lattice_length_a.value/6.0
+        npc.setDWFactor(dw_factor)
+        result = MesoCrystal(npc, meso_form_factor)
+        return result
+
+    def CreateLattice(self, a, c):
+        result = Lattice.createTrigonalLattice(a, c)
+        result.setSelectionRule(SimpleSelectionRule(-1, 1, 1, 3))
+        return result
+
+    # constructs the sample for current values of parameters
+    def buildSample(self):
+        # create materials
+        surface_density = self.m_surface_filling_ratio.value/numpy.pi/self.m_meso_radius.value/self.m_meso_radius.value
+        n_particle = complex(1.0-2.84e-5, 4.7e-7)
+        avg_n_squared_meso = 0.7886*n_particle**2 + 0.2114
+        n_avg = numpy.sqrt(self.m_surface_filling_ratio.value*avg_n_squared_meso + 1.0 - self.m_surface_filling_ratio.value)
+        n_particle_adapted = numpy.sqrt(n_avg**2 + n_particle**2 - 1.0)
+        particle_material = HomogeneousMaterial("nanoparticle", n_particle_adapted)
+
+        ff_cyl = FormFactorCylinder(self.m_meso_radius.value, self.m_meso_height.value)
+        ff_meso = FormFactorDecoratorDebyeWaller(ff_cyl, self.m_sigma_meso_height.value**2/2.0,
+                                             self.m_sigma_meso_radius.value**2/2.0)
+
+        # Create multilayer
+        multi_layer = MultiLayer()
+
+        air_material = HomogeneousMaterial("Air", 0.0, 0.0)
+        substrate_material = HomogeneousMaterial("Substrate", 7.57e-6, 1.73e-7)
+        average_layer_material = HomogeneousMaterial("AverageLayer", n_avg)
+        air_layer = Layer()
+        air_layer.setMaterial(air_material)
+        avg_layer = Layer()
+        avg_layer.setMaterial(average_layer_material)
+        avg_layer.setThickness(self.m_meso_height.value)
+        substrate_layer = Layer()
+        substrate_layer.setMaterial(substrate_material)
+        particle_decoration = ParticleLayout()
+
+        max_phi_rotation_steps = 180
+        max_tilt_rotation_steps = 1
+
+        phi_step = 2.0*numpy.pi/3.0/max_phi_rotation_steps
+        phi_start = 0.0
+        #zeta_step = 0.5*degree
+        #zeta_start = -zeta_step*(max_tilt_rotation_steps/2)
+        for i in range(0, max_phi_rotation_steps):
+            for j in range(0, max_tilt_rotation_steps):
+                #trafo_y = Transform3D.createRotateY(zeta_start + j*zeta_step)
+                trafo_z = Transform3D.createRotateZ(phi_start + i*phi_step)
+                #trafo = trafo_z*trafo_y
+                trafo = trafo_z
+                particle_decoration.addParticle(
+                    self.CreateMeso(self.m_lattice_length_a.value, self.m_lattice_length_c.value,
+                            particle_material, self.m_nanoparticle_radius.value,
+                            self.m_sigma_nanoparticle_radius.value, ff_meso), trafo,
+                            self.m_meso_height.value)
+
+        particle_decoration.setTotalParticleSurfaceDensity(surface_density)
+
+        avg_layer.addLayout(particle_decoration)
+
+        roughness = LayerRoughness(self.m_roughness.value, 0.3, 500.0 * nanometer)
+
+        multi_layer.addLayer(air_layer)
+        multi_layer.addLayer(avg_layer)
+        multi_layer.addLayerWithTopRoughness(substrate_layer, roughness)
+        self.sample = multi_layer
+        return self.sample
+
+
+def get_real_data():
+    return OutputDataIOFactory.readIntensityData("001_150_P109_cut_phitheta.txt.gz")
+
+
+def get_simulation():
+    # build and run experiment
+    simulation = GISASSimulation()
+    simulation.setBeamParameters(1.77*angstrom, 0.4*degree, 0.0*degree)
+    simulation.setDetectorParameters(a_nphi, a_phimin, a_phimax, a_nalpha, a_alphamin, a_alphamax)
+    simulation.setBeamIntensity(4.942287e+12)
+
+    sim_params = SimulationParameters()
+    sim_params.m_mc_integration = True
+    sim_params.m_mc_points = 100
+    simulation.setSimulationParameters(sim_params)
+
+    #simulation.setDetectorResolutionFunction(ResolutionFunction2DGaussian(0.00025, 0.00025))
+
+    #wavelength_distr = DistributionLogNormal(1.77*angstrom, 0.01)
+    #wavelength_distr = DistributionGaussian(1.77*angstrom, 0.02*angstrom)
+    #alpha_distr = DistributionGaussian(-0.4*degree, 0.02*degree)
+    #phi_distr = DistributionGaussian(0.0*degree, 0.02*degree)
+    #simulation.addParameterDistribution("*/Beam/wavelength", wavelength_distr, 5)
+    #simulation.addParameterDistribution("*/Beam/alpha", alpha_distr, 5)
+    #simulation.addParameterDistribution("*/Beam/phi", phi_distr, 5)
+
+    sample_builder = MesoSampleBuilder()
+    simulation.setSampleBuilder(sample_builder)
+    #real_data = get_real_data()
+    #simulation.setDetectorParameters(real_data)
+
+    return simulation
+
+
+def run_simulation():
+    """
+    main function to run fitting
+    """
+    simulation = get_simulation()
+
+
+    #if(world_size == 1):
+    #    print "Not an OpenMPI environment, run with 'mpirun -np 12 python ompi_sim_example.py'"
+    #    exit(0)
+
+    SetMessageLevel("DEBUG")
+
+    start_time = 0
+    start_time = time()
+
+
+    thread_info = ThreadInfo()
+    thread_info.n_threads = 4
+    simulation.setThreadInfo(thread_info)
+    simulation.runOMPISimulation()
+
+    #simulation.runSimulation()
+
+    if(world_rank == 0):
+        simulation.normalize()
+        result = simulation.getIntensityData()
+        print result.getArray()
+        axis_phi = result.getAxis(0)
+        axis_alpha = result.getAxis(1)
+        im = pylab.imshow(result.getArray()+1, norm=matplotlib.colors.LogNorm(vmin=100, vmax=1e7),
+                 extent=[axis_phi.getMin(), axis_phi.getMax(), axis_alpha.getMin(), axis_alpha.getMax()])
+        pylab.colorbar(im)
+        pylab.xlabel(r'$\phi_f$', fontsize=20)
+        pylab.ylabel(r'$\alpha_f$', fontsize=20)
+        pylab.show()
+        pylab.savefig("result_round1_sim4_ompi.png")
+        OutputDataIOFactory.writeIntensityData(result, 'result_round1_sim4_ompi.txt')
+
+
+    print "Time spent in node #", world_rank, "is", time() - start_time, "seconds"
+
+
+
+
+if __name__ == '__main__':
+    run_simulation()
+
diff --git a/dev-tools/openmpi/supermuc.sh b/dev-tools/openmpi/supermuc.sh
new file mode 100644
index 0000000..ce93ec8
--- /dev/null
+++ b/dev-tools/openmpi/supermuc.sh
@@ -0,0 +1,17 @@
+# Setup for BornAgain compilation at SuperMUC LRZ cluster
+
+
+module load git
+module load gcc/4.7
+module load cmake/2.8
+module load fftw/mpi/3.3
+module load gsl
+#module load python/2.7_anaconda
+
+export LD_LIBRARY_PATH=/home/hpc/pr87me/di29sok/software/boost_1_55_0.gcc47/lib:$LD_LIBRARY_PATH
+
+export FFTW3=$FFTW_BASE
+export GSL_DIR=$GSL_BASE
+export BOOST_ROOT=/home/hpc/pr87me/di29sok/software/boost_1_55_0.gcc47
+
+
diff --git a/dev-tools/plot-ff/plotff.py b/dev-tools/plot-ff/plotff.py
new file mode 100644
index 0000000..d839242
--- /dev/null
+++ b/dev-tools/plot-ff/plotff.py
@@ -0,0 +1,138 @@
+# script to plot the formfactor
+# after the ROOT window with plots appear,
+# just save the picture in that format which you need
+
+import ROOT
+from libBornAgainCore import *
+
+# define a formfactor, I recommend a 10--20 nm diameter
+#ff = FormFactorFullSphere(10.0*nanometer)
+#ff =  FormFactorSphere(10.0*nanometer, 13.0*nanometer)
+ff =  FormFactorPyramid(13*nanometer, 10.0*nanometer, 60*degree)
+
+
+# volume
+# I suggest, that the formfactor evaluated for q=0 gives the volume
+# please correct if not
+zero = cvector_t(0,0,0)
+V = abs(ff.evaluate_for_q(zero))
+
+
+# number of bins for qx, qy, qz
+# I recommend to put at least 400 for a better picture quality
+nqy = 400
+nqz = 400
+nqx = 400
+
+# minimum and maximum values for qx, qy qz
+qymin = -2.0
+qymax = 2.0
+qzmin = -2.0
+qzmax = 2.0
+qxmin = -2.0
+qxmax = 2.0
+
+# first and last bin for the projection slice
+# if number of bins=400, then fbin should be set to 200 and lbin to 201
+#fbin=200
+#lbin=201
+
+# step for qx, qy, qz
+stepqy = (qymax - qymin)/(nqy-1)
+stepqz = (qzmax - qzmin)/(nqz-1)
+stepqx = (qxmax - qxmin)/(nqx-1)
+
+# define style of the diagram
+ROOT.gROOT.SetStyle("Plain")
+ROOT.gStyle.SetOptStat(0);
+ROOT.gStyle.SetOptTitle(0);
+ROOT.gStyle.SetLabelSize(0.06, "xyz");
+ROOT.gStyle.SetTitleSize(0.06, "xyz");
+#ROOT.gStyle.SetPadRightMargin(0.1)
+ROOT.gStyle.SetPadLeftMargin(0.18)
+ROOT.gStyle.SetPadBottomMargin(0.18)
+
+t = ROOT.TText()
+# create ROOT histograms
+hist = ROOT.TH2D("hist","Sphere:H=R",nqy,qymin,qymax, nqz, qzmin, qzmax)
+hist2 = ROOT.TH2D("hist2","Sphere:H=R",nqx,qxmin,qxmax, nqy, qymin, qymax)
+
+# and fill them with the values
+for i in range(nqy):
+    qy = qymin + i*stepqy
+    for j in range(nqz):
+        qz = qzmin + j*stepqz
+        k = cvector_t(0,qy,qz)
+        hist.Fill(qy,qz,(abs(ff.evaluate_for_q(k)))**2+1)
+
+for i in range(nqy):
+    qy = qymin + i*stepqy
+    for j in range(nqx):
+        qx = qxmin + j*stepqx
+        k = cvector_t(qx,qy,0)
+        hist2.Fill(qx,qy,(abs(ff.evaluate_for_q(k)))**2+1)
+
+
+# create a ROOT canvas and put all plots on it
+c = ROOT.TCanvas("FormfactorSphere","Formfactor Sphere", 1000,500)
+
+c.Divide(2,1)
+hist.SetMinimum(1)
+hist.SetMaximum(V**2)
+hist2.SetMinimum(1)
+hist2.SetMaximum(V**2)
+hist.SetContour(50)
+hist2.SetContour(50)
+#hist.GetZaxis().SetTitle(" |F|^{2} ")
+#hist2.GetZaxis().SetTitle(" |F|^{2} ")
+
+
+c.cd(1)
+ROOT.gPad.SetLogz()
+hist.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
+hist.GetXaxis().CenterTitle()
+hist.GetXaxis().SetTitleOffset(1.1)
+hist.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
+hist.GetYaxis().CenterTitle()
+hist.GetYaxis().SetTitleOffset(1.4)
+hist.GetZaxis().SetTitleOffset(1.3)
+hist.Draw("col")
+#t.SetNDC(1)
+#t.SetTextSize(8.0e-2)
+#t.DrawText(0.1, 0.01, "a")
+
+c.cd(2)
+ROOT.gPad.SetLogz()
+hist2.SetMinimum(1)
+hist2.GetXaxis().SetTitle(" q_{x} [nm^{-1}] ")
+hist2.GetXaxis().CenterTitle()
+hist2.GetXaxis().SetTitleOffset(1.1)
+hist2.GetYaxis().SetTitle(" q_{y} [nm^{-1}] ")
+hist2.GetYaxis().CenterTitle()
+hist2.GetYaxis().SetTitleOffset(1.4)
+hist2.GetZaxis().SetTitleOffset(1.3)
+hist2.Draw("col")
+#t.DrawText(0.1, 0.004, "b")
+
+#c.cd(3)
+#ROOT.gPad.SetLogy()
+#py = hist.ProjectionX("py", fbin, lbin, 'o')
+#py.GetYaxis().SetTitle(" |F|^{2} ")
+#py.GetYaxis().SetTitleOffset(1.3)
+#py.Draw()
+
+#t.DrawText(0.1, 0.01, "c")
+
+#c.cd(4)
+#ROOT.gPad.SetLogy()
+#px = hist2.ProjectionX("px", fbin, lbin, 'o')
+#px.GetYaxis().SetTitle(" |F|^{2} ")
+#px.GetYaxis().SetTitleOffset(1.3)
+#px.Draw()
+#t.DrawText(0.1, 0.004, "d")
+
+c.Update()
+ROOT.gApplication.Run()
+
+
+
diff --git a/dev-tools/plot-ff/plotpardep.py b/dev-tools/plot-ff/plotpardep.py
new file mode 100644
index 0000000..2fb0a59
--- /dev/null
+++ b/dev-tools/plot-ff/plotpardep.py
@@ -0,0 +1,172 @@
+# script to plot the formfactor
+# after the ROOT window with plots appear,
+# just save the picture in that format which you need
+
+import ROOT
+from libBornAgainCore import *
+
+# define a formfactor, I recommend a 10--20 nm diameter
+#ff = FormFactorFullSphere(10.0*nanometer)
+ff05 =  FormFactorSphere(10.0*nanometer, 5.0*nanometer)
+ff10 =  FormFactorSphere(10.0*nanometer, 10.0*nanometer)
+ff15 =  FormFactorSphere(10.0*nanometer, 15.0*nanometer)
+
+# zero q vector
+zero = cvector_t(0,0,0)
+# volume of particles
+V05 = abs(ff05.evaluate_for_q(zero))
+V10 = abs(ff10.evaluate_for_q(zero))
+V15 = abs(ff15.evaluate_for_q(zero))
+
+
+# number of bins for qx, qy, qz
+# I recommend to put at least 400 for a better picture quality
+nqy = 100
+nqz = 100
+nqx = 100
+
+# minimum and maximum values for qx, qy qz
+qymin = -2.0
+qymax = 2.0
+qzmin = -2.0
+qzmax = 2.0
+qxmin = -2.0
+qxmax = 2.0
+
+# first and last bin for the projection slice
+# if number of bins=400, then fbin should be set to 200 and lbin to 201
+#fbin=50
+#lbin=51
+
+# step for qx, qy, qz
+stepqy = (qymax - qymin)/(nqy-1)
+stepqz = (qzmax - qzmin)/(nqz-1)
+stepqx = (qxmax - qxmin)/(nqx-1)
+
+# define style of the diagram
+ROOT.gROOT.SetStyle("Plain")
+ROOT.gStyle.SetOptStat(0);
+ROOT.gStyle.SetOptTitle(1);
+ROOT.gStyle.SetLabelSize(0.06, "xyz");
+ROOT.gStyle.SetTitleSize(0.06, "xyz");
+ROOT.gStyle.SetTitleFontSize(0.1);
+#ROOT.gStyle.SetPadRightMargin(0.19)
+ROOT.gStyle.SetPadLeftMargin(0.18)
+ROOT.gStyle.SetPadBottomMargin(0.18)
+ROOT.gStyle.SetTitleX(0.3);
+#ROOT.gStyle.SetTitleW(0.5);
+
+
+#t = ROOT.TText()
+# create ROOT histograms 
+h05 = ROOT.TH2D("h05nm","H = 5 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
+h10 = ROOT.TH2D("h10nm","H = 10 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
+h15 = ROOT.TH2D("h15nm","H = 15 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
+
+# and fill them with the values
+for i in range(nqy):
+	qy = qymin + i*stepqy
+	for j in range(nqz):
+		qz = qzmin + j*stepqz
+		k = cvector_t(0,qy,qz)
+		h05.Fill(qy,qz,(abs(ff05.evaluate_for_q(k))/V05)**2)
+		h10.Fill(qy,qz,(abs(ff10.evaluate_for_q(k))/V10)**2)
+		h15.Fill(qy,qz,(abs(ff15.evaluate_for_q(k))/V15)**2)
+
+
+
+# create a ROOT canvas and put all plots on it
+c = ROOT.TCanvas("FormfactorSphere","Formfactor Sphere", 1200,400)
+
+c.Divide(3,1)
+h05.SetMinimum(5e-8)
+#h05.SetMaximum(V05**2)
+h05.SetMaximum(1)
+h10.SetMinimum(5e-8)
+#h10.SetMaximum(V10**2)
+h10.SetMaximum(1)
+h15.SetMinimum(5e-8)
+#h15.SetMaximum(V15**2)
+h15.SetMaximum(1)
+h05.SetContour(50)
+h10.SetContour(50)
+h15.SetContour(50)
+#h05.GetZaxis().SetTitle(" |F|^{2} ")
+#h10.GetZaxis().SetTitle(" |F|^{2} ")
+#h15.GetZaxis().SetTitle(" |F|^{2} ")
+
+
+c.cd(1)
+ROOT.gPad.SetLogz()
+h05.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
+h05.GetXaxis().CenterTitle()
+h05.GetXaxis().SetTitleOffset(1.1)
+h05.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
+h05.GetYaxis().CenterTitle()
+h05.GetYaxis().SetTitleOffset(1.4)
+h05.GetZaxis().SetTitleOffset(1.3)
+h05.Draw("col")
+#t.SetNDC(1)
+#t.SetTextSize(8.0e-2)
+#t.DrawText(0.1, 0.01, "H = 5 nm")
+
+c.cd(2)
+ROOT.gPad.SetLogz()
+h10.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
+h10.GetXaxis().CenterTitle()
+h10.GetXaxis().SetTitleOffset(1.1)
+h10.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
+h10.GetYaxis().CenterTitle()
+h10.GetYaxis().SetTitleOffset(1.4)
+h10.GetZaxis().SetTitleOffset(1.3)
+h10.Draw("col")
+#t.SetNDC(1)
+#t.SetTextSize(8.0e-2)
+#t.DrawText(0.1, 0.01, "H = 10 nm")
+
+c.cd(3)
+ROOT.gPad.SetLogz()
+h15.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
+h15.GetXaxis().CenterTitle()
+h15.GetXaxis().SetTitleOffset(1.1)
+h15.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
+h15.GetYaxis().CenterTitle()
+h15.GetYaxis().SetTitleOffset(1.4)
+h15.GetZaxis().SetTitleOffset(1.3)
+h15.Draw("col")
+#t.SetNDC(1)
+#t.SetTextSize(8.0e-2)
+#t.DrawText(0.1, 0.01, "H = 15 nm")
+
+# draw projections
+#c.cd(4)
+#ROOT.gPad.SetLogy()
+#p05 = h05.ProjectionX("p05", fbin, lbin, 'o')
+#p05.GetYaxis().SetTitle(" |F|^{2} ")
+#p05.GetYaxis().SetTitleOffset(1.3)
+#p05.Draw()
+#t.DrawText(0.1, 0.01, "d")
+
+#c.cd(5)
+#ROOT.gPad.SetLogy()
+#p10 = h10.ProjectionX("p10", fbin, lbin, 'o')
+#p10.GetYaxis().SetTitle(" |F|^{2} ")
+#p10.GetYaxis().SetTitleOffset(1.3)
+#p10.Draw()
+#t.DrawText(0.1, 0.01, "e")
+
+#c.cd(6)
+#ROOT.gPad.SetLogy()
+#p15 = h15.ProjectionX("p15", fbin, lbin, 'o')
+#p15.GetYaxis().SetTitle(" |F|^{2} ")
+#p15.GetYaxis().SetTitleOffset(1.3)
+#p15.Draw()
+#t.DrawText(0.1, 0.01, "f")
+
+
+
+c.Update()
+ROOT.gApplication.Run()
+
+
+
diff --git a/dev-tools/plot-ff/plotpardeppyramid.py b/dev-tools/plot-ff/plotpardeppyramid.py
new file mode 100644
index 0000000..b695664
--- /dev/null
+++ b/dev-tools/plot-ff/plotpardeppyramid.py
@@ -0,0 +1,179 @@
+# script to plot the formfactor
+# after the ROOT window with plots appear,
+# just save the picture in that format which you need
+
+import ROOT
+from libBornAgainCore import *
+
+# define a formfactor, I recommend a 10--20 nm diameter
+# vary H
+ff05 =  FormFactorPyramid(2.5*nanometer, 5.0*nanometer, 60*degree)
+ff10 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 60*degree)
+ff15 =  FormFactorPyramid(7.5*nanometer, 5.0*nanometer, 60*degree)
+# vary alpha
+#ff05 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 50*degree)
+#ff10 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 65*degree)
+#ff15 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 80*degree)
+
+# zero q vector
+zero = cvector_t(0,0,0)
+# volume of particles
+V05 = abs(ff05.evaluate_for_q(zero))
+V10 = abs(ff10.evaluate_for_q(zero))
+V15 = abs(ff15.evaluate_for_q(zero))
+
+
+# number of bins for qx, qy, qz
+# I recommend to put at least 400 for a better picture quality
+nqy = 400
+nqz = 400
+nqx = 400
+
+# minimum and maximum values for qx, qy qz
+qymin = -2.0
+qymax = 2.0
+qzmin = -2.0
+qzmax = 2.0
+qxmin = -2.0
+qxmax = 2.0
+
+# first and last bin for the projection slice
+# if number of bins=400, then fbin should be set to 200 and lbin to 201
+#fbin=50
+#lbin=51
+
+# step for qx, qy, qz
+stepqy = (qymax - qymin)/(nqy-1)
+stepqz = (qzmax - qzmin)/(nqz-1)
+stepqx = (qxmax - qxmin)/(nqx-1)
+
+# define style of the diagram
+ROOT.gROOT.SetStyle("Plain")
+ROOT.gStyle.SetOptStat(0);
+ROOT.gStyle.SetOptTitle(1);
+ROOT.gStyle.SetLabelSize(0.06, "xyz");
+ROOT.gStyle.SetTitleSize(0.06, "xyz");
+ROOT.gStyle.SetTitleFontSize(0.1);
+#ROOT.gStyle.SetPadRightMargin(0.19)
+ROOT.gStyle.SetPadLeftMargin(0.18)
+ROOT.gStyle.SetPadBottomMargin(0.18)
+ROOT.gStyle.SetTitleX(0.3);
+#ROOT.gStyle.SetTitleW(0.5);
+
+
+#t = ROOT.TText()
+# create ROOT histograms 
+h05 = ROOT.TH2D("h05nm","H = 2.5 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
+h10 = ROOT.TH2D("h10nm","H = 5.0 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
+h15 = ROOT.TH2D("h15nm","H = 7.5 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
+#h05 = ROOT.TH2D("a50"," #alpha = 50^{o} ",nqy,qymin,qymax, nqz, qzmin, qzmax)
+#h10 = ROOT.TH2D("a65"," #alpha = 65^{o} ",nqy,qymin,qymax, nqz, qzmin, qzmax)
+#h15 = ROOT.TH2D("a80"," #alpha = 80^{o} ",nqy,qymin,qymax, nqz, qzmin, qzmax)
+
+# and fill them with the values
+for i in range(nqy):
+	qy = qymin + i*stepqy
+	for j in range(nqz):
+		qz = qzmin + j*stepqz
+		k = cvector_t(0,qy,qz)
+		h05.Fill(qy,qz,(abs(ff05.evaluate_for_q(k))/V05)**2)
+		h10.Fill(qy,qz,(abs(ff10.evaluate_for_q(k))/V10)**2)
+		h15.Fill(qy,qz,(abs(ff15.evaluate_for_q(k))/V15)**2)
+
+
+
+# create a ROOT canvas and put all plots on it
+c = ROOT.TCanvas("FormfactorSphere","Formfactor Sphere", 1200,400)
+
+c.Divide(3,1)
+h05.SetMinimum(1e-7)
+#h05.SetMaximum(V05**2)
+h05.SetMaximum(1)
+h10.SetMinimum(1e-7)
+#h10.SetMaximum(V10**2)
+h10.SetMaximum(1)
+h15.SetMinimum(1e-7)
+#h15.SetMaximum(V15**2)
+h15.SetMaximum(1)
+h05.SetContour(50)
+h10.SetContour(50)
+h15.SetContour(50)
+#h05.GetZaxis().SetTitle(" |F|^{2} ")
+#h10.GetZaxis().SetTitle(" |F|^{2} ")
+#h15.GetZaxis().SetTitle(" |F|^{2} ")
+
+
+c.cd(1)
+ROOT.gPad.SetLogz()
+h05.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
+h05.GetXaxis().CenterTitle()
+h05.GetXaxis().SetTitleOffset(1.1)
+h05.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
+h05.GetYaxis().CenterTitle()
+h05.GetYaxis().SetTitleOffset(1.4)
+h05.GetZaxis().SetTitleOffset(1.3)
+h05.Draw("col")
+#t.SetNDC(1)
+#t.SetTextSize(8.0e-2)
+#t.DrawText(0.1, 0.01, "H = 5 nm")
+
+c.cd(2)
+ROOT.gPad.SetLogz()
+h10.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
+h10.GetXaxis().CenterTitle()
+h10.GetXaxis().SetTitleOffset(1.1)
+h10.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
+h10.GetYaxis().CenterTitle()
+h10.GetYaxis().SetTitleOffset(1.4)
+h10.GetZaxis().SetTitleOffset(1.3)
+h10.Draw("col")
+#t.SetNDC(1)
+#t.SetTextSize(8.0e-2)
+#t.DrawText(0.1, 0.01, "H = 10 nm")
+
+c.cd(3)
+ROOT.gPad.SetLogz()
+h15.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
+h15.GetXaxis().CenterTitle()
+h15.GetXaxis().SetTitleOffset(1.1)
+h15.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
+h15.GetYaxis().CenterTitle()
+h15.GetYaxis().SetTitleOffset(1.4)
+h15.GetZaxis().SetTitleOffset(1.3)
+h15.Draw("col")
+#t.SetNDC(1)
+#t.SetTextSize(8.0e-2)
+#t.DrawText(0.1, 0.01, "H = 15 nm")
+
+# draw projections
+#c.cd(4)
+#ROOT.gPad.SetLogy()
+#p05 = h05.ProjectionX("p05", fbin, lbin, 'o')
+#p05.GetYaxis().SetTitle(" |F|^{2} ")
+#p05.GetYaxis().SetTitleOffset(1.3)
+#p05.Draw()
+#t.DrawText(0.1, 0.01, "d")
+
+#c.cd(5)
+#ROOT.gPad.SetLogy()
+#p10 = h10.ProjectionX("p10", fbin, lbin, 'o')
+#p10.GetYaxis().SetTitle(" |F|^{2} ")
+#p10.GetYaxis().SetTitleOffset(1.3)
+#p10.Draw()
+#t.DrawText(0.1, 0.01, "e")
+
+#c.cd(6)
+#ROOT.gPad.SetLogy()
+#p15 = h15.ProjectionX("p15", fbin, lbin, 'o')
+#p15.GetYaxis().SetTitle(" |F|^{2} ")
+#p15.GetYaxis().SetTitleOffset(1.3)
+#p15.Draw()
+#t.DrawText(0.1, 0.01, "f")
+
+
+
+c.Update()
+ROOT.gApplication.Run()
+
+
+
diff --git a/dev-tools/profiling/README b/dev-tools/profiling/README
new file mode 100644
index 0000000..7955812
--- /dev/null
+++ b/dev-tools/profiling/README
@@ -0,0 +1,63 @@
+# maintainers, attention: if this page is moved, then update the link at
+# http://apps.jcns.fz-juelich.de/redmine/projects/bornagain/wiki
+
+This directory contains different scripts for running code profiling utilities.
+
+The goal of these utilities is to determine the speed of a particular
+operation/function/algorithm, and to find bottlenecks in program flow.
+
+There are several ways of code profiling:
+
+----------------------------------------------------------
+Profiling with valgrind
+----------------------------------------------------------
+
+1) Compile BornAgain as usuall and simply run
+./run_valgrind.sh
+
+* Compile your application in debug mode
+* Generate log file with performance information using valgrind
+> valgrind --tool=callgrind -v --dump-every-bb=10000000 --dump-instr=yes --trace-jump=yes ./App commandline
+> valgrind --logfile=valgrind.output --num-callers=6 --leak-check=yes  ./App commandline
+>>where 'App' is the name of executable, 'commandline' is command line parameters
+
+* Use _kcachegrind_ (from KDE distro) to visualize obtained log file
+_kcachegrind_ exists in Linux, for Mac _kcachegrind_ (KDE based) or _qcachegrind_ (pure Qt based) can be installed/compiled as described in
+http://langui.sh/2011/06/16/how-to-install-qcachegrind-kcachegrind-on-mac-osx-snow-leopard/
+
+  In my case I was able to compile, but the program is not stable and sometime crashes.
+
+  See also http://kcachegrind.sourceforge.net/html/Usage.html
+
+----------------------------------------------------------
+Profiling with gperftool
+----------------------------------------------------------
+
+1) gperftool should be installed
+download code from http://code.google.com/p/gperftools/
+./configure --prefix=/opt/local; make; make install
+
+2) BornAgain should be compiled with GPERFTOOLS in config
+make distclean
+qmake CONFIG+=GPERFTOOLS
+make
+
+3) run profiling
+run_gperftools.sh
+
+*) When compiled with GPERFTOOLS option, profiling with valgrind (callgrind) wont work.
+
+----------------------------------------------------------
+Profiling with perf
+----------------------------------------------------------
+
+Under Linux.
+
+Install Debian package linux-perf.
+
+echo "-1" >/proc/sys/kernel/perf_event_paranoid
+
+perf stat <any performance test>
+
+perf record -o /tmp/perf.out <any performance test>
+perf report -i /tmp/perf.out
diff --git a/dev-tools/profiling/run_gperftools.sh b/dev-tools/profiling/run_gperftools.sh
new file mode 100755
index 0000000..ef07ff0
--- /dev/null
+++ b/dev-tools/profiling/run_gperftools.sh
@@ -0,0 +1,53 @@
+# run GISASFW functional tests with 'gperftools'
+# see README for more explanation
+
+mkdir -p ./output
+
+
+application=../../App/App
+arguments="mesocrystal profile"
+focuson=GISASExperiment
+
+# ------------------------------------------- #
+# profiling cpu usage
+# ------------------------------------------- #
+profile_cpu=yes
+if [ $profile_cpu = "yes" ]
+then
+  OutputCpuLog=./output/gperftools_cpuprof.out
+
+  # generating log
+  CPUPROFILE=$OutputCpuLog $application $arguments
+
+  # analysing log
+  pprof --text --focus $focuson /bin/ls $OutputCpuLog
+
+  #generating graph
+  pprof --gv --focus GISASExperiment /bin/ls $OutputCpuLog &
+
+  # generating log for usage with qcachegrind
+  pprof --callgrind /bin/ls $OutputCpuLog > $OutputCpuLog.callgrind
+  #one have to look at it with
+  #~/Applications/qcachegrind.app/Contents/MacOS/qcachegrind output/gperftools_cpuprof.out.callgrind
+fi
+
+
+# ------------------------------------------- #
+# profiling HEAP usage
+# ------------------------------------------- #
+profile_heap=no
+if [ $profile_heap = "yes" ]
+then
+  OutputHeapLog=./output/gperftools_heapprof
+
+  # generating log
+  HEAPPROFILE=$OutputHeapLog $application $arguments
+
+  # analysing log
+  pprof --text --focus $focuson $application ./output/gperftools_heapprof.0001.heap
+
+  #generating graph
+  #pprof --gv --focus $focuson $application ./output/gperftools_heapprof.0001.heap
+fi
+
+
diff --git a/dev-tools/profiling/run_valgrind.sh b/dev-tools/profiling/run_valgrind.sh
new file mode 100755
index 0000000..ad4b709
--- /dev/null
+++ b/dev-tools/profiling/run_valgrind.sh
@@ -0,0 +1,37 @@
+# run GISASFW functional tests with 'gperftools'
+# see README for more explanation
+
+mkdir -p ./output
+
+
+application=../../App/App
+#arguments="isgisaxs9 profile"
+#arguments="isgisaxs10 batch"
+#arguments="isgisaxs9 batch"
+#arguments="isgisaxs2 batch profile"
+#arguments="--isgisaxs09 --batch"
+arguments="--testbugs --batch"
+focuson=GISASExperiment
+
+# ------------------------------------------- #
+# profiling cpu usage
+# ------------------------------------------- #
+profile_cpu=no
+if [ $profile_cpu = "yes" ]
+then
+#  valgrind --tool=callgrind -v --dump-every-bb=10000000 --dump-instr=yes --trace-jump=yes ./App commandline
+  valgrind  --tool=callgrind --dsymutil=yes --callgrind-out-file=./output/callgrind.output  --log-file=./output/tmplog.output --dump-instr=yes --trace-jump=yes $application $arguments
+# --zero-before=GISASExperiment
+fi
+
+
+# ------------------------------------------- #
+# profiling HEAP usage
+# ------------------------------------------- #
+profile_memory=yes
+if [ $profile_memory = "yes" ]
+then
+  valgrind --log-file=./output/valgrind.output  --dsymutil=yes --num-callers=6 --track-origins=yes --leak-check=yes $application $arguments
+fi
+
+#valgrind --log-file=valgrind.output --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./App/App mesocrystal
diff --git a/dev-tools/release/make_release.py b/dev-tools/release/make_release.py
new file mode 100644
index 0000000..b18b273
--- /dev/null
+++ b/dev-tools/release/make_release.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+from utils.common import *
+from utils.prepare_release import *
+from utils.finalize_release import *
+
+
+def main():
+
+    if len(sys.argv) != 2:
+        print "Please specify the name of the release branch."
+        print "Usage: python make_release.py release-0.9.3"
+        exit()
+
+    set_branch_name(sys.argv[1])
+    set_working_dir(os.getcwd() + "/" + get_branch_name())
+
+    if os.path.exists(get_working_dir()):
+        print "Directory %s exists, continuing release process." % get_working_dir()
+        finalize_release()
+    else:
+        prepare_release()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/dev-tools/release/utils/__init__.py b/dev-tools/release/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dev-tools/release/utils/check_release.py b/dev-tools/release/utils/check_release.py
new file mode 100644
index 0000000..7163340
--- /dev/null
+++ b/dev-tools/release/utils/check_release.py
@@ -0,0 +1,59 @@
+import os
+import sys
+from common import *
+import subprocess
+
+
+
+def check_manual():
+    cmd = "cd %s; wget http://apps.jcns.fz-juelich.de/src/BornAgain/%s" % (get_checkrelease_dir(), get_manual_name())
+    run_command(cmd)
+    if not os.path.exists(get_checkrelease_dir()+"/"+get_manual_name()):
+        exit("Error! Can't access user manual")
+
+
+def check_tarball():
+    print "Checking tarball ..."
+    cmd = "cd %s; wget http://apps.jcns.fz-juelich.de/src/BornAgain/BornAgain-%s.tar.gz" % (get_checktarball_dir(), get_version())
+    run_command(cmd)
+    cmd = "cd %s; tar zxf BornAgain-%s.tar.gz" % (get_checktarball_dir(), get_version())
+    run_command(cmd)
+    cmd = "cd %s; mkdir build; mkdir installed" % get_checktarball_dir()
+    run_command(cmd)
+    cmd = "cd %s/build; cmake -DCMAKE_INSTALL_PREFIX=../installed ../BornAgain-%s; make -j8; make check; make install" % (get_checktarball_dir(), get_version())
+    run_command(cmd)
+    cmd = "cd %s/installed/lib; python -c \"from libBornAgainCore import *; print GetVersionNumber()\"" % (get_checktarball_dir())
+    print cmd
+    result = subprocess.check_output(cmd, shell=True)
+    received_version = result.split("\n")[0]
+    if not received_version == get_version():
+        exit("Error! Can't get correct version from tarball. Received '"+received_version+"', expected '"+get_version()+"'")
+
+
+def check_master_branch():
+    print "Checking master branch ..."
+    cmd = "cd %s; mkdir build; mkdir installed" % get_checkmaster_dir()
+    run_command(cmd)
+    cmd = "cd %s; git clone git://apps.jcns.fz-juelich.de/BornAgain.git " % get_checkmaster_dir()
+    run_command(cmd)
+    cmd = "cd %s/build; cmake -DCMAKE_INSTALL_PREFIX=../installed ../BornAgain; make -j8; make check; make install" % (get_checkmaster_dir())
+    run_command(cmd)
+    cmd = "source %s/installed/bin/thisbornagain.sh; python -c \"from libBornAgainCore import *; print GetVersionNumber()\"" % (get_checkmaster_dir())
+    print cmd
+    result = subprocess.check_output(cmd, shell=True)
+    received_version = result.split("\n")[0]
+    if not received_version == get_version():
+        exit("Error! Can't get correct version from master branch. Received '"+received_version+"', expected '"+get_version()+"'")
+
+
+def check_release():
+    print "Checking release"
+    check_manual()
+    check_tarball()
+    check_master_branch()
+    print "\n"
+    print "Congratulations! New %s release was successfully validated. " % (get_version())
+    print "Don't forget to post news items."
+    print "And yes, this was very productive."
+
+
diff --git a/dev-tools/release/utils/common.py b/dev-tools/release/utils/common.py
new file mode 100644
index 0000000..67056f4
--- /dev/null
+++ b/dev-tools/release/utils/common.py
@@ -0,0 +1,74 @@
+import os
+import time
+
+RELEASE_WORKING_DIRECTORY = ""
+RELEASE_BRANCH_NAME = ""
+
+
+def set_working_dir(working_dir):
+    global RELEASE_WORKING_DIRECTORY
+    RELEASE_WORKING_DIRECTORY = working_dir
+
+
+def set_branch_name(branch_name):
+    global RELEASE_BRANCH_NAME
+    RELEASE_BRANCH_NAME = branch_name
+
+
+def get_working_dir():
+    if not RELEASE_WORKING_DIRECTORY:
+        exit("Empty working directory")
+    return RELEASE_WORKING_DIRECTORY
+
+
+def get_source_dir():
+    return get_working_dir()+"/"+"BornAgain"
+
+
+def get_build_dir():
+    return get_working_dir()+"/"+"build"
+
+
+def get_upload_dir():
+    return get_working_dir()+"/"+"upload"
+
+
+def get_install_dir():
+    return get_working_dir()+"/"+"installed"
+
+
+def get_branch_name():
+    if not RELEASE_BRANCH_NAME:
+        exit("Empty branch name")
+    return RELEASE_BRANCH_NAME
+
+
+def get_version():
+    name, version = get_branch_name().split("-")
+    #version_major, version_minor, version_patch = version.split(".")
+    return version
+
+
+def get_checkrelease_dir():
+    return get_working_dir()+"/"+"checkrelease"
+
+
+def get_checkmaster_dir():
+    return get_checkrelease_dir()+"/"+"checkmaster"
+
+
+def get_checktarball_dir():
+    return get_checkrelease_dir()+"/"+"checktarball"
+
+
+def get_manual_name():
+    return "BornAgainManual-%s.pdf" % get_version()
+
+
+def run_command(cmd):
+    print ">>>", cmd
+    returncode = os.system(cmd)
+    time.sleep(1)
+    if returncode:
+        exit("Error while running command '"+cmd+"'")
+
diff --git a/dev-tools/release/utils/finalize_release.py b/dev-tools/release/utils/finalize_release.py
new file mode 100644
index 0000000..41659be
--- /dev/null
+++ b/dev-tools/release/utils/finalize_release.py
@@ -0,0 +1,88 @@
+import os
+import sys
+import time
+
+from common import *
+from check_release import *
+
+def upload_release():
+    print "Uploading to the app server ..."
+    cmd = "rsync --delete -avzhe ssh %s/ apps at apps.jcns.fz-juelich.de:/www/apps/src/BornAgain/" % get_upload_dir()
+    run_command(cmd)
+
+
+def finalize_git():
+    print "Finalizing git ..."
+    cmd = "cd %s; git commit -a -m \"Release %s\"" % (get_source_dir(), get_version())
+    run_command(cmd)
+
+    cmd = "cd %s; git push" % get_source_dir()
+    run_command(cmd)
+
+    # master branch
+    cmd = "cd %s; git checkout master; git pull" % get_source_dir()
+    run_command(cmd)
+
+    cmd = "cd %s; git merge --no-ff %s -m \"Merge %s\"" % (get_source_dir(), get_branch_name(), get_version())
+    run_command(cmd)
+
+    cmd = "cd %s; git push" % get_source_dir()
+    run_command(cmd)
+
+    cmd = "cd %s; git tag -a v%s -m \"Release %s\"" % (get_source_dir(), get_version(), get_version())
+    run_command(cmd)
+
+    cmd = "cd %s; git push --tags" % get_source_dir()
+    run_command(cmd)
+
+    # develop branch
+    cmd = "cd %s; git checkout develop; git pull" % get_source_dir()
+    run_command(cmd)
+
+    cmd = "cd %s; git merge --no-ff %s -m \"Merge %s\"" % (get_source_dir(), get_branch_name(), get_version())
+    run_command(cmd)
+
+    cmd = "cd %s; git push" % get_source_dir()
+    run_command(cmd)
+
+    # deleting branch
+
+    cmd = "cd %s; git push origin --delete %s" % (get_source_dir(), get_branch_name())
+    run_command(cmd)
+
+def get_menu_option():
+    print "\nFinalizing release %s in working directory '%s'." % (get_version(), get_working_dir())
+
+    print "Please select what you want to do:"
+    print ""
+    print "1. Upload release to the apps server"
+    print "2. Finalize git"
+    print "3. Check release"
+    print "4. Quit"
+
+    choice = 0
+    is_valid = 0
+
+    while not is_valid:
+        try:
+            choice = int(raw_input('Enter your choice [1-4] : '))
+            is_valid = 1
+        except ValueError, e:
+            print ("'%s' is not a valid integer." % e.args[0].split(": ")[1])
+    return choice
+
+def finalize_release():
+    choice = get_menu_option()
+
+    while choice != 4:
+        if choice == 1:
+            upload_release()
+        elif choice == 2:
+            finalize_git()
+        elif choice == 3:
+            check_release()
+        else:
+            print ("Invalid number. Try again...")
+        choice = get_menu_option()
+    exit("Good bye")
+
diff --git a/dev-tools/release/utils/prepare_release.py b/dev-tools/release/utils/prepare_release.py
new file mode 100644
index 0000000..987bd3c
--- /dev/null
+++ b/dev-tools/release/utils/prepare_release.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+
+import sys
+import os
+import time
+
+from common import *
+
+def make_directories():
+    print "\nCreating directory structure ... "
+    os.makedirs(get_working_dir())
+    os.makedirs(get_build_dir())
+    os.makedirs(get_upload_dir())
+    os.makedirs(get_install_dir())
+    os.makedirs(get_checkrelease_dir())
+    os.makedirs(get_checktarball_dir())
+    os.makedirs(get_checkmaster_dir())
+
+
+def git_clone():
+    print "\nCloning BornAgain repository ... "
+    cmd = "cd %s; git clone git at apps.jcns.fz-juelich.de:BornAgain.git" % get_working_dir()
+    run_command(cmd)
+    print "\nChecking out release branch ... "
+    cmd = "cd %s; git checkout %s" % (get_source_dir(), get_branch_name())
+    run_command(cmd)
+
+
+def download_from_app_server():
+    print "\nDownloading from application server ..."
+    cmd = "rsync -avzhe ssh apps at apps.jcns.fz-juelich.de:/www/apps/src/BornAgain/ %s" %get_upload_dir()
+    run_command(cmd)
+
+
+def cmake_release():
+    print "\nRunning cmake ...", get_build_dir()
+    # cmd = "cd %s; cmake -DBORNAGAIN_USERMANUAL=ON -DBORNAGAIN_RELEASE=ON -DCMAKE_INSTALL_PREFIX=%s %s" % (get_build_dir(), get_install_dir(), get_source_dir() )
+    cmd = "cd %s; cmake  -DCMAKE_INSTALL_PREFIX=%s %s" % (get_build_dir(), get_install_dir(), get_source_dir() )
+    run_command(cmd)
+
+
+def compile_release():
+    print "\nCompiling ..."
+    cmd = "cd %s; make -j8; make check; make install" % get_build_dir()
+    run_command(cmd)
+
+
+def measure_performance():
+    print "\nMeasuring performance ..."
+    perf_txt = get_source_dir()+"/dev-tools/log/perf_history.txt"
+    run_command("cd %s; ./bin/App --performance --batch; " % get_build_dir())
+    run_command("echo \"# Release %s\" >> %s" % (get_version(), perf_txt))
+    run_command("cd %s; cat perf_history.txt >> %s" % (get_build_dir(), perf_txt))
+
+
+def make_tarball():
+    print "\nMaking tarball ..."
+    run_command("cd %s; make package_source" % get_build_dir())
+
+
+def update_upload_dir():
+    print "\nUpdating directory for upload ..."
+    run_command("mv %s/BornAgain*.tar.gz %s/old" % (get_upload_dir(), get_upload_dir()))
+    run_command("mv %s/BornAgain*-win32.exe %s/old" % (get_upload_dir(), get_upload_dir()))
+    run_command("mv %s/BornAgain-*-macosx64-*.dmg %s/old" % (get_upload_dir(), get_upload_dir()))
+    run_command("mv %s/*Manual-*.pdf %s/old" % (get_upload_dir(), get_upload_dir()))
+    run_command("cp %s/BornAgain-%s.tar.gz %s" % (get_build_dir(), get_version(), get_upload_dir()))
+    run_command("cp %s/CHANGELOG %s" % (get_source_dir(), get_upload_dir()))
+    #run_command("cp %s/Doc/UserManual/BornAgainManual.pdf %s/%s" % (get_build_dir(), get_upload_dir(), get_manual_name()) )
+
+
+def prepare_release():
+    print "\nPreparing release %s in working directory '%s'." % (get_version(), get_working_dir())
+
+    make_directories()
+    git_clone()
+    download_from_app_server()
+    cmake_release()
+    compile_release()
+    #measure_performance()
+    make_tarball()
+    update_upload_dir()
+
+    print " "
+    print "New %s release is successfully created in the %s. Please check it now ;-)" % (get_version(), get_working_dir())
+    print "Things to do:"
+    print "*) Copy windows installer to ", get_upload_dir()
+    print "After your are done, run this script again."
+
diff --git a/unused/ComponentParameter.cpp b/unused/ComponentParameter.cpp
new file mode 100644
index 0000000..5606b72
--- /dev/null
+++ b/unused/ComponentParameter.cpp
@@ -0,0 +1,16 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      unused/ComponentParameter.cpp
+//! @brief     Implements class ComponentParameter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ComponentParameter.h"
diff --git a/unused/ComponentParameter.h b/unused/ComponentParameter.h
new file mode 100644
index 0000000..3a45f2f
--- /dev/null
+++ b/unused/ComponentParameter.h
@@ -0,0 +1,43 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      unused/ComponentParameter.h
+//! @brief     Defines class ComponentParameter.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef COMPONENTPARAMETER_H
+#define COMPONENTPARAMETER_H
+
+#include "IParameter.h"
+#include "ISample.h"
+#include <string>
+
+//! Wraps a parameter of type ISample.
+//! @ingroup tools_internal
+
+class BA_CORE_API_ ComponentParameter : public IParameter<ISample> {
+public:
+    ComponentParameter(
+        const std::string& name, volatile ISample* par,
+        const std::string& parent_name, const std::function<void()>& onChange)
+    : IParameter<ISample>(name, par, parent_name, onChange) {}
+
+    ComponentParameter* clone( const std::string& new_name="" ) const {
+        return new ComponentParameter(
+            new_name=="" ? getName() : new_name, m_data, m_parent_name, m_onChange); }
+
+    bool operator==(const ComponentParameter& other) const {
+        return *static_cast<const IParameter*>(this)==*static_cast<const IParameter*>(&other); }
+
+protected:
+};
+
+#endif // COMPONENTPARAMETER_H
diff --git a/unused/MatrixSpecularInfoMapTest.h b/unused/MatrixSpecularInfoMapTest.h
new file mode 100644
index 0000000..6353f79
--- /dev/null
+++ b/unused/MatrixSpecularInfoMapTest.h
@@ -0,0 +1,84 @@
+#ifndef MATRIXSPECULARINFOMAPTEST_H
+#define MATRIXSPECULARINFOMAPTEST_H
+
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MatrixRTCoefficients.h"
+#include "MatrixSpecularInfoMap.h"
+#include "MultiLayer.h"
+#include "MathConstants.h"
+#include "SimulationElement.h"
+#include <memory>
+
+class MatrixSpecularInfoMapTest : public ::testing :: Test
+{
+protected:
+    MatrixSpecularInfoMapTest();
+    virtual ~MatrixSpecularInfoMapTest() {
+        delete mp_multilayer;
+    }
+    MultiLayer* mp_multilayer;
+};
+
+MatrixSpecularInfoMapTest::MatrixSpecularInfoMapTest()
+{
+    mp_multilayer = new MultiLayer;
+
+    HomogeneousMaterial air_material("Air", 0., 0.);
+    HomogeneousMaterial substrate_material("Substrate", 0.2, 0.02);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    mp_multilayer->addLayer(air_layer);
+    mp_multilayer->addLayer(substrate_layer);
+}
+
+TEST_F(MatrixSpecularInfoMapTest, getCoefficients)
+{
+    MatrixSpecularInfoMap map(mp_multilayer, 0);
+    SimulationElement sim_element(M_TWOPI, 1.0, 1.0, nullptr);
+    std::unique_ptr<const MatrixRTCoefficients> P_rt_coeffs(
+                (MatrixRTCoefficients*) map.getOutCoefficients(sim_element));
+    complex_t R0 = complex_t(0.1750375, -0.0222467);
+    complex_t lambda0 = complex_t(0.841471, 0.0);
+    (void)R0;
+    (void)lambda0;
+
+    EXPECT_TRUE(nullptr != P_rt_coeffs.get());
+
+    EXPECT_EQ(0.0, P_rt_coeffs->T1plus()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->T1plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->T1min()(0));
+    EXPECT_NEAR(1.0, P_rt_coeffs->T1min()(1).real(), 1e-6);
+    EXPECT_NEAR(0.0, P_rt_coeffs->T1min()(1).imag(), 1e-6);
+
+    EXPECT_NEAR(1.0, P_rt_coeffs->T2plus()(0).real(), 1e-6);
+    EXPECT_NEAR(0.0, P_rt_coeffs->T2plus()(0).imag(), 1e-6);
+    EXPECT_EQ(0.0, P_rt_coeffs->T2plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->T2min()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->T2min()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->R1plus()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->R1plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->R1min()(0));
+    EXPECT_NEAR(R0.real(), P_rt_coeffs->R1min()(1).real(), 1e-6);
+    EXPECT_NEAR(R0.imag(), P_rt_coeffs->R1min()(1).imag(), 1e-6);
+
+    EXPECT_NEAR(R0.real(), P_rt_coeffs->R2plus()(0).real(), 1e-6);
+    EXPECT_NEAR(R0.imag(), P_rt_coeffs->R2plus()(0).imag(), 1e-6);
+    EXPECT_EQ(0.0, P_rt_coeffs->R2plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->R2min()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->R2min()(1));
+
+    EXPECT_NEAR(lambda0.real(), P_rt_coeffs->getKz()(0).real(), 1e-6);
+    EXPECT_NEAR(lambda0.imag(), P_rt_coeffs->getKz()(0).imag(), 1e-6);
+    EXPECT_NEAR(lambda0.real(), P_rt_coeffs->getKz()(1).real(), 1e-6);
+    EXPECT_NEAR(lambda0.imag(), P_rt_coeffs->getKz()(1).imag(), 1e-6);
+}
+
+#endif // MATRIXSPECULARINFOMAPTEST_H
diff --git a/unused/OMPISimulation.cpp b/unused/OMPISimulation.cpp
new file mode 100644
index 0000000..f6c8c87
--- /dev/null
+++ b/unused/OMPISimulation.cpp
@@ -0,0 +1,94 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      unused/OMPISimulation.cpp
+//! @brief     Implements class OMPISimulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "OMPISimulation.h"
+#include "Logger.h"
+
+#ifdef BORNAGAIN_OPENMPI
+
+void OMPISimulation::runSimulation(Simulation * simulation)
+{
+    MPI_Status st;
+
+    int world_size(0), world_rank(0);
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
+    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
+
+    if(world_size == 1) {
+        msglog(MSG::WARNING) <<
+            "OMPISimulation::runSimulation() -> Warning. Not an OpenMPI environment.";
+        msglog(MSG::WARNING) << "For now continuing without OpenMPI support";
+        simulation->runSimulation();
+        return;
+    }
+
+    // Get the name of the processor
+    char processor_name[MPI_MAX_PROCESSOR_NAME];
+    int name_len;
+    MPI_Get_processor_name(processor_name, &name_len);
+
+
+    msglog(MSG::DEBUG) << "OMPISimulation::runSimulation() -> "
+                      << " from processor " << processor_name
+                      << " , rank " << world_rank
+                      << " out of " << world_size << " processors.";
+
+
+    if(world_rank != 0) {
+        ThreadInfo threadInfo = simulation->m_thread_info;
+        threadInfo.n_batches = world_size - 1;
+        threadInfo.current_batch = world_rank - 1;
+        msglog(MSG::DEBUG) << "Preparing to run simulation (current_batch = " <<
+            threadInfo.current_batch << " , n_batches = " << threadInfo.n_batches << ").";
+        simulation->setThreadInfo(threadInfo);
+        simulation->runSimulation();
+
+        std::vector<double> raw = simulation->getOutputData()->getRawDataVector();
+        msglog(MSG::DEBUG) << "Preparing to send raw data of size " << raw.size() <<
+            " (current_batch = " << threadInfo.current_batch <<
+            " , n_batches = " << threadInfo.n_batches << ").";
+        MPI_Send(&raw[0], raw.size(), MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
+
+    }
+    if(world_rank==0) {
+        size_t total_size = simulation->getOutputData()->getAllocatedSize();
+        std::vector<double> sum_of_raw;
+        sum_of_raw.resize(total_size, 0.0);
+        for(int i=1; i<world_size; ++i) {
+            std::vector<double> raw;
+            raw.resize(total_size, 0.0);
+            msglog(MSG::DEBUG) << "Preparing to receive raw data of size " << raw.size() <<
+                " from batch = " << i;
+            MPI_Recv(&raw[0], total_size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &st);
+            for(size_t i_raw=0; i_raw<total_size; ++i_raw)
+                sum_of_raw[i_raw] += raw[i_raw];
+        }
+        simulation->m_intensity_map.setRawDataVector(sum_of_raw);
+    }
+}
+
+#else
+// -----------------------------------------------------------------------------
+// No OpenMPI support
+// -----------------------------------------------------------------------------
+
+void OMPISimulation::runSimulation(Simulation * /* simulation */)
+{
+    throw Exceptions::RuntimeErrorException(
+        "OMPISimulation::runSimulation() -> Error! Can't run OpenMPI simulation. "
+        "The package was compiled without OpenMPI support (compile with -DBORNAGAIN_OPENMPI=ON)" );
+}
+
+#endif
diff --git a/unused/OMPISimulation.h b/unused/OMPISimulation.h
new file mode 100644
index 0000000..c97e50b
--- /dev/null
+++ b/unused/OMPISimulation.h
@@ -0,0 +1,31 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      unused/OMPISimulation.h
+//! @brief     Defines class OMPISimulation.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef OMPISIMULATION_H
+#define OMPISIMULATION_H
+
+
+class Simulation;
+
+class OMPISimulation
+{
+public:
+
+    void runSimulation(Simulation *simulation);
+
+};
+
+
+#endif // OMPISIMULATION_H
diff --git a/unused/ScalarSpecularInfoMapTest.h b/unused/ScalarSpecularInfoMapTest.h
new file mode 100644
index 0000000..e215085
--- /dev/null
+++ b/unused/ScalarSpecularInfoMapTest.h
@@ -0,0 +1,86 @@
+#ifndef SCALARSPECULARINFOMAPTEST_H
+#define SCALARSPECULARINFOMAPTEST_H
+
+#include "MultiLayer.h"
+#include "HomogeneousMaterial.h"
+#include "Layer.h"
+#include "MathConstants.h"
+#include "ScalarRTCoefficients.h"
+#include "ScalarSpecularInfoMap.h"
+#include "SimulationElement.h"
+#include <memory>
+
+class ScalarSpecularInfoMapTest : public ::testing :: Test
+{
+protected:
+    ScalarSpecularInfoMapTest();
+    virtual ~ScalarSpecularInfoMapTest() { delete mp_multilayer; }
+
+    MultiLayer* mp_multilayer;
+};
+
+ScalarSpecularInfoMapTest::ScalarSpecularInfoMapTest()
+{
+    mp_multilayer = new MultiLayer;
+
+    HomogeneousMaterial air_material("Air", 0., 0.);
+    HomogeneousMaterial substrate_material("Substrate", 0.2, 0.02);
+
+    Layer air_layer(air_material);
+    Layer substrate_layer(substrate_material);
+
+    mp_multilayer->addLayer(air_layer);
+    mp_multilayer->addLayer(substrate_layer);
+}
+
+TEST_F(ScalarSpecularInfoMapTest, getCoefficients)
+{
+    ScalarSpecularInfoMap map(mp_multilayer, 0);
+    SimulationElement sim_element(M_TWOPI, 1.0, 1.0, AngularPixelMap::createZeroSizeMap(0,0));
+    std::unique_ptr<const ScalarRTCoefficients> P_rt_coeffs(
+        (ScalarRTCoefficients*) map.getOutCoefficients(sim_element));
+    complex_t R0 = complex_t(0.1750375, -0.0222467);
+    complex_t lambda0 = complex_t(0.841471, 0.0);
+    EXPECT_TRUE(nullptr != P_rt_coeffs.get());
+
+    EXPECT_EQ(0.0, P_rt_coeffs->T1plus()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->T1plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->T1min()(0));
+    EXPECT_EQ(complex_t(1.0,0.0), P_rt_coeffs->T1min()(1).real());
+
+    EXPECT_NEAR(1.0, P_rt_coeffs->T2plus()(0).real(), 1e-6);
+    EXPECT_NEAR(0.0, P_rt_coeffs->T2plus()(0).imag(), 1e-6);
+    EXPECT_EQ(0.0, P_rt_coeffs->T2plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->T2min()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->T2min()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->R1plus()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->R1plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->R1min()(0));
+    EXPECT_NEAR(R0.real(), P_rt_coeffs->R1min()(1).real(), 1e-6);
+    EXPECT_NEAR(R0.imag(), P_rt_coeffs->R1min()(1).imag(), 1e-6);
+
+    EXPECT_NEAR(R0.real(), P_rt_coeffs->R2plus()(0).real(), 1e-6);
+    EXPECT_NEAR(R0.imag(), P_rt_coeffs->R2plus()(0).imag(), 1e-6);
+    EXPECT_EQ(0.0, P_rt_coeffs->R2plus()(1));
+
+    EXPECT_EQ(0.0, P_rt_coeffs->R2min()(0));
+    EXPECT_EQ(0.0, P_rt_coeffs->R2min()(1));
+
+    EXPECT_NEAR(lambda0.real(), P_rt_coeffs->getKz()(0).real(), 1e-6);
+    EXPECT_NEAR(lambda0.imag(), P_rt_coeffs->getKz()(0).imag(), 1e-6);
+    EXPECT_NEAR(lambda0.real(), P_rt_coeffs->getKz()(1).real(), 1e-6);
+    EXPECT_NEAR(lambda0.imag(), P_rt_coeffs->getKz()(1).imag(), 1e-6);
+
+    EXPECT_NEAR(1.0, P_rt_coeffs->getScalarT().real(), 1e-6);
+    EXPECT_NEAR(0.0, P_rt_coeffs->getScalarT().imag(), 1e-6);
+    EXPECT_NEAR(R0.real(), P_rt_coeffs->getScalarR().real(), 1e-6);
+    EXPECT_NEAR(R0.imag(), P_rt_coeffs->getScalarR().imag(), 1e-6);
+    EXPECT_NEAR(lambda0.real(), P_rt_coeffs->getScalarKz().real(), 1e-6);
+    EXPECT_NEAR(lambda0.imag(), P_rt_coeffs->getScalarKz().imag(), 1e-6);
+}
+
+#endif // SCALARSPECULARINFOMAPTEST_H
diff --git a/unused/ScanningMinimizer.cpp b/unused/ScanningMinimizer.cpp
new file mode 100644
index 0000000..c81ba0b
--- /dev/null
+++ b/unused/ScanningMinimizer.cpp
@@ -0,0 +1,108 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      unused/ScanningMinimizer.cpp
+//! @brief     Implements class ScanningMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ScanningMinimizer.h"
+#include "Exceptions.h"
+#include "FitParameter.h"
+#include <iostream>
+#include <iomanip>
+
+//! Scan minimizer find minimum of chi2 function by equidistant scanning of fit parameters.
+// Only parameters with defined limits (i.e. Limits::limited(left, right) )
+// are scanned
+void ScanningMinimizer::minimize()
+{
+    construct_fcnvalues_map();
+
+    // scanning values of fit parameters
+    for(auto it = m_fcnvalues_map->begin(); it!=m_fcnvalues_map->end(); ++it) {
+        for(size_t i_axis=0; i_axis<m_fcnvalues_map->getRank(); ++i_axis) {
+            size_t xbin = m_fcnvalues_map->getAxisBinIndex(it.getIndex(), i_axis);
+            double value = (*m_fcnvalues_map->getAxis(i_axis))[xbin];
+            std::string parname = m_fcnvalues_map->getAxis(i_axis)->getName();
+            m_parameters.getFitParameter(parname)->setValue(value);
+        }
+        std::vector<double> current_values=m_parameters.getValues();
+        *it = m_fcn(&current_values[0]); // running simulation
+    }
+
+    set_parvalues_to_minimum();
+    std::vector<double> current_values=m_parameters.getValues();
+    m_fcn(&current_values[0]); // running simulation once again at optimum values
+}
+
+//! Construct N dimensional space over all fit parameters with lower and upper limits
+// defined.
+void ScanningMinimizer::construct_fcnvalues_map()
+{
+    delete m_fcnvalues_map;
+    m_fcnvalues_map = new OutputData<double>;
+    for(size_t i_par=0; i_par < m_parameters.size(); i_par++ ) {
+        const FitParameter *par = m_parameters[i_par];
+        if( par->hasLowerLimit() && par->hasUpperLimit() ) {
+            FixedBinAxis axis(par->getName(), m_nbins, par->getLowerLimit(), par->getUpperLimit());
+            m_fcnvalues_map->addAxis(axis);
+        }
+    }
+    if( !m_fcnvalues_map->getRank() )
+        throw Exceptions::LogicErrorException(
+            "ScanningMinimizer::construct_parameter_map() -> Error! "
+            "No parameters with TAttLimit::limited(left,right) attribute were found.");
+    m_fcnvalues_map->setAllTo(0.0);
+}
+
+void ScanningMinimizer::set_parvalues_to_minimum()
+{
+    assert(m_fcnvalues_map);
+    OutputData<double>::iterator it = std::min_element(m_fcnvalues_map->begin(), m_fcnvalues_map->end());
+    for(size_t i_axis=0; i_axis<m_fcnvalues_map->getRank(); ++i_axis) {
+        size_t xbin = m_fcnvalues_map->getAxisBinIndex(it.getIndex(), i_axis);
+        double value = (*m_fcnvalues_map->getAxis(i_axis))[xbin];
+        std::string parname = m_fcnvalues_map->getAxis(i_axis)->getName();
+        m_parameters.getFitParameter(parname)->setValue(value);
+    }
+}
+
+double ScanningMinimizer::getMinValue() const
+{
+    assert(m_fcnvalues_map);
+    return *std::min_element(m_fcnvalues_map->begin(), m_fcnvalues_map->end());
+}
+
+void ScanningMinimizer::printResults() const
+{
+    std::cout << "--- ScanningMinimizer ------------------------------------" << std::endl;
+    std::cout << std::setw(25) << std::left << " nbins"      << ": " << m_nbins << std::endl;
+    std::cout << std::setw(25) << std::left << " Minimum value"      << ": " << getMinValue() << std::endl;
+    std::cout << " Best parameters:" << std::endl;
+    m_parameters.printParameters();
+}
+
+void ScanningMinimizer::setChiSquaredFunction(function_chi2_t fun_chi2, size_t)
+{
+    m_fcn = fun_chi2;
+}
+
+void ScanningMinimizer::setParameters(const FitSuiteParameters& parameters)
+{
+    m_parameters.clear();
+    for(size_t i_par = 0; i_par<parameters.size(); ++i_par)
+        m_parameters.push_back(new FitParameter( *parameters[i_par] ) );
+}
+
+std::vector<double > ScanningMinimizer::getValueOfVariablesAtMinimum() const
+{
+    return m_parameters.getValues();
+}
diff --git a/unused/ScanningMinimizer.h b/unused/ScanningMinimizer.h
new file mode 100644
index 0000000..61ec902
--- /dev/null
+++ b/unused/ScanningMinimizer.h
@@ -0,0 +1,64 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      unused/ScanningMinimizer.h
+//! @brief     Defines class ScanningMinimizer.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MINIMIZERSCAN_H
+#define MINIMIZERSCAN_H
+
+#include "IMinimizer.h"
+#include "FitSuiteParameters.h"
+
+//! @class ScanningMinimizer
+//! @ingroup fitting_internal
+//! @brief Simple scan minimizer looks for minimum of chi2 function on the grid
+
+class BA_CORE_API_ ScanningMinimizer : public IMinimizer
+{
+ public:
+    ScanningMinimizer(int nbins = 10) : m_fcnvalues_map(0), m_nbins(nbins) { }
+    virtual ~ScanningMinimizer() { delete m_fcnvalues_map; }
+
+    virtual void minimize();
+
+    virtual void setParameters(const FitSuiteParameters& parameters);
+
+    virtual void setChiSquaredFunction(function_chi2_t fun_chi2, size_t nparameters);
+
+    virtual void setGradientFunction(function_gradient_t, size_t, size_t) {}
+
+    virtual size_t getNumberOfVariables() const { return m_parameters.size(); }
+
+    virtual double getMinValue() const;
+
+    virtual void printResults() const;
+
+    void setNbins(int nbins) { m_nbins = nbins; }
+
+    size_t getNbins() const { return m_nbins; }
+
+    virtual std::vector<double> getValueOfVariablesAtMinimum() const;
+
+ private:
+
+    void construct_fcnvalues_map();
+    void set_parvalues_to_minimum();
+
+    //! values of minimized function on the grid, axes are limited parameters
+    OutputData<double>* m_fcnvalues_map;
+    size_t m_nbins; //! number of bins per one parameter
+    FitSuiteParameters m_parameters; //! minimizer parameters
+    function_chi2_t m_fcn;
+};
+
+#endif // MINIMIZERSCAN_H

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/bornagain.git



More information about the debian-science-commits mailing list